diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/ComputerSpace.qpf b/Arcade/Custom Hardware/ComputerSpace_MiST/ComputerSpace.qpf new file mode 100644 index 00000000..6d91ff79 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/ComputerSpace.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "ComputerSpace" diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/ComputerSpace.qsf b/Arcade/Custom Hardware/ComputerSpace_MiST/ComputerSpace.qsf new file mode 100644 index 00000000..00455d64 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/ComputerSpace.qsf @@ -0,0 +1,171 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 17:39:19 November 07, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# ComputerSpace_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 PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VHDL_FILE rtl/v74161_16bit.vhd +set_global_assignment -name VHDL_FILE rtl/v74161.vhd +set_global_assignment -name VHDL_FILE rtl/sync_star_board.vhd +set_global_assignment -name VHDL_FILE rtl/sound.vhd +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VHDL_FILE rtl/scan_counter.vhd +set_global_assignment -name QIP_FILE rtl/saucer_shooting.qip +set_global_assignment -name VHDL_FILE rtl/saucer_diode_image.vhd +set_global_assignment -name QIP_FILE rtl/rocket_thrust.qip +set_global_assignment -name QIP_FILE rtl/rocket_shooting.qip +set_global_assignment -name QIP_FILE rtl/rocket_rotate.qip +set_global_assignment -name VHDL_FILE rtl/rocket_diode_images.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/motion_board.vhd +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +set_global_assignment -name VHDL_FILE rtl/memory_board.vhd +set_global_assignment -name VERILOG_FILE rtl/keyboard.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/hq2x.sv +set_global_assignment -name QIP_FILE rtl/explosion.qip +set_global_assignment -name SYSTEMVERILOG_FILE rtl/CSpace.sv +set_global_assignment -name VHDL_FILE rtl/computer_space_top.vhd +set_global_assignment -name VHDL_FILE rtl/computer_space_logic.vhd +set_global_assignment -name VHDL_FILE rtl/clocks.vhd +set_global_assignment -name QIP_FILE rtl/bakam.qip +set_global_assignment -name VERILOG_FILE rtl/sigma_delta_dac.v + +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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY CSpace +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# 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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(CSpace) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +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 PARTITION_NETLIST_TYPE SOURCE -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(CSpace) +# ------------------ +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/ComputerSpace.srf b/Arcade/Custom Hardware/ComputerSpace_MiST/ComputerSpace.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/ComputerSpace.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/README.txt b/Arcade/Custom Hardware/ComputerSpace_MiST/README.txt new file mode 100644 index 00000000..1980e38f --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/README.txt @@ -0,0 +1,25 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Computer Space - World first commercial arcade! +-- Port to MiST by Gehstock +-- 07 November 2017 +-- +--------------------------------------------------------------------------------- +-- +-- Computer Space by Mattias G (2015) +-- +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- F1 : Start +-- SPACE : Thrust +-- RIGHT/LEFT : Turn +-- CTRL : Fire +-- +-- Joystick support. +-- +-- +--------------------------------------------------------------------------------- + diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/Release/ComputerSpace.rbf b/Arcade/Custom Hardware/ComputerSpace_MiST/Release/ComputerSpace.rbf new file mode 100644 index 00000000..0b8ef50c Binary files /dev/null and b/Arcade/Custom Hardware/ComputerSpace_MiST/Release/ComputerSpace.rbf differ diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/clean.bat b/Arcade/Custom Hardware/ComputerSpace_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_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/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/CSpace.sv b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/CSpace.sv new file mode 100644 index 00000000..31ec630f --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/CSpace.sv @@ -0,0 +1,154 @@ +module CSpace +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "C. Space;;", + "T2,START;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +wire clk_5m; +wire clk_50m; +wire vclk; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(reset), + .c0(clk_5m), + .c1(clk_50m), + .locked(pll_locked) +); + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [15:0] audio; +wire video, blank; +wire reset = buttons[1] | status[0] | status[6]; +wire hsync,vsync; +assign LED = 1; + + +wire [3:0] G = blank ? 4'b0 : {4{video}}; +wire [3:0] R = blank ? 4'b0 : {4{video}}; +wire [3:0] B = blank ? 4'b0 : {4{video}}; + +video_mixer #(.LINE_LENGTH(350), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_50m), + .ce_pix(clk_5m), + .ce_pix_actual(clk_5m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(R), + .G(G), + .B(B), + .HSync(hsync), + .VSync(vsync), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .scandoubler_disable(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(1) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_50m ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +computer_space_top computerspace +( + .reset(reset), + .clock_50(clk_50m), + .game_clk(clk_5m), + .signal_ccw(kbjoy[6] | joystick_0[1] | joystick_1[1]),//left + .signal_cw(kbjoy[7] | joystick_0[0] | joystick_1[0]),//right + .signal_thrust(kbjoy[4] | joystick_0[3] | joystick_1[3]),//thrust + .signal_fire(kbjoy[0] | joystick_0[4] | joystick_1[4]),//fire + .signal_start(kbjoy[3] | kbjoy[1] | kbjoy[1] | status[2]),//start + .hsync(hsync), + .vsync(vsync), + .blank(blank), + .video(video), + .wav_out(audio) +); + + +sigma_delta_dac dacr( + .CLK(clk_50m), + .RESET(reset), + .DACin(audio), + .DACout(AUDIO_R) + ); + +sigma_delta_dac dacl( + .CLK(clk_50m), + .RESET(reset), + .DACin(audio), + .DACout(AUDIO_L) + ); + +keyboard keyboard( + .clk(clk_50m), + .reset(reset), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/bakam.qip b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/bakam.qip new file mode 100644 index 00000000..a47cb9aa --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/bakam.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "ROM: 1-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "bakam.vhd"] diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/bakam.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/bakam.vhd new file mode 100644 index 00000000..e5574cb0 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/bakam.vhd @@ -0,0 +1,143 @@ +-- megafunction wizard: %ROM: 1-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: bakam.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY bakam IS + PORT + ( + address : IN STD_LOGIC_VECTOR (13 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END bakam; + + +ARCHITECTURE SYN OF bakam IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => "bakamb_8_11.hex", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 16384, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => "CLOCK0", + widthad_a => 14, + width_a => 8, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + q_a => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +-- Retrieval info: PRIVATE: AclrByte NUMERIC "0" +-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clken NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "bakamb_8_11.hex" +-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "16384" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: RegAddr NUMERIC "1" +-- Retrieval info: PRIVATE: RegOutput NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: SingleClock NUMERIC "1" +-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +-- Retrieval info: PRIVATE: WidthAddr NUMERIC "14" +-- Retrieval info: PRIVATE: WidthData NUMERIC "8" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: INIT_FILE STRING "bakamb_8_11.hex" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "16384" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "14" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: address 0 0 14 0 INPUT NODEFVAL "address[13..0]" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +-- Retrieval info: CONNECT: @address_a 0 0 14 0 address 0 0 14 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL bakam.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL bakam.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL bakam.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL bakam.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL bakam_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/bakamb_8_11.hex b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/bakamb_8_11.hex new file mode 100644 index 00000000..0722c4bc --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/bakamb_8_11.hex @@ -0,0 +1,435 @@ +:200000000001010101020202020202020203030303030302020202010101000000FFFFFFB2 +:20002000FEFEFEFEFEFDFDFDFDFDFDFDFDFEFEFEFFFFFF00000101010102020202020202D9 +:200040000303030302020201010000FFFFFFFEFEFEFEFEFEFDFDFDFDFEFEFEFFFF000001AE +:200060000101010202020202020202020203030302020201010000FFFEFEFDFCFCFBFBFB77 +:20008000FBFCFCFCFDFDFEFF0001020203040505060606050505040404030303020101002A +:2000A000FFFEFDFCFBFAFAF9F9F9FAFAFBFBFCFDFEFF00000102020303030304040404046B +:2000C000040404040403030201010000FFFFFEFEFEFDFDFDFDFDFDFDFDFEFEFEFEFEFFFF2E +:2000E000FFFFFF00000001010102020202020202020201010101010000FFFFFEFDFDFDFDF9 +:20010000FDFEFEFFFF000001010102020202020201010101000000FFFFFFFFFFFFFFFFFFDE +:20012000FFFFFFFFFF000001010202020303030404040303020100FFFFFEFDFDFDFDFDFDB4 +:20014000FCFCFCFCFCFCFCFCFDFEFF00010203030405050606060605050403020201000080 +:20016000FFFEFEFDFDFCFCFCFCFCFCFCFCFDFDFEFFFF0000000101010101010101010101A9 +:2001800001000000000000010101010202020203020202010100FFFFFEFEFEFEFDFDFDFD5D +:2001A000FEFEFEFFFF00000000000000000000000000000000000000000000000101010242 +:2001C0000202020202010100FFFFFFFFFFFFFFFFFFFFFFFF00000001010101010101010116 +:2001E00001010101010000FFFFFFFEFEFEFEFEFEFEFFFFFFFFFFFFFFFF0000000001010110 +:2002000002020202020203020202020202010101010000FFFFFEFEFDFCFCFCFBFBFBFBFBED +:20022000FCFCFDFEFF000102030405060607070707060504030100FFFEFDFCFCFBFBFBFBA4 +:20024000FBFCFCFDFEFEFFFF0000010102020202020202020202020202010101000000FF96 +:20026000FFFFFFFFFEFEFEFEFEFEFFFFFF0000000000000000010101010101020202020281 +:200280000201010101000000FFFEFEFDFDFCFCFCFDFDFDFEFEFFFF0001010202020303036D +:2002A000030404040404030302010000FFFEFEFDFCFCFCFBFBFBFBFBFBFCFDFEFEFF00015B +:2002C000010202030303040404040404040403030303020201010000FFFEFDFCFCFBFAFAFD +:2002E000FAFAFBFBFCFDFEFEFF0000010203030404050505050404030303020201010000E4 +:20030000FFFFFEFEFDFDFDFDFDFDFDFEFEFEFEFFFF000001010101010201010101010100F5 +:200320000000FFFFFFFFFF0000000000010100000000FFFFFFFFFFFFFFFF000001010202C2 +:200340000202020202010000FFFEFEFEFEFEFEFEFEFFFFFF0000000001010101010101029D +:200360000202020202020202010100FFFFFEFDFDFDFDFDFDFDFEFEFEFEFFFFFF000000018E +:2003800001010202020202030303030303020202020201010000FFFFFFFEFEFDFDFDFDFD49 +:2003A000FDFDFDFDFDFDFEFEFEFFFF0001010202020203030303030303020202010101002F +:2003C0000000FFFFFFFEFEFEFEFEFEFEFDFDFDFDFEFEFEFFFFFF0000010101020202020236 +:2003E00002020202020101000000FFFF00000000000000FFFFFEFEFEFEFEFFFF00010202FC +:20040000030303040403030302010100FFFEFDFDFCFCFCFDFDFDFEFEFFFFFF0000010102DF +:200420000202030302020201010100000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B8 +:2004400000000000010101010101010101010101010101010100000000FFFFFFFEFEFEFD97 +:20046000FDFDFDFDFDFDFDFEFF00000203040506060707070605040201FFFEFCFBFBFAFA70 +:20048000FAFAFBFBFCFCFDFEFFFF0001020202030303030303020202020102020202020253 +:2004A00002020202010101000000FFFFFEFEFEFEFDFDFEFEFEFEFEFEFEFDFDFDFDFDFDFD64 +:2004C000FDFEFEFF000101020304050606070707070606050403020100FFFEFDFDFCFCFCE6 +:2004E000FBFBFBFCFCFCFDFDFDFDFDFDFDFDFDFDFDFEFEFF0001020303040505050606060F +:200500000606050504030201FFFEFDFCFBFAFAFAFAFAFAFBFBFCFDFEFF00010102030303F5 +:2005200004040403030302020201010000FFFFFFFFFFFFFFFF0000000000000000000000A6 +:200540000000000000000000FFFFFFFFFF0000000000010101010101010201010101000093 +:200560000000FFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF000001010102020392 +:20058000030404040404030302010100FFFEFEFDFDFDFCFCFDFDFDFDFEFEFEFEFFFFFF0067 +:2005A0000001010102020202020303030303030202020101000000FFFFFFFEFEFDFDFDFC28 +:2005C000FCFCFCFDFDFEFF000101020303040404040404040303030202010000FFFEFDFC06 +:2005E000FCFBFBFBFBFBFBFCFCFDFEFEFF00010102030404040505050504040403030202F0 +:20060000010100FFFFFEFEFDFDFDFDFDFDFDFDFDFDFDFDFDFEFEFFFFFF0000000101020206 +:20062000030404040404040403030202010000FFFEFDFDFCFCFCFBFBFCFCFCFDFDFEFF00C4 +:2006400001020303040404030302010000FFFFFFFFFF000000000101010102020201010075 +:2006600000FFFEFEFDFDFEFEFF000001020202020201010000FFFFFFFFFFFFFFFFFF000086 +:20068000000000000000000000000000000000000000010101010202020202020202010144 +:2006A000010000FFFFFEFEFDFDFDFDFDFDFDFEFEFFFF000001010102020202020202020245 +:2006C000010101010000000000000000FFFFFFFEFEFEFEFEFEFEFEFEFEFFFFFFFF00000031 +:2006E00001010101020202020202020101010101010101010101010100000000FFFFFFFFDF +:20070000FFFEFEFEFEFEFEFEFEFEFFFFFF000001020203030404040303030202010000FFCB +:20072000FFFEFEFDFDFDFDFCFCFCFDFDFDFEFEFFFF000001010102020202020302020202CD +:20074000020202020101010000FFFFFEFEFEFEFEFEFDFDFDFDFEFEFFFF00000000000000AE +:2007600000010101010101010101000000000000000001010101010000FFFFFFFFFFFF0071 +:200780000000000000000000000001010101010101010101010000FFFFFFFEFEFEFEFEFE5D +:2007A000FEFEFEFEFEFFFF0000010101020202020202020202020202010101000000000027 +:2007C000000000FFFFFFFFFEFEFEFEFEFEFEFEFFFFFFFF000000000000000101010101012B +:2007E0000101000000000000000000000000000000000000000000000101010101000000F2 +:20080000FFFFFEFEFEFEFEFEFFFF000001010101010101010000FFFEFEFEFEFEFEFF0000EE +:2008200001020203030304040403030202010000FFFFFEFEFEFEFEFDFDFDFDFDFDFDFDFDBA +:20084000FEFEFEFFFF000001020203030404040404040403030302010100FFFFFEFEFEFD77 +:20086000FDFDFDFDFDFDFDFDFDFEFEFEFFFF00000000000101010101010102020202030386 +:20088000030404040303020201010000FFFFFEFEFEFDFDFDFCFCFCFBFBFBFCFCFCFDFDFE7D +:2008A000FF0001020203040404050504040403030202010101000000FFFFFFFFFFFFFFFF0A +:2008C000FFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFF000000010102020202020202021F +:2008E00002020202010101010000FFFFFFFEFEFEFEFEFEFEFEFEFEFEFFFFFFFF0000010107 +:2009000002020303030303030302020100FFFFFEFDFDFDFCFCFCFCFCFDFDFEFFFF000001E3 +:20092000010202020303040405050404030302010000FFFEFEFEFDFDFDFDFDFDFDFDFDFEAB +:20094000FEFEFFFF0000010101010101010101010202020202020201010100000000FFFF84 +:20096000FFFFFEFEFFFFFFFF000000000000FFFFFFFFFF000000000101010101010101017D +:200980000000000000FFFFFFFFFF0000000000010101010100000000FFFFFEFEFEFEFEFE65 +:2009A000FEFEFEFEFFFFFF00000101020202030303030303030303020202010100FFFEFD1D +:2009C000FDFCFCFCFCFCFCFDFEFFFF000101020202010101010000FFFFFFFFFFFF00000033 +:2009E000010102020203030303030303030202010100FFFFFEFDFDFCFCFCFCFCFCFCFDFDFD +:200A0000FDFEFEFEFFFF00010102020303040404040404030303020201010000FFFFFEFEB4 +:200A2000FDFDFDFDFDFDFDFDFDFDFEFEFEFFFFFFFF000000010101020202020303030303C4 +:200A400003030303030202010100FFFFFEFDFDFCFCFCFCFDFDFDFEFEFFFFFF0000000000AB +:200A600000000000000000000102020303030303030303030202010000FFFEFEFEFDFDFD61 +:200A8000FDFDFDFDFDFDFEFEFEFFFFFF000001010202020303030304040403030302020143 +:200AA0000000FFFFFEFDFDFDFCFCFCFCFCFDFDFDFEFEFEFFFF000001010102020202020259 +:200AC00002020202020202020202020202010100FFFFFEFEFDFDFDFDFDFEFEFEFFFF000017 +:200AE0000101010101010101010101010101010000000000FFFFFFFFFFFF000000010101EA +:200B000001000000FFFFFFFFFFFFFF000000000101010102020202010101010000000000CB +:200B2000000000000000000000FFFFFFFFFFFFFFFFFFFEFEFEFEFDFDFDFDFEFEFEFF0000D9 +:200B4000010202030304040404040404040303020101010000FFFFFEFEFEFDFDFDFDFCFC7B +:200B6000FCFCFDFDFDFEFEFF00000101010202020202010101010101010101010000000074 +:200B800000000000000101010101010101010000FFFFFEFEFDFDFDFDFDFEFEFEFFFF000069 +:200BA0000001010202020202010101000000000000FFFFFFFFFFFFFF00000000000101012A +:200BC0000101010101010101010101020202020101010000FFFFFFFFFEFEFEFEFEFEFEFE13 +:200BE000FEFEFEFEFEFFFF000001010203030404050504040302020100FFFEFEFDFDFDFDE6 +:200C0000FDFDFDFEFEFFFF00000000FFFFFEFDFDFCFCFCFDFDFEFEFF0001020303040505ED +:200C200005050505040404030302010100FFFFFEFEFEFDFDFDFDFDFDFDFDFDFDFEFEFFFFB6 +:200C400000000001010101010101020202020202020202020201010000FFFFFEFEFEFEFD82 +:200C6000FDFDFDFDFEFEFEFEFF0000010102020202020202020202020201010000FFFFFF70 +:200C8000FFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFFFF00010102030404040404030302014A +:200CA0000000FFFEFEFEFDFDFDFDFDFEFEFEFEFFFFFFFFFFFFFF000000010101020202034D +:200CC0000303030303030302020100FFFFFEFDFDFDFDFCFCFDFDFDFEFEFFFF00000001011F +:200CE000020203030304040404040404030302020100FFFFFEFDFDFCFCFBFBFBFBFBFBFCF4 +:200D0000FCFCFDFDFEFEFF000001020203030404050505050504040404030302010100FFA1 +:200D2000FFFEFDFDFCFBFAFAF9F9FAFAFBFCFDFDFEFF0001020203030404040404040403D3 +:200D4000030302020201010000FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFFA4 +:200D6000FFFF000000000000FFFFFF0000010202030404050505050505040403020100FF3D +:200D8000FFFEFDFCFBFBFBFAFAFBFBFBFCFCFDFEFF00000102030303030303030202010177 +:200DA00000000000FFFFFFFFFFFF000000000000000000000000000000FFFFFFFF0000003D +:200DC0000001010101010101010100000001010101010100000000FFFFFFFFFFFFFFFFFF0D +:200DE000FFFFFFFFFFFFFFFFFF0000000101010202030303030303030202010000FFFFFFDE +:200E0000FEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:200E2000FF00000000000101010202030303030303030202020202020101010000FFFEFE8D +:200E4000FDFCFBFBFBFBFBFBFBFCFCFDFDFEFF0001010203030303030303030303030202A4 +:200E600002020101010101000000FFFFFFFEFEFEFEFEFEFEFEFEFEFFFFFFFF000001010181 +:200E80000202020202020202020202010101000000FFFFFFFFFEFEFEFEFEFDFDFDFDFDFE58 +:200EA000FEFEFEFFFFFF00000101010102020202020202020201010101010101010101011A +:200EC000010000000000000000FFFEFEFDFCFCFBFBFBFCFDFDFEFF00010203030404040424 +:200EE0000303020201010100000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000F4 +:200F0000000101010202020201010100000000FFFFFFFFFF000000000101010202020202BB +:200F20000202020101010000FFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFF00D1 +:200F400000000101010202020202020202020202020201010101010100000000FFFFFFFF72 +:200F6000FFFEFEFEFFFFFFFFFFFFFEFEFDFDFCFCFCFDFDFEFEFF000001010202020303038E +:200F800003030303030303020202010101000000000000FFFFFFFFFFFFFFFFFEFEFEFEFE45 +:200FA000FEFEFEFEFEFEFFFFFFFFFF0000000101020203030304040404040404030302020D +:200FC000010100FFFEFEFDFCFCFBFAFAFAFAFAFBFBFCFDFEFFFF000102020303030404043D +:200FE0000403030303020201010100000000000000FFFFFFFFFFFFFEFEFEFEFEFEFEFDFDF4 +:20100000FDFDFDFDFDFDFEFEFF000001020304050606060606050403020100FFFEFDFCFBBA +:20102000FBFBFBFBFCFCFDFEFEFFFF000101020202030303030303030202020202010101AB +:20104000010100000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFA5 +:20106000FFFFFF000000000101010202020202020101010100000000FFFFFFFFFFFF000066 +:201080000000000000000000000000FFFFFFFEFEFEFEFEFEFEFEFFFFFF0000000101020260 +:2010A00002030303030302020201010000FFFFFFFFFFFFFFFFFFFFFF000000000000000022 +:2010C000000000000000FFFFFFFFFFFFFFFFFFFFFF000001020203030404040403030202F6 +:2010E000010000FFFFFEFEFDFDFDFCFCFCFCFDFDFDFDFEFEFEFFFF00000102020203030312 +:2011000003030303030302020201010000FFFFFFFEFEFEFEFEFEFEFEFEFEFEFFFFFF0000D1 +:20112000000101010202020101010100000000FFFFFFFEFEFEFEFDFDFDFEFEFEFFFF0000BE +:2011400001010202020202030303030302020201010000000000000000FFFFFFFFFFFFFE74 +:20116000FEFEFEFEFEFEFEFEFEFEFFFF00010102030404040404030302010100FFFFFEFE66 +:20118000FDFDFDFDFDFDFDFEFEFEFFFF00000101020202030303030202020201010000004E +:2011A000FFFFFFFFFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFF00000000000001010101010146 +:2011C00002020202020202010101010000000000FFFFFFFFFEFEFEFEFEFFFFFF000000000E +:2011E000010101010101000000FFFFFFFEFEFEFEFEFFFFFFFF0000000000010101010202F2 +:2012000003030303030303020201010000FFFFFEFDFDFCFCFCFCFCFDFDFEFEFFFF000001DC +:20122000010202020202020202020303030302020201010000FFFFFEFEFDFDFDFDFDFDFEA1 +:20124000FEFFFFFF0000000001010101010101010101010101010101010102020101010179 +:20126000000000FFFFFFFF000000FFFFFFFEFEFEFEFEFEFEFEFFFFFF000000010101020281 +:201280000202030303030302020100FFFFFEFDFCFCFCFBFBFBFCFCFDFDFEFF000001020363 +:2012A000040405050606050505040302020100FFFEFDFDFCFCFCFCFCFDFDFEFEFEFFFFFF21 +:2012C000FF0000000001010101010202020201010101010101010101000000FFFFFFFFFFFD +:2012E000FF0000000000000000000000000000000000FFFFFEFEFEFEFEFEFEFFFF00000100 +:2013000002020303030303020201010000FFFFFFFFFFFFFF00000000000000000000FFFFBD +:20132000FFFEFEFEFEFDFDFDFDFDFEFEFEFF000001010202020303030303030303030302A4 +:201340000202020201010000FFFEFEFDFCFCFBFBFBFBFBFBFBFCFDFEFF00010203040505AC +:20136000060606060605050403020100FFFFFEFDFDFDFDFDFDFDFDFDFDFDFDFDFEFEFEFF6D +:20138000FFFF0000000001010101010102020202020202010101010101010101010101012E +:2013A000010101000000000000FFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFFFFFF00000049 +:2013C000010101010101010101010000010101010100000000FFFFFFFFFFFFFFFFFFFF0008 +:2013E00000000001010101010202020202020101010000FFFFFFFEFEFEFEFFFFFF000000E7 +:20140000000000000000000000FFFFFFFFFFFFFF00000101020202020202020202010101BC +:201420000000FFFFFFFEFEFEFEFEFEFEFEFFFFFFFF000000000001010101010101010101B9 +:201440000101010101000000000000FFFFFFFFFFFFFFFFFFFFFF0000000000000000010190 +:201460000101010000000000FFFFFFFFFFFFFF000000000001010101020202030303020259 +:2014800002010000FFFEFDFDFDFCFCFDFDFDFEFEFFFF00000001010101020202020202025A +:2014A0000202010101000000FFFFFFFFFFFFFFFFFFFF00000101010202020202020201011C +:2014C0000100FFFFFEFDFDFCFCFCFCFCFDFDFEFEFFFF000001020203030304040404040310 +:2014E00003030201010000FFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFF000000010102 +:2015000002020203030302020100FFFEFEFDFDFDFDFEFEFEFEFFFF000001010202030303C3 +:2015200002020201010000000000000000000000000101000000FFFFFEFEFDFDFDFDFDFDB9 +:20154000FEFEFF00010203040405050505050504040302020100FFFEFEFDFCFCFBFBFBFB78 +:20156000FBFBFBFBFCFCFDFDFEFF0001010203030404040405040404040303020201010154 +:201580000000FFFFFEFEFEFDFDFDFDFDFDFDFDFDFDFDFDFEFEFFFFFF00000000000000007E +:2015A00000010102030406060708080706040301FFFDFBFAFAF9F9F9F9FAFAFBFCFCFDFF36 +:2015C000000102030304040404040404030303020202010101010100000000FFFFFEFEFEDA +:2015E000FEFEFEFEFEFEFFFFFFFFFF0000000000FF000000000000010101010102020202F0 +:2016000002020101010101000000FFFFFEFEFEFEFEFEFEFEFEFFFFFF0000010202020202CD +:20162000020201010000FFFFFFFFFFFFFFFFFFFFFFFFFF0000010101010101000000FFFFAD +:20164000FFFF0000000000010102020202020201010100000000FFFFFFFFFEFEFEFEFEFE8B +:20166000FEFEFEFEFEFEFFFFFF0000010102020303030404030303020201010000FFFFFE57 +:20168000FEFEFEFEFDFDFDFDFDFDFEFEFFFF00000101010202020203020202020201010050 +:2016A0000000FFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFFFF000000010102020244 +:2016C000030303030303030202010000FFFFFEFEFEFEFEFEFEFEFFFFFFFFFFFFFF00000009 +:2016E000000001010100000000FF00000001010102020202020201010100000000000000D6 +:20170000000000000000010101010101010101000000FFFFFEFEFEFDFDFDFDFDFDFEFEFEE0 +:20172000FFFF0000010102020202020202020202010101010000000000FFFFFFFFFFFFFF98 +:20174000FFFFFFFFFF00000000000000000000000000000000000000000001010101010287 +:201760000202020202020101010000FFFEFEFEFDFDFDFDFDFDFDFDFDFDFEFEFF0000010281 +:20178000020303040405050505050504040302010000FFFEFDFDFCFCFCFBFBFBFBFBFBFB45 +:2017A000FBFCFDFDFEFF0001020203030404040405050505050504040303020100FFFFFEF5 +:2017C000FEFEFEFEFEFEFFFFFFFEFEFDFCFCFBFBFAFAFBFBFCFDFEFF000102030405060636 +:2017E00006060605050403020101000000FFFFFFFFFFFFFFFFFEFEFEFDFCFCFBFBFBFBFCF3 +:20180000FCFDFE000102040405050505040403020201000000FFFFFEFEFEFEFEFEFEFFFFB4 +:20182000FF00000101010101010101010000FFFFFEFEFEFEFEFEFEFEFFFF000001010202AE +:2018400002030303020202020202020101010000FFFFFFFEFEFEFEFEFDFDFDFDFDFDFEFE8F +:20186000FF0000010102020303020202010100000000000000000000000000000000FFFF57 +:20188000FFFFFF00000001010101010000000000000000000000FFFFFFFFFFFFFFFFFF004F +:2018A00000000101010102020201010100000000FFFFFF00000000000000000000FFFFFF21 +:2018C000FFFFFFFFFFFFFFFFFFFFFFFF0000000000010101020202020202020202010101FC +:2018E0000100000000000000000000000000FFFFFEFEFDFDFDFDFDFEFEFEFEFFFF00000105 +:201900000102020203030303030303020201010000FFFFFEFEFEFEFEFEFEFEFFFFFF0000BA +:2019200000010101010202020201010101010101010101010000000000000000FFFFFFFF94 +:20194000FEFEFEFEFEFDFDFDFDFDFEFEFEFF00000102030304040505050504040303020171 +:201960000100FFFEFDFDFCFCFCFBFCFCFCFCFCFDFDFDFDFEFEFFFF00010102020303030394 +:2019800003030404040404040403030302010100FFFEFEFDFDFCFCFCFCFCFCFCFCFCFDFD4D +:2019A000FDFEFEFF00010203040405050505050404030302010100FFFFFFFFFEFEFEFEFE04 +:2019C000FEFFFFFFFFFFFFFFFEFEFEFEFEFEFEFFFF000001010203030304040303030302FD +:2019E000010100FFFEFDFDFCFCFCFDFDFDFEFFFF0001010203030404040303020100FFFEEB +:201A0000FEFDFDFDFDFDFDFDFEFEFFFF0000010101020201010101010101010101010000D1 +:201A2000000000000000000000000000000000FFFFFFFFFFFFFFFF000000010101020202A5 +:201A40000202020202020201010101000000FFFFFEFEFEFDFDFDFDFDFDFDFDFEFEFEFFFF9C +:201A6000FF0000000101020202020303020202020201010101010000000101010101010141 +:201A8000000000FFFFFEFDFCFBFBFAFAFBFBFCFCFDFEFF0001020203040405050505050551 +:201AA000050404040302020100FFFEFDFDFCFCFBFBFBFBFBFCFCFDFDFEFF00000102020241 +:201AC00003030202020201010101010101010101010102020201010101000000FFFFFFFEE7 +:201AE000FEFEFEFEFEFEFEFEFFFFFFFFFFFF000000000000000000000000000000000000FC +:201B0000000000000000000000FFFFFFFF00000000000000000000010101010101010101C0 +:201B200001010101010101010100FFFFFEFDFCFBFBFBFBFBFCFDFEFF0000010203030303BB +:201B40000303030303030303020202010101000000FFFFFFFEFEFEFEFDFEFEFEFEFFFF007C +:201B6000000101010101010101010101010101010101000000FFFFFFFEFEFEFDFDFDFDFC6D +:201B8000FDFDFDFEFEFF00010102020303040404040404040303020201010000FFFFFEFE25 +:201BA000FDFDFDFDFDFDFDFDFDFDFDFDFEFEFFFFFF0000010102020202020202020101013B +:201BC00000000000000000000101010101000000FFFFFFFFFFFFFFFFFFFFFF00000000000B +:201BE00000000000000000000000000000000001010102020202020202020202010000FFCE +:201C0000FEFEFDFDFDFCFDFDFDFEFEFF0000010102020202020202020202020201010000C7 +:201C200000FFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF0000000000000000000000010101B8 +:201C40000101010101010101000000000000FFFFFFFFFFFFFFFFFF0000000101010101017F +:201C600001010000FFFFFFFEFEFEFEFEFEFEFEFEFFFF00000001010101010101020202026A +:201C800002020303030303030202010100FFFEFDFDFCFCFCFCFDFDFEFFFF00000001010148 +:201CA0000101010101010101010101010101010101000000FFFFFFFEFEFEFEFEFEFEFEFE28 +:201CC000FFFFFFFF00000000010101010100000000000000000101010202020202010101F3 +:201CE000010100000000000000FFFFFEFEFDFDFDFDFDFEFEFF0001020303040405050404D9 +:201D0000040302020100FFFEFDFCFBFBFBFBFBFBFBFBFCFDFDFEFF000001010202020303E8 +:201D20000303030303030302020202010101000000FFFFFFFEFEFEFEFEFEFEFEFEFFFFFF9B +:201D400000000001010101010101010101010101010101010000000000FFFFFFFFFFFFFF79 +:201D6000FFFFFFFFFFFFFF000000000101010101010101010101010101010100000000005A +:201D8000000000000000FFFFFFFFFEFEFEFEFEFEFEFFFF0000000101020202020303030341 +:201DA0000302020202010100FFFFFEFEFDFDFCFCFDFDFDFEFEFF000001010202010101012E +:201DC00001010101010100000000FFFFFFFFFFFFFF000000000000000000000101010101FF +:201DE00000000000000000000001010101010101010100000000FFFFFFFEFEFDFDFDFDFEEF +:201E0000FEFEFF000001020203030304040403030202010100FFFFFEFDFDFDFCFCFCFCFCC2 +:201E2000FDFDFEFEFFFF000101020203030303030302020202020201010101010000FFFF87 +:201E4000FFFEFEFEFDFDFDFEFEFEFEFFFFFF00000001010101000000000101000000000097 +:201E600000000000000101010000000000000000000000010101020202020202010100004E +:201E8000FFFFFEFEFEFDFDFDFDFDFDFDFEFEFEFFFF00000101020203030303030303030247 +:201EA000020100FFFFFEFEFEFDFDFEFEFEFEFEFFFFFFFF000000000101010101020202022E +:201EC000020202010101000000FFFFFEFEFEFEFEFEFEFEFFFFFF000000000000000000000E +:201EE000000000000000010101010101010101010101010101010101010101010000FFFFCE +:201F0000FFFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFF000001010202030303040404040303B9 +:201F200002020100FFFEFDFCFCFBFBFBFCFCFDFEFF0001010203030404040404040303029D +:201F40000100FFFEFDFDFCFCFDFDFDFEFEFFFFFF000000000000000000000000000101019E +:201F6000020202020303030202010100FFFEFEFDFDFDFCFCFCFDFDFDFEFF00000102020269 +:201F80000201010101010101010101010101010100000000000000FFFF0000000000000032 +:201FA000000000000000000000000000000000000000000000000000000000000000000021 +:201FC0000000000000000000000000000000000000000000000000FFFFFFFFFFFFFF000008 +:201FE000000001010202020303030202010100FFFEFEFDFDFCFCFCFDFDFEFEFFFFFF0000EE +:202000000101010202020303030202020202010101010101000000FFFFFEFEFDFDFDFDFDB3 +:20202000FDFEFEFF000001020304040404040302010000FFFFFEFEFDFDFDFDFDFDFDFDFEA8 +:20204000FEFF00000101020203030304040403030302020101000000000000FFFFFEFEFD62 +:20206000FDFDFCFCFCFDFDFDFDFDFDFDFEFEFFFF0001020203030404040505050504040456 +:2020800003020100FFFEFEFDFCFCFCFCFCFCFCFCFCFCFDFDFEFEFFFF00000001010202036D +:2020A0000404040505050504040302020100FFFFFEFEFDFDFDFDFCFCFCFCFDFDFDFEFEFF20 +:2020C000FF00000102020303040404050505050504040302010000FFFEFEFDFDFCFCFCFCDE +:2020E000FCFCFCFCFCFCFDFDFEFEFF000001010102020203030303030303030302020202D7 +:202100000101010000FFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFDFDFDFDFDFEFEFEED +:20212000FEFFFFFF000001010202030404050505050505040403030201010000FFFFFEFE69 +:20214000FEFEFDFDFDFDFDFCFCFCFCFCFCFCFDFDFEFF000001020203030404040404040490 +:202160000403030202010100FFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFF00000000016D +:20218000010101010101010000000000000000000000000000000000010101010000000034 +:2021A00000FFFFFFFF00000000000101010101000000000000010100000000FFFFFFFFFF21 +:2021C000FEFEFFFFFFFFFFFF000000000101010101000000000000000001010202020303F6 +:2021E0000303030202010000FFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFF00000000F3 +:202200000000010101010202030303030303030302020101000000FFFFFEFEFEFEFEFEFEA8 +:20222000FEFEFEFEFEFFFFFFFFFFFFFFFF00000000000101010101010101010101010101A2 +:2022400001010101010000000000000001010101010101000000FFFFFFFEFEFDFDFDFDFD88 +:20226000FDFDFDFEFEFEFFFF0001010202020303030303030303030303030302020100FF3C +:20228000FEFEFDFDFCFCFCFCFCFCFDFDFEFEFFFF0000010202030303040404040404030340 +:2022A000030201010000FFFFFEFEFDFDFDFDFCFCFCFCFDFDFDFDFEFEFFFFFF000001010248 +:2022C000020202020202020202020201010101010101010101010101010000FEFDFCFBFAEE +:2022E000FAFAFAFBFBFCFDFEFFFF00010203040405050505040403030202010101010100CC +:20230000000000000000FFFFFFFEFEFEFEFDFDFDFDFDFDFDFDFEFEFEFFFF000001010102E3 +:202320000202020303030404040505050404040302020100FFFEFDFCFCFBFBFBFBFBFBFC8F +:20234000FCFDFDFEFEFEFFFFFF000000010102020203030303030303030302020201010065 +:2023600000FFFFFEFEFEFEFEFEFEFEFEFFFF000001010202020202020201010000FFFEFD67 +:20238000FCFCFCFCFCFDFDFEFEFFFF00000102020203030303040404030303020201000030 +:2023A000FFFFFEFEFDFDFDFDFDFEFEFEFEFFFFFFFF0000010101020202020202010101012B +:2023C00001010202020202020101000000FFFFFFFEFEFEFDFDFDFDFEFEFEFFFFFF0000000B +:2023E00000000000000000000000000101010102020202020201010000FFFFFEFEFDFDFDDA +:20240000FDFEFEFF00000102020304040404040404030200FFFEFCFBFAF9F9F9F9F9FAFADC +:20242000FBFCFDFE000102020304040405050505050606050505040403020100FFFFFEFD5B +:20244000FCFCFBFBFBFBFBFBFCFCFDFDFEFEFFFFFF00000001010203030404040404040491 +:2024600003030302020201010000FFFFFFFEFEFEFDFDFDFDFDFDFDFDFDFDFEFEFFFF000078 +:20248000000101010101010101010101010101010001010101010101010101000000000023 +:2024A00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFF0001010236 +:2024C00002030303040403030202010000FFFFFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFB +:2024E000FFFFFFFFFFFFFFFFFFFF0001010203040405050505050504040302010000FFFEAE +:20250000FDFDFCFCFCFCFCFCFCFCFCFCFDFDFDFEFEFFFF00000101010202020202030303E2 +:2025200002020202020202010101010000FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFE99 +:20254000FEFDFDFDFDFDFEFEFFFF0001010202020303030303030303020201010000FFFF6E +:20256000FEFEFEFEFFFFFFFF00000000000000000000000000000101010202020202020256 +:202580000201010101000000FFFFFEFEFEFDFDFDFDFEFEFEFFFFFF0000000000000101014F +:2025A00001010101010101010101010101010101010101010101000000FFFFFFFFFFFFFF0C +:2025C000FFFFFFFFFFFFFFFEFEFEFEFEFEFEFFFFFF000001010101020202020202020202FD +:2025E0000101010100000000000000000000000000000000FFFFFFFFFEFEFEFEFEFEFFFFE9 +:20260000FF00000000000000000000010102030304040404040404030302020100FFFFFE8E +:20262000FDFDFCFCFCFCFBFBFBFCFCFCFDFDFEFFFF000101020203030303040403030303AF +:202640000202020101010100000000FFFFFEFEFDFDFDFDFDFDFEFEFEFEFFFFFFFFFFFF0096 +:202660000001010202020202020201010101010101010101000000FFFFFFFFFFFEFEFFFF4B +:20268000FFFF00000001010101010101010101000000FFFFFF000000010202020202010128 +:2026A00000FFFEFEFDFDFCFCFCFDFDFDFEFEFEFFFF0000010102020303040404040404031B +:2026C0000303020201010000FFFEFEFEFDFDFDFDFDFDFDFDFEFEFFFFFF0000000101010110 +:2026E000000000000000000000000001010101010101010000000000FFFFFFFFFEFEFEFEDE +:20270000FFFFFF000101020303040404040303020100FFFFFEFDFDFDFDFDFDFDFDFDFDFEBD +:20272000FEFEFEFEFEFFFF0001020303040405050505050505040302010000FFFEFDFDFC74 +:20274000FCFCFBFBFBFCFCFCFDFDFEFEFFFF0000010102020303030303030303030303027F +:202760000201010000FFFFFEFEFEFEFEFEFEFEFEFFFFFFFFFF00000000000000010101016A +:20278000000000FFFFFEFEFEFEFEFEFFFFFF0001010202030303020202020101010101012D +:2027A000010101000000000000FFFFFFFEFEFEFDFEFEFEFFFFFFFF00FFFFFFFFFFFFFFFF34 +:2027C000FFFF00000000000101020203040404050504040403030201010000FFFFFEFEFECE +:2027E000FDFDFDFDFDFDFCFCFDFDFDFDFDFDFEFEFEFFFF00000000010101020202030303FB +:202800000304040403030302020201010000FFFFFFFEFEFEFEFEFEFDFDFDFDFDFDFEFEFEBF +:20282000FFFFFF000000000000000000000000000001010202030303030202020101000081 +:2028400000000000000000000000000000000001010000000000FFFFFFFFFEFEFEFEFEFE86 +:20286000FEFEFFFFFF00000001010101020202020202020202010101010100000000000044 +:2028800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000049 +:2028A000000001010101010101010100000000FFFFFEFEFEFDFDFDFEFEFEFFFF0000010126 +:2028C000010101010101020101010101010000000000000000010101010101000000FFFFE6 +:2028E000FFFFFFFFFFFFFFFF0000010101010101010101000000FFFFFFFFFFFFFFFFFF00E0 +:202900000000000001010101020202020202020101010100000000FFFFFFFFFFFEFEFEFEAE +:20292000FEFEFEFEFEFEFFFFFFFF000001010101010202020202020201010101000000FF91 +:20294000FFFFFFFEFEFEFEFEFEFFFF000001010101010101010000FFFFFFFEFEFEFEFFFF8D +:20296000FFFF0000010101020202020201010101010101000000000000FFFFFFFEFEFEFF4F +:20298000FFFFFFFF00000001010102020202020202020101010000FFFFFFFEFEFEFEFFFF32 +:2029A000FF00000101010101010000FFFFFEFEFEFDFDFDFDFDFDFDFEFEFF0000010203032B +:2029C000040505050606050505040302010100FFFFFEFDFDFCFBFBFAFAFAFAFAFAFAFBFB0A +:2029E000FCFDFEFFFF0001020203030404050606070707070707060605040201FFFEFDFC86 +:202A0000FBFAF9F9F9F9FAFAFBFBFCFDFDFEFF0001020304040505040404030302010100D2 +:202A200000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000A2 +:202A40000000000001010101010101000000000000000000000000000000000000FFFFFF72 +:202A6000FFFFFFFFFFFEFEFEFEFEFEFFFFFF00000001010102020202020202010101010154 +:202A8000000000000000000000000000FFFFFFFEFEFEFEFFFFFFFF00000000010101010140 +:202AA0000102020202020201010000FFFFFFFFFFFFFFFEFEFEFEFDFDFDFDFDFEFEFEFF002C +:202AC000000102020304040404040404040302020100FFFFFFFEFEFEFDFDFDFDFCFCFDFDE9 +:202AE000FDFEFEFEFF0000010102020203030303030303020201010000FFFFFFFFFFFFFFC4 +:202B0000FFFFFEFEFEFEFDFDFDFDFDFEFFFF000101020203030302020201010101010101B6 +:202B20000101010101010101000000000000FFFFFFFFFFFFFEFFFFFFFFFFFFFFFF0000009D +:202B4000000000000000FFFFFFFFFFFFFFFFFF000000010102020202030303020202020162 +:202B600001010000FFFFFFFEFEFEFEFEFEFEFEFEFFFFFFFF00000000010101010101000066 +:202B80000000FFFFFFFFFFFFFFFFFFFFFF0000000001010102020202020202020201010128 +:202BA00001000000000000FFFFFFFEFEFDFCFCFCFCFCFCFDFEFEFF0000010202020303032E +:202BC000040404040303030202010100FFFFFEFEFEFEFEFEFFFFFF00000000000000FFFFE9 +:202BE000FFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFF0000010202030404040505C5 +:202C0000050504040303020100FFFEFDFCFBFBFBFBFBFBFBFCFCFCFDFDFDFEFEFFFF0001E0 +:202C2000010202030303030303030303030302020202020101010000FFFFFFFEFEFEFEFE6E +:202C4000FEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000102030405050676 +:202C60000605050403020100FFFFFEFDFDFCFCFCFCFCFCFCFDFDFEFFFF0000010101010165 +:202C800002020202020202020202020202020201010000FFFFFEFEFDFDFDFDFDFDFDFDFD35 +:202CA000FDFEFEFFFF0000010101020203030404040404040403030202010000FFFEFDFDF2 +:202CC000FCFCFBFBFBFBFBFCFCFDFEFEFF00010202030304040505050504040302020100EE +:202CE00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFDFDFDFDFDFDFDFDFDFEFEFEFFFF0A +:202D00000000010202030304040405050505050404030302010000FFFEFEFDFDFDFDFDFD89 +:202D2000FDFDFDFDFDFEFEFEFEFFFFFF000000000000000000010102020303030303030293 +:202D40000202010000FFFFFEFEFEFDFDFDFEFEFEFEFF000001010202030303020202010072 +:202D600000FFFFFFFEFEFEFEFEFEFEFEFEFEFFFFFF00000101020203030303030202020151 +:202D800001010100000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFE4F +:202DA000FFFFFFFF000001010102020202020202020202020202020201010000FFFFFEFEFA +:202DC000FEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFF00000000010101020203030404040303F1 +:202DE00003030202010000FFFEFDFDFCFCFBFBFCFCFCFDFEFF0001020303040404040404D4 +:202E00000303020201010000FFFFFEFEFDFDFCFCFCFCFCFCFCFDFDFEFFFF000001020202D1 +:202E200002020202020202020203030303030202020101000000FFFFFFFEFEFEFDFDFDFD7E +:202E4000FDFDFDFDFDFEFEFEFEFEFEFEFFFF00000101020303040404040404030302020263 +:202E600001010101010100FFFEFDFCFCFBFBFBFBFCFCFDFEFF000001020202030303030366 +:202E800003030303020201010000FFFEFEFDFDFCFCFCFCFCFCFDFEFEFF000101020203033F +:202EA0000404040405040404030302010100FFFEFEFDFCFCFBFBFBFBFBFCFCFCFDFDFDFE27 +:202EC000FFFF0001020304040405050505050404040302010100FFFEFDFDFCFCFCFCFCFBD8 +:202EE000FCFCFCFDFDFEFF0001010202030303030303030302020202010101000000FFFFC0 +:202F0000FFFFFFFFFEFEFEFFFFFFFFFF0000000000000000010101010101010101010100B5 +:202F20000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000009E +:202F400000000000000000000000000000000000000101010101010101010100000000FF68 +:202F6000FFFFFFFFFEFEFEFEFEFEFFFFFFFF00000000000000000000000000000001010162 +:202F80000101020202010101010101000000000000000000000000FFFF0000000000000025 +:202FA00000000000FFFFFFFFFFFFFFFFFF0000000101010101010100000001010102020309 +:202FC00003030303030202010100FFFFFEFDFDFCFCFCFCFCFCFCFCFDFDFDFEFEFFFF000015 +:202FE000010102020303030404040404040303030202010100FFFEFEFDFDFDFCFCFCFCFCBD +:20300000FDFDFDFDFEFEFFFF0001010203030404040303020100FFFFFEFEFEFEFEFEFFFFB3 +:20302000FEFEFEFFFFFFFFFF00000001010102020303030304040303030202010000FFFF74 +:20304000FEFEFDFDFDFCFCFCFBFBFBFBFCFDFEFF0001020303040505060606060606050463 +:203060000303020100FFFFFEFEFDFDFCFCFCFCFCFCFCFCFCFDFDFDFEFEFFFF000001010282 +:20308000020202020202020202020101010101010101010101010101010101010101000008 +:2030A000FFFEFEFDFCFBFBFBFBFBFCFCFDFDFEFEFEFFFF0001020304050606060606060513 +:2030C000040303020201010100FFFFFEFEFDFDFCFCFBFBFBFAFAFAFBFCFDFEFF000102021E +:2030E00003030303030202020201010100000000010101020202020202020202010101009E +:2031000000FFFFFEFEFDFDFDFDFDFEFEFFFFFF000000010100000000FFFFFEFEFEFEFEFED7 +:20312000FEFFFF00000102020303040404050404040303020100FFFEFDFCFBFBFAFAFAFB8D +:20314000FBFCFCFDFEFFFF0001020203030303040404040303030302020101000000FFFF52 +:20316000FFFFFEFEFEFDFDFDFDFDFDFDFEFEFF000000010101010101000000000101020265 +:20318000030304040404040403030201010000FFFEFEFDFCFCFBFBFAFAFAFAFAFBFBFCFD50 +:2031A000FDFEFF00000102030405050606060606060605050403020100FFFEFDFCFCFBFBDB +:2031C000FBFBFBFCFCFCFDFDFDFDFDFEFEFFFF0001010203030404040505040404030202EC +:2031E0000100FFFFFEFEFEFEFEFEFEFEFDFDFDFDFCFCFDFDFEFF00010203040505050606D8 +:203200000605050403020100FFFEFDFDFCFCFCFCFCFCFCFDFDFDFDFDFEFEFFFF00000101CC +:203220000202020303040404040404030302010100FFFFFFFEFEFEFDFDFDFDFDFDFEFEFE81 +:20324000FFFFFF0000010101020202020202020101010101000000FFFFFFFEFEFEFEFEFE6A +:20326000FEFEFEFFFF00000101010101000000FFFFFFFFFFFFFF000001010202020202024A +:20328000020201010101010101010202020202020100FFFEFDFDFCFBFBFBFBFBFBFBFCFC4D +:2032A000FDFEFF00010202030404050505050505050404030202010000FFFFFEFEFEFDFDDF +:2032C000FDFCFCFCFCFCFDFDFDFEFEFFFFFFFFFFFFFFFF0000000101020202020202020208 +:2032E000020202020202020202020202020202020201010100FFFEFEFDFCFBFAFAFAFAFAD8 +:20330000FAFBFCFDFDFEFF0001010203030404040505050504040404040404040302020173 +:2033200000FEFDFCFCFBFBFAFAFBFBFBFCFDFDFDFEFEFFFFFF0000010102020203030304BE +:20334000040404040404040303020201010000FFFEFDFCFBFAFAFAFAFAFBFCFDFEFF000180 +:20336000020303040404040403030202010101000000FFFFFFFFFFFFFEFEFEFEFEFEFEFE3A +:20338000FEFFFFFF00000001010101020202020202020202020101010000FFFFFEFEFEFD22 +:2033A000FDFDFDFDFDFEFEFFFF000001010202020203030303030302020101000000FFFF02 +:2033C000FFFFFFFFFFFFFFFFFEFEFFFFFFFFFF0000000001010100000000000000000000FB +:2033E00000000000000000010101010101010101000000000000FFFFFFFFFFFF00000000CA +:203400000001010102020202020201010000FFFEFDFDFCFCFCFDFDFEFEFFFF0000000101BA +:203420000202020202020201010101000000000000FFFFFFFFFFFF0000000000FFFFFFFF84 +:20344000FFFFFFFF0000010202020202020202020101010000FFFFFFFEFEFEFDFDFDFDFD72 +:20346000FDFDFEFEFFFF000000010101020202030303030303030303030201010000FFFE30 +:20348000FEFDFDFDFDFDFDFDFDFDFEFEFEFFFFFFFF00000001010101010202020202020240 +:2034A00002020202020201010101000000FFFFFEFEFEFEFEFEFEFFFFFFFFFF000000000011 +:2034C000000000000001010101010101010101000000FFFFFFFFFFFFFFFFFFFFFF000000ED +:2034E000000000000101010101020202020202010101000000FFFFFFFFFFFFFFFFFFFFFFC3 +:20350000FFFFFFFFFFFF0000000000000001010101010000000000000000000100000000AB +:2035200000FFFFFFFFFFFFFFFFFFFFFF0000000000010101010101010000000000FFFFFF92 +:203540000000000000000000000000000000000000000000000000000000000000FFFFFF6E +:20356000FFFFFFFFFFFFFFFFFF00000000000000010101020203030303030303030302022E +:20358000010000FFFFFEFEFDFDFDFDFDFDFDFDFDFDFDFEFEFEFEFFFFFF0000000101010257 +:2035A00002020203030302020202020201010101000000FFFFFFFFFEFEFEFEFEFEFEFFFF00 +:2035C000000001020202020202010100FFFEFEFDFDFDFDFDFEFEFFFF0000000000000000F6 +:2035E000000101010101010101020202020202030303020202020101010000FFFFFEFEFDAC +:20360000FDFCFCFCFCFCFCFDFDFEFFFF000102020304040405050504040403030201000097 +:13362000FFFEFEFDFDFCFCFCFCFCFCFCFCFDFDFEFEFEFFCF +:00000001FF diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/build_id.tcl b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_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/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/build_id.v b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/build_id.v new file mode 100644 index 00000000..2e0b64db --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171116" +`define BUILD_TIME "055618" diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/clocks.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/clocks.vhd new file mode 100644 index 00000000..3d3faba8 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/clocks.vhd @@ -0,0 +1,196 @@ +----------------------------------------------------------------------------- +-- CLOCKS -- +-- For use with Computer Space FPGA emulator. -- +-- Generates the clocks required to run the CS game, -- +-- to emulate analogue timers and pulse trains, -- +-- and to run implementation specifics such as: -- +-- sigma-delta audio and interlaced composite video. -- +-- -- +-- In the real game; capacitors, NOT gates and schmitt trigger ICs -- +-- create timers and "pulse trains" that are used for: -- +-- thrust impact(acceleration/deceleration), engine flame motion, -- +-- rotation speed, duration of explosion, rotation speed during explosion, -- +-- duration of missiles, and seconds counters for game time. -- +-- -- +-- The FPGA emulation "replaces" the analogue parts with digital -- +-- clocks and counters. -- +-- -- +-- v1.0 -- +-- by Mattias G, 2015 -- +-- Enjoy! -- +----------------------------------------------------------------------------- + +library ieee; +USE ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +library work; + +--80--------------------------------------------------------------------------| + +entity clocks is + port( + clock_50 : in std_logic; + + thrust_and_rotate_clk : out std_logic:='0'; + + explosion_clk, explosion_rotate_clk : out std_logic; + + timer_base_clk : out std_logic; + rocket_missile_life_time_duration, + saucer_missile_life_time_duration, + saucer_missile_hold_duration, + signal_delay_duration : out integer; + + seconds_clk : out std_logic + ); + +end clocks; + +architecture clocks_architecture + of clocks is + +-- signals to generate clock +-- that controls: +-- rocket flame motion freq, +-- acceleration/deceleration and +-- rocket rotation speed +signal thrust_and_rotate_clk_count : integer:=0; +signal thrust_and_rotate_clk_buffer : std_logic:='0'; + +-- signals for explosion +-- circuitry logic +signal explosion_clk_count : integer:=0; +signal explosion_clk_buffer : std_logic:='0'; + +-- signals to generate clock used for +-- rotating the rocket rapdily +-- during explosion +signal explosion_rotate_clk_count : integer:=0; +signal explosion_rotate_clk_buffer : std_logic:='0'; + +-- signals used for generating +-- seconds clock (game time) +signal seconds_clk_count : integer :=0; +signal seconds_clk_buffer : std_logic:='0'; + +-----------------------------------------------------------------------------// +begin + +----------------------------------------------------------------------------- +-- creating clock for thrust, rocket engine flame and rotation -- +-- (based on the 50MHz clock ) -- +-- count of 2777778 @ 50 MhZ=> 18 Hz -- +-- measured to 18.2 Hz at real Memory Board -- +----------------------------------------------------------------------------- +process (clock_50) +begin +if clock_50'event and clock_50='1' then + if thrust_and_rotate_clk_count = 2777778 then + thrust_and_rotate_clk_count <= 0; + thrust_and_rotate_clk_buffer <= not (thrust_and_rotate_clk_buffer); + else + thrust_and_rotate_clk_count <= thrust_and_rotate_clk_count+1; + end if; +end if; +end process; + +-- buffer required +thrust_and_rotate_clk <= thrust_and_rotate_clk_buffer; + +----------------------------------------------------------------------------- +-- creating clock for explosion circuitry; -- +-- (based on the 50MHz clock ) -- +-- use count of 4166667 @ 50 MhZ => 6 Hz -- +-- measured to 6.13 - 6.19 Hz at real Sync Star Board -- +----------------------------------------------------------------------------- +process (clock_50) +begin +if clock_50'event and clock_50='1' then + if explosion_clk_count = 4166667 then + explosion_clk_count <= 0; + explosion_clk_buffer <= not (explosion_clk_buffer); + else + explosion_clk_count <= explosion_clk_count+1; + end if; +end if; +end process; + +-- buffer required +explosion_clk <= explosion_clk_buffer; + +----------------------------------------------------------------------------- +-- creating clock to rotate the ship at explosion; -- +-- (based on the 50MHz clock) -- +-- 147 @ 50 Mhz gives the fundamental explosion clock: 340KHz -- +-- as measured on real Memory Board -- +----------------------------------------------------------------------------- +process (clock_50) +begin +if clock_50'event and clock_50='1' then + if explosion_rotate_clk_count = 147 then + explosion_rotate_clk_count <= 0; + explosion_rotate_clk_buffer <= not (explosion_rotate_clk_buffer); + else + explosion_rotate_clk_count <= explosion_rotate_clk_count+1; + end if; +end if; +end process; + +-- buffer required +explosion_rotate_clk <= explosion_rotate_clk_buffer; + +----------------------------------------------------------------------------- +-- creating clock second pulses from the 50 Mhz clock -- +-- 25.000.000 gives second long clock pulse with 50MHz clock => 1Hz -- +----------------------------------------------------------------------------- +process (clock_50) +begin +if clock_50'event and clock_50='1' then + if seconds_clk_count = 25000000 then + seconds_clk_count <= 0; + seconds_clk_buffer <= not (seconds_clk_buffer); + else + seconds_clk_count <= seconds_clk_count+1; + end if; +end if; +end process; + +-- buffer required +seconds_clk <= seconds_clk_buffer; + +----------------------------------------------------------------------------- +-- Creating clock and timer duration used by Motion Board: -- +-- > rocket missile life time -- +-- > saucer missile life time and duration between missile launches -- +-- > signal delay emulation -- +-- Replaces the disrete/analogue timer solutions on the board -- +-- Values set to closely match values measured on real CS boards -- +----------------------------------------------------------------------------- +timer_base_clk <= clock_50; + +rocket_missile_life_time_duration <= 115000000; -- 2,3s +-- calculate rocket_missile_life_time_duration as: +-- rocket_missile_life_time_duration / timer_base_clk = 2,3s +-- reaching a life time of 2.3 seconds +-- as measured on real CS board set + +saucer_missile_life_time_duration <= 115000000; -- 2,3 s +-- calculate saucer_missile_life_time_duration as: +-- saucer_missile_life_time_duration / timer_base_clk = 2.3s +-- reaching a life time of 2.3 seconds +-- as measured on real CS board set + +saucer_missile_hold_duration <= 10000000; -- 0.2s +-- calculate saucer_missile_hold_duration as: +-- saucer_missile_hold_duration / timer_base_clk = 0,2s +-- reaching a hold time of 0.2 seconds +-- as measured on real CS board set + +signal_delay_duration <= 150000; -- 0,003s (should actually be only 3us) +-- calculate signal_delay_duration as: +-- signal_delay_duration / timer_base_clk = 0,003s +-- reaching a signal delay time of 0.003 seconds +-- measured to 3us on real CS board set + +end clocks_architecture; \ No newline at end of file diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/computer_space_logic.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/computer_space_logic.vhd new file mode 100644 index 00000000..ef4ccfec --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/computer_space_logic.vhd @@ -0,0 +1,349 @@ +----------------------------------------------------------------------------- +-- COMPUTER SPACE LOGIC -- +-- Implementation of Computer Space FPGA emulator. -- +-- Module that embodies the three CS boards -- +-- and manages the interfaces between those boards -- +-- as well as the interface with the implementation specifics and key -- +-- clocks/timers -- +-- -- +-- This entity is implementation agnostic -- +-- -- +-- Naming convention: -- +-- Sync Star Board inputs/outputs are labelled SB_, where is -- +-- according to original schematics input/output labels. -- +-- Motion Board inputs/outputs are labelled MB_, where is -- +-- according to original schematics input/output labels. -- +-- Memory Board inputs/outputs are labelled MemBrd_, where is -- +-- according to original schematics input/output labels. -- +-- -- +-- v1.0 -- +-- by Mattias G, 2015 -- +-- Enjoy! -- +----------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +library work; + +--80--------------------------------------------------------------------------| + +entity computer_space_logic is + port + ( + reset, + + -- clocks and timers + game_clk, super_clk, explosion_clk, + seconds_clk, timer_base_clk : in std_logic; + + rocket_missile_life_time_duration, + saucer_missile_life_time_duration, + saucer_missile_hold_duration, + signal_delay_duration : in integer; + + -- for use with memory board + thrust_and_rotate_clk, + explosion_rotate_clk : in std_logic; + + -- control panel signals incl coin + signal_start, signal_coin, + signal_thrust, signal_fire, + signal_cw, signal_ccw : in std_logic; + + -- composite video + -- signals; to send via gpio + -- to TV (via resistor circuitry) + composite_video_signal : out std_logic; + blank : out std_logic; + + hsync : out std_logic; + vsync : out std_logic; + + -- signals for sound + audio_gate : out std_logic; + sound_switch : out std_logic_vector (7 downto 0) + := "00000000" + ); + +end computer_space_logic; + +architecture +computer_space_logic_architecture +of computer_space_logic is + +component sync_star_board + port ( + reset, + game_clk : in std_logic; + super_clk, + explosion_clk, seconds_clk : in std_logic; + + SB_3, SB_4, SB_6, SB_7, + SB_C, SB_E, SB_N : in std_logic; + + SB_2, SB_5, SB_H, SB_K, + SB_L, SB_M, SB_Y : out std_logic; + + hsync : out std_logic; + vsync : out std_logic; + composite_video_signal : out std_logic; + blank : out std_logic + ); +end component; + +component motion_board + port ( + super_clk, timer_base_clk : in std_logic; + rocket_missile_life_time_duration, + saucer_missile_life_time_duration, + saucer_missile_hold_duration, + signal_delay_duration : in integer; + + MB_3, MB_4, MB_16, MB_17, + MB_18, MB_19, MB_20, + MB_C, MB_D, MB_H, MB_J, + MB_T, MB_U, MB_V, MB_Y : in std_logic; + + MB_5, MB_6, MB_8, MB_9, + MB_10, MB_11, MB_12, + MB_13, MB_14, MB_15,MB_21, + MB_B, MB_E, MB_F, + MB_K, MB_L, MB_N, MB_M, + MB_P, MB_R, MB_W, + MB_2_rocket, MB_2_saucer : out std_logic + ); +end component; + +component memory_board + port ( + super_clk, thrust_and_rotate_clk, + explosion_rotate_clk : in std_logic := '1'; + + MemBrd_2, MemBrd_3, MemBrd_4, + MemBrd_5, MemBrd_6, MemBrd_7, + MemBrd_8, MemBrd_9, MemBrd_10, + MemBrd_11, MemBrd_A, MemBrd_B, + MemBrd_C, MemBrd_D, MemBrd_E, + MemBrd_F, MemBrd_H, MemBrd_J, + MemBrd_K, MemBrd_M, MemBrd_N, + MemBrd_R, MemBrd_S : in std_logic; + + MemBrd_12, MemBrd_13, MemBrd_14, + MemBrd_15, MemBrd_16, MemBrd_17, + MemBrd_K1, MemBrd_K2, MemBrd_P, + MemBrd_T, MemBrd_U, MemBrd_V, + MemBrd_W, MemBrd_X, MemBrd_Y : out std_logic + ); +end component; + +-- signals for interfacing +-- with sync star board +signal SB_3, SB_4, SB_6, + SB_C, SB_E, SB_N : std_logic; +signal SB_2, SB_5, SB_7, + SB_H, SB_K, SB_L, SB_M, SB_Y : std_logic; + +-- signals for interfacing with +-- memory board +signal MemBrd_A, MemBrd_B, MemBrd_C, + MemBrd_D, MemBrd_2, MemBrd_3, + MemBrd_4, MemBrd_5,MemBrd_E, + MemBrd_F, MemBrd_J, MemBrd_H, + MemBrd_6, MemBrd_7, MemBrd_8, + MemBrd_9 : std_logic; +signal MemBrd_13, MemBrd_14, MemBrd_15, + MemBrd_16 : std_logic; +signal MemBrd_W, MemBrd_V, MemBrd_X, + MemBrd_Y, MemBrd_S : std_logic; +signal MemBrd_17, MemBrd_T, MemBrd_U, + MemBrd_12, MemBrd_11 : std_logic; +signal MemBrd_10, MemBrd_22, MemBrd_R, + MemBrd_K, MemBrd_P, MemBrd_M, + MemBrd_N : std_logic; +signal MemBrd_K1, MemBrd_K2 : std_logic := '0'; + +-- signals for interfacing +-- with motion board +signal MB_V, MB_U, MB_T, MB_4, MB_D, + MB_3, MB_H, MB_J, MB_B, MB_C : std_logic; +signal MB_19, MB_18, MB_16, MB_17, MB_20 : std_logic; + +signal MB_E, MB_5, MB_F, MB_6, MB_L, + MB_9, MB_K, MB_8, MB_21, MB_M, + MB_11, MB_N, MB_12, MB_14, MB_R, + MB_13, MB_15, MB_P, MB_W, MB_10, + MB_Y : std_logic; +signal MB_2_rocket, MB_2_saucer : std_logic; + +-----------------------------------------------------------------------------// +begin + +----------------------------------------------------------------------------- +-- SYNC STAR BOARD -- +----------------------------------------------------------------------------- +Sync_Star_Brd : sync_star_board +port map (reset, game_clk, super_clk, explosion_clk, seconds_clk, +SB_3, SB_4, SB_6, SB_7, SB_C, SB_E, SB_N, +SB_2, SB_5, SB_H, SB_K, SB_L, SB_M, SB_Y, hsync, vsync, +composite_video_signal, blank); + +----------------------------------------------------------------------------- +-- MOTION BOARD -- +----------------------------------------------------------------------------- +Motion_Brd: motion_board +port map (super_clk, timer_base_clk, rocket_missile_life_time_duration, +saucer_missile_life_time_duration, saucer_missile_hold_duration, +signal_delay_duration, MB_3, MB_4, MB_16, MB_17, MB_18, MB_19, MB_20, MB_C, +MB_D, MB_H, MB_J, MB_T, MB_U, MB_V, MB_Y, MB_5, MB_6, MB_8, MB_9, MB_10, +MB_11, MB_12, MB_13, MB_14, MB_15,MB_21, MB_B, MB_E, MB_F, MB_K, MB_L, MB_N, +MB_M, MB_P, MB_R, MB_W, MB_2_rocket, MB_2_saucer); + +----------------------------------------------------------------------------- +-- MEMORY BOARD -- +----------------------------------------------------------------------------- +Memory_Brd: memory_board +port map(super_clk, thrust_and_rotate_clk, explosion_rotate_clk, MemBrd_2, +MemBrd_3, MemBrd_4, MemBrd_5, MemBrd_6, MemBrd_7, MemBrd_8, MemBrd_9, +MemBrd_10, MemBrd_11, MemBrd_A, MemBrd_B, MemBrd_C, MemBrd_D, MemBrd_E, +MemBrd_F, MemBrd_H, MemBrd_J, MemBrd_K, MemBrd_M, MemBrd_N, MemBrd_R, +MemBrd_S, MemBrd_12, MemBrd_13, MemBrd_14, MemBrd_15, MemBrd_16, MemBrd_17, +MemBrd_K1, MemBrd_K2, MemBrd_P, MemBrd_T, MemBrd_U, MemBrd_V, MemBrd_W, +MemBrd_X, MemBrd_Y); + +----------------------------------------------------------------------------- +-- COMPUTER SPACE BOARD INTRA CONNECTION MAPPING -- +-- from Motion Board to Memory Board -- +----------------------------------------------------------------------------- +MemBrd_A <= MB_8; -- SAUCER VERTICAL BIT 3 +MemBrd_2 <= MB_K; -- SAUCER VERTICAL BIT 2 +MemBrd_E <= MB_9; -- SAUCER VERTICAL BIT 1 +MemBrd_6 <= MB_L; -- SAUCER VERTICAL BIT 0 + +MemBrd_B <= MB_6; -- SAUCER HORIZONTAL BIT 3 +MemBrd_3 <= MB_F; -- SAUCER HORIZONTAL BIT 2 +MemBrd_F <= MB_5; -- SAUCER HORIZONTAL BIT 1 +MemBrd_7 <= MB_E; -- SAUCER HORIZONTAL BIT 0 + +MemBrd_C <= MB_12; -- ROCKET HORIZONTAL BIT 3 +MemBrd_4 <= MB_N; -- ROCKET HORIZONTAL BIT 2 +MemBrd_H <= MB_11; -- ROCKET HORIZONTAL BIT 1 +MemBrd_8 <= MB_M; -- ROCKET HORIZONTAL BIT 0 + +MemBrd_D <= MB_15; -- ROCKET VERTICAL BIT 3 +MemBrd_5 <= MB_13; -- ROCKET VERTICAL BIT 2 +MemBrd_J <= MB_R; -- ROCKET VERTICAL BIT 1 +MemBrd_9 <= MB_14; -- ROCKET VERTICAL BIT 0 + + +MemBrd_11 <= MB_B; -- 30Hz pulse train + +----------------------------------------------------------------------------- +-- COMPUTER SPACE BOARD INTRA CONNECTION MAPPING -- +-- from Memory Board to Motion Board -- +----------------------------------------------------------------------------- +MB_V <= MemBrd_X; -- rocket vertical velocity level bit 2 +MB_U <= MemBrd_V; -- rocket vertical velocity level bit 1 +MB_T <= MemBrd_W; -- rocket vertical velocity level bit 0 + +MB_4 <= MemBrd_15; -- rocket horizontal velocity level bit 2 +MB_D <= MemBrd_13; -- rocket horizontal velocity level bit 1 +MB_3 <= MemBrd_14; -- rocket horizontal velocity level bit 0 + +MB_H <= MemBrd_Y; -- rocket vertical velocity: + -- rocket going up or down + -- 0 up / 1 down + +MB_J <= MemBrd_16; -- rocket horizontal velocity: + -- rocket going right or left + -- 0 - left / 1 - right + +MB_19 <= MemBrd_T; -- rocket missile + -- vertical (up / down) speed + -- constant 1 - no speed + -- constant 0 - "60Hz" speed (60 pixels / second) + -- pulse 0/1 at 30 Hz rate + -- gives "30 Hz" speed (30 pixels / second) + +MB_18 <= MemBrd_12; -- rocket missile + -- vertical direction + -- 0 - up, 1 - down + +MB_17 <= MemBrd_U; -- rocket missile + -- horizontal (right/left) speed + -- constant 1 - no speed + -- constant 0 - "60Hz" speed + -- pulse 0/1 at 30 Hz rate + -- gives "30 Hz" speed + +MB_16 <= MemBrd_17; -- rocket missile + -- horizontal direction + -- 1- right, 0 - left + +----------------------------------------------------------------------------- +-- COMPUTER SPACE BOARD INTRA CONNECTION MAPPING -- +-- from Motion Board to Sync Star Board -- +----------------------------------------------------------------------------- +SB_3 <= MB_21; -- saucer enable +SB_E <= MB_W; -- rocket enable +SB_4 <= MB_10; -- saucer missile video +SB_6 <= MB_P; -- rocket missile video from motionboard to syncboard + -- (game on and collision/explosion) + +----------------------------------------------------------------------------- +-- COMPUTER SPACE BOARD INTRA CONNECTION MAPPING -- +-- from Sync Star Board to Memory Board -- +----------------------------------------------------------------------------- +MemBrd_K <= SB_2; -- saucer out / saucer enable + -- after collision/explosion logic has been applied + +MemBrd_10 <= SB_5; -- rocket_enable + -- after game on and collision/explosion + -- logic has been applied + +MemBrd_22 <= SB_L; -- explosion audio trigger + -- (in real impl connected to audio unit + -- on Memory Board) + +MemBrd_R <= SB_M; -- spin + +----------------------------------------------------------------------------- +-- COMPUTER SPACE BOARD INTRA CONNECTION MAPPING -- +-- from Memory Board to Sync Star Board -- +----------------------------------------------------------------------------- +SB_N <= MemBrd_P; -- video out (rocket and saucer) + +----------------------------------------------------------------------------- +-- COMPUTER SPACE BOARD INTRA CONNECTION MAPPING -- +-- from Sync Star Board to Motion Board -- +----------------------------------------------------------------------------- +MB_C <= SB_H; -- count enable +MB_20 <= SB_Y; -- clock inverse + +----------------------------------------------------------------------------- +-- CONNECTING TO BUTTONS -- +----------------------------------------------------------------------------- +SB_C <= signal_coin; +SB_7 <= signal_start; +MemBrd_S <= signal_thrust; +MB_Y <= signal_fire; +MemBrd_M <= signal_cw; +MemBrd_N <= signal_ccw; + +----------------------------------------------------------------------------- +-- CONNECTING TO AUDIO -- +-- -- +-- connecting to sound module, specific to the fpga board implementation -- +----------------------------------------------------------------------------- +audio_gate <= not SB_K; -- if high, then audio is active (game is on) + -- if low then audio is inactive (game is not on) + +sound_switch (1) <= MemBrd_K1; -- rocket rotation +sound_switch (2) <= MemBrd_K2; -- rocket thrust +sound_switch (3) <= MB_2_rocket; -- rocket missile shooting +sound_switch (4) <= MemBrd_22; -- explosion +sound_switch (5) <= MB_2_saucer; -- saucer missile shooting +sound_switch (6) <= '0'; + +end computer_space_logic_architecture; \ No newline at end of file diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/computer_space_top.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/computer_space_top.vhd new file mode 100644 index 00000000..a7bc383e --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/computer_space_top.vhd @@ -0,0 +1,199 @@ +----------------------------------------------------------------------------- +-- COMPUTER SPACE TOP LEVEL - embedded audio memory version -- +-- Implementation of Computer Space FPGA emulator. -- +-- -- +-- Developed primarily to understand the inner workings of -- +-- the Computer Space game logic. -- +-- -- +-- The emulator can also serve the purpose of game -- +-- preservation as the schematics have been copied "wire by wire" -- +-- and "component by component"/"gate by gate" and hence represents -- +-- a very close realization of the original, except for sound -- +-- generation which in this solution is based on audio samples. -- +-- -- +-- Some errors in the original schematics have been -- +-- discovered during the transfer of schematics into vhdl. They are -- +-- accounted for and corrected in the vhdl code. -- +-- -- +-- The Computer Space Logic part replicates the three Computer Space -- +-- Boards and represents the complete game. It is implementation agnostic, -- +-- but requires the ability to support global clock signals, -- +-- input signals from control panel buttons and -- +-- coin mechanism, output signal to trigger audio and output signal for -- +-- composite ntsc video and audio. -- +-- -- +-- -- +-- Credit goes to: -- +-- * Overall fpga development community; there is a lot of stuff -- +-- readily available as inspiration and working code - in -- +-- particular regarding the implementation specifics -- +-- * Mike Salay (KLOV: road.runner) - who has provided a large number -- +-- of measurement points from real Computer Space boards to determine-- +-- timer values, resolve logic behind the distribution of stars on -- +-- screen and verify the original video sync logic. -- +-- * Computerspacefan.com - who has provided sound samples and -- +-- original schematics -- +-- * Chris (http://www.pyroelectro.com/) whose code for interlaced -- +-- ntsc signalling I have kindly used as a basis for creating an -- +-- interlaced ntsc video signal version -- +-- -- +-- v1.0 -- +-- by Mattias G, 2015 -- +-- Enjoy! -- +----------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +library work; + +--80---------------------------------------------------------------------------| + +entity computer_space_top is + port + ( + reset : in std_logic; + clock_50 : in std_logic; + game_clk : in std_logic; + + signal_ccw : in std_logic; + signal_cw : in std_logic; + signal_thrust : in std_logic; + signal_fire : in std_logic; + signal_start : in std_logic; + + hsync : out std_logic; + vsync : out std_logic; + blank : out std_logic; + video : out std_logic; + + wav_out : out signed (15 downto 0) + ); +end computer_space_top; + +architecture computer_space_architecture + of computer_space_top is + +component clocks is + port ( + clock_50 : in std_logic; + thrust_and_rotate_clk : out std_logic:='0'; + explosion_clk : out std_logic; + explosion_rotate_clk : out std_logic; + seconds_clk : out std_logic; + timer_base_clk : out std_logic; + rocket_missile_life_time_duration, + saucer_missile_life_time_duration, + saucer_missile_hold_duration, + signal_delay_duration : out integer + ); +end component clocks; + +component computer_space_logic is + port ( + reset, + game_clk, super_clk, explosion_clk, + seconds_clk : in std_logic; + timer_base_clk : in std_logic; + rocket_missile_life_time_duration, + saucer_missile_life_time_duration, + saucer_missile_hold_duration, + signal_delay_duration : in integer; + thrust_and_rotate_clk, + explosion_rotate_clk : in std_logic; + signal_start, signal_coin, + signal_thrust, signal_fire, + signal_cw, signal_ccw : in std_logic; + composite_video_signal : out std_logic; + blank : out std_logic; + hsync : out std_logic; + vsync : out std_logic; + audio_gate : out std_logic; + sound_switch : out std_logic_vector (7 downto 0) + ); +end component computer_space_logic; + +component sound is + port ( + clock_50, audio_gate : in std_logic; + sound_switch : in std_logic_vector (7 downto 0); + sigma_delta_wav : out signed (15 downto 0) + ); +end component sound; + +-- signals for thrust +-- so that a continuous button push +-- create continuous thrust and/or +-- rotation +signal thrust_and_rotate_clk : std_logic:='0'; + +-- signals for explosion circuitry +-- logic +signal explosion_clk : std_logic; + +-- clock to rotate the rocket +-- rapdily at explosion +signal explosion_rotate_clk : std_logic; + +--signals for clock counting seconds +signal seconds_clk : std_logic; + +-- timer components for Motion Board +signal timer_base_clk : std_logic; +signal rocket_missile_life_time_duration, + saucer_missile_life_time_duration, + saucer_missile_hold_duration, + signal_delay_duration : integer; + +-- signals for composite +-- video + + +-- signals to fetch and activate sound +-- from audio memory +signal sound_switch : std_logic_vector (7 downto 0) + := "00000000" ; +-- not using bit 0, only bit 1 to 5 +-- 1 = rocket rotate +-- 2 = rocket thrust, +-- 3 = rocket missile +-- 4 = rocket explosion, +-- 5 = saucer missile shooting + +signal audio_gate : std_logic; + + + +------------------------------------------------------------------------// +begin + +-------------------------------------------------------------------------- +-- GENERATE CLOCKS -- +-------------------------------------------------------------------------- +generate_clock : CLOCKS +port map +(clock_50, thrust_and_rotate_clk,explosion_clk, explosion_rotate_clk, +seconds_clk, timer_base_clk, +rocket_missile_life_time_duration, saucer_missile_life_time_duration, +saucer_missile_hold_duration, signal_delay_duration); + +-------------------------------------------------------------------------- +-- CORE COMPUTER SPACE LOGIC -- +-------------------------------------------------------------------------- +computer_space : COMPUTER_SPACE_LOGIC +port map +(reset, game_clk, clock_50, explosion_clk, seconds_clk, timer_base_clk, +rocket_missile_life_time_duration, saucer_missile_life_time_duration, +saucer_missile_hold_duration, signal_delay_duration, +thrust_and_rotate_clk, explosion_rotate_clk, +signal_start, signal_start, signal_thrust, signal_fire, +signal_cw,signal_ccw, video, blank, +hsync, vsync, +audio_gate, sound_switch +); + +audio_playback : sound + port map (clock_50, audio_gate, sound_switch, wav_out); + +end computer_space_architecture; \ No newline at end of file diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/explosion.qip b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/explosion.qip new file mode 100644 index 00000000..f10ca668 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/explosion.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "ROM: 1-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "explosion.vhd"] diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/explosion.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/explosion.vhd new file mode 100644 index 00000000..759a2a44 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/explosion.vhd @@ -0,0 +1,143 @@ +-- megafunction wizard: %ROM: 1-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: explosion.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY explosion IS + PORT + ( + address : IN STD_LOGIC_VECTOR (13 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END explosion; + + +ARCHITECTURE SYN OF explosion IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => "explosion_8_11.hex", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 16384, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => "CLOCK0", + widthad_a => 14, + width_a => 8, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + q_a => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +-- Retrieval info: PRIVATE: AclrByte NUMERIC "0" +-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clken NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "explosion_8_11.hex" +-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "16384" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: RegAddr NUMERIC "1" +-- Retrieval info: PRIVATE: RegOutput NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: SingleClock NUMERIC "1" +-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +-- Retrieval info: PRIVATE: WidthAddr NUMERIC "14" +-- Retrieval info: PRIVATE: WidthData NUMERIC "8" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: INIT_FILE STRING "explosion_8_11.hex" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "16384" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "14" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: address 0 0 14 0 INPUT NODEFVAL "address[13..0]" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +-- Retrieval info: CONNECT: @address_a 0 0 14 0 address 0 0 14 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL explosion.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL explosion.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL explosion.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL explosion.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL explosion_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/explosion_8_11.hex b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/explosion_8_11.hex new file mode 100644 index 00000000..0057a0a1 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/explosion_8_11.hex @@ -0,0 +1,276 @@ +:200000000305040705030404020302FF01F6E8EBEEF1FE040607080C0E1315152022190F36 +:200020000702FDFDF8F1EAE0E1E6E5E8EAE9EDF0F3F9FAFBFF01040808090A0A0B0C0C0C85 +:200040000C0D0F0E0C0B0909090604010000FEFCFAFAFAF9F4EDE8F3FAEDF0F6EEF70303D8 +:20006000070A0B0F1112110F0E100E0C0C07030301FEFEFCFAF8F7F7F6F6F6F6F5F6F6F53A +:20008000F7F9F8F9FBFDFFFF00020204060607080708090707070606050302000001000022 +:2000A000FDFBFDFCFDFEFBFBFCFAFCFEFCFCFEFDFE00FE000000030202050403050403055B +:2000C000040403010100FE000103070C07030A070406FFFCFAFAFAF5F1EAE3E9EEF0F2F292 +:2000E000F4F8FAFF010004080909090C040409030404050E15171613131412100D090604FA +:2001000001FDF9F6F4F1F1F0EFF0EFEFF2F3F4F7F7F7F9FAFBFDFFFF010407050C130B0F7E +:2001200012090E05F903F9EEF6F2F4FBFAFAFCFD0003030507090B0C1012151F1404040145 +:200140000001FCF6F2EFEDE5E3E8EBEDF0F1F3F7FCFDFF020406090B0B0B0C0C0D0E0D0D10 +:200160000D0B0B0A070604040201F4E1E0E5FA080200FE02090B0907060B0E0C0A05030239 +:2001800001FEFDFCFAFAFAFDFDF9F9F4F3F9F9F9F8F8F9FBFDFEFE000001030204050506C4 +:2001A000070607070606060504040202020101FFFFFEFCFDFDFCFDFCFBFCFBFCFDFDFF052A +:2001C000080E0F080B080001FEFCFAF9F7F4EFE8EBF0F1F4F6F7FCFE0103030508090B0C54 +:2001E0000C0D0C0C0D0C0B09FDF7FDF7F6FDFA020A080A09070909080906040300FCFCFA7C +:20020000F9FAF8F7F8F7F6F7F7F8F9FAFBFCFCFEFFFF000202030303050404050303050421 +:200220000403020203030302FF00FFFEFFFEFDFEFDFDFEFEFEFEFEFEFE0101040C0F141083 +:20024000010100FF01FCF8F6F2E0DAE1DFE9EDEBF3F9030B0B0D10161C1F1E1B1A1917157A +:20026000110D0B070401FDFBF9F7F5F4F4F4FAFEFD04FEF3F5F5F5F4F2F0ECE6E5E8ECEF77 +:20028000EEF70300090E04070A0C101111111111100F0E0E0C0B0B09050402FFFCF7F9FB82 +:2002A000F4FAF8EAF2F6EBEFEDEBF901050706080C0D0F11151B1B1E1D110A0500FDF9F6F5 +:2002C000F1ECE4DEE1E5E7E9EAEEF2F5F8FAFBFE02050809080200FDF7FD08111A1A191BAB +:2002E0001C1D1C1914110F0C0600FBF6F4F7FF0904F1EDF0F1F4F2ECE9E9E5E0E5E7E9E2A3 +:20030000D8DBDDE6FB060B10161E25292A292A2B2B29251E18110B04FEFAF5F0EDEBEBECC6 +:20032000F0EEE8F0EFE7F3F6F401FDF600F4EBE9E4F0E8E8F6F2FC07090F10161C1E202051 +:200340001E1E211E17170E0407FEF5F7F3F4F4F2F1F0F4F4F4FBF7FC04FB0202EAEDF6EDBC +:20036000F4F5E9FA02FA0700F6060307140D0A1009080C06070A0607080506060307040104 +:2003800005010003FDFCFFFC020B030204FAFCFBECE6E4E0E7EAE8EBF1FAFD070F0D181DDF +:2003A000161C1A11100B01FDFBFCFDFAF8F9F9FAFBFAFAFBFEFFFF00FFFF0201000301000A +:2003C0000201F9F900F6F5F8F1FF0C0F13172325221E11080706FFF3E3E2DCD3DFDED6E683 +:2003E000F2F5FBFEFF030A0E111213141516120D0D0C0C0B080705030300FDFEFCFBFCF83F +:20040000F8F8F9FCF5F4F4ECF2F6EDEDEFF0F8FCFDFF01030709080A0B0B0E110E0E100B0B +:200420000F15060306FC0003F8F9F9F5FCFAF3F6F6F6FDFCF902FEFD07FAF3FBF9FD01FE0D +:20044000020302070602060503080400040402020406040A0E0C151000FFFDFCFBF6F0E64A +:20046000E5EEF0EFEFEEF0F4FAFBFCFF0204080B0C0C0E0E0D0E0C0D0B090A08070601F074 +:20048000E2ECF4FF0A050304070A08060606090E0F130E07080602FFF9F5F2EFEDEBE7E788 +:2004A000E8E8ECF0F0F3F4F9FBF9030702090801060306180F0B1C19181E120D0FFEFCFFDB +:2004C000F1FC03FCFFFBF8FBFBFAFAF9F9FBFAFBFBFBFCFCFE060A16180700020001FFFA45 +:2004E000F7F6F6F2E9E9EEF1F4F6F7F8FBFFFFFF0305070B0B0A0B0C0D0E0D0B0A090A0906 +:200500000706050404030301FEFFFEFBFBF9F4D7C1E2FD0002FEFB020E140E0A0B0F1414EC +:20052000100A090A0603030200FDFDFBF9FAF9F7F7F7F7F8F7F6F7F9F9FBFBFBFCFCFCFF11 +:2005400000000101030505060708090908070504050307141B1205FEFE0102FDF7F3F2F22E +:20056000EEE3E1E7EBF0F2F2F6FBFE00020305090A0B0C0C0C05F5F7FDFF0F181415151581 +:200580001715110F0B090A0502FEF8F5F4F2F2F1EEEFEFEFF0F1F3F4F5F7FAFBFCFEFEFFDB +:2005A00002020304050809080A0A0A0B0B0A09080706060301FEFCFBFAFBFBFAFAFAF9F9E7 +:2005C000F9FAFCFCFBFBFDFDFF0102020202030404030201030C1318130602040302FFFBCF +:2005E000F8F6F4EBE2E6E4D7D9DFE1EDFE07050E181620201723211C2A1B0A1209090FF8AE +:20060000FA03EFF7FEE4EBF7EBF7F8EFFEF4E7E1DAEAF5F8FCFBFE03080A090C10151E1E7F +:200620001A1D17161C0E0508FDFD02F8F1EFEBE7E4E8ECEDEFF2F2F3F7F8FAFBFDFF010528 +:200640000604070A0A0A0C0B0C0F0D0C0BFEF3FDFBF4030B080908080807090805060503D6 +:200660000301FDFCFBFAF8FA040A0704FFFBFAF6F1DAC6DBF1F7F8F4F3F9020A121F261FE5 +:2006800017151211100A02EADFE6DEE4F6F6F8FD00050B0B0D0E10131311100C08070A0DDE +:2006A0000C120F02FCFBFAFAF7F1E8D4DBEDD6D2DED7E6F7FD0101070D11181C1C1E201FA9 +:2006C0001C1C1A1514100B070300040A0B09FDF3F3F2F3F0EBEBE9E8E5DCDEE7EAEDF0F2BA +:2006E000F7FBFE000105080C0F0F1113141413141311110F0C0B090706030100FEFBF9F800 +:20070000F7F7F1EBECDCDBEBEFFC020105070D10101112121414100D0B08060301FFFBFACF +:20072000F9F6F5F4F3F4F3F2F4F4F5F8F8FAFCFDFDFF010203040303040507070708070616 +:2007400007070706040302010100FFFEFDFAF4F3FBFCFBFCFAFBFE091A1F1104020406064E +:20076000FFF8F4F5F2E9E6E9EDF0F2F4F7FA0003010405060A0B0B0C0B0C0C0B0B0B0B0AA3 +:200780000A09080704030200FFFCFAFBF9F8F7F8F9F8F8F8F8FAFBFDFDFCFDFEFDFEFCEFB9 +:2007A000DBDEFB0D0E0F0B0C141A191612141717150D060401FCFBFAF6F4F2F1EFEFF0F0EA +:2007C000F1F2F2F4F5F6F7F8FAFBFDFF000102040709090A0B0B0C0B0A0B0A0907050301F6 +:2007E0000101FFFDFCFDFCFAFBFBFCFCFE060C110F02FDFDFDFFFCF8F5F4F2E9E6ECEDF08F +:20080000F5F6FAFF0102030406090B0C0C0D0D0E0E0C0B0A090907070604030200FF00FE35 +:20082000FDFCFAFAF9FAFBFAF9F9F9FAFBFBFCFCFDFDFEFDFF00FDF7E7E5EEF80A0E0B0E45 +:200840001013171814121314130F0A0501FEFCF9F6F4F3F2F1F1F0F1F3F4F6F7F8F8F9FA8B +:20086000FBFDFF00010202030404060607070708080707050505030202010000FFFFFEFE21 +:20088000FDFCFBFCFBFAFAFAFBFCFD06141C15050102030500FBF7F5F4EBE6EBEDF0F3F3D6 +:2008A000F6FAFE0000020407090B0B0A0C0C0B0B0C0C0C0C0A09080504020100FFFEFEFD97 +:2008C000FBFBFAF9FAFAF8F8F8F9FBFCFBFCFCFDFEFFFF0100FFFFFCF5E9E4EFFC0A0E0CAB +:2008E0000D0F15181615121314110D080300FDFAF8F7F5F4F4F2F2F3F2F4F5F5F6F7F8F9DA +:20090000FAFBFCFEFF0103030404050505060606070707070606040303010000FEFEFEFF8D +:20092000FFFDFDFDFDFDFDFC010E171406FE00010201FBF8F8F8F3E8E4EAEEF1F4F4F6FB48 +:20094000FEFF020406090A0C0C0B0D0D0C0C0B0A0B0A0A0908070504040200FFFDFBFAF9E1 +:20096000F9F8F8F7F7F7F8F9FAFAFBF9E8DCDEED080D0A0A091017191512111417140F0A3F +:20098000060300FEFDFBF9F7F5F4F2F2F4F3F3F3F4F5F5F6F7F9FAFCFE0001020304050601 +:2009A0000708090A0A0A0A0A09070503020101FFFDFDFCFBFAFAFB000B151203FBFDFE01C6 +:2009C000FFFAF6F5F6F4EBE5EAEEF2F5F6F9FD0102030506090B0D0D0D0D0D0C0B0B0B0A31 +:2009E0000A0806050303020100FEFDFCFBFAF9F8F8F8F8F8F8F8F9FBF4E9E7DEED090A0B83 +:200A00000B0A101416151212151613100B060400FCFBF8F7F6F3F3F2F3F4F4F5F5F4F5F792 +:200A2000F8F9F9F9FBFCFF000101020506080A0A0A09090809090807050403020100FFFE61 +:200A4000FDFCFBFBFCFCFF0B151102FCFDFEFFFCF8F5F4F5F2E7E5EAEDF2F5F6F9FC00034B +:200A60000406080A0C0E0E0E0F10100F0E0D0D0C090806030200FFFDFBFAF9F7F7F6F6F7DB +:200A8000F7F7F6F2DECDE0FB06080505091219171211151819150E0A090501FFFDFAF7F60F +:200AA000F5F3F3F3F2F3F3F5F7F7F6F7F8F9FBFCFCFEFEFF020303040507080909090A0A92 +:200AC0000A0907060504030100FFFEFDFCFCFCFBFBFAFAF9FAFBFBFE0814180C00000001E9 +:200AE00001FCF8F7F7F5EBE8EEF1F3F6F6F8FB0000010305080A0B0B0C0D0C0B0B0B0C0B0C +:200B00000A09070605030200FEF9ECE7DFE1F90201010002080C0C0A090D0F0F0D090504A5 +:200B20000300FFFDFBFAF9F9F8F7F8F8F8F9F8F8F9F9FAFBFCFBFDFF000000000102040628 +:200B4000060606060607070604030202020201010106121A1102FEFDFEFEFAF5F3F2F3EE60 +:200B6000E3E3E9EDF2F3F3F6F9FD00010306090C0E0F0F0F0E0E0B0D11080A0DFE0203F55F +:200B8000FF05F9FEFEFD06030203000205010001FFFFFFFCFCFCFBFEFFFFFF00000001015F +:200BA00002010101010102020203020203020303070B080E140A0300FCFCFCFAF7F4F2F012 +:200BC000E9E7ECEFF1F4F4F6FB000102030407090B0C0C0D0D0D0C0C0B0A090807060605E6 +:200BE000030201FFFEFCFCFCFAF9F9F8F8F9F5EBE4DCE3FD03030303090F13131110131615 +:200C000015130F0B0A070300FEFBF9F8F7F5F5F5F5F4F4F4F5F5F5F5F6F8F9FBFCFCFEFF42 +:200C200000040606070809080909090A0907060403030101FFFFFFFEFDFDFDFCFBF6F4FB6F +:200C4000FCFDFEFDFEFE010D1918090102030503FDF9F8F9F8EEE8EBEEF2F5F5F7FAFDFFF7 +:200C600001020305080B0A0A0B0C0B0A090909090808060503020200FEFEFDFCFCFBFAFAF0 +:200C8000F9F9F8F8F9FBFCFCF5E0DDECF9070A08090C1215141111131515100C08050200FC +:200CA000FDFBF9F9F8F5F4F3F2F3F4F5F6F6F6F7F8F9F9FBFCFE00000102040506070809C6 +:200CC00009080808080705030202020200FFFEFEFDFCFCFCFCFCFCFCFBFCFCFDFDFDFEFF11 +:200CE00006141A10040203040400FCFAFAFAF2E9EBEEF0F4F4F5F8FCFFFF00010407090A23 +:200D00000A0A0B0B0B0B0B0B0A0A080806050404020100FEFDFDFDFBFAF9F9F8F8F8FAFA8B +:200D2000FAF5E7E1DFEE04060606070D12141210121515130F0B08060400FEFCFAF9F7F668 +:200D4000F4F3F4F4F5F4F5F6F6F7F8F9FAFBFDFEFF000203040506060707070809090807CB +:200D600006040302020100FFFEFEFDFCFCFCFCFCFCFF08131408FFFFFF01FFFAF7F6F6F180 +:200D8000E9E9EFF1F5F7F8FBFF0102020406080A0B0B0B0B0A0A090A0A0A0807060504031A +:200DA0000200FFFFFEFDFBFAFAFAFAFAFAF9FAFAFCFBFBF2DEDFF1FF090806080C12141181 +:200DC0000F101215140F0A070401FFFDFBF9F7F7F6F6F6F5F5F5F6F7F7F6F6F8FAFBFCFC40 +:200DE000FDFFFF010304050607080807070708080806040303020100FFFFFEFDFCFCFDFDA3 +:200E0000FCFD050F1208FEFCFE0000FBF7F5F5F3EBE9EDEFF3F6F8FBFF0203030406090C32 +:200E20000C0C0C0C0C0C0B0A0A0A09070605030100FFFFFDFCFBFAF9F8F8F8F9F9F9F9FA77 +:200E4000F8EDEDEAE4F807070A0A0C1013141210111212100C070403FEFCFBF9F8F7F6F54C +:200E6000F3F5F6F6F6F6F6F7F8F8F9FAFBFDFF000101010305060707080708080808070690 +:200E8000050403020200FFFEFEFDFDFDFDFDFDFCFCFBFBFBFBFCFCFCFCFEFF04080A0F0D56 +:200EA0000C0B04030200FFFDFCF9F7F1ECEEF2F3F5F6F8FAFDFFFF000205070909090A0A65 +:200EC0000B0A0A0A080706060504030202010000FFFEFDFCFCFBFBFAFAFAFAFBFBFBFCFC04 +:200EE000FDFAF1EDE5E8FF090809070A101314110F1213120F0C070401FDFCFBFAF8F6F5A0 +:200F0000F4F3F4F4F5F6F6F7F8F8F8F9FBFCFEFF0001010305050505060607080707070606 +:200F200005040202010100FFFEFEFEFEFDFDFDFDFDFCFBFBFDFDFDFEFF0710160F03010292 +:200F40000202FFFBFAFAFAF5EDEBF0F2F5F6F7F9FCFF0001020406080909090A0B0A0A0BBC +:200F60000A0A090807060403020100FEFEFDFCFCFBFBFAF8EFE8E4E2F2FF01030205090DAD +:200F80000E0E0D0E10100F0C090706030100FEFDFBFAF9F8F7F7F7F8F8F7F7F7F7F9FAFB45 +:200FA000FCFDFDFF000002020304050606070707070706050404030302010100FFFEFDFDE9 +:200FC000FDFCFCFBFBFAFBFBFBFCFDFDFEFEFF01010508060D150F080403020301FDFAF800 +:200FE000F7F0ECEFF1F2F5F5F6F9FCFEFE0001040709090909090A090A05FF000000000021 +:201000000000000000000000000000000000000000FFFDFEFFFFFCF9F7F6F7F3EBEBEFF255 +:20102000F6F7F9FBFE0103040507080A0B0B0B0C0D0D0C0B0A0A09070604020100FFFDFC24 +:20104000FBFAF9F8F8F8F9F9F9F8F3E0D9EDFF06060404091014110E0E1113130F0A080673 +:201060000300FFFDFBF9F8F7F6F6F6F5F6F6F8F9F9F9F9FAFBFCFDFDFEFE000202030304FA +:2010800006070707070808080605050403020100FFFEFEFDFDFDFCFCFBFBFBFBFCFC000925 +:2010A0001111060000000100FCFAF9F9F6EEEEF3F4F7F8F9FAFD0000010304060808080958 +:2010C0000A09090809090908060505030201FFFFF8EFECE6EDFE0101000003070A090708E3 +:2010E0000A0C0B090603030200FFFDFCFBFBFBFAF9FAFAFAFBFAFAFBFBFCFDFDFDFE000018 +:201100000000000102040404050504050505040302020102020000010610130A00FEFEFE65 +:20112000FEFAF7F6F6F6F1EAECF0F3F6F6F7F9FCFF0001030505050505050504040301002A +:201140000000FFFFFFFEFDFDFDFDFEFFFEFEFEFDFEFEFEFFFFFF00000001010101000101AF +:201160000101010102020102020202040806080E090300FEFDFDFCFAF8F6F5F1EDF1F4F5A1 +:20118000F7F7F8FBFF010102030406080909090A0909080807070605040404020101FFFEE9 +:2011A000FEFDFDFCFBFBFBFAFBFAF2EDE7E8FA03020302050A0D0E0C0B0D0F100E0B090713 +:2011C000060300FFFDFCFAF9F9F8F8F8F7F7F7F8F8F8F8F9FAFBFCFDFDFEFF000204050584 +:2011E00006060606070707060604030302010100FFFFFFFEFEFEFEFDFAF7FBFDFDFFFEFED5 +:20120000FF00071012090201020303FFFBFAFBFBF5EFF0F3F5F8F8F9FBFEFF000102030500 +:2012200007080708080808070607060606050403020201FFFFFEFDFDFCFCFCFBFBFBFAFB71 +:20124000FCFDFDFBEDE6EFF803070606070C0F0E0C0C0D0F0F0D0907040200FEFDFCFBFA4B +:20126000F9F8F7F6F7F7F8F9F9F9F9FAFBFBFCFDFE000000020203040506060606060606A5 +:20128000050403020102010000FFFFFEFDFDFDFDFDFDFDFDFDFDFEFEFEFFFF020B130E0434 +:2012A0000102020301FEFCFBFCF8F1F0F3F4F7F8F8FAFCFFFF000002040607070708080860 +:2012C0000808080707060605040303020100FFFEFEFEFDFCFBFBFBFBFAFBFCFCFAF0EBE842 +:2012E000EF0005040505080C0E0D0C0C0E0F0E0B0806050301FFFDFCFBFAF9F8F7F7F8F89C +:20130000F8F8F8F9F9FAFBFCFCFDFEFF0001020304040405050506060606050403020202C1 +:20132000010000FFFEFEFEFDFDFDFDFDFE040C0F0800FFFF0000FDFAF9F9F7F1EFF3F5F700 +:20134000F9FAFCFE0001020204050708080808070707070707060504040302010000FFFF2A +:20136000FEFDFCFCFCFCFCFCFBFBFCFDFDFDF9EBE7F2FD05060505070C0E0D0B0B0C0E0E66 +:201380000B0705030100FEFDFCFAF9F9F9F9F8F8F8F9FAFAF9F9FAFCFCFDFDFEFFFF0002AC +:2013A00003030404050605050505060605030202010100FFFFFFFEFDFDFEFEFDFD02090DE3 +:2013C0000800FDFEFF00FEFBF9F8F8F3EFF2F4F6F9FAFCFF01020203040608090808090938 +:2013E00008080707070605040402010000FFFEFEFDFCFCFBFBFBFBFBFBFBFBFBF5F2F3EC29 +:20140000F604050607080A0D0E0D0B0B0D0C0B0906030200FDFDFCFBFAF9F9F7F8F9F9F981 +:20142000F9F9FAFAFAFBFBFDFEFF0000010101030405050505050505060504040302020194 +:201440000100FFFFFEFEFEFEFEFEFDFDFDFDFDFDFDFDFEFDFEFF0205060909080804020282 +:201460000000FEFDFCFAF7F2F3F6F7F8F9FAFCFDFFFF000103040606060607070707070687 +:201480000504040303020201010000FFFFFEFEFDFDFDFCFCFCFCFDFDFDFDFDFEFDF7F3EF8D +:2014A000EEFC06050605060A0D0E0C0A0C0D0D0B09050301FFFDFDFCFBFAF9F8F7F8F8F8EE +:2014C000F9F9FAFAFAFAFBFCFDFEFF000101020304040404040505050505040403020101FE +:2014E0000000FFFFFFFFFFFEFEFEFEFEFEFDFDFEFEFEFEFF03090E0C040001010200FDFCE5 +:20150000FCFCFAF4F2F4F6F8F9F9FBFDFF00000103040506060607070707070707060605C7 +:20152000040302020100FFFFFEFEFDFDFCFCFBF6F1EEEBF3FE010201020508090909090AC6 +:201540000B0A09070504030100FFFEFDFCFCFBFAFAFAFBFBFAFAFAFAFBFCFCFDFEFEFF00B5 +:20156000000102020303040405050505050404030202020201000000FFFEFEFEFEFDFDFC3E +:20158000FCFCFDFDFDFEFEFFFFFF0100020504070D0C060302020201FFFCFBFAF9FF00003F +:2015A00000000000000000000000000000000000000000000000000000000000000000002B +:2015C000FEFEFF00FEFBFAF9FAF8F3F2F4F6F9FAFBFCFE0001020304050607070708090838 +:2015E000080707070605040302010000FFFEFDFCFBFBFBFBFBFBFBFBF9EEE5EFFD03040329 +:2016000002050A0D0C0A090B0D0D0B070505020000FFFDFBFBFAF9F9F9F9F9F9FAFBFBFB9D +:20162000FCFCFCFDFEFEFFFFFF01010202030404050505050505040403030202010000FF7F +:20164000FFFEFEFEFEFDFDFDFDFDFDFDFF040A0C060000000100FEFCFBFCFAF5F4F7F8FACB +:20166000FBFBFCFE00000001030405050506060606060606060504040303010100FFFDF62C +:20168000F4F0F1FD01000000010406060505060807060502020200FFFEFDFDFDFDFCFCFC51 +:2016A000FCFCFCFCFCFCFDFDFEFEFEFE00000000000101020303030303030303030201012D +:2016C0000101010100010100000101010000FEFBF9F5F7FE030504040608090908070808D6 +:2016E000080604020000FFFDFCFCFAFAFAFAFAFAFAFBFBFCFDFDFEFEFEFFFF000001010224 +:201700000202030302030303030303030302010000000000FFFFFFFEFEFEFEFFFFFFFFFFB2 +:20172000FEFFFFFFFFFF000000000000010100010001010101010101010101010305040690 +:2017400009050100FEFEFEFDFCFBFAF9F6F5F7F9F9FBFBFBFE0001010102030405050506B5 +:20176000060605050504040403030302010100FFFFFEFEFEFDFDFDFDFCFDFBF6F4F0F3FF89 +:2017800002010101040708090707080A0908070504030100FFFEFDFCFCFBFBFBFBFBFBFB14 +:2017A000FBFBFBFBFCFCFDFEFEFEFF0000020203030404040404040404030302010101001A +:2017C00000FFFFFFFFFFFFFEFEFCFBFEFEFFFFFFFFFF00060B0A040101010201FFFDFCFD0B +:2017E000FCF8F6F7F8FAFBFBFCFEFF000001010204050404050505040404040404030302E3 +:2018000001010100FFFFFFFEFEFEFDFDFDFDFDFDFDFEFEFEFBF2F1F7FD03040304050809F3 +:20182000080707080909070504020100FFFEFDFDFCFBFBFBFAFBFBFBFCFCFCFCFCFDFDFEB2 +:20184000FEFF000000010202030303040403030303030201010101010000FFFFFFFEFEFE68 +:20186000FEFEFEFEFEFEFEFFFFFFFF0002080B07020101020200FEFDFDFDFAF7F7F8F9FB8D +:20188000FBFBFDFEFF0000000203040404040505050404040404040303020201010000FF11 +:2018A000FFFFFFFEFEFDFDFDFDFDFDFDFEFBF6F3F2F9020202030306080808070708090826 +:2018C000060403030200FFFEFEFDFCFCFBFBFBFBFBFBFBFCFCFCFDFDFEFEFFFF000001013F +:2018E0000202020303030303040403030202010101010000FFFFFFFFFEFEFEFEFEFF0308C1 +:20190000080300FF000000FEFCFCFCFAF7F7F9FAFBFCFDFEFF0001010102030404040405E2 +:20192000040404040404030302020201010000FFFFFFFEFEFDFDFEFEFDFDFDFEFEFEFEFAA9 +:20194000F2F3FA0004030303050708070606070808060403020000FFFEFDFCFCFCFCFCFB6D +:20196000FCFCFCFCFCFCFCFDFEFEFEFFFFFF00000102020203030303030303030302020168 +:20198000010100000000FFFFFEFFFFFFFEFF02060703FFFFFF0000FEFDFCFCFBF8F7F8F972 +:2019A000FBFCFDFE0001010102020404050505050505040404040303020201010000FFFFEE +:2019C000FEFEFEFDFDFDFDFDFDFDFDFEFDF9F9F8F5FD0303040405060708070606070706FF +:2019E00005030201FFFEFEFDFDFDFCFCFBFCFCFCFCFCFCFDFDFDFDFEFEFF0000000100011E +:201A000002020303030303030303030202020101010000FFFFFFFFFFFFFFFFFFFEFEFEFEAF +:201A2000FEFEFFFFFFFF00020304050504040101010000FFFEFDFDFAF8F9FBFBFCFCFDFEC5 +:201A4000FFFF000001020303040404040404040403030202020201010100000000FFFFFF51 +:201A6000FEFEFEFEFEFEFEFEFEFEFEFEFFFEFAF9F6F700030303030406070706060607075D +:201A80000604020100FFFEFEFEFDFCFCFCFBFCFCFCFCFDFDFDFDFDFEFEFFFF000000010177 +:201AA0000202020202020203030303020201010100000000FFFFFFFFFFFFFFFFFFFFFEFE13 +:201AC000FFFFFFFF0002060805010001010100FEFEFEFEFCF9F9FAFBFCFCFDFEFF00000024 +:201AE0000102020303030304040404040403030302020201010100FFFFFFFFFFFEFEFEFDB9 +:201B0000FAF8F6F6FB000101010203040505050506060504030302010000FFFFFEFEFEFDB9 +:201B2000FDFDFDFDFDFDFDFDFDFEFEFEFFFFFFFF00000101010102020202020203020202B1 +:201B4000010101010100000000FFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFF00000002030290 +:201B600005070502FFFFFF00FFFEFDFDFDFCF9F9FAFBFCFDFDFEFF00010102020303040477 +:201B800004040404040404030302020201000000FFFFFEFEFEFEFDFDFEFEFEFDFCF7F3F857 +:201BA000FF0202010102050706050505060605040302010000FFFEFEFDFDFDFDFDFDFDFDFF +:201BC000FDFEFEFEFEFEFEFFFFFFFFFF0000010101010202020202030303020202010101F9 +:201BE00000000000FFFFFFFFFFFFFFFEFEFEFFFFFF020506030000000000FFFEFEFEFDFBF4 +:201C0000FAFCFCFDFDFEFEFF000000010102020303030303030303030303020202010100AE +:201C20000000FEFBFAF8F9FE0100000001020303020203040403020101010000FFFFFFFEA6 +:201C4000FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF0000000000000101010101010101020293 +:201C60000101010100000000010102030303020100FFFFFFFFFFFFFFFFFFFFFFFFFFFF005E +:201C800000000000000000000000FEFCFAFCFF01020202030304040303030303030201002B +:201CA00000FFFFFEFEFEFDFEFDFDFEFEFEFEFEFFFFFFFFFF00000000000001010101010140 +:201CC0000101010101010101010100000000000000FFFFFFFFFF00000000FFFFFF00000002 +:201CE00000000000000000000000000000000000010000010001010102020304020000FFD3 +:201D0000FFFFFFFEFEFDFDFCFBFCFDFDFEFEFEFF00000000010102020202020202020202D4 +:201D2000020201010101010000000000FFFFFFFFFFFFFFFFFFFEFCFBFAFBFF0101010001B6 +:201D400003030303030304040303020201000000FFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFE7B +:201D6000FFFFFFFFFF00000001010101010101020202020101010101000000000000000054 +:201D80000000FFFFFEFEFFFFFF000000000002040402000001010000FFFFFFFFFDFCFDFD4F +:201DA000FEFEFEFFFF00000000010101020202020202020101010101010101010000000011 +:201DC0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFEFBFBFDFF01020101020303030303030304 +:201DE0000302020101000000FFFFFFFFFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFF00000000F7 +:201E0000000101010101010101010101010101000000000000000000FFFFFFFFFFFFFFFFBC +:201E2000FFFF000000000001030402010000010100FFFFFFFFFEFDFDFDFEFEFEFEFFFF00B0 +:201E4000000000000101010101010202010101010101010101010000000000000000FFFF70 +:201E6000FFFFFFFFFFFFFFFFFFFDFCFCFE0101010101020203020202030302020101010059 +:201E80000000FFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFF000000000000010101010153 +:201EA00001010101010101010100000000000000000000FF0000FFFF000102020100000016 +:201EC0000000FFFFFFFFFEFDFDFEFEFFFFFFFF00000000000101010101010101010101010A +:201EE00001010101010000000000000000FFFFFFFFFFFFFFFFFFFF00FFFFFEFCFCFE0001F4 +:201F000001010101020202020202020202010100000000FFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:201F2000FFFFFFFFFF0000000000000000010101010101010101010101000000000000009A +:201F400000000000000000000001010201000000000000FFFFFFFFFEFEFEFEFFFFFF00008B +:201F60000000000001010101010101010101010101010101000000000000000000FFFFFF54 +:201F8000FFFFFFFFFFFFFFFFFEFEFEFEFF010101010101020202010102010101010000003E +:201FA0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000101012F +:201FC0000101010101010000000000000000000000000000000000000000000000000000FB +:201FE0000000000101010101010000000000000000FFFFFFFFFFFFFFFFFF000000000000E4 +:202000000000010101010101010101010000000000000000000000000000000000000000B6 +:20202000000000000000000000FFFFFEFF0001000000010101010101010101010100000099 +:202040000000000000FFFFFFFFFFFFFFFFFF00000000000000000000000000000000000089 +:20206000000000000000000000000000000000000000000000000000000000000000000060 +:20208000000101010000000000000000000000FFFFFFFF0000000000000000000000000041 +:2020A000000000000000000000000000000000000000000000000000000000FFFFFFFF0024 +:2020C000000000000000000000000000000000000000000000000000000000000000000000 +:2020E0000000000000000000000000000000000000000000000000000000000000000000E0 +:202100000000000000000000000000000000000000000000000000000000000000000000BF +:2021200000000000000000000000000000000000000000000000000000000000000000009F +:2021400000000000000000000000000000000000000000000000000000000000000000007F +:2021600000000000000000000000000000000000000000000000000000000000000000005F +:2021800000000000000000000000000000000000000000000000000000000000000000003F +:2021A00000000000000000000000000000000000000000000000000000000000000000001F +:2021C0000000000000000000000000000000000000000000000000000000000000000000FF +:2021E0000000000000000000000000000000000000000000000000000000000000000000DF +:202200000000000000000000000000000000000000000000000000000000000000000000BE +:2022200000000000000000000000000000000000000000000000000000000000000000009E +:0E224000000000000000000000000000000090 +:00000001FF diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/hq2x.sv b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..3e406318 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_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'bxx; + 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/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/keyboard.v b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/memory_board.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/memory_board.vhd new file mode 100644 index 00000000..fc10e204 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/memory_board.vhd @@ -0,0 +1,1839 @@ +----------------------------------------------------------------------------- +-- MEMORY BOARD LOGIC -- +-- For use with Computer Space FPGA emulator. -- +-- Implementation of Computer Space's Memory Board -- +-- "wire by wire" and "component by component"/"gate by gate" -- +-- according to original schematics. -- +-- With exceptions regarding: -- +-- > analogue based timers (impl as counters) -- +-- > all flip flops / ICs using asynch clock inputs are replaced with -- +-- flip flops driven by a high freq clock and logic to -- +-- identify edge changes on the logical clock input -- +-- > the "diode matrix" is implemented as a vector rather than a diode -- +-- equivalent; but the resulting functionality becomes the same -- +-- > sound pulse trains used by the analogue sound unit are replaced by -- +-- on/off flags to trigger sound sample playback -- +-- -- +-- This entity is implementation agnostic -- +-- -- +-- There are plenty of comments throughout the code to make it easier to -- +-- understand the logic, but due to the sheer number of comments there -- +-- may exist occasional mishaps. -- +-- -- +-- Please take a moment to marvel at the logic behind rotating the four -- +-- core rocket images into 32 different positions. Very clever, keeping in -- +-- mind this was done back in 1971 (without RAM, ROM and CPU) -- +-- and that this was the first commercial video arcade game ever. -- +-- Pretty cool and ambitious graphics stuff to go for as a first, -- +-- compared to the simplicity of the subsequent Pong graphics. -- +-- Even in "modern" day it is not all together easy to figure out how to -- +-- create 32 rotational position images based on four (16x16 pixel) base -- +-- images. Hats off! -- +-- -- +-- Naming convention: -- +-- Signals are labelled after the component that generates the signal; -- +-- more specifically the component's schematics label and the specific -- +-- output. For instance: NOR gate F6 and its output pin 10 generate a -- +-- signal which will be labelled f6_10. -- +-- Occasionally signals are labelled after a component input - this is -- +-- most common for components where the input is exposed -- +-- to "component-internal processing" beyond simple gate functionality, -- +-- such as bistable latches, counters, flip-flops and multiplexers. -- +-- Memory Board inputs/outputs are labelled MemBrd_, where is -- +-- according to original schematics input/output labels. -- +-- -- +-- v1.0 -- +-- by Mattias G, 2015 -- +-- Enjoy! -- +----------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +library work; + +--80--------------------------------------------------------------------------| + +entity memory_board is + port( + super_clk, -- Clock to emulate + -- asynch flip flop logic + + thrust_and_rotate_clk, + explosion_rotate_clk : in std_logic := '1'; + + MemBrd_2, -- saucer 16x8 image's + -- vertical position bit 1 + MemBrd_3, -- saucer 16x8 image's + -- horizontal position bit 1 + MemBrd_4, -- rocket 16x16 image's + -- horizontal position bit 1 + MemBrd_5, -- rocket 16x16 image's + -- vertical position bit 1 + MemBrd_6, -- saucer 16x8 image's + -- vertical position bit 3 + MemBrd_7, -- saucer 16x8 image's + -- horizontal position bit 3 + MemBrd_8, -- rocket 16x16 image's + -- vertical position bit 3 + MemBrd_9, -- rocket 16x16 image's + -- horizontal position bit 3 + + MemBrd_10, -- Rocket Enable + -- the tv beam is in position + -- to display rocket + -- on screen and the + -- rocket image can actually be + -- displayed (for instance + -- rocket should not be visible + -- on screen directly after + -- being hit by saucer missile, + -- having collided with saucer + -- or game is not playing) + + MemBrd_11, -- 30Hz pulse train + -- to give rocket missile + -- vertical and/or + -- horizontal "speed" with + -- which it can move in + -- "angels" other than + -- up/down, righ/left and + -- 45/135/225/315 degrees + -- Resulting angels are: + -- 22,5/67,5/112.5/157,5/ + -- 212.5/257.5/302.5/342.5 + -- degrees + + MemBrd_A, -- saucer 16x8 image's + -- vertical position bit 0 + MemBrd_B, -- saucer 16x8 image's + -- horizontal position bit 0 + MemBrd_C, -- rocket 16x16 image's + -- vertical position bit 0 + MemBrd_D, -- rocket 16x16 image's + -- horizontal position bit 0 + MemBrd_E, -- saucer 16x8 image's + -- vertical position bit 2 + MemBrd_F, -- saucer 16x8 image's + -- horizontal position bit 2 + MemBrd_H, -- rocket 16x16 image's + -- vertical position bit 2 + MemBrd_J, -- rocket 16x16 image's + -- horizontal position bit 2 + + MemBrd_K, -- Saucer Enable + -- the tv beam is in position + -- to display one of the + -- saucers on screen + -- and the saucer + -- image will actually be + -- displayed (for instance a + -- saucer should not be visible + -- on screen directly after + -- being hit by rocket missile, + -- or having collided + -- with rocket) + + MemBrd_M, -- signal to rotate + -- rocket clock wise (cw) + + MemBrd_N, -- signal to rotate + -- rocket counter + -- clock wise (ccw) + + MemBrd_R, -- signal to spin rocket + -- clock wise during + -- explosion + + MemBrd_S -- Thrust button pressed + : in std_logic; + + MemBrd_12, -- rocket pointing upwards + -- or downwards + -- 0 - up / 1 - down + + MemBrd_13, -- rocket horizontal + -- velocity level bit 1 + MemBrd_14, -- rocket horizontal + -- velocity level bit 0 + MemBrd_15, -- rocket horizontal + -- velocity level bit 2 + MemBrd_16, -- rocket horizontal + -- velocity: rocket going + -- right or left + -- 0 - left / 1 - right + + MemBrd_17, -- rocket pointing towards + -- right or left + -- 0 - left / 1 - right + + MemBrd_K1, -- signal for rocket rotation + -- audio + + MemBrd_K2, -- signal for rocket thrust + -- audio + + MemBrd_P, -- video out (rocket and + -- saucer) + + MemBrd_T, -- Rocket Missile + -- Up/Down Enable + -- 0 - up/down allowed + -- 1 - up/down not allowed + -- Is either constantly + -- 1 or 0 or + -- switches between 1 and 0 + -- with a 30 Hz frequency + -- to allow for rocket + -- missile direction of: + -- 67,5/112.5/257.5/302.5 + -- degrees + MemBrd_U, -- Rocket Missile + -- Right/Left Enable + -- 0 - right/left allowed + -- 1 - right/left not allowed + -- Is either constantly + -- 1 or 0 or + -- switches between 1 and 0 + -- with a 30 Hz frequency + -- to allow for rocket + -- missile direction of + -- 22,5/157,5/212.5/342.5 + -- degrees + MemBrd_V, -- rocket vertical + -- velocity level bit 1 + MemBrd_W, -- rocket vertical + -- velocity level bit 0 + MemBrd_X, -- rocket vertical + -- velocity level bit 2 + MemBrd_Y -- rocket vertical velocity: + -- rocket going up or down + -- 0 up / 1 down + : out std_logic + ); + +end memory_board; + +architecture memory_board_architecture + of memory_board is + +component rocket_diode_images is +port( + image_select : in integer range 0 to 3; + rocket_hor, rocket_ver : in integer range 0 to 15; + diode_left_column, diode_right_column : in std_logic; + out_image_bit : out std_logic + ); +end component; + +component saucer_diode_image is +port( + saucer_enable : in std_logic; + saucer_ver : in integer range 0 to 7; + saucer_hor : in integer range 0 to 15; + saucer_diode_rotating_light : in std_logic; + out_saucer_image_bit : out std_logic + ); +end component; + +-- statemachine type for 74193 +-- with carry and borrow +TYPE STATE_TYPE IS +(UNSIGNED_UP_DOWN, READY_FOR_CARRY, +READY_FOR_BORROW, CARRY, BORROW); + +-- A5 pins, 7486 +signal a5_8,a5_11,a5_3,a5_6 : std_logic; + +-- B5 pins, 7486 +signal b5_8, b5_11, b5_3, b5_6 : std_logic; + +-- A6 pins, 74153 +signal a6_10, a6_11, a6_12, a6_13, a6_6, + a6_4, a6_3, a6_14,a6_2, a6_7, a6_9, + a6_5 : std_logic; + +-- B6 pins, 74153 +signal b6_10, b6_11, b6_12, b6_13, b6_6, + b6_4,b6_3, b6_14,b6_2, b6_7, b6_9, + b6_5 : std_logic; + +-- C6 pins, 74153 +signal c6_10, c6_11, c6_12, c6_13, c6_6, + c6_4, c6_3, c6_14,c6_2,c6_7, c6_9, + c6_5 : std_logic; + +-- D6 pins, 74153 +signal d6_10, d6_11,d6_12, d6_13, d6_6, + d6_4, d6_3, d6_14, d6_2, d6_7, + d6_9, d6_5 : std_logic; + +signal f4_4,f4_8,c5_8, c5_11, c5_3 : std_logic :='0'; +signal e1_10, e2_9, e2_7, e1_13, h2_8, + e5_3, c5_6 : std_logic:='0'; +signal diode_image0_bit, diode_image1_bit, + diode_image2_bit, diode_image3_bit : std_logic :='0'; + +signal rocket_hor, rocket_ver : integer range 0 to 15; +signal saucer_ver : integer range 0 to 7; +signal saucer_hor : integer range 0 to 15; +signal saucer_image_bit : std_logic :='0'; + +signal RVER, RHOR : std_logic_vector (3 downto 0); +signal SVER : std_logic_vector (2 downto 0); +signal count : integer range 0 to 15 := 0; +signal counter_clock : std_logic; +signal count_r : unsigned (3 downto 0) := "0000"; +signal e4_count : unsigned (3 downto 0) := "0000"; + +signal e4_12 ,e4_13 : std_logic :='1'; +-- set to initial '1' to avoid ship from +-- flipping from initial position + +signal h2_10, e4_4, e4_5, e4_2, e4_3, + e4_6, e4_7, e4_11 : std_logic; +signal e2_7x, e2_9x : std_logic; +signal e3_1 : std_logic; + +signal e2_10, e2_11, e2_2, e2_14, e2_15, + e2_1,e2_3, e2_4 , e2_5, e2_12, e2_6, + e2_13 : std_logic; + +signal f6_8, e5_6, d5_3, e6_10 : std_logic; +signal f4_10, e5_11, d5_11, d5_8, e5_8 : std_logic; +signal d5_6, e4_11_process : std_logic; +signal e3_15 : std_logic := '0'; +signal e3_14 : std_logic := '1'; + +-- thrust circuitry and velocity signals +signal f2_12,f2_10, f3_3, h2_6, f3_6 : std_logic; +signal j4_2, j4_3,j4_4, j4_5, j4_6, j4_7 : std_logic; +signal j5_6, j5_11, j5_3 : std_logic; +signal j6_6, inv_4, j6_8, j3_8, j3_6, + j2_10, j2_13 : std_logic; +signal h4_2, h4_3, h4_4, h4_5, h4_6, h4_7 : std_logic; +signal h5_6, h5_11, h5_3, h6_6, h2_2, + h6_8, h3_6, h3_8, h2_12 : std_logic; +signal f5_10, f5_13, h5_8, j5_8, + f4_6, f6_6, f4_2, f4_12, f5_4, f5_1 : std_logic; + +signal thrust : std_logic; +signal j4_count, h4_count : unsigned (3 downto 0) := "0000"; +signal j4_clock, h4_clock : std_logic; + +signal explode_rotate_clock_wise, + combined_clk : std_logic; + +-- rocket engine flame +signal diode_row_1, diode_row_3, f2_6, + f2_8, e1_1, e1_4, f3_8, f3_11, + diode_left_column, + diode_right_column : std_logic; + +-- saucer rotating light +signal saucer_diode_rotating_light : std_logic; + +-- signals to manage asynchronous +-- clock design embedded in +-- synchronous clk solutions +signal e4_4_old, e4_5_old, e3_1_old : std_logic; +signal j4_4_old, j4_5_old, h4_4_old, + h4_5_old : std_logic; + +-- signals for audio +signal e6_4, e6_1 : std_logic; + +-- signals for 74193 circuit statemachine +signal state : STATE_TYPE := UNSIGNED_UP_DOWN; + +----------------------------------------------------------------------------// +begin + +----------------------------------------------------------------------------- +-- GENERAL INFORMATION -- +-- The rocket has four base images from which in total 32 different images -- +-- are created to represent the rocket’s rotational positions. The 32 -- +-- images are created through the following 3 key-mechanisms: -- +-- 1) Vary which base image to read from; Choose between one of the -- +-- four images -- +-- 2) Vary image read direction: Reading the base image either "top to -- +-- bottom" or "bottom to top" and from "right to left" or "left to -- +-- right" -- +-- 3) Vary image x-y axis: Reading the base image’s horizontal -- +-- slices (rows) as horizontal slices (rows) onto screen or -- +-- reading the vertical slices (columns) as horizontal slices (rows) -- +-- onto screen -- +-- -- +-- The Memory Board contains logic that can determine which base image to -- +-- select, which image read direction to apply and which image axis setup -- +-- to use depending on the rocket’s rotational position. -- +-- -- +-- ALL ROCKET ORIENTATIONS AND THEIR CORRESPONDING IMAGE LOGIC: -- +-- Deg - approx degree that the rocket is pointing in -- +-- R/L - indicate if rocket is pointing to the right or to the left -- +-- Pos - the corresponding "position value" for a specific degree -- +-- (R/L-flag and Pos together corresponds to any of the unique 32 rocket -- +-- orientations / degrees) -- +-- Image - the diode matrix image (0-3) to use -- +-- Image Read Direction - How the diode matrix image is being read along -- +-- its two "axis" -- +-- X-Y axis setup - (Horizontal-2-Horizontal): The image's horizontal -- +-- slices will be fed to -- +-- the screen as horizontal -- +-- slices acc to Image Read -- +-- Direction -- +-- (Vertical-2-Horizontal) : The image's vertical -- +-- slices will be fed to -- +-- the screen as horizontal -- +-- slices acc to Image Read -- +-- Direction -- +-- -- +-- Deg R/L Pos Image Image Read Direction X-Y Axis Setup -- +-- === === === ===== ====================== ======================= -- +-- ~3 R 0 0 Top2Bottom Left2Right Horizontal-2-Horizontal -- +-- ~16 R 1 1 Top2Bottom Left2Right Horizontal-2-Horizontal -- +-- ~32 R 2 2 Top2Bottom Left2Right Horizontal-2-Horizontal -- +-- ~43 R 3 3 Top2Bottom Left2Right Horizontal-2-Horizontal -- +-- -- +-- ~47 R 4 3 Bottom2Top Right2Left Vertical-2-Horizontal -- +-- ~61 R 5 2 Bottom2Top Right2Left Vertical-2-Horizontal -- +-- ~74 R 6 1 Bottom2Top Right2Left Vertical-2-Horizontal -- +-- ~87 R 7 0 Bottom2Top Right2Left Vertical-2-Horizontal -- +-- -- +-- ~93 R 8 0 Bottom2Top Left2Right Vertical-2-Horizontal -- +-- ~105 R 9 1 Bottom2Top Left2Right Vertical-2-Horizontal -- +-- ~121 R 10 2 Bottom2Top Left2Right Vertical-2-Horizontal -- +-- ~134 R 11 3 Bottom2Top Left2Right Vertical-2-Horizontal -- +-- -- +-- ~137 R 12 3 Bottom2Top Left2Right Horizontal-2-Horizontal -- +-- ~151 R 13 2 Bottom2Top Left2Right Horizontal-2-Horizontal -- +-- ~163 R 14 1 Bottom2Top Left2Right Horizontal-2-Horizontal -- +-- ~175 R 15 0 Bottom2Top Left2Right Horizontal-2-Horizontal -- +-- -- +-- ~183 L 0 0 Bottom2Top Right2Left Horizontal-2-Horizontal -- +-- ~197 L 1 1 Bottom2Top Right2Left Horizontal-2-Horizontal -- +-- ~209 L 2 2 Bottom2Top Right2Left Horizontal-2-Horizontal -- +-- ~223 L 3 3 Bottom2Top Right2Left Horizontal-2-Horizontal -- +-- -- +-- ~229 L 4 3 Top2Bottom Left2Right Vertical-2-Horizontal -- +-- ~240 L 5 2 Top2Bottom Left2Right Vertical-2-Horizontal -- +-- ~253 L 6 1 Top2Bottom Left2Right Vertical-2-Horizontal -- +-- ~267 L 7 0 Top2Bottom Left2Right Vertical-2-Horizontal -- +-- -- +-- ~274 L 8 0 Top2Bottom Right2Left Vertical-2-Horizontal -- +-- ~287 L 9 1 Top2Bottom Right2Left Vertical-2-Horizontal -- +-- ~300 L 10 2 Top2Bottom Right2Left Vertical-2-Horizontal -- +-- ~312 L 11 3 Top2Bottom Right2Left Vertical-2-Horizontal -- +-- -- +-- ~319 L 12 3 Top2Bottom Right2Left Horizontal-2-Horizontal -- +-- ~331 L 13 2 Top2Bottom Right2Left Horizontal-2-Horizontal -- +-- ~343 L 14 1 Top2Bottom Right2Left Horizontal-2-Horizontal -- +-- ~356 L 15 0 Top2Bottom Right2Left Horizontal-2-Horizontal -- +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Saucer Video Enable -- +-- Inverting the Saucer Enable signal for downstream logic -- +-- where it is applicable to have the inverse as "active" -- +----------------------------------------------------------------------------- +f4_8 <= not MemBrd_K; -- f4_8 is (inverse) active + -- when saucer video should be + -- displayed + +----------------------------------------------------------------------------- +-- IMAGE READ: Select horizontal diode matrix slice -- +-- 7486 xor -- +-- diode matrix "horizontal slice" (row) selector -- +-- Input to 74154 for both saucer, rocket, regarding which -- +-- horizontal slice to read image pixel data from -- +-- 4-bit binary number that can address 16 slices (0-15) -- +----------------------------------------------------------------------------- +a5_8 <= a6_9 xor f4_4; -- D ; horizontal slice number bit 3 +a5_11 <= b6_9 xor f4_4; -- C ; horizontal slice number bit 2 +a5_3 <= c6_9 xor f4_4; -- B ; horizontal slice number bit 1 +a5_6 <= d6_9 xor f4_4; -- A ; horizontal slice number bit 0 + +----------------------------------------------------------------------------- +-- IMAGE READ: Select vertical diode matrix slice -- +-- 7486 xor -- +-- diode matrix "vertical slice" (colum) selector -- +-- -- +-- Input to 74151 for saucer, and 74150:s for rocket, regarding which -- +-- vertical slice to read image pixel data from -- +-- 4-bit binary number that can address 16 slices (0-15) -- +-- 74151 is only using three bits (0-2); and can consequently address 8 -- +-- slices -- +-- 74151: Only 5 inputs are connected to diode matrix slices -- +-- 74150:s Only 12 inputs are connected to diode matrix slices -- +-- The other inputs that are not connected to any slice will only give -- +-- "black" pixels when addressed -- +----------------------------------------------------------------------------- +b5_8 <= a6_7 xor c5_11; -- D ; vertical slice number bit 3 +b5_11 <= b6_7 xor c5_11; -- C ; vertical slice number bit 2 +b5_3 <= c6_7 xor c5_11; -- B ; vertical slice number bit 1 +b5_6 <= d6_7 xor c5_11; -- A ; vertical slice number bit 0 + +----------------------------------------------------------------------------- +-- IMAGE READ: Select saucer vertical diode matrix slice -- +-- 74151 8-Line To 1-Line Data Selector / Multiplexer -- +-- DECODE VERTICAL DIODE IMAGE LINES -- +-- SVER(0) is pin 11 A -- +-- SVER(1) is pin 10 B -- +-- SVER(2) is pin 9 C -- +----------------------------------------------------------------------------- +SVER(0) <= b5_6; -- 74151 pin11 A +SVER(1) <= b5_3; -- 74151 pin10 B +SVER(2) <= b5_11; -- 74151 pin9 C + +-- DECODE +saucer_ver <= + 0 when SVER ="000" else + 1 when SVER ="001" else + 2 when SVER ="010" else + 3 when SVER ="011" else + 4 when SVER ="100" else + 5 when SVER ="101" else + 6 when SVER ="110" else + 7 ; + +----------------------------------------------------------------------------- +-- IMAGE READ: Select saucer horizontal diode matrix slice -- +-- SAUCER 74153 4-Line To 16-Line Decoders/Demultiplexers -- +-- DECODE HORIZONTAL DIODE IMAGE LINES -- +----------------------------------------------------------------------------- +saucer_hor <= rocket_hor; -- horizontal decoding the same as for rocket; + -- use the same 74154 to "activate" a + -- horizontal slice of diodes + +----------------------------------------------------------------------------- +-- IMAGE READ: SAUCER DIODE MATRIX & 74151: -- +-- emulates the diode matrix and the part of 74151 that reads the matrix -- +-- value -- +-- corresponds to activating a specific horizontal slice -- +-- and reading resulting "value" for a specific vertical slice -- +----------------------------------------------------------------------------- +saucer_image: saucer_diode_image +port map (MemBrd_K, saucer_ver, saucer_hor, + saucer_diode_rotating_light, saucer_image_bit); + + +----------------------------------------------------------------------------- +-- IMAGE READ: SAUCER VIDEO ENABLE -- +-- Letting saucer image pass through to screen output -- +-- This "filter" prevents the saucer image from being written -- +-- repeatedly when it shouldnt -- +----------------------------------------------------------------------------- +c5_6 <= saucer_image_bit nand f4_8; -- f4_8 is only active when + -- saucer should be displayed + +----------------------------------------------------------------------------- +-- IMAGE READ: Select rocket horizontal diode matrix slice -- +-- DECODE HORIZONTAL DIODE IMAGE LINES -- +-- 74154 connection -- +-- RHOR(0) is pin 23 A -- +-- RHOR(1) is pin 22 B -- +-- RHOR(2) is pin 21 C -- +-- RHOR(3) is pin 20 D -- +----------------------------------------------------------------------------- +RHOR(0) <= a5_6; -- 74154 pin23 A +RHOR(1) <= a5_3; -- 74154 pin22 B +RHOR(2) <= a5_11; -- 74154 pin21 C +RHOR(3) <= a5_8; -- 74154 pin20 D + +-- DECODE +rocket_hor <= + 0 when RHOR ="0000" else + 1 when RHOR ="0001" else + 2 when RHOR ="0010" else + 3 when RHOR ="0011" else + 4 when RHOR ="0100" else + 5 when RHOR ="0101" else + 6 when RHOR ="0110" else + 7 when RHOR ="0111" else + 8 when RHOR ="1000" else + 9 when RHOR ="1001" else + 10 when RHOR ="1010" else + 11 when RHOR ="1011" else + 12 when RHOR ="1100" else + 13 when RHOR ="1101" else + 14 when RHOR ="1110" else + 15; + +----------------------------------------------------------------------------- +-- IMAGE READ: Select rocket vertical diode matrix slice -- +-- 74150's - all four -- +-- DECODE VERTICAL DIODE IMAGE LINES -- +-- RVER(0) is pin 15 A -- +-- RVER(1) is pin 14 B -- +-- RVER(2) is pin 13 C -- +-- RVER(3) is pin 11 D -- +----------------------------------------------------------------------------- +RVER(0) <= b5_6; -- 74150 pin15 A +RVER(1) <= b5_3; -- 74150 pin14 B +RVER(2) <= b5_11; -- 74150 pin13 C +RVER(3) <= b5_8; -- 74150 pin11 D + +-- DECODE +rocket_ver <= + 0 when RVER ="0000" else + 1 when RVER ="0001" else + 2 when RVER ="0010" else + 3 when RVER ="0011" else + 4 when RVER ="0100" else + 5 when RVER ="0101" else + 6 when RVER ="0110" else + 7 when RVER ="0111" else + 8 when RVER ="1000" else + 9 when RVER ="1001" else + 10 when RVER ="1010" else + 11 when RVER ="1011" else + 12 when RVER ="1100" else + 13 when RVER ="1101" else + 14 when RVER ="1110" else + 15; + +----------------------------------------------------------------------------- +-- IMAGE READ: ROCKET DIODE MATRIX & 74150: Rocket Image 0 - 3 -- +-- emulates the diode matrix and the part of 74150 that reads the matrix -- +-- value -- +-- corresponds to activating a specific horizontal slice -- +-- and reading resulting "value" for a specific vertical slice -- +----------------------------------------------------------------------------- +rocket_image_0: rocket_diode_images +port map (0, rocket_hor,rocket_ver, + diode_left_column, diode_right_column, diode_image0_bit); + +rocket_image_1: rocket_diode_images +port map (1, rocket_hor,rocket_ver, + diode_left_column, diode_right_column, diode_image1_bit); + +rocket_image_2: rocket_diode_images +port map (2, rocket_hor, rocket_ver, + diode_left_column, diode_right_column, diode_image2_bit); + +rocket_image_3: rocket_diode_images +port map (3, rocket_hor, rocket_ver, + diode_left_column, diode_right_column, diode_image3_bit); + + +----------------------------------------------------------------------------- +-- IMAGE READ: Rocket Engine "Flame" Logic -- +----------------------------------------------------------------------------- +diode_row_1 <= '0' when rocket_hor = 0 else '1'; + +diode_row_3 <= '0' when rocket_hor = 2 else '1'; + +e1_1 <= f2_6 nor diode_row_1; +e1_4 <= f2_8 nor diode_row_3; + +f3_8 <= e1_1 nand MemBrd_S; +f3_11 <= e1_4 nand MemBrd_S; + +diode_left_column <= not f3_8; -- send info to diode image component + -- (in real circuit expecting active low, + -- in this realization - active high) + + +diode_right_column <= not f3_11; -- send info to diode image component + -- (in real circuit expecting active + -- low, in this realization - active high) + + +----------------------------------------------------------------------------- +-- THRUST CIRCUITRY: Create thrust pulse train -- +----------------------------------------------------------------------------- +f2_6 <= thrust_and_rotate_clk; -- emulating the clk that is generated + -- by the digital and discrete/analogues + +f2_8 <= not thrust_and_rotate_clk; -- emulating the clk that is generated + -- by the digital and discrete/analogues + +----------------------------------------------------------------------------- +-- IMAGE READ: Saucer "Rotating Lights" Logic -- +-- using a signal to create a pulse train to drive rotating light -- +-- frequency -- +-- the pulse train is derived from reading a bit of the rocket's -- +-- horizontal scan counter -- +----------------------------------------------------------------------------- +saucer_diode_rotating_light <= not MemBrd_H; + +----------------------------------------------------------------------------- +-- IMAGE READ: X-Y AXIS IMAGE READ CONTROL - bit 3 processing -- +-- A6, 74153 -- +-- 4-line to 1-line data selector/multiplexor -- +-- (a,b) select c0 to c3 -- +-- (0,0):c0=>y, (0,1):c1=>y, (1,0):c2=>y, (1,1):c3=>y -- +-- -- +-- Rocket & Saucer hor & vert bit 3 processing -- +-- -- +-- OVERALL: A6, B6, C6, D6 Logic -- +-- Forwards which horizontal and vertical position to read from the saucer -- +-- and rocket's images - ie which pixel from the 16x8 or 16x16 image -- +-- grid to output to screen - and whether to read the rocket's image’s -- +-- horizontal slices as horizontal slices onto the screen or reading the -- +-- vertical slices as horizontal slices onto screen. -- +-- The saucer is always default to reading the vertical slices as -- +-- horizontal slices onto screen. -- +-- -- +-- The positions are given as 4-bit values (0000 - 1111; 16 positions) -- +-- and each chip (A6, B6, C6, D6) manages one of the bits each; for both -- +-- the vertical and the horizontal position for the saucer and the rocket. -- +-- A6 - bit 3, B6 - bit 2, C6 - bit 1, D6 - bit 0, -- +-- -- +-- The output can only be either rocket or saucer positions, so a set -- +-- of selectors choose between saucer and rocket and also determine -- +-- whether to read the rocket's image’s horizontal slices as horizontal -- +-- slices onto the screen or reading the vertical slices as horizontal -- +-- slices onto screen. -- +-- The saucer is always default to reading he vertical slices as -- +-- horizontal slices onto screen. -- +-- -- +-- The input is fed by rocket's motion counter's horizontal and vertical -- +-- lower bits (0-3 for horizontal / x-axis and 8-11 for vertical / y-axis) -- +-- and likewise from the saucer's motion counter -- +-- These feeds are constantly active and contribute to overall image pixel -- +-- read, but at a further stage, in the Memory Board, image video is only -- +-- "allowed" when the rocket's 16x16 image position or one of the -- +-- saucers's two 16x8 images positions matches the TV beams current -- +-- position as it sweeps across the TV screen. This is done via -- +-- Rocket Enable and Saucer Enable flags. Otherwise images would be -- +-- repeated across the screen for every 16 pixels and 16 lines (8 lines -- +-- for saucer) -- +-- -- +-- The selector input combination a and b determines which input to pass -- +-- through to rest of the graphics circuitry. -- +-- The way a and b are fed by upstream logic and how the data inputs -- +-- are "reverse connected" gives the following effect: -- +-- b - determines whether saucer or rocket should be fed to screen -- +-- a - determines whether the rocket's horizontal image slices should -- +-- be displayed on the x axis or y axis on the screen and consequently -- +-- whether the rocket's vertical image slices should be displayed on the -- +-- y or x axis. This is the basis for one subsset of the 32 potential -- +-- rocket images. -- +-- Selector a does not vary for saucer image as it is pre-set by -- +-- up stream logic whenever selector b is set to display saucer (c5_3) -- +----------------------------------------------------------------------------- +a6_10 <= MemBrd_C; -- data input 2C0 rocket horizontal bit 3 +a6_11 <= MemBrd_D; -- data input 2C1 rocket vertical bit 3 +a6_12 <= MemBrd_A; -- data input 2C2 saucer vertical bit 3 +a6_13 <= MemBrd_B; -- data input 2C3 saucer horizontal bit 3 + +a6_6 <= a6_11; -- data input 1C0 rocket vertical bit 3 +a6_5 <= a6_10; -- data input 1C1 rocket horizontal bit 3 +a6_4 <= a6_13; -- data input 1C2 saucer horizontal bit 3 +a6_3 <= a6_12; -- data input 1C3 saucer vertical bit 3 + +a6_14 <= c5_3; -- A select INPUT depending on rotation +a6_2 <= f4_8; -- B select INPUT depends on saucer enable + +a6_7 <= -- output y1 + a6_6 when (a6_14='0' and a6_2='0') else + a6_5 when (a6_14='1' and a6_2='0') else + a6_4 when (a6_14='0' and a6_2='1') else + a6_3; + +a6_9 <= -- output y2 + a6_10 when (a6_14='0' and a6_2='0') else + a6_11 when (a6_14='1' and a6_2='0') else + a6_12 when (a6_14='0' and a6_2='1') else + a6_13; + +----------------------------------------------------------------------------- +-- IMAGE READ: X-Y AXIS IMAGE READ CONTROL - bit 2 processing -- +-- B6, 74153 -- +-- 4-line to 1-line data selector/multiplexor -- +-- (a,b) select c0 to c3 -- +-- (0,0):c0=>y, (0,1):c1=>y, (1,0):c2=>y, (1,1):c3=>y -- +-- -- +-- For overall logic refer to A6 -- +----------------------------------------------------------------------------- +b6_10 <= MemBrd_4; -- data input 2C0 rocket horizontal bit 2 +b6_11 <= MemBrd_5; -- data input 2C1 rocket vertical bit 2 +b6_12 <= MemBrd_2; -- data input 2C2 saucer vertical bit 2 +b6_13 <= MemBrd_3; -- data input 2C3 saucer horizontal bit 2 + +b6_6 <= b6_11 ; -- data input 1C0 rocket vertical bit 2 +b6_5 <= b6_10; -- data input 1C1 rocket horizontal bit 2 +b6_4 <= b6_13; -- data input 1C2 saucer horizontal bit 2 +b6_3 <= b6_12; -- data input 1C3 saucer vertical bit 2 + +b6_14 <= c5_3; -- A select INPUT +b6_2 <= f4_8; -- B select INPUT depends on saucer enable + +b6_7 <= -- output y1 + b6_6 when (b6_14='0' and b6_2='0') else + b6_5 when (b6_14='1' and b6_2='0') else + b6_4 when (b6_14='0' and b6_2='1') else + b6_3; + +b6_9 <= -- output y2 + b6_10 when (b6_14='0' and b6_2='0') else + b6_11 when (b6_14='1' and b6_2='0') else + b6_12 when (b6_14='0' and b6_2='1') else + b6_13; + +----------------------------------------------------------------------------- +-- IMAGE READ: X-Y AXIS IMAGE READ CONTROL - bit 1 processing -- +-- C6, 74153 -- +-- 4-line to 1-line data selector/multiplexor -- +-- (a,b) select c0 to c3 -- +-- (0,0):c0=>y, (0,1):c1=>y, (1,0):c2=>y, (1,1):c3=>y -- +-- -- +-- For overall logic refer to A6 -- +----------------------------------------------------------------------------- +c6_10 <= MemBrd_H; -- data input 2C0 rocket horizontal bit 1 +c6_11 <= MemBrd_J; -- data input 2C1 rocket vertical bit 1 +c6_12 <= MemBrd_E; -- data input 2C2 saucer vertical bit 1 +c6_13 <= MemBrd_F; -- data input 2C3 saucer horizontal bit 1 + +c6_6 <= c6_11 ; -- data input 1C0 rocket vertical bit 1 +c6_5 <= c6_10; -- data input 1C1 rocket horizontal bit 1 +c6_4 <= c6_13; -- data input 1C2 saucer horizontal bit 1 +c6_3 <= c6_12; -- data input 1C3 saucer vertical bit 1 + +c6_14 <= c5_3; -- A select INPUT +c6_2 <= f4_8; -- B select INPUT depends on saucer enable + +c6_7 <= -- output y1 + c6_6 when (c6_14='0' and c6_2='0') else + c6_5 when (c6_14='1' and c6_2='0') else + c6_4 when (c6_14='0' and c6_2='1') else + c6_3; + +c6_9 <= -- output y2 + c6_10 when (c6_14='0' and c6_2='0') else + c6_11 when (c6_14='1' and c6_2='0') else + c6_12 when (c6_14='0' and c6_2='1') else + c6_13; + +----------------------------------------------------------------------------- +-- IMAGE READ: X-Y AXIS IMAGE READ CONTROL - bit 0 processing -- +-- D6, 74153 -- +-- 4-line to 1-line data selector/multiplexor -- +-- (a,b) select c0 to c3 -- +-- (0,0):c0=>y, (0,1):c1=>y, (1,0):c2=>y, (1,1):c3=>y -- +-- -- +-- For overall logic refer to A6 -- +----------------------------------------------------------------------------- +d6_10 <= MemBrd_8; -- data input 2C0 rocket horizontal bit 0 +d6_11 <= MemBrd_9; -- data input 2C1 rocket vertical bit 0 +d6_12 <= MemBrd_6; -- data input 2C2 saucer vertical bit 0 +d6_13 <= MemBrd_7; -- data input 2C3 saucer horizontal bit 0 + +d6_6 <= d6_11 ; -- data input 1C0 rocket vertical bit 0 +d6_5 <= d6_10; -- data input 1C1 rocket horizontal bit 0 +d6_4 <= d6_13; -- data input 1C2 saucer horizontal bit 0 +d6_3 <= d6_12; -- data input 1C3 saucer vertical bit 0 + +d6_14 <= c5_3; -- A select INPUT +d6_2 <= f4_8; -- B select INPUT depends on saucer enable + +d6_7 <= -- output y1 + d6_6 when (d6_14='0' and d6_2='0') else + d6_5 when (d6_14='1' and d6_2='0') else + d6_4 when (d6_14='0' and d6_2='1') else + d6_3; + +d6_9 <= -- output y2 + d6_10 when (d6_14='0' and d6_2='0') else + d6_11 when (d6_14='1' and d6_2='0') else + d6_12 when (d6_14='0' and d6_2='1') else + d6_13; + +----------------------------------------------------------------------------- +-- IMAGE READ LOGIC: ROCKET IMAGE SELECTOR -- +-- E2, 74153 -- +-- 4-line to 1-line data selector/multiplexor -- +-- with strobe logic, to select output pin 9 and/or pin 7 -- +-- -- +-- Logic to determine which rocket diode image to use (to send to screen). -- +-- In the design the "image read direction" and "axis setup" operate -- +-- on all four images simultaneously - and the final stage is to select -- +-- which image to use (rather than selecting image first, and then apply -- +-- direction and axis logic). -- +-- Please refer to comment section "GENERAL INFORMATION" above regarding -- +-- how rocket orientation position drives selection of base image. -- +-- -- +-- Current image bit from all four rocket diode images are sent -- +-- simultaneously to the multiplexor -- +-- a and b selectors (e2_14 and e2_1) determine which image to output -- +-- The selectors are fed by bit 0 and bit 1 (00, 01, 10, 11) from the -- +-- image counter (E4, 74193). -- +-- Strobe g1 and g2 (e2_15 and e2_2) are used to select whether images -- +-- are output straight (00=image 0, 01=image 1, 10=image 2, 11=image 3) or -- +-- "reversed" (00=image 3, 01=image 2, 10=image 1, 11=image 0). -- +-- The strobes are fed by bit 3 from the image counter (E4, 74193) -- +-- as straight and as inverse (which keep images output mutually switched -- +-- on/off). -- +-- As the image bits are mirrored/reversed on one of the data inputs -- +-- and straight on the other data inputs, selecting one or the other -- +-- input to have active output achives the effect of "reversing" image. -- +-- -- +-- output from E4 74193 to control image selection -- +-- QD QC QB QA Image to output -- +-- e4_7 e4_6 e4_2 e4_3 (e9_9 and e_7) -- +-- X 0 0 0 0 -- +-- X 0 0 1 1 -- +-- X 0 1 0 2 -- +-- X 0 1 1 3 -- +-- X 1 0 0 3 -- +-- X 1 0 1 2 -- +-- X 1 1 0 1 -- +-- X 1 1 1 0 -- +----------------------------------------------------------------------------- +e2_10 <= diode_image3_bit; -- image input in normal order 0->3 +e2_11 <= diode_image2_bit; -- image input in normal order 0->3 +e2_12 <= diode_image1_bit; -- image input in normal order 0->3 +e2_13 <= diode_image0_bit; -- image input in normal order 0->3 + +e2_3 <= e2_10; -- image input in "reverse" order 3->0 +e2_4 <= e2_11; -- image input in "reverse" order 3->0 +e2_5 <= e2_12; -- image input in "reverse" order 3->0 +e2_6 <= e2_13; -- image input in "reverse" order 3->0 + +e2_14 <= e4_3; -- a select +e2_2 <= e4_2; -- b select + -- controlling which image to output + +e2_1 <= e4_6; -- logic for choosing either normal image read +h2_10 <= not e4_6; -- or +e2_15 <= h2_10; -- reversed image read + + +e2_7x <= -- output y1; normal image read/output + e2_6 when (e2_14='0' and e2_2='0') else + e2_5 when (e2_14='1' and e2_2='0') else + e2_4 when (e2_14='0' and e2_2='1') else + e2_3; + +e2_7 <= e2_7x and (not e2_1); -- strobe from pin 1, active low + +e2_9x <= -- output y2; "reversed" image read/output + e2_10 when (e2_14='0' and e2_2='0') else + e2_11 when (e2_14='1' and e2_2='0') else + e2_12 when (e2_14='0' and e2_2='1') else + e2_13; + +e2_9 <= e2_9x and (not e2_15); -- strobe from pin 15, active low + +----------------------------------------------------------------------------- +-- Video Out Logic -- +----------------------------------------------------------------------------- +e1_10 <= e2_9 nor e2_7; -- merging normal image read and reversed + -- image read + -- as they are mutually on/off + -- the images can never be in conflict + +e1_13 <= MemBrd_10 nor e1_10; -- only displaying rocket if it is enabled + -- MemBrd_10 is "rocket enable", which + -- is active low when the TV beam is + -- passing by any of the pixel's screen + -- positions in the rocket's 16x16 image grid + -- and rocket is allowed to be displayed (not + -- directly after collision/explosion or + -- game is not playing) + +h2_8 <= not e1_13; -- inverting to get signal chain correct + +e5_3 <= h2_8 nand c5_6; -- merging with saucer image output + +MemBrd_P <= e5_3; -- Resulting video out, saucer or rocket + -- pixel level + +----------------------------------------------------------------------------- +-- Rotation Circuitry: Rotation input logic -- +-- Rotation input logic - incl sending rotation signal to sound unit -- +----------------------------------------------------------------------------- +-- 7450 : rotate_clock_wise +f6_8 <= not ((explosion_rotate_clk and MemBrd_R) or + (thrust_and_rotate_clk and MemBrd_M)); + +-- 7400 : rotate_counter_clock_wise +e5_6 <= thrust_and_rotate_clk nand MemBrd_N; + +-- 7402 +e6_4 <= not (MemBrd_N nor MemBrd_M); + +-- simplified output to audio, do not need other freq input +-- as the audio is generated from audio samples +-- in this case K1 only triggers a sample. +-- otherwise include logic as per schematics to +-- get sound frequency input via e6_13. +e6_1 <= e6_4; +MemBrd_K1 <= e6_1; + +----------------------------------------------------------------------------- +-- Rocket orientation register: Keep & update rocket orientation -- +-- E4, 74193 -- +-- synchronous 4-bit up/down counter (dual clock with clear) -- +-- binary counter -- +-- Implemented as a state machine to makes things easy to get carry -- +-- and borrow behaving properly on clock edges -- +-- -- +-- OVERALL: -- +-- The rocket can be in any of 32 positions. The current rocket position -- +-- is stored as two parameters; one flag (right / left) and a position -- +-- number (0 to 15). -- +-- -- +-- This counter holds the position number 0-15, and can move in one step -- +-- increments (up/down) between the numbers -- +-- -- +-- When the counter reaches 15 and is increased by 1, the right/left flag -- +-- changes direction from right to left (or left to right) and the counter -- +-- is reset to 0. Similar logic follows when the counter reaches 0 and -- +-- is decreaed by 1; direction change + reset to 15. -- +-- -- +-- Counter value: 0000 -> 1111 (0-15) -- +-- Represents which position the rocket is in for either 0-180 degrees -- +-- or 180-360 degrees. -- +-- The carry/borrow bits that are set as the counter moves between -- +-- 0000 and 1111 are used to set a flag (flip-flop) that indicates -- +-- whether the rocket is in sector 0-180 degrees or 180-360 degrees -- +-- -- +-- Counter specifics: -- +-- clear not used -- +-- loadn not used -- +-- Data inputs not used -- +-- +1 occurs on count up rising edge, and count_down is high -- +-- carry goes from high to low when falling edge of count_up -- +-- -1 occurs on count down rising edge, and count_up is high -- +-- borrow occurs on (goes low) on count down falling edge -- +----------------------------------------------------------------------------- +e4_4 <= e5_6; -- down clk needs to be active low +e4_5 <= f6_8; -- up clk needs to be active low + +process (super_clk) +begin +if rising_edge (super_clk) then + e4_4_old <= e4_4; + e4_5_old <= e4_5; + + case state is + when UNSIGNED_UP_DOWN => + e4_12 <= '1'; + e4_13 <= '1'; + if (e4_5_old = '0') and (e4_5 = '1') then + -- PRIO for UP clock rising edge of count up clock => need to + -- increment counter + if e4_count = 14 then + state <= READY_FOR_CARRY; + e4_count <= "1111"; + else + state <= UNSIGNED_UP_DOWN; + e4_count <= e4_count + 1; + end if; + elsif (e4_4_old = '0') and (e4_4 = '1') then + -- rising edge of count down clock => need to decrease counter + if e4_count = 1 then + state <= READY_FOR_BORROW; + e4_count <= "0000"; + else + state <= UNSIGNED_UP_DOWN; + e4_count <= e4_count - 1; + end if; + end if; + + when READY_FOR_CARRY => -- e4_count is "1111" + e4_12 <= '1'; + e4_13 <= '1'; + if (e4_5_old = '1') and (e4_5 = '0') then + -- PRIO for UP clock falling edge of count up clock => need to set + -- carry flag + e4_12 <= '0'; -- setting carry flag + state <= CARRY; + elsif (e4_4_old = '0') and (e4_4 = '1') then + -- rising edge of count down clock => need to decrease counter + e4_count <= e4_count - 1; + state <= UNSIGNED_UP_DOWN; + end if; + + when READY_FOR_BORROW => -- e4_count is "0000" + e4_12 <= '1'; + e4_13 <= '1'; + if (e4_5_old = '0') and (e4_5 = '1') then + -- PRIO for UP clock; rising edge of count UP clock => need to + -- increase counter + e4_count <= e4_count + 1; + state <= UNSIGNED_UP_DOWN; + elsif (e4_4_old = '1') and (e4_4 = '0') then + -- falling edge of count down clock => need to set borrow flag + e4_13 <= '0'; -- setting borrow flag + state <= BORROW; + + end if; + + when CARRY => + e4_12 <= '0'; + e4_13 <= '1'; + if (e4_5_old = '0') and (e4_5 = '1') then + -- rising edge of count up clock => need to clear carry flag and + -- increment + e4_12 <= '1'; -- clear carry flag + e4_count <= "0000"; + state <= READY_FOR_BORROW; + end if; + + when BORROW => + e4_12 <= '1'; + e4_13 <= '0'; + if (e4_4_old = '0') and (e4_4 = '1') then + -- rising edge of count down clock => need to clear borrow flag and + -- decrease + e4_13 <= '1'; -- clear carry flag + e4_count <= "1111"; + state <= READY_FOR_CARRY; + end if; + + when others => + e4_12 <= '1'; + e4_13 <= '1'; + state <= UNSIGNED_UP_DOWN; + e4_count <= "0000"; + + end case; +end if; +end process; + +e4_2 <= e4_count(1); -- Qb +e4_3 <= e4_count(0); -- Qa +e4_6 <= e4_count(2); -- Qc +e4_7 <= e4_count(3); -- Qd + +----------------------------------------------------------------------------- +-- Rocket orientation register: Indicate move fr. right to left or reverse -- +-- Bridge from up/down counter to flip flop -- +-- Signals when to move between 0<-<180 and 180<-<360 degree sectors -- +-- which is equivalent to whether rocket is pointing to the right or to -- +-- the left. -- +----------------------------------------------------------------------------- +e5_8 <= e4_13 nand e4_12; -- merges carry and borrow to signal + -- the rocket has moved between 0<-<180 and + -- 180<-<360 degree sectors + -- (changing left-to-right or right-to-left) + +----------------------------------------------------------------------------- +-- Rocket orientation register: Set right-left flag -- +-- E3 7476 -- +-- Flip flop that acts as a flag to indicate whether the rocket is -- +-- pointing to the right (0<-<180 degrees)or -- +-- to the left (180<-<360 degrees) -- +-- -- +-- e3_14: -- +-- 0 - rocket pointing to the left -- +-- 1 - rocket pointing to the right -- +-- -- +-- e3_15: -- +-- 0 - rocket pointing to the right -- +-- 1 - rocket pointing to the left -- +----------------------------------------------------------------------------- +e3_1 <= e5_8; + +process (super_clk) +begin +if rising_edge (super_clk) then + e3_1_old <= e3_1; + if (e3_1_old = '1') and (e3_1 = '0') then + -- falling edge, j and k permanent high => toggle + e3_15 <= not e3_15; + e3_14 <= not e3_14; + end if; +end if; +end process; + +----------------------------------------------------------------------------- +-- IMAGE READ LOGIC: Determine Image Read Direction -- +-- Logic to determine when to read the diode images "left to right" and -- +-- when to read the diode images "right to left". -- +-- Please refer to comment section "GENERAL INFORMATION" above regarding -- +-- how rocket orientation position drives image read direction. -- +-- -- +-- c5_11: -- +-- '0' read image "left to right" -- +-- '1' reads "right to left" (inverting read line input) -- +----------------------------------------------------------------------------- +f4_10 <= not e4_7; +e5_11 <= f4_10 nand e4_6; -- For rocket: + -- determines whether + -- the rocket is in range: + -- 45< - <90 degrees or + -- 225< - <270 degrees + -- to give it value '0' + -- all other angels are giving value '1' + +d5_11 <= e5_11 xor e3_15; -- For rocket: + -- all angels in range <0 - <180 degrees + -- maintains it read direction value + -- otherwise the value is inversed. + -- this results in angels 45< - <90 degrees, + -- 180< - <225 degrees, 270< - <360 degrees + -- are being read "right to left" + +c5_11 <= d5_11 nand MemBrd_K; -- if saucer is being drawn + -- (saucer video enabled: MemBrd_K) then + -- default read direction required by + -- saucer image (right to left) is set + -- otherwise d5_11 signal is inversed + +----------------------------------------------------------------------------- +-- IMAGE READ LOGIC: Determine Image Activation Direction -- +-- Logic to determine when to activate the diode images top-to-botton and -- +-- when to activate images bottom-to-top. -- +-- Please refer to comment section "GENERAL INFORMATION" above regarding -- +-- how rocket orientation position drives activation direction -- +-- -- +-- c5_8: -- +-- '1' activates image "top to bottom" via 74154 -- +-- '0' activates "bottom to top" via 74154 by inverting activation line -- +-- input. -- +----------------------------------------------------------------------------- +e6_10 <= e4_7 nor e4_6; -- For rocket: + -- verify if image no is 0-3 (out of 0-15); + -- which could be either first four images + -- in 0< - <45 degrees + -- or first four images 180< - <225 degrees + +d5_8 <= e3_15 xor e6_10; -- For rocket: + -- excludes 180< - < 225 degrees + -- and adds 225< - <360 degrees + -- this is done via e3_15 + -- e3_15 = '1' means images are in range: + -- 180< - <360 degrees. + -- Result is that rocket pointing: + -- 0< - <45 degrees or 225< - <360 degrees + -- is read Top to Bottom. + -- Otherwise Bottom to Top. + +c5_8 <= MemBrd_K nand d5_8; -- if saucer is being drawn then default + -- activation direction required by saucer + -- image (bottom up) + -- otherwise signal is just inversed + +f4_4 <= not c5_8; -- re-inverses signal + -- to fit follow-on logic + +----------------------------------------------------------------------------- +-- IMAGE READ LOGIC: Determine Activation and Read Axis -- +-- Logic to determine whether the horizontal diode image slices are read -- +-- as horizontal slices onto screen OR the vertical diode image slices -- +-- are read as horizontal image slices onto screen -- +-- Please refer to comment section "GENERAL INFORMATION" above regarding -- +-- how rocket orientation position drives axis setup -- +-- -- +-- c5_3: -- +-- '0': Reading the diode image’s horizontal slices (rows) as horizontal -- +-- slices (rows) onto screen -- +-- '1' Reading the diode image’s vertical slices (columns) as -- +--- horizontal slices (rows) onto screen -- +----------------------------------------------------------------------------- +d5_3 <= e4_6 xor e4_7; -- For rocket: + -- whenever image no is between 4 - 11 + -- meaning 45< - <135 degree or + -- 225< - <315 degrees + -- d5_3 is set to use the horizontal part of + -- the diode matrix as the "on screen" + -- horizontal part OR the vertical part + -- of the diode matrix as the "on screen" + -- horizontal part + -- '0' activates diode matrix row by row and + -- and for each row read pixel by pixel => + -- horizontal images slices are read onto + -- screen as horizontal slices + -- '1' activates diode matrix row and reads + -- pixel in current column, and move through + -- all rows in this manner until all pixels + -- for a column is read, then repeat this + -- process column by column => vertical image + -- slices are read onto screen as horizontal + -- slices + +c5_3 <= MemBrd_K nand d5_3; -- if saucer is being drawn then default to + -- activation/read axis required by saucer + -- image:read vertical diode part as + -- horizontal + -- - which is easy to realize just by looking + -- at the 90 degree tilted saucer diode + -- image on the schematics + -- Otherwise signal is just inversed for rocket + -- to comply with down stream logic needs. + +----------------------------------------------------------------------------- +-- Rocket North/South/West/East Indicator: D5_6 -- +-- Determine whether the rocket is oriented (pointing) very close to -- +-- 0 degrees, 90 degrees, 180 degrees, or 270 degrees -- +-- within two positions on each side of each main direction -- +-- using bit 1 and bit 2 of the image position counter -- +----------------------------------------------------------------------------- +d5_6 <= e4_2 xor e4_6; -- 0: very close to 0, 90, 180 or 270 degrees + -- 1: not very close to 0, 90, 180 or 270 degrees + +----------------------------------------------------------------------------- +-- THRUST CIRCUITRY: Create thrust pulse train -- +-- when thrust button is pressed, create a pulse train that controls -- +-- how fast the rocket's engine flame pulsates, and how fast the rocket's -- +-- velocity level change (gives the feeling of acceleration/deceleration) -- +----------------------------------------------------------------------------- +f3_6 <= not (MemBrd_S and thrust_and_rotate_clk) ; + +----------------------------------------------------------------------------- +-- THRUST CIRCUITRY: audio -- +-- signal to create thrust sound when thrust button is pressed -- +-- not a true implementation of the original schematics -- +-- as this implementation relies on sampled audio and only needs "button -- +-- press" signal (and no audio frequency) -- +----------------------------------------------------------------------------- +membrd_K2 <= MemBrd_S; -- thrust audio + +----------------------------------------------------------------------------- +-- Horizontal Rocket Velocity: Keep and Update Velocity Level -- +-- 74193 -- +-- Aynchronous 4-bit up/down counter (dual clock with clear) -- +-- Binary counter -- +-- Counter to hold the current velocity level value, and to increase or -- +-- decrease the value when told to do so -- +-- j4_3 (bit0), j4_2 (bit 1), j4_6 (bit 2) represent the 3 bit -- +-- velocity level -- +-- j4_7 (bit 3=) represents direction left or right -- +-- 0 - left / 1 - right -- +-- -- +-- Counting up - decreases rightbound/increases leftbound velocity -- +-- Counting down - increases rightbound/decreases leftbound velocity -- +-- When velocity is (0)000 and counting down, the counter flips to (1)111 -- +-- velocity levels gets "reversed/flipped" for rightbound velocity -- +-- j4_7 = 0 (left); 000 means no velocity and 111 means max velocity -- +-- j4_7 = 1 (right); 111 means no velocity and 000 means max velocity -- +-- -- +-- Please note that left/right values are inversed as they reach the -- +-- Motion Board's Rocket Motion unit (0 = right, 1 = left) to fit the -- +-- Motion Logic -- +----------------------------------------------------------------------------- +j4_4 <= j3_6; -- count down (decrease) +j4_5 <= j3_8; -- count up (increase) + +process (super_clk) +begin +if rising_edge (super_clk) then + j4_4_old <= j4_4; + j4_5_old <= j4_5; + if (j4_4_old = '0') and (j4_4 = '1') and (j4_5 = '1') then + j4_count <= j4_count-1; + elsif (j4_5_old = '0') and (j4_5 = '1') and (j4_4 = '1') then + j4_count <= j4_count+1; + end if; +end if; +end process; + +j4_2 <= j4_count(1); -- Qb +j4_3 <= j4_count(0); -- Qa +j4_6 <= j4_count(2); -- Qc +j4_7 <= j4_count(3); -- Qd + +----------------------------------------------------------------------------- +-- Horizontal Rocket Velocity: Velocity Level "Harmonization" -- +-- -- +-- j4_3 (bit0), j4_2 (bit 1), j4_6 (bit 2) represent the 3 bit -- +-- velocity level -- +-- j4_7 represents direction left or right, and due to the use of counter -- +-- the velocity levels gets "reversed/flipped" for rightbound velocity -- +-- j4_7 = 0 (left); 000 means no velocity and 111 means max velocity -- +-- j4_7 = 1 (right); 111 means no velocity and 000 means max velocity -- +-- -- +-- By applying XOR logic with the direction signal j4_7, the velocity -- +-- level is "harmonized" so that direction does not matter -- +-- and 000 means no velocity and 111 means max velocity -- +----------------------------------------------------------------------------- +j5_6 <= j4_3 xor j4_7; +j5_11 <= j4_2 xor j4_7; +j5_3 <= j4_6 xor j4_7; + +----------------------------------------------------------------------------- +-- Horizontal Rocket Velocity: Output Velocity Level and Direction -- +-- 000 represents zero motion and 111 is maximum velocity -- +-- -- +-- Please note that left/right values are inversed as they reach the -- +-- Motion Board's Rocket Motion unit (0 = right, 1 = left) to fit the -- +-- Motion Logic -- +----------------------------------------------------------------------------- +MemBrd_14 <= j5_6; -- velocity bit 0 +MemBrd_13 <= j5_11; -- velocity bit 1 +MemBrd_15 <= j5_3; -- velocity bit 3 +MemBrd_16 <= j4_7; -- (0)Left /(1)Right + +----------------------------------------------------------------------------- +-- Horizontal Rocket Velocity: Max Rightbound Velocity Level Flag -- +-- Logic to flag when max velocity level has been reached -- +-- Flag is used to stop velocity counter from being further decreased -- +-- (for rightbound velocity; decrease counter increases velocity) -- +----------------------------------------------------------------------------- +j6_6 <= not ( j5_6 and j5_11 and j5_3 and j4_7); -- when velocity level is + -- 111 and direction is + -- to the right, + -- then flag is set + +----------------------------------------------------------------------------- +-- Horizontal Rocket Velocity: Max Leftbound Velocity Level Flag -- +-- Logic to flag when max velocity level has been reached -- +-- Flag is used to stop velocity counter from being further increased -- +----------------------------------------------------------------------------- +inv_4 <= not j4_7; -- no markings on + -- schematics, call it + -- inv_4 + +j6_8 <= not ( j5_6 and j5_11 and j5_3 and inv_4); -- when velocity level is + -- 111 and direction is + -- to the left, + -- then flag is set + +----------------------------------------------------------------------------- +-- Horizontal Rocket Velocity: Incr Leftb Velocity/Decr. Rightb velocity -- +-- Sends signal to decrease rightbound velocity until rocket has no right -- +-- bound motion and increase leftbound velocity until max velocity has -- +-- been reached. -- +-- Decreasing velocity in one direction can only be achieved by applying -- +-- thrust in opposite direction. -- +-- Thrust only has impact if the rocket is pointing to the left -- +-- (180-360 deg.) but is not pointing very close to north/south. -- +-- Logically j3_8 sends signal to velocity counter to increase the counter -- +-- value. -- +----------------------------------------------------------------------------- +j3_8 <= not ( j6_8 and e3_15 and j2_10); -- j6_8: flag that indicates + -- whether max velocity has been + -- reached or not. If max velocity + -- then it prevents further + -- increase + -- e3_15: right/left flag + -- active and allowing for + -- increse in velocity only + -- when set to "left" (1) + -- j2_10: pulse that gives the + -- pace with which the velocity + -- can change (acceleration/ + -- deceleration) - pulsating + -- when thrust button is pressed + -- and rocket is not pointing + -- very close to north/south + +----------------------------------------------------------------------------- +-- Horizontal Rocket Velocity: Incr Rightb Velocity/Decr. Leftb velocity -- +-- Sends signal to decrease Leftbound velocity until rocket has no left -- +-- bound motion and increase Rightbound velocity until max velocity has -- +-- been reached. -- +-- Decreasing velocity in one direction can only be achieved by applying -- +-- thrust in opposite direction. -- +-- Thrust only has impact if the rocket is pointing to the right -- +-- (0-180 deg.) but not pointing very close to north/south -- +-- -- +-- Logically j3_6 sends signal to velocity counter to decrease the -- +-- counter value -- +----------------------------------------------------------------------------- +j3_6 <= not (j6_6 and j2_10 and e3_14); -- j6_6: flag that indicates + -- whether max velocity has been + -- reached or not. If max velocity + -- then it prevents further + -- counter decrease + -- e3_14: right/left flag + -- active and allowing for + -- increse in velocity only + -- when set to "right"(1) + -- j2_10: pulse that gives the + -- pace with which the velocity + -- can change (acceleration/ + -- deceleration) - pulsating + -- when thrust button is pressed + -- and rocket is not pointing + -- very close to north/south + +----------------------------------------------------------------------------- +-- Horizontal Rocket Velocity: Horizontal Thrust Pulse -- +-- Pulse that gives the pace with which the velocity can change -- +-- (acceleration/ deceleration). -- +-- only pulses as long as rocket is not pointing very close to either -- +-- north or south -- +-- f5_13 NOR f3_6 -- +-- 00:1 -- +-- 01:0 -- +-- 10:0 -- +-- 11:0 -- +-- when f5_13=1 then the rocket is pointing very close to either north -- +-- or south, the rocket is not seen as being able to create any -- +-- horizontal thrust, and consequently no pulse is allowed -- +-- when f5_13=0 then thrust pulse is allowed -- +-- The resulting thrust pulse is inverted, but it does not matter -- +-- f3_6 is a continuous pulse train - when the thrust button is pressed -- +----------------------------------------------------------------------------- +j2_10 <= f5_13 nor f3_6; + +----------------------------------------------------------------------------- +-- Horizontal Rocket Velocity: Near North/South Direction F5_13 -- +-- Determines when the rocket is pointing very close to north/south or -- +-- not. -- +-- "Very close" is within 2 positions from north/south -- +-- Is used to determine whether thrust should have impact on horizontal -- +-- velocity or not -- +-- "Input": -- +-- d5_3 flag is active when rocket is pointing in either: -- +-- 45-135 degrees or 225 - 315 degrees -- +-- d5_6 flag is "active low" whenever the rocket is pointing very close to -- +-- either side of: north, south, east or west -- +-- "Output": -- +-- Combining these flags with NOR gives: -- +-- 1: when rocket is pointing very close to north or south -- +-- 0: when rocket is pointing in any direction except -- +-- for very close to north or south (then thrust is allowed to impact -- +-- horizontal velocity) -- +----------------------------------------------------------------------------- +f5_13 <= d5_6 nor d5_3; + +----------------------------------------------------------------------------- +-- Vertical Rocket Velocity: Keep and Update Velocity Level -- +-- 74193 -- +-- Aynchronous 4-bit up/down counter (dual clock with clear) -- +-- Binary counter -- +-- Counter to hold the current velocity level value, and to increase or -- +-- decrease the value when told to do so -- +-- h4_3 (bit0), h4_2 (bit 1), h4_6 (bit 2) represent the 3 bit -- +-- velocity level -- +-- h4_7 (bit 3=) represents direction up or down -- +-- 0 - up / 1 - down -- +-- -- +-- Counting up - decreases downward/increases upward velocity -- +-- Counting down - increases downward/decreases upward velocity -- +-- When velocity is (0)000 and counting down, the counter flips to (1)111 -- +-- velocity levels gets "reversed/flipped" for downward velocity -- +-- h4_7 = 0 (up); 000 means no velocity and 111 means max velocity -- +-- h4_7 = 1 (down); 111 means no velocity and 000 means max velocity -- +-- -- +-- Please note that up/down values are inversed as they reach the Motion -- +-- Board's Rocket Motion unit (0 = down, 1 = up) to fit the Motion Logic -- +----------------------------------------------------------------------------- +h4_4 <= h3_6; -- count down (decrease) +h4_5 <= h3_8; -- count up (increase) + +process (super_clk) +begin +if rising_edge (super_clk) then + h4_4_old <= h4_4; + h4_5_old <= h4_5; + if (h4_4_old = '0') and (h4_4 = '1') and (h4_5 = '1') then + h4_count <= h4_count-1; + elsif (h4_5_old = '0') and (h4_5 = '1') and (h4_4 = '1') then + h4_count <= h4_count+1; + end if; +end if; +end process; + +h4_2 <= h4_count(1); -- Qb +h4_3 <= h4_count(0); -- Qa +h4_6 <= h4_count(2); -- Qc +h4_7 <= h4_count(3); -- Qd + +----------------------------------------------------------------------------- +-- Vertical Rocket Velocity: Near East/West Direction F5_10 -- +-- Determines when the rocket is pointing very close to east/west or not. -- +-- "Very close" is within 2 positions from east/west -- +-- Is used to determine whether thrust should have impact on vertical -- +-- velocity or not -- +-- "Input": -- +-- f4_12 flag is active when rocket is pointing in either: -- +-- 315< - <45 degrees or 135< - <225 degrees -- +-- d5_6 flag is "active low" whenever the rocket is pointing very close to -- +-- either side of: north, south, east or west -- +-- "Output": -- +-- Combining these flags with NOR gives: -- +-- 1: when rocket is pointing very close to east or west -- +-- 0: when rocket is pointing in any direction except -- +-- for very close to east or west (then thrust is allowed to impact -- +-- vertical velocity) -- +----------------------------------------------------------------------------- +f5_10 <= d5_6 nor f4_12; + +----------------------------------------------------------------------------- +-- Vertical Rocket Velocity: Vertical Thrust Pulse -- +-- Pulse that gives the pace with which the velocity can change -- +-- (acceleration/ deceleration). -- +-- only pulses as long as rocket is not pointing very close to either -- +-- east or west -- +-- f5_10 NOR f3_6 -- +-- 0 0 => 1 -- +-- 0 1 => 0 -- +-- 1 0 => 0 -- +-- 1 1 => 0 -- +-- when f5_10=1 then the rocket is pointing very close to either east -- +-- or west and the rocket is not seen as being able to create any -- +-- vertical thrust, and consequently no pulse is allowed -- +-- when f5_10=0 then thrust pulse is allowed -- +-- The resulting thrust pusle is inverted, but it does not matter -- +-- f3_6 is a continuous pulse train - when the thrust button is pressed -- +----------------------------------------------------------------------------- +j2_13 <= f3_6 nor f5_10; + +----------------------------------------------------------------------------- +-- Vertical Rocket Velocity: Velocity Level "Harmonization" -- +-- -- +-- h4_3 (bit0), h4_2 (bit 1), h4_6 (bit 2) represent the 3 bit -- +-- velocity level -- +-- h4_7 represents direction up or down, and due to the use of counter -- +-- the velocity levels gets "reversed/flipped" for downward velocity -- +-- h4_7 = 0 (up); 000 means no velocity and 111 means max velocity -- +-- h4_7 = 1 (down); 111 means no velocity and 000 means max velocity -- +-- -- +-- By applying XOR logic with the direction signal h4_7, the velocity -- +-- level is "harmonized" so that direction does not matter -- +-- and 000 means no velocity and 111 means max velocity -- +----------------------------------------------------------------------------- +h5_6 <= h4_3 xor h4_7; +h5_11 <= h4_2 xor h4_7; +h5_3 <= h4_6 xor h4_7; + +----------------------------------------------------------------------------- +-- Vertical Rocket Velocity: Output Velocity Level and Direction -- +-- 000 represents zero motion and 111 is maximum velocity -- +-- -- +-- Please note that up/down values are inversed as they reach the Motion -- +-- Board's Rocket Motion unit (0 = down, 1 = up) to fit the Motion Logic -- +----------------------------------------------------------------------------- +MemBrd_W <= h5_6; -- velocity bit 0 +MemBrd_V <= h5_11; -- velocity bit 1 +MemBrd_X <= h5_3; -- velocity bit 3 +MemBrd_Y <= h4_7; -- Up(0) / Down(1) + +----------------------------------------------------------------------------- +-- Vertical Rocket Velocity: Max Downward Velocity Level Flag -- +-- Logic to flag when max velocity level has been reached -- +-- Flag is used to stop velocity counter from being further decreased -- +-- (for downward velocity: counter decrease => increases velocity) -- +----------------------------------------------------------------------------- +h6_6 <= not ( h5_6 and h5_11 and h5_3 and h4_7); -- when velocity level is + -- 111 and direction is + -- downwards, + -- then flag is set + +----------------------------------------------------------------------------- +-- Vertical Rocket Velocity: Max Upward Velocity Level Flag -- +-- Logic to flag when max velocity level has been reached -- +-- Flag is used to stop velocity counter from being further increased -- +----------------------------------------------------------------------------- +h2_2 <= not h4_7; +h6_8 <= not ( h5_6 and h5_11 and h5_3 and h2_2); -- when velocity level is + -- 111 and direction is + -- upwards, + -- then flag is set + +----------------------------------------------------------------------------- +-- Vertical Rocket Velocity: Incr Downw. Velocity / Decr. Upward velocity -- +-- Sends signal to decrease upward velocity until rocket has no upward -- +-- motion and increase downward velocity until max velocity has been -- +-- reached. -- +-- Decreasing velocity in one direction can only be achieved by applying -- +-- thrust in opposite direction. -- +-- Thrust only has impact if the rocket is pointing downwards (90-270 deg) -- +-- but is not pointing very close to east/west. -- +-- Logically h3_6 send signal to velocity counter to decrease the counter -- +-- value -- +----------------------------------------------------------------------------- +h3_6 <= not (h6_6 and j2_13 and j5_8); -- h6_6: flag that indicates + -- whether max velocity has been + -- reached or not. If max velocity + -- then it prevents further + -- velocity increase + -- j5_8: up/down flag + -- active and allowing for + -- increse in velocity only + -- when set to "down" (1) + -- j2_13: pulse that gives the + -- pace with which the velocity + -- can change (acceleration/ + -- deceleration) - pulsating + -- when thrust button is pressed + -- and rocket is not pointing + -- very close to east or west + +----------------------------------------------------------------------------- +-- Vertical Rocket Velocity: Incr Upward Velocity / Decr. Downw. Velocity -- +-- Sends signal to decrease downward velocity until rocket has no down -- +-- ward motion and increase upward velocity until max velocity has been -- +-- reached. -- +-- Decreasing velocity in one direction can only be achieved by applying -- +-- thrust in opposite direction. -- +-- Thrust only has impact if the rocket is pointing downwards (270-90 deg) -- +-- but is not pointing very close to east/west. -- +-- Logically h3_8 sends signal to velocity counter to increase the counter -- +-- value -- +----------------------------------------------------------------------------- +h2_12 <= not j5_8; -- j5_8: flag that indicates + -- whether rocket is pointing + -- upwards or downwards + -- 0 - up, 1 - down + -- h2_12 is inversing to fit + -- follow on logic requirement + -- that UP is active high (1) + +h3_8 <= not (h6_8 and h2_12 and j2_13); -- h6_8: flag that indicates + -- whether max velocity has been + -- reached or not. If max velocity + -- then it prevents further + -- velocity increase + -- h2_12: up/down flag + -- active and allowing for + -- increse in velocity only + -- when set to "up" (1) + -- j2_13: pulse that gives the + -- pace with which the velocity + -- can change (acceleration/ + -- deceleration) - pulsating + -- when thrust button is pressed + -- and rocket is not pointing + -- very close to east or west + +----------------------------------------------------------------------------- +-- ROCKET MISSILE DIRECTION LOGIC: Determine rocket missile direction -- +-- up / down AND left / right -- +-- used for rocket missile launch angle and manouvering post launch -- +----------------------------------------------------------------------------- +MemBrd_12 <= j5_8; -- Missile Up or Down + -- 0 = Up / 1 = Down + +MemBrd_17 <= e3_14; -- Missile Right or Left (0-180dg vs 180-360 dg) + -- e3_14 is the inverse of e3_15 + -- 0 = Left / 1 = Right + +----------------------------------------------------------------------------- +-- ROCKET MISSILE DIRECTION LOGIC: Rocket missile direction -- +-- Determines which direction the rocket missile should move in. The -- +-- direction is dependent on the direction in which the rocket is -- +-- pointing. In summary: -- +-- 1) Straight up/down or right/left missile motion when the rocket is -- +-- pointing very close to north/south or west/east. At speed of one pixel -- +-- per every 1/60 second -- +-- 2) â€45 degree†(or equivalent 135 / 215 / 305) motion when the rocket -- +-- is pointing close to 45 degree (or equivalent). At speed of one pixel -- +-- per every 1/60 second -- +-- 3) 22,5/157,5/212.5/342.5 degree motion when rocket is close to those -- +-- angels. At one pixel per every 1/60 second in vertical direction -- +-- and one pixel per every 1/30 second in horizontal direction -- +-- 4) 67,5/112.5/257.5/302.5 degree motion when rocket is close to those -- +-- angels. At one pixel per every 1/30 second in vertical direction and -- +-- one pixel per every 1/60 second in horizontal direction -- +-- -- +-- The rocket missile direction is changing as the rocket orientation -- +-- is changing - allowing for rocket missile manouverability -- +-- -- +-- One input lacks marking on the one player schematics, -- +-- but looking at the 2-player schematics concludes this is tapping from -- +-- motionboard B (MB_B) (ref MemBrd_11) -- +-- MB_B is a pulse train which goes high/low with half the screen refresh -- +-- freq: 30 Hz -- +----------------------------------------------------------------------------- +f4_12 <= not d5_3; -- active low whenever rocket is + -- pointing: + -- 45< - <135 degrees or + -- 225< - <315 degrees + +-- h5_8 <= e4_2 nand e4_3; -- original schematics; wrong label + -- on gate; should be xor, not nand +h5_8 <= e4_2 xor e4_3; -- revised logic + -- indicates (low) when the rocket + -- is oriented, within one position, + -- to either side of the + -- 0/45/90/135/180/225/270/325 + -- degree-lines + -- otherwise high + +f4_6 <= not h5_8; -- indicates (high) when the rocket + -- is oriented, within one position, + -- to either side of the + -- 0/45/90/135/180/225/270/325 + -- degree-lines + -- otherwise low + +f6_6 <= not((h5_8 and MemBrd_11) -- pulses between two logical output + or (d5_6 and f4_6)); -- constructs at a rate of 30Hz + -- 1: indicate (high) when rocket is + -- oriented within one position to + -- either side of north, south, east + -- or west + -- otherwise low + -- 2: indicate (low) when rocket is + -- within one position to either side + -- of 45/135/225/325 degree lines + -- otherwise high + +f4_2 <= not f6_6; -- pulses between two logical output + -- constructs at a rate of 30Hz + -- 1: indicate (low) when rocket is + -- oriented within one position to + -- either side of north, south, east + -- or west + -- otherwise high + -- 2: indicate (high) when rocket is + -- within one position to either side + -- of 45/135/225/325 degree lines + -- otherwise low + +f5_4 <= f4_2 nor f4_12; -- Rocket is pointing: + -- 1) within one position + -- to either side of + -- east or west + -- => 1 + -- 2) ~61 - ~74 / ~105 - ~121 / + -- ~240 - ~253 / ~287 - ~300 + -- degrees + -- => switches between 1 and 0 + -- with a 30 Hz frequency + -- 3) ~300 < - < ~61 degrees or + -- ~121 < - < ~240 degrees + -- => 0 + +f5_1 <= f4_2 nor d5_3; -- Rocket is pointing: + -- 1) within one position + -- to either side of + -- north or south + -- => 1 + -- 2) ~16 - ~32 / ~151 - ~163 / + -- ~197 - ~209 / ~331 - ~343 + -- degrees + -- => switches between 1 and 0 + -- with a 30 Hz frequency + -- 3) ~32 < - < ~151 degrees or + -- ~209 < - < ~331 degrees + -- => 0 + +MemBrd_T <= f5_4; -- Rocket Missile Up/Down Enable + -- 0 - up/down allowed + -- 1 - up/down not allowed + -- Is either constantly + -- 1 or 0 or + -- switches between 1 and 0 + -- with a 30 Hz frequency + -- to allow for rocket + -- missile direction of: + -- 67,5/112.5/257.5/302.5 + -- degrees + +MemBrd_U <= f5_1; -- Rocket Missile Right/Left Enable + -- 0 - right/left allowed + -- 1 - right/left not allowed + -- Is either constantly + -- 1 or 0 or + -- switches between 1 and 0 + -- with a 30 Hz frequency + -- to allow for rocket + -- missile direction of + -- 22,5/157,5/212.5/342.5 + -- degrees + +----------------------------------------------------------------------------- +-- Determine rocket's main orientation -- +-- up / down and left / right -- +-- used for rocket's vertical/horizontal velocity acc/dec. -- +-- and for rocket missile launch angle and manouvering post launch -- +----------------------------------------------------------------------------- +j5_8 <= e3_15 xor e4_7; -- e3_15 signals whether 0-180 degrees or + -- 180-360 degrees (right or left pointing) + -- e4_7 signals whether 90-180 / 270-360 degrees + -- or 0-90 / 180-270 degrees + -- XOR gives UP when e3_15(0-180 degrees) meet + -- e4_7(0-90 degres) + -- or e3_15(180-360 degrees) meet e4_7(270-350dg) + -- otherwise DOWN + +end memory_board_architecture; \ No newline at end of file diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/mist_io.v b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_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/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/motion_board.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/motion_board.vhd new file mode 100644 index 00000000..617c37d2 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/motion_board.vhd @@ -0,0 +1,1476 @@ +----------------------------------------------------------------------------- +-- MOTION BOARD LOGIC -- +-- For use with Computer Space FPGA emulator. -- +-- Implementation of Computer Space's Motion Board -- +-- "wire by wire" and "component by component"/"gate by gate" based on -- +-- original schematics. -- +-- With exceptions regarding: -- +-- > analogue based timers (impl as counters) -- +-- > all flip flops / ICs using asynch clock inputs are replaced with -- +-- flip flops driven by a high freq clock and logic to -- +-- identify "logical clock edge" changes -- +-- > sound pulse trains used by the analogue sound unit are replaced by -- +-- on/off flags to trigger sound sample playback -- +-- -- +-- There are plenty of comments throughout the code to make it easier to -- +-- understand the logic, but due to the sheer number of comments there -- +-- may exist occasional mishaps. -- +-- -- +-- This entity is implementation agnostic -- +-- -- +-- Naming convention: -- +-- Signals are labelled after the component that generates the signal; -- +-- more specifically the component's schematics label and the specific -- +-- output. For instance: NOR gate F6 and its output pin 10 generate a -- +-- signal which will be labelled f6_10. -- +-- Occasionally signals are labelled after a component input - this is -- +-- most common for components where the input is exposed -- +-- to "component-internal processing" beyond simple gate functionality, -- +-- such as bistable latches, counters, flip-flops and multiplexers. -- +-- Motion Board inputs/outputs are labelled MB_, where is -- +-- according to original schematics input/output labels. -- +-- -- +-- v1.0 -- +-- by Mattias G, 2015 -- +-- Enjoy! -- +----------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use ieee.std_logic_unsigned.all; +library work; + +--80--------------------------------------------------------------------------| + +entity motion_board is + port ( + super_clk, -- Clock to emulate + -- asynch flip flop logic + + timer_base_clk : in std_logic; + rocket_missile_life_time_duration, + saucer_missile_life_time_duration, + saucer_missile_hold_duration, + signal_delay_duration : in integer; + + MB_3, -- rocket horizontal velocity: + -- speed bit 0 + MB_4, -- rocket horizontal velocity: + -- speed bit 2 + + MB_16, -- rocket missile + -- horizontal direction + -- 1- right, 0 - left + MB_17, -- rocket missile + -- horizontal (right/left) + -- speed + -- constant 1 - no speed + -- constant 0 - "60Hz" speed + -- pulse 0/1 at 30 Hz rate + -- gives "30 Hz" speed + + MB_18, -- rocket missile + -- vertical direction + -- 0 - up, 1 - down + MB_19, -- rocket missile + -- vertical (up / down) + -- speed + -- constant 1 - no speed + -- constant 0 - "60Hz" speed + -- (60 pixels / second) + -- pulse 0/1 at 30 Hz rate + -- gives "30 Hz" speed + -- (30 pixels / second) + + MB_20, -- game clock + MB_C, -- count enable + + MB_D, -- rocket horizontal velocity: + -- speed bit 1 + + MB_H, -- rocket up or down + -- 0 - up / 1 - down + MB_J, -- rocket right or left + -- 0 - left / 1- right + + MB_T, -- rocket vertical velocity: + -- speed bit 0 + MB_U, -- rocket vertical velocity: + -- speed bit 1 + MB_V, -- rocket vertical velocity: + -- speed bit 2 + + MB_Y -- rocket missile fire; + -- active when fire button + -- has been pressed + : in std_logic; + + MB_5, -- saucer 16x8 image's + -- horizontal position bit 2 + MB_6, -- saucer 16x8 image's + -- horizontal position bit 0 + MB_8, -- saucer 16x8 image's + -- vertical position bit 0 + MB_9, -- saucer 16x8 image's + -- vertical position bit 2 + + MB_10, -- saucer missile video + -- signals that the TV beam + -- is "sweeping" by the current + -- pixel position of an active + -- saucer missile + + MB_11, -- rocket 16x16 image's + -- horizontal position bit 2 + MB_12, -- rocket 16x16 image's + -- horizontal position bit 0 + MB_13, -- rocket 16x16 image's + -- vertical position bit 1 + MB_14, -- rocket 16x16 image's + -- vertical position bit 3 + MB_15, -- rocket 16x16 image's + -- vertical position bit 0 + + MB_21, -- Saucer Enable + -- signals that the TV beam + -- is "sweeping" by the current + -- position of one of the + -- two 16 x 8 + -- saucer image grids + -- The exact image pixel that + -- the TV beam is sweeping by + -- is provided by + -- horizontal pos bit 0-3: + -- MB_6, MB_F, MB_5, MB_E + -- vertical pos bit 0-3: + -- MB_8, MB_K, MB_9, MB_L + -- The information is used + -- by the Memory Board + -- to feed the correct + -- image pixel for further + -- video signal processing + -- at the sync star board + + MB_B, -- 30Hz frequency pulse train + -- used by Memory Board to create + -- Rocket missile motion + + MB_E, -- saucer 16x8 image's + -- horizontal position bit 3 + MB_F, -- saucer 16x8 image's + -- horizontal position bit 1 + MB_K, -- saucer 16x8 image's + -- vertical position bit 1 + MB_L, -- saucer 16x8 image's + -- vertical position bit 3 + + MB_N, -- rocket 16x16 image's + -- horizontal position bit 1 + MB_M, -- rocket 16x16 image's + -- horizontal position bit 3 + + MB_P, -- Rocket Missile Video + -- signals that the TV beam + -- is "sweeping" by the current + -- pixel position of an active + -- rocket missile + + MB_R, -- rocket 16x16 image's + -- vertical position bit 2 + + MB_W, -- Rocket Enable + -- signals that the TV beam + -- is "sweeping" by the current + -- position of the 16 x 16 + -- rocket image grid + -- The exact image pixel that + -- the TV beam is sweeping by + -- is provided by + -- horizontal pos bit 0-3: + -- MB_12, MB_N, MB_11, MB_M, + -- vertical pos bit 0-3: + -- MB_15, MB_13, MB_R, MB_14 + -- The information is used + -- by the Memory Board + -- to feed the correct + -- image pixel for further + -- video signal processing + -- at the sync star board + + MB_2_rocket, -- rocket missile + -- sound trigger + MB_2_saucer -- saucer missile + -- sound trigger + : out std_logic + ); +end motion_board; + +architecture motion_board_architecture + of motion_board is + +signal clk : std_logic ; +signal e5_15, missile_timer : std_logic := '0'; +signal f4_8 : std_logic := '1'; +signal d6_1, f6_10, f6_13,f6_4, + e6_6 : std_logic := '1'; + +signal a_rocket_q : unsigned (15 downto 0) + := "0000000000000000"; + +-- signals for horizontal and vertical +-- velocity for the rocket +signal f5_8, f3_10, f3_13, f2_8, + b1_10, e1_6, e1_8, f4_12, + f4_6, a6_12, a5_8 : std_logic; + +signal c1_1, c1_6, d1_1, d1_6 : std_logic; +signal d1_11, c1_15, d1_15, c1_11 : std_logic := '0'; +signal c1_10 : std_logic := '1'; + +signal b4_3, b4_4, d4_3, d4_4 : std_logic ; +signal d5_3, d5_4, b5_4, b5_3 : std_logic ; +signal e4_11, e4_12, e4_13, c4_11, + c4_12, c4_13 : std_logic ; + +signal e4_14, c4_14, d4_11, b4_11 : std_logic ; + +signal missile_life_time_counter : integer := 0; + +--- saucer signals +signal d3_4, d3_3, b3_4, b3_3, e3_11, + e3_13, e3_14, b3_14, a6_10, + a3_8, f3_1, f3_4, g1_8, g1_6, + f1_2, f1_3, e3_12, e3_15 : std_logic; + +signal f1_13, f1_7, f1_6, f1_15_0, + f1_16_0, f1_9_0, f1_10_0, + f1_10, f1_15, f1_16, f1_9 : std_logic; + +signal c3_11, c3_12, c3_13, c3_14, d3_11 : std_logic; +signal c6_1, f6_1 : std_logic; + +signal saucer_q : std_logic_vector (15 downto 0) + := "0000000000000000"; + +-- to simulate pulse to change direction +-- of saucer and to launch saucer +-- missile at the same time +signal clk_count : integer := 0; + +-- saucer missile signals +signal a4_1, a4_2, a4_4, a4_5, a4_13, + a4_12, a4_10, a4_9 : std_logic; +signal a4_3, a4_6, a4_11, a4_8 : std_logic; +signal a2_2, a2_3, a2_5, a2_6, a2_1, a2_4 : std_logic; +signal a1_2, a1_3, a1_6, a1_7, a1_13 : std_logic; +signal a1_15_0, a1_16_0, a1_9_0, a1_10_0 : std_logic; +signal a1_15, a1_16, a1_10, a1_9 : std_logic; +signal b1_1, b6_2, b1_13, g1_3 : std_logic; +signal f4_2 : std_logic := '1'; + +signal e2_15 : std_logic := '0'; +signal d2_4, d2_3, b2_4, b2_3, b1_4 : std_logic; +signal launch_missile : std_logic := '1'; +signal b6_6 : std_logic; +signal b6_5 : std_logic; +signal b6_5_old : std_logic := '0'; +signal delay_count : integer := 0; + +-- signals to manage asynchronous +-- clock design embedded in +-- synchronous clk solutions +signal c1_1_old, c1_6_old, + f1_13_old, a1_13_old : std_logic; + +signal d1_1_old, d1_6_old : std_logic; + +component v74161_16bit + port( + clk : in std_logic; + clrn : in std_logic; + ldn : in std_logic; + enp : in std_logic; + ent : in std_logic; + D : in unsigned (15 downto 0); + Q : out unsigned (15 downto 0); + rco : out std_logic + ); +end component; + +-----------------------------------------------------------------------------// +begin + +----------------------------------------------------------------------------- +-- clk is the game_clk -- +-- replaces a6_8, a6_6, a6_4, a6_2 -- +----------------------------------------------------------------------------- +clk <= not MB_20; + +----------------------------------------------------------------------------- +-- ROCKET MISSILE MOTION: Keep and change position -- +-- 74161 counters: B5, C5, D5, E5 -- +-- -- +-- GENERAL: -- +-- The game screen is defined by the game as a grid of 255 lines -- +-- where each line is divided into 256 pixels, except for one line -- +-- which only has 255 pixels. The reason for the 255 pixels -- +-- has to do with the approach to create object motion - described below -- +-- -- +-- Consequently a full screen consists of: -- +-- 255 pixels at one line + 256 pixels/line x 254 lines = 65.279 pixels -- +-- -- +-- Missiles are 1x1 pixel objects, each saucer is a 16x8 pixel object and -- +-- the rocket is a 16x16 pixel object. -- +-- -- +-- In modern day programming, the object's pixels would be mapped in a -- +-- 256x256 memory buffer, with pointers to each object's position. -- +-- Movement would be simply to change the object's x,y coordinates and -- +-- re-draw the objects in their new position. The TV picture would be -- +-- generated by reading from the memory buffer. -- +-- -- +-- In the world of Computer Space, without RAM, ROM and CPU, a non-buffer -- +-- approach is applied to object "screen draw" and motion. In essence the -- +-- object's pixels are processed and sent to the video signal in sync -- +-- with the TV beam as the beam moves across the screen - without any -- +-- memory buffer. The trick is to use a "relative counter" approach -- +-- where each object keeps track of its own "relative screen position". -- +-- Computer Space uses a 16-bit counter solution (implemented as 4 x 4-bit -- +-- counters) to count all 65.279 pixels. -- +-- -- +-- Full 16 bit counter: (2 raised to the power of 16) -1 = 65.535 -- +-- from 0 - 65.535 = 65.536 positions -- +-- 65.536 pixels max - 1 pixel less on first line - 256 pixels -- +-- for one line less (only 255 lines) = 65.279 -- +-- => starting on 257 (256 +1) and counting 65.278 times to cover -- +-- 65.279 position will have the counter reach its max value 65.535 -- +-- before resetting to zero. -- +-- -- +-- For instance: -- +-- 1) when a 1x1 missile pixel has been drawn, its -- +-- 16 bit counter (4 x 4-bit counters) is reset to 257 -- +-- = (msb:0000 0001 0000 0001 lsb - E5 D5 C5 B5) and its carry flag -- +-- (RCO) is reset to 0. -- +-- 2) For each pixel that the TV beam passes by, the missile position -- +-- counter is increaed by 1 in full sync with the TV beam. -- +-- The RCO-value (=0) is continuously fed to the video signal, which -- +-- equals the color black. -- +-- 3) When the counter reaches 65.535 (1111 1111 1111 1111) and sets -- +-- carry flag (RCO) to '1', the TV beam has travelled across all -- +-- 65.279 pixels (65.535-257+1) and arrived at the missile pixel's -- +-- original position. The RCO flag '1' is fed to the video signal at -- +-- which point the pixel is drawn again (to keep it visible on the -- +-- screen). The value '1' equals the color white -- +-- 4) The counter is reset to 257 again (and RCO is reset), and the -- +-- process starts all over, resulting in a motionless pixel drawn -- +-- onto screen. The exact position of the pixel depends on the TV -- +-- beam's position in relation to when the counter reaches 65.535 -- +-- -- +-- For clarity: the TV beam does not have any pixels to relate to, it is -- +-- a continuous "analogue" sweeping motion across the screen. Instead, -- +-- each "pixel" is a duration of time that translates into a specific -- +-- distance that the TV beam covers as it moves horizontally across the -- +-- screen - line by line. -- +-- -- +-- Horizontal movement: -- +-- Moving the missile pixel horizontally is now a very simple operation. -- +-- By resetting the counter to 256 instead of 257 the counter will have -- +-- to count one extra time (65.280 instead of 65.279) before it reaches -- +-- 65.535 and hence the pixel will move to the right of its previous -- +-- position. -- +-- bit 15.................0 -- +-- 257: 0000 0001 0000 0001 (bit0=1, bit1=0): no movement -- +-- 256: 0000 0001 0000 0000 (bit0=0, bit1=0): movement to the right -- +-- -- +-- Similarly, if the counter is reset to 258, the counter reaches -- +-- 65.535 one pixel ahead of its previous position; a move to the left. -- +-- bit 15.................0 -- +-- 257: 0000 0001 0000 0001 (bit0=1, bit1=0): no movement -- +-- 258: 0000 0001 0000 0010 (bit0=0, bit1=1): movement to the left -- +-- -- +-- Vertical Movement: -- +-- Reset to 1 and the counter have to count a full line (256 pixels) -- +-- extra before it reaches 65.535 - which creates a downward motion -- +-- bit 15.......8.........0 -- +-- 257: 0000 0001 0000 0001 (bit8=1, bit9=0): no movement -- +-- 1: 0000 0000 0000 0001 (bit8=0, bit9=0): movement down -- +-- -- +-- Reset to 513 - and the counter reaches 65.535 one line (256 pixels) -- +-- ahead of its previous position - upward motion. -- +-- bit 15.......8.........0 -- +-- 257: 0000 0001 0000 0001 (bit8=1, bit9=0): no movement -- +-- 513: 0000 0010 0000 0001 (bit8=0, bit9=1): movement up -- +-- -- +-- Resulting motion control signals: -- +-- bit 0: Horizontal movement (0) or not (1) -- +-- bit 1: Move Right (0) or Left (1) -- +-- bit 8: Vertical movement (0) or not (1) -- +-- bit 9: Move Down (0) or Up (1) -- +-- -- +-- Maximum speed: -- +-- The pixel can only move at a maximum pace of 60 pixels/second as the -- +-- TV beam sweeps across the screen 60 times/second (60Hz) for NTSC -- +-- standard. Slower speed can be achieved by moving the object only -- +-- every second screen refresh or less, and let it stand still in between -- +-- -- +-- Counters viewed as horizontal and vertical counters: -- +-- The counters can also be viewed as horizontal (x) and vertical (y) -- +-- D5, E5 - represent the current line (vertical) -- +-- B5, C5 - represent the pixel on that line (horizontal position) -- +-- This view may be a more attractive way of thinking about the relative -- +-- screen position, but keeping in mind that origo of the x,y coordinate -- +-- system for an object is to the left of the object's bottom right corner -- +-- and the first "line" is only 255 pixels. -- +-- -- +-- IMPLEMENTATION: -- +-- The counter represents the relative screen position as a 16-bit binary -- +-- number (with 4 x 4-bit counters) -- +-- -- +-- bits 0 and 1 are for controlling horizontal movement: -- +-- 0: (bit0=0, bit1=0) => right movement one pixel per 1/60s -- +-- 1: (bit0=1, bit1=0) => no horizontal movement -- +-- 2: (bit0=0, bit1=1) => left movement one pixel per 1/60s -- +-- -- +-- bits 8 and 9 are for controlling vertical movement: -- +-- 0 : (bit8=0, bit9=0) => downward movement one pixel per 1/60s -- +-- 256: (bit8=1, bit9=0) => no vertical movement -- +-- 512: (bit8=0, bit9=1) => upward movement one pixel per 1/60s -- +-- -- +-- in VHDL implemented as a 16 bit counter instead of 4 x 4-bit counters -- +----------------------------------------------------------------------------- +missile_motion: v74161_16bit + port map( + clk => clk, + clrn => e6_6, + ldn => f4_8, + enp => '1', + ent => MB_C, + D(15) => '0', + D(14) => '0', + D(13) => '0', + D(12) => '0', + D(11) => '0', + D(10) => '0', + D(9) => d5_4, -- Down (0) or Up (1) + D(8) => d5_3, -- Vertical movement (0) or not (1) + D(7) => '0', + D(6) => '0', + D(5) => '0', + D(4) => '0', + D(3) => '0', + D(2) => '0', + D(1) => b5_4, -- Right (0) or Left (1) + D(0) => b5_3, -- Horizontal movement (0) or not (1) + rco => e5_15 + ); + +d5_3 <= MB_19; -- MB_19 sets the vertical speed + -- constant 1 - no speed + -- constant 0 - speed of 60 pixels/second + -- pulse 0/1 @ 30 Hz rate - speed of 30 pixels/s + -- (a full screen is 255 pixels vertically) + +d5_4 <= f6_13; -- f6_13 sets the vertical direction + -- 0 - down, 1 - up + +b5_4 <= f6_10; -- f6_10 sets the horizontal direction + -- 0 - right, 1 - left + +b5_3 <= MB_17; -- MB_17 sets the horizontal speed + -- constant 1 - no speed + -- constant 0 - speed of 60 pixels/second + -- pulse 0/1 @ 30 Hz rate - speed of 30 pixels/s + -- (a screen is 256 pixels horizontally) + +f4_8 <= not (e5_15); -- trigger load of new start value once + -- counter has reached 65.535 (RCO is high) + +----------------------------------------------------------------------------- +-- Rocket missile video -- +----------------------------------------------------------------------------- +MB_P <= e5_15; -- rocket missile video (=RCO) + +----------------------------------------------------------------------------- +-- ROCKET MISSILE MOTION: VERTICAL SPEED AND DIRECTION LOGIC -- +-- -- +-- f6_13 sets the vertical direction: 0 - down, 1 - up -- +-- its the inverse of MB_18 (which comes from Memory Board) -- +-- Its fed to the missile motion counter, but will only result in vertical -- +-- motion if MB_19 is set to 0 for a specific screen draw -- +----------------------------------------------------------------------------- +f6_13 <= MB_19 nor MB_18; -- MB_19 sets the vertical speed + -- constant 1 - no speed + -- constant 0 - speed of 60 pixels/second + -- pulse 0/1 @ 30 Hz rate - speed of 30 pixels/s + -- (a full screen i 255 pixels vertically) + -- MB_18 sets the vertical direction + -- 0 - up, 1 - down + +----------------------------------------------------------------------------- +-- ROCKET MISSILE MOTION: HORIZONTAL SPEED AND DIRECTION LOGIC -- +-- -- +-- f6_10 sets the horizontal direction: 0 - right, 1 - left -- +-- its the inverse of MB_16 (which comes from Memory Board) in order to -- +-- fit the missile motion counter logic -- +-- Its fed to the missile motion counter, but will only result in -- +-- horizontal motion if MB_17 is set to 0 for a specific screen draw -- +----------------------------------------------------------------------------- +f6_10 <= MB_17 nor MB_16; -- MB_17 sets the horizontal speed + -- constant 1 - no speed + -- constant 0 - speed of 60 pixels/second + -- pulse 0/1 @ 30 Hz rate - speed of 30 pixels/s + -- (a full screen i 256 pixels horizontally) + -- MB_16 sets the horizontal direction + -- 0 - left, 1 - right + +----------------------------------------------------------------------------- +-- ROCKET MISSILE LIFE CYCLE: Timer functionality -- +-- D6, 74121 -- +-- when rocket missile fire button is pressed, the timer starts -- +-- counting the lifetime for the missile, a few seconds. -- +-- Time is dependent on "timer_base_clk" frequency and -- +-- "missile_life_time_counter". Both set in implementation specific code -- +-- MB_2_rocket is used instead of MB_2 and g1_11 - for the rocket missile -- +-- audio. -- +----------------------------------------------------------------------------- +process (timer_base_clk, MB_Y, missile_timer, missile_life_time_counter, rocket_missile_life_time_duration) +begin +if (MB_Y = '1' and missile_timer = '0') then + d6_1 <= '0'; + missile_timer <= '1'; + MB_2_rocket <= '1'; -- rocket missile sound sample trigger on +elsif (rising_edge(timer_base_clk) and missile_timer = '1') then + missile_life_time_counter <= missile_life_time_counter + 1; +elsif (rising_edge(timer_base_clk) and + missile_life_time_counter > rocket_missile_life_time_duration) then + missile_life_time_counter <= 0; + missile_timer <= '0'; + d6_1 <= '1'; + MB_2_rocket <= '0'; -- rocket missile sound sample trigger off +end if; +end process; + +----------------------------------------------------------------------------- +-- ROCKET MISSILE LIFE CYCLE: ROCKET MISSILE LAUNCH & VIDEO ENABLE -- +-- If rocket missile is active then the rocket missile may be displayed -- +-- (final display enable logic is done at Sync Star Board) -- +-- When the missile launches it originates from "the heart" of the -- +-- rocket. -- +-- -- +-- f6_4 is dividing the rocket's 16x16 image grid into four quadrants; -- +-- each an 8x8 pixel image grid. The upper left quadrant's pixels are -- +-- given a value of 1 and the other quadrants' pixels are given a value -- +-- of 0. -- +-- This follows from applying NOR on the MSBs of the rocket's motion -- +-- counters lower nibble for horizontal and vertical counting. -- +-- -- +-- horizontal d4_14 vertical c4_14 => f6_4 (NOR) -- +-- 0000000011111111 0000000000000000 1111111100000000 -- +-- 0000000011111111 0000000000000000 1111111100000000 -- +-- 0000000011111111 0000000000000000 1111111100000000 -- +-- 0000000011111111 0000000000000000 1111111100000000 -- +-- 0000000011111111 0000000000000000 1111111100000000 -- +-- 0000000011111111 0000000000000000 1111111100000000 -- +-- 0000000011111111 0000000000000000 1111111100000000 -- +-- 0000000011111111 0000000000000000 1111111100000000 -- +-- 0000000011111111 1111111111111111 0000000000000000 -- +-- 0000000011111111 1111111111111111 0000000000000000 -- +-- 0000000011111111 1111111111111111 0000000000000000 -- +-- 0000000011111111 1111111111111111 0000000000000000 -- +-- 0000000011111111 1111111111111111 0000000000000000 -- +-- 0000000011111111 1111111111111111 0000000000000000 -- +-- 0000000011111111 1111111111111111 0000000000000000 -- +-- 0000000011111111 1111111111111111 0000000000000000 -- +-- -- +-- The rocket's 16x16 image is always appearing on the last 16 lines and -- +-- last 16 pixels of those lines. -- +-- -- +-- 1) If the missile is not active (d6_1 = 1) then e6_6 will go low -- +-- when the TV beam reaches any pixel in the upper left quadrant, -- +-- and consequently the missile motion counter will be reset. -- +-- 2) When the TV beam moves from the bottom right pixel (the "last" -- +-- pixel) of the 8x8 upper left pixel quadrant into the next quadrant -- +-- then e6_6 moves from low to high and the missile motion counter -- +-- starts counting. -- +-- 3) The above process is repeated for every screen drawn (60 times /s); -- +-- - which means the missile motion counter is always counting and -- +-- ready to go. -- +-- 4) If the missile has become active(missile launch) or is active then -- +-- there will be no clear signal when the TV beam moves into the upper -- +-- left 8x8 pixel quadrant and consequently the missile pixel will -- +-- be displayed as missile motion counter reaches 65.535. -- +-- 5) If it is a missile launch then the pixel will appear one line -- +-- below the rocket's center, immediately to the right of the 8x8 -- +-- upper left quadrant; which is almost in the center/heart of the -- +-- rocket. -- +----------------------------------------------------------------------------- +a6_12 <= not a5_8; -- signals when TV beam is + -- passing by the + -- current position of the + -- rocket's 16x16 image grid + +f6_4 <= d4_11 nor b4_11; -- signals that the TV beam + -- is passing by the upper + -- left 8x8 pixel quadrant + -- of any 16x16 image + -- grid (could be the rocket's) + -- at "16 pixels intervals" and + -- at "16 lines intervals" + +e6_6 <= not (d6_1 and a6_12 and f6_4); -- Missile Active Flag + -- d6_1 signals that the + -- missile is active + -- The combination of a6_12 and + -- f6_4 signals when the TV + -- beam passes by the upper left + -- 8x8 pixel quadrant of the + -- rocket's 16x16 image grid. + -- The resulting signal feeds + -- the Rocket Missile Motion + -- Counter's clrn + -- If the missile is not active + -- when the TV beam moves into + -- the 8x8 pixel quadrant, then + -- the counter will be cleared + -- - and when the TV beam moves + -- from the bottom right pixel + -- (the "last" pixel) of the 8x8 + -- upper left pixel quadrant + -- into the next quadrant then + -- the resulting signal moves + -- from "clear" to "not clear" + -- and starts counting. + -- If the missile has been set + -- to active or is active then + -- there will be no clear signal + -- when the TV beam moves into + -- the upper left 8x8 pixel + -- quadrant and consequently the + -- missile pixel will be + -- displayed as the motion + -- counter reaches 65.535. + -- If it is the launch then the + -- pixel will appear one line + -- below and one pixel to the + -- right of the rocket center + +----------------------------------------------------------------------------- +-- ROCKET MOTION: Keep and change position -- +-- 74161 counters: B4, C4, D4, E4 -- +-- -- +-- Motion principles: -- +-- For basic motion principles, please see explanation above for -- +-- ROCKET MISSILE MOTION. -- +-- Whereas the 1x1 missile pixel is using RCO to feed the video signal -- +-- the rocket needs to feed 16x16 pixels, which requires additional logic. -- +-- The rocket object is placed in the last 16 pixel of the last 16 lines -- +-- that the rocket motion counter (B4,C4,D4,E4) is counting. The very last -- +-- pixel (the bottom right pixel of the 16x16 image grid) is displayed -- +-- at the count of 65.535. -- +-- In this context, it can be useful to view the counter as one -- +-- horizontal counter and one vertical counter. -- +-- -- +-- V: H: 240..............255 -- +-- 239 ..................... -- +-- 240 .....xxxxxxxxxxxxxxxx (240,240)->(255,240) or 61.680->61.695 -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- . .....xxxxxxxxxxxxxxxx . -- +-- 255 .....xxxxxxxxxxxxxxxO (240,255)->(255,255) or 65.520->65.535 -- +-- -- +-- A very simple logic (a5_8) determines when the last 16 pixels for the -- +-- last 16 lines are being counted by the rocket motion counter - by -- +-- simply looking at the MSB nibble -- +-- MSB nibble: 1111 xxxx = 240 - 255 for horizontal -- +-- MSB nibble: 1111 xxxx = 240 - 255 for vertical -- +-- -- +-- If the counter is being reset in the same way as explained for the -- +-- ROCKET MISSILE MOTION to achieve horizontal and/or vertical movement -- +-- then this will consequently imapct all the 16x16 bits, as their -- +-- relative positions are all, naturally, "hanging together". -- +-- -- +-- IMPLEMENTATION: -- +-- The counter represents the relative screen position as a 16-bit binary -- +-- number (with 4 x 4-bit counters) -- +-- -- +-- bits 0 and 1 are for controlling horizontal movement: -- +-- 0: (bit0=0, bit1=0) => right movement one pixel per 1/60s -- +-- 1: (bit0=1, bit1=0) => no horizontal movement -- +-- 2: (bit0=0, bit1=1) => left movement one pixel per 1/60s -- +-- -- +-- Horizontal speed is achieved by changing the frequency -- +-- with which the rocket is set to move horizontally. For instance -- +-- letting the rocket pause every 1/30s and move every 1/30s -- +-- gives the impression of moving one pixel per 1/30s -- +-- -- +-- bits 8 and 9 are for controlling vertical movement: -- +-- 0 : (bit8=0, bit9=0) => downward movement one pixel per 1/60s -- +-- 256: (bit8=1, bit9=0) => no vertical movement -- +-- 512: (bit8=0, bit9=1) => upward movement one pixel per 1/60s -- +-- -- +-- Vertical speed is achieved by changing the frequency -- +-- with which the rocket is set to move vertically. For instance -- +-- letting the rocket pause every 1/30s and move every 1/30s -- +-- gives the impression of moving one pixel per 1/30s -- +-- -- +-- in VHDL implemented as a 16 bit counter instead of 4 x 4-bit counters -- +----------------------------------------------------------------------------- +process (clk) +begin +if rising_edge(clk) then + if MB_C='1' then + if a_rocket_q < 65534 then + a_rocket_q <= a_rocket_q + 1; + elsif a_rocket_q < 65535 then + a_rocket_q <= a_rocket_q + 1; + else + a_rocket_q (0) <= b4_3; -- Horizontal movement (0) or not (1) + a_rocket_q (1) <= b4_4; -- Right (0) or Left (1) + a_rocket_q (2) <= '0'; + a_rocket_q (3) <= '0'; + a_rocket_q (4) <= '0'; + a_rocket_q (5) <= '0'; + a_rocket_q (6) <= '0'; + a_rocket_q (7) <= '0'; + a_rocket_q (8) <= d4_3; -- Vertical movement (0) or not (1) + a_rocket_q (9) <= d4_4; -- Down (0) or Up (1) + a_rocket_q (10) <= '0'; + a_rocket_q (11) <= '0'; + a_rocket_q (12) <= '0'; + a_rocket_q (13) <= '0'; + a_rocket_q (14) <= '0'; + a_rocket_q (15) <= '0'; + end if; + end if; +end if; +end process; + +d4_4 <= f3_10; -- Down (0) or Up (1) + +d4_3 <= f5_8; -- Vertical movement (0) or not (1) + -- constant 1 gives no movemenet + -- pulsing between 0 and 1 at specific + -- frequency intervals + -- gives a range of screen speeds + +b4_4 <= f3_13; -- Right (0) or Left (1) + +b4_3 <= f2_8; -- Horizontal movement (0) or not (1) + -- constant 1 gives no movemenet + -- pulsing between 0 and 1 at specific + -- frequency intervals + -- gives a range of screen speeds + + +d4_11 <= a_rocket_q(11); + +e4_11 <= a_rocket_q(15); +e4_12 <= a_rocket_q(14); +e4_13 <= a_rocket_q(13); +e4_14 <= a_rocket_q(12); +c4_11 <= a_rocket_q(7); +c4_12 <= a_rocket_q(6); +c4_13 <= a_rocket_q(5); +c4_14 <= a_rocket_q(4); + +b4_11 <= a_rocket_q(3); + +-- creating motion board connectors from chip B4 and D4 +MB_M <= a_rocket_q(0); +MB_11 <= a_rocket_q(1); +MB_N <= a_rocket_q(2); +MB_12 <= a_rocket_q(3); + +MB_14 <= a_rocket_q(8); +MB_R <= a_rocket_q(9); +MB_13 <= a_rocket_q(10); +MB_15 <= a_rocket_q(11); + +----------------------------------------------------------------------------- +-- ROCKET MOTION: creating rocket enable signal (active low) -- +-- when the TV beam is passing by the position of the -- +-- rocket's 16 x 16 image grid -- +----------------------------------------------------------------------------- +MB_W <= a5_8; -- Rocket Enable + +a5_8 <= not (c4_11 and c4_12 and c4_13 and c4_14 + and e4_11 and e4_12 and e4_13 and e4_14); + +----------------------------------------------------------------------------- +-- ROCKET MOTION: Vertical direction and velocity -- +-- f3_10 sets the vertical direction: 0 - down, 1 - up -- +-- its the inverse of MB_H (which comes from Memory Board) in order to -- +-- fit the rocket motion counter logic -- +-- Its fed to the rocket motion counter, but will only result in -- +-- vertical motion when f5_8 is set to 0 for a specific screen draw -- +----------------------------------------------------------------------------- +f3_10 <= MB_H nor f5_8; -- MB_H sets the vertical direction + -- 0 - up, 1 - down + -- f5_8 sets the vertical speed + -- pulses 0/1:s at discrete frequencies which + -- will make the rocket move a pixel at specific + -- intervals and create a range of rocket speeds + -- 1 - no speed + -- 0 - one pixel movement per new screen draw + +----------------------------------------------------------------------------- +-- ROCKET MOTION: Horizontal direction and velocity -- +-- f6_13 sets the horizontal direction: 0 - right, 1 - left -- +-- its the inverse of MB_J (which comes from Memory Board) in order to -- +-- fit the rocket motion counter logic -- +-- Its fed to the rocket motion counter, but will only result in -- +-- horizontal motion when f2_8 is set to 0 for a specific screen draw -- +----------------------------------------------------------------------------- +f3_13 <= MB_J nor f2_8; -- MB_J sets the horizontal direction + -- 0 - left, 1 - right + -- f2_8 sets the horizontal speed + -- pulses 0/1:s at discrete frequencies which + -- will make the rocket move a pixel at specific + -- intervals and create a range of rocket speeds + -- 1 - no speed + -- 0 - one pixel movement per new screen draw + +----------------------------------------------------------------------------- +-- ROCKET VELOCITY: Vertical screen velocity pulse train -- +-- Mixing the rocket's current vertical velocity level (0-7) with base -- +-- frequencies to create a range of discrete frequencies that will -- +-- increase with velocity level. -- +-- Higher frequency results in rocket moving more frequent and -- +-- consequently achieving a higher vertical speed on screen. -- +----------------------------------------------------------------------------- +f5_8 <= not ((MB_V and b1_10) or (MB_U and f4_6) or (MB_T and f4_12)); + +----------------------------------------------------------------------------- +-- ROCKET VELOCITY: Horizontal screen velocity pulse train -- +-- Mixing the rocket's current horizontal velocity level (0-7) with base -- +-- frequencies to create a range of discrete frequencies that will -- +-- increase with velocity level. -- +-- Higher frequency results in rocket moving more frequent and -- +-- consequently achieving a higher horizontal speed on screen. -- +----------------------------------------------------------------------------- +f2_8 <= not ((MB_4 and b1_10) or (MB_D and f4_6) or (MB_3 and f4_12)); + +----------------------------------------------------------------------------- +-- ROCKET VELOCITY: Frequency mixing -- +-- create frequencies used as a basis to create a range of discrete rocket -- +-- velocities -- +-- b1_10: 15 Hz frequency pulse train with positive pulse lasting 1/30 s -- +-- f4_6 : 7,5 Hz fequency pulse train with positive pulse lasting 1/30 s -- +-- f4_12: 3.25 Hz fequency pulse train with positive pulse lasting 1/30 s -- +----------------------------------------------------------------------------- +b1_10 <= c1_15 nor c1_10; + +e1_6 <= not (c1_15 and c1_10 and d1_6 and d1_6); -- 7420 (nand) + -- wrong gate + -- marking (7402 nor) + -- on original + -- schematics + +f4_6 <= not e1_6; + +e1_8 <= not (c1_10 and d1_15 and c1_15 and d1_11); -- 7420 (nand) + -- wrong gate + -- marking (7402 nor) + -- on original + -- schematics + +f4_12 <= not e1_8; + +----------------------------------------------------------------------------- +-- ROCKET VELOCITY: FREQUENCY DIVIDER LOGIC -- +-- Flip-Flops C1 & D1 -- +-- Frequency division as a base to create a range of discrete rocket -- +-- velocities -- +-- c1_15: 30 Hz pulse train -- +-- c1_10: 15 Hz pulse train -- +-- d1_15: 7.5 Hz pulse train -- +-- di_11: 3.25 Hz pulse train -- +-- MB_B : 30 Hz pulse train used by Memory Board to create rocket missile -- +-- speed -- +----------------------------------------------------------------------------- +c1_1 <= e3_11; + +process (super_clk) +begin +if rising_edge (super_clk) then + c1_1_old <= c1_1; + if (c1_1_old = '1') and (c1_1 = '0') then + c1_15 <= not c1_15; + end if; +end if; +end process; + +MB_B <= c1_15; + +c1_6 <= c1_15; + +process (super_clk) +begin +if rising_edge (super_clk) then + c1_6_old <= c1_6; + if (c1_6_old = '1') and (c1_6 = '0') then + c1_11 <= not c1_11; + c1_10 <= not c1_10; + end if; +end if; +end process; + +d1_1 <= c1_11; + +process (super_clk) +begin +if rising_edge (super_clk) then + d1_1_old <= d1_1; + if (d1_1_old = '1') and (d1_1 = '0') then + d1_15 <= not d1_15; + end if; +end if; +end process; + +d1_6 <= d1_15; + +process (super_clk) +begin +if rising_edge (super_clk) then + d1_6_old <= d1_6; + if (d1_6_old = '1') and (d1_6 = '0') then + d1_11 <= not d1_11 ; + end if; +end if; +end process; + +----------------------------------------------------------------------------- +-- SAUCER MOTION: Keep and change position -- +-- 74161 counters: B3, C3, D3, E3 -- +-- -- +-- Motion principles: -- +-- For basic motion principles, please see explanation above for -- +-- ROCKET MOTION. -- +-- -- +-- bits 0 and 1 are for controlling horizontal movement: -- +-- (bit0=0, bit1=1) => no horizontal movement -- +-- (bit0=1, bit1=1) => right movement one pixel per 1/60s -- +-- (bit0=1, bit1=0) => left movement one pixel per 1/60s -- +-- -- +-- The de facto horizontal speed is achieved by moving the saucer every -- +-- 1/30s. This is achived by pulsing the movement signal on/off every -- +-- second screen draw (=>30Hz) -- +-- -- +-- bits 8 and 9 are for controlling vertical movement: -- +-- (bit8=0, bit9=1) => no vertical movement -- +-- (bit8=1, bit9=1) => downward movement one pixel per 1/60s -- +-- (bit8=1, bit9=0) => upward movement one pixel per 1/60s -- +-- -- +-- The de facto vertical speed is achieved by moving the saucer every -- +-- 1/30s. This is achived by pulsing the movement signal on/off every -- +-- second screen draw (=>30Hz) -- +-- -- +-- Implemented as a 16 bit counter instead of 4 x 4 bit counters -- +----------------------------------------------------------------------------- +process (clk) +begin +if rising_edge(clk) then + if MB_C='1' then + if saucer_q < 65534 then + saucer_q <= saucer_q + 1; + e3_15 <= '0'; + elsif saucer_q < 65535 then + saucer_q <= saucer_q + 1; + e3_15 <= '1'; + else + e3_15 <= '0'; + saucer_q (0) <= b3_3; -- Horizontal movement (0) or not (1) + saucer_q (1) <= b3_4; -- Right (0) or Left (1) + saucer_q (2) <= '0'; + saucer_q (3) <= '0'; + saucer_q (4) <= '0'; + saucer_q (5) <= '0'; + saucer_q (6) <= '0'; + saucer_q (7) <= '0'; + saucer_q (8) <= d3_3; -- Vertical movement (0) or not (1) + saucer_q (9) <= d3_4; -- Down (0) or Up (1) + saucer_q (10) <= '0'; + saucer_q (11) <= '0'; + saucer_q (12) <= '0'; + saucer_q (13) <= '0'; + saucer_q (14) <= '0'; + saucer_q (15) <= '0'; + end if; + end if; +end if; +end process; + +d3_4 <= f3_1; -- Down (0) or Up (1) + +d3_3 <= g1_8; -- Vertical movement (0) or not (1) + -- constant 1 gives no movemenet + -- pulsing between 0 and 1 at 30Hz + -- gives a 30 pixels/s screen speed + +b3_4 <= f3_4; -- Right (0) or Left (1) + +b3_3 <= g1_6; -- Horizontal movement (0) or not (1) + -- constant 1 gives no movemenet + -- pulsing between 0 and 1 at 30Hz + -- gives a 30 pixels/s screen speed + +-- creating motion board connectors from chip B4 and D4 +MB_E <= saucer_q(0); +MB_5 <= saucer_q(1); +MB_F <= saucer_q(2); +MB_6 <= saucer_q(3); + +MB_L <= saucer_q(8); +MB_9 <= saucer_q(9); +MB_K <= saucer_q(10); +MB_8 <= saucer_q(11); + + +b3_14 <= saucer_q(0); +c3_11 <= saucer_q(7); +c3_12 <= saucer_q(6); +c3_13 <= saucer_q(5); +c3_14 <= saucer_q(4); + +d3_11 <= saucer_q(11); + +e3_11 <= saucer_q(15); +e3_12 <= saucer_q(14); +e3_13 <= saucer_q(13); +e3_14 <= saucer_q(12); + +----------------------------------------------------------------------------- +-- SAUCER MOTION: creating saucer enable signal (active low) -- +-- when the TV beam is passing by the position of either one of the -- +-- saucer's 16 x 8 image grids -- +----------------------------------------------------------------------------- +MB_21 <= not a3_8; --saucer_enable + + a3_8 <= not (c3_11 and c3_12 and c3_13 and c3_14 + and e3_12 and e3_13 and e3_14 and d3_11); + +----------------------------------------------------------------------------- +-- SAUCER MOTION: saucer vertical direction and speed -- +-- f3_1 sets the vertical direction: 0 - down, 1 - up -- +-- its the inverse of f1_9 in order to fit the saucer motion counter -- +-- logic -- +-- Its fed to the saucer motion counter, but will only result in -- +-- vertical motion when g1_8 is set to 0 for a specific screen draw -- +----------------------------------------------------------------------------- +f3_1 <= f1_9 nor g1_8; -- f1_9 sets the vertical direction + -- 0 - up, 1 - down + -- g1_8 sets the vertical speed + -- it is either constant 1 - no speed or + -- pulses 0/1:s at 30Hz frequency which + -- will make the saucer move 30 pixels/s + -- 0 - one pixel movement per new screen draw + +----------------------------------------------------------------------------- +-- SAUCER MOTION: saucer horizontal direction and speed -- +-- f3_4 sets the horizontal direction: 0 - right, 1 - left -- +-- its the inverse of f1_15 in order to fit the saucer motion counter -- +-- logic -- +-- Its fed to the saucer motion counter, but will only result in -- +-- horizontal motion when g1_6 is set to 0 for a specific screen draw -- +----------------------------------------------------------------------------- +f3_4 <= f1_15 nor g1_6; -- f1_15 sets the horizontal direction + -- 0 - left, 1 - right + -- g1_6 sets the horizontal speed + -- it is either constant 1 - no speed or + -- pulses 0/1:s at 30Hz frequency which + -- will make the saucer move 30 pixels/s + -- 0 - one pixel movement per new screen draw + +----------------------------------------------------------------------------- +-- SAUCER VELOCITY: Saucer vertical speed -- +-- "Filters" the frequency that is the basis for saucer speed -- +----------------------------------------------------------------------------- +g1_8 <= f1_10 nand c1_15; -- f1_10 is a flag that signals whether + -- the saucer should have vertical speed or not + -- c1_15 is a 30Hz frequency that is passed + -- through to g1_8 when f1_10 = 1 + +----------------------------------------------------------------------------- +-- SAUCER VELOCITY: Saucer horizontal speed -- +-- "Filters" the frequency that is the basis for saucer speed -- +----------------------------------------------------------------------------- +g1_6 <= f1_16 nand c1_15; -- f1_16 is a flag that signals whether + -- the saucer should have vertical speed or not + -- c1_15 is a 30Hz frequency that is passed + -- through to g1_6 when f1_16 = 1 + +----------------------------------------------------------------------------- +-- SAUCER DIRECTION SELECTION: Load and lock new or same direction -- +-- F1 7475 -- +-- 4-bit bistable latch -- +-- emulated as a clocked version -- +-- determines the next saucer direction -- +----------------------------------------------------------------------------- +f1_2 <= e3_11; -- 60 Hz frequency in sync with + -- final saucer pixel being drawn to screen + +f1_3 <= b3_14; +f1_13 <= f6_1; +f1_7 <= e3_12; +f1_6 <= e3_13; + +process (clk) +begin +if rising_edge (clk) then + f1_13_old <= f1_13; + if (f1_13_old = '0') and (f1_13 = '1') then + f1_15 <= f1_3; -- vertical velocity or not + f1_16 <= f1_2; -- horizontal velocity or not + f1_9 <= f1_7; -- vertical direction up/down + f1_10 <= f1_6; -- horizontal direction left/right + end if; +end if; +end process; + +----------------------------------------------------------------------------- +-- SAUCER MISSILE LIFECYCLE AND DIRECTION CHANGE TIMER -- +-- C6 74121 - Schmitt Astabile Multivibrator -- +-- Drive change of c6_1 as an emulation of b6_8/10/12 + 250uF and the -- +-- 74121 set-up -- +----------------------------------------------------------------------------- +process (timer_base_clk) +begin +if rising_edge (timer_base_clk) then + if c6_1 = '0' then + if clk_count < saucer_missile_life_time_duration then + clk_count <= clk_count+1; + else + clk_count <= 0; -- reset clock_count to start a new pulse wave + c6_1 <= '1'; + end if; + elsif c6_1 = '1' then + if clk_count < saucer_missile_hold_duration then + clk_count <= clk_count+1; + else + clk_count <= 0; -- reset clock_count to start a new pulse wave + c6_1 <= '0'; + end if; + end if; +end if; +end process; + +-- special case; assign input of b6_6 the input value (operand then applies +-- with delay on b6_6 below) +b6_5 <= c6_1; + +----------------------------------------------------------------------------- +-- SAUCER DIRECTION SELECTION: Create direction change pulse -- +-- Drive change of b6_6 as an emulation of delay caused by b6 and .2F Cap -- +-- Create the pulse that will load the saucer's new (or the same) -- +-- direction -- +-- The pulse is somewhat delayed in relation to the launch of the saucer -- +-- missile, creating the effect that the saucer will first launch its -- +-- missile and thereafter change (or maintain) direction -- +----------------------------------------------------------------------------- +process (timer_base_clk) +begin +if rising_edge (timer_base_clk) then + b6_5_old <= b6_5; + if b6_5_old = '0' and b6_5 = '1' then + -- if rising edge , initiate a delay before output changes + delay_count <= 0; + elsif b6_5_old = '0' and b6_5 = '1' then + -- if falling edge , initiate a delay before output changes + delay_count <= 0; + else + if delay_count < signal_delay_duration then + delay_count <= delay_count +1; + else + delay_count <= 0; + b6_6 <= not b6_5; + -- change output after signal delay; this causes a signal spike + end if; + end if; +end if; +end process; + +f6_1 <= c6_1 nor b6_6; + +----------------------------------------------------------------------------- +-- SAUCER MISSILE AI LOGIC: Rocket's position relative current TV beam pos -- +-- A4, 7486 -- +-- quadruple 2-input xor gates -- +-- Identify how the current TV beam position relates to the rocket's -- +-- vertical and horizontal position. -- +-- -- +-- The complete missile AI logic will determine whether the rocket is to -- +-- the left or to the right of (or on level with) the saucer and whether -- +-- it is below or above (or on plane with) the saucer. This will control -- +-- the saucer missile's launch direction. -- +-- If the rocket and the saucer are very close to each other -- +-- then the saucer missile will not get any movement and instead become -- +-- a "mine" (a missile that appears like a motionless star that exists -- +-- for a while and then disappears) -- +----------------------------------------------------------------------------- +a4_1 <= e4_11; +a4_2 <= e4_12; +a4_4 <= e4_12; +a4_5 <= e4_13; +a4_13 <= c4_11; +a4_12 <= c4_12; +a4_10 <= c4_12; +a4_9 <= c4_13; + +a4_3 <= a4_1 xor a4_2; -- current TV beam position + -- above or below the rocket's 16x16 image + -- position within 65 - 255 pixels (=1) + -- or within 64 pixels (=0) + +a4_6 <= a4_4 xor a4_5; -- current TV beam position + -- above or below the rocket's 16x16 image + -- position within 33 - 191 pixels (=1) + -- or within 32 pixels (=0) + +a4_11 <= a4_13 xor a4_12; -- current TV beam position + -- to the left or to the right of + -- the rocket's 16x16 image position + -- within 65 - 255 pixels (=1) + -- or within 64 pixels (=0) + +a4_8 <= a4_10 xor a4_9; -- current TV beam position + -- to the left or to the right of + -- the rocket's 16x16 image position + -- within 33 - 191 pixels (=1) + -- or within 32 pixels (=0) + +----------------------------------------------------------------------------- +-- SAUCER MISSILE AI LOGIC: Current TV beam pos very close to rocket? -- +-- A2, 7402 -- +-- quadruple 2-input nor gates -- +-- if the current TV beam position is very close to the rocket vertically -- +-- and/or horizontally; sets a flag. Used by downstream logic to prevent -- +-- saucer missile motion vertically and/or horizontally. -- +-- -- +-- The complete missile AI logic will determine whether the rocket is to -- +-- the left or to the right of (or on level with) the saucer and whether -- +-- it is below or above (or on plane with) the saucer. This will control -- +-- the saucer missile's launch direction. -- +-- If the rocket and the saucer are very close to each other -- +-- then the saucer missile will not get any movement and instead become -- +-- a "mine" (a missile that appears like a motionless star that exists -- +-- for a while and then disappears) -- +----------------------------------------------------------------------------- +a2_2 <= a4_3; +a2_3 <= a4_6; +a2_5 <= a4_11; +a2_6 <= a4_8; + +a2_1 <= a2_2 nor a2_3; -- current TV beam position + -- above or below the rocket's 16x16 image + -- position within 32 pixels (=1) + +a2_4 <= a2_5 nor a2_6; -- current TV beam position + -- to the left or to the right of + -- the rocket's 16x16 image position + -- within 32 pixels (=1) + +----------------------------------------------------------------------------- +-- SAUCER MISSILE AI LOGIC: Launch missile! -- +-- when the saucer missile timer is reset and starts counting (c6_1) and -- +-- the missile carrying saucer's last pixel has just been drawn to screen -- +-- (e3_15) then this creats a short combined pulse (g1_3) that will be -- +-- used to: -- +-- 1) lock the current saucer missile direction input value (A1) -- +-- 2) load those values into the saucer missile motion logic and -- +-- allow the saucer missile to launch -- +----------------------------------------------------------------------------- +g1_3 <= c6_1 nand e3_15; +b6_2 <= not g1_3; + +----------------------------------------------------------------------------- +-- SAUCER MISSILE AI LOGIC: Load saucer missile direction input values -- +-- input to A1, 7475 -- +-- The inputs, their values and their donwstream impact: -- +-- c4_14: -- +-- 0=rocket is closer to the left of current TV beam position -- +-- => right bound missile motion -- +-- 1=rocket is closer to the right of current TV beam position -- +-- => leftbound missile motion -- +-- -- +-- e4_14: -- +-- 0=rocket is closer above current TV beam position -- +-- => upward missile motion -- +-- 1=rocket is closer below current TV beam position -- +-- => downward missile motion -- +-- -- +-- c4_14 and e4_14 are the msb for horizontal and vertical rocket count -- +-- which in one view point counts how far "away" from the rocket the TV -- +-- beam is -- +-- -- +-- a2_4 -- +-- 1= current TV beam position to the left or to the right of -- +-- the rocket's 16x16 image position within 32 pixels -- +-- and should prevent horizontal saucer missile motion -- +-- 0= not within 32 pixels -- +-- -- +-- a2_1 -- +-- 1= current TV beam position below or above -- +-- the rocket's 16x16 image position within 32 pixels -- +-- and should prevent vertical saucer missile motion -- +-- 0= not within 32 pixels -- +----------------------------------------------------------------------------- +a1_2 <= a2_4; -- 1d (data input) + +a1_3 <= c4_11; -- 2d (data input) + +a1_6 <= a2_1; -- 3d (data input) + +a1_7 <= e4_11; -- 4d (data input) + +a1_13 <= b6_2; -- 1c, 2c (enable) + +----------------------------------------------------------------------------- +-- SAUCER MISSILE AI LOGIC: Lock saucer missile direction input values -- +-- A1, 7475 -- +-- 4-bit bistable latch -- +-- when enable is high, output q will follow input data d -- +-- when enable goes low; data input at time of transition to low -- +-- will be retained at output q -- +-- -- +-- When missile is about to launch it is synchronized with current TV -- +-- beam position, and consequently its relative position to the rocket. -- +----------------------------------------------------------------------------- +process (clk) +begin +if rising_edge (clk) then + a1_13_old <= a1_13; + if (a1_13_old = '1') and (a1_13 = '0') then + a1_15 <= a1_3; + a1_16 <= a1_2; + a1_9 <= a1_7; + a1_10 <= a1_6; + end if; +end if; +end process; + +----------------------------------------------------------------------------- +-- SAUCER MISSILE AI LOGIC: horizontal movement feed -- +-- -- +-- a1_15 (=c4_14): -- +-- 0=rocket is closer to the left of current TV beam position -- +-- => right bound missile motion -- +-- 1=rocket is closer to the right of current TV beam position -- +-- => leftbound missile motion -- +-- -- +-- a1_16 (=a2_4) -- +-- 1= current TV beam position to the left or to the right of -- +-- the rocket's 16x16 image position within 32 pixels -- +-- and should prevent horizontal saucer missile motion -- +-- 0= not within 32 pixels -- +----------------------------------------------------------------------------- +b1_1 <= a1_15 nor a1_16; -- right or left motion + +----------------------------------------------------------------------------- +-- SAUCER MISSILE AI LOGIC: vertical movement feed -- +-- -- +-- a1_9 (=e4_14): -- +-- 0=rocket is closer above current TV beam position -- +-- => upward missile motion -- +-- 1=rocket is closer below current TV beam position -- +-- => downward missile motion -- +-- -- +-- a1_10 (=a2_1) -- +-- 1= current TV beam position below or above -- +-- the rocket's 16x16 image position within 32 pixels -- +-- and should prevent vertical suacer missile motion -- +-- 0= not within 32 pixels -- +----------------------------------------------------------------------------- +b1_13 <= a1_10 nor a1_9; -- up or down motion + +----------------------------------------------------------------------------- +-- SAUCER MISSILE MOTION: Keep and change position -- +-- 74161 counters: B2, C2, D2, E2 -- +-- -- +-- Motion principles: -- +-- For basic motion principles, please see explanation above for -- +-- ROCKET MISSILE MOTION. -- +-- -- +-- bits 0 and 1 are for controlling horizontal movement: -- +-- (bit0=0, bit1=1) => no horizontal movement -- +-- (bit0=1, bit1=1) => right movement one pixel per 1/60s -- +-- (bit0=1, bit1=0) => left movement one pixel per 1/60s -- +-- -- +-- bits 8 and 9 are for controlling vertical movement: -- +-- (bit8=0, bit9=1) => no vertical movement -- +-- (bit8=1, bit9=1) => downward movement one pixel per 1/60s -- +-- (bit8=1, bit9=0) => upward movement one pixel per 1/60s -- +-- -- +-- implemented as a 16 bit counter instead of 4 x 4-bit counters -- +----------------------------------------------------------------------------- +saucer_missile: v74161_16bit + port map( + clk => clk, + clrn => g1_3, + ldn => f4_2, + enp => '1', + ent => MB_C, + D(15) => '0', + D(14) => '0', + D(13) => '0', + D(12) => '0', + D(11) => '0', + D(10) => '0', + D(9) => d2_4, -- Down (0) or Up (1) + D(8) => d2_3, -- Vertical movement (0) or not (1) + D(7) => '0', + D(6) => '0', + D(5) => '0', + D(4) => '0', + D(3) => '0', + D(2) => '0', + D(1) => b2_4, -- Right (0) or Left (1) + D(0) => b2_3, -- Horizontal movement (0) or not (1) + rco => e2_15 + ); + +b2_4 <= b1_1; -- Right (0) or Left (1) + +b2_3 <= a1_16; -- Horizontal movement (0) or not (1) + -- either constant 1 - no movement; or + -- constant 0 - "60Hz" horizontal speed + -- (60 pixels / second) + +d2_3 <= a1_10; -- Vertical movement (0) or not (1) + -- either constant 1 - no movement; or + -- constant 0 - "60Hz" vertical speed + -- (60 pixels / second) + +d2_4 <= b1_13; -- Down (0) or Up (1) + + +f4_2 <= not (e2_15); -- RCO enables the load of value for next cycle + +----------------------------------------------------------------------------- +-- Saucer missile video -- +----------------------------------------------------------------------------- +MB_10 <= e2_15; -- RCO + +----------------------------------------------------------------------------- +-- Saucer missile audio -- +----------------------------------------------------------------------------- +--b1_4 <= d2_13 nor c6_1; -- original schematics (correct) + -- but can not use freq from d2_13 as the + -- audio is generated from a sample +b1_4 <= not c6_1; -- instead, to trigger sample + +MB_2_saucer <= b1_4; -- saucer missile sound sample trigger + -- instead of MB_2 + + +end motion_board_architecture; \ No newline at end of file diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/osd.v b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_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/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/pll.qip b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_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/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/pll.v b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/pll.v new file mode 100644 index 00000000..3d37470a --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/pll.v @@ -0,0 +1,376 @@ +// 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 ( + areset, + inclk0, + c0, + c1, + c2, + locked); + + input areset; + input inclk0; + output c0; + output c1; + output c2; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [4:0] sub_wire0; + wire sub_wire2; + wire [0:0] sub_wire7 = 1'h0; + wire [2:2] sub_wire4 = sub_wire0[2:2]; + wire [0:0] sub_wire3 = sub_wire0[0:0]; + wire [1:1] sub_wire1 = sub_wire0[1:1]; + wire c1 = sub_wire1; + wire locked = sub_wire2; + wire c0 = sub_wire3; + wire c2 = sub_wire4; + wire sub_wire5 = inclk0; + wire [1:0] sub_wire6 = {sub_wire7, sub_wire5}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire6), + .clk (sub_wire0), + .locked (sub_wire2), + .activeclock (), + .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 (), + .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 = 5, + altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 27, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 50, + altpll_component.clk1_phase_shift = "0", + altpll_component.clk2_divide_by = 27, + altpll_component.clk2_duty_cycle = 50, + altpll_component.clk2_multiply_by = 20, + 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_USED", + 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_USED", + 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.self_reset_on_loss_lock = "OFF", + 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 "27" +// 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 "5.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "50.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "20.000000" +// 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 "1" +// 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 "5" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "50" +// Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "20" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "5.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "50.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "20.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +// 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 "ps" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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 "5" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "27" +// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "20" +// 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_USED" +// 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_USED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// 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: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_diode_images.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_diode_images.vhd new file mode 100644 index 00000000..b4704c06 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_diode_images.vhd @@ -0,0 +1,182 @@ +----------------------------------------------------------------------------- +-- ROCKET DIODE IMAGES LOGIC -- +-- For use with Computer Space FPGA emulator. -- +-- emulates the rocket diode matrix function -- +-- on Computer Space's Motion Board -- +-- -- +-- This entity is implementation agnostic -- +-- -- +-- v1.0 -- +-- by Mattias G, 2015 -- +-- Enjoy! -- +----------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +library work; + +--80--------------------------------------------------------------------------| + +entity rocket_diode_images is + port ( + image_select : in integer range 0 to 3; + -- select rocket image + -- 0-3 + + rocket_hor, rocket_ver : in integer range 0 to 15; + -- address the + -- horizontal and + -- vertical slices of + -- the rocket diode + -- matrix images + + diode_left_column, + diode_right_column : in std_logic; + -- indicate + -- whether right column or + -- left column should show + -- rocket engine flames + + out_image_bit : out std_logic + ); + +end rocket_diode_images; + +architecture rocket_diode_images_architecture + of rocket_diode_images is + +-- ROCKET IMAGES +type image_line_16_bit is array (0 to 15) + of std_logic; +type image_line_8_bit is array (0 to 7) + of std_logic; + +type rocket_image is array(0 to 15) of + image_line_16_bit; + +-- defining signal to load +-- images from the arrays +signal image_line : image_line_16_bit; +signal I_rocket_hor, I_rocket_ver : integer range 0 to 15; +signal rocket_engine_flame : std_logic; + +-- rocket image no 0 +signal rocket_image_0 : rocket_image := ( +("0000000000000000"), +("0000000000010000"), +("0001000000000000"), +("0000000001000000"), +("0000010000000100"), +("0100000000000000"), +("0000000000000000"), +("0000000000010000"), +("0000100000000000"), +("0000000000010000"), +("0000100000000000"), +("0000000000010000"), +("0000010000000000"), +("0000000000100000"), +("0000001000000000"), +("0000000010000000") +); + +-- rocket image no 1 +signal rocket_image_1 : rocket_image := ( +("0000000000100000"), +("0000000000000000"), +("0000000000000100"), +("0010000010000000"), +("0000010000000000"), +("0000000000000000"), +("0100000000010000"), +("0000000000000000"), +("0000100000001000"), +("0000000000000000"), +("0000100000001000"), +("0000000000000000"), +("0000010000000000"), +("0000000000010000"), +("0000000100000000"), +("0000000000100000") +); + +-- rocket image no 2 +signal rocket_image_2 : rocket_image := ( +("0000000010000000"), +("0000000000000000"), +("0000000000010000"), +("0000000100000000"), +("0100000000000000"), +("0000100000100000"), +("0000000000000000"), +("0100100000010000"), +("0000000000000000"), +("0000000000001000"), +("0000010000000000"), +("0000000000000000"), +("0000000100001000"), +("0000000000000000"), +("0000000001010000"), +("0000000000000000") +); + +-- rocket image no 3 +signal rocket_image_3 : rocket_image := ( +("0000000100000000"), +("0000000000100000"), +("0000000000000000"), +("0000001000000000"), +("0000000000000000"), +("1000000000100000"), +("0001000000010000"), +("0000000000000000"), +("0000000000001000"), +("0100000000000000"), +("0000010000000000"), +("0000001000000100"), +("0000000010000000"), +("0000000000101000"), +("0000000000000000"), +("0000000000000000") +); + +----------------------------------------------------------------------------// + +begin + +I_rocket_hor <= rocket_hor; +I_rocket_ver <= rocket_ver; + +image_line <= -- DECODE + rocket_image_0 (I_rocket_hor) when image_select = 0 else + rocket_image_1 (I_rocket_hor) when image_select = 1 else + rocket_image_2 (I_rocket_hor) when image_select = 2 else + rocket_image_3 (I_rocket_hor); + +rocket_engine_flame <= +-- please note that the flame diodes are connected to other parts of the +-- 74150 than what they appear looking at the diode matrix on the +-- Computer Space schematics. +-- Also note that pin 8 is equal to "I_rocket_ver = 0" + + (diode_left_column or diode_right_column) when (image_select = 0 and + I_rocket_ver = 7) else + + diode_left_column when (image_select = 1 and I_rocket_ver = 5) else + + diode_right_column when (image_select = 1 and I_rocket_ver = 6) else + + diode_left_column when (image_select = 2 and I_rocket_ver = 3) else + + diode_right_column when (image_select = 2 and I_rocket_ver = 4) else + + diode_left_column when (image_select = 3 and I_rocket_ver = 1) else + + diode_right_column when (image_select = 3 and I_rocket_ver = 3) else + + '0'; + +out_image_bit <= image_line (I_rocket_ver) or rocket_engine_flame; + +end rocket_diode_images_architecture; \ No newline at end of file diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_rotate.qip b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_rotate.qip new file mode 100644 index 00000000..320dc837 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_rotate.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "ROM: 1-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "rocket_rotate.vhd"] diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_rotate.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_rotate.vhd new file mode 100644 index 00000000..15c06db2 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_rotate.vhd @@ -0,0 +1,143 @@ +-- megafunction wizard: %ROM: 1-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: rocket_rotate.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY rocket_rotate IS + PORT + ( + address : IN STD_LOGIC_VECTOR (10 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END rocket_rotate; + + +ARCHITECTURE SYN OF rocket_rotate IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => "rotate_8_11.hex", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2048, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => "CLOCK0", + widthad_a => 11, + width_a => 8, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + q_a => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +-- Retrieval info: PRIVATE: AclrByte NUMERIC "0" +-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clken NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "rotate_8_11.hex" +-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "2048" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: RegAddr NUMERIC "1" +-- Retrieval info: PRIVATE: RegOutput NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: SingleClock NUMERIC "1" +-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +-- Retrieval info: PRIVATE: WidthAddr NUMERIC "11" +-- Retrieval info: PRIVATE: WidthData NUMERIC "8" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: INIT_FILE STRING "rotate_8_11.hex" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "2048" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "11" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: address 0 0 11 0 INPUT NODEFVAL "address[10..0]" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +-- Retrieval info: CONNECT: @address_a 0 0 11 0 address 0 0 11 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_rotate.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_rotate.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_rotate.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_rotate.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_rotate_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_shooting.qip b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_shooting.qip new file mode 100644 index 00000000..27a0f2c5 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_shooting.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "ROM: 1-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "rocket_shooting.vhd"] diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_shooting.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_shooting.vhd new file mode 100644 index 00000000..8db6b9da --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_shooting.vhd @@ -0,0 +1,143 @@ +-- megafunction wizard: %ROM: 1-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: rocket_shooting.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY rocket_shooting IS + PORT + ( + address : IN STD_LOGIC_VECTOR (12 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END rocket_shooting; + + +ARCHITECTURE SYN OF rocket_shooting IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => "rocket_shooting_8_11.hex", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 8192, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => "CLOCK0", + widthad_a => 13, + width_a => 8, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + q_a => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +-- Retrieval info: PRIVATE: AclrByte NUMERIC "0" +-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clken NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "rocket_shooting_8_11.hex" +-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8192" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: RegAddr NUMERIC "1" +-- Retrieval info: PRIVATE: RegOutput NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: SingleClock NUMERIC "1" +-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +-- Retrieval info: PRIVATE: WidthAddr NUMERIC "13" +-- Retrieval info: PRIVATE: WidthData NUMERIC "8" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: INIT_FILE STRING "rocket_shooting_8_11.hex" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "8192" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: address 0 0 13 0 INPUT NODEFVAL "address[12..0]" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +-- Retrieval info: CONNECT: @address_a 0 0 13 0 address 0 0 13 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_shooting.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_shooting.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_shooting.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_shooting.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_shooting_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_shooting_8_11.hex b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_shooting_8_11.hex new file mode 100644 index 00000000..c0fa8d01 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_shooting_8_11.hex @@ -0,0 +1,629 @@ +:2000000002FEFBFFF8F7FDF9FD01FF0403FD0201FB0202FF0606060A030206FFFE03FE02D8 +:2000200006020504FD00FFF7FDFDF90200FD02FDFBFFF8F8FEFAFD03000405FE0203FC01E0 +:2000400003FF0707030701FD03FEFB00FDFE03000204FF0103FCFF00FC0202000501FD0186 +:20006000FDFAFFFCFC01FF0103FE0002FDFF01FD0203010502FE0300FC01FEFD0502000384 +:20008000FEFF01FAFCFEFBFE00FE0001000301FF040302090704070501FEFDFDFD02000151 +:2000A00006FDFAFDF7F6FAF8FCFEFC0502FA0100FA0001FF0704060C020005FDFD02FE0156 +:2000C00004FF0504FE0302FD0100FE0502030A020004FBF9FCF7FB00FB0404FAFFFDF4FA32 +:2000E000FCF901FFFF0800FE03FBFB02FF020801080B010404FC0001FD0403010803FF04D5 +:20010000FFFC00FCFE04FF0508FE0203FAFCFDF7FEFDFA03FDF8FFF9F6FDFAFB02FF040912 +:20012000010407000305000506030B07000601FAFFFCFA01FD0004FBFD01F9FBFEFA0003AB +:20014000FF0603FBFFFCF9FEFDFD030103080301010101010202030707040400FF01FCFD83 +:20016000FEFC0104FF0100FAFDF9F7FDFBFB0301FE00FCFD00FBFE01FE040805080702068B +:2001800002FE0401FF07050003FDFBFEF8FBFEF9FE03FE0203FD02FFFA0301FD0704FE0363 +:2001A000FDFAFEF6FA00FA0006010404FD0301FC0402FF0808030801FE03FBFD02FAFE053B +:2001C000FEFE00FAFDFEFAFFFFFD03030005020004000003000104010203FF0101FDFF001D +:2001E000FD0101FE0100FD00FDFBFFFDFF05FFFF03FEFEFFFBFE00FD0404FD0200FC00FE19 +:20020000FD0200010805010102020001010105060707FFFEFFF9FAFDF9FE01FF03FFF9FED3 +:20022000FBF700FEFC05020305FEFF03FAFE03FD0305010401FD0201FD02010106050609A2 +:20024000030408000107FF03070002FDF3F8F4EEF8F5F3FDFBFC00F9FB00F9FB01FE0307ED +:20026000050A0A050909040908040A08070A030104FDFCFFF9FCFFFC00FFF8FBFAF3F7F854 +:20028000F5FCFCFB00FDFC01FEFE0301040907090A040708010304FF0404020501FD01FB32 +:2002A000F8FFFAFA00FCFDFFF8FBFEF6FBFEF90003010602FE0300FD040101080905020456 +:2002C00003010200FF0402040B03FFFFF8F8FAF7FCFCF80203FB00FDF9FEFCFD03FF020C35 +:2002E000050306FF0102FE0203FF0606000402FE02FEFE03000009030003FBFAFCF8FCFEE9 +:20030000F90002FAFEFEF9FDFCFB00FF0007030206000103000205020708030504FF0200C5 +:20032000FE02FFFE0601FD02FBFAFCF7FAFEF90005FC0001F9FDFCF8FFFEFD07040006FFEB +:20034000FE03FE020701060D030506FC00FFFB0200FB0702FA01FBF7FDF9FB01FD0306FC96 +:20036000FF02F8FD01FB0303000903FE0500FC02FFFF0605050302020001FFFD0000000561 +:20038000020001FDFEFEF9FCFDFB0003FF0201FE00FEFD00FF0004030203000101FDFF006D +:2003A000FE0203010201FE00FEFDFFFEFF0100FF0100000202010001010101010100010034 +:2003C000FF00000001010102FFFF01FDFF00FD0106020403FCFFFAF5FEFAF90300FC00FB3C +:2003E000FBFFF9FE04FE050B040707000602FE0703000C080106FCFB00F7FC02F7FE06FBDB +:20040000FEFEF4FBF9F5FFFDFA0505000601FF05FF000500030A060809020605FF060500B9 +:2004200009090205FEF7F9EFF1FAF7F4F6FAF8F7FAF8F6FAFD0004050A0D090909050507E6 +:20044000050507050706030402FF00FFFE00FF0102FDFDFDF7F7F8F6FAFBFB0300FB00FDB4 +:20046000F8FEFDFC0400060C010103F8FAFFFB0203FF0904FE0500FB0100000602060B035A +:200480000506FDFE01FC0102FE0503FD02FFFAFEFCFA01FE0007FEFD00F9FAFEF9FD00FC80 +:2004A0000405FF0402FD0201FE0603020901FF03FDFD00FDFF01FF0304FF0202FE0201FE1A +:2004C0000302010601FE02FCFAFDFAFCFFFDFF00FBFFFFFBFFFFFE02030306020003000028 +:2004E000030301010707010401FCFDFBFCFFFB0007FFFF01F9FAFCF900FFFB0605FD04FF03 +:20050000FC01FD0006FE030C010204FBFFFFFC0402FD0A06FC03FDF900FBFC03FC000AFFCB +:20052000FF02F8FCFFFAFF00FB0505FE0401FE03000105020408030305FF0101FE0000FEA9 +:200540000201FE01FEFBFEFCFBFEFCFD03FEFD01FCFDFFFCFF01FE0305FF0302FD0100FFBA +:2005600003010107030104FFFF01FE0002FF0306FF0101FC00FEFC01FFFF0904FE02FBF969 +:20058000FCF7FAFEF90106FE0202FC00FFFD0402010D080105FEFC0200FDFC03040304FE53 +:2005A000FAFEFAFC02FD0106020502FAFFFFF7FF00FB05050106FEFC02FBFA00FBFE030156 +:2005C0000504FE0001FD01010004040407040204020002FF0003010303FDFEFEF8FAFBF80C +:2005E000FCFDFD00FEFBFEFCFBFEFDFF01010305020305020304020406040704000300FCE6 +:2006000000FDFC02000104FDFE01F7FAFEF90004FF03FFF800FBF602FEFC07040304FBFD02 +:2006200002F9FE04FD050A040905FD0401FB0502FF09050307FCFB01F7FA01F8FF07FE009E +:2006400000F8FEFBF600FDFA07060005FFFD02FFFEFF0204050905010201FF00FF00020192 +:200660000302FF0101FFFFFFFE0000000100FFFFFFFFFEFEFEFDFFFFFFFFFF0000FFFFFF8D +:2006800000000103020001010000000000010304010103FEFF01FE0203020A05FD00FAF448 +:2006A000F8F7F8FCF9FF02FBFE01FAFD01FF0506050D0A040904FD04010108000409FDFF20 +:2006C00002F6F9FEF70001FB06FEF5FFFAF4FEFBFA05FF0209FDFF06FE010700070A030E26 +:2006E0000AFE0500F7FFFCF802FCFE06FAF9FEF5F7FDF7FD01FD040400050402060504080B +:20070000060507040404020303FEFF00FDFEFDFCFDFBFBFCFAF9FCFAFAFCFCFDFEFEFFFF01 +:20072000FF000101030303040303030303030304040303010101FF0000FF0000FF00FFFD8C +:20074000FFFCFDFFFDFF05030202FBFCFBF8FDFDFB0304000400FE01FBFD03FE030B0505A0 +:2007600005FD00FEF80201FB0604FD02FCFA01FAFC03FC0008010205FD0202FA0101FC0580 +:2007800007000501FC02FDFB03FDFE08030002F9FBFEF7FCFEFA0105FF0201FD0300FE0464 +:2007A000010108060408010203FBFE00FA0203FBFFFEF8FCFAF9FFFCFD0601FF0401FEFE41 +:2007C000FE000002040305030204010002010204030504FF01FFF9FDFDFA00000003FDFC06 +:2007E000FFF9F9FFFBFE03000302FBFFFEF90101FD0605030700FE03FCFC02FD01050307FB +:2008000007000403FC0202FE06050307FFFBFFF6F5FDF6FA01FE0201F9FCFDF7FCFEFC0302 +:2008200004030805030904010704040A060709000102F8FBFCF7FEFFFB00FCF7FEF9F6FDA6 +:20084000FAFB03FF0103FCFF02FCFF02FE0407050A06020603FF04010005020406FFFF0166 +:20086000F9FBFEFAFF01FE0300FAFFFBF6FDFBFA0201030602FEFBFBFCFD000000070604A3 +:200880000603020302040602080A010302FBFCFBF8FDFBFB03FEFC01FBFAFCFAFD00FD0460 +:2008A00007000403FD00FEFD01000006030104000002000103010507020404FDFFFDFBFF13 +:2008C000FEFD0401FD01FCFAFCF9FB00FB0006FDFF01FAFCFDFB0202FF0A07000600FD032E +:2008E000FE0107FF050C010304FAFEFDF800FDF80401FA02FDFA00FCFE0600040E020305E4 +:20090000FAFDFFFA0000FB0706FF0500FB00FDFE05FE010C01FF02F8FBFCF7FDFDFA0401F4 +:20092000FA02FEF900FFFD04030409050404030404030303050604040100FFFDFDFDFBFE90 +:2009400001FEFEFEFAFAF9F7FAFAFAFEFEFDFFFFFF00FF0103030609070808040503000399 +:20096000010006050102FEFDFEF8FAFDF9FD03FDFEFEF8FAFAF7FEFDFC0506030702000499 +:20098000FD0005FF050C040404FC01FFF902FFFB0805FF05FCF9FFF6FA02F8FE06FDFF0158 +:2009A000F9FFFFF90201FD08090308030005FFFF04FE0107020204FE0101FBFFFFFC01011C +:2009C000FD02FFFC00FCFBFFFCFD02FFFF01FDFF00FCFF00FD0204000302FF0200FE01002E +:2009E0000004040100000100FF00FF01020304010001FEFDFFFDFF00FF0302FDFEFDFAFCFB +:200A0000FCFD00000206020104000003FF0305020907FF02FEF7FDFDFB01FD0008FEFC01C6 +:200A2000F8F900FB0003FE0705FB02FFF80000FE0702040B000006FDFD03FD0205FF08069F +:200A4000FB02FFF7FFFEF902FEFF08FDFB02FAFA00F9FD03FD0508FF0504FB0000FC0402B0 +:200A60000009020005FEFC00FCFE03FF0406FE0101FD0000FC0000000501FF02FEFDFFFC70 +:200A8000FD00FE0103FD0000FCFDFEFC0001000401FF03FFFD01FF00050502000001FFFF58 +:200AA000FFFE01000207020002FDFCFDFBFE00FC0303FCFEFEFBFEFEFD0100030A05040730 +:200AC000010102FE0102FD0607FF0300F8FBF8F800FAFB07FDFB01F8FAFDF9FF02FD070937 +:200AE000FF0503FD0301000603040E08040800FF02FC0003FC060AFE01FEF3F7F5F4FCF8EF +:200B0000F702FDF900FAFAFFFBFF0301070B050809040807040907050E090307FFFBFDF792 +:200B2000F8FCF6FB01F8FBFDF4F7F7F4FCFBF80502FB02FEFB01FD000602070E06070902EA +:200B40000405000404010806010500FD00FCFBFFFEFDFFFEFDFBFCFCFAFCFCFD00000203A0 +:200B6000000101FDFE00FE0103020503000300FC00FEFF05040507000101F9FCFEFAFF006D +:200B8000FE02FEFAFFFCF9FFFDFD04030507000104FDFF03FD0305010502FD01FFFC00FE55 +:200BA000FD03010204FEFE01FDFE00FC0003010604FE0200FB01FFFC04020105FEFC00F639 +:200BC000F8FFF8FE03FE0302FB0100FB0201FF0605050A03020700FF04FE0004000202FCFE +:200BE0000000FAFEFDFA0101FF03FEFC01FCFC00FCFE03000304FD0101FAFF00FC0506000C +:200C00000401FD01FBFB02FFFD0003010002FFFC00000103010607010202FCFD00FD0203CA +:200C2000010904FD02FCF7FDFBFC01FD0205FCFF01FAFD00FC0203000803FD0400FD02FFBD +:200C4000FF0602060C010103FAFC00FB0203FF0802F900FBF5FCFAF901FC0006FCFD00FAA9 +:200C6000FC00FC0104020A08020704FF04020006020308000003FCFDFFFBFE00FC0100FB52 +:200C8000FFFDFAFEFCFBFFFEFF02FFFF02000002000102010405010303FF0101FE02010152 +:200CA0000702FF03FEFAFFFAFB00FC0305FBFDFDF5FAFCF90100FF0701FE04FEFC04040054 +:200CC00001090A040500FD01FDFE01FD0006030304FE0201FA0101FB0506FE02FCF8FEF704 +:200CE000F901FAFE06FFFF01F9FE00FA0201FE080A040802FC02FDFC02FDFF07040406FFE2 +:200D00000001FC0101FE0406020501FBFFFAF8FCF9FB00FDFE01FDFF00FCFF00FF030402ED +:200D200005030104010003000105020205000102FCFF01FC0104FE00FFF9FDFAF8FEFCFBB9 +:200D40000301FF04FEFE02FCFE02FE0307020505000402FE0604000A090306FDFAFDF6FA70 +:200D6000FFF7FD03FBFEFEF7FDFCF80200FE0B05FD04FEFD0302FEFF0407060601FF03FF77 +:200D8000FF03FE0005030402FBFFFEF6FDFEF90203FF03FDFB00FBF9FFFCFF040205050066 +:200DA0000203FE0101FF0404030703000200FE00FFFF00FF0101FF0000FDFDFDFCFEFFFF2D +:200DC0000200FE00FFFDFEFDFE00000304000102FDFF00FD0103010402FE02FFFC00FEFE19 +:200DE00004010205FEFE01FAFD01FC0103010603FD02FEF901FFFE07040407FDFE02F8FBEE +:200E000002FA0005FF0301FA00FDF702FFFC05020106FFFF06FDFF06FE0409020504FB00BE +:200E2000FFF7FFFDFA02010005FFFD03FEFBFCFF00000605000200FEFFFDFF02FF040901B6 +:200E40000203FCFDFDFAFEFEFC0301FD01FEFDFFFE0002000408020303FEFFFEFDFFFFFFA0 +:200E60000302FF0300FE00FEFE01FF0207010102FCFDFDFAFEFEFC0404FD02FFFBFEFCFD84 +:200E800001FE0208010204FDFEFFFC010200090A020701FB00FCFC04FD000AFEFD01F6F943 +:200EA000FCF7FFFFF90605FA02FEF901FEFD0501030C050408FF0105FF0408000A0C0004FE +:200EC00000F7FBF8F6FDF9F802FBF9FFF7F8FCF9FD01FD0306010504000403020706060A37 +:200EE0000505070300FFFEFFFF0000FDFDFDFCFCFBFAFCFBFD01FFFF00FDFEFDFBFDFEFD21 +:200F000001020003020102020203030405040505020302000101FF02020002FFFEFFFAFBA6 +:200F2000FFFAFC04FFFFFFF8FCFBF6FEFEFA05050003FEFC01FCFF05FF030A040405FF03BD +:200F400003FF0505000808030601FC01FAF9FFFAFB04FFFE01FAFCFDF7FD00FB0508010491 +:200F600001FA00FBF901FDFE09050306FEFF02FB0105FD060A010501F8FEF9F701FBFA047B +:200F8000FEFB00FAFC01FC000401080C060A07000500FB02FEFD0502FF03FFFCF9FAFCFB4A +:200FA0000101030A02FDFEF6F5FCF9FE01FD0604FA00FEF7FF00FE0704040BFFFD02FBFC44 +:200FC00001FD01040007070005040004030206040408030103FFFEFFFCFDFEFCFFFFFBFEEB +:200FE000FDFAFBFBFAFDFDFE02FFFE00FEFEFFFE00010103040203040203030104030306EF +:20100000030003FFFEFFFDFDFFFD0002FDFF00FBFDFEFBFF00FE0402FE0300FC00FDFD03EC +:20102000000307FEFF02FBFE00FD0203010A06FE03FEF8FFFDFC03FE0207FBFC00F7FC02B6 +:20104000FB0303FF0A05FC03FEF90200FE07030305FFFCFAFCFCFD0300000A03FF03FDFD83 +:2010600000FC0102FC0508FE0102FBFEFEFC0300000B050004FDFCFEFBFEFFFC0204FE016D +:2010800000FD00FFFE0201010703010400FE00FEFEFFFE0001FE0000FDFFFFFD0000FF0551 +:2010A00003FF0200FEFFFDFE00FD0106FF0001FCFDFEFBFF00000605010602FF03FFFF0526 +:2010C000FF030C020204FAFBFAF5FDFDF90502F900FBF7FFFBFD05FF0510030205FAFF021C +:2010E000FD0404FD0A07FB02FDF800FCFC02FDFF09000004FCFE01FD0203FE0706FE02FFE1 +:20110000FB00FEFD01FF0006040100FF00FEFEFFFE00020101FFFDFFFDFCFDFCFE000001E6 +:20112000020001020101010103020204020102010000FF0102010403FF01FFFAFDFCFAFFA0 +:20114000FFFF02FDFC00F9F9FDFAFE03010504FE0201FB0101FE05050508020104FEFF0487 +:20116000FF0206030604FC01FEF6FFFDF800FFFC00F9FA01F9FB03FC0008030607FF040376 +:20118000F90203FD0705010700FC03FBFA04FCFF07000204FAFE00F6FCFEF80001FF04015B +:2011A000FD0301FE04010107040507010204FF0101FD0101FF02FFFC00FDFAFDFBFBFFFE29 +:2011C000FDFCFDFFFFFEFFFFFF020304030305030102010304040807000301FAFCFBF9FEFF +:2011E000FCFD02FBFAFFF9FAFFFC0104010804F9FFFEFA00FFFD02010308020307030408EB +:20120000030709030907FC00FCF5FAFAF8FEFBFD04FAFAFFF8F9FFFAFE03FF0807FE0301E7 +:20122000FA0000FD0402030B040207FFFD03FE0106000809FD00FEF4FAFBF6FEFDFB04FEAF +:20124000FC02FDFB01FDFF0501060A030506FE0001FD0302FF0501FD01FDFBFEFCFD01FE85 +:201260000204FE0001FBFDFEFB0000FE0502FF0400FD01FFFF050504020101FEFFFCFBFF6F +:20128000FEFF07030001FBFCFCF8FDFEFB0307010402FD01FFFE0501010A060406FEFF003B +:2012A000FAFF01FC0306FF0300FAFFFAF901FDFD07020004FDFDFFF9FF01FB03070003013E +:2012C000FB01FEFB03FFFE08060306FFFF02FAFE02FB0107FF0101FAFFFDF9FFFDFC040217 +:2012E0000005000004000003000307020404FF0200FCFFFEFC0100FD01FDFCFFFAFBFFFBF2 +:20130000FF05000101FCFFFFFBFFFFFE04040205020003000004000208040405FE00FFF9B1 +:20132000FEFEFA0102FD01FEFBFFF9FA0100FF010100FE02FDFA02FF0107050605FE0000BB +:20134000F80002FB0306010600FB02FBF802FCFD05010304FD0002FAFF02FD030502080384 +:20136000FE03FFFC01FEFE04020304FEFF01FDFEFFFC0002010402FD01FEFAFEFCFB00FF80 +:20138000FF01FDFD00FDFF00FE0102010404010403000201000503040600FF02FCFBFFFA3F +:2013A000FE02FE0200FAFEFDF6FCFCFA03020105FEFD03FBFC04FE0209040705FD0202FA38 +:2013C0000202FC06050206FFFC02FBFB03FC0007020404FB0000F6FF00FA0403FF03FCF90F +:2013E00000F8F803FFFBFD05050003FFFD00FF010400040B040505FEFFFFFB0001FC0403DE +:20140000FD01FDFBFEFCFD01FF0206020303FEFFFFFDFFFFFE0201FE01FFFEFFFEFE0000E0 +:20142000000400FF02FEFEFFFEFF00FF0202FF0201FF0100FF02010208030103FDFDFDF9A7 +:20144000FCFEFA0103FD0200FBFFFCFC0400000B030004FCFCFFFB0002FE070A010604FC83 +:2014600001FFFC04FFFE0A02FD02F8F8FDF8FD02FA0408FD0201F8FFFFFB0400FE0901FC81 +:2014800003FCFC01FCFF04FF060B020606FF0302FD0200FE0502FE02FEFCFEFCFCFD00033B +:2014A000010100FDFDFCFBFEFCFF05020102FDFDFEFBFF00FE0406020402FF02FFFF010034 +:2014C0000003010203010202FF0202000405020301FE00FBFAFEFAFC0400FE00F9FAFCF71D +:2014E000FDFEFA0307000300FC02FDFD0500020B060305FDFF01FB0202FC0407000401FCCE +:2015000002FDFB03FEFD08030003FAFBFEF7FDFFF80005FE0302FD0300FC0400FF080501D2 +:2015200006FFFF03FCFF03FD0208010303FBFFFDF9FEFCFA0201FD02FCFBFFFBFD01FD01C5 +:2015400006020404FF0402FE0302FF0706030600FE01FDFBFBFDFEFE03FEF9FBFAF8FBFB96 +:20156000FCFF000406020405010305020506050C07030601FC00FCFD01FD0305FAFDFDF341 +:20158000F8FAF6FFFEFD06FDF900FAF801FD0007010709FD0205FD0205FF0606040D06FF3C +:2015A00005FEFB01FCFC02FC0104FAFDFEF7FAFCF9FE00FF0604000602FF04010007020436 +:2015C00009000002FBFCFEF9FDFFFC0201FC00FEFAFFFDFD02000106000103FF0001FF011D +:2015E00002000302000201000201000201010400FF01FEFEFFFCFDFFFDFFFFFD0000FDFFEF +:20160000FFFD0000010501000300FEFEFEFF0105030104020001FEFF01FE0307000101FBB7 +:20162000FCFBFA00FFFD0804FD02FCF9FDFAFE03FB040AFE0102FA0000FD0603FF0C05FEAD +:2016400006FFFC02FCFF06FD030BFCFF01F7FDFDF902FFFA0704FC04FEFC02FDFE05FE0392 +:201660000C000003F9FCFEF9FF00FB0605FD02FFFC01FFFF0401030A020205FE0001FEFF5A +:2016800000FE0302FE0200FD00FEFC00FEFF0500FF03FCFDFEFAFEFFFC0405FD01FFFAFD65 +:2016A000FCFB00FEFF07020004FFFF02FF020502070A030604FE0100FD0200FF0903FE03F9 +:2016C000FEF7F4F8F9F8FFFFFDFFFBFBFEF8FB01FC0308040705FF0302FC0504000A09061D +:2016E0000900FE03F9FB02F9FF04FE01FFF7FDFBF5FEFDFA0403010701FE05FEFD04FF0204 +:2017000009050808FE0000F8FDFDF90001FF0400FD01FCFB00FCFE02000204FF0103FF00C5 +:2017200001FF0202020502FF0200FF00FEFE00FE0002FF0001FDFFFFFD0102000300FCFFA7 +:20174000FDFBFEFCFDFFFF0003FF0003FF0003000204020404010402FE0200FF0503020471 +:20176000FEFD01F8F9FDF8FE02FE02FFF900FCF701FEFB0503020703FEFDFF000105040783 +:201780000B030204FDFC01FE0103FE0603FAFFFDF5FCFCF901FEFF07FFFD02FCFC01FD015C +:2017A00005010808000402FB00FFFC0300FF05FFFD02FEFC00FDFF04000507FF0202FBFD11 +:2017C000FEFBFFFFFF04FFFE02FEFCFFFCFE02FF0405FF0202FE0000FE0201010602FF0306 +:2017E000FEFC00FCFE03FF0306FE0001F9FCFDFA0000FE0400FC01FEFD01FF0004020509F1 +:20180000020306FF0003FE0203000603FC01FCF6FCFAF901FE0007FEFE02F9FB00FA0002DD +:20182000FE0603FD0301FB0201FF0704060C0601FFFFFEFE01FEFC03030001FDFCFEFAFD95 +:20184000FFFB0106010202FC00FFFC01FFFE06040105FFFF01FBFE01FD0307020403FD0176 +:20186000FEF900FDFB0503FF03FEFCFFF8FBFFFB0005000103FD0100FD0201000504030571 +:20188000020203000103000306030303FCFEFCF8FCFBF90101FD02FDFBFFF8FA00FBFF0762 +:2018A000010204FCFE00FB0101FE0607020703FF0500000600020B040306FCFEFFF7FDFD05 +:2018C000F80103FC00FCF6FCF8F901FBFC07020004FCFE02FC0305FF080C040704FD03FF0B +:2018E000FD04FEFF0906FEFBFCFBF8FBFBFA00020202FEFF01FCFE01FD0206030605FF02F0 +:2019000000FB01FFFD03020204FFFF01FCFD00FC0003000301FE0201FD00FFFE04030305BF +:2019200000FF02FDFD00FCFF03000202FD00FEF8FEFDFB02020105FFFE02FBFB02FD0208B9 +:20194000040705FCFFFDF5FEFEF903020005FEFC03FBFC06FE030B040605FB0000F8010181 +:20196000FB05050207FFFB02FAF902FBFD06010405FBFF00F7FDFFFA0103000602FD02FE70 +:20198000FB02FEFF06030507000103FCFE00FC0102000300FD00FEFCFFFDFE010101FFFF46 +:2019A000FFFFFF0100FE0101000100010101010100000101010001010000FFFFFF0001031D +:2019C0000101030000FFFC0001FD0305FE01FEF8FAF9F9FEFCFE0602010701FF01FC010416 +:2019E000FE070A000402FB00FDFC04FEFE0B01FC02F9FAFEF8FE01F90508FB00FFF9FFFFF5 +:201A0000FD0602010E070108FFFE03FCFF04FD040AFD0101F7FCFCF7FFFEFB0602FC03FCB8 +:201A2000FA00FCFD02FF0308020506000303FF0304000704FE03FEFBFDFAFAFDFBFD01FCA6 +:201A4000FE01FCFEFFFC0001FF0504FF0401FF01FEFF020001020202010101FEFF0000027D +:201A6000020103010101FD0002FE0509010300FAFDF7F7FFF8F906FFFCFFF7FBFEF7000290 +:201A8000FC070A000502FE04FFFF0802020D080408FF0002FA0002FB0409000300F8FFFA0C +:201AA000F7FFF9F90401FF03FCFE01F9FD01FB0208010303FC02FFFA02FEFD07050005FF35 +:201AC000FE02FDFF03FE0206000202FC0000FC00FEFD03020003FFFE02FDFE01FE00030006 +:201AE0000102FD00FFFCFFFFFE0202FF02FFFE01FEFE00FF0003010203000101FF010100E5 +:201B00000304010402FF01FDFC00FFFEFF0301FE00FDF9FBFBFCFFFE0204FF0101FDFF00D8 +:201B2000FD0203020804FF0400FC00FEFE04010509000001F9FCFFFA0000FD0601FB01FC9C +:201B4000F8FFFDFD0401050A010104FBFD02FD0204000904FB01FDF8FEFCFB02FF0207FF81 +:201B60000004FDFD01FD0104000706FF0503FC01FFFC03FF0007FCFAFEF7F8FDF9FD01FE7A +:201B80000607FE0403FA0000FC0502020901FF04FBFA00FBFE04FF0506FD0202FAFF00FD34 +:201BA0000403020902FF04FDFB00FCFD02FE0406FC0000F8FDFEF90000FE0601FE03FEFB2C +:201BC0000201FF000507030300FDFFFEFEFFFE0206010102FDFDFEFDFF00000504FF0200F2 +:201BE000FDFFFEFE00FF0205010103FF0000FD0101FD0504FE02FEF9FCF9F9FFFBFF0700F9 +:201C00000004FCFDFFFC0204FF0B0BFF0400F9FEFCFC02FDFF09010004FBFCFFFB0002FEC2 +:201C20000608010603FD02FFFD04FF000A02FF04FBFAFEF8FD00F90204F9FDFDF7FDFCFABB +:201C400001FFFF08040207020206010307020609000302FBFEFEFBFFFEFD03FFFC01FCFB63 +:201C6000FFFBFC00FD0104FE0001FCFFFFFC0101FF0604000502000200FFFF010303040357 +:201C80000002FFFD01FEFF05030302FAFCFCF4FAFCF90001FF03FFFC02FDFC03FF0207045E +:201CA0000607010404FD0102FF0607030701FC02FBF8FFFAFC03FF0001F9FDFEF6FCFFFA2F +:201CC0000306020703FE03FDFA02FDFF06030507FF0102F9FE02FD0406020601FB00FBF7EC +:201CE000FFFBFA02FF0004FDFF02FBFE02FD0306020603FE0200FC01FFFE040203060000D8 +:201D000004FDFE02FC0104000302FC01FEF7FDFBF902FFFD01FCFC02FAFC02FD02080407D6 +:201D200007FF0402F90201FC06040104FCFA00FBF9FBFEFFFF0705FF0300FEFFFE0104029F +:201D40000707FD0000F9FCFFFA0000FF0500FC00FBFAFFFDFF03010507010404FF0102FF80 +:201D60000302010501FF02FEFDFEFCFDFFFE0101FDFFFFFEFFFFFEFFFF000100000100016F +:201D800001000001010304010203FF0001FE0001FF0401FC01FDF8FDFBFB01FE0209000041 +:201DA00003F9FA00FB0103FF0805FD03FEF700FFFE0702040AFEFF04FAFB02FB0205000817 +:201DC00004FA02FFF7FFFFFB05000007FBFB02F9FA01FA0005FF0705FC0302FA0202FE060F +:201DE00003020A01FF04FFFAFBFEFEFD0405FE00FEFCFDFAFBFEFD0004020203FF010200E8 +:201E000002030206070406030102FFFFFFFEFF00FFFFFEFCFDFCFBFCFCFDFFFFFE00FFFFC9 +:201E200001FFFF01010205040304000101FF0000FF0202010301FF02FEFE01FE0107020080 +:201E400001FBFDFEF9FEFEFA0205FF03FFFA00FAFB04FCFF0A030105FC0102FA0303FA0793 +:201E600008FD0400F901FBFA04FD000B020005FBFF02FA0002FC0509020603FD02FEFB0250 +:201E8000FEFD0602FF03FCFCFFF9FD00FB0104FF0202FC00FDFB00FEFE0402000300FFFF56 +:201EA000FE000000020203030102020000000001010102FF0000FEFEFFFD0002010200FE16 +:201EC00001FCFAFEFBFC00FF0101FD0000FBFF00FD0304030603020700FE04FF01080303F5 +:201EE00002FAFEFEF6FCFDFA02020004FFFD03FCFC04FF0209040404FC0000F7FF00FA04F8 +:201F0000040004FEFA01FAF802FCFE08030406FD0003FA0003FC0507030804FE04FEF801B0 +:201F2000FBFB03FEFE01F9FBFFF9FCFFFB010301050400040402030302030102030101029C +:201F40000200FFFFFFFDFCFEFDFDFEFEFEFDFDFDFEFE00010100FFFEFFFF00010106040299 +:201F60000401FEFFFE0002FF0508000203FCFDFCF9FFFDFD0903FD01FAF8FDFAFF03FC076F +:201F80000BFF0301F8FFFEFC0600FE0D03FD03FAFA00FB0006FE080CFD0201F90100FB052D +:201FA00001FF0C05FD04FBFA00F9FC02FA0108FD0203FAFEFDF800FFFA0602FC02FCFA003C +:201FC000FDFE04010509030506010404010404010603FF02FDFBFEFBFAFCFBFCFDFAFCFEF9 +:201FE000FBFDFEFCFEFFFF0100FF02010102020202020405030304010202FF0101000506C1 +:20200000000200FBFEFCFBFFFBFB0401FBF9FAF9F8FEFDFD03040407010203FB0005FF07DF +:202020000D030403FC00FCFA03FDFC0903FD02FAFBFFF8FE02FA040A010401FA02FDFA059E +:20204000FFFD0A05FF04FBFC01F9FD01FB0209020404FC0100FB0201FE07050105FFFD006C +:20206000FBFC00FCFF03FF0102FDFF00FC0000FE0303000400FE02FEFD00FDFE02FF000270 +:20208000FD0000FBFFFFFD0203FF0301FE02FEFD02FE0006020103FDFF00FBFF00FD020445 +:2020A000FF0301FE02FEFD01FEFF06030205FFFF00FBFF01FC0408010402FBFFFAF800FC24 +:2020C000FC0807FEFBFEFCF9FEFDFD04020708FF0103FCFF02FE0304000704FE0301FC02EC +:2020E00000FE0501030800FF01FAFBFDF9FDFFFD0201FD00FFFD00FFFF03020306020103DF +:20210000000000FEFF01FF0202FF0101FE00FFFD0100010601FE00FBF9FBF9FAFDFC0103DD +:20212000FD0000FBFEFFFD02020309040207020004000105010607FF0202FAFEFFFA01FF82 +:20214000FD06FEF9FFF7F4FDF9FC02FD0306FC0102F9FF03FD0505010803FF0501FE04018C +:20216000010804070AFF0003FBFE00FAFF00FE0601FBFFFBF7FDFBFA000100000000FF006A +:20218000FEFD01010308060405000000FBFF00FD0405FE00FFFAFDFCFCFFFF010401010334 +:2021A000000102000405020708010301FCFCFAF9FDFBFB02FEFC01FCFBFEFBFF03FE050924 +:2021C000000403FDFFFEFC0300000B050005FDFCFFFB0002FB0407FD0201FAFFFEFB03FEFC +:2021E000FD0900FC04FCFB01FBFF04FD0509FE0202FB0000FC0301FF0804FF04FFFD01FDD3 +:20220000FE03FF0308FF0102FBFFFFFBFF00FD0402FD03FFFC00FDFD03FE020900FF01F8C2 +:20222000FBFCF9FEFEFC0504FE03FFFC01FFFF050403050504010100FE0001000403030588 +:2022400000FF00F9FBFFFA0003000300FB00FCF800FCFC05020204FCFDFFF8FCFFFB0003AF +:202260000207050107040006030209070709010002F8FBFEF8FE01FC00FCF6FCF9F4FDFA60 +:20228000F902010205FF0003FD0004FF0408050908020503FE0301FE04010003FEFC00FB10 +:2022A000FBFEFAFD00FD0001FC0001FC0101FE0606040801FE03FAF9FFF9FC03FE0001FA3A +:2022C000FEFFFA0000FD0405040804000400FE04000207040506FF0202F9FEFFF90102FFDF +:2022E00001FCF7FCF7F6FFFDFAFB0303FE01FEFCFFFF000202060B07080A040404010506CD +:20230000030A05FD01FAF4FAF7F6FCF8FE01F8FBFDF6FAFEFA0102010A06000602FD0402EE +:20232000010804070C020104FBFD00FBFF01FE0503FC01FEF9FEFCFB01FE0105FEFF02FB95 +:20234000FC00FC0003010705FF0301FAFFFEFC0301020800FF03FCFC00FCFF03FE0506FE72 +:202360000302FAFFFFFB03000007FFFD02FAF9FFFBFE03FF0607FF0404FC0101FD04030258 +:202380000802FF03FDFAFEFBFC01FD0103FC0000FBFEFFFC0203030A05010500FC0201FD3A +:2023A000FC0103FEFFFCF8FAFAFAFCFCFE030102030002030003040207090407040002FE12 +:2023C000FD00FCFE03FFFF01FAFCFCF8FCFDFA0002FE02FFFC01FDFC02FF0109050204FE1C +:2023E0000001FD0102FF0507020502FE01FEFD01FEFE06020003FCFCFDF7FCFEF90106FFE1 +:202400000300F8FEFAF902FEFE09040005FDFE02FB0104FD0509010404FE0400FC0400FEAF +:2024200009040005FCFCFFF8FC01F90007FF0303FA00FDF801FFFC0805FE04FDFB01FAFEAE +:2024400004FD030A010304FB00FFFA0100FD0606000500FE02FEFDFEFF0203040200000060 +:20246000FEFEFEFE00010303000102FEFEFFFD0002010200FF01FDFBFEFCFD02010303FE67 +:20248000FF00F9FDFEFA0003010400FC01FDFA00FEFE05040506000102FD0002FF04060533 +:2024A0000704FF03FFFC00FDFD04020202FBFCFEF6F9FCF7FE02FF0300FC03FEF802FEFD45 +:2024C00008050408FF0004F9FE04FB0307000502F900FDF803FFFD08040206FDFD02F9FBE8 +:2024E00001FA0005010504FD0201FA0100FC0503020600FE03FCFC01FC0006010403FCFFCC +:20250000FFF9FDFDFB0000000300FF030000010002040404030202010000FF0000010300AF +:20252000FF00FDFCFDFBFDFEFC0201FE01FEFCFEFCFE01FE0207000203FDFFFFFD0201FFB9 +:202540000805FF0501FD01FEFF04FE0209FEFF01F9FBFCF90000FD0705FE0500FC00FDFF76 +:2025600005FF030C00FF01F6FAFDF90001FB0705FB02FDF800FDFD05FF010B010205FDFF5A +:2025800002FD0204000707000502FE0200FE02FFFF04FEFE01FBFCFEFBFDFEFC0203FD0237 +:2025A00001FCFFFDFB00FEFF0701FF03FCFBFEFBFF02FD0406FF0302FD0000FF040201071A +:2025C00003010502FFFEFE00000305030502FF00F9F7FDF9FD03FF00FFF8FCFAF4FEFEFB27 +:2025E0000605FE02FEFE03FF030701050C050608010402FD0502FC0605FE03FDF9FDF7F9AD +:20260000FEF8FC04FEFE00F9FCFDF9FF00FD0505010502010403030403050704050602039D +:2026200003FE00FFFC0101FD00FEFBFEF9F9FEF9FB0400FE02FAFBFDF6FCFEF901040004DC +:2026400002FE0301000503050B09080B040405FE0102FC0105FF01FFF9FDF9F700FBFA0652 +:2026600001FBFFF7F8FCF5FCFFF9030A000302FC0301FF0803010D08020703FEFC0001FF53 +:2026800005020206FFFE01FAF9FFFAFE01FD0301F8FDFDF6FBFCF9FF000107030305030450 +:2026A000050305060507060304020000FFFEFFFEFF01FEFCFCFBFBFBFBFBFBFCFDFEFDFE28 +:2026C000FFFEFFFFFF02030306040204030202010102020405010202FEFEFFFDFF00FF04D3 +:2026E00000FD01FDFAFFFCFD02FE0306FDFF02F8F9FCF90102FF0702FD0600FA03000009EC +:20270000010509FD0003F8FD02FB0303FE0702FA02FDF701FEFD07000309FDFD03FAFE04B3 +:20272000FC0305FE0703FA02FEF7FFFDFA03FE000803FEFCFBFCFDFF010104070505030192 +:2027400002020202020304020101FEFEFEFDFCFDFDFEFDFCFDFDFDFDFDFEFFFF020300008E +:2027600001FFFFFFFF00000104030003010001000103000408010102FCFCFDFBFEFDFD044F +:2027800002FE02FEFCFEFBFE02FE0409010204FCFDFDFA00FFFD0804FD04FEFB01FDFF063D +:2027A000FF050D010204FAFDFFFA0201FB0803FA02FCF8FFFAFB04FD010AFF0104FBFE011A +:2027C000FB0103FE0909FF0500FA00FDFB02FE000A020004FBFCFEF9FCFFFC0303FE0300F8 +:2027E000FE0100FF030202070402010102FFFFFFFEFF010001FFFE00FDFCFEFCFD01FF00DA +:2028000000FDFFFFFCFEFEFE0202020402020500FF02FF0205030504FF0301FBFFFEFB03A8 +:20282000020004FEFBFFF7F8FEF8FE04010401FA00FEF80200FC06040205FFFE03FDFD01B3 +:20284000FE0205030708030505FF03030006050204FFFC00F9F7FCF7FA00FCFE00F9FCFD7A +:20286000F7FDFEFB0203020603FF0400FE03000207050709020304FCFF01FC0102FE00FE39 +:20288000FAFEFDFCFEFDFE00FF0104010204000204000406030501FE02FDF9FEFBFB030439 +:2028A000FFFAFBFCFAFCFCFB00FE0209010003FCFD00FD0203FF0809010502FC00FFFE051D +:2028C000020409FFFF02F9FA00FBFF02FE0501F9FFFCF7FEFCFA0200020900FF04FDFE0309 +:2028E000FE0206010807FD0301FB0100FC0402030900FD01F9F8FEF9FC01FD0303FC0101D3 +:20290000FBFF00FD0404040B040005FFFC02FDFF04000507FD0000F8FCFDF900FFFD0600AE +:20292000FC02FCF9FFFBFD03FF0508FF0203FC0002FD0303010904FF0500FB01FDFD05008C +:202940000408FCFDFFF6F9FDF8FF00FE0702FD04FEF800FEFE060402FF01020001FFFE0387 +:20296000020309060305FFFFFFFAFDFEFA0004FF0201FBFFFCFAFFFDFD03020104FF000156 +:20298000FD0001000305020402FF0100FF0100FF03020002FEFEFFFCFDFFFD00030001012E +:2029A000FDFFFEFCFFFEFE02020002FFFE01FEFF01000206030405000200FB01FFFD07050A +:2029C000FF03FCF9FDF7F9FEF9FF06FF0203FB00FFFC0403FF0B0A030800FD02FBFE03FB01 +:2029E000FF08FF0002FAFEFDF800FFFA0505FE04FFFC02FBFD04FD010B020103FAFFFFF8E5 +:202A00000100FA0605FD03FEFAFFFAFC020100030605020301FEFF01010403050601000199 +:202A2000FDFDFFFCFE00FE0200FDFFFDFBFDFDFD01010202000102FEFF01FE0204030502A3 +:202A4000FF02FFFBFFFEFC01FFFE01FEFF01FDFD00FF0205040605000301FC00FFFE040471 +:202A60000405FEFDFFF6F8FCF7FD02FF0200FA00FDF80100FD0705030801FF05FBFE06FE6C +:202A80000309010504FC02FEF601FEF90502FF04FCFA01F9FA01FBFF06010505FF0304FE32 +:202AA0000203FF0606040803FF03FDFB01FBFD03FDFE00FAFDFEF6FCFDF90103000501FD22 +:202AC00002FCFA01FFFDFF0304000201FF01020204030509040304000001FF0001FE0201D2 +:202AE000FCFEFDFBFDFCFCFFFE0004FFFF00FCFDFEFDFF00FF0404000401FE01FFFF0301F0 +:202B00000208030204FEFDFEFBFF00FD0404FD01FFFBFEFCFC00FEFF04FEFF01FE0001FFBF +:202B20000203020607030604000200FF0300FF0700FD01FAF9FCF8FCFFFA0306FB00FFF796 +:202B4000FDFCFA0300FF0B03FF06FDFC01FC0106FF070B000505FC0202FD0602FF0B02FC48 +:202B600002FAF8FEF9FC01F90207FBFF00F7FDFEFA0200FD0A05FF06FFFC0302FFFE02066D +:202B8000060603FE00FDFB01FCFC02010101FBFCFEF8FCFEFC0105030604010501FF030033 +:202BA0000209060303FDFDFCF9FCFCF90002FDFFFDFAFDFCFC00FF00050403040001020022 +:202BC0000102010405030403010200FE00FFFF0300FF01FDFDFDFAFCFEFB0105000303FDED +:202BE00000FBF8FFFCFB0502FF04FDFE01FB0003FE050B030504FD0300FC05FFFD0803FEC8 +:202C000003FCFB00F9FD01FA0108000202FB01FFFB0400FC0705FF04FEFC00FAFC01FB00CB +:202C200005FF0102FC0100FC0201FF0707020501FE02FEFDFDFE00020401FDFFFDFBFDFC92 +:202C4000FD01FF0304FEFF00FAFBFEFB0001000603010601FD01FEFF04000406FF0102FB6D +:202C6000FDFFFB0101000602FD02FEFB00FEFE04010509000102FAFCFFFA0000FE0501FB5B +:202C800000FCF9FEFCFD02000407010204FF0002FF04050309050003FFFAFEFCFB00FEFF2C +:202CA00003FCFCFFFAFCFEFBFF02000605000402FD0100FE03010207000004FCFC00FBFE1B +:202CC00001FE0303FD0100FAFFFEFB0200000500FE03FEFE02FE0205020706FE0302FAFFE9 +:202CE000FEFA01FF0006FEFC01FCF7F8FDFEFD0405000300FE00FD000400050B030304FDD6 +:202D000000FFF901FFFB0605FE02FCFAFFF9FD02FC040AFF0102FBFF00FC0301FE0B04FBBA +:202D200002FCF900FCFD03FC0108FE0002FBFE00FC0102FF0806000400FE01FEFF02FF0392 +:202D400008020202FDFEFFFCFEFFFD0100FD01FEFCFFFDFD00FE0003FF0003FE0001FE0083 +:202D600001FF0504FF0201FD01FFFD01FFFF03FFFF02FEFF01FEFF01FF0304FF0303FE0047 +:202D8000FFFD0201000803FF04FDFAFEF9FD01FB0306FBFFFFF7FCFCFB0300FF0B03FF053F +:202DA00001FBFB0101FF0605020400FE02FCFE03FE0308030403FC0101F800FFFA04030004 +:202DC00003FDFB01FAFB01FAFF06010404FD0201F900FFFB0403010600FE03FDFC02FDFF00 +:202DE00006020203FCFF01FAFF00FC0405020602FE03FEFCFFFCFE02000202FEFF00FCFFD0 +:202E000000FE0203020502FF03FEFB00FCFC03000102FAFCFEF9FCFEFB00020105040005BA +:202E200002FE04010108050508010103F9FBFFF8FE00FBFFFEF9FDFCF9FEFDFD0403040896 +:202E4000020105FE0004FF0408040706FF03FFF9FFFDFB0201FF0200FBF9F9FAFBFFFEFF79 +:202E600007030002FDFCFFFE0104FF0609010404FD0000FD0401FF0A02FC01FBFAFEFBFE41 +:202E800002FE0505FC00FFF9FEFFFC0201010903FF05FFFC02FEFF04FF0506FCFF00F8FC30 +:202EA000FEF90000FF0702FE03FEFBFFFCFE02000406FF0102FCFF01FE0203020803FE0305 +:202EC000FFFB00FCFC01FE0104FD0002FBFE01FC0102FF0502FD02FEFAFFFDFC02FF00040A +:202EE000FF0103FF0002FE02040308060002FFFBFEFDFB00FF0004FEFD00FBFCFFFCFF03D5 +:202F0000010706FF0401FAFEFDFB0100010602FFFEFEFEFE0100000606030500FF00FBFEA1 +:202F200000FB0106FF0101FBFFFDFA02FEFD0804FF04FCFCFFF9FE02FB0409000302FA009A +:202F4000FDFB0300FD0806020700FF03FCFF03FD0209010203FBFEFCF7FFFDFA0403FE026B +:202F6000FDFBFFF9FB00FD0208030406000403FE0302FF07060003FFFB00FAFAFEFAFD0353 +:202F8000FEFF02FCFF00FC0101FF0606010502FE02FEFD01FDFF07020004FDFEFFF9FDFF32 +:202FA000FA0104FD0100FB00FDFC01FF0008040104FEFF02FD0002FE0508030604FE02FEFB +:202FC000FB01FDFC0605FEFCFEFCF7FBFBFA00000306FEFF01FAFBFFFC0205010906FF0306 +:202FE00000FA0101FF07030409000003FAFC01FB0005000401FB00FCF6FFFCFA03020106D2 +:2030000000FE03FCFD03FD0106020605FE0301FB0100FD0303020500FF03FCFC01FCFE03A2 +:20302000FF0101FBFEFEF9FDFEFB0203010501FE03FEFD02FEFF04020304FF0102FE010193 +:20304000FE0303010502FE02FEFC00FDFD02000104FDFF00F9FDFFFA0003FF0200FB00FD82 +:20306000FA00FEFE05040406000104FD0003FE0306030603FE02FEF9FFFDFC040501FDFF3A +:20308000FFFAFAFBFBFFFF0208020103FEFDFFFD0103FE0809FF0300F9FDFCFB02FCFE083C +:2030A000FFFE02FAFC00FB0103FD0708FF0502FC0200FF0701010C02FE04FBFBFFF9FE0107 +:2030C000F90305F8FEFDF6FDFCFA02FFFF0A040006FFFE03FE0104000609010404FE0100E5 +:2030E000FD0201000802FD02FCFAFEFAFBFFFC0105FE0002FBFFFFFB0100FE0703FD02FDE4 +:20310000FAFFFCFD01FE0308000205FF0203FF0304010805000400FCFFFCFB00FDFF03FDA2 +:20312000FE00FBFDFEFCFF00FF0403000401FE00FFFF0202020203030000FFFDFEFEFF0193 +:20314000020304000001FBFE00FC0003000301FC00FCF9FEFCFD03020204FF0003FDFF0276 +:20316000FE0408030705FF02FEFC02FEFD0703FF03FBFBFEF7FD00F80106FCFFFEF8FFFC5F +:20318000FB0400FF0B070307FFFF04FC0205FC0409FE0100F8FFFCF903FEFA0703FD03FB1C +:2031A000FB02FBFF05FE040D030505FC01FFF902FFFA0705FC02FBF8FEF8F900F9FE08011B +:2031C0000104FC0002FC0203000708020602FE0300FF02000003000002FDFEFFFCFEFFFDDB +:2031E0000000FD00FFFDFFFEFDFFFEFF00010100000000FE000000010303010101010000D5 +:20320000000101020302000100FFFFFEFE00FF0103FFFF01FCFDFEFBFE00FF0503FE02FFB2 +:20322000FAFFFEFD0401050A010104F8F9FFF90002FD0501F901FDF701FFFE0903060BFF8A +:203240000208FDFF05FB0205FD0602F800FCF5FEFCF904000108FDFD04FBFB02FC0106007A +:203260000908FE0303FB0101FC0503020A01FE03FCFAFFF9FA00FC0002FCFFFFFCFF00FE51 +:2032800002020106030205020102000001FF0000FF0000FEFFFEFDFFFFFF0301FF03FFFC1F +:2032A00000FFFDFC01040000FEFAFCFAFBFEFCFE05030304FF0101FD020400090C030601FE +:2032C000FAFEF9FA02FCFE08010104FCFEFEF80101FB0805FA03FEF901FDFD07FF040F00F7 +:2032E000FF02F6FAFFF80000F80705FA03FEF801FEFE0802040F040208FEFE01FB0003FCD0 +:203300000506FC0200FAFFFDFB02FFFF0701FF03FDFE01FDFF01FE0304FD0000FCFFFEFDB8 +:20332000FFFEFF02FFFF01FFFF01FF00010002010002010002010000000101000001FFFF87 +:2033400000FFFFFFFF0101FF0001FEFFFFFE0101000503FF0200FDFFFFFEFD010403040167 +:20336000FD00FBFAFFFBFD03000102FBFFFFF80002FC0406010601FD04FDFD06FF00080352 +:203380000506FD0001F90101FB0403FE01FCF900FCF9FFFCFF06030407000305FD0103FD2A +:2033A0000305010502FD02FCF8FFFBFC03000002FBFC00F9FBFFFB0003000402FE0302FF1F +:2033C00003010106040407020206FEFF02FC0002FF0100FBFEFCF8FCFBFA00FFFF03FEFEF1 +:2033E00002FDFE03FE0107040707000301F900FFFB05040003FCFAFFF7F902FAFE060002CB +:2034000003FC0201FA0403FF0908030800FD04FDF9FC0001010902FC00FDFAFCFBFD00FEA9 +:203420000408FF0001FBFDFFFC0203000A070105FFFCFFFCFD00FD0104FF0000FCFDFEFD89 +:203440000000010502000401FE00FFFF01000203FF0001FCFDFEFCFF00FE0301FD00FFFD70 +:20346000FFFEFE01010305000103FEFF01FE0001000403000402FE01FFFF04010206FFFF31 +:2034800003FBFBFEF9FDFFFD0402FB01FEF8FEFDFB0301040B030206FCFC03FD0105FF0634 +:2034A00004FB00FFF7FFFFFB04010007FEFC03FBFC04FD0107020908FD0201F80000FA030D +:2034C00000FF06FDFA00FBF7F9FAFCFD0103010304030301020504060A070607000100FCD3 +:2034E000FFFEFB0101FCFEFBF9FBF8FAFCFAFD01FE0002FE0000FE010200050603060401EB +:2035000003000003010207040203FDFEFEF9FDFDFA0002FD00FEFBFEFBFB00FD00060201BA +:2035200003FDFF00FD0203FF0708030703FE03FDFB02FDFE07020005FCFCFEF7FE00F90384 +:2035400006FC01FEF8FFFCFB04FFFF0C050106FCFE02FB0104FC060B010401F9FFFDFB0360 +:20356000FEFC0703FF04FCFC00F9FC00FB0207010605FE03FFFB01FFFD0604000400FDFB49 +:20358000FAFDFDFF010104020001FFFDFFFEFF02010303FEFEFFFEFEFFFEFF000105030230 +:2035A0000401FF02FF0003010505FEFFFEF7F9FAF8FDFFFE01FEFC00FCFB01FE000705061E +:2035C00006000303FE0203FF0608050702FE03FCFAFFFBFD03FEFEFFF8FCFDF6FCFEF900FB +:2035E00003010502FE04FFFD06000008050507FF0003FB0002FB0205000400FA01FCF700B0 +:20360000FCFA02FFFF04FEFF04FCFF03FE0408020605FF0301FB01FFFD04020002FCFC009F +:20362000F9FBFFFAFE02FF0302FD0100FB00FFFE04040406040100FEFFFF02010006030084 +:2036400002FDFBFDFCFE00FC0206FD0001FAFDFEFB01FFFE0802FD02FCFB00FD0004FF0683 +:203660000B000303FBFFFFFB0300FE0902FD03FCFAFFFBFE04FE050BFE0102F9FEFEFA0247 +:2036800001FF0C05FD04FCFA00FCFF05FC0209FBFEFFF6FBFDF90000FD0906FF0500FC032D +:2036A000FFFF0701040B010305FCFF00FB0101FD0503FD03FEFAFFFBFB01FCFF05FDFE0204 +:2036C000FBFDFFFBFF00FE0404FF0301FE0200FF02010206010103FF0001FF0000000302DD +:2036E000FF0200FDFFFEFD00FEFF040300FE00FFFBFFFEFC03040304FEFCFEF6F8FDF9FFF4 +:2037000004010403FD0200FB04020009070407010003FCFE02FC0105010504FE0300FB0179 +:20372000FFFC0603FD01FCFAFEF9FCFFFA0007000102FBFFFFFA0100FC0605FF03FEFC00A4 +:20374000FCFE03FE0107010204FE0101FD0101FF0504010401FF03FEFE03FE000802010345 +:20376000FAFBFBF5FAFAF6FF00FB00FDFA00FCFC0300010805040803040601040501050750 +:20378000020503FE01FDFB00FDFD05020004FCFCFCF5FAFCF6FF03FBFFFCF7FEFAF902FE6E +:2037A000000C0A02010301FE03020106060809010002FCFE02FC0003FF0502FBFFFDF7FDDC +:2037C000FCFA01000206FFFE01FBFB00FB0003000705FE0200FAFEFEFC0301020701FF03EA +:2037E000FEFD02FE0105010605FE0100F9FDFDFA01FFFF04FEFC00FBFBFFFCFE03000506D6 +:20380000FF0203FC0001FD0403020A03FF05FDF900FBFC02FD0306FC0001F6FBFEF80100B6 +:20382000FE0600FC03FCF901FDFE0501060A010305FD0104FE0505020A050005FFF900FC61 +:20384000FB02FCFF02F9FBFDF5F8FDF7FF01FE0502FC0300FB01FFFF06070604040402037A +:2038600002010103030403010200FF00FEFEFEFDFF02FF00FFFBFDFBFAFDFBFC00FFFD0062 +:20388000FDFEFEFCFF00FF03050103030002020103020306030204020102000002000305FB +:2038A000FF01FFFAFCFBFAFEFCFC0400FE02FEFCFFFCFF04FD050AFD00FFF6FBFCF902FE3E +:2038C000FE0A01FC05FFFE05FF020801090E000303FAFFFFFA02FFFB0702FC03FDFA00FBCD +:2038E000FC02FC0107FDFF02FBFE00FD0303000B08FF0400FB00FCFB02FD0109FDFCFFF6CD +:20390000F9FCF8FD00FD0505FF0502FF030201060605060404020201FEFFFFFF0203010185 +:20392000FDFBFCF8F8FAF8FBFEFD00FFFD00FFFD01010105050506020203FF0001FF02049F +:20394000020403FF0200FC00FEFE04030204FEFE00F8FAFEF9FE03FF01FFF8FDFBF7FFFD90 +:20396000FC04040406000004FE0206000307020504FF0302FD0301FE06050206FEFAFEF717 +:20398000F8FDF8FC02FF0201F9FDFDF8FFFFFC0607050801FE05FCFC04FC0008030405FC2F +:2039A0000101F80000FB05050004FEF900FAF900FBFD05010406FF0404FB0203FD06070100 +:2039C0000500FB01FAF800FEFBFD0303FE00FEFBFDFEFE01000309030304FEFF01FE0204EF +:2039E000000908010400FBFDFBFAFFFCFF05FDFDFFF9FBFDFAFE00FE0606000502FE01FFD4 +:203A0000FF04020408010104FDFD01FCFE01FF0402FC01FEFAFEFDFC01000104FFFF02FEA4 +:203A2000FE01FE0103020606010403FE0200FE0301020801FE02FAF8FDF9FC00FC0202F985 +:203A4000FEFDF5FBFCF901000007020007010006020409050909010403FBFDFEFAFFFFFE54 +:203A600004FFFC01FBF8FFFBFC02FE0306FE0100F7FCFFFB0303010801FC02FDFA0201FF61 +:203A8000FF0509050603FF01FF0003FE010902FF00F8FAFBF8FEFEFA0406FE03FFFAFFFB27 +:203AA000FB01FE0008040407000202FD0304FF0608000300FBFFFAF8FDFBFC0401FF02FCFB +:203AC000FDFFFBFF01FE0407020503FE01FFFE02000106030203FEFEFFFBFDFEFB0002FEE3 +:203AE0000000FC00FEFC00FFFF05030105000002FE0002FE0205010404FE01FEFBFFFEFCC3 +:203B00000301FE03FEFD00FBFD02FD0108010303FC00FEF9FFFEFB0404FE03FFFC00FBFDB7 +:203B200002FD0209020405FE0201FC0200FC0403FF04FFFC01FEFDFD0203030701FCFFFC70 +:203B4000FAFFFDFE03FF0303FBFEFFF8FD00FB0102FF0602FF0400FD03010207030709FF58 +:203B60000001FAFCFFFA0001FF0600FA00FBF7FDFBFB02010204FF0103FBFE01FD02050363 +:203B80000504010402FF02010106050506000101F9FBFEF9FD01FE01FFF9FEFBF7FFFCFA35 +:203BA00004030105FDFD01F8FD02FB0208020503FC0200FB0301FF0908070A020106FCFDD7 +:203BC00003FB0006FF0100F7FCFAF3FCFBF60000FD02FDFC02FBFC03FE02080407080205FE +:203BE00005FF03030004030205020003FFFDFEFEFF000201FDFEFDFAFBFBFBFDFCFF01FDD5 +:203C0000FEFFFCFDFFFE0102010705010401FF01FFFF01000205010203FF0001FE0202008D +:203C20000806FF04FEF7FAF7F8FFFAFF06FBFCFFF6FAFDFA0102FF0A08020804FF05020290 +:203C40000802060E040306FCFDFFFA0101F90501F6FDF8F3FBF8F902FCFF0AFEFD02FAFE80 +:203C600002FD0205010B0C030A07FE0401FE0601FF08FFFD02F9F8FCF7FAFEFA0002FB0032 +:203C800000FB0000FD0202010904020701FF02FEFF02FE0203FD00FFFBFEFDFCFFFFFE0320 +:203CA00000FE02FFFFFFFEFF0001030303020001FFFDFFFEFF02020202FE00FFFAFDFEFD0E +:203CC0000102010401FF02FDFD02FE0107030403FD00FFF9FEFEFB0303FF02FEFC02FDFCE6 +:203CE00002FE0209030305FE0000FC0202FE08080003FEF9FEFAFC01FBFD0600FF01FAFEBD +:203D0000FFFA0000FD0508020604FF0400FF0500000A040105FCFBFDF7FBFDF8FF03FC019F +:203D200000FB00FDFB01FEFF07040207010104FE0104FE0409020403FBFFFBF900FCFB0577 +:203D400001FE03FBFAFEF8FC00FB0309020504FC01FEFC0400FE0A06000500FBFAFDFFFE6B +:203D60000201020600FE00FBFAFFFCFF03000605FE0201FAFEFFFC0302030902FF03FCFB3D +:203D8000FFFCFF03FF0505FD0100FAFEFEFB0201000601FE02FEFC00FDFF0301040601031C +:203DA00003FE0000FD0201000501FE00FCFBFDFBFCFFFE0002FF0002FF0001FF020201040B +:203DC000030103010002FFFF03010306000002FBFCFEF9FEFFFD0300FB01FDF7FDFBFB02FC +:203DE000FF0208000207FCFD03FD0305010905FD03FFF802FFFC05000206FBFD01F8FC02B1 +:203E0000FA0104FF0704FC0200FA01FFFC0401020803FFFEFFFEFE01FFFE06070102FEFD92 +:203E2000FEFAFCFDFA0005000203FCFFFEFC0100FF07050004FFFDFFFBFE00FD0004FF0193 +:203E400002FE0100FE0201010605010400FE00FDFDFFFD0002FEFF00FCFDFEFCFFFF000467 +:203E600002FF0200FE00FF0003000408010204FEFFFFFBFFFFFD0704FD02FDF9FEFAFA0048 +:203E8000FB0008FF0105FCFE00FC0303FE0A08000702FB02FEFD05FE010AFDFE03F9FBFF0E +:203EA000F90002FC0706FC02FFFA00FEFC0500020D020005FAFAFEF9FF01FB0506FD02FF03 +:203EC000F9FFFEFB0300010C0601FEFCFDFBFDFEFC0104030300FDFFFDFE00FF02060405DF +:203EE00006010201FC00FFFD0101FF00FDFCFEFCFCFEFCFF02010404FF0101FD0100FE03CC +:203F0000040307030104FCFB00FAFC03FEFFFEF8FCFCF7FCFCFA02040306030105010105A8 +:203F2000010409060807000301FAFEFEFA0101FE01FCFAFFF9F8FEFAFC03FF0002FC00028D +:203F4000FC0001FE05070408040005FFFC02FEFE05010205FDFE01F9FD00FB0003FF02004E +:203F6000FC01FFFC01FEFF05030305FFFF02FDFF02FD0205010402FE02FFFB00FDFD030536 +:203F800001FEFEFEFBFCFCFBFEFF0005010002FFFF01000305020B0D040604FAFCFAF9FF1C +:203FA000FAFB04FCFB00F9F9FDFA0004FD0708FC0301FA00FFFE0602020D040106FEFD0202 +:203FC000FD0105010706FC0200F7FEFEFA01FFFE03FBFB00FAFAFFFBFF04010707FF0202EB +:203FE000FB0001FD0303020902FE03FEFC01FDFD03000405FE0001FBFEFFFA0000FF0501BD +:20400000FE03FEFB01FDFE05000305FCFF01F9FCFEFAFF01FF0401FD0300FE0300010804A2 +:20402000070A000003FAFBFEF9FF01FE03FFFA00FDF9FEFDFD040504020202FF00FFFD0189 +:20404000000007050103FDFDFFFBFE00FC0207000202FC00FDFA00FDFD06030003FDFDFF63 +:20406000FBFF01FD0307000302FD01FFFD02FFFF0401FF02FFFF01FF010200040602030326 +:20408000FE00FEFCFFFEFD0302FF01FCFBFEFAFC00FC0006000202FC00FEFA01FFFC06053D +:2040A0000005FFFC01FCFE04FE030C030406FC00FFFA0300FB0705FD04FDFA00F9FC04FBFC +:2040C000000AFF0002F9FEFEF80101FB0808FF0500FB02FBFD05FD010C020104FAFEFEF8DE +:2040E0000101FA0505FB02FDF8FFFAFA0200FF030504010201FE01020105040708020203A3 +:20410000FDFD00FBFF01FE0301FBFFFCF7FBFAF9FFFE0004FEFF01FDFE00FF0204030706BE +:20412000030503000301000402030500FF00FCFBFDFBFD00FEFFFFFBFEFDFBFDFDFD000192 +:204140000103000103000003010306050707020501FA00FFFB0403FE01FAF7FCF3F5FCF66E +:20416000FB01FE0103FD0202FD030402090A080C070408010004FF0004000101FBFDFEF907 +:20418000FCFCF9FEFFFDFFFDFBFFFDFCFFFEFF03020305010203FE0002FF0305040603FF23 +:2041A00002FDFAFFFFFDFD0201FD00FFFBFCFDFE01000207010002FDFE00FE000200070608 +:2041C000000402FE01FFFE02FF0107000002FCFDFEFB0000FD0605FE03FFFAFEFCFC03FDE8 +:2041E000000AFFFC00F7F9FEFB0103FF0908000604FE0301000701020B00FD01F9FAFDF8B6 +:20420000FDFFFB0507FD0300F9FFFDFB0400000C02FE03FAFA00FBFF03FC0509FD0201F9A4 +:20422000FFFFFC0502010D05FF05FCFAFFFAFD03FC0308FC0000F8FCFDFA0000FF0905017B +:204240000701FE03FEFE04FE0307FE0001FAFDFDFAFFFFFE0402FF04FFFE0100FF00020557 +:20426000040404FF00FDFAFDFCFC00000002FEFFFFFAFDFFFD0205020503FE02FEFC01FF4B +:204280000005030405FF0001FBFE00FC0103010401FD01FEFB01FEFE05030306FF0002F90F +:2042A000FD00F90206FD01FEF8FDF9F901FCFD0802FF04FCFE01FC0105FE070C020503FC02 +:2042C00001FFFC03FFFC0602FF04FEFD01FBFE02FC0106FF0303FC01FEFA01FFFC0401FDE7 +:2042E00001FDFC01FCFE01FE0208020405FE0200FB00FFFB0403FD03FEFBFFFAFC01FC00CE +:2043000008010204FD0000FB0201FE0706000500FD01FEFCFD0103040700FAFDFBF9FCFB9D +:20432000FC00000404FE0001FCFF01FF0405040A05020600FC00FDFE02FF0304FCFF00F968 +:20434000FCFDFA0000FF0501FD02FEFA00FDFD04000406FEFF02FAFCFFFB0002000604FF6C +:204360000301FF03010105030508010103FDFEFFFBFF00FE02FFFBFEFCFAFDFBFBFFFEFF4A +:2043800003000003000102000203020605010402FF01FFFE01FF0104FEFE01FCFBFFFBFE0D +:2043A00001FE0201FBFFFFF9FEFEFB0201020700FD02FCFB01FD0005020807000402FB01FA +:2043C00002FD0503020800FD02FEF9F9FEFEFC0604FC00FDFCFEFBFF03FD040C030302F8DE +:2043E000FCFBF7FFFEFB0605000601FF04FE010600040C050505FBFEFCF8FFFEF90303FCB9 +:2044000001FBF7FDF8FA01FCFF08030205FDFF00FB0101FF0807000502FE02FFFE02FF029E +:2044200007000103FCFEFFFBFF00FE0504FD0200FBFFFCFB01FDFE06FFFE03FCFDFFFBFF93 +:2044400002FE0709010604FC00FEFC02FF000800FE03FDFC00FC0004FE0608FE0302F9FD43 +:20446000FDFA01FEFC0700FC02FAF9FEFBFE03FD0509FF0303FAFF00FD0402FF0903FF053D +:2044800002FEFDFFFFFF03040202010001FDFCFFFDFF04030304FE0100F8FCFDF90102FF28 +:2044A00002FEFB00FBFA00FBFF05020405FF0203FD0203000607040804FF04FEFC00FDFEE7 +:2044C00003010102FCFDFEF9FDFEFB0001FF02FFFD00FDFCFFFEFF020102040002030102EB +:2044E00003010405040603FF03FFFCFFFCFC02000002FCFCFEF7FAFDF9FF03000301FC01CA +:20450000FEFA02FFFE07050307010105FCFE03FE0307010403FC00FEF8FFFDFC040403077E +:2045200000FD01F8FB01FA0005FF0101FB00FDF900FFFD0606040703FEFEFEFFFF02010087 +:2045400006030002FEFCFFFD0002FD0306FE0001FBFDFEFB00FFFF0602FE03FFFE00FEFF61 +:2045600001FF0204000201FF0100FF0101010502000300FFFFFEFEFFFE0001FEFF00FCFE37 +:20458000FEFD0001020704010500FB01FDFD01FD0101F7FAFCF5FBFFFA000201090400062A +:2045A00000FC0402020906090C000205FC0003FC0404000700F8FEF8F3FEF9F802FC0004F0 +:2045C000F9FB00F6FA01FB0206030A07000603FB0502FE07020308FFFF05FAFB02FA0004CA +:2045E000FE0502F9FFFDF6FDFCF801FEFF0501FFFFFF0102020303060805060402020000AD +:2046000001FF0104FFFEFFFBFBFCFAFCFCFB0000FE00FEFDFEFCFD00FE01050202030002BD +:2046200001FF02020105050205020002FEFF01FE0005000102FCFFFEFA00FFFC0605FD0066 +:20464000FBF8FCF6F9FEFAFF07FFFF02FB0001FD0405010B0C040905FF05FFFF06FF010B3F +:20466000010103F9FBFCF6FEFEF70203F900FCF7FEFAF901FCFE09030207FF0205FE03065D +:2046800000080B020704FD02FDFB02FDFC0700FD01F9FAFDF6FBFEF80004FD0201FB01FE2E +:2046A000FC0200010A0A05040404FF0000FE0203030500FE00FAF8FCF8FBFFFC0100FBFFF7 +:2046C000FEFAFFFFFE03020307020205000002000306030704FE0200FCFFFEFC02010207B4 +:2046E000FFFD01FAF7FCF8FB00FD0302FAFEFDF7FDFEFC03040408040305000005010308C8 +:20470000040505000202FD0000FD02020003FFFD01FCFAFEFBFC02FF0103FCFEFEF8FDFEAE +:20472000FA0002FF0300FD02FFFD03000107050507010204FD0001FD0204010301FE01FD5B +:20474000FA00FDFD04010103FCFE00F8FCFEF90004000402FC01FCF800FDFD050602FF0175 +:2047600002FF0101000404050A030104FFFF01FE0002FD0204FC00FFF9FCFCFC00FEFF052B +:2047800000FF02FEFDFFFDFF01FF0506000403FE0200FE0401010A03FE02FBF9FCF9FCFF1B +:2047A000FB0205FC0000F9FDFEFC02010009040106FFFE02FE010500070B010302FAFEFFE2 +:2047C000FB0200FE0904FE03FAF6FDF9FB01FB0209FD0002F8FDFFFB0402FD0904FC04FEEC +:2047E000FA01FDFE05FF040B020408FF0102FC0101FC0603FC02FDF8FCF9F9FFFBFF06FDC0 +:20480000FE02FAFCFFFB0002FF0807010603FE0300FF040302030202FEFEFDF9FCFDFD0195 +:2048200000FF00FDFDFFFCFD00FE0205030505000201FD00FFFF03020102FFFF00FCFE0077 +:20484000FE0105020403FD00FDF9FEFDFB02010003FEFD00FBFD02FD0107030505FE02FF56 +:20486000F9FFFEFC0503FF03FFFE01FDFF02FF0206010303FF0201FE0301FF08060004FE1F +:20488000FAFDF8FAFFF8FC03FCFF01FAFEFEF90101FD0808010600FC02FDFE04FD010B0230 +:2048A0000205FCFF00FB0202FD0706FE0400FB00FBFB02FCFF0800FF02FAFDFEFA0000FB0A +:2048C0000507000603FD02FDFD040200020603FE00FCF6FBFCFB00FF0306FF0002FBFE02D3 +:2048E000FD0205030906FE03FFF900FEFC03000305FDFE00FAFBFEFB0002020805000301A6 +:20490000FC0100FE03020306FFFF01FCFCFEFBFE01FF0403FE0100FBFEFDFD01000205009F +:204920000104FEFE01FD0003000504FE01FFFBFFFEFC0200000600FF04FEFD01FD00040072 +:204940000505FE0202FAFFFEFA0200000700FE03FCF900FBFC02FE0304FD0101FBFF00FD67 +:204960000203020805020601FE03FF0005010506FE0101F8FBFCF8FEFFFD03FEFAFFFBF73C +:20498000FCFCFCFE0104020304020303040504050A060406000000FCFEFEFB0102FCFEFCF7 +:2049A000F9FCF9F9FDFBFD04000003FF0000FD0002000608030503FF02FFFE0300010803F0 +:2049C0000003FDFF00FBFF00F90002FBFFFDFAFEFBFC02FF0109020004FEFD01FD0104FEF0 +:2049E0000708FE0402FAFFFEFB04FFFE0B00FB03F9F800F9FF04FA0507F90101F8FFFFFBC9 +:204A00000501000D050008FFFD04FE0007FF060BFE0202F7FBFDF7FFFFFC0801FA02FCF886 +:204A2000FFFBFC02FC0208FD0002FBFF01FD03030108050106020004020001010302010155 +:204A4000FEFDFDFBFBFCFCFEFFFF00FEFDFFFEFEFFFF0103020403000200FE00FFFF020271 +:204A60000203FFFF00FDFEFFFD0102000201FE01FFFD00FF0004030305000103FCFE00FC33 +:204A80000205010402FC00FAF6FEFBFC0401FF03FCFD00F8FD01FC0307020504FF0502FD1D +:204AA00005020009070407FEFE02F9FBFFF9FE02FE0201FB01FEF8FEFCFB03020004FFFEFC +:204AC00003FEFE03FE0207030505FE0201FB0100FC05050105FEFAFEF6F6FDF7FA00FCFFEC +:204AE00000FBFF00FB020300070806090502070300010102020604000200FCFEFDFE02FE86 +:204B00000409FCFBFAF2F4F7F5FAFBFA0502FE0400FD0302040A05090F040506FE0001FD95 +:204B20000302FE0903FB02FBF6FDFAFB02FB0007FBFD00F7FBFFFA0102FE0B08FE04FEF992 +:204B400000FEFD03FF0105000205010405030608060A07020602FC00FDFB00FCFCFFF7F835 +:204B6000FBF5F6F8F6F9FCFBFF00FD0102010403030606060805050703030400010200032C +:204B800002FD00FFFAFCFCFAFDFDFD01FCFCFFFBFBFEFCFE01000406020707FF0203FF062A +:204BA00005050A01FC00FAF4F6FCFBFA0402FBFFFDFC00FC0005FF050B030304FD0102FEFE +:204BC0000503FE0908FF04FEFBFFFAFC00FAFE06FEFF00FAFEFFFB0100FE0707010702FFCA +:204BE00003FDFD02FDFF0701FF01FAFCFCF8FDFEFA0203FE0200FE02FFFF030103090503B8 +:204C000005FF0102FDFF00FE0102FE01FFFD01FFFE00FFFF03000004FFFF01FCFF01FD0298 +:204C200006FF0302FC00FCF900FCFB0601FD03FBFBFFFAFF04FE070E040604FAFFFDFA0474 +:204C4000FFFC0902FC04FBFB00F8FF04FB050BFE0202FA01FFFC0601FE0C06FE04FEF9F951 +:204C6000FDFFFC0201010400FE00FBFAFFFCFE02000606000203FE0102FE03040407030120 +:204C800002FFFEFFFDFE00FF0000FDFEFEFEFEFEFEFF00000200FF000000FFFFFFFFFF0030 +:204CA00000000001010000FF01010102010001010100FFFF00010203000102FEFF00FD01E8 +:204CC00004020501FD01FBF7FEFAF901FFFF03FCFE00F9FF03FD0409050906FF0601FC07C9 +:204CE00001FE09040002F8F9FEF5FC00F6FE03FBFEFFFA0100FC0503010C0B080B020005A6 +:204D0000FCFF04FB00070002FFF6FBF9F3FCFAF600FFFD01FFFCFEFE0002030606080706AE +:204D200006050504040404040404010000FDFBFBFAFAFBFBFDFBFBFDFCFCFCFBFDFFFD0091 +:204D400002FEFF00FF00000001020307050205040203020104020509010202FCFCFCF8FD2E +:204D6000FDFC0602FAFEF9F6FBF9FC01FB0207FD0002FAFE02FF0706020F08FE05FFFA023A +:204D8000FEFE05FD020AFDFF02F9FD00F90203FC0806FD04FEF8FFFBFA03FE0008FFFF0318 +:204DA000FCFF02FD0104010707000401FE0100FE0100FF01FEFE00FDFFFFFCFF01FE0303EB +:204DC000FC00FEFBFEFCFBFEFDFE02FFFFFFFE01010002020306060605030401FF02FFFFCC +:204DE00003010102FDFFFEF9FEFDFB0203000400FE02F9FB02FB01080000FEF7FFFCF601D9 +:204E0000FEFB07040006FFFD04FB0007FF050D050807FD0401F80401FB0704FE03FAF8FE6B +:204E2000F4F800F7FC05FCFE01F9FDFEFA0102000808040906030705040704050B05050542 +:204E4000FDFDFDF7FBFAF6FBFCF7FBFAF6FBF9F9FFFCFE05000004FEFF02FF02040206079E +:094E60000505040204010103022E +:00000001FF diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_thrust.qip b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_thrust.qip new file mode 100644 index 00000000..745c795e --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_thrust.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "ROM: 1-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "rocket_thrust.vhd"] diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_thrust.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_thrust.vhd new file mode 100644 index 00000000..ee166fd8 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rocket_thrust.vhd @@ -0,0 +1,143 @@ +-- megafunction wizard: %ROM: 1-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: rocket_thrust.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY rocket_thrust IS + PORT + ( + address : IN STD_LOGIC_VECTOR (11 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END rocket_thrust; + + +ARCHITECTURE SYN OF rocket_thrust IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => "thrust_8_11.hex", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 4096, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => "CLOCK0", + widthad_a => 12, + width_a => 8, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + q_a => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +-- Retrieval info: PRIVATE: AclrByte NUMERIC "0" +-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clken NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "thrust_8_11.hex" +-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "4096" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: RegAddr NUMERIC "1" +-- Retrieval info: PRIVATE: RegOutput NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: SingleClock NUMERIC "1" +-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +-- Retrieval info: PRIVATE: WidthAddr NUMERIC "12" +-- Retrieval info: PRIVATE: WidthData NUMERIC "8" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: INIT_FILE STRING "thrust_8_11.hex" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "4096" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "12" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: address 0 0 12 0 INPUT NODEFVAL "address[11..0]" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +-- Retrieval info: CONNECT: @address_a 0 0 12 0 address 0 0 12 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_thrust.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_thrust.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_thrust.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_thrust.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rocket_thrust_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rotate_8_11.hex b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rotate_8_11.hex new file mode 100644 index 00000000..17dbc16d --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/rotate_8_11.hex @@ -0,0 +1,143 @@ +:20000000FEFDFCFD00010202FF01040404020002040403FFFDFF0001FFFBFAFDFE00FFFDE5 +:20002000FE010203020103040404020102020202FEFDFEFEFFFEFBFCFEFFFFFDFCFEFF01C1 +:2000400001FFFF01000000FEFF01020301000102030302010202020200FF00FFFFFFFEFF8F +:20006000010101010101030202020102030201010000FFFEFDFCFCFDFCFCFBFBFBFCFCFD9A +:20008000FEFEFEFF000001010103030304040506050504040505040201010201FFFEFDFD2A +:2000A000FDFDFCFCFBFBFCFBFCFCFCFDFDFCFDFEFDFDFDFDFEFEFF0001020405050606056B +:2000C0000606050403030303030200FFFFFEFEFEFDFDFEFDFEFEFCFDFEFDFEFFFF0102021C +:2000E00002010001000000FFFF00000000FEFF0000000100010202030303030302020202E4 +:200100000200FFFFFEFDFEFDFDFDFDFEFEFEFF000001000001010202010000FFFEFFFEFEF9 +:20012000FFFEFFFFFF000000010101020202020102020202020202010000000000FFFFFDAF +:20014000FDFDFDFDFDFCFCFDFDFDFCFCFEFF000101020404030200010202020201020302A8 +:200160000200FF00000000FFFF01020101FF0001000101000001000503F8FD0606FEF4F28B +:20018000FC0708FEF2F3000A08FEF4F7050D0A01FAFE080E0A01FAFF080A05FDF9FF060530 +:2001A000FFF7F6FD0301FAF5F7000401FAF6FB050702FAF800090901F8F8020906FDF6F87D +:2001C000010704FDF9FC050905FEFC020A0C05FCFB040E0C00F5F6020C07F7EDF40409FEFF +:2001E000EEEBFA0A09F9EBEF010F08F8F1F90B140AFBF70112170AFBF703111102F4F402FA +:200200000F0AFAEFF4030D04F4EEF6050C01F3F0FB0C0E00F2F3000D0BFCF2F6030F0BFDF7 +:20022000F4F9071008FBF6FC080C02FAFC050B06FDFAFF070801F9F9000604FCF6F90005B1 +:2002400002FBF7FB020602FBF9FF070801FAFA010707FFF9FA020805FDF7FB040803FBF7AE +:20026000FD070902F9F8010A09FFF7F8020A07FCF5F8040902F8F4FB070A02F8F7000C0C70 +:2002800001F7F8040E09FBF3F8070F08FAF4FD0D1002F2EFFD0B08F9EEF2020C06F7F0F987 +:2002A000080F06F8F5FF0E1104F8F704120EFFF3F6040F09F9F1F7070E04F5F0F9090E0309 +:2002C000F4F2FF0E0EFFF1F3020D08FAF1F6060E06F7F1F9080E04F8F4FD0B0E04F9F80135 +:2002E0000E0BFDF8FF090B01F7F5FE0807FCF6F9040C06FAF6FD0A0F05F7F4FE0B0BFBEDF0 +:20030000EEFD0805F6EDF4040E06F6F0FA0A1005F8F6020F1003F8F905111003FAFD0A13B7 +:200320000BFBF2F8060C02F2EDF70507FBEFEFFD0A09FAF0F5040E09FBF5FC0B1209FAF5F3 +:20034000FF0D1003F6F5000B09FDF4F6000705FDF9FD05090600FD020A0B04FCF9FF06046F +:20036000FDF7F6FE0502FAF4F6000602FAF6FB060A04FBF8000A0A00F7F6010B08FEF6F8AF +:20038000040B06FCF7FC0A0F07FAF5FE0B0D02F5F3FF0C08FBF1F5030C03F5F5010D0AFC46 +:2003A000F3F8091105F4EFFC0D0FFFF0F2010E09F9F0F605100AFBF5FC0C130AFCF7000F2A +:2003C0001304F4F1FC0400F9F7F9FF02FFFBFC000302000003060502FF00020301FEFBFB33 +:2003E000FEFFFEFCFCFE010201FFFEFE0001FFFDFD000202010002040504030304050504E7 +:200400000100000100FEFCFCFDFEFDFBFAFBFEFFFFFEFEFF020302010102040402020203E9 +:20042000040200FEFEFFFFFDFAFAFBFDFDFCFAFAFDFFFFFEFEFF02040403030406060403C9 +:2004400003040505030201020302010001010200FFFFFF0000FFFDFCFCFDFCFAF8F7F9FBB2 +:20046000FBFAFAFBFE010100000205070706060608090705050505030200FEFEFEFDFCFB4C +:20048000FBFBFBFBFAFAFBFDFDFDFDFEFF0000000001030303030304040403010102020269 +:2004A0000100000000FFFEFDFDFEFFFEFEFDFF01010100FFFFFEFEFEFEFEFEFEFF0001025A +:2004C000010000010202020202030303030201010100000000FFFEFEFDFCFCFCFDFDFDFD1F +:2004E000FEFF00010100FF000102020201010203040504030304040403010100FFFEFCFCD7 +:20050000FBFAFAFAFBFBFBFCFDFDFDFEFEFF000103030304050607060505040404030101D2 +:2005200000FFFFFFFEFEFEFDFDFCFDFDFCFCFCFCFDFEFEFEFFFF00000101020202020303DF +:20054000030304030202020100FFFFFFFFFFFEFDFCFBFCFDFDFDFEFFFFFF000001020303A3 +:200560000303040506040303030201FFFEFEFFFFFEFDFCFCFCFCFCFCFCFDFDFEFEFEFF018A +:2005800002030303030304040404040404040302020201010100FEFDFCFBFCFCFDFCFBFA46 +:2005A000FBFCFDFDFDFE000102020102030304030303040B0F06FBF7FD0709FFF5F3FC0826 +:2005C00004F7F2F9050900F7F6010C09FEF6FA070E07FAF5FC080C03F8F6000C0CFFF5F529 +:2005E000000B08FDF5F8040B06FAF5FC0B0F05F6F2FF0E0EFEEFF0000C07F7ECF3040C0303 +:20060000F6F2FC0C0F03F7F6010E0F02F7F8040F0BFFF7F9050F09FDF6FB080E06F9F3FAC2 +:20062000070AFFF2F0FA0605FBF2F4010B07FCF5FA080E06FBF6FE0C0F05F8F5000C0CFFB5 +:20064000F4F4010C08FBF2F7070E05F8F2FB0A0D02F4F1FD0A09FDF3F5010C09FEF7FB08B9 +:200660000F09FEF9FD070904FCFA00090901F9F9020A08FEF6F7020800F5F5FE0907FBF271 +:20068000F6040A02F5F1FA0A0C00F3F3010E0CFFF5F806110BFDF4FB090F06F8F4FE0C0F40 +:2006A00003F6F5020E0BFBEFF3010B06F8F1F7060D05F8F3FC0A0D02F7F5000D0E02F6F754 +:2006C000040E0AFBF2F7050D07F9F2FA090E03F5F2FE0B09FCF1F3000B07FCF4F9070F090F +:2006E000FCF7FF0D1208FAF6010F0EFEEFEFFD0904F6EDF2000902F6F1F9080D05FCFA031A +:200700000F1108FEFD07110F02F7F7030C06F7EFF3010800F4EFFA090CFFF0EEFD0B09FBCD +:20072000F1F505100AFAF2FA0A1107F9F5FF0C0E00F7FC091006F8F4FD0B0D00F4F4FE08A4 +:2007400005FBF6FA020603FEFD00060804FFFF030A0902FCFB020A07FCF4F5FF0702F5EEA1 +:20076000F4020800F3EFF9070AFFF3F2FF0C0BFEF5F906110D01FAFF0D150CFEF8000F1246 +:2007800006F7F3FF0C09FAEEF0000B04F3EBF3040B01F2EEFA0A0C00F3F4000D0D01F8FAA9 +:2007A00005100E04FD000C130DFFF7FB070A01F5F1F90507FDF3F2FD0907FBF1F4010A041D +:2007C000F8F1F7050B03F9F5FE0A0B03FBFB040E0E04FCFD070F0B00F9FC070C04F8F2F602 +:2007E0000002FBF4F3FB0504FBF7FD080B03F9F8020B08FDF6FA060E08FBF6FD0B1005F7F8 +:20080000F3FB0101FDFAFC010301FEFF010303010002040300FDFD000100FEFBFCFFFFFEF6 +:20082000FCFBFD00020201020407070502010405040100000101FFFBFAFBFDFEFDFCFCFEB6 +:20084000000000FFFF01030403010204040401FFFF010201FEFDFE000100FFFF0001010083 +:20086000FEFEFF0000FEFCFCFDFFFFFEFE0002020201010203030201010203020100010172 +:200880000100FEFE000000FFFEFE00020200FEFE000100FEFCFDFF00FFFEFE01020200FE6B +:2008A000FF000101FFFFFFFFFFFFFEFE00020201010001030302010001010101000000012C +:2008C0000100FFFFFFFFFFFEFEFF010101FFFFFF00FFFEFE0001010000010203020100011A +:2008E000020201FFFEFF0000FFFDFCFCFDFEFEFF00010204040404040302020101010000EA +:20090000FFFFFFFFFFFFFFFFFF0000FFFF00010000FF0000010101FFFDFCFBFCFCFCFCFC00 +:20092000FCFCFCFCFDFE000204050607080909090808070706040200FFFEFDFCFCFCFBFA84 +:20094000F9F8F9FAFCFCFBFAFBFCFDFDFCFCFDFE00010202020303040404040405040403B1 +:20096000020101020202010100000001020303020202010101000000FFFFFEFDFCFBFBFB73 +:20098000FBFBFCFDFDFEFEFEFF00000101020203030303030303020202020101000000004D +:2009A00000FFFFFEFEFEFEFEFDFDFEFEFEFEFEFFFF0001010001020202020203030301003E +:2009C00000010100FFFEFEFEFEFEFEFDFE0001010000FFFFFEFDFEFEFFFEFEFF000103042E +:2009E00003030201010203040200FF0000FFFEFEFF00FFFEFEFF0100FEFAF7010C07FCF5FA +:200A0000FB091007F7F2FD0E1305F2EFFD0E0CF6EDF5050D03F4EFFA0A0D03F9F905110FBC +:200A200004FCFE09100BFFF9FB040802F9F5FA0203FCF5F4FA0000FAF6F8FE0301FCFBFEE8 +:200A4000030503000003070804000004090802FDFD020604FDF8F9FF02FFFAF7FA0103FF7C +:200A6000FBF9FE060701FBFB020A0900F9FB050B06FBF6FB070B03F8F5FE0A0A00F5F50077 +:200A80000B07FBF3F7060D06F9F2FB0B0F03F4F2000E0CFCEFF3030E07F7F0F8091005F759 +:200AA000F3FD0C0F04F8F6000D0D01F7F7010A08FFF9FB040A06FEFBFE060903FCFAFF0612 +:200AC0000600F9F8000804F9F5FD0809FEF2F0FC0704F7EFF2000802F8F4FB080C06FEFC53 +:200AE000040F1007FFFE070F0C01FAFB050B04F9F4F9040800F5F1FA0606FCF2F2FE0907D7 +:200B0000FCF3F7050E08FAF4FC0C1004F4F1FE0D0CFEF2F5051009F9F1F8070E07F9F5FEE1 +:200B20000C1006F9F6000E1004F8F7020E0BFCF1F4020C05F5EEF5040A00F2EFF9080B00B1 +:200B4000F5F5010D0C00F8FA050E0A00FAFD090F08FCF7FD070901F8F6FD0606FEF8F80085 +:200B60000603FCF7FA010501FCFAFE050803FDFB00070701FBFB020705FDF9FB040902F970 +:200B8000FA020A07FCF4F8040B03F5F1FA080AFEF1F1FF0C0AFDF3F707120AFAF2FC0C1158 +:200BA00005F5F2000F0FFFF1F303100BFAEFF6071007F5EFF90A1003F4F1FE0E0EFFF2F44F +:200BC00002100EFEF3F6040E09FAF2F7050D06FAF5FC090E05FAF7000C0E02F7F7030E0BDA +:200BE000FDF1F2FE0600F4EFF5010600F7F5FD070903FEFE050C0C04FF00070C0901FCFF02 +:200C0000070B04FBF7FB0507FEF4F2FA0404FBF2F3FE0703F8F2F6020903FBF8FD080B0501 +:200C2000FEFD030C0C06FFFF060D0A01FBFC050B05FAF5F90408FCF3F60103F8F6F8FB01B1 +:200C400002FEFDFF030300FDFD01030200000305050402020406060301000100FDFAF9F97F +:200C6000FBFCFBFAFAFCFF01010002050707060405070706030202030300FDFCFDFDFCFB62 +:200C8000FAFAFBFDFDFBFAFBFD00000001030506060301010100FDFBFBFDFF00FFFEFE0079 +:200CA00003040200020304040303040504010000020301FEFCFCFEFEFEFDFDFEFF00FFFE20 +:200CC000FEFF0102010000000000FFFEFDFCFCFCFCFCFDFEFF000000020405050404050610 +:200CE0000605030202020100FF000000FFFDFCFDFDFCFBFBFBFBFCFDFDFDFEFF0101020210 +:200D00000304040404040505050403010100FFFEFDFDFEFDFDFDFDFDFEFEFEFCFCFDFEFFD2 +:200D2000FEFDFEFF0100000102020203030304040303030303030304040403030302010075 +:200D4000FFFFFFFFFEFDFCFCFCFBFAFAFAFAFAFAFAFBFCFDFEFF00010102040405060505C5 +:200D600005050504040403020202020100FEFEFDFDFDFDFCFCFDFDFDFDFCFDFEFFFFFF007C +:200D80000101010000010101010203030403020202030303020201FFFEFDFCFBFBFAF9FA50 +:200DA000FBFCFDFEFFFF0001020203030404040402020202020100FF000000FFFF0001011E +:200DC000010000000000FFFFFFFEFEFEFFFF00000101000000000101010100000000FFFF19 +:200DE000FEFDFDFDFCFCFDFF00000101030405040404040403030200000000FFFFFEFEFEE8 +:200E0000FEFEFDFDFDFDFEFEFEFF000101020202020202020100000000FFFFFEFEFFFF00E0 +:200E2000000000000001010609FFF4F1FA0508FEF3F3FF0D0CFEF3F604110DFEF6FB0912A7 +:200E40000BFDF7FE0D1308F8F3FD0C0CFDEEEEFD0A07F6ECF1020D05F4EDF7091002F4F7C1 +:200E600005110BFBF4FB0C1206F7F3FD0B0D02F8F9030D0B01FAFB050C07FEF9FC0306012B +:200E8000FAF8FC0203FEF9F8FD0303FDF8F9FF0401FCF9FC020603FEFCFF060703FEFD017A +:200EA000070602FEFD01060400FCFD040805FDF9FC040702F9F6FC0607FFF5F5FF0A09FE23 +:200EC000F4F7050D05F6F0F7060B02F7F4FF0E0F02F7F805110DFFF5FA091007F7F1FB0A0A +:200EE0000CFEF1F0FE0C09FBF1F505110AF9F0F7080F04F6F1FC0B1003F6F4FF0C0D01F5FF +:200F0000F6020D0AFEF6F8050F0AFDF5FA070D04F7F3FB090AFCF3F7030A02F6F2FA0606D9 +:200F2000FEF7F7010A08FFFAFE080E0900FC000B0E05FBF7FE0809FEF3F2FD0704F8EFF2BD +:200F4000FF0802F6F1F8070B02F7F4FE0A0D04FAFB06121004FAFD0A130CFAF0F6050B015F +:200F6000F3EFF9080AFDF0F2010E0AFAF0F6071009F9F1FA0B1005F6F3FF0E0F00F3F50497 +:200F8000100DFDF1F6071108F7EFF8080F03F4F1FC0B0E01F3F3010F0DFCF0F3020D08FA4A +:200FA000F2F7060E07FAF5FC0A0E05FAF7000A0A00F8F8000705FEFAFC030805FEFAFD0625 +:200FC0000903FAF7FD0608FFF6F4FB0502F7F3FA0407FFF6F6010B09FEF7FB070D07FDF82F +:200FE000FF0A0D05FAF8010C0B00F7F7020B06FBF3F7030A04F8F3FA070C03F7F3FE0B0BDC +:20100000FEF4F4010C08FAF2F7050D06FAF5FC090D04F9F7000B0C02F8F8020B08FEF7FAD8 +:20102000040B06FBF6FB050A01F7F5FC070800F8F8010B0AFFF7F9040B04F9F4F9050901AB +:20104000F6F3FB080A01F7F7010C0AFFF6F7040D09FDF5F9060C04F9F4FC090B01F6F5FFA5 +:201060000B0B00F6F7030E09FCF3F7040B04F8F4FB080C03F7F5FC020300FF000405020065 +:20108000010203020001020301FEFDFF010201FFFF010201FEFCFDFFFFFCFAF9FAFCFCFB70 +:2010A000FAFBFDFEFFFEFE000306070707090B0D0C0A08070808050200FFFFFEFBF9F8F9E9 +:2010C000FBFBF9F7F6F6F7F6F6F5F7FAFDFEFFFF0205080908090A0C0C0A090808080604FC +:2010E00002000000FEFBF9F9FAF9F7F5F5F7F9F9F9F8FAFCFF000000020405040303040641 +:201100000707060607080706040304040301FFFEFFFFFEFCFAFAFBFBFAF9F8F9FBFCFCFCD4 +:20112000FCFEFF00FFFEFF010303030404050606060707070604020000FFFEFDFCFCFDFE83 +:20114000FCFBFBFCFEFEFEFEFF01020100FFFF0000FFFDFE00010201010102030303030397 +:20116000040404030202020100FFFEFEFEFDFDFDFDFEFEFEFEFEFFFFFFFFFFFF000101007A +:20118000FFFFFF000000FF0000FFFFFEFEFFFF000000000001020303030304050504030334 +:1211A0000302020100FEFEFEFEFCFAF8F8F9FBFCFCFE6D +:00000001FF diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/saucer_diode_image.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/saucer_diode_image.vhd new file mode 100644 index 00000000..166310f0 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/saucer_diode_image.vhd @@ -0,0 +1,94 @@ +----------------------------------------------------------------------------- +-- SAUCER DIODE IMAGE -- +-- For use with Computer Space FPGA emulator -- +-- emulates saucer diode matrix on -- +-- Computer Space's Motion Board -- +-- -- +-- This entity is implementation agnostic -- +-- -- +-- v1.0 -- +-- by Mattias G, 2015 -- +-- Enjoy! -- +----------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +library work; + +--80--------------------------------------------------------------------------| + +entity saucer_diode_image is + port( + saucer_enable : in std_logic; + + -- address the vertical slices + -- of the saucer diode matrix image + saucer_ver : in integer range 0 to 7; + + -- address the horizontal slices + -- of the saucer diode matrix image + saucer_hor : in integer range 0 to 15; + + saucer_diode_rotating_light : in std_logic; + out_saucer_image_bit : out std_logic + ); +end saucer_diode_image; + +architecture saucer_diode_image_architecture + of saucer_diode_image is + +type image_line_8_bit is array (0 to 7) + of std_logic; + +type saucer_image is array(0 to 15) + of image_line_8_bit; + +-- defining signal to load images +-- from the arrays +signal image_line : image_line_8_bit; +signal I_saucer_hor : integer range 0 to 15; +signal I_saucer_ver : integer range 0 to 7; +signal saucer_rotating_light_bit : std_logic; + +-- Saucer image +signal saucer_image_1 : saucer_image := ( +("00001000"), +("00000000"), +("01000010"), +("00000000"), +("00000000"), +("01000010"), +("10000001"), +("00000000"), +("00000000"), +("10000001"), +("01000010"), +("00000000"), +("00000000"), +("01000010"), +("00000000"), +("00001000") +); + +---------------------------------------------------------------------------// + +begin + +I_saucer_hor <= saucer_hor; -- 0 - 15 slices +I_saucer_ver <= saucer_ver; -- 0 - 7 pixels per slice + +image_line <= saucer_image_1 (I_saucer_hor); + +-- add saucer rotating light when column 4 is read +saucer_rotating_light_bit <= + saucer_diode_rotating_light when I_saucer_ver = 4 else + '0'; + +out_saucer_image_bit <= + (image_line (I_saucer_ver) or + saucer_rotating_light_bit) when saucer_enable = '0' else + '0'; + --- impacted by saucer enable on strobe input + +end saucer_diode_image_architecture; \ No newline at end of file diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/saucer_shooting.qip b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/saucer_shooting.qip new file mode 100644 index 00000000..b212d849 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/saucer_shooting.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "ROM: 1-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "saucer_shooting.vhd"] diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/saucer_shooting.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/saucer_shooting.vhd new file mode 100644 index 00000000..70b76f21 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/saucer_shooting.vhd @@ -0,0 +1,143 @@ +-- megafunction wizard: %ROM: 1-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: saucer_shooting.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY saucer_shooting IS + PORT + ( + address : IN STD_LOGIC_VECTOR (11 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END saucer_shooting; + + +ARCHITECTURE SYN OF saucer_shooting IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => "saucer_shooting_8_11.hex", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 4096, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => "CLOCK0", + widthad_a => 12, + width_a => 8, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + q_a => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +-- Retrieval info: PRIVATE: AclrByte NUMERIC "0" +-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clken NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "saucer_shooting_8_11.hex" +-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "4096" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: RegAddr NUMERIC "1" +-- Retrieval info: PRIVATE: RegOutput NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: SingleClock NUMERIC "1" +-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +-- Retrieval info: PRIVATE: WidthAddr NUMERIC "12" +-- Retrieval info: PRIVATE: WidthData NUMERIC "8" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: INIT_FILE STRING "saucer_shooting_8_11.hex" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "4096" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "12" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: address 0 0 12 0 INPUT NODEFVAL "address[11..0]" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +-- Retrieval info: CONNECT: @address_a 0 0 12 0 address 0 0 12 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL saucer_shooting.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL saucer_shooting.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL saucer_shooting.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL saucer_shooting.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL saucer_shooting_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/saucer_shooting_8_11.hex b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/saucer_shooting_8_11.hex new file mode 100644 index 00000000..0a48af01 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/saucer_shooting_8_11.hex @@ -0,0 +1,209 @@ +:2000000001010100000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0001FF000100ED +:2000200001010001010001010002010002000001FFFF01FFFF01FE0001FE0000FE0000FEBD +:200040000100FE0100FF01FFFF02FF0002FF0002FF0101FE0101FE0101FE0100FE0200FF9F +:2000600002FEFE02FDFE02FD0003FE0204FF0302FD0201FD0300FE0401FF04FFFF03FEFF77 +:2000800003FDFF01FBFF00FB00FFFB00FFFC01FEFD03FFFF0402FFFE010201050200040364 +:2000A0000203000002FF0001FE0001FDFF00FD0000FD00FEFD00FEFE00FDFE00FDFF02FF55 +:2000C0000203000304010404010402000401FF02FFFE01FEFE00FCFEFFFCFEFFFBFFFFFC1D +:2000E0000100FD0200FE03FFFF04FEFF05FE0105FF0205FF0305FE0403FD0401FC03FEFBEB +:2001000002FCFB02FCFE03FCFF02FB0001FB0101FC0301FD0401FD04FFFE05FFFF05FE00EB +:2001200004FE0104FE0304FE0403FD0401FC03FFFC02FDFC01FBFCFFF9FDFFFAFF00FC01D5 +:2001400000FD0301FF040100050101060401010302000401FE0300FE02FEFE03FEFF03FD80 +:200160000002FC0102FC0201FC0200FC03FFFD02FDFD02FCFE02FCFF02FB0002FC0202FD95 +:200180000402FF0603000601FF05FEFF04FDFF04FC0002FB0000FA01FFFB01FFFC02FEFE5D +:2001A00003FF0005FF0105FE0104FD0203FB0100FB01FEFB02FEFD04FF0005FF0006FF0232 +:2001C00006FE0304FC0101FA01FFF901FDFA02FCFB01FBFD01FCFF01FD0102FE0202000337 +:2001E000020104020104020104010104FF0103FE0101FC0000FB01FFFB02FFFC03FFFD03F0 +:20020000FEFE0402FEFD0000FE0200FD0200FF03FEFE02FDFF03FD0004FD0103FE030300DD +:2002200004020004010003000002FF0001FD0001FCFFFEFAFEFEFCFFFEFD00FEFF01FF00CE +:2002400002000103000203000203FF0302FF0301FE0200FE03FFFF03FEFF04FDFF03FC0089 +:2002600003FC0102FB0100FA00FCF901FCFC02FCFD03FC0004FE0305FF0505FF060400067C +:2002800003FF0601FF05FFFE04FDFE03FBFF02FAFF01FA0000FA0200FB0300FC03FFFD0469 +:2002A000FEFE04FE0004FD0003FC0103FB0202FB0301FB0300FC04FFFE0503000001020236 +:2002C000020201000202000100FF0000FFFFFF00FEFFFFFDFFFFFEFFFFFE01FFFF02FFFF28 +:2002E00002FE0002FE0002FD0102FD0201FD0301FD0300FC03FEFD03FDFE04FD0004FC0101 +:2003000003FD0202FD0301FE03FFFE02FEFF02FE0003FE0103FD0202FD0202FD0301FD04D2 +:20032000FFFE04FFFE04FDFE03FCFF03FB0003FC0202FB0301FB0400FC0500FD05FEFD05C0 +:20034000FCFD04FBFE04FB0004FB0203FD0302FE04020005010004000003FF0001FE000093 +:20036000FDFFFFFDFFFEFD00FFFD01FFFD01FFFE0301FFFE0001FF0201FF0302010400FF88 +:2003800003FEFF02FCFE00FAFF00FA0000FC0301FD0400FF05010106000206FF0204FD0255 +:2003A00003FC0201FB02FEFA02FCFB03FCFD03FC0004FC0103FC0203FC0302FC0501FE0646 +:2003C00000FE05FEFF05FDFF04FC0003FB0002FA0101FB0201FB03FFFC04FFFE060000061C +:2003E000FF0105FD0104FC0203FC0201FC0300FC03FEFB03FDFC03FCFD03FBFF03FC010307 +:20040000FB0102FB0201FC0401FE0501FF0600FF05FEFF04FDFF03FC0103FC0202FD0402CF +:20042000FD0401FD04FFFD0401FCFBFEFEFC01FEFB00FEFE02FE0003FD0103FE0304FE03C9 +:2004400003FE0402FE0401FE04FFFE04FEFF03FC0002FB0102FC0200FB0200FC03FFFC049A +:20046000FFFD04FEFE04FDFF04FD0004FD0204FD0303FD0402FD0400FD04FEFE03FDFE0373 +:20048000FCFF02FB0001FC0101FC0201FD0502FE0601FE06FFFE05FDFF05FCFF03F9FE0061 +:2004A000F7FFFFF801FFFA03FFFC05FFFF07000008000308FE0306FC0304FB0302FB040031 +:2004C000FB04FEFB04FDFC03FBFD03FAFE02FA0002FA0202FB0402FD0501FE0601FF080421 +:2004E000FFFF0201000300FE01FFFF01FCFE00FBFF01FB0001FB0101FB0201FC0300FD050D +:2005000001FF06000106000206FE0103FC0101FA01FFFA01FEFA01FDFB02FEFE05FF0106D7 +:20052000FF0306FE0305FD0303FC0201FC02FFFC03FEFD03FDFE02FBFE02FC0002FC0102BC +:20054000FD0302FE0502FF0601FE05FEFE04FDFF04FD0003FC0203FC0202FC0402FC040088 +:20056000FB03FDFA02FAFB02F9FC02FAFF02FB0204FD0504FF0604000703FF0701FF06FF76 +:20058000FF05FCFF04FB0002FA0101FA01FFF901FDFA03FDFC0301FDFD0000FF0301FF0474 +:2005A000020205010206010205FF0204FC0001FA00FFFA00FCFA01FCFC01FBFE02FC000243 +:2005C000FC0203FD0303FE0503FF0602FF0601FF05FF0006FE0004FCFF02FA0001F9010106 +:2005E000FB0300FB03FEFC03FDFD03FDFF04FD0004FD0204FD0304FD0402FD0501FC04FFF8 +:20060000FD05FEFE04FCFF04FC0004FC0203FC0303FB0300FB04FFFC05FEFC03FCFD04FCE3 +:20062000FE04FB0004FB0103FC0303FC0402FD0601FE0700FE06FEFE06FCFF03F9FE01F8B9 +:200640000101FA0200FA0400FC05FFFE0704FEFE0100FF0300FE02000003FF0103FE01038E +:20066000FD0102FC0102FC0201FC0300FD04FFFD03FDFE03FCFF03FC0103FC0202FC030181 +:20068000FC0300FD0500FE04FEFE04FDFF03FC0003FC0102FC0202FD0302FE0400FE04FF55 +:2006A000FF04FE0005FDFF03FB0002FA0001FA0100FB03FFFC05FFFD06FFFF06FE0006FD3D +:2006C0000206FC0203F90101F90300FA04FEFB05FDFC05FDFE06FD0005FC0205FC0304FC1B +:2006E0000403FC0502FD0601FC05FEFD05FDFE04FAFE03F9FE01F80001F90200FA0300FC0C +:200700000500FF070400FF0102000301FF02010002FFFF02FE0003FE0103FD0102FBFFFEC5 +:20072000FA00FEFB01FDFD01FEFF03FE0103FF0305000404FF0403FE0300FD0400FE04FEB1 +:20074000FD03FCFD02FAFE01FAFF01FB0100FA01FFFC0300FE05000106000206000206FF9D +:200760000305FD0203FB0200FB03FFFB04FDFB03FBFC03FAFD03FA0003FB0203FB0302FB8F +:200780000502FC0601FD0600FE07FFFF07FE0005FC0104FC0203FA0201FA02FFFA03FEFA50 +:2007A00003FDFC04FBFC03FBFF04FB0003FB0203FD0403FE0603FF0702FF0703FEFEFF002C +:2007C000FE00FEFCFFFEFE00FDFE02FE0103FE0102FE0203FE0302FE0300FD02FEFD03FE24 +:2007E000FF03FE0004FD0104FC0101FA01FFFB02FEFB03FDFC03FDFF04FD0004FD0104FD06 +:200800000304FD0403FE0603FE0601FE06FFFE04FCFE03FBFE01F9FE00F900FFF901FFFAE3 +:200820000300FC0500FE07000007FF0107FF0206FD0204FD0303FD0401FC03FFFC03FEFC9B +:2008400003FCFC02FAFD02FAFE02FB0102FB0201FC0402FD0401FE0500FE05FF0005FE019F +:2008600005FD0204FC0202FC0301FC03FFFB02FEFD0401FEFE0000FF0201FF04020103FD71 +:20088000FD00FBFE00FAFFFFFB00FFFC0200FE0400FF05000005FF0105FF0305FE0304FE58 +:2008A0000403FD0401FC04FFFC04FDFC02FBFC02FAFD01F9FE01FA0002FB0202FD0503FF4D +:2008C00006020007010106000105FE0103FC0002FC0100FB01FFFB01FDFB01FDFC02FDFD19 +:2008E00003FD0004FE0204FE0304FE0404FE0502FD0400FC03FEFC02FCFC02FCFE03FC00F1 +:2009000003FD0204FD0303FD0402FD0400FD04FEFD04FDFE04FCFF04FB0002FA0001FA02D8 +:2009200000FB03FFFB04FFFE0602FEFF0201000300FF03000102FE0002FE0203FE0202FDAC +:200940000201FC0200FC03FEFC02FDFD02FDFF02FE0103FF0304000404000503FF0401FE87 +:2009600003FEFD01FCFD01FCFE00FBFE00FBFF00FB0000FD0201FE0200FF0300000400018F +:2009800005000104FF0204FE0203FD0201FC02FFFC03FEFC03FDFC03FCFE04FCFF03FB0158 +:2009A00003FA0101FA0200FB04FFFD05FFFE05FEFF06FE0105FE0204FD0202FD0301FB032F +:2009C00000FC05FFFD05FEFE05FDFF04FB0003FB0102FA0200FA0200FB0400FD0600FF0718 +:2009E00003FFFF0101FF02FFFC00FEFD00FDFE01FF010200030400020300030200020100EB +:200A000001000000FF00FFFE00FFFE00FFFE00FFFD00FFFD00FFFE01FFFE01FFFF02FF00EC +:200A200003FF0103FF0103FE0202FE0201FE0301FE0300FF03FFFF03FDFF03FCFF02FBFFAE +:200A4000FFF900FFFA02FEFB04FEFD05FF0007FF0307FF0306FE0405FD0403FC0401FC0483 +:200A6000FEFC04FDFC03FBFD03FAFE02FA0002FB0202FB0302FC0401FC0500FD06FFFE0684 +:200A8000FDFE05FC0005FC0103FC0203FC0302FD0401FD04FFFE0401FEFFFF00000000FF53 +:200AA00000000001FFFF00FF0001FF0001FF0001FF0101FE0100FE0100FF02000103000132 +:200AC00003FF0102FE0101FD0100FC02FFFC03FFFD03FEFD02FCFE02FBFE01FB0102FC0328 +:200AE00002FD0502FE0501FF05000005FE0004FE0204FD0303FC0201FB0200FB02FEFB03E5 +:200B0000FDFC04FCFD04FCFF04FC0004FC0204FC0202FB0201FD0401FF06020106000105C6 +:200B2000FF0104FD0103FC0101FA00FFF900FDF900FCFA01FCFC02FDFE03FE0104FF0304D2 +:200B4000000404000504000603000501FF0400FEFDFEFFFEFFFEFCFFFFFF01FEFE01FEFF8B +:200B600002FD0003FD0101FC01FFFC02FFFD02FEFF01FF010100020101020201020100036E +:200B800001FF0400FE04FFFE04FDFF03FCFF03FB0002FB0103FC0302FC0300FB03FEFB035B +:200BA000FDFD03FCFE02FCFF02FD0204FF0404000504000602000500FF03FFFE02FCFE0123 +:200BC000FBFE00FBFEFFFAFEFEFBFFFEFD0100FF03000004010205010205000204FF020318 +:200BE000FE0201FD0201FD03FFFC02FCFB01FBFB01FAFD01F9FF01FB0202FC0402FE050112 +:200C0000FF0600000602FFFF0302010401FF03000002FE0002FD0001FC0100FB0100FB02C6 +:200C2000FFFC03FFFD04FEFE03FE0003FD0103FD0103FD0202FC0201FC0300FE0400FF04B0 +:200C4000000004000104FE0103FD0101FC0100FC01FFFC00FEFD00FEFE01FEFF02FE00029E +:200C6000FE0102FF0102FF0202FF0301FF0400FF04FFFF03FEFF02FCFE01FC0001FC000071 +:200C8000FC0201FD0400FE03FFFE03FFFF03FE0004FE0204FE0304FE0404FE0402FD04FE3E +:200CA000FA01FAFA00FAFCFFFBFEFFFC0000FE0202FF0402FF0502000601000603FFFF023F +:200CC00002000301FE0200FF01FDFD00FDFF00FD0001FE0202FF0302FE0301FE03FFFE0113 +:200CE000FDFE01FDFE00FC0001FD0102FE0201FE0200FE0300FE03FFFF03FF0002FE0002FB +:200D0000FE0102FE0202FE0302FF0402FE04FFFD02FCFB00FAFC00F9FDFFFA0000FC0201ED +:200D2000FD0501FF0601FF06000107FF0106FE0205FD0304FC0302FB0300FB03FEFB03FC99 +:200D4000FC03FBFC02FAFE03FB0003FC0204FC0303FD0402FE0501FE0600FE05FFFF05FE8F +:200D60000003FC0002FC0101FC0200FC02FFFC02FEFD0300FEFFFF01000100FF010000017E +:200D8000FFFF01FF0001FE0002FE0101FE0101FE0201FF0300FE02FFFE02FEFF03FD000253 +:200DA000FD0001FC0100FC01FFFC02FFFD03FFFF04FF0105FF0205FF0305FE0403FC020028 +:200DC000FB02FDFB02FCFC01FBFE02FBFF02FC0203FD0303FD0402FD0501FE0600FE06FE1C +:200DE000FF05FDFF05FC0004FC0103FB0201FB0200FB03FFFC04FEFD04FEFF05FE0005FEF4 +:200E00000104FD0203FC0201FB01FFFB01FFFD03FFFF05FF0005FE0104FD0204FD0303FCCA +:200E20000301FB02FEFA01FCFA01FEFBFCFEFFFE0201FF03010105010305010305000304AC +:200E4000FE0202FC0100FC02FFFC02FEFD02FDFE02FD0002FC0102FC0101FC0300FD04FFA3 +:200E6000FD03FEFE04FFFF04FD0004FD0003FC0203FE0403FE0402FF0400FE03FFFF03FE62 +:200E8000FF02FDFF02FC0001FC0000FC0100FD0300FD04FFFD04FEFE04FDFE04FCFF02FA66 +:200EA0000002FB0101FB0301FC0401FE0501FF06000006FF0105FE0204FD0202FB0100FB23 +:200EC00002FFFC03FFFD03FDFD03FCFE03FCFF03FC0102FC0202FC0302FE0502FE0500FE15 +:200EE0000502FDFD00FFFE01FEFD01FEFE01FDFF02FE0002FE0102FE0202FE0202FF0301F4 +:200F0000FF04010003FF0002FE0002FD0001FD0000FD0100FE0200FE03FFFE03FFFF03FED0 +:200F2000FF02FDFF02FC0001FB0000FB0100FC02FFFE03000005000105FF0105FF0305FEAB +:200F40000202FC0201FB02FFFB03FDFC03FCFD03FCFE03FCFF03FC0204FD0404FD0502FD99 +:200F60000500FD05FFFD04FDFE04FCFF04FB0003FC0203FB0302FB03FFFA03FEFC04FDFD7B +:200F800005FDFF05FC0004FC0204FC0303FC0401FC0400FD05FFFD0501FEFE0000FE00FF49 +:200FA000FD0000FF02FFFF02FF0102FF0103FE0102FD0101FE0200FE0200FF03000003FE2B +:200FC0000002FD0002FD0000FC01FFFC01FFFC02FEFD02FFFF03FF0005000205FE0103FD15 +:200FE0000101FC0201FD02FFFD02FEFE03FE0004FE0104FE0103FD0202FC0201FC02FFFCF4 +:2010000003FEFD04FEFE04FDFF04FCFF03FC0103FC0302FC0401FC0400FD04FFFD05FEFFCF +:2010200005FD0005FD0204FC0203FC0201FB0200FB03FEFC03FDFD04FDFF04FC0004FC01B3 +:2010400003FC0302FC0301FC0400FD04FFFE0502FEFF0001000200FE01000002FFFF02FE88 +:201060000002FD0002FD0001FC0101FD0301FE0400FF03FEFE01FDFF02FD0001FD0102FE77 +:201080000302FE0401FF0501FF0400FF03FEFE02FCFF01FBFF00FB0000FB01FFFC02FFFE59 +:2010A00003FFFF04FF0104000205000304FF0303FE0302FD0300FD03FEFC03FDFD03FCFE1D +:2010C00003FBFF02FA0002FB0202FB0301FB03FFFC04FEFD04FDFF05FD0105FD0205FE0411 +:2010E00004FD0403FD0501FD0500FD05FEFD04FCFE03FAFE02FA0001FA0201FB0300FC04F5 +:2011000000FD0400FF0603FFFF0101FF0200FE02000002FEFE02FD0002FD0002FC0001FCCE +:201120000100FD0200FE0300FE03FFFF02FF0103FF0102FF0101FF0201FF0301FF0300FFA1 +:2011400003FFFF02FEFF01FDFF00FCFF00FC00FFFC0100FD0200FE03FFFE02FEFF02FE00A3 +:2011600002FE0103FE0202FE0302FE0401FE0400FE04FFFF05FEFF04FBFF02FAFF01F9006C +:20118000FFF901FEFA02FEFD05FF0007000207000206FE0204FE0202FE0100FE01FFFE0143 +:2011A000FEFD02FDFD03FCFE03FC0003FB0102FB0201FC0301FC0400FD04FFFE0402000237 +:2011C0000103030303010202010200FF00FEFEFFFCFDFEFCFEFEFDFFFFFEFFFFFF0000001B +:2011E00001000102010203010203000202FF0201FE01FFFE00FEFE00FEFE00FEFF01FE00E9 +:2012000001FF0102FF0303000403000402FF03FFFE02FDFD00FAFC00FAFF00FA0000FC02D7 +:2012200001FD0400FE0500FF06000106FF0205FF0203FE0302FE0200FE02FFFE01FEFE0195 +:20124000FDFD01FBFD02FBFF03FC0104FD0203FC0302FD0301FD0401FF0601FF0600010584 +:20126000FE0103FD0001FC00FFFC00FFFC00FEFD01FEFD01FFFEFFFF000100010001020183 +:2012800002010102010102000102000001FE0000FE00FFFE01FFFF01FFFF01FF0002FE0148 +:2012A00002FE0102FE0202FE0301FD02FFFD02FEFE02FDFE02FDFF02FC0102FC0202FD0431 +:2012C00001FE0400FE04FFFF03FE0002FE0001FE0101FF0100FF0100FE02FEFD03FEFE040B +:2012E000FEFF04FD0004FD0104FC0103FB0202FB0301FC0300FD04FFFE04FF0005FF0104E3 +:20130000FD0002FD0101FD0100FD01FFFE02FFFF02FFFF02FF0001FE0001FE0101FE0101D5 +:20132000FF0100FF0100FF01FFFF0200FFFFFF0000FF00FF000000010000020001020001AB +:2013400002FF0202FF0201FD01FEFC00FDFC01FDFE01FDFF01FD0002FD0202FE0402FE0495 +:2013600001FE0500FF05FFFF04FE0003FD0102FC0101FB0201FC03FFFC03FEFD03FEFE046B +:20138000FDFF03FD0104FD0103FD0203FD0302FD0301FE0400FE04FFFF03FDFF02FDFF0245 +:2013A000FD0102FD0201FD0200FD02FFFD02FEFE02FEFF02FE0002FE0102FE0202FF02022E +:2013C000FF0301FF0300FE02FFFE02FEFF02FE0002FD0002FD0202FD0200FC02FFFB02FD14 +:2013E000FC03FFFCFCFFFFFE02FFFF03010204FF0104FF0203FF0303FE0302FE0301FD03DF +:20140000FFFD03FEFE03FDFE02FBFF01FB0001FB0101FC0200FD0300FE04000005000105D2 +:20142000000104FF0203FF0202FE0201FD0100FD02FFFD01FEFD01FCFD01FCFE00FCFE00BB +:20144000FC0001FD0201FF03020004020005010105000205FF0103FE0102FC0000FC01FF76 +:20146000FC02FFFD02FEFD03FEFE03FDFF03FC0003FC0102FB0101FC0300FC0300FE04FF7A +:20148000FE04FF0005FE0105FD0204FC0202FC0300FC03FFFC03FEFD0300FCFD0000FF024B +:2014A000FFFE02000002FF0003000204000203FF0202FD0100FC01FFFD01FEFD00FDFE012C +:2014C000FEFF01FE0001FF0101FF02020003010003010003010002000002FF0002FE0001FB +:2014E000FD0000FCFFFEFBFFFDFB00FDFD01FDFE03FE0004FE0306000404FD0302FD0300F8 +:20150000FD04FFFE05FEFF05FE0004FC0104FC0102FB0201FB03FFFB03FEFC04FDFD04FDD2 +:20152000FF05FD0004FC0103FC0202FB0201FC0401FD0400FE0600FF05FEFF05FD0003FCA0 +:201540000002FB0101FB01FFFB01FFFD02FEFE0300FF00000101010201010101010000018E +:20156000000001FF0001FF0000FE0000FE0000FE01FFFE00FEFF00FF0001FF010200020270 +:20158000000302000302000401FF03FFFE02FEFE02FCFF01FBFF00FB0000FB01FFFC03FF53 +:2015A000FE04FFFF04FE0004FE0205FF0404FE0403FD0401FD04FFFD04FDFD04FCFD03FB1C +:2015C000FE03FB0002FB0102FB0201FC0301FD0501FD04FFFE05FEFE04FD0005FC0003FC0E +:2015E0000203FC0201FC0300FC03FFFC03FEFE03FEFF03FD0003FE0203FE0302FE0301FEE6 +:201600000400FD03FFFE0300FDFDFEFEFDFFFFFD00FFFF01000002000103000203000203C9 +:20162000FF0303FF0300FD02FFFE02FEFE01FCFD00FAFEFFFB0000FB01FFFD0300FE0400C0 +:201640000005010105000205000204FE0203FE0202FD0301FE03FFFD02FEFD02FDFE01FB78 +:20166000FE01FBFF01FB0001FC0200FD0300FD0400FF06000005FF0005FE0104FC0102FB6A +:201680000101FC0200FC03FFFD03FFFE04FEFF04FE0004FE0103FD0102FC0201FD0300FD4A +:2016A00003FFFD03FEFE04FEFF04FD0004FC0001FA0000FB01FFFC0300FD04FFFF0502FF30 +:2016C000FF0101000301FF02010103000103FF0001FD0001FC0000FC0000FD01FFFD02FF0A +:2016E000FF03FEFF02FD0002FD0001FD0101FE0301FE0301FF0300FE02FFFF03FF0002FEE7 +:201700000002FE0102FE0202FE0301FE0300FE02FEFD01FDFE01FCFD00FBFE01FD0102FED8 +:201720000302FF04020006020107020005FFFF03FCFF01FAFF00FA00FFFA01FFFB03FFFCA6 +:2017400004FEFE04FDFF04FD0105FD0204FD0303FD0302FE0502FD0400FE05FFFE04FDFF74 +:2017600004FCFF02FC0102FB0100FB0200FB02FFFD03FEFD0401FEFEFF00000201FF010274 +:201780000103010103000203FF0102FE0000FC00FFFC00FEFD00FEFD00FEFF01FF0102FF4F +:2017A0000102FF0202FF0302FF0301FE0300FE03FFFF03FEFF02FDFF02FCFF01FC0101FC26 +:2017C0000201FD0300FD03FEFE03FDFF03FD0003FD0103FD0302FD0302FD0400FD04FEFD06 +:2017E00004FEFF04FE0004FD0103FC0002FC0202FC0301FD0400FD04FFFE05FEFF04FDFFE2 +:2018000004FBFF02FB0101FA0100FB0200FC04FFFD04FFFF05FF0005FE0104FE0204FD03C5 +:2018200003FD0301FD0300FD03FEFD0300FDFDFEFFFE0000FE0100FF01FFFF01FF0102FFB2 +:201840000102FF0202FF0202FF0301FE03FFFE02FEFE01FCFE01FCFF00FBFF00FB0100FD96 +:201860000200FE0400FF04000004000104FF0205FF0304FD0202FC0200FC02FEFC02FDFD59 +:2018800001FCFE01FCFF02FD0103FE0303FF0402FF0401FF0400FE04FEFE02FCFE01FCFF48 +:2018A00001FC0001FC0101FD0200FD0300FE0400FF04FFFF03FEFF03FD0102FD0102FD0228 +:2018C00001FD0201FE0400FE04FFFF04FEFF03FCFF02FC0102FC0101FC0200FB02FFFC030E +:2018E000FEFD0400FDFE01010003010003010104000103FF0202FD0102FC0100FC0200FDE0 +:2019000002FEFC02FDFE03FDFF02FC0002FC0102FD0202FD0401FD0400FE04FFFE04FFFFCB +:2019200004FE0003FD0103FD0203FC0201FC01FFFC01FEFC02FEFD01FDFE01FE0002FF02B2 +:2019400003000303000403000401FF0400FE03FEFE01FCFD00FBFE00FBFF00FC0000FD0389 +:2019600001FE0401FE04FFFE04FEFF03FE0003FE0103FE0203FE0303FE0402FE0400FE044E +:20198000FFFD03FBFC01FAFD00FAFF00FA0101FC0301FD0401FF0500000603FF0002010053 +:2019A0000301FF02FFFF02FEFF02FD0001FCFF00FBFF00FC0000FE0201FF04010104010128 +:2019C00003000203FF0201FE0100FE00FFFD00FFFE01FFFE01FFFF02FF0002FE0001FE000A +:0D19E00001FE0000FE0201FE0200FE0200FA +:00000001FF diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/scan_counter.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/scan_counter.vhd new file mode 100644 index 00000000..e187403d --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/scan_counter.vhd @@ -0,0 +1,286 @@ +----------------------------------------------------------------------------- +-- ORIGINAL SCAN COUNTERS, SYNC, BLANK, ENABLE, STARS -- +-- For use with Computer Space FPGA emulator. -- +-- Implemented as part of the Sync Star Board. -- +-- Emulates the original timing (sort of progressive NTSC) for: -- +-- > scan counter logic (horizontal and vertical scan counters) -- +-- > count enable/blanking -- +-- > sync out logic -- +-- > star generation circuit -- +-- -- +-- This entity is implementation agnostic -- +-- -- +-- v1.0 -- +-- by Mattias G, 2015 -- +-- Enjoy! -- +----------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use ieee.std_logic_unsigned.all; +library work; + +--80---------------------------------------------------------------------------| + +entity scan_counter is + port( + game_clk : in std_logic; + hsync : out std_logic; + vsync : out std_logic; + star_video_out, + count_enable : out std_logic:= '0'; + blank : out std_logic:= '1'; + b2_12 : out std_logic; + vertical, horizontal : out std_logic_vector (7 downto 0) + ); +end scan_counter; + +architecture scan_counter_architecture of + scan_counter is + +-- 8 bit counter used for star generation +component v74161 is +port ( CLK, CLRN, LDN, ENP, ENT : in std_logic; + D : in unsigned (7 downto 0); + Q : out unsigned (7 downto 0); + RCO : out std_logic ); +end component; + +-- statemachine +type STATE_TYPE is (sLINE, sSYNC_BLANK); + +signal state : STATE_TYPE := sSYNC_BLANK; + +-- signals for +-- video signalling +signal hcount : integer :=130; +signal vcount : integer :=1; +signal blank_buffer : std_logic ; + +signal hor_scan_q : std_logic_vector (7 downto 0) + := "10000010"; +signal ver_scan_q : std_logic_vector (7 downto 0) + := "00000001"; + +signal hblank, vblank : std_logic; + +-- signals for star generation logic +signal b5_10, b1_6, b1_5, b1_4 : std_logic; +signal b1_3, b1_2, b1_1,b1_9, b2_8 : std_logic; + +signal a1_7, a1_6, a1_4, a1_3, a1_2 : std_logic; +signal a1_1, a1_9, b1_10, a1_15 : std_logic; + +signal SB_16 : std_logic; +signal b2_6 : std_logic; + +-- initial value for count enable +-- flip-flop +signal c4_14 : std_logic :='1'; + +-- iniital value for rco +signal e1_15_old : std_logic :='0'; +signal e1_15 : std_logic :='0'; + +-- scan counter signals +signal d1_e1_9, c1_f1_9, c1_f1_2 : std_logic; +signal e1_6, d1_4, d1_3 : std_logic; + +signal f1_15 : std_logic := '0'; +signal b2_4 : std_logic; +signal h1_11 : std_logic; +signal d1_13, d1_12 : std_logic; +signal c1_11, c1_12, c1_14, + f1_12, f1_13 : std_logic; + +signal star_enable : std_logic; + +----------------------------------------------------------------------------// +begin + +b2_12 <= game_clk; +b5_10 <= not game_clk; + +----------------------------------------------------------------------------- +-- GENERATE SYNC SIGNAL AND SCAN COUNTER VALUES -- +-- -- +-- replaces/emulates scan counter logic, count enable/blanking: -- +-- 74161s; D1, E1, C1, F1 -- +-- 7476 C4 (pin 1,2,3,4, 14, 15,1 6) -- +-- 7404 B2 (pin 3,4 and pin 5,6) -- +-- 7400 H1 (pin 11,12,13) -- +-- -- +-- replaces/emulates sync out logic: -- +-- 7420 J2 (j2_12) -- +-- 7486 J1 (j1_3) -- +-- 7420 F2 (f2_8) -- +-- 7486 J1 (j1_11) -- +----------------------------------------------------------------------------- +-- 5,842 mhz version + +----------------------------------------------------------------------------- +-- SCAN COUNTER -- +----------------------------------------------------------------------------- +process (game_clk) +begin +if rising_edge (game_clk) then + + case state is + + when sSYNC_BLANK => + + star_enable <= '0'; + + if hcount < 255 then + hcount <= hcount + 1; + hor_scan_q <= hor_scan_q + 1; + if hcount = 159 then hsync <= '1'; end if; + if hcount = 191 then hsync <= '0'; end if; + else + hcount <= 0; + hor_scan_q <= "00000000"; + c4_14 <= '1'; -- CE + star_enable <= '1'; + state <= sLINE; + hblank <= '0'; + end if; + + when sLINE => + + if hcount < 255 then -- visible line + hcount <= hcount + 1; + hor_scan_q <= hor_scan_q + 1; + + else -- last pixel on visible line + hcount <= 130; -- load value for blank&sync + hor_scan_q <= "10000010"; + c4_14 <= '0'; -- BLANK (not CE) + state <= sSYNC_BLANK; + + hblank <= '1'; + if vcount = 239 then vblank <= '1'; end if; + + if vcount < 254 then -- Increase vertical count + vcount <= vcount + 1; + ver_scan_q <= ver_scan_q +1; + + elsif vcount = 254 then + vcount <= vcount + 1; + ver_scan_q <= ver_scan_q +1; + f1_15 <= '1'; + + else + vcount <= 1; + vblank <= '0'; + ver_scan_q <= "00000001"; + f1_15 <= '0'; + star_enable <= '0'; + + end if; + end if; + + end case; +end if; +end process; + +d1_13 <= hor_scan_q(1); +d1_12 <= hor_scan_q(2); + +c1_14 <= ver_scan_q(0); +c1_12 <= ver_scan_q(2); +c1_11 <= ver_scan_q(3); + +f1_13 <= ver_scan_q(5); +f1_12 <= ver_scan_q(6); + +----------------------------------------------------------------------------- +-- Clear signal to star generator -- +----------------------------------------------------------------------------- +b2_6 <= not f1_15; + +----------------------------------------------------------------------------- +-- CREATING THE SYNC SIGNAL -- +----------------------------------------------------------------------------- +vsync <= vblank; + +----------------------------------------------------------------------------- +-- COUNT ENABLE & BLANK -- +----------------------------------------------------------------------------- +count_enable <= c4_14; +blank <= hblank or vblank; + +----------------------------------------------------------------------------- +-- SCAN COUNTER VALUES -- +----------------------------------------------------------------------------- +horizontal <= hor_scan_q; +vertical <= ver_scan_q; + +----------------------------------------------------------------------------- +-- GENERATE STAR VIDEO -- +-- Signetics 74161: B1 & A1 -- +-- using one 8-bit counter instead of two 4-bit counters -- +-- -- +-- Instead of using c4_14 to drive the ENT (b1_10) a separate enable -- +-- signal (star_enable) is used in order to overcome a "deviation" in the -- +-- Signetics 74161 chip, that Computer Space uses, from the "standard" -- +-- 74161 implementations. -- +-- The Signetics 74161 allows one counter increment when ENT is low, -- +-- in the case ENT goes low when the clock is also low. -- +-- "Standard" 74161 (eg TI and others) prohibits increments all the time -- +-- when ENT is low. -- +-- The star layout on screen is a result of this deviation in Signetics -- +-- implementation of the 74161 counter. A deviation that took a very long -- +-- time to uncover. It was not until measurement data from a real -- +-- Computer Space Board was compared with standard 74161 chip behaviour -- +-- that this piece of the puzzle was solved. -- +-- -- +-- The implementation uses standard 74161 logic and a work-around with a -- +-- delayed ENT signal (star_enable) -- +----------------------------------------------------------------------------- +star_counter: v74161 +port map( + clk => b5_10, + clrn => b1_1, + ldn => b1_9, + enp => '1', + ent => b1_10, + D(7) => a1_6, + D(6) => '0', + D(5) => a1_4, + D(4) => a1_3, + D(3) => b1_6, + D(2) => b1_5, + D(1) => b1_4, + D(0) => b1_3, + rco => a1_15 + ); + +b1_6 <= d1_13; -- equals to d1_13; +b1_5 <= c1_12; +b1_4 <= c1_11; +b1_3 <= c1_14; + +b1_1 <= b2_6; -- rco for msb +b1_9 <= b2_8; + +b1_10 <= star_enable; -- using an additional flag + -- called star_enable + -- (should be c4_14) + -- to cater for the fact that + -- the CS Signetics 74161 has + -- an odd implementation of + -- the standard 74161 + -- related to how ENT impact + -- increment when ENT is set + -- to low when clock is low + +a1_6 <= d1_12; +a1_4 <= f1_13; +a1_3 <= f1_12; + +b2_8 <= not a1_15; + +star_video_out <= a1_15; + +end scan_counter_architecture; diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/scandoubler.v b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..eba1d598 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_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/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/sigma_delta_dac.v b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/sigma_delta_dac.v new file mode 100644 index 00000000..ddc79f1f --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/sigma_delta_dac.v @@ -0,0 +1,33 @@ +// +// PWM DAC +// +// MSBI is the highest bit number. NOT amount of bits! +// +module sigma_delta_dac #(parameter MSBI=15) +( + output reg DACout, //Average Output feeding analog lowpass + input [MSBI:0] DACin, //DAC input (excess 2**MSBI) + input CLK, + input RESET +); + +reg [MSBI+2:0] DeltaAdder; //Output of Delta Adder +reg [MSBI+2:0] SigmaAdder; //Output of Sigma Adder +reg [MSBI+2:0] SigmaLatch; //Latches output of Sigma Adder +reg [MSBI+2:0] DeltaB; //B input of Delta Adder + +always @(*) DeltaB = {SigmaLatch[MSBI+2], SigmaLatch[MSBI+2]} << (MSBI+1); +always @(*) DeltaAdder = DACin + DeltaB; +always @(*) SigmaAdder = DeltaAdder + SigmaLatch; + +always @(posedge CLK or posedge RESET) begin + if(RESET) begin + SigmaLatch <= 1'b1 << (MSBI+1); + DACout <= 1; + end else begin + SigmaLatch <= SigmaAdder; + DACout <= ~SigmaLatch[MSBI+2]; + end +end + +endmodule diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/sound.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/sound.vhd new file mode 100644 index 00000000..017ad0d9 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/sound.vhd @@ -0,0 +1,377 @@ +----------------------------------------------------------------------------- +-- SOUND LOGIC -- +-- For use with Computer Space FPGA emulator -- +-- Sound stored in DE0 nano embedded fpga memory as "ROM IP Component" -- +-- The sounds are: 8 bit @ 11kHz -- +-- -- +-- sounds are: -- +-- > rocket rotate -- +-- > rocket thrust -- +-- > rocket missile shooting -- +-- > explosion -- +-- > saucer missile shooting -- +-- > background ambience sound -- +-- -- +-- v1.0 -- +-- by Mattias G, 2015 -- +-- Enjoy! -- +----------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use IEEE.std_logic_signed.all; +use IEEE.std_logic_unsigned.all; +library work; + +--80---------------------------------------------------------------------------| + +entity sound is + port ( + clock_50, audio_gate : in std_logic; + + sound_switch : in std_logic_vector (7 downto 0); + -- sound_switch(1): rocket rotate + -- sound_switch(2): rocket thrust + -- sound_switch(3): rocket missile + -- sound_switch(4): explosion + -- sound_switch(5): saucer missile + -- sound_switch(7): background ambience + + -- 16 bit wav to be used as input + -- to sigma delta audio dac logic. + -- just a normal raw wav file without + -- the wav header + sigma_delta_wav : out signed (15 downto 0) + ); + +end sound; + + +architecture sound_architecture + of sound is + +component rocket_rotate is + port ( + address : in STD_LOGIC_VECTOR (10 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +end component; + +component rocket_thrust is + port ( + address : in STD_LOGIC_VECTOR (11 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +end component; + +component rocket_shooting is + port ( + address : in STD_LOGIC_VECTOR (12 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +end component; + +component explosion is + port ( + address : in STD_LOGIC_VECTOR (13 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +end component; + +component saucer_shooting is + port ( + address : in STD_LOGIC_VECTOR (11 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +end component; + +component bakam is + port ( + address : in STD_LOGIC_VECTOR (13 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +end component; + + +type state_type is (FREQ_COUNT, READ_BYTE, MERGE_SOUNDS); + +signal state : state_type := FREQ_COUNT; + +-- memory clock +signal fm_clock : std_logic; + +signal reset : std_logic := '1'; + +signal sample_rate_count : integer := 1; + +-- memory low and high bytes +signal fm_data_low_1, fm_data_low_2 : signed (7 DOWNTO 0); +signal fm_data_low_3, fm_data_low_4 : signed (7 DOWNTO 0); +signal fm_data_low_5, fm_data_low_7 : signed (7 DOWNTO 0); + +-- current sound memory +-- addresses for each sound 1-7 +signal sound_adr_1 : STD_LOGIC_VECTOR (10 DOWNTO 0); +signal sound_adr_1_num : natural range 0 to 1042303; +-- for comparisons + +signal sound_adr_2 : STD_LOGIC_VECTOR (11 DOWNTO 0); +signal sound_adr_2_num : natural range 0 to 1042303; +-- for comparisons + +signal sound_adr_3 : STD_LOGIC_VECTOR (12 DOWNTO 0); +signal sound_adr_3_num : natural range 0 to 1042303; +-- for comparisons + +signal sound_adr_4 : STD_LOGIC_VECTOR (13 DOWNTO 0); +signal sound_adr_4_num : natural range 0 to 1042303; +-- for comparisons + +signal sound_adr_5 : STD_LOGIC_VECTOR (11 DOWNTO 0); +signal sound_adr_5_num : natural range 0 to 1042303; +-- for comparisons + +signal sound_adr_7 : STD_LOGIC_VECTOR (13 DOWNTO 0); +signal sound_adr_7_num : natural range 0 to 1042303; +-- for comparisons + +-- hard coded sound memory +-- address intervals for each +-- sound 1-7 + +signal sound_adr_4_state : std_logic := '0'; + -- initial state + +-- not using bit 0, +-- only bit 1 to 5 + +signal sound_prev : std_logic_vector (6 downto 0) + :="0000000" ; + +--signals for audio codec +signal fm_data_16_bit : signed (8 DOWNTO 0) + :="000000000"; + +signal rocket_rotate_rom_read : STD_LOGIC_VECTOR (7 DOWNTO 0) ; +signal rocket_thrust_rom_read : STD_LOGIC_VECTOR (7 DOWNTO 0) ; +signal rocket_shooting_rom_read : STD_LOGIC_VECTOR (7 DOWNTO 0) ; +signal background_ambience_rom_read : STD_LOGIC_VECTOR (7 DOWNTO 0) ; +signal explosion_rom_read : STD_LOGIC_VECTOR (7 DOWNTO 0) ; +signal saucer_shooting_rom_read : STD_LOGIC_VECTOR (7 DOWNTO 0) ; + + +------------------------------------------------------------------------------- +begin + +----------------------------------------------------------------------------- +-- rocket rotate sound ROM -- +----------------------------------------------------------------------------- +rocket_rotate_sound : component rocket_rotate + port map ( + address => sound_adr_1, + clock => clock_50, + q => rocket_rotate_rom_read + ); + +rocket_thrust_sound : component rocket_thrust + port map ( + address => sound_adr_2, + clock => clock_50, + q => rocket_thrust_rom_read + ); + + +rocket_shooting_sound : component rocket_shooting + port map ( + address => sound_adr_3, + clock => clock_50, + q => rocket_shooting_rom_read + ); + +explosion_sound : component explosion + port map ( + address => sound_adr_4, + clock => clock_50, + q => explosion_rom_read + ); + +saucer_shooting_sound : component saucer_shooting + port map ( + address => sound_adr_5, + clock => clock_50, + q => saucer_shooting_rom_read + ); + + +background_ambience : component bakam + port map ( + address => sound_adr_7, + clock => clock_50, + q => background_ambience_rom_read + ); + +----------------------------------------------------------------------------- +-- Sound sample retrieval -- +-- sound by sound, sample by sample -- +-- 11 kHz -- +-- 8 bit -- +----------------------------------------------------------------------------- +process (clock_50) +begin + if rising_edge (clock_50)then + if audio_gate = '1' then + + sound_prev(4) <= sound_switch(4); + + case state is + + when FREQ_COUNT => + sample_rate_count <= sample_rate_count +1; + if sample_rate_count > 4535 then -- 12kHz + state <= READ_BYTE; + sample_rate_count <= 1; + else + state <= FREQ_COUNT; + end if; + + if sound_prev(4) = '0' and sound_switch(4) = '1' then + -- explosion single shot verification, '0' means ready for + -- single shot + sound_adr_4_state <= '1'; -- '1' means single shot ongoing + sound_adr_4 <= (others => '0'); -- set to start of sound + sound_adr_4_num <= 0; -- set to start of sound + end if; + + when READ_BYTE => -- read byte + + -- 1 = rocket rotate + if sound_switch(1) = '1' then + fm_data_low_1 <= signed (rocket_rotate_rom_read); + else + fm_data_low_1 <= "00000000"; -- set to '0' if sound is not on + end if; + + -- 2 = rocket thrust + if sound_switch(2) = '1' then + fm_data_low_2 <= signed (rocket_thrust_rom_read); + -- read sample if sound is active + else + fm_data_low_2 <= "00000000"; -- set to '0' if sound is not on + end if; + + -- 3 = rocket shooting + if sound_switch(3) = '1' then + fm_data_low_3 <= signed (rocket_shooting_rom_read); + -- read sample if sound is active + else + fm_data_low_3 <= "00000000"; -- set to '0' if sound is not on + end if; + + -- 4 = rocket & saucer explosion + if sound_adr_4_state = '1' then -- single shot ongoing + fm_data_low_4 <= signed (explosion_rom_read); + -- read sample if sound is active + else + fm_data_low_4 <= "00000000"; -- set to '0' if sound is not on + end if; + + -- 5 = saucer shooting + if sound_switch(5) = '1' then + fm_data_low_5 <= signed (saucer_shooting_rom_read); + -- read sample if sound is active + else + fm_data_low_5 <= "00000000"; -- set to '0' if sound is not on + end if; + + -- 7 = background ambience + fm_data_low_7 <= signed (background_ambience_rom_read); + + -- increase adress pointers + -- 1 = rocket rotate : loop + if sound_adr_1_num < 4529 then + sound_adr_1 <= sound_adr_1 + 1; + sound_adr_1_num <= sound_adr_1_num + 1; + else + sound_adr_1 <= (others => '0'); + sound_adr_1_num <= 0; + end if; + + -- 2 = rocket thrust : loop + if sound_adr_2_num < 5067 then + sound_adr_2 <= sound_adr_2 + 1; + sound_adr_2_num <= sound_adr_2_num + 1; + else + sound_adr_2 <= (others => '0'); + sound_adr_2_num <= 0; + end if; + + -- 3 = rocket shooting : loop + if sound_adr_3_num < 20072 then + sound_adr_3 <= sound_adr_3 + 1; + sound_adr_3_num <= sound_adr_3_num + 1; + else + sound_adr_3 <= (others => '0'); + sound_adr_3_num <= 0; + end if; + + + -- 4 = rocket & saucer explosion/single shot + -- no loop + if sound_adr_4_num < 8781 then + sound_adr_4 <= sound_adr_4 + 1; + sound_adr_4_num <= sound_adr_4_num + 1; + else + sound_adr_4_state <= '0'; -- single shot ongoing <= '1'; + -- single shot is complete + sound_adr_4 <= (others => '0'); + sound_adr_4_num <= 0; + end if; + + -- 5 = saucer shooting : loop + if sound_adr_5_num < 6636 then + sound_adr_5 <= sound_adr_5 + 1; + sound_adr_5_num <= sound_adr_5_num + 1; + else + sound_adr_5 <= (others => '0'); + sound_adr_5_num <= 0; + end if; + + -- 7 = background ambience : loop + if sound_adr_7_num < 13874 then + sound_adr_7 <= sound_adr_7 + 1; + sound_adr_7_num <= sound_adr_7_num + 1; + else + sound_adr_7 <= (others => '0'); + sound_adr_7_num <= 0; + end if; + + state <= MERGE_SOUNDS; + + when MERGE_SOUNDS => -- read byte + -- transfer read data and fix endian (from little endian to big endian) + + sigma_delta_wav <=(fm_data_low_1(7) & fm_data_low_1(7) & fm_data_low_1 & "000000") + + (fm_data_low_2(7) & fm_data_low_2(7) & fm_data_low_2 & "000000") + + (fm_data_low_3(7) & fm_data_low_3(7) & fm_data_low_3 & "000000") + + (fm_data_low_4(7) & fm_data_low_4(7) & fm_data_low_4 & "000000") + + (fm_data_low_5(7) & fm_data_low_5(7) & fm_data_low_5(7) & fm_data_low_5 & "00000") + + (fm_data_low_7(7) & fm_data_low_7(7) & fm_data_low_7 & "000000"); + + state <= FREQ_COUNT; + + when others => + state <= FREQ_COUNT; + + end case; + end if; + end if; +end process; + +end sound_architecture; diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/sync_star_board.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/sync_star_board.vhd new file mode 100644 index 00000000..55bec5d0 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/sync_star_board.vhd @@ -0,0 +1,1368 @@ +----------------------------------------------------------------------------- +-- SYNC STAR BOARD -- +-- For use with Computer Space FPGA emulator -- +-- Implementation of Computer Space's Sync Star Board -- +-- "wire by wire" and "component by component"/"gate by gate" based on -- +-- original schematics. -- +-- With exceptions regarding: -- +-- > start/stop & replay logic (impl as state machine instead) -- +-- > analogue/discrete based timers (impl as counters) -- +-- > scan counter, sync and star generation logic -- +-- - implemented in separate entity to provide interlaced ntsc -- +-- video and overcome Signetics 74161 deviation that impacts -- +-- star generation -- +-- > all flip flops which use asynch clock inputs are replaced with -- +-- flip flops driven by high freq clock and logic to identify -- +-- edge changes on the logical clock input -- +-- -- +-- There are plenty of comments throughout the code to make it easier to -- +-- understand the logic, but due to the sheer number of comments there -- +-- may exist occasional mishaps. -- +-- -- +-- This entity is implementation agnostic. -- +-- -- +-- Naming convention: -- +-- Signals are labelled after the component that generates the signal; -- +-- more specifically the component's schematics label and the specific -- +-- output. For instance: NOR gate F6 and its output pin 10 generate a -- +-- signal which will be labelled f6_10. -- +-- Occasionally signals are labelled after a component input - this is -- +-- most common for components where the input is exposed -- +-- to "component-internal processing" beyond simple gate functionality, -- +-- such as bistable latches, counters, flip-flops and multiplexers. -- +-- Sync Star Board inputs/outputs are labelled SB_, where is -- +-- according to original schematics input/output labels. -- +-- -- +-- v1.0 -- +-- by Mattias G, 2015 -- +-- Enjoy! -- +----------------------------------------------------------------------------- + + +library ieee; +USE ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +library work; + +--80--------------------------------------------------------------------------| + + +entity sync_star_board is + port ( + reset, + game_clk -- Fundamental game + -- clock for the whole game's + -- logical timing + -- Only used when + -- video_signal_type is + -- set to '1' (ie emulating + -- original video signalling) + : in std_logic; + super_clk, -- Clock to emulate + -- asynch flip flop logic + + explosion_clk, + seconds_clk : in std_logic; + + SB_3, -- Saucer Enable + -- signals that the TV beam + -- is "sweeping" by the current + -- position of one of the + -- two 16 x 8 pixel + -- saucer image grids + SB_4, -- Saucer Missile + -- signals that the TV beam + -- is "sweeping" by the current + -- pixel position of an active + -- saucer missile + SB_6, -- Rocket Missile + -- signals that the TV beam + -- is "sweeping" by the current + -- pixel position of an active + -- rocket missile + SB_7, -- "start button pressed" signal + SB_C, -- "coin inserted" signal + SB_E, -- Rocket Enable + -- signals that the TV beam + -- is "sweeping" by the current + -- position of the 16 x 16 pixel + -- rocket image grid + SB_N -- rocket & saucer video mix signal + : in std_logic; + + SB_2, -- Saucer Video Enable + -- active when saucer + -- can be drawn onto screen (ie its not + -- in the "pause" state after a + -- hit or collision) + SB_5, -- Rocket Video Enable + -- active when rocket + -- can be drawn onto screen (ie its not + -- in the "pause" state after an + -- explosion or collision, and its + -- ongoing game play) + SB_H, -- Count Enable + -- active during the + -- visible part of the screen to signal + -- that objects can be moved and drawn + -- onto screen + SB_K, -- audio gate; active when game is on + -- to open up for audio + SB_L, -- signal to trigger explosion + -- audio sample + SB_M, -- spin; signal to spin rocket + -- after being hit by saucer missile, + -- active when spinning + SB_Y -- inverse clock out + : out std_logic; + + -- signals for + -- composite video / instead of SB_20 + hsync : out std_logic; + vsync : out std_logic; + composite_video_signal : out std_logic; + blank : out std_logic + ); + +end sync_star_board; + +architecture sync_star_board_architecture of + sync_star_board is + +component scan_counter is + port ( + game_clk : in std_logic; + hsync : out std_logic; + vsync : out std_logic; + star_video_out : out std_logic; + count_enable : out std_logic; + blank : out std_logic; + b2_12 : out std_logic; + vertical, horizontal : out std_logic_vector (7 downto 0) + ); +end component; + +-- statemachine for coin detection, +-- start game and indicate "game on" +type STATE_TYPE is +(IDLE, COIN_INSERTED, GAME_ON); + +signal count_enable, a1_15, c4_14 : std_logic; + +-- signals for score & time display logic +signal j4_8, j2_8, h3_8, h3_6, j3_8, + j3_6, j3_12, h3_12 : std_logic; +signal g3_9, g3_10, g3_11, g3_12, + g3_13, g3_14, g3_15 : std_logic; +signal e5_2 : std_logic; + +signal g3_out : std_logic_vector (6 downto 0); +signal g3_in : std_logic_vector (3 downto 0); + +signal g1_8, d2_13, d2_10, c2_6 : std_logic; +signal d1_11, d1_12, d1_13, c1_11, + c1_12, c1_13 : std_logic; +signal c2_3 : std_logic; +signal g3_7, g3_1, g3_2, g3_6 : std_logic; +signal f1_11, f1_12, f1_13, f1_14, + e1_11, e1_12, e1_13, e1_14 : std_logic; +signal j2_6, h1_8, g1_6, f2_6, g2_8, + g2_6, e2_6, e2_8, b2_2, d2_4, + d2_1 : std_logic; +signal h2_13, h2_4, h2_10, g1_12, h1_3 : std_logic; + +signal horizontal_position : std_logic_vector (7 downto 0) + := "00000000"; +signal vertical_position : std_logic_vector (7 downto 0) + := "00000000"; + +-- signals for score and time keeping +signal f3_3, f3_4, f3_5, f3_6, + f3_10, f3_11, f3_12, f3_13, + f3_14, f3_2, f3_7, f3_9 : std_logic; +signal a3_3, a3_4, a3_5, + a3_6, a3_10, a3_11, a3_12, + a3_13, a3_14, a3_2, a3_7, a3_9 : std_logic; + + +signal d3_14, d3_2 : std_logic; +signal e3_14, e3_2 : std_logic; +signal h1_6, c5_6, e5_8 : std_logic; +signal e3_12, e3_11, e3_9, e3_8 : std_logic; +signal d3_12, d3_11, d3_9, d3_8 : std_logic; +signal c3_14, c3_2, c3_12, c3_11, + c3_9, c3_8 : std_logic; +signal b3_14, b3_2, b3_12, + b3_11, b3_9, b3_8 : std_logic; + +signal b3_count : std_logic_vector (3 downto 0); +signal c3_count : std_logic_vector (3 downto 0); +signal d3_count : std_logic_vector (3 downto 0); +signal e3_count : std_logic_vector (3 downto 0); +signal a2_A, a2_B : std_logic_vector (3 downto 0); + +-- signals for replay +signal a2_3, a2_4, a2_5, a2_6, + a2_10, a2_11, a2_12, + a2_13, a2_15 : std_logic; +signal c2_11 : std_logic; + +signal SB_F : std_logic; + +-- signals for explosion circuitry logic +signal a6_8, h2_1, a6_3, a6_11, + a6_6, e2_13, e2_4, + e2_10, j5_3, c5_8, c5_11 : std_logic; +signal b6_1 : std_logic :='1'; +signal b5_11, b5_13, b5_12 : std_logic; +signal b5_3, b5_1, b5_2 : std_logic; +signal a5_3, a5_1, a5_2 : std_logic; +signal a4_12, d4_6 : std_logic; +signal b4_1, b4_3, b4_4, b4_16 : std_logic; +signal b4_6, b4_9, b4_12, b4_8 : std_logic; +signal c4_6, c4_9, c4_12, c4_8 : std_logic; + +-- q output from flip flops that +-- need initial value +signal a5_5, b5_5, b5_9, + b4_15, b4_11, c4_11 : std_logic :='0'; + +-- qn output from flip flops that +-- need initial value +signal a5_6, b5_6, b5_8, b4_10, c4_10 : std_logic :='1'; + +signal a4_8, a4_6, d4_8, j1_6 : std_logic; +signal a5_3_1, b5_3_1, b5_11_13, + c4_6_8, b4_6_8, b4_1_3 : std_logic; + +-- signals for start/end game +-- circuitry logic +signal SB_D, SB_B : std_logic; +--signal SB_7_old : std_logic :='1'; +signal SB_C_old : std_logic :='1'; + +-- game clock +signal b2_12 : std_logic; + +signal e3_10, c5_3 : std_logic; +signal e5_12 : std_logic :='1'; +signal d6_6 : std_logic :='0'; +signal d6_8 : std_logic :='1'; +signal a5_11, a5_12, a5_10 : std_logic; +signal a5_9 : std_logic :='0'; +signal a5_8 : std_logic :='1'; +signal c2_8 : std_logic; +signal d5_1, d5_3, d5_2 : std_logic; +signal e5_10 : std_logic := '0'; +signal d5_6 : std_logic :='1'; +signal d5_13, d5_11, d5_12, d5_10 : std_logic; +signal d5_9 : std_logic := '0'; +signal d5_8 : std_logic := '1'; +signal c6_5, c6_6, c6_1 : std_logic; + +signal state : STATE_TYPE := IDLE; + +-- signals to manage asynchronous +-- clock design embedded in +-- synchronous clk solutions +signal b5_3_old, a5_3_old : std_logic; +signal c4_6_old, b4_6_old, + b4_1_old, b5_11_old : std_logic; +signal d5_11_old, d5_3_old : std_logic := '1'; +-- set to initial '1' as the initial +-- signal is also '1', +-- to avoid trigger of game +-- start directly + +signal e3_14_old, d3_14_old, + c3_14_old, b3_14_old : std_logic := '0'; + +-- signal for composite +-- star video generation +signal star_video : std_logic; + +-- signals for external buttons +-- and coin mechanism +signal signal_ccw, signal_cw, + signal_thrust, signal_fire, + signal_start, signal_coin : std_logic; + +-----------------------------------------------------------------------------// +begin + +----------------------------------------------------------------------------- +-- Game Clock Mapping -- +----------------------------------------------------------------------------- +SB_Y <= not b2_12; -- new + +----------------------------------------------------------------------------- +-- Composite video sync, scan counter, star generation, game clock -- +-- Corresponds to: -- +-- Sync Counter: D1, E1, C4 (pin 1-4 / 14-16), C1, F1 -- +-- b2_6, b2_4, h1_11 -- +-- Sync Generator: j2_12, j1_3, f2_8, j1_11 -- +-- Star Generator: B1, A1, b2_8 -- +-- Game Clock: b2_12 -- +-- -- +-- Logic that provides either original video signalling or interlaced -- +-- ntsc video signal. As it is not according to original schematics it is -- +-- placed in a separate entity to isolate from rest of original -- +-- schematics. Functionally it will provide "black box" output -- +-- identical to Computer Space game logic behaviour. -- +-- -- +-- Star generation also resides in the same entity to emulate a -- +-- "deviation" in the Signetics 74161 chip, that Computer Space uses, -- +-- versus the "standard" 74161 implementations. -- +-- The Signetics 74161 allows one counter increment when ENT is low, -- +-- in the case ENT goes low when the clock is also low. -- +-- "Standard" 74161 (eg TI and others) prohibits increments all the time -- +-- when ENT is low. -- +-- The star layout on screen is a result of this deviation in Signetics -- +-- implementation of the 74161 counter. A deviation that took a very long -- +-- time to uncover. It was not until measurement data from a real -- +-- Computer Space Board was compared with standard 74161 chip behaviour -- +-- that this piece of the puzzle was solved. -- +----------------------------------------------------------------------------- +sync_and_stars: component scan_counter + port map(game_clk, hsync, vsync, star_video, + count_enable, blank, b2_12, vertical_position, + horizontal_position); + +a1_15 <= star_video; +SB_H <= count_enable; +c4_14 <= count_enable; + +----------------------------------------------------------------------------- +-- Assign counter value from scan counters -- +----------------------------------------------------------------------------- +d1_11 <= horizontal_position (3); +d1_12 <= horizontal_position (2); +d1_13 <= horizontal_position (1); + +e1_11 <= horizontal_position (7); +e1_12 <= horizontal_position (6); +e1_13 <= horizontal_position (5); +e1_14 <= horizontal_position (4); + +c1_11 <= vertical_position (3); +c1_12 <= vertical_position (2); +c1_13 <= vertical_position (1); + +f1_11 <= vertical_position (7); +f1_12 <= vertical_position (6); +f1_13 <= vertical_position (5); +f1_14 <= vertical_position (4); + +----------------------------------------------------------------------------- +-- COMPOSITE VIDEO OUT -- +-- Replaces the entire discrete electronics video part in the schematics -- +-- including SB_20 - except for sync signal (which is a separate signal) -- +-- note j1_6 is steering inverse or not -- +-- a1_15 is star video NORMAL -- +-- e5_2 is score & time dislay video signal NORMAL -- +-- c4_14 is count enable -- +-- SB_N is rocket/saucer video signal -- +----------------------------------------------------------------------------- +composite_video_signal <= c4_14 and -- count enable + (j1_6 xor (SB_N or e5_2 or a1_15 or j5_3)); + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: Seven Segment Display Video -- +-- Outputs the right seven-segment "pixels" depending on where the -- +-- TV beam is currently positioned -- +-- Essentially it decodes the horizontal and vertical position bits (0-3) -- +-- to map segment by segment -- +----------------------------------------------------------------------------- +j2_8 <= not (g3_9 and c1_11 and d2_13); -- segment e + +h3_8 <= not (g3_10 and c1_11 and c2_6); -- segment d + +h3_6 <= not (g3_11 and c1_11 and c2_3); -- segment c + +j3_8 <= not (g3_12 and g1_8 and c2_3); -- segment b + +j3_6 <= not (g3_13 and g1_8 and d2_10); -- segment a + +j3_12 <= not (g3_14 and g1_8 and c2_6); -- segment f + +h3_12 <= not (g3_15 and g1_8 and d2_13); -- segment g + +j4_8 <= not (j2_8 and h3_8 and h3_6 and -- segment video mix signal + j3_8 and j3_6 and j3_12 and + h3_12); + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: BCD-TO-SEVEN-SEGMENT DECODER -- +-- G3 7448 -- +-- BCD-TO-SEVEN-SEGMENT DECODERS/DRIVERS -- +-- 448 pin 1=b, pin 2=c, pin 6=d, pin 7=a -- +-- -- +-- Decode 4 bit binary into a set of active segments that represent -- +-- decimal characters (0-9), six strange symbols and one complete blank. -- +-- There are seven segments; a - g represented by 7 outputs (abcdefg). -- +-- All segments active = 11111111 (abcdefg) -- +-- no segment active = 0000000 (abcdefg) -- +-- -- +-- ---------------- EXAMPLES --------------- -- +-- -- +-- 8 = 1000 0 = 0000 2 = 0010 -- +-- a => 1111111 => 1111110 => 1101101 -- +-- ----- ----- ----- ----- -- +-- I I I I I I I -- +-- f I I b I I I I I -- +-- --g-- ----- ----- -- +-- I I I I I I I -- +-- e I I c I I I I I -- +-- ----- ----- ----- ----- -- +-- d -- +-- -- +----------------------------------------------------------------------------- +--g3_7 <= a3_7; -- flawed original schematics + -- connects the wrong bits from the time&score + -- keeping part +g3_7 <= a3_9; -- revised connection logic for bit 0 + +--g3_1 <= a3_9; -- flawed original schematics + -- connects the wrong bits from the time&score + -- keeping part +g3_1 <= a3_7; -- revised connection logic for bit 1 + +g3_2 <= f3_9; -- bit 3 +g3_6 <= f3_7; -- bit 4 + +g3_in (0) <= g3_7; -- input a +g3_in (1) <= g3_1; -- input b +g3_in (2) <= g3_2; -- input c +g3_in (3) <= g3_6; -- input d + +g3_out <= + "1111110" when g3_in = "0000" else + "0110000" when g3_in = "0001" else + "1101101" when g3_in = "0010" else + "1111001" when g3_in = "0011" else + "0110011" when g3_in = "0100" else + "1011011" when g3_in = "0101" else + "0011111" when g3_in = "0110" else + "1110000" when g3_in = "0111" else + "1111111" when g3_in = "1000" else + "1110011" when g3_in = "1001" else + "0001101" when g3_in = "1010" else + "0011001" when g3_in = "1011" else + "0100011" when g3_in = "1100" else + "1001011" when g3_in = "1101" else + "0001111" when g3_in = "1110" else + "0000000" ; + +-- segment output +g3_13 <= g3_out (6); --output segment a +g3_12 <= g3_out (5); --output segment b +g3_11 <= g3_out (4); --output segment c +g3_10 <= g3_out (3); --output segment d +g3_9 <= g3_out (2); --output segment e +g3_15 <= g3_out (1); --output segment f +g3_14 <= g3_out (0); --output segment g + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: Segment display position input -- +-- Logic to determine when the TV beam's current position matches the -- +-- position required for individual segments and their "pixels" -- +-- Essentially it decodes the horizontal and vertical position bits (0-3) -- +----------------------------------------------------------------------------- +c2_6 <= c1_12 and c1_13; +d2_10 <= c1_12 nor c1_13; +d2_13 <= d1_13 nor d1_12; +c2_3 <= d1_13 and d1_12; + +g1_8 <= not c1_11; + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: Rocket/Saucer Score and Time Video Enable -- +-- logic to determine when the TV beam is currently at the vertical -- +-- and horizontal position interval of the screen where either rocket -- +-- score, saucer score or time (tens & unit) shall be be displayed -- +----------------------------------------------------------------------------- +j2_6 <= not ( g2_6 and g2_8 and f2_6); -- flag that signals that + -- either rocket score, saucer + -- score or time (tens&unit) can + -- be displayed + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: Score & Time Video Out -- +----------------------------------------------------------------------------- +h1_3 <= j4_8 nand j2_6; -- j4_8 is the "seven segment" video signal + -- containing the current pixel (black or white) + -- to display, given the TV beam's current + -- position, to "draw" score/time characters on + -- screen + -- j2_6 is a flag that indicates whether + -- either rocket score, saucer score or time + -- (tens & unit) should be displayed or not + -- (to avoid characters being repeated across + -- the screen) +e5_2 <= not h1_3; -- Score & Time video out signal (inversed to + -- comply with downstream logic's active level) + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: UNIT Display Enable -- +-- logic to determine when the TV beam is currently at the horizontal -- +-- position interval of the screen where UNITS shall be displayed -- +----------------------------------------------------------------------------- +b2_2 <= not e1_14; + +d2_4 <= d1_11 nor b2_2; + +e2_8 <= not (e1_11 and e1_12 and e1_13 and d2_4); -- flag signals UNIT + -- can be displayed + +g1_6 <= not e2_8; -- flag signals UNIT + -- can be displayed + -- (set to inverse + -- to fit downstream + -- active level logic) + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: TENS Display Enable -- +-- logic to determine when the TV beam is currently at the horizontal -- +-- position interval of the screen where TENS shall be displayed -- +----------------------------------------------------------------------------- +d2_1 <= e1_14 nor d1_11; + +e2_6 <= not (e1_11 and e1_12 and e1_13 and d2_1); -- Flag signals TENS + -- can be displayed + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: TENS and UNIT Display Enable -- +-- logic to determine when the TV beam is currently at the horizontal -- +-- position interval of the screen where TENS or UNIT shall be displayed -- +----------------------------------------------------------------------------- +h1_8 <= e2_6 nand e2_8; -- flag that signals that the TV beam's current + -- horizontal position is either passing + -- by the TENS position or UNIT position + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: Rocket Score Display Enable -- +-- logic to determine when the TV beam is currently at the vertical -- +-- and horizontal position interval of the screen where rocket score shall -- +-- be displayed -- +----------------------------------------------------------------------------- +g1_12 <= not f1_12; + +h2_10 <= f1_11 nor g1_12; + +g2_8 <= not (g1_6 and f1_14 and f1_13 and h2_10); -- g1_6 indicates + -- proper horizontal + -- position interval + -- (for UNIT) + -- f1_11, f1_12, h2_10 + -- indicate proper + -- vertical position + -- interval + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: Saucer Score Display Enable -- +-- logic to determine when the TV beam is currently at the vertical and -- +-- horizontal position interval of the screen where saucer score shall -- +-- be displayed -- +----------------------------------------------------------------------------- +h2_13 <= f1_13 nor f1_11; + +g2_6 <= not (g1_6 and f1_14 and f1_12 and h2_13); -- g1_6 indicates + -- proper horizontal + -- position interval + -- (for UNIT) + -- f1_11, f1_13, h2_13 + -- indicate proper + -- vertical position + -- interval + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: Time Display Enable -- +-- logic to determine when the TV beam is currently at the vertical and -- +-- horizontal position interval of the screen where TIME shall be -- +-- displayed (both TENS and UNIT) -- +----------------------------------------------------------------------------- +h2_4 <= f1_13 nor f1_12; + +f2_6 <= not (h1_8 and h2_4 and f1_11 and f1_14); -- h1_8 indicates + -- proper horizontal + -- position interval + -- (for UNIT & TENS) + -- h2_4, f1_11, f1_14 + -- indicate proper + -- vertical position + -- interval + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Saucer Display Enable Logic -- +-- verify that saucer can actually be displayed -- +----------------------------------------------------------------------------- +a6_8 <= SB_3 nand b6_1; -- SB_3 is saucer_enable from Motion Board + -- that signals that the TV beam's position is + -- passing by any of the two saucer's 16x8 image + -- grid pixels' positions + -- b6_1 is flagging whether the saucer should + -- be visible or not (delay after collision + -- or hit) + +SB_2 <= a6_8; -- Saucer Enable to Memory Board + -- it is ok to display + -- saucer video image + -- (not to be confused with Saucer Enable + -- from Motion Board) + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Rocket Display Enable Logic -- +-- verify that the rocket can actually be displayed -- +----------------------------------------------------------------------------- +h2_1 <= SB_E nor c5_8; -- SB_E is Rocket Enable from Motion Board + -- that signals that the TV beam's position is + -- passing by any of the rocket's 16x16 image + -- grid pixels' positions + -- c5_8 is flagging whether the rocket should + -- be visible or not (delay after collision + -- or hit) + +a6_11 <= h2_1 nand d5_9; -- Verifies that a game is playing (d5_9) + -- otherwise the rocket will not be + -- displayed + +SB_5 <= a6_11; -- Rocket Enable to Memory Board + -- it is ok to display + -- rocket video image + -- (not to be confused with Rocket Enable + -- from Motion Board) + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Saucer Missile Video Enable Logic -- +-- verify whether saucer missile can be displayed or not -- +-- if a game is on then missile will be displayed, otherwise not -- +----------------------------------------------------------------------------- +a6_3 <= SB_4 nand d5_9; -- SB_4 is saucer_missile video out + -- which is active when the TV beam's position + -- is passing by the missile pixel position + -- d5_9 is flagging whether a game is on or not + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Rocket Missile Video Enable Logic -- +-- verify whether rocket missile can be displayed or not -- +-- if a game is on then missile will be displayed, otherwise not -- +----------------------------------------------------------------------------- +a6_6 <= SB_6 nand d5_9; -- SB_6 is rocket_missile video out + -- which is active when the TV beam's position + -- is passing by the missile pixel position + -- d5_9 is flagging whether a game is or or not + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Rocket and Saucer Missile Video Out -- +----------------------------------------------------------------------------- +j5_3 <= a6_3 nand a6_6; -- saucer and rocket missile video out + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Detect collision and missile hit -- +----------------------------------------------------------------------------- +e2_13 <= a6_3 nor a6_11; -- detects rocket hit by saucer missile +e2_4 <= a6_8 nor a6_6; -- detects saucer hit by rocket missile +e2_10 <= a6_11 nor a6_8; -- detects rocket colliding with saucer + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Saucer Visible or Not? -- +----------------------------------------------------------------------------- +b6_1 <= b5_9 nor b5_5; -- flags whether saucer should be visible or not + -- It is not visible for a period of time + -- after it has collided with the rocket or + -- it has been hit by a rocket missile + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Rocket Visible or Not? -- +----------------------------------------------------------------------------- +c5_11 <= a5_5 nand c4_11; -- signals that saucer should not be visible for + -- a period of time after rocket has been spinning + -- (following being hit by saucer missile) + +c5_8 <= b5_8 nand c5_11; -- signals that saucer should not be visible + -- for a period of time + -- after it has collided with a saucer (b5_8) + -- or it has been hit by a saucer missile (c5_11) + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Rocket & Saucer Collision Flag -- +-- 7474, B5, pin 8-13 -- +-- dual d-type pos edge triggered flipflop w preset & clear -- +-- pin 13 2clrn -- +-- pin 12 2d -- +-- pin 11 2clk -- +-- pin 10 2pren -- +-- pin 9 2q -- +-- pin 8 2qn -- +-- -- +-- Flag is set when rocket and saucer collide, and reset back to normal -- +-- after a while by a timer signal (a4_8) -- +----------------------------------------------------------------------------- +b5_11 <= e2_10; -- instant collision detection feeds clk +b5_13 <= a4_8; -- timer signal a4_8 feeds clrn + +-- Check if Rocket has collided with Saucer +process (super_clk, b5_13) +begin +if b5_13 = '0' then -- clrn + b5_9 <= '0'; + -- q is cleared when clrn is active low, + -- as pren is permanently high + + b5_8 <= '1'; + -- qn is cleared when clrn is active low, + -- as pren is permanently high +elsif rising_edge (super_clk) then + b5_11_old <= b5_11; + if (b5_11_old = '0') and (b5_11 = '1') then + b5_9 <= '1'; + b5_8 <= '0'; + end if; +end if; +end process; + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Saucer Hit By Rocket Missile Flag -- +-- 7474, B5, pin 1-6 -- +-- dual d-type pos edge triggered flipflop w preset & clear -- +-- pin 1 1clrn -- +-- pin 2 1d -- +-- pin 3 1clk -- +-- pin 4 1pren -- +-- pin 5 1q -- +-- pin 6 1qn -- +-- -- +-- Flag is set when saucer is hit by rocket missile and reset back to -- +-- normal after a while by a timer signal (a4_8) -- +----------------------------------------------------------------------------- +b5_3 <= e2_4; -- instant missile hit detection feeds clk +b5_1 <= a4_8; -- timer signal a4_8 feeds clrn + +-- check if Saucer is hit by Rocket missile +process (super_clk, b5_1) +begin +if b5_1 = '0' then -- clrn + b5_5 <= '0'; + -- q is cleared when clrn is active low, as pren is permanently high + + b5_6 <= '1'; + -- qn is cleared when clrn is active low, as pren is permanently high + +elsif rising_edge (super_clk) then + b5_3_old <= b5_3; + if (b5_3_old = '0') and (b5_3 = '1') then + b5_5 <= '1'; + b5_6 <= '0'; -- signal to increase score for rocket player + end if; +end if; +end process; + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Rocket hit by Saucer Missile Flag -- +-- 7474, A5, pin 1-6 -- +-- dual d-type pos edge triggered flipflop w preset & clear -- +-- pin 1 1clrn -- +-- pin 2 1d -- +-- pin 3 1clk -- +-- pin 4 1pren -- +-- pin 5 1q -- +-- pin 6 1qn -- +-- -- +-- Flag is set when rocket is hit by saucer missile and reset back to -- +-- normal after a while by a timer signal (a4_8) -- +----------------------------------------------------------------------------- +a5_3 <= e2_13; -- instant missile hit detection feeds clk +a5_1 <= a4_8; -- timer signal a4_8 feeds clrn + +-- Check if Rocket has been hit by Saucer missile +process (super_clk, a5_1) +begin +if a5_1 = '0' then -- clrn + a5_5 <= '0'; + -- q is cleared when clrn is active low, + -- as pren is permanently high + + a5_6 <= '1'; + -- qn is cleared when clrn is active low, + -- as pren is permanently high + +elsif rising_edge (super_clk) then + a5_3_old <= a5_3; + if (a5_3_old = '0') and (a5_3 = '1')then + a5_5 <= '1'; + a5_6 <= '0'; -- signal to increase score for saucer + end if; +end if; +end process; + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Rocket spin signal -- +----------------------------------------------------------------------------- +SB_M <= a5_5; -- spin + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Collision & Explosion Timer Signal -- +-- Signals when the rocket or saucer has been hit by a missile or rocket -- +-- and saucer have collided -- +-- The signal triggers downstream collision timer to start counting the -- +-- time for collision/explosion "events" -- +----------------------------------------------------------------------------- +a4_12 <= not (a5_6 and b5_6 and b5_8); + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Fundamental clock -- +-- Creates the fundamental pulse train for timing collision and -- +-- explosion events -- +----------------------------------------------------------------------------- +d4_6 <= explosion_clk; + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Frequency divider logic flipflop 1 -- +-- 7476, B4, flip flop 1 -- +-- dual master slave jk flip flop with clear -- +-- pin 1 clk 1 -- +-- pin 3 clr 1 -- +-- pin 14 qn -- +-- pin 15 q -- +-- -- +-- Overall B4 and C4(pin 6-12) -- +-- Creates the frequency pulse trains that are the basis for the timing -- +-- of explosion and collision events (such as rocket spinning, screen -- +-- inversing/"flashing", explosion sound and removing saucer/rocket from -- +-- the screen for a while after being hit ) -- +----------------------------------------------------------------------------- +b4_1 <= d4_6; -- explosion clock +b4_3 <= a4_12; -- clrn + +process (super_clk, b4_3) +begin +if b4_3 = '0' then -- clr active low + b4_15 <= '0'; + b4_1_old <= '0'; +elsif rising_edge (super_clk) then + b4_1_old <= b4_1; + if (b4_1_old = '1') and (b4_1 = '0') then + -- data out on falling edge; j,k can be viewed as permanent high => toggle + b4_15 <= not b4_15; + end if; +end if; +end process; + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Frequency divider logic flipflop 2 -- +-- 7476, B4, flip flop 2 -- +-- dual master slave jk flip flop with clear -- +-- pin 6 clk 1 -- +-- pin 8 clr 1 -- +-- pin 10 qn -- +-- pin 11 q -- +-- -- +-- Overall B4 and C4(pin 6-12) -- +-- Creates the frequency pulse trains that are the basis for the timing -- +-- of explosion and collision events (such as rocket spinning, screen -- +-- inversing/"flashing", explosion sound and removing saucer/rocket from -- +-- the screen for a while after being hit ) -- +----------------------------------------------------------------------------- +b4_6 <= b4_15; -- clk +b4_8 <= a4_12; --clrn + +process (super_clk, b4_8) +begin +if b4_8 = '0' then + b4_11 <= '0'; + b4_10 <= '1'; + b4_6_old <= '0'; +elsif rising_edge (super_clk) then + b4_6_old <= b4_6; + if (b4_6_old = '1') and (b4_6 = '0') then + -- data out on falling edge, j,k are permanent high => toggle + b4_11 <= not b4_11; + b4_10 <= not b4_10; + end if; +end if; +end process; + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Frequency divider logic flipflop 3 -- +-- 7476, B4, flip flop 3 -- +-- dual master slave jk flip flop with clear -- +-- pin 6 clk 1 -- +-- pin 8 clr 1 -- +-- pin 10 qn -- +-- pin 11 q -- +-- -- +-- Overall B4 and C4(pin 6-12) -- +-- Creates the frequency pulse trains that are the basis for the timing -- +-- of explosion and collision events (such as rocket spinning, screen -- +-- inversing/"flashing", explosion sound and removing saucer/rocket from -- +-- the screen for a while after being hit ) -- +----------------------------------------------------------------------------- +c4_6 <= b4_11; -- clk +c4_8 <= a4_12; -- clrn + +process (super_clk, c4_8) +begin +if c4_8 ='0' then + c4_11 <= '0'; + c4_10 <= '1'; + c4_6_old <= '0'; +elsif rising_edge (super_clk) then + c4_6_old <= c4_6; + if (c4_6_old = '1') and (c4_6 = '0') then + -- data out on falling edge; j,k are permanent high => toggle + c4_11 <= not c4_11; + c4_10 <= not c4_10; + end if; +end if; +end process; + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Collision and Explosion Timer -- +-- is active for the duration of the rocket spin, the time the rocket -- +-- and/or saucer is not visible on the screen following collision or hit -- +----------------------------------------------------------------------------- +a4_8 <= not (b4_15 and b4_11 and c4_11); + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: screen flash & sound timer -- +-- is active for the duration of screen flash (inverse the screen color) -- +----------------------------------------------------------------------------- +a4_6 <= not (b4_15 and b4_10 and c4_10); + +----------------------------------------------------------------------------- +-- COLLISION DETECTION & EXPLOSION: Trigger explosion sound -- +----------------------------------------------------------------------------- +d4_8 <= not a4_6; -- inversing signal to fit sound unit's active level +SB_L <= d4_8; + +----------------------------------------------------------------------------- +-- Hyperspace Screen Management -- +-- Signals to video out unit to use inverse video signals (white becomes -- +-- black and black becomes white) -- +-- Inversing happens either when game is in hyperspace mode (replay) or -- +-- when a collision or missile hit has occurred -- +----------------------------------------------------------------------------- +j1_6 <= d5_6 xor a4_6; -- normal/hyperspace (nor/hyp) + +----------------------------------------------------------------------------- +-- GAME TIME CLOCK -- +-- provide clk input to the time keeping circuit -- +----------------------------------------------------------------------------- +c5_6 <= seconds_clk nand d5_9; -- seconds_clk is called "Game Speed + -- Adjust" in the original schematics + -- essentially the speed with which each + -- time unit progresses + -- d5_9 is active high when a game is "on" + -- and lets c5_6 pass through clock pulses + +----------------------------------------------------------------------------- +-- SCORE & TIME KEEPING CIRCUITRY: Keep and update time unit -- +-- E3, 7490 -- +-- decade counter TIME UNIT -- +----------------------------------------------------------------------------- +e3_14 <= c5_6; -- clk a +e3_2 <= e5_8; -- reseet when high + +process (super_clk, e3_2) +begin +if e3_2 = '1' then --- reset + e3_count <= "0000"; +elsif rising_edge (super_clk) then + e3_14_old <= e3_14; + if (e3_14_old = '1') and (e3_14 = '0') then -- falling edge + if e3_count = "1001" then -- decade counter, reset after reaching 9 + e3_count <= "0000"; + else + e3_count <= e3_count+1; + end if; + end if; +end if; +end process; + +e3_12 <= e3_count (0); -- qa +e3_11 <= e3_count (3); -- qd +e3_9 <= e3_count (1); -- qb +e3_8 <= e3_count (2); -- qc + +----------------------------------------------------------------------------- +-- SCORE & TIME KEEPING CIRCUITRY: Keep and update time tens -- +-- D3, 7490 -- +-- decade counter TIME TENS -- +----------------------------------------------------------------------------- +d3_14 <= e3_11; -- clk a +d3_2 <= e5_8; -- reseet when high + +process (super_clk, d3_2) +begin +if d3_2 = '1' then --- reset + d3_count <= "0000"; +elsif rising_edge (super_clk) then + d3_14_old <= d3_14; + if (d3_14_old = '1') and (d3_14 = '0') then -- falling edge + if d3_count = "1001" then -- decade counter, reset after reaching 9 + d3_count <= "0000"; + else + d3_count <= d3_count+1; + end if; + end if; +end if; +end process; + +d3_12 <= d3_count (0); -- qa +d3_11 <= d3_count (3); -- qd +d3_9 <= d3_count (1); -- qb +d3_8 <= d3_count (2); -- qc + +----------------------------------------------------------------------------- +-- SCORE & TIME KEEPING CIRCUITRY: keep and update rocket score -- +-- C3, 7493 -- +-- BINARY COUNTER -- +-- interestingly they use a binary counter instead of decade -- +-- which results in "strange" symbols when rocket score goes beyond 9 -- +----------------------------------------------------------------------------- +c3_14 <= b5_6; -- clk a, when rocket missile hits saucer +c3_2 <= e5_8; -- reset when high + +process (super_clk, c3_2) +begin +if c3_2 = '1' then --- reset + c3_count <= "0000"; +elsif rising_edge (super_clk) then + c3_14_old <= c3_14; + if (c3_14_old = '1') and (c3_14 = '0') then -- falling edge + if c3_count = "1111" then -- binary counter, reset after reaching 15 + c3_count <= "0000"; + else + c3_count <= c3_count+1; + end if; + end if; +end if; +end process; + +c3_12 <= c3_count (0); -- qa +c3_11 <= c3_count (3); -- qd +c3_9 <= c3_count (1); -- qb +c3_8 <= C3_count (2); -- qc + +----------------------------------------------------------------------------- +-- SCORE & TIME KEEPING CIRCUITRY: Keep and update saucer score -- +-- B3, 7490 -- +-- decade counter -- +----------------------------------------------------------------------------- +b3_14 <= a5_6; -- clk a, when saucer missile hits rocket +b3_2 <= e5_8; -- reseet when high + +process (super_clk, b3_2) +begin +if b3_2 = '1' then --- reset + b3_count <= "0000"; +elsif rising_edge (super_clk) then + b3_14_old <= b3_14; + if (b3_14_old = '1') and (b3_14 = '0') then -- falling edge + if b3_count = "1001" then -- decade counter, reset after reaching 9 + b3_count <= "0000"; + else + b3_count <= b3_count+1; + end if; + end if; +end if; +end process; + +b3_12 <= b3_count (0); -- qa +b3_11 <= b3_count (3); -- qd +b3_9 <= b3_count (1); -- qb +b3_8 <= b3_count (2); -- qc + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: TENS and Rocket Flag -- +-- This flag is a bit clever as it embeds the input from two unrelated -- +-- "items": -- +-- 1) TENS - signal whether the TV beam is within the TENS horizontal -- +-- position -- +-- 2) Rocket - signal whether the TV beam is within the rocket score's -- +-- horizontal and vertical position -- +-- -- +-- The "dual-info" flag is decomposed in downstream logic to determine -- +-- whether to forward TIME TENS or UNITS value to the segment decoder -- +-- if TIME is to be displayed OR whether to forward the rocket's or the -- +-- saucer's score value to the segment decoder if TIME is not to be -- +-- displayed -- +----------------------------------------------------------------------------- +h1_6 <= e2_6 nand g2_8; + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: Select score and time(tens/unit) to display -- +-- A3, 74153 -- +-- DUAL 4-LINE TO 1-LINE DATA SELECTOR/MULTIPLEXOR -- +-- (a,b) => output (y1 and y2) -- +-- (0,0) => c0 -- +-- (0,1) => c1 -- +-- (1,0) => c2 -- +-- (1,1) => c3 -- +-- Depending on the current screen position, the two Selectors A3 and F3 -- +-- forwards the corresponding value from either rocket score, -- +-- saucer score, time tens or time unit to the binary-segment decoder. -- +-- A3 and F3 manages four bits in total, two bits each, from the score and -- +-- time tens/units - as each value has four bits. -- +-- -- +-- A3 forwards bit 0 and bit 1 from rocket/saucer/time unit/time tens -- +-- F3 fowards bit 2 and bit 3 from rocket/saucer/time unit/time tens -- +-- -- +-- When Time Display is enabled (f2_6: active low) then the data -- +-- selector forwards c1 or c2 (tens or units). If TENS flag is set (e2_6 -- +-- cleverly embedded in h1_6) then c1(tens) is selected, otherwise unit. -- +-- -- +-- When Time Display is not enabled -- +-- either c2 or c3 (rocket score or saucer score) are in scope; which one -- +-- depends on whether Rocket Score Display is enabled (g2_8 cleverly -- +-- embedded in h1_6) or not. -- +----------------------------------------------------------------------------- +a3_3 <= b3_9; -- 1c3: saucer score bit qb +a3_4 <= c3_9; -- 1c2: rocket score bit qb +a3_5 <= d3_9; -- 1c1: time tens bit qb +a3_6 <= e3_9; -- 1c0: time units bit qb + +a3_10 <= e3_12; -- 2c0: time units bit qa +a3_11 <= d3_12; -- 2c1: time tens bit qa +a3_12 <= c3_12; -- 2c2: rocket score bit qa +a3_13 <= b3_12; -- 2c3: saucer score bit qa + +a3_14 <= h1_6; -- a select +a3_2 <= f2_6; -- b select + +a3_7 <= -- y1 + a3_6 when (a3_14 = '0' and a3_2 = '0') else + a3_5 when (a3_14 = '1' and a3_2 = '0') else + a3_4 when (a3_14 = '0' and a3_2 = '1') else + a3_3; + + +a3_9 <= -- y2 + a3_10 when (a3_14 = '0' and a3_2 = '0') else + a3_11 when (a3_14 = '1' and a3_2 = '0') else + a3_12 when (a3_14 = '0' and a3_2 = '1') else + a3_13; + +----------------------------------------------------------------------------- +-- DISPLAY SCORE & TIME: Select score and time (tens/unit) to display -- +-- F3, 74153 -- +-- DUAL 4-LINE TO 1-LINE DATA SELECTOR/MULTIPLEXOR -- +-- (a,b) => output (y1 and y2) -- +-- (0,0) => c0 -- +-- (0,1) => c1 -- +-- (1,0) => c2 -- +-- (1,1) => c3 -- +-- Depending on the current screen position, the two Selectors A3 and F3 -- +-- forwards the corresponding value from either rocket score, -- +-- saucer score, time tens or time unit to the binary-segment decoder. -- +-- A3 and F3 manages four bits in total, two bits each, from the score and -- +-- time tens/units - as each value has four bits. -- +-- -- +-- A3 forwards bit 0 and bit 1 from rocket/saucer/time unit/time tens -- +-- F3 fowards bit 2 and bit 3 from rocket/saucer/time unit/time tens -- +-- -- +-- When Time Display is enabled (f2_6: active low) then the data -- +-- selector forwards c1 or c2 (tens or units). If TENS flag is set (e2_6 -- +-- cleverly embedded in h1_6) then c1(tens) is selected, otherwise unit. -- +-- -- +-- When Time Display is not enabled -- +-- either c2 or c3 (rocket score or saucer score) are in scope; which one -- +-- depends on whether Rocket Score Display is enabled (g2_8 cleverly -- +-- embedded in h1_6) or not. -- +----------------------------------------------------------------------------- +f3_3 <= b3_11; -- 1c3: saucer score bit qd +f3_4 <= c3_11; -- 1c2: rocket score bit qd +f3_5 <= d3_11; -- 1c1: time tens bit qd +f3_6 <= e3_11; -- 1c0: time units bit qd + +f3_10 <= e3_8; -- 2c0: time units bit qc +f3_11 <= d3_8; -- 2c1: time tens bit qc +f3_12 <= c3_8; -- 2c2: rocket score bit qc +f3_13 <= b3_8; -- 2c3: saucer score bit qc + +f3_14 <= h1_6; -- a select +f3_2 <= f2_6; -- b select + +f3_7 <= -- y1 + f3_6 when (f3_14 = '0' and f3_2 = '0') else + f3_5 when (f3_14 = '1' and f3_2 = '0') else + f3_4 when (f3_14 = '0' and f3_2 = '1') else + f3_3; + +f3_9 <= -- y2 + f3_10 when (f3_14 = '0' and f3_2 = '0') else + f3_11 when (f3_14 = '1' and f3_2 = '0') else + f3_12 when (f3_14 = '0' and f3_2 = '1') else + f3_13; + +----------------------------------------------------------------------------- +-- REPLAY CIRCUITRY: Compare Player/Rocket score with Saucer score -- +-- A2, 9324 -- +-- 5-Bit comparator -- +-- comparing score between rocket and saucer -- +-- if player/rocket score is higher than saucer score then set a2_15 flag -- +----------------------------------------------------------------------------- +a2_3 <= b3_12; +a2_4 <= b3_9; +a2_5 <= b3_8; +a2_6 <= b3_11; + +a2_10 <= c3_11; +a2_11 <= c3_8; +a2_12 <= c3_9; +a2_13 <= c3_12; + +a2_A (0) <= a2_13; +a2_A (1) <= a2_12; +a2_A (2) <= a2_11; +a2_A (3) <= a2_10; + +a2_B (0) <= a2_3; +a2_B (1) <= a2_4; +a2_B (2) <= a2_5; +a2_B (3) <= a2_6; + +-- checks if rocket score is higher than saucer score +a2_15 <= '1' when a2_A > a2_B else '0'; + +----------------------------------------------------------------------------- +-- REPLAY CIRCUITRY: Set Replay or not -- +-- -- +-- SB_F = '1'; flag allows for replay -- +----------------------------------------------------------------------------- +SB_F <= '1'; +c2_11 <= SB_F and a2_15; -- determine replay or not, depending on score + +----------------------------------------------------------------------------- +-- START/END GAME: Start Game Process -- +-- -- +-- start game circuitry is not fully reproduced -- +-- a "state machine" represents the logic -- +-- -- +-- SB_7 connected to Start button on player control panel. -- +-- -- +-- SB_C connected to coin microswitch -- +----------------------------------------------------------------------------- +process (super_clk, reset) +begin +if reset = '1' then + state <= IDLE; + e5_12 <= '0'; + d6_8 <= '0'; +elsif rising_edge (super_clk) then + --SB_7_old <= SB_7; + SB_C_old <= SB_C; + + case state is + when IDLE => + e5_12 <= '0'; + d6_8 <= '1'; + if SB_C_old = '0' and SB_C = '1' then + e5_12 <= '1'; + state <= COIN_INSERTED; + end if; + + when COIN_INSERTED => + d6_8 <= '1'; + e5_12 <= '1'; + --if SB_7_old = '0' and SB_7 = '1' then + d6_8 <= '0'; + state <= GAME_ON; + --end if; + + when GAME_ON => + d6_8 <= '1'; + e5_12 <= '1'; + if d5_9 = '0' then + state <= IDLE; + e5_12 <= '0'; + end if; + + when others => + state <= IDLE; + e5_12 <= '0'; + d6_8 <= '1'; + + end case; +end if; +end process; + +----------------------------------------------------------------------------- +-- START/END GAME: Replay or not -- +-- will signal for replay if player score is greater than saucer score -- +-- (c2_11) and if player is not already in replay mode (d5_6) -- +----------------------------------------------------------------------------- +c2_8 <= c2_11 and d5_6; + +----------------------------------------------------------------------------- +-- START/END GAME: Signal that Time = 99 -- +-- signals that game time has reached 99 -- +-- downstream logic will determine whether to stop the game or go for -- +-- replay -- +----------------------------------------------------------------------------- +e5_10 <= not d3_11; + +----------------------------------------------------------------------------- +-- START/END GAME: Replay Flag -- +-- D5, 7474, pin 1-6 -- +-- d5_6 signals whether game is in replay mode or not -- +----------------------------------------------------------------------------- +d5_1 <= e5_12; -- clrn +d5_3 <= e5_10; -- clk +d5_2 <= c2_8; -- d : replay or not + +process(super_clk, d5_1) +begin + if d5_1 = '0' then + d5_6 <= '1'; -- qn is cleared when clrn is active low + elsif rising_edge (super_clk) then + d5_3_old <= d5_3; + if (d5_3_old = '0') and (d5_3 = '1') then + d5_6 <= not d5_2; + end if; + end if; +end process; + +----------------------------------------------------------------------------- +-- START/END GAME: Game On/Off Flag -- +-- D5, 7474, pin 8-13 -- +-- d5_9 signals whether game is on or off, 1-on, 0-off -- +-- d5_8 is the inverse of d5_9 -- +----------------------------------------------------------------------------- +d5_13 <= e5_12; -- clrn +d5_11 <= e5_10; -- clk +d5_12 <= c2_8; -- d +d5_10 <= d6_8; -- pren + +process(super_clk, d5_13, d5_10) +begin + if d5_13 = '0' then + d5_9 <= '0'; -- q is cleared when clrn is active low + d5_8 <= '1'; -- qn is cleared when clrn is active low + elsif d5_10 = '0' then + d5_9 <= '1'; -- q is set to high when pren is active low + d5_8 <= '0'; -- qn is set to low when pren is active low + elsif rising_edge (super_clk) then + d5_11_old <= d5_11; + if (d5_11_old = '0') and (d5_11 = '1') then + d5_9 <= d5_12; + d5_8 <= not d5_12; + end if; + end if; +end process; + +----------------------------------------------------------------------------- +-- START/END GAME: Reset Score and Time (Unit and Tens) -- +-- signals to score and time keeping units to reset score and time -- +----------------------------------------------------------------------------- +e5_8 <= not d6_8; + +----------------------------------------------------------------------------- +-- START/END GAME: Audio On/Off -- +-- signals to audio unit to switch on the sound, incl backgrund noise, -- +-- when a game is playing, otherwise switch off -- +----------------------------------------------------------------------------- +SB_K <= d5_8; -- audio gate signal + +end sync_star_board_architecture; \ No newline at end of file diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/thrust_8_11.hex b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/thrust_8_11.hex new file mode 100644 index 00000000..0e03fcb2 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/thrust_8_11.hex @@ -0,0 +1,160 @@ +:20000000FFFE00FEFD02030000FFFF0403030804FAF8FBFD0003FEF7FAFAFBFDFCFCFF0208 +:200020000002070601020705010408040306030201FEFBF8F7FA0608FCF9FC0004FEF8FBAC +:20004000FF0506FFFE00030600F8FF050000FCF5FC030703FBFF020303FDFAFE0100FFFFA4 +:20006000FE01040304040405040604040502000203FDFC02FEF9FAF9FAFEFEFBF8FBFDFB8A +:20008000FDFEFCFE0406030103080D06FEFAFAFEFDFBFCFE03060500FDFE020300FF040547 +:2000A000050B0801FF02070503FEF6F5FBFDFBFCFBFCFBF9FCFFFFFF0106050300FDFCFF54 +:2000C0000707FF02080406080401FD010601FBFAF9FC02FEFBF8F5FB0001FFFDFF0302001F +:2000E0000403050803FE030A09FEF8FBFD0204FDFBFF00FFFEFDFD0104020102FF000304E3 +:2001000001FF0200FCFCFCFDFDFDFCFD02020202FEFCFF090A02FF01FF00020300FBFD02E5 +:2001200003FF0100FCFF02FFFDFDFF00040805FFFEFAF7F7FBFFFFFF0103020102000304C9 +:20014000020301FCFE00000101FFFF010103040200030503010102030302FEFDFEFEFDFF8A +:20016000FDFDFFFCFDFBF8FBF9FB00FBF9FFFFFEFDFDFF0205080A060508080A0B0A080562 +:200180000307070200FBFAFBFCFCFAF8F6F8F7F6F7F6F9FF02050601020601FC020902FF93 +:2001A00003FEF90002000502FCFDFEFF020301010001030409090300FEFE050701FDFAFC26 +:2001C000FFFEFD0104FEFAFD0103FEF8F5F8FD00FFFAF8FD020601FE03090E0B0401FFFE2B +:2001E0000001020401FE00FF0103FCF7FD00FF00010401FDFFFF0000FF0202FDFCFDFE000F +:20020000010401FF0705000200FD00040201FEF8F7FC0000FF0607FCF9FDFE0101FFFDFEE6 +:200220000201080900FF01FF00FEFCFF01030604FEFF0201030909FEF8FCFDFCFE020001A3 +:20024000050200FEF7F9FEFBFCFDFEFDF9F9FAFC0403040601030707040206060403000197 +:2002600003FEFCFF02040402FBFA0001FFFCFD000204FFFAFCFEFEFF00FEFF01010002028F +:200280000102010001010203010001030400FEFEFDFEFFFCFAFDFFFFFFFF00FFFE00010265 +:2002A00002FEFF04030101FFFF020300FDFE0202020301FE010305060503FBF800FDF9FE32 +:2002C000FCFB010504FAF7FAFB010500FDFEFF00010303040200040202050200000306070B +:2002E000010205FFFAFBFCFBFDFEFBFCFCFBFEFFFF00FEFB02070403FFFB0302FCFFFD0026 +:2003000002FE00FEFF060501000506040500FB0109080402FCF8FD0203FFFBFAFAFFFFFBD0 +:20032000FBFC0000FEFEFFFF00000002020303020203030303030305040101FFFEFFFEFFA8 +:20034000FFFFFEFCFBFCFDFCFCFDFDFEFEFE010402FFFE01050404030405030503FCFCFFA5 +:2003600001060300FEF5F6FBFDFF0401F9F7FBFFFCFB050904FDFB0208070A05010607066F +:2003800003FDFB0104060A04FDF5EEF8000102FDFE05FFF5FAFFFBFB000405FCF8FFFEFE93 +:2003A00002030706060905FCFBFF03030207070200FEFFFF030500FEFDFF020100FDFBFC14 +:2003C000FAFC0100FBFDFEFE0000FEFEFF0001010101030402010203040301000205030111 +:2003E00001FEFF00FCFCFBFDFDFBFBFCFCFF01FEFDFE000303030202040504020101040504 +:2004000005040101FEFD0101FE01FF00030502F8F6FBFAF8FCFEF9FD0709FFF4F5FD03FE0B +:20042000FCFEFEFF01050504090701010603010703FF020202FFFCFBFE03050601FAF6F7A1 +:20044000FC01000000FE020201020101000202010103020001020100FFFFFFFFFF00FEFE92 +:2004600000FFFFFEFF01000100FE000403FDFBFCFCFEFFFEFEFE000202020200FFFF010488 +:200480000400FF02010001010100000100FF000101020302FFFF020300FCFCFCFE02000251 +:2004A0000300FCFD00FBF9FBFDFF01FDFE050600FF04010209FCFC080503FCF6F9FE03014A +:2004C000FEFEFF0101010402FFFFFC01090D07FBFB000001FEFBFDFF0102010303030404FF +:2004E000050A03F3F4F8F7FDFFFBF9FAFFFEF8F9FCFF0709060304080706080504050200F7 +:2005000001020100FDFCFEFEFDFCFCFFFE00FFFDFDFDFEFDFDFF0000FEFE01000001020201 +:200520000101020101020306060200FEFF010301FFFEFDFEFEFCFBFEFFFF060B03FBF9F8B7 +:20054000FEFFFEFDFAFF06030100FD020500FF01000203050602FDFE0103FFFCFF00040489 +:20056000FEFEFEFD04060301F7F5FF0500F5F3FD0402FFFAF8FD050D080202070B0400FE7B +:20058000FF010102FFFCFD0100FCFBFD0000FEFF0101020101040306080102020205FFFC4C +:2005A000FDFE0202FCFAFAF6F8FBF6F5F8FB020702FDFE0105090805040406080501010343 +:2005C00003FF0408FEF9FAFAFF00FE00FFFF0201FBF9FBFCFE0000FFF7F7FDFEFFFDFD0654 +:2005E0000502060404080903FE030502FE010303FEFBFDFDFCFBFBFC03050402FEFE00FFDB +:200600000001010000FE000302FFFF0404FEFDFEFE00030300FD0001FFFFFF0002030300CF +:20062000020705FDFAFC0001FEFBFCFEFDFCFBFD0001020403FF000704FDFFFF0103FFFFC3 +:200640000504FFFEFEFFFE01080501FDFAFBFCFF0101FCFD01040300020201050908FFFA86 +:20066000FEFFFDFFFF01FEFB05060205FFF9FAF9FEFDF9FE01FDFB0100FD0002FCFD0401A2 +:2006800001030103040302000206080607060201FFFE000300FDFF00000001FCFAFCFBFD3C +:2006A0000100FAF5F5F8FBFEFDFAFB020602000204070809080808060404070803FEFCFC1C +:2006C000FE0101FEF9F9FCFDFAF9FCFDFD0000FEFCFF00F8F80002FF0102FF00030605034B +:2006E000050704FFFDFF00FEFF02020404FFFDFF040501FEFCFD030500FBFBFC00010001EE +:200700000101FEFEFFFF03FCFA02020200FDFE0402FE00FF0101FBFC00FF0405FCFD0404DE +:200720000505FFFAFF0908FFFDFDFE0303FEFDFEFDFFFF000301FDFBFDFFFDF9FC01FFFDCE +:20074000FE01030501FCFCFE0305040605FDFB0001040400FFFE0403FEFBFB000102030085 +:2007600003070B01F6F8FE0201FBFBFCFDFFFCFB0106090A070300FEFF01FEFCFF0101FE74 +:20078000FBFAFBFE040500FDFF0001010101FF0104050301FFFE00010403FCFC0307040149 +:2007A000FEFAFEFFFF00FE0300F9FAF7FAFDF9F9FBFF010001030505050605050809090831 +:2007C0000504020201FFFFFCFBFCFF00FAF8FAFCFFFEFBFF01FFFEFCF9FBFCFE0100FF0252 +:2007E00004060201070D0B030000FE0100FEFF0001FEFCFDFBFE01FEFEFDFDFEFCFC0003ED +:2008000004030001FEFF0500F9F9FE000102FCFE0605020504090AFEFE00FE01FDF8FCFECE +:200820000003FFFCFF00020502FCFF0200FEFBFE01000104050402000000FDFF01FDFF01B3 +:20084000FBFC010200FF030200030201FFFFFEFD0000FF030601FE00FFFF0101FE0204018F +:2008600002010504FEFDFD04090500FAF6F5FAF9FBFDFBFDFDFCFBFEFEFF03040504040493 +:20088000080D08FF0104060706050703FDFBFA0004FEF9F6F4F8FFFCF9FAFCFDFAFDFEFC6E +:2008A000FE04080705FF000405040201060A070503020503FBF9FF01FEFAF9FCFDFAFAFB1D +:2008C000FAFCFBFBFCF9FB0003080705040303050806070A050003030606020600FCFDF2ED +:2008E000F2F8FAF8F4F5F7FBFEFBF7FCFF00030302060807060707090B0B090506070302E6 +:2009000003010101FFFDFAFBFCFBFCFBF9F6F6F6F5F8F8FAFDFD0000000409040103FCFD30 +:200920000303040504080D02FF04060D0D00F7FAFCFFFDF9F9FB030B05FAF7F9FB00050295 +:20094000FE0000FE01FE0001FBFBFF030202010306FEFE04FEF9FBFE0101020501FBFCFFA5 +:2009600001050703FFFD000706010000020403030501FAFBFE000101FDFAFCFF00FEFDFD6C +:20098000FF0503FE0002FCFAFCFCFDFF030501FCFD0001020203040303030201030304043E +:2009A0000204040306FFF8FCFDF9FBFFFBF9FBFBFAF8FB0101FFFEFAFB010100080B090652 +:2009C00001FF0507000001010508060702FBFDFEFDFCFAF8FCFFFBFB00030200010503020B +:2009E00001FBF9FC0409FCF3FC040400FBF90205FEFF010300F8FCFD0106040504020302FE +:200A0000FF0001080B050302FDFD010302FDFCFCFCFDFEFDFDFAFC0302FEFBFAFD000608DA +:200A200001FCFDFDFF02010201FFFDFE000202020202030402FFFFFF01040706FFFAFCFEAB +:200A4000020901F7F7FD0605FBFAFAF8FCFFFFFFFEFCFF030302FFFCFDFE020101050302AF +:200A600005060602010200010300FF03030102FEFE00FEFE0101FFFFFD0305FC0000F7F96B +:200A8000FEFEFD00FDFBFF01010403FF01FFFE0102060704040300010403FDFBFF0405003D +:200AA000FCFC0506FFFCFBFC000000FDF8F9FDFE000201030704010405040200FCFC01FF3F +:200AC000FDFEFE0003050401FAFD02FF0000FBFE02040904F9F9FE01FFFAFC0000FFFFFC2C +:200AE000F9FC0002030202010202010201000105090A05010201FEFEFDFBFBFE01FFFAFCEA +:200B0000FFFEFEFEFD01030605010403FDFDFEFCFE0101FFFF0001000007090503FEFCFEC5 +:200B20000003FEF8FC000301FAF9FD050604FEF3F902FEFAF7F9FD0002030607070A0905BB +:200B4000040303030605FFFFFDFD040200FFF9FBFDFE01FDFBFCFFFF000501F8F5FC0304A8 +:200B600003FBF9FB020805020205070502FFFFFBFAFCFF01020605FFFAFCFD000300FF016C +:200B80000608040503FE0000FCFDFFFE0003FEFAFF04FBF7FBFE0201FD0000FF0301FAFD64 +:200BA0000000040300040401010001030504000001030302FFFDFDFDFF010300FD0104040F +:200BC000FEFBFBFAFDFEFCFD0000FFFFFFFEFCFF0001040300000405040302060904030409 +:200BE00000FDF9F7FCFFFDFCFBFBFDFF0400FCFF0400FCFDFDFF000306070702FDFCFC011B +:200C0000070703060700FFFEFF02FCFAF9F7FCFDFBFBFD0104FFFEFEFF04060605030507C3 +:200C2000070300FFFF0100FEFE0102FEFFFD010800F9F7F6FC01FFFDFAF90003FDF9FEFFE1 +:200C4000010901F9FE030404040404040402050602030000040402FFFCFDFFFDFBFEFEFB71 +:200C6000FDFDFC0001FE030A03FCFBF9FBFE0101FE010403050704000405FC0107FDF7F974 +:200C8000FE000205FCF2F8F8F901050300FF0107060202FF0009060000FBFD01FDFDFCFC65 +:200CA00000FF00030A0B070403020203040300010601FAF8FAFAFE02FFFCFE01FBF6F9F837 +:200CC000F9FD0103FBFA0202FFFF000201080B02FDFE02060A0A0701FD000400FCFBFCFFF9 +:200CE0000002FEFBFDFF0201FFFFFF040600FE01020300FF00FDFDFFFFFCFCFC0101FF0003 +:200D0000000000FF0001FF0102FF0103040502FE000301FEFEFF00000000FEFE01040400C1 +:200D2000FDFCFDFE00010000050B03FAFCFFFF0302FBFAFCFD00FEFD000404040401FEFCBE +:200D4000000301FFFEFDFD0003070A03FBFE02FFFDFB0001FAFBFDFE04FFFA010A07FAF99C +:200D6000FC020801FAFC020602FCFF030807020300FF00FEFDFE02020304FFFDFEFF00005E +:200D80000002010000FFFF0000000100FE00020101FFFE00FFFCFAFD01010100FBFB020263 +:200DA000FEFCFC000200FFFFFF00020101010102030303030302020506030200FF0001050E +:200DC00003FDFDFF03FFF8F6F9FEFDF9F9F8F9FE03FFF9FC00060906040602FFFF0105082E +:200DE0000702FEFF03080701FEFFFAF7F9FCFDFEFCF7FA000302FCFF0100080705070300F0 +:200E0000FEFFFFFF000002FEFC000306080200070600FCF8F8FC0002FDF8F9FE00FF00FFE7 +:200E200002050100FFFF02040304040100010201FCFC000001FFFBFCFEFF0102FFFF0002A7 +:200E400002010404FFFDFEFF0302FCFD000202FFFE01010001FFFEFFFCFE02020405FFFF8B +:200E6000FEFF04060803FDFEFBFBFDFFFF0205F8FA03FBFAF9FAFCFC0C1001FAFC0003057D +:200E800008020106FFFEFEFD05FFFC00030801FDFEFCFF00FF02010102FEFE0300FEFFFF47 +:200EA000FF04030003060602FEFDFC0000FCFBFCFFFDFCFEFEFEFEFF0301FEFEFEFF05063A +:200EC00002FEFD000403FFFEFF01020101010002020001010101000101000302FDFE0208F8 +:200EE00005FAF8FAF8FAFEFFFFFCF6F90203FFFDFC00060704FFFF04060C0E03FEFF0001F7 +:200F0000FFFBFBFD0001FBFA0102FD0100F9FF0602FE0101FF01020505FFFF040602FDF8DD +:200F2000FA0405FDFDFEFDFE00FEFAFD0405030100FD0105FF0007050201FDFCFF0403FBAE +:200F4000F7F9FBFDFFFCFAFDFE0103020001030403030403030304030102010201FEFF008D +:200F600000FFFEFFFEFEFFFFFDFEFDFDFDFF0200FEFFFEFF000606FF00020303FEFF00FF7F +:200F8000010302FFF9FCFFFEFFFCFBFE0100FDFF05070102050000050A04FBFEFFFDFE004F +:200FA0000002FDFB00FFFE0402FAFF02FDFD000101030906FF0001030806FEF8F8FEFE0030 +:200FC000FEF90004FAF5F8FBFF00FCFCFF0307060304070A0A05030404040502FF0000FFF3 +:200FE000FFFDFBFDFEFCFCFEFF0001FDFBFBFBFCFBFBFCFCFEFF0303FFFF0203070603FF1C +:20100000FE010001020204020405FDFDFDFC0002050703FFFCFAFDFDFCFF0100FDFF0205CB +:20102000070804FE0100FE00FBF7F5F900FFFDF9F6FE00FCFE020706070904FDFE020403B6 +:2010400001010304020201FE000200FBFBFFFE0003080E06FAFBFFFDFEFFF8F7FBFF01FC9C +:20106000FB00040501FD000504020000020302FF000203030000010301FCFFFFFC0000FC5E +:20108000FCFBFE00FDFFFDFBFE0102010400FE010202030403030402000000FFFFFFFF024D +:2010A000040501FF00FEFDFCFE03FEF8F9F9FE02FCF9FAFD0404030100030507060103072F +:2010C00003FCF9FE0201FFFC0206FFFAFAFCFFFEFFFFFF03050504FCF8FAFB020700F6FA38 +:2010E000FE01060502070C0B03FDFCFCFF0302FEFF020202FFFCFCFEFF000203FFFEFEFCD7 +:20110000FDFF01040401FCFBFF010605FFFDFD0307FEFB00FCF9FF0000FFFCFDFE0104FAE2 +:20112000F6FCFF0204050807080700FE06090402FCFC06080801F7FA010503F6EDF7FCF9AA +:20114000FFFFF6F9000003FFF9FAFB0307060A05FE0206FE0007040407090704010001FD66 +:20116000FDFFFEFDF9F7FBFEFEFBFBFE00FFFEFE000403000305040402010202020201017E +:201180000301FF00FF0001FEFEFEFDFF0000FEFBFCFDFDFDFEFEFDFEFEFF0100010102036E +:2011A000030304050906FF00030404FFFDFF010303FDF9FDFEFBFFFCF4F90100FCFBFF0535 +:2011C0000805FEF9FD03070704FEFE02FF00060606FEF801050301FF00010502FAFAFC01F2 +:2011E0000803F5F5FCFAFD0202F9F904040003030005050001FE0105FF00FEFC0101FF01F9 +:201200000103060403040404040302030201FFFDFEFDFCFCFBFCFCFCFDFCFCFDFEFEFEFEDA +:20122000FFFEFF000001010002030201020101020304020101FF0001030200030400000388 +:2012400000FDFDFAFBFEFFFCFBFDFCFE01060B08FFF8FB040503FEF6FD040200000304029C +:20126000FEF8F80206FFFDFCFC0202FEFAFA000708030000000100FF0301030905FFFE0367 +:20128000030205FDF9FEFE030802FBF8F5FAFDFAFAFBF9FB010100030305090A0A07060646 +:2012A00004060502020100FFFEFDFCF9FAFBFBFAFCFBFAFCFCFDFFFFFFFFFF010102020159 +:2012C00002030502010302020301010201010101000000FFFF01030200FDFD0201FCFEFCF8 +:2012E000FE00FDFD040600FFFDFB0004FCF1F4FC0503FEFDFCFF0305070809FEF7FF0305FA +:201300000C0B02040902FDFDFE00FE0102F80109F9F3F9FE040603FAF6F9FCFFFFFAF802E3 +:2013200008070B04FC00FEFF050400000303FFFF0100000403FE00030101FFFDFE0202017F +:201340000100FFFF0100FEFEFDFCFBFCFCFEFEFDFE00020200000101020202030302030295 +:2013600000FF00FFFF030707FEFAFDFCFDFDFAFAFD00FFFEFCFDFF01010205060507080566 +:2013800003FDFB02FFFC000104FEFBFBFD020100FDFDFFFCFF00F90108FEF7F90303FFFD76 +:2013A000FF06060707FFFD04090701FE0306FFFCFFFEFF0501FEFEFDFEFBF9FAFBFDFEFF25 +:0C13C00002020101FF000405010003030C +:00000001FF diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/v74161.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/v74161.vhd new file mode 100644 index 00000000..6a03d402 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/v74161.vhd @@ -0,0 +1,43 @@ +-- 74161 counter - extended to 8 bits +-- code found on the internet +-- adjustments made for 8 bit counter structure + +library IEEE; +use IEEE.std_logic_1164.all; +use ieee.numeric_std.all; + +entity v74161 is +port ( CLK, CLRN, LDN, ENP, ENT: in STD_LOGIC :='0'; +D: in UNSIGNED (7 downto 0) := "00000000"; +Q: out UNSIGNED (7 downto 0):= "00000000"; +RCO: out STD_LOGIC :='0'); +end v74161; + +architecture V74x161_arch of v74161 is + signal IQ: UNSIGNED (7 downto 0) := "00000000"; + signal IRCO: STD_LOGIC := '0'; + begin + +process (CLK, CLRN, IQ, ENT) +begin + +if CLRN='0' then IQ <= "00000000"; +elsif rising_edge(CLK) then +if LDN='0' then IQ <= D; +elsif (ENT and ENP)='1' then IQ <= IQ + 1; +end if; +end if; + +--if (IQ=15) and (ENT='1') then IRCO <= '1'; +if (IQ=255) and (ENT='1') then IRCO <= '1'; +else IRCO <= '0'; +end if; + +end process; + + + +Q <= IQ; +RCO <= IRCO; + +end V74x161_arch; diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/v74161_16bit.vhd b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/v74161_16bit.vhd new file mode 100644 index 00000000..efd71187 --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/v74161_16bit.vhd @@ -0,0 +1,44 @@ +-- 74161 counter: 16 bit extended version +-- code found on the internet +-- adjusted to fit 16 bit counter structure + +library IEEE; +use IEEE.std_logic_1164.all; +use ieee.numeric_std.all; + +entity v74161_16bit is +port ( CLK, CLRN, LDN, ENP, ENT: in STD_LOGIC :='0'; +D: in UNSIGNED (15 downto 0) := "0000000000000000"; +Q: out UNSIGNED (15 downto 0):= "0000000000000000"; +RCO: out STD_LOGIC :='0'); +end v74161_16bit; + +architecture V74x161_arch of v74161_16bit is + signal IQ: UNSIGNED (15 downto 0) := "0000000000000000"; + signal IRCO: STD_LOGIC := '0'; + begin + +process (CLK, CLRN, IQ, ENT) +begin + +if CLRN='0' then IQ <= "0000000000000000"; +elsif rising_edge(CLK) then +if LDN='0' then + IQ <= D; +elsif (ENT and ENP)='1' then IQ <= IQ + 1; +end if; +end if; + +--if (IQ=15) and (ENT='1') then IRCO <= '1'; + +if (IQ=65535) and (ENT='1') then IRCO <= '1'; +else IRCO <= '0'; +end if; + +end process; + + +Q <= IQ; +RCO <= IRCO; + +end V74x161_arch; diff --git a/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/video_mixer.sv b/Arcade/Custom Hardware/ComputerSpace_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Custom Hardware/ComputerSpace_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/Arcade/Custom Hardware/Galaga_MIST/README.txt b/Arcade/Custom Hardware/Galaga_MIST/README.txt new file mode 100644 index 00000000..82a73631 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/README.txt @@ -0,0 +1,24 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Galaga for MiST by Gehstock +-- 18 December 2017 +-- +--------------------------------------------------------------------------------- +-- Copyright (c) DAR - Dez 2016 +-- https://sourceforge.net/projects/darfpga/files/Software%20VHDL/galaga/ +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F1 : Start 1 player +-- F2 : Start 2 players +-- SPACE : Fire +-- ARROW KEYS : Movement +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- \ No newline at end of file diff --git a/Arcade/Custom Hardware/Galaga_MIST/Release/galaga_mist.rbf b/Arcade/Custom Hardware/Galaga_MIST/Release/galaga_mist.rbf new file mode 100644 index 00000000..4a52e67d Binary files /dev/null and b/Arcade/Custom Hardware/Galaga_MIST/Release/galaga_mist.rbf differ diff --git a/Arcade/Custom Hardware/Galaga_MIST/clean.bat b/Arcade/Custom Hardware/Galaga_MIST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade/Custom Hardware/Galaga_MIST/galaga_mist.qpf b/Arcade/Custom Hardware/Galaga_MIST/galaga_mist.qpf new file mode 100644 index 00000000..0ec77b14 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/galaga_mist.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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.0.1 Build 232 06/12/2013 Service Pack 1 SJ Web Edition +# Date created = 20:10:08 November 14, 2016 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.0" +DATE = "20:10:08 November 14, 2016" + +# Revisions + +PROJECT_REVISION = "galaga_mist" diff --git a/Arcade/Custom Hardware/Galaga_MIST/galaga_mist.qsf b/Arcade/Custom Hardware/Galaga_MIST/galaga_mist.qsf new file mode 100644 index 00000000..274d00aa --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/galaga_mist.qsf @@ -0,0 +1,203 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 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.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 08:30:59 December 07, 2015 +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:40:24 MAY 17, 2014" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL + +# 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_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE SPEED +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY galaga_mist +set_global_assignment -name DEVICE_FILTER_PACKAGE TQFP +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name ALLOW_POWER_UP_DONT_CARE ON +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON + +# Fitter Assignments +# ================== +set_global_assignment -name FITTER_EARLY_TIMING_ESTIMATE_MODE OPTIMISTIC +set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC ON +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING ON +set_global_assignment -name PHYSICAL_SYNTHESIS_ASYNCHRONOUS_SIGNAL_PIPELINING ON +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION ON +set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC_FOR_AREA ON +set_global_assignment -name PHYSICAL_SYNTHESIS_MAP_LOGIC_TO_MEMORY_FOR_AREA ON +set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT EXTRA +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +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" +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# SignalTap II Assignments +# ======================== +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp + +# 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 ENTITY(galaga_mist) + +# Pin & Location Assignments +# ========================== + +# Fitter Assignments +# ================== +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_HS +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_VS +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to LED +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to AUDIO_L +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to AUDIO_R +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SPI_DO +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to CONF_DATA0 + +# end ENTITY(galaga_mist) +# ---------------------- +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name SAVE_DISK_SPACE OFF +set_global_assignment -name FLOW_ENABLE_IO_ASSIGNMENT_ANALYSIS ON + +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 VHDL_FILE rtl/ROM/sp_palette.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/sp_graphx.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/sound_seq.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/sound_samples.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/galaga_cpu3.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/galaga_cpu2.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/galaga_cpu1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/bg_palette.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/bg_graphx.vhd +set_global_assignment -name VHDL_FILE rtl/CPU/T80se.vhd +set_global_assignment -name VHDL_FILE rtl/CPU/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/CPU/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/CPU/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/CPU/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/CPU/T80.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VHDL_FILE rtl/stars_machine.vhd +set_global_assignment -name VHDL_FILE rtl/stars.vhd +set_global_assignment -name VHDL_FILE rtl/sound_machine.vhd +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VHDL_FILE rtl/rgb.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/gen_video.vhd +set_global_assignment -name VHDL_FILE rtl/gen_ram.vhd +set_global_assignment -name VHDL_FILE rtl/galaga_mist.vhd +set_global_assignment -name VHDL_FILE rtl/galaga.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Custom Hardware/Galaga_MIST/galaga_mist.sdc b/Arcade/Custom Hardware/Galaga_MIST/galaga_mist.sdc new file mode 100644 index 00000000..3eba3b05 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/galaga_mist.sdc @@ -0,0 +1,33 @@ +#************************************************************ +# THIS IS A WIZARD-GENERATED FILE. +# +# Version 13.1.4 Build 182 03/12/2014 SJ Full Version +# +#************************************************************ + +# Copyright (C) 1991-2014 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. + + + +# Clock constraints + +create_clock -name "CLOCK_27" -period 37.037 [get_ports {CLOCK_27}] +create_clock -name {SPI_SCK} -period 10.000 -waveform { 0.000 0.500 } [get_ports {SPI_SCK}] + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80.vhd new file mode 100644 index 00000000..398fa0df --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80.vhd @@ -0,0 +1,1073 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 and Auto_Wait_t1 = '0' then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if T_Res = '1' then + Auto_Wait_t1 <= '0'; + else + Auto_Wait_t1 <= Auto_Wait or IORQ_i; + end if; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if (Auto_Wait = '1' and Auto_Wait_t2 = '0') nor + (IOWait = 1 and IORQ_i = '1' and Auto_Wait_t1 = '0') then + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80_ALU.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80_ALU.vhd new file mode 100644 index 00000000..86fddce7 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80_ALU.vhd @@ -0,0 +1,351 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; + +end; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80_MCode.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80_MCode.vhd new file mode 100644 index 00000000..4cc30f35 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80_MCode.vhd @@ -0,0 +1,1934 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; +-- constant aNone : std_logic_vector(2 downto 0) := "000"; +-- constant aXY : std_logic_vector(2 downto 0) := "001"; +-- constant aIOA : std_logic_vector(2 downto 0) := "010"; +-- constant aSP : std_logic_vector(2 downto 0) := "011"; +-- constant aBC : std_logic_vector(2 downto 0) := "100"; +-- constant aDE : std_logic_vector(2 downto 0) := "101"; +-- constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0010"; + else + IncDec_16 <= "1010"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0010"; + else + IncDec_16 <= "1010"; + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80_Pack.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80_Pack.vhd new file mode 100644 index 00000000..ac7d34da --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80_Pack.vhd @@ -0,0 +1,208 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80_Reg.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80se.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80se.vhd new file mode 100644 index 00000000..ac8886a8 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/CPU/T80se.vhd @@ -0,0 +1,184 @@ +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80se is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0; -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + IOWait : integer := 1 -- 0 => Single cycle I/O, 1 => Std I/O cycle + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80se; + +architecture rtl of T80se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => Mode, + IOWait => IOWait) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/bg_graphx.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/bg_graphx.vhd new file mode 100644 index 00000000..f62270b7 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/bg_graphx.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity bg_graphx is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of bg_graphx is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00",X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00", + X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00",X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00", + X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00",X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00", + X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00",X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00", + X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00",X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00", + X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00",X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"44",X"AA",X"44",X"00",X"88",X"44",X"22",X"00",X"88",X"44",X"22",X"11",X"44",X"AA",X"44",X"00", + X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"BB",X"00",X"00",X"00",X"00",X"CC",X"EE",X"FF",X"33",X"00",X"00", + X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC",X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33", + X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00",X"0C",X"0C",X"0C",X"0C",X"0F",X"0F",X"00",X"00", + X"0B",X"0B",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"0D",X"0D",X"0D",X"01",X"00",X"00",X"07",X"0F", + X"0F",X"00",X"00",X"0F",X"0F",X"0F",X"0B",X"0B",X"0F",X"00",X"00",X"07",X"0F",X"0F",X"0D",X"0D", + X"0F",X"00",X"00",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"0C",X"0C",X"0F",X"0F",X"0C",X"0C",X"0F", + X"03",X"03",X"03",X"0F",X"0E",X"00",X"00",X"0F",X"0C",X"0C",X"0C",X"0F",X"07",X"00",X"00",X"07", + X"03",X"0F",X"0E",X"00",X"00",X"03",X"03",X"03",X"0C",X"0F",X"07",X"00",X"00",X"0C",X"0C",X"0C", + X"00",X"00",X"0E",X"0F",X"03",X"03",X"03",X"03",X"00",X"00",X"07",X"0F",X"0C",X"0C",X"0C",X"0C", + X"00",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"88",X"CC",X"6E",X"BF",X"6E",X"CC",X"88",X"00",X"F3",X"E3",X"F3",X"F3",X"F3",X"E3",X"F3", + X"00",X"F0",X"FB",X"FB",X"FA",X"FE",X"FE",X"F0",X"00",X"32",X"32",X"32",X"32",X"32",X"32",X"32", + X"00",X"88",X"4C",X"AE",X"DF",X"AE",X"4C",X"88",X"00",X"F3",X"FB",X"FB",X"FB",X"FB",X"FB",X"F3", + X"0F",X"6F",X"CF",X"8F",X"AF",X"BF",X"FF",X"00",X"23",X"33",X"33",X"33",X"33",X"33",X"33",X"00", + X"7F",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"0F",X"7F",X"0F",X"BF",X"FF",X"EE",X"CC",X"00", + X"00",X"00",X"FF",X"BF",X"AF",X"8F",X"CF",X"6F",X"00",X"00",X"33",X"33",X"33",X"33",X"33",X"33", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"EE",X"00",X"00",X"CC",X"EE",X"FF",X"BF",X"0F",X"7F", + X"0F",X"96",X"3C",X"78",X"78",X"2D",X"87",X"F0",X"87",X"D2",X"F0",X"E1",X"E1",X"F0",X"F0",X"F0", + X"78",X"68",X"48",X"80",X"00",X"00",X"00",X"00",X"5A",X"D2",X"C3",X"96",X"3C",X"68",X"C0",X"80", + X"00",X"F0",X"87",X"2D",X"78",X"78",X"3C",X"96",X"00",X"F0",X"F0",X"F0",X"E1",X"E1",X"F0",X"D2", + X"00",X"00",X"00",X"00",X"00",X"80",X"48",X"68",X"00",X"80",X"C0",X"68",X"3C",X"96",X"C3",X"D2", + X"FF",X"FF",X"DD",X"FF",X"BB",X"FF",X"FF",X"0F",X"7F",X"7F",X"0F",X"0F",X"1F",X"3F",X"1F",X"0F", + X"0F",X"0E",X"8C",X"08",X"00",X"00",X"00",X"00",X"FF",X"77",X"9F",X"0F",X"8F",X"0E",X"CC",X"08", + X"00",X"0F",X"FF",X"FF",X"BB",X"FF",X"DD",X"FF",X"00",X"0F",X"1F",X"3F",X"1F",X"2F",X"2F",X"5D", + X"00",X"00",X"00",X"00",X"00",X"08",X"8C",X"0E",X"00",X"08",X"CC",X"0E",X"8F",X"0F",X"9F",X"77", + X"DF",X"DF",X"F0",X"F0",X"F0",X"F0",X"DF",X"DF",X"EF",X"EF",X"FC",X"FC",X"FC",X"FC",X"EF",X"EF", + X"F7",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"F8",X"F0",X"F1",X"F3",X"F7",X"EE",X"CC",X"88", + X"00",X"DF",X"DF",X"F0",X"F0",X"F0",X"F0",X"DF",X"00",X"EF",X"EF",X"FC",X"FC",X"FC",X"FC",X"EF", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"EE",X"00",X"88",X"CC",X"EE",X"F7",X"F3",X"F1",X"F0", + X"FE",X"FF",X"11",X"00",X"71",X"00",X"10",X"00",X"77",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"00",X"71",X"00",X"11",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"EE",X"88",X"C0",X"C0",X"88",X"CC",X"EE",X"00",X"F7",X"F3",X"FE",X"7F",X"BF",X"11",X"F7",X"00", + X"00",X"00",X"EE",X"CC",X"88",X"C0",X"C0",X"88",X"00",X"00",X"F7",X"11",X"BF",X"7F",X"FE",X"F3", + X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"18",X"18",X"10",X"20",X"40",X"51",X"91",X"22",X"00",X"00",X"01",X"01",X"0E",X"00",X"10",X"E0", + X"22",X"91",X"51",X"40",X"20",X"10",X"18",X"18",X"E0",X"10",X"00",X"0E",X"01",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"51",X"91",X"22",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"18",X"18",X"18",X"10",X"10",X"20",X"20",X"40",X"44",X"44",X"44",X"89",X"89",X"01",X"02",X"02", + X"40",X"20",X"20",X"10",X"10",X"18",X"18",X"18",X"02",X"02",X"01",X"89",X"89",X"44",X"44",X"44", + X"00",X"00",X"00",X"00",X"00",X"22",X"91",X"51",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04", + X"51",X"51",X"51",X"A2",X"00",X"00",X"00",X"00",X"02",X"02",X"04",X"00",X"00",X"00",X"00",X"00", + X"18",X"18",X"18",X"18",X"18",X"20",X"20",X"20",X"44",X"44",X"44",X"44",X"44",X"45",X"89",X"89", + X"20",X"20",X"20",X"18",X"18",X"18",X"18",X"18",X"89",X"89",X"45",X"44",X"44",X"44",X"44",X"44", + X"00",X"00",X"00",X"00",X"A2",X"51",X"51",X"51",X"00",X"00",X"00",X"00",X"00",X"04",X"02",X"02", + X"20",X"20",X"51",X"51",X"91",X"22",X"00",X"00",X"01",X"02",X"02",X"02",X"04",X"00",X"00",X"00", + X"18",X"18",X"18",X"18",X"18",X"18",X"20",X"20",X"44",X"44",X"44",X"44",X"44",X"44",X"89",X"89", + X"20",X"20",X"18",X"18",X"18",X"18",X"18",X"18",X"89",X"89",X"44",X"44",X"44",X"44",X"44",X"44", + X"00",X"00",X"22",X"91",X"51",X"51",X"20",X"20",X"00",X"00",X"00",X"04",X"02",X"02",X"02",X"01", + X"20",X"20",X"20",X"40",X"40",X"40",X"80",X"00",X"89",X"89",X"01",X"02",X"02",X"04",X"00",X"00", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"20",X"44",X"44",X"44",X"44",X"44",X"44",X"88",X"89", + X"20",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"89",X"88",X"44",X"44",X"44",X"44",X"44",X"44", + X"00",X"80",X"40",X"40",X"40",X"20",X"20",X"20",X"00",X"00",X"04",X"02",X"02",X"01",X"89",X"89", + X"91",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"20",X"20",X"20",X"40",X"40",X"40",X"40",X"89",X"89",X"89",X"89",X"8A",X"8A",X"8A",X"8C", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"28",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44", + X"28",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44", + X"40",X"40",X"40",X"40",X"20",X"20",X"20",X"20",X"8C",X"8A",X"8A",X"8A",X"89",X"89",X"89",X"89", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"91",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"91",X"91",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"20",X"20",X"40",X"40",X"40",X"40",X"80",X"89",X"89",X"89",X"8A",X"8A",X"8A",X"8A",X"8C", + X"18",X"18",X"18",X"18",X"18",X"28",X"28",X"28",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44", + X"28",X"28",X"28",X"18",X"18",X"18",X"18",X"18",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44", + X"80",X"40",X"40",X"40",X"40",X"20",X"20",X"20",X"8C",X"8A",X"8A",X"8A",X"8A",X"89",X"89",X"89", + X"00",X"00",X"00",X"00",X"00",X"00",X"91",X"91",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04", + X"51",X"91",X"A2",X"A2",X"00",X"00",X"00",X"00",X"04",X"04",X"04",X"00",X"00",X"00",X"00",X"00", + X"20",X"20",X"20",X"20",X"20",X"40",X"40",X"40",X"89",X"89",X"89",X"89",X"8A",X"8A",X"8A",X"8A", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"88", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"88",X"44",X"44",X"44",X"44",X"44",X"44",X"44", + X"40",X"40",X"40",X"20",X"20",X"20",X"20",X"20",X"8A",X"8A",X"8A",X"8A",X"89",X"89",X"89",X"89", + X"00",X"00",X"00",X"00",X"A2",X"A2",X"91",X"51",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"04", + X"51",X"51",X"91",X"A2",X"A2",X"22",X"00",X"00",X"02",X"02",X"02",X"04",X"04",X"00",X"00",X"00", + X"20",X"20",X"20",X"20",X"20",X"40",X"40",X"40",X"89",X"89",X"89",X"89",X"89",X"89",X"8A",X"8A", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44", + X"40",X"40",X"40",X"20",X"20",X"20",X"20",X"20",X"8A",X"8A",X"89",X"89",X"89",X"89",X"89",X"89", + X"00",X"00",X"22",X"A2",X"A2",X"91",X"51",X"51",X"00",X"00",X"00",X"04",X"04",X"02",X"02",X"02", + X"40",X"40",X"40",X"40",X"80",X"80",X"80",X"00",X"02",X"02",X"04",X"04",X"04",X"04",X"00",X"00", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"89",X"89",X"89",X"89",X"89",X"8A",X"8A",X"8A", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"8A",X"8A",X"8A",X"89",X"89",X"89",X"89",X"89", + X"00",X"80",X"80",X"80",X"40",X"40",X"40",X"40",X"00",X"00",X"04",X"04",X"04",X"04",X"02",X"02", + X"11",X"33",X"44",X"44",X"66",X"33",X"11",X"00",X"CC",X"EE",X"33",X"11",X"11",X"EE",X"CC",X"00", + X"44",X"44",X"77",X"77",X"44",X"44",X"00",X"00",X"00",X"00",X"FF",X"FF",X"22",X"00",X"00",X"00", + X"44",X"44",X"55",X"55",X"77",X"77",X"66",X"00",X"66",X"FF",X"DD",X"99",X"99",X"33",X"22",X"00", + X"33",X"77",X"44",X"44",X"44",X"66",X"22",X"00",X"11",X"BB",X"FF",X"DD",X"99",X"11",X"00",X"00", + X"11",X"77",X"77",X"11",X"11",X"11",X"11",X"00",X"00",X"FF",X"FF",X"33",X"66",X"CC",X"88",X"00", + X"33",X"77",X"44",X"44",X"44",X"66",X"22",X"00",X"88",X"DD",X"55",X"55",X"55",X"77",X"77",X"00", + X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00",X"00",X"99",X"99",X"99",X"BB",X"EE",X"CC",X"00", + X"00",X"00",X"00",X"77",X"77",X"00",X"00",X"00",X"33",X"77",X"DD",X"99",X"11",X"33",X"33",X"00", + X"33",X"77",X"55",X"55",X"44",X"44",X"33",X"00",X"00",X"66",X"99",X"99",X"DD",X"FF",X"66",X"00", + X"11",X"33",X"66",X"44",X"44",X"44",X"00",X"00",X"EE",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"77",X"77",X"11",X"11",X"11",X"77",X"77",X"00",X"CC",X"EE",X"33",X"11",X"33",X"EE",X"CC",X"00", + X"33",X"77",X"44",X"44",X"44",X"77",X"77",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"22",X"66",X"44",X"44",X"66",X"33",X"11",X"00",X"22",X"33",X"11",X"11",X"33",X"EE",X"CC",X"00", + X"11",X"33",X"66",X"44",X"44",X"77",X"77",X"00",X"CC",X"EE",X"33",X"11",X"11",X"FF",X"FF",X"00", + X"44",X"44",X"44",X"44",X"77",X"77",X"00",X"00",X"11",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"00",X"11",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"77",X"77",X"44",X"44",X"66",X"33",X"11",X"00",X"99",X"99",X"99",X"11",X"33",X"EE",X"CC",X"00", + X"77",X"77",X"00",X"00",X"00",X"77",X"77",X"00",X"FF",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"44",X"44",X"77",X"77",X"44",X"44",X"00",X"00",X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00", + X"33",X"77",X"44",X"44",X"44",X"66",X"22",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"66",X"77",X"33",X"11",X"77",X"77",X"00",X"11",X"33",X"66",X"CC",X"88",X"FF",X"FF",X"00", + X"44",X"44",X"44",X"44",X"77",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"77",X"77",X"00",X"11",X"00",X"77",X"77",X"00",X"FF",X"FF",X"EE",X"CC",X"EE",X"FF",X"FF",X"00", + X"77",X"77",X"33",X"11",X"00",X"77",X"77",X"00",X"FF",X"FF",X"88",X"CC",X"EE",X"FF",X"FF",X"00", + X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00",X"EE",X"FF",X"11",X"11",X"11",X"FF",X"EE",X"00", + X"00",X"11",X"11",X"11",X"11",X"77",X"77",X"00",X"EE",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"55",X"33",X"77",X"55",X"44",X"77",X"33",X"00",X"EE",X"FF",X"11",X"11",X"11",X"FF",X"EE",X"00", + X"44",X"66",X"77",X"33",X"11",X"77",X"77",X"00",X"EE",X"FF",X"99",X"11",X"11",X"FF",X"FF",X"00", + X"33",X"77",X"44",X"44",X"44",X"66",X"22",X"00",X"00",X"AA",X"BB",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"77",X"77",X"00",X"00",X"00",X"00",X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00", + X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"11",X"33",X"77",X"33",X"11",X"00",X"00",X"FF",X"FF",X"88",X"00",X"88",X"FF",X"FF",X"00", + X"77",X"77",X"33",X"11",X"33",X"77",X"77",X"00",X"FF",X"FF",X"88",X"CC",X"88",X"FF",X"FF",X"00", + X"66",X"77",X"33",X"11",X"33",X"77",X"66",X"00",X"33",X"77",X"EE",X"CC",X"EE",X"77",X"33",X"00", + X"00",X"00",X"77",X"77",X"00",X"00",X"00",X"00",X"77",X"FF",X"88",X"88",X"FF",X"77",X"00",X"00", + X"44",X"44",X"44",X"55",X"77",X"77",X"66",X"00",X"33",X"77",X"FF",X"DD",X"99",X"11",X"11",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11", + X"22",X"55",X"22",X"00",X"11",X"22",X"44",X"00",X"11",X"22",X"44",X"88",X"22",X"55",X"22",X"00", + X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"DD",X"00",X"00",X"00",X"00",X"33",X"77",X"FF",X"CC",X"00",X"00", + X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33",X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC", + X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00",X"03",X"03",X"03",X"03",X"0F",X"0F",X"00",X"00", + X"0D",X"0D",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"0B",X"0B",X"0B",X"08",X"00",X"00",X"0E",X"0F", + X"0F",X"00",X"00",X"0F",X"0F",X"0F",X"0D",X"0D",X"0F",X"00",X"00",X"0E",X"0F",X"0F",X"0B",X"0B", + X"0F",X"00",X"00",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"03",X"03",X"0F",X"0F",X"03",X"03",X"0F", + X"0C",X"0C",X"0C",X"0F",X"07",X"00",X"00",X"0F",X"03",X"03",X"03",X"0F",X"0E",X"00",X"00",X"0E", + X"0C",X"0F",X"07",X"00",X"00",X"0C",X"0C",X"0C",X"03",X"0F",X"0E",X"00",X"00",X"03",X"03",X"03", + X"00",X"00",X"07",X"0F",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"0E",X"0F",X"03",X"03",X"03",X"03", + X"00",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"33",X"67",X"DF",X"67",X"33",X"11",X"00",X"FC",X"7C",X"FC",X"FC",X"FC",X"7C",X"FC", + X"00",X"F0",X"FD",X"FD",X"F5",X"F7",X"F7",X"F0",X"00",X"C4",X"C4",X"C4",X"C4",X"C4",X"C4",X"C4", + X"00",X"11",X"23",X"57",X"BF",X"57",X"23",X"11",X"00",X"FC",X"FD",X"FD",X"FD",X"FD",X"FD",X"FC", + X"0F",X"6F",X"3F",X"1F",X"5F",X"DF",X"FF",X"00",X"4C",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"00", + X"EF",X"77",X"33",X"11",X"00",X"00",X"00",X"00",X"0F",X"EF",X"0F",X"DF",X"FF",X"77",X"33",X"00", + X"00",X"00",X"FF",X"DF",X"5F",X"1F",X"3F",X"6F",X"00",X"00",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC", + X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"00",X"00",X"33",X"77",X"FF",X"DF",X"0F",X"EF", + X"0F",X"96",X"C3",X"E1",X"E1",X"4B",X"1E",X"F0",X"1E",X"B4",X"F0",X"78",X"78",X"F0",X"F0",X"F0", + X"E1",X"61",X"21",X"10",X"00",X"00",X"00",X"00",X"A5",X"B4",X"3C",X"96",X"C3",X"61",X"30",X"10", + X"00",X"F0",X"1E",X"4B",X"E1",X"E1",X"C3",X"96",X"00",X"F0",X"F0",X"F0",X"78",X"78",X"F0",X"B4", + X"00",X"00",X"00",X"00",X"00",X"10",X"21",X"61",X"00",X"10",X"30",X"61",X"C3",X"96",X"3C",X"B4", + X"FF",X"FF",X"BB",X"FF",X"DD",X"FF",X"FF",X"0F",X"EF",X"EF",X"0F",X"0F",X"8F",X"CF",X"8F",X"0F", + X"0F",X"07",X"13",X"01",X"00",X"00",X"00",X"00",X"FF",X"EE",X"9F",X"0F",X"1F",X"07",X"33",X"01", + X"00",X"0F",X"FF",X"FF",X"DD",X"FF",X"BB",X"FF",X"00",X"0F",X"8F",X"CF",X"8F",X"4F",X"4F",X"AB", + X"00",X"00",X"00",X"00",X"00",X"01",X"13",X"07",X"00",X"01",X"33",X"07",X"1F",X"0F",X"9F",X"EE", + X"BF",X"BF",X"F0",X"F0",X"F0",X"F0",X"BF",X"BF",X"7F",X"7F",X"F3",X"F3",X"F3",X"F3",X"7F",X"7F", + X"FE",X"77",X"33",X"11",X"00",X"00",X"00",X"00",X"F1",X"F0",X"F8",X"FC",X"FE",X"77",X"33",X"11", + X"00",X"BF",X"BF",X"F0",X"F0",X"F0",X"F0",X"BF",X"00",X"7F",X"7F",X"F3",X"F3",X"F3",X"F3",X"7F", + X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"00",X"11",X"33",X"77",X"FE",X"FC",X"F8",X"F0", + X"F7",X"FF",X"88",X"00",X"E8",X"00",X"80",X"00",X"EE",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"00",X"E8",X"00",X"88",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88", + X"77",X"11",X"30",X"30",X"11",X"33",X"77",X"00",X"FE",X"FC",X"F7",X"EF",X"DF",X"88",X"FE",X"00", + X"00",X"00",X"77",X"33",X"11",X"30",X"30",X"11",X"00",X"00",X"FE",X"88",X"DF",X"EF",X"F7",X"FC", + X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"81",X"81",X"80",X"40",X"20",X"A8",X"98",X"44",X"00",X"00",X"08",X"08",X"07",X"00",X"80",X"70", + X"44",X"98",X"A8",X"20",X"40",X"80",X"81",X"81",X"70",X"80",X"00",X"07",X"08",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A8",X"98",X"44",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"81",X"81",X"81",X"80",X"80",X"40",X"40",X"20",X"22",X"22",X"22",X"19",X"19",X"08",X"04",X"04", + X"20",X"40",X"40",X"80",X"80",X"81",X"81",X"81",X"04",X"04",X"08",X"19",X"19",X"22",X"22",X"22", + X"00",X"00",X"00",X"00",X"00",X"44",X"98",X"A8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02", + X"A8",X"A8",X"A8",X"54",X"00",X"00",X"00",X"00",X"04",X"04",X"02",X"00",X"00",X"00",X"00",X"00", + X"81",X"81",X"81",X"81",X"81",X"40",X"40",X"40",X"22",X"22",X"22",X"22",X"22",X"2A",X"19",X"19", + X"40",X"40",X"40",X"81",X"81",X"81",X"81",X"81",X"19",X"19",X"2A",X"22",X"22",X"22",X"22",X"22", + X"00",X"00",X"00",X"00",X"54",X"A8",X"A8",X"A8",X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"04", + X"40",X"40",X"A8",X"A8",X"98",X"44",X"00",X"00",X"08",X"04",X"04",X"04",X"02",X"00",X"00",X"00", + X"81",X"81",X"81",X"81",X"81",X"81",X"40",X"40",X"22",X"22",X"22",X"22",X"22",X"22",X"19",X"19", + X"40",X"40",X"81",X"81",X"81",X"81",X"81",X"81",X"19",X"19",X"22",X"22",X"22",X"22",X"22",X"22", + X"00",X"00",X"44",X"98",X"A8",X"A8",X"40",X"40",X"00",X"00",X"00",X"02",X"04",X"04",X"04",X"08", + X"40",X"40",X"40",X"20",X"20",X"20",X"10",X"00",X"19",X"19",X"08",X"04",X"04",X"02",X"00",X"00", + X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"40",X"22",X"22",X"22",X"22",X"22",X"22",X"11",X"19", + X"40",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"19",X"11",X"22",X"22",X"22",X"22",X"22",X"22", + X"00",X"10",X"20",X"20",X"20",X"40",X"40",X"40",X"00",X"00",X"02",X"04",X"04",X"08",X"19",X"19", + X"98",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"40",X"40",X"40",X"20",X"20",X"20",X"20",X"19",X"19",X"19",X"19",X"15",X"15",X"15",X"13", + X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"41",X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"22", + X"41",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"22", + X"20",X"20",X"20",X"20",X"40",X"40",X"40",X"40",X"13",X"15",X"15",X"15",X"19",X"19",X"19",X"19", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"98",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"98",X"98",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"40",X"40",X"20",X"20",X"20",X"20",X"10",X"19",X"19",X"19",X"15",X"15",X"15",X"15",X"13", + X"81",X"81",X"81",X"81",X"81",X"41",X"41",X"41",X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"22", + X"41",X"41",X"41",X"81",X"81",X"81",X"81",X"81",X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"22", + X"10",X"20",X"20",X"20",X"20",X"40",X"40",X"40",X"13",X"15",X"15",X"15",X"15",X"19",X"19",X"19", + X"00",X"00",X"00",X"00",X"00",X"00",X"98",X"98",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02", + X"A8",X"98",X"54",X"54",X"00",X"00",X"00",X"00",X"02",X"02",X"02",X"00",X"00",X"00",X"00",X"00", + X"40",X"40",X"40",X"40",X"40",X"20",X"20",X"20",X"19",X"19",X"19",X"19",X"15",X"15",X"15",X"15", + X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"11", + X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"11",X"22",X"22",X"22",X"22",X"22",X"22",X"22", + X"20",X"20",X"20",X"40",X"40",X"40",X"40",X"40",X"15",X"15",X"15",X"15",X"19",X"19",X"19",X"19", + X"00",X"00",X"00",X"00",X"54",X"54",X"98",X"A8",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"02", + X"A8",X"A8",X"98",X"54",X"54",X"44",X"00",X"00",X"04",X"04",X"04",X"02",X"02",X"00",X"00",X"00", + X"40",X"40",X"40",X"40",X"40",X"20",X"20",X"20",X"19",X"19",X"19",X"19",X"19",X"19",X"15",X"15", + X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"22", + X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"22", + X"20",X"20",X"20",X"40",X"40",X"40",X"40",X"40",X"15",X"15",X"19",X"19",X"19",X"19",X"19",X"19", + X"00",X"00",X"44",X"54",X"54",X"98",X"A8",X"A8",X"00",X"00",X"00",X"02",X"02",X"04",X"04",X"04", + X"20",X"20",X"20",X"20",X"10",X"10",X"10",X"00",X"04",X"04",X"02",X"02",X"02",X"02",X"00",X"00", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"19",X"19",X"19",X"19",X"19",X"15",X"15",X"15", + X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"22", + X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"22", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"15",X"15",X"15",X"19",X"19",X"19",X"19",X"19", + X"00",X"10",X"10",X"10",X"20",X"20",X"20",X"20",X"00",X"00",X"02",X"02",X"02",X"02",X"04",X"04"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/bg_palette.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/bg_palette.vhd new file mode 100644 index 00000000..b7edf1e5 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/bg_palette.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity bg_palette is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(3 downto 0) +); +end entity; + +architecture prom of bg_palette is + type rom is array(0 to 255) of std_logic_vector(3 downto 0); + signal rom_data: rom := ( + X"F",X"0",X"0",X"6",X"F",X"D",X"1",X"0",X"F",X"2",X"C",X"D",X"F",X"B",X"1",X"0", + X"F",X"1",X"0",X"1",X"F",X"0",X"0",X"2",X"F",X"0",X"0",X"3",X"F",X"0",X"0",X"5", + X"F",X"0",X"0",X"9",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"F",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"F",X"B",X"7",X"6",X"F",X"6",X"B",X"7",X"F",X"7",X"6",X"B",X"F",X"F",X"F",X"1", + X"F",X"F",X"B",X"F",X"F",X"2",X"F",X"F",X"F",X"6",X"6",X"B",X"F",X"6",X"B",X"B", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/galaga_cpu1.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/galaga_cpu1.vhd new file mode 100644 index 00000000..1fe98b38 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/galaga_cpu1.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity galaga_cpu1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of galaga_cpu1 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"3E",X"10",X"32",X"00",X"71",X"C3",X"C4",X"02",X"87",X"30",X"05",X"24",X"C3",X"10",X"00",X"FF", + X"85",X"6F",X"D0",X"24",X"C9",X"FF",X"FF",X"FF",X"77",X"23",X"10",X"FC",X"C9",X"FF",X"FF",X"FF", + X"7B",X"D6",X"20",X"5F",X"D0",X"15",X"C9",X"FF",X"21",X"00",X"91",X"06",X"F0",X"AF",X"DF",X"C9", + X"37",X"08",X"C3",X"B5",X"13",X"FF",X"FF",X"FF",X"C3",X"37",X"02",X"E9",X"21",X"00",X"93",X"06", + X"80",X"AF",X"DF",X"21",X"00",X"9B",X"06",X"80",X"DF",X"21",X"00",X"88",X"3E",X"80",X"06",X"80", + X"DF",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"D9",X"ED",X"A0",X"EA",X"8F",X"00",X"F5",X"21",X"00",X"71", + X"36",X"10",X"3A",X"B9",X"9A",X"A7",X"28",X"16",X"AF",X"32",X"B9",X"9A",X"21",X"92",X"00",X"11", + X"00",X"70",X"01",X"04",X"00",X"D9",X"3E",X"A8",X"32",X"00",X"71",X"F1",X"ED",X"45",X"F1",X"D9", + X"ED",X"45",X"10",X"10",X"20",X"20",X"3A",X"08",X"3B",X"08",X"B2",X"17",X"00",X"17",X"86",X"1A", + X"6A",X"08",X"3A",X"08",X"3A",X"08",X"24",X"29",X"EC",X"1D",X"9E",X"2A",X"B9",X"1D",X"EB",X"23", + X"AA",X"1E",X"38",X"1D",X"48",X"09",X"6B",X"1B",X"B2",X"19",X"7C",X"1D",X"3A",X"08",X"8B",X"1F", + X"0A",X"1F",X"3A",X"08",X"D8",X"1D",X"30",X"22",X"D9",X"21",X"3A",X"08",X"3A",X"08",X"F2",X"20", + X"00",X"20",X"3A",X"08",X"8A",X"09",X"11",X"ED",X"83",X"21",X"B9",X"02",X"01",X"05",X"00",X"ED", + X"B0",X"1E",X"CB",X"21",X"EB",X"00",X"0E",X"11",X"ED",X"B0",X"C9",X"0E",X"1B",X"18",X"0C",X"1C", + X"24",X"11",X"10",X"12",X"11",X"24",X"24",X"24",X"24",X"19",X"1E",X"01",X"FF",X"FF",X"FF",X"FF", + X"14",X"06",X"14",X"0C",X"14",X"08",X"14",X"0A",X"1C",X"00",X"1C",X"12",X"1E",X"00",X"1E",X"12", + X"1C",X"02",X"1C",X"10",X"1E",X"02",X"1E",X"10",X"1C",X"04",X"1C",X"0E",X"1E",X"04",X"1E",X"0E", + X"1C",X"06",X"1C",X"0C",X"1E",X"06",X"1E",X"0C",X"1C",X"08",X"1C",X"0A",X"1E",X"08",X"1E",X"0A", + X"16",X"06",X"16",X"0C",X"16",X"08",X"16",X"0A",X"18",X"00",X"18",X"12",X"1A",X"00",X"1A",X"12", + X"18",X"02",X"18",X"10",X"1A",X"02",X"1A",X"10",X"18",X"04",X"18",X"0E",X"1A",X"04",X"1A",X"0E", + X"18",X"06",X"18",X"0C",X"1A",X"06",X"1A",X"0C",X"18",X"08",X"18",X"0A",X"1A",X"08",X"1A",X"0A", + X"21",X"40",X"80",X"11",X"41",X"80",X"01",X"7F",X"03",X"36",X"24",X"ED",X"B0",X"21",X"40",X"84", + X"11",X"41",X"84",X"01",X"7F",X"03",X"36",X"00",X"ED",X"B0",X"3E",X"04",X"06",X"20",X"DF",X"3E", + X"4E",X"06",X"20",X"DF",X"C9",X"21",X"21",X"98",X"34",X"7E",X"3C",X"E6",X"03",X"32",X"25",X"98", + X"28",X"10",X"0E",X"06",X"F7",X"EB",X"3A",X"21",X"98",X"6F",X"26",X"00",X"CD",X"66",X"0A",X"AF", + X"18",X"0A",X"0E",X"07",X"F7",X"3E",X"01",X"32",X"AD",X"9A",X"3E",X"08",X"32",X"A8",X"92",X"3E", + X"03",X"32",X"AE",X"92",X"32",X"0B",X"92",X"3A",X"25",X"98",X"A7",X"08",X"CD",X"7F",X"11",X"3A", + X"AE",X"92",X"A7",X"20",X"FA",X"3E",X"78",X"32",X"AE",X"92",X"CD",X"A4",X"28",X"CD",X"B0",X"25", + X"3E",X"02",X"32",X"AC",X"92",X"AF",X"CD",X"D5",X"12",X"AF",X"06",X"30",X"21",X"00",X"92",X"77", + X"2C",X"2C",X"10",X"FB",X"32",X"09",X"90",X"32",X"10",X"90",X"32",X"04",X"90",X"32",X"88",X"92", + X"32",X"2C",X"98",X"32",X"41",X"98",X"32",X"42",X"98",X"32",X"26",X"98",X"32",X"B0",X"99",X"32", + X"24",X"98",X"3C",X"32",X"2D",X"98",X"32",X"6D",X"98",X"32",X"28",X"98",X"32",X"0B",X"90",X"32", + X"08",X"90",X"32",X"0A",X"90",X"CD",X"00",X"2C",X"21",X"30",X"98",X"11",X"B5",X"01",X"06",X"04", + X"72",X"2C",X"73",X"2C",X"10",X"FA",X"3A",X"05",X"68",X"CB",X"4F",X"C0",X"0E",X"0B",X"21",X"B0", + X"83",X"CD",X"B3",X"13",X"C3",X"85",X"01",X"F5",X"08",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD", + X"E5",X"3A",X"04",X"68",X"57",X"3A",X"A0",X"92",X"E6",X"1C",X"4F",X"0F",X"A9",X"E6",X"18",X"4F", + X"3A",X"BE",X"99",X"CB",X"4A",X"20",X"02",X"3E",X"07",X"E6",X"07",X"B1",X"06",X"05",X"21",X"00", + X"A0",X"77",X"2C",X"0F",X"10",X"FB",X"32",X"30",X"68",X"AF",X"32",X"20",X"68",X"CB",X"4A",X"CA", + X"A8",X"02",X"4F",X"21",X"00",X"90",X"79",X"85",X"6F",X"7E",X"A7",X"20",X"03",X"0C",X"18",X"F3", + X"47",X"21",X"96",X"00",X"79",X"CB",X"27",X"85",X"6F",X"5E",X"23",X"56",X"EB",X"C5",X"CD",X"3B", + X"00",X"C1",X"78",X"81",X"4F",X"E6",X"E0",X"28",X"DA",X"21",X"00",X"70",X"11",X"B5",X"99",X"01", + X"03",X"00",X"D9",X"3E",X"71",X"32",X"00",X"71",X"3E",X"01",X"32",X"20",X"68",X"FD",X"E1",X"DD", + X"E1",X"E1",X"D1",X"C1",X"F1",X"08",X"F1",X"FB",X"C9",X"00",X"00",X"00",X"00",X"02",X"24",X"17", + X"0A",X"16",X"0C",X"18",X"ED",X"56",X"AF",X"21",X"E0",X"99",X"06",X"10",X"77",X"23",X"10",X"FC", + X"C3",X"6C",X"33",X"31",X"A0",X"90",X"AF",X"21",X"AC",X"92",X"06",X"04",X"DF",X"21",X"A0",X"9A", + X"06",X"20",X"DF",X"32",X"07",X"A0",X"32",X"15",X"92",X"32",X"B9",X"99",X"3D",X"21",X"CA",X"92", + X"06",X"10",X"DF",X"3E",X"01",X"32",X"20",X"68",X"21",X"C0",X"83",X"06",X"40",X"3E",X"24",X"DF", + X"26",X"80",X"06",X"40",X"DF",X"21",X"00",X"84",X"06",X"40",X"3E",X"03",X"DF",X"CD",X"60",X"01", + X"11",X"20",X"8A",X"3E",X"05",X"06",X"00",X"21",X"B9",X"02",X"0E",X"06",X"ED",X"B0",X"3D",X"20", + X"F6",X"21",X"BF",X"02",X"3E",X"2A",X"06",X"05",X"0E",X"FF",X"ED",X"A0",X"2B",X"12",X"1C",X"ED", + X"A0",X"10",X"F7",X"3E",X"01",X"32",X"01",X"92",X"21",X"05",X"A0",X"36",X"00",X"77",X"CD",X"3C", + X"00",X"CD",X"D6",X"00",X"CD",X"42",X"12",X"EF",X"3E",X"20",X"32",X"1E",X"90",X"3A",X"B5",X"99", + X"32",X"B8",X"99",X"AF",X"32",X"1E",X"90",X"32",X"20",X"90",X"AF",X"32",X"07",X"A0",X"32",X"15", + X"92",X"32",X"12",X"90",X"06",X"80",X"21",X"00",X"92",X"DF",X"3E",X"06",X"32",X"BE",X"99",X"EF", + X"CD",X"3C",X"00",X"CD",X"42",X"12",X"3A",X"B8",X"99",X"A7",X"3E",X"01",X"28",X"02",X"3E",X"02", + X"32",X"01",X"92",X"20",X"18",X"AF",X"32",X"03",X"92",X"3C",X"32",X"02",X"90",X"3A",X"01",X"92", + X"3D",X"28",X"FA",X"CD",X"42",X"12",X"CD",X"60",X"01",X"EF",X"CD",X"3C",X"00",X"AF",X"32",X"0B", + X"92",X"0E",X"13",X"F7",X"0E",X"01",X"F7",X"21",X"52",X"04",X"22",X"80",X"92",X"3A",X"80",X"99", + X"FE",X"FF",X"28",X"24",X"5F",X"0E",X"1B",X"CD",X"3D",X"04",X"3A",X"81",X"99",X"FE",X"FF",X"28", + X"17",X"E6",X"7F",X"5F",X"0E",X"1C",X"CD",X"3D",X"04",X"3A",X"81",X"99",X"CB",X"7F",X"20",X"08", + X"E6",X"7F",X"5F",X"0E",X"1D",X"CD",X"3D",X"04",X"3A",X"01",X"92",X"FE",X"02",X"28",X"F9",X"32", + X"B7",X"9A",X"CD",X"60",X"01",X"CD",X"3C",X"00",X"21",X"05",X"A0",X"36",X"00",X"36",X"01",X"21", + X"20",X"98",X"AF",X"06",X"A0",X"DF",X"32",X"B7",X"9A",X"32",X"B9",X"99",X"3C",X"32",X"AB",X"9A", + X"32",X"12",X"90",X"32",X"F2",X"98",X"CD",X"66",X"04",X"CD",X"7B",X"12",X"0E",X"04",X"F7",X"21", + X"AF",X"92",X"36",X"08",X"7E",X"A7",X"20",X"FC",X"21",X"90",X"92",X"06",X"10",X"DF",X"06",X"30", + X"21",X"B0",X"98",X"DF",X"21",X"B0",X"83",X"0E",X"0B",X"CD",X"B3",X"13",X"3E",X"01",X"32",X"80", + X"98",X"3A",X"80",X"99",X"32",X"3E",X"98",X"32",X"7E",X"98",X"C3",X"22",X"06",X"F7",X"EB",X"7B", + X"C6",X"40",X"5F",X"26",X"00",X"CD",X"66",X"0A",X"EB",X"0E",X"1E",X"CD",X"B3",X"13",X"CD",X"9E", + X"12",X"C9",X"00",X"81",X"19",X"56",X"02",X"81",X"19",X"62",X"04",X"81",X"19",X"6E",X"CD",X"3B", + X"07",X"CD",X"1E",X"08",X"18",X"F8",X"3A",X"00",X"68",X"4F",X"21",X"B3",X"99",X"3A",X"82",X"99", + X"CB",X"46",X"28",X"08",X"CB",X"49",X"20",X"04",X"3C",X"87",X"36",X"00",X"32",X"20",X"98",X"32", + X"60",X"98",X"11",X"F8",X"83",X"21",X"A8",X"04",X"CD",X"99",X"04",X"11",X"E3",X"83",X"21",X"A8", + X"04",X"3A",X"B3",X"99",X"A7",X"20",X"02",X"23",X"23",X"0E",X"07",X"ED",X"B0",X"21",X"AA",X"04", + X"11",X"C3",X"83",X"0E",X"04",X"ED",X"B0",X"C9",X"00",X"00",X"24",X"24",X"24",X"24",X"24",X"24", + X"24",X"E1",X"21",X"AF",X"92",X"36",X"04",X"3A",X"1D",X"90",X"A7",X"28",X"17",X"AF",X"32",X"13", + X"92",X"3C",X"32",X"25",X"90",X"3A",X"A7",X"92",X"A7",X"C2",X"5E",X"04",X"3A",X"1D",X"90",X"A7", + X"20",X"FA",X"18",X"1B",X"7E",X"A7",X"20",X"DF",X"CD",X"3B",X"07",X"3A",X"A7",X"92",X"32",X"43", + X"98",X"4F",X"3A",X"13",X"92",X"B1",X"20",X"0D",X"3A",X"25",X"98",X"A7",X"CA",X"63",X"06",X"CD", + X"85",X"01",X"C3",X"45",X"06",X"21",X"20",X"98",X"7E",X"35",X"A7",X"C2",X"8C",X"05",X"3A",X"B3", + X"99",X"A7",X"28",X"0C",X"21",X"4E",X"82",X"3A",X"40",X"98",X"C6",X"04",X"4F",X"CD",X"B3",X"13", + X"0E",X"02",X"F7",X"CD",X"31",X"13",X"CD",X"31",X"13",X"21",X"18",X"90",X"7E",X"A7",X"20",X"FC", + X"EF",X"CD",X"3C",X"00",X"CD",X"60",X"01",X"0E",X"15",X"F7",X"0E",X"16",X"F7",X"11",X"32",X"81", + X"2A",X"46",X"98",X"CD",X"66",X"0A",X"0E",X"18",X"F7",X"11",X"35",X"81",X"2A",X"44",X"98",X"CD", + X"66",X"0A",X"0E",X"19",X"F7",X"CD",X"85",X"0A",X"EB",X"0E",X"1A",X"CD",X"B3",X"13",X"21",X"AE", + X"92",X"36",X"0E",X"7E",X"A7",X"20",X"FC",X"CD",X"60",X"01",X"CD",X"00",X"30",X"AF",X"32",X"B0", + X"9A",X"21",X"AC",X"9A",X"11",X"B6",X"9A",X"1A",X"46",X"B0",X"28",X"09",X"04",X"05",X"28",X"02", + X"36",X"01",X"76",X"18",X"F2",X"CD",X"60",X"01",X"3A",X"B3",X"99",X"A7",X"CA",X"F1",X"06",X"3A", + X"60",X"98",X"3C",X"CA",X"F1",X"06",X"3A",X"13",X"92",X"3D",X"20",X"15",X"3A",X"B3",X"99",X"A7", + X"CA",X"17",X"06",X"3A",X"60",X"98",X"3C",X"CA",X"25",X"06",X"3A",X"13",X"92",X"3D",X"C2",X"25", + X"06",X"3A",X"A7",X"92",X"A7",X"28",X"06",X"3A",X"87",X"92",X"A7",X"20",X"FA",X"AF",X"32",X"B4", + X"99",X"3C",X"21",X"0E",X"90",X"77",X"7E",X"A7",X"20",X"FC",X"3A",X"A0",X"9A",X"32",X"48",X"98", + X"3A",X"AE",X"92",X"32",X"3F",X"98",X"CD",X"0C",X"11",X"CD",X"00",X"2C",X"3A",X"3F",X"98",X"32", + X"AE",X"92",X"3A",X"48",X"98",X"32",X"A0",X"9A",X"CD",X"7E",X"13",X"3A",X"43",X"98",X"A7",X"28", + X"03",X"CD",X"B0",X"25",X"3A",X"40",X"98",X"4F",X"3A",X"83",X"99",X"A1",X"32",X"07",X"A0",X"32", + X"15",X"92",X"3E",X"3F",X"CD",X"D5",X"12",X"37",X"08",X"CD",X"7F",X"11",X"3A",X"43",X"98",X"A7", + X"28",X"20",X"0E",X"03",X"F7",X"3E",X"80",X"32",X"B4",X"99",X"21",X"0E",X"90",X"3E",X"01",X"77", + X"7E",X"A7",X"20",X"FC",X"C3",X"25",X"06",X"3A",X"43",X"98",X"A7",X"20",X"14",X"CD",X"85",X"01", + X"18",X"0F",X"CD",X"85",X"01",X"3A",X"40",X"98",X"C6",X"04",X"4F",X"21",X"6E",X"82",X"CD",X"B3", + X"13",X"CD",X"3D",X"13",X"3A",X"AE",X"92",X"C6",X"1E",X"FE",X"78",X"38",X"02",X"3E",X"78",X"32", + X"AE",X"92",X"CD",X"31",X"13",X"3E",X"01",X"32",X"15",X"90",X"32",X"25",X"90",X"32",X"42",X"98", + X"0E",X"0B",X"21",X"B0",X"83",X"CD",X"B3",X"13",X"0E",X"0B",X"21",X"AE",X"83",X"CD",X"B3",X"13", + X"C3",X"5E",X"04",X"3A",X"88",X"92",X"5F",X"21",X"AE",X"9A",X"FE",X"28",X"20",X"03",X"21",X"B4", + X"9A",X"36",X"01",X"CD",X"31",X"13",X"0E",X"08",X"F7",X"CD",X"31",X"13",X"6B",X"26",X"00",X"11", + X"10",X"81",X"CD",X"66",X"0A",X"CD",X"31",X"13",X"3A",X"88",X"92",X"FE",X"28",X"28",X"1D",X"0E", + X"09",X"F7",X"CD",X"31",X"13",X"EB",X"3A",X"88",X"92",X"A7",X"28",X"0A",X"6F",X"26",X"00",X"CD", + X"66",X"0A",X"AF",X"12",X"E7",X"AF",X"12",X"3A",X"88",X"92",X"18",X"21",X"06",X"07",X"3A",X"A0", + X"92",X"E6",X"0F",X"20",X"F9",X"0E",X"0B",X"CB",X"40",X"28",X"01",X"0C",X"C5",X"F7",X"C1",X"3A", + X"A0",X"92",X"E6",X"0F",X"28",X"F9",X"10",X"E6",X"0E",X"0D",X"F7",X"3E",X"64",X"21",X"9F",X"92", + X"86",X"77",X"CD",X"3B",X"07",X"CD",X"31",X"13",X"CD",X"31",X"13",X"21",X"B0",X"83",X"0E",X"0B", + X"CD",X"B3",X"13",X"21",X"B3",X"83",X"0E",X"0B",X"CD",X"B3",X"13",X"0E",X"0B",X"F7",X"C3",X"EF", + X"04",X"76",X"F3",X"3A",X"00",X"71",X"FE",X"10",X"20",X"F9",X"21",X"38",X"07",X"11",X"00",X"70", + X"01",X"03",X"00",X"D9",X"3E",X"61",X"32",X"00",X"71",X"76",X"AF",X"CD",X"4F",X"09",X"FB",X"AF", + X"06",X"20",X"21",X"A0",X"9A",X"DF",X"11",X"F9",X"83",X"CD",X"3A",X"0A",X"11",X"E4",X"83",X"CD", + X"3A",X"0A",X"3A",X"B3",X"99",X"3C",X"21",X"E1",X"99",X"86",X"27",X"77",X"D2",X"5A",X"03",X"2B", + X"7E",X"C6",X"01",X"27",X"77",X"C3",X"5A",X"03",X"02",X"02",X"02",X"3A",X"40",X"98",X"A7",X"3E", + X"F9",X"28",X"02",X"3E",X"E4",X"DD",X"6F",X"06",X"10",X"21",X"90",X"92",X"EB",X"21",X"0D",X"08", + X"78",X"D7",X"4E",X"EB",X"7E",X"A7",X"28",X"1D",X"35",X"EB",X"26",X"83",X"DD",X"7D",X"6F",X"79", + X"E6",X"0F",X"CD",X"EB",X"07",X"DD",X"7D",X"3C",X"6F",X"79",X"07",X"07",X"07",X"07",X"E6",X"0F", + X"CD",X"EB",X"07",X"18",X"DE",X"2C",X"10",X"D4",X"DD",X"7D",X"C6",X"04",X"5F",X"21",X"F2",X"83", + X"16",X"83",X"06",X"06",X"1A",X"96",X"C6",X"09",X"FE",X"E5",X"30",X"0F",X"D6",X"0A",X"FE",X"09", + X"38",X"09",X"3C",X"20",X"0C",X"2D",X"1D",X"10",X"EB",X"18",X"06",X"1A",X"77",X"2D",X"1D",X"10", + X"FA",X"DD",X"7D",X"C6",X"04",X"6F",X"7E",X"FE",X"24",X"20",X"01",X"AF",X"E6",X"3F",X"07",X"4F", + X"07",X"07",X"81",X"4F",X"2D",X"7E",X"FE",X"24",X"20",X"01",X"AF",X"81",X"21",X"3E",X"98",X"BE", + X"C0",X"3A",X"81",X"99",X"47",X"E6",X"7F",X"4F",X"7E",X"B9",X"30",X"03",X"79",X"18",X"01",X"80", + X"77",X"32",X"AA",X"9A",X"21",X"20",X"98",X"34",X"CD",X"7E",X"13",X"21",X"EB",X"99",X"7E",X"C6", + X"01",X"27",X"77",X"D0",X"2D",X"7E",X"C6",X"01",X"27",X"77",X"C9",X"A7",X"C8",X"86",X"FE",X"24", + X"38",X"02",X"D6",X"24",X"FE",X"0A",X"30",X"02",X"77",X"C9",X"D6",X"0A",X"77",X"2C",X"7E",X"FE", + X"24",X"20",X"01",X"AF",X"FE",X"09",X"28",X"03",X"3C",X"77",X"C9",X"AF",X"18",X"EE",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"50",X"08",X"08",X"08",X"05",X"08",X"15",X"00",X"3A",X"08", + X"90",X"47",X"3A",X"A7",X"92",X"B0",X"20",X"06",X"32",X"A0",X"9A",X"C3",X"B1",X"04",X"3A",X"13", + X"92",X"A7",X"C8",X"AF",X"32",X"42",X"98",X"C3",X"B1",X"04",X"C9",X"3E",X"01",X"32",X"D6",X"92", + X"21",X"40",X"8B",X"11",X"C0",X"8B",X"01",X"40",X"00",X"ED",X"B0",X"21",X"40",X"93",X"11",X"C0", + X"93",X"0E",X"40",X"ED",X"B0",X"21",X"40",X"9B",X"11",X"C0",X"9B",X"0E",X"40",X"ED",X"B0",X"AF", + X"32",X"D6",X"92",X"3A",X"D7",X"92",X"3D",X"28",X"FA",X"C9",X"3A",X"AE",X"92",X"47",X"FE",X"3C", + X"30",X"06",X"3A",X"C5",X"99",X"32",X"C4",X"99",X"3A",X"A7",X"92",X"4F",X"3A",X"C0",X"99",X"21", + X"1C",X"09",X"CD",X"D1",X"08",X"32",X"C8",X"92",X"3A",X"AA",X"92",X"A7",X"28",X"0D",X"21",X"C4", + X"92",X"3E",X"02",X"06",X"03",X"DF",X"AF",X"32",X"A0",X"9A",X"C9",X"3A",X"C1",X"99",X"21",X"3C", + X"09",X"CD",X"D1",X"08",X"32",X"C4",X"92",X"3A",X"C2",X"99",X"21",X"E0",X"08",X"CD",X"C0",X"08", + X"32",X"C5",X"92",X"3A",X"C3",X"99",X"21",X"FE",X"08",X"CD",X"C0",X"08",X"32",X"C6",X"92",X"C9", + X"5F",X"CB",X"27",X"83",X"D7",X"78",X"FE",X"28",X"30",X"01",X"23",X"A7",X"20",X"01",X"23",X"7E", + X"C9",X"CB",X"27",X"CF",X"EB",X"61",X"3E",X"0A",X"CD",X"61",X"10",X"EB",X"7A",X"D7",X"7E",X"C9", + X"09",X"07",X"05",X"08",X"06",X"04",X"07",X"05",X"04",X"06",X"04",X"03",X"05",X"03",X"03",X"04", + X"03",X"03",X"04",X"02",X"02",X"03",X"03",X"02",X"03",X"02",X"02",X"02",X"02",X"02",X"06",X"05", + X"04",X"05",X"04",X"03",X"05",X"03",X"03",X"04",X"03",X"02",X"04",X"02",X"02",X"03",X"03",X"02", + X"03",X"02",X"01",X"02",X"02",X"01",X"02",X"01",X"01",X"01",X"01",X"01",X"03",X"03",X"01",X"01", + X"03",X"03",X"03",X"01",X"07",X"03",X"03",X"01",X"07",X"03",X"03",X"03",X"07",X"07",X"03",X"03", + X"0F",X"07",X"03",X"03",X"0F",X"07",X"07",X"03",X"0F",X"07",X"07",X"07",X"06",X"0A",X"0F",X"0F", + X"04",X"08",X"0D",X"0D",X"04",X"06",X"0A",X"0A",X"3A",X"A0",X"92",X"07",X"07",X"07",X"07",X"4F", + X"3A",X"01",X"92",X"FE",X"03",X"C0",X"3A",X"40",X"98",X"47",X"2F",X"A1",X"21",X"81",X"09",X"11", + X"D9",X"83",X"CD",X"72",X"09",X"3A",X"B3",X"99",X"A7",X"C8",X"78",X"A1",X"21",X"84",X"09",X"11", + X"C4",X"83",X"C5",X"E6",X"01",X"28",X"03",X"21",X"87",X"09",X"01",X"03",X"00",X"ED",X"B0",X"C1", + X"C9",X"19",X"1E",X"01",X"19",X"1E",X"02",X"24",X"24",X"24",X"3A",X"B5",X"99",X"FE",X"BB",X"CA", + X"6C",X"33",X"3A",X"01",X"92",X"FE",X"03",X"20",X"19",X"21",X"E9",X"99",X"7E",X"C6",X"01",X"27", + X"FE",X"60",X"20",X"01",X"AF",X"06",X"04",X"3F",X"77",X"2D",X"7E",X"CE",X"00",X"27",X"10",X"F8", + X"18",X"42",X"3A",X"B8",X"99",X"FE",X"A0",X"11",X"3C",X"80",X"28",X"30",X"3A",X"B5",X"99",X"21", + X"E2",X"09",X"01",X"06",X"00",X"ED",X"B8",X"1D",X"4F",X"07",X"07",X"07",X"07",X"E6",X"0F",X"28", + X"02",X"12",X"1D",X"79",X"E6",X"0F",X"12",X"1D",X"3E",X"24",X"12",X"18",X"17",X"1D",X"12",X"0D", + X"0E",X"1B",X"0C",X"22",X"0A",X"15",X"19",X"24",X"0E",X"0E",X"1B",X"0F",X"21",X"EB",X"09",X"01", + X"09",X"00",X"ED",X"B8",X"3A",X"01",X"92",X"A7",X"C8",X"3D",X"20",X"16",X"3A",X"B5",X"99",X"A7", + X"28",X"10",X"3E",X"02",X"32",X"01",X"92",X"AF",X"21",X"A0",X"9A",X"06",X"08",X"DF",X"2C",X"06", + X"0F",X"DF",X"3A",X"B5",X"99",X"4F",X"3A",X"B8",X"99",X"47",X"91",X"C8",X"38",X"0F",X"27",X"3D", + X"32",X"B3",X"99",X"79",X"32",X"B8",X"99",X"3E",X"03",X"32",X"01",X"92",X"C9",X"79",X"32",X"B8", + X"99",X"FE",X"A0",X"C8",X"90",X"27",X"32",X"79",X"9A",X"C9",X"21",X"03",X"91",X"06",X"05",X"1A", + X"1C",X"FE",X"24",X"20",X"01",X"AF",X"ED",X"67",X"CB",X"40",X"20",X"01",X"2D",X"10",X"F0",X"AF", + X"ED",X"67",X"2D",X"36",X"00",X"2E",X"03",X"11",X"E5",X"99",X"06",X"04",X"A7",X"1A",X"8E",X"27", + X"12",X"1D",X"2D",X"10",X"F8",X"C9",X"06",X"01",X"25",X"24",X"20",X"05",X"7D",X"FE",X"0A",X"38", + X"0A",X"3E",X"0A",X"CD",X"61",X"10",X"F5",X"04",X"18",X"EE",X"F1",X"CD",X"81",X"0A",X"10",X"FA", + X"C9",X"12",X"C3",X"20",X"00",X"2A",X"44",X"98",X"ED",X"5B",X"46",X"98",X"7A",X"B3",X"20",X"05", + X"11",X"00",X"00",X"18",X"51",X"CB",X"7A",X"20",X"0A",X"CB",X"7C",X"20",X"06",X"29",X"EB",X"29", + X"EB",X"18",X"F2",X"7A",X"CD",X"61",X"10",X"E5",X"67",X"2E",X"00",X"7A",X"CD",X"61",X"10",X"E3", + X"11",X"B0",X"99",X"06",X"04",X"7C",X"26",X"00",X"EB",X"ED",X"6F",X"CB",X"40",X"28",X"01",X"2C", + X"EB",X"CD",X"19",X"0B",X"08",X"E3",X"CD",X"19",X"0B",X"E3",X"D7",X"08",X"84",X"26",X"00",X"10", + X"E7",X"D1",X"FE",X"05",X"38",X"14",X"ED",X"5B",X"B0",X"99",X"7A",X"C6",X"01",X"27",X"57",X"30", + X"05",X"7B",X"C6",X"01",X"27",X"5F",X"ED",X"53",X"B0",X"99",X"06",X"04",X"0E",X"00",X"21",X"B0", + X"99",X"11",X"38",X"81",X"05",X"20",X"04",X"3E",X"2A",X"12",X"E7",X"04",X"AF",X"ED",X"6F",X"CB", + X"40",X"28",X"01",X"2C",X"A7",X"20",X"04",X"CB",X"41",X"28",X"04",X"CB",X"C1",X"12",X"E7",X"78", + X"FE",X"03",X"20",X"02",X"CB",X"C1",X"10",X"DC",X"C9",X"3E",X"0A",X"CD",X"4E",X"10",X"7C",X"26", + X"00",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C4", + X"E5",X"ED",X"5F",X"67",X"3A",X"A0",X"92",X"84",X"6F",X"26",X"01",X"7E",X"67",X"ED",X"5F",X"84", + X"E1",X"C9",X"C5",X"D5",X"7B",X"95",X"06",X"00",X"30",X"04",X"CB",X"C0",X"ED",X"44",X"4F",X"7A", + X"94",X"30",X"0A",X"57",X"78",X"EE",X"01",X"F6",X"02",X"47",X"7A",X"ED",X"44",X"B9",X"F5",X"17", + X"A8",X"1F",X"3F",X"CB",X"10",X"F1",X"30",X"03",X"51",X"4F",X"7A",X"61",X"2E",X"00",X"CD",X"61", + X"10",X"7C",X"A8",X"E6",X"01",X"28",X"03",X"7D",X"2F",X"6F",X"60",X"D1",X"C1",X"C9",X"D5",X"EB", + X"21",X"00",X"00",X"CB",X"3F",X"30",X"01",X"19",X"CB",X"23",X"CB",X"12",X"A7",X"20",X"F4",X"D1", + X"C9",X"C5",X"4F",X"AF",X"06",X"11",X"8F",X"38",X"0B",X"B9",X"38",X"01",X"91",X"3F",X"ED",X"6A", + X"10",X"F4",X"C1",X"C9",X"91",X"37",X"C3",X"6E",X"10",X"7D",X"E6",X"80",X"3C",X"08",X"CB",X"BD", + X"C3",X"8A",X"10",X"7D",X"0F",X"0F",X"E6",X"80",X"3C",X"08",X"D5",X"11",X"14",X"00",X"06",X"0C", + X"DD",X"21",X"00",X"91",X"DD",X"CB",X"13",X"46",X"28",X"06",X"DD",X"19",X"10",X"F6",X"D1",X"C9", + X"D1",X"DD",X"73",X"08",X"DD",X"72",X"09",X"DD",X"36",X"0D",X"01",X"DD",X"36",X"04",X"00",X"DD", + X"36",X"05",X"01",X"4D",X"DD",X"71",X"10",X"08",X"57",X"36",X"09",X"DD",X"7D",X"2C",X"77",X"3A", + X"15",X"92",X"5F",X"69",X"26",X"93",X"4E",X"2C",X"46",X"26",X"9B",X"7E",X"0F",X"CB",X"18",X"CB", + X"43",X"20",X"09",X"08",X"78",X"C6",X"50",X"ED",X"44",X"47",X"08",X"3F",X"DD",X"70",X"01",X"1F", + X"E6",X"80",X"DD",X"77",X"00",X"79",X"CB",X"43",X"28",X"03",X"C6",X"0D",X"2F",X"CB",X"3F",X"DD", + X"77",X"03",X"1F",X"E6",X"80",X"DD",X"77",X"02",X"DD",X"72",X"13",X"DD",X"36",X"0E",X"1E",X"3A", + X"0B",X"92",X"A7",X"28",X"03",X"3A",X"C8",X"92",X"DD",X"77",X"0F",X"C9",X"3E",X"1F",X"32",X"00", + X"90",X"32",X"E0",X"98",X"21",X"20",X"98",X"11",X"60",X"98",X"06",X"40",X"4E",X"1A",X"77",X"79", + X"12",X"2C",X"1C",X"10",X"F7",X"21",X"00",X"88",X"11",X"B0",X"98",X"06",X"30",X"7E",X"4F",X"26", + X"8B",X"7E",X"E6",X"7F",X"0D",X"20",X"0B",X"E6",X"78",X"4F",X"2C",X"7E",X"2D",X"E6",X"07",X"B1", + X"F6",X"80",X"EB",X"4E",X"77",X"EB",X"CB",X"79",X"28",X"10",X"79",X"E6",X"78",X"C6",X"06",X"77", + X"2C",X"79",X"E6",X"07",X"77",X"2D",X"3E",X"01",X"18",X"07",X"71",X"26",X"93",X"36",X"00",X"3E", + X"80",X"26",X"88",X"77",X"13",X"2C",X"2C",X"10",X"C4",X"21",X"00",X"90",X"11",X"E0",X"98",X"06", + X"20",X"4E",X"1A",X"77",X"79",X"12",X"2C",X"1C",X"10",X"F7",X"AF",X"32",X"00",X"90",X"C9",X"21", + X"02",X"80",X"06",X"12",X"7E",X"FE",X"4A",X"30",X"02",X"36",X"24",X"2C",X"10",X"F6",X"2E",X"22", + X"06",X"12",X"7E",X"FE",X"4A",X"30",X"02",X"36",X"24",X"2C",X"10",X"F6",X"3A",X"21",X"98",X"06", + X"00",X"21",X"01",X"80",X"FE",X"32",X"38",X"07",X"D6",X"32",X"04",X"2C",X"2C",X"18",X"F5",X"EB", + X"6F",X"26",X"00",X"3E",X"0A",X"CD",X"61",X"10",X"67",X"E5",X"EB",X"FE",X"05",X"38",X"02",X"D6", + X"04",X"4F",X"7B",X"CB",X"47",X"28",X"02",X"3E",X"02",X"81",X"D7",X"04",X"10",X"20",X"C1",X"79", + X"CD",X"F5",X"11",X"78",X"FE",X"05",X"38",X"08",X"16",X"38",X"CD",X"13",X"12",X"78",X"D6",X"05", + X"47",X"04",X"10",X"03",X"C3",X"7E",X"13",X"16",X"36",X"CD",X"13",X"12",X"18",X"F4",X"3E",X"04", + X"CD",X"FB",X"11",X"18",X"D7",X"A7",X"C8",X"FE",X"04",X"28",X"07",X"07",X"07",X"C6",X"36",X"57", + X"18",X"0A",X"16",X"42",X"CD",X"13",X"12",X"CD",X"28",X"12",X"16",X"3A",X"CD",X"13",X"12",X"CD", + X"28",X"12",X"C9",X"08",X"38",X"11",X"08",X"3A",X"A0",X"92",X"C6",X"08",X"5F",X"3A",X"A0",X"92", + X"93",X"20",X"FA",X"08",X"32",X"B5",X"9A",X"08",X"72",X"14",X"CB",X"ED",X"72",X"14",X"CB",X"D4", + X"7A",X"E6",X"0C",X"FE",X"08",X"3E",X"01",X"28",X"01",X"3C",X"77",X"CB",X"AD",X"77",X"CB",X"94", + X"2D",X"C9",X"21",X"5B",X"12",X"11",X"00",X"90",X"01",X"20",X"00",X"C5",X"E5",X"ED",X"B0",X"E1", + X"C1",X"11",X"E0",X"98",X"ED",X"B0",X"AF",X"32",X"00",X"90",X"C9",X"1F",X"01",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"21",X"64",X"8B",X"11",X"30", + X"09",X"0E",X"00",X"06",X"0A",X"73",X"26",X"93",X"36",X"00",X"26",X"9B",X"71",X"26",X"8B",X"2C", + X"72",X"2C",X"78",X"FE",X"09",X"20",X"04",X"0E",X"01",X"16",X"0B",X"10",X"E8",X"C9",X"26",X"8B", + X"ED",X"5B",X"80",X"92",X"1A",X"6F",X"13",X"1A",X"4F",X"E6",X"78",X"C6",X"06",X"77",X"2C",X"79", + X"E6",X"07",X"CB",X"79",X"28",X"02",X"F6",X"08",X"77",X"13",X"2D",X"26",X"88",X"36",X"01",X"26", + X"93",X"1A",X"77",X"13",X"2C",X"1A",X"CB",X"27",X"77",X"3E",X"00",X"17",X"26",X"9B",X"77",X"13", + X"ED",X"53",X"80",X"92",X"C9",X"DD",X"6F",X"3A",X"15",X"92",X"4F",X"21",X"00",X"99",X"11",X"21", + X"13",X"06",X"10",X"36",X"00",X"2C",X"1A",X"13",X"77",X"2C",X"10",X"F7",X"21",X"00",X"98",X"11", + X"21",X"13",X"06",X"0A",X"1A",X"13",X"CB",X"41",X"28",X"03",X"C6",X"0D",X"2F",X"77",X"2C",X"2C", + X"10",X"F2",X"06",X"06",X"1A",X"DD",X"85",X"13",X"CB",X"41",X"20",X"03",X"C6",X"4F",X"2F",X"CB", + X"27",X"77",X"2C",X"3E",X"00",X"17",X"77",X"2C",X"10",X"EA",X"3A",X"15",X"92",X"32",X"0F",X"92", + X"C9",X"31",X"41",X"51",X"61",X"71",X"81",X"91",X"A1",X"B1",X"C1",X"92",X"8A",X"82",X"7C",X"76", + X"70",X"E5",X"21",X"AF",X"92",X"36",X"03",X"7E",X"A7",X"20",X"FC",X"E1",X"C9",X"3E",X"01",X"32", + X"14",X"90",X"3A",X"70",X"82",X"FE",X"24",X"20",X"03",X"0E",X"03",X"F7",X"3A",X"87",X"92",X"A7", + X"20",X"FA",X"CD",X"7E",X"13",X"21",X"06",X"09",X"22",X"62",X"8B",X"21",X"62",X"93",X"3A",X"15", + X"92",X"E6",X"01",X"3E",X"29",X"0E",X"01",X"28",X"03",X"C6",X"0E",X"0D",X"36",X"7A",X"2C",X"77", + X"26",X"9B",X"71",X"2D",X"AF",X"77",X"32",X"13",X"92",X"3C",X"32",X"B9",X"99",X"C9",X"3A",X"20", + X"98",X"2F",X"C6",X"09",X"5F",X"16",X"49",X"21",X"1D",X"80",X"CD",X"98",X"13",X"2D",X"CD",X"98", + X"13",X"CB",X"ED",X"2C",X"CD",X"98",X"13",X"2D",X"E5",X"14",X"4A",X"06",X"08",X"78",X"BB",X"20", + X"02",X"0E",X"24",X"7E",X"FE",X"36",X"38",X"04",X"FE",X"4A",X"38",X"01",X"71",X"2D",X"2D",X"10", + X"EC",X"E1",X"C9",X"A7",X"08",X"D5",X"EB",X"79",X"21",X"EF",X"13",X"CF",X"7E",X"23",X"66",X"6F", + X"08",X"30",X"06",X"2B",X"2B",X"5E",X"23",X"56",X"23",X"4E",X"23",X"EB",X"1A",X"FE",X"2F",X"28", + X"1E",X"D6",X"30",X"30",X"04",X"3E",X"24",X"18",X"06",X"FE",X"11",X"38",X"02",X"D6",X"07",X"77", + X"CB",X"D4",X"71",X"CB",X"94",X"13",X"7D",X"D6",X"20",X"6F",X"30",X"E0",X"25",X"18",X"DD",X"D1", + X"C9",X"2F",X"14",X"44",X"14",X"51",X"14",X"5C",X"14",X"66",X"14",X"72",X"14",X"7C",X"14",X"91", + X"14",X"A3",X"14",X"AE",X"14",X"C2",X"14",X"E1",X"14",X"EE",X"14",X"09",X"15",X"13",X"15",X"22", + X"15",X"2F",X"15",X"3C",X"15",X"40",X"15",X"59",X"15",X"5D",X"15",X"6A",X"15",X"81",X"15",X"8F", + X"15",X"A8",X"15",X"BF",X"15",X"C5",X"15",X"D9",X"15",X"ED",X"15",X"FF",X"15",X"EB",X"82",X"00", + X"50",X"55",X"53",X"48",X"20",X"53",X"54",X"41",X"52",X"54",X"20",X"42",X"55",X"54",X"54",X"4F", + X"4E",X"2F",X"70",X"82",X"00",X"47",X"41",X"4D",X"45",X"20",X"4F",X"56",X"45",X"52",X"2F",X"70", + X"82",X"00",X"52",X"45",X"41",X"44",X"59",X"20",X"21",X"2F",X"50",X"82",X"00",X"50",X"4C",X"41", + X"59",X"45",X"52",X"20",X"31",X"2F",X"00",X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"32",X"2F", + X"70",X"82",X"00",X"53",X"54",X"41",X"47",X"45",X"20",X"2F",X"10",X"83",X"00",X"43",X"48",X"41", + X"4C",X"4C",X"45",X"4E",X"47",X"49",X"4E",X"47",X"20",X"53",X"54",X"41",X"47",X"45",X"2F",X"10", + X"83",X"00",X"4E",X"55",X"4D",X"42",X"45",X"52",X"20",X"4F",X"46",X"20",X"48",X"49",X"54",X"53", + X"2F",X"B3",X"82",X"00",X"42",X"4F",X"4E",X"55",X"53",X"20",X"20",X"2F",X"F1",X"82",X"04",X"46", + X"49",X"47",X"48",X"54",X"45",X"52",X"20",X"43",X"41",X"50",X"54",X"55",X"52",X"45",X"44",X"2F", + X"AD",X"83",X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"2F",X"6D", + X"82",X"04",X"50",X"45",X"52",X"46",X"45",X"43",X"54",X"20",X"63",X"2F",X"73",X"83",X"05",X"53", + X"50",X"45",X"43",X"49",X"41",X"4C",X"20",X"42",X"4F",X"4E",X"55",X"53",X"20",X"31",X"30",X"30", + X"30",X"30",X"20",X"50",X"54",X"53",X"2F",X"42",X"82",X"00",X"47",X"41",X"4C",X"41",X"47",X"41", + X"2F",X"A5",X"82",X"00",X"5D",X"5D",X"20",X"53",X"43",X"4F",X"52",X"45",X"20",X"5D",X"5D",X"2F", + X"28",X"82",X"00",X"35",X"30",X"20",X"20",X"20",X"20",X"31",X"30",X"30",X"2F",X"2A",X"82",X"00", + X"38",X"30",X"20",X"20",X"20",X"20",X"31",X"36",X"30",X"2F",X"2B",X"82",X"00",X"2F",X"3B",X"83", + X"03",X"65",X"20",X"31",X"39",X"38",X"31",X"20",X"4D",X"49",X"44",X"57",X"41",X"59",X"20",X"4D", + X"46",X"47",X"61",X"43",X"4F",X"61",X"2F",X"5E",X"82",X"04",X"2F",X"8F",X"82",X"04",X"5D",X"52", + X"45",X"53",X"55",X"4C",X"54",X"53",X"5D",X"2F",X"32",X"83",X"05",X"53",X"48",X"4F",X"54",X"53", + X"20",X"46",X"49",X"52",X"45",X"44",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"2F",X"05",X"20",X"20",X"4D",X"49",X"53",X"53",X"49",X"4C",X"45",X"53",X"2F",X"35",X"83",X"05", + X"4E",X"55",X"4D",X"42",X"45",X"52",X"20",X"4F",X"46",X"20",X"48",X"49",X"54",X"53",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"2F",X"38",X"83",X"03",X"48",X"49",X"54",X"5D",X"4D",X"49",X"53", + X"53",X"20",X"52",X"41",X"54",X"49",X"4F",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"2F",X"03", + X"24",X"60",X"2F",X"2F",X"83",X"05",X"31",X"53",X"54",X"20",X"42",X"4F",X"4E",X"55",X"53",X"20", + X"46",X"4F",X"52",X"20",X"20",X"20",X"2F",X"32",X"83",X"05",X"32",X"4E",X"44",X"20",X"42",X"4F", + X"4E",X"55",X"53",X"20",X"46",X"4F",X"52",X"20",X"20",X"20",X"2F",X"35",X"83",X"05",X"41",X"4E", + X"44",X"20",X"46",X"4F",X"52",X"20",X"45",X"56",X"45",X"52",X"59",X"20",X"20",X"20",X"2F",X"05", + X"30",X"30",X"30",X"30",X"20",X"50",X"54",X"53",X"2F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"ED",X"5B",X"82",X"92",X"1A",X"07",X"07",X"07",X"E6",X"07",X"21",X"13",X"17",X"CF",X"7E",X"23", + X"66",X"6F",X"E9",X"66",X"17",X"66",X"17",X"1F",X"17",X"66",X"17",X"34",X"17",X"2D",X"17",X"3A", + X"A0",X"92",X"E6",X"0F",X"C0",X"21",X"07",X"92",X"35",X"C0",X"C3",X"66",X"17",X"CD",X"15",X"1F", + X"ED",X"5B",X"82",X"92",X"1A",X"21",X"27",X"98",X"5E",X"CB",X"47",X"20",X"04",X"E6",X"0A",X"18", + X"14",X"3A",X"09",X"92",X"6F",X"26",X"93",X"3A",X"62",X"93",X"96",X"3E",X"0A",X"28",X"06",X"3E", + X"08",X"38",X"02",X"3E",X"02",X"CD",X"98",X"1F",X"3A",X"A0",X"92",X"E6",X"03",X"C0",X"21",X"07", + X"92",X"35",X"C0",X"CD",X"15",X"1F",X"ED",X"5B",X"82",X"92",X"1A",X"E6",X"C0",X"FE",X"80",X"20", + X"01",X"13",X"13",X"1A",X"ED",X"53",X"82",X"92",X"07",X"07",X"07",X"E6",X"07",X"21",X"86",X"17", + X"CF",X"7E",X"23",X"66",X"6F",X"E9",X"94",X"17",X"94",X"17",X"A1",X"17",X"A8",X"17",X"AE",X"17", + X"AE",X"17",X"9C",X"17",X"1A",X"07",X"E6",X"7E",X"32",X"09",X"92",X"C9",X"AF",X"32",X"03",X"90", + X"C9",X"1A",X"E6",X"1F",X"32",X"07",X"92",X"C9",X"1A",X"E6",X"1F",X"4F",X"F7",X"C9",X"13",X"1A", + X"18",X"F2",X"3A",X"01",X"92",X"3D",X"C0",X"3A",X"03",X"92",X"21",X"C3",X"17",X"CF",X"5E",X"23", + X"56",X"EB",X"E9",X"40",X"19",X"48",X"19",X"84",X"19",X"D9",X"18",X"D1",X"18",X"AC",X"18",X"40", + X"19",X"F5",X"17",X"52",X"18",X"D1",X"18",X"08",X"18",X"D1",X"18",X"40",X"18",X"40",X"19",X"E1", + X"17",X"3A",X"AF",X"92",X"A7",X"28",X"05",X"3D",X"CA",X"A7",X"19",X"C9",X"CD",X"14",X"32",X"3E", + X"0A",X"32",X"AF",X"92",X"C9",X"3A",X"A0",X"92",X"E6",X"1F",X"FE",X"1F",X"C0",X"3E",X"01",X"32", + X"05",X"90",X"0E",X"02",X"F7",X"C3",X"A7",X"19",X"CD",X"4C",X"13",X"21",X"1F",X"18",X"22",X"82", + X"92",X"3E",X"01",X"32",X"03",X"90",X"32",X"15",X"90",X"32",X"25",X"90",X"C3",X"A7",X"19",X"08", + X"18",X"8A",X"08",X"88",X"06",X"81",X"28",X"81",X"05",X"54",X"1A",X"88",X"12",X"81",X"0F",X"A2", + X"16",X"AA",X"14",X"88",X"18",X"88",X"10",X"43",X"82",X"10",X"88",X"06",X"A2",X"20",X"56",X"C0", + X"EF",X"CD",X"42",X"12",X"AF",X"32",X"10",X"90",X"32",X"0B",X"92",X"3C",X"32",X"02",X"90",X"C3", + X"A7",X"19",X"AF",X"32",X"2B",X"98",X"3C",X"32",X"B7",X"9A",X"32",X"21",X"98",X"32",X"03",X"90", + X"32",X"15",X"90",X"32",X"25",X"98",X"21",X"87",X"18",X"22",X"82",X"92",X"CD",X"C5",X"01",X"CD", + X"4C",X"13",X"3E",X"01",X"32",X"0B",X"92",X"32",X"42",X"98",X"32",X"2C",X"98",X"3C",X"32",X"C4", + X"99",X"32",X"C5",X"99",X"C3",X"A7",X"19",X"02",X"8A",X"04",X"82",X"07",X"AA",X"28",X"88",X"10", + X"AA",X"38",X"82",X"12",X"AA",X"20",X"88",X"14",X"AA",X"20",X"82",X"06",X"A8",X"0E",X"A2",X"17", + X"88",X"12",X"A2",X"14",X"18",X"88",X"1B",X"81",X"2A",X"5F",X"4C",X"C0",X"3A",X"AE",X"92",X"A7", + X"28",X"09",X"3D",X"CA",X"A7",X"19",X"FE",X"05",X"28",X"0C",X"C9",X"3E",X"34",X"32",X"34",X"92", + X"3E",X"09",X"32",X"AE",X"92",X"C9",X"AF",X"32",X"62",X"93",X"0E",X"13",X"F7",X"0E",X"14",X"F7", + X"C9",X"3A",X"03",X"90",X"A7",X"CA",X"A7",X"19",X"C9",X"06",X"07",X"CD",X"9E",X"12",X"10",X"FB", + X"AF",X"32",X"20",X"98",X"32",X"05",X"90",X"CD",X"4C",X"13",X"21",X"0D",X"FF",X"22",X"C5",X"92", + X"22",X"C4",X"92",X"22",X"C1",X"92",X"22",X"C0",X"92",X"21",X"28",X"19",X"22",X"82",X"92",X"AF", + X"06",X"10",X"21",X"CA",X"92",X"DF",X"32",X"27",X"98",X"32",X"0B",X"92",X"3C",X"32",X"2B",X"98", + X"32",X"10",X"90",X"32",X"0B",X"90",X"32",X"03",X"90",X"3A",X"03",X"68",X"0F",X"E6",X"01",X"32", + X"B7",X"9A",X"CD",X"7B",X"12",X"C3",X"A7",X"19",X"08",X"1B",X"81",X"3D",X"81",X"0A",X"42",X"19", + X"81",X"28",X"81",X"08",X"18",X"81",X"2E",X"81",X"03",X"1A",X"81",X"11",X"81",X"05",X"42",X"C0", + X"CD",X"60",X"01",X"CD",X"3C",X"00",X"18",X"5F",X"21",X"5C",X"19",X"22",X"80",X"92",X"AF",X"32", + X"05",X"92",X"32",X"A8",X"92",X"3E",X"02",X"32",X"AE",X"92",X"18",X"4B",X"08",X"1B",X"44",X"3A", + X"0A",X"12",X"44",X"42",X"0C",X"08",X"7C",X"50",X"34",X"08",X"34",X"5C",X"30",X"08",X"64",X"5C", + X"32",X"08",X"94",X"5C",X"4A",X"12",X"A4",X"64",X"36",X"08",X"C4",X"5C",X"58",X"12",X"B4",X"64", + X"52",X"12",X"D4",X"64",X"3A",X"AE",X"92",X"A7",X"C0",X"3E",X"02",X"32",X"AE",X"92",X"3A",X"05", + X"92",X"FE",X"05",X"28",X"12",X"3C",X"32",X"05",X"92",X"C6",X"0D",X"4F",X"F7",X"3A",X"05",X"92", + X"FE",X"03",X"D8",X"CD",X"9E",X"12",X"C9",X"21",X"03",X"92",X"34",X"7E",X"FE",X"0F",X"C0",X"36", + X"00",X"C9",X"3A",X"8E",X"92",X"A7",X"20",X"1A",X"21",X"AD",X"92",X"B6",X"28",X"28",X"FE",X"04", + X"20",X"05",X"3D",X"77",X"32",X"A9",X"9A",X"3A",X"29",X"98",X"C6",X"0D",X"6F",X"26",X"91",X"36", + X"04",X"C9",X"0E",X"0A",X"F7",X"3E",X"06",X"32",X"AD",X"92",X"3C",X"32",X"63",X"8B",X"AF",X"32", + X"8B",X"92",X"32",X"8E",X"92",X"C9",X"3A",X"D1",X"82",X"FE",X"24",X"28",X"29",X"21",X"62",X"93", + X"3A",X"28",X"98",X"E6",X"07",X"5F",X"54",X"7E",X"12",X"36",X"00",X"2C",X"1C",X"7E",X"12",X"26", + X"9B",X"54",X"ED",X"A8",X"ED",X"A0",X"26",X"8B",X"6B",X"36",X"07",X"2D",X"36",X"07",X"0E",X"0B", + X"21",X"B1",X"83",X"CD",X"B3",X"13",X"3A",X"28",X"98",X"6F",X"E6",X"07",X"5F",X"26",X"88",X"3A", + X"15",X"92",X"4F",X"7E",X"FE",X"09",X"20",X"1D",X"26",X"93",X"54",X"7E",X"12",X"2C",X"1C",X"3E", + X"10",X"CB",X"41",X"28",X"02",X"ED",X"44",X"47",X"86",X"12",X"1F",X"A8",X"07",X"E6",X"01",X"26", + X"9B",X"54",X"AE",X"12",X"C9",X"21",X"8B",X"92",X"7E",X"A7",X"20",X"05",X"16",X"8B",X"3E",X"06", + X"12",X"34",X"FE",X"24",X"28",X"1A",X"06",X"01",X"CB",X"41",X"20",X"02",X"05",X"05",X"6B",X"2C", + X"26",X"93",X"78",X"86",X"77",X"1F",X"A8",X"07",X"D0",X"26",X"9B",X"7E",X"EE",X"01",X"77",X"C9", + X"AF",X"32",X"11",X"90",X"32",X"A9",X"9A",X"16",X"88",X"3C",X"12",X"32",X"28",X"98",X"32",X"B9", + X"99",X"3C",X"32",X"13",X"92",X"C9",X"3A",X"CA",X"99",X"4F",X"3A",X"A7",X"92",X"B9",X"D0",X"3A", + X"41",X"98",X"A7",X"20",X"46",X"21",X"07",X"88",X"01",X"FF",X"14",X"3E",X"01",X"2C",X"ED",X"A1", + X"28",X"0F",X"10",X"F9",X"21",X"3F",X"88",X"06",X"10",X"2C",X"ED",X"A1",X"28",X"03",X"10",X"F9", + X"C9",X"3E",X"C0",X"32",X"41",X"98",X"2D",X"5D",X"16",X"8B",X"1C",X"1A",X"1D",X"4F",X"3A",X"21", + X"98",X"CB",X"3F",X"CB",X"3F",X"6F",X"26",X"00",X"3E",X"03",X"CD",X"61",X"10",X"C6",X"04",X"21", + X"2D",X"98",X"73",X"2C",X"71",X"2C",X"77",X"32",X"B2",X"9A",X"C9",X"3C",X"28",X"1C",X"32",X"41", + X"98",X"08",X"21",X"2D",X"98",X"5E",X"16",X"88",X"1A",X"3D",X"C2",X"5A",X"1B",X"16",X"8B",X"2C", + X"08",X"CB",X"67",X"28",X"01",X"2C",X"7E",X"1C",X"12",X"C9",X"3A",X"15",X"90",X"A7",X"20",X"06", + X"3E",X"E0",X"32",X"41",X"98",X"C9",X"3A",X"2D",X"98",X"6F",X"26",X"88",X"7E",X"3D",X"20",X"4A", + X"26",X"92",X"7E",X"CB",X"7F",X"20",X"43",X"3A",X"2F",X"98",X"D6",X"04",X"21",X"5F",X"1B",X"CF", + X"11",X"B0",X"99",X"3E",X"03",X"12",X"1C",X"ED",X"A0",X"ED",X"A0",X"3A",X"2F",X"98",X"D6",X"04", + X"E6",X"0F",X"4F",X"21",X"65",X"1B",X"CF",X"5E",X"23",X"56",X"26",X"8B",X"3A",X"2D",X"98",X"6F", + X"79",X"07",X"07",X"07",X"C6",X"56",X"4E",X"77",X"79",X"E6",X"F8",X"4F",X"3A",X"2E",X"98",X"E6", + X"07",X"B1",X"32",X"2E",X"98",X"26",X"88",X"CD",X"83",X"10",X"AF",X"32",X"04",X"90",X"C9",X"1E", + X"BD",X"0A",X"B8",X"14",X"BC",X"EA",X"04",X"73",X"04",X"AB",X"04",X"3A",X"0B",X"92",X"A7",X"28", + X"0A",X"3A",X"15",X"90",X"4F",X"3A",X"1D",X"90",X"2F",X"A1",X"C8",X"06",X"04",X"21",X"CA",X"92", + X"7E",X"3C",X"20",X"0D",X"2C",X"2C",X"2C",X"10",X"F7",X"3A",X"A0",X"92",X"E6",X"0F",X"28",X"1E", + X"C9",X"36",X"FF",X"3D",X"16",X"88",X"5F",X"CB",X"BB",X"08",X"1A",X"3D",X"C0",X"2C",X"5E",X"2C", + X"56",X"08",X"6F",X"26",X"88",X"CD",X"79",X"10",X"3E",X"01",X"32",X"B3",X"9A",X"C9",X"21",X"C0", + X"92",X"06",X"03",X"35",X"28",X"04",X"2C",X"10",X"FA",X"C9",X"3A",X"C4",X"99",X"4F",X"3A",X"87", + X"92",X"B9",X"38",X"02",X"34",X"C9",X"CB",X"D5",X"7E",X"CB",X"95",X"77",X"78",X"3D",X"21",X"D7", + X"1B",X"CF",X"7E",X"23",X"66",X"6F",X"E9",X"DD",X"1B",X"FD",X"1B",X"07",X"1C",X"06",X"14",X"21", + X"08",X"88",X"11",X"4F",X"03",X"3A",X"2D",X"98",X"4F",X"7E",X"3D",X"20",X"04",X"79",X"BD",X"20", + X"05",X"2C",X"2C",X"10",X"F4",X"C9",X"32",X"B3",X"9A",X"CD",X"83",X"10",X"C9",X"06",X"10",X"21", + X"40",X"88",X"11",X"A9",X"03",X"18",X"DE",X"3A",X"2B",X"98",X"A7",X"20",X"29",X"21",X"2C",X"98", + X"34",X"CB",X"46",X"20",X"21",X"DD",X"2E",X"02",X"FD",X"21",X"54",X"04",X"11",X"30",X"88",X"06", + X"04",X"1A",X"3D",X"28",X"05",X"1C",X"1C",X"10",X"F8",X"C9",X"3E",X"01",X"32",X"2B",X"98",X"7B", + X"32",X"28",X"98",X"C3",X"B4",X"1C",X"21",X"32",X"1D",X"16",X"88",X"01",X"00",X"06",X"5E",X"23", + X"3A",X"2D",X"98",X"BB",X"28",X"04",X"1A",X"3D",X"D6",X"01",X"CB",X"11",X"10",X"F0",X"DD",X"2E", + X"00",X"06",X"04",X"DD",X"61",X"79",X"E6",X"07",X"FE",X"04",X"28",X"05",X"FE",X"03",X"D4",X"93", + X"1C",X"CB",X"19",X"10",X"F0",X"DD",X"2C",X"DD",X"4C",X"06",X"04",X"79",X"E6",X"07",X"C4",X"93", + X"1C",X"CB",X"19",X"10",X"F6",X"DD",X"2C",X"11",X"30",X"88",X"06",X"04",X"1A",X"3D",X"28",X"26", + X"1C",X"1C",X"10",X"F8",X"21",X"00",X"88",X"06",X"04",X"7E",X"3D",X"CA",X"2B",X"1D",X"2C",X"2C", + X"10",X"F7",X"C9",X"78",X"CB",X"4F",X"28",X"02",X"EE",X"01",X"E6",X"03",X"CB",X"27",X"C6",X"30", + X"5F",X"1A",X"FE",X"01",X"C0",X"E1",X"FD",X"21",X"11",X"04",X"3A",X"0B",X"92",X"A7",X"20",X"04", + X"FD",X"21",X"F1",X"00",X"7B",X"0F",X"0F",X"7B",X"17",X"0F",X"32",X"CA",X"92",X"08",X"FD",X"22", + X"CB",X"92",X"04",X"7B",X"E6",X"07",X"21",X"30",X"98",X"D7",X"DD",X"7D",X"EB",X"21",X"03",X"1D", + X"CF",X"7E",X"12",X"23",X"1C",X"7E",X"12",X"DD",X"7D",X"FE",X"02",X"28",X"0C",X"11",X"CD",X"92", + X"3D",X"28",X"03",X"CD",X"09",X"1D",X"CD",X"09",X"1D",X"3A",X"CA",X"92",X"E6",X"07",X"6F",X"26", + X"88",X"7E",X"3D",X"C0",X"4D",X"21",X"CA",X"92",X"2C",X"2C",X"2C",X"7E",X"3C",X"20",X"F9",X"08", + X"79",X"18",X"19",X"0D",X"BA",X"05",X"B7",X"01",X"B5",X"CB",X"09",X"38",X"06",X"05",X"CB",X"09", + X"38",X"01",X"05",X"78",X"05",X"21",X"32",X"1D",X"D7",X"08",X"7E",X"EB",X"17",X"0F",X"77",X"08", + X"2C",X"FD",X"7D",X"77",X"2C",X"FD",X"7C",X"77",X"2C",X"EB",X"C9",X"11",X"44",X"04",X"CD",X"83", + X"10",X"C9",X"4A",X"52",X"5A",X"58",X"50",X"48",X"21",X"B4",X"99",X"7E",X"E6",X"7F",X"D6",X"7E", + X"28",X"36",X"4E",X"34",X"3A",X"15",X"92",X"CB",X"01",X"A9",X"0F",X"3E",X"01",X"38",X"02",X"ED", + X"44",X"4F",X"21",X"14",X"98",X"06",X"06",X"7E",X"81",X"77",X"1F",X"A9",X"2C",X"07",X"30",X"04", + X"7E",X"EE",X"01",X"77",X"2C",X"10",X"F0",X"3A",X"A0",X"92",X"E6",X"FC",X"3C",X"F5",X"CD",X"EE", + X"23",X"F1",X"C6",X"02",X"CD",X"EE",X"23",X"C9",X"32",X"0E",X"90",X"C9",X"3A",X"15",X"92",X"47", + X"21",X"B9",X"99",X"7E",X"2C",X"A7",X"28",X"26",X"7E",X"A7",X"3E",X"FD",X"20",X"13",X"2C",X"7E", + X"2C",X"BE",X"28",X"01",X"34",X"7E",X"2C",X"86",X"4F",X"E6",X"3F",X"77",X"79",X"07",X"07",X"E6", + X"03",X"CB",X"40",X"20",X"02",X"ED",X"44",X"3D",X"E6",X"07",X"32",X"BE",X"99",X"C9",X"AF",X"77", + X"2C",X"2C",X"77",X"2C",X"77",X"3E",X"07",X"18",X"F1",X"21",X"00",X"92",X"06",X"30",X"CB",X"7E", + X"20",X"05",X"2C",X"2C",X"10",X"F8",X"C9",X"CB",X"BE",X"26",X"88",X"36",X"04",X"2C",X"36",X"40", + X"26",X"8B",X"36",X"0A",X"26",X"92",X"18",X"EB",X"3A",X"A2",X"92",X"E6",X"01",X"C0",X"21",X"AC", + X"92",X"06",X"04",X"7E",X"A7",X"28",X"01",X"35",X"2C",X"10",X"F8",X"C9",X"3A",X"A0",X"92",X"E6", + X"03",X"C0",X"21",X"0F",X"92",X"7E",X"5F",X"16",X"FF",X"CB",X"7F",X"20",X"05",X"14",X"14",X"34", + X"18",X"01",X"35",X"FE",X"1F",X"20",X"02",X"CB",X"FE",X"FE",X"81",X"20",X"02",X"CB",X"BE",X"4E", + X"E6",X"07",X"7A",X"32",X"11",X"92",X"7B",X"20",X"10",X"21",X"6A",X"1E",X"79",X"E6",X"18",X"CF", + X"7B",X"11",X"20",X"99",X"01",X"10",X"00",X"ED",X"B0",X"21",X"15",X"92",X"07",X"AE",X"0F",X"21", + X"20",X"99",X"11",X"00",X"99",X"30",X"05",X"01",X"FF",X"01",X"18",X"03",X"01",X"01",X"FF",X"DD", + X"2E",X"05",X"CD",X"49",X"1E",X"41",X"DD",X"2E",X"0B",X"CB",X"0E",X"30",X"15",X"1A",X"80",X"12", + X"16",X"98",X"1A",X"80",X"12",X"1F",X"A8",X"07",X"30",X"06",X"1C",X"1A",X"EE",X"01",X"12",X"1D", + X"16",X"99",X"1C",X"1C",X"2C",X"DD",X"2D",X"20",X"E0",X"C9",X"FF",X"77",X"55",X"14",X"10",X"10", + X"14",X"55",X"77",X"FF",X"00",X"10",X"14",X"55",X"77",X"FF",X"FF",X"77",X"55",X"51",X"10",X"10", + X"51",X"55",X"77",X"FF",X"00",X"10",X"51",X"55",X"77",X"FF",X"FF",X"77",X"57",X"15",X"10",X"10", + X"15",X"57",X"77",X"FF",X"00",X"10",X"15",X"57",X"77",X"FF",X"FF",X"F7",X"D5",X"91",X"10",X"10", + X"91",X"D5",X"F7",X"FF",X"00",X"10",X"91",X"D5",X"F7",X"FF",X"3A",X"A0",X"92",X"E6",X"01",X"C6", + X"02",X"47",X"3A",X"15",X"92",X"A7",X"78",X"28",X"02",X"ED",X"44",X"DD",X"67",X"2E",X"68",X"11", + X"B0",X"92",X"DD",X"2E",X"08",X"26",X"8B",X"7E",X"FE",X"30",X"20",X"39",X"26",X"93",X"7E",X"A7", + X"28",X"33",X"EB",X"46",X"78",X"E6",X"7E",X"2C",X"86",X"4F",X"E6",X"1F",X"77",X"2C",X"79",X"07", + X"07",X"07",X"E6",X"07",X"CB",X"78",X"28",X"02",X"ED",X"44",X"EB",X"86",X"77",X"2C",X"7E",X"DD", + X"84",X"77",X"1F",X"DD",X"AC",X"07",X"30",X"07",X"26",X"9B",X"CB",X"0E",X"3F",X"CB",X"16",X"2C", + X"DD",X"2D",X"20",X"C1",X"C9",X"2C",X"1C",X"1C",X"18",X"F5",X"3A",X"15",X"92",X"C6",X"B6",X"6F", + X"26",X"99",X"CB",X"66",X"C0",X"21",X"64",X"93",X"11",X"A4",X"92",X"AF",X"BE",X"28",X"05",X"2E", + X"66",X"1C",X"BE",X"C0",X"D5",X"EB",X"21",X"63",X"9B",X"54",X"1C",X"CB",X"56",X"28",X"02",X"D1", + X"C9",X"ED",X"A8",X"26",X"93",X"54",X"ED",X"A0",X"ED",X"A8",X"26",X"9B",X"54",X"46",X"EB",X"3A", + X"27",X"98",X"E6",X"01",X"07",X"07",X"07",X"B0",X"77",X"16",X"8B",X"1A",X"62",X"E6",X"07",X"0E", + X"30",X"FE",X"05",X"30",X"07",X"0C",X"FE",X"02",X"30",X"02",X"0C",X"0C",X"71",X"FE",X"04",X"38", + X"03",X"2F",X"C6",X"47",X"CB",X"27",X"4F",X"78",X"0F",X"0F",X"0F",X"E6",X"60",X"47",X"3A",X"15", + X"92",X"A7",X"78",X"20",X"02",X"EE",X"60",X"B1",X"D1",X"12",X"26",X"88",X"36",X"06",X"3E",X"01", + X"32",X"AF",X"9A",X"2A",X"46",X"98",X"23",X"22",X"46",X"98",X"C9",X"3A",X"27",X"98",X"5F",X"3A", + X"15",X"92",X"C6",X"B6",X"6F",X"26",X"99",X"7E",X"E6",X"0A",X"FE",X"0A",X"28",X"37",X"21",X"15", + X"92",X"CB",X"46",X"28",X"02",X"EE",X"0A",X"21",X"A3",X"92",X"47",X"0E",X"01",X"7E",X"EE",X"01", + X"77",X"20",X"01",X"0C",X"21",X"62",X"93",X"7E",X"A7",X"C8",X"CB",X"48",X"20",X"0F",X"7E",X"FE", + X"D1",X"38",X"03",X"CB",X"43",X"C0",X"FE",X"E1",X"D0",X"81",X"77",X"18",X"0D",X"7E",X"FE",X"12", + X"D8",X"91",X"77",X"18",X"05",X"AF",X"32",X"A3",X"92",X"C9",X"CB",X"43",X"C8",X"C6",X"0F",X"32", + X"60",X"93",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"80", + X"3A",X"28",X"98",X"6F",X"26",X"88",X"7E",X"A7",X"C2",X"BF",X"20",X"3A",X"8B",X"92",X"A7",X"CA", + X"C7",X"20",X"3D",X"CA",X"D1",X"20",X"26",X"93",X"7E",X"FE",X"80",X"28",X"09",X"F2",X"23",X"20", + X"34",X"18",X"3B",X"35",X"18",X"38",X"2C",X"3A",X"15",X"92",X"A7",X"20",X"1F",X"7E",X"FE",X"29", + X"20",X"0F",X"26",X"9B",X"7E",X"26",X"93",X"3D",X"20",X"07",X"3E",X"03",X"32",X"8B",X"92",X"18", + X"1D",X"34",X"20",X"1A",X"26",X"9B",X"7E",X"EE",X"01",X"77",X"18",X"12",X"7E",X"FE",X"37",X"20", + X"08",X"26",X"9B",X"7E",X"26",X"93",X"A7",X"28",X"E1",X"35",X"7E",X"3C",X"28",X"E6",X"21",X"62", + X"8B",X"7E",X"D6",X"06",X"4F",X"26",X"93",X"20",X"0C",X"7E",X"FE",X"71",X"28",X"07",X"F2",X"73", + X"20",X"34",X"C9",X"35",X"C9",X"3A",X"8B",X"92",X"FE",X"03",X"C0",X"3A",X"28",X"98",X"6F",X"36", + X"00",X"2C",X"0D",X"0C",X"28",X"09",X"11",X"63",X"93",X"AF",X"32",X"2B",X"98",X"18",X"08",X"3E", + X"01",X"32",X"27",X"98",X"11",X"61",X"93",X"7E",X"12",X"26",X"9B",X"54",X"7E",X"12",X"2D",X"26", + X"88",X"36",X"80",X"26",X"8B",X"6B",X"2D",X"36",X"06",X"2C",X"36",X"09",X"2D",X"26",X"93",X"36", + X"80",X"3E",X"01",X"32",X"14",X"90",X"32",X"15",X"90",X"32",X"25",X"90",X"32",X"B9",X"99",X"AF", + X"32",X"1D",X"90",X"32",X"B1",X"9A",X"C9",X"3C",X"32",X"8B",X"92",X"3E",X"02",X"32",X"AD",X"92", + X"C9",X"26",X"9B",X"3A",X"AD",X"92",X"5F",X"3A",X"87",X"92",X"B3",X"32",X"8D",X"92",X"CD",X"96", + X"21",X"05",X"C0",X"32",X"14",X"90",X"32",X"15",X"90",X"32",X"25",X"90",X"3E",X"02",X"32",X"8B", + X"92",X"C9",X"21",X"62",X"8B",X"7E",X"FE",X"40",X"38",X"08",X"AF",X"32",X"1C",X"90",X"32",X"BA", + X"99",X"C9",X"26",X"9B",X"CD",X"96",X"21",X"CB",X"40",X"20",X"54",X"3A",X"8B",X"92",X"CB",X"7F", + X"20",X"59",X"3A",X"8D",X"92",X"A7",X"C8",X"26",X"93",X"3A",X"28",X"98",X"5F",X"54",X"1A",X"BE", + X"28",X"07",X"F2",X"28",X"21",X"35",X"18",X"01",X"34",X"2C",X"3A",X"15",X"92",X"A7",X"28",X"0B", + X"34",X"7E",X"FE",X"7A",X"28",X"24",X"FE",X"80",X"28",X"16",X"C9",X"35",X"7E",X"3C",X"20",X"08", + X"26",X"9B",X"7E",X"EE",X"01",X"77",X"26",X"93",X"7E",X"FE",X"E6",X"28",X"0D",X"FE",X"E0",X"C0", + X"AF",X"32",X"8D",X"92",X"3E",X"07",X"32",X"63",X"8B",X"C9",X"AF",X"32",X"15",X"90",X"C9",X"3A", + X"15",X"90",X"A7",X"20",X"06",X"3C",X"32",X"0D",X"92",X"18",X"22",X"26",X"93",X"2C",X"3A",X"15", + X"92",X"A7",X"28",X"07",X"7E",X"FE",X"37",X"28",X"12",X"35",X"C9",X"7E",X"FE",X"29",X"28",X"0B", + X"34",X"C0",X"26",X"9B",X"7E",X"EE",X"01",X"77",X"26",X"93",X"C9",X"05",X"C0",X"AF",X"32",X"1C", + X"90",X"3C",X"32",X"25",X"90",X"C9",X"7E",X"4F",X"CB",X"3F",X"A9",X"4F",X"26",X"8B",X"06",X"00", + X"7E",X"E6",X"07",X"FE",X"06",X"20",X"0E",X"0D",X"0C",X"20",X"0A",X"08",X"3A",X"8D",X"92",X"A7", + X"20",X"02",X"04",X"C9",X"08",X"CB",X"41",X"20",X"07",X"FE",X"06",X"28",X"09",X"34",X"18",X"0E", + X"A7",X"28",X"03",X"35",X"18",X"08",X"0D",X"F2",X"B5",X"21",X"0E",X"03",X"18",X"E7",X"79",X"CB", + X"4F",X"28",X"02",X"EE",X"01",X"26",X"9B",X"77",X"C9",X"21",X"28",X"98",X"5E",X"16",X"88",X"1A", + X"FE",X"09",X"20",X"44",X"2C",X"7E",X"DD",X"6F",X"DD",X"26",X"91",X"DD",X"7E",X"0A",X"A7",X"C0", + X"3E",X"0C",X"DD",X"CB",X"05",X"46",X"28",X"02",X"ED",X"44",X"DD",X"77",X"0C",X"DD",X"7E",X"05", + X"0F",X"DD",X"7E",X"04",X"1F",X"D6",X"78",X"FE",X"10",X"D0",X"3A",X"C6",X"99",X"32",X"2A",X"98", + X"AF",X"DD",X"77",X"0C",X"32",X"19",X"90",X"32",X"8B",X"92",X"32",X"0D",X"92",X"3C",X"32",X"18", + X"90",X"32",X"8C",X"92",X"32",X"8D",X"92",X"C9",X"AF",X"32",X"19",X"90",X"32",X"2B",X"98",X"C9", + X"3A",X"A0",X"92",X"4F",X"E6",X"03",X"20",X"2D",X"3A",X"8A",X"92",X"ED",X"44",X"D6",X"18",X"26", + X"21",X"07",X"CB",X"14",X"07",X"CB",X"14",X"E6",X"E0",X"C6",X"15",X"6F",X"79",X"0F",X"0F",X"E6", + X"03",X"20",X"01",X"3C",X"C6",X"17",X"11",X"16",X"00",X"0E",X"06",X"06",X"0A",X"77",X"2C",X"10", + X"FC",X"19",X"0D",X"20",X"F6",X"21",X"8B",X"92",X"CB",X"7E",X"20",X"0C",X"3A",X"28",X"98",X"5F", + X"16",X"88",X"1A",X"FE",X"09",X"C2",X"35",X"23",X"21",X"8C",X"92",X"35",X"C2",X"4B",X"23",X"3A", + X"2A",X"98",X"77",X"21",X"8B",X"92",X"CB",X"7E",X"20",X"2F",X"32",X"A5",X"9A",X"3A",X"29",X"98", + X"C6",X"0D",X"5F",X"16",X"91",X"3E",X"FF",X"12",X"34",X"7E",X"E6",X"0F",X"FE",X"0B",X"28",X"40", + X"CB",X"76",X"20",X"2B",X"F5",X"4F",X"07",X"81",X"21",X"A9",X"23",X"CF",X"F1",X"CD",X"98",X"23", + X"06",X"06",X"7E",X"12",X"23",X"E7",X"10",X"FA",X"C9",X"34",X"7E",X"E6",X"0F",X"FE",X"0B",X"20", + X"12",X"AF",X"32",X"18",X"90",X"32",X"A5",X"9A",X"32",X"A6",X"9A",X"32",X"2B",X"98",X"C9",X"ED", + X"44",X"C6",X"0B",X"CD",X"98",X"23",X"06",X"06",X"0E",X"24",X"79",X"12",X"E7",X"10",X"FB",X"C9", + X"CB",X"76",X"28",X"46",X"3A",X"0D",X"92",X"A7",X"28",X"07",X"CB",X"6E",X"20",X"03",X"36",X"68", + X"C9",X"AF",X"32",X"18",X"90",X"32",X"A5",X"9A",X"32",X"A6",X"9A",X"3A",X"0D",X"92",X"A7",X"3A", + X"29",X"98",X"20",X"0F",X"C6",X"0D",X"5F",X"16",X"91",X"AF",X"32",X"2B",X"98",X"3C",X"32",X"28", + X"98",X"12",X"C9",X"C6",X"08",X"6F",X"26",X"91",X"11",X"6B",X"04",X"73",X"2C",X"72",X"AF",X"32", + X"BA",X"99",X"3C",X"32",X"11",X"90",X"32",X"8E",X"92",X"C9",X"3E",X"40",X"32",X"8C",X"92",X"3E", + X"40",X"32",X"8B",X"92",X"C9",X"3E",X"03",X"32",X"2A",X"98",X"36",X"80",X"AF",X"32",X"8D",X"92", + X"32",X"BA",X"99",X"3C",X"32",X"8C",X"92",X"32",X"14",X"90",X"C9",X"3A",X"8B",X"92",X"FE",X"40", + X"C0",X"3A",X"15",X"92",X"4F",X"3A",X"62",X"93",X"CB",X"41",X"28",X"04",X"C6",X"0E",X"ED",X"44", + X"47",X"3A",X"8A",X"92",X"90",X"C6",X"1B",X"FE",X"36",X"D0",X"3A",X"01",X"92",X"3D",X"28",X"0B", + X"3A",X"14",X"90",X"4F",X"3A",X"13",X"92",X"EE",X"01",X"A1",X"C8",X"AF",X"32",X"14",X"90",X"32", + X"A5",X"9A",X"32",X"25",X"90",X"32",X"13",X"92",X"3C",X"32",X"1C",X"90",X"32",X"A6",X"9A",X"32", + X"BA",X"99",X"3E",X"0A",X"32",X"2A",X"98",X"C9",X"4F",X"3A",X"8A",X"92",X"ED",X"44",X"C6",X"10", + X"16",X"20",X"07",X"CB",X"12",X"07",X"CB",X"12",X"E6",X"E0",X"C6",X"14",X"81",X"5F",X"C9",X"24", + X"4E",X"4F",X"50",X"51",X"24",X"24",X"52",X"53",X"54",X"55",X"24",X"24",X"56",X"57",X"58",X"59", + X"24",X"24",X"5A",X"5B",X"5C",X"5D",X"24",X"24",X"5E",X"5F",X"60",X"61",X"24",X"62",X"63",X"64", + X"65",X"66",X"67",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74", + X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"3A",X"A0",X"92",X"CB",X"47", + X"CA",X"A4",X"25",X"E6",X"02",X"5F",X"3A",X"A6",X"92",X"DD",X"6F",X"06",X"20",X"16",X"88",X"1A", + X"CB",X"27",X"38",X"20",X"21",X"0D",X"24",X"D7",X"7E",X"23",X"66",X"6F",X"E9",X"24",X"24",X"96", + X"24",X"6D",X"24",X"5B",X"25",X"C0",X"24",X"43",X"25",X"5B",X"25",X"9E",X"25",X"4A",X"24",X"30", + X"24",X"1D",X"DD",X"2C",X"3E",X"04",X"83",X"5F",X"10",X"D3",X"DD",X"7D",X"32",X"A6",X"92",X"C9", + X"6B",X"26",X"01",X"4E",X"2C",X"6E",X"26",X"99",X"7E",X"08",X"69",X"4E",X"1C",X"1A",X"C6",X"11", + X"6F",X"26",X"91",X"08",X"77",X"2C",X"71",X"C3",X"21",X"24",X"26",X"8B",X"6B",X"1C",X"1A",X"3D", + X"28",X"0D",X"12",X"1D",X"E6",X"03",X"20",X"CC",X"7E",X"C6",X"04",X"77",X"C3",X"24",X"24",X"26", + X"93",X"AF",X"77",X"26",X"9B",X"77",X"1D",X"3E",X"80",X"12",X"C3",X"24",X"24",X"26",X"9B",X"6B", + X"7E",X"E6",X"01",X"26",X"8B",X"20",X"0A",X"7E",X"E6",X"07",X"FE",X"06",X"28",X"13",X"34",X"18", + X"28",X"7E",X"E6",X"07",X"20",X"08",X"26",X"9B",X"CB",X"86",X"26",X"8B",X"18",X"1B",X"35",X"18", + X"18",X"3E",X"01",X"12",X"18",X"13",X"26",X"8B",X"6B",X"3A",X"A2",X"92",X"CB",X"0E",X"0F",X"0F", + X"CB",X"16",X"3A",X"0B",X"92",X"A7",X"CA",X"22",X"24",X"26",X"01",X"4E",X"2C",X"6E",X"26",X"98", + X"7E",X"16",X"93",X"12",X"1C",X"69",X"7E",X"12",X"16",X"9B",X"2C",X"7E",X"12",X"C3",X"21",X"24", + X"6B",X"1C",X"1A",X"FE",X"45",X"28",X"2D",X"3C",X"12",X"1D",X"FE",X"45",X"20",X"02",X"C6",X"03", + X"FE",X"44",X"20",X"1A",X"26",X"93",X"08",X"7E",X"D6",X"08",X"77",X"2C",X"7E",X"D6",X"08",X"77", + X"30",X"06",X"26",X"9B",X"7E",X"EE",X"01",X"77",X"2D",X"26",X"9B",X"36",X"0C",X"08",X"26",X"8B", + X"77",X"C3",X"24",X"24",X"1D",X"26",X"92",X"7E",X"FE",X"01",X"20",X"0F",X"26",X"93",X"36",X"00", + X"26",X"9B",X"36",X"00",X"26",X"88",X"36",X"80",X"C3",X"24",X"24",X"26",X"8B",X"77",X"FE",X"37", + X"38",X"0A",X"0E",X"0D",X"2C",X"FE",X"3A",X"38",X"01",X"0C",X"71",X"2D",X"26",X"93",X"0E",X"08", + X"FE",X"3B",X"30",X"06",X"0E",X"00",X"7E",X"C6",X"08",X"77",X"2C",X"7E",X"C6",X"08",X"77",X"26", + X"9B",X"30",X"04",X"7E",X"EE",X"01",X"77",X"2D",X"71",X"26",X"88",X"36",X"05",X"2C",X"36",X"13", + X"C3",X"24",X"24",X"6B",X"2C",X"62",X"35",X"C2",X"24",X"24",X"2D",X"36",X"80",X"26",X"93",X"36", + X"00",X"26",X"9B",X"36",X"00",X"3E",X"80",X"12",X"C3",X"24",X"24",X"26",X"93",X"6B",X"CB",X"FD", + X"7E",X"FE",X"F4",X"30",X"1A",X"2C",X"4E",X"26",X"9B",X"7E",X"2D",X"0F",X"79",X"1F",X"FE",X"0B", + X"38",X"0D",X"FE",X"A5",X"30",X"09",X"1A",X"FE",X"06",X"C2",X"22",X"24",X"C3",X"24",X"24",X"CB", + X"BD",X"1A",X"FE",X"03",X"28",X"0A",X"3E",X"80",X"12",X"26",X"93",X"36",X"00",X"C3",X"24",X"24", + X"1C",X"1A",X"1D",X"C6",X"13",X"6F",X"26",X"91",X"36",X"00",X"6B",X"C3",X"86",X"25",X"3E",X"03", + X"12",X"C3",X"22",X"24",X"CB",X"4F",X"C8",X"21",X"A6",X"92",X"7E",X"36",X"00",X"2C",X"77",X"C9", + X"21",X"7C",X"28",X"22",X"E0",X"92",X"3A",X"21",X"98",X"4F",X"FE",X"17",X"38",X"04",X"D6",X"04", + X"18",X"F8",X"47",X"3C",X"E6",X"03",X"28",X"19",X"3A",X"84",X"99",X"2E",X"11",X"CD",X"4E",X"10", + X"7D",X"21",X"B6",X"26",X"D7",X"11",X"02",X"27",X"78",X"CB",X"38",X"CB",X"38",X"90",X"3D",X"18", + X"0D",X"21",X"FA",X"26",X"79",X"CB",X"3F",X"CB",X"3F",X"E6",X"07",X"11",X"EC",X"27",X"D7",X"7E", + X"EB",X"D7",X"7E",X"23",X"32",X"E2",X"92",X"7E",X"23",X"32",X"E3",X"92",X"11",X"20",X"89",X"3E", + X"7E",X"12",X"1C",X"7E",X"23",X"FE",X"FF",X"CA",X"8F",X"26",X"4F",X"D5",X"E5",X"21",X"00",X"91", + X"3E",X"FF",X"06",X"10",X"DF",X"79",X"E6",X"0F",X"28",X"2A",X"47",X"CB",X"3F",X"C6",X"04",X"5F", + X"CD",X"00",X"10",X"6F",X"26",X"00",X"7B",X"CD",X"61",X"10",X"CB",X"40",X"28",X"02",X"CB",X"DF", + X"26",X"91",X"6F",X"7E",X"3C",X"20",X"E9",X"78",X"07",X"CB",X"01",X"30",X"02",X"F6",X"40",X"F6", + X"38",X"77",X"10",X"DC",X"21",X"00",X"91",X"ED",X"5B",X"E0",X"92",X"06",X"08",X"7E",X"FE",X"FF", + X"28",X"03",X"23",X"18",X"F8",X"1A",X"77",X"13",X"23",X"78",X"FE",X"05",X"20",X"02",X"2E",X"08", + X"10",X"EB",X"ED",X"53",X"E0",X"92",X"E1",X"D1",X"46",X"23",X"4E",X"23",X"E5",X"21",X"00",X"91", + X"78",X"12",X"7E",X"FE",X"FF",X"28",X"10",X"1C",X"12",X"1C",X"79",X"12",X"1C",X"CB",X"DD",X"7E", + X"12",X"1C",X"CB",X"9D",X"23",X"18",X"E9",X"3E",X"7E",X"12",X"1C",X"E1",X"C3",X"03",X"26",X"1D", + X"3A",X"2B",X"98",X"47",X"3A",X"27",X"98",X"3D",X"A0",X"28",X"17",X"3A",X"25",X"98",X"A7",X"28", + X"11",X"62",X"7B",X"D6",X"04",X"6F",X"7E",X"12",X"1C",X"3E",X"04",X"12",X"1C",X"3E",X"87",X"32", + X"04",X"8B",X"3E",X"7F",X"12",X"C9",X"00",X"12",X"24",X"36",X"00",X"48",X"6C",X"5A",X"48",X"6C", + X"00",X"7E",X"A2",X"90",X"B4",X"D8",X"C6",X"00",X"12",X"48",X"6C",X"5A",X"7E",X"A2",X"00",X"7E", + X"D8",X"C6",X"B4",X"D8",X"C6",X"B4",X"D8",X"C6",X"00",X"12",X"7E",X"A2",X"90",X"7E",X"D8",X"C6", + X"B4",X"D8",X"C6",X"B4",X"D8",X"C6",X"B4",X"D8",X"C6",X"00",X"12",X"48",X"36",X"24",X"48",X"6C", + X"00",X"7E",X"A2",X"90",X"B4",X"D8",X"00",X"B4",X"D8",X"C6",X"00",X"12",X"24",X"36",X"48",X"5A", + X"6C",X"7E",X"14",X"00",X"00",X"00",X"C0",X"00",X"01",X"01",X"00",X"41",X"41",X"00",X"40",X"40", + X"00",X"00",X"00",X"FF",X"14",X"01",X"00",X"42",X"82",X"00",X"03",X"85",X"00",X"43",X"C5",X"00", + X"42",X"C4",X"00",X"02",X"84",X"FF",X"14",X"01",X"82",X"00",X"C0",X"00",X"01",X"01",X"00",X"41", + X"41",X"02",X"40",X"40",X"02",X"00",X"00",X"FF",X"14",X"01",X"82",X"02",X"C2",X"00",X"03",X"85", + X"00",X"43",X"C5",X"02",X"42",X"C4",X"02",X"02",X"84",X"FF",X"14",X"01",X"82",X"00",X"C0",X"00", + X"01",X"C1",X"00",X"41",X"81",X"02",X"40",X"80",X"02",X"40",X"80",X"FF",X"14",X"01",X"82",X"00", + X"C0",X"42",X"01",X"01",X"F2",X"41",X"41",X"02",X"40",X"40",X"02",X"00",X"00",X"FF",X"14",X"01", + X"A4",X"02",X"C2",X"52",X"03",X"85",X"F2",X"43",X"C5",X"02",X"42",X"C4",X"02",X"02",X"84",X"FF", + X"14",X"01",X"82",X"00",X"C0",X"52",X"01",X"C1",X"F2",X"41",X"81",X"02",X"40",X"80",X"02",X"40", + X"80",X"FF",X"14",X"01",X"A4",X"00",X"C0",X"42",X"01",X"01",X"F4",X"41",X"41",X"04",X"40",X"40", + X"04",X"00",X"00",X"FF",X"14",X"01",X"A4",X"02",X"C2",X"52",X"03",X"85",X"F4",X"43",X"C5",X"04", + X"42",X"C4",X"04",X"02",X"84",X"FF",X"14",X"03",X"A4",X"00",X"C0",X"54",X"01",X"C1",X"F4",X"41", + X"81",X"04",X"40",X"80",X"04",X"40",X"80",X"FF",X"14",X"03",X"A4",X"00",X"C0",X"54",X"01",X"01", + X"F4",X"41",X"41",X"04",X"40",X"40",X"04",X"00",X"00",X"FF",X"14",X"03",X"A4",X"02",X"C2",X"54", + X"03",X"85",X"F4",X"43",X"C5",X"04",X"42",X"C4",X"04",X"02",X"84",X"FF",X"FF",X"00",X"00",X"06", + X"C6",X"00",X"07",X"07",X"00",X"47",X"47",X"00",X"46",X"46",X"00",X"06",X"06",X"FF",X"FF",X"00", + X"00",X"08",X"C8",X"00",X"09",X"C9",X"00",X"09",X"C9",X"00",X"48",X"48",X"00",X"08",X"08",X"FF", + X"FF",X"00",X"00",X"0A",X"4A",X"00",X"0B",X"CB",X"00",X"0B",X"CB",X"00",X"0A",X"4A",X"00",X"16", + X"56",X"FF",X"FF",X"00",X"00",X"0C",X"CC",X"00",X"0D",X"0D",X"00",X"4D",X"4D",X"00",X"0C",X"CC", + X"00",X"17",X"D7",X"FF",X"FF",X"00",X"00",X"0E",X"0E",X"00",X"0F",X"0F",X"00",X"4F",X"4F",X"00", + X"0E",X"0E",X"00",X"4E",X"4E",X"FF",X"FF",X"00",X"00",X"10",X"10",X"00",X"11",X"D1",X"00",X"11", + X"D1",X"00",X"50",X"50",X"00",X"10",X"10",X"FF",X"FF",X"00",X"00",X"12",X"12",X"00",X"13",X"13", + X"00",X"53",X"53",X"00",X"52",X"52",X"00",X"12",X"12",X"FF",X"FF",X"00",X"00",X"14",X"D4",X"00", + X"15",X"15",X"00",X"55",X"55",X"00",X"14",X"D4",X"00",X"14",X"D4",X"FF",X"58",X"5A",X"5C",X"5E", + X"28",X"2A",X"2C",X"2E",X"30",X"34",X"36",X"32",X"50",X"52",X"54",X"56",X"42",X"46",X"40",X"44", + X"4A",X"4E",X"48",X"4C",X"1A",X"1E",X"20",X"24",X"22",X"26",X"18",X"1C",X"08",X"0C",X"12",X"16", + X"10",X"14",X"0A",X"0E",X"21",X"20",X"89",X"22",X"22",X"98",X"FD",X"21",X"16",X"29",X"3A",X"25", + X"98",X"A7",X"20",X"27",X"3A",X"21",X"98",X"0F",X"0F",X"4F",X"0F",X"47",X"E6",X"1C",X"78",X"28", + X"02",X"3E",X"03",X"E6",X"03",X"21",X"0E",X"29",X"CF",X"11",X"84",X"92",X"79",X"ED",X"A0",X"ED", + X"A0",X"21",X"1C",X"29",X"E6",X"07",X"D7",X"56",X"5A",X"18",X"03",X"11",X"24",X"36",X"21",X"08", + X"8B",X"DD",X"2E",X"01",X"06",X"14",X"DD",X"62",X"CD",X"F7",X"28",X"06",X"08",X"DD",X"26",X"10", + X"CD",X"F7",X"28",X"06",X"10",X"DD",X"63",X"DD",X"2D",X"20",X"08",X"FD",X"4E",X"00",X"FD",X"23", + X"DD",X"2E",X"08",X"CB",X"01",X"DD",X"7C",X"1F",X"77",X"2C",X"2C",X"10",X"EA",X"C9",X"0A",X"B8", + X"0F",X"B9",X"14",X"BC",X"1E",X"BD",X"A5",X"5A",X"A9",X"0F",X"0A",X"50",X"36",X"24",X"D4",X"BA", + X"E4",X"CC",X"A8",X"F4",X"2A",X"22",X"98",X"7E",X"FE",X"7F",X"CA",X"37",X"2A",X"FE",X"7E",X"20", + X"30",X"3A",X"42",X"98",X"A7",X"C8",X"3A",X"87",X"92",X"A7",X"20",X"1F",X"3A",X"25",X"98",X"47", + X"A7",X"20",X"0F",X"3A",X"AC",X"92",X"FE",X"01",X"20",X"06",X"3E",X"08",X"32",X"A8",X"92",X"C9", + X"A7",X"C0",X"23",X"22",X"22",X"98",X"21",X"26",X"98",X"34",X"C9",X"3E",X"02",X"32",X"AC",X"92", + X"C9",X"4F",X"CB",X"7F",X"20",X"06",X"3A",X"A0",X"92",X"E6",X"07",X"C0",X"CB",X"21",X"06",X"0C", + X"11",X"14",X"00",X"DD",X"21",X"00",X"91",X"DD",X"CB",X"13",X"46",X"28",X"05",X"DD",X"19",X"10", + X"F6",X"C9",X"23",X"7E",X"47",X"E6",X"78",X"FE",X"78",X"78",X"20",X"02",X"CB",X"B7",X"DD",X"77", + X"10",X"23",X"22",X"22",X"98",X"26",X"88",X"6F",X"36",X"07",X"2C",X"DD",X"5D",X"73",X"26",X"93", + X"E6",X"38",X"FE",X"38",X"28",X"1B",X"2D",X"26",X"8B",X"7E",X"57",X"E6",X"78",X"77",X"2C",X"7A", + X"E6",X"07",X"CB",X"7A",X"77",X"3E",X"00",X"28",X"03",X"3A",X"E3",X"92",X"DD",X"77",X"0F",X"18", + X"1E",X"11",X"10",X"02",X"CB",X"70",X"20",X"0D",X"11",X"18",X"03",X"3A",X"26",X"98",X"FE",X"02", + X"20",X"03",X"11",X"08",X"00",X"26",X"8B",X"72",X"2D",X"73",X"2C",X"DD",X"36",X"0F",X"00",X"51", + X"CB",X"B9",X"06",X"08",X"CB",X"49",X"28",X"02",X"06",X"44",X"DD",X"70",X"0E",X"06",X"00",X"21", + X"4A",X"2A",X"09",X"7E",X"23",X"DD",X"77",X"08",X"AF",X"ED",X"6F",X"47",X"7E",X"E6",X"1F",X"DD", + X"77",X"09",X"78",X"E6",X"0E",X"47",X"07",X"80",X"21",X"7A",X"2A",X"D7",X"CB",X"7A",X"28",X"03", + X"23",X"23",X"23",X"7E",X"23",X"DD",X"77",X"01",X"7E",X"23",X"DD",X"77",X"03",X"7E",X"23",X"DD", + X"77",X"05",X"AF",X"DD",X"77",X"00",X"DD",X"77",X"02",X"DD",X"77",X"04",X"3C",X"DD",X"77",X"0D", + X"B2",X"E6",X"81",X"DD",X"77",X"13",X"C9",X"3A",X"87",X"92",X"A7",X"C0",X"32",X"08",X"90",X"3C", + X"32",X"04",X"90",X"32",X"10",X"90",X"32",X"24",X"98",X"C9",X"1D",X"00",X"67",X"20",X"9F",X"40", + X"D4",X"20",X"7B",X"01",X"B0",X"61",X"E8",X"01",X"F5",X"21",X"0B",X"02",X"1B",X"22",X"2B",X"82", + X"41",X"22",X"5D",X"82",X"79",X"22",X"9E",X"02",X"BA",X"22",X"D9",X"02",X"FB",X"22",X"1D",X"03", + X"33",X"23",X"DA",X"0F",X"F0",X"2F",X"2B",X"A2",X"5D",X"A2",X"9B",X"34",X"03",X"9B",X"44",X"03", + X"23",X"00",X"00",X"23",X"78",X"02",X"9B",X"2C",X"03",X"9B",X"4C",X"03",X"2B",X"00",X"00",X"2B", + X"78",X"02",X"9B",X"34",X"03",X"9B",X"34",X"03",X"9B",X"44",X"03",X"9B",X"44",X"03",X"3A",X"A0", + X"92",X"3D",X"E6",X"03",X"C0",X"3A",X"A7",X"92",X"47",X"3A",X"08",X"90",X"B0",X"28",X"48",X"3A", + X"0F",X"92",X"A7",X"0E",X"01",X"28",X"02",X"0D",X"0D",X"2E",X"00",X"06",X"0A",X"26",X"99",X"7E", + X"81",X"77",X"26",X"98",X"7E",X"81",X"77",X"2C",X"2C",X"10",X"F2",X"3A",X"24",X"98",X"A7",X"3A", + X"00",X"99",X"28",X"03",X"A7",X"28",X"11",X"FE",X"20",X"20",X"06",X"3E",X"01",X"32",X"0F",X"92", + X"C9",X"D6",X"E0",X"C0",X"32",X"0F",X"92",X"C9",X"AF",X"32",X"0F",X"92",X"32",X"0A",X"90",X"3C", + X"32",X"A0",X"9A",X"32",X"09",X"90",X"C9",X"32",X"0A",X"90",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3A",X"21",X"98",X"FE",X"1B",X"38",X"04",X"D6",X"04",X"18",X"F8",X"3D",X"6F",X"07",X"07",X"85", + X"5F",X"3A",X"84",X"99",X"21",X"65",X"2C",X"CF",X"7E",X"23",X"66",X"6F",X"7B",X"D7",X"11",X"C0", + X"99",X"06",X"05",X"7E",X"4F",X"07",X"07",X"07",X"07",X"E6",X"0F",X"12",X"1C",X"79",X"E6",X"0F", + X"12",X"1C",X"23",X"10",X"EE",X"3A",X"21",X"98",X"FE",X"03",X"30",X"03",X"AF",X"18",X"07",X"F6", + X"FC",X"3C",X"28",X"02",X"3E",X"0A",X"12",X"01",X"16",X"02",X"ED",X"43",X"C1",X"92",X"ED",X"43", + X"C0",X"92",X"3A",X"21",X"98",X"FE",X"10",X"38",X"02",X"3E",X"10",X"07",X"07",X"E6",X"70",X"C6", + X"40",X"32",X"BB",X"99",X"C9",X"EF",X"2C",X"71",X"2D",X"F3",X"2D",X"6D",X"2C",X"00",X"00",X"22", + X"C6",X"00",X"00",X"11",X"23",X"C7",X"00",X"00",X"00",X"00",X"C0",X"00",X"11",X"12",X"23",X"97", + X"00",X"11",X"23",X"23",X"98",X"00",X"21",X"24",X"33",X"98",X"00",X"00",X"00",X"00",X"90",X"00", + X"22",X"25",X"33",X"99",X"10",X"22",X"36",X"34",X"69",X"10",X"10",X"11",X"23",X"97",X"00",X"00", + X"00",X"00",X"60",X"00",X"32",X"46",X"34",X"67",X"11",X"32",X"67",X"44",X"68",X"11",X"32",X"67", + X"45",X"68",X"11",X"00",X"00",X"00",X"60",X"00",X"42",X"78",X"45",X"69",X"11",X"42",X"78",X"45", + X"69",X"11",X"11",X"22",X"23",X"97",X"11",X"00",X"00",X"00",X"60",X"00",X"52",X"88",X"46",X"3A", + X"11",X"52",X"88",X"56",X"3A",X"11",X"52",X"88",X"56",X"3C",X"11",X"00",X"00",X"00",X"30",X"00", + X"62",X"89",X"57",X"3C",X"11",X"62",X"99",X"57",X"3C",X"11",X"62",X"99",X"57",X"3C",X"11",X"00", + X"00",X"12",X"C6",X"00",X"00",X"11",X"22",X"C6",X"00",X"00",X"00",X"00",X"C0",X"00",X"11",X"12", + X"23",X"97",X"00",X"11",X"12",X"23",X"97",X"00",X"00",X"11",X"23",X"C7",X"00",X"00",X"00",X"00", + X"90",X"00",X"21",X"23",X"33",X"98",X"10",X"21",X"24",X"33",X"98",X"10",X"21",X"25",X"34",X"98", + X"10",X"00",X"00",X"00",X"60",X"00",X"22",X"25",X"34",X"68",X"11",X"32",X"36",X"44",X"68",X"11", + X"11",X"11",X"23",X"67",X"01",X"00",X"00",X"00",X"60",X"00",X"32",X"36",X"45",X"68",X"11",X"32", + X"46",X"45",X"69",X"11",X"32",X"67",X"45",X"69",X"11",X"00",X"00",X"00",X"60",X"00",X"42",X"67", + X"46",X"3A",X"11",X"42",X"78",X"56",X"3A",X"11",X"52",X"78",X"56",X"3A",X"11",X"00",X"00",X"00", + X"30",X"00",X"52",X"88",X"56",X"3C",X"11",X"62",X"99",X"57",X"3C",X"11",X"62",X"99",X"57",X"3C", + X"11",X"00",X"00",X"23",X"C6",X"00",X"10",X"11",X"23",X"97",X"00",X"00",X"00",X"00",X"C0",X"00", + X"11",X"12",X"33",X"98",X"00",X"21",X"23",X"34",X"68",X"00",X"21",X"24",X"34",X"68",X"00",X"00", + X"00",X"00",X"90",X"00",X"32",X"36",X"34",X"67",X"10",X"32",X"46",X"44",X"68",X"10",X"11",X"11", + X"23",X"97",X"10",X"00",X"00",X"00",X"60",X"00",X"42",X"67",X"45",X"68",X"11",X"42",X"67",X"45", + X"69",X"11",X"42",X"78",X"46",X"69",X"11",X"00",X"00",X"00",X"60",X"00",X"52",X"78",X"46",X"3A", + X"11",X"52",X"88",X"56",X"3A",X"11",X"52",X"88",X"56",X"3A",X"11",X"00",X"00",X"00",X"60",X"00", + X"62",X"88",X"56",X"3C",X"11",X"62",X"89",X"57",X"3C",X"11",X"62",X"89",X"57",X"3E",X"11",X"00", + X"00",X"00",X"30",X"00",X"72",X"99",X"57",X"3E",X"11",X"72",X"99",X"68",X"3E",X"11",X"72",X"99", + X"68",X"3E",X"11",X"00",X"00",X"23",X"C6",X"00",X"10",X"11",X"23",X"97",X"00",X"00",X"00",X"00", + X"C0",X"00",X"11",X"12",X"34",X"98",X"00",X"21",X"23",X"34",X"68",X"00",X"21",X"24",X"34",X"68", + X"00",X"00",X"00",X"00",X"90",X"00",X"32",X"36",X"45",X"67",X"11",X"32",X"46",X"46",X"68",X"11", + X"32",X"56",X"46",X"69",X"11",X"00",X"00",X"00",X"60",X"00",X"42",X"67",X"56",X"6A",X"11",X"42", + X"67",X"56",X"6A",X"11",X"42",X"78",X"57",X"6A",X"11",X"00",X"00",X"00",X"60",X"00",X"52",X"78", + X"57",X"3A",X"11",X"52",X"88",X"57",X"3A",X"11",X"52",X"88",X"68",X"3C",X"11",X"00",X"00",X"00", + X"60",X"00",X"62",X"88",X"68",X"3C",X"11",X"62",X"89",X"68",X"3C",X"11",X"62",X"89",X"68",X"3E", + X"11",X"00",X"00",X"00",X"30",X"00",X"72",X"99",X"68",X"3E",X"11",X"72",X"99",X"68",X"3E",X"11", + X"72",X"99",X"68",X"3E",X"11",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"50", + X"21",X"FD",X"83",X"3A",X"40",X"98",X"A7",X"28",X"03",X"21",X"E8",X"83",X"22",X"00",X"8A",X"11", + X"3D",X"8A",X"CD",X"F7",X"31",X"D0",X"11",X"37",X"8A",X"CD",X"F7",X"31",X"3E",X"05",X"30",X"27", + X"11",X"31",X"8A",X"CD",X"F7",X"31",X"3E",X"04",X"30",X"1D",X"11",X"2B",X"8A",X"CD",X"F7",X"31", + X"3E",X"03",X"30",X"13",X"11",X"25",X"8A",X"CD",X"F7",X"31",X"3E",X"02",X"30",X"09",X"3E",X"FF", + X"32",X"AC",X"9A",X"3E",X"01",X"18",X"03",X"32",X"B0",X"9A",X"32",X"11",X"8A",X"21",X"A6",X"31", + X"3D",X"CF",X"CD",X"18",X"31",X"3A",X"11",X"8A",X"21",X"A1",X"31",X"3D",X"D7",X"7E",X"21",X"49", + X"8A",X"11",X"4C",X"8A",X"A7",X"28",X"05",X"4F",X"06",X"00",X"ED",X"B8",X"06",X"03",X"3E",X"24", + X"22",X"04",X"8A",X"2C",X"77",X"10",X"FC",X"3E",X"49",X"32",X"10",X"8A",X"21",X"7F",X"32",X"CD", + X"28",X"33",X"CD",X"1B",X"33",X"CD",X"28",X"33",X"11",X"09",X"83",X"2A",X"00",X"8A",X"CD",X"75", + X"32",X"21",X"49",X"81",X"11",X"E0",X"FF",X"36",X"0A",X"19",X"36",X"0A",X"19",X"36",X"0A",X"CD", + X"1D",X"32",X"CD",X"80",X"31",X"3E",X"04",X"32",X"AE",X"92",X"3A",X"AE",X"92",X"A7",X"20",X"FA", + X"3E",X"28",X"32",X"AE",X"92",X"CD",X"1D",X"32",X"CD",X"80",X"31",X"3A",X"A0",X"92",X"4F",X"CD", + X"ED",X"32",X"3A",X"A0",X"92",X"B9",X"28",X"F7",X"4F",X"E6",X"0F",X"CC",X"41",X"31",X"21",X"B6", + X"99",X"3A",X"15",X"92",X"A7",X"28",X"01",X"23",X"CB",X"66",X"CA",X"4C",X"31",X"7E",X"E6",X"0A", + X"21",X"02",X"8A",X"11",X"03",X"8A",X"BE",X"28",X"04",X"77",X"3E",X"FD",X"12",X"1A",X"3C",X"12", + X"E6",X"0F",X"20",X"CB",X"7E",X"FE",X"08",X"28",X"24",X"FE",X"02",X"20",X"C2",X"3E",X"28",X"32", + X"AE",X"92",X"3A",X"10",X"8A",X"6F",X"26",X"81",X"7E",X"3D",X"FE",X"09",X"CC",X"38",X"31",X"FE", + X"29",X"CC",X"3B",X"31",X"77",X"C3",X"BF",X"30",X"7E",X"23",X"66",X"6F",X"E9",X"3A",X"10",X"8A", + X"6F",X"26",X"81",X"3E",X"28",X"32",X"AE",X"92",X"7E",X"3C",X"FE",X"2B",X"CC",X"3E",X"31",X"FE", + X"25",X"CC",X"38",X"31",X"77",X"C3",X"BF",X"30",X"3E",X"2A",X"C9",X"3E",X"24",X"C9",X"3E",X"0A", + X"C9",X"3A",X"10",X"8A",X"6F",X"26",X"85",X"7E",X"EE",X"05",X"77",X"C9",X"3A",X"10",X"8A",X"6F", + X"26",X"85",X"36",X"00",X"26",X"81",X"4E",X"3E",X"28",X"32",X"AE",X"92",X"2A",X"04",X"8A",X"23", + X"71",X"22",X"04",X"8A",X"21",X"10",X"8A",X"7E",X"D6",X"20",X"77",X"D2",X"B5",X"30",X"CD",X"1D", + X"32",X"CD",X"80",X"31",X"3E",X"4C",X"32",X"A0",X"92",X"3A",X"A0",X"92",X"A7",X"20",X"FA",X"C9", + X"3A",X"11",X"8A",X"21",X"97",X"31",X"3D",X"CF",X"7E",X"23",X"66",X"6F",X"06",X"16",X"11",X"E0", + X"FF",X"36",X"05",X"19",X"10",X"FB",X"C9",X"74",X"87",X"76",X"87",X"78",X"87",X"7A",X"87",X"7C", + X"87",X"0C",X"09",X"06",X"03",X"00",X"B0",X"31",X"B4",X"31",X"B8",X"31",X"CE",X"31",X"D9",X"31", + X"3E",X"12",X"18",X"06",X"3E",X"0C",X"18",X"02",X"3E",X"06",X"21",X"37",X"8A",X"11",X"3D",X"8A", + X"01",X"06",X"00",X"ED",X"B8",X"11",X"37",X"8A",X"4F",X"ED",X"B8",X"C3",X"D9",X"31",X"11",X"3D", + X"8A",X"21",X"37",X"8A",X"01",X"06",X"00",X"ED",X"B8",X"3A",X"11",X"8A",X"3D",X"21",X"ED",X"31", + X"CF",X"5E",X"23",X"56",X"2A",X"00",X"8A",X"01",X"06",X"00",X"ED",X"B8",X"C9",X"25",X"8A",X"2B", + X"8A",X"31",X"8A",X"37",X"8A",X"3D",X"8A",X"2A",X"00",X"8A",X"06",X"06",X"1A",X"FE",X"24",X"28", + X"0D",X"7E",X"FE",X"24",X"C8",X"1A",X"BE",X"C0",X"2D",X"1D",X"10",X"F0",X"AF",X"C9",X"BE",X"28", + X"F7",X"AF",X"18",X"F2",X"21",X"45",X"33",X"CD",X"28",X"33",X"CD",X"28",X"33",X"21",X"B4",X"32", + X"CD",X"1B",X"33",X"06",X"01",X"CD",X"31",X"32",X"CD",X"31",X"32",X"CD",X"31",X"32",X"CD",X"31", + X"32",X"78",X"3D",X"87",X"87",X"87",X"21",X"C5",X"32",X"D7",X"5E",X"23",X"56",X"23",X"78",X"12", + X"CD",X"73",X"32",X"CD",X"70",X"32",X"CD",X"70",X"32",X"CD",X"73",X"32",X"CD",X"73",X"32",X"7E", + X"23",X"4E",X"23",X"E5",X"61",X"6F",X"CD",X"75",X"32",X"7B",X"D6",X"C0",X"5F",X"30",X"01",X"15", + X"E1",X"7E",X"23",X"66",X"6F",X"CD",X"70",X"32",X"CD",X"70",X"32",X"CD",X"70",X"32",X"04",X"C9", + X"7E",X"12",X"23",X"E7",X"C9",X"0E",X"06",X"7E",X"12",X"2B",X"E7",X"0D",X"20",X"F9",X"C9",X"24", + X"83",X"15",X"04",X"0E",X"17",X"1D",X"0E",X"1B",X"24",X"22",X"18",X"1E",X"1B",X"24",X"12",X"17", + X"12",X"1D",X"12",X"0A",X"15",X"1C",X"24",X"2C",X"E7",X"82",X"10",X"1C",X"0C",X"18",X"1B",X"0E", + X"24",X"24",X"24",X"24",X"24",X"24",X"24",X"17",X"0A",X"16",X"0E",X"50",X"82",X"05",X"04",X"1D", + X"18",X"19",X"24",X"05",X"92",X"82",X"0E",X"1C",X"0C",X"18",X"1B",X"0E",X"24",X"24",X"24",X"24", + X"24",X"17",X"0A",X"16",X"0E",X"54",X"83",X"1C",X"1D",X"25",X"8A",X"3E",X"8A",X"56",X"83",X"17", + X"0D",X"2B",X"8A",X"41",X"8A",X"58",X"83",X"1B",X"0D",X"31",X"8A",X"44",X"8A",X"5A",X"83",X"1D", + X"11",X"37",X"8A",X"47",X"8A",X"5C",X"83",X"1D",X"11",X"3D",X"8A",X"4A",X"8A",X"3A",X"B5",X"99", + X"FE",X"A0",X"28",X"07",X"47",X"3A",X"B8",X"99",X"B8",X"38",X"05",X"3A",X"AE",X"92",X"A7",X"C0", + X"E1",X"26",X"81",X"3A",X"10",X"8A",X"6F",X"ED",X"5B",X"04",X"8A",X"13",X"ED",X"A0",X"3E",X"DF", + X"25",X"85",X"30",X"01",X"24",X"6F",X"CB",X"44",X"20",X"F2",X"C9",X"5E",X"23",X"56",X"23",X"46", + X"23",X"7E",X"12",X"23",X"E7",X"10",X"FA",X"C9",X"5E",X"23",X"56",X"23",X"46",X"23",X"4E",X"23", + X"EB",X"1A",X"77",X"CB",X"D4",X"71",X"CB",X"94",X"13",X"3E",X"E0",X"25",X"85",X"30",X"01",X"24", + X"6F",X"10",X"EE",X"EB",X"C9",X"25",X"83",X"13",X"02",X"1D",X"11",X"0E",X"24",X"10",X"0A",X"15", + X"0A",X"0C",X"1D",X"12",X"0C",X"24",X"11",X"0E",X"1B",X"18",X"0E",X"1C",X"CC",X"82",X"0C",X"04", + X"26",X"26",X"24",X"0B",X"0E",X"1C",X"1D",X"24",X"05",X"24",X"26",X"26",X"AF",X"32",X"23",X"68", + X"3C",X"32",X"22",X"68",X"F3",X"32",X"30",X"68",X"06",X"0A",X"D9",X"11",X"00",X"80",X"21",X"00", + X"00",X"01",X"00",X"04",X"7D",X"AC",X"2F",X"87",X"87",X"ED",X"6A",X"7D",X"32",X"30",X"68",X"12", + X"13",X"0B",X"78",X"B1",X"20",X"EE",X"11",X"00",X"80",X"21",X"00",X"00",X"01",X"00",X"04",X"7D", + X"AC",X"2F",X"87",X"87",X"ED",X"6A",X"1A",X"AD",X"C2",X"C0",X"34",X"13",X"32",X"30",X"68",X"0B", + X"78",X"B1",X"20",X"EB",X"11",X"00",X"80",X"21",X"55",X"55",X"01",X"00",X"04",X"7D",X"AC",X"2F", + X"87",X"87",X"ED",X"6A",X"7D",X"32",X"30",X"68",X"12",X"13",X"0B",X"78",X"B1",X"20",X"EE",X"11", + X"00",X"80",X"21",X"55",X"55",X"01",X"00",X"04",X"7D",X"AC",X"2F",X"87",X"87",X"ED",X"6A",X"1A", + X"AD",X"C2",X"C0",X"34",X"13",X"32",X"30",X"68",X"0B",X"78",X"B1",X"20",X"EB",X"11",X"00",X"80", + X"21",X"AA",X"AA",X"01",X"00",X"04",X"7D",X"AC",X"2F",X"87",X"87",X"ED",X"6A",X"7D",X"32",X"30", + X"68",X"12",X"13",X"0B",X"78",X"B1",X"20",X"EE",X"11",X"00",X"80",X"21",X"AA",X"AA",X"01",X"00", + X"04",X"7D",X"AC",X"2F",X"87",X"87",X"ED",X"6A",X"1A",X"AD",X"C2",X"C0",X"34",X"13",X"32",X"30", + X"68",X"0B",X"78",X"B1",X"20",X"EB",X"D9",X"05",X"C2",X"7A",X"33",X"31",X"00",X"84",X"11",X"00", + X"84",X"CD",X"7F",X"34",X"11",X"00",X"88",X"CD",X"7F",X"34",X"11",X"00",X"90",X"CD",X"7F",X"34", + X"21",X"E0",X"99",X"11",X"00",X"90",X"01",X"20",X"00",X"ED",X"B0",X"11",X"00",X"98",X"CD",X"7F", + X"34",X"21",X"00",X"90",X"11",X"E0",X"99",X"01",X"20",X"00",X"ED",X"B0",X"31",X"00",X"8B",X"11", + X"00",X"80",X"CD",X"7F",X"34",X"CD",X"58",X"39",X"21",X"81",X"3B",X"CD",X"1B",X"33",X"32",X"30", + X"68",X"CD",X"3C",X"3A",X"3E",X"07",X"32",X"20",X"90",X"CD",X"72",X"39",X"C3",X"50",X"35",X"06", + X"1E",X"21",X"00",X"00",X"C5",X"CD",X"8C",X"34",X"C1",X"10",X"F9",X"C9",X"D5",X"E5",X"01",X"00", + X"04",X"7D",X"AC",X"2F",X"87",X"87",X"ED",X"6A",X"7D",X"32",X"30",X"68",X"12",X"13",X"0B",X"78", + X"B1",X"20",X"EE",X"E1",X"D1",X"D5",X"01",X"00",X"04",X"7D",X"AC",X"2F",X"87",X"87",X"ED",X"6A", + X"1A",X"AD",X"C2",X"C0",X"34",X"13",X"32",X"30",X"68",X"0B",X"78",X"B1",X"20",X"EB",X"D1",X"C9", + X"47",X"7A",X"1F",X"1F",X"E6",X"07",X"FE",X"04",X"38",X"01",X"3D",X"FE",X"05",X"38",X"01",X"3D", + X"5F",X"78",X"16",X"15",X"E6",X"0F",X"20",X"02",X"16",X"11",X"32",X"30",X"68",X"D9",X"21",X"00", + X"80",X"11",X"01",X"80",X"01",X"00",X"04",X"36",X"24",X"ED",X"B0",X"36",X"00",X"01",X"FF",X"03", + X"ED",X"B0",X"32",X"30",X"68",X"D9",X"21",X"E2",X"82",X"36",X"1B",X"3E",X"E0",X"25",X"D7",X"36", + X"0A",X"3E",X"E0",X"25",X"D7",X"36",X"16",X"3E",X"A0",X"25",X"D7",X"73",X"3E",X"E0",X"25",X"D7", + X"72",X"21",X"80",X"93",X"06",X"80",X"36",X"F1",X"23",X"10",X"FB",X"32",X"30",X"68",X"C3",X"1B", + X"35",X"E5",X"EB",X"16",X"10",X"AF",X"47",X"86",X"32",X"30",X"68",X"23",X"10",X"F9",X"15",X"20", + X"F6",X"EB",X"E1",X"B9",X"C8",X"21",X"8B",X"3B",X"CD",X"1B",X"33",X"11",X"44",X"82",X"21",X"02", + X"91",X"AF",X"ED",X"6F",X"12",X"E7",X"AF",X"ED",X"6F",X"12",X"32",X"30",X"68",X"C3",X"4A",X"35", + X"21",X"00",X"91",X"36",X"00",X"23",X"36",X"00",X"23",X"36",X"01",X"AF",X"32",X"70",X"92",X"3C", + X"32",X"23",X"68",X"11",X"00",X"00",X"0E",X"00",X"CD",X"21",X"35",X"34",X"0E",X"00",X"CD",X"21", + X"35",X"34",X"0E",X"00",X"CD",X"21",X"35",X"34",X"0E",X"00",X"CD",X"21",X"35",X"36",X"FF",X"3A", + X"00",X"91",X"32",X"30",X"68",X"A7",X"28",X"F7",X"3C",X"28",X"07",X"3D",X"32",X"02",X"91",X"C3", + X"35",X"35",X"3A",X"01",X"91",X"32",X"30",X"68",X"A7",X"28",X"F7",X"3C",X"28",X"17",X"3D",X"32", + X"02",X"91",X"C3",X"35",X"35",X"05",X"05",X"05",X"05",X"30",X"40",X"00",X"02",X"DF",X"40",X"30", + X"30",X"03",X"DF",X"10",X"20",X"21",X"8B",X"3B",X"CD",X"1B",X"33",X"CD",X"F4",X"37",X"21",X"00", + X"91",X"06",X"03",X"36",X"00",X"23",X"10",X"FB",X"3E",X"20",X"32",X"00",X"90",X"21",X"A5",X"35", + X"11",X"00",X"70",X"01",X"04",X"00",X"D9",X"3E",X"A1",X"32",X"00",X"71",X"32",X"30",X"68",X"CD", + X"EC",X"37",X"AF",X"32",X"30",X"68",X"32",X"A0",X"92",X"3A",X"A0",X"92",X"FE",X"02",X"20",X"F9", + X"21",X"A9",X"35",X"11",X"00",X"70",X"01",X"0C",X"00",X"D9",X"3E",X"A8",X"32",X"00",X"71",X"32", + X"30",X"68",X"CD",X"EC",X"37",X"32",X"30",X"68",X"ED",X"56",X"21",X"20",X"68",X"36",X"00",X"36", + X"01",X"FB",X"CD",X"F2",X"39",X"AF",X"32",X"A0",X"92",X"3A",X"A0",X"92",X"E6",X"08",X"28",X"F9", + X"3A",X"A0",X"92",X"4F",X"3A",X"A0",X"92",X"B9",X"28",X"FA",X"21",X"16",X"91",X"11",X"17",X"91", + X"01",X"07",X"00",X"ED",X"B8",X"EB",X"11",X"B5",X"99",X"1A",X"CB",X"7F",X"C2",X"BA",X"36",X"77", + X"23",X"B6",X"23",X"2F",X"A6",X"23",X"A6",X"77",X"47",X"23",X"13",X"1A",X"77",X"23",X"B6",X"23", + X"2F",X"A6",X"23",X"A6",X"77",X"6F",X"60",X"06",X"10",X"29",X"DC",X"D6",X"39",X"10",X"FA",X"CD", + X"F4",X"37",X"2A",X"72",X"92",X"7C",X"B5",X"28",X"09",X"2B",X"22",X"72",X"92",X"7C",X"B5",X"CC", + X"BB",X"39",X"3A",X"10",X"91",X"1F",X"30",X"07",X"AF",X"32",X"71",X"92",X"C3",X"20",X"36",X"3A", + X"17",X"91",X"E6",X"0F",X"CA",X"20",X"36",X"4F",X"21",X"82",X"37",X"11",X"71",X"92",X"1A",X"D7", + X"7E",X"B9",X"28",X"05",X"AF",X"12",X"C3",X"20",X"36",X"EB",X"34",X"13",X"1A",X"3C",X"C2",X"20", + X"36",X"CD",X"58",X"39",X"CD",X"72",X"39",X"11",X"98",X"37",X"21",X"42",X"80",X"06",X"1C",X"CD", + X"66",X"37",X"10",X"FB",X"3A",X"B5",X"99",X"87",X"30",X"FA",X"AF",X"32",X"A0",X"92",X"3A",X"A0", + X"92",X"FE",X"08",X"38",X"F9",X"3A",X"B5",X"99",X"87",X"D2",X"20",X"36",X"CD",X"72",X"39",X"21", + X"00",X"80",X"06",X"10",X"36",X"28",X"23",X"36",X"27",X"23",X"10",X"F8",X"06",X"10",X"36",X"2D", + X"23",X"36",X"2B",X"23",X"10",X"F8",X"06",X"10",X"36",X"28",X"23",X"36",X"2D",X"23",X"10",X"F8", + X"06",X"10",X"36",X"27",X"23",X"36",X"2B",X"23",X"10",X"F8",X"EB",X"21",X"40",X"80",X"01",X"40", + X"03",X"ED",X"B0",X"21",X"00",X"80",X"01",X"40",X"00",X"ED",X"B0",X"AF",X"32",X"A0",X"92",X"3A", + X"A0",X"92",X"87",X"30",X"FA",X"3A",X"B5",X"99",X"87",X"30",X"FA",X"F3",X"CD",X"EC",X"37",X"3E", + X"FE",X"32",X"A0",X"92",X"3A",X"A0",X"92",X"A7",X"20",X"FA",X"32",X"30",X"68",X"21",X"80",X"92", + X"11",X"00",X"70",X"01",X"08",X"00",X"D9",X"3E",X"E1",X"32",X"00",X"71",X"CD",X"EC",X"37",X"21", + X"00",X"70",X"11",X"88",X"92",X"01",X"03",X"00",X"D9",X"3E",X"B1",X"32",X"00",X"71",X"CD",X"EC", + X"37",X"3A",X"88",X"92",X"FE",X"A1",X"30",X"D5",X"E6",X"0F",X"FE",X"0A",X"30",X"CF",X"FB",X"AF", + X"32",X"10",X"82",X"C3",X"D3",X"02",X"CD",X"74",X"37",X"CD",X"74",X"37",X"CD",X"74",X"37",X"3E", + X"05",X"C3",X"10",X"00",X"1A",X"0E",X"08",X"87",X"30",X"01",X"34",X"23",X"0D",X"20",X"F8",X"13", + X"23",X"C9",X"02",X"02",X"02",X"02",X"02",X"08",X"08",X"08",X"08",X"08",X"08",X"02",X"02",X"02", + X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"FF",X"01",X"3E",X"00",X"7F",X"41",X"00",X"21",X"41", + X"00",X"00",X"41",X"00",X"36",X"3E",X"00",X"49",X"00",X"03",X"49",X"22",X"03",X"49",X"41",X"00", + X"36",X"41",X"3E",X"00",X"3E",X"41",X"3E",X"00",X"41",X"49",X"7F",X"41",X"49",X"20",X"7F",X"49", + X"18",X"00",X"32",X"20",X"40",X"00",X"7F",X"40",X"01",X"00",X"7F",X"7F",X"3F",X"40",X"21",X"44", + X"40",X"00",X"44",X"00",X"3C",X"44",X"01",X"42",X"3F",X"01",X"81",X"00",X"01",X"A5",X"7F",X"01", + X"A5",X"04",X"7F",X"99",X"08",X"00",X"42",X"10",X"00",X"3C",X"7F",X"00",X"3A",X"00",X"71",X"FE", + X"10",X"C8",X"18",X"F8",X"3A",X"07",X"68",X"1F",X"3C",X"E6",X"01",X"32",X"83",X"99",X"21",X"CC", + X"3A",X"CF",X"CD",X"61",X"3A",X"3A",X"B5",X"99",X"0E",X"00",X"E6",X"0C",X"20",X"01",X"0C",X"79", + X"32",X"07",X"A0",X"21",X"01",X"68",X"7E",X"1F",X"E6",X"01",X"4F",X"23",X"7E",X"E6",X"02",X"B1", + X"32",X"84",X"99",X"21",X"68",X"3A",X"D7",X"11",X"2C",X"82",X"ED",X"A0",X"21",X"E4",X"3A",X"CD", + X"1B",X"33",X"21",X"06",X"68",X"7E",X"23",X"4E",X"CB",X"19",X"8F",X"E6",X"03",X"3C",X"32",X"82", + X"99",X"3C",X"32",X"EA",X"82",X"21",X"EB",X"3A",X"CD",X"1B",X"33",X"21",X"C4",X"3A",X"11",X"80", + X"92",X"01",X"08",X"00",X"ED",X"B0",X"21",X"00",X"68",X"06",X"03",X"AF",X"4E",X"CB",X"19",X"8F", + X"23",X"10",X"F9",X"E6",X"07",X"28",X"34",X"3D",X"87",X"87",X"87",X"21",X"6C",X"3A",X"D7",X"11", + X"81",X"92",X"01",X"04",X"00",X"ED",X"B0",X"11",X"E8",X"82",X"ED",X"A0",X"11",X"28",X"82",X"ED", + X"A0",X"11",X"E8",X"81",X"ED",X"A0",X"11",X"E8",X"80",X"ED",X"A0",X"3E",X"24",X"32",X"08",X"82", + X"21",X"F6",X"3A",X"CD",X"1B",X"33",X"CD",X"1B",X"33",X"18",X"10",X"21",X"81",X"92",X"06",X"04", + X"36",X"00",X"23",X"10",X"FB",X"21",X"07",X"3B",X"CD",X"1B",X"33",X"21",X"03",X"68",X"06",X"03", + X"AF",X"4E",X"CB",X"19",X"8F",X"23",X"10",X"F9",X"E6",X"07",X"CA",X"2D",X"39",X"4F",X"3A",X"82", + X"99",X"E6",X"04",X"87",X"81",X"87",X"21",X"A4",X"3A",X"D7",X"11",X"80",X"99",X"ED",X"A0",X"ED", + X"A0",X"2B",X"0E",X"01",X"CD",X"DA",X"38",X"2B",X"0E",X"00",X"7E",X"3C",X"CA",X"3B",X"39",X"79", + X"87",X"E5",X"21",X"1D",X"3B",X"D7",X"7E",X"23",X"66",X"6F",X"C5",X"CD",X"1B",X"33",X"CD",X"1B", + X"33",X"C1",X"E1",X"7E",X"E6",X"7F",X"EB",X"21",X"F0",X"81",X"41",X"10",X"02",X"23",X"23",X"CD", + X"1E",X"39",X"EB",X"0D",X"C0",X"EB",X"1A",X"CB",X"7F",X"C2",X"49",X"39",X"21",X"F4",X"81",X"CD", + X"1E",X"39",X"D5",X"21",X"50",X"3B",X"CD",X"1B",X"33",X"CD",X"1B",X"33",X"E1",X"C9",X"FE",X"0A", + X"06",X"24",X"38",X"04",X"06",X"01",X"D6",X"0A",X"70",X"CB",X"AD",X"77",X"C9",X"21",X"67",X"3B", + X"CD",X"1B",X"33",X"21",X"80",X"99",X"36",X"FF",X"23",X"36",X"FF",X"EB",X"21",X"32",X"83",X"06", + X"16",X"36",X"24",X"3E",X"E0",X"25",X"D7",X"10",X"F8",X"21",X"34",X"83",X"06",X"16",X"36",X"24", + X"3E",X"E0",X"25",X"D7",X"10",X"F8",X"EB",X"C9",X"21",X"00",X"80",X"11",X"01",X"80",X"01",X"00", + X"04",X"36",X"24",X"ED",X"B0",X"36",X"03",X"01",X"FF",X"03",X"ED",X"B0",X"3E",X"07",X"32",X"BE", + X"99",X"C9",X"21",X"80",X"93",X"06",X"80",X"36",X"F1",X"23",X"10",X"FB",X"C9",X"21",X"E0",X"99", + X"11",X"5E",X"83",X"0E",X"02",X"06",X"01",X"CD",X"97",X"39",X"06",X"03",X"CD",X"97",X"39",X"06", + X"02",X"CD",X"97",X"39",X"23",X"06",X"01",X"CD",X"AA",X"39",X"CD",X"A0",X"39",X"10",X"FB",X"C9", + X"3E",X"99",X"96",X"1F",X"1F",X"1F",X"1F",X"CD",X"AE",X"39",X"3E",X"99",X"96",X"23",X"E6",X"0F", + X"12",X"E7",X"0D",X"C0",X"3E",X"2A",X"0E",X"04",X"12",X"E7",X"C9",X"21",X"5E",X"83",X"06",X"17", + X"11",X"E0",X"FF",X"36",X"24",X"19",X"10",X"FB",X"C9",X"E5",X"CD",X"7D",X"39",X"21",X"84",X"03", + X"22",X"72",X"92",X"E1",X"C1",X"C9",X"C5",X"78",X"FE",X"0F",X"28",X"ED",X"FE",X"02",X"28",X"15", + X"FE",X"04",X"20",X"3D",X"3A",X"70",X"92",X"D6",X"01",X"30",X"02",X"3E",X"11",X"32",X"70",X"92", + X"18",X"0A",X"C5",X"18",X"07",X"3A",X"70",X"92",X"3C",X"32",X"70",X"92",X"3A",X"70",X"92",X"FE", + X"12",X"38",X"01",X"AF",X"32",X"70",X"92",X"E5",X"0E",X"00",X"FE",X"0A",X"38",X"03",X"0C",X"D6", + X"0A",X"21",X"2E",X"82",X"71",X"2E",X"0E",X"77",X"21",X"47",X"3A",X"CD",X"1B",X"33",X"E1",X"C1", + X"C9",X"3A",X"70",X"92",X"FE",X"12",X"38",X"01",X"AF",X"32",X"70",X"92",X"EB",X"CD",X"3C",X"3A", + X"21",X"4F",X"3A",X"D7",X"6E",X"26",X"9A",X"36",X"01",X"EB",X"C1",X"C9",X"21",X"A0",X"9A",X"06", + X"40",X"36",X"00",X"23",X"10",X"FB",X"C9",X"EE",X"82",X"05",X"1C",X"18",X"1E",X"17",X"0D",X"A1", + X"A2",X"A3",X"A4",X"A7",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"B0",X"B2",X"B3",X"B4",X"B5",X"B6", + X"B9",X"7E",X"23",X"66",X"6F",X"C3",X"1B",X"33",X"0B",X"0C",X"0D",X"0A",X"04",X"01",X"04",X"01", + X"04",X"1C",X"01",X"24",X"03",X"01",X"03",X"01",X"03",X"1C",X"01",X"24",X"02",X"01",X"02",X"01", + X"02",X"1C",X"01",X"24",X"02",X"03",X"02",X"03",X"02",X"1C",X"03",X"1C",X"01",X"03",X"01",X"03", + X"01",X"24",X"03",X"1C",X"01",X"02",X"01",X"02",X"01",X"24",X"02",X"1C",X"01",X"01",X"01",X"01", + X"01",X"24",X"01",X"24",X"FF",X"FF",X"02",X"06",X"02",X"07",X"02",X"08",X"03",X"0A",X"03",X"0C", + X"02",X"86",X"03",X"88",X"FF",X"FF",X"03",X"0A",X"03",X"0C",X"03",X"0F",X"03",X"8A",X"03",X"8C", + X"03",X"8F",X"03",X"FF",X"01",X"01",X"01",X"01",X"01",X"02",X"03",X"00",X"D0",X"3A",X"DA",X"3A", + X"E6",X"82",X"07",X"1E",X"19",X"1B",X"12",X"10",X"11",X"1D",X"E6",X"82",X"07",X"1D",X"0A",X"0B", + X"15",X"0E",X"24",X"24",X"EC",X"82",X"04",X"1B",X"0A",X"17",X"14",X"AA",X"82",X"08",X"0F",X"12", + X"10",X"11",X"1D",X"0E",X"1B",X"1C",X"C8",X"82",X"05",X"24",X"0C",X"18",X"12",X"17",X"A8",X"81", + X"06",X"0C",X"1B",X"0E",X"0D",X"12",X"1D",X"E8",X"82",X"12",X"0F",X"1B",X"0E",X"0E",X"24",X"19", + X"15",X"0A",X"22",X"24",X"24",X"24",X"24",X"24",X"24",X"24",X"24",X"24",X"24",X"21",X"3B",X"39", + X"3B",X"30",X"83",X"0A",X"01",X"1C",X"1D",X"24",X"0B",X"18",X"17",X"1E",X"1C",X"24",X"B0",X"81", + X"08",X"00",X"00",X"00",X"00",X"24",X"19",X"1D",X"1C",X"32",X"83",X"09",X"02",X"17",X"0D",X"24", + X"0B",X"18",X"17",X"1E",X"1C",X"B2",X"81",X"08",X"00",X"00",X"00",X"00",X"24",X"19",X"1D",X"1C", + X"34",X"83",X"09",X"0A",X"17",X"0D",X"24",X"0E",X"1F",X"0E",X"1B",X"22",X"B4",X"81",X"08",X"00", + X"00",X"00",X"00",X"24",X"19",X"1D",X"1C",X"30",X"83",X"16",X"0B",X"18",X"17",X"1E",X"1C",X"24", + X"17",X"18",X"1D",X"11",X"12",X"17",X"10",X"24",X"24",X"24",X"24",X"24",X"24",X"24",X"24",X"24", + X"24",X"E2",X"82",X"07",X"1B",X"0A",X"16",X"24",X"24",X"18",X"14",X"E4",X"82",X"07",X"1B",X"18", + X"16",X"24",X"24",X"18",X"14",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"D9"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/galaga_cpu2.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/galaga_cpu2.vhd new file mode 100644 index 00000000..328166d9 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/galaga_cpu2.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity galaga_cpu2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of galaga_cpu2 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"31",X"00",X"91",X"C3",X"7C",X"05",X"FF",X"FF",X"87",X"30",X"05",X"24",X"C3",X"10",X"00",X"FF", + X"85",X"6F",X"D0",X"24",X"C9",X"FF",X"FF",X"FF",X"77",X"23",X"10",X"FC",X"C9",X"23",X"06",X"16", + X"23",X"00",X"19",X"F7",X"4B",X"00",X"23",X"F0",X"02",X"F0",X"5E",X"00",X"23",X"F0",X"24",X"FB", + X"23",X"00",X"FF",X"FF",X"E9",X"FF",X"FF",X"FF",X"C3",X"13",X"05",X"BE",X"05",X"BF",X"05",X"D3", + X"08",X"BE",X"05",X"F5",X"06",X"EE",X"05",X"BE",X"05",X"CA",X"0E",X"23",X"F0",X"26",X"23",X"14", + X"13",X"FE",X"0D",X"0B",X"0A",X"08",X"06",X"04",X"03",X"01",X"23",X"FF",X"FF",X"FF",X"44",X"E4", + X"18",X"FB",X"44",X"00",X"FF",X"FF",X"C9",X"23",X"08",X"08",X"23",X"03",X"1B",X"23",X"08",X"0F", + X"23",X"16",X"15",X"F7",X"84",X"00",X"23",X"16",X"03",X"F0",X"97",X"00",X"23",X"16",X"19",X"FB", + X"23",X"00",X"FF",X"FF",X"23",X"16",X"01",X"FE",X"0D",X"0C",X"0A",X"08",X"06",X"04",X"03",X"01", + X"23",X"FC",X"30",X"23",X"00",X"FF",X"FF",X"44",X"27",X"0E",X"FB",X"44",X"00",X"FF",X"FF",X"33", + X"06",X"18",X"23",X"00",X"18",X"F7",X"B6",X"00",X"23",X"F0",X"08",X"F0",X"CC",X"00",X"23",X"F0", + X"20",X"FB",X"23",X"00",X"FF",X"FF",X"23",X"F0",X"20",X"23",X"10",X"0D",X"FE",X"1A",X"18",X"15", + X"10",X"0C",X"08",X"05",X"03",X"23",X"FE",X"30",X"23",X"00",X"FF",X"FF",X"33",X"E0",X"10",X"FB", + X"44",X"00",X"FF",X"FF",X"23",X"03",X"18",X"33",X"04",X"10",X"23",X"08",X"0A",X"44",X"16",X"12", + X"F7",X"60",X"01",X"44",X"16",X"03",X"F0",X"73",X"01",X"44",X"16",X"1D",X"FB",X"23",X"00",X"FF", + X"FF",X"12",X"18",X"17",X"12",X"00",X"80",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"14",X"06",X"14",X"0C",X"14",X"08",X"14",X"0A",X"1C",X"00",X"1C",X"12",X"1E",X"00",X"1E",X"12", + X"1C",X"02",X"1C",X"10",X"1E",X"02",X"1E",X"10",X"1C",X"04",X"1C",X"0E",X"1E",X"04",X"1E",X"0E", + X"1C",X"06",X"1C",X"0C",X"1E",X"06",X"1E",X"0C",X"1C",X"08",X"1C",X"0A",X"1E",X"08",X"1E",X"0A", + X"16",X"06",X"16",X"0C",X"16",X"08",X"16",X"0A",X"18",X"00",X"18",X"12",X"1A",X"00",X"1A",X"12", + X"18",X"02",X"18",X"10",X"1A",X"02",X"1A",X"10",X"18",X"04",X"18",X"0E",X"1A",X"04",X"1A",X"0E", + X"18",X"06",X"18",X"0C",X"1A",X"06",X"1A",X"0C",X"18",X"08",X"18",X"0A",X"1A",X"08",X"1A",X"0A", + X"44",X"16",X"06",X"FE",X"0C",X"0B",X"0A",X"08",X"06",X"04",X"02",X"01",X"23",X"FE",X"30",X"23", + X"00",X"FF",X"FF",X"66",X"20",X"14",X"FB",X"44",X"00",X"FF",X"FF",X"23",X"06",X"18",X"23",X"00", + X"18",X"F7",X"92",X"01",X"44",X"F0",X"08",X"F0",X"A8",X"01",X"44",X"F0",X"20",X"FB",X"23",X"00", + X"FF",X"FF",X"44",X"F0",X"26",X"23",X"10",X"0B",X"FE",X"22",X"20",X"1E",X"1B",X"18",X"15",X"12", + X"10",X"23",X"FE",X"30",X"23",X"00",X"FF",X"FF",X"66",X"E0",X"10",X"FB",X"44",X"00",X"FF",X"FF", + X"23",X"03",X"20",X"23",X"08",X"0F",X"23",X"16",X"12",X"F7",X"CA",X"01",X"23",X"16",X"03",X"F0", + X"E0",X"01",X"23",X"16",X"1D",X"FB",X"23",X"00",X"FF",X"FF",X"23",X"16",X"01",X"FE",X"0D",X"0C", + X"0B",X"09",X"07",X"05",X"03",X"02",X"23",X"02",X"20",X"23",X"FC",X"12",X"23",X"00",X"FF",X"FF", + X"44",X"20",X"14",X"FB",X"44",X"00",X"FF",X"FF",X"23",X"00",X"10",X"23",X"01",X"40",X"22",X"0C", + X"37",X"23",X"00",X"FF",X"FF",X"23",X"02",X"3A",X"23",X"10",X"09",X"23",X"00",X"18",X"23",X"20", + X"10",X"23",X"00",X"18",X"23",X"20",X"0D",X"23",X"00",X"FF",X"FF",X"23",X"00",X"10",X"23",X"01", + X"30",X"00",X"40",X"08",X"23",X"FF",X"30",X"23",X"00",X"FF",X"FF",X"23",X"00",X"30",X"23",X"05", + X"80",X"23",X"05",X"4C",X"23",X"04",X"01",X"23",X"00",X"50",X"FF",X"23",X"00",X"28",X"23",X"06", + X"1D",X"23",X"00",X"11",X"00",X"40",X"08",X"23",X"00",X"11",X"23",X"FA",X"1D",X"23",X"00",X"50", + X"FF",X"23",X"00",X"21",X"00",X"20",X"10",X"23",X"F8",X"20",X"23",X"FF",X"20",X"23",X"F8",X"1B", + X"23",X"E8",X"0B",X"23",X"00",X"21",X"00",X"20",X"08",X"23",X"00",X"42",X"FF",X"23",X"00",X"08", + X"00",X"20",X"08",X"23",X"F0",X"20",X"23",X"10",X"20",X"23",X"F0",X"40",X"23",X"10",X"20",X"23", + X"F0",X"20",X"00",X"20",X"08",X"23",X"00",X"30",X"FF",X"23",X"10",X"0C",X"23",X"00",X"20",X"23", + X"E8",X"10",X"23",X"F4",X"10",X"23",X"E8",X"10",X"23",X"F4",X"32",X"23",X"E8",X"10",X"23",X"F4", + X"32",X"23",X"E8",X"10",X"23",X"F4",X"10",X"23",X"E8",X"0E",X"23",X"02",X"30",X"FF",X"23",X"F1", + X"08",X"23",X"00",X"10",X"23",X"05",X"3C",X"23",X"07",X"42",X"23",X"0A",X"40",X"23",X"10",X"2D", + X"23",X"20",X"19",X"00",X"FC",X"14",X"23",X"02",X"4A",X"FF",X"23",X"04",X"20",X"23",X"00",X"16", + X"23",X"F0",X"30",X"23",X"00",X"12",X"23",X"10",X"30",X"23",X"00",X"12",X"23",X"10",X"30",X"23", + X"00",X"16",X"23",X"04",X"20",X"23",X"00",X"10",X"FF",X"23",X"00",X"15",X"00",X"20",X"08",X"23", + X"00",X"11",X"00",X"E0",X"08",X"23",X"00",X"18",X"00",X"20",X"08",X"23",X"00",X"13",X"00",X"E0", + X"08",X"23",X"00",X"1F",X"00",X"20",X"08",X"23",X"00",X"30",X"FF",X"23",X"02",X"0E",X"23",X"00", + X"34",X"23",X"12",X"19",X"23",X"00",X"20",X"23",X"E0",X"0E",X"23",X"00",X"12",X"23",X"20",X"0E", + X"23",X"00",X"0C",X"23",X"E0",X"0E",X"23",X"1B",X"08",X"23",X"00",X"10",X"FF",X"23",X"00",X"0D", + X"00",X"C0",X"04",X"23",X"00",X"21",X"00",X"40",X"06",X"23",X"00",X"51",X"00",X"C0",X"06",X"23", + X"00",X"73",X"FF",X"23",X"08",X"20",X"23",X"00",X"16",X"23",X"E0",X"0C",X"23",X"02",X"0B",X"23", + X"11",X"0C",X"23",X"02",X"0B",X"23",X"E0",X"0C",X"23",X"00",X"16",X"23",X"08",X"20",X"FF",X"12", + X"18",X"1E",X"12",X"00",X"34",X"12",X"FB",X"26",X"12",X"00",X"02",X"FC",X"2E",X"12",X"FA",X"3C", + X"FA",X"9E",X"03",X"12",X"F8",X"10",X"12",X"FA",X"5C",X"12",X"00",X"23",X"F8",X"F9",X"EF",X"7C", + X"03",X"F6",X"AB",X"12",X"01",X"28",X"12",X"0A",X"18",X"FD",X"52",X"03",X"F6",X"B0",X"23",X"08", + X"1E",X"23",X"00",X"19",X"23",X"F8",X"16",X"23",X"00",X"02",X"FC",X"30",X"23",X"F7",X"26",X"FA", + X"9E",X"03",X"23",X"F0",X"0A",X"23",X"F5",X"31",X"23",X"00",X"10",X"FD",X"6C",X"03",X"12",X"F8", + X"10",X"12",X"00",X"40",X"FB",X"12",X"00",X"FF",X"FF",X"12",X"18",X"1D",X"12",X"00",X"28",X"12", + X"FA",X"02",X"F3",X"3F",X"3B",X"36",X"32",X"28",X"26",X"24",X"22",X"12",X"04",X"30",X"12",X"FC", + X"30",X"12",X"00",X"18",X"F8",X"F9",X"FA",X"0C",X"04",X"EF",X"D7",X"03",X"F6",X"B0",X"12",X"01", + X"28",X"12",X"0A",X"15",X"FD",X"AC",X"03",X"F6",X"C0",X"23",X"08",X"10",X"23",X"00",X"23",X"23", + X"F8",X"0F",X"23",X"00",X"48",X"F8",X"F9",X"FA",X"0C",X"04",X"F6",X"B0",X"23",X"08",X"20",X"23", + X"00",X"08",X"23",X"F8",X"02",X"F3",X"34",X"31",X"2D",X"29",X"22",X"26",X"1F",X"18",X"23",X"08", + X"18",X"23",X"F8",X"18",X"23",X"00",X"10",X"F8",X"F9",X"FD",X"CC",X"03",X"FB",X"12",X"00",X"FF", + X"FF",X"12",X"18",X"14",X"12",X"03",X"2A",X"12",X"10",X"40",X"12",X"01",X"20",X"12",X"FE",X"71", + X"F9",X"F1",X"FA",X"0C",X"04",X"EF",X"30",X"04",X"F6",X"AB",X"12",X"02",X"20",X"FD",X"14",X"04", + X"F6",X"B0",X"23",X"04",X"1A",X"23",X"03",X"1D",X"23",X"1A",X"25",X"23",X"03",X"10",X"23",X"FD", + X"48",X"FD",X"20",X"04",X"12",X"18",X"14",X"12",X"03",X"2A",X"12",X"10",X"40",X"12",X"01",X"20", + X"12",X"FE",X"78",X"FF",X"12",X"18",X"14",X"F4",X"12",X"00",X"04",X"FC",X"48",X"00",X"FC",X"FF", + X"23",X"00",X"30",X"F8",X"F9",X"FA",X"0C",X"04",X"FD",X"25",X"04",X"12",X"18",X"14",X"FB",X"12", + X"00",X"FF",X"FF",X"12",X"18",X"1E",X"12",X"00",X"08",X"F2",X"99",X"04",X"00",X"00",X"0A",X"F2", + X"99",X"04",X"00",X"00",X"0A",X"12",X"00",X"2C",X"12",X"FB",X"26",X"12",X"00",X"02",X"FC",X"2E", + X"12",X"FA",X"3C",X"FA",X"9E",X"03",X"FD",X"63",X"03",X"12",X"00",X"2C",X"12",X"FB",X"26",X"12", + X"00",X"02",X"FC",X"2E",X"12",X"FA",X"18",X"12",X"00",X"10",X"FF",X"12",X"18",X"13",X"F2",X"C6", + X"04",X"00",X"00",X"08",X"F2",X"CF",X"04",X"00",X"00",X"08",X"12",X"18",X"0B",X"12",X"00",X"34", + X"12",X"FB",X"26",X"FD",X"58",X"03",X"12",X"00",X"10",X"12",X"18",X"0B",X"FD",X"D8",X"04",X"12", + X"00",X"08",X"12",X"18",X"0B",X"12",X"00",X"06",X"12",X"00",X"22",X"12",X"FB",X"26",X"12",X"00", + X"02",X"FC",X"2E",X"12",X"FA",X"18",X"12",X"00",X"20",X"FF",X"12",X"18",X"1E",X"12",X"00",X"14", + X"F2",X"02",X"05",X"12",X"00",X"08",X"F2",X"02",X"05",X"12",X"00",X"18",X"12",X"FB",X"26",X"FD", + X"58",X"03",X"12",X"E2",X"01",X"F3",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"F5",X"23", + X"00",X"48",X"FF",X"AF",X"32",X"21",X"68",X"3A",X"04",X"68",X"E6",X"02",X"CA",X"75",X"05",X"3A", + X"A0",X"92",X"3C",X"32",X"A0",X"92",X"2A",X"A1",X"92",X"E6",X"1F",X"3D",X"28",X"08",X"3C",X"20", + X"06",X"7C",X"F6",X"01",X"67",X"2C",X"24",X"22",X"A1",X"92",X"3A",X"C7",X"99",X"5F",X"3A",X"A7", + X"92",X"BB",X"CB",X"10",X"3A",X"15",X"90",X"A0",X"E6",X"01",X"32",X"AA",X"92",X"0E",X"00",X"21", + X"20",X"90",X"79",X"85",X"6F",X"7E",X"A7",X"20",X"03",X"0C",X"18",X"F3",X"47",X"21",X"3B",X"00", + X"79",X"CB",X"27",X"85",X"6F",X"5E",X"23",X"56",X"EB",X"C5",X"CD",X"34",X"00",X"C1",X"78",X"81", + X"4F",X"E6",X"F8",X"28",X"DA",X"3E",X"01",X"32",X"21",X"68",X"FB",X"C9",X"11",X"00",X"91",X"1A", + X"A7",X"20",X"FC",X"67",X"6F",X"01",X"10",X"00",X"86",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"FE", + X"FF",X"28",X"02",X"3E",X"11",X"12",X"1A",X"A7",X"20",X"FC",X"ED",X"56",X"AF",X"32",X"E0",X"89", + X"21",X"B7",X"05",X"11",X"21",X"90",X"01",X"07",X"00",X"ED",X"B0",X"3E",X"01",X"32",X"21",X"68", + X"FB",X"31",X"00",X"91",X"C3",X"B1",X"05",X"01",X"01",X"00",X"01",X"01",X"00",X"0A",X"C9",X"3E", + X"01",X"32",X"D7",X"92",X"21",X"00",X"8B",X"11",X"80",X"8B",X"01",X"40",X"00",X"ED",X"B0",X"21", + X"00",X"93",X"11",X"80",X"93",X"0E",X"40",X"ED",X"B0",X"21",X"00",X"9B",X"11",X"80",X"9B",X"0E", + X"40",X"ED",X"B0",X"AF",X"32",X"D7",X"92",X"3A",X"D6",X"92",X"3D",X"28",X"FA",X"C9",X"3A",X"14", + X"90",X"A7",X"C8",X"32",X"17",X"92",X"3A",X"27",X"98",X"A7",X"28",X"17",X"21",X"60",X"93",X"7E", + X"A7",X"28",X"10",X"CD",X"81",X"06",X"3A",X"BF",X"99",X"A7",X"28",X"07",X"CD",X"49",X"06",X"AF", + X"32",X"2B",X"98",X"21",X"62",X"93",X"7E",X"A7",X"C8",X"CD",X"81",X"06",X"3A",X"BF",X"99",X"A7", + X"C8",X"3A",X"27",X"98",X"A7",X"28",X"12",X"AF",X"32",X"2B",X"98",X"3A",X"60",X"93",X"32",X"62", + X"93",X"3A",X"E2",X"93",X"21",X"E0",X"93",X"18",X"16",X"AF",X"32",X"14",X"90",X"32",X"15",X"90", + X"32",X"25",X"90",X"32",X"B9",X"99",X"32",X"17",X"92",X"EB",X"26",X"93",X"CB",X"FD",X"7E",X"D6", + X"08",X"CB",X"BD",X"77",X"2C",X"7E",X"D6",X"08",X"77",X"26",X"8B",X"36",X"0B",X"2D",X"36",X"20", + X"26",X"88",X"36",X"08",X"2C",X"36",X"0F",X"2D",X"26",X"9B",X"36",X"0C",X"AF",X"32",X"27",X"98", + X"3A",X"01",X"92",X"3D",X"32",X"B9",X"9A",X"3A",X"17",X"92",X"A7",X"C0",X"3C",X"32",X"13",X"92", + X"C9",X"AF",X"32",X"BF",X"99",X"26",X"88",X"7E",X"26",X"93",X"FE",X"08",X"C8",X"7E",X"DD",X"6F", + X"2C",X"46",X"26",X"9B",X"7E",X"0F",X"CB",X"18",X"DD",X"60",X"2D",X"5D",X"3A",X"08",X"90",X"A7", + X"28",X"06",X"2E",X"38",X"06",X"04",X"18",X"04",X"2E",X"00",X"06",X"30",X"CD",X"B7",X"06",X"2E", + X"68",X"06",X"08",X"CD",X"B7",X"06",X"C9",X"26",X"92",X"7E",X"26",X"88",X"B6",X"07",X"38",X"30", + X"7E",X"E6",X"FE",X"FE",X"04",X"28",X"29",X"26",X"93",X"7E",X"A7",X"28",X"23",X"DD",X"95",X"D6", + X"07",X"C6",X"0D",X"30",X"1B",X"2C",X"7E",X"26",X"9B",X"4E",X"2D",X"CB",X"09",X"1F",X"DD",X"94", + X"D6",X"04",X"C6",X"07",X"30",X"0A",X"3E",X"01",X"32",X"BF",X"99",X"B7",X"08",X"C3",X"C2",X"07", + X"2C",X"2C",X"10",X"C3",X"C9",X"11",X"A4",X"92",X"21",X"64",X"93",X"CD",X"04",X"07",X"11",X"A5", + X"92",X"21",X"66",X"93",X"7E",X"A7",X"C8",X"1A",X"47",X"E6",X"07",X"08",X"3E",X"06",X"CB",X"78", + X"28",X"01",X"08",X"CB",X"70",X"28",X"02",X"ED",X"44",X"86",X"77",X"FE",X"F0",X"30",X"44",X"DD", + X"6F",X"2C",X"08",X"CB",X"68",X"28",X"02",X"ED",X"44",X"4F",X"86",X"77",X"1F",X"A9",X"26",X"9B", + X"07",X"30",X"05",X"CB",X"0E",X"3F",X"CB",X"16",X"4E",X"26",X"93",X"7E",X"CB",X"09",X"1F",X"DD", + X"67",X"FE",X"14",X"38",X"1B",X"FE",X"9C",X"30",X"17",X"5D",X"3A",X"1D",X"90",X"A7",X"28",X"07", + X"21",X"08",X"93",X"06",X"2C",X"18",X"05",X"21",X"00",X"93",X"06",X"30",X"CD",X"6A",X"07",X"C9", + X"2D",X"26",X"93",X"36",X"00",X"26",X"9B",X"36",X"00",X"C9",X"26",X"92",X"7E",X"26",X"88",X"B6", + X"07",X"38",X"41",X"7E",X"4F",X"E6",X"FE",X"FE",X"04",X"28",X"39",X"2C",X"26",X"9B",X"56",X"26", + X"93",X"7E",X"CB",X"0A",X"1F",X"2D",X"DD",X"94",X"D6",X"03",X"C6",X"06",X"30",X"26",X"79",X"3D", + X"E6",X"FE",X"08",X"3A",X"27",X"98",X"A7",X"7E",X"20",X"0A",X"DD",X"95",X"D6",X"06",X"C6",X"0B", + X"38",X"17",X"18",X"10",X"DD",X"95",X"D6",X"14",X"C6",X"0B",X"38",X"0D",X"C6",X"04",X"38",X"04", + X"C6",X"0B",X"38",X"05",X"2C",X"2C",X"10",X"B2",X"C9",X"7D",X"2A",X"44",X"98",X"23",X"22",X"44", + X"98",X"6F",X"16",X"93",X"AF",X"12",X"16",X"9B",X"12",X"2C",X"26",X"8B",X"7E",X"4F",X"A7",X"CA", + X"CA",X"08",X"2D",X"FE",X"0B",X"28",X"3E",X"08",X"20",X"44",X"08",X"26",X"92",X"36",X"81",X"3A", + X"28",X"98",X"95",X"20",X"07",X"32",X"2B",X"98",X"3C",X"32",X"28",X"98",X"E5",X"79",X"FE",X"07", + X"20",X"03",X"3D",X"18",X"03",X"3D",X"E6",X"03",X"21",X"A1",X"9A",X"D7",X"36",X"01",X"79",X"FE", + X"07",X"20",X"05",X"21",X"2B",X"98",X"36",X"00",X"21",X"90",X"92",X"D7",X"34",X"08",X"28",X"01", + X"34",X"E1",X"C3",X"B4",X"07",X"26",X"93",X"36",X"00",X"26",X"88",X"36",X"80",X"C9",X"26",X"88", + X"E5",X"08",X"2C",X"7E",X"26",X"91",X"C6",X"13",X"6F",X"36",X"00",X"21",X"88",X"92",X"34",X"21", + X"A8",X"92",X"35",X"E1",X"20",X"13",X"26",X"92",X"3A",X"85",X"92",X"77",X"3A",X"84",X"92",X"67", + X"3A",X"9F",X"92",X"84",X"32",X"9F",X"92",X"18",X"96",X"79",X"FE",X"07",X"20",X"04",X"16",X"B8", + X"18",X"5E",X"3A",X"2D",X"98",X"BD",X"CA",X"B6",X"08",X"7D",X"E6",X"38",X"FE",X"38",X"CA",X"B6", + X"08",X"79",X"FE",X"01",X"C2",X"DB",X"07",X"D5",X"7D",X"E6",X"07",X"5F",X"16",X"88",X"1A",X"FE", + X"09",X"20",X"26",X"E5",X"EB",X"2C",X"7E",X"C6",X"13",X"5F",X"16",X"91",X"AF",X"12",X"26",X"8B", + X"36",X"09",X"2D",X"7D",X"32",X"28",X"98",X"26",X"88",X"AF",X"77",X"32",X"8B",X"92",X"3C",X"32", + X"1D",X"90",X"32",X"8D",X"92",X"32",X"B1",X"9A",X"E1",X"D1",X"E5",X"3E",X"06",X"32",X"AD",X"92", + X"7D",X"E6",X"07",X"21",X"30",X"98",X"D7",X"7E",X"2C",X"56",X"21",X"9F",X"92",X"86",X"77",X"E1", + X"26",X"92",X"72",X"C3",X"DF",X"07",X"E5",X"21",X"B0",X"99",X"35",X"E1",X"C2",X"DB",X"07",X"3A", + X"B2",X"99",X"57",X"3A",X"B1",X"99",X"E5",X"C3",X"AA",X"08",X"3C",X"77",X"32",X"A4",X"9A",X"2D", + X"C3",X"B4",X"07",X"DD",X"21",X"00",X"91",X"3E",X"0C",X"32",X"89",X"92",X"21",X"86",X"92",X"7E", + X"36",X"00",X"23",X"77",X"DD",X"CB",X"13",X"46",X"CA",X"FA",X"0D",X"21",X"86",X"92",X"34",X"DD", + X"6E",X"10",X"26",X"88",X"7E",X"FE",X"03",X"28",X"09",X"FE",X"09",X"28",X"05",X"FE",X"07",X"C2", + X"48",X"0E",X"DD",X"35",X"0D",X"C2",X"00",X"0C",X"DD",X"6E",X"08",X"DD",X"66",X"09",X"7E",X"FE", + X"EF",X"DA",X"D7",X"0B",X"E5",X"2F",X"21",X"20",X"09",X"CF",X"7E",X"23",X"66",X"6F",X"E3",X"C9", + X"48",X"0E",X"11",X"0B",X"41",X"0B",X"49",X"0B",X"9B",X"0A",X"CC",X"0B",X"5A",X"0B",X"82",X"0B", + X"93",X"0B",X"A3",X"0B",X"42",X"09",X"50",X"0A",X"FE",X"09",X"7B",X"09",X"68",X"09",X"55",X"09", + X"4E",X"09",X"DD",X"5E",X"10",X"16",X"88",X"3E",X"03",X"12",X"23",X"C3",X"0E",X"09",X"3A",X"C9", + X"99",X"A7",X"C3",X"59",X"09",X"3A",X"C8",X"99",X"A7",X"28",X"08",X"23",X"7E",X"23",X"66",X"6F", + X"C3",X"87",X"0B",X"23",X"23",X"C3",X"86",X"0B",X"DD",X"5E",X"10",X"16",X"01",X"1A",X"5F",X"16", + X"99",X"1C",X"1A",X"C6",X"20",X"DD",X"77",X"01",X"C3",X"86",X"0B",X"E5",X"DD",X"5E",X"10",X"21", + X"38",X"88",X"06",X"04",X"7E",X"07",X"38",X"07",X"2C",X"2C",X"10",X"F8",X"C3",X"FA",X"09",X"26", + X"8B",X"54",X"1A",X"77",X"2C",X"1C",X"1A",X"77",X"2D",X"7D",X"08",X"21",X"EF",X"91",X"11",X"EC", + X"FF",X"06",X"0C",X"7E",X"E6",X"01",X"28",X"06",X"19",X"10",X"F8",X"C3",X"FA",X"09",X"19",X"23", + X"DD",X"7E",X"00",X"DD",X"5D",X"DD",X"54",X"EB",X"FD",X"6B",X"FD",X"62",X"01",X"06",X"00",X"ED", + X"B0",X"0E",X"06",X"09",X"EB",X"19",X"EB",X"0E",X"04",X"ED",X"B0",X"DD",X"7E",X"13",X"FD",X"77", + X"13",X"E1",X"23",X"7E",X"FD",X"77",X"08",X"23",X"7E",X"FD",X"77",X"09",X"FD",X"36",X"0A",X"01", + X"FD",X"36",X"0B",X"02",X"FD",X"36",X"0D",X"01",X"08",X"FD",X"77",X"10",X"5F",X"16",X"88",X"3E", + X"09",X"12",X"1C",X"FD",X"7D",X"12",X"23",X"C3",X"0E",X"09",X"E1",X"C3",X"9D",X"0B",X"E5",X"EB", + X"3A",X"15",X"92",X"4F",X"3A",X"62",X"93",X"FE",X"1E",X"30",X"02",X"3E",X"1E",X"FE",X"D1",X"38", + X"02",X"3E",X"D1",X"CB",X"41",X"28",X"04",X"C6",X"0E",X"ED",X"44",X"CB",X"3F",X"DD",X"96",X"03", + X"1F",X"DD",X"CB",X"13",X"7E",X"28",X"02",X"ED",X"44",X"C6",X"18",X"F2",X"2F",X"0A",X"AF",X"FE", + X"30",X"38",X"02",X"3E",X"2F",X"67",X"3E",X"06",X"CD",X"A9",X"0E",X"7C",X"3C",X"EB",X"D7",X"7E", + X"DD",X"77",X"0D",X"E1",X"3E",X"09",X"D7",X"DD",X"75",X"08",X"DD",X"74",X"09",X"C3",X"FA",X"0B", + X"E5",X"3A",X"15",X"92",X"4F",X"3A",X"62",X"93",X"C6",X"03",X"E6",X"F8",X"3C",X"FE",X"29",X"30", + X"02",X"3E",X"29",X"FE",X"CA",X"38",X"02",X"3E",X"C9",X"CB",X"41",X"28",X"03",X"C6",X"0D",X"2F", + X"32",X"8A",X"92",X"CB",X"3F",X"5F",X"16",X"48",X"DD",X"66",X"01",X"DD",X"6E",X"03",X"CD",X"5A", + X"0E",X"CB",X"3C",X"CB",X"1D",X"DD",X"75",X"04",X"DD",X"74",X"05",X"AF",X"32",X"8B",X"92",X"3C", + X"32",X"19",X"90",X"DD",X"7D",X"32",X"29",X"98",X"C3",X"0C",X"0B",X"E5",X"DD",X"6E",X"10",X"26", + X"88",X"36",X"09",X"26",X"01",X"4E",X"2C",X"6E",X"26",X"99",X"46",X"2C",X"5E",X"69",X"4E",X"2C", + X"56",X"CB",X"3B",X"D5",X"DD",X"70",X"11",X"DD",X"71",X"12",X"3A",X"15",X"92",X"A7",X"28",X"08", + X"78",X"ED",X"44",X"47",X"79",X"ED",X"44",X"4F",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"51",X"1E", + X"00",X"CB",X"2A",X"CB",X"1B",X"19",X"DD",X"75",X"00",X"DD",X"74",X"01",X"5C",X"DD",X"6E",X"02", + X"DD",X"66",X"03",X"0E",X"00",X"CB",X"28",X"CB",X"19",X"ED",X"42",X"DD",X"75",X"02",X"DD",X"74", + X"03",X"6C",X"63",X"4A",X"D1",X"CD",X"5A",X"0E",X"CB",X"3C",X"CB",X"1D",X"DD",X"75",X"04",X"DD", + X"74",X"05",X"DD",X"72",X"06",X"DD",X"73",X"07",X"DD",X"CB",X"13",X"F6",X"E1",X"23",X"C3",X"0E", + X"09",X"E5",X"EB",X"3A",X"15",X"92",X"0F",X"DD",X"46",X"13",X"A8",X"07",X"3A",X"E2",X"93",X"3C", + X"3D",X"20",X"02",X"3E",X"80",X"38",X"04",X"ED",X"44",X"C6",X"F2",X"C6",X"0E",X"67",X"3E",X"1E", + X"CD",X"A9",X"0E",X"7C",X"EB",X"D7",X"7E",X"DD",X"77",X"0D",X"E1",X"3E",X"09",X"D7",X"C3",X"FA", + X"0B",X"23",X"5E",X"23",X"56",X"EB",X"C3",X"0E",X"09",X"23",X"5E",X"23",X"DD",X"73",X"06",X"DD", + X"36",X"07",X"00",X"DD",X"CB",X"13",X"EE",X"C3",X"FA",X"0B",X"3A",X"15",X"92",X"4F",X"DD",X"5E", + X"10",X"1C",X"16",X"01",X"1A",X"5F",X"16",X"98",X"1A",X"CB",X"41",X"28",X"04",X"C6",X"0E",X"ED", + X"44",X"CB",X"3F",X"DD",X"77",X"03",X"3A",X"AA",X"92",X"A7",X"CA",X"86",X"0B",X"32",X"B3",X"9A", + X"18",X"04",X"DD",X"36",X"01",X"9C",X"23",X"DD",X"75",X"08",X"DD",X"74",X"09",X"DD",X"34",X"0D", + X"C3",X"FA",X"0D",X"DD",X"7E",X"10",X"E6",X"38",X"FE",X"38",X"CA",X"41",X"0B",X"23",X"23",X"23", + X"C3",X"0E",X"09",X"23",X"7E",X"DD",X"CB",X"13",X"7E",X"28",X"04",X"C6",X"80",X"ED",X"44",X"0E", + X"00",X"CB",X"27",X"CB",X"11",X"CB",X"27",X"CB",X"11",X"DD",X"77",X"04",X"DD",X"71",X"05",X"DD", + X"36",X"0E",X"1E",X"3A",X"C8",X"92",X"DD",X"77",X"0F",X"C3",X"86",X"0B",X"3A",X"AA",X"92",X"4F", + X"3A",X"1D",X"90",X"3D",X"A1",X"18",X"C3",X"4F",X"E6",X"0F",X"DD",X"77",X"0A",X"79",X"07",X"07", + X"07",X"07",X"E6",X"0F",X"23",X"DD",X"77",X"0B",X"7E",X"23",X"DD",X"CB",X"13",X"7E",X"28",X"02", + X"ED",X"44",X"DD",X"77",X"0C",X"7E",X"23",X"DD",X"77",X"0D",X"DD",X"75",X"08",X"DD",X"74",X"09", + X"DD",X"CB",X"13",X"76",X"28",X"22",X"DD",X"7E",X"01",X"DD",X"96",X"06",X"28",X"08",X"F2",X"13", + X"0C",X"ED",X"44",X"3D",X"20",X"12",X"DD",X"7E",X"03",X"DD",X"96",X"07",X"CA",X"07",X"0E",X"F2", + X"24",X"0C",X"ED",X"44",X"3D",X"CA",X"07",X"0E",X"DD",X"CB",X"13",X"6E",X"28",X"13",X"DD",X"7E", + X"01",X"DD",X"96",X"06",X"28",X"03",X"3C",X"20",X"08",X"DD",X"36",X"0D",X"01",X"DD",X"CB",X"13", + X"AE",X"DD",X"46",X"0C",X"DD",X"7E",X"04",X"5F",X"80",X"DD",X"77",X"04",X"DD",X"56",X"05",X"2E", + X"01",X"CB",X"78",X"28",X"02",X"2E",X"FF",X"1F",X"A8",X"7A",X"F2",X"5E",X"0C",X"85",X"DD",X"77", + X"05",X"7B",X"4A",X"CB",X"41",X"28",X"01",X"2F",X"C6",X"15",X"30",X"04",X"06",X"06",X"18",X"0C", + X"CB",X"3F",X"47",X"CB",X"38",X"80",X"07",X"07",X"07",X"E6",X"07",X"47",X"26",X"8B",X"DD",X"6E", + X"10",X"7E",X"E6",X"F8",X"B0",X"77",X"26",X"9B",X"79",X"CB",X"09",X"A9",X"3C",X"CB",X"09",X"17", + X"E6",X"03",X"77",X"3A",X"A0",X"92",X"E6",X"01",X"28",X"05",X"DD",X"7E",X"0A",X"18",X"03",X"DD", + X"7E",X"0B",X"A7",X"CA",X"FE",X"0C",X"E5",X"DD",X"E5",X"E1",X"47",X"7A",X"E6",X"03",X"57",X"CB", + X"03",X"CB",X"12",X"D5",X"AA",X"0F",X"38",X"02",X"2C",X"2C",X"14",X"CB",X"52",X"78",X"28",X"02", + X"ED",X"44",X"4F",X"CB",X"29",X"30",X"04",X"7E",X"C6",X"80",X"77",X"2C",X"7E",X"89",X"77",X"2D", + X"EB",X"7B",X"EE",X"02",X"5F",X"E1",X"CB",X"3D",X"30",X"04",X"7D",X"EE",X"7F",X"6F",X"78",X"44", + X"26",X"00",X"CD",X"96",X"0E",X"78",X"EE",X"02",X"3D",X"CB",X"57",X"28",X"08",X"44",X"4D",X"21", + X"00",X"00",X"A7",X"ED",X"42",X"EB",X"7B",X"86",X"77",X"2C",X"7A",X"8E",X"77",X"E1",X"3A",X"15", + X"92",X"4F",X"26",X"93",X"DD",X"56",X"03",X"3E",X"7F",X"DD",X"BE",X"02",X"7A",X"17",X"CB",X"41", + X"28",X"03",X"C6",X"0D",X"2F",X"DD",X"CB",X"13",X"76",X"28",X"03",X"DD",X"86",X"11",X"77",X"2C", + X"DD",X"46",X"01",X"3E",X"7F",X"DD",X"BE",X"00",X"CB",X"13",X"78",X"CB",X"41",X"20",X"04",X"C6", + X"4F",X"2F",X"1D",X"CB",X"1B",X"17",X"CB",X"13",X"DD",X"CB",X"13",X"76",X"28",X"0D",X"DD",X"86", + X"12",X"57",X"1F",X"DD",X"AE",X"12",X"07",X"7A",X"30",X"01",X"1C",X"77",X"26",X"9B",X"CB",X"0E", + X"CB",X"0B",X"CB",X"16",X"DD",X"35",X"0E",X"C2",X"FA",X"0D",X"DD",X"CB",X"0F",X"3E",X"D2",X"F4", + X"0D",X"DD",X"7E",X"01",X"FE",X"4C",X"DA",X"F4",X"0D",X"3A",X"15",X"90",X"A7",X"CA",X"F4",X"0D", + X"3A",X"AD",X"92",X"A7",X"C2",X"F4",X"0D",X"EB",X"21",X"68",X"88",X"06",X"08",X"7E",X"FE",X"80", + X"28",X"06",X"2C",X"2C",X"10",X"F7",X"18",X"6C",X"36",X"06",X"26",X"9B",X"36",X"01",X"E5",X"26", + X"93",X"54",X"1D",X"1A",X"4F",X"77",X"1C",X"2C",X"1A",X"47",X"77",X"26",X"9B",X"54",X"1A",X"CB", + X"0E",X"0F",X"CB",X"16",X"07",X"CB",X"18",X"3A",X"62",X"93",X"91",X"F5",X"30",X"02",X"ED",X"44", + X"67",X"3A",X"15",X"92",X"A7",X"3E",X"95",X"28",X"02",X"3E",X"1C",X"90",X"30",X"02",X"ED",X"44", + X"CD",X"A9",X"0E",X"44",X"4D",X"CB",X"3C",X"CB",X"1D",X"CB",X"3C",X"CB",X"1D",X"09",X"CB",X"3C", + X"CB",X"1D",X"CB",X"3C",X"CB",X"1D",X"7C",X"A7",X"20",X"05",X"7D",X"FE",X"60",X"38",X"02",X"3E", + X"60",X"47",X"F1",X"CB",X"18",X"E1",X"7D",X"C6",X"08",X"E6",X"0F",X"21",X"B0",X"92",X"85",X"6F", + X"70",X"23",X"36",X"00",X"3A",X"E2",X"92",X"DD",X"77",X"0E",X"21",X"89",X"92",X"35",X"C8",X"11", + X"14",X"00",X"DD",X"19",X"C3",X"E4",X"08",X"AF",X"DD",X"CB",X"13",X"86",X"DD",X"77",X"00",X"DD", + X"77",X"02",X"26",X"88",X"DD",X"6E",X"10",X"36",X"02",X"26",X"8B",X"2C",X"7E",X"2D",X"3C",X"E6", + X"07",X"FE",X"05",X"38",X"14",X"3A",X"2E",X"98",X"4F",X"E6",X"F8",X"C6",X"06",X"77",X"2C",X"79", + X"E6",X"07",X"77",X"2D",X"3E",X"01",X"32",X"2D",X"98",X"DD",X"7E",X"06",X"DD",X"77",X"01",X"DD", + X"7E",X"07",X"DD",X"77",X"03",X"C3",X"FE",X"0C",X"26",X"88",X"DD",X"6E",X"10",X"36",X"80",X"26", + X"93",X"36",X"00",X"DD",X"36",X"13",X"00",X"C3",X"FA",X"0D",X"C5",X"D5",X"7B",X"95",X"06",X"00", + X"30",X"04",X"CB",X"C0",X"ED",X"44",X"4F",X"7A",X"94",X"30",X"0A",X"57",X"78",X"EE",X"01",X"F6", + X"02",X"47",X"7A",X"ED",X"44",X"B9",X"F5",X"17",X"A8",X"1F",X"3F",X"CB",X"10",X"F1",X"30",X"03", + X"51",X"4F",X"7A",X"61",X"2E",X"00",X"CD",X"A9",X"0E",X"7C",X"A8",X"E6",X"01",X"28",X"03",X"7D", + X"2F",X"6F",X"60",X"D1",X"C1",X"C9",X"D5",X"EB",X"21",X"00",X"00",X"CB",X"3F",X"30",X"01",X"19", + X"CB",X"23",X"CB",X"12",X"A7",X"20",X"F4",X"D1",X"C9",X"C5",X"4F",X"AF",X"06",X"11",X"8F",X"38", + X"0B",X"B9",X"38",X"01",X"91",X"3F",X"ED",X"6A",X"10",X"F4",X"C1",X"C9",X"91",X"37",X"C3",X"B6", + X"0E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3A",X"06",X"68",X"E6",X"02",X"C0", + X"21",X"FF",X"10",X"7E",X"2E",X"DF",X"4E",X"7E",X"A9",X"CB",X"67",X"20",X"01",X"C7",X"11",X"F7", + X"89",X"21",X"F6",X"89",X"01",X"13",X"00",X"ED",X"B8",X"DD",X"21",X"D5",X"0F",X"1E",X"E0",X"01", + X"04",X"05",X"DD",X"7E",X"00",X"DD",X"23",X"6F",X"26",X"10",X"7E",X"7B",X"81",X"5F",X"7E",X"12", + X"10",X"F0",X"06",X"05",X"21",X"E4",X"89",X"7E",X"2C",X"B6",X"2C",X"2F",X"A6",X"2C",X"A6",X"2C", + X"E6",X"0F",X"20",X"04",X"10",X"F1",X"18",X"40",X"05",X"28",X"4F",X"05",X"CB",X"20",X"CB",X"20", + X"0F",X"38",X"03",X"04",X"18",X"FA",X"3A",X"E0",X"89",X"CB",X"3F",X"5F",X"CB",X"11",X"C6",X"E1", + X"6F",X"26",X"89",X"7E",X"CB",X"41",X"28",X"04",X"07",X"07",X"07",X"07",X"E6",X"F0",X"B0",X"CB", + X"41",X"28",X"04",X"07",X"07",X"07",X"07",X"77",X"3A",X"E0",X"89",X"A7",X"20",X"02",X"3E",X"02", + X"3D",X"32",X"E0",X"89",X"7B",X"A7",X"28",X"09",X"2A",X"E2",X"89",X"7E",X"32",X"E1",X"89",X"18", + X"42",X"2A",X"E2",X"89",X"3A",X"E1",X"89",X"77",X"18",X"39",X"4F",X"21",X"E0",X"89",X"CB",X"41", + X"20",X"2D",X"7E",X"CB",X"3F",X"28",X"13",X"CB",X"59",X"20",X"0C",X"7E",X"FE",X"05",X"30",X"03", + X"34",X"18",X"D5",X"36",X"05",X"18",X"D1",X"35",X"18",X"CE",X"2A",X"E2",X"89",X"CB",X"59",X"20", + X"03",X"2B",X"18",X"01",X"23",X"22",X"E2",X"89",X"3E",X"01",X"32",X"E0",X"89",X"18",X"B9",X"36", + X"05",X"18",X"B5",X"21",X"CA",X"83",X"11",X"E1",X"89",X"06",X"03",X"1A",X"1C",X"CD",X"C6",X"0F", + X"10",X"F9",X"21",X"CA",X"87",X"3A",X"E0",X"89",X"06",X"06",X"A7",X"4F",X"28",X"02",X"0E",X"01", + X"71",X"2C",X"3D",X"10",X"F5",X"C9",X"4F",X"E6",X"0F",X"77",X"2C",X"79",X"07",X"07",X"07",X"07", + X"E6",X"0F",X"77",X"2C",X"C9",X"FD",X"FB",X"F7",X"EF",X"FE",X"23",X"00",X"1B",X"23",X"F0",X"40", + X"23",X"00",X"09",X"23",X"05",X"11",X"23",X"00",X"10",X"23",X"10",X"40",X"23",X"04",X"30",X"FF", + X"23",X"02",X"35",X"23",X"08",X"10",X"23",X"10",X"3C",X"23",X"00",X"FF",X"FF",X"AC",X"FF",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/galaga_cpu3.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/galaga_cpu3.vhd new file mode 100644 index 00000000..d8dd82f2 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/galaga_cpu3.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity galaga_cpu3 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of galaga_cpu3 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"31",X"00",X"9B",X"C3",X"7B",X"00",X"FF",X"FF",X"87",X"30",X"05",X"24",X"18",X"02",X"FF",X"FF", + X"85",X"6F",X"D0",X"24",X"C9",X"FF",X"FF",X"FF",X"77",X"23",X"10",X"FC",X"C9",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F5",X"C5",X"D5",X"E5",X"3E",X"01",X"32",X"22",X"68",X"AF", + X"32",X"22",X"68",X"CD",X"B1",X"00",X"E1",X"D1",X"C1",X"F1",X"C9",X"3E",X"01",X"32",X"22",X"68", + X"11",X"01",X"91",X"1A",X"A7",X"20",X"FC",X"67",X"6F",X"01",X"10",X"00",X"86",X"23",X"10",X"FC", + X"0D",X"20",X"F9",X"FE",X"FF",X"28",X"02",X"3E",X"21",X"12",X"1A",X"A7",X"20",X"FC",X"AF",X"32", + X"22",X"68",X"21",X"00",X"9A",X"36",X"00",X"11",X"01",X"9A",X"01",X"FF",X"00",X"ED",X"B0",X"18", + X"FE",X"3A",X"B8",X"9A",X"A7",X"C2",X"A1",X"06",X"21",X"60",X"9A",X"36",X"00",X"11",X"61",X"9A", + X"01",X"0F",X"00",X"ED",X"B0",X"3A",X"B7",X"9A",X"A7",X"C2",X"42",X"03",X"3A",X"79",X"9A",X"A7", + X"28",X"09",X"21",X"A8",X"9A",X"86",X"77",X"AF",X"32",X"79",X"9A",X"3A",X"A0",X"9A",X"A7",X"28", + X"6F",X"3A",X"11",X"92",X"21",X"80",X"9A",X"BE",X"28",X"20",X"32",X"80",X"9A",X"3C",X"28",X"0C", + X"21",X"EA",X"06",X"22",X"82",X"9A",X"AF",X"32",X"00",X"9A",X"18",X"09",X"21",X"FA",X"06",X"22", + X"82",X"9A",X"32",X"00",X"9A",X"32",X"81",X"9A",X"18",X"12",X"21",X"00",X"9A",X"34",X"7E",X"FE", + X"22",X"20",X"1E",X"36",X"00",X"3A",X"81",X"9A",X"3C",X"32",X"81",X"9A",X"2A",X"82",X"9A",X"CF", + X"5E",X"23",X"56",X"ED",X"53",X"84",X"9A",X"3E",X"1F",X"D7",X"5E",X"23",X"56",X"ED",X"53",X"86", + X"9A",X"2A",X"86",X"9A",X"ED",X"5B",X"84",X"9A",X"19",X"22",X"86",X"9A",X"7C",X"32",X"61",X"9A", + X"0F",X"0F",X"0F",X"0F",X"32",X"62",X"9A",X"3E",X"0A",X"32",X"65",X"9A",X"AF",X"32",X"70",X"9A", + X"21",X"74",X"9A",X"36",X"13",X"3A",X"B3",X"9A",X"A7",X"28",X"09",X"AF",X"32",X"B3",X"9A",X"CD", + X"F9",X"03",X"18",X"09",X"3A",X"D3",X"9A",X"A7",X"28",X"03",X"CD",X"4F",X"04",X"21",X"74",X"9A", + X"36",X"0F",X"3A",X"AF",X"9A",X"A7",X"28",X"09",X"AF",X"32",X"AF",X"9A",X"CD",X"F9",X"03",X"18", + X"09",X"3A",X"CF",X"9A",X"A7",X"28",X"03",X"CD",X"4F",X"04",X"21",X"74",X"9A",X"36",X"03",X"3A", + X"A3",X"9A",X"A7",X"28",X"09",X"AF",X"32",X"A3",X"9A",X"CD",X"F9",X"03",X"18",X"09",X"3A",X"C3", + X"9A",X"A7",X"28",X"03",X"CD",X"4F",X"04",X"21",X"74",X"9A",X"36",X"02",X"3A",X"A2",X"9A",X"A7", + X"28",X"09",X"AF",X"32",X"A2",X"9A",X"CD",X"F9",X"03",X"18",X"09",X"3A",X"C2",X"9A",X"A7",X"28", + X"03",X"CD",X"4F",X"04",X"21",X"74",X"9A",X"36",X"04",X"3A",X"A4",X"9A",X"A7",X"28",X"09",X"AF", + X"32",X"A4",X"9A",X"CD",X"F9",X"03",X"18",X"09",X"3A",X"C4",X"9A",X"A7",X"28",X"03",X"CD",X"4F", + X"04",X"21",X"74",X"9A",X"36",X"01",X"3A",X"A1",X"9A",X"A7",X"28",X"09",X"AF",X"32",X"A1",X"9A", + X"CD",X"F9",X"03",X"18",X"09",X"3A",X"C1",X"9A",X"A7",X"28",X"03",X"CD",X"4F",X"04",X"3A",X"B2", + X"9A",X"A7",X"28",X"08",X"21",X"74",X"9A",X"36",X"12",X"CD",X"A7",X"04",X"3A",X"A5",X"9A",X"A7", + X"28",X"2C",X"21",X"74",X"9A",X"36",X"05",X"CD",X"7A",X"03",X"21",X"7E",X"9A",X"34",X"3A",X"7E", + X"9A",X"FE",X"06",X"38",X"11",X"36",X"00",X"3A",X"7C",X"9A",X"FE",X"04",X"38",X"03",X"3D",X"18", + X"02",X"3E",X"0C",X"32",X"7C",X"9A",X"3A",X"7C",X"9A",X"32",X"6F",X"9A",X"18",X"03",X"32",X"C5", + X"9A",X"3A",X"A6",X"9A",X"A7",X"28",X"24",X"21",X"74",X"9A",X"36",X"06",X"CD",X"7A",X"03",X"21", + X"7F",X"9A",X"34",X"7E",X"FE",X"1C",X"20",X"0B",X"AF",X"32",X"7F",X"9A",X"3A",X"7D",X"9A",X"3C", + X"32",X"7D",X"9A",X"3A",X"7D",X"9A",X"32",X"70",X"9A",X"18",X"03",X"32",X"C6",X"9A",X"3A",X"A9", + X"9A",X"A7",X"28",X"0A",X"21",X"74",X"9A",X"36",X"09",X"CD",X"7A",X"03",X"18",X"03",X"32",X"C9", + X"9A",X"3A",X"A7",X"9A",X"A7",X"28",X"0B",X"21",X"74",X"9A",X"36",X"07",X"CD",X"A7",X"04",X"C3", + X"32",X"03",X"3A",X"B1",X"9A",X"A7",X"28",X"0A",X"21",X"74",X"9A",X"36",X"11",X"CD",X"7A",X"03", + X"18",X"03",X"32",X"D1",X"9A",X"3A",X"AD",X"9A",X"A7",X"28",X"08",X"21",X"74",X"9A",X"36",X"0D", + X"CD",X"A7",X"04",X"3A",X"AE",X"9A",X"A7",X"28",X"12",X"21",X"74",X"9A",X"36",X"0E",X"CD",X"A7", + X"04",X"3E",X"09",X"32",X"6A",X"9A",X"3E",X"06",X"32",X"6F",X"9A",X"3A",X"B4",X"9A",X"A7",X"28", + X"08",X"21",X"74",X"9A",X"36",X"14",X"CD",X"A7",X"04",X"3A",X"B5",X"9A",X"A7",X"28",X"08",X"21", + X"74",X"9A",X"36",X"15",X"CD",X"A7",X"04",X"3A",X"AA",X"9A",X"A7",X"28",X"08",X"21",X"74",X"9A", + X"36",X"0A",X"CD",X"A7",X"04",X"3A",X"AB",X"9A",X"A7",X"28",X"08",X"21",X"74",X"9A",X"36",X"0B", + X"CD",X"A7",X"04",X"3A",X"B0",X"9A",X"A7",X"28",X"0A",X"21",X"74",X"9A",X"36",X"10",X"CD",X"7A", + X"03",X"18",X"03",X"32",X"D0",X"9A",X"3A",X"AC",X"9A",X"A7",X"28",X"08",X"21",X"74",X"9A",X"36", + X"0C",X"CD",X"A7",X"04",X"3A",X"B6",X"9A",X"A7",X"28",X"08",X"21",X"74",X"9A",X"36",X"16",X"CD", + X"A7",X"04",X"3A",X"A8",X"9A",X"A7",X"28",X"08",X"21",X"74",X"9A",X"36",X"08",X"CD",X"A7",X"04", + X"18",X"1A",X"21",X"A0",X"9A",X"36",X"00",X"11",X"A1",X"9A",X"01",X"15",X"00",X"ED",X"B0",X"21", + X"C0",X"9A",X"36",X"00",X"11",X"C1",X"9A",X"01",X"16",X"00",X"ED",X"B0",X"21",X"60",X"9A",X"11", + X"10",X"68",X"01",X"10",X"00",X"ED",X"B0",X"3A",X"70",X"9A",X"32",X"05",X"68",X"3A",X"71",X"9A", + X"32",X"0A",X"68",X"3A",X"72",X"9A",X"32",X"0F",X"68",X"C9",X"21",X"74",X"9A",X"7E",X"87",X"86", + X"21",X"2A",X"07",X"D7",X"11",X"75",X"9A",X"01",X"03",X"00",X"ED",X"B0",X"3A",X"74",X"9A",X"FE", + X"0E",X"20",X"18",X"3A",X"4C",X"9A",X"A7",X"28",X"0D",X"3D",X"28",X"06",X"3A",X"4D",X"9A",X"A7", + X"20",X"09",X"3E",X"02",X"18",X"02",X"3E",X"01",X"32",X"76",X"9A",X"21",X"C0",X"9A",X"3A",X"74", + X"9A",X"85",X"6F",X"7E",X"A7",X"20",X"1B",X"34",X"21",X"76",X"9A",X"46",X"48",X"21",X"30",X"9A", + X"3A",X"75",X"9A",X"85",X"6F",X"AF",X"DF",X"41",X"21",X"00",X"9A",X"3A",X"75",X"9A",X"85",X"6F", + X"AF",X"DF",X"CD",X"77",X"05",X"21",X"76",X"9A",X"35",X"28",X"0A",X"21",X"75",X"9A",X"34",X"21", + X"77",X"9A",X"34",X"18",X"ED",X"3A",X"78",X"9A",X"A7",X"C8",X"AF",X"32",X"78",X"9A",X"21",X"C0", + X"9A",X"3A",X"74",X"9A",X"85",X"6F",X"36",X"00",X"C9",X"21",X"C0",X"9A",X"3A",X"74",X"9A",X"85", + X"6F",X"34",X"21",X"74",X"9A",X"7E",X"87",X"86",X"21",X"2A",X"07",X"D7",X"11",X"75",X"9A",X"01", + X"03",X"00",X"ED",X"B0",X"3A",X"74",X"9A",X"FE",X"0E",X"20",X"18",X"3A",X"4C",X"9A",X"A7",X"28", + X"0D",X"3D",X"28",X"06",X"3A",X"4D",X"9A",X"A7",X"20",X"09",X"3E",X"02",X"18",X"02",X"3E",X"01", + X"32",X"76",X"9A",X"21",X"76",X"9A",X"46",X"48",X"21",X"30",X"9A",X"3A",X"75",X"9A",X"85",X"6F", + X"AF",X"DF",X"41",X"21",X"00",X"9A",X"3A",X"75",X"9A",X"85",X"6F",X"AF",X"DF",X"18",X"31",X"21", + X"74",X"9A",X"7E",X"87",X"86",X"21",X"2A",X"07",X"D7",X"11",X"75",X"9A",X"01",X"03",X"00",X"ED", + X"B0",X"3A",X"74",X"9A",X"FE",X"0E",X"20",X"18",X"3A",X"4C",X"9A",X"A7",X"28",X"0D",X"3D",X"28", + X"06",X"3A",X"4D",X"9A",X"A7",X"20",X"09",X"3E",X"02",X"18",X"02",X"3E",X"01",X"32",X"76",X"9A", + X"CD",X"77",X"05",X"21",X"76",X"9A",X"35",X"28",X"0A",X"21",X"75",X"9A",X"34",X"21",X"77",X"9A", + X"34",X"18",X"ED",X"3A",X"78",X"9A",X"A7",X"C8",X"AF",X"32",X"78",X"9A",X"21",X"C0",X"9A",X"3A", + X"74",X"9A",X"85",X"6F",X"36",X"00",X"C9",X"21",X"74",X"9A",X"7E",X"87",X"86",X"21",X"2A",X"07", + X"D7",X"11",X"75",X"9A",X"01",X"03",X"00",X"ED",X"B0",X"3A",X"74",X"9A",X"FE",X"0E",X"20",X"18", + X"3A",X"4C",X"9A",X"A7",X"28",X"0D",X"3D",X"28",X"06",X"3A",X"4D",X"9A",X"A7",X"20",X"09",X"3E", + X"02",X"18",X"02",X"3E",X"01",X"32",X"76",X"9A",X"21",X"C0",X"9A",X"3A",X"74",X"9A",X"85",X"6F", + X"7E",X"A7",X"20",X"1B",X"34",X"21",X"76",X"9A",X"46",X"48",X"21",X"30",X"9A",X"3A",X"75",X"9A", + X"85",X"6F",X"AF",X"DF",X"41",X"21",X"00",X"9A",X"3A",X"75",X"9A",X"85",X"6F",X"AF",X"DF",X"CD", + X"77",X"05",X"21",X"76",X"9A",X"35",X"28",X"0A",X"21",X"75",X"9A",X"34",X"21",X"77",X"9A",X"34", + X"18",X"ED",X"3A",X"78",X"9A",X"A7",X"C8",X"AF",X"32",X"78",X"9A",X"21",X"C0",X"9A",X"3A",X"74", + X"9A",X"85",X"6F",X"36",X"00",X"21",X"A0",X"9A",X"3A",X"74",X"9A",X"85",X"6F",X"3A",X"74",X"9A", + X"FE",X"08",X"28",X"0F",X"FE",X"0C",X"28",X"0D",X"FE",X"14",X"28",X"15",X"FE",X"07",X"28",X"19", + X"36",X"00",X"C9",X"35",X"C9",X"35",X"28",X"03",X"CB",X"46",X"C8",X"3E",X"01",X"32",X"B6",X"9A", + X"C9",X"36",X"00",X"21",X"B3",X"9A",X"36",X"01",X"C9",X"36",X"00",X"21",X"A0",X"9A",X"AF",X"06", + X"08",X"DF",X"23",X"77",X"23",X"23",X"06",X"0C",X"DF",X"21",X"C0",X"9A",X"06",X"08",X"DF",X"23", + X"77",X"23",X"23",X"06",X"0C",X"DF",X"C9",X"21",X"00",X"9A",X"3A",X"75",X"9A",X"85",X"6F",X"34", + X"3A",X"75",X"9A",X"21",X"6F",X"07",X"CF",X"5E",X"23",X"56",X"EB",X"11",X"88",X"9A",X"01",X"03", + X"00",X"ED",X"B0",X"EB",X"21",X"30",X"9A",X"3A",X"75",X"9A",X"85",X"6F",X"7E",X"EB",X"D7",X"22", + X"7A",X"9A",X"7E",X"3C",X"CA",X"B2",X"06",X"11",X"D0",X"06",X"2A",X"7A",X"9A",X"7E",X"E6",X"0F", + X"EB",X"CF",X"4E",X"23",X"46",X"EB",X"7E",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"28",X"07",X"CB", + X"38",X"CB",X"19",X"3D",X"20",X"F9",X"3A",X"77",X"9A",X"A7",X"28",X"0D",X"3D",X"28",X"05",X"21", + X"6B",X"9A",X"18",X"08",X"21",X"66",X"9A",X"18",X"03",X"21",X"61",X"9A",X"71",X"7E",X"0F",X"0F", + X"0F",X"0F",X"23",X"77",X"23",X"70",X"7E",X"0F",X"0F",X"0F",X"0F",X"23",X"77",X"3A",X"77",X"9A", + X"A7",X"28",X"0D",X"3D",X"28",X"05",X"11",X"6F",X"9A",X"18",X"08",X"11",X"6A",X"9A",X"18",X"03", + X"11",X"65",X"9A",X"2A",X"7A",X"9A",X"7E",X"D6",X"0C",X"28",X"44",X"3A",X"88",X"9A",X"A7",X"28", + X"23",X"3D",X"28",X"10",X"21",X"00",X"9A",X"3A",X"75",X"9A",X"85",X"6F",X"7E",X"FE",X"06",X"30", + X"13",X"2F",X"18",X"30",X"21",X"00",X"9A",X"3A",X"75",X"9A",X"85",X"6F",X"7E",X"FE",X"06",X"30", + X"03",X"87",X"18",X"20",X"3A",X"89",X"9A",X"A7",X"28",X"18",X"47",X"21",X"00",X"9A",X"3A",X"75", + X"9A",X"85",X"6F",X"7E",X"90",X"38",X"0B",X"D6",X"0A",X"30",X"04",X"ED",X"44",X"18",X"05",X"AF", + X"18",X"02",X"3E",X"0A",X"12",X"21",X"70",X"9A",X"3A",X"77",X"9A",X"85",X"6F",X"3A",X"8A",X"9A", + X"77",X"21",X"CD",X"07",X"3A",X"74",X"9A",X"D7",X"7E",X"2A",X"7A",X"9A",X"23",X"5E",X"16",X"00", + X"21",X"00",X"00",X"06",X"08",X"CB",X"3F",X"30",X"01",X"19",X"CB",X"23",X"CB",X"12",X"10",X"F5", + X"45",X"21",X"00",X"9A",X"3A",X"75",X"9A",X"85",X"6F",X"78",X"BE",X"C0",X"21",X"30",X"9A",X"3A", + X"75",X"9A",X"85",X"6F",X"34",X"34",X"21",X"00",X"9A",X"3A",X"75",X"9A",X"85",X"6F",X"36",X"00", + X"C9",X"21",X"00",X"9A",X"36",X"00",X"11",X"01",X"9A",X"01",X"FF",X"00",X"ED",X"B0",X"31",X"00", + X"9B",X"C9",X"3A",X"77",X"9A",X"A7",X"28",X"0D",X"3D",X"28",X"05",X"21",X"6F",X"9A",X"18",X"08", + X"21",X"6A",X"9A",X"18",X"03",X"21",X"65",X"9A",X"36",X"00",X"3E",X"01",X"32",X"78",X"9A",X"C9", + X"50",X"81",X"00",X"89",X"26",X"91",X"C8",X"99",X"EC",X"A2",X"9D",X"AC",X"E0",X"B6",X"C0",X"C1", + X"45",X"CD",X"7A",X"D9",X"69",X"E6",X"1C",X"F4",X"00",X"00",X"30",X"01",X"68",X"01",X"36",X"01", + X"A8",X"01",X"68",X"01",X"00",X"02",X"AC",X"01",X"08",X"02",X"00",X"FE",X"58",X"FE",X"08",X"FE", + X"98",X"FE",X"58",X"FE",X"D0",X"FE",X"98",X"FE",X"D6",X"FE",X"00",X"5B",X"00",X"6C",X"00",X"5B", + X"00",X"7E",X"00",X"6C",X"00",X"97",X"00",X"81",X"00",X"99",X"00",X"D9",X"00",X"B6",X"00",X"D9", + X"00",X"97",X"00",X"B6",X"00",X"7E",X"00",X"99",X"00",X"81",X"00",X"01",X"00",X"01",X"01",X"01", + X"02",X"01",X"01",X"03",X"01",X"01",X"04",X"01",X"01",X"05",X"01",X"00",X"06",X"01",X"00",X"20", + X"03",X"00",X"0A",X"03",X"00",X"0D",X"03",X"00",X"07",X"03",X"00",X"13",X"03",X"00",X"16",X"03", + X"00",X"19",X"03",X"00",X"1C",X"03",X"00",X"1F",X"01",X"02",X"2C",X"03",X"00",X"10",X"03",X"00", + X"23",X"01",X"00",X"24",X"01",X"00",X"25",X"03",X"00",X"28",X"01",X"00",X"29",X"03",X"00",X"E4", + X"07",X"3B",X"08",X"19",X"08",X"E5",X"07",X"85",X"08",X"9F",X"08",X"B3",X"08",X"F9",X"09",X"09", + X"0A",X"19",X"0A",X"C3",X"09",X"D5",X"09",X"E7",X"09",X"29",X"0A",X"6D",X"0A",X"B1",X"0A",X"DD", + X"0A",X"21",X"0B",X"65",X"0B",X"C7",X"08",X"13",X"09",X"5D",X"09",X"83",X"0C",X"11",X"0D",X"5F", + X"0D",X"8D",X"09",X"9F",X"09",X"B1",X"09",X"C7",X"08",X"C7",X"08",X"C7",X"08",X"2F",X"0C",X"91", + X"0B",X"C7",X"0B",X"FD",X"0B",X"1B",X"0C",X"2F",X"0C",X"93",X"0D",X"07",X"0E",X"83",X"0E",X"85", + X"0D",X"07",X"0D",X"55",X"0D",X"7B",X"0D",X"C5",X"0E",X"01",X"0F",X"3D",X"0F",X"04",X"02",X"02", + X"02",X"02",X"04",X"04",X"0A",X"07",X"0C",X"0B",X"04",X"0A",X"0D",X"04",X"01",X"04",X"0C",X"02", + X"06",X"05",X"02",X"0A",X"FF",X"00",X"00",X"06",X"71",X"01",X"72",X"01",X"73",X"01",X"75",X"01", + X"74",X"01",X"73",X"01",X"72",X"01",X"71",X"01",X"70",X"01",X"8B",X"01",X"8A",X"01",X"0C",X"04", + X"86",X"01",X"87",X"01",X"88",X"01",X"89",X"01",X"8A",X"01",X"89",X"01",X"88",X"01",X"87",X"01", + X"86",X"01",X"85",X"01",X"84",X"01",X"83",X"01",X"FF",X"00",X"00",X"04",X"88",X"01",X"8A",X"01", + X"70",X"01",X"71",X"01",X"73",X"01",X"75",X"01",X"77",X"01",X"78",X"01",X"0C",X"06",X"74",X"01", + X"73",X"01",X"72",X"01",X"71",X"01",X"70",X"01",X"8B",X"01",X"FF",X"00",X"00",X"07",X"89",X"01", + X"8A",X"01",X"8B",X"01",X"0C",X"01",X"70",X"01",X"71",X"01",X"72",X"01",X"0C",X"01",X"73",X"01", + X"74",X"01",X"75",X"01",X"0C",X"03",X"8B",X"01",X"70",X"01",X"71",X"01",X"0C",X"01",X"72",X"01", + X"73",X"01",X"74",X"01",X"0C",X"01",X"75",X"01",X"76",X"01",X"77",X"01",X"0C",X"03",X"71",X"01", + X"72",X"01",X"73",X"01",X"0C",X"01",X"74",X"01",X"75",X"01",X"76",X"01",X"0C",X"01",X"77",X"01", + X"78",X"01",X"79",X"01",X"FF",X"00",X"00",X"05",X"71",X"01",X"72",X"01",X"73",X"01",X"0C",X"01", + X"74",X"01",X"75",X"01",X"76",X"01",X"0C",X"01",X"77",X"01",X"78",X"01",X"79",X"01",X"FF",X"00", + X"00",X"04",X"61",X"01",X"7A",X"01",X"60",X"01",X"78",X"01",X"7A",X"01",X"76",X"01",X"78",X"01", + X"75",X"01",X"FF",X"00",X"00",X"00",X"76",X"01",X"79",X"01",X"60",X"01",X"63",X"01",X"66",X"01", + X"63",X"01",X"60",X"01",X"79",X"01",X"FF",X"00",X"00",X"07",X"81",X"08",X"81",X"01",X"86",X"03", + X"88",X"09",X"8B",X"03",X"8A",X"09",X"86",X"03",X"88",X"09",X"73",X"03",X"71",X"09",X"86",X"03", + X"88",X"09",X"8B",X"03",X"8A",X"09",X"86",X"03",X"71",X"09",X"75",X"03",X"76",X"09",X"74",X"03", + X"72",X"09",X"71",X"03",X"8B",X"09",X"89",X"03",X"88",X"09",X"84",X"03",X"74",X"09",X"76",X"03", + X"74",X"09",X"71",X"03",X"73",X"04",X"8B",X"04",X"88",X"04",X"71",X"04",X"8A",X"04",X"88",X"04", + X"0C",X"10",X"FF",X"00",X"00",X"06",X"8A",X"09",X"81",X"03",X"88",X"09",X"83",X"03",X"86",X"09", + X"81",X"03",X"83",X"09",X"85",X"03",X"8A",X"09",X"81",X"03",X"88",X"09",X"83",X"03",X"86",X"09", + X"81",X"03",X"88",X"09",X"71",X"03",X"72",X"09",X"71",X"03",X"8B",X"09",X"89",X"03",X"88",X"09", + X"86",X"03",X"84",X"09",X"88",X"03",X"89",X"09",X"8B",X"03",X"89",X"09",X"86",X"03",X"8B",X"04", + X"88",X"04",X"83",X"04",X"88",X"04",X"85",X"04",X"83",X"04",X"0C",X"10",X"FF",X"00",X"00",X"07", + X"81",X"0C",X"83",X"09",X"86",X"03",X"85",X"0C",X"81",X"0C",X"86",X"0C",X"88",X"09",X"8B",X"03", + X"8A",X"0C",X"88",X"0C",X"89",X"0C",X"88",X"09",X"86",X"03",X"84",X"0C",X"89",X"0C",X"74",X"0C", + X"71",X"09",X"89",X"03",X"88",X"0C",X"71",X"09",X"8A",X"03",X"0C",X"10",X"FF",X"02",X"00",X"03", + X"78",X"02",X"0C",X"01",X"78",X"01",X"79",X"01",X"7B",X"01",X"61",X"03",X"0C",X"03",X"FF",X"02", + X"00",X"03",X"73",X"02",X"0C",X"01",X"73",X"01",X"74",X"01",X"76",X"01",X"78",X"03",X"0C",X"02", + X"FF",X"02",X"00",X"03",X"70",X"02",X"0C",X"01",X"70",X"01",X"71",X"01",X"73",X"01",X"75",X"03", + X"0C",X"02",X"FF",X"01",X"00",X"04",X"78",X"01",X"7A",X"01",X"63",X"01",X"78",X"01",X"7A",X"01", + X"63",X"01",X"65",X"03",X"FF",X"01",X"00",X"05",X"73",X"01",X"78",X"01",X"7A",X"01",X"73",X"01", + X"78",X"01",X"7A",X"01",X"60",X"03",X"FF",X"01",X"00",X"07",X"8A",X"01",X"73",X"01",X"78",X"01", + X"8A",X"01",X"73",X"01",X"78",X"01",X"7A",X"03",X"FF",X"01",X"06",X"04",X"7A",X"01",X"78",X"01", + X"7A",X"01",X"61",X"01",X"65",X"01",X"68",X"03",X"FF",X"01",X"06",X"04",X"78",X"01",X"75",X"01", + X"78",X"01",X"7A",X"01",X"61",X"01",X"65",X"03",X"FF",X"01",X"06",X"04",X"75",X"01",X"71",X"01", + X"75",X"01",X"78",X"01",X"7A",X"01",X"60",X"03",X"FF",X"02",X"04",X"03",X"7A",X"01",X"76",X"01", + X"78",X"01",X"75",X"01",X"76",X"01",X"73",X"01",X"75",X"01",X"72",X"01",X"73",X"01",X"8A",X"01", + X"8B",X"01",X"88",X"01",X"86",X"01",X"85",X"01",X"83",X"01",X"82",X"01",X"83",X"01",X"86",X"01", + X"85",X"01",X"88",X"01",X"86",X"01",X"8A",X"01",X"88",X"01",X"8B",X"01",X"8A",X"01",X"73",X"01", + X"72",X"01",X"73",X"01",X"75",X"01",X"8A",X"01",X"70",X"01",X"72",X"01",X"FF",X"02",X"04",X"03", + X"76",X"01",X"73",X"01",X"75",X"01",X"72",X"01",X"73",X"01",X"70",X"01",X"72",X"01",X"8A",X"01", + X"8B",X"01",X"86",X"01",X"88",X"01",X"85",X"01",X"83",X"01",X"82",X"01",X"80",X"01",X"9A",X"01", + X"9A",X"01",X"83",X"01",X"82",X"01",X"85",X"01",X"83",X"01",X"86",X"01",X"85",X"01",X"88",X"01", + X"86",X"01",X"8A",X"01",X"88",X"01",X"8B",X"01",X"8A",X"01",X"88",X"01",X"86",X"01",X"85",X"01", + X"FF",X"02",X"10",X"03",X"93",X"02",X"9A",X"02",X"83",X"03",X"9A",X"01",X"98",X"01",X"96",X"01", + X"95",X"01",X"93",X"02",X"95",X"03",X"96",X"02",X"98",X"02",X"9A",X"02",X"9B",X"02",X"9A",X"02", + X"98",X"01",X"96",X"01",X"95",X"01",X"92",X"01",X"93",X"01",X"95",X"01",X"FF",X"02",X"04",X"03", + X"7A",X"01",X"77",X"01",X"78",X"01",X"75",X"01",X"77",X"01",X"73",X"01",X"75",X"01",X"72",X"01", + X"73",X"01",X"8A",X"01",X"80",X"01",X"88",X"01",X"87",X"01",X"85",X"01",X"83",X"01",X"82",X"01", + X"83",X"01",X"87",X"01",X"85",X"01",X"88",X"01",X"87",X"01",X"8A",X"01",X"88",X"01",X"80",X"01", + X"8A",X"01",X"73",X"01",X"72",X"01",X"73",X"01",X"75",X"01",X"8A",X"01",X"70",X"01",X"72",X"01", + X"FF",X"02",X"04",X"03",X"77",X"01",X"73",X"01",X"75",X"01",X"72",X"01",X"73",X"01",X"70",X"01", + X"72",X"01",X"8A",X"01",X"80",X"01",X"87",X"01",X"88",X"01",X"85",X"01",X"83",X"01",X"82",X"01", + X"80",X"01",X"9A",X"01",X"9A",X"01",X"83",X"01",X"82",X"01",X"85",X"01",X"83",X"01",X"87",X"01", + X"85",X"01",X"88",X"01",X"87",X"01",X"8A",X"01",X"88",X"01",X"80",X"01",X"8A",X"01",X"88",X"01", + X"87",X"01",X"85",X"01",X"FF",X"02",X"10",X"03",X"93",X"02",X"9A",X"02",X"83",X"03",X"9A",X"01", + X"98",X"01",X"97",X"01",X"95",X"01",X"93",X"02",X"95",X"03",X"97",X"02",X"98",X"02",X"9A",X"02", + X"90",X"02",X"9A",X"02",X"98",X"01",X"97",X"01",X"95",X"01",X"92",X"01",X"93",X"01",X"95",X"01", + X"FF",X"02",X"04",X"03",X"7A",X"01",X"76",X"01",X"78",X"01",X"75",X"01",X"76",X"01",X"73",X"01", + X"75",X"01",X"72",X"01",X"73",X"01",X"8A",X"01",X"8A",X"01",X"88",X"01",X"86",X"01",X"85",X"01", + X"83",X"01",X"82",X"01",X"83",X"01",X"85",X"01",X"86",X"01",X"88",X"01",X"86",X"01",X"8A",X"01", + X"70",X"01",X"72",X"01",X"73",X"04",X"FF",X"02",X"04",X"03",X"76",X"01",X"73",X"01",X"75",X"01", + X"72",X"01",X"73",X"01",X"70",X"01",X"72",X"01",X"8A",X"01",X"8A",X"01",X"86",X"01",X"86",X"01", + X"85",X"01",X"83",X"01",X"82",X"01",X"80",X"01",X"9A",X"01",X"9A",X"01",X"8B",X"01",X"80",X"01", + X"82",X"01",X"83",X"01",X"85",X"01",X"86",X"01",X"88",X"01",X"8A",X"04",X"FF",X"02",X"10",X"03", + X"73",X"02",X"75",X"02",X"76",X"02",X"75",X"02",X"73",X"02",X"72",X"02",X"70",X"02",X"72",X"02", + X"73",X"02",X"8B",X"02",X"8A",X"02",X"86",X"02",X"83",X"04",X"FF",X"00",X"00",X"04",X"71",X"04", + X"73",X"04",X"71",X"04",X"73",X"04",X"76",X"04",X"78",X"04",X"76",X"04",X"78",X"04",X"FF",X"00", + X"00",X"06",X"56",X"01",X"55",X"01",X"54",X"01",X"53",X"01",X"52",X"01",X"51",X"01",X"50",X"01", + X"6B",X"01",X"6A",X"01",X"69",X"01",X"68",X"01",X"67",X"01",X"66",X"01",X"65",X"01",X"64",X"01", + X"63",X"01",X"62",X"01",X"61",X"01",X"60",X"01",X"7B",X"01",X"7A",X"01",X"79",X"01",X"78",X"01", + X"77",X"01",X"76",X"01",X"75",X"01",X"74",X"01",X"73",X"01",X"72",X"01",X"71",X"01",X"70",X"01", + X"8B",X"01",X"8A",X"01",X"89",X"01",X"88",X"01",X"87",X"01",X"86",X"01",X"85",X"01",X"84",X"01", + X"83",X"01",X"FF",X"02",X"04",X"05",X"60",X"01",X"78",X"01",X"75",X"01",X"71",X"01",X"60",X"01", + X"78",X"01",X"75",X"01",X"71",X"01",X"60",X"01",X"78",X"01",X"75",X"01",X"71",X"01",X"60",X"01", + X"78",X"01",X"75",X"01",X"71",X"01",X"60",X"01",X"78",X"01",X"75",X"01",X"71",X"01",X"60",X"01", + X"78",X"01",X"75",X"01",X"71",X"01",X"60",X"01",X"0C",X"01",X"78",X"01",X"7A",X"01",X"75",X"01", + X"78",X"01",X"73",X"01",X"75",X"01",X"61",X"01",X"7A",X"01",X"76",X"01",X"73",X"01",X"61",X"01", + X"7A",X"01",X"76",X"01",X"73",X"01",X"61",X"01",X"7A",X"01",X"76",X"01",X"73",X"01",X"61",X"01", + X"7A",X"01",X"76",X"01",X"73",X"01",X"61",X"01",X"79",X"01",X"76",X"01",X"73",X"01",X"61",X"01", + X"79",X"01",X"76",X"01",X"73",X"01",X"61",X"01",X"0C",X"01",X"79",X"01",X"61",X"01",X"78",X"01", + X"79",X"01",X"75",X"01",X"78",X"01",X"FF",X"02",X"02",X"05",X"60",X"01",X"60",X"01",X"60",X"01", + X"FF",X"02",X"04",X"05",X"61",X"02",X"78",X"02",X"78",X"02",X"61",X"02",X"78",X"02",X"78",X"02", + X"61",X"02",X"78",X"02",X"78",X"02",X"61",X"02",X"78",X"02",X"78",X"02",X"61",X"02",X"78",X"02", + X"7A",X"02",X"75",X"02",X"63",X"02",X"7A",X"02",X"7A",X"02",X"63",X"02",X"7A",X"02",X"7A",X"02", + X"63",X"02",X"7A",X"02",X"79",X"02",X"63",X"02",X"79",X"02",X"79",X"02",X"63",X"02",X"79",X"02", + X"76",X"02",X"73",X"02",X"FF",X"02",X"02",X"05",X"78",X"01",X"78",X"01",X"78",X"01",X"FF",X"02", + X"10",X"05",X"85",X"06",X"85",X"06",X"85",X"06",X"85",X"06",X"85",X"04",X"85",X"04",X"86",X"06", + X"86",X"06",X"86",X"06",X"86",X"06",X"86",X"04",X"86",X"04",X"FF",X"02",X"04",X"05",X"81",X"01", + X"81",X"01",X"81",X"01",X"FF",X"02",X"00",X"07",X"65",X"01",X"0C",X"01",X"61",X"01",X"0C",X"01", + X"63",X"01",X"FF",X"02",X"00",X"05",X"7A",X"05",X"0C",X"01",X"7A",X"01",X"0C",X"01",X"7A",X"03", + X"0C",X"01",X"78",X"07",X"0C",X"01",X"78",X"07",X"0C",X"01",X"78",X"03",X"0C",X"01",X"7B",X"05", + X"0C",X"01",X"7B",X"01",X"0C",X"01",X"7B",X"03",X"0C",X"01",X"7A",X"07",X"0C",X"01",X"7A",X"07", + X"0C",X"01",X"7A",X"03",X"0C",X"01",X"7B",X"01",X"0C",X"01",X"7B",X"01",X"0C",X"03",X"7B",X"01", + X"0C",X"01",X"7B",X"03",X"0C",X"01",X"61",X"01",X"0C",X"01",X"61",X"01",X"0C",X"03",X"61",X"01", + X"0C",X"01",X"61",X"03",X"0C",X"01",X"61",X"03",X"0C",X"01",X"61",X"03",X"0C",X"01",X"63",X"01", + X"0C",X"01",X"63",X"01",X"0C",X"03",X"63",X"01",X"0C",X"01",X"63",X"03",X"0C",X"01",X"63",X"03", + X"0C",X"01",X"63",X"03",X"0C",X"01",X"FF",X"02",X"00",X"03",X"86",X"02",X"8A",X"02",X"71",X"02", + X"76",X"02",X"86",X"02",X"8A",X"02",X"71",X"02",X"76",X"02",X"86",X"02",X"8A",X"02",X"71",X"02", + X"76",X"02",X"86",X"02",X"8A",X"02",X"71",X"02",X"76",X"02",X"86",X"02",X"8A",X"02",X"71",X"02", + X"76",X"02",X"86",X"02",X"8A",X"02",X"71",X"02",X"76",X"02",X"86",X"02",X"8A",X"02",X"71",X"02", + X"76",X"02",X"86",X"02",X"8A",X"02",X"71",X"02",X"76",X"02",X"77",X"01",X"0C",X"01",X"77",X"01", + X"0C",X"03",X"77",X"01",X"0C",X"01",X"77",X"03",X"0C",X"01",X"69",X"01",X"0C",X"01",X"69",X"01", + X"0C",X"03",X"69",X"01",X"0C",X"01",X"69",X"03",X"0C",X"01",X"69",X"03",X"0C",X"01",X"69",X"03", + X"0C",X"01",X"8B",X"02",X"73",X"02",X"76",X"02",X"7B",X"02",X"7B",X"02",X"76",X"02",X"73",X"02", + X"8B",X"02",X"FF",X"00",X"00",X"02",X"86",X"08",X"81",X"08",X"86",X"08",X"81",X"08",X"86",X"08", + X"81",X"08",X"86",X"08",X"81",X"08",X"82",X"01",X"0C",X"01",X"82",X"01",X"0C",X"03",X"82",X"01", + X"0C",X"01",X"82",X"03",X"0C",X"01",X"84",X"01",X"0C",X"01",X"84",X"01",X"0C",X"03",X"84",X"01", + X"0C",X"01",X"84",X"03",X"0C",X"01",X"84",X"03",X"0C",X"01",X"84",X"03",X"0C",X"01",X"7B",X"08", + X"76",X"04",X"8B",X"04",X"FF",X"00",X"0C",X"05",X"75",X"0C",X"71",X"0C",X"8A",X"0C",X"86",X"0C", + X"0C",X"09",X"75",X"03",X"71",X"09",X"8A",X"03",X"86",X"04",X"8A",X"04",X"71",X"04",X"89",X"04", + X"70",X"04",X"73",X"04",X"8B",X"0C",X"73",X"0C",X"76",X"0C",X"78",X"0C",X"0C",X"09",X"79",X"03", + X"76",X"09",X"72",X"03",X"8B",X"04",X"89",X"04",X"86",X"04",X"72",X"04",X"89",X"04",X"76",X"04", + X"FF",X"00",X"0C",X"05",X"71",X"0C",X"8A",X"0C",X"86",X"0C",X"85",X"0C",X"0C",X"09",X"81",X"03", + X"8A",X"09",X"86",X"03",X"85",X"04",X"86",X"04",X"8A",X"04",X"86",X"04",X"89",X"04",X"8B",X"04", + X"88",X"0C",X"8B",X"0C",X"73",X"0C",X"76",X"0C",X"0C",X"09",X"76",X"03",X"72",X"09",X"8B",X"03", + X"8A",X"04",X"86",X"04",X"82",X"04",X"8B",X"04",X"89",X"04",X"82",X"04",X"FF",X"00",X"00",X"03", + X"75",X"18",X"75",X"18",X"75",X"18",X"71",X"0C",X"75",X"0C",X"73",X"18",X"73",X"18",X"72",X"18", + X"76",X"0C",X"78",X"0C",X"FF",X"FB",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/sound_samples.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/sound_samples.vhd new file mode 100644 index 00000000..b983efbd --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/sound_samples.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity sound_samples is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(3 downto 0) +); +end entity; + +architecture prom of sound_samples is + type rom is array(0 to 255) of std_logic_vector(3 downto 0); + signal rom_data: rom := ( + X"7",X"9",X"A",X"B",X"C",X"D",X"D",X"E",X"E",X"E",X"D",X"D",X"C",X"B",X"A",X"9", + X"7",X"5",X"4",X"3",X"2",X"1",X"1",X"0",X"0",X"0",X"1",X"1",X"2",X"3",X"4",X"5", + X"7",X"9",X"A",X"B",X"7",X"D",X"D",X"7",X"E",X"7",X"D",X"D",X"7",X"B",X"A",X"9", + X"7",X"5",X"7",X"3",X"7",X"1",X"7",X"0",X"7",X"0",X"7",X"1",X"7",X"3",X"7",X"5", + X"E",X"E",X"E",X"E",X"E",X"E",X"E",X"E",X"E",X"E",X"E",X"E",X"E",X"E",X"E",X"E", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"B",X"D",X"E",X"D",X"C",X"A",X"8",X"8",X"8",X"A",X"C",X"D",X"E",X"D",X"B",X"8", + X"4",X"2",X"1",X"2",X"3",X"5",X"7",X"7",X"7",X"5",X"3",X"2",X"1",X"2",X"4",X"7", + X"7",X"A",X"C",X"D",X"E",X"D",X"C",X"A",X"7",X"4",X"2",X"1",X"0",X"1",X"2",X"4", + X"7",X"B",X"D",X"E",X"D",X"B",X"7",X"3",X"1",X"0",X"1",X"3",X"7",X"E",X"7",X"0", + X"7",X"E",X"C",X"9",X"C",X"E",X"A",X"7",X"C",X"F",X"D",X"8",X"A",X"B",X"7",X"2", + X"8",X"D",X"9",X"4",X"5",X"7",X"2",X"0",X"3",X"8",X"5",X"1",X"3",X"6",X"3",X"1", + X"7",X"8",X"A",X"C",X"E",X"D",X"C",X"C",X"B",X"A",X"8",X"7",X"5",X"6",X"7",X"8", + X"8",X"9",X"A",X"B",X"9",X"8",X"6",X"5",X"4",X"4",X"3",X"2",X"4",X"6",X"8",X"9", + X"A",X"C",X"C",X"A",X"7",X"7",X"8",X"B",X"D",X"E",X"D",X"A",X"6",X"5",X"5",X"7", + X"9",X"9",X"8",X"4",X"1",X"0",X"1",X"3",X"6",X"7",X"7",X"4",X"2",X"2",X"4",X"7"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/sound_seq.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/sound_seq.vhd new file mode 100644 index 00000000..50ca39f7 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/sound_seq.vhd @@ -0,0 +1,30 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity sound_seq is +port ( + clk : in std_logic; + addr : in std_logic_vector(6 downto 0); + data : out std_logic_vector(3 downto 0) +); +end entity; + +architecture prom of sound_seq is + type rom is array(0 to 127) of std_logic_vector(3 downto 0); + signal rom_data: rom := ( + X"F",X"D",X"F",X"F",X"F",X"D",X"F",X"F",X"F",X"D",X"F",X"F",X"F",X"D",X"F",X"F", + X"F",X"D",X"F",X"F",X"F",X"D",X"F",X"F",X"F",X"D",X"F",X"F",X"F",X"D",X"F",X"F", + X"F",X"D",X"F",X"F",X"F",X"D",X"F",X"F",X"F",X"D",X"F",X"F",X"F",X"D",X"F",X"F", + X"F",X"D",X"F",X"F",X"F",X"D",X"F",X"F",X"F",X"D",X"F",X"F",X"F",X"D",X"F",X"F", + X"7",X"F",X"E",X"D",X"F",X"F",X"E",X"D",X"F",X"F",X"E",X"D",X"F",X"F",X"E",X"D", + X"F",X"F",X"E",X"D",X"F",X"F",X"F",X"B",X"7",X"F",X"E",X"D",X"F",X"F",X"E",X"D", + X"F",X"F",X"E",X"D",X"F",X"F",X"E",X"D",X"F",X"F",X"F",X"B",X"7",X"F",X"E",X"D", + X"F",X"F",X"E",X"D",X"F",X"F",X"E",X"D",X"F",X"F",X"E",X"D",X"F",X"F",X"F",X"B"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/sp_graphx.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/sp_graphx.vhd new file mode 100644 index 00000000..c163a322 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/sp_graphx.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity sp_graphx 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 prom of sp_graphx is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"88",X"CC",X"EE",X"FF",X"BB",X"99",X"18",X"19",X"11",X"1D",X"3F",X"BF",X"FF",X"DF",X"CF",X"E7", + X"00",X"06",X"8E",X"BF",X"FF",X"7F",X"7E",X"FD",X"22",X"66",X"EE",X"EE",X"AA",X"22",X"02",X"02", + X"11",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"77",X"33",X"33",X"33",X"33",X"11",X"11",X"11", + X"DD",X"89",X"89",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"33",X"33",X"22",X"02",X"00",X"00",X"00",X"00",X"8B",X"8B",X"EF",X"77",X"E7",X"EB", + X"00",X"00",X"44",X"CF",X"CF",X"DF",X"FF",X"7F",X"00",X"00",X"00",X"11",X"33",X"EE",X"EE",X"44", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AB",X"3B",X"33",X"77",X"77",X"22",X"22",X"22", + X"FE",X"EE",X"AA",X"02",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"02",X"00",X"00",X"00",X"44",X"CC",X"CC",X"CD",X"EF",X"77",X"77",X"DF", + X"00",X"00",X"00",X"2A",X"EE",X"EF",X"CF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"FF", + X"01",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"C7",X"77",X"FF",X"FF",X"CC",X"88",X"00",X"00", + X"FF",X"FF",X"EA",X"04",X"00",X"00",X"00",X"00",X"EE",X"04",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"01",X"11",X"33",X"77",X"3B",X"33",X"77",X"FB",X"23", + X"00",X"00",X"00",X"0C",X"9D",X"EE",X"EF",X"FF",X"00",X"00",X"00",X"88",X"00",X"00",X"08",X"08", + X"00",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"23",X"77",X"EE",X"CC",X"00",X"00",X"00",X"00", + X"7F",X"FF",X"62",X"44",X"09",X"00",X"00",X"00",X"FF",X"EE",X"44",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"13",X"15",X"33",X"77",X"7B",X"77", + X"CC",X"88",X"88",X"88",X"8E",X"BF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"08", + X"00",X"00",X"11",X"33",X"66",X"00",X"00",X"00",X"EF",X"EF",X"FF",X"DC",X"01",X"00",X"00",X"00", + X"EF",X"7F",X"FF",X"99",X"00",X"01",X"00",X"00",X"08",X"00",X"FF",X"EE",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"10",X"7F",X"33",X"77", + X"11",X"77",X"EE",X"66",X"EF",X"CF",X"FF",X"7F",X"88",X"00",X"00",X"00",X"08",X"08",X"CC",X"88", + X"11",X"FF",X"11",X"00",X"00",X"00",X"00",X"00",X"EF",X"FF",X"88",X"13",X"00",X"00",X"00",X"00", + X"2F",X"FF",X"F7",X"D9",X"00",X"13",X"00",X"00",X"0C",X"0C",X"00",X"CC",X"FF",X"CC",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"17",X"00",X"11",X"FF", + X"00",X"3F",X"00",X"11",X"FB",X"F7",X"FF",X"9F",X"00",X"FF",X"EE",X"CC",X"88",X"8E",X"0E",X"CC", + X"FF",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"11",X"00",X"17",X"00",X"00",X"00", + X"3F",X"9F",X"FF",X"F7",X"FB",X"11",X"00",X"3F",X"FF",X"CC",X"0E",X"8E",X"88",X"CC",X"EE",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"17",X"00",X"11",X"FF", + X"00",X"3F",X"00",X"11",X"FB",X"F7",X"FF",X"9F",X"00",X"FF",X"EE",X"CC",X"88",X"8E",X"0E",X"CC", + X"FF",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"11",X"00",X"17",X"00",X"00",X"00", + X"3F",X"9F",X"FF",X"F7",X"FB",X"11",X"00",X"3F",X"FF",X"CC",X"0E",X"8E",X"88",X"CC",X"EE",X"FF", + X"30",X"70",X"43",X"43",X"52",X"61",X"21",X"30",X"00",X"80",X"80",X"80",X"80",X"81",X"C1",X"F3", + X"00",X"00",X"00",X"00",X"00",X"04",X"14",X"FE",X"60",X"F0",X"96",X"96",X"D2",X"B4",X"A4",X"E0", + X"70",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"F3",X"F3",X"73",X"30",X"43",X"C3",X"10",X"10", + X"FE",X"FE",X"F6",X"E0",X"96",X"96",X"40",X"40",X"F0",X"C0",X"00",X"00",X"00",X"80",X"00",X"00", + X"00",X"00",X"00",X"10",X"10",X"30",X"70",X"30",X"00",X"30",X"70",X"E0",X"80",X"81",X"A3",X"F3", + X"80",X"A0",X"10",X"10",X"00",X"14",X"04",X"CC",X"00",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"C0", + X"10",X"10",X"00",X"10",X"30",X"00",X"00",X"00",X"F7",X"F7",X"72",X"B4",X"2D",X"61",X"10",X"00", + X"EE",X"FC",X"FC",X"F0",X"08",X"48",X"20",X"00",X"C0",X"C0",X"A0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"10",X"10",X"10",X"70",X"30",X"40",X"E0",X"E0",X"2C",X"48",X"48",X"C0",X"C6", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"2C", + X"10",X"00",X"10",X"61",X"01",X"10",X"00",X"00",X"F7",X"FF",X"F7",X"F3",X"A4",X"96",X"90",X"00", + X"18",X"F8",X"F8",X"F0",X"70",X"00",X"00",X"00",X"A4",X"C0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"10",X"00",X"10",X"10",X"00",X"00",X"10",X"30",X"F0",X"E0",X"D1",X"F3",X"F7", + X"00",X"E0",X"F0",X"80",X"00",X"0C",X"8A",X"CE",X"00",X"00",X"80",X"40",X"40",X"60",X"60",X"E0", + X"60",X"01",X"01",X"10",X"00",X"00",X"00",X"00",X"F7",X"79",X"79",X"16",X"86",X"10",X"10",X"00", + X"EE",X"DC",X"F8",X"F0",X"60",X"00",X"00",X"00",X"E0",X"C0",X"80",X"80",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"00",X"10",X"21",X"70",X"F0",X"E0",X"E0",X"E7", + X"00",X"E0",X"68",X"68",X"80",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"12",X"03",X"70",X"21",X"00",X"00",X"00",X"FF",X"FF",X"F7",X"F2",X"58",X"80",X"80",X"00", + X"00",X"08",X"F8",X"C3",X"F0",X"C0",X"40",X"00",X"00",X"E0",X"78",X"68",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"20",X"03",X"00",X"40",X"30",X"70",X"E0",X"F1",X"F7",X"F7", + X"00",X"00",X"F0",X"F0",X"20",X"00",X"8E",X"88",X"00",X"00",X"00",X"80",X"C0",X"20",X"00",X"30", + X"43",X"30",X"21",X"01",X"10",X"10",X"00",X"00",X"F3",X"F7",X"7B",X"B0",X"B0",X"00",X"00",X"00", + X"8E",X"CC",X"80",X"F0",X"F0",X"E0",X"40",X"00",X"60",X"E0",X"C0",X"80",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"20",X"30",X"03",X"C3",X"30",X"10",X"10",X"30",X"30",X"70",X"F7",X"F7",X"F3", + X"30",X"E1",X"96",X"F0",X"C0",X"88",X"8E",X"88",X"E0",X"3C",X"3C",X"E0",X"00",X"00",X"00",X"00", + X"C3",X"03",X"30",X"20",X"00",X"00",X"00",X"00",X"F7",X"F7",X"70",X"30",X"30",X"10",X"10",X"00", + X"8E",X"88",X"C0",X"F0",X"96",X"E1",X"30",X"00",X"00",X"00",X"00",X"E0",X"3C",X"3C",X"E0",X"00", + X"00",X"00",X"00",X"20",X"30",X"03",X"43",X"30",X"10",X"10",X"30",X"70",X"70",X"F7",X"F7",X"F3", + X"00",X"80",X"F0",X"F0",X"10",X"88",X"8E",X"88",X"00",X"00",X"00",X"80",X"C0",X"60",X"30",X"00", + X"43",X"03",X"30",X"20",X"00",X"00",X"00",X"00",X"F7",X"F7",X"70",X"70",X"30",X"10",X"10",X"00", + X"8E",X"88",X"10",X"F0",X"F0",X"80",X"00",X"00",X"30",X"60",X"C0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"00",X"00",X"00",X"00",X"44",X"DC",X"EF",X"FE",X"FE", + X"00",X"00",X"00",X"11",X"D1",X"3F",X"F3",X"F3",X"00",X"00",X"00",X"00",X"CC",X"EE",X"CC",X"88", + X"11",X"33",X"33",X"33",X"00",X"00",X"00",X"00",X"EF",X"8B",X"9B",X"98",X"98",X"00",X"00",X"00", + X"3F",X"0E",X"4E",X"40",X"40",X"00",X"00",X"00",X"CC",X"EE",X"EE",X"EE",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"CC",X"CC",X"FE",X"FE",X"47",X"CF", + X"00",X"00",X"00",X"80",X"D1",X"F3",X"3F",X"7F",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00", + X"11",X"22",X"22",X"22",X"00",X"00",X"00",X"00",X"70",X"7C",X"53",X"10",X"00",X"00",X"00",X"00", + X"C4",X"F3",X"19",X"22",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"11",X"77",X"77",X"00",X"00",X"11",X"FF",X"FF",X"FF",X"FE",X"67", + X"00",X"00",X"00",X"20",X"68",X"2C",X"97",X"F3",X"00",X"00",X"00",X"00",X"00",X"88",X"EE",X"CC", + X"77",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"47",X"51",X"90",X"20",X"00",X"00",X"00", + X"7F",X"7F",X"19",X"33",X"77",X"55",X"00",X"00",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"00",X"00",X"11",X"33",X"33",X"99",X"FE",X"12", + X"00",X"00",X"88",X"88",X"70",X"3C",X"96",X"C2",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC", + X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"47",X"A3",X"41",X"00",X"11",X"00",X"00", + X"F3",X"5D",X"44",X"66",X"CC",X"88",X"00",X"00",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"33",X"11",X"33",X"00",X"00",X"11",X"11",X"FF",X"FF",X"BB",X"33",X"07", + X"00",X"44",X"CC",X"EE",X"CC",X"BC",X"96",X"C3",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"C7",X"03",X"63",X"80",X"11",X"33",X"11",X"00", + X"7B",X"FF",X"FF",X"77",X"EE",X"CC",X"CC",X"00",X"CC",X"88",X"88",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"AA",X"31",X"34", + X"00",X"00",X"00",X"33",X"FF",X"EE",X"BC",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F4",X"34",X"72",X"02",X"11",X"EE",X"00",X"00", + X"3C",X"3F",X"FF",X"BB",X"88",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"00",X"00",X"10",X"00",X"00",X"EE",X"FF",X"FF",X"11",X"17",X"C7",X"07", + X"00",X"22",X"77",X"FF",X"FF",X"EE",X"D2",X"D2",X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"00", + X"10",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"C7",X"17",X"11",X"FF",X"FF",X"EE",X"00",X"00", + X"D2",X"EE",X"FF",X"FF",X"77",X"22",X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"11",X"17",X"C7",X"07", + X"00",X"00",X"00",X"77",X"77",X"EE",X"D2",X"D2",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"80", + X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"C7",X"17",X"11",X"FF",X"00",X"00",X"00",X"00", + X"D2",X"EE",X"77",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"30",X"30",X"30",X"10",X"00",X"00",X"00",X"00",X"80",X"81",X"D1",X"C1",X"E1", + X"00",X"00",X"00",X"08",X"0C",X"DC",X"1C",X"3C",X"00",X"00",X"00",X"E0",X"E0",X"E0",X"C0",X"80", + X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"71",X"33",X"43",X"A3",X"00",X"00",X"00",X"00", + X"FC",X"EE",X"9E",X"AE",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"60",X"60",X"61",X"61", + X"00",X"00",X"00",X"04",X"0E",X"EE",X"0E",X"1C",X"00",X"00",X"00",X"00",X"C0",X"C0",X"C0",X"80", + X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"33",X"F3",X"57",X"13",X"11",X"00",X"00",X"00", + X"FC",X"FC",X"0C",X"6C",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"C0",X"E0",X"D1",X"E1", + X"00",X"00",X"00",X"00",X"00",X"0C",X"8E",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60", + X"00",X"10",X"60",X"00",X"00",X"00",X"00",X"00",X"C3",X"77",X"3F",X"BF",X"47",X"55",X"00",X"00", + X"1C",X"78",X"F8",X"C8",X"80",X"40",X"40",X"00",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"10",X"30",X"30",X"31",X"61",X"F7", + X"00",X"80",X"C0",X"80",X"85",X"CE",X"6F",X"3E",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"E0", + X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"BF",X"3F",X"47",X"9B",X"00",X"10",X"00",X"00", + X"BE",X"F8",X"C8",X"80",X"80",X"00",X"00",X"00",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"10",X"00",X"30",X"70",X"70",X"70",X"60",X"E1",X"CF", + X"00",X"80",X"80",X"00",X"00",X"04",X"8E",X"CE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"23",X"01",X"33",X"00",X"00",X"00",X"00",X"00",X"EF",X"EF",X"3E",X"9C",X"20",X"40",X"40",X"00", + X"4C",X"A0",X"F0",X"F0",X"10",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"B0",X"BF",X"3F", + X"00",X"00",X"70",X"F0",X"80",X"27",X"2F",X"2F",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"3F",X"64",X"20",X"40",X"00",X"00",X"00", + X"0C",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"80",X"50",X"BE",X"3F",X"FF", + X"00",X"30",X"70",X"F0",X"E0",X"80",X"2F",X"2F",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"08", + X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"3F",X"BE",X"50",X"80",X"00",X"00",X"00",X"00", + X"2F",X"80",X"E0",X"F0",X"70",X"30",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"00",X"00", + X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"80",X"50",X"BE",X"3F",X"FF", + X"00",X"00",X"00",X"70",X"F0",X"80",X"2F",X"2F",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"08", + X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"3F",X"BE",X"50",X"80",X"00",X"00",X"00",X"00", + X"2F",X"80",X"F0",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"46", + X"00",X"00",X"00",X"00",X"01",X"66",X"22",X"88",X"00",X"33",X"44",X"8A",X"11",X"76",X"80",X"00", + X"00",X"11",X"11",X"02",X"11",X"00",X"00",X"00",X"8A",X"10",X"08",X"08",X"CC",X"88",X"44",X"88", + X"CC",X"A8",X"00",X"00",X"00",X"00",X"10",X"F0",X"00",X"00",X"00",X"70",X"00",X"10",X"F0",X"F0", + X"00",X"00",X"CC",X"02",X"99",X"11",X"00",X"00",X"00",X"00",X"33",X"0C",X"11",X"06",X"10",X"00", + X"00",X"00",X"00",X"88",X"44",X"02",X"91",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"10",X"F0",X"70",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"80",X"E0",X"E0",X"C0",X"F0", + X"31",X"31",X"01",X"01",X"22",X"44",X"11",X"20",X"08",X"08",X"8C",X"8C",X"88",X"88",X"00",X"00", + X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"88",X"04",X"04",X"88",X"A8",X"44",X"54",X"33", + X"10",X"00",X"00",X"00",X"00",X"CC",X"03",X"91",X"F0",X"10",X"00",X"70",X"00",X"00",X"00",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CE",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"54",X"44",X"13",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"70",X"F0",X"10",X"00",X"F0",X"00",X"C0",X"E0",X"E0",X"80",X"C0",X"E0",X"F0",X"11", + X"44",X"44",X"01",X"00",X"20",X"55",X"55",X"2A",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00", + X"00",X"CE",X"02",X"CE",X"02",X"11",X"00",X"00",X"20",X"FF",X"37",X"26",X"04",X"88",X"00",X"00", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"22",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"89",X"CD",X"03", + X"00",X"00",X"22",X"33",X"22",X"00",X"11",X"77",X"00",X"00",X"88",X"88",X"04",X"00",X"CC",X"FF", + X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"11",X"44",X"44",X"91",X"11",X"11",X"77",X"FF",X"BB", + X"66",X"DD",X"FE",X"FD",X"CF",X"46",X"CF",X"CD",X"77",X"BB",X"EE",X"8E",X"0D",X"0D",X"01",X"07", + X"00",X"00",X"00",X"00",X"00",X"77",X"FF",X"DD",X"00",X"00",X"00",X"80",X"22",X"88",X"AA",X"66", + X"00",X"00",X"00",X"00",X"00",X"01",X"2A",X"0C",X"00",X"00",X"44",X"44",X"88",X"00",X"00",X"00", + X"AA",X"EF",X"1E",X"07",X"07",X"02",X"40",X"0E",X"FF",X"19",X"6E",X"1F",X"35",X"1F",X"3F",X"33", + X"00",X"00",X"EE",X"FF",X"BB",X"66",X"EE",X"CC",X"00",X"88",X"44",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"00",X"11",X"11",X"00",X"00",X"00",X"D9",X"BB",X"DD",X"EC",X"CD",X"FF",X"33",X"00", + X"47",X"8F",X"CE",X"CE",X"CF",X"8B",X"66",X"FF",X"29",X"05",X"08",X"26",X"0E",X"06",X"1D",X"FF", + X"00",X"00",X"00",X"00",X"11",X"22",X"22",X"00",X"40",X"22",X"DD",X"99",X"00",X"00",X"00",X"00", + X"66",X"33",X"33",X"11",X"40",X"22",X"22",X"00",X"FF",X"66",X"99",X"FF",X"EE",X"00",X"00",X"00", + X"84",X"0A",X"01",X"0A",X"0F",X"0D",X"1F",X"C2",X"3F",X"1F",X"35",X"17",X"33",X"3F",X"FF",X"77", + X"BB",X"FF",X"66",X"BB",X"BB",X"66",X"CC",X"88",X"00",X"44",X"66",X"44",X"66",X"11",X"00",X"00", + X"FF",X"BB",X"77",X"FF",X"EE",X"00",X"00",X"00",X"AA",X"CC",X"CC",X"88",X"22",X"44",X"00",X"00", + X"33",X"04",X"A8",X"98",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"44",X"00",X"00", + X"88",X"54",X"22",X"22",X"00",X"33",X"67",X"CF",X"00",X"00",X"91",X"11",X"FF",X"CC",X"0B",X"07", + X"22",X"FF",X"DD",X"2A",X"0F",X"3F",X"07",X"0F",X"EE",X"FF",X"33",X"1D",X"0E",X"8F",X"0F",X"03", + X"CE",X"CD",X"EE",X"45",X"EE",X"EF",X"EF",X"FF",X"1E",X"2F",X"4F",X"0F",X"0F",X"07",X"0E",X"6D", + X"CE",X"87",X"0D",X"0E",X"8F",X"0F",X"01",X"0E",X"0D",X"8F",X"0F",X"06",X"00",X"04",X"0B",X"01", + X"00",X"11",X"BB",X"CC",X"FF",X"77",X"1E",X"87",X"A2",X"22",X"CC",X"11",X"99",X"BB",X"7F",X"0C", + X"00",X"01",X"01",X"CC",X"EE",X"BF",X"3F",X"37",X"11",X"22",X"40",X"08",X"40",X"00",X"00",X"00", + X"0F",X"1F",X"0B",X"03",X"09",X"08",X"83",X"0E",X"0D",X"0F",X"0F",X"09",X"03",X"06",X"05",X"07", + X"3B",X"2E",X"B7",X"1F",X"0D",X"0F",X"0F",X"0F",X"00",X"00",X"66",X"FF",X"3F",X"3F",X"37",X"6E", + X"FF",X"11",X"77",X"FF",X"EE",X"66",X"67",X"67",X"3D",X"1F",X"9B",X"17",X"2F",X"0F",X"07",X"5B", + X"0F",X"0D",X"1A",X"0F",X"0E",X"0D",X"0F",X"8F",X"07",X"01",X"0A",X"04",X"08",X"13",X"07",X"7F", + X"33",X"11",X"00",X"11",X"11",X"33",X"44",X"00",X"8F",X"8A",X"23",X"23",X"91",X"00",X"00",X"00", + X"6F",X"0F",X"07",X"0B",X"8C",X"FF",X"77",X"00",X"0F",X"97",X"6F",X"06",X"3F",X"EE",X"88",X"00", + X"0C",X"08",X"0B",X"84",X"0A",X"03",X"0B",X"0F",X"01",X"07",X"07",X"1A",X"03",X"0B",X"0E",X"4D", + X"0B",X"85",X"0D",X"1B",X"1F",X"19",X"66",X"FF",X"AA",X"88",X"88",X"CC",X"CC",X"88",X"00",X"00", + X"1F",X"2F",X"4B",X"8E",X"77",X"FF",X"00",X"00",X"0F",X"0F",X"0B",X"FF",X"BB",X"00",X"00",X"00", + X"FF",X"CC",X"CC",X"98",X"00",X"40",X"22",X"00",X"00",X"00",X"88",X"88",X"C8",X"62",X"33",X"11", + X"00",X"00",X"02",X"13",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"09",X"C1",X"03", + X"00",X"00",X"02",X"03",X"02",X"00",X"11",X"67",X"00",X"00",X"08",X"80",X"40",X"00",X"0C",X"3F", + X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"11",X"04",X"04",X"89",X"01",X"01",X"17",X"3F",X"3B", + X"06",X"4D",X"0F",X"7C",X"8F",X"06",X"0F",X"0D",X"07",X"0B",X"0E",X"0E",X"0D",X"0D",X"01",X"25", + X"00",X"00",X"00",X"00",X"00",X"77",X"0F",X"4D",X"00",X"00",X"00",X"80",X"22",X"08",X"AA",X"06", + X"00",X"00",X"00",X"00",X"00",X"11",X"0A",X"0C",X"00",X"00",X"04",X"04",X"80",X"00",X"00",X"00", + X"0A",X"0F",X"0F",X"07",X"07",X"02",X"04",X"0E",X"2F",X"09",X"86",X"0F",X"07",X"0F",X"0F",X"03", + X"00",X"00",X"6E",X"1F",X"0B",X"26",X"2E",X"0C",X"00",X"88",X"44",X"00",X"00",X"00",X"00",X"00", + X"01",X"10",X"00",X"01",X"01",X"00",X"00",X"00",X"1D",X"1A",X"4D",X"8E",X"8D",X"0F",X"03",X"00", + X"07",X"0F",X"0E",X"4A",X"0F",X"0B",X"06",X"0F",X"0B",X"05",X"08",X"06",X"0E",X"06",X"0D",X"0F", + X"00",X"00",X"00",X"00",X"10",X"22",X"22",X"00",X"04",X"02",X"0D",X"09",X"00",X"00",X"00",X"00", + X"46",X"03",X"03",X"01",X"04",X"22",X"22",X"00",X"0F",X"06",X"09",X"3E",X"CE",X"00",X"00",X"00", + X"0C",X"28",X"01",X"0A",X"0F",X"0D",X"0F",X"0E",X"1E",X"2F",X"27",X"07",X"03",X"0F",X"0F",X"17", + X"0B",X"4F",X"66",X"2B",X"2B",X"06",X"CC",X"88",X"00",X"04",X"06",X"04",X"06",X"01",X"00",X"00", + X"0F",X"0B",X"27",X"87",X"EE",X"00",X"00",X"00",X"2A",X"0C",X"CC",X"08",X"02",X"04",X"00",X"00", + X"03",X"04",X"0A",X"09",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30", + X"00",X"00",X"00",X"00",X"01",X"02",X"04",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"31",X"30",X"40",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"F1",X"30",X"00",X"00",X"00",X"00",X"00", + X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"70",X"72", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"02",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"CC",X"88",X"77",X"00",X"99",X"AA", + X"00",X"CC",X"22",X"66",X"CC",X"00",X"CC",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"EE",X"00",X"00",X"FF",X"44",X"00", + X"22",X"22",X"44",X"00",X"22",X"EE",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08", + X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"07",X"00",X"00",X"0F",X"04",X"02",X"01", + X"02",X"0C",X"00",X"08",X"0E",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08", + X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"07",X"00",X"09",X"0A",X"0A",X"0A",X"0E", + X"02",X"0C",X"00",X"0C",X"02",X"02",X"02",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08", + X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"07",X"00",X"06",X"09",X"09",X"09",X"06", + X"02",X"0C",X"00",X"0C",X"02",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"80",X"80",X"70",X"00",X"70",X"80",X"80", + X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"00",X"70",X"80",X"80",X"70",X"00",X"F0", + X"C0",X"00",X"C0",X"20",X"20",X"C0",X"00",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88",X"88",X"77",X"00",X"77",X"88",X"88", + X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"00",X"99",X"AA",X"AA",X"EE",X"00",X"FF", + X"CC",X"00",X"CC",X"22",X"22",X"44",X"00",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08", + X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"00",X"08",X"09",X"05",X"03",X"00",X"0F", + X"0C",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"12",X"1E",X"00",X"00",X"0F",X"00",X"10",X"76",X"1E",X"1E", + X"00",X"00",X"0F",X"1E",X"FE",X"FE",X"FE",X"FE",X"00",X"00",X"1C",X"1C",X"10",X"10",X"DC",X"FE", + X"3E",X"1E",X"12",X"10",X"00",X"00",X"00",X"00",X"DE",X"1E",X"1E",X"76",X"10",X"00",X"0F",X"00", + X"1E",X"FE",X"FE",X"FE",X"FE",X"1E",X"0F",X"00",X"1C",X"FE",X"DC",X"10",X"10",X"1C",X"1C",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"C0",X"20",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"00",X"70",X"80",X"80",X"70",X"00",X"70", + X"C0",X"00",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88",X"88", + X"00",X"00",X"00",X"00",X"00",X"CC",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"00",X"77",X"88",X"88",X"77",X"00",X"77", + X"CC",X"00",X"CC",X"22",X"22",X"CC",X"00",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"70",X"00",X"60",X"90",X"80",X"80", + X"20",X"20",X"C0",X"00",X"20",X"20",X"A0",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"77",X"00",X"88",X"DD",X"AA",X"88", + X"22",X"22",X"CC",X"00",X"CC",X"22",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00",X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00", + X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00",X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00", + X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00",X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00", + X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00",X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"57",X"27",X"57",X"88",X"22",X"00",X"00",X"00", + X"4C",X"4C",X"88",X"44",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"00",X"44",X"11",X"00",X"00",X"02",X"00",X"A2",X"03",X"AB",X"05", + X"00",X"00",X"10",X"B8",X"44",X"22",X"1B",X"86",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"44", + X"00",X"11",X"22",X"10",X"10",X"00",X"00",X"00",X"BC",X"21",X"65",X"81",X"44",X"22",X"00",X"00", + X"BE",X"3C",X"B4",X"54",X"11",X"04",X"00",X"00",X"88",X"80",X"84",X"00",X"00",X"00",X"00",X"00", + X"04",X"00",X"22",X"01",X"44",X"38",X"20",X"44",X"11",X"88",X"74",X"00",X"8B",X"00",X"44",X"88", + X"22",X"10",X"22",X"89",X"01",X"22",X"88",X"00",X"20",X"80",X"00",X"08",X"08",X"11",X"C0",X"00", + X"00",X"DA",X"01",X"03",X"44",X"00",X"11",X"88",X"22",X"C0",X"00",X"22",X"44",X"10",X"02",X"02", + X"55",X"00",X"15",X"24",X"C0",X"22",X"00",X"44",X"30",X"20",X"E9",X"40",X"65",X"00",X"88",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00", + X"00",X"00",X"11",X"00",X"00",X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"04",X"22",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"22",X"11",X"88",X"44",X"00",X"22", + X"11",X"04",X"00",X"20",X"11",X"00",X"A8",X"20",X"00",X"C0",X"81",X"22",X"00",X"00",X"02",X"00", + X"00",X"00",X"00",X"00",X"04",X"A2",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"40",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"11",X"22",X"22",X"00",X"00",X"00",X"00",X"11",X"02",X"00",X"C0",X"00",X"10",X"04",X"44", + X"00",X"00",X"60",X"00",X"88",X"01",X"00",X"44",X"00",X"00",X"00",X"44",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"80",X"80",X"00",X"11",X"00",X"22",X"00", + X"22",X"0C",X"00",X"00",X"60",X"20",X"00",X"22",X"00",X"00",X"00",X"11",X"00",X"00",X"44",X"06", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"00",X"00",X"44",X"00",X"00",X"00",X"10",X"00",X"22",X"04",X"00",X"00",X"00",X"00", + X"00",X"22",X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"22",X"15",X"30",X"00",X"88",X"44",X"01", + X"88",X"00",X"11",X"00",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"82",X"00",X"00",X"44",X"00",X"00",X"00",X"00",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"44",X"00",X"11",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"88",X"C0",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"11", + X"00",X"00",X"10",X"00",X"00",X"00",X"01",X"00",X"00",X"80",X"00",X"00",X"22",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00", + X"00",X"11",X"00",X"00",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"04", + X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00", + X"00",X"00",X"00",X"10",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"10",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"11",X"00",X"00",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"22",X"00", + X"00",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"18",X"00",X"00", + X"00",X"00",X"00",X"01",X"03",X"01",X"03",X"00",X"00",X"01",X"01",X"0F",X"0F",X"0B",X"03",X"77", + X"00",X"04",X"0C",X"0E",X"0C",X"7C",X"F6",X"F3",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"B7",X"33",X"53",X"80",X"01",X"03",X"01",X"00", + X"CB",X"0F",X"0F",X"07",X"0E",X"0C",X"0C",X"00",X"0C",X"08",X"08",X"08",X"00",X"00",X"00",X"00", + X"0F",X"0C",X"0C",X"0F",X"0F",X"0C",X"0C",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"00",X"00",X"0F", + X"0C",X"0C",X"0C",X"0F",X"07",X"00",X"00",X"07",X"03",X"03",X"03",X"0F",X"0E",X"00",X"00",X"0F", + X"0C",X"0F",X"07",X"00",X"00",X"0C",X"0C",X"0C",X"03",X"0F",X"0E",X"00",X"00",X"03",X"03",X"03", + X"00",X"00",X"07",X"0F",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"0E",X"0F",X"03",X"03",X"03",X"03", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"00",X"00",X"11",X"11",X"51",X"D1",X"D5",X"FF", + X"00",X"00",X"00",X"00",X"40",X"60",X"74",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"31",X"31",X"20",X"20",X"00",X"00",X"00",X"00",X"EF",X"2F",X"07",X"03",X"01",X"00",X"00",X"00", + X"FF",X"9F",X"0C",X"08",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"20",X"60",X"F3",X"FF", + X"00",X"00",X"44",X"44",X"CC",X"98",X"BA",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"10",X"30",X"20",X"00",X"00",X"00",X"00",X"00",X"FF",X"17",X"03",X"03",X"01",X"00",X"00",X"00", + X"7F",X"7F",X"1F",X"0C",X"00",X"00",X"00",X"00",X"C0",X"C8",X"C0",X"80",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"00",X"00",X"00",X"10",X"F0",X"F7",X"FF",X"77", + X"00",X"00",X"11",X"B3",X"22",X"44",X"DD",X"7F",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80", + X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"37",X"07",X"03",X"03",X"00",X"00",X"00",X"00", + X"7F",X"FF",X"3F",X"10",X"10",X"20",X"00",X"00",X"80",X"C0",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"30",X"20",X"00",X"00",X"00",X"00",X"F0",X"F7",X"FF",X"77",X"37", + X"00",X"00",X"00",X"C0",X"99",X"AA",X"CC",X"7F",X"00",X"00",X"00",X"88",X"00",X"00",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"27",X"17",X"07",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"7F",X"32",X"30",X"60",X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"20",X"00",X"00",X"00",X"00",X"20",X"F0",X"F7",X"77",X"37",X"27", + X"00",X"00",X"00",X"E0",X"CC",X"99",X"EE",X"4C",X"00",X"00",X"00",X"00",X"CC",X"88",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"1F",X"03",X"00",X"00",X"10",X"00",X"00", + X"FE",X"FE",X"FE",X"74",X"E0",X"80",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"F2",X"77",X"37",X"3F",X"0F", + X"00",X"00",X"00",X"C0",X"E8",X"CC",X"99",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"1F",X"13",X"11",X"30",X"60",X"00",X"00", + X"CC",X"FC",X"E8",X"C8",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"33",X"13",X"17",X"3F", + X"00",X"00",X"00",X"80",X"C0",X"E8",X"FC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"3F",X"17",X"13",X"33",X"F0",X"00",X"00", + X"FF",X"88",X"FC",X"E8",X"C0",X"80",X"00",X"00",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"3F", + X"00",X"00",X"CC",X"22",X"11",X"88",X"88",X"8E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"03",X"02",X"00",X"00",X"00",X"00",X"3B",X"3B",X"19",X"28",X"20",X"00",X"00",X"00", + X"8B",X"8B",X"03",X"82",X"80",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"66",X"99",X"00",X"00",X"11",X"11",X"3F", + X"00",X"00",X"00",X"88",X"88",X"88",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"07",X"05",X"00",X"00",X"00",X"00",X"00",X"3B",X"33",X"22",X"50",X"50",X"00",X"00",X"00", + X"8E",X"8B",X"03",X"07",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"19", + X"00",X"00",X"00",X"00",X"33",X"CC",X"EE",X"CC",X"00",X"00",X"00",X"00",X"88",X"44",X"44",X"00", + X"05",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"3B",X"33",X"62",X"A0",X"20",X"00",X"00",X"00", + X"8C",X"8A",X"06",X"06",X"0E",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"0E",X"1D",X"3B", + X"00",X"00",X"EE",X"11",X"11",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"73",X"A0",X"40",X"01",X"00",X"00",X"00", + X"CC",X"8A",X"06",X"0E",X"0C",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"03",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"0E",X"0D",X"33", + X"00",X"00",X"00",X"00",X"00",X"77",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"88",X"44",X"44", + X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"F7",X"40",X"81",X"03",X"00",X"01",X"00", + X"CC",X"04",X"04",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"0E",X"0F",X"09",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"FF",X"00",X"00",X"00",X"00",X"88",X"44",X"44",X"88", + X"10",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"B3",X"77",X"80",X"01",X"07",X"03",X"06",X"00", + X"EE",X"88",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"0C",X"07",X"0F",X"00",X"B3", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"B3",X"00",X"0F",X"07",X"0C",X"00",X"00", + X"FF",X"EE",X"08",X"08",X"11",X"00",X"00",X"00",X"88",X"44",X"44",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"02",X"02",X"03",X"03",X"01",X"00",X"00",X"01",X"01",X"01",X"03",X"0F",X"3C", + X"00",X"00",X"00",X"00",X"00",X"09",X"0F",X"87",X"00",X"00",X"00",X"08",X"08",X"08",X"08",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1E",X"9E",X"CF",X"67",X"01",X"01",X"00",X"00", + X"0F",X"2E",X"6E",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"08",X"0D",X"0F",X"3C", + X"00",X"00",X"08",X"08",X"08",X"0C",X"0C",X"87",X"00",X"00",X"00",X"00",X"00",X"04",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"9E",X"9E",X"CF",X"DF",X"02",X"02",X"00",X"00", + X"0F",X"0F",X"6E",X"CC",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"0C",X"0C",X"0F",X"0F",X"9E", + X"00",X"00",X"02",X"02",X"04",X"0C",X"0C",X"86",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"0C", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"9E",X"AD",X"8F",X"37",X"19",X"00",X"00",X"00", + X"0F",X"0F",X"4E",X"CC",X"00",X"00",X"00",X"00",X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"02",X"04",X"0E",X"0E",X"0F",X"AD", + X"00",X"00",X"00",X"00",X"01",X"02",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"11",X"00",X"01",X"00",X"00",X"00",X"1E",X"2D",X"8F",X"4F",X"77",X"00",X"00",X"00", + X"0C",X"87",X"0F",X"8F",X"88",X"00",X"00",X"00",X"00",X"04",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"07",X"CF",X"8F", + X"00",X"04",X"08",X"08",X"00",X"08",X"0F",X"86",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00", + X"11",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"9E",X"AD",X"0F",X"77",X"11",X"00",X"00",X"00", + X"86",X"0E",X"0F",X"8F",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"47",X"CF",X"8F", + X"00",X"00",X"0E",X"0C",X"08",X"08",X"0E",X"87",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C", + X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"BC",X"0F",X"CF",X"FF",X"00",X"00",X"00",X"00", + X"86",X"84",X"0E",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"67",X"CF",X"8F", + X"00",X"00",X"00",X"07",X"0E",X"0C",X"0C",X"86",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00", + X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"8F",X"CF",X"67",X"01",X"00",X"00",X"00", + X"87",X"86",X"0C",X"0C",X"0E",X"07",X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"1C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"70",X"F0",X"00",X"00",X"00",X"00",X"00",X"1E",X"F0",X"D0",X"10",X"32",X"66",X"00",X"00", + X"0F",X"F0",X"70",X"00",X"88",X"CC",X"00",X"00",X"0C",X"C0",X"E0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"1E", + X"00",X"00",X"40",X"40",X"80",X"80",X"80",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"D0",X"10",X"64",X"DD",X"11",X"00",X"00", + X"0F",X"C3",X"70",X"10",X"00",X"88",X"00",X"00",X"00",X"0C",X"84",X"C0",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"03",X"F0",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"0E", + X"00",X"00",X"00",X"10",X"20",X"40",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"D2",X"F0",X"30",X"A8",X"EA",X"22",X"22",X"00", + X"00",X"0E",X"87",X"E1",X"70",X"30",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"80",X"80",X"00", + X"00",X"00",X"00",X"00",X"03",X"E1",X"70",X"30",X"00",X"00",X"00",X"00",X"00",X"0C",X"0E",X"86", + X"00",X"00",X"00",X"00",X"10",X"20",X"40",X"80",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"33",X"00",X"00",X"00",X"00",X"D2",X"21",X"50",X"90",X"CC",X"88",X"00",X"00", + X"00",X"0C",X"0E",X"86",X"C3",X"E1",X"60",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"61",X"30",X"30",X"10",X"00",X"00",X"00",X"00",X"08",X"0C",X"86",X"86",X"C2", + X"00",X"00",X"00",X"00",X"00",X"10",X"60",X"C0",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00", + X"00",X"77",X"10",X"11",X"11",X"00",X"00",X"00",X"70",X"E1",X"30",X"B8",X"10",X"10",X"00",X"00", + X"00",X"08",X"0C",X"0E",X"84",X"86",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"22",X"00",X"00",X"86",X"C2",X"C3",X"43",X"61",X"21", + X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00", + X"33",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"70",X"90",X"B8",X"30",X"30",X"10",X"10",X"10", + X"80",X"0C",X"0C",X"0C",X"84",X"84",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"33",X"00",X"40",X"61",X"61",X"61",X"61",X"61",X"21", + X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"33",X"22",X"00",X"00",X"00",X"00",X"00",X"F0",X"21",X"61",X"61",X"61",X"61",X"61",X"40", + X"F0",X"00",X"08",X"08",X"08",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"22",X"66",X"22",X"00",X"00",X"00",X"00",X"00",X"77",X"44",X"77", + X"00",X"00",X"00",X"00",X"00",X"CC",X"11",X"99",X"00",X"00",X"00",X"00",X"00",X"CC",X"22",X"22", + X"22",X"22",X"22",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"33",X"00",X"00",X"00",X"00", + X"55",X"55",X"55",X"88",X"00",X"00",X"00",X"00",X"22",X"22",X"22",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"21",X"10",X"00",X"00",X"00",X"00",X"00",X"11",X"1D",X"0F",X"87",X"E1", + X"44",X"CC",X"CC",X"CC",X"88",X"3B",X"7F",X"7F",X"00",X"00",X"00",X"33",X"FF",X"EE",X"EE",X"88", + X"11",X"33",X"77",X"44",X"00",X"00",X"00",X"00",X"F8",X"FD",X"BB",X"33",X"77",X"77",X"66",X"44", + X"4E",X"8E",X"E8",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"40",X"A0",X"10", + X"00",X"00",X"00",X"03",X"21",X"76",X"77",X"11",X"00",X"00",X"00",X"11",X"1F",X"0F",X"C3",X"E9", + X"44",X"CC",X"CC",X"CC",X"CC",X"0C",X"7F",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"77",X"77",X"FF",X"EE",X"EE",X"CC",X"88", + X"F7",X"B7",X"60",X"10",X"00",X"00",X"00",X"00",X"FF",X"EE",X"00",X"00",X"A0",X"40",X"A0",X"10", + X"00",X"00",X"11",X"03",X"21",X"10",X"00",X"00",X"00",X"00",X"88",X"DD",X"1F",X"87",X"F0",X"70", + X"22",X"77",X"FF",X"EE",X"CC",X"88",X"0C",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"33",X"33",X"22",X"00",X"00",X"FD",X"DD",X"CC",X"88",X"00",X"00",X"00",X"00", + X"EE",X"FF",X"FF",X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"A8",X"40",X"A0",X"10", + X"00",X"00",X"00",X"03",X"21",X"10",X"00",X"00",X"00",X"00",X"00",X"11",X"1D",X"0F",X"87",X"E1", + X"44",X"CC",X"CC",X"CC",X"88",X"3B",X"7F",X"7F",X"00",X"00",X"00",X"33",X"FF",X"EE",X"EE",X"88", + X"11",X"33",X"77",X"44",X"00",X"00",X"00",X"00",X"F8",X"FD",X"BB",X"33",X"77",X"77",X"66",X"44", + X"4E",X"8E",X"E8",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"40",X"A0",X"10", + X"00",X"00",X"00",X"03",X"21",X"76",X"77",X"11",X"00",X"00",X"00",X"11",X"1F",X"0F",X"C3",X"E9", + X"44",X"CC",X"CC",X"CC",X"CC",X"0C",X"7F",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"77",X"77",X"FF",X"EE",X"EE",X"CC",X"88", + X"F7",X"B7",X"60",X"10",X"00",X"00",X"00",X"00",X"FF",X"EE",X"00",X"00",X"A0",X"40",X"A0",X"10", + X"00",X"00",X"11",X"03",X"21",X"10",X"00",X"00",X"00",X"00",X"88",X"DD",X"1F",X"87",X"F0",X"70", + X"22",X"77",X"FF",X"EE",X"CC",X"88",X"0C",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"33",X"33",X"22",X"00",X"00",X"FD",X"DD",X"CC",X"88",X"00",X"00",X"00",X"00", + X"EE",X"FF",X"FF",X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"A8",X"40",X"A0",X"10", + X"00",X"00",X"00",X"03",X"21",X"10",X"00",X"00",X"00",X"00",X"00",X"11",X"1D",X"0F",X"87",X"E1", + X"44",X"CC",X"CC",X"CC",X"88",X"3B",X"7F",X"7F",X"00",X"00",X"00",X"33",X"FF",X"EE",X"EE",X"88", + X"11",X"33",X"77",X"44",X"00",X"00",X"00",X"00",X"F8",X"FD",X"BB",X"33",X"77",X"77",X"66",X"44", + X"4E",X"8E",X"E8",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"40",X"A0",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"60",X"60",X"71",X"71",X"71",X"60",X"12",X"12",X"74",X"FC",X"FD",X"B9",X"11",X"71", + X"08",X"08",X"C4",X"E6",X"F7",X"B3",X"11",X"C0",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"60",X"14",X"10",X"10",X"10",X"10",X"00",X"00",X"F0",X"F1",X"F3",X"E7",X"F3",X"E1",X"E1",X"61", + X"E0",X"F0",X"F8",X"FC",X"F8",X"F0",X"E0",X"C0",X"C0",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"30",X"30",X"30",X"30",X"71",X"60",X"24",X"00",X"00",X"32",X"FE",X"FE",X"30",X"11",X"F1", + X"4A",X"4A",X"C0",X"E2",X"FB",X"FB",X"33",X"91",X"00",X"00",X"00",X"60",X"60",X"60",X"E8",X"C0", + X"10",X"30",X"30",X"30",X"30",X"30",X"10",X"00",X"F0",X"F3",X"FF",X"DF",X"F7",X"D2",X"B4",X"34", + X"C0",X"E0",X"E0",X"E8",X"E0",X"E0",X"C0",X"80",X"C0",X"C0",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"10",X"30",X"30",X"70",X"04",X"30",X"C0",X"C0",X"F7",X"F7",X"FF",X"10",X"E0",X"F1", + X"02",X"12",X"E9",X"F0",X"F5",X"FD",X"D9",X"91",X"00",X"08",X"00",X"00",X"00",X"A8",X"F8",X"E8", + X"30",X"70",X"F1",X"70",X"70",X"70",X"01",X"00",X"F0",X"FE",X"FF",X"BF",X"7D",X"78",X"F0",X"E0", + X"D1",X"C0",X"D0",X"E0",X"C1",X"C0",X"80",X"00",X"E0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"30",X"34",X"00",X"30",X"30",X"70",X"E0",X"F3",X"F7",X"44",X"00",X"E0", + X"00",X"00",X"00",X"CD",X"F8",X"F0",X"F4",X"F9",X"00",X"00",X"48",X"84",X"08",X"00",X"88",X"88", + X"70",X"F1",X"F1",X"F1",X"F1",X"D2",X"34",X"30",X"F1",X"FA",X"FC",X"7E",X"FE",X"F0",X"F0",X"E0", + X"11",X"91",X"B3",X"90",X"B0",X"B0",X"02",X"00",X"B8",X"F8",X"E0",X"C0",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"00",X"30",X"70",X"00",X"10",X"30",X"F0",X"51",X"80",X"F0",X"F0", + X"40",X"E0",X"C0",X"EE",X"FF",X"30",X"73",X"F6",X"00",X"00",X"00",X"02",X"A4",X"C3",X"C0",X"C4", + X"71",X"F0",X"F1",X"C3",X"34",X"30",X"30",X"00",X"FC",X"FE",X"7E",X"FE",X"F4",X"F0",X"E0",X"40", + X"B9",X"D1",X"D1",X"D1",X"B0",X"B0",X"24",X"00",X"CC",X"CC",X"FC",X"F0",X"E0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"F0",X"00",X"00",X"34",X"30",X"00",X"E0",X"F0",X"F8", + X"00",X"70",X"F0",X"C4",X"FF",X"77",X"30",X"B3",X"00",X"80",X"80",X"00",X"00",X"8B",X"F0",X"C3", + X"F1",X"D3",X"3D",X"70",X"70",X"30",X"00",X"00",X"FE",X"7E",X"FC",X"FC",X"F0",X"E0",X"00",X"00", + X"FC",X"B1",X"91",X"91",X"32",X"F0",X"68",X"00",X"C0",X"CC",X"88",X"88",X"E0",X"E0",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"70",X"F0",X"F1",X"00",X"00",X"12",X"10",X"E0",X"F0",X"F8",X"FC", + X"00",X"00",X"F0",X"F0",X"77",X"33",X"91",X"B0",X"00",X"00",X"C0",X"C0",X"00",X"88",X"CC",X"C3", + X"1F",X"F1",X"F0",X"70",X"30",X"00",X"00",X"00",X"7E",X"FC",X"F8",X"F0",X"E0",X"10",X"12",X"00", + X"FF",X"B0",X"91",X"33",X"77",X"F0",X"F0",X"00",X"F0",X"C3",X"CC",X"88",X"00",X"C0",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/sp_palette.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/sp_palette.vhd new file mode 100644 index 00000000..006b8ab1 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/ROM/sp_palette.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity sp_palette is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(3 downto 0) +); +end entity; + +architecture prom of sp_palette is + type rom is array(0 to 255) of std_logic_vector(3 downto 0); + signal rom_data: rom := ( + X"F",X"8",X"E",X"2",X"F",X"5",X"B",X"C",X"F",X"0",X"B",X"1",X"F",X"1",X"B",X"2", + X"F",X"8",X"D",X"2",X"F",X"6",X"1",X"4",X"F",X"9",X"1",X"5",X"F",X"7",X"B",X"1", + X"F",X"1",X"6",X"B",X"F",X"1",X"B",X"0",X"F",X"1",X"2",X"0",X"F",X"0",X"1",X"6", + X"F",X"0",X"0",X"6",X"F",X"3",X"B",X"9",X"F",X"6",X"2",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0", + X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0",X"0"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/dac.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/dac.vhd new file mode 100644 index 00000000..47b2185e --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 10 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/galaga.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/galaga.vhd new file mode 100644 index 00000000..b6d04f39 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/galaga.vhd @@ -0,0 +1,1112 @@ +--------------------------------------------------------------------------------- +-- Galaga Midway by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T80/T80se - Version : 0247 +----------------------------- +-- Z80 compatible microprocessor core +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +----------------- +-- Galaga releases +-- +-- Release 0.1 - 04/11/2017 - Dar +-- fixes 2 ships bullet bug (swap 2xH/2xV command bits) +-- +-- Release 0.0 - December 2016 - Dar +-- initial release +--------------------------------------------------------------------------------- +-- Features : +-- TV 15KHz mode only (atm) +-- Coctail mode ok +-- Sound ok, Ship explode missing (custom chip 0x54XX todo) +-- Starfield from MAME information + +-- Use with MAME roms from galagamw.zip +-- +-- Use make_galaga_proms.bat to build vhd file from binaries + +-- galaga_cpu1.vhd : 3200a.bin, 3300b.bin, 3400c.bin,3500d.bin, +-- galaga_cpu2.vhd : 3600e.bin +-- galaga_cpu3.vhd : 3700g.bin +-- bg_graphx.vhd : 2600j.bin +-- sp_graphx.vhd : 2800l.bin, 2700k.bin +-- rgb.vhd : prom-5.5n +-- bg_palette.vhd : prom-4.2n +-- sp_palette.vhd : prom-3.1c +-- sound_seq.vhd : prom-2.5c +-- sound_samples.vhd : prom-1.1d + +-- Galaga Hardware caracteristics : +-- +-- 3xZ80 CPU accessing each own program rom and shared ram/devices +-- +-- One char tile map 32x28 (called background/bg although being front of other layers) +-- 3 colors/64sets among 16 colors +-- 1Ko ram, 4Ko rom graphics, 4pixels of 2bits/byte +-- full emulation in vhdl +-- +-- 64 sprites with priorities, flip H/V, 2x size H/V, +-- 3 colors/64sets among 16 colors (different of char colors). +-- 8Ko rom graphics, 4pixels of 2bits/byte +-- full emulation in vhdl (improved capabilities : more sprites/scanline) +-- +-- Namco 05XX Starfield +-- 4 sets, 63 stars/set, 2 set displayed at one time for blinking +-- 6bits colors: 2red/2green/2blue +-- full emulation in vhdl (from MAME information) +-- +-- Char/sprites color palette 2x16 colors among 256 colors +-- 8bits 3red/3green/2blue +-- full emulation in vhdl +-- +-- Namco 06XX for 51/54XX control +-- simplified emulation in vhdl +-- +-- Namco 51XX for coin/credit management +-- simplified emulation in vhdl : 1coin/1credit, 1 or 2 players start +-- +-- Namco 54XX for sound effects +-- no emulation in vhdl atm +-- +-- Namco sound waveform and frequency synthetizer +-- full original emulation in vhdl +-- +-- Namco 00XX,04XX,02XX,07XX,08XX address generator, H/V counters and shift registers +-- full emulation in vhdl from what I think they should do. +-- +-- Working ram : 3x1Kx8bits shared +-- Sprites ram : 1 scan line delay flip/flop 512x4bits +-- Sound registers ram : 2x16x4bits +-- Sound sequencer rom : 256x4bits (3 sequential 4 bits adders) +-- Sound wavetable rom : 256x4bits 8 waveform of 32 samples of 4bits/level +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity galaga is +port( + clock_18 : in std_logic; + reset : in std_logic; + video_r : out std_logic_vector(2 downto 0); + video_g : out std_logic_vector(2 downto 0); + video_b : out std_logic_vector(1 downto 0); + video_hs : out std_logic; + video_vs : out std_logic; + video_blankn : out std_logic; + pix_ce : out std_logic; + audio : out std_logic_vector(9 downto 0); + + b_test : in std_logic; + b_svce : in std_logic; + coin : in std_logic; + start1 : in std_logic; + left1 : in std_logic; + right1 : in std_logic; + fire1 : in std_logic; + start2 : in std_logic; + left2 : in std_logic; + right2 : in std_logic; + fire2 : in std_logic + ); +end galaga; + +architecture struct of galaga is + + signal reset_n: std_logic; + signal clock_18n : std_logic; + + signal hcnt : std_logic_vector(8 downto 0); + signal vcnt : std_logic_vector(8 downto 0); + signal ena_vidgen : std_logic; + signal ena_snd_machine : std_logic; + signal cpu1_ena : std_logic; + signal cpu2_ena : std_logic; + signal cpu3_ena : std_logic; + + signal cpu1_addr : std_logic_vector(15 downto 0); + signal cpu1_di : std_logic_vector( 7 downto 0); + signal cpu1_do : std_logic_vector( 7 downto 0); + signal cpu1_wr_n : std_logic; + signal cpu1_mreq_n : std_logic; + signal cpu1_irq_n : std_logic; + signal cpu1_nmi_n : std_logic; + + + signal cpu2_addr : std_logic_vector(15 downto 0); + signal cpu2_di : std_logic_vector( 7 downto 0); + signal cpu2_do : std_logic_vector( 7 downto 0); + signal cpu2_wr_n : std_logic; + signal cpu2_mreq_n : std_logic; + signal cpu2_irq_n : std_logic; + + + signal cpu3_addr : std_logic_vector(15 downto 0); + signal cpu3_di : std_logic_vector( 7 downto 0); + signal cpu3_do : std_logic_vector( 7 downto 0); + signal cpu3_wr_n : std_logic; + signal cpu3_mreq_n : std_logic; + signal cpu3_nmi_n : std_logic; + + + signal bgtile_addr : std_logic_vector(15 downto 0); + signal sprite_addr : std_logic_vector(15 downto 0); + + signal cpu1_rom_do : std_logic_vector( 7 downto 0); + signal cpu2_rom_do : std_logic_vector( 7 downto 0); + signal cpu3_rom_do : std_logic_vector( 7 downto 0); + + signal bgram_do : std_logic_vector( 7 downto 0); + signal bgram_we : std_logic; + signal wram1_do : std_logic_vector( 7 downto 0); + signal wram1_we : std_logic; + signal wram2_do : std_logic_vector( 7 downto 0); + signal wram2_we : std_logic; + signal wram3_do : std_logic_vector( 7 downto 0); + signal wram3_we : std_logic; + signal port_we : std_logic; + + signal slot : std_logic_vector(2 downto 0) := (others => '0'); + signal mux_addr : std_logic_vector(15 downto 0); + signal mux_cpu_do : std_logic_vector( 7 downto 0); + signal mux_cpu_we : std_logic; + signal mux_cpu_mreq : std_logic; + signal latch_we : std_logic; + signal io_we : std_logic; + + signal cs06XX_control : std_logic_vector( 7 downto 0); + signal cs06XX_do : std_logic_vector( 7 downto 0); + signal cs06XX_di : std_logic_vector( 7 downto 0); + + signal cs51XX_data_cnt : std_logic_vector( 1 downto 0); + signal cs51XX_coin_mode_cnt : std_logic_vector( 2 downto 0); + signal cs51XX_switch_mode : std_logic; + signal cs51XX_credit_mode : std_logic; + signal cs51XX_do : std_logic_vector( 7 downto 0); + signal cs51XX_switch_mode_do : std_logic_vector( 7 downto 0); + signal cs51XX_non_switch_mode_do : std_logic_vector( 7 downto 0); + signal change_next : std_logic; + signal credit_bcd_0 : std_logic_vector( 3 downto 0); + signal credit_bcd_1 : std_logic_vector( 3 downto 0); + + signal cs54XX_cmd : std_logic_vector( 3 downto 0); + signal cs54XX_do : std_logic_vector( 7 downto 0); + + signal cs05XX_ctrl : std_logic_vector( 5 downto 0); + + signal dip_switch_a : std_logic_vector (7 downto 0); + signal dip_switch_b : std_logic_vector (7 downto 0); + signal dip_switch_do : std_logic_vector (1 downto 0); + + signal bgtile_num : std_logic_vector( 7 downto 0); + signal bgtile_num_r : std_logic_vector( 7 downto 0); + signal bgtile_color : std_logic_vector( 7 downto 0); + signal bgtile_color_r : std_logic_vector( 7 downto 0); + signal bggraphx_addr : std_logic_vector(11 downto 0); + signal bggraphx_do : std_logic_vector( 7 downto 0); + signal bgpalette_addr : std_logic_vector( 7 downto 0); + signal bgpalette_do : std_logic_vector( 3 downto 0); + signal bgbits : std_logic_vector( 3 downto 0); + + signal rgb_palette_addr : std_logic_vector( 4 downto 0); + signal rgb_palette_do : std_logic_vector( 7 downto 0); + + signal sprite_num : std_logic_vector(5 downto 0); + signal sprite_state : std_logic_vector(2 downto 0); + signal sprite_line : std_logic_vector(7 downto 0); + signal sptile_num : std_logic_vector(7 downto 0); + signal sptile_color : std_logic_vector(7 downto 0); + signal spdata : std_logic_vector(3 downto 0); + signal spvcnt : std_logic_vector(4 downto 0); + signal sphcnt : std_logic_vector(4 downto 0); + signal spram_wr_addr : std_logic_vector(8 downto 0); + signal spram_rd_addr : std_logic_vector(8 downto 0); + signal spram_we : std_logic; + signal spram_clr : std_logic; + signal spgraphx_addr : std_logic_vector(12 downto 0); + signal spgraphx_do : std_logic_vector(7 downto 0); + signal sppalette_addr : std_logic_vector(7 downto 0); + signal sppalette_do : std_logic_vector(3 downto 0); + signal spbits_wr : std_logic_vector(3 downto 0); + signal spbits_rd : std_logic_vector(3 downto 0); + signal spflip_V ,spflip_H : std_logic; + signal spflip_2V,spflip_2H : std_logic_vector(1 downto 0); + signal spflip_3V,spflip_3H : std_logic_vector(2 downto 0); + signal spflips : std_logic_vector(12 downto 0); + + signal flip_h : std_logic; + + signal spram1_addr : std_logic_vector(8 downto 0); + signal spram1_di : std_logic_vector(3 downto 0); + signal spram1_do : std_logic_vector(3 downto 0); + signal spram1_we : std_logic; + signal spram2_addr : std_logic_vector(8 downto 0); + signal spram2_di : std_logic_vector(3 downto 0); + signal spram2_do : std_logic_vector(3 downto 0); + signal spram2_we : std_logic; + + signal stars_hcnt : std_logic_vector( 8 downto 0); + signal stars_vcnt : std_logic_vector( 8 downto 0); + signal stars_offset : std_logic_vector( 7 downto 0); + signal stars_set0_addr : std_logic_vector( 6 downto 0); + signal stars_set0_data : std_logic_vector(15 downto 0); + signal star_color_set0 : std_logic_vector( 5 downto 0); + signal stars_set1_addr : std_logic_vector( 6 downto 0); + signal stars_set1_data : std_logic_vector(15 downto 0); + signal star_color_set1 : std_logic_vector( 5 downto 0); + signal stars_set2_addr : std_logic_vector( 6 downto 0); + signal stars_set2_data : std_logic_vector(15 downto 0); + signal star_color_set2 : std_logic_vector( 5 downto 0); + signal stars_set3_addr : std_logic_vector( 6 downto 0); + signal stars_set3_data : std_logic_vector(15 downto 0); + signal star_color_set3 : std_logic_vector( 5 downto 0); + signal star_color : std_logic_vector( 5 downto 0); + + signal irq1_clr_n : std_logic; + signal irq2_clr_n : std_logic; + signal nmion_n : std_logic; + signal reset_cpu_n : std_logic; + + signal snd_ram_0_we : std_logic; + signal snd_ram_1_we : std_logic; + + signal coin_r : std_logic; + signal start1_r : std_logic; + signal start2_r : std_logic; + +begin + +pix_ce <= ena_vidgen; +clock_18n <= not clock_18; +reset_n <= not reset; + +dip_switch_a <= "11110111"; -- cab:7 / na:6 / test:5 / freeze:4 / demo sound:3 / na:2 / difficulty:1-0 +dip_switch_b <= "10010111"; --lives:7-6/ bonus:5-3 / coinage:2-0 +dip_switch_do <= dip_switch_a(to_integer(unsigned(mux_addr(3 downto 0)))) & + dip_switch_b(to_integer(unsigned(mux_addr(3 downto 0)))); + +-- make access slots from 18MHz +-- 6MHz for pixel clock and sound machine +-- 3MHz for cpu, background and sprite machine + +-- slots | 0 | 1 | 2 | 3 | 4 | 5 | +-- wram access | cpu1 | cpu2 | cpu3 | bgram | spram | n.u. | +-- sound access | cpu1 | cpu2 | cpu3 | sndram | n.u. | sndram| + +-- enable signals are one slot early + +process (clock_18) +begin + if rising_edge(clock_18) then + ena_vidgen <= '0'; + ena_snd_machine <= '0'; + cpu1_ena <= '0'; + cpu2_ena <= '0'; + cpu3_ena <= '0'; + + if slot = "101" then + slot <= (others => '0'); + else + slot <= std_logic_vector(unsigned(slot) + 1); + end if; + + if slot = "101" or slot = "010" then ena_vidgen <= '1'; end if; + if slot = "010" or slot = "100" then ena_snd_machine <= '1'; end if; + if slot = "101" then cpu1_ena <= '1'; end if; + if slot = "000" then cpu2_ena <= '1'; end if; + if slot = "001" then cpu3_ena <= '1'; end if; + + end if; +end process; + +--- SPRITES MACHINE --- +----------------------- + +-- 0x8B80 - 0x8BFF : 64 sprites tile num, tile color +-- 0x9380 - 0x93FF : 64 sprites pos v, pos h lsb +-- 0x9B80 - 0x9BFF : 64 sprites 2xH, 2xV, flip H, flip V + +sprite_addr <= X"03"&'1' & sprite_num & sprite_state(0); +sprite_line <= wram2_do + vcnt(7 downto 0); + +process (clock_18, slot) +begin + if rising_edge(clock_18) then + if hcnt = std_logic_vector(to_unsigned(191,9)) then + sprite_num <= "000000"; + sprite_state <= "000"; + spram_rd_addr<= "111101111"; + end if; + + if slot = "100" and sprite_state = "000" then + sptile_num <= wram1_do; + spdata <= wram3_do(3 downto 0); + spvcnt <= sprite_line(4 downto 0); + if sprite_line(7 downto 4) = "1111" or -- size V x 1 + (sprite_line(7 downto 5) = "111" and wram3_do(3)='1' )then -- size V x 2 -- fixed Dar : 04/11/2017 +-- (sprite_line(7 downto 5) = "111" and wram3_do(2)='1' )then -- size V x 2 + sprite_state <= "001"; + else + if sprite_num = "111111" then + sprite_state <= "111"; + else + sprite_num <= sprite_num + "000001"; + sprite_state <= "000"; + end if; + end if; + end if; + + if slot = "100" and sprite_state = "001" then + sptile_color <= wram1_do; + spram_wr_addr <= wram3_do(0) & wram2_do; + sphcnt <= "00000"; + sprite_state <= "010"; + end if; + + if sprite_state = "010" then + sphcnt <= sphcnt + "00001"; + sprite_state <= "011"; + end if; + + if sprite_state = "011" then + sphcnt <= sphcnt + "00001"; + spram_wr_addr <= spram_wr_addr + "000000001"; + if (sphcnt = "01111" and spdata(2) = '0' ) or -- size H x 1 -- fixed Dar : 04/11/2017 + (sphcnt = "11111" and spdata(2) = '1' ) then -- size H x 2 -- fixed Dar : 04/11/2017 +-- if (sphcnt = "01111" and spdata(3) = '0' ) or -- size H x 1 +-- (sphcnt = "11111" and spdata(3) = '1' ) then -- size H x 2 + if sprite_num = "111111" then + sprite_state <= "111"; + else + sprite_num <= sprite_num + "000001"; + sprite_state <= "000"; + end if; + end if; + end if; + + if slot = "000" or slot = "011" then + if vcnt(0) = '1' then + spbits_rd <= spram2_do; + else + spbits_rd <= spram1_do; + end if; + end if; + + spram_clr <= '0'; + if slot = "001" or slot = "100" then + spram_clr <= '1'; + end if; + + if slot = "010" or slot = "101" then + spram_rd_addr <= spram_rd_addr + "000000001"; + end if; + + end if; +end process; + +spram_we <= '1' when sprite_state = "011" and spbits_wr /= "1111" else '0'; + +spram1_addr <= spram_wr_addr when vcnt(0) = '1' else spram_rd_addr; +spram2_addr <= spram_wr_addr when vcnt(0) = '0' else spram_rd_addr; + +spram1_di <= spbits_wr when vcnt(0) = '1' else "1111"; +spram2_di <= spbits_wr when vcnt(0) = '0' else "1111"; + +spram1_we <= spram_we when vcnt(0) = '1' else spram_clr; +spram2_we <= spram_we when vcnt(0) = '0' else spram_clr; + +spflip_H <= spdata(0) xor flip_h; spflip_2H <= spflip_H & spflip_H; +spflip_V <= spdata(1); spflip_2V <= spflip_V & spflip_V; + +with spdata(3 downto 2) select +spflips <= "0000000" & spflip_V & spflip_2H & spflip_V & spflip_2V when "00", + "000000" & spflip_H & spflip_V & spflip_2H & spflip_V & spflip_2V when "01", + "00000" & spflip_V & '0' & spflip_V & spflip_2H & spflip_V & spflip_2V when "10", + "00000" & spflip_V & spflip_H & spflip_V & spflip_2H & spflip_V & spflip_2V when others; + +with spdata(3 downto 2) select +spgraphx_addr <= (sptile_num(6 downto 0) & spvcnt(3) & sphcnt(3 downto 2) & spvcnt(2 downto 0) ) xor spflips when "00", + (sptile_num(6 downto 1) & sphcnt(4) & spvcnt(3) & sphcnt(3 downto 2) & spvcnt(2 downto 0) ) xor spflips when "01", + (sptile_num(6 downto 2) & spvcnt(4) & sptile_num(0) & spvcnt(3) & sphcnt(3 downto 2) & spvcnt(2 downto 0) ) xor spflips when "10", + (sptile_num(6 downto 2) & spvcnt(4) & sphcnt(4) & spvcnt(3) & sphcnt(3 downto 2) & spvcnt(2 downto 0) ) xor spflips when others; + +sppalette_addr <= sptile_color(5 downto 0) & + spgraphx_do(to_integer(unsigned('1' & ((not sphcnt(1 downto 0)) xor spflip_2H )))) & + spgraphx_do(to_integer(unsigned('0' & ((not sphcnt(1 downto 0)) xor spflip_2H )))); + +spbits_wr <= sppalette_do; + +--- BACKGROUND TILES MACHINE --- +-----------------------_-------- + +-- 0x8000-0x83FF : tile num +-- 0x8400-0x87FF : tile color + +bgtile_addr <= "10000" & hcnt(1) & vcnt(7 downto 3) & hcnt(7 downto 3) when (hcnt(8)='1' and flip_h='0') else + "10000" & hcnt(1) & hcnt(4) & hcnt(4) & hcnt(4) & hcnt(4) & hcnt(3) & vcnt(7 downto 3) when (hcnt(8)='0' and flip_h='0') else + "10000" & hcnt(1) & not( vcnt(7 downto 3) & hcnt(7 downto 3)) when (hcnt(8)='1' and flip_h='1') else + "10000" & hcnt(1) & not( hcnt(4) & hcnt(4) & hcnt(4) & hcnt(4) & hcnt(3) & vcnt(7 downto 3)); + + +-- Attention : slot et hcnt ne sont pas entierement synchronisés +-- slot |0 |1 | 2 |3 |4 |5 | ... +-- hcnt | 0 or 1 | 1 or 2 | ... + +process (clock_18, slot) +begin + if rising_edge(clock_18) then + if slot = "011" and hcnt(2 downto 1) = "00" then + bgtile_num <= bgram_do; + end if; + if slot = "011" and hcnt(2 downto 1) = "01" then + bgtile_color <= bgram_do; + end if; + if (slot = "000" or slot = "011") and hcnt(2 downto 0) = "111" then + bgtile_num_r <= bgtile_num; + bgtile_color_r <= bgtile_color; + end if; + end if; +end process; + +bggraphx_addr <= '1' & bgtile_num_r(6 downto 0) & not hcnt(2) & vcnt(2 downto 0) when flip_h='0' else + '1' & bgtile_num_r(6 downto 0) & hcnt(2) & not vcnt(2 downto 0); + +bgpalette_addr <= bgtile_color_r(5 downto 0) & + bggraphx_do(to_integer(unsigned('1' & (hcnt(1 downto 0)) xor (flip_h & flip_h)))) & + bggraphx_do(to_integer(unsigned('0' & (hcnt(1 downto 0)) xor (flip_h & flip_h)))); + +bgbits <= bgpalette_do; + +--- STARS MACHINE --- +--------------------- + +stars_data : entity work.stars +port map( + clk => clock_18n, + addr_set0 => stars_set0_addr, + data_set0 => stars_set0_data, + addr_set1 => stars_set1_addr, + data_set1 => stars_set1_data, + addr_set2 => stars_set2_addr, + data_set2 => stars_set2_data, + addr_set3 => stars_set3_addr, + data_set3 => stars_set3_data +); + +stars_machine_0 : entity work.stars_machine +port map( + clk => clock_18, + ena_hcnt => ena_vidgen, + hcnt => stars_hcnt, + vcnt => stars_vcnt, + stars_set_addr_o => stars_set0_addr, + stars_set_data => stars_set0_data, + offset_y => stars_offset, + star_color => star_color_set0 +); + +stars_machine_1 : entity work.stars_machine +port map( + clk => clock_18, + ena_hcnt => ena_vidgen, + hcnt => stars_hcnt, + vcnt => stars_vcnt, + stars_set_addr_o => stars_set1_addr, + stars_set_data => stars_set1_data, + offset_y => stars_offset, + star_color => star_color_set1 +); + +stars_machine_2 : entity work.stars_machine +port map( + clk => clock_18, + ena_hcnt => ena_vidgen, + hcnt => stars_hcnt, + vcnt => stars_vcnt, + stars_set_addr_o => stars_set2_addr, + stars_set_data => stars_set2_data, + offset_y => stars_offset, + star_color => star_color_set2 +); + +stars_machine_3 : entity work.stars_machine +port map( + clk => clock_18, + ena_hcnt => ena_vidgen, + hcnt => stars_hcnt, + vcnt => stars_vcnt, + stars_set_addr_o => stars_set3_addr, + stars_set_data => stars_set3_data, + offset_y => stars_offset, + star_color => star_color_set3 +); + +process (clock_18) + subtype speed is integer range -3 to 3; + type speed_array is array(0 to 7) of speed; + constant speeds : speed_array := ( -1, -2, -3, 0, 3, 2, 1, 0 ); +begin + if rising_edge(clock_18) then + + if ena_vidgen = '1' then + if hcnt = std_logic_vector(to_unsigned(256+8,9)) then + stars_hcnt <= "000000000"; + stars_vcnt <= stars_vcnt + "000000001"; + if vcnt = std_logic_vector(to_unsigned(128+6,9)) then + stars_vcnt <= "000000000"; + stars_offset <= stars_offset + + std_logic_vector(to_signed(speeds(to_integer(unsigned(cs05XX_ctrl(2 downto 0)))),8)); + end if; + else + stars_hcnt <= stars_hcnt + "000000001"; + end if; + end if; + + star_color <= "000000"; + if cs05XX_ctrl(5) = '1' then + if cs05XX_ctrl(4 downto 3) = "00" then star_color <= star_color_set0 or star_color_set2; end if; + if cs05XX_ctrl(4 downto 3) = "01" then star_color <= star_color_set1 or star_color_set2; end if; + if cs05XX_ctrl(4 downto 3) = "10" then star_color <= star_color_set0 or star_color_set3; end if; + if cs05XX_ctrl(4 downto 3) = "11" then star_color <= star_color_set1 or star_color_set3; end if; + end if; + + end if; +end process; + +--- VIDEO MUX --- +----------------- + +rgb_palette_addr <= ('0' & spbits_rd) when bgbits = "1111" else ('1' & bgbits); + +process (clock_18) begin + if rising_edge(clock_18) then + if ena_vidgen = '1' then + if rgb_palette_addr(3 downto 0) = "1111" then + video_r <= star_color(1 downto 0) & star_color(1); + video_g <= star_color(3 downto 2) & star_color(3); + video_b <= star_color(5 downto 4); + else + video_r <= rgb_palette_do(2 downto 0); + video_g <= rgb_palette_do(5 downto 3); + video_b <= rgb_palette_do(7 downto 6); + end if; + end if; + end if; +end process; + + +--- SOUND MACHINE --- +--------------------- + +sound_machine : entity work.sound_machine +port map( +clock_18 => clock_18, +ena => ena_snd_machine, +hcnt => hcnt(5 downto 0), +cpu_addr => mux_addr(3 downto 0), +cpu_do => mux_cpu_do(3 downto 0), +ram_0_we => snd_ram_0_we, +ram_1_we => snd_ram_1_we, +audio => audio +); + +--- CPUS ------------- +---------------------- + +with slot select +mux_addr <= cpu1_addr when "000", + cpu2_addr when "001", + cpu3_addr when "010", + bgtile_addr when "011", + sprite_addr when "100", + X"5555" when others; + +with slot select +mux_cpu_do <= cpu1_do when "000", + cpu2_do when "001", + cpu3_do when "010", + X"00" when others; + +mux_cpu_we <= (not cpu1_wr_n and cpu1_ena)or + (not cpu2_wr_n and cpu2_ena)or + (not cpu3_wr_n and cpu3_ena); + +mux_cpu_mreq <= (not cpu1_mreq_n and cpu1_ena) or + (not cpu2_mreq_n and cpu2_ena) or + (not cpu3_mreq_n and cpu3_ena); + +latch_we <= '1' when mux_cpu_we = '1' and mux_addr(15 downto 11) = "01101" else '0'; +io_we <= '1' when mux_cpu_we = '1' and mux_addr(15 downto 11) = "01110" else '0'; +bgram_we <= '1' when mux_cpu_we = '1' and mux_addr(15 downto 11) = "10000" else '0'; +wram1_we <= '1' when mux_cpu_we = '1' and mux_addr(15 downto 11) = "10001" else '0'; +wram2_we <= '1' when mux_cpu_we = '1' and mux_addr(15 downto 11) = "10010" else '0'; +wram3_we <= '1' when mux_cpu_we = '1' and mux_addr(15 downto 11) = "10011" else '0'; +port_we <= '1' when mux_cpu_we = '1' and mux_addr(15 downto 11) = "10100" else '0'; + +snd_ram_0_we <= '1' when mux_cpu_we = '1' and mux_addr(15 downto 11) = "01101" and mux_addr(5 downto 4) = "00" else '0'; +snd_ram_1_we <= '1' when mux_cpu_we = '1' and mux_addr(15 downto 11) = "01101" and mux_addr(5 downto 4) = "01" else '0'; + +process (reset, clock_18n, io_we) + variable cs06XX_nmi_cnt : natural range 0 to 1000; +begin + if reset='1' then + irq1_clr_n <= '0'; + irq2_clr_n <= '0'; + nmion_n <= '0'; + reset_cpu_n <= '0'; + cpu1_irq_n <= '1'; + cpu2_irq_n <= '1'; + cs51XX_coin_mode_cnt <= "000"; + cs51XX_data_cnt <= "00"; + cs05XX_ctrl <= "000000"; + flip_h <= '0'; + else + if rising_edge(clock_18n) then + if latch_we ='1' and mux_addr(5 downto 4) = "10" then + if mux_addr(2 downto 0) = "000" then irq1_clr_n <= mux_cpu_do(0); end if; + if mux_addr(2 downto 0) = "001" then irq2_clr_n <= mux_cpu_do(0); end if; + if mux_addr(2 downto 0) = "010" then nmion_n <= mux_cpu_do(0); end if; + if mux_addr(2 downto 0) = "011" then reset_cpu_n <= mux_cpu_do(0); end if; + end if; + + if port_we ='1' then + if mux_addr(2 downto 0) < "110" then cs05XX_ctrl(to_integer(unsigned(mux_addr(2 downto 0)))) <= mux_cpu_do(0); end if; + if mux_addr(2 downto 0) = "111" then flip_h <= mux_cpu_do(0); end if; + end if; + + if irq1_clr_n = '0' then + cpu1_irq_n <= '1'; + elsif vcnt = std_logic_vector(to_unsigned(240,9)) then cpu1_irq_n <= '0'; + end if; + if irq2_clr_n = '0' then + cpu2_irq_n <= '1'; + elsif vcnt = std_logic_vector(to_unsigned(240,9)) then cpu2_irq_n <= '0'; + end if; + + -- write to cs06XX + if io_we = '1' then + -- write to data register (0x7000) + if mux_addr(8) = '0' then + -- write data to device#1 (cs51XX) + if cs06XX_control(3 downto 0) = "0001" then + -- when not in coin mode + if cs51XX_coin_mode_cnt = "000" then + -- if data = 1 enter coin mode for next 4 write operations + if mux_cpu_do(2 downto 0) = "001" then + cs51XX_coin_mode_cnt <= "100"; + end if; + -- if data = 2 enter credit mode + if mux_cpu_do(2 downto 0) = "010" then + cs51XX_switch_mode <= '0'; + cs51XX_credit_mode <= '1'; + cs51XX_data_cnt <= "00"; + end if; + -- if data = 5 enter switch mode + if mux_cpu_do(2 downto 0) = "101" then + cs51XX_switch_mode <= '1'; + cs51XX_credit_mode <= '0'; + cs51XX_data_cnt <= "00"; + end if; + -- when in coin mode + else + -- written coin/credit data are ignored atm + -- only count down to exit coin_mode (request 4 write operations) + cs51XX_coin_mode_cnt <= cs51XX_coin_mode_cnt - "001"; + end if; + end if; + end if; + + -- write to control register (0x7100) + if mux_addr(8) = '1' then + cs06XX_control <= mux_cpu_do; + -- start/stop nmi timer + if mux_cpu_do(3 downto 0) = "0000" then + cs06XX_nmi_cnt := 0; + cpu1_nmi_n <= '1'; + else + cs06XX_nmi_cnt := 1; + end if; + end if; + end if; + + -- generate periodic nmi when timer is on + if cs06XX_nmi_cnt >= 1 then + if cpu1_ena = '1' then -- to get 333ns tick + -- 600 * 333ns = 200µs + if cs06XX_nmi_cnt < 600 then + cs06XX_nmi_cnt := cs06XX_nmi_cnt + 1; + cpu1_nmi_n <= '1'; + else + cs06XX_nmi_cnt := 1; + cpu1_nmi_n <= '0'; + end if; + end if; + end if; + + -- manage cs06XX data read + change_next <= '0'; + if mux_cpu_mreq = '1' and mux_cpu_we ='0' and mux_addr(15 downto 11) = "01110" then + if mux_addr(8) = '0' then + change_next <= '1'; + end if; + end if ; + -- cycle data_cnt at each read + if change_next = '1' then + if cs06XX_control(3 downto 0) = "0001" then + if cs51XX_data_cnt = "10" then cs51XX_data_cnt <= "00"; + else cs51XX_data_cnt <= cs51XX_data_cnt + "01"; end if; + end if; + end if; + + -- manage credit count (bcd) + -- increase at each coin up to 99 + coin_r <= coin; + start1_r <= start1; + start2_r <= start2; + if coin = '1' and coin_r = '0' then + if credit_bcd_0 = "1001" then + if credit_bcd_1 /= "1001" then + credit_bcd_1 <= credit_bcd_1 + "0001"; + credit_bcd_0 <= "0000"; + end if; + else + credit_bcd_0 <= credit_bcd_0 + "0001"; + end if; + end if; + + -- decrease only when in credit mode + if cs51XX_credit_mode = '1' then + if (start1 = '1' and start1_r = '0') then + cs51XX_credit_mode <= '0'; + if credit_bcd_0 = "0000" then + if credit_bcd_1 /= "0000" then + credit_bcd_1 <= credit_bcd_1 - "0001"; + credit_bcd_0 <= "1001"; + end if; + else + credit_bcd_0 <= credit_bcd_0 - "0001"; + end if; + end if; + + if (start2 = '1' and start2_r = '0') then + if credit_bcd_0 = "0000" or credit_bcd_0 = "0001" then + if credit_bcd_1 /= "0000" then + cs51XX_credit_mode <= '0'; + credit_bcd_1 <= credit_bcd_1 - "0001"; + if credit_bcd_0 = "0000" then + credit_bcd_0 <= "1000"; + else + credit_bcd_0 <= "1001"; + end if; + end if; + else + cs51XX_credit_mode <= '0'; + credit_bcd_0 <= credit_bcd_0 - "0010"; + end if; + end if; + end if; + + end if; + end if; +end process; + +with cs51XX_data_cnt select +cs51XX_switch_mode_do <= not (left2 & '0' & right2 & '0' & left1 & '0' & right1 & '0' ) when "00", + not (b_test & b_svce & '0' & coin & start2 & start1 & fire2 & fire1) when "01", + X"00" when others; + +with cs51XX_data_cnt select +cs51XX_non_switch_mode_do <= credit_bcd_1 & credit_bcd_0 when "00", -- credits (cpu spy this) + not ("110" & fire1 & left1 & '0' & right1 & '0' ) when "01", + not ("110" & fire2 & left2 & '0' & right2 & '0' ) when "10", + X"00" when "11"; -- N.U. + +cs51XX_do <= cs51XX_switch_mode_do when cs51XX_switch_mode = '1' else cs51XX_non_switch_mode_do; + +cs54XX_do <= X"FF"; -- todo (maybe) + +with cs06XX_control(3 downto 0) select +cs06XX_di <= cs51XX_do when "0001", + cs54XX_do when "1000", + X"00" when others; + +cs06XX_do <= cs06XX_di when mux_addr(8)= '0' else cs06XX_control; + +process (clock_18, nmion_n) +begin + if nmion_n = '1' then + elsif rising_edge(clock_18) then + if ena_vidgen = '1' then + if hcnt = "100000000" then + if vcnt = "001000000" or vcnt = "011000000" then cpu3_nmi_n <= '0'; end if; + if vcnt = "001000001" or vcnt = "011000001" then cpu3_nmi_n <= '1'; end if; + end if; + end if; + end if; +end process; + +with cpu1_addr(15 downto 11) select +cpu1_di <= cpu1_rom_do when "00000", + cpu1_rom_do when "00001", + cpu1_rom_do when "00010", + cpu1_rom_do when "00011", + cpu1_rom_do when "00100", + cpu1_rom_do when "00101", + cpu1_rom_do when "00110", + cpu1_rom_do when "00111", + "000000" & dip_switch_do when "01101", + cs06XX_do when "01110", + bgram_do when "10000", + wram1_do when "10001", + wram2_do when "10010", + wram3_do when "10011", + X"00" when others; + +with cpu2_addr(15 downto 11) select +cpu2_di <= cpu2_rom_do when "00000", + cpu2_rom_do when "00001", + "000000" & dip_switch_do when "01101", + cs06XX_do when "01110", + bgram_do when "10000", + wram1_do when "10001", + wram2_do when "10010", + wram3_do when "10011", + X"00" when others; + +with cpu3_addr(15 downto 11) select +cpu3_di <= cpu3_rom_do when "00000", + cpu3_rom_do when "00001", + "000000" & dip_switch_do when "01101", + cs06XX_do when "01110", + bgram_do when "10000", + wram1_do when "10001", + wram2_do when "10010", + wram3_do when "10011", + X"00" when others; + +-- video address/sync generator +gen_video : entity work.gen_video +port map( +clk => clock_18, +enable => ena_vidgen, +hcnt => hcnt, +vcnt => vcnt, +hsync => video_hs, +vsync => video_vs, +blankn => video_blankn +); + +-- microprocessor Z80 - 1 +cpu1 : entity work.T80se +generic map(Mode => 0, T2Write => 1, IOWait => 1) +port map( + RESET_n => reset_n, + CLK_n => clock_18, + CLKEN => cpu1_ena, + WAIT_n => '1', + INT_n => cpu1_irq_n, + NMI_n => cpu1_nmi_n, + BUSRQ_n => '1', + M1_n => open, + MREQ_n => cpu1_mreq_n, + IORQ_n => open, + RD_n => open, + WR_n => cpu1_wr_n, + RFSH_n => open, + HALT_n => open, + BUSAK_n => open, + A => cpu1_addr, + DI => cpu1_di, + DO => cpu1_do +); + +-- microprocessor Z80 - 2 +cpu2 : entity work.T80se +generic map(Mode => 0, T2Write => 1, IOWait => 1) +port map( +-- RESET_n => reset_n, + RESET_n => reset_cpu_n, + CLK_n => clock_18, + CLKEN => cpu2_ena, + WAIT_n => '1', + INT_n => cpu2_irq_n, + NMI_n => '1', --cpu_int_n, + BUSRQ_n => '1', + M1_n => open, + MREQ_n => cpu2_mreq_n, + IORQ_n => open, + RD_n => open, + WR_n => cpu2_wr_n, + RFSH_n => open, + HALT_n => open, + BUSAK_n => open, + A => cpu2_addr, + DI => cpu2_di, + DO => cpu2_do +); + +-- microprocessor Z80 - 3 +cpu3 : entity work.T80se +generic map(Mode => 0, T2Write => 1, IOWait => 1) +port map( +-- RESET_n => reset_n, + RESET_n => reset_cpu_n, + CLK_n => clock_18, + CLKEN => cpu3_ena, + WAIT_n => '1', + INT_n => '1', + NMI_n => cpu3_nmi_n, + BUSRQ_n => '1', + M1_n => open, + MREQ_n => cpu3_mreq_n, + IORQ_n => open, + RD_n => open, + WR_n => cpu3_wr_n, + RFSH_n => open, + HALT_n => open, + BUSAK_n => open, + A => cpu3_addr, + DI => cpu3_di, + DO => cpu3_do +); + +-- cpu1 program ROM +rom_cpu1 : entity work.galaga_cpu1 +port map( + clk => clock_18n, + addr => mux_addr(13 downto 0), + data => cpu1_rom_do +); + +-- cpu2 program ROM +rom_cpu2 : entity work.galaga_cpu2 +port map( + clk => clock_18n, + addr => mux_addr(11 downto 0), + data => cpu2_rom_do +); + +-- cpu3 program ROM +rom_cpu3 : entity work.galaga_cpu3 +port map( + clk => clock_18n, + addr => mux_addr(11 downto 0), + data => cpu3_rom_do +); +-- background graphics ROM +bg_graphics : entity work.bg_graphx +port map( + clk => clock_18n, + addr => bggraphx_addr(11 downto 0), + data => bggraphx_do +); + +-- background palette ROM +bg_palette : entity work.bg_palette +port map( + clk => clock_18, + addr => bgpalette_addr, + data => bgpalette_do +); + +-- background char RAM 0x8000-0x87FF +bgram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 11) +port map( + clk => clock_18n, + we => bgram_we, + addr => mux_addr(10 downto 0), + d => mux_cpu_do, + q => bgram_do +); +-- working/sprite register RAM1 0x8800-0x8BFF / 0x8C00-0x8FFF +wram1 : entity work.gen_ram +generic map( dWidth => 8, aWidth => 10) +port map( + clk => clock_18n, + we => wram1_we, + addr => mux_addr(9 downto 0), + d => mux_cpu_do, + q => wram1_do +); +-- working/sprite register RAM2 0x9000-0x93FF / 0x9400-0x97FF +wram2 : entity work.gen_ram +generic map( dWidth => 8, aWidth => 10) +port map( + clk => clock_18n, + we => wram2_we, + addr => mux_addr(9 downto 0), + d => mux_cpu_do, + q => wram2_do +); +-- working/sprite register RAM3 0x9800-0x9BFF / 0x9C00-0x9FFF +wram3 : entity work.gen_ram +generic map( dWidth => 8, aWidth => 10) +port map( + clk => clock_18n, + we => wram3_we, + addr => mux_addr(9 downto 0), + d => mux_cpu_do, + q => wram3_do +); + +-- sprite RAM1 +spram1 : entity work.gen_ram +generic map( dWidth => 4, aWidth => 9) +port map( + clk => clock_18, + we => spram1_we, + addr => spram1_addr, + d => spram1_di, + q => spram1_do +); + +-- sprite RAM2 +spram2 : entity work.gen_ram +generic map( dWidth => 4, aWidth => 9) +port map( + clk => clock_18, + we => spram2_we, + addr => spram2_addr, + d => spram2_di, + q => spram2_do +); + +-- sprite graphics ROM +sp_graphics : entity work.sp_graphx +port map( + clk => clock_18n, + addr => spgraphx_addr, + data => spgraphx_do +); + +-- sprite palette ROM +sp_palette : entity work.sp_palette +port map( + clk => clock_18, + addr => sppalette_addr, + data => sppalette_do +); + +-- RGB palette ROM +rgb_palette : entity work.rgb +port map( + clk => clock_18, + addr => rgb_palette_addr, + data => rgb_palette_do +); + +end struct; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/galaga_mist.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/galaga_mist.vhd new file mode 100644 index 00000000..6e089ceb --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/galaga_mist.vhd @@ -0,0 +1,277 @@ +--------------------------------------------------------------------------------- +-- Mist FPGA Top level for Galaga Midway by Gehstock. Original DE2 Toplevel by Dar (darfpga@aol.fr) (December 2016) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- +-- Main features : +-- PS2 keyboard input +-- Joystick input +-- Sigma Delta sound output +-- NO board SRAM/Flash used +-- +-- Uses 1 pll for 18MHz, 11MHz and 14khz generation from 27MHz +-- +-- Board key : +-- 0 : reset +-- +-- Keyboard inputs : +-- ESC : Add coin +-- 1 : Start 1 player +-- 2 : Start 2 players +-- SPACE : Fire player 1 & 2 +-- UP arrow : Move right player 1 & 2 +-- DOWN arrow : Move left player 1 & 2 +-- +-- Dip switch and other details : see galaga.vhd + +--------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.ALL; +use ieee.numeric_std.all; + +entity galaga_mist is +port( + CLOCK_27 : in std_logic; + LED : out std_logic; + VGA_R : out std_logic_vector(5 downto 0); + VGA_G : out std_logic_vector(5 downto 0); + VGA_B : out std_logic_vector(5 downto 0); + VGA_HS : out std_logic; + VGA_VS : out std_logic; + SPI_SCK : in std_logic; + SPI_DI : in std_logic; + SPI_DO : out std_logic; + SPI_SS3 : in std_logic; + CONF_DATA0 : in std_logic; + AUDIO_L : out std_logic; + AUDIO_R : out std_logic + +); +end galaga_mist; + +architecture struct of galaga_mist is + signal clock_72 : std_logic; + signal clock_18 : std_logic; + signal pll_locked : std_logic; + signal r : std_logic_vector(2 downto 0); + signal g : std_logic_vector(2 downto 0); + signal b : std_logic_vector(1 downto 0); + signal hsync : std_logic; + signal vsync : std_logic; + signal blankn : std_logic; + signal pix_ce : std_logic; + signal audio : std_logic_vector(9 downto 0); + signal audio_pwm : std_logic; + signal reset : std_logic; + signal scanlines : std_logic_vector(1 downto 0); + signal hq2x : std_logic; + + -- User IO + signal buttons : std_logic_vector(1 downto 0); + signal joy0 : std_logic_vector(7 downto 0); + signal joy1 : std_logic_vector(7 downto 0); + signal status : std_logic_vector(31 downto 0); + signal scandoubler_disable : std_logic; + signal ypbpr : std_logic; + + signal kbd_joy : std_logic_vector(7 downto 0); + signal mright : std_logic; + signal mleft : std_logic; + signal ps2Clk : std_logic; + signal ps2Data : std_logic; + signal ps2_scancode : std_logic_vector(7 downto 0); + + signal VGA_R_O : std_logic_vector(2 downto 0); + signal VGA_G_O : std_logic_vector(2 downto 0); + signal VGA_B_O : std_logic_vector(2 downto 0); + + constant CONF_STR : string := + "Galaga;;O4,Screen Direction,Upright,Normal;O89,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;T5,Reset;"; + + function to_slv(s: string) return std_logic_vector is + constant ss: string(1 to s'length) := s; + variable rval: std_logic_vector(1 to 8 * s'length); + variable p: integer; + variable c: integer; + begin + for i in ss'range loop + p := 8 * i; + c := character'pos(ss(i)); + rval(p - 7 to p) := std_logic_vector(to_unsigned(c,8)); + end loop; + return rval; + end function; + + component mist_io + generic ( STRLEN : integer := 0 ); + port ( + clk_sys :in std_logic; + SPI_SCK, CONF_DATA0, SPI_DI :in std_logic; + SPI_DO : out std_logic; + conf_str : in std_logic_vector(8*STRLEN-1 downto 0); + buttons : out std_logic_vector(1 downto 0); + joystick_0 : out std_logic_vector(7 downto 0); + joystick_1 : out std_logic_vector(7 downto 0); + status : out std_logic_vector(31 downto 0); + scandoubler_disable, ypbpr : out std_logic; + ps2_kbd_clk : out std_logic; + ps2_kbd_data : out std_logic + ); + end component mist_io; + + component video_mixer + generic ( LINE_LENGTH : integer := 384; HALF_DEPTH : integer := 1 ); + port ( + clk_sys, ce_pix, ce_pix_actual : in std_logic; + SPI_SCK, SPI_SS3, SPI_DI : in std_logic; + scanlines : in std_logic_vector(1 downto 0); + scandoubler_disable, hq2x, ypbpr, ypbpr_full : in std_logic; + + R, G, B : in std_logic_vector(2 downto 0); + HSync, VSync, line_start, mono : in std_logic; + + VGA_R,VGA_G, VGA_B : out std_logic_vector(5 downto 0); + VGA_VS, VGA_HS : out std_logic + ); + end component video_mixer; + + component keyboard + PORT( + clk : in std_logic; + reset : in std_logic; + ps2_kbd_clk : in std_logic; + ps2_kbd_data : in std_logic; + joystick : out std_logic_vector (7 downto 0) + ); + end component; + +begin + +reset <= status(0) or status(5) or buttons(1) or not pll_locked; + +pll : entity work.pll + port map( + inclk0 => CLOCK_27, + c0 => clock_72, + c1 => clock_18, + locked => pll_locked +); + +scanlines(1) <= '1' when status(9 downto 8) = "11" and scandoubler_disable = '0' else '0'; +scanlines(0) <= '1' when status(9 downto 8) = "10" and scandoubler_disable = '0' else '0'; +hq2x <= '1' when status(9 downto 8) = "01" else '0'; + +vmixer : video_mixer + port map ( + clk_sys => clock_72, + ce_pix => pix_ce, + ce_pix_actual => pix_ce, + + SPI_SCK => SPI_SCK, + SPI_SS3 => SPI_SS3, + SPI_DI => SPI_DI, + + scanlines => scanlines, + scandoubler_disable => scandoubler_disable, + hq2x => hq2x, + ypbpr => ypbpr, + ypbpr_full => '1', + + R => VGA_R_O, + G => VGA_G_O, + B => VGA_B_O, + HSync => hsync, + VSync => vsync, + line_start => '0', + mono => '0', + + VGA_R => VGA_R, + VGA_G => VGA_G, + VGA_B => VGA_B, + VGA_VS => VGA_VS, + VGA_HS => VGA_HS +); + +mist_io_inst : mist_io + generic map (STRLEN => CONF_STR'length) + port map ( + clk_sys => clock_18, + SPI_SCK => SPI_SCK, + CONF_DATA0 => CONF_DATA0, + SPI_DI => SPI_DI, + SPI_DO => SPI_DO, + conf_str => to_slv(CONF_STR), + buttons => buttons, + scandoubler_disable => scandoubler_disable, + ypbpr => ypbpr, + joystick_1 => joy1, + joystick_0 => joy0, + status => status, + ps2_kbd_clk => ps2Clk, + ps2_kbd_data => ps2Data +); + + mleft <= joy0(1) or joy1(1) or kbd_joy(6) when status(4) = '0' else joy0(2) or joy1(2) or kbd_joy(5); + mright <= joy0(0) or joy1(0) or kbd_joy(7) when status(4) = '0' else joy0(3) or joy1(3) or kbd_joy(4); + +galaga : entity work.galaga + port map( + clock_18 => clock_18, + reset => reset, + video_r => r, + video_g => g, + video_b => b, + video_blankn => blankn, + video_hs => hsync, + video_vs => vsync, + pix_ce => pix_ce, + + audio => audio, + b_test => '0', --no Function at all + b_svce => '0', --no Function at all + coin => kbd_joy(3) or status(1), + start1 => kbd_joy(1) or status(2), + start2 => kbd_joy(2) or status(3), + left1 => mleft, + right1 => mright, + fire1 => joy0(4) or joy1(4) or kbd_joy(0), + left2 => mleft, + right2 => mright, + fire2 => joy0(4) or joy1(4) or kbd_joy(0) +); + +VGA_R_O <= r when blankn = '1' else "000"; +VGA_G_O <= g when blankn = '1' else "000"; +VGA_B_O <= b & b(1) when blankn = '1' else "000"; + +u_dac : entity work.dac + port map( + clk_i => clock_18, + res_n_i => not reset, + dac_i => audio, + dac_o => audio_pwm +); + +AUDIO_L <= audio_pwm; +AUDIO_R <= audio_pwm; + +u_keyboard : keyboard + port map( + clk => clock_18, + reset => reset, + ps2_kbd_clk => ps2Clk, + ps2_kbd_data => ps2Data, + joystick => kbd_joy +); + +LED <= '1'; + +end struct; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/gen_ram.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/gen_ram.vhd new file mode 100644 index 00000000..f1a95608 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/gen_ram.vhd @@ -0,0 +1,84 @@ +-- ----------------------------------------------------------------------- +-- +-- Syntiac's generic VHDL support files. +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- +-- Modified April 2016 by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +-- Remove address register when writing +-- +-- ----------------------------------------------------------------------- +-- +-- gen_rwram.vhd +-- +-- ----------------------------------------------------------------------- +-- +-- generic ram. +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity gen_ram is + generic ( + dWidth : integer := 8; + aWidth : integer := 10 + ); + port ( + clk : in std_logic; + we : in std_logic; + addr : in std_logic_vector((aWidth-1) downto 0); + d : in std_logic_vector((dWidth-1) downto 0); + q : out std_logic_vector((dWidth-1) downto 0) + ); +end entity; + +-- ----------------------------------------------------------------------- + +architecture rtl of gen_ram is + subtype addressRange is integer range 0 to ((2**aWidth)-1); + type ramDef is array(addressRange) of std_logic_vector((dWidth-1) downto 0); + signal ram: ramDef; + + signal rAddrReg : std_logic_vector((aWidth-1) downto 0); + signal qReg : std_logic_vector((dWidth-1) downto 0); +begin +-- ----------------------------------------------------------------------- +-- Signals to entity interface +-- ----------------------------------------------------------------------- +-- q <= qReg; + +-- ----------------------------------------------------------------------- +-- Memory write +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if we = '1' then + ram(to_integer(unsigned(addr))) <= d; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Memory read +-- ----------------------------------------------------------------------- +process(clk) + begin + if rising_edge(clk) then +-- qReg <= ram(to_integer(unsigned(rAddrReg))); +-- rAddrReg <= addr; +---- qReg <= ram(to_integer(unsigned(addr))); + q <= ram(to_integer(unsigned(addr))); + end if; + end process; +--q <= ram(to_integer(unsigned(addr))); +end architecture; + diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/gen_video.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/gen_video.vhd new file mode 100644 index 00000000..47379532 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/gen_video.vhd @@ -0,0 +1,82 @@ +--------------------------------------------------------------------------------- +-- Galaga video horizontal/vertical and sync generator by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.ALL; + +entity gen_video is +port( + clk : in std_logic; + enable : in std_logic; + hcnt : out std_logic_vector(8 downto 0); + vcnt : out std_logic_vector(8 downto 0); + hsync : out std_logic; + vsync : out std_logic; + blankn : out std_logic +); +end gen_video; + +architecture struct of gen_video is + signal hblank : std_logic; + signal vblank : std_logic; + signal hcntReg : unsigned (8 DOWNTO 0) := to_unsigned(000,9); + signal vcntReg : unsigned (8 DOWNTO 0) := to_unsigned(015,9); +begin + +hcnt <= std_logic_vector(hcntReg); +vcnt <= std_logic_vector(vcntReg); + +-- Compteur horizontal : 511-128+1=384 pixels (48 tiles) +-- 192 à 255 : 64 pixels debut de ligne (8 dont 2 dernières tiles affichées) +-- 256 à 511 : 256 pixels centre de ligne (32 tiles affichées) +-- 128 à 191 : 64 pixels fin de ligne (8 dont 2 premières tiles affichées) + +-- Compteur vertical : 263-000+1=264 lignes (33 tiles) +-- 000 à 015 : 16 lignes debut de trame (2 tiles) +-- 016 à 239 : 224 lignes centrales (28 tiles affichées) +-- 240 à 263 : 24 lignes fin de trame (3 tiles + +-- Synchro horizontale : hcnt=[176 à 204] (29 pixels) +-- Synchro verticale : vcnt=[260 à 003] ( 8 lignes) + +process(clk) begin + if rising_edge(clk) then -- clk & ena at 6MHz + if enable = '1' then + + if hcntReg = 511 then + hcntReg <= to_unsigned (128,9); + else + hcntReg <= hcntReg + 1; + end if; + + if hcntReg = 191 then + if vcntReg = 261 then + vcntReg <= to_unsigned(0,9); + else + vcntReg <= vcntReg + 1; + end if; + end if; + + if hcntReg = (175+ 0-8+8) then hsync <= '1'; -- 1 + elsif hcntReg = (175+29-8+8) then hsync <= '0'; + end if; + + if vcntReg = 252 then vsync <= '1'; + elsif vcntReg = 260 then vsync <= '0'; + end if; + + if hcntReg = (127+16+8) then hblank <= '1'; + elsif hcntReg = (255-17+8+1) then hblank <= '0'; + end if; + + if vcntReg = (240+1-1) then vblank <= '1'; + elsif vcntReg = (015+1) then vblank <= '0'; + end if; + + blankn <= not (hblank or vblank); + end if; + end if; +end process; + +end architecture; \ No newline at end of file diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/hq2x.sv b/Arcade/Custom Hardware/Galaga_MIST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_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/Arcade/Custom Hardware/Galaga_MIST/rtl/keyboard.v b/Arcade/Custom Hardware/Galaga_MIST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Custom Hardware/Galaga_MIST/rtl/mist_io.v b/Arcade/Custom Hardware/Galaga_MIST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_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/Arcade/Custom Hardware/Galaga_MIST/rtl/osd.v b/Arcade/Custom Hardware/Galaga_MIST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_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/Arcade/Custom Hardware/Galaga_MIST/rtl/pll.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/pll.vhd new file mode 100644 index 00000000..ce065a7b --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/pll.vhd @@ -0,0 +1,389 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Full Version +-- ************************************************************ + + +--Copyright (C) 1991-2014 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire6_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire6_bv(0 DOWNTO 0) <= "0"; + sub_wire6 <= To_stdlogicvector(sub_wire6_bv); + sub_wire3 <= sub_wire0(0); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + locked <= sub_wire2; + c0 <= sub_wire3; + sub_wire4 <= inclk0; + sub_wire5 <= sub_wire6(0 DOWNTO 0) & sub_wire4; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 3, + clk0_duty_cycle => 50, + clk0_multiply_by => 8, + clk0_phase_shift => "0", + clk1_divide_by => 3, + clk1_duty_cycle => 50, + clk1_multiply_by => 2, + clk1_phase_shift => "0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NO_COMPENSATION", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "ON", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire5, + clk => sub_wire0, + locked => sub_wire2 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "1" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "1" +-- 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 "13500" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "3" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "72.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "18.000000" +-- 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 "1" +-- 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "7" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "2" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "72.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "18.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 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_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: 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 "1" +-- 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: 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_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 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 "3" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "3" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- 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 "NO_COMPENSATION" +-- 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_USED" +-- 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_UNUSED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "ON" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..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: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- 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: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/rgb.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/rgb.vhd new file mode 100644 index 00000000..cb86d09f --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/rgb.vhd @@ -0,0 +1,21 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rgb is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rgb is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F6",X"07",X"3F",X"27",X"2F",X"C7",X"F8",X"ED",X"16",X"38",X"21",X"D8",X"C4",X"C0",X"A0",X"00", + X"F6",X"07",X"3F",X"27",X"00",X"C7",X"F8",X"E8",X"00",X"38",X"00",X"D8",X"C5",X"C0",X"00",X"00"); +begin + +data <= rom_data(to_integer(unsigned(addr))); + +end architecture; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/scandoubler.v b/Arcade/Custom Hardware/Galaga_MIST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Custom Hardware/Galaga_MIST/rtl/sound_machine.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/sound_machine.vhd new file mode 100644 index 00000000..e8df4c1a --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/sound_machine.vhd @@ -0,0 +1,153 @@ +--------------------------------------------------------------------------------- +-- Galaga sound machine by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- 3 voices frequency/waveform synthetizer +-- +-- Original hardware done with only one 4 bits sequential adder to realise +-- one 20 bits adder and two 16 bits adder. +-- +-- Too nice and clever to be done another way, just doing it the same way! +-- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity sound_machine is +port( + clock_18 : in std_logic; + hcnt : in std_logic_vector(5 downto 0); + ena : in std_logic; + cpu_addr : in std_logic_vector(3 downto 0); + cpu_do : in std_logic_vector(3 downto 0); + ram_0_we : in std_logic; + ram_1_we : in std_logic; + audio : out std_logic_vector(9 downto 0) +); +end sound_machine; + +architecture struct of sound_machine is + + signal clock_18n : std_logic; + signal snd_ram_addr : std_logic_vector(3 downto 0); + signal snd_ram_di : std_logic_vector(3 downto 0); + signal snd_ram_0_we : std_logic; + signal snd_ram_1_we : std_logic; + signal snd_ram_0_do : std_logic_vector(3 downto 0); + signal snd_ram_1_do : std_logic_vector(3 downto 0); + + signal snd_seq_do : std_logic_vector(3 downto 0); + + signal snd_samples_addr : std_logic_vector(7 downto 0); + signal snd_samples_do : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(4 downto 0) := (others => '0'); + signal sum_r : std_logic_vector(4 downto 0) := (others => '0'); + signal sum_3_rr : std_logic := '0'; + + signal samples_ch0 : std_logic_vector(3 downto 0); + signal samples_ch1 : std_logic_vector(3 downto 0); + signal samples_ch2 : std_logic_vector(3 downto 0); + signal volume_ch0 : std_logic_vector(3 downto 0); + signal volume_ch1 : std_logic_vector(3 downto 0); + signal volume_ch2 : std_logic_vector(3 downto 0); + +begin + +clock_18n <= not clock_18; + +snd_ram_addr <= cpu_addr when (ram_0_we = '1' or ram_1_we = '1') else hcnt(5 downto 2); +snd_ram_di <= cpu_do when (ram_0_we = '1' or ram_1_we = '1') else sum_r(3 downto 0); + +snd_ram_0_we <= (not snd_seq_do(1) and ena) or ram_0_we ; +snd_ram_1_we <= ram_1_we; + +sum <= ('0' & snd_ram_0_do) + ('0' & snd_ram_1_do) + ("0000" & sum_r(4)); + +process (clock_18) + function mul4x4(arg1, arg2: std_logic_vector(3 downto 0)) return std_logic_vector is + variable rval: std_logic_vector(9 downto 0); + begin + rval := "0000000000"; + if arg2(3) = '1' then rval := rval + (arg1 & "000"); end if; + if arg2(2) = '1' then rval := rval + (arg1 & "00"); end if; + if arg2(1) = '1' then rval := rval + (arg1 & "0"); end if; + if arg2(0) = '1' then rval := rval + arg1; end if; + return rval; + end mul4x4; +begin + if rising_edge(clock_18) then + if ena = '1' then + if snd_seq_do(3) = '0' then + sum_r <= (others => '0'); + sum_3_rr <= '0'; + elsif snd_seq_do(0) = '0' then + sum_r <= sum; + sum_3_rr <= sum_r(3); + end if ; + + snd_samples_addr <= snd_ram_0_do(2 downto 0) & sum_r(3 downto 0) & sum_3_rr; + + if snd_seq_do(2) = '0' then + if hcnt(5 downto 2) = X"5" then + samples_ch0 <= snd_samples_do(3 downto 0); + volume_ch0 <= snd_ram_1_do; + end if; + if hcnt(5 downto 2) = X"A" then + samples_ch1 <= snd_samples_do(3 downto 0); + volume_ch1 <= snd_ram_1_do; + end if; + if hcnt(5 downto 2) = X"F" then + samples_ch2 <= snd_samples_do(3 downto 0); + volume_ch2 <= snd_ram_1_do; + end if; + end if; + + audio <= mul4x4(samples_ch0, volume_ch0) + + mul4x4(samples_ch1, volume_ch1) + + mul4x4(samples_ch2, volume_ch2); + end if; + end if; +end process; + +-- sound register RAM0 +sound_ram_0 : entity work.gen_ram +generic map( dWidth => 4, aWidth => 4) +port map( + clk => clock_18n, + we => snd_ram_0_we, + addr => snd_ram_addr, + d => snd_ram_di, + q => snd_ram_0_do +); + +-- sound register RAM1 +sound_ram_1 : entity work.gen_ram +generic map( dWidth => 4, aWidth => 4) +port map( + clk => clock_18n, + we => snd_ram_1_we, + addr => snd_ram_addr, + d => snd_ram_di, + q => snd_ram_1_do +); + +-- sound samples ROM +sound_samples : entity work.sound_samples +port map( + clk => clock_18n, + addr => snd_samples_addr, + data => snd_samples_do +); + +-- sound compute sequencer ROM +sound_seq : entity work.sound_seq +port map( + clk => clock_18n, + addr => not ram_0_we & hcnt(5 downto 0), + data => snd_seq_do +); + +end struct; diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/stars.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/stars.vhd new file mode 100644 index 00000000..ba229cb1 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/stars.vhd @@ -0,0 +1,587 @@ +--------------------------------------------------------------------------------- +-- Galaga stars sets generator by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- +-- Done from only available MAME information +-- +-- star set data description +-- +-- | 8 bits | 8 bits | +-- |------------------------------------| +-- | 0x80 | scan line number | 0x80 id for line number +-- | star 1 color | star 1 position | star color alway < 0x40 +-- | star 2 color | star 2 position | +-- | 0x80 | scan line number | +-- | star 1 color | star 1 position | +-- | 0x80 | scan line number | +-- | star 1 color | star 1 position | from 1 up to 3 stars for +-- | star 2 color | star 2 position | the given scan lien number +-- | star 3 color | star 3 position | +-- ... +-- | 0xC0 | N.U. | end of list +-- +-- Scan line number are 1 less than MAME list because of way of realisation +-- Scan line number are ordered from lower to higher. +-- There are 4 sets of 63 stars max. There can be up to 3 stars max for a given scan line. + + +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity stars is +port ( + clk : in std_logic; + addr_set0 : in std_logic_vector( 6 downto 0); + data_set0 : out std_logic_vector(15 downto 0); + addr_set1 : in std_logic_vector( 6 downto 0); + data_set1 : out std_logic_vector(15 downto 0); + addr_set2 : in std_logic_vector( 6 downto 0); + data_set2 : out std_logic_vector(15 downto 0); + addr_set3 : in std_logic_vector( 6 downto 0); + data_set3 : out std_logic_vector(15 downto 0) +); +end entity; + +architecture stars_table of stars is + +type table0 is array(0 to 127) of std_logic_vector(15 downto 0); +signal data0 : table0 := ( +X"8006", -- line 0x06 +X"3584", -- one star at 0x84, color is 0x35 +X"8008", -- line 0x08 +X"308E", -- one star at 0x8E, color is 0x30 +X"801B", -- ... +X"07E4", +X"801C", +X"3121", +X"8025", +X"1DE4", +X"8026", +X"2914", +X"802D", +X"3B7F", +X"802E", +X"1C96", +X"803B", +X"05B9", +X"803D", +X"3635", +X"8044", -- line 0x44 +X"0956", -- fist star at 0x56, color is 0x09 +X"3DCE", -- second star at 0xCE, color is 0x3D +X"804E", +X"2760", +X"8064", +X"1A86", +X"17D5", +X"806C", +X"3C0A", +X"806D", +X"2405", +X"806E", +X"3A17", +X"8079", +X"23A8", +X"807B", +X"1189", +X"8080", +X"0CD5", +X"8082", +X"3F66", +X"8083", +X"3838", +X"1471", +X"8084", +X"16EB", +X"8085", +X"108D", +X"8088", +X"251F", +X"808A", +X"0F94", +X"808D", +X"000D", +X"8091", +X"2E05", +X"8094", +X"0D06", +X"8097", +X"0BAD", +X"8098", +X"2DFF", +X"809B", +X"0185", +X"80A1", +X"3457", +X"3EFD", +X"80A8", +X"1FA1", +X"80AA", +X"0A40", +X"80AC", +X"323E", +X"03DD", +X"80B9", +X"26D3", +X"80BB", +X"1B6C", +X"80BD", +X"3961", +X"80BE", +X"18C8", +X"80C1", +X"046B", +X"80C3", +X"2158", +X"80CC", +X"0E5F", +X"1290", +X"80CF", +X"063E", +X"22F6", +X"80D0", +X"3343", +X"80D2", +X"0833", +X"80D9", +X"20D2", +X"80DD", +X"3770", +X"80E1", +X"2C72", +X"80E3", +X"2FB8", +X"80E4", +X"13A8", +X"80E7", +X"19D2", +X"80ED", +X"0236", +X"80F4", +X"15BC", +X"80F6", +X"280E", +X"80F7", +X"2B4E", +X"80FF", +X"2AFA", +X"C000", +X"0000", +X"0000", +X"0000", +X"0000", +X"0000", +X"0000", +X"0000", +X"0000" +); + +type table1 is array(0 to 127) of std_logic_vector(15 downto 0); +signal data1 : table1 := ( +X"8004", +X"3DFD", +X"8006", +X"10C3", +X"8007", +X"2D1D", +X"800B", +X"1F82", +X"800D", +X"3C2D", +X"800E", +X"001E", +X"2CD7", +X"800F", +X"1702", +X"8011", +X"3F94", +X"8017", +X"3569", +X"02CB", +X"8018", +X"32FF", +X"801D", +X"3691", +X"8021", +X"04E2", +X"802D", +X"372E", +X"802F", +X"0CEF", +X"803E", +X"069A", +X"804C", +X"07A3", +X"804D", +X"13E9", +X"804E", +X"2183", +X"8052", +X"0F32", +X"8053", +X"0E6F", +X"8059", +X"0805", +X"8060", +X"2880", +X"8061", +X"2936", +X"8067", +X"2F8E", +X"806A", +X"1D1A", +X"807C", +X"12BE", +X"807F", +X"3150", +X"8086", +X"2560", +X"808F", +X"0D69", +X"8091", +X"1969", +X"8092", +X"058F", +X"8096", +X"243A", +X"8097", +X"0A8B", +X"8099", +X"0305", +X"3837", +X"18A7", +X"80A6", +X"2075", +X"1CAC", +X"1EEB", +X"80AC", +X"1585", +X"80AF", +X"3E77", +X"80B3", +X"097A", +X"80B8", +X"3926", +X"80C2", +X"2387", +X"80C3", +X"3A43", +X"80C5", +X"34CE", +X"80C9", +X"3034", +X"80D1", +X"3B6D", +X"80D7", +X"16D5", +X"80D9", +X"2B39", +X"80E0", +X"11AA", +X"80E2", +X"1BDF", +X"80E6", +X"0B6E", +X"80E8", +X"14B7", +X"1AD8", +X"22F8", +X"80F1", +X"2E03", +X"80F8", +X"2648", +X"80F9", +X"010F", +X"80FB", +X"3338", +X"80FC", +X"2727", +X"C000", +X"0000", +X"0000", +X"0000", +X"0000", +X"0000", +X"0000", +X"0000", +X"0000", +X"0000" +); + +type table2 is array(0 to 127) of std_logic_vector(15 downto 0); +signal data2 : table2 := ( +X"8006", +X"19F9", +X"8007", +X"2DE3", +X"800A", +X"0371", +X"801B", +X"0083", +X"801D", +X"29B9", +X"8022", +X"04E2", +X"8026", +X"2AD0", +X"8032", +X"3088", +X"8036", +X"275A", +X"803A", +X"3683", +X"803F", +X"0D52", +X"8040", +X"1D07", +X"1A54", +X"8041", +X"31A9", +X"2BFA", +X"8046", +X"16BB", +X"8052", +X"3992", +X"8057", +X"10B8", +X"8059", +X"2853", +X"805A", +X"01E5", +X"805D", +X"1BA6", +X"805E", +X"352C", +X"8062", +X"2113", +X"806D", +X"1F68", +X"806F", +X"0BCD", +X"8075", +X"2FDE", +X"8077", +X"12CA", +X"807C", +X"234D", +X"8084", +X"0F49", +X"8086", +X"2511", +X"808C", +X"3267", +X"8095", +X"2002", +X"809C", +X"1709", +X"80A3", +X"085A", +X"80A4", +X"3E5E", +X"2E71", +X"80A6", +X"06CB", +X"80AB", +X"0C89", +X"80AD", +X"26DF", +X"80AF", +X"0AF2", +X"80B4", +X"1374", +X"80B7", +X"1167", +X"80C2", +X"2C6C", +X"80C3", +X"1475", +X"80C4", +X"1ECE", +X"80C5", +X"1C03", +X"80C6", +X"3F12", +X"80C7", +X"3CB8", +X"80D7", +X"3404", +X"3A94", +X"80D8", +X"02FB", +X"80DC", +X"09E6", +X"80E1", +X"051C", +X"80E6", +X"3304", +X"80E9", +X"3B1B", +X"80ED", +X"37A1", +X"80EE", +X"0727", +X"80EF", +X"18DC", +X"80F0", +X"386C", +X"80F2", +X"0EA0", +X"80F7", +X"3D73", +X"80F9", +X"2268", +X"80FF", +X"243E", +X"C000", +X"0000", +X"0000", +X"0000", +X"0000", +X"0000" +); + +type table3 is array(0 to 127) of std_logic_vector(15 downto 0); +signal data3 : table3 := ( +X"8010", +X"3470", +X"8011", +X"23AE", +X"8014", +X"269F", +X"8017", +X"0201", +X"8019", +X"314A", +X"801C", +X"0E92", +X"801E", +X"251A", +X"8020", +X"2E31", +X"3AED", +X"8022", +X"2F78", +X"8023", +X"176B", +X"8025", +X"11BB", +X"8029", +X"3040", +X"802E", +X"321B", +X"8031", +X"01B8", +X"8032", +X"0582", +X"803A", +X"1294", +X"803F", +X"070C", +X"8041", +X"331F", +X"8045", +X"2C91", +X"8047", +X"08D3", +X"804B", +X"2DA0", +X"3BD1", +X"8052", +X"24D5", +X"805F", +X"1C99", +X"8060", +X"3D15", +X"8063", +X"1F19", +X"8066", +X"28CC", +X"8067", +X"10FE", +X"8069", +X"2034", +X"806C", +X"048E", +X"2AC9", +X"8074", +X"0959", +X"8078", +X"385F", +X"8079", +X"1E71", +X"807F", +X"2936", +X"8080", +X"1411", +X"8082", +X"2B28", +X"8098", +X"3683", +X"8099", +X"3731", +X"80A0", +X"19BA", +X"80A3", +X"3E3D", +X"80A6", +X"1A49", +X"80A7", +X"2128", +X"80B7", +X"229C", +X"80B9", +X"156B", +X"80C0", +X"0A0B", +X"80C3", +X"0FC1", +X"80C9", +X"0D2E", +X"80CE", +X"16D1", +X"0BF2", +X"80CF", +X"2774", +X"80D5", +X"3519", +X"80D6", +X"3925", +X"80DA", +X"3C7F", +X"80DD", +X"00A8", +X"80EB", +X"03BB", +X"80EF", +X"1B31", +X"80F0", +X"3F66", +X"80F1", +X"18EE", +X"80F3", +X"0CA7", +X"80F9", +X"1DDD", +X"80FA", +X"132B", +X"C000", +X"0000", +X"0000", +X"0000", +X"0000", +X"0000" +); + +begin +process(clk) +begin + if rising_edge(clk) then + data_set0 <= data0(to_integer(unsigned(addr_set0))); + data_set1 <= data1(to_integer(unsigned(addr_set1))); + data_set2 <= data2(to_integer(unsigned(addr_set2))); + data_set3 <= data3(to_integer(unsigned(addr_set3))); + end if; +end process; +end architecture; + diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/stars_machine.vhd b/Arcade/Custom Hardware/Galaga_MIST/rtl/stars_machine.vhd new file mode 100644 index 00000000..e5f51e48 --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_MIST/rtl/stars_machine.vhd @@ -0,0 +1,126 @@ +--------------------------------------------------------------------------------- +-- Galaga starfield generator by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- +-- Done from only available MAME information +-- +-- star set data description +-- +-- | 8 bits | 8 bits | +-- |------------------------------------| +-- | 0x80 | scan line number | 0x80 id for line number +-- | star 1 color | star 1 position | star color alway < 0x40 +-- | star 2 color | star 2 position | +-- | 0x80 | scan line number | +-- | star 1 color | star 1 position | +-- | 0x80 | scan line number | +-- | star 1 color | star 1 position | from 1 up to 3 stars for +-- | star 2 color | star 2 position | the given scan lien number +-- | star 3 color | star 3 position | +-- ... +-- | 0xC0 | N.U. | end of list +-- +-- Scan line number are 1 less than MAME list because of way of realisation +-- Scan line number are ordered from lower to higher. + +-- Machine wait for current scan line number to be reach by vcnt then it read +-- from 1 to 3 stars (stop reading if reaching next 0x80). After that machine +-- is ready to wait for next scan line, and so on. Machine loops at start of +-- list if 0xC0 is reached. + +library ieee; +use ieee.std_logic_1164.all,ieee.std_logic_unsigned.all,ieee.numeric_std.all; + +entity stars_machine is +port ( + clk : in std_logic; + ena_hcnt : in std_logic; + hcnt : in std_logic_vector( 8 downto 0); + vcnt : in std_logic_vector( 8 downto 0); + stars_set_addr_o : out std_logic_vector( 6 downto 0); + stars_set_data : in std_logic_vector(15 downto 0); + offset_y : in std_logic_vector( 7 downto 0); + star_color : out std_logic_vector( 5 downto 0) +); +end entity; + +architecture behaviour of stars_machine is + + signal stars_set_addr : std_logic_vector( 6 downto 0); + signal stars_state : std_logic_vector( 2 downto 0); + signal star_0 : std_logic_vector(13 downto 0); + signal star_1 : std_logic_vector(13 downto 0); + signal star_2 : std_logic_vector(13 downto 0); + +begin + +stars_set_addr_o <= stars_set_addr; + +process (clk) +begin + if rising_edge(clk) then + -- chercher la ligne suivante + if stars_state = "000" then + if stars_set_data(15) = '1' then + if stars_set_data(14) = '1' then + stars_set_addr <= "0000000"; + else + stars_state <= "001"; + end if; + else + stars_set_addr <= stars_set_addr + "0000001"; + end if; + end if; + -- attendre que la ligne soit jouée + if stars_state = "001" then + if stars_set_data(7 downto 0) = vcnt(7 downto 0) then + stars_state <= "010"; + stars_set_addr <= stars_set_addr + "0000001"; + end if; + end if; + -- oublier toutes les étoiles en début de balayage ligne + -- attendre que la ligne soit jouée + if hcnt = std_logic_vector(to_unsigned(256,9)) and ena_hcnt = '1' then + star_0 <= (others => '0'); + star_1 <= (others => '0'); + star_2 <= (others => '0'); + if stars_state = "010" then + stars_state <= "011"; + end if; + end if; + -- récupérer la première étoile + if stars_state = "011" then + if stars_set_data(15) = '0' then + star_0 <= stars_set_data(13 downto 0); + stars_set_addr <= stars_set_addr + "0000001"; + end if; + stars_state <= "100"; + end if; + -- récupérer la seconde étoile si il y en a une + if stars_state = "100"then + if stars_set_data(15) = '0' then + star_1 <= stars_set_data(13 downto 0); + stars_set_addr <= stars_set_addr + "0000001"; + end if; + stars_state <= "101"; + end if; + -- récupérer la troisième étoile si il y en a une + if stars_state = "101" then + if stars_set_data(15) = '0' then + star_2 <= stars_set_data(13 downto 0); + stars_set_addr <= stars_set_addr + "0000001"; + end if; + stars_state <= "000"; + end if; + + -- jouer les étoiles récupérées + star_color <= "000000"; + if (hcnt(7 downto 0)- offset_y = star_0(7 downto 0)) and hcnt(8) = '0' then star_color <= star_0(13 downto 8); end if; + if (hcnt(7 downto 0)- offset_y = star_1(7 downto 0)) and hcnt(8) = '0' then star_color <= star_1(13 downto 8); end if; + if (hcnt(7 downto 0)- offset_y = star_2(7 downto 0)) and hcnt(8) = '0' then star_color <= star_2(13 downto 8); end if; + + end if; +end process; +end architecture; + diff --git a/Arcade/Custom Hardware/Galaga_MIST/rtl/video_mixer.sv b/Arcade/Custom Hardware/Galaga_MIST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Custom Hardware/Galaga_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/Arcade/Custom Hardware/Phoenix_MIST/README.txt b/Arcade/Custom Hardware/Phoenix_MIST/README.txt new file mode 100644 index 00000000..35a7077c --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/README.txt @@ -0,0 +1,24 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Phoenix for MiST by Gehstock +-- 18 December 2017 +-- +--------------------------------------------------------------------------------- +-- Copyright (c) DAR - Feb 2016 +-- https://sourceforge.net/projects/darfpga/files/Software%20VHDL/phoenix/ +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F1 : Start 1 player +-- F2 : Start 2 players +-- SPACE : Fire +-- ARROW KEYS : Movement/Shield +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Custom Hardware/Phoenix_MIST/Release/phoenix_mist.rbf b/Arcade/Custom Hardware/Phoenix_MIST/Release/phoenix_mist.rbf new file mode 100644 index 00000000..5f78ba38 Binary files /dev/null and b/Arcade/Custom Hardware/Phoenix_MIST/Release/phoenix_mist.rbf differ diff --git a/Arcade/Custom Hardware/Phoenix_MIST/clean.bat b/Arcade/Custom Hardware/Phoenix_MIST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade/Custom Hardware/Phoenix_MIST/phoenix_mist.qpf b/Arcade/Custom Hardware/Phoenix_MIST/phoenix_mist.qpf new file mode 100644 index 00000000..2b8ba3ed --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/phoenix_mist.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 02:40:30 January 25, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "02:40:30 January 25, 2017" + +# Revisions + +PROJECT_REVISION = "phoenix_mist" \ No newline at end of file diff --git a/Arcade/Custom Hardware/Phoenix_MIST/phoenix_mist.qsf b/Arcade/Custom Hardware/Phoenix_MIST/phoenix_mist.qsf new file mode 100644 index 00000000..32fafe8e --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/phoenix_mist.qsf @@ -0,0 +1,334 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 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.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 08:30:59 December 07, 2015 +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:40:24 MAY 17, 2014" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL + +# 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_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 "pll27:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE SPEED +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY phoenix_mist +set_global_assignment -name DEVICE_FILTER_PACKAGE TQFP +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name ALLOW_POWER_UP_DONT_CARE ON +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON + +# Fitter Assignments +# ================== +set_global_assignment -name FITTER_EARLY_TIMING_ESTIMATE_MODE OPTIMISTIC +set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC ON +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING ON +set_global_assignment -name PHYSICAL_SYNTHESIS_ASYNCHRONOUS_SIGNAL_PIPELINING ON +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION ON +set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC_FOR_AREA ON +set_global_assignment -name PHYSICAL_SYNTHESIS_MAP_LOGIC_TO_MEMORY_FOR_AREA ON +set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT EXTRA +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +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" +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# SignalTap II Assignments +# ======================== +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp + +# 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 ENTITY(Phoenix_mist) + +# Pin & Location Assignments +# ========================== + +# Fitter Assignments +# ================== + +# end ENTITY(Phoenix_mist) +# ---------------------- +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name SAVE_DISK_SPACE OFF +set_global_assignment -name FLOW_ENABLE_IO_ASSIGNMENT_ANALYSIS ON + + +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_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[0] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[1] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[2] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[3] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[4] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[5] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[6] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[7] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[8] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[9] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[10] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[11] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[12] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[13] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[14] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[15] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[0] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[1] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[2] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[3] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[4] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[5] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[6] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[7] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[8] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[9] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[10] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[11] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[12] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[0] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[1] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQMH +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQML +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nRAS +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCAS +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nWE +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCS +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[0] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[1] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[2] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[3] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[4] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[5] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[6] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[7] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[8] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[9] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[10] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[11] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[12] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[13] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[14] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[15] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[8] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[9] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[10] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[11] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[12] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[8] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[9] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[10] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[11] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[12] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[13] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[14] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[15] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_BA[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_BA[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQML +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQMH +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nRAS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nCAS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nWE +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nCS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_CKE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CLK +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_HS +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_VS +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to LED +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to AUDIO_L +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to AUDIO_R +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SPI_DO +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to CONF_DATA0 +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_palette_ic41.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_palette_ic40.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_ic40.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_ic39.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_ic24.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_ic23.vhd +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/pll27.vhd +set_global_assignment -name VHDL_FILE rtl/phoenix_video.vhd +set_global_assignment -name VHDL_FILE rtl/phoenix_prog.vhd +set_global_assignment -name VHDL_FILE rtl/phoenix_music.vhd +set_global_assignment -name VHDL_FILE rtl/phoenix_mist.vhd +set_global_assignment -name VHDL_FILE rtl/phoenix_effect3.vhd +set_global_assignment -name VHDL_FILE rtl/phoenix_effect2.vhd +set_global_assignment -name VHDL_FILE rtl/phoenix_effect1.vhd +set_global_assignment -name VHDL_FILE rtl/phoenix.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/gen_ram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Custom Hardware/Phoenix_MIST/phoenix_mist.sdc b/Arcade/Custom Hardware/Phoenix_MIST/phoenix_mist.sdc new file mode 100644 index 00000000..3eba3b05 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/phoenix_mist.sdc @@ -0,0 +1,33 @@ +#************************************************************ +# THIS IS A WIZARD-GENERATED FILE. +# +# Version 13.1.4 Build 182 03/12/2014 SJ Full Version +# +#************************************************************ + +# Copyright (C) 1991-2014 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. + + + +# Clock constraints + +create_clock -name "CLOCK_27" -period 37.037 [get_ports {CLOCK_27}] +create_clock -name {SPI_SCK} -period 10.000 -waveform { 0.000 0.500 } [get_ports {SPI_SCK}] + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_ic23.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_ic23.vhd new file mode 100644 index 00000000..230b2a85 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_ic23.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_ic23 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_ic23 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00", + X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"20",X"00",X"00", + X"00",X"00",X"40",X"00",X"00",X"04",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"40",X"00",X"00", + X"00",X"00",X"20",X"00",X"0C",X"0C",X"00",X"00",X"00",X"20",X"70",X"20",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"08",X"3E",X"08",X"08",X"00",X"10",X"10",X"10",X"FE",X"10",X"10",X"10",X"00", + X"00",X"44",X"00",X"00",X"20",X"00",X"02",X"00",X"10",X"00",X"40",X"08",X"02",X"80",X"04",X"00", + X"01",X"40",X"04",X"10",X"82",X"04",X"50",X"02",X"82",X"48",X"02",X"A0",X"08",X"45",X"20",X"02", + X"3C",X"7E",X"DF",X"AF",X"D7",X"AF",X"56",X"3C",X"3C",X"42",X"99",X"BD",X"BD",X"99",X"42",X"3C", + X"88",X"20",X"04",X"90",X"2A",X"56",X"0F",X"03",X"24",X"18",X"65",X"9A",X"1D",X"A0",X"56",X"28", + X"3C",X"5A",X"AB",X"AD",X"D5",X"D3",X"6A",X"3C",X"38",X"68",X"DC",X"FA",X"2E",X"3F",X"16",X"0C", + X"01",X"2A",X"54",X"2A",X"54",X"2A",X"54",X"80",X"3C",X"46",X"F9",X"8F",X"F3",X"9D",X"62",X"3C", + X"08",X"08",X"1C",X"7F",X"1C",X"08",X"08",X"00",X"1C",X"3A",X"6D",X"75",X"77",X"36",X"1C",X"00", + X"00",X"18",X"3C",X"7E",X"7E",X"3C",X"18",X"00",X"38",X"50",X"E8",X"F8",X"F0",X"D8",X"60",X"38", + X"08",X"2A",X"1C",X"7F",X"1C",X"2A",X"08",X"00",X"38",X"4C",X"9D",X"BD",X"BD",X"B9",X"32",X"1C", + X"62",X"91",X"09",X"3A",X"5C",X"90",X"89",X"46",X"3C",X"5E",X"EB",X"FF",X"DF",X"F7",X"7E",X"3C", + X"FE",X"FC",X"F8",X"C0",X"80",X"10",X"60",X"80",X"F0",X"1C",X"06",X"83",X"C3",X"E3",X"F7",X"FE", + X"FF",X"FF",X"BB",X"EE",X"EE",X"BC",X"F8",X"E0",X"E0",X"F8",X"FC",X"F6",X"BE",X"FF",X"6F",X"6B", + X"40",X"10",X"80",X"C0",X"00",X"00",X"00",X"00",X"21",X"88",X"22",X"10",X"84",X"21",X"88",X"54", + X"E5",X"D0",X"85",X"20",X"94",X"40",X"01",X"A0",X"40",X"10",X"44",X"90",X"02",X"A8",X"C5",X"E8", + X"C0",X"E8",X"60",X"14",X"48",X"04",X"2A",X"01",X"00",X"00",X"80",X"28",X"40",X"10",X"C0",X"D0", + X"FC",X"FC",X"F8",X"FC",X"F2",X"D9",X"0F",X"07",X"00",X"00",X"C0",X"C0",X"98",X"38",X"7C",X"FC", + X"BB",X"D6",X"77",X"E6",X"8E",X"3C",X"F8",X"E0",X"E0",X"F8",X"3C",X"8E",X"66",X"F7",X"F6",X"EB", + X"F8",X"F8",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"03",X"05",X"0A",X"D4",X"E8",X"D0",X"B8",X"78", + X"7F",X"EF",X"C7",X"C3",X"41",X"60",X"30",X"0F",X"01",X"06",X"08",X"01",X"03",X"1F",X"3F",X"7F", + X"E7",X"E4",X"FC",X"7F",X"77",X"37",X"1E",X"07",X"07",X"1F",X"3D",X"7E",X"5E",X"FB",X"BE",X"BE", + X"19",X"16",X"28",X"76",X"7B",X"FC",X"F8",X"E0",X"00",X"00",X"00",X"00",X"02",X"02",X"0C",X"0A", + X"27",X"93",X"29",X"44",X"12",X"24",X"09",X"02",X"05",X"10",X"01",X"44",X"12",X"89",X"23",X"97", + X"03",X"0B",X"10",X"05",X"12",X"00",X"00",X"00",X"80",X"48",X"20",X"15",X"28",X"06",X"27",X"13", + X"39",X"33",X"07",X"0F",X"0F",X"03",X"00",X"00",X"E0",X"D0",X"CB",X"6F",X"3F",X"1F",X"3E",X"3C", + X"DF",X"CB",X"ED",X"67",X"71",X"3C",X"1F",X"07",X"07",X"1F",X"3C",X"71",X"67",X"ED",X"CF",X"DA", + X"1E",X"1D",X"0B",X"17",X"2B",X"50",X"A0",X"C0",X"00",X"00",X"00",X"03",X"07",X"0F",X"1F",X"1F", + X"20",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"77",X"22",X"77",X"22",X"77", + X"77",X"22",X"77",X"22",X"F7",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"20", + X"F0",X"07",X"FF",X"77",X"27",X"72",X"27",X"70",X"70",X"27",X"72",X"27",X"77",X"FF",X"07",X"F0", + X"0F",X"E0",X"FF",X"77",X"27",X"77",X"20",X"70",X"70",X"20",X"77",X"27",X"77",X"FF",X"E0",X"0F", + X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"00",X"E0",X"F0",X"F0",X"FF",X"FF",X"FF",X"FF", + X"F0",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"E7",X"E7",X"81",X"81",X"E7",X"E7",X"FF", + X"01",X"03",X"01",X"01",X"07",X"03",X"01",X"03",X"1F",X"03",X"1F",X"0F",X"07",X"1F",X"03",X"0F", + X"7F",X"0F",X"7F",X"3F",X"0F",X"7F",X"1F",X"3F",X"FF",X"3F",X"7F",X"FF",X"3F",X"FF",X"3F",X"7F", + X"C4",X"CE",X"C4",X"CE",X"C0",X"C0",X"C0",X"C0",X"00",X"FF",X"FF",X"CE",X"C4",X"CE",X"C4",X"CE", + X"CE",X"C4",X"CE",X"C4",X"CE",X"FF",X"FF",X"00",X"C0",X"C0",X"C0",X"C0",X"CE",X"C4",X"CE",X"C4", + X"F0",X"07",X"FF",X"CE",X"C4",X"CE",X"C4",X"CE",X"0E",X"04",X"0E",X"04",X"0E",X"FF",X"07",X"F0", + X"0F",X"E0",X"FF",X"CE",X"C4",X"CE",X"C4",X"CE",X"CE",X"C4",X"CE",X"C4",X"CE",X"FF",X"E0",X"0F", + X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"E0",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"F0",X"FF",X"E7",X"E7",X"FF",X"FF",X"E7",X"E7",X"FF", + X"FF",X"FF",X"7E",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"7E",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"C3",X"C3",X"FF",X"FF",X"C3",X"C3",X"FF",X"00",X"00",X"00",X"00",X"FF",X"C3",X"C3",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"C3",X"FF",X"2F",X"03",X"3F",X"4F",X"FF",X"C3",X"C3",X"FF", + X"FF",X"C3",X"C3",X"FF",X"00",X"00",X"00",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"00",X"00",X"00",X"00",X"2F",X"03",X"3F",X"4F",X"00",X"00",X"00",X"00", + X"FF",X"C3",X"C3",X"FF",X"FF",X"FF",X"FF",X"FF",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"FF",X"FF",X"FF",X"FF",X"2F",X"03",X"3F",X"4F",X"FF",X"FF",X"FF",X"FF", + X"FF",X"C3",X"C3",X"FF",X"2F",X"03",X"3F",X"4F",X"00",X"00",X"00",X"00",X"2F",X"03",X"3F",X"4F", + X"FF",X"FF",X"FF",X"FF",X"2F",X"03",X"3F",X"4F",X"2F",X"03",X"3F",X"4F",X"2F",X"03",X"3F",X"4F", + X"9E",X"F2",X"F0",X"F0",X"F0",X"F0",X"60",X"00",X"00",X"60",X"F0",X"F0",X"F0",X"F0",X"F2",X"9E", + X"9C",X"96",X"F2",X"F0",X"F0",X"F0",X"60",X"00",X"00",X"60",X"F0",X"F0",X"F0",X"F2",X"96",X"9C", + X"F0",X"98",X"9C",X"F6",X"F2",X"F0",X"60",X"00",X"00",X"60",X"F0",X"F2",X"F6",X"9C",X"98",X"F0", + X"F0",X"98",X"9C",X"F6",X"F2",X"62",X"00",X"00",X"00",X"62",X"F2",X"F6",X"9C",X"90",X"F0",X"F0", + X"07",X"0C",X"38",X"60",X"C6",X"6C",X"38",X"00",X"00",X"38",X"6C",X"C6",X"60",X"38",X"0C",X"07", + X"07",X"1C",X"70",X"C0",X"80",X"D8",X"70",X"00",X"00",X"70",X"D8",X"80",X"C0",X"70",X"1C",X"07", + X"07",X"1C",X"70",X"C0",X"80",X"C0",X"60",X"00",X"00",X"60",X"C0",X"80",X"C0",X"70",X"1C",X"07", + X"07",X"3C",X"60",X"C0",X"80",X"80",X"80",X"00",X"FF",X"80",X"80",X"80",X"C0",X"60",X"3C",X"0F", + X"F8",X"FC",X"FC",X"FC",X"78",X"30",X"00",X"00",X"F8",X"7C",X"FE",X"FF",X"FF",X"FF",X"FE",X"F8", + X"00",X"00",X"60",X"F8",X"FC",X"FC",X"F8",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7E",X"3C", + X"78",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"1E",X"3F",X"7F",X"7F",X"3D",X"18",X"00",X"00", + X"3F",X"7F",X"FF",X"FF",X"7F",X"3F",X"3F",X"1F",X"00",X"00",X"04",X"0E",X"1F",X"3F",X"3F",X"1F", + X"00",X"80",X"C0",X"E0",X"E0",X"C0",X"C0",X"00",X"FF",X"7E",X"7C",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"3C",X"7E",X"FE",X"00",X"03",X"07",X"0F",X"0F",X"0F",X"03",X"01", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"38",X"6C",X"7C",X"6C",X"38",X"00",X"38",X"6C",X"7C",X"6C",X"38",X"00",X"00", + X"6C",X"7C",X"6C",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38", + X"6C",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"6C",X"7C", + X"00",X"38",X"7C",X"E6",X"FE",X"E6",X"7C",X"38",X"7C",X"E6",X"FE",X"E6",X"7C",X"38",X"00",X"00", + X"FE",X"E6",X"7C",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"7C",X"E6", + X"7C",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"7C",X"E6",X"FE",X"E6", + X"3C",X"7E",X"E7",X"FF",X"FF",X"E7",X"7E",X"3C",X"E7",X"FF",X"FF",X"E7",X"7E",X"3C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"7E",X"FF",X"E7",X"7E",X"3C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"3C",X"7E",X"E7",X"FF",X"7E",X"3C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"3C",X"7E",X"E7",X"FF",X"FF",X"E7",X"FF",X"CF",X"CE",X"FE",X"FC",X"70",X"00",X"00", + X"00",X"00",X"00",X"70",X"FC",X"FE",X"CE",X"CF",X"07",X"07",X"03",X"03",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"07",X"FF",X"CF",X"CE",X"FE",X"FC",X"F8",X"F0",X"00", + X"00",X"00",X"F0",X"F8",X"FC",X"FE",X"CE",X"CF",X"0E",X"0F",X"07",X"1F",X"03",X"01",X"00",X"00", + X"00",X"00",X"00",X"01",X"03",X"1F",X"07",X"0F",X"7F",X"CE",X"CC",X"F8",X"F8",X"F8",X"F0",X"F0", + X"E0",X"F0",X"F0",X"F8",X"F8",X"F8",X"CC",X"CE",X"1E",X"0F",X"27",X"3F",X"03",X"03",X"01",X"00", + X"00",X"01",X"01",X"03",X"03",X"3F",X"27",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0C",X"27",X"33",X"1F",X"03",X"01",X"03",X"01",X"03",X"03",X"01",X"07",X"03",X"3F",X"67",X"4F", + X"0C",X"67",X"73",X"1F",X"01",X"00",X"07",X"03",X"07",X"0F",X"01",X"03",X"00",X"1F",X"73",X"67", + X"4C",X"F8",X"F8",X"F0",X"F8",X"F0",X"E0",X"C0",X"F8",X"F0",X"F8",X"F8",X"4C",X"4E",X"7E",X"4E", + X"73",X"1F",X"71",X"01",X"07",X"03",X"1F",X"0F",X"01",X"03",X"71",X"1F",X"73",X"06",X"0C",X"06", + X"F8",X"F0",X"F8",X"F8",X"F0",X"E0",X"80",X"00",X"F8",X"F8",X"4C",X"4E",X"7F",X"4E",X"4C",X"F8", + X"00",X"00",X"80",X"E0",X"F0",X"F8",X"F8",X"F0",X"31",X"60",X"07",X"03",X"07",X"1F",X"7F",X"FE", + X"31",X"1F",X"32",X"64",X"08",X"64",X"32",X"1F",X"00",X"FE",X"7F",X"1F",X"07",X"1F",X"01",X"63", + X"F8",X"F0",X"F0",X"E0",X"80",X"00",X"00",X"00",X"4C",X"4E",X"7F",X"4E",X"4C",X"F8",X"F8",X"F0", + X"C0",X"E0",X"F0",X"F0",X"F8",X"F0",X"F8",X"F8",X"07",X"03",X"0F",X"07",X"1F",X"7E",X"F0",X"00", + X"73",X"06",X"0C",X"06",X"73",X"1F",X"71",X"00",X"1F",X"7F",X"07",X"0F",X"01",X"03",X"71",X"1F", + X"FE",X"9C",X"98",X"F0",X"F8",X"FC",X"FC",X"7E",X"3E",X"7E",X"FC",X"FC",X"F8",X"F0",X"98",X"9C", + X"30",X"18",X"0C",X"1F",X"F7",X"61",X"C0",X"00",X"00",X"00",X"C0",X"61",X"F7",X"1F",X"0C",X"18", + X"98",X"F0",X"F8",X"FC",X"FC",X"7E",X"3E",X"3E",X"FC",X"FC",X"F8",X"F0",X"98",X"9C",X"FE",X"9C", + X"0D",X"1F",X"FB",X"31",X"E0",X"00",X"00",X"00",X"E0",X"31",X"FB",X"1F",X"0D",X"19",X"31",X"19", + X"F8",X"FC",X"FC",X"7E",X"3E",X"7F",X"1F",X"3F",X"F8",X"F0",X"98",X"9C",X"FE",X"9C",X"98",X"F0", + X"3F",X"0F",X"1F",X"3F",X"3E",X"7E",X"FC",X"FC",X"3B",X"F1",X"20",X"E0",X"00",X"00",X"00",X"00", + X"3B",X"1F",X"0D",X"19",X"39",X"19",X"0D",X"1F",X"00",X"00",X"00",X"00",X"00",X"E0",X"20",X"F1", + X"FC",X"7E",X"3E",X"7F",X"1F",X"7F",X"1F",X"3F",X"98",X"9C",X"FE",X"9C",X"98",X"F0",X"F8",X"FC", + X"3F",X"1F",X"7E",X"7E",X"FC",X"FC",X"F8",X"F0",X"0D",X"19",X"31",X"19",X"0D",X"EF",X"3B",X"E1", + X"00",X"00",X"00",X"00",X"00",X"E1",X"3B",X"EF",X"7F",X"4E",X"CC",X"F8",X"F8",X"FC",X"FC",X"7C", + X"FC",X"FC",X"FC",X"7C",X"F8",X"F8",X"CC",X"4E",X"0C",X"06",X"63",X"3F",X"61",X"00",X"01",X"00", + X"01",X"00",X"01",X"00",X"61",X"3F",X"63",X"06",X"98",X"F0",X"F8",X"FC",X"FC",X"00",X"00",X"00", + X"F8",X"FC",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"FC",X"FC",X"F8", + X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0", + X"07",X"0F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"0F", + X"0F",X"07",X"1F",X"7E",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"7E",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"3F",X"7E",X"F8",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"F8",X"7E",X"0F",X"3F",X"07",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"7F", + X"1F",X"0F",X"1E",X"0E",X"1E",X"0C",X"1C",X"18",X"7E",X"3F",X"FF",X"1F",X"3F",X"0F",X"3F",X"0F", + X"3F",X"0F",X"07",X"1F",X"0F",X"3F",X"1F",X"7E",X"00",X"18",X"1C",X"0C",X"1E",X"0E",X"1E",X"0F", + X"1E",X"0E",X"3C",X"1C",X"18",X"30",X"00",X"00",X"70",X"38",X"3C",X"1C",X"3E",X"0E",X"3F",X"0F", + X"0E",X"1E",X"1C",X"38",X"30",X"00",X"00",X"00",X"0F",X"3F",X"0F",X"3F",X"0F",X"1F",X"0E",X"1E", + X"1F",X"0F",X"3F",X"0F",X"1F",X"0F",X"3F",X"0F",X"00",X"00",X"00",X"00",X"00",X"38",X"1C",X"0C", + X"0E",X"1C",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"1C",X"0C",X"1E",X"0E", + X"F0",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"FE",X"3E",X"7E",X"3C",X"7C",X"FC",X"78",X"F8", + X"03",X"01",X"07",X"03",X"07",X"1E",X"00",X"00",X"F8",X"78",X"FC",X"7C",X"FC",X"3E",X"7E",X"3E", + X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"00",X"00",X"00",X"1F",X"07",X"03",X"07",X"01", + X"FC",X"F8",X"F8",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"F0",X"F8",X"F8", + X"00",X"01",X"00",X"07",X"03",X"0F",X"1F",X"7C",X"00",X"7C",X"3F",X"0F",X"07",X"03",X"01",X"03", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_ic24.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_ic24.vhd new file mode 100644 index 00000000..f420697f --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_ic24.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_ic24 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_ic24 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"10",X"38",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0", + X"00",X"00",X"44",X"10",X"10",X"40",X"00",X"00",X"00",X"00",X"00",X"08",X"40",X"00",X"90",X"94", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"80",X"40",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"80",X"C0",X"64",X"32",X"19",X"0F",X"07",X"07",X"0D",X"19",X"32",X"64",X"C0",X"80",X"00", + X"80",X"20",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"40",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"05",X"0A",X"14",X"28",X"40",X"80",X"00", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03", + X"18",X"1B",X"03",X"00",X"08",X"08",X"01",X"00",X"00",X"00",X"02",X"01",X"21",X"04",X"41",X"41", + X"04",X"00",X"15",X"00",X"44",X"28",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"02",X"01", + X"07",X"0D",X"18",X"30",X"60",X"C8",X"D0",X"E0",X"E0",X"D0",X"C8",X"60",X"30",X"18",X"0D",X"07", + X"00",X"01",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"05", + X"02",X"04",X"08",X"10",X"28",X"50",X"A0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"77",X"00",X"77",X"00",X"77", + X"77",X"00",X"77",X"00",X"77",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"00", + X"0F",X"F8",X"00",X"77",X"07",X"70",X"07",X"70",X"70",X"07",X"70",X"07",X"77",X"00",X"F8",X"0F", + X"F0",X"1F",X"00",X"77",X"07",X"77",X"00",X"70",X"70",X"00",X"77",X"07",X"77",X"00",X"1F",X"F0", + X"20",X"20",X"20",X"20",X"F0",X"F0",X"F0",X"F0",X"02",X"02",X"02",X"02",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"18",X"7E",X"7E",X"18",X"18",X"00", + X"01",X"03",X"01",X"01",X"07",X"03",X"01",X"03",X"1F",X"03",X"1F",X"0F",X"07",X"1F",X"03",X"0F", + X"7F",X"0F",X"7F",X"3F",X"0F",X"7F",X"1F",X"3F",X"FF",X"3F",X"7F",X"FF",X"3F",X"FF",X"3F",X"7F", + X"00",X"0E",X"00",X"0E",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"0E",X"00",X"0E",X"00",X"0E", + X"0E",X"00",X"0E",X"00",X"0E",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"0E",X"00",X"0E",X"00", + X"0F",X"F8",X"00",X"0E",X"00",X"0E",X"00",X"0E",X"0E",X"00",X"0E",X"00",X"0E",X"00",X"F8",X"0F", + X"F0",X"1F",X"00",X"0E",X"00",X"0E",X"00",X"0E",X"0E",X"00",X"0E",X"00",X"0E",X"00",X"1F",X"F0", + X"F0",X"F0",X"F0",X"F0",X"20",X"20",X"20",X"20",X"0F",X"0F",X"0F",X"0F",X"02",X"02",X"02",X"02", + X"00",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"18",X"18",X"00", + X"FF",X"FF",X"7E",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"7E",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60", + X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60", + X"00",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00", + X"00",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00",X"00", + X"07",X"0C",X"38",X"60",X"C6",X"6C",X"38",X"00",X"00",X"38",X"6C",X"C6",X"60",X"38",X"0C",X"07", + X"07",X"1C",X"70",X"C0",X"80",X"D8",X"70",X"00",X"00",X"70",X"D8",X"80",X"C0",X"70",X"1C",X"07", + X"07",X"1C",X"70",X"C0",X"80",X"C0",X"60",X"00",X"00",X"60",X"C0",X"80",X"C0",X"70",X"1C",X"07", + X"07",X"3C",X"60",X"C0",X"80",X"80",X"80",X"00",X"00",X"80",X"80",X"80",X"C0",X"60",X"3C",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"00",X"10",X"00",X"00",X"00",X"10",X"00",X"10",X"00",X"00",X"00", + X"10",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00", + X"00",X"38",X"44",X"9A",X"82",X"9A",X"44",X"38",X"44",X"9A",X"82",X"9A",X"44",X"38",X"00",X"00", + X"82",X"9A",X"44",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"44",X"9A", + X"44",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"44",X"9A",X"82",X"9A", + X"3C",X"42",X"99",X"81",X"81",X"99",X"42",X"3C",X"99",X"81",X"81",X"99",X"42",X"3C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"42",X"81",X"99",X"42",X"3C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"3C",X"42",X"99",X"81",X"42",X"3C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"3C",X"42",X"99",X"81",X"81",X"99",X"01",X"31",X"32",X"02",X"8C",X"70",X"00",X"00", + X"00",X"00",X"00",X"70",X"8C",X"02",X"32",X"31",X"04",X"04",X"02",X"02",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"02",X"02",X"04",X"01",X"31",X"32",X"02",X"04",X"08",X"F0",X"00", + X"00",X"00",X"F0",X"08",X"04",X"02",X"32",X"31",X"08",X"08",X"04",X"1C",X"02",X"01",X"00",X"00", + X"00",X"00",X"00",X"01",X"02",X"1C",X"04",X"08",X"80",X"30",X"30",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"30",X"01",X"00",X"20",X"3C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"3C",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"20",X"30",X"1E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"70",X"60", + X"03",X"60",X"70",X"1E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1E",X"70",X"60", + X"B0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"B0",X"B0",X"80",X"B0", + X"70",X"1E",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"1E",X"70",X"01",X"03",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"B0",X"B0",X"80",X"B0",X"B0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"60",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"1E",X"31",X"63",X"07",X"33",X"31",X"1E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"B0",X"B0",X"80",X"B0",X"B0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"01",X"03",X"01",X"70",X"1E",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"1E", + X"00",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60", + X"0F",X"07",X"03",X"18",X"F0",X"60",X"C0",X"00",X"00",X"00",X"C0",X"60",X"F0",X"18",X"03",X"07", + X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00",X"60", + X"02",X"18",X"F8",X"30",X"E0",X"00",X"00",X"00",X"E0",X"30",X"F8",X"18",X"02",X"06",X"0E",X"06", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00",X"60",X"60",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"F0",X"20",X"E0",X"00",X"00",X"00",X"00", + X"38",X"18",X"02",X"06",X"06",X"06",X"02",X"18",X"00",X"00",X"00",X"00",X"00",X"E0",X"20",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00",X"60",X"60",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"06",X"0E",X"06",X"02",X"E8",X"38",X"E0", + X"00",X"00",X"00",X"00",X"00",X"E0",X"38",X"E8",X"80",X"B0",X"30",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"B0",X"03",X"01",X"60",X"3E",X"60",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"60",X"3E",X"60",X"01",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_ic39.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_ic39.vhd new file mode 100644 index 00000000..acd8075a --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_ic39.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_ic39 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_ic39 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7C",X"12",X"12",X"12",X"7E",X"7C",X"00", + X"00",X"34",X"4A",X"4A",X"4A",X"7E",X"7E",X"00",X"00",X"24",X"42",X"42",X"42",X"7E",X"3C",X"00", + X"00",X"3C",X"42",X"42",X"42",X"7E",X"7E",X"00",X"00",X"42",X"4A",X"4A",X"4A",X"7E",X"7E",X"00", + X"00",X"02",X"0A",X"0A",X"0A",X"7E",X"7E",X"00",X"00",X"34",X"52",X"52",X"42",X"7E",X"3C",X"00", + X"00",X"7E",X"08",X"08",X"08",X"7E",X"7E",X"00",X"00",X"42",X"42",X"7E",X"7E",X"42",X"42",X"00", + X"00",X"7E",X"7E",X"7E",X"40",X"40",X"30",X"00",X"00",X"42",X"24",X"18",X"08",X"7E",X"7E",X"00", + X"00",X"40",X"40",X"40",X"40",X"7E",X"7E",X"00",X"00",X"7E",X"02",X"7C",X"02",X"7E",X"7E",X"00", + X"00",X"7E",X"20",X"18",X"04",X"7E",X"7E",X"00",X"00",X"3C",X"42",X"42",X"42",X"7E",X"3C",X"00", + X"00",X"0C",X"12",X"12",X"12",X"7E",X"7E",X"00",X"00",X"40",X"3C",X"62",X"42",X"7E",X"3C",X"00", + X"00",X"44",X"2A",X"1A",X"0A",X"7E",X"7E",X"00",X"00",X"34",X"72",X"4A",X"4A",X"4E",X"2C",X"00", + X"00",X"02",X"02",X"7E",X"7E",X"02",X"02",X"00",X"00",X"3E",X"40",X"40",X"40",X"7E",X"7E",X"00", + X"00",X"1E",X"20",X"40",X"20",X"3E",X"1E",X"00",X"00",X"3E",X"40",X"38",X"40",X"7E",X"3E",X"00", + X"00",X"42",X"26",X"1C",X"38",X"74",X"62",X"00",X"00",X"06",X"08",X"70",X"08",X"0E",X"06",X"00", + X"00",X"42",X"46",X"4E",X"5A",X"72",X"62",X"00",X"00",X"00",X"00",X"42",X"42",X"7E",X"00",X"00", + X"00",X"00",X"00",X"7E",X"42",X"42",X"00",X"00",X"00",X"00",X"42",X"66",X"3C",X"18",X"00",X"00", + X"00",X"00",X"00",X"18",X"3C",X"66",X"42",X"00",X"00",X"00",X"24",X"18",X"7E",X"18",X"24",X"00", + X"00",X"00",X"3C",X"46",X"4A",X"52",X"3C",X"00",X"00",X"00",X"40",X"40",X"7E",X"42",X"44",X"00", + X"00",X"00",X"64",X"4A",X"52",X"62",X"44",X"00",X"00",X"00",X"34",X"4A",X"4A",X"4A",X"42",X"00", + X"00",X"00",X"08",X"7E",X"08",X"08",X"0E",X"00",X"00",X"00",X"30",X"4A",X"4A",X"4A",X"4E",X"00", + X"00",X"00",X"30",X"4A",X"4A",X"4A",X"3C",X"00",X"00",X"00",X"06",X"1A",X"32",X"62",X"06",X"00", + X"00",X"00",X"34",X"4A",X"4A",X"4A",X"34",X"00",X"00",X"00",X"3C",X"52",X"52",X"52",X"0C",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"08",X"08",X"08",X"08",X"08",X"00", + X"3C",X"42",X"81",X"81",X"81",X"81",X"42",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09",X"51",X"01",X"02",X"00", + X"FC",X"E0",X"70",X"38",X"1C",X"3E",X"00",X"00",X"00",X"3E",X"1C",X"38",X"70",X"E0",X"FC",X"9F", + X"E0",X"70",X"38",X"7C",X"00",X"00",X"00",X"00",X"00",X"7C",X"38",X"70",X"E0",X"FC",X"9F",X"FC", + X"70",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"70",X"E0",X"FC",X"9F",X"FC",X"E0", + X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"70",X"E0",X"FC",X"9F",X"FC",X"E0",X"70", + X"70",X"E0",X"FC",X"9F",X"FC",X"E0",X"70",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8", + X"E0",X"FC",X"9F",X"FC",X"E0",X"70",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"70", + X"FC",X"9F",X"FC",X"E0",X"70",X"38",X"7C",X"00",X"00",X"00",X"00",X"00",X"7C",X"38",X"70",X"E0", + X"9F",X"FC",X"E0",X"70",X"38",X"1C",X"3E",X"00",X"00",X"00",X"3E",X"1C",X"38",X"70",X"E0",X"FC", + X"7F",X"C7",X"0E",X"1C",X"38",X"70",X"FC",X"00",X"FC",X"70",X"38",X"1C",X"0E",X"C7",X"7F",X"E3", + X"CE",X"1C",X"38",X"70",X"FC",X"00",X"00",X"00",X"FC",X"70",X"38",X"1C",X"CE",X"7F",X"E3",X"7F", + X"3C",X"78",X"FC",X"00",X"00",X"00",X"00",X"00",X"FC",X"78",X"3C",X"DE",X"7F",X"E3",X"7F",X"DE", + X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"78",X"FC",X"7F",X"E3",X"7F",X"FC",X"78", + X"78",X"FC",X"7F",X"E3",X"7F",X"FC",X"78",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC", + X"DE",X"7F",X"E3",X"7F",X"DE",X"3C",X"78",X"FC",X"00",X"00",X"00",X"00",X"00",X"FC",X"78",X"3C", + X"7F",X"E3",X"7F",X"CE",X"1C",X"38",X"70",X"FC",X"00",X"00",X"00",X"FC",X"70",X"38",X"1C",X"CE", + X"E3",X"7F",X"C7",X"0E",X"1C",X"38",X"70",X"FC",X"00",X"FC",X"70",X"38",X"1C",X"0E",X"C7",X"7F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00", + X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00", + X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00", + X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00", + X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"00",X"00",X"00",X"00",X"F0",X"F0",X"00",X"00", + X"00",X"00",X"F0",X"F0",X"00",X"00",X"00",X"00",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00", + X"7E",X"CC",X"38",X"FE",X"38",X"CC",X"7E",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F", + X"78",X"3E",X"78",X"9C",X"0E",X"FF",X"3E",X"00",X"00",X"00",X"00",X"00",X"3E",X"FF",X"0E",X"9C", + X"38",X"5C",X"4E",X"87",X"0F",X"3E",X"FC",X"00",X"FC",X"3E",X"0F",X"87",X"4E",X"5C",X"38",X"3E", + X"0E",X"FF",X"3E",X"00",X"00",X"00",X"00",X"00",X"3E",X"FF",X"0E",X"9C",X"78",X"3E",X"78",X"9C", + X"FF",X"1C",X"38",X"FE",X"38",X"1C",X"FF",X"00",X"82",X"92",X"D6",X"FE",X"FE",X"BA",X"92",X"92", + X"FF",X"38",X"1C",X"7F",X"1C",X"38",X"FF",X"00",X"92",X"92",X"BA",X"FE",X"FE",X"D6",X"92",X"82", + X"00",X"00",X"10",X"38",X"10",X"00",X"00",X"00",X"00",X"08",X"30",X"7C",X"30",X"08",X"00",X"00", + X"00",X"0C",X"38",X"FE",X"38",X"0C",X"00",X"00",X"1E",X"0C",X"38",X"FE",X"38",X"0C",X"1E",X"00", + X"3D",X"3E",X"5C",X"18",X"10",X"20",X"00",X"00",X"00",X"00",X"04",X"08",X"18",X"3A",X"74",X"B8", + X"7C",X"3A",X"18",X"08",X"04",X"00",X"00",X"00",X"00",X"20",X"10",X"18",X"5C",X"2E",X"1D",X"BC", + X"BC",X"1D",X"2E",X"5C",X"18",X"10",X"20",X"00",X"00",X"00",X"00",X"04",X"08",X"18",X"3A",X"7C", + X"74",X"3A",X"18",X"08",X"04",X"00",X"00",X"00",X"00",X"20",X"10",X"18",X"5C",X"3E",X"3D",X"B8", + X"18",X"F8",X"F0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"38",X"38",X"18", + X"FE",X"BA",X"92",X"92",X"00",X"10",X"28",X"10",X"00",X"00",X"00",X"00",X"82",X"92",X"D6",X"FE", + X"18",X"1F",X"0F",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"1C",X"1C",X"18", + X"00",X"00",X"00",X"00",X"00",X"0A",X"0E",X"00",X"00",X"C3",X"66",X"BC",X"E7",X"BC",X"66",X"C3", + X"F0",X"F8",X"3C",X"0C",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"C0", + X"A0",X"C0",X"E0",X"F0",X"70",X"38",X"18",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"DC",X"0C",X"0C",X"1C",X"18",X"10",X"00",X"00",X"00",X"00",X"00",X"80",X"E8",X"F0",X"78", + X"00",X"40",X"88",X"70",X"E0",X"C0",X"80",X"00",X"80",X"40",X"E0",X"F0",X"F8",X"C4",X"20",X"00", + X"00",X"40",X"88",X"F0",X"E0",X"C0",X"80",X"00",X"80",X"40",X"E0",X"F0",X"B8",X"44",X"20",X"00", + X"F0",X"C0",X"80",X"E0",X"80",X"C0",X"F0",X"00",X"F0",X"80",X"C2",X"F5",X"C2",X"80",X"F0",X"00", + X"FE",X"D6",X"92",X"82",X"00",X"00",X"00",X"00",X"10",X"28",X"10",X"00",X"92",X"92",X"BA",X"FE", + X"7C",X"E0",X"C0",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"C0",X"E0",X"7C",X"F0", + X"0F",X"0C",X"10",X"00",X"00",X"00",X"00",X"00",X"70",X"38",X"1C",X"1C",X"0E",X"0E",X"07",X"07", + X"07",X"03",X"01",X"03",X"03",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"1C",X"1F", + X"00",X"00",X"01",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1C",X"00", + X"02",X"04",X"0E",X"1F",X"3F",X"47",X"08",X"01",X"00",X"04",X"22",X"1D",X"0F",X"07",X"02",X"01", + X"02",X"04",X"0F",X"1F",X"3B",X"45",X"08",X"01",X"00",X"04",X"23",X"1F",X"0F",X"07",X"02",X"01", + X"0F",X"01",X"43",X"AF",X"43",X"01",X"0F",X"00",X"0F",X"03",X"01",X"07",X"01",X"03",X"0F",X"00", + X"78",X"FA",X"DC",X"9F",X"BF",X"33",X"43",X"1E",X"1E",X"47",X"33",X"BF",X"9F",X"DC",X"FA",X"78", + X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"01",X"00",X"00",X"01", + X"C0",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"C0",X"00", + X"E8",X"F0",X"60",X"40",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"20",X"C0",X"C4", + X"C4",X"C0",X"20",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"E0",X"F0",X"C8", + X"C8",X"F0",X"E0",X"40",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"20",X"C0",X"C4", + X"C4",X"C0",X"20",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"60",X"F0",X"E8", + X"C0",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0C",X"3C",X"F8",X"F0", + X"38",X"70",X"F0",X"E0",X"C0",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"18",X"18", + X"78",X"F0",X"E8",X"80",X"00",X"00",X"00",X"00",X"00",X"10",X"18",X"18",X"0C",X"0C",X"DC",X"F8", + X"07",X"0E",X"1C",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"1C",X"0E",X"07",X"1F", + X"23",X"03",X"04",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"07",X"0F",X"13", + X"17",X"0F",X"06",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"04",X"03",X"23", + X"23",X"03",X"04",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"06",X"0F",X"17", + X"13",X"0F",X"07",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"04",X"03",X"23", + X"07",X"07",X"0E",X"0E",X"1C",X"1C",X"38",X"70",X"00",X"00",X"00",X"00",X"20",X"10",X"0C",X"0F", + X"04",X"03",X"03",X"01",X"03",X"07",X"1F",X"7C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"1C",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"01",X"00",X"00", + X"00",X"60",X"60",X"00",X"08",X"00",X"00",X"00",X"40",X"00",X"08",X"1C",X"08",X"00",X"00",X"00", + X"18",X"7E",X"CF",X"BD",X"BD",X"F3",X"7F",X"3C",X"08",X"24",X"01",X"84",X"50",X"09",X"22",X"08", + X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"E0",X"A1",X"29",X"23",X"B3",X"77",X"77",X"FF",X"FF", + X"FF",X"FF",X"77",X"77",X"B3",X"23",X"A9",X"25",X"E0",X"F8",X"FC",X"FC",X"FE",X"FE",X"FF",X"FF", + X"8C",X"C2",X"C0",X"F0",X"3A",X"38",X"0C",X"46",X"C4",X"80",X"FC",X"FF",X"F0",X"82",X"F0",X"38", + X"05",X"1C",X"78",X"F2",X"F0",X"C4",X"98",X"72",X"E2",X"80",X"0C",X"1E",X"1A",X"8C",X"00",X"00", + X"F8",X"78",X"B0",X"60",X"F3",X"DB",X"D8",X"30",X"0C",X"1E",X"0C",X"80",X"C0",X"C0",X"64",X"B2", + X"00",X"00",X"08",X"1C",X"3E",X"36",X"22",X"00",X"00",X"00",X"0E",X"1C",X"38",X"1C",X"0E",X"00", + X"00",X"00",X"3E",X"3E",X"3E",X"3E",X"3E",X"00",X"60",X"70",X"78",X"7C",X"3C",X"1C",X"0C",X"04", + X"20",X"30",X"38",X"1C",X"0E",X"06",X"02",X"00",X"00",X"10",X"38",X"7C",X"FE",X"7C",X"38",X"10", + X"FF",X"FF",X"7F",X"7F",X"3F",X"3F",X"1F",X"07",X"A4",X"85",X"D4",X"C6",X"EE",X"EF",X"FF",X"FF", + X"FF",X"FF",X"EF",X"EE",X"C6",X"D4",X"84",X"A5",X"07",X"1F",X"3F",X"3F",X"7F",X"7F",X"FF",X"FF", + X"3F",X"3D",X"2D",X"66",X"26",X"43",X"12",X"20",X"3B",X"3B",X"75",X"EE",X"F5",X"3B",X"7B",X"9F", + X"20",X"09",X"2C",X"84",X"44",X"ED",X"6D",X"7F",X"77",X"27",X"03",X"20",X"00",X"08",X"1C",X"08", + X"EF",X"F9",X"77",X"37",X"7C",X"DF",X"EB",X"7D",X"20",X"41",X"04",X"31",X"7B",X"7E",X"33",X"6F", + X"00",X"00",X"22",X"36",X"3E",X"1C",X"08",X"00",X"00",X"38",X"1C",X"0E",X"1C",X"38",X"00",X"00", + X"00",X"60",X"78",X"3C",X"1E",X"0E",X"06",X"00",X"00",X"38",X"38",X"38",X"18",X"18",X"38",X"38", + X"00",X"00",X"07",X"7F",X"FE",X"E0",X"00",X"00",X"03",X"07",X"77",X"DD",X"FF",X"F6",X"3C",X"00", + X"9E",X"F8",X"E0",X"70",X"38",X"7C",X"00",X"00",X"00",X"00",X"00",X"7C",X"38",X"70",X"E0",X"F8", + X"79",X"3F",X"67",X"0E",X"1C",X"38",X"7C",X"00",X"00",X"00",X"7C",X"38",X"1C",X"0E",X"67",X"3F", + X"90",X"20",X"40",X"80",X"00",X"00",X"00",X"00",X"34",X"34",X"34",X"64",X"68",X"68",X"C8",X"D0", + X"D0",X"C8",X"68",X"68",X"64",X"34",X"34",X"34",X"00",X"00",X"00",X"00",X"80",X"40",X"20",X"90", + X"34",X"64",X"C8",X"90",X"20",X"C0",X"00",X"00",X"0D",X"0D",X"0D",X"0D",X"19",X"1A",X"1A",X"32", + X"32",X"1A",X"1A",X"19",X"0D",X"0D",X"0D",X"0D",X"00",X"00",X"C0",X"20",X"90",X"C8",X"64",X"34", + X"09",X"04",X"02",X"01",X"00",X"00",X"00",X"00",X"2C",X"2C",X"2C",X"26",X"16",X"16",X"13",X"0B", + X"0B",X"03",X"06",X"06",X"26",X"2C",X"2C",X"2C",X"00",X"00",X"00",X"00",X"01",X"02",X"04",X"09", + X"2C",X"26",X"13",X"09",X"04",X"03",X"00",X"00",X"B0",X"B0",X"B0",X"B0",X"98",X"58",X"58",X"4C", + X"4C",X"58",X"50",X"98",X"B0",X"B0",X"B0",X"B0",X"00",X"00",X"03",X"04",X"09",X"13",X"26",X"2C", + X"03",X"1F",X"FC",X"E1",X"0E",X"F0",X"00",X"00",X"C0",X"F8",X"3F",X"87",X"70",X"0F",X"00",X"00", + X"00",X"00",X"0F",X"70",X"87",X"3F",X"F8",X"C0",X"00",X"00",X"F0",X"0E",X"E1",X"FC",X"1F",X"03", + X"00",X"00",X"01",X"0F",X"FE",X"F0",X"07",X"F8",X"00",X"00",X"80",X"F0",X"7F",X"0F",X"E0",X"1F", + X"1F",X"E0",X"0F",X"7F",X"F0",X"80",X"00",X"00",X"F8",X"07",X"F0",X"FE",X"0F",X"01",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_ic40.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_ic40.vhd new file mode 100644 index 00000000..ab29736f --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_ic40.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_ic40 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_ic40 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"18",X"7E",X"18",X"24",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"24",X"42",X"42",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"3E",X"00",X"00",X"00",X"3E",X"00",X"00",X"00",X"00",X"00",X"F0", + X"00",X"00",X"00",X"7C",X"00",X"00",X"00",X"00",X"00",X"7C",X"00",X"00",X"00",X"00",X"F0",X"00", + X"00",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"F0",X"00",X"00", + X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"F0",X"00",X"00",X"00", + X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8", + X"00",X"00",X"F0",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"00", + X"00",X"F0",X"00",X"00",X"00",X"00",X"7C",X"00",X"00",X"00",X"00",X"00",X"7C",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"3E",X"00",X"00",X"00",X"3E",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"00",X"00",X"00",X"00",X"FC",X"00",X"FC",X"00",X"00",X"00",X"00",X"C0",X"00",X"DC", + X"C0",X"00",X"00",X"00",X"FC",X"00",X"00",X"00",X"FC",X"00",X"00",X"00",X"C0",X"00",X"DC",X"00", + X"00",X"00",X"FC",X"00",X"00",X"00",X"00",X"00",X"FC",X"00",X"00",X"C0",X"00",X"DC",X"00",X"C0", + X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"00",X"C0",X"00",X"DC",X"00",X"C0",X"00", + X"00",X"C0",X"00",X"DC",X"00",X"C0",X"00",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC", + X"C0",X"00",X"DC",X"00",X"C0",X"00",X"00",X"FC",X"00",X"00",X"00",X"00",X"00",X"FC",X"00",X"00", + X"00",X"DC",X"00",X"C0",X"00",X"00",X"00",X"FC",X"00",X"00",X"00",X"FC",X"00",X"00",X"00",X"C0", + X"DC",X"00",X"C0",X"00",X"00",X"00",X"00",X"FC",X"00",X"FC",X"00",X"00",X"00",X"00",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00", + X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00", + X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00", + X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00", + X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"00",X"00",X"00",X"00",X"F0",X"F0",X"00",X"00", + X"00",X"00",X"F0",X"F0",X"00",X"00",X"00",X"00",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00", + X"7E",X"CC",X"01",X"00",X"01",X"CC",X"7E",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F", + X"01",X"00",X"01",X"1C",X"0E",X"FF",X"3E",X"00",X"00",X"00",X"00",X"00",X"3E",X"FF",X"0E",X"1C", + X"01",X"1C",X"0E",X"07",X"0F",X"3E",X"FC",X"00",X"FC",X"3E",X"0F",X"07",X"0E",X"1C",X"01",X"00", + X"0E",X"FF",X"3E",X"00",X"00",X"00",X"00",X"00",X"3E",X"FF",X"0E",X"1C",X"01",X"00",X"01",X"1C", + X"FF",X"1C",X"01",X"00",X"01",X"1C",X"FF",X"00",X"AA",X"82",X"C6",X"C6",X"C6",X"82",X"82",X"82", + X"FF",X"38",X"80",X"00",X"80",X"38",X"FF",X"00",X"82",X"82",X"82",X"C6",X"C6",X"C6",X"82",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0C",X"00",X"00",X"00",X"0C",X"00",X"00",X"1E",X"0C",X"01",X"00",X"01",X"00",X"1E",X"00", + X"01",X"06",X"0C",X"18",X"10",X"20",X"00",X"00",X"00",X"00",X"04",X"08",X"1A",X"33",X"60",X"80", + X"60",X"30",X"18",X"08",X"04",X"00",X"00",X"00",X"00",X"20",X"10",X"58",X"CC",X"06",X"01",X"00", + X"80",X"01",X"06",X"CC",X"58",X"10",X"20",X"00",X"00",X"00",X"00",X"04",X"08",X"18",X"30",X"60", + X"60",X"33",X"1A",X"08",X"04",X"00",X"00",X"00",X"00",X"20",X"10",X"18",X"0C",X"06",X"01",X"00", + X"03",X"03",X"03",X"06",X"0E",X"1C",X"F8",X"E0",X"E0",X"F8",X"1C",X"0E",X"06",X"03",X"03",X"03", + X"C6",X"82",X"82",X"82",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"AA",X"82",X"C6",X"C6", + X"C0",X"C0",X"C0",X"60",X"70",X"38",X"1F",X"07",X"07",X"1F",X"38",X"70",X"60",X"C0",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"0A",X"11",X"11",X"0E",X"00",X"00",X"00",X"80",X"3C",X"80",X"00",X"00", + X"F0",X"F8",X"3C",X"0C",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"00",X"C0", + X"90",X"00",X"20",X"70",X"70",X"38",X"18",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20", + X"18",X"1C",X"0C",X"0C",X"1C",X"18",X"10",X"00",X"00",X"00",X"00",X"00",X"88",X"E4",X"C0",X"08", + X"40",X"20",X"08",X"30",X"60",X"C0",X"80",X"00",X"80",X"40",X"60",X"30",X"18",X"04",X"00",X"00", + X"00",X"00",X"08",X"30",X"60",X"C0",X"80",X"00",X"80",X"40",X"60",X"30",X"18",X"04",X"10",X"20", + X"F0",X"C0",X"10",X"00",X"10",X"C0",X"F0",X"00",X"F0",X"80",X"02",X"07",X"02",X"80",X"F0",X"00", + X"C6",X"C6",X"82",X"AA",X"00",X"00",X"00",X"00",X"10",X"38",X"10",X"00",X"82",X"82",X"82",X"C6", + X"00",X"C0",X"C0",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"C0",X"E0",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"38",X"1C",X"1C",X"0E",X"0E",X"04",X"00", + X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"1C",X"1F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1C",X"00", + X"02",X"04",X"0C",X"18",X"30",X"40",X"00",X"00",X"04",X"08",X"20",X"18",X"0C",X"06",X"02",X"01", + X"02",X"04",X"0C",X"18",X"30",X"40",X"10",X"09",X"00",X"00",X"20",X"18",X"0C",X"06",X"02",X"01", + X"0F",X"01",X"40",X"E0",X"40",X"01",X"0F",X"00",X"0F",X"03",X"08",X"00",X"08",X"03",X"0F",X"00", + X"7A",X"F9",X"D0",X"83",X"87",X"03",X"03",X"1E",X"1E",X"07",X"03",X"87",X"83",X"D0",X"F9",X"7A", + X"02",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"01",X"00",X"02",X"00", + X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"28",X"70",X"60",X"40",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"20",X"10",X"00",X"00", + X"04",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"E0",X"70",X"08", + X"08",X"70",X"E0",X"40",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"04", + X"04",X"00",X"10",X"20",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"60",X"70",X"28", + X"C0",X"00",X"40",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0C",X"3C",X"F8",X"F0", + X"38",X"70",X"70",X"20",X"00",X"10",X"20",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"18",X"18", + X"08",X"C0",X"E4",X"88",X"00",X"00",X"00",X"00",X"00",X"10",X"18",X"18",X"0C",X"0C",X"1C",X"18", + X"20",X"0E",X"1C",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"1C",X"0E",X"20",X"00", + X"20",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"07",X"0E",X"10", + X"14",X"0E",X"06",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"04",X"08",X"00",X"00", + X"20",X"00",X"08",X"04",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"06",X"0E",X"14", + X"10",X"0E",X"07",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"20", + X"00",X"04",X"0E",X"0E",X"1C",X"1C",X"38",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"03",X"07",X"1F",X"7C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"1C",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"08",X"1C",X"08",X"00",X"00",X"00", + X"00",X"10",X"78",X"62",X"46",X"0E",X"1C",X"00",X"00",X"04",X"10",X"80",X"00",X"08",X"02",X"00", + X"03",X"03",X"06",X"0E",X"3C",X"FC",X"F8",X"E0",X"00",X"08",X"00",X"01",X"00",X"01",X"01",X"01", + X"01",X"01",X"01",X"00",X"01",X"00",X"08",X"00",X"E0",X"F8",X"FC",X"3C",X"0E",X"06",X"03",X"03", + X"0C",X"80",X"40",X"20",X"10",X"08",X"00",X"42",X"C4",X"80",X"E0",X"FA",X"C0",X"80",X"60",X"10", + X"00",X"08",X"10",X"22",X"C0",X"80",X"88",X"20",X"00",X"00",X"00",X"0C",X"0C",X"00",X"00",X"00", + X"E0",X"E0",X"C0",X"80",X"C3",X"E0",X"E0",X"C0",X"00",X"0C",X"00",X"00",X"00",X"80",X"80",X"C2", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"60",X"70",X"3C",X"3F",X"1F",X"07",X"00",X"10",X"00",X"80",X"00",X"80",X"80",X"80", + X"80",X"80",X"80",X"00",X"80",X"00",X"10",X"00",X"07",X"1F",X"3F",X"3C",X"70",X"60",X"C0",X"C0", + X"1B",X"19",X"20",X"24",X"00",X"42",X"10",X"00",X"1F",X"1F",X"3F",X"FF",X"3F",X"3F",X"5F",X"0E", + X"00",X"00",X"24",X"80",X"44",X"45",X"2B",X"2F",X"03",X"00",X"00",X"20",X"00",X"00",X"08",X"00", + X"3F",X"3F",X"1F",X"1F",X"1F",X"3F",X"3F",X"03",X"00",X"40",X"04",X"00",X"00",X"19",X"1F",X"1F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"60",X"78",X"3C",X"1E",X"0E",X"06",X"00",X"00",X"38",X"38",X"38",X"18",X"18",X"38",X"38", + X"00",X"00",X"07",X"7F",X"FE",X"E0",X"00",X"00",X"03",X"07",X"77",X"DD",X"FF",X"F6",X"3C",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"0C",X"0C",X"0C",X"1C",X"18",X"18",X"38",X"30", + X"30",X"38",X"18",X"18",X"1C",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"70", + X"0C",X"1C",X"38",X"70",X"E0",X"C0",X"00",X"00",X"03",X"03",X"03",X"03",X"07",X"06",X"06",X"0E", + X"0E",X"06",X"06",X"07",X"03",X"03",X"03",X"03",X"00",X"00",X"C0",X"E0",X"70",X"38",X"1C",X"0C", + X"0E",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"30",X"30",X"30",X"38",X"18",X"18",X"1C",X"0C", + X"0C",X"1C",X"18",X"18",X"38",X"30",X"30",X"30",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0E", + X"30",X"38",X"1C",X"0E",X"07",X"03",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"E0",X"60",X"60",X"70", + X"70",X"60",X"60",X"E0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"03",X"07",X"0E",X"1C",X"38",X"30", + X"00",X"00",X"03",X"1F",X"FE",X"F0",X"00",X"00",X"00",X"00",X"C0",X"F8",X"7F",X"0F",X"00",X"00", + X"00",X"00",X"0F",X"7F",X"F8",X"C0",X"00",X"00",X"00",X"00",X"F0",X"FE",X"1F",X"03",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"0F",X"FF",X"F8",X"00",X"00",X"00",X"00",X"80",X"F0",X"7F",X"1F", + X"1F",X"FF",X"F0",X"80",X"00",X"00",X"00",X"00",X"F8",X"FF",X"0F",X"01",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_palette_ic40.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_palette_ic40.vhd new file mode 100644 index 00000000..422d60cc --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_palette_ic40.vhd @@ -0,0 +1,30 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_palette_ic40 is +port ( + clk : in std_logic; + addr : in std_logic_vector(6 downto 0); + data : out std_logic_vector(2 downto 0) +); +end entity; + +architecture prom of prom_palette_ic40 is + type rom is array(0 to 127) of std_logic_vector(2 downto 0); + signal rom_data: rom := ( + "000","000","000","000","000","000","000","000","010","010","100","010","101","010","010","010", + "000","001","010","000","010","001","001","001","000","001","001","001","110","100","100","100", + "000","000","000","000","000","000","000","000","100","001","001","011","011","011","001","000", + "010","101","101","001","001","001","111","000","110","111","111","101","101","101","011","111", + "000","000","000","000","000","000","000","000","010","010","100","010","001","001","001","001", + "000","001","010","000","010","010","010","010","000","001","001","001","100","100","100","100", + "000","000","000","000","000","000","000","000","100","001","001","100","100","100","011","100", + "010","101","101","101","101","101","111","000","101","111","111","011","011","011","101","111"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_palette_ic41.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_palette_ic41.vhd new file mode 100644 index 00000000..5dcb18d9 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/ROM/prom_palette_ic41.vhd @@ -0,0 +1,30 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_palette_ic41 is +port ( + clk : in std_logic; + addr : in std_logic_vector(6 downto 0); + data : out std_logic_vector(2 downto 0) +); +end entity; + +architecture prom of prom_palette_ic41 is + type rom is array(0 to 127) of std_logic_vector(2 downto 0); + signal rom_data: rom := ( + "000","000","000","000","000","000","000","000","010","110","101","011","101","110","110","110", + "001","011","011","110","010","011","011","011","111","101","101","011","111","101","101","101", + "000","000","000","000","000","000","000","000","110","001","001","011","011","011","001","100", + "110","101","101","111","111","111","111","011","110","111","111","101","101","101","011","111", + "000","000","000","000","000","000","000","000","010","010","101","011","011","011","011","011", + "001","011","011","110","110","110","110","110","101","101","101","011","101","101","101","101", + "000","000","000","000","000","000","000","000","110","001","001","100","100","100","011","100", + "110","101","101","101","101","101","111","011","101","111","111","111","111","111","101","111"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..398fa0df --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80.vhd @@ -0,0 +1,1073 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 and Auto_Wait_t1 = '0' then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if T_Res = '1' then + Auto_Wait_t1 <= '0'; + else + Auto_Wait_t1 <= Auto_Wait or IORQ_i; + end if; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if (Auto_Wait = '1' and Auto_Wait_t2 = '0') nor + (IOWait = 1 and IORQ_i = '1' and Auto_Wait_t1 = '0') then + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T8080se.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T8080se.vhd new file mode 100644 index 00000000..3fbf4ebd --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T8080se.vhd @@ -0,0 +1,185 @@ +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- 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/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80_ALU.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..86fddce7 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,351 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; + +end; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80_MCode.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..4cc30f35 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1934 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; +-- constant aNone : std_logic_vector(2 downto 0) := "000"; +-- constant aXY : std_logic_vector(2 downto 0) := "001"; +-- constant aIOA : std_logic_vector(2 downto 0) := "010"; +-- constant aSP : std_logic_vector(2 downto 0) := "011"; +-- constant aBC : std_logic_vector(2 downto 0) := "100"; +-- constant aDE : std_logic_vector(2 downto 0) := "101"; +-- constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0010"; + else + IncDec_16 <= "1010"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0010"; + else + IncDec_16 <= "1010"; + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80_Pack.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..ac7d34da --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,208 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80_Reg.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/dac.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/dac.vhd new file mode 100644 index 00000000..9685a6cc --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 12 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/gen_ram.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/gen_ram.vhd new file mode 100644 index 00000000..0794fdc0 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/gen_ram.vhd @@ -0,0 +1,82 @@ +-- ----------------------------------------------------------------------- +-- +-- Syntiac's generic VHDL support files. +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- +-- Modified April 2016 by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +-- Remove address register when writing +-- +-- ----------------------------------------------------------------------- +-- +-- gen_rwram.vhd +-- +-- ----------------------------------------------------------------------- +-- +-- generic ram. +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity gen_ram is + generic ( + dWidth : integer := 8; + aWidth : integer := 10 + ); + port ( + clk : in std_logic; + we : in std_logic; + addr : in std_logic_vector((aWidth-1) downto 0); + d : in std_logic_vector((dWidth-1) downto 0); + q : out std_logic_vector((dWidth-1) downto 0) + ); +end entity; + +-- ----------------------------------------------------------------------- + +architecture rtl of gen_ram is + subtype addressRange is integer range 0 to ((2**aWidth)-1); + type ramDef is array(addressRange) of std_logic_vector((dWidth-1) downto 0); + signal ram: ramDef; + + signal rAddrReg : std_logic_vector((aWidth-1) downto 0); + signal qReg : std_logic_vector((dWidth-1) downto 0); +begin +-- ----------------------------------------------------------------------- +-- Signals to entity interface +-- ----------------------------------------------------------------------- + q <= qReg; + +-- ----------------------------------------------------------------------- +-- Memory write +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if we = '1' then + ram(to_integer(unsigned(addr))) <= d; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Memory read +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then +-- qReg <= ram(to_integer(unsigned(rAddrReg))); +-- rAddrReg <= addr; + qReg <= ram(to_integer(unsigned(addr))); + end if; + end process; +end architecture; + diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/hq2x.sv b/Arcade/Custom Hardware/Phoenix_MIST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_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/Arcade/Custom Hardware/Phoenix_MIST/rtl/keyboard.v b/Arcade/Custom Hardware/Phoenix_MIST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Custom Hardware/Phoenix_MIST/rtl/mist_io.v b/Arcade/Custom Hardware/Phoenix_MIST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_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/Arcade/Custom Hardware/Phoenix_MIST/rtl/osd.v b/Arcade/Custom Hardware/Phoenix_MIST/rtl/osd.v new file mode 100644 index 00000000..7f712178 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/osd.v @@ -0,0 +1,180 @@ +// 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, + + output reg osd_enabled +); + +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 +(* 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_enabled <= 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/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix.vhd new file mode 100644 index 00000000..9fc4d8ea --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix.vhd @@ -0,0 +1,458 @@ +--------------------------------------------------------------------------------- +-- DE2-35 Top level for Phoenix by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.ALL; +use ieee.numeric_std.all; + +entity phoenix is +generic ( + C_test_picture: boolean := false; + C_tile_rom: boolean := true; -- false: disable tile ROM to try game logic on small FPGA + -- reduce ROMs: 14 is normal game, 13 will draw initial screen, 12 will repeatedly blink 1 line of garbage + C_autofire: boolean := true; + -- C_audio: boolean := true; + C_prog_rom_addr_bits: integer range 12 to 14 := 14 +); +port( + clk : in std_logic; -- 11 MHz for TV, 25 MHz for VGA + reset : in std_logic; + ce_pix : out std_logic; + + dip_switch : in std_logic_vector(7 downto 0); + -- game controls, normal logic '1':pressed, '0':released + + btn_coin: in std_logic; + btn_player_start: in std_logic_vector(1 downto 0); + btn_fire, btn_left, btn_right, btn_barrier: in std_logic; + + video_r : out std_logic_vector(1 downto 0); + video_g : out std_logic_vector(1 downto 0); + video_b : out std_logic_vector(1 downto 0); + video_vblank, video_hblank_bg, video_hblank_fg: out std_logic; + video_hs : out std_logic; + video_vs : out std_logic; + + sound_fire : out std_logic; -- '1' when missile fires + sound_explode: out std_logic; -- '1' when ship explodes + sound_burn : out std_logic; -- bird burns + sound_fireball: out std_logic; -- bird explodes in 2 fireballs + sound_ab : out std_logic_vector(15 downto 0); + audio_select : in std_logic_vector(2 downto 0) := (others => '0'); + audio : out std_logic_vector(11 downto 0) +); +end phoenix; + +architecture struct of phoenix is + + signal reset_n: std_logic; + + signal hcnt : std_logic_vector(9 downto 1); + signal vcnt : std_logic_vector(8 downto 1); + signal sync : std_logic; + signal adrsel : std_logic; + signal rdy : std_logic := '1'; + signal vblank : std_logic; + signal hblank_bkgrd : std_logic; + signal hblank_frgrd : std_logic; + signal ce_pix1 : std_logic; + + signal cpu_adr : std_logic_vector(15 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_wr_n : std_logic; + signal prog_do : std_logic_vector( 7 downto 0); + signal S_prog_rom_addr : std_logic_vector(13 downto 0); + + signal frgnd_horz_cnt : std_logic_vector(7 downto 0) := (others =>'0'); + signal bkgnd_horz_cnt : std_logic_vector(7 downto 0) := (others =>'0'); + signal vert_cnt : std_logic_vector(7 downto 0) := (others =>'0'); + + signal frgnd_ram_adr: std_logic_vector(10 downto 0) := (others =>'0'); + signal bkgnd_ram_adr: std_logic_vector(10 downto 0) := (others =>'0'); + signal frgnd_ram_do : std_logic_vector( 7 downto 0) := (others =>'0'); + signal bkgnd_ram_do : std_logic_vector( 7 downto 0) := (others =>'0'); + signal frgnd_ram_we : std_logic := '0'; + signal bkgnd_ram_we : std_logic := '0'; + + signal frgnd_graph_adr : std_logic_vector(10 downto 0) := (others =>'0'); + signal bkgnd_graph_adr : std_logic_vector(10 downto 0) := (others =>'0'); + signal palette_adr : std_logic_vector( 7 downto 0) := (others =>'0'); + + signal frgnd_clk : std_logic; + signal bkgnd_clk : std_logic; + + signal frgnd_tile_id : std_logic_vector(7 downto 0) := (others =>'0'); + signal bkgnd_tile_id : std_logic_vector(7 downto 0) := (others =>'0'); + + signal frgnd_bit0_graph : std_logic_vector(7 downto 0) := (others =>'0'); + signal frgnd_bit1_graph : std_logic_vector(7 downto 0) := (others =>'0'); + signal bkgnd_bit0_graph : std_logic_vector(7 downto 0) := (others =>'0'); + signal bkgnd_bit1_graph : std_logic_vector(7 downto 0) := (others =>'0'); + + signal frgnd_bit0_graph_r : std_logic_vector(7 downto 0) := (others =>'0'); + signal frgnd_bit1_graph_r : std_logic_vector(7 downto 0) := (others =>'0'); + signal bkgnd_bit0_graph_r : std_logic_vector(7 downto 0) := (others =>'0'); + signal bkgnd_bit1_graph_r : std_logic_vector(7 downto 0) := (others =>'0'); + + signal fr_bit0 : std_logic; + signal fr_bit1 : std_logic; + signal bk_bit0 : std_logic; + signal bk_bit1 : std_logic; + signal fr_lin : std_logic_vector(2 downto 0); + signal bk_lin : std_logic_vector(2 downto 0); + + signal color_set : std_logic; + signal color_id : std_logic_vector(5 downto 0); + signal rgb_0 : std_logic_vector(2 downto 0); + signal rgb_1 : std_logic_vector(2 downto 0); + + signal player2 : std_logic := '0'; + signal pl2_cocktail : std_logic := '0'; + signal bkgnd_offset : std_logic_vector(7 downto 0) := (others =>'0'); + signal sound_a : std_logic_vector(7 downto 0) := (others =>'0'); + signal sound_b : std_logic_vector(7 downto 0) := (others =>'0'); + + signal clk10 : std_logic; + signal snd1 : std_logic_vector( 7 downto 0) := (others =>'0'); + signal snd2 : std_logic_vector( 1 downto 0) := (others =>'0'); + signal snd3 : std_logic_vector( 7 downto 0) := (others =>'0'); + signal song : std_logic_vector( 7 downto 0) := (others =>'0'); + signal mixed : std_logic_vector(11 downto 0) := (others =>'0'); + signal sound_string : std_logic_vector(31 downto 0); + + signal coin : std_logic; + signal player_start : std_logic_vector(1 downto 0); + signal buttons : std_logic_vector(3 downto 0); + signal R_autofire : std_logic_vector(21 downto 0); +begin + +-- game core uses inverted control logic +coin <= not btn_coin; -- insert coin +player_start <= not btn_player_start; -- select 1 or 2 players +buttons(1) <= not btn_right; -- Right +buttons(2) <= not btn_left; -- Left +buttons(3) <= not btn_barrier; -- Protection + +G_not_autofire: if not C_autofire generate + buttons(0) <= not btn_fire; -- Fire +end generate; + +G_yes_autofire: if C_autofire generate + process(clk) + begin + if rising_edge(clk) then + if btn_fire='1' then + R_autofire <= R_autofire-1; + else + R_autofire <= (others => '0'); + end if; + end if; + end process; + buttons(0) <= not R_autofire(R_autofire'high); +end generate; + + video: entity work.phoenix_video + port map + ( + clk11 => clk, + ce_pix => ce_pix1, + hcnt => hcnt, + vcnt => vcnt, + sync_hs => video_hs, + sync_vs => video_vs, + adrsel => adrsel, -- RAM address selector ('0')cpu / ('1')video_generator + rdy => rdy, -- Ready ('1')cpu can access RAMs read/write + vblank => vblank, + hblank_frgrd => hblank_frgrd, + hblank_bkgrd => hblank_bkgrd, + reset => reset + ); + reset_n <= not reset; + ce_pix <= ce_pix1; + +-- microprocessor 8085 +cpu8085 : entity work.T8080se +generic map +( + Mode => 2, + T2Write => 0 +) +port map( + RESET_n => reset_n, + CLK => clk, + CLKEN => '1', -- fixme: use it to make 5.5 MHz clock average + READY => rdy, + HOLD => '1', + INT => '1', + INTE => open, + DBIN => open, + SYNC => open, + VAIT => open, + HLDA => open, + WR_n => cpu_wr_n, + A => cpu_adr, + DI => cpu_di, + DO => cpu_do +); + +-- mux prog, ram, vblank, switch... to processor data bus in +cpu_di <= prog_do when cpu_adr(14) = '0' else + frgnd_ram_do when cpu_adr(13 downto 10) = 2#00_00# else + bkgnd_ram_do when cpu_adr(13 downto 10) = 2#00_10# else + buttons & '0' & player_start & coin when cpu_adr(13 downto 10) = 2#11_00# else--buttons & '1' + not vblank & dip_switch(6 downto 0) when cpu_adr(13 downto 10) = 2#11_10# else + prog_do; + +-- write enable to RAMs from cpu +frgnd_ram_we <= '1' when cpu_wr_n = '0' and cpu_adr(14 downto 10) = "10000" and adrsel = '0' else '0'; +bkgnd_ram_we <= '1' when cpu_wr_n = '0' and cpu_adr(14 downto 10) = "10010" and adrsel = '0' else '0'; + +-- RAMs address mux cpu/video_generator, bank0 for player1, bank1 for player2 +frgnd_ram_adr <= player2 & cpu_adr(9 downto 0) when adrsel ='0' else player2 & vert_cnt(7 downto 3) & frgnd_horz_cnt(7 downto 3); +bkgnd_ram_adr <= player2 & cpu_adr(9 downto 0) when adrsel ='0' else player2 & vert_cnt(7 downto 3) & bkgnd_horz_cnt(7 downto 3); + +-- demux cpu data to registers : background scrolling, sound control, +-- player id (1/2), palette color set. +process (clk) +begin + if rising_edge(clk) then + if cpu_wr_n = '0' then + case cpu_adr(14 downto 10) is + when "10110" => bkgnd_offset <= cpu_do; + when "11000" => sound_b <= cpu_do; + when "11010" => sound_a <= cpu_do; + when "10100" => player2 <= cpu_do(0); + color_set <= cpu_do(1); + when others => null; + end case; + end if; + end if; +end process; + +-- player2 and cocktail mode (flip horizontal/vertical) +pl2_cocktail <= player2 and dip_switch(7); + +-- horizontal scan video RAMs address background and foreground +-- with flip and scroll offset +frgnd_horz_cnt <= hcnt(8 downto 1) when pl2_cocktail = '0' else not hcnt(8 downto 1); +bkgnd_horz_cnt <= frgnd_horz_cnt + bkgnd_offset; + +-- vertical scan video RAMs address +vert_cnt <= vcnt(8 downto 1) when pl2_cocktail = '0' else not (vcnt(8 downto 1) + X"30"); + +-- get tile_ids from RAMs +frgnd_tile_id <= frgnd_ram_do; +bkgnd_tile_id <= bkgnd_ram_do; + +-- address graphix ROMs with tile_ids and line counter +frgnd_graph_adr <= frgnd_tile_id & vert_cnt(2 downto 0); +bkgnd_graph_adr <= bkgnd_tile_id & vert_cnt(2 downto 0); + +-- latch foreground/background next graphix byte, high bit and low bit +-- and palette_ids (fr_lin, bklin) +process (clk) +begin + if rising_edge(clk) then + if (pl2_cocktail = '0' and (frgnd_horz_cnt(2 downto 0) = "111")) or + (pl2_cocktail = '1' and (frgnd_horz_cnt(2 downto 0) = "000")) then + frgnd_bit0_graph_r <= frgnd_bit0_graph; + frgnd_bit1_graph_r <= frgnd_bit1_graph; + fr_lin <= frgnd_tile_id(7 downto 5); + end if; + if (pl2_cocktail = '0' and (bkgnd_horz_cnt(2 downto 0) = "111")) or + (pl2_cocktail = '1' and (bkgnd_horz_cnt(2 downto 0) = "000")) then + bkgnd_bit0_graph_r <= bkgnd_bit0_graph; + bkgnd_bit1_graph_r <= bkgnd_bit1_graph; + bk_lin <= bkgnd_tile_id(7 downto 5); + end if; + end if; +end process; + +-- demux background and foreground pixel bits (0/1) from graphix byte with horizontal counter +-- and apply horizontal and vertical blanking +fr_bit0 <= frgnd_bit0_graph_r(to_integer(unsigned(frgnd_horz_cnt(2 downto 0)))) when (vblank or hblank_frgrd)= '0' else '0'; +fr_bit1 <= frgnd_bit1_graph_r(to_integer(unsigned(frgnd_horz_cnt(2 downto 0)))) when (vblank or hblank_frgrd)= '0' else '0'; +bk_bit0 <= bkgnd_bit0_graph_r(to_integer(unsigned(bkgnd_horz_cnt(2 downto 0)))) when (vblank or hblank_bkgrd)= '0' else '0'; +bk_bit1 <= bkgnd_bit1_graph_r(to_integer(unsigned(bkgnd_horz_cnt(2 downto 0)))) when (vblank or hblank_bkgrd)= '0' else '0'; + +-- select pixel bits and palette_id with foreground priority +color_id <= (fr_bit0 or fr_bit1) & fr_bit1 & fr_bit0 & fr_lin when (fr_bit0 or fr_bit1) = '1' else + (fr_bit0 or fr_bit1) & bk_bit1 & bk_bit0 & bk_lin; + +-- address palette with pixel bits color and color set +palette_adr <= '0' & color_set & color_id; + +-- output video to top level +video_vblank <= vblank; +video_hblank_fg <= hblank_frgrd; +video_hblank_bg <= hblank_bkgrd; +video_r <= rgb_1(0) & rgb_0(0) when (hcnt>=192) else "00"; +video_g <= rgb_1(2) & rgb_0(2) when (hcnt>=192) else "00"; +video_b <= rgb_1(1) & rgb_0(1) when (hcnt>=192) else "00"; + +G_yes_tile_rom: if C_tile_rom generate +-- foreground graphix ROM bit0 +frgnd_bit0 : entity work.prom_ic39 +port map( + clk => clk, + addr => frgnd_graph_adr, + data => frgnd_bit0_graph +); + +-- foreground graphix ROM bit1 +frgnd_bit1 : entity work.prom_ic40 +port map( + clk => clk, + addr => frgnd_graph_adr, + data => frgnd_bit1_graph +); + +-- background graphix ROM bit0 +bkgnd_bit0 : entity work.prom_ic23 +port map( + clk => clk, + addr => bkgnd_graph_adr, + data => bkgnd_bit0_graph +); + +-- background graphix ROM bit1 +bkgnd_bit1 : entity work.prom_ic24 +port map( + clk => clk, + addr => bkgnd_graph_adr, + data => bkgnd_bit1_graph +); + +-- color palette ROM RBG low intensity +palette_0 : entity work.prom_palette_ic40 +port map( + clk => clk, + addr => palette_adr(6 downto 0), + data => rgb_0 +); + +-- color palette ROM RBG high intensity +palette_1 : entity work.prom_palette_ic41 +port map( + clk => clk, + addr => palette_adr(6 downto 0), + data => rgb_1 +); +end generate; + +G_no_tile_rom: if not C_tile_rom generate + -- dummy replacement for missing tile ROMs + frgnd_bit0_graph <= frgnd_graph_adr(10 downto 3); + frgnd_bit1_graph <= "00000000"; + bkgnd_bit0_graph <= bkgnd_graph_adr(10 downto 3); + bkgnd_bit1_graph <= "00000000"; + rgb_0 <= palette_adr(2 downto 0); + rgb_1 <= palette_adr(2 downto 0); +end generate; + +-- Program PROM +S_prog_rom_addr(C_prog_rom_addr_bits-1 downto 0) <= cpu_adr(C_prog_rom_addr_bits-1 downto 0); +prog : entity work.phoenix_prog +port map( + clk => clk, + addr => S_prog_rom_addr, + data => prog_do +); + +-- foreground RAM 0x4000-0x433F +-- cpu working area 0x4340-0x43FF +frgnd_ram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 11) +port map( + clk => clk, + we => frgnd_ram_we, + addr => frgnd_ram_adr, + d => cpu_do, + q => frgnd_ram_do +); + +-- background RAM 0x4800-0x4B3F +-- cpu working area 0x4B40-0x4BFF +-- stack pointer downward from 0x4BFF +bkgnd_ram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 11) +port map( + clk => clk, + we => bkgnd_ram_we, + addr => bkgnd_ram_adr, + d => cpu_do, + q => bkgnd_ram_do +); + + +effect1: entity work.phoenix_effect1 +port map +( + clk => clk, + reset => '0', + trigger => sound_a(4), + filter => sound_a(5), + divider => sound_a(3 downto 0), + snd => snd1 +); + +effect2 : entity work.phoenix_effect2 +port map +( + clk => clk, + reset => '0', + trigger1 => sound_b(4), + trigger2 => sound_b(5), + divider => sound_b(3 downto 0), + snd => snd2 +); + +effect3 : entity work.phoenix_effect3 +port map +( + clk => clk, + reset => '0', + trigger1 => sound_b(6), + trigger2 => sound_b(7), + snd => snd3 +); + +sound_burn <= sound_b(4); +sound_fire <= sound_b(6); -- '1' when fire sound +sound_explode <= sound_b(7); -- '1' when explode sound +sound_fireball <= sound_a(1) and not sound_a(0); -- ambiguity: mothership descend also triggers this +sound_ab <= sound_b & sound_a; + +music: entity work.phoenix_music +port map +( + clk => clk, + reset => '0', + trigger => sound_a(7), + sel_song => sound_a(6), + snd => song +); + +-- mix effects and music +mixed <= std_logic_vector + ( + unsigned("00" & snd1 & "00") + + unsigned("0" & snd2 & "000000000") + + unsigned("00" & snd3 & "00") + + unsigned("00" & song & "00" ) + ); + +-- select sound or/and effect +with audio_select select +audio <= "00" & snd1 & "00" when "100", + "0" & snd2 & "000000000" when "101", + "00" & snd3 & "00" when "110", + "00" & song & "00" when "111", + mixed when others; + + +end struct; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_effect1.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_effect1.vhd new file mode 100644 index 00000000..43c9433b --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_effect1.vhd @@ -0,0 +1,230 @@ +--------------------------------------------------------------------------------- +-- Phoenix sound effect1 by Dar (darfpga@aol.fr) (April 2016) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- + +-- this module generates sound how the birds fly +-- how they burn and the ship's barrier activation sound +-- it is most often heard module througut all levels of the game + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.ALL; +use ieee.numeric_std.all; +use ieee.math_real.all; + +entity phoenix_effect1 is +generic( + -- Command + Cmd_Fs: real := 11.0; -- MHz + Cmd_V: real := 12.0; -- V + Cmd_Vd: real := 0.46; -- V + Cmd_Vce: real := 0.2; -- V + Cmd_R1: real := 100.0; -- k + Cmd_R2: real := 33.0; -- k + Cmd_R3: real := 0.47; -- k + Cmd_C: real := 6.8; -- uF + Cmd_Div2n: integer := 8; -- bits divisor + Cmd_bits: integer := 16; -- bits counter + -- Oscillator + Osc_Fs: real := 11.0; -- MHz + Osc_Vb: real := 5.0; -- V + Osc_Vce: real := 0.2; -- V + Osc_R1: real := 47.0; -- k + Osc_R2: real := 47.0; -- k + Osc_C: real := 0.001; -- uF + Osc_Div2n: integer := 7; -- bits divisor + Osc_bits: integer := 6; -- bits counter + -- Filter + Filt_Fs: real := 11.0; -- MHz + Filt_V1: real := 5.0; -- V + Filt_V2: real := 0.0; -- V + Filt_R1: real := 100.0; -- k + Filt_R2: real := 10.0; -- k + Filt_C: real := 0.047; -- uF + Filt_Div2n: integer := 7; -- bits divisor + Filt_bits: integer := 8; -- bits counter + + Vmax: real := 5.0; -- V + Vmax_bits: integer := 16 -- number of bits to represent vmax +); +port( + clk : in std_logic; + reset : in std_logic; + trigger : in std_logic; + filter : in std_logic; + divider : in std_logic_vector(3 downto 0); + snd : out std_logic_vector(7 downto 0) +); +end phoenix_effect1; + +architecture struct of phoenix_effect1 is + +-- integer representation of voltage, full range +constant IVmax: integer := integer(2**Vmax_bits)-1; +-- command -- +constant Cmd_div: integer := integer(2**Cmd_Div2n); +-- command charge +constant Cmd_VFc: real := (Cmd_V*Cmd_R2 + Cmd_Vd*Cmd_R1)/(Cmd_R1 + Cmd_R2); -- V +constant Cmd_RCc: real := Cmd_R1*Cmd_R2/(Cmd_R1 + Cmd_R2)*Cmd_C/1000.0; -- s +constant Cmd_ikc: integer := integer(Cmd_Fs * 1.0E6 * Cmd_RCc / 2.0**Cmd_Div2n); +constant Cmd_iVFc: integer := integer(Cmd_VFc * real(IVmax)/Vmax); +-- command discharge +constant Cmd_VFd: real := (Cmd_V/Cmd_R1+Cmd_Vd/Cmd_R2+(Cmd_Vd+Cmd_Vce)/Cmd_R3)/(1.0/Cmd_R1+1.0/Cmd_R2+1.0/Cmd_R3); -- V +constant Cmd_RCd: real := 1.0/(1.0/Cmd_R1+1.0/Cmd_R2+1.0/Cmd_R3)*Cmd_C/1000.0; -- s +constant Cmd_ikd: integer := integer(Cmd_Fs * 1.0E6 * Cmd_RCd / 2.0**Cmd_Div2n); +constant Cmd_iVFd: integer := integer(Cmd_VFd * real(IVmax)/Vmax); + +-- oscillator +constant Osc_div: integer := integer(2**Osc_Div2n); +-- oscillator charge +constant Osc_VFc: real := Osc_Vb; -- V +constant Osc_RCc: real := (Osc_R1+Osc_R2)*Osc_C/1000.0; -- s +constant Osc_ikc: integer := integer(Osc_Fs * 1.0E6 * Osc_RCc / 2.0**Osc_Div2n); +constant Osc_iVFc: integer := integer(Osc_VFc * real(IVmax)/Vmax); +-- oscillator discharge +constant Osc_VFd: real := Osc_Vce; -- V +constant Osc_RCd: real := Osc_R2*Osc_C/1000.0; -- s +constant Osc_ikd: integer := integer(Osc_Fs * 1.0E6 * Osc_RCd / 2.0**Osc_Div2n); +constant Osc_iVFd: integer := integer(Osc_VFd * real(IVmax)/Vmax); + +-- filter +constant Filt_div: integer := integer(2**Filt_Div2n); +-- filter charge +constant Filt_VFc: real := Filt_V1; -- V +constant Filt_RCc: real := 1.0/(1.0/Filt_R1+1.0/Filt_R2)*Filt_C/1000.0; -- s +constant Filt_ikc: integer := integer(Filt_Fs * 1.0E6 * Filt_RCc / 2.0**Filt_Div2n); +constant Filt_iVFc: integer := integer(Filt_VFc * real(IVmax)/Vmax); +-- filter discharge +constant Filt_VFd: real := Filt_V2; -- V +constant Filt_RCd: real := Filt_RCc; -- s +constant Filt_ikd: integer := integer(Filt_Fs * 1.0E6 * Filt_RCd / 2.0**Filt_Div2n); +constant Filt_iVFd: integer := integer(Filt_VFd * real(IVmax)/Vmax); + +function imax(x,y: integer) return integer is begin + if x > y then + return x; + else + return y; + end if; +end imax; + +signal u_c1 : unsigned(15 downto 0) := (others => '0'); +signal u_c2 : unsigned(15 downto 0) := (others => '0'); +signal flip : std_logic := '0'; + +signal u_cf : unsigned(15 downto 0) := (others => '0'); +signal sound : std_logic := '0'; + +begin + +-- Commande +-- R1 = 100k, R2 = 33k, R3 = 0.47k C=6.8e-6 SR=10MHz +-- Charge : VF1 = 43559, k1 = 6591 (R1//R2) +-- Decharge : VF2 = 9300, k2 = 123 (R1//R2//R3) +-- Div = 2^8 + +process (clk) + variable cnt: integer range 0 to imax(Cmd_ikc,Cmd_ikd) := 0; +begin + if rising_edge(clk) then + if reset = '1' then + cnt := 0; + u_c1 <= (others => '0'); + else + cnt := cnt + 1; + if trigger = '1' then + if cnt = Cmd_ikc then + cnt := 0; + u_c1 <= u_c1 + (Cmd_iVFc - u_c1)/Cmd_div; + end if; + else + if cnt = Cmd_ikd then + cnt := 0; + u_c1 <= u_c1 - (u_c1 - Cmd_iVFd)/Cmd_div; + end if; + end if; + end if; + end if; +end process; + +-- Oscillateur +-- R1 = 47k, R2 = 47k, C=0.001e-6 SR=50MHz +-- Charge : VF1 = 65535, k1 = 37 (R1+R2) +-- Decharge : VF2 = 2621, k2 = 18 (R2) +-- Div = 2^7 + +-- Diviseur +-- LS163 : Count up, Sync load when 0xF (no toggle sound if divider = 0xF) +-- LS74 : Divide by 2 + +process (clk) + variable cnt: integer range 0 to imax(Osc_ikc,Osc_ikd) := 0; + variable cnt2: unsigned(3 downto 0) := (others => '0'); +begin + if rising_edge(clk) then + if reset = '1' then + cnt := 0; + u_c2 <= (others => '0'); + flip <= '0'; + else + if u_c2 > u_c1 then flip <= '0'; end if; + if u_c2 < u_c1/2 then + flip <= '1'; + if flip = '0' then + cnt2 := cnt2 + 1; + if cnt2 = "0000" then + cnt2 := unsigned(divider); + if divider /= "1111" then sound <= not sound; end if; + end if; + end if; + end if; + cnt := cnt + 1; + if flip = '1' then + if cnt = Osc_ikc then + cnt := 0; + u_c2 <= u_c2 + (Osc_iVFc - u_c2)/Osc_div; + end if; + else + if cnt = Osc_ikd then + cnt := 0; + u_c2 <= u_c2 - (u_c2 - Osc_iVFd)/Osc_div; + end if; + end if; + end if; + end if; +end process; + +-- filter +-- R1 = 10k, R2 = 100k, C=0.047e-6, SR=10MHz +-- Charge : VF1= 65535, k1 = 33 (R1//R2) +-- Decharge : VF2= 0 , k2 = 33 (R1//R2) +-- Div = 2^7 + +process (clk) + variable cnt: integer range 0 to imax(Filt_ikc,Filt_ikd) := 0; +begin + if rising_edge(clk) then + if reset = '1' then + cnt := 0; + u_cf <= (others => '0'); + else + cnt := cnt + 1; + if sound = '1' then + if cnt = Filt_ikc then + cnt := 0; + u_cf <= u_cf + (Filt_iVFc - u_cf)/Filt_div; + end if; + else + if cnt = Filt_ikd then + cnt := 0; + u_cf <= u_cf - (u_cf - Filt_iVFd)/Filt_div; + end if; + end if; + end if; + end if; +end process; + +with filter select snd <= std_logic_vector(u_cf(15 downto 8)) when '1', sound&"0000000" when others; + +end struct; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_effect2.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_effect2.vhd new file mode 100644 index 00000000..097f4aa9 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_effect2.vhd @@ -0,0 +1,387 @@ +--------------------------------------------------------------------------------- +-- Phoenix sound effect2 by Dar (darfpga@aol.fr) (April 2016) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- + +-- this module outputs sound of mothership's descend +-- it could be heard at beginning of level 5 +-- the prrrrr...vioooouuuuu sound +-- fixme: +-- the VCO control levels are too coarse (quantized) +-- frequency transitions are heard in large steps +-- instead of continous sweep + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.ALL; +use ieee.numeric_std.all; +use ieee.math_real.all; + +entity phoenix_effect2 is +generic( + -- Oscillator 1 + Osc1_Fs: real := 11.0; -- MHz + Osc1_Vb: real := 5.0; -- V + Osc1_Vce: real := 0.2; -- V + Osc1_R1: real := 47.0; -- k + Osc1_R2: real := 100.0; -- k + Osc1_C1: real := 0.01; -- uF + Osc1_C2: real := 0.47; -- uF + Osc1_C3: real := 1.0; -- uF + Osc1_Div2n: integer := 8; -- bits divisor + Osc1_bits: integer := 16; -- bits counter + -- Oscillator 2 + Osc2_Fs: real := 11.0; -- MHz + Osc2_Vb: real := 5.0; -- V + Osc2_Vce: real := 0.2; -- V + Osc2_R1: real := 510.0; -- k + Osc2_R2: real := 510.0; -- k + Osc2_C: real := 1.0; -- uF + Osc2_Div2n: integer := 8; -- bits divisor + Osc2_bits: integer := 17; -- bits counter + -- Filter 2 + Filt2_Fs: real := 11.0; -- MHz + Filt2_V: real := 5.0; -- V + Filt2_R1: real := 10.0; -- k + Filt2_R2: real := 5.1; -- k + Filt2_R3: real := 5.1; -- k + Filt2_R4: real := 5.0; -- k + Filt2_R5: real := 10.0; -- k + Filt2_C: real := 100.0; -- uF + Filt2_Div2n: integer := 8; -- bits divisor + Filt2_bits: integer := 16; -- bits counter + -- Oscillator 3 + Osc3_Fs: real := 11.0; -- MHz + Osc3_Vb: real := 5.0; -- V + Osc3_Vce: real := 0.2; -- V + Osc3_R1: real := 20.0; -- k + Osc3_R2: real := 20.0; -- k + Osc3_C: real := 0.001; -- uF + Osc3_Div2n: integer := 6; -- bits divisor + Osc3_bits: integer := 6; -- bits counter + + C_flip1_0: integer := 22020; + C_flip1_1: integer := 33063; + C_flip1_scale: integer := 84; -- ?? + + + Vmax: real := 5.0; -- V + Vmax_bits: integer := 16 -- number of bits to represent Vmax +); + +port( + clk : in std_logic; + reset : in std_logic; + trigger1 : in std_logic; + trigger2 : in std_logic; + divider : in std_logic_vector(3 downto 0); + snd : out std_logic_vector(1 downto 0) +); +end phoenix_effect2; + +architecture struct of phoenix_effect2 is + +function imax(x,y: integer) return integer is begin + if x > y then + return x; + else + return y; + end if; +end imax; + +-- integer representation of voltage, full range +constant IVmax: integer := integer(2**Vmax_bits)-1; +-- Oscillator1 -- +constant Osc1_div: integer := integer(2**Osc1_Div2n); +-- Oscillator1 charge/discharge voltages +constant Osc1_VFc: real := Osc1_Vb; -- V +constant Osc1_iVFc: integer := integer(Osc1_VFc * real(IVmax)/Vmax); +constant Osc1_VFd: real := Osc1_Vce; -- V +constant Osc1_iVFd: integer := integer(Osc1_VFd * real(IVmax)/Vmax); +-- Oscillator1 charge/discharge time constants +constant Osc1_T0_RCc: real := (Osc1_R1+Osc1_R2)*Osc1_C1/1000.0; -- s +constant Osc1_T0_ikc: integer := integer(Osc1_Fs * 1.0E6 * Osc1_T0_RCc / 2.0**Osc1_Div2n); +constant Osc1_T0_RCd: real := Osc1_R2*Osc1_C1/1000.0; -- s +constant Osc1_T0_ikd: integer := integer(Osc1_Fs * 1.0E6 * Osc1_T0_RCd / 2.0**Osc1_Div2n); + +constant Osc1_T1_RCc: real := (Osc1_R1+Osc1_R2)*(Osc1_C1+Osc1_C2)/1000.0; -- s +constant Osc1_T1_ikc: integer := integer(Osc1_Fs * 1.0E6 * Osc1_T1_RCc / 2.0**Osc1_Div2n); +constant Osc1_T1_RCd: real := Osc1_R2*(Osc1_C1+Osc1_C2)/1000.0; -- s +constant Osc1_T1_ikd: integer := integer(Osc1_Fs * 1.0E6 * Osc1_T1_RCd / 2.0**Osc1_Div2n); + +constant Osc1_T2_RCc: real := (Osc1_R1+Osc1_R2)*(Osc1_C1+Osc1_C3)/1000.0; -- s +constant Osc1_T2_ikc: integer := integer(Osc1_Fs * 1.0E6 * Osc1_T2_RCc / 2.0**Osc1_Div2n); +constant Osc1_T2_RCd: real := Osc1_R2*(Osc1_C1+Osc1_C3)/1000.0; -- s +constant Osc1_T2_ikd: integer := integer(Osc1_Fs * 1.0E6 * Osc1_T2_RCd / 2.0**Osc1_Div2n); + +constant Osc1_T3_RCc: real := (Osc1_R1+Osc1_R2)*(Osc1_C1+Osc1_C2+Osc1_C3)/1000.0; -- s +constant Osc1_T3_ikc: integer := integer(Osc1_Fs * 1.0E6 * Osc1_T3_RCc / 2.0**Osc1_Div2n); +constant Osc1_T3_RCd: real := Osc1_R2*(Osc1_C1+Osc1_C2+Osc1_C3)/1000.0; -- s +constant Osc1_T3_ikd: integer := integer(Osc1_Fs * 1.0E6 * Osc1_T3_RCd / 2.0**Osc1_Div2n); + +constant Osc1_ik_max: integer := imax( imax(Osc1_T1_ikc,Osc1_T1_ikd), imax(Osc1_T3_ikc,Osc1_T3_ikd)); + +-- Oscillator2 -- +constant Osc2_div: integer := integer(2**Osc2_Div2n); +-- Oscillator2 charge/discharge voltages +constant Osc2_VFc: real := Osc2_Vb; -- V +constant Osc2_iVFc: integer := integer(Osc2_VFc * real(IVmax)/Vmax); +constant Osc2_VFd: real := Osc2_Vce; -- V +constant Osc2_iVFd: integer := integer(Osc2_VFd * real(IVmax)/Vmax); +-- Oscillator2 charge/discharge time constants +constant Osc2_RCc: real := (Osc2_R1+Osc2_R2)*Osc2_C/1000.0; -- s +constant Osc2_ikc: integer := integer(Osc2_Fs * 1.0E6 * Osc2_RCc / 2.0**Osc2_Div2n); +constant Osc2_RCd: real := Osc2_R2*Osc2_C/1000.0; -- s +constant Osc2_ikd: integer := integer(Osc2_Fs * 1.0E6 * Osc2_RCd / 2.0**Osc2_Div2n); + +-- Filter2 -- +constant Filt2_div: integer := integer(2**Filt2_Div2n); +constant Filt2_R4p: real := 1.0/(1.0/Filt2_R1+1.0/Filt2_R4); -- k +constant Filt2_R5p: real := 1.0/(1.0/Filt2_R1+1.0/Filt2_R5); -- k +constant Filt2_Rp: real := 1.0/(1.0/Filt2_R3+1.0/Filt2_R4+1.0/Filt2_R5p); -- k +constant Filt2_Rs: real := 1.0/(1.0/Filt2_R2+1.0/Filt2_R3-Filt2_Rp/(Filt2_R3**2)); -- k +constant Filt2_RC: real := Filt2_Rs*Filt2_C/1000.0; -- s +constant Filt2_ik: integer := integer(Filt2_Fs*1.0E6*Filt2_RC / 2.0**Filt2_Div2n); +-- Filter2 voltages +constant Filt2_V0: real := Filt2_V*Filt2_Rp*Filt2_Rs/(Filt2_R3*Filt2_R4); -- V +constant Filt2_iV0: integer := integer(Filt2_V0 * real(IVmax)/Vmax); +constant Filt2_V1: real := Filt2_V*Filt2_Rp*Filt2_Rs/(Filt2_R4p*Filt2_R3); -- V +constant Filt2_iV1: integer := integer(Filt2_V1 * real(IVmax)/Vmax); +constant Filt2_V2: real := Filt2_V*Filt2_Rp*Filt2_Rs/(Filt2_R3*Filt2_R4)+Filt2_V*Filt2_Rs/Filt2_R2; -- V +constant Filt2_iV2: integer := integer(Filt2_V2 * real(IVmax)/Vmax); +constant Filt2_V3: real := Filt2_V*Filt2_Rp*Filt2_Rs/(Filt2_R3*Filt2_R4p)+Filt2_V*Filt2_Rs/Filt2_R2; -- V +constant Filt2_iV3: integer := integer(Filt2_V3 * real(IVmax)/Vmax); + +-- Oscillator3 -- +constant Osc3_div: integer := integer(2**Osc3_Div2n); +-- Oscillator3 charge/discharge voltages +constant Osc3_VFc: real := Osc3_Vb; -- V +constant Osc3_iVFc: integer := integer(Osc3_VFc * real(IVmax)/Vmax); +constant Osc3_VFd: real := Osc3_Vce; -- V +constant Osc3_iVFd: integer := integer(Osc3_VFd * real(IVmax)/Vmax); +-- Oscillator3 charge/discharge time constants +constant Osc3_RCc: real := (Osc3_R1+Osc3_R2)*Osc3_C/1000.0; -- s +constant Osc3_ikc: integer := integer(Osc3_Fs * 1.0E6 * Osc3_RCc / 2.0**Osc3_Div2n); +constant Osc3_RCd: real := Osc3_R2*Osc3_C/1000.0; -- s +constant Osc3_ikd: integer := integer(Osc3_Fs * 1.0E6 * Osc3_RCd / 2.0**Osc3_Div2n); + +signal u_c1 : unsigned(15 downto 0) := (others => '0'); +signal u_c2 : unsigned(15 downto 0) := (others => '0'); +signal u_c3 : unsigned(16 downto 0) := (others => '0'); +signal flip1 : std_logic := '0'; +signal flip2 : std_logic := '0'; +signal flip3 : std_logic := '0'; + +signal triggers : std_logic_vector(1 downto 0) := "00"; +--signal kc : unsigned(15 downto 0) := (others =>'0'); +--signal kd : unsigned(15 downto 0) := (others =>'0'); +signal kc : integer range 0 to Osc1_ik_max; +signal kd : integer range 0 to Osc1_ik_max; + +signal u_cf : unsigned(15 downto 0) := (others => '0'); +signal flips : std_logic_vector(1 downto 0) := "00"; +signal vf : unsigned(15 downto 0) := (others =>'0'); + +signal u_cf_scaled : unsigned(23 downto 0) := (others => '0'); +signal u_ctrl : unsigned(15 downto 0) := (others => '0'); + +signal sound: std_logic := '0'; + +begin + +-- Oscillateur1 +-- R1 = 47k, R2 = 100k, C1=0.01e-6, C2=0.047e-6, C3=1.000e-6 SR=10MHz +-- Div = 2^8 + +-- trigger = 00 +-- Charge : VF1 = 65535, k1 = 57 (R1+R2, C1) +-- Decharge : VF2 = 2621, k2 = 39 (R2, C1) +-- trigger = 01 +-- Charge : VF1 = 65535, k1 = 2756 (R1+R2, C1+C2) +-- Decharge : VF2 = 2621, k2 = 1875 (R2, C1+C2) +-- trigger = 10 +-- Charge : VF1 = 65535, k1 = 5800 (R1+R2, C1+C3) +-- Decharge : VF2 = 2621, k2 = 3945 (R2, C1+C3) +-- trigger = 11 +-- Charge : VF1 = 65535, k1 = 8498 (R1+R2, C1+C2+C3) +-- Decharge : VF2 = 2621, k2 = 5781 (R2, C1+C2+C3) + +triggers <= trigger2 & trigger1; + +with triggers select +kc <= Osc1_T0_ikc when "00", + Osc1_T1_ikc when "01", + Osc1_T2_ikc when "10", + Osc1_T3_ikc when others; + +with triggers select +kd <= Osc1_T0_ikd when "00", + Osc1_T1_ikd when "01", + Osc1_T2_ikd when "10", + Osc1_T3_ikd when others; + +process (clk) + variable cnt: integer range 0 to Osc1_ik_max := 0; +begin + if rising_edge(clk) then + if reset = '1' then + cnt := 0; + u_c1 <= (others => '0'); + else + if u_c1 > X"AAAA" then flip1 <= '0'; end if; + if u_c1 < X"5555" then flip1 <= '1'; end if; + cnt := cnt + 1; + if flip1 = '1' then + if cnt = kc then + cnt := 0; + u_c1 <= u_c1 + (Osc1_iVFc - u_c1)/Osc1_div; + end if; + else + if cnt = kd then + cnt := 0; + u_c1 <= u_c1 - (u_c1 - Osc1_iVFd)/Osc1_div; + end if; + end if; + end if; + end if; +end process; + +-- Oscillateur2 +-- R1 = 510k, R2 = 510k, C=1.000e-6, SR=10MHz +-- Charge : VF1 = 65535, k1 = 39844 (R1+R2, C) +-- Decharge : VF2 = 2621, k2 = 19922 (R2, C) +-- Div = 2^8 + +process (clk) + variable cnt: integer range 0 to imax(Osc2_ikc,Osc2_ikd) := 0; +begin + if rising_edge(clk) then + if reset = '1' then + cnt := 0; + u_c2 <= (others => '0'); + else + if u_c2 > X"AAAA" then flip2 <= '0'; end if; + if u_c2 < X"5555" then flip2 <= '1'; end if; + cnt := cnt + 1; + if flip2 = '1' then + if cnt = Osc2_ikc then + cnt := 0; + u_c2 <= u_c2 + (Osc2_iVFc - u_c2)/Osc2_div; + end if; + else + if cnt = Osc2_ikd then + cnt := 0; + u_c2 <= u_c2 - (u_c2 - Osc2_iVFd)/Osc2_div; + end if; + end if; + end if; + end if; +end process; + +-- Filtre +-- V1 = 5V +-- R1 = 10k, R2 = 5.1k, R3 = 5.1k, R4 = 5k, R5 = 10k, C=100.0e-6, SR=10MHz +-- Rp = R3//R4//R4//R1 = 1.68k +-- Rs = 1/(1/R2 + 1/R3 - Rp/(R3*R3)) = 3.05k +-- k = 11922 (Rs*C) +-- Div = 2^8 + +-- VF00 = 13159 (V*Rp*Rs)/(R4*R3) +-- VF01 = 19738 (V*Rp*Rs)/(R4p*R3) +-- VF10 = 52377 (V*Rp*Rs)/(R4*R3) + V*Rs/R2 +-- VF11 = 58957 (V*Rp*Rs)/(R4p*R3) + V*Rs/R2 + +flips <= flip2 & flip1; + +with flips select + +vf <= to_unsigned(Filt2_iV0,16) when "00", + to_unsigned(Filt2_iV1,16) when "01", + to_unsigned(Filt2_iV2,16) when "10", + to_unsigned(Filt2_iV3,16) when others; + +process (clk) + variable cnt: integer range 0 to Filt2_ik := 0; +begin + if rising_edge(clk) then + if reset = '1' then + cnt := 0; + u_cf <= (others => '0'); + else + cnt := cnt + 1; + if vf > u_cf then + if cnt = Filt2_ik then + cnt := 0; + u_cf <= u_cf + (vf - u_cf)/Filt2_div; + end if; + else + if cnt = Filt2_ik then + cnt := 0; + u_cf <= u_cf - (u_cf - vf)/Filt2_div; + end if; + end if; + end if; + end if; +end process; + +-- U_CTRL + +-- flip1 = 0 u_ctrl = 5V*Rp/R4 + u_cf*Rp/R3 # 22020 + u_cf*84/256 +-- flip1 = 1 u_ctrl = 5V*Rp/R4p + u_cf*Rp/R3 # 33063 + u_cf*84/256 + +u_cf_scaled <= u_cf*to_unsigned(C_flip1_scale,8); + +with flip1 select + u_ctrl <= to_unsigned(C_flip1_0,16)+u_cf_scaled(23 downto 8) when '0', + to_unsigned(C_flip1_1,16)+u_cf_scaled(23 downto 8) when others; + +-- Oscillateur3 +-- R1 = 20k, R2 = 20k, C=0.001e-6 SR=50MHz +-- Charge : VF1 = 65535, k1 = 31 (R1+R2) +-- Decharge : VF2 = 2621, k2 = 16 (R2) +-- Div = 2^6 + +-- Diviseur +-- LS163 : Count up, Sync load when 0xF (no toggle sound if divider = 0xF) +-- LS74 : Divide by 2 + +process (clk) + variable cnt: integer range 0 to imax(Osc3_ikc,Osc3_ikd) := 0; + variable cnt2: unsigned(3 downto 0) := (others => '0'); +begin + if rising_edge(clk) then + if reset = '1' then + cnt := 0; + u_c3 <= (others => '0'); + flip3 <= '0'; + else + if u_c3 > u_ctrl then flip3 <= '0'; end if; + if u_c3 < u_ctrl/2 then + flip3 <= '1'; + if flip3 = '0' then + cnt2 := cnt2 + 1; + if cnt2 = "0000" then + cnt2 := unsigned(divider); + if divider /= "1111" then sound <= not sound; end if; + end if; + end if; + end if; + cnt := cnt + 1; + if flip3 = '1' then + if cnt = Osc3_ikc then + cnt := 0; + u_c3 <= u_c3 + (Osc3_iVFc - u_c3)/Osc3_div; + end if; + else + if cnt = Osc3_ikd then + cnt := 0; + u_c3 <= u_c3 - (u_c3 - Osc3_iVFd)/Osc3_div; + end if; + end if; + end if; + end if; +end process; + +with trigger2 select snd <= '0'&sound when '1', sound&'0' when others; + +end struct; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_effect3.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_effect3.vhd new file mode 100644 index 00000000..c5bc2e77 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_effect3.vhd @@ -0,0 +1,290 @@ +--------------------------------------------------------------------------------- +-- Phoenix sound effect3 (noise) by Dar (darfpga@aol.fr) (April 2016) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- + +-- this module generates noisy sound of ship missile shooting +-- ship explosions and enemy mothership explosion +-- it is often head throught all the levels of the game + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.ALL; +use ieee.numeric_std.all; + +entity phoenix_effect3 is +generic( + -- Command 1 + Cmd1_Fs: real := 11.0; -- MHz + Cmd1_V: real := 5.0; -- V + Cmd1_Vd: real := 0.46; -- V + Cmd1_Vce: real := 0.2; -- V + Cmd1_R1: real := 1.0; -- k + Cmd1_R2: real := 0.33; -- k + Cmd1_R3: real := 20.0; -- k + Cmd1_C: real := 6.8; -- uF + Cmd1_Div2n: integer := 8; -- bits divisor + --Cmd1_bits: integer := 16; -- bits counter + -- Command 2 + Cmd2_Fs: real := 11.0; -- MHz + Cmd2_V: real := 5.0; -- V + Cmd2_Vd: real := 0.46; -- V + Cmd2_Vce: real := 0.2; -- V + Cmd2_R1: real := 1.0; -- k + Cmd2_R2: real := 0.33; -- k + Cmd2_R3: real := 47.0; -- k + Cmd2_C: real := 6.8; -- uF + Cmd2_Div2n: integer := 8; -- bits divisor + --Cmd2_bits: integer := 16; -- bits counter + -- Oscillator + Osc_Fs: real := 11.0; -- MHz + Osc_Vb: real := 5.0; -- V + Osc_Vce: real := 0.2; -- V + Oscmin_R1a: real := 47.0; -- k + Oscmin_R2: real := 0.33; -- k + Oscmin_C: real := 0.05; -- uF + Oscmin_bits: integer := 16; -- bits counter + Oscmax_R1a: real := 2.553; -- k + Oscmax_R2: real := 1.0; -- k + Oscmax_C: real := 0.05; -- uF + Osc_Div2n: integer := 7; -- bits divisor + --Osc_bits: integer := 16; -- bits counter + + C_commande2_chop_k: integer := 62500; + + Vmax: real := 5.0; -- V + Vmax_bits: integer := 16 -- number of bits to represent Vmax +); +port( + clk : in std_logic; + reset : in std_logic; + trigger1 : in std_logic; + trigger2 : in std_logic; + snd : out std_logic_vector(7 downto 0) +); +end phoenix_effect3; + +architecture struct of phoenix_effect3 is + +-- integer representation of voltage, full range +constant IVmax: integer := integer(2**Vmax_bits)-1; +-- Command1 -- +constant Cmd1_div: integer := integer(2**Cmd1_Div2n); +-- Command1 charge/discharge voltages +constant Cmd1_VFc: real := Cmd1_V-Cmd1_Vd; -- V +constant Cmd1_iVFc: integer := integer(Cmd1_VFc * real(IVmax)/Vmax); +constant Cmd1_VFd: real := Cmd1_Vce+Cmd1_Vd; -- V +constant Cmd1_iVFd: integer := integer(Cmd1_VFd * real(IVmax)/Vmax); +-- Command1 charge/discharge time constants +constant Cmd1_RCc: real := (Cmd1_R1+Cmd1_R2+Cmd1_R3)*Cmd1_C/1000.0; -- s +constant Cmd1_ikc: integer := integer(Cmd1_Fs * 1.0E6 * Cmd1_RCc / 2.0**Cmd1_Div2n); +constant Cmd1_RCd: real := Cmd1_R2*Cmd1_C/1000.0; -- s +constant Cmd1_ikd: integer := integer(Cmd1_Fs * 1.0E6 * Cmd1_RCd / 2.0**Cmd1_Div2n); +-- Command2 -- +constant Cmd2_div: integer := integer(2**Cmd2_Div2n); +-- Command2 charge/discharge voltages +constant Cmd2_VFc: real := (Cmd2_V-Cmd2_Vd)*Cmd2_R3/(Cmd2_R1+Cmd2_R2+Cmd2_R3); -- V +constant Cmd2_iVFc: integer := integer(Cmd2_VFc * real(IVmax)/Vmax); +constant Cmd2_VFd: real := 0.0; -- V +constant Cmd2_iVFd: integer := integer(Cmd2_VFd * real(IVmax)/Vmax); +-- Command2 charge/discharge time constants +constant Cmd2_RCc: real := (Cmd2_R1+Cmd2_R2)*Cmd2_R3/(Cmd2_R1+Cmd2_R2+Cmd2_R3)*Cmd2_C/1000.0; -- s +constant Cmd2_ikc: integer := integer(Cmd2_Fs * 1.0E6 * Cmd2_RCc / 2.0**Cmd2_Div2n); +constant Cmd2_RCd: real := Cmd2_R3*Cmd2_C/1000.0; -- s +constant Cmd2_ikd: integer := integer(Cmd2_Fs * 1.0E6 * Cmd2_RCd / 2.0**Cmd2_Div2n); +-- Oscillator -- +constant Osc_div: integer := integer(2**Osc_Div2n); +-- Oscillator charge/discharge voltages +constant Osc_VFc: real := Osc_Vb; -- V +constant Osc_iVFc: integer := integer(Osc_VFc * real(IVmax)/Vmax); +constant Osc_VFd: real := Osc_Vce; -- V +constant Osc_iVFd: integer := integer(Osc_VFd * real(IVmax)/Vmax); +-- Oscillator min charge/discharge time constants +constant Oscmin_RCc: real := (Oscmin_R1a+Oscmin_R2)*Oscmin_C/1000.0; -- s +constant Oscmin_ikc: integer := integer(Osc_Fs * 1.0E6 * Oscmin_RCc / 2.0**Osc_Div2n); +constant Oscmin_RCd: real := Oscmin_R2*Oscmin_C/1000.0; -- s +constant Oscmin_ikd: integer := integer(Osc_Fs * 1.0E6 * Oscmin_RCd / 2.0**Osc_Div2n); +-- Oscillator max charge/discharge time constants +constant Oscmax_RCc: real := (Oscmax_R1a+Oscmax_R2)*Oscmax_C/1000.0; -- s +constant Oscmax_ikc: integer := integer(Osc_Fs * 1.0E6 * Oscmax_RCc / 2.0**Osc_Div2n); +constant Oscmax_RCd: real := Oscmax_R2*Oscmax_C/1000.0; -- s +constant Oscmax_ikd: integer := integer(Osc_Fs * 1.0E6 * Oscmax_RCd / 2.0**Osc_Div2n); + +function imax(x,y: integer) return integer is begin + if x > y then + return x; + else + return y; + end if; +end imax; + +signal u_c1 : unsigned(15 downto 0) := (others => '0'); +signal u_c2 : unsigned(15 downto 0) := (others => '0'); +signal u_c3 : unsigned(15 downto 0) := (others => '0'); +signal flip3 : std_logic := '0'; + +signal k_ch : unsigned(25 downto 0) := (others =>'0'); + +signal u_ctrl1 : unsigned(15 downto 0) := (others => '0'); +signal u_ctrl2 : unsigned(15 downto 0) := (others => '0'); +signal u_ctrl1_f : unsigned( 7 downto 0) := (others => '0'); +signal u_ctrl2_f : unsigned( 7 downto 0) := (others => '0'); +signal sound : unsigned( 7 downto 0) := (others => '0'); + +signal shift_reg : std_logic_vector(17 downto 0) := (others => '0'); + +begin + +-- Commande1 +-- R1 = 1k, R2 = 0.33k, R3 = 20k C=6.8e-6 SR=10MHz +-- Charge : VF1 = 59507, k1 = 5666 (R1+R2+R3) +-- Decharge : VF2 = 8651, k2 = 88 (R2) +-- Div = 2^8 + +process (clk) + -- variable cnt : unsigned(15 downto 0) := (others => '0'); + variable cnt: integer range 0 to imax(Cmd1_ikc,Cmd1_ikd)*2 := 0; +begin + if rising_edge(clk) then + if reset = '1' then + cnt := 0; + u_c1 <= (others => '0'); + else + cnt := cnt + 1; + if trigger1 = '1' then + -- if cnt > C_commande1_k1 then + if cnt > Cmd1_ikc then + cnt := 0; + -- u_c1 <= u_c1 + (C_commande1_VF1 - u_c1)/256; + u_c1 <= u_c1 + (Cmd1_iVFc - u_c1)/Cmd1_div; + end if; + else + -- if cnt > C_commande1_k2 then + if cnt > Cmd1_ikd then + cnt := 0; + -- u_c1 <= u_c1 - (u_c1 - C_commande1_VF2)/256; + u_c1 <= u_c1 - (u_c1 - Cmd1_iVFd)/Cmd1_div; + end if; + end if; + end if; + end if; +end process; + +-- Commande2 +-- R1 = 1k, R2 = 0.33k, R3 = 47k C=6.8e-6 SR=10MHz +-- Charge : VF1 = 57869, k1 = 344 (R1+R2)//R3 +-- Decharge : VF2 = 0, k2 = 12484 (R3) +-- Div = 2^8 + +process (clk) + -- variable cnt : unsigned(15 downto 0) := (others => '0'); + variable cnt: integer range 0 to imax(Cmd2_ikc,Cmd2_ikd)*2 := 0; +begin + if rising_edge(clk) then + if reset = '1' then + -- cnt := (others => '0'); + cnt := 0; + u_c2 <= (others => '0'); + else + cnt := cnt + 1; + if trigger2 = '1' then + -- if cnt > C_commande2_k1 then + if cnt > Cmd2_ikc then + -- cnt := (others => '0'); + cnt := 0; + -- u_c2 <= u_c2 + (C_commande2_VF1 - u_c2)/256; + u_c2 <= u_c2 + (Cmd2_iVFc - u_c2)/Cmd2_div; + end if; + else + -- if cnt > C_commande2_k2 then + if cnt > Cmd2_ikd then + -- cnt := (others => '0'); + cnt := 0; + -- u_c2 <= u_c2 - (u_c2 - C_commande2_VF2)/256; + u_c2 <= u_c2 - (u_c2 - Cmd2_iVFd)/Cmd2_div; + end if; + end if; + end if; + end if; +end process; + +-- control voltage from command1 is R3 voltage (not u_c1 voltage) +with trigger1 select +-- u_ctrl1 <= (to_unsigned(C_commande1_VF1,16) - u_c1) when '1', (others=>'0') when others; +u_ctrl1 <= (to_unsigned(Cmd1_iVFc,16) - u_c1) when '1', (others=>'0') when others; + +-- control voltage from command2 is u_c2 voltage +u_ctrl2 <= u_c2; + +-- sum up and scaled both control voltages to vary R1 resistor of oscillator +-- k_ch <= shift_right(((u_ctrl1/2 + u_ctrl2/2) * to_unsigned(C_oscillateur_min_k1-C_oscillateur_max_k1,10)),15) + C_oscillateur_max_k1; +k_ch <= shift_right(((u_ctrl1/2 + u_ctrl2/2) * to_unsigned(Oscmin_ikc-Oscmax_ikc,10)),15) + Oscmax_ikc; + +-- Oscillateur +-- R1 = 47k..2.533k, R2 = 1k, C=0.05e-6, SR=50MHz +-- Charge : VF1 = 65536, k_ch = 938..69 (R1+R2, C) +-- Decharge : VF2 = 2621, k2 = 20 (R2, C) +-- Div = 2^7 + +-- noise generator triggered by oscillator output + +process (clk) + variable cnt: integer range 0 to imax(imax(Oscmin_ikc,Oscmin_ikd), imax(Oscmax_ikc,Oscmax_ikd))+256 := 0; +begin + if rising_edge(clk) then + if reset = '1' then + cnt := 0; + u_c3 <= (others => '0'); + else + if u_c3 > X"AAAA" then flip3 <= '0'; end if; + if u_c3 < X"5555" then + flip3 <= '1'; + if flip3 = '0' then + shift_reg <= shift_reg(16 downto 0) & not(shift_reg(17) xor shift_reg(16)); + end if; + end if; + cnt := cnt + 1; + if flip3 = '1' then + if cnt > k_ch then + cnt := 0; + u_c3 <= u_c3 + (Osc_iVFc - u_c3)/Osc_div; + end if; + else + if cnt > Oscmax_ikd then + cnt := 0; + u_c3 <= u_c3 - (u_c3 - Osc_iVFd)/Osc_div; + end if; + end if; + end if; + end if; +end process; + +-- modulated (chop) command1 voltage with noise generator output +with shift_reg(17) xor shift_reg(16) select +u_ctrl1_f <= u_ctrl1(15 downto 8)/2 when '0', (others => '0') when others; + + +-- modulated (chop) command2 voltage with noise generator output +-- and add 400Hz filter (raw sub-sampling) +-- f=10 MHz, k = 25000 +process (clk) + variable cnt : unsigned(15 downto 0) := (others => '0'); +begin + if rising_edge(clk) then + cnt := cnt + 1; + if cnt > C_commande2_chop_k then + cnt := (others => '0'); + if (shift_reg(17) xor shift_reg(16)) = '0' then + u_ctrl2_f <= u_ctrl2(15 downto 8)/2; + else + u_ctrl2_f <= (others => '0'); + end if; + end if; + end if; +end process; + +-- mix modulated noises 1 and 2 +sound <= u_ctrl1_f + u_ctrl2_f; +snd <= std_logic_vector(sound); + +end struct; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_mist.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_mist.vhd new file mode 100644 index 00000000..8a320e0e --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_mist.vhd @@ -0,0 +1,309 @@ +--------------------------------------------------------------------------------- +-- DE2-35 Top level for Phoenix by Dar (darfpga@aol.fr) (April 2016) +-- http://darfpga.blogspot.fr +-- +-- Main features +-- PS2 keyboard input +-- wm8731 sound output +-- NO board SRAM used +-- +-- sw 0: on/off hdmi-audio +-- +-- Board switch : ---- todo fixme switches note +-- 1 - 4 : dip switch +-- 0-1 : lives 3-6 +-- 3-2 : bonus life 30K-60K +-- 4 : coin 1-2 +-- 6-5 : unkonwn +-- 7 : upright-cocktail +-- 8 -10 : sound_select +-- 0XX : all mixed (normal) +-- 100 : sound1 only +-- 101 : sound2 only +-- 110 : sound3 only +-- 111 : melody only +-- Board key : +-- 0 : reset +-- +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.ALL; +use ieee.numeric_std.all; + +entity phoenix_mist is +port +( + CLOCK_27 : in std_logic; + LED : out std_logic; + VGA_R : out std_logic_vector(5 downto 0); + VGA_G : out std_logic_vector(5 downto 0); + VGA_B : out std_logic_vector(5 downto 0); + VGA_HS : out std_logic; + VGA_VS : out std_logic; + SPI_SCK : in std_logic; + SPI_DI : in std_logic; + SPI_DO : out std_logic; + SPI_SS2 : in std_logic; + SPI_SS3 : in std_logic; + CONF_DATA0 : in std_logic; + AUDIO_L : out std_logic; + AUDIO_R : out std_logic +); +end; + +architecture struct of phoenix_mist is + + signal clk : std_logic; + signal clk_88m : std_logic; + signal reset : std_logic; + signal clock_stable : std_logic; + + signal audio : std_logic_vector(11 downto 0); + signal video_r, video_g, video_b: std_logic_vector(1 downto 0); + signal vsync, hsync : std_logic; + + signal dip_switch : std_logic_vector(7 downto 0);-- := (others => '0'); + signal status : std_logic_vector(31 downto 0); + signal buttons : std_logic_vector(1 downto 0); + signal scandoubler_disable : std_logic; + signal ypbpr : std_logic; + signal ce_pix : std_logic; + + signal scanlines : std_logic_vector(1 downto 0); + signal hq2x : std_logic; + + signal coin : std_logic; + signal player_start : std_logic_vector(1 downto 0); + signal button_left, button_right, button_protect, button_fire: std_logic; + signal joy0 : std_logic_vector(7 downto 0); + signal joy1 : std_logic_vector(7 downto 0); + signal ps2Clk : std_logic; + signal ps2Data : std_logic; + signal kbd_joy : std_logic_vector(7 downto 0); + signal upjoyL : std_logic; + signal upjoyR : std_logic; + signal upjoyB : std_logic; +-- config string used by the io controller to fill the OSD + constant CONF_STR : string := "PHOENIX;;O4,Screen Direction,Upright,Normal;O67,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;T5,Reset;V,v1.0;"; + + function to_slv(s: string) return std_logic_vector is + constant ss: string(1 to s'length) := s; + variable rval: std_logic_vector(1 to 8 * s'length); + variable p: integer; + variable c: integer; + begin + for i in ss'range loop + p := 8 * i; + c := character'pos(ss(i)); + rval(p - 7 to p) := std_logic_vector(to_unsigned(c,8)); + end loop; + return rval; + end function; + + component mist_io + generic ( STRLEN : integer := 0 ); + port ( + clk_sys :in std_logic; + SPI_SCK, CONF_DATA0, SPI_DI :in std_logic; + SPI_DO : out std_logic; + conf_str : in std_logic_vector(8*STRLEN-1 downto 0); + buttons : out std_logic_vector(1 downto 0); + joystick_0 : out std_logic_vector(7 downto 0); + joystick_1 : out std_logic_vector(7 downto 0); + status : out std_logic_vector(31 downto 0); + scandoubler_disable, ypbpr : out std_logic; + ps2_kbd_clk : out std_logic; + ps2_kbd_data : out std_logic + ); + end component mist_io; + + component video_mixer + generic ( LINE_LENGTH : integer := 352; HALF_DEPTH : integer := 1 ); + port ( + clk_sys, ce_pix, ce_pix_actual : in std_logic; + SPI_SCK, SPI_SS3, SPI_DI : in std_logic; + scanlines : in std_logic_vector(1 downto 0); + scandoubler_disable, hq2x, ypbpr, ypbpr_full : in std_logic; + + R, G, B : in std_logic_vector(2 downto 0); + HSync, VSync, line_start, mono : in std_logic; + + VGA_R,VGA_G, VGA_B : out std_logic_vector(5 downto 0); + VGA_VS, VGA_HS : out std_logic + ); + end component video_mixer; + + component keyboard + PORT( + clk : in std_logic; + reset : in std_logic; + ps2_kbd_clk : in std_logic; + ps2_kbd_data : in std_logic; + joystick : out std_logic_vector (7 downto 0) + ); + end component; + + +begin + +-- SWITCH 1: SWITCH 2: NUMBER OF SPACESHIPS: +-- --------- --------- --------------------- +-- OFF OFF 6 +-- ON OFF 5 +-- OFF ON 4 +-- ON ON 3 +-- FIRST FREE SECOND FREE +-- SWITCH 3: SWITCH 4: SHIP SCORE: SHIP SCORE: +-- --------- --------- ----------- ----------- +-- OFF OFF 6,000 60,000 +-- ON OFF 5,000 50,000 +-- OFF ON 4,000 40,000 +-- ON ON 3,000 30,000 + + --Cocktail,Factory,Factory,Factory,Bonus2,Bonus1,Ships2,Ships1 + dip_switch <= "00001111"; + + mist_io_inst : mist_io + generic map (STRLEN => CONF_STR'length) + port map ( + clk_sys => clk, + SPI_SCK => SPI_SCK, + CONF_DATA0 => CONF_DATA0, + SPI_DI => SPI_DI, + SPI_DO => SPI_DO, + conf_str => to_slv(CONF_STR), + buttons => buttons, + scandoubler_disable => scandoubler_disable, + ypbpr => ypbpr, + joystick_1 => joy1, + joystick_0 => joy0, + status => status, + ps2_kbd_clk => ps2Clk, + ps2_kbd_data => ps2Data + ); + + -- + -- Audio + -- + u_dac1 : entity work.dac + port map( + clk_i => clk_88m, + res_n_i => not reset, + dac_i => audio, + dac_o => AUDIO_L + ); + + u_dac2 : entity work.dac + port map( + clk_i => clk_88m, + res_n_i => not reset, + dac_i => audio, + dac_o => AUDIO_R + ); + + + pll: entity work.pll27 + port map( + inclk0 => CLOCK_27, + c0 => clk_88m, + c1 => clk, + locked => clock_stable + ); + + reset <= status(0) or status(5) or buttons(1) or not clock_stable; + + u_keyboard : keyboard + port map( + clk => clk, + reset => reset, + ps2_kbd_clk => ps2Clk, + ps2_kbd_data => ps2Data, + joystick => kbd_joy + ); + + process(clk_88m) + variable cnt: integer range 0 to 6000000 := 0; + begin + if rising_edge(clk_88m) then + if status(3 downto 1) /= "000" then + cnt := 0; + coin <= status(1); + player_start <= status(3 downto 2); + else + if cnt < 6000000 then + cnt := cnt + 1; + else + coin <= '0'; + player_start <= "00"; + end if; + end if; + end if; + end process; + + upjoyB <= joy0(2) or joy1(2) when status(4) = '0' else joy0(0) or joy1(0); + upjoyL <= joy0(1) or joy1(1) or kbd_joy(6) when status(4) = '0' else joy0(2) or joy1(2) or kbd_joy(5); + upjoyR <= joy0(0) or joy1(0) or kbd_joy(7) when status(4) = '0' else joy0(3) or joy1(3) or kbd_joy(4); + + phoenix : entity work.phoenix + port map + ( + clk => clk, + reset => reset, + ce_pix => ce_pix, + dip_switch => dip_switch, + btn_coin => kbd_joy(3) or coin,--ESC + btn_player_start(0) => kbd_joy(1) or player_start(0),--1 + btn_player_start(1) => kbd_joy(2) or player_start(1),--2 + btn_left => upjoyL, + btn_right => upjoyR, + btn_barrier => upjoyB or kbd_joy(2),--TAB + btn_fire => joy0(4) or joy1(4) or kbd_joy(0),--space + video_r => video_r, + video_g => video_g, + video_b => video_b, + video_hs => hsync, + video_vs => vsync, + audio_select => "000", + audio => audio + ); + + scanlines(0) <= '1' when status(7 downto 6) = "10" else '0'; + scanlines(1) <= '1' when status(7 downto 6) = "11" else '0'; + hq2x <= '1' when status(7 downto 6) = "01" else '0'; + + vmixer : video_mixer + port map ( + clk_sys => clk_88m, + ce_pix => ce_pix, + ce_pix_actual => ce_pix, + + SPI_SCK => SPI_SCK, + SPI_SS3 => SPI_SS3, + SPI_DI => SPI_DI, + + scanlines => scanlines, + scandoubler_disable => scandoubler_disable, + hq2x => hq2x, + ypbpr => ypbpr, + ypbpr_full => '1', + + R => video_r & video_r(1), + G => video_g & video_g(1), + B => video_b & video_b(1), + HSync => hsync, + VSync => vsync, + line_start => '0', + mono => '0', + + VGA_R => VGA_R, + VGA_G => VGA_G, + VGA_B => VGA_B, + VGA_VS => VGA_VS, + VGA_HS => VGA_HS + ); + + LED <= '1'; + +end struct; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_music.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_music.vhd new file mode 100644 index 00000000..56d6c594 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_music.vhd @@ -0,0 +1,241 @@ +--------------------------------------------------------------------------------- +-- Phoenix music by Dar (darfpga@aol.fr) (April 2016) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.ALL; +use ieee.numeric_std.all; +use ieee.math_real.all; + +entity phoenix_music is +generic( + C_clk_freq: real := 11.0 -- MHz +); +port( + clk : in std_logic; + reset : in std_logic; + trigger : in std_logic; + sel_song : in std_logic; + snd : out std_logic_vector(7 downto 0) +); +end phoenix_music; + +architecture struct of phoenix_music is + +constant C_voice_attack: integer := integer(230.0 * C_clk_freq); -- larger value is faster +constant C_song0_tempo: integer := integer(2200.0 * C_clk_freq); -- larger value is faster +constant C_song1_tempo: integer := integer(1700.0 * C_clk_freq); -- larger value is faster +constant C_voice_down_rate: integer := integer(4000.0 / C_clk_freq); -- larger value is slower + +type voice_array is array (0 to 94) of integer range 0 to 127; +-- main voice1 (Jeux Interdits) +constant voice1 : voice_array := ( +32,96,32,96,32,96,32,96,26,90,24,88,24,88,23,87,21,85,21,85,24,88,32,96,37,101,101,101,101,101,37,101,35,99,33,97,33,97,32,96,26,90,26,90,32,96,33,97,32,96,33,97,32,96,36,100,33,97,32,96,32,96,26,90,24,88,24,88,23,87,21,85,23,87,23,87,23,87,23,87,24,88,23,87,21,85,24,88,32,96,37,101,101,101,101); +-- accompagnement voice1 +constant voice2 : voice_array := ( +5,69,69,69,69,69,16,80,80,80,80,80,8,72,8,72,8,72,16,80,80,80,80,80,5,69,5,8,16,21,5,69,69,69,69,69,17,81,81,81,81,81,10,74,74,74,74,74,16,80,80,80,80,80,16,80,80,80,80,80,8,72,72,72,72,72,5,69,69,69,69,69,7,71,71,71,71,71,17,81,81,81,8,72,5,69,16,80,8,72,5,69,69,69,69); + +-- voice1, voice2 and voice3 value description +-- bit3-bit0 : tone from 0(La/A) to 11(Sol/G#) +-- bit5-bit4 : octave from 0(220Hz)to 2(880Hz) +-- bit6 : 0 = strike (restart) the tone, 1 = don't strike (hold) the tone + +type voice_array2 is array (0 to 45) of integer range 0 to 127; +-- main voice3 (La lettre a Elise) +constant voice3 : voice_array2 := ( +37,36,37,36,37,32,35,33,26,5,10,17,21,26,32,5,16,21,25,32,33,5,10,17,37,36,37,36,37,32,35,33,26,5,10,17,21,26,32,5,16,21,33,32,26,90); + +type period_array is array (0 to 11) of integer range 0 to 65535; +-- Octave 220Hz @ 10MHz +constant tone_period : period_array := ( + 45455, -- ton 0 La (A ) + 42903, -- ton 1 La# (A#) + 40495, -- ton 2 Si (B ) + 38223, -- ton 3 Do (C ) + 36077, -- ton 4 Do# (C#) + 34052, -- ton 5 Re (D ) + 32141, -- ton 6 Re# (D#) + 30337, -- ton 7 Mi (E ) + 28635, -- ton 8 Fa (F ) + 27027, -- ton 9 Fa# (F#) + 25511, -- ton 10 Sol (G ) + 24079 -- ton 11 Sol# (G#) +); + +signal tempo_period : integer range 0 to C_song0_tempo := C_song1_tempo; --0.19s @ 100kHz + +signal voice1_tone : integer range 0 to 65535 := 0; +signal voice1_tone_div : integer range 0 to 65535 := 0; +signal voice1_code : unsigned(6 downto 0) := "0000000"; +signal voice1_vol : unsigned(7 downto 0) := "00000000"; +signal voice1_snd : std_logic := '0'; + +signal voice2_tone : integer range 0 to 65535 := 0; +signal voice2_tone_div : integer range 0 to 65535 := 0; +signal voice2_code : unsigned(6 downto 0) := "0000000"; +signal voice2_vol : unsigned(7 downto 0) := "00000000"; +signal voice2_snd : std_logic := '0'; + +signal snd1 : unsigned(7 downto 0) := "00000000"; +signal snd2 : unsigned(7 downto 0) := "00000000"; + +signal trigger_r : std_logic := '0'; +signal max_step : integer range 0 to 94 := 94; +signal sel_song_r: std_logic := '1'; + +begin + +process (clk) + variable cnt : integer range 0 to 127 := 0; + variable step : integer range 0 to 94 := 94; + variable tempo : integer range 0 to C_song0_tempo := 0; + variable voice1_code_v : unsigned(6 downto 0) := "0000000"; + variable voice2_code_v : unsigned(6 downto 0) := "0000000"; + variable voice1_down_rate : integer range 0 to C_voice_down_rate := 0; + variable voice2_down_rate : integer range 0 to C_voice_down_rate := 0; +begin + if rising_edge(clk) then + trigger_r <= trigger; + + if reset = '1' then + cnt := 0; + step := 94; + voice1_vol <= X"00"; + voice2_vol <= X"00"; + elsif trigger ='1' and trigger_r ='0' and step = 94 then -- restart music on edge trigger if not already playing + cnt := 0; + step := 0; + voice1_vol <= X"00"; + voice2_vol <= X"00"; + sel_song_r <= sel_song; + if sel_song = '1' then + max_step <= 94; + tempo_period <= C_song1_tempo; + else + max_step <= 46; + tempo_period <= C_song0_tempo; + end if; + else + cnt := cnt +1; + if cnt >= 100 then + cnt := 0; + tempo := tempo +1; + if tempo >= tempo_period then -- next beat + tempo := 0; + if step < max_step then -- if not end of music get next note + if sel_song_r = '1' then + voice1_code_v := to_unsigned(voice1(step),7); + voice2_code_v := to_unsigned(voice2(step),7); + else + voice1_code_v := to_unsigned(voice3(step),7); + voice2_code_v := to_unsigned(voice3(step),7); + end if; + voice1_code <= voice1_code_v; + voice2_code <= voice2_code_v; + step := step + 1; + else -- if end cut-off volume + voice1_vol <= X"00"; + voice2_vol <= X"00"; + step := 94; + end if; + end if; + if (step < 94) then -- if not end of music + -- manage voice1 volume + -- ramp up fast to xF0 at begining of beat when new strike + if (tempo < C_voice_attack) and (voice1_code_v(6)='0') then + if voice1_vol < X"F0" then voice1_vol <= voice1_vol + X"01"; end if; + voice1_down_rate := 0; + -- ramp down slowly after a while, down to x80 + else + if voice1_vol > X"80" then + voice1_down_rate := voice1_down_rate+1; + if voice1_down_rate >= C_voice_down_rate then + voice1_down_rate := 0; + voice1_vol <= voice1_vol - X"01"; + end if; + end if; + end if; + -- manage voice2 volume + if (tempo < C_voice_attack) and (voice2_code_v(6)='0') then + if voice2_vol < X"F0" then voice2_vol <= voice2_vol + X"01"; end if; + voice2_down_rate := 0; + else + if voice2_vol > X"80" then + voice2_down_rate := voice2_down_rate+1; + if voice2_down_rate >= C_voice_down_rate then + voice2_down_rate := 0; + voice2_vol <= voice2_vol - X"01"; + end if; + end if; + end if; + end if; + end if; + end if; + end if; +end process; + +-- get voice1 raw tone +voice1_tone <= tone_period(to_integer(voice1_code(3 downto 0))); + +-- get voice1 tone w.r.t octave +with voice1_code(5 downto 4) select +voice1_tone_div <= voice1_tone when "00", + voice1_tone/2 when "01", + voice1_tone/4 when others; + +-- generate voice1 frequency +voice1_frequency: process (clk) + variable cnt : integer range 0 to 65535 := 0; +begin + if rising_edge(clk) then + if reset = '1' then + cnt := 0; + else + cnt := cnt+1; + if cnt >= voice1_tone_div then + cnt := 0; + voice1_snd <= not voice1_snd; + end if; + end if; + end if; +end process; + +-- get voice2 raw tone +voice2_tone <= tone_period(to_integer(voice2_code(3 downto 0))); + +-- get voice2 tone w.r.t octave +with voice2_code(5 downto 4) select +voice2_tone_div <= voice2_tone when "00", + voice2_tone/2 when "01", + voice2_tone/4 when others; + +-- generate voice2 frequency +voice2_frequency: process (clk) + variable cnt : integer range 0 to 65535 := 0; +begin + if rising_edge(clk) then + if reset = '1' then + cnt := 0; + else + cnt := cnt+1; + if cnt >= voice2_tone_div then + cnt := 0; + voice2_snd <= not voice2_snd; + end if; + end if; + end if; +end process; + +-- modulate voice1 volume with voice1 frequency +with voice1_snd select snd1 <= voice1_vol when '1', X"00" when others; + +-- modulate voice2 volume with voice2 frequency +with voice2_snd select snd2 <= voice2_vol when '1', X"00" when others; + +-- mix voice1 and voice 2 +snd <= std_logic_vector(('0'&snd1(7 downto 1)) + ('0'&snd2(7 downto 1))); + +end struct; + diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_prog.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_prog.vhd new file mode 100644 index 00000000..5278aeb3 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_prog.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity phoenix_prog is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of phoenix_prog is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"31",X"FF",X"4B",X"26",X"50",X"36",X"00",X"CD", + X"50",X"00",X"21",X"00",X"18",X"0E",X"03",X"CD",X"D0",X"01",X"CD",X"80",X"00",X"3A",X"A2",X"43", + X"A7",X"CA",X"2D",X"00",X"CD",X"00",X"04",X"CD",X"00",X"27",X"C3",X"1A",X"00",X"3E",X"0F",X"26", + X"60",X"77",X"26",X"68",X"77",X"CD",X"77",X"03",X"00",X"CD",X"E0",X"17",X"A7",X"CA",X"46",X"00", + X"CD",X"88",X"02",X"C3",X"1A",X"00",X"CD",X"E3",X"00",X"C3",X"1A",X"00",X"FF",X"FF",X"FF",X"FF", + X"26",X"68",X"36",X"00",X"26",X"60",X"36",X"00",X"26",X"58",X"36",X"00",X"CD",X"6B",X"00",X"26", + X"50",X"36",X"01",X"CD",X"6B",X"00",X"26",X"50",X"36",X"00",X"C9",X"21",X"F8",X"4B",X"3E",X"3F", + X"36",X"00",X"2B",X"BC",X"C2",X"70",X"00",X"C9",X"CD",X"96",X"01",X"C3",X"F0",X"06",X"FF",X"FF", + X"26",X"78",X"7E",X"E6",X"80",X"CA",X"80",X"00",X"7E",X"E6",X"80",X"C2",X"88",X"00",X"26",X"70", + X"7E",X"21",X"A0",X"43",X"46",X"77",X"2C",X"70",X"2E",X"9B",X"CD",X"00",X"02",X"2E",X"8F",X"7E", + X"FE",X"09",X"C8",X"D2",X"00",X"00",X"06",X"01",X"CD",X"BB",X"00",X"C8",X"2E",X"8F",X"34",X"7E", + X"C6",X"20",X"32",X"42",X"41",X"C9",X"00",X"C9",X"FF",X"FF",X"FF",X"21",X"A0",X"43",X"7E",X"2F", + X"A0",X"2C",X"A6",X"C9",X"7E",X"E6",X"0F",X"F6",X"20",X"12",X"CD",X"10",X"02",X"05",X"C8",X"7E", + X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"F6",X"20",X"12",X"CD",X"10",X"02",X"2B",X"05",X"C2",X"C4", + X"00",X"C9",X"FF",X"21",X"99",X"43",X"CD",X"00",X"02",X"01",X"01",X"00",X"CD",X"58",X"02",X"CA", + X"E1",X"01",X"01",X"02",X"00",X"11",X"1F",X"01",X"CD",X"60",X"02",X"D2",X"96",X"01",X"01",X"20", + X"01",X"CD",X"58",X"02",X"CA",X"CA",X"0B",X"0E",X"B0",X"CD",X"58",X"02",X"CA",X"E1",X"01",X"0E", + X"B8",X"CD",X"58",X"02",X"CA",X"80",X"05",X"0E",X"C0",X"11",X"DF",X"02",X"CD",X"60",X"02",X"D2", + X"78",X"00",X"01",X"00",X"03",X"11",X"AF",X"03",X"CD",X"60",X"02",X"D2",X"DC",X"21",X"01",X"E6", + X"03",X"11",X"FF",X"FF",X"CD",X"60",X"02",X"D2",X"B0",X"03",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CD",X"A0",X"03",X"CD",X"80",X"00",X"CD",X"80",X"03",X"21",X"A3",X"43",X"36",X"02",X"2C",X"36", + X"00",X"00",X"00",X"00",X"2E",X"B8",X"06",X"08",X"CD",X"D8",X"05",X"2E",X"BA",X"36",X"10",X"2E", + X"BE",X"3A",X"00",X"78",X"E6",X"0C",X"07",X"07",X"C6",X"30",X"77",X"26",X"58",X"36",X"00",X"CD", + X"80",X"00",X"C9",X"7E",X"E6",X"7F",X"06",X"CE",X"FE",X"1F",X"D8",X"06",X"FE",X"C8",X"06",X"AE", + X"FE",X"5F",X"D8",X"06",X"FE",X"C8",X"06",X"CE",X"FE",X"7F",X"D8",X"06",X"FE",X"2D",X"7E",X"FE", + X"09",X"C0",X"06",X"7E",X"C9",X"FF",X"7E",X"E6",X"1F",X"FE",X"06",X"D8",X"5F",X"7E",X"E6",X"E0", + X"4F",X"2D",X"46",X"2E",X"A8",X"70",X"2C",X"71",X"01",X"60",X"18",X"CD",X"06",X"02",X"7E",X"2D", + X"66",X"6F",X"7B",X"56",X"2C",X"5E",X"2D",X"4F",X"85",X"6F",X"79",X"D6",X"06",X"4F",X"CA",X"C8", + X"01",X"CD",X"17",X"02",X"0D",X"C2",X"C1",X"01",X"7E",X"12",X"C3",X"E0",X"14",X"C2",X"C0",X"01", + X"56",X"2C",X"5E",X"7D",X"C6",X"05",X"6F",X"06",X"1A",X"CD",X"ED",X"01",X"0D",X"C2",X"D0",X"01", + X"C9",X"CD",X"40",X"01",X"21",X"60",X"19",X"0E",X"03",X"C3",X"D0",X"01",X"FF",X"7E",X"12",X"23", + X"CD",X"17",X"02",X"05",X"C2",X"ED",X"01",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"34",X"C0",X"2D",X"34",X"2C",X"C9",X"7E",X"81",X"77",X"2D",X"7E",X"88",X"77",X"2C",X"C9",X"FF", + X"7B",X"C6",X"20",X"5F",X"D0",X"14",X"C9",X"7B",X"D6",X"20",X"5F",X"D0",X"15",X"C9",X"FF",X"FF", + X"AF",X"7E",X"81",X"27",X"77",X"2D",X"7E",X"88",X"27",X"77",X"2D",X"7E",X"CE",X"00",X"27",X"77", + X"2C",X"2C",X"C9",X"FF",X"FF",X"FF",X"37",X"3E",X"99",X"CE",X"00",X"91",X"86",X"27",X"77",X"2D", + X"3E",X"99",X"CE",X"00",X"90",X"86",X"27",X"77",X"2D",X"3E",X"99",X"CE",X"00",X"86",X"27",X"77", + X"2C",X"2C",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"7E",X"B9",X"C0",X"2D",X"7E",X"2C",X"B8",X"C9", + X"CD",X"70",X"02",X"D8",X"CD",X"77",X"02",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"7E",X"91",X"2D",X"7E",X"98",X"2C",X"C9",X"7B",X"96",X"2D",X"7A",X"9E",X"2C",X"C9",X"FF",X"FF", + X"7D",X"B9",X"C0",X"7C",X"B8",X"C9",X"FF",X"FF",X"CD",X"40",X"01",X"21",X"C0",X"19",X"0E",X"02", + X"CD",X"D0",X"01",X"0E",X"02",X"CD",X"E0",X"17",X"FE",X"02",X"DA",X"A7",X"02",X"21",X"A0",X"1B", + X"0E",X"01",X"CD",X"D0",X"01",X"0E",X"06",X"3A",X"00",X"70",X"2F",X"A1",X"C8",X"CD",X"CB",X"02", + X"CD",X"F0",X"02",X"CD",X"2E",X"03",X"CD",X"50",X"03",X"CD",X"40",X"01",X"26",X"50",X"36",X"01", + X"CD",X"40",X"01",X"26",X"50",X"36",X"00",X"C9",X"FF",X"FF",X"FF",X"0E",X"01",X"FE",X"02",X"CA", + X"D4",X"02",X"0E",X"02",X"21",X"A2",X"43",X"71",X"3A",X"00",X"78",X"E6",X"10",X"CA",X"E3",X"02", + X"79",X"07",X"4F",X"2E",X"8F",X"7E",X"91",X"77",X"C6",X"20",X"32",X"42",X"41",X"C9",X"FF",X"FF", + X"11",X"83",X"43",X"21",X"8B",X"43",X"CD",X"14",X"03",X"D4",X"20",X"03",X"1E",X"87",X"2E",X"8B", + X"CD",X"14",X"03",X"D4",X"20",X"03",X"2E",X"8B",X"11",X"41",X"41",X"06",X"06",X"CD",X"C4",X"00", + X"C9",X"FF",X"FF",X"FF",X"1A",X"96",X"1D",X"2D",X"1A",X"9E",X"1D",X"2D",X"1A",X"9E",X"C9",X"FF", + X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"23",X"1A",X"77",X"C9",X"FF",X"FF",X"FF",X"21",X"80", + X"43",X"36",X"00",X"23",X"7D",X"FE",X"88",X"C2",X"31",X"03",X"2E",X"83",X"11",X"61",X"42",X"06", + X"06",X"CD",X"C4",X"00",X"2E",X"87",X"11",X"21",X"40",X"06",X"06",X"CD",X"C4",X"00",X"C9",X"FF", + X"3A",X"00",X"78",X"E6",X"03",X"C6",X"03",X"47",X"21",X"90",X"43",X"70",X"2E",X"A2",X"7E",X"FE", + X"01",X"CA",X"67",X"03",X"2E",X"91",X"70",X"2E",X"90",X"7E",X"F6",X"20",X"32",X"A2",X"42",X"2C", + X"7E",X"F6",X"20",X"32",X"62",X"40",X"C9",X"21",X"8C",X"43",X"77",X"2C",X"77",X"C9",X"FF",X"FF", + X"21",X"3F",X"43",X"11",X"1F",X"00",X"01",X"3F",X"03",X"72",X"2B",X"72",X"2B",X"7D",X"A3",X"B8", + X"C2",X"89",X"03",X"72",X"2B",X"2B",X"2B",X"2B",X"7C",X"B9",X"C2",X"89",X"03",X"C9",X"FF",X"FF", + X"21",X"3F",X"4B",X"11",X"47",X"00",X"72",X"2B",X"72",X"2B",X"7C",X"BB",X"C2",X"A6",X"03",X"C9", + X"01",X"A0",X"07",X"CD",X"70",X"02",X"DA",X"CE",X"03",X"CD",X"58",X"02",X"CA",X"EB",X"03",X"01", + X"60",X"0B",X"CD",X"70",X"02",X"DA",X"CE",X"03",X"CD",X"58",X"02",X"CA",X"E2",X"03",X"CD",X"73", + X"01",X"21",X"A0",X"43",X"7E",X"E6",X"01",X"B0",X"77",X"C3",X"00",X"04",X"C3",X"00",X"04",X"FF", + X"FF",X"FF",X"01",X"08",X"01",X"11",X"00",X"10",X"C3",X"F1",X"03",X"01",X"04",X"01",X"11",X"08", + X"00",X"21",X"A4",X"43",X"70",X"2E",X"B8",X"71",X"2E",X"BA",X"72",X"2C",X"73",X"C9",X"FF",X"FF", + X"21",X"0E",X"04",X"3A",X"A4",X"43",X"07",X"85",X"6F",X"7E",X"2C",X"6E",X"67",X"E9",X"04",X"30", + X"04",X"AC",X"05",X"15",X"08",X"00",X"0A",X"EA",X"0B",X"60",X"24",X"00",X"24",X"4C",X"3A",X"A3", + X"43",X"E6",X"01",X"47",X"3A",X"B8",X"43",X"E6",X"02",X"B0",X"32",X"00",X"50",X"C9",X"18",X"05", + X"21",X"A4",X"43",X"36",X"01",X"2C",X"36",X"80",X"2E",X"A3",X"7E",X"36",X"00",X"FE",X"02",X"C8", + X"77",X"2D",X"7E",X"FE",X"01",X"C8",X"2C",X"7E",X"A7",X"CA",X"A0",X"04",X"2E",X"90",X"7E",X"A7", + X"C8",X"2E",X"A3",X"36",X"00",X"01",X"00",X"01",X"CD",X"60",X"04",X"C9",X"FF",X"FF",X"FF",X"FF", + X"21",X"00",X"50",X"11",X"20",X"43",X"70",X"1A",X"71",X"12",X"1C",X"7B",X"E6",X"03",X"C2",X"66", + X"04",X"7B",X"E6",X"F0",X"D6",X"20",X"5F",X"D2",X"66",X"04",X"15",X"7A",X"FE",X"3F",X"C2",X"66", + X"04",X"11",X"80",X"43",X"70",X"1A",X"71",X"12",X"1C",X"7B",X"FE",X"B8",X"C2",X"84",X"04",X"11", + X"C0",X"4B",X"70",X"1A",X"71",X"12",X"1C",X"7B",X"FE",X"00",X"C2",X"92",X"04",X"C9",X"FF",X"FF", + X"2E",X"A3",X"36",X"01",X"01",X"01",X"00",X"CD",X"60",X"04",X"C9",X"FF",X"21",X"A5",X"43",X"35", + X"7E",X"2D",X"36",X"02",X"A7",X"C8",X"36",X"01",X"FE",X"7F",X"CA",X"F0",X"07",X"2E",X"9A",X"36", + X"00",X"2C",X"36",X"00",X"E6",X"08",X"C2",X"E6",X"04",X"CD",X"E8",X"06",X"00",X"21",X"A3",X"43", + X"7E",X"A7",X"2E",X"83",X"11",X"61",X"42",X"CA",X"DF",X"04",X"2E",X"87",X"11",X"21",X"40",X"06", + X"06",X"CD",X"C4",X"00",X"C9",X"FF",X"21",X"A3",X"43",X"7E",X"A7",X"11",X"61",X"42",X"CA",X"F4", + X"04",X"11",X"21",X"40",X"06",X"06",X"CD",X"FB",X"04",X"C9",X"FF",X"3E",X"00",X"12",X"CD",X"10", + X"02",X"05",X"C2",X"FB",X"04",X"C9",X"21",X"92",X"43",X"06",X"06",X"CD",X"D8",X"05",X"3A",X"50", + X"4B",X"32",X"94",X"43",X"C9",X"CD",X"1E",X"04",X"21",X"A4",X"43",X"36",X"03",X"CD",X"80",X"05", + X"CD",X"47",X"05",X"CD",X"A0",X"09",X"CD",X"32",X"05",X"CD",X"6C",X"0A",X"CD",X"06",X"05",X"C3", + X"B0",X"32",X"21",X"50",X"4B",X"06",X"A0",X"CD",X"D8",X"05",X"CD",X"EC",X"05",X"CD",X"50",X"06", + X"CD",X"10",X"06",X"C9",X"FF",X"FF",X"FF",X"21",X"60",X"05",X"11",X"C0",X"43",X"06",X"20",X"CD", + X"E0",X"05",X"21",X"E0",X"43",X"06",X"20",X"CD",X"D8",X"05",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0C",X"10",X"64",X"D8",X"00",X"50",X"00",X"D0",X"00",X"50",X"00",X"D0",X"00",X"58",X"00",X"20", + X"00",X"58",X"00",X"20",X"00",X"58",X"00",X"20",X"00",X"58",X"00",X"20",X"00",X"58",X"00",X"20", + X"21",X"98",X"05",X"3A",X"B8",X"43",X"E6",X"0F",X"85",X"6F",X"6E",X"26",X"05",X"11",X"AB",X"43", + X"06",X"0C",X"CD",X"E0",X"05",X"C9",X"FF",X"FF",X"A8",X"A8",X"C0",X"C0",X"A8",X"A8",X"A8",X"A8", + X"B4",X"CC",X"B4",X"B4",X"A8",X"A8",X"A8",X"A8",X"80",X"7F",X"00",X"00",X"40",X"3F",X"00",X"1C", + X"00",X"FF",X"FF",X"FF",X"60",X"5F",X"01",X"02",X"30",X"2F",X"00",X"1C",X"00",X"C0",X"FF",X"FF", + X"80",X"7F",X"03",X"04",X"40",X"3F",X"00",X"1F",X"00",X"A0",X"FF",X"FF",X"60",X"60",X"05",X"06", + X"50",X"30",X"00",X"1D",X"00",X"48",X"FF",X"FF",X"AF",X"77",X"23",X"05",X"C2",X"D9",X"05",X"C9", + X"7E",X"12",X"23",X"13",X"05",X"C2",X"E0",X"05",X"C9",X"FF",X"FF",X"FF",X"21",X"00",X"15",X"3A", + X"B8",X"43",X"E6",X"0F",X"07",X"85",X"6F",X"56",X"23",X"5E",X"21",X"70",X"4B",X"3A",X"BA",X"43", + X"47",X"A7",X"C8",X"72",X"2C",X"73",X"2C",X"2C",X"2C",X"05",X"C2",X"03",X"06",X"C9",X"FF",X"FF", + X"21",X"3A",X"06",X"3A",X"B8",X"43",X"0F",X"E6",X"0F",X"85",X"6F",X"00",X"00",X"00",X"6E",X"26", + X"15",X"11",X"72",X"4B",X"3A",X"BA",X"43",X"47",X"A7",X"C8",X"7E",X"12",X"23",X"13",X"7E",X"12", + X"23",X"13",X"13",X"13",X"05",X"C2",X"2A",X"06",X"C9",X"FF",X"60",X"40",X"E0",X"E0",X"E0",X"E0", + X"FF",X"FF",X"C0",X"A0",X"80",X"80",X"80",X"80",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"20",X"15",X"3A",X"B8",X"43",X"E6",X"0F",X"07",X"85",X"6F",X"56",X"23",X"5E",X"21",X"50", + X"4B",X"3A",X"BA",X"43",X"47",X"A7",X"C8",X"72",X"2C",X"73",X"2C",X"05",X"C2",X"67",X"06",X"C9", + X"21",X"B1",X"43",X"46",X"2E",X"B9",X"4E",X"79",X"90",X"77",X"21",X"B9",X"43",X"7E",X"35",X"32", + X"00",X"58",X"E6",X"07",X"C0",X"01",X"47",X"20",X"11",X"21",X"4B",X"7E",X"0F",X"0F",X"0F",X"E6", + X"1F",X"83",X"5F",X"2E",X"B2",X"7E",X"2C",X"6E",X"67",X"7E",X"12",X"2C",X"7B",X"90",X"5F",X"D2", + X"99",X"06",X"15",X"7A",X"B9",X"C2",X"99",X"06",X"7D",X"32",X"B3",X"43",X"C9",X"FF",X"FF",X"FF", + X"21",X"AB",X"43",X"3A",X"B9",X"43",X"4F",X"BE",X"C0",X"7E",X"2C",X"86",X"2D",X"77",X"2C",X"2C", + X"34",X"46",X"2C",X"34",X"7E",X"21",X"20",X"1E",X"E6",X"1F",X"85",X"6F",X"56",X"C6",X"20",X"6F", + X"5E",X"79",X"0F",X"0F",X"0F",X"E6",X"1E",X"83",X"C6",X"02",X"5F",X"21",X"60",X"1E",X"78",X"E6", + X"1F",X"85",X"6F",X"6E",X"CD",X"DC",X"07",X"C9",X"21",X"00",X"18",X"0E",X"01",X"C3",X"D0",X"01", + X"CD",X"7A",X"06",X"CD",X"40",X"20",X"C3",X"B0",X"06",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"C0",X"43",X"11",X"E0",X"43",X"CD",X"18",X"07",X"79",X"C6",X"04",X"4F",X"C6",X"20",X"5F", + X"50",X"FE",X"EC",X"C2",X"06",X"07",X"C9",X"C9",X"CD",X"20",X"07",X"C3",X"40",X"07",X"E6",X"EF", + X"0A",X"67",X"E6",X"10",X"C8",X"7C",X"E6",X"EF",X"02",X"07",X"07",X"07",X"E6",X"07",X"C6",X"38", + X"6F",X"26",X"07",X"6E",X"E9",X"6C",X"FF",X"8A",X"63",X"79",X"FF",X"9E",X"BE",X"FF",X"FF",X"FF", + X"0A",X"67",X"E6",X"08",X"C8",X"7C",X"E6",X"07",X"67",X"0F",X"0F",X"0F",X"B4",X"F6",X"18",X"02", + X"03",X"7C",X"C6",X"5B",X"6F",X"26",X"07",X"6E",X"E9",X"5E",X"0A",X"6D",X"88",X"FF",X"AA",X"D2", + X"FF",X"FF",X"FF",X"EB",X"56",X"23",X"5E",X"2B",X"AF",X"12",X"EB",X"C9",X"EB",X"EB",X"23",X"23", + X"56",X"23",X"5E",X"0A",X"12",X"0B",X"C9",X"12",X"23",X"EB",X"56",X"23",X"5E",X"2B",X"AF",X"12", + X"CD",X"17",X"02",X"AF",X"12",X"EB",X"C9",X"23",X"EB",X"23",X"23",X"56",X"23",X"5E",X"0A",X"6F", + X"26",X"14",X"7E",X"12",X"23",X"CD",X"17",X"02",X"7E",X"12",X"0B",X"C9",X"FF",X"EB",X"EB",X"56", + X"23",X"5E",X"2B",X"AF",X"12",X"13",X"12",X"EB",X"C9",X"FF",X"EB",X"23",X"23",X"56",X"23",X"5E", + X"0A",X"6F",X"26",X"14",X"7E",X"12",X"23",X"13",X"7E",X"12",X"0B",X"C9",X"23",X"13",X"EB",X"56", + X"23",X"5E",X"2B",X"AF",X"12",X"13",X"12",X"CD",X"17",X"02",X"AF",X"12",X"1B",X"12",X"EB",X"C9", + X"CD",X"4C",X"EB",X"23",X"23",X"56",X"23",X"5E",X"0A",X"6F",X"26",X"14",X"7E",X"12",X"23",X"13", + X"7E",X"12",X"23",X"1B",X"CD",X"17",X"02",X"7E",X"12",X"23",X"13",X"7E",X"12",X"0B",X"C9",X"FF", + X"3A",X"B9",X"43",X"32",X"00",X"58",X"CD",X"80",X"03",X"C3",X"1E",X"04",X"FF",X"FF",X"FF",X"FF", + X"21",X"14",X"08",X"3A",X"B8",X"43",X"07",X"E6",X"1E",X"85",X"6F",X"7E",X"2C",X"6E",X"67",X"E9", + X"FF",X"FF",X"FF",X"FF",X"08",X"34",X"20",X"00",X"08",X"34",X"20",X"00",X"22",X"30",X"34",X"00", + X"22",X"30",X"34",X"00",X"22",X"30",X"22",X"B4",X"22",X"CA",X"20",X"00",X"22",X"4C",X"22",X"4C", + X"22",X"4C",X"22",X"4C",X"CD",X"F0",X"06",X"21",X"B4",X"43",X"35",X"7E",X"FE",X"15",X"D0",X"CD", + X"5A",X"08",X"CD",X"FA",X"05",X"CD",X"50",X"0A",X"21",X"B4",X"43",X"7E",X"A7",X"C0",X"2E",X"B8", + X"34",X"2E",X"A4",X"36",X"02",X"C9",X"FF",X"FF",X"FF",X"FF",X"11",X"6C",X"08",X"FE",X"11",X"D0", + X"1E",X"6D",X"FE",X"0D",X"D0",X"1E",X"6E",X"FE",X"09",X"D0",X"1E",X"6F",X"FE",X"05",X"D0",X"1E", + X"68",X"C9",X"FF",X"FF",X"FF",X"FF",X"CD",X"00",X"07",X"CD",X"86",X"08",X"CD",X"A0",X"08",X"CD", + X"A0",X"09",X"CD",X"7A",X"09",X"C9",X"21",X"EB",X"43",X"06",X"03",X"56",X"2B",X"5E",X"2B",X"72", + X"2B",X"73",X"2B",X"05",X"C2",X"8B",X"08",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CD",X"C4",X"08",X"21",X"C4",X"43",X"CD",X"30",X"09",X"3A",X"B8",X"43",X"E6",X"0F",X"FE",X"03", + X"C0",X"21",X"C8",X"43",X"CD",X"30",X"09",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"21",X"C0",X"43",X"7E",X"E6",X"08",X"CA",X"A0",X"0A",X"2E",X"A6",X"7E", + X"A7",X"C2",X"EA",X"08",X"06",X"80",X"CD",X"BB",X"00",X"CA",X"EB",X"08",X"2E",X"62",X"36",X"40", + X"2E",X"C0",X"7E",X"E6",X"F7",X"77",X"2E",X"A6",X"36",X"FF",X"35",X"2E",X"C2",X"CD",X"00",X"09", + X"01",X"00",X"16",X"C3",X"26",X"09",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3A",X"A0",X"43",X"2F",X"E6",X"60",X"C8",X"E6",X"40",X"CA",X"17",X"09",X"7E",X"FE",X"0D",X"D8", + X"35",X"3E",X"FF",X"32",X"60",X"43",X"C9",X"7E",X"FE",X"C0",X"D0",X"34",X"3E",X"FF",X"32",X"60", + X"43",X"C9",X"FF",X"FF",X"FF",X"FF",X"7E",X"E6",X"07",X"81",X"4F",X"0A",X"2D",X"77",X"C9",X"FF", + X"7E",X"E6",X"08",X"C2",X"64",X"09",X"EB",X"06",X"10",X"CD",X"BB",X"00",X"C8",X"7E",X"E6",X"EF", + X"77",X"1A",X"F6",X"08",X"12",X"13",X"13",X"3A",X"C2",X"43",X"C6",X"04",X"12",X"13",X"3A",X"C3", + X"43",X"D6",X"08",X"12",X"1B",X"EB",X"01",X"20",X"16",X"CD",X"26",X"09",X"3E",X"30",X"32",X"61", + X"43",X"C9",X"FF",X"FF",X"2C",X"2C",X"2C",X"7E",X"D6",X"08",X"77",X"FE",X"1F",X"D0",X"2D",X"2D", + X"2D",X"7E",X"E6",X"F7",X"77",X"C9",X"FF",X"FF",X"7E",X"E6",X"3A",X"C2",X"43",X"47",X"E6",X"07", + X"07",X"21",X"38",X"0B",X"85",X"6F",X"78",X"96",X"32",X"9E",X"43",X"23",X"78",X"86",X"32",X"9F", + X"43",X"C9",X"32",X"9F",X"43",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"C2",X"43",X"11",X"E2",X"43",X"CD",X"BA",X"09",X"03",X"03",X"03",X"13",X"13",X"13",X"79", + X"FE",X"CE",X"C2",X"A6",X"09",X"C9",X"FF",X"FF",X"FF",X"FF",X"21",X"00",X"0A",X"0A",X"E6",X"F8", + X"0F",X"0F",X"85",X"6F",X"7E",X"12",X"03",X"13",X"23",X"0A",X"E6",X"F8",X"0F",X"0F",X"0F",X"86", + X"12",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"43",X"20",X"43",X"00",X"42",X"E0",X"42",X"C0",X"42",X"A0",X"42",X"80",X"42",X"60",X"42",X"40", + X"42",X"20",X"42",X"00",X"41",X"E0",X"41",X"C0",X"41",X"A0",X"41",X"80",X"41",X"60",X"41",X"40", + X"41",X"20",X"41",X"00",X"40",X"E0",X"40",X"C0",X"40",X"A0",X"40",X"80",X"40",X"60",X"40",X"40", + X"40",X"20",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"BA",X"AB",X"BB",X"80",X"90",X"81",X"91",X"74",X"7C",X"75",X"7D",X"FF",X"FF",X"FF",X"FF", + X"01",X"70",X"4B",X"11",X"B0",X"4B",X"C5",X"CD",X"18",X"07",X"C1",X"79",X"C6",X"04",X"4F",X"C6", + X"40",X"5F",X"50",X"A7",X"C2",X"56",X"0A",X"C9",X"FF",X"FF",X"FF",X"FF",X"01",X"70",X"4B",X"11", + X"B3",X"4B",X"C5",X"D5",X"0A",X"E6",X"18",X"CA",X"8A",X"0A",X"EB",X"56",X"2B",X"5E",X"2B",X"72", + X"2B",X"73",X"EB",X"13",X"13",X"03",X"03",X"CD",X"BA",X"09",X"D1",X"C1",X"79",X"C6",X"04",X"4F", + X"7B",X"C6",X"04",X"5F",X"FE",X"03",X"C2",X"72",X"0A",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"2E",X"E2",X"56",X"23",X"5E",X"CD",X"10",X"02",X"1B",X"01",X"04",X"04",X"2E",X"A6",X"35",X"7E", + X"21",X"F0",X"17",X"FE",X"C0",X"CA",X"48",X"0B",X"21",X"70",X"17",X"E6",X"0C",X"07",X"07",X"85", + X"6F",X"C3",X"D6",X"0A",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"D5",X"C5",X"7E",X"12",X"23",X"13",X"05",X"C2",X"D8",X"0A", + X"C1",X"D1",X"CD",X"17",X"02",X"0D",X"C2",X"D6",X"0A",X"C9",X"21",X"B9",X"43",X"7E",X"E6",X"F8", + X"77",X"32",X"00",X"58",X"2E",X"E2",X"56",X"2C",X"5E",X"CD",X"10",X"02",X"1B",X"00",X"2E",X"A5", + X"35",X"7E",X"CA",X"15",X"0B",X"FE",X"20",X"DA",X"A0",X"0B",X"CA",X"80",X"03",X"C3",X"BA",X"0B", + X"70",X"20",X"C3",X"E8",X"20",X"2D",X"36",X"05",X"2D",X"7E",X"C6",X"90",X"6F",X"7E",X"A7",X"C8", + X"35",X"E5",X"CD",X"67",X"03",X"E1",X"7E",X"A7",X"C8",X"2E",X"A4",X"36",X"00",X"C9",X"FF",X"FF", + X"FF",X"F0",X"E0",X"B0",X"C0",X"D0",X"C0",X"B0",X"00",X"08",X"01",X"09",X"02",X"0A",X"03",X"0B", + X"03",X"0B",X"02",X"0A",X"01",X"09",X"00",X"08",X"CD",X"D6",X"0A",X"21",X"C0",X"43",X"36",X"0C", + X"2C",X"36",X"0C",X"2C",X"7E",X"E6",X"F8",X"F6",X"03",X"77",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"A5",X"43",X"34",X"7E",X"FE",X"40",X"CA",X"A0",X"03",X"21",X"00",X"1A",X"0E",X"01",X"FE", + X"80",X"C2",X"95",X"0B",X"21",X"A4",X"43",X"36",X"00",X"2E",X"90",X"7E",X"2C",X"B6",X"C0",X"AF", + X"2E",X"98",X"77",X"2C",X"77",X"2E",X"A2",X"77",X"2C",X"7E",X"A7",X"C8",X"36",X"00",X"01",X"00", + X"01",X"CD",X"60",X"04",X"C9",X"CD",X"D0",X"01",X"CD",X"E4",X"01",X"C3",X"F0",X"1D",X"FF",X"FF", + X"21",X"B8",X"43",X"7E",X"E6",X"0F",X"FE",X"04",X"D8",X"FE",X"09",X"D0",X"2C",X"AF",X"77",X"32", + X"00",X"58",X"C3",X"A0",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"47",X"0F",X"D2",X"C0",X"0F",X"0F", + X"78",X"DA",X"70",X"20",X"C3",X"E8",X"20",X"FF",X"FF",X"FF",X"21",X"D0",X"42",X"01",X"DF",X"FF", + X"36",X"64",X"09",X"23",X"36",X"65",X"21",X"F2",X"42",X"11",X"40",X"0A",X"CD",X"38",X"35",X"21", + X"15",X"4B",X"11",X"00",X"3C",X"CD",X"28",X"35",X"21",X"D8",X"4A",X"11",X"48",X"0A",X"CD",X"48", + X"35",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E5",X"7D",X"D6",X"72",X"0F",X"C6",X"50",X"6F",X"7E",X"2C",X"6E",X"67",X"11",X"04",X"0C",X"7E", + X"E1",X"FE",X"07",X"DA",X"A4",X"0E",X"FE",X"09",X"D2",X"A4",X"0E",X"11",X"20",X"10",X"3E",X"FF", + X"32",X"69",X"43",X"C3",X"A4",X"0E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"FF",X"43",X"06",X"05",X"CD",X"8B",X"08",X"CD",X"56",X"0C",X"CD",X"6B",X"0C",X"CD",X"D8", + X"0C",X"C9",X"FF",X"FF",X"FF",X"FF",X"21",X"CC",X"43",X"E5",X"CD",X"84",X"0C",X"E1",X"7D",X"C6", + X"04",X"6F",X"FE",X"E0",X"C2",X"59",X"0C",X"C9",X"FF",X"FF",X"FF",X"01",X"CE",X"43",X"11",X"EE", + X"43",X"CD",X"BA",X"09",X"03",X"03",X"03",X"13",X"13",X"13",X"79",X"FE",X"E2",X"C2",X"71",X"0C", + X"C9",X"FF",X"FF",X"FF",X"7E",X"E6",X"08",X"C8",X"00",X"00",X"2C",X"7E",X"EE",X"04",X"77",X"2C", + X"2C",X"7E",X"C6",X"04",X"77",X"FE",X"F9",X"D2",X"6E",X"09",X"2D",X"CD",X"B4",X"0C",X"54",X"7D", + X"C6",X"20",X"5F",X"EB",X"46",X"23",X"4E",X"0A",X"EB",X"2C",X"FE",X"E8",X"D2",X"6E",X"09",X"C9", + X"FF",X"FF",X"FF",X"FF",X"FE",X"DC",X"D8",X"FE",X"E9",X"D0",X"3A",X"9F",X"43",X"BE",X"D8",X"3A", + X"9E",X"43",X"BE",X"D0",X"3E",X"04",X"32",X"A4",X"43",X"3E",X"60",X"32",X"A5",X"43",X"3E",X"10", + X"32",X"63",X"43",X"C9",X"FF",X"FF",X"FF",X"FF",X"01",X"CC",X"43",X"11",X"EC",X"43",X"C5",X"CD", + X"18",X"07",X"C1",X"79",X"C6",X"04",X"4F",X"C6",X"20",X"5F",X"50",X"A7",X"C2",X"DE",X"0C",X"C9", + X"FF",X"FF",X"FF",X"FF",X"D1",X"C1",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"21",X"93",X"43",X"34",X"7E",X"E6",X"07",X"C0", + X"2C",X"2C",X"7E",X"3C",X"E6",X"0F",X"77",X"C9",X"FF",X"FF",X"FF",X"FF",X"01",X"70",X"4B",X"21", + X"50",X"4B",X"CD",X"30",X"0D",X"0C",X"0C",X"2C",X"3E",X"B0",X"B9",X"C2",X"22",X"0D",X"C9",X"FF", + X"56",X"23",X"0A",X"03",X"03",X"E6",X"08",X"C8",X"5E",X"EB",X"7E",X"07",X"C6",X"00",X"6F",X"26", + X"17",X"AF",X"BE",X"CA",X"4F",X"0D",X"23",X"BE",X"CA",X"5E",X"0D",X"2B",X"0A",X"86",X"02",X"03", + X"23",X"0A",X"86",X"02",X"0B",X"E6",X"07",X"EB",X"C0",X"34",X"C9",X"FF",X"FF",X"FF",X"2B",X"0A", + X"86",X"02",X"E6",X"07",X"EB",X"C0",X"34",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"70",X"4B",X"21",X"50",X"4B",X"CD",X"86",X"0D",X"79",X"C6",X"04",X"4F",X"3E",X"B0",X"B9", + X"C2",X"76",X"0D",X"C9",X"FF",X"FF",X"56",X"23",X"5E",X"23",X"0A",X"E6",X"08",X"C8",X"EB",X"7E", + X"A7",X"CC",X"DE",X"0D",X"6F",X"07",X"85",X"C6",X"A0",X"6F",X"26",X"16",X"0A",X"E6",X"F8",X"B6", + X"02",X"03",X"03",X"03",X"23",X"7E",X"23",X"0F",X"DA",X"BB",X"0D",X"0F",X"DA",X"CC",X"0D",X"0A", + X"0F",X"E6",X"03",X"86",X"0B",X"C3",X"D2",X"0D",X"FF",X"FF",X"FF",X"0A",X"0F",X"E6",X"03",X"86", + X"67",X"0B",X"0A",X"E6",X"04",X"84",X"C3",X"D2",X"0D",X"FF",X"FF",X"FF",X"0B",X"0A",X"0F",X"E6", + X"03",X"86",X"6F",X"26",X"16",X"7E",X"0B",X"02",X"0B",X"EB",X"C9",X"FF",X"FF",X"FF",X"1B",X"1B", + X"3A",X"94",X"43",X"12",X"67",X"13",X"3A",X"95",X"43",X"12",X"6F",X"13",X"7E",X"C9",X"FF",X"FF", + X"01",X"C4",X"43",X"21",X"E6",X"43",X"CD",X"10",X"0E",X"01",X"C8",X"43",X"21",X"EA",X"43",X"C3", + X"10",X"0E",X"01",X"CC",X"43",X"21",X"EE",X"43",X"CD",X"10",X"0E",X"C9",X"FF",X"FF",X"FF",X"FF", + X"0A",X"E6",X"08",X"C8",X"56",X"2C",X"5E",X"1A",X"FE",X"C0",X"D0",X"FE",X"60",X"D8",X"FE",X"68", + X"D2",X"39",X"0E",X"E6",X"07",X"07",X"07",X"C6",X"40",X"6F",X"26",X"17",X"03",X"03",X"0A",X"E6", + X"07",X"BE",X"D0",X"23",X"BE",X"D8",X"C3",X"70",X"0E",X"03",X"03",X"0A",X"57",X"03",X"0A",X"E6", + X"F8",X"5F",X"21",X"70",X"4B",X"7E",X"23",X"23",X"E6",X"08",X"C4",X"58",X"0E",X"23",X"23",X"3E", + X"B0",X"BD",X"C2",X"45",X"0E",X"C9",X"FF",X"FF",X"7A",X"BE",X"D8",X"7E",X"C6",X"08",X"BA",X"D8", + X"23",X"7E",X"2B",X"C6",X"04",X"BB",X"D8",X"D6",X"0C",X"BB",X"D0",X"C3",X"00",X"0C",X"FF",X"FF", + X"23",X"0A",X"E6",X"F8",X"86",X"57",X"03",X"0A",X"E6",X"F8",X"5F",X"21",X"70",X"4B",X"7E",X"23", + X"23",X"E6",X"08",X"C4",X"90",X"0E",X"23",X"23",X"3E",X"B0",X"BD",X"C2",X"7E",X"0E",X"C9",X"FF", + X"7E",X"C6",X"02",X"BA",X"D8",X"D6",X"05",X"BA",X"D0",X"23",X"7E",X"2B",X"E6",X"F8",X"BB",X"C0", + X"11",X"02",X"0C",X"00",X"2B",X"2B",X"0B",X"0B",X"0B",X"0A",X"E6",X"F7",X"02",X"7E",X"E6",X"F7", + X"77",X"7D",X"C6",X"42",X"6F",X"46",X"23",X"4E",X"21",X"78",X"43",X"7A",X"FE",X"10",X"CA",X"C3", + X"0E",X"2E",X"70",X"7E",X"A7",X"CA",X"D5",X"0E",X"2C",X"2C",X"2C",X"2C",X"7E",X"A7",X"CA",X"D5", + X"0E",X"2C",X"2C",X"2C",X"2C",X"72",X"2C",X"73",X"2C",X"70",X"2C",X"71",X"2E",X"64",X"36",X"FF", + X"2E",X"BA",X"35",X"E1",X"E1",X"E9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"A6",X"43",X"7E",X"FE",X"C0",X"D2",X"74",X"0F",X"2E",X"E2",X"56",X"2C",X"5E",X"01",X"02", + X"02",X"CD",X"56",X"0F",X"C8",X"00",X"00",X"21",X"9E",X"43",X"7E",X"D6",X"06",X"47",X"2C",X"4E", + X"21",X"70",X"4B",X"7E",X"2C",X"2C",X"E6",X"08",X"C4",X"38",X"0F",X"2C",X"2C",X"3E",X"B0",X"BD", + X"C2",X"23",X"0F",X"C9",X"FF",X"FF",X"FF",X"FF",X"2C",X"7E",X"2D",X"FE",X"D2",X"D8",X"FE",X"E7", + X"D0",X"7E",X"B9",X"D0",X"B8",X"D8",X"CD",X"C4",X"0C",X"11",X"04",X"0D",X"2B",X"2B",X"C3",X"AD", + X"0E",X"AD",X"0E",X"FF",X"FF",X"FF",X"C5",X"D5",X"1A",X"FE",X"60",X"DA",X"63",X"0F",X"FE",X"C0", + X"DA",X"F4",X"0C",X"13",X"05",X"C2",X"58",X"0F",X"D1",X"C1",X"CD",X"17",X"02",X"0D",X"C2",X"56", + X"0F",X"C9",X"FF",X"FF",X"2E",X"E2",X"56",X"2C",X"5E",X"CD",X"17",X"02",X"1B",X"01",X"04",X"04", + X"CD",X"56",X"0F",X"C8",X"00",X"00",X"3A",X"C2",X"43",X"D6",X"0E",X"47",X"C6",X"2D",X"4F",X"21", + X"70",X"4B",X"7E",X"2C",X"2C",X"E6",X"08",X"C4",X"A6",X"0F",X"2C",X"2C",X"3E",X"B0",X"BD",X"C2", + X"92",X"0F",X"C9",X"FF",X"FF",X"FF",X"2C",X"7E",X"2D",X"FE",X"CA",X"D8",X"FE",X"EF",X"D0",X"7E", + X"B9",X"D0",X"B8",X"D8",X"11",X"02",X"0D",X"2B",X"2B",X"C3",X"AD",X"0E",X"AD",X"0E",X"FF",X"FF", + X"21",X"70",X"43",X"CD",X"D8",X"0F",X"21",X"74",X"43",X"CD",X"D8",X"0F",X"21",X"78",X"43",X"CD", + X"58",X"37",X"21",X"7C",X"43",X"C3",X"58",X"37",X"7E",X"A7",X"C8",X"46",X"35",X"2C",X"2C",X"56", + X"2C",X"5E",X"00",X"CD",X"10",X"02",X"78",X"E6",X"0E",X"0F",X"C6",X"B0",X"6F",X"26",X"17",X"6E", + X"EB",X"01",X"DF",X"FF",X"C3",X"40",X"35",X"68",X"3E",X"05",X"32",X"96",X"43",X"C3",X"A4",X"0E", + X"01",X"01",X"01",X"01",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"01",X"01",X"01",X"01", + X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"10",X"11",X"12",X"13",X"10",X"1D",X"0D",X"0E",X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"06",X"06", + X"1E",X"03",X"1F",X"05",X"1C",X"04",X"1D",X"06",X"1E",X"03",X"03",X"03",X"03",X"03",X"1F",X"1C", + X"1D",X"1E",X"03",X"03",X"03",X"03",X"03",X"1F",X"05",X"1C",X"04",X"1D",X"06",X"1E",X"03",X"1F", + X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"1C",X"04",X"04",X"11",X"12",X"13", + X"00",X"FF",X"FF",X"FF",X"0B",X"1E",X"19",X"06",X"06",X"06",X"06",X"06",X"06",X"1E",X"1F",X"1C", + X"1D",X"06",X"06",X"06",X"06",X"06",X"1E",X"03",X"1F",X"05",X"1C",X"04",X"1D",X"06",X"06",X"1A", + X"04",X"1B",X"05",X"18",X"19",X"06",X"1A",X"04",X"1B",X"05",X"05",X"1C",X"04",X"1D",X"06",X"1E", + X"03",X"1F",X"05",X"05",X"05",X"05",X"05",X"1C",X"1D",X"1E",X"1F",X"05",X"05",X"05",X"05",X"05", + X"05",X"05",X"18",X"1F",X"00",X"FF",X"FF",X"FF",X"10",X"04",X"04",X"1D",X"0D",X"0E",X"0B",X"0C", + X"0D",X"0E",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"05",X"05",X"05",X"05",X"05",X"1C", + X"04",X"04",X"1D",X"06",X"06",X"1E",X"03",X"03",X"1F",X"05",X"05",X"05",X"1C",X"11",X"12",X"13", + X"00",X"FF",X"FF",X"FF",X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"1A",X"1B", + X"05",X"18",X"19",X"06",X"0D",X"0E",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"05",X"05", + X"1C",X"1B",X"05",X"05",X"1C",X"04",X"1B",X"05",X"05",X"1C",X"04",X"1B",X"00",X"FF",X"FF",X"FF", + X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"09",X"09",X"09",X"09",X"0A",X"0A",X"09",X"09",X"0A",X"09", + X"16",X"17",X"14",X"07",X"07",X"07",X"1C",X"04",X"1D",X"06",X"1E",X"03",X"1F",X"05",X"1C",X"08", + X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"05",X"05",X"05",X"05",X"00",X"FF",X"FF",X"FF",X"FF", + X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"0A",X"0A",X"0A",X"0A",X"09",X"09",X"0A",X"0A",X"09",X"0A", + X"12",X"13",X"10",X"08",X"08",X"08",X"18",X"07",X"07",X"07",X"07",X"05",X"1C",X"04",X"1D",X"06", + X"1E",X"03",X"1F",X"07",X"07",X"07",X"07",X"05",X"05",X"05",X"05",X"00",X"FF",X"FF",X"FF",X"FF", + X"1C",X"04",X"04",X"04",X"1D",X"06",X"0D",X"0E",X"0B",X"0C",X"06",X"06",X"1E",X"15",X"16",X"17", + X"14",X"19",X"06",X"1A",X"04",X"1D",X"06",X"1E",X"03",X"19",X"06",X"1A",X"04",X"1D",X"1E",X"03", + X"1F",X"1C",X"04",X"1B",X"05",X"18",X"03",X"1F",X"05",X"1C",X"04",X"1B",X"05",X"18",X"03",X"15", + X"16",X"17",X"14",X"1F",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"1C",X"04",X"1D",X"1A",X"1B", + X"00",X"FF",X"FF",X"FF",X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"0D",X"0E", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"05",X"05",X"18",X"03",X"19",X"1A",X"04",X"1B", + X"05",X"18",X"03",X"1F",X"05",X"18",X"03",X"1F",X"05",X"05",X"18",X"1F",X"00",X"FF",X"FF",X"FF", + X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"06",X"06",X"09",X"09",X"09",X"0A",X"09",X"09",X"0A",X"09", + X"09",X"09",X"06",X"1A",X"04",X"11",X"12",X"13",X"10",X"08",X"08",X"08",X"07",X"07",X"07",X"08", + X"08",X"08",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"00",X"FF",X"FF", + X"1C",X"11",X"12",X"13",X"10",X"04",X"1D",X"0D",X"0E",X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"1E", + X"1F",X"05",X"18",X"19",X"0D",X"0E",X"0B",X"0C",X"1E",X"1F",X"05",X"05",X"05",X"05",X"05",X"18", + X"19",X"0D",X"0E",X"0B",X"0C",X"06",X"1E",X"1F",X"05",X"05",X"05",X"05",X"18",X"19",X"06",X"1E", + X"1F",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"1C",X"04",X"04",X"1D",X"1A",X"04",X"1B", + X"00",X"FF",X"FF",X"FF",X"18",X"03",X"03",X"19",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06", + X"06",X"06",X"06",X"06",X"1A",X"04",X"1B",X"05",X"1C",X"04",X"1D",X"06",X"1E",X"03",X"03",X"19", + X"06",X"1A",X"04",X"04",X"04",X"1B",X"05",X"18",X"03",X"03",X"1F",X"05",X"1C",X"04",X"1D",X"06", + X"1A",X"04",X"1B",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"18", + X"03",X"19",X"1E",X"1F",X"00",X"FF",X"FF",X"FF",X"0B",X"0C",X"1A",X"1D",X"1E",X"03",X"19",X"06", + X"1A",X"04",X"04",X"1D",X"06",X"1E",X"03",X"03",X"03",X"19",X"06",X"06",X"1A",X"04",X"04",X"04", + X"04",X"1D",X"06",X"06",X"1E",X"03",X"03",X"03",X"03",X"03",X"03",X"1F",X"05",X"05",X"1C",X"04", + X"04",X"04",X"04",X"1B",X"05",X"05",X"18",X"03",X"03",X"03",X"1F",X"05",X"1C",X"04",X"04",X"1B", + X"05",X"18",X"03",X"1F",X"1C",X"1B",X"05",X"05",X"00",X"FF",X"18",X"03",X"19",X"06",X"06",X"06", + X"06",X"06",X"06",X"1A",X"1D",X"1E",X"19",X"1A",X"1D",X"06",X"1E",X"19",X"06",X"1E",X"15",X"16", + X"17",X"14",X"07",X"07",X"07",X"08",X"08",X"08",X"08",X"05",X"05",X"18",X"03",X"03",X"19",X"06", + X"06",X"1A",X"04",X"04",X"1B",X"08",X"08",X"08",X"08",X"05",X"05",X"05",X"05",X"18",X"1F",X"00", + X"0B",X"0C",X"0A",X"0A",X"09",X"09",X"09",X"0A",X"0A",X"09",X"09",X"09",X"0A",X"09",X"09",X"16", + X"17",X"14",X"07",X"07",X"07",X"08",X"08",X"08",X"08",X"07",X"07",X"08",X"08",X"08",X"08",X"07", + X"08",X"11",X"12",X"13",X"00",X"FF",X"FF",X"FF",X"0B",X"0C",X"09",X"09",X"0A",X"09",X"09",X"0A", + X"0A",X"0A",X"0A",X"09",X"0A",X"0A",X"0A",X"12",X"13",X"10",X"04",X"04",X"04",X"1B",X"18",X"03", + X"03",X"07",X"07",X"08",X"08",X"07",X"07",X"08",X"08",X"07",X"07",X"07",X"07",X"07",X"00",X"FF", + X"FF",X"FF",X"FF",X"FF",X"1C",X"11",X"12",X"13",X"10",X"1D",X"0D",X"0E",X"0B",X"0C",X"09",X"0A", + X"09",X"09",X"0A",X"09",X"09",X"09",X"06",X"1A",X"04",X"1B",X"05",X"18",X"03",X"19",X"09",X"09", + X"0D",X"0E",X"0B",X"0C",X"0D",X"0E",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02", + X"02",X"02",X"08",X"07",X"07",X"08",X"07",X"07",X"08",X"08",X"07",X"07",X"07",X"07",X"07",X"05", + X"05",X"05",X"05",X"05",X"05",X"1C",X"11",X"12",X"13",X"00",X"FF",X"FF",X"0B",X"0C",X"0D",X"0E", + X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"1A",X"1D",X"06",X"1E",X"19",X"06",X"06",X"1A",X"04",X"1B", + X"1C",X"04",X"1D",X"1A",X"04",X"1B",X"1C",X"04",X"1D",X"1A",X"04",X"1B",X"05",X"18",X"07",X"07", + X"07",X"08",X"08",X"07",X"07",X"07",X"07",X"08",X"08",X"07",X"07",X"07",X"07",X"00",X"FF",X"FF", + X"14",X"03",X"19",X"0D",X"0E",X"0B",X"0C",X"0A",X"0A",X"0A",X"09",X"0A",X"0A",X"0A",X"09",X"0A", + X"0A",X"0A",X"06",X"1E",X"15",X"16",X"17",X"14",X"03",X"1F",X"05",X"05",X"08",X"07",X"07",X"07", + X"08",X"07",X"07",X"07",X"08",X"08",X"05",X"05",X"05",X"05",X"05",X"00",X"FF",X"FF",X"FF",X"FF", + X"30",X"40",X"31",X"41",X"32",X"42",X"33",X"43",X"34",X"44",X"35",X"45",X"36",X"46",X"37",X"47", + X"38",X"48",X"39",X"49",X"3A",X"4A",X"3B",X"4B",X"3C",X"4C",X"3D",X"4D",X"3E",X"4E",X"3F",X"4F", + X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"69",X"00",X"69",X"00",X"7A",X"7B",X"7A",X"7B", + X"6B",X"00",X"6B",X"00",X"8C",X"8D",X"8C",X"8D",X"68",X"00",X"68",X"00",X"8A",X"9A",X"8A",X"9A", + X"6A",X"00",X"6A",X"00",X"8B",X"9B",X"8B",X"9B",X"68",X"00",X"6B",X"00",X"6A",X"00",X"69",X"00", + X"76",X"77",X"74",X"75",X"72",X"73",X"70",X"71",X"68",X"00",X"86",X"96",X"69",X"00",X"87",X"97", + X"6A",X"00",X"88",X"98",X"6B",X"00",X"89",X"99",X"68",X"00",X"00",X"00",X"A2",X"B2",X"A3",X"B3", + X"69",X"00",X"00",X"00",X"A4",X"B4",X"A5",X"B5",X"6A",X"00",X"00",X"00",X"A6",X"B6",X"A7",X"B7", + X"6B",X"00",X"00",X"00",X"A8",X"B8",X"A9",X"B9",X"FF",X"FF",X"FF",X"FF",X"8A",X"9A",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"8B",X"9B",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"8E",X"9E",X"8F",X"9F",X"A0",X"B0",X"A1",X"B1", + 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"FF",X"FF",X"FF",X"FF", + X"9C",X"00",X"00",X"00",X"84",X"94",X"85",X"95",X"82",X"92",X"83",X"93",X"80",X"90",X"81",X"91", + X"9D",X"00",X"00",X"00",X"AE",X"BE",X"AF",X"BF",X"AC",X"BC",X"AD",X"00",X"AA",X"BA",X"AB",X"BB", + X"47",X"3A",X"00",X"78",X"E6",X"10",X"C8",X"EB",X"7A",X"FE",X"18",X"C0",X"7B",X"FE",X"95",X"36", + X"22",X"C8",X"FE",X"9A",X"36",X"13",X"C8",X"FE",X"B5",X"36",X"24",X"C8",X"70",X"C9",X"FF",X"FF", + X"08",X"6C",X"09",X"60",X"08",X"6C",X"09",X"60",X"08",X"6C",X"09",X"60",X"08",X"6C",X"09",X"60", + X"08",X"6C",X"09",X"60",X"08",X"6C",X"09",X"60",X"08",X"6C",X"09",X"60",X"09",X"60",X"09",X"60", + X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00", + X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00", + X"50",X"20",X"70",X"20",X"60",X"28",X"60",X"38",X"50",X"40",X"70",X"40",X"40",X"38",X"80",X"38", + X"30",X"30",X"90",X"30",X"20",X"38",X"A0",X"38",X"18",X"48",X"A8",X"48",X"60",X"48",X"60",X"58", + X"60",X"48",X"60",X"58",X"48",X"58",X"78",X"58",X"38",X"50",X"88",X"50",X"28",X"48",X"98",X"48", + X"18",X"40",X"A8",X"40",X"18",X"30",X"A8",X"30",X"28",X"28",X"98",X"28",X"38",X"20",X"88",X"20", + X"60",X"20",X"50",X"20",X"70",X"20",X"40",X"28",X"80",X"28",X"30",X"30",X"90",X"30",X"20",X"38", + X"A0",X"38",X"60",X"58",X"50",X"58",X"70",X"58",X"40",X"58",X"80",X"58",X"30",X"58",X"90",X"58", + X"60",X"20",X"50",X"28",X"70",X"28",X"40",X"30",X"80",X"30",X"30",X"38",X"90",X"38",X"20",X"40", + X"A0",X"40",X"60",X"58",X"50",X"58",X"70",X"58",X"40",X"50",X"80",X"50",X"30",X"48",X"90",X"48", + X"60",X"58",X"50",X"50",X"70",X"50",X"60",X"48",X"40",X"48",X"80",X"48",X"50",X"40",X"70",X"40", + X"40",X"38",X"80",X"38",X"30",X"30",X"90",X"30",X"20",X"28",X"A0",X"28",X"10",X"20",X"B0",X"20", + X"60",X"20",X"50",X"28",X"70",X"28",X"40",X"30",X"80",X"30",X"30",X"38",X"90",X"38",X"20",X"40", + X"A0",X"40",X"60",X"20",X"50",X"28",X"70",X"28",X"40",X"30",X"80",X"30",X"30",X"38",X"90",X"38", + X"10",X"14",X"18",X"1C",X"00",X"04",X"08",X"0C",X"20",X"22",X"24",X"26",X"28",X"2A",X"2C",X"2E", + X"30",X"32",X"34",X"36",X"38",X"3A",X"3C",X"3E",X"40",X"42",X"44",X"46",X"5C",X"5C",X"5E",X"5E", + X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"48",X"48",X"50",X"50",X"4A",X"4A",X"52",X"52",X"4C",X"4C",X"54",X"54",X"4E",X"4E",X"56",X"56", + X"48",X"48",X"56",X"56",X"4E",X"4E",X"54",X"54",X"4C",X"4C",X"52",X"52",X"4A",X"4A",X"50",X"50", + X"68",X"68",X"6C",X"6C",X"70",X"70",X"74",X"74",X"78",X"78",X"7C",X"7C",X"80",X"80",X"84",X"84", + X"68",X"68",X"84",X"84",X"80",X"80",X"7C",X"7C",X"78",X"78",X"74",X"74",X"70",X"70",X"6C",X"6C", + X"58",X"58",X"5A",X"5A",X"5C",X"5C",X"5E",X"5E",X"60",X"60",X"62",X"62",X"64",X"64",X"66",X"66", + X"78",X"FF",X"A0",X"FF",X"FF",X"A8",X"FF",X"AC",X"C0",X"FF",X"C8",X"FF",X"FF",X"C4",X"FF",X"CC", + X"D0",X"FF",X"D8",X"FF",X"FF",X"D4",X"FF",X"DC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"01",X"02",X"08",X"01",X"02",X"08",X"01",X"02",X"0C",X"01",X"02",X"10",X"03", + X"04",X"14",X"03",X"04",X"18",X"04",X"01",X"88",X"04",X"01",X"90",X"04",X"01",X"80",X"04",X"01", + X"80",X"03",X"04",X"70",X"03",X"04",X"74",X"03",X"04",X"78",X"03",X"04",X"7C",X"FF",X"FF",X"FF", + X"01",X"02",X"30",X"01",X"02",X"34",X"01",X"02",X"38",X"01",X"02",X"3C",X"01",X"02",X"40",X"01", + X"02",X"44",X"01",X"02",X"48",X"01",X"02",X"4C",X"04",X"04",X"50",X"04",X"04",X"54",X"04",X"04", + X"58",X"04",X"04",X"5C",X"04",X"04",X"60",X"04",X"04",X"64",X"04",X"04",X"68",X"04",X"04",X"6C", + X"FF",X"FF",X"01",X"00",X"FF",X"00",X"04",X"00",X"FC",X"00",X"00",X"FC",X"00",X"04",X"04",X"FE", + X"FC",X"FE",X"04",X"02",X"FC",X"02",X"00",X"04",X"00",X"04",X"00",X"04",X"00",X"04",X"FF",X"FF", + X"FC",X"00",X"FC",X"00",X"FC",X"00",X"FC",X"00",X"04",X"00",X"04",X"00",X"04",X"00",X"04",X"00", + X"04",X"FC",X"04",X"04",X"FC",X"04",X"FC",X"FC",X"FC",X"FC",X"FC",X"04",X"04",X"04",X"04",X"FC", + X"08",X"00",X"00",X"FF",X"01",X"00",X"F8",X"FF",X"08",X"01",X"02",X"FF",X"04",X"00",X"FA",X"FF", + X"08",X"01",X"04",X"FF",X"08",X"00",X"FC",X"FF",X"08",X"05",X"06",X"FF",X"08",X"00",X"FE",X"FF", + X"10",X"10",X"88",X"88",X"10",X"10",X"10",X"10",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EC",X"FC",X"FD",X"F4",X"ED",X"30",X"40",X"F5",X"EE",X"31",X"41",X"F6",X"EF",X"FF",X"FE",X"F7", + X"E8",X"F8",X"F9",X"F0",X"E9",X"30",X"40",X"F1",X"EA",X"31",X"41",X"F2",X"EB",X"FB",X"FA",X"F3", + X"E8",X"F8",X"F9",X"F0",X"E9",X"E4",X"E6",X"F1",X"EA",X"E5",X"E7",X"F2",X"EB",X"FB",X"FA",X"F3", + X"00",X"00",X"00",X"00",X"00",X"E4",X"E6",X"00",X"00",X"E5",X"E7",X"00",X"00",X"00",X"00",X"00", + X"F0",X"CA",X"C4",X"BE",X"B8",X"BE",X"B8",X"BE",X"C8",X"D8",X"C9",X"D9",X"CA",X"DA",X"CB",X"DB", + X"CC",X"DC",X"CD",X"DD",X"C0",X"C1",X"C1",X"C2",X"00",X"C0",X"00",X"00",X"00",X"C3",X"00",X"00", + X"C4",X"D4",X"C5",X"D5",X"C3",X"C3",X"C3",X"C3",X"C6",X"D6",X"C7",X"D7",X"FF",X"FF",X"FF",X"FF", + X"3A",X"00",X"78",X"E6",X"10",X"3A",X"8F",X"43",X"C8",X"0F",X"E6",X"0F",X"C9",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"43",X"20",X"FF",X"FF",X"FF",X"FF",X"00",X"13",X"03",X"0F",X"12",X"05",X"21",X"00",X"00",X"08", + X"09",X"2B",X"13",X"03",X"0F",X"12",X"05",X"00",X"00",X"13",X"03",X"0F",X"12",X"05",X"22",X"00", + X"43",X"21",X"FF",X"FF",X"FF",X"FF",X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"00",X"00", + X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"00",X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"00", + X"43",X"22",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"7F",X"20",X"00",X"00",X"00",X"00",X"00", + X"03",X"0F",X"09",X"0E",X"20",X"20",X"00",X"00",X"00",X"00",X"00",X"7F",X"20",X"00",X"00",X"00", + X"43",X"25",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"0E",X"13", + X"05",X"12",X"14",X"00",X"00",X"03",X"0F",X"09",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"43",X"27",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"1F",X"00",X"21",X"10",X"0C",X"01",X"19", + X"05",X"12",X"00",X"00",X"00",X"21",X"03",X"0F",X"09",X"0E",X"00",X"00",X"1F",X"00",X"00",X"00", + X"43",X"29",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"1F",X"00",X"22",X"10",X"0C",X"01",X"19", + X"05",X"12",X"13",X"00",X"00",X"22",X"03",X"0F",X"09",X"0E",X"13",X"00",X"1F",X"00",X"00",X"00", + X"43",X"2E",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"13",X"03",X"0F",X"12",X"05",X"00",X"01", + X"16",X"05",X"12",X"01",X"07",X"05",X"00",X"14",X"01",X"02",X"0C",X"05",X"00",X"00",X"00",X"00", + X"43",X"30",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"20", + X"00",X"24",X"20",X"00",X"28",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"43",X"33",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"20", + X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"43",X"36",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"25",X"20", + X"00",X"21",X"20",X"20",X"00",X"2F",X"1B",X"21",X"20",X"20",X"2B",X"28",X"20",X"20",X"1C",X"00", + X"43",X"39",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"20", + X"20",X"20",X"2B",X"29",X"20",X"20",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"43",X"3C",X"00",X"00",X"32",X"21",X"10",X"08",X"0F",X"05",X"0E",X"09",X"18",X"7E",X"00",X"03", + X"0F",X"10",X"19",X"12",X"09",X"07",X"08",X"14",X"00",X"21",X"29",X"28",X"20",X"00",X"00",X"00", + X"43",X"3D",X"02",X"05",X"21",X"28",X"00",X"01",X"0D",X"13",X"14",X"01",X"12",X"00",X"05",X"0C", + X"05",X"03",X"14",X"12",X"0F",X"0E",X"09",X"03",X"13",X"00",X"03",X"0F",X"12",X"10",X"2A",X"00", + X"43",X"3E",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"10",X"08",X"0F",X"05",X"0E",X"09",X"18",X"00", + X"01",X"1A",X"2A",X"00",X"15",X"2A",X"13",X"2A",X"01",X"2A",X"00",X"00",X"00",X"00",X"00",X"00", + X"43",X"28",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"15",X"13",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"43",X"2C",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"0F",X"0E",X"0C",X"19",X"00",X"21", + X"10",X"0C",X"01",X"19",X"05",X"12",X"00",X"02",X"15",X"14",X"14",X"0F",X"0E",X"00",X"00",X"00", + X"43",X"28",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"01", + X"0D",X"05",X"00",X"00",X"0F",X"16",X"05",X"12",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"43",X"28",X"00",X"FF",X"FF",X"FF",X"64",X"65",X"64",X"65",X"64",X"65",X"60",X"61",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"78",X"79", + X"43",X"29",X"FF",X"FF",X"FF",X"FF",X"64",X"65",X"00",X"00",X"00",X"00",X"64",X"65",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7C",X"7D", + X"43",X"2A",X"FF",X"FF",X"FF",X"FF",X"64",X"65",X"64",X"65",X"64",X"65",X"60",X"61",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"43",X"2B",X"FF",X"FF",X"FF",X"FF",X"64",X"65",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"43",X"2C",X"FF",X"FF",X"FF",X"FF",X"64",X"65",X"00",X"68",X"00",X"68",X"00",X"68",X"68",X"68", + X"00",X"68",X"64",X"65",X"00",X"62",X"63",X"00",X"68",X"00",X"68",X"00",X"68",X"00",X"00",X"68", + X"43",X"2D",X"FF",X"FF",X"FF",X"FF",X"64",X"65",X"00",X"68",X"00",X"68",X"00",X"68",X"00",X"68", + X"00",X"68",X"00",X"00",X"00",X"68",X"9D",X"00",X"68",X"00",X"68",X"00",X"76",X"77",X"70",X"71", + X"43",X"2E",X"FF",X"FF",X"FF",X"FF",X"64",X"65",X"00",X"68",X"68",X"68",X"00",X"68",X"00",X"68", + X"00",X"68",X"62",X"63",X"00",X"68",X"76",X"77",X"68",X"00",X"68",X"00",X"00",X"64",X"65",X"00", + X"43",X"2F",X"00",X"00",X"00",X"00",X"64",X"65",X"00",X"68",X"00",X"68",X"00",X"68",X"00",X"68", + X"00",X"68",X"00",X"00",X"00",X"68",X"00",X"9D",X"68",X"00",X"68",X"00",X"74",X"75",X"72",X"73", + X"43",X"30",X"FF",X"FF",X"FF",X"FF",X"64",X"65",X"00",X"68",X"00",X"68",X"00",X"68",X"68",X"68", + X"00",X"68",X"64",X"65",X"00",X"68",X"00",X"66",X"67",X"00",X"68",X"00",X"68",X"00",X"00",X"68", + X"6C",X"6D",X"6E",X"6F",X"FF",X"FF",X"FF",X"FF",X"6C",X"6D",X"6E",X"6F",X"64",X"65",X"66",X"67", + X"63",X"FF",X"63",X"61",X"67",X"FF",X"67",X"65",X"6B",X"FF",X"6B",X"69",X"6F",X"FF",X"6F",X"6D", + X"80",X"83",X"83",X"85",X"81",X"8C",X"8C",X"86",X"81",X"8C",X"8C",X"86",X"82",X"84",X"84",X"87", + X"00",X"89",X"89",X"00",X"88",X"8D",X"8D",X"8B",X"88",X"8D",X"8D",X"8B",X"00",X"8A",X"8A",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"85",X"00",X"00",X"82",X"87",X"00",X"00",X"00",X"00",X"00", + X"1B",X"80",X"1B",X"70",X"1B",X"60",X"1B",X"70",X"17",X"F0",X"17",X"F0",X"17",X"F0",X"17",X"F0", + X"43",X"2C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"00",X"0F",X"12",X"00",X"22",X"10", + X"0C",X"01",X"19",X"05",X"12",X"13",X"00",X"02",X"15",X"14",X"14",X"0F",X"0E",X"00",X"00",X"00", + X"41",X"54",X"76",X"7E",X"42",X"55",X"77",X"7F",X"41",X"56",X"74",X"7C",X"42",X"57",X"75",X"7D", + X"44",X"51",X"72",X"7A",X"45",X"52",X"73",X"7B",X"46",X"51",X"70",X"78",X"47",X"52",X"71",X"79", + X"41",X"51",X"70",X"78",X"42",X"52",X"71",X"79",X"41",X"51",X"72",X"7A",X"42",X"52",X"73",X"7B", + X"41",X"51",X"74",X"7C",X"42",X"52",X"75",X"7D",X"41",X"51",X"76",X"7E",X"42",X"52",X"77",X"7F", + X"00",X"01",X"00",X"06",X"00",X"02",X"03",X"04",X"00",X"01",X"00",X"08",X"00",X"02",X"03",X"04", + X"00",X"00",X"07",X"00",X"01",X"02",X"00",X"09",X"00",X"03",X"04",X"00",X"00",X"03",X"04",X"00", + X"00",X"01",X"00",X"02",X"00",X"03",X"0A",X"00",X"04",X"00",X"00",X"01",X"02",X"00",X"06",X"00", + X"03",X"04",X"00",X"00",X"01",X"00",X"02",X"00",X"03",X"00",X"04",X"00",X"03",X"05",X"00",X"00", + X"00",X"00",X"07",X"00",X"01",X"00",X"02",X"00",X"00",X"05",X"00",X"00",X"03",X"00",X"04",X"01", + X"02",X"00",X"03",X"00",X"08",X"04",X"00",X"01",X"02",X"06",X"00",X"03",X"00",X"04",X"00",X"02", + X"01",X"02",X"03",X"00",X"05",X"00",X"00",X"04",X"00",X"01",X"02",X"00",X"00",X"03",X"04",X"0B", + X"00",X"01",X"00",X"02",X"00",X"03",X"00",X"00",X"04",X"00",X"00",X"09",X"00",X"00",X"02",X"00", + X"07",X"00",X"00",X"01",X"00",X"00",X"02",X"00",X"00",X"03",X"00",X"08",X"04",X"00",X"01",X"00", + X"00",X"06",X"00",X"01",X"00",X"02",X"00",X"01",X"03",X"04",X"01",X"03",X"01",X"02",X"03",X"04", + X"00",X"05",X"00",X"01",X"02",X"00",X"09",X"00",X"03",X"04",X"00",X"01",X"00",X"01",X"02",X"03", + X"04",X"00",X"02",X"00",X"00",X"01",X"02",X"00",X"03",X"04",X"00",X"06",X"00",X"00",X"01",X"00", + X"00",X"01",X"02",X"00",X"05",X"00",X"00",X"03",X"00",X"04",X"00",X"07",X"00",X"01",X"00",X"02", + X"00",X"00",X"03",X"00",X"04",X"00",X"04",X"00",X"0A",X"00",X"01",X"00",X"02",X"00",X"03",X"00", + X"01",X"00",X"07",X"00",X"02",X"00",X"03",X"04",X"00",X"05",X"00",X"01",X"00",X"02",X"00",X"00", + X"08",X"03",X"04",X"00",X"01",X"00",X"02",X"00",X"03",X"00",X"04",X"00",X"00",X"06",X"00",X"03", + X"0C",X"0D",X"0C",X"0F",X"07",X"07",X"01",X"00",X"00",X"4C",X"4D",X"4E",X"4F",X"4F",X"4E",X"4D", + X"4C",X"00",X"00",X"1F",X"0E",X"06",X"0D",X"01",X"0E",X"05",X"08",X"0C",X"0E",X"0C",X"0A",X"00", + X"00",X"4D",X"4F",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"4F",X"4D",X"00",X"00",X"06", + X"0B",X"0D",X"08",X"0E",X"03",X"02",X"00",X"01",X"00",X"4C",X"4F",X"5E",X"5E",X"5E",X"5E",X"5E", + X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"4F",X"4C",X"00",X"09",X"07",X"0A",X"03",X"04",X"00", + X"0A",X"00",X"4D",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E",X"5E", + X"5E",X"5E",X"5E",X"4D",X"00",X"00",X"0E",X"0F",X"08",X"08",X"00",X"5C",X"60",X"6A",X"60",X"6A", + X"60",X"6A",X"60",X"6A",X"60",X"6A",X"60",X"6A",X"60",X"6A",X"60",X"6A",X"60",X"6A",X"5D",X"00", + X"01",X"02",X"02",X"06",X"01",X"00",X"00",X"00",X"58",X"59",X"5A",X"5B",X"5B",X"5B",X"7E",X"7F", + X"5B",X"5B",X"5B",X"4A",X"49",X"48",X"00",X"00",X"00",X"03",X"0E",X"0B",X"0D",X"05",X"04",X"05", + X"0A",X"08",X"00",X"00",X"58",X"59",X"5A",X"4B",X"76",X"77",X"4B",X"4A",X"49",X"48",X"00",X"00", + X"01",X"03",X"0F",X"02",X"03",X"00",X"00",X"03",X"03",X"07",X"02",X"0A",X"03",X"07",X"00",X"00", + X"58",X"50",X"51",X"52",X"53",X"48",X"00",X"00",X"0B",X"01",X"02",X"03",X"0F",X"0E",X"0C",X"02", + X"05",X"0C",X"06",X"00",X"04",X"06",X"07",X"0E",X"0F",X"09",X"00",X"40",X"41",X"42",X"43",X"00", + X"07",X"03",X"0A",X"08",X"0D",X"00",X"09",X"0B",X"0C",X"0A",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3A",X"1D",X"43",X"D6",X"01",X"C8",X"32",X"8F",X"43",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"30",X"21",X"31",X"22",X"32",X"23",X"33",X"24",X"34",X"25",X"35",X"26",X"36",X"27",X"37", + X"28",X"38",X"29",X"39",X"2A",X"3A",X"2B",X"3B",X"2C",X"3C",X"2D",X"3D",X"2E",X"3E",X"2F",X"3F", + X"49",X"48",X"4A",X"4B",X"4A",X"49",X"4A",X"49",X"48",X"4A",X"48",X"49",X"4B",X"48",X"4A",X"48", + X"4A",X"49",X"4B",X"49",X"4B",X"4A",X"49",X"48",X"49",X"49",X"4A",X"4A",X"48",X"49",X"4A",X"48", + X"A0",X"60",X"40",X"00",X"E0",X"C0",X"C0",X"60",X"80",X"20",X"60",X"40",X"20",X"40",X"00",X"80", + X"40",X"00",X"20",X"E0",X"00",X"60",X"00",X"A0",X"E0",X"20",X"80",X"00",X"C0",X"80",X"A0",X"E0", + X"00",X"04",X"08",X"0C",X"10",X"14",X"18",X"1C",X"00",X"08",X"10",X"18",X"04",X"0C",X"14",X"1C", + X"00",X"0C",X"18",X"04",X"04",X"1C",X"08",X"14",X"00",X"10",X"04",X"14",X"08",X"18",X"0C",X"1C", + X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17",X"18",X"19",X"1A",X"1B",X"1C",X"1D",X"1E",X"1F", + X"10",X"12",X"14",X"16",X"18",X"1A",X"1C",X"1E",X"11",X"13",X"15",X"17",X"19",X"1B",X"1D",X"1F", + X"4A",X"4B",X"49",X"4A",X"48",X"4A",X"48",X"49",X"49",X"4A",X"49",X"4B",X"48",X"4B",X"4A",X"4A", + X"48",X"49",X"48",X"4A",X"48",X"48",X"49",X"4A",X"49",X"49",X"4A",X"48",X"4A",X"49",X"4B",X"48", + X"00",X"20",X"60",X"40",X"E0",X"80",X"20",X"60",X"40",X"A0",X"00",X"00",X"40",X"20",X"C0",X"20", + X"A0",X"80",X"E0",X"40",X"60",X"C0",X"20",X"A0",X"E0",X"40",X"60",X"C0",X"20",X"40",X"20",X"80", + X"11",X"3D",X"43",X"01",X"1A",X"00",X"1A",X"80",X"47",X"CD",X"17",X"02",X"0D",X"C2",X"E6",X"1E", + X"1A",X"80",X"C6",X"27",X"21",X"89",X"43",X"86",X"77",X"00",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00", + X"00",X"04",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"05",X"00",X"02",X"00",X"03",X"00", + X"00",X"00",X"04",X"00",X"07",X"00",X"00",X"00",X"06",X"00",X"01",X"00",X"02",X"0C",X"00",X"03", + X"04",X"00",X"00",X"01",X"00",X"08",X"00",X"00",X"02",X"00",X"0C",X"03",X"04",X"0E",X"00",X"00", + X"00",X"01",X"02",X"00",X"0D",X"03",X"04",X"0F",X"01",X"0C",X"07",X"0A",X"02",X"0D",X"03",X"08", + X"06",X"0C",X"04",X"09",X"05",X"0F",X"01",X"02",X"0D",X"03",X"0C",X"04",X"0D",X"05",X"0F",X"0C", + X"01",X"02",X"0E",X"0C",X"03",X"0F",X"0D",X"05",X"0E",X"0D",X"0C",X"0F",X"0D",X"04",X"0C",X"01", + X"0E",X"05",X"0F",X"0D",X"07",X"0C",X"06",X"0E",X"0D",X"0F",X"09",X"0C",X"0F",X"0D",X"0E",X"0D", + X"02",X"0D",X"0C",X"0F",X"05",X"0E",X"0D",X"0C",X"0F",X"06",X"0E",X"0F",X"0C",X"0D",X"0F",X"0C", + X"06",X"0D",X"04",X"0B",X"0C",X"0F",X"05",X"0D",X"05",X"03",X"0E",X"07",X"0C",X"0D",X"04",X"05", + X"01",X"02",X"0E",X"03",X"0C",X"04",X"0F",X"05",X"08",X"0C",X"07",X"01",X"0D",X"04",X"0E",X"02", + X"0C",X"01",X"0F",X"03",X"05",X"0D",X"00",X"0E",X"00",X"09",X"0C",X"06",X"0D",X"00",X"01",X"02", + X"01",X"02",X"03",X"00",X"00",X"0D",X"00",X"0A",X"00",X"00",X"00",X"0E",X"00",X"05",X"00",X"08", + X"00",X"0C",X"00",X"00",X"03",X"00",X"00",X"07",X"00",X"00",X"00",X"04",X"00",X"00",X"06",X"00", + X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"03",X"00",X"00", + X"00",X"04",X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"02",X"00", + X"CD",X"76",X"08",X"CD",X"F0",X"0D",X"CD",X"A0",X"24",X"21",X"5F",X"43",X"7E",X"E6",X"03",X"47", + X"34",X"3A",X"BA",X"43",X"A7",X"CA",X"BA",X"21",X"FE",X"05",X"D2",X"30",X"21",X"2D",X"78",X"A7", + X"C2",X"25",X"20",X"36",X"FF",X"7E",X"A7",X"CA",X"30",X"21",X"C3",X"46",X"21",X"FF",X"FF",X"FF", + X"E6",X"03",X"FE",X"01",X"11",X"50",X"1B",X"C3",X"AC",X"23",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"AF",X"43",X"3A",X"B9",X"43",X"4F",X"BE",X"C0",X"7E",X"2C",X"96",X"2D",X"77",X"2C",X"2C", + X"34",X"7E",X"21",X"80",X"1E",X"E6",X"1F",X"85",X"6F",X"46",X"C6",X"20",X"6F",X"56",X"C6",X"20", + X"6F",X"5E",X"79",X"0F",X"0F",X"0F",X"E6",X"1F",X"83",X"3C",X"5F",X"78",X"12",X"C9",X"C9",X"FF", + X"7B",X"D6",X"0A",X"C6",X"C0",X"4F",X"7A",X"CE",X"00",X"47",X"7E",X"11",X"00",X"28",X"21",X"00", + X"29",X"C3",X"85",X"20",X"FF",X"D6",X"20",X"07",X"07",X"00",X"E6",X"E0",X"6F",X"3E",X"E0",X"95", + X"6F",X"3E",X"3F",X"91",X"3E",X"43",X"98",X"D2",X"B0",X"20",X"23",X"23",X"7B",X"C6",X"10",X"5F", + X"79",X"D6",X"20",X"4F",X"78",X"DE",X"00",X"47",X"C3",X"91",X"20",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C5",X"7E",X"E3",X"06",X"08",X"36",X"00",X"0F",X"D2",X"BF",X"20",X"EB",X"4E",X"EB",X"71",X"23", + X"13",X"05",X"C2",X"B5",X"20",X"E3",X"23",X"7D",X"0F",X"DA",X"B1",X"20",X"7D",X"E6",X"1F",X"CA", + X"E1",X"20",X"E3",X"7D",X"D6",X"30",X"6F",X"7C",X"DE",X"00",X"67",X"E3",X"FE",X"3F",X"C2",X"B1", + X"20",X"C1",X"C9",X"20",X"FF",X"FF",X"FF",X"FF",X"47",X"7A",X"C6",X"08",X"57",X"CD",X"1C",X"21", + X"0F",X"0F",X"0F",X"83",X"E6",X"1F",X"4F",X"7B",X"E6",X"E0",X"B1",X"5F",X"78",X"0F",X"0F",X"E6", + X"0E",X"C6",X"90",X"6F",X"26",X"1B",X"7E",X"2C",X"6E",X"67",X"01",X"04",X"04",X"C3",X"D6",X"0A", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"21",X"B9",X"43",X"7E", + X"FE",X"10",X"D8",X"FE",X"30",X"D0",X"3E",X"10",X"77",X"32",X"00",X"58",X"C9",X"FF",X"FF",X"FF", + X"78",X"A7",X"CA",X"50",X"21",X"FE",X"01",X"CA",X"60",X"21",X"FE",X"02",X"CA",X"70",X"21",X"C3", + X"80",X"21",X"90",X"A5",X"50",X"60",X"78",X"0F",X"D2",X"90",X"21",X"C3",X"A5",X"21",X"F0",X"F9", + X"CD",X"50",X"0A",X"CD",X"00",X"30",X"C3",X"00",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CD",X"C4",X"24",X"CD",X"40",X"0C",X"CD",X"1C",X"0D",X"C3",X"C0",X"0F",X"FF",X"FF",X"FF",X"FF", + X"CD",X"70",X"0D",X"C3",X"60",X"25",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CD",X"C4",X"24",X"CD",X"40",X"0C",X"CD",X"6C",X"0A",X"C3",X"C0",X"0F",X"FF",X"FF",X"FF",X"FF", + X"CD",X"50",X"0A",X"CD",X"00",X"30",X"CD",X"00",X"0F",X"CD",X"60",X"25",X"C3",X"40",X"0C",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"CD",X"1C",X"0D",X"CD",X"70",X"0D",X"CD",X"6C",X"0A",X"CD",X"C0", + X"0F",X"C3",X"C4",X"24",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"78",X"0F",X"D2",X"04",X"22",X"CD", + X"40",X"0C",X"CD",X"C0",X"0F",X"CD",X"C4",X"24",X"3A",X"B8",X"43",X"E6",X"0F",X"FE",X"0B",X"DA", + X"04",X"22",X"3E",X"10",X"32",X"BA",X"43",X"C3",X"26",X"05",X"FF",X"FF",X"7E",X"00",X"47",X"21", + X"73",X"4B",X"E6",X"07",X"77",X"2D",X"36",X"EF",X"2D",X"36",X"49",X"2D",X"78",X"E6",X"F8",X"0F", + X"0F",X"0F",X"C6",X"3A",X"5F",X"16",X"23",X"1A",X"77",X"CD",X"C0",X"34",X"C3",X"E0",X"1E",X"FF", + X"FF",X"FF",X"FF",X"FF",X"21",X"B6",X"43",X"35",X"7E",X"FE",X"A0",X"D0",X"2E",X"A4",X"36",X"02", + X"2E",X"A6",X"36",X"00",X"2E",X"B8",X"34",X"7E",X"E6",X"0E",X"0F",X"C6",X"60",X"5F",X"16",X"17", + X"2C",X"2C",X"1A",X"A7",X"F2",X"2A",X"22",X"2C",X"E6",X"7F",X"77",X"C3",X"80",X"03",X"FF",X"FF", + X"21",X"9C",X"43",X"7E",X"34",X"00",X"0F",X"E6",X"3F",X"FE",X"0D",X"CA",X"92",X"22",X"06",X"1F", + X"DA",X"60",X"22",X"06",X"00",X"D6",X"0E",X"FE",X"0D",X"C2",X"60",X"22",X"21",X"B8",X"43",X"34", + X"2E",X"A4",X"36",X"02",X"C9",X"58",X"2E",X"A4",X"36",X"02",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF", + X"4F",X"0F",X"0F",X"0F",X"57",X"E6",X"1F",X"5F",X"7A",X"E6",X"E0",X"C6",X"B0",X"6F",X"7B",X"CE", + X"41",X"67",X"7D",X"91",X"6F",X"79",X"3C",X"4F",X"07",X"5F",X"51",X"70",X"23",X"70",X"23",X"15", + X"C2",X"7B",X"22",X"7D",X"91",X"91",X"D6",X"20",X"6F",X"7C",X"DE",X"00",X"67",X"1D",X"C2",X"7A", + X"22",X"C9",X"21",X"B8",X"43",X"7E",X"E6",X"08",X"CA",X"F0",X"22",X"21",X"00",X"1C",X"11",X"3F", + X"4B",X"06",X"47",X"7E",X"12",X"2C",X"1B",X"7E",X"12",X"2C",X"1B",X"78",X"BA",X"C2",X"A3",X"22", + X"C3",X"E0",X"22",X"FF",X"CD",X"7A",X"06",X"21",X"B4",X"43",X"35",X"7E",X"FE",X"28",X"C2",X"48", + X"08",X"2E",X"67",X"36",X"FF",X"C9",X"FF",X"FF",X"FF",X"FF",X"21",X"B4",X"43",X"7E",X"FE",X"C0", + X"C2",X"34",X"08",X"36",X"30",X"2E",X"67",X"36",X"FF",X"2E",X"BC",X"36",X"3F",X"C9",X"FF",X"FF", + X"3E",X"71",X"32",X"B9",X"43",X"32",X"00",X"58",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CD",X"A0",X"03",X"AF",X"C3",X"E2",X"22",X"FF",X"FF",X"FF",X"21",X"AA",X"4A",X"06",X"12",X"3A", + X"8A",X"48",X"4F",X"79",X"E6",X"03",X"07",X"07",X"57",X"4E",X"79",X"E6",X"0C",X"0F",X"0F",X"B2", + X"F6",X"60",X"77",X"7D",X"D6",X"20",X"6F",X"D2",X"1B",X"23",X"25",X"05",X"C2",X"03",X"23",X"C9", + X"FF",X"FF",X"21",X"A7",X"43",X"34",X"7E",X"E6",X"07",X"07",X"07",X"07",X"C6",X"C0",X"6F",X"26", + X"1B",X"11",X"A6",X"49",X"01",X"02",X"04",X"C3",X"D6",X"0A",X"01",X"02",X"03",X"04",X"05",X"06", + X"07",X"0A",X"07",X"0A",X"07",X"0A",X"07",X"0A",X"07",X"0A",X"09",X"08",X"04",X"03",X"02",X"01", + X"FF",X"1A",X"E6",X"08",X"C8",X"7E",X"2C",X"6E",X"C6",X"08",X"67",X"3A",X"B9",X"43",X"0F",X"0F", + X"0F",X"85",X"E6",X"1F",X"47",X"7D",X"E6",X"E0",X"B0",X"6F",X"7E",X"47",X"E6",X"FC",X"FE",X"4C", + X"CA",X"7B",X"23",X"E6",X"F0",X"FE",X"60",X"CA",X"98",X"23",X"C9",X"1A",X"E6",X"F7",X"12",X"3E", + X"FF",X"32",X"66",X"43",X"78",X"3D",X"77",X"FE",X"4B",X"C0",X"36",X"00",X"2D",X"7E",X"FE",X"5E", + X"C0",X"36",X"4F",X"C9",X"FF",X"FF",X"FF",X"FF",X"1A",X"E6",X"F7",X"12",X"1C",X"1C",X"1A",X"E6", + X"04",X"78",X"C2",X"30",X"20",X"E6",X"0C",X"FE",X"04",X"11",X"40",X"1B",X"CA",X"C0",X"23",X"78", + X"E6",X"0F",X"83",X"5F",X"1A",X"77",X"3E",X"FF",X"32",X"66",X"43",X"C9",X"FF",X"FF",X"FF",X"FF", + X"2D",X"7E",X"E6",X"F0",X"FE",X"70",X"C0",X"21",X"A4",X"43",X"36",X"06",X"2C",X"36",X"60",X"2E", + X"63",X"36",X"FF",X"C9",X"FF",X"FF",X"21",X"B8",X"43",X"7E",X"E6",X"0F",X"FE",X"01",X"CA",X"98", + X"3A",X"FE",X"03",X"CA",X"98",X"3A",X"FE",X"05",X"CA",X"D0",X"3A",X"FE",X"07",X"CA",X"D0",X"3A", + X"FE",X"09",X"D8",X"FE",X"0B",X"DA",X"02",X"3B",X"CD",X"02",X"3B",X"C3",X"98",X"3A",X"FF",X"FF", + X"CD",X"2C",X"24",X"CA",X"52",X"25",X"FE",X"20",X"DA",X"6A",X"24",X"CA",X"20",X"25",X"47",X"0F", + X"00",X"78",X"D2",X"E8",X"20",X"7B",X"D6",X"05",X"C6",X"C0",X"4F",X"7A",X"CE",X"00",X"47",X"7E", + X"11",X"00",X"2A",X"21",X"00",X"2B",X"C3",X"85",X"20",X"FF",X"FF",X"FF",X"21",X"B9",X"43",X"7E", + X"E6",X"F8",X"77",X"32",X"00",X"58",X"11",X"C6",X"41",X"0F",X"0F",X"0F",X"47",X"7B",X"90",X"E6", + X"1F",X"47",X"7B",X"E6",X"E0",X"B0",X"5F",X"2E",X"A5",X"35",X"7E",X"C9",X"21",X"A5",X"43",X"35", + X"7E",X"0F",X"DA",X"F0",X"06",X"A7",X"C0",X"2D",X"36",X"02",X"2E",X"B8",X"7E",X"E6",X"F0",X"C6", + X"10",X"77",X"2E",X"BA",X"36",X"10",X"C3",X"80",X"03",X"FF",X"01",X"14",X"09",X"11",X"C6",X"4A", + X"21",X"00",X"1C",X"C3",X"D6",X"0A",X"78",X"81",X"CD",X"95",X"24",X"2E",X"D3",X"77",X"21",X"BB", + X"43",X"3E",X"08",X"96",X"07",X"2E",X"9A",X"86",X"07",X"47",X"2E",X"6F",X"7E",X"E6",X"1E",X"80", + X"32",X"D1",X"4B",X"C9",X"1F",X"80",X"0D",X"C8",X"80",X"0D",X"C8",X"80",X"0D",X"C8",X"87",X"C9", + X"3A",X"B8",X"43",X"E6",X"0F",X"FE",X"08",X"D8",X"11",X"C4",X"43",X"21",X"E6",X"43",X"CD",X"51", + X"23",X"3A",X"9B",X"43",X"E6",X"03",X"FE",X"03",X"C0",X"C3",X"F2",X"24",X"CD",X"51",X"23",X"C9", + X"FF",X"FF",X"FF",X"FF",X"3A",X"B8",X"43",X"E6",X"0F",X"FE",X"08",X"DA",X"F0",X"06",X"CD",X"E0", + X"24",X"21",X"AA",X"43",X"34",X"7E",X"E6",X"03",X"CA",X"FA",X"22",X"C3",X"22",X"23",X"24",X"BF", + X"3A",X"AA",X"43",X"E6",X"0F",X"C0",X"3A",X"B9",X"43",X"FE",X"A0",X"D8",X"C3",X"7A",X"06",X"FA", + X"22",X"C3",X"CD",X"AA",X"30",X"C6",X"60",X"00",X"47",X"21",X"9B",X"43",X"E6",X"0E",X"A6",X"C0", + X"3A",X"9E",X"43",X"B8",X"D0",X"3A",X"9F",X"43",X"B8",X"D8",X"78",X"D6",X"04",X"47",X"3A",X"B9", + X"43",X"2F",X"3C",X"E6",X"F8",X"C6",X"48",X"4F",X"E5",X"E5",X"C3",X"B7",X"25",X"FF",X"FF",X"FF", + X"D5",X"CD",X"80",X"03",X"D1",X"3A",X"B9",X"43",X"C6",X"60",X"0F",X"47",X"3A",X"B8",X"43",X"E6", + X"F0",X"80",X"06",X"90",X"DA",X"3D",X"25",X"FE",X"90",X"D2",X"3D",X"25",X"47",X"AF",X"78",X"27", + X"21",X"9D",X"43",X"77",X"2C",X"36",X"00",X"7B",X"D6",X"5E",X"5F",X"06",X"04",X"C3",X"C4",X"00", + X"32",X"80",X"2E",X"A4",X"36",X"07",X"2C",X"36",X"40",X"2E",X"6B",X"36",X"FF",X"C9",X"FF",X"FF", + X"21",X"93",X"43",X"7E",X"E6",X"01",X"07",X"07",X"07",X"07",X"07",X"C6",X"70",X"6F",X"26",X"4B", + X"1E",X"08",X"3A",X"57",X"43",X"07",X"07",X"07",X"00",X"C6",X"AD",X"57",X"3A",X"9F",X"43",X"C6", + X"03",X"4F",X"3A",X"9E",X"43",X"D6",X"0A",X"47",X"E5",X"CD",X"96",X"25",X"E1",X"7D",X"C6",X"04", + X"6F",X"1D",X"C2",X"88",X"25",X"C9",X"7E",X"E6",X"08",X"C8",X"2C",X"7E",X"FE",X"08",X"C8",X"FE", + X"88",X"D0",X"2C",X"7E",X"B8",X"D8",X"B9",X"D0",X"2C",X"7E",X"BA",X"D0",X"FE",X"80",X"D8",X"00", + X"00",X"00",X"00",X"00",X"4F",X"2D",X"46",X"3A",X"B8",X"43",X"16",X"03",X"FE",X"10",X"DA",X"CA", + X"25",X"16",X"04",X"FE",X"20",X"DA",X"CA",X"25",X"16",X"05",X"21",X"CC",X"43",X"7E",X"E6",X"08", + X"CA",X"E0",X"25",X"7D",X"C6",X"04",X"6F",X"15",X"C2",X"CD",X"25",X"E1",X"E1",X"C9",X"FF",X"FF", + X"78",X"C6",X"04",X"47",X"79",X"C6",X"0C",X"4F",X"36",X"08",X"2C",X"78",X"0F",X"E6",X"03",X"57", + X"79",X"E6",X"04",X"82",X"C6",X"58",X"77",X"2C",X"70",X"2C",X"71",X"E1",X"E1",X"C9",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"3A",X"B9",X"43",X"2F",X"0F",X"0F",X"0F",X"E6",X"1F",X"21",X"D2", + X"4B",X"77",X"2C",X"3A",X"D1",X"4B",X"BE",X"DA",X"50",X"26",X"3A",X"D5",X"4B",X"57",X"E6",X"03", + X"5F",X"3A",X"9B",X"43",X"07",X"07",X"E6",X"0C",X"83",X"C6",X"D0",X"6F",X"26",X"3E",X"7A",X"0F", + X"0F",X"E6",X"07",X"86",X"57",X"3A",X"B9",X"43",X"92",X"32",X"B9",X"43",X"32",X"00",X"58",X"3A", + X"9B",X"43",X"0F",X"D2",X"D0",X"26",X"CD",X"68",X"26",X"C3",X"AA",X"26",X"C2",X"3A",X"26",X"3A", + X"2C",X"3A",X"9B",X"43",X"07",X"07",X"E6",X"0C",X"86",X"C6",X"D0",X"6F",X"26",X"3E",X"3A",X"B9", + X"43",X"86",X"C3",X"39",X"26",X"D2",X"AE",X"26",X"3A",X"6E",X"43",X"00",X"47",X"3A",X"9A",X"43", + X"FE",X"18",X"DA",X"76",X"26",X"04",X"FE",X"10",X"DA",X"7C",X"26",X"04",X"3A",X"BA",X"43",X"FE", + X"03",X"D2",X"85",X"26",X"04",X"3A",X"D6",X"4B",X"C6",X"E0",X"6F",X"26",X"3E",X"78",X"BE",X"DA", + X"93",X"26",X"7E",X"57",X"3A",X"BB",X"43",X"FE",X"04",X"D2",X"9D",X"26",X"14",X"FE",X"02",X"D2", + X"A3",X"26",X"14",X"7A",X"32",X"D5",X"4B",X"C9",X"00",X"58",X"21",X"D3",X"4B",X"7E",X"35",X"A7", + X"C0",X"34",X"2E",X"D6",X"7E",X"FE",X"16",X"D0",X"FE",X"08",X"D8",X"2C",X"96",X"07",X"47",X"3A", + X"6F",X"43",X"E6",X"03",X"2E",X"D4",X"77",X"2F",X"E6",X"03",X"3C",X"4F",X"C3",X"76",X"24",X"C9", + X"21",X"A8",X"4B",X"01",X"00",X"08",X"11",X"00",X"80",X"7E",X"A7",X"CA",X"E5",X"26",X"7A",X"07", + X"D2",X"E4",X"26",X"51",X"59",X"0C",X"7D",X"90",X"6F",X"FE",X"68",X"C2",X"D9",X"26",X"3A",X"D2", + X"4B",X"82",X"83",X"E6",X"1F",X"32",X"D6",X"4B",X"7B",X"92",X"32",X"D7",X"4B",X"C9",X"FF",X"FF", + X"21",X"A2",X"43",X"7E",X"A7",X"C8",X"2C",X"7E",X"E6",X"01",X"07",X"07",X"C6",X"83",X"6F",X"3E", + X"FF",X"32",X"97",X"43",X"11",X"70",X"43",X"CD",X"48",X"27",X"1C",X"1C",X"1C",X"7B",X"FE",X"80", + X"C2",X"17",X"27",X"1E",X"9D",X"3A",X"A4",X"43",X"FE",X"06",X"C2",X"39",X"27",X"1A",X"47",X"0E", + X"00",X"CD",X"20",X"02",X"AF",X"12",X"32",X"97",X"43",X"3A",X"97",X"43",X"A7",X"CC",X"68",X"27", + X"CD",X"A8",X"27",X"C3",X"10",X"3A",X"FF",X"FF",X"1A",X"1C",X"FE",X"01",X"C0",X"1A",X"A7",X"C8", + X"0F",X"0F",X"0F",X"0F",X"47",X"E6",X"F0",X"4F",X"78",X"E6",X"0F",X"47",X"CD",X"20",X"02",X"AF", + X"12",X"32",X"97",X"43",X"C9",X"FF",X"FF",X"FF",X"E5",X"11",X"61",X"42",X"06",X"06",X"3A",X"A3", + X"43",X"A7",X"CA",X"78",X"27",X"11",X"21",X"40",X"CD",X"C4",X"00",X"E1",X"11",X"BD",X"43",X"EB", + X"7E",X"2C",X"B6",X"C8",X"2C",X"EB",X"CD",X"14",X"03",X"D0",X"3A",X"A3",X"43",X"C6",X"90",X"6F", + X"34",X"CD",X"67",X"03",X"3E",X"FF",X"32",X"6A",X"43",X"2E",X"BE",X"7E",X"36",X"00",X"0F",X"0F", + X"0F",X"0F",X"2D",X"77",X"C9",X"FF",X"FF",X"FF",X"21",X"8C",X"43",X"7E",X"32",X"00",X"60",X"2C", + X"7E",X"32",X"00",X"68",X"F6",X"0F",X"77",X"2D",X"36",X"0F",X"C9",X"FF",X"FF",X"21",X"63",X"43", + X"7E",X"A7",X"C2",X"E2",X"27",X"2E",X"61",X"7E",X"A7",X"C8",X"FE",X"19",X"D2",X"D8",X"27",X"35", + X"2E",X"8C",X"7E",X"F6",X"40",X"77",X"C9",X"77",X"36",X"18",X"2E",X"8C",X"7E",X"E6",X"BF",X"77", + X"C9",X"36",X"FE",X"40",X"DA",X"E9",X"27",X"36",X"40",X"35",X"2E",X"8C",X"36",X"8F",X"C9",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"32",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"42",X"42", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E1",X"00",X"00",X"E2",X"00",X"00", + X"32",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"00",X"00",X"40",X"00",X"00",X"C3", + X"00",X"00",X"00",X"00",X"00",X"00",X"DF",X"00",X"00",X"E2",X"00",X"00",X"E0",X"00",X"E1",X"00", + X"00",X"30",X"00",X"00",X"00",X"00",X"DE",X"00",X"00",X"00",X"C2",X"00",X"40",X"00",X"E0",X"00", + X"00",X"00",X"00",X"30",X"00",X"30",X"00",X"5A",X"00",X"00",X"E1",X"00",X"40",X"00",X"E2",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"C1",X"3E",X"00",X"E0",X"00",X"40",X"C2",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"5A",X"C1",X"3E",X"C8",X"D8",X"00",X"00", + X"E0",X"E1",X"C2",X"E2",X"E0",X"00",X"E1",X"00",X"C2",X"00",X"E2",X"CE",X"CA",X"DA",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CF",X"CF",X"C3",X"3F",X"C2",X"41",X"E0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DE",X"00",X"3F",X"00",X"C2",X"41",X"00",X"E1",X"00", + X"00",X"00",X"00",X"00",X"00",X"3D",X"DF",X"3D",X"00",X"00",X"E1",X"00",X"41",X"00",X"00",X"C2", + X"00",X"00",X"00",X"3D",X"00",X"00",X"00",X"00",X"00",X"E0",X"00",X"00",X"41",X"00",X"00",X"E2", + X"00",X"00",X"3D",X"00",X"00",X"00",X"00",X"00",X"E2",X"00",X"00",X"00",X"00",X"4F",X"00",X"E0", + X"00",X"3B",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C2",X"00",X"00",X"00",X"4F",X"00",X"00", + X"00",X"00",X"3B",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"4D",X"4D", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"38", + X"00",X"34",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"02",X"00",X"00", + X"00",X"01",X"00",X"00",X"12",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"80",X"48",X"00",X"04", + X"40",X"08",X"00",X"50",X"00",X"00",X"80",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"20",X"44",X"00",X"00",X"00",X"02", + X"10",X"00",X"00",X"04",X"00",X"48",X"20",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"44",X"08",X"00",X"00",X"01",X"00",X"00", + X"08",X"00",X"00",X"02",X"00",X"00",X"00",X"84",X"08",X"00",X"00",X"20",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"42",X"02",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"04",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"82",X"04",X"00",X"00",X"20",X"00",X"00", + X"00",X"40",X"00",X"00",X"01",X"82",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"02",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"81",X"02",X"00",X"00",X"40", + X"02",X"80",X"00",X"04",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"D2",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"DE",X"00",X"5E",X"E0",X"00",X"00",X"E1",X"00",X"00",X"00",X"00", + X"00",X"00",X"C1",X"00",X"00",X"CF",X"53",X"E2",X"00",X"D2",X"E0",X"00",X"00",X"D0",X"00",X"00", + X"00",X"00",X"00",X"DE",X"00",X"CE",X"53",X"E1",X"D1",X"E3",X"00",X"E1",X"D3",X"00",X"00",X"00", + X"00",X"00",X"CF",X"C0",X"DE",X"DF",X"53",X"D3",X"E2",X"00",X"E2",X"D2",X"00",X"5E",X"E2",X"00", + X"00",X"00",X"00",X"CE",X"C1",X"C2",X"DE",X"D2",X"E1",X"E3",X"D1",X"00",X"D2",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"DF",X"DE",X"C2",X"CF",X"E0",X"D0",X"E2",X"E1",X"C2",X"C3",X"00",X"00", + X"DF",X"DE",X"CF",X"CE",X"DF",X"DE",X"CF",X"C8",X"D8",X"5E",X"CE",X"00",X"CF",X"DE",X"DF",X"CE", + X"E0",X"E3",X"E2",X"E1",X"00",X"E0",X"D1",X"CA",X"DA",X"D1",X"D2",X"D3",X"D0",X"D1",X"D2",X"D3", + X"00",X"00",X"00",X"00",X"E3",X"D2",X"CE",X"D2",X"E2",X"E0",X"D3",X"D1",X"D3",X"00",X"00",X"00", + X"00",X"00",X"00",X"E2",X"D3",X"CF",X"DF",X"E1",X"D0",X"E3",X"E1",X"D2",X"00",X"00",X"00",X"00", + X"00",X"00",X"E1",X"D0",X"DE",X"00",X"DE",X"E2",X"00",X"D3",X"53",X"E2",X"5E",X"C1",X"C0",X"00", + X"00",X"00",X"00",X"DF",X"00",X"00",X"CF",X"5E",X"D1",X"D2",X"00",X"53",X"E3",X"00",X"00",X"00", + X"00",X"00",X"CE",X"00",X"CF",X"00",X"CE",X"D2",X"D2",X"00",X"53",X"00",X"5E",X"E0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"DE",X"00",X"E1",X"D3",X"00",X"E2",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"5E",X"D0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"01",X"40",X"02",X"80",X"05", + X"A0",X"01",X"40",X"02",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"01",X"20",X"04",X"00",X"01",X"40",X"12", + X"48",X"02",X"80",X"01",X"20",X"04",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"02",X"10",X"08",X"00",X"01",X"80",X"04",X"A0",X"21", + X"84",X"05",X"20",X"02",X"80",X"01",X"10",X"08",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"00",X"00",X"04",X"08",X"10",X"00",X"01",X"40",X"00",X"40",X"0A",X"10",X"40", + X"02",X"08",X"40",X"00",X"10",X"04",X"80",X"02",X"08",X"10",X"00",X"00",X"00",X"01",X"00",X"00", + X"80",X"00",X"00",X"08",X"04",X"20",X"00",X"02",X"20",X"00",X"20",X"14",X"00",X"01",X"08",X"80", + X"01",X"10",X"80",X"02",X"20",X"00",X"08",X"04",X"80",X"02",X"04",X"20",X"00",X"00",X"00",X"01", + X"01",X"01",X"01",X"01",X"01",X"04",X"20",X"00",X"10",X"28",X"80",X"02",X"04",X"00",X"00",X"04", + X"20",X"20",X"00",X"04",X"40",X"01",X"10",X"00",X"04",X"08",X"80",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"20",X"00",X"88",X"10",X"00",X"44",X"00",X"00",X"00",X"10",X"02",X"00", + X"08",X"40",X"00",X"00",X"00",X"08",X"40",X"00",X"08",X"01",X"00",X"10",X"80",X"04",X"00",X"00", + X"00",X"00",X"20",X"00",X"84",X"20",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"20",X"01",X"00", + X"04",X"80",X"00",X"00",X"00",X"00",X"00",X"10",X"40",X"00",X"04",X"01",X"00",X"00",X"80",X"00", + X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"06",X"06",X"1E", + X"03",X"03",X"1F",X"05",X"05",X"1C",X"04",X"04",X"04",X"1D",X"06",X"06",X"1A",X"04",X"04",X"04", + X"1B",X"05",X"05",X"05",X"05",X"18",X"1F",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"00",X"FF",X"FF",X"FF",X"05",X"05",X"1C",X"04",X"1D",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"06", + X"06",X"1E",X"03",X"03",X"1F",X"05",X"1C",X"04",X"04",X"1D",X"0A",X"06",X"06",X"1E",X"03",X"03", + X"1F",X"05",X"1C",X"04",X"04",X"1D",X"0A",X"06",X"06",X"1E",X"03",X"03",X"1F",X"05",X"1C",X"04", + X"04",X"1D",X"0A",X"06",X"1E",X"03",X"1F",X"05",X"1C",X"04",X"1D",X"06",X"1E",X"03",X"03",X"03", + X"03",X"15",X"16",X"17",X"01",X"01",X"05",X"05",X"01",X"01",X"05",X"05",X"01",X"01",X"05",X"05", + X"01",X"01",X"05",X"05",X"02",X"02",X"18",X"07",X"07",X"07",X"00",X"FF",X"FF",X"FF",X"FF",X"FF", + X"1C",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"1D", + X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"1E",X"03",X"03",X"03",X"03",X"03",X"03",X"1F",X"05", + X"05",X"05",X"05",X"1C",X"04",X"04",X"1D",X"06",X"09",X"09",X"09",X"1E",X"03",X"07",X"07",X"08", + X"08",X"07",X"07",X"08",X"07",X"00",X"FF",X"FF",X"05",X"05",X"05",X"05",X"1C",X"04",X"04",X"04", + X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"1D",X"09",X"09",X"09",X"09", + X"0A",X"0A",X"0A",X"09",X"0A",X"0A",X"06",X"1E",X"03",X"03",X"03",X"1F",X"05",X"05",X"18",X"03", + X"19",X"06",X"06",X"1E",X"03",X"03",X"1F",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"00",X"FF", + X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"06",X"1E",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"1F",X"05",X"05",X"1C",X"04",X"04",X"04",X"04",X"04",X"04", + X"04",X"04",X"04",X"04",X"1D",X"06",X"06",X"1E",X"03",X"03",X"03",X"03",X"03",X"03",X"1F",X"05", + X"05",X"05",X"05",X"05",X"1C",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"1B", + X"00",X"FF",X"FF",X"FF",X"05",X"05",X"05",X"18",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"19",X"06",X"06",X"1A",X"04",X"04",X"1B",X"05",X"05",X"18",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"19",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"1A",X"04",X"04", + X"1B",X"05",X"05",X"1C",X"04",X"04",X"1D",X"06",X"06",X"1A",X"04",X"04",X"1B",X"05",X"05",X"05", + X"05",X"05",X"05",X"05",X"00",X"FF",X"FF",X"FF",X"1C",X"04",X"04",X"1D",X"06",X"06",X"09",X"0A", + X"0A",X"09",X"09",X"09",X"16",X"17",X"14",X"03",X"03",X"03",X"1F",X"05",X"05",X"1C",X"04",X"04", + X"1D",X"06",X"06",X"1E",X"03",X"03",X"03",X"03",X"07",X"07",X"08",X"08",X"07",X"07",X"05",X"05", + X"1C",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"1D",X"1A",X"04",X"1B",X"00",X"FF",X"FF",X"FF", + X"14",X"03",X"03",X"19",X"06",X"0A",X"0A",X"09",X"09",X"09",X"0A",X"12",X"13",X"10",X"11",X"12", + X"13",X"10",X"11",X"12",X"13",X"10",X"04",X"04",X"04",X"04",X"1B",X"05",X"18",X"03",X"19",X"06", + X"1A",X"04",X"1B",X"05",X"18",X"07",X"07",X"07",X"08",X"08",X"07",X"07",X"07",X"03",X"03",X"19", + X"0D",X"0E",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0B",X"0C",X"0D",X"0E",X"02",X"02",X"02",X"02",X"0B",X"0C",X"0D",X"0E",X"01",X"01",X"14",X"15", + X"16",X"17",X"01",X"01",X"05",X"05",X"05",X"05",X"02",X"02",X"02",X"02",X"00",X"FF",X"FF",X"FF", + X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"0D",X"0E",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02", + X"05",X"05",X"01",X"05",X"05",X"01",X"05",X"05",X"01",X"05",X"05",X"01",X"00",X"FF",X"FF",X"FF", + X"0B",X"0C",X"0D",X"0E",X"01",X"01",X"01",X"18",X"03",X"19",X"06",X"06",X"1A",X"04",X"1B",X"05", + X"18",X"03",X"19",X"06",X"06",X"1A",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"1B", + X"05",X"05",X"05",X"01",X"01",X"01",X"01",X"01",X"00",X"FF",X"FF",X"FF",X"0B",X"0C",X"0D",X"0E", + X"01",X"01",X"0B",X"0C",X"0D",X"0E",X"01",X"01",X"05",X"05",X"05",X"05",X"01",X"01",X"0B",X"0C", + X"0D",X"0E",X"01",X"01",X"07",X"08",X"08",X"07",X"08",X"08",X"08",X"07",X"00",X"FF",X"FF",X"FF", + X"14",X"15",X"16",X"17",X"14",X"15",X"16",X"17",X"14",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"19",X"09",X"0A",X"0A",X"09",X"09",X"0A",X"0A",X"12",X"13",X"08", + X"08",X"07",X"07",X"08",X"08",X"08",X"08",X"04",X"04",X"04",X"11",X"12",X"13",X"10",X"11",X"12", + X"13",X"00",X"FF",X"FF",X"10",X"11",X"12",X"13",X"10",X"11",X"12",X"13",X"10",X"04",X"04",X"04", + X"04",X"04",X"04",X"04",X"04",X"04",X"0A",X"0A",X"0A",X"09",X"0A",X"09",X"0A",X"09",X"16",X"17", + X"14",X"03",X"03",X"03",X"07",X"07",X"07",X"07",X"03",X"19",X"06",X"1A",X"04",X"1B",X"05",X"18", + X"07",X"07",X"07",X"07",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"05",X"1C",X"04",X"1D",X"06",X"06",X"06",X"06",X"06",X"09",X"09",X"09",X"0A",X"0A",X"0A",X"09", + X"09",X"16",X"17",X"14",X"1F",X"05",X"18",X"03",X"19",X"06",X"1E",X"03",X"1F",X"05",X"18",X"03", + X"19",X"06",X"1E",X"03",X"1F",X"05",X"05",X"1C",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08", + X"00",X"FF",X"FF",X"FF",X"05",X"18",X"03",X"19",X"06",X"06",X"06",X"06",X"0A",X"0A",X"09",X"09", + X"0A",X"0A",X"09",X"0A",X"0A",X"12",X"13",X"10",X"1B",X"05",X"1C",X"04",X"1D",X"1E",X"1F",X"1C", + X"04",X"1D",X"06",X"1A",X"04",X"04",X"1B",X"05",X"18",X"07",X"07",X"07",X"07",X"08",X"07",X"07", + X"07",X"07",X"00",X"FF",X"0B",X"0C",X"0D",X"0E",X"0B",X"0C",X"1E",X"03",X"19",X"06",X"1E",X"03", + X"19",X"06",X"1E",X"03",X"19",X"06",X"1E",X"1F",X"1C",X"1D",X"1E",X"03",X"03",X"03",X"1F",X"05", + X"18",X"03",X"19",X"06",X"1E",X"03",X"1F",X"05",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"07", + X"07",X"08",X"08",X"08",X"08",X"08",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"05",X"05",X"18",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"19",X"06",X"06",X"06",X"06", + X"06",X"06",X"06",X"1A",X"04",X"1B",X"05",X"18",X"03",X"03",X"03",X"03",X"19",X"06",X"06",X"06", + X"1A",X"04",X"1B",X"05",X"18",X"03",X"03",X"03",X"03",X"19",X"06",X"06",X"06",X"1A",X"04",X"1B", + X"05",X"18",X"03",X"03",X"03",X"03",X"19",X"06",X"06",X"06",X"1A",X"04",X"1B",X"05",X"18",X"03", + X"03",X"19",X"06",X"06",X"1A",X"11",X"12",X"13",X"02",X"02",X"02",X"05",X"05",X"02",X"02",X"02", + X"05",X"05",X"02",X"02",X"02",X"05",X"1C",X"08",X"08",X"07",X"07",X"08",X"08",X"08",X"00",X"FF", + X"21",X"93",X"43",X"7E",X"34",X"E6",X"07",X"21",X"18",X"30",X"07",X"85",X"6F",X"7E",X"23",X"6E", + X"67",X"E9",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"32",X"64",X"30",X"28",X"30",X"BA",X"31",X"24", + X"31",X"5A",X"31",X"B4",X"32",X"2C",X"30",X"12",X"21",X"57",X"43",X"7E",X"FE",X"03",X"D0",X"2E", + X"50",X"7E",X"FE",X"04",X"D0",X"2E",X"58",X"7E",X"A7",X"CA",X"5C",X"30",X"35",X"C0",X"2D",X"34", + X"2E",X"50",X"36",X"04",X"2E",X"53",X"36",X"10",X"2C",X"36",X"50",X"2E",X"51",X"36",X"2E",X"2C", + X"36",X"00",X"3A",X"C2",X"43",X"0F",X"D8",X"36",X"40",X"C9",X"FF",X"FF",X"CD",X"74",X"30",X"21", + X"57",X"43",X"7E",X"07",X"07",X"00",X"00",X"81",X"C6",X"07",X"2E",X"58",X"77",X"C9",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"21",X"B8",X"43",X"7E",X"0F",X"00",X"E6",X"07",X"47",X"3E",X"07",X"90", + X"4F",X"7E",X"FE",X"80",X"DA",X"89",X"30",X"3E",X"70",X"0F",X"0F",X"0F",X"0F",X"E6",X"07",X"47", + X"3E",X"07",X"90",X"81",X"4F",X"3A",X"BA",X"43",X"D6",X"05",X"D2",X"9F",X"30",X"3E",X"10",X"81", + X"4F",X"CD",X"AA",X"30",X"E6",X"07",X"81",X"4F",X"C9",X"FF",X"21",X"9B",X"43",X"7E",X"07",X"07", + X"07",X"E6",X"07",X"2E",X"C2",X"86",X"E6",X"0F",X"C9",X"C0",X"21",X"58",X"43",X"CD",X"DA",X"30", + X"CD",X"DA",X"30",X"CD",X"DA",X"30",X"2E",X"50",X"7E",X"A7",X"C0",X"2E",X"55",X"7E",X"A7",X"CA", + X"E4",X"30",X"35",X"C0",X"2E",X"50",X"36",X"01",X"C9",X"FE",X"2C",X"7E",X"A7",X"C8",X"35",X"C9", + X"7E",X"FE",X"01",X"D0",X"CD",X"74",X"30",X"21",X"9A",X"43",X"7E",X"FE",X"10",X"DA",X"F2",X"30", + X"3E",X"0F",X"47",X"3E",X"0F",X"90",X"81",X"4F",X"06",X"01",X"2E",X"58",X"CD",X"12",X"31",X"CD", + X"12",X"31",X"CD",X"12",X"31",X"79",X"0F",X"0F",X"E6",X"3F",X"C6",X"01",X"2E",X"55",X"77",X"C9", + X"21",X"50",X"2C",X"7E",X"A7",X"C0",X"79",X"0F",X"E6",X"7F",X"4F",X"78",X"A7",X"C8",X"05",X"36", + X"0C",X"C9",X"86",X"47",X"21",X"50",X"43",X"7E",X"FE",X"01",X"C0",X"36",X"02",X"2E",X"B8",X"7E", + X"0F",X"0F",X"E6",X"0F",X"C6",X"05",X"FE",X"11",X"DA",X"3D",X"31",X"3E",X"05",X"2E",X"57",X"96", + X"47",X"CD",X"AA",X"30",X"3C",X"B8",X"DA",X"4B",X"31",X"3E",X"01",X"2E",X"53",X"77",X"C9",X"0A", + X"0C",X"0B",X"0C",X"0B",X"0E",X"0F",X"0E",X"0F",X"FF",X"FF",X"21",X"50",X"43",X"7E",X"FE",X"02", + X"C0",X"CD",X"AA",X"30",X"00",X"47",X"07",X"C6",X"50",X"6F",X"26",X"4B",X"78",X"07",X"07",X"C6", + X"70",X"5F",X"16",X"4B",X"0E",X"10",X"79",X"90",X"47",X"CD",X"92",X"31",X"13",X"13",X"13",X"13", + X"23",X"23",X"05",X"C2",X"8A",X"31",X"1E",X"70",X"2E",X"50",X"0D",X"C2",X"79",X"31",X"C9",X"FF", + X"FF",X"FF",X"1A",X"E6",X"08",X"C8",X"3A",X"94",X"43",X"BE",X"C0",X"3A",X"56",X"43",X"2C",X"46", + X"2D",X"B8",X"C0",X"7D",X"32",X"54",X"43",X"3E",X"03",X"32",X"50",X"43",X"E1",X"C9",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"3A",X"50",X"43",X"FE",X"03",X"C0",X"3A",X"54",X"43",X"D6",X"50",X"07", + X"C6",X"72",X"6F",X"26",X"4B",X"46",X"2C",X"56",X"3A",X"C2",X"43",X"0E",X"04",X"B8",X"D2",X"D6", + X"31",X"4F",X"78",X"41",X"0E",X"00",X"90",X"07",X"07",X"07",X"E6",X"07",X"C6",X"00",X"6F",X"26", + X"33",X"7E",X"81",X"07",X"07",X"4F",X"00",X"00",X"00",X"3A",X"57",X"43",X"47",X"CD",X"10",X"32", + X"79",X"80",X"C6",X"10",X"6F",X"26",X"33",X"4E",X"CD",X"AA",X"30",X"E6",X"06",X"81",X"6F",X"26", + X"33",X"7E",X"2C",X"46",X"21",X"50",X"43",X"36",X"05",X"2C",X"77",X"2C",X"70",X"C9",X"81",X"6F", + X"3A",X"53",X"43",X"FE",X"01",X"C0",X"7A",X"06",X"00",X"FE",X"58",X"D8",X"06",X"01",X"FE",X"78", + X"D8",X"06",X"02",X"FE",X"98",X"D8",X"06",X"03",X"C9",X"C0",X"21",X"50",X"3A",X"50",X"43",X"FE", + X"04",X"C0",X"21",X"50",X"4B",X"11",X"70",X"4B",X"3A",X"56",X"43",X"4F",X"3A",X"94",X"43",X"47", + X"1A",X"E6",X"08",X"CA",X"4E",X"32",X"7E",X"B8",X"C0",X"2C",X"7E",X"2D",X"B9",X"C0",X"2C",X"2C", + X"7B",X"C6",X"04",X"5F",X"FE",X"B0",X"C2",X"40",X"32",X"3E",X"06",X"32",X"50",X"43",X"C9",X"3C", + X"E6",X"0F",X"77",X"2E",X"21",X"95",X"43",X"7E",X"32",X"56",X"43",X"3C",X"E6",X"0F",X"77",X"2E", + X"50",X"7E",X"FE",X"05",X"D8",X"36",X"00",X"2E",X"53",X"4E",X"2C",X"6E",X"26",X"4B",X"3A",X"56", + X"43",X"57",X"3A",X"94",X"43",X"5F",X"7D",X"D6",X"50",X"0F",X"47",X"3E",X"10",X"90",X"47",X"7E", + X"2C",X"BB",X"C2",X"A4",X"32",X"7E",X"BA",X"C2",X"A4",X"32",X"2D",X"3A",X"51",X"43",X"77",X"2C", + X"3A",X"52",X"43",X"77",X"2C",X"05",X"C2",X"AB",X"32",X"2E",X"50",X"0D",X"C2",X"8F",X"32",X"C9", + X"21",X"50",X"43",X"06",X"30",X"CD",X"D8",X"05",X"2E",X"9A",X"06",X"04",X"CD",X"D8",X"05",X"3A", + X"BB",X"43",X"A7",X"C8",X"07",X"07",X"07",X"4F",X"21",X"70",X"4B",X"06",X"40",X"CD",X"D8",X"05", + X"16",X"4B",X"26",X"3F",X"3E",X"40",X"91",X"C6",X"70",X"5F",X"C6",X"10",X"6F",X"41",X"3A",X"B8", + X"43",X"0F",X"0F",X"D2",X"E0",X"05",X"7D",X"C6",X"40",X"6F",X"C3",X"E0",X"05",X"CD",X"E0",X"05", + X"C3",X"A0",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"01",X"02",X"02",X"03",X"03",X"03",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"88",X"90",X"98",X"A0",X"68",X"70",X"78",X"80",X"48",X"50",X"58",X"60",X"48",X"30",X"38",X"40", + X"88",X"90",X"98",X"A0",X"A8",X"B0",X"B8",X"C0",X"C8",X"D0",X"D8",X"E0",X"C8",X"E8",X"F0",X"F8", + X"11",X"30",X"2C",X"00",X"2F",X"A0",X"2C",X"00",X"2E",X"C4",X"2F",X"A0",X"2F",X"34",X"2F",X"A0", + X"2C",X"C8",X"2E",X"C4",X"2E",X"20",X"2E",X"C4",X"11",X"30",X"13",X"9C",X"13",X"D0",X"2C",X"00", + X"11",X"30",X"13",X"28",X"2C",X"00",X"2F",X"34",X"11",X"A4",X"2C",X"90",X"2F",X"34",X"2F",X"A0", + X"2C",X"90",X"2C",X"C8",X"2E",X"20",X"2E",X"C4",X"11",X"60",X"13",X"54",X"13",X"9C",X"13",X"D0", + X"10",X"20",X"10",X"64",X"11",X"A4",X"13",X"28",X"10",X"20",X"11",X"A4",X"12",X"00",X"2F",X"34", + X"2C",X"90",X"2C",X"C8",X"2D",X"C0",X"2E",X"20",X"11",X"60",X"12",X"44",X"12",X"88",X"13",X"54", + X"10",X"20",X"10",X"64",X"12",X"00",X"12",X"44",X"10",X"20",X"12",X"00",X"10",X"20",X"12",X"00", + X"10",X"A8",X"2D",X"88",X"10",X"A8",X"2D",X"C0",X"11",X"D0",X"12",X"CA",X"13",X"00",X"13",X"54", + X"10",X"20",X"10",X"64",X"10",X"D4",X"13",X"00",X"10",X"20",X"10",X"D4",X"12",X"00",X"2F",X"00", + X"2D",X"00",X"2D",X"44",X"2D",X"88",X"2E",X"6C",X"11",X"00",X"11",X"D0",X"12",X"CA",X"2F",X"64", + X"11",X"00",X"13",X"00",X"2F",X"64",X"2F",X"00",X"10",X"D4",X"2D",X"00",X"2F",X"00",X"2C",X"34", + X"2D",X"00",X"2D",X"44",X"2E",X"6C",X"2E",X"90",X"11",X"00",X"2C",X"34",X"2F",X"64",X"2F",X"64", + X"2E",X"90",X"2F",X"00",X"2C",X"34",X"2C",X"34",X"2D",X"44",X"2E",X"6C",X"2E",X"90",X"2E",X"90", + X"CD",X"76",X"08",X"CD",X"00",X"38",X"CD",X"00",X"26",X"CD",X"00",X"38",X"CD",X"80",X"39",X"3A", + X"BB",X"43",X"A7",X"CA",X"62",X"34",X"FE",X"04",X"D2",X"38",X"34",X"CD",X"74",X"34",X"CD",X"86", + X"34",X"CD",X"60",X"35",X"CD",X"98",X"34",X"CD",X"AA",X"34",X"3A",X"9B",X"43",X"0F",X"DA",X"C0", + X"0F",X"CD",X"30",X"39",X"C3",X"40",X"0C",X"FF",X"3A",X"9B",X"43",X"0F",X"DA",X"52",X"34",X"CD", + X"74",X"34",X"CD",X"60",X"35",X"CD",X"98",X"34",X"CD",X"30",X"39",X"C3",X"40",X"0C",X"FF",X"FF", + X"FF",X"FF",X"CD",X"86",X"34",X"CD",X"60",X"35",X"CD",X"AA",X"34",X"C3",X"C0",X"0F",X"FF",X"FF", + X"FF",X"FF",X"3A",X"9B",X"43",X"0F",X"D8",X"CD",X"40",X"0C",X"CD",X"C0",X"0F",X"C3",X"04",X"22", + X"FF",X"FF",X"FF",X"FF",X"21",X"70",X"4B",X"E5",X"CD",X"C0",X"34",X"E1",X"7D",X"C6",X"08",X"6F", + X"FE",X"90",X"C2",X"77",X"34",X"C9",X"21",X"90",X"4B",X"E5",X"CD",X"C0",X"34",X"E1",X"7D",X"C6", + X"08",X"6F",X"FE",X"B0",X"C2",X"89",X"34",X"C9",X"21",X"70",X"4B",X"E5",X"CD",X"B0",X"35",X"E1", + X"7D",X"C6",X"08",X"6F",X"FE",X"90",X"C2",X"9B",X"34",X"C9",X"21",X"90",X"4B",X"E5",X"CD",X"B0", + X"35",X"E1",X"7D",X"C6",X"08",X"6F",X"FE",X"B0",X"C2",X"AD",X"34",X"C9",X"FF",X"FF",X"FF",X"FF", + X"7E",X"A7",X"C8",X"47",X"C6",X"C0",X"5F",X"16",X"3E",X"1A",X"4F",X"2C",X"56",X"2C",X"5E",X"2C", + X"78",X"07",X"07",X"07",X"86",X"E6",X"7E",X"6F",X"26",X"3E",X"7E",X"2C",X"6E",X"67",X"7A",X"FE", + X"4B",X"C2",X"0C",X"35",X"7B",X"FE",X"50",X"DA",X"0C",X"35",X"06",X"08",X"2C",X"2C",X"D6",X"20", + X"5F",X"FE",X"50",X"DA",X"09",X"35",X"06",X"10",X"2C",X"2C",X"D6",X"20",X"5F",X"FE",X"50",X"DA", + X"09",X"35",X"06",X"18",X"2C",X"2C",X"D6",X"20",X"5F",X"79",X"80",X"4F",X"06",X"35",X"C5",X"01", + X"DF",X"FF",X"EB",X"36",X"00",X"23",X"36",X"00",X"09",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"09",X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"09", + X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"09",X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"09", + X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"09",X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"09", + X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"09",X"36",X"00",X"23",X"36",X"00",X"C9",X"FF",X"FF", + X"CD",X"AA",X"30",X"47",X"07",X"07",X"4F",X"07",X"07",X"B0",X"32",X"6F",X"43",X"3A",X"B8",X"43", + X"FE",X"40",X"DA",X"77",X"35",X"3E",X"30",X"E6",X"30",X"0F",X"47",X"3A",X"BB",X"43",X"3D",X"FE", + X"04",X"DA",X"86",X"35",X"3E",X"03",X"07",X"B0",X"47",X"3A",X"9A",X"43",X"07",X"07",X"E6",X"20", + X"B0",X"C6",X"80",X"6F",X"26",X"3E",X"7E",X"32",X"6E",X"43",X"2C",X"7E",X"81",X"E6",X"F8",X"32", + X"6D",X"43",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"7E",X"A7",X"C8",X"47",X"2C",X"2C",X"2C",X"2C",X"7E",X"A7",X"CA",X"BE",X"35",X"35",X"EB",X"D5", + X"78",X"07",X"07",X"07",X"6F",X"26",X"3F",X"46",X"23",X"4E",X"C5",X"23",X"46",X"23",X"4E",X"C5", + X"23",X"46",X"23",X"4E",X"C5",X"23",X"46",X"23",X"4E",X"C5",X"EB",X"C9",X"FF",X"FF",X"FF",X"FF", + X"2C",X"2C",X"7E",X"FE",X"10",X"D2",X"28",X"36",X"47",X"2D",X"86",X"77",X"2D",X"2D",X"78",X"86", + X"77",X"FE",X"08",X"DA",X"6A",X"36",X"E6",X"07",X"77",X"2D",X"7E",X"D6",X"20",X"77",X"D2",X"04", + X"36",X"2D",X"35",X"2C",X"2C",X"2C",X"2C",X"4E",X"2C",X"2C",X"7E",X"2D",X"36",X"10",X"91",X"CA", + X"72",X"36",X"3D",X"0F",X"0F",X"0F",X"E6",X"1F",X"B8",X"3C",X"77",X"D8",X"3A",X"6E",X"43",X"77", + X"B8",X"C8",X"04",X"70",X"C9",X"FF",X"FF",X"FF",X"E6",X"0F",X"CA",X"44",X"37",X"47",X"2D",X"7E", + X"90",X"77",X"2D",X"2D",X"7E",X"90",X"77",X"D2",X"95",X"36",X"E6",X"07",X"77",X"2D",X"7E",X"C6", + X"20",X"77",X"D2",X"48",X"36",X"2D",X"34",X"2C",X"2C",X"2C",X"2C",X"7E",X"2C",X"2C",X"96",X"0F", + X"0F",X"0F",X"E6",X"1F",X"B8",X"3C",X"2D",X"DA",X"63",X"36",X"3A",X"6E",X"43",X"B8",X"CA",X"63", + X"36",X"78",X"3C",X"F6",X"10",X"77",X"C9",X"77",X"C9",X"FF",X"78",X"A7",X"C0",X"2C",X"2C",X"2C", + X"34",X"C9",X"2D",X"46",X"2C",X"2C",X"3A",X"C2",X"43",X"E6",X"F8",X"B8",X"D2",X"80",X"36",X"47", + X"3A",X"6D",X"43",X"4F",X"C6",X"08",X"32",X"6D",X"43",X"78",X"91",X"36",X"08",X"D8",X"FE",X"08", + X"D8",X"77",X"C9",X"D8",X"FE",X"2C",X"2C",X"46",X"2C",X"2C",X"7E",X"B8",X"C0",X"2D",X"36",X"00", + X"2C",X"3A",X"C2",X"43",X"E6",X"F8",X"B8",X"DA",X"AB",X"36",X"47",X"3A",X"6D",X"43",X"C6",X"08", + X"32",X"6D",X"43",X"80",X"36",X"C8",X"D8",X"FE",X"C8",X"D0",X"77",X"C9",X"77",X"C9",X"FF",X"FF", + X"7E",X"0F",X"D8",X"2D",X"7E",X"3C",X"E6",X"07",X"77",X"C9",X"FF",X"FF",X"D1",X"C1",X"E1",X"C9", + X"FF",X"FF",X"D1",X"C1",X"E1",X"7E",X"A7",X"C0",X"70",X"2D",X"2D",X"2D",X"2D",X"72",X"3A",X"68", + X"43",X"F6",X"01",X"32",X"68",X"43",X"C9",X"FF",X"FF",X"FF",X"D1",X"C1",X"E1",X"7E",X"A7",X"C0", + X"2C",X"2C",X"7E",X"E6",X"0F",X"C0",X"2D",X"2D",X"70",X"2D",X"2D",X"2D",X"2D",X"72",X"3A",X"68", + X"43",X"F6",X"02",X"32",X"68",X"43",X"C9",X"FF",X"FF",X"FF",X"D1",X"C1",X"E1",X"7E",X"A7",X"C0", + X"2C",X"2C",X"7E",X"E6",X"0F",X"C0",X"2D",X"2D",X"70",X"2D",X"2D",X"2D",X"2D",X"72",X"3A",X"68", + X"43",X"F6",X"04",X"32",X"68",X"43",X"3A",X"6F",X"43",X"A3",X"E6",X"F0",X"C0",X"7B",X"E6",X"0F", + X"77",X"2C",X"2C",X"2C",X"2C",X"71",X"3A",X"68",X"43",X"F6",X"08",X"32",X"68",X"43",X"C9",X"FF", + X"FF",X"FF",X"FF",X"FF",X"36",X"11",X"2D",X"35",X"2D",X"2D",X"36",X"07",X"2D",X"7E",X"C6",X"20", + X"77",X"D0",X"2D",X"34",X"C9",X"FF",X"FF",X"FF",X"7E",X"A7",X"C8",X"35",X"CA",X"CC",X"37",X"7E", + X"0F",X"D2",X"B0",X"37",X"3E",X"0F",X"96",X"E6",X"0E",X"07",X"07",X"07",X"07",X"2C",X"2C",X"56", + X"2C",X"5E",X"F5",X"D5",X"01",X"DF",X"FF",X"CD",X"96",X"37",X"D1",X"F1",X"2F",X"6F",X"26",X"FF", + X"23",X"19",X"EB",X"21",X"A0",X"BF",X"19",X"D0",X"EB",X"11",X"D6",X"17",X"36",X"00",X"23",X"36", + X"00",X"09",X"C3",X"40",X"35",X"FF",X"C6",X"60",X"6F",X"26",X"00",X"D2",X"9F",X"37",X"24",X"19", + X"EB",X"21",X"C0",X"BC",X"19",X"D8",X"EB",X"11",X"D0",X"17",X"C3",X"40",X"35",X"FF",X"FF",X"FF", + X"2C",X"7E",X"27",X"77",X"2C",X"56",X"2C",X"5E",X"2D",X"2D",X"00",X"CD",X"17",X"02",X"3E",X"20", + X"12",X"CD",X"10",X"02",X"06",X"02",X"C3",X"C4",X"00",X"FF",X"FF",X"FF",X"2C",X"2C",X"2C",X"7E", + X"E6",X"1F",X"C6",X"20",X"6F",X"26",X"43",X"01",X"DF",X"FF",X"11",X"1A",X"00",X"72",X"23",X"72", + X"09",X"1D",X"C2",X"DD",X"37",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3A",X"C4",X"43",X"E6",X"08",X"C8",X"3A",X"E6",X"43",X"C6",X"08",X"57",X"3A",X"D2",X"4B",X"5F", + X"3A",X"E7",X"43",X"E6",X"E0",X"47",X"3A",X"E7",X"43",X"93",X"00",X"E6",X"1F",X"B0",X"5F",X"1A", + X"D6",X"90",X"D8",X"47",X"3A",X"C6",X"43",X"E6",X"07",X"C6",X"00",X"6F",X"26",X"3E",X"4E",X"7B", + X"E6",X"0E",X"07",X"07",X"5F",X"3E",X"A8",X"93",X"5F",X"16",X"4B",X"78",X"FE",X"50",X"DC",X"44", + X"38",X"C3",X"1C",X"39",X"C6",X"60",X"6F",X"26",X"3B",X"7E",X"A1",X"C8",X"CD",X"A1",X"38",X"EB", + X"7E",X"36",X"00",X"2C",X"2C",X"2C",X"2C",X"56",X"E1",X"21",X"BB",X"43",X"35",X"FE",X"0B",X"DA", + X"94",X"38",X"5F",X"3E",X"FF",X"32",X"69",X"43",X"21",X"78",X"43",X"01",X"10",X"10",X"7B",X"FE", + X"0F",X"CA",X"FB",X"38",X"7A",X"0F",X"E6",X"7C",X"C6",X"30",X"4F",X"7B",X"FE",X"0E",X"CA",X"FB", + X"38",X"79",X"0F",X"4F",X"7B",X"FE",X"0C",X"D2",X"FB",X"38",X"79",X"0F",X"4F",X"C3",X"FB",X"38", + X"FF",X"FF",X"FF",X"FF",X"01",X"05",X"0D",X"3E",X"FF",X"32",X"64",X"43",X"C3",X"F8",X"38",X"FF", + X"FF",X"D5",X"0E",X"20",X"EB",X"23",X"56",X"23",X"5E",X"3A",X"8C",X"19",X"C6",X"DE",X"6F",X"26", + X"17",X"CD",X"DE",X"34",X"D1",X"C9",X"35",X"D1",X"C9",X"FF",X"FF",X"FF",X"C6",X"B0",X"6F",X"26", + X"3B",X"7E",X"A1",X"C8",X"CD",X"A1",X"38",X"1A",X"D6",X"0B",X"DA",X"E9",X"38",X"FE",X"03",X"D2", + X"E9",X"38",X"47",X"62",X"7B",X"C6",X"05",X"6F",X"3A",X"C6",X"43",X"BE",X"17",X"07",X"07",X"E6", + X"04",X"B0",X"C6",X"B8",X"6F",X"26",X"3D",X"7E",X"12",X"3E",X"FF",X"32",X"66",X"43",X"01",X"02", + X"07",X"C3",X"F8",X"38",X"FF",X"FF",X"FF",X"FF",X"21",X"70",X"43",X"AF",X"BE",X"CA",X"06",X"39", + X"2C",X"2C",X"2C",X"2C",X"BE",X"C0",X"70",X"2C",X"71",X"2C",X"3A",X"E6",X"43",X"77",X"2C",X"3A", + X"E7",X"43",X"77",X"3A",X"C4",X"43",X"E6",X"F7",X"32",X"C4",X"43",X"C9",X"78",X"FE",X"20",X"D2", + X"BC",X"38",X"C9",X"C8",X"35",X"2E",X"8D",X"7E",X"E6",X"3F",X"F6",X"80",X"77",X"C9",X"C9",X"FF", + X"3A",X"D2",X"4B",X"E6",X"1E",X"C6",X"C0",X"6F",X"26",X"3D",X"5E",X"2C",X"6E",X"26",X"4B",X"CD", + X"00",X"3A",X"3A",X"9F",X"43",X"82",X"4F",X"3A",X"9E",X"43",X"92",X"47",X"E5",X"CD",X"5C",X"39", + X"E1",X"7D",X"C6",X"08",X"6F",X"1D",X"C2",X"4C",X"39",X"C9",X"FF",X"FF",X"7E",X"FE",X"05",X"D8", + X"7D",X"C6",X"05",X"6F",X"7E",X"B8",X"D8",X"B9",X"D0",X"D6",X"04",X"47",X"2D",X"2D",X"2D",X"3A", + X"D2",X"4B",X"86",X"E6",X"1F",X"07",X"07",X"07",X"C6",X"08",X"4F",X"C3",X"B7",X"25",X"FF",X"FF", + X"3A",X"D2",X"4B",X"D6",X"0C",X"D8",X"FE",X"10",X"D0",X"21",X"C4",X"43",X"11",X"C0",X"4B",X"06", + X"04",X"CD",X"E0",X"05",X"2E",X"E6",X"06",X"02",X"CD",X"E0",X"05",X"2E",X"E2",X"11",X"E6",X"43", + X"06",X"02",X"CD",X"E0",X"05",X"2E",X"C4",X"36",X"08",X"11",X"9E",X"43",X"3A",X"9B",X"43",X"0F", + X"DA",X"BF",X"39",X"1C",X"2E",X"E7",X"7E",X"D6",X"20",X"77",X"2D",X"7E",X"DE",X"00",X"77",X"1A", + X"32",X"C6",X"43",X"CD",X"00",X"38",X"21",X"C4",X"43",X"7E",X"E6",X"08",X"CA",X"F0",X"39",X"21", + X"E7",X"43",X"34",X"7E",X"E6",X"1F",X"FE",X"1D",X"DA",X"C3",X"39",X"21",X"C0",X"4B",X"11",X"C4", + X"43",X"06",X"04",X"CD",X"E0",X"05",X"1E",X"E6",X"06",X"02",X"C3",X"E0",X"05",X"FF",X"FF",X"FF", + X"2E",X"A6",X"7E",X"FE",X"C0",X"DA",X"C4",X"0C",X"D6",X"01",X"77",X"C3",X"DB",X"39",X"FF",X"FF", + X"3A",X"BB",X"43",X"D6",X"0C",X"2F",X"3C",X"57",X"3A",X"9B",X"43",X"0F",X"0F",X"D8",X"E1",X"C9", + X"21",X"B8",X"43",X"7E",X"A7",X"C2",X"43",X"3B",X"2E",X"8D",X"36",X"CF",X"C9",X"21",X"69",X"43", + X"7E",X"A7",X"CA",X"40",X"3A",X"FE",X"20",X"DA",X"2C",X"3A",X"36",X"20",X"35",X"7E",X"07",X"07", + X"00",X"2F",X"E6",X"0E",X"2E",X"8D",X"77",X"2E",X"68",X"36",X"00",X"2E",X"66",X"36",X"00",X"C9", + X"2E",X"64",X"7E",X"A7",X"CA",X"62",X"3A",X"FE",X"10",X"DA",X"4E",X"3A",X"36",X"10",X"35",X"7E", + X"0F",X"00",X"00",X"2F",X"E6",X"07",X"F6",X"10",X"2E",X"8C",X"77",X"2E",X"66",X"36",X"00",X"C9", + X"0F",X"00",X"2E",X"66",X"7E",X"A7",X"C8",X"FE",X"10",X"DA",X"78",X"3A",X"36",X"10",X"3A",X"B8", + X"43",X"E6",X"08",X"CA",X"78",X"3A",X"36",X"05",X"35",X"2E",X"8C",X"7E",X"E6",X"08",X"F6",X"04", + X"77",X"C9",X"21",X"9A",X"43",X"7E",X"FE",X"03",X"D8",X"2E",X"8D",X"7E",X"E6",X"3F",X"77",X"C9", + X"21",X"6B",X"43",X"7E",X"A7",X"C3",X"23",X"39",X"21",X"70",X"4B",X"01",X"00",X"08",X"11",X"B0", + X"03",X"7E",X"2C",X"A0",X"CA",X"AE",X"3A",X"7E",X"FE",X"28",X"DA",X"AE",X"3A",X"0C",X"7D",X"82", + X"6F",X"BB",X"C2",X"A1",X"3A",X"79",X"A7",X"C8",X"FE",X"08",X"DA",X"BF",X"3A",X"3E",X"08",X"C6", + X"25",X"4F",X"21",X"8C",X"43",X"7E",X"E6",X"C0",X"B1",X"77",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"8E",X"43",X"7E",X"E6",X"01",X"07",X"07",X"F6",X"20",X"47",X"2D",X"7E",X"E6",X"C0",X"B0", + X"77",X"2E",X"96",X"7E",X"34",X"A7",X"CA",X"F8",X"3A",X"3A",X"D6",X"4B",X"C6",X"E0",X"5F",X"16", + X"3D",X"1A",X"BE",X"D0",X"36",X"00",X"C9",X"5F",X"2E",X"8E",X"34",X"2D",X"7E",X"F6",X"10",X"77", + X"C9",X"8E",X"21",X"9A",X"43",X"7E",X"FE",X"02",X"D0",X"2C",X"7E",X"47",X"E6",X"60",X"2E",X"8D", + X"36",X"0A",X"C0",X"78",X"E6",X"02",X"C6",X"1C",X"77",X"C9",X"78",X"21",X"62",X"43",X"7E",X"A7", + X"C8",X"FE",X"40",X"DA",X"28",X"3B",X"36",X"40",X"35",X"7E",X"E6",X"06",X"07",X"00",X"2E",X"8D", + X"77",X"C9",X"FF",X"21",X"6A",X"43",X"7E",X"A7",X"C8",X"35",X"E6",X"08",X"F6",X"07",X"2E",X"8D", + X"77",X"C9",X"8D",X"21",X"A4",X"43",X"7E",X"FE",X"03",X"CC",X"D6",X"23",X"CD",X"33",X"3B",X"CD", + X"1B",X"3B",X"CD",X"1D",X"3A",X"CD",X"BD",X"27",X"CD",X"82",X"3A",X"C3",X"90",X"3A",X"FF",X"FF", + X"1F",X"7C",X"F0",X"01",X"C0",X"07",X"7F",X"FC",X"F0",X"07",X"C0",X"1F",X"FF",X"FC",X"03",X"F0", + X"0F",X"C0",X"3F",X"FC",X"1F",X"F0",X"07",X"FE",X"3F",X"F8",X"0F",X"FF",X"FF",X"FC",X"1F",X"FF", + X"FC",X"1F",X"FC",X"1F",X"F0",X"7F",X"F0",X"7F",X"C0",X"FF",X"01",X"C0",X"FF",X"01",X"00",X"FF", + X"07",X"00",X"FF",X"07",X"FC",X"1F",X"FC",X"1F",X"F0",X"7F",X"F0",X"7F",X"C0",X"FF",X"01",X"C0", + X"FF",X"01",X"00",X"FF",X"07",X"FF",X"07",X"FC",X"1F",X"F8",X"0F",X"F0",X"C0",X"03",X"FF",X"FF", + X"03",X"E0",X"03",X"E0",X"0F",X"80",X"0F",X"00",X"3C",X"00",X"1E",X"3F",X"00",X"FC",X"F0",X"00", + X"7F",X"FE",X"00",X"F0",X"03",X"E0",X"00",X"00",X"0F",X"80",X"00",X"00",X"3F",X"00",X"FE",X"30", + X"00",X"06",X"FF",X"00",X"F8",X"00",X"00",X"03",X"E0",X"00",X"E0",X"08",X"20",X"04",X"C0",X"01", + X"E0",X"03",X"F8",X"0F",X"07",X"E0",X"3F",X"03",X"FF",X"FF",X"FF",X"3F",X"FC",X"FF",X"F8",X"FF", + X"FF",X"07",X"E0",X"1F",X"F0",X"FF",X"FC",X"FF",X"07",X"1E",X"FC",X"1F",X"1F",X"7F",X"FF",X"FF", + X"E8",X"00",X"E9",X"00",X"C4",X"C6",X"C5",X"C7",X"EA",X"00",X"EB",X"00",X"00",X"00",X"EC",X"00", + X"E9",X"00",X"C8",X"CA",X"C9",X"CB",X"EA",X"00",X"ED",X"00",X"00",X"00",X"EE",X"00",X"EF",X"00", + X"CC",X"CF",X"CD",X"D0",X"CE",X"D1",X"F0",X"00",X"F1",X"00",X"F2",X"00",X"EF",X"00",X"D2",X"00", + X"D3",X"D5",X"D4",X"D6",X"F0",X"00",X"F3",X"00",X"E8",X"00",X"E9",X"00",X"C4",X"C6",X"C5",X"C7", + X"00",X"00",X"EC",X"00",X"E9",X"00",X"C8",X"CA",X"C9",X"CB",X"00",X"00",X"EE",X"00",X"EF",X"00", + X"CC",X"CF",X"CD",X"D0",X"DD",X"D1",X"F2",X"00",X"EF",X"00",X"D2",X"00",X"D3",X"D5",X"DD",X"D6", + X"00",X"00",X"00",X"00",X"C4",X"C6",X"C5",X"C7",X"EA",X"00",X"EB",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"DB",X"CA",X"C9",X"CB",X"EA",X"00",X"ED",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"DC",X"CF",X"CD",X"D0",X"CE",X"D1",X"F0",X"00",X"F1",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"D3",X"D5",X"D4",X"D6",X"F0",X"00",X"F3",X"00",X"00",X"00",X"00",X"00",X"C4",X"C6",X"C5",X"C7", + X"00",X"00",X"00",X"00",X"00",X"00",X"DB",X"CA",X"C9",X"CB",X"00",X"00",X"00",X"00",X"00",X"00", + X"DC",X"CF",X"CD",X"D0",X"DD",X"D1",X"00",X"00",X"00",X"00",X"00",X"00",X"D3",X"D5",X"DD",X"D6", + X"00",X"00",X"DE",X"E2",X"AB",X"B2",X"AC",X"B3",X"DF",X"E3",X"00",X"00",X"00",X"00",X"00",X"E5", + X"B4",X"B6",X"B5",X"B7",X"E4",X"E6",X"00",X"00",X"00",X"00",X"00",X"00",X"B8",X"BB",X"B9",X"BC", + X"BA",X"BD",X"00",X"00",X"00",X"00",X"00",X"00",X"BE",X"C1",X"BF",X"C2",X"C0",X"C3",X"00",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"00",X"00",X"FA",X"FC",X"D7",X"D9",X"D8",X"DA",X"FB",X"FD",X"00",X"00",X"F4",X"F6",X"F5",X"00", + X"C4",X"C6",X"C5",X"C7",X"F7",X"00",X"F8",X"F9",X"00",X"00",X"00",X"00",X"A7",X"A9",X"A8",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"AB",X"AD",X"AC",X"AE",X"00",X"00",X"00",X"00",X"DE",X"00", + X"AB",X"B0",X"AC",X"B1",X"DF",X"00",X"00",X"00",X"DE",X"E0",X"AB",X"B2",X"AC",X"B3",X"DF",X"E1", + X"00",X"00",X"9D",X"00",X"9E",X"00",X"00",X"00",X"00",X"00",X"9F",X"00",X"A0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"9C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A3",X"A5",X"A4",X"A6", + X"00",X"00",X"9C",X"00",X"00",X"00",X"00",X"00",X"9D",X"00",X"9E",X"00",X"00",X"00",X"9F",X"00", + X"A0",X"00",X"00",X"00",X"A1",X"00",X"A2",X"00",X"00",X"00",X"96",X"00",X"00",X"00",X"00",X"00", + X"97",X"00",X"93",X"00",X"00",X"00",X"98",X"00",X"99",X"00",X"00",X"00",X"9A",X"00",X"9B",X"00", + X"00",X"00",X"90",X"00",X"00",X"00",X"00",X"00",X"91",X"00",X"00",X"00",X"00",X"00",X"92",X"00", + X"93",X"00",X"00",X"00",X"94",X"00",X"95",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"08",X"00", + X"00",X"00",X"0A",X"00",X"00",X"00",X"0B",X"00",X"0C",X"0C",X"0E",X"FF",X"0D",X"0E",X"0D",X"FF", + X"06",X"70",X"07",X"70",X"08",X"70",X"08",X"70",X"08",X"70",X"07",X"78",X"06",X"80",X"05",X"88", + X"04",X"90",X"03",X"98",X"02",X"A0",X"01",X"A8",X"02",X"70",X"03",X"70",X"04",X"70",X"05",X"70", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"34",X"2C",X"26",X"20",X"1C",X"18",X"14",X"12",X"0F", + X"0D",X"0B",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"02",X"02",X"02",X"02",X"02",X"02", + X"01",X"02",X"04",X"08",X"10",X"20",X"40",X"80",X"3D",X"A8",X"3D",X"AC",X"3D",X"B0",X"3D",X"B4", + X"3D",X"90",X"3D",X"96",X"3D",X"9C",X"3D",X"A2",X"3D",X"78",X"3D",X"7E",X"3D",X"84",X"3D",X"8A", + X"3D",X"60",X"3D",X"66",X"3D",X"6C",X"3D",X"72",X"3D",X"40",X"3D",X"48",X"3D",X"50",X"3D",X"58", + X"3D",X"18",X"3D",X"22",X"3D",X"2C",X"3D",X"36",X"3C",X"C0",X"3D",X"00",X"3D",X"0C",X"3C",X"00", + X"3D",X"58",X"3D",X"50",X"3D",X"48",X"3D",X"40",X"3D",X"36",X"3D",X"2C",X"3D",X"22",X"3D",X"18", + X"3C",X"00",X"3D",X"0C",X"3D",X"00",X"3C",X"C0",X"3C",X"00",X"3C",X"0E",X"3C",X"1C",X"3C",X"2A", + X"3C",X"38",X"3C",X"42",X"3C",X"4C",X"3C",X"56",X"3C",X"60",X"3C",X"6E",X"3C",X"7C",X"3C",X"8A", + X"3C",X"98",X"3C",X"A2",X"3C",X"AC",X"3C",X"B6",X"3C",X"C0",X"3C",X"CC",X"3C",X"D8",X"3C",X"E4", + X"05",X"40",X"05",X"20",X"04",X"30",X"04",X"10",X"06",X"48",X"06",X"28",X"05",X"38",X"05",X"18", + X"07",X"50",X"07",X"30",X"06",X"40",X"06",X"20",X"08",X"58",X"08",X"38",X"07",X"48",X"07",X"28", + X"06",X"10",X"05",X"20",X"05",X"30",X"05",X"40",X"08",X"18",X"07",X"28",X"07",X"38",X"06",X"48", + X"08",X"20",X"07",X"30",X"07",X"40",X"07",X"50",X"08",X"30",X"08",X"40",X"08",X"50",X"08",X"60", + X"FF",X"48",X"40",X"40",X"40",X"38",X"30",X"28",X"38",X"30",X"28",X"20",X"30",X"20",X"30",X"28", + X"01",X"01",X"01",X"01",X"00",X"00",X"01",X"01",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"01", + X"05",X"04",X"03",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"02",X"02", + X"02",X"02",X"03",X"03",X"03",X"04",X"04",X"04",X"05",X"05",X"06",X"06",X"07",X"08",X"07",X"06", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"20",X"FF",X"02",X"FF",X"36",X"D2",X"36",X"C0", + X"20",X"FF",X"03",X"FF",X"36",X"D2",X"35",X"E0",X"30",X"FF",X"04",X"FF",X"36",X"D2",X"35",X"E0", + X"10",X"FF",X"05",X"FF",X"36",X"EA",X"35",X"E0",X"10",X"FF",X"06",X"FF",X"36",X"EA",X"36",X"C0", + X"10",X"60",X"07",X"1F",X"37",X"0A",X"36",X"C0",X"F0",X"10",X"0B",X"1A",X"37",X"0A",X"36",X"C0", + X"40",X"FF",X"04",X"FF",X"36",X"EA",X"36",X"C0",X"10",X"FF",X"08",X"FF",X"36",X"EA",X"36",X"C0", + X"40",X"10",X"0F",X"17",X"37",X"0A",X"36",X"C0",X"10",X"FF",X"0A",X"FF",X"36",X"EA",X"35",X"E0", + X"FF",X"FF",X"FF",X"FF",X"36",X"CC",X"35",X"E0",X"FF",X"FF",X"FF",X"FF",X"36",X"CC",X"35",X"E0", + X"10",X"FF",X"06",X"FF",X"36",X"EA",X"35",X"E0",X"10",X"10",X"07",X"79",X"37",X"0A",X"35",X"E0", + X"01",X"48",X"EE",X"00",X"10",X"B0",X"10",X"20",X"01",X"49",X"2C",X"00",X"10",X"A0",X"00",X"B0", + X"01",X"49",X"6A",X"00",X"10",X"90",X"00",X"B8",X"01",X"49",X"A8",X"00",X"10",X"80",X"00",X"C0", + X"01",X"49",X"E6",X"00",X"10",X"70",X"00",X"C8",X"01",X"4A",X"24",X"00",X"10",X"60",X"00",X"C8", + X"01",X"4A",X"62",X"00",X"10",X"50",X"00",X"C8",X"01",X"4A",X"A0",X"00",X"10",X"40",X"00",X"C8", + X"01",X"4A",X"CE",X"00",X"10",X"38",X"00",X"B0",X"01",X"48",X"CC",X"00",X"10",X"B8",X"10",X"20", + X"01",X"4A",X"CA",X"00",X"10",X"38",X"00",X"B8",X"01",X"48",X"C8",X"00",X"10",X"B8",X"10",X"18", + X"01",X"4A",X"C6",X"00",X"10",X"38",X"00",X"C0",X"01",X"48",X"C4",X"00",X"10",X"B8",X"10",X"10", + X"01",X"4A",X"C2",X"00",X"10",X"38",X"00",X"C8",X"01",X"48",X"C0",X"00",X"10",X"B8",X"10",X"08"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_video.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_video.vhd new file mode 100644 index 00000000..9f7ac60d --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/phoenix_video.vhd @@ -0,0 +1,160 @@ +--------------------------------------------------------------------------------- +-- Phoenix video generator by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.ALL; +use ieee.numeric_std.all; + +entity phoenix_video is +port( + clk11 : in std_logic; + reset : in std_logic; + ce_pix : out std_logic; + hcnt : out std_logic_vector(9 downto 1); + vcnt : out std_logic_vector(8 downto 1); + sync_hs : out std_logic; + sync_vs : out std_logic; + adrsel : out std_logic; + rdy : out std_logic; + vblank : out std_logic; + hblank_frgrd : out std_logic; + hblank_bkgrd : out std_logic +); +end phoenix_video; + +architecture struct of phoenix_video is + signal hclk_i : std_logic := '0'; + signal hstb_i : std_logic := '0'; + signal hcnt_i : unsigned(9 downto 1) := (others=>'0'); + signal vcnt_i : unsigned(9 downto 1) := (others=>'0'); + signal vcnt2 : std_logic_vector(8 downto 1) := (others=>'0'); + signal vblank_n : std_logic := '0'; + + signal rdy1_i : std_logic; + signal rdy2_i : std_logic; + signal j1 : std_logic; + signal k1 : std_logic; + signal q1 : std_logic; + signal j2 : std_logic; + signal k2 : std_logic; + signal q2 : std_logic; + +begin + +-- horizontal counter clock (pixel clock) +process(clk11) begin + if falling_edge(clk11) then + hclk_i <= not hclk_i; + end if; +end process; + +-- horizontal counter from 0x0A0 to 0x1FF : 352 pixels +process(clk11) begin + if rising_edge(clk11) then + if hclk_i = '1' then + if reset = '1' then + hcnt_i <= (others=>'0'); + vcnt_i <= (others=>'0'); + else + hcnt_i <= hcnt_i +1; + if hcnt_i = 511 then + hcnt_i <= to_unsigned(160,9); + vcnt_i <= vcnt_i +1; + if vcnt_i = 261 then + vcnt_i <= to_unsigned(0,9); + end if; + end if; + end if; + end if; + end if; +end process; + +-- vertical counter clock (line clock) = hblank +process(clk11) begin + if rising_edge(clk11) then + if hclk_i = '1' then + if (hcnt_i(3) and hcnt_i(2) and hcnt_i(1)) = '1' then hstb_i <= not hcnt_i(9); end if; + end if; + end if; +end process; + +-- vertical blanking +vblank_n <= + not(vcnt2(8) and vcnt2(7)) + or + ( not + ( not (vcnt2(8) and vcnt2(7) and not vcnt2(6) and not vcnt2(5) and not vcnt2(4)) + and + not (vcnt2(8) and vcnt2(7) and not vcnt2(6) and not vcnt2(5) and vcnt2(4)) + ) +); + +-- ready signal for microprocessor +rdy1_i <= not( not(hcnt_i(9)) and not hcnt_i(7) and hcnt_i(6) and not hcnt_i(5)); +rdy2_i <= not( not(hcnt_i(9)) and hcnt_i(7) and hcnt_i(6) and hcnt_i(5)); + +-- background horizontal blanking +j1 <= hcnt_i(6) and hcnt_i(4); +k1 <= hstb_i; + +process(clk11) begin + if rising_edge(clk11) then + if hclk_i = '1' then + if (j1 xor k1) = '1' then + q1 <= j1; + elsif j1 = '1' then + q1 <= not q1; + else + q1 <= q1; + end if; + end if; + end if; +end process; + +j2 <= not hcnt_i(6) and hcnt_i(5); +k2 <= hcnt_i(8) and hcnt_i(7) and hcnt_i(6) and hcnt_i(4); + +process(clk11) begin + if rising_edge(clk11) then + if hclk_i = '1' then + if (j2 xor k2) = '1' then + q2 <= j2; + elsif j2 = '1' then + q2 <= not q2; + else + q2 <= q2; + end if; + end if; + end if; +end process; + +-- output +ce_pix <= hclk_i; +hcnt <= std_logic_vector(hcnt_i); +vcnt2 <= std_logic_vector(vcnt_i(8 downto 1)) when vcnt_i < 255 else "11111111"; +vcnt <= vcnt2; +--sync <= not(sync1_i xor sync2_i) ; original syncs +rdy <= not(vblank_n and (not (rdy1_i and rdy2_i and not hcnt_i(9)))); +adrsel <= vblank_n and hcnt_i(9); + +vblank <= not vblank_n; +hblank_frgrd <= hstb_i; +hblank_bkgrd <= not(hcnt_i(9) and q1) and not(hcnt_i(9) and (q2)); + +process(clk11) begin + if rising_edge(clk11) then + if hclk_i = '1' then + if hcnt_i = 191 then + sync_hs <= '1'; + if vcnt_i = 230 then sync_vs <= '1'; end if; + if vcnt_i = 237 then sync_vs <= '0'; end if; + end if; + if hcnt_i = 217 then sync_hs <= '0'; end if; + end if; + end if; +end process; + +end struct; diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/pll27.vhd b/Arcade/Custom Hardware/Phoenix_MIST/rtl/pll27.vhd new file mode 100644 index 00000000..d418b79c --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/pll27.vhd @@ -0,0 +1,389 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll27.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Full Version +-- ************************************************************ + + +--Copyright (C) 1991-2014 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll27 IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll27; + + +ARCHITECTURE SYN OF pll27 IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire6_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire6_bv(0 DOWNTO 0) <= "0"; + sub_wire6 <= To_stdlogicvector(sub_wire6_bv); + sub_wire3 <= sub_wire0(0); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + locked <= sub_wire2; + c0 <= sub_wire3; + sub_wire4 <= inclk0; + sub_wire5 <= sub_wire6(0 DOWNTO 0) & sub_wire4; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 88, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 11, + clk1_phase_shift => "0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll27", + lpm_type => "altpll", + operation_mode => "NO_COMPENSATION", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "ON", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire5, + clk => sub_wire0, + locked => sub_wire2 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "1" +-- 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 "169715" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "88.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "11.000000" +-- 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 "1" +-- 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "25" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "88" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "88.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "11.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 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_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: 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 "pll27.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 "1" +-- 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: 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_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 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 "88" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "11" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- 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 "NO_COMPENSATION" +-- 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_USED" +-- 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_UNUSED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "ON" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..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: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- 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: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll27.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll27.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll27.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll27.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll27.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll27_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Custom Hardware/Phoenix_MIST/rtl/scandoubler.v b/Arcade/Custom Hardware/Phoenix_MIST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Custom Hardware/Phoenix_MIST/rtl/video_mixer.sv b/Arcade/Custom Hardware/Phoenix_MIST/rtl/video_mixer.sv new file mode 100644 index 00000000..57b24fed --- /dev/null +++ b/Arcade/Custom Hardware/Phoenix_MIST/rtl/video_mixer.sv @@ -0,0 +1,244 @@ +// +// +// 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, + + output osd_enabled, + + // 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/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/README.md b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/README.md new file mode 100644 index 00000000..c6f9a396 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/README.md @@ -0,0 +1,11 @@ +# RiverRaid-Clone-Mist + +A simple RiverRaid Clone(https://habrahabr.ru/post/313092/) + +-Controls Keyboard + +-VGA Only + +-no Joystick (left,right Controls needs a fix) + +-added simple Shooting Sound Effect diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/Release/RiverRaid.rbf b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/Release/RiverRaid.rbf new file mode 100644 index 00000000..d81fa285 Binary files /dev/null and b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/Release/RiverRaid.rbf differ diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/RiverRaid.qpf b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/RiverRaid.qpf new file mode 100644 index 00000000..748fc85c --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/RiverRaid.qpf @@ -0,0 +1,32 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2016 Altera Corporation. All rights reserved. +# 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, the Altera Quartus Prime License Agreement, +# the 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 Prime +# Version 16.0.0 Build 211 04/27/2016 SJ Lite Edition +# Date created = 10:36:41 October 08, 2016 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "16.0" +DATE = "10:36:41 October 08, 2016" + +# Revisions + +PROJECT_REVISION = "RiverRaid" +PROJECT_REVISION = "RiverRaid" diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/RiverRaid.qsf b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/RiverRaid.qsf new file mode 100644 index 00000000..7f324412 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/RiverRaid.qsf @@ -0,0 +1,191 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 09:49:07 August 24, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# RiverRaid_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 "9.0 SP2" +set_global_assignment -name PROJECT_CREATION_TIME_DATE "00:26:34 JANUARY 27, 2011" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_7 -to LED +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_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_REPORT_SCRIPT_INCLUDE_DEFAULT_ANALYSIS OFF +set_global_assignment -name TIMEQUEST_DO_CCPP_REMOVAL ON + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY RiverRaid +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name VERILOG_INPUT_VERSION SYSTEMVERILOG_2005 +set_global_assignment -name VERILOG_SHOW_LMF_MAPPING_MESSAGES OFF +set_global_assignment -name VHDL_INPUT_VERSION VHDL_2008 +set_global_assignment -name VHDL_SHOW_LMF_MAPPING_MESSAGES OFF + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +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 FORCE_CONFIGURATION_VCCIO ON +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_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# 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_blast_fpga) +# --------------------------------------- + + # Analysis & Synthesis Assignments + # ================================ +set_global_assignment -name USE_GENERATED_PHYSICAL_CONSTRAINTS OFF -section_id eda_blast_fpga + +# end EDA_TOOL_SETTINGS(eda_blast_fpga) +# ------------------------------------- + +# ----------------------- +# start ENTITY(RiverRaid) + + # start LOGICLOCK_REGION(Root Region) + # ----------------------------------- + + # LogicLock Region Assignments + # ============================ +set_global_assignment -name LL_ROOT_REGION ON -section_id "Root Region" +set_global_assignment -name LL_MEMBER_STATE LOCKED -section_id "Root Region" + + # end LOGICLOCK_REGION(Root Region) + # --------------------------------- + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(RiverRaid) +# --------------------- + +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name VERILOG_FILE rtl/pll_108.v +set_global_assignment -name VERILOG_FILE rtl/altera_up_ps2_data_in.v +set_global_assignment -name VERILOG_FILE rtl/altera_up_ps2_command_out.v +set_global_assignment -name VERILOG_FILE rtl/RiverRaid.sv +set_global_assignment -name VERILOG_INCLUDE_FILE rtl/defs.vh +set_global_assignment -name VERILOG_FILE rtl/vga_time_generator.v +set_global_assignment -name VERILOG_FILE rtl/sprite_ship.v +set_global_assignment -name VERILOG_FILE rtl/sprite_player.v +set_global_assignment -name VERILOG_FILE rtl/sprite_plane.v +set_global_assignment -name VERILOG_FILE rtl/sprite_helicopter.v +set_global_assignment -name VERILOG_FILE rtl/sprite_fuel.v +set_global_assignment -name VERILOG_FILE rtl/sprite_building.v +set_global_assignment -name VERILOG_FILE rtl/ps2_controller.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/mist/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/mist/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/mist/osd.v +set_global_assignment -name VERILOG_FILE rtl/mist/keyboard.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/mist/hq2x.sv +set_global_assignment -name VERILOG_FILE rtl/mist/mist_io.v +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/clean.bat b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/clean.bat new file mode 100644 index 00000000..c9a2cb06 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/RiverRaid.sv b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/RiverRaid.sv new file mode 100644 index 00000000..2a989dd7 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/RiverRaid.sv @@ -0,0 +1,969 @@ +`include "defs.vh" + + + +`define POINT_IN_BOX(box1, box2)\ +(box1.x >= box2.x) && (box1.x < (box2.x+box2.width)) &&\ +(box1.y >= box2.y) && (box1.y < (box2.y+box2.height)) + +`define Y_CROSSES_BOX(box1, box2)\ +(box1.y >= box2.y) && (box1.y < (box2.y+box2.height)) + + +`define BOX_CROSS(box1, box2)\ +(box1.x < (box2.x+box2.width)) &&\ +(box2.x < (box1.x+box1.width)) &&\ +(box1.y < (box2.y+box2.height)) &&\ +(box2.y < (box1.y+box1.height)) + + + + +typedef struct { + logic [10:0] x; + logic [10:0] y; + logic [10:0] width; + logic [10:0] height; + logic [3:0] exact_x; + logic signed [7:0] movement; + entity_type_t etype; + logic show; + logic [7:0] die_step; +} entity_t; + + +typedef struct { + logic [24:0] scroll_pos; + logic signed [10:0] change_x; +} river_flow_t; + +typedef struct { + logic [24:0] scroll_pos; + entity_type_t etype; + logic [10:0] x; + logic signed [7:0] movement; +} entity_flow_t; + + +typedef struct { + logic [24:0] pos; + logic [24:0] river_addr; // Ð°Ð´Ñ€ÐµÑ Ð² river_flow Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ + // в данный момент идет прориÑовка реки + logic [10:0] river_x_start; + logic [24:0] island_addr; + logic [10:0] island_x_start; + logic [24:0] entity_addr;// Ð°Ð´Ñ€ÐµÑ Ð² entity_flow Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ в данный момент + // беретÑÑ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾ кораблÑм, Ñамолетам, ... +} scroll_t; + + +typedef struct { + bit [(`SPRITE_MISSILE_WIDTH*4)-1:0] missile [0:`SPRITE_MISSILE_HEIGHT-1]; +} sprites_t; + +typedef struct { + logic [31:0] ship_addr; + logic [31:0] plane_addr; + logic [31:0] helicopter_addr; + logic [31:0] building_addr; + logic [31:0] fuel_addr; +} rom_sprites_t; + +typedef struct { + logic [3:0] ship; + logic [3:0] plane; + logic [3:0] helicopter; + logic [3:0] building; + logic [3:0] fuel; + logic [3:0] player; +} rgb_sprites_t; + +typedef struct { + logic [10:0] x; + logic [10:0] y; + logic [10:0] width; + logic [10:0] height; + logic [7:0] die_step; +} box_t; + +typedef struct { + logic [10:0] x; + logic [10:0] missile_x; + logic signed [11:0] missile_y; + logic [7:0] die_step; + logic signed [15:0] fuel; + logic [31:0] sprite_addr; +} player_t; + + +typedef struct { + logic signed [10:0] movement; + logic shot; + logic slow; +} cmd_t; + + +typedef struct { + scroll_t scroll; + river_flow_t river_flow [`RIVER_FLOW_SIZE]; + river_flow_t island_flow [`ISLAND_FLOW_SIZE]; + entity_flow_t entity_flow [`ENTITY_FLOW_SIZE]; + entity_t entities [`ENTITIES_ON_FRAME]; + sprites_t sprites; + rom_sprites_t rom_sprites; + rgb_sprites_t rgb_sprites; + player_t player; + box_t player_box; + box_t missile_box; + cmd_t cmd; + logic play; +} game_t; + + + + +typedef struct { + logic [10:0] x; + logic [10:0] y; + logic rgb_enable; + logic H_SYNC_CLK; + logic V_SYNC_CLK; +} screen_t; + + +`define GET_RGB(sprite, entity)\ +entity.die_step[1]? 4'b000 :\ +(sprite[screen.y-entity.y] >> ((screen.x-entity.x)<<2)) & 4'b1111 + +`define ROM_RGB(sprite_addr, rgb_sprite, shift_width, entity)\ +begin\ + sprite_addr = ((screen.y - entity.y) << shift_width) +\ + (entity.movement <= 0 ? (screen.x - entity.x) : (entity.width - screen.x + entity.x - 1));\ + rgb <= entity.die_step[1]? 4'b000 : rgb_sprite;\ +end + + +module draw_sprites ( + output logic [3:0] rgb, + output rom_sprites_t rom_sprites, + input clk, + input entity_t entities [`ENTITIES_ON_FRAME], + input sprites_t sprites, + input screen_t screen, + input game_t game +); + always @(posedge clk) + begin + for( int i = 0; i <= `ENTITIES_ON_FRAME; i = i + 1 ) + begin + if( i == `ENTITIES_ON_FRAME ) + rgb <= 0; + else if( entities[i].show && `POINT_IN_BOX(screen, entities[i]) ) + begin + case( entities[i].etype ) + SHIP: `ROM_RGB(rom_sprites.ship_addr, game.rgb_sprites.ship, 7, entities[i]) + BUILDING: `ROM_RGB(rom_sprites.building_addr, game.rgb_sprites.building, 6, entities[i]) + PLANE: `ROM_RGB(rom_sprites.plane_addr, game.rgb_sprites.plane, 7, entities[i]) + HELICOPTER: `ROM_RGB(rom_sprites.helicopter_addr, game.rgb_sprites.helicopter, 6, entities[i]) + FUEL: `ROM_RGB(rom_sprites.fuel_addr, game.rgb_sprites.fuel, 6, entities[i]) + BRIDGE: rgb <= entities[i].die_step[1]? 4'b000 : + ((screen.y - entities[i].y) > (`BRIDGE_HEIGHT/2-3) && + (screen.y - entities[i].y) < (`BRIDGE_HEIGHT/2+3)) ? 4'b0110 : 4'b1000; + default: + begin + rgb <= 0; + end + endcase + break; + end + end + end +endmodule + + +module draw_player ( + output logic [3:0] rgb, + output logic [31:0] player_addr, + input clk, + input game_t game, + input screen_t screen +); + box_t fuel_box; + box_t fuel_gauge_box; + + // РиÑка на индикаторе топлива + assign fuel_gauge_box.x = `FUEL_EMPTY_X + game.player.fuel[15:4]; + assign fuel_gauge_box.y = `FUEL_Y + 2; + assign fuel_gauge_box.width = 5; + assign fuel_gauge_box.height = `FUEL_HEIGHT - 4; + + // Индикатор топлива + assign fuel_box.x = `FUEL_EMPTY_X; + assign fuel_box.y = `FUEL_Y; + assign fuel_box.width = `FUEL_WIDTH; + assign fuel_box.height = `FUEL_HEIGHT; + + always @(posedge clk) + begin + if( `POINT_IN_BOX(screen, game.player_box) ) + begin + player_addr = ((screen.y-game.player_box.y) << 6) + (screen.x - game.player_box.x); + rgb <= game.player_box.die_step[1]? 4'b000 : game.rgb_sprites.player; + end + else + begin + player_addr = 0; + if( `POINT_IN_BOX(screen, fuel_gauge_box) ) + rgb <= 4'b0011; + else if( `POINT_IN_BOX(screen, fuel_box) ) + rgb <= 4'b1000; + else + rgb <= 4'b0000; + end + end +endmodule + +module draw_missile ( + output logic [3:0] rgb, + input clk, + input game_t game, + input sprites_t sprites, + input screen_t screen +); + always @(posedge clk) + begin + if( game.missile_box.x && `POINT_IN_BOX(screen, game.missile_box) ) + rgb <= `GET_RGB(sprites.missile, game.missile_box); + else + rgb <= 0; + end +endmodule + + +module play ( + input clk, + input rst, + input screen_t screen, + input game_t game, + input entity_flow_t entity_flow [`ENTITY_FLOW_SIZE], + output wire play_game, + output wire [2:0] rgb, + output scroll_t scroll, + output entity_t entities [`ENTITIES_ON_FRAME], + output player_t player, + output rom_sprites_t rom_sprites +); + wire [10:0] x; + wire [10:0] y; + reg [7:0] line_end; + reg [3:0] step; + reg [3:0] scroll_counter; + reg [31:0] frame_counter; + + reg [10:0] river_x; + reg [10:0] river_x2; + reg [24:0] river_addr; + + reg [10:0] island_x; + reg [24:0] island_addr; + wire [10:0] island_x_left; + wire [10:0] island_x_right; + + reg [7:0] ship_index; + wire [3:0] rgb_sprite; + wire [2:0] rgb_world; + wire [3:0] rgb_player; + wire [3:0] rgb_missile; + wire slow; + + assign x = screen.x; + assign y = screen.y; + assign river_x2 = `SCREEN_MAX_X - river_x; + assign island_x_left = `SCREEN_CENTER_X - island_x; + assign island_x_right = `SCREEN_CENTER_X + island_x; + + assign rgb = rgb_missile ? rgb_missile[2:0] : + rgb_player ? rgb_player[2:0] : + rgb_sprite ? rgb_sprite[2:0] : + rgb_world; + + assign slow = game.cmd.slow && (scroll_counter < `SLOW_SCROLL_SPEED); + + + draw_sprites draw_sprites ( + .rgb ( rgb_sprite ), + .rom_sprites ( rom_sprites ), + .entities ( entities ), + .sprites ( game.sprites ), + .screen ( screen ), + .game ( game ), + .clk ( clk ) + ); + + draw_player draw_player ( + .rgb ( rgb_player ), + .player_addr ( player.sprite_addr ), + .game ( game ), + .screen ( screen ), + .clk ( clk ) + ); + + draw_missile draw_missile ( + .rgb ( rgb_missile ), + .game ( game ), + .sprites ( game.sprites ), + .screen ( screen ), + .clk ( clk ) + ); + + always @(posedge clk) + begin + if( (x == `SCREEN_MAX_X) && (y == `SCREEN_MAX_Y) && (step == 0) ) + begin + step <= 4'h1; + scroll_counter <= '0; + end + case( step ) + 4'h1 : + begin + step <= 4'h2; + if( !play_game ) + begin + play_game <= 1; + scroll.pos <= 0; + scroll.river_addr <= 0; + scroll.river_x_start <= 0; + scroll.island_addr <= 0; + scroll.island_x_start <= 0; + scroll.entity_addr <= 0; + player.die_step <= 0; + player.missile_x <= 0; + player.x <= 0; + player.fuel <= `FUEL_FULL; + for( int i = 0; i < `ENTITIES_ON_FRAME; i = i + 1 ) + entities[i].show <= 0; + end + end + 4'h2 : // ЗакончилаÑÑŒ прориÑовка фрейма + if( frame_counter >= (`SCROLL_EVERY_FRAMES-1) ) + begin + frame_counter <= 0; + if( slow ) + step <= 4'h6; + else + begin + step <= 4'h3; + scroll.pos <= scroll.pos + 'd1; + end + end + else + // ЕÑли надо ничего не делать неÑколько фреймов (очень Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð°Ñ Ð¸Ð³Ñ€Ð°) + begin + step <= 4'h8; + frame_counter <= frame_counter + 'd1; + end + 4'h3 : + begin + step <= 4'h4; + // Дошли до точки Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ€ÐµÐºÐ¸ в river_flow ? + if( scroll.pos >= game.river_flow[scroll.river_addr+1].scroll_pos ) + scroll.river_addr <= scroll.river_addr + 1; + // Изменение Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±ÐµÑ€ÐµÐ³Ð° оÑтрова + if( scroll.pos >= game.island_flow[scroll.island_addr+1].scroll_pos ) + scroll.island_addr <= scroll.island_addr + 1; + // ПоÑвилÑÑ Ð½Ð¾Ð²Ñ‹Ð¹ враг? Сдвинем FIFO объектов, Ñамый Ñтарый выкинем + if( scroll.pos == entity_flow[scroll.entity_addr].scroll_pos ) + entities[1:`ENTITIES_ON_FRAME-1] <= entities[0:`ENTITIES_ON_FRAME-2]; + end + 4'h4 : // ЕÑли на предыдущем шаге поÑвилÑÑ Ð½Ð¾Ð²Ñ‹Ð¹ враг - закинем в FIFO его данные + begin + step <= 4'h5; + if( scroll.pos == entity_flow[scroll.entity_addr].scroll_pos ) + begin + entities[0].show <= 1; + entities[0].x <= entity_flow[scroll.entity_addr].x; + entities[0].exact_x <= 0; + entities[0].y <= 0; + entities[0].etype <= entity_flow[scroll.entity_addr].etype; + entities[0].movement <= entity_flow[scroll.entity_addr].movement; + entities[0].die_step <= 0; + + case( entity_flow[scroll.entity_addr].etype ) + SHIP: + begin + entities[0].width <= `SPRITE_SHIP_WIDTH; + entities[0].height <= `SPRITE_SHIP_HEIGHT; + end + PLANE: + begin + entities[0].width <= `SPRITE_PLANE_WIDTH; + entities[0].height <= `SPRITE_PLANE_HEIGHT; + // Самолеты будут вылетать Ñ ÐºÑ€Ð°Ñ Ñкрана + entities[0].x <= entity_flow[scroll.entity_addr].movement > 0? 0 : `SCREEN_MAX_X; + // Рполе X переназначим на отложенный вылет + entities[0].y <= entity_flow[scroll.entity_addr].x; + end + HELICOPTER: + begin + entities[0].width <= `SPRITE_HELICOPTER_WIDTH; + entities[0].height <= `SPRITE_HELICOPTER_HEIGHT; + end + FUEL: + begin + entities[0].width <= `SPRITE_FUEL_WIDTH; + entities[0].height <= `SPRITE_FUEL_HEIGHT; + end + BRIDGE: + begin + entities[0].x <= scroll.river_x_start + `LAND_START_POS; + entities[0].width <= `SCREEN_MAX_X - scroll.river_x_start - `LAND_START_POS + - scroll.river_x_start - `LAND_START_POS; + entities[0].height <= `BRIDGE_HEIGHT; + end + BUILDING: + begin + entities[0].width <= `SPRITE_BUILDING_WIDTH; + entities[0].height <= `SPRITE_BUILDING_HEIGHT; + end + default: + begin + entities[0].width <= 0; + entities[0].height <= 0; + end + endcase + + scroll.entity_addr <= scroll.entity_addr + 1; + end + end + 4'h5 : + begin + step <= 4'h6; + if( player.fuel > `FUEL_FULL ) + player.fuel <= `FUEL_FULL; + scroll.river_x_start <= scroll.river_x_start + game.river_flow[scroll.river_addr].change_x; + scroll.island_x_start <= scroll.island_x_start + game.island_flow[scroll.island_addr].change_x; + end + 4'h6 : // Перемещение, подбитие, таран врагов + begin + step <= 4'h7; + for( int i = 0; i < `ENTITIES_ON_FRAME; i = i + 1 ) + begin + // Враг ранее был подбит + if( entities[i].die_step ) + // Подержим в таком ÑоÑтоÑнии немного на Ñкране + if( entities[i].die_step == 100 ) + entities[i].show <= 0; + else + begin // Уменьшаем Ñкролинг - получаем Ñффект отлета от ракеты + if( (entities[i].etype == BRIDGE) || scroll_counter[0] ) + entities[i].y <= entities[i].y + 1; + entities[i].die_step <= entities[i].die_step + 1; + end + else if( (entities[i].y < `SCREEN_MAX_Y) && entities[i].show ) + begin + // Ракета попала в объект + if( `BOX_CROSS(game.missile_box, entities[i]) ) + begin + entities[i].die_step <= 1; + player.missile_x <= 0; + end + // Игрок врезалÑÑ Ð² объект + else if( `BOX_CROSS(game.player_box, entities[i]) ) + begin + if( entities[i].etype == FUEL ) + begin + player.fuel <= player.fuel + `FUEL_UP_SPEED; + entities[i].y <= entities[i].y + 1; + end + else + begin + // ЕÑли игрок уже погиб, не менÑем Ð²Ñ€ÐµÐ¼Ñ Ð´Ð¾ реÑтарта + if( !player.die_step ) + player.die_step <= 1; + entities[i].die_step <= 1; + end + end + else if( !slow ) + entities[i].y <= entities[i].y + 1; + end + else + entities[i].show <= 0; + + // Перемещение = movement/16 пикÑелей на фрейм, Ñ‚.е можно < 1 + {entities[i].x, entities[i].exact_x} <= + {entities[i].x, entities[i].exact_x} + 15'(signed'(entities[i].movement)); + end + end + 4'h7 : // ВозвращаемÑÑ Ð½Ð° шаг 1 еÑли нужно Ñделать неÑколько Ñкроллингов за 1 фрейм + begin + if( (scroll.pos < `SCREEN_MAX_Y) && (scroll_counter < `START_SCROLL_SPEED) ) + begin + scroll_counter <= scroll_counter + 4'd1; + step <= 4'h1; + end + else if( scroll_counter < `FRAME_EVERY_SCROLLS ) + begin + scroll_counter <= scroll_counter + 4'd1; + step <= 4'h1; + end + else + step <= 4'h8; + end + 4'h8 : + begin + step <= 4'h9; + // Перемещение игрока + if( !player.die_step ) + player.x <= player.x + game.cmd.movement; + // Уменьшение топлива. Уменьшаем Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð¹ ÑкороÑтью вÑегда, чтобы не замедлÑли полет поÑтоÑнно + player.fuel <= player.fuel - `FUEL_DOWN_SPEED; + end + 4'h9 : + begin + step <= 4'ha; + // Ð’Ñ‹Ñтрел игрока + if( game.cmd.shot && (player.missile_y < `REMISSILE_Y_POS) ) + begin + player.missile_x <= game.player_box.x + `PLAYER_WIDTH/2 - `SPRITE_MISSILE_WIDTH/2; + player.missile_y <= `MISSILE_Y_START; + end + else if( player.missile_y > 0 ) + player.missile_y <= player.missile_y - `MISSILE_SPEED; + else + player.missile_x <= 0; + // ЗакончилоÑÑŒ топливо + if( (player.fuel <= 0) && !(player.die_step) ) + begin + player.fuel <= 0; + player.die_step <= 1; + end + end + 4'ha : // Стартовые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ€Ð¸Ñовки фрейма + begin + step <= 4'hb; + river_x <= scroll.river_x_start + `LAND_START_POS; + river_addr <= scroll.river_addr; + island_x <= scroll.island_x_start; + island_addr <= scroll.island_addr; + end + 4'hb : + begin + step <= 4'hc; + if( player.die_step ) + begin + if( player.die_step == 60 ) + begin + play_game <= 0; + end + else + player.die_step <= player.die_step + 1; + end + end + default: + begin + if( x == 0 ) + step <= 4'h0; + if( (x == `SCREEN_MAX_X) && (line_end == 0) ) + line_end <= 8'd1; + case ( line_end ) + 8'd1 : + begin + line_end <= 8'd2; + if( (y < `SCREEN_MAX_Y) && (scroll.pos >= y) ) + begin + if( (scroll.pos - y) < game.river_flow[river_addr].scroll_pos ) + river_addr <= river_addr - 1; + if( (scroll.pos - y) < game.island_flow[island_addr].scroll_pos ) + island_addr <= island_addr - 1; + end + end + 8'd2: + begin + line_end <= 8'd3; + if( (river_addr >= 0) && (y < `SCREEN_MAX_Y)) + river_x <= river_x - game.river_flow[river_addr].change_x; + if( (island_addr >= 0) && (y < `SCREEN_MAX_Y)) + island_x <= island_x - game.island_flow[island_addr].change_x; + end + 8'd3: // Ð˜Ð½Ð´ÐµÐºÑ ÐºÐ¾Ñ€Ð°Ð±Ð»Ñ Ð¿Ð¾ текущему Y чтобы на Ñледующем шаге проверÑть доплытие до берега + // Это Ñкономней чем делать вÑе в цикле, но добавлÑетÑÑ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ðµ: 1 корабль на одной позиции Y + begin + for( int i = 0; i <= `ENTITIES_ON_FRAME; i = i + 1 ) + if( i == `ENTITIES_ON_FRAME ) + begin + //ship_index <= 0; + line_end <= 8'd6; + end + else if( `Y_CROSSES_BOX(screen, entities[i]) && ( + (entities[i].etype == SHIP) || + (entities[i].etype == HELICOPTER) + )) + begin + ship_index <= i; + line_end <= 8'd4; + break; + end + end + 8'd4: // Корабль доплыл до берега? + begin + if( entities[ship_index].x < (river_x + `SAND_WIDTH) ) + begin + entities[ship_index].x <= river_x + `SAND_WIDTH; + line_end <= 8'd5; + end + else if( (entities[ship_index].x + entities[ship_index].width) > (river_x2 - `SAND_WIDTH) ) + begin + entities[ship_index].x <= river_x2 - `SAND_WIDTH - entities[ship_index].width; + line_end <= 8'd5; + end + else + line_end <= 8'd6; + end + 8'd5: // Корабль доплыл до берега. Изменим направление + begin + line_end <= 8'd6; + entities[ship_index].movement <= -entities[ship_index].movement; + end + 8'd6: // Игрок врезалÑÑ Ð² берег или оÑтров? + begin + line_end <= 8'd7; + if( + (!player.die_step) && + `Y_CROSSES_BOX(screen, game.player_box) && + ( + (game.player_box.x <= river_x) || + ((game.player_box.x + game.player_box.width) > river_x2) || + ( + island_x && + (game.player_box.x >= island_x_left) && + ((game.player_box.x + game.player_box.width) < island_x_right) + ) + ) + ) + player.die_step <= 1; + // Ракета попала в берег или оÑтров? + if( + `Y_CROSSES_BOX(screen, game.missile_box) && + ( + (game.missile_box.x <= river_x) || + ((game.missile_box.x + game.missile_box.width) > river_x2) || + ( + island_x && + (game.missile_box.x >= island_x_left) && + ((game.missile_box.x + game.missile_box.width) < island_x_right) + ) + ) + ) + player.missile_x <= 0; + end + default: + begin + if( x == 0 ) + line_end <= 3'd0; + if( scroll.pos > y ) + rgb_world <= + (x < river_x) ? `LAND_COLOR : + (x < (river_x + `SAND_WIDTH)) ? `SAND_COLOR : + (x < island_x_left) ? `RIVER_COLOR : + (x < island_x_right) ? `LAND_COLOR : + (x < (river_x2 - `SAND_WIDTH)) ? `RIVER_COLOR : + (x >= river_x2) ? `LAND_COLOR : `SAND_COLOR ; + else + rgb_world <= `TRANSPARENT_COLOR; + end + endcase + end + endcase + end +endmodule + + +module init ( + input clk, + input rst, + output river_flow_t river_flow [`RIVER_FLOW_SIZE], + output river_flow_t island_flow [`ISLAND_FLOW_SIZE], + output entity_flow_t entity_flow [`ENTITY_FLOW_SIZE], + output sprites_t sprites +); + always @(posedge clk) + if( !rst ) + begin + river_flow <= `RIVER_FLOW; + island_flow <= `ISLAND_FLOW; + entity_flow <= `ENTITY_FLOW; + sprites.missile <= `MISSILE_SPRITE; + end +endmodule + +module RiverRaid ( + input CLOCK_27, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output LED, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input SPI_SS4, + input CONF_DATA0 +); + +`include "rtl\build_id.v" + + localparam CONF_STR = { + "River Raid;;", + "O23,Scandoubler Fx,None,CRT 25%,CRT 50%;", + //"T5,Reset;", + "V,v0.1.",`BUILD_DATE +}; + + game_t game; + screen_t screen; + wire clk; + wire clk_pix; + wire rst = status[0] | status[5] |buttons[1]; + wire [2:0] cur_rgb; + + logic [7:0] ps2_received_data; + logic ps2_received_data_en; + logic ps2_key_up_action; + + wire HSync = screen.H_SYNC_CLK; + wire VSync = screen.V_SYNC_CLK; + wire r = screen.rgb_enable? cur_rgb[0] : 1'b0; + wire g = screen.rgb_enable? cur_rgb[1] : 1'b0; + wire b = screen.rgb_enable? cur_rgb[2] : 1'b0; + wire [2:0] VGA_BO ={r,r,r}; + wire [2:0] VGA_GO ={g,g,g}; + wire [2:0] VGA_RO ={b,b,b}; + assign game.player_box.x = game.player.x + `PLAYER_START_X; + assign game.player_box.y = `PLAYER_Y; + assign game.player_box.width = `PLAYER_WIDTH; + assign game.player_box.height = `PLAYER_HEIGHT; + assign game.player_box.die_step = game.player.die_step; + + assign game.missile_box.x = game.player.missile_x; + assign game.missile_box.y = game.player.missile_y[10:0]; + assign game.missile_box.width = `SPRITE_MISSILE_WIDTH; + assign game.missile_box.height = `SPRITE_MISSILE_HEIGHT; + + wire scandoubler_disable; + wire ypbpr; + wire ps2_kbd_clk, ps2_kbd_data; + wire [31:0] status; + wire [1:0] buttons; + wire [1:0] switches; + wire [7:0] joyA; + wire [7:0] joyB; + wire [7:0] kbd_joy; + wire vga_clk; + + assign LED = 1'b1; + + mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys(clk), + .conf_str(CONF_STR), + .CONF_DATA0(CONF_DATA0), + .SPI_SCK(SPI_SCK), + .SPI_SS2(SPI_SS2), + .SPI_DO(SPI_DO), + .SPI_DI(SPI_DI), + .scandoubler_disable(scandoubler_disable), + .status(status), + .buttons(buttons), + .switches(switches), + .joystick_0(joyA), + .joystick_1(joyB), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .ypbpr(ypbpr) +); + +video_mixer #(.LINE_LENGTH(1024), .HALF_DEPTH(1)) video_mixer +( + .*, + .clk_sys(clk), + .ce_pix(vga_clk), + .ce_pix_actual(vga_clk), + .scanlines({status[3:2] == 2, status[3:2] == 1}), + .scandoubler_disable(1), + .ypbpr(ypbpr), + .ypbpr_full(1), + .line_start(0), + .mono(0), + .hq2x(), + .R(VGA_RO), + .G(VGA_GO), + .B(VGA_BO) +); + + pll_108 pll_108 ( + .inclk0 ( CLOCK_27 ), + .c0 ( vga_clk ), + .c1 ( clk ), + .areset ( rst ) + ); + + vga_time_generator vga_time_generator ( + .clk ( vga_clk ), + .reset_n ( 1 ), + .h_disp ( `H_DISP ), + .h_fporch ( `H_FPORCH ), + .h_sync ( `H_SYNC ), + .h_bporch ( `H_BPORCH ), + + .v_disp ( `V_DISP ), + .v_fporch ( `V_FPORCH ), + .v_sync ( `V_SYNC ), + .v_bporch ( `V_BPORCH ), + .hs_polarity ( 1'b0 ), + .vs_polarity ( 1'b0 ), + .frame_interlaced ( 1'b0 ), + + .vga_hs ( screen.H_SYNC_CLK ), + .vga_vs ( screen.V_SYNC_CLK ), + .vga_de ( screen.rgb_enable ), + .pixel_x ( screen.x ), + .pixel_y ( screen.y ) + ); + + sprite_ship sprite_ship ( + .clock ( vga_clk ), + .address ( game.rom_sprites.ship_addr ), + .q ( game.rgb_sprites.ship ) + ); + + sprite_plane sprite_plane ( + .clock ( vga_clk ), + .address ( game.rom_sprites.plane_addr ), + .q ( game.rgb_sprites.plane ) + ); + + sprite_helicopter sprite_helicopter ( + .clock ( vga_clk ), + .address ( game.rom_sprites.helicopter_addr ), + .q ( game.rgb_sprites.helicopter ) + ); + + + sprite_building sprite_building ( + .clock ( vga_clk ), + .address ( game.rom_sprites.building_addr ), + .q ( game.rgb_sprites.building ) + ); + + sprite_fuel sprite_fuel ( + .clock ( vga_clk ), + .address ( game.rom_sprites.fuel_addr ), + .q ( game.rgb_sprites.fuel ) + ); + + sprite_player sprite_player ( + .clock ( vga_clk ), + .address ( game.player.sprite_addr ), + .q ( game.rgb_sprites.player ) + ); + + play play ( + .clk ( vga_clk ), + .rst ( rst ), + .rgb ( cur_rgb ), + .screen ( screen ), + .game ( game ), + .scroll ( game.scroll ), + .entity_flow ( game.entity_flow ), + .entities ( game.entities ), + .rom_sprites ( game.rom_sprites ), + .player ( game.player ), + .play_game ( game.play ) + ); + + + init init ( + .clk ( vga_clk ), + .rst ( rst ), + .river_flow ( game.river_flow ), + .island_flow ( game.island_flow ), + .entity_flow ( game.entity_flow ), + .sprites ( game.sprites ) + ); +//will be removed fix Keyboard module down below + PS2_Controller ps2( + .CLOCK_50 ( clk ), + .reset ( 0 ), + .PS2_CLK ( ps2_kbd_clk ), + .PS2_DAT ( ps2_kbd_data ), + .received_data ( ps2_received_data ), + .received_data_en ( ps2_received_data_en ) + ); + + // Inaccurate + /* keyboard keyboard + ( + .clk(clk), + .reset(0), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbd_joy), + .code( ps2_received_data ), + .input_strobe( ps2_received_data_en ) + );*/ + + +//Joystick +/* always @(posedge clk) + begin + game.cmd.shot = kbd_joy[0] | joyA[4] |joyB[4]; + game.cmd.slow = kbd_joy[5] | joyA[2] |joyB[2]; +// this will not work +// if (kbd_joy[6])// | joyA[1] |joyB[1]) +// if( game.cmd.movement < 0 ) game.cmd.movement <= 0; else game.cmd.movement <= -`PLAYER_SPEED; +// if (kbd_joy[7])// | joyA[3] |joyB[3]) +// if( game.cmd.movement > 0 ) game.cmd.movement <= 0; else game.cmd.movement <= +`PLAYER_SPEED; + end*/ + + //will be remooved +reg [15:0] counter; + always @(posedge ps2_received_data_en) + begin + + if( ps2_received_data == 8'hF0 ) + ps2_key_up_action <= 1; + else begin + ps2_key_up_action <=0; + if( ps2_key_up_action ) + case( ps2_received_data ) + 8'h6B : if( game.cmd.movement < 0 ) game.cmd.movement <= 0;//left + 8'h74 : if( game.cmd.movement > 0 ) game.cmd.movement <= 0;//right + 8'h29 : game.cmd.shot <= 0;//Fire + 8'h72 : game.cmd.slow <= 0;//down + endcase + else begin + case( ps2_received_data ) + 8'h6B : game.cmd.movement <= -`PLAYER_SPEED; + 8'h74 : game.cmd.movement <= `PLAYER_SPEED; + 8'h29 : game.cmd.shot <= 1; + 8'h72 : game.cmd.slow <= 1; + endcase + end + end + + end + + always @(posedge clk) + if (game.cmd.shot==1) + if(counter==56817) counter <= 0; + else counter <= counter+1; + + assign AUDIO_L = counter[15]; + assign AUDIO_R = AUDIO_L; + +endmodule diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/altera_up_ps2_command_out.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/altera_up_ps2_command_out.v new file mode 100644 index 00000000..66b12093 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/altera_up_ps2_command_out.v @@ -0,0 +1,303 @@ +/***************************************************************************** + * * + * Module: Altera_UP_PS2_Command_Out * + * Description: * + * This module sends commands out to the PS2 core. * + * * + *****************************************************************************/ + + +module Altera_UP_PS2_Command_Out ( + // Inputs + clk, + reset, + + the_command, + send_command, + + ps2_clk_posedge, + ps2_clk_negedge, + + // Bidirectionals + PS2_CLK, + PS2_DAT, + + // Outputs + command_was_sent, + error_communication_timed_out +); + +/***************************************************************************** + * Parameter Declarations * + *****************************************************************************/ + +// Timing info for initiating Host-to-Device communication +// when using a 50MHz system clock +parameter CLOCK_CYCLES_FOR_101US = 5050; +parameter NUMBER_OF_BITS_FOR_101US = 13; +parameter COUNTER_INCREMENT_FOR_101US = 13'h0001; + +//parameter CLOCK_CYCLES_FOR_101US = 50; +//parameter NUMBER_OF_BITS_FOR_101US = 6; +//parameter COUNTER_INCREMENT_FOR_101US = 6'h01; + +// Timing info for start of transmission error +// when using a 50MHz system clock +parameter CLOCK_CYCLES_FOR_15MS = 750000; +parameter NUMBER_OF_BITS_FOR_15MS = 20; +parameter COUNTER_INCREMENT_FOR_15MS = 20'h00001; + +// Timing info for sending data error +// when using a 50MHz system clock +parameter CLOCK_CYCLES_FOR_2MS = 100000; +parameter NUMBER_OF_BITS_FOR_2MS = 17; +parameter COUNTER_INCREMENT_FOR_2MS = 17'h00001; + +/***************************************************************************** + * Port Declarations * + *****************************************************************************/ +// Inputs +input clk; +input reset; + +input [7:0] the_command; +input send_command; + +input ps2_clk_posedge; +input ps2_clk_negedge; + +// Bidirectionals +inout PS2_CLK; +inout PS2_DAT; + +// Outputs +output reg command_was_sent; +output reg error_communication_timed_out; + +/***************************************************************************** + * Constant Declarations * + *****************************************************************************/ +// states +parameter PS2_STATE_0_IDLE = 3'h0, + PS2_STATE_1_INITIATE_COMMUNICATION = 3'h1, + PS2_STATE_2_WAIT_FOR_CLOCK = 3'h2, + PS2_STATE_3_TRANSMIT_DATA = 3'h3, + PS2_STATE_4_TRANSMIT_STOP_BIT = 3'h4, + PS2_STATE_5_RECEIVE_ACK_BIT = 3'h5, + PS2_STATE_6_COMMAND_WAS_SENT = 3'h6, + PS2_STATE_7_TRANSMISSION_ERROR = 3'h7; + +/***************************************************************************** + * Internal wires and registers Declarations * + *****************************************************************************/ +// Internal Wires + +// Internal Registers +reg [3:0] cur_bit; +reg [8:0] ps2_command; + +reg [NUMBER_OF_BITS_FOR_101US:1] command_initiate_counter; + +reg [NUMBER_OF_BITS_FOR_15MS:1] waiting_counter; +reg [NUMBER_OF_BITS_FOR_2MS:1] transfer_counter; + +// State Machine Registers +reg [2:0] ns_ps2_transmitter; +reg [2:0] s_ps2_transmitter; + +/***************************************************************************** + * Finite State Machine(s) * + *****************************************************************************/ + +always @(posedge clk) +begin + if (reset == 1'b1) + s_ps2_transmitter <= PS2_STATE_0_IDLE; + else + s_ps2_transmitter <= ns_ps2_transmitter; +end + +always @(*) +begin + // Defaults + ns_ps2_transmitter = PS2_STATE_0_IDLE; + + case (s_ps2_transmitter) + PS2_STATE_0_IDLE: + begin + if (send_command == 1'b1) + ns_ps2_transmitter = PS2_STATE_1_INITIATE_COMMUNICATION; + else + ns_ps2_transmitter = PS2_STATE_0_IDLE; + end + PS2_STATE_1_INITIATE_COMMUNICATION: + begin + if (command_initiate_counter == CLOCK_CYCLES_FOR_101US) + ns_ps2_transmitter = PS2_STATE_2_WAIT_FOR_CLOCK; + else + ns_ps2_transmitter = PS2_STATE_1_INITIATE_COMMUNICATION; + end + PS2_STATE_2_WAIT_FOR_CLOCK: + begin + if (ps2_clk_negedge == 1'b1) + ns_ps2_transmitter = PS2_STATE_3_TRANSMIT_DATA; + else if (waiting_counter == CLOCK_CYCLES_FOR_15MS) + ns_ps2_transmitter = PS2_STATE_7_TRANSMISSION_ERROR; + else + ns_ps2_transmitter = PS2_STATE_2_WAIT_FOR_CLOCK; + end + PS2_STATE_3_TRANSMIT_DATA: + begin + if ((cur_bit == 4'd8) && (ps2_clk_negedge == 1'b1)) + ns_ps2_transmitter = PS2_STATE_4_TRANSMIT_STOP_BIT; + else if (transfer_counter == CLOCK_CYCLES_FOR_2MS) + ns_ps2_transmitter = PS2_STATE_7_TRANSMISSION_ERROR; + else + ns_ps2_transmitter = PS2_STATE_3_TRANSMIT_DATA; + end + PS2_STATE_4_TRANSMIT_STOP_BIT: + begin + if (ps2_clk_negedge == 1'b1) + ns_ps2_transmitter = PS2_STATE_5_RECEIVE_ACK_BIT; + else if (transfer_counter == CLOCK_CYCLES_FOR_2MS) + ns_ps2_transmitter = PS2_STATE_7_TRANSMISSION_ERROR; + else + ns_ps2_transmitter = PS2_STATE_4_TRANSMIT_STOP_BIT; + end + PS2_STATE_5_RECEIVE_ACK_BIT: + begin + if (ps2_clk_posedge == 1'b1) + ns_ps2_transmitter = PS2_STATE_6_COMMAND_WAS_SENT; + else if (transfer_counter == CLOCK_CYCLES_FOR_2MS) + ns_ps2_transmitter = PS2_STATE_7_TRANSMISSION_ERROR; + else + ns_ps2_transmitter = PS2_STATE_5_RECEIVE_ACK_BIT; + end + PS2_STATE_6_COMMAND_WAS_SENT: + begin + if (send_command == 1'b0) + ns_ps2_transmitter = PS2_STATE_0_IDLE; + else + ns_ps2_transmitter = PS2_STATE_6_COMMAND_WAS_SENT; + end + PS2_STATE_7_TRANSMISSION_ERROR: + begin + if (send_command == 1'b0) + ns_ps2_transmitter = PS2_STATE_0_IDLE; + else + ns_ps2_transmitter = PS2_STATE_7_TRANSMISSION_ERROR; + end + default: + begin + ns_ps2_transmitter = PS2_STATE_0_IDLE; + end + endcase +end + +/***************************************************************************** + * Sequential logic * + *****************************************************************************/ + +always @(posedge clk) +begin + if (reset == 1'b1) + ps2_command <= 9'h000; + else if (s_ps2_transmitter == PS2_STATE_0_IDLE) + ps2_command <= {(^the_command) ^ 1'b1, the_command}; +end + +always @(posedge clk) +begin + if (reset == 1'b1) + command_initiate_counter <= {NUMBER_OF_BITS_FOR_101US{1'b0}}; + else if ((s_ps2_transmitter == PS2_STATE_1_INITIATE_COMMUNICATION) && + (command_initiate_counter != CLOCK_CYCLES_FOR_101US)) + command_initiate_counter <= + command_initiate_counter + COUNTER_INCREMENT_FOR_101US; + else if (s_ps2_transmitter != PS2_STATE_1_INITIATE_COMMUNICATION) + command_initiate_counter <= {NUMBER_OF_BITS_FOR_101US{1'b0}}; +end + +always @(posedge clk) +begin + if (reset == 1'b1) + waiting_counter <= {NUMBER_OF_BITS_FOR_15MS{1'b0}}; + else if ((s_ps2_transmitter == PS2_STATE_2_WAIT_FOR_CLOCK) && + (waiting_counter != CLOCK_CYCLES_FOR_15MS)) + waiting_counter <= waiting_counter + COUNTER_INCREMENT_FOR_15MS; + else if (s_ps2_transmitter != PS2_STATE_2_WAIT_FOR_CLOCK) + waiting_counter <= {NUMBER_OF_BITS_FOR_15MS{1'b0}}; +end + +always @(posedge clk) +begin + if (reset == 1'b1) + transfer_counter <= {NUMBER_OF_BITS_FOR_2MS{1'b0}}; + else + begin + if ((s_ps2_transmitter == PS2_STATE_3_TRANSMIT_DATA) || + (s_ps2_transmitter == PS2_STATE_4_TRANSMIT_STOP_BIT) || + (s_ps2_transmitter == PS2_STATE_5_RECEIVE_ACK_BIT)) + begin + if (transfer_counter != CLOCK_CYCLES_FOR_2MS) + transfer_counter <= transfer_counter + COUNTER_INCREMENT_FOR_2MS; + end + else + transfer_counter <= {NUMBER_OF_BITS_FOR_2MS{1'b0}}; + end +end + +always @(posedge clk) +begin + if (reset == 1'b1) + cur_bit <= 4'h0; + else if ((s_ps2_transmitter == PS2_STATE_3_TRANSMIT_DATA) && + (ps2_clk_negedge == 1'b1)) + cur_bit <= cur_bit + 4'h1; + else if (s_ps2_transmitter != PS2_STATE_3_TRANSMIT_DATA) + cur_bit <= 4'h0; +end + +always @(posedge clk) +begin + if (reset == 1'b1) + command_was_sent <= 1'b0; + else if (s_ps2_transmitter == PS2_STATE_6_COMMAND_WAS_SENT) + command_was_sent <= 1'b1; + else if (send_command == 1'b0) + command_was_sent <= 1'b0; +end + +always @(posedge clk) +begin + if (reset == 1'b1) + error_communication_timed_out <= 1'b0; + else if (s_ps2_transmitter == PS2_STATE_7_TRANSMISSION_ERROR) + error_communication_timed_out <= 1'b1; + else if (send_command == 1'b0) + error_communication_timed_out <= 1'b0; +end + +/***************************************************************************** + * Combinational logic * + *****************************************************************************/ + +assign PS2_CLK = + (s_ps2_transmitter == PS2_STATE_1_INITIATE_COMMUNICATION) ? + 1'b0 : + 1'bz; + +assign PS2_DAT = + (s_ps2_transmitter == PS2_STATE_3_TRANSMIT_DATA) ? ps2_command[cur_bit] : + (s_ps2_transmitter == PS2_STATE_2_WAIT_FOR_CLOCK) ? 1'b0 : + ((s_ps2_transmitter == PS2_STATE_1_INITIATE_COMMUNICATION) && + (command_initiate_counter[NUMBER_OF_BITS_FOR_101US] == 1'b1)) ? 1'b0 : + 1'bz; + +/***************************************************************************** + * Internal Modules * + *****************************************************************************/ + + +endmodule + diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/altera_up_ps2_data_in.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/altera_up_ps2_data_in.v new file mode 100644 index 00000000..f2c57556 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/altera_up_ps2_data_in.v @@ -0,0 +1,198 @@ +/***************************************************************************** + * * + * Module: Altera_UP_PS2_Data_In * + * Description: * + * This module accepts incoming data from a PS2 core. * + * * + *****************************************************************************/ + + +module Altera_UP_PS2_Data_In ( + // Inputs + clk, + reset, + + wait_for_incoming_data, + start_receiving_data, + + ps2_clk_posedge, + ps2_clk_negedge, + ps2_data, + + // Bidirectionals + + // Outputs + received_data, + received_data_en // If 1 - new data has been received +); + + +/***************************************************************************** + * Parameter Declarations * + *****************************************************************************/ + + +/***************************************************************************** + * Port Declarations * + *****************************************************************************/ +// Inputs +input clk; +input reset; + +input wait_for_incoming_data; +input start_receiving_data; + +input ps2_clk_posedge; +input ps2_clk_negedge; +input ps2_data; + +// Bidirectionals + +// Outputs +output reg [7:0] received_data; + +output reg received_data_en; + +/***************************************************************************** + * Constant Declarations * + *****************************************************************************/ +// states +localparam PS2_STATE_0_IDLE = 3'h0, + PS2_STATE_1_WAIT_FOR_DATA = 3'h1, + PS2_STATE_2_DATA_IN = 3'h2, + PS2_STATE_3_PARITY_IN = 3'h3, + PS2_STATE_4_STOP_IN = 3'h4; + +/***************************************************************************** + * Internal wires and registers Declarations * + *****************************************************************************/ +// Internal Wires +reg [3:0] data_count; +reg [7:0] data_shift_reg; + +// State Machine Registers +reg [2:0] ns_ps2_receiver; +reg [2:0] s_ps2_receiver; + +/***************************************************************************** + * Finite State Machine(s) * + *****************************************************************************/ + +always @(posedge clk) +begin + if (reset == 1'b1) + s_ps2_receiver <= PS2_STATE_0_IDLE; + else + s_ps2_receiver <= ns_ps2_receiver; +end + +always @(*) +begin + // Defaults + ns_ps2_receiver = PS2_STATE_0_IDLE; + + case (s_ps2_receiver) + PS2_STATE_0_IDLE: + begin + if ((wait_for_incoming_data == 1'b1) && + (received_data_en == 1'b0)) + ns_ps2_receiver = PS2_STATE_1_WAIT_FOR_DATA; + else if ((start_receiving_data == 1'b1) && + (received_data_en == 1'b0)) + ns_ps2_receiver = PS2_STATE_2_DATA_IN; + else + ns_ps2_receiver = PS2_STATE_0_IDLE; + end + PS2_STATE_1_WAIT_FOR_DATA: + begin + if ((ps2_data == 1'b0) && (ps2_clk_posedge == 1'b1)) + ns_ps2_receiver = PS2_STATE_2_DATA_IN; + else if (wait_for_incoming_data == 1'b0) + ns_ps2_receiver = PS2_STATE_0_IDLE; + else + ns_ps2_receiver = PS2_STATE_1_WAIT_FOR_DATA; + end + PS2_STATE_2_DATA_IN: + begin + if ((data_count == 3'h7) && (ps2_clk_posedge == 1'b1)) + ns_ps2_receiver = PS2_STATE_3_PARITY_IN; + else + ns_ps2_receiver = PS2_STATE_2_DATA_IN; + end + PS2_STATE_3_PARITY_IN: + begin + if (ps2_clk_posedge == 1'b1) + ns_ps2_receiver = PS2_STATE_4_STOP_IN; + else + ns_ps2_receiver = PS2_STATE_3_PARITY_IN; + end + PS2_STATE_4_STOP_IN: + begin + if (ps2_clk_posedge == 1'b1) + ns_ps2_receiver = PS2_STATE_0_IDLE; + else + ns_ps2_receiver = PS2_STATE_4_STOP_IN; + end + default: + begin + ns_ps2_receiver = PS2_STATE_0_IDLE; + end + endcase +end + +/***************************************************************************** + * Sequential logic * + *****************************************************************************/ + + +always @(posedge clk) +begin + if (reset == 1'b1) + data_count <= 3'h0; + else if ((s_ps2_receiver == PS2_STATE_2_DATA_IN) && + (ps2_clk_posedge == 1'b1)) + data_count <= data_count + 3'h1; + else if (s_ps2_receiver != PS2_STATE_2_DATA_IN) + data_count <= 3'h0; +end + +always @(posedge clk) +begin + if (reset == 1'b1) + data_shift_reg <= 8'h00; + else if ((s_ps2_receiver == PS2_STATE_2_DATA_IN) && + (ps2_clk_posedge == 1'b1)) + data_shift_reg <= {ps2_data, data_shift_reg[7:1]}; +end + +always @(posedge clk) +begin + if (reset == 1'b1) + received_data <= 8'h00; + else if (s_ps2_receiver == PS2_STATE_4_STOP_IN) + received_data <= data_shift_reg; +end + +always @(posedge clk) +begin + if (reset == 1'b1) + received_data_en <= 1'b0; + else if ((s_ps2_receiver == PS2_STATE_4_STOP_IN) && + (ps2_clk_posedge == 1'b1)) + received_data_en <= 1'b1; + else + received_data_en <= 1'b0; +end + +/***************************************************************************** + * Combinational logic * + *****************************************************************************/ + + +/***************************************************************************** + * Internal Modules * + *****************************************************************************/ + + +endmodule + diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/build_id.tcl b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/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/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/build_id.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/build_id.v new file mode 100644 index 00000000..a966c8e6 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171116" +`define BUILD_TIME "061557" diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/defs.vh b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/defs.vh new file mode 100644 index 00000000..c62125e2 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/defs.vh @@ -0,0 +1,288 @@ +`ifndef RIVERRAID_DEFS +`define RIVERRAID_DEFS + +// КоличеÑтво объектов в маÑÑиве берегов, оÑтровов и врагов +// Ð’Ñ‹ÑтавлÑть ÑоответÑтвенно кол-ву Ñлементов в RIVER_FLOW, ISLAND_FLOW и ENTITY_FLOW +`define RIVER_FLOW_SIZE 66 +`define ISLAND_FLOW_SIZE 24 +`define ENTITY_FLOW_SIZE 47 + +// Format PixelClock ActiveVideo FrontPorch SyncPulse BackPorch ActiveVideo FrontPorch SyncPulse BackPorch +// 1024x768,60Hz 65.000 1024 24 136 160 768 3 6 29 +// Параметры Ð´Ð»Ñ VGA генератора +//`define H_DISP 1024 +//`define H_FPORCH 24 +//`define H_SYNC 136 +//`define H_BPORCH 160 +//`define V_DISP 768 +//`define V_FPORCH 3 +//`define V_SYNC 6 +//`define V_BPORCH 29 +//`define SCREEN_WIDTH 11'd1024 +//`define SCREEN_HEIGHT 11'd768 + +//1280x1024 +`define H_DISP 1280 +`define H_FPORCH 48 +`define H_SYNC 112 +`define H_BPORCH 248 +`define V_DISP 1024 +`define V_FPORCH 1 +`define V_SYNC 3 +`define V_BPORCH 38 +`define SCREEN_WIDTH 11'd1280 +`define SCREEN_HEIGHT 11'd1024 + +`define SCREEN_MAX_X (`SCREEN_WIDTH - 1) +`define SCREEN_MAX_Y (`SCREEN_HEIGHT - 1) +`define SCREEN_CENTER_X (`SCREEN_WIDTH/2 - 1) + +// СкороÑть Ñкролинга. За 1 прориÑовку Ñкрана будет Ñкролинг на +// (FRAME_EVERY_SCROLLS / SCROLL_EVERY_FRAMES) пикÑелей +`define FRAME_EVERY_SCROLLS 4 +`define SCROLL_EVERY_FRAMES 1 +// СкороÑть Ñкролинга когда игрок замедлÑет полет +`define SLOW_SCROLL_SPEED (`FRAME_EVERY_SCROLLS/2) +// СкороÑть Ñкролинга в начале раунда +`define START_SCROLL_SPEED 8 + +// МакÑимальное одновременное количеÑтво врагов и домов на Ñкране +`define ENTITIES_ON_FRAME 10 +// Ширина и выÑота Ñпрайта "корабль" +`define SPRITE_SHIP_WIDTH 128 +`define SPRITE_SHIP_HEIGHT 28 +// Ширина и выÑота Ñпрайта "Ñамолет" +`define SPRITE_PLANE_WIDTH 128 +`define SPRITE_PLANE_HEIGHT 31 +// Ширина и выÑота Ñпрайта "вертолет" +`define SPRITE_HELICOPTER_WIDTH 64 +`define SPRITE_HELICOPTER_HEIGHT 26 +// Ширина и выÑота Ñпрайта "Ñтроение" +`define SPRITE_BUILDING_WIDTH 64 +`define SPRITE_BUILDING_HEIGHT 107 + +`define SPRITE_FUEL_WIDTH 64 +`define SPRITE_FUEL_HEIGHT 122 + +`define BRIDGE_HEIGHT 80 + +// Ширина и выÑота выпущенной ракеты +`define SPRITE_MISSILE_WIDTH 5 +`define SPRITE_MISSILE_HEIGHT 22 +`define MISSILE_SPEED 20 +`define MISSILE_Y_START (`PLAYER_Y - `SPRITE_MISSILE_HEIGHT) +// Ðа какое раÑÑтоÑние должна отлететь ракета чтобы можно было выпуÑтить новую +`define REMISSILE_DISTANCE 300 +`define REMISSILE_Y_POS (`PLAYER_Y - `SPRITE_MISSILE_HEIGHT - `REMISSILE_DISTANCE) + +// Ширина берега в пикÑелÑÑ… +`define SAND_WIDTH 11'd7 +`define TRANSPARENT_COLOR 3'b000 +`define LAND_START_POS 11'd200 +`define LAND_COLOR 3'b010 +`define SAND_COLOR 3'b110 +`define RIVER_COLOR 3'b001 + +`define PLAYER_WIDTH 64 +`define PLAYER_HEIGHT 86 +`define PLAYER_START_X 640 +`define PLAYER_Y 895 +`define PLAYER_SPEED 7 + +// Ширина датчика топлива +`define FUEL_WIDTH 250 +`define FUEL_HEIGHT 24 +`define FUEL_Y 1000 +`define FUEL_EMPTY_X (`SCREEN_WIDTH - `FUEL_WIDTH)/ 2 +// СкороÑть траты топлива +`define FUEL_DOWN_SPEED 3 +`define FUEL_UP_SPEED 9 +// 1 пикÑель индикатора топлива = 16 единицам топлива +`define FUEL_FULL (`FUEL_WIDTH * 16) + + + +typedef enum { + NONE, + SHIP, + PLANE, + HELICOPTER, + BRIDGE, + FUEL, + BUILDING +} entity_type_t; + + +`define RIVER_FLOW '{\ + '{'d0, 'd0 },\ + '{'d600, 'd1 },\ + '{'d620, 'd4 },\ + '{'d650, 'd0 },\ + '{'d900, 'd1 },\ + '{'d910, 'd2 },\ + '{'d955, 'd0 },\ + '{'d1060, -'d1 },\ + '{'d1120, -'d2 },\ + '{'d1150, -'d4 },\ + '{'d1170, -'d3 },\ + '{'d1210, 'd0 },\ + '{'d1820, 'd2 },\ + '{'d1840, 'd0 },\ + '{'d1910, 'd1 },\ + '{'d1930, 'd0 },\ + '{'d2070, 'd1 },\ + '{'d2090, 'd5 },\ + '{'d2130, 'd2 },\ + '{'d2160, 'd0 },\ + '{'d2260, -'d2 },\ + '{'d2310, -'d1 },\ + '{'d2370, 'd0 },\ + '{'d2880, 'd1 },\ + '{'d2900, 'd2 },\ + '{'d2940, 'd1 },\ + '{'d2960, 'd2 },\ + '{'d2976, 'd0 },\ + '{'d3280, -'d1 },\ + '{'d3290, -'d14 },\ + '{'d3294, 'd0 },\ + '{'d3640, 'd12 },\ + '{'d3648, 'd0 },\ + '{'d4500, -'d3 },\ + '{'d4580, 'd0 },\ + '{'d5300, 'd1 },\ + '{'d5320, 'd3 },\ + '{'d5340, 'd1 },\ + '{'d5370, 'd0 },\ + '{'d5700, 'd2 },\ + '{'d5720, 'd0 },\ + '{'d5820, 'd2 },\ + '{'d5840, 'd0 },\ + '{'d5900, 'd2 },\ + '{'d5920, 'd0 },\ + '{'d6500, 'd2 },\ + '{'d6546, 'd0 },\ + '{'d7100, -'d4 },\ + '{'d7240, 'd0 },\ + '{'d9000, 'd4 },\ + '{'d9138, 'd0 },\ + '{'d10000, -'d1 },\ + '{'d10030, -'d6 },\ + '{'d10060, 'd0 },\ + '{'d10300, -'d1 },\ + '{'d10310, -'d2 },\ + '{'d10320, 'd0 },\ + '{'d11000, 'd1 },\ + '{'d11010, 'd2 },\ + '{'d11020, 'd3 },\ + '{'d11040, 'd0 },\ + '{'d11050, -'d3 },\ + '{'d11060, -'d2 },\ + '{'d11070, -'d1 },\ + '{'d11080, 'd0 },\ + '{24'hffffff, 'd0 }\ +} + +`define ISLAND_FLOW '{\ + '{'d0, 'd0 },\ + '{'d1420, 'd4 },\ + '{'d1470, 'd2 },\ + '{'d1510, 'd1 },\ + '{'d1546, 'd0 },\ + '{'d1750, -'d1 },\ + '{'d1770, -'d2 },\ + '{'d1820, -'d4 },\ + '{'d1860, 'd0 },\ + '{'d1866, -'d4 },\ + '{'d1875, 'd0 },\ + '{'d2500, 'd3 },\ + '{'d2520, 'd0 },\ + '{'d2600, -'d3 },\ + '{'d2620, 'd0 },\ + '{'d5400, 'd8 },\ + '{'d5420, 'd0 },\ + '{'d5500, -'d2 },\ + '{'d5520, 'd0 },\ + '{'d5600, -'d2 },\ + '{'d5620, 'd0 },\ + '{'d5700, -'d4 },\ + '{'d5720, 'd0 },\ + '{'d9000000, 'd0 }\ +} + +`define ENTITY_FLOW '{\ + '{'d530, SHIP, 'd460, 'd2 },\ + '{'d630, SHIP, 'd880, 'd0 },\ + '{'d750, BUILDING, 'd220, 'd0 },\ + '{'d840, HELICOPTER, 'd790, -'d2 },\ + '{'d1100, SHIP, 'd630, 'd9 },\ + '{'d1450, SHIP, 'd810, 'd1 },\ + '{'d1525, BUILDING, 'd610, 'd0 },\ + '{'d1755, PLANE, 'd50, 'd16 },\ + '{'d2050, SHIP, 'd700, 'd3 },\ + '{'d2250, BRIDGE, 'd0, 'd0 },\ + '{'d2590, FUEL, 'd430, 'd0 },\ + '{'d3030, SHIP, 'd610, 'd8 },\ + '{'d3240, BUILDING, 'd1020, 'd0 },\ + '{'d3250, SHIP, 'd700, 'd4 },\ + '{'d3450, SHIP, 'd900, -'d6 },\ + '{'d3580, SHIP, 'd300, -'d5 },\ + '{'d3600, PLANE, 'd50, -'d10 },\ + '{'d3710, SHIP, 'd660, 'd6 },\ + '{'d3930, FUEL, 'd600, 'd0 },\ + '{'d4450, BRIDGE, 'd0, 'd0 },\ + '{'d4455, BUILDING, 'd400, 'd0 },\ + '{'d4470, PLANE, 'd615, 'd20 },\ + '{'d4630, SHIP, 'd620, 'd16 },\ + '{'d4730, HELICOPTER, 'd620, 'd18 },\ + '{'d4860, SHIP, 'd620, 'd22 },\ + '{'d5050, HELICOPTER, 'd620, 'd26 },\ + '{'d5580, FUEL, 'd820, 'd0 },\ + '{'d5581, FUEL, 'd400, 'd0 },\ + '{'d5815, BRIDGE, 'd0, 'd0 },\ + '{'d6010, PLANE, 'd510, -'d20 },\ + '{'d6060, SHIP, 'd580, 'd0 },\ + '{'d6870, PLANE, 'd410, -'d16 },\ + '{'d7010, BUILDING, 'd720, 'd0 },\ + '{'d7030, BUILDING, 'd780, 'd0 },\ + '{'d7300, PLANE, 'd0, 'd10 },\ + '{'d7350, PLANE, 'd0, -'d10 },\ + '{'d7420, SHIP, 'd60, 'd9 },\ + '{'d7600, SHIP, 'd600, 'd0 },\ + '{'d7800, SHIP, 'd950, 'd0 },\ + '{'d8090, SHIP, 'd350, 'd0 },\ + '{'d8270, HELICOPTER, 'd200, -'d12 },\ + '{'d8460, HELICOPTER, 'd900, 'd12 },\ + '{'d8650, FUEL, 'd100, 'd0 },\ + '{'d9400, FUEL, 'd610, 'd0 },\ + '{'d9500, HELICOPTER, 'd580, 'd0 },\ + '{'d9560, HELICOPTER, 'd630, 'd0 },\ + '{'d10500, SHIP, 'd420, -'d32 }\ +} + + +`define MISSILE_SPRITE '{\ + 20'h00700,\ + 20'h07770,\ + 20'h87770,\ + 20'h77777,\ + 20'h77777,\ + 20'h77777,\ + 20'h77777,\ + 20'h07770,\ + 20'h07770,\ + 20'h77777,\ + 20'h77777,\ + 20'h77777,\ + 20'h77777,\ + 20'h77777,\ + 20'h77777,\ + 20'h77777,\ + 20'h77777,\ + 20'h77777,\ + 20'h74447,\ + 20'h74447,\ + 20'h04440,\ + 20'h04440\ +} + +`endif \ No newline at end of file diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/hq2x.sv b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/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/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/keyboard.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/keyboard.v new file mode 100644 index 00000000..a9a03f56 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/keyboard.v @@ -0,0 +1,83 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + output [7:0] code, + output input_strobe, + 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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/mist_io.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/mist_io.v new file mode 100644 index 00000000..ab9ef8ad --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/mist_io.v @@ -0,0 +1,532 @@ +// +// 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, + + // ARM -> FPGA download + input ioctl_force_erase, + output reg ioctl_download = 0, // signal indicating an active download + output reg ioctl_erasing = 0, // signal indicating an active erase + output reg [7:0] ioctl_index, // menu index used to upload the file + output reg ioctl_wr = 0, + 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 [7: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; + +// 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]; + + 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 + case(ioctl_index) + 0: addr <= 'h080000; // BOOT ROM + 'h01: addr <= 'h000100; // ROM file + 'h41: addr <= 'h000100; // COM file + 'h81: addr <= 'h000000; // C00 file + 'hC1: addr <= 'h010000; // EDD file + default: addr <= 'h100000; // FDD file + endcase + 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 + +reg [24:0] erase_mask; +wire [24:0] next_erase = (ioctl_addr + 1'd1) & erase_mask; + +always@(posedge clk_sys) begin + reg rclkD, rclkD2; + reg old_force = 0; + reg [5:0] erase_clk_div; + reg [24:0] end_addr; + reg erase_trigger = 0; + + rclkD <= rclk; + rclkD2 <= rclkD; + ioctl_wr <= 0; + + if(rclkD & ~rclkD2) begin + ioctl_dout <= data_w; + ioctl_addr <= addr_w; + ioctl_wr <= 1; + end + + if(ioctl_download) begin + old_force <= 0; + ioctl_erasing <= 0; + erase_trigger <= (ioctl_index == 1); + end else begin + + old_force <= ioctl_force_erase; + + // start erasing + if(erase_trigger) begin + erase_trigger <= 0; + erase_mask <= 'hFFFF; + end_addr <= 'h0100; + erase_clk_div <= 1; + ioctl_erasing <= 1; + end else if((ioctl_force_erase & ~old_force)) begin + erase_trigger <= 0; + ioctl_addr <= 'h1FFFFFF; + erase_mask <= 'h1FFFFFF; + end_addr <= 'h0050000; + erase_clk_div <= 1; + ioctl_erasing <= 1; + end else if(ioctl_erasing) begin + erase_clk_div <= erase_clk_div + 1'd1; + if(!erase_clk_div) begin + if(next_erase == end_addr) ioctl_erasing <= 0; + else begin + ioctl_addr <= next_erase; + ioctl_dout <= 0; + ioctl_wr <= 1; + end + end + end + end +end + +endmodule \ No newline at end of file diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/osd.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/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/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/scandoubler.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/scandoubler.v new file mode 100644 index 00000000..9414a959 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/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 +`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 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 +); + + +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/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/sigma_delta_dac.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/sigma_delta_dac.v new file mode 100644 index 00000000..bba2c552 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/sigma_delta_dac.v @@ -0,0 +1,33 @@ +// +// PWM DAC +// +// MSBI is the highest bit number. NOT amount of bits! +// +module sigma_delta_dac #(parameter MSBI=7) +( + output reg DACout, //Average Output feeding analog lowpass + input [MSBI:0] DACin, //DAC input (excess 2**MSBI) + input CLK, + input RESET +); + +reg [MSBI+2:0] DeltaAdder; //Output of Delta Adder +reg [MSBI+2:0] SigmaAdder; //Output of Sigma Adder +reg [MSBI+2:0] SigmaLatch; //Latches output of Sigma Adder +reg [MSBI+2:0] DeltaB; //B input of Delta Adder + +always @(*) DeltaB = {SigmaLatch[MSBI+2], SigmaLatch[MSBI+2]} << (MSBI+1); +always @(*) DeltaAdder = DACin + DeltaB; +always @(*) SigmaAdder = DeltaAdder + SigmaLatch; + +always @(posedge CLK or posedge RESET) begin + if(RESET) begin + SigmaLatch <= 1'b1 << (MSBI+1); + DACout <= 1; + end else begin + SigmaLatch <= SigmaAdder; + DACout <= ~SigmaLatch[MSBI+2]; + end +end + +endmodule diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/video_mixer.sv b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/video_mixer.sv new file mode 100644 index 00000000..d7d79263 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/mist/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'd7, + 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 \ No newline at end of file diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/pll_108.qip b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/pll_108.qip new file mode 100644 index 00000000..a91d3991 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/pll_108.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_108.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_108.ppf"] diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/pll_108.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/pll_108.v new file mode 100644 index 00000000..dbab9989 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/pll_108.v @@ -0,0 +1,348 @@ +// megafunction wizard: %ALTPLL% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altpll + +// ============================================================ +// File Name: pll_108.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_108 ( + areset, + inclk0, + c0, + c1, + locked); + + input areset; + input inclk0; + output c0; + output c1; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [4:0] sub_wire0; + wire sub_wire2; + wire [0:0] sub_wire6 = 1'h0; + wire [0:0] sub_wire3 = sub_wire0[0:0]; + wire [1:1] sub_wire1 = sub_wire0[1:1]; + wire c1 = sub_wire1; + wire locked = sub_wire2; + wire c0 = sub_wire3; + wire sub_wire4 = inclk0; + wire [1:0] sub_wire5 = {sub_wire6, sub_wire4}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire5), + .clk (sub_wire0), + .locked (sub_wire2), + .activeclock (), + .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 (), + .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 = 1, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 4, + altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 1, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 2, + altpll_component.clk1_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_108", + 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_USED", + 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_USED", + 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_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "1" +// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "40" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "108.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "54.000000" +// 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 "1" +// 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 "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: MULT_FACTOR0 NUMERIC "4" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "77" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "108.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "54.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "ps" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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_108.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: 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_CLKENA0 STRING "0" +// Retrieval info: PRIVATE: USE_CLKENA1 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 "1" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "4" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "1" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "2" +// Retrieval info: CONSTANT: CLK1_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_USED" +// 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_USED" +// 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_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// 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: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_108.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_108.ppf TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_108.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_108.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_108.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_108_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_108_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf +// Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/ps2_controller.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/ps2_controller.v new file mode 100644 index 00000000..46abe825 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/ps2_controller.v @@ -0,0 +1,269 @@ +/***************************************************************************** + * * + * Module: Altera_UP_PS2 * + * Description: * + * This module communicates with the PS2 core. * + * * + *****************************************************************************/ + +module PS2_Controller #(parameter INITIALIZE_MOUSE = 0) ( + // Inputs + CLOCK_50, + reset, + + the_command, + send_command, + + // Bidirectionals + PS2_CLK, // PS2 Clock + PS2_DAT, // PS2 Data + + // Outputs + command_was_sent, + error_communication_timed_out, + + received_data, + received_data_en // If 1 - new data has been received +); + +/***************************************************************************** + * Parameter Declarations * + *****************************************************************************/ + + +/***************************************************************************** + * Port Declarations * + *****************************************************************************/ +// Inputs +input CLOCK_50; +input reset; + +input [7:0] the_command; +input send_command; + +// Bidirectionals +inout PS2_CLK; +inout PS2_DAT; + +// Outputs +output command_was_sent; +output error_communication_timed_out; + +output [7:0] received_data; +output received_data_en; + +wire [7:0] the_command_w; +wire send_command_w, command_was_sent_w, error_communication_timed_out_w; + +generate + if(INITIALIZE_MOUSE) begin + assign the_command_w = init_done ? the_command : 8'hf4; + assign send_command_w = init_done ? send_command : (!command_was_sent_w && !error_communication_timed_out_w); + assign command_was_sent = init_done ? command_was_sent_w : 0; + assign error_communication_timed_out = init_done ? error_communication_timed_out_w : 1; + + reg init_done; + + always @(posedge CLOCK_50) + if(reset) init_done <= 0; + else if(command_was_sent_w) init_done <= 1; + + end else begin + assign the_command_w = the_command; + assign send_command_w = send_command; + assign command_was_sent = command_was_sent_w; + assign error_communication_timed_out = error_communication_timed_out_w; + end +endgenerate + +/***************************************************************************** + * Constant Declarations * + *****************************************************************************/ +// states +localparam PS2_STATE_0_IDLE = 3'h0, + PS2_STATE_1_DATA_IN = 3'h1, + PS2_STATE_2_COMMAND_OUT = 3'h2, + PS2_STATE_3_END_TRANSFER = 3'h3, + PS2_STATE_4_END_DELAYED = 3'h4; + +/***************************************************************************** + * Internal wires and registers Declarations * + *****************************************************************************/ +// Internal Wires +wire ps2_clk_posedge; +wire ps2_clk_negedge; + +wire start_receiving_data; +wire wait_for_incoming_data; + +// Internal Registers +reg [7:0] idle_counter; + +reg ps2_clk_reg; +reg ps2_data_reg; +reg last_ps2_clk; + +// State Machine Registers +reg [2:0] ns_ps2_transceiver; +reg [2:0] s_ps2_transceiver; + +/***************************************************************************** + * Finite State Machine(s) * + *****************************************************************************/ + +always @(posedge CLOCK_50) +begin + if (reset == 1'b1) + s_ps2_transceiver <= PS2_STATE_0_IDLE; + else + s_ps2_transceiver <= ns_ps2_transceiver; +end + +always @(*) +begin + // Defaults + ns_ps2_transceiver = PS2_STATE_0_IDLE; + + case (s_ps2_transceiver) + PS2_STATE_0_IDLE: + begin + if ((idle_counter == 8'hFF) && + (send_command == 1'b1)) + ns_ps2_transceiver = PS2_STATE_2_COMMAND_OUT; + else if ((ps2_data_reg == 1'b0) && (ps2_clk_posedge == 1'b1)) + ns_ps2_transceiver = PS2_STATE_1_DATA_IN; + else + ns_ps2_transceiver = PS2_STATE_0_IDLE; + end + PS2_STATE_1_DATA_IN: + begin + if ((received_data_en == 1'b1)/* && (ps2_clk_posedge == 1'b1)*/) + ns_ps2_transceiver = PS2_STATE_0_IDLE; + else + ns_ps2_transceiver = PS2_STATE_1_DATA_IN; + end + PS2_STATE_2_COMMAND_OUT: + begin + if ((command_was_sent == 1'b1) || + (error_communication_timed_out == 1'b1)) + ns_ps2_transceiver = PS2_STATE_3_END_TRANSFER; + else + ns_ps2_transceiver = PS2_STATE_2_COMMAND_OUT; + end + PS2_STATE_3_END_TRANSFER: + begin + if (send_command == 1'b0) + ns_ps2_transceiver = PS2_STATE_0_IDLE; + else if ((ps2_data_reg == 1'b0) && (ps2_clk_posedge == 1'b1)) + ns_ps2_transceiver = PS2_STATE_4_END_DELAYED; + else + ns_ps2_transceiver = PS2_STATE_3_END_TRANSFER; + end + PS2_STATE_4_END_DELAYED: + begin + if (received_data_en == 1'b1) + begin + if (send_command == 1'b0) + ns_ps2_transceiver = PS2_STATE_0_IDLE; + else + ns_ps2_transceiver = PS2_STATE_3_END_TRANSFER; + end + else + ns_ps2_transceiver = PS2_STATE_4_END_DELAYED; + end + default: + ns_ps2_transceiver = PS2_STATE_0_IDLE; + endcase +end + +/***************************************************************************** + * Sequential logic * + *****************************************************************************/ + +always @(posedge CLOCK_50) +begin + if (reset == 1'b1) + begin + last_ps2_clk <= 1'b1; + ps2_clk_reg <= 1'b1; + + ps2_data_reg <= 1'b1; + end + else + begin + last_ps2_clk <= ps2_clk_reg; + ps2_clk_reg <= PS2_CLK; + + ps2_data_reg <= PS2_DAT; + end +end + +always @(posedge CLOCK_50) +begin + if (reset == 1'b1) + idle_counter <= 6'h00; + else if ((s_ps2_transceiver == PS2_STATE_0_IDLE) && + (idle_counter != 8'hFF)) + idle_counter <= idle_counter + 6'h01; + else if (s_ps2_transceiver != PS2_STATE_0_IDLE) + idle_counter <= 6'h00; +end + +/***************************************************************************** + * Combinational logic * + *****************************************************************************/ + +assign ps2_clk_posedge = + ((ps2_clk_reg == 1'b1) && (last_ps2_clk == 1'b0)) ? 1'b1 : 1'b0; +assign ps2_clk_negedge = + ((ps2_clk_reg == 1'b0) && (last_ps2_clk == 1'b1)) ? 1'b1 : 1'b0; + +assign start_receiving_data = (s_ps2_transceiver == PS2_STATE_1_DATA_IN); +assign wait_for_incoming_data = + (s_ps2_transceiver == PS2_STATE_3_END_TRANSFER); + +/***************************************************************************** + * Internal Modules * + *****************************************************************************/ + +Altera_UP_PS2_Data_In PS2_Data_In ( + // Inputs + .clk (CLOCK_50), + .reset (reset), + + .wait_for_incoming_data (wait_for_incoming_data), + .start_receiving_data (start_receiving_data), + + .ps2_clk_posedge (ps2_clk_posedge), + .ps2_clk_negedge (ps2_clk_negedge), + .ps2_data (ps2_data_reg), + + // Bidirectionals + + // Outputs + .received_data (received_data), + .received_data_en (received_data_en) +); + +Altera_UP_PS2_Command_Out PS2_Command_Out ( + // Inputs + .clk (CLOCK_50), + .reset (reset), + + .the_command (the_command_w), + .send_command (send_command_w), + + .ps2_clk_posedge (ps2_clk_posedge), + .ps2_clk_negedge (ps2_clk_negedge), + + // Bidirectionals + .PS2_CLK (PS2_CLK), + .PS2_DAT (PS2_DAT), + + // Outputs + .command_was_sent (command_was_sent_w), + .error_communication_timed_out (error_communication_timed_out_w) +); + +endmodule + diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_building.mif b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_building.mif new file mode 100644 index 00000000..279f6f6d --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_building.mif @@ -0,0 +1,6858 @@ +WIDTH=4; +DEPTH=8000; + +ADDRESS_RADIX=UNS; +DATA_RADIX=HEX; + +CONTENT BEGIN + + 0 : 0; + 1 : 0; + 2 : 0; + 3 : 0; + 4 : 0; + 5 : 0; + 6 : 0; + 7 : 0; + 8 : 0; + 9 : 0; + 10 : 0; + 11 : 0; + 12 : 0; + 13 : 0; + 14 : 0; + 15 : 0; + 16 : 0; + 17 : 0; + 18 : 6; + 19 : 6; + 20 : 8; + 21 : 8; + 22 : 8; + 23 : 8; + 24 : 6; + 25 : 4; + 26 : 6; + 27 : 6; + 28 : 6; + 29 : 6; + 30 : 4; + 31 : 8; + 32 : 8; + 33 : 8; + 34 : 8; + 35 : 6; + 36 : 8; + 37 : 8; + 38 : 4; + 39 : 6; + 40 : 6; + 41 : 0; + 42 : 0; + 43 : 0; + 44 : 0; + 45 : 0; + 46 : 0; + 47 : 0; + 48 : 0; + 49 : 0; + 50 : 0; + 51 : 0; + 52 : 0; + 53 : 0; + 54 : 0; + 55 : 0; + 56 : 0; + 57 : 0; + 58 : 0; + 59 : 0; + 60 : 0; + 61 : 0; + 62 : 0; + 63 : 0; + 64 : 0; + 65 : 0; + 66 : 0; + 67 : 0; + 68 : 0; + 69 : 0; + 70 : 0; + 71 : 0; + 72 : 0; + 73 : 0; + 74 : 0; + 75 : 0; + 76 : 0; + 77 : 0; + 78 : 0; + 79 : 0; + 80 : 0; + 81 : 0; + 82 : 4; + 83 : 4; + 84 : 6; + 85 : 6; + 86 : 0; + 87 : 6; + 88 : 6; + 89 : 6; + 90 : 6; + 91 : 6; + 92 : 6; + 93 : 6; + 94 : 6; + 95 : 6; + 96 : 8; + 97 : 8; + 98 : 4; + 99 : 6; + 100 : 8; + 101 : 8; + 102 : 8; + 103 : 8; + 104 : 4; + 105 : 6; + 106 : 4; + 107 : 0; + 108 : 0; + 109 : 0; + 110 : 0; + 111 : 0; + 112 : 0; + 113 : 0; + 114 : 0; + 115 : 0; + 116 : 0; + 117 : 0; + 118 : 0; + 119 : 0; + 120 : 0; + 121 : 0; + 122 : 0; + 123 : 0; + 124 : 0; + 125 : 0; + 126 : 0; + 127 : 0; + 128 : 0; + 129 : 0; + 130 : 0; + 131 : 0; + 132 : 0; + 133 : 0; + 134 : 0; + 135 : 0; + 136 : 0; + 137 : 0; + 138 : 0; + 139 : 0; + 140 : 0; + 141 : 0; + 142 : 0; + 143 : 0; + 144 : 0; + 145 : 0; + 146 : 6; + 147 : 6; + 148 : 6; + 149 : 6; + 150 : 6; + 151 : 6; + 152 : 6; + 153 : 6; + 154 : 6; + 155 : 6; + 156 : 6; + 157 : 6; + 158 : 4; + 159 : 4; + 160 : 8; + 161 : 8; + 162 : 4; + 163 : 6; + 164 : 8; + 165 : 8; + 166 : 8; + 167 : 8; + 168 : 8; + 169 : 8; + 170 : 4; + 171 : 6; + 172 : 4; + 173 : 0; + 174 : 0; + 175 : 0; + 176 : 0; + 177 : 0; + 178 : 0; + 179 : 0; + 180 : 0; + 181 : 0; + 182 : 0; + 183 : 0; + 184 : 0; + 185 : 0; + 186 : 0; + 187 : 0; + 188 : 0; + 189 : 0; + 190 : 0; + 191 : 0; + 192 : 0; + 193 : 0; + 194 : 0; + 195 : 0; + 196 : 0; + 197 : 0; + 198 : 0; + 199 : 0; + 200 : 0; + 201 : 4; + 202 : 4; + 203 : 4; + 204 : 4; + 205 : 0; + 206 : 0; + 207 : 0; + 208 : 0; + 209 : 4; + 210 : 6; + 211 : 6; + 212 : 6; + 213 : 6; + 214 : 6; + 215 : 6; + 216 : 6; + 217 : 6; + 218 : 6; + 219 : 6; + 220 : 4; + 221 : 4; + 222 : 4; + 223 : 6; + 224 : 8; + 225 : 8; + 226 : 8; + 227 : 8; + 228 : 8; + 229 : 8; + 230 : 8; + 231 : 8; + 232 : 8; + 233 : 8; + 234 : 8; + 235 : 8; + 236 : 4; + 237 : 4; + 238 : 4; + 239 : 0; + 240 : 0; + 241 : 0; + 242 : 0; + 243 : 0; + 244 : 0; + 245 : 0; + 246 : 0; + 247 : 0; + 248 : 0; + 249 : 0; + 250 : 0; + 251 : 0; + 252 : 0; + 253 : 0; + 254 : 0; + 255 : 0; + 256 : 0; + 257 : 0; + 258 : 0; + 259 : 0; + 260 : 0; + 261 : 0; + 262 : 0; + 263 : 6; + 264 : 6; + 265 : 4; + 266 : 0; + 267 : 4; + 268 : 4; + 269 : 6; + 270 : 0; + 271 : 6; + 272 : 6; + 273 : 6; + 274 : 6; + 275 : 6; + 276 : 6; + 277 : 6; + 278 : 6; + 279 : 6; + 280 : 6; + 281 : 6; + 282 : 4; + 283 : 4; + 284 : 4; + 285 : 6; + 286 : 6; + 287 : 6; + 288 : 8; + 289 : 8; + 290 : 8; + 291 : 8; + 292 : 8; + 293 : 8; + 294 : 8; + 295 : 8; + 296 : 8; + 297 : 8; + 298 : 8; + 299 : 8; + 300 : 8; + 301 : 8; + 302 : 4; + 303 : 6; + 304 : 6; + 305 : 0; + 306 : 0; + 307 : 0; + 308 : 0; + 309 : 0; + 310 : 0; + 311 : 0; + 312 : 0; + 313 : 0; + 314 : 0; + 315 : 0; + 316 : 0; + 317 : 0; + 318 : 0; + 319 : 0; + 320 : 0; + 321 : 0; + 322 : 0; + 323 : 0; + 324 : 0; + 325 : 4; + 326 : 6; + 327 : 4; + 328 : 4; + 329 : 8; + 330 : 8; + 331 : 8; + 332 : 8; + 333 : 4; + 334 : 6; + 335 : 6; + 336 : 6; + 337 : 6; + 338 : 6; + 339 : 6; + 340 : 6; + 341 : 6; + 342 : 6; + 343 : 6; + 344 : 4; + 345 : 4; + 346 : 4; + 347 : 6; + 348 : 6; + 349 : 6; + 350 : 6; + 351 : 6; + 352 : 8; + 353 : 8; + 354 : 8; + 355 : 8; + 356 : 8; + 357 : 8; + 358 : 8; + 359 : 8; + 360 : 8; + 361 : 8; + 362 : 8; + 363 : 8; + 364 : 8; + 365 : 8; + 366 : 8; + 367 : 8; + 368 : 4; + 369 : 6; + 370 : 4; + 371 : 0; + 372 : 0; + 373 : 0; + 374 : 0; + 375 : 0; + 376 : 0; + 377 : 0; + 378 : 0; + 379 : 0; + 380 : 0; + 381 : 0; + 382 : 0; + 383 : 0; + 384 : 0; + 385 : 0; + 386 : 0; + 387 : 0; + 388 : 6; + 389 : 4; + 390 : 8; + 391 : 8; + 392 : 8; + 393 : 8; + 394 : 8; + 395 : 8; + 396 : 8; + 397 : 8; + 398 : 4; + 399 : 8; + 400 : 4; + 401 : 6; + 402 : 6; + 403 : 6; + 404 : 6; + 405 : 6; + 406 : 4; + 407 : 4; + 408 : 4; + 409 : 6; + 410 : 6; + 411 : 6; + 412 : 6; + 413 : 6; + 414 : 6; + 415 : 4; + 416 : 8; + 417 : 8; + 418 : 8; + 419 : 8; + 420 : 8; + 421 : 8; + 422 : 8; + 423 : 8; + 424 : 8; + 425 : 4; + 426 : 4; + 427 : 4; + 428 : 8; + 429 : 8; + 430 : 8; + 431 : 8; + 432 : 8; + 433 : 8; + 434 : 4; + 435 : 4; + 436 : 4; + 437 : 0; + 438 : 0; + 439 : 0; + 440 : 0; + 441 : 0; + 442 : 0; + 443 : 0; + 444 : 0; + 445 : 0; + 446 : 0; + 447 : 0; + 448 : 0; + 449 : 0; + 450 : 0; + 451 : 4; + 452 : 6; + 453 : 4; + 454 : 8; + 455 : 8; + 456 : 8; + 457 : 8; + 458 : 8; + 459 : 8; + 460 : 8; + 461 : 8; + 462 : 8; + 463 : 8; + 464 : 6; + 465 : 6; + 466 : 4; + 467 : 6; + 468 : 4; + 469 : 4; + 470 : 4; + 471 : 6; + 472 : 6; + 473 : 6; + 474 : 6; + 475 : 6; + 476 : 6; + 477 : 8; + 478 : 8; + 479 : 8; + 480 : 8; + 481 : 8; + 482 : 8; + 483 : 8; + 484 : 8; + 485 : 8; + 486 : 8; + 487 : 8; + 488 : 6; + 489 : 6; + 490 : 6; + 491 : 6; + 492 : 6; + 493 : 8; + 494 : 8; + 495 : 8; + 496 : 8; + 497 : 8; + 498 : 8; + 499 : 8; + 500 : 4; + 501 : 4; + 502 : 4; + 503 : 0; + 504 : 0; + 505 : 0; + 506 : 0; + 507 : 0; + 508 : 0; + 509 : 0; + 510 : 0; + 511 : 0; + 512 : 0; + 513 : 0; + 514 : 0; + 515 : 4; + 516 : 4; + 517 : 6; + 518 : 6; + 519 : 6; + 520 : 8; + 521 : 8; + 522 : 8; + 523 : 8; + 524 : 8; + 525 : 8; + 526 : 8; + 527 : 6; + 528 : 6; + 529 : 6; + 530 : 6; + 531 : 6; + 532 : 4; + 533 : 6; + 534 : 6; + 535 : 6; + 536 : 6; + 537 : 6; + 538 : 6; + 539 : 8; + 540 : 8; + 541 : 8; + 542 : 8; + 543 : 8; + 544 : 8; + 545 : 8; + 546 : 8; + 547 : 8; + 548 : 8; + 549 : 8; + 550 : 6; + 551 : 6; + 552 : 6; + 553 : 6; + 554 : 6; + 555 : 6; + 556 : 6; + 557 : 6; + 558 : 4; + 559 : 8; + 560 : 8; + 561 : 8; + 562 : 8; + 563 : 8; + 564 : 8; + 565 : 8; + 566 : 4; + 567 : 6; + 568 : 4; + 569 : 0; + 570 : 0; + 571 : 0; + 572 : 0; + 573 : 0; + 574 : 0; + 575 : 0; + 576 : 0; + 577 : 0; + 578 : 0; + 579 : 4; + 580 : 4; + 581 : 6; + 582 : 6; + 583 : 4; + 584 : 4; + 585 : 6; + 586 : 8; + 587 : 8; + 588 : 8; + 589 : 8; + 590 : 8; + 591 : 8; + 592 : 6; + 593 : 6; + 594 : 6; + 595 : 6; + 596 : 6; + 597 : 6; + 598 : 6; + 599 : 6; + 600 : 6; + 601 : 8; + 602 : 8; + 603 : 8; + 604 : 8; + 605 : 8; + 606 : 8; + 607 : 8; + 608 : 8; + 609 : 8; + 610 : 6; + 611 : 4; + 612 : 4; + 613 : 6; + 614 : 6; + 615 : 6; + 616 : 6; + 617 : 6; + 618 : 6; + 619 : 6; + 620 : 6; + 621 : 4; + 622 : 8; + 623 : 8; + 624 : 8; + 625 : 8; + 626 : 8; + 627 : 8; + 628 : 8; + 629 : 8; + 630 : 8; + 631 : 8; + 632 : 4; + 633 : 6; + 634 : 4; + 635 : 0; + 636 : 0; + 637 : 0; + 638 : 0; + 639 : 0; + 640 : 0; + 641 : 0; + 642 : 0; + 643 : 4; + 644 : 6; + 645 : 6; + 646 : 4; + 647 : 0; + 648 : 6; + 649 : 6; + 650 : 4; + 651 : 8; + 652 : 8; + 653 : 8; + 654 : 8; + 655 : 8; + 656 : 6; + 657 : 6; + 658 : 6; + 659 : 6; + 660 : 6; + 661 : 6; + 662 : 6; + 663 : 4; + 664 : 8; + 665 : 8; + 666 : 8; + 667 : 8; + 668 : 8; + 669 : 8; + 670 : 8; + 671 : 8; + 672 : 8; + 673 : 4; + 674 : 4; + 675 : 6; + 676 : 6; + 677 : 6; + 678 : 6; + 679 : 6; + 680 : 6; + 681 : 6; + 682 : 6; + 683 : 4; + 684 : 4; + 685 : 4; + 686 : 4; + 687 : 8; + 688 : 8; + 689 : 8; + 690 : 8; + 691 : 8; + 692 : 8; + 693 : 8; + 694 : 8; + 695 : 8; + 696 : 8; + 697 : 4; + 698 : 4; + 699 : 4; + 700 : 0; + 701 : 0; + 702 : 0; + 703 : 0; + 704 : 0; + 705 : 0; + 706 : 0; + 707 : 4; + 708 : 6; + 709 : 6; + 710 : 0; + 711 : 0; + 712 : 4; + 713 : 4; + 714 : 8; + 715 : 8; + 716 : 8; + 717 : 8; + 718 : 8; + 719 : 8; + 720 : 8; + 721 : 6; + 722 : 6; + 723 : 6; + 724 : 6; + 725 : 8; + 726 : 8; + 727 : 8; + 728 : 8; + 729 : 8; + 730 : 8; + 731 : 8; + 732 : 8; + 733 : 8; + 734 : 8; + 735 : 8; + 736 : 6; + 737 : 6; + 738 : 6; + 739 : 6; + 740 : 6; + 741 : 6; + 742 : 6; + 743 : 6; + 744 : 4; + 745 : 4; + 746 : 4; + 747 : 4; + 748 : 6; + 749 : 6; + 750 : 4; + 751 : 8; + 752 : 8; + 753 : 8; + 754 : 8; + 755 : 8; + 756 : 8; + 757 : 8; + 758 : 6; + 759 : 6; + 760 : 4; + 761 : 4; + 762 : 4; + 763 : 4; + 764 : 0; + 765 : 0; + 766 : 0; + 767 : 0; + 768 : 0; + 769 : 0; + 770 : 0; + 771 : 4; + 772 : 4; + 773 : 6; + 774 : 6; + 775 : 4; + 776 : 8; + 777 : 8; + 778 : 8; + 779 : 8; + 780 : 8; + 781 : 0; + 782 : 8; + 783 : 8; + 784 : 8; + 785 : 8; + 786 : 8; + 787 : 6; + 788 : 8; + 789 : 8; + 790 : 8; + 791 : 8; + 792 : 8; + 793 : 8; + 794 : 8; + 795 : 8; + 796 : 8; + 797 : 8; + 798 : 6; + 799 : 6; + 800 : 6; + 801 : 6; + 802 : 6; + 803 : 6; + 804 : 6; + 805 : 6; + 806 : 6; + 807 : 4; + 808 : 4; + 809 : 4; + 810 : 6; + 811 : 6; + 812 : 6; + 813 : 6; + 814 : 8; + 815 : 8; + 816 : 8; + 817 : 8; + 818 : 8; + 819 : 8; + 820 : 8; + 821 : 8; + 822 : 4; + 823 : 6; + 824 : 6; + 825 : 4; + 826 : 4; + 827 : 4; + 828 : 0; + 829 : 0; + 830 : 0; + 831 : 0; + 832 : 0; + 833 : 0; + 834 : 0; + 835 : 4; + 836 : 4; + 837 : 4; + 838 : 4; + 839 : 6; + 840 : 6; + 841 : 4; + 842 : 8; + 843 : 8; + 844 : 8; + 845 : 8; + 846 : 8; + 847 : 8; + 848 : 4; + 849 : 8; + 850 : 8; + 851 : 8; + 852 : 8; + 853 : 8; + 854 : 8; + 855 : 6; + 856 : 6; + 857 : 6; + 858 : 6; + 859 : 8; + 860 : 8; + 861 : 8; + 862 : 4; + 863 : 4; + 864 : 6; + 865 : 6; + 866 : 6; + 867 : 6; + 868 : 6; + 869 : 4; + 870 : 4; + 871 : 4; + 872 : 6; + 873 : 6; + 874 : 6; + 875 : 6; + 876 : 6; + 877 : 6; + 878 : 8; + 879 : 8; + 880 : 8; + 881 : 8; + 882 : 8; + 883 : 8; + 884 : 8; + 885 : 8; + 886 : 8; + 887 : 4; + 888 : 4; + 889 : 6; + 890 : 4; + 891 : 4; + 892 : 0; + 893 : 0; + 894 : 0; + 895 : 0; + 896 : 0; + 897 : 0; + 898 : 0; + 899 : 4; + 900 : 4; + 901 : 4; + 902 : 4; + 903 : 4; + 904 : 4; + 905 : 6; + 906 : 6; + 907 : 4; + 908 : 8; + 909 : 8; + 910 : 8; + 911 : 8; + 912 : 8; + 913 : 8; + 914 : 8; + 915 : 8; + 916 : 8; + 917 : 8; + 918 : 6; + 919 : 0; + 920 : 6; + 921 : 6; + 922 : 6; + 923 : 8; + 924 : 8; + 925 : 8; + 926 : 6; + 927 : 6; + 928 : 4; + 929 : 4; + 930 : 6; + 931 : 4; + 932 : 4; + 933 : 4; + 934 : 6; + 935 : 6; + 936 : 6; + 937 : 6; + 938 : 6; + 939 : 4; + 940 : 8; + 941 : 8; + 942 : 8; + 943 : 8; + 944 : 8; + 945 : 8; + 946 : 8; + 947 : 8; + 948 : 8; + 949 : 4; + 950 : 4; + 951 : 6; + 952 : 4; + 953 : 4; + 954 : 4; + 955 : 6; + 956 : 0; + 957 : 0; + 958 : 0; + 959 : 0; + 960 : 0; + 961 : 0; + 962 : 0; + 963 : 4; + 964 : 4; + 965 : 4; + 966 : 4; + 967 : 4; + 968 : 6; + 969 : 6; + 970 : 6; + 971 : 6; + 972 : 6; + 973 : 6; + 974 : 6; + 975 : 8; + 976 : 8; + 977 : 8; + 978 : 8; + 979 : 8; + 980 : 8; + 981 : 6; + 982 : 6; + 983 : 6; + 984 : 0; + 985 : 6; + 986 : 8; + 987 : 8; + 988 : 8; + 989 : 8; + 990 : 6; + 991 : 6; + 992 : 6; + 993 : 6; + 994 : 4; + 995 : 4; + 996 : 6; + 997 : 6; + 998 : 6; + 999 : 6; + 1000 : 6; + 1001 : 6; + 1002 : 8; + 1003 : 8; + 1004 : 8; + 1005 : 8; + 1006 : 4; + 1007 : 4; + 1008 : 8; + 1009 : 8; + 1010 : 8; + 1011 : 8; + 1012 : 6; + 1013 : 6; + 1014 : 4; + 1015 : 4; + 1016 : 4; + 1017 : 4; + 1018 : 6; + 1019 : 6; + 1020 : 0; + 1021 : 0; + 1022 : 0; + 1023 : 0; + 1024 : 0; + 1025 : 0; + 1026 : 0; + 1027 : 4; + 1028 : 4; + 1029 : 4; + 1030 : 4; + 1031 : 6; + 1032 : 6; + 1033 : 6; + 1034 : 6; + 1035 : 6; + 1036 : 6; + 1037 : 6; + 1038 : 6; + 1039 : 6; + 1040 : 8; + 1041 : 8; + 1042 : 8; + 1043 : 8; + 1044 : 8; + 1045 : 8; + 1046 : 6; + 1047 : 6; + 1048 : 6; + 1049 : 6; + 1050 : 6; + 1051 : 8; + 1052 : 8; + 1053 : 8; + 1054 : 6; + 1055 : 6; + 1056 : 6; + 1057 : 6; + 1058 : 6; + 1059 : 6; + 1060 : 6; + 1061 : 6; + 1062 : 6; + 1063 : 6; + 1064 : 8; + 1065 : 8; + 1066 : 8; + 1067 : 8; + 1068 : 8; + 1069 : 6; + 1070 : 4; + 1071 : 4; + 1072 : 6; + 1073 : 6; + 1074 : 6; + 1075 : 6; + 1076 : 4; + 1077 : 4; + 1078 : 4; + 1079 : 4; + 1080 : 4; + 1081 : 4; + 1082 : 6; + 1083 : 6; + 1084 : 0; + 1085 : 0; + 1086 : 0; + 1087 : 0; + 1088 : 0; + 1089 : 0; + 1090 : 0; + 1091 : 4; + 1092 : 4; + 1093 : 6; + 1094 : 6; + 1095 : 6; + 1096 : 6; + 1097 : 6; + 1098 : 6; + 1099 : 4; + 1100 : 4; + 1101 : 4; + 1102 : 4; + 1103 : 6; + 1104 : 6; + 1105 : 6; + 1106 : 6; + 1107 : 6; + 1108 : 8; + 1109 : 8; + 1110 : 8; + 1111 : 8; + 1112 : 8; + 1113 : 6; + 1114 : 8; + 1115 : 8; + 1116 : 8; + 1117 : 8; + 1118 : 6; + 1119 : 6; + 1120 : 6; + 1121 : 6; + 1122 : 6; + 1123 : 6; + 1124 : 6; + 1125 : 6; + 1126 : 8; + 1127 : 8; + 1128 : 8; + 1129 : 8; + 1130 : 8; + 1131 : 6; + 1132 : 6; + 1133 : 4; + 1134 : 4; + 1135 : 4; + 1136 : 4; + 1137 : 4; + 1138 : 4; + 1139 : 4; + 1140 : 4; + 1141 : 4; + 1142 : 4; + 1143 : 4; + 1144 : 4; + 1145 : 4; + 1146 : 8; + 1147 : 6; + 1148 : 0; + 1149 : 0; + 1150 : 0; + 1151 : 0; + 1152 : 0; + 1153 : 0; + 1154 : 0; + 1155 : 4; + 1156 : 6; + 1157 : 6; + 1158 : 6; + 1159 : 6; + 1160 : 6; + 1161 : 4; + 1162 : 4; + 1163 : 4; + 1164 : 4; + 1165 : 6; + 1166 : 6; + 1167 : 4; + 1168 : 4; + 1169 : 6; + 1170 : 6; + 1171 : 6; + 1172 : 6; + 1173 : 8; + 1174 : 8; + 1175 : 8; + 1176 : 8; + 1177 : 6; + 1178 : 8; + 1179 : 8; + 1180 : 8; + 1181 : 8; + 1182 : 8; + 1183 : 8; + 1184 : 6; + 1185 : 6; + 1186 : 6; + 1187 : 4; + 1188 : 8; + 1189 : 8; + 1190 : 8; + 1191 : 8; + 1192 : 4; + 1193 : 4; + 1194 : 4; + 1195 : 4; + 1196 : 4; + 1197 : 4; + 1198 : 4; + 1199 : 4; + 1200 : 4; + 1201 : 4; + 1202 : 4; + 1203 : 4; + 1204 : 4; + 1205 : 4; + 1206 : 4; + 1207 : 4; + 1208 : 4; + 1209 : 4; + 1210 : 8; + 1211 : 4; + 1212 : 0; + 1213 : 0; + 1214 : 0; + 1215 : 0; + 1216 : 0; + 1217 : 0; + 1218 : 0; + 1219 : 4; + 1220 : 4; + 1221 : 0; + 1222 : 6; + 1223 : 4; + 1224 : 4; + 1225 : 4; + 1226 : 4; + 1227 : 6; + 1228 : 4; + 1229 : 6; + 1230 : 6; + 1231 : 6; + 1232 : 6; + 1233 : 4; + 1234 : 6; + 1235 : 6; + 1236 : 6; + 1237 : 6; + 1238 : 8; + 1239 : 8; + 1240 : 8; + 1241 : 8; + 1242 : 8; + 1243 : 8; + 1244 : 8; + 1245 : 8; + 1246 : 8; + 1247 : 8; + 1248 : 8; + 1249 : 4; + 1250 : 6; + 1251 : 8; + 1252 : 8; + 1253 : 8; + 1254 : 8; + 1255 : 8; + 1256 : 4; + 1257 : 6; + 1258 : 4; + 1259 : 4; + 1260 : 4; + 1261 : 4; + 1262 : 4; + 1263 : 4; + 1264 : 4; + 1265 : 4; + 1266 : 4; + 1267 : 4; + 1268 : 4; + 1269 : 4; + 1270 : 4; + 1271 : 4; + 1272 : 4; + 1273 : 4; + 1274 : 8; + 1275 : 4; + 1276 : 0; + 1277 : 0; + 1278 : 0; + 1279 : 0; + 1280 : 0; + 1281 : 0; + 1282 : 0; + 1283 : 4; + 1284 : 4; + 1285 : 8; + 1286 : 6; + 1287 : 4; + 1288 : 6; + 1289 : 6; + 1290 : 6; + 1291 : 4; + 1292 : 4; + 1293 : 6; + 1294 : 6; + 1295 : 6; + 1296 : 6; + 1297 : 6; + 1298 : 6; + 1299 : 4; + 1300 : 6; + 1301 : 6; + 1302 : 6; + 1303 : 8; + 1304 : 8; + 1305 : 8; + 1306 : 8; + 1307 : 8; + 1308 : 8; + 1309 : 8; + 1310 : 8; + 1311 : 8; + 1312 : 8; + 1313 : 8; + 1314 : 8; + 1315 : 8; + 1316 : 8; + 1317 : 8; + 1318 : 8; + 1319 : 8; + 1320 : 8; + 1321 : 4; + 1322 : 4; + 1323 : 6; + 1324 : 4; + 1325 : 4; + 1326 : 6; + 1327 : 6; + 1328 : 4; + 1329 : 4; + 1330 : 4; + 1331 : 4; + 1332 : 4; + 1333 : 4; + 1334 : 4; + 1335 : 6; + 1336 : 6; + 1337 : 4; + 1338 : 4; + 1339 : 6; + 1340 : 4; + 1341 : 0; + 1342 : 0; + 1343 : 0; + 1344 : 0; + 1345 : 0; + 1346 : 0; + 1347 : 4; + 1348 : 6; + 1349 : 6; + 1350 : 6; + 1351 : 4; + 1352 : 4; + 1353 : 6; + 1354 : 6; + 1355 : 6; + 1356 : 6; + 1357 : 6; + 1358 : 6; + 1359 : 6; + 1360 : 6; + 1361 : 6; + 1362 : 6; + 1363 : 6; + 1364 : 4; + 1365 : 6; + 1366 : 6; + 1367 : 6; + 1368 : 6; + 1369 : 4; + 1370 : 8; + 1371 : 8; + 1372 : 8; + 1373 : 8; + 1374 : 8; + 1375 : 8; + 1376 : 8; + 1377 : 8; + 1378 : 8; + 1379 : 8; + 1380 : 8; + 1381 : 8; + 1382 : 8; + 1383 : 4; + 1384 : 4; + 1385 : 6; + 1386 : 4; + 1387 : 4; + 1388 : 4; + 1389 : 6; + 1390 : 6; + 1391 : 6; + 1392 : 4; + 1393 : 4; + 1394 : 4; + 1395 : 4; + 1396 : 4; + 1397 : 4; + 1398 : 6; + 1399 : 8; + 1400 : 6; + 1401 : 4; + 1402 : 4; + 1403 : 0; + 1404 : 0; + 1405 : 0; + 1406 : 0; + 1407 : 0; + 1408 : 0; + 1409 : 0; + 1410 : 0; + 1411 : 4; + 1412 : 6; + 1413 : 6; + 1414 : 6; + 1415 : 4; + 1416 : 4; + 1417 : 6; + 1418 : 6; + 1419 : 6; + 1420 : 6; + 1421 : 6; + 1422 : 6; + 1423 : 6; + 1424 : 6; + 1425 : 6; + 1426 : 6; + 1427 : 6; + 1428 : 4; + 1429 : 4; + 1430 : 6; + 1431 : 6; + 1432 : 6; + 1433 : 6; + 1434 : 6; + 1435 : 6; + 1436 : 8; + 1437 : 8; + 1438 : 8; + 1439 : 8; + 1440 : 4; + 1441 : 4; + 1442 : 8; + 1443 : 8; + 1444 : 8; + 1445 : 4; + 1446 : 4; + 1447 : 6; + 1448 : 4; + 1449 : 4; + 1450 : 4; + 1451 : 4; + 1452 : 6; + 1453 : 6; + 1454 : 6; + 1455 : 4; + 1456 : 4; + 1457 : 4; + 1458 : 4; + 1459 : 4; + 1460 : 4; + 1461 : 8; + 1462 : 8; + 1463 : 8; + 1464 : 6; + 1465 : 4; + 1466 : 0; + 1467 : 0; + 1468 : 6; + 1469 : 0; + 1470 : 0; + 1471 : 0; + 1472 : 0; + 1473 : 0; + 1474 : 0; + 1475 : 4; + 1476 : 6; + 1477 : 6; + 1478 : 6; + 1479 : 4; + 1480 : 6; + 1481 : 6; + 1482 : 6; + 1483 : 6; + 1484 : 6; + 1485 : 6; + 1486 : 4; + 1487 : 6; + 1488 : 6; + 1489 : 6; + 1490 : 6; + 1491 : 6; + 1492 : 4; + 1493 : 4; + 1494 : 4; + 1495 : 6; + 1496 : 6; + 1497 : 6; + 1498 : 6; + 1499 : 6; + 1500 : 6; + 1501 : 4; + 1502 : 4; + 1503 : 6; + 1504 : 4; + 1505 : 6; + 1506 : 6; + 1507 : 8; + 1508 : 6; + 1509 : 4; + 1510 : 4; + 1511 : 4; + 1512 : 4; + 1513 : 4; + 1514 : 4; + 1515 : 4; + 1516 : 6; + 1517 : 4; + 1518 : 6; + 1519 : 8; + 1520 : 4; + 1521 : 4; + 1522 : 4; + 1523 : 6; + 1524 : 8; + 1525 : 8; + 1526 : 8; + 1527 : 6; + 1528 : 6; + 1529 : 4; + 1530 : 4; + 1531 : 6; + 1532 : 0; + 1533 : 0; + 1534 : 0; + 1535 : 0; + 1536 : 0; + 1537 : 0; + 1538 : 0; + 1539 : 4; + 1540 : 4; + 1541 : 6; + 1542 : 6; + 1543 : 4; + 1544 : 6; + 1545 : 6; + 1546 : 6; + 1547 : 6; + 1548 : 6; + 1549 : 6; + 1550 : 6; + 1551 : 4; + 1552 : 6; + 1553 : 4; + 1554 : 6; + 1555 : 6; + 1556 : 4; + 1557 : 4; + 1558 : 0; + 1559 : 6; + 1560 : 6; + 1561 : 6; + 1562 : 4; + 1563 : 4; + 1564 : 4; + 1565 : 6; + 1566 : 4; + 1567 : 4; + 1568 : 4; + 1569 : 4; + 1570 : 4; + 1571 : 6; + 1572 : 4; + 1573 : 4; + 1574 : 4; + 1575 : 4; + 1576 : 4; + 1577 : 4; + 1578 : 4; + 1579 : 4; + 1580 : 8; + 1581 : 4; + 1582 : 4; + 1583 : 8; + 1584 : 4; + 1585 : 4; + 1586 : 4; + 1587 : 6; + 1588 : 8; + 1589 : 6; + 1590 : 6; + 1591 : 6; + 1592 : 6; + 1593 : 4; + 1594 : 8; + 1595 : 4; + 1596 : 0; + 1597 : 0; + 1598 : 0; + 1599 : 0; + 1600 : 0; + 1601 : 0; + 1602 : 0; + 1603 : 4; + 1604 : 4; + 1605 : 8; + 1606 : 4; + 1607 : 4; + 1608 : 6; + 1609 : 6; + 1610 : 6; + 1611 : 6; + 1612 : 6; + 1613 : 6; + 1614 : 6; + 1615 : 6; + 1616 : 6; + 1617 : 6; + 1618 : 0; + 1619 : 6; + 1620 : 6; + 1621 : 6; + 1622 : 6; + 1623 : 4; + 1624 : 6; + 1625 : 6; + 1626 : 6; + 1627 : 4; + 1628 : 4; + 1629 : 4; + 1630 : 4; + 1631 : 4; + 1632 : 4; + 1633 : 4; + 1634 : 4; + 1635 : 4; + 1636 : 4; + 1637 : 4; + 1638 : 4; + 1639 : 4; + 1640 : 4; + 1641 : 4; + 1642 : 4; + 1643 : 4; + 1644 : 8; + 1645 : 4; + 1646 : 8; + 1647 : 8; + 1648 : 4; + 1649 : 4; + 1650 : 4; + 1651 : 6; + 1652 : 6; + 1653 : 6; + 1654 : 6; + 1655 : 6; + 1656 : 6; + 1657 : 4; + 1658 : 8; + 1659 : 6; + 1660 : 4; + 1661 : 0; + 1662 : 0; + 1663 : 0; + 1664 : 0; + 1665 : 0; + 1666 : 0; + 1667 : 4; + 1668 : 4; + 1669 : 6; + 1670 : 6; + 1671 : 4; + 1672 : 6; + 1673 : 6; + 1674 : 6; + 1675 : 6; + 1676 : 6; + 1677 : 6; + 1678 : 6; + 1679 : 0; + 1680 : 6; + 1681 : 6; + 1682 : 6; + 1683 : 6; + 1684 : 6; + 1685 : 6; + 1686 : 6; + 1687 : 4; + 1688 : 6; + 1689 : 6; + 1690 : 6; + 1691 : 4; + 1692 : 4; + 1693 : 4; + 1694 : 4; + 1695 : 4; + 1696 : 4; + 1697 : 4; + 1698 : 4; + 1699 : 4; + 1700 : 4; + 1701 : 4; + 1702 : 4; + 1703 : 4; + 1704 : 4; + 1705 : 4; + 1706 : 4; + 1707 : 4; + 1708 : 8; + 1709 : 4; + 1710 : 4; + 1711 : 6; + 1712 : 8; + 1713 : 8; + 1714 : 4; + 1715 : 6; + 1716 : 6; + 1717 : 6; + 1718 : 6; + 1719 : 6; + 1720 : 6; + 1721 : 4; + 1722 : 4; + 1723 : 0; + 1724 : 0; + 1725 : 0; + 1726 : 0; + 1727 : 0; + 1728 : 0; + 1729 : 0; + 1730 : 0; + 1731 : 4; + 1732 : 6; + 1733 : 6; + 1734 : 6; + 1735 : 4; + 1736 : 4; + 1737 : 6; + 1738 : 6; + 1739 : 6; + 1740 : 6; + 1741 : 6; + 1742 : 6; + 1743 : 6; + 1744 : 6; + 1745 : 6; + 1746 : 0; + 1747 : 6; + 1748 : 6; + 1749 : 6; + 1750 : 6; + 1751 : 6; + 1752 : 6; + 1753 : 6; + 1754 : 6; + 1755 : 6; + 1756 : 6; + 1757 : 4; + 1758 : 4; + 1759 : 4; + 1760 : 6; + 1761 : 6; + 1762 : 4; + 1763 : 4; + 1764 : 4; + 1765 : 4; + 1766 : 4; + 1767 : 4; + 1768 : 4; + 1769 : 4; + 1770 : 4; + 1771 : 4; + 1772 : 4; + 1773 : 6; + 1774 : 8; + 1775 : 8; + 1776 : 4; + 1777 : 4; + 1778 : 4; + 1779 : 6; + 1780 : 6; + 1781 : 6; + 1782 : 8; + 1783 : 8; + 1784 : 6; + 1785 : 4; + 1786 : 8; + 1787 : 0; + 1788 : 4; + 1789 : 0; + 1790 : 0; + 1791 : 0; + 1792 : 0; + 1793 : 0; + 1794 : 0; + 1795 : 4; + 1796 : 6; + 1797 : 6; + 1798 : 6; + 1799 : 4; + 1800 : 4; + 1801 : 6; + 1802 : 6; + 1803 : 6; + 1804 : 6; + 1805 : 6; + 1806 : 6; + 1807 : 6; + 1808 : 6; + 1809 : 6; + 1810 : 6; + 1811 : 6; + 1812 : 6; + 1813 : 6; + 1814 : 6; + 1815 : 6; + 1816 : 4; + 1817 : 6; + 1818 : 4; + 1819 : 4; + 1820 : 4; + 1821 : 4; + 1822 : 6; + 1823 : 6; + 1824 : 6; + 1825 : 6; + 1826 : 4; + 1827 : 4; + 1828 : 4; + 1829 : 4; + 1830 : 4; + 1831 : 6; + 1832 : 6; + 1833 : 0; + 1834 : 4; + 1835 : 4; + 1836 : 4; + 1837 : 8; + 1838 : 8; + 1839 : 6; + 1840 : 4; + 1841 : 4; + 1842 : 4; + 1843 : 6; + 1844 : 8; + 1845 : 8; + 1846 : 8; + 1847 : 8; + 1848 : 6; + 1849 : 4; + 1850 : 6; + 1851 : 6; + 1852 : 0; + 1853 : 0; + 1854 : 0; + 1855 : 0; + 1856 : 0; + 1857 : 0; + 1858 : 0; + 1859 : 4; + 1860 : 6; + 1861 : 6; + 1862 : 6; + 1863 : 4; + 1864 : 6; + 1865 : 6; + 1866 : 6; + 1867 : 6; + 1868 : 6; + 1869 : 6; + 1870 : 4; + 1871 : 0; + 1872 : 6; + 1873 : 6; + 1874 : 6; + 1875 : 6; + 1876 : 6; + 1877 : 6; + 1878 : 6; + 1879 : 0; + 1880 : 4; + 1881 : 4; + 1882 : 6; + 1883 : 6; + 1884 : 4; + 1885 : 4; + 1886 : 6; + 1887 : 6; + 1888 : 6; + 1889 : 6; + 1890 : 4; + 1891 : 4; + 1892 : 4; + 1893 : 4; + 1894 : 6; + 1895 : 8; + 1896 : 8; + 1897 : 6; + 1898 : 4; + 1899 : 4; + 1900 : 8; + 1901 : 8; + 1902 : 6; + 1903 : 4; + 1904 : 4; + 1905 : 4; + 1906 : 4; + 1907 : 6; + 1908 : 8; + 1909 : 6; + 1910 : 8; + 1911 : 6; + 1912 : 6; + 1913 : 4; + 1914 : 8; + 1915 : 6; + 1916 : 0; + 1917 : 0; + 1918 : 0; + 1919 : 0; + 1920 : 0; + 1921 : 0; + 1922 : 0; + 1923 : 4; + 1924 : 4; + 1925 : 8; + 1926 : 6; + 1927 : 4; + 1928 : 6; + 1929 : 6; + 1930 : 6; + 1931 : 6; + 1932 : 6; + 1933 : 6; + 1934 : 6; + 1935 : 4; + 1936 : 6; + 1937 : 6; + 1938 : 6; + 1939 : 6; + 1940 : 6; + 1941 : 6; + 1942 : 6; + 1943 : 6; + 1944 : 4; + 1945 : 4; + 1946 : 4; + 1947 : 0; + 1948 : 4; + 1949 : 4; + 1950 : 6; + 1951 : 6; + 1952 : 6; + 1953 : 6; + 1954 : 4; + 1955 : 4; + 1956 : 4; + 1957 : 4; + 1958 : 8; + 1959 : 8; + 1960 : 8; + 1961 : 6; + 1962 : 4; + 1963 : 4; + 1964 : 6; + 1965 : 6; + 1966 : 8; + 1967 : 8; + 1968 : 4; + 1969 : 4; + 1970 : 4; + 1971 : 6; + 1972 : 4; + 1973 : 6; + 1974 : 6; + 1975 : 6; + 1976 : 6; + 1977 : 4; + 1978 : 8; + 1979 : 4; + 1980 : 0; + 1981 : 0; + 1982 : 0; + 1983 : 0; + 1984 : 0; + 1985 : 0; + 1986 : 0; + 1987 : 4; + 1988 : 4; + 1989 : 8; + 1990 : 6; + 1991 : 4; + 1992 : 6; + 1993 : 6; + 1994 : 6; + 1995 : 6; + 1996 : 6; + 1997 : 6; + 1998 : 6; + 1999 : 0; + 2000 : 6; + 2001 : 6; + 2002 : 4; + 2003 : 6; + 2004 : 6; + 2005 : 6; + 2006 : 6; + 2007 : 6; + 2008 : 4; + 2009 : 4; + 2010 : 4; + 2011 : 6; + 2012 : 4; + 2013 : 4; + 2014 : 8; + 2015 : 6; + 2016 : 6; + 2017 : 4; + 2018 : 4; + 2019 : 4; + 2020 : 4; + 2021 : 4; + 2022 : 8; + 2023 : 6; + 2024 : 6; + 2025 : 6; + 2026 : 4; + 2027 : 4; + 2028 : 8; + 2029 : 8; + 2030 : 8; + 2031 : 4; + 2032 : 4; + 2033 : 4; + 2034 : 4; + 2035 : 6; + 2036 : 6; + 2037 : 6; + 2038 : 6; + 2039 : 6; + 2040 : 6; + 2041 : 4; + 2042 : 4; + 2043 : 6; + 2044 : 4; + 2045 : 0; + 2046 : 0; + 2047 : 0; + 2048 : 0; + 2049 : 0; + 2050 : 0; + 2051 : 4; + 2052 : 4; + 2053 : 6; + 2054 : 6; + 2055 : 4; + 2056 : 4; + 2057 : 6; + 2058 : 6; + 2059 : 6; + 2060 : 6; + 2061 : 6; + 2062 : 6; + 2063 : 6; + 2064 : 6; + 2065 : 6; + 2066 : 6; + 2067 : 6; + 2068 : 6; + 2069 : 6; + 2070 : 6; + 2071 : 6; + 2072 : 4; + 2073 : 4; + 2074 : 6; + 2075 : 6; + 2076 : 4; + 2077 : 4; + 2078 : 8; + 2079 : 4; + 2080 : 4; + 2081 : 6; + 2082 : 4; + 2083 : 4; + 2084 : 4; + 2085 : 6; + 2086 : 6; + 2087 : 6; + 2088 : 6; + 2089 : 6; + 2090 : 4; + 2091 : 4; + 2092 : 8; + 2093 : 4; + 2094 : 4; + 2095 : 4; + 2096 : 8; + 2097 : 8; + 2098 : 4; + 2099 : 6; + 2100 : 6; + 2101 : 6; + 2102 : 6; + 2103 : 8; + 2104 : 6; + 2105 : 4; + 2106 : 4; + 2107 : 0; + 2108 : 0; + 2109 : 0; + 2110 : 0; + 2111 : 0; + 2112 : 0; + 2113 : 0; + 2114 : 0; + 2115 : 4; + 2116 : 6; + 2117 : 6; + 2118 : 6; + 2119 : 4; + 2120 : 4; + 2121 : 6; + 2122 : 6; + 2123 : 6; + 2124 : 6; + 2125 : 6; + 2126 : 6; + 2127 : 6; + 2128 : 6; + 2129 : 6; + 2130 : 0; + 2131 : 6; + 2132 : 6; + 2133 : 6; + 2134 : 0; + 2135 : 6; + 2136 : 4; + 2137 : 4; + 2138 : 6; + 2139 : 6; + 2140 : 4; + 2141 : 4; + 2142 : 4; + 2143 : 6; + 2144 : 6; + 2145 : 6; + 2146 : 8; + 2147 : 4; + 2148 : 4; + 2149 : 6; + 2150 : 6; + 2151 : 6; + 2152 : 6; + 2153 : 6; + 2154 : 4; + 2155 : 4; + 2156 : 6; + 2157 : 4; + 2158 : 8; + 2159 : 8; + 2160 : 6; + 2161 : 6; + 2162 : 4; + 2163 : 6; + 2164 : 6; + 2165 : 8; + 2166 : 8; + 2167 : 8; + 2168 : 6; + 2169 : 4; + 2170 : 8; + 2171 : 8; + 2172 : 6; + 2173 : 0; + 2174 : 0; + 2175 : 0; + 2176 : 0; + 2177 : 0; + 2178 : 0; + 2179 : 4; + 2180 : 6; + 2181 : 6; + 2182 : 6; + 2183 : 4; + 2184 : 6; + 2185 : 6; + 2186 : 6; + 2187 : 6; + 2188 : 6; + 2189 : 6; + 2190 : 4; + 2191 : 6; + 2192 : 6; + 2193 : 6; + 2194 : 6; + 2195 : 6; + 2196 : 6; + 2197 : 6; + 2198 : 6; + 2199 : 6; + 2200 : 4; + 2201 : 4; + 2202 : 6; + 2203 : 6; + 2204 : 4; + 2205 : 4; + 2206 : 4; + 2207 : 4; + 2208 : 8; + 2209 : 8; + 2210 : 8; + 2211 : 4; + 2212 : 4; + 2213 : 6; + 2214 : 6; + 2215 : 4; + 2216 : 8; + 2217 : 8; + 2218 : 4; + 2219 : 4; + 2220 : 8; + 2221 : 8; + 2222 : 8; + 2223 : 6; + 2224 : 8; + 2225 : 4; + 2226 : 4; + 2227 : 6; + 2228 : 8; + 2229 : 8; + 2230 : 8; + 2231 : 6; + 2232 : 6; + 2233 : 4; + 2234 : 4; + 2235 : 8; + 2236 : 0; + 2237 : 0; + 2238 : 0; + 2239 : 0; + 2240 : 0; + 2241 : 0; + 2242 : 0; + 2243 : 4; + 2244 : 4; + 2245 : 6; + 2246 : 6; + 2247 : 4; + 2248 : 6; + 2249 : 6; + 2250 : 6; + 2251 : 6; + 2252 : 6; + 2253 : 6; + 2254 : 4; + 2255 : 4; + 2256 : 6; + 2257 : 6; + 2258 : 6; + 2259 : 6; + 2260 : 6; + 2261 : 6; + 2262 : 6; + 2263 : 0; + 2264 : 4; + 2265 : 4; + 2266 : 6; + 2267 : 6; + 2268 : 4; + 2269 : 6; + 2270 : 6; + 2271 : 6; + 2272 : 6; + 2273 : 4; + 2274 : 4; + 2275 : 4; + 2276 : 4; + 2277 : 6; + 2278 : 4; + 2279 : 8; + 2280 : 8; + 2281 : 6; + 2282 : 4; + 2283 : 4; + 2284 : 4; + 2285 : 8; + 2286 : 6; + 2287 : 8; + 2288 : 4; + 2289 : 4; + 2290 : 4; + 2291 : 6; + 2292 : 8; + 2293 : 8; + 2294 : 6; + 2295 : 6; + 2296 : 6; + 2297 : 4; + 2298 : 8; + 2299 : 8; + 2300 : 0; + 2301 : 0; + 2302 : 0; + 2303 : 0; + 2304 : 0; + 2305 : 0; + 2306 : 0; + 2307 : 4; + 2308 : 4; + 2309 : 8; + 2310 : 4; + 2311 : 4; + 2312 : 6; + 2313 : 6; + 2314 : 6; + 2315 : 6; + 2316 : 6; + 2317 : 6; + 2318 : 6; + 2319 : 6; + 2320 : 6; + 2321 : 6; + 2322 : 0; + 2323 : 6; + 2324 : 6; + 2325 : 6; + 2326 : 6; + 2327 : 6; + 2328 : 4; + 2329 : 4; + 2330 : 4; + 2331 : 6; + 2332 : 4; + 2333 : 4; + 2334 : 8; + 2335 : 6; + 2336 : 6; + 2337 : 4; + 2338 : 4; + 2339 : 4; + 2340 : 4; + 2341 : 8; + 2342 : 8; + 2343 : 8; + 2344 : 8; + 2345 : 6; + 2346 : 4; + 2347 : 4; + 2348 : 8; + 2349 : 4; + 2350 : 8; + 2351 : 8; + 2352 : 4; + 2353 : 4; + 2354 : 4; + 2355 : 6; + 2356 : 6; + 2357 : 6; + 2358 : 6; + 2359 : 6; + 2360 : 6; + 2361 : 4; + 2362 : 8; + 2363 : 8; + 2364 : 0; + 2365 : 0; + 2366 : 0; + 2367 : 0; + 2368 : 0; + 2369 : 0; + 2370 : 0; + 2371 : 4; + 2372 : 4; + 2373 : 6; + 2374 : 6; + 2375 : 4; + 2376 : 6; + 2377 : 6; + 2378 : 6; + 2379 : 6; + 2380 : 6; + 2381 : 6; + 2382 : 6; + 2383 : 0; + 2384 : 6; + 2385 : 6; + 2386 : 4; + 2387 : 6; + 2388 : 6; + 2389 : 6; + 2390 : 6; + 2391 : 6; + 2392 : 4; + 2393 : 4; + 2394 : 4; + 2395 : 6; + 2396 : 4; + 2397 : 4; + 2398 : 8; + 2399 : 6; + 2400 : 4; + 2401 : 4; + 2402 : 4; + 2403 : 4; + 2404 : 4; + 2405 : 4; + 2406 : 4; + 2407 : 6; + 2408 : 6; + 2409 : 6; + 2410 : 4; + 2411 : 4; + 2412 : 8; + 2413 : 8; + 2414 : 4; + 2415 : 6; + 2416 : 8; + 2417 : 8; + 2418 : 4; + 2419 : 6; + 2420 : 6; + 2421 : 6; + 2422 : 6; + 2423 : 6; + 2424 : 6; + 2425 : 4; + 2426 : 4; + 2427 : 8; + 2428 : 0; + 2429 : 0; + 2430 : 0; + 2431 : 0; + 2432 : 0; + 2433 : 0; + 2434 : 0; + 2435 : 4; + 2436 : 6; + 2437 : 6; + 2438 : 6; + 2439 : 4; + 2440 : 4; + 2441 : 6; + 2442 : 6; + 2443 : 6; + 2444 : 6; + 2445 : 6; + 2446 : 6; + 2447 : 6; + 2448 : 6; + 2449 : 6; + 2450 : 6; + 2451 : 6; + 2452 : 6; + 2453 : 6; + 2454 : 6; + 2455 : 6; + 2456 : 4; + 2457 : 4; + 2458 : 6; + 2459 : 6; + 2460 : 4; + 2461 : 4; + 2462 : 4; + 2463 : 6; + 2464 : 4; + 2465 : 4; + 2466 : 4; + 2467 : 4; + 2468 : 4; + 2469 : 6; + 2470 : 6; + 2471 : 6; + 2472 : 6; + 2473 : 6; + 2474 : 4; + 2475 : 4; + 2476 : 8; + 2477 : 6; + 2478 : 8; + 2479 : 8; + 2480 : 8; + 2481 : 8; + 2482 : 4; + 2483 : 6; + 2484 : 6; + 2485 : 6; + 2486 : 8; + 2487 : 8; + 2488 : 6; + 2489 : 4; + 2490 : 8; + 2491 : 8; + 2492 : 0; + 2493 : 0; + 2494 : 0; + 2495 : 0; + 2496 : 0; + 2497 : 0; + 2498 : 0; + 2499 : 4; + 2500 : 6; + 2501 : 6; + 2502 : 6; + 2503 : 4; + 2504 : 4; + 2505 : 6; + 2506 : 6; + 2507 : 6; + 2508 : 6; + 2509 : 6; + 2510 : 6; + 2511 : 6; + 2512 : 6; + 2513 : 6; + 2514 : 6; + 2515 : 6; + 2516 : 6; + 2517 : 6; + 2518 : 6; + 2519 : 6; + 2520 : 4; + 2521 : 4; + 2522 : 6; + 2523 : 6; + 2524 : 4; + 2525 : 4; + 2526 : 8; + 2527 : 6; + 2528 : 6; + 2529 : 8; + 2530 : 8; + 2531 : 4; + 2532 : 4; + 2533 : 6; + 2534 : 6; + 2535 : 6; + 2536 : 6; + 2537 : 8; + 2538 : 4; + 2539 : 4; + 2540 : 4; + 2541 : 8; + 2542 : 8; + 2543 : 8; + 2544 : 4; + 2545 : 4; + 2546 : 4; + 2547 : 6; + 2548 : 8; + 2549 : 8; + 2550 : 8; + 2551 : 8; + 2552 : 6; + 2553 : 4; + 2554 : 4; + 2555 : 8; + 2556 : 0; + 2557 : 0; + 2558 : 0; + 2559 : 0; + 2560 : 0; + 2561 : 0; + 2562 : 0; + 2563 : 4; + 2564 : 6; + 2565 : 6; + 2566 : 6; + 2567 : 4; + 2568 : 6; + 2569 : 6; + 2570 : 6; + 2571 : 6; + 2572 : 6; + 2573 : 6; + 2574 : 4; + 2575 : 4; + 2576 : 6; + 2577 : 6; + 2578 : 6; + 2579 : 6; + 2580 : 6; + 2581 : 6; + 2582 : 6; + 2583 : 0; + 2584 : 4; + 2585 : 4; + 2586 : 6; + 2587 : 6; + 2588 : 4; + 2589 : 6; + 2590 : 6; + 2591 : 8; + 2592 : 8; + 2593 : 8; + 2594 : 6; + 2595 : 4; + 2596 : 4; + 2597 : 6; + 2598 : 6; + 2599 : 8; + 2600 : 8; + 2601 : 8; + 2602 : 4; + 2603 : 4; + 2604 : 8; + 2605 : 8; + 2606 : 6; + 2607 : 4; + 2608 : 8; + 2609 : 4; + 2610 : 4; + 2611 : 6; + 2612 : 8; + 2613 : 8; + 2614 : 8; + 2615 : 6; + 2616 : 6; + 2617 : 4; + 2618 : 8; + 2619 : 8; + 2620 : 0; + 2621 : 0; + 2622 : 0; + 2623 : 0; + 2624 : 0; + 2625 : 0; + 2626 : 0; + 2627 : 4; + 2628 : 4; + 2629 : 6; + 2630 : 6; + 2631 : 4; + 2632 : 6; + 2633 : 6; + 2634 : 6; + 2635 : 6; + 2636 : 6; + 2637 : 6; + 2638 : 6; + 2639 : 4; + 2640 : 6; + 2641 : 6; + 2642 : 6; + 2643 : 6; + 2644 : 6; + 2645 : 6; + 2646 : 6; + 2647 : 6; + 2648 : 4; + 2649 : 4; + 2650 : 4; + 2651 : 0; + 2652 : 4; + 2653 : 4; + 2654 : 4; + 2655 : 6; + 2656 : 6; + 2657 : 4; + 2658 : 8; + 2659 : 4; + 2660 : 4; + 2661 : 8; + 2662 : 8; + 2663 : 8; + 2664 : 8; + 2665 : 6; + 2666 : 4; + 2667 : 4; + 2668 : 6; + 2669 : 6; + 2670 : 8; + 2671 : 8; + 2672 : 4; + 2673 : 4; + 2674 : 4; + 2675 : 6; + 2676 : 8; + 2677 : 6; + 2678 : 6; + 2679 : 6; + 2680 : 6; + 2681 : 4; + 2682 : 8; + 2683 : 8; + 2684 : 0; + 2685 : 0; + 2686 : 0; + 2687 : 0; + 2688 : 0; + 2689 : 0; + 2690 : 0; + 2691 : 4; + 2692 : 4; + 2693 : 8; + 2694 : 4; + 2695 : 4; + 2696 : 6; + 2697 : 6; + 2698 : 6; + 2699 : 6; + 2700 : 6; + 2701 : 6; + 2702 : 6; + 2703 : 4; + 2704 : 6; + 2705 : 6; + 2706 : 0; + 2707 : 6; + 2708 : 6; + 2709 : 6; + 2710 : 6; + 2711 : 6; + 2712 : 4; + 2713 : 4; + 2714 : 4; + 2715 : 6; + 2716 : 4; + 2717 : 4; + 2718 : 8; + 2719 : 6; + 2720 : 4; + 2721 : 4; + 2722 : 4; + 2723 : 4; + 2724 : 4; + 2725 : 8; + 2726 : 8; + 2727 : 8; + 2728 : 6; + 2729 : 6; + 2730 : 4; + 2731 : 4; + 2732 : 8; + 2733 : 8; + 2734 : 8; + 2735 : 8; + 2736 : 4; + 2737 : 4; + 2738 : 4; + 2739 : 6; + 2740 : 6; + 2741 : 6; + 2742 : 6; + 2743 : 6; + 2744 : 6; + 2745 : 4; + 2746 : 8; + 2747 : 8; + 2748 : 0; + 2749 : 0; + 2750 : 0; + 2751 : 0; + 2752 : 0; + 2753 : 0; + 2754 : 0; + 2755 : 4; + 2756 : 4; + 2757 : 6; + 2758 : 6; + 2759 : 4; + 2760 : 6; + 2761 : 6; + 2762 : 6; + 2763 : 6; + 2764 : 6; + 2765 : 6; + 2766 : 6; + 2767 : 6; + 2768 : 6; + 2769 : 6; + 2770 : 6; + 2771 : 6; + 2772 : 6; + 2773 : 6; + 2774 : 6; + 2775 : 6; + 2776 : 4; + 2777 : 4; + 2778 : 6; + 2779 : 6; + 2780 : 4; + 2781 : 4; + 2782 : 8; + 2783 : 6; + 2784 : 4; + 2785 : 4; + 2786 : 4; + 2787 : 4; + 2788 : 4; + 2789 : 6; + 2790 : 6; + 2791 : 6; + 2792 : 6; + 2793 : 6; + 2794 : 4; + 2795 : 4; + 2796 : 8; + 2797 : 4; + 2798 : 8; + 2799 : 4; + 2800 : 8; + 2801 : 8; + 2802 : 4; + 2803 : 6; + 2804 : 6; + 2805 : 6; + 2806 : 6; + 2807 : 8; + 2808 : 6; + 2809 : 4; + 2810 : 4; + 2811 : 8; + 2812 : 0; + 2813 : 0; + 2814 : 0; + 2815 : 0; + 2816 : 0; + 2817 : 0; + 2818 : 0; + 2819 : 4; + 2820 : 6; + 2821 : 6; + 2822 : 6; + 2823 : 4; + 2824 : 4; + 2825 : 6; + 2826 : 6; + 2827 : 6; + 2828 : 6; + 2829 : 6; + 2830 : 6; + 2831 : 6; + 2832 : 6; + 2833 : 6; + 2834 : 0; + 2835 : 6; + 2836 : 6; + 2837 : 6; + 2838 : 6; + 2839 : 6; + 2840 : 4; + 2841 : 4; + 2842 : 6; + 2843 : 6; + 2844 : 4; + 2845 : 4; + 2846 : 4; + 2847 : 6; + 2848 : 6; + 2849 : 6; + 2850 : 8; + 2851 : 4; + 2852 : 4; + 2853 : 6; + 2854 : 6; + 2855 : 6; + 2856 : 6; + 2857 : 6; + 2858 : 4; + 2859 : 4; + 2860 : 6; + 2861 : 4; + 2862 : 8; + 2863 : 8; + 2864 : 6; + 2865 : 6; + 2866 : 4; + 2867 : 6; + 2868 : 6; + 2869 : 4; + 2870 : 8; + 2871 : 8; + 2872 : 6; + 2873 : 4; + 2874 : 8; + 2875 : 8; + 2876 : 6; + 2877 : 0; + 2878 : 0; + 2879 : 0; + 2880 : 0; + 2881 : 0; + 2882 : 0; + 2883 : 4; + 2884 : 6; + 2885 : 6; + 2886 : 6; + 2887 : 4; + 2888 : 4; + 2889 : 6; + 2890 : 6; + 2891 : 6; + 2892 : 6; + 2893 : 6; + 2894 : 4; + 2895 : 6; + 2896 : 6; + 2897 : 6; + 2898 : 6; + 2899 : 6; + 2900 : 6; + 2901 : 6; + 2902 : 6; + 2903 : 6; + 2904 : 4; + 2905 : 4; + 2906 : 6; + 2907 : 6; + 2908 : 4; + 2909 : 4; + 2910 : 8; + 2911 : 6; + 2912 : 8; + 2913 : 8; + 2914 : 8; + 2915 : 4; + 2916 : 4; + 2917 : 6; + 2918 : 6; + 2919 : 6; + 2920 : 4; + 2921 : 8; + 2922 : 4; + 2923 : 4; + 2924 : 8; + 2925 : 8; + 2926 : 8; + 2927 : 6; + 2928 : 8; + 2929 : 4; + 2930 : 4; + 2931 : 6; + 2932 : 8; + 2933 : 8; + 2934 : 8; + 2935 : 8; + 2936 : 6; + 2937 : 4; + 2938 : 6; + 2939 : 8; + 2940 : 0; + 2941 : 0; + 2942 : 0; + 2943 : 0; + 2944 : 0; + 2945 : 0; + 2946 : 0; + 2947 : 4; + 2948 : 6; + 2949 : 6; + 2950 : 6; + 2951 : 4; + 2952 : 6; + 2953 : 6; + 2954 : 6; + 2955 : 6; + 2956 : 6; + 2957 : 6; + 2958 : 4; + 2959 : 0; + 2960 : 6; + 2961 : 6; + 2962 : 6; + 2963 : 6; + 2964 : 6; + 2965 : 6; + 2966 : 6; + 2967 : 0; + 2968 : 4; + 2969 : 4; + 2970 : 6; + 2971 : 6; + 2972 : 4; + 2973 : 6; + 2974 : 6; + 2975 : 6; + 2976 : 8; + 2977 : 8; + 2978 : 6; + 2979 : 4; + 2980 : 4; + 2981 : 6; + 2982 : 8; + 2983 : 8; + 2984 : 8; + 2985 : 6; + 2986 : 4; + 2987 : 4; + 2988 : 8; + 2989 : 8; + 2990 : 6; + 2991 : 8; + 2992 : 4; + 2993 : 4; + 2994 : 4; + 2995 : 6; + 2996 : 8; + 2997 : 8; + 2998 : 8; + 2999 : 6; + 3000 : 6; + 3001 : 4; + 3002 : 8; + 3003 : 8; + 3004 : 0; + 3005 : 0; + 3006 : 0; + 3007 : 0; + 3008 : 0; + 3009 : 0; + 3010 : 0; + 3011 : 4; + 3012 : 4; + 3013 : 8; + 3014 : 6; + 3015 : 4; + 3016 : 6; + 3017 : 6; + 3018 : 6; + 3019 : 6; + 3020 : 6; + 3021 : 6; + 3022 : 6; + 3023 : 6; + 3024 : 6; + 3025 : 6; + 3026 : 6; + 3027 : 6; + 3028 : 6; + 3029 : 6; + 3030 : 6; + 3031 : 6; + 3032 : 4; + 3033 : 4; + 3034 : 4; + 3035 : 6; + 3036 : 4; + 3037 : 4; + 3038 : 8; + 3039 : 6; + 3040 : 6; + 3041 : 4; + 3042 : 4; + 3043 : 4; + 3044 : 4; + 3045 : 8; + 3046 : 8; + 3047 : 8; + 3048 : 8; + 3049 : 6; + 3050 : 4; + 3051 : 4; + 3052 : 8; + 3053 : 4; + 3054 : 8; + 3055 : 8; + 3056 : 4; + 3057 : 4; + 3058 : 4; + 3059 : 6; + 3060 : 6; + 3061 : 6; + 3062 : 6; + 3063 : 6; + 3064 : 6; + 3065 : 4; + 3066 : 8; + 3067 : 8; + 3068 : 0; + 3069 : 0; + 3070 : 0; + 3071 : 0; + 3072 : 0; + 3073 : 0; + 3074 : 0; + 3075 : 4; + 3076 : 4; + 3077 : 8; + 3078 : 6; + 3079 : 4; + 3080 : 6; + 3081 : 6; + 3082 : 6; + 3083 : 6; + 3084 : 6; + 3085 : 6; + 3086 : 6; + 3087 : 0; + 3088 : 6; + 3089 : 4; + 3090 : 4; + 3091 : 6; + 3092 : 6; + 3093 : 6; + 3094 : 6; + 3095 : 6; + 3096 : 4; + 3097 : 4; + 3098 : 4; + 3099 : 6; + 3100 : 4; + 3101 : 4; + 3102 : 8; + 3103 : 6; + 3104 : 4; + 3105 : 4; + 3106 : 4; + 3107 : 4; + 3108 : 4; + 3109 : 8; + 3110 : 8; + 3111 : 6; + 3112 : 6; + 3113 : 6; + 3114 : 4; + 3115 : 4; + 3116 : 8; + 3117 : 8; + 3118 : 8; + 3119 : 6; + 3120 : 8; + 3121 : 8; + 3122 : 4; + 3123 : 6; + 3124 : 6; + 3125 : 6; + 3126 : 6; + 3127 : 6; + 3128 : 6; + 3129 : 4; + 3130 : 4; + 3131 : 8; + 3132 : 0; + 3133 : 0; + 3134 : 0; + 3135 : 0; + 3136 : 0; + 3137 : 0; + 3138 : 0; + 3139 : 4; + 3140 : 6; + 3141 : 6; + 3142 : 6; + 3143 : 4; + 3144 : 4; + 3145 : 6; + 3146 : 6; + 3147 : 6; + 3148 : 6; + 3149 : 6; + 3150 : 6; + 3151 : 6; + 3152 : 6; + 3153 : 6; + 3154 : 6; + 3155 : 6; + 3156 : 6; + 3157 : 6; + 3158 : 6; + 3159 : 6; + 3160 : 4; + 3161 : 4; + 3162 : 6; + 3163 : 6; + 3164 : 4; + 3165 : 4; + 3166 : 8; + 3167 : 4; + 3168 : 4; + 3169 : 4; + 3170 : 4; + 3171 : 4; + 3172 : 4; + 3173 : 6; + 3174 : 6; + 3175 : 6; + 3176 : 6; + 3177 : 6; + 3178 : 4; + 3179 : 4; + 3180 : 8; + 3181 : 4; + 3182 : 8; + 3183 : 8; + 3184 : 8; + 3185 : 8; + 3186 : 4; + 3187 : 6; + 3188 : 6; + 3189 : 6; + 3190 : 6; + 3191 : 8; + 3192 : 6; + 3193 : 4; + 3194 : 4; + 3195 : 8; + 3196 : 0; + 3197 : 0; + 3198 : 0; + 3199 : 0; + 3200 : 0; + 3201 : 0; + 3202 : 0; + 3203 : 4; + 3204 : 6; + 3205 : 6; + 3206 : 6; + 3207 : 4; + 3208 : 4; + 3209 : 6; + 3210 : 6; + 3211 : 6; + 3212 : 6; + 3213 : 6; + 3214 : 6; + 3215 : 6; + 3216 : 6; + 3217 : 6; + 3218 : 6; + 3219 : 6; + 3220 : 6; + 3221 : 6; + 3222 : 6; + 3223 : 6; + 3224 : 4; + 3225 : 4; + 3226 : 6; + 3227 : 6; + 3228 : 4; + 3229 : 4; + 3230 : 4; + 3231 : 6; + 3232 : 6; + 3233 : 8; + 3234 : 8; + 3235 : 4; + 3236 : 4; + 3237 : 6; + 3238 : 6; + 3239 : 6; + 3240 : 6; + 3241 : 4; + 3242 : 4; + 3243 : 4; + 3244 : 4; + 3245 : 8; + 3246 : 8; + 3247 : 8; + 3248 : 6; + 3249 : 4; + 3250 : 4; + 3251 : 6; + 3252 : 8; + 3253 : 8; + 3254 : 8; + 3255 : 8; + 3256 : 6; + 3257 : 4; + 3258 : 8; + 3259 : 8; + 3260 : 6; + 3261 : 0; + 3262 : 0; + 3263 : 0; + 3264 : 0; + 3265 : 0; + 3266 : 0; + 3267 : 4; + 3268 : 6; + 3269 : 6; + 3270 : 6; + 3271 : 4; + 3272 : 6; + 3273 : 6; + 3274 : 6; + 3275 : 6; + 3276 : 6; + 3277 : 6; + 3278 : 4; + 3279 : 6; + 3280 : 6; + 3281 : 6; + 3282 : 6; + 3283 : 6; + 3284 : 6; + 3285 : 6; + 3286 : 6; + 3287 : 6; + 3288 : 4; + 3289 : 4; + 3290 : 6; + 3291 : 6; + 3292 : 4; + 3293 : 6; + 3294 : 6; + 3295 : 8; + 3296 : 8; + 3297 : 8; + 3298 : 4; + 3299 : 4; + 3300 : 4; + 3301 : 6; + 3302 : 6; + 3303 : 8; + 3304 : 8; + 3305 : 8; + 3306 : 4; + 3307 : 4; + 3308 : 8; + 3309 : 8; + 3310 : 4; + 3311 : 6; + 3312 : 8; + 3313 : 4; + 3314 : 4; + 3315 : 6; + 3316 : 8; + 3317 : 8; + 3318 : 8; + 3319 : 6; + 3320 : 6; + 3321 : 4; + 3322 : 8; + 3323 : 8; + 3324 : 0; + 3325 : 0; + 3326 : 0; + 3327 : 0; + 3328 : 0; + 3329 : 0; + 3330 : 0; + 3331 : 4; + 3332 : 4; + 3333 : 6; + 3334 : 6; + 3335 : 4; + 3336 : 6; + 3337 : 6; + 3338 : 6; + 3339 : 6; + 3340 : 6; + 3341 : 6; + 3342 : 6; + 3343 : 4; + 3344 : 6; + 3345 : 6; + 3346 : 6; + 3347 : 6; + 3348 : 6; + 3349 : 6; + 3350 : 6; + 3351 : 0; + 3352 : 4; + 3353 : 4; + 3354 : 4; + 3355 : 0; + 3356 : 4; + 3357 : 4; + 3358 : 6; + 3359 : 6; + 3360 : 6; + 3361 : 4; + 3362 : 8; + 3363 : 4; + 3364 : 4; + 3365 : 4; + 3366 : 8; + 3367 : 8; + 3368 : 8; + 3369 : 8; + 3370 : 4; + 3371 : 4; + 3372 : 6; + 3373 : 6; + 3374 : 8; + 3375 : 8; + 3376 : 4; + 3377 : 4; + 3378 : 4; + 3379 : 6; + 3380 : 8; + 3381 : 6; + 3382 : 6; + 3383 : 6; + 3384 : 6; + 3385 : 4; + 3386 : 8; + 3387 : 8; + 3388 : 0; + 3389 : 0; + 3390 : 0; + 3391 : 0; + 3392 : 0; + 3393 : 0; + 3394 : 0; + 3395 : 4; + 3396 : 4; + 3397 : 8; + 3398 : 4; + 3399 : 4; + 3400 : 6; + 3401 : 6; + 3402 : 6; + 3403 : 6; + 3404 : 6; + 3405 : 6; + 3406 : 6; + 3407 : 6; + 3408 : 6; + 3409 : 6; + 3410 : 0; + 3411 : 6; + 3412 : 6; + 3413 : 6; + 3414 : 6; + 3415 : 6; + 3416 : 4; + 3417 : 4; + 3418 : 4; + 3419 : 6; + 3420 : 4; + 3421 : 4; + 3422 : 8; + 3423 : 6; + 3424 : 8; + 3425 : 8; + 3426 : 4; + 3427 : 4; + 3428 : 4; + 3429 : 8; + 3430 : 8; + 3431 : 8; + 3432 : 0; + 3433 : 6; + 3434 : 4; + 3435 : 4; + 3436 : 8; + 3437 : 8; + 3438 : 8; + 3439 : 8; + 3440 : 4; + 3441 : 4; + 3442 : 4; + 3443 : 6; + 3444 : 6; + 3445 : 6; + 3446 : 6; + 3447 : 6; + 3448 : 6; + 3449 : 4; + 3450 : 8; + 3451 : 8; + 3452 : 0; + 3453 : 0; + 3454 : 0; + 3455 : 0; + 3456 : 0; + 3457 : 0; + 3458 : 0; + 3459 : 4; + 3460 : 4; + 3461 : 6; + 3462 : 6; + 3463 : 4; + 3464 : 6; + 3465 : 6; + 3466 : 6; + 3467 : 6; + 3468 : 6; + 3469 : 6; + 3470 : 6; + 3471 : 0; + 3472 : 6; + 3473 : 4; + 3474 : 6; + 3475 : 6; + 3476 : 6; + 3477 : 6; + 3478 : 6; + 3479 : 6; + 3480 : 4; + 3481 : 4; + 3482 : 4; + 3483 : 6; + 3484 : 4; + 3485 : 4; + 3486 : 8; + 3487 : 6; + 3488 : 4; + 3489 : 4; + 3490 : 4; + 3491 : 4; + 3492 : 4; + 3493 : 4; + 3494 : 8; + 3495 : 6; + 3496 : 6; + 3497 : 6; + 3498 : 4; + 3499 : 4; + 3500 : 8; + 3501 : 8; + 3502 : 8; + 3503 : 4; + 3504 : 8; + 3505 : 8; + 3506 : 4; + 3507 : 6; + 3508 : 6; + 3509 : 6; + 3510 : 6; + 3511 : 8; + 3512 : 4; + 3513 : 4; + 3514 : 4; + 3515 : 8; + 3516 : 0; + 3517 : 0; + 3518 : 0; + 3519 : 0; + 3520 : 0; + 3521 : 0; + 3522 : 0; + 3523 : 4; + 3524 : 4; + 3525 : 8; + 3526 : 6; + 3527 : 4; + 3528 : 6; + 3529 : 6; + 3530 : 6; + 3531 : 6; + 3532 : 6; + 3533 : 6; + 3534 : 6; + 3535 : 0; + 3536 : 6; + 3537 : 4; + 3538 : 4; + 3539 : 6; + 3540 : 6; + 3541 : 6; + 3542 : 6; + 3543 : 6; + 3544 : 4; + 3545 : 4; + 3546 : 4; + 3547 : 6; + 3548 : 4; + 3549 : 4; + 3550 : 8; + 3551 : 6; + 3552 : 4; + 3553 : 4; + 3554 : 4; + 3555 : 4; + 3556 : 4; + 3557 : 8; + 3558 : 8; + 3559 : 6; + 3560 : 6; + 3561 : 6; + 3562 : 4; + 3563 : 4; + 3564 : 8; + 3565 : 8; + 3566 : 8; + 3567 : 4; + 3568 : 4; + 3569 : 4; + 3570 : 4; + 3571 : 4; + 3572 : 6; + 3573 : 6; + 3574 : 6; + 3575 : 6; + 3576 : 4; + 3577 : 4; + 3578 : 4; + 3579 : 8; + 3580 : 0; + 3581 : 0; + 3582 : 0; + 3583 : 0; + 3584 : 0; + 3585 : 0; + 3586 : 0; + 3587 : 4; + 3588 : 6; + 3589 : 6; + 3590 : 6; + 3591 : 4; + 3592 : 4; + 3593 : 6; + 3594 : 6; + 3595 : 6; + 3596 : 6; + 3597 : 6; + 3598 : 6; + 3599 : 6; + 3600 : 6; + 3601 : 6; + 3602 : 6; + 3603 : 6; + 3604 : 6; + 3605 : 6; + 3606 : 6; + 3607 : 6; + 3608 : 4; + 3609 : 4; + 3610 : 6; + 3611 : 6; + 3612 : 4; + 3613 : 4; + 3614 : 8; + 3615 : 4; + 3616 : 4; + 3617 : 4; + 3618 : 4; + 3619 : 4; + 3620 : 4; + 3621 : 6; + 3622 : 6; + 3623 : 6; + 3624 : 6; + 3625 : 6; + 3626 : 4; + 3627 : 4; + 3628 : 8; + 3629 : 4; + 3630 : 4; + 3631 : 4; + 3632 : 4; + 3633 : 4; + 3634 : 4; + 3635 : 4; + 3636 : 6; + 3637 : 6; + 3638 : 4; + 3639 : 8; + 3640 : 4; + 3641 : 4; + 3642 : 4; + 3643 : 8; + 3644 : 0; + 3645 : 0; + 3646 : 0; + 3647 : 0; + 3648 : 0; + 3649 : 0; + 3650 : 0; + 3651 : 4; + 3652 : 6; + 3653 : 6; + 3654 : 6; + 3655 : 4; + 3656 : 4; + 3657 : 6; + 3658 : 6; + 3659 : 6; + 3660 : 6; + 3661 : 6; + 3662 : 6; + 3663 : 6; + 3664 : 6; + 3665 : 6; + 3666 : 6; + 3667 : 6; + 3668 : 6; + 3669 : 6; + 3670 : 6; + 3671 : 6; + 3672 : 4; + 3673 : 4; + 3674 : 6; + 3675 : 6; + 3676 : 4; + 3677 : 4; + 3678 : 4; + 3679 : 6; + 3680 : 4; + 3681 : 4; + 3682 : 4; + 3683 : 4; + 3684 : 4; + 3685 : 6; + 3686 : 6; + 3687 : 6; + 3688 : 6; + 3689 : 8; + 3690 : 4; + 3691 : 4; + 3692 : 4; + 3693 : 4; + 3694 : 8; + 3695 : 8; + 3696 : 4; + 3697 : 4; + 3698 : 4; + 3699 : 6; + 3700 : 8; + 3701 : 8; + 3702 : 8; + 3703 : 8; + 3704 : 4; + 3705 : 4; + 3706 : 8; + 3707 : 8; + 3708 : 0; + 3709 : 0; + 3710 : 0; + 3711 : 0; + 3712 : 0; + 3713 : 0; + 3714 : 0; + 3715 : 4; + 3716 : 6; + 3717 : 6; + 3718 : 6; + 3719 : 4; + 3720 : 6; + 3721 : 6; + 3722 : 6; + 3723 : 6; + 3724 : 6; + 3725 : 6; + 3726 : 4; + 3727 : 6; + 3728 : 6; + 3729 : 6; + 3730 : 6; + 3731 : 6; + 3732 : 6; + 3733 : 6; + 3734 : 6; + 3735 : 6; + 3736 : 4; + 3737 : 4; + 3738 : 6; + 3739 : 6; + 3740 : 4; + 3741 : 4; + 3742 : 4; + 3743 : 8; + 3744 : 8; + 3745 : 4; + 3746 : 4; + 3747 : 4; + 3748 : 4; + 3749 : 6; + 3750 : 6; + 3751 : 8; + 3752 : 8; + 3753 : 8; + 3754 : 4; + 3755 : 4; + 3756 : 4; + 3757 : 8; + 3758 : 8; + 3759 : 8; + 3760 : 4; + 3761 : 4; + 3762 : 4; + 3763 : 4; + 3764 : 8; + 3765 : 8; + 3766 : 8; + 3767 : 4; + 3768 : 4; + 3769 : 4; + 3770 : 8; + 3771 : 8; + 3772 : 0; + 3773 : 0; + 3774 : 0; + 3775 : 0; + 3776 : 0; + 3777 : 0; + 3778 : 0; + 3779 : 4; + 3780 : 4; + 3781 : 6; + 3782 : 6; + 3783 : 4; + 3784 : 6; + 3785 : 6; + 3786 : 6; + 3787 : 6; + 3788 : 6; + 3789 : 6; + 3790 : 6; + 3791 : 4; + 3792 : 6; + 3793 : 6; + 3794 : 6; + 3795 : 6; + 3796 : 6; + 3797 : 6; + 3798 : 6; + 3799 : 0; + 3800 : 4; + 3801 : 4; + 3802 : 4; + 3803 : 0; + 3804 : 4; + 3805 : 4; + 3806 : 6; + 3807 : 6; + 3808 : 4; + 3809 : 4; + 3810 : 4; + 3811 : 4; + 3812 : 4; + 3813 : 8; + 3814 : 8; + 3815 : 8; + 3816 : 8; + 3817 : 8; + 3818 : 4; + 3819 : 4; + 3820 : 8; + 3821 : 8; + 3822 : 8; + 3823 : 8; + 3824 : 4; + 3825 : 4; + 3826 : 4; + 3827 : 4; + 3828 : 8; + 3829 : 8; + 3830 : 6; + 3831 : 4; + 3832 : 4; + 3833 : 4; + 3834 : 8; + 3835 : 8; + 3836 : 0; + 3837 : 0; + 3838 : 0; + 3839 : 0; + 3840 : 0; + 3841 : 0; + 3842 : 0; + 3843 : 4; + 3844 : 4; + 3845 : 0; + 3846 : 4; + 3847 : 4; + 3848 : 6; + 3849 : 6; + 3850 : 6; + 3851 : 6; + 3852 : 6; + 3853 : 6; + 3854 : 6; + 3855 : 6; + 3856 : 6; + 3857 : 6; + 3858 : 0; + 3859 : 6; + 3860 : 6; + 3861 : 6; + 3862 : 6; + 3863 : 6; + 3864 : 4; + 3865 : 4; + 3866 : 4; + 3867 : 6; + 3868 : 4; + 3869 : 4; + 3870 : 8; + 3871 : 6; + 3872 : 4; + 3873 : 4; + 3874 : 4; + 3875 : 4; + 3876 : 4; + 3877 : 8; + 3878 : 8; + 3879 : 8; + 3880 : 8; + 3881 : 6; + 3882 : 4; + 3883 : 4; + 3884 : 8; + 3885 : 8; + 3886 : 8; + 3887 : 4; + 3888 : 4; + 3889 : 4; + 3890 : 4; + 3891 : 4; + 3892 : 6; + 3893 : 6; + 3894 : 4; + 3895 : 6; + 3896 : 6; + 3897 : 4; + 3898 : 8; + 3899 : 8; + 3900 : 0; + 3901 : 0; + 3902 : 0; + 3903 : 0; + 3904 : 0; + 3905 : 0; + 3906 : 0; + 3907 : 4; + 3908 : 4; + 3909 : 6; + 3910 : 6; + 3911 : 4; + 3912 : 6; + 3913 : 6; + 3914 : 6; + 3915 : 6; + 3916 : 6; + 3917 : 6; + 3918 : 6; + 3919 : 0; + 3920 : 6; + 3921 : 4; + 3922 : 6; + 3923 : 6; + 3924 : 6; + 3925 : 6; + 3926 : 6; + 3927 : 6; + 3928 : 4; + 3929 : 4; + 3930 : 4; + 3931 : 6; + 3932 : 4; + 3933 : 4; + 3934 : 8; + 3935 : 6; + 3936 : 4; + 3937 : 4; + 3938 : 4; + 3939 : 4; + 3940 : 4; + 3941 : 4; + 3942 : 8; + 3943 : 6; + 3944 : 6; + 3945 : 6; + 3946 : 4; + 3947 : 4; + 3948 : 8; + 3949 : 8; + 3950 : 8; + 3951 : 4; + 3952 : 4; + 3953 : 4; + 3954 : 4; + 3955 : 4; + 3956 : 6; + 3957 : 6; + 3958 : 6; + 3959 : 8; + 3960 : 4; + 3961 : 4; + 3962 : 4; + 3963 : 8; + 3964 : 0; + 3965 : 0; + 3966 : 0; + 3967 : 0; + 3968 : 0; + 3969 : 0; + 3970 : 0; + 3971 : 4; + 3972 : 6; + 3973 : 6; + 3974 : 6; + 3975 : 4; + 3976 : 4; + 3977 : 6; + 3978 : 6; + 3979 : 6; + 3980 : 6; + 3981 : 6; + 3982 : 6; + 3983 : 6; + 3984 : 6; + 3985 : 6; + 3986 : 0; + 3987 : 6; + 3988 : 6; + 3989 : 6; + 3990 : 6; + 3991 : 6; + 3992 : 4; + 3993 : 4; + 3994 : 6; + 3995 : 6; + 3996 : 4; + 3997 : 4; + 3998 : 4; + 3999 : 6; + 4000 : 4; + 4001 : 4; + 4002 : 4; + 4003 : 4; + 4004 : 4; + 4005 : 6; + 4006 : 6; + 4007 : 6; + 4008 : 6; + 4009 : 6; + 4010 : 4; + 4011 : 4; + 4012 : 8; + 4013 : 4; + 4014 : 8; + 4015 : 8; + 4016 : 4; + 4017 : 4; + 4018 : 4; + 4019 : 6; + 4020 : 6; + 4021 : 8; + 4022 : 8; + 4023 : 8; + 4024 : 4; + 4025 : 4; + 4026 : 4; + 4027 : 8; + 4028 : 0; + 4029 : 0; + 4030 : 0; + 4031 : 0; + 4032 : 0; + 4033 : 0; + 4034 : 0; + 4035 : 4; + 4036 : 6; + 4037 : 6; + 4038 : 6; + 4039 : 4; + 4040 : 4; + 4041 : 6; + 4042 : 6; + 4043 : 6; + 4044 : 6; + 4045 : 6; + 4046 : 6; + 4047 : 6; + 4048 : 6; + 4049 : 6; + 4050 : 6; + 4051 : 6; + 4052 : 6; + 4053 : 6; + 4054 : 6; + 4055 : 6; + 4056 : 4; + 4057 : 4; + 4058 : 6; + 4059 : 6; + 4060 : 4; + 4061 : 4; + 4062 : 4; + 4063 : 6; + 4064 : 4; + 4065 : 4; + 4066 : 4; + 4067 : 4; + 4068 : 4; + 4069 : 6; + 4070 : 6; + 4071 : 6; + 4072 : 4; + 4073 : 8; + 4074 : 4; + 4075 : 4; + 4076 : 8; + 4077 : 8; + 4078 : 8; + 4079 : 8; + 4080 : 4; + 4081 : 4; + 4082 : 4; + 4083 : 4; + 4084 : 8; + 4085 : 8; + 4086 : 8; + 4087 : 8; + 4088 : 4; + 4089 : 4; + 4090 : 8; + 4091 : 8; + 4092 : 0; + 4093 : 0; + 4094 : 0; + 4095 : 0; + 4096 : 0; + 4097 : 0; + 4098 : 0; + 4099 : 4; + 4100 : 6; + 4101 : 6; + 4102 : 6; + 4103 : 4; + 4104 : 6; + 4105 : 6; + 4106 : 6; + 4107 : 6; + 4108 : 6; + 4109 : 6; + 4110 : 4; + 4111 : 0; + 4112 : 6; + 4113 : 6; + 4114 : 6; + 4115 : 6; + 4116 : 6; + 4117 : 6; + 4118 : 6; + 4119 : 0; + 4120 : 4; + 4121 : 4; + 4122 : 6; + 4123 : 6; + 4124 : 4; + 4125 : 4; + 4126 : 4; + 4127 : 8; + 4128 : 8; + 4129 : 4; + 4130 : 4; + 4131 : 4; + 4132 : 4; + 4133 : 6; + 4134 : 4; + 4135 : 8; + 4136 : 8; + 4137 : 8; + 4138 : 4; + 4139 : 4; + 4140 : 4; + 4141 : 8; + 4142 : 8; + 4143 : 8; + 4144 : 4; + 4145 : 4; + 4146 : 4; + 4147 : 4; + 4148 : 8; + 4149 : 8; + 4150 : 8; + 4151 : 6; + 4152 : 4; + 4153 : 4; + 4154 : 8; + 4155 : 8; + 4156 : 0; + 4157 : 0; + 4158 : 0; + 4159 : 0; + 4160 : 0; + 4161 : 0; + 4162 : 0; + 4163 : 4; + 4164 : 4; + 4165 : 0; + 4166 : 6; + 4167 : 4; + 4168 : 6; + 4169 : 6; + 4170 : 6; + 4171 : 6; + 4172 : 6; + 4173 : 6; + 4174 : 6; + 4175 : 4; + 4176 : 6; + 4177 : 6; + 4178 : 6; + 4179 : 6; + 4180 : 6; + 4181 : 6; + 4182 : 6; + 4183 : 6; + 4184 : 4; + 4185 : 4; + 4186 : 4; + 4187 : 0; + 4188 : 4; + 4189 : 4; + 4190 : 6; + 4191 : 6; + 4192 : 4; + 4193 : 4; + 4194 : 4; + 4195 : 4; + 4196 : 4; + 4197 : 8; + 4198 : 8; + 4199 : 8; + 4200 : 8; + 4201 : 4; + 4202 : 4; + 4203 : 4; + 4204 : 8; + 4205 : 8; + 4206 : 8; + 4207 : 8; + 4208 : 4; + 4209 : 4; + 4210 : 4; + 4211 : 4; + 4212 : 8; + 4213 : 4; + 4214 : 6; + 4215 : 4; + 4216 : 4; + 4217 : 4; + 4218 : 8; + 4219 : 8; + 4220 : 0; + 4221 : 0; + 4222 : 0; + 4223 : 0; + 4224 : 0; + 4225 : 0; + 4226 : 0; + 4227 : 4; + 4228 : 4; + 4229 : 0; + 4230 : 6; + 4231 : 4; + 4232 : 6; + 4233 : 6; + 4234 : 6; + 4235 : 6; + 4236 : 6; + 4237 : 6; + 4238 : 6; + 4239 : 0; + 4240 : 6; + 4241 : 4; + 4242 : 4; + 4243 : 6; + 4244 : 6; + 4245 : 6; + 4246 : 6; + 4247 : 6; + 4248 : 4; + 4249 : 4; + 4250 : 4; + 4251 : 6; + 4252 : 4; + 4253 : 4; + 4254 : 8; + 4255 : 6; + 4256 : 4; + 4257 : 4; + 4258 : 4; + 4259 : 4; + 4260 : 4; + 4261 : 8; + 4262 : 8; + 4263 : 4; + 4264 : 4; + 4265 : 4; + 4266 : 4; + 4267 : 4; + 4268 : 8; + 4269 : 8; + 4270 : 8; + 4271 : 4; + 4272 : 4; + 4273 : 4; + 4274 : 4; + 4275 : 4; + 4276 : 6; + 4277 : 4; + 4278 : 6; + 4279 : 4; + 4280 : 4; + 4281 : 4; + 4282 : 8; + 4283 : 8; + 4284 : 0; + 4285 : 0; + 4286 : 0; + 4287 : 0; + 4288 : 0; + 4289 : 0; + 4290 : 0; + 4291 : 4; + 4292 : 4; + 4293 : 6; + 4294 : 6; + 4295 : 4; + 4296 : 4; + 4297 : 6; + 4298 : 6; + 4299 : 6; + 4300 : 6; + 4301 : 6; + 4302 : 6; + 4303 : 6; + 4304 : 6; + 4305 : 6; + 4306 : 6; + 4307 : 6; + 4308 : 6; + 4309 : 6; + 4310 : 6; + 4311 : 6; + 4312 : 4; + 4313 : 4; + 4314 : 6; + 4315 : 6; + 4316 : 4; + 4317 : 4; + 4318 : 8; + 4319 : 4; + 4320 : 8; + 4321 : 4; + 4322 : 4; + 4323 : 4; + 4324 : 4; + 4325 : 6; + 4326 : 6; + 4327 : 4; + 4328 : 4; + 4329 : 6; + 4330 : 4; + 4331 : 4; + 4332 : 8; + 4333 : 8; + 4334 : 4; + 4335 : 8; + 4336 : 4; + 4337 : 4; + 4338 : 4; + 4339 : 4; + 4340 : 6; + 4341 : 6; + 4342 : 4; + 4343 : 8; + 4344 : 4; + 4345 : 4; + 4346 : 8; + 4347 : 8; + 4348 : 0; + 4349 : 0; + 4350 : 0; + 4351 : 0; + 4352 : 0; + 4353 : 0; + 4354 : 0; + 4355 : 4; + 4356 : 6; + 4357 : 6; + 4358 : 6; + 4359 : 4; + 4360 : 4; + 4361 : 6; + 4362 : 6; + 4363 : 6; + 4364 : 6; + 4365 : 6; + 4366 : 6; + 4367 : 6; + 4368 : 6; + 4369 : 6; + 4370 : 0; + 4371 : 6; + 4372 : 6; + 4373 : 6; + 4374 : 0; + 4375 : 6; + 4376 : 4; + 4377 : 4; + 4378 : 6; + 4379 : 6; + 4380 : 4; + 4381 : 4; + 4382 : 4; + 4383 : 6; + 4384 : 4; + 4385 : 4; + 4386 : 4; + 4387 : 4; + 4388 : 4; + 4389 : 4; + 4390 : 4; + 4391 : 6; + 4392 : 6; + 4393 : 4; + 4394 : 4; + 4395 : 4; + 4396 : 4; + 4397 : 8; + 4398 : 8; + 4399 : 8; + 4400 : 4; + 4401 : 4; + 4402 : 4; + 4403 : 6; + 4404 : 8; + 4405 : 8; + 4406 : 8; + 4407 : 8; + 4408 : 4; + 4409 : 4; + 4410 : 8; + 4411 : 8; + 4412 : 0; + 4413 : 0; + 4414 : 0; + 4415 : 0; + 4416 : 0; + 4417 : 0; + 4418 : 0; + 4419 : 4; + 4420 : 6; + 4421 : 6; + 4422 : 6; + 4423 : 4; + 4424 : 6; + 4425 : 6; + 4426 : 6; + 4427 : 6; + 4428 : 6; + 4429 : 6; + 4430 : 4; + 4431 : 6; + 4432 : 6; + 4433 : 6; + 4434 : 6; + 4435 : 6; + 4436 : 6; + 4437 : 6; + 4438 : 6; + 4439 : 6; + 4440 : 4; + 4441 : 4; + 4442 : 6; + 4443 : 6; + 4444 : 4; + 4445 : 4; + 4446 : 4; + 4447 : 4; + 4448 : 8; + 4449 : 4; + 4450 : 4; + 4451 : 4; + 4452 : 4; + 4453 : 6; + 4454 : 6; + 4455 : 8; + 4456 : 8; + 4457 : 8; + 4458 : 4; + 4459 : 4; + 4460 : 8; + 4461 : 8; + 4462 : 8; + 4463 : 8; + 4464 : 4; + 4465 : 4; + 4466 : 4; + 4467 : 4; + 4468 : 8; + 4469 : 8; + 4470 : 8; + 4471 : 8; + 4472 : 4; + 4473 : 4; + 4474 : 8; + 4475 : 8; + 4476 : 0; + 4477 : 0; + 4478 : 0; + 4479 : 0; + 4480 : 0; + 4481 : 0; + 4482 : 0; + 4483 : 4; + 4484 : 4; + 4485 : 6; + 4486 : 6; + 4487 : 4; + 4488 : 6; + 4489 : 6; + 4490 : 6; + 4491 : 6; + 4492 : 6; + 4493 : 6; + 4494 : 4; + 4495 : 4; + 4496 : 6; + 4497 : 6; + 4498 : 6; + 4499 : 6; + 4500 : 6; + 4501 : 6; + 4502 : 6; + 4503 : 0; + 4504 : 4; + 4505 : 4; + 4506 : 6; + 4507 : 6; + 4508 : 4; + 4509 : 4; + 4510 : 6; + 4511 : 6; + 4512 : 8; + 4513 : 4; + 4514 : 4; + 4515 : 4; + 4516 : 4; + 4517 : 8; + 4518 : 8; + 4519 : 8; + 4520 : 8; + 4521 : 8; + 4522 : 4; + 4523 : 4; + 4524 : 8; + 4525 : 8; + 4526 : 8; + 4527 : 8; + 4528 : 4; + 4529 : 4; + 4530 : 4; + 4531 : 4; + 4532 : 8; + 4533 : 8; + 4534 : 4; + 4535 : 4; + 4536 : 4; + 4537 : 4; + 4538 : 8; + 4539 : 8; + 4540 : 0; + 4541 : 0; + 4542 : 0; + 4543 : 0; + 4544 : 0; + 4545 : 0; + 4546 : 0; + 4547 : 4; + 4548 : 4; + 4549 : 0; + 4550 : 4; + 4551 : 4; + 4552 : 6; + 4553 : 6; + 4554 : 6; + 4555 : 6; + 4556 : 6; + 4557 : 6; + 4558 : 6; + 4559 : 6; + 4560 : 6; + 4561 : 6; + 4562 : 0; + 4563 : 6; + 4564 : 6; + 4565 : 6; + 4566 : 6; + 4567 : 6; + 4568 : 4; + 4569 : 4; + 4570 : 4; + 4571 : 6; + 4572 : 4; + 4573 : 4; + 4574 : 8; + 4575 : 6; + 4576 : 4; + 4577 : 4; + 4578 : 4; + 4579 : 4; + 4580 : 4; + 4581 : 8; + 4582 : 8; + 4583 : 8; + 4584 : 8; + 4585 : 6; + 4586 : 4; + 4587 : 4; + 4588 : 8; + 4589 : 8; + 4590 : 8; + 4591 : 8; + 4592 : 4; + 4593 : 4; + 4594 : 4; + 4595 : 4; + 4596 : 6; + 4597 : 4; + 4598 : 4; + 4599 : 6; + 4600 : 4; + 4601 : 8; + 4602 : 8; + 4603 : 8; + 4604 : 0; + 4605 : 0; + 4606 : 0; + 4607 : 0; + 4608 : 0; + 4609 : 0; + 4610 : 0; + 4611 : 4; + 4612 : 4; + 4613 : 6; + 4614 : 6; + 4615 : 4; + 4616 : 6; + 4617 : 6; + 4618 : 6; + 4619 : 6; + 4620 : 6; + 4621 : 6; + 4622 : 6; + 4623 : 0; + 4624 : 6; + 4625 : 4; + 4626 : 4; + 4627 : 6; + 4628 : 6; + 4629 : 6; + 4630 : 6; + 4631 : 6; + 4632 : 4; + 4633 : 4; + 4634 : 4; + 4635 : 6; + 4636 : 4; + 4637 : 4; + 4638 : 8; + 4639 : 6; + 4640 : 4; + 4641 : 8; + 4642 : 4; + 4643 : 4; + 4644 : 4; + 4645 : 8; + 4646 : 8; + 4647 : 6; + 4648 : 4; + 4649 : 4; + 4650 : 4; + 4651 : 4; + 4652 : 8; + 4653 : 8; + 4654 : 8; + 4655 : 4; + 4656 : 4; + 4657 : 4; + 4658 : 4; + 4659 : 4; + 4660 : 4; + 4661 : 4; + 4662 : 6; + 4663 : 8; + 4664 : 4; + 4665 : 8; + 4666 : 8; + 4667 : 0; + 4668 : 0; + 4669 : 0; + 4670 : 0; + 4671 : 0; + 4672 : 0; + 4673 : 0; + 4674 : 0; + 4675 : 4; + 4676 : 6; + 4677 : 6; + 4678 : 6; + 4679 : 4; + 4680 : 4; + 4681 : 6; + 4682 : 6; + 4683 : 6; + 4684 : 6; + 4685 : 6; + 4686 : 6; + 4687 : 6; + 4688 : 6; + 4689 : 6; + 4690 : 6; + 4691 : 6; + 4692 : 6; + 4693 : 6; + 4694 : 6; + 4695 : 6; + 4696 : 4; + 4697 : 4; + 4698 : 6; + 4699 : 6; + 4700 : 4; + 4701 : 4; + 4702 : 8; + 4703 : 6; + 4704 : 8; + 4705 : 4; + 4706 : 4; + 4707 : 4; + 4708 : 4; + 4709 : 4; + 4710 : 6; + 4711 : 4; + 4712 : 4; + 4713 : 6; + 4714 : 4; + 4715 : 4; + 4716 : 8; + 4717 : 8; + 4718 : 8; + 4719 : 8; + 4720 : 4; + 4721 : 4; + 4722 : 4; + 4723 : 4; + 4724 : 6; + 4725 : 4; + 4726 : 8; + 4727 : 8; + 4728 : 4; + 4729 : 8; + 4730 : 8; + 4731 : 0; + 4732 : 0; + 4733 : 0; + 4734 : 0; + 4735 : 0; + 4736 : 0; + 4737 : 0; + 4738 : 0; + 4739 : 4; + 4740 : 6; + 4741 : 6; + 4742 : 6; + 4743 : 4; + 4744 : 4; + 4745 : 6; + 4746 : 6; + 4747 : 6; + 4748 : 6; + 4749 : 6; + 4750 : 6; + 4751 : 6; + 4752 : 6; + 4753 : 6; + 4754 : 6; + 4755 : 6; + 4756 : 6; + 4757 : 6; + 4758 : 6; + 4759 : 6; + 4760 : 4; + 4761 : 4; + 4762 : 6; + 4763 : 6; + 4764 : 4; + 4765 : 4; + 4766 : 4; + 4767 : 6; + 4768 : 4; + 4769 : 4; + 4770 : 4; + 4771 : 4; + 4772 : 4; + 4773 : 4; + 4774 : 6; + 4775 : 4; + 4776 : 4; + 4777 : 8; + 4778 : 4; + 4779 : 4; + 4780 : 8; + 4781 : 8; + 4782 : 8; + 4783 : 8; + 4784 : 4; + 4785 : 4; + 4786 : 8; + 4787 : 4; + 4788 : 8; + 4789 : 8; + 4790 : 8; + 4791 : 8; + 4792 : 8; + 4793 : 8; + 4794 : 8; + 4795 : 0; + 4796 : 0; + 4797 : 0; + 4798 : 0; + 4799 : 0; + 4800 : 0; + 4801 : 0; + 4802 : 0; + 4803 : 4; + 4804 : 6; + 4805 : 6; + 4806 : 6; + 4807 : 4; + 4808 : 6; + 4809 : 6; + 4810 : 6; + 4811 : 6; + 4812 : 6; + 4813 : 6; + 4814 : 4; + 4815 : 4; + 4816 : 6; + 4817 : 6; + 4818 : 6; + 4819 : 6; + 4820 : 6; + 4821 : 6; + 4822 : 6; + 4823 : 0; + 4824 : 4; + 4825 : 4; + 4826 : 6; + 4827 : 6; + 4828 : 4; + 4829 : 4; + 4830 : 8; + 4831 : 8; + 4832 : 8; + 4833 : 4; + 4834 : 4; + 4835 : 4; + 4836 : 4; + 4837 : 6; + 4838 : 4; + 4839 : 8; + 4840 : 8; + 4841 : 8; + 4842 : 4; + 4843 : 4; + 4844 : 4; + 4845 : 8; + 4846 : 8; + 4847 : 8; + 4848 : 4; + 4849 : 4; + 4850 : 8; + 4851 : 4; + 4852 : 8; + 4853 : 8; + 4854 : 8; + 4855 : 4; + 4856 : 8; + 4857 : 8; + 4858 : 8; + 4859 : 0; + 4860 : 0; + 4861 : 0; + 4862 : 0; + 4863 : 0; + 4864 : 0; + 4865 : 0; + 4866 : 0; + 4867 : 4; + 4868 : 4; + 4869 : 6; + 4870 : 6; + 4871 : 4; + 4872 : 6; + 4873 : 6; + 4874 : 6; + 4875 : 6; + 4876 : 6; + 4877 : 6; + 4878 : 6; + 4879 : 4; + 4880 : 6; + 4881 : 6; + 4882 : 6; + 4883 : 6; + 4884 : 6; + 4885 : 6; + 4886 : 6; + 4887 : 6; + 4888 : 4; + 4889 : 4; + 4890 : 4; + 4891 : 0; + 4892 : 4; + 4893 : 4; + 4894 : 6; + 4895 : 6; + 4896 : 4; + 4897 : 4; + 4898 : 4; + 4899 : 4; + 4900 : 4; + 4901 : 8; + 4902 : 8; + 4903 : 8; + 4904 : 8; + 4905 : 8; + 4906 : 4; + 4907 : 4; + 4908 : 8; + 4909 : 8; + 4910 : 8; + 4911 : 8; + 4912 : 4; + 4913 : 4; + 4914 : 8; + 4915 : 8; + 4916 : 8; + 4917 : 8; + 4918 : 6; + 4919 : 4; + 4920 : 4; + 4921 : 8; + 4922 : 8; + 4923 : 0; + 4924 : 0; + 4925 : 0; + 4926 : 0; + 4927 : 0; + 4928 : 0; + 4929 : 0; + 4930 : 0; + 4931 : 4; + 4932 : 4; + 4933 : 0; + 4934 : 4; + 4935 : 4; + 4936 : 6; + 4937 : 6; + 4938 : 6; + 4939 : 6; + 4940 : 6; + 4941 : 6; + 4942 : 6; + 4943 : 4; + 4944 : 6; + 4945 : 4; + 4946 : 0; + 4947 : 6; + 4948 : 6; + 4949 : 6; + 4950 : 6; + 4951 : 6; + 4952 : 4; + 4953 : 4; + 4954 : 4; + 4955 : 6; + 4956 : 4; + 4957 : 4; + 4958 : 8; + 4959 : 6; + 4960 : 4; + 4961 : 4; + 4962 : 4; + 4963 : 4; + 4964 : 4; + 4965 : 8; + 4966 : 8; + 4967 : 8; + 4968 : 8; + 4969 : 4; + 4970 : 4; + 4971 : 8; + 4972 : 8; + 4973 : 8; + 4974 : 8; + 4975 : 4; + 4976 : 4; + 4977 : 4; + 4978 : 8; + 4979 : 8; + 4980 : 6; + 4981 : 4; + 4982 : 4; + 4983 : 4; + 4984 : 4; + 4985 : 8; + 4986 : 8; + 4987 : 0; + 4988 : 0; + 4989 : 0; + 4990 : 0; + 4991 : 0; + 4992 : 0; + 4993 : 0; + 4994 : 0; + 4995 : 4; + 4996 : 4; + 4997 : 6; + 4998 : 6; + 4999 : 4; + 5000 : 6; + 5001 : 6; + 5002 : 6; + 5003 : 6; + 5004 : 6; + 5005 : 6; + 5006 : 6; + 5007 : 6; + 5008 : 6; + 5009 : 6; + 5010 : 6; + 5011 : 6; + 5012 : 6; + 5013 : 6; + 5014 : 6; + 5015 : 6; + 5016 : 4; + 5017 : 4; + 5018 : 6; + 5019 : 6; + 5020 : 4; + 5021 : 4; + 5022 : 8; + 5023 : 6; + 5024 : 8; + 5025 : 8; + 5026 : 4; + 5027 : 4; + 5028 : 4; + 5029 : 4; + 5030 : 4; + 5031 : 4; + 5032 : 4; + 5033 : 4; + 5034 : 4; + 5035 : 8; + 5036 : 8; + 5037 : 8; + 5038 : 8; + 5039 : 8; + 5040 : 4; + 5041 : 4; + 5042 : 8; + 5043 : 8; + 5044 : 4; + 5045 : 4; + 5046 : 4; + 5047 : 8; + 5048 : 8; + 5049 : 8; + 5050 : 8; + 5051 : 0; + 5052 : 0; + 5053 : 0; + 5054 : 0; + 5055 : 0; + 5056 : 0; + 5057 : 0; + 5058 : 0; + 5059 : 4; + 5060 : 4; + 5061 : 6; + 5062 : 6; + 5063 : 4; + 5064 : 4; + 5065 : 6; + 5066 : 6; + 5067 : 6; + 5068 : 6; + 5069 : 6; + 5070 : 6; + 5071 : 6; + 5072 : 6; + 5073 : 6; + 5074 : 0; + 5075 : 6; + 5076 : 6; + 5077 : 6; + 5078 : 6; + 5079 : 6; + 5080 : 4; + 5081 : 4; + 5082 : 6; + 5083 : 6; + 5084 : 4; + 5085 : 4; + 5086 : 4; + 5087 : 6; + 5088 : 4; + 5089 : 4; + 5090 : 4; + 5091 : 4; + 5092 : 4; + 5093 : 4; + 5094 : 4; + 5095 : 6; + 5096 : 6; + 5097 : 4; + 5098 : 4; + 5099 : 8; + 5100 : 8; + 5101 : 8; + 5102 : 8; + 5103 : 8; + 5104 : 4; + 5105 : 4; + 5106 : 8; + 5107 : 4; + 5108 : 4; + 5109 : 8; + 5110 : 8; + 5111 : 8; + 5112 : 8; + 5113 : 8; + 5114 : 8; + 5115 : 0; + 5116 : 0; + 5117 : 0; + 5118 : 0; + 5119 : 0; + 5120 : 0; + 5121 : 0; + 5122 : 0; + 5123 : 4; + 5124 : 6; + 5125 : 6; + 5126 : 4; + 5127 : 4; + 5128 : 4; + 5129 : 6; + 5130 : 6; + 5131 : 6; + 5132 : 6; + 5133 : 6; + 5134 : 4; + 5135 : 6; + 5136 : 6; + 5137 : 6; + 5138 : 6; + 5139 : 6; + 5140 : 6; + 5141 : 6; + 5142 : 6; + 5143 : 6; + 5144 : 4; + 5145 : 4; + 5146 : 6; + 5147 : 6; + 5148 : 4; + 5149 : 4; + 5150 : 4; + 5151 : 4; + 5152 : 8; + 5153 : 8; + 5154 : 4; + 5155 : 4; + 5156 : 4; + 5157 : 4; + 5158 : 6; + 5159 : 8; + 5160 : 8; + 5161 : 8; + 5162 : 8; + 5163 : 8; + 5164 : 8; + 5165 : 8; + 5166 : 8; + 5167 : 8; + 5168 : 4; + 5169 : 4; + 5170 : 8; + 5171 : 8; + 5172 : 8; + 5173 : 8; + 5174 : 8; + 5175 : 8; + 5176 : 8; + 5177 : 8; + 5178 : 8; + 5179 : 0; + 5180 : 0; + 5181 : 0; + 5182 : 0; + 5183 : 0; + 5184 : 0; + 5185 : 0; + 5186 : 0; + 5187 : 4; + 5188 : 6; + 5189 : 6; + 5190 : 6; + 5191 : 4; + 5192 : 6; + 5193 : 6; + 5194 : 6; + 5195 : 6; + 5196 : 6; + 5197 : 6; + 5198 : 4; + 5199 : 0; + 5200 : 6; + 5201 : 6; + 5202 : 6; + 5203 : 6; + 5204 : 6; + 5205 : 6; + 5206 : 6; + 5207 : 0; + 5208 : 4; + 5209 : 4; + 5210 : 6; + 5211 : 6; + 5212 : 4; + 5213 : 4; + 5214 : 4; + 5215 : 6; + 5216 : 8; + 5217 : 4; + 5218 : 4; + 5219 : 4; + 5220 : 4; + 5221 : 4; + 5222 : 8; + 5223 : 8; + 5224 : 8; + 5225 : 8; + 5226 : 8; + 5227 : 8; + 5228 : 8; + 5229 : 8; + 5230 : 8; + 5231 : 8; + 5232 : 4; + 5233 : 4; + 5234 : 8; + 5235 : 8; + 5236 : 8; + 5237 : 8; + 5238 : 8; + 5239 : 4; + 5240 : 8; + 5241 : 8; + 5242 : 8; + 5243 : 0; + 5244 : 0; + 5245 : 0; + 5246 : 0; + 5247 : 0; + 5248 : 0; + 5249 : 0; + 5250 : 0; + 5251 : 4; + 5252 : 4; + 5253 : 0; + 5254 : 6; + 5255 : 4; + 5256 : 6; + 5257 : 6; + 5258 : 6; + 5259 : 6; + 5260 : 6; + 5261 : 6; + 5262 : 6; + 5263 : 6; + 5264 : 6; + 5265 : 6; + 5266 : 6; + 5267 : 6; + 5268 : 6; + 5269 : 6; + 5270 : 6; + 5271 : 6; + 5272 : 4; + 5273 : 4; + 5274 : 4; + 5275 : 6; + 5276 : 4; + 5277 : 4; + 5278 : 4; + 5279 : 6; + 5280 : 4; + 5281 : 4; + 5282 : 4; + 5283 : 4; + 5284 : 8; + 5285 : 8; + 5286 : 8; + 5287 : 8; + 5288 : 8; + 5289 : 8; + 5290 : 8; + 5291 : 8; + 5292 : 8; + 5293 : 8; + 5294 : 8; + 5295 : 8; + 5296 : 4; + 5297 : 4; + 5298 : 8; + 5299 : 8; + 5300 : 4; + 5301 : 4; + 5302 : 4; + 5303 : 4; + 5304 : 4; + 5305 : 8; + 5306 : 8; + 5307 : 0; + 5308 : 0; + 5309 : 0; + 5310 : 0; + 5311 : 0; + 5312 : 0; + 5313 : 0; + 5314 : 0; + 5315 : 4; + 5316 : 4; + 5317 : 0; + 5318 : 6; + 5319 : 4; + 5320 : 6; + 5321 : 6; + 5322 : 6; + 5323 : 6; + 5324 : 4; + 5325 : 4; + 5326 : 6; + 5327 : 0; + 5328 : 6; + 5329 : 4; + 5330 : 4; + 5331 : 6; + 5332 : 6; + 5333 : 6; + 5334 : 6; + 5335 : 6; + 5336 : 4; + 5337 : 4; + 5338 : 4; + 5339 : 6; + 5340 : 4; + 5341 : 4; + 5342 : 8; + 5343 : 6; + 5344 : 4; + 5345 : 8; + 5346 : 4; + 5347 : 4; + 5348 : 8; + 5349 : 8; + 5350 : 8; + 5351 : 6; + 5352 : 4; + 5353 : 4; + 5354 : 8; + 5355 : 8; + 5356 : 8; + 5357 : 8; + 5358 : 8; + 5359 : 8; + 5360 : 4; + 5361 : 4; + 5362 : 8; + 5363 : 8; + 5364 : 4; + 5365 : 4; + 5366 : 4; + 5367 : 4; + 5368 : 8; + 5369 : 8; + 5370 : 8; + 5371 : 0; + 5372 : 0; + 5373 : 0; + 5374 : 0; + 5375 : 0; + 5376 : 0; + 5377 : 0; + 5378 : 0; + 5379 : 4; + 5380 : 6; + 5381 : 6; + 5382 : 6; + 5383 : 4; + 5384 : 4; + 5385 : 6; + 5386 : 6; + 5387 : 6; + 5388 : 6; + 5389 : 6; + 5390 : 6; + 5391 : 4; + 5392 : 4; + 5393 : 6; + 5394 : 6; + 5395 : 6; + 5396 : 6; + 5397 : 6; + 5398 : 6; + 5399 : 6; + 5400 : 4; + 5401 : 4; + 5402 : 6; + 5403 : 6; + 5404 : 4; + 5405 : 4; + 5406 : 8; + 5407 : 8; + 5408 : 8; + 5409 : 8; + 5410 : 4; + 5411 : 4; + 5412 : 8; + 5413 : 4; + 5414 : 6; + 5415 : 4; + 5416 : 4; + 5417 : 6; + 5418 : 4; + 5419 : 8; + 5420 : 8; + 5421 : 8; + 5422 : 8; + 5423 : 8; + 5424 : 4; + 5425 : 4; + 5426 : 8; + 5427 : 8; + 5428 : 4; + 5429 : 4; + 5430 : 8; + 5431 : 8; + 5432 : 8; + 5433 : 8; + 5434 : 8; + 5435 : 0; + 5436 : 0; + 5437 : 0; + 5438 : 0; + 5439 : 0; + 5440 : 0; + 5441 : 0; + 5442 : 0; + 5443 : 4; + 5444 : 6; + 5445 : 6; + 5446 : 6; + 5447 : 4; + 5448 : 4; + 5449 : 6; + 5450 : 6; + 5451 : 6; + 5452 : 6; + 5453 : 6; + 5454 : 6; + 5455 : 6; + 5456 : 6; + 5457 : 4; + 5458 : 4; + 5459 : 6; + 5460 : 6; + 5461 : 6; + 5462 : 6; + 5463 : 6; + 5464 : 4; + 5465 : 4; + 5466 : 6; + 5467 : 6; + 5468 : 4; + 5469 : 4; + 5470 : 4; + 5471 : 6; + 5472 : 4; + 5473 : 8; + 5474 : 4; + 5475 : 4; + 5476 : 8; + 5477 : 4; + 5478 : 4; + 5479 : 4; + 5480 : 4; + 5481 : 8; + 5482 : 8; + 5483 : 8; + 5484 : 8; + 5485 : 8; + 5486 : 8; + 5487 : 8; + 5488 : 4; + 5489 : 4; + 5490 : 8; + 5491 : 4; + 5492 : 8; + 5493 : 8; + 5494 : 8; + 5495 : 8; + 5496 : 8; + 5497 : 8; + 5498 : 8; + 5499 : 0; + 5500 : 0; + 5501 : 0; + 5502 : 0; + 5503 : 0; + 5504 : 0; + 5505 : 0; + 5506 : 0; + 5507 : 4; + 5508 : 6; + 5509 : 6; + 5510 : 6; + 5511 : 4; + 5512 : 6; + 5513 : 6; + 5514 : 6; + 5515 : 6; + 5516 : 6; + 5517 : 6; + 5518 : 4; + 5519 : 6; + 5520 : 6; + 5521 : 6; + 5522 : 6; + 5523 : 4; + 5524 : 6; + 5525 : 6; + 5526 : 6; + 5527 : 6; + 5528 : 4; + 5529 : 4; + 5530 : 6; + 5531 : 6; + 5532 : 4; + 5533 : 4; + 5534 : 4; + 5535 : 8; + 5536 : 8; + 5537 : 8; + 5538 : 4; + 5539 : 4; + 5540 : 8; + 5541 : 4; + 5542 : 4; + 5543 : 8; + 5544 : 8; + 5545 : 8; + 5546 : 8; + 5547 : 8; + 5548 : 8; + 5549 : 8; + 5550 : 8; + 5551 : 4; + 5552 : 4; + 5553 : 4; + 5554 : 8; + 5555 : 8; + 5556 : 8; + 5557 : 8; + 5558 : 8; + 5559 : 8; + 5560 : 8; + 5561 : 8; + 5562 : 8; + 5563 : 0; + 5564 : 0; + 5565 : 0; + 5566 : 0; + 5567 : 0; + 5568 : 6; + 5569 : 6; + 5570 : 6; + 5571 : 4; + 5572 : 4; + 5573 : 6; + 5574 : 6; + 5575 : 4; + 5576 : 6; + 5577 : 6; + 5578 : 6; + 5579 : 6; + 5580 : 6; + 5581 : 6; + 5582 : 6; + 5583 : 4; + 5584 : 6; + 5585 : 6; + 5586 : 6; + 5587 : 6; + 5588 : 6; + 5589 : 6; + 5590 : 6; + 5591 : 0; + 5592 : 4; + 5593 : 4; + 5594 : 4; + 5595 : 0; + 5596 : 4; + 5597 : 4; + 5598 : 6; + 5599 : 6; + 5600 : 8; + 5601 : 8; + 5602 : 4; + 5603 : 4; + 5604 : 8; + 5605 : 8; + 5606 : 8; + 5607 : 8; + 5608 : 8; + 5609 : 8; + 5610 : 8; + 5611 : 8; + 5612 : 8; + 5613 : 8; + 5614 : 8; + 5615 : 4; + 5616 : 4; + 5617 : 4; + 5618 : 8; + 5619 : 8; + 5620 : 8; + 5621 : 8; + 5622 : 4; + 5623 : 8; + 5624 : 8; + 5625 : 8; + 5626 : 8; + 5627 : 0; + 5628 : 0; + 5629 : 0; + 5630 : 0; + 5631 : 0; + 5632 : 6; + 5633 : 6; + 5634 : 6; + 5635 : 6; + 5636 : 6; + 5637 : 6; + 5638 : 6; + 5639 : 4; + 5640 : 6; + 5641 : 6; + 5642 : 6; + 5643 : 6; + 5644 : 4; + 5645 : 4; + 5646 : 6; + 5647 : 6; + 5648 : 6; + 5649 : 6; + 5650 : 0; + 5651 : 6; + 5652 : 6; + 5653 : 6; + 5654 : 6; + 5655 : 6; + 5656 : 4; + 5657 : 4; + 5658 : 4; + 5659 : 6; + 5660 : 4; + 5661 : 4; + 5662 : 8; + 5663 : 6; + 5664 : 8; + 5665 : 8; + 5666 : 4; + 5667 : 4; + 5668 : 8; + 5669 : 8; + 5670 : 8; + 5671 : 8; + 5672 : 8; + 5673 : 4; + 5674 : 8; + 5675 : 8; + 5676 : 8; + 5677 : 8; + 5678 : 8; + 5679 : 4; + 5680 : 4; + 5681 : 4; + 5682 : 8; + 5683 : 8; + 5684 : 6; + 5685 : 4; + 5686 : 8; + 5687 : 4; + 5688 : 4; + 5689 : 8; + 5690 : 8; + 5691 : 8; + 5692 : 8; + 5693 : 0; + 5694 : 0; + 5695 : 0; + 5696 : 6; + 5697 : 6; + 5698 : 6; + 5699 : 4; + 5700 : 6; + 5701 : 6; + 5702 : 6; + 5703 : 4; + 5704 : 6; + 5705 : 6; + 5706 : 6; + 5707 : 6; + 5708 : 6; + 5709 : 6; + 5710 : 4; + 5711 : 4; + 5712 : 6; + 5713 : 4; + 5714 : 6; + 5715 : 6; + 5716 : 6; + 5717 : 6; + 5718 : 6; + 5719 : 6; + 5720 : 4; + 5721 : 4; + 5722 : 4; + 5723 : 6; + 5724 : 4; + 5725 : 4; + 5726 : 8; + 5727 : 6; + 5728 : 8; + 5729 : 8; + 5730 : 4; + 5731 : 4; + 5732 : 8; + 5733 : 8; + 5734 : 8; + 5735 : 4; + 5736 : 4; + 5737 : 4; + 5738 : 8; + 5739 : 8; + 5740 : 8; + 5741 : 8; + 5742 : 8; + 5743 : 4; + 5744 : 4; + 5745 : 4; + 5746 : 8; + 5747 : 8; + 5748 : 4; + 5749 : 8; + 5750 : 8; + 5751 : 8; + 5752 : 8; + 5753 : 8; + 5754 : 8; + 5755 : 8; + 5756 : 8; + 5757 : 8; + 5758 : 8; + 5759 : 0; + 5760 : 6; + 5761 : 6; + 5762 : 6; + 5763 : 6; + 5764 : 6; + 5765 : 6; + 5766 : 6; + 5767 : 4; + 5768 : 6; + 5769 : 6; + 5770 : 6; + 5771 : 6; + 5772 : 6; + 5773 : 6; + 5774 : 6; + 5775 : 6; + 5776 : 4; + 5777 : 6; + 5778 : 4; + 5779 : 6; + 5780 : 6; + 5781 : 6; + 5782 : 6; + 5783 : 6; + 5784 : 4; + 5785 : 4; + 5786 : 6; + 5787 : 6; + 5788 : 4; + 5789 : 4; + 5790 : 8; + 5791 : 6; + 5792 : 8; + 5793 : 8; + 5794 : 4; + 5795 : 4; + 5796 : 8; + 5797 : 4; + 5798 : 4; + 5799 : 4; + 5800 : 4; + 5801 : 4; + 5802 : 8; + 5803 : 8; + 5804 : 8; + 5805 : 8; + 5806 : 8; + 5807 : 4; + 5808 : 4; + 5809 : 4; + 5810 : 8; + 5811 : 4; + 5812 : 8; + 5813 : 8; + 5814 : 8; + 5815 : 8; + 5816 : 8; + 5817 : 8; + 5818 : 8; + 5819 : 8; + 5820 : 8; + 5821 : 8; + 5822 : 8; + 5823 : 8; + 5824 : 6; + 5825 : 6; + 5826 : 6; + 5827 : 6; + 5828 : 6; + 5829 : 6; + 5830 : 6; + 5831 : 4; + 5832 : 4; + 5833 : 6; + 5834 : 6; + 5835 : 6; + 5836 : 6; + 5837 : 6; + 5838 : 6; + 5839 : 6; + 5840 : 6; + 5841 : 4; + 5842 : 4; + 5843 : 6; + 5844 : 6; + 5845 : 6; + 5846 : 6; + 5847 : 6; + 5848 : 4; + 5849 : 4; + 5850 : 6; + 5851 : 6; + 5852 : 4; + 5853 : 4; + 5854 : 4; + 5855 : 6; + 5856 : 8; + 5857 : 8; + 5858 : 4; + 5859 : 4; + 5860 : 8; + 5861 : 4; + 5862 : 4; + 5863 : 4; + 5864 : 8; + 5865 : 8; + 5866 : 8; + 5867 : 8; + 5868 : 8; + 5869 : 8; + 5870 : 8; + 5871 : 4; + 5872 : 4; + 5873 : 4; + 5874 : 8; + 5875 : 8; + 5876 : 8; + 5877 : 8; + 5878 : 8; + 5879 : 8; + 5880 : 8; + 5881 : 8; + 5882 : 8; + 5883 : 8; + 5884 : 8; + 5885 : 8; + 5886 : 0; + 5887 : 0; + 5888 : 6; + 5889 : 6; + 5890 : 6; + 5891 : 6; + 5892 : 6; + 5893 : 6; + 5894 : 6; + 5895 : 6; + 5896 : 6; + 5897 : 6; + 5898 : 6; + 5899 : 6; + 5900 : 6; + 5901 : 6; + 5902 : 6; + 5903 : 4; + 5904 : 6; + 5905 : 6; + 5906 : 6; + 5907 : 6; + 5908 : 6; + 5909 : 6; + 5910 : 6; + 5911 : 0; + 5912 : 4; + 5913 : 4; + 5914 : 6; + 5915 : 6; + 5916 : 4; + 5917 : 4; + 5918 : 4; + 5919 : 4; + 5920 : 8; + 5921 : 4; + 5922 : 4; + 5923 : 4; + 5924 : 8; + 5925 : 4; + 5926 : 8; + 5927 : 8; + 5928 : 8; + 5929 : 8; + 5930 : 8; + 5931 : 8; + 5932 : 8; + 5933 : 8; + 5934 : 8; + 5935 : 4; + 5936 : 4; + 5937 : 4; + 5938 : 8; + 5939 : 8; + 5940 : 8; + 5941 : 8; + 5942 : 8; + 5943 : 8; + 5944 : 8; + 5945 : 8; + 5946 : 8; + 5947 : 8; + 5948 : 8; + 5949 : 8; + 5950 : 0; + 5951 : 0; + 5952 : 0; + 5953 : 6; + 5954 : 6; + 5955 : 6; + 5956 : 6; + 5957 : 6; + 5958 : 6; + 5959 : 6; + 5960 : 6; + 5961 : 6; + 5962 : 6; + 5963 : 6; + 5964 : 6; + 5965 : 6; + 5966 : 6; + 5967 : 4; + 5968 : 6; + 5969 : 6; + 5970 : 6; + 5971 : 6; + 5972 : 6; + 5973 : 6; + 5974 : 6; + 5975 : 6; + 5976 : 4; + 5977 : 4; + 5978 : 4; + 5979 : 0; + 5980 : 4; + 5981 : 4; + 5982 : 8; + 5983 : 8; + 5984 : 8; + 5985 : 4; + 5986 : 4; + 5987 : 4; + 5988 : 8; + 5989 : 8; + 5990 : 8; + 5991 : 8; + 5992 : 8; + 5993 : 8; + 5994 : 8; + 5995 : 8; + 5996 : 8; + 5997 : 8; + 5998 : 8; + 5999 : 4; + 6000 : 4; + 6001 : 4; + 6002 : 8; + 6003 : 8; + 6004 : 8; + 6005 : 8; + 6006 : 8; + 6007 : 8; + 6008 : 8; + 6009 : 8; + 6010 : 8; + 6011 : 8; + 6012 : 0; + 6013 : 0; + 6014 : 0; + 6015 : 0; + 6016 : 0; + 6017 : 0; + 6018 : 0; + 6019 : 6; + 6020 : 6; + 6021 : 6; + 6022 : 6; + 6023 : 6; + 6024 : 6; + 6025 : 6; + 6026 : 6; + 6027 : 6; + 6028 : 6; + 6029 : 6; + 6030 : 6; + 6031 : 4; + 6032 : 6; + 6033 : 6; + 6034 : 6; + 6035 : 6; + 6036 : 6; + 6037 : 6; + 6038 : 6; + 6039 : 6; + 6040 : 4; + 6041 : 4; + 6042 : 4; + 6043 : 6; + 6044 : 4; + 6045 : 4; + 6046 : 8; + 6047 : 8; + 6048 : 8; + 6049 : 4; + 6050 : 4; + 6051 : 8; + 6052 : 8; + 6053 : 8; + 6054 : 8; + 6055 : 8; + 6056 : 8; + 6057 : 8; + 6058 : 8; + 6059 : 8; + 6060 : 8; + 6061 : 8; + 6062 : 8; + 6063 : 4; + 6064 : 4; + 6065 : 4; + 6066 : 8; + 6067 : 8; + 6068 : 8; + 6069 : 8; + 6070 : 8; + 6071 : 8; + 6072 : 8; + 6073 : 8; + 6074 : 8; + 6075 : 0; + 6076 : 0; + 6077 : 0; + 6078 : 0; + 6079 : 0; + 6080 : 0; + 6081 : 0; + 6082 : 0; + 6083 : 0; + 6084 : 0; + 6085 : 6; + 6086 : 6; + 6087 : 6; + 6088 : 0; + 6089 : 6; + 6090 : 6; + 6091 : 6; + 6092 : 6; + 6093 : 6; + 6094 : 0; + 6095 : 4; + 6096 : 6; + 6097 : 6; + 6098 : 6; + 6099 : 6; + 6100 : 6; + 6101 : 6; + 6102 : 6; + 6103 : 6; + 6104 : 4; + 6105 : 4; + 6106 : 6; + 6107 : 6; + 6108 : 4; + 6109 : 4; + 6110 : 8; + 6111 : 8; + 6112 : 4; + 6113 : 4; + 6114 : 4; + 6115 : 8; + 6116 : 8; + 6117 : 4; + 6118 : 4; + 6119 : 4; + 6120 : 8; + 6121 : 4; + 6122 : 8; + 6123 : 8; + 6124 : 8; + 6125 : 8; + 6126 : 8; + 6127 : 4; + 6128 : 4; + 6129 : 4; + 6130 : 8; + 6131 : 8; + 6132 : 8; + 6133 : 8; + 6134 : 8; + 6135 : 8; + 6136 : 8; + 6137 : 0; + 6138 : 0; + 6139 : 0; + 6140 : 0; + 6141 : 0; + 6142 : 0; + 6143 : 0; + 6144 : 0; + 6145 : 0; + 6146 : 0; + 6147 : 0; + 6148 : 0; + 6149 : 0; + 6150 : 0; + 6151 : 6; + 6152 : 6; + 6153 : 6; + 6154 : 0; + 6155 : 6; + 6156 : 0; + 6157 : 6; + 6158 : 6; + 6159 : 6; + 6160 : 6; + 6161 : 4; + 6162 : 4; + 6163 : 6; + 6164 : 6; + 6165 : 6; + 6166 : 6; + 6167 : 6; + 6168 : 4; + 6169 : 4; + 6170 : 6; + 6171 : 6; + 6172 : 4; + 6173 : 4; + 6174 : 8; + 6175 : 8; + 6176 : 8; + 6177 : 4; + 6178 : 4; + 6179 : 8; + 6180 : 8; + 6181 : 8; + 6182 : 8; + 6183 : 4; + 6184 : 8; + 6185 : 8; + 6186 : 8; + 6187 : 8; + 6188 : 8; + 6189 : 8; + 6190 : 8; + 6191 : 8; + 6192 : 4; + 6193 : 4; + 6194 : 8; + 6195 : 8; + 6196 : 8; + 6197 : 0; + 6198 : 8; + 6199 : 8; + 6200 : 0; + 6201 : 0; + 6202 : 0; + 6203 : 0; + 6204 : 0; + 6205 : 0; + 6206 : 0; + 6207 : 0; + 6208 : 0; + 6209 : 0; + 6210 : 0; + 6211 : 0; + 6212 : 0; + 6213 : 0; + 6214 : 0; + 6215 : 0; + 6216 : 4; + 6217 : 6; + 6218 : 6; + 6219 : 6; + 6220 : 6; + 6221 : 6; + 6222 : 6; + 6223 : 6; + 6224 : 6; + 6225 : 6; + 6226 : 6; + 6227 : 6; + 6228 : 6; + 6229 : 6; + 6230 : 6; + 6231 : 6; + 6232 : 4; + 6233 : 4; + 6234 : 6; + 6235 : 6; + 6236 : 4; + 6237 : 4; + 6238 : 8; + 6239 : 8; + 6240 : 8; + 6241 : 4; + 6242 : 4; + 6243 : 8; + 6244 : 8; + 6245 : 8; + 6246 : 8; + 6247 : 8; + 6248 : 8; + 6249 : 8; + 6250 : 8; + 6251 : 8; + 6252 : 8; + 6253 : 8; + 6254 : 8; + 6255 : 8; + 6256 : 8; + 6257 : 8; + 6258 : 8; + 6259 : 8; + 6260 : 0; + 6261 : 0; + 6262 : 0; + 6263 : 0; + 6264 : 0; + 6265 : 0; + 6266 : 0; + 6267 : 0; + 6268 : 0; + 6269 : 0; + 6270 : 0; + 6271 : 0; + 6272 : 0; + 6273 : 0; + 6274 : 0; + 6275 : 0; + 6276 : 0; + 6277 : 0; + 6278 : 0; + 6279 : 0; + 6280 : 0; + 6281 : 0; + 6282 : 0; + 6283 : 6; + 6284 : 6; + 6285 : 6; + 6286 : 6; + 6287 : 6; + 6288 : 6; + 6289 : 6; + 6290 : 6; + 6291 : 6; + 6292 : 6; + 6293 : 6; + 6294 : 6; + 6295 : 6; + 6296 : 4; + 6297 : 4; + 6298 : 6; + 6299 : 6; + 6300 : 4; + 6301 : 4; + 6302 : 8; + 6303 : 8; + 6304 : 8; + 6305 : 4; + 6306 : 4; + 6307 : 8; + 6308 : 8; + 6309 : 8; + 6310 : 8; + 6311 : 8; + 6312 : 8; + 6313 : 8; + 6314 : 8; + 6315 : 8; + 6316 : 8; + 6317 : 8; + 6318 : 8; + 6319 : 8; + 6320 : 8; + 6321 : 8; + 6322 : 8; + 6323 : 8; + 6324 : 0; + 6325 : 0; + 6326 : 0; + 6327 : 0; + 6328 : 0; + 6329 : 0; + 6330 : 0; + 6331 : 0; + 6332 : 0; + 6333 : 0; + 6334 : 0; + 6335 : 0; + 6336 : 0; + 6337 : 0; + 6338 : 0; + 6339 : 0; + 6340 : 0; + 6341 : 0; + 6342 : 0; + 6343 : 0; + 6344 : 0; + 6345 : 0; + 6346 : 0; + 6347 : 0; + 6348 : 0; + 6349 : 6; + 6350 : 6; + 6351 : 6; + 6352 : 6; + 6353 : 6; + 6354 : 6; + 6355 : 6; + 6356 : 6; + 6357 : 6; + 6358 : 6; + 6359 : 6; + 6360 : 4; + 6361 : 4; + 6362 : 6; + 6363 : 6; + 6364 : 4; + 6365 : 4; + 6366 : 8; + 6367 : 8; + 6368 : 8; + 6369 : 4; + 6370 : 4; + 6371 : 8; + 6372 : 8; + 6373 : 8; + 6374 : 8; + 6375 : 8; + 6376 : 8; + 6377 : 8; + 6378 : 8; + 6379 : 8; + 6380 : 8; + 6381 : 8; + 6382 : 8; + 6383 : 8; + 6384 : 8; + 6385 : 8; + 6386 : 8; + 6387 : 0; + 6388 : 0; + 6389 : 0; + 6390 : 0; + 6391 : 0; + 6392 : 0; + 6393 : 0; + 6394 : 0; + 6395 : 0; + 6396 : 0; + 6397 : 0; + 6398 : 0; + 6399 : 0; + 6400 : 0; + 6401 : 0; + 6402 : 0; + 6403 : 0; + 6404 : 0; + 6405 : 0; + 6406 : 0; + 6407 : 0; + 6408 : 0; + 6409 : 0; + 6410 : 0; + 6411 : 0; + 6412 : 0; + 6413 : 0; + 6414 : 0; + 6415 : 6; + 6416 : 6; + 6417 : 6; + 6418 : 6; + 6419 : 6; + 6420 : 6; + 6421 : 6; + 6422 : 6; + 6423 : 6; + 6424 : 4; + 6425 : 4; + 6426 : 6; + 6427 : 6; + 6428 : 4; + 6429 : 4; + 6430 : 8; + 6431 : 8; + 6432 : 8; + 6433 : 4; + 6434 : 4; + 6435 : 8; + 6436 : 8; + 6437 : 8; + 6438 : 8; + 6439 : 8; + 6440 : 8; + 6441 : 8; + 6442 : 8; + 6443 : 8; + 6444 : 8; + 6445 : 8; + 6446 : 8; + 6447 : 8; + 6448 : 8; + 6449 : 0; + 6450 : 0; + 6451 : 0; + 6452 : 0; + 6453 : 0; + 6454 : 0; + 6455 : 0; + 6456 : 0; + 6457 : 0; + 6458 : 0; + 6459 : 0; + 6460 : 0; + 6461 : 0; + 6462 : 0; + 6463 : 0; + 6464 : 0; + 6465 : 0; + 6466 : 0; + 6467 : 0; + 6468 : 0; + 6469 : 0; + 6470 : 0; + 6471 : 0; + 6472 : 0; + 6473 : 0; + 6474 : 0; + 6475 : 0; + 6476 : 0; + 6477 : 0; + 6478 : 0; + 6479 : 0; + 6480 : 4; + 6481 : 6; + 6482 : 6; + 6483 : 6; + 6484 : 6; + 6485 : 6; + 6486 : 6; + 6487 : 6; + 6488 : 6; + 6489 : 6; + 6490 : 6; + 6491 : 6; + 6492 : 4; + 6493 : 4; + 6494 : 8; + 6495 : 8; + 6496 : 8; + 6497 : 4; + 6498 : 4; + 6499 : 8; + 6500 : 8; + 6501 : 8; + 6502 : 8; + 6503 : 8; + 6504 : 8; + 6505 : 8; + 6506 : 8; + 6507 : 8; + 6508 : 8; + 6509 : 8; + 6510 : 8; + 6511 : 8; + 6512 : 0; + 6513 : 0; + 6514 : 0; + 6515 : 0; + 6516 : 0; + 6517 : 0; + 6518 : 0; + 6519 : 0; + 6520 : 0; + 6521 : 0; + 6522 : 0; + 6523 : 0; + 6524 : 0; + 6525 : 0; + 6526 : 0; + 6527 : 0; + 6528 : 0; + 6529 : 0; + 6530 : 0; + 6531 : 0; + 6532 : 0; + 6533 : 0; + 6534 : 0; + 6535 : 0; + 6536 : 0; + 6537 : 0; + 6538 : 0; + 6539 : 0; + 6540 : 0; + 6541 : 0; + 6542 : 0; + 6543 : 0; + 6544 : 0; + 6545 : 0; + 6546 : 0; + 6547 : 6; + 6548 : 6; + 6549 : 6; + 6550 : 6; + 6551 : 6; + 6552 : 6; + 6553 : 6; + 6554 : 6; + 6555 : 6; + 6556 : 4; + 6557 : 4; + 6558 : 8; + 6559 : 8; + 6560 : 8; + 6561 : 4; + 6562 : 4; + 6563 : 8; + 6564 : 8; + 6565 : 8; + 6566 : 8; + 6567 : 8; + 6568 : 8; + 6569 : 8; + 6570 : 8; + 6571 : 8; + 6572 : 8; + 6573 : 8; + 6574 : 8; + 6575 : 0; + 6576 : 0; + 6577 : 0; + 6578 : 0; + 6579 : 0; + 6580 : 0; + 6581 : 0; + 6582 : 0; + 6583 : 0; + 6584 : 0; + 6585 : 0; + 6586 : 0; + 6587 : 0; + 6588 : 0; + 6589 : 0; + 6590 : 0; + 6591 : 0; + 6592 : 0; + 6593 : 0; + 6594 : 0; + 6595 : 0; + 6596 : 0; + 6597 : 0; + 6598 : 0; + 6599 : 0; + 6600 : 0; + 6601 : 0; + 6602 : 0; + 6603 : 0; + 6604 : 0; + 6605 : 0; + 6606 : 0; + 6607 : 0; + 6608 : 0; + 6609 : 0; + 6610 : 0; + 6611 : 0; + 6612 : 0; + 6613 : 6; + 6614 : 6; + 6615 : 6; + 6616 : 6; + 6617 : 6; + 6618 : 6; + 6619 : 6; + 6620 : 6; + 6621 : 4; + 6622 : 8; + 6623 : 8; + 6624 : 8; + 6625 : 4; + 6626 : 4; + 6627 : 8; + 6628 : 8; + 6629 : 8; + 6630 : 8; + 6631 : 8; + 6632 : 8; + 6633 : 8; + 6634 : 8; + 6635 : 8; + 6636 : 8; + 6637 : 0; + 6638 : 0; + 6639 : 0; + 6640 : 0; + 6641 : 0; + 6642 : 0; + 6643 : 0; + 6644 : 0; + 6645 : 0; + 6646 : 0; + 6647 : 0; + 6648 : 0; + 6649 : 0; + 6650 : 0; + 6651 : 0; + 6652 : 0; + 6653 : 0; + 6654 : 0; + 6655 : 0; + 6656 : 0; + 6657 : 0; + 6658 : 0; + 6659 : 0; + 6660 : 0; + 6661 : 0; + 6662 : 0; + 6663 : 0; + 6664 : 0; + 6665 : 0; + 6666 : 0; + 6667 : 0; + 6668 : 0; + 6669 : 0; + 6670 : 0; + 6671 : 0; + 6672 : 0; + 6673 : 0; + 6674 : 0; + 6675 : 0; + 6676 : 0; + 6677 : 0; + 6678 : 0; + 6679 : 6; + 6680 : 6; + 6681 : 6; + 6682 : 6; + 6683 : 6; + 6684 : 6; + 6685 : 6; + 6686 : 6; + 6687 : 6; + 6688 : 6; + 6689 : 6; + 6690 : 6; + 6691 : 6; + 6692 : 6; + 6693 : 6; + 6694 : 6; + 6695 : 6; + 6696 : 6; + 6697 : 6; + 6698 : 6; + 6699 : 8; + 6700 : 0; + 6701 : 0; + 6702 : 0; + 6703 : 0; + 6704 : 0; + 6705 : 0; + 6706 : 0; + 6707 : 0; + 6708 : 0; + 6709 : 0; + 6710 : 0; + 6711 : 0; + 6712 : 0; + 6713 : 0; + 6714 : 0; + 6715 : 0; + 6716 : 0; + 6717 : 0; + 6718 : 0; + 6719 : 0; + 6720 : 0; + 6721 : 0; + 6722 : 0; + 6723 : 0; + 6724 : 0; + 6725 : 0; + 6726 : 0; + 6727 : 0; + 6728 : 0; + 6729 : 0; + 6730 : 0; + 6731 : 0; + 6732 : 0; + 6733 : 0; + 6734 : 0; + 6735 : 0; + 6736 : 0; + 6737 : 0; + 6738 : 0; + 6739 : 0; + 6740 : 0; + 6741 : 0; + 6742 : 0; + 6743 : 0; + 6744 : 0; + 6745 : 6; + 6746 : 6; + 6747 : 6; + 6748 : 6; + 6749 : 6; + 6750 : 6; + 6751 : 6; + 6752 : 6; + 6753 : 6; + 6754 : 6; + 6755 : 6; + 6756 : 6; + 6757 : 6; + 6758 : 6; + 6759 : 6; + 6760 : 4; + 6761 : 0; + 6762 : 0; + 6763 : 0; + 6764 : 0; + 6765 : 0; + 6766 : 0; + 6767 : 0; + 6768 : 0; + 6769 : 0; + 6770 : 0; + 6771 : 0; + 6772 : 0; + 6773 : 0; + 6774 : 0; + 6775 : 0; + 6776 : 0; + 6777 : 0; + 6778 : 0; + 6779 : 0; + 6780 : 0; + 6781 : 0; + 6782 : 0; + 6783 : 0; + 6784 : 0; + 6785 : 0; + 6786 : 0; + 6787 : 0; + 6788 : 0; + 6789 : 0; + 6790 : 0; + 6791 : 0; + 6792 : 0; + 6793 : 0; + 6794 : 0; + 6795 : 0; + 6796 : 0; + 6797 : 0; + 6798 : 0; + 6799 : 0; + 6800 : 0; + 6801 : 0; + 6802 : 0; + 6803 : 0; + 6804 : 0; + 6805 : 0; + 6806 : 0; + 6807 : 0; + 6808 : 0; + 6809 : 0; + 6810 : 0; + 6811 : 6; + 6812 : 6; + 6813 : 6; + 6814 : 6; + 6815 : 6; + 6816 : 6; + 6817 : 6; + 6818 : 6; + 6819 : 6; + 6820 : 6; + 6821 : 6; + 6822 : 0; + 6823 : 0; + 6824 : 0; + 6825 : 0; + 6826 : 0; + 6827 : 0; + 6828 : 0; + 6829 : 0; + 6830 : 0; + 6831 : 0; + 6832 : 0; + 6833 : 0; + 6834 : 0; + 6835 : 0; + 6836 : 0; + 6837 : 0; + 6838 : 0; + 6839 : 0; + 6840 : 0; + 6841 : 0; + 6842 : 0; + 6843 : 0; + 6844 : 0; + 6845 : 0; + 6846 : 0; + 6847 : 0; + [6848..7999] : 0; +END; \ No newline at end of file diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_building.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_building.v new file mode 100644 index 00000000..cb26b386 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_building.v @@ -0,0 +1,161 @@ +// megafunction wizard: %ROM: 1-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: sprite_building.v +// Megafunction Name(s): +// altsyncram +// +// 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 sprite_building ( + address, + clock, + q); + + input [12:0] address; + input clock; + output [3:0] q; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [3:0] sub_wire0; + wire [3:0] q = sub_wire0[3:0]; + + altsyncram altsyncram_component ( + .address_a (address), + .clock0 (clock), + .q_a (sub_wire0), + .aclr0 (1'b0), + .aclr1 (1'b0), + .address_b (1'b1), + .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_a ({4{1'b1}}), + .data_b (1'b1), + .eccstatus (), + .q_b (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_a (1'b0), + .wren_b (1'b0)); + defparam + altsyncram_component.address_aclr_a = "NONE", + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", + altsyncram_component.init_file = "sprite_building.mif", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 8000, + altsyncram_component.operation_mode = "ROM", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_reg_a = "CLOCK0", + altsyncram_component.ram_block_type = "M9K", + altsyncram_component.widthad_a = 13, + altsyncram_component.width_a = 4, + altsyncram_component.width_byteena_a = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +// Retrieval info: PRIVATE: AclrByte NUMERIC "0" +// Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: Clken NUMERIC "0" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "sprite_building.mif" +// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8000" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "2" +// Retrieval info: PRIVATE: RegAddr NUMERIC "1" +// Retrieval info: PRIVATE: RegOutput NUMERIC "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: SingleClock NUMERIC "1" +// Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +// Retrieval info: PRIVATE: WidthAddr NUMERIC "13" +// Retrieval info: PRIVATE: WidthData NUMERIC "4" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: INIT_FILE STRING "sprite_building.mif" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "8000" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +// Retrieval info: CONSTANT: RAM_BLOCK_TYPE STRING "M9K" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "4" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: USED_PORT: address 0 0 13 0 INPUT NODEFVAL "address[12..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: q 0 0 4 0 OUTPUT NODEFVAL "q[3..0]" +// Retrieval info: CONNECT: @address_a 0 0 13 0 address 0 0 13 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: q 0 0 4 0 @q_a 0 0 4 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_building.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_building.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_building.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_building.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_building_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_building_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_fuel.mif b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_fuel.mif new file mode 100644 index 00000000..708dd137 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_fuel.mif @@ -0,0 +1,7818 @@ +WIDTH=4; +DEPTH=8000; + +ADDRESS_RADIX=UNS; +DATA_RADIX=HEX; + +CONTENT BEGIN + + 0 : 0; + 1 : 0; + 2 : 0; + 3 : 0; + 4 : 0; + 5 : 0; + 6 : 0; + 7 : 0; + 8 : 0; + 9 : 5; + 10 : 5; + 11 : 5; + 12 : 5; + 13 : 5; + 14 : 5; + 15 : 5; + 16 : 5; + 17 : 5; + 18 : 5; + 19 : 5; + 20 : 5; + 21 : 5; + 22 : 5; + 23 : 5; + 24 : 5; + 25 : 5; + 26 : 5; + 27 : 5; + 28 : 5; + 29 : 5; + 30 : 5; + 31 : 5; + 32 : 5; + 33 : 5; + 34 : 5; + 35 : 5; + 36 : 5; + 37 : 5; + 38 : 5; + 39 : 5; + 40 : 5; + 41 : 5; + 42 : 5; + 43 : 5; + 44 : 5; + 45 : 5; + 46 : 5; + 47 : 5; + 48 : 5; + 49 : 5; + 50 : 5; + 51 : 5; + 52 : 5; + 53 : 5; + 54 : 0; + 55 : 0; + 56 : 0; + 57 : 0; + 58 : 0; + 59 : 0; + 60 : 0; + 61 : 0; + 62 : 0; + 63 : 0; + 64 : 0; + 65 : 0; + 66 : 0; + 67 : 0; + 68 : 0; + 69 : 0; + 70 : 0; + 71 : 0; + 72 : 5; + 73 : 5; + 74 : 5; + 75 : 5; + 76 : 5; + 77 : 5; + 78 : 5; + 79 : 5; + 80 : 5; + 81 : 5; + 82 : 5; + 83 : 5; + 84 : 5; + 85 : 5; + 86 : 5; + 87 : 5; + 88 : 5; + 89 : 5; + 90 : 5; + 91 : 5; + 92 : 5; + 93 : 5; + 94 : 5; + 95 : 5; + 96 : 5; + 97 : 5; + 98 : 5; + 99 : 5; + 100 : 5; + 101 : 5; + 102 : 5; + 103 : 5; + 104 : 5; + 105 : 5; + 106 : 5; + 107 : 5; + 108 : 5; + 109 : 5; + 110 : 5; + 111 : 5; + 112 : 5; + 113 : 5; + 114 : 5; + 115 : 5; + 116 : 5; + 117 : 5; + 118 : 5; + 119 : 0; + 120 : 0; + 121 : 0; + 122 : 0; + 123 : 0; + 124 : 0; + 125 : 0; + 126 : 0; + 127 : 0; + 128 : 0; + 129 : 0; + 130 : 0; + 131 : 0; + 132 : 0; + 133 : 0; + 134 : 0; + 135 : 0; + 136 : 5; + 137 : 5; + 138 : 5; + 139 : 5; + 140 : 5; + 141 : 5; + 142 : 5; + 143 : 5; + 144 : 5; + 145 : 5; + 146 : 5; + 147 : 5; + 148 : 5; + 149 : 5; + 150 : 5; + 151 : 5; + 152 : 5; + 153 : 5; + 154 : 5; + 155 : 5; + 156 : 5; + 157 : 5; + 158 : 5; + 159 : 5; + 160 : 5; + 161 : 5; + 162 : 5; + 163 : 5; + 164 : 5; + 165 : 5; + 166 : 5; + 167 : 5; + 168 : 5; + 169 : 5; + 170 : 5; + 171 : 5; + 172 : 5; + 173 : 5; + 174 : 5; + 175 : 5; + 176 : 5; + 177 : 5; + 178 : 5; + 179 : 5; + 180 : 5; + 181 : 5; + 182 : 5; + 183 : 0; + 184 : 0; + 185 : 0; + 186 : 0; + 187 : 0; + 188 : 0; + 189 : 0; + 190 : 0; + 191 : 0; + 192 : 0; + 193 : 0; + 194 : 0; + 195 : 0; + 196 : 0; + 197 : 0; + 198 : 0; + 199 : 0; + 200 : 5; + 201 : 5; + 202 : 5; + 203 : 5; + 204 : 5; + 205 : 5; + 206 : 5; + 207 : 5; + 208 : 5; + 209 : 5; + 210 : 5; + 211 : 5; + 212 : 5; + 213 : 5; + 214 : 5; + 215 : 5; + 216 : 5; + 217 : 5; + 218 : 5; + 219 : 5; + 220 : 5; + 221 : 5; + 222 : 5; + 223 : 5; + 224 : 5; + 225 : 5; + 226 : 5; + 227 : 5; + 228 : 5; + 229 : 5; + 230 : 5; + 231 : 5; + 232 : 5; + 233 : 5; + 234 : 5; + 235 : 5; + 236 : 5; + 237 : 5; + 238 : 5; + 239 : 5; + 240 : 5; + 241 : 5; + 242 : 5; + 243 : 5; + 244 : 5; + 245 : 5; + 246 : 5; + 247 : 0; + 248 : 0; + 249 : 0; + 250 : 0; + 251 : 0; + 252 : 0; + 253 : 0; + 254 : 0; + 255 : 0; + 256 : 0; + 257 : 5; + 258 : 5; + 259 : 5; + 260 : 5; + 261 : 5; + 262 : 5; + 263 : 5; + 264 : 5; + 265 : 5; + 266 : 5; + 267 : 5; + 268 : 5; + 269 : 5; + 270 : 5; + 271 : 5; + 272 : 1; + 273 : 1; + 274 : 1; + 275 : 1; + 276 : 1; + 277 : 1; + 278 : 1; + 279 : 1; + 280 : 1; + 281 : 1; + 282 : 1; + 283 : 1; + 284 : 1; + 285 : 1; + 286 : 1; + 287 : 1; + 288 : 1; + 289 : 1; + 290 : 1; + 291 : 1; + 292 : 1; + 293 : 1; + 294 : 1; + 295 : 1; + 296 : 1; + 297 : 1; + 298 : 1; + 299 : 5; + 300 : 5; + 301 : 5; + 302 : 5; + 303 : 5; + 304 : 5; + 305 : 5; + 306 : 5; + 307 : 5; + 308 : 5; + 309 : 5; + 310 : 5; + 311 : 5; + 312 : 5; + 313 : 5; + 314 : 5; + 315 : 5; + 316 : 5; + 317 : 0; + 318 : 0; + 319 : 0; + 320 : 5; + 321 : 5; + 322 : 5; + 323 : 5; + 324 : 5; + 325 : 5; + 326 : 5; + 327 : 5; + 328 : 5; + 329 : 5; + 330 : 5; + 331 : 5; + 332 : 5; + 333 : 5; + 334 : 5; + 335 : 5; + 336 : 1; + 337 : 1; + 338 : 1; + 339 : 1; + 340 : 1; + 341 : 1; + 342 : 1; + 343 : 1; + 344 : 1; + 345 : 1; + 346 : 1; + 347 : 1; + 348 : 1; + 349 : 1; + 350 : 1; + 351 : 1; + 352 : 1; + 353 : 1; + 354 : 1; + 355 : 1; + 356 : 1; + 357 : 1; + 358 : 1; + 359 : 1; + 360 : 1; + 361 : 1; + 362 : 1; + 363 : 5; + 364 : 5; + 365 : 5; + 366 : 5; + 367 : 5; + 368 : 5; + 369 : 5; + 370 : 5; + 371 : 5; + 372 : 5; + 373 : 5; + 374 : 5; + 375 : 5; + 376 : 5; + 377 : 5; + 378 : 5; + 379 : 5; + 380 : 5; + 381 : 5; + 382 : 0; + 383 : 0; + 384 : 5; + 385 : 5; + 386 : 5; + 387 : 5; + 388 : 5; + 389 : 5; + 390 : 5; + 391 : 5; + 392 : 5; + 393 : 5; + 394 : 5; + 395 : 5; + 396 : 5; + 397 : 5; + 398 : 5; + 399 : 5; + 400 : 1; + 401 : 1; + 402 : 1; + 403 : 1; + 404 : 1; + 405 : 1; + 406 : 1; + 407 : 1; + 408 : 1; + 409 : 1; + 410 : 1; + 411 : 1; + 412 : 1; + 413 : 1; + 414 : 1; + 415 : 1; + 416 : 1; + 417 : 1; + 418 : 1; + 419 : 1; + 420 : 1; + 421 : 1; + 422 : 1; + 423 : 1; + 424 : 1; + 425 : 1; + 426 : 1; + 427 : 5; + 428 : 5; + 429 : 5; + 430 : 5; + 431 : 5; + 432 : 5; + 433 : 5; + 434 : 5; + 435 : 5; + 436 : 5; + 437 : 5; + 438 : 5; + 439 : 5; + 440 : 5; + 441 : 5; + 442 : 5; + 443 : 5; + 444 : 5; + 445 : 5; + 446 : 0; + 447 : 0; + 448 : 5; + 449 : 5; + 450 : 5; + 451 : 5; + 452 : 5; + 453 : 5; + 454 : 5; + 455 : 5; + 456 : 5; + 457 : 5; + 458 : 5; + 459 : 5; + 460 : 5; + 461 : 5; + 462 : 5; + 463 : 5; + 464 : 1; + 465 : 1; + 466 : 1; + 467 : 1; + 468 : 1; + 469 : 1; + 470 : 1; + 471 : 1; + 472 : 1; + 473 : 1; + 474 : 1; + 475 : 1; + 476 : 1; + 477 : 1; + 478 : 1; + 479 : 1; + 480 : 1; + 481 : 1; + 482 : 1; + 483 : 1; + 484 : 1; + 485 : 1; + 486 : 1; + 487 : 1; + 488 : 1; + 489 : 1; + 490 : 1; + 491 : 5; + 492 : 5; + 493 : 5; + 494 : 5; + 495 : 5; + 496 : 5; + 497 : 5; + 498 : 5; + 499 : 5; + 500 : 5; + 501 : 5; + 502 : 5; + 503 : 5; + 504 : 5; + 505 : 5; + 506 : 5; + 507 : 5; + 508 : 5; + 509 : 5; + 510 : 0; + 511 : 0; + 512 : 5; + 513 : 5; + 514 : 5; + 515 : 5; + 516 : 5; + 517 : 5; + 518 : 5; + 519 : 5; + 520 : 5; + 521 : 5; + 522 : 5; + 523 : 5; + 524 : 5; + 525 : 5; + 526 : 5; + 527 : 5; + 528 : 1; + 529 : 1; + 530 : 1; + 531 : 1; + 532 : 1; + 533 : 1; + 534 : 1; + 535 : 1; + 536 : 1; + 537 : 1; + 538 : 1; + 539 : 1; + 540 : 5; + 541 : 5; + 542 : 5; + 543 : 5; + 544 : 5; + 545 : 5; + 546 : 5; + 547 : 1; + 548 : 1; + 549 : 1; + 550 : 1; + 551 : 1; + 552 : 1; + 553 : 1; + 554 : 1; + 555 : 5; + 556 : 5; + 557 : 5; + 558 : 5; + 559 : 5; + 560 : 5; + 561 : 5; + 562 : 5; + 563 : 5; + 564 : 5; + 565 : 5; + 566 : 5; + 567 : 5; + 568 : 5; + 569 : 5; + 570 : 5; + 571 : 5; + 572 : 5; + 573 : 5; + 574 : 0; + 575 : 0; + 576 : 5; + 577 : 5; + 578 : 5; + 579 : 5; + 580 : 5; + 581 : 5; + 582 : 5; + 583 : 5; + 584 : 5; + 585 : 5; + 586 : 5; + 587 : 5; + 588 : 5; + 589 : 5; + 590 : 5; + 591 : 5; + 592 : 1; + 593 : 1; + 594 : 1; + 595 : 1; + 596 : 1; + 597 : 1; + 598 : 1; + 599 : 1; + 600 : 1; + 601 : 1; + 602 : 1; + 603 : 1; + 604 : 5; + 605 : 5; + 606 : 5; + 607 : 5; + 608 : 5; + 609 : 5; + 610 : 5; + 611 : 1; + 612 : 1; + 613 : 1; + 614 : 1; + 615 : 1; + 616 : 1; + 617 : 1; + 618 : 1; + 619 : 5; + 620 : 5; + 621 : 5; + 622 : 5; + 623 : 5; + 624 : 5; + 625 : 5; + 626 : 5; + 627 : 5; + 628 : 5; + 629 : 5; + 630 : 5; + 631 : 5; + 632 : 5; + 633 : 5; + 634 : 5; + 635 : 5; + 636 : 5; + 637 : 5; + 638 : 0; + 639 : 0; + 640 : 5; + 641 : 5; + 642 : 5; + 643 : 5; + 644 : 5; + 645 : 5; + 646 : 5; + 647 : 5; + 648 : 5; + 649 : 5; + 650 : 5; + 651 : 5; + 652 : 5; + 653 : 5; + 654 : 5; + 655 : 5; + 656 : 1; + 657 : 1; + 658 : 1; + 659 : 1; + 660 : 1; + 661 : 1; + 662 : 1; + 663 : 1; + 664 : 1; + 665 : 1; + 666 : 1; + 667 : 1; + 668 : 5; + 669 : 5; + 670 : 5; + 671 : 5; + 672 : 5; + 673 : 5; + 674 : 5; + 675 : 1; + 676 : 1; + 677 : 1; + 678 : 1; + 679 : 1; + 680 : 1; + 681 : 1; + 682 : 1; + 683 : 5; + 684 : 5; + 685 : 5; + 686 : 5; + 687 : 5; + 688 : 5; + 689 : 5; + 690 : 5; + 691 : 5; + 692 : 5; + 693 : 5; + 694 : 5; + 695 : 5; + 696 : 5; + 697 : 5; + 698 : 5; + 699 : 5; + 700 : 5; + 701 : 5; + 702 : 0; + 703 : 0; + 704 : 5; + 705 : 5; + 706 : 5; + 707 : 5; + 708 : 5; + 709 : 5; + 710 : 5; + 711 : 5; + 712 : 5; + 713 : 5; + 714 : 5; + 715 : 5; + 716 : 5; + 717 : 5; + 718 : 5; + 719 : 5; + 720 : 1; + 721 : 1; + 722 : 1; + 723 : 1; + 724 : 1; + 725 : 1; + 726 : 1; + 727 : 1; + 728 : 1; + 729 : 1; + 730 : 1; + 731 : 1; + 732 : 5; + 733 : 5; + 734 : 5; + 735 : 5; + 736 : 5; + 737 : 5; + 738 : 5; + 739 : 1; + 740 : 1; + 741 : 1; + 742 : 1; + 743 : 1; + 744 : 1; + 745 : 1; + 746 : 1; + 747 : 5; + 748 : 5; + 749 : 5; + 750 : 5; + 751 : 5; + 752 : 5; + 753 : 5; + 754 : 5; + 755 : 5; + 756 : 5; + 757 : 5; + 758 : 5; + 759 : 5; + 760 : 5; + 761 : 5; + 762 : 5; + 763 : 5; + 764 : 5; + 765 : 5; + 766 : 0; + 767 : 0; + 768 : 5; + 769 : 5; + 770 : 5; + 771 : 5; + 772 : 5; + 773 : 5; + 774 : 5; + 775 : 5; + 776 : 5; + 777 : 5; + 778 : 5; + 779 : 5; + 780 : 5; + 781 : 5; + 782 : 5; + 783 : 5; + 784 : 1; + 785 : 1; + 786 : 1; + 787 : 1; + 788 : 1; + 789 : 1; + 790 : 1; + 791 : 1; + 792 : 1; + 793 : 1; + 794 : 1; + 795 : 1; + 796 : 5; + 797 : 5; + 798 : 5; + 799 : 5; + 800 : 5; + 801 : 5; + 802 : 5; + 803 : 5; + 804 : 5; + 805 : 5; + 806 : 5; + 807 : 5; + 808 : 5; + 809 : 5; + 810 : 5; + 811 : 5; + 812 : 5; + 813 : 5; + 814 : 5; + 815 : 5; + 816 : 5; + 817 : 5; + 818 : 5; + 819 : 5; + 820 : 5; + 821 : 5; + 822 : 5; + 823 : 5; + 824 : 5; + 825 : 5; + 826 : 5; + 827 : 5; + 828 : 5; + 829 : 5; + 830 : 0; + 831 : 0; + 832 : 5; + 833 : 5; + 834 : 5; + 835 : 5; + 836 : 5; + 837 : 5; + 838 : 5; + 839 : 5; + 840 : 5; + 841 : 5; + 842 : 5; + 843 : 5; + 844 : 5; + 845 : 5; + 846 : 5; + 847 : 5; + 848 : 1; + 849 : 1; + 850 : 1; + 851 : 1; + 852 : 1; + 853 : 1; + 854 : 1; + 855 : 1; + 856 : 1; + 857 : 1; + 858 : 1; + 859 : 1; + 860 : 5; + 861 : 5; + 862 : 5; + 863 : 5; + 864 : 5; + 865 : 5; + 866 : 5; + 867 : 5; + 868 : 5; + 869 : 5; + 870 : 5; + 871 : 5; + 872 : 5; + 873 : 5; + 874 : 5; + 875 : 5; + 876 : 5; + 877 : 5; + 878 : 5; + 879 : 5; + 880 : 5; + 881 : 5; + 882 : 5; + 883 : 5; + 884 : 5; + 885 : 5; + 886 : 5; + 887 : 5; + 888 : 5; + 889 : 5; + 890 : 5; + 891 : 5; + 892 : 5; + 893 : 5; + 894 : 0; + 895 : 0; + 896 : 5; + 897 : 5; + 898 : 5; + 899 : 5; + 900 : 5; + 901 : 5; + 902 : 5; + 903 : 5; + 904 : 5; + 905 : 5; + 906 : 5; + 907 : 5; + 908 : 5; + 909 : 5; + 910 : 5; + 911 : 5; + 912 : 1; + 913 : 1; + 914 : 1; + 915 : 1; + 916 : 1; + 917 : 1; + 918 : 1; + 919 : 1; + 920 : 1; + 921 : 1; + 922 : 1; + 923 : 1; + 924 : 5; + 925 : 5; + 926 : 5; + 927 : 5; + 928 : 5; + 929 : 5; + 930 : 5; + 931 : 5; + 932 : 5; + 933 : 5; + 934 : 5; + 935 : 5; + 936 : 5; + 937 : 5; + 938 : 5; + 939 : 5; + 940 : 5; + 941 : 5; + 942 : 5; + 943 : 5; + 944 : 5; + 945 : 5; + 946 : 5; + 947 : 5; + 948 : 5; + 949 : 5; + 950 : 5; + 951 : 5; + 952 : 5; + 953 : 5; + 954 : 5; + 955 : 5; + 956 : 5; + 957 : 5; + 958 : 0; + 959 : 0; + 960 : 5; + 961 : 5; + 962 : 5; + 963 : 5; + 964 : 5; + 965 : 5; + 966 : 5; + 967 : 5; + 968 : 5; + 969 : 5; + 970 : 5; + 971 : 5; + 972 : 5; + 973 : 5; + 974 : 5; + 975 : 5; + 976 : 1; + 977 : 1; + 978 : 1; + 979 : 1; + 980 : 1; + 981 : 1; + 982 : 1; + 983 : 1; + 984 : 1; + 985 : 1; + 986 : 1; + 987 : 1; + 988 : 5; + 989 : 5; + 990 : 5; + 991 : 5; + 992 : 5; + 993 : 5; + 994 : 5; + 995 : 5; + 996 : 5; + 997 : 5; + 998 : 5; + 999 : 5; + 1000 : 5; + 1001 : 5; + 1002 : 5; + 1003 : 5; + 1004 : 5; + 1005 : 5; + 1006 : 5; + 1007 : 5; + 1008 : 5; + 1009 : 5; + 1010 : 5; + 1011 : 5; + 1012 : 5; + 1013 : 5; + 1014 : 5; + 1015 : 5; + 1016 : 5; + 1017 : 5; + 1018 : 5; + 1019 : 5; + 1020 : 5; + 1021 : 5; + 1022 : 0; + 1023 : 0; + 1024 : 5; + 1025 : 5; + 1026 : 5; + 1027 : 5; + 1028 : 5; + 1029 : 5; + 1030 : 5; + 1031 : 5; + 1032 : 5; + 1033 : 5; + 1034 : 5; + 1035 : 5; + 1036 : 5; + 1037 : 5; + 1038 : 5; + 1039 : 5; + 1040 : 1; + 1041 : 1; + 1042 : 1; + 1043 : 1; + 1044 : 1; + 1045 : 1; + 1046 : 1; + 1047 : 1; + 1048 : 1; + 1049 : 1; + 1050 : 1; + 1051 : 1; + 1052 : 1; + 1053 : 1; + 1054 : 1; + 1055 : 1; + 1056 : 1; + 1057 : 1; + 1058 : 1; + 1059 : 5; + 1060 : 5; + 1061 : 5; + 1062 : 5; + 1063 : 5; + 1064 : 5; + 1065 : 5; + 1066 : 5; + 1067 : 5; + 1068 : 5; + 1069 : 5; + 1070 : 5; + 1071 : 5; + 1072 : 5; + 1073 : 5; + 1074 : 5; + 1075 : 5; + 1076 : 5; + 1077 : 5; + 1078 : 5; + 1079 : 5; + 1080 : 5; + 1081 : 5; + 1082 : 5; + 1083 : 5; + 1084 : 5; + 1085 : 5; + 1086 : 0; + 1087 : 0; + 1088 : 5; + 1089 : 5; + 1090 : 5; + 1091 : 5; + 1092 : 5; + 1093 : 5; + 1094 : 5; + 1095 : 5; + 1096 : 5; + 1097 : 5; + 1098 : 5; + 1099 : 5; + 1100 : 5; + 1101 : 5; + 1102 : 5; + 1103 : 5; + 1104 : 1; + 1105 : 1; + 1106 : 1; + 1107 : 1; + 1108 : 1; + 1109 : 1; + 1110 : 1; + 1111 : 1; + 1112 : 1; + 1113 : 1; + 1114 : 1; + 1115 : 1; + 1116 : 1; + 1117 : 1; + 1118 : 1; + 1119 : 1; + 1120 : 1; + 1121 : 1; + 1122 : 1; + 1123 : 5; + 1124 : 5; + 1125 : 5; + 1126 : 5; + 1127 : 5; + 1128 : 5; + 1129 : 5; + 1130 : 5; + 1131 : 5; + 1132 : 5; + 1133 : 5; + 1134 : 5; + 1135 : 5; + 1136 : 5; + 1137 : 5; + 1138 : 5; + 1139 : 5; + 1140 : 5; + 1141 : 5; + 1142 : 5; + 1143 : 5; + 1144 : 5; + 1145 : 5; + 1146 : 5; + 1147 : 5; + 1148 : 5; + 1149 : 5; + 1150 : 0; + 1151 : 0; + 1152 : 5; + 1153 : 5; + 1154 : 5; + 1155 : 5; + 1156 : 5; + 1157 : 5; + 1158 : 5; + 1159 : 5; + 1160 : 5; + 1161 : 5; + 1162 : 5; + 1163 : 5; + 1164 : 5; + 1165 : 5; + 1166 : 5; + 1167 : 5; + 1168 : 1; + 1169 : 1; + 1170 : 1; + 1171 : 1; + 1172 : 1; + 1173 : 1; + 1174 : 1; + 1175 : 1; + 1176 : 1; + 1177 : 1; + 1178 : 1; + 1179 : 1; + 1180 : 1; + 1181 : 1; + 1182 : 1; + 1183 : 1; + 1184 : 1; + 1185 : 1; + 1186 : 1; + 1187 : 5; + 1188 : 5; + 1189 : 5; + 1190 : 5; + 1191 : 5; + 1192 : 5; + 1193 : 5; + 1194 : 5; + 1195 : 5; + 1196 : 5; + 1197 : 5; + 1198 : 5; + 1199 : 5; + 1200 : 5; + 1201 : 5; + 1202 : 5; + 1203 : 5; + 1204 : 5; + 1205 : 5; + 1206 : 5; + 1207 : 5; + 1208 : 5; + 1209 : 5; + 1210 : 5; + 1211 : 5; + 1212 : 5; + 1213 : 5; + 1214 : 0; + 1215 : 0; + 1216 : 5; + 1217 : 5; + 1218 : 5; + 1219 : 5; + 1220 : 5; + 1221 : 5; + 1222 : 5; + 1223 : 5; + 1224 : 5; + 1225 : 5; + 1226 : 5; + 1227 : 5; + 1228 : 5; + 1229 : 5; + 1230 : 5; + 1231 : 5; + 1232 : 1; + 1233 : 1; + 1234 : 1; + 1235 : 1; + 1236 : 1; + 1237 : 1; + 1238 : 1; + 1239 : 1; + 1240 : 1; + 1241 : 1; + 1242 : 1; + 1243 : 1; + 1244 : 1; + 1245 : 1; + 1246 : 1; + 1247 : 1; + 1248 : 1; + 1249 : 1; + 1250 : 1; + 1251 : 5; + 1252 : 5; + 1253 : 5; + 1254 : 5; + 1255 : 5; + 1256 : 5; + 1257 : 5; + 1258 : 5; + 1259 : 5; + 1260 : 5; + 1261 : 5; + 1262 : 5; + 1263 : 5; + 1264 : 5; + 1265 : 5; + 1266 : 5; + 1267 : 5; + 1268 : 5; + 1269 : 5; + 1270 : 5; + 1271 : 5; + 1272 : 5; + 1273 : 5; + 1274 : 5; + 1275 : 5; + 1276 : 5; + 1277 : 5; + 1278 : 0; + 1279 : 0; + 1280 : 5; + 1281 : 5; + 1282 : 5; + 1283 : 5; + 1284 : 5; + 1285 : 5; + 1286 : 5; + 1287 : 5; + 1288 : 5; + 1289 : 5; + 1290 : 5; + 1291 : 5; + 1292 : 5; + 1293 : 5; + 1294 : 5; + 1295 : 5; + 1296 : 1; + 1297 : 1; + 1298 : 1; + 1299 : 1; + 1300 : 1; + 1301 : 1; + 1302 : 1; + 1303 : 1; + 1304 : 1; + 1305 : 1; + 1306 : 1; + 1307 : 1; + 1308 : 5; + 1309 : 5; + 1310 : 5; + 1311 : 5; + 1312 : 5; + 1313 : 5; + 1314 : 5; + 1315 : 5; + 1316 : 5; + 1317 : 5; + 1318 : 5; + 1319 : 5; + 1320 : 5; + 1321 : 5; + 1322 : 5; + 1323 : 5; + 1324 : 5; + 1325 : 5; + 1326 : 5; + 1327 : 5; + 1328 : 5; + 1329 : 5; + 1330 : 5; + 1331 : 5; + 1332 : 5; + 1333 : 5; + 1334 : 5; + 1335 : 5; + 1336 : 5; + 1337 : 5; + 1338 : 5; + 1339 : 5; + 1340 : 5; + 1341 : 5; + 1342 : 0; + 1343 : 0; + 1344 : 5; + 1345 : 5; + 1346 : 5; + 1347 : 5; + 1348 : 5; + 1349 : 5; + 1350 : 5; + 1351 : 5; + 1352 : 5; + 1353 : 5; + 1354 : 5; + 1355 : 5; + 1356 : 5; + 1357 : 5; + 1358 : 5; + 1359 : 5; + 1360 : 1; + 1361 : 1; + 1362 : 1; + 1363 : 1; + 1364 : 1; + 1365 : 1; + 1366 : 1; + 1367 : 1; + 1368 : 1; + 1369 : 1; + 1370 : 1; + 1371 : 1; + 1372 : 5; + 1373 : 5; + 1374 : 5; + 1375 : 5; + 1376 : 5; + 1377 : 5; + 1378 : 5; + 1379 : 5; + 1380 : 5; + 1381 : 5; + 1382 : 5; + 1383 : 5; + 1384 : 5; + 1385 : 5; + 1386 : 5; + 1387 : 5; + 1388 : 5; + 1389 : 5; + 1390 : 5; + 1391 : 5; + 1392 : 5; + 1393 : 5; + 1394 : 5; + 1395 : 5; + 1396 : 5; + 1397 : 5; + 1398 : 5; + 1399 : 5; + 1400 : 5; + 1401 : 5; + 1402 : 5; + 1403 : 5; + 1404 : 5; + 1405 : 5; + 1406 : 0; + 1407 : 0; + 1408 : 5; + 1409 : 5; + 1410 : 5; + 1411 : 5; + 1412 : 5; + 1413 : 5; + 1414 : 5; + 1415 : 5; + 1416 : 5; + 1417 : 5; + 1418 : 5; + 1419 : 5; + 1420 : 5; + 1421 : 5; + 1422 : 5; + 1423 : 5; + 1424 : 1; + 1425 : 1; + 1426 : 1; + 1427 : 1; + 1428 : 1; + 1429 : 1; + 1430 : 1; + 1431 : 1; + 1432 : 1; + 1433 : 1; + 1434 : 1; + 1435 : 1; + 1436 : 5; + 1437 : 5; + 1438 : 5; + 1439 : 5; + 1440 : 5; + 1441 : 5; + 1442 : 5; + 1443 : 5; + 1444 : 5; + 1445 : 5; + 1446 : 5; + 1447 : 5; + 1448 : 5; + 1449 : 5; + 1450 : 5; + 1451 : 5; + 1452 : 5; + 1453 : 5; + 1454 : 5; + 1455 : 5; + 1456 : 5; + 1457 : 5; + 1458 : 5; + 1459 : 5; + 1460 : 5; + 1461 : 5; + 1462 : 5; + 1463 : 5; + 1464 : 5; + 1465 : 5; + 1466 : 5; + 1467 : 5; + 1468 : 5; + 1469 : 5; + 1470 : 0; + 1471 : 0; + 1472 : 5; + 1473 : 5; + 1474 : 5; + 1475 : 5; + 1476 : 5; + 1477 : 5; + 1478 : 5; + 1479 : 5; + 1480 : 5; + 1481 : 5; + 1482 : 5; + 1483 : 5; + 1484 : 5; + 1485 : 5; + 1486 : 5; + 1487 : 5; + 1488 : 1; + 1489 : 1; + 1490 : 1; + 1491 : 1; + 1492 : 1; + 1493 : 1; + 1494 : 1; + 1495 : 1; + 1496 : 1; + 1497 : 1; + 1498 : 1; + 1499 : 1; + 1500 : 5; + 1501 : 5; + 1502 : 5; + 1503 : 5; + 1504 : 5; + 1505 : 5; + 1506 : 5; + 1507 : 5; + 1508 : 5; + 1509 : 5; + 1510 : 5; + 1511 : 5; + 1512 : 5; + 1513 : 5; + 1514 : 5; + 1515 : 5; + 1516 : 5; + 1517 : 5; + 1518 : 5; + 1519 : 5; + 1520 : 5; + 1521 : 5; + 1522 : 5; + 1523 : 5; + 1524 : 5; + 1525 : 5; + 1526 : 5; + 1527 : 5; + 1528 : 5; + 1529 : 5; + 1530 : 5; + 1531 : 5; + 1532 : 5; + 1533 : 5; + 1534 : 0; + 1535 : 0; + 1536 : 5; + 1537 : 5; + 1538 : 5; + 1539 : 5; + 1540 : 5; + 1541 : 5; + 1542 : 5; + 1543 : 5; + 1544 : 5; + 1545 : 5; + 1546 : 5; + 1547 : 5; + 1548 : 5; + 1549 : 5; + 1550 : 5; + 1551 : 5; + 1552 : 1; + 1553 : 1; + 1554 : 1; + 1555 : 1; + 1556 : 1; + 1557 : 1; + 1558 : 1; + 1559 : 1; + 1560 : 1; + 1561 : 1; + 1562 : 1; + 1563 : 1; + 1564 : 5; + 1565 : 5; + 1566 : 5; + 1567 : 5; + 1568 : 5; + 1569 : 5; + 1570 : 5; + 1571 : 5; + 1572 : 5; + 1573 : 5; + 1574 : 5; + 1575 : 5; + 1576 : 5; + 1577 : 5; + 1578 : 5; + 1579 : 5; + 1580 : 5; + 1581 : 5; + 1582 : 5; + 1583 : 5; + 1584 : 5; + 1585 : 5; + 1586 : 5; + 1587 : 5; + 1588 : 5; + 1589 : 5; + 1590 : 5; + 1591 : 5; + 1592 : 5; + 1593 : 5; + 1594 : 5; + 1595 : 5; + 1596 : 5; + 1597 : 5; + 1598 : 0; + 1599 : 0; + 1600 : 5; + 1601 : 5; + 1602 : 5; + 1603 : 5; + 1604 : 5; + 1605 : 5; + 1606 : 5; + 1607 : 5; + 1608 : 5; + 1609 : 5; + 1610 : 5; + 1611 : 5; + 1612 : 5; + 1613 : 5; + 1614 : 5; + 1615 : 5; + 1616 : 1; + 1617 : 1; + 1618 : 1; + 1619 : 1; + 1620 : 1; + 1621 : 1; + 1622 : 1; + 1623 : 1; + 1624 : 1; + 1625 : 1; + 1626 : 1; + 1627 : 1; + 1628 : 5; + 1629 : 5; + 1630 : 5; + 1631 : 5; + 1632 : 5; + 1633 : 5; + 1634 : 5; + 1635 : 5; + 1636 : 5; + 1637 : 5; + 1638 : 5; + 1639 : 5; + 1640 : 5; + 1641 : 5; + 1642 : 5; + 1643 : 5; + 1644 : 5; + 1645 : 5; + 1646 : 5; + 1647 : 5; + 1648 : 5; + 1649 : 5; + 1650 : 5; + 1651 : 5; + 1652 : 5; + 1653 : 5; + 1654 : 5; + 1655 : 5; + 1656 : 5; + 1657 : 5; + 1658 : 5; + 1659 : 5; + 1660 : 5; + 1661 : 5; + 1662 : 0; + 1663 : 0; + 1664 : 5; + 1665 : 5; + 1666 : 5; + 1667 : 5; + 1668 : 5; + 1669 : 5; + 1670 : 5; + 1671 : 5; + 1672 : 5; + 1673 : 5; + 1674 : 5; + 1675 : 5; + 1676 : 5; + 1677 : 5; + 1678 : 5; + 1679 : 5; + 1680 : 1; + 1681 : 1; + 1682 : 1; + 1683 : 1; + 1684 : 1; + 1685 : 1; + 1686 : 1; + 1687 : 1; + 1688 : 1; + 1689 : 1; + 1690 : 1; + 1691 : 1; + 1692 : 5; + 1693 : 5; + 1694 : 5; + 1695 : 5; + 1696 : 5; + 1697 : 5; + 1698 : 5; + 1699 : 5; + 1700 : 5; + 1701 : 5; + 1702 : 5; + 1703 : 5; + 1704 : 5; + 1705 : 5; + 1706 : 5; + 1707 : 5; + 1708 : 5; + 1709 : 5; + 1710 : 5; + 1711 : 5; + 1712 : 5; + 1713 : 5; + 1714 : 5; + 1715 : 5; + 1716 : 5; + 1717 : 5; + 1718 : 5; + 1719 : 5; + 1720 : 5; + 1721 : 5; + 1722 : 5; + 1723 : 5; + 1724 : 5; + 1725 : 5; + 1726 : 0; + 1727 : 0; + 1728 : 5; + 1729 : 5; + 1730 : 5; + 1731 : 5; + 1732 : 5; + 1733 : 5; + 1734 : 5; + 1735 : 5; + 1736 : 5; + 1737 : 5; + 1738 : 5; + 1739 : 5; + 1740 : 5; + 1741 : 5; + 1742 : 5; + 1743 : 5; + 1744 : 1; + 1745 : 1; + 1746 : 1; + 1747 : 1; + 1748 : 1; + 1749 : 1; + 1750 : 1; + 1751 : 1; + 1752 : 1; + 1753 : 1; + 1754 : 1; + 1755 : 1; + 1756 : 5; + 1757 : 5; + 1758 : 5; + 1759 : 5; + 1760 : 5; + 1761 : 5; + 1762 : 5; + 1763 : 5; + 1764 : 5; + 1765 : 5; + 1766 : 5; + 1767 : 5; + 1768 : 5; + 1769 : 5; + 1770 : 5; + 1771 : 5; + 1772 : 5; + 1773 : 5; + 1774 : 5; + 1775 : 5; + 1776 : 5; + 1777 : 5; + 1778 : 5; + 1779 : 5; + 1780 : 5; + 1781 : 5; + 1782 : 5; + 1783 : 5; + 1784 : 5; + 1785 : 5; + 1786 : 5; + 1787 : 5; + 1788 : 5; + 1789 : 5; + 1790 : 0; + 1791 : 0; + 1792 : 5; + 1793 : 5; + 1794 : 5; + 1795 : 5; + 1796 : 5; + 1797 : 5; + 1798 : 5; + 1799 : 5; + 1800 : 5; + 1801 : 5; + 1802 : 5; + 1803 : 5; + 1804 : 5; + 1805 : 5; + 1806 : 5; + 1807 : 5; + 1808 : 5; + 1809 : 5; + 1810 : 5; + 1811 : 5; + 1812 : 5; + 1813 : 5; + 1814 : 5; + 1815 : 5; + 1816 : 5; + 1817 : 5; + 1818 : 5; + 1819 : 5; + 1820 : 5; + 1821 : 5; + 1822 : 5; + 1823 : 5; + 1824 : 5; + 1825 : 5; + 1826 : 5; + 1827 : 5; + 1828 : 5; + 1829 : 5; + 1830 : 5; + 1831 : 5; + 1832 : 5; + 1833 : 5; + 1834 : 5; + 1835 : 5; + 1836 : 5; + 1837 : 5; + 1838 : 5; + 1839 : 5; + 1840 : 5; + 1841 : 5; + 1842 : 5; + 1843 : 5; + 1844 : 5; + 1845 : 5; + 1846 : 5; + 1847 : 5; + 1848 : 5; + 1849 : 5; + 1850 : 5; + 1851 : 5; + 1852 : 5; + 1853 : 5; + 1854 : 0; + 1855 : 0; + 1856 : 5; + 1857 : 5; + 1858 : 5; + 1859 : 5; + 1860 : 5; + 1861 : 5; + 1862 : 5; + 1863 : 5; + 1864 : 5; + 1865 : 5; + 1866 : 5; + 1867 : 5; + 1868 : 5; + 1869 : 5; + 1870 : 5; + 1871 : 5; + 1872 : 5; + 1873 : 5; + 1874 : 5; + 1875 : 5; + 1876 : 5; + 1877 : 5; + 1878 : 5; + 1879 : 5; + 1880 : 5; + 1881 : 5; + 1882 : 5; + 1883 : 5; + 1884 : 5; + 1885 : 5; + 1886 : 5; + 1887 : 5; + 1888 : 5; + 1889 : 5; + 1890 : 5; + 1891 : 5; + 1892 : 5; + 1893 : 5; + 1894 : 5; + 1895 : 5; + 1896 : 5; + 1897 : 5; + 1898 : 5; + 1899 : 5; + 1900 : 5; + 1901 : 5; + 1902 : 5; + 1903 : 5; + 1904 : 5; + 1905 : 5; + 1906 : 5; + 1907 : 5; + 1908 : 5; + 1909 : 5; + 1910 : 5; + 1911 : 5; + 1912 : 5; + 1913 : 5; + 1914 : 5; + 1915 : 5; + 1916 : 5; + 1917 : 5; + 1918 : 0; + 1919 : 0; + 1920 : 5; + 1921 : 5; + 1922 : 5; + 1923 : 5; + 1924 : 5; + 1925 : 5; + 1926 : 5; + 1927 : 5; + 1928 : 5; + 1929 : 5; + 1930 : 5; + 1931 : 5; + 1932 : 5; + 1933 : 5; + 1934 : 5; + 1935 : 5; + 1936 : 5; + 1937 : 5; + 1938 : 5; + 1939 : 5; + 1940 : 5; + 1941 : 5; + 1942 : 5; + 1943 : 5; + 1944 : 5; + 1945 : 5; + 1946 : 5; + 1947 : 5; + 1948 : 5; + 1949 : 5; + 1950 : 5; + 1951 : 5; + 1952 : 5; + 1953 : 5; + 1954 : 5; + 1955 : 5; + 1956 : 5; + 1957 : 5; + 1958 : 5; + 1959 : 5; + 1960 : 5; + 1961 : 5; + 1962 : 5; + 1963 : 5; + 1964 : 5; + 1965 : 5; + 1966 : 5; + 1967 : 5; + 1968 : 5; + 1969 : 5; + 1970 : 5; + 1971 : 5; + 1972 : 5; + 1973 : 5; + 1974 : 5; + 1975 : 5; + 1976 : 5; + 1977 : 5; + 1978 : 5; + 1979 : 5; + 1980 : 5; + 1981 : 5; + 1982 : 0; + 1983 : 0; + 1984 : 5; + 1985 : 5; + 1986 : 5; + 1987 : 5; + 1988 : 5; + 1989 : 5; + 1990 : 5; + 1991 : 5; + 1992 : 5; + 1993 : 5; + 1994 : 5; + 1995 : 5; + 1996 : 5; + 1997 : 5; + 1998 : 5; + 1999 : 5; + 2000 : 5; + 2001 : 5; + 2002 : 5; + 2003 : 5; + 2004 : 5; + 2005 : 5; + 2006 : 5; + 2007 : 5; + 2008 : 5; + 2009 : 5; + 2010 : 5; + 2011 : 5; + 2012 : 5; + 2013 : 5; + 2014 : 5; + 2015 : 5; + 2016 : 5; + 2017 : 5; + 2018 : 5; + 2019 : 5; + 2020 : 5; + 2021 : 5; + 2022 : 5; + 2023 : 5; + 2024 : 5; + 2025 : 5; + 2026 : 5; + 2027 : 5; + 2028 : 5; + 2029 : 5; + 2030 : 5; + 2031 : 5; + 2032 : 5; + 2033 : 5; + 2034 : 5; + 2035 : 5; + 2036 : 5; + 2037 : 5; + 2038 : 5; + 2039 : 5; + 2040 : 5; + 2041 : 5; + 2042 : 5; + 2043 : 5; + 2044 : 5; + 2045 : 5; + 2046 : 0; + 2047 : 0; + 2048 : 8; + 2049 : 8; + 2050 : 8; + 2051 : 8; + 2052 : 8; + 2053 : 8; + 2054 : 8; + 2055 : 8; + 2056 : 8; + 2057 : 8; + 2058 : 8; + 2059 : 8; + 2060 : 8; + 2061 : 8; + 2062 : 8; + 2063 : 8; + 2064 : 8; + 2065 : 8; + 2066 : 8; + 2067 : 8; + 2068 : 8; + 2069 : 8; + 2070 : 8; + 2071 : 8; + 2072 : 8; + 2073 : 8; + 2074 : 8; + 2075 : 8; + 2076 : 8; + 2077 : 8; + 2078 : 8; + 2079 : 8; + 2080 : 8; + 2081 : 8; + 2082 : 8; + 2083 : 8; + 2084 : 8; + 2085 : 8; + 2086 : 8; + 2087 : 8; + 2088 : 8; + 2089 : 8; + 2090 : 8; + 2091 : 8; + 2092 : 8; + 2093 : 8; + 2094 : 8; + 2095 : 8; + 2096 : 8; + 2097 : 8; + 2098 : 8; + 2099 : 8; + 2100 : 8; + 2101 : 8; + 2102 : 8; + 2103 : 8; + 2104 : 8; + 2105 : 8; + 2106 : 8; + 2107 : 8; + 2108 : 8; + 2109 : 8; + 2110 : 0; + 2111 : 0; + 2112 : 7; + 2113 : 7; + 2114 : 7; + 2115 : 7; + 2116 : 7; + 2117 : 7; + 2118 : 7; + 2119 : 7; + 2120 : 7; + 2121 : 7; + 2122 : 7; + 2123 : 7; + 2124 : 7; + 2125 : 7; + 2126 : 7; + 2127 : 7; + 2128 : 7; + 2129 : 7; + 2130 : 7; + 2131 : 7; + 2132 : 7; + 2133 : 7; + 2134 : 7; + 2135 : 7; + 2136 : 7; + 2137 : 7; + 2138 : 7; + 2139 : 7; + 2140 : 7; + 2141 : 7; + 2142 : 7; + 2143 : 7; + 2144 : 7; + 2145 : 7; + 2146 : 7; + 2147 : 7; + 2148 : 7; + 2149 : 7; + 2150 : 7; + 2151 : 7; + 2152 : 7; + 2153 : 7; + 2154 : 7; + 2155 : 7; + 2156 : 7; + 2157 : 7; + 2158 : 7; + 2159 : 7; + 2160 : 7; + 2161 : 7; + 2162 : 7; + 2163 : 7; + 2164 : 7; + 2165 : 7; + 2166 : 7; + 2167 : 7; + 2168 : 7; + 2169 : 7; + 2170 : 7; + 2171 : 7; + 2172 : 7; + 2173 : 7; + 2174 : 0; + 2175 : 0; + 2176 : 7; + 2177 : 7; + 2178 : 7; + 2179 : 7; + 2180 : 7; + 2181 : 7; + 2182 : 7; + 2183 : 7; + 2184 : 7; + 2185 : 7; + 2186 : 7; + 2187 : 7; + 2188 : 7; + 2189 : 7; + 2190 : 7; + 2191 : 7; + 2192 : 7; + 2193 : 7; + 2194 : 7; + 2195 : 7; + 2196 : 7; + 2197 : 7; + 2198 : 7; + 2199 : 7; + 2200 : 7; + 2201 : 7; + 2202 : 7; + 2203 : 7; + 2204 : 7; + 2205 : 7; + 2206 : 7; + 2207 : 7; + 2208 : 7; + 2209 : 7; + 2210 : 7; + 2211 : 7; + 2212 : 7; + 2213 : 7; + 2214 : 7; + 2215 : 7; + 2216 : 7; + 2217 : 7; + 2218 : 7; + 2219 : 7; + 2220 : 7; + 2221 : 7; + 2222 : 7; + 2223 : 7; + 2224 : 7; + 2225 : 7; + 2226 : 7; + 2227 : 7; + 2228 : 7; + 2229 : 7; + 2230 : 7; + 2231 : 7; + 2232 : 7; + 2233 : 7; + 2234 : 7; + 2235 : 7; + 2236 : 7; + 2237 : 7; + 2238 : 0; + 2239 : 0; + 2240 : 7; + 2241 : 7; + 2242 : 7; + 2243 : 7; + 2244 : 7; + 2245 : 7; + 2246 : 7; + 2247 : 7; + 2248 : 7; + 2249 : 7; + 2250 : 7; + 2251 : 7; + 2252 : 7; + 2253 : 7; + 2254 : 7; + 2255 : 7; + 2256 : 7; + 2257 : 7; + 2258 : 7; + 2259 : 7; + 2260 : 7; + 2261 : 7; + 2262 : 7; + 2263 : 7; + 2264 : 7; + 2265 : 7; + 2266 : 7; + 2267 : 7; + 2268 : 7; + 2269 : 7; + 2270 : 7; + 2271 : 7; + 2272 : 7; + 2273 : 7; + 2274 : 7; + 2275 : 7; + 2276 : 7; + 2277 : 7; + 2278 : 7; + 2279 : 7; + 2280 : 7; + 2281 : 7; + 2282 : 7; + 2283 : 7; + 2284 : 7; + 2285 : 7; + 2286 : 7; + 2287 : 7; + 2288 : 7; + 2289 : 7; + 2290 : 7; + 2291 : 7; + 2292 : 7; + 2293 : 7; + 2294 : 7; + 2295 : 7; + 2296 : 7; + 2297 : 7; + 2298 : 7; + 2299 : 7; + 2300 : 7; + 2301 : 7; + 2302 : 0; + 2303 : 0; + 2304 : 7; + 2305 : 7; + 2306 : 7; + 2307 : 7; + 2308 : 7; + 2309 : 7; + 2310 : 7; + 2311 : 7; + 2312 : 7; + 2313 : 7; + 2314 : 7; + 2315 : 7; + 2316 : 7; + 2317 : 7; + 2318 : 7; + 2319 : 7; + 2320 : 0; + 2321 : 0; + 2322 : 1; + 2323 : 1; + 2324 : 1; + 2325 : 1; + 2326 : 1; + 2327 : 1; + 2328 : 1; + 2329 : 1; + 2330 : 1; + 2331 : 1; + 2332 : 7; + 2333 : 7; + 2334 : 7; + 2335 : 7; + 2336 : 7; + 2337 : 7; + 2338 : 7; + 2339 : 1; + 2340 : 0; + 2341 : 1; + 2342 : 1; + 2343 : 1; + 2344 : 1; + 2345 : 1; + 2346 : 0; + 2347 : 7; + 2348 : 7; + 2349 : 7; + 2350 : 7; + 2351 : 7; + 2352 : 7; + 2353 : 7; + 2354 : 7; + 2355 : 7; + 2356 : 7; + 2357 : 7; + 2358 : 7; + 2359 : 7; + 2360 : 7; + 2361 : 7; + 2362 : 7; + 2363 : 7; + 2364 : 7; + 2365 : 7; + 2366 : 0; + 2367 : 0; + 2368 : 7; + 2369 : 7; + 2370 : 7; + 2371 : 7; + 2372 : 7; + 2373 : 7; + 2374 : 7; + 2375 : 7; + 2376 : 7; + 2377 : 7; + 2378 : 7; + 2379 : 7; + 2380 : 7; + 2381 : 7; + 2382 : 7; + 2383 : 7; + 2384 : 1; + 2385 : 1; + 2386 : 1; + 2387 : 1; + 2388 : 1; + 2389 : 1; + 2390 : 1; + 2391 : 1; + 2392 : 1; + 2393 : 1; + 2394 : 1; + 2395 : 1; + 2396 : 7; + 2397 : 7; + 2398 : 7; + 2399 : 7; + 2400 : 7; + 2401 : 7; + 2402 : 7; + 2403 : 1; + 2404 : 1; + 2405 : 1; + 2406 : 1; + 2407 : 1; + 2408 : 1; + 2409 : 1; + 2410 : 1; + 2411 : 7; + 2412 : 7; + 2413 : 7; + 2414 : 7; + 2415 : 7; + 2416 : 7; + 2417 : 7; + 2418 : 7; + 2419 : 7; + 2420 : 7; + 2421 : 7; + 2422 : 7; + 2423 : 7; + 2424 : 7; + 2425 : 7; + 2426 : 7; + 2427 : 7; + 2428 : 7; + 2429 : 7; + 2430 : 0; + 2431 : 0; + 2432 : 7; + 2433 : 7; + 2434 : 7; + 2435 : 7; + 2436 : 7; + 2437 : 7; + 2438 : 7; + 2439 : 7; + 2440 : 7; + 2441 : 7; + 2442 : 7; + 2443 : 7; + 2444 : 7; + 2445 : 7; + 2446 : 7; + 2447 : 7; + 2448 : 1; + 2449 : 1; + 2450 : 1; + 2451 : 1; + 2452 : 1; + 2453 : 1; + 2454 : 1; + 2455 : 1; + 2456 : 1; + 2457 : 1; + 2458 : 1; + 2459 : 1; + 2460 : 7; + 2461 : 7; + 2462 : 7; + 2463 : 7; + 2464 : 7; + 2465 : 7; + 2466 : 7; + 2467 : 1; + 2468 : 1; + 2469 : 1; + 2470 : 1; + 2471 : 1; + 2472 : 1; + 2473 : 1; + 2474 : 1; + 2475 : 7; + 2476 : 7; + 2477 : 7; + 2478 : 7; + 2479 : 7; + 2480 : 7; + 2481 : 7; + 2482 : 7; + 2483 : 7; + 2484 : 7; + 2485 : 7; + 2486 : 7; + 2487 : 7; + 2488 : 7; + 2489 : 7; + 2490 : 7; + 2491 : 7; + 2492 : 7; + 2493 : 7; + 2494 : 0; + 2495 : 0; + 2496 : 7; + 2497 : 7; + 2498 : 7; + 2499 : 7; + 2500 : 7; + 2501 : 7; + 2502 : 7; + 2503 : 7; + 2504 : 7; + 2505 : 7; + 2506 : 7; + 2507 : 7; + 2508 : 7; + 2509 : 7; + 2510 : 7; + 2511 : 7; + 2512 : 1; + 2513 : 1; + 2514 : 1; + 2515 : 1; + 2516 : 1; + 2517 : 1; + 2518 : 1; + 2519 : 1; + 2520 : 1; + 2521 : 1; + 2522 : 1; + 2523 : 1; + 2524 : 7; + 2525 : 7; + 2526 : 7; + 2527 : 7; + 2528 : 7; + 2529 : 7; + 2530 : 7; + 2531 : 1; + 2532 : 1; + 2533 : 1; + 2534 : 1; + 2535 : 1; + 2536 : 1; + 2537 : 1; + 2538 : 1; + 2539 : 7; + 2540 : 7; + 2541 : 7; + 2542 : 7; + 2543 : 7; + 2544 : 7; + 2545 : 7; + 2546 : 7; + 2547 : 7; + 2548 : 7; + 2549 : 7; + 2550 : 7; + 2551 : 7; + 2552 : 7; + 2553 : 7; + 2554 : 7; + 2555 : 7; + 2556 : 7; + 2557 : 7; + 2558 : 0; + 2559 : 0; + 2560 : 7; + 2561 : 7; + 2562 : 7; + 2563 : 7; + 2564 : 7; + 2565 : 7; + 2566 : 7; + 2567 : 7; + 2568 : 7; + 2569 : 7; + 2570 : 7; + 2571 : 7; + 2572 : 7; + 2573 : 7; + 2574 : 7; + 2575 : 7; + 2576 : 1; + 2577 : 1; + 2578 : 1; + 2579 : 1; + 2580 : 1; + 2581 : 1; + 2582 : 1; + 2583 : 1; + 2584 : 1; + 2585 : 1; + 2586 : 1; + 2587 : 1; + 2588 : 7; + 2589 : 7; + 2590 : 7; + 2591 : 7; + 2592 : 7; + 2593 : 7; + 2594 : 7; + 2595 : 1; + 2596 : 1; + 2597 : 1; + 2598 : 1; + 2599 : 1; + 2600 : 1; + 2601 : 1; + 2602 : 1; + 2603 : 7; + 2604 : 7; + 2605 : 7; + 2606 : 7; + 2607 : 7; + 2608 : 7; + 2609 : 7; + 2610 : 7; + 2611 : 7; + 2612 : 7; + 2613 : 7; + 2614 : 7; + 2615 : 7; + 2616 : 7; + 2617 : 7; + 2618 : 7; + 2619 : 7; + 2620 : 7; + 2621 : 7; + 2622 : 0; + 2623 : 0; + 2624 : 7; + 2625 : 7; + 2626 : 7; + 2627 : 7; + 2628 : 7; + 2629 : 7; + 2630 : 7; + 2631 : 7; + 2632 : 7; + 2633 : 7; + 2634 : 7; + 2635 : 7; + 2636 : 7; + 2637 : 7; + 2638 : 7; + 2639 : 7; + 2640 : 1; + 2641 : 1; + 2642 : 1; + 2643 : 1; + 2644 : 1; + 2645 : 1; + 2646 : 1; + 2647 : 1; + 2648 : 1; + 2649 : 1; + 2650 : 1; + 2651 : 1; + 2652 : 7; + 2653 : 7; + 2654 : 7; + 2655 : 7; + 2656 : 7; + 2657 : 7; + 2658 : 7; + 2659 : 1; + 2660 : 1; + 2661 : 1; + 2662 : 1; + 2663 : 1; + 2664 : 1; + 2665 : 1; + 2666 : 1; + 2667 : 7; + 2668 : 7; + 2669 : 7; + 2670 : 7; + 2671 : 7; + 2672 : 7; + 2673 : 7; + 2674 : 7; + 2675 : 7; + 2676 : 7; + 2677 : 7; + 2678 : 7; + 2679 : 7; + 2680 : 7; + 2681 : 7; + 2682 : 7; + 2683 : 7; + 2684 : 7; + 2685 : 7; + 2686 : 0; + 2687 : 0; + 2688 : 7; + 2689 : 7; + 2690 : 7; + 2691 : 7; + 2692 : 7; + 2693 : 7; + 2694 : 7; + 2695 : 7; + 2696 : 7; + 2697 : 7; + 2698 : 7; + 2699 : 7; + 2700 : 7; + 2701 : 7; + 2702 : 7; + 2703 : 7; + 2704 : 1; + 2705 : 1; + 2706 : 1; + 2707 : 1; + 2708 : 1; + 2709 : 1; + 2710 : 1; + 2711 : 1; + 2712 : 1; + 2713 : 1; + 2714 : 1; + 2715 : 1; + 2716 : 7; + 2717 : 7; + 2718 : 7; + 2719 : 7; + 2720 : 7; + 2721 : 7; + 2722 : 7; + 2723 : 1; + 2724 : 1; + 2725 : 1; + 2726 : 1; + 2727 : 1; + 2728 : 1; + 2729 : 1; + 2730 : 1; + 2731 : 7; + 2732 : 7; + 2733 : 7; + 2734 : 7; + 2735 : 7; + 2736 : 7; + 2737 : 7; + 2738 : 7; + 2739 : 7; + 2740 : 7; + 2741 : 7; + 2742 : 7; + 2743 : 7; + 2744 : 7; + 2745 : 7; + 2746 : 7; + 2747 : 7; + 2748 : 7; + 2749 : 7; + 2750 : 0; + 2751 : 0; + 2752 : 7; + 2753 : 7; + 2754 : 7; + 2755 : 7; + 2756 : 7; + 2757 : 7; + 2758 : 7; + 2759 : 7; + 2760 : 7; + 2761 : 7; + 2762 : 7; + 2763 : 7; + 2764 : 7; + 2765 : 7; + 2766 : 7; + 2767 : 7; + 2768 : 1; + 2769 : 1; + 2770 : 1; + 2771 : 1; + 2772 : 1; + 2773 : 1; + 2774 : 1; + 2775 : 1; + 2776 : 1; + 2777 : 1; + 2778 : 1; + 2779 : 1; + 2780 : 7; + 2781 : 7; + 2782 : 7; + 2783 : 7; + 2784 : 7; + 2785 : 7; + 2786 : 7; + 2787 : 1; + 2788 : 1; + 2789 : 1; + 2790 : 1; + 2791 : 1; + 2792 : 1; + 2793 : 1; + 2794 : 1; + 2795 : 7; + 2796 : 7; + 2797 : 7; + 2798 : 7; + 2799 : 7; + 2800 : 7; + 2801 : 7; + 2802 : 7; + 2803 : 7; + 2804 : 7; + 2805 : 7; + 2806 : 7; + 2807 : 7; + 2808 : 7; + 2809 : 7; + 2810 : 7; + 2811 : 7; + 2812 : 7; + 2813 : 7; + 2814 : 0; + 2815 : 0; + 2816 : 7; + 2817 : 7; + 2818 : 7; + 2819 : 7; + 2820 : 7; + 2821 : 7; + 2822 : 7; + 2823 : 7; + 2824 : 7; + 2825 : 7; + 2826 : 7; + 2827 : 7; + 2828 : 7; + 2829 : 7; + 2830 : 7; + 2831 : 7; + 2832 : 1; + 2833 : 1; + 2834 : 1; + 2835 : 1; + 2836 : 1; + 2837 : 1; + 2838 : 1; + 2839 : 1; + 2840 : 1; + 2841 : 1; + 2842 : 1; + 2843 : 1; + 2844 : 7; + 2845 : 7; + 2846 : 7; + 2847 : 7; + 2848 : 7; + 2849 : 7; + 2850 : 7; + 2851 : 1; + 2852 : 1; + 2853 : 1; + 2854 : 1; + 2855 : 1; + 2856 : 1; + 2857 : 1; + 2858 : 1; + 2859 : 7; + 2860 : 7; + 2861 : 7; + 2862 : 7; + 2863 : 7; + 2864 : 7; + 2865 : 7; + 2866 : 7; + 2867 : 7; + 2868 : 7; + 2869 : 7; + 2870 : 7; + 2871 : 7; + 2872 : 7; + 2873 : 7; + 2874 : 7; + 2875 : 7; + 2876 : 7; + 2877 : 7; + 2878 : 0; + 2879 : 0; + 2880 : 7; + 2881 : 7; + 2882 : 7; + 2883 : 7; + 2884 : 7; + 2885 : 7; + 2886 : 7; + 2887 : 7; + 2888 : 7; + 2889 : 7; + 2890 : 7; + 2891 : 7; + 2892 : 7; + 2893 : 7; + 2894 : 7; + 2895 : 7; + 2896 : 1; + 2897 : 1; + 2898 : 1; + 2899 : 1; + 2900 : 1; + 2901 : 1; + 2902 : 1; + 2903 : 1; + 2904 : 1; + 2905 : 1; + 2906 : 1; + 2907 : 1; + 2908 : 7; + 2909 : 7; + 2910 : 7; + 2911 : 7; + 2912 : 7; + 2913 : 7; + 2914 : 7; + 2915 : 1; + 2916 : 1; + 2917 : 1; + 2918 : 1; + 2919 : 1; + 2920 : 1; + 2921 : 1; + 2922 : 1; + 2923 : 7; + 2924 : 7; + 2925 : 7; + 2926 : 7; + 2927 : 7; + 2928 : 7; + 2929 : 7; + 2930 : 7; + 2931 : 7; + 2932 : 7; + 2933 : 7; + 2934 : 7; + 2935 : 7; + 2936 : 7; + 2937 : 7; + 2938 : 7; + 2939 : 7; + 2940 : 7; + 2941 : 7; + 2942 : 0; + 2943 : 0; + 2944 : 7; + 2945 : 7; + 2946 : 7; + 2947 : 7; + 2948 : 7; + 2949 : 7; + 2950 : 7; + 2951 : 7; + 2952 : 7; + 2953 : 7; + 2954 : 7; + 2955 : 7; + 2956 : 7; + 2957 : 7; + 2958 : 7; + 2959 : 7; + 2960 : 1; + 2961 : 1; + 2962 : 1; + 2963 : 1; + 2964 : 1; + 2965 : 1; + 2966 : 1; + 2967 : 1; + 2968 : 1; + 2969 : 1; + 2970 : 1; + 2971 : 1; + 2972 : 7; + 2973 : 7; + 2974 : 7; + 2975 : 7; + 2976 : 7; + 2977 : 7; + 2978 : 7; + 2979 : 1; + 2980 : 1; + 2981 : 1; + 2982 : 1; + 2983 : 1; + 2984 : 1; + 2985 : 1; + 2986 : 1; + 2987 : 7; + 2988 : 7; + 2989 : 7; + 2990 : 7; + 2991 : 7; + 2992 : 7; + 2993 : 7; + 2994 : 7; + 2995 : 7; + 2996 : 7; + 2997 : 7; + 2998 : 7; + 2999 : 7; + 3000 : 7; + 3001 : 7; + 3002 : 7; + 3003 : 7; + 3004 : 7; + 3005 : 7; + 3006 : 0; + 3007 : 0; + 3008 : 7; + 3009 : 7; + 3010 : 7; + 3011 : 7; + 3012 : 7; + 3013 : 7; + 3014 : 7; + 3015 : 7; + 3016 : 7; + 3017 : 7; + 3018 : 7; + 3019 : 7; + 3020 : 7; + 3021 : 7; + 3022 : 7; + 3023 : 7; + 3024 : 1; + 3025 : 1; + 3026 : 1; + 3027 : 1; + 3028 : 1; + 3029 : 1; + 3030 : 1; + 3031 : 1; + 3032 : 1; + 3033 : 1; + 3034 : 1; + 3035 : 1; + 3036 : 7; + 3037 : 7; + 3038 : 7; + 3039 : 7; + 3040 : 7; + 3041 : 7; + 3042 : 7; + 3043 : 1; + 3044 : 1; + 3045 : 1; + 3046 : 1; + 3047 : 1; + 3048 : 1; + 3049 : 1; + 3050 : 1; + 3051 : 7; + 3052 : 7; + 3053 : 7; + 3054 : 7; + 3055 : 7; + 3056 : 7; + 3057 : 7; + 3058 : 7; + 3059 : 7; + 3060 : 7; + 3061 : 7; + 3062 : 7; + 3063 : 7; + 3064 : 7; + 3065 : 7; + 3066 : 7; + 3067 : 7; + 3068 : 7; + 3069 : 7; + 3070 : 0; + 3071 : 0; + 3072 : 7; + 3073 : 7; + 3074 : 7; + 3075 : 7; + 3076 : 7; + 3077 : 7; + 3078 : 7; + 3079 : 7; + 3080 : 7; + 3081 : 7; + 3082 : 7; + 3083 : 7; + 3084 : 7; + 3085 : 7; + 3086 : 7; + 3087 : 7; + 3088 : 1; + 3089 : 1; + 3090 : 1; + 3091 : 1; + 3092 : 1; + 3093 : 1; + 3094 : 1; + 3095 : 1; + 3096 : 1; + 3097 : 1; + 3098 : 1; + 3099 : 1; + 3100 : 7; + 3101 : 7; + 3102 : 7; + 3103 : 7; + 3104 : 7; + 3105 : 7; + 3106 : 7; + 3107 : 1; + 3108 : 1; + 3109 : 1; + 3110 : 1; + 3111 : 1; + 3112 : 1; + 3113 : 1; + 3114 : 1; + 3115 : 7; + 3116 : 7; + 3117 : 7; + 3118 : 7; + 3119 : 7; + 3120 : 7; + 3121 : 7; + 3122 : 7; + 3123 : 7; + 3124 : 7; + 3125 : 7; + 3126 : 7; + 3127 : 7; + 3128 : 7; + 3129 : 7; + 3130 : 7; + 3131 : 7; + 3132 : 7; + 3133 : 7; + 3134 : 0; + 3135 : 0; + 3136 : 7; + 3137 : 7; + 3138 : 7; + 3139 : 7; + 3140 : 7; + 3141 : 7; + 3142 : 7; + 3143 : 7; + 3144 : 7; + 3145 : 7; + 3146 : 7; + 3147 : 7; + 3148 : 7; + 3149 : 7; + 3150 : 7; + 3151 : 7; + 3152 : 1; + 3153 : 1; + 3154 : 1; + 3155 : 1; + 3156 : 1; + 3157 : 1; + 3158 : 1; + 3159 : 1; + 3160 : 1; + 3161 : 1; + 3162 : 1; + 3163 : 1; + 3164 : 7; + 3165 : 7; + 3166 : 7; + 3167 : 7; + 3168 : 7; + 3169 : 7; + 3170 : 7; + 3171 : 1; + 3172 : 1; + 3173 : 1; + 3174 : 1; + 3175 : 1; + 3176 : 1; + 3177 : 1; + 3178 : 1; + 3179 : 7; + 3180 : 7; + 3181 : 7; + 3182 : 7; + 3183 : 7; + 3184 : 7; + 3185 : 7; + 3186 : 7; + 3187 : 7; + 3188 : 7; + 3189 : 7; + 3190 : 7; + 3191 : 7; + 3192 : 7; + 3193 : 7; + 3194 : 7; + 3195 : 7; + 3196 : 7; + 3197 : 7; + 3198 : 0; + 3199 : 0; + 3200 : 7; + 3201 : 7; + 3202 : 7; + 3203 : 7; + 3204 : 7; + 3205 : 7; + 3206 : 7; + 3207 : 7; + 3208 : 7; + 3209 : 7; + 3210 : 7; + 3211 : 7; + 3212 : 7; + 3213 : 7; + 3214 : 7; + 3215 : 7; + 3216 : 1; + 3217 : 1; + 3218 : 1; + 3219 : 1; + 3220 : 1; + 3221 : 1; + 3222 : 1; + 3223 : 1; + 3224 : 1; + 3225 : 1; + 3226 : 1; + 3227 : 1; + 3228 : 7; + 3229 : 7; + 3230 : 7; + 3231 : 7; + 3232 : 7; + 3233 : 7; + 3234 : 7; + 3235 : 1; + 3236 : 1; + 3237 : 1; + 3238 : 1; + 3239 : 1; + 3240 : 1; + 3241 : 1; + 3242 : 1; + 3243 : 7; + 3244 : 7; + 3245 : 7; + 3246 : 7; + 3247 : 7; + 3248 : 7; + 3249 : 7; + 3250 : 7; + 3251 : 7; + 3252 : 7; + 3253 : 7; + 3254 : 7; + 3255 : 7; + 3256 : 7; + 3257 : 7; + 3258 : 7; + 3259 : 7; + 3260 : 7; + 3261 : 7; + 3262 : 0; + 3263 : 0; + 3264 : 7; + 3265 : 7; + 3266 : 7; + 3267 : 7; + 3268 : 7; + 3269 : 7; + 3270 : 7; + 3271 : 7; + 3272 : 7; + 3273 : 7; + 3274 : 7; + 3275 : 7; + 3276 : 7; + 3277 : 7; + 3278 : 7; + 3279 : 7; + 3280 : 1; + 3281 : 1; + 3282 : 1; + 3283 : 1; + 3284 : 1; + 3285 : 1; + 3286 : 1; + 3287 : 1; + 3288 : 1; + 3289 : 1; + 3290 : 1; + 3291 : 1; + 3292 : 7; + 3293 : 7; + 3294 : 7; + 3295 : 7; + 3296 : 7; + 3297 : 7; + 3298 : 7; + 3299 : 1; + 3300 : 1; + 3301 : 1; + 3302 : 1; + 3303 : 1; + 3304 : 1; + 3305 : 1; + 3306 : 1; + 3307 : 7; + 3308 : 7; + 3309 : 7; + 3310 : 7; + 3311 : 7; + 3312 : 7; + 3313 : 7; + 3314 : 7; + 3315 : 7; + 3316 : 7; + 3317 : 7; + 3318 : 7; + 3319 : 7; + 3320 : 7; + 3321 : 7; + 3322 : 7; + 3323 : 7; + 3324 : 7; + 3325 : 7; + 3326 : 0; + 3327 : 0; + 3328 : 7; + 3329 : 7; + 3330 : 7; + 3331 : 7; + 3332 : 7; + 3333 : 7; + 3334 : 7; + 3335 : 7; + 3336 : 7; + 3337 : 7; + 3338 : 7; + 3339 : 7; + 3340 : 7; + 3341 : 7; + 3342 : 7; + 3343 : 7; + 3344 : 1; + 3345 : 1; + 3346 : 1; + 3347 : 1; + 3348 : 1; + 3349 : 1; + 3350 : 1; + 3351 : 1; + 3352 : 1; + 3353 : 1; + 3354 : 1; + 3355 : 1; + 3356 : 1; + 3357 : 1; + 3358 : 1; + 3359 : 1; + 3360 : 1; + 3361 : 1; + 3362 : 1; + 3363 : 1; + 3364 : 1; + 3365 : 1; + 3366 : 1; + 3367 : 1; + 3368 : 1; + 3369 : 1; + 3370 : 1; + 3371 : 7; + 3372 : 7; + 3373 : 7; + 3374 : 7; + 3375 : 7; + 3376 : 7; + 3377 : 7; + 3378 : 7; + 3379 : 7; + 3380 : 7; + 3381 : 7; + 3382 : 7; + 3383 : 7; + 3384 : 7; + 3385 : 7; + 3386 : 7; + 3387 : 7; + 3388 : 7; + 3389 : 7; + 3390 : 0; + 3391 : 0; + 3392 : 7; + 3393 : 7; + 3394 : 7; + 3395 : 7; + 3396 : 7; + 3397 : 7; + 3398 : 7; + 3399 : 7; + 3400 : 7; + 3401 : 7; + 3402 : 7; + 3403 : 7; + 3404 : 7; + 3405 : 7; + 3406 : 7; + 3407 : 7; + 3408 : 1; + 3409 : 1; + 3410 : 1; + 3411 : 1; + 3412 : 1; + 3413 : 1; + 3414 : 1; + 3415 : 1; + 3416 : 1; + 3417 : 1; + 3418 : 1; + 3419 : 1; + 3420 : 1; + 3421 : 1; + 3422 : 1; + 3423 : 1; + 3424 : 1; + 3425 : 1; + 3426 : 1; + 3427 : 1; + 3428 : 1; + 3429 : 1; + 3430 : 1; + 3431 : 1; + 3432 : 1; + 3433 : 1; + 3434 : 1; + 3435 : 7; + 3436 : 7; + 3437 : 7; + 3438 : 7; + 3439 : 7; + 3440 : 7; + 3441 : 7; + 3442 : 7; + 3443 : 7; + 3444 : 7; + 3445 : 7; + 3446 : 7; + 3447 : 7; + 3448 : 7; + 3449 : 7; + 3450 : 7; + 3451 : 7; + 3452 : 7; + 3453 : 7; + 3454 : 0; + 3455 : 0; + 3456 : 7; + 3457 : 7; + 3458 : 7; + 3459 : 7; + 3460 : 7; + 3461 : 7; + 3462 : 7; + 3463 : 7; + 3464 : 7; + 3465 : 7; + 3466 : 7; + 3467 : 7; + 3468 : 7; + 3469 : 7; + 3470 : 7; + 3471 : 7; + 3472 : 1; + 3473 : 1; + 3474 : 1; + 3475 : 1; + 3476 : 1; + 3477 : 1; + 3478 : 1; + 3479 : 1; + 3480 : 1; + 3481 : 1; + 3482 : 1; + 3483 : 1; + 3484 : 1; + 3485 : 1; + 3486 : 1; + 3487 : 1; + 3488 : 1; + 3489 : 1; + 3490 : 1; + 3491 : 1; + 3492 : 1; + 3493 : 1; + 3494 : 1; + 3495 : 1; + 3496 : 1; + 3497 : 1; + 3498 : 1; + 3499 : 7; + 3500 : 7; + 3501 : 7; + 3502 : 7; + 3503 : 7; + 3504 : 7; + 3505 : 7; + 3506 : 7; + 3507 : 7; + 3508 : 7; + 3509 : 7; + 3510 : 7; + 3511 : 7; + 3512 : 7; + 3513 : 7; + 3514 : 7; + 3515 : 7; + 3516 : 7; + 3517 : 7; + 3518 : 0; + 3519 : 0; + 3520 : 7; + 3521 : 7; + 3522 : 7; + 3523 : 7; + 3524 : 7; + 3525 : 7; + 3526 : 7; + 3527 : 7; + 3528 : 7; + 3529 : 7; + 3530 : 7; + 3531 : 7; + 3532 : 7; + 3533 : 7; + 3534 : 7; + 3535 : 7; + 3536 : 1; + 3537 : 1; + 3538 : 1; + 3539 : 1; + 3540 : 1; + 3541 : 1; + 3542 : 1; + 3543 : 1; + 3544 : 1; + 3545 : 1; + 3546 : 1; + 3547 : 1; + 3548 : 1; + 3549 : 1; + 3550 : 1; + 3551 : 1; + 3552 : 1; + 3553 : 1; + 3554 : 1; + 3555 : 1; + 3556 : 1; + 3557 : 1; + 3558 : 1; + 3559 : 1; + 3560 : 1; + 3561 : 1; + 3562 : 1; + 3563 : 7; + 3564 : 7; + 3565 : 7; + 3566 : 7; + 3567 : 7; + 3568 : 7; + 3569 : 7; + 3570 : 7; + 3571 : 7; + 3572 : 7; + 3573 : 7; + 3574 : 7; + 3575 : 7; + 3576 : 7; + 3577 : 7; + 3578 : 7; + 3579 : 7; + 3580 : 7; + 3581 : 7; + 3582 : 0; + 3583 : 0; + 3584 : 7; + 3585 : 7; + 3586 : 7; + 3587 : 7; + 3588 : 7; + 3589 : 7; + 3590 : 7; + 3591 : 7; + 3592 : 7; + 3593 : 7; + 3594 : 7; + 3595 : 7; + 3596 : 7; + 3597 : 7; + 3598 : 7; + 3599 : 7; + 3600 : 7; + 3601 : 7; + 3602 : 7; + 3603 : 7; + 3604 : 7; + 3605 : 7; + 3606 : 7; + 3607 : 7; + 3608 : 7; + 3609 : 7; + 3610 : 7; + 3611 : 7; + 3612 : 7; + 3613 : 7; + 3614 : 7; + 3615 : 7; + 3616 : 7; + 3617 : 7; + 3618 : 7; + 3619 : 7; + 3620 : 7; + 3621 : 7; + 3622 : 7; + 3623 : 7; + 3624 : 7; + 3625 : 7; + 3626 : 7; + 3627 : 7; + 3628 : 7; + 3629 : 7; + 3630 : 7; + 3631 : 7; + 3632 : 7; + 3633 : 7; + 3634 : 7; + 3635 : 7; + 3636 : 7; + 3637 : 7; + 3638 : 7; + 3639 : 7; + 3640 : 7; + 3641 : 7; + 3642 : 7; + 3643 : 7; + 3644 : 7; + 3645 : 7; + 3646 : 0; + 3647 : 0; + 3648 : 7; + 3649 : 7; + 3650 : 7; + 3651 : 7; + 3652 : 7; + 3653 : 7; + 3654 : 7; + 3655 : 7; + 3656 : 7; + 3657 : 7; + 3658 : 7; + 3659 : 7; + 3660 : 7; + 3661 : 7; + 3662 : 7; + 3663 : 7; + 3664 : 7; + 3665 : 7; + 3666 : 7; + 3667 : 7; + 3668 : 7; + 3669 : 7; + 3670 : 7; + 3671 : 7; + 3672 : 7; + 3673 : 7; + 3674 : 7; + 3675 : 7; + 3676 : 7; + 3677 : 7; + 3678 : 7; + 3679 : 7; + 3680 : 7; + 3681 : 7; + 3682 : 7; + 3683 : 7; + 3684 : 7; + 3685 : 7; + 3686 : 7; + 3687 : 7; + 3688 : 7; + 3689 : 7; + 3690 : 7; + 3691 : 7; + 3692 : 7; + 3693 : 7; + 3694 : 7; + 3695 : 7; + 3696 : 7; + 3697 : 7; + 3698 : 7; + 3699 : 7; + 3700 : 7; + 3701 : 7; + 3702 : 7; + 3703 : 7; + 3704 : 7; + 3705 : 7; + 3706 : 7; + 3707 : 7; + 3708 : 7; + 3709 : 7; + 3710 : 0; + 3711 : 0; + 3712 : 7; + 3713 : 7; + 3714 : 7; + 3715 : 7; + 3716 : 7; + 3717 : 7; + 3718 : 7; + 3719 : 7; + 3720 : 7; + 3721 : 7; + 3722 : 7; + 3723 : 7; + 3724 : 7; + 3725 : 7; + 3726 : 7; + 3727 : 7; + 3728 : 7; + 3729 : 7; + 3730 : 7; + 3731 : 7; + 3732 : 7; + 3733 : 7; + 3734 : 7; + 3735 : 7; + 3736 : 7; + 3737 : 7; + 3738 : 7; + 3739 : 7; + 3740 : 7; + 3741 : 7; + 3742 : 7; + 3743 : 7; + 3744 : 7; + 3745 : 7; + 3746 : 7; + 3747 : 7; + 3748 : 7; + 3749 : 7; + 3750 : 7; + 3751 : 7; + 3752 : 7; + 3753 : 7; + 3754 : 7; + 3755 : 7; + 3756 : 7; + 3757 : 7; + 3758 : 7; + 3759 : 7; + 3760 : 7; + 3761 : 7; + 3762 : 7; + 3763 : 7; + 3764 : 7; + 3765 : 7; + 3766 : 7; + 3767 : 7; + 3768 : 7; + 3769 : 7; + 3770 : 7; + 3771 : 7; + 3772 : 7; + 3773 : 7; + 3774 : 0; + 3775 : 0; + 3776 : 8; + 3777 : 8; + 3778 : 8; + 3779 : 8; + 3780 : 8; + 3781 : 8; + 3782 : 8; + 3783 : 8; + 3784 : 8; + 3785 : 8; + 3786 : 8; + 3787 : 8; + 3788 : 8; + 3789 : 8; + 3790 : 8; + 3791 : 8; + 3792 : 8; + 3793 : 8; + 3794 : 8; + 3795 : 8; + 3796 : 8; + 3797 : 8; + 3798 : 8; + 3799 : 8; + 3800 : 8; + 3801 : 8; + 3802 : 8; + 3803 : 8; + 3804 : 8; + 3805 : 8; + 3806 : 8; + 3807 : 8; + 3808 : 8; + 3809 : 8; + 3810 : 8; + 3811 : 8; + 3812 : 8; + 3813 : 8; + 3814 : 8; + 3815 : 8; + 3816 : 8; + 3817 : 8; + 3818 : 8; + 3819 : 8; + 3820 : 8; + 3821 : 8; + 3822 : 8; + 3823 : 8; + 3824 : 8; + 3825 : 8; + 3826 : 8; + 3827 : 8; + 3828 : 8; + 3829 : 8; + 3830 : 8; + 3831 : 8; + 3832 : 8; + 3833 : 8; + 3834 : 8; + 3835 : 8; + 3836 : 8; + 3837 : 8; + 3838 : 0; + 3839 : 0; + 3840 : 5; + 3841 : 5; + 3842 : 5; + 3843 : 5; + 3844 : 5; + 3845 : 5; + 3846 : 5; + 3847 : 5; + 3848 : 5; + 3849 : 5; + 3850 : 5; + 3851 : 5; + 3852 : 5; + 3853 : 5; + 3854 : 5; + 3855 : 5; + 3856 : 5; + 3857 : 5; + 3858 : 5; + 3859 : 5; + 3860 : 5; + 3861 : 5; + 3862 : 5; + 3863 : 5; + 3864 : 5; + 3865 : 5; + 3866 : 5; + 3867 : 5; + 3868 : 5; + 3869 : 5; + 3870 : 5; + 3871 : 5; + 3872 : 5; + 3873 : 5; + 3874 : 5; + 3875 : 5; + 3876 : 5; + 3877 : 5; + 3878 : 5; + 3879 : 5; + 3880 : 5; + 3881 : 5; + 3882 : 5; + 3883 : 5; + 3884 : 5; + 3885 : 5; + 3886 : 5; + 3887 : 5; + 3888 : 5; + 3889 : 5; + 3890 : 5; + 3891 : 5; + 3892 : 5; + 3893 : 5; + 3894 : 5; + 3895 : 5; + 3896 : 5; + 3897 : 5; + 3898 : 5; + 3899 : 5; + 3900 : 5; + 3901 : 5; + 3902 : 0; + 3903 : 0; + 3904 : 5; + 3905 : 5; + 3906 : 5; + 3907 : 5; + 3908 : 5; + 3909 : 5; + 3910 : 5; + 3911 : 5; + 3912 : 5; + 3913 : 5; + 3914 : 5; + 3915 : 5; + 3916 : 5; + 3917 : 5; + 3918 : 5; + 3919 : 5; + 3920 : 5; + 3921 : 5; + 3922 : 5; + 3923 : 5; + 3924 : 5; + 3925 : 5; + 3926 : 5; + 3927 : 5; + 3928 : 5; + 3929 : 5; + 3930 : 5; + 3931 : 5; + 3932 : 5; + 3933 : 5; + 3934 : 5; + 3935 : 5; + 3936 : 5; + 3937 : 5; + 3938 : 5; + 3939 : 5; + 3940 : 5; + 3941 : 5; + 3942 : 5; + 3943 : 5; + 3944 : 5; + 3945 : 5; + 3946 : 5; + 3947 : 5; + 3948 : 5; + 3949 : 5; + 3950 : 5; + 3951 : 5; + 3952 : 5; + 3953 : 5; + 3954 : 5; + 3955 : 5; + 3956 : 5; + 3957 : 5; + 3958 : 5; + 3959 : 5; + 3960 : 5; + 3961 : 5; + 3962 : 5; + 3963 : 5; + 3964 : 5; + 3965 : 5; + 3966 : 0; + 3967 : 0; + 3968 : 5; + 3969 : 5; + 3970 : 5; + 3971 : 5; + 3972 : 5; + 3973 : 5; + 3974 : 5; + 3975 : 5; + 3976 : 5; + 3977 : 5; + 3978 : 5; + 3979 : 5; + 3980 : 5; + 3981 : 5; + 3982 : 5; + 3983 : 5; + 3984 : 5; + 3985 : 5; + 3986 : 5; + 3987 : 5; + 3988 : 5; + 3989 : 5; + 3990 : 5; + 3991 : 5; + 3992 : 5; + 3993 : 5; + 3994 : 5; + 3995 : 5; + 3996 : 5; + 3997 : 5; + 3998 : 5; + 3999 : 5; + 4000 : 5; + 4001 : 5; + 4002 : 5; + 4003 : 5; + 4004 : 5; + 4005 : 5; + 4006 : 5; + 4007 : 5; + 4008 : 5; + 4009 : 5; + 4010 : 5; + 4011 : 5; + 4012 : 5; + 4013 : 5; + 4014 : 5; + 4015 : 5; + 4016 : 5; + 4017 : 5; + 4018 : 5; + 4019 : 5; + 4020 : 5; + 4021 : 5; + 4022 : 5; + 4023 : 5; + 4024 : 5; + 4025 : 5; + 4026 : 5; + 4027 : 5; + 4028 : 5; + 4029 : 5; + 4030 : 0; + 4031 : 0; + 4032 : 5; + 4033 : 5; + 4034 : 5; + 4035 : 5; + 4036 : 5; + 4037 : 5; + 4038 : 5; + 4039 : 5; + 4040 : 5; + 4041 : 5; + 4042 : 5; + 4043 : 5; + 4044 : 5; + 4045 : 5; + 4046 : 5; + 4047 : 5; + 4048 : 5; + 4049 : 5; + 4050 : 5; + 4051 : 5; + 4052 : 5; + 4053 : 5; + 4054 : 5; + 4055 : 5; + 4056 : 5; + 4057 : 5; + 4058 : 5; + 4059 : 5; + 4060 : 5; + 4061 : 5; + 4062 : 5; + 4063 : 5; + 4064 : 5; + 4065 : 5; + 4066 : 5; + 4067 : 5; + 4068 : 5; + 4069 : 5; + 4070 : 5; + 4071 : 5; + 4072 : 5; + 4073 : 5; + 4074 : 5; + 4075 : 5; + 4076 : 5; + 4077 : 5; + 4078 : 5; + 4079 : 5; + 4080 : 5; + 4081 : 5; + 4082 : 5; + 4083 : 5; + 4084 : 5; + 4085 : 5; + 4086 : 5; + 4087 : 5; + 4088 : 5; + 4089 : 5; + 4090 : 5; + 4091 : 5; + 4092 : 5; + 4093 : 5; + 4094 : 0; + 4095 : 0; + 4096 : 5; + 4097 : 5; + 4098 : 5; + 4099 : 5; + 4100 : 5; + 4101 : 5; + 4102 : 5; + 4103 : 5; + 4104 : 5; + 4105 : 5; + 4106 : 5; + 4107 : 5; + 4108 : 5; + 4109 : 5; + 4110 : 5; + 4111 : 5; + 4112 : 1; + 4113 : 1; + 4114 : 1; + 4115 : 1; + 4116 : 1; + 4117 : 1; + 4118 : 1; + 4119 : 1; + 4120 : 1; + 4121 : 1; + 4122 : 1; + 4123 : 1; + 4124 : 1; + 4125 : 1; + 4126 : 1; + 4127 : 1; + 4128 : 1; + 4129 : 1; + 4130 : 1; + 4131 : 1; + 4132 : 1; + 4133 : 1; + 4134 : 1; + 4135 : 1; + 4136 : 1; + 4137 : 1; + 4138 : 1; + 4139 : 5; + 4140 : 5; + 4141 : 5; + 4142 : 5; + 4143 : 5; + 4144 : 5; + 4145 : 5; + 4146 : 5; + 4147 : 5; + 4148 : 5; + 4149 : 5; + 4150 : 5; + 4151 : 5; + 4152 : 5; + 4153 : 5; + 4154 : 5; + 4155 : 5; + 4156 : 5; + 4157 : 5; + 4158 : 0; + 4159 : 0; + 4160 : 5; + 4161 : 5; + 4162 : 5; + 4163 : 5; + 4164 : 5; + 4165 : 5; + 4166 : 5; + 4167 : 5; + 4168 : 5; + 4169 : 5; + 4170 : 5; + 4171 : 5; + 4172 : 5; + 4173 : 5; + 4174 : 5; + 4175 : 5; + 4176 : 1; + 4177 : 1; + 4178 : 1; + 4179 : 1; + 4180 : 1; + 4181 : 1; + 4182 : 1; + 4183 : 1; + 4184 : 1; + 4185 : 1; + 4186 : 1; + 4187 : 1; + 4188 : 1; + 4189 : 1; + 4190 : 1; + 4191 : 1; + 4192 : 1; + 4193 : 1; + 4194 : 1; + 4195 : 1; + 4196 : 1; + 4197 : 1; + 4198 : 1; + 4199 : 1; + 4200 : 1; + 4201 : 1; + 4202 : 1; + 4203 : 5; + 4204 : 5; + 4205 : 5; + 4206 : 5; + 4207 : 5; + 4208 : 5; + 4209 : 5; + 4210 : 5; + 4211 : 5; + 4212 : 5; + 4213 : 5; + 4214 : 5; + 4215 : 5; + 4216 : 5; + 4217 : 5; + 4218 : 5; + 4219 : 5; + 4220 : 5; + 4221 : 5; + 4222 : 0; + 4223 : 0; + 4224 : 5; + 4225 : 5; + 4226 : 5; + 4227 : 5; + 4228 : 5; + 4229 : 5; + 4230 : 5; + 4231 : 5; + 4232 : 5; + 4233 : 5; + 4234 : 5; + 4235 : 5; + 4236 : 5; + 4237 : 5; + 4238 : 5; + 4239 : 5; + 4240 : 1; + 4241 : 1; + 4242 : 1; + 4243 : 1; + 4244 : 1; + 4245 : 1; + 4246 : 1; + 4247 : 1; + 4248 : 1; + 4249 : 1; + 4250 : 1; + 4251 : 1; + 4252 : 1; + 4253 : 1; + 4254 : 1; + 4255 : 1; + 4256 : 1; + 4257 : 1; + 4258 : 1; + 4259 : 1; + 4260 : 1; + 4261 : 1; + 4262 : 1; + 4263 : 1; + 4264 : 1; + 4265 : 1; + 4266 : 1; + 4267 : 5; + 4268 : 5; + 4269 : 5; + 4270 : 5; + 4271 : 5; + 4272 : 5; + 4273 : 5; + 4274 : 5; + 4275 : 5; + 4276 : 5; + 4277 : 5; + 4278 : 5; + 4279 : 5; + 4280 : 5; + 4281 : 5; + 4282 : 5; + 4283 : 5; + 4284 : 5; + 4285 : 5; + 4286 : 0; + 4287 : 0; + 4288 : 5; + 4289 : 5; + 4290 : 5; + 4291 : 5; + 4292 : 5; + 4293 : 5; + 4294 : 5; + 4295 : 5; + 4296 : 5; + 4297 : 5; + 4298 : 5; + 4299 : 5; + 4300 : 5; + 4301 : 5; + 4302 : 5; + 4303 : 5; + 4304 : 1; + 4305 : 1; + 4306 : 1; + 4307 : 1; + 4308 : 1; + 4309 : 1; + 4310 : 1; + 4311 : 1; + 4312 : 1; + 4313 : 1; + 4314 : 1; + 4315 : 1; + 4316 : 1; + 4317 : 1; + 4318 : 1; + 4319 : 1; + 4320 : 1; + 4321 : 1; + 4322 : 1; + 4323 : 1; + 4324 : 1; + 4325 : 1; + 4326 : 1; + 4327 : 1; + 4328 : 1; + 4329 : 1; + 4330 : 1; + 4331 : 5; + 4332 : 5; + 4333 : 5; + 4334 : 5; + 4335 : 5; + 4336 : 5; + 4337 : 5; + 4338 : 5; + 4339 : 5; + 4340 : 5; + 4341 : 5; + 4342 : 5; + 4343 : 5; + 4344 : 5; + 4345 : 5; + 4346 : 5; + 4347 : 5; + 4348 : 5; + 4349 : 5; + 4350 : 0; + 4351 : 0; + 4352 : 5; + 4353 : 5; + 4354 : 5; + 4355 : 5; + 4356 : 5; + 4357 : 5; + 4358 : 5; + 4359 : 5; + 4360 : 5; + 4361 : 5; + 4362 : 5; + 4363 : 5; + 4364 : 5; + 4365 : 5; + 4366 : 5; + 4367 : 5; + 4368 : 1; + 4369 : 1; + 4370 : 1; + 4371 : 1; + 4372 : 1; + 4373 : 1; + 4374 : 1; + 4375 : 1; + 4376 : 1; + 4377 : 1; + 4378 : 1; + 4379 : 1; + 4380 : 5; + 4381 : 5; + 4382 : 5; + 4383 : 5; + 4384 : 5; + 4385 : 5; + 4386 : 5; + 4387 : 5; + 4388 : 5; + 4389 : 5; + 4390 : 5; + 4391 : 5; + 4392 : 5; + 4393 : 5; + 4394 : 5; + 4395 : 5; + 4396 : 5; + 4397 : 5; + 4398 : 5; + 4399 : 5; + 4400 : 5; + 4401 : 5; + 4402 : 5; + 4403 : 5; + 4404 : 5; + 4405 : 5; + 4406 : 5; + 4407 : 5; + 4408 : 5; + 4409 : 5; + 4410 : 5; + 4411 : 5; + 4412 : 5; + 4413 : 5; + 4414 : 0; + 4415 : 0; + 4416 : 5; + 4417 : 5; + 4418 : 5; + 4419 : 5; + 4420 : 5; + 4421 : 5; + 4422 : 5; + 4423 : 5; + 4424 : 5; + 4425 : 5; + 4426 : 5; + 4427 : 5; + 4428 : 5; + 4429 : 5; + 4430 : 5; + 4431 : 5; + 4432 : 1; + 4433 : 1; + 4434 : 1; + 4435 : 1; + 4436 : 1; + 4437 : 1; + 4438 : 1; + 4439 : 1; + 4440 : 1; + 4441 : 1; + 4442 : 1; + 4443 : 1; + 4444 : 5; + 4445 : 5; + 4446 : 5; + 4447 : 5; + 4448 : 5; + 4449 : 5; + 4450 : 5; + 4451 : 5; + 4452 : 5; + 4453 : 5; + 4454 : 5; + 4455 : 5; + 4456 : 5; + 4457 : 5; + 4458 : 5; + 4459 : 5; + 4460 : 5; + 4461 : 5; + 4462 : 5; + 4463 : 5; + 4464 : 5; + 4465 : 5; + 4466 : 5; + 4467 : 5; + 4468 : 5; + 4469 : 5; + 4470 : 5; + 4471 : 5; + 4472 : 5; + 4473 : 5; + 4474 : 5; + 4475 : 5; + 4476 : 5; + 4477 : 5; + 4478 : 0; + 4479 : 0; + 4480 : 5; + 4481 : 5; + 4482 : 5; + 4483 : 5; + 4484 : 5; + 4485 : 5; + 4486 : 5; + 4487 : 5; + 4488 : 5; + 4489 : 5; + 4490 : 5; + 4491 : 5; + 4492 : 5; + 4493 : 5; + 4494 : 5; + 4495 : 5; + 4496 : 1; + 4497 : 1; + 4498 : 1; + 4499 : 1; + 4500 : 1; + 4501 : 1; + 4502 : 1; + 4503 : 1; + 4504 : 1; + 4505 : 1; + 4506 : 1; + 4507 : 1; + 4508 : 5; + 4509 : 5; + 4510 : 5; + 4511 : 5; + 4512 : 5; + 4513 : 5; + 4514 : 5; + 4515 : 5; + 4516 : 5; + 4517 : 5; + 4518 : 5; + 4519 : 5; + 4520 : 5; + 4521 : 5; + 4522 : 5; + 4523 : 5; + 4524 : 5; + 4525 : 5; + 4526 : 5; + 4527 : 5; + 4528 : 5; + 4529 : 5; + 4530 : 5; + 4531 : 5; + 4532 : 5; + 4533 : 5; + 4534 : 5; + 4535 : 5; + 4536 : 5; + 4537 : 5; + 4538 : 5; + 4539 : 5; + 4540 : 5; + 4541 : 5; + 4542 : 0; + 4543 : 0; + 4544 : 5; + 4545 : 5; + 4546 : 5; + 4547 : 5; + 4548 : 5; + 4549 : 5; + 4550 : 5; + 4551 : 5; + 4552 : 5; + 4553 : 5; + 4554 : 5; + 4555 : 5; + 4556 : 5; + 4557 : 5; + 4558 : 5; + 4559 : 5; + 4560 : 1; + 4561 : 1; + 4562 : 1; + 4563 : 1; + 4564 : 1; + 4565 : 1; + 4566 : 1; + 4567 : 1; + 4568 : 1; + 4569 : 1; + 4570 : 1; + 4571 : 1; + 4572 : 5; + 4573 : 5; + 4574 : 5; + 4575 : 5; + 4576 : 5; + 4577 : 5; + 4578 : 5; + 4579 : 5; + 4580 : 5; + 4581 : 5; + 4582 : 5; + 4583 : 5; + 4584 : 5; + 4585 : 5; + 4586 : 5; + 4587 : 5; + 4588 : 5; + 4589 : 5; + 4590 : 5; + 4591 : 5; + 4592 : 5; + 4593 : 5; + 4594 : 5; + 4595 : 5; + 4596 : 5; + 4597 : 5; + 4598 : 5; + 4599 : 5; + 4600 : 5; + 4601 : 5; + 4602 : 5; + 4603 : 5; + 4604 : 5; + 4605 : 5; + 4606 : 0; + 4607 : 0; + 4608 : 5; + 4609 : 5; + 4610 : 5; + 4611 : 5; + 4612 : 5; + 4613 : 5; + 4614 : 5; + 4615 : 5; + 4616 : 5; + 4617 : 5; + 4618 : 5; + 4619 : 5; + 4620 : 5; + 4621 : 5; + 4622 : 5; + 4623 : 5; + 4624 : 1; + 4625 : 1; + 4626 : 1; + 4627 : 1; + 4628 : 1; + 4629 : 1; + 4630 : 1; + 4631 : 1; + 4632 : 1; + 4633 : 1; + 4634 : 1; + 4635 : 1; + 4636 : 1; + 4637 : 1; + 4638 : 1; + 4639 : 1; + 4640 : 1; + 4641 : 1; + 4642 : 1; + 4643 : 1; + 4644 : 5; + 4645 : 5; + 4646 : 5; + 4647 : 5; + 4648 : 5; + 4649 : 5; + 4650 : 5; + 4651 : 5; + 4652 : 5; + 4653 : 5; + 4654 : 5; + 4655 : 5; + 4656 : 5; + 4657 : 5; + 4658 : 5; + 4659 : 5; + 4660 : 5; + 4661 : 5; + 4662 : 5; + 4663 : 5; + 4664 : 5; + 4665 : 5; + 4666 : 5; + 4667 : 5; + 4668 : 5; + 4669 : 5; + 4670 : 0; + 4671 : 0; + 4672 : 5; + 4673 : 5; + 4674 : 5; + 4675 : 5; + 4676 : 5; + 4677 : 5; + 4678 : 5; + 4679 : 5; + 4680 : 5; + 4681 : 5; + 4682 : 5; + 4683 : 5; + 4684 : 5; + 4685 : 5; + 4686 : 5; + 4687 : 5; + 4688 : 1; + 4689 : 1; + 4690 : 1; + 4691 : 1; + 4692 : 1; + 4693 : 1; + 4694 : 1; + 4695 : 1; + 4696 : 1; + 4697 : 1; + 4698 : 1; + 4699 : 1; + 4700 : 1; + 4701 : 1; + 4702 : 1; + 4703 : 1; + 4704 : 1; + 4705 : 1; + 4706 : 1; + 4707 : 1; + 4708 : 5; + 4709 : 5; + 4710 : 5; + 4711 : 5; + 4712 : 5; + 4713 : 5; + 4714 : 5; + 4715 : 5; + 4716 : 5; + 4717 : 5; + 4718 : 5; + 4719 : 5; + 4720 : 5; + 4721 : 5; + 4722 : 5; + 4723 : 5; + 4724 : 5; + 4725 : 5; + 4726 : 5; + 4727 : 5; + 4728 : 5; + 4729 : 5; + 4730 : 5; + 4731 : 5; + 4732 : 5; + 4733 : 5; + 4734 : 0; + 4735 : 0; + 4736 : 5; + 4737 : 5; + 4738 : 5; + 4739 : 5; + 4740 : 5; + 4741 : 5; + 4742 : 5; + 4743 : 5; + 4744 : 5; + 4745 : 5; + 4746 : 5; + 4747 : 5; + 4748 : 5; + 4749 : 5; + 4750 : 5; + 4751 : 5; + 4752 : 1; + 4753 : 1; + 4754 : 1; + 4755 : 1; + 4756 : 1; + 4757 : 1; + 4758 : 1; + 4759 : 1; + 4760 : 1; + 4761 : 1; + 4762 : 1; + 4763 : 1; + 4764 : 1; + 4765 : 1; + 4766 : 1; + 4767 : 1; + 4768 : 1; + 4769 : 1; + 4770 : 1; + 4771 : 1; + 4772 : 5; + 4773 : 5; + 4774 : 5; + 4775 : 5; + 4776 : 5; + 4777 : 5; + 4778 : 5; + 4779 : 5; + 4780 : 5; + 4781 : 5; + 4782 : 5; + 4783 : 5; + 4784 : 5; + 4785 : 5; + 4786 : 5; + 4787 : 5; + 4788 : 5; + 4789 : 5; + 4790 : 5; + 4791 : 5; + 4792 : 5; + 4793 : 5; + 4794 : 5; + 4795 : 5; + 4796 : 5; + 4797 : 5; + 4798 : 0; + 4799 : 0; + 4800 : 5; + 4801 : 5; + 4802 : 5; + 4803 : 5; + 4804 : 5; + 4805 : 5; + 4806 : 5; + 4807 : 5; + 4808 : 5; + 4809 : 5; + 4810 : 5; + 4811 : 5; + 4812 : 5; + 4813 : 5; + 4814 : 5; + 4815 : 5; + 4816 : 1; + 4817 : 1; + 4818 : 1; + 4819 : 1; + 4820 : 1; + 4821 : 1; + 4822 : 1; + 4823 : 1; + 4824 : 1; + 4825 : 1; + 4826 : 1; + 4827 : 1; + 4828 : 1; + 4829 : 1; + 4830 : 1; + 4831 : 1; + 4832 : 1; + 4833 : 1; + 4834 : 1; + 4835 : 1; + 4836 : 5; + 4837 : 5; + 4838 : 5; + 4839 : 5; + 4840 : 5; + 4841 : 5; + 4842 : 5; + 4843 : 5; + 4844 : 5; + 4845 : 5; + 4846 : 5; + 4847 : 5; + 4848 : 5; + 4849 : 5; + 4850 : 5; + 4851 : 5; + 4852 : 5; + 4853 : 5; + 4854 : 5; + 4855 : 5; + 4856 : 5; + 4857 : 5; + 4858 : 5; + 4859 : 5; + 4860 : 5; + 4861 : 5; + 4862 : 0; + 4863 : 0; + 4864 : 5; + 4865 : 5; + 4866 : 5; + 4867 : 5; + 4868 : 5; + 4869 : 5; + 4870 : 5; + 4871 : 5; + 4872 : 5; + 4873 : 5; + 4874 : 5; + 4875 : 5; + 4876 : 5; + 4877 : 5; + 4878 : 5; + 4879 : 5; + 4880 : 1; + 4881 : 1; + 4882 : 1; + 4883 : 1; + 4884 : 1; + 4885 : 1; + 4886 : 1; + 4887 : 1; + 4888 : 1; + 4889 : 1; + 4890 : 1; + 4891 : 1; + 4892 : 5; + 4893 : 5; + 4894 : 5; + 4895 : 5; + 4896 : 5; + 4897 : 5; + 4898 : 5; + 4899 : 5; + 4900 : 5; + 4901 : 5; + 4902 : 5; + 4903 : 5; + 4904 : 5; + 4905 : 5; + 4906 : 5; + 4907 : 5; + 4908 : 5; + 4909 : 5; + 4910 : 5; + 4911 : 5; + 4912 : 5; + 4913 : 5; + 4914 : 5; + 4915 : 5; + 4916 : 5; + 4917 : 5; + 4918 : 5; + 4919 : 5; + 4920 : 5; + 4921 : 5; + 4922 : 5; + 4923 : 5; + 4924 : 5; + 4925 : 5; + 4926 : 0; + 4927 : 0; + 4928 : 5; + 4929 : 5; + 4930 : 5; + 4931 : 5; + 4932 : 5; + 4933 : 5; + 4934 : 5; + 4935 : 5; + 4936 : 5; + 4937 : 5; + 4938 : 5; + 4939 : 5; + 4940 : 5; + 4941 : 5; + 4942 : 5; + 4943 : 5; + 4944 : 1; + 4945 : 1; + 4946 : 1; + 4947 : 1; + 4948 : 1; + 4949 : 1; + 4950 : 1; + 4951 : 1; + 4952 : 1; + 4953 : 1; + 4954 : 1; + 4955 : 1; + 4956 : 5; + 4957 : 5; + 4958 : 5; + 4959 : 5; + 4960 : 5; + 4961 : 5; + 4962 : 5; + 4963 : 5; + 4964 : 5; + 4965 : 5; + 4966 : 5; + 4967 : 5; + 4968 : 5; + 4969 : 5; + 4970 : 5; + 4971 : 5; + 4972 : 5; + 4973 : 5; + 4974 : 5; + 4975 : 5; + 4976 : 5; + 4977 : 5; + 4978 : 5; + 4979 : 5; + 4980 : 5; + 4981 : 5; + 4982 : 5; + 4983 : 5; + 4984 : 5; + 4985 : 5; + 4986 : 5; + 4987 : 5; + 4988 : 5; + 4989 : 5; + 4990 : 0; + 4991 : 0; + 4992 : 5; + 4993 : 5; + 4994 : 5; + 4995 : 5; + 4996 : 5; + 4997 : 5; + 4998 : 5; + 4999 : 5; + 5000 : 5; + 5001 : 5; + 5002 : 5; + 5003 : 5; + 5004 : 5; + 5005 : 5; + 5006 : 5; + 5007 : 5; + 5008 : 1; + 5009 : 1; + 5010 : 1; + 5011 : 1; + 5012 : 1; + 5013 : 1; + 5014 : 1; + 5015 : 1; + 5016 : 1; + 5017 : 1; + 5018 : 1; + 5019 : 1; + 5020 : 5; + 5021 : 5; + 5022 : 5; + 5023 : 5; + 5024 : 5; + 5025 : 5; + 5026 : 5; + 5027 : 5; + 5028 : 5; + 5029 : 5; + 5030 : 5; + 5031 : 5; + 5032 : 5; + 5033 : 5; + 5034 : 5; + 5035 : 5; + 5036 : 5; + 5037 : 5; + 5038 : 5; + 5039 : 5; + 5040 : 5; + 5041 : 5; + 5042 : 5; + 5043 : 5; + 5044 : 5; + 5045 : 5; + 5046 : 5; + 5047 : 5; + 5048 : 5; + 5049 : 5; + 5050 : 5; + 5051 : 5; + 5052 : 5; + 5053 : 5; + 5054 : 0; + 5055 : 0; + 5056 : 5; + 5057 : 5; + 5058 : 5; + 5059 : 5; + 5060 : 5; + 5061 : 5; + 5062 : 5; + 5063 : 5; + 5064 : 5; + 5065 : 5; + 5066 : 5; + 5067 : 5; + 5068 : 5; + 5069 : 5; + 5070 : 5; + 5071 : 5; + 5072 : 1; + 5073 : 1; + 5074 : 1; + 5075 : 1; + 5076 : 1; + 5077 : 1; + 5078 : 1; + 5079 : 1; + 5080 : 1; + 5081 : 1; + 5082 : 1; + 5083 : 1; + 5084 : 5; + 5085 : 5; + 5086 : 5; + 5087 : 5; + 5088 : 5; + 5089 : 5; + 5090 : 5; + 5091 : 5; + 5092 : 5; + 5093 : 5; + 5094 : 5; + 5095 : 5; + 5096 : 5; + 5097 : 5; + 5098 : 5; + 5099 : 5; + 5100 : 5; + 5101 : 5; + 5102 : 5; + 5103 : 5; + 5104 : 5; + 5105 : 5; + 5106 : 5; + 5107 : 5; + 5108 : 5; + 5109 : 5; + 5110 : 5; + 5111 : 5; + 5112 : 5; + 5113 : 5; + 5114 : 5; + 5115 : 5; + 5116 : 5; + 5117 : 5; + 5118 : 0; + 5119 : 0; + 5120 : 5; + 5121 : 5; + 5122 : 5; + 5123 : 5; + 5124 : 5; + 5125 : 5; + 5126 : 5; + 5127 : 5; + 5128 : 5; + 5129 : 5; + 5130 : 5; + 5131 : 5; + 5132 : 5; + 5133 : 5; + 5134 : 5; + 5135 : 5; + 5136 : 1; + 5137 : 1; + 5138 : 1; + 5139 : 1; + 5140 : 1; + 5141 : 1; + 5142 : 1; + 5143 : 1; + 5144 : 1; + 5145 : 1; + 5146 : 1; + 5147 : 1; + 5148 : 5; + 5149 : 5; + 5150 : 5; + 5151 : 5; + 5152 : 5; + 5153 : 5; + 5154 : 5; + 5155 : 5; + 5156 : 1; + 5157 : 1; + 5158 : 1; + 5159 : 1; + 5160 : 1; + 5161 : 1; + 5162 : 1; + 5163 : 5; + 5164 : 5; + 5165 : 5; + 5166 : 5; + 5167 : 5; + 5168 : 5; + 5169 : 5; + 5170 : 5; + 5171 : 5; + 5172 : 5; + 5173 : 5; + 5174 : 5; + 5175 : 5; + 5176 : 5; + 5177 : 5; + 5178 : 5; + 5179 : 5; + 5180 : 5; + 5181 : 5; + 5182 : 0; + 5183 : 0; + 5184 : 5; + 5185 : 5; + 5186 : 5; + 5187 : 5; + 5188 : 5; + 5189 : 5; + 5190 : 5; + 5191 : 5; + 5192 : 5; + 5193 : 5; + 5194 : 5; + 5195 : 5; + 5196 : 5; + 5197 : 5; + 5198 : 5; + 5199 : 5; + 5200 : 1; + 5201 : 1; + 5202 : 1; + 5203 : 1; + 5204 : 1; + 5205 : 1; + 5206 : 1; + 5207 : 1; + 5208 : 1; + 5209 : 1; + 5210 : 1; + 5211 : 1; + 5212 : 5; + 5213 : 5; + 5214 : 5; + 5215 : 5; + 5216 : 5; + 5217 : 5; + 5218 : 5; + 5219 : 5; + 5220 : 1; + 5221 : 1; + 5222 : 1; + 5223 : 1; + 5224 : 1; + 5225 : 1; + 5226 : 1; + 5227 : 5; + 5228 : 5; + 5229 : 5; + 5230 : 5; + 5231 : 5; + 5232 : 5; + 5233 : 5; + 5234 : 5; + 5235 : 5; + 5236 : 5; + 5237 : 5; + 5238 : 5; + 5239 : 5; + 5240 : 5; + 5241 : 5; + 5242 : 5; + 5243 : 5; + 5244 : 5; + 5245 : 5; + 5246 : 0; + 5247 : 0; + 5248 : 5; + 5249 : 5; + 5250 : 5; + 5251 : 5; + 5252 : 5; + 5253 : 5; + 5254 : 5; + 5255 : 5; + 5256 : 5; + 5257 : 5; + 5258 : 5; + 5259 : 5; + 5260 : 5; + 5261 : 5; + 5262 : 5; + 5263 : 5; + 5264 : 1; + 5265 : 1; + 5266 : 1; + 5267 : 1; + 5268 : 1; + 5269 : 1; + 5270 : 1; + 5271 : 1; + 5272 : 1; + 5273 : 1; + 5274 : 1; + 5275 : 1; + 5276 : 5; + 5277 : 5; + 5278 : 5; + 5279 : 5; + 5280 : 5; + 5281 : 5; + 5282 : 5; + 5283 : 5; + 5284 : 1; + 5285 : 1; + 5286 : 1; + 5287 : 1; + 5288 : 1; + 5289 : 1; + 5290 : 1; + 5291 : 5; + 5292 : 5; + 5293 : 5; + 5294 : 5; + 5295 : 5; + 5296 : 5; + 5297 : 5; + 5298 : 5; + 5299 : 5; + 5300 : 5; + 5301 : 5; + 5302 : 5; + 5303 : 5; + 5304 : 5; + 5305 : 5; + 5306 : 5; + 5307 : 5; + 5308 : 5; + 5309 : 5; + 5310 : 0; + 5311 : 0; + 5312 : 5; + 5313 : 5; + 5314 : 5; + 5315 : 5; + 5316 : 5; + 5317 : 5; + 5318 : 5; + 5319 : 5; + 5320 : 5; + 5321 : 5; + 5322 : 5; + 5323 : 5; + 5324 : 5; + 5325 : 5; + 5326 : 5; + 5327 : 5; + 5328 : 1; + 5329 : 1; + 5330 : 1; + 5331 : 1; + 5332 : 1; + 5333 : 1; + 5334 : 1; + 5335 : 1; + 5336 : 1; + 5337 : 1; + 5338 : 1; + 5339 : 1; + 5340 : 5; + 5341 : 5; + 5342 : 5; + 5343 : 5; + 5344 : 5; + 5345 : 5; + 5346 : 5; + 5347 : 5; + 5348 : 1; + 5349 : 1; + 5350 : 1; + 5351 : 1; + 5352 : 1; + 5353 : 1; + 5354 : 1; + 5355 : 5; + 5356 : 5; + 5357 : 5; + 5358 : 5; + 5359 : 5; + 5360 : 5; + 5361 : 5; + 5362 : 5; + 5363 : 5; + 5364 : 5; + 5365 : 5; + 5366 : 5; + 5367 : 5; + 5368 : 5; + 5369 : 5; + 5370 : 5; + 5371 : 5; + 5372 : 5; + 5373 : 5; + 5374 : 0; + 5375 : 0; + 5376 : 5; + 5377 : 5; + 5378 : 5; + 5379 : 5; + 5380 : 5; + 5381 : 5; + 5382 : 5; + 5383 : 5; + 5384 : 5; + 5385 : 5; + 5386 : 5; + 5387 : 5; + 5388 : 5; + 5389 : 5; + 5390 : 5; + 5391 : 5; + 5392 : 1; + 5393 : 1; + 5394 : 1; + 5395 : 1; + 5396 : 1; + 5397 : 1; + 5398 : 1; + 5399 : 1; + 5400 : 1; + 5401 : 1; + 5402 : 1; + 5403 : 1; + 5404 : 1; + 5405 : 1; + 5406 : 1; + 5407 : 1; + 5408 : 1; + 5409 : 1; + 5410 : 1; + 5411 : 1; + 5412 : 1; + 5413 : 1; + 5414 : 1; + 5415 : 1; + 5416 : 1; + 5417 : 1; + 5418 : 1; + 5419 : 5; + 5420 : 5; + 5421 : 5; + 5422 : 5; + 5423 : 5; + 5424 : 5; + 5425 : 5; + 5426 : 5; + 5427 : 5; + 5428 : 5; + 5429 : 5; + 5430 : 5; + 5431 : 5; + 5432 : 5; + 5433 : 5; + 5434 : 5; + 5435 : 5; + 5436 : 5; + 5437 : 5; + 5438 : 0; + 5439 : 0; + 5440 : 5; + 5441 : 5; + 5442 : 5; + 5443 : 5; + 5444 : 5; + 5445 : 5; + 5446 : 5; + 5447 : 5; + 5448 : 5; + 5449 : 5; + 5450 : 5; + 5451 : 5; + 5452 : 5; + 5453 : 5; + 5454 : 5; + 5455 : 5; + 5456 : 1; + 5457 : 1; + 5458 : 1; + 5459 : 1; + 5460 : 1; + 5461 : 1; + 5462 : 1; + 5463 : 1; + 5464 : 1; + 5465 : 1; + 5466 : 1; + 5467 : 1; + 5468 : 1; + 5469 : 1; + 5470 : 1; + 5471 : 1; + 5472 : 1; + 5473 : 1; + 5474 : 1; + 5475 : 1; + 5476 : 1; + 5477 : 1; + 5478 : 1; + 5479 : 1; + 5480 : 1; + 5481 : 1; + 5482 : 1; + 5483 : 5; + 5484 : 5; + 5485 : 5; + 5486 : 5; + 5487 : 5; + 5488 : 5; + 5489 : 5; + 5490 : 5; + 5491 : 5; + 5492 : 5; + 5493 : 5; + 5494 : 5; + 5495 : 5; + 5496 : 5; + 5497 : 5; + 5498 : 5; + 5499 : 5; + 5500 : 5; + 5501 : 5; + 5502 : 0; + 5503 : 0; + 5504 : 5; + 5505 : 5; + 5506 : 5; + 5507 : 5; + 5508 : 5; + 5509 : 5; + 5510 : 5; + 5511 : 5; + 5512 : 5; + 5513 : 5; + 5514 : 5; + 5515 : 5; + 5516 : 5; + 5517 : 5; + 5518 : 5; + 5519 : 5; + 5520 : 1; + 5521 : 1; + 5522 : 1; + 5523 : 1; + 5524 : 1; + 5525 : 1; + 5526 : 1; + 5527 : 1; + 5528 : 1; + 5529 : 1; + 5530 : 1; + 5531 : 1; + 5532 : 1; + 5533 : 1; + 5534 : 1; + 5535 : 1; + 5536 : 1; + 5537 : 1; + 5538 : 1; + 5539 : 1; + 5540 : 1; + 5541 : 1; + 5542 : 1; + 5543 : 1; + 5544 : 1; + 5545 : 1; + 5546 : 1; + 5547 : 5; + 5548 : 5; + 5549 : 5; + 5550 : 5; + 5551 : 5; + 5552 : 5; + 5553 : 5; + 5554 : 5; + 5555 : 5; + 5556 : 5; + 5557 : 5; + 5558 : 5; + 5559 : 5; + 5560 : 5; + 5561 : 5; + 5562 : 5; + 5563 : 5; + 5564 : 5; + 5565 : 5; + 5566 : 0; + 5567 : 0; + 5568 : 5; + 5569 : 5; + 5570 : 5; + 5571 : 5; + 5572 : 5; + 5573 : 5; + 5574 : 5; + 5575 : 5; + 5576 : 5; + 5577 : 5; + 5578 : 5; + 5579 : 5; + 5580 : 5; + 5581 : 5; + 5582 : 5; + 5583 : 5; + 5584 : 5; + 5585 : 5; + 5586 : 5; + 5587 : 5; + 5588 : 5; + 5589 : 5; + 5590 : 5; + 5591 : 5; + 5592 : 5; + 5593 : 5; + 5594 : 5; + 5595 : 5; + 5596 : 5; + 5597 : 5; + 5598 : 5; + 5599 : 5; + 5600 : 5; + 5601 : 5; + 5602 : 5; + 5603 : 5; + 5604 : 5; + 5605 : 5; + 5606 : 5; + 5607 : 5; + 5608 : 5; + 5609 : 5; + 5610 : 5; + 5611 : 5; + 5612 : 5; + 5613 : 5; + 5614 : 5; + 5615 : 5; + 5616 : 5; + 5617 : 5; + 5618 : 5; + 5619 : 5; + 5620 : 5; + 5621 : 5; + 5622 : 5; + 5623 : 5; + 5624 : 5; + 5625 : 5; + 5626 : 5; + 5627 : 5; + 5628 : 5; + 5629 : 5; + 5630 : 0; + 5631 : 0; + 5632 : 5; + 5633 : 5; + 5634 : 5; + 5635 : 5; + 5636 : 5; + 5637 : 5; + 5638 : 5; + 5639 : 5; + 5640 : 5; + 5641 : 5; + 5642 : 5; + 5643 : 5; + 5644 : 5; + 5645 : 5; + 5646 : 5; + 5647 : 5; + 5648 : 5; + 5649 : 5; + 5650 : 5; + 5651 : 5; + 5652 : 5; + 5653 : 5; + 5654 : 5; + 5655 : 5; + 5656 : 5; + 5657 : 5; + 5658 : 5; + 5659 : 5; + 5660 : 5; + 5661 : 5; + 5662 : 5; + 5663 : 5; + 5664 : 5; + 5665 : 5; + 5666 : 5; + 5667 : 5; + 5668 : 5; + 5669 : 5; + 5670 : 5; + 5671 : 5; + 5672 : 5; + 5673 : 5; + 5674 : 5; + 5675 : 5; + 5676 : 5; + 5677 : 5; + 5678 : 5; + 5679 : 5; + 5680 : 5; + 5681 : 5; + 5682 : 5; + 5683 : 5; + 5684 : 5; + 5685 : 5; + 5686 : 5; + 5687 : 5; + 5688 : 5; + 5689 : 5; + 5690 : 5; + 5691 : 5; + 5692 : 5; + 5693 : 5; + 5694 : 0; + 5695 : 0; + 5696 : 5; + 5697 : 5; + 5698 : 5; + 5699 : 5; + 5700 : 5; + 5701 : 5; + 5702 : 5; + 5703 : 5; + 5704 : 5; + 5705 : 5; + 5706 : 5; + 5707 : 5; + 5708 : 5; + 5709 : 5; + 5710 : 5; + 5711 : 5; + 5712 : 5; + 5713 : 5; + 5714 : 5; + 5715 : 5; + 5716 : 5; + 5717 : 5; + 5718 : 5; + 5719 : 5; + 5720 : 5; + 5721 : 5; + 5722 : 5; + 5723 : 5; + 5724 : 5; + 5725 : 5; + 5726 : 5; + 5727 : 5; + 5728 : 5; + 5729 : 5; + 5730 : 5; + 5731 : 5; + 5732 : 5; + 5733 : 5; + 5734 : 5; + 5735 : 5; + 5736 : 5; + 5737 : 5; + 5738 : 5; + 5739 : 5; + 5740 : 5; + 5741 : 5; + 5742 : 5; + 5743 : 5; + 5744 : 5; + 5745 : 5; + 5746 : 5; + 5747 : 5; + 5748 : 5; + 5749 : 5; + 5750 : 5; + 5751 : 5; + 5752 : 5; + 5753 : 5; + 5754 : 5; + 5755 : 5; + 5756 : 5; + 5757 : 5; + 5758 : 0; + 5759 : 0; + 5760 : 5; + 5761 : 5; + 5762 : 5; + 5763 : 5; + 5764 : 5; + 5765 : 5; + 5766 : 5; + 5767 : 5; + 5768 : 5; + 5769 : 5; + 5770 : 5; + 5771 : 5; + 5772 : 5; + 5773 : 5; + 5774 : 5; + 5775 : 5; + 5776 : 5; + 5777 : 5; + 5778 : 5; + 5779 : 5; + 5780 : 5; + 5781 : 5; + 5782 : 5; + 5783 : 5; + 5784 : 5; + 5785 : 5; + 5786 : 5; + 5787 : 5; + 5788 : 5; + 5789 : 5; + 5790 : 5; + 5791 : 5; + 5792 : 5; + 5793 : 5; + 5794 : 5; + 5795 : 5; + 5796 : 5; + 5797 : 5; + 5798 : 5; + 5799 : 5; + 5800 : 5; + 5801 : 5; + 5802 : 5; + 5803 : 5; + 5804 : 5; + 5805 : 5; + 5806 : 5; + 5807 : 5; + 5808 : 5; + 5809 : 5; + 5810 : 5; + 5811 : 5; + 5812 : 5; + 5813 : 5; + 5814 : 5; + 5815 : 5; + 5816 : 5; + 5817 : 5; + 5818 : 5; + 5819 : 5; + 5820 : 5; + 5821 : 5; + 5822 : 0; + 5823 : 0; + 5824 : 8; + 5825 : 8; + 5826 : 8; + 5827 : 8; + 5828 : 8; + 5829 : 8; + 5830 : 8; + 5831 : 8; + 5832 : 8; + 5833 : 8; + 5834 : 8; + 5835 : 8; + 5836 : 8; + 5837 : 8; + 5838 : 8; + 5839 : 8; + 5840 : 8; + 5841 : 8; + 5842 : 8; + 5843 : 8; + 5844 : 8; + 5845 : 8; + 5846 : 8; + 5847 : 8; + 5848 : 8; + 5849 : 8; + 5850 : 8; + 5851 : 8; + 5852 : 8; + 5853 : 8; + 5854 : 8; + 5855 : 8; + 5856 : 8; + 5857 : 8; + 5858 : 8; + 5859 : 8; + 5860 : 8; + 5861 : 8; + 5862 : 8; + 5863 : 8; + 5864 : 8; + 5865 : 8; + 5866 : 8; + 5867 : 8; + 5868 : 8; + 5869 : 8; + 5870 : 8; + 5871 : 8; + 5872 : 8; + 5873 : 8; + 5874 : 8; + 5875 : 8; + 5876 : 8; + 5877 : 8; + 5878 : 8; + 5879 : 8; + 5880 : 8; + 5881 : 8; + 5882 : 8; + 5883 : 8; + 5884 : 8; + 5885 : 8; + 5886 : 0; + 5887 : 0; + 5888 : 7; + 5889 : 7; + 5890 : 7; + 5891 : 7; + 5892 : 7; + 5893 : 7; + 5894 : 7; + 5895 : 7; + 5896 : 7; + 5897 : 7; + 5898 : 7; + 5899 : 7; + 5900 : 7; + 5901 : 7; + 5902 : 7; + 5903 : 7; + 5904 : 7; + 5905 : 7; + 5906 : 7; + 5907 : 7; + 5908 : 7; + 5909 : 7; + 5910 : 7; + 5911 : 7; + 5912 : 7; + 5913 : 7; + 5914 : 7; + 5915 : 7; + 5916 : 7; + 5917 : 7; + 5918 : 7; + 5919 : 7; + 5920 : 7; + 5921 : 7; + 5922 : 7; + 5923 : 7; + 5924 : 7; + 5925 : 7; + 5926 : 7; + 5927 : 7; + 5928 : 7; + 5929 : 7; + 5930 : 7; + 5931 : 7; + 5932 : 7; + 5933 : 7; + 5934 : 7; + 5935 : 7; + 5936 : 7; + 5937 : 7; + 5938 : 7; + 5939 : 7; + 5940 : 7; + 5941 : 7; + 5942 : 7; + 5943 : 7; + 5944 : 7; + 5945 : 7; + 5946 : 7; + 5947 : 7; + 5948 : 7; + 5949 : 7; + 5950 : 0; + 5951 : 0; + 5952 : 7; + 5953 : 7; + 5954 : 7; + 5955 : 7; + 5956 : 7; + 5957 : 7; + 5958 : 7; + 5959 : 7; + 5960 : 7; + 5961 : 7; + 5962 : 7; + 5963 : 7; + 5964 : 7; + 5965 : 7; + 5966 : 7; + 5967 : 7; + 5968 : 7; + 5969 : 7; + 5970 : 7; + 5971 : 7; + 5972 : 7; + 5973 : 7; + 5974 : 7; + 5975 : 7; + 5976 : 7; + 5977 : 7; + 5978 : 7; + 5979 : 7; + 5980 : 7; + 5981 : 7; + 5982 : 7; + 5983 : 7; + 5984 : 7; + 5985 : 7; + 5986 : 7; + 5987 : 7; + 5988 : 7; + 5989 : 7; + 5990 : 7; + 5991 : 7; + 5992 : 7; + 5993 : 7; + 5994 : 7; + 5995 : 7; + 5996 : 7; + 5997 : 7; + 5998 : 7; + 5999 : 7; + 6000 : 7; + 6001 : 7; + 6002 : 7; + 6003 : 7; + 6004 : 7; + 6005 : 7; + 6006 : 7; + 6007 : 7; + 6008 : 7; + 6009 : 7; + 6010 : 7; + 6011 : 7; + 6012 : 7; + 6013 : 7; + 6014 : 0; + 6015 : 0; + 6016 : 7; + 6017 : 7; + 6018 : 7; + 6019 : 7; + 6020 : 7; + 6021 : 7; + 6022 : 7; + 6023 : 7; + 6024 : 7; + 6025 : 7; + 6026 : 7; + 6027 : 7; + 6028 : 7; + 6029 : 7; + 6030 : 7; + 6031 : 7; + 6032 : 7; + 6033 : 7; + 6034 : 7; + 6035 : 7; + 6036 : 7; + 6037 : 7; + 6038 : 7; + 6039 : 7; + 6040 : 7; + 6041 : 7; + 6042 : 7; + 6043 : 7; + 6044 : 7; + 6045 : 7; + 6046 : 7; + 6047 : 7; + 6048 : 7; + 6049 : 7; + 6050 : 7; + 6051 : 7; + 6052 : 7; + 6053 : 7; + 6054 : 7; + 6055 : 7; + 6056 : 7; + 6057 : 7; + 6058 : 7; + 6059 : 7; + 6060 : 7; + 6061 : 7; + 6062 : 7; + 6063 : 7; + 6064 : 7; + 6065 : 7; + 6066 : 7; + 6067 : 7; + 6068 : 7; + 6069 : 7; + 6070 : 7; + 6071 : 7; + 6072 : 7; + 6073 : 7; + 6074 : 7; + 6075 : 7; + 6076 : 7; + 6077 : 7; + 6078 : 0; + 6079 : 0; + 6080 : 7; + 6081 : 7; + 6082 : 7; + 6083 : 7; + 6084 : 7; + 6085 : 7; + 6086 : 7; + 6087 : 7; + 6088 : 7; + 6089 : 7; + 6090 : 7; + 6091 : 7; + 6092 : 7; + 6093 : 7; + 6094 : 7; + 6095 : 7; + 6096 : 7; + 6097 : 7; + 6098 : 7; + 6099 : 7; + 6100 : 7; + 6101 : 7; + 6102 : 7; + 6103 : 7; + 6104 : 7; + 6105 : 7; + 6106 : 7; + 6107 : 7; + 6108 : 7; + 6109 : 7; + 6110 : 7; + 6111 : 7; + 6112 : 7; + 6113 : 7; + 6114 : 7; + 6115 : 7; + 6116 : 7; + 6117 : 7; + 6118 : 7; + 6119 : 7; + 6120 : 7; + 6121 : 7; + 6122 : 7; + 6123 : 7; + 6124 : 7; + 6125 : 7; + 6126 : 7; + 6127 : 7; + 6128 : 7; + 6129 : 7; + 6130 : 7; + 6131 : 7; + 6132 : 7; + 6133 : 7; + 6134 : 7; + 6135 : 7; + 6136 : 7; + 6137 : 7; + 6138 : 7; + 6139 : 7; + 6140 : 7; + 6141 : 7; + 6142 : 0; + 6143 : 0; + 6144 : 7; + 6145 : 7; + 6146 : 7; + 6147 : 7; + 6148 : 7; + 6149 : 7; + 6150 : 7; + 6151 : 7; + 6152 : 7; + 6153 : 7; + 6154 : 7; + 6155 : 7; + 6156 : 7; + 6157 : 7; + 6158 : 7; + 6159 : 7; + 6160 : 0; + 6161 : 1; + 6162 : 1; + 6163 : 1; + 6164 : 1; + 6165 : 1; + 6166 : 1; + 6167 : 1; + 6168 : 1; + 6169 : 1; + 6170 : 0; + 6171 : 1; + 6172 : 7; + 6173 : 7; + 6174 : 7; + 6175 : 7; + 6176 : 7; + 6177 : 7; + 6178 : 7; + 6179 : 7; + 6180 : 7; + 6181 : 7; + 6182 : 7; + 6183 : 7; + 6184 : 7; + 6185 : 7; + 6186 : 7; + 6187 : 7; + 6188 : 7; + 6189 : 7; + 6190 : 7; + 6191 : 7; + 6192 : 7; + 6193 : 7; + 6194 : 7; + 6195 : 7; + 6196 : 7; + 6197 : 7; + 6198 : 7; + 6199 : 7; + 6200 : 7; + 6201 : 7; + 6202 : 7; + 6203 : 7; + 6204 : 7; + 6205 : 7; + 6206 : 0; + 6207 : 0; + 6208 : 7; + 6209 : 7; + 6210 : 7; + 6211 : 7; + 6212 : 7; + 6213 : 7; + 6214 : 7; + 6215 : 7; + 6216 : 7; + 6217 : 7; + 6218 : 7; + 6219 : 7; + 6220 : 7; + 6221 : 7; + 6222 : 7; + 6223 : 7; + 6224 : 1; + 6225 : 1; + 6226 : 1; + 6227 : 1; + 6228 : 1; + 6229 : 1; + 6230 : 1; + 6231 : 1; + 6232 : 1; + 6233 : 1; + 6234 : 1; + 6235 : 1; + 6236 : 7; + 6237 : 7; + 6238 : 7; + 6239 : 7; + 6240 : 7; + 6241 : 7; + 6242 : 7; + 6243 : 7; + 6244 : 7; + 6245 : 7; + 6246 : 7; + 6247 : 7; + 6248 : 7; + 6249 : 7; + 6250 : 7; + 6251 : 7; + 6252 : 7; + 6253 : 7; + 6254 : 7; + 6255 : 7; + 6256 : 7; + 6257 : 7; + 6258 : 7; + 6259 : 7; + 6260 : 7; + 6261 : 7; + 6262 : 7; + 6263 : 7; + 6264 : 7; + 6265 : 7; + 6266 : 7; + 6267 : 7; + 6268 : 7; + 6269 : 7; + 6270 : 0; + 6271 : 0; + 6272 : 7; + 6273 : 7; + 6274 : 7; + 6275 : 7; + 6276 : 7; + 6277 : 7; + 6278 : 7; + 6279 : 7; + 6280 : 7; + 6281 : 7; + 6282 : 7; + 6283 : 7; + 6284 : 7; + 6285 : 7; + 6286 : 7; + 6287 : 7; + 6288 : 1; + 6289 : 1; + 6290 : 1; + 6291 : 1; + 6292 : 1; + 6293 : 1; + 6294 : 1; + 6295 : 1; + 6296 : 1; + 6297 : 1; + 6298 : 1; + 6299 : 1; + 6300 : 7; + 6301 : 7; + 6302 : 7; + 6303 : 7; + 6304 : 7; + 6305 : 7; + 6306 : 7; + 6307 : 7; + 6308 : 7; + 6309 : 7; + 6310 : 7; + 6311 : 7; + 6312 : 7; + 6313 : 7; + 6314 : 7; + 6315 : 7; + 6316 : 7; + 6317 : 7; + 6318 : 7; + 6319 : 7; + 6320 : 7; + 6321 : 7; + 6322 : 7; + 6323 : 7; + 6324 : 7; + 6325 : 7; + 6326 : 7; + 6327 : 7; + 6328 : 7; + 6329 : 7; + 6330 : 7; + 6331 : 7; + 6332 : 7; + 6333 : 7; + 6334 : 0; + 6335 : 0; + 6336 : 7; + 6337 : 7; + 6338 : 7; + 6339 : 7; + 6340 : 7; + 6341 : 7; + 6342 : 7; + 6343 : 7; + 6344 : 7; + 6345 : 7; + 6346 : 7; + 6347 : 7; + 6348 : 7; + 6349 : 7; + 6350 : 7; + 6351 : 7; + 6352 : 1; + 6353 : 1; + 6354 : 1; + 6355 : 1; + 6356 : 1; + 6357 : 1; + 6358 : 1; + 6359 : 1; + 6360 : 1; + 6361 : 1; + 6362 : 1; + 6363 : 1; + 6364 : 7; + 6365 : 7; + 6366 : 7; + 6367 : 7; + 6368 : 7; + 6369 : 7; + 6370 : 7; + 6371 : 7; + 6372 : 7; + 6373 : 7; + 6374 : 7; + 6375 : 7; + 6376 : 7; + 6377 : 7; + 6378 : 7; + 6379 : 7; + 6380 : 7; + 6381 : 7; + 6382 : 7; + 6383 : 7; + 6384 : 7; + 6385 : 7; + 6386 : 7; + 6387 : 7; + 6388 : 7; + 6389 : 7; + 6390 : 7; + 6391 : 7; + 6392 : 7; + 6393 : 7; + 6394 : 7; + 6395 : 7; + 6396 : 7; + 6397 : 7; + 6398 : 0; + 6399 : 0; + 6400 : 7; + 6401 : 7; + 6402 : 7; + 6403 : 7; + 6404 : 7; + 6405 : 7; + 6406 : 7; + 6407 : 7; + 6408 : 7; + 6409 : 7; + 6410 : 7; + 6411 : 7; + 6412 : 7; + 6413 : 7; + 6414 : 7; + 6415 : 7; + 6416 : 1; + 6417 : 1; + 6418 : 1; + 6419 : 1; + 6420 : 1; + 6421 : 1; + 6422 : 1; + 6423 : 1; + 6424 : 1; + 6425 : 1; + 6426 : 1; + 6427 : 1; + 6428 : 7; + 6429 : 7; + 6430 : 7; + 6431 : 7; + 6432 : 7; + 6433 : 7; + 6434 : 7; + 6435 : 7; + 6436 : 7; + 6437 : 7; + 6438 : 7; + 6439 : 7; + 6440 : 7; + 6441 : 7; + 6442 : 7; + 6443 : 7; + 6444 : 7; + 6445 : 7; + 6446 : 7; + 6447 : 7; + 6448 : 7; + 6449 : 7; + 6450 : 7; + 6451 : 7; + 6452 : 7; + 6453 : 7; + 6454 : 7; + 6455 : 7; + 6456 : 7; + 6457 : 7; + 6458 : 7; + 6459 : 7; + 6460 : 7; + 6461 : 7; + 6462 : 0; + 6463 : 0; + 6464 : 7; + 6465 : 7; + 6466 : 7; + 6467 : 7; + 6468 : 7; + 6469 : 7; + 6470 : 7; + 6471 : 7; + 6472 : 7; + 6473 : 7; + 6474 : 7; + 6475 : 7; + 6476 : 7; + 6477 : 7; + 6478 : 7; + 6479 : 7; + 6480 : 1; + 6481 : 1; + 6482 : 1; + 6483 : 1; + 6484 : 1; + 6485 : 1; + 6486 : 1; + 6487 : 1; + 6488 : 1; + 6489 : 1; + 6490 : 1; + 6491 : 1; + 6492 : 7; + 6493 : 7; + 6494 : 7; + 6495 : 7; + 6496 : 7; + 6497 : 7; + 6498 : 7; + 6499 : 7; + 6500 : 7; + 6501 : 7; + 6502 : 7; + 6503 : 7; + 6504 : 7; + 6505 : 7; + 6506 : 7; + 6507 : 7; + 6508 : 7; + 6509 : 7; + 6510 : 7; + 6511 : 7; + 6512 : 7; + 6513 : 7; + 6514 : 7; + 6515 : 7; + 6516 : 7; + 6517 : 7; + 6518 : 7; + 6519 : 7; + 6520 : 7; + 6521 : 7; + 6522 : 7; + 6523 : 7; + 6524 : 7; + 6525 : 7; + 6526 : 0; + 6527 : 0; + 6528 : 7; + 6529 : 7; + 6530 : 7; + 6531 : 7; + 6532 : 7; + 6533 : 7; + 6534 : 7; + 6535 : 7; + 6536 : 7; + 6537 : 7; + 6538 : 7; + 6539 : 7; + 6540 : 7; + 6541 : 7; + 6542 : 7; + 6543 : 7; + 6544 : 1; + 6545 : 1; + 6546 : 1; + 6547 : 1; + 6548 : 1; + 6549 : 1; + 6550 : 1; + 6551 : 1; + 6552 : 1; + 6553 : 1; + 6554 : 1; + 6555 : 1; + 6556 : 7; + 6557 : 7; + 6558 : 7; + 6559 : 7; + 6560 : 7; + 6561 : 7; + 6562 : 7; + 6563 : 7; + 6564 : 7; + 6565 : 7; + 6566 : 7; + 6567 : 7; + 6568 : 7; + 6569 : 7; + 6570 : 7; + 6571 : 7; + 6572 : 7; + 6573 : 7; + 6574 : 7; + 6575 : 7; + 6576 : 7; + 6577 : 7; + 6578 : 7; + 6579 : 7; + 6580 : 7; + 6581 : 7; + 6582 : 7; + 6583 : 7; + 6584 : 7; + 6585 : 7; + 6586 : 7; + 6587 : 7; + 6588 : 7; + 6589 : 7; + 6590 : 0; + 6591 : 0; + 6592 : 7; + 6593 : 7; + 6594 : 7; + 6595 : 7; + 6596 : 7; + 6597 : 7; + 6598 : 7; + 6599 : 7; + 6600 : 7; + 6601 : 7; + 6602 : 7; + 6603 : 7; + 6604 : 7; + 6605 : 7; + 6606 : 7; + 6607 : 7; + 6608 : 1; + 6609 : 1; + 6610 : 1; + 6611 : 1; + 6612 : 1; + 6613 : 1; + 6614 : 1; + 6615 : 1; + 6616 : 1; + 6617 : 1; + 6618 : 1; + 6619 : 1; + 6620 : 7; + 6621 : 7; + 6622 : 7; + 6623 : 7; + 6624 : 7; + 6625 : 7; + 6626 : 7; + 6627 : 7; + 6628 : 7; + 6629 : 7; + 6630 : 7; + 6631 : 7; + 6632 : 7; + 6633 : 7; + 6634 : 7; + 6635 : 7; + 6636 : 7; + 6637 : 7; + 6638 : 7; + 6639 : 7; + 6640 : 7; + 6641 : 7; + 6642 : 7; + 6643 : 7; + 6644 : 7; + 6645 : 7; + 6646 : 7; + 6647 : 7; + 6648 : 7; + 6649 : 7; + 6650 : 7; + 6651 : 7; + 6652 : 7; + 6653 : 7; + 6654 : 0; + 6655 : 0; + 6656 : 7; + 6657 : 7; + 6658 : 7; + 6659 : 7; + 6660 : 7; + 6661 : 7; + 6662 : 7; + 6663 : 7; + 6664 : 7; + 6665 : 7; + 6666 : 7; + 6667 : 7; + 6668 : 7; + 6669 : 7; + 6670 : 7; + 6671 : 7; + 6672 : 1; + 6673 : 1; + 6674 : 1; + 6675 : 1; + 6676 : 1; + 6677 : 1; + 6678 : 1; + 6679 : 1; + 6680 : 1; + 6681 : 1; + 6682 : 1; + 6683 : 1; + 6684 : 7; + 6685 : 7; + 6686 : 7; + 6687 : 7; + 6688 : 7; + 6689 : 7; + 6690 : 7; + 6691 : 7; + 6692 : 7; + 6693 : 7; + 6694 : 7; + 6695 : 7; + 6696 : 7; + 6697 : 7; + 6698 : 7; + 6699 : 7; + 6700 : 7; + 6701 : 7; + 6702 : 7; + 6703 : 7; + 6704 : 7; + 6705 : 7; + 6706 : 7; + 6707 : 7; + 6708 : 7; + 6709 : 7; + 6710 : 7; + 6711 : 7; + 6712 : 7; + 6713 : 7; + 6714 : 7; + 6715 : 7; + 6716 : 7; + 6717 : 7; + 6718 : 0; + 6719 : 0; + 6720 : 7; + 6721 : 7; + 6722 : 7; + 6723 : 7; + 6724 : 7; + 6725 : 7; + 6726 : 7; + 6727 : 7; + 6728 : 7; + 6729 : 7; + 6730 : 7; + 6731 : 7; + 6732 : 7; + 6733 : 7; + 6734 : 7; + 6735 : 7; + 6736 : 1; + 6737 : 1; + 6738 : 1; + 6739 : 1; + 6740 : 1; + 6741 : 1; + 6742 : 1; + 6743 : 1; + 6744 : 1; + 6745 : 1; + 6746 : 1; + 6747 : 1; + 6748 : 7; + 6749 : 7; + 6750 : 7; + 6751 : 7; + 6752 : 7; + 6753 : 7; + 6754 : 7; + 6755 : 7; + 6756 : 7; + 6757 : 7; + 6758 : 7; + 6759 : 7; + 6760 : 7; + 6761 : 7; + 6762 : 7; + 6763 : 7; + 6764 : 7; + 6765 : 7; + 6766 : 7; + 6767 : 7; + 6768 : 7; + 6769 : 7; + 6770 : 7; + 6771 : 7; + 6772 : 7; + 6773 : 7; + 6774 : 7; + 6775 : 7; + 6776 : 7; + 6777 : 7; + 6778 : 7; + 6779 : 7; + 6780 : 7; + 6781 : 7; + 6782 : 0; + 6783 : 0; + 6784 : 7; + 6785 : 7; + 6786 : 7; + 6787 : 7; + 6788 : 7; + 6789 : 7; + 6790 : 7; + 6791 : 7; + 6792 : 7; + 6793 : 7; + 6794 : 7; + 6795 : 7; + 6796 : 7; + 6797 : 7; + 6798 : 7; + 6799 : 7; + 6800 : 1; + 6801 : 1; + 6802 : 1; + 6803 : 1; + 6804 : 1; + 6805 : 1; + 6806 : 1; + 6807 : 1; + 6808 : 1; + 6809 : 1; + 6810 : 1; + 6811 : 1; + 6812 : 7; + 6813 : 7; + 6814 : 7; + 6815 : 7; + 6816 : 7; + 6817 : 7; + 6818 : 7; + 6819 : 7; + 6820 : 7; + 6821 : 7; + 6822 : 7; + 6823 : 7; + 6824 : 7; + 6825 : 7; + 6826 : 7; + 6827 : 7; + 6828 : 7; + 6829 : 7; + 6830 : 7; + 6831 : 7; + 6832 : 7; + 6833 : 7; + 6834 : 7; + 6835 : 7; + 6836 : 7; + 6837 : 7; + 6838 : 7; + 6839 : 7; + 6840 : 7; + 6841 : 7; + 6842 : 7; + 6843 : 7; + 6844 : 7; + 6845 : 7; + 6846 : 0; + 6847 : 0; + 6848 : 7; + 6849 : 7; + 6850 : 7; + 6851 : 7; + 6852 : 7; + 6853 : 7; + 6854 : 7; + 6855 : 7; + 6856 : 7; + 6857 : 7; + 6858 : 7; + 6859 : 7; + 6860 : 7; + 6861 : 7; + 6862 : 7; + 6863 : 7; + 6864 : 1; + 6865 : 1; + 6866 : 1; + 6867 : 1; + 6868 : 1; + 6869 : 1; + 6870 : 1; + 6871 : 1; + 6872 : 1; + 6873 : 1; + 6874 : 1; + 6875 : 1; + 6876 : 7; + 6877 : 7; + 6878 : 7; + 6879 : 7; + 6880 : 7; + 6881 : 7; + 6882 : 7; + 6883 : 7; + 6884 : 7; + 6885 : 7; + 6886 : 7; + 6887 : 7; + 6888 : 7; + 6889 : 7; + 6890 : 7; + 6891 : 7; + 6892 : 7; + 6893 : 7; + 6894 : 7; + 6895 : 7; + 6896 : 7; + 6897 : 7; + 6898 : 7; + 6899 : 7; + 6900 : 7; + 6901 : 7; + 6902 : 7; + 6903 : 7; + 6904 : 7; + 6905 : 7; + 6906 : 7; + 6907 : 7; + 6908 : 7; + 6909 : 7; + 6910 : 0; + 6911 : 0; + 6912 : 7; + 6913 : 7; + 6914 : 7; + 6915 : 7; + 6916 : 7; + 6917 : 7; + 6918 : 7; + 6919 : 7; + 6920 : 7; + 6921 : 7; + 6922 : 7; + 6923 : 7; + 6924 : 7; + 6925 : 7; + 6926 : 7; + 6927 : 7; + 6928 : 1; + 6929 : 1; + 6930 : 1; + 6931 : 1; + 6932 : 1; + 6933 : 1; + 6934 : 1; + 6935 : 1; + 6936 : 1; + 6937 : 1; + 6938 : 1; + 6939 : 1; + 6940 : 7; + 6941 : 7; + 6942 : 7; + 6943 : 7; + 6944 : 7; + 6945 : 7; + 6946 : 7; + 6947 : 7; + 6948 : 7; + 6949 : 7; + 6950 : 7; + 6951 : 7; + 6952 : 7; + 6953 : 7; + 6954 : 7; + 6955 : 7; + 6956 : 7; + 6957 : 7; + 6958 : 7; + 6959 : 7; + 6960 : 7; + 6961 : 7; + 6962 : 7; + 6963 : 7; + 6964 : 7; + 6965 : 7; + 6966 : 7; + 6967 : 7; + 6968 : 7; + 6969 : 7; + 6970 : 7; + 6971 : 7; + 6972 : 7; + 6973 : 7; + 6974 : 0; + 6975 : 0; + 6976 : 7; + 6977 : 7; + 6978 : 7; + 6979 : 7; + 6980 : 7; + 6981 : 7; + 6982 : 7; + 6983 : 7; + 6984 : 7; + 6985 : 7; + 6986 : 7; + 6987 : 7; + 6988 : 7; + 6989 : 7; + 6990 : 7; + 6991 : 7; + 6992 : 1; + 6993 : 1; + 6994 : 1; + 6995 : 1; + 6996 : 1; + 6997 : 1; + 6998 : 1; + 6999 : 1; + 7000 : 1; + 7001 : 1; + 7002 : 1; + 7003 : 1; + 7004 : 7; + 7005 : 7; + 7006 : 7; + 7007 : 7; + 7008 : 7; + 7009 : 7; + 7010 : 7; + 7011 : 7; + 7012 : 7; + 7013 : 7; + 7014 : 7; + 7015 : 7; + 7016 : 7; + 7017 : 7; + 7018 : 7; + 7019 : 7; + 7020 : 7; + 7021 : 7; + 7022 : 7; + 7023 : 7; + 7024 : 7; + 7025 : 7; + 7026 : 7; + 7027 : 7; + 7028 : 7; + 7029 : 7; + 7030 : 7; + 7031 : 7; + 7032 : 7; + 7033 : 7; + 7034 : 7; + 7035 : 7; + 7036 : 7; + 7037 : 7; + 7038 : 0; + 7039 : 0; + 7040 : 7; + 7041 : 7; + 7042 : 7; + 7043 : 7; + 7044 : 7; + 7045 : 7; + 7046 : 7; + 7047 : 7; + 7048 : 7; + 7049 : 7; + 7050 : 7; + 7051 : 7; + 7052 : 7; + 7053 : 7; + 7054 : 7; + 7055 : 7; + 7056 : 1; + 7057 : 1; + 7058 : 1; + 7059 : 1; + 7060 : 1; + 7061 : 1; + 7062 : 1; + 7063 : 1; + 7064 : 1; + 7065 : 1; + 7066 : 1; + 7067 : 1; + 7068 : 7; + 7069 : 7; + 7070 : 7; + 7071 : 7; + 7072 : 7; + 7073 : 7; + 7074 : 7; + 7075 : 7; + 7076 : 7; + 7077 : 7; + 7078 : 7; + 7079 : 7; + 7080 : 7; + 7081 : 7; + 7082 : 7; + 7083 : 7; + 7084 : 7; + 7085 : 7; + 7086 : 7; + 7087 : 7; + 7088 : 7; + 7089 : 7; + 7090 : 7; + 7091 : 7; + 7092 : 7; + 7093 : 7; + 7094 : 7; + 7095 : 7; + 7096 : 7; + 7097 : 7; + 7098 : 7; + 7099 : 7; + 7100 : 7; + 7101 : 7; + 7102 : 0; + 7103 : 0; + 7104 : 7; + 7105 : 7; + 7106 : 7; + 7107 : 7; + 7108 : 7; + 7109 : 7; + 7110 : 7; + 7111 : 7; + 7112 : 7; + 7113 : 7; + 7114 : 7; + 7115 : 7; + 7116 : 7; + 7117 : 7; + 7118 : 7; + 7119 : 7; + 7120 : 1; + 7121 : 1; + 7122 : 1; + 7123 : 1; + 7124 : 1; + 7125 : 1; + 7126 : 1; + 7127 : 1; + 7128 : 1; + 7129 : 1; + 7130 : 1; + 7131 : 1; + 7132 : 7; + 7133 : 7; + 7134 : 7; + 7135 : 7; + 7136 : 7; + 7137 : 7; + 7138 : 7; + 7139 : 7; + 7140 : 7; + 7141 : 7; + 7142 : 7; + 7143 : 7; + 7144 : 7; + 7145 : 7; + 7146 : 7; + 7147 : 7; + 7148 : 7; + 7149 : 7; + 7150 : 7; + 7151 : 7; + 7152 : 7; + 7153 : 7; + 7154 : 7; + 7155 : 7; + 7156 : 7; + 7157 : 7; + 7158 : 7; + 7159 : 7; + 7160 : 7; + 7161 : 7; + 7162 : 7; + 7163 : 7; + 7164 : 7; + 7165 : 7; + 7166 : 0; + 7167 : 0; + 7168 : 7; + 7169 : 7; + 7170 : 7; + 7171 : 7; + 7172 : 7; + 7173 : 7; + 7174 : 7; + 7175 : 7; + 7176 : 7; + 7177 : 7; + 7178 : 7; + 7179 : 7; + 7180 : 7; + 7181 : 7; + 7182 : 7; + 7183 : 7; + 7184 : 1; + 7185 : 1; + 7186 : 1; + 7187 : 1; + 7188 : 1; + 7189 : 1; + 7190 : 1; + 7191 : 1; + 7192 : 1; + 7193 : 1; + 7194 : 1; + 7195 : 1; + 7196 : 1; + 7197 : 1; + 7198 : 1; + 7199 : 1; + 7200 : 1; + 7201 : 1; + 7202 : 1; + 7203 : 1; + 7204 : 1; + 7205 : 1; + 7206 : 1; + 7207 : 1; + 7208 : 1; + 7209 : 1; + 7210 : 1; + 7211 : 7; + 7212 : 7; + 7213 : 7; + 7214 : 7; + 7215 : 7; + 7216 : 7; + 7217 : 7; + 7218 : 7; + 7219 : 7; + 7220 : 7; + 7221 : 7; + 7222 : 7; + 7223 : 7; + 7224 : 7; + 7225 : 7; + 7226 : 7; + 7227 : 7; + 7228 : 7; + 7229 : 7; + 7230 : 0; + 7231 : 0; + 7232 : 7; + 7233 : 7; + 7234 : 7; + 7235 : 7; + 7236 : 7; + 7237 : 7; + 7238 : 7; + 7239 : 7; + 7240 : 7; + 7241 : 7; + 7242 : 7; + 7243 : 7; + 7244 : 7; + 7245 : 7; + 7246 : 7; + 7247 : 7; + 7248 : 1; + 7249 : 1; + 7250 : 1; + 7251 : 1; + 7252 : 1; + 7253 : 1; + 7254 : 1; + 7255 : 1; + 7256 : 1; + 7257 : 1; + 7258 : 1; + 7259 : 1; + 7260 : 1; + 7261 : 1; + 7262 : 1; + 7263 : 1; + 7264 : 1; + 7265 : 1; + 7266 : 1; + 7267 : 1; + 7268 : 1; + 7269 : 1; + 7270 : 1; + 7271 : 1; + 7272 : 1; + 7273 : 1; + 7274 : 1; + 7275 : 7; + 7276 : 7; + 7277 : 7; + 7278 : 7; + 7279 : 7; + 7280 : 7; + 7281 : 7; + 7282 : 7; + 7283 : 7; + 7284 : 7; + 7285 : 7; + 7286 : 7; + 7287 : 7; + 7288 : 7; + 7289 : 7; + 7290 : 7; + 7291 : 7; + 7292 : 7; + 7293 : 7; + 7294 : 0; + 7295 : 0; + 7296 : 7; + 7297 : 7; + 7298 : 7; + 7299 : 7; + 7300 : 7; + 7301 : 7; + 7302 : 7; + 7303 : 7; + 7304 : 7; + 7305 : 7; + 7306 : 7; + 7307 : 7; + 7308 : 7; + 7309 : 7; + 7310 : 7; + 7311 : 7; + 7312 : 1; + 7313 : 1; + 7314 : 1; + 7315 : 1; + 7316 : 1; + 7317 : 1; + 7318 : 1; + 7319 : 1; + 7320 : 1; + 7321 : 1; + 7322 : 1; + 7323 : 1; + 7324 : 1; + 7325 : 1; + 7326 : 1; + 7327 : 1; + 7328 : 1; + 7329 : 1; + 7330 : 1; + 7331 : 1; + 7332 : 1; + 7333 : 1; + 7334 : 1; + 7335 : 1; + 7336 : 1; + 7337 : 1; + 7338 : 1; + 7339 : 7; + 7340 : 7; + 7341 : 7; + 7342 : 7; + 7343 : 7; + 7344 : 7; + 7345 : 7; + 7346 : 7; + 7347 : 7; + 7348 : 7; + 7349 : 7; + 7350 : 7; + 7351 : 7; + 7352 : 7; + 7353 : 7; + 7354 : 7; + 7355 : 7; + 7356 : 7; + 7357 : 7; + 7358 : 0; + 7359 : 0; + 7360 : 7; + 7361 : 7; + 7362 : 7; + 7363 : 7; + 7364 : 7; + 7365 : 7; + 7366 : 7; + 7367 : 7; + 7368 : 7; + 7369 : 7; + 7370 : 7; + 7371 : 7; + 7372 : 7; + 7373 : 7; + 7374 : 7; + 7375 : 7; + 7376 : 1; + 7377 : 1; + 7378 : 1; + 7379 : 1; + 7380 : 1; + 7381 : 1; + 7382 : 1; + 7383 : 1; + 7384 : 1; + 7385 : 1; + 7386 : 1; + 7387 : 1; + 7388 : 1; + 7389 : 1; + 7390 : 1; + 7391 : 1; + 7392 : 1; + 7393 : 1; + 7394 : 1; + 7395 : 1; + 7396 : 1; + 7397 : 1; + 7398 : 1; + 7399 : 1; + 7400 : 1; + 7401 : 1; + 7402 : 1; + 7403 : 7; + 7404 : 7; + 7405 : 7; + 7406 : 7; + 7407 : 7; + 7408 : 7; + 7409 : 7; + 7410 : 7; + 7411 : 7; + 7412 : 7; + 7413 : 7; + 7414 : 7; + 7415 : 7; + 7416 : 7; + 7417 : 7; + 7418 : 7; + 7419 : 7; + 7420 : 7; + 7421 : 7; + 7422 : 0; + 7423 : 0; + 7424 : 7; + 7425 : 7; + 7426 : 7; + 7427 : 7; + 7428 : 7; + 7429 : 7; + 7430 : 7; + 7431 : 7; + 7432 : 7; + 7433 : 7; + 7434 : 7; + 7435 : 7; + 7436 : 7; + 7437 : 7; + 7438 : 7; + 7439 : 7; + 7440 : 1; + 7441 : 1; + 7442 : 1; + 7443 : 1; + 7444 : 1; + 7445 : 1; + 7446 : 1; + 7447 : 1; + 7448 : 1; + 7449 : 1; + 7450 : 1; + 7451 : 1; + 7452 : 1; + 7453 : 1; + 7454 : 1; + 7455 : 1; + 7456 : 1; + 7457 : 1; + 7458 : 1; + 7459 : 1; + 7460 : 1; + 7461 : 1; + 7462 : 1; + 7463 : 1; + 7464 : 1; + 7465 : 1; + 7466 : 1; + 7467 : 7; + 7468 : 7; + 7469 : 7; + 7470 : 7; + 7471 : 7; + 7472 : 7; + 7473 : 7; + 7474 : 7; + 7475 : 7; + 7476 : 7; + 7477 : 7; + 7478 : 7; + 7479 : 7; + 7480 : 7; + 7481 : 7; + 7482 : 7; + 7483 : 7; + 7484 : 7; + 7485 : 7; + 7486 : 0; + 7487 : 0; + 7488 : 7; + 7489 : 7; + 7490 : 7; + 7491 : 7; + 7492 : 7; + 7493 : 7; + 7494 : 7; + 7495 : 7; + 7496 : 7; + 7497 : 7; + 7498 : 7; + 7499 : 7; + 7500 : 7; + 7501 : 7; + 7502 : 7; + 7503 : 7; + 7504 : 1; + 7505 : 1; + 7506 : 1; + 7507 : 1; + 7508 : 1; + 7509 : 1; + 7510 : 1; + 7511 : 1; + 7512 : 1; + 7513 : 1; + 7514 : 1; + 7515 : 1; + 7516 : 1; + 7517 : 1; + 7518 : 1; + 7519 : 1; + 7520 : 1; + 7521 : 1; + 7522 : 1; + 7523 : 1; + 7524 : 1; + 7525 : 1; + 7526 : 1; + 7527 : 1; + 7528 : 1; + 7529 : 1; + 7530 : 1; + 7531 : 7; + 7532 : 7; + 7533 : 7; + 7534 : 7; + 7535 : 7; + 7536 : 7; + 7537 : 7; + 7538 : 7; + 7539 : 7; + 7540 : 7; + 7541 : 7; + 7542 : 7; + 7543 : 7; + 7544 : 7; + 7545 : 7; + 7546 : 7; + 7547 : 7; + 7548 : 7; + 7549 : 7; + 7550 : 0; + 7551 : 0; + 7552 : 7; + 7553 : 7; + 7554 : 7; + 7555 : 7; + 7556 : 7; + 7557 : 7; + 7558 : 7; + 7559 : 7; + 7560 : 7; + 7561 : 7; + 7562 : 7; + 7563 : 7; + 7564 : 7; + 7565 : 7; + 7566 : 7; + 7567 : 7; + 7568 : 1; + 7569 : 1; + 7570 : 1; + 7571 : 1; + 7572 : 1; + 7573 : 1; + 7574 : 1; + 7575 : 1; + 7576 : 1; + 7577 : 1; + 7578 : 1; + 7579 : 1; + 7580 : 1; + 7581 : 1; + 7582 : 1; + 7583 : 1; + 7584 : 1; + 7585 : 1; + 7586 : 1; + 7587 : 1; + 7588 : 1; + 7589 : 1; + 7590 : 1; + 7591 : 1; + 7592 : 1; + 7593 : 1; + 7594 : 1; + 7595 : 7; + 7596 : 7; + 7597 : 7; + 7598 : 7; + 7599 : 7; + 7600 : 7; + 7601 : 7; + 7602 : 7; + 7603 : 7; + 7604 : 7; + 7605 : 7; + 7606 : 7; + 7607 : 7; + 7608 : 7; + 7609 : 7; + 7610 : 7; + 7611 : 7; + 7612 : 7; + 7613 : 7; + 7614 : 0; + 7615 : 0; + 7616 : 0; + 7617 : 7; + 7618 : 7; + 7619 : 7; + 7620 : 7; + 7621 : 7; + 7622 : 7; + 7623 : 7; + 7624 : 7; + 7625 : 7; + 7626 : 7; + 7627 : 7; + 7628 : 7; + 7629 : 7; + 7630 : 7; + 7631 : 7; + 7632 : 7; + 7633 : 7; + 7634 : 7; + 7635 : 7; + 7636 : 7; + 7637 : 7; + 7638 : 7; + 7639 : 7; + 7640 : 7; + 7641 : 7; + 7642 : 7; + 7643 : 7; + 7644 : 7; + 7645 : 7; + 7646 : 7; + 7647 : 7; + 7648 : 7; + 7649 : 7; + 7650 : 7; + 7651 : 7; + 7652 : 7; + 7653 : 7; + 7654 : 7; + 7655 : 7; + 7656 : 7; + 7657 : 7; + 7658 : 7; + 7659 : 7; + 7660 : 7; + 7661 : 7; + 7662 : 7; + 7663 : 7; + 7664 : 7; + 7665 : 7; + 7666 : 7; + 7667 : 7; + 7668 : 7; + 7669 : 7; + 7670 : 7; + 7671 : 7; + 7672 : 7; + 7673 : 7; + 7674 : 7; + 7675 : 7; + 7676 : 7; + 7677 : 0; + 7678 : 0; + 7679 : 0; + 7680 : 0; + 7681 : 0; + 7682 : 7; + 7683 : 7; + 7684 : 7; + 7685 : 7; + 7686 : 7; + 7687 : 7; + 7688 : 7; + 7689 : 7; + 7690 : 7; + 7691 : 7; + 7692 : 7; + 7693 : 7; + 7694 : 7; + 7695 : 7; + 7696 : 7; + 7697 : 7; + 7698 : 7; + 7699 : 7; + 7700 : 7; + 7701 : 7; + 7702 : 7; + 7703 : 7; + 7704 : 7; + 7705 : 7; + 7706 : 7; + 7707 : 7; + 7708 : 7; + 7709 : 7; + 7710 : 7; + 7711 : 7; + 7712 : 7; + 7713 : 7; + 7714 : 7; + 7715 : 7; + 7716 : 7; + 7717 : 7; + 7718 : 7; + 7719 : 7; + 7720 : 7; + 7721 : 7; + 7722 : 7; + 7723 : 7; + 7724 : 7; + 7725 : 7; + 7726 : 7; + 7727 : 7; + 7728 : 7; + 7729 : 7; + 7730 : 7; + 7731 : 7; + 7732 : 7; + 7733 : 7; + 7734 : 7; + 7735 : 7; + 7736 : 7; + 7737 : 7; + 7738 : 7; + 7739 : 7; + 7740 : 0; + 7741 : 0; + 7742 : 0; + 7743 : 0; + 7744 : 0; + 7745 : 0; + 7746 : 0; + 7747 : 0; + 7748 : 7; + 7749 : 7; + 7750 : 7; + 7751 : 7; + 7752 : 7; + 7753 : 7; + 7754 : 7; + 7755 : 7; + 7756 : 7; + 7757 : 7; + 7758 : 7; + 7759 : 7; + 7760 : 7; + 7761 : 7; + 7762 : 7; + 7763 : 7; + 7764 : 7; + 7765 : 7; + 7766 : 7; + 7767 : 7; + 7768 : 7; + 7769 : 7; + 7770 : 7; + 7771 : 7; + 7772 : 7; + 7773 : 7; + 7774 : 7; + 7775 : 7; + 7776 : 7; + 7777 : 7; + 7778 : 7; + 7779 : 7; + 7780 : 7; + 7781 : 7; + 7782 : 7; + 7783 : 7; + 7784 : 7; + 7785 : 7; + 7786 : 7; + 7787 : 7; + 7788 : 7; + 7789 : 7; + 7790 : 7; + 7791 : 7; + 7792 : 7; + 7793 : 7; + 7794 : 7; + 7795 : 7; + 7796 : 7; + 7797 : 7; + 7798 : 7; + 7799 : 7; + 7800 : 7; + 7801 : 7; + 7802 : 0; + 7803 : 0; + 7804 : 0; + 7805 : 0; + 7806 : 0; + 7807 : 0; + [7808..7999] : 0; +END; \ No newline at end of file diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_fuel.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_fuel.v new file mode 100644 index 00000000..e978f066 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_fuel.v @@ -0,0 +1,161 @@ +// megafunction wizard: %ROM: 1-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: sprite_fuel.v +// Megafunction Name(s): +// altsyncram +// +// 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 sprite_fuel ( + address, + clock, + q); + + input [12:0] address; + input clock; + output [3:0] q; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [3:0] sub_wire0; + wire [3:0] q = sub_wire0[3:0]; + + altsyncram altsyncram_component ( + .address_a (address), + .clock0 (clock), + .q_a (sub_wire0), + .aclr0 (1'b0), + .aclr1 (1'b0), + .address_b (1'b1), + .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_a ({4{1'b1}}), + .data_b (1'b1), + .eccstatus (), + .q_b (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_a (1'b0), + .wren_b (1'b0)); + defparam + altsyncram_component.address_aclr_a = "NONE", + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", + altsyncram_component.init_file = "sprite_fuel.mif", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 8000, + altsyncram_component.operation_mode = "ROM", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_reg_a = "CLOCK0", + altsyncram_component.ram_block_type = "M9K", + altsyncram_component.widthad_a = 13, + altsyncram_component.width_a = 4, + altsyncram_component.width_byteena_a = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +// Retrieval info: PRIVATE: AclrByte NUMERIC "0" +// Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: Clken NUMERIC "0" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "sprite_fuel.mif" +// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8000" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "2" +// Retrieval info: PRIVATE: RegAddr NUMERIC "1" +// Retrieval info: PRIVATE: RegOutput NUMERIC "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: SingleClock NUMERIC "1" +// Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +// Retrieval info: PRIVATE: WidthAddr NUMERIC "13" +// Retrieval info: PRIVATE: WidthData NUMERIC "4" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: INIT_FILE STRING "sprite_fuel.mif" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "8000" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +// Retrieval info: CONSTANT: RAM_BLOCK_TYPE STRING "M9K" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "4" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: USED_PORT: address 0 0 13 0 INPUT NODEFVAL "address[12..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: q 0 0 4 0 OUTPUT NODEFVAL "q[3..0]" +// Retrieval info: CONNECT: @address_a 0 0 13 0 address 0 0 13 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: q 0 0 4 0 @q_a 0 0 4 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_fuel.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_fuel.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_fuel.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_fuel.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_fuel_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_fuel_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_helicopter.mif b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_helicopter.mif new file mode 100644 index 00000000..78c73e96 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_helicopter.mif @@ -0,0 +1,1674 @@ +WIDTH=4; +DEPTH=2000; + +ADDRESS_RADIX=UNS; +DATA_RADIX=HEX; + +CONTENT BEGIN + + 0 : 0; + 1 : 0; + 2 : 0; + 3 : 0; + 4 : 0; + 5 : 0; + 6 : 0; + 7 : 0; + 8 : 0; + 9 : 0; + 10 : 0; + 11 : 0; + 12 : 0; + 13 : 0; + 14 : 0; + 15 : 0; + 16 : 0; + 17 : 0; + 18 : 0; + 19 : 0; + 20 : 0; + 21 : 0; + 22 : 0; + 23 : 0; + 24 : 0; + 25 : 0; + 26 : 0; + 27 : 0; + 28 : 0; + 29 : 0; + 30 : 0; + 31 : 0; + 32 : 0; + 33 : 0; + 34 : 0; + 35 : 0; + 36 : 0; + 37 : 0; + 38 : 0; + 39 : 0; + 40 : 0; + 41 : 0; + 42 : 0; + 43 : 0; + 44 : 0; + 45 : 0; + 46 : 0; + 47 : 0; + 48 : 0; + 49 : 0; + 50 : 0; + 51 : 0; + 52 : 0; + 53 : 0; + 54 : 0; + 55 : 0; + 56 : 0; + 57 : 0; + 58 : 0; + 59 : 0; + 60 : 0; + 61 : 0; + 62 : 0; + 63 : 0; + 64 : 0; + 65 : 0; + 66 : 0; + 67 : 0; + 68 : 0; + 69 : 0; + 70 : 0; + 71 : 0; + 72 : 0; + 73 : 0; + 74 : 0; + 75 : 0; + 76 : 0; + 77 : 0; + 78 : 0; + 79 : 0; + 80 : 0; + 81 : 0; + 82 : 0; + 83 : 0; + 84 : 0; + 85 : 0; + 86 : 0; + 87 : 0; + 88 : 7; + 89 : 0; + 90 : 0; + 91 : 0; + 92 : 0; + 93 : 0; + 94 : 0; + 95 : 0; + 96 : 0; + 97 : 0; + 98 : 0; + 99 : 0; + 100 : 0; + 101 : 0; + 102 : 0; + 103 : 0; + 104 : 0; + 105 : 0; + 106 : 0; + 107 : 0; + 108 : 0; + 109 : 0; + 110 : 0; + 111 : 0; + 112 : 0; + 113 : 0; + 114 : 0; + 115 : 0; + 116 : 0; + 117 : 0; + 118 : 0; + 119 : 0; + 120 : 0; + 121 : 0; + 122 : 0; + 123 : 0; + 124 : 0; + 125 : 0; + 126 : 0; + 127 : 0; + 128 : 0; + 129 : 0; + 130 : 0; + 131 : 0; + 132 : 0; + 133 : 0; + 134 : 0; + 135 : 0; + 136 : 0; + 137 : 0; + 138 : 0; + 139 : 0; + 140 : 0; + 141 : 0; + 142 : 0; + 143 : 0; + 144 : 0; + 145 : 0; + 146 : 0; + 147 : 0; + 148 : 0; + 149 : 0; + 150 : 0; + 151 : 0; + 152 : 0; + 153 : 7; + 154 : 0; + 155 : 0; + 156 : 0; + 157 : 0; + 158 : 0; + 159 : 0; + 160 : 0; + 161 : 0; + 162 : 0; + 163 : 0; + 164 : 0; + 165 : 0; + 166 : 0; + 167 : 0; + 168 : 0; + 169 : 0; + 170 : 0; + 171 : 0; + 172 : 0; + 173 : 0; + 174 : 0; + 175 : 0; + 176 : 0; + 177 : 0; + 178 : 0; + 179 : 0; + 180 : 0; + 181 : 0; + 182 : 0; + 183 : 0; + 184 : 0; + 185 : 0; + 186 : 0; + 187 : 0; + 188 : 0; + 189 : 0; + 190 : 0; + 191 : 0; + 192 : 0; + 193 : 0; + 194 : 0; + 195 : 0; + 196 : 0; + 197 : 0; + 198 : 0; + 199 : 0; + 200 : 0; + 201 : 0; + 202 : 0; + 203 : 0; + 204 : 0; + 205 : 0; + 206 : 0; + 207 : 0; + 208 : 0; + 209 : 0; + 210 : 0; + 211 : 0; + 212 : 0; + 213 : 0; + 214 : 0; + 215 : 0; + 216 : 0; + 217 : 0; + 218 : 7; + 219 : 0; + 220 : 0; + 221 : 0; + 222 : 0; + 223 : 0; + 224 : 0; + 225 : 0; + 226 : 0; + 227 : 0; + 228 : 0; + 229 : 0; + 230 : 0; + 231 : 0; + 232 : 0; + 233 : 0; + 234 : 0; + 235 : 0; + 236 : 0; + 237 : 0; + 238 : 0; + 239 : 0; + 240 : 0; + 241 : 0; + 242 : 0; + 243 : 0; + 244 : 0; + 245 : 0; + 246 : 0; + 247 : 0; + 248 : 0; + 249 : 0; + 250 : 0; + 251 : 0; + 252 : 0; + 253 : 0; + 254 : 0; + 255 : 0; + 256 : 0; + 257 : 0; + 258 : 7; + 259 : 7; + 260 : 7; + 261 : 1; + 262 : 0; + 263 : 0; + 264 : 0; + 265 : 0; + 266 : 0; + 267 : 0; + 268 : 0; + 269 : 0; + 270 : 0; + 271 : 0; + 272 : 0; + 273 : 0; + 274 : 0; + 275 : 0; + 276 : 0; + 277 : 0; + 278 : 0; + 279 : 0; + 280 : 0; + 281 : 0; + 282 : 0; + 283 : 7; + 284 : 0; + 285 : 0; + 286 : 0; + 287 : 0; + 288 : 0; + 289 : 0; + 290 : 0; + 291 : 0; + 292 : 0; + 293 : 0; + 294 : 0; + 295 : 0; + 296 : 0; + 297 : 0; + 298 : 0; + 299 : 0; + 300 : 0; + 301 : 0; + 302 : 0; + 303 : 0; + 304 : 0; + 305 : 0; + 306 : 0; + 307 : 0; + 308 : 0; + 309 : 0; + 310 : 0; + 311 : 0; + 312 : 0; + 313 : 0; + 314 : 0; + 315 : 0; + 316 : 0; + 317 : 0; + 318 : 0; + 319 : 0; + 320 : 0; + 321 : 0; + 322 : 0; + 323 : 0; + 324 : 0; + 325 : 0; + 326 : 7; + 327 : 7; + 328 : 7; + 329 : 7; + 330 : 7; + 331 : 0; + 332 : 0; + 333 : 0; + 334 : 0; + 335 : 0; + 336 : 0; + 337 : 0; + 338 : 0; + 339 : 0; + 340 : 0; + 341 : 0; + 342 : 0; + 343 : 0; + 344 : 0; + 345 : 0; + 346 : 0; + 347 : 0; + 348 : 7; + 349 : 0; + 350 : 0; + 351 : 0; + 352 : 0; + 353 : 0; + 354 : 0; + 355 : 0; + 356 : 0; + 357 : 0; + 358 : 0; + 359 : 0; + 360 : 0; + 361 : 0; + 362 : 0; + 363 : 0; + 364 : 0; + 365 : 0; + 366 : 0; + 367 : 0; + 368 : 0; + 369 : 0; + 370 : 0; + 371 : 0; + 372 : 0; + 373 : 0; + 374 : 0; + 375 : 0; + 376 : 0; + 377 : 0; + 378 : 0; + 379 : 0; + 380 : 0; + 381 : 0; + 382 : 0; + 383 : 0; + 384 : 0; + 385 : 0; + 386 : 0; + 387 : 0; + 388 : 0; + 389 : 0; + 390 : 0; + 391 : 0; + 392 : 0; + 393 : 0; + 394 : 0; + 395 : 1; + 396 : 7; + 397 : 7; + 398 : 7; + 399 : 0; + 400 : 0; + 401 : 0; + 402 : 0; + 403 : 0; + 404 : 0; + 405 : 0; + 406 : 0; + 407 : 0; + 408 : 0; + 409 : 0; + 410 : 0; + 411 : 0; + 412 : 0; + 413 : 7; + 414 : 0; + 415 : 0; + 416 : 0; + 417 : 0; + 418 : 0; + 419 : 0; + 420 : 0; + 421 : 0; + 422 : 0; + 423 : 0; + 424 : 0; + 425 : 0; + 426 : 0; + 427 : 0; + 428 : 0; + 429 : 0; + 430 : 0; + 431 : 0; + 432 : 0; + 433 : 0; + 434 : 0; + 435 : 0; + 436 : 7; + 437 : 0; + 438 : 0; + 439 : 0; + 440 : 0; + 441 : 0; + 442 : 0; + 443 : 0; + 444 : 7; + 445 : 0; + 446 : 0; + 447 : 0; + 448 : 0; + 449 : 0; + 450 : 0; + 451 : 0; + 452 : 0; + 453 : 0; + 454 : 0; + 455 : 0; + 456 : 0; + 457 : 0; + 458 : 0; + 459 : 0; + 460 : 0; + 461 : 0; + 462 : 0; + 463 : 0; + 464 : 3; + 465 : 7; + 466 : 7; + 467 : 0; + 468 : 0; + 469 : 0; + 470 : 0; + 471 : 0; + 472 : 0; + 473 : 0; + 474 : 0; + 475 : 0; + 476 : 0; + 477 : 0; + 478 : 7; + 479 : 0; + 480 : 0; + 481 : 0; + 482 : 0; + 483 : 0; + 484 : 0; + 485 : 0; + 486 : 0; + 487 : 0; + 488 : 0; + 489 : 0; + 490 : 0; + 491 : 0; + 492 : 0; + 493 : 0; + 494 : 0; + 495 : 7; + 496 : 7; + 497 : 7; + 498 : 3; + 499 : 0; + 500 : 0; + 501 : 0; + 502 : 0; + 503 : 0; + 504 : 0; + 505 : 0; + 506 : 0; + 507 : 0; + 508 : 7; + 509 : 0; + 510 : 0; + 511 : 0; + 512 : 0; + 513 : 0; + 514 : 0; + 515 : 0; + 516 : 0; + 517 : 0; + 518 : 0; + 519 : 0; + 520 : 0; + 521 : 0; + 522 : 0; + 523 : 0; + 524 : 0; + 525 : 0; + 526 : 0; + 527 : 0; + 528 : 0; + 529 : 0; + 530 : 0; + 531 : 0; + 532 : 0; + 533 : 7; + 534 : 7; + 535 : 7; + 536 : 0; + 537 : 0; + 538 : 0; + 539 : 0; + 540 : 0; + 541 : 0; + 542 : 7; + 543 : 7; + 544 : 0; + 545 : 0; + 546 : 0; + 547 : 0; + 548 : 0; + 549 : 0; + 550 : 0; + 551 : 0; + 552 : 0; + 553 : 0; + 554 : 7; + 555 : 7; + 556 : 7; + 557 : 7; + 558 : 0; + 559 : 0; + 560 : 0; + 561 : 0; + 562 : 0; + 563 : 0; + 564 : 0; + 565 : 0; + 566 : 0; + 567 : 0; + 568 : 0; + 569 : 0; + 570 : 0; + 571 : 0; + 572 : 0; + 573 : 0; + 574 : 0; + 575 : 0; + 576 : 0; + 577 : 0; + 578 : 0; + 579 : 0; + 580 : 0; + 581 : 0; + 582 : 0; + 583 : 0; + 584 : 0; + 585 : 0; + 586 : 0; + 587 : 0; + 588 : 0; + 589 : 0; + 590 : 0; + 591 : 0; + 592 : 0; + 593 : 0; + 594 : 0; + 595 : 0; + 596 : 0; + 597 : 0; + 598 : 0; + 599 : 0; + 600 : 0; + 601 : 0; + 602 : 1; + 603 : 7; + 604 : 7; + 605 : 7; + 606 : 7; + 607 : 7; + 608 : 7; + 609 : 7; + 610 : 0; + 611 : 7; + 612 : 0; + 613 : 0; + 614 : 7; + 615 : 7; + 616 : 0; + 617 : 0; + 618 : 0; + 619 : 0; + 620 : 0; + 621 : 0; + 622 : 0; + 623 : 0; + 624 : 0; + 625 : 0; + 626 : 0; + 627 : 0; + 628 : 0; + 629 : 0; + 630 : 0; + 631 : 0; + 632 : 0; + 633 : 0; + 634 : 0; + 635 : 0; + 636 : 0; + 637 : 0; + 638 : 0; + 639 : 0; + 640 : 0; + 641 : 0; + 642 : 0; + 643 : 0; + 644 : 0; + 645 : 0; + 646 : 0; + 647 : 0; + 648 : 0; + 649 : 0; + 650 : 0; + 651 : 0; + 652 : 0; + 653 : 0; + 654 : 0; + 655 : 0; + 656 : 0; + 657 : 0; + 658 : 0; + 659 : 0; + 660 : 0; + 661 : 0; + 662 : 0; + 663 : 0; + 664 : 0; + 665 : 0; + 666 : 0; + 667 : 0; + 668 : 0; + 669 : 0; + 670 : 7; + 671 : 7; + 672 : 7; + 673 : 7; + 674 : 7; + 675 : 7; + 676 : 0; + 677 : 0; + 678 : 0; + 679 : 0; + 680 : 0; + 681 : 0; + 682 : 0; + 683 : 0; + 684 : 0; + 685 : 0; + 686 : 0; + 687 : 0; + 688 : 0; + 689 : 0; + 690 : 0; + 691 : 0; + 692 : 0; + 693 : 0; + 694 : 0; + 695 : 0; + 696 : 0; + 697 : 0; + 698 : 7; + 699 : 7; + 700 : 7; + 701 : 7; + 702 : 0; + 703 : 0; + 704 : 0; + 705 : 0; + 706 : 0; + 707 : 0; + 708 : 0; + 709 : 0; + 710 : 0; + 711 : 0; + 712 : 0; + 713 : 0; + 714 : 0; + 715 : 0; + 716 : 0; + 717 : 0; + 718 : 0; + 719 : 0; + 720 : 0; + 721 : 0; + 722 : 0; + 723 : 0; + 724 : 0; + 725 : 0; + 726 : 0; + 727 : 0; + 728 : 0; + 729 : 0; + 730 : 0; + 731 : 0; + 732 : 0; + 733 : 7; + 734 : 7; + 735 : 7; + 736 : 7; + 737 : 7; + 738 : 7; + 739 : 7; + 740 : 7; + 741 : 7; + 742 : 7; + 743 : 0; + 744 : 0; + 745 : 0; + 746 : 0; + 747 : 0; + 748 : 0; + 749 : 0; + 750 : 0; + 751 : 0; + 752 : 0; + 753 : 0; + 754 : 0; + 755 : 0; + 756 : 0; + 757 : 0; + 758 : 0; + 759 : 0; + 760 : 0; + 761 : 0; + 762 : 0; + 763 : 7; + 764 : 7; + 765 : 7; + 766 : 0; + 767 : 0; + 768 : 0; + 769 : 0; + 770 : 0; + 771 : 0; + 772 : 0; + 773 : 0; + 774 : 0; + 775 : 0; + 776 : 0; + 777 : 0; + 778 : 0; + 779 : 0; + 780 : 0; + 781 : 0; + 782 : 0; + 783 : 0; + 784 : 0; + 785 : 0; + 786 : 0; + 787 : 0; + 788 : 0; + 789 : 0; + 790 : 0; + 791 : 0; + 792 : 0; + 793 : 0; + 794 : 7; + 795 : 7; + 796 : 7; + 797 : 7; + 798 : 7; + 799 : 7; + 800 : 7; + 801 : 7; + 802 : 7; + 803 : 7; + 804 : 0; + 805 : 7; + 806 : 7; + 807 : 7; + 808 : 7; + 809 : 7; + 810 : 7; + 811 : 3; + 812 : 0; + 813 : 0; + 814 : 0; + 815 : 0; + 816 : 0; + 817 : 0; + 818 : 0; + 819 : 0; + 820 : 0; + 821 : 0; + 822 : 0; + 823 : 0; + 824 : 0; + 825 : 0; + 826 : 7; + 827 : 7; + 828 : 7; + 829 : 7; + 830 : 0; + 831 : 0; + 832 : 0; + 833 : 0; + 834 : 0; + 835 : 0; + 836 : 0; + 837 : 0; + 838 : 0; + 839 : 0; + 840 : 0; + 841 : 0; + 842 : 0; + 843 : 0; + 844 : 0; + 845 : 0; + 846 : 0; + 847 : 0; + 848 : 0; + 849 : 0; + 850 : 0; + 851 : 0; + 852 : 0; + 853 : 0; + 854 : 0; + 855 : 0; + 856 : 0; + 857 : 7; + 858 : 7; + 859 : 7; + 860 : 7; + 861 : 7; + 862 : 7; + 863 : 7; + 864 : 7; + 865 : 7; + 866 : 7; + 867 : 0; + 868 : 0; + 869 : 7; + 870 : 7; + 871 : 7; + 872 : 7; + 873 : 0; + 874 : 0; + 875 : 0; + 876 : 7; + 877 : 7; + 878 : 7; + 879 : 7; + 880 : 7; + 881 : 0; + 882 : 0; + 883 : 0; + 884 : 0; + 885 : 0; + 886 : 0; + 887 : 0; + 888 : 7; + 889 : 7; + 890 : 7; + 891 : 0; + 892 : 0; + 893 : 0; + 894 : 0; + 895 : 0; + 896 : 0; + 897 : 0; + 898 : 0; + 899 : 0; + 900 : 0; + 901 : 0; + 902 : 0; + 903 : 0; + 904 : 0; + 905 : 0; + 906 : 0; + 907 : 0; + 908 : 0; + 909 : 0; + 910 : 0; + 911 : 0; + 912 : 0; + 913 : 0; + 914 : 0; + 915 : 0; + 916 : 0; + 917 : 0; + 918 : 7; + 919 : 7; + 920 : 7; + 921 : 7; + 922 : 7; + 923 : 7; + 924 : 7; + 925 : 7; + 926 : 7; + 927 : 7; + 928 : 7; + 929 : 7; + 930 : 7; + 931 : 7; + 932 : 7; + 933 : 7; + 934 : 7; + 935 : 7; + 936 : 7; + 937 : 7; + 938 : 7; + 939 : 7; + 940 : 0; + 941 : 0; + 942 : 0; + 943 : 0; + 944 : 0; + 945 : 7; + 946 : 7; + 947 : 7; + 948 : 7; + 949 : 7; + 950 : 0; + 951 : 7; + 952 : 7; + 953 : 7; + 954 : 0; + 955 : 0; + 956 : 0; + 957 : 0; + 958 : 0; + 959 : 0; + 960 : 0; + 961 : 0; + 962 : 0; + 963 : 0; + 964 : 0; + 965 : 0; + 966 : 0; + 967 : 0; + 968 : 0; + 969 : 0; + 970 : 0; + 971 : 0; + 972 : 0; + 973 : 0; + 974 : 0; + 975 : 0; + 976 : 0; + 977 : 1; + 978 : 7; + 979 : 7; + 980 : 7; + 981 : 7; + 982 : 7; + 983 : 7; + 984 : 7; + 985 : 7; + 986 : 7; + 987 : 7; + 988 : 7; + 989 : 7; + 990 : 7; + 991 : 7; + 992 : 7; + 993 : 0; + 994 : 0; + 995 : 7; + 996 : 7; + 997 : 7; + 998 : 7; + 999 : 7; + 1000 : 7; + 1001 : 7; + 1002 : 7; + 1003 : 7; + 1004 : 7; + 1005 : 7; + 1006 : 7; + 1007 : 7; + 1008 : 7; + 1009 : 7; + 1010 : 7; + 1011 : 7; + 1012 : 7; + 1013 : 7; + 1014 : 7; + 1015 : 7; + 1016 : 7; + 1017 : 7; + 1018 : 0; + 1019 : 0; + 1020 : 0; + 1021 : 0; + 1022 : 0; + 1023 : 0; + 1024 : 0; + 1025 : 0; + 1026 : 0; + 1027 : 0; + 1028 : 0; + 1029 : 0; + 1030 : 0; + 1031 : 0; + 1032 : 0; + 1033 : 0; + 1034 : 0; + 1035 : 0; + 1036 : 0; + 1037 : 0; + 1038 : 0; + 1039 : 0; + 1040 : 0; + 1041 : 0; + 1042 : 7; + 1043 : 7; + 1044 : 7; + 1045 : 7; + 1046 : 7; + 1047 : 7; + 1048 : 7; + 1049 : 7; + 1050 : 7; + 1051 : 7; + 1052 : 7; + 1053 : 7; + 1054 : 7; + 1055 : 7; + 1056 : 7; + 1057 : 0; + 1058 : 0; + 1059 : 7; + 1060 : 7; + 1061 : 7; + 1062 : 7; + 1063 : 7; + 1064 : 7; + 1065 : 7; + 1066 : 7; + 1067 : 7; + 1068 : 7; + 1069 : 7; + 1070 : 7; + 1071 : 7; + 1072 : 7; + 1073 : 7; + 1074 : 7; + 1075 : 7; + 1076 : 7; + 1077 : 7; + 1078 : 7; + 1079 : 7; + 1080 : 7; + 1081 : 7; + 1082 : 7; + 1083 : 7; + 1084 : 0; + 1085 : 0; + 1086 : 0; + 1087 : 0; + 1088 : 0; + 1089 : 0; + 1090 : 0; + 1091 : 0; + 1092 : 0; + 1093 : 0; + 1094 : 0; + 1095 : 0; + 1096 : 0; + 1097 : 0; + 1098 : 0; + 1099 : 0; + 1100 : 0; + 1101 : 0; + 1102 : 0; + 1103 : 0; + 1104 : 0; + 1105 : 0; + 1106 : 0; + 1107 : 0; + 1108 : 7; + 1109 : 7; + 1110 : 7; + 1111 : 7; + 1112 : 7; + 1113 : 7; + 1114 : 7; + 1115 : 7; + 1116 : 7; + 1117 : 7; + 1118 : 7; + 1119 : 7; + 1120 : 7; + 1121 : 7; + 1122 : 7; + 1123 : 7; + 1124 : 7; + 1125 : 7; + 1126 : 7; + 1127 : 7; + 1128 : 7; + 1129 : 7; + 1130 : 7; + 1131 : 7; + 1132 : 7; + 1133 : 7; + 1134 : 7; + 1135 : 7; + 1136 : 7; + 1137 : 7; + 1138 : 7; + 1139 : 7; + 1140 : 7; + 1141 : 7; + 1142 : 7; + 1143 : 7; + 1144 : 0; + 1145 : 0; + 1146 : 0; + 1147 : 0; + 1148 : 0; + 1149 : 0; + 1150 : 0; + 1151 : 0; + 1152 : 0; + 1153 : 0; + 1154 : 0; + 1155 : 0; + 1156 : 0; + 1157 : 0; + 1158 : 0; + 1159 : 0; + 1160 : 0; + 1161 : 0; + 1162 : 0; + 1163 : 0; + 1164 : 0; + 1165 : 0; + 1166 : 0; + 1167 : 0; + 1168 : 0; + 1169 : 0; + 1170 : 0; + 1171 : 0; + 1172 : 0; + 1173 : 7; + 1174 : 0; + 1175 : 7; + 1176 : 7; + 1177 : 7; + 1178 : 7; + 1179 : 7; + 1180 : 7; + 1181 : 7; + 1182 : 7; + 1183 : 7; + 1184 : 7; + 1185 : 7; + 1186 : 7; + 1187 : 7; + 1188 : 7; + 1189 : 7; + 1190 : 7; + 1191 : 7; + 1192 : 7; + 1193 : 7; + 1194 : 7; + 1195 : 7; + 1196 : 7; + 1197 : 7; + 1198 : 7; + 1199 : 7; + 1200 : 7; + 1201 : 7; + 1202 : 0; + 1203 : 0; + 1204 : 0; + 1205 : 0; + 1206 : 0; + 1207 : 0; + 1208 : 0; + 1209 : 0; + 1210 : 0; + 1211 : 0; + 1212 : 0; + 1213 : 0; + 1214 : 0; + 1215 : 0; + 1216 : 0; + 1217 : 0; + 1218 : 0; + 1219 : 0; + 1220 : 0; + 1221 : 0; + 1222 : 0; + 1223 : 0; + 1224 : 0; + 1225 : 0; + 1226 : 0; + 1227 : 0; + 1228 : 0; + 1229 : 0; + 1230 : 7; + 1231 : 7; + 1232 : 0; + 1233 : 0; + 1234 : 0; + 1235 : 0; + 1236 : 0; + 1237 : 0; + 1238 : 0; + 1239 : 0; + 1240 : 7; + 1241 : 7; + 1242 : 7; + 1243 : 7; + 1244 : 7; + 1245 : 0; + 1246 : 0; + 1247 : 0; + 1248 : 0; + 1249 : 7; + 1250 : 0; + 1251 : 0; + 1252 : 0; + 1253 : 0; + 1254 : 7; + 1255 : 7; + 1256 : 0; + 1257 : 0; + 1258 : 7; + 1259 : 7; + 1260 : 7; + 1261 : 7; + 1262 : 7; + 1263 : 7; + 1264 : 0; + 1265 : 0; + 1266 : 0; + 1267 : 0; + 1268 : 0; + 1269 : 0; + 1270 : 0; + 1271 : 0; + 1272 : 0; + 1273 : 0; + 1274 : 0; + 1275 : 0; + 1276 : 0; + 1277 : 0; + 1278 : 0; + 1279 : 0; + 1280 : 0; + 1281 : 0; + 1282 : 0; + 1283 : 0; + 1284 : 0; + 1285 : 0; + 1286 : 0; + 1287 : 0; + 1288 : 0; + 1289 : 0; + 1290 : 0; + 1291 : 0; + 1292 : 0; + 1293 : 7; + 1294 : 7; + 1295 : 7; + 1296 : 7; + 1297 : 0; + 1298 : 0; + 1299 : 0; + 1300 : 0; + 1301 : 0; + 1302 : 0; + 1303 : 7; + 1304 : 7; + 1305 : 7; + 1306 : 7; + 1307 : 7; + 1308 : 7; + 1309 : 0; + 1310 : 0; + 1311 : 0; + 1312 : 0; + 1313 : 7; + 1314 : 0; + 1315 : 0; + 1316 : 0; + 1317 : 0; + 1318 : 7; + 1319 : 7; + 1320 : 0; + 1321 : 0; + 1322 : 7; + 1323 : 7; + 1324 : 7; + 1325 : 7; + 1326 : 7; + 1327 : 0; + 1328 : 0; + 1329 : 0; + 1330 : 0; + 1331 : 0; + 1332 : 0; + 1333 : 0; + 1334 : 0; + 1335 : 0; + 1336 : 0; + 1337 : 0; + 1338 : 0; + 1339 : 0; + 1340 : 0; + 1341 : 0; + 1342 : 0; + 1343 : 0; + 1344 : 0; + 1345 : 0; + 1346 : 0; + 1347 : 0; + 1348 : 0; + 1349 : 0; + 1350 : 0; + 1351 : 0; + 1352 : 0; + 1353 : 0; + 1354 : 0; + 1355 : 0; + 1356 : 0; + 1357 : 7; + 1358 : 7; + 1359 : 7; + 1360 : 7; + 1361 : 7; + 1362 : 7; + 1363 : 7; + 1364 : 7; + 1365 : 7; + 1366 : 7; + 1367 : 7; + 1368 : 7; + 1369 : 7; + 1370 : 7; + 1371 : 7; + 1372 : 7; + 1373 : 0; + 1374 : 7; + 1375 : 0; + 1376 : 0; + 1377 : 7; + 1378 : 0; + 1379 : 7; + 1380 : 0; + 1381 : 0; + 1382 : 7; + 1383 : 7; + 1384 : 0; + 1385 : 7; + 1386 : 7; + 1387 : 7; + 1388 : 7; + 1389 : 0; + 1390 : 0; + 1391 : 0; + 1392 : 0; + 1393 : 0; + 1394 : 0; + 1395 : 0; + 1396 : 0; + 1397 : 0; + 1398 : 0; + 1399 : 0; + 1400 : 0; + 1401 : 0; + 1402 : 0; + 1403 : 0; + 1404 : 0; + 1405 : 0; + 1406 : 0; + 1407 : 0; + 1408 : 0; + 1409 : 0; + 1410 : 0; + 1411 : 0; + 1412 : 0; + 1413 : 0; + 1414 : 0; + 1415 : 0; + 1416 : 0; + 1417 : 0; + 1418 : 0; + 1419 : 0; + 1420 : 0; + 1421 : 7; + 1422 : 7; + 1423 : 7; + 1424 : 7; + 1425 : 7; + 1426 : 7; + 1427 : 7; + 1428 : 7; + 1429 : 7; + 1430 : 7; + 1431 : 7; + 1432 : 7; + 1433 : 7; + 1434 : 7; + 1435 : 7; + 1436 : 7; + 1437 : 7; + 1438 : 7; + 1439 : 7; + 1440 : 7; + 1441 : 7; + 1442 : 7; + 1443 : 7; + 1444 : 7; + 1445 : 7; + 1446 : 7; + 1447 : 7; + 1448 : 7; + 1449 : 7; + 1450 : 7; + 1451 : 7; + 1452 : 0; + 1453 : 0; + 1454 : 0; + 1455 : 0; + 1456 : 0; + 1457 : 0; + 1458 : 0; + 1459 : 0; + 1460 : 0; + 1461 : 0; + 1462 : 0; + 1463 : 0; + 1464 : 0; + 1465 : 0; + 1466 : 0; + 1467 : 0; + 1468 : 0; + 1469 : 0; + 1470 : 0; + 1471 : 0; + 1472 : 0; + 1473 : 0; + 1474 : 0; + 1475 : 0; + 1476 : 0; + 1477 : 0; + 1478 : 0; + 1479 : 0; + 1480 : 0; + 1481 : 0; + 1482 : 0; + 1483 : 0; + 1484 : 0; + 1485 : 0; + 1486 : 0; + 1487 : 7; + 1488 : 7; + 1489 : 7; + 1490 : 7; + 1491 : 7; + 1492 : 7; + 1493 : 7; + 1494 : 7; + 1495 : 7; + 1496 : 7; + 1497 : 7; + 1498 : 7; + 1499 : 7; + 1500 : 7; + 1501 : 7; + 1502 : 7; + 1503 : 7; + 1504 : 7; + 1505 : 7; + 1506 : 7; + 1507 : 7; + 1508 : 7; + 1509 : 7; + 1510 : 7; + 1511 : 7; + 1512 : 7; + 1513 : 7; + 1514 : 7; + 1515 : 7; + 1516 : 0; + 1517 : 0; + 1518 : 0; + 1519 : 0; + 1520 : 0; + 1521 : 0; + 1522 : 0; + 1523 : 0; + 1524 : 0; + 1525 : 0; + 1526 : 0; + 1527 : 0; + 1528 : 0; + 1529 : 0; + 1530 : 0; + 1531 : 0; + 1532 : 0; + 1533 : 0; + 1534 : 0; + 1535 : 0; + 1536 : 0; + 1537 : 0; + 1538 : 0; + 1539 : 0; + 1540 : 0; + 1541 : 0; + 1542 : 0; + 1543 : 0; + 1544 : 0; + 1545 : 0; + 1546 : 0; + 1547 : 0; + 1548 : 0; + 1549 : 0; + 1550 : 0; + 1551 : 0; + 1552 : 0; + 1553 : 0; + 1554 : 0; + 1555 : 7; + 1556 : 7; + 1557 : 7; + 1558 : 7; + 1559 : 7; + 1560 : 7; + 1561 : 7; + 1562 : 7; + 1563 : 7; + 1564 : 7; + 1565 : 7; + 1566 : 7; + 1567 : 7; + 1568 : 7; + 1569 : 7; + 1570 : 0; + 1571 : 0; + 1572 : 7; + 1573 : 7; + 1574 : 7; + 1575 : 7; + 1576 : 7; + 1577 : 7; + 1578 : 7; + 1579 : 7; + 1580 : 7; + 1581 : 0; + 1582 : 0; + 1583 : 0; + 1584 : 0; + 1585 : 0; + 1586 : 0; + 1587 : 0; + 1588 : 0; + 1589 : 0; + 1590 : 0; + 1591 : 0; + 1592 : 0; + 1593 : 0; + 1594 : 0; + 1595 : 0; + 1596 : 0; + 1597 : 0; + 1598 : 0; + 1599 : 0; + 1600 : 0; + 1601 : 0; + 1602 : 0; + 1603 : 0; + 1604 : 0; + 1605 : 0; + 1606 : 0; + 1607 : 0; + 1608 : 0; + 1609 : 0; + 1610 : 0; + 1611 : 0; + 1612 : 0; + 1613 : 0; + 1614 : 0; + 1615 : 0; + 1616 : 0; + 1617 : 0; + 1618 : 0; + 1619 : 0; + 1620 : 0; + 1621 : 0; + 1622 : 0; + 1623 : 0; + 1624 : 0; + 1625 : 0; + 1626 : 0; + 1627 : 0; + 1628 : 0; + 1629 : 0; + 1630 : 0; + 1631 : 0; + 1632 : 0; + 1633 : 0; + 1634 : 0; + 1635 : 0; + 1636 : 0; + 1637 : 0; + 1638 : 0; + 1639 : 0; + 1640 : 7; + 1641 : 7; + 1642 : 0; + 1643 : 0; + 1644 : 0; + 1645 : 0; + 1646 : 0; + 1647 : 0; + 1648 : 0; + 1649 : 0; + 1650 : 0; + 1651 : 0; + 1652 : 0; + 1653 : 0; + 1654 : 0; + 1655 : 0; + 1656 : 0; + 1657 : 0; + 1658 : 0; + 1659 : 0; + 1660 : 0; + 1661 : 0; + 1662 : 0; + 1663 : 0; + [1664..1999] : 0; +END; \ No newline at end of file diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_helicopter.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_helicopter.v new file mode 100644 index 00000000..6a83462b --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_helicopter.v @@ -0,0 +1,161 @@ +// megafunction wizard: %ROM: 1-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: sprite_helicopter.v +// Megafunction Name(s): +// altsyncram +// +// 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 sprite_helicopter ( + address, + clock, + q); + + input [10:0] address; + input clock; + output [3:0] q; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [3:0] sub_wire0; + wire [3:0] q = sub_wire0[3:0]; + + altsyncram altsyncram_component ( + .address_a (address), + .clock0 (clock), + .q_a (sub_wire0), + .aclr0 (1'b0), + .aclr1 (1'b0), + .address_b (1'b1), + .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_a ({4{1'b1}}), + .data_b (1'b1), + .eccstatus (), + .q_b (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_a (1'b0), + .wren_b (1'b0)); + defparam + altsyncram_component.address_aclr_a = "NONE", + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", + altsyncram_component.init_file = "sprite_helicopter.mif", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 2000, + altsyncram_component.operation_mode = "ROM", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_reg_a = "CLOCK0", + altsyncram_component.ram_block_type = "M9K", + altsyncram_component.widthad_a = 11, + altsyncram_component.width_a = 4, + altsyncram_component.width_byteena_a = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +// Retrieval info: PRIVATE: AclrByte NUMERIC "0" +// Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: Clken NUMERIC "0" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "sprite_helicopter.mif" +// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "2000" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "2" +// Retrieval info: PRIVATE: RegAddr NUMERIC "1" +// Retrieval info: PRIVATE: RegOutput NUMERIC "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: SingleClock NUMERIC "1" +// Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +// Retrieval info: PRIVATE: WidthAddr NUMERIC "11" +// Retrieval info: PRIVATE: WidthData NUMERIC "4" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: INIT_FILE STRING "sprite_helicopter.mif" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "2000" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +// Retrieval info: CONSTANT: RAM_BLOCK_TYPE STRING "M9K" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "11" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "4" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: USED_PORT: address 0 0 11 0 INPUT NODEFVAL "address[10..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: q 0 0 4 0 OUTPUT NODEFVAL "q[3..0]" +// Retrieval info: CONNECT: @address_a 0 0 11 0 address 0 0 11 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: q 0 0 4 0 @q_a 0 0 4 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_helicopter.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_helicopter.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_helicopter.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_helicopter.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_helicopter_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_helicopter_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_plane.mif b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_plane.mif new file mode 100644 index 00000000..e397a81c --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_plane.mif @@ -0,0 +1,3978 @@ +WIDTH=4; +DEPTH=4000; + +ADDRESS_RADIX=UNS; +DATA_RADIX=HEX; + +CONTENT BEGIN + + 0 : 0; + 1 : 0; + 2 : 0; + 3 : 0; + 4 : 0; + 5 : 0; + 6 : 0; + 7 : 0; + 8 : 0; + 9 : 0; + 10 : 0; + 11 : 0; + 12 : 0; + 13 : 0; + 14 : 0; + 15 : 0; + 16 : 0; + 17 : 0; + 18 : 0; + 19 : 0; + 20 : 0; + 21 : 0; + 22 : 0; + 23 : 0; + 24 : 0; + 25 : 0; + 26 : 0; + 27 : 0; + 28 : 0; + 29 : 0; + 30 : 0; + 31 : 0; + 32 : 0; + 33 : 0; + 34 : 0; + 35 : 0; + 36 : 0; + 37 : 0; + 38 : 0; + 39 : 0; + 40 : 0; + 41 : 0; + 42 : 0; + 43 : 0; + 44 : 0; + 45 : 0; + 46 : 0; + 47 : 0; + 48 : 0; + 49 : 0; + 50 : 0; + 51 : 0; + 52 : 0; + 53 : 0; + 54 : 0; + 55 : 0; + 56 : 0; + 57 : 0; + 58 : 0; + 59 : 0; + 60 : 0; + 61 : 0; + 62 : 0; + 63 : 0; + 64 : 0; + 65 : 0; + 66 : 0; + 67 : 0; + 68 : 0; + 69 : 0; + 70 : 0; + 71 : 0; + 72 : 0; + 73 : 0; + 74 : 0; + 75 : 0; + 76 : 0; + 77 : 0; + 78 : 0; + 79 : 0; + 80 : 0; + 81 : 0; + 82 : 0; + 83 : 0; + 84 : 0; + 85 : 0; + 86 : 0; + 87 : 0; + 88 : 0; + 89 : 0; + 90 : 0; + 91 : 0; + 92 : 0; + 93 : 0; + 94 : 0; + 95 : 0; + 96 : 0; + 97 : 0; + 98 : 0; + 99 : 0; + 100 : 0; + 101 : 0; + 102 : 0; + 103 : 0; + 104 : 0; + 105 : 7; + 106 : 7; + 107 : 0; + 108 : 0; + 109 : 0; + 110 : 0; + 111 : 0; + 112 : 0; + 113 : 0; + 114 : 0; + 115 : 0; + 116 : 0; + 117 : 0; + 118 : 0; + 119 : 0; + 120 : 0; + 121 : 0; + 122 : 0; + 123 : 0; + 124 : 0; + 125 : 0; + 126 : 0; + 127 : 0; + 128 : 0; + 129 : 0; + 130 : 0; + 131 : 0; + 132 : 0; + 133 : 0; + 134 : 0; + 135 : 0; + 136 : 0; + 137 : 0; + 138 : 0; + 139 : 0; + 140 : 0; + 141 : 0; + 142 : 0; + 143 : 0; + 144 : 0; + 145 : 0; + 146 : 0; + 147 : 0; + 148 : 0; + 149 : 0; + 150 : 0; + 151 : 0; + 152 : 0; + 153 : 0; + 154 : 0; + 155 : 0; + 156 : 0; + 157 : 0; + 158 : 0; + 159 : 0; + 160 : 0; + 161 : 0; + 162 : 0; + 163 : 0; + 164 : 0; + 165 : 0; + 166 : 0; + 167 : 0; + 168 : 0; + 169 : 0; + 170 : 0; + 171 : 0; + 172 : 0; + 173 : 0; + 174 : 0; + 175 : 0; + 176 : 0; + 177 : 0; + 178 : 0; + 179 : 0; + 180 : 0; + 181 : 0; + 182 : 0; + 183 : 0; + 184 : 0; + 185 : 0; + 186 : 0; + 187 : 0; + 188 : 0; + 189 : 0; + 190 : 0; + 191 : 0; + 192 : 0; + 193 : 0; + 194 : 0; + 195 : 0; + 196 : 0; + 197 : 0; + 198 : 0; + 199 : 0; + 200 : 0; + 201 : 0; + 202 : 0; + 203 : 0; + 204 : 0; + 205 : 0; + 206 : 0; + 207 : 0; + 208 : 0; + 209 : 0; + 210 : 0; + 211 : 0; + 212 : 0; + 213 : 0; + 214 : 0; + 215 : 0; + 216 : 0; + 217 : 0; + 218 : 0; + 219 : 0; + 220 : 0; + 221 : 0; + 222 : 0; + 223 : 0; + 224 : 0; + 225 : 0; + 226 : 0; + 227 : 0; + 228 : 0; + 229 : 0; + 230 : 0; + 231 : 0; + 232 : 7; + 233 : 7; + 234 : 7; + 235 : 7; + 236 : 7; + 237 : 0; + 238 : 0; + 239 : 0; + 240 : 0; + 241 : 0; + 242 : 0; + 243 : 0; + 244 : 0; + 245 : 0; + 246 : 0; + 247 : 0; + 248 : 0; + 249 : 0; + 250 : 0; + 251 : 0; + 252 : 0; + 253 : 0; + 254 : 0; + 255 : 0; + 256 : 0; + 257 : 0; + 258 : 0; + 259 : 0; + 260 : 0; + 261 : 0; + 262 : 0; + 263 : 0; + 264 : 0; + 265 : 0; + 266 : 0; + 267 : 0; + 268 : 0; + 269 : 0; + 270 : 0; + 271 : 0; + 272 : 0; + 273 : 0; + 274 : 0; + 275 : 0; + 276 : 0; + 277 : 0; + 278 : 0; + 279 : 0; + 280 : 0; + 281 : 0; + 282 : 0; + 283 : 0; + 284 : 0; + 285 : 0; + 286 : 0; + 287 : 0; + 288 : 0; + 289 : 0; + 290 : 0; + 291 : 0; + 292 : 0; + 293 : 0; + 294 : 0; + 295 : 0; + 296 : 0; + 297 : 0; + 298 : 0; + 299 : 0; + 300 : 0; + 301 : 0; + 302 : 0; + 303 : 0; + 304 : 0; + 305 : 0; + 306 : 0; + 307 : 0; + 308 : 0; + 309 : 0; + 310 : 0; + 311 : 0; + 312 : 0; + 313 : 0; + 314 : 0; + 315 : 0; + 316 : 0; + 317 : 0; + 318 : 0; + 319 : 0; + 320 : 0; + 321 : 0; + 322 : 0; + 323 : 0; + 324 : 0; + 325 : 0; + 326 : 0; + 327 : 0; + 328 : 0; + 329 : 0; + 330 : 0; + 331 : 0; + 332 : 0; + 333 : 0; + 334 : 0; + 335 : 0; + 336 : 0; + 337 : 0; + 338 : 0; + 339 : 0; + 340 : 0; + 341 : 0; + 342 : 0; + 343 : 0; + 344 : 0; + 345 : 0; + 346 : 0; + 347 : 0; + 348 : 0; + 349 : 0; + 350 : 0; + 351 : 0; + 352 : 0; + 353 : 0; + 354 : 0; + 355 : 0; + 356 : 0; + 357 : 0; + 358 : 0; + 359 : 0; + 360 : 7; + 361 : 7; + 362 : 7; + 363 : 7; + 364 : 7; + 365 : 7; + 366 : 0; + 367 : 0; + 368 : 0; + 369 : 0; + 370 : 0; + 371 : 0; + 372 : 0; + 373 : 0; + 374 : 0; + 375 : 0; + 376 : 0; + 377 : 0; + 378 : 0; + 379 : 0; + 380 : 0; + 381 : 0; + 382 : 0; + 383 : 0; + 384 : 0; + 385 : 0; + 386 : 0; + 387 : 0; + 388 : 0; + 389 : 0; + 390 : 0; + 391 : 0; + 392 : 0; + 393 : 0; + 394 : 0; + 395 : 0; + 396 : 0; + 397 : 0; + 398 : 0; + 399 : 0; + 400 : 0; + 401 : 0; + 402 : 0; + 403 : 0; + 404 : 0; + 405 : 0; + 406 : 0; + 407 : 0; + 408 : 0; + 409 : 0; + 410 : 0; + 411 : 0; + 412 : 0; + 413 : 0; + 414 : 0; + 415 : 0; + 416 : 0; + 417 : 0; + 418 : 0; + 419 : 0; + 420 : 0; + 421 : 0; + 422 : 0; + 423 : 0; + 424 : 0; + 425 : 0; + 426 : 0; + 427 : 0; + 428 : 0; + 429 : 0; + 430 : 0; + 431 : 0; + 432 : 0; + 433 : 0; + 434 : 0; + 435 : 0; + 436 : 0; + 437 : 0; + 438 : 0; + 439 : 0; + 440 : 0; + 441 : 0; + 442 : 0; + 443 : 0; + 444 : 0; + 445 : 0; + 446 : 0; + 447 : 0; + 448 : 0; + 449 : 0; + 450 : 0; + 451 : 0; + 452 : 0; + 453 : 0; + 454 : 0; + 455 : 0; + 456 : 0; + 457 : 0; + 458 : 0; + 459 : 0; + 460 : 0; + 461 : 0; + 462 : 0; + 463 : 0; + 464 : 0; + 465 : 0; + 466 : 0; + 467 : 0; + 468 : 0; + 469 : 0; + 470 : 0; + 471 : 0; + 472 : 0; + 473 : 0; + 474 : 0; + 475 : 0; + 476 : 0; + 477 : 0; + 478 : 0; + 479 : 0; + 480 : 0; + 481 : 0; + 482 : 0; + 483 : 0; + 484 : 0; + 485 : 0; + 486 : 0; + 487 : 7; + 488 : 7; + 489 : 7; + 490 : 7; + 491 : 7; + 492 : 7; + 493 : 7; + 494 : 0; + 495 : 0; + 496 : 0; + 497 : 0; + 498 : 0; + 499 : 0; + 500 : 0; + 501 : 0; + 502 : 0; + 503 : 0; + 504 : 0; + 505 : 0; + 506 : 0; + 507 : 0; + 508 : 0; + 509 : 0; + 510 : 0; + 511 : 0; + 512 : 0; + 513 : 0; + 514 : 0; + 515 : 0; + 516 : 0; + 517 : 0; + 518 : 0; + 519 : 0; + 520 : 0; + 521 : 0; + 522 : 0; + 523 : 0; + 524 : 0; + 525 : 0; + 526 : 0; + 527 : 0; + 528 : 0; + 529 : 0; + 530 : 0; + 531 : 0; + 532 : 0; + 533 : 0; + 534 : 0; + 535 : 0; + 536 : 0; + 537 : 0; + 538 : 0; + 539 : 0; + 540 : 0; + 541 : 0; + 542 : 0; + 543 : 0; + 544 : 0; + 545 : 0; + 546 : 0; + 547 : 0; + 548 : 0; + 549 : 0; + 550 : 0; + 551 : 0; + 552 : 0; + 553 : 0; + 554 : 0; + 555 : 0; + 556 : 0; + 557 : 0; + 558 : 0; + 559 : 0; + 560 : 0; + 561 : 0; + 562 : 0; + 563 : 0; + 564 : 0; + 565 : 0; + 566 : 0; + 567 : 0; + 568 : 0; + 569 : 0; + 570 : 0; + 571 : 0; + 572 : 0; + 573 : 0; + 574 : 0; + 575 : 0; + 576 : 0; + 577 : 0; + 578 : 0; + 579 : 0; + 580 : 0; + 581 : 0; + 582 : 0; + 583 : 0; + 584 : 0; + 585 : 0; + 586 : 0; + 587 : 0; + 588 : 0; + 589 : 0; + 590 : 0; + 591 : 0; + 592 : 0; + 593 : 0; + 594 : 0; + 595 : 0; + 596 : 0; + 597 : 0; + 598 : 0; + 599 : 0; + 600 : 0; + 601 : 0; + 602 : 0; + 603 : 0; + 604 : 0; + 605 : 0; + 606 : 0; + 607 : 0; + 608 : 0; + 609 : 0; + 610 : 0; + 611 : 0; + 612 : 0; + 613 : 0; + 614 : 7; + 615 : 7; + 616 : 7; + 617 : 7; + 618 : 7; + 619 : 7; + 620 : 7; + 621 : 7; + 622 : 0; + 623 : 0; + 624 : 0; + 625 : 0; + 626 : 0; + 627 : 0; + 628 : 0; + 629 : 0; + 630 : 0; + 631 : 0; + 632 : 0; + 633 : 0; + 634 : 0; + 635 : 0; + 636 : 0; + 637 : 0; + 638 : 0; + 639 : 0; + 640 : 0; + 641 : 0; + 642 : 0; + 643 : 0; + 644 : 0; + 645 : 0; + 646 : 0; + 647 : 0; + 648 : 0; + 649 : 0; + 650 : 0; + 651 : 0; + 652 : 0; + 653 : 0; + 654 : 0; + 655 : 0; + 656 : 0; + 657 : 0; + 658 : 0; + 659 : 0; + 660 : 0; + 661 : 0; + 662 : 0; + 663 : 0; + 664 : 0; + 665 : 0; + 666 : 0; + 667 : 0; + 668 : 0; + 669 : 0; + 670 : 0; + 671 : 0; + 672 : 0; + 673 : 0; + 674 : 0; + 675 : 0; + 676 : 0; + 677 : 0; + 678 : 0; + 679 : 0; + 680 : 0; + 681 : 0; + 682 : 0; + 683 : 0; + 684 : 0; + 685 : 0; + 686 : 0; + 687 : 0; + 688 : 0; + 689 : 0; + 690 : 0; + 691 : 0; + 692 : 0; + 693 : 0; + 694 : 0; + 695 : 0; + 696 : 0; + 697 : 0; + 698 : 0; + 699 : 0; + 700 : 0; + 701 : 0; + 702 : 0; + 703 : 0; + 704 : 0; + 705 : 0; + 706 : 0; + 707 : 0; + 708 : 0; + 709 : 0; + 710 : 0; + 711 : 0; + 712 : 0; + 713 : 0; + 714 : 0; + 715 : 0; + 716 : 0; + 717 : 0; + 718 : 0; + 719 : 0; + 720 : 0; + 721 : 0; + 722 : 0; + 723 : 0; + 724 : 0; + 725 : 0; + 726 : 0; + 727 : 0; + 728 : 0; + 729 : 0; + 730 : 0; + 731 : 0; + 732 : 0; + 733 : 0; + 734 : 0; + 735 : 0; + 736 : 0; + 737 : 0; + 738 : 0; + 739 : 0; + 740 : 0; + 741 : 0; + 742 : 7; + 743 : 7; + 744 : 7; + 745 : 7; + 746 : 7; + 747 : 7; + 748 : 7; + 749 : 7; + 750 : 0; + 751 : 0; + 752 : 0; + 753 : 0; + 754 : 0; + 755 : 0; + 756 : 0; + 757 : 0; + 758 : 0; + 759 : 0; + 760 : 0; + 761 : 0; + 762 : 0; + 763 : 0; + 764 : 0; + 765 : 0; + 766 : 0; + 767 : 0; + 768 : 0; + 769 : 0; + 770 : 0; + 771 : 0; + 772 : 0; + 773 : 0; + 774 : 0; + 775 : 0; + 776 : 0; + 777 : 0; + 778 : 0; + 779 : 0; + 780 : 0; + 781 : 0; + 782 : 0; + 783 : 0; + 784 : 0; + 785 : 0; + 786 : 0; + 787 : 0; + 788 : 0; + 789 : 0; + 790 : 0; + 791 : 0; + 792 : 0; + 793 : 0; + 794 : 0; + 795 : 0; + 796 : 0; + 797 : 0; + 798 : 0; + 799 : 0; + 800 : 0; + 801 : 0; + 802 : 0; + 803 : 0; + 804 : 0; + 805 : 0; + 806 : 0; + 807 : 0; + 808 : 0; + 809 : 0; + 810 : 0; + 811 : 0; + 812 : 0; + 813 : 0; + 814 : 0; + 815 : 0; + 816 : 0; + 817 : 0; + 818 : 0; + 819 : 0; + 820 : 0; + 821 : 0; + 822 : 0; + 823 : 0; + 824 : 0; + 825 : 0; + 826 : 0; + 827 : 0; + 828 : 0; + 829 : 0; + 830 : 0; + 831 : 0; + 832 : 0; + 833 : 0; + 834 : 0; + 835 : 0; + 836 : 0; + 837 : 0; + 838 : 0; + 839 : 0; + 840 : 0; + 841 : 0; + 842 : 0; + 843 : 0; + 844 : 0; + 845 : 0; + 846 : 0; + 847 : 0; + 848 : 0; + 849 : 0; + 850 : 0; + 851 : 0; + 852 : 0; + 853 : 0; + 854 : 0; + 855 : 0; + 856 : 0; + 857 : 0; + 858 : 0; + 859 : 0; + 860 : 0; + 861 : 0; + 862 : 0; + 863 : 0; + 864 : 0; + 865 : 0; + 866 : 0; + 867 : 0; + 868 : 0; + 869 : 7; + 870 : 7; + 871 : 7; + 872 : 7; + 873 : 7; + 874 : 7; + 875 : 7; + 876 : 7; + 877 : 7; + 878 : 0; + 879 : 0; + 880 : 0; + 881 : 0; + 882 : 0; + 883 : 0; + 884 : 0; + 885 : 0; + 886 : 0; + 887 : 0; + 888 : 0; + 889 : 0; + 890 : 0; + 891 : 0; + 892 : 0; + 893 : 0; + 894 : 0; + 895 : 0; + 896 : 0; + 897 : 0; + 898 : 0; + 899 : 0; + 900 : 0; + 901 : 0; + 902 : 0; + 903 : 0; + 904 : 0; + 905 : 0; + 906 : 0; + 907 : 0; + 908 : 0; + 909 : 0; + 910 : 0; + 911 : 0; + 912 : 0; + 913 : 0; + 914 : 0; + 915 : 0; + 916 : 0; + 917 : 0; + 918 : 0; + 919 : 0; + 920 : 0; + 921 : 0; + 922 : 0; + 923 : 0; + 924 : 0; + 925 : 0; + 926 : 0; + 927 : 0; + 928 : 0; + 929 : 0; + 930 : 0; + 931 : 0; + 932 : 0; + 933 : 0; + 934 : 0; + 935 : 0; + 936 : 0; + 937 : 0; + 938 : 0; + 939 : 0; + 940 : 0; + 941 : 0; + 942 : 0; + 943 : 0; + 944 : 0; + 945 : 0; + 946 : 0; + 947 : 0; + 948 : 0; + 949 : 0; + 950 : 0; + 951 : 0; + 952 : 0; + 953 : 0; + 954 : 0; + 955 : 0; + 956 : 0; + 957 : 0; + 958 : 0; + 959 : 0; + 960 : 0; + 961 : 0; + 962 : 0; + 963 : 0; + 964 : 0; + 965 : 0; + 966 : 0; + 967 : 0; + 968 : 0; + 969 : 0; + 970 : 0; + 971 : 0; + 972 : 0; + 973 : 0; + 974 : 0; + 975 : 0; + 976 : 0; + 977 : 0; + 978 : 0; + 979 : 0; + 980 : 0; + 981 : 0; + 982 : 0; + 983 : 0; + 984 : 0; + 985 : 0; + 986 : 0; + 987 : 0; + 988 : 0; + 989 : 0; + 990 : 0; + 991 : 0; + 992 : 0; + 993 : 0; + 994 : 0; + 995 : 0; + 996 : 7; + 997 : 7; + 998 : 7; + 999 : 7; + 1000 : 7; + 1001 : 7; + 1002 : 7; + 1003 : 7; + 1004 : 7; + 1005 : 0; + 1006 : 0; + 1007 : 0; + 1008 : 0; + 1009 : 0; + 1010 : 0; + 1011 : 0; + 1012 : 0; + 1013 : 0; + 1014 : 0; + 1015 : 0; + 1016 : 0; + 1017 : 0; + 1018 : 0; + 1019 : 0; + 1020 : 0; + 1021 : 0; + 1022 : 0; + 1023 : 0; + 1024 : 0; + 1025 : 0; + 1026 : 0; + 1027 : 0; + 1028 : 0; + 1029 : 0; + 1030 : 0; + 1031 : 0; + 1032 : 0; + 1033 : 0; + 1034 : 0; + 1035 : 0; + 1036 : 0; + 1037 : 0; + 1038 : 0; + 1039 : 0; + 1040 : 0; + 1041 : 0; + 1042 : 0; + 1043 : 0; + 1044 : 0; + 1045 : 0; + 1046 : 0; + 1047 : 0; + 1048 : 0; + 1049 : 0; + 1050 : 0; + 1051 : 0; + 1052 : 0; + 1053 : 0; + 1054 : 0; + 1055 : 0; + 1056 : 0; + 1057 : 0; + 1058 : 0; + 1059 : 0; + 1060 : 0; + 1061 : 0; + 1062 : 0; + 1063 : 0; + 1064 : 0; + 1065 : 0; + 1066 : 0; + 1067 : 0; + 1068 : 0; + 1069 : 0; + 1070 : 0; + 1071 : 0; + 1072 : 0; + 1073 : 0; + 1074 : 0; + 1075 : 0; + 1076 : 0; + 1077 : 0; + 1078 : 0; + 1079 : 0; + 1080 : 0; + 1081 : 0; + 1082 : 0; + 1083 : 0; + 1084 : 0; + 1085 : 0; + 1086 : 0; + 1087 : 0; + 1088 : 0; + 1089 : 0; + 1090 : 0; + 1091 : 0; + 1092 : 0; + 1093 : 0; + 1094 : 0; + 1095 : 0; + 1096 : 0; + 1097 : 0; + 1098 : 0; + 1099 : 0; + 1100 : 0; + 1101 : 0; + 1102 : 0; + 1103 : 0; + 1104 : 0; + 1105 : 0; + 1106 : 0; + 1107 : 0; + 1108 : 0; + 1109 : 0; + 1110 : 0; + 1111 : 0; + 1112 : 0; + 1113 : 0; + 1114 : 0; + 1115 : 0; + 1116 : 0; + 1117 : 0; + 1118 : 0; + 1119 : 0; + 1120 : 0; + 1121 : 0; + 1122 : 0; + 1123 : 7; + 1124 : 7; + 1125 : 7; + 1126 : 7; + 1127 : 7; + 1128 : 7; + 1129 : 7; + 1130 : 7; + 1131 : 7; + 1132 : 7; + 1133 : 0; + 1134 : 0; + 1135 : 0; + 1136 : 0; + 1137 : 0; + 1138 : 0; + 1139 : 0; + 1140 : 0; + 1141 : 0; + 1142 : 0; + 1143 : 0; + 1144 : 0; + 1145 : 0; + 1146 : 0; + 1147 : 0; + 1148 : 0; + 1149 : 0; + 1150 : 0; + 1151 : 0; + 1152 : 0; + 1153 : 0; + 1154 : 0; + 1155 : 0; + 1156 : 0; + 1157 : 0; + 1158 : 0; + 1159 : 0; + 1160 : 0; + 1161 : 0; + 1162 : 0; + 1163 : 0; + 1164 : 0; + 1165 : 0; + 1166 : 0; + 1167 : 0; + 1168 : 0; + 1169 : 0; + 1170 : 0; + 1171 : 0; + 1172 : 0; + 1173 : 0; + 1174 : 0; + 1175 : 0; + 1176 : 0; + 1177 : 0; + 1178 : 0; + 1179 : 0; + 1180 : 0; + 1181 : 0; + 1182 : 0; + 1183 : 0; + 1184 : 0; + 1185 : 0; + 1186 : 0; + 1187 : 0; + 1188 : 0; + 1189 : 0; + 1190 : 0; + 1191 : 0; + 1192 : 0; + 1193 : 0; + 1194 : 0; + 1195 : 0; + 1196 : 0; + 1197 : 0; + 1198 : 0; + 1199 : 0; + 1200 : 0; + 1201 : 0; + 1202 : 0; + 1203 : 0; + 1204 : 0; + 1205 : 0; + 1206 : 0; + 1207 : 0; + 1208 : 0; + 1209 : 0; + 1210 : 0; + 1211 : 0; + 1212 : 0; + 1213 : 0; + 1214 : 0; + 1215 : 0; + 1216 : 0; + 1217 : 0; + 1218 : 0; + 1219 : 0; + 1220 : 0; + 1221 : 0; + 1222 : 0; + 1223 : 0; + 1224 : 0; + 1225 : 0; + 1226 : 0; + 1227 : 0; + 1228 : 0; + 1229 : 0; + 1230 : 0; + 1231 : 0; + 1232 : 0; + 1233 : 0; + 1234 : 0; + 1235 : 0; + 1236 : 0; + 1237 : 0; + 1238 : 0; + 1239 : 0; + 1240 : 0; + 1241 : 0; + 1242 : 0; + 1243 : 0; + 1244 : 0; + 1245 : 0; + 1246 : 0; + 1247 : 0; + 1248 : 0; + 1249 : 0; + 1250 : 0; + 1251 : 7; + 1252 : 7; + 1253 : 7; + 1254 : 7; + 1255 : 7; + 1256 : 7; + 1257 : 7; + 1258 : 7; + 1259 : 7; + 1260 : 7; + 1261 : 0; + 1262 : 0; + 1263 : 0; + 1264 : 0; + 1265 : 0; + 1266 : 0; + 1267 : 0; + 1268 : 0; + 1269 : 0; + 1270 : 0; + 1271 : 0; + 1272 : 0; + 1273 : 0; + 1274 : 0; + 1275 : 0; + 1276 : 0; + 1277 : 0; + 1278 : 0; + 1279 : 0; + 1280 : 0; + 1281 : 0; + 1282 : 0; + 1283 : 0; + 1284 : 0; + 1285 : 0; + 1286 : 0; + 1287 : 0; + 1288 : 0; + 1289 : 0; + 1290 : 0; + 1291 : 0; + 1292 : 0; + 1293 : 0; + 1294 : 0; + 1295 : 0; + 1296 : 0; + 1297 : 0; + 1298 : 0; + 1299 : 0; + 1300 : 0; + 1301 : 0; + 1302 : 0; + 1303 : 0; + 1304 : 0; + 1305 : 0; + 1306 : 0; + 1307 : 0; + 1308 : 0; + 1309 : 0; + 1310 : 0; + 1311 : 0; + 1312 : 0; + 1313 : 0; + 1314 : 0; + 1315 : 0; + 1316 : 0; + 1317 : 0; + 1318 : 0; + 1319 : 0; + 1320 : 0; + 1321 : 0; + 1322 : 0; + 1323 : 0; + 1324 : 0; + 1325 : 0; + 1326 : 0; + 1327 : 0; + 1328 : 0; + 1329 : 0; + 1330 : 0; + 1331 : 0; + 1332 : 0; + 1333 : 0; + 1334 : 0; + 1335 : 0; + 1336 : 0; + 1337 : 0; + 1338 : 0; + 1339 : 0; + 1340 : 0; + 1341 : 0; + 1342 : 0; + 1343 : 0; + 1344 : 0; + 1345 : 0; + 1346 : 0; + 1347 : 0; + 1348 : 0; + 1349 : 0; + 1350 : 0; + 1351 : 0; + 1352 : 0; + 1353 : 0; + 1354 : 0; + 1355 : 0; + 1356 : 0; + 1357 : 0; + 1358 : 0; + 1359 : 0; + 1360 : 0; + 1361 : 0; + 1362 : 0; + 1363 : 0; + 1364 : 0; + 1365 : 0; + 1366 : 0; + 1367 : 0; + 1368 : 0; + 1369 : 0; + 1370 : 0; + 1371 : 0; + 1372 : 0; + 1373 : 0; + 1374 : 0; + 1375 : 0; + 1376 : 0; + 1377 : 0; + 1378 : 7; + 1379 : 7; + 1380 : 7; + 1381 : 7; + 1382 : 7; + 1383 : 7; + 1384 : 7; + 1385 : 7; + 1386 : 7; + 1387 : 7; + 1388 : 7; + 1389 : 0; + 1390 : 0; + 1391 : 0; + 1392 : 0; + 1393 : 0; + 1394 : 0; + 1395 : 0; + 1396 : 0; + 1397 : 0; + 1398 : 0; + 1399 : 0; + 1400 : 0; + 1401 : 0; + 1402 : 0; + 1403 : 0; + 1404 : 0; + 1405 : 0; + 1406 : 0; + 1407 : 0; + 1408 : 0; + 1409 : 0; + 1410 : 0; + 1411 : 0; + 1412 : 0; + 1413 : 0; + 1414 : 0; + 1415 : 0; + 1416 : 0; + 1417 : 0; + 1418 : 0; + 1419 : 0; + 1420 : 0; + 1421 : 0; + 1422 : 0; + 1423 : 0; + 1424 : 0; + 1425 : 0; + 1426 : 0; + 1427 : 0; + 1428 : 0; + 1429 : 0; + 1430 : 0; + 1431 : 0; + 1432 : 0; + 1433 : 0; + 1434 : 0; + 1435 : 0; + 1436 : 0; + 1437 : 0; + 1438 : 0; + 1439 : 0; + 1440 : 0; + 1441 : 0; + 1442 : 0; + 1443 : 0; + 1444 : 0; + 1445 : 0; + 1446 : 0; + 1447 : 0; + 1448 : 0; + 1449 : 0; + 1450 : 0; + 1451 : 0; + 1452 : 0; + 1453 : 0; + 1454 : 0; + 1455 : 0; + 1456 : 0; + 1457 : 0; + 1458 : 0; + 1459 : 0; + 1460 : 0; + 1461 : 0; + 1462 : 0; + 1463 : 0; + 1464 : 0; + 1465 : 0; + 1466 : 0; + 1467 : 0; + 1468 : 0; + 1469 : 0; + 1470 : 0; + 1471 : 0; + 1472 : 0; + 1473 : 0; + 1474 : 0; + 1475 : 0; + 1476 : 0; + 1477 : 0; + 1478 : 0; + 1479 : 0; + 1480 : 0; + 1481 : 0; + 1482 : 0; + 1483 : 0; + 1484 : 0; + 1485 : 0; + 1486 : 0; + 1487 : 0; + 1488 : 0; + 1489 : 0; + 1490 : 0; + 1491 : 0; + 1492 : 0; + 1493 : 0; + 1494 : 0; + 1495 : 0; + 1496 : 0; + 1497 : 0; + 1498 : 0; + 1499 : 0; + 1500 : 0; + 1501 : 0; + 1502 : 0; + 1503 : 0; + 1504 : 0; + 1505 : 7; + 1506 : 7; + 1507 : 7; + 1508 : 7; + 1509 : 7; + 1510 : 7; + 1511 : 7; + 1512 : 7; + 1513 : 7; + 1514 : 7; + 1515 : 7; + 1516 : 7; + 1517 : 0; + 1518 : 0; + 1519 : 0; + 1520 : 0; + 1521 : 0; + 1522 : 0; + 1523 : 0; + 1524 : 0; + 1525 : 0; + 1526 : 0; + 1527 : 0; + 1528 : 0; + 1529 : 0; + 1530 : 0; + 1531 : 0; + 1532 : 0; + 1533 : 0; + 1534 : 0; + 1535 : 0; + 1536 : 0; + 1537 : 0; + 1538 : 0; + 1539 : 0; + 1540 : 0; + 1541 : 0; + 1542 : 0; + 1543 : 0; + 1544 : 0; + 1545 : 0; + 1546 : 0; + 1547 : 0; + 1548 : 0; + 1549 : 0; + 1550 : 0; + 1551 : 0; + 1552 : 0; + 1553 : 0; + 1554 : 0; + 1555 : 0; + 1556 : 0; + 1557 : 0; + 1558 : 0; + 1559 : 0; + 1560 : 0; + 1561 : 0; + 1562 : 0; + 1563 : 0; + 1564 : 0; + 1565 : 0; + 1566 : 0; + 1567 : 0; + 1568 : 0; + 1569 : 0; + 1570 : 0; + 1571 : 0; + 1572 : 0; + 1573 : 0; + 1574 : 0; + 1575 : 0; + 1576 : 0; + 1577 : 0; + 1578 : 0; + 1579 : 0; + 1580 : 0; + 1581 : 0; + 1582 : 0; + 1583 : 0; + 1584 : 0; + 1585 : 0; + 1586 : 0; + 1587 : 0; + 1588 : 0; + 1589 : 0; + 1590 : 0; + 1591 : 0; + 1592 : 0; + 1593 : 0; + 1594 : 0; + 1595 : 0; + 1596 : 0; + 1597 : 0; + 1598 : 0; + 1599 : 0; + 1600 : 0; + 1601 : 0; + 1602 : 0; + 1603 : 0; + 1604 : 0; + 1605 : 0; + 1606 : 0; + 1607 : 0; + 1608 : 0; + 1609 : 0; + 1610 : 0; + 1611 : 0; + 1612 : 0; + 1613 : 0; + 1614 : 0; + 1615 : 0; + 1616 : 0; + 1617 : 0; + 1618 : 0; + 1619 : 0; + 1620 : 0; + 1621 : 0; + 1622 : 0; + 1623 : 0; + 1624 : 0; + 1625 : 0; + 1626 : 0; + 1627 : 0; + 1628 : 0; + 1629 : 0; + 1630 : 0; + 1631 : 0; + 1632 : 7; + 1633 : 7; + 1634 : 7; + 1635 : 7; + 1636 : 7; + 1637 : 7; + 1638 : 7; + 1639 : 7; + 1640 : 7; + 1641 : 7; + 1642 : 7; + 1643 : 7; + 1644 : 7; + 1645 : 0; + 1646 : 0; + 1647 : 0; + 1648 : 0; + 1649 : 0; + 1650 : 0; + 1651 : 0; + 1652 : 0; + 1653 : 0; + 1654 : 0; + 1655 : 0; + 1656 : 0; + 1657 : 0; + 1658 : 0; + 1659 : 0; + 1660 : 0; + 1661 : 0; + 1662 : 0; + 1663 : 0; + 1664 : 0; + 1665 : 0; + 1666 : 0; + 1667 : 0; + 1668 : 0; + 1669 : 0; + 1670 : 0; + 1671 : 0; + 1672 : 0; + 1673 : 0; + 1674 : 0; + 1675 : 0; + 1676 : 0; + 1677 : 0; + 1678 : 0; + 1679 : 0; + 1680 : 0; + 1681 : 0; + 1682 : 0; + 1683 : 0; + 1684 : 0; + 1685 : 0; + 1686 : 0; + 1687 : 0; + 1688 : 0; + 1689 : 0; + 1690 : 0; + 1691 : 0; + 1692 : 0; + 1693 : 0; + 1694 : 0; + 1695 : 3; + 1696 : 7; + 1697 : 3; + 1698 : 3; + 1699 : 3; + 1700 : 3; + 1701 : 3; + 1702 : 3; + 1703 : 3; + 1704 : 3; + 1705 : 7; + 1706 : 0; + 1707 : 0; + 1708 : 0; + 1709 : 0; + 1710 : 0; + 1711 : 0; + 1712 : 0; + 1713 : 0; + 1714 : 0; + 1715 : 0; + 1716 : 0; + 1717 : 0; + 1718 : 0; + 1719 : 0; + 1720 : 0; + 1721 : 0; + 1722 : 0; + 1723 : 0; + 1724 : 0; + 1725 : 0; + 1726 : 0; + 1727 : 0; + 1728 : 0; + 1729 : 0; + 1730 : 0; + 1731 : 0; + 1732 : 0; + 1733 : 0; + 1734 : 0; + 1735 : 0; + 1736 : 0; + 1737 : 0; + 1738 : 0; + 1739 : 0; + 1740 : 0; + 1741 : 0; + 1742 : 0; + 1743 : 0; + 1744 : 0; + 1745 : 0; + 1746 : 0; + 1747 : 0; + 1748 : 0; + 1749 : 0; + 1750 : 0; + 1751 : 0; + 1752 : 0; + 1753 : 0; + 1754 : 0; + 1755 : 0; + 1756 : 0; + 1757 : 0; + 1758 : 0; + 1759 : 0; + 1760 : 7; + 1761 : 7; + 1762 : 7; + 1763 : 7; + 1764 : 7; + 1765 : 7; + 1766 : 7; + 1767 : 7; + 1768 : 7; + 1769 : 7; + 1770 : 7; + 1771 : 7; + 1772 : 7; + 1773 : 0; + 1774 : 0; + 1775 : 0; + 1776 : 0; + 1777 : 0; + 1778 : 0; + 1779 : 0; + 1780 : 0; + 1781 : 0; + 1782 : 0; + 1783 : 0; + 1784 : 0; + 1785 : 0; + 1786 : 0; + 1787 : 0; + 1788 : 0; + 1789 : 0; + 1790 : 0; + 1791 : 0; + 1792 : 0; + 1793 : 0; + 1794 : 0; + 1795 : 0; + 1796 : 0; + 1797 : 0; + 1798 : 0; + 1799 : 0; + 1800 : 0; + 1801 : 0; + 1802 : 0; + 1803 : 0; + 1804 : 0; + 1805 : 0; + 1806 : 0; + 1807 : 0; + 1808 : 0; + 1809 : 0; + 1810 : 0; + 1811 : 0; + 1812 : 0; + 1813 : 0; + 1814 : 0; + 1815 : 0; + 1816 : 0; + 1817 : 0; + 1818 : 0; + 1819 : 0; + 1820 : 0; + 1821 : 0; + 1822 : 3; + 1823 : 3; + 1824 : 7; + 1825 : 3; + 1826 : 3; + 1827 : 3; + 1828 : 3; + 1829 : 3; + 1830 : 3; + 1831 : 3; + 1832 : 3; + 1833 : 7; + 1834 : 7; + 1835 : 7; + 1836 : 7; + 1837 : 7; + 1838 : 7; + 1839 : 7; + 1840 : 7; + 1841 : 7; + 1842 : 7; + 1843 : 7; + 1844 : 7; + 1845 : 7; + 1846 : 7; + 1847 : 7; + 1848 : 0; + 1849 : 0; + 1850 : 0; + 1851 : 0; + 1852 : 0; + 1853 : 0; + 1854 : 0; + 1855 : 0; + 1856 : 0; + 1857 : 0; + 1858 : 0; + 1859 : 0; + 1860 : 0; + 1861 : 0; + 1862 : 0; + 1863 : 0; + 1864 : 0; + 1865 : 0; + 1866 : 0; + 1867 : 0; + 1868 : 0; + 1869 : 0; + 1870 : 0; + 1871 : 0; + 1872 : 0; + 1873 : 0; + 1874 : 0; + 1875 : 0; + 1876 : 0; + 1877 : 0; + 1878 : 0; + 1879 : 0; + 1880 : 0; + 1881 : 0; + 1882 : 0; + 1883 : 0; + 1884 : 0; + 1885 : 0; + 1886 : 0; + 1887 : 7; + 1888 : 7; + 1889 : 7; + 1890 : 7; + 1891 : 7; + 1892 : 7; + 1893 : 7; + 1894 : 7; + 1895 : 7; + 1896 : 7; + 1897 : 7; + 1898 : 7; + 1899 : 7; + 1900 : 7; + 1901 : 0; + 1902 : 0; + 1903 : 0; + 1904 : 0; + 1905 : 0; + 1906 : 0; + 1907 : 0; + 1908 : 0; + 1909 : 0; + 1910 : 0; + 1911 : 0; + 1912 : 0; + 1913 : 0; + 1914 : 0; + 1915 : 0; + 1916 : 0; + 1917 : 0; + 1918 : 0; + 1919 : 0; + 1920 : 0; + 1921 : 0; + 1922 : 0; + 1923 : 0; + 1924 : 0; + 1925 : 0; + 1926 : 0; + 1927 : 0; + 1928 : 0; + 1929 : 0; + 1930 : 0; + 1931 : 0; + 1932 : 0; + 1933 : 0; + 1934 : 0; + 1935 : 0; + 1936 : 0; + 1937 : 0; + 1938 : 0; + 1939 : 0; + 1940 : 0; + 1941 : 0; + 1942 : 0; + 1943 : 0; + 1944 : 0; + 1945 : 0; + 1946 : 0; + 1947 : 3; + 1948 : 3; + 1949 : 3; + 1950 : 3; + 1951 : 3; + 1952 : 7; + 1953 : 7; + 1954 : 3; + 1955 : 3; + 1956 : 7; + 1957 : 7; + 1958 : 7; + 1959 : 7; + 1960 : 7; + 1961 : 7; + 1962 : 7; + 1963 : 7; + 1964 : 7; + 1965 : 7; + 1966 : 7; + 1967 : 7; + 1968 : 7; + 1969 : 7; + 1970 : 7; + 1971 : 7; + 1972 : 7; + 1973 : 7; + 1974 : 7; + 1975 : 7; + 1976 : 7; + 1977 : 7; + 1978 : 7; + 1979 : 7; + 1980 : 7; + 1981 : 7; + 1982 : 0; + 1983 : 0; + 1984 : 0; + 1985 : 0; + 1986 : 0; + 1987 : 0; + 1988 : 0; + 1989 : 0; + 1990 : 0; + 1991 : 0; + 1992 : 0; + 1993 : 0; + 1994 : 0; + 1995 : 0; + 1996 : 0; + 1997 : 0; + 1998 : 0; + 1999 : 0; + 2000 : 0; + 2001 : 0; + 2002 : 0; + 2003 : 0; + 2004 : 0; + 2005 : 0; + 2006 : 0; + 2007 : 0; + 2008 : 0; + 2009 : 0; + 2010 : 0; + 2011 : 0; + 2012 : 0; + 2013 : 0; + 2014 : 7; + 2015 : 7; + 2016 : 7; + 2017 : 7; + 2018 : 7; + 2019 : 7; + 2020 : 7; + 2021 : 7; + 2022 : 7; + 2023 : 7; + 2024 : 7; + 2025 : 7; + 2026 : 7; + 2027 : 7; + 2028 : 7; + 2029 : 0; + 2030 : 0; + 2031 : 0; + 2032 : 0; + 2033 : 0; + 2034 : 0; + 2035 : 0; + 2036 : 0; + 2037 : 0; + 2038 : 0; + 2039 : 0; + 2040 : 0; + 2041 : 0; + 2042 : 0; + 2043 : 0; + 2044 : 0; + 2045 : 0; + 2046 : 0; + 2047 : 0; + 2048 : 0; + 2049 : 0; + 2050 : 0; + 2051 : 0; + 2052 : 0; + 2053 : 0; + 2054 : 0; + 2055 : 0; + 2056 : 0; + 2057 : 0; + 2058 : 0; + 2059 : 0; + 2060 : 0; + 2061 : 0; + 2062 : 0; + 2063 : 0; + 2064 : 0; + 2065 : 0; + 2066 : 0; + 2067 : 0; + 2068 : 0; + 2069 : 0; + 2070 : 0; + 2071 : 7; + 2072 : 7; + 2073 : 7; + 2074 : 7; + 2075 : 7; + 2076 : 7; + 2077 : 7; + 2078 : 7; + 2079 : 7; + 2080 : 7; + 2081 : 7; + 2082 : 7; + 2083 : 7; + 2084 : 7; + 2085 : 7; + 2086 : 7; + 2087 : 7; + 2088 : 7; + 2089 : 7; + 2090 : 7; + 2091 : 7; + 2092 : 7; + 2093 : 7; + 2094 : 7; + 2095 : 7; + 2096 : 7; + 2097 : 7; + 2098 : 7; + 2099 : 7; + 2100 : 7; + 2101 : 7; + 2102 : 7; + 2103 : 7; + 2104 : 7; + 2105 : 7; + 2106 : 7; + 2107 : 7; + 2108 : 7; + 2109 : 7; + 2110 : 7; + 2111 : 7; + 2112 : 7; + 2113 : 7; + 2114 : 0; + 2115 : 0; + 2116 : 0; + 2117 : 0; + 2118 : 0; + 2119 : 0; + 2120 : 0; + 2121 : 0; + 2122 : 0; + 2123 : 0; + 2124 : 0; + 2125 : 0; + 2126 : 0; + 2127 : 0; + 2128 : 0; + 2129 : 0; + 2130 : 0; + 2131 : 0; + 2132 : 0; + 2133 : 0; + 2134 : 0; + 2135 : 0; + 2136 : 0; + 2137 : 0; + 2138 : 0; + 2139 : 0; + 2140 : 0; + 2141 : 0; + 2142 : 7; + 2143 : 7; + 2144 : 7; + 2145 : 7; + 2146 : 7; + 2147 : 7; + 2148 : 7; + 2149 : 7; + 2150 : 7; + 2151 : 7; + 2152 : 7; + 2153 : 7; + 2154 : 7; + 2155 : 7; + 2156 : 7; + 2157 : 0; + 2158 : 0; + 2159 : 0; + 2160 : 0; + 2161 : 0; + 2162 : 0; + 2163 : 0; + 2164 : 0; + 2165 : 0; + 2166 : 0; + 2167 : 0; + 2168 : 0; + 2169 : 0; + 2170 : 0; + 2171 : 0; + 2172 : 0; + 2173 : 0; + 2174 : 0; + 2175 : 0; + 2176 : 0; + 2177 : 0; + 2178 : 0; + 2179 : 0; + 2180 : 0; + 2181 : 0; + 2182 : 0; + 2183 : 0; + 2184 : 0; + 2185 : 0; + 2186 : 0; + 2187 : 0; + 2188 : 0; + 2189 : 0; + 2190 : 0; + 2191 : 0; + 2192 : 7; + 2193 : 7; + 2194 : 7; + 2195 : 7; + 2196 : 7; + 2197 : 7; + 2198 : 7; + 2199 : 7; + 2200 : 7; + 2201 : 7; + 2202 : 7; + 2203 : 7; + 2204 : 7; + 2205 : 7; + 2206 : 7; + 2207 : 7; + 2208 : 7; + 2209 : 7; + 2210 : 7; + 2211 : 7; + 2212 : 7; + 2213 : 7; + 2214 : 7; + 2215 : 7; + 2216 : 7; + 2217 : 7; + 2218 : 7; + 2219 : 7; + 2220 : 7; + 2221 : 7; + 2222 : 7; + 2223 : 7; + 2224 : 7; + 2225 : 7; + 2226 : 7; + 2227 : 7; + 2228 : 7; + 2229 : 7; + 2230 : 7; + 2231 : 7; + 2232 : 7; + 2233 : 7; + 2234 : 7; + 2235 : 7; + 2236 : 7; + 2237 : 7; + 2238 : 7; + 2239 : 7; + 2240 : 7; + 2241 : 7; + 2242 : 7; + 2243 : 7; + 2244 : 7; + 2245 : 7; + 2246 : 7; + 2247 : 7; + 2248 : 0; + 2249 : 0; + 2250 : 0; + 2251 : 0; + 2252 : 0; + 2253 : 0; + 2254 : 0; + 2255 : 0; + 2256 : 0; + 2257 : 0; + 2258 : 0; + 2259 : 0; + 2260 : 0; + 2261 : 0; + 2262 : 0; + 2263 : 0; + 2264 : 0; + 2265 : 0; + 2266 : 0; + 2267 : 0; + 2268 : 0; + 2269 : 7; + 2270 : 7; + 2271 : 7; + 2272 : 7; + 2273 : 7; + 2274 : 7; + 2275 : 7; + 2276 : 7; + 2277 : 7; + 2278 : 7; + 2279 : 7; + 2280 : 7; + 2281 : 7; + 2282 : 7; + 2283 : 7; + 2284 : 7; + 2285 : 0; + 2286 : 0; + 2287 : 0; + 2288 : 0; + 2289 : 0; + 2290 : 0; + 2291 : 0; + 2292 : 0; + 2293 : 0; + 2294 : 0; + 2295 : 0; + 2296 : 0; + 2297 : 0; + 2298 : 0; + 2299 : 0; + 2300 : 0; + 2301 : 0; + 2302 : 0; + 2303 : 0; + 2304 : 0; + 2305 : 0; + 2306 : 0; + 2307 : 0; + 2308 : 0; + 2309 : 0; + 2310 : 0; + 2311 : 0; + 2312 : 0; + 2313 : 0; + 2314 : 0; + 2315 : 0; + 2316 : 0; + 2317 : 7; + 2318 : 7; + 2319 : 8; + 2320 : 8; + 2321 : 8; + 2322 : 8; + 2323 : 8; + 2324 : 8; + 2325 : 8; + 2326 : 8; + 2327 : 7; + 2328 : 7; + 2329 : 7; + 2330 : 7; + 2331 : 7; + 2332 : 7; + 2333 : 7; + 2334 : 7; + 2335 : 7; + 2336 : 7; + 2337 : 7; + 2338 : 7; + 2339 : 7; + 2340 : 7; + 2341 : 7; + 2342 : 7; + 2343 : 7; + 2344 : 7; + 2345 : 7; + 2346 : 7; + 2347 : 7; + 2348 : 7; + 2349 : 7; + 2350 : 7; + 2351 : 7; + 2352 : 7; + 2353 : 7; + 2354 : 7; + 2355 : 7; + 2356 : 7; + 2357 : 7; + 2358 : 7; + 2359 : 7; + 2360 : 7; + 2361 : 7; + 2362 : 7; + 2363 : 7; + 2364 : 7; + 2365 : 7; + 2366 : 7; + 2367 : 7; + 2368 : 7; + 2369 : 7; + 2370 : 7; + 2371 : 7; + 2372 : 7; + 2373 : 7; + 2374 : 7; + 2375 : 7; + 2376 : 7; + 2377 : 7; + 2378 : 7; + 2379 : 7; + 2380 : 7; + 2381 : 0; + 2382 : 0; + 2383 : 0; + 2384 : 0; + 2385 : 0; + 2386 : 0; + 2387 : 0; + 2388 : 0; + 2389 : 0; + 2390 : 0; + 2391 : 0; + 2392 : 0; + 2393 : 0; + 2394 : 0; + 2395 : 0; + 2396 : 7; + 2397 : 7; + 2398 : 7; + 2399 : 7; + 2400 : 7; + 2401 : 7; + 2402 : 7; + 2403 : 7; + 2404 : 7; + 2405 : 7; + 2406 : 7; + 2407 : 7; + 2408 : 7; + 2409 : 7; + 2410 : 7; + 2411 : 7; + 2412 : 7; + 2413 : 0; + 2414 : 0; + 2415 : 0; + 2416 : 0; + 2417 : 0; + 2418 : 0; + 2419 : 0; + 2420 : 0; + 2421 : 0; + 2422 : 0; + 2423 : 0; + 2424 : 0; + 2425 : 0; + 2426 : 0; + 2427 : 0; + 2428 : 0; + 2429 : 0; + 2430 : 0; + 2431 : 0; + 2432 : 0; + 2433 : 0; + 2434 : 0; + 2435 : 0; + 2436 : 0; + 2437 : 0; + 2438 : 0; + 2439 : 0; + 2440 : 0; + 2441 : 0; + 2442 : 7; + 2443 : 7; + 2444 : 8; + 2445 : 8; + 2446 : 8; + 2447 : 8; + 2448 : 8; + 2449 : 8; + 2450 : 8; + 2451 : 8; + 2452 : 8; + 2453 : 8; + 2454 : 8; + 2455 : 7; + 2456 : 7; + 2457 : 7; + 2458 : 7; + 2459 : 7; + 2460 : 7; + 2461 : 7; + 2462 : 7; + 2463 : 7; + 2464 : 7; + 2465 : 7; + 2466 : 7; + 2467 : 7; + 2468 : 7; + 2469 : 7; + 2470 : 7; + 2471 : 7; + 2472 : 7; + 2473 : 7; + 2474 : 7; + 2475 : 7; + 2476 : 7; + 2477 : 7; + 2478 : 7; + 2479 : 7; + 2480 : 7; + 2481 : 7; + 2482 : 7; + 2483 : 7; + 2484 : 7; + 2485 : 7; + 2486 : 7; + 2487 : 7; + 2488 : 7; + 2489 : 7; + 2490 : 7; + 2491 : 7; + 2492 : 7; + 2493 : 7; + 2494 : 7; + 2495 : 7; + 2496 : 7; + 2497 : 7; + 2498 : 7; + 2499 : 7; + 2500 : 7; + 2501 : 7; + 2502 : 7; + 2503 : 7; + 2504 : 7; + 2505 : 7; + 2506 : 7; + 2507 : 7; + 2508 : 7; + 2509 : 7; + 2510 : 7; + 2511 : 7; + 2512 : 7; + 2513 : 7; + 2514 : 7; + 2515 : 7; + 2516 : 7; + 2517 : 7; + 2518 : 7; + 2519 : 7; + 2520 : 7; + 2521 : 7; + 2522 : 7; + 2523 : 7; + 2524 : 7; + 2525 : 7; + 2526 : 7; + 2527 : 7; + 2528 : 7; + 2529 : 7; + 2530 : 7; + 2531 : 7; + 2532 : 7; + 2533 : 7; + 2534 : 7; + 2535 : 7; + 2536 : 7; + 2537 : 7; + 2538 : 7; + 2539 : 7; + 2540 : 7; + 2541 : 0; + 2542 : 0; + 2543 : 0; + 2544 : 0; + 2545 : 0; + 2546 : 0; + 2547 : 0; + 2548 : 0; + 2549 : 0; + 2550 : 0; + 2551 : 0; + 2552 : 0; + 2553 : 0; + 2554 : 0; + 2555 : 0; + 2556 : 0; + 2557 : 0; + 2558 : 0; + 2559 : 0; + 2560 : 0; + 2561 : 0; + 2562 : 0; + 2563 : 0; + 2564 : 0; + 2565 : 0; + 2566 : 0; + 2567 : 0; + 2568 : 0; + 2569 : 7; + 2570 : 8; + 2571 : 8; + 2572 : 8; + 2573 : 8; + 2574 : 8; + 2575 : 8; + 2576 : 7; + 2577 : 7; + 2578 : 7; + 2579 : 7; + 2580 : 7; + 2581 : 7; + 2582 : 7; + 2583 : 8; + 2584 : 8; + 2585 : 8; + 2586 : 8; + 2587 : 8; + 2588 : 8; + 2589 : 8; + 2590 : 8; + 2591 : 8; + 2592 : 8; + 2593 : 8; + 2594 : 8; + 2595 : 8; + 2596 : 8; + 2597 : 8; + 2598 : 8; + 2599 : 8; + 2600 : 8; + 2601 : 8; + 2602 : 8; + 2603 : 8; + 2604 : 8; + 2605 : 8; + 2606 : 8; + 2607 : 8; + 2608 : 8; + 2609 : 8; + 2610 : 8; + 2611 : 8; + 2612 : 8; + 2613 : 8; + 2614 : 8; + 2615 : 8; + 2616 : 8; + 2617 : 8; + 2618 : 8; + 2619 : 8; + 2620 : 8; + 2621 : 8; + 2622 : 8; + 2623 : 8; + 2624 : 8; + 2625 : 8; + 2626 : 8; + 2627 : 8; + 2628 : 8; + 2629 : 8; + 2630 : 8; + 2631 : 8; + 2632 : 8; + 2633 : 8; + 2634 : 8; + 2635 : 8; + 2636 : 8; + 2637 : 8; + 2638 : 8; + 2639 : 8; + 2640 : 8; + 2641 : 8; + 2642 : 8; + 2643 : 8; + 2644 : 8; + 2645 : 8; + 2646 : 8; + 2647 : 8; + 2648 : 8; + 2649 : 8; + 2650 : 8; + 2651 : 8; + 2652 : 8; + 2653 : 8; + 2654 : 8; + 2655 : 8; + 2656 : 8; + 2657 : 8; + 2658 : 8; + 2659 : 8; + 2660 : 8; + 2661 : 8; + 2662 : 8; + 2663 : 8; + 2664 : 8; + 2665 : 8; + 2666 : 8; + 2667 : 8; + 2668 : 8; + 2669 : 0; + 2670 : 0; + 2671 : 0; + 2672 : 0; + 2673 : 0; + 2674 : 0; + 2675 : 0; + 2676 : 0; + 2677 : 0; + 2678 : 0; + 2679 : 0; + 2680 : 0; + 2681 : 0; + 2682 : 0; + 2683 : 0; + 2684 : 0; + 2685 : 0; + 2686 : 0; + 2687 : 0; + 2688 : 0; + 2689 : 0; + 2690 : 0; + 2691 : 0; + 2692 : 7; + 2693 : 7; + 2694 : 7; + 2695 : 7; + 2696 : 7; + 2697 : 7; + 2698 : 7; + 2699 : 7; + 2700 : 7; + 2701 : 7; + 2702 : 7; + 2703 : 7; + 2704 : 7; + 2705 : 7; + 2706 : 7; + 2707 : 7; + 2708 : 7; + 2709 : 7; + 2710 : 7; + 2711 : 7; + 2712 : 7; + 2713 : 7; + 2714 : 7; + 2715 : 7; + 2716 : 7; + 2717 : 7; + 2718 : 7; + 2719 : 7; + 2720 : 7; + 2721 : 7; + 2722 : 7; + 2723 : 7; + 2724 : 7; + 2725 : 7; + 2726 : 7; + 2727 : 7; + 2728 : 7; + 2729 : 7; + 2730 : 7; + 2731 : 7; + 2732 : 7; + 2733 : 7; + 2734 : 7; + 2735 : 7; + 2736 : 7; + 2737 : 7; + 2738 : 7; + 2739 : 7; + 2740 : 7; + 2741 : 7; + 2742 : 7; + 2743 : 7; + 2744 : 7; + 2745 : 7; + 2746 : 7; + 2747 : 7; + 2748 : 7; + 2749 : 7; + 2750 : 7; + 2751 : 7; + 2752 : 7; + 2753 : 7; + 2754 : 7; + 2755 : 7; + 2756 : 7; + 2757 : 7; + 2758 : 7; + 2759 : 7; + 2760 : 7; + 2761 : 7; + 2762 : 7; + 2763 : 7; + 2764 : 7; + 2765 : 7; + 2766 : 7; + 2767 : 7; + 2768 : 7; + 2769 : 7; + 2770 : 7; + 2771 : 7; + 2772 : 7; + 2773 : 7; + 2774 : 7; + 2775 : 7; + 2776 : 7; + 2777 : 7; + 2778 : 7; + 2779 : 7; + 2780 : 7; + 2781 : 7; + 2782 : 7; + 2783 : 7; + 2784 : 7; + 2785 : 7; + 2786 : 7; + 2787 : 7; + 2788 : 7; + 2789 : 7; + 2790 : 7; + 2791 : 7; + 2792 : 7; + 2793 : 7; + 2794 : 7; + 2795 : 7; + 2796 : 7; + 2797 : 7; + 2798 : 7; + 2799 : 7; + 2800 : 7; + 2801 : 7; + 2802 : 7; + 2803 : 7; + 2804 : 7; + 2805 : 7; + 2806 : 7; + 2807 : 7; + 2808 : 7; + 2809 : 7; + 2810 : 7; + 2811 : 7; + 2812 : 7; + 2813 : 0; + 2814 : 0; + 2815 : 0; + 2816 : 0; + 2817 : 0; + 2818 : 0; + 2819 : 0; + 2820 : 0; + 2821 : 0; + 2822 : 0; + 2823 : 0; + 2824 : 0; + 2825 : 0; + 2826 : 7; + 2827 : 7; + 2828 : 7; + 2829 : 7; + 2830 : 7; + 2831 : 7; + 2832 : 7; + 2833 : 7; + 2834 : 7; + 2835 : 7; + 2836 : 7; + 2837 : 7; + 2838 : 7; + 2839 : 7; + 2840 : 7; + 2841 : 7; + 2842 : 7; + 2843 : 7; + 2844 : 7; + 2845 : 7; + 2846 : 7; + 2847 : 7; + 2848 : 7; + 2849 : 7; + 2850 : 7; + 2851 : 7; + 2852 : 7; + 2853 : 7; + 2854 : 7; + 2855 : 7; + 2856 : 7; + 2857 : 7; + 2858 : 7; + 2859 : 7; + 2860 : 7; + 2861 : 7; + 2862 : 7; + 2863 : 7; + 2864 : 7; + 2865 : 7; + 2866 : 7; + 2867 : 7; + 2868 : 7; + 2869 : 7; + 2870 : 7; + 2871 : 7; + 2872 : 7; + 2873 : 7; + 2874 : 7; + 2875 : 7; + 2876 : 7; + 2877 : 7; + 2878 : 7; + 2879 : 7; + 2880 : 7; + 2881 : 7; + 2882 : 7; + 2883 : 7; + 2884 : 7; + 2885 : 7; + 2886 : 7; + 2887 : 7; + 2888 : 7; + 2889 : 7; + 2890 : 7; + 2891 : 7; + 2892 : 7; + 2893 : 7; + 2894 : 7; + 2895 : 7; + 2896 : 7; + 2897 : 7; + 2898 : 7; + 2899 : 7; + 2900 : 7; + 2901 : 7; + 2902 : 7; + 2903 : 7; + 2904 : 7; + 2905 : 7; + 2906 : 7; + 2907 : 7; + 2908 : 7; + 2909 : 7; + 2910 : 7; + 2911 : 7; + 2912 : 7; + 2913 : 7; + 2914 : 7; + 2915 : 7; + 2916 : 7; + 2917 : 7; + 2918 : 7; + 2919 : 7; + 2920 : 7; + 2921 : 7; + 2922 : 7; + 2923 : 7; + 2924 : 7; + 2925 : 7; + 2926 : 7; + 2927 : 7; + 2928 : 7; + 2929 : 7; + 2930 : 7; + 2931 : 7; + 2932 : 7; + 2933 : 7; + 2934 : 7; + 2935 : 7; + 2936 : 7; + 2937 : 7; + 2938 : 7; + 2939 : 7; + 2940 : 7; + 2941 : 7; + 2942 : 0; + 2943 : 0; + 2944 : 0; + 2945 : 0; + 2946 : 0; + 2947 : 0; + 2948 : 0; + 2949 : 0; + 2950 : 0; + 2951 : 0; + 2952 : 0; + 2953 : 0; + 2954 : 0; + 2955 : 0; + 2956 : 0; + 2957 : 7; + 2958 : 7; + 2959 : 7; + 2960 : 7; + 2961 : 7; + 2962 : 7; + 2963 : 7; + 2964 : 7; + 2965 : 7; + 2966 : 7; + 2967 : 7; + 2968 : 7; + 2969 : 3; + 2970 : 0; + 2971 : 0; + 2972 : 0; + 2973 : 0; + 2974 : 0; + 2975 : 0; + 2976 : 0; + 2977 : 0; + 2978 : 0; + 2979 : 0; + 2980 : 0; + 2981 : 0; + 2982 : 0; + 2983 : 0; + 2984 : 0; + 2985 : 0; + 2986 : 0; + 2987 : 0; + 2988 : 0; + 2989 : 0; + 2990 : 0; + 2991 : 0; + 2992 : 0; + 2993 : 0; + 2994 : 0; + 2995 : 0; + 2996 : 0; + 2997 : 0; + 2998 : 0; + 2999 : 0; + 3000 : 0; + 3001 : 7; + 3002 : 7; + 3003 : 7; + 3004 : 7; + 3005 : 7; + 3006 : 7; + 3007 : 7; + 3008 : 7; + 3009 : 7; + 3010 : 7; + 3011 : 7; + 3012 : 7; + 3013 : 7; + 3014 : 7; + 3015 : 7; + 3016 : 7; + 3017 : 7; + 3018 : 7; + 3019 : 7; + 3020 : 7; + 3021 : 7; + 3022 : 7; + 3023 : 7; + 3024 : 7; + 3025 : 7; + 3026 : 7; + 3027 : 7; + 3028 : 7; + 3029 : 7; + 3030 : 7; + 3031 : 7; + 3032 : 7; + 3033 : 7; + 3034 : 7; + 3035 : 7; + 3036 : 7; + 3037 : 7; + 3038 : 7; + 3039 : 7; + 3040 : 7; + 3041 : 7; + 3042 : 7; + 3043 : 7; + 3044 : 7; + 3045 : 7; + 3046 : 7; + 3047 : 7; + 3048 : 7; + 3049 : 7; + 3050 : 7; + 3051 : 7; + 3052 : 7; + 3053 : 7; + 3054 : 7; + 3055 : 7; + 3056 : 7; + 3057 : 7; + 3058 : 7; + 3059 : 7; + 3060 : 7; + 3061 : 7; + 3062 : 7; + 3063 : 7; + 3064 : 7; + 3065 : 7; + 3066 : 7; + 3067 : 7; + 3068 : 7; + 3069 : 7; + 3070 : 0; + 3071 : 0; + 3072 : 0; + 3073 : 0; + 3074 : 0; + 3075 : 0; + 3076 : 0; + 3077 : 0; + 3078 : 0; + 3079 : 0; + 3080 : 0; + 3081 : 0; + 3082 : 0; + 3083 : 0; + 3084 : 0; + 3085 : 0; + 3086 : 0; + 3087 : 0; + 3088 : 0; + 3089 : 0; + 3090 : 0; + 3091 : 0; + 3092 : 0; + 3093 : 0; + 3094 : 0; + 3095 : 0; + 3096 : 0; + 3097 : 0; + 3098 : 0; + 3099 : 0; + 3100 : 0; + 3101 : 0; + 3102 : 0; + 3103 : 0; + 3104 : 0; + 3105 : 0; + 3106 : 0; + 3107 : 0; + 3108 : 0; + 3109 : 0; + 3110 : 0; + 3111 : 0; + 3112 : 0; + 3113 : 0; + 3114 : 0; + 3115 : 0; + 3116 : 0; + 3117 : 0; + 3118 : 0; + 3119 : 0; + 3120 : 0; + 3121 : 0; + 3122 : 0; + 3123 : 0; + 3124 : 0; + 3125 : 0; + 3126 : 0; + 3127 : 0; + 3128 : 0; + 3129 : 3; + 3130 : 3; + 3131 : 3; + 3132 : 3; + 3133 : 3; + 3134 : 3; + 3135 : 3; + 3136 : 3; + 3137 : 3; + 3138 : 3; + 3139 : 3; + 3140 : 3; + 3141 : 3; + 3142 : 3; + 3143 : 3; + 3144 : 3; + 3145 : 3; + 3146 : 3; + 3147 : 3; + 3148 : 3; + 3149 : 3; + 3150 : 3; + 3151 : 3; + 3152 : 3; + 3153 : 3; + 3154 : 3; + 3155 : 3; + 3156 : 3; + 3157 : 3; + 3158 : 3; + 3159 : 3; + 3160 : 3; + 3161 : 3; + 3162 : 3; + 3163 : 3; + 3164 : 3; + 3165 : 3; + 3166 : 3; + 3167 : 3; + 3168 : 3; + 3169 : 3; + 3170 : 3; + 3171 : 3; + 3172 : 3; + 3173 : 3; + 3174 : 3; + 3175 : 3; + 3176 : 3; + 3177 : 3; + 3178 : 3; + 3179 : 3; + 3180 : 3; + 3181 : 3; + 3182 : 3; + 3183 : 3; + 3184 : 3; + 3185 : 3; + 3186 : 3; + 3187 : 3; + 3188 : 3; + 3189 : 0; + 3190 : 0; + 3191 : 0; + 3192 : 0; + 3193 : 0; + 3194 : 0; + 3195 : 0; + 3196 : 0; + 3197 : 0; + 3198 : 0; + 3199 : 0; + 3200 : 0; + 3201 : 0; + 3202 : 0; + 3203 : 0; + 3204 : 0; + 3205 : 0; + 3206 : 0; + 3207 : 0; + 3208 : 0; + 3209 : 0; + 3210 : 0; + 3211 : 0; + 3212 : 0; + 3213 : 0; + 3214 : 0; + 3215 : 0; + 3216 : 0; + 3217 : 0; + 3218 : 0; + 3219 : 0; + 3220 : 0; + 3221 : 0; + 3222 : 0; + 3223 : 0; + 3224 : 0; + 3225 : 0; + 3226 : 0; + 3227 : 0; + 3228 : 0; + 3229 : 0; + 3230 : 0; + 3231 : 0; + 3232 : 0; + 3233 : 0; + 3234 : 0; + 3235 : 0; + 3236 : 0; + 3237 : 0; + 3238 : 0; + 3239 : 0; + 3240 : 0; + 3241 : 0; + 3242 : 0; + 3243 : 0; + 3244 : 0; + 3245 : 0; + 3246 : 0; + 3247 : 0; + 3248 : 0; + 3249 : 0; + 3250 : 0; + 3251 : 0; + 3252 : 0; + 3253 : 0; + 3254 : 0; + 3255 : 0; + 3256 : 0; + 3257 : 0; + 3258 : 0; + 3259 : 0; + 3260 : 3; + 3261 : 3; + 3262 : 3; + 3263 : 3; + 3264 : 3; + 3265 : 3; + 3266 : 3; + 3267 : 3; + 3268 : 3; + 3269 : 3; + 3270 : 3; + 3271 : 3; + 3272 : 3; + 3273 : 3; + 3274 : 3; + 3275 : 3; + 3276 : 3; + 3277 : 3; + 3278 : 3; + 3279 : 3; + 3280 : 3; + 3281 : 3; + 3282 : 3; + 3283 : 3; + 3284 : 3; + 3285 : 3; + 3286 : 3; + 3287 : 3; + 3288 : 3; + 3289 : 3; + 3290 : 3; + 3291 : 3; + 3292 : 3; + 3293 : 3; + 3294 : 3; + 3295 : 3; + 3296 : 3; + 3297 : 3; + 3298 : 3; + 3299 : 3; + 3300 : 3; + 3301 : 3; + 3302 : 3; + 3303 : 3; + 3304 : 3; + 3305 : 3; + 3306 : 3; + 3307 : 3; + 3308 : 3; + 3309 : 3; + 3310 : 3; + 3311 : 3; + 3312 : 3; + 3313 : 3; + 3314 : 3; + 3315 : 3; + 3316 : 3; + 3317 : 0; + 3318 : 0; + 3319 : 0; + 3320 : 0; + 3321 : 0; + 3322 : 0; + 3323 : 0; + 3324 : 0; + 3325 : 0; + 3326 : 0; + 3327 : 0; + 3328 : 0; + 3329 : 0; + 3330 : 0; + 3331 : 0; + 3332 : 0; + 3333 : 0; + 3334 : 0; + 3335 : 0; + 3336 : 0; + 3337 : 0; + 3338 : 0; + 3339 : 0; + 3340 : 0; + 3341 : 0; + 3342 : 0; + 3343 : 0; + 3344 : 0; + 3345 : 0; + 3346 : 0; + 3347 : 0; + 3348 : 0; + 3349 : 0; + 3350 : 0; + 3351 : 0; + 3352 : 0; + 3353 : 0; + 3354 : 0; + 3355 : 0; + 3356 : 0; + 3357 : 0; + 3358 : 0; + 3359 : 0; + 3360 : 0; + 3361 : 0; + 3362 : 0; + 3363 : 0; + 3364 : 0; + 3365 : 0; + 3366 : 0; + 3367 : 0; + 3368 : 0; + 3369 : 0; + 3370 : 0; + 3371 : 0; + 3372 : 0; + 3373 : 0; + 3374 : 0; + 3375 : 0; + 3376 : 0; + 3377 : 0; + 3378 : 0; + 3379 : 0; + 3380 : 0; + 3381 : 0; + 3382 : 0; + 3383 : 0; + 3384 : 0; + 3385 : 0; + 3386 : 0; + 3387 : 0; + 3388 : 0; + 3389 : 0; + 3390 : 0; + 3391 : 3; + 3392 : 3; + 3393 : 3; + 3394 : 3; + 3395 : 3; + 3396 : 3; + 3397 : 3; + 3398 : 3; + 3399 : 3; + 3400 : 3; + 3401 : 3; + 3402 : 3; + 3403 : 3; + 3404 : 3; + 3405 : 3; + 3406 : 3; + 3407 : 3; + 3408 : 3; + 3409 : 3; + 3410 : 3; + 3411 : 3; + 3412 : 3; + 3413 : 3; + 3414 : 3; + 3415 : 3; + 3416 : 3; + 3417 : 3; + 3418 : 3; + 3419 : 3; + 3420 : 3; + 3421 : 3; + 3422 : 3; + 3423 : 3; + 3424 : 3; + 3425 : 3; + 3426 : 3; + 3427 : 3; + 3428 : 3; + 3429 : 3; + 3430 : 3; + 3431 : 3; + 3432 : 3; + 3433 : 3; + 3434 : 3; + 3435 : 3; + 3436 : 3; + 3437 : 3; + 3438 : 3; + 3439 : 3; + 3440 : 3; + 3441 : 3; + 3442 : 3; + 3443 : 3; + 3444 : 3; + 3445 : 0; + 3446 : 0; + 3447 : 0; + 3448 : 0; + 3449 : 0; + 3450 : 0; + 3451 : 0; + 3452 : 0; + 3453 : 0; + 3454 : 0; + 3455 : 0; + 3456 : 0; + 3457 : 0; + 3458 : 0; + 3459 : 0; + 3460 : 0; + 3461 : 0; + 3462 : 0; + 3463 : 0; + 3464 : 0; + 3465 : 0; + 3466 : 0; + 3467 : 0; + 3468 : 0; + 3469 : 0; + 3470 : 0; + 3471 : 0; + 3472 : 0; + 3473 : 0; + 3474 : 0; + 3475 : 0; + 3476 : 0; + 3477 : 0; + 3478 : 0; + 3479 : 0; + 3480 : 0; + 3481 : 0; + 3482 : 0; + 3483 : 0; + 3484 : 0; + 3485 : 0; + 3486 : 0; + 3487 : 0; + 3488 : 0; + 3489 : 0; + 3490 : 0; + 3491 : 0; + 3492 : 0; + 3493 : 0; + 3494 : 0; + 3495 : 0; + 3496 : 0; + 3497 : 0; + 3498 : 0; + 3499 : 0; + 3500 : 0; + 3501 : 0; + 3502 : 0; + 3503 : 0; + 3504 : 0; + 3505 : 0; + 3506 : 0; + 3507 : 0; + 3508 : 0; + 3509 : 0; + 3510 : 0; + 3511 : 0; + 3512 : 0; + 3513 : 0; + 3514 : 0; + 3515 : 0; + 3516 : 0; + 3517 : 0; + 3518 : 0; + 3519 : 0; + 3520 : 3; + 3521 : 3; + 3522 : 3; + 3523 : 3; + 3524 : 3; + 3525 : 3; + 3526 : 3; + 3527 : 3; + 3528 : 3; + 3529 : 3; + 3530 : 3; + 3531 : 3; + 3532 : 3; + 3533 : 3; + 3534 : 3; + 3535 : 3; + 3536 : 3; + 3537 : 3; + 3538 : 3; + 3539 : 3; + 3540 : 3; + 3541 : 3; + 3542 : 3; + 3543 : 3; + 3544 : 3; + 3545 : 3; + 3546 : 3; + 3547 : 3; + 3548 : 3; + 3549 : 3; + 3550 : 3; + 3551 : 3; + 3552 : 3; + 3553 : 3; + 3554 : 3; + 3555 : 3; + 3556 : 3; + 3557 : 3; + 3558 : 3; + 3559 : 3; + 3560 : 3; + 3561 : 3; + 3562 : 3; + 3563 : 3; + 3564 : 3; + 3565 : 3; + 3566 : 3; + 3567 : 3; + 3568 : 3; + 3569 : 3; + 3570 : 3; + 3571 : 3; + 3572 : 0; + 3573 : 0; + 3574 : 0; + 3575 : 0; + 3576 : 0; + 3577 : 0; + 3578 : 0; + 3579 : 0; + 3580 : 0; + 3581 : 0; + 3582 : 0; + 3583 : 0; + 3584 : 0; + 3585 : 0; + 3586 : 0; + 3587 : 0; + 3588 : 0; + 3589 : 0; + 3590 : 0; + 3591 : 0; + 3592 : 0; + 3593 : 0; + 3594 : 0; + 3595 : 0; + 3596 : 0; + 3597 : 0; + 3598 : 0; + 3599 : 0; + 3600 : 0; + 3601 : 0; + 3602 : 0; + 3603 : 0; + 3604 : 0; + 3605 : 0; + 3606 : 0; + 3607 : 0; + 3608 : 0; + 3609 : 0; + 3610 : 0; + 3611 : 0; + 3612 : 0; + 3613 : 0; + 3614 : 0; + 3615 : 0; + 3616 : 0; + 3617 : 0; + 3618 : 0; + 3619 : 0; + 3620 : 0; + 3621 : 0; + 3622 : 0; + 3623 : 0; + 3624 : 0; + 3625 : 0; + 3626 : 0; + 3627 : 0; + 3628 : 0; + 3629 : 0; + 3630 : 0; + 3631 : 0; + 3632 : 0; + 3633 : 0; + 3634 : 0; + 3635 : 0; + 3636 : 0; + 3637 : 0; + 3638 : 0; + 3639 : 0; + 3640 : 0; + 3641 : 0; + 3642 : 0; + 3643 : 0; + 3644 : 0; + 3645 : 0; + 3646 : 0; + 3647 : 0; + 3648 : 3; + 3649 : 3; + 3650 : 3; + 3651 : 3; + 3652 : 3; + 3653 : 3; + 3654 : 3; + 3655 : 3; + 3656 : 3; + 3657 : 3; + 3658 : 3; + 3659 : 0; + 3660 : 0; + 3661 : 0; + 3662 : 0; + 3663 : 0; + 3664 : 0; + 3665 : 3; + 3666 : 3; + 3667 : 3; + 3668 : 3; + 3669 : 3; + 3670 : 3; + 3671 : 3; + 3672 : 3; + 3673 : 3; + 3674 : 3; + 3675 : 3; + 3676 : 3; + 3677 : 3; + 3678 : 3; + 3679 : 3; + 3680 : 3; + 3681 : 3; + 3682 : 3; + 3683 : 3; + 3684 : 3; + 3685 : 3; + 3686 : 3; + 3687 : 3; + 3688 : 3; + 3689 : 3; + 3690 : 3; + 3691 : 3; + 3692 : 3; + 3693 : 3; + 3694 : 3; + 3695 : 3; + 3696 : 0; + 3697 : 0; + 3698 : 0; + 3699 : 0; + 3700 : 0; + 3701 : 0; + 3702 : 0; + 3703 : 0; + 3704 : 0; + 3705 : 0; + 3706 : 0; + 3707 : 0; + 3708 : 0; + 3709 : 0; + 3710 : 0; + 3711 : 0; + 3712 : 0; + 3713 : 0; + 3714 : 0; + 3715 : 0; + 3716 : 0; + 3717 : 0; + 3718 : 0; + 3719 : 0; + 3720 : 0; + 3721 : 0; + 3722 : 0; + 3723 : 0; + 3724 : 0; + 3725 : 0; + 3726 : 0; + 3727 : 0; + 3728 : 0; + 3729 : 0; + 3730 : 0; + 3731 : 0; + 3732 : 0; + 3733 : 0; + 3734 : 0; + 3735 : 0; + 3736 : 0; + 3737 : 0; + 3738 : 0; + 3739 : 0; + 3740 : 0; + 3741 : 0; + 3742 : 0; + 3743 : 0; + 3744 : 0; + 3745 : 0; + 3746 : 0; + 3747 : 0; + 3748 : 0; + 3749 : 0; + 3750 : 0; + 3751 : 0; + 3752 : 0; + 3753 : 0; + 3754 : 0; + 3755 : 0; + 3756 : 0; + 3757 : 0; + 3758 : 0; + 3759 : 0; + 3760 : 0; + 3761 : 0; + 3762 : 0; + 3763 : 0; + 3764 : 0; + 3765 : 0; + 3766 : 0; + 3767 : 0; + 3768 : 0; + 3769 : 0; + 3770 : 0; + 3771 : 0; + 3772 : 0; + 3773 : 0; + 3774 : 0; + 3775 : 0; + 3776 : 0; + 3777 : 0; + 3778 : 0; + 3779 : 0; + 3780 : 0; + 3781 : 0; + 3782 : 0; + 3783 : 0; + 3784 : 0; + 3785 : 0; + 3786 : 0; + 3787 : 0; + 3788 : 0; + 3789 : 0; + 3790 : 0; + 3791 : 0; + 3792 : 0; + 3793 : 0; + 3794 : 0; + 3795 : 0; + 3796 : 0; + 3797 : 0; + 3798 : 0; + 3799 : 0; + 3800 : 0; + 3801 : 0; + 3802 : 0; + 3803 : 0; + 3804 : 0; + 3805 : 0; + 3806 : 0; + 3807 : 0; + 3808 : 0; + 3809 : 3; + 3810 : 3; + 3811 : 3; + 3812 : 3; + 3813 : 3; + 3814 : 3; + 3815 : 3; + 3816 : 3; + 3817 : 3; + 3818 : 0; + 3819 : 0; + 3820 : 0; + 3821 : 0; + 3822 : 0; + 3823 : 0; + 3824 : 0; + 3825 : 0; + 3826 : 0; + 3827 : 0; + 3828 : 0; + 3829 : 0; + 3830 : 0; + 3831 : 0; + 3832 : 0; + 3833 : 0; + 3834 : 0; + 3835 : 0; + 3836 : 0; + 3837 : 0; + 3838 : 0; + 3839 : 0; + 3840 : 0; + 3841 : 0; + 3842 : 0; + 3843 : 0; + 3844 : 0; + 3845 : 0; + 3846 : 0; + 3847 : 0; + 3848 : 0; + 3849 : 0; + 3850 : 0; + 3851 : 0; + 3852 : 0; + 3853 : 0; + 3854 : 0; + 3855 : 0; + 3856 : 0; + 3857 : 0; + 3858 : 0; + 3859 : 0; + 3860 : 0; + 3861 : 0; + 3862 : 0; + 3863 : 0; + 3864 : 0; + 3865 : 0; + 3866 : 0; + 3867 : 0; + 3868 : 0; + 3869 : 0; + 3870 : 0; + 3871 : 0; + 3872 : 0; + 3873 : 0; + 3874 : 0; + 3875 : 0; + 3876 : 0; + 3877 : 0; + 3878 : 0; + 3879 : 0; + 3880 : 0; + 3881 : 0; + 3882 : 0; + 3883 : 0; + 3884 : 0; + 3885 : 0; + 3886 : 0; + 3887 : 0; + 3888 : 0; + 3889 : 0; + 3890 : 0; + 3891 : 0; + 3892 : 0; + 3893 : 0; + 3894 : 0; + 3895 : 0; + 3896 : 0; + 3897 : 0; + 3898 : 0; + 3899 : 0; + 3900 : 0; + 3901 : 0; + 3902 : 0; + 3903 : 0; + 3904 : 0; + 3905 : 0; + 3906 : 0; + 3907 : 0; + 3908 : 0; + 3909 : 0; + 3910 : 0; + 3911 : 0; + 3912 : 0; + 3913 : 0; + 3914 : 0; + 3915 : 0; + 3916 : 0; + 3917 : 0; + 3918 : 0; + 3919 : 0; + 3920 : 0; + 3921 : 0; + 3922 : 0; + 3923 : 0; + 3924 : 0; + 3925 : 0; + 3926 : 0; + 3927 : 0; + 3928 : 0; + 3929 : 0; + 3930 : 0; + 3931 : 0; + 3932 : 0; + 3933 : 0; + 3934 : 0; + 3935 : 0; + 3936 : 0; + 3937 : 0; + 3938 : 3; + 3939 : 3; + 3940 : 0; + 3941 : 0; + 3942 : 0; + 3943 : 0; + 3944 : 0; + 3945 : 0; + 3946 : 0; + 3947 : 0; + 3948 : 0; + 3949 : 0; + 3950 : 0; + 3951 : 0; + 3952 : 0; + 3953 : 0; + 3954 : 0; + 3955 : 0; + 3956 : 0; + 3957 : 0; + 3958 : 0; + 3959 : 0; + 3960 : 0; + 3961 : 0; + 3962 : 0; + 3963 : 0; + 3964 : 0; + 3965 : 0; + 3966 : 0; + 3967 : 0; + [3968..3999] : 0; +END; \ No newline at end of file diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_plane.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_plane.v new file mode 100644 index 00000000..45bd108d --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_plane.v @@ -0,0 +1,161 @@ +// megafunction wizard: %ROM: 1-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: sprite_plane.v +// Megafunction Name(s): +// altsyncram +// +// 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 sprite_plane ( + address, + clock, + q); + + input [11:0] address; + input clock; + output [3:0] q; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [3:0] sub_wire0; + wire [3:0] q = sub_wire0[3:0]; + + altsyncram altsyncram_component ( + .address_a (address), + .clock0 (clock), + .q_a (sub_wire0), + .aclr0 (1'b0), + .aclr1 (1'b0), + .address_b (1'b1), + .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_a ({4{1'b1}}), + .data_b (1'b1), + .eccstatus (), + .q_b (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_a (1'b0), + .wren_b (1'b0)); + defparam + altsyncram_component.address_aclr_a = "NONE", + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", + altsyncram_component.init_file = "sprite_plane.mif", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 4000, + altsyncram_component.operation_mode = "ROM", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_reg_a = "CLOCK0", + altsyncram_component.ram_block_type = "M9K", + altsyncram_component.widthad_a = 12, + altsyncram_component.width_a = 4, + altsyncram_component.width_byteena_a = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +// Retrieval info: PRIVATE: AclrByte NUMERIC "0" +// Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: Clken NUMERIC "0" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "sprite_plane.mif" +// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "4000" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "2" +// Retrieval info: PRIVATE: RegAddr NUMERIC "1" +// Retrieval info: PRIVATE: RegOutput NUMERIC "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: SingleClock NUMERIC "1" +// Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +// Retrieval info: PRIVATE: WidthAddr NUMERIC "12" +// Retrieval info: PRIVATE: WidthData NUMERIC "4" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: INIT_FILE STRING "sprite_plane.mif" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "4000" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +// Retrieval info: CONSTANT: RAM_BLOCK_TYPE STRING "M9K" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "12" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "4" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: USED_PORT: address 0 0 12 0 INPUT NODEFVAL "address[11..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: q 0 0 4 0 OUTPUT NODEFVAL "q[3..0]" +// Retrieval info: CONNECT: @address_a 0 0 12 0 address 0 0 12 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: q 0 0 4 0 @q_a 0 0 4 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_plane.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_plane.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_plane.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_plane.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_plane_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_plane_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_player.mif b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_player.mif new file mode 100644 index 00000000..391e11b0 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_player.mif @@ -0,0 +1,5514 @@ +WIDTH=4; +DEPTH=5600; + +ADDRESS_RADIX=UNS; +DATA_RADIX=HEX; + +CONTENT BEGIN + + 0 : 0; + 1 : 0; + 2 : 0; + 3 : 0; + 4 : 0; + 5 : 0; + 6 : 0; + 7 : 0; + 8 : 0; + 9 : 0; + 10 : 0; + 11 : 0; + 12 : 0; + 13 : 0; + 14 : 0; + 15 : 0; + 16 : 0; + 17 : 0; + 18 : 0; + 19 : 0; + 20 : 0; + 21 : 0; + 22 : 0; + 23 : 0; + 24 : 0; + 25 : 0; + 26 : 0; + 27 : 0; + 28 : 0; + 29 : 0; + 30 : 0; + 31 : 3; + 32 : 0; + 33 : 0; + 34 : 0; + 35 : 0; + 36 : 0; + 37 : 0; + 38 : 0; + 39 : 0; + 40 : 0; + 41 : 0; + 42 : 0; + 43 : 0; + 44 : 0; + 45 : 0; + 46 : 0; + 47 : 0; + 48 : 0; + 49 : 0; + 50 : 0; + 51 : 0; + 52 : 0; + 53 : 0; + 54 : 0; + 55 : 0; + 56 : 0; + 57 : 0; + 58 : 0; + 59 : 0; + 60 : 0; + 61 : 0; + 62 : 0; + 63 : 0; + 64 : 0; + 65 : 0; + 66 : 0; + 67 : 0; + 68 : 0; + 69 : 0; + 70 : 0; + 71 : 0; + 72 : 0; + 73 : 0; + 74 : 0; + 75 : 0; + 76 : 0; + 77 : 0; + 78 : 0; + 79 : 0; + 80 : 0; + 81 : 0; + 82 : 0; + 83 : 0; + 84 : 0; + 85 : 0; + 86 : 0; + 87 : 0; + 88 : 0; + 89 : 0; + 90 : 0; + 91 : 0; + 92 : 0; + 93 : 0; + 94 : 3; + 95 : 3; + 96 : 3; + 97 : 0; + 98 : 0; + 99 : 0; + 100 : 0; + 101 : 0; + 102 : 0; + 103 : 0; + 104 : 0; + 105 : 0; + 106 : 0; + 107 : 0; + 108 : 0; + 109 : 0; + 110 : 0; + 111 : 0; + 112 : 0; + 113 : 0; + 114 : 0; + 115 : 0; + 116 : 0; + 117 : 0; + 118 : 0; + 119 : 0; + 120 : 0; + 121 : 0; + 122 : 0; + 123 : 0; + 124 : 0; + 125 : 0; + 126 : 0; + 127 : 0; + 128 : 0; + 129 : 0; + 130 : 0; + 131 : 0; + 132 : 0; + 133 : 0; + 134 : 0; + 135 : 0; + 136 : 0; + 137 : 0; + 138 : 0; + 139 : 0; + 140 : 0; + 141 : 0; + 142 : 0; + 143 : 0; + 144 : 0; + 145 : 0; + 146 : 0; + 147 : 0; + 148 : 0; + 149 : 0; + 150 : 0; + 151 : 0; + 152 : 0; + 153 : 0; + 154 : 0; + 155 : 0; + 156 : 0; + 157 : 0; + 158 : 3; + 159 : 3; + 160 : 3; + 161 : 0; + 162 : 0; + 163 : 0; + 164 : 0; + 165 : 0; + 166 : 0; + 167 : 0; + 168 : 0; + 169 : 0; + 170 : 0; + 171 : 0; + 172 : 0; + 173 : 0; + 174 : 0; + 175 : 0; + 176 : 0; + 177 : 0; + 178 : 0; + 179 : 0; + 180 : 0; + 181 : 0; + 182 : 0; + 183 : 0; + 184 : 0; + 185 : 0; + 186 : 0; + 187 : 0; + 188 : 0; + 189 : 0; + 190 : 0; + 191 : 0; + 192 : 0; + 193 : 0; + 194 : 0; + 195 : 0; + 196 : 0; + 197 : 0; + 198 : 0; + 199 : 0; + 200 : 0; + 201 : 0; + 202 : 0; + 203 : 0; + 204 : 0; + 205 : 0; + 206 : 0; + 207 : 0; + 208 : 0; + 209 : 0; + 210 : 0; + 211 : 0; + 212 : 0; + 213 : 0; + 214 : 0; + 215 : 0; + 216 : 0; + 217 : 0; + 218 : 0; + 219 : 0; + 220 : 0; + 221 : 3; + 222 : 3; + 223 : 3; + 224 : 3; + 225 : 3; + 226 : 0; + 227 : 0; + 228 : 0; + 229 : 0; + 230 : 0; + 231 : 0; + 232 : 0; + 233 : 0; + 234 : 0; + 235 : 0; + 236 : 0; + 237 : 0; + 238 : 0; + 239 : 0; + 240 : 0; + 241 : 0; + 242 : 0; + 243 : 0; + 244 : 0; + 245 : 0; + 246 : 0; + 247 : 0; + 248 : 0; + 249 : 0; + 250 : 0; + 251 : 0; + 252 : 0; + 253 : 0; + 254 : 0; + 255 : 0; + 256 : 0; + 257 : 0; + 258 : 0; + 259 : 0; + 260 : 0; + 261 : 0; + 262 : 0; + 263 : 0; + 264 : 0; + 265 : 0; + 266 : 0; + 267 : 0; + 268 : 0; + 269 : 0; + 270 : 0; + 271 : 0; + 272 : 0; + 273 : 0; + 274 : 0; + 275 : 0; + 276 : 0; + 277 : 0; + 278 : 0; + 279 : 0; + 280 : 0; + 281 : 0; + 282 : 0; + 283 : 0; + 284 : 0; + 285 : 3; + 286 : 3; + 287 : 3; + 288 : 3; + 289 : 3; + 290 : 0; + 291 : 0; + 292 : 0; + 293 : 0; + 294 : 0; + 295 : 0; + 296 : 0; + 297 : 0; + 298 : 0; + 299 : 0; + 300 : 0; + 301 : 0; + 302 : 0; + 303 : 0; + 304 : 0; + 305 : 0; + 306 : 0; + 307 : 0; + 308 : 0; + 309 : 0; + 310 : 0; + 311 : 0; + 312 : 0; + 313 : 0; + 314 : 0; + 315 : 0; + 316 : 0; + 317 : 0; + 318 : 0; + 319 : 0; + 320 : 0; + 321 : 0; + 322 : 0; + 323 : 0; + 324 : 0; + 325 : 0; + 326 : 0; + 327 : 0; + 328 : 0; + 329 : 0; + 330 : 0; + 331 : 0; + 332 : 0; + 333 : 0; + 334 : 0; + 335 : 0; + 336 : 0; + 337 : 0; + 338 : 0; + 339 : 0; + 340 : 0; + 341 : 0; + 342 : 0; + 343 : 0; + 344 : 0; + 345 : 0; + 346 : 0; + 347 : 0; + 348 : 0; + 349 : 3; + 350 : 3; + 351 : 3; + 352 : 3; + 353 : 3; + 354 : 0; + 355 : 0; + 356 : 0; + 357 : 0; + 358 : 0; + 359 : 0; + 360 : 0; + 361 : 0; + 362 : 0; + 363 : 0; + 364 : 0; + 365 : 0; + 366 : 0; + 367 : 0; + 368 : 0; + 369 : 0; + 370 : 0; + 371 : 0; + 372 : 0; + 373 : 0; + 374 : 0; + 375 : 0; + 376 : 0; + 377 : 0; + 378 : 0; + 379 : 0; + 380 : 0; + 381 : 0; + 382 : 0; + 383 : 0; + 384 : 0; + 385 : 0; + 386 : 0; + 387 : 0; + 388 : 0; + 389 : 0; + 390 : 0; + 391 : 0; + 392 : 0; + 393 : 0; + 394 : 0; + 395 : 0; + 396 : 0; + 397 : 0; + 398 : 0; + 399 : 0; + 400 : 0; + 401 : 0; + 402 : 0; + 403 : 0; + 404 : 0; + 405 : 0; + 406 : 0; + 407 : 0; + 408 : 0; + 409 : 0; + 410 : 0; + 411 : 0; + 412 : 0; + 413 : 3; + 414 : 3; + 415 : 3; + 416 : 3; + 417 : 3; + 418 : 0; + 419 : 0; + 420 : 0; + 421 : 0; + 422 : 0; + 423 : 0; + 424 : 0; + 425 : 0; + 426 : 0; + 427 : 0; + 428 : 0; + 429 : 0; + 430 : 0; + 431 : 0; + 432 : 0; + 433 : 0; + 434 : 0; + 435 : 0; + 436 : 0; + 437 : 0; + 438 : 0; + 439 : 0; + 440 : 0; + 441 : 0; + 442 : 0; + 443 : 0; + 444 : 0; + 445 : 0; + 446 : 0; + 447 : 0; + 448 : 0; + 449 : 0; + 450 : 0; + 451 : 0; + 452 : 0; + 453 : 0; + 454 : 0; + 455 : 0; + 456 : 0; + 457 : 0; + 458 : 0; + 459 : 0; + 460 : 0; + 461 : 0; + 462 : 0; + 463 : 0; + 464 : 0; + 465 : 0; + 466 : 0; + 467 : 0; + 468 : 0; + 469 : 0; + 470 : 0; + 471 : 0; + 472 : 0; + 473 : 0; + 474 : 0; + 475 : 0; + 476 : 0; + 477 : 3; + 478 : 3; + 479 : 3; + 480 : 3; + 481 : 3; + 482 : 0; + 483 : 0; + 484 : 0; + 485 : 0; + 486 : 0; + 487 : 0; + 488 : 0; + 489 : 0; + 490 : 0; + 491 : 0; + 492 : 0; + 493 : 0; + 494 : 0; + 495 : 0; + 496 : 0; + 497 : 0; + 498 : 0; + 499 : 0; + 500 : 0; + 501 : 0; + 502 : 0; + 503 : 0; + 504 : 0; + 505 : 0; + 506 : 0; + 507 : 0; + 508 : 0; + 509 : 0; + 510 : 0; + 511 : 0; + 512 : 0; + 513 : 0; + 514 : 0; + 515 : 0; + 516 : 0; + 517 : 0; + 518 : 0; + 519 : 0; + 520 : 0; + 521 : 0; + 522 : 0; + 523 : 0; + 524 : 0; + 525 : 0; + 526 : 0; + 527 : 0; + 528 : 0; + 529 : 0; + 530 : 0; + 531 : 0; + 532 : 0; + 533 : 0; + 534 : 0; + 535 : 0; + 536 : 0; + 537 : 0; + 538 : 0; + 539 : 0; + 540 : 3; + 541 : 3; + 542 : 3; + 543 : 3; + 544 : 7; + 545 : 3; + 546 : 3; + 547 : 0; + 548 : 0; + 549 : 0; + 550 : 0; + 551 : 0; + 552 : 0; + 553 : 0; + 554 : 0; + 555 : 0; + 556 : 0; + 557 : 0; + 558 : 0; + 559 : 0; + 560 : 0; + 561 : 0; + 562 : 0; + 563 : 0; + 564 : 0; + 565 : 0; + 566 : 0; + 567 : 0; + 568 : 0; + 569 : 0; + 570 : 0; + 571 : 0; + 572 : 0; + 573 : 0; + 574 : 0; + 575 : 0; + 576 : 0; + 577 : 0; + 578 : 0; + 579 : 0; + 580 : 0; + 581 : 0; + 582 : 0; + 583 : 0; + 584 : 0; + 585 : 0; + 586 : 0; + 587 : 0; + 588 : 0; + 589 : 0; + 590 : 0; + 591 : 0; + 592 : 0; + 593 : 0; + 594 : 0; + 595 : 0; + 596 : 0; + 597 : 0; + 598 : 0; + 599 : 0; + 600 : 0; + 601 : 0; + 602 : 0; + 603 : 0; + 604 : 3; + 605 : 3; + 606 : 3; + 607 : 3; + 608 : 7; + 609 : 7; + 610 : 3; + 611 : 0; + 612 : 0; + 613 : 0; + 614 : 0; + 615 : 0; + 616 : 0; + 617 : 0; + 618 : 0; + 619 : 0; + 620 : 0; + 621 : 0; + 622 : 0; + 623 : 0; + 624 : 0; + 625 : 0; + 626 : 0; + 627 : 0; + 628 : 0; + 629 : 0; + 630 : 0; + 631 : 0; + 632 : 0; + 633 : 0; + 634 : 0; + 635 : 0; + 636 : 0; + 637 : 0; + 638 : 0; + 639 : 0; + 640 : 0; + 641 : 0; + 642 : 0; + 643 : 0; + 644 : 0; + 645 : 0; + 646 : 0; + 647 : 0; + 648 : 0; + 649 : 0; + 650 : 0; + 651 : 0; + 652 : 0; + 653 : 0; + 654 : 0; + 655 : 0; + 656 : 0; + 657 : 0; + 658 : 0; + 659 : 0; + 660 : 0; + 661 : 0; + 662 : 0; + 663 : 0; + 664 : 0; + 665 : 0; + 666 : 0; + 667 : 0; + 668 : 3; + 669 : 3; + 670 : 3; + 671 : 3; + 672 : 7; + 673 : 7; + 674 : 3; + 675 : 0; + 676 : 0; + 677 : 0; + 678 : 0; + 679 : 0; + 680 : 0; + 681 : 0; + 682 : 0; + 683 : 0; + 684 : 0; + 685 : 0; + 686 : 0; + 687 : 0; + 688 : 0; + 689 : 0; + 690 : 0; + 691 : 0; + 692 : 0; + 693 : 0; + 694 : 0; + 695 : 0; + 696 : 0; + 697 : 0; + 698 : 0; + 699 : 0; + 700 : 0; + 701 : 0; + 702 : 0; + 703 : 0; + 704 : 0; + 705 : 0; + 706 : 0; + 707 : 0; + 708 : 0; + 709 : 0; + 710 : 0; + 711 : 0; + 712 : 0; + 713 : 0; + 714 : 0; + 715 : 0; + 716 : 0; + 717 : 0; + 718 : 0; + 719 : 0; + 720 : 0; + 721 : 0; + 722 : 0; + 723 : 0; + 724 : 0; + 725 : 0; + 726 : 0; + 727 : 0; + 728 : 0; + 729 : 0; + 730 : 0; + 731 : 0; + 732 : 3; + 733 : 3; + 734 : 3; + 735 : 7; + 736 : 7; + 737 : 7; + 738 : 3; + 739 : 0; + 740 : 0; + 741 : 0; + 742 : 0; + 743 : 0; + 744 : 0; + 745 : 0; + 746 : 0; + 747 : 0; + 748 : 0; + 749 : 0; + 750 : 0; + 751 : 0; + 752 : 0; + 753 : 0; + 754 : 0; + 755 : 0; + 756 : 0; + 757 : 0; + 758 : 0; + 759 : 0; + 760 : 0; + 761 : 0; + 762 : 0; + 763 : 0; + 764 : 0; + 765 : 0; + 766 : 0; + 767 : 0; + 768 : 0; + 769 : 0; + 770 : 0; + 771 : 0; + 772 : 0; + 773 : 0; + 774 : 0; + 775 : 0; + 776 : 0; + 777 : 0; + 778 : 0; + 779 : 0; + 780 : 0; + 781 : 0; + 782 : 0; + 783 : 0; + 784 : 0; + 785 : 0; + 786 : 0; + 787 : 0; + 788 : 0; + 789 : 0; + 790 : 0; + 791 : 0; + 792 : 0; + 793 : 0; + 794 : 0; + 795 : 0; + 796 : 3; + 797 : 3; + 798 : 3; + 799 : 7; + 800 : 7; + 801 : 7; + 802 : 3; + 803 : 0; + 804 : 0; + 805 : 0; + 806 : 0; + 807 : 0; + 808 : 0; + 809 : 0; + 810 : 0; + 811 : 0; + 812 : 0; + 813 : 0; + 814 : 0; + 815 : 0; + 816 : 0; + 817 : 0; + 818 : 0; + 819 : 0; + 820 : 0; + 821 : 0; + 822 : 0; + 823 : 0; + 824 : 0; + 825 : 0; + 826 : 0; + 827 : 0; + 828 : 0; + 829 : 0; + 830 : 0; + 831 : 0; + 832 : 0; + 833 : 0; + 834 : 0; + 835 : 0; + 836 : 0; + 837 : 0; + 838 : 0; + 839 : 0; + 840 : 0; + 841 : 0; + 842 : 0; + 843 : 0; + 844 : 0; + 845 : 0; + 846 : 0; + 847 : 0; + 848 : 0; + 849 : 0; + 850 : 0; + 851 : 0; + 852 : 0; + 853 : 0; + 854 : 0; + 855 : 0; + 856 : 0; + 857 : 0; + 858 : 0; + 859 : 0; + 860 : 3; + 861 : 3; + 862 : 3; + 863 : 7; + 864 : 7; + 865 : 7; + 866 : 3; + 867 : 0; + 868 : 0; + 869 : 0; + 870 : 0; + 871 : 0; + 872 : 0; + 873 : 0; + 874 : 0; + 875 : 0; + 876 : 0; + 877 : 0; + 878 : 0; + 879 : 0; + 880 : 0; + 881 : 0; + 882 : 0; + 883 : 0; + 884 : 0; + 885 : 0; + 886 : 0; + 887 : 0; + 888 : 0; + 889 : 0; + 890 : 0; + 891 : 0; + 892 : 0; + 893 : 0; + 894 : 0; + 895 : 0; + 896 : 0; + 897 : 0; + 898 : 0; + 899 : 0; + 900 : 0; + 901 : 0; + 902 : 0; + 903 : 0; + 904 : 0; + 905 : 0; + 906 : 0; + 907 : 0; + 908 : 0; + 909 : 0; + 910 : 0; + 911 : 0; + 912 : 0; + 913 : 0; + 914 : 0; + 915 : 0; + 916 : 0; + 917 : 0; + 918 : 0; + 919 : 0; + 920 : 0; + 921 : 0; + 922 : 0; + 923 : 0; + 924 : 3; + 925 : 3; + 926 : 3; + 927 : 7; + 928 : 7; + 929 : 7; + 930 : 7; + 931 : 0; + 932 : 0; + 933 : 0; + 934 : 0; + 935 : 0; + 936 : 0; + 937 : 0; + 938 : 0; + 939 : 0; + 940 : 0; + 941 : 0; + 942 : 0; + 943 : 0; + 944 : 0; + 945 : 0; + 946 : 0; + 947 : 0; + 948 : 0; + 949 : 0; + 950 : 0; + 951 : 0; + 952 : 0; + 953 : 0; + 954 : 0; + 955 : 0; + 956 : 0; + 957 : 0; + 958 : 0; + 959 : 0; + 960 : 0; + 961 : 0; + 962 : 0; + 963 : 0; + 964 : 0; + 965 : 0; + 966 : 0; + 967 : 0; + 968 : 0; + 969 : 0; + 970 : 0; + 971 : 0; + 972 : 0; + 973 : 0; + 974 : 0; + 975 : 0; + 976 : 0; + 977 : 0; + 978 : 0; + 979 : 0; + 980 : 0; + 981 : 0; + 982 : 0; + 983 : 0; + 984 : 0; + 985 : 0; + 986 : 0; + 987 : 0; + 988 : 3; + 989 : 3; + 990 : 3; + 991 : 7; + 992 : 7; + 993 : 7; + 994 : 3; + 995 : 0; + 996 : 0; + 997 : 0; + 998 : 0; + 999 : 0; + 1000 : 0; + 1001 : 0; + 1002 : 0; + 1003 : 0; + 1004 : 0; + 1005 : 0; + 1006 : 0; + 1007 : 0; + 1008 : 0; + 1009 : 0; + 1010 : 0; + 1011 : 0; + 1012 : 0; + 1013 : 0; + 1014 : 0; + 1015 : 0; + 1016 : 0; + 1017 : 0; + 1018 : 0; + 1019 : 0; + 1020 : 0; + 1021 : 0; + 1022 : 0; + 1023 : 0; + 1024 : 0; + 1025 : 0; + 1026 : 0; + 1027 : 0; + 1028 : 0; + 1029 : 0; + 1030 : 0; + 1031 : 0; + 1032 : 0; + 1033 : 0; + 1034 : 0; + 1035 : 0; + 1036 : 0; + 1037 : 0; + 1038 : 0; + 1039 : 0; + 1040 : 0; + 1041 : 0; + 1042 : 0; + 1043 : 0; + 1044 : 0; + 1045 : 0; + 1046 : 0; + 1047 : 0; + 1048 : 0; + 1049 : 0; + 1050 : 0; + 1051 : 0; + 1052 : 3; + 1053 : 3; + 1054 : 3; + 1055 : 7; + 1056 : 7; + 1057 : 7; + 1058 : 3; + 1059 : 0; + 1060 : 0; + 1061 : 0; + 1062 : 0; + 1063 : 0; + 1064 : 0; + 1065 : 0; + 1066 : 0; + 1067 : 0; + 1068 : 0; + 1069 : 0; + 1070 : 0; + 1071 : 0; + 1072 : 0; + 1073 : 0; + 1074 : 0; + 1075 : 0; + 1076 : 0; + 1077 : 0; + 1078 : 0; + 1079 : 0; + 1080 : 0; + 1081 : 0; + 1082 : 0; + 1083 : 0; + 1084 : 0; + 1085 : 0; + 1086 : 0; + 1087 : 0; + 1088 : 0; + 1089 : 0; + 1090 : 0; + 1091 : 0; + 1092 : 0; + 1093 : 0; + 1094 : 0; + 1095 : 0; + 1096 : 0; + 1097 : 0; + 1098 : 0; + 1099 : 0; + 1100 : 0; + 1101 : 0; + 1102 : 0; + 1103 : 0; + 1104 : 0; + 1105 : 0; + 1106 : 0; + 1107 : 0; + 1108 : 0; + 1109 : 0; + 1110 : 0; + 1111 : 0; + 1112 : 0; + 1113 : 0; + 1114 : 0; + 1115 : 0; + 1116 : 3; + 1117 : 3; + 1118 : 3; + 1119 : 3; + 1120 : 3; + 1121 : 3; + 1122 : 3; + 1123 : 0; + 1124 : 0; + 1125 : 0; + 1126 : 0; + 1127 : 0; + 1128 : 0; + 1129 : 0; + 1130 : 0; + 1131 : 0; + 1132 : 0; + 1133 : 0; + 1134 : 0; + 1135 : 0; + 1136 : 0; + 1137 : 0; + 1138 : 0; + 1139 : 0; + 1140 : 0; + 1141 : 0; + 1142 : 0; + 1143 : 0; + 1144 : 0; + 1145 : 0; + 1146 : 0; + 1147 : 0; + 1148 : 0; + 1149 : 0; + 1150 : 0; + 1151 : 0; + 1152 : 0; + 1153 : 0; + 1154 : 0; + 1155 : 0; + 1156 : 0; + 1157 : 0; + 1158 : 0; + 1159 : 0; + 1160 : 0; + 1161 : 0; + 1162 : 0; + 1163 : 0; + 1164 : 0; + 1165 : 0; + 1166 : 0; + 1167 : 0; + 1168 : 0; + 1169 : 0; + 1170 : 0; + 1171 : 0; + 1172 : 0; + 1173 : 0; + 1174 : 0; + 1175 : 0; + 1176 : 0; + 1177 : 0; + 1178 : 0; + 1179 : 0; + 1180 : 3; + 1181 : 3; + 1182 : 3; + 1183 : 3; + 1184 : 3; + 1185 : 3; + 1186 : 3; + 1187 : 0; + 1188 : 0; + 1189 : 0; + 1190 : 0; + 1191 : 0; + 1192 : 0; + 1193 : 0; + 1194 : 0; + 1195 : 0; + 1196 : 0; + 1197 : 0; + 1198 : 0; + 1199 : 0; + 1200 : 0; + 1201 : 0; + 1202 : 0; + 1203 : 0; + 1204 : 0; + 1205 : 0; + 1206 : 0; + 1207 : 0; + 1208 : 0; + 1209 : 0; + 1210 : 0; + 1211 : 0; + 1212 : 0; + 1213 : 0; + 1214 : 0; + 1215 : 0; + 1216 : 0; + 1217 : 0; + 1218 : 0; + 1219 : 0; + 1220 : 0; + 1221 : 0; + 1222 : 0; + 1223 : 0; + 1224 : 0; + 1225 : 0; + 1226 : 0; + 1227 : 0; + 1228 : 0; + 1229 : 0; + 1230 : 0; + 1231 : 0; + 1232 : 0; + 1233 : 0; + 1234 : 0; + 1235 : 0; + 1236 : 0; + 1237 : 0; + 1238 : 0; + 1239 : 0; + 1240 : 0; + 1241 : 0; + 1242 : 0; + 1243 : 0; + 1244 : 3; + 1245 : 3; + 1246 : 3; + 1247 : 3; + 1248 : 3; + 1249 : 3; + 1250 : 3; + 1251 : 0; + 1252 : 0; + 1253 : 0; + 1254 : 0; + 1255 : 0; + 1256 : 0; + 1257 : 0; + 1258 : 0; + 1259 : 0; + 1260 : 0; + 1261 : 0; + 1262 : 0; + 1263 : 0; + 1264 : 0; + 1265 : 0; + 1266 : 0; + 1267 : 0; + 1268 : 0; + 1269 : 0; + 1270 : 0; + 1271 : 0; + 1272 : 0; + 1273 : 0; + 1274 : 0; + 1275 : 0; + 1276 : 0; + 1277 : 0; + 1278 : 0; + 1279 : 0; + 1280 : 0; + 1281 : 0; + 1282 : 0; + 1283 : 0; + 1284 : 0; + 1285 : 0; + 1286 : 0; + 1287 : 0; + 1288 : 0; + 1289 : 0; + 1290 : 0; + 1291 : 0; + 1292 : 0; + 1293 : 0; + 1294 : 0; + 1295 : 0; + 1296 : 0; + 1297 : 0; + 1298 : 0; + 1299 : 0; + 1300 : 0; + 1301 : 0; + 1302 : 0; + 1303 : 0; + 1304 : 0; + 1305 : 0; + 1306 : 0; + 1307 : 0; + 1308 : 3; + 1309 : 3; + 1310 : 3; + 1311 : 3; + 1312 : 3; + 1313 : 3; + 1314 : 3; + 1315 : 0; + 1316 : 0; + 1317 : 0; + 1318 : 0; + 1319 : 0; + 1320 : 0; + 1321 : 0; + 1322 : 0; + 1323 : 0; + 1324 : 0; + 1325 : 0; + 1326 : 0; + 1327 : 0; + 1328 : 0; + 1329 : 0; + 1330 : 0; + 1331 : 0; + 1332 : 0; + 1333 : 0; + 1334 : 0; + 1335 : 0; + 1336 : 0; + 1337 : 0; + 1338 : 0; + 1339 : 0; + 1340 : 0; + 1341 : 0; + 1342 : 0; + 1343 : 0; + 1344 : 0; + 1345 : 0; + 1346 : 0; + 1347 : 0; + 1348 : 0; + 1349 : 0; + 1350 : 0; + 1351 : 0; + 1352 : 0; + 1353 : 0; + 1354 : 0; + 1355 : 0; + 1356 : 0; + 1357 : 0; + 1358 : 0; + 1359 : 0; + 1360 : 0; + 1361 : 0; + 1362 : 0; + 1363 : 0; + 1364 : 0; + 1365 : 0; + 1366 : 0; + 1367 : 0; + 1368 : 0; + 1369 : 0; + 1370 : 3; + 1371 : 7; + 1372 : 3; + 1373 : 3; + 1374 : 3; + 1375 : 3; + 1376 : 3; + 1377 : 3; + 1378 : 3; + 1379 : 7; + 1380 : 7; + 1381 : 0; + 1382 : 0; + 1383 : 0; + 1384 : 0; + 1385 : 0; + 1386 : 0; + 1387 : 0; + 1388 : 0; + 1389 : 0; + 1390 : 0; + 1391 : 0; + 1392 : 0; + 1393 : 0; + 1394 : 0; + 1395 : 0; + 1396 : 0; + 1397 : 0; + 1398 : 0; + 1399 : 0; + 1400 : 0; + 1401 : 0; + 1402 : 0; + 1403 : 0; + 1404 : 0; + 1405 : 0; + 1406 : 0; + 1407 : 0; + 1408 : 0; + 1409 : 0; + 1410 : 0; + 1411 : 0; + 1412 : 0; + 1413 : 0; + 1414 : 0; + 1415 : 0; + 1416 : 0; + 1417 : 0; + 1418 : 0; + 1419 : 0; + 1420 : 0; + 1421 : 0; + 1422 : 0; + 1423 : 0; + 1424 : 0; + 1425 : 0; + 1426 : 0; + 1427 : 0; + 1428 : 0; + 1429 : 0; + 1430 : 0; + 1431 : 0; + 1432 : 0; + 1433 : 3; + 1434 : 3; + 1435 : 7; + 1436 : 3; + 1437 : 3; + 1438 : 3; + 1439 : 3; + 1440 : 3; + 1441 : 3; + 1442 : 3; + 1443 : 7; + 1444 : 7; + 1445 : 7; + 1446 : 0; + 1447 : 0; + 1448 : 0; + 1449 : 0; + 1450 : 0; + 1451 : 0; + 1452 : 0; + 1453 : 0; + 1454 : 0; + 1455 : 0; + 1456 : 0; + 1457 : 0; + 1458 : 0; + 1459 : 0; + 1460 : 0; + 1461 : 0; + 1462 : 0; + 1463 : 0; + 1464 : 0; + 1465 : 0; + 1466 : 0; + 1467 : 0; + 1468 : 0; + 1469 : 0; + 1470 : 0; + 1471 : 0; + 1472 : 0; + 1473 : 0; + 1474 : 0; + 1475 : 0; + 1476 : 0; + 1477 : 0; + 1478 : 0; + 1479 : 0; + 1480 : 0; + 1481 : 0; + 1482 : 0; + 1483 : 0; + 1484 : 0; + 1485 : 0; + 1486 : 0; + 1487 : 0; + 1488 : 0; + 1489 : 0; + 1490 : 0; + 1491 : 0; + 1492 : 0; + 1493 : 0; + 1494 : 0; + 1495 : 0; + 1496 : 3; + 1497 : 3; + 1498 : 7; + 1499 : 7; + 1500 : 3; + 1501 : 3; + 1502 : 3; + 1503 : 3; + 1504 : 3; + 1505 : 3; + 1506 : 3; + 1507 : 3; + 1508 : 3; + 1509 : 7; + 1510 : 3; + 1511 : 0; + 1512 : 0; + 1513 : 0; + 1514 : 0; + 1515 : 0; + 1516 : 0; + 1517 : 0; + 1518 : 0; + 1519 : 0; + 1520 : 0; + 1521 : 0; + 1522 : 0; + 1523 : 0; + 1524 : 0; + 1525 : 0; + 1526 : 0; + 1527 : 0; + 1528 : 0; + 1529 : 0; + 1530 : 0; + 1531 : 0; + 1532 : 0; + 1533 : 0; + 1534 : 0; + 1535 : 0; + 1536 : 0; + 1537 : 0; + 1538 : 0; + 1539 : 0; + 1540 : 0; + 1541 : 0; + 1542 : 0; + 1543 : 0; + 1544 : 0; + 1545 : 0; + 1546 : 0; + 1547 : 0; + 1548 : 0; + 1549 : 0; + 1550 : 0; + 1551 : 0; + 1552 : 0; + 1553 : 0; + 1554 : 0; + 1555 : 0; + 1556 : 0; + 1557 : 0; + 1558 : 0; + 1559 : 0; + 1560 : 3; + 1561 : 7; + 1562 : 7; + 1563 : 7; + 1564 : 3; + 1565 : 3; + 1566 : 3; + 1567 : 3; + 1568 : 3; + 1569 : 3; + 1570 : 3; + 1571 : 3; + 1572 : 3; + 1573 : 3; + 1574 : 3; + 1575 : 0; + 1576 : 0; + 1577 : 0; + 1578 : 0; + 1579 : 0; + 1580 : 0; + 1581 : 0; + 1582 : 0; + 1583 : 0; + 1584 : 0; + 1585 : 0; + 1586 : 0; + 1587 : 0; + 1588 : 0; + 1589 : 0; + 1590 : 0; + 1591 : 0; + 1592 : 0; + 1593 : 0; + 1594 : 0; + 1595 : 0; + 1596 : 0; + 1597 : 0; + 1598 : 0; + 1599 : 0; + 1600 : 0; + 1601 : 0; + 1602 : 0; + 1603 : 0; + 1604 : 0; + 1605 : 0; + 1606 : 0; + 1607 : 0; + 1608 : 0; + 1609 : 0; + 1610 : 0; + 1611 : 0; + 1612 : 0; + 1613 : 0; + 1614 : 0; + 1615 : 0; + 1616 : 0; + 1617 : 0; + 1618 : 0; + 1619 : 0; + 1620 : 0; + 1621 : 0; + 1622 : 0; + 1623 : 0; + 1624 : 7; + 1625 : 7; + 1626 : 7; + 1627 : 7; + 1628 : 3; + 1629 : 3; + 1630 : 3; + 1631 : 3; + 1632 : 3; + 1633 : 3; + 1634 : 3; + 1635 : 3; + 1636 : 3; + 1637 : 3; + 1638 : 3; + 1639 : 0; + 1640 : 0; + 1641 : 0; + 1642 : 0; + 1643 : 0; + 1644 : 0; + 1645 : 0; + 1646 : 0; + 1647 : 0; + 1648 : 0; + 1649 : 0; + 1650 : 0; + 1651 : 0; + 1652 : 0; + 1653 : 0; + 1654 : 0; + 1655 : 0; + 1656 : 0; + 1657 : 0; + 1658 : 0; + 1659 : 0; + 1660 : 0; + 1661 : 0; + 1662 : 0; + 1663 : 0; + 1664 : 0; + 1665 : 0; + 1666 : 0; + 1667 : 0; + 1668 : 0; + 1669 : 0; + 1670 : 0; + 1671 : 0; + 1672 : 0; + 1673 : 0; + 1674 : 0; + 1675 : 0; + 1676 : 0; + 1677 : 0; + 1678 : 0; + 1679 : 0; + 1680 : 0; + 1681 : 0; + 1682 : 0; + 1683 : 0; + 1684 : 0; + 1685 : 0; + 1686 : 0; + 1687 : 0; + 1688 : 7; + 1689 : 7; + 1690 : 7; + 1691 : 7; + 1692 : 3; + 1693 : 3; + 1694 : 3; + 1695 : 3; + 1696 : 3; + 1697 : 3; + 1698 : 3; + 1699 : 3; + 1700 : 3; + 1701 : 3; + 1702 : 3; + 1703 : 0; + 1704 : 0; + 1705 : 0; + 1706 : 0; + 1707 : 0; + 1708 : 0; + 1709 : 0; + 1710 : 0; + 1711 : 0; + 1712 : 0; + 1713 : 0; + 1714 : 0; + 1715 : 0; + 1716 : 0; + 1717 : 0; + 1718 : 0; + 1719 : 0; + 1720 : 0; + 1721 : 0; + 1722 : 0; + 1723 : 0; + 1724 : 0; + 1725 : 0; + 1726 : 0; + 1727 : 0; + 1728 : 0; + 1729 : 0; + 1730 : 0; + 1731 : 0; + 1732 : 0; + 1733 : 0; + 1734 : 0; + 1735 : 0; + 1736 : 0; + 1737 : 0; + 1738 : 0; + 1739 : 0; + 1740 : 0; + 1741 : 0; + 1742 : 0; + 1743 : 0; + 1744 : 0; + 1745 : 0; + 1746 : 0; + 1747 : 0; + 1748 : 0; + 1749 : 0; + 1750 : 0; + 1751 : 0; + 1752 : 7; + 1753 : 7; + 1754 : 7; + 1755 : 7; + 1756 : 3; + 1757 : 3; + 1758 : 3; + 1759 : 7; + 1760 : 3; + 1761 : 3; + 1762 : 3; + 1763 : 3; + 1764 : 3; + 1765 : 3; + 1766 : 3; + 1767 : 0; + 1768 : 0; + 1769 : 0; + 1770 : 0; + 1771 : 0; + 1772 : 0; + 1773 : 0; + 1774 : 0; + 1775 : 0; + 1776 : 0; + 1777 : 0; + 1778 : 0; + 1779 : 0; + 1780 : 0; + 1781 : 0; + 1782 : 0; + 1783 : 0; + 1784 : 0; + 1785 : 0; + 1786 : 0; + 1787 : 0; + 1788 : 0; + 1789 : 0; + 1790 : 0; + 1791 : 0; + 1792 : 0; + 1793 : 0; + 1794 : 0; + 1795 : 0; + 1796 : 0; + 1797 : 0; + 1798 : 0; + 1799 : 0; + 1800 : 0; + 1801 : 0; + 1802 : 0; + 1803 : 0; + 1804 : 0; + 1805 : 0; + 1806 : 0; + 1807 : 0; + 1808 : 0; + 1809 : 0; + 1810 : 0; + 1811 : 0; + 1812 : 0; + 1813 : 0; + 1814 : 0; + 1815 : 7; + 1816 : 7; + 1817 : 7; + 1818 : 7; + 1819 : 7; + 1820 : 7; + 1821 : 3; + 1822 : 3; + 1823 : 7; + 1824 : 7; + 1825 : 3; + 1826 : 3; + 1827 : 3; + 1828 : 3; + 1829 : 7; + 1830 : 3; + 1831 : 7; + 1832 : 0; + 1833 : 0; + 1834 : 0; + 1835 : 0; + 1836 : 0; + 1837 : 0; + 1838 : 0; + 1839 : 0; + 1840 : 0; + 1841 : 0; + 1842 : 0; + 1843 : 0; + 1844 : 0; + 1845 : 0; + 1846 : 0; + 1847 : 0; + 1848 : 0; + 1849 : 0; + 1850 : 0; + 1851 : 0; + 1852 : 0; + 1853 : 0; + 1854 : 0; + 1855 : 0; + 1856 : 0; + 1857 : 0; + 1858 : 0; + 1859 : 0; + 1860 : 0; + 1861 : 0; + 1862 : 0; + 1863 : 0; + 1864 : 0; + 1865 : 0; + 1866 : 0; + 1867 : 0; + 1868 : 0; + 1869 : 0; + 1870 : 0; + 1871 : 0; + 1872 : 0; + 1873 : 0; + 1874 : 0; + 1875 : 0; + 1876 : 0; + 1877 : 0; + 1878 : 0; + 1879 : 7; + 1880 : 7; + 1881 : 7; + 1882 : 7; + 1883 : 7; + 1884 : 7; + 1885 : 3; + 1886 : 3; + 1887 : 7; + 1888 : 7; + 1889 : 7; + 1890 : 7; + 1891 : 7; + 1892 : 7; + 1893 : 7; + 1894 : 7; + 1895 : 7; + 1896 : 0; + 1897 : 0; + 1898 : 0; + 1899 : 0; + 1900 : 0; + 1901 : 0; + 1902 : 0; + 1903 : 0; + 1904 : 0; + 1905 : 0; + 1906 : 0; + 1907 : 0; + 1908 : 0; + 1909 : 0; + 1910 : 0; + 1911 : 0; + 1912 : 0; + 1913 : 0; + 1914 : 0; + 1915 : 0; + 1916 : 0; + 1917 : 0; + 1918 : 0; + 1919 : 0; + 1920 : 0; + 1921 : 0; + 1922 : 0; + 1923 : 0; + 1924 : 0; + 1925 : 0; + 1926 : 0; + 1927 : 0; + 1928 : 0; + 1929 : 0; + 1930 : 0; + 1931 : 0; + 1932 : 0; + 1933 : 0; + 1934 : 0; + 1935 : 0; + 1936 : 0; + 1937 : 0; + 1938 : 0; + 1939 : 0; + 1940 : 0; + 1941 : 0; + 1942 : 0; + 1943 : 7; + 1944 : 7; + 1945 : 7; + 1946 : 7; + 1947 : 7; + 1948 : 7; + 1949 : 3; + 1950 : 3; + 1951 : 7; + 1952 : 7; + 1953 : 7; + 1954 : 7; + 1955 : 7; + 1956 : 7; + 1957 : 7; + 1958 : 7; + 1959 : 7; + 1960 : 0; + 1961 : 0; + 1962 : 0; + 1963 : 0; + 1964 : 0; + 1965 : 0; + 1966 : 0; + 1967 : 0; + 1968 : 0; + 1969 : 0; + 1970 : 0; + 1971 : 0; + 1972 : 0; + 1973 : 0; + 1974 : 0; + 1975 : 0; + 1976 : 0; + 1977 : 0; + 1978 : 0; + 1979 : 0; + 1980 : 0; + 1981 : 0; + 1982 : 0; + 1983 : 0; + 1984 : 0; + 1985 : 0; + 1986 : 0; + 1987 : 0; + 1988 : 0; + 1989 : 0; + 1990 : 0; + 1991 : 0; + 1992 : 0; + 1993 : 0; + 1994 : 0; + 1995 : 0; + 1996 : 0; + 1997 : 0; + 1998 : 0; + 1999 : 0; + 2000 : 0; + 2001 : 3; + 2002 : 0; + 2003 : 0; + 2004 : 0; + 2005 : 0; + 2006 : 7; + 2007 : 7; + 2008 : 7; + 2009 : 7; + 2010 : 7; + 2011 : 7; + 2012 : 7; + 2013 : 7; + 2014 : 3; + 2015 : 7; + 2016 : 7; + 2017 : 7; + 2018 : 7; + 2019 : 7; + 2020 : 7; + 2021 : 7; + 2022 : 7; + 2023 : 7; + 2024 : 3; + 2025 : 0; + 2026 : 0; + 2027 : 0; + 2028 : 0; + 2029 : 3; + 2030 : 0; + 2031 : 0; + 2032 : 0; + 2033 : 0; + 2034 : 0; + 2035 : 0; + 2036 : 0; + 2037 : 0; + 2038 : 0; + 2039 : 0; + 2040 : 0; + 2041 : 0; + 2042 : 0; + 2043 : 0; + 2044 : 0; + 2045 : 0; + 2046 : 0; + 2047 : 0; + 2048 : 0; + 2049 : 0; + 2050 : 0; + 2051 : 0; + 2052 : 0; + 2053 : 0; + 2054 : 0; + 2055 : 0; + 2056 : 0; + 2057 : 0; + 2058 : 0; + 2059 : 0; + 2060 : 0; + 2061 : 0; + 2062 : 0; + 2063 : 0; + 2064 : 3; + 2065 : 3; + 2066 : 3; + 2067 : 0; + 2068 : 0; + 2069 : 0; + 2070 : 3; + 2071 : 3; + 2072 : 7; + 2073 : 7; + 2074 : 7; + 2075 : 7; + 2076 : 7; + 2077 : 7; + 2078 : 3; + 2079 : 7; + 2080 : 7; + 2081 : 7; + 2082 : 7; + 2083 : 7; + 2084 : 7; + 2085 : 7; + 2086 : 7; + 2087 : 7; + 2088 : 7; + 2089 : 0; + 2090 : 0; + 2091 : 0; + 2092 : 3; + 2093 : 3; + 2094 : 3; + 2095 : 0; + 2096 : 0; + 2097 : 0; + 2098 : 0; + 2099 : 0; + 2100 : 0; + 2101 : 0; + 2102 : 0; + 2103 : 0; + 2104 : 0; + 2105 : 0; + 2106 : 0; + 2107 : 0; + 2108 : 0; + 2109 : 0; + 2110 : 0; + 2111 : 0; + 2112 : 0; + 2113 : 0; + 2114 : 0; + 2115 : 0; + 2116 : 0; + 2117 : 0; + 2118 : 0; + 2119 : 0; + 2120 : 0; + 2121 : 0; + 2122 : 0; + 2123 : 0; + 2124 : 0; + 2125 : 0; + 2126 : 0; + 2127 : 0; + 2128 : 3; + 2129 : 3; + 2130 : 3; + 2131 : 0; + 2132 : 0; + 2133 : 0; + 2134 : 3; + 2135 : 3; + 2136 : 3; + 2137 : 3; + 2138 : 7; + 2139 : 7; + 2140 : 7; + 2141 : 3; + 2142 : 3; + 2143 : 3; + 2144 : 7; + 2145 : 7; + 2146 : 7; + 2147 : 7; + 2148 : 7; + 2149 : 7; + 2150 : 7; + 2151 : 7; + 2152 : 7; + 2153 : 0; + 2154 : 0; + 2155 : 0; + 2156 : 3; + 2157 : 3; + 2158 : 3; + 2159 : 0; + 2160 : 0; + 2161 : 0; + 2162 : 0; + 2163 : 0; + 2164 : 0; + 2165 : 0; + 2166 : 0; + 2167 : 0; + 2168 : 0; + 2169 : 0; + 2170 : 0; + 2171 : 0; + 2172 : 0; + 2173 : 0; + 2174 : 0; + 2175 : 0; + 2176 : 0; + 2177 : 0; + 2178 : 0; + 2179 : 0; + 2180 : 0; + 2181 : 0; + 2182 : 0; + 2183 : 0; + 2184 : 0; + 2185 : 0; + 2186 : 0; + 2187 : 0; + 2188 : 0; + 2189 : 0; + 2190 : 0; + 2191 : 0; + 2192 : 3; + 2193 : 3; + 2194 : 3; + 2195 : 0; + 2196 : 0; + 2197 : 0; + 2198 : 7; + 2199 : 3; + 2200 : 3; + 2201 : 3; + 2202 : 3; + 2203 : 3; + 2204 : 7; + 2205 : 3; + 2206 : 3; + 2207 : 3; + 2208 : 3; + 2209 : 7; + 2210 : 7; + 2211 : 7; + 2212 : 7; + 2213 : 7; + 2214 : 7; + 2215 : 7; + 2216 : 7; + 2217 : 0; + 2218 : 0; + 2219 : 0; + 2220 : 3; + 2221 : 3; + 2222 : 3; + 2223 : 0; + 2224 : 0; + 2225 : 0; + 2226 : 0; + 2227 : 0; + 2228 : 0; + 2229 : 0; + 2230 : 0; + 2231 : 0; + 2232 : 0; + 2233 : 0; + 2234 : 0; + 2235 : 0; + 2236 : 0; + 2237 : 0; + 2238 : 0; + 2239 : 0; + 2240 : 0; + 2241 : 0; + 2242 : 0; + 2243 : 0; + 2244 : 0; + 2245 : 0; + 2246 : 0; + 2247 : 0; + 2248 : 0; + 2249 : 0; + 2250 : 0; + 2251 : 0; + 2252 : 0; + 2253 : 0; + 2254 : 0; + 2255 : 0; + 2256 : 3; + 2257 : 3; + 2258 : 3; + 2259 : 0; + 2260 : 0; + 2261 : 0; + 2262 : 7; + 2263 : 3; + 2264 : 3; + 2265 : 3; + 2266 : 3; + 2267 : 3; + 2268 : 7; + 2269 : 3; + 2270 : 3; + 2271 : 7; + 2272 : 3; + 2273 : 7; + 2274 : 7; + 2275 : 7; + 2276 : 7; + 2277 : 7; + 2278 : 7; + 2279 : 7; + 2280 : 7; + 2281 : 0; + 2282 : 0; + 2283 : 0; + 2284 : 3; + 2285 : 3; + 2286 : 3; + 2287 : 0; + 2288 : 0; + 2289 : 0; + 2290 : 0; + 2291 : 0; + 2292 : 0; + 2293 : 0; + 2294 : 0; + 2295 : 0; + 2296 : 0; + 2297 : 0; + 2298 : 0; + 2299 : 0; + 2300 : 0; + 2301 : 0; + 2302 : 0; + 2303 : 0; + 2304 : 0; + 2305 : 0; + 2306 : 0; + 2307 : 0; + 2308 : 0; + 2309 : 0; + 2310 : 0; + 2311 : 0; + 2312 : 0; + 2313 : 0; + 2314 : 0; + 2315 : 0; + 2316 : 0; + 2317 : 0; + 2318 : 0; + 2319 : 0; + 2320 : 3; + 2321 : 3; + 2322 : 3; + 2323 : 0; + 2324 : 0; + 2325 : 0; + 2326 : 7; + 2327 : 3; + 2328 : 3; + 2329 : 3; + 2330 : 3; + 2331 : 3; + 2332 : 7; + 2333 : 7; + 2334 : 3; + 2335 : 3; + 2336 : 3; + 2337 : 7; + 2338 : 7; + 2339 : 3; + 2340 : 3; + 2341 : 3; + 2342 : 7; + 2343 : 7; + 2344 : 7; + 2345 : 0; + 2346 : 0; + 2347 : 0; + 2348 : 3; + 2349 : 3; + 2350 : 3; + 2351 : 0; + 2352 : 0; + 2353 : 0; + 2354 : 0; + 2355 : 0; + 2356 : 0; + 2357 : 0; + 2358 : 0; + 2359 : 0; + 2360 : 0; + 2361 : 0; + 2362 : 0; + 2363 : 0; + 2364 : 0; + 2365 : 0; + 2366 : 0; + 2367 : 0; + 2368 : 0; + 2369 : 0; + 2370 : 0; + 2371 : 0; + 2372 : 0; + 2373 : 0; + 2374 : 0; + 2375 : 0; + 2376 : 0; + 2377 : 0; + 2378 : 0; + 2379 : 0; + 2380 : 0; + 2381 : 0; + 2382 : 0; + 2383 : 0; + 2384 : 3; + 2385 : 3; + 2386 : 3; + 2387 : 0; + 2388 : 0; + 2389 : 3; + 2390 : 7; + 2391 : 7; + 2392 : 7; + 2393 : 3; + 2394 : 3; + 2395 : 3; + 2396 : 7; + 2397 : 7; + 2398 : 3; + 2399 : 3; + 2400 : 3; + 2401 : 7; + 2402 : 7; + 2403 : 3; + 2404 : 3; + 2405 : 3; + 2406 : 7; + 2407 : 7; + 2408 : 7; + 2409 : 3; + 2410 : 0; + 2411 : 0; + 2412 : 3; + 2413 : 3; + 2414 : 3; + 2415 : 0; + 2416 : 0; + 2417 : 0; + 2418 : 0; + 2419 : 0; + 2420 : 0; + 2421 : 0; + 2422 : 0; + 2423 : 0; + 2424 : 0; + 2425 : 0; + 2426 : 0; + 2427 : 0; + 2428 : 0; + 2429 : 0; + 2430 : 0; + 2431 : 0; + 2432 : 0; + 2433 : 0; + 2434 : 0; + 2435 : 0; + 2436 : 0; + 2437 : 0; + 2438 : 0; + 2439 : 0; + 2440 : 0; + 2441 : 0; + 2442 : 0; + 2443 : 0; + 2444 : 0; + 2445 : 0; + 2446 : 0; + 2447 : 0; + 2448 : 3; + 2449 : 3; + 2450 : 3; + 2451 : 0; + 2452 : 0; + 2453 : 3; + 2454 : 7; + 2455 : 7; + 2456 : 7; + 2457 : 3; + 2458 : 3; + 2459 : 3; + 2460 : 7; + 2461 : 7; + 2462 : 3; + 2463 : 7; + 2464 : 7; + 2465 : 7; + 2466 : 7; + 2467 : 7; + 2468 : 3; + 2469 : 3; + 2470 : 7; + 2471 : 7; + 2472 : 7; + 2473 : 3; + 2474 : 0; + 2475 : 0; + 2476 : 3; + 2477 : 3; + 2478 : 3; + 2479 : 0; + 2480 : 0; + 2481 : 0; + 2482 : 0; + 2483 : 0; + 2484 : 0; + 2485 : 0; + 2486 : 0; + 2487 : 0; + 2488 : 0; + 2489 : 0; + 2490 : 0; + 2491 : 0; + 2492 : 0; + 2493 : 0; + 2494 : 0; + 2495 : 0; + 2496 : 0; + 2497 : 0; + 2498 : 0; + 2499 : 0; + 2500 : 0; + 2501 : 0; + 2502 : 0; + 2503 : 0; + 2504 : 0; + 2505 : 0; + 2506 : 0; + 2507 : 0; + 2508 : 0; + 2509 : 0; + 2510 : 0; + 2511 : 0; + 2512 : 3; + 2513 : 3; + 2514 : 3; + 2515 : 0; + 2516 : 0; + 2517 : 3; + 2518 : 7; + 2519 : 7; + 2520 : 7; + 2521 : 7; + 2522 : 3; + 2523 : 3; + 2524 : 7; + 2525 : 7; + 2526 : 3; + 2527 : 7; + 2528 : 7; + 2529 : 7; + 2530 : 7; + 2531 : 7; + 2532 : 7; + 2533 : 7; + 2534 : 7; + 2535 : 7; + 2536 : 7; + 2537 : 3; + 2538 : 0; + 2539 : 0; + 2540 : 3; + 2541 : 3; + 2542 : 3; + 2543 : 0; + 2544 : 0; + 2545 : 0; + 2546 : 0; + 2547 : 0; + 2548 : 0; + 2549 : 0; + 2550 : 0; + 2551 : 0; + 2552 : 0; + 2553 : 0; + 2554 : 0; + 2555 : 0; + 2556 : 0; + 2557 : 0; + 2558 : 0; + 2559 : 0; + 2560 : 0; + 2561 : 0; + 2562 : 0; + 2563 : 0; + 2564 : 0; + 2565 : 0; + 2566 : 0; + 2567 : 0; + 2568 : 0; + 2569 : 0; + 2570 : 0; + 2571 : 0; + 2572 : 0; + 2573 : 0; + 2574 : 0; + 2575 : 3; + 2576 : 3; + 2577 : 3; + 2578 : 3; + 2579 : 0; + 2580 : 0; + 2581 : 3; + 2582 : 7; + 2583 : 7; + 2584 : 7; + 2585 : 7; + 2586 : 7; + 2587 : 7; + 2588 : 7; + 2589 : 7; + 2590 : 3; + 2591 : 7; + 2592 : 7; + 2593 : 7; + 2594 : 7; + 2595 : 7; + 2596 : 7; + 2597 : 7; + 2598 : 7; + 2599 : 7; + 2600 : 7; + 2601 : 3; + 2602 : 0; + 2603 : 0; + 2604 : 3; + 2605 : 3; + 2606 : 3; + 2607 : 0; + 2608 : 0; + 2609 : 0; + 2610 : 0; + 2611 : 0; + 2612 : 0; + 2613 : 0; + 2614 : 0; + 2615 : 0; + 2616 : 0; + 2617 : 0; + 2618 : 0; + 2619 : 0; + 2620 : 0; + 2621 : 0; + 2622 : 0; + 2623 : 0; + 2624 : 0; + 2625 : 0; + 2626 : 0; + 2627 : 0; + 2628 : 0; + 2629 : 0; + 2630 : 0; + 2631 : 0; + 2632 : 0; + 2633 : 0; + 2634 : 0; + 2635 : 0; + 2636 : 0; + 2637 : 0; + 2638 : 0; + 2639 : 3; + 2640 : 3; + 2641 : 7; + 2642 : 7; + 2643 : 3; + 2644 : 3; + 2645 : 7; + 2646 : 7; + 2647 : 7; + 2648 : 7; + 2649 : 7; + 2650 : 7; + 2651 : 7; + 2652 : 7; + 2653 : 7; + 2654 : 3; + 2655 : 7; + 2656 : 7; + 2657 : 7; + 2658 : 7; + 2659 : 7; + 2660 : 7; + 2661 : 7; + 2662 : 7; + 2663 : 7; + 2664 : 7; + 2665 : 7; + 2666 : 3; + 2667 : 3; + 2668 : 7; + 2669 : 7; + 2670 : 3; + 2671 : 0; + 2672 : 0; + 2673 : 0; + 2674 : 0; + 2675 : 0; + 2676 : 0; + 2677 : 0; + 2678 : 0; + 2679 : 0; + 2680 : 0; + 2681 : 0; + 2682 : 0; + 2683 : 0; + 2684 : 0; + 2685 : 0; + 2686 : 0; + 2687 : 0; + 2688 : 0; + 2689 : 0; + 2690 : 0; + 2691 : 0; + 2692 : 0; + 2693 : 0; + 2694 : 0; + 2695 : 0; + 2696 : 0; + 2697 : 0; + 2698 : 0; + 2699 : 0; + 2700 : 0; + 2701 : 0; + 2702 : 0; + 2703 : 3; + 2704 : 3; + 2705 : 3; + 2706 : 3; + 2707 : 7; + 2708 : 7; + 2709 : 7; + 2710 : 7; + 2711 : 7; + 2712 : 7; + 2713 : 7; + 2714 : 7; + 2715 : 7; + 2716 : 7; + 2717 : 7; + 2718 : 3; + 2719 : 7; + 2720 : 7; + 2721 : 7; + 2722 : 7; + 2723 : 7; + 2724 : 7; + 2725 : 7; + 2726 : 7; + 2727 : 7; + 2728 : 7; + 2729 : 7; + 2730 : 7; + 2731 : 3; + 2732 : 7; + 2733 : 7; + 2734 : 3; + 2735 : 0; + 2736 : 0; + 2737 : 0; + 2738 : 0; + 2739 : 0; + 2740 : 0; + 2741 : 0; + 2742 : 0; + 2743 : 0; + 2744 : 0; + 2745 : 0; + 2746 : 0; + 2747 : 0; + 2748 : 0; + 2749 : 0; + 2750 : 0; + 2751 : 0; + 2752 : 0; + 2753 : 0; + 2754 : 0; + 2755 : 0; + 2756 : 0; + 2757 : 0; + 2758 : 0; + 2759 : 0; + 2760 : 0; + 2761 : 0; + 2762 : 0; + 2763 : 0; + 2764 : 0; + 2765 : 0; + 2766 : 0; + 2767 : 3; + 2768 : 3; + 2769 : 3; + 2770 : 3; + 2771 : 7; + 2772 : 7; + 2773 : 7; + 2774 : 7; + 2775 : 7; + 2776 : 7; + 2777 : 7; + 2778 : 7; + 2779 : 7; + 2780 : 7; + 2781 : 7; + 2782 : 3; + 2783 : 7; + 2784 : 7; + 2785 : 7; + 2786 : 7; + 2787 : 3; + 2788 : 7; + 2789 : 7; + 2790 : 7; + 2791 : 7; + 2792 : 7; + 2793 : 7; + 2794 : 7; + 2795 : 7; + 2796 : 7; + 2797 : 7; + 2798 : 3; + 2799 : 0; + 2800 : 0; + 2801 : 0; + 2802 : 0; + 2803 : 0; + 2804 : 0; + 2805 : 0; + 2806 : 0; + 2807 : 0; + 2808 : 0; + 2809 : 0; + 2810 : 0; + 2811 : 0; + 2812 : 0; + 2813 : 0; + 2814 : 0; + 2815 : 0; + 2816 : 0; + 2817 : 0; + 2818 : 0; + 2819 : 0; + 2820 : 0; + 2821 : 0; + 2822 : 0; + 2823 : 0; + 2824 : 0; + 2825 : 0; + 2826 : 0; + 2827 : 0; + 2828 : 0; + 2829 : 0; + 2830 : 3; + 2831 : 3; + 2832 : 3; + 2833 : 3; + 2834 : 7; + 2835 : 7; + 2836 : 7; + 2837 : 7; + 2838 : 7; + 2839 : 7; + 2840 : 7; + 2841 : 7; + 2842 : 7; + 2843 : 7; + 2844 : 7; + 2845 : 7; + 2846 : 7; + 2847 : 7; + 2848 : 3; + 2849 : 3; + 2850 : 3; + 2851 : 3; + 2852 : 7; + 2853 : 7; + 2854 : 7; + 2855 : 7; + 2856 : 7; + 2857 : 7; + 2858 : 7; + 2859 : 7; + 2860 : 7; + 2861 : 7; + 2862 : 3; + 2863 : 3; + 2864 : 0; + 2865 : 0; + 2866 : 0; + 2867 : 0; + 2868 : 0; + 2869 : 0; + 2870 : 0; + 2871 : 0; + 2872 : 0; + 2873 : 0; + 2874 : 0; + 2875 : 0; + 2876 : 0; + 2877 : 0; + 2878 : 0; + 2879 : 0; + 2880 : 0; + 2881 : 0; + 2882 : 0; + 2883 : 0; + 2884 : 0; + 2885 : 0; + 2886 : 0; + 2887 : 0; + 2888 : 0; + 2889 : 0; + 2890 : 0; + 2891 : 0; + 2892 : 0; + 2893 : 0; + 2894 : 3; + 2895 : 3; + 2896 : 3; + 2897 : 3; + 2898 : 3; + 2899 : 7; + 2900 : 7; + 2901 : 7; + 2902 : 7; + 2903 : 7; + 2904 : 7; + 2905 : 7; + 2906 : 7; + 2907 : 7; + 2908 : 7; + 2909 : 7; + 2910 : 3; + 2911 : 7; + 2912 : 3; + 2913 : 3; + 2914 : 3; + 2915 : 7; + 2916 : 7; + 2917 : 7; + 2918 : 7; + 2919 : 7; + 2920 : 7; + 2921 : 7; + 2922 : 7; + 2923 : 7; + 2924 : 7; + 2925 : 7; + 2926 : 7; + 2927 : 3; + 2928 : 0; + 2929 : 0; + 2930 : 0; + 2931 : 0; + 2932 : 0; + 2933 : 0; + 2934 : 0; + 2935 : 0; + 2936 : 0; + 2937 : 0; + 2938 : 0; + 2939 : 0; + 2940 : 0; + 2941 : 0; + 2942 : 0; + 2943 : 0; + 2944 : 0; + 2945 : 0; + 2946 : 0; + 2947 : 0; + 2948 : 0; + 2949 : 0; + 2950 : 0; + 2951 : 0; + 2952 : 0; + 2953 : 0; + 2954 : 0; + 2955 : 0; + 2956 : 3; + 2957 : 3; + 2958 : 7; + 2959 : 7; + 2960 : 3; + 2961 : 3; + 2962 : 3; + 2963 : 3; + 2964 : 7; + 2965 : 7; + 2966 : 7; + 2967 : 7; + 2968 : 7; + 2969 : 7; + 2970 : 7; + 2971 : 7; + 2972 : 7; + 2973 : 7; + 2974 : 3; + 2975 : 3; + 2976 : 3; + 2977 : 3; + 2978 : 3; + 2979 : 7; + 2980 : 7; + 2981 : 7; + 2982 : 7; + 2983 : 7; + 2984 : 7; + 2985 : 7; + 2986 : 7; + 2987 : 7; + 2988 : 7; + 2989 : 7; + 2990 : 7; + 2991 : 7; + 2992 : 7; + 2993 : 3; + 2994 : 0; + 2995 : 0; + 2996 : 0; + 2997 : 0; + 2998 : 0; + 2999 : 0; + 3000 : 0; + 3001 : 0; + 3002 : 0; + 3003 : 0; + 3004 : 0; + 3005 : 0; + 3006 : 0; + 3007 : 0; + 3008 : 0; + 3009 : 0; + 3010 : 0; + 3011 : 0; + 3012 : 0; + 3013 : 0; + 3014 : 0; + 3015 : 0; + 3016 : 0; + 3017 : 0; + 3018 : 0; + 3019 : 3; + 3020 : 3; + 3021 : 7; + 3022 : 7; + 3023 : 7; + 3024 : 7; + 3025 : 7; + 3026 : 3; + 3027 : 3; + 3028 : 3; + 3029 : 7; + 3030 : 7; + 3031 : 7; + 3032 : 7; + 3033 : 7; + 3034 : 7; + 3035 : 7; + 3036 : 7; + 3037 : 3; + 3038 : 3; + 3039 : 3; + 3040 : 3; + 3041 : 3; + 3042 : 3; + 3043 : 7; + 3044 : 7; + 3045 : 7; + 3046 : 7; + 3047 : 7; + 3048 : 7; + 3049 : 7; + 3050 : 7; + 3051 : 7; + 3052 : 7; + 3053 : 7; + 3054 : 7; + 3055 : 7; + 3056 : 7; + 3057 : 7; + 3058 : 3; + 3059 : 0; + 3060 : 0; + 3061 : 0; + 3062 : 0; + 3063 : 0; + 3064 : 0; + 3065 : 0; + 3066 : 0; + 3067 : 0; + 3068 : 0; + 3069 : 0; + 3070 : 0; + 3071 : 0; + 3072 : 0; + 3073 : 0; + 3074 : 0; + 3075 : 0; + 3076 : 0; + 3077 : 0; + 3078 : 0; + 3079 : 0; + 3080 : 0; + 3081 : 0; + 3082 : 3; + 3083 : 3; + 3084 : 7; + 3085 : 7; + 3086 : 7; + 3087 : 7; + 3088 : 7; + 3089 : 3; + 3090 : 3; + 3091 : 3; + 3092 : 3; + 3093 : 3; + 3094 : 3; + 3095 : 3; + 3096 : 7; + 3097 : 7; + 3098 : 7; + 3099 : 7; + 3100 : 3; + 3101 : 3; + 3102 : 3; + 3103 : 3; + 3104 : 3; + 3105 : 3; + 3106 : 3; + 3107 : 3; + 3108 : 7; + 3109 : 7; + 3110 : 7; + 3111 : 7; + 3112 : 7; + 3113 : 7; + 3114 : 7; + 3115 : 7; + 3116 : 7; + 3117 : 7; + 3118 : 7; + 3119 : 7; + 3120 : 7; + 3121 : 7; + 3122 : 7; + 3123 : 3; + 3124 : 0; + 3125 : 0; + 3126 : 0; + 3127 : 0; + 3128 : 0; + 3129 : 0; + 3130 : 0; + 3131 : 0; + 3132 : 0; + 3133 : 0; + 3134 : 0; + 3135 : 0; + 3136 : 0; + 3137 : 0; + 3138 : 0; + 3139 : 0; + 3140 : 0; + 3141 : 0; + 3142 : 0; + 3143 : 0; + 3144 : 0; + 3145 : 0; + 3146 : 3; + 3147 : 7; + 3148 : 7; + 3149 : 7; + 3150 : 7; + 3151 : 7; + 3152 : 7; + 3153 : 3; + 3154 : 3; + 3155 : 3; + 3156 : 3; + 3157 : 3; + 3158 : 3; + 3159 : 3; + 3160 : 3; + 3161 : 3; + 3162 : 7; + 3163 : 3; + 3164 : 3; + 3165 : 3; + 3166 : 3; + 3167 : 3; + 3168 : 3; + 3169 : 3; + 3170 : 3; + 3171 : 3; + 3172 : 3; + 3173 : 7; + 3174 : 7; + 3175 : 7; + 3176 : 7; + 3177 : 7; + 3178 : 7; + 3179 : 7; + 3180 : 7; + 3181 : 7; + 3182 : 7; + 3183 : 7; + 3184 : 7; + 3185 : 7; + 3186 : 7; + 3187 : 7; + 3188 : 0; + 3189 : 0; + 3190 : 0; + 3191 : 0; + 3192 : 0; + 3193 : 0; + 3194 : 0; + 3195 : 0; + 3196 : 0; + 3197 : 0; + 3198 : 0; + 3199 : 0; + 3200 : 0; + 3201 : 0; + 3202 : 0; + 3203 : 0; + 3204 : 0; + 3205 : 0; + 3206 : 0; + 3207 : 0; + 3208 : 0; + 3209 : 3; + 3210 : 3; + 3211 : 7; + 3212 : 7; + 3213 : 7; + 3214 : 7; + 3215 : 7; + 3216 : 7; + 3217 : 3; + 3218 : 3; + 3219 : 3; + 3220 : 3; + 3221 : 3; + 3222 : 3; + 3223 : 3; + 3224 : 3; + 3225 : 3; + 3226 : 3; + 3227 : 3; + 3228 : 3; + 3229 : 3; + 3230 : 3; + 3231 : 3; + 3232 : 3; + 3233 : 3; + 3234 : 3; + 3235 : 3; + 3236 : 3; + 3237 : 3; + 3238 : 7; + 3239 : 7; + 3240 : 7; + 3241 : 7; + 3242 : 7; + 3243 : 7; + 3244 : 7; + 3245 : 7; + 3246 : 7; + 3247 : 7; + 3248 : 7; + 3249 : 7; + 3250 : 7; + 3251 : 7; + 3252 : 7; + 3253 : 3; + 3254 : 0; + 3255 : 0; + 3256 : 0; + 3257 : 0; + 3258 : 0; + 3259 : 0; + 3260 : 0; + 3261 : 0; + 3262 : 0; + 3263 : 0; + 3264 : 0; + 3265 : 0; + 3266 : 0; + 3267 : 0; + 3268 : 0; + 3269 : 0; + 3270 : 0; + 3271 : 3; + 3272 : 3; + 3273 : 3; + 3274 : 3; + 3275 : 7; + 3276 : 7; + 3277 : 7; + 3278 : 7; + 3279 : 7; + 3280 : 7; + 3281 : 3; + 3282 : 3; + 3283 : 3; + 3284 : 3; + 3285 : 3; + 3286 : 3; + 3287 : 3; + 3288 : 3; + 3289 : 3; + 3290 : 3; + 3291 : 3; + 3292 : 3; + 3293 : 3; + 3294 : 3; + 3295 : 3; + 3296 : 3; + 3297 : 3; + 3298 : 3; + 3299 : 3; + 3300 : 3; + 3301 : 3; + 3302 : 7; + 3303 : 7; + 3304 : 7; + 3305 : 7; + 3306 : 7; + 3307 : 7; + 3308 : 7; + 3309 : 7; + 3310 : 7; + 3311 : 7; + 3312 : 7; + 3313 : 7; + 3314 : 7; + 3315 : 7; + 3316 : 7; + 3317 : 7; + 3318 : 3; + 3319 : 0; + 3320 : 0; + 3321 : 0; + 3322 : 0; + 3323 : 0; + 3324 : 0; + 3325 : 0; + 3326 : 0; + 3327 : 0; + 3328 : 0; + 3329 : 0; + 3330 : 0; + 3331 : 0; + 3332 : 0; + 3333 : 0; + 3334 : 0; + 3335 : 3; + 3336 : 3; + 3337 : 3; + 3338 : 3; + 3339 : 7; + 3340 : 7; + 3341 : 7; + 3342 : 7; + 3343 : 7; + 3344 : 7; + 3345 : 7; + 3346 : 3; + 3347 : 3; + 3348 : 3; + 3349 : 3; + 3350 : 3; + 3351 : 3; + 3352 : 3; + 3353 : 3; + 3354 : 3; + 3355 : 3; + 3356 : 3; + 3357 : 3; + 3358 : 3; + 3359 : 3; + 3360 : 3; + 3361 : 3; + 3362 : 3; + 3363 : 3; + 3364 : 3; + 3365 : 3; + 3366 : 7; + 3367 : 7; + 3368 : 7; + 3369 : 7; + 3370 : 7; + 3371 : 7; + 3372 : 7; + 3373 : 7; + 3374 : 7; + 3375 : 7; + 3376 : 7; + 3377 : 7; + 3378 : 7; + 3379 : 7; + 3380 : 7; + 3381 : 7; + 3382 : 7; + 3383 : 3; + 3384 : 0; + 3385 : 0; + 3386 : 0; + 3387 : 0; + 3388 : 0; + 3389 : 0; + 3390 : 0; + 3391 : 0; + 3392 : 0; + 3393 : 0; + 3394 : 0; + 3395 : 0; + 3396 : 0; + 3397 : 0; + 3398 : 3; + 3399 : 3; + 3400 : 3; + 3401 : 3; + 3402 : 3; + 3403 : 3; + 3404 : 7; + 3405 : 7; + 3406 : 7; + 3407 : 7; + 3408 : 7; + 3409 : 7; + 3410 : 3; + 3411 : 7; + 3412 : 3; + 3413 : 3; + 3414 : 3; + 3415 : 3; + 3416 : 3; + 3417 : 3; + 3418 : 3; + 3419 : 3; + 3420 : 3; + 3421 : 3; + 3422 : 3; + 3423 : 3; + 3424 : 3; + 3425 : 3; + 3426 : 3; + 3427 : 3; + 3428 : 3; + 3429 : 3; + 3430 : 3; + 3431 : 7; + 3432 : 7; + 3433 : 7; + 3434 : 7; + 3435 : 7; + 3436 : 7; + 3437 : 7; + 3438 : 7; + 3439 : 7; + 3440 : 7; + 3441 : 7; + 3442 : 7; + 3443 : 7; + 3444 : 7; + 3445 : 3; + 3446 : 7; + 3447 : 7; + 3448 : 0; + 3449 : 0; + 3450 : 0; + 3451 : 0; + 3452 : 0; + 3453 : 0; + 3454 : 0; + 3455 : 0; + 3456 : 0; + 3457 : 0; + 3458 : 0; + 3459 : 0; + 3460 : 0; + 3461 : 3; + 3462 : 3; + 3463 : 3; + 3464 : 3; + 3465 : 3; + 3466 : 3; + 3467 : 3; + 3468 : 7; + 3469 : 7; + 3470 : 7; + 3471 : 7; + 3472 : 7; + 3473 : 7; + 3474 : 3; + 3475 : 3; + 3476 : 3; + 3477 : 3; + 3478 : 3; + 3479 : 3; + 3480 : 3; + 3481 : 3; + 3482 : 3; + 3483 : 3; + 3484 : 3; + 3485 : 3; + 3486 : 3; + 3487 : 3; + 3488 : 3; + 3489 : 3; + 3490 : 3; + 3491 : 3; + 3492 : 3; + 3493 : 3; + 3494 : 3; + 3495 : 3; + 3496 : 3; + 3497 : 7; + 3498 : 7; + 3499 : 7; + 3500 : 7; + 3501 : 7; + 3502 : 7; + 3503 : 7; + 3504 : 7; + 3505 : 7; + 3506 : 7; + 3507 : 7; + 3508 : 7; + 3509 : 7; + 3510 : 7; + 3511 : 7; + 3512 : 7; + 3513 : 3; + 3514 : 0; + 3515 : 0; + 3516 : 0; + 3517 : 0; + 3518 : 0; + 3519 : 0; + 3520 : 0; + 3521 : 0; + 3522 : 0; + 3523 : 0; + 3524 : 3; + 3525 : 3; + 3526 : 3; + 3527 : 3; + 3528 : 3; + 3529 : 3; + 3530 : 3; + 3531 : 3; + 3532 : 7; + 3533 : 7; + 3534 : 7; + 3535 : 7; + 3536 : 7; + 3537 : 7; + 3538 : 7; + 3539 : 7; + 3540 : 7; + 3541 : 3; + 3542 : 3; + 3543 : 3; + 3544 : 3; + 3545 : 3; + 3546 : 3; + 3547 : 7; + 3548 : 7; + 3549 : 7; + 3550 : 3; + 3551 : 3; + 3552 : 3; + 3553 : 3; + 3554 : 3; + 3555 : 3; + 3556 : 3; + 3557 : 3; + 3558 : 3; + 3559 : 3; + 3560 : 3; + 3561 : 3; + 3562 : 7; + 3563 : 7; + 3564 : 7; + 3565 : 7; + 3566 : 7; + 3567 : 7; + 3568 : 7; + 3569 : 7; + 3570 : 7; + 3571 : 7; + 3572 : 7; + 3573 : 7; + 3574 : 7; + 3575 : 7; + 3576 : 7; + 3577 : 3; + 3578 : 3; + 3579 : 0; + 3580 : 0; + 3581 : 0; + 3582 : 0; + 3583 : 0; + 3584 : 0; + 3585 : 0; + 3586 : 3; + 3587 : 3; + 3588 : 3; + 3589 : 3; + 3590 : 3; + 3591 : 3; + 3592 : 3; + 3593 : 3; + 3594 : 3; + 3595 : 3; + 3596 : 3; + 3597 : 7; + 3598 : 7; + 3599 : 7; + 3600 : 7; + 3601 : 7; + 3602 : 7; + 3603 : 7; + 3604 : 7; + 3605 : 7; + 3606 : 3; + 3607 : 3; + 3608 : 3; + 3609 : 3; + 3610 : 7; + 3611 : 7; + 3612 : 7; + 3613 : 7; + 3614 : 7; + 3615 : 3; + 3616 : 3; + 3617 : 3; + 3618 : 3; + 3619 : 3; + 3620 : 3; + 3621 : 3; + 3622 : 3; + 3623 : 3; + 3624 : 3; + 3625 : 3; + 3626 : 7; + 3627 : 7; + 3628 : 7; + 3629 : 7; + 3630 : 7; + 3631 : 7; + 3632 : 7; + 3633 : 7; + 3634 : 7; + 3635 : 7; + 3636 : 7; + 3637 : 3; + 3638 : 3; + 3639 : 3; + 3640 : 7; + 3641 : 7; + 3642 : 3; + 3643 : 3; + 3644 : 0; + 3645 : 0; + 3646 : 0; + 3647 : 0; + 3648 : 0; + 3649 : 0; + 3650 : 3; + 3651 : 3; + 3652 : 3; + 3653 : 3; + 3654 : 3; + 3655 : 3; + 3656 : 3; + 3657 : 3; + 3658 : 3; + 3659 : 3; + 3660 : 3; + 3661 : 7; + 3662 : 7; + 3663 : 7; + 3664 : 7; + 3665 : 7; + 3666 : 7; + 3667 : 7; + 3668 : 7; + 3669 : 7; + 3670 : 7; + 3671 : 3; + 3672 : 3; + 3673 : 3; + 3674 : 7; + 3675 : 7; + 3676 : 7; + 3677 : 7; + 3678 : 7; + 3679 : 3; + 3680 : 3; + 3681 : 3; + 3682 : 3; + 3683 : 3; + 3684 : 3; + 3685 : 3; + 3686 : 3; + 3687 : 3; + 3688 : 3; + 3689 : 3; + 3690 : 3; + 3691 : 7; + 3692 : 7; + 3693 : 7; + 3694 : 7; + 3695 : 7; + 3696 : 7; + 3697 : 7; + 3698 : 7; + 3699 : 7; + 3700 : 7; + 3701 : 7; + 3702 : 7; + 3703 : 7; + 3704 : 7; + 3705 : 3; + 3706 : 3; + 3707 : 3; + 3708 : 0; + 3709 : 0; + 3710 : 0; + 3711 : 0; + 3712 : 0; + 3713 : 3; + 3714 : 3; + 3715 : 3; + 3716 : 3; + 3717 : 3; + 3718 : 3; + 3719 : 3; + 3720 : 3; + 3721 : 3; + 3722 : 3; + 3723 : 3; + 3724 : 3; + 3725 : 7; + 3726 : 7; + 3727 : 7; + 3728 : 7; + 3729 : 7; + 3730 : 7; + 3731 : 7; + 3732 : 7; + 3733 : 7; + 3734 : 7; + 3735 : 7; + 3736 : 3; + 3737 : 7; + 3738 : 7; + 3739 : 7; + 3740 : 7; + 3741 : 7; + 3742 : 7; + 3743 : 7; + 3744 : 3; + 3745 : 3; + 3746 : 3; + 3747 : 3; + 3748 : 3; + 3749 : 3; + 3750 : 3; + 3751 : 3; + 3752 : 3; + 3753 : 3; + 3754 : 3; + 3755 : 7; + 3756 : 7; + 3757 : 7; + 3758 : 7; + 3759 : 7; + 3760 : 7; + 3761 : 7; + 3762 : 7; + 3763 : 7; + 3764 : 7; + 3765 : 7; + 3766 : 7; + 3767 : 7; + 3768 : 7; + 3769 : 3; + 3770 : 3; + 3771 : 3; + 3772 : 3; + 3773 : 3; + 3774 : 0; + 3775 : 0; + 3776 : 3; + 3777 : 3; + 3778 : 3; + 3779 : 3; + 3780 : 3; + 3781 : 3; + 3782 : 3; + 3783 : 3; + 3784 : 3; + 3785 : 3; + 3786 : 3; + 3787 : 3; + 3788 : 3; + 3789 : 7; + 3790 : 7; + 3791 : 7; + 3792 : 7; + 3793 : 7; + 3794 : 7; + 3795 : 7; + 3796 : 7; + 3797 : 7; + 3798 : 7; + 3799 : 7; + 3800 : 7; + 3801 : 7; + 3802 : 7; + 3803 : 7; + 3804 : 7; + 3805 : 7; + 3806 : 7; + 3807 : 7; + 3808 : 3; + 3809 : 3; + 3810 : 7; + 3811 : 3; + 3812 : 3; + 3813 : 3; + 3814 : 3; + 3815 : 3; + 3816 : 3; + 3817 : 3; + 3818 : 3; + 3819 : 7; + 3820 : 7; + 3821 : 7; + 3822 : 7; + 3823 : 7; + 3824 : 7; + 3825 : 7; + 3826 : 7; + 3827 : 7; + 3828 : 7; + 3829 : 7; + 3830 : 7; + 3831 : 7; + 3832 : 7; + 3833 : 3; + 3834 : 7; + 3835 : 3; + 3836 : 3; + 3837 : 3; + 3838 : 3; + 3839 : 0; + 3840 : 0; + 3841 : 3; + 3842 : 3; + 3843 : 3; + 3844 : 3; + 3845 : 3; + 3846 : 3; + 3847 : 3; + 3848 : 3; + 3849 : 3; + 3850 : 3; + 3851 : 3; + 3852 : 3; + 3853 : 3; + 3854 : 7; + 3855 : 7; + 3856 : 7; + 3857 : 7; + 3858 : 7; + 3859 : 7; + 3860 : 7; + 3861 : 7; + 3862 : 7; + 3863 : 7; + 3864 : 7; + 3865 : 3; + 3866 : 7; + 3867 : 7; + 3868 : 7; + 3869 : 7; + 3870 : 7; + 3871 : 7; + 3872 : 7; + 3873 : 7; + 3874 : 7; + 3875 : 7; + 3876 : 3; + 3877 : 3; + 3878 : 3; + 3879 : 3; + 3880 : 3; + 3881 : 3; + 3882 : 7; + 3883 : 7; + 3884 : 7; + 3885 : 7; + 3886 : 7; + 3887 : 7; + 3888 : 7; + 3889 : 7; + 3890 : 7; + 3891 : 7; + 3892 : 7; + 3893 : 7; + 3894 : 3; + 3895 : 7; + 3896 : 3; + 3897 : 3; + 3898 : 7; + 3899 : 3; + 3900 : 3; + 3901 : 3; + 3902 : 3; + 3903 : 0; + 3904 : 0; + 3905 : 3; + 3906 : 3; + 3907 : 3; + 3908 : 3; + 3909 : 3; + 3910 : 3; + 3911 : 3; + 3912 : 3; + 3913 : 3; + 3914 : 3; + 3915 : 3; + 3916 : 3; + 3917 : 3; + 3918 : 3; + 3919 : 7; + 3920 : 7; + 3921 : 7; + 3922 : 7; + 3923 : 7; + 3924 : 7; + 3925 : 7; + 3926 : 7; + 3927 : 7; + 3928 : 7; + 3929 : 3; + 3930 : 7; + 3931 : 7; + 3932 : 7; + 3933 : 7; + 3934 : 7; + 3935 : 7; + 3936 : 7; + 3937 : 7; + 3938 : 7; + 3939 : 7; + 3940 : 3; + 3941 : 3; + 3942 : 3; + 3943 : 7; + 3944 : 7; + 3945 : 7; + 3946 : 7; + 3947 : 7; + 3948 : 7; + 3949 : 7; + 3950 : 7; + 3951 : 7; + 3952 : 7; + 3953 : 7; + 3954 : 7; + 3955 : 3; + 3956 : 3; + 3957 : 7; + 3958 : 3; + 3959 : 3; + 3960 : 3; + 3961 : 7; + 3962 : 3; + 3963 : 3; + 3964 : 3; + 3965 : 3; + 3966 : 0; + 3967 : 0; + 3968 : 0; + 3969 : 0; + 3970 : 3; + 3971 : 3; + 3972 : 3; + 3973 : 3; + 3974 : 3; + 3975 : 3; + 3976 : 3; + 3977 : 3; + 3978 : 3; + 3979 : 3; + 3980 : 3; + 3981 : 3; + 3982 : 3; + 3983 : 7; + 3984 : 7; + 3985 : 7; + 3986 : 7; + 3987 : 7; + 3988 : 7; + 3989 : 7; + 3990 : 7; + 3991 : 7; + 3992 : 7; + 3993 : 3; + 3994 : 3; + 3995 : 7; + 3996 : 7; + 3997 : 7; + 3998 : 7; + 3999 : 7; + 4000 : 7; + 4001 : 7; + 4002 : 7; + 4003 : 7; + 4004 : 3; + 4005 : 7; + 4006 : 7; + 4007 : 7; + 4008 : 7; + 4009 : 7; + 4010 : 7; + 4011 : 7; + 4012 : 7; + 4013 : 7; + 4014 : 7; + 4015 : 7; + 4016 : 7; + 4017 : 7; + 4018 : 3; + 4019 : 7; + 4020 : 3; + 4021 : 7; + 4022 : 3; + 4023 : 3; + 4024 : 3; + 4025 : 7; + 4026 : 7; + 4027 : 3; + 4028 : 3; + 4029 : 3; + 4030 : 0; + 4031 : 0; + 4032 : 0; + 4033 : 0; + 4034 : 3; + 4035 : 3; + 4036 : 3; + 4037 : 3; + 4038 : 3; + 4039 : 7; + 4040 : 7; + 4041 : 3; + 4042 : 3; + 4043 : 3; + 4044 : 3; + 4045 : 3; + 4046 : 3; + 4047 : 3; + 4048 : 3; + 4049 : 3; + 4050 : 3; + 4051 : 3; + 4052 : 3; + 4053 : 3; + 4054 : 3; + 4055 : 3; + 4056 : 3; + 4057 : 3; + 4058 : 3; + 4059 : 7; + 4060 : 7; + 4061 : 7; + 4062 : 7; + 4063 : 7; + 4064 : 7; + 4065 : 7; + 4066 : 7; + 4067 : 7; + 4068 : 7; + 4069 : 7; + 4070 : 7; + 4071 : 7; + 4072 : 7; + 4073 : 7; + 4074 : 7; + 4075 : 7; + 4076 : 7; + 4077 : 7; + 4078 : 7; + 4079 : 7; + 4080 : 7; + 4081 : 7; + 4082 : 7; + 4083 : 7; + 4084 : 3; + 4085 : 3; + 4086 : 3; + 4087 : 3; + 4088 : 3; + 4089 : 7; + 4090 : 7; + 4091 : 7; + 4092 : 3; + 4093 : 0; + 4094 : 0; + 4095 : 0; + 4096 : 0; + 4097 : 0; + 4098 : 3; + 4099 : 3; + 4100 : 3; + 4101 : 3; + 4102 : 3; + 4103 : 7; + 4104 : 3; + 4105 : 7; + 4106 : 3; + 4107 : 3; + 4108 : 3; + 4109 : 3; + 4110 : 3; + 4111 : 3; + 4112 : 3; + 4113 : 3; + 4114 : 3; + 4115 : 3; + 4116 : 3; + 4117 : 3; + 4118 : 3; + 4119 : 3; + 4120 : 3; + 4121 : 3; + 4122 : 3; + 4123 : 7; + 4124 : 7; + 4125 : 7; + 4126 : 7; + 4127 : 3; + 4128 : 3; + 4129 : 7; + 4130 : 7; + 4131 : 7; + 4132 : 7; + 4133 : 7; + 4134 : 7; + 4135 : 3; + 4136 : 3; + 4137 : 3; + 4138 : 3; + 4139 : 3; + 4140 : 3; + 4141 : 3; + 4142 : 3; + 4143 : 3; + 4144 : 3; + 4145 : 7; + 4146 : 7; + 4147 : 7; + 4148 : 3; + 4149 : 3; + 4150 : 3; + 4151 : 3; + 4152 : 3; + 4153 : 3; + 4154 : 7; + 4155 : 3; + 4156 : 0; + 4157 : 0; + 4158 : 0; + 4159 : 0; + 4160 : 0; + 4161 : 0; + 4162 : 0; + 4163 : 3; + 4164 : 3; + 4165 : 3; + 4166 : 3; + 4167 : 3; + 4168 : 3; + 4169 : 3; + 4170 : 3; + 4171 : 3; + 4172 : 3; + 4173 : 3; + 4174 : 0; + 4175 : 0; + 4176 : 0; + 4177 : 0; + 4178 : 0; + 4179 : 0; + 4180 : 0; + 4181 : 3; + 4182 : 3; + 4183 : 7; + 4184 : 3; + 4185 : 3; + 4186 : 3; + 4187 : 7; + 4188 : 7; + 4189 : 7; + 4190 : 7; + 4191 : 7; + 4192 : 3; + 4193 : 7; + 4194 : 7; + 4195 : 7; + 4196 : 7; + 4197 : 7; + 4198 : 7; + 4199 : 7; + 4200 : 7; + 4201 : 0; + 4202 : 0; + 4203 : 0; + 4204 : 0; + 4205 : 3; + 4206 : 3; + 4207 : 3; + 4208 : 3; + 4209 : 3; + 4210 : 3; + 4211 : 3; + 4212 : 3; + 4213 : 3; + 4214 : 3; + 4215 : 3; + 4216 : 3; + 4217 : 3; + 4218 : 3; + 4219 : 3; + 4220 : 0; + 4221 : 0; + 4222 : 0; + 4223 : 0; + 4224 : 0; + 4225 : 0; + 4226 : 0; + 4227 : 3; + 4228 : 3; + 4229 : 3; + 4230 : 3; + 4231 : 3; + 4232 : 3; + 4233 : 0; + 4234 : 0; + 4235 : 0; + 4236 : 0; + 4237 : 0; + 4238 : 0; + 4239 : 0; + 4240 : 0; + 4241 : 0; + 4242 : 0; + 4243 : 0; + 4244 : 0; + 4245 : 3; + 4246 : 3; + 4247 : 3; + 4248 : 3; + 4249 : 3; + 4250 : 3; + 4251 : 7; + 4252 : 7; + 4253 : 7; + 4254 : 7; + 4255 : 7; + 4256 : 3; + 4257 : 7; + 4258 : 7; + 4259 : 7; + 4260 : 7; + 4261 : 7; + 4262 : 7; + 4263 : 7; + 4264 : 3; + 4265 : 3; + 4266 : 0; + 4267 : 0; + 4268 : 0; + 4269 : 0; + 4270 : 0; + 4271 : 0; + 4272 : 0; + 4273 : 0; + 4274 : 0; + 4275 : 0; + 4276 : 3; + 4277 : 3; + 4278 : 3; + 4279 : 3; + 4280 : 3; + 4281 : 3; + 4282 : 3; + 4283 : 0; + 4284 : 0; + 4285 : 0; + 4286 : 0; + 4287 : 0; + 4288 : 0; + 4289 : 0; + 4290 : 0; + 4291 : 3; + 4292 : 3; + 4293 : 0; + 4294 : 0; + 4295 : 0; + 4296 : 0; + 4297 : 0; + 4298 : 0; + 4299 : 0; + 4300 : 0; + 4301 : 0; + 4302 : 0; + 4303 : 0; + 4304 : 0; + 4305 : 0; + 4306 : 0; + 4307 : 0; + 4308 : 0; + 4309 : 3; + 4310 : 3; + 4311 : 3; + 4312 : 3; + 4313 : 3; + 4314 : 3; + 4315 : 7; + 4316 : 7; + 4317 : 7; + 4318 : 7; + 4319 : 3; + 4320 : 7; + 4321 : 7; + 4322 : 7; + 4323 : 7; + 4324 : 7; + 4325 : 7; + 4326 : 7; + 4327 : 3; + 4328 : 3; + 4329 : 3; + 4330 : 0; + 4331 : 0; + 4332 : 0; + 4333 : 0; + 4334 : 0; + 4335 : 0; + 4336 : 0; + 4337 : 0; + 4338 : 0; + 4339 : 0; + 4340 : 0; + 4341 : 0; + 4342 : 0; + 4343 : 0; + 4344 : 0; + 4345 : 3; + 4346 : 3; + 4347 : 0; + 4348 : 0; + 4349 : 0; + 4350 : 0; + 4351 : 0; + 4352 : 0; + 4353 : 0; + 4354 : 0; + 4355 : 0; + 4356 : 0; + 4357 : 0; + 4358 : 0; + 4359 : 0; + 4360 : 0; + 4361 : 0; + 4362 : 0; + 4363 : 0; + 4364 : 0; + 4365 : 0; + 4366 : 0; + 4367 : 0; + 4368 : 0; + 4369 : 0; + 4370 : 0; + 4371 : 0; + 4372 : 0; + 4373 : 3; + 4374 : 3; + 4375 : 7; + 4376 : 3; + 4377 : 3; + 4378 : 3; + 4379 : 7; + 4380 : 7; + 4381 : 3; + 4382 : 3; + 4383 : 3; + 4384 : 3; + 4385 : 7; + 4386 : 7; + 4387 : 7; + 4388 : 7; + 4389 : 7; + 4390 : 7; + 4391 : 7; + 4392 : 3; + 4393 : 3; + 4394 : 0; + 4395 : 0; + 4396 : 0; + 4397 : 0; + 4398 : 0; + 4399 : 0; + 4400 : 0; + 4401 : 0; + 4402 : 0; + 4403 : 0; + 4404 : 0; + 4405 : 0; + 4406 : 0; + 4407 : 0; + 4408 : 0; + 4409 : 0; + 4410 : 0; + 4411 : 0; + 4412 : 0; + 4413 : 0; + 4414 : 0; + 4415 : 0; + 4416 : 0; + 4417 : 0; + 4418 : 0; + 4419 : 0; + 4420 : 0; + 4421 : 0; + 4422 : 0; + 4423 : 0; + 4424 : 0; + 4425 : 0; + 4426 : 0; + 4427 : 0; + 4428 : 0; + 4429 : 0; + 4430 : 0; + 4431 : 0; + 4432 : 0; + 4433 : 0; + 4434 : 0; + 4435 : 0; + 4436 : 0; + 4437 : 3; + 4438 : 3; + 4439 : 7; + 4440 : 3; + 4441 : 3; + 4442 : 3; + 4443 : 3; + 4444 : 7; + 4445 : 3; + 4446 : 3; + 4447 : 3; + 4448 : 3; + 4449 : 7; + 4450 : 7; + 4451 : 7; + 4452 : 7; + 4453 : 7; + 4454 : 7; + 4455 : 7; + 4456 : 3; + 4457 : 3; + 4458 : 0; + 4459 : 0; + 4460 : 0; + 4461 : 0; + 4462 : 0; + 4463 : 0; + 4464 : 0; + 4465 : 0; + 4466 : 0; + 4467 : 0; + 4468 : 0; + 4469 : 0; + 4470 : 0; + 4471 : 0; + 4472 : 0; + 4473 : 0; + 4474 : 0; + 4475 : 0; + 4476 : 0; + 4477 : 0; + 4478 : 0; + 4479 : 0; + 4480 : 0; + 4481 : 0; + 4482 : 0; + 4483 : 0; + 4484 : 0; + 4485 : 0; + 4486 : 0; + 4487 : 0; + 4488 : 0; + 4489 : 0; + 4490 : 0; + 4491 : 0; + 4492 : 0; + 4493 : 0; + 4494 : 0; + 4495 : 0; + 4496 : 0; + 4497 : 0; + 4498 : 0; + 4499 : 0; + 4500 : 3; + 4501 : 3; + 4502 : 7; + 4503 : 7; + 4504 : 3; + 4505 : 3; + 4506 : 3; + 4507 : 3; + 4508 : 7; + 4509 : 3; + 4510 : 3; + 4511 : 3; + 4512 : 3; + 4513 : 3; + 4514 : 7; + 4515 : 7; + 4516 : 7; + 4517 : 7; + 4518 : 7; + 4519 : 3; + 4520 : 3; + 4521 : 3; + 4522 : 0; + 4523 : 0; + 4524 : 0; + 4525 : 0; + 4526 : 0; + 4527 : 0; + 4528 : 0; + 4529 : 0; + 4530 : 0; + 4531 : 0; + 4532 : 0; + 4533 : 0; + 4534 : 0; + 4535 : 0; + 4536 : 0; + 4537 : 0; + 4538 : 0; + 4539 : 0; + 4540 : 0; + 4541 : 0; + 4542 : 0; + 4543 : 0; + 4544 : 0; + 4545 : 0; + 4546 : 0; + 4547 : 0; + 4548 : 0; + 4549 : 0; + 4550 : 0; + 4551 : 0; + 4552 : 0; + 4553 : 0; + 4554 : 0; + 4555 : 0; + 4556 : 0; + 4557 : 0; + 4558 : 0; + 4559 : 0; + 4560 : 3; + 4561 : 3; + 4562 : 3; + 4563 : 3; + 4564 : 3; + 4565 : 3; + 4566 : 7; + 4567 : 7; + 4568 : 3; + 4569 : 3; + 4570 : 3; + 4571 : 3; + 4572 : 3; + 4573 : 3; + 4574 : 3; + 4575 : 3; + 4576 : 3; + 4577 : 3; + 4578 : 7; + 4579 : 7; + 4580 : 7; + 4581 : 7; + 4582 : 7; + 4583 : 3; + 4584 : 3; + 4585 : 3; + 4586 : 3; + 4587 : 3; + 4588 : 3; + 4589 : 0; + 4590 : 0; + 4591 : 0; + 4592 : 0; + 4593 : 0; + 4594 : 0; + 4595 : 0; + 4596 : 0; + 4597 : 0; + 4598 : 0; + 4599 : 0; + 4600 : 0; + 4601 : 0; + 4602 : 0; + 4603 : 0; + 4604 : 0; + 4605 : 0; + 4606 : 0; + 4607 : 0; + 4608 : 0; + 4609 : 0; + 4610 : 0; + 4611 : 0; + 4612 : 0; + 4613 : 0; + 4614 : 0; + 4615 : 0; + 4616 : 0; + 4617 : 0; + 4618 : 0; + 4619 : 0; + 4620 : 0; + 4621 : 0; + 4622 : 0; + 4623 : 0; + 4624 : 3; + 4625 : 3; + 4626 : 3; + 4627 : 3; + 4628 : 3; + 4629 : 7; + 4630 : 7; + 4631 : 7; + 4632 : 3; + 4633 : 3; + 4634 : 3; + 4635 : 3; + 4636 : 3; + 4637 : 3; + 4638 : 3; + 4639 : 3; + 4640 : 3; + 4641 : 3; + 4642 : 7; + 4643 : 3; + 4644 : 7; + 4645 : 7; + 4646 : 7; + 4647 : 3; + 4648 : 3; + 4649 : 7; + 4650 : 3; + 4651 : 3; + 4652 : 3; + 4653 : 3; + 4654 : 0; + 4655 : 0; + 4656 : 0; + 4657 : 0; + 4658 : 0; + 4659 : 0; + 4660 : 0; + 4661 : 0; + 4662 : 0; + 4663 : 0; + 4664 : 0; + 4665 : 0; + 4666 : 0; + 4667 : 0; + 4668 : 0; + 4669 : 0; + 4670 : 0; + 4671 : 0; + 4672 : 0; + 4673 : 0; + 4674 : 0; + 4675 : 0; + 4676 : 0; + 4677 : 0; + 4678 : 0; + 4679 : 0; + 4680 : 0; + 4681 : 0; + 4682 : 0; + 4683 : 0; + 4684 : 0; + 4685 : 0; + 4686 : 0; + 4687 : 3; + 4688 : 3; + 4689 : 3; + 4690 : 3; + 4691 : 3; + 4692 : 3; + 4693 : 7; + 4694 : 7; + 4695 : 7; + 4696 : 3; + 4697 : 3; + 4698 : 3; + 4699 : 3; + 4700 : 3; + 4701 : 3; + 4702 : 3; + 4703 : 3; + 4704 : 3; + 4705 : 3; + 4706 : 3; + 4707 : 7; + 4708 : 7; + 4709 : 7; + 4710 : 7; + 4711 : 7; + 4712 : 3; + 4713 : 3; + 4714 : 3; + 4715 : 3; + 4716 : 3; + 4717 : 3; + 4718 : 0; + 4719 : 0; + 4720 : 0; + 4721 : 0; + 4722 : 0; + 4723 : 0; + 4724 : 0; + 4725 : 0; + 4726 : 0; + 4727 : 0; + 4728 : 0; + 4729 : 0; + 4730 : 0; + 4731 : 0; + 4732 : 0; + 4733 : 0; + 4734 : 0; + 4735 : 0; + 4736 : 0; + 4737 : 0; + 4738 : 0; + 4739 : 0; + 4740 : 0; + 4741 : 0; + 4742 : 0; + 4743 : 0; + 4744 : 0; + 4745 : 0; + 4746 : 0; + 4747 : 0; + 4748 : 0; + 4749 : 0; + 4750 : 3; + 4751 : 3; + 4752 : 3; + 4753 : 3; + 4754 : 3; + 4755 : 7; + 4756 : 7; + 4757 : 7; + 4758 : 7; + 4759 : 7; + 4760 : 3; + 4761 : 3; + 4762 : 3; + 4763 : 3; + 4764 : 3; + 4765 : 3; + 4766 : 3; + 4767 : 3; + 4768 : 3; + 4769 : 3; + 4770 : 3; + 4771 : 7; + 4772 : 7; + 4773 : 7; + 4774 : 7; + 4775 : 7; + 4776 : 7; + 4777 : 7; + 4778 : 7; + 4779 : 3; + 4780 : 3; + 4781 : 3; + 4782 : 3; + 4783 : 0; + 4784 : 0; + 4785 : 0; + 4786 : 0; + 4787 : 0; + 4788 : 0; + 4789 : 0; + 4790 : 0; + 4791 : 0; + 4792 : 0; + 4793 : 0; + 4794 : 0; + 4795 : 0; + 4796 : 0; + 4797 : 0; + 4798 : 0; + 4799 : 0; + 4800 : 0; + 4801 : 0; + 4802 : 0; + 4803 : 0; + 4804 : 0; + 4805 : 0; + 4806 : 0; + 4807 : 0; + 4808 : 0; + 4809 : 0; + 4810 : 0; + 4811 : 0; + 4812 : 0; + 4813 : 0; + 4814 : 3; + 4815 : 3; + 4816 : 7; + 4817 : 3; + 4818 : 7; + 4819 : 7; + 4820 : 7; + 4821 : 7; + 4822 : 3; + 4823 : 7; + 4824 : 7; + 4825 : 3; + 4826 : 3; + 4827 : 3; + 4828 : 3; + 4829 : 3; + 4830 : 3; + 4831 : 3; + 4832 : 3; + 4833 : 3; + 4834 : 3; + 4835 : 3; + 4836 : 3; + 4837 : 7; + 4838 : 7; + 4839 : 3; + 4840 : 7; + 4841 : 7; + 4842 : 7; + 4843 : 7; + 4844 : 3; + 4845 : 3; + 4846 : 3; + 4847 : 3; + 4848 : 0; + 4849 : 0; + 4850 : 0; + 4851 : 0; + 4852 : 0; + 4853 : 0; + 4854 : 0; + 4855 : 0; + 4856 : 0; + 4857 : 0; + 4858 : 0; + 4859 : 0; + 4860 : 0; + 4861 : 0; + 4862 : 0; + 4863 : 0; + 4864 : 0; + 4865 : 0; + 4866 : 0; + 4867 : 0; + 4868 : 0; + 4869 : 0; + 4870 : 0; + 4871 : 0; + 4872 : 0; + 4873 : 0; + 4874 : 0; + 4875 : 0; + 4876 : 0; + 4877 : 3; + 4878 : 3; + 4879 : 7; + 4880 : 7; + 4881 : 7; + 4882 : 7; + 4883 : 7; + 4884 : 7; + 4885 : 7; + 4886 : 3; + 4887 : 7; + 4888 : 7; + 4889 : 3; + 4890 : 3; + 4891 : 3; + 4892 : 3; + 4893 : 3; + 4894 : 3; + 4895 : 3; + 4896 : 3; + 4897 : 3; + 4898 : 3; + 4899 : 3; + 4900 : 3; + 4901 : 7; + 4902 : 7; + 4903 : 3; + 4904 : 7; + 4905 : 7; + 4906 : 3; + 4907 : 3; + 4908 : 3; + 4909 : 3; + 4910 : 7; + 4911 : 7; + 4912 : 3; + 4913 : 0; + 4914 : 0; + 4915 : 0; + 4916 : 0; + 4917 : 0; + 4918 : 0; + 4919 : 0; + 4920 : 0; + 4921 : 0; + 4922 : 0; + 4923 : 0; + 4924 : 0; + 4925 : 0; + 4926 : 0; + 4927 : 0; + 4928 : 0; + 4929 : 0; + 4930 : 0; + 4931 : 0; + 4932 : 0; + 4933 : 0; + 4934 : 0; + 4935 : 0; + 4936 : 0; + 4937 : 0; + 4938 : 0; + 4939 : 0; + 4940 : 3; + 4941 : 3; + 4942 : 7; + 4943 : 7; + 4944 : 7; + 4945 : 7; + 4946 : 7; + 4947 : 7; + 4948 : 7; + 4949 : 7; + 4950 : 3; + 4951 : 7; + 4952 : 7; + 4953 : 3; + 4954 : 7; + 4955 : 7; + 4956 : 7; + 4957 : 3; + 4958 : 3; + 4959 : 3; + 4960 : 3; + 4961 : 3; + 4962 : 3; + 4963 : 3; + 4964 : 3; + 4965 : 7; + 4966 : 7; + 4967 : 3; + 4968 : 3; + 4969 : 3; + 4970 : 3; + 4971 : 3; + 4972 : 3; + 4973 : 3; + 4974 : 7; + 4975 : 7; + 4976 : 7; + 4977 : 3; + 4978 : 0; + 4979 : 0; + 4980 : 0; + 4981 : 0; + 4982 : 0; + 4983 : 0; + 4984 : 0; + 4985 : 0; + 4986 : 0; + 4987 : 0; + 4988 : 0; + 4989 : 0; + 4990 : 0; + 4991 : 0; + 4992 : 0; + 4993 : 0; + 4994 : 0; + 4995 : 0; + 4996 : 0; + 4997 : 0; + 4998 : 0; + 4999 : 0; + 5000 : 0; + 5001 : 0; + 5002 : 0; + 5003 : 3; + 5004 : 3; + 5005 : 7; + 5006 : 7; + 5007 : 7; + 5008 : 7; + 5009 : 7; + 5010 : 7; + 5011 : 7; + 5012 : 7; + 5013 : 7; + 5014 : 3; + 5015 : 7; + 5016 : 7; + 5017 : 3; + 5018 : 3; + 5019 : 3; + 5020 : 3; + 5021 : 3; + 5022 : 3; + 5023 : 3; + 5024 : 3; + 5025 : 3; + 5026 : 3; + 5027 : 3; + 5028 : 3; + 5029 : 3; + 5030 : 3; + 5031 : 3; + 5032 : 3; + 5033 : 3; + 5034 : 3; + 5035 : 3; + 5036 : 3; + 5037 : 3; + 5038 : 7; + 5039 : 7; + 5040 : 7; + 5041 : 7; + 5042 : 0; + 5043 : 0; + 5044 : 0; + 5045 : 0; + 5046 : 0; + 5047 : 0; + 5048 : 0; + 5049 : 0; + 5050 : 0; + 5051 : 0; + 5052 : 0; + 5053 : 0; + 5054 : 0; + 5055 : 0; + 5056 : 0; + 5057 : 0; + 5058 : 0; + 5059 : 0; + 5060 : 0; + 5061 : 0; + 5062 : 0; + 5063 : 0; + 5064 : 0; + 5065 : 0; + 5066 : 3; + 5067 : 3; + 5068 : 3; + 5069 : 7; + 5070 : 7; + 5071 : 7; + 5072 : 7; + 5073 : 7; + 5074 : 7; + 5075 : 7; + 5076 : 7; + 5077 : 7; + 5078 : 3; + 5079 : 7; + 5080 : 3; + 5081 : 0; + 5082 : 0; + 5083 : 0; + 5084 : 0; + 5085 : 0; + 5086 : 0; + 5087 : 0; + 5088 : 0; + 5089 : 0; + 5090 : 0; + 5091 : 0; + 5092 : 7; + 5093 : 3; + 5094 : 3; + 5095 : 3; + 5096 : 3; + 5097 : 3; + 5098 : 3; + 5099 : 3; + 5100 : 3; + 5101 : 3; + 5102 : 3; + 5103 : 7; + 5104 : 7; + 5105 : 7; + 5106 : 3; + 5107 : 0; + 5108 : 0; + 5109 : 0; + 5110 : 0; + 5111 : 0; + 5112 : 0; + 5113 : 0; + 5114 : 0; + 5115 : 0; + 5116 : 0; + 5117 : 0; + 5118 : 0; + 5119 : 0; + 5120 : 0; + 5121 : 0; + 5122 : 0; + 5123 : 0; + 5124 : 0; + 5125 : 0; + 5126 : 0; + 5127 : 0; + 5128 : 0; + 5129 : 0; + 5130 : 3; + 5131 : 3; + 5132 : 3; + 5133 : 7; + 5134 : 7; + 5135 : 7; + 5136 : 7; + 5137 : 3; + 5138 : 3; + 5139 : 7; + 5140 : 7; + 5141 : 7; + 5142 : 3; + 5143 : 3; + 5144 : 3; + 5145 : 0; + 5146 : 0; + 5147 : 0; + 5148 : 0; + 5149 : 0; + 5150 : 0; + 5151 : 0; + 5152 : 0; + 5153 : 0; + 5154 : 0; + 5155 : 0; + 5156 : 7; + 5157 : 3; + 5158 : 3; + 5159 : 3; + 5160 : 7; + 5161 : 7; + 5162 : 3; + 5163 : 3; + 5164 : 3; + 5165 : 3; + 5166 : 3; + 5167 : 3; + 5168 : 3; + 5169 : 3; + 5170 : 3; + 5171 : 3; + 5172 : 0; + 5173 : 0; + 5174 : 0; + 5175 : 0; + 5176 : 0; + 5177 : 0; + 5178 : 0; + 5179 : 0; + 5180 : 0; + 5181 : 0; + 5182 : 0; + 5183 : 0; + 5184 : 0; + 5185 : 0; + 5186 : 0; + 5187 : 0; + 5188 : 0; + 5189 : 0; + 5190 : 0; + 5191 : 0; + 5192 : 0; + 5193 : 0; + 5194 : 3; + 5195 : 3; + 5196 : 3; + 5197 : 3; + 5198 : 7; + 5199 : 7; + 5200 : 3; + 5201 : 3; + 5202 : 3; + 5203 : 3; + 5204 : 3; + 5205 : 3; + 5206 : 3; + 5207 : 3; + 5208 : 3; + 5209 : 0; + 5210 : 0; + 5211 : 0; + 5212 : 0; + 5213 : 0; + 5214 : 0; + 5215 : 0; + 5216 : 0; + 5217 : 0; + 5218 : 0; + 5219 : 0; + 5220 : 7; + 5221 : 3; + 5222 : 7; + 5223 : 7; + 5224 : 7; + 5225 : 7; + 5226 : 7; + 5227 : 7; + 5228 : 3; + 5229 : 3; + 5230 : 3; + 5231 : 3; + 5232 : 3; + 5233 : 3; + 5234 : 3; + 5235 : 3; + 5236 : 0; + 5237 : 0; + 5238 : 0; + 5239 : 0; + 5240 : 0; + 5241 : 0; + 5242 : 0; + 5243 : 0; + 5244 : 0; + 5245 : 0; + 5246 : 0; + 5247 : 0; + 5248 : 0; + 5249 : 0; + 5250 : 0; + 5251 : 0; + 5252 : 0; + 5253 : 0; + 5254 : 0; + 5255 : 0; + 5256 : 0; + 5257 : 0; + 5258 : 3; + 5259 : 3; + 5260 : 3; + 5261 : 3; + 5262 : 3; + 5263 : 3; + 5264 : 3; + 5265 : 3; + 5266 : 3; + 5267 : 3; + 5268 : 3; + 5269 : 3; + 5270 : 3; + 5271 : 3; + 5272 : 3; + 5273 : 0; + 5274 : 0; + 5275 : 0; + 5276 : 0; + 5277 : 0; + 5278 : 0; + 5279 : 0; + 5280 : 0; + 5281 : 0; + 5282 : 0; + 5283 : 0; + 5284 : 3; + 5285 : 3; + 5286 : 7; + 5287 : 7; + 5288 : 7; + 5289 : 7; + 5290 : 7; + 5291 : 7; + 5292 : 7; + 5293 : 3; + 5294 : 3; + 5295 : 3; + 5296 : 3; + 5297 : 7; + 5298 : 7; + 5299 : 3; + 5300 : 0; + 5301 : 0; + 5302 : 0; + 5303 : 0; + 5304 : 0; + 5305 : 0; + 5306 : 0; + 5307 : 0; + 5308 : 0; + 5309 : 0; + 5310 : 0; + 5311 : 0; + 5312 : 0; + 5313 : 0; + 5314 : 0; + 5315 : 0; + 5316 : 0; + 5317 : 0; + 5318 : 0; + 5319 : 0; + 5320 : 0; + 5321 : 0; + 5322 : 3; + 5323 : 3; + 5324 : 3; + 5325 : 3; + 5326 : 3; + 5327 : 3; + 5328 : 3; + 5329 : 3; + 5330 : 3; + 5331 : 3; + 5332 : 3; + 5333 : 3; + 5334 : 3; + 5335 : 0; + 5336 : 3; + 5337 : 0; + 5338 : 0; + 5339 : 0; + 5340 : 0; + 5341 : 0; + 5342 : 0; + 5343 : 0; + 5344 : 0; + 5345 : 0; + 5346 : 0; + 5347 : 0; + 5348 : 3; + 5349 : 0; + 5350 : 3; + 5351 : 7; + 5352 : 7; + 5353 : 7; + 5354 : 7; + 5355 : 7; + 5356 : 7; + 5357 : 3; + 5358 : 3; + 5359 : 3; + 5360 : 7; + 5361 : 7; + 5362 : 7; + 5363 : 3; + 5364 : 0; + 5365 : 0; + 5366 : 0; + 5367 : 0; + 5368 : 0; + 5369 : 0; + 5370 : 0; + 5371 : 0; + 5372 : 0; + 5373 : 0; + 5374 : 0; + 5375 : 0; + 5376 : 0; + 5377 : 0; + 5378 : 0; + 5379 : 0; + 5380 : 0; + 5381 : 0; + 5382 : 0; + 5383 : 0; + 5384 : 0; + 5385 : 0; + 5386 : 0; + 5387 : 3; + 5388 : 3; + 5389 : 3; + 5390 : 3; + 5391 : 3; + 5392 : 3; + 5393 : 3; + 5394 : 3; + 5395 : 3; + 5396 : 3; + 5397 : 0; + 5398 : 0; + 5399 : 0; + 5400 : 0; + 5401 : 0; + 5402 : 0; + 5403 : 0; + 5404 : 0; + 5405 : 0; + 5406 : 0; + 5407 : 0; + 5408 : 0; + 5409 : 0; + 5410 : 0; + 5411 : 0; + 5412 : 0; + 5413 : 0; + 5414 : 0; + 5415 : 0; + 5416 : 0; + 5417 : 3; + 5418 : 3; + 5419 : 7; + 5420 : 3; + 5421 : 3; + 5422 : 3; + 5423 : 3; + 5424 : 7; + 5425 : 7; + 5426 : 3; + 5427 : 0; + 5428 : 0; + 5429 : 0; + 5430 : 0; + 5431 : 0; + 5432 : 0; + 5433 : 0; + 5434 : 0; + 5435 : 0; + 5436 : 0; + 5437 : 0; + 5438 : 0; + 5439 : 0; + 5440 : 0; + 5441 : 0; + 5442 : 0; + 5443 : 0; + 5444 : 0; + 5445 : 0; + 5446 : 0; + 5447 : 0; + 5448 : 0; + 5449 : 0; + 5450 : 0; + 5451 : 0; + 5452 : 3; + 5453 : 3; + 5454 : 3; + 5455 : 3; + 5456 : 3; + 5457 : 3; + 5458 : 0; + 5459 : 0; + 5460 : 0; + 5461 : 0; + 5462 : 0; + 5463 : 0; + 5464 : 0; + 5465 : 0; + 5466 : 0; + 5467 : 0; + 5468 : 0; + 5469 : 0; + 5470 : 0; + 5471 : 0; + 5472 : 0; + 5473 : 0; + 5474 : 0; + 5475 : 0; + 5476 : 0; + 5477 : 0; + 5478 : 0; + 5479 : 0; + 5480 : 0; + 5481 : 0; + 5482 : 0; + 5483 : 3; + 5484 : 3; + 5485 : 3; + 5486 : 3; + 5487 : 3; + 5488 : 7; + 5489 : 7; + 5490 : 0; + 5491 : 0; + 5492 : 0; + 5493 : 0; + 5494 : 0; + 5495 : 0; + 5496 : 0; + 5497 : 0; + 5498 : 0; + 5499 : 0; + 5500 : 0; + 5501 : 0; + 5502 : 0; + 5503 : 0; + [5504..5599] : 0; +END; diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_player.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_player.v new file mode 100644 index 00000000..7ea055cc --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_player.v @@ -0,0 +1,161 @@ +// megafunction wizard: %ROM: 1-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: sprite_player.v +// Megafunction Name(s): +// altsyncram +// +// 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 sprite_player ( + address, + clock, + q); + + input [12:0] address; + input clock; + output [3:0] q; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [3:0] sub_wire0; + wire [3:0] q = sub_wire0[3:0]; + + altsyncram altsyncram_component ( + .address_a (address), + .clock0 (clock), + .q_a (sub_wire0), + .aclr0 (1'b0), + .aclr1 (1'b0), + .address_b (1'b1), + .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_a ({4{1'b1}}), + .data_b (1'b1), + .eccstatus (), + .q_b (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_a (1'b0), + .wren_b (1'b0)); + defparam + altsyncram_component.address_aclr_a = "NONE", + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", + altsyncram_component.init_file = "sprite_player.mif", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 5600, + altsyncram_component.operation_mode = "ROM", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_reg_a = "CLOCK0", + altsyncram_component.ram_block_type = "M9K", + altsyncram_component.widthad_a = 13, + altsyncram_component.width_a = 4, + altsyncram_component.width_byteena_a = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +// Retrieval info: PRIVATE: AclrByte NUMERIC "0" +// Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: Clken NUMERIC "0" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "sprite_player.mif" +// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "5600" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "2" +// Retrieval info: PRIVATE: RegAddr NUMERIC "1" +// Retrieval info: PRIVATE: RegOutput NUMERIC "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: SingleClock NUMERIC "1" +// Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +// Retrieval info: PRIVATE: WidthAddr NUMERIC "13" +// Retrieval info: PRIVATE: WidthData NUMERIC "4" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: INIT_FILE STRING "sprite_player.mif" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "5600" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +// Retrieval info: CONSTANT: RAM_BLOCK_TYPE STRING "M9K" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "4" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: USED_PORT: address 0 0 13 0 INPUT NODEFVAL "address[12..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: q 0 0 4 0 OUTPUT NODEFVAL "q[3..0]" +// Retrieval info: CONNECT: @address_a 0 0 13 0 address 0 0 13 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: q 0 0 4 0 @q_a 0 0 4 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_player.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_player.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_player.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_player.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_player_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_player_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_ship.mif b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_ship.mif new file mode 100644 index 00000000..56f7696a --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_ship.mif @@ -0,0 +1,3595 @@ +WIDTH=4; +DEPTH=8000; + +ADDRESS_RADIX=UNS; +DATA_RADIX=HEX; + +CONTENT BEGIN + + 0 : 0; + 1 : 0; + 2 : 0; + 3 : 0; + 4 : 0; + 5 : 0; + 6 : 0; + 7 : 0; + 8 : 0; + 9 : 0; + 10 : 0; + 11 : 0; + 12 : 0; + 13 : 0; + 14 : 0; + 15 : 0; + 16 : 0; + 17 : 0; + 18 : 0; + 19 : 0; + 20 : 0; + 21 : 0; + 22 : 0; + 23 : 0; + 24 : 0; + 25 : 0; + 26 : 0; + 27 : 0; + 28 : 0; + 29 : 0; + 30 : 0; + 31 : 0; + 32 : 0; + 33 : 0; + 34 : 0; + 35 : 0; + 36 : 0; + 37 : 0; + 38 : 0; + 39 : 0; + 40 : 0; + 41 : 0; + 42 : 0; + 43 : 0; + 44 : 0; + 45 : 0; + 46 : 0; + 47 : 0; + 48 : 0; + 49 : 0; + 50 : 0; + 51 : 0; + 52 : 0; + 53 : 0; + 54 : 0; + 55 : 3; + 56 : 3; + 57 : 0; + 58 : 0; + 59 : 0; + 60 : 0; + 61 : 0; + 62 : 0; + 63 : 0; + 64 : 0; + 65 : 0; + 66 : 0; + 67 : 0; + 68 : 0; + 69 : 0; + 70 : 0; + 71 : 0; + 72 : 0; + 73 : 0; + 74 : 0; + 75 : 0; + 76 : 0; + 77 : 0; + 78 : 0; + 79 : 0; + 80 : 0; + 81 : 0; + 82 : 0; + 83 : 0; + 84 : 0; + 85 : 0; + 86 : 0; + 87 : 0; + 88 : 0; + 89 : 0; + 90 : 0; + 91 : 0; + 92 : 0; + 93 : 0; + 94 : 0; + 95 : 0; + 96 : 0; + 97 : 0; + 98 : 0; + 99 : 0; + 100 : 0; + 101 : 0; + 102 : 0; + 103 : 0; + 104 : 0; + 105 : 0; + 106 : 0; + 107 : 0; + 108 : 0; + 109 : 0; + 110 : 0; + 111 : 0; + 112 : 0; + 113 : 0; + 114 : 0; + 115 : 0; + 116 : 0; + 117 : 0; + 118 : 0; + 119 : 0; + 120 : 0; + 121 : 0; + 122 : 0; + 123 : 0; + 124 : 0; + 125 : 0; + 126 : 0; + 127 : 0; + 128 : 0; + 129 : 0; + 130 : 0; + 131 : 0; + 132 : 0; + 133 : 0; + 134 : 0; + 135 : 0; + 136 : 0; + 137 : 0; + 138 : 0; + 139 : 0; + 140 : 0; + 141 : 0; + 142 : 0; + 143 : 0; + 144 : 0; + 145 : 0; + 146 : 0; + 147 : 0; + 148 : 0; + 149 : 0; + 150 : 0; + 151 : 0; + 152 : 0; + 153 : 0; + 154 : 0; + 155 : 0; + 156 : 0; + 157 : 0; + 158 : 0; + 159 : 0; + 160 : 0; + 161 : 0; + 162 : 0; + 163 : 0; + 164 : 0; + 165 : 0; + 166 : 0; + 167 : 0; + 168 : 0; + 169 : 0; + 170 : 0; + 171 : 0; + 172 : 0; + 173 : 0; + 174 : 0; + 175 : 0; + 176 : 0; + 177 : 0; + 178 : 0; + 179 : 0; + 180 : 0; + 181 : 0; + 182 : 0; + 183 : 3; + 184 : 3; + 185 : 3; + 186 : 3; + 187 : 0; + 188 : 0; + 189 : 0; + 190 : 0; + 191 : 0; + 192 : 0; + 193 : 0; + 194 : 0; + 195 : 0; + 196 : 0; + 197 : 0; + 198 : 0; + 199 : 0; + 200 : 0; + 201 : 0; + 202 : 0; + 203 : 0; + 204 : 0; + 205 : 0; + 206 : 0; + 207 : 0; + 208 : 0; + 209 : 0; + 210 : 0; + 211 : 0; + 212 : 0; + 213 : 0; + 214 : 0; + 215 : 0; + 216 : 0; + 217 : 0; + 218 : 0; + 219 : 0; + 220 : 0; + 221 : 0; + 222 : 0; + 223 : 0; + 224 : 0; + 225 : 0; + 226 : 0; + 227 : 0; + 228 : 0; + 229 : 0; + 230 : 0; + 231 : 0; + 232 : 0; + 233 : 0; + 234 : 0; + 235 : 0; + 236 : 0; + 237 : 0; + 238 : 0; + 239 : 0; + 240 : 0; + 241 : 0; + 242 : 0; + 243 : 0; + 244 : 0; + 245 : 0; + 246 : 0; + 247 : 0; + 248 : 0; + 249 : 0; + 250 : 0; + 251 : 0; + 252 : 0; + 253 : 0; + 254 : 0; + 255 : 0; + 256 : 0; + 257 : 0; + 258 : 0; + 259 : 0; + 260 : 0; + 261 : 0; + 262 : 0; + 263 : 0; + 264 : 0; + 265 : 0; + 266 : 0; + 267 : 0; + 268 : 0; + 269 : 0; + 270 : 0; + 271 : 0; + 272 : 0; + 273 : 0; + 274 : 0; + 275 : 0; + 276 : 0; + 277 : 0; + 278 : 0; + 279 : 0; + 280 : 0; + 281 : 0; + 282 : 0; + 283 : 0; + 284 : 0; + 285 : 0; + 286 : 0; + 287 : 0; + 288 : 0; + 289 : 0; + 290 : 0; + 291 : 0; + 292 : 0; + 293 : 0; + 294 : 0; + 295 : 0; + 296 : 0; + 297 : 0; + 298 : 0; + 299 : 0; + 300 : 0; + 301 : 0; + 302 : 0; + 303 : 0; + 304 : 0; + 305 : 0; + 306 : 0; + 307 : 0; + 308 : 0; + 309 : 0; + 310 : 3; + 311 : 3; + 312 : 3; + 313 : 0; + 314 : 3; + 315 : 0; + 316 : 0; + 317 : 0; + 318 : 0; + 319 : 0; + 320 : 0; + 321 : 0; + 322 : 0; + 323 : 0; + 324 : 0; + 325 : 0; + 326 : 0; + 327 : 0; + 328 : 0; + 329 : 0; + 330 : 0; + 331 : 0; + 332 : 0; + 333 : 0; + 334 : 0; + 335 : 0; + 336 : 0; + 337 : 0; + 338 : 0; + 339 : 0; + 340 : 0; + 341 : 0; + 342 : 0; + 343 : 0; + 344 : 0; + 345 : 0; + 346 : 0; + 347 : 0; + 348 : 0; + 349 : 0; + 350 : 0; + 351 : 0; + 352 : 0; + 353 : 0; + 354 : 0; + 355 : 0; + 356 : 0; + 357 : 0; + 358 : 0; + 359 : 0; + 360 : 0; + 361 : 0; + 362 : 0; + 363 : 0; + 364 : 0; + 365 : 0; + 366 : 0; + 367 : 0; + 368 : 0; + 369 : 0; + 370 : 0; + 371 : 0; + 372 : 0; + 373 : 0; + 374 : 0; + 375 : 0; + 376 : 0; + 377 : 0; + 378 : 0; + 379 : 0; + 380 : 0; + 381 : 0; + 382 : 0; + 383 : 0; + 384 : 0; + 385 : 0; + 386 : 0; + 387 : 0; + 388 : 0; + 389 : 0; + 390 : 0; + 391 : 0; + 392 : 0; + 393 : 0; + 394 : 0; + 395 : 0; + 396 : 0; + 397 : 0; + 398 : 0; + 399 : 0; + 400 : 0; + 401 : 0; + 402 : 0; + 403 : 0; + 404 : 0; + 405 : 0; + 406 : 0; + 407 : 0; + 408 : 0; + 409 : 0; + 410 : 0; + 411 : 0; + 412 : 0; + 413 : 0; + 414 : 0; + 415 : 0; + 416 : 0; + 417 : 0; + 418 : 0; + 419 : 0; + 420 : 0; + 421 : 0; + 422 : 0; + 423 : 0; + 424 : 0; + 425 : 0; + 426 : 0; + 427 : 0; + 428 : 0; + 429 : 0; + 430 : 0; + 431 : 0; + 432 : 0; + 433 : 0; + 434 : 0; + 435 : 0; + 436 : 0; + 437 : 0; + 438 : 0; + 439 : 0; + 440 : 3; + 441 : 0; + 442 : 0; + 443 : 0; + 444 : 0; + 445 : 0; + 446 : 0; + 447 : 0; + 448 : 0; + 449 : 0; + 450 : 0; + 451 : 0; + 452 : 0; + 453 : 0; + 454 : 0; + 455 : 0; + 456 : 0; + 457 : 0; + 458 : 0; + 459 : 0; + 460 : 0; + 461 : 0; + 462 : 0; + 463 : 0; + 464 : 0; + 465 : 0; + 466 : 0; + 467 : 0; + 468 : 0; + 469 : 0; + 470 : 0; + 471 : 0; + 472 : 0; + 473 : 0; + 474 : 0; + 475 : 0; + 476 : 0; + 477 : 0; + 478 : 0; + 479 : 0; + 480 : 0; + 481 : 0; + 482 : 0; + 483 : 0; + 484 : 0; + 485 : 0; + 486 : 0; + 487 : 0; + 488 : 0; + 489 : 0; + 490 : 0; + 491 : 0; + 492 : 0; + 493 : 0; + 494 : 0; + 495 : 0; + 496 : 0; + 497 : 0; + 498 : 0; + 499 : 0; + 500 : 0; + 501 : 0; + 502 : 0; + 503 : 0; + 504 : 0; + 505 : 0; + 506 : 0; + 507 : 0; + 508 : 0; + 509 : 0; + 510 : 0; + 511 : 0; + 512 : 0; + 513 : 0; + 514 : 0; + 515 : 0; + 516 : 0; + 517 : 0; + 518 : 0; + 519 : 0; + 520 : 0; + 521 : 0; + 522 : 0; + 523 : 0; + 524 : 0; + 525 : 0; + 526 : 0; + 527 : 0; + 528 : 0; + 529 : 0; + 530 : 0; + 531 : 0; + 532 : 0; + 533 : 0; + 534 : 0; + 535 : 0; + 536 : 0; + 537 : 0; + 538 : 0; + 539 : 0; + 540 : 0; + 541 : 0; + 542 : 0; + 543 : 0; + 544 : 0; + 545 : 0; + 546 : 0; + 547 : 0; + 548 : 0; + 549 : 0; + 550 : 0; + 551 : 0; + 552 : 0; + 553 : 0; + 554 : 0; + 555 : 0; + 556 : 0; + 557 : 0; + 558 : 0; + 559 : 0; + 560 : 0; + 561 : 0; + 562 : 0; + 563 : 0; + 564 : 0; + 565 : 0; + 566 : 0; + 567 : 0; + 568 : 3; + 569 : 0; + 570 : 0; + 571 : 0; + 572 : 3; + 573 : 0; + 574 : 0; + 575 : 0; + 576 : 0; + 577 : 0; + 578 : 0; + 579 : 0; + 580 : 0; + 581 : 0; + 582 : 0; + 583 : 0; + 584 : 0; + 585 : 0; + 586 : 0; + 587 : 0; + 588 : 0; + 589 : 0; + 590 : 0; + 591 : 0; + 592 : 0; + 593 : 0; + 594 : 0; + 595 : 0; + 596 : 0; + 597 : 0; + 598 : 0; + 599 : 0; + 600 : 0; + 601 : 0; + 602 : 0; + 603 : 0; + 604 : 0; + 605 : 0; + 606 : 0; + 607 : 0; + 608 : 0; + 609 : 0; + 610 : 0; + 611 : 0; + 612 : 0; + 613 : 0; + 614 : 0; + 615 : 0; + 616 : 0; + 617 : 0; + 618 : 0; + 619 : 0; + 620 : 0; + 621 : 0; + 622 : 0; + 623 : 0; + 624 : 0; + 625 : 0; + 626 : 0; + 627 : 0; + 628 : 0; + 629 : 0; + 630 : 0; + 631 : 0; + 632 : 0; + 633 : 0; + 634 : 0; + 635 : 0; + 636 : 0; + 637 : 0; + 638 : 0; + 639 : 0; + 640 : 0; + 641 : 0; + 642 : 0; + 643 : 0; + 644 : 0; + 645 : 0; + 646 : 0; + 647 : 0; + 648 : 0; + 649 : 0; + 650 : 0; + 651 : 0; + 652 : 0; + 653 : 0; + 654 : 0; + 655 : 0; + 656 : 0; + 657 : 0; + 658 : 0; + 659 : 0; + 660 : 0; + 661 : 0; + 662 : 0; + 663 : 0; + 664 : 0; + 665 : 0; + 666 : 0; + 667 : 0; + 668 : 0; + 669 : 0; + 670 : 0; + 671 : 0; + 672 : 0; + 673 : 0; + 674 : 0; + 675 : 0; + 676 : 0; + 677 : 0; + 678 : 0; + 679 : 0; + 680 : 0; + 681 : 0; + 682 : 0; + 683 : 0; + 684 : 0; + 685 : 0; + 686 : 0; + 687 : 0; + 688 : 0; + 689 : 0; + 690 : 0; + 691 : 0; + 692 : 0; + 693 : 0; + 694 : 0; + 695 : 0; + 696 : 3; + 697 : 3; + 698 : 0; + 699 : 0; + 700 : 0; + 701 : 0; + 702 : 0; + 703 : 0; + 704 : 0; + 705 : 0; + 706 : 0; + 707 : 0; + 708 : 0; + 709 : 0; + 710 : 3; + 711 : 3; + 712 : 0; + 713 : 0; + 714 : 0; + 715 : 0; + 716 : 0; + 717 : 0; + 718 : 0; + 719 : 0; + 720 : 0; + 721 : 0; + 722 : 0; + 723 : 0; + 724 : 0; + 725 : 0; + 726 : 0; + 727 : 0; + 728 : 0; + 729 : 0; + 730 : 0; + 731 : 0; + 732 : 0; + 733 : 0; + 734 : 0; + 735 : 0; + 736 : 0; + 737 : 0; + 738 : 0; + 739 : 0; + 740 : 0; + 741 : 0; + 742 : 0; + 743 : 0; + 744 : 0; + 745 : 0; + 746 : 0; + 747 : 0; + 748 : 0; + 749 : 0; + 750 : 0; + 751 : 0; + 752 : 0; + 753 : 0; + 754 : 0; + 755 : 0; + 756 : 0; + 757 : 0; + 758 : 0; + 759 : 0; + 760 : 0; + 761 : 0; + 762 : 0; + 763 : 0; + 764 : 0; + 765 : 0; + 766 : 0; + 767 : 0; + 768 : 0; + 769 : 0; + 770 : 0; + 771 : 0; + 772 : 0; + 773 : 0; + 774 : 0; + 775 : 0; + 776 : 0; + 777 : 0; + 778 : 0; + 779 : 0; + 780 : 0; + 781 : 0; + 782 : 0; + 783 : 0; + 784 : 0; + 785 : 0; + 786 : 0; + 787 : 0; + 788 : 0; + 789 : 0; + 790 : 0; + 791 : 0; + 792 : 0; + 793 : 0; + 794 : 0; + 795 : 0; + 796 : 0; + 797 : 0; + 798 : 0; + 799 : 0; + 800 : 0; + 801 : 0; + 802 : 0; + 803 : 0; + 804 : 0; + 805 : 0; + 806 : 0; + 807 : 0; + 808 : 0; + 809 : 0; + 810 : 0; + 811 : 0; + 812 : 0; + 813 : 0; + 814 : 0; + 815 : 0; + 816 : 0; + 817 : 0; + 818 : 0; + 819 : 0; + 820 : 0; + 821 : 0; + 822 : 0; + 823 : 3; + 824 : 3; + 825 : 3; + 826 : 3; + 827 : 3; + 828 : 3; + 829 : 0; + 830 : 0; + 831 : 0; + 832 : 0; + 833 : 0; + 834 : 0; + 835 : 0; + 836 : 0; + 837 : 3; + 838 : 3; + 839 : 3; + 840 : 0; + 841 : 0; + 842 : 0; + 843 : 0; + 844 : 0; + 845 : 0; + 846 : 0; + 847 : 0; + 848 : 0; + 849 : 0; + 850 : 0; + 851 : 0; + 852 : 0; + 853 : 0; + 854 : 0; + 855 : 0; + 856 : 0; + 857 : 0; + 858 : 0; + 859 : 0; + 860 : 0; + 861 : 0; + 862 : 0; + 863 : 0; + 864 : 0; + 865 : 0; + 866 : 0; + 867 : 0; + 868 : 0; + 869 : 0; + 870 : 0; + 871 : 0; + 872 : 0; + 873 : 0; + 874 : 0; + 875 : 0; + 876 : 0; + 877 : 0; + 878 : 0; + 879 : 0; + 880 : 0; + 881 : 0; + 882 : 0; + 883 : 0; + 884 : 0; + 885 : 0; + 886 : 0; + 887 : 0; + 888 : 0; + 889 : 0; + 890 : 0; + 891 : 0; + 892 : 0; + 893 : 0; + 894 : 0; + 895 : 0; + 896 : 0; + 897 : 0; + 898 : 0; + 899 : 0; + 900 : 0; + 901 : 0; + 902 : 0; + 903 : 0; + 904 : 0; + 905 : 0; + 906 : 0; + 907 : 0; + 908 : 0; + 909 : 0; + 910 : 0; + 911 : 0; + 912 : 0; + 913 : 0; + 914 : 0; + 915 : 0; + 916 : 0; + 917 : 0; + 918 : 0; + 919 : 0; + 920 : 0; + 921 : 0; + 922 : 0; + 923 : 0; + 924 : 0; + 925 : 0; + 926 : 0; + 927 : 0; + 928 : 0; + 929 : 0; + 930 : 0; + 931 : 0; + 932 : 0; + 933 : 0; + 934 : 0; + 935 : 0; + 936 : 0; + 937 : 0; + 938 : 0; + 939 : 0; + 940 : 0; + 941 : 0; + 942 : 0; + 943 : 0; + 944 : 0; + 945 : 0; + 946 : 0; + 947 : 0; + 948 : 0; + 949 : 0; + 950 : 0; + 951 : 3; + 952 : 3; + 953 : 3; + 954 : 3; + 955 : 0; + 956 : 0; + 957 : 0; + 958 : 0; + 959 : 0; + 960 : 0; + 961 : 0; + 962 : 0; + 963 : 0; + 964 : 3; + 965 : 3; + 966 : 3; + 967 : 3; + 968 : 0; + 969 : 0; + 970 : 0; + 971 : 0; + 972 : 0; + 973 : 0; + 974 : 0; + 975 : 0; + 976 : 0; + 977 : 0; + 978 : 0; + 979 : 0; + 980 : 0; + 981 : 0; + 982 : 0; + 983 : 0; + 984 : 0; + 985 : 0; + 986 : 0; + 987 : 0; + 988 : 0; + 989 : 0; + 990 : 0; + 991 : 0; + 992 : 0; + 993 : 0; + 994 : 0; + 995 : 0; + 996 : 0; + 997 : 0; + 998 : 0; + 999 : 0; + 1000 : 0; + 1001 : 0; + 1002 : 0; + 1003 : 0; + 1004 : 0; + 1005 : 0; + 1006 : 0; + 1007 : 0; + 1008 : 0; + 1009 : 0; + 1010 : 0; + 1011 : 0; + 1012 : 0; + 1013 : 0; + 1014 : 0; + 1015 : 0; + 1016 : 0; + 1017 : 0; + 1018 : 0; + 1019 : 0; + 1020 : 0; + 1021 : 0; + 1022 : 0; + 1023 : 0; + 1024 : 0; + 1025 : 0; + 1026 : 0; + 1027 : 0; + 1028 : 0; + 1029 : 0; + 1030 : 0; + 1031 : 0; + 1032 : 0; + 1033 : 0; + 1034 : 0; + 1035 : 0; + 1036 : 0; + 1037 : 0; + 1038 : 0; + 1039 : 0; + 1040 : 0; + 1041 : 0; + 1042 : 0; + 1043 : 0; + 1044 : 0; + 1045 : 0; + 1046 : 0; + 1047 : 0; + 1048 : 0; + 1049 : 0; + 1050 : 0; + 1051 : 0; + 1052 : 0; + 1053 : 0; + 1054 : 0; + 1055 : 0; + 1056 : 0; + 1057 : 0; + 1058 : 0; + 1059 : 0; + 1060 : 0; + 1061 : 0; + 1062 : 0; + 1063 : 0; + 1064 : 0; + 1065 : 0; + 1066 : 0; + 1067 : 0; + 1068 : 0; + 1069 : 0; + 1070 : 0; + 1071 : 0; + 1072 : 0; + 1073 : 0; + 1074 : 0; + 1075 : 0; + 1076 : 0; + 1077 : 0; + 1078 : 3; + 1079 : 3; + 1080 : 3; + 1081 : 3; + 1082 : 0; + 1083 : 0; + 1084 : 0; + 1085 : 0; + 1086 : 0; + 1087 : 0; + 1088 : 0; + 1089 : 0; + 1090 : 0; + 1091 : 0; + 1092 : 3; + 1093 : 3; + 1094 : 3; + 1095 : 3; + 1096 : 3; + 1097 : 3; + 1098 : 3; + 1099 : 0; + 1100 : 0; + 1101 : 0; + 1102 : 0; + 1103 : 0; + 1104 : 0; + 1105 : 0; + 1106 : 0; + 1107 : 0; + 1108 : 0; + 1109 : 0; + 1110 : 0; + 1111 : 0; + 1112 : 0; + 1113 : 0; + 1114 : 0; + 1115 : 0; + 1116 : 0; + 1117 : 0; + 1118 : 0; + 1119 : 0; + 1120 : 0; + 1121 : 0; + 1122 : 0; + 1123 : 0; + 1124 : 0; + 1125 : 0; + 1126 : 0; + 1127 : 0; + 1128 : 0; + 1129 : 0; + 1130 : 0; + 1131 : 0; + 1132 : 0; + 1133 : 0; + 1134 : 0; + 1135 : 0; + 1136 : 0; + 1137 : 0; + 1138 : 0; + 1139 : 0; + 1140 : 0; + 1141 : 0; + 1142 : 0; + 1143 : 0; + 1144 : 0; + 1145 : 0; + 1146 : 0; + 1147 : 0; + 1148 : 0; + 1149 : 0; + 1150 : 0; + 1151 : 0; + 1152 : 0; + 1153 : 0; + 1154 : 0; + 1155 : 0; + 1156 : 0; + 1157 : 0; + 1158 : 0; + 1159 : 0; + 1160 : 0; + 1161 : 0; + 1162 : 0; + 1163 : 0; + 1164 : 0; + 1165 : 0; + 1166 : 0; + 1167 : 0; + 1168 : 0; + 1169 : 0; + 1170 : 0; + 1171 : 0; + 1172 : 0; + 1173 : 0; + 1174 : 0; + 1175 : 0; + 1176 : 0; + 1177 : 0; + 1178 : 0; + 1179 : 0; + 1180 : 0; + 1181 : 0; + 1182 : 0; + 1183 : 0; + 1184 : 0; + 1185 : 0; + 1186 : 0; + 1187 : 0; + 1188 : 0; + 1189 : 0; + 1190 : 0; + 1191 : 0; + 1192 : 0; + 1193 : 0; + 1194 : 0; + 1195 : 0; + 1196 : 0; + 1197 : 0; + 1198 : 0; + 1199 : 0; + 1200 : 0; + 1201 : 0; + 1202 : 0; + 1203 : 0; + 1204 : 0; + 1205 : 0; + 1206 : 3; + 1207 : 3; + 1208 : 3; + 1209 : 3; + 1210 : 3; + 1211 : 0; + 1212 : 0; + 1213 : 0; + 1214 : 0; + 1215 : 0; + 1216 : 0; + 1217 : 0; + 1218 : 0; + 1219 : 0; + 1220 : 3; + 1221 : 3; + 1222 : 3; + 1223 : 3; + 1224 : 3; + 1225 : 3; + 1226 : 3; + 1227 : 0; + 1228 : 0; + 1229 : 0; + 1230 : 0; + 1231 : 0; + 1232 : 0; + 1233 : 0; + 1234 : 0; + 1235 : 0; + 1236 : 0; + 1237 : 0; + 1238 : 0; + 1239 : 0; + 1240 : 0; + 1241 : 0; + 1242 : 0; + 1243 : 0; + 1244 : 0; + 1245 : 0; + 1246 : 0; + 1247 : 0; + 1248 : 0; + 1249 : 0; + 1250 : 0; + 1251 : 0; + 1252 : 0; + 1253 : 0; + 1254 : 0; + 1255 : 0; + 1256 : 0; + 1257 : 0; + 1258 : 0; + 1259 : 0; + 1260 : 0; + 1261 : 0; + 1262 : 0; + 1263 : 0; + 1264 : 0; + 1265 : 0; + 1266 : 0; + 1267 : 0; + 1268 : 0; + 1269 : 0; + 1270 : 0; + 1271 : 0; + 1272 : 0; + 1273 : 0; + 1274 : 0; + 1275 : 0; + 1276 : 0; + 1277 : 0; + 1278 : 0; + 1279 : 0; + 1280 : 0; + 1281 : 0; + 1282 : 0; + 1283 : 0; + 1284 : 0; + 1285 : 0; + 1286 : 0; + 1287 : 0; + 1288 : 0; + 1289 : 0; + 1290 : 0; + 1291 : 0; + 1292 : 0; + 1293 : 0; + 1294 : 0; + 1295 : 0; + 1296 : 0; + 1297 : 0; + 1298 : 0; + 1299 : 0; + 1300 : 0; + 1301 : 0; + 1302 : 0; + 1303 : 0; + 1304 : 0; + 1305 : 0; + 1306 : 0; + 1307 : 0; + 1308 : 0; + 1309 : 0; + 1310 : 0; + 1311 : 0; + 1312 : 0; + 1313 : 0; + 1314 : 0; + 1315 : 0; + 1316 : 0; + 1317 : 0; + 1318 : 0; + 1319 : 0; + 1320 : 0; + 1321 : 0; + 1322 : 0; + 1323 : 0; + 1324 : 0; + 1325 : 0; + 1326 : 0; + 1327 : 0; + 1328 : 0; + 1329 : 0; + 1330 : 0; + 1331 : 0; + 1332 : 0; + 1333 : 3; + 1334 : 3; + 1335 : 3; + 1336 : 3; + 1337 : 3; + 1338 : 3; + 1339 : 0; + 1340 : 0; + 1341 : 0; + 1342 : 0; + 1343 : 0; + 1344 : 0; + 1345 : 0; + 1346 : 0; + 1347 : 0; + 1348 : 3; + 1349 : 3; + 1350 : 3; + 1351 : 3; + 1352 : 0; + 1353 : 0; + 1354 : 0; + 1355 : 0; + 1356 : 0; + 1357 : 0; + 1358 : 0; + 1359 : 0; + 1360 : 0; + 1361 : 0; + 1362 : 0; + 1363 : 0; + 1364 : 0; + 1365 : 0; + 1366 : 0; + 1367 : 0; + 1368 : 0; + 1369 : 0; + 1370 : 0; + 1371 : 0; + 1372 : 0; + 1373 : 0; + 1374 : 0; + 1375 : 0; + 1376 : 0; + 1377 : 0; + 1378 : 0; + 1379 : 0; + 1380 : 0; + 1381 : 0; + 1382 : 0; + 1383 : 0; + 1384 : 0; + 1385 : 0; + 1386 : 0; + 1387 : 0; + 1388 : 0; + 1389 : 0; + 1390 : 0; + 1391 : 0; + 1392 : 0; + 1393 : 0; + 1394 : 0; + 1395 : 0; + 1396 : 0; + 1397 : 0; + 1398 : 0; + 1399 : 0; + 1400 : 0; + 1401 : 0; + 1402 : 0; + 1403 : 0; + 1404 : 0; + 1405 : 0; + 1406 : 0; + 1407 : 0; + 1408 : 0; + 1409 : 0; + 1410 : 0; + 1411 : 0; + 1412 : 0; + 1413 : 0; + 1414 : 0; + 1415 : 0; + 1416 : 0; + 1417 : 0; + 1418 : 0; + 1419 : 0; + 1420 : 0; + 1421 : 0; + 1422 : 0; + 1423 : 0; + 1424 : 0; + 1425 : 0; + 1426 : 0; + 1427 : 0; + 1428 : 0; + 1429 : 0; + 1430 : 0; + 1431 : 0; + 1432 : 0; + 1433 : 0; + 1434 : 0; + 1435 : 0; + 1436 : 0; + 1437 : 0; + 1438 : 0; + 1439 : 0; + 1440 : 0; + 1441 : 0; + 1442 : 0; + 1443 : 0; + 1444 : 0; + 1445 : 0; + 1446 : 0; + 1447 : 0; + 1448 : 0; + 1449 : 0; + 1450 : 0; + 1451 : 0; + 1452 : 0; + 1453 : 0; + 1454 : 0; + 1455 : 0; + 1456 : 0; + 1457 : 0; + 1458 : 0; + 1459 : 0; + 1460 : 0; + 1461 : 3; + 1462 : 3; + 1463 : 3; + 1464 : 3; + 1465 : 3; + 1466 : 3; + 1467 : 0; + 1468 : 0; + 1469 : 0; + 1470 : 0; + 1471 : 0; + 1472 : 0; + 1473 : 0; + 1474 : 0; + 1475 : 0; + 1476 : 0; + 1477 : 3; + 1478 : 0; + 1479 : 3; + 1480 : 0; + 1481 : 0; + 1482 : 0; + 1483 : 0; + 1484 : 0; + 1485 : 0; + 1486 : 0; + 1487 : 0; + 1488 : 0; + 1489 : 0; + 1490 : 0; + 1491 : 0; + 1492 : 0; + 1493 : 0; + 1494 : 0; + 1495 : 0; + 1496 : 0; + 1497 : 0; + 1498 : 0; + 1499 : 0; + 1500 : 0; + 1501 : 0; + 1502 : 0; + 1503 : 0; + 1504 : 0; + 1505 : 0; + 1506 : 0; + 1507 : 0; + 1508 : 0; + 1509 : 0; + 1510 : 0; + 1511 : 0; + 1512 : 0; + 1513 : 0; + 1514 : 0; + 1515 : 0; + 1516 : 0; + 1517 : 0; + 1518 : 0; + 1519 : 0; + 1520 : 0; + 1521 : 0; + 1522 : 0; + 1523 : 0; + 1524 : 0; + 1525 : 0; + 1526 : 0; + 1527 : 0; + 1528 : 0; + 1529 : 0; + 1530 : 0; + 1531 : 0; + 1532 : 0; + 1533 : 0; + 1534 : 0; + 1535 : 0; + 1536 : 0; + 1537 : 0; + 1538 : 0; + 1539 : 0; + 1540 : 0; + 1541 : 0; + 1542 : 0; + 1543 : 0; + 1544 : 0; + 1545 : 0; + 1546 : 0; + 1547 : 0; + 1548 : 0; + 1549 : 0; + 1550 : 0; + 1551 : 0; + 1552 : 0; + 1553 : 0; + 1554 : 0; + 1555 : 0; + 1556 : 0; + 1557 : 0; + 1558 : 0; + 1559 : 0; + 1560 : 0; + 1561 : 0; + 1562 : 0; + 1563 : 0; + 1564 : 0; + 1565 : 0; + 1566 : 0; + 1567 : 0; + 1568 : 0; + 1569 : 0; + 1570 : 0; + 1571 : 0; + 1572 : 0; + 1573 : 0; + 1574 : 0; + 1575 : 0; + 1576 : 0; + 1577 : 0; + 1578 : 0; + 1579 : 0; + 1580 : 0; + 1581 : 0; + 1582 : 0; + 1583 : 0; + 1584 : 0; + 1585 : 0; + 1586 : 0; + 1587 : 0; + 1588 : 0; + 1589 : 3; + 1590 : 3; + 1591 : 3; + 1592 : 3; + 1593 : 3; + 1594 : 3; + 1595 : 0; + 1596 : 0; + 1597 : 0; + 1598 : 0; + 1599 : 0; + 1600 : 0; + 1601 : 0; + 1602 : 0; + 1603 : 0; + 1604 : 0; + 1605 : 0; + 1606 : 3; + 1607 : 3; + 1608 : 0; + 1609 : 0; + 1610 : 0; + 1611 : 0; + 1612 : 0; + 1613 : 0; + 1614 : 0; + 1615 : 0; + 1616 : 0; + 1617 : 0; + 1618 : 0; + 1619 : 0; + 1620 : 0; + 1621 : 0; + 1622 : 0; + 1623 : 0; + 1624 : 0; + 1625 : 0; + 1626 : 0; + 1627 : 0; + 1628 : 0; + 1629 : 0; + 1630 : 0; + 1631 : 0; + 1632 : 0; + 1633 : 0; + 1634 : 0; + 1635 : 0; + 1636 : 0; + 1637 : 0; + 1638 : 0; + 1639 : 0; + 1640 : 0; + 1641 : 0; + 1642 : 0; + 1643 : 0; + 1644 : 0; + 1645 : 0; + 1646 : 0; + 1647 : 0; + 1648 : 0; + 1649 : 0; + 1650 : 0; + 1651 : 0; + 1652 : 0; + 1653 : 0; + 1654 : 0; + 1655 : 0; + 1656 : 0; + 1657 : 0; + 1658 : 0; + 1659 : 0; + 1660 : 0; + 1661 : 0; + 1662 : 0; + 1663 : 0; + 1664 : 0; + 1665 : 0; + 1666 : 0; + 1667 : 0; + 1668 : 0; + 1669 : 0; + 1670 : 0; + 1671 : 0; + 1672 : 0; + 1673 : 0; + 1674 : 0; + 1675 : 0; + 1676 : 0; + 1677 : 0; + 1678 : 0; + 1679 : 0; + 1680 : 0; + 1681 : 0; + 1682 : 0; + 1683 : 0; + 1684 : 0; + 1685 : 0; + 1686 : 0; + 1687 : 0; + 1688 : 0; + 1689 : 0; + 1690 : 0; + 1691 : 0; + 1692 : 0; + 1693 : 0; + 1694 : 0; + 1695 : 0; + 1696 : 0; + 1697 : 0; + 1698 : 0; + 1699 : 0; + 1700 : 0; + 1701 : 0; + 1702 : 0; + 1703 : 0; + 1704 : 0; + 1705 : 0; + 1706 : 0; + 1707 : 0; + 1708 : 3; + 1709 : 3; + 1710 : 3; + 1711 : 3; + 1712 : 3; + 1713 : 3; + 1714 : 3; + 1715 : 3; + 1716 : 3; + 1717 : 3; + 1718 : 3; + 1719 : 3; + 1720 : 3; + 1721 : 3; + 1722 : 3; + 1723 : 3; + 1724 : 0; + 1725 : 0; + 1726 : 0; + 1727 : 0; + 1728 : 0; + 1729 : 0; + 1730 : 0; + 1731 : 0; + 1732 : 0; + 1733 : 3; + 1734 : 3; + 1735 : 3; + 1736 : 3; + 1737 : 0; + 1738 : 0; + 1739 : 0; + 1740 : 0; + 1741 : 0; + 1742 : 0; + 1743 : 0; + 1744 : 0; + 1745 : 0; + 1746 : 0; + 1747 : 0; + 1748 : 0; + 1749 : 0; + 1750 : 0; + 1751 : 0; + 1752 : 0; + 1753 : 0; + 1754 : 0; + 1755 : 0; + 1756 : 0; + 1757 : 0; + 1758 : 0; + 1759 : 0; + 1760 : 0; + 1761 : 0; + 1762 : 0; + 1763 : 0; + 1764 : 0; + 1765 : 0; + 1766 : 0; + 1767 : 0; + 1768 : 0; + 1769 : 0; + 1770 : 0; + 1771 : 0; + 1772 : 0; + 1773 : 0; + 1774 : 0; + 1775 : 0; + 1776 : 0; + 1777 : 0; + 1778 : 0; + 1779 : 0; + 1780 : 0; + 1781 : 0; + 1782 : 0; + 1783 : 0; + 1784 : 0; + 1785 : 0; + 1786 : 0; + 1787 : 0; + 1788 : 0; + 1789 : 0; + 1790 : 0; + 1791 : 0; + 1792 : 0; + 1793 : 0; + 1794 : 0; + 1795 : 0; + 1796 : 0; + 1797 : 0; + 1798 : 0; + 1799 : 0; + 1800 : 0; + 1801 : 0; + 1802 : 0; + 1803 : 0; + 1804 : 0; + 1805 : 0; + 1806 : 0; + 1807 : 0; + 1808 : 0; + 1809 : 0; + 1810 : 0; + 1811 : 0; + 1812 : 0; + 1813 : 0; + 1814 : 0; + 1815 : 0; + 1816 : 0; + 1817 : 0; + 1818 : 0; + 1819 : 0; + 1820 : 0; + 1821 : 0; + 1822 : 0; + 1823 : 0; + 1824 : 0; + 1825 : 0; + 1826 : 0; + 1827 : 0; + 1828 : 0; + 1829 : 0; + 1830 : 0; + 1831 : 0; + 1832 : 0; + 1833 : 0; + 1834 : 0; + 1835 : 0; + 1836 : 0; + 1837 : 3; + 1838 : 3; + 1839 : 3; + 1840 : 3; + 1841 : 3; + 1842 : 3; + 1843 : 3; + 1844 : 3; + 1845 : 3; + 1846 : 3; + 1847 : 3; + 1848 : 3; + 1849 : 3; + 1850 : 3; + 1851 : 3; + 1852 : 0; + 1853 : 0; + 1854 : 0; + 1855 : 0; + 1856 : 0; + 1857 : 0; + 1858 : 0; + 1859 : 0; + 1860 : 0; + 1861 : 3; + 1862 : 3; + 1863 : 3; + 1864 : 3; + 1865 : 3; + 1866 : 3; + 1867 : 3; + 1868 : 3; + 1869 : 3; + 1870 : 3; + 1871 : 3; + 1872 : 3; + 1873 : 3; + 1874 : 3; + 1875 : 0; + 1876 : 0; + 1877 : 0; + 1878 : 0; + 1879 : 0; + 1880 : 0; + 1881 : 0; + 1882 : 0; + 1883 : 0; + 1884 : 0; + 1885 : 0; + 1886 : 0; + 1887 : 0; + 1888 : 0; + 1889 : 0; + 1890 : 0; + 1891 : 0; + 1892 : 0; + 1893 : 0; + 1894 : 3; + 1895 : 3; + 1896 : 0; + 1897 : 0; + 1898 : 0; + 1899 : 0; + 1900 : 0; + 1901 : 0; + 1902 : 0; + 1903 : 0; + 1904 : 0; + 1905 : 0; + 1906 : 0; + 1907 : 0; + 1908 : 0; + 1909 : 0; + 1910 : 0; + 1911 : 0; + 1912 : 0; + 1913 : 0; + 1914 : 0; + 1915 : 0; + 1916 : 0; + 1917 : 0; + 1918 : 0; + 1919 : 0; + 1920 : 0; + 1921 : 0; + 1922 : 0; + 1923 : 0; + 1924 : 0; + 1925 : 0; + 1926 : 0; + 1927 : 0; + 1928 : 0; + 1929 : 0; + 1930 : 0; + 1931 : 0; + 1932 : 0; + 1933 : 0; + 1934 : 0; + 1935 : 0; + 1936 : 0; + 1937 : 0; + 1938 : 0; + 1939 : 0; + 1940 : 0; + 1941 : 0; + 1942 : 0; + 1943 : 0; + 1944 : 0; + 1945 : 0; + 1946 : 0; + 1947 : 0; + 1948 : 0; + 1949 : 0; + 1950 : 0; + 1951 : 0; + 1952 : 0; + 1953 : 0; + 1954 : 0; + 1955 : 0; + 1956 : 0; + 1957 : 0; + 1958 : 0; + 1959 : 0; + 1960 : 0; + 1961 : 0; + 1962 : 3; + 1963 : 0; + 1964 : 0; + 1965 : 3; + 1966 : 3; + 1967 : 3; + 1968 : 3; + 1969 : 3; + 1970 : 3; + 1971 : 3; + 1972 : 3; + 1973 : 3; + 1974 : 3; + 1975 : 3; + 1976 : 3; + 1977 : 3; + 1978 : 3; + 1979 : 3; + 1980 : 0; + 1981 : 0; + 1982 : 0; + 1983 : 0; + 1984 : 0; + 1985 : 0; + 1986 : 0; + 1987 : 0; + 1988 : 3; + 1989 : 3; + 1990 : 3; + 1991 : 3; + 1992 : 3; + 1993 : 3; + 1994 : 3; + 1995 : 3; + 1996 : 3; + 1997 : 3; + 1998 : 3; + 1999 : 3; + 2000 : 3; + 2001 : 3; + 2002 : 3; + 2003 : 0; + 2004 : 0; + 2005 : 0; + 2006 : 0; + 2007 : 0; + 2008 : 0; + 2009 : 0; + 2010 : 0; + 2011 : 0; + 2012 : 0; + 2013 : 0; + 2014 : 0; + 2015 : 0; + 2016 : 0; + 2017 : 0; + 2018 : 0; + 2019 : 0; + 2020 : 0; + 2021 : 0; + 2022 : 3; + 2023 : 3; + 2024 : 0; + 2025 : 0; + 2026 : 0; + 2027 : 0; + 2028 : 0; + 2029 : 0; + 2030 : 0; + 2031 : 0; + 2032 : 0; + 2033 : 0; + 2034 : 0; + 2035 : 0; + 2036 : 0; + 2037 : 0; + 2038 : 0; + 2039 : 0; + 2040 : 0; + 2041 : 0; + 2042 : 0; + 2043 : 0; + 2044 : 0; + 2045 : 0; + 2046 : 0; + 2047 : 0; + 2048 : 0; + 2049 : 0; + 2050 : 0; + 2051 : 0; + 2052 : 0; + 2053 : 0; + 2054 : 0; + 2055 : 0; + 2056 : 0; + 2057 : 0; + 2058 : 0; + 2059 : 0; + 2060 : 0; + 2061 : 0; + 2062 : 0; + 2063 : 0; + 2064 : 0; + 2065 : 0; + 2066 : 0; + 2067 : 0; + 2068 : 0; + 2069 : 0; + 2070 : 0; + 2071 : 0; + 2072 : 0; + 2073 : 0; + 2074 : 0; + 2075 : 0; + 2076 : 0; + 2077 : 0; + 2078 : 0; + 2079 : 0; + 2080 : 0; + 2081 : 0; + 2082 : 0; + 2083 : 0; + 2084 : 0; + 2085 : 0; + 2086 : 3; + 2087 : 3; + 2088 : 0; + 2089 : 0; + 2090 : 3; + 2091 : 3; + 2092 : 3; + 2093 : 3; + 2094 : 3; + 2095 : 3; + 2096 : 3; + 2097 : 3; + 2098 : 3; + 2099 : 3; + 2100 : 3; + 2101 : 3; + 2102 : 3; + 2103 : 3; + 2104 : 3; + 2105 : 3; + 2106 : 3; + 2107 : 3; + 2108 : 0; + 2109 : 0; + 2110 : 0; + 2111 : 0; + 2112 : 0; + 2113 : 0; + 2114 : 3; + 2115 : 3; + 2116 : 3; + 2117 : 3; + 2118 : 3; + 2119 : 3; + 2120 : 3; + 2121 : 3; + 2122 : 3; + 2123 : 3; + 2124 : 3; + 2125 : 3; + 2126 : 3; + 2127 : 3; + 2128 : 3; + 2129 : 3; + 2130 : 3; + 2131 : 0; + 2132 : 0; + 2133 : 0; + 2134 : 0; + 2135 : 0; + 2136 : 0; + 2137 : 0; + 2138 : 0; + 2139 : 0; + 2140 : 0; + 2141 : 0; + 2142 : 0; + 2143 : 0; + 2144 : 0; + 2145 : 0; + 2146 : 0; + 2147 : 0; + 2148 : 0; + 2149 : 0; + 2150 : 3; + 2151 : 3; + 2152 : 0; + 2153 : 0; + 2154 : 0; + 2155 : 0; + 2156 : 0; + 2157 : 0; + 2158 : 0; + 2159 : 0; + 2160 : 0; + 2161 : 0; + 2162 : 0; + 2163 : 0; + 2164 : 0; + 2165 : 0; + 2166 : 0; + 2167 : 0; + 2168 : 0; + 2169 : 0; + 2170 : 0; + 2171 : 0; + 2172 : 0; + 2173 : 0; + 2174 : 0; + 2175 : 0; + 2176 : 0; + 2177 : 0; + 2178 : 0; + 2179 : 0; + 2180 : 0; + 2181 : 0; + 2182 : 0; + 2183 : 0; + 2184 : 0; + 2185 : 0; + 2186 : 0; + 2187 : 0; + 2188 : 0; + 2189 : 0; + 2190 : 0; + 2191 : 0; + 2192 : 0; + 2193 : 0; + 2194 : 0; + 2195 : 0; + 2196 : 0; + 2197 : 0; + 2198 : 0; + 2199 : 0; + 2200 : 0; + 2201 : 0; + 2202 : 0; + 2203 : 0; + 2204 : 0; + 2205 : 4; + 2206 : 4; + 2207 : 4; + 2208 : 4; + 2209 : 4; + 2210 : 4; + 2211 : 4; + 2212 : 4; + 2213 : 4; + 2214 : 4; + 2215 : 4; + 2216 : 4; + 2217 : 4; + 2218 : 4; + 2219 : 4; + 2220 : 4; + 2221 : 4; + 2222 : 4; + 2223 : 4; + 2224 : 4; + 2225 : 4; + 2226 : 4; + 2227 : 4; + 2228 : 4; + 2229 : 4; + 2230 : 4; + 2231 : 4; + 2232 : 4; + 2233 : 4; + 2234 : 4; + 2235 : 4; + 2236 : 0; + 2237 : 0; + 2238 : 0; + 2239 : 0; + 2240 : 4; + 2241 : 4; + 2242 : 4; + 2243 : 4; + 2244 : 4; + 2245 : 4; + 2246 : 4; + 2247 : 4; + 2248 : 4; + 2249 : 4; + 2250 : 4; + 2251 : 4; + 2252 : 4; + 2253 : 4; + 2254 : 4; + 2255 : 4; + 2256 : 4; + 2257 : 4; + 2258 : 4; + 2259 : 0; + 2260 : 0; + 2261 : 0; + 2262 : 0; + 2263 : 0; + 2264 : 0; + 2265 : 0; + 2266 : 0; + 2267 : 0; + 2268 : 0; + 2269 : 0; + 2270 : 0; + 2271 : 0; + 2272 : 0; + 2273 : 0; + 2274 : 0; + 2275 : 0; + 2276 : 0; + 2277 : 4; + 2278 : 4; + 2279 : 4; + 2280 : 0; + 2281 : 0; + 2282 : 0; + 2283 : 0; + 2284 : 0; + 2285 : 0; + 2286 : 0; + 2287 : 0; + 2288 : 0; + 2289 : 0; + 2290 : 0; + 2291 : 0; + 2292 : 0; + 2293 : 0; + 2294 : 0; + 2295 : 0; + 2296 : 0; + 2297 : 0; + 2298 : 0; + 2299 : 0; + 2300 : 0; + 2301 : 0; + 2302 : 0; + 2303 : 0; + 2304 : 0; + 2305 : 0; + 2306 : 0; + 2307 : 0; + 2308 : 0; + 2309 : 0; + 2310 : 0; + 2311 : 0; + 2312 : 0; + 2313 : 0; + 2314 : 0; + 2315 : 0; + 2316 : 0; + 2317 : 0; + 2318 : 0; + 2319 : 0; + 2320 : 0; + 2321 : 0; + 2322 : 0; + 2323 : 0; + 2324 : 0; + 2325 : 4; + 2326 : 4; + 2327 : 4; + 2328 : 4; + 2329 : 0; + 2330 : 0; + 2331 : 4; + 2332 : 4; + 2333 : 4; + 2334 : 4; + 2335 : 4; + 2336 : 4; + 2337 : 4; + 2338 : 4; + 2339 : 4; + 2340 : 4; + 2341 : 4; + 2342 : 4; + 2343 : 4; + 2344 : 4; + 2345 : 4; + 2346 : 4; + 2347 : 4; + 2348 : 4; + 2349 : 4; + 2350 : 4; + 2351 : 4; + 2352 : 4; + 2353 : 4; + 2354 : 4; + 2355 : 4; + 2356 : 4; + 2357 : 4; + 2358 : 4; + 2359 : 4; + 2360 : 4; + 2361 : 4; + 2362 : 4; + 2363 : 4; + 2364 : 0; + 2365 : 0; + 2366 : 0; + 2367 : 0; + 2368 : 4; + 2369 : 4; + 2370 : 4; + 2371 : 4; + 2372 : 4; + 2373 : 4; + 2374 : 4; + 2375 : 4; + 2376 : 4; + 2377 : 4; + 2378 : 4; + 2379 : 4; + 2380 : 4; + 2381 : 4; + 2382 : 4; + 2383 : 4; + 2384 : 4; + 2385 : 4; + 2386 : 4; + 2387 : 4; + 2388 : 4; + 2389 : 0; + 2390 : 0; + 2391 : 0; + 2392 : 0; + 2393 : 0; + 2394 : 0; + 2395 : 0; + 2396 : 0; + 2397 : 0; + 2398 : 0; + 2399 : 0; + 2400 : 0; + 2401 : 0; + 2402 : 0; + 2403 : 0; + 2404 : 0; + 2405 : 4; + 2406 : 4; + 2407 : 4; + 2408 : 0; + 2409 : 0; + 2410 : 0; + 2411 : 0; + 2412 : 0; + 2413 : 0; + 2414 : 0; + 2415 : 0; + 2416 : 0; + 2417 : 0; + 2418 : 0; + 2419 : 0; + 2420 : 0; + 2421 : 0; + 2422 : 0; + 2423 : 0; + 2424 : 0; + 2425 : 0; + 2426 : 0; + 2427 : 0; + 2428 : 0; + 2429 : 0; + 2430 : 0; + 2431 : 0; + 2432 : 0; + 2433 : 0; + 2434 : 4; + 2435 : 4; + 2436 : 4; + 2437 : 4; + 2438 : 0; + 2439 : 0; + 2440 : 0; + 2441 : 0; + 2442 : 0; + 2443 : 0; + 2444 : 0; + 2445 : 0; + 2446 : 0; + 2447 : 0; + 2448 : 0; + 2449 : 0; + 2450 : 0; + 2451 : 0; + 2452 : 0; + 2453 : 0; + 2454 : 4; + 2455 : 4; + 2456 : 4; + 2457 : 4; + 2458 : 0; + 2459 : 4; + 2460 : 4; + 2461 : 4; + 2462 : 4; + 2463 : 4; + 2464 : 4; + 2465 : 4; + 2466 : 4; + 2467 : 4; + 2468 : 4; + 2469 : 4; + 2470 : 4; + 2471 : 4; + 2472 : 4; + 2473 : 4; + 2474 : 4; + 2475 : 4; + 2476 : 4; + 2477 : 4; + 2478 : 4; + 2479 : 4; + 2480 : 4; + 2481 : 4; + 2482 : 4; + 2483 : 4; + 2484 : 4; + 2485 : 4; + 2486 : 4; + 2487 : 4; + 2488 : 4; + 2489 : 4; + 2490 : 4; + 2491 : 4; + 2492 : 4; + 2493 : 4; + 2494 : 0; + 2495 : 4; + 2496 : 4; + 2497 : 4; + 2498 : 4; + 2499 : 4; + 2500 : 4; + 2501 : 4; + 2502 : 4; + 2503 : 4; + 2504 : 4; + 2505 : 4; + 2506 : 4; + 2507 : 4; + 2508 : 4; + 2509 : 4; + 2510 : 4; + 2511 : 4; + 2512 : 4; + 2513 : 4; + 2514 : 4; + 2515 : 4; + 2516 : 4; + 2517 : 4; + 2518 : 0; + 2519 : 0; + 2520 : 0; + 2521 : 0; + 2522 : 0; + 2523 : 0; + 2524 : 0; + 2525 : 0; + 2526 : 0; + 2527 : 0; + 2528 : 0; + 2529 : 4; + 2530 : 4; + 2531 : 4; + 2532 : 4; + 2533 : 4; + 2534 : 4; + 2535 : 4; + 2536 : 4; + 2537 : 0; + 2538 : 0; + 2539 : 4; + 2540 : 0; + 2541 : 4; + 2542 : 0; + 2543 : 0; + 2544 : 0; + 2545 : 0; + 2546 : 0; + 2547 : 0; + 2548 : 0; + 2549 : 0; + 2550 : 0; + 2551 : 0; + 2552 : 0; + 2553 : 0; + 2554 : 0; + 2555 : 0; + 2556 : 0; + 2557 : 0; + 2558 : 0; + 2559 : 0; + 2560 : 0; + 2561 : 0; + 2562 : 0; + 2563 : 3; + 2564 : 3; + 2565 : 3; + 2566 : 3; + 2567 : 3; + 2568 : 3; + 2569 : 3; + 2570 : 3; + 2571 : 3; + 2572 : 3; + 2573 : 3; + 2574 : 3; + 2575 : 3; + 2576 : 3; + 2577 : 3; + 2578 : 3; + 2579 : 3; + 2580 : 3; + 2581 : 3; + 2582 : 3; + 2583 : 3; + 2584 : 3; + 2585 : 0; + 2586 : 0; + 2587 : 3; + 2588 : 3; + 2589 : 3; + 2590 : 3; + 2591 : 3; + 2592 : 3; + 2593 : 3; + 2594 : 3; + 2595 : 3; + 2596 : 3; + 2597 : 3; + 2598 : 3; + 2599 : 3; + 2600 : 3; + 2601 : 3; + 2602 : 3; + 2603 : 3; + 2604 : 3; + 2605 : 3; + 2606 : 3; + 2607 : 3; + 2608 : 3; + 2609 : 3; + 2610 : 3; + 2611 : 3; + 2612 : 3; + 2613 : 3; + 2614 : 3; + 2615 : 3; + 2616 : 3; + 2617 : 3; + 2618 : 3; + 2619 : 3; + 2620 : 3; + 2621 : 3; + 2622 : 3; + 2623 : 3; + 2624 : 3; + 2625 : 3; + 2626 : 3; + 2627 : 3; + 2628 : 3; + 2629 : 3; + 2630 : 3; + 2631 : 3; + 2632 : 3; + 2633 : 3; + 2634 : 3; + 2635 : 3; + 2636 : 3; + 2637 : 3; + 2638 : 3; + 2639 : 3; + 2640 : 3; + 2641 : 3; + 2642 : 3; + 2643 : 3; + 2644 : 3; + 2645 : 3; + 2646 : 3; + 2647 : 0; + 2648 : 0; + 2649 : 0; + 2650 : 0; + 2651 : 0; + 2652 : 0; + 2653 : 0; + 2654 : 0; + 2655 : 0; + 2656 : 3; + 2657 : 3; + 2658 : 3; + 2659 : 3; + 2660 : 3; + 2661 : 3; + 2662 : 3; + 2663 : 3; + 2664 : 3; + 2665 : 3; + 2666 : 3; + 2667 : 3; + 2668 : 3; + 2669 : 3; + 2670 : 3; + 2671 : 0; + 2672 : 0; + 2673 : 0; + 2674 : 0; + 2675 : 0; + 2676 : 0; + 2677 : 0; + 2678 : 0; + 2679 : 0; + 2680 : 0; + 2681 : 0; + 2682 : 0; + 2683 : 0; + 2684 : 0; + 2685 : 0; + 2686 : 0; + 2687 : 0; + 2688 : 0; + 2689 : 0; + 2690 : 0; + 2691 : 0; + 2692 : 3; + 2693 : 3; + 2694 : 3; + 2695 : 3; + 2696 : 3; + 2697 : 3; + 2698 : 3; + 2699 : 3; + 2700 : 3; + 2701 : 3; + 2702 : 3; + 2703 : 3; + 2704 : 3; + 2705 : 3; + 2706 : 3; + 2707 : 3; + 2708 : 3; + 2709 : 3; + 2710 : 3; + 2711 : 3; + 2712 : 3; + 2713 : 3; + 2714 : 3; + 2715 : 3; + 2716 : 3; + 2717 : 3; + 2718 : 3; + 2719 : 3; + 2720 : 3; + 2721 : 3; + 2722 : 3; + 2723 : 3; + 2724 : 3; + 2725 : 3; + 2726 : 3; + 2727 : 3; + 2728 : 3; + 2729 : 3; + 2730 : 3; + 2731 : 3; + 2732 : 3; + 2733 : 3; + 2734 : 3; + 2735 : 3; + 2736 : 3; + 2737 : 3; + 2738 : 3; + 2739 : 3; + 2740 : 3; + 2741 : 3; + 2742 : 3; + 2743 : 3; + 2744 : 3; + 2745 : 3; + 2746 : 3; + 2747 : 3; + 2748 : 3; + 2749 : 3; + 2750 : 3; + 2751 : 3; + 2752 : 3; + 2753 : 3; + 2754 : 3; + 2755 : 3; + 2756 : 3; + 2757 : 3; + 2758 : 3; + 2759 : 3; + 2760 : 3; + 2761 : 3; + 2762 : 3; + 2763 : 3; + 2764 : 3; + 2765 : 3; + 2766 : 3; + 2767 : 3; + 2768 : 3; + 2769 : 3; + 2770 : 3; + 2771 : 3; + 2772 : 3; + 2773 : 3; + 2774 : 3; + 2775 : 0; + 2776 : 0; + 2777 : 0; + 2778 : 0; + 2779 : 0; + 2780 : 0; + 2781 : 0; + 2782 : 0; + 2783 : 0; + 2784 : 3; + 2785 : 3; + 2786 : 3; + 2787 : 3; + 2788 : 3; + 2789 : 3; + 2790 : 3; + 2791 : 3; + 2792 : 3; + 2793 : 3; + 2794 : 3; + 2795 : 3; + 2796 : 3; + 2797 : 3; + 2798 : 3; + 2799 : 0; + 2800 : 0; + 2801 : 0; + 2802 : 0; + 2803 : 0; + 2804 : 0; + 2805 : 0; + 2806 : 0; + 2807 : 0; + 2808 : 0; + 2809 : 0; + 2810 : 0; + 2811 : 0; + 2812 : 0; + 2813 : 0; + 2814 : 0; + 2815 : 0; + 2816 : 0; + 2817 : 0; + 2818 : 0; + 2819 : 0; + 2820 : 0; + 2821 : 3; + 2822 : 3; + 2823 : 3; + 2824 : 3; + 2825 : 3; + 2826 : 3; + 2827 : 3; + 2828 : 3; + 2829 : 3; + 2830 : 3; + 2831 : 3; + 2832 : 3; + 2833 : 3; + 2834 : 3; + 2835 : 3; + 2836 : 3; + 2837 : 3; + 2838 : 3; + 2839 : 3; + 2840 : 3; + 2841 : 3; + 2842 : 3; + 2843 : 3; + 2844 : 3; + 2845 : 3; + 2846 : 3; + 2847 : 3; + 2848 : 3; + 2849 : 3; + 2850 : 3; + 2851 : 3; + 2852 : 3; + 2853 : 3; + 2854 : 3; + 2855 : 3; + 2856 : 3; + 2857 : 3; + 2858 : 3; + 2859 : 3; + 2860 : 3; + 2861 : 3; + 2862 : 3; + 2863 : 3; + 2864 : 3; + 2865 : 3; + 2866 : 3; + 2867 : 3; + 2868 : 3; + 2869 : 3; + 2870 : 3; + 2871 : 3; + 2872 : 3; + 2873 : 3; + 2874 : 3; + 2875 : 3; + 2876 : 3; + 2877 : 3; + 2878 : 3; + 2879 : 3; + 2880 : 3; + 2881 : 3; + 2882 : 3; + 2883 : 3; + 2884 : 3; + 2885 : 3; + 2886 : 3; + 2887 : 3; + 2888 : 3; + 2889 : 3; + 2890 : 3; + 2891 : 3; + 2892 : 3; + 2893 : 3; + 2894 : 3; + 2895 : 3; + 2896 : 3; + 2897 : 3; + 2898 : 3; + 2899 : 3; + 2900 : 3; + 2901 : 3; + 2902 : 3; + 2903 : 3; + 2904 : 3; + 2905 : 3; + 2906 : 3; + 2907 : 3; + 2908 : 3; + 2909 : 3; + 2910 : 3; + 2911 : 3; + 2912 : 3; + 2913 : 3; + 2914 : 3; + 2915 : 3; + 2916 : 3; + 2917 : 3; + 2918 : 3; + 2919 : 3; + 2920 : 3; + 2921 : 3; + 2922 : 3; + 2923 : 3; + 2924 : 3; + 2925 : 3; + 2926 : 3; + 2927 : 3; + 2928 : 0; + 2929 : 0; + 2930 : 0; + 2931 : 0; + 2932 : 0; + 2933 : 3; + 2934 : 3; + 2935 : 3; + 2936 : 3; + 2937 : 3; + 2938 : 3; + 2939 : 0; + 2940 : 0; + 2941 : 0; + 2942 : 0; + 2943 : 0; + 2944 : 0; + 2945 : 0; + 2946 : 0; + 2947 : 0; + 2948 : 0; + 2949 : 0; + 2950 : 3; + 2951 : 3; + 2952 : 3; + 2953 : 3; + 2954 : 3; + 2955 : 3; + 2956 : 3; + 2957 : 3; + 2958 : 3; + 2959 : 3; + 2960 : 3; + 2961 : 3; + 2962 : 3; + 2963 : 3; + 2964 : 3; + 2965 : 3; + 2966 : 3; + 2967 : 3; + 2968 : 3; + 2969 : 3; + 2970 : 3; + 2971 : 3; + 2972 : 3; + 2973 : 3; + 2974 : 3; + 2975 : 3; + 2976 : 3; + 2977 : 3; + 2978 : 3; + 2979 : 3; + 2980 : 3; + 2981 : 3; + 2982 : 3; + 2983 : 3; + 2984 : 3; + 2985 : 3; + 2986 : 3; + 2987 : 3; + 2988 : 3; + 2989 : 3; + 2990 : 3; + 2991 : 3; + 2992 : 3; + 2993 : 3; + 2994 : 3; + 2995 : 3; + 2996 : 3; + 2997 : 3; + 2998 : 3; + 2999 : 3; + 3000 : 3; + 3001 : 3; + 3002 : 3; + 3003 : 3; + 3004 : 3; + 3005 : 3; + 3006 : 3; + 3007 : 3; + 3008 : 3; + 3009 : 3; + 3010 : 3; + 3011 : 3; + 3012 : 3; + 3013 : 3; + 3014 : 3; + 3015 : 3; + 3016 : 3; + 3017 : 3; + 3018 : 3; + 3019 : 3; + 3020 : 3; + 3021 : 3; + 3022 : 3; + 3023 : 3; + 3024 : 3; + 3025 : 3; + 3026 : 3; + 3027 : 3; + 3028 : 3; + 3029 : 3; + 3030 : 3; + 3031 : 3; + 3032 : 3; + 3033 : 3; + 3034 : 3; + 3035 : 3; + 3036 : 3; + 3037 : 3; + 3038 : 3; + 3039 : 3; + 3040 : 3; + 3041 : 3; + 3042 : 3; + 3043 : 3; + 3044 : 3; + 3045 : 3; + 3046 : 3; + 3047 : 3; + 3048 : 3; + 3049 : 3; + 3050 : 3; + 3051 : 3; + 3052 : 3; + 3053 : 3; + 3054 : 3; + 3055 : 3; + 3056 : 3; + 3057 : 0; + 3058 : 0; + 3059 : 0; + 3060 : 0; + 3061 : 0; + 3062 : 3; + 3063 : 3; + 3064 : 3; + 3065 : 3; + 3066 : 0; + 3067 : 0; + 3068 : 0; + 3069 : 0; + 3070 : 0; + 3071 : 0; + 3072 : 0; + 3073 : 0; + 3074 : 0; + 3075 : 0; + 3076 : 0; + 3077 : 0; + 3078 : 0; + 3079 : 3; + 3080 : 3; + 3081 : 3; + 3082 : 3; + 3083 : 3; + 3084 : 3; + 3085 : 3; + 3086 : 3; + 3087 : 3; + 3088 : 3; + 3089 : 3; + 3090 : 3; + 3091 : 3; + 3092 : 3; + 3093 : 3; + 3094 : 3; + 3095 : 3; + 3096 : 3; + 3097 : 3; + 3098 : 3; + 3099 : 3; + 3100 : 3; + 3101 : 3; + 3102 : 3; + 3103 : 3; + 3104 : 3; + 3105 : 3; + 3106 : 3; + 3107 : 3; + 3108 : 3; + 3109 : 3; + 3110 : 3; + 3111 : 3; + 3112 : 3; + 3113 : 3; + 3114 : 3; + 3115 : 3; + 3116 : 3; + 3117 : 3; + 3118 : 3; + 3119 : 3; + 3120 : 3; + 3121 : 3; + 3122 : 3; + 3123 : 3; + 3124 : 3; + 3125 : 3; + 3126 : 3; + 3127 : 3; + 3128 : 3; + 3129 : 3; + 3130 : 3; + 3131 : 3; + 3132 : 3; + 3133 : 3; + 3134 : 3; + 3135 : 3; + 3136 : 3; + 3137 : 3; + 3138 : 3; + 3139 : 3; + 3140 : 3; + 3141 : 3; + 3142 : 3; + 3143 : 3; + 3144 : 3; + 3145 : 3; + 3146 : 3; + 3147 : 3; + 3148 : 3; + 3149 : 3; + 3150 : 3; + 3151 : 3; + 3152 : 3; + 3153 : 3; + 3154 : 3; + 3155 : 3; + 3156 : 3; + 3157 : 3; + 3158 : 3; + 3159 : 3; + 3160 : 3; + 3161 : 3; + 3162 : 3; + 3163 : 3; + 3164 : 3; + 3165 : 3; + 3166 : 3; + 3167 : 3; + 3168 : 3; + 3169 : 3; + 3170 : 3; + 3171 : 3; + 3172 : 3; + 3173 : 3; + 3174 : 3; + 3175 : 3; + 3176 : 3; + 3177 : 3; + 3178 : 3; + 3179 : 3; + 3180 : 3; + 3181 : 3; + 3182 : 3; + 3183 : 3; + 3184 : 3; + 3185 : 3; + 3186 : 3; + 3187 : 3; + 3188 : 3; + 3189 : 3; + 3190 : 3; + 3191 : 3; + 3192 : 3; + 3193 : 3; + 3194 : 3; + 3195 : 3; + 3196 : 3; + 3197 : 0; + 3198 : 0; + 3199 : 0; + 3200 : 0; + 3201 : 0; + 3202 : 0; + 3203 : 0; + 3204 : 0; + 3205 : 0; + 3206 : 0; + 3207 : 0; + 3208 : 3; + 3209 : 3; + 3210 : 3; + 3211 : 3; + 3212 : 3; + 3213 : 3; + 3214 : 3; + 3215 : 3; + 3216 : 3; + 3217 : 3; + 3218 : 3; + 3219 : 3; + 3220 : 3; + 3221 : 3; + 3222 : 3; + 3223 : 3; + 3224 : 3; + 3225 : 3; + 3226 : 3; + 3227 : 3; + 3228 : 3; + 3229 : 3; + 3230 : 3; + 3231 : 3; + 3232 : 3; + 3233 : 3; + 3234 : 3; + 3235 : 3; + 3236 : 3; + 3237 : 3; + 3238 : 3; + 3239 : 3; + 3240 : 3; + 3241 : 3; + 3242 : 3; + 3243 : 3; + 3244 : 3; + 3245 : 3; + 3246 : 3; + 3247 : 3; + 3248 : 3; + 3249 : 3; + 3250 : 3; + 3251 : 3; + 3252 : 3; + 3253 : 3; + 3254 : 3; + 3255 : 3; + 3256 : 3; + 3257 : 3; + 3258 : 3; + 3259 : 3; + 3260 : 3; + 3261 : 3; + 3262 : 3; + 3263 : 3; + 3264 : 3; + 3265 : 3; + 3266 : 3; + 3267 : 3; + 3268 : 3; + 3269 : 3; + 3270 : 3; + 3271 : 3; + 3272 : 3; + 3273 : 3; + 3274 : 3; + 3275 : 3; + 3276 : 3; + 3277 : 3; + 3278 : 3; + 3279 : 3; + 3280 : 3; + 3281 : 3; + 3282 : 3; + 3283 : 3; + 3284 : 3; + 3285 : 3; + 3286 : 3; + 3287 : 3; + 3288 : 3; + 3289 : 3; + 3290 : 3; + 3291 : 3; + 3292 : 3; + 3293 : 3; + 3294 : 3; + 3295 : 3; + 3296 : 3; + 3297 : 3; + 3298 : 3; + 3299 : 3; + 3300 : 3; + 3301 : 3; + 3302 : 3; + 3303 : 3; + 3304 : 3; + 3305 : 3; + 3306 : 3; + 3307 : 3; + 3308 : 3; + 3309 : 3; + 3310 : 3; + 3311 : 3; + 3312 : 3; + 3313 : 3; + 3314 : 3; + 3315 : 3; + 3316 : 3; + 3317 : 3; + 3318 : 3; + 3319 : 3; + 3320 : 3; + 3321 : 3; + 3322 : 3; + 3323 : 3; + 3324 : 0; + 3325 : 0; + 3326 : 0; + 3327 : 0; + 3328 : 0; + 3329 : 0; + 3330 : 0; + 3331 : 0; + 3332 : 0; + 3333 : 0; + 3334 : 0; + 3335 : 0; + 3336 : 0; + 3337 : 3; + 3338 : 3; + 3339 : 3; + 3340 : 3; + 3341 : 3; + 3342 : 3; + 3343 : 3; + 3344 : 3; + 3345 : 3; + 3346 : 3; + 3347 : 3; + 3348 : 3; + 3349 : 3; + 3350 : 3; + 3351 : 3; + 3352 : 3; + 3353 : 3; + 3354 : 3; + 3355 : 3; + 3356 : 3; + 3357 : 3; + 3358 : 3; + 3359 : 3; + 3360 : 3; + 3361 : 3; + 3362 : 3; + 3363 : 3; + 3364 : 3; + 3365 : 3; + 3366 : 3; + 3367 : 3; + 3368 : 3; + 3369 : 3; + 3370 : 3; + 3371 : 3; + 3372 : 3; + 3373 : 3; + 3374 : 3; + 3375 : 3; + 3376 : 3; + 3377 : 3; + 3378 : 3; + 3379 : 3; + 3380 : 3; + 3381 : 3; + 3382 : 3; + 3383 : 3; + 3384 : 3; + 3385 : 3; + 3386 : 3; + 3387 : 3; + 3388 : 3; + 3389 : 3; + 3390 : 3; + 3391 : 3; + 3392 : 3; + 3393 : 3; + 3394 : 3; + 3395 : 3; + 3396 : 3; + 3397 : 3; + 3398 : 3; + 3399 : 3; + 3400 : 3; + 3401 : 3; + 3402 : 3; + 3403 : 3; + 3404 : 3; + 3405 : 3; + 3406 : 3; + 3407 : 3; + 3408 : 3; + 3409 : 3; + 3410 : 3; + 3411 : 3; + 3412 : 3; + 3413 : 3; + 3414 : 3; + 3415 : 3; + 3416 : 3; + 3417 : 3; + 3418 : 3; + 3419 : 3; + 3420 : 3; + 3421 : 3; + 3422 : 3; + 3423 : 3; + 3424 : 3; + 3425 : 3; + 3426 : 3; + 3427 : 3; + 3428 : 3; + 3429 : 3; + 3430 : 3; + 3431 : 3; + 3432 : 3; + 3433 : 3; + 3434 : 3; + 3435 : 3; + 3436 : 3; + 3437 : 3; + 3438 : 3; + 3439 : 3; + 3440 : 3; + 3441 : 3; + 3442 : 3; + 3443 : 3; + 3444 : 3; + 3445 : 3; + 3446 : 3; + 3447 : 3; + 3448 : 3; + 3449 : 3; + 3450 : 3; + 3451 : 0; + 3452 : 0; + 3453 : 0; + 3454 : 0; + 3455 : 0; + 3456 : 0; + 3457 : 0; + 3458 : 0; + 3459 : 0; + 3460 : 0; + 3461 : 0; + 3462 : 0; + 3463 : 0; + 3464 : 0; + 3465 : 0; + 3466 : 3; + 3467 : 3; + 3468 : 3; + 3469 : 3; + 3470 : 3; + 3471 : 3; + 3472 : 3; + 3473 : 3; + 3474 : 3; + 3475 : 3; + 3476 : 3; + 3477 : 3; + 3478 : 3; + 3479 : 3; + 3480 : 3; + 3481 : 3; + 3482 : 3; + 3483 : 3; + 3484 : 3; + 3485 : 3; + 3486 : 3; + 3487 : 3; + 3488 : 0; + 3489 : 0; + 3490 : 0; + 3491 : 0; + 3492 : 0; + 3493 : 0; + 3494 : 0; + 3495 : 0; + 3496 : 0; + 3497 : 0; + 3498 : 0; + 3499 : 0; + 3500 : 0; + 3501 : 0; + 3502 : 0; + 3503 : 0; + 3504 : 0; + 3505 : 0; + 3506 : 0; + 3507 : 0; + 3508 : 0; + 3509 : 0; + 3510 : 0; + 3511 : 0; + 3512 : 0; + 3513 : 0; + 3514 : 0; + 3515 : 0; + 3516 : 0; + 3517 : 0; + 3518 : 0; + 3519 : 0; + 3520 : 0; + 3521 : 0; + 3522 : 0; + 3523 : 0; + 3524 : 0; + 3525 : 0; + 3526 : 0; + 3527 : 0; + 3528 : 0; + 3529 : 0; + 3530 : 0; + 3531 : 0; + 3532 : 0; + 3533 : 0; + 3534 : 0; + 3535 : 0; + 3536 : 0; + 3537 : 0; + 3538 : 0; + 3539 : 0; + 3540 : 0; + 3541 : 0; + 3542 : 0; + 3543 : 0; + 3544 : 0; + 3545 : 0; + 3546 : 0; + 3547 : 0; + 3548 : 0; + 3549 : 0; + 3550 : 0; + 3551 : 0; + 3552 : 0; + 3553 : 0; + 3554 : 0; + 3555 : 0; + 3556 : 0; + 3557 : 0; + 3558 : 0; + 3559 : 0; + 3560 : 0; + 3561 : 0; + 3562 : 0; + 3563 : 0; + 3564 : 0; + 3565 : 0; + 3566 : 0; + 3567 : 0; + 3568 : 0; + 3569 : 0; + 3570 : 0; + 3571 : 0; + 3572 : 0; + 3573 : 0; + 3574 : 0; + 3575 : 0; + 3576 : 0; + 3577 : 0; + 3578 : 0; + 3579 : 0; + 3580 : 0; + 3581 : 0; + 3582 : 0; + 3583 : 0; + [3584..7999] : 0; +END; + diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_ship.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_ship.v new file mode 100644 index 00000000..870ed564 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/sprite_ship.v @@ -0,0 +1,161 @@ +// megafunction wizard: %ROM: 1-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: sprite_ship.v +// Megafunction Name(s): +// altsyncram +// +// 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 sprite_ship ( + address, + clock, + q); + + input [12:0] address; + input clock; + output [3:0] q; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [3:0] sub_wire0; + wire [3:0] q = sub_wire0[3:0]; + + altsyncram altsyncram_component ( + .address_a (address), + .clock0 (clock), + .q_a (sub_wire0), + .aclr0 (1'b0), + .aclr1 (1'b0), + .address_b (1'b1), + .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_a ({4{1'b1}}), + .data_b (1'b1), + .eccstatus (), + .q_b (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_a (1'b0), + .wren_b (1'b0)); + defparam + altsyncram_component.address_aclr_a = "NONE", + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", + altsyncram_component.init_file = "sprite_ship.mif", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 8000, + altsyncram_component.operation_mode = "ROM", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_reg_a = "CLOCK0", + altsyncram_component.ram_block_type = "M9K", + altsyncram_component.widthad_a = 13, + altsyncram_component.width_a = 4, + altsyncram_component.width_byteena_a = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +// Retrieval info: PRIVATE: AclrByte NUMERIC "0" +// Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: Clken NUMERIC "0" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "sprite_ship.mif" +// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8000" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "2" +// Retrieval info: PRIVATE: RegAddr NUMERIC "1" +// Retrieval info: PRIVATE: RegOutput NUMERIC "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: SingleClock NUMERIC "1" +// Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +// Retrieval info: PRIVATE: WidthAddr NUMERIC "13" +// Retrieval info: PRIVATE: WidthData NUMERIC "4" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: INIT_FILE STRING "sprite_ship.mif" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "8000" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +// Retrieval info: CONSTANT: RAM_BLOCK_TYPE STRING "M9K" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "4" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: USED_PORT: address 0 0 13 0 INPUT NODEFVAL "address[12..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: q 0 0 4 0 OUTPUT NODEFVAL "q[3..0]" +// Retrieval info: CONNECT: @address_a 0 0 13 0 address 0 0 13 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: q 0 0 4 0 @q_a 0 0 4 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_ship.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_ship.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_ship.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_ship.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_ship_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL sprite_ship_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/vga_time_generator.v b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/vga_time_generator.v new file mode 100644 index 00000000..b8c42ac9 --- /dev/null +++ b/Arcade/Custom Hardware/RiverRaid_MiST(Clone)/rtl/vga_time_generator.v @@ -0,0 +1,358 @@ +// ============================================================================ +// Copyright (c) 2012 by Terasic Technologies Inc. +// ============================================================================ +// +// Permission: +// +// Terasic grants permission to use and modify this code for use +// in synthesis for all Terasic Development Boards and Altera Development +// Kits made by Terasic. Other use of this code, including the selling +// ,duplication, or modification of any portion is strictly prohibited. +// +// Disclaimer: +// +// This VHDL/Verilog or C/C++ source code is intended as a design reference +// which illustrates how these types of functions can be implemented. +// It is the user's responsibility to verify their design for +// consistency and functionality through the use of formal +// verification methods. Terasic provides no warranty regarding the use +// or functionality of this code. +// +// ============================================================================ +// +// Terasic Technologies Inc +// 9F., No.176, Sec.2, Gongdao 5th Rd, East Dist, Hsinchu City, 30070. Taiwan +// +// +// +// web: http://www.terasic.com/ +// email: support@terasic.com +// +// ============================================================================ + +/* + +Horizonal Timing +A (us) Scanline +B (us) Sync pulse +C (us) Back porchch +D (us) Active video +E (us) Front porcch +E+B+C = blanking + + ______________________ _________ +________| VIDEO |________| VIDEO (next line) + |-C-|----------D-----------|-E-| +__ _______________________________ ___________ + |_| |_| + |B| + |---------------A-----------------| + + +Vertical Timing +O (ms) Total frame +P (ms) Sync length +Q (ms) Back porch +R (ms) Active video +S (ms) Front porch + ______________________ ________ +________| VIDEO |________| VIDEO (next fram + |-Q-|----------R-----------|-S-| +__ ______________________________ ___________ + |_| |_| + |P| + |---------------O----------------| + + +VGA 640x480@60Hz + +Reference: +http://www.epanorama.net/documents/pc/vga_timing.html + +"VGA industry standard" 640x480 pixel mode + +example: 640x480@60 +General characteristics +Clock frequency 25.175 MHz +Line frequency 31469 Hz +Field frequency 59.94 Hz + +One line + 8 pixels front porch + 96 pixels horizontal sync + 40 pixels back porch + 8 pixels left border +640 pixels video + 8 pixels right border +--- +800 pixels total per line + +One field + 2 lines front porch + 2 lines vertical sync + 25 lines back porch + 8 lines top border +480 lines video + 8 lines bottom border +--- +525 lines total per field + +Other details +Sync polarity: H negative, V negative +Scan type: non interlaced. + + + +*/ + +module vga_time_generator( + + clk, + reset_n, + + h_disp, + h_fporch, + h_sync, + h_bporch, + + v_disp, + v_fporch, + v_sync, + v_bporch, + + hs_polarity, + vs_polarity, + frame_interlaced, + + vga_hs, + vga_vs, + vga_de, + + pixel_i_odd_frame, + pixel_x, + pixel_y + + +); + +//////////////////////////////////////////////// +/////// Port Declare +//////////////////////////////////////////////// +input clk; +input reset_n; + +input [11:0] h_disp; +input [11:0] h_fporch; +input [11:0] h_sync; +input [11:0] h_bporch; + +input [11:0] v_disp; +input [11:0] v_fporch; +input [11:0] v_sync; +input [11:0] v_bporch; + +input hs_polarity; +input vs_polarity; +input frame_interlaced; + +output reg vga_hs; +output reg vga_vs; +output vga_de; + +output reg pixel_i_odd_frame; +output reg [11:0] pixel_x; +output reg [11:0] pixel_y; + + + + +//////////////////////////////////////////////// +///////h sync//////// +//////////////////////////////////////////////// +//h total sum// +reg [11:0] h_total; +reg [11:0] h_total_half; +reg [11:0] h_pixel_start; +reg [11:0] h_pixel_end; +reg h_sync_polarity; +reg vga_h_de; + +wire h_de; +wire [11:0] h_valid_pixel_count; +wire h_last_pixel; +assign h_de = (h_counter >= h_pixel_start && h_counter < h_pixel_end)?1'b1:1'b0; +assign h_valid_pixel_count = h_counter - h_pixel_start; +assign h_last_pixel = (h_counter+1 == h_total)?1'b1:1'b0; + + +//h counter gen // +reg [11:0]h_counter; +reg [11:0] h_cur_disp; + + +// H_Sync, H_Blank Generator, +always @(posedge clk or negedge reset_n) +begin + if (!reset_n) + begin + h_counter <= 12'h000; + vga_hs <= hs_polarity?1'b1:1'b0; + vga_h_de <= 1'b0; + pixel_x <= 12'hfff; + h_cur_disp <= 0; + end + else if (h_cur_disp != h_disp) + begin + h_cur_disp <= h_disp; + // + h_total <= h_disp+h_fporch+h_sync+h_bporch; + h_total_half <= (h_disp+h_fporch+h_sync+h_bporch ) >> 1; + h_pixel_start <= h_sync+h_bporch; + h_pixel_end <= h_sync+h_bporch+h_disp; + h_sync_polarity <= hs_polarity; + // + h_counter <= 12'h000; + vga_hs <= hs_polarity?1'b1:1'b0; + vga_h_de <= 1'b0; + pixel_x <= 12'hfff; + end + else + begin + // h_counter + if (!h_last_pixel) + h_counter <= h_counter+1'b1; + else + h_counter <= 0; + + // h sync generator + if (h_counter < h_sync) + vga_hs <= h_sync_polarity?1'b1:1'b0; + else + vga_hs <= h_sync_polarity?1'b0:1'b1; + + // de + pixel_x <= (h_de)?h_valid_pixel_count:12'hfff; + vga_h_de <= h_de; + + end +end + + +//////////////////////////////////////////////// +/////v sync///// +//////////////////////////////////////////////// +//v total sum// +reg vga_v_de; +reg [11:0]v_total; +reg [11:0]v_pixel_start; +reg [11:0]v_pixel_end; +reg v_sync_polarity; +reg v_interlaced; +reg gen_field1_sync; +reg f0_to_f1; + +wire [11:0] v_field_total; +wire [11:0] v_field_disp; +wire [11:0] v_valid_line_count; +wire v_de; +assign v_de = (v_counter >= v_pixel_start && v_counter < v_pixel_end)?1'b1:1'b0; +assign v_valid_line_count = v_counter - v_pixel_start; +assign v_field_disp = (frame_interlaced)?(v_disp >> 1):v_disp; +assign v_field_total = v_sync+v_bporch+v_field_disp+v_fporch; + +//v counter gen +reg [11:0] v_counter; +reg [11:0] v_cur_disp; + +// H_Sync, H_Blank Generator, +always @(posedge clk or negedge reset_n) +begin + if (!reset_n) + begin + v_counter <= 12'h000; + vga_vs <= vs_polarity?1'b1:1'b0; + vga_v_de <= 1'b0; + pixel_y <= 12'hfff; + pixel_i_odd_frame <= 1'b0; + v_cur_disp <= 0; + end + else if (v_cur_disp != v_disp) + begin + v_cur_disp <= v_disp; + // + v_pixel_start <= v_sync+v_bporch; + v_pixel_end <= v_sync+v_bporch+v_field_disp; + v_total <= v_field_total;// + frame_interlaced; + v_sync_polarity <= vs_polarity; + v_interlaced <= frame_interlaced; + f0_to_f1 <= 1'b0; + // + v_counter <= 12'h000; + vga_vs <= vs_polarity?1'b1:1'b0; + vga_v_de <= 1'b0; + pixel_y <= 12'hfff; + pixel_i_odd_frame <= 1'b0; + end + else if (h_counter == 0 && f0_to_f1) + f0_to_f1 <= 1'b0; // line between field0 and filed1 + else if (h_counter == h_total_half && (f0_to_f1 || pixel_i_odd_frame)) + begin // generate sync for filed1 + // v sync generator + if (f0_to_f1) + pixel_i_odd_frame <= 1'b1; + else + begin + if (v_counter < v_sync) // v_counter, 0,1,2,3.... + vga_vs <= v_sync_polarity?1'b1:1'b0; + else + vga_vs <= v_sync_polarity?1'b0:1'b1; + end + end + else if (h_counter == 0) + begin + // v_counter + if (v_counter+1 < v_total) + v_counter <= v_counter+1'b1; + else + begin + v_counter <= 0; + // + if (v_interlaced) + begin + if (pixel_i_odd_frame) + pixel_i_odd_frame <= 1'b0; + else + f0_to_f1 <= 1'b1; + end + end + + // v sync generator + if (!pixel_i_odd_frame) + begin + if (v_counter < v_sync) + vga_vs <= v_sync_polarity?1'b1:1'b0; + else + vga_vs <= v_sync_polarity?1'b0:1'b1; + end + + // blank + vga_v_de <= v_de; + if (!v_de) + pixel_y <= 12'hfff; + else if (!v_interlaced) + pixel_y <= v_valid_line_count; + else if (pixel_i_odd_frame) + pixel_y <= (v_valid_line_count << 1) + 1; // odd frame, 1, 3, 5, ... + else + pixel_y <= v_valid_line_count << 1; // even frame, 0, 2, 4, ... + + end +end + +//sync timing output// + + +assign vga_de = vga_h_de & vga_v_de; + + +endmodule diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/README.txt b/Arcade/Data East Cassette/Burger_Time_MiST/README.txt new file mode 100644 index 00000000..59aadefd --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/README.txt @@ -0,0 +1,246 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Burger Time for MiST by Gehstock +-- 18 December 2017 +-- +--------------------------------------------------------------------------------- +-- Copyright (c) DAR - Dez 2017 +-- https://sourceforge.net/projects/darfpga/files/Software%20VHDL/burger_time/ +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F1 : Start 1 player +-- F2 : Start 2 players +-- SPACE : Pepper +-- LALT : +-- ARROW KEYS : Movement +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + +--------------------------------------------------------------------------------- +-- Burger Time by Dar (darfpga@aol.fr) (27/12/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T65(b) core.Ver 301 by MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Use burger_time_de10_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +-- +-- Main features : +-- PS2 keyboard input @gpio pins 35/34 (beware voltage translation/protection) +-- Audio pwm output @gpio pins 1/3 (beware voltage translation/protection) +-- +-- Uses 1 pll for 12MHz generation from 50MHz +-- +-- Board key : +-- 0 : reset game +-- +-- Keyboard players inputs : +-- +-- F3 : Add coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE : pepper +-- RIGHT arrow : move right +-- LEFT arrow : move left +-- UP arrow : move up +-- DOWN arrow : move down +-- +-- Other details : see burger_time.vhd +-- For USB inputs and SGT5000 audio output see my other project: xevious_de10_lite +--------------------------------------------------------------------------------- +-- Use burger_time_de10_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +-- Features : +-- TV 15KHz mode only (atm) +-- Coctail mode ok +-- Sound ok +-- No external RAM/SDRAM required + +-- Use with MAME roms from btime.zip +-- +-- Use make_burger_time_proms.bat to build vhd file from binaries + +-- Burger Time Hardware caracteristics : +-- +-- VIDEO : 1x6502@750kHz CPU accessing its program rom, working ram, +-- foreground and sprite data ram, I/O, sound board register and trigger. +-- 16Kx8bits program rom +-- 2Kb8bits working ram +-- +-- One char 8x8 tile map 32x30 + sprites data +-- 1Kx8bits + 1Kx2bits +-- 3x8Kx8bits graphics rom 3bits/pixel +-- 8 colors with ram palette +-- +-- 8 sprites 16*16 with priorities and flip H/V +-- use char graphics rom and colors +-- +-- Char/sprites 8 colors among 256 colors +-- 8bits 3red/3green/2blue +-- +-- Sprites buffer rams 3x256bits +-- +-- Background static tile map with scroll +-- 2K*8bits tile map rom +-- 3x2K*8bits graphics rom 3bits/pixel +-- 8 colors with ram palette +-- 16x16 tiles +-- +-- SOUND : 1x6502@500kHz CPU accessing its program rom, working ram, 2x-AY3-8910, +-- command registers, triggers. +-- 2Kx8bits working ram +-- 4Kx8bits program rom +-- +-- 1xAY-3-8910 +-- 3 sound channels +-- 1xAY-3-8910 +-- 3 sound channels +-- +-- Pass band active filter on channel A of AY#2 +-- ++----------------------------------------------------------------------------------+ +; Fitter Summary ; ++------------------------------------+---------------------------------------------+ +; Fitter Status ; Successful - Wed Dec 27 10:02:23 2017 ; +; Quartus Prime Version ; 16.1.0 Build 196 10/24/2016 SJ Lite Edition ; +; Revision Name ; burger_time_de10_lite ; +; Top-level Entity Name ; burger_time_de10_lite ; +; Family ; MAX 10 ; +; Device ; 10M50DAF484C6GES ; +; Timing Models ; Preliminary ; +; Total logic elements ; 3,540 / 49,760 ( 7 % ) ; +; Total combinational functions ; 3,382 / 49,760 ( 7 % ) ; +; Dedicated logic registers ; 1,090 / 49,760 ( 2 % ) ; +; Total registers ; 1090 ; +; Total pins ; 105 / 360 ( 29 % ) ; +; Total virtual pins ; 0 ; +; Total memory bits ; 465,792 / 1,677,312 ( 28 % ) ; +; Embedded Multiplier 9-bit elements ; 0 / 288 ( 0 % ) ; +; Total PLLs ; 1 / 4 ( 25 % ) ; +; UFM blocks ; 0 / 1 ( 0 % ) ; +; ADC blocks ; 0 / 2 ( 0 % ) ; ++------------------------------------+---------------------------------------------+ + +--------------- +VHDL File list +--------------- + +max10_pll_12M.vhd Pll 12MHz and 14 MHz from 50MHz altera mf + +rtl_dar/burger_time_de10_lite.vhd Top level for de10_lite board + +rtl_dar/burger_time.vhd Main video board logic +rtl_dar/burger_time_sound.vhd Main sound board logic + +rtl_mikej/YM2149_linmix_sep.vhd Copyright (c) MikeJ - Jan 2005 + +t65/T65.vhd Copyright (c) MikeJ - Jan 2005t65/T65_Pack.vhdt65/T65_MCode.vhdt65/T65_ALU.vhd +rtl_dar/kbd_joystick.vhd Keyboard key to player/coin input +rtl_dar/io_ps2_keyboard.vhd Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +rtl_dar/gen_ram.vhd Generic RAM (Peter Wendrich + DAR Modification) +rtl_dar/decodeur_7_seg.vhd 7 segments display decoder + +burger_time_prog.vhd Burger Time video board PROMs +fg_sp_graphx_3.vhd +fg_sp_graphx_2.vhd +fg_sp_graphx_1.vhd +bg_map.vhd +bg_graphx_3.vhd +bg_graphx_2.vhd +bg_graphx_1.vhd + +burger_time_sound_prog.vhd Burger Time sound board PROM + +---------------------- +Quartus project files +---------------------- +de10_lite/burger_time_de10_lite.sdc Timequest constraints file +de10_lite/burger_time_de10_lite.qsf de10_lite settings (files,pins...) +de10_lite/burger_time_de10_lite.qpf de10_lite project + +----------------------------- +Required ROMs (Not included) +----------------------------- +You need the following 15 ROMs binary files from btime.zip (MAME) + +aa04.9b, aa06.13b, aa05.10b, aa07.15b +aa12.7k, ab13.9k +ab10.10k, ab11.12k +aa8.13k, ab9.15k +ab00.1b +ab01.3b +ab02.4b +ab03.6b +ab14.12h + +------ +Tools +------ +You need to build vhdl files from the binary file : + - Unzip the roms file in the tools/burger_time_unzip directory + - Double click (execute) the script tools/make_burger_time_proms.bat to get the following files + +burger_time_prog.vhd : aa04.9b + aa06.13b + aa05.10b + aa07.15b +fg_sp_graphx_1.vhd : aa12.7k + ab13.9k +fg_sp_graphx_2.vhd : ab10.10k + ab11.12k +fg_sp_graphx_3.vhd : aa8.13k + ab9.15k +bg_graphx_1.vhd : ab00.1b +bg_graphx_2.vhd : ab01.3b +bg_graphx_3.vhd : ab02.4b +bg_map.vhd : ab03.6b +burger_time_sound_prog.vhd : ab14.12h + +*DO NOT REDISTRIBUTE THESE FILES* + +VHDL files are needed to compile and include roms into the project + +The script make_burger_time_proms.bat uses make_vhdl_prom executables delivered both in linux and windows version. The script itself is delivered only in windows version (.bat) but should be easily ported to linux. + +Source code of make_vhdl_prom.c is also delivered. + +--------------------------------- +Compiling for de10_lite +--------------------------------- +You can build the project with ROM image embeded in the sof file. +*DO NOT REDISTRIBUTE THESE FILES* + +3 steps + + - put the VHDL ROM files (.vhd) into the rtl_dar directory + - build burger_time_de10_lite + - program burger_time_de10_lite.sof + +------------------------ +------------------------ +End of file +------------------------ diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/Release/burger_time_mist.rbf b/Arcade/Data East Cassette/Burger_Time_MiST/Release/burger_time_mist.rbf new file mode 100644 index 00000000..092f9af3 Binary files /dev/null and b/Arcade/Data East Cassette/Burger_Time_MiST/Release/burger_time_mist.rbf differ diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/burger_time_mist.qpf b/Arcade/Data East Cassette/Burger_Time_MiST/burger_time_mist.qpf new file mode 100644 index 00000000..233545f9 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/burger_time_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 = 21:51:49 December 06, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "16.1" +DATE = "21:51:49 December 06, 2017" + +# Revisions + +PROJECT_REVISION = "burger_time_mist" diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/burger_time_mist.qsf b/Arcade/Data East Cassette/Burger_Time_MiST/burger_time_mist.qsf new file mode 100644 index 00000000..8a687e0b --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/burger_time_mist.qsf @@ -0,0 +1,176 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:52:55 December 26, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# burnin_rubber_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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY burger_time_mist +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# 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_DATA7_THROUGH_DATA2_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_OTHER_AP_PINS_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# SignalTap II Assignments +# ======================== +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp + +# 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 ENTITY(burnin_rubber_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(burnin_rubber_mist) +# ------------------------------ +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/burger_time_mist.sv +set_global_assignment -name VHDL_FILE rtl/burger_time.vhd +set_global_assignment -name VHDL_FILE "rtl/burger_time _sound.vhd" +set_global_assignment -name VHDL_FILE rtl/YM2149_linmix_sep.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/gen_ram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/fg_sp_graphx_3.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/fg_sp_graphx_2.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/fg_sp_graphx_1.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/burger_time_sound_prog.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/burger_time_prog.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/bg_map.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/bg_graphx_3.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/bg_graphx_2.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/bg_graphx_1.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/Arcade/Data East Cassette/Burger_Time_MiST/clean.bat b/Arcade/Data East Cassette/Burger_Time_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/bg_graphx_1.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/bg_graphx_1.vhd new file mode 100644 index 00000000..12ded815 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/bg_graphx_1.vhd @@ -0,0 +1,143 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity bg_graphx_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of bg_graphx_1 is + type rom is array(0 to 1935) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"AA",X"AA",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"8A",X"8A",X"8A",X"8A",X"8A", + X"AA",X"AA",X"AA",X"AA",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"8A",X"8A",X"8A",X"8A",X"8A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"AA",X"AA",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"AA",X"AA",X"AA",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"00",X"00",X"00", + X"00",X"00",X"00",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"00",X"00",X"00", + X"00",X"00",X"00",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"00",X"00",X"00", + X"60",X"60",X"60",X"EA",X"EA",X"EA",X"EA",X"EA",X"EA",X"EA",X"EA",X"EA",X"EA",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"AA",X"AA",X"AA", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"8A",X"8A",X"8A",X"8A",X"8A", + X"AA",X"AA",X"AA",X"AA",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"8A",X"8A",X"8A",X"8A",X"8A",X"00",X"00",X"00",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7E",X"12",X"1E",X"00",X"7E",X"5A",X"5A",X"00", + X"7E",X"12",X"1E",X"00",X"7E",X"12",X"1E",X"00",X"7E",X"5A",X"5A",X"00",X"7E",X"12",X"2E",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"10",X"00",X"22",X"00",X"10",X"04",X"00",X"00",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"00",X"00",X"10",X"00",X"48",X"00",X"00",X"20",X"00",X"08",X"40",X"00",X"10",X"04", + X"00",X"00",X"00",X"01",X"00",X"10",X"00",X"00",X"02",X"00",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"02",X"00",X"24",X"00",X"08",X"41",X"04",X"00",X"09",X"01",X"04",X"90",X"04",X"20",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"80",X"00",X"00",X"00",X"00",X"80",X"00",X"10",X"80",X"00",X"00",X"20",X"00",X"80",X"00", + X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"80",X"04",X"00",X"20",X"05",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00", + X"10",X"00",X"41",X"08",X"00",X"20",X"81",X"00",X"10",X"00",X"00",X"82",X"00",X"04",X"00",X"20", + X"00",X"00",X"24",X"00",X"04",X"01",X"10",X"00",X"02",X"00",X"00",X"00",X"00",X"01",X"00",X"00", + X"04",X"40",X"08",X"20",X"02",X"00",X"20",X"04",X"80",X"01",X"08",X"20",X"02",X"00",X"04",X"01", + X"00",X"00",X"00",X"00",X"01",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00", + X"00",X"00",X"10",X"00",X"04",X"00",X"01",X"00",X"04",X"00",X"00",X"09",X"00",X"02",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C6",X"92",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FE",X"92",X"F6",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"DE",X"92",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"DE",X"92",X"F2",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"FE",X"00",X"DE",X"92",X"F2",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"40",X"50",X"60",X"F0",X"D4",X"5A",X"88",X"A8",X"50",X"A0",X"CC",X"70",X"78",X"40",X"00", + X"00",X"00",X"00",X"00",X"01",X"02",X"07",X"04",X"06",X"04",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"38",X"6E",X"76",X"7F",X"5D",X"7F",X"77",X"7F",X"5E",X"76",X"38",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F8",X"CC",X"84",X"84",X"84",X"84",X"84",X"84",X"84",X"CC",X"F8",X"20",X"10",X"10",X"E0", + X"30",X"79",X"77",X"EF",X"EF",X"DF",X"DF",X"DF",X"EF",X"EF",X"77",X"79",X"31",X"02",X"01",X"00", + X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"10",X"5C",X"54",X"74",X"10",X"00", + X"00",X"00",X"7C",X"20",X"7C",X"64",X"7C",X"00",X"00",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0", + X"00",X"03",X"1F",X"11",X"1B",X"11",X"1F",X"03",X"00",X"00",X"00",X"00",X"00",X"10",X"70",X"80", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"80",X"70",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"80",X"60",X"60",X"00",X"00",X"00", + X"00",X"0C",X"02",X"A2",X"12",X"12",X"0C",X"00",X"00",X"00",X"BE",X"00",X"00",X"BE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"E6",X"B2",X"9E",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C6",X"92",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"9E",X"92",X"F2",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E6",X"B2",X"9E",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"24",X"FE",X"20",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"92",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"FE",X"00",X"FE",X"92",X"F6",X"00",X"FE",X"82",X"FE",X"82",X"FE",X"82",X"FE",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/bg_graphx_2.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/bg_graphx_2.vhd new file mode 100644 index 00000000..6eb2514b --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/bg_graphx_2.vhd @@ -0,0 +1,50 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity bg_graphx_2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of bg_graphx_2 is + type rom is array(0 to 447) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/bg_graphx_3.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/bg_graphx_3.vhd new file mode 100644 index 00000000..f7b1ad2f --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/bg_graphx_3.vhd @@ -0,0 +1,143 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity bg_graphx_3 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of bg_graphx_3 is + type rom is array(0 to 1935) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"10",X"10",X"10",X"10",X"10",X"20",X"40",X"80", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7E",X"12",X"1E",X"00",X"7E",X"5A",X"5A",X"00", + X"7E",X"12",X"1E",X"00",X"7E",X"12",X"1E",X"00",X"7E",X"5A",X"5A",X"00",X"7E",X"12",X"2E",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"10",X"00",X"22",X"00",X"10",X"04",X"00",X"00",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"00",X"00",X"10",X"00",X"48",X"00",X"00",X"20",X"00",X"08",X"40",X"00",X"10",X"04", + X"00",X"00",X"00",X"01",X"00",X"10",X"00",X"00",X"02",X"00",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"02",X"00",X"24",X"00",X"08",X"41",X"04",X"00",X"09",X"01",X"04",X"90",X"04",X"20",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"80",X"00",X"00",X"00",X"00",X"80",X"00",X"10",X"80",X"00",X"00",X"20",X"00",X"80",X"00", + X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"80",X"04",X"00",X"20",X"05",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00", + X"10",X"00",X"41",X"08",X"00",X"20",X"81",X"00",X"10",X"00",X"00",X"82",X"00",X"04",X"00",X"20", + X"00",X"00",X"24",X"00",X"04",X"01",X"10",X"00",X"02",X"00",X"00",X"00",X"00",X"01",X"00",X"00", + X"04",X"40",X"08",X"20",X"02",X"00",X"20",X"04",X"80",X"01",X"08",X"20",X"02",X"00",X"04",X"01", + X"00",X"00",X"00",X"00",X"01",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00", + X"00",X"00",X"10",X"00",X"04",X"00",X"01",X"00",X"04",X"00",X"00",X"09",X"00",X"02",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C6",X"92",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FE",X"92",X"F6",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"DE",X"92",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"DE",X"92",X"F2",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"FE",X"00",X"DE",X"92",X"F2",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"40",X"50",X"60",X"F0",X"D4",X"5A",X"88",X"A8",X"50",X"A0",X"CC",X"70",X"78",X"40",X"00", + X"00",X"00",X"00",X"00",X"01",X"02",X"07",X"04",X"06",X"04",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"38",X"6E",X"76",X"7F",X"5D",X"7F",X"77",X"7F",X"5E",X"76",X"38",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F8",X"CC",X"84",X"84",X"84",X"84",X"84",X"84",X"84",X"CC",X"F8",X"20",X"10",X"10",X"E0", + X"30",X"79",X"77",X"EF",X"EF",X"DF",X"DF",X"DF",X"EF",X"EF",X"77",X"79",X"31",X"02",X"01",X"00", + X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"10",X"5C",X"54",X"74",X"10",X"00", + X"00",X"00",X"7C",X"20",X"7C",X"64",X"7C",X"00",X"00",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0", + X"00",X"03",X"1F",X"11",X"1B",X"11",X"1F",X"03",X"00",X"00",X"00",X"00",X"00",X"10",X"70",X"80", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"80",X"70",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"80",X"60",X"60",X"00",X"00",X"00", + X"00",X"0C",X"02",X"A2",X"12",X"12",X"0C",X"00",X"00",X"00",X"BE",X"00",X"00",X"BE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"E6",X"B2",X"9E",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C6",X"92",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"9E",X"92",X"F2",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E6",X"B2",X"9E",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"24",X"FE",X"20",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"92",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"FE",X"00",X"FE",X"92",X"F6",X"00",X"FE",X"82",X"FE",X"82",X"FE",X"82",X"FE",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/bg_map.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/bg_map.vhd new file mode 100644 index 00000000..2c98fc15 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/bg_map.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity bg_map is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of bg_map is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"02",X"00", + X"00",X"05",X"06",X"00",X"05",X"06",X"07",X"05",X"06",X"00",X"05",X"06",X"00",X"05",X"06",X"00", + X"00",X"03",X"0D",X"09",X"0C",X"04",X"07",X"03",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"04",X"00", + X"00",X"00",X"00",X"07",X"03",X"0D",X"08",X"0C",X"04",X"07",X"05",X"06",X"00",X"05",X"06",X"00", + X"00",X"01",X"0B",X"08",X"0C",X"04",X"00",X"05",X"06",X"07",X"03",X"0D",X"09",X"0C",X"04",X"00", + X"00",X"05",X"06",X"07",X"03",X"0D",X"09",X"0C",X"0D",X"08",X"0C",X"04",X"07",X"00",X"00",X"00", + X"00",X"05",X"06",X"07",X"05",X"06",X"00",X"05",X"06",X"00",X"03",X"0D",X"08",X"0A",X"02",X"00", + X"00",X"03",X"0D",X"08",X"0C",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"04",X"07",X"05",X"06",X"00", + X"00",X"05",X"06",X"00",X"05",X"06",X"00",X"05",X"06",X"00",X"05",X"06",X"07",X"05",X"06",X"00", + X"00",X"03",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"0D",X"08",X"0C",X"04",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"02",X"00", + X"00",X"03",X"0D",X"08",X"0C",X"0D",X"08",X"0C",X"04",X"07",X"05",X"06",X"07",X"05",X"06",X"00", + X"00",X"03",X"0D",X"08",X"0C",X"04",X"07",X"03",X"0D",X"08",X"0C",X"0D",X"08",X"0C",X"04",X"00", + X"00",X"05",X"06",X"07",X"03",X"0D",X"08",X"0C",X"04",X"07",X"03",X"0D",X"08",X"0C",X"04",X"00", + X"00",X"03",X"0D",X"08",X"0C",X"0D",X"08",X"0C",X"0D",X"08",X"0C",X"0D",X"08",X"0C",X"04",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"03",X"0D",X"08",X"0A",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"0B",X"08",X"0C",X"04",X"07",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"03",X"0D",X"08",X"0A",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"0B",X"08",X"0C",X"0D",X"08",X"0A",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"02",X"00", + X"00",X"03",X"0D",X"09",X"0C",X"0D",X"08",X"0A",X"0B",X"08",X"0A",X"0B",X"09",X"0C",X"04",X"00", + X"00",X"03",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"04",X"00",X"03",X"0D",X"09",X"0C",X"04",X"00", + X"00",X"03",X"0D",X"09",X"0A",X"0B",X"08",X"0C",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"04",X"00", + X"00",X"00",X"00",X"00",X"03",X"04",X"07",X"03",X"0D",X"08",X"0A",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"0D",X"08",X"0C",X"0D",X"09",X"0C",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"04",X"00",X"00",X"00",X"00",X"05",X"06",X"00",X"00",X"00",X"00", + X"00",X"01",X"0B",X"09",X"0C",X"04",X"00",X"00",X"00",X"00",X"03",X"0D",X"09",X"0A",X"02",X"00", + X"00",X"03",X"0D",X"08",X"0C",X"04",X"00",X"00",X"00",X"00",X"03",X"0D",X"09",X"0C",X"04",X"00", + X"00",X"03",X"0D",X"08",X"0C",X"04",X"00",X"00",X"00",X"00",X"03",X"0D",X"08",X"0C",X"04",X"00", + X"00",X"00",X"00",X"00",X"03",X"0D",X"09",X"0A",X"0B",X"09",X"0C",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"0D",X"08",X"0A",X"0B",X"08",X"0C",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"02",X"00", + X"00",X"03",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"04",X"00", + X"00",X"01",X"0B",X"08",X"0A",X"0B",X"08",X"0A",X"0B",X"08",X"0A",X"0B",X"08",X"0A",X"02",X"00", + X"00",X"03",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"04",X"00", + X"00",X"01",X"0B",X"08",X"0A",X"0B",X"08",X"0C",X"0D",X"08",X"0A",X"0B",X"08",X"0A",X"02",X"00", + X"00",X"03",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"04",X"00", + X"00",X"03",X"0D",X"08",X"0A",X"0B",X"08",X"0A",X"0B",X"08",X"0A",X"0B",X"08",X"0C",X"04",X"00", + X"00",X"03",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"0D",X"09",X"0C",X"04",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"02",X"00", + X"00",X"03",X"0D",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"08",X"0C",X"04",X"00", + X"00",X"01",X"0B",X"09",X"0A",X"0B",X"09",X"0C",X"0D",X"09",X"0C",X"04",X"07",X"05",X"06",X"00", + X"00",X"03",X"0D",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0A",X"02",X"07",X"05",X"06",X"00", + X"00",X"03",X"0D",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0C",X"0D",X"08",X"0C",X"04",X"00", + X"00",X"03",X"0D",X"09",X"0C",X"0D",X"09",X"0A",X"0B",X"09",X"0A",X"02",X"07",X"05",X"06",X"00", + X"00",X"03",X"0D",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0C",X"04",X"07",X"05",X"06",X"00", + X"00",X"03",X"0D",X"09",X"0A",X"0B",X"09",X"0A",X"0B",X"09",X"0C",X"04",X"07",X"05",X"06",X"00", + X"00",X"05",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0B",X"08",X"0C",X"04",X"00", + X"00",X"05",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"06",X"00",X"05",X"06",X"00", + X"00",X"05",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"06",X"00",X"05",X"06",X"00", + X"00",X"03",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0D",X"09",X"0C",X"04",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"0B",X"09",X"0A",X"02",X"00",X"01",X"0B",X"09",X"0A",X"02",X"00", + X"00",X"01",X"0B",X"09",X"0C",X"04",X"07",X"01",X"0B",X"09",X"0C",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"0D",X"08",X"0A",X"02",X"07",X"01",X"0B",X"09",X"0A",X"02",X"00", + X"00",X"01",X"0B",X"09",X"0C",X"04",X"07",X"03",X"0D",X"08",X"0C",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"0B",X"08",X"0C",X"04",X"00",X"03",X"0D",X"09",X"0A",X"02",X"00", + X"00",X"01",X"0B",X"09",X"0C",X"04",X"00",X"03",X"0D",X"09",X"0C",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"0D",X"09",X"0A",X"02",X"07",X"01",X"0B",X"09",X"0A",X"02",X"00", + X"00",X"01",X"0B",X"09",X"0C",X"04",X"07",X"03",X"0D",X"08",X"0C",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"0B",X"08",X"0A",X"02",X"07",X"03",X"0D",X"09",X"0A",X"02",X"00", + X"00",X"01",X"0B",X"09",X"0C",X"04",X"00",X"03",X"0D",X"08",X"0C",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/burger_time_prog.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/burger_time_prog.vhd new file mode 100644 index 00000000..96b584de --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/burger_time_prog.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity burger_time_prog is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of burger_time_prog is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"4C",X"3C",X"CF",X"4C",X"0F",X"C0",X"85",X"F5",X"EA",X"4C",X"03",X"B0",X"85",X"F5",X"EA",X"78", + X"D8",X"A2",X"FF",X"9A",X"AD",X"03",X"40",X"29",X"10",X"F0",X"EE",X"A9",X"00",X"85",X"01",X"85", + X"F9",X"8D",X"00",X"40",X"20",X"32",X"C3",X"20",X"1D",X"C3",X"A9",X"01",X"85",X"01",X"A9",X"00", + X"85",X"1A",X"20",X"0D",X"C7",X"85",X"F7",X"EA",X"A9",X"FE",X"8D",X"05",X"50",X"A9",X"00",X"8D", + X"02",X"40",X"85",X"1B",X"85",X"20",X"A9",X"00",X"85",X"1C",X"20",X"16",X"C4",X"A2",X"FF",X"20", + X"2C",X"CA",X"20",X"D9",X"C3",X"A2",X"FF",X"20",X"2C",X"CA",X"20",X"78",X"C4",X"A2",X"3F",X"20", + X"2C",X"CA",X"20",X"61",X"C5",X"85",X"F5",X"EA",X"20",X"0D",X"C7",X"20",X"48",X"C7",X"A9",X"01", + X"85",X"1C",X"85",X"F5",X"EA",X"20",X"67",X"C7",X"85",X"F5",X"EA",X"AD",X"03",X"40",X"10",X"FB", + X"58",X"EA",X"EA",X"EA",X"EA",X"78",X"20",X"45",X"D0",X"20",X"6E",X"D0",X"E6",X"13",X"A5",X"13", + X"29",X"3F",X"D0",X"03",X"85",X"F5",X"EA",X"E6",X"14",X"D0",X"03",X"E6",X"15",X"EA",X"E6",X"16", + X"AD",X"00",X"40",X"6D",X"01",X"40",X"65",X"16",X"85",X"16",X"85",X"F5",X"EA",X"AD",X"03",X"40", + X"30",X"FB",X"20",X"E6",X"C8",X"20",X"7B",X"D1",X"20",X"96",X"D7",X"20",X"98",X"D8",X"A5",X"1B", + X"F0",X"0C",X"20",X"28",X"DB",X"20",X"BB",X"DB",X"20",X"77",X"DC",X"85",X"F5",X"EA",X"20",X"65", + X"DD",X"20",X"8D",X"EA",X"20",X"DF",X"E6",X"20",X"41",X"E1",X"20",X"90",X"E1",X"20",X"35",X"E8", + X"20",X"60",X"E7",X"20",X"6C",X"E8",X"A6",X"1F",X"B5",X"2B",X"D0",X"2D",X"A5",X"13",X"29",X"3F", + X"D0",X"19",X"A2",X"FC",X"A0",X"C0",X"20",X"BC",X"C9",X"4C",X"19",X"C1",X"3A",X"10",X"00",X"00", + X"00",X"FF",X"3A",X"10",X"51",X"52",X"53",X"FF",X"85",X"F6",X"EA",X"C9",X"0F",X"D0",X"0A",X"A2", + X"02",X"A0",X"C1",X"20",X"BC",X"C9",X"85",X"F6",X"EA",X"A5",X"C6",X"D0",X"0D",X"A5",X"C5",X"F0", + X"03",X"4C",X"75",X"C0",X"4C",X"7B",X"C0",X"85",X"F7",X"EA",X"A9",X"00",X"85",X"C6",X"C9",X"1B", + X"D0",X"0B",X"A2",X"3F",X"20",X"2C",X"CA",X"4C",X"38",X"C0",X"85",X"F7",X"6E",X"20",X"A3",X"C8", + X"20",X"E3",X"CB",X"A5",X"21",X"D0",X"17",X"A5",X"29",X"30",X"0D",X"A9",X"01",X"85",X"20",X"08", + X"52",X"C2",X"4C",X"75",X"C0",X"85",X"F5",X"6E",X"4C",X"F1",X"C1",X"85",X"F7",X"6E",X"A6",X"1F", + X"D0",X"4D",X"A5",X"29",X"25",X"2A",X"30",X"41",X"A5",X"2A",X"10",X"0D",X"20",X"6D",X"C2",X"A9", + X"01",X"85",X"20",X"4C",X"75",X"C0",X"85",X"F7",X"EA",X"A5",X"29",X"10",X"09",X"20",X"95",X"C2", + X"20",X"A3",X"C8",X"85",X"F7",X"6E",X"20",X"03",X"C3",X"A9",X"01",X"85",X"1F",X"C1",X"20",X"CD", + X"03",X"40",X"29",X"40",X"F0",X"0D",X"A9",X"00",X"8D",X"05",X"50",X"A9",X"01",X"8D",X"02",X"40", + X"85",X"F7",X"EA",X"20",X"81",X"C2",X"4C",X"75",X"C0",X"4C",X"F1",X"C1",X"85",X"F7",X"6E",X"A5", + X"2A",X"25",X"29",X"30",X"3C",X"A5",X"29",X"10",X"0D",X"A9",X"01",X"85",X"20",X"08",X"81",X"C2", + X"4C",X"75",X"C0",X"85",X"F7",X"6E",X"A5",X"2A",X"10",X"09",X"20",X"AD",X"C2",X"20",X"A3",X"C8", + X"85",X"F7",X"EA",X"20",X"03",X"C3",X"A9",X"00",X"85",X"1F",X"A9",X"01",X"85",X"20",X"4D",X"FE", + X"8D",X"05",X"50",X"A9",X"00",X"8D",X"02",X"40",X"20",X"6D",X"C2",X"4C",X"75",X"C0",X"85",X"F7", + X"EA",X"20",X"C5",X"C2",X"20",X"A3",X"C8",X"A9",X"FE",X"8D",X"05",X"50",X"4D",X"00",X"8D",X"02", + X"40",X"A9",X"00",X"85",X"CB",X"A5",X"2D",X"85",X"CC",X"A5",X"2E",X"85",X"CD",X"A5",X"2F",X"85", + X"CE",X"20",X"F3",X"EF",X"20",X"A3",X"C8",X"AD",X"03",X"40",X"29",X"40",X"F0",X"0D",X"A9",X"00", + X"8D",X"05",X"50",X"A9",X"01",X"8D",X"02",X"40",X"85",X"F7",X"EA",X"A9",X"01",X"85",X"CB",X"A5", + X"30",X"85",X"CC",X"A5",X"31",X"85",X"CD",X"A5",X"32",X"85",X"CE",X"20",X"F3",X"EF",X"A2",X"00", + X"86",X"1B",X"A5",X"1D",X"05",X"1E",X"F0",X"05",X"E6",X"1A",X"85",X"F7",X"EA",X"4C",X"38",X"C0", + X"85",X"F7",X"EA",X"A2",X"E8",X"A0",X"C2",X"20",X"BC",X"C9",X"85",X"F5",X"EA",X"A9",X"03",X"20", + X"5D",X"EA",X"85",X"F5",X"EA",X"A2",X"1F",X"20",X"2C",X"CA",X"60",X"85",X"F7",X"EA",X"A2",X"D2", + X"A0",X"C2",X"20",X"BC",X"C9",X"A2",X"E8",X"A0",X"C2",X"20",X"BC",X"C9",X"4C",X"5D",X"C2",X"85", + X"F7",X"EA",X"A2",X"DD",X"A0",X"C2",X"20",X"BC",X"C9",X"A2",X"E8",X"A0",X"C2",X"20",X"BC",X"C9", + X"4C",X"5D",X"C2",X"85",X"F7",X"EA",X"E6",X"C8",X"A2",X"D2",X"A0",X"C2",X"20",X"BC",X"C9",X"E6", + X"C8",X"A2",X"F5",X"A0",X"C2",X"20",X"BC",X"C9",X"4C",X"65",X"C2",X"85",X"F7",X"EA",X"E6",X"C8", + X"A2",X"DD",X"A0",X"C2",X"20",X"BC",X"C9",X"E6",X"C8",X"A2",X"F5",X"A0",X"C2",X"20",X"BC",X"C9", + X"4C",X"65",X"C2",X"85",X"F7",X"EA",X"E6",X"C8",X"A2",X"F5",X"A0",X"C2",X"20",X"BC",X"C9",X"4C", + X"65",X"C2",X"CD",X"11",X"1A",X"16",X"0B",X"23",X"0F",X"1C",X"00",X"02",X"FF",X"CD",X"11",X"1A", + X"16",X"0B",X"23",X"0F",X"1C",X"00",X"03",X"FF",X"0C",X"12",X"11",X"0B",X"17",X"0F",X"00",X"1C", + X"0F",X"0B",X"0E",X"23",X"FF",X"0C",X"12",X"11",X"0B",X"17",X"0F",X"00",X"19",X"20",X"0F",X"1C", + X"FF",X"85",X"F7",X"EA",X"A0",X"00",X"85",X"F7",X"EA",X"B9",X"00",X"02",X"AA",X"B9",X"00",X"03", + X"99",X"00",X"02",X"8A",X"99",X"00",X"03",X"64",X"D0",X"EF",X"60",X"85",X"F6",X"6E",X"A9",X"00", + X"8D",X"05",X"50",X"85",X"25",X"C5",X"03",X"40",X"A9",X"80",X"85",X"27",X"C5",X"00",X"40",X"28", + X"85",X"F6",X"EA",X"85",X"F6",X"6E",X"A9",X"00",X"85",X"03",X"A9",X"10",X"85",X"04",X"4A",X"10", + X"85",X"F6",X"EA",X"A0",X"00",X"85",X"F6",X"6E",X"A9",X"00",X"91",X"03",X"64",X"D0",X"F9",X"E6", + X"04",X"CA",X"D0",X"EF",X"85",X"F6",X"6E",X"95",X"01",X"E8",X"E0",X"E1",X"D0",X"F9",X"A2",X"00", + X"85",X"F6",X"EA",X"9D",X"00",X"02",X"D5",X"00",X"03",X"E8",X"D0",X"F7",X"A9",X"02",X"85",X"35", + X"A9",X"80",X"85",X"34",X"4D",X"00",X"85",X"33",X"A2",X"23",X"85",X"F6",X"6E",X"BD",X"B3",X"C3", + X"95",X"36",X"CA",X"10",X"F8",X"85",X"F6",X"6E",X"A0",X"00",X"85",X"F6",X"6E",X"A2",X"00",X"85", + X"F6",X"EA",X"BD",X"A3",X"C3",X"99",X"00",X"0C",X"C8",X"E8",X"E0",X"10",X"D0",X"F4",X"C0",X"20", + X"D0",X"EB",X"60",X"FF",X"00",X"D0",X"C0",X"F8",X"C7",X"E1",X"D4",X"FF",X"52",X"07",X"3F",X"00", + X"F8",X"C0",X"38",X"00",X"80",X"02",X"00",X"01",X"01",X"00",X"94",X"00",X"50",X"65",X"00",X"50", + X"48",X"00",X"FF",X"FF",X"FF",X"15",X"0F",X"18",X"12",X"CD",X"13",X"11",X"19",X"18",X"12",X"CD", + X"15",X"15",X"CD",X"12",X"FF",X"FF",X"FF",X"85",X"F5",X"EA",X"20",X"A3",X"C8",X"20",X"E3",X"CB", + X"A2",X"0F",X"A0",X"CE",X"20",X"BC",X"C9",X"A2",X"29",X"A0",X"CE",X"20",X"BC",X"C9",X"A2",X"BE", + X"A0",X"CE",X"20",X"BC",X"C9",X"A6",X"5B",X"E8",X"8E",X"D5",X"12",X"A5",X"5A",X"29",X"F0",X"4A", + X"4A",X"4A",X"4A",X"AA",X"E8",X"8E",X"D6",X"12",X"A2",X"01",X"8E",X"D7",X"12",X"8E",X"D8",X"12", + X"8E",X"D9",X"12",X"60",X"85",X"F5",X"EA",X"20",X"A3",X"C8",X"20",X"E3",X"CB",X"A2",X"0F",X"A0", + X"CE",X"20",X"BC",X"C9",X"A2",X"EF",X"A0",X"CE",X"20",X"BC",X"C9",X"A9",X"C9",X"85",X"03",X"A9", + X"11",X"85",X"04",X"A2",X"12",X"85",X"F5",X"EA",X"A0",X"00",X"B5",X"36",X"91",X"03",X"C8",X"B5", + X"37",X"91",X"03",X"C8",X"B5",X"38",X"91",X"03",X"18",X"A5",X"03",X"69",X"40",X"85",X"03",X"A5", + X"04",X"69",X"00",X"85",X"04",X"E8",X"E8",X"E8",X"E0",X"21",X"90",X"DC",X"A2",X"03",X"20",X"4E", + X"C9",X"A2",X"04",X"20",X"4E",X"C9",X"A2",X"05",X"20",X"4E",X"C9",X"A2",X"06",X"20",X"4E",X"C9", + X"A2",X"07",X"20",X"4E",X"C9",X"60",X"85",X"F5",X"EA",X"A9",X"FF",X"85",X"19",X"85",X"F5",X"EA", + X"A9",X"01",X"85",X"1C",X"20",X"48",X"C7",X"20",X"67",X"C7",X"A0",X"01",X"84",X"68",X"C8",X"84", + X"69",X"C8",X"84",X"6A",X"A9",X"90",X"8D",X"02",X"18",X"A9",X"4D",X"8D",X"03",X"18",X"A9",X"60", + X"8D",X"06",X"18",X"A9",X"3D",X"8D",X"07",X"18",X"A9",X"30",X"8D",X"0A",X"18",X"A9",X"3D",X"8D", + X"0B",X"18",X"A9",X"40",X"85",X"A9",X"85",X"AA",X"85",X"AB",X"85",X"B0",X"A9",X"04",X"85",X"A8", + X"85",X"BA",X"A9",X"18",X"8D",X"1E",X"18",X"A9",X"1D",X"8D",X"1F",X"18",X"20",X"65",X"DD",X"85", + X"F5",X"EA",X"A2",X"01",X"20",X"2C",X"CA",X"E6",X"13",X"A2",X"07",X"20",X"C3",X"D3",X"F0",X"04", + X"60",X"85",X"F5",X"EA",X"A2",X"07",X"20",X"69",X"D2",X"20",X"98",X"D8",X"20",X"8D",X"EA",X"20", + X"90",X"E1",X"A5",X"19",X"D0",X"06",X"4C",X"D2",X"C4",X"85",X"F5",X"EA",X"A2",X"0F",X"A0",X"C5", + X"20",X"BC",X"C9",X"A2",X"FF",X"20",X"2C",X"CA",X"A9",X"00",X"85",X"19",X"A4",X"80",X"C4",X"86", + X"11",X"3B",X"40",X"60",X"36",X"3D",X"42",X"00",X"32",X"3D",X"35",X"61",X"62",X"FE",X"86",X"15", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"CE",X"10",X"3B", + X"40",X"60",X"3E",X"37",X"31",X"39",X"3A",X"33",X"61",X"62",X"FE",X"CE",X"14",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"56",X"11",X"3B",X"40",X"60",X"33",X"35", + X"35",X"61",X"62",X"FE",X"56",X"15",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"85", + X"F5",X"EA",X"20",X"48",X"C7",X"20",X"67",X"C7",X"A0",X"01",X"84",X"68",X"C0",X"69",X"64",X"84", + X"6A",X"84",X"6B",X"C8",X"84",X"6C",X"C0",X"6D",X"A9",X"1D",X"8D",X"03",X"18",X"C5",X"07",X"18", + X"8D",X"0B",X"18",X"8D",X"0F",X"18",X"C5",X"13",X"18",X"8D",X"17",X"18",X"C5",X"1F",X"18",X"4D", + X"40",X"85",X"A9",X"85",X"AA",X"C1",X"AB",X"C1",X"AC",X"85",X"AD",X"85",X"AE",X"4D",X"89",X"8D", + X"02",X"18",X"A9",X"59",X"8D",X"06",X"18",X"4D",X"60",X"8D",X"0A",X"18",X"4D",X"90",X"8D",X"0E", + X"18",X"A9",X"97",X"8D",X"12",X"18",X"4D",X"30",X"8D",X"16",X"18",X"A9",X"18",X"8D",X"1E",X"18", + X"A9",X"01",X"85",X"13",X"C1",X"14",X"08",X"65",X"DD",X"85",X"F5",X"EA",X"A2",X"01",X"20",X"2C", + X"CA",X"E6",X"13",X"D0",X"03",X"E6",X"14",X"6E",X"A2",X"07",X"20",X"C3",X"D3",X"F0",X"1B",X"A5", + X"14",X"C9",X"04",X"90",X"3C",X"A2",X"30",X"A0",X"C6",X"20",X"BC",X"C9",X"A2",X"FF",X"20",X"2C", + X"CA",X"A2",X"40",X"20",X"2C",X"CA",X"60",X"85",X"F5",X"EA",X"A5",X"6E",X"10",X"23",X"A2",X"07", + X"20",X"69",X"D2",X"AD",X"1E",X"18",X"C9",X"22",X"F0",X"0B",X"C9",X"4A",X"F0",X"07",X"C9",X"82", + X"D0",X"0F",X"85",X"F5",X"EA",X"20",X"AD",X"D1",X"EE",X"1E",X"18",X"EE",X"1E",X"18",X"85",X"F5", + X"EA",X"20",X"96",X"D7",X"20",X"98",X"D8",X"20",X"DF",X"E6",X"20",X"90",X"E1",X"4C",X"CC",X"C5", + X"C7",X"10",X"32",X"3D",X"3C",X"64",X"42",X"00",X"45",X"2F",X"41",X"42",X"33",X"00",X"3E",X"33", + X"3E",X"3E",X"33",X"40",X"41",X"FE",X"C7",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"04",X"11",X"47",X"3D", + X"43",X"00",X"41",X"42",X"2F",X"40",X"42",X"00",X"45",X"37",X"42",X"36",X"00",X"3D",X"3C",X"3A", + X"47",X"00",X"34",X"37",X"44",X"33",X"FE",X"04",X"15",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"FE",X"42",X"11",X"33",X"2F",X"40",X"3C",X"00",X"33",X"46",X"42",X"40",X"2F",X"00",X"3E", + X"33",X"3E",X"3E",X"33",X"40",X"41",X"00",X"63",X"00",X"30",X"3D",X"3C",X"43",X"41",X"33",X"41", + X"FE",X"42",X"15",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE", + X"83",X"11",X"31",X"3A",X"2F",X"37",X"3B",X"00",X"31",X"3D",X"3C",X"33",X"41",X"4A",X"31",X"3D", + X"34",X"34",X"33",X"33",X"41",X"00",X"63",X"00",X"34",X"40",X"37",X"33",X"41",X"FE",X"83",X"15", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"85",X"F5",X"6E",X"AD",X"04", + X"40",X"49",X"FF",X"A8",X"A2",X"02",X"29",X"01",X"F0",X"05",X"A2",X"04",X"85",X"F5",X"6E",X"86", + X"29",X"86",X"2A",X"98",X"4A",X"29",X"03",X"AA",X"BD",X"3E",X"C7",X"85",X"5A",X"C1",X"5C",X"C1", + X"5E",X"BD",X"42",X"C7",X"85",X"5B",X"C1",X"5D",X"85",X"5F",X"20",X"C3",X"EB",X"60",X"00",X"50", + X"00",X"00",X"01",X"01",X"02",X"03",X"85",X"F7",X"EA",X"A9",X"01",X"85",X"61",X"C1",X"62",X"4D", + X"04",X"20",X"5D",X"EA",X"A9",X"00",X"85",X"65",X"85",X"66",X"85",X"1F",X"08",X"0F",X"CC",X"20", + X"03",X"C3",X"C6",X"61",X"28",X"85",X"F5",X"6E",X"20",X"A3",X"C8",X"A5",X"20",X"D0",X"2C",X"A9", + X"04",X"20",X"5D",X"EA",X"AD",X"04",X"40",X"29",X"10",X"D0",X"12",X"A5",X"1B",X"F0",X"0E",X"A6", + X"1F",X"B5",X"2B",X"18",X"F8",X"69",X"01",X"95",X"2B",X"D8",X"85",X"F6",X"6E",X"A6",X"1F",X"F6", + X"61",X"A9",X"00",X"95",X"65",X"08",X"0F",X"CC",X"85",X"F5",X"EA",X"A9",X"00",X"85",X"20",X"08", + X"64",X"CC",X"A6",X"1F",X"B4",X"61",X"88",X"85",X"F5",X"EA",X"C0",X"06",X"90",X"0B",X"98",X"38", + X"E9",X"06",X"A8",X"4C",X"AA",X"C7",X"85",X"F5",X"EA",X"84",X"63",X"B4",X"61",X"88",X"C0",X"06", + X"90",X"05",X"A0",X"05",X"85",X"F5",X"6E",X"84",X"64",X"A4",X"63",X"B9",X"EF",X"CD",X"8D",X"1C", + X"18",X"B9",X"F7",X"CD",X"8D",X"1D",X"18",X"5D",X"FF",X"CD",X"8D",X"1E",X"18",X"5D",X"07",X"CE", + X"8D",X"1F",X"18",X"A2",X"07",X"A9",X"FF",X"85",X"F5",X"EA",X"95",X"68",X"66",X"10",X"FB",X"A2", + X"07",X"A9",X"01",X"85",X"F5",X"6E",X"95",X"99",X"CA",X"10",X"FB",X"A2",X"07",X"A9",X"04",X"85", + X"F5",X"EA",X"95",X"A1",X"CA",X"10",X"FB",X"A2",X"07",X"A9",X"00",X"85",X"F5",X"EA",X"95",X"A9", + X"CA",X"10",X"FB",X"85",X"6F",X"A9",X"03",X"85",X"A8",X"A9",X"00",X"85",X"C5",X"85",X"C4",X"20", + X"89",X"DA",X"20",X"C6",X"C8",X"A5",X"21",X"F0",X"0B",X"A5",X"1F",X"49",X"01",X"AA",X"20",X"4E", + X"C9",X"85",X"F5",X"EA",X"A6",X"1F",X"20",X"4E",X"C9",X"A2",X"02",X"20",X"4E",X"C9",X"20",X"54", + X"CA",X"20",X"94",X"CA",X"A6",X"1F",X"20",X"C4",X"CA",X"20",X"1E",X"CB",X"A9",X"3E",X"85",X"13", + X"A5",X"1B",X"F0",X"04",X"60",X"85",X"F5",X"EA",X"A9",X"01",X"85",X"68",X"A9",X"02",X"85",X"69", + X"A9",X"03",X"85",X"6A",X"A9",X"90",X"8D",X"02",X"18",X"A9",X"4D",X"8D",X"03",X"18",X"A9",X"60", + X"8D",X"06",X"18",X"A9",X"3D",X"8D",X"07",X"18",X"A9",X"30",X"8D",X"0A",X"18",X"A9",X"3D",X"8D", + X"0B",X"18",X"A9",X"80",X"85",X"A9",X"85",X"AA",X"85",X"AB",X"A9",X"40",X"85",X"B0",X"A9",X"18", + X"8D",X"1E",X"18",X"A9",X"1D",X"8D",X"1F",X"18",X"A9",X"FF",X"85",X"A1",X"85",X"A2",X"85",X"A3", + X"60",X"85",X"F6",X"EA",X"A0",X"00",X"84",X"03",X"A9",X"10",X"85",X"04",X"85",X"F6",X"EA",X"A9", + X"00",X"91",X"03",X"C8",X"D0",X"F9",X"E6",X"04",X"A5",X"04",X"C9",X"18",X"D0",X"F1",X"A2",X"01", + X"20",X"2C",X"CA",X"60",X"85",X"F5",X"EA",X"A2",X"35",X"A0",X"C9",X"20",X"BC",X"C9",X"A2",X"29", + X"A0",X"C9",X"20",X"BC",X"C9",X"A5",X"21",X"F0",X"0A",X"A2",X"40",X"A0",X"C9",X"20",X"BC",X"C9", + X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"A5",X"21",X"F0",X"3D",X"A5",X"13",X"29",X"3F",X"D0", + X"1A",X"A5",X"1F",X"D0",X"0B",X"A2",X"2F",X"A0",X"C9",X"20",X"BC",X"C9",X"60",X"85",X"F5",X"EA", + X"A2",X"46",X"A0",X"C9",X"20",X"BC",X"C9",X"60",X"85",X"F5",X"EA",X"C9",X"0F",X"D0",X"19",X"A5", + X"1F",X"D0",X"0B",X"A2",X"29",X"A0",X"C9",X"20",X"BC",X"C9",X"60",X"85",X"F5",X"6E",X"A2",X"40", + X"A0",X"C9",X"20",X"BC",X"C9",X"85",X"F5",X"6E",X"60",X"24",X"10",X"26",X"43",X"3E",X"FF",X"24", + X"10",X"00",X"00",X"00",X"FF",X"29",X"10",X"36",X"37",X"49",X"41",X"31",X"3D",X"40",X"33",X"FF", + X"34",X"10",X"27",X"43",X"3E",X"FF",X"34",X"10",X"00",X"00",X"00",X"FF",X"85",X"F5",X"6E",X"86", + X"03",X"8A",X"0A",X"A8",X"18",X"65",X"03",X"AA",X"85",X"F5",X"EA",X"B9",X"A0",X"C9",X"85",X"03", + X"B9",X"A1",X"C9",X"85",X"04",X"48",X"05",X"85",X"F5",X"EA",X"B5",X"2D",X"29",X"0F",X"85",X"05", + X"E6",X"05",X"A5",X"05",X"91",X"03",X"44",X"B5",X"2D",X"4A",X"4A",X"4A",X"4A",X"85",X"05",X"EA", + X"05",X"A5",X"05",X"91",X"03",X"6C",X"88",X"10",X"E1",X"C8",X"85",X"F5",X"6E",X"B1",X"03",X"C9", + X"01",X"D0",X"0C",X"A9",X"00",X"91",X"03",X"64",X"C0",X"05",X"D0",X"F1",X"85",X"F5",X"6E",X"60", + X"42",X"10",X"52",X"10",X"4A",X"10",X"CD",X"11",X"0D",X"12",X"4D",X"12",X"8D",X"12",X"CD",X"12", + X"92",X"12",X"D2",X"12",X"12",X"13",X"52",X"13",X"92",X"13",X"85",X"F6",X"6E",X"86",X"03",X"C0", + X"04",X"85",X"F6",X"EA",X"A0",X"00",X"84",X"08",X"B1",X"03",X"85",X"05",X"64",X"B1",X"03",X"85", + X"06",X"85",X"F6",X"EA",X"C8",X"B1",X"03",X"C9",X"FF",X"F0",X"4A",X"C9",X"FE",X"F0",X"1D",X"C9", + X"FD",X"F0",X"2C",X"84",X"07",X"C8",X"08",X"91",X"05",X"E6",X"08",X"A4",X"07",X"A5",X"C8",X"F0", + X"E3",X"A2",X"0A",X"20",X"2C",X"CA",X"4C",X"D4",X"C9",X"85",X"F6",X"EA",X"C8",X"18",X"98",X"65", + X"03",X"85",X"03",X"A5",X"04",X"69",X"00",X"85",X"04",X"4C",X"C4",X"C9",X"85",X"F6",X"EA",X"18", + X"A5",X"05",X"69",X"20",X"85",X"05",X"A5",X"06",X"69",X"00",X"85",X"06",X"A9",X"00",X"85",X"08", + X"F0",X"B2",X"85",X"F6",X"EA",X"A9",X"00",X"85",X"C8",X"60",X"85",X"F6",X"EA",X"AD",X"03",X"40", + X"10",X"FB",X"58",X"EA",X"EA",X"EA",X"EA",X"78",X"20",X"45",X"D0",X"A5",X"1A",X"F0",X"0A",X"8A", + X"48",X"20",X"6E",X"D0",X"68",X"AA",X"85",X"F6",X"EA",X"AD",X"03",X"40",X"30",X"FB",X"CA",X"D0", + X"DC",X"60",X"85",X"F5",X"EA",X"A6",X"1F",X"38",X"A9",X"5C",X"F5",X"29",X"85",X"F3",X"A9",X"18", + X"85",X"F4",X"B5",X"29",X"C9",X"09",X"B0",X"16",X"A0",X"10",X"A9",X"00",X"99",X"4C",X"18",X"88", + X"D0",X"FA",X"B4",X"29",X"F0",X"07",X"A9",X"C8",X"91",X"F3",X"88",X"D0",X"FB",X"60",X"A0",X"09", + X"A9",X"53",X"85",X"F3",X"4C",X"76",X"CA",X"F6",X"EA",X"91",X"F3",X"88",X"D0",X"FB",X"85",X"F7", + X"EA",X"60",X"85",X"F5",X"EA",X"98",X"48",X"A0",X"51",X"8C",X"3A",X"10",X"C8",X"8C",X"3B",X"10", + X"C8",X"8C",X"3C",X"10",X"A6",X"1F",X"B5",X"2B",X"4A",X"4A",X"4A",X"4A",X"A8",X"F0",X"04",X"C8", + X"85",X"F5",X"EA",X"8C",X"5B",X"10",X"B5",X"2B",X"29",X"0F",X"A8",X"C8",X"8C",X"5C",X"10",X"68", + X"A8",X"60",X"85",X"F5",X"EA",X"B5",X"61",X"85",X"03",X"AD",X"1A",X"CB",X"85",X"04",X"AD",X"1B", + X"CB",X"85",X"05",X"A9",X"04",X"85",X"06",X"A0",X"80",X"85",X"F5",X"EA",X"A6",X"03",X"E0",X"0A", + X"90",X"0D",X"A5",X"03",X"E9",X"0A",X"85",X"03",X"A9",X"C6",X"D0",X"1F",X"85",X"F5",X"EA",X"E0", + X"05",X"90",X"0D",X"A5",X"03",X"E9",X"05",X"85",X"03",X"A9",X"C5",X"D0",X"0E",X"85",X"F5",X"EA", + X"E0",X"01",X"90",X"15",X"C6",X"03",X"4D",X"C4",X"85",X"F5",X"EA",X"91",X"04",X"54",X"38",X"E9", + X"20",X"A8",X"C6",X"06",X"10",X"C6",X"85",X"F5",X"EA",X"60",X"1D",X"13",X"85",X"F5",X"6E",X"20", + X"E3",X"CB",X"A5",X"63",X"0A",X"A8",X"B9",X"D7",X"CD",X"85",X"03",X"B9",X"D8",X"CD",X"85",X"04", + X"A9",X"10",X"85",X"05",X"4D",X"04",X"85",X"06",X"A2",X"68",X"A0",X"00",X"85",X"F5",X"6E",X"B1", + X"03",X"29",X"F0",X"11",X"05",X"91",X"05",X"EA",X"05",X"B1",X"03",X"0A",X"0A",X"0A",X"0A",X"11", + X"05",X"91",X"05",X"E6",X"05",X"EA",X"03",X"70",X"05",X"E6",X"04",X"85",X"F5",X"6E",X"CA",X"A5", + X"05",X"29",X"07",X"D0",X"DA",X"18",X"A5",X"05",X"69",X"7F",X"85",X"05",X"C9",X"06",X"69",X"00", + X"85",X"06",X"85",X"F5",X"6E",X"B1",X"03",X"29",X"F0",X"11",X"05",X"91",X"05",X"E2",X"05",X"59", + X"03",X"0A",X"0A",X"0A",X"0A",X"11",X"05",X"91",X"05",X"C6",X"05",X"E6",X"03",X"70",X"05",X"E6", + X"04",X"85",X"F5",X"EA",X"CA",X"A5",X"05",X"29",X"07",X"C9",X"07",X"D0",X"D8",X"38",X"A5",X"05", + X"E9",X"77",X"85",X"05",X"C9",X"06",X"E9",X"00",X"85",X"06",X"E0",X"00",X"D0",X"91",X"A5",X"63", + X"29",X"0F",X"85",X"F3",X"46",X"48",X"CD",X"03",X"40",X"29",X"40",X"F0",X"07",X"A5",X"1F",X"D0", + X"13",X"85",X"F5",X"EA",X"A6",X"F3",X"BD",X"D9",X"CB",X"09",X"10",X"8D",X"04",X"40",X"2C",X"AA", + X"60",X"85",X"F5",X"EA",X"A5",X"F3",X"4C",X"C9",X"CB",X"03",X"00",X"01",X"02",X"07",X"04",X"05", + X"06",X"85",X"F5",X"EA",X"A0",X"00",X"A9",X"04",X"85",X"04",X"A9",X"00",X"85",X"03",X"C1",X"F5", + X"EA",X"B1",X"03",X"29",X"0F",X"91",X"03",X"64",X"D0",X"F7",X"E6",X"04",X"CA",X"04",X"E0",X"08", + X"D0",X"EF",X"A9",X"00",X"8D",X"04",X"40",X"A2",X"01",X"20",X"2C",X"CA",X"60",X"85",X"F5",X"EA", + X"A6",X"1F",X"B4",X"61",X"88",X"85",X"F5",X"EA",X"C0",X"06",X"90",X"0B",X"98",X"38",X"E9",X"06", + X"A8",X"4C",X"18",X"CC",X"85",X"F5",X"EA",X"98",X"0A",X"A8",X"B9",X"E3",X"CD",X"85",X"03",X"B9", + X"E4",X"CD",X"85",X"04",X"A0",X"00",X"A2",X"00",X"85",X"F5",X"EA",X"B1",X"03",X"C9",X"FF",X"F0", + X"18",X"9D",X"02",X"02",X"C8",X"E8",X"8A",X"29",X"03",X"C9",X"03",X"D0",X"EE",X"E8",X"A9",X"00", + X"9D",X"02",X"02",X"4C",X"3B",X"CC",X"85",X"F5",X"EA",X"A9",X"00",X"9D",X"02",X"02",X"E8",X"D0", + X"F8",X"60",X"85",X"F7",X"EA",X"A9",X"02",X"85",X"0B",X"A9",X"02",X"85",X"0C",X"A9",X"00",X"85", + X"0D",X"85",X"F7",X"EA",X"A4",X"0D",X"B1",X"0B",X"F0",X"1C",X"85",X"03",X"C8",X"B1",X"0B",X"85", + X"04",X"C8",X"B1",X"0B",X"85",X"05",X"20",X"99",X"CC",X"A5",X"0D",X"18",X"69",X"04",X"85",X"0D", + X"4C",X"74",X"CC",X"85",X"F7",X"EA",X"60",X"85",X"F5",X"EA",X"A9",X"00",X"85",X"0E",X"F0",X"12", + X"85",X"F5",X"EA",X"A9",X"00",X"85",X"0E",X"A5",X"05",X"29",X"F8",X"D0",X"05",X"E6",X"0E",X"85", + X"F5",X"EA",X"98",X"48",X"A5",X"03",X"29",X"0F",X"0A",X"AA",X"BD",X"B7",X"CD",X"85",X"07",X"A5", + X"05",X"29",X"07",X"0A",X"0A",X"18",X"65",X"07",X"85",X"07",X"BD",X"B8",X"CD",X"85",X"08",X"A5", + X"04",X"49",X"FF",X"85",X"04",X"46",X"04",X"46",X"04",X"46",X"04",X"A9",X"00",X"85",X"06",X"A5", + X"05",X"29",X"F8",X"85",X"05",X"06",X"05",X"26",X"06",X"06",X"05",X"26",X"06",X"18",X"A5",X"05", + X"65",X"04",X"85",X"05",X"A5",X"06",X"69",X"10",X"85",X"06",X"A5",X"03",X"29",X"0F",X"C9",X"0F", + X"F0",X"35",X"A0",X"00",X"A5",X"07",X"AA",X"20",X"95",X"CD",X"A4",X"0E",X"D0",X"0C",X"A0",X"20", + X"18",X"69",X"1D",X"AA",X"20",X"95",X"CD",X"85",X"F5",X"EA",X"18",X"A5",X"06",X"69",X"04",X"85", + X"06",X"A0",X"00",X"A5",X"08",X"20",X"AA",X"CD",X"A4",X"0E",X"D0",X"64",X"A0",X"20",X"20",X"AA", + X"CD",X"4C",X"90",X"CD",X"85",X"F5",X"6E",X"38",X"A5",X"05",X"E9",X"21",X"85",X"05",X"C9",X"06", + X"E9",X"00",X"85",X"06",X"48",X"00",X"A5",X"07",X"91",X"05",X"AA",X"E8",X"E8",X"8A",X"A0",X"05", + X"91",X"05",X"E6",X"07",X"C9",X"07",X"A0",X"21",X"91",X"05",X"C8",X"91",X"05",X"64",X"91",X"05", + X"C8",X"91",X"05",X"18",X"A5",X"06",X"69",X"04",X"85",X"06",X"A0",X"21",X"A9",X"00",X"91",X"05", + X"C8",X"91",X"05",X"C8",X"91",X"05",X"64",X"91",X"05",X"38",X"A5",X"06",X"E9",X"04",X"85",X"06", + X"18",X"A5",X"05",X"69",X"21",X"85",X"05",X"C9",X"06",X"69",X"00",X"85",X"06",X"C1",X"F5",X"6E", + X"68",X"A8",X"60",X"85",X"F7",X"6E",X"91",X"05",X"C8",X"E8",X"8A",X"91",X"05",X"64",X"E8",X"8A", + X"91",X"05",X"C8",X"E8",X"8A",X"91",X"05",X"28",X"85",X"F7",X"EA",X"91",X"05",X"64",X"91",X"05", + X"C8",X"91",X"05",X"C8",X"91",X"05",X"28",X"00",X"00",X"00",X"02",X"40",X"02",X"80",X"02",X"C0", + X"02",X"00",X"03",X"40",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C9",X"00",X"81",X"ED",X"51",X"EE",X"B9",X"EE",X"21",X"EF",X"E9", + X"ED",X"89",X"EF",X"D7",X"EB",X"4B",X"EC",X"88",X"EC",X"D1",X"EC",X"14",X"EC",X"3E",X"ED",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"47",X"47",X"47",X"47",X"47",X"47",X"47",X"47",X"78", + X"78",X"78",X"78",X"48",X"78",X"78",X"78",X"AD",X"BD",X"CD",X"8D",X"CD",X"AD",X"AD",X"AD",X"AA", + X"10",X"30",X"43",X"40",X"35",X"33",X"40",X"00",X"42",X"37",X"3B",X"33",X"FE",X"EB",X"10",X"4D", + X"4E",X"4F",X"50",X"00",X"26",X"2E",X"2D",X"27",X"FF",X"2C",X"11",X"CC",X"1D",X"0D",X"19",X"1C", + X"0F",X"CC",X"FE",X"65",X"11",X"00",X"01",X"02",X"03",X"00",X"00",X"40",X"41",X"42",X"43",X"00", + X"00",X"80",X"81",X"82",X"83",X"FE",X"65",X"15",X"02",X"02",X"02",X"02",X"00",X"00",X"03",X"03", + X"03",X"03",X"00",X"00",X"02",X"02",X"02",X"02",X"FE",X"A5",X"11",X"C0",X"C1",X"C2",X"C3",X"00", + X"00",X"00",X"01",X"02",X"03",X"00",X"00",X"40",X"41",X"42",X"43",X"FE",X"A5",X"15",X"02",X"02", + X"02",X"02",X"00",X"00",X"03",X"03",X"03",X"03",X"00",X"00",X"02",X"02",X"02",X"02",X"FE",X"E5", + X"11",X"BC",X"BD",X"00",X"00",X"C0",X"C1",X"00",X"00",X"B8",X"B9",X"FE",X"05",X"12",X"BE",X"BF", + X"00",X"00",X"C2",X"C3",X"00",X"00",X"BA",X"BB",X"FE",X"25",X"12",X"DC",X"DD",X"00",X"00",X"E0", + X"E1",X"00",X"00",X"B4",X"B5",X"FE",X"96",X"11",X"06",X"01",X"00",X"1A",X"1E",X"1D",X"FE",X"10", + X"12",X"CC",X"0C",X"19",X"18",X"1F",X"1D",X"00",X"02",X"00",X"51",X"52",X"53",X"FF",X"C3",X"12", + X"0C",X"19",X"18",X"1F",X"1D",X"00",X"00",X"00",X"10",X"19",X"1C",X"00",X"0F",X"20",X"0F",X"1C", + X"23",X"00",X"00",X"00",X"00",X"00",X"00",X"1A",X"1E",X"1D",X"FE",X"A8",X"12",X"1C",X"1D",X"FE", + X"C8",X"12",X"1E",X"1F",X"FE",X"A8",X"16",X"01",X"01",X"FE",X"C8",X"16",X"01",X"01",X"FF",X"67", + X"11",X"0C",X"0F",X"1D",X"1E",X"00",X"10",X"13",X"20",X"0F",X"00",X"1A",X"16",X"0B",X"23",X"0F", + X"1C",X"1D",X"FE",X"C7",X"11",X"02",X"FE",X"D4",X"11",X"1A",X"1E",X"1D",X"FE",X"07",X"12",X"03", + X"FE",X"14",X"12",X"1A",X"1E",X"1D",X"FE",X"47",X"12",X"04",X"FE",X"54",X"12",X"1A",X"1E",X"1D", + X"FE",X"87",X"12",X"05",X"FE",X"94",X"12",X"1A",X"1E",X"1D",X"FE",X"C7",X"12",X"06",X"FE",X"D4", + X"12",X"1A",X"1E",X"1D",X"FF",X"68",X"4C",X"00",X"B0",X"85",X"F5",X"EA",X"48",X"CD",X"03",X"40", + X"29",X"10",X"F0",X"F1",X"8A",X"48",X"54",X"48",X"EA",X"D8",X"A5",X"01",X"F0",X"40",X"AD",X"04", + X"40",X"49",X"FF",X"29",X"E0",X"85",X"02",X"26",X"4A",X"4A",X"4A",X"4A",X"A8",X"20",X"34",X"D0", + X"AD",X"02",X"40",X"29",X"C0",X"F0",X"27",X"85",X"26",X"20",X"34",X"D0",X"AD",X"02",X"40",X"25", + X"26",X"F0",X"1B",X"20",X"34",X"D0",X"AD",X"02",X"40",X"25",X"26",X"F0",X"11",X"20",X"34",X"D0", + X"AD",X"02",X"40",X"25",X"26",X"F0",X"07",X"A9",X"01",X"85",X"F9",X"85",X"F6",X"6E",X"8D",X"00", + X"40",X"68",X"A8",X"68",X"AA",X"68",X"40",X"85",X"F6",X"EA",X"E6",X"1E",X"4D",X"1B",X"8D",X"03", + X"40",X"A5",X"02",X"C9",X"80",X"F0",X"31",X"A2",X"00",X"AD",X"03",X"40",X"49",X"FF",X"29",X"0F", + X"06",X"26",X"90",X"05",X"4A",X"4A",X"85",X"F5",X"EA",X"29",X"03",X"F0",X"46",X"E8",X"C9",X"01", + X"F0",X"41",X"E8",X"C9",X"02",X"F0",X"31",X"E8",X"85",X"F5",X"EA",X"A5",X"1E",X"C9",X"02",X"B0", + X"1F",X"85",X"F5",X"EA",X"60",X"85",X"F5",X"6E",X"A2",X"05",X"A5",X"26",X"C9",X"80",X"F0",X"23", + X"E8",X"C9",X"40",X"F0",X"1E",X"E8",X"C9",X"C0",X"F0",X"19",X"4C",X"D4",X"CF",X"85",X"F5",X"6E", + X"C6",X"1E",X"4C",X"03",X"D0",X"85",X"F5",X"6E",X"A5",X"02",X"C9",X"60",X"D0",X"05",X"A2",X"04", + X"85",X"F5",X"EA",X"A5",X"1D",X"F8",X"18",X"7D",X"5C",X"D0",X"D9",X"64",X"D0",X"90",X"06",X"B9", + X"64",X"D0",X"85",X"F5",X"EA",X"85",X"1D",X"D8",X"C6",X"1E",X"A5",X"1B",X"D0",X"11",X"8D",X"00", + X"40",X"A9",X"01",X"85",X"1A",X"A2",X"FF",X"9A",X"EA",X"4C",X"38",X"C0",X"85",X"F6",X"EA",X"4C", + X"D4",X"CF",X"85",X"F5",X"EA",X"A2",X"E7",X"85",X"F5",X"EA",X"A5",X"FF",X"A5",X"FF",X"EA",X"CA", + X"D0",X"F8",X"60",X"85",X"F6",X"EA",X"A5",X"F9",X"F0",X"11",X"AD",X"02",X"40",X"29",X"C0",X"D0", + X"0A",X"A9",X"00",X"85",X"F9",X"20",X"99",X"CF",X"85",X"F6",X"EA",X"60",X"01",X"02",X"03",X"01", + X"06",X"08",X"03",X"01",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"85",X"F5",X"EA",X"A5", + X"1A",X"F0",X"1E",X"A5",X"1C",X"D0",X"09",X"20",X"11",X"D1",X"20",X"3F",X"D1",X"85",X"F5",X"EA", + X"AD",X"02",X"40",X"29",X"01",X"F0",X"0E",X"AD",X"02",X"40",X"29",X"02",X"F0",X"32",X"85",X"F5", + X"EA",X"60",X"85",X"F5",X"EA",X"20",X"6E",X"D1",X"A9",X"00",X"85",X"21",X"85",X"20",X"85",X"1C", + X"A9",X"01",X"85",X"1B",X"A9",X"00",X"85",X"1A",X"20",X"A3",X"C8",X"20",X"E3",X"CB",X"A2",X"E8", + X"A0",X"C2",X"20",X"BC",X"C9",X"A2",X"1F",X"20",X"2C",X"CA",X"4C",X"FD",X"D0",X"85",X"F5",X"EA", + X"A5",X"1D",X"C9",X"02",X"B0",X"03",X"4C",X"91",X"D0",X"20",X"6E",X"D1",X"20",X"6E",X"D1",X"A9", + X"01",X"85",X"21",X"A9",X"00",X"85",X"20",X"85",X"1C",X"A9",X"01",X"85",X"1B",X"A9",X"00",X"85", + X"1A",X"20",X"A3",X"C8",X"20",X"E3",X"CB",X"A2",X"D2",X"A0",X"C2",X"20",X"BC",X"C9",X"A2",X"E8", + X"A0",X"C2",X"20",X"BC",X"C9",X"A2",X"1F",X"20",X"2C",X"CA",X"85",X"F5",X"EA",X"A2",X"05",X"A9", + X"00",X"85",X"F5",X"EA",X"95",X"2D",X"66",X"10",X"FB",X"A2",X"FF",X"9A",X"4C",X"68",X"C0",X"85", + X"F5",X"EA",X"AD",X"67",X"13",X"CD",X"55",X"D1",X"F0",X"3A",X"A0",X"00",X"85",X"F5",X"6E",X"B9", + X"55",X"D1",X"99",X"67",X"13",X"64",X"C0",X"11",X"D0",X"F5",X"85",X"F5",X"6E",X"A0",X"00",X"85", + X"F5",X"EA",X"B9",X"66",X"D1",X"99",X"AB",X"13",X"C8",X"C0",X"06",X"D0",X"F5",X"85",X"F5",X"6E", + X"A5",X"1D",X"4A",X"4A",X"4A",X"4A",X"AA",X"E8",X"A5",X"1D",X"29",X"0F",X"AA",X"E8",X"8E",X"B3", + X"13",X"85",X"F5",X"EA",X"60",X"1A",X"1F",X"1D",X"12",X"00",X"1D",X"1E",X"0B",X"1C",X"1E",X"00", + X"0C",X"1F",X"1E",X"1E",X"19",X"18",X"0D",X"1C",X"0F",X"0E",X"13",X"1E",X"85",X"F5",X"6E",X"F8", + X"38",X"A5",X"1D",X"E9",X"01",X"85",X"1D",X"74",X"60",X"85",X"F5",X"EA",X"A5",X"6F",X"10",X"04", + X"85",X"F5",X"EA",X"60",X"A5",X"1B",X"D0",X"03",X"4C",X"36",X"D2",X"A6",X"1F",X"A4",X"1F",X"AD", + X"03",X"40",X"29",X"40",X"D0",X"02",X"A0",X"00",X"B9",X"00",X"40",X"49",X"FF",X"29",X"10",X"F0", + X"40",X"A5",X"B9",X"D0",X"43",X"B5",X"2B",X"F0",X"2D",X"85",X"B9",X"85",X"F5",X"6E",X"A9",X"00", + X"85",X"6E",X"A9",X"05",X"85",X"A0",X"C9",X"BA",X"AA",X"18",X"BD",X"4D",X"D2",X"6D",X"1E",X"18", + X"8D",X"1A",X"18",X"18",X"BD",X"4E",X"D2",X"6D",X"1F",X"18",X"8D",X"1B",X"18",X"4D",X"0D",X"20", + X"5D",X"EA",X"60",X"85",X"F5",X"6E",X"A9",X"0E",X"20",X"5D",X"EA",X"4C",X"E8",X"D1",X"85",X"F5", + X"EA",X"A9",X"00",X"85",X"B9",X"C1",X"F5",X"6E",X"B9",X"00",X"40",X"49",X"FF",X"29",X"0F",X"A8", + X"B9",X"57",X"D2",X"A8",X"C5",X"BB",X"F0",X"09",X"0A",X"0A",X"0A",X"0A",X"85",X"B0",X"C1",X"F5", + X"EA",X"84",X"BB",X"98",X"F0",X"05",X"84",X"BA",X"85",X"F5",X"EA",X"A5",X"BB",X"F0",X"0A",X"A2", + X"07",X"20",X"C3",X"D3",X"D0",X"1C",X"85",X"F5",X"EA",X"A2",X"07",X"20",X"69",X"D2",X"A5",X"B0", + X"29",X"F0",X"F0",X"0E",X"A0",X"06",X"C9",X"60",X"B0",X"01",X"C8",X"98",X"20",X"5D",X"EA",X"85", + X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"A2",X"07",X"20",X"C3",X"D3",X"F0",X"0A",X"A9",X"47",X"8D", + X"1D",X"18",X"E6",X"C6",X"85",X"F5",X"EA",X"A2",X"07",X"20",X"69",X"D2",X"60",X"00",X"10",X"F0", + X"00",X"10",X"00",X"00",X"F0",X"00",X"10",X"00",X"02",X"04",X"00",X"06",X"00",X"00",X"00",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"85",X"F5",X"EA",X"B5",X"68",X"10",X"01",X"60",X"A5", + X"13",X"35",X"91",X"D0",X"01",X"60",X"D6",X"99",X"F0",X"01",X"60",X"B5",X"A1",X"95",X"99",X"B5", + X"A9",X"29",X"0F",X"85",X"03",X"B5",X"A9",X"4A",X"4A",X"4A",X"F0",X"0B",X"18",X"65",X"03",X"85", + X"03",X"4C",X"AC",X"D2",X"85",X"F5",X"EA",X"E0",X"07",X"D0",X"11",X"A0",X"00",X"A5",X"BA",X"C9", + X"06",X"D0",X"04",X"C8",X"85",X"F5",X"EA",X"84",X"03",X"85",X"F5",X"EA",X"8A",X"0A",X"0A",X"85", + X"09",X"B5",X"68",X"29",X"07",X"0A",X"A8",X"B9",X"4B",X"D3",X"85",X"05",X"B9",X"4C",X"D3",X"85", + X"06",X"A4",X"03",X"B1",X"05",X"C9",X"FF",X"F0",X"4B",X"A4",X"09",X"99",X"01",X"18",X"B5",X"A9", + X"4A",X"4A",X"4A",X"4A",X"29",X"02",X"09",X"01",X"99",X"00",X"18",X"B5",X"A9",X"29",X"F0",X"F0", + X"69",X"F6",X"A9",X"B5",X"A9",X"29",X"F3",X"95",X"A9",X"86",X"08",X"A4",X"09",X"4A",X"4A",X"4A", + X"4A",X"AA",X"18",X"BD",X"B7",X"D3",X"79",X"02",X"18",X"99",X"02",X"18",X"18",X"BD",X"B8",X"D3", + X"79",X"03",X"18",X"C9",X"1D",X"B0",X"02",X"A9",X"1D",X"99",X"03",X"18",X"CA",X"08",X"4C",X"4A", + X"D3",X"85",X"F5",X"EA",X"A4",X"09",X"B5",X"A9",X"30",X"0D",X"B9",X"03",X"18",X"85",X"0B",X"EA", + X"0B",X"4C",X"31",X"D3",X"85",X"F5",X"6E",X"B9",X"03",X"18",X"85",X"0B",X"E2",X"0B",X"C1",X"F5", + X"EA",X"A5",X"0B",X"99",X"03",X"18",X"C1",X"F5",X"EA",X"B5",X"A9",X"29",X"F0",X"F0",X"0B",X"F6", + X"A9",X"B5",X"A9",X"29",X"F3",X"95",X"A9",X"C1",X"F5",X"EA",X"60",X"5B",X"D3",X"6F",X"D3",X"83", + X"D3",X"97",X"D3",X"AE",X"D3",X"B1",X"D3",X"B4",X"D3",X"B7",X"D3",X"47",X"48",X"47",X"48",X"40", + X"41",X"42",X"41",X"40",X"41",X"42",X"41",X"45",X"FF",X"46",X"FF",X"43",X"FF",X"44",X"FF",X"00", + X"00",X"00",X"00",X"58",X"59",X"58",X"59",X"58",X"59",X"58",X"59",X"5C",X"FF",X"5D",X"FF",X"5A", + X"FF",X"5B",X"FF",X"00",X"00",X"00",X"00",X"64",X"65",X"64",X"65",X"64",X"65",X"64",X"65",X"68", + X"FF",X"69",X"FF",X"66",X"FF",X"67",X"FF",X"00",X"00",X"00",X"00",X"70",X"71",X"70",X"71",X"70", + X"71",X"70",X"71",X"74",X"FF",X"75",X"FF",X"72",X"FF",X"73",X"FF",X"85",X"F5",X"6E",X"85",X"F5", + X"EA",X"85",X"F5",X"EA",X"85",X"F5",X"6E",X"00",X"00",X"FE",X"00",X"02",X"00",X"00",X"FD",X"00", + X"03",X"85",X"F5",X"EA",X"B5",X"A9",X"4A",X"4A",X"4A",X"4A",X"A8",X"B9",X"E8",X"D3",X"85",X"05", + X"B9",X"E9",X"D3",X"85",X"06",X"46",X"0A",X"0A",X"A8",X"B9",X"02",X"18",X"85",X"03",X"5D",X"03", + X"18",X"85",X"04",X"E6",X"67",X"AC",X"05",X"00",X"F5",X"D3",X"FD",X"D3",X"2E",X"D4",X"5F",X"D4", + X"AD",X"D4",X"85",X"F5",X"6E",X"A9",X"00",X"85",X"67",X"60",X"85",X"F5",X"6E",X"A5",X"03",X"C9", + X"16",X"B0",X"0A",X"A9",X"17",X"99",X"02",X"18",X"D0",X"20",X"85",X"F5",X"EA",X"20",X"00",X"D5", + X"D0",X"18",X"20",X"88",X"D5",X"D0",X"13",X"A5",X"04",X"38",X"E9",X"01",X"29",X"F0",X"09",X"0D", + X"99",X"03",X"18",X"A9",X"00",X"85",X"67",X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"A5",X"03", + X"C9",X"D8",X"90",X"0A",X"A9",X"D8",X"99",X"02",X"18",X"D0",X"20",X"85",X"F5",X"EA",X"20",X"00", + X"D5",X"D0",X"18",X"20",X"AB",X"D5",X"D0",X"13",X"A5",X"04",X"38",X"E9",X"01",X"29",X"F0",X"09", + X"0D",X"99",X"03",X"18",X"A9",X"00",X"85",X"67",X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"A5", + X"04",X"C9",X"1D",X"B0",X"0A",X"A9",X"1D",X"99",X"03",X"18",X"D0",X"34",X"85",X"F5",X"EA",X"20", + X"23",X"D5",X"D0",X"2C",X"20",X"1E",X"D6",X"D0",X"27",X"8A",X"48",X"A5",X"08",X"29",X"F8",X"48", + X"AD",X"03",X"40",X"29",X"40",X"F0",X"1D",X"68",X"A6",X"1F",X"85",X"F5",X"EA",X"18",X"7D",X"FA", + X"D4",X"99",X"02",X"18",X"68",X"AA",X"85",X"F5",X"EA",X"A9",X"00",X"85",X"67",X"85",X"F5",X"EA", + X"60",X"85",X"F5",X"EA",X"68",X"A2",X"00",X"4C",X"8D",X"D4",X"85",X"F5",X"EA",X"A5",X"04",X"C9", + X"DD",X"90",X"0A",X"A9",X"DD",X"99",X"03",X"18",X"D0",X"36",X"85",X"F5",X"EA",X"A5",X"03",X"20", + X"23",X"D5",X"D0",X"2C",X"20",X"41",X"D6",X"D0",X"27",X"8A",X"48",X"A5",X"08",X"29",X"F8",X"48", + X"AD",X"03",X"40",X"29",X"40",X"F0",X"1D",X"68",X"A6",X"1F",X"85",X"F5",X"EA",X"18",X"7D",X"FA", + X"D4",X"99",X"02",X"18",X"68",X"AA",X"85",X"F5",X"EA",X"A9",X"00",X"85",X"67",X"85",X"F5",X"EA", + X"60",X"85",X"F5",X"EA",X"68",X"A2",X"00",X"4C",X"DD",X"D4",X"FF",X"01",X"FE",X"02",X"85",X"F5", + X"EA",X"A5",X"04",X"29",X"0F",X"F0",X"19",X"C9",X"0F",X"F0",X"15",X"C9",X"0E",X"F0",X"11",X"C9", + X"0D",X"F0",X"0D",X"C9",X"0C",X"F0",X"09",X"C9",X"0B",X"F0",X"05",X"C9",X"0A",X"85",X"F5",X"6E", + X"60",X"85",X"F5",X"EA",X"A5",X"03",X"85",X"08",X"AD",X"03",X"40",X"29",X"40",X"F0",X"0B",X"A5", + X"1F",X"F0",X"07",X"C6",X"08",X"E2",X"08",X"C1",X"F5",X"EA",X"E6",X"08",X"EA",X"08",X"EA",X"08", + X"A5",X"08",X"29",X"0F",X"C9",X"06",X"90",X"28",X"C9",X"08",X"90",X"39",X"C9",X"0E",X"B0",X"33", + X"85",X"F5",X"EA",X"A5",X"08",X"29",X"F0",X"C9",X"10",X"F0",X"2A",X"C9",X"40",X"F0",X"26",X"C9", + X"70",X"F0",X"22",X"C9",X"A0",X"F0",X"1E",X"C9",X"D0",X"F0",X"1A",X"D0",X"18",X"85",X"F5",X"6E", + X"A5",X"08",X"29",X"F0",X"C9",X"30",X"F0",X"0D",X"C9",X"60",X"F0",X"09",X"C9",X"90",X"F0",X"05", + X"C9",X"C0",X"85",X"F5",X"6E",X"60",X"85",X"F5",X"EA",X"A5",X"03",X"38",X"E9",X"08",X"4A",X"4A", + X"4A",X"4A",X"85",X"12",X"4D",X"0F",X"38",X"E5",X"12",X"85",X"12",X"A5",X"04",X"18",X"69",X"07", + X"29",X"F0",X"18",X"65",X"12",X"AA",X"4C",X"CC",X"D5",X"85",X"F5",X"EA",X"A5",X"03",X"18",X"69", + X"19",X"4A",X"4A",X"4A",X"4A",X"85",X"12",X"4D",X"0F",X"38",X"E5",X"12",X"85",X"12",X"C9",X"04", + X"18",X"69",X"07",X"29",X"F0",X"18",X"65",X"12",X"AA",X"85",X"F5",X"EA",X"BD",X"8E",X"D6",X"AA", + X"BD",X"00",X"04",X"4A",X"4A",X"4A",X"4A",X"C9",X"00",X"F0",X"3E",X"C9",X"05",X"F0",X"3A",X"C9", + X"06",X"F0",X"36",X"C9",X"07",X"F0",X"32",X"A5",X"03",X"18",X"69",X"05",X"4A",X"4A",X"4A",X"4A", + X"85",X"12",X"A9",X"0F",X"38",X"E5",X"12",X"85",X"12",X"A5",X"04",X"18",X"69",X"10",X"29",X"F0", + X"18",X"65",X"12",X"AA",X"BD",X"8E",X"D6",X"AA",X"BD",X"00",X"04",X"4A",X"4A",X"4A",X"4A",X"C9", + X"07",X"F0",X"06",X"A9",X"00",X"60",X"85",X"F5",X"EA",X"A9",X"FF",X"60",X"85",X"F5",X"EA",X"A5", + X"03",X"18",X"69",X"07",X"4A",X"4A",X"4A",X"4A",X"85",X"12",X"A9",X"0F",X"38",X"E5",X"12",X"85", + X"12",X"A5",X"04",X"18",X"69",X"11",X"29",X"F0",X"18",X"65",X"12",X"AA",X"4C",X"62",X"D6",X"85", + X"F5",X"EA",X"A5",X"03",X"18",X"69",X"07",X"4A",X"4A",X"4A",X"4A",X"85",X"12",X"A9",X"0F",X"38", + X"E5",X"12",X"85",X"12",X"A5",X"04",X"18",X"69",X"14",X"29",X"F0",X"18",X"65",X"12",X"AA",X"85", + X"F5",X"EA",X"BD",X"8E",X"D6",X"AA",X"BD",X"00",X"04",X"4A",X"4A",X"4A",X"4A",X"C9",X"00",X"F0", + X"1A",X"C9",X"01",X"F0",X"16",X"C9",X"02",X"F0",X"12",X"C9",X"09",X"F0",X"0E",X"C9",X"0A",X"F0", + X"0A",X"C9",X"0B",X"F0",X"06",X"A9",X"00",X"60",X"85",X"F5",X"EA",X"A9",X"FF",X"60",X"00",X"01", + X"02",X"03",X"04",X"05",X"06",X"07",X"87",X"86",X"85",X"84",X"83",X"82",X"81",X"80",X"08",X"09", + X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"8F",X"8E",X"8D",X"8C",X"8B",X"8A",X"89",X"88",X"10",X"11", + X"12",X"13",X"14",X"15",X"16",X"17",X"97",X"96",X"95",X"94",X"93",X"92",X"91",X"90",X"18",X"19", + X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"9F",X"9E",X"9D",X"9C",X"9B",X"9A",X"99",X"98",X"20",X"21", + X"22",X"23",X"24",X"25",X"26",X"27",X"A7",X"A6",X"A5",X"A4",X"A3",X"A2",X"A1",X"A0",X"28",X"29", + X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"AF",X"AE",X"AD",X"AC",X"AB",X"AA",X"A9",X"A8",X"30",X"31", + X"32",X"33",X"34",X"35",X"36",X"37",X"B7",X"B6",X"B5",X"B4",X"B3",X"B2",X"B1",X"B0",X"38",X"39", + X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"BF",X"BE",X"BD",X"BC",X"BB",X"BA",X"B9",X"B8",X"40",X"41", + X"42",X"43",X"44",X"45",X"46",X"47",X"C7",X"C6",X"C5",X"C4",X"C3",X"C2",X"C1",X"C0",X"48",X"49", + X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"CF",X"CE",X"CD",X"CC",X"CB",X"CA",X"C9",X"C8",X"50",X"51", + X"52",X"53",X"54",X"55",X"56",X"57",X"D7",X"D6",X"D5",X"D4",X"D3",X"D2",X"D1",X"D0",X"58",X"59", + X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"DF",X"DE",X"DD",X"DC",X"DB",X"DA",X"D9",X"D8",X"60",X"61", + X"62",X"63",X"64",X"65",X"66",X"67",X"E7",X"E6",X"E5",X"E4",X"E3",X"E2",X"E1",X"E0",X"68",X"69", + X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"EF",X"EE",X"ED",X"EC",X"EB",X"EA",X"E9",X"E8",X"70",X"71", + X"72",X"73",X"74",X"75",X"76",X"77",X"F7",X"F6",X"F5",X"F4",X"F3",X"F2",X"F1",X"F0",X"78",X"79", + X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"FF",X"FE",X"FD",X"FC",X"FB",X"FA",X"F9",X"F8",X"85",X"F6", + X"EA",X"4C",X"38",X"D8",X"85",X"F5",X"6E",X"A5",X"6E",X"C9",X"FF",X"D0",X"03",X"4C",X"63",X"D8", + X"20",X"72",X"E6",X"E6",X"6E",X"C9",X"6E",X"C9",X"01",X"F0",X"1A",X"C9",X"09",X"F0",X"4B",X"C9", + X"11",X"F0",X"66",X"C9",X"19",X"F0",X"DA",X"C9",X"22",X"F0",X"04",X"60",X"85",X"F6",X"6E",X"4C", + X"57",X"D8",X"85",X"F5",X"6E",X"A5",X"BA",X"4A",X"A8",X"B9",X"64",X"D8",X"8D",X"1C",X"18",X"5D", + X"6E",X"D8",X"8D",X"1D",X"18",X"5D",X"69",X"D8",X"8D",X"18",X"18",X"B9",X"82",X"D8",X"8D",X"19", + X"18",X"A6",X"1F",X"B5",X"2B",X"38",X"F8",X"E9",X"01",X"95",X"2B",X"D8",X"A5",X"1B",X"F0",X"06", + X"20",X"94",X"CA",X"85",X"F6",X"6E",X"60",X"85",X"F5",X"EA",X"A5",X"BA",X"4A",X"A8",X"AD",X"1D", + X"18",X"D9",X"6E",X"D8",X"D0",X"09",X"B9",X"73",X"D8",X"8D",X"1D",X"18",X"85",X"F6",X"EA",X"B9", + X"87",X"D8",X"8D",X"19",X"18",X"60",X"85",X"F5",X"EA",X"A5",X"BA",X"4A",X"A8",X"AD",X"1D",X"18", + X"D9",X"73",X"D8",X"D0",X"09",X"B9",X"78",X"D8",X"8D",X"1D",X"18",X"85",X"F6",X"EA",X"B9",X"8C", + X"D8",X"8D",X"19",X"18",X"60",X"85",X"F5",X"EA",X"A5",X"BA",X"4A",X"A8",X"AD",X"1D",X"18",X"D9", + X"78",X"D8",X"D0",X"09",X"B9",X"7D",X"D8",X"8D",X"1D",X"18",X"85",X"F6",X"EA",X"B9",X"91",X"D8", + X"8D",X"19",X"18",X"60",X"85",X"F5",X"EA",X"A9",X"FF",X"85",X"6E",X"A9",X"00",X"8D",X"18",X"18", + X"85",X"F5",X"EA",X"60",X"03",X"03",X"01",X"01",X"01",X"03",X"03",X"01",X"01",X"05",X"49",X"49", + X"49",X"4B",X"4A",X"41",X"41",X"41",X"48",X"47",X"49",X"49",X"49",X"4B",X"4A",X"41",X"41",X"41", + X"48",X"47",X"20",X"20",X"20",X"24",X"24",X"21",X"21",X"21",X"25",X"25",X"22",X"22",X"22",X"26", + X"26",X"23",X"23",X"23",X"27",X"27",X"85",X"F5",X"EA",X"A5",X"BA",X"C9",X"06",X"F0",X"50",X"C9", + X"08",X"F0",X"4C",X"AD",X"1E",X"18",X"49",X"FF",X"38",X"E9",X"28",X"4A",X"4A",X"4A",X"85",X"03", + X"A9",X"00",X"85",X"04",X"AD",X"1F",X"18",X"29",X"F8",X"18",X"69",X"10",X"0A",X"26",X"04",X"0A", + X"26",X"04",X"18",X"65",X"03",X"85",X"05",X"85",X"03",X"A5",X"04",X"69",X"10",X"85",X"04",X"18", + X"69",X"04",X"85",X"06",X"A0",X"24",X"B1",X"05",X"29",X"03",X"F0",X"13",X"A0",X"04",X"B1",X"05", + X"29",X"03",X"F0",X"0B",X"B1",X"03",X"29",X"1F",X"C9",X"04",X"90",X"06",X"85",X"F5",X"EA",X"4C", + X"55",X"DA",X"85",X"F5",X"EA",X"A9",X"08",X"20",X"5D",X"EA",X"20",X"6A",X"DA",X"A5",X"BA",X"C9", + X"02",X"F0",X"15",X"C8",X"85",X"F5",X"6E",X"20",X"58",X"DA",X"F0",X"1F",X"C8",X"C0",X"08",X"D0", + X"F6",X"A0",X"04",X"D0",X"5F",X"85",X"F5",X"6E",X"88",X"85",X"F5",X"EA",X"20",X"58",X"DA",X"F0", + X"2E",X"88",X"D0",X"F8",X"A0",X"01",X"D0",X"4C",X"85",X"F5",X"EA",X"8A",X"D0",X"0D",X"85",X"F5", + X"EA",X"C8",X"B1",X"05",X"29",X"03",X"D0",X"F9",X"85",X"F5",X"EA",X"A2",X"04",X"85",X"F5",X"6E", + X"88",X"B1",X"03",X"29",X"1C",X"F0",X"A8",X"CA",X"D0",X"F6",X"F0",X"28",X"85",X"F5",X"6E",X"8A", + X"D0",X"0D",X"85",X"F5",X"6E",X"88",X"B1",X"05",X"29",X"03",X"D0",X"F9",X"85",X"F5",X"6E",X"A2", + X"04",X"85",X"F5",X"EA",X"C8",X"B1",X"03",X"29",X"1C",X"F0",X"84",X"CA",X"D0",X"F6",X"88",X"88", + X"88",X"85",X"F5",X"EA",X"A9",X"09",X"20",X"5D",X"EA",X"98",X"18",X"65",X"03",X"85",X"07",X"C9", + X"04",X"69",X"00",X"29",X"03",X"85",X"08",X"C9",X"07",X"29",X"1F",X"0A",X"0A",X"0A",X"85",X"09", + X"46",X"08",X"66",X"07",X"A2",X"08",X"AA",X"07",X"A5",X"07",X"29",X"F8",X"85",X"07",X"4A",X"00", + X"85",X"F5",X"EA",X"BD",X"02",X"02",X"F0",X"1E",X"BD",X"03",X"02",X"49",X"FF",X"29",X"F8",X"C5", + X"09",X"D0",X"0C",X"BD",X"04",X"02",X"29",X"F8",X"C5",X"07",X"F0",X"10",X"85",X"F5",X"6E",X"E8", + X"E8",X"E8",X"E8",X"4C",X"A3",X"D9",X"4C",X"31",X"DA",X"85",X"F5",X"EA",X"BD",X"02",X"02",X"C9", + X"0F",X"B0",X"EC",X"29",X"0F",X"09",X"10",X"9D",X"02",X"02",X"BD",X"04",X"02",X"29",X"FC",X"09", + X"04",X"9D",X"04",X"02",X"4D",X"01",X"9D",X"05",X"02",X"A0",X"00",X"84",X"0A",X"C1",X"F5",X"6E", + X"A4",X"0A",X"B9",X"68",X"00",X"29",X"A0",X"D0",X"2D",X"98",X"0A",X"0A",X"A8",X"B9",X"02",X"18", + X"18",X"69",X"08",X"DD",X"03",X"02",X"B0",X"1E",X"18",X"69",X"20",X"DD",X"03",X"02",X"90",X"16", + X"B9",X"03",X"18",X"29",X"F8",X"18",X"69",X"10",X"85",X"0B",X"BD",X"04",X"02",X"29",X"F8",X"C5", + X"0B",X"F0",X"13",X"85",X"F5",X"EA",X"E6",X"0A",X"A4",X"0A",X"C0",X"06",X"D0",X"C2",X"85",X"F5", + X"EA",X"F0",X"22",X"85",X"F5",X"EA",X"A4",X"0A",X"B9",X"68",X"00",X"29",X"0F",X"09",X"40",X"99", + X"68",X"00",X"96",X"B1",X"FE",X"05",X"02",X"FE",X"05",X"02",X"A9",X"12",X"20",X"5D",X"EA",X"4C", + X"26",X"DA",X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"A2",X"FF",X"B1",X"05",X"29",X"03",X"F0", + X"25",X"E8",X"B1",X"03",X"29",X"1C",X"F0",X"1E",X"85",X"F5",X"EA",X"84",X"12",X"18",X"B1",X"03", + X"69",X"04",X"91",X"03",X"18",X"98",X"69",X"20",X"A8",X"B1",X"03",X"69",X"04",X"91",X"03",X"A4", + X"12",X"A9",X"FF",X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"A0",X"00",X"AD",X"04",X"40",X"29", + X"08",X"D0",X"05",X"A0",X"06",X"85",X"F5",X"EA",X"18",X"98",X"65",X"64",X"AA",X"BD",X"02",X"DB", + X"85",X"BC",X"BD",X"0E",X"DB",X"85",X"BD",X"BD",X"1A",X"DB",X"85",X"BE",X"A9",X"00",X"85",X"C2", + X"85",X"C3",X"85",X"BF",X"85",X"C0",X"85",X"C1",X"85",X"90",X"A6",X"1F",X"B5",X"61",X"4A",X"4A", + X"85",X"03",X"C9",X"08",X"90",X"02",X"A9",X"07",X"AA",X"BD",X"F0",X"DA",X"A0",X"05",X"85",X"F5", + X"EA",X"99",X"91",X"00",X"88",X"10",X"FA",X"BD",X"F9",X"DA",X"A0",X"05",X"85",X"F5",X"EA",X"99", + X"A1",X"00",X"88",X"10",X"FA",X"AD",X"F4",X"DA",X"85",X"98",X"AD",X"FD",X"DA",X"85",X"A8",X"60", + X"0F",X"03",X"07",X"0F",X"03",X"07",X"0F",X"03",X"07",X"04",X"03",X"03",X"03",X"02",X"02",X"02", + X"01",X"01",X"03",X"03",X"02",X"04",X"00",X"02",X"05",X"05",X"02",X"04",X"00",X"02",X"00",X"00", + X"03",X"02",X"02",X"02",X"00",X"00",X"03",X"02",X"02",X"02",X"01",X"01",X"01",X"00",X"04",X"02", + X"01",X"01",X"01",X"00",X"04",X"02",X"85",X"F5",X"EA",X"A5",X"6F",X"30",X"6E",X"A5",X"13",X"29", + X"1F",X"D0",X"68",X"E6",X"C2",X"CA",X"C2",X"E0",X"03",X"D0",X"02",X"A2",X"00",X"86",X"C2",X"D9", + X"BC",X"D5",X"BF",X"F0",X"56",X"A0",X"00",X"85",X"F5",X"EA",X"B9",X"68",X"00",X"C9",X"FF",X"F0", + X"0B",X"C8",X"C0",X"06",X"D0",X"F4",X"4C",X"9B",X"DB",X"85",X"F5",X"EA",X"F6",X"BF",X"6C",X"8A", + X"09",X"20",X"99",X"68",X"00",X"C0",X"0A",X"4D",X"01",X"99",X"99",X"00",X"EA",X"C3",X"C9",X"C3", + X"29",X"03",X"85",X"C3",X"0D",X"01",X"AA",X"BD",X"9C",X"DB",X"99",X"A9",X"00",X"54",X"0A",X"0A", + X"A8",X"BD",X"9E",X"DB",X"99",X"02",X"18",X"C9",X"63",X"0A",X"0A",X"18",X"65",X"C3",X"AA",X"BD", + X"A1",X"DB",X"99",X"03",X"18",X"08",X"EB",X"DC",X"85",X"F5",X"EA",X"60",X"20",X"40",X"F0",X"00", + X"1D",X"1D",X"AD",X"AD",X"1D",X"1D",X"5D",X"5D",X"1D",X"1D",X"8D",X"AD",X"1D",X"1D",X"8D",X"8D", + X"1D",X"1D",X"CD",X"CD",X"1D",X"2D",X"9D",X"8D",X"80",X"85",X"F5",X"EA",X"A5",X"6F",X"30",X"1C", + X"A2",X"00",X"85",X"F5",X"6E",X"B5",X"68",X"29",X"D0",X"D0",X"09",X"B5",X"68",X"29",X"20",X"D0", + X"0F",X"85",X"F5",X"EA",X"E8",X"E0",X"06",X"D0",X"EC",X"85",X"F5",X"EA",X"60",X"85",X"F5",X"6E", + X"86",X"70",X"B5",X"A9",X"85",X"71",X"46",X"0A",X"0A",X"A8",X"B9",X"02",X"18",X"85",X"03",X"5D", + X"03",X"18",X"85",X"04",X"C9",X"03",X"C9",X"D9",X"B0",X"54",X"C9",X"18",X"90",X"60",X"20",X"B6", + X"E0",X"D0",X"42",X"C9",X"10",X"F0",X"13",X"C9",X"40",X"F0",X"0F",X"C9",X"70",X"F0",X"0B",X"C9", + X"A0",X"F0",X"07",X"C9",X"D0",X"D0",X"2E",X"85",X"F5",X"EA",X"20",X"9D",X"E0",X"D0",X"0D",X"20", + X"7B",X"E0",X"F0",X"13",X"20",X"8C",X"E0",X"F0",X"0E",X"85",X"F5",X"EA",X"20",X"59",X"E0",X"F0", + X"06",X"4C",X"6B",X"DC",X"85",X"F5",X"EA",X"A6",X"70",X"B5",X"68",X"29",X"0F",X"95",X"68",X"4C", + X"6B",X"DC",X"85",X"F5",X"EA",X"A5",X"03",X"C9",X"80",X"B0",X"13",X"85",X"F5",X"EA",X"A6",X"70", + X"B5",X"A9",X"29",X"0F",X"09",X"20",X"95",X"A9",X"4C",X"6B",X"DC",X"85",X"F5",X"EA",X"A6",X"70", + X"B5",X"A9",X"29",X"0F",X"09",X"40",X"95",X"A9",X"85",X"F5",X"EA",X"A6",X"70",X"20",X"69",X"D2", + X"A6",X"70",X"4C",X"D4",X"DB",X"85",X"F5",X"EA",X"A5",X"13",X"29",X"3F",X"D0",X"6A",X"E6",X"90", + X"A5",X"90",X"C9",X"14",X"90",X"2E",X"A9",X"00",X"85",X"90",X"A2",X"05",X"85",X"F5",X"EA",X"B5", + X"91",X"29",X"10",X"F0",X"11",X"B5",X"A1",X"C9",X"02",X"F0",X"13",X"D6",X"A1",X"A9",X"03",X"95", + X"91",X"D0",X"0B",X"85",X"F5",X"EA",X"38",X"B5",X"91",X"36",X"91",X"85",X"F5",X"EA",X"CA",X"10", + X"DE",X"85",X"F5",X"EA",X"A0",X"05",X"A2",X"14",X"85",X"F5",X"EA",X"B9",X"68",X"00",X"30",X"09", + X"B5",X"73",X"F0",X"11",X"D6",X"73",X"85",X"F5",X"EA",X"88",X"CA",X"CA",X"CA",X"CA",X"10",X"EB", + X"30",X"16",X"85",X"F5",X"EA",X"8A",X"48",X"98",X"48",X"84",X"0A",X"20",X"EB",X"DC",X"68",X"A8", + X"68",X"AA",X"4C",X"C9",X"DC",X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"A4",X"0A",X"B9",X"68", + X"00",X"29",X"03",X"0A",X"A8",X"B9",X"2A",X"DD",X"85",X"03",X"B9",X"2B",X"DD",X"85",X"04",X"B9", + X"30",X"DD",X"85",X"05",X"5D",X"31",X"DD",X"85",X"06",X"A5",X"0A",X"0A",X"0A",X"AA",X"B4",X"75", + X"B1",X"03",X"95",X"72",X"59",X"05",X"95",X"73",X"A9",X"00",X"95",X"74",X"FA",X"75",X"D8",X"75", + X"B1",X"03",X"10",X"07",X"A9",X"00",X"95",X"75",X"85",X"F5",X"EA",X"60",X"38",X"DD",X"4D",X"DD", + X"5A",X"DD",X"43",X"DD",X"54",X"DD",X"5F",X"DD",X"04",X"03",X"04",X"05",X"04",X"04",X"05",X"04", + X"04",X"04",X"FF",X"03",X"03",X"07",X"05",X"03",X"03",X"05",X"03",X"03",X"03",X"03",X"03",X"04", + X"03",X"03",X"04",X"FF",X"03",X"03",X"07",X"09",X"0D",X"03",X"05",X"05",X"04",X"05",X"FF",X"09", + X"17",X"09",X"13",X"85",X"F5",X"6E",X"A5",X"6F",X"30",X"19",X"A2",X"05",X"86",X"70",X"C1",X"F5", + X"EA",X"A6",X"70",X"B5",X"68",X"29",X"F0",X"F0",X"0E",X"85",X"F5",X"EA",X"C6",X"70",X"10",X"F1", + X"85",X"F5",X"EA",X"60",X"85",X"F5",X"6E",X"8A",X"0A",X"0A",X"A8",X"B9",X"02",X"18",X"85",X"03", + X"B9",X"03",X"18",X"85",X"04",X"D9",X"8A",X"F0",X"0B",X"D6",X"8A",X"85",X"F5",X"6E",X"4C",X"BB", + X"DE",X"85",X"F5",X"EA",X"20",X"9D",X"E0",X"D0",X"F5",X"20",X"B6",X"E0",X"D0",X"F0",X"AD",X"1E", + X"18",X"85",X"17",X"AD",X"1F",X"18",X"85",X"18",X"A5",X"70",X"0A",X"0A",X"AA",X"B4",X"72",X"F0", + X"11",X"88",X"F0",X"14",X"88",X"F0",X"17",X"88",X"F0",X"1A",X"88",X"F0",X"20",X"D0",X"44",X"85", + X"F5",X"EA",X"4C",X"ED",X"DD",X"85",X"F5",X"6E",X"4C",X"13",X"DE",X"85",X"F5",X"6E",X"4C",X"ED", + X"DD",X"85",X"F5",X"EA",X"A5",X"17",X"69",X"08",X"85",X"17",X"85",X"F5",X"6E",X"A6",X"70",X"B5", + X"A9",X"85",X"71",X"29",X"F0",X"C9",X"20",X"85",X"F5",X"EA",X"F0",X"23",X"C9",X"40",X"85",X"F5", + X"EA",X"F0",X"31",X"C9",X"60",X"85",X"F5",X"EA",X"F0",X"3F",X"85",X"F5",X"EA",X"4C",X"5E",X"DE", + X"85",X"F5",X"EA",X"A5",X"18",X"69",X"08",X"85",X"18",X"4C",X"ED",X"DD",X"85",X"F5",X"EA",X"A5", + X"18",X"29",X"F8",X"85",X"05",X"A5",X"04",X"29",X"F8",X"C5",X"05",X"B0",X"46",X"F0",X"4A",X"90", + X"4E",X"85",X"F5",X"EA",X"A5",X"18",X"29",X"F8",X"85",X"05",X"A5",X"04",X"29",X"F8",X"C5",X"05", + X"B0",X"43",X"F0",X"47",X"90",X"4B",X"85",X"F5",X"EA",X"A5",X"17",X"29",X"F8",X"85",X"05",X"A5", + X"03",X"29",X"F8",X"C5",X"05",X"90",X"4C",X"F0",X"44",X"B0",X"3C",X"85",X"F5",X"EA",X"A5",X"17", + X"29",X"F8",X"85",X"05",X"A5",X"03",X"29",X"F8",X"C5",X"05",X"90",X"49",X"F0",X"41",X"B0",X"39", + X"85",X"F5",X"EA",X"4C",X"E7",X"DE",X"85",X"F5",X"EA",X"4C",X"01",X"DF",X"85",X"F5",X"EA",X"4C", + X"1B",X"DF",X"85",X"F5",X"EA",X"4C",X"35",X"DF",X"85",X"F5",X"EA",X"4C",X"55",X"DF",X"85",X"F5", + X"EA",X"4C",X"6F",X"DF",X"85",X"F5",X"EA",X"4C",X"89",X"DF",X"85",X"F5",X"EA",X"4C",X"A3",X"DF", + X"85",X"F5",X"EA",X"4C",X"BD",X"DF",X"85",X"F5",X"EA",X"4C",X"D7",X"DF",X"85",X"F5",X"EA",X"4C", + X"F1",X"DF",X"85",X"F5",X"EA",X"4C",X"0B",X"E0",X"85",X"F5",X"EA",X"A6",X"70",X"20",X"C3",X"D3", + X"D0",X"0B",X"A6",X"70",X"20",X"69",X"D2",X"4C",X"7C",X"DD",X"85",X"F5",X"EA",X"A6",X"70",X"B5", + X"A9",X"85",X"71",X"29",X"F0",X"C9",X"20",X"F0",X"28",X"C9",X"40",X"F0",X"AE",X"C9",X"60",X"F0", + X"BC",X"4C",X"F1",X"DF",X"85",X"F5",X"EA",X"20",X"59",X"E0",X"F0",X"63",X"20",X"7B",X"E0",X"F0", + X"5E",X"20",X"8C",X"E0",X"F0",X"59",X"20",X"6A",X"E0",X"F0",X"54",X"4C",X"3D",X"E0",X"85",X"F5", + X"EA",X"20",X"7B",X"E0",X"F0",X"49",X"20",X"59",X"E0",X"F0",X"44",X"20",X"6A",X"E0",X"F0",X"3F", + X"20",X"8C",X"E0",X"F0",X"3A",X"4C",X"3D",X"E0",X"85",X"F5",X"EA",X"20",X"6A",X"E0",X"F0",X"2F", + X"20",X"7B",X"E0",X"F0",X"2A",X"20",X"8C",X"E0",X"F0",X"25",X"20",X"59",X"E0",X"F0",X"20",X"4C", + X"3D",X"E0",X"85",X"F5",X"6E",X"20",X"59",X"E0",X"F0",X"15",X"20",X"8C",X"E0",X"F0",X"10",X"20", + X"6A",X"E0",X"F0",X"0B",X"20",X"7B",X"E0",X"F0",X"06",X"4C",X"3D",X"E0",X"85",X"F5",X"6E",X"4C", + X"25",X"E0",X"85",X"F5",X"6E",X"20",X"8C",X"E0",X"F0",X"F5",X"20",X"6A",X"E0",X"F0",X"F0",X"20", + X"59",X"E0",X"F0",X"EB",X"20",X"7B",X"E0",X"F0",X"E6",X"4C",X"3D",X"E0",X"85",X"F5",X"6E",X"20", + X"6A",X"E0",X"F0",X"DB",X"20",X"8C",X"E0",X"F0",X"D6",X"20",X"59",X"E0",X"F0",X"D1",X"20",X"7B", + X"E0",X"F0",X"CC",X"4C",X"3D",X"E0",X"85",X"F5",X"EA",X"20",X"7B",X"E0",X"F0",X"C1",X"20",X"59", + X"E0",X"F0",X"BC",X"20",X"8C",X"E0",X"F0",X"B7",X"20",X"6A",X"E0",X"F0",X"B2",X"4C",X"3D",X"E0", + X"85",X"F5",X"EA",X"20",X"59",X"E0",X"F0",X"7D",X"20",X"7B",X"E0",X"F0",X"78",X"20",X"8C",X"E0", + X"F0",X"73",X"20",X"6A",X"E0",X"F0",X"6E",X"4C",X"3D",X"E0",X"85",X"F5",X"6E",X"20",X"8C",X"E0", + X"F0",X"63",X"20",X"59",X"E0",X"F0",X"5E",X"20",X"7B",X"E0",X"F0",X"59",X"20",X"6A",X"E0",X"F0", + X"54",X"4C",X"3D",X"E0",X"85",X"F5",X"6E",X"20",X"7B",X"E0",X"F0",X"49",X"20",X"6A",X"E0",X"F0", + X"44",X"20",X"8C",X"E0",X"F0",X"3F",X"20",X"59",X"E0",X"F0",X"3A",X"4C",X"3D",X"E0",X"85",X"F5", + X"EA",X"20",X"6A",X"E0",X"F0",X"2F",X"20",X"8C",X"E0",X"F0",X"2A",X"20",X"7B",X"E0",X"F0",X"25", + X"20",X"59",X"E0",X"F0",X"20",X"4C",X"3D",X"E0",X"85",X"F5",X"EA",X"20",X"8C",X"E0",X"F0",X"15", + X"20",X"6A",X"E0",X"F0",X"10",X"20",X"7B",X"E0",X"F0",X"0B",X"20",X"59",X"E0",X"F0",X"06",X"4C", + X"3D",X"E0",X"85",X"F5",X"EA",X"A6",X"70",X"A9",X"00",X"95",X"74",X"A9",X"10",X"95",X"8A",X"85", + X"F5",X"EA",X"A6",X"70",X"20",X"69",X"D2",X"4C",X"7B",X"DD",X"85",X"F5",X"EA",X"A6",X"70",X"B5", + X"68",X"29",X"03",X"AA",X"D6",X"BE",X"A6",X"70",X"0A",X"0A",X"A8",X"A9",X"00",X"99",X"00",X"18", + X"A9",X"FF",X"95",X"68",X"4C",X"7C",X"DD",X"85",X"F5",X"EA",X"A6",X"70",X"A5",X"71",X"29",X"0F", + X"09",X"60",X"95",X"A9",X"20",X"C3",X"D3",X"60",X"85",X"F5",X"EA",X"A6",X"70",X"A5",X"71",X"29", + X"0F",X"09",X"80",X"95",X"A9",X"20",X"C3",X"D3",X"60",X"85",X"F5",X"EA",X"A6",X"70",X"A5",X"71", + X"29",X"0F",X"09",X"20",X"95",X"A9",X"20",X"C3",X"D3",X"60",X"85",X"F5",X"EA",X"A6",X"70",X"A5", + X"71",X"29",X"0F",X"09",X"40",X"95",X"A9",X"20",X"C3",X"D3",X"60",X"85",X"F5",X"EA",X"A5",X"04", + X"29",X"0F",X"C9",X"0F",X"F0",X"0D",X"C9",X"0E",X"F0",X"09",X"C9",X"0D",X"F0",X"05",X"C9",X"0C", + X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"A5",X"03",X"85",X"08",X"E6",X"08",X"E6",X"08",X"A5", + X"08",X"29",X"0C",X"F0",X"1E",X"C9",X"08",X"D0",X"2F",X"A5",X"08",X"29",X"F0",X"C9",X"10",X"F0", + X"27",X"C9",X"40",X"F0",X"23",X"C9",X"70",X"F0",X"1F",X"C9",X"A0",X"F0",X"1B",X"C9",X"D0",X"60", + X"85",X"F5",X"EA",X"A5",X"08",X"29",X"F0",X"C9",X"30",X"F0",X"0D",X"C9",X"60",X"F0",X"09",X"C9", + X"90",X"F0",X"05",X"C9",X"C0",X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"86",X"11",X"84",X"12", + X"A4",X"64",X"B9",X"88",X"E1",X"85",X"C4",X"C8",X"63",X"98",X"0A",X"AA",X"BD",X"76",X"E1",X"85", + X"03",X"BD",X"77",X"E1",X"85",X"04",X"5D",X"82",X"E1",X"AA",X"A0",X"00",X"91",X"03",X"6C",X"8A", + X"C8",X"91",X"03",X"A0",X"20",X"E8",X"8A",X"91",X"03",X"E8",X"8A",X"C8",X"91",X"03",X"4D",X"00", + X"85",X"60",X"A4",X"12",X"A6",X"11",X"A9",X"0B",X"20",X"5D",X"EA",X"85",X"F5",X"6E",X"60",X"85", + X"F5",X"EA",X"A5",X"C4",X"F0",X"2F",X"20",X"F2",X"E8",X"A5",X"13",X"29",X"3F",X"D0",X"26",X"C6", + X"C4",X"D0",X"22",X"A5",X"63",X"0A",X"AA",X"BD",X"76",X"E1",X"85",X"03",X"DD",X"77",X"E1",X"85", + X"04",X"A9",X"00",X"A8",X"91",X"03",X"64",X"91",X"03",X"A0",X"20",X"91",X"03",X"64",X"91",X"03", + X"85",X"60",X"85",X"F5",X"6E",X"60",X"4F",X"11",X"CF",X"11",X"CF",X"11",X"8F",X"10",X"15",X"11", + X"8F",X"11",X"BC",X"C0",X"B8",X"BC",X"C0",X"B8",X"07",X"06",X"05",X"05",X"05",X"05",X"85",X"F5", + X"EA",X"A9",X"00",X"8D",X"00",X"02",X"C1",X"F5",X"EA",X"AC",X"00",X"02",X"B9",X"02",X"02",X"D0", + X"04",X"60",X"85",X"F5",X"6E",X"29",X"0F",X"85",X"03",X"B9",X"03",X"02",X"85",X"04",X"5D",X"04", + X"02",X"85",X"05",X"B9",X"02",X"02",X"29",X"F0",X"4A",X"4A",X"4A",X"AA",X"BD",X"C9",X"E1",X"85", + X"06",X"BD",X"CA",X"E1",X"85",X"07",X"AC",X"06",X"00",X"00",X"E2",X"18",X"E2",X"36",X"E2",X"78", + X"E2",X"B0",X"E2",X"E8",X"E2",X"00",X"E4",X"EC",X"E1",X"EF",X"E1",X"F2",X"E1",X"20",X"E3",X"58", + X"E3",X"90",X"E3",X"C8",X"E3",X"57",X"E4",X"03",X"E2",X"85",X"F5",X"EA",X"85",X"F5",X"6E",X"85", + X"F5",X"EA",X"00",X"B9",X"02",X"02",X"29",X"0F",X"09",X"10",X"99",X"02",X"02",X"C1",X"F5",X"6E", + X"85",X"F5",X"EA",X"20",X"BE",X"E5",X"EE",X"00",X"02",X"EE",X"00",X"02",X"EE",X"00",X"02",X"EE", + X"00",X"02",X"4C",X"99",X"E1",X"85",X"F5",X"EA",X"20",X"16",X"E5",X"D0",X"13",X"20",X"6E",X"E5", + X"D0",X"0E",X"20",X"A2",X"CC",X"98",X"AA",X"FE",X"04",X"02",X"20",X"6B",X"EB",X"85",X"F5",X"EA", + X"4C",X"03",X"E2",X"85",X"F5",X"EA",X"B9",X"05",X"02",X"29",X"10",X"D0",X"1E",X"38",X"A5",X"05", + X"E9",X"08",X"85",X"05",X"99",X"04",X"02",X"20",X"A9",X"E4",X"B9",X"05",X"02",X"09",X"10",X"99", + X"05",X"02",X"85",X"F5",X"EA",X"4C",X"03",X"E2",X"85",X"F5",X"EA",X"A5",X"13",X"29",X"03",X"D0", + X"F4",X"B9",X"05",X"02",X"29",X"0F",X"99",X"05",X"02",X"B9",X"02",X"02",X"29",X"0F",X"09",X"30", + X"99",X"02",X"02",X"D0",X"E0",X"85",X"F5",X"EA",X"B9",X"05",X"02",X"29",X"10",X"D0",X"14",X"20", + X"B2",X"E4",X"B9",X"05",X"02",X"09",X"10",X"99",X"05",X"02",X"85",X"F5",X"EA",X"4C",X"03",X"E2", + X"85",X"F5",X"EA",X"A5",X"13",X"29",X"03",X"D0",X"F4",X"B9",X"05",X"02",X"29",X"0F",X"99",X"05", + X"02",X"B9",X"02",X"02",X"29",X"0F",X"09",X"40",X"99",X"02",X"02",X"D0",X"E0",X"85",X"F5",X"EA", + X"B9",X"05",X"02",X"29",X"10",X"D0",X"14",X"20",X"BB",X"E4",X"B9",X"05",X"02",X"09",X"10",X"99", + X"05",X"02",X"85",X"F5",X"EA",X"4C",X"03",X"E2",X"85",X"F5",X"EA",X"A5",X"13",X"29",X"03",X"D0", + X"F4",X"B9",X"05",X"02",X"29",X"0F",X"99",X"05",X"02",X"B9",X"02",X"02",X"09",X"50",X"29",X"5F", + X"99",X"02",X"02",X"D0",X"E0",X"85",X"F5",X"EA",X"B9",X"05",X"02",X"29",X"10",X"D0",X"14",X"20", + X"C4",X"E4",X"B9",X"05",X"02",X"09",X"10",X"99",X"05",X"02",X"85",X"F5",X"EA",X"4C",X"03",X"E2", + X"85",X"F5",X"EA",X"A5",X"13",X"29",X"03",X"D0",X"F4",X"B9",X"05",X"02",X"29",X"0F",X"99",X"05", + X"02",X"B9",X"02",X"02",X"09",X"60",X"29",X"6F",X"99",X"02",X"02",X"D0",X"E0",X"85",X"F5",X"6E", + X"B9",X"05",X"02",X"29",X"10",X"D0",X"14",X"20",X"A9",X"E4",X"B9",X"05",X"02",X"09",X"10",X"99", + X"05",X"02",X"85",X"F5",X"6E",X"4C",X"03",X"E2",X"85",X"F5",X"EA",X"A5",X"13",X"29",X"03",X"D0", + X"F4",X"B9",X"05",X"02",X"29",X"0F",X"99",X"05",X"02",X"B9",X"02",X"02",X"29",X"0F",X"09",X"B0", + X"99",X"02",X"02",X"D0",X"E0",X"85",X"F5",X"6E",X"B9",X"05",X"02",X"29",X"10",X"D0",X"14",X"20", + X"B2",X"E4",X"B9",X"05",X"02",X"09",X"10",X"99",X"05",X"02",X"85",X"F5",X"6E",X"4C",X"03",X"E2", + X"85",X"F5",X"EA",X"A5",X"13",X"29",X"03",X"D0",X"F4",X"B9",X"05",X"02",X"29",X"0F",X"99",X"05", + X"02",X"B9",X"02",X"02",X"09",X"C0",X"29",X"CF",X"99",X"02",X"02",X"D0",X"E0",X"85",X"F5",X"6E", + X"B9",X"05",X"02",X"29",X"10",X"D0",X"14",X"20",X"BB",X"E4",X"B9",X"05",X"02",X"09",X"10",X"99", + X"05",X"02",X"85",X"F5",X"6E",X"4C",X"03",X"E2",X"85",X"F5",X"EA",X"A5",X"13",X"29",X"03",X"D0", + X"F4",X"B9",X"05",X"02",X"29",X"0F",X"99",X"05",X"02",X"B9",X"02",X"02",X"09",X"D0",X"29",X"DF", + X"99",X"02",X"02",X"D0",X"E0",X"85",X"F5",X"6E",X"B9",X"05",X"02",X"29",X"10",X"D0",X"14",X"20", + X"C4",X"E4",X"B9",X"05",X"02",X"09",X"10",X"99",X"05",X"02",X"85",X"F5",X"6E",X"4C",X"03",X"E2", + X"85",X"F5",X"EA",X"A5",X"13",X"29",X"03",X"D0",X"F4",X"B9",X"05",X"02",X"29",X"0F",X"99",X"05", + X"02",X"B9",X"02",X"02",X"09",X"E0",X"29",X"EF",X"99",X"02",X"02",X"D0",X"E0",X"85",X"F5",X"6E", + X"20",X"A2",X"CC",X"98",X"AA",X"FE",X"04",X"02",X"BD",X"04",X"02",X"29",X"07",X"D0",X"42",X"B9", + X"02",X"02",X"29",X"0F",X"09",X"10",X"99",X"02",X"02",X"B9",X"05",X"02",X"29",X"0F",X"99",X"05", + X"02",X"B9",X"06",X"02",X"29",X"0F",X"C9",X"0F",X"F0",X"0C",X"B9",X"06",X"02",X"29",X"F0",X"C9", + X"F0",X"D0",X"1E",X"85",X"F5",X"EA",X"A9",X"00",X"99",X"05",X"02",X"B9",X"02",X"02",X"09",X"F0", + X"99",X"02",X"02",X"A9",X"00",X"20",X"8C",X"E9",X"20",X"FA",X"E5",X"20",X"C8",X"E7",X"85",X"F5", + X"EA",X"4C",X"03",X"E2",X"85",X"F5",X"EA",X"20",X"A2",X"CC",X"98",X"AA",X"BD",X"05",X"02",X"29", + X"0F",X"9D",X"05",X"02",X"F0",X"08",X"DE",X"05",X"02",X"D0",X"19",X"85",X"F5",X"EA",X"B9",X"02", + X"02",X"29",X"0F",X"99",X"02",X"02",X"A9",X"00",X"20",X"8C",X"E9",X"20",X"FA",X"E5",X"4C",X"03", + X"E2",X"85",X"F5",X"EA",X"B9",X"02",X"02",X"29",X"0F",X"09",X"10",X"99",X"02",X"02",X"B9",X"04", + X"02",X"69",X"02",X"99",X"04",X"02",X"4C",X"03",X"E2",X"00",X"01",X"01",X"05",X"02",X"04",X"03", + X"00",X"01",X"01",X"05",X"02",X"04",X"03",X"85",X"F5",X"EA",X"A9",X"00",X"85",X"11",X"F0",X"1C", + X"85",X"F5",X"EA",X"A9",X"01",X"85",X"11",X"F0",X"13",X"85",X"F5",X"EA",X"A9",X"02",X"85",X"11", + X"F0",X"0A",X"85",X"F5",X"EA",X"A9",X"03",X"85",X"11",X"85",X"F5",X"EA",X"98",X"48",X"A6",X"11", + X"A5",X"05",X"18",X"7D",X"0C",X"E5",X"85",X"05",X"20",X"99",X"CC",X"A0",X"01",X"A6",X"11",X"A5", + X"06",X"29",X"FB",X"85",X"06",X"B1",X"05",X"18",X"7D",X"10",X"E5",X"91",X"05",X"C8",X"B1",X"05", + X"18",X"7D",X"10",X"E5",X"91",X"05",X"A0",X"21",X"B1",X"05",X"18",X"7D",X"10",X"E5",X"91",X"05", + X"C8",X"B1",X"05",X"18",X"7D",X"10",X"E5",X"91",X"05",X"68",X"A8",X"60",X"04",X"03",X"02",X"01", + X"04",X"FC",X"04",X"FC",X"85",X"F5",X"6E",X"A5",X"05",X"29",X"07",X"D0",X"4C",X"B9",X"07",X"02", + X"C5",X"04",X"D0",X"45",X"B9",X"08",X"02",X"38",X"E5",X"05",X"C9",X"09",X"B0",X"3B",X"B9",X"02", + X"02",X"29",X"0F",X"09",X"20",X"99",X"02",X"02",X"B9",X"06",X"02",X"29",X"F0",X"C9",X"F0",X"F0", + X"1D",X"B9",X"06",X"02",X"29",X"0F",X"C9",X"0F",X"F0",X"14",X"B9",X"06",X"02",X"09",X"10",X"99", + X"06",X"02",X"B9",X"08",X"02",X"18",X"69",X"04",X"99",X"08",X"02",X"85",X"F5",X"6E",X"A9",X"0A", + X"20",X"5D",X"EA",X"A9",X"FF",X"60",X"85",X"F5",X"EA",X"A9",X"00",X"60",X"85",X"F5",X"6E",X"A5", + X"05",X"29",X"0F",X"C9",X"08",X"D0",X"2D",X"A5",X"04",X"4A",X"4A",X"4A",X"4A",X"85",X"12",X"4D", + X"10",X"38",X"E5",X"12",X"85",X"12",X"C9",X"05",X"29",X"F0",X"18",X"65",X"12",X"AA",X"BD",X"8E", + X"D6",X"AA",X"BD",X"00",X"04",X"4A",X"4A",X"4A",X"4A",X"C9",X"09",X"F0",X"0D",X"C9",X"08",X"F0", + X"09",X"85",X"F5",X"EA",X"A9",X"00",X"60",X"85",X"F5",X"EA",X"B9",X"02",X"02",X"29",X"0F",X"09", + X"A0",X"99",X"02",X"02",X"4D",X"0A",X"20",X"5D",X"EA",X"A9",X"FF",X"60",X"85",X"F5",X"6E",X"A2", + X"00",X"85",X"F5",X"EA",X"B5",X"68",X"29",X"E0",X"C9",X"40",X"F0",X"0C",X"85",X"F5",X"6E",X"E8", + X"E0",X"06",X"D0",X"F0",X"60",X"85",X"F5",X"6E",X"B5",X"B1",X"85",X"0D",X"E0",X"0D",X"D0",X"EF", + X"84",X"0E",X"38",X"B9",X"04",X"02",X"E9",X"0C",X"85",X"0F",X"8A",X"0A",X"0A",X"A8",X"A5",X"0F", + X"99",X"03",X"18",X"A4",X"0E",X"4C",X"CF",X"E5",X"85",X"F5",X"EA",X"A2",X"00",X"86",X"C9",X"C1", + X"F5",X"EA",X"B5",X"68",X"30",X"07",X"29",X"40",X"D0",X"2F",X"85",X"F5",X"EA",X"E8",X"E0",X"06", + X"D0",X"F0",X"A6",X"C9",X"F0",X"1F",X"BD",X"63",X"E6",X"20",X"8C",X"E9",X"98",X"48",X"A6",X"CA", + X"BC",X"4F",X"EB",X"A6",X"C9",X"BD",X"69",X"E6",X"99",X"01",X"18",X"A9",X"01",X"99",X"00",X"18", + X"68",X"A8",X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"B5",X"B1",X"85",X"0D",X"C4",X"0D",X"D0", + X"CC",X"E6",X"C9",X"86",X"CA",X"B5",X"68",X"29",X"0F",X"09",X"20",X"95",X"68",X"84",X"0E",X"29", + X"03",X"A8",X"B9",X"4C",X"E7",X"BC",X"4F",X"EB",X"99",X"01",X"18",X"A4",X"0E",X"A9",X"7F",X"95", + X"99",X"4C",X"0D",X"E6",X"04",X"05",X"07",X"08",X"09",X"0A",X"37",X"38",X"39",X"3A",X"3B",X"3C", + X"85",X"F5",X"EA",X"AD",X"1A",X"18",X"85",X"03",X"AD",X"1B",X"18",X"85",X"04",X"A2",X"00",X"85", + X"F5",X"EA",X"B5",X"68",X"10",X"0C",X"85",X"F5",X"EA",X"E8",X"E0",X"06",X"D0",X"F4",X"60",X"85", + X"F5",X"EA",X"8A",X"0A",X"0A",X"A8",X"B9",X"02",X"18",X"18",X"69",X"0C",X"C5",X"03",X"90",X"E9", + X"E9",X"18",X"C5",X"03",X"B0",X"E3",X"B9",X"03",X"18",X"18",X"69",X"0C",X"C5",X"04",X"90",X"D9", + X"E9",X"18",X"C5",X"04",X"B0",X"D3",X"B5",X"68",X"09",X"10",X"95",X"68",X"A4",X"1F",X"B9",X"61", + X"00",X"C9",X"08",X"90",X"02",X"A9",X"08",X"A8",X"B9",X"D4",X"E6",X"95",X"99",X"A9",X"0F",X"20", + X"5D",X"EA",X"4C",X"89",X"E6",X"D1",X"C1",X"B1",X"A1",X"91",X"81",X"71",X"61",X"85",X"F5",X"EA", + X"A2",X"00",X"85",X"F5",X"EA",X"B5",X"68",X"30",X"07",X"29",X"10",X"D0",X"0C",X"85",X"F5",X"EA", + X"E8",X"E0",X"06",X"D0",X"F0",X"60",X"85",X"F5",X"EA",X"B5",X"99",X"C9",X"01",X"F0",X"39",X"D6", + X"99",X"B5",X"99",X"29",X"0F",X"D0",X"E9",X"B5",X"99",X"29",X"10",X"F0",X"0F",X"B5",X"68",X"29", + X"03",X"A8",X"B9",X"4C",X"E7",X"85",X"03",X"70",X"10",X"85",X"F5",X"EA",X"B5",X"68",X"29",X"03", + X"A8",X"B9",X"53",X"E7",X"85",X"03",X"C1",X"F5",X"EA",X"8A",X"0A",X"0A",X"A8",X"A5",X"03",X"99", + X"01",X"18",X"4C",X"F0",X"E6",X"85",X"F5",X"6E",X"B5",X"68",X"29",X"EF",X"95",X"68",X"0D",X"03", + X"A8",X"B9",X"5A",X"E7",X"85",X"03",X"A4",X"29",X"E7",X"85",X"F5",X"EA",X"00",X"62",X"6E",X"7A", + X"85",X"F5",X"EA",X"00",X"63",X"6F",X"7B",X"85",X"F5",X"EA",X"00",X"5A",X"66",X"72",X"85",X"F5", + X"EA",X"A5",X"6F",X"30",X"1E",X"AD",X"1E",X"18",X"85",X"03",X"AD",X"1F",X"18",X"85",X"04",X"4A", + X"00",X"85",X"F5",X"EA",X"B5",X"68",X"10",X"0F",X"85",X"F5",X"EA",X"E8",X"E0",X"06",X"D0",X"F4", + X"85",X"F5",X"EA",X"60",X"85",X"F5",X"6E",X"29",X"70",X"D0",X"F0",X"8A",X"0A",X"0A",X"A8",X"B9", + X"02",X"18",X"18",X"69",X"08",X"C5",X"03",X"90",X"E2",X"E9",X"10",X"C5",X"03",X"B0",X"DC",X"B9", + X"03",X"18",X"18",X"69",X"04",X"C5",X"04",X"90",X"D2",X"E9",X"0D",X"C5",X"04",X"B0",X"CC",X"A9", + X"10",X"20",X"5D",X"EA",X"A5",X"6F",X"09",X"F0",X"85",X"6F",X"A9",X"FF",X"85",X"A0",X"4D",X"00", + X"20",X"5D",X"EA",X"4C",X"7B",X"E7",X"85",X"F5",X"EA",X"A6",X"1F",X"F6",X"65",X"C8",X"63",X"B5", + X"65",X"85",X"05",X"D9",X"15",X"E8",X"D0",X"03",X"20",X"FB",X"E0",X"A5",X"05",X"D9",X"1B",X"E8", + X"D0",X"03",X"20",X"FB",X"E0",X"A5",X"05",X"D9",X"21",X"E8",X"D0",X"03",X"20",X"FB",X"E0",X"A5", + X"05",X"D9",X"27",X"E8",X"D0",X"03",X"20",X"FB",X"E0",X"A5",X"05",X"D9",X"2D",X"E8",X"90",X"14", + X"A5",X"6F",X"29",X"0F",X"09",X"80",X"85",X"6F",X"A9",X"FF",X"85",X"A0",X"A9",X"05",X"20",X"5D", + X"EA",X"85",X"F5",X"EA",X"60",X"04",X"05",X"04",X"06",X"03",X"03",X"08",X"07",X"08",X"10",X"06", + X"07",X"0C",X"0D",X"0E",X"16",X"09",X"0C",X"FF",X"FF",X"0E",X"1C",X"FF",X"0E",X"10",X"10",X"12", + X"20",X"10",X"12",X"85",X"F5",X"EA",X"A5",X"6F",X"29",X"F0",X"C9",X"80",X"D0",X"2B",X"A5",X"A0", + X"F0",X"22",X"C6",X"A0",X"A5",X"A0",X"29",X"0F",X"D0",X"1F",X"A5",X"A0",X"29",X"10",X"F0",X"07", + X"A9",X"47",X"D0",X"08",X"85",X"F5",X"EA",X"A9",X"4C",X"85",X"F5",X"EA",X"8D",X"1D",X"18",X"D0", + X"08",X"85",X"F5",X"EA",X"E6",X"C5",X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"A5",X"C6",X"30", + X"46",X"A5",X"6F",X"29",X"F0",X"C9",X"F0",X"F0",X"04",X"60",X"85",X"F5",X"EA",X"A2",X"1B",X"A5", + X"A0",X"85",X"F5",X"EA",X"DD",X"B8",X"E8",X"F0",X"09",X"CA",X"10",X"F8",X"C6",X"A0",X"60",X"85", + X"F5",X"EA",X"BD",X"D4",X"E8",X"8D",X"1D",X"18",X"C6",X"A0",X"8A",X"D0",X"0E",X"A6",X"1F",X"D6", + X"29",X"A9",X"FF",X"85",X"C6",X"4C",X"B7",X"E8",X"85",X"F5",X"EA",X"E0",X"18",X"D0",X"08",X"A9", + X"10",X"20",X"5D",X"EA",X"85",X"F5",X"EA",X"60",X"01",X"08",X"10",X"18",X"20",X"28",X"30",X"38", + X"40",X"48",X"50",X"58",X"60",X"68",X"78",X"80",X"88",X"90",X"98",X"A0",X"A8",X"B0",X"B8",X"C0", + X"C8",X"D0",X"F8",X"FE",X"52",X"51",X"52",X"51",X"52",X"51",X"52",X"51",X"52",X"51",X"52",X"51", + X"52",X"51",X"52",X"51",X"52",X"51",X"52",X"51",X"52",X"51",X"52",X"51",X"50",X"4F",X"4E",X"4D", + X"85",X"F5",X"EA",X"A5",X"60",X"D0",X"7A",X"A6",X"63",X"BD",X"72",X"E9",X"85",X"03",X"BD",X"78", + X"E9",X"85",X"04",X"AD",X"1E",X"18",X"18",X"69",X"08",X"C5",X"03",X"90",X"64",X"E9",X"10",X"C5", + X"03",X"B0",X"5E",X"AD",X"1F",X"18",X"18",X"69",X"08",X"C5",X"04",X"90",X"54",X"E9",X"10",X"C5", + X"04",X"B0",X"4E",X"8A",X"0A",X"A8",X"B9",X"76",X"E1",X"85",X"03",X"B9",X"77",X"E1",X"85",X"04", + X"BC",X"81",X"E9",X"B9",X"7E",X"E9",X"85",X"05",X"A0",X"00",X"91",X"03",X"64",X"E6",X"05",X"C9", + X"05",X"91",X"03",X"A9",X"00",X"A0",X"20",X"91",X"03",X"C8",X"91",X"03",X"4D",X"02",X"85",X"C4", + X"E6",X"60",X"BC",X"81",X"E9",X"B9",X"87",X"E9",X"20",X"8C",X"E9",X"A6",X"1F",X"B5",X"2B",X"18", + X"F8",X"69",X"01",X"95",X"2B",X"74",X"20",X"94",X"CA",X"A9",X"11",X"20",X"5D",X"EA",X"85",X"F5", + X"EA",X"60",X"78",X"78",X"78",X"78",X"48",X"78",X"50",X"70",X"70",X"20",X"40",X"60",X"AC",X"B0", + X"B4",X"00",X"01",X"02",X"00",X"01",X"02",X"04",X"05",X"06",X"85",X"F5",X"6E",X"85",X"04",X"46", + X"48",X"98",X"48",X"A5",X"1B",X"D0",X"06",X"4C",X"33",X"EA",X"85",X"F5",X"6E",X"A6",X"1F",X"BC", + X"59",X"EA",X"A6",X"04",X"18",X"F8",X"B9",X"2D",X"00",X"7D",X"38",X"EA",X"99",X"2D",X"00",X"5D", + X"2E",X"00",X"7D",X"43",X"EA",X"99",X"2E",X"00",X"B9",X"2F",X"00",X"7D",X"4E",X"EA",X"99",X"2F", + X"00",X"D8",X"A6",X"1F",X"20",X"4E",X"C9",X"A6",X"1F",X"BC",X"59",X"EA",X"A5",X"35",X"D9",X"2F", + X"00",X"90",X"15",X"D0",X"2A",X"A5",X"34",X"D9",X"2E",X"00",X"90",X"0C",X"D0",X"21",X"A5",X"33", + X"D9",X"2D",X"00",X"B0",X"1A",X"85",X"F5",X"6E",X"B9",X"2D",X"00",X"85",X"33",X"5D",X"2E",X"00", + X"85",X"34",X"B9",X"2F",X"00",X"85",X"35",X"4A",X"02",X"20",X"4E",X"C9",X"85",X"F5",X"6E",X"A6", + X"1F",X"BC",X"59",X"EA",X"8A",X"0A",X"AA",X"B9",X"2F",X"00",X"D5",X"5D",X"90",X"25",X"B9",X"2E", + X"00",X"D5",X"5C",X"90",X"1E",X"18",X"F8",X"B5",X"5C",X"65",X"5A",X"95",X"5C",X"B5",X"5D",X"65", + X"5B",X"95",X"5D",X"D8",X"A6",X"1F",X"F6",X"29",X"20",X"54",X"CA",X"A9",X"02",X"20",X"5D",X"EA", + X"85",X"F5",X"EA",X"68",X"A8",X"68",X"AA",X"60",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"02",X"03",X"05",X"10",X"15",X"20",X"40",X"80",X"60",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"03",X"85",X"F5",X"EA",X"86",X"C7", + X"A6",X"1B",X"F0",X"0A",X"AA",X"BD",X"71",X"EA",X"8D",X"03",X"40",X"85",X"F5",X"EA",X"A6",X"C7", + X"60",X"00",X"1B",X"1C",X"04",X"01",X"02",X"20",X"21",X"11",X"12",X"13",X"14",X"15",X"16",X"17", + X"18",X"19",X"1A",X"1D",X"13",X"14",X"15",X"16",X"17",X"05",X"03",X"85",X"F5",X"EA",X"A2",X"05", + X"85",X"F5",X"EA",X"B5",X"68",X"29",X"F0",X"C9",X"80",X"F0",X"0D",X"85",X"F5",X"EA",X"CA",X"10", + X"F2",X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"B5",X"99",X"C9",X"01",X"F0",X"48",X"D6",X"99", + X"B5",X"99",X"C9",X"40",X"F0",X"43",X"C9",X"38",X"F0",X"53",X"C9",X"30",X"F0",X"63",X"C9",X"28", + X"F0",X"23",X"C9",X"20",X"D0",X"D8",X"B5",X"68",X"29",X"03",X"A8",X"B9",X"65",X"EB",X"20",X"8C", + X"E9",X"B9",X"62",X"EB",X"BC",X"4F",X"EB",X"99",X"01",X"18",X"A9",X"01",X"99",X"00",X"18",X"4C", + X"9E",X"EA",X"85",X"F5",X"EA",X"B5",X"68",X"29",X"03",X"A8",X"B9",X"5F",X"EB",X"BC",X"4F",X"EB", + X"99",X"01",X"18",X"4C",X"9E",X"EA",X"4C",X"35",X"EB",X"B5",X"68",X"29",X"03",X"A8",X"B9",X"56", + X"EB",X"BC",X"4F",X"EB",X"99",X"01",X"18",X"A4",X"9E",X"EA",X"85",X"F5",X"6E",X"B5",X"68",X"29", + X"03",X"A8",X"B9",X"59",X"EB",X"BC",X"4F",X"EB",X"99",X"01",X"18",X"4C",X"9E",X"EA",X"85",X"F5", + X"EA",X"B5",X"68",X"29",X"03",X"A8",X"B9",X"5C",X"EB",X"BC",X"4F",X"EB",X"99",X"01",X"18",X"A4", + X"9E",X"EA",X"85",X"F5",X"6E",X"86",X"03",X"D9",X"68",X"29",X"03",X"AA",X"D6",X"BE",X"CA",X"03", + X"A9",X"FF",X"95",X"68",X"DC",X"4F",X"EB",X"A9",X"00",X"99",X"00",X"18",X"A4",X"9E",X"EA",X"00", + X"04",X"08",X"0C",X"10",X"14",X"18",X"1C",X"5E",X"6A",X"76",X"5F",X"6B",X"77",X"60",X"6C",X"78", + X"61",X"6D",X"79",X"34",X"35",X"36",X"01",X"02",X"03",X"85",X"F5",X"EA",X"A2",X"05",X"85",X"F5", + X"EA",X"B5",X"68",X"10",X"0A",X"85",X"F5",X"6E",X"CA",X"10",X"F6",X"60",X"85",X"F5",X"6E",X"BC", + X"4F",X"EB",X"B9",X"02",X"18",X"85",X"03",X"5D",X"03",X"18",X"85",X"04",X"CC",X"00",X"02",X"B9", + X"03",X"02",X"E9",X"08",X"C5",X"03",X"90",X"E0",X"E9",X"20",X"C5",X"03",X"B0",X"DA",X"B9",X"04", + X"02",X"E9",X"05",X"C5",X"04",X"B0",X"D1",X"69",X"0C",X"C5",X"04",X"90",X"CB",X"B5",X"68",X"29", + X"0F",X"09",X"80",X"95",X"68",X"4D",X"42",X"95",X"99",X"A9",X"0C",X"20",X"5E",X"EA",X"4C",X"78", + X"EB",X"85",X"F6",X"EA",X"A9",X"05",X"85",X"2B",X"85",X"2C",X"AD",X"04",X"40",X"29",X"10",X"D0", + X"05",X"C6",X"2B",X"85",X"F6",X"6E",X"60",X"01",X"D7",X"48",X"06",X"D7",X"68",X"04",X"D7",X"98", + X"02",X"D7",X"B8",X"0F",X"D7",X"E8",X"01",X"A7",X"28",X"06",X"A7",X"78",X"04",X"A7",X"98",X"02", + X"A7",X"B8",X"0F",X"A7",X"E8",X"01",X"77",X"28",X"06",X"77",X"48",X"04",X"77",X"78",X"02",X"77", + X"B8",X"0F",X"77",X"E8",X"01",X"47",X"28",X"06",X"47",X"48",X"04",X"47",X"68",X"02",X"47",X"88", + X"0F",X"47",X"E8",X"FF",X"01",X"A7",X"28",X"05",X"A7",X"38",X"06",X"A7",X"48",X"04",X"A7",X"58", + X"06",X"A7",X"68",X"04",X"A7",X"78",X"05",X"A7",X"88",X"02",X"A7",X"98",X"0F",X"A7",X"E8",X"01", + X"77",X"28",X"05",X"77",X"38",X"04",X"77",X"48",X"06",X"77",X"58",X"04",X"77",X"68",X"05",X"77", + X"78",X"06",X"77",X"88",X"02",X"77",X"98",X"0F",X"77",X"E8",X"FF",X"01",X"D7",X"28",X"06",X"D7", + X"38",X"03",X"D7",X"48",X"02",X"D7",X"68",X"0F",X"D7",X"B8",X"01",X"A7",X"28",X"03",X"A7",X"38", + X"06",X"A7",X"58",X"02",X"A7",X"A8",X"0F",X"A7",X"E8",X"01",X"77",X"28",X"03",X"77",X"78",X"06", + X"77",X"98",X"02",X"77",X"A8",X"0F",X"77",X"E8",X"01",X"47",X"28",X"06",X"47",X"48",X"03",X"47", + X"58",X"02",X"47",X"68",X"0F",X"47",X"B8",X"FF",X"01",X"D7",X"28",X"04",X"D7",X"48",X"02",X"D7", + X"58",X"0F",X"D7",X"88",X"01",X"D7",X"98",X"05",X"D7",X"A8",X"02",X"D7",X"B8",X"0F",X"D7",X"E8", + X"01",X"A7",X"28",X"05",X"A7",X"38",X"02",X"A7",X"58",X"0F",X"A7",X"B8",X"01",X"77",X"28",X"04", + X"77",X"38",X"02",X"77",X"58",X"0F",X"77",X"B8",X"01",X"47",X"28",X"05",X"47",X"48",X"02",X"47", + X"58",X"0F",X"47",X"88",X"01",X"47",X"98",X"04",X"47",X"A8",X"02",X"47",X"B8",X"0F",X"47",X"E8", + X"FF",X"01",X"D7",X"28",X"03",X"D7",X"38",X"05",X"D7",X"48",X"06",X"D7",X"58",X"04",X"D7",X"68", + X"06",X"D7",X"78",X"05",X"D7",X"88",X"02",X"D7",X"98",X"0F",X"D7",X"E8",X"01",X"A7",X"28",X"06", + X"A7",X"38",X"05",X"A7",X"48",X"04",X"A7",X"58",X"05",X"A7",X"68",X"03",X"A7",X"78",X"06",X"A7", + X"88",X"02",X"A7",X"98",X"0F",X"A7",X"E8",X"01",X"77",X"28",X"05",X"77",X"38",X"06",X"77",X"48", + X"05",X"77",X"58",X"04",X"77",X"68",X"03",X"77",X"78",X"06",X"77",X"88",X"02",X"77",X"98",X"0F", + X"77",X"E8",X"01",X"47",X"28",X"03",X"47",X"38",X"06",X"47",X"48",X"04",X"47",X"58",X"05",X"47", + X"68",X"06",X"47",X"78",X"05",X"47",X"88",X"02",X"47",X"98",X"0F",X"47",X"E8",X"FF",X"01",X"D7", + X"38",X"03",X"D7",X"58",X"04",X"D7",X"78",X"02",X"D7",X"B8",X"0F",X"D7",X"E8",X"01",X"A7",X"28", + X"03",X"A7",X"48",X"04",X"A7",X"68",X"03",X"A7",X"88",X"02",X"A7",X"A8",X"0F",X"A7",X"E8",X"01", + X"77",X"38",X"03",X"77",X"58",X"03",X"77",X"78",X"04",X"77",X"98",X"02",X"77",X"B8",X"0F",X"77", + X"E8",X"01",X"47",X"28",X"04",X"47",X"48",X"03",X"47",X"68",X"02",X"47",X"88",X"0F",X"47",X"E8", + X"FF",X"01",X"B9",X"AB",X"9A",X"A9",X"BA",X"9B",X"10",X"05",X"60",X"56",X"75",X"50",X"65",X"06", + X"50",X"03",X"D9",X"C4",X"73",X"C9",X"DC",X"9D",X"30",X"00",X"07",X"3D",X"8C",X"37",X"65",X"06", + X"50",X"01",X"B8",X"C4",X"05",X"57",X"4C",X"9D",X"30",X"05",X"67",X"3D",X"9C",X"C8",X"D3",X"70", + X"00",X"05",X"67",X"56",X"05",X"50",X"4C",X"8B",X"10",X"03",X"D8",X"CD",X"9C",X"C9",X"D3",X"76", + X"50",X"05",X"60",X"56",X"05",X"50",X"65",X"76",X"50",X"03",X"D9",X"CD",X"9C",X"C9",X"DC",X"8D", + X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"B9",X"AB",X"9A",X"A9",X"BA",X"9B", + X"10",X"03",X"D9",X"AB",X"9A",X"A9",X"BA",X"8D",X"30",X"01",X"B9",X"AB",X"9C",X"C9",X"D3",X"76", + X"50",X"03",X"D9",X"AB",X"9A",X"A9",X"B1",X"76",X"50",X"03",X"D9",X"AB",X"9A",X"A9",X"DC",X"8D", + X"30",X"03",X"D9",X"CD",X"9A",X"A9",X"B1",X"76",X"50",X"03",X"D9",X"AB",X"9A",X"A9",X"D3",X"76", + X"50",X"03",X"D9",X"AB",X"9A",X"A9",X"D3",X"76",X"50",X"05",X"60",X"00",X"00",X"00",X"2A",X"8D", + X"30",X"05",X"60",X"00",X"00",X"00",X"65",X"06",X"50",X"05",X"60",X"00",X"00",X"00",X"65",X"06", + X"50",X"03",X"40",X"00",X"00",X"00",X"4C",X"9D",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"B9",X"AB",X"9A",X"A9",X"BA",X"9B",X"10",X"03",X"D8",X"CD",X"8C",X"37",X"65",X"76", + X"50",X"03",X"D8",X"C4",X"73",X"C8",X"DC",X"8D",X"30",X"05",X"67",X"3D",X"8C",X"37",X"4C",X"8D", + X"30",X"03",X"D8",X"CD",X"8C",X"C8",X"DC",X"8D",X"30",X"00",X"00",X"00",X"73",X"C8",X"B1",X"00", + X"00",X"00",X"00",X"1B",X"8C",X"37",X"00",X"00",X"00",X"00",X"00",X"00",X"73",X"C8",X"B1",X"00", + X"00",X"00",X"00",X"1B",X"8C",X"C8",X"B1",X"00",X"00",X"00",X"00",X"00",X"05",X"50",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"B9",X"AB",X"9A",X"A9",X"BA",X"9B", + X"10",X"03",X"D9",X"CD",X"8A",X"A8",X"BA",X"9D",X"30",X"03",X"D9",X"CD",X"9C",X"30",X"4C",X"9D", + X"30",X"03",X"D9",X"AB",X"8C",X"C9",X"DC",X"9D",X"30",X"00",X"00",X"34",X"73",X"C8",X"B1",X"00", + X"00",X"00",X"00",X"3D",X"8C",X"C9",X"D3",X"00",X"00",X"00",X"00",X"34",X"00",X"00",X"65",X"00", + X"00",X"01",X"B9",X"C4",X"00",X"00",X"4C",X"9B",X"10",X"03",X"D8",X"C4",X"00",X"00",X"4C",X"9D", + X"30",X"03",X"D8",X"C4",X"00",X"00",X"4C",X"8D",X"30",X"00",X"00",X"3D",X"9A",X"A9",X"D3",X"00", + X"00",X"00",X"00",X"3D",X"8A",X"A8",X"D3",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"B9",X"AB",X"9A",X"A9",X"BA",X"9B",X"10",X"03",X"D9",X"CD",X"9C",X"C9",X"DC",X"9D", + X"30",X"01",X"B8",X"AB",X"8A",X"A8",X"BA",X"8B",X"10",X"03",X"D9",X"CD",X"9C",X"C9",X"DC",X"9D", + X"30",X"01",X"B8",X"AB",X"8C",X"C8",X"BA",X"8B",X"10",X"03",X"D9",X"CD",X"9C",X"C9",X"DC",X"9D", + X"30",X"03",X"D8",X"AB",X"8A",X"A8",X"BA",X"8D",X"30",X"03",X"D9",X"CD",X"9C",X"C9",X"DC",X"9D", + X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1B",X"9A",X"10",X"2A",X"9B", + X"10",X"01",X"B9",X"C4",X"71",X"A9",X"D3",X"00",X"00",X"00",X"00",X"3D",X"8A",X"17",X"2A",X"9B", + X"10",X"01",X"B9",X"C4",X"73",X"C8",X"D3",X"00",X"00",X"00",X"00",X"1B",X"8C",X"30",X"4C",X"9B", + X"10",X"01",X"B9",X"C4",X"03",X"C9",X"D3",X"00",X"00",X"00",X"00",X"3D",X"9A",X"17",X"2A",X"9B", + X"10",X"01",X"B9",X"C4",X"73",X"C8",X"D3",X"00",X"00",X"00",X"00",X"1B",X"8A",X"17",X"4C",X"9B", + X"10",X"01",X"B9",X"C4",X"03",X"C8",X"D3",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"85",X"F5",X"EA",X"A9",X"00",X"85",X"F3",X"85",X"F5",X"EA",X"A9",X"00",X"85",X"ED",X"4D", + X"36",X"85",X"E4",X"A9",X"00",X"85",X"E5",X"85",X"F5",X"EA",X"A0",X"02",X"85",X"F5",X"EA",X"B1", + X"E4",X"99",X"E7",X"00",X"88",X"10",X"F8",X"A5",X"E7",X"C9",X"FF",X"D0",X"04",X"60",X"85",X"F5", + X"EA",X"A5",X"E4",X"18",X"69",X"03",X"85",X"E4",X"A5",X"E5",X"69",X"00",X"85",X"E5",X"E6",X"ED", + X"F8",X"A5",X"E7",X"38",X"E5",X"CC",X"A5",X"E8",X"E5",X"CD",X"A5",X"E9",X"E5",X"CE",X"D8",X"B0", + X"C9",X"A6",X"ED",X"BD",X"7E",X"F0",X"18",X"69",X"36",X"85",X"D8",X"A9",X"00",X"85",X"D9",X"A9", + X"02",X"85",X"DA",X"20",X"8C",X"F0",X"A2",X"02",X"85",X"F5",X"EA",X"A9",X"00",X"95",X"CC",X"CA", + X"10",X"F9",X"A6",X"ED",X"BD",X"84",X"F0",X"18",X"69",X"36",X"85",X"D8",X"A9",X"00",X"85",X"D9", + X"A9",X"02",X"85",X"DA",X"20",X"8C",X"F0",X"20",X"D1",X"F0",X"20",X"E3",X"CB",X"60",X"00",X"00", + X"03",X"06",X"09",X"0C",X"00",X"12",X"15",X"18",X"1B",X"1E",X"85",X"F5",X"EA",X"A4",X"DA",X"85", + X"F5",X"EA",X"B1",X"D8",X"99",X"EA",X"00",X"88",X"10",X"F8",X"A5",X"EA",X"C9",X"FF",X"D0",X"04", + X"60",X"85",X"F5",X"EA",X"A4",X"DA",X"85",X"F5",X"EA",X"B9",X"CC",X"00",X"91",X"D8",X"88",X"10", + X"F8",X"A6",X"DA",X"85",X"F5",X"EA",X"B5",X"EA",X"95",X"CC",X"CA",X"10",X"F9",X"A6",X"DA",X"E8", + X"8A",X"18",X"65",X"D8",X"85",X"D8",X"A5",X"D9",X"69",X"00",X"85",X"D9",X"4C",X"8D",X"F0",X"85", + X"F5",X"EA",X"20",X"A3",X"C8",X"20",X"DC",X"F1",X"20",X"F8",X"F2",X"A9",X"05",X"85",X"DC",X"85", + X"F5",X"EA",X"A5",X"DC",X"18",X"69",X"03",X"85",X"DD",X"0A",X"18",X"65",X"DD",X"AA",X"A5",X"DC", + X"0A",X"18",X"69",X"10",X"A8",X"20",X"5A",X"C9",X"C6",X"DC",X"10",X"E6",X"A9",X"04",X"85",X"DC", + X"20",X"B6",X"F1",X"A9",X"00",X"85",X"DE",X"4D",X"07",X"85",X"DF",X"A9",X"06",X"85",X"E0",X"4D", + X"00",X"85",X"E1",X"85",X"E2",X"C1",X"E3",X"C1",X"F5",X"EA",X"20",X"B8",X"F2",X"20",X"D1",X"F2", + X"A5",X"E2",X"29",X"0F",X"C9",X"0F",X"D0",X"0C",X"20",X"B8",X"F2",X"A9",X"00",X"8D",X"03",X"40", + X"60",X"85",X"F5",X"EA",X"A5",X"E2",X"10",X"15",X"A5",X"E3",X"30",X"11",X"A9",X"FF",X"85",X"DE", + X"A5",X"E3",X"09",X"80",X"85",X"E3",X"4D",X"00",X"85",X"DF",X"85",X"F5",X"6E",X"A5",X"DE",X"05", + X"DF",X"D0",X"12",X"A5",X"E2",X"10",X"07",X"09",X"0F",X"85",X"E2",X"85",X"F5",X"6E",X"09",X"80", + X"85",X"E2",X"85",X"F5",X"6E",X"20",X"2F",X"F3",X"20",X"7C",X"F3",X"20",X"E9",X"F3",X"20",X"2F", + X"F4",X"20",X"9C",X"F5",X"A5",X"E2",X"29",X"20",X"F0",X"1D",X"20",X"DC",X"F1",X"20",X"B6",X"F1", + X"20",X"F8",X"F2",X"A5",X"E2",X"49",X"20",X"AA",X"A5",X"E3",X"29",X"40",X"D0",X"04",X"E8",X"85", + X"F5",X"EA",X"86",X"E2",X"C1",X"F5",X"6E",X"20",X"3E",X"F6",X"A5",X"E3",X"29",X"BF",X"85",X"E3", + X"A5",X"E2",X"29",X"0F",X"C9",X"03",X"90",X"09",X"A5",X"E3",X"09",X"20",X"85",X"E3",X"C1",X"F5", + X"EA",X"4C",X"1A",X"F1",X"85",X"F5",X"6E",X"A9",X"B4",X"8D",X"02",X"18",X"4D",X"40",X"8D",X"03", + X"18",X"A9",X"47",X"8D",X"01",X"18",X"4D",X"01",X"8D",X"00",X"18",X"A9",X"00",X"8D",X"04",X"18", + X"85",X"EE",X"85",X"EF",X"4D",X"17",X"8D",X"05",X"18",X"60",X"85",X"F5",X"6E",X"A9",X"08",X"85", + X"DD",X"85",X"F5",X"EA",X"A5",X"DD",X"0A",X"AA",X"BD",X"12",X"F2",X"85",X"D8",X"DD",X"24",X"F2", + X"85",X"DA",X"E8",X"BD",X"12",X"F2",X"85",X"D9",X"BD",X"24",X"F2",X"85",X"DB",X"CA",X"DD",X"BD", + X"36",X"F2",X"A8",X"85",X"F5",X"EA",X"B1",X"D8",X"91",X"DA",X"88",X"10",X"F9",X"C6",X"DD",X"10", + X"D3",X"60",X"3F",X"F2",X"52",X"F2",X"65",X"F2",X"78",X"F2",X"83",X"F2",X"92",X"F2",X"9B",X"F2", + X"A4",X"F2",X"AD",X"F2",X"A8",X"10",X"08",X"11",X"68",X"11",X"C8",X"11",X"4B",X"12",X"D4",X"18", + X"14",X"1B",X"34",X"1B",X"54",X"1B",X"12",X"12",X"12",X"0A",X"0E",X"08",X"08",X"08",X"08",X"0B", + X"00",X"0C",X"00",X"0D",X"00",X"0E",X"00",X"0F",X"00",X"10",X"00",X"11",X"00",X"12",X"00",X"13", + X"00",X"14",X"15",X"00",X"16",X"00",X"17",X"00",X"18",X"00",X"19",X"00",X"1A",X"00",X"1B",X"00", + X"1C",X"00",X"1D",X"00",X"1E",X"1F",X"00",X"20",X"00",X"21",X"00",X"22",X"00",X"23",X"00",X"24", + X"00",X"CC",X"00",X"CD",X"00",X"CE",X"00",X"CF",X"1D",X"1A",X"0B",X"00",X"1C",X"1F",X"0C",X"00", + X"0F",X"18",X"0E",X"3C",X"2F",X"3B",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"41",X"31",X"3D", + X"40",X"33",X"26",X"00",X"27",X"00",X"28",X"00",X"29",X"00",X"2A",X"3E",X"00",X"3E",X"00",X"3E", + X"00",X"3E",X"00",X"3E",X"42",X"00",X"42",X"00",X"42",X"00",X"42",X"00",X"42",X"41",X"00",X"41", + X"00",X"41",X"00",X"41",X"00",X"41",X"85",X"F5",X"EA",X"AD",X"03",X"40",X"10",X"FB",X"85",X"F5", + X"EA",X"AD",X"03",X"40",X"30",X"FB",X"58",X"EA",X"EA",X"EA",X"78",X"20",X"45",X"D0",X"60",X"85", + X"F5",X"EA",X"A5",X"DE",X"38",X"E9",X"01",X"85",X"DE",X"A5",X"DF",X"E9",X"00",X"85",X"DF",X"C6", + X"E0",X"10",X"07",X"A9",X"04",X"85",X"E0",X"85",X"F5",X"EA",X"C6",X"E1",X"10",X"07",X"A9",X"00", + X"85",X"E1",X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"A9",X"8B",X"85",X"D8",X"A9",X"12",X"85", + X"D9",X"A2",X"00",X"85",X"F5",X"6E",X"A0",X"00",X"85",X"F5",X"EA",X"B5",X"48",X"91",X"D8",X"6C", + X"E0",X"0F",X"D0",X"04",X"60",X"85",X"F5",X"6E",X"C8",X"C0",X"03",X"D0",X"EE",X"A5",X"D8",X"18", + X"69",X"40",X"85",X"D8",X"C9",X"D9",X"69",X"00",X"85",X"D9",X"4C",X"06",X"F3",X"85",X"F5",X"6E", + X"A5",X"E0",X"D0",X"45",X"A5",X"E2",X"29",X"10",X"4A",X"4A",X"4A",X"4A",X"18",X"69",X"43",X"8D", + X"01",X"18",X"A5",X"E2",X"10",X"2A",X"C6",X"DC",X"F0",X"07",X"A9",X"47",X"D0",X"1C",X"85",X"F5", + X"EA",X"E6",X"F3",X"A5",X"F3",X"C9",X"01",X"D0",X"08",X"A9",X"1E",X"8D",X"03",X"40",X"C1",X"F5", + X"EA",X"A9",X"03",X"85",X"DC",X"4D",X"4C",X"85",X"F5",X"EA",X"8D",X"01",X"18",X"C1",X"F5",X"6E", + X"A5",X"E2",X"49",X"10",X"85",X"E2",X"C1",X"F5",X"EA",X"60",X"85",X"F5",X"6E",X"AD",X"02",X"40", + X"49",X"FF",X"29",X"03",X"F0",X"08",X"BA",X"E8",X"E8",X"9A",X"60",X"85",X"F5",X"6E",X"A5",X"E0", + X"D0",X"42",X"A5",X"E2",X"29",X"E0",X"D0",X"3C",X"A6",X"CB",X"AD",X"03",X"40",X"29",X"40",X"D0", + X"05",X"A2",X"00",X"85",X"F5",X"6E",X"BD",X"00",X"40",X"49",X"FF",X"29",X"0F",X"AA",X"BD",X"D5", + X"F3",X"C5",X"EF",X"F0",X"1F",X"85",X"EF",X"14",X"65",X"EE",X"10",X"05",X"A9",X"00",X"85",X"F5", + X"EA",X"C9",X"24",X"90",X"05",X"A9",X"23",X"85",X"F5",X"EA",X"85",X"EE",X"4D",X"15",X"8D",X"03", + X"40",X"85",X"F5",X"EA",X"60",X"00",X"01",X"FF",X"00",X"F6",X"00",X"00",X"00",X"0A",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"85",X"F5",X"EA",X"A5",X"E2",X"29",X"E0",X"D0",X"32", + X"A2",X"78",X"A5",X"EE",X"C9",X"1E",X"B0",X"11",X"A2",X"60",X"C9",X"14",X"B0",X"0B",X"A2",X"48", + X"C9",X"0A",X"B0",X"05",X"A2",X"30",X"85",X"F5",X"EA",X"8E",X"03",X"18",X"A5",X"EE",X"38",X"85", + X"F5",X"EA",X"E9",X"0A",X"B0",X"FC",X"69",X"0A",X"AA",X"BD",X"23",X"F4",X"8D",X"02",X"18",X"85", + X"F5",X"EA",X"60",X"B4",X"A4",X"94",X"84",X"74",X"64",X"54",X"44",X"34",X"24",X"85",X"F5",X"EA", + X"A5",X"E1",X"D0",X"4F",X"A5",X"E2",X"29",X"E0",X"D0",X"49",X"A6",X"CB",X"AD",X"03",X"40",X"29", + X"40",X"D0",X"05",X"A2",X"00",X"85",X"F5",X"EA",X"BD",X"00",X"40",X"49",X"FF",X"29",X"10",X"F0", + X"32",X"A5",X"E2",X"29",X"03",X"C9",X"03",X"F0",X"06",X"A9",X"11",X"8D",X"03",X"40",X"EA",X"A5", + X"EE",X"C9",X"1E",X"90",X"22",X"38",X"E9",X"1E",X"0A",X"AA",X"BD",X"EB",X"F4",X"85",X"D8",X"BD", + X"EC",X"F4",X"85",X"D9",X"A9",X"3F",X"85",X"E1",X"A9",X"17",X"8D",X"03",X"40",X"6C",X"D8",X"00", + X"85",X"F5",X"EA",X"60",X"85",X"F5",X"EA",X"A5",X"E3",X"29",X"20",X"D0",X"F6",X"A9",X"60",X"85", + X"D9",X"A6",X"EE",X"E0",X"1A",X"90",X"15",X"E0",X"1E",X"B0",X"11",X"8A",X"E9",X"18",X"AA",X"A9", + X"50",X"85",X"D8",X"A9",X"66",X"85",X"D9",X"D0",X"0A",X"85",X"F5",X"EA",X"A9",X"50",X"85",X"D8", + X"85",X"F5",X"EA",X"A5",X"D8",X"18",X"69",X"08",X"85",X"D8",X"A5",X"D9",X"69",X"00",X"85",X"D9", + X"CA",X"10",X"F0",X"85",X"F5",X"EA",X"A9",X"E0",X"85",X"DA",X"A9",X"62",X"85",X"DB",X"20",X"4B", + X"F5",X"20",X"35",X"F5",X"A9",X"01",X"8D",X"04",X"18",X"20",X"71",X"F5",X"A9",X"00",X"A8",X"91", + X"D8",X"A5",X"E2",X"09",X"40",X"85",X"E2",X"85",X"F5",X"EA",X"60",X"FA",X"F4",X"FA",X"F4",X"16", + X"F5",X"16",X"F5",X"0C",X"F5",X"0C",X"F5",X"85",X"F5",X"EA",X"A5",X"E3",X"29",X"20",X"D0",X"EA", + X"A9",X"F5",X"85",X"EE",X"CA",X"ED",X"4C",X"09",X"F6",X"85",X"F5",X"EA",X"A5",X"E2",X"09",X"80", + X"85",X"E2",X"60",X"85",X"F5",X"6E",X"A5",X"E2",X"29",X"0F",X"F0",X"16",X"C6",X"E2",X"4D",X"F5", + X"85",X"EE",X"A6",X"ED",X"20",X"08",X"F6",X"A5",X"E3",X"09",X"40",X"29",X"DF",X"85",X"E3",X"C1", + X"F5",X"EA",X"60",X"85",X"F5",X"6E",X"AD",X"02",X"18",X"38",X"E9",X"04",X"8D",X"06",X"18",X"CD", + X"03",X"18",X"38",X"E9",X"08",X"8D",X"07",X"18",X"60",X"85",X"F5",X"EA",X"A2",X"02",X"85",X"F5", + X"EA",X"A0",X"07",X"85",X"F5",X"6E",X"B1",X"D8",X"91",X"DA",X"88",X"10",X"F9",X"A5",X"D9",X"18", + X"69",X"20",X"85",X"D9",X"C9",X"DB",X"18",X"69",X"20",X"85",X"DB",X"CA",X"10",X"E3",X"60",X"85", + X"F5",X"EA",X"AD",X"07",X"18",X"85",X"D9",X"CD",X"06",X"18",X"49",X"FF",X"85",X"D8",X"A2",X"D9", + X"46",X"D9",X"46",X"D9",X"A2",X"D9",X"AA",X"D8",X"46",X"D9",X"66",X"D8",X"A2",X"D9",X"AA",X"D8", + X"A5",X"D9",X"18",X"69",X"10",X"85",X"D9",X"E2",X"D8",X"60",X"85",X"F5",X"6E",X"A5",X"E2",X"29", + X"E0",X"C9",X"40",X"F0",X"04",X"60",X"85",X"F5",X"EA",X"A9",X"9B",X"85",X"D8",X"C9",X"E2",X"29", + X"0F",X"F0",X"11",X"AA",X"85",X"F5",X"6E",X"A5",X"D8",X"38",X"E9",X"08",X"85",X"D8",X"66",X"D0", + X"F6",X"85",X"F5",X"EA",X"A6",X"ED",X"BD",X"00",X"F6",X"85",X"D9",X"A5",X"D8",X"CD",X"02",X"18", + X"F0",X"10",X"90",X"08",X"EE",X"02",X"18",X"70",X"09",X"85",X"F5",X"EA",X"CE",X"02",X"18",X"C1", + X"F5",X"EA",X"A5",X"D9",X"CD",X"03",X"18",X"F0",X"0D",X"EE",X"03",X"18",X"C1",X"F5",X"6E",X"20", + X"35",X"F5",X"60",X"85",X"F5",X"6E",X"A5",X"D8",X"CD",X"02",X"18",X"F0",X"0C",X"4C",X"EF",X"F5", + X"00",X"A8",X"B8",X"C8",X"D8",X"E8",X"85",X"F5",X"EA",X"A5",X"E2",X"09",X"20",X"29",X"BF",X"85", + X"E2",X"BD",X"84",X"F0",X"18",X"69",X"36",X"85",X"D8",X"A9",X"00",X"85",X"D9",X"A5",X"E2",X"29", + X"0F",X"A8",X"A5",X"EE",X"C9",X"1A",X"90",X"0B",X"C9",X"1E",X"B0",X"07",X"69",X"B2",X"30",X"09", + X"85",X"F5",X"EA",X"18",X"69",X"0B",X"85",X"F5",X"EA",X"91",X"D8",X"60",X"85",X"F5",X"EA",X"A5", + X"E2",X"10",X"18",X"A9",X"D0",X"8D",X"02",X"18",X"A6",X"ED",X"BD",X"00",X"F6",X"38",X"E9",X"0C", + X"8D",X"03",X"18",X"A9",X"00",X"8D",X"04",X"18",X"85",X"F5",X"EA",X"60",X"45",X"09",X"41",X"54", + X"32",X"30",X"37",X"30",X"09",X"2F",X"20",X"4B",X"4F",X"52",X"45",X"4B",X"41",X"52",X"41",X"20", + X"44",X"49",X"53",X"50",X"2E",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"0D",X"0A",X"09",X"4A",X"4D",X"50",X"09",X"41",X"54",X"32",X"30",X"33",X"30",X"0D", + X"0A",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"44",X"55",X"4D",X"59",X"50",X"0D",X"0A",X"09", + X"4E",X"4F",X"50",X"0D",X"0A",X"41",X"54",X"32",X"30",X"37",X"30",X"09",X"4C",X"44",X"58",X"09", + X"23",X"3E",X"54",X"45",X"4B",X"4E",X"41",X"4D",X"20",X"20",X"20",X"20",X"2F",X"20",X"54",X"45", + X"4B",X"49",X"20",X"4E",X"41",X"4D",X"45",X"20",X"44",X"49",X"53",X"50",X"4C",X"41",X"59",X"2E", + X"20",X"53",X"54",X"4F",X"50",X"20",X"4D",X"4F",X"54",X"49",X"4F",X"4E",X"0D",X"0A",X"09",X"4C", + X"44",X"59",X"09",X"23",X"3C",X"54",X"45",X"4B",X"4E",X"41",X"4D",X"0D",X"0A",X"09",X"4A",X"53", + X"52",X"09",X"43",X"48",X"52",X"4F",X"55",X"54",X"2D",X"31",X"09",X"2F",X"20",X"44",X"49",X"53", + X"50",X"4C",X"41",X"59",X"20",X"4F",X"55",X"54",X"0D",X"0A",X"09",X"09",X"09",X"2F",X"20",X"4D", + X"52",X"2E",X"48",X"4F",X"54",X"20",X"44",X"4F",X"47",X"2C",X"4D",X"52",X"2E",X"50",X"49",X"43", + X"4B",X"4C",X"45",X"2C",X"4D",X"52",X"2E",X"45",X"47",X"47",X"0D",X"0A",X"09",X"4C",X"44",X"58", + X"09",X"23",X"30",X"46",X"46",X"0D",X"0A",X"09",X"4A",X"53",X"52",X"09",X"57",X"41",X"49",X"54", + X"45",X"2D",X"31",X"09",X"20",X"20",X"20",X"20",X"20",X"20",X"0D",X"0A",X"09",X"4C",X"44",X"41", + X"09",X"23",X"30",X"30",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"46",X"4C",X"47",X"46",X"4C", + X"47",X"09",X"20",X"20",X"20",X"2F",X"20",X"4E",X"41",X"4D",X"45",X"20",X"44",X"49",X"53",X"50", + X"2E",X"20",X"45",X"4E",X"44",X"0D",X"0A",X"09",X"4A",X"4D",X"50",X"09",X"41",X"54",X"32",X"30", + X"30",X"30",X"0D",X"0A",X"0D",X"0A",X"54",X"45",X"4B",X"4E",X"41",X"4D",X"09",X"45",X"51",X"55", + X"09",X"2E",X"0D",X"0A",X"09",X"44",X"46",X"41",X"09",X"31",X"31",X"38",X"36",X"09",X"09",X"2F", + X"20",X"4D",X"52",X"2E",X"48",X"4F",X"54",X"44",X"4F",X"47",X"0D",X"0A",X"09",X"44",X"46",X"43", + X"09",X"33",X"42",X"2C",X"34",X"30",X"2C",X"36",X"30",X"2C",X"33",X"36",X"2C",X"33",X"44",X"2C", + X"34",X"32",X"2C",X"30",X"30",X"2C",X"33",X"32",X"0D",X"0A",X"09",X"44",X"46",X"43",X"09",X"33", + X"44",X"2C",X"33",X"35",X"2C",X"36",X"31",X"2C",X"36",X"32",X"2C",X"30",X"46",X"45",X"0D",X"0A", + X"09",X"44",X"46",X"41",X"09",X"31",X"35",X"38",X"36",X"0D",X"0A",X"09",X"44",X"46",X"43",X"09", + X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30", + X"30",X"2C",X"30",X"30",X"2C",X"30",X"30",X"0D",X"0A",X"09",X"44",X"46",X"43",X"09",X"30",X"30", + X"2C",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"46",X"45",X"0D",X"0A",X"0D", + X"0A",X"09",X"44",X"46",X"41",X"09",X"31",X"30",X"43",X"45",X"09",X"09",X"2F",X"20",X"4D",X"52", + X"2E",X"50",X"49",X"43",X"4B",X"4C",X"45",X"0D",X"0A",X"09",X"44",X"46",X"43",X"09",X"33",X"42", + X"2C",X"34",X"30",X"2C",X"36",X"30",X"2C",X"33",X"45",X"2C",X"33",X"37",X"2C",X"33",X"31",X"2C", + X"33",X"39",X"2C",X"33",X"41",X"0D",X"0A",X"09",X"44",X"46",X"43",X"09",X"33",X"33",X"2C",X"36", + X"31",X"2C",X"36",X"32",X"2C",X"30",X"46",X"45",X"0D",X"0A",X"09",X"44",X"46",X"41",X"09",X"31", + X"34",X"43",X"45",X"0D",X"0A",X"09",X"44",X"46",X"43",X"09",X"30",X"30",X"2C",X"30",X"30",X"2C", + X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30", + X"30",X"0D",X"0A",X"09",X"44",X"46",X"43",X"09",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"30", + X"2C",X"30",X"46",X"45",X"0D",X"0A",X"0D",X"0A",X"09",X"44",X"46",X"41",X"09",X"31",X"31",X"35", + X"36",X"09",X"09",X"2F",X"20",X"4D",X"52",X"2E",X"45",X"47",X"47",X"0D",X"0A",X"09",X"44",X"46", + X"43",X"09",X"33",X"42",X"2C",X"34",X"30",X"2C",X"36",X"30",X"2C",X"33",X"33",X"2C",X"33",X"35", + X"2C",X"33",X"35",X"2C",X"36",X"31",X"2C",X"36",X"32",X"2C",X"30",X"46",X"45",X"0D",X"0A",X"09", + X"44",X"46",X"41",X"09",X"31",X"35",X"35",X"36",X"0D",X"0A",X"09",X"44",X"46",X"43",X"09",X"30", + X"30",X"2C",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"30", + X"2C",X"30",X"30",X"2C",X"30",X"30",X"2C",X"30",X"46",X"46",X"0D",X"0A",X"0D",X"0A",X"2F",X"0D", + X"0A",X"2F",X"2A",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D", + X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D", + X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D", + X"2D",X"2A",X"0D",X"0A",X"2F",X"2A",X"09",X"50",X"45",X"50",X"50",X"45",X"52",X"20",X"26",X"20", + X"54",X"45",X"4B",X"49",X"20",X"4C",X"41",X"4B",X"4B",X"41",X"20",X"41",X"54",X"52",X"41",X"43", + X"54",X"49",X"4F",X"4E",X"09",X"09",X"2A",X"0D",X"0A",X"2F",X"2A",X"2D",X"2D",X"2D",X"2D",X"2D", + X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D", + X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D", + X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2A",X"0D",X"0A",X"2F",X"0D",X"0A",X"09", + X"53",X"54",X"41",X"09",X"44",X"55",X"4D",X"59",X"50",X"09",X"2F",X"20",X"44",X"55",X"4D",X"4D", + X"59",X"20",X"57",X"52",X"49",X"54",X"45",X"0D",X"0A",X"09",X"4E",X"4F",X"50",X"09",X"09",X"2F", + X"20",X"44",X"55",X"4D",X"4D",X"59",X"20",X"4E",X"4F",X"50",X"0D",X"0A",X"41",X"54",X"52",X"43", + X"54",X"33",X"09",X"45",X"51",X"55",X"09",X"2E",X"0D",X"0A",X"09",X"4A",X"53",X"52",X"09",X"47", + X"41",X"4D",X"49",X"4E",X"4C",X"2D",X"31",X"0D",X"0A",X"09",X"4A",X"53",X"52",X"09",X"52",X"4E", + X"44",X"49",X"4E",X"4C",X"2D",X"31",X"0D",X"0A",X"2F",X"0D",X"0A",X"09",X"4C",X"44",X"59",X"09", + X"23",X"30",X"31",X"0D",X"0A",X"09",X"53",X"54",X"59",X"09",X"4C",X"49",X"56",X"45",X"2B",X"30", + X"0D",X"0A",X"09",X"53",X"54",X"59",X"09",X"4C",X"49",X"56",X"45",X"2B",X"31",X"0D",X"0A",X"09", + X"49",X"4E",X"59",X"0D",X"0A",X"09",X"53",X"54",X"59",X"09",X"4C",X"49",X"56",X"45",X"2B",X"32", + X"0D",X"0A",X"09",X"53",X"54",X"59",X"09",X"4C",X"49",X"56",X"45",X"2B",X"33",X"0D",X"0A",X"09", + X"49",X"4E",X"59",X"0D",X"0A",X"09",X"53",X"54",X"59",X"09",X"4C",X"49",X"56",X"45",X"2B",X"34", + X"0D",X"0A",X"09",X"53",X"54",X"59",X"09",X"4C",X"49",X"56",X"45",X"2B",X"35",X"0D",X"0A",X"2F", + X"0D",X"0A",X"09",X"4C",X"44",X"41",X"09",X"23",X"31",X"44",X"0D",X"0A",X"09",X"53",X"54",X"41", + X"09",X"30",X"31",X"38",X"30",X"33",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"30",X"31",X"38", + X"30",X"37",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"30",X"31",X"38",X"30",X"42",X"0D",X"0A", + X"09",X"53",X"54",X"41",X"09",X"30",X"31",X"38",X"30",X"46",X"0D",X"0A",X"09",X"53",X"54",X"41", + X"09",X"30",X"31",X"38",X"31",X"33",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"30",X"31",X"38", + X"31",X"37",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"30",X"31",X"38",X"31",X"46",X"0D",X"0A", + X"2F",X"0D",X"0A",X"09",X"4C",X"44",X"41",X"09",X"23",X"34",X"30",X"0D",X"0A",X"09",X"53",X"54", + X"41",X"09",X"44",X"49",X"52",X"45",X"43",X"54",X"2B",X"30",X"0D",X"0A",X"09",X"53",X"54",X"41", + X"09",X"44",X"49",X"52",X"45",X"43",X"54",X"2B",X"31",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09", + X"44",X"49",X"52",X"45",X"43",X"54",X"2B",X"32",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"44", + X"49",X"52",X"45",X"43",X"54",X"2B",X"33",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"44",X"49", + X"52",X"45",X"43",X"54",X"2B",X"34",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"44",X"49",X"52", + X"45",X"43",X"54",X"2B",X"35",X"0D",X"0A",X"2F",X"0D",X"0A",X"09",X"4C",X"44",X"41",X"09",X"23", + X"38",X"39",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"30",X"31",X"38",X"30",X"32",X"0D",X"0A", + X"09",X"4C",X"44",X"41",X"09",X"23",X"35",X"39",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"30", + X"31",X"38",X"30",X"36",X"0D",X"0A",X"09",X"4C",X"44",X"41",X"09",X"23",X"36",X"30",X"0D",X"0A", + X"09",X"53",X"54",X"41",X"09",X"30",X"31",X"38",X"30",X"41",X"0D",X"0A",X"09",X"4C",X"44",X"41", + X"09",X"23",X"39",X"30",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"30",X"31",X"38",X"30",X"45", + X"0D",X"0A",X"09",X"4C",X"44",X"41",X"09",X"23",X"39",X"37",X"0D",X"0A",X"09",X"53",X"54",X"41", + X"09",X"30",X"31",X"38",X"31",X"32",X"0D",X"0A",X"09",X"4C",X"44",X"41",X"09",X"23",X"33",X"30", + X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"30",X"31",X"38",X"31",X"36",X"0D",X"0A",X"09",X"4C", + X"44",X"41",X"09",X"23",X"31",X"38",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"30",X"31",X"38", + X"31",X"45",X"0D",X"0A",X"2F",X"09",X"0D",X"0A",X"09",X"4C",X"44",X"41",X"09",X"23",X"30",X"31", + X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"54",X"49",X"4D",X"45",X"52",X"31",X"0D",X"0A",X"09", + X"53",X"54",X"41",X"09",X"54",X"49",X"4D",X"45",X"52",X"32",X"0D",X"0A",X"2F",X"0D",X"0A",X"09", + X"4A",X"53",X"52",X"09",X"54",X"45",X"4B",X"4D",X"4F",X"56",X"2D",X"31",X"09",X"2F",X"20",X"54", + X"45",X"4B",X"49",X"20",X"44",X"49",X"53",X"50",X"4C",X"41",X"59",X"0D",X"0A",X"2F",X"0D",X"0A", + X"09",X"53",X"54",X"41",X"09",X"44",X"55",X"4D",X"59",X"50",X"09",X"2F",X"20",X"44",X"55",X"4D", + X"4D",X"59",X"20",X"57",X"52",X"49",X"54",X"45",X"0D",X"0A",X"09",X"4E",X"4F",X"50",X"09",X"09", + X"2F",X"20",X"44",X"55",X"4D",X"4D",X"59",X"20",X"4E",X"4F",X"50",X"0D",X"0A",X"41",X"54",X"33", + X"30",X"33",X"30",X"09",X"45",X"51",X"55",X"09",X"2E",X"0D",X"0A",X"09",X"4C",X"44",X"58",X"09", + X"23",X"30",X"31",X"0D",X"0A",X"09",X"4A",X"53",X"52",X"09",X"57",X"41",X"49",X"54",X"45",X"2D", + X"31",X"0D",X"0A",X"09",X"49",X"4E",X"43",X"09",X"54",X"49",X"4D",X"45",X"52",X"31",X"0D",X"0A", + X"09",X"42",X"4E",X"45",X"09",X"2E",X"2B",X"35",X"0D",X"0A",X"09",X"49",X"4E",X"43",X"09",X"54", + X"49",X"4D",X"45",X"52",X"32",X"0D",X"0A",X"09",X"4E",X"4F",X"50",X"0D",X"0A",X"2F",X"0D",X"0A", + X"09",X"4C",X"44",X"58",X"09",X"23",X"30",X"37",X"0D",X"0A",X"09",X"4A",X"53",X"52",X"09",X"4C", + X"49",X"4D",X"49",X"54",X"2D",X"31",X"0D",X"0A",X"09",X"42",X"45",X"51",X"09",X"41",X"54",X"33", + X"30",X"34",X"30",X"0D",X"0A",X"09",X"4C",X"44",X"41",X"09",X"54",X"49",X"4D",X"45",X"52",X"32", + X"0D",X"0A",X"09",X"43",X"4D",X"50",X"09",X"23",X"30",X"34",X"0D",X"0A",X"09",X"42",X"43",X"43", + X"09",X"41",X"54",X"33",X"30",X"36",X"30",X"0D",X"0A",X"09",X"0D",X"0A",X"09",X"4C",X"44",X"58", + X"09",X"23",X"3E",X"50",X"45",X"50",X"4D",X"53",X"47",X"0D",X"0A",X"09",X"4C",X"44",X"59",X"09", + X"23",X"3C",X"50",X"45",X"50",X"4D",X"53",X"47",X"0D",X"0A",X"09",X"4A",X"53",X"52",X"09",X"43", + X"48",X"52",X"4F",X"55",X"54",X"2D",X"31",X"20",X"20",X"20",X"2F",X"20",X"50",X"45",X"50",X"50", + X"45",X"52",X"20",X"53",X"45",X"54",X"53",X"55",X"4D",X"45",X"49",X"20",X"44",X"49",X"53",X"50", + X"4C",X"41",X"59",X"0D",X"0A",X"09",X"4C",X"44",X"58",X"09",X"23",X"30",X"46",X"46",X"0D",X"0A", + X"09",X"4A",X"53",X"52",X"09",X"57",X"41",X"49",X"54",X"45",X"2D",X"31",X"0D",X"0A",X"09",X"4C", + X"44",X"58",X"09",X"23",X"30",X"34",X"30",X"0D",X"0A",X"09",X"4A",X"53",X"52",X"09",X"57",X"41", + X"49",X"54",X"45",X"2D",X"31",X"0D",X"0A",X"09",X"52",X"54",X"53",X"0D",X"0A",X"0D",X"0A",X"09", + X"53",X"54",X"41",X"09",X"44",X"55",X"4D",X"59",X"50",X"09",X"2F",X"20",X"44",X"55",X"4D",X"4D", + X"59",X"20",X"57",X"52",X"49",X"54",X"45",X"0D",X"0A",X"09",X"4E",X"4F",X"50",X"09",X"09",X"2F", + X"20",X"44",X"55",X"4D",X"4D",X"59",X"20",X"4E",X"4F",X"50",X"0D",X"0A",X"41",X"54",X"33",X"30", + X"34",X"30",X"09",X"4C",X"44",X"41",X"09",X"4C",X"49",X"56",X"45",X"2B",X"36",X"0D",X"0A",X"09", + X"42",X"50",X"4C",X"09",X"41",X"54",X"33",X"30",X"36",X"30",X"0D",X"0A",X"20",X"20",X"20",X"20", + X"20",X"20",X"09",X"4C",X"44",X"58",X"09",X"23",X"30",X"37",X"0D",X"0A",X"09",X"4A",X"53",X"52", + X"09",X"53",X"50",X"52",X"4D",X"4F",X"56",X"2D",X"31",X"0D",X"0A",X"2F",X"0D",X"0A",X"09",X"4C", + X"44",X"41",X"09",X"30",X"31",X"38",X"31",X"45",X"0D",X"0A",X"09",X"43",X"4D",X"50",X"09",X"23", + X"32",X"32",X"0D",X"0A",X"09",X"42",X"45",X"51",X"09",X"41",X"54",X"33",X"30",X"35",X"30",X"09", + X"2F",X"20",X"50",X"45",X"50",X"50",X"45",X"52",X"20",X"4F",X"4E",X"0D",X"0A",X"09",X"43",X"4D", + X"50",X"09",X"23",X"34",X"41",X"0D",X"0A",X"09",X"42",X"45",X"51",X"09",X"41",X"54",X"33",X"30", + X"35",X"30",X"0D",X"0A",X"09",X"43",X"4D",X"50",X"09",X"23",X"38",X"32",X"0D",X"0A",X"09",X"42", + X"4E",X"45",X"09",X"41",X"54",X"33",X"30",X"36",X"30",X"0D",X"0A",X"09",X"53",X"54",X"41",X"09", + X"44",X"55",X"4D",X"59",X"50",X"09",X"2F",X"20",X"44",X"55",X"4D",X"4D",X"59",X"20",X"57",X"52", + X"49",X"54",X"45",X"0D",X"0A",X"09",X"4E",X"4F",X"50",X"09",X"09",X"2F",X"20",X"44",X"55",X"4D", + X"4D",X"59",X"20",X"4E",X"4F",X"50",X"0D",X"0A",X"41",X"54",X"33",X"30",X"35",X"30",X"09",X"4A", + X"53",X"52",X"09",X"43",X"4F",X"4B",X"50",X"50",X"53",X"2D",X"31",X"09",X"2F",X"20",X"50",X"45", + X"50",X"50",X"45",X"52",X"20",X"53",X"45",X"54",X"0D",X"0A",X"09",X"49",X"4E",X"43",X"09",X"30", + X"31",X"38",X"31",X"45",X"0D",X"0A",X"09",X"49",X"4E",X"43",X"09",X"30",X"31",X"38",X"31",X"45", + X"0D",X"0A",X"09",X"53",X"54",X"41",X"09",X"44",X"55",X"4D",X"59",X"50",X"09",X"2F",X"20",X"44", + X"55",X"4D",X"4D",X"59",X"20",X"57",X"52",X"49",X"54",X"45",X"0D",X"0A",X"09",X"4E",X"4F",X"50", + X"09",X"09",X"2F",X"20",X"44",X"55",X"4D",X"4D",X"59",X"20",X"4E",X"4F",X"50",X"0D",X"0A",X"41", + X"54",X"33",X"30",X"36",X"30",X"09",X"4A",X"53",X"52",X"09",X"43",X"4F",X"4B",X"50",X"45",X"50", + X"2D",X"31",X"0D",X"0A",X"09",X"4A",X"53",X"52",X"09",X"4B",X"41",X"54",X"41",X"4D",X"4B",X"2D", + X"31",X"0D",X"0A",X"09",X"4A",X"53",X"52",X"09",X"50",X"50",X"54",X"4B",X"50",X"54",X"2D",X"31", + X"0D",X"0A",X"09",X"4A",X"53",X"52",X"09",X"4C",X"41",X"4B",X"4D",X"4F",X"56",X"2D",X"31",X"0D", + X"0A",X"09",X"4A",X"4D",X"50",X"09",X"41",X"54",X"33",X"30",X"33",X"30",X"0D",X"0A",X"0D",X"0A", + X"2F",X"50",X"45",X"50",X"50",X"45",X"52",X"20",X"4D",X"45",X"53",X"53",X"41",X"47",X"45",X"20", + X"54",X"41",X"42",X"4C",X"45",X"0D",X"0A",X"2F",X"09",X"4D",X"45",X"53",X"53",X"41",X"47",X"45", + X"20",X"20",X"3A",X"20",X"20",X"44",X"4F",X"4E",X"27",X"54",X"20",X"57",X"41",X"53",X"54",X"45", + X"20",X"50",X"45",X"50",X"50",X"45",X"52",X"53",X"0D",X"0A",X"09",X"09",X"2F",X"20",X"20",X"20", + X"59",X"4F",X"55",X"20",X"53",X"54",X"41",X"52",X"54",X"20",X"57",X"49",X"54",X"48",X"20",X"4F", + X"4E",X"4C",X"59",X"20",X"46",X"49",X"56",X"45",X"0D",X"0A",X"09",X"09",X"2F",X"20",X"20",X"20", + X"45",X"41",X"52",X"4E",X"20",X"45",X"58",X"54",X"52",X"41",X"20",X"50",X"45",X"50",X"50",X"45", + X"52",X"53",X"20",X"26",X"20",X"42",X"4F",X"4E",X"55",X"53",X"45",X"53",X"0D",X"0A",X"09",X"09", + X"2F",X"20",X"20",X"20",X"43",X"4C",X"41",X"49",X"4D",X"20",X"43",X"4F",X"4E",X"45",X"53",X"2C", + X"43",X"4F",X"46",X"46",X"45",X"45",X"53",X"20",X"26",X"20",X"46",X"52",X"49",X"45",X"53",X"0D", + X"0A",X"0D",X"0A",X"50",X"45",X"50",X"4D",X"53",X"47",X"09",X"45",X"51",X"55",X"09",X"2E",X"09", + X"2F",X"20",X"44",X"4F",X"4E",X"27",X"54",X"2E",X"2E",X"2E",X"2E",X"2E",X"0D",X"0A",X"09",X"44", + X"46",X"41",X"09",X"30",X"31",X"30",X"43",X"37",X"0D",X"0A",X"09",X"44",X"46",X"43",X"09",X"33", + X"32",X"2C",X"33",X"44",X"2C",X"33",X"43",X"2C",X"36",X"34",X"2C",X"34",X"32",X"2C",X"30",X"30", + X"2C",X"34",X"35",X"2C",X"32",X"46",X"0D",X"0A",X"09",X"44",X"00",X"C0",X"03",X"C0",X"00",X"C0"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/burger_time_sound_prog.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/burger_time_sound_prog.vhd new file mode 100644 index 00000000..4dc5a5f9 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/burger_time_sound_prog.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity burger_time_sound_prog is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of burger_time_sound_prog is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"4C",X"7A",X"F0",X"4C",X"09",X"F0",X"4C",X"55",X"F2",X"78",X"D8",X"A2",X"FF",X"9A",X"A2",X"EF", + X"A9",X"00",X"95",X"00",X"CA",X"D0",X"FB",X"20",X"2A",X"F0",X"A9",X"08",X"85",X"1E",X"A9",X"FF", + X"8D",X"00",X"C0",X"58",X"20",X"4A",X"F0",X"4C",X"27",X"F0",X"A9",X"00",X"85",X"05",X"AA",X"A5", + X"05",X"8D",X"00",X"40",X"8D",X"00",X"80",X"BD",X"64",X"F0",X"8D",X"00",X"20",X"8D",X"00",X"60", + X"E8",X"E6",X"05",X"A5",X"05",X"C9",X"10",X"90",X"E6",X"60",X"A9",X"00",X"85",X"05",X"AA",X"A5", + X"05",X"8D",X"00",X"80",X"BD",X"64",X"F0",X"8D",X"00",X"60",X"E8",X"E6",X"05",X"A5",X"05",X"C9", + X"0B",X"90",X"EC",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"68",X"A8",X"68",X"AA",X"68",X"40",X"48",X"8A",X"48",X"98",X"48",X"A5", + X"01",X"F0",X"F1",X"A5",X"04",X"C9",X"05",X"D0",X"04",X"A9",X"00",X"85",X"04",X"E6",X"04",X"0A", + X"AA",X"BD",X"9E",X"F0",X"85",X"1C",X"BD",X"9F",X"F0",X"85",X"1D",X"6C",X"1C",X"00",X"AA",X"F0", + X"FE",X"F0",X"3F",X"F1",X"80",X"F1",X"74",X"F0",X"74",X"F0",X"A5",X"12",X"D0",X"38",X"A4",X"0C", + X"E6",X"0C",X"B1",X"06",X"F0",X"3F",X"C9",X"FF",X"D0",X"07",X"A9",X"FF",X"85",X"15",X"4C",X"E9", + X"F0",X"20",X"1E",X"F2",X"A9",X"00",X"8D",X"00",X"40",X"A5",X"1A",X"8D",X"00",X"20",X"A9",X"01", + X"8D",X"00",X"40",X"A5",X"1B",X"8D",X"00",X"20",X"A5",X"1E",X"85",X"17",X"A9",X"08",X"8D",X"00", + X"40",X"A5",X"17",X"8D",X"00",X"20",X"4C",X"74",X"F0",X"A9",X"0C",X"85",X"1E",X"A9",X"0B",X"85", + X"20",X"A9",X"00",X"85",X"43",X"A9",X"00",X"85",X"1A",X"85",X"1B",X"4C",X"C4",X"F0",X"A5",X"15", + X"D0",X"34",X"A5",X"13",X"D0",X"2D",X"A4",X"0D",X"E6",X"0D",X"B1",X"08",X"F0",X"28",X"20",X"1E", + X"F2",X"A9",X"02",X"8D",X"00",X"40",X"A5",X"1A",X"8D",X"00",X"20",X"A9",X"03",X"8D",X"00",X"40", + X"A5",X"1B",X"8D",X"00",X"20",X"A5",X"1F",X"85",X"18",X"A9",X"09",X"8D",X"00",X"40",X"A5",X"18", + X"8D",X"00",X"20",X"4C",X"74",X"F0",X"A9",X"00",X"85",X"1A",X"85",X"1B",X"4C",X"11",X"F1",X"A5", + X"15",X"D0",X"34",X"A5",X"14",X"D0",X"2D",X"A4",X"0E",X"E6",X"0E",X"B1",X"0A",X"F0",X"28",X"20", + X"1E",X"F2",X"A9",X"04",X"8D",X"00",X"40",X"A5",X"1A",X"8D",X"00",X"20",X"A9",X"05",X"8D",X"00", + X"40",X"A5",X"1B",X"8D",X"00",X"20",X"A5",X"20",X"85",X"19",X"A9",X"0A",X"8D",X"00",X"40",X"A5", + X"19",X"8D",X"00",X"20",X"4C",X"74",X"F0",X"A9",X"00",X"85",X"1A",X"85",X"1B",X"4C",X"52",X"F1", + X"4C",X"8C",X"F1",X"4C",X"DE",X"F1",X"4C",X"FE",X"F1",X"4C",X"74",X"F0",X"A5",X"15",X"D0",X"20", + X"A5",X"0F",X"D0",X"0F",X"A4",X"0C",X"B1",X"06",X"85",X"0F",X"E6",X"0C",X"A9",X"FF",X"85",X"12", + X"4C",X"83",X"F1",X"C6",X"0F",X"A5",X"0F",X"D0",X"F7",X"A9",X"00",X"85",X"12",X"4C",X"A0",X"F1", + X"A9",X"00",X"AA",X"95",X"0C",X"E8",X"E0",X"0B",X"D0",X"F9",X"A2",X"00",X"A5",X"03",X"D0",X"0D", + X"BD",X"80",X"F3",X"95",X"06",X"E8",X"E0",X"06",X"D0",X"F6",X"4C",X"89",X"F1",X"BD",X"86",X"F3", + X"95",X"06",X"E8",X"E0",X"06",X"D0",X"F6",X"A9",X"0C",X"85",X"1F",X"4C",X"89",X"F1",X"A5",X"10", + X"D0",X"0F",X"A4",X"0D",X"B1",X"08",X"85",X"10",X"E6",X"0D",X"A9",X"FF",X"85",X"13",X"4C",X"86", + X"F1",X"C6",X"10",X"A5",X"10",X"D0",X"F7",X"A9",X"00",X"85",X"13",X"4C",X"EE",X"F1",X"A5",X"11", + X"D0",X"0F",X"A4",X"0E",X"B1",X"0A",X"85",X"11",X"E6",X"0E",X"A9",X"FF",X"85",X"14",X"4C",X"89", + X"F1",X"C6",X"11",X"A5",X"11",X"D0",X"F7",X"A9",X"00",X"85",X"14",X"4C",X"0E",X"F2",X"48",X"29", + X"0F",X"AA",X"BD",X"3D",X"F2",X"85",X"1A",X"BD",X"49",X"F2",X"85",X"1B",X"68",X"4A",X"4A",X"4A", + X"4A",X"F0",X"09",X"AA",X"18",X"46",X"1B",X"66",X"1A",X"CA",X"D0",X"F8",X"60",X"F2",X"1B",X"51", + X"91",X"DD",X"32",X"91",X"F9",X"6A",X"E3",X"63",X"EB",X"0E",X"0E",X"0D",X"0C",X"0B",X"0B",X"0A", + X"09",X"09",X"08",X"08",X"07",X"48",X"8A",X"48",X"98",X"48",X"AD",X"00",X"A0",X"85",X"3D",X"29", + X"F0",X"F0",X"34",X"C9",X"10",X"D0",X"2D",X"A5",X"3D",X"29",X"0F",X"F0",X"27",X"C9",X"0F",X"B0", + X"23",X"AA",X"A5",X"3E",X"DD",X"C6",X"F2",X"F0",X"02",X"B0",X"19",X"BD",X"C6",X"F2",X"85",X"3E", + X"8A",X"0A",X"AA",X"BD",X"E1",X"F2",X"85",X"3F",X"BD",X"E2",X"F2",X"85",X"40",X"A2",X"FF",X"9A", + X"58",X"6C",X"3F",X"00",X"4C",X"74",X"F0",X"A5",X"01",X"85",X"02",X"A9",X"00",X"85",X"01",X"A9", + X"0F",X"85",X"1E",X"A9",X"0E",X"85",X"1F",X"A9",X"0E",X"85",X"20",X"A5",X"3D",X"0A",X"C9",X"0C", + X"90",X"03",X"4C",X"FF",X"F2",X"AA",X"BD",X"D5",X"F2",X"85",X"41",X"BD",X"D6",X"F2",X"85",X"42", + X"20",X"06",X"F3",X"6C",X"41",X"00",X"00",X"03",X"03",X"02",X"07",X"04",X"09",X"09",X"06",X"0A", + X"08",X"0C",X"0B",X"05",X"01",X"09",X"F0",X"8C",X"F3",X"AA",X"F3",X"30",X"F3",X"30",X"F3",X"58", + X"F3",X"74",X"F0",X"3A",X"F6",X"DB",X"F3",X"12",X"F4",X"33",X"F6",X"49",X"F4",X"AE",X"F4",X"41", + X"F6",X"D8",X"F6",X"48",X"F6",X"4F",X"F6",X"60",X"F5",X"56",X"F6",X"EF",X"F4",X"5D",X"F6",X"A5", + X"02",X"85",X"01",X"4C",X"74",X"F0",X"A9",X"07",X"8D",X"00",X"40",X"A9",X"F8",X"8D",X"00",X"20", + X"60",X"A9",X"08",X"8D",X"00",X"40",X"A5",X"1E",X"8D",X"00",X"20",X"A9",X"09",X"8D",X"00",X"40", + X"A5",X"1F",X"8D",X"00",X"20",X"A9",X"0A",X"8D",X"00",X"40",X"A5",X"20",X"8D",X"00",X"20",X"60", + X"A9",X"00",X"85",X"03",X"A5",X"43",X"D0",X"C7",X"A2",X"00",X"BD",X"80",X"F3",X"95",X"06",X"E8", + X"E0",X"06",X"D0",X"F6",X"A9",X"0C",X"85",X"1E",X"A9",X"00",X"85",X"1F",X"A9",X"0B",X"85",X"20", + X"85",X"01",X"20",X"11",X"F3",X"4C",X"74",X"F0",X"A9",X"FF",X"85",X"03",X"A5",X"43",X"D0",X"9F", + X"A2",X"00",X"BD",X"86",X"F3",X"95",X"06",X"E8",X"E0",X"06",X"D0",X"F6",X"A9",X"0C",X"85",X"1E", + X"A9",X"0C",X"85",X"1F",X"A9",X"0B",X"85",X"20",X"85",X"01",X"20",X"11",X"F3",X"4C",X"74",X"F0", + X"F9",X"F8",X"8A",X"F9",X"9C",X"F9",X"F9",X"F8",X"0A",X"FA",X"9C",X"F9",X"20",X"C8",X"F3",X"A2", + X"00",X"BD",X"A4",X"F3",X"95",X"06",X"E8",X"E0",X"06",X"D0",X"F6",X"A9",X"0F",X"85",X"01",X"85", + X"43",X"4C",X"74",X"F0",X"A3",X"F7",X"D4",X"F7",X"04",X"F8",X"20",X"C8",X"F3",X"A2",X"00",X"BD", + X"C2",X"F3",X"95",X"06",X"E8",X"E0",X"06",X"D0",X"F6",X"A9",X"0F",X"85",X"01",X"85",X"43",X"4C", + X"74",X"F0",X"42",X"F8",X"A1",X"F8",X"C3",X"F8",X"20",X"2A",X"F0",X"20",X"06",X"F3",X"A2",X"00", + X"8A",X"85",X"04",X"95",X"0C",X"E8",X"E0",X"0B",X"D0",X"F9",X"60",X"20",X"68",X"F7",X"A0",X"20", + X"A9",X"24",X"20",X"53",X"F7",X"A9",X"D2",X"85",X"2F",X"A9",X"F5",X"85",X"30",X"A9",X"00",X"85", + X"25",X"A9",X"00",X"85",X"29",X"A9",X"08",X"85",X"2A",X"20",X"A4",X"F5",X"A5",X"22",X"C9",X"FF", + X"F0",X"06",X"20",X"B8",X"F5",X"4C",X"F9",X"F3",X"20",X"68",X"F7",X"A9",X"00",X"85",X"3E",X"4C", + X"23",X"F0",X"20",X"68",X"F7",X"A0",X"0C",X"A9",X"10",X"20",X"53",X"F7",X"A9",X"07",X"85",X"2F", + X"A9",X"F6",X"85",X"30",X"A9",X"00",X"85",X"25",X"A9",X"02",X"85",X"29",X"A9",X"09",X"85",X"2A", + X"20",X"A4",X"F5",X"A5",X"22",X"C9",X"FF",X"F0",X"06",X"20",X"B8",X"F5",X"4C",X"30",X"F4",X"20", + X"68",X"F7",X"A9",X"00",X"85",X"3E",X"4C",X"23",X"F0",X"20",X"68",X"F7",X"A0",X"24",X"A9",X"2A", + X"20",X"53",X"F7",X"A9",X"10",X"85",X"27",X"A9",X"0F",X"85",X"22",X"A9",X"57",X"85",X"2B",X"A9", + X"74",X"85",X"2D",X"A5",X"2B",X"38",X"E9",X"0F",X"85",X"2B",X"A5",X"2D",X"38",X"E9",X"06",X"85", + X"2D",X"20",X"75",X"F7",X"A9",X"09",X"85",X"21",X"20",X"83",X"F7",X"E6",X"21",X"20",X"83",X"F7", + X"A0",X"02",X"20",X"8E",X"F7",X"E6",X"2B",X"E6",X"2D",X"E6",X"2D",X"E6",X"2D",X"20",X"75",X"F7", + X"A0",X"01",X"20",X"8E",X"F7",X"A5",X"27",X"29",X"01",X"F0",X"02",X"C6",X"22",X"C6",X"27",X"F0", + X"03",X"4C",X"63",X"F4",X"20",X"68",X"F7",X"A9",X"00",X"85",X"3E",X"4C",X"23",X"F0",X"20",X"68", + X"F7",X"A0",X"10",X"A9",X"14",X"20",X"53",X"F7",X"A9",X"03",X"85",X"27",X"85",X"23",X"A9",X"02", + X"85",X"29",X"A9",X"09",X"85",X"2A",X"A9",X"07",X"85",X"22",X"20",X"B8",X"F5",X"E6",X"22",X"A5", + X"22",X"C9",X"0F",X"D0",X"F5",X"A9",X"00",X"85",X"22",X"20",X"B8",X"F5",X"A0",X"0F",X"20",X"8E", + X"F7",X"C6",X"27",X"D0",X"E1",X"20",X"68",X"F7",X"A9",X"00",X"85",X"3E",X"4C",X"23",X"F0",X"20", + X"68",X"F7",X"A0",X"2A",X"A9",X"36",X"20",X"53",X"F7",X"A9",X"01",X"85",X"27",X"A9",X"00",X"85", + X"22",X"20",X"27",X"F5",X"38",X"A5",X"2B",X"E9",X"20",X"85",X"2D",X"20",X"75",X"F7",X"A4",X"21", + X"20",X"8E",X"F7",X"A5",X"2B",X"C9",X"00",X"D0",X"E8",X"C6",X"27",X"D0",X"E0",X"20",X"68",X"F7", + X"A9",X"00",X"85",X"3E",X"4C",X"23",X"F0",X"A6",X"22",X"BD",X"38",X"F5",X"85",X"2B",X"E8",X"BD", + X"38",X"F5",X"85",X"21",X"E8",X"86",X"22",X"60",X"29",X"08",X"2C",X"08",X"2E",X"08",X"34",X"08", + X"37",X"08",X"3A",X"08",X"3F",X"08",X"47",X"08",X"52",X"08",X"58",X"08",X"60",X"08",X"68",X"08", + X"74",X"08",X"80",X"08",X"90",X"08",X"A0",X"08",X"B4",X"08",X"D0",X"08",X"F0",X"08",X"00",X"01", + X"20",X"68",X"F7",X"A0",X"00",X"A9",X"0C",X"20",X"53",X"F7",X"A9",X"E0",X"85",X"2B",X"A9",X"90", + X"85",X"2D",X"A5",X"2B",X"38",X"E9",X"04",X"85",X"2B",X"A5",X"2D",X"38",X"E9",X"04",X"85",X"2D", + X"20",X"75",X"F7",X"A0",X"01",X"20",X"8E",X"F7",X"E6",X"2B",X"E6",X"2D",X"20",X"75",X"F7",X"A0", + X"01",X"20",X"8E",X"F7",X"A5",X"2B",X"C9",X"64",X"D0",X"D8",X"20",X"68",X"F7",X"A9",X"00",X"85", + X"3E",X"4C",X"23",X"F0",X"A6",X"25",X"A4",X"26",X"B1",X"2F",X"95",X"21",X"E6",X"26",X"E8",X"E0", + X"03",X"D0",X"F3",X"A2",X"00",X"86",X"25",X"60",X"A5",X"29",X"8D",X"00",X"80",X"A5",X"21",X"8D", + X"00",X"60",X"A5",X"2A",X"8D",X"00",X"80",X"A5",X"22",X"8D",X"00",X"60",X"A4",X"23",X"20",X"8E", + X"F7",X"60",X"E0",X"0F",X"04",X"E2",X"0F",X"04",X"E0",X"0E",X"03",X"E2",X"0E",X"03",X"E0",X"0D", + X"03",X"E2",X"0D",X"02",X"E0",X"0C",X"02",X"E2",X"0C",X"02",X"20",X"09",X"01",X"22",X"08",X"01", + X"00",X"09",X"01",X"00",X"09",X"01",X"20",X"09",X"01",X"FF",X"0F",X"0A",X"FD",X"0D",X"02",X"FF", + X"0A",X"02",X"FD",X"08",X"02",X"FF",X"FF",X"E0",X"0E",X"0E",X"E2",X"0E",X"0E",X"E0",X"0D",X"0D", + X"E2",X"0D",X"0D",X"E0",X"0C",X"0D",X"E2",X"0C",X"0D",X"E0",X"0B",X"0D",X"E2",X"0B",X"0D",X"E0", + X"0A",X"07",X"E2",X"0A",X"07",X"E0",X"09",X"07",X"E2",X"07",X"03",X"DE",X"08",X"03",X"DD",X"08", + X"03",X"FF",X"FF",X"A9",X"05",X"85",X"44",X"4C",X"64",X"F6",X"A9",X"04",X"85",X"44",X"4C",X"64", + X"F6",X"A9",X"01",X"85",X"44",X"4C",X"64",X"F6",X"A9",X"00",X"85",X"44",X"4C",X"64",X"F6",X"A9", + X"02",X"85",X"44",X"4C",X"64",X"F6",X"A9",X"06",X"85",X"44",X"4C",X"64",X"F6",X"A9",X"03",X"85", + X"44",X"4C",X"64",X"F6",X"20",X"68",X"F7",X"A5",X"44",X"0A",X"AA",X"BD",X"A8",X"FA",X"85",X"45", + X"BD",X"A9",X"FA",X"85",X"46",X"BD",X"9A",X"FA",X"85",X"47",X"BD",X"9B",X"FA",X"85",X"48",X"A0", + X"00",X"B1",X"45",X"8D",X"00",X"80",X"C8",X"B1",X"45",X"8D",X"00",X"60",X"C8",X"B1",X"45",X"C9", + X"80",X"D0",X"EE",X"C8",X"84",X"26",X"A0",X"00",X"A9",X"00",X"8D",X"00",X"80",X"B1",X"47",X"8D", + X"00",X"60",X"C8",X"A9",X"02",X"8D",X"00",X"80",X"B1",X"47",X"8D",X"00",X"60",X"20",X"C1",X"F6", + X"C8",X"B1",X"47",X"C9",X"81",X"D0",X"E1",X"20",X"68",X"F7",X"A9",X"00",X"85",X"3E",X"4C",X"23", + X"F0",X"98",X"48",X"A4",X"26",X"B1",X"45",X"85",X"21",X"A9",X"FC",X"85",X"22",X"C6",X"22",X"D0", + X"FC",X"C6",X"21",X"D0",X"F8",X"68",X"A8",X"60",X"20",X"68",X"F7",X"A0",X"00",X"A9",X"0C",X"20", + X"53",X"F7",X"A9",X"E3",X"85",X"2B",X"A9",X"A0",X"85",X"2D",X"A5",X"2B",X"38",X"E9",X"04",X"85", + X"2B",X"A5",X"2D",X"38",X"E9",X"03",X"85",X"2D",X"20",X"75",X"F7",X"A0",X"01",X"20",X"8E",X"F7", + X"18",X"E6",X"2B",X"E6",X"2D",X"20",X"75",X"F7",X"A0",X"01",X"20",X"8E",X"F7",X"A5",X"2B",X"C9", + X"30",X"B0",X"D7",X"20",X"68",X"F7",X"A9",X"00",X"85",X"3E",X"4C",X"23",X"F0",X"07",X"F9",X"09", + X"1D",X"0A",X"1D",X"0B",X"00",X"0C",X"40",X"0D",X"09",X"07",X"FD",X"03",X"02",X"06",X"0F",X"07", + X"EF",X"07",X"F9",X"09",X"10",X"0A",X"10",X"0B",X"00",X"0D",X"09",X"0C",X"40",X"07",X"FE",X"01", + X"03",X"07",X"F9",X"03",X"01",X"05",X"01",X"07",X"F9",X"09",X"10",X"0A",X"10",X"0B",X"00",X"0C", + X"37",X"0D",X"09",X"85",X"31",X"B9",X"1D",X"F7",X"8D",X"00",X"80",X"C8",X"B9",X"1D",X"F7",X"8D", + X"00",X"60",X"C8",X"C4",X"31",X"D0",X"EE",X"60",X"A9",X"00",X"A2",X"10",X"95",X"21",X"CA",X"10", + X"FB",X"20",X"4A",X"F0",X"60",X"A2",X"05",X"B5",X"29",X"8E",X"00",X"80",X"8D",X"00",X"60",X"CA", + X"10",X"F5",X"60",X"A5",X"21",X"8D",X"00",X"80",X"A5",X"22",X"8D",X"00",X"60",X"60",X"A9",X"F0", + X"85",X"32",X"20",X"99",X"F7",X"88",X"D0",X"F6",X"60",X"A2",X"00",X"CA",X"D0",X"FD",X"C6",X"32", + X"10",X"F9",X"60",X"44",X"20",X"47",X"0E",X"00",X"0A",X"47",X"28",X"45",X"10",X"44",X"10",X"45", + X"20",X"49",X"0E",X"00",X"0A",X"49",X"28",X"47",X"10",X"45",X"10",X"47",X"20",X"4B",X"0E",X"00", + X"0A",X"4B",X"28",X"49",X"10",X"4B",X"10",X"50",X"18",X"47",X"08",X"49",X"18",X"47",X"08",X"00", + X"40",X"00",X"FF",X"FF",X"40",X"20",X"44",X"0E",X"00",X"0A",X"44",X"28",X"42",X"10",X"40",X"10", + X"42",X"20",X"45",X"0E",X"00",X"0A",X"45",X"28",X"44",X"10",X"42",X"10",X"44",X"20",X"47",X"0E", + X"00",X"0A",X"47",X"28",X"45",X"10",X"47",X"10",X"47",X"18",X"44",X"08",X"45",X"18",X"44",X"08", + X"00",X"40",X"00",X"FF",X"30",X"10",X"00",X"10",X"34",X"10",X"00",X"10",X"37",X"10",X"00",X"10", + X"40",X"10",X"00",X"10",X"32",X"10",X"00",X"10",X"35",X"10",X"00",X"10",X"39",X"10",X"00",X"10", + X"42",X"10",X"00",X"10",X"3B",X"10",X"00",X"10",X"32",X"10",X"00",X"10",X"35",X"10",X"00",X"10", + X"37",X"10",X"00",X"10",X"40",X"10",X"00",X"10",X"39",X"10",X"00",X"10",X"37",X"10",X"00",X"30", + X"00",X"FF",X"44",X"2A",X"00",X"02",X"37",X"09",X"00",X"02",X"39",X"09",X"00",X"0D",X"40",X"09", + X"00",X"02",X"45",X"2A",X"00",X"02",X"44",X"2A",X"00",X"02",X"42",X"1F",X"00",X"02",X"41",X"09", + X"00",X"02",X"42",X"09",X"00",X"02",X"00",X"16",X"49",X"2A",X"00",X"02",X"47",X"09",X"00",X"02", + X"45",X"1F",X"00",X"02",X"44",X"09",X"00",X"02",X"00",X"16",X"47",X"14",X"00",X"02",X"47",X"1D", + X"00",X"04",X"47",X"09",X"00",X"02",X"49",X"2A",X"00",X"02",X"4B",X"2A",X"00",X"02",X"50",X"1F", + X"00",X"02",X"47",X"09",X"00",X"02",X"4B",X"1D",X"00",X"04",X"50",X"09",X"00",X"5A",X"00",X"FF", + X"FF",X"00",X"58",X"42",X"2A",X"00",X"02",X"40",X"2A",X"00",X"B2",X"44",X"14",X"00",X"02",X"44", + X"1D",X"00",X"04",X"44",X"09",X"00",X"02",X"45",X"2A",X"00",X"02",X"47",X"2A",X"00",X"4F",X"00", + X"FF",X"00",X"FF",X"30",X"24",X"00",X"08",X"30",X"24",X"00",X"08",X"32",X"24",X"00",X"08",X"34", + X"24",X"00",X"08",X"35",X"24",X"00",X"08",X"35",X"24",X"00",X"08",X"35",X"24",X"00",X"08",X"35", + X"24",X"00",X"08",X"34",X"24",X"00",X"08",X"34",X"24",X"00",X"08",X"32",X"24",X"00",X"08",X"32", + X"24",X"00",X"08",X"30",X"24",X"00",X"8C",X"00",X"FF",X"4A",X"0D",X"00",X"05",X"4A",X"0D",X"00", + X"05",X"4B",X"0D",X"00",X"05",X"4B",X"0D",X"00",X"05",X"50",X"0D",X"00",X"05",X"50",X"0D",X"00", + X"05",X"51",X"0D",X"00",X"05",X"51",X"0D",X"00",X"05",X"52",X"0E",X"00",X"16",X"49",X"0E",X"00", + X"16",X"52",X"0E",X"00",X"16",X"49",X"0E",X"00",X"16",X"50",X"0D",X"00",X"05",X"55",X"0D",X"00", + X"05",X"54",X"0D",X"00",X"05",X"52",X"0D",X"00",X"05",X"50",X"0D",X"00",X"05",X"4B",X"0D",X"00", + X"05",X"50",X"0D",X"00",X"05",X"4B",X"0D",X"00",X"05",X"50",X"0E",X"00",X"16",X"55",X"0E",X"00", + X"16",X"50",X"0E",X"00",X"16",X"55",X"0E",X"00",X"16",X"50",X"0E",X"00",X"16",X"59",X"0E",X"00", + X"16",X"50",X"0E",X"00",X"16",X"59",X"0E",X"00",X"16",X"4A",X"10",X"00",X"14",X"57",X"0D",X"00", + X"17",X"49",X"10",X"00",X"14",X"55",X"0D",X"00",X"17",X"4A",X"10",X"00",X"14",X"57",X"0D",X"00", + X"17",X"49",X"10",X"00",X"14",X"55",X"0D",X"00",X"17",X"FF",X"00",X"20",X"00",X"90",X"00",X"90", + X"00",X"90",X"00",X"90",X"00",X"90",X"00",X"90",X"00",X"98",X"00",X"F0",X"3A",X"0D",X"00",X"05", + X"3A",X"0D",X"00",X"05",X"39",X"0D",X"00",X"05",X"39",X"0D",X"00",X"05",X"38",X"0D",X"00",X"05", + X"38",X"0D",X"00",X"05",X"37",X"0D",X"00",X"05",X"37",X"0D",X"00",X"05",X"36",X"24",X"00",X"12", + X"36",X"0D",X"00",X"05",X"36",X"1C",X"00",X"2C",X"35",X"12",X"00",X"12",X"37",X"12",X"00",X"12", + X"39",X"0D",X"00",X"05",X"38",X"0D",X"00",X"05",X"39",X"0D",X"00",X"05",X"38",X"0D",X"00",X"05", + X"39",X"24",X"00",X"12",X"39",X"0D",X"00",X"05",X"39",X"1C",X"00",X"2C",X"35",X"24",X"00",X"12", + X"35",X"0D",X"00",X"05",X"35",X"1C",X"00",X"2C",X"37",X"12",X"00",X"36",X"35",X"12",X"00",X"36", + X"37",X"12",X"00",X"36",X"35",X"12",X"00",X"36",X"00",X"F0",X"67",X"0D",X"00",X"05",X"64",X"0D", + X"00",X"05",X"67",X"0D",X"00",X"05",X"64",X"0D",X"00",X"05",X"00",X"48",X"67",X"0D",X"00",X"05", + X"64",X"0D",X"00",X"05",X"67",X"0D",X"00",X"05",X"64",X"0D",X"00",X"05",X"00",X"48",X"67",X"0D", + X"00",X"05",X"64",X"0D",X"00",X"05",X"67",X"0D",X"00",X"05",X"64",X"0D",X"00",X"05",X"00",X"48", + X"67",X"0D",X"00",X"05",X"64",X"0D",X"00",X"05",X"67",X"0D",X"00",X"05",X"64",X"0D",X"00",X"05", + X"00",X"48",X"67",X"0D",X"00",X"05",X"64",X"0D",X"00",X"05",X"67",X"0D",X"00",X"05",X"64",X"0D", + X"00",X"05",X"00",X"48",X"67",X"0D",X"00",X"05",X"64",X"0D",X"00",X"05",X"67",X"0D",X"00",X"05", + X"64",X"0D",X"00",X"05",X"00",X"48",X"67",X"0D",X"00",X"05",X"64",X"0D",X"00",X"05",X"67",X"0D", + X"00",X"05",X"64",X"0D",X"00",X"05",X"00",X"48",X"67",X"0D",X"00",X"05",X"64",X"0D",X"00",X"05", + X"67",X"0D",X"00",X"05",X"64",X"0D",X"00",X"05",X"00",X"48",X"12",X"FB",X"3B",X"FB",X"49",X"FB", + X"58",X"FB",X"DF",X"FB",X"EC",X"FB",X"15",X"FC",X"B6",X"FA",X"C2",X"FA",X"D6",X"FA",X"E2",X"FA", + X"EE",X"FA",X"FA",X"FA",X"06",X"FB",X"07",X"F8",X"08",X"0F",X"09",X"0F",X"01",X"00",X"03",X"01", + X"80",X"11",X"07",X"F8",X"08",X"10",X"09",X"10",X"0A",X"10",X"01",X"01",X"03",X"01",X"0B",X"04", + X"0C",X"02",X"0D",X"0F",X"80",X"03",X"07",X"F8",X"08",X"0F",X"09",X"0F",X"01",X"00",X"03",X"00", + X"80",X"0A",X"07",X"F8",X"08",X"0F",X"09",X"0F",X"01",X"00",X"03",X"00",X"80",X"0A",X"07",X"F8", + X"08",X"0D",X"09",X"0B",X"01",X"01",X"03",X"03",X"80",X"08",X"07",X"F8",X"08",X"0F",X"09",X"0F", + X"01",X"00",X"03",X"00",X"80",X"08",X"07",X"F8",X"08",X"0F",X"09",X"0F",X"01",X"00",X"03",X"00", + X"80",X"0A",X"7E",X"FA",X"00",X"00",X"64",X"92",X"00",X"00",X"54",X"52",X"00",X"00",X"3F",X"FA", + X"00",X"00",X"54",X"52",X"00",X"00",X"64",X"92",X"00",X"00",X"7E",X"FA",X"00",X"00",X"64",X"92", + X"00",X"00",X"43",X"0C",X"00",X"00",X"3F",X"FA",X"3F",X"FA",X"81",X"43",X"2F",X"43",X"2F",X"43", + X"2F",X"43",X"2F",X"43",X"2F",X"43",X"2F",X"43",X"81",X"C9",X"C9",X"00",X"00",X"C9",X"C9",X"00", + X"00",X"A9",X"A9",X"00",X"00",X"64",X"64",X"81",X"A9",X"54",X"96",X"4B",X"86",X"43",X"A9",X"54", + X"96",X"4B",X"86",X"43",X"7F",X"3F",X"A9",X"54",X"96",X"4B",X"86",X"43",X"7E",X"3F",X"A9",X"54", + X"96",X"4B",X"86",X"43",X"A9",X"54",X"96",X"4B",X"86",X"43",X"7F",X"3F",X"A9",X"54",X"96",X"4B", + X"86",X"43",X"7E",X"3F",X"A9",X"54",X"96",X"4B",X"86",X"43",X"A9",X"54",X"96",X"4B",X"86",X"43", + X"7F",X"3F",X"A9",X"54",X"96",X"4B",X"86",X"43",X"7E",X"3F",X"A9",X"54",X"96",X"4B",X"86",X"43", + X"A9",X"54",X"96",X"4B",X"86",X"43",X"7F",X"3F",X"A9",X"54",X"96",X"4B",X"86",X"43",X"7E",X"3F", + X"A9",X"54",X"96",X"4B",X"86",X"43",X"A9",X"54",X"96",X"4B",X"86",X"43",X"7F",X"3F",X"A9",X"54", + X"96",X"4B",X"86",X"43",X"7E",X"3F",X"A9",X"54",X"96",X"4B",X"86",X"43",X"A9",X"54",X"96",X"4B", + X"86",X"43",X"7F",X"3F",X"A9",X"54",X"96",X"4B",X"86",X"43",X"7E",X"3F",X"00",X"00",X"81",X"FD", + X"FD",X"FD",X"FD",X"FD",X"FD",X"A9",X"A9",X"A9",X"A9",X"A9",X"A9",X"81",X"54",X"2A",X"54",X"2A", + X"00",X"00",X"54",X"2A",X"54",X"2A",X"00",X"00",X"64",X"32",X"64",X"32",X"00",X"00",X"64",X"32", + X"64",X"32",X"00",X"00",X"7E",X"3F",X"7E",X"3F",X"00",X"00",X"7E",X"3F",X"7E",X"3F",X"00",X"00", + X"7E",X"3F",X"7E",X"3F",X"81",X"A9",X"54",X"00",X"00",X"3F",X"2A",X"00",X"00",X"3F",X"2A",X"00", + X"00",X"3F",X"2A",X"00",X"00",X"3F",X"2A",X"00",X"00",X"3F",X"2A",X"00",X"00",X"3F",X"2A",X"00", + X"00",X"3F",X"2A",X"81",X"4C",X"EC",X"FC",X"78",X"D8",X"A2",X"FF",X"9A",X"AD",X"00",X"A0",X"A9", + X"00",X"8D",X"00",X"C0",X"A0",X"00",X"A2",X"00",X"B9",X"55",X"F2",X"95",X"00",X"C8",X"E8",X"D0", + X"F7",X"B9",X"55",X"F2",X"9D",X"00",X"01",X"C8",X"E8",X"D0",X"F6",X"B5",X"00",X"D9",X"55",X"F2", + X"D0",X"D2",X"C8",X"E8",X"D0",X"F5",X"BD",X"00",X"01",X"D9",X"55",X"F2",X"D0",X"7E",X"C8",X"E8", + X"D0",X"F4",X"C8",X"C0",X"20",X"D0",X"CF",X"A2",X"00",X"A0",X"00",X"98",X"85",X"49",X"A9",X"02", + X"85",X"4A",X"BD",X"55",X"F2",X"91",X"49",X"E8",X"C8",X"D0",X"F7",X"E6",X"4A",X"A5",X"4A",X"C9", + X"04",X"90",X"EF",X"A9",X"00",X"85",X"49",X"A9",X"02",X"85",X"4A",X"B1",X"49",X"DD",X"55",X"F2", + X"D0",X"4A",X"E8",X"C8",X"D0",X"F5",X"E6",X"4A",X"A5",X"4A",X"C9",X"04",X"90",X"ED",X"E8",X"E0", + X"20",X"D0",X"C6",X"A2",X"00",X"BD",X"D4",X"FC",X"8D",X"00",X"40",X"E8",X"BD",X"D4",X"FC",X"8D", + X"00",X"20",X"E8",X"E0",X"18",X"D0",X"EE",X"A2",X"80",X"A0",X"00",X"88",X"D0",X"FD",X"CA",X"D0", + X"FA",X"4C",X"03",X"F0",X"00",X"66",X"01",X"01",X"02",X"1C",X"03",X"01",X"04",X"EF",X"05",X"00", + X"07",X"F8",X"08",X"10",X"09",X"10",X"0A",X"10",X"0C",X"30",X"0D",X"09",X"A0",X"00",X"B9",X"0D", + X"FD",X"8D",X"00",X"40",X"C8",X"B9",X"0D",X"FD",X"8D",X"00",X"20",X"C8",X"C0",X"18",X"D0",X"EE", + X"A2",X"A0",X"A0",X"00",X"88",X"D0",X"FD",X"CA",X"D0",X"FA",X"4C",X"EC",X"FC",X"00",X"CC",X"01", + X"02",X"02",X"A4",X"03",X"02",X"04",X"7E",X"05",X"02",X"07",X"38",X"08",X"10",X"09",X"10",X"0A", + X"10",X"0C",X"30",X"0D",X"09",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"F0",X"37",X"FC",X"06",X"F0"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/fg_sp_graphx_1.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/fg_sp_graphx_1.vhd new file mode 100644 index 00000000..126eac41 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/fg_sp_graphx_1.vhd @@ -0,0 +1,470 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity fg_sp_graphx_1 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 prom of fg_sp_graphx_1 is + type rom is array(0 to 7167) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"3E",X"61",X"41",X"43",X"3E",X"1C", + X"00",X"00",X"40",X"42",X"7F",X"7F",X"40",X"40",X"00",X"62",X"73",X"79",X"59",X"5D",X"4F",X"46", + X"00",X"20",X"61",X"49",X"4D",X"4F",X"7B",X"31",X"00",X"18",X"1C",X"16",X"13",X"7F",X"7F",X"10", + X"00",X"27",X"67",X"45",X"45",X"45",X"7D",X"38",X"00",X"3C",X"7E",X"4B",X"49",X"49",X"79",X"30", + X"00",X"03",X"03",X"71",X"79",X"0D",X"07",X"03",X"00",X"36",X"4F",X"4D",X"59",X"59",X"76",X"30", + X"00",X"06",X"4F",X"49",X"49",X"69",X"3F",X"1E",X"00",X"7C",X"7E",X"13",X"11",X"13",X"7E",X"7C", + X"00",X"7F",X"7F",X"49",X"49",X"49",X"7F",X"36",X"00",X"1C",X"3E",X"63",X"41",X"41",X"63",X"22", + X"00",X"7F",X"7F",X"41",X"41",X"63",X"3E",X"1C",X"00",X"00",X"7F",X"7F",X"49",X"49",X"49",X"41", + X"00",X"7F",X"7F",X"09",X"09",X"09",X"09",X"01",X"00",X"1C",X"3E",X"63",X"41",X"49",X"79",X"79", + X"00",X"7F",X"7F",X"08",X"08",X"08",X"7F",X"7F",X"00",X"00",X"41",X"41",X"7F",X"7F",X"41",X"41", + X"00",X"20",X"60",X"40",X"40",X"40",X"7F",X"3F",X"00",X"7F",X"7F",X"18",X"3C",X"76",X"63",X"41", + X"00",X"00",X"7F",X"7F",X"40",X"40",X"40",X"40",X"00",X"7F",X"7F",X"0E",X"1C",X"0E",X"7F",X"7F", + X"00",X"7F",X"7F",X"0E",X"1C",X"38",X"7F",X"7F",X"00",X"3E",X"7F",X"41",X"41",X"41",X"7F",X"3E", + X"00",X"7F",X"7F",X"11",X"11",X"11",X"1F",X"0E",X"00",X"3E",X"7F",X"41",X"51",X"71",X"3F",X"5E", + X"00",X"7F",X"7F",X"11",X"31",X"79",X"6F",X"4E",X"00",X"26",X"6F",X"49",X"49",X"4B",X"7A",X"30", + X"00",X"00",X"01",X"01",X"7F",X"7F",X"01",X"01",X"00",X"3F",X"7F",X"40",X"40",X"40",X"7F",X"3F", + X"00",X"0F",X"1F",X"38",X"70",X"38",X"1F",X"0F",X"00",X"1F",X"7F",X"38",X"1C",X"38",X"7F",X"1F", + X"00",X"63",X"77",X"3E",X"1C",X"3E",X"77",X"63",X"00",X"00",X"03",X"0F",X"78",X"78",X"0F",X"03", + X"00",X"61",X"71",X"79",X"5D",X"4F",X"47",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7E",X"12",X"1E",X"00",X"7E",X"5A",X"5A",X"00", + X"7E",X"12",X"1E",X"00",X"7E",X"12",X"1E",X"00",X"7E",X"5A",X"5A",X"00",X"7E",X"12",X"2E",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"FF",X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF",X"00",X"FF",X"01",X"01",X"01",X"01",X"01",X"01", + X"00",X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"7F",X"40",X"40",X"40",X"40",X"40",X"40", + X"7F",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"7F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"81",X"81",X"81",X"81",X"81",X"81",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"10",X"00",X"22",X"00",X"10",X"04",X"00",X"00",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"00",X"00",X"10",X"00",X"48",X"00",X"00",X"20",X"00",X"08",X"40",X"00",X"10",X"04", + X"00",X"00",X"00",X"01",X"00",X"10",X"00",X"00",X"02",X"00",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"02",X"00",X"24",X"00",X"08",X"41",X"04",X"00",X"09",X"01",X"04",X"90",X"04",X"20",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"80",X"00",X"00",X"00",X"00",X"80",X"00",X"10",X"80",X"00",X"00",X"20",X"00",X"80",X"00", + X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"80",X"04",X"00",X"20",X"05",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00", + X"10",X"00",X"41",X"08",X"00",X"20",X"81",X"00",X"10",X"00",X"00",X"82",X"00",X"04",X"00",X"20", + X"00",X"00",X"24",X"00",X"04",X"01",X"10",X"00",X"02",X"00",X"00",X"00",X"00",X"01",X"00",X"00", + X"04",X"40",X"08",X"20",X"02",X"00",X"20",X"04",X"80",X"01",X"08",X"20",X"02",X"00",X"04",X"01", + X"00",X"00",X"00",X"00",X"01",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00", + X"00",X"00",X"10",X"00",X"04",X"00",X"01",X"00",X"04",X"00",X"00",X"09",X"00",X"02",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C6",X"92",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FE",X"92",X"F6",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"DE",X"92",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"DE",X"92",X"F2",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"FE",X"00",X"DE",X"92",X"F2",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"40",X"50",X"60",X"F0",X"D4",X"5A",X"88",X"A8",X"50",X"A0",X"CC",X"70",X"78",X"40",X"00", + X"00",X"00",X"00",X"00",X"01",X"02",X"07",X"04",X"06",X"04",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"38",X"6E",X"76",X"7F",X"5D",X"7F",X"77",X"7F",X"5E",X"76",X"38",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F8",X"CC",X"84",X"84",X"84",X"84",X"84",X"84",X"84",X"CC",X"F8",X"20",X"10",X"10",X"E0", + X"30",X"79",X"77",X"EF",X"EF",X"DF",X"DF",X"DF",X"EF",X"EF",X"77",X"79",X"31",X"02",X"01",X"00", + X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"10",X"5C",X"54",X"74",X"10",X"00", + X"00",X"00",X"7C",X"20",X"7C",X"64",X"7C",X"00",X"00",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0", + X"00",X"03",X"1F",X"11",X"1B",X"11",X"1F",X"03",X"00",X"00",X"00",X"00",X"00",X"10",X"70",X"80", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"80",X"70",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"80",X"60",X"60",X"00",X"00",X"00", + X"00",X"0C",X"02",X"A2",X"12",X"12",X"0C",X"00",X"00",X"00",X"BE",X"00",X"00",X"BE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"E6",X"B2",X"9E",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C6",X"92",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"9E",X"92",X"F2",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E6",X"B2",X"9E",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"24",X"FE",X"20",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"92",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"FE",X"00",X"FE",X"92",X"F6",X"00",X"FE",X"82",X"FE",X"82",X"FE",X"82",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"08",X"1D",X"1F",X"3F",X"3E",X"3E",X"0E",X"04",X"00",X"00",X"00", + X"00",X"04",X"8C",X"9E",X"9C",X"9E",X"1F",X"1F",X"1F",X"1F",X"1B",X"97",X"86",X"46",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"08",X"1D",X"1F",X"3F",X"3E",X"3E",X"0E",X"04",X"00",X"00",X"00", + X"00",X"00",X"10",X"0C",X"1C",X"9E",X"9F",X"9F",X"99",X"87",X"07",X"16",X"18",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"08",X"1A",X"1F",X"3F",X"3E",X"3E",X"0E",X"04",X"00",X"00",X"00", + X"00",X"00",X"00",X"50",X"56",X"56",X"17",X"1B",X"1F",X"1F",X"1F",X"9F",X"86",X"46",X"00",X"00", + X"00",X"00",X"00",X"03",X"3F",X"1F",X"11",X"1B",X"1B",X"11",X"1F",X"3F",X"01",X"00",X"00",X"00", + X"00",X"06",X"03",X"13",X"9F",X"9E",X"94",X"1E",X"1E",X"24",X"2E",X"3F",X"0E",X"07",X"0E",X"0C", + X"00",X"00",X"00",X"01",X"3F",X"1F",X"11",X"1B",X"1B",X"11",X"1F",X"3F",X"03",X"00",X"00",X"00", + X"0C",X"0E",X"07",X"0B",X"3F",X"2E",X"24",X"1E",X"1E",X"94",X"9E",X"9F",X"13",X"03",X"06",X"00", + X"00",X"00",X"00",X"01",X"3F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"03",X"00",X"00",X"00", + X"0C",X"0E",X"07",X"2B",X"2F",X"2F",X"1F",X"1F",X"1F",X"9F",X"9F",X"9F",X"1B",X"07",X"0E",X"00", + X"00",X"00",X"00",X"03",X"3F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"01",X"00",X"00",X"00", + X"00",X"0E",X"07",X"1B",X"9F",X"9F",X"9F",X"1F",X"1F",X"1F",X"2F",X"2F",X"2B",X"07",X"0E",X"0C", + X"00",X"00",X"00",X"03",X"3F",X"1F",X"11",X"1B",X"1B",X"11",X"1F",X"3F",X"03",X"00",X"00",X"00", + X"0C",X"0E",X"07",X"1B",X"9F",X"9E",X"94",X"1E",X"1E",X"94",X"9E",X"9F",X"1B",X"07",X"0E",X"0C", + X"00",X"00",X"00",X"03",X"3F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"03",X"00",X"00",X"00", + X"0C",X"0E",X"07",X"1B",X"9F",X"9F",X"9F",X"1F",X"1F",X"9F",X"9F",X"9F",X"1B",X"07",X"0E",X"0C", + X"00",X"00",X"80",X"80",X"10",X"08",X"1D",X"1F",X"3F",X"3E",X"3E",X"0E",X"04",X"00",X"00",X"00", + X"00",X"00",X"11",X"0F",X"1C",X"9E",X"9F",X"9F",X"99",X"87",X"47",X"76",X"18",X"00",X"00",X"00", + X"00",X"00",X"80",X"03",X"3F",X"1F",X"11",X"1B",X"1B",X"11",X"1F",X"3F",X"03",X"00",X"00",X"00", + X"00",X"01",X"03",X"1F",X"9F",X"9E",X"94",X"1E",X"1E",X"14",X"5E",X"7F",X"1B",X"07",X"0E",X"0C", + X"00",X"80",X"C0",X"83",X"3F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"03",X"00",X"00",X"00", + X"00",X"00",X"03",X"1F",X"9F",X"9F",X"9F",X"1F",X"1F",X"1F",X"DF",X"DF",X"1B",X"07",X"0E",X"0C", + X"C0",X"C0",X"80",X"83",X"3F",X"1F",X"11",X"1B",X"1B",X"11",X"1F",X"3F",X"83",X"80",X"C0",X"C0", + X"00",X"01",X"03",X"0F",X"8F",X"8F",X"8A",X"0F",X"0F",X"8A",X"8F",X"8F",X"0F",X"03",X"01",X"00", + X"C0",X"C0",X"80",X"83",X"3F",X"1F",X"11",X"1B",X"1B",X"11",X"1F",X"3F",X"83",X"80",X"C0",X"C0", + X"00",X"01",X"03",X"0F",X"8F",X"8F",X"8A",X"0F",X"0F",X"8A",X"8F",X"8F",X"0F",X"03",X"01",X"00", + X"00",X"F0",X"E0",X"80",X"01",X"02",X"00",X"03",X"00",X"00",X"02",X"01",X"80",X"E0",X"F0",X"00", + X"00",X"01",X"03",X"0F",X"8F",X"8F",X"8A",X"0F",X"0F",X"8A",X"8F",X"8F",X"0F",X"03",X"01",X"00", + X"60",X"E0",X"C0",X"C0",X"80",X"80",X"00",X"80",X"80",X"00",X"80",X"80",X"C0",X"C0",X"E0",X"60", + X"00",X"00",X"01",X"01",X"00",X"0E",X"0E",X"00",X"00",X"0E",X"0E",X"00",X"01",X"01",X"00",X"00", + X"80",X"C0",X"0C",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"0C",X"C0",X"C0",X"80", + X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00", + X"00",X"00",X"30",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"40",X"60",X"30",X"00",X"00",X"00", + X"04",X"0C",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"0C",X"04", + X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"00", + X"08",X"0C",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"0C",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0C",X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"00",X"10",X"10",X"10",X"08",X"04",X"00",X"00",X"40",X"20",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"08",X"10",X"10",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"80",X"84",X"88",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"20",X"40",X"00",X"01",X"04",X"08",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"00",X"04",X"10",X"10",X"00",X"00",X"00",X"00",X"40",X"20",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"08",X"04",X"01",X"00",X"40",X"20",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"20",X"40",X"00",X"00",X"00",X"00",X"00",X"08",X"06",X"00",X"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"40",X"50",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"80", + X"00",X"00",X"00",X"80",X"80",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"02",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"02",X"01",X"02",X"20",X"40",X"40",X"00",X"00",X"00",X"01",X"02",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"40",X"90",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"28",X"00",X"14",X"40",X"00",X"00",X"00",X"00",X"00", + X"40",X"40",X"80",X"80",X"00",X"02",X"00",X"01",X"00",X"00",X"00",X"00",X"80",X"80",X"40",X"40", + X"00",X"00",X"48",X"00",X"08",X"20",X"0B",X"10",X"49",X"02",X"14",X"80",X"00",X"12",X"00",X"40", + X"82",X"80",X"80",X"80",X"02",X"00",X"03",X"00",X"00",X"01",X"00",X"00",X"80",X"80",X"80",X"80", + X"E0",X"F0",X"FC",X"FE",X"F2",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"F8",X"E0", + X"01",X"07",X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1F",X"1F",X"0F",X"07",X"01", + X"C0",X"80",X"C0",X"C0",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"E0",X"F8",X"FC",X"FE",X"FE",X"F3",X"FF",X"FF",X"FF",X"FF",X"F3",X"FE",X"FE",X"FC",X"F8",X"E0", + X"01",X"07",X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1F",X"1F",X"0F",X"07",X"01", + X"C0",X"C0",X"C0",X"C0",X"C0",X"80",X"C0",X"C0",X"C0",X"C0",X"80",X"C0",X"C0",X"C0",X"C0",X"C0", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"E0",X"F8",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"F8",X"E0", + X"01",X"07",X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1F",X"1F",X"0F",X"07",X"01", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"00",X"C0",X"E0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F0",X"F0",X"E0",X"C0",X"00", + X"07",X"1F",X"3F",X"7E",X"7E",X"FA",X"FC",X"FF",X"FF",X"FC",X"FA",X"7E",X"7E",X"3F",X"1F",X"07", + X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00", + X"18",X"3E",X"7F",X"7B",X"FB",X"FB",X"F7",X"FF",X"FF",X"F7",X"FB",X"FB",X"7B",X"7F",X"3E",X"18", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"70",X"70",X"D8",X"D8",X"E8",X"E8",X"F8",X"F8",X"E8",X"E8",X"D8",X"D8",X"70",X"70",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"80",X"88",X"00",X"A0",X"80",X"A0",X"00",X"88",X"80",X"A0",X"A0",X"88",X"00",X"A0",X"48", + X"00",X"80",X"E0",X"F0",X"F0",X"78",X"F8",X"F8",X"F8",X"F8",X"78",X"F0",X"F0",X"E0",X"80",X"00", + X"00",X"07",X"1F",X"3F",X"3E",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"3E",X"3F",X"1F",X"07",X"00", + X"25",X"E0",X"FC",X"FD",X"AC",X"1E",X"BE",X"FE",X"FE",X"BE",X"1E",X"AC",X"FD",X"F8",X"E2",X"01", + X"10",X"01",X"07",X"2F",X"0E",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"0E",X"0F",X"07",X"09",X"00", + X"C0",X"F0",X"7C",X"3E",X"3F",X"3F",X"7F",X"FF",X"FF",X"FE",X"FC",X"F0",X"E0",X"C0",X"80",X"80", + X"07",X"18",X"10",X"20",X"28",X"A8",X"B6",X"F8",X"FF",X"3F",X"3F",X"3F",X"1F",X"0F",X"07",X"03", + X"C0",X"60",X"20",X"10",X"18",X"1C",X"3E",X"7F",X"FF",X"FF",X"FF",X"FF",X"FE",X"F8",X"E0",X"C0", + X"03",X"84",X"98",X"B0",X"70",X"34",X"3B",X"3C",X"3F",X"3F",X"7F",X"5F",X"DF",X"1F",X"0F",X"03", + X"80",X"C0",X"F0",X"FC",X"FE",X"7F",X"BF",X"BF",X"3F",X"3F",X"7F",X"FE",X"F0",X"E0",X"C0",X"00", + X"03",X"07",X"1F",X"1F",X"38",X"F3",X"60",X"20",X"20",X"20",X"70",X"38",X"3F",X"1F",X"0F",X"07", + X"C0",X"E0",X"F8",X"FC",X"7E",X"BE",X"5F",X"5F",X"1E",X"1E",X"3C",X"7C",X"F8",X"E0",X"C0",X"80", + X"03",X"0F",X"0F",X"1F",X"3C",X"79",X"30",X"30",X"30",X"70",X"F8",X"3C",X"1F",X"07",X"03",X"01", + X"80",X"C0",X"F0",X"FC",X"FC",X"F8",X"F8",X"F8",X"F8",X"FA",X"F9",X"FC",X"F0",X"E0",X"C0",X"00", + X"03",X"07",X"1F",X"1F",X"3F",X"FF",X"7F",X"3F",X"3F",X"3F",X"7F",X"3F",X"3F",X"1F",X"0F",X"07", + X"C0",X"E0",X"F8",X"FC",X"FE",X"FE",X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"E0",X"C0",X"80", + X"03",X"0F",X"0F",X"1F",X"3F",X"7F",X"3F",X"3F",X"3F",X"7F",X"FF",X"3F",X"1F",X"07",X"03",X"01", + X"00",X"80",X"E0",X"F0",X"F0",X"78",X"38",X"38",X"38",X"38",X"78",X"F0",X"E0",X"C0",X"00",X"00", + X"8E",X"9F",X"7F",X"7F",X"F8",X"F0",X"E0",X"E8",X"E8",X"E4",X"F0",X"F8",X"FF",X"7F",X"BF",X"9C", + X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"8C",X"9E",X"7F",X"7F",X"F8",X"F0",X"E0",X"E8",X"E8",X"E4",X"F0",X"F8",X"7F",X"7E",X"9C",X"8C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"C0",X"E0",X"E0",X"C0",X"C0",X"80",X"80",X"80",X"80",X"C0",X"C0",X"E0",X"C0",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"88",X"80",X"80",X"92",X"80",X"08",X"40",X"84",X"88",X"80",X"20",X"84",X"80",X"40",X"40", + X"00",X"00",X"C0",X"A0",X"F8",X"E8",X"7C",X"F8",X"FC",X"E8",X"F8",X"F0",X"40",X"80",X"00",X"00", + X"8E",X"9F",X"7F",X"7F",X"E3",X"C1",X"91",X"90",X"BC",X"90",X"C1",X"E3",X"FF",X"7F",X"BF",X"9C", + X"89",X"C0",X"64",X"DA",X"7C",X"3C",X"96",X"1E",X"9F",X"1B",X"3E",X"7A",X"DE",X"F8",X"60",X"CA", + X"05",X"23",X"07",X"9F",X"FC",X"38",X"32",X"31",X"32",X"30",X"38",X"FC",X"9B",X"0F",X"2F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"E0",X"C0",X"C0",X"E4",X"C0",X"C8",X"E2",X"C0",X"C8",X"E2",X"C0",X"C0",X"EA",X"C0", + X"C0",X"EA",X"C0",X"C0",X"E2",X"C8",X"C0",X"E2",X"C8",X"C0",X"E4",X"C0",X"C0",X"E0",X"C0",X"00", + X"80",X"80",X"C0",X"80",X"80",X"C8",X"80",X"90",X"C4",X"80",X"90",X"C4",X"80",X"80",X"D4",X"80", + X"80",X"D4",X"80",X"80",X"C4",X"90",X"80",X"C4",X"90",X"80",X"C8",X"80",X"80",X"C0",X"80",X"00", + X"00",X"00",X"80",X"00",X"00",X"90",X"00",X"20",X"88",X"00",X"20",X"88",X"00",X"00",X"A8",X"00", + X"00",X"A8",X"00",X"00",X"88",X"20",X"00",X"88",X"20",X"00",X"90",X"00",X"00",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"40",X"10",X"00",X"40",X"10",X"00",X"00",X"50",X"00", + X"00",X"50",X"00",X"00",X"10",X"40",X"00",X"10",X"40",X"00",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"80",X"20",X"00",X"80",X"20",X"00",X"00",X"A0",X"00", + X"00",X"A0",X"00",X"00",X"20",X"80",X"00",X"20",X"80",X"00",X"40",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"40",X"00",X"00",X"40",X"00",X"00",X"40",X"00", + X"00",X"40",X"00",X"00",X"40",X"00",X"00",X"40",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"80",X"00",X"00",X"80",X"00", + X"00",X"80",X"00",X"00",X"80",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"00", + X"06",X"06",X"07",X"06",X"06",X"07",X"06",X"06",X"07",X"06",X"06",X"07",X"06",X"06",X"07",X"06", + X"06",X"07",X"06",X"06",X"07",X"06",X"06",X"07",X"06",X"06",X"07",X"06",X"06",X"07",X"06",X"00", + X"0C",X"0C",X"0E",X"0C",X"0C",X"0E",X"0C",X"0C",X"0E",X"0C",X"0C",X"0E",X"0C",X"0C",X"0E",X"0C", + X"0C",X"0E",X"0C",X"0C",X"0E",X"0C",X"0C",X"0E",X"0C",X"0C",X"0E",X"0C",X"0C",X"0E",X"0C",X"00", + X"18",X"18",X"1C",X"18",X"18",X"1C",X"18",X"19",X"1C",X"18",X"19",X"1C",X"18",X"18",X"1D",X"18", + X"18",X"1D",X"18",X"18",X"1C",X"19",X"18",X"1C",X"19",X"18",X"1C",X"18",X"18",X"1C",X"18",X"00", + X"30",X"30",X"38",X"30",X"30",X"39",X"30",X"32",X"38",X"30",X"32",X"38",X"30",X"30",X"3A",X"30", + X"30",X"3A",X"30",X"30",X"38",X"32",X"30",X"38",X"32",X"30",X"39",X"30",X"30",X"38",X"30",X"00", + X"60",X"60",X"70",X"60",X"60",X"72",X"60",X"64",X"71",X"60",X"64",X"71",X"60",X"60",X"75",X"60", + X"60",X"75",X"60",X"60",X"71",X"64",X"60",X"71",X"64",X"60",X"72",X"60",X"60",X"70",X"60",X"00", + X"0E",X"06",X"0E",X"06",X"0E",X"06",X"0E",X"06",X"0E",X"06",X"0E",X"06",X"0E",X"06",X"0E",X"06", + X"06",X"0E",X"06",X"0E",X"06",X"0E",X"06",X"0E",X"06",X"0E",X"06",X"0E",X"06",X"0E",X"06",X"00", + X"1C",X"0C",X"1C",X"0C",X"1C",X"0C",X"1C",X"0C",X"1C",X"0C",X"1C",X"0C",X"1C",X"0C",X"1C",X"0C", + X"0C",X"1C",X"0C",X"1C",X"0C",X"1C",X"0C",X"1C",X"0C",X"1C",X"0C",X"1C",X"0C",X"1C",X"0C",X"00", + X"38",X"18",X"38",X"18",X"38",X"18",X"38",X"18",X"38",X"18",X"38",X"18",X"38",X"18",X"38",X"18", + X"18",X"38",X"18",X"38",X"18",X"38",X"18",X"38",X"18",X"38",X"18",X"38",X"18",X"38",X"18",X"00", + X"70",X"30",X"70",X"30",X"70",X"30",X"70",X"30",X"70",X"30",X"70",X"30",X"70",X"30",X"70",X"30", + X"30",X"70",X"30",X"70",X"30",X"70",X"30",X"70",X"30",X"70",X"30",X"70",X"30",X"70",X"30",X"00", + X"E0",X"60",X"E0",X"60",X"E0",X"60",X"E0",X"60",X"E0",X"60",X"E0",X"60",X"E0",X"60",X"E0",X"60", + X"60",X"E0",X"60",X"E0",X"60",X"E0",X"60",X"E0",X"60",X"E0",X"60",X"E0",X"60",X"E0",X"60",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00", + X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"00", + X"03",X"01",X"03",X"01",X"03",X"01",X"03",X"01",X"03",X"01",X"03",X"01",X"03",X"01",X"03",X"01", + X"01",X"03",X"01",X"03",X"01",X"03",X"01",X"03",X"01",X"03",X"01",X"03",X"01",X"03",X"01",X"00", + X"07",X"03",X"07",X"03",X"07",X"03",X"07",X"03",X"07",X"03",X"07",X"03",X"07",X"03",X"07",X"03", + X"03",X"07",X"03",X"07",X"03",X"07",X"03",X"07",X"03",X"07",X"03",X"07",X"03",X"07",X"03",X"00", + X"00",X"00",X"78",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"78",X"00",X"00", + X"00",X"00",X"F0",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F0",X"00",X"00", + X"00",X"00",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"00",X"00", + X"00",X"00",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"00",X"00", + X"00",X"00",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"01",X"00",X"00", + X"00",X"00",X"03",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"03",X"00",X"00", + X"00",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"00",X"00", + X"00",X"00",X"0F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"0F",X"00",X"00", + X"00",X"00",X"1E",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1E",X"00",X"00", + X"00",X"00",X"3C",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E", + X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"3C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"70",X"62",X"40",X"42",X"02",X"42",X"06",X"02",X"02",X"06",X"06",X"02",X"06", + X"06",X"06",X"06",X"02",X"06",X"02",X"02",X"02",X"06",X"00",X"02",X"40",X"02",X"38",X"00",X"00", + X"00",X"00",X"00",X"E0",X"C4",X"80",X"84",X"04",X"84",X"0C",X"04",X"04",X"0C",X"0C",X"04",X"0C", + X"0C",X"0C",X"0C",X"04",X"0C",X"04",X"04",X"04",X"0C",X"00",X"04",X"80",X"04",X"70",X"00",X"00", + X"00",X"00",X"00",X"C0",X"88",X"00",X"08",X"08",X"08",X"18",X"08",X"08",X"18",X"18",X"08",X"18", + X"18",X"18",X"18",X"08",X"18",X"08",X"08",X"08",X"18",X"00",X"08",X"00",X"08",X"E0",X"00",X"00", + X"00",X"00",X"00",X"80",X"10",X"00",X"10",X"10",X"10",X"30",X"10",X"10",X"30",X"30",X"10",X"30", + X"30",X"30",X"30",X"10",X"30",X"10",X"10",X"10",X"30",X"00",X"10",X"00",X"10",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"20",X"00",X"20",X"20",X"20",X"60",X"20",X"20",X"60",X"60",X"20",X"60", + X"60",X"60",X"60",X"20",X"60",X"20",X"20",X"20",X"60",X"00",X"20",X"00",X"20",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"40",X"40",X"C0",X"40",X"40",X"C0",X"C0",X"40",X"C0", + X"C0",X"C0",X"C0",X"40",X"C0",X"40",X"40",X"40",X"C0",X"00",X"40",X"00",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"80",X"00",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"03",X"02",X"02",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"01",X"00",X"00", + X"00",X"00",X"00",X"07",X"06",X"04",X"04",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"03",X"00",X"00", + X"00",X"00",X"00",X"0E",X"0C",X"08",X"08",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"07",X"00",X"00", + X"00",X"00",X"00",X"1C",X"18",X"10",X"10",X"00",X"10",X"01",X"00",X"00",X"01",X"01",X"00",X"01", + X"01",X"01",X"01",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"10",X"00",X"0E",X"00",X"00", + X"00",X"00",X"00",X"38",X"31",X"20",X"21",X"01",X"21",X"03",X"01",X"01",X"03",X"03",X"01",X"03", + X"03",X"03",X"03",X"01",X"03",X"01",X"01",X"01",X"03",X"00",X"01",X"20",X"01",X"1C",X"00",X"00", + X"D0",X"78",X"BC",X"FE",X"74",X"7A",X"FC",X"F8",X"7C",X"FA",X"FE",X"7C",X"3A",X"7C",X"F4",X"FE", + X"FE",X"F4",X"7C",X"3A",X"7C",X"FE",X"FA",X"7C",X"F8",X"FC",X"7A",X"74",X"FE",X"BC",X"78",X"00", + X"A0",X"F0",X"78",X"FC",X"E8",X"F4",X"F8",X"F0",X"F8",X"F4",X"FC",X"F8",X"74",X"F8",X"E8",X"FC", + X"FC",X"E8",X"F8",X"74",X"F8",X"FC",X"F4",X"F8",X"F0",X"F8",X"F4",X"E8",X"FC",X"78",X"F0",X"00", + X"40",X"E0",X"F0",X"F8",X"D0",X"E8",X"F0",X"E0",X"F0",X"E8",X"F8",X"F0",X"E8",X"F0",X"D0",X"F8", + X"F8",X"D0",X"F0",X"E8",X"F0",X"F8",X"E8",X"F0",X"E0",X"F0",X"E8",X"D0",X"F8",X"F0",X"E0",X"00", + X"80",X"C0",X"E0",X"F0",X"A0",X"D0",X"E0",X"C0",X"E0",X"D0",X"F0",X"E0",X"D0",X"E0",X"A0",X"F0", + X"F0",X"A0",X"E0",X"D0",X"E0",X"F0",X"D0",X"E0",X"C0",X"E0",X"D0",X"A0",X"F0",X"E0",X"C0",X"00", + X"00",X"80",X"C0",X"E0",X"40",X"A0",X"C0",X"80",X"C0",X"A0",X"E0",X"C0",X"A0",X"C0",X"40",X"E0", + X"E0",X"40",X"C0",X"A0",X"C0",X"E0",X"A0",X"C0",X"80",X"C0",X"A0",X"40",X"E0",X"C0",X"80",X"00", + X"00",X"00",X"80",X"C0",X"80",X"40",X"80",X"00",X"80",X"40",X"C0",X"80",X"40",X"80",X"80",X"C0", + X"C0",X"80",X"80",X"40",X"80",X"C0",X"40",X"80",X"00",X"80",X"40",X"80",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"00",X"00",X"80",X"80",X"00",X"80",X"00",X"00",X"80", + X"80",X"00",X"00",X"80",X"00",X"80",X"80",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"01",X"01",X"00",X"00",X"01",X"01",X"00",X"01",X"01",X"00",X"00",X"00",X"01",X"01", + X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"00",X"01",X"01",X"00",X"00",X"01",X"01",X"00",X"00", + X"03",X"01",X"02",X"03",X"01",X"01",X"03",X"03",X"01",X"03",X"03",X"01",X"00",X"01",X"03",X"03", + X"03",X"03",X"01",X"00",X"01",X"03",X"03",X"01",X"03",X"03",X"01",X"01",X"03",X"02",X"01",X"00", + X"06",X"03",X"05",X"07",X"03",X"03",X"07",X"07",X"03",X"07",X"07",X"03",X"01",X"03",X"07",X"07", + X"07",X"07",X"03",X"01",X"03",X"07",X"07",X"03",X"07",X"07",X"03",X"03",X"07",X"05",X"03",X"00", + X"0D",X"07",X"0B",X"0F",X"07",X"07",X"0F",X"0F",X"07",X"0F",X"0F",X"07",X"03",X"07",X"0F",X"0F", + X"0F",X"0F",X"07",X"03",X"07",X"0F",X"0F",X"07",X"0F",X"0F",X"07",X"07",X"0F",X"0B",X"07",X"00", + X"1A",X"0F",X"17",X"1F",X"0E",X"0F",X"1F",X"1F",X"0F",X"1F",X"1F",X"0F",X"07",X"0F",X"1E",X"1F", + X"1F",X"1E",X"0F",X"07",X"0F",X"1F",X"1F",X"0F",X"1F",X"1F",X"0F",X"0E",X"1F",X"17",X"0F",X"00", + X"34",X"1E",X"2F",X"3F",X"1D",X"1E",X"3F",X"3E",X"1F",X"3E",X"3F",X"1F",X"0E",X"1F",X"3D",X"3F", + X"3F",X"3D",X"1F",X"0E",X"1F",X"3F",X"3E",X"1F",X"3E",X"3F",X"1E",X"1D",X"3F",X"2F",X"1E",X"00", + X"68",X"3C",X"5E",X"7F",X"3A",X"3D",X"7E",X"7C",X"3E",X"7D",X"7F",X"3E",X"1D",X"3E",X"7A",X"7F", + X"7F",X"7A",X"3E",X"1D",X"3E",X"7F",X"7D",X"3E",X"7C",X"7E",X"3D",X"3A",X"7F",X"5E",X"3C",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/fg_sp_graphx_2.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/fg_sp_graphx_2.vhd new file mode 100644 index 00000000..7d0d60c0 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/fg_sp_graphx_2.vhd @@ -0,0 +1,438 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity fg_sp_graphx_2 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 prom of fg_sp_graphx_2 is + type rom is array(0 to 6655) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"38",X"20",X"38",X"F4",X"FF",X"F8",X"FC",X"F8",X"F0",X"7E",X"30",X"3C",X"00",X"00", + X"00",X"00",X"00",X"18",X"60",X"01",X"03",X"03",X"03",X"03",X"01",X"60",X"18",X"00",X"00",X"00", + X"00",X"00",X"00",X"D0",X"C8",X"C0",X"E2",X"C0",X"C8",X"C0",X"E0",X"C8",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"07",X"1F",X"7F",X"FF",X"7F",X"1F",X"07",X"01",X"00",X"00",X"00",X"00", + X"00",X"80",X"B0",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"B0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"18",X"31",X"31",X"61",X"61",X"61",X"31",X"31",X"18",X"00",X"00",X"00",X"00",X"00", + X"00",X"6C",X"EE",X"EE",X"EE",X"EE",X"EE",X"6C",X"00",X"64",X"F6",X"A2",X"A2",X"82",X"F6",X"64", + X"00",X"54",X"82",X"F6",X"82",X"B2",X"82",X"54",X"00",X"00",X"0C",X"0E",X"0E",X"4E",X"6C",X"00", + X"00",X"00",X"60",X"E0",X"E0",X"E0",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"E0",X"F0",X"E0",X"E0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"18",X"18",X"00",X"44",X"60",X"61",X"20",X"20",X"20",X"60",X"64",X"E8",X"C0",X"48",X"0C",X"00", + X"00",X"00",X"00",X"00",X"E0",X"F0",X"E0",X"E0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"60",X"60",X"66",X"78",X"18",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"E0",X"F0",X"E0",X"E0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0C",X"4C",X"68",X"69",X"28",X"24",X"20",X"20",X"60",X"60",X"60",X"08",X"0C",X"00", + X"00",X"00",X"00",X"00",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"0C",X"0C",X"00",X"61",X"61",X"01",X"01",X"11",X"11",X"00",X"00",X"00",X"10",X"10", + X"00",X"00",X"00",X"00",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00", + X"10",X"10",X"00",X"00",X"00",X"11",X"11",X"01",X"01",X"61",X"61",X"00",X"0C",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"80",X"80",X"80",X"80",X"80",X"80",X"C0",X"00",X"00",X"00",X"00", + X"10",X"10",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"60",X"60",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"80",X"80",X"80",X"80",X"80",X"80",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"10",X"10", + X"00",X"00",X"00",X"00",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00", + X"10",X"10",X"00",X"00",X"00",X"61",X"61",X"01",X"01",X"61",X"61",X"00",X"00",X"00",X"10",X"10", + X"00",X"00",X"00",X"00",X"C0",X"80",X"80",X"80",X"80",X"80",X"80",X"C0",X"00",X"00",X"00",X"00", + X"10",X"10",X"00",X"00",X"00",X"60",X"60",X"00",X"00",X"60",X"60",X"00",X"00",X"00",X"10",X"10", + X"00",X"C0",X"00",X"00",X"E0",X"F0",X"E0",X"E0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"00",X"00",X"00",X"01",X"60",X"60",X"66",X"78",X"78",X"68",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"00",X"00",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"61",X"61",X"01",X"01",X"21",X"61",X"60",X"00",X"00",X"10",X"10", + X"00",X"70",X"30",X"40",X"C0",X"80",X"80",X"80",X"80",X"80",X"80",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00",X"00",X"60",X"E0",X"C0",X"00",X"00",X"10",X"10", + X"20",X"20",X"00",X"00",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"00",X"00",X"20",X"20", + X"00",X"00",X"00",X"00",X"10",X"70",X"70",X"10",X"10",X"70",X"70",X"10",X"00",X"00",X"00",X"00", + X"20",X"20",X"00",X"00",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"00",X"00",X"20",X"20", + X"00",X"00",X"00",X"00",X"10",X"70",X"70",X"10",X"10",X"70",X"70",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"18",X"08",X"F1",X"FA",X"F8",X"FB",X"F8",X"F8",X"FA",X"F1",X"08",X"18",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"70",X"70",X"10",X"10",X"70",X"70",X"10",X"00",X"00",X"00",X"00", + X"10",X"10",X"00",X"00",X"78",X"7C",X"7C",X"7C",X"7C",X"7C",X"7C",X"78",X"00",X"00",X"10",X"10", + X"00",X"00",X"00",X"06",X"0F",X"01",X"01",X"07",X"07",X"01",X"01",X"0F",X"06",X"00",X"00",X"00", + X"00",X"00",X"F0",X"F0",X"C0",X"C0",X"80",X"80",X"80",X"C0",X"C0",X"F0",X"F0",X"00",X"00",X"00", + X"03",X"03",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"00",X"03",X"03", + X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00", + X"03",X"03",X"00",X"7F",X"FF",X"FD",X"FC",X"F8",X"F8",X"FC",X"FD",X"FF",X"7F",X"00",X"03",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"30",X"0F",X"7F",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FF",X"7F",X"00",X"30",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0C",X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"4C",X"40",X"40",X"4C",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"4C",X"40",X"40",X"4C",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"50",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"02",X"01",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"40",X"90",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"24",X"00",X"00",X"10",X"20",X"00",X"10",X"00",X"00",X"08",X"20",X"10",X"40", + X"00",X"00",X"00",X"00",X"C0",X"E0",X"F8",X"D4",X"FC",X"E8",X"B8",X"70",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0F",X"3D",X"7F",X"FE",X"FF",X"FF",X"7F",X"38",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"14",X"DE",X"F4",X"EF",X"B6",X"FC",X"E8",X"70",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0C",X"1F",X"3C",X"3F",X"37",X"1A",X"0E",X"03",X"00",X"00",X"00",X"00", + X"E0",X"10",X"04",X"02",X"02",X"01",X"01",X"01",X"01",X"01",X"01",X"02",X"02",X"04",X"18",X"E0", + X"01",X"06",X"08",X"10",X"10",X"20",X"20",X"20",X"20",X"20",X"20",X"10",X"10",X"08",X"06",X"01", + X"C0",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"C0", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"E0",X"18",X"04",X"02",X"02",X"01",X"01",X"01",X"01",X"01",X"01",X"02",X"02",X"04",X"18",X"E0", + X"01",X"06",X"08",X"10",X"10",X"20",X"20",X"20",X"20",X"20",X"20",X"10",X"10",X"08",X"06",X"01", + X"C0",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"C0", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"E0",X"18",X"04",X"02",X"02",X"01",X"01",X"01",X"01",X"01",X"01",X"02",X"02",X"04",X"18",X"E0", + X"01",X"06",X"08",X"10",X"10",X"20",X"20",X"20",X"20",X"20",X"20",X"10",X"10",X"08",X"06",X"01", + X"C0",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"C0", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"C0",X"20",X"10",X"10",X"08",X"08",X"08",X"08",X"08",X"08",X"10",X"10",X"20",X"C0",X"00", + X"07",X"18",X"20",X"40",X"40",X"80",X"80",X"80",X"80",X"80",X"80",X"40",X"40",X"20",X"18",X"07", + X"00",X"00",X"00",X"80",X"80",X"40",X"40",X"40",X"40",X"40",X"40",X"80",X"80",X"00",X"00",X"00", + X"18",X"26",X"41",X"40",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"40",X"41",X"26",X"18", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"10",X"10",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"10",X"10",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"C0",X"F0",X"F0",X"68",X"F8",X"78",X"F8",X"D8",X"78",X"E0",X"F0",X"E0",X"80",X"00", + X"00",X"07",X"1F",X"3F",X"3A",X"7F",X"7F",X"7F",X"7F",X"7B",X"7F",X"3E",X"3F",X"1E",X"07",X"00", + X"00",X"E0",X"B8",X"F4",X"A8",X"1E",X"B4",X"FE",X"DA",X"BC",X"1E",X"AC",X"DC",X"F0",X"A0",X"00", + X"00",X"00",X"07",X"0F",X"0E",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"0E",X"0E",X"07",X"01",X"00", + X"00",X"00",X"80",X"C0",X"C0",X"C0",X"80",X"00",X"04",X"18",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"0F",X"1F",X"1F",X"1F",X"0F",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"C0",X"E0",X"E0",X"E0",X"C0",X"80",X"00",X"04",X"18",X"20",X"00",X"00",X"00",X"00", + X"00",X"03",X"07",X"0F",X"0F",X"0F",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"C4",X"C0",X"98",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"0F",X"1F",X"1F",X"1F",X"1F",X"0F",X"07",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"E2",X"E4",X"E8",X"C0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"07",X"07",X"07",X"07",X"07",X"07",X"C2",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"18",X"09",X"02",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"06",X"03",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"0F",X"1F",X"1F",X"1F",X"1F",X"0F",X"07",X"08",X"06",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"0F",X"1F",X"1F",X"1F",X"1F",X"0F",X"07",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"20",X"30",X"78",X"78",X"78",X"78",X"30",X"20",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"50",X"F8",X"D8",X"FC",X"F4",X"FC",X"D8",X"F8",X"F0",X"C0",X"80",X"00",X"00", + X"8E",X"9F",X"7F",X"7F",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"7F",X"BF",X"9C", + X"80",X"40",X"C0",X"F8",X"FC",X"FC",X"FA",X"FE",X"FF",X"F7",X"FE",X"FE",X"EC",X"78",X"E0",X"C0", + X"01",X"03",X"07",X"97",X"FF",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"FF",X"9F",X"0B",X"0F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"F0",X"F8",X"F8",X"FC",X"FC",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE", + X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0",X"00", + X"C0",X"E0",X"F0",X"F0",X"F8",X"F8",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"F8",X"F8",X"F0",X"F0",X"E0",X"00", + X"80",X"C0",X"E0",X"E0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F0",X"F0",X"E0",X"E0",X"C0",X"00", + X"00",X"80",X"C0",X"C0",X"E0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"E0",X"C0",X"C0",X"80",X"00", + X"00",X"00",X"80",X"80",X"C0",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"C0",X"80",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"00", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"00", + X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00", + X"1C",X"1E",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1E",X"00", + X"38",X"3C",X"3E",X"3E",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3E",X"3E",X"3C",X"00", + X"70",X"78",X"7C",X"7C",X"7E",X"7E",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F", + X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7E",X"7E",X"7C",X"7C",X"78",X"00", + X"1E",X"7E",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE", + X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"7E",X"00", + X"3C",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"00", + X"78",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00", + X"00",X"01",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"01",X"00", + X"00",X"03",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"03",X"00", + X"01",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"00", + X"03",X"0F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"0F",X"00", + X"07",X"1F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1F",X"00", + X"0F",X"3F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F", + X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"00", + X"00",X"00",X"78",X"FC",X"CC",X"84",X"84",X"B4",X"B4",X"B4",X"F4",X"B4",X"F4",X"F4",X"F4",X"F4", + X"FC",X"FC",X"F4",X"F4",X"F4",X"F4",X"F4",X"F4",X"B4",X"BC",X"CC",X"FC",X"FC",X"78",X"00",X"00", + X"00",X"00",X"F0",X"F8",X"98",X"08",X"08",X"68",X"68",X"68",X"E8",X"68",X"E8",X"E8",X"E8",X"E8", + X"F8",X"F8",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"68",X"78",X"98",X"F8",X"F8",X"F0",X"00",X"00", + X"00",X"00",X"E0",X"F0",X"30",X"10",X"10",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0", + X"F0",X"F0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"F0",X"30",X"F0",X"F0",X"E0",X"00",X"00", + X"00",X"00",X"C0",X"E0",X"60",X"20",X"20",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0", + X"E0",X"E0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"A0",X"E0",X"60",X"E0",X"E0",X"C0",X"00",X"00", + X"00",X"00",X"80",X"C0",X"C0",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"C0",X"C0",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"C0",X"C0",X"C0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"03",X"02",X"02",X"02",X"02",X"02",X"03",X"02",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"02",X"02",X"03",X"03",X"03",X"01",X"00",X"00", + X"00",X"00",X"03",X"07",X"06",X"04",X"04",X"05",X"05",X"05",X"07",X"05",X"07",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"05",X"05",X"06",X"07",X"07",X"03",X"00",X"00", + X"00",X"00",X"07",X"0F",X"0C",X"08",X"08",X"0B",X"0B",X"0B",X"0F",X"0B",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0B",X"0B",X"0C",X"0F",X"0F",X"07",X"00",X"00", + X"00",X"00",X"0F",X"1F",X"19",X"10",X"10",X"16",X"16",X"16",X"1E",X"16",X"1E",X"1E",X"1E",X"1E", + X"1F",X"1F",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"16",X"17",X"19",X"1F",X"1F",X"0F",X"00",X"00", + X"00",X"00",X"1E",X"3F",X"33",X"21",X"21",X"2D",X"2D",X"2D",X"3D",X"2D",X"3D",X"3D",X"3D",X"3D", + X"3F",X"3F",X"3D",X"3D",X"3D",X"3D",X"3D",X"3D",X"2D",X"2F",X"33",X"3F",X"3F",X"1E",X"00",X"00", + X"00",X"00",X"3C",X"7E",X"66",X"42",X"42",X"5A",X"5A",X"5A",X"7A",X"5A",X"7A",X"7A",X"7A",X"7A", + X"7E",X"7E",X"7A",X"7A",X"7A",X"7A",X"7A",X"7A",X"5A",X"5E",X"66",X"7E",X"7E",X"3C",X"00",X"00", + X"00",X"00",X"38",X"7C",X"54",X"FE",X"EA",X"FE",X"B6",X"FE",X"EE",X"FE",X"BA",X"EE",X"FE",X"B6", + X"B6",X"FE",X"EE",X"BA",X"FE",X"EE",X"FE",X"B6",X"FE",X"EA",X"FE",X"54",X"7C",X"38",X"00",X"00", + X"00",X"00",X"70",X"F8",X"A8",X"FC",X"D4",X"FC",X"6C",X"FC",X"DC",X"FC",X"74",X"DC",X"FC",X"6C", + X"6C",X"FC",X"DC",X"74",X"FC",X"DC",X"FC",X"6C",X"FC",X"D4",X"FC",X"A8",X"F8",X"70",X"00",X"00", + X"00",X"00",X"E0",X"F0",X"50",X"F8",X"A8",X"F8",X"D8",X"F8",X"B8",X"F8",X"E8",X"B8",X"F8",X"D8", + X"D8",X"F8",X"B8",X"E8",X"F8",X"B8",X"F8",X"D8",X"F8",X"A8",X"F8",X"50",X"F0",X"E0",X"00",X"00", + X"00",X"00",X"C0",X"E0",X"A0",X"F0",X"50",X"F0",X"B0",X"F0",X"70",X"F0",X"D0",X"70",X"F0",X"B0", + X"B0",X"F0",X"70",X"D0",X"F0",X"70",X"F0",X"B0",X"F0",X"50",X"F0",X"A0",X"E0",X"C0",X"00",X"00", + X"00",X"00",X"80",X"C0",X"40",X"E0",X"A0",X"E0",X"60",X"E0",X"E0",X"E0",X"A0",X"E0",X"E0",X"60", + X"60",X"E0",X"E0",X"A0",X"E0",X"E0",X"E0",X"60",X"E0",X"A0",X"E0",X"40",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"80",X"80",X"C0",X"40",X"C0",X"C0",X"C0",X"C0",X"C0",X"40",X"C0",X"C0",X"C0", + X"C0",X"C0",X"C0",X"40",X"C0",X"C0",X"C0",X"C0",X"C0",X"40",X"C0",X"80",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"03",X"03",X"03",X"02",X"03",X"03",X"03",X"02",X"03",X"03",X"02", + X"02",X"03",X"03",X"02",X"03",X"03",X"03",X"02",X"03",X"03",X"03",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"02",X"07",X"07",X"07",X"05",X"07",X"07",X"07",X"05",X"07",X"07",X"05", + X"05",X"07",X"07",X"05",X"07",X"07",X"07",X"05",X"07",X"07",X"07",X"02",X"03",X"01",X"00",X"00", + X"00",X"00",X"03",X"07",X"05",X"0F",X"0E",X"0F",X"0B",X"0F",X"0E",X"0F",X"0B",X"0E",X"0F",X"0B", + X"0B",X"0F",X"0E",X"0B",X"0F",X"0E",X"0F",X"0B",X"0F",X"0E",X"0F",X"05",X"07",X"03",X"00",X"00", + X"00",X"00",X"07",X"0F",X"0A",X"1F",X"1D",X"1F",X"16",X"1F",X"1D",X"1F",X"17",X"1D",X"1F",X"16", + X"16",X"1F",X"1D",X"17",X"1F",X"1D",X"1F",X"16",X"1F",X"1D",X"1F",X"0A",X"0F",X"07",X"00",X"00", + X"00",X"00",X"0E",X"1F",X"15",X"3F",X"3A",X"3F",X"2D",X"3F",X"3B",X"3F",X"2E",X"3B",X"3F",X"2D", + X"2D",X"3F",X"3B",X"2E",X"3F",X"3B",X"3F",X"2D",X"3F",X"3A",X"3F",X"15",X"1F",X"0E",X"00",X"00", + X"00",X"00",X"1C",X"3E",X"2A",X"7F",X"75",X"7F",X"5B",X"7F",X"77",X"7F",X"5D",X"77",X"7F",X"5B", + X"5B",X"7F",X"77",X"5D",X"7F",X"77",X"7F",X"5B",X"7F",X"75",X"7F",X"2A",X"3E",X"1C",X"00",X"00", + X"00",X"7C",X"04",X"04",X"0E",X"08",X"08",X"08",X"08",X"0C",X"08",X"0A",X"08",X"0C",X"0A",X"08", + X"0C",X"08",X"08",X"08",X"0C",X"08",X"0A",X"08",X"0C",X"08",X"0A",X"0C",X"06",X"04",X"7C",X"00", + X"00",X"F8",X"08",X"08",X"1C",X"10",X"10",X"10",X"10",X"18",X"10",X"14",X"10",X"18",X"14",X"10", + X"18",X"10",X"10",X"10",X"18",X"10",X"14",X"10",X"18",X"10",X"14",X"18",X"0C",X"08",X"F8",X"00", + X"00",X"F0",X"10",X"10",X"38",X"20",X"20",X"20",X"20",X"30",X"20",X"28",X"20",X"30",X"28",X"20", + X"30",X"20",X"20",X"20",X"30",X"20",X"28",X"20",X"30",X"20",X"28",X"30",X"18",X"10",X"F0",X"00", + X"00",X"E0",X"20",X"20",X"70",X"40",X"40",X"40",X"40",X"60",X"40",X"50",X"40",X"60",X"50",X"40", + X"60",X"40",X"40",X"40",X"60",X"40",X"50",X"40",X"60",X"40",X"50",X"60",X"30",X"20",X"E0",X"00", + X"00",X"C0",X"40",X"40",X"E0",X"80",X"80",X"80",X"80",X"C0",X"80",X"A0",X"80",X"C0",X"A0",X"80", + X"C0",X"80",X"80",X"80",X"C0",X"80",X"A0",X"80",X"C0",X"80",X"A0",X"C0",X"60",X"40",X"C0",X"00", + X"00",X"80",X"80",X"80",X"C0",X"00",X"00",X"00",X"00",X"80",X"00",X"40",X"00",X"80",X"40",X"00", + X"80",X"00",X"00",X"00",X"80",X"00",X"40",X"00",X"80",X"00",X"40",X"80",X"C0",X"80",X"80",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00", + X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00", + X"00",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"00", + X"00",X"0F",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"0F",X"00", + X"00",X"1F",X"01",X"01",X"03",X"02",X"02",X"02",X"02",X"03",X"02",X"02",X"02",X"03",X"02",X"02", + X"03",X"02",X"02",X"02",X"03",X"02",X"02",X"02",X"03",X"02",X"02",X"03",X"01",X"01",X"1F",X"00", + X"00",X"3E",X"02",X"02",X"07",X"04",X"04",X"04",X"04",X"06",X"04",X"05",X"04",X"06",X"05",X"04", + X"06",X"04",X"04",X"04",X"06",X"04",X"05",X"04",X"06",X"04",X"05",X"06",X"03",X"02",X"3E",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/fg_sp_graphx_3.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/fg_sp_graphx_3.vhd new file mode 100644 index 00000000..caa478b3 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/Roms/fg_sp_graphx_3.vhd @@ -0,0 +1,470 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity fg_sp_graphx_3 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 prom of fg_sp_graphx_3 is + type rom is array(0 to 7167) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"3E",X"61",X"41",X"43",X"3E",X"1C", + X"00",X"00",X"40",X"42",X"7F",X"7F",X"40",X"40",X"00",X"62",X"73",X"79",X"59",X"5D",X"4F",X"46", + X"00",X"20",X"61",X"49",X"4D",X"4F",X"7B",X"31",X"00",X"18",X"1C",X"16",X"13",X"7F",X"7F",X"10", + X"00",X"27",X"67",X"45",X"45",X"45",X"7D",X"38",X"00",X"3C",X"7E",X"4B",X"49",X"49",X"79",X"30", + X"00",X"03",X"03",X"71",X"79",X"0D",X"07",X"03",X"00",X"36",X"4F",X"4D",X"59",X"59",X"76",X"30", + X"00",X"06",X"4F",X"49",X"49",X"69",X"3F",X"1E",X"00",X"7C",X"7E",X"13",X"11",X"13",X"7E",X"7C", + X"00",X"7F",X"7F",X"49",X"49",X"49",X"7F",X"36",X"00",X"1C",X"3E",X"63",X"41",X"41",X"63",X"22", + X"00",X"7F",X"7F",X"41",X"41",X"63",X"3E",X"1C",X"00",X"00",X"7F",X"7F",X"49",X"49",X"49",X"41", + X"00",X"7F",X"7F",X"09",X"09",X"09",X"09",X"01",X"00",X"1C",X"3E",X"63",X"41",X"49",X"79",X"79", + X"00",X"7F",X"7F",X"08",X"08",X"08",X"7F",X"7F",X"00",X"00",X"41",X"41",X"7F",X"7F",X"41",X"41", + X"00",X"20",X"60",X"40",X"40",X"40",X"7F",X"3F",X"00",X"7F",X"7F",X"18",X"3C",X"76",X"63",X"41", + X"00",X"00",X"7F",X"7F",X"40",X"40",X"40",X"40",X"00",X"7F",X"7F",X"0E",X"1C",X"0E",X"7F",X"7F", + X"00",X"7F",X"7F",X"0E",X"1C",X"38",X"7F",X"7F",X"00",X"3E",X"7F",X"41",X"41",X"41",X"7F",X"3E", + X"00",X"7F",X"7F",X"11",X"11",X"11",X"1F",X"0E",X"00",X"3E",X"7F",X"41",X"51",X"71",X"3F",X"5E", + X"00",X"7F",X"7F",X"11",X"31",X"79",X"6F",X"4E",X"00",X"26",X"6F",X"49",X"49",X"4B",X"7A",X"30", + X"00",X"00",X"01",X"01",X"7F",X"7F",X"01",X"01",X"00",X"3F",X"7F",X"40",X"40",X"40",X"7F",X"3F", + X"00",X"0F",X"1F",X"38",X"70",X"38",X"1F",X"0F",X"00",X"1F",X"7F",X"38",X"1C",X"38",X"7F",X"1F", + X"00",X"63",X"77",X"3E",X"1C",X"3E",X"77",X"63",X"00",X"00",X"03",X"0F",X"78",X"78",X"0F",X"03", + X"00",X"61",X"71",X"79",X"5D",X"4F",X"47",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"00", + X"00",X"00",X"80",X"60",X"60",X"00",X"00",X"00",X"00",X"0C",X"02",X"A2",X"12",X"12",X"0C",X"00", + X"00",X"00",X"BE",X"00",X"00",X"BE",X"00",X"00",X"7E",X"C3",X"99",X"A5",X"A5",X"81",X"C3",X"7E", + X"00",X"FF",X"FF",X"C3",X"E7",X"7E",X"7E",X"FF",X"FF",X"DB",X"DB",X"DB",X"7E",X"FF",X"C3",X"C3", + X"F7",X"76",X"7E",X"FF",X"C3",X"C3",X"FF",X"7E",X"7E",X"12",X"1E",X"00",X"7E",X"5A",X"5A",X"00", + X"7E",X"12",X"1E",X"00",X"7E",X"12",X"1E",X"00",X"7E",X"5A",X"5A",X"00",X"7E",X"12",X"2E",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"01",X"01",X"0F",X"01",X"01",X"00",X"0F",X"02", + X"04",X"02",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"68",X"94",X"A8",X"40",X"00", + X"00",X"00",X"10",X"0E",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"A0",X"80",X"00",X"00",X"20",X"00",X"50",X"00",X"00",X"20",X"80",X"80",X"80",X"00", + X"00",X"03",X"1F",X"FF",X"FE",X"FC",X"F8",X"F9",X"F8",X"F9",X"FC",X"FE",X"FF",X"1F",X"03",X"00", + X"00",X"00",X"00",X"10",X"08",X"00",X"22",X"00",X"08",X"00",X"20",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"02",X"15",X"2A",X"15",X"02",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"20",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"10",X"10",X"20",X"20",X"20",X"10",X"10",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"44",X"92",X"D6",X"92",X"D6",X"92",X"44",X"00",X"40",X"9A",X"82",X"8A",X"8A",X"9A",X"40", + X"00",X"10",X"82",X"BA",X"82",X"BA",X"82",X"10",X"00",X"00",X"08",X"08",X"0A",X"08",X"08",X"00", + X"00",X"00",X"00",X"2E",X"04",X"2E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"24",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"CC",X"E2",X"E0",X"20",X"20",X"20",X"60",X"64",X"E8",X"C0",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"24",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"00",X"02",X"80",X"E0",X"E0",X"E6",X"E0",X"00",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"24",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"40",X"68",X"68",X"28",X"24",X"20",X"20",X"60",X"E0",X"E0",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"4E",X"04",X"04",X"4E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"E0",X"EA",X"00",X"00",X"3A",X"30",X"20",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"4E",X"04",X"04",X"4E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"20",X"30",X"3A",X"00",X"00",X"EA",X"E0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"20",X"30",X"30",X"00",X"00",X"00",X"E0",X"E0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"E0",X"E0",X"00",X"00",X"00",X"30",X"30",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"4E",X"04",X"04",X"4E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"E0",X"EA",X"00",X"00",X"EA",X"E0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"E0",X"E0",X"00",X"00",X"E0",X"E0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"24",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"00",X"02",X"80",X"E0",X"E0",X"E6",X"E0",X"60",X"68",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"4E",X"04",X"04",X"4E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"E0",X"EA",X"00",X"00",X"2A",X"60",X"60",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"E0",X"E0",X"00",X"00",X"60",X"E0",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"4E",X"04",X"04",X"4E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"90",X"F0",X"F5",X"10",X"10",X"F5",X"F0",X"90",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"4E",X"04",X"04",X"4E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"90",X"F0",X"F5",X"10",X"10",X"F5",X"F0",X"90",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"20",X"00",X"00",X"20",X"40",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"90",X"F0",X"F5",X"10",X"10",X"F5",X"F0",X"90",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"00",X"00",X"A0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"06",X"0F",X"0F",X"0F",X"07",X"07",X"0F",X"0F",X"0F",X"06",X"00",X"00",X"00", + X"00",X"00",X"FC",X"FE",X"C0",X"C0",X"80",X"80",X"80",X"C0",X"C0",X"FE",X"FC",X"00",X"00",X"00", + X"00",X"00",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"00",X"00",X"00", + X"00",X"00",X"30",X"60",X"C0",X"80",X"00",X"00",X"00",X"00",X"C0",X"E0",X"30",X"00",X"00",X"00", + X"00",X"00",X"00",X"7F",X"FF",X"FD",X"FC",X"F8",X"F8",X"FC",X"FD",X"FF",X"7F",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"00", + X"00",X"00",X"0F",X"7F",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FF",X"7F",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0E",X"13",X"3F",X"FF",X"FF",X"FF",X"FE",X"FC",X"38",X"E0",X"00",X"00",X"00", + X"80",X"80",X"80",X"9C",X"3E",X"2F",X"2F",X"2F",X"37",X"1B",X"0F",X"07",X"41",X"20",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"F8",X"FC",X"F2",X"FF",X"FF",X"FF",X"3F",X"1F",X"0E", + X"00",X"08",X"10",X"10",X"20",X"00",X"03",X"0F",X"1F",X"1F",X"3F",X"3E",X"BF",X"BB",X"96",X"9C", + X"00",X"00",X"00",X"00",X"F0",X"FC",X"FE",X"F3",X"FF",X"FF",X"F2",X"1C",X"00",X"00",X"00",X"00", + X"00",X"10",X"20",X"40",X"03",X"0E",X"1B",X"37",X"3F",X"3F",X"1F",X"0E",X"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"1C",X"F2",X"FF",X"FF",X"F3",X"FE",X"FC",X"F0",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"0E",X"1B",X"2F",X"2F",X"3F",X"1F",X"0F",X"03",X"40",X"20",X"10",X"00", + X"00",X"00",X"00",X"00",X"1C",X"FE",X"FF",X"FF",X"FF",X"FE",X"FC",X"F0",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"0E",X"1F",X"3F",X"3F",X"37",X"1B",X"0E",X"03",X"40",X"20",X"10",X"00", + X"00",X"00",X"00",X"00",X"F0",X"DC",X"F6",X"FF",X"FF",X"FF",X"FE",X"1C",X"00",X"00",X"00",X"00", + X"00",X"10",X"20",X"40",X"03",X"0F",X"1F",X"3F",X"3F",X"37",X"19",X"0E",X"80",X"80",X"80",X"80", + X"00",X"E0",X"F0",X"F8",X"B8",X"A8",X"E8",X"F8",X"F0",X"F0",X"E0",X"E0",X"C0",X"80",X"60",X"80", + X"00",X"00",X"01",X"83",X"83",X"87",X"47",X"1F",X"3F",X"7F",X"7F",X"7F",X"7D",X"33",X"1E",X"00", + X"00",X"80",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"07",X"1F",X"3E",X"3D",X"7E",X"7D",X"FE",X"FC",X"FC",X"FC",X"FC",X"FE",X"FF",X"7E",X"7C",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"70",X"70",X"30",X"60",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"60",X"70",X"70",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"80",X"90",X"A4",X"00",X"80",X"90",X"A0",X"80",X"90",X"00",X"80",X"88",X"20",X"90",X"40", + X"00",X"00",X"00",X"00",X"C0",X"E0",X"F8",X"D4",X"FC",X"E8",X"B8",X"70",X"00",X"00",X"00",X"00", + X"40",X"40",X"80",X"80",X"0F",X"3D",X"7F",X"FE",X"FF",X"FF",X"7F",X"38",X"80",X"80",X"40",X"40", + X"00",X"00",X"00",X"00",X"14",X"DE",X"F4",X"EF",X"B6",X"FC",X"E8",X"70",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"0C",X"1F",X"3C",X"3F",X"3F",X"1E",X"0F",X"03",X"80",X"80",X"80",X"80", + X"E0",X"FC",X"7C",X"FE",X"BE",X"EF",X"FF",X"FF",X"B7",X"FF",X"FF",X"5E",X"FE",X"FC",X"F8",X"E0", + X"21",X"47",X"4F",X"9F",X"9B",X"3E",X"37",X"3F",X"3D",X"BF",X"BB",X"9F",X"9F",X"8F",X"07",X"01", + X"C0",X"E0",X"C0",X"C0",X"E0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"01",X"01",X"81",X"81",X"81",X"81",X"81",X"01",X"01",X"01",X"01",X"81",X"81",X"41",X"41",X"21", + X"E0",X"F8",X"7C",X"FE",X"BE",X"EF",X"FF",X"FF",X"B7",X"FF",X"FF",X"5E",X"FE",X"FC",X"F8",X"E0", + X"21",X"47",X"4F",X"9F",X"9B",X"3E",X"37",X"3F",X"3D",X"BF",X"BB",X"9F",X"9F",X"8F",X"07",X"01", + X"C0",X"C0",X"C0",X"C0",X"C0",X"E0",X"C0",X"C0",X"C0",X"C0",X"E0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"01",X"01",X"81",X"81",X"81",X"81",X"81",X"01",X"01",X"01",X"01",X"81",X"81",X"41",X"41",X"21", + X"E0",X"F8",X"7C",X"FE",X"BE",X"EF",X"FF",X"FF",X"B7",X"FF",X"FF",X"5E",X"FE",X"FC",X"F8",X"E0", + X"21",X"47",X"4F",X"9F",X"9B",X"3E",X"37",X"3F",X"3D",X"BF",X"BB",X"9F",X"9F",X"8F",X"07",X"01", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"01",X"01",X"81",X"81",X"81",X"81",X"81",X"01",X"01",X"01",X"01",X"81",X"81",X"41",X"41",X"21", + X"00",X"C0",X"E0",X"F0",X"F0",X"F8",X"D8",X"F8",X"B8",X"F8",X"F8",X"F0",X"F0",X"E0",X"C0",X"00", + X"87",X"9F",X"BB",X"7F",X"5F",X"FF",X"BF",X"FF",X"EF",X"FF",X"DF",X"7F",X"7F",X"BF",X"9F",X"87", + X"00",X"00",X"00",X"80",X"80",X"C0",X"40",X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00", + X"58",X"BE",X"EF",X"7F",X"FF",X"FF",X"FF",X"FF",X"BE",X"FF",X"FF",X"FF",X"7F",X"FF",X"BE",X"58", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F0",X"F0",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"80",X"88",X"00",X"A0",X"80",X"A0",X"00",X"88",X"80",X"A0",X"A0",X"88",X"00",X"A0",X"48", + X"00",X"80",X"C0",X"F0",X"F0",X"E8",X"F8",X"78",X"F8",X"D8",X"F8",X"E0",X"F0",X"E0",X"80",X"00", + X"20",X"47",X"9F",X"BF",X"3B",X"7F",X"7F",X"7F",X"7F",X"7B",X"7F",X"3F",X"BF",X"9E",X"47",X"20", + X"00",X"E0",X"B8",X"F4",X"F8",X"FE",X"F4",X"FE",X"DA",X"FC",X"FE",X"FC",X"DC",X"F0",X"A0",X"00", + X"80",X"80",X"87",X"8F",X"0F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"0F",X"8E",X"87",X"81",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"50",X"00",X"10",X"80",X"04",X"00",X"10",X"00",X"00",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"1C",X"3E",X"6E",X"6F",X"43",X"6F",X"3E",X"1C",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"20",X"80",X"C0",X"68",X"E0",X"60",X"E4",X"C0",X"84",X"20",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"03",X"07",X"0D",X"0E",X"0D",X"0F",X"07",X"03",X"04",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"08",X"00",X"0C",X"08",X"06",X"06",X"0C",X"06",X"06",X"0C",X"0E",X"06",X"04",X"0E", + X"0E",X"04",X"06",X"0E",X"0C",X"06",X"06",X"0C",X"06",X"06",X"08",X"0C",X"00",X"08",X"10",X"00", + X"00",X"20",X"10",X"00",X"18",X"10",X"0C",X"0C",X"18",X"0C",X"0C",X"18",X"1C",X"0C",X"08",X"1C", + X"1C",X"08",X"0C",X"1C",X"18",X"0C",X"0C",X"18",X"0C",X"0C",X"10",X"18",X"00",X"10",X"20",X"00", + X"00",X"40",X"20",X"00",X"30",X"20",X"18",X"18",X"30",X"18",X"18",X"30",X"38",X"18",X"10",X"38", + X"38",X"10",X"18",X"38",X"30",X"18",X"18",X"30",X"18",X"18",X"20",X"30",X"00",X"20",X"40",X"00", + X"00",X"80",X"40",X"00",X"60",X"40",X"30",X"30",X"60",X"30",X"30",X"60",X"70",X"30",X"20",X"70", + X"70",X"20",X"30",X"70",X"60",X"30",X"30",X"60",X"30",X"30",X"40",X"60",X"00",X"40",X"80",X"00", + X"00",X"00",X"80",X"00",X"C0",X"80",X"60",X"60",X"C0",X"60",X"60",X"C0",X"E0",X"60",X"40",X"E0", + X"E0",X"40",X"60",X"E0",X"C0",X"60",X"60",X"C0",X"60",X"60",X"80",X"C0",X"00",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"C0",X"C0",X"80",X"C0",X"C0",X"80",X"C0",X"C0",X"80",X"C0", + X"C0",X"80",X"C0",X"C0",X"80",X"C0",X"C0",X"80",X"C0",X"C0",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"80",X"80",X"00",X"80",X"80",X"00",X"80", + X"80",X"00",X"80",X"80",X"00",X"80",X"80",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00", + X"00",X"02",X"01",X"00",X"01",X"01",X"00",X"00",X"01",X"00",X"00",X"01",X"01",X"00",X"00",X"01", + X"01",X"00",X"00",X"01",X"01",X"00",X"00",X"01",X"00",X"00",X"01",X"01",X"00",X"01",X"02",X"00", + X"00",X"04",X"02",X"00",X"03",X"02",X"01",X"01",X"03",X"01",X"01",X"03",X"03",X"01",X"01",X"03", + X"03",X"01",X"01",X"03",X"03",X"01",X"01",X"03",X"01",X"01",X"02",X"03",X"00",X"02",X"04",X"00", + X"00",X"08",X"04",X"00",X"06",X"04",X"03",X"03",X"06",X"03",X"03",X"06",X"07",X"03",X"02",X"07", + X"07",X"02",X"03",X"07",X"06",X"03",X"03",X"06",X"03",X"03",X"04",X"06",X"00",X"04",X"08",X"00", + X"00",X"40",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"40",X"00", + X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00", + X"00",X"01",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"01",X"00", + X"00",X"02",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06", + X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"02",X"00", + X"00",X"04",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"04",X"00", + X"00",X"08",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"08",X"00", + X"00",X"10",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30", + X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"10",X"00", + X"00",X"20",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"20",X"14",X"38",X"BA",X"7C",X"7E",X"FC",X"7C",X"7E",X"7C",X"FC",X"7C",X"FC",X"7E", + X"7E",X"FC",X"7C",X"FC",X"7C",X"7E",X"7C",X"FC",X"7E",X"7C",X"BA",X"38",X"14",X"20",X"00",X"00", + X"00",X"00",X"40",X"28",X"70",X"74",X"F8",X"FC",X"F8",X"F8",X"FC",X"F8",X"F8",X"F8",X"F8",X"FC", + X"FC",X"F8",X"F8",X"F8",X"F8",X"FC",X"F8",X"F8",X"FC",X"F8",X"74",X"70",X"28",X"40",X"00",X"00", + X"00",X"00",X"80",X"50",X"E0",X"E8",X"F0",X"F8",X"F0",X"F0",X"F8",X"F0",X"F0",X"F0",X"F0",X"F8", + X"F8",X"F0",X"F0",X"F0",X"F0",X"F8",X"F0",X"F0",X"F8",X"F0",X"E8",X"E0",X"50",X"80",X"00",X"00", + X"00",X"00",X"00",X"A0",X"C0",X"D0",X"E0",X"F0",X"E0",X"E0",X"F0",X"E0",X"E0",X"E0",X"E0",X"F0", + X"F0",X"E0",X"E0",X"E0",X"E0",X"F0",X"E0",X"E0",X"F0",X"E0",X"D0",X"C0",X"A0",X"00",X"00",X"00", + X"00",X"00",X"00",X"40",X"80",X"A0",X"C0",X"E0",X"C0",X"C0",X"E0",X"C0",X"C0",X"C0",X"C0",X"E0", + X"E0",X"C0",X"C0",X"C0",X"C0",X"E0",X"C0",X"C0",X"E0",X"C0",X"A0",X"80",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"00",X"40",X"80",X"C0",X"80",X"80",X"C0",X"80",X"80",X"80",X"80",X"C0", + X"C0",X"80",X"80",X"80",X"80",X"C0",X"80",X"80",X"C0",X"80",X"40",X"00",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"80", + X"80",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"80",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"01",X"00", + X"00",X"01",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"01",X"01",X"03",X"01",X"01",X"01",X"03",X"01",X"03",X"01", + X"01",X"03",X"01",X"03",X"01",X"01",X"01",X"03",X"01",X"01",X"02",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"00",X"01",X"05",X"03",X"03",X"07",X"03",X"03",X"03",X"07",X"03",X"07",X"03", + X"03",X"07",X"03",X"07",X"03",X"03",X"03",X"07",X"03",X"03",X"05",X"01",X"00",X"01",X"00",X"00", + X"00",X"00",X"02",X"01",X"03",X"0B",X"07",X"07",X"0F",X"07",X"07",X"07",X"0F",X"07",X"0F",X"07", + X"07",X"0F",X"07",X"0F",X"07",X"07",X"07",X"0F",X"07",X"07",X"0B",X"03",X"01",X"02",X"00",X"00", + X"00",X"00",X"04",X"02",X"07",X"17",X"0F",X"0F",X"1F",X"0F",X"0F",X"0F",X"1F",X"0F",X"1F",X"0F", + X"0F",X"1F",X"0F",X"1F",X"0F",X"0F",X"0F",X"1F",X"0F",X"0F",X"17",X"07",X"02",X"04",X"00",X"00", + X"00",X"00",X"08",X"05",X"0E",X"2E",X"1F",X"1F",X"3F",X"1F",X"1F",X"1F",X"3F",X"1F",X"3F",X"1F", + X"1F",X"3F",X"1F",X"3F",X"1F",X"1F",X"1F",X"3F",X"1F",X"1F",X"2E",X"0E",X"05",X"08",X"00",X"00", + X"00",X"00",X"10",X"0A",X"1C",X"5D",X"3E",X"3F",X"7E",X"3E",X"3F",X"3E",X"7E",X"3E",X"7E",X"3F", + X"3F",X"7E",X"3E",X"7E",X"3E",X"3F",X"3E",X"7E",X"3F",X"3E",X"5D",X"1C",X"0A",X"10",X"00",X"00", + X"00",X"00",X"FA",X"8A",X"90",X"B6",X"B6",X"F6",X"B6",X"F2",X"F6",X"F4",X"F6",X"F2",X"F4",X"F6", + X"F2",X"F6",X"F6",X"F6",X"F2",X"F6",X"F4",X"F6",X"F2",X"F6",X"F4",X"B2",X"F8",X"C2",X"00",X"00", + X"00",X"00",X"F4",X"14",X"20",X"6C",X"6C",X"EC",X"6C",X"E4",X"EC",X"E8",X"EC",X"E4",X"E8",X"EC", + X"E4",X"EC",X"EC",X"EC",X"E4",X"EC",X"E8",X"EC",X"E4",X"EC",X"E8",X"64",X"F0",X"84",X"00",X"00", + X"00",X"00",X"E8",X"28",X"40",X"D8",X"D8",X"D8",X"D8",X"C8",X"D8",X"D0",X"D8",X"C8",X"D0",X"D8", + X"C8",X"D8",X"D8",X"D8",X"C8",X"D8",X"D0",X"D8",X"C8",X"D8",X"D0",X"C8",X"E0",X"08",X"00",X"00", + X"00",X"00",X"D0",X"50",X"80",X"B0",X"B0",X"B0",X"B0",X"90",X"B0",X"A0",X"B0",X"90",X"A0",X"B0", + X"90",X"B0",X"B0",X"B0",X"90",X"B0",X"A0",X"B0",X"90",X"B0",X"A0",X"90",X"C0",X"10",X"00",X"00", + X"00",X"00",X"A0",X"A0",X"00",X"60",X"60",X"60",X"60",X"20",X"60",X"40",X"60",X"20",X"40",X"60", + X"20",X"60",X"60",X"60",X"20",X"60",X"40",X"60",X"20",X"60",X"40",X"20",X"80",X"20",X"00",X"00", + X"00",X"00",X"40",X"40",X"00",X"C0",X"C0",X"C0",X"C0",X"40",X"C0",X"80",X"C0",X"40",X"80",X"C0", + X"40",X"C0",X"C0",X"C0",X"40",X"C0",X"80",X"C0",X"40",X"C0",X"80",X"40",X"00",X"40",X"00",X"00", + X"00",X"00",X"80",X"80",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"80",X"80",X"00",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"80",X"80",X"80",X"00",X"80",X"00",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00", + X"00",X"00",X"03",X"02",X"02",X"02",X"02",X"03",X"02",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"02",X"03",X"03",X"00",X"00", + X"00",X"00",X"07",X"04",X"04",X"05",X"05",X"07",X"05",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"05",X"07",X"06",X"00",X"00", + X"00",X"00",X"0F",X"08",X"09",X"0B",X"0B",X"0F",X"0B",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0B",X"0F",X"0C",X"00",X"00", + X"00",X"00",X"1F",X"11",X"12",X"16",X"16",X"1E",X"16",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E", + X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"16",X"1F",X"18",X"00",X"00", + X"00",X"00",X"3E",X"22",X"24",X"2D",X"2D",X"3D",X"2D",X"3C",X"3D",X"3D",X"3D",X"3C",X"3D",X"3D", + X"3C",X"3D",X"3D",X"3D",X"3C",X"3D",X"3D",X"3D",X"3C",X"3D",X"3D",X"2C",X"3E",X"30",X"00",X"00", + X"00",X"00",X"7D",X"45",X"48",X"5B",X"5B",X"7B",X"5B",X"79",X"7B",X"7A",X"7B",X"79",X"7A",X"7B", + X"79",X"7B",X"7B",X"7B",X"79",X"7B",X"7A",X"7B",X"79",X"7B",X"7A",X"59",X"7C",X"61",X"00",X"00", + X"D0",X"78",X"BC",X"FE",X"74",X"7A",X"FC",X"F8",X"7C",X"FA",X"FE",X"7C",X"3A",X"7C",X"F4",X"FE", + X"FE",X"F4",X"7C",X"3A",X"7C",X"FE",X"FA",X"7C",X"F8",X"FC",X"7A",X"74",X"FE",X"BC",X"78",X"00", + X"A0",X"F0",X"78",X"FC",X"E8",X"F4",X"F8",X"F0",X"F8",X"F4",X"FC",X"F8",X"74",X"F8",X"E8",X"FC", + X"FC",X"E8",X"F8",X"74",X"F8",X"FC",X"F4",X"F8",X"F0",X"F8",X"F4",X"E8",X"FC",X"78",X"F0",X"00", + X"40",X"E0",X"F0",X"F8",X"D0",X"E8",X"F0",X"E0",X"F0",X"E8",X"F8",X"F0",X"E8",X"F0",X"D0",X"F8", + X"F8",X"D0",X"F0",X"E8",X"F0",X"F8",X"E8",X"F0",X"E0",X"F0",X"E8",X"D0",X"F8",X"F0",X"E0",X"00", + X"80",X"C0",X"E0",X"F0",X"A0",X"D0",X"E0",X"C0",X"E0",X"D0",X"F0",X"E0",X"D0",X"E0",X"A0",X"F0", + X"F0",X"A0",X"E0",X"D0",X"E0",X"F0",X"D0",X"E0",X"C0",X"E0",X"D0",X"A0",X"F0",X"E0",X"C0",X"00", + X"00",X"80",X"C0",X"E0",X"40",X"A0",X"C0",X"80",X"C0",X"A0",X"E0",X"C0",X"A0",X"C0",X"40",X"E0", + X"E0",X"40",X"C0",X"A0",X"C0",X"E0",X"A0",X"C0",X"80",X"C0",X"A0",X"40",X"E0",X"C0",X"80",X"00", + X"00",X"00",X"80",X"C0",X"80",X"40",X"80",X"00",X"80",X"40",X"C0",X"80",X"40",X"80",X"80",X"C0", + X"C0",X"80",X"80",X"40",X"80",X"C0",X"40",X"80",X"00",X"80",X"40",X"80",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"00",X"00",X"80",X"80",X"00",X"80",X"00",X"00",X"80", + X"80",X"00",X"00",X"80",X"00",X"80",X"80",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"01",X"01",X"00",X"00",X"01",X"01",X"00",X"01",X"01",X"00",X"00",X"00",X"01",X"01", + X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"00",X"01",X"01",X"00",X"00",X"01",X"01",X"00",X"00", + X"03",X"01",X"02",X"03",X"01",X"01",X"03",X"03",X"01",X"03",X"03",X"01",X"00",X"01",X"03",X"03", + X"03",X"03",X"01",X"00",X"01",X"03",X"03",X"01",X"03",X"03",X"01",X"01",X"03",X"02",X"01",X"00", + X"06",X"03",X"05",X"07",X"03",X"03",X"07",X"07",X"03",X"07",X"07",X"03",X"01",X"03",X"07",X"07", + X"07",X"07",X"03",X"01",X"03",X"07",X"07",X"03",X"07",X"07",X"03",X"03",X"07",X"05",X"03",X"00", + X"0D",X"07",X"0B",X"0F",X"07",X"07",X"0F",X"0F",X"07",X"0F",X"0F",X"07",X"03",X"07",X"0F",X"0F", + X"0F",X"0F",X"07",X"03",X"07",X"0F",X"0F",X"07",X"0F",X"0F",X"07",X"07",X"0F",X"0B",X"07",X"00", + X"1A",X"0F",X"17",X"1F",X"0E",X"0F",X"1F",X"1F",X"0F",X"1F",X"1F",X"0F",X"07",X"0F",X"1E",X"1F", + X"1F",X"1E",X"0F",X"07",X"0F",X"1F",X"1F",X"0F",X"1F",X"1F",X"0F",X"0E",X"1F",X"17",X"0F",X"00", + X"34",X"1E",X"2F",X"3F",X"1D",X"1E",X"3F",X"3E",X"1F",X"3E",X"3F",X"1F",X"0E",X"1F",X"3D",X"3F", + X"3F",X"3D",X"1F",X"0E",X"1F",X"3F",X"3E",X"1F",X"3E",X"3F",X"1E",X"1D",X"3F",X"2F",X"1E",X"00", + X"68",X"3C",X"5E",X"7F",X"3A",X"3D",X"7E",X"7C",X"3E",X"7D",X"7F",X"3E",X"1D",X"3E",X"7A",X"7F", + X"7F",X"7A",X"3E",X"1D",X"3E",X"7F",X"7D",X"3E",X"7C",X"7E",X"3D",X"3A",X"7F",X"5E",X"3C",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/YM2149_linmix_sep.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/YM2149_linmix_sep.vhd new file mode 100644 index 00000000..6ed2498a --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/YM2149_linmix_sep.vhd @@ -0,0 +1,574 @@ +-- changes for seperate audio outputs and enable now enables cpu access as well +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + O_CHAN : out std_logic_vector(1 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal cnt_div_t1 : std_logic_vector(3 downto 0); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8; + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process(RESET_L, CLK) + begin + -- looks like registers are latches in real chip, but the address is caught at the end of the address state. + if (RESET_L = '0') then + addr <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA = '1') then + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end if; + end process; + + p_wdata : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + elsif rising_edge(CLK) then + if (ENA = '1') then + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, reg, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + -- envelope shapes + -- C AtAlH + -- 0 0 x x \___ + -- + -- 0 1 x x /___ + -- + -- 1 0 0 0 \\\\ + -- + -- 1 0 0 1 \___ + -- + -- 1 0 1 0 \/\/ + -- ___ + -- 1 0 1 1 \ + -- + -- 1 1 0 0 //// + -- ___ + -- 1 1 0 1 / + -- + -- 1 1 1 0 /\/\ + -- + -- 1 1 1 1 /___ + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + cnt_div_t1 <= cnt_div; + end if; + end process; + + p_audio_output : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_AUDIO <= (others => '0'); + O_CHAN <= (others => '0'); + elsif rising_edge(CLK) then + + if (ENA = '1') then + O_AUDIO <= dac_amp(7 downto 0); + O_CHAN <= cnt_div_t1(1 downto 0); + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then -- resync + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end if; + end process; +end architecture RTL; diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/build_id.tcl b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/build_id.v b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/build_id.v new file mode 100644 index 00000000..ec08380d --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171227" +`define BUILD_TIME "140251" diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/burger_time _sound.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/burger_time _sound.vhd new file mode 100644 index 00000000..cbddd6bf --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/burger_time _sound.vhd @@ -0,0 +1,426 @@ +--------------------------------------------------------------------------------- +-- burger time sound by Dar (darfpga@aol.fr) (27/12/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T65(b) core.Ver 301 by MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Use burger_time_de10_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.ALL; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity burger_time_sound is +port +( + clock_12 : in std_logic; + reset : in std_logic; + + sound_req : in std_logic; + sound_code_in : in std_logic_vector(7 downto 0); + sound_timing : in std_logic; + + audio_out : out std_logic_vector(10 downto 0); + + dbg_cpu_addr: out std_logic_vector(15 downto 0) + ); +end burger_time_sound; + +architecture syn of burger_time_sound is + + -- clocks, reset + signal clock_12n : std_logic; + signal clock_div1 : std_logic_vector(8 downto 0) := (others =>'0'); + signal clock_div2 : std_logic_vector(4 downto 0) := (others =>'0'); + signal clock_500K : std_logic; + signal ayx_clock : std_logic; + signal reset_n : std_logic; + + -- cpu signals + signal cpu_addr : std_logic_vector(23 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_di_dec : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_rw_n : std_logic; + signal cpu_nmi_n : std_logic; + signal cpu_irq_n : std_logic; + signal cpu_sync : std_logic; + + -- program rom signals + signal prog_rom_cs : std_logic; + signal prog_rom_do : std_logic_vector(7 downto 0); + + -- working ram signals + signal wram_cs : std_logic; + signal wram_we : std_logic; + signal wram_do : std_logic_vector(7 downto 0); + + -- sound req management + signal nmi_reg : std_logic; + signal nmi_reg_cs : std_logic; + signal nmi_reg_we : std_logic; + signal sound_code : std_logic_vector(7 downto 0); + signal sound_code_cs : std_logic; + + -- ay-3-8910 signal + signal ay1_bc1 : std_logic; + signal ay1_bdir : std_logic; + signal ay1_audio_chan : std_logic_vector(1 downto 0); + signal ay1_audio_muxed: std_logic_vector(7 downto 0); + signal ay1_chan_a: std_logic_vector(7 downto 0); + signal ay1_chan_b: std_logic_vector(7 downto 0); + signal ay1_chan_c: std_logic_vector(7 downto 0); + + signal ay2_bc1 : std_logic; + signal ay2_bdir : std_logic; + signal ay2_audio_chan : std_logic_vector(1 downto 0); + signal ay2_audio_muxed: std_logic_vector(7 downto 0); + signal ay2_chan_a: std_logic_vector(7 downto 0); + signal ay2_chan_b: std_logic_vector(7 downto 0); + signal ay2_chan_c: std_logic_vector(7 downto 0); + + -- digital filtering AY2 channel A + signal uin : integer range -256 to 255; + signal u3 : integer range -32768 to 32767; + signal u4 : integer range -32768 to 32767; + signal du3 : integer range -32768*4096 to 32767*4096; + signal du4 : integer range -32768*4096 to 32767*4096; + signal uout : integer range -32768 to 32767; + signal uout_lim : integer range -128 to 127; + +begin + +process (clock_12, cpu_sync) +begin + if rising_edge(clock_12) then + if cpu_sync = '1' then + dbg_cpu_addr <= cpu_addr(15 downto 0); + end if; + end if; +end process; + +reset_n <= not reset; +clock_12n <= not clock_12; + +process (clock_12, reset) + begin + if reset='1' then + clock_div1 <= (others => '0'); + clock_div2 <= (others => '0'); + else + if rising_edge(clock_12) then + if clock_div1 = "111111111" then -- divide by 512 (23.437kHz) + clock_div1 <= "000000000"; + else + clock_div1 <= clock_div1 + '1'; + end if; + if clock_div2 = "10111" then -- divide by 24 + clock_div2 <= "00000"; + else + clock_div2 <= clock_div2 + '1'; + end if; + end if; + end if; +end process; + +clock_500K <= clock_div2(4); --12MHz/24 = 500kHz +ayx_clock <= clock_div1(2); --12MHz/8 = 1.5MHz + +--static ADDRESS_MAP_START( audio_map, AS_PROGRAM, 8, btime_state ) +-- AM_RANGE(0x0000, 0x03ff) AM_MIRROR(0x1c00) AM_RAM AM_SHARE("audio_rambase") +-- AM_RANGE(0x2000, 0x3fff) AM_DEVWRITE("ay1", ay8910_device, data_w) +-- AM_RANGE(0x4000, 0x5fff) AM_DEVWRITE("ay1", ay8910_device, address_w) +-- AM_RANGE(0x6000, 0x7fff) AM_DEVWRITE("ay2", ay8910_device, data_w) +-- AM_RANGE(0x8000, 0x9fff) AM_DEVWRITE("ay2", ay8910_device, address_w) +-- AM_RANGE(0xa000, 0xbfff) AM_READ(audio_command_r) +-- AM_RANGE(0xc000, 0xdfff) AM_WRITE(audio_nmi_enable_w) +-- AM_RANGE(0xe000, 0xefff) AM_MIRROR(0x1000) AM_ROM +--ADDRESS_MAP_END + +-- chip select +wram_cs <= '1' when cpu_addr(15 downto 13) = "000" else '0'; -- working ram 0000-07ff .. 1fff +ay1_bc1 <= '1' when cpu_addr(15 downto 13) = "010" else '0'; +ay1_bdir <= '1' when cpu_addr(15 downto 13) = "001" or ay1_bc1 = '1' else '0'; +ay2_bc1 <= '1' when cpu_addr(15 downto 13) = "100" else '0'; +ay2_bdir <= '1' when cpu_addr(15 downto 13) = "011" or ay2_bc1 = '1' else '0'; +sound_code_cs <= '1' when cpu_addr(15 downto 13) = "101" else '0'; +nmi_reg_cs <= '1' when cpu_addr(15 downto 13) = "110" else '0'; +prog_rom_cs <= '1' when cpu_addr(15 downto 13) = "111" else '0'; + +-- write enable +wram_we <= '1' when wram_cs = '1' and cpu_rw_n = '0' else '0'; +nmi_reg_we <= '1' when nmi_reg_cs = '1' and cpu_rw_n = '0' else '0'; + +-- cpu di mux +cpu_di <= wram_do when wram_cs = '1' else + prog_rom_do when prog_rom_cs = '1' else + sound_code when sound_code_cs = '1' else + X"FF"; + +-- regsiter sound code and irq management +process (clock_12) +begin + if rising_edge(clock_12) then + if sound_req = '1' then + sound_code <= sound_code_in; + cpu_irq_n <= '0'; + end if; + if sound_code_cs = '1' then + cpu_irq_n <= '1'; + end if; + end if; +end process; + +-- nmi autorisation management +process (reset, clock_12) +begin + if reset = '1' then + nmi_reg <= '0'; + else + if rising_edge(clock_12) then + if nmi_reg_we = '1' then + nmi_reg <= cpu_do(0); + end if; + end if; + end if; +end process; + +-- nmi +cpu_nmi_n <= '0' when nmi_reg = '1' and sound_timing = '1' else '1'; + +-- demux AY chips output +process (ayx_clock) +begin + if rising_edge(ayx_clock) then + if ay1_audio_chan = "00" then ay1_chan_a <= ay1_audio_muxed; end if; + if ay1_audio_chan = "01" then ay1_chan_b <= ay1_audio_muxed; end if; + if ay1_audio_chan = "10" then ay1_chan_c <= ay1_audio_muxed; end if; + if ay2_audio_chan = "00" then ay2_chan_a <= ay2_audio_muxed; end if; + if ay2_audio_chan = "01" then ay2_chan_b <= ay2_audio_muxed; end if; + if ay2_audio_chan = "10" then ay2_chan_c <= ay2_audio_muxed; end if; + end if; +end process; + +-- AOP Rauch passe bande filter +-- +-- ----------o------------ +-- u4^ | | | +-- | --- C4 | | R5 | +-- | --- | | | +-- | | C3 | | +-- --| R1 |----o----||---o------|\ | +-- ^ | ------> u3 | \__o--- +-- | | | / ^ +-- |uin | | R2 --|/ | +-- | | | | | uout +-- | | | | +-- ------------o--------------o---------- +-- +-- +-- i1 = (sin+u3)/R1 +-- i2 = -u3/R2 +-- i3 = (u4-u3)/R5 +-- i4 = i2-i1-i3 +-- +-- u3(t+dt) = u3(t) + i3(t)*dt/C3; +-- u4(t+dt) = u4(t) + i4(t)*dt/C4; + +-- uout = u4-u3 + +-- R1 = 5000; +-- R2 = 10000; +-- C3 = 0.068e-6; +-- C4 = 0.068e-6; +-- R5 = 47000; +-- +-- dt = 1/f_ech = 1/23437 +-- dt/C3 = dt/C4 = 627 +-- +-- (i3(t)*dt/C3)*8192 = du3*8192 = ((u4-u3)/47000*627)*8192 +-- = (u4-u3)*109 +-- +-- (i4(t)*dt/C4)*8192 = du4*8192 = (-u3/10000 -(uin+u3)/5000 -(u4-u3)/47000)*627*8192 +-- = -u3(514+1027-109) - uin*1027 - u4*109 +-- = -(u4*109 + u3*1432 + uin*1027) +-- + +-- down sample to 23.437kHz and filter AY2 channel A +uin <= to_integer(unsigned(ay2_chan_a)); + +process (clock_12) +begin + if rising_edge(clock_12) then + + if clock_div1 = "000000000" then + du3 <= u4*109 - u3*109; + du4 <= u4*109 + u3*1432 + uin*1027*16; -- add gain(16) to uin + end if; + + if clock_div1 = "000000001" then + u3 <= u3 + du3/8192; + u4 <= u4 - du4/8192; + end if; + + if clock_div1 = "000000010" then + uout <= (u4 - u3) / 8; -- adjust output gain + end if; + + -- limit signed dynamique before return to unsigned + if clock_div1 = "000000011" then + if uout > 127 then + uout_lim <= 127; + elsif uout < -127 then + uout_lim <= -127; + else + uout_lim <= uout; + end if; + end if; + + if clock_div1 = "000000100" then + + audio_out <= ("000"&ay1_chan_a(7 downto 0)) + + ("000"&ay1_chan_b(7 downto 0)) + + ("000"&ay1_chan_c(7 downto 0)) + + ("000"&std_logic_vector(to_unsigned(uout_lim+128,8)))+ + ("000"&ay2_chan_b(7 downto 0)) + + ("000"&ay2_chan_c(7 downto 0)); + end if; + + end if; +end process; + +--------------------------- +-- components +--------------------------- + +cpu_inst : entity work.T65 +port map +( + Mode => "00", -- 6502 + Res_n => reset_n, + Enable => '1', + Clk => clock_500K, + Rdy => '1', + Abort_n => '1', + IRQ_n => cpu_irq_n, + NMI_n => cpu_nmi_n, + SO_n => '1',--cpu_so_n, + R_W_n => cpu_rw_n, + Sync => cpu_sync, -- open + EF => open, + MF => open, + XF => open, + ML_n => open, + VP_n => open, + VDA => open, + VPA => open, + A => cpu_addr, + DI => cpu_di, + DO => cpu_do +); + + +-- working ram +wram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 11) +port map( + clk => clock_12n, + we => wram_we, + addr => cpu_addr(10 downto 0), + d => cpu_do, + q => wram_do +); + +-- program rom +program_rom: entity work.burger_time_sound_prog +port map( + clk => clock_12n, + addr => cpu_addr(11 downto 0), + data => prog_rom_do +); + +-- AY-3-8910 #1 +ay_3_8910_1 : entity work.YM2149 +port map( + -- data bus + I_DA => cpu_do, -- in std_logic_vector(7 downto 0); + O_DA => open, -- out std_logic_vector(7 downto 0); + O_DA_OE_L => open, -- out std_logic; + -- control + I_A9_L => '0', -- in std_logic; + I_A8 => '1', -- in std_logic; + I_BDIR => ay1_bdir, -- in std_logic; + I_BC2 => '1', -- in std_logic; + I_BC1 => ay1_bc1, -- in std_logic; + I_SEL_L => '1', -- in std_logic; + + O_AUDIO => ay1_audio_muxed, -- out std_logic_vector(7 downto 0); + O_CHAN => ay1_audio_chan, -- out std_logic_vector(1 downto 0); + + -- port a + I_IOA => X"00", -- in std_logic_vector(7 downto 0); + O_IOA => open, -- out std_logic_vector(7 downto 0); + O_IOA_OE_L => open, -- out std_logic; + -- port b + I_IOB => X"00", -- in std_logic_vector(7 downto 0); + O_IOB => open, -- out std_logic_vector(7 downto 0); + O_IOB_OE_L => open, -- out std_logic; + + ENA => '1', -- in std_logic; -- clock enable for higher speed operation + RESET_L => reset_n, -- in std_logic; + CLK => ayx_clock -- in std_logic -- note 6 Mhz +); + +-- AY-3-8910 #2 +ay_3_8910_2 : entity work.YM2149 +port map( + -- data bus + I_DA => cpu_do, -- in std_logic_vector(7 downto 0); + O_DA => open, -- out std_logic_vector(7 downto 0); + O_DA_OE_L => open, -- out std_logic; + -- control + I_A9_L => '0', -- in std_logic; + I_A8 => '1', -- in std_logic; + I_BDIR => ay2_bdir, -- in std_logic; + I_BC2 => '1', -- in std_logic; + I_BC1 => ay2_bc1, -- in std_logic; + I_SEL_L => '1', -- in std_logic; + + O_AUDIO => ay2_audio_muxed, -- out std_logic_vector(7 downto 0); + O_CHAN => ay2_audio_chan, -- out std_logic_vector(1 downto 0); + + -- port a + I_IOA => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOA => open, -- out std_logic_vector(7 downto 0); + O_IOA_OE_L => open, -- out std_logic; + -- port b + I_IOB => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOB => open, -- out std_logic_vector(7 downto 0); + O_IOB_OE_L => open, -- out std_logic; + + ENA => '1', --cpu_ena, -- in std_logic; -- clock enable for higher speed operation + RESET_L => reset_n, -- in std_logic; + CLK => ayx_clock -- in std_logic -- note 6 Mhz +); + + +end SYN; diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/burger_time.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/burger_time.vhd new file mode 100644 index 00000000..89595a55 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/burger_time.vhd @@ -0,0 +1,803 @@ +--------------------------------------------------------------------------------- +-- burger time by Dar (darfpga@aol.fr) (27/12/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T65(b) core.Ver 301 by MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Use burger_timer_de10_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.ALL; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity burger_time is +port +( + clock_12 : in std_logic; + reset : in std_logic; + + video_r : out std_logic_vector(2 downto 0); + video_g : out std_logic_vector(2 downto 0); + video_b : out std_logic_vector(1 downto 0); + + video_hs : out std_logic; + video_vs : out std_logic; + video_blankn : out std_logic; + video_csync : out std_logic; + + audio_out : out std_logic_vector(10 downto 0); + + start2 : in std_logic; + start1 : in std_logic; + coin1 : in std_logic; + + fire1 : in std_logic; + right1 : in std_logic; + left1 : in std_logic; + down1 : in std_logic; + up1 : in std_logic; + + fire2 : in std_logic; + right2 : in std_logic; + left2 : in std_logic; + down2 : in std_logic; + up2 : in std_logic; + + dbg_cpu_addr: out std_logic_vector(15 downto 0) + ); +end burger_time; + +architecture syn of burger_time is + + -- clocks, reset + signal clock_12n : std_logic; + signal clock_6 : std_logic := '0'; + signal reset_n : std_logic; + + -- cpu signals + signal cpu_addr : std_logic_vector(23 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_di_dec : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_rw_n : std_logic; + signal cpu_nmi_n : std_logic; + signal cpu_sync : std_logic; + signal cpu_ena : std_logic; + signal had_written : std_logic := '0'; + signal decrypt : std_logic; + + -- program rom signals + signal prog_rom_cs : std_logic; + signal prog_rom_do : std_logic_vector(7 downto 0); + + -- working ram signals + signal wram_cs : std_logic; + signal wram_we : std_logic; + signal wram_do : std_logic_vector(7 downto 0); + + -- foreground ram signals + signal fg_ram_cs : std_logic; + signal fg_ram_low_we : std_logic; + signal fg_ram_high_we : std_logic; + signal fg_ram_addr_sel : std_logic_vector(1 downto 0); + signal fg_ram_addr : std_logic_vector(9 downto 0); + signal fg_ram_low_do : std_logic_vector(7 downto 0); + signal fg_ram_high_do : std_logic_vector(1 downto 0); + + + -- video scan counter + signal hcnt : std_logic_vector(8 downto 0); + signal vcnt : std_logic_vector(8 downto 0); + signal hsync0 : std_logic; + signal hsync1 : std_logic; + signal hsync2 : std_logic; + signal csync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic; + + signal hcnt_flip : std_logic_vector(8 downto 0); + signal vcnt_flip : std_logic_vector(8 downto 0); + signal cocktail_we : std_logic; + signal cocktail_flip : std_logic := '0'; + signal hcnt8_r : std_logic; + signal hcnt8_rr : std_logic; + + -- io + signal io_cs : std_logic; + signal dip_sw1 : std_logic_vector(7 downto 0); + signal dip_sw2 : std_logic_vector(7 downto 0); + signal btn_p1 : std_logic_vector(7 downto 0); + signal btn_p2 : std_logic_vector(7 downto 0); + signal btn_system : std_logic_vector(7 downto 0); + + -- foreground and sprite graphix + signal sprite_attr : std_logic_vector( 2 downto 0); + signal sprite_tile : std_logic_vector( 7 downto 0); + signal sprite_line : std_logic_vector( 7 downto 0); + signal sprite_buffer_addr : std_logic_vector( 7 downto 0); + signal sprite_buffer_addr_flip : std_logic_vector( 7 downto 0); + signal sprite_buffer_di : std_logic_vector( 2 downto 0); + signal sprite_buffer_do : std_logic_vector( 2 downto 0); + signal fg_grphx_addr : std_logic_vector(12 downto 0); + signal fg_grphx_addr_early : std_logic_vector(12 downto 0); + signal fg_grphx_1_do : std_logic_vector( 7 downto 0); + signal fg_grphx_2_do : std_logic_vector( 7 downto 0); + signal fg_grphx_3_do : std_logic_vector( 7 downto 0); + signal fg_sp_grphx_1 : std_logic_vector( 7 downto 0); + signal fg_sp_grphx_2 : std_logic_vector( 7 downto 0); + signal fg_sp_grphx_3 : std_logic_vector( 7 downto 0); + signal display_tile : std_logic; + signal fg_low_priority : std_logic; + signal fg_sp_bits : std_logic_vector( 2 downto 0); + signal sp_bits_out : std_logic_vector( 2 downto 0); + signal fg_bits : std_logic_vector( 2 downto 0); + + -- color palette + signal palette_addr : std_logic_vector(3 downto 0); + signal palette_cs : std_logic; + signal palette_we : std_logic; + signal palette_do : std_logic_vector(7 downto 0); + + -- background map rom + signal bg_map_addr : std_logic_vector(10 downto 0); + signal bg_map_do : std_logic_vector(7 downto 0); + + -- background control + signal scroll1_we : std_logic; + signal scroll1 : std_logic_vector(4 downto 0); + signal scroll2_we : std_logic; + signal scroll2 : std_logic_vector(7 downto 0); + + signal bg_hcnt : std_logic_vector( 7 downto 0); + signal bg_scan_hcnt : std_logic_vector( 9 downto 0); + signal bg_scan_addr : std_logic_vector( 9 downto 0); + signal bg_grphx_addr : std_logic_vector(10 downto 0); + signal bg_grphx_1_do : std_logic_vector( 7 downto 0); + signal bg_grphx_2_do : std_logic_vector( 7 downto 0); + signal bg_grphx_3_do : std_logic_vector( 7 downto 0); + signal bg_grphx_1 : std_logic_vector( 7 downto 0); + signal bg_grphx_2 : std_logic_vector( 7 downto 0); + signal bg_grphx_3 : std_logic_vector( 7 downto 0); + signal bg_bits : std_logic_vector( 2 downto 0); + + -- misc + signal raz_nmi_we : std_logic; + signal coin1_r : std_logic; + signal sound_req : std_logic; + +begin + +--process (clock_12, cpu_sync) +--begin +-- if rising_edge(clock_12) then +-- if cpu_sync = '1' then +-- dbg_cpu_addr <= cpu_addr(15 downto 0); +-- end if; +-- end if; +--end process; + +reset_n <= not reset; +clock_12n <= not clock_12; + +process (clock_12, reset) + begin + if reset='1' then + clock_6 <= '0'; + else + if rising_edge(clock_12) then + clock_6 <= not clock_6; + end if; + end if; +end process; + +------------------- +-- Video scanner -- +------------------- + +-- make hcnt and vcnt video scanner (from schematics !) +-- +-- hcnt [0..255,256..383] => 384 pixels, 384/6Mhz => 1 line is 64us (15.625KHz) +-- vcnt [8..255,256..279] => 272 lines, 1 frame is 272 x 64us = 17.41ms (57.44Hz) + +process (reset, clock_12) +begin + if reset='1' then + hcnt <= (others => '0'); + vcnt <= (others => '0'); + else + if rising_edge(clock_12) and clock_6 = '1' then + hcnt <= hcnt + '1'; + if hcnt = 383 then + hcnt <= (others => '0'); + if vcnt = 260 then -- total should be 272 from Bump&Jump schematics ! + vcnt <= (others => '0'); + else + vcnt <= vcnt + '1'; + end if; + end if; + end if; + + end if; +end process; + +hcnt_flip <= hcnt when cocktail_flip = '0' else not hcnt; +vcnt_flip <= not vcnt when cocktail_flip = '0' else vcnt; + +--ROM_START( btime ) +-- ROM_REGION( 0x10000, "maincpu", 0 ) +-- ROM_LOAD( "aa04.9b", 0xc000, 0x1000, CRC(368a25b5) SHA1(ed3f3712423979dcb351941fa85dce6a0a7bb16b) ) +-- ROM_LOAD( "aa06.13b", 0xd000, 0x1000, CRC(b4ba400d) SHA1(8c77397e934907bc47a739f263196a0f2f81ba3d) ) +-- ROM_LOAD( "aa05.10b", 0xe000, 0x1000, CRC(8005bffa) SHA1(d0da4e360039f6a8d8142a4e8e05c1f90c0af68a) ) +-- ROM_LOAD( "aa07.15b", 0xf000, 0x1000, CRC(086440ad) SHA1(4a32bc92f8ff5fbe112f56e62d2c03da8851a7b9) ) +-- +-- ROM_REGION( 0x10000, "audiocpu", 0 ) +-- ROM_LOAD( "ab14.12h", 0xe000, 0x1000, CRC(f55e5211) SHA1(27940026d0c6212d1138d2fd88880df697218627) ) +-- +-- ROM_REGION( 0x6000, "gfx1", 0 ) +-- ROM_LOAD( "aa12.7k", 0x0000, 0x1000, CRC(c4617243) SHA1(24204d591aa2c264a852ee9ba8c4be63efd97728) ) /* charset #1 */ +-- ROM_LOAD( "ab13.9k", 0x1000, 0x1000, CRC(ac01042f) SHA1(e64b6381a9298eaf74e79fa5f1ea8e9596c58a49) ) +-- ROM_LOAD( "ab10.10k", 0x2000, 0x1000, CRC(854a872a) SHA1(3d2ecfd54a5a9d68b53cf4b4ee1f2daa6aef2123) ) +-- ROM_LOAD( "ab11.12k", 0x3000, 0x1000, CRC(d4848014) SHA1(0a55b091cd4e7f317c35defe13d5051b26042eee) ) +-- ROM_LOAD( "aa8.13k", 0x4000, 0x1000, CRC(8650c788) SHA1(d9b1ee2d1f2fd66705d497c80252861b49aa9254) ) +-- ROM_LOAD( "ab9.15k", 0x5000, 0x1000, CRC(8dec15e6) SHA1(b72633de6268ce16742bba4dcba835df860d6c2f) ) +-- +-- ROM_REGION( 0x1800, "gfx2", 0 ) +-- ROM_LOAD( "ab00.1b", 0x0000, 0x0800, CRC(c7a14485) SHA1(6a0a8e6b7860859f22daa33634e34fbf91387659) ) /* charset #2 */ +-- ROM_LOAD( "ab01.3b", 0x0800, 0x0800, CRC(25b49078) SHA1(4abdcbd4f3362c3e4463a1274731289f1a72d2e6) ) +-- ROM_LOAD( "ab02.4b", 0x1000, 0x0800, CRC(b8ef56c3) SHA1(4a03bf011dc1fb2902f42587b1174b880cf06df1) ) +-- +-- ROM_REGION( 0x0800, "bg_map", 0 ) /* background tilemaps */ +-- ROM_LOAD( "ab03.6b", 0x0000, 0x0800, CRC(d26bc1f3) SHA1(737af6e264183a1f151f277a07cf250d6abb3fd8) ) +--ROM_END + +--static ADDRESS_MAP_START( btime_map, AS_PROGRAM, 8, btime_state ) +-- AM_RANGE(0x0000, 0x07ff) AM_RAM AM_SHARE("rambase") +-- AM_RANGE(0x0c00, 0x0c0f) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") +-- AM_RANGE(0x1000, 0x13ff) AM_RAM AM_SHARE("videoram") +-- AM_RANGE(0x1400, 0x17ff) AM_RAM AM_SHARE("colorram") +-- AM_RANGE(0x1800, 0x1bff) AM_READWRITE(btime_mirrorvideoram_r, btime_mirrorvideoram_w) +-- AM_RANGE(0x1c00, 0x1fff) AM_READWRITE(btime_mirrorcolorram_r, btime_mirrorcolorram_w) +-- AM_RANGE(0x4000, 0x4000) AM_READ_PORT("P1") AM_WRITENOP +-- AM_RANGE(0x4001, 0x4001) AM_READ_PORT("P2") +-- AM_RANGE(0x4002, 0x4002) AM_READ_PORT("SYSTEM") AM_WRITE(btime_video_control_w) +-- AM_RANGE(0x4003, 0x4003) AM_READ_PORT("DSW1") AM_WRITE(audio_command_w) +-- AM_RANGE(0x4004, 0x4004) AM_READ_PORT("DSW2") AM_WRITE(bnj_scroll1_w) +-- AM_RANGE(0xb000, 0xffff) AM_ROM +--ADDRESS_MAP_END + +-- dip_sw1 -- unkown/cocktail/hatch/test/coinage_b[2]/coinage_a[2] +-- dip_sw2 -- off/off/off/eol pepper/enemies/bonus[2]/lives +-- btn_p1 -- nu/nu/unkonw/jump/down/up/left/right +-- btn_p2 -- nu/nu/unkonw/jump/down/up/left/right +-- btn_system -- coin2/coin1/unknown/unknown/unkown/tilt/start2/start1 + +dip_sw1 <= "00111111"; +dip_sw2 <= "11101011"; +btn_p1 <= not("000"&fire1 & down1 & up1 & left1 & right1); +btn_p2 <= not("000"&fire2 & down2 & up2 & left2 & right2); +btn_system <= ('0'&coin1) & not("0000"&start2&start1); + +-- misc (coin, nmi, cocktail) +process (reset,clock_12) +begin + if reset = '1' then + cpu_nmi_n <= '1'; + had_written <='0'; + cocktail_flip <= '0'; + else + if rising_edge(clock_12)then + coin1_r <= coin1; + if coin1_r = '0' and coin1 = '1' then + cpu_nmi_n <= '0'; + end if; + if raz_nmi_we = '1' then + cpu_nmi_n <= '1'; + end if; + if cpu_ena = '1' then + if cpu_rw_n = '0' then + had_written <= '1'; + elsif cpu_sync = '1' then + had_written <= '0'; + end if; + end if; + if cocktail_we = '1' then + cocktail_flip <= dip_sw1(6) and cpu_do(0); + end if; + end if; + end if; +end process; + + +cpu_ena <= '1' when hcnt(2 downto 0) = "111" and clock_6 = '1' else '0'; + +-- chip select +wram_cs <= '1' when cpu_addr(15 downto 11) = "00000" else '0'; -- working ram 0000-07ff +io_cs <= '1' when cpu_addr(15 downto 3) = "0100000000000" else '0'; -- player/dip_sw 4000-4007 (4004) +fg_ram_cs <= '1' when cpu_addr(15 downto 12) = "0001" else '0'; -- foreground ram 1000-1fff +palette_cs <= '1' when cpu_addr(15 downto 4) = "000011000000" else '0'; -- palette ram 0c00-0c0f +prog_rom_cs <= '1' when cpu_addr(15 downto 14) = "11" else '0'; -- program rom c000-ffff + +-- write enable +wram_we <= '1' when wram_cs = '1' and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 0000-07ff +raz_nmi_we <= '1' when io_cs = '1' and cpu_addr(2 downto 0) = "000" and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 4000 +scroll1_we <= '1' when io_cs = '1' and cpu_addr(2 downto 0) = "100" and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 4004 +scroll2_we <= '1' when io_cs = '1' and cpu_addr(2 downto 0) = "101" and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 4005 +cocktail_we <= '1' when io_cs = '1' and cpu_addr(2 downto 0) = "010" and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 4002 +sound_req <= '1' when io_cs = '1' and cpu_addr(2 downto 0) = "011" and cpu_rw_n = '0' else '0'; -- 4003 +fg_ram_low_we <= '1' when fg_ram_cs = '1' and cpu_addr(10) = '0' and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 1000-13ff & 1800-4bff +fg_ram_high_we <= '1' when fg_ram_cs = '1' and cpu_addr(10) = '1' and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 1400-17ff & 1c00-4fff +palette_we <= '1' when palette_cs = '1' and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 0c00-0c0f + +-- cpu di mux +cpu_di <= wram_do when wram_cs = '1' else + prog_rom_do when prog_rom_cs = '1' else + vblank&dip_sw1(6 downto 0) when (io_cs = '1') and (cpu_addr(2 downto 0) = "011") else + dip_sw2 when (io_cs = '1') and (cpu_addr(2 downto 0) = "100") else + btn_p1 when (io_cs = '1') and (cpu_addr(2 downto 0) = "000") else + btn_p2 when (io_cs = '1') and (cpu_addr(2 downto 0) = "001") else + btn_system when (io_cs = '1') and (cpu_addr(2 downto 0) = "010") else + fg_ram_low_do when (fg_ram_cs = '1') and (cpu_addr(10) = '0') else + "000000"&fg_ram_high_do when (fg_ram_cs = '1') and (cpu_addr(10) = '1') else + X"FF"; + +-- decrypt fetched instruction +decrypt <= '1' when ((cpu_addr(15 downto 0) and X"0104") = X"0104") and (cpu_sync = '1') and (had_written = '1') else '0'; +cpu_di_dec <= cpu_di when decrypt = '0' else + cpu_di(6) & cpu_di(5) & cpu_di(3) & cpu_di(4) & cpu_di(2) & cpu_di(7) & cpu_di(1 downto 0); + +---------------------------- +-- foreground and sprites -- +---------------------------- + +-- foreground ram addr +fg_ram_addr_sel <= "00" when cpu_ena = '1' and cpu_addr(11) = '0' else + "01" when cpu_ena = '1' and cpu_addr(11) = '1' else + "10" when cpu_ena = '0' and hcnt(8) = '0' else + "11"; + +with fg_ram_addr_sel select +fg_ram_addr <= cpu_addr(4 downto 0) & cpu_addr(9 downto 5) when "00", -- cpu mirrored addressing + cpu_addr(9 downto 0) when "01", -- cpu normal addressing + vcnt_flip(7 downto 3) & hcnt_flip(7 downto 3) when "10", -- foreground tile scan addressing + "00000" & hcnt(6 downto 2) when others; -- sprite data scan addressing + +-- latch sprite data, +-- manage fg and sprite graphix rom address +-- manage sprite line buffer address +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '1' then + + if hcnt(3 downto 0) = "0000" then + sprite_attr <= fg_ram_low_do(2 downto 0); + end if; + if hcnt(3 downto 0) = "0100" then + sprite_tile <= fg_ram_low_do(7 downto 0); + end if; + if hcnt(3 downto 0) = "1000" then + if sprite_attr(1) = '0' then + sprite_line <= vcnt_flip(7 downto 0) - 0 + fg_ram_low_do(7 downto 0); + else + sprite_line <= (vcnt_flip(7 downto 0) - 0 + fg_ram_low_do(7 downto 0)) xor X"0F"; -- flip V + end if; + end if; + + if hcnt(2 downto 0) = "100" then + hcnt8_r <= hcnt(8); + fg_grphx_addr_early <= fg_ram_high_do & fg_ram_low_do & vcnt_flip(2 downto 0); -- fg_ram_low_do(7) = '1' => low priority foreground + if hcnt8_r = '1' then + fg_grphx_addr <= sprite_tile & not (sprite_attr(2) xor hcnt_flip(3) xor cocktail_flip) & sprite_line(3 downto 0); + if hcnt(3) = '1' then + if (sprite_line(7 downto 4) = "1111") and (sprite_attr(0) = '1') then + display_tile <= '1'; + else + display_tile <= '0'; + end if; + end if; + else + fg_grphx_addr <= fg_grphx_addr_early; + display_tile <= '1'; + end if; + end if; + + if hcnt8_r = '1' then + if hcnt(3 downto 0) = X"D" then + sprite_buffer_addr <= fg_ram_low_do(7 downto 0); + hcnt8_rr <= '1'; + else + sprite_buffer_addr <= sprite_buffer_addr + '1'; + end if; + else + if hcnt(7 downto 0) = X"0D" then + sprite_buffer_addr <= X"01"; -- (others => '0'); + hcnt8_rr <= '0'; + else + sprite_buffer_addr <= sprite_buffer_addr + '1'; + end if; + end if; + + end if; +end process; + +sprite_buffer_addr_flip <= not (sprite_buffer_addr) when hcnt8_rr = '0' and cocktail_flip = '1' else sprite_buffer_addr; + +-- latch and shift foreground and sprite graphics +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '1' then + if hcnt(2 downto 0) = "101" then + if display_tile = '1' then + fg_sp_grphx_1 <= fg_grphx_1_do; + fg_sp_grphx_2 <= fg_grphx_2_do; + fg_sp_grphx_3 <= fg_grphx_3_do; + fg_low_priority <= '1'; --fg_grphx_addr(10); -- #fg_ram_low_do(7) (always 1 for burger time) + else + fg_sp_grphx_1 <= (others =>'0'); + fg_sp_grphx_2 <= (others =>'0'); + fg_sp_grphx_3 <= (others =>'0'); + end if; + elsif cocktail_flip = '0' or hcnt8_rr = '1' then + fg_sp_grphx_1 <= '0' & fg_sp_grphx_1(7 downto 1); + fg_sp_grphx_2 <= '0' & fg_sp_grphx_2(7 downto 1); + fg_sp_grphx_3 <= '0' & fg_sp_grphx_3(7 downto 1); + else + fg_sp_grphx_1 <= fg_sp_grphx_1(6 downto 0) & '0'; + fg_sp_grphx_2 <= fg_sp_grphx_2(6 downto 0) & '0'; + fg_sp_grphx_3 <= fg_sp_grphx_3(6 downto 0) & '0'; + end if; + end if; +end process; + +fg_sp_bits <= fg_sp_grphx_3(0) & fg_sp_grphx_2(0) & fg_sp_grphx_1(0) when cocktail_flip = '0' or hcnt8_rr = '1' else + fg_sp_grphx_3(7) & fg_sp_grphx_2(7) & fg_sp_grphx_1(7); + +-- data to sprite buffer +sprite_buffer_di <= "000" when hcnt8_rr = '0' else -- clear ram after read + sprite_buffer_do when fg_sp_bits = "000" else fg_sp_bits; -- sp vs sp priority rules + +-- read sprite buffer +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '0' then + if hcnt8_rr = '0' then + sp_bits_out <= sprite_buffer_do; + else + sp_bits_out <= "000"; + end if; + end if; +end process; + +-- mux foreground and sprite buffer output with priorities +fg_bits <= sp_bits_out when (fg_sp_bits = "000") or (sp_bits_out/="000" and fg_low_priority = '1') else fg_sp_bits; + +---------------- +-- background -- +---------------- + +-- latch scroll1 & 2 data +process (clock_12n) +begin + if rising_edge(clock_12n) and clock_6 = '1' then + if scroll1_we = '1' then + scroll1 <= cpu_do(4 downto 0); + end if; + if scroll2_we = '1' then + scroll2 <= cpu_do; + end if; + end if; +end process; + +-- manage background rom map address +bg_scan_hcnt <= (hcnt_flip) + (scroll1(1 downto 0)&scroll2) + "0011110010" when cocktail_flip = '0' else + (hcnt_flip) + (scroll1(1 downto 0)&scroll2) + "1100000101"; + +bg_map_addr <= scroll1(2) & bg_scan_hcnt(9 downto 4) & vcnt_flip(7 downto 4); + +-- manage background graphics rom address +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '0' then + if bg_scan_hcnt(2 downto 0) = "000" then + bg_grphx_addr <= bg_map_do(5 downto 0) & bg_scan_hcnt(3) & vcnt_flip(3 downto 0); + end if; + end if; +end process; + +-- latch and shift background graphics +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '1' then + if scroll1(4) = '0' then + bg_grphx_1 <= (others => '0'); + bg_grphx_2 <= (others => '0'); + bg_grphx_3 <= (others => '0'); + else + if bg_scan_hcnt(2 downto 0) = "000" then + bg_grphx_1 <= bg_grphx_1_do; + bg_grphx_2 <= bg_grphx_2_do; + bg_grphx_3 <= bg_grphx_3_do; + elsif cocktail_flip = '0' then + bg_grphx_1 <= '0' & bg_grphx_1(7 downto 1); + bg_grphx_2 <= '0' & bg_grphx_2(7 downto 1); + bg_grphx_3 <= '0' & bg_grphx_3(7 downto 1); + else + bg_grphx_1 <= bg_grphx_1(6 downto 0) & '0'; + bg_grphx_2 <= bg_grphx_2(6 downto 0) & '0'; + bg_grphx_3 <= bg_grphx_3(6 downto 0) & '0'; + end if; + end if; + end if; +end process; + +bg_bits <= bg_grphx_3(0) & bg_grphx_2(0) & bg_grphx_1(0) when cocktail_flip = '0' else + bg_grphx_3(7) & bg_grphx_2(7) & bg_grphx_1(7); + +-- manage color palette address +palette_addr <= cpu_addr(3 downto 0) when palette_we = '1' else + '1'&bg_bits when fg_bits = "000" else + '0'&fg_bits; + +-- get palette output +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '0' then + video_r <= not palette_do(2 downto 0); + video_g <= not palette_do(5 downto 3); + video_b <= not palette_do(7 downto 6); + end if; +end process; + +---------------------------- +-- video syncs and blanks -- +---------------------------- + +video_csync <= csync; + +process(clock_12) + constant hcnt_base : integer := 312; --320 + variable vsync_cnt : std_logic_vector(3 downto 0); +begin + +if rising_edge(clock_12) and clock_6 = '1' then + + if hcnt = hcnt_base+0 then hsync0 <= '0'; + elsif hcnt = hcnt_base+24 then hsync0 <= '1'; + end if; + + if hcnt = hcnt_base+0 then hsync1 <= '0'; + elsif hcnt = hcnt_base+12 then hsync1 <= '1'; + elsif hcnt = hcnt_base+192-384 then hsync1 <= '0'; + elsif hcnt = hcnt_base+204-384 then hsync1 <= '1'; + end if; + + if hcnt = hcnt_base+0 then hsync2 <= '0'; + elsif hcnt = hcnt_base+192-12-384 then hsync2 <= '1'; + elsif hcnt = hcnt_base+192-384 then hsync2 <= '0'; + elsif hcnt = hcnt_base+0-12 then hsync2 <= '1'; + end if; + + if hcnt = hcnt_base then + if vcnt = 246 then + vsync_cnt := X"0"; + else + if vsync_cnt < X"F" then vsync_cnt := vsync_cnt + '1'; end if; + end if; + end if; + + if vsync_cnt = 0 then csync <= hsync1; + elsif vsync_cnt = 1 then csync <= hsync1; + elsif vsync_cnt = 2 then csync <= hsync1; + elsif vsync_cnt = 3 then csync <= hsync2; + elsif vsync_cnt = 4 then csync <= hsync2; + elsif vsync_cnt = 5 then csync <= hsync2; + elsif vsync_cnt = 6 then csync <= hsync1; + elsif vsync_cnt = 7 then csync <= hsync1; + elsif vsync_cnt = 8 then csync <= hsync1; + else csync <= hsync0; + end if; + + if hcnt = 267 then hblank <= '1'; + elsif hcnt = 14 then hblank <= '0'; + end if; + + if vcnt = 248 then vblank <= '1'; + elsif vcnt = 8 then vblank <= '0'; + end if; + + -- external sync and blank outputs + video_blankn <= not (hblank or vblank); + + video_hs <= hsync0; + + if vsync_cnt = 0 then video_vs <= '0'; + elsif vsync_cnt = 8 then video_vs <= '1'; + end if; + +end if; +end process; + +--------------------------- +-- components +--------------------------- + +cpu_inst : entity work.T65 +port map +( + Mode => "00", -- 6502 + Res_n => reset_n, + Enable => cpu_ena, + Clk => clock_12, + Rdy => '1', + Abort_n => '1', + IRQ_n => '1',--cpu_irq_n, + NMI_n => cpu_nmi_n, + SO_n => '1',--cpu_so_n, + R_W_n => cpu_rw_n, + Sync => cpu_sync, -- open + EF => open, + MF => open, + XF => open, + ML_n => open, + VP_n => open, + VDA => open, + VPA => open, + A => cpu_addr, + DI => cpu_di_dec, + DO => cpu_do +); + + +-- working ram +wram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 11) +port map( + clk => clock_12n, + we => wram_we, + addr => cpu_addr( 10 downto 0), + d => cpu_do, + q => wram_do +); + +-- program rom +program_rom: entity work.burger_time_prog +port map( + clk => clock_12n, + addr => cpu_addr(13 downto 0), + data => prog_rom_do +); + +-- foreground ram low +fg_ram_low : entity work.gen_ram +generic map( dWidth => 8, aWidth => 10) +port map( + clk => clock_12n, + we => fg_ram_low_we, + addr => fg_ram_addr, + d => cpu_do, + q => fg_ram_low_do +); + +-- foreground ram high +fg_ram_high : entity work.gen_ram +generic map( dWidth => 2, aWidth => 10) +port map( + clk => clock_12n, + we => fg_ram_high_we, + addr => fg_ram_addr, + d => cpu_do(1 downto 0), + q => fg_ram_high_do +); + +-- foreground and sprite graphix rom bit #1 +fg_sp_graphx_1: entity work.fg_sp_graphx_1 +port map( + clk => clock_12n, + addr => fg_grphx_addr, + data => fg_grphx_1_do +); + +-- foreground and sprite graphix rom bit #2 +fg_sp_graphx_2: entity work.fg_sp_graphx_2 +port map( + clk => clock_12n, + addr => fg_grphx_addr, + data => fg_grphx_2_do +); + +-- foreground and sprite graphix rom bit #3 +fg_sp_graphx_3: entity work.fg_sp_graphx_3 +port map( + clk => clock_12n, + addr => fg_grphx_addr, + data => fg_grphx_3_do +); + +-- sprite buffer ram +sprite_buffer_ram : entity work.gen_ram +generic map( dWidth => 3, aWidth => 8) +port map( + clk => clock_12n, + we => clock_6, + addr => sprite_buffer_addr_flip, + d => sprite_buffer_di, + q => sprite_buffer_do +); + +-- color palette ram +color_ram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 4) +port map( + clk => clock_12n, + we => palette_we, + addr => palette_addr, + d => cpu_do, + q => palette_do +); + +-- background map rom +bg_map: entity work.bg_map +port map( + clk => clock_12n, + addr => bg_map_addr, + data => bg_map_do +); + +-- background graphix rom bit #1 +bg_graphx_1: entity work.bg_graphx_1 +port map( + clk => clock_12n, + addr => bg_grphx_addr, + data => bg_grphx_1_do +); + +-- background graphix rom bit #2 +bg_graphx_2: entity work.bg_graphx_2 +port map( + clk => clock_12n, + addr => bg_grphx_addr, + data => bg_grphx_2_do +); + +-- background graphix rom bit #3 +bg_graphx_3: entity work.bg_graphx_3 +port map( + clk => clock_12n, + addr => bg_grphx_addr, + data => bg_grphx_3_do +); + +-- burger time sound part +burger_tiime_sound: entity work.burger_time_sound +port map( + clock_12 => clock_12, + reset => reset, + + sound_req => sound_req, + sound_code_in => cpu_do, + sound_timing => vcnt(3), + + audio_out => audio_out, + + dbg_cpu_addr => dbg_cpu_addr +); + +end SYN; diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/burger_time_mist.sv b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/burger_time_mist.sv new file mode 100644 index 00000000..6415acb9 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/burger_time_mist.sv @@ -0,0 +1,167 @@ +module burger_time_mist +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "BurgerTime;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_48, clk_12, clk_6, clk_24; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_48), + .c1(clk_12), + .c2(clk_6), + .c3(clk_24) +); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +burger_time burger_time( + .clock_12(clk_12), + .reset(status[0] | status[6] | buttons[1]), + .video_r(r), + .video_g(g), + .video_b(b), + .video_csync(), + .video_blankn(blankn), + .video_hs(hs), + .video_vs(vs), + .audio_out(audio), + .start2(m_start2), + .start1(m_start1), + .coin1(m_coin), + .fire1(m_fire), + .right1(m_right), + .left1(m_left), + .down1(m_down), + .up1(m_up), + .fire2(m_fire), + .right2(m_right), + .left2(m_left), + .down2(m_down), + .up2(m_up), + .dbg_cpu_addr() +); + +wire [10:0] audio; + +dac dac ( + .clk_i(clk_48), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [2:0] r, g; +wire [1:0] b; +wire blankn; + +video_mixer #(.LINE_LENGTH(320), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_48), + .ce_pix(clk_6), + .ce_pix_actual(clk_6), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn ? r&r : "000000"), + .G(blankn ? g&g : "000000"), + .B(blankn ? b&b : "0000"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_48 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_48), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule + + + + diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/dac.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/dac.vhd new file mode 100644 index 00000000..b1ecdcb7 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_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 := 11 + ); + 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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/gen_ram.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/gen_ram.vhd new file mode 100644 index 00000000..f1a95608 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/gen_ram.vhd @@ -0,0 +1,84 @@ +-- ----------------------------------------------------------------------- +-- +-- Syntiac's generic VHDL support files. +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- +-- Modified April 2016 by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +-- Remove address register when writing +-- +-- ----------------------------------------------------------------------- +-- +-- gen_rwram.vhd +-- +-- ----------------------------------------------------------------------- +-- +-- generic ram. +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity gen_ram is + generic ( + dWidth : integer := 8; + aWidth : integer := 10 + ); + port ( + clk : in std_logic; + we : in std_logic; + addr : in std_logic_vector((aWidth-1) downto 0); + d : in std_logic_vector((dWidth-1) downto 0); + q : out std_logic_vector((dWidth-1) downto 0) + ); +end entity; + +-- ----------------------------------------------------------------------- + +architecture rtl of gen_ram is + subtype addressRange is integer range 0 to ((2**aWidth)-1); + type ramDef is array(addressRange) of std_logic_vector((dWidth-1) downto 0); + signal ram: ramDef; + + signal rAddrReg : std_logic_vector((aWidth-1) downto 0); + signal qReg : std_logic_vector((dWidth-1) downto 0); +begin +-- ----------------------------------------------------------------------- +-- Signals to entity interface +-- ----------------------------------------------------------------------- +-- q <= qReg; + +-- ----------------------------------------------------------------------- +-- Memory write +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if we = '1' then + ram(to_integer(unsigned(addr))) <= d; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Memory read +-- ----------------------------------------------------------------------- +process(clk) + begin + if rising_edge(clk) then +-- qReg <= ram(to_integer(unsigned(rAddrReg))); +-- rAddrReg <= addr; +---- qReg <= ram(to_integer(unsigned(addr))); + q <= ram(to_integer(unsigned(addr))); + end if; + end process; +--q <= ram(to_integer(unsigned(addr))); +end architecture; + diff --git a/Arcade/Data East Cassette/Burger_Time_MiST/rtl/hq2x.sv b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/keyboard.v b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/mist_io.v b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/osd.v b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/pll.qip b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/pll.v b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/pll.v new file mode 100644 index 00000000..fe052027 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/pll.v @@ -0,0 +1,396 @@ +// 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 ( + areset, + inclk0, + c0, + c1, + c2, + c3); + + input areset; + input inclk0; + output c0; + output c1; + output c2; + output c3; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [4:0] sub_wire0; + wire [0:0] sub_wire7 = 1'h0; + wire [2:2] sub_wire4 = sub_wire0[2:2]; + wire [0:0] sub_wire3 = sub_wire0[0:0]; + wire [3:3] sub_wire2 = sub_wire0[3:3]; + wire [1:1] sub_wire1 = sub_wire0[1:1]; + wire c1 = sub_wire1; + wire c3 = sub_wire2; + wire c0 = sub_wire3; + wire c2 = sub_wire4; + wire sub_wire5 = inclk0; + wire [1:0] sub_wire6 = {sub_wire7, sub_wire5}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire6), + .clk (sub_wire0), + .activeclock (), + .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 = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 16, + altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 9, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 4, + altpll_component.clk1_phase_shift = "0", + altpll_component.clk2_divide_by = 9, + altpll_component.clk2_duty_cycle = 50, + altpll_component.clk2_multiply_by = 2, + altpll_component.clk2_phase_shift = "0", + altpll_component.clk3_divide_by = 9, + altpll_component.clk3_duty_cycle = 50, + altpll_component.clk3_multiply_by = 8, + altpll_component.clk3_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_USED", + 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_USED", + 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 "9" +// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "9" +// Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +// Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "9" +// 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: DUTY_CYCLE3 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "48.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "12.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "6.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "24.000000" +// 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: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "16" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "4" +// Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "2" +// Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "8" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "48.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "12.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "6.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "24.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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 "ps" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "9" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "16" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "4" +// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "2" +// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "9" +// Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "8" +// Retrieval info: CONSTANT: CLK3_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_USED" +// 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_USED" +// 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: areset 0 0 0 0 INPUT GND "areset" +// 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +// 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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/scandoubler.v b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..36e71ed2 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/t65/T65.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/t65/T65.vhd new file mode 100644 index 00000000..09253fe0 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/t65/T65_ALU.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/t65/T65_ALU.vhd new file mode 100644 index 00000000..b1f6d632 --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/t65/T65_MCode.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/t65/T65_MCode.vhd new file mode 100644 index 00000000..6c6c864a --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/t65/T65_Pack.vhd b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/t65/T65_Pack.vhd new file mode 100644 index 00000000..e025e1bf --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_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/Arcade/Data East Cassette/Burger_Time_MiST/rtl/video_mixer.sv b/Arcade/Data East Cassette/Burger_Time_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Data East Cassette/Burger_Time_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/Arcade/Data East Cassette/Burnin Rubber_MiST/README.txt b/Arcade/Data East Cassette/Burnin Rubber_MiST/README.txt new file mode 100644 index 00000000..26859cf2 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/README.txt @@ -0,0 +1,242 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Burnin Rubber for MiST by Gehstock +-- 18 December 2017 +-- +--------------------------------------------------------------------------------- +-- Copyright (c) DAR - Dez 2017 +-- https://sourceforge.net/projects/darfpga/files/Software%20VHDL/burnin_rubber/ +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F1 : Start 1 player +-- F2 : Start 2 players +-- SPACE : Turbo +-- LALT : Turbo +-- ARROW KEYS : Movement +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + + + +--------------------------------------------------------------------------------- +-- burnin rubber by Dar (darfpga@aol.fr) (05/12/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T65(b) core.Ver 301 by MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Use burnin_rubber_de10_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +-- +-- Main features : +-- PS2 keyboard input @gpio pins 35/34 (beware voltage translation/protection) +-- Audio pwm output @gpio pins 1/3 (beware voltage translation/protection) +-- +-- Uses 1 pll for 12MHz generation from 50MHz +-- +-- Board key : +-- 0 : reset game +-- +-- Keyboard players inputs : +-- +-- F3 : Add coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE : Jump +-- RIGHT arrow : move right +-- LEFT arrow : move left +-- UP arrow : accelerate +-- DOWN arrow : slow down +-- +-- Other details : see burnin_rubber.vhd +-- For USB inputs and SGT5000 audio output see my other project: xevious_de10_lite +--------------------------------------------------------------------------------- +-- Use burnin_rubber_de10_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +-- Features : +-- TV 15KHz mode only (atm) +-- Coctail mode ok +-- Sound ok +-- No external RAM/SDRAM required + +-- Use with MAME roms from rbubber.zip +-- +-- Use make_burnin_rubber_proms.bat to build vhd file from binaries + +-- Burnin' Rubber Hardware caracteristics : +-- +-- VIDEO : 1x6502@750kHz CPU accessing its program rom, working ram, +-- foreground and sprite data ram, I/O, sound board register and trigger. +-- 16Kx8bits program rom +-- 2Kb8bits working ram +-- +-- One char 8x8 tile map 32x30 + sprites data +-- 1Kx8bits + 1Kx2bits +-- 3x8Kx8bits graphics rom 3bits/pixel +-- 8 colors with ram palette +-- +-- 8 sprites 16*16 with priorities and flip H/V +-- use char graphics rom and colors +-- +-- Char/sprites 8 colors among 256 colors +-- 8bits 3red/3green/2blue +-- +-- Sprites buffer rams 3x256bits +-- +-- Background tile map with scroll 0-511 pixels +-- 1K*4bits ram +-- 4K*8bits + 4K*4bits graphics rom 3bits/pixel +-- 8 colors with ram palette +-- 16x16 tiles +-- +-- SOUND : 1x6502@500kHz CPU accessing its program rom, working ram, 2x-AY3-8910, +-- command registers, triggers. +-- 2Kx8bits working ram +-- 4Kx8bits program rom +-- +-- 1xAY-3-8910 +-- 3 sound channels +-- 1xAY-3-8910 +-- 3 sound channels +-- +-- Pass band active filter on channel A of AY#2 +-- ++----------------------------------------------------------------------------------+ +; Fitter Summary ; ++------------------------------------+---------------------------------------------+ +; Fitter Status ; Successful - Fri Dec 22 17:53:19 2017 ; +; Quartus Prime Version ; 16.1.0 Build 196 10/24/2016 SJ Lite Edition ; +; Revision Name ; burnin_rubber_de10_lite ; +; Top-level Entity Name ; burnin_rubber_de10_lite ; +; Family ; MAX 10 ; +; Device ; 10M50DAF484C6GES ; +; Timing Models ; Preliminary ; +; Total logic elements ; 3,565 / 49,760 ( 7 % ) ; +; Total combinational functions ; 3,392 / 49,760 ( 7 % ) ; +; Dedicated logic registers ; 1,099 / 49,760 ( 2 % ) ; +; Total registers ; 1099 ; +; Total pins ; 105 / 360 ( 29 % ) ; +; Total virtual pins ; 0 ; +; Total memory bits ; 433,024 / 1,677,312 ( 26 % ) ; +; Embedded Multiplier 9-bit elements ; 0 / 288 ( 0 % ) ; +; Total PLLs ; 1 / 4 ( 25 % ) ; +; UFM blocks ; 0 / 1 ( 0 % ) ; +; ADC blocks ; 0 / 2 ( 0 % ) ; ++------------------------------------+---------------------------------------------+ + +--------------- +VHDL File list +--------------- + +max10_pll_12M.vhd Pll 12MHz and 14 MHz from 50MHz altera mf + +rtl_dar/burnin_rubber_de10_lite.vhd Top level for de10_lite board + +rtl_dar/burnin_rubber.vhd Main video board logic +rtl_dar/burnin_rubber _sound.vhd Main sound board logic + +rtl_mikej/YM2149_linmix_sep.vhd Copyright (c) MikeJ - Jan 2005 + +t65/T65.vhd Copyright (c) MikeJ - Jan 2005t65/T65_Pack.vhdt65/T65_MCode.vhdt65/T65_ALU.vhd +rtl_dar/kbd_joystick.vhd Keyboard key to player/coin input +rtl_dar/io_ps2_keyboard.vhd Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +rtl_dar/gen_ram.vhd Generic RAM (Peter Wendrich + DAR Modification) +rtl_dar/decodeur_7_seg.vhd 7 segments display decoder + +burnin_rubber_prog.vhd Burnin' rubber video board PROMs +fg_sp_graphx_3.vhd +fg_sp_graphx_2.vhd +fg_sp_graphx_1.vhd +bg_graphx_2.vhd +bg_graphx_1.vhd + +burnin_rubber_sound_prog.vhd Burnin' rubber sound board PROM + +---------------------- +Quartus project files +---------------------- +de10_lite/burnin_rubber_de10_lite.sdc Timequest constraints file +de10_lite/burnin_rubber__de10_lite.qsf de10_lite settings (files,pins...) +de10_lite/burnin_rubber__de10_lite.qpf de10_lite project + +----------------------------- +Required ROMs (Not included) +----------------------------- +You need the following 8 ROMs binary files from brubber.zip (MAME) + +brubber.12c,brubber.12d +bnj4e +bnj4f +bnj4h +bnj10e +bnj10f +bnj6c + +------ +Tools +------ +You need to build vhdl files from the binary file : + - Unzip the roms file in the tools/burnin_rubber_unzip directory + - Double click (execute) the script tools/make_burnin_rubber_proms.bat to get the following files + +burnin_rubber_prog.vhd : brubber.12c,brubber.12d +fg_sp_graphx_1.vhd : bnj4e +fg_sp_graphx_2.vhd : bnj4f +fg_sp_graphx_3.vhd : bnj4h +bg_graphx_1.vhd : bnj10e +bg_graphx_2.vhd : bnj10f +burnin_rubber_prog_sound_prog.vhd : bnj6c + +*DO NOT REDISTRIBUTE THESE FILES* + +VHDL files are needed to compile and include roms into the project + +The script make_burnin_rubber_proms.bat uses make_vhdl_prom executables delivered both in linux and windows version. The script itself is delivered only in windows version (.bat) but should be easily ported to linux. + +Source code of make_vhdl_prom.c is also delivered. + +--------------------------------- +Compiling for de10_lite +--------------------------------- +You can build the project with ROM image embeded in the sof file. +*DO NOT REDISTRIBUTE THESE FILES* + +3 steps + + - put the VHDL ROM files (.vhd) into the rtl_dar directory + - build burnin_rubber_de10_lite + - program burnin_rubber_de10_lite.sof + +------------------------ +------------------------ +End of file +------------------------ diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/Release/burnin_rubber_mist.rbf b/Arcade/Data East Cassette/Burnin Rubber_MiST/Release/burnin_rubber_mist.rbf new file mode 100644 index 00000000..048e218b Binary files /dev/null and b/Arcade/Data East Cassette/Burnin Rubber_MiST/Release/burnin_rubber_mist.rbf differ diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/burnin_rubber_mist.qpf b/Arcade/Data East Cassette/Burnin Rubber_MiST/burnin_rubber_mist.qpf new file mode 100644 index 00000000..eabe62fd --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/burnin_rubber_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 = 21:51:49 December 06, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "16.1" +DATE = "21:51:49 December 06, 2017" + +# Revisions + +PROJECT_REVISION = "burnin_rubber_mist" diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/burnin_rubber_mist.qsf b/Arcade/Data East Cassette/Burnin Rubber_MiST/burnin_rubber_mist.qsf new file mode 100644 index 00000000..adbc6efc --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/burnin_rubber_mist.qsf @@ -0,0 +1,174 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:52:55 December 26, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# burnin_rubber_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 SYSTEMVERILOG_FILE rtl/burnin_rubber_mist.sv +set_global_assignment -name VHDL_FILE rtl/burnin_rubber.vhd +set_global_assignment -name VHDL_FILE "rtl/burnin_rubber _sound.vhd" +set_global_assignment -name VERILOG_FILE rtl/pll.v +set_global_assignment -name VHDL_FILE rtl/YM2149_linmix_sep.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/gen_ram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.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_global_assignment -name VHDL_FILE rtl/Roms/fg_sp_graphx_3.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/fg_sp_graphx_2.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/fg_sp_graphx_1.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/burnin_rubber_sound_prog.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/burnin_rubber_prog.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/bg_graphx_2.vhd +set_global_assignment -name VHDL_FILE rtl/Roms/bg_graphx_1.vhd +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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY burnin_rubber_mist +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# 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_DATA7_THROUGH_DATA2_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_OTHER_AP_PINS_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# SignalTap II Assignments +# ======================== +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp + +# 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 ENTITY(burnin_rubber_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(burnin_rubber_mist) +# ------------------------------ +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/clean.bat b/Arcade/Data East Cassette/Burnin Rubber_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/bg_graphx_1.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/bg_graphx_1.vhd new file mode 100644 index 00000000..6d1ac246 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/bg_graphx_1.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity bg_graphx_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of bg_graphx_1 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"68",X"78",X"5A",X"87",X"0D",X"A2",X"2A",X"22",X"66",X"66",X"EE",X"EE",X"66",X"66",X"66", + X"F0",X"E0",X"3C",X"28",X"0F",X"69",X"E1",X"F0",X"C3",X"87",X"00",X"FF",X"FF",X"00",X"96",X"00", + X"C1",X"2D",X"C3",X"0B",X"1E",X"D2",X"A1",X"2D",X"69",X"0F",X"00",X"FF",X"FF",X"00",X"78",X"00", + X"F0",X"F0",X"C1",X"B0",X"2D",X"0B",X"45",X"45",X"44",X"66",X"66",X"77",X"77",X"66",X"66",X"66", + X"F0",X"F0",X"34",X"F0",X"F0",X"E0",X"F0",X"34",X"F0",X"78",X"B0",X"F0",X"92",X"34",X"F0",X"F0", + X"F0",X"F0",X"16",X"F0",X"F0",X"D0",X"F0",X"92",X"F0",X"E0",X"F0",X"92",X"F0",X"F0",X"34",X"F0", + X"78",X"F0",X"78",X"F0",X"92",X"34",X"D0",X"F0",X"F0",X"F0",X"92",X"C1",X"F0",X"F0",X"F0",X"F0", + X"D0",X"F0",X"E0",X"34",X"92",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"92",X"F0",X"E0",X"F0",X"F0", + X"03",X"90",X"08",X"87",X"41",X"0F",X"0B",X"2D",X"07",X"02",X"08",X"41",X"09",X"0D",X"0F",X"0A", + X"0E",X"0A",X"01",X"00",X"0C",X"0C",X"0F",X"43",X"94",X"0B",X"03",X"A1",X"07",X"03",X"28",X"05", + X"07",X"0F",X"C2",X"07",X"03",X"04",X"02",X"41",X"02",X"01",X"09",X"08",X"0E",X"43",X"0E",X"09", + X"0B",X"03",X"00",X"10",X"08",X"48",X"02",X"0F",X"09",X"03",X"25",X"4B",X"09",X"09",X"08",X"0E", + X"83",X"07",X"0F",X"07",X"83",X"0F",X"0F",X"2C",X"41",X"41",X"29",X"29",X"0F",X"07",X"03",X"01", + X"07",X"70",X"0F",X"1C",X"49",X"83",X"41",X"20",X"0F",X"07",X"0D",X"07",X"02",X"03",X"02",X"00", + X"1C",X"0F",X"83",X"0F",X"0B",X"0A",X"0F",X"0F",X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"07",X"02",X"01",X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"DF",X"EF",X"AA",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"BF",X"FF",X"55",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"CF",X"FF",X"AA",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88", + X"3F",X"FF",X"55",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"0F",X"8F",X"AD",X"AD",X"0F",X"5E",X"2D",X"8F",X"4F",X"DE",X"9E",X"AF",X"8F",X"5E",X"8F",X"4B", + X"3F",X"6F",X"5F",X"2F",X"BF",X"2F",X"BF",X"1F",X"2F",X"5F",X"AF",X"6F",X"BF",X"5F",X"AF",X"1F", + X"0F",X"2F",X"2F",X"0F",X"0F",X"8F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"0F",X"4F",X"0F",X"0F", + X"0F",X"1F",X"2F",X"1F",X"0F",X"0F",X"0F",X"1F",X"1F",X"4F",X"0F",X"0F",X"2F",X"0F",X"0F",X"2F", + X"1E",X"3C",X"96",X"5A",X"38",X"34",X"1E",X"3C",X"34",X"1E",X"50",X"F0",X"3C",X"D2",X"34",X"F0", + X"DF",X"AF",X"4F",X"CF",X"8F",X"8F",X"5E",X"8E",X"0F",X"0D",X"4B",X"2D",X"50",X"F0",X"F0",X"D0", + X"8F",X"1F",X"2F",X"2F",X"0F",X"4F",X"0F",X"AF",X"BF",X"EF",X"1E",X"0F",X"D2",X"A0",X"F0",X"F0", + X"0F",X"4F",X"8F",X"9F",X"4F",X"CF",X"2F",X"CF",X"EF",X"3F",X"4F",X"CF",X"0F",X"0F",X"58",X"F0", + X"0F",X"4A",X"0C",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A5",X"4B",X"0D",X"87",X"07",X"0B",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"5A",X"4B",X"0F",X"09",X"86",X"0F",X"0B",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00", + X"0F",X"1C",X"29",X"1C",X"4B",X"A5",X"1A",X"06",X"04",X"0F",X"0F",X"07",X"0E",X"0C",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"EF",X"DF", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"55",X"FF",X"BF", + X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"FF",X"CF", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"55",X"FF",X"3F", + X"4F",X"2F",X"0F",X"0F",X"2F",X"2F",X"9F",X"1F",X"2F",X"0F",X"0F",X"0F",X"4F",X"2F",X"0F",X"8F", + X"0F",X"1F",X"8F",X"0F",X"9F",X"0F",X"0F",X"8F",X"0F",X"AF",X"0F",X"1F",X"8F",X"4F",X"0F",X"1F", + X"0F",X"9F",X"4F",X"0F",X"0F",X"0F",X"0F",X"0F",X"4F",X"0F",X"0F",X"0F",X"0F",X"4F",X"8F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"87",X"97",X"0F",X"4B",X"A7",X"87",X"0F",X"0F",X"A7",X"0F", + X"4F",X"8F",X"0F",X"2F",X"8F",X"5F",X"1F",X"8F",X"4F",X"2F",X"1F",X"0F",X"0F",X"1F",X"0F",X"C1", + X"0F",X"CF",X"1F",X"2F",X"CF",X"0F",X"BF",X"1F",X"1F",X"2F",X"0F",X"0F",X"0F",X"60",X"06",X"F0", + X"0F",X"0F",X"1F",X"0F",X"4F",X"1F",X"0F",X"3F",X"2F",X"0B",X"07",X"07",X"0B",X"C1",X"F0",X"F0", + X"87",X"85",X"87",X"B7",X"07",X"D3",X"43",X"C3",X"A1",X"C2",X"C1",X"F0",X"E0",X"F0",X"F0",X"F0", + X"0F",X"0F",X"1F",X"8F",X"0F",X"0F",X"0F",X"4F",X"4F",X"1F",X"AF",X"6F",X"FF",X"1F",X"2D",X"B0", + X"CF",X"0F",X"8F",X"0F",X"0F",X"0F",X"8F",X"8F",X"2F",X"4F",X"FF",X"4F",X"87",X"0A",X"61",X"F0", + X"0F",X"0F",X"4F",X"8F",X"0F",X"4F",X"0F",X"4F",X"8F",X"3F",X"5F",X"BF",X"9F",X"1C",X"0D",X"E0", + X"0F",X"0F",X"4F",X"0F",X"0F",X"2F",X"1F",X"8F",X"0F",X"2F",X"1F",X"6F",X"BF",X"4F",X"8F",X"94", + X"0F",X"0F",X"0F",X"2F",X"0F",X"8F",X"0F",X"0F",X"1F",X"0F",X"4F",X"8F",X"1F",X"4F",X"4F",X"0F", + X"2F",X"8F",X"1F",X"2F",X"0F",X"0F",X"0F",X"1F",X"4F",X"AF",X"2F",X"8F",X"4F",X"2F",X"4F",X"1F", + X"0F",X"4F",X"4F",X"0F",X"1F",X"0F",X"1F",X"0F",X"0F",X"0F",X"0F",X"4F",X"0F",X"8F",X"1F",X"0F", + X"0F",X"2F",X"4F",X"2F",X"0F",X"1F",X"0F",X"2F",X"2F",X"8F",X"0F",X"0F",X"4F",X"0F",X"0F",X"4F", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0E",X"0C",X"08",X"00",X"08",X"0C",X"00",X"00",X"00",X"00", + X"00",X"00",X"04",X"0D",X"0F",X"0F",X"0D",X"05",X"03",X"0E",X"0E",X"09",X"0B",X"04",X"00",X"00", + X"00",X"00",X"00",X"00",X"0B",X"07",X"0F",X"0F",X"0E",X"0D",X"09",X"0F",X"07",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"03",X"01",X"07",X"02",X"03",X"07",X"03",X"01",X"00",X"00",X"00", + X"0F",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"05",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"66",X"66",X"66",X"EE",X"EE",X"66",X"66",X"22",X"2A",X"A2",X"0D",X"87",X"5A",X"78",X"68",X"F0", + X"00",X"96",X"00",X"FF",X"FF",X"00",X"87",X"C3",X"F0",X"E1",X"69",X"0F",X"28",X"3C",X"E0",X"F0", + X"00",X"78",X"00",X"FF",X"FF",X"00",X"0F",X"69",X"2D",X"A1",X"D2",X"1E",X"0B",X"C3",X"2D",X"C1", + X"66",X"66",X"66",X"77",X"77",X"66",X"66",X"44",X"45",X"45",X"0B",X"2D",X"B0",X"C1",X"F0",X"F0", + X"F0",X"F0",X"34",X"92",X"F0",X"B0",X"78",X"F0",X"34",X"F0",X"E0",X"F0",X"F0",X"34",X"F0",X"F0", + X"F0",X"34",X"F0",X"F0",X"92",X"F0",X"E0",X"F0",X"92",X"F0",X"D0",X"F0",X"F0",X"16",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"C1",X"92",X"F0",X"F0",X"F0",X"D0",X"34",X"92",X"F0",X"78",X"F0",X"78", + X"F0",X"F0",X"E0",X"F0",X"92",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"92",X"34",X"E0",X"F0",X"D0", + X"0A",X"0F",X"0D",X"09",X"41",X"08",X"02",X"07",X"2D",X"0B",X"0F",X"41",X"87",X"08",X"90",X"03", + X"05",X"28",X"03",X"07",X"A1",X"03",X"0B",X"94",X"43",X"0F",X"0C",X"0C",X"00",X"01",X"0A",X"0E", + X"09",X"0E",X"43",X"0E",X"08",X"09",X"01",X"02",X"41",X"02",X"04",X"03",X"07",X"C2",X"0F",X"07", + X"0E",X"08",X"09",X"09",X"4B",X"25",X"03",X"09",X"0F",X"02",X"48",X"08",X"10",X"00",X"03",X"0B", + X"01",X"03",X"07",X"0F",X"29",X"29",X"41",X"41",X"2C",X"0F",X"0F",X"83",X"07",X"0F",X"07",X"83", + X"00",X"02",X"03",X"02",X"07",X"0D",X"07",X"0F",X"20",X"41",X"83",X"49",X"1C",X"0F",X"70",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"0F",X"0A",X"0B",X"0F",X"83",X"0F",X"1C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"03",X"01",X"02",X"07",X"0F", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"EF",X"DF", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"55",X"FF",X"BF", + X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"FF",X"CF", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"55",X"FF",X"3F", + X"4B",X"8F",X"5E",X"8F",X"AF",X"9E",X"DE",X"4F",X"8F",X"2D",X"5E",X"0F",X"AD",X"AD",X"8F",X"0F", + X"1F",X"AF",X"5F",X"BF",X"6F",X"AF",X"5F",X"2F",X"1F",X"BF",X"2F",X"BF",X"2F",X"5F",X"6F",X"3F", + X"0F",X"0F",X"4F",X"0F",X"1F",X"0F",X"0F",X"0F",X"0F",X"0F",X"8F",X"0F",X"0F",X"2F",X"2F",X"0F", + X"2F",X"0F",X"0F",X"2F",X"0F",X"0F",X"4F",X"1F",X"1F",X"0F",X"0F",X"0F",X"1F",X"2F",X"1F",X"0F", + X"F0",X"34",X"D2",X"3C",X"F0",X"50",X"1E",X"34",X"3C",X"1E",X"34",X"38",X"5A",X"96",X"3C",X"1E", + X"D0",X"F0",X"F0",X"50",X"2D",X"4B",X"0D",X"0F",X"8E",X"5E",X"8F",X"8F",X"CF",X"4F",X"AF",X"DF", + X"F0",X"F0",X"A0",X"D2",X"0F",X"1E",X"EF",X"BF",X"AF",X"0F",X"4F",X"0F",X"2F",X"2F",X"1F",X"8F", + X"F0",X"58",X"0F",X"0F",X"CF",X"4F",X"3F",X"EF",X"CF",X"2F",X"CF",X"4F",X"9F",X"8F",X"4F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"0C",X"4A",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"0B",X"07",X"87",X"0D",X"4B",X"A5", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"0B",X"0F",X"86",X"09",X"0F",X"4B",X"5A",X"0F", + X"00",X"00",X"0C",X"0E",X"07",X"0F",X"0F",X"04",X"06",X"1A",X"A5",X"4B",X"1C",X"29",X"1C",X"0F", + X"DF",X"EF",X"AA",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"BF",X"FF",X"55",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"CF",X"FF",X"AA",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88", + X"3F",X"FF",X"55",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"8F",X"0F",X"2F",X"4F",X"0F",X"0F",X"0F",X"2F",X"1F",X"9F",X"2F",X"2F",X"0F",X"0F",X"2F",X"4F", + X"1F",X"0F",X"4F",X"8F",X"1F",X"0F",X"AF",X"0F",X"8F",X"0F",X"0F",X"9F",X"0F",X"8F",X"1F",X"0F", + X"0F",X"8F",X"4F",X"0F",X"0F",X"0F",X"0F",X"4F",X"0F",X"0F",X"0F",X"0F",X"0F",X"4F",X"9F",X"0F", + X"0F",X"A7",X"0F",X"0F",X"87",X"A7",X"4B",X"0F",X"97",X"87",X"1F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"C1",X"0F",X"1F",X"0F",X"0F",X"1F",X"2F",X"4F",X"8F",X"1F",X"5F",X"8F",X"2F",X"0F",X"8F",X"4F", + X"F0",X"06",X"60",X"0F",X"0F",X"0F",X"2F",X"1F",X"1F",X"BF",X"0F",X"CF",X"2F",X"1F",X"CF",X"0F", + X"F0",X"F0",X"C1",X"0B",X"07",X"07",X"0B",X"2F",X"3F",X"0F",X"1F",X"4F",X"0F",X"1F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"E0",X"F0",X"C1",X"C2",X"A1",X"C3",X"43",X"D3",X"07",X"B7",X"87",X"85",X"87", + X"B0",X"2D",X"1F",X"FF",X"6F",X"AF",X"1F",X"4F",X"4F",X"0F",X"0F",X"0F",X"8F",X"1F",X"0F",X"0F", + X"F0",X"61",X"0A",X"87",X"4F",X"FF",X"4F",X"2F",X"8F",X"8F",X"0F",X"0F",X"0F",X"8F",X"0F",X"CF", + X"E0",X"0D",X"1C",X"9F",X"BF",X"5F",X"3F",X"8F",X"4F",X"0F",X"4F",X"0F",X"8F",X"4F",X"0F",X"0F", + X"94",X"8F",X"4F",X"BF",X"6F",X"1F",X"2F",X"0F",X"8F",X"1F",X"2F",X"0F",X"0F",X"4F",X"0F",X"0F", + X"0F",X"4F",X"4F",X"1F",X"8F",X"4F",X"0F",X"1F",X"0F",X"0F",X"8F",X"0F",X"2F",X"0F",X"0F",X"0F", + X"1F",X"4F",X"2F",X"4F",X"8F",X"2F",X"AF",X"4F",X"1F",X"0F",X"0F",X"0F",X"2F",X"1F",X"8F",X"2F", + X"0F",X"1F",X"8F",X"0F",X"4F",X"0F",X"0F",X"0F",X"0F",X"1F",X"0F",X"1F",X"0F",X"4F",X"4F",X"0F", + X"4F",X"0F",X"0F",X"4F",X"0F",X"0F",X"8F",X"2F",X"2F",X"0F",X"1F",X"0F",X"2F",X"4F",X"2F",X"0F", + X"00",X"00",X"00",X"00",X"0C",X"08",X"00",X"08",X"0C",X"0E",X"0C",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"04",X"0B",X"09",X"0E",X"0E",X"03",X"05",X"0D",X"0F",X"0F",X"0D",X"04",X"00",X"00", + X"00",X"00",X"00",X"07",X"0F",X"09",X"0D",X"0E",X"0F",X"0F",X"07",X"0B",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"03",X"07",X"03",X"02",X"07",X"01",X"03",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"05",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"08"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/bg_graphx_2.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/bg_graphx_2.vhd new file mode 100644 index 00000000..9770363a --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/bg_graphx_2.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity bg_graphx_2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of bg_graphx_2 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"3F",X"CF",X"FF",X"EF",X"FF",X"AF",X"AF",X"AF",X"AF", + X"6F",X"DF",X"6F",X"DF",X"EF",X"FF",X"CF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"7F",X"0F",X"6F",X"FF",X"6F",X"CF",X"7F", + X"CF",X"7F",X"CF",X"6F",X"FF",X"6F",X"FF",X"7F",X"8F",X"1F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"02",X"02",X"06",X"06",X"0E",X"0E",X"06",X"06",X"06", + X"00",X"00",X"00",X"00",X"00",X"86",X"0E",X"CF",X"04",X"C8",X"00",X"4F",X"0F",X"C0",X"00",X"C0", + X"00",X"00",X"00",X"00",X"01",X"09",X"0A",X"02",X"06",X"00",X"00",X"0F",X"0F",X"00",X"03",X"00", + X"00",X"08",X"E0",X"02",X"F0",X"30",X"F4",X"74",X"04",X"C6",X"A6",X"87",X"A7",X"A6",X"A6",X"A6", + X"00",X"40",X"00",X"40",X"00",X"40",X"00",X"C2",X"00",X"C0",X"02",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"50",X"D0",X"50",X"D0",X"40",X"90",X"01",X"C0",X"F0",X"70",X"F0",X"30",X"E0",X"08",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"30",X"F0",X"FA",X"D0",X"B0",X"10",X"D0", + X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"20",X"00", + X"18",X"D0",X"D0",X"B0",X"F8",X"F0",X"F0",X"32",X"04",X"04",X"02",X"02",X"00",X"00",X"00",X"08", + X"00",X"01",X"00",X"01",X"00",X"00",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"08", + X"21",X"20",X"80",X"30",X"00",X"10",X"00",X"40",X"00",X"00",X"0C",X"1E",X"0E",X"0F",X"0F",X"0F", + X"50",X"00",X"00",X"08",X"00",X"08",X"08",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0E",X"0B",X"0A",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"CF", + X"C7",X"F5",X"E5",X"FF",X"6F",X"0F",X"EF",X"7F",X"6F",X"FF",X"6F",X"CF",X"6F",X"CF",X"6F",X"1F", + X"0F",X"0A",X"0A",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"0F", + X"FF",X"35",X"F5",X"FF",X"FF",X"FF",X"0F",X"FF",X"AF",X"8F",X"AF",X"AF",X"FF",X"BF",X"6F",X"8F", + X"60",X"10",X"62",X"C2",X"68",X"C1",X"6A",X"F0",X"E8",X"71",X"61",X"04",X"E0",X"F1",X"C0",X"F4", + X"0C",X"C9",X"0A",X"0D",X"04",X"0D",X"04",X"0E",X"0D",X"0A",X"05",X"09",X"04",X"0A",X"05",X"0E", + X"6F",X"8D",X"FD",X"BF",X"AF",X"A7",X"AF",X"8F",X"0F",X"FF",X"FF",X"FE",X"FF",X"FB",X"FF",X"3F", + X"1F",X"0E",X"0D",X"0E",X"0F",X"0F",X"0F",X"0E",X"0E",X"0B",X"0F",X"0F",X"0D",X"0F",X"0F",X"0D", + X"08",X"02",X"08",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"01",X"08",X"00",X"00",X"00",X"00", + X"02",X"05",X"0B",X"02",X"F4",X"30",X"F9",X"F0",X"90",X"10",X"10",X"12",X"51",X"3E",X"70",X"B0", + X"07",X"0E",X"0D",X"0D",X"0F",X"0B",X"0F",X"05",X"04",X"00",X"09",X"00",X"0D",X"42",X"08",X"00", + X"0F",X"0B",X"87",X"06",X"0B",X"03",X"1D",X"03",X"11",X"0C",X"1B",X"82",X"9A",X"10",X"15",X"68", + X"70",X"B0",X"50",X"31",X"13",X"13",X"93",X"17",X"FF",X"FF",X"FF",X"3F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"06",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"10",X"60",X"90",X"10",X"10",X"80",X"10",X"00",X"10",X"01",X"03",X"03",X"87",X"0F",X"0F",X"0F", + X"00",X"01",X"02",X"41",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07", + X"0F",X"EF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"EA",X"CB",X"FE", + X"EF",X"FF",X"7F",X"8F",X"7F",X"FF",X"FF",X"FF",X"7F",X"FF",X"6F",X"CF",X"4F",X"C5",X"05",X"07", + X"3F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"3F",X"0A",X"FA",X"0F", + X"FF",X"FF",X"1F",X"EF",X"4F",X"8F",X"2F",X"9F",X"AF",X"8F",X"AF",X"AF",X"FF",X"B5",X"05",X"9F", + X"0B",X"0D",X"4F",X"CF",X"6D",X"CD",X"76",X"FE",X"FD",X"FF",X"7F",X"FF",X"7B",X"8D",X"EF",X"F7", + X"CF",X"FE",X"07",X"EF",X"06",X"0F",X"0F",X"07",X"0F",X"05",X"0F",X"0E",X"07",X"0B",X"0F",X"EE", + X"0F",X"96",X"FB",X"B7",X"AD",X"AF",X"A5",X"8F",X"2B",X"9B",X"47",X"8D",X"1B",X"EB",X"F7",X"FF", + X"F7",X"03",X"31",X"00",X"00",X"00",X"0B",X"08",X"00",X"05",X"09",X"09",X"00",X"02",X"38",X"03", + X"0B",X"87",X"0F",X"CD",X"07",X"0A",X"0E",X"07",X"0B",X"05",X"0A",X"07",X"03",X"00",X"70",X"00", + X"FF",X"83",X"FE",X"FD",X"03",X"0F",X"00",X"02",X"0E",X"80",X"22",X"C1",X"F0",X"F0",X"B0",X"F0", + X"3F",X"0F",X"76",X"07",X"0B",X"04",X"0D",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"30", + X"B1",X"30",X"F2",X"10",X"E1",X"10",X"F0",X"10",X"B0",X"10",X"B0",X"10",X"D0",X"10",X"D0",X"10", + X"BF",X"FF",X"FE",X"F7",X"2F",X"CF",X"0F",X"8B",X"0B",X"0E",X"05",X"09",X"F0",X"F0",X"F0",X"80", + X"73",X"0F",X"07",X"0F",X"0F",X"0F",X"07",X"07",X"0D",X"0B",X"00",X"08",X"00",X"C0",X"00",X"80", + X"DF",X"1F",X"DB",X"17",X"BF",X"1B",X"BF",X"1B",X"F7",X"1C",X"EA",X"14",X"F0",X"10",X"B0",X"30", + X"0F",X"3F",X"0B",X"0F",X"0F",X"0D",X"0E",X"07",X"0F",X"0D",X"0E",X"09",X"74",X"08",X"30",X"00", + X"0F",X"0F",X"0F",X"0D",X"0F",X"07",X"0F",X"0F",X"0E",X"0F",X"0B",X"07",X"0E",X"0B",X"0B",X"0F", + X"0D",X"07",X"0E",X"0D",X"0F",X"FF",X"0F",X"1E",X"0B",X"D5",X"0D",X"F7",X"0B",X"DD",X"0B",X"1E", + X"0F",X"0B",X"0B",X"0F",X"0E",X"0F",X"0E",X"0F",X"0F",X"0F",X"0F",X"0B",X"0F",X"07",X"0E",X"0F", + X"0F",X"0D",X"EB",X"0D",X"FF",X"1E",X"8F",X"FD",X"5D",X"C7",X"5F",X"1F",X"FB",X"5F",X"0F",X"7B", + X"0F",X"1F",X"07",X"D3",X"01",X"F0",X"00",X"D0",X"01",X"13",X"01",X"F1",X"00",X"05",X"0F",X"0F", + X"0B",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"0F", + X"0F",X"7F",X"F6",X"50",X"50",X"10",X"50",X"C0",X"80",X"F0",X"F0",X"10",X"E0",X"00",X"05",X"0F", + X"0F",X"0E",X"0C",X"08",X"0C",X"08",X"00",X"00",X"08",X"08",X"00",X"00",X"08",X"08",X"0C",X"0E", + X"00",X"00",X"01",X"0B",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"C0",X"90",X"C0",X"F3",X"7F",X"7F",X"1F",X"EF",X"1F",X"CF",X"5F",X"8F",X"FF",X"FF",X"7F",X"FF", + X"00",X"00",X"00",X"0C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"06",X"FF",X"0F",X"EF",X"1F",X"CF",X"1F",X"9F",X"1F",X"9F",X"1F",X"BF",X"1F",X"AF",X"1F", + X"AF",X"AF",X"AF",X"AF",X"FF",X"EF",X"FF",X"CF",X"3F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"CF",X"FF",X"EF",X"DF",X"6F",X"DF",X"6F", + X"7F",X"CF",X"6F",X"FF",X"6F",X"0F",X"7F",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"8F",X"7F",X"FF",X"6F",X"FF",X"6F",X"CF",X"7F",X"CF", + X"06",X"06",X"06",X"0E",X"0E",X"06",X"06",X"02",X"02",X"0A",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"00",X"C0",X"0F",X"4F",X"00",X"C8",X"04",X"CF",X"0E",X"86",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"00",X"0F",X"0F",X"00",X"00",X"06",X"02",X"0A",X"09",X"01",X"00",X"00",X"00",X"00", + X"A6",X"A6",X"A6",X"A7",X"87",X"A6",X"C6",X"04",X"74",X"F4",X"30",X"F0",X"02",X"E0",X"08",X"00", + X"00",X"00",X"00",X"00",X"80",X"02",X"C0",X"00",X"C2",X"00",X"40",X"00",X"40",X"00",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"E0",X"30",X"F0",X"70",X"F0",X"C0",X"01",X"90",X"40",X"D0",X"50",X"D0",X"50", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00", + X"D0",X"10",X"B0",X"D0",X"FA",X"F0",X"30",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"0C",X"00",X"00", + X"00",X"20",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"01",X"00",X"00",X"00", + X"08",X"00",X"00",X"00",X"02",X"02",X"04",X"04",X"32",X"F0",X"F0",X"F8",X"B0",X"D0",X"D0",X"18", + X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"00",X"00",X"01",X"00",X"01",X"00", + X"0F",X"0F",X"0F",X"0E",X"1E",X"0C",X"00",X"00",X"40",X"00",X"10",X"00",X"30",X"80",X"20",X"21", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"08",X"08",X"00",X"08",X"00",X"00",X"50", + X"CF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0A",X"0B",X"0E", + X"1F",X"6F",X"CF",X"6F",X"CF",X"6F",X"FF",X"6F",X"7F",X"EF",X"0F",X"6F",X"FF",X"E5",X"F5",X"C7", + X"0F",X"1F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0A",X"0A",X"0F", + X"8F",X"6F",X"BF",X"FF",X"AF",X"AF",X"8F",X"AF",X"FF",X"0F",X"FF",X"FF",X"FF",X"F5",X"35",X"FF", + X"F4",X"C0",X"F1",X"E0",X"04",X"61",X"71",X"E8",X"F0",X"6A",X"C1",X"68",X"C2",X"62",X"10",X"60", + X"0E",X"05",X"0A",X"04",X"09",X"05",X"0A",X"0D",X"0E",X"04",X"0D",X"04",X"0D",X"0A",X"C9",X"0C", + X"3F",X"FF",X"FB",X"FF",X"FE",X"FF",X"FF",X"0F",X"8F",X"AF",X"A7",X"AF",X"BF",X"FD",X"8D",X"6F", + X"0D",X"0F",X"0F",X"0D",X"0F",X"0F",X"0B",X"0E",X"0E",X"0F",X"0F",X"0F",X"0E",X"0D",X"0E",X"1F", + X"00",X"00",X"00",X"00",X"08",X"01",X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"08",X"02",X"08", + X"B0",X"70",X"3E",X"51",X"12",X"10",X"10",X"90",X"F0",X"F9",X"30",X"F4",X"02",X"0B",X"05",X"02", + X"00",X"08",X"42",X"0D",X"00",X"09",X"00",X"04",X"05",X"0F",X"0B",X"0F",X"0D",X"0D",X"0E",X"07", + X"68",X"15",X"10",X"9A",X"82",X"1B",X"0C",X"11",X"03",X"1D",X"03",X"0B",X"06",X"87",X"0B",X"0F", + X"0F",X"0F",X"0F",X"0F",X"3F",X"FF",X"FF",X"FF",X"17",X"93",X"13",X"13",X"31",X"50",X"B0",X"70", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"06",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"87",X"03",X"03",X"01",X"10",X"00",X"10",X"80",X"10",X"10",X"90",X"60",X"10", + X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"41",X"02",X"01",X"00", + X"FE",X"CB",X"EA",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"EF",X"0F", + X"07",X"05",X"C5",X"4F",X"CF",X"6F",X"FF",X"7F",X"FF",X"FF",X"FF",X"7F",X"8F",X"7F",X"FF",X"EF", + X"0F",X"FA",X"0A",X"3F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"3F", + X"9F",X"05",X"B5",X"FF",X"AF",X"AF",X"8F",X"AF",X"9F",X"2F",X"8F",X"4F",X"EF",X"1F",X"FF",X"FF", + X"F7",X"EF",X"8D",X"7B",X"FF",X"7F",X"FF",X"FD",X"FE",X"76",X"CD",X"6D",X"CF",X"4F",X"0D",X"0B", + X"EE",X"0F",X"0B",X"07",X"0E",X"0F",X"05",X"0F",X"07",X"0F",X"0F",X"06",X"EF",X"07",X"FE",X"CF", + X"FF",X"F7",X"EB",X"1B",X"8D",X"47",X"9B",X"2B",X"8F",X"A5",X"AF",X"AD",X"B7",X"FB",X"96",X"0F", + X"03",X"38",X"02",X"00",X"09",X"09",X"05",X"00",X"08",X"0B",X"00",X"00",X"00",X"31",X"03",X"F7", + X"00",X"70",X"00",X"03",X"07",X"0A",X"05",X"0B",X"07",X"0E",X"0A",X"07",X"CD",X"0F",X"87",X"0B", + X"F0",X"B0",X"F0",X"F0",X"C1",X"22",X"80",X"0E",X"02",X"00",X"0F",X"03",X"FD",X"FE",X"83",X"FF", + X"30",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"0D",X"04",X"0B",X"07",X"76",X"0F",X"3F", + X"10",X"D0",X"10",X"D0",X"10",X"B0",X"10",X"B0",X"10",X"F0",X"10",X"E1",X"10",X"F2",X"30",X"B1", + X"80",X"F0",X"F0",X"F0",X"09",X"05",X"0E",X"0B",X"8B",X"0F",X"CF",X"2F",X"F7",X"FE",X"FF",X"BF", + X"80",X"00",X"C0",X"00",X"08",X"00",X"0B",X"0D",X"07",X"07",X"0F",X"0F",X"0F",X"07",X"0F",X"73", + X"30",X"B0",X"10",X"F0",X"14",X"EA",X"1C",X"F7",X"1B",X"BF",X"1B",X"BF",X"17",X"DB",X"1F",X"DF", + X"00",X"30",X"08",X"74",X"09",X"0E",X"0D",X"0F",X"07",X"0E",X"0D",X"0F",X"0F",X"0B",X"3F",X"0F", + X"0F",X"0B",X"0B",X"0E",X"07",X"0B",X"0F",X"0E",X"0F",X"0F",X"07",X"0F",X"0D",X"0F",X"0F",X"0F", + X"1E",X"0B",X"DD",X"0B",X"F7",X"0D",X"D5",X"0B",X"1E",X"0F",X"FF",X"0F",X"0D",X"0E",X"07",X"0D", + X"0F",X"0E",X"07",X"0F",X"0B",X"0F",X"0F",X"0F",X"0F",X"0E",X"0F",X"0E",X"0F",X"0B",X"0B",X"0F", + X"7B",X"0F",X"5F",X"FB",X"1F",X"5F",X"C7",X"5D",X"FD",X"8F",X"1E",X"FF",X"0D",X"EB",X"0D",X"0F", + X"0F",X"0F",X"05",X"00",X"F1",X"01",X"13",X"01",X"D0",X"00",X"F0",X"01",X"D3",X"07",X"1F",X"0F", + X"0F",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0B", + X"0F",X"05",X"00",X"E0",X"10",X"F0",X"F0",X"80",X"C0",X"50",X"10",X"50",X"50",X"F6",X"7F",X"0F", + X"0E",X"0C",X"08",X"08",X"00",X"00",X"08",X"08",X"00",X"00",X"08",X"0C",X"08",X"0C",X"0E",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0B",X"01",X"00",X"00", + X"FF",X"7F",X"FF",X"FF",X"8F",X"5F",X"CF",X"1F",X"EF",X"1F",X"7F",X"7F",X"F3",X"C0",X"90",X"C0", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"00",X"00",X"00", + X"1F",X"AF",X"1F",X"BF",X"1F",X"9F",X"1F",X"9F",X"1F",X"CF",X"1F",X"EF",X"0F",X"FF",X"06",X"F0"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/burnin_rubber_prog.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/burnin_rubber_prog.vhd new file mode 100644 index 00000000..ba70502e --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/burnin_rubber_prog.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity burnin_rubber_prog is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of burnin_rubber_prog is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"2C",X"FF",X"C0",X"28",X"8A",X"28",X"98",X"28",X"B8",X"C5",X"02",X"F0",X"46",X"CD",X"01",X"10", + X"29",X"FF",X"49",X"E0",X"85",X"03",X"2A",X"2A",X"2A",X"2A",X"2A",X"85",X"01",X"40",X"E4",X"C0", + X"CD",X"04",X"10",X"29",X"FF",X"49",X"C0",X"F0",X"2A",X"85",X"04",X"40",X"E4",X"C0",X"CD",X"04", + X"10",X"29",X"FF",X"45",X"04",X"F0",X"1C",X"40",X"E4",X"C0",X"CD",X"04",X"10",X"29",X"FF",X"45", + X"04",X"F0",X"10",X"40",X"E4",X"C0",X"CD",X"04",X"10",X"29",X"FF",X"45",X"04",X"F0",X"04",X"C9", + X"FF",X"85",X"00",X"8D",X"00",X"10",X"68",X"C8",X"68",X"CA",X"68",X"20",X"28",X"8A",X"28",X"98", + X"28",X"C5",X"00",X"F0",X"40",X"CD",X"04",X"10",X"49",X"C0",X"45",X"04",X"F0",X"37",X"E6",X"06", + X"C9",X"02",X"8D",X"02",X"10",X"C4",X"01",X"C5",X"03",X"A9",X"80",X"F0",X"2E",X"C2",X"00",X"CD", + X"00",X"10",X"29",X"FF",X"49",X"0F",X"06",X"04",X"90",X"02",X"2A",X"2A",X"49",X"03",X"F0",X"3D", + X"E8",X"A9",X"01",X"F0",X"38",X"E8",X"A9",X"02",X"F0",X"2B",X"E8",X"C5",X"06",X"A9",X"02",X"D0", + X"1F",X"C9",X"00",X"85",X"00",X"68",X"C8",X"68",X"CA",X"68",X"60",X"C2",X"05",X"C5",X"04",X"A9", + X"40",X"F0",X"1A",X"E8",X"A9",X"80",X"F0",X"15",X"E8",X"A9",X"C0",X"F0",X"DE",X"2C",X"A1",X"C0", + X"A6",X"06",X"2C",X"CD",X"C0",X"C5",X"03",X"A9",X"60",X"B0",X"02",X"C2",X"04",X"C5",X"05",X"F8", + X"18",X"7D",X"EF",X"C0",X"B9",X"F7",X"C0",X"90",X"03",X"D9",X"F7",X"C0",X"85",X"05",X"B8",X"A6", + X"06",X"2C",X"A1",X"C0",X"C2",X"E7",X"C5",X"FF",X"C5",X"FF",X"EA",X"AA",X"B0",X"F8",X"60",X"01", + X"02",X"03",X"01",X"06",X"08",X"03",X"01",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"78", + X"B8",X"C2",X"FF",X"9A",X"C9",X"00",X"85",X"02",X"8D",X"01",X"10",X"8D",X"00",X"54",X"8D",X"00", + X"58",X"8D",X"02",X"10",X"8D",X"00",X"10",X"38",X"40",X"AF",X"C2",X"40",X"BA",X"C2",X"40",X"CE", + X"C2",X"40",X"11",X"C3",X"40",X"DE",X"C2",X"40",X"FE",X"E6",X"C9",X"FF",X"85",X"02",X"40",X"E5", + X"E1",X"40",X"BA",X"C2",X"40",X"AB",X"D4",X"40",X"77",X"DC",X"40",X"DE",X"C2",X"C2",X"18",X"40", + X"B2",X"C2",X"C2",X"00",X"40",X"C3",X"C2",X"40",X"5B",X"DB",X"AE",X"02",X"04",X"AE",X"22",X"04", + X"C9",X"00",X"85",X"09",X"C5",X"08",X"85",X"12",X"40",X"07",X"D9",X"C5",X"12",X"A9",X"02",X"90", + X"03",X"40",X"1D",X"D9",X"C2",X"31",X"C9",X"00",X"40",X"B2",X"C2",X"40",X"C3",X"C2",X"C9",X"00", + X"8D",X"00",X"54",X"C5",X"09",X"8D",X"01",X"10",X"40",X"B7",X"DC",X"40",X"11",X"C3",X"40",X"B1", + X"D3",X"40",X"16",X"DA",X"40",X"33",X"D5",X"40",X"F0",X"D5",X"C5",X"07",X"B0",X"42",X"40",X"8F", + X"EB",X"2C",X"2E",X"C1",X"C5",X"05",X"F0",X"37",X"C9",X"00",X"85",X"08",X"85",X"12",X"CD",X"04", + X"10",X"29",X"FF",X"49",X"18",X"F0",X"28",X"A9",X"08",X"F0",X"12",X"A9",X"10",X"B0",X"20",X"C5", + X"05",X"A9",X"02",X"90",X"1A",X"E6",X"08",X"40",X"7F",X"EA",X"40",X"FB",X"DB",X"E6",X"08",X"40", + X"75",X"EA",X"40",X"FB",X"DB",X"C9",X"01",X"85",X"07",X"C2",X"FF",X"9A",X"2C",X"31",X"C1",X"60", + X"40",X"82",X"C2",X"40",X"F5",X"D8",X"40",X"33",X"C3",X"40",X"1B",X"C8",X"40",X"D2",X"D2",X"40", + X"D0",X"C6",X"40",X"E1",X"C6",X"40",X"9E",X"CC",X"40",X"A6",X"CD",X"40",X"B2",X"CB",X"40",X"26", + X"C4",X"40",X"0F",X"DC",X"40",X"29",X"DC",X"40",X"33",X"DB",X"40",X"5B",X"DB",X"40",X"F7",X"DA", + X"40",X"BC",X"DA",X"40",X"50",X"DA",X"40",X"07",X"D9",X"C5",X"12",X"A9",X"02",X"90",X"03",X"40", + X"1D",X"D9",X"40",X"9E",X"C2",X"C5",X"33",X"49",X"80",X"F0",X"B5",X"C5",X"18",X"49",X"5F",X"85", + X"18",X"C2",X"60",X"C9",X"00",X"40",X"E1",X"C2",X"40",X"36",X"CC",X"40",X"05",X"DC",X"90",X"17", + X"40",X"CB",X"DC",X"C5",X"08",X"A9",X"02",X"D0",X"03",X"2C",X"64",X"C1",X"E6",X"09",X"C5",X"09", + X"49",X"01",X"85",X"09",X"2C",X"64",X"C1",X"40",X"CB",X"DC",X"40",X"E1",X"DC",X"C9",X"00",X"8D", + X"00",X"54",X"40",X"3D",X"DA",X"A6",X"08",X"B0",X"E3",X"C9",X"00",X"85",X"12",X"CD",X"01",X"10", + X"29",X"FF",X"49",X"08",X"F0",X"03",X"40",X"C3",X"E8",X"C9",X"00",X"8D",X"01",X"10",X"85",X"09", + X"85",X"07",X"C9",X"00",X"8D",X"02",X"10",X"C2",X"02",X"40",X"A6",X"DC",X"2C",X"2E",X"C1",X"2C", + X"31",X"C1",X"CD",X"00",X"10",X"10",X"FB",X"40",X"D7",X"D4",X"40",X"19",X"D6",X"40",X"36",X"CC", + X"40",X"5D",X"D4",X"E6",X"30",X"CD",X"00",X"10",X"50",X"FB",X"40",X"18",X"EB",X"60",X"C5",X"33", + X"49",X"40",X"F0",X"0A",X"C5",X"30",X"A9",X"80",X"90",X"04",X"C9",X"80",X"85",X"33",X"60",X"C9", + X"00",X"CA",X"95",X"00",X"E8",X"E0",X"F1",X"B0",X"F9",X"60",X"C9",X"00",X"CA",X"9D",X"00",X"04", + X"E8",X"B0",X"FA",X"CA",X"9D",X"00",X"03",X"9D",X"00",X"02",X"E8",X"B0",X"F7",X"60",X"C9",X"00", + X"CA",X"9D",X"00",X"05",X"9D",X"00",X"06",X"9D",X"00",X"07",X"E8",X"B0",X"F4",X"60",X"C9",X"00", + X"CA",X"9D",X"00",X"40",X"9D",X"00",X"44",X"E8",X"B0",X"F7",X"C9",X"00",X"9D",X"00",X"41",X"9D", + X"00",X"45",X"E8",X"B0",X"F7",X"9D",X"00",X"42",X"9D",X"00",X"46",X"9D",X"00",X"43",X"9D",X"00", + X"47",X"E8",X"B0",X"F1",X"C0",X"00",X"C9",X"00",X"99",X"80",X"04",X"A8",X"A0",X"20",X"90",X"F8", + X"60",X"C2",X"07",X"DD",X"23",X"C3",X"9D",X"00",X"5C",X"DD",X"2B",X"C3",X"9D",X"08",X"5C",X"AA", + X"10",X"F1",X"60",X"FF",X"F8",X"FF",X"C0",X"3F",X"C7",X"E3",X"00",X"FF",X"C7",X"E1",X"93",X"49", + X"3F",X"7F",X"00",X"C5",X"33",X"49",X"C0",X"B0",X"26",X"C5",X"18",X"49",X"20",X"B0",X"06",X"40", + X"60",X"C3",X"40",X"92",X"C3",X"40",X"5B",X"C4",X"C2",X"40",X"40",X"1B",X"D4",X"40",X"D8",X"C4", + X"40",X"8C",X"CE",X"40",X"CC",X"C8",X"40",X"30",X"D4",X"40",X"A2",X"CA",X"40",X"99",X"C6",X"60", + X"C5",X"7A",X"B0",X"2D",X"C9",X"80",X"85",X"7A",X"C9",X"03",X"85",X"8E",X"C9",X"14",X"85",X"8F", + X"85",X"91",X"C9",X"80",X"85",X"7B",X"C9",X"00",X"85",X"39",X"40",X"7F",X"D4",X"A9",X"06",X"B0", + X"04",X"C9",X"38",X"85",X"7B",X"C9",X"E0",X"85",X"7C",X"C5",X"07",X"B0",X"04",X"C9",X"90",X"85", + X"7B",X"60",X"C5",X"7A",X"49",X"68",X"B0",X"51",X"C5",X"37",X"49",X"03",X"CA",X"C5",X"7B",X"18", + X"7D",X"EA",X"C3",X"85",X"7B",X"C5",X"7A",X"49",X"10",X"B0",X"1E",X"C5",X"37",X"49",X"04",X"F0", + X"03",X"40",X"FB",X"C3",X"C5",X"37",X"49",X"08",X"F0",X"0F",X"CA",X"C5",X"7C",X"18",X"7D",X"EA", + X"C3",X"A9",X"E0",X"90",X"02",X"C9",X"E0",X"85",X"7C",X"C5",X"7C",X"A9",X"70",X"D0",X"02",X"C9", + X"70",X"2A",X"2A",X"2A",X"2A",X"58",X"E9",X"07",X"CA",X"DD",X"F3",X"C3",X"85",X"CD",X"25",X"F0", + X"F0",X"07",X"C5",X"CD",X"85",X"F0",X"40",X"44",X"DA",X"60",X"00",X"02",X"FE",X"00",X"00",X"00", + X"00",X"00",X"02",X"12",X"11",X"10",X"0F",X"0E",X"0D",X"0C",X"0B",X"A6",X"8E",X"B0",X"26",X"C9", + X"03",X"85",X"8E",X"C5",X"7C",X"A9",X"7D",X"90",X"1C",X"A6",X"7C",X"C5",X"7C",X"A9",X"9A",X"50", + X"14",X"A6",X"7C",X"C5",X"7C",X"A9",X"B8",X"50",X"0C",X"A6",X"7C",X"C5",X"7C",X"A9",X"7C",X"D0", + X"04",X"C9",X"7C",X"85",X"7C",X"60",X"C5",X"33",X"49",X"C0",X"B0",X"2E",X"C5",X"18",X"49",X"A0", + X"B0",X"28",X"C5",X"2C",X"F0",X"04",X"49",X"10",X"F0",X"20",X"C5",X"7A",X"49",X"10",X"F0",X"06", + X"C5",X"80",X"A9",X"10",X"D0",X"14",X"C9",X"03",X"85",X"96",X"C9",X"E0",X"58",X"E5",X"7C",X"A9", + X"0A",X"90",X"07",X"E6",X"96",X"58",X"E9",X"14",X"D0",X"F9",X"60",X"C5",X"7A",X"49",X"FB",X"85", + X"7A",X"49",X"48",X"B0",X"32",X"C9",X"2C",X"85",X"7F",X"C5",X"7A",X"49",X"10",X"B0",X"1D",X"25", + X"37",X"49",X"10",X"F0",X"22",X"C5",X"18",X"49",X"20",X"B0",X"1C",X"C5",X"90",X"F0",X"18",X"C9", + X"90",X"85",X"7A",X"C9",X"3F",X"85",X"80",X"C9",X"03",X"40",X"44",X"DA",X"A6",X"80",X"40",X"B6", + X"C4",X"40",X"98",X"C4",X"40",X"A1",X"C4",X"60",X"C5",X"80",X"A9",X"2F",X"90",X"02",X"A6",X"7C", + X"60",X"C5",X"80",X"A9",X"20",X"D0",X"0E",X"A9",X"10",X"D0",X"08",X"C5",X"80",X"B0",X"04",X"C9", + X"84",X"85",X"7A",X"E6",X"7C",X"60",X"C2",X"06",X"C5",X"80",X"A9",X"08",X"B0",X"05",X"C9",X"04", + X"40",X"44",X"DA",X"58",X"E9",X"08",X"90",X"05",X"AA",X"A9",X"08",X"D0",X"F7",X"C9",X"29",X"18", + X"69",X"04",X"AA",X"10",X"FA",X"85",X"7F",X"60",X"C5",X"97",X"49",X"58",X"B0",X"34",X"C2",X"06", + X"8A",X"28",X"C5",X"98",X"18",X"7D",X"77",X"C5",X"10",X"02",X"29",X"0F",X"85",X"38",X"C5",X"99", + X"18",X"7D",X"78",X"C5",X"85",X"39",X"40",X"87",X"C5",X"40",X"3A",X"C6",X"68",X"CA",X"C5",X"18", + X"50",X"10",X"AA",X"AA",X"10",X"DA",X"40",X"0A",X"CD",X"C5",X"97",X"49",X"02",X"F0",X"03",X"40", + X"73",X"C6",X"60",X"C5",X"97",X"49",X"40",X"B0",X"5D",X"C9",X"00",X"85",X"D4",X"C0",X"06",X"C5", + X"98",X"18",X"79",X"7F",X"C5",X"10",X"02",X"29",X"0F",X"85",X"38",X"C5",X"99",X"18",X"79",X"80", + X"C5",X"85",X"39",X"40",X"87",X"C5",X"C5",X"8C",X"A9",X"05",X"B0",X"06",X"C5",X"8D",X"A9",X"07", + X"F0",X"09",X"C5",X"8D",X"A9",X"01",X"F0",X"03",X"58",X"D0",X"01",X"18",X"46",X"D4",X"88",X"88", + X"10",X"CD",X"C5",X"D4",X"F0",X"20",X"85",X"9E",X"C5",X"97",X"49",X"20",X"F0",X"12",X"C9",X"41", + X"85",X"97",X"E6",X"21",X"C9",X"20",X"85",X"9D",X"C9",X"06",X"40",X"44",X"DA",X"2C",X"76",X"C5", + X"C5",X"97",X"09",X"08",X"85",X"97",X"60",X"FC",X"04",X"04",X"04",X"04",X"FC",X"FC",X"FC",X"F6", + X"0A",X"0A",X"0A",X"0A",X"F6",X"F6",X"F6",X"8A",X"28",X"98",X"28",X"C5",X"23",X"18",X"65",X"39", + X"49",X"F0",X"85",X"CD",X"40",X"7F",X"D4",X"85",X"CE",X"C5",X"38",X"2A",X"2A",X"2A",X"2A",X"2A", + X"26",X"CD",X"18",X"65",X"CD",X"C8",X"26",X"CE",X"C9",X"9D",X"90",X"03",X"18",X"69",X"80",X"85", + X"D5",X"C9",X"EE",X"65",X"CE",X"85",X"D6",X"C5",X"38",X"49",X"10",X"08",X"D1",X"D5",X"48",X"B0", + X"04",X"2A",X"2A",X"2A",X"2A",X"49",X"0F",X"85",X"8C",X"C9",X"40",X"85",X"C9",X"C5",X"8C",X"85", + X"C7",X"40",X"3B",X"D4",X"C9",X"00",X"18",X"65",X"CB",X"85",X"D5",X"C9",X"F7",X"65",X"CC",X"85", + X"D6",X"C5",X"39",X"49",X"0C",X"0A",X"0A",X"18",X"65",X"D5",X"85",X"D5",X"C5",X"38",X"49",X"0F", + X"C8",X"C5",X"39",X"49",X"03",X"CA",X"C9",X"00",X"85",X"8D",X"D1",X"D5",X"5D",X"32",X"C6",X"F0", + X"04",X"C9",X"01",X"85",X"8D",X"C5",X"D6",X"18",X"69",X"04",X"85",X"D6",X"D1",X"D5",X"5D",X"32", + X"C6",X"F0",X"07",X"C5",X"8D",X"18",X"69",X"04",X"85",X"8D",X"8A",X"18",X"69",X"04",X"CA",X"D1", + X"D5",X"5D",X"32",X"C6",X"F0",X"07",X"C5",X"8D",X"18",X"69",X"02",X"85",X"8D",X"68",X"C8",X"68", + X"CA",X"60",X"01",X"02",X"04",X"08",X"10",X"20",X"40",X"80",X"C5",X"8C",X"C6",X"8D",X"E0",X"01", + X"F0",X"56",X"E0",X"07",X"B0",X"08",X"A9",X"05",X"F0",X"4E",X"A9",X"09",X"F0",X"4A",X"A9",X"06", + X"90",X"21",X"A9",X"0E",X"D0",X"1D",X"A9",X"08",X"F0",X"19",X"A9",X"09",X"F0",X"15",X"E0",X"06", + X"F0",X"04",X"E0",X"05",X"B0",X"32",X"C9",X"08",X"85",X"97",X"C2",X"01",X"40",X"A6",X"DC",X"C9", + X"05",X"B0",X"0B",X"C9",X"40",X"85",X"97",X"C2",X"01",X"40",X"A6",X"DC",X"C9",X"01",X"40",X"44", + X"DA",X"C2",X"01",X"40",X"A6",X"DC",X"C9",X"20",X"85",X"9D",X"C5",X"18",X"09",X"80",X"85",X"18", + X"C5",X"38",X"85",X"29",X"C5",X"39",X"85",X"2A",X"60",X"C5",X"7A",X"49",X"48",X"F0",X"28",X"28", + X"A6",X"80",X"B0",X"0C",X"C5",X"33",X"09",X"40",X"85",X"33",X"C9",X"00",X"85",X"7A",X"85",X"30", + X"C5",X"80",X"2A",X"2A",X"2A",X"49",X"03",X"CA",X"68",X"A9",X"08",X"B0",X"05",X"8A",X"18",X"69", + X"04",X"CA",X"DD",X"C8",X"C6",X"85",X"7F",X"60",X"66",X"62",X"5E",X"5A",X"76",X"72",X"6E",X"6A", + X"C5",X"36",X"49",X"20",X"B0",X"06",X"C5",X"7A",X"49",X"48",X"F0",X"04",X"C9",X"00",X"85",X"96", + X"60",X"40",X"EE",X"C6",X"40",X"2B",X"C7",X"40",X"68",X"C7",X"40",X"8F",X"C7",X"60",X"C5",X"18", + X"49",X"A0",X"B0",X"36",X"C5",X"96",X"F0",X"32",X"C5",X"7A",X"F0",X"2E",X"49",X"10",X"F0",X"06", + X"C5",X"80",X"A9",X"10",X"D0",X"23",X"C9",X"20",X"85",X"8F",X"C9",X"00",X"85",X"90",X"C9",X"E0", + X"58",X"E5",X"7C",X"85",X"CD",X"F0",X"12",X"F8",X"C5",X"8F",X"18",X"69",X"02",X"85",X"8F",X"C5", + X"90",X"69",X"00",X"85",X"90",X"A6",X"CD",X"B0",X"EF",X"B8",X"60",X"C2",X"04",X"40",X"17",X"DB", + X"C9",X"5D",X"85",X"CF",X"C0",X"02",X"C5",X"18",X"49",X"A0",X"B0",X"24",X"C5",X"2C",X"F0",X"04", + X"49",X"10",X"F0",X"1C",X"C0",X"00",X"C5",X"90",X"B0",X"02",X"C9",X"0A",X"18",X"65",X"CF",X"91", + X"DD",X"E6",X"DD",X"C2",X"8F",X"40",X"7D",X"DB",X"A6",X"DD",X"A6",X"DD",X"D1",X"DD",X"B0",X"07", + X"C9",X"5D",X"91",X"DD",X"88",X"10",X"F9",X"60",X"C0",X"00",X"C9",X"67",X"85",X"CD",X"C5",X"90", + X"F0",X"0A",X"C5",X"30",X"49",X"04",X"F0",X"04",X"C9",X"01",X"85",X"CD",X"C5",X"CD",X"99",X"82", + X"40",X"C5",X"CD",X"A9",X"67",X"F0",X"02",X"E6",X"CD",X"A8",X"A0",X"08",X"90",X"EE",X"60",X"E6", + X"E3",X"C4",X"24",X"C2",X"01",X"C5",X"7C",X"85",X"39",X"40",X"81",X"D4",X"85",X"8C",X"A9",X"0F", + X"F0",X"07",X"40",X"D7",X"D5",X"C5",X"D4",X"F0",X"0A",X"C9",X"00",X"85",X"39",X"88",X"AA",X"10", + X"E4",X"50",X"32",X"C5",X"E3",X"49",X"08",X"F0",X"2C",X"C5",X"E8",X"F0",X"0B",X"C5",X"7A",X"49", + X"10",X"B0",X"05",X"C9",X"09",X"40",X"44",X"DA",X"C0",X"00",X"84",X"E8",X"C2",X"00",X"DD",X"03", + X"C8",X"85",X"CE",X"E8",X"DD",X"03",X"C8",X"85",X"CD",X"E8",X"DD",X"03",X"C8",X"91",X"CD",X"E8", + X"E0",X"18",X"B0",X"EA",X"60",X"C9",X"55",X"85",X"E8",X"C0",X"00",X"C2",X"00",X"DD",X"03",X"C8", + X"85",X"CE",X"E8",X"DD",X"03",X"C8",X"85",X"CD",X"E8",X"C9",X"00",X"91",X"CD",X"E8",X"E0",X"18", + X"B0",X"EB",X"60",X"44",X"AF",X"01",X"44",X"B0",X"01",X"44",X"CF",X"01",X"44",X"D0",X"01",X"40", + X"AF",X"F0",X"40",X"B0",X"F1",X"40",X"CF",X"F2",X"40",X"D0",X"F3",X"C5",X"18",X"49",X"20",X"B0", + X"51",X"C5",X"35",X"50",X"39",X"C2",X"00",X"86",X"E9",X"D5",X"3A",X"B0",X"03",X"40",X"56",X"C9", + X"D5",X"3A",X"F0",X"20",X"D5",X"44",X"0A",X"C8",X"D9",X"73",X"C8",X"85",X"D9",X"D9",X"74",X"C8", + X"85",X"DA",X"C9",X"C8",X"28",X"C9",X"50",X"28",X"40",X"1B",X"D4",X"40",X"13",X"C5",X"6C",X"D9", + X"00",X"40",X"30",X"D4",X"C5",X"E9",X"18",X"69",X"10",X"CA",X"A9",X"40",X"90",X"C9",X"C5",X"35", + X"49",X"40",X"F0",X"0E",X"C5",X"3A",X"05",X"4A",X"05",X"5A",X"05",X"6A",X"B0",X"04",X"C9",X"80", + X"85",X"35",X"60",X"87",X"C8",X"97",X"C8",X"97",X"C8",X"97",X"C8",X"87",X"C8",X"A0",X"C8",X"A9", + X"C8",X"B2",X"C8",X"87",X"C8",X"87",X"C8",X"40",X"BB",X"C8",X"40",X"7E",X"D0",X"40",X"DA",X"C8", + X"40",X"83",X"CD",X"40",X"3A",X"C9",X"60",X"40",X"BB",X"C8",X"40",X"1B",X"CF",X"2C",X"8D",X"C8", + X"40",X"BB",X"C8",X"40",X"86",X"CF",X"2C",X"8D",X"C8",X"40",X"45",X"CD",X"40",X"AC",X"CF",X"2C", + X"8D",X"C8",X"40",X"E7",X"CF",X"40",X"42",X"CC",X"2C",X"90",X"C8",X"40",X"04",X"CD",X"C5",X"97", + X"49",X"02",X"F0",X"07",X"C9",X"40",X"85",X"97",X"40",X"64",X"C5",X"60",X"C5",X"97",X"49",X"20", + X"F0",X"63",X"C0",X"00",X"C5",X"99",X"A9",X"7E",X"90",X"45",X"C5",X"97",X"49",X"20",X"F0",X"55", + X"C0",X"00",X"C5",X"99",X"A9",X"DE",X"D0",X"37",X"A9",X"40",X"90",X"33",X"C0",X"01",X"C5",X"9E", + X"2A",X"2A",X"49",X"03",X"CA",X"DD",X"36",X"C9",X"85",X"CD",X"C5",X"A1",X"A9",X"05",X"F0",X"04", + X"A9",X"06",X"B0",X"0F",X"C5",X"9D",X"2A",X"C5",X"CD",X"90",X"08",X"29",X"FF",X"10",X"02",X"09", + X"02",X"85",X"CD",X"C5",X"CD",X"18",X"79",X"98",X"00",X"99",X"98",X"00",X"88",X"50",X"08",X"C5", + X"9E",X"49",X"03",X"CA",X"2C",X"F5",X"C8",X"A6",X"9D",X"B0",X"0A",X"C5",X"97",X"49",X"DF",X"85", + X"97",X"C9",X"00",X"85",X"9E",X"60",X"FE",X"FE",X"02",X"02",X"C5",X"97",X"49",X"40",X"F0",X"15", + X"A6",X"9D",X"B0",X"03",X"40",X"F9",X"D1",X"C5",X"9D",X"2A",X"2A",X"2A",X"85",X"CD",X"C9",X"59", + X"58",X"E5",X"CD",X"85",X"9C",X"60",X"C5",X"18",X"50",X"1C",X"C5",X"35",X"49",X"C0",X"B0",X"16", + X"8A",X"18",X"69",X"3A",X"85",X"D9",X"C9",X"00",X"85",X"DA",X"C0",X"0F",X"C9",X"00",X"91",X"D9", + X"88",X"10",X"FB",X"40",X"04",X"CA",X"60",X"01",X"02",X"06",X"02",X"02",X"09",X"06",X"02",X"09", + X"06",X"02",X"02",X"03",X"02",X"05",X"06",X"07",X"09",X"05",X"02",X"09",X"07",X"02",X"06",X"09", + X"06",X"01",X"01",X"02",X"08",X"03",X"09",X"02",X"01",X"02",X"08",X"02",X"09",X"03",X"09",X"02", + X"01",X"08",X"09",X"09",X"09",X"02",X"06",X"07",X"02",X"09",X"03",X"04",X"06",X"07",X"07",X"07", + X"02",X"09",X"06",X"04",X"04",X"07",X"02",X"09",X"09",X"03",X"04",X"05",X"08",X"07",X"07",X"01", + X"02",X"04",X"04",X"08",X"03",X"09",X"06",X"01",X"01",X"02",X"02",X"04",X"04",X"06",X"09",X"08", + X"03",X"04",X"02",X"04",X"08",X"09",X"01",X"02",X"04",X"04",X"01",X"04",X"04",X"07",X"01",X"08", + X"04",X"04",X"05",X"09",X"02",X"07",X"01",X"08",X"04",X"05",X"04",X"09",X"02",X"07",X"04",X"04", + X"04",X"05",X"01",X"07",X"04",X"04",X"05",X"07",X"02",X"04",X"01",X"07",X"08",X"09",X"05",X"01", + X"07",X"06",X"05",X"07",X"C9",X"00",X"85",X"92",X"C5",X"18",X"49",X"40",X"B0",X"06",X"C5",X"22", + X"A9",X"06",X"90",X"1E",X"8A",X"B0",X"1B",X"85",X"39",X"40",X"7F",X"D4",X"A9",X"04",X"90",X"12", + X"A9",X"07",X"90",X"08",X"A9",X"0B",X"F0",X"04",X"A9",X"0E",X"90",X"06",X"E6",X"92",X"C9",X"30", + X"B0",X"0E",X"C5",X"17",X"A9",X"C0",X"90",X"02",X"C9",X"C0",X"A9",X"40",X"D0",X"02",X"C9",X"80", + X"85",X"98",X"C9",X"08",X"85",X"99",X"C9",X"00",X"85",X"97",X"85",X"9E",X"40",X"13",X"C5",X"C5", + X"9E",X"B0",X"44",X"C9",X"80",X"95",X"3A",X"C5",X"98",X"95",X"3B",X"C5",X"99",X"95",X"3C",X"C5", + X"92",X"F0",X"0A",X"C5",X"17",X"49",X"03",X"C8",X"D9",X"00",X"CA",X"10",X"22",X"C5",X"90",X"F0", + X"0E",X"C5",X"35",X"49",X"20",X"B0",X"08",X"09",X"20",X"85",X"35",X"C9",X"00",X"F0",X"10",X"C4", + X"1F",X"E6",X"1F",X"A0",X"88",X"90",X"05",X"C9",X"2E",X"85",X"1F",X"C8",X"D9",X"77",X"C9",X"95", + X"44",X"C8",X"D9",X"98",X"CA",X"95",X"3F",X"60",X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"50", + X"54",X"55",X"C5",X"18",X"49",X"20",X"B0",X"0A",X"C9",X"40",X"85",X"E9",X"C5",X"7A",X"49",X"58", + X"F0",X"01",X"60",X"C9",X"00",X"85",X"CD",X"CA",X"8A",X"28",X"E4",X"E9",X"F0",X"3B",X"C9",X"00", + X"85",X"CF",X"D5",X"3A",X"F0",X"33",X"49",X"40",X"B0",X"2F",X"D5",X"3B",X"85",X"92",X"D5",X"3C", + X"85",X"93",X"D5",X"44",X"A9",X"06",X"90",X"0A",X"C9",X"0E",X"85",X"94",X"C9",X"10",X"85",X"95", + X"B0",X"14",X"A9",X"09",X"90",X"0A",X"C9",X"0E",X"85",X"94",X"C9",X"0C",X"85",X"95",X"B0",X"06", + X"C9",X"10",X"85",X"94",X"85",X"95",X"40",X"3F",X"CB",X"68",X"CA",X"C5",X"CF",X"F0",X"2C",X"95", + X"41",X"C9",X"A0",X"85",X"CE",X"D4",X"44",X"D9",X"35",X"CB",X"95",X"40",X"F0",X"06",X"C5",X"7A", + X"49",X"04",X"F0",X"0E",X"C9",X"41",X"85",X"CE",X"C9",X"20",X"95",X"40",X"E6",X"21",X"C9",X"06", + X"B0",X"02",X"C9",X"07",X"40",X"44",X"DA",X"C5",X"CE",X"95",X"3A",X"8A",X"18",X"69",X"10",X"CA", + X"A9",X"40",X"90",X"84",X"60",X"10",X"10",X"10",X"10",X"10",X"08",X"08",X"00",X"10",X"10",X"C5", + X"7B",X"58",X"E5",X"92",X"CA",X"10",X"11",X"29",X"FF",X"CA",X"C5",X"CD",X"09",X"01",X"85",X"CD", + X"C5",X"CF",X"09",X"02",X"85",X"CF",X"B0",X"0C",X"C5",X"CD",X"09",X"02",X"85",X"CD",X"C5",X"CF", + X"09",X"01",X"85",X"CF",X"E0",X"10",X"50",X"02",X"10",X"41",X"C5",X"7C",X"58",X"E5",X"93",X"C8", + X"10",X"11",X"29",X"FF",X"C8",X"C5",X"CD",X"09",X"04",X"85",X"CD",X"C5",X"CF",X"09",X"08",X"85", + X"CF",X"B0",X"0C",X"C5",X"CD",X"09",X"08",X"85",X"CD",X"C5",X"CF",X"09",X"04",X"85",X"CF",X"A0", + X"10",X"10",X"18",X"E4",X"94",X"10",X"14",X"A4",X"95",X"10",X"10",X"C5",X"7A",X"09",X"20",X"85", + X"7A",X"C5",X"CD",X"85",X"81",X"C9",X"10",X"85",X"80",X"B0",X"89",X"C9",X"00",X"85",X"CF",X"85", + X"CD",X"60",X"C2",X"00",X"C0",X"00",X"D5",X"3A",X"F0",X"2D",X"49",X"60",X"F0",X"04",X"C9",X"00", + X"F0",X"03",X"C5",X"30",X"2A",X"58",X"4A",X"49",X"03",X"99",X"80",X"04",X"D5",X"3F",X"99",X"81", + X"04",X"D5",X"3B",X"18",X"69",X"08",X"29",X"FF",X"99",X"82",X"04",X"D5",X"3C",X"58",X"E9",X"08", + X"99",X"83",X"04",X"A8",X"A8",X"A8",X"A8",X"8A",X"18",X"69",X"10",X"CA",X"A9",X"40",X"90",X"C6", + X"A9",X"50",X"D0",X"36",X"C5",X"7A",X"49",X"58",X"F0",X"BC",X"C2",X"00",X"C5",X"7F",X"85",X"CD", + X"C9",X"01",X"99",X"80",X"04",X"C5",X"CD",X"99",X"81",X"04",X"C5",X"7B",X"18",X"7D",X"2E",X"CC", + X"29",X"FF",X"99",X"82",X"04",X"E8",X"C5",X"7C",X"18",X"7D",X"2E",X"CC",X"99",X"83",X"04",X"E6", + X"CD",X"A8",X"A8",X"A8",X"A8",X"E8",X"E0",X"08",X"B0",X"D6",X"40",X"06",X"C3",X"60",X"00",X"F0", + X"10",X"F0",X"00",X"00",X"10",X"00",X"C0",X"20",X"D9",X"80",X"04",X"99",X"00",X"48",X"88",X"10", + X"F7",X"60",X"C5",X"97",X"49",X"10",X"F0",X"32",X"C9",X"80",X"85",X"97",X"C9",X"0A",X"40",X"44", + X"DA",X"C6",X"8B",X"F0",X"10",X"DD",X"FE",X"01",X"9D",X"00",X"02",X"DD",X"FF",X"01",X"9D",X"01", + X"02",X"AA",X"AA",X"B0",X"F0",X"C5",X"98",X"49",X"07",X"29",X"07",X"18",X"65",X"98",X"8D",X"00", + X"02",X"C5",X"99",X"8D",X"01",X"02",X"E6",X"8B",X"E6",X"8B",X"60",X"C0",X"00",X"C9",X"00",X"91", + X"DD",X"A8",X"91",X"DD",X"98",X"18",X"69",X"1F",X"C8",X"A0",X"A0",X"90",X"F0",X"8A",X"C8",X"A4", + X"8B",X"B0",X"01",X"60",X"D9",X"00",X"02",X"99",X"FE",X"01",X"A8",X"2C",X"8F",X"CC",X"C6",X"8B", + X"F0",X"59",X"DD",X"FE",X"01",X"F0",X"50",X"85",X"38",X"DD",X"FF",X"01",X"18",X"65",X"96",X"9D", + X"FF",X"01",X"58",X"E9",X"08",X"85",X"39",X"40",X"63",X"CD",X"C5",X"39",X"A9",X"E0",X"90",X"0A", + X"40",X"7B",X"CC",X"A6",X"8B",X"A6",X"8B",X"2C",X"F7",X"CC",X"49",X"07",X"C8",X"D9",X"FC",X"CC", + X"85",X"CD",X"C9",X"00",X"C8",X"91",X"DD",X"A8",X"91",X"DD",X"C0",X"20",X"91",X"DD",X"A8",X"91", + X"DD",X"98",X"18",X"69",X"1F",X"C8",X"C5",X"CD",X"91",X"DD",X"A8",X"E6",X"CD",X"C5",X"CD",X"91", + X"DD",X"E6",X"CD",X"A0",X"80",X"90",X"EA",X"AA",X"AA",X"B0",X"A7",X"60",X"80",X"86",X"8C",X"92", + X"98",X"9E",X"A4",X"AA",X"C5",X"97",X"49",X"40",X"B0",X"0B",X"C6",X"8B",X"F0",X"07",X"40",X"16", + X"CD",X"AA",X"AA",X"B0",X"F9",X"60",X"DD",X"FE",X"01",X"85",X"38",X"49",X"F8",X"18",X"69",X"08", + X"58",X"E5",X"98",X"D0",X"02",X"29",X"FF",X"A9",X"0C",X"D0",X"19",X"DD",X"FF",X"01",X"85",X"39", + X"18",X"69",X"08",X"58",X"E5",X"99",X"D0",X"02",X"29",X"FF",X"A9",X"0C",X"D0",X"06",X"C5",X"97", + X"09",X"02",X"85",X"97",X"60",X"C6",X"8B",X"F0",X"19",X"40",X"16",X"CD",X"C5",X"97",X"49",X"02", + X"F0",X"0C",X"40",X"63",X"CD",X"40",X"7B",X"CC",X"C5",X"97",X"49",X"FD",X"85",X"97",X"AA",X"AA", + X"B0",X"E7",X"60",X"C5",X"38",X"2A",X"2A",X"2A",X"85",X"CD",X"C9",X"00",X"85",X"CE",X"C5",X"39", + X"49",X"F8",X"0A",X"46",X"CE",X"0A",X"46",X"CE",X"05",X"CD",X"85",X"DD",X"C5",X"CE",X"09",X"40", + X"85",X"DE",X"60",X"C5",X"97",X"49",X"40",X"F0",X"1C",X"C5",X"99",X"A9",X"40",X"90",X"09",X"18", + X"65",X"96",X"85",X"99",X"A9",X"E8",X"90",X"0D",X"C5",X"A1",X"B0",X"06",X"C5",X"35",X"49",X"DF", + X"85",X"35",X"40",X"F9",X"D1",X"60",X"C2",X"00",X"D5",X"3A",X"2A",X"90",X"07",X"C9",X"40",X"95", + X"3A",X"40",X"CB",X"CD",X"8A",X"18",X"69",X"10",X"CA",X"A9",X"40",X"90",X"EB",X"C5",X"8A",X"F0", + X"09",X"40",X"4A",X"CE",X"40",X"1F",X"CE",X"40",X"78",X"CE",X"60",X"C4",X"8A",X"F0",X"1E",X"D9", + X"FC",X"02",X"99",X"00",X"03",X"D9",X"FD",X"02",X"99",X"01",X"03",X"D9",X"FE",X"02",X"99",X"02", + X"03",X"D9",X"FF",X"02",X"99",X"03",X"03",X"88",X"88",X"88",X"88",X"B0",X"E2",X"D5",X"3B",X"8D", + X"00",X"03",X"D5",X"3C",X"18",X"69",X"10",X"8D",X"01",X"03",X"D4",X"44",X"D9",X"15",X"CE",X"8D", + X"02",X"03",X"58",X"E9",X"01",X"40",X"C5",X"DB",X"C9",X"20",X"8D",X"03",X"03",X"C5",X"8A",X"18", + X"69",X"04",X"85",X"8A",X"60",X"0D",X"0A",X"0A",X"0A",X"0D",X"0A",X"07",X"0A",X"07",X"07",X"C4", + X"8A",X"D9",X"FF",X"02",X"B0",X"23",X"D9",X"FC",X"02",X"85",X"38",X"D9",X"FD",X"02",X"85",X"39", + X"C9",X"00",X"28",X"99",X"FE",X"02",X"40",X"63",X"CD",X"68",X"C8",X"91",X"DD",X"A8",X"91",X"DD", + X"C5",X"8A",X"58",X"E9",X"04",X"85",X"8A",X"B0",X"D6",X"60",X"C4",X"8A",X"98",X"F0",X"28",X"28", + X"D9",X"FC",X"02",X"85",X"38",X"D9",X"FD",X"02",X"85",X"39",X"40",X"63",X"CD",X"D9",X"FE",X"02", + X"C8",X"D9",X"DF",X"DB",X"18",X"69",X"75",X"C0",X"00",X"91",X"DD",X"A8",X"C9",X"74",X"91",X"DD", + X"68",X"58",X"E9",X"04",X"C8",X"B0",X"D5",X"60",X"C4",X"8A",X"F0",X"0F",X"D9",X"FF",X"02",X"58", + X"E9",X"01",X"99",X"FF",X"02",X"88",X"88",X"88",X"88",X"B0",X"F1",X"60",X"C5",X"97",X"49",X"4C", + X"F0",X"58",X"49",X"48",X"B0",X"54",X"C5",X"99",X"85",X"39",X"18",X"65",X"23",X"85",X"CE",X"40", + X"7F",X"D4",X"85",X"CD",X"A9",X"0B",X"F0",X"04",X"A9",X"0E",X"B0",X"0C",X"C5",X"98",X"A9",X"60", + X"90",X"38",X"C5",X"CE",X"A9",X"60",X"D0",X"16",X"C5",X"CD",X"A9",X"0C",X"B0",X"2C",X"C4",X"24", + X"A8",X"C5",X"CE",X"50",X"02",X"88",X"88",X"40",X"81",X"D4",X"A9",X"0C",X"B0",X"1C",X"C9",X"20", + X"85",X"EF",X"C5",X"98",X"85",X"38",X"C5",X"99",X"85",X"39",X"40",X"63",X"CD",X"C5",X"DD",X"85", + X"ED",X"C5",X"DE",X"85",X"EE",X"C9",X"0F",X"40",X"C5",X"DB",X"C5",X"EF",X"F0",X"24",X"C2",X"02", + X"DD",X"EE",X"DB",X"95",X"F1",X"AA",X"10",X"F8",X"C5",X"ED",X"85",X"DD",X"C5",X"EE",X"85",X"DE", + X"C0",X"05",X"C9",X"00",X"91",X"DD",X"88",X"10",X"FB",X"A6",X"EF",X"F0",X"05",X"C2",X"F3",X"40", + X"71",X"DB",X"60",X"04",X"04",X"04",X"05",X"07",X"04",X"05",X"04",X"40",X"46",X"D2",X"50",X"54", + X"C5",X"A3",X"B0",X"20",X"C5",X"9D",X"B0",X"1C",X"C5",X"96",X"2A",X"85",X"CE",X"C5",X"17",X"49", + X"01",X"18",X"65",X"CE",X"CA",X"DD",X"13",X"CF",X"85",X"9F",X"C2",X"01",X"C5",X"98",X"10",X"02", + X"C2",X"FF",X"86",X"A3",X"E6",X"9D",X"58",X"C5",X"96",X"E5",X"9F",X"85",X"CE",X"D0",X"19",X"C5", + X"CE",X"29",X"FF",X"18",X"69",X"01",X"85",X"CE",X"58",X"C5",X"99",X"CA",X"E5",X"CE",X"85",X"99", + X"8A",X"F0",X"1B",X"D0",X"19",X"2C",X"F6",X"D1",X"18",X"C5",X"99",X"65",X"CE",X"85",X"99",X"90", + X"0D",X"2C",X"F6",X"D1",X"C5",X"A3",X"29",X"FF",X"18",X"69",X"01",X"85",X"A3",X"60",X"18",X"C5", + X"98",X"65",X"A3",X"85",X"98",X"60",X"40",X"46",X"D2",X"50",X"14",X"E6",X"9D",X"40",X"E0",X"D1", + X"C6",X"96",X"AA",X"AA",X"AA",X"8A",X"50",X"08",X"18",X"65",X"99",X"85",X"99",X"D0",X"0A",X"60", + X"C5",X"99",X"58",X"E9",X"03",X"85",X"99",X"D0",X"F6",X"2C",X"F6",X"D1",X"40",X"46",X"D2",X"50", + X"29",X"C5",X"9D",X"B0",X"0A",X"C2",X"01",X"C5",X"98",X"10",X"02",X"C2",X"FF",X"86",X"A4",X"E6", + X"9D",X"40",X"E0",X"D1",X"C6",X"96",X"AA",X"AA",X"AA",X"8A",X"50",X"0F",X"18",X"65",X"99",X"85", + X"99",X"D0",X"11",X"18",X"C5",X"98",X"65",X"A4",X"85",X"98",X"60",X"C5",X"99",X"58",X"E9",X"03", + X"85",X"99",X"D0",X"F6",X"2C",X"F6",X"D1",X"40",X"46",X"D2",X"50",X"38",X"C5",X"96",X"B0",X"0A", + X"C5",X"99",X"58",X"E9",X"03",X"85",X"99",X"90",X"EB",X"60",X"C5",X"A2",X"B0",X"09",X"C5",X"96", + X"85",X"9F",X"C5",X"17",X"2A",X"85",X"A2",X"E6",X"9D",X"40",X"A2",X"D1",X"C5",X"9C",X"A9",X"53", + X"F0",X"13",X"C5",X"99",X"A5",X"A2",X"90",X"08",X"E6",X"9C",X"C5",X"99",X"69",X"04",X"85",X"A2", + X"E6",X"99",X"F0",X"C0",X"60",X"A6",X"99",X"F0",X"BB",X"C5",X"07",X"F0",X"1B",X"CD",X"01",X"10", + X"49",X"10",X"F0",X"14",X"C5",X"22",X"49",X"07",X"A9",X"03",X"F0",X"E8",X"C5",X"18",X"49",X"40", + X"B0",X"06",X"C5",X"22",X"A9",X"01",X"90",X"28",X"C5",X"99",X"A5",X"A2",X"D0",X"D6",X"C5",X"97", + X"09",X"10",X"85",X"97",X"C2",X"FF",X"C5",X"18",X"49",X"40",X"F0",X"09",X"C5",X"22",X"49",X"07", + X"CA",X"DD",X"76",X"D0",X"CA",X"86",X"CD",X"C5",X"99",X"58",X"E5",X"CD",X"90",X"03",X"85",X"A2", + X"60",X"C9",X"01",X"85",X"A2",X"60",X"3E",X"32",X"30",X"2A",X"21",X"1B",X"14",X"0D",X"40",X"46", + X"D2",X"50",X"20",X"C5",X"96",X"A9",X"05",X"D0",X"03",X"2C",X"20",X"CF",X"C5",X"A6",X"F0",X"1E", + X"C5",X"9D",X"F0",X"1A",X"A6",X"9D",X"18",X"C9",X"7E",X"65",X"A6",X"CA",X"C9",X"D0",X"69",X"00", + X"28",X"8A",X"28",X"60",X"73",X"00",X"00",X"00",X"79",X"00",X"00",X"00",X"9E",X"AF",X"C5",X"96", + X"85",X"9F",X"C5",X"19",X"2A",X"2A",X"2A",X"85",X"CE",X"C6",X"A1",X"DD",X"A4",X"D0",X"58",X"E5", + X"CE",X"85",X"9D",X"C5",X"18",X"49",X"40",X"F0",X"0D",X"C5",X"22",X"49",X"0F",X"0A",X"85",X"CE", + X"C5",X"9D",X"E5",X"CE",X"85",X"9D",X"C5",X"7C",X"A5",X"99",X"90",X"35",X"E9",X"08",X"A5",X"99", + X"90",X"26",X"E9",X"15",X"A5",X"99",X"90",X"0E",X"40",X"A2",X"D1",X"C9",X"69",X"85",X"A6",X"E6", + X"99",X"B0",X"48",X"2C",X"F6",X"D1",X"40",X"A2",X"D1",X"C5",X"9D",X"2A",X"D0",X"04",X"E6",X"99", + X"F0",X"F1",X"C9",X"77",X"85",X"A6",X"B0",X"33",X"40",X"A2",X"D1",X"C9",X"89",X"85",X"A6",X"B0", + X"2A",X"69",X"08",X"A5",X"99",X"D0",X"F1",X"69",X"15",X"A5",X"99",X"D0",X"0E",X"40",X"A2",X"D1", + X"C9",X"9E",X"85",X"A6",X"A6",X"99",X"B0",X"13",X"2C",X"F6",X"D1",X"40",X"A2",X"D1",X"C5",X"9D", + X"2A",X"D0",X"04",X"A6",X"99",X"F0",X"BC",X"C9",X"AC",X"85",X"A6",X"C5",X"A4",X"F0",X"14",X"C5", + X"A2",X"F0",X"10",X"A6",X"A2",X"18",X"C9",X"3B",X"65",X"A4",X"CA",X"C9",X"D1",X"69",X"00",X"28", + X"8A",X"28",X"60",X"C9",X"50",X"85",X"A2",X"C5",X"7B",X"A5",X"98",X"90",X"26",X"E9",X"08",X"A5", + X"98",X"90",X"1B",X"E9",X"15",X"A5",X"98",X"90",X"07",X"C9",X"2D",X"85",X"A4",X"E6",X"98",X"60", + X"C5",X"9D",X"2A",X"D0",X"02",X"E6",X"98",X"C9",X"34",X"85",X"A4",X"E6",X"98",X"60",X"C9",X"42", + X"85",X"A4",X"60",X"69",X"08",X"A5",X"98",X"D0",X"F5",X"69",X"15",X"A5",X"98",X"D0",X"07",X"C9", + X"53",X"85",X"A4",X"A6",X"98",X"60",X"C5",X"9D",X"2A",X"D0",X"02",X"A6",X"98",X"C9",X"5A",X"85", + X"A4",X"60",X"C2",X"04",X"CD",X"01",X"10",X"49",X"10",X"F0",X"02",X"C2",X"20",X"86",X"CE",X"C5", + X"9D",X"45",X"CE",X"A5",X"A0",X"85",X"A0",X"F0",X"04",X"C5",X"96",X"85",X"9F",X"C5",X"96",X"58", + X"E5",X"9F",X"85",X"CE",X"90",X"0A",X"18",X"C5",X"99",X"65",X"CE",X"85",X"99",X"D0",X"0D",X"60", + X"C5",X"CE",X"29",X"FF",X"18",X"69",X"01",X"85",X"CE",X"2C",X"C6",X"D1",X"2C",X"F6",X"D1",X"60", + X"58",X"C5",X"96",X"E9",X"03",X"B0",X"0E",X"C5",X"9D",X"2A",X"90",X"09",X"18",X"C5",X"99",X"69", + X"01",X"85",X"99",X"D0",X"01",X"60",X"C6",X"9A",X"9A",X"C9",X"00",X"C8",X"99",X"97",X"00",X"A8", + X"A0",X"10",X"B0",X"F8",X"60",X"C2",X"00",X"E0",X"40",X"B0",X"01",X"60",X"C0",X"00",X"C5",X"98", + X"58",X"F5",X"3B",X"D0",X"06",X"C0",X"80",X"29",X"FF",X"69",X"01",X"85",X"CD",X"C5",X"99",X"58", + X"F5",X"3C",X"D0",X"04",X"29",X"FF",X"69",X"01",X"28",X"8A",X"18",X"69",X"10",X"CA",X"68",X"18", + X"65",X"CD",X"F0",X"D3",X"D0",X"D1",X"A9",X"20",X"D0",X"CD",X"98",X"F0",X"04",X"A6",X"98",X"A6", + X"98",X"E6",X"98",X"2C",X"07",X"D2",X"DA",X"E8",X"E8",X"86",X"9A",X"C5",X"97",X"CA",X"49",X"40", + X"B0",X"23",X"8A",X"49",X"20",X"F0",X"22",X"C2",X"0F",X"D5",X"7A",X"28",X"D5",X"97",X"95",X"7A", + X"AA",X"10",X"F6",X"40",X"B3",X"CA",X"C2",X"00",X"C0",X"0F",X"D5",X"7A",X"95",X"97",X"68",X"95", + X"7A",X"E8",X"88",X"10",X"F5",X"C6",X"9A",X"9A",X"60",X"C5",X"97",X"49",X"08",X"B0",X"04",X"C9", + X"00",X"85",X"9E",X"C5",X"97",X"49",X"F7",X"85",X"97",X"C5",X"9E",X"49",X"0F",X"F0",X"3D",X"A9", + X"0F",X"F0",X"0D",X"A9",X"0C",X"90",X"0C",X"C5",X"99",X"18",X"65",X"96",X"85",X"99",X"90",X"11", + X"2C",X"F6",X"D1",X"C5",X"96",X"2A",X"85",X"CD",X"C5",X"99",X"18",X"65",X"CD",X"85",X"99",X"D0", + X"EF",X"C5",X"9E",X"49",X"06",X"F0",X"04",X"A6",X"98",X"A6",X"98",X"C5",X"9E",X"49",X"09",X"F0", + X"04",X"E6",X"98",X"E6",X"98",X"C9",X"00",X"85",X"9D",X"C9",X"80",X"60",X"40",X"05",X"D2",X"C9", + X"00",X"60",X"40",X"E7",X"D2",X"C5",X"18",X"50",X"0D",X"49",X"20",X"F0",X"09",X"40",X"20",X"D3", + X"40",X"52",X"D3",X"40",X"F2",X"D3",X"60",X"C5",X"19",X"49",X"3F",X"A9",X"3F",X"90",X"30",X"C5", + X"18",X"49",X"A0",X"B0",X"2A",X"C5",X"7A",X"49",X"68",X"B0",X"24",X"C9",X"80",X"85",X"7A",X"C9", + X"03",X"85",X"96",X"C5",X"18",X"09",X"20",X"85",X"18",X"C9",X"00",X"85",X"8F",X"85",X"90",X"C9", + X"13",X"85",X"F0",X"40",X"44",X"DA",X"C2",X"3F",X"C9",X"00",X"95",X"3A",X"AA",X"10",X"FB",X"60", + X"C5",X"7A",X"49",X"10",X"B0",X"2B",X"C2",X"00",X"C5",X"7C",X"F0",X"0D",X"A9",X"7C",X"F0",X"09", + X"E8",X"A6",X"7C",X"D0",X"04",X"E6",X"7C",X"E6",X"7C",X"C5",X"7B",X"A9",X"5C",X"F0",X"09",X"E8", + X"A6",X"7B",X"D0",X"04",X"E6",X"7B",X"E6",X"7B",X"8A",X"B0",X"06",X"C5",X"36",X"09",X"80",X"85", + X"36",X"60",X"C5",X"36",X"49",X"40",X"B0",X"33",X"C5",X"24",X"49",X"3F",X"B0",X"52",X"58",X"C9", + X"7C",X"E5",X"23",X"90",X"4B",X"85",X"4C",X"85",X"5C",X"C9",X"39",X"85",X"4B",X"C9",X"4C",X"85", + X"5B",X"C5",X"22",X"49",X"03",X"0A",X"18",X"69",X"7D",X"85",X"4F",X"85",X"5F",X"E6",X"5F",X"C9", + X"C0",X"85",X"4A",X"85",X"5A",X"C5",X"36",X"09",X"40",X"85",X"36",X"C5",X"36",X"49",X"20",X"B0", + X"1F",X"C5",X"4C",X"18",X"65",X"96",X"85",X"4C",X"85",X"5C",X"A9",X"7C",X"90",X"12",X"C9",X"7C", + X"85",X"4C",X"85",X"5C",X"E6",X"22",X"C5",X"36",X"09",X"20",X"85",X"36",X"C9",X"00",X"85",X"96", + X"60",X"C5",X"18",X"49",X"04",X"F0",X"1A",X"C5",X"22",X"49",X"03",X"0A",X"0A",X"0A",X"CA",X"C0", + X"07",X"DD",X"D2",X"D3",X"99",X"08",X"5C",X"E8",X"88",X"10",X"F6",X"C5",X"36",X"49",X"DF",X"85", + X"36",X"60",X"00",X"9B",X"7F",X"49",X"00",X"00",X"E2",X"FF",X"00",X"56",X"1C",X"49",X"DD",X"C7", + X"50",X"FF",X"00",X"DD",X"3F",X"49",X"41",X"83",X"E1",X"FF",X"00",X"2F",X"7F",X"49",X"FF",X"C0", + X"F0",X"FF",X"C5",X"36",X"A9",X"E0",X"B0",X"22",X"40",X"45",X"E7",X"C5",X"18",X"49",X"DF",X"85", + X"18",X"C5",X"36",X"49",X"20",X"85",X"36",X"C9",X"00",X"85",X"35",X"85",X"7A",X"85",X"4A",X"85", + X"5A",X"C5",X"18",X"09",X"04",X"85",X"18",X"40",X"B1",X"D3",X"60",X"8A",X"18",X"69",X"3A",X"85", + X"E1",X"C9",X"00",X"85",X"E2",X"C0",X"0F",X"D1",X"E1",X"99",X"97",X"00",X"88",X"10",X"F8",X"60", + X"C0",X"0F",X"D9",X"97",X"00",X"91",X"E1",X"88",X"10",X"F8",X"60",X"C9",X"00",X"85",X"CB",X"85", + X"CC",X"85",X"CA",X"26",X"C7",X"90",X"0D",X"18",X"C5",X"CB",X"65",X"C9",X"85",X"CB",X"C5",X"CC", + X"65",X"CA",X"85",X"CC",X"06",X"C9",X"46",X"CA",X"C5",X"C7",X"B0",X"E7",X"60",X"C0",X"04",X"E6", + X"13",X"E6",X"15",X"66",X"14",X"66",X"15",X"66",X"16",X"D0",X"06",X"C5",X"15",X"65",X"13",X"85", + X"15",X"88",X"B0",X"EF",X"C5",X"14",X"65",X"16",X"85",X"16",X"65",X"15",X"85",X"17",X"60",X"C4", + X"24",X"C5",X"25",X"85",X"28",X"C5",X"23",X"18",X"65",X"39",X"90",X"11",X"A8",X"C5",X"18",X"49", + X"40",X"F0",X"0A",X"C5",X"28",X"F0",X"06",X"A0",X"40",X"90",X"02",X"C0",X"3F",X"C9",X"F5",X"85", + X"A7",X"C9",X"D6",X"18",X"65",X"28",X"85",X"A8",X"D1",X"A7",X"60",X"C9",X"0C",X"8D",X"12",X"04", + X"8D",X"32",X"04",X"C9",X"00",X"8D",X"0B",X"04",X"8D",X"2B",X"04",X"C9",X"FF",X"8D",X"0C",X"04", + X"8D",X"2C",X"04",X"C9",X"01",X"8D",X"0D",X"04",X"8D",X"2D",X"04",X"C5",X"07",X"B0",X"07",X"85", + X"96",X"C9",X"7F",X"8D",X"0C",X"04",X"60",X"C5",X"2C",X"F0",X"04",X"49",X"10",X"F0",X"3E",X"C5", + X"23",X"58",X"E5",X"96",X"85",X"23",X"D0",X"35",X"A6",X"24",X"C5",X"24",X"A9",X"FF",X"B0",X"12", + X"C5",X"25",X"29",X"01",X"85",X"25",X"F0",X"0A",X"C9",X"3F",X"85",X"24",X"C5",X"18",X"09",X"40", + X"85",X"18",X"C5",X"24",X"28",X"29",X"FF",X"85",X"19",X"68",X"F0",X"11",X"49",X"3F",X"A9",X"04", + X"D0",X"06",X"C5",X"35",X"09",X"40",X"85",X"35",X"C9",X"00",X"40",X"C5",X"DB",X"60",X"E6",X"D5", + X"B0",X"02",X"E6",X"D6",X"E6",X"DF",X"B0",X"02",X"E6",X"E0",X"C5",X"31",X"B0",X"02",X"A6",X"32", + X"A6",X"31",X"60",X"C5",X"2B",X"49",X"F7",X"85",X"2B",X"C9",X"00",X"85",X"39",X"C9",X"02",X"85", + X"CD",X"C4",X"24",X"C5",X"23",X"18",X"65",X"2A",X"90",X"01",X"A8",X"84",X"24",X"84",X"D2",X"98", + X"49",X"3F",X"F0",X"69",X"A9",X"3F",X"F0",X"65",X"40",X"7F",X"D4",X"85",X"8C",X"40",X"D7",X"D5", + X"C4",X"D2",X"C5",X"D4",X"B0",X"20",X"C2",X"03",X"A6",X"CD",X"E6",X"D2",X"C4",X"D2",X"98",X"49", + X"3F",X"A9",X"3F",X"F0",X"48",X"40",X"81",X"D4",X"85",X"8C",X"40",X"D7",X"D5",X"C5",X"D4",X"F0", + X"E5",X"AA",X"B0",X"E4",X"F0",X"37",X"C9",X"FD",X"85",X"D3",X"C2",X"00",X"A6",X"D2",X"C4",X"D2", + X"98",X"49",X"3F",X"A9",X"3F",X"F0",X"26",X"40",X"81",X"D4",X"85",X"8C",X"40",X"D7",X"D5",X"E6", + X"D3",X"C5",X"D4",X"B0",X"08",X"C2",X"04",X"C9",X"05",X"85",X"CD",X"B0",X"BB",X"E8",X"E0",X"03", + X"90",X"DA",X"C5",X"D3",X"50",X"07",X"C5",X"CD",X"58",X"E5",X"D3",X"85",X"CD",X"C9",X"00",X"85", + X"23",X"85",X"26",X"C5",X"24",X"58",X"E5",X"CD",X"85",X"24",X"85",X"27",X"C9",X"03",X"85",X"96", + X"C5",X"07",X"B0",X"02",X"85",X"96",X"60",X"C9",X"00",X"85",X"D4",X"C5",X"8C",X"A9",X"04",X"F0", + X"0E",X"A9",X"0B",X"F0",X"0A",X"A9",X"0C",X"F0",X"06",X"A9",X"0E",X"D0",X"02",X"E6",X"D4",X"60", + X"C9",X"00",X"85",X"31",X"C9",X"02",X"85",X"32",X"E6",X"23",X"B0",X"02",X"E6",X"24",X"40",X"19", + X"D6",X"C5",X"31",X"B0",X"02",X"A6",X"32",X"A6",X"31",X"C5",X"32",X"05",X"31",X"B0",X"E9",X"C5", + X"2B",X"09",X"08",X"85",X"2B",X"8D",X"00",X"54",X"60",X"C5",X"25",X"85",X"28",X"58",X"C5",X"23", + X"E5",X"26",X"CA",X"F0",X"48",X"50",X"23",X"18",X"C5",X"26",X"69",X"80",X"85",X"D9",X"C5",X"27", + X"69",X"01",X"85",X"DA",X"90",X"06",X"C5",X"25",X"29",X"01",X"85",X"28",X"40",X"8B",X"D6",X"E6", + X"D9",X"B0",X"02",X"E6",X"DA",X"AA",X"B0",X"F4",X"F0",X"23",X"58",X"C5",X"26",X"E9",X"80",X"85", + X"D9",X"C5",X"27",X"E9",X"00",X"85",X"DA",X"D0",X"06",X"C5",X"25",X"29",X"01",X"85",X"28",X"40", + X"8B",X"D6",X"C5",X"D9",X"B0",X"02",X"A6",X"DA",X"A6",X"D9",X"E8",X"B0",X"F2",X"C5",X"24",X"85", + X"27",X"0A",X"49",X"02",X"09",X"01",X"85",X"CD",X"C5",X"2B",X"49",X"F8",X"05",X"CD",X"85",X"2B", + X"8D",X"00",X"54",X"C5",X"23",X"8D",X"00",X"58",X"85",X"26",X"60",X"C4",X"DA",X"40",X"9D",X"D4", + X"85",X"D6",X"C5",X"D9",X"26",X"D6",X"6A",X"18",X"69",X"9D",X"85",X"D5",X"C5",X"D6",X"69",X"EE", + X"85",X"D6",X"C5",X"D9",X"49",X"0F",X"C8",X"C5",X"D9",X"2A",X"49",X"78",X"18",X"19",X"E5",X"D6", + X"69",X"00",X"85",X"DF",X"C5",X"DA",X"49",X"01",X"69",X"F7",X"85",X"E0",X"C5",X"D9",X"2A",X"C0", + X"00",X"D1",X"D5",X"90",X"04",X"0A",X"0A",X"0A",X"0A",X"49",X"F0",X"85",X"CD",X"D1",X"DF",X"49", + X"0F",X"05",X"CD",X"28",X"58",X"C5",X"DF",X"E9",X"00",X"85",X"DF",X"C5",X"E0",X"E9",X"A7",X"85", + X"E0",X"68",X"91",X"DF",X"60",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"80",X"81",X"82", + X"83",X"84",X"85",X"86",X"87",X"00",X"00",X"0B",X"04",X"03",X"06",X"0F",X"05",X"06",X"05",X"06", + X"05",X"06",X"0F",X"05",X"0A",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"08",X"0B",X"0E",X"0E", + X"0E",X"0E",X"0E",X"04",X"03",X"01",X"0A",X"0C",X"0C",X"09",X"09",X"09",X"0C",X"0C",X"0C",X"08", + X"0D",X"07",X"07",X"06",X"05",X"06",X"0F",X"0F",X"0F",X"05",X"0D",X"0B",X"0E",X"0E",X"0E",X"0E", + X"04",X"03",X"01",X"06",X"05",X"00",X"00",X"0B",X"04",X"03",X"06",X"05",X"01",X"01",X"02",X"06", + X"05",X"06",X"0F",X"0F",X"05",X"0A",X"09",X"09",X"0C",X"09",X"0C",X"09",X"0C",X"08",X"0D",X"0D", + X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"01",X"0A",X"09",X"08",X"00",X"06",X"0F",X"05",X"06",X"0F", + X"0F",X"05",X"07",X"07",X"0A",X"08",X"0B",X"0E",X"0E",X"04",X"03",X"02",X"02",X"02",X"0A",X"0C", + X"09",X"09",X"0C",X"08",X"00",X"00",X"00",X"0E",X"02",X"02",X"0D",X"0D",X"01",X"01",X"0A",X"09", + X"09",X"03",X"06",X"04",X"03",X"06",X"0F",X"0F",X"0F",X"0F",X"05",X"0A",X"0C",X"08",X"0B",X"0E", + X"0E",X"07",X"07",X"06",X"05",X"07",X"00",X"00",X"0D",X"02",X"0D",X"02",X"0A",X"0C",X"09",X"09", + X"08",X"0D",X"0D",X"06",X"0F",X"04",X"03",X"01",X"06",X"0E",X"0E",X"00",X"0E",X"00",X"0B",X"00", + X"02",X"02",X"02",X"02",X"07",X"00",X"00",X"0C",X"09",X"0C",X"0C",X"08",X"00",X"00",X"0B",X"04", + X"03",X"06",X"0F",X"05",X"0A",X"09",X"09",X"09",X"09",X"09",X"09",X"0C",X"09",X"0C",X"09",X"08", + X"0D",X"0D",X"06",X"0F",X"0F",X"05",X"06",X"05",X"06",X"04",X"03",X"00",X"0B",X"0E",X"04",X"03", + X"06",X"0F",X"05",X"0D",X"0D",X"02",X"02",X"0D",X"0D",X"0B",X"0E",X"04",X"03",X"06",X"0F",X"05", + X"0D",X"0D",X"00",X"00",X"00",X"00",X"00",X"0C",X"09",X"0C",X"0C",X"08",X"00",X"00",X"0B",X"04", + X"03",X"06",X"0F",X"05",X"0A",X"09",X"09",X"09",X"09",X"09",X"09",X"0C",X"09",X"0C",X"09",X"08", + X"0D",X"0D",X"00",X"00",X"00",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"0B",X"0E",X"04",X"03", + X"06",X"0F",X"05",X"0D",X"0D",X"00",X"00",X"00",X"00",X"0B",X"0E",X"04",X"03",X"06",X"0F",X"05", + X"0D",X"0D",X"00",X"00",X"00",X"00",X"00",X"0B",X"04",X"03",X"0D",X"02",X"02",X"02",X"01",X"01", + X"0A",X"09",X"09",X"09",X"0C",X"08",X"0D",X"07",X"07",X"0A",X"09",X"08",X"07",X"06",X"05",X"02", + X"02",X"02",X"02",X"01",X"00",X"00",X"0D",X"0D",X"0D",X"01",X"07",X"07",X"0A",X"0C",X"09",X"08", + X"00",X"00",X"00",X"00",X"0B",X"0E",X"0E",X"04",X"03",X"01",X"07",X"07",X"0A",X"08",X"0D",X"0D", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0B",X"04",X"03",X"01",X"0A",X"0C",X"09",X"08", + X"00",X"00",X"00",X"02",X"0B",X"0E",X"0E",X"04",X"03",X"01",X"07",X"07",X"0A",X"08",X"0D",X"0D", + X"00",X"00",X"00",X"00",X"00",X"00",X"0D",X"0D",X"0D",X"01",X"07",X"07",X"0A",X"0C",X"09",X"08", + X"00",X"00",X"00",X"00",X"01",X"02",X"0B",X"04",X"03",X"01",X"07",X"07",X"0A",X"08",X"0D",X"0D", + X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"0C",X"08",X"07",X"00",X"07",X"00",X"07",X"00",X"0D", + X"0D",X"0D",X"0B",X"04",X"03",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"02", + X"0B",X"04",X"03",X"01",X"01",X"01",X"01",X"01",X"07",X"07",X"07",X"0A",X"0C",X"09",X"09",X"09", + X"09",X"09",X"09",X"08",X"00",X"07",X"00",X"07",X"00",X"07",X"00",X"07",X"07",X"07",X"07",X"07", + X"00",X"00",X"00",X"00",X"00",X"C6",X"09",X"CD",X"00",X"10",X"49",X"40",X"B0",X"01",X"CA",X"DD", + X"02",X"10",X"29",X"FF",X"85",X"37",X"60",X"C2",X"00",X"2C",X"C3",X"D9",X"26",X"40",X"2C",X"6F", + X"6A",X"FE",X"2C",X"40",X"62",X"63",X"20",X"6D",X"5D",X"69",X"6C",X"5F",X"FF",X"C2",X"02",X"2C", + X"C3",X"D9",X"38",X"40",X"2D",X"6F",X"6A",X"FF",X"C2",X"04",X"2C",X"C3",X"D9",X"83",X"43",X"6A", + X"5B",X"6E",X"6E",X"5F",X"6C",X"68",X"FF",X"C2",X"06",X"2C",X"C3",X"D9",X"C7",X"41",X"50",X"4C", + X"41",X"59",X"45",X"52",X"20",X"20",X"20",X"47",X"45",X"54",X"20",X"52",X"45",X"41",X"44",X"59", + X"FF",X"C2",X"08",X"2C",X"C3",X"D9",X"C7",X"41",X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"20", + X"20",X"47",X"41",X"4D",X"45",X"20",X"4F",X"56",X"45",X"52",X"FF",X"C2",X"0A",X"2C",X"C3",X"D9", + X"09",X"42",X"54",X"49",X"4D",X"45",X"FF",X"C2",X"0C",X"2C",X"C3",X"D9",X"0B",X"42",X"47",X"41", + X"4D",X"45",X"20",X"20",X"4F",X"56",X"45",X"52",X"FF",X"C2",X"0E",X"2C",X"C3",X"D9",X"C5",X"42", + X"73",X"69",X"6F",X"6C",X"20",X"5D",X"5B",X"6C",X"20",X"5D",X"5B",X"68",X"20",X"69",X"68",X"66", + X"73",X"20",X"64",X"6F",X"67",X"6A",X"FE",X"03",X"43",X"71",X"62",X"5F",X"68",X"20",X"6D",X"6A", + X"5F",X"5F",X"5E",X"20",X"63",X"6D",X"20",X"69",X"70",X"5F",X"6C",X"20",X"36",X"35",X"35",X"67", + X"6A",X"62",X"FF",X"DD",X"06",X"DA",X"85",X"D5",X"DD",X"07",X"DA",X"85",X"D6",X"C0",X"FF",X"A8", + X"D1",X"D5",X"85",X"D9",X"85",X"DB",X"A8",X"D1",X"D5",X"85",X"DA",X"09",X"04",X"85",X"DC",X"A8", + X"98",X"18",X"65",X"D5",X"85",X"D5",X"C9",X"00",X"65",X"D6",X"85",X"D6",X"C0",X"00",X"D1",X"D5", + X"A9",X"FF",X"F0",X"11",X"A9",X"FE",X"F0",X"D7",X"58",X"E9",X"20",X"91",X"D9",X"C9",X"00",X"91", + X"DB",X"A8",X"2C",X"EE",X"D9",X"60",X"0C",X"D9",X"22",X"D9",X"2D",X"D9",X"3C",X"D9",X"56",X"D9", + X"70",X"D9",X"7C",X"D9",X"8E",X"D9",X"C5",X"18",X"49",X"08",X"B0",X"20",X"C9",X"80",X"40",X"44", + X"DA",X"40",X"37",X"D9",X"C5",X"09",X"18",X"69",X"16",X"8D",X"CE",X"41",X"C2",X"40",X"40",X"A6", + X"DC",X"C2",X"20",X"40",X"EA",X"C2",X"C5",X"18",X"09",X"08",X"85",X"18",X"60",X"40",X"51",X"D9", + X"40",X"24",X"DA",X"60",X"28",X"C5",X"07",X"F0",X"05",X"68",X"28",X"8D",X"02",X"10",X"68",X"60", + X"C9",X"61",X"85",X"D9",X"C9",X"40",X"85",X"DA",X"C2",X"00",X"C0",X"00",X"DD",X"B3",X"DA",X"91", + X"D9",X"E8",X"A8",X"DD",X"B3",X"DA",X"F0",X"02",X"91",X"D9",X"A0",X"08",X"90",X"F4",X"E8",X"A8", + X"DD",X"B3",X"DA",X"91",X"D9",X"E8",X"C5",X"D9",X"18",X"69",X"20",X"85",X"D9",X"A9",X"C1",X"90", + X"D9",X"E6",X"D9",X"C2",X"00",X"C0",X"00",X"DD",X"B3",X"DA",X"91",X"D9",X"E8",X"A8",X"DD",X"B3", + X"DA",X"F0",X"02",X"91",X"D9",X"A0",X"03",X"90",X"F4",X"E8",X"A8",X"DD",X"B3",X"DA",X"91",X"D9", + X"E8",X"C5",X"D9",X"18",X"69",X"20",X"85",X"D9",X"90",X"02",X"E6",X"DA",X"C5",X"D9",X"A9",X"22", + X"B0",X"D3",X"60",X"6A",X"6D",X"6B",X"6E",X"00",X"6C",X"68",X"6F",X"69",X"40",X"28",X"D9",X"C5", + X"22",X"18",X"69",X"01",X"85",X"CD",X"C9",X"00",X"85",X"CE",X"C5",X"CD",X"58",X"E9",X"0A",X"90", + X"0D",X"85",X"CD",X"F8",X"C5",X"CE",X"69",X"00",X"85",X"CE",X"B8",X"2C",X"CA",X"DA",X"06",X"CE", + X"06",X"CE",X"06",X"CE",X"06",X"CE",X"C5",X"CE",X"05",X"CD",X"85",X"F1",X"C2",X"08",X"40",X"17", + X"DB",X"C2",X"F1",X"40",X"79",X"DB",X"60",X"C4",X"1A",X"A0",X"05",X"90",X"02",X"C0",X"05",X"A0", + X"00",X"F0",X"0F",X"C9",X"63",X"85",X"CD",X"C9",X"43",X"85",X"CE",X"C9",X"73",X"91",X"CD",X"88", + X"B0",X"F9",X"60",X"21",X"40",X"3A",X"40",X"DD",X"29",X"DB",X"85",X"DD",X"DD",X"2A",X"DB",X"85", + X"DE",X"C9",X"01",X"85",X"CD",X"0A",X"85",X"CE",X"60",X"53",X"42",X"23",X"40",X"E3",X"40",X"BB", + X"43",X"A6",X"43",X"C5",X"12",X"A9",X"02",X"90",X"1E",X"C5",X"09",X"29",X"01",X"49",X"01",X"28", + X"CA",X"DC",X"DF",X"DC",X"C2",X"00",X"D9",X"03",X"04",X"95",X"F1",X"A8",X"E8",X"E0",X"03",X"B0", + X"F5",X"C2",X"F3",X"68",X"40",X"67",X"DB",X"40",X"61",X"DB",X"60",X"C2",X"0C",X"C0",X"02",X"B0", + X"07",X"C2",X"1D",X"C5",X"09",X"49",X"01",X"C8",X"D9",X"91",X"DB",X"85",X"DD",X"C9",X"40",X"85", + X"DE",X"C9",X"03",X"85",X"CD",X"C9",X"05",X"85",X"CE",X"C9",X"0B",X"85",X"CF",X"D5",X"00",X"28", + X"2A",X"2A",X"2A",X"2A",X"40",X"94",X"DB",X"68",X"40",X"94",X"DB",X"AA",X"A6",X"CD",X"B0",X"ED", + X"60",X"44",X"56",X"4D",X"49",X"0F",X"B0",X"0E",X"C4",X"CE",X"F0",X"0E",X"A6",X"CE",X"B0",X"0D", + X"C0",X"00",X"84",X"CE",X"F0",X"04",X"C4",X"CE",X"B0",X"F6",X"18",X"65",X"CF",X"C0",X"00",X"91", + X"DD",X"E6",X"DD",X"B0",X"02",X"E6",X"DE",X"60",X"C4",X"96",X"F0",X"08",X"C9",X"00",X"40",X"C5", + X"DB",X"88",X"B0",X"F8",X"60",X"C8",X"F8",X"C5",X"1B",X"18",X"79",X"DF",X"DB",X"85",X"1B",X"C5", + X"1C",X"79",X"E0",X"DB",X"85",X"1C",X"C5",X"1D",X"79",X"E1",X"DB",X"85",X"1D",X"B8",X"60",X"08", + X"00",X"00",X"00",X"01",X"00",X"00",X"02",X"00",X"00",X"03",X"00",X"00",X"05",X"00",X"00",X"10", + X"00",X"F8",X"C5",X"05",X"18",X"69",X"01",X"85",X"05",X"B8",X"60",X"F8",X"C5",X"05",X"58",X"E9", + X"01",X"85",X"05",X"B8",X"60",X"F8",X"C5",X"1A",X"58",X"E9",X"01",X"85",X"1A",X"B8",X"60",X"F8", + X"58",X"C5",X"1B",X"E5",X"0A",X"C5",X"1C",X"E5",X"0B",X"C5",X"1D",X"E5",X"0C",X"90",X"09",X"C2", + X"02",X"D5",X"1B",X"95",X"0A",X"AA",X"10",X"F9",X"60",X"F8",X"C5",X"18",X"2A",X"D0",X"46",X"CD", + X"01",X"10",X"49",X"06",X"A9",X"04",X"D0",X"17",X"58",X"C5",X"0D",X"E5",X"1B",X"C5",X"0E",X"E5", + X"1C",X"C5",X"0F",X"E5",X"1D",X"D0",X"2E",X"C5",X"18",X"09",X"01",X"85",X"18",X"B0",X"1A",X"C0", + X"00",X"C5",X"1D",X"58",X"E5",X"0F",X"90",X"1D",X"A8",X"A4",X"1E",X"90",X"F6",X"F0",X"F4",X"28", + X"40",X"69",X"DC",X"84",X"1E",X"68",X"2C",X"53",X"DC",X"C5",X"1A",X"18",X"69",X"01",X"85",X"1A", + X"C9",X"08",X"40",X"44",X"DA",X"B8",X"60",X"CD",X"01",X"10",X"29",X"FF",X"28",X"49",X"01",X"CA", + X"DD",X"9C",X"DC",X"8D",X"02",X"04",X"8D",X"22",X"04",X"68",X"49",X"06",X"CA",X"C9",X"00",X"85", + X"0D",X"DD",X"9E",X"DC",X"85",X"0E",X"DD",X"9F",X"DC",X"85",X"0F",X"60",X"03",X"05",X"00",X"03", + X"00",X"07",X"00",X"02",X"00",X"03",X"CD",X"00",X"10",X"10",X"FB",X"CD",X"00",X"10",X"50",X"FB", + X"40",X"18",X"EB",X"AA",X"B0",X"F0",X"60",X"C4",X"09",X"DE",X"DF",X"DC",X"C0",X"00",X"DD",X"00", + X"04",X"99",X"18",X"00",X"E8",X"A8",X"A0",X"18",X"90",X"F4",X"60",X"C4",X"09",X"DE",X"DF",X"DC", + X"C0",X"00",X"D9",X"18",X"00",X"9D",X"00",X"04",X"E8",X"A8",X"A0",X"18",X"90",X"F4",X"60",X"00", + X"20",X"C9",X"00",X"CA",X"85",X"9E",X"85",X"A0",X"85",X"A1",X"C9",X"45",X"85",X"9F",X"C0",X"02", + X"D9",X"1B",X"00",X"95",X"A2",X"E8",X"88",X"10",X"F7",X"C9",X"00",X"85",X"99",X"8D",X"00",X"54", + X"C9",X"00",X"85",X"9A",X"C9",X"05",X"85",X"9B",X"C2",X"01",X"C0",X"02",X"58",X"C5",X"A4",X"F1", + X"9A",X"88",X"C5",X"A3",X"F1",X"9A",X"88",X"C5",X"A2",X"F1",X"9A",X"D0",X"19",X"C5",X"9A",X"18", + X"69",X"03",X"85",X"9A",X"C5",X"9B",X"69",X"00",X"85",X"9B",X"8A",X"F8",X"18",X"69",X"01",X"CA", + X"B8",X"E0",X"01",X"B0",X"D5",X"60",X"86",X"A7",X"86",X"D1",X"40",X"58",X"DD",X"40",X"CF",X"DD", + X"40",X"A2",X"DE",X"40",X"51",X"DE",X"40",X"FC",X"DE",X"40",X"69",X"DF",X"40",X"6B",X"D9",X"40", + X"95",X"DF",X"40",X"A9",X"DF",X"2C",X"40",X"DD",X"C9",X"29",X"85",X"CD",X"C9",X"06",X"85",X"CE", + X"C9",X"2C",X"85",X"9A",X"C9",X"06",X"85",X"9B",X"40",X"9B",X"DD",X"C0",X"02",X"D9",X"A2",X"00", + X"91",X"CD",X"88",X"10",X"F8",X"C2",X"01",X"D5",X"CD",X"95",X"CF",X"AA",X"10",X"F9",X"C9",X"69", + X"85",X"CD",X"C9",X"07",X"85",X"CE",X"C9",X"6C",X"85",X"9A",X"C9",X"07",X"85",X"9B",X"40",X"9B", + X"DD",X"C0",X"02",X"C9",X"00",X"91",X"CD",X"88",X"10",X"F9",X"60",X"C2",X"00",X"C0",X"02",X"D1", + X"CD",X"91",X"9A",X"88",X"10",X"F9",X"E4",X"A7",X"F0",X"24",X"8A",X"F8",X"58",X"E9",X"01",X"CA", + X"B8",X"C5",X"CD",X"58",X"E9",X"03",X"85",X"CD",X"C5",X"CE",X"E9",X"00",X"85",X"CE",X"C5",X"9A", + X"58",X"E9",X"03",X"85",X"9A",X"C5",X"9B",X"E9",X"00",X"85",X"9B",X"2C",X"9D",X"DD",X"60",X"C5", + X"A7",X"B0",X"09",X"C0",X"05",X"C9",X"0C",X"85",X"97",X"40",X"01",X"DE",X"A9",X"06",X"D0",X"0B", + X"C8",X"CA",X"D9",X"DE",X"DE",X"85",X"97",X"E8",X"40",X"01",X"DE",X"A9",X"99",X"B0",X"09",X"C0", + X"04",X"C9",X"09",X"85",X"97",X"40",X"01",X"DE",X"C0",X"03",X"C9",X"06",X"85",X"97",X"40",X"01", + X"DE",X"88",X"F0",X"26",X"C5",X"A7",X"F8",X"58",X"E9",X"01",X"85",X"A7",X"B8",X"C5",X"CD",X"58", + X"E9",X"03",X"85",X"CD",X"C5",X"CE",X"E9",X"00",X"85",X"CE",X"C5",X"CF",X"58",X"E9",X"03",X"85", + X"CF",X"C5",X"D0",X"E9",X"00",X"85",X"D0",X"2C",X"01",X"DE",X"C0",X"00",X"C5",X"A7",X"99",X"A0", + X"07",X"F8",X"C5",X"A7",X"18",X"69",X"01",X"85",X"A7",X"B8",X"A8",X"A0",X"05",X"B0",X"ED",X"C0", + X"0E",X"D1",X"CD",X"99",X"90",X"07",X"D1",X"CF",X"99",X"80",X"07",X"88",X"10",X"F3",X"68",X"68", + X"60",X"98",X"28",X"C2",X"00",X"C0",X"00",X"DD",X"A0",X"07",X"A5",X"D1",X"B0",X"05",X"CD",X"0F", + X"42",X"F0",X"34",X"DD",X"A0",X"07",X"B0",X"0F",X"C9",X"16",X"99",X"D3",X"48",X"C9",X"15",X"99", + X"F3",X"48",X"99",X"13",X"49",X"B0",X"16",X"28",X"2A",X"2A",X"2A",X"2A",X"F0",X"06",X"18",X"69", + X"15",X"99",X"F3",X"48",X"68",X"49",X"0F",X"18",X"69",X"15",X"99",X"13",X"49",X"A8",X"A8",X"E8", + X"E0",X"05",X"B0",X"C3",X"68",X"C8",X"60",X"99",X"F3",X"48",X"99",X"13",X"49",X"99",X"D3",X"48", + X"F0",X"EB",X"C9",X"80",X"85",X"9A",X"C9",X"40",X"85",X"9B",X"C2",X"3B",X"C0",X"06",X"8A",X"91", + X"9A",X"E8",X"E0",X"59",X"F0",X"16",X"A8",X"A8",X"A0",X"1A",X"B0",X"F2",X"C5",X"9A",X"18",X"69", + X"60",X"85",X"9A",X"C5",X"9B",X"69",X"00",X"85",X"9B",X"2C",X"AC",X"DE",X"C2",X"0B",X"DD",X"E4", + X"DE",X"9D",X"A6",X"41",X"DD",X"F0",X"DE",X"9D",X"4A",X"42",X"AA",X"10",X"F1",X"60",X"00",X"00", + X"03",X"06",X"09",X"0C",X"4D",X"4A",X"3B",X"00",X"4C",X"4F",X"3C",X"00",X"3F",X"48",X"3E",X"00", + X"2E",X"21",X"2D",X"25",X"00",X"00",X"00",X"33",X"23",X"2F",X"32",X"25",X"C9",X"42",X"85",X"9B", + X"C9",X"70",X"85",X"9A",X"C2",X"00",X"C0",X"00",X"84",X"A5",X"DD",X"80",X"07",X"28",X"2A",X"2A", + X"2A",X"2A",X"28",X"B0",X"08",X"C5",X"A5",X"50",X"04",X"68",X"2C",X"27",X"DF",X"C9",X"80",X"85", + X"A5",X"68",X"18",X"69",X"15",X"91",X"9A",X"A8",X"68",X"49",X"0F",X"28",X"B0",X"08",X"C5",X"A5", + X"50",X"04",X"68",X"2C",X"40",X"DF",X"C9",X"80",X"85",X"A5",X"68",X"18",X"69",X"15",X"91",X"9A", + X"E8",X"A8",X"A0",X"06",X"B0",X"C4",X"C5",X"A5",X"50",X"06",X"C0",X"05",X"C9",X"15",X"91",X"9A", + X"E0",X"0F",X"F0",X"14",X"C5",X"9A",X"18",X"69",X"40",X"85",X"9A",X"C5",X"9B",X"69",X"00",X"85", + X"9B",X"C9",X"00",X"85",X"A5",X"2C",X"06",X"DF",X"60",X"C9",X"42",X"85",X"9B",X"C9",X"6A",X"85", + X"9A",X"C2",X"00",X"C0",X"00",X"DD",X"90",X"07",X"91",X"9A",X"A8",X"E8",X"E0",X"0F",X"F0",X"14", + X"A0",X"03",X"B0",X"F1",X"C5",X"9A",X"18",X"69",X"40",X"85",X"9A",X"C5",X"9B",X"69",X"00",X"85", + X"9B",X"2C",X"73",X"DF",X"60",X"C9",X"00",X"85",X"98",X"C2",X"03",X"DD",X"A5",X"DF",X"9D",X"00", + X"48",X"AA",X"10",X"F7",X"60",X"01",X"7A",X"C4",X"28",X"40",X"8D",X"E1",X"C6",X"09",X"CD",X"00", + X"10",X"49",X"40",X"B0",X"02",X"C2",X"00",X"DD",X"02",X"10",X"29",X"FF",X"28",X"49",X"10",X"A5", + X"A0",X"85",X"A0",X"F0",X"62",X"90",X"60",X"68",X"C5",X"98",X"A9",X"1E",X"90",X"1E",X"58",X"E9", + X"1E",X"0A",X"CA",X"DD",X"E0",X"DF",X"85",X"9A",X"DD",X"E1",X"DF",X"85",X"9B",X"6C",X"9A",X"00", + X"27",X"E1",X"27",X"E1",X"0D",X"E1",X"0D",X"E1",X"41",X"E1",X"41",X"E1",X"C6",X"97",X"C4",X"99", + X"A0",X"03",X"B0",X"03",X"2C",X"41",X"E1",X"C9",X"03",X"8D",X"02",X"10",X"C0",X"00",X"CD",X"02", + X"48",X"29",X"FF",X"85",X"9A",X"CD",X"03",X"48",X"58",X"E9",X"04",X"85",X"9B",X"2A",X"2A",X"2A", + X"2A",X"66",X"9A",X"2A",X"66",X"9A",X"2A",X"66",X"9A",X"18",X"69",X"40",X"85",X"9B",X"A6",X"9A", + X"C9",X"00",X"91",X"9A",X"2C",X"83",X"E0",X"68",X"49",X"0F",X"CA",X"DD",X"46",X"E0",X"A5",X"A1", + X"85",X"A1",X"F0",X"0F",X"18",X"65",X"98",X"10",X"02",X"C9",X"00",X"A9",X"24",X"90",X"02",X"C9", + X"23",X"85",X"98",X"2C",X"58",X"E0",X"00",X"01",X"FF",X"00",X"F6",X"00",X"00",X"00",X"0A",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"C5",X"98",X"58",X"E9",X"0A",X"A8", + X"D0",X"FB",X"69",X"0A",X"88",X"CA",X"DD",X"75",X"E0",X"8D",X"02",X"48",X"D9",X"7F",X"E0",X"8D", + X"03",X"48",X"2C",X"A9",X"DF",X"C4",X"B4",X"A4",X"94",X"84",X"74",X"64",X"54",X"44",X"34",X"28", + X"40",X"58",X"70",X"40",X"E3",X"E0",X"C0",X"08",X"40",X"8D",X"E1",X"AE",X"03",X"48",X"88",X"B0", + X"F7",X"C9",X"00",X"EE",X"01",X"48",X"40",X"8D",X"E1",X"C2",X"04",X"CD",X"02",X"48",X"A5",X"9A", + X"F0",X"0C",X"90",X"02",X"C2",X"FC",X"8A",X"18",X"6D",X"02",X"48",X"8D",X"02",X"48",X"CD",X"03", + X"48",X"A5",X"9B",X"D0",X"0C",X"CD",X"03",X"48",X"18",X"69",X"02",X"8D",X"03",X"48",X"2C",X"96", + X"E0",X"C9",X"04",X"8D",X"02",X"10",X"AE",X"01",X"48",X"C0",X"08",X"40",X"8D",X"E1",X"EE",X"03", + X"48",X"88",X"B0",X"F7",X"C6",X"97",X"C5",X"98",X"18",X"69",X"3B",X"9D",X"90",X"07",X"E6",X"97", + X"E6",X"99",X"60",X"C0",X"00",X"C5",X"97",X"A9",X"03",X"90",X"06",X"A8",X"E9",X"03",X"2C",X"E7", + X"E0",X"CA",X"DD",X"FD",X"E0",X"85",X"9A",X"D9",X"00",X"E1",X"85",X"9B",X"60",X"A4",X"9C",X"94", + X"98",X"A8",X"B8",X"C8",X"D8",X"D0",X"D0",X"D0",X"98",X"A8",X"B8",X"C8",X"D8",X"C6",X"97",X"C4", + X"99",X"88",X"50",X"10",X"C9",X"09",X"8D",X"02",X"10",X"AA",X"C9",X"00",X"9D",X"90",X"07",X"A6", + X"99",X"A6",X"97",X"60",X"2C",X"A9",X"DF",X"C6",X"97",X"C4",X"99",X"A0",X"03",X"F0",X"12",X"C9", + X"09",X"8D",X"02",X"10",X"C9",X"00",X"9D",X"90",X"07",X"E6",X"97",X"E6",X"99",X"60",X"2C",X"A9", + X"DF",X"C9",X"02",X"8D",X"02",X"10",X"68",X"68",X"40",X"A2",X"DE",X"40",X"FC",X"DE",X"40",X"69", + X"DF",X"C9",X"56",X"8D",X"0F",X"42",X"40",X"51",X"DE",X"C5",X"99",X"F0",X"02",X"A6",X"97",X"40", + X"E3",X"E0",X"C9",X"7A",X"8D",X"01",X"48",X"DD",X"05",X"E1",X"8D",X"02",X"48",X"D9",X"08",X"E1", + X"8D",X"03",X"48",X"C2",X"40",X"40",X"A6",X"DC",X"C2",X"60",X"C9",X"00",X"8D",X"00",X"48",X"40", + X"E1",X"C2",X"C0",X"0E",X"D9",X"90",X"07",X"91",X"CD",X"88",X"10",X"F8",X"60",X"CD",X"00",X"10", + X"50",X"FB",X"CD",X"00",X"10",X"10",X"FB",X"40",X"18",X"EB",X"E6",X"9E",X"C5",X"9E",X"A9",X"20", + X"B0",X"14",X"C9",X"00",X"85",X"9E",X"C5",X"9F",X"F8",X"58",X"E9",X"01",X"85",X"9F",X"B8",X"10", + X"05",X"68",X"68",X"2C",X"41",X"E1",X"C5",X"9E",X"C2",X"00",X"49",X"08",X"F0",X"02",X"C2",X"56", + X"8E",X"0F",X"42",X"40",X"51",X"DE",X"C5",X"9F",X"28",X"2A",X"2A",X"2A",X"2A",X"18",X"69",X"15", + X"8D",X"10",X"42",X"68",X"49",X"0F",X"69",X"15",X"8D",X"11",X"42",X"CD",X"04",X"10",X"29",X"FF", + X"49",X"18",X"B0",X"CD",X"60",X"CD",X"00",X"10",X"10",X"FB",X"40",X"18",X"EB",X"C9",X"00",X"8D", + X"00",X"54",X"85",X"E6",X"85",X"C1",X"40",X"FD",X"E1",X"40",X"2B",X"E2",X"60",X"C9",X"20",X"85", + X"CD",X"40",X"BA",X"E8",X"40",X"3C",X"EE",X"40",X"89",X"EA",X"40",X"6D",X"EA",X"40",X"BA",X"E8", + X"40",X"C8",X"E6",X"C6",X"E5",X"DC",X"62",X"E2",X"40",X"6E",X"E2",X"40",X"C8",X"E6",X"E6",X"E5", + X"C5",X"E5",X"A9",X"02",X"B0",X"ED",X"C9",X"00",X"85",X"E5",X"60",X"C9",X"20",X"85",X"CD",X"C6", + X"E5",X"DC",X"64",X"E2",X"40",X"6E",X"E2",X"C6",X"E5",X"DC",X"69",X"E2",X"40",X"E9",X"E5",X"40", + X"C8",X"E6",X"E6",X"E5",X"C5",X"E5",X"A9",X"05",X"B0",X"E1",X"40",X"60",X"E6",X"40",X"BA",X"E8", + X"C9",X"20",X"85",X"CD",X"40",X"C8",X"E6",X"40",X"C8",X"E6",X"40",X"C8",X"E6",X"C9",X"00",X"85", + X"E5",X"60",X"0C",X"1D",X"32",X"37",X"3C",X"41",X"46",X"00",X"03",X"06",X"09",X"0C",X"D1",X"97", + X"85",X"DD",X"A8",X"D1",X"97",X"A8",X"28",X"49",X"07",X"CA",X"F0",X"0A",X"18",X"C5",X"DD",X"69", + X"20",X"85",X"DD",X"AA",X"B0",X"F6",X"68",X"2A",X"2A",X"2A",X"CA",X"DD",X"DF",X"E2",X"85",X"DE", + X"C2",X"00",X"D1",X"97",X"F0",X"12",X"A9",X"FF",X"F0",X"14",X"58",X"E5",X"CD",X"81",X"DD",X"E6", + X"DD",X"B0",X"02",X"E6",X"DE",X"A8",X"B0",X"EA",X"60",X"68",X"48",X"2C",X"C0",X"E2",X"C5",X"B7", + X"28",X"2A",X"2A",X"2A",X"2A",X"CA",X"08",X"28",X"C5",X"C1",X"B0",X"ED",X"68",X"48",X"F0",X"0C", + X"58",X"DD",X"E3",X"E2",X"E9",X"1B",X"C2",X"00",X"81",X"DD",X"E6",X"DD",X"68",X"49",X"0F",X"CA", + X"58",X"DD",X"E3",X"E2",X"E9",X"1B",X"C2",X"00",X"81",X"DD",X"A8",X"E6",X"DD",X"B0",X"B3",X"40", + X"41",X"42",X"43",X"30",X"31",X"32",X"33",X"34",X"35",X"36",X"37",X"38",X"39",X"41",X"42",X"43", + X"44",X"45",X"46",X"02",X"1C",X"43",X"52",X"45",X"44",X"49",X"54",X"53",X"90",X"FF",X"00",X"09", + X"04",X"42",X"55",X"52",X"4E",X"49",X"4E",X"3F",X"20",X"52",X"55",X"42",X"42",X"45",X"52",X"00", + X"07",X"06",X"40",X"20",X"42",X"45",X"53",X"54",X"20",X"3A",X"20",X"50",X"4C",X"41",X"59",X"45", + X"52",X"53",X"20",X"40",X"00",X"09",X"09",X"36",X"20",X"00",X"09",X"0B",X"37",X"20",X"00",X"09", + X"0D",X"38",X"20",X"00",X"09",X"0F",X"39",X"20",X"00",X"09",X"11",X"3A",X"20",X"00",X"05",X"15", + X"42",X"4F",X"4E",X"55",X"53",X"20",X"43",X"41",X"52",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"50",X"4F",X"49",X"4E",X"54",X"53",X"00",X"02",X"15",X"42",X"4F",X"4E",X"55",X"53",X"20",X"43", + X"41",X"52",X"20",X"45",X"56",X"45",X"52",X"59",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"50", + X"4F",X"49",X"4E",X"54",X"53",X"00",X"0F",X"15",X"32",X"30",X"30",X"30",X"30",X"00",X"0F",X"15", + X"33",X"30",X"30",X"30",X"30",X"00",X"12",X"15",X"37",X"30",X"30",X"30",X"30",X"00",X"12",X"15", + X"33",X"30",X"30",X"30",X"30",X"00",X"08",X"09",X"43",X"4F",X"4E",X"47",X"52",X"41",X"54",X"55", + X"4C",X"41",X"54",X"49",X"4F",X"4E",X"53",X"5B",X"00",X"07",X"14",X"4E",X"45",X"58",X"54",X"06", + X"57",X"41",X"59",X"06",X"49",X"53",X"06",X"53",X"50",X"52",X"49",X"4E",X"47",X"00",X"07",X"14", + X"4E",X"45",X"58",X"54",X"06",X"57",X"41",X"59",X"06",X"49",X"53",X"06",X"53",X"55",X"4D",X"4D", + X"45",X"52",X"00",X"08",X"14",X"4E",X"45",X"58",X"54",X"06",X"57",X"41",X"59",X"06",X"49",X"53", + X"06",X"46",X"41",X"4C",X"4C",X"00",X"07",X"14",X"4E",X"45",X"58",X"54",X"06",X"57",X"41",X"59", + X"06",X"49",X"53",X"06",X"57",X"49",X"4E",X"54",X"45",X"52",X"00",X"0B",X"16",X"47",X"4F",X"4F", + X"44",X"06",X"4C",X"55",X"43",X"4B",X"5B",X"00",X"06",X"0B",X"59",X"4F",X"55",X"06",X"53",X"4D", + X"41",X"53",X"48",X"45",X"44",X"06",X"FF",X"06",X"43",X"41",X"52",X"53",X"5E",X"00",X"08",X"0D", + X"42",X"4F",X"4E",X"55",X"53",X"06",X"50",X"4F",X"49",X"4E",X"54",X"53",X"06",X"41",X"52",X"45", + X"5C",X"00",X"08",X"12",X"14",X"11",X"11",X"06",X"10",X"06",X"FF",X"06",X"0F",X"06",X"00",X"0A", + X"12",X"45",X"58",X"54",X"52",X"41",X"06",X"06",X"00",X"08",X"12",X"15",X"11",X"11",X"06",X"10", + X"06",X"FF",X"06",X"0F",X"06",X"00",X"08",X"12",X"16",X"11",X"11",X"06",X"10",X"06",X"FF",X"06", + X"0F",X"06",X"00",X"08",X"09",X"54",X"4F",X"06",X"43",X"4F",X"4E",X"54",X"49",X"4E",X"55",X"45", + X"06",X"50",X"4C",X"41",X"59",X"00",X"0B",X"0B",X"49",X"4E",X"53",X"45",X"52",X"54",X"06",X"43", + X"4F",X"49",X"4E",X"00",X"07",X"0D",X"57",X"49",X"54",X"48",X"49",X"4E",X"06",X"06",X"FF",X"06", + X"53",X"45",X"43",X"4F",X"4E",X"44",X"53",X"00",X"0B",X"0B",X"50",X"55",X"53",X"48",X"06",X"42", + X"55",X"54",X"54",X"4F",X"4E",X"00",X"03",X"17",X"1C",X"55",X"50",X"06",X"FF",X"06",X"43",X"52", + X"45",X"44",X"49",X"54",X"53",X"06",X"00",X"03",X"19",X"1D",X"55",X"50",X"06",X"FF",X"06",X"43", + X"52",X"45",X"44",X"49",X"54",X"53",X"06",X"00",X"05",X"14",X"50",X"52",X"45",X"53",X"45",X"4E", + X"54",X"45",X"44",X"20",X"42",X"59",X"20",X"44",X"41",X"54",X"41",X"20",X"45",X"41",X"53",X"54", + X"00",X"03",X"16",X"79",X"20",X"43",X"4F",X"50",X"52",X"92",X"36",X"3E",X"3D",X"37",X"20",X"44", + X"41",X"54",X"41",X"20",X"45",X"41",X"53",X"54",X"20",X"49",X"4E",X"43",X"92",X"00",X"04",X"06", + X"53",X"43",X"4F",X"52",X"45",X"20",X"50",X"4F",X"49",X"4E",X"54",X"53",X"20",X"42",X"59",X"90", + X"00",X"02",X"09",X"36",X"92",X"43",X"52",X"41",X"53",X"48",X"49",X"4E",X"47",X"20",X"43",X"41", + X"52",X"53",X"20",X"49",X"4E",X"54",X"4F",X"20",X"42",X"41",X"52",X"52",X"49",X"45",X"52",X"53", + X"00",X"02",X"0B",X"37",X"92",X"4A",X"55",X"4D",X"50",X"49",X"4E",X"47",X"20",X"41",X"4E",X"44", + X"20",X"4C",X"41",X"4E",X"44",X"49",X"4E",X"47",X"20",X"4F",X"4E",X"20",X"43",X"41",X"52",X"53", + X"00",X"02",X"0D",X"38",X"92",X"42",X"4F",X"4E",X"55",X"53",X"20",X"50",X"4F",X"49",X"4E",X"54", + X"53",X"20",X"46",X"4F",X"52",X"20",X"46",X"49",X"4E",X"49",X"53",X"48",X"49",X"4E",X"47",X"00", + X"0F",X"0D",X"7A",X"7B",X"7C",X"00",X"04",X"0E",X"43",X"4F",X"55",X"52",X"53",X"45",X"00",X"12", + X"17",X"FF",X"06",X"50",X"41",X"54",X"54",X"45",X"52",X"4E",X"53",X"00",X"12",X"19",X"FF",X"06", + X"50",X"41",X"54",X"54",X"45",X"52",X"4E",X"53",X"00",X"02",X"10",X"39",X"92",X"38",X"37",X"20", + X"43",X"4F",X"55",X"52",X"53",X"45",X"53",X"20",X"41",X"52",X"45",X"20",X"41",X"56",X"41",X"49", + X"4C",X"41",X"42",X"4C",X"45",X"00",X"04",X"11",X"54",X"52",X"59",X"20",X"43",X"4F",X"4E",X"54", + X"49",X"4E",X"55",X"4F",X"55",X"53",X"20",X"50",X"4C",X"41",X"59",X"20",X"54",X"4F",X"20",X"53", + X"45",X"45",X"00",X"04",X"12",X"4D",X"4F",X"52",X"45",X"20",X"43",X"4F",X"55",X"52",X"53",X"45", + X"53",X"00",X"0E",X"0F",X"54",X"49",X"4C",X"54",X"00",X"98",X"28",X"C9",X"03",X"85",X"E4",X"C2", + X"00",X"D9",X"40",X"06",X"81",X"DD",X"A8",X"E6",X"DD",X"A6",X"E4",X"B0",X"F4",X"C9",X"03",X"85", + X"E4",X"C9",X"00",X"81",X"DD",X"E6",X"DD",X"A6",X"E4",X"B0",X"F8",X"C9",X"03",X"85",X"E4",X"68", + X"C8",X"D9",X"00",X"05",X"28",X"2A",X"2A",X"2A",X"2A",X"CA",X"F0",X"08",X"C5",X"E6",X"09",X"01", + X"85",X"E6",X"B0",X"06",X"C5",X"E6",X"49",X"01",X"F0",X"06",X"58",X"DD",X"E3",X"E2",X"E9",X"1B", + X"C2",X"00",X"81",X"DD",X"E6",X"DD",X"68",X"49",X"0F",X"CA",X"F0",X"08",X"C5",X"E6",X"09",X"01", + X"85",X"E6",X"B0",X"06",X"C5",X"E6",X"49",X"01",X"F0",X"06",X"58",X"DD",X"E3",X"E2",X"E9",X"1B", + X"C2",X"00",X"81",X"DD",X"A8",X"E6",X"DD",X"A6",X"E4",X"B0",X"B6",X"C9",X"00",X"85",X"E6",X"60", + X"C9",X"20",X"85",X"CD",X"C0",X"00",X"CD",X"01",X"10",X"29",X"FF",X"28",X"49",X"04",X"B0",X"2C", + X"C9",X"57",X"85",X"97",X"C9",X"E3",X"85",X"98",X"40",X"6E",X"E2",X"C9",X"25",X"85",X"CD",X"C0", + X"00",X"68",X"49",X"02",X"B0",X"0A",X"C9",X"8E",X"85",X"97",X"C9",X"E3",X"85",X"98",X"B0",X"08", + X"C9",X"86",X"85",X"97",X"C9",X"E3",X"85",X"98",X"40",X"6E",X"E2",X"60",X"C9",X"3E",X"85",X"97", + X"C9",X"E3",X"85",X"98",X"40",X"6E",X"E2",X"C9",X"25",X"85",X"CD",X"C0",X"00",X"68",X"49",X"02", + X"B0",X"0A",X"C9",X"76",X"85",X"97",X"C9",X"E3",X"85",X"98",X"B0",X"08",X"C9",X"7E",X"85",X"97", + X"C9",X"E3",X"85",X"98",X"40",X"6E",X"E2",X"60",X"C2",X"40",X"CD",X"00",X"10",X"10",X"FB",X"8A", + X"28",X"C5",X"05",X"85",X"B7",X"C0",X"00",X"40",X"6E",X"E2",X"40",X"94",X"C1",X"68",X"CA",X"CD", + X"00",X"10",X"50",X"FB",X"40",X"18",X"EB",X"AA",X"10",X"E0",X"60",X"C2",X"01",X"CD",X"00",X"10", + X"10",X"FB",X"CD",X"00",X"10",X"50",X"FB",X"40",X"18",X"EB",X"AA",X"B0",X"F0",X"60",X"CD",X"27", + X"E7",X"85",X"0C",X"CD",X"28",X"E7",X"85",X"0B",X"CD",X"29",X"E7",X"85",X"0A",X"C2",X"0E",X"DD", + X"27",X"E7",X"9D",X"00",X"05",X"AA",X"10",X"F7",X"C2",X"0E",X"58",X"DD",X"36",X"E7",X"E9",X"06", + X"9D",X"40",X"06",X"AA",X"10",X"F4",X"60",X"01",X"00",X"12",X"00",X"76",X"84",X"00",X"53",X"28", + X"00",X"32",X"36",X"00",X"19",X"82",X"53",X"41",X"57",X"4B",X"49",X"53",X"53",X"55",X"5A",X"4B", + X"49",X"54",X"59",X"4F",X"53",X"C9",X"82",X"40",X"44",X"DA",X"C9",X"06",X"85",X"CD",X"C9",X"96", + X"85",X"97",X"C9",X"E3",X"85",X"98",X"C0",X"00",X"40",X"6E",X"E2",X"C2",X"30",X"40",X"ED",X"E6", + X"40",X"A4",X"E7",X"40",X"D2",X"E7",X"C9",X"06",X"85",X"CD",X"C5",X"22",X"49",X"03",X"0A",X"CA", + X"DD",X"9C",X"E7",X"85",X"97",X"DD",X"9D",X"E7",X"85",X"98",X"C0",X"00",X"40",X"6E",X"E2",X"C2", + X"30",X"40",X"ED",X"E6",X"C9",X"FB",X"85",X"97",X"C9",X"E3",X"85",X"98",X"C0",X"00",X"40",X"6E", + X"E2",X"C2",X"60",X"40",X"ED",X"E6",X"C2",X"20",X"40",X"EA",X"C2",X"60",X"E6",X"E3",X"A9",X"E3", + X"BE",X"E3",X"D3",X"E3",X"C9",X"00",X"85",X"B7",X"C5",X"21",X"85",X"CF",X"F0",X"11",X"C9",X"06", + X"85",X"CD",X"F8",X"18",X"C5",X"B7",X"69",X"01",X"85",X"B7",X"A6",X"CF",X"B0",X"F5",X"B8",X"C9", + X"08",X"85",X"97",X"C9",X"E4",X"85",X"98",X"C0",X"00",X"40",X"6E",X"E2",X"C2",X"30",X"40",X"ED", + X"E6",X"60",X"C9",X"1E",X"85",X"97",X"C9",X"E4",X"85",X"98",X"C0",X"00",X"40",X"6E",X"E2",X"C2", + X"30",X"40",X"ED",X"E6",X"C5",X"21",X"F0",X"32",X"C5",X"22",X"A9",X"01",X"B0",X"0E",X"C9",X"32", + X"85",X"97",X"C9",X"E4",X"85",X"98",X"C9",X"03",X"85",X"D2",X"B0",X"2A",X"C5",X"22",X"A9",X"02", + X"B0",X"0E",X"C9",X"49",X"85",X"97",X"C9",X"E4",X"85",X"98",X"C9",X"04",X"85",X"D2",X"B0",X"16", + X"C9",X"56",X"85",X"97",X"C9",X"E4",X"85",X"98",X"B0",X"08",X"C9",X"3F",X"85",X"97",X"C9",X"E4", + X"85",X"98",X"C9",X"05",X"85",X"D2",X"C0",X"00",X"40",X"6E",X"E2",X"C9",X"00",X"85",X"CE",X"85", + X"CF",X"85",X"E6",X"C5",X"21",X"B0",X"04",X"C9",X"64",X"85",X"21",X"F8",X"18",X"C5",X"CE",X"65", + X"D2",X"85",X"CE",X"C5",X"CF",X"69",X"00",X"85",X"CF",X"A6",X"21",X"B0",X"EF",X"B8",X"C5",X"CF", + X"40",X"83",X"E8",X"C5",X"CE",X"40",X"83",X"E8",X"C0",X"02",X"C2",X"00",X"58",X"C9",X"30",X"E9", + X"1B",X"81",X"DD",X"E6",X"DD",X"88",X"B0",X"F2",X"C2",X"30",X"40",X"ED",X"E6",X"F8",X"18",X"C5", + X"1C",X"65",X"CE",X"85",X"1C",X"C5",X"1D",X"65",X"CF",X"85",X"1D",X"B8",X"40",X"61",X"DB",X"40", + X"29",X"DC",X"60",X"28",X"2A",X"2A",X"2A",X"2A",X"CA",X"F0",X"04",X"C9",X"FF",X"85",X"E6",X"C5", + X"E6",X"F0",X"0C",X"58",X"DD",X"E3",X"E2",X"E9",X"1B",X"C2",X"00",X"81",X"DD",X"E6",X"DD",X"68", + X"49",X"0F",X"CA",X"F0",X"04",X"C9",X"FF",X"85",X"E6",X"C5",X"E6",X"F0",X"0C",X"58",X"DD",X"E3", + X"E2",X"E9",X"1B",X"C2",X"00",X"81",X"DD",X"E6",X"DD",X"60",X"C9",X"F3",X"85",X"97",X"C9",X"E2", + X"85",X"98",X"60",X"40",X"6D",X"EA",X"8D",X"01",X"10",X"C9",X"06",X"85",X"B6",X"C9",X"06",X"85", + X"CD",X"C9",X"63",X"85",X"97",X"C9",X"E4",X"85",X"98",X"C0",X"00",X"40",X"6E",X"E2",X"C5",X"10", + X"85",X"B7",X"C9",X"A6",X"85",X"97",X"C9",X"E4",X"85",X"98",X"C0",X"00",X"40",X"6E",X"E2",X"CD", + X"0A",X"04",X"40",X"42",X"E9",X"C9",X"7F",X"85",X"97",X"C9",X"E5",X"85",X"98",X"C0",X"00",X"40", + X"6E",X"E2",X"C5",X"11",X"F0",X"22",X"85",X"B7",X"C9",X"B7",X"85",X"97",X"C9",X"E4",X"85",X"98", + X"C0",X"00",X"40",X"6E",X"E2",X"CD",X"2A",X"04",X"40",X"42",X"E9",X"C9",X"8C",X"85",X"97",X"C9", + X"E5",X"85",X"98",X"C0",X"00",X"40",X"6E",X"E2",X"C9",X"09",X"8D",X"02",X"10",X"40",X"5F",X"E9", + X"F8",X"C5",X"B6",X"E9",X"01",X"85",X"B6",X"B8",X"10",X"EE",X"C2",X"60",X"C9",X"00",X"40",X"E1", + X"C2",X"60",X"28",X"C9",X"00",X"85",X"B7",X"68",X"CA",X"F0",X"06",X"40",X"55",X"E9",X"AA",X"B0", + X"FA",X"40",X"55",X"E9",X"60",X"F8",X"18",X"C5",X"B7",X"69",X"01",X"85",X"B7",X"B8",X"60",X"C2", + X"40",X"CD",X"00",X"10",X"10",X"FB",X"8A",X"28",X"C5",X"05",X"B0",X"0A",X"C9",X"76",X"85",X"97", + X"C9",X"E4",X"85",X"98",X"B0",X"08",X"C9",X"98",X"85",X"97",X"C9",X"E4",X"85",X"98",X"C0",X"00", + X"40",X"6E",X"E2",X"C9",X"01",X"85",X"C1",X"C9",X"84",X"85",X"97",X"C9",X"E4",X"85",X"98",X"C5", + X"B6",X"85",X"B7",X"C0",X"00",X"40",X"6E",X"E2",X"C9",X"00",X"85",X"C1",X"40",X"BA",X"E8",X"C9", + X"20",X"85",X"CD",X"C5",X"05",X"85",X"B7",X"C0",X"00",X"40",X"6E",X"E2",X"40",X"C1",X"E9",X"C9", + X"06",X"85",X"CD",X"68",X"CA",X"CD",X"00",X"10",X"10",X"FB",X"40",X"18",X"EB",X"AA",X"10",X"A1", + X"60",X"C5",X"05",X"F0",X"56",X"CD",X"04",X"10",X"29",X"FF",X"49",X"18",X"F0",X"4D",X"A9",X"08", + X"F0",X"19",X"A9",X"10",X"B0",X"45",X"C5",X"05",X"A9",X"02",X"90",X"3F",X"C9",X"00",X"85",X"08", + X"E6",X"08",X"40",X"7F",X"EA",X"40",X"FB",X"DB",X"2C",X"EF",X"E9",X"C9",X"00",X"85",X"08",X"E6", + X"08",X"40",X"75",X"EA",X"40",X"FB",X"DB",X"C9",X"01",X"85",X"07",X"C2",X"FF",X"9A",X"40",X"CB", + X"DC",X"40",X"1C",X"EA",X"C2",X"01",X"40",X"A6",X"DC",X"C9",X"00",X"8D",X"02",X"10",X"C2",X"01", + X"40",X"A6",X"DC",X"C9",X"00",X"40",X"C3",X"C2",X"2C",X"37",X"C1",X"60",X"C2",X"2C",X"C9",X"00", + X"95",X"00",X"E8",X"E0",X"F1",X"B0",X"F9",X"85",X"1A",X"85",X"1B",X"85",X"1C",X"85",X"1D",X"85", + X"1E",X"85",X"1F",X"85",X"21",X"C2",X"07",X"9D",X"02",X"04",X"9D",X"22",X"04",X"AA",X"10",X"F7", + X"8D",X"11",X"04",X"8D",X"12",X"04",X"8D",X"31",X"04",X"8D",X"32",X"04",X"CD",X"0C",X"04",X"09", + X"3F",X"8D",X"0C",X"04",X"CD",X"2C",X"04",X"09",X"3F",X"8D",X"2C",X"04",X"CD",X"00",X"04",X"49", + X"44",X"8D",X"00",X"04",X"CD",X"20",X"04",X"49",X"44",X"8D",X"20",X"04",X"60",X"C2",X"60",X"C9", + X"00",X"40",X"E1",X"C2",X"60",X"F8",X"18",X"C5",X"10",X"69",X"01",X"85",X"10",X"B8",X"60",X"F8", + X"18",X"C5",X"11",X"69",X"01",X"85",X"11",X"B8",X"60",X"C9",X"00",X"85",X"C6",X"40",X"E2",X"EA", + X"E6",X"C6",X"C5",X"C6",X"0A",X"CA",X"E0",X"06",X"90",X"F3",X"8A",X"28",X"40",X"BA",X"E8",X"40", + X"F2",X"EA",X"40",X"6D",X"EA",X"68",X"CA",X"40",X"E2",X"EA",X"40",X"BA",X"E8",X"40",X"C8",X"E6", + X"E6",X"C6",X"C5",X"C6",X"0A",X"CA",X"E0",X"0C",X"90",X"ED",X"40",X"E2",X"EA",X"E6",X"C6",X"C5", + X"C6",X"0A",X"CA",X"E0",X"10",X"90",X"F3",X"8A",X"28",X"40",X"BA",X"E8",X"40",X"C8",X"E6",X"68", + X"CA",X"40",X"E2",X"EA",X"E6",X"C6",X"C5",X"C6",X"0A",X"CA",X"E0",X"16",X"90",X"F3",X"40",X"F2", + X"EA",X"60",X"DD",X"02",X"EB",X"85",X"97",X"DD",X"03",X"EB",X"85",X"98",X"C0",X"00",X"40",X"6E", + X"E2",X"60",X"40",X"BA",X"E8",X"40",X"C8",X"E6",X"40",X"C8",X"E6",X"40",X"C8",X"E6",X"40",X"C8", + X"E6",X"60",X"C8",X"E4",X"E1",X"E4",X"70",X"E5",X"FE",X"E4",X"11",X"E5",X"31",X"E5",X"51",X"E5", + X"76",X"E5",X"99",X"E5",X"B6",X"E5",X"D3",X"E5",X"40",X"5C",X"C0",X"CD",X"04",X"10",X"2A",X"90", + X"01",X"60",X"40",X"DE",X"C2",X"85",X"09",X"85",X"08",X"85",X"07",X"C2",X"18",X"40",X"B2",X"C2", + X"40",X"BA",X"C2",X"C9",X"20",X"85",X"CD",X"C9",X"E2",X"85",X"97",X"C9",X"E5",X"85",X"98",X"C0", + X"00",X"40",X"6E",X"E2",X"C9",X"00",X"8D",X"00",X"54",X"8D",X"02",X"10",X"C5",X"05",X"F0",X"09", + X"F8",X"C5",X"05",X"58",X"E9",X"01",X"85",X"05",X"B8",X"C2",X"00",X"CD",X"00",X"10",X"10",X"FB", + X"8A",X"28",X"40",X"BA",X"E8",X"C5",X"05",X"85",X"B7",X"C0",X"00",X"40",X"6E",X"E2",X"68",X"CA", + X"CD",X"00",X"10",X"50",X"FB",X"40",X"5C",X"C0",X"AA",X"B0",X"E0",X"40",X"6D",X"EA",X"C9",X"00", + X"8D",X"01",X"10",X"C2",X"FF",X"9A",X"2C",X"2E",X"C1",X"40",X"33",X"D5",X"40",X"F0",X"D5",X"40", + X"82",X"C2",X"40",X"94",X"C1",X"40",X"2B",X"EE",X"40",X"DD",X"EB",X"40",X"33",X"C3",X"40",X"47", + X"EC",X"40",X"B2",X"CB",X"40",X"32",X"ED",X"40",X"D0",X"C6",X"40",X"9E",X"CC",X"40",X"E1",X"C6", + X"40",X"A6",X"CD",X"40",X"26",X"C4",X"40",X"50",X"DA",X"40",X"9E",X"C2",X"C5",X"33",X"10",X"CF", + X"C9",X"00",X"85",X"18",X"85",X"33",X"E6",X"2C",X"C5",X"2C",X"49",X"03",X"A9",X"03",X"B0",X"B9", + X"C9",X"00",X"85",X"2C",X"85",X"2D",X"85",X"2E",X"85",X"2F",X"85",X"1F",X"60",X"C5",X"2C",X"49", + X"10",X"F0",X"3B",X"C5",X"7A",X"49",X"68",X"B0",X"35",X"C5",X"2D",X"B0",X"2F",X"C5",X"2E",X"0A", + X"CA",X"DD",X"1F",X"EC",X"85",X"37",X"DD",X"20",X"EC",X"85",X"2D",X"E6",X"2E",X"C5",X"2E",X"A9", + X"06",X"B0",X"19",X"40",X"89",X"D9",X"C2",X"7F",X"40",X"CA",X"E6",X"C2",X"40",X"40",X"CA",X"E6", + X"C9",X"00",X"CA",X"9D",X"00",X"42",X"9D",X"00",X"43",X"E8",X"B0",X"F7",X"A6",X"2D",X"60",X"04", + X"40",X"00",X"40",X"06",X"15",X"10",X"01",X"00",X"20",X"05",X"10",X"00",X"18",X"05",X"10",X"06", + X"50",X"04",X"90",X"10",X"10",X"06",X"24",X"10",X"10",X"05",X"30",X"00",X"3C",X"05",X"20",X"02", + X"28",X"04",X"00",X"04",X"00",X"00",X"00",X"C5",X"2C",X"49",X"20",X"B0",X"2A",X"C2",X"00",X"86", + X"E9",X"40",X"1B",X"D4",X"40",X"78",X"EC",X"C5",X"97",X"F0",X"09",X"40",X"13",X"C5",X"40",X"0B", + X"ED",X"40",X"8D",X"C8",X"40",X"30",X"D4",X"C5",X"2C",X"49",X"10",X"F0",X"0A",X"C5",X"E9",X"18", + X"69",X"10",X"CA",X"A9",X"40",X"90",X"D8",X"60",X"C5",X"2C",X"49",X"10",X"F0",X"34",X"C5",X"97", + X"B0",X"30",X"40",X"F9",X"D1",X"C5",X"2F",X"0A",X"0A",X"CA",X"DD",X"B5",X"EC",X"A5",X"24",X"B0", + X"21",X"DD",X"B6",X"EC",X"A5",X"23",X"90",X"1A",X"C9",X"80",X"85",X"97",X"DD",X"B4",X"EC",X"85", + X"98",X"C9",X"08",X"85",X"99",X"DD",X"B3",X"EC",X"85",X"A1",X"CA",X"DD",X"98",X"CA",X"85",X"9C", + X"E6",X"2F",X"60",X"00",X"88",X"7E",X"F0",X"02",X"B0",X"7E",X"F0",X"01",X"48",X"7D",X"80",X"07", + X"80",X"7D",X"10",X"07",X"78",X"7C",X"78",X"02",X"98",X"7C",X"10",X"05",X"80",X"7A",X"E0",X"04", + X"70",X"79",X"10",X"00",X"50",X"77",X"F0",X"09",X"90",X"75",X"E0",X"08",X"34",X"71",X"10",X"04", + X"90",X"6E",X"E0",X"01",X"58",X"6E",X"80",X"08",X"80",X"6D",X"A0",X"04",X"88",X"6A",X"40",X"00", + X"88",X"6B",X"10",X"05",X"B8",X"6A",X"E0",X"04",X"88",X"6A",X"40",X"06",X"A0",X"6A",X"80",X"07", + X"88",X"6A",X"E0",X"07",X"70",X"6A",X"C0",X"FF",X"FF",X"FF",X"FF",X"C5",X"97",X"49",X"60",X"B0", + X"20",X"C5",X"A1",X"A9",X"07",X"B0",X"0B",X"C5",X"98",X"85",X"17",X"40",X"E7",X"CF",X"40",X"42", + X"CC",X"60",X"C5",X"99",X"18",X"69",X"02",X"85",X"99",X"A9",X"F8",X"90",X"04",X"C9",X"00",X"85", + X"97",X"60",X"C5",X"2C",X"49",X"10",X"B0",X"06",X"40",X"3F",X"ED",X"40",X"7A",X"ED",X"60",X"C5", + X"2C",X"49",X"08",X"B0",X"31",X"C9",X"80",X"85",X"3A",X"C9",X"50",X"85",X"3B",X"C9",X"08",X"85", + X"3C",X"C6",X"1F",X"DD",X"77",X"ED",X"85",X"44",X"CA",X"DD",X"98",X"CA",X"85",X"3F",X"C9",X"80", + X"85",X"2F",X"C9",X"04",X"85",X"37",X"C9",X"58",X"85",X"7B",X"C9",X"00",X"85",X"96",X"E6",X"1F", + X"C5",X"2C",X"09",X"08",X"85",X"2C",X"60",X"00",X"02",X"08",X"C5",X"3A",X"F0",X"01",X"60",X"C6", + X"1F",X"DD",X"18",X"EE",X"85",X"D5",X"DD",X"27",X"EE",X"85",X"3C",X"E8",X"DD",X"18",X"EE",X"85", + X"D4",X"C9",X"00",X"85",X"D3",X"C9",X"A0",X"85",X"3B",X"C6",X"D5",X"C5",X"3C",X"18",X"69",X"18", + X"85",X"3C",X"DD",X"1D",X"EE",X"85",X"44",X"C5",X"2C",X"49",X"04",X"B0",X"0A",X"C2",X"00",X"40", + X"CB",X"CD",X"C9",X"FF",X"8D",X"03",X"03",X"C4",X"D3",X"C9",X"01",X"99",X"84",X"04",X"C6",X"44", + X"DD",X"98",X"CA",X"99",X"85",X"04",X"C5",X"3B",X"29",X"FF",X"99",X"86",X"04",X"C5",X"3C",X"99", + X"87",X"04",X"C5",X"D3",X"18",X"69",X"04",X"85",X"D3",X"E6",X"D5",X"C5",X"D5",X"A5",X"D4",X"90", + X"B8",X"C5",X"2C",X"09",X"04",X"85",X"2C",X"40",X"C1",X"CD",X"A6",X"2F",X"B0",X"29",X"C2",X"60", + X"C9",X"20",X"85",X"CD",X"40",X"BA",X"E8",X"40",X"CA",X"E6",X"40",X"04",X"C3",X"C5",X"2C",X"49", + X"F3",X"85",X"2C",X"C9",X"E0",X"85",X"7C",X"C5",X"1F",X"A9",X"03",X"90",X"0A",X"C5",X"2C",X"09", + X"10",X"85",X"2C",X"C9",X"90",X"85",X"7B",X"60",X"00",X"00",X"02",X"07",X"0A",X"00",X"04",X"01", + X"02",X"03",X"05",X"07",X"06",X"08",X"09",X"00",X"68",X"38",X"58",X"40",X"BA",X"E8",X"C9",X"20", + X"85",X"CD",X"C5",X"05",X"85",X"B7",X"C0",X"00",X"40",X"6E",X"E2",X"60",X"C2",X"60",X"C9",X"00", + X"85",X"10",X"85",X"11",X"40",X"E1",X"C2",X"C0",X"1A",X"D9",X"67",X"EE",X"99",X"03",X"41",X"F0", + X"05",X"C9",X"02",X"99",X"03",X"45",X"D9",X"82",X"EE",X"99",X"23",X"41",X"F0",X"05",X"C9",X"02", + X"99",X"23",X"45",X"88",X"10",X"E3",X"60",X"20",X"21",X"24",X"25",X"28",X"29",X"2C",X"2D",X"30", + X"2C",X"2D",X"38",X"00",X"28",X"29",X"24",X"25",X"20",X"21",X"20",X"21",X"34",X"35",X"28",X"29", + X"48",X"49",X"22",X"23",X"26",X"27",X"2A",X"2B",X"2E",X"2F",X"32",X"2E",X"2F",X"3A",X"00",X"2A", + X"2B",X"26",X"27",X"22",X"23",X"22",X"23",X"36",X"37",X"2A",X"2B",X"00",X"00",X"22",X"10",X"00", + X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00",X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00", + X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00",X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00", + X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00",X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00", + X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00",X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00", + X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00",X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00", + X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00",X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00", + X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00",X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00", + X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00",X"00",X"00",X"00",X"01",X"22",X"33",X"3F",X"00", + X"00",X"00",X"00",X"F3",X"33",X"33",X"3F",X"00",X"00",X"00",X"00",X"83",X"33",X"33",X"3F",X"00", + X"00",X"00",X"08",X"33",X"33",X"33",X"3F",X"00",X"00",X"00",X"04",X"33",X"33",X"33",X"40",X"00", + X"00",X"00",X"00",X"43",X"33",X"33",X"80",X"00",X"00",X"00",X"00",X"04",X"33",X"33",X"38",X"00", + X"00",X"00",X"00",X"08",X"33",X"33",X"33",X"80",X"00",X"00",X"00",X"04",X"33",X"33",X"33",X"3F", + X"00",X"00",X"00",X"08",X"33",X"33",X"33",X"3F",X"00",X"00",X"00",X"04",X"33",X"33",X"33",X"3F", + X"00",X"00",X"00",X"08",X"33",X"33",X"33",X"3F",X"00",X"00",X"00",X"04",X"33",X"33",X"33",X"40", + X"00",X"00",X"00",X"08",X"33",X"33",X"34",X"00",X"00",X"00",X"00",X"F3",X"33",X"33",X"3F",X"00", + X"00",X"00",X"00",X"83",X"33",X"33",X"3F",X"00",X"00",X"00",X"00",X"43",X"33",X"22",X"10",X"00", + X"00",X"00",X"00",X"01",X"22",X"22",X"18",X"00",X"00",X"00",X"00",X"81",X"22",X"22",X"13",X"F0", + X"00",X"00",X"08",X"31",X"22",X"22",X"13",X"F0",X"00",X"00",X"F3",X"31",X"22",X"22",X"13",X"F0", + X"00",X"00",X"F3",X"31",X"22",X"22",X"13",X"F0",X"00",X"00",X"F3",X"31",X"22",X"22",X"13",X"F0", + X"00",X"00",X"F3",X"31",X"22",X"22",X"14",X"00",X"00",X"00",X"F3",X"31",X"22",X"22",X"18",X"00", + X"00",X"00",X"F3",X"31",X"22",X"22",X"13",X"80",X"00",X"00",X"04",X"31",X"22",X"22",X"13",X"38", + X"00",X"00",X"00",X"41",X"22",X"22",X"13",X"33",X"F0",X"00",X"00",X"F1",X"22",X"22",X"13",X"33", + X"F0",X"00",X"00",X"F1",X"22",X"22",X"13",X"34",X"00",X"00",X"00",X"01",X"22",X"22",X"13",X"40", + X"00",X"00",X"00",X"01",X"22",X"22",X"14",X"00",X"00",X"00",X"00",X"01",X"22",X"33",X"33",X"38", + X"00",X"00",X"83",X"33",X"33",X"33",X"33",X"34",X"00",X"00",X"43",X"33",X"33",X"33",X"33",X"40", + X"00",X"00",X"83",X"33",X"33",X"33",X"33",X"F0",X"00",X"00",X"43",X"33",X"33",X"66",X"63",X"F0", + X"00",X"00",X"83",X"33",X"33",X"DD",X"C3",X"F0",X"00",X"00",X"43",X"33",X"33",X"DD",X"C3",X"F0", + X"00",X"00",X"83",X"33",X"33",X"DD",X"C3",X"F0",X"00",X"00",X"43",X"33",X"33",X"AA",X"A3",X"F0", + X"00",X"00",X"83",X"33",X"33",X"33",X"33",X"F0",X"00",X"0F",X"33",X"33",X"33",X"33",X"33",X"F0", + X"00",X"08",X"33",X"33",X"33",X"33",X"33",X"F0",X"00",X"04",X"33",X"33",X"33",X"33",X"33",X"F0", + X"00",X"00",X"43",X"33",X"33",X"33",X"33",X"F0",X"00",X"00",X"04",X"33",X"33",X"33",X"34",X"00", + X"00",X"00",X"00",X"43",X"33",X"33",X"3F",X"00",X"00",X"00",X"00",X"F3",X"33",X"DD",X"59",X"AD", + X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"50",X"9D",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"50",X"9D", + X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"50",X"9D",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"50",X"9D", + X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"50",X"9D",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"50",X"9D", + X"DD",X"DD",X"DD",X"DD",X"DD",X"AA",X"50",X"9A",X"AA",X"AA",X"AA",X"AA",X"AA",X"33",X"F0",X"00", + X"00",X"E0",X"00",X"0F",X"33",X"33",X"F0",X"00",X"00",X"00",X"00",X"0F",X"33",X"33",X"F0",X"00", + X"00",X"00",X"00",X"0F",X"33",X"33",X"F0",X"00",X"00",X"00",X"00",X"0F",X"33",X"33",X"F0",X"00", + X"00",X"00",X"00",X"08",X"33",X"33",X"F0",X"00",X"00",X"00",X"00",X"83",X"33",X"33",X"F0",X"00", + X"00",X"00",X"08",X"33",X"33",X"33",X"33",X"3F",X"00",X"00",X"F3",X"33",X"33",X"33",X"F0",X"33", + X"3F",X"00",X"00",X"83",X"33",X"33",X"F0",X"33",X"3F",X"00",X"00",X"43",X"33",X"33",X"F0",X"33", + X"3F",X"00",X"00",X"F3",X"33",X"33",X"F0",X"33",X"3F",X"00",X"00",X"04",X"33",X"33",X"F0",X"33", + X"3F",X"00",X"00",X"08",X"33",X"33",X"F0",X"33",X"3F",X"00",X"00",X"04",X"33",X"33",X"F0",X"33", + X"3F",X"00",X"00",X"08",X"33",X"33",X"F0",X"33",X"3F",X"00",X"00",X"E4",X"33",X"33",X"F0",X"33", + X"3F",X"00",X"00",X"08",X"33",X"33",X"F0",X"33",X"40",X"00",X"00",X"83",X"33",X"33",X"F0",X"34", + X"00",X"00",X"08",X"33",X"33",X"33",X"F0",X"4E",X"00",X"00",X"83",X"33",X"33",X"33",X"F0",X"00", + X"00",X"00",X"43",X"33",X"33",X"33",X"F0",X"00",X"00",X"00",X"04",X"33",X"33",X"33",X"80",X"00", + X"00",X"00",X"00",X"43",X"33",X"33",X"3F",X"00",X"00",X"00",X"00",X"F3",X"33",X"33",X"3F",X"00", + X"00",X"00",X"00",X"F3",X"33",X"33",X"3F",X"00",X"00",X"00",X"E0",X"F3",X"33",X"33",X"40",X"00", + X"00",X"00",X"00",X"F3",X"33",X"33",X"80",X"00",X"00",X"00",X"00",X"F3",X"33",X"33",X"40",X"00", + X"00",X"00",X"00",X"F3",X"33",X"33",X"8E",X"00",X"00",X"00",X"00",X"F3",X"33",X"33",X"30",X"00", + X"00",X"00",X"00",X"F3",X"33",X"33",X"F0",X"00",X"00",X"00",X"00",X"F3",X"33",X"33",X"F0",X"08", + X"00",X"00",X"00",X"F3",X"33",X"33",X"F0",X"03",X"80",X"00",X"00",X"F3",X"33",X"33",X"F0",X"33", + X"3F",X"00",X"00",X"F3",X"33",X"33",X"F0",X"33",X"3F",X"00",X"00",X"04",X"33",X"33",X"F0",X"33", + X"3F",X"00",X"00",X"00",X"43",X"33",X"F0",X"33",X"3F",X"00",X"00",X"00",X"83",X"33",X"F0",X"33", + X"3F",X"00",X"00",X"08",X"33",X"33",X"F0",X"33",X"3F",X"00",X"00",X"04",X"33",X"33",X"3F",X"00", + X"00",X"00",X"00",X"F3",X"33",X"33",X"40",X"00",X"00",X"00",X"00",X"04",X"33",X"33",X"80",X"00", + X"00",X"00",X"00",X"08",X"33",X"33",X"40",X"00",X"00",X"00",X"00",X"04",X"33",X"33",X"80",X"00", + X"00",X"00",X"00",X"08",X"33",X"33",X"40",X"00",X"00",X"00",X"00",X"04",X"33",X"33",X"80",X"00", + X"00",X"00",X"00",X"08",X"33",X"33",X"40",X"00",X"00",X"00",X"00",X"04",X"33",X"33",X"80",X"00", + X"00",X"00",X"00",X"08",X"33",X"33",X"40",X"00",X"00",X"00",X"00",X"04",X"33",X"33",X"80",X"00", + X"00",X"00",X"00",X"08",X"33",X"33",X"40",X"00",X"00",X"00",X"00",X"04",X"33",X"33",X"80",X"00", + X"00",X"00",X"00",X"08",X"33",X"33",X"40",X"00",X"00",X"00",X"00",X"04",X"33",X"33",X"80",X"00", + X"00",X"00",X"00",X"08",X"33",X"33",X"3F",X"00",X"00",X"00",X"00",X"F3",X"33",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"AA",X"AA",X"B1",X"00",X"00",X"00",X"01",X"BA",X"22",X"10",X"00", + X"00",X"00",X"00",X"01",X"22",X"22",X"10",X"00",X"00",X"00",X"00",X"01",X"22",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"00",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"00",X"CD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"00",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"00",X"CD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"00",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C0",X"00",X"00",X"00",X"00",X"CD",X"DD",X"DD",X"C0", + X"00",X"00",X"00",X"00",X"CD",X"DD",X"DD",X"C0",X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C0", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"33",X"3F",X"00", + X"00",X"00",X"00",X"83",X"33",X"33",X"38",X"00",X"00",X"00",X"00",X"43",X"33",X"33",X"34",X"00", + X"00",X"00",X"00",X"83",X"33",X"33",X"38",X"00",X"00",X"00",X"00",X"43",X"33",X"33",X"34",X"E0", + X"00",X"00",X"00",X"83",X"33",X"33",X"38",X"00",X"00",X"00",X"00",X"43",X"33",X"33",X"34",X"00", + X"00",X"00",X"00",X"83",X"33",X"33",X"38",X"00",X"00",X"00",X"00",X"43",X"33",X"33",X"34",X"00", + X"00",X"00",X"00",X"83",X"33",X"33",X"38",X"00",X"00",X"00",X"00",X"43",X"33",X"33",X"34",X"00", + X"00",X"00",X"00",X"83",X"33",X"33",X"3F",X"00",X"00",X"00",X"00",X"43",X"33",X"33",X"38",X"00", + X"00",X"00",X"00",X"F3",X"33",X"66",X"66",X"71",X"00",X"00",X"00",X"01",X"76",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"22",X"10",X"00", + X"00",X"00",X"00",X"01",X"22",X"22",X"E0",X"00",X"00",X"00",X"00",X"01",X"22",X"22",X"00",X"00", + X"00",X"00",X"00",X"01",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"01",X"22",X"22",X"00",X"00", + X"00",X"00",X"00",X"01",X"22",X"66",X"59",X"66",X"66",X"66",X"66",X"66",X"66",X"DD",X"50",X"9D", + X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"50",X"9D",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"50",X"9D", + X"DA",X"AA",X"DD",X"DD",X"DD",X"DD",X"50",X"9D",X"C0",X"00",X"CD",X"DD",X"DD",X"DD",X"59",X"6D", + X"C0",X"00",X"CD",X"DD",X"DD",X"DD",X"59",X"DD",X"C0",X"00",X"CD",X"DD",X"DD",X"DD",X"59",X"DD", + X"C0",X"00",X"CD",X"DD",X"DD",X"DD",X"59",X"DD",X"C0",X"00",X"CD",X"DD",X"DD",X"DD",X"59",X"DD", + X"C0",X"00",X"CD",X"DD",X"DD",X"DD",X"59",X"DD",X"D6",X"66",X"DD",X"DD",X"DD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"D6",X"66",X"66",X"66",X"66",X"DD",X"DD",X"DD",X"DD", + X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD", + X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD", + X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD", + X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD", + X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"DA",X"AA",X"AA",X"AA",X"AA",X"DD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1", + X"00",X"00",X"00",X"01",X"CD",X"DD",X"DD",X"C1",X"00",X"00",X"00",X"01",X"CD",X"22",X"10",X"00", + X"00",X"00",X"00",X"81",X"22",X"22",X"10",X"00",X"00",X"00",X"08",X"31",X"22",X"22",X"10",X"00", + X"00",X"00",X"F3",X"31",X"22",X"22",X"10",X"00",X"00",X"00",X"F3",X"31",X"22",X"22",X"1F",X"00", + X"00",X"00",X"F3",X"31",X"22",X"22",X"1F",X"00",X"00",X"00",X"F3",X"31",X"22",X"22",X"1F",X"00", + X"00",X"00",X"F3",X"31",X"22",X"22",X"1F",X"00",X"00",X"00",X"04",X"31",X"22",X"22",X"18",X"00", + X"00",X"00",X"00",X"41",X"22",X"22",X"13",X"80",X"00",X"00",X"00",X"F1",X"22",X"22",X"13",X"38", + X"00",X"00",X"00",X"01",X"22",X"22",X"13",X"33",X"F0",X"00",X"00",X"E1",X"22",X"22",X"13",X"33", + X"F0",X"00",X"00",X"01",X"22",X"22",X"13",X"34",X"00",X"00",X"00",X"01",X"22",X"22",X"13",X"40", + X"00",X"00",X"00",X"01",X"22",X"22",X"14",X"00",X"00",X"00",X"00",X"01",X"22",X"DA",X"59",X"DD", + X"DD",X"DD",X"DD",X"DD",X"DD",X"D5",X"09",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"D5",X"09",X"DD", + X"DD",X"DD",X"DD",X"DD",X"DD",X"D5",X"09",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"D5",X"09",X"DD", + X"DD",X"DD",X"DD",X"DD",X"DD",X"D5",X"09",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"D5",X"09",X"DD", + X"AA",X"AA",X"AA",X"AA",X"DD",X"D5",X"09",X"DD",X"50",X"00",X"00",X"00",X"5D",X"D5",X"09",X"DD", + X"50",X"00",X"00",X"00",X"5D",X"D5",X"09",X"DD",X"50",X"00",X"00",X"00",X"5D",X"D5",X"09",X"DD", + X"50",X"00",X"00",X"00",X"5D",X"D5",X"09",X"DD",X"50",X"00",X"00",X"00",X"5D",X"D5",X"09",X"DD", + X"D6",X"90",X"00",X"00",X"5D",X"D5",X"09",X"DD",X"DD",X"90",X"00",X"00",X"5D",X"D5",X"09",X"DD", + X"DD",X"D6",X"66",X"66",X"DD",X"D6",X"59",X"DD",X"DD",X"DD",X"DD",X"DD",X"DD",X"34",X"00",X"33", + X"3F",X"E0",X"00",X"08",X"33",X"40",X"00",X"33",X"3F",X"00",X"00",X"04",X"33",X"80",X"00",X"33", + X"38",X"00",X"00",X"00",X"43",X"40",X"00",X"33",X"34",X"00",X"00",X"00",X"04",X"80",X"00",X"33", + X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"34",X"00",X"00",X"00",X"00",X"00",X"00",X"33", + X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"66",X"66",X"66",X"33",X"00",X"00",X"33", + X"33",X"AA",X"AA",X"AA",X"33",X"00",X"00",X"33",X"34",X"00",X"00",X"0F",X"33",X"80",X"00",X"33", + X"38",X"00",X"00",X"0F",X"33",X"3F",X"00",X"33",X"34",X"00",X"00",X"08",X"33",X"3F",X"00",X"33", + X"38",X"00",X"00",X"83",X"33",X"3F",X"00",X"33",X"34",X"00",X"00",X"43",X"33",X"3F",X"00",X"33", + X"3F",X"00",X"00",X"83",X"33",X"38",X"00",X"33",X"3F",X"E0",X"00",X"43",X"33",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"3F",X"CF",X"FF",X"EF",X"FF",X"AF",X"AF",X"AF",X"AF", + X"6F",X"DF",X"6F",X"DF",X"EF",X"FF",X"CF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"7F",X"0F",X"6F",X"FF",X"6F",X"CF",X"7F", + X"CF",X"7F",X"CF",X"6F",X"FF",X"6F",X"FF",X"7F",X"8F",X"1F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"02",X"02",X"06",X"06",X"0E",X"0E",X"06",X"06",X"06", + X"00",X"00",X"00",X"00",X"00",X"86",X"0E",X"CF",X"04",X"C8",X"00",X"4F",X"0F",X"C0",X"00",X"C0", + X"00",X"00",X"00",X"00",X"01",X"09",X"0A",X"02",X"06",X"00",X"00",X"0F",X"0F",X"00",X"03",X"00", + X"00",X"08",X"E0",X"02",X"F0",X"30",X"F4",X"74",X"04",X"C6",X"A6",X"87",X"A7",X"A6",X"A6",X"A6", + X"00",X"40",X"00",X"40",X"00",X"40",X"00",X"C2",X"00",X"C0",X"02",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"50",X"D0",X"50",X"D0",X"40",X"90",X"01",X"C0",X"F0",X"70",X"F0",X"30",X"E0",X"08",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"30",X"F0",X"FA",X"D0",X"B0",X"10",X"D0", + X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"20",X"00", + X"18",X"D0",X"D0",X"B0",X"F8",X"F0",X"F0",X"32",X"04",X"04",X"02",X"02",X"00",X"00",X"00",X"08", + X"00",X"01",X"00",X"01",X"00",X"00",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"08", + X"21",X"20",X"80",X"30",X"00",X"10",X"00",X"40",X"00",X"00",X"0C",X"1E",X"0E",X"0F",X"0F",X"0F", + X"50",X"00",X"00",X"08",X"00",X"08",X"08",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0E",X"0B",X"0A",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"CF", + X"C7",X"F5",X"E5",X"FF",X"6F",X"0F",X"EF",X"7F",X"6F",X"FF",X"6F",X"CF",X"6F",X"CF",X"6F",X"1F", + X"0F",X"0A",X"0A",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"0F", + X"FF",X"35",X"F5",X"FF",X"FF",X"FF",X"0F",X"FF",X"AF",X"8F",X"AF",X"AF",X"FF",X"BF",X"6F",X"8F", + X"60",X"10",X"62",X"C2",X"68",X"C1",X"6A",X"F0",X"E8",X"71",X"61",X"04",X"E0",X"F1",X"C0",X"F4", + X"0C",X"C9",X"0A",X"0D",X"04",X"0D",X"04",X"0E",X"0D",X"0A",X"05",X"09",X"04",X"0A",X"05",X"0E", + X"6F",X"8D",X"FD",X"BF",X"AF",X"A7",X"AF",X"8F",X"0F",X"FF",X"FF",X"FE",X"FF",X"FB",X"FF",X"3F", + X"1F",X"0E",X"0D",X"0E",X"0F",X"0F",X"0F",X"0E",X"0E",X"0B",X"0F",X"0F",X"0D",X"0F",X"0F",X"0D", + X"08",X"02",X"08",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"01",X"08",X"00",X"00",X"00",X"00", + X"02",X"05",X"0B",X"02",X"F4",X"30",X"F9",X"F0",X"90",X"10",X"10",X"12",X"51",X"3E",X"70",X"B0", + X"07",X"0E",X"0D",X"0D",X"0F",X"0B",X"0F",X"05",X"04",X"00",X"09",X"00",X"0D",X"42",X"08",X"00", + X"0F",X"0B",X"87",X"06",X"0B",X"03",X"1D",X"03",X"11",X"0C",X"1B",X"82",X"9A",X"10",X"15",X"68", + X"70",X"B0",X"50",X"31",X"13",X"13",X"93",X"17",X"FF",X"FF",X"FF",X"3F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"06",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"10",X"60",X"90",X"10",X"10",X"80",X"10",X"00",X"10",X"01",X"03",X"03",X"87",X"0F",X"0F",X"0F", + X"00",X"01",X"02",X"41",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07", + X"0F",X"EF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"EA",X"CB",X"FE", + X"EF",X"FF",X"7F",X"8F",X"7F",X"FF",X"FF",X"FF",X"7F",X"FF",X"6F",X"CF",X"4F",X"C5",X"05",X"07", + X"3F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"3F",X"0A",X"FA",X"0F", + X"FF",X"FF",X"1F",X"EF",X"4F",X"8F",X"2F",X"9F",X"AF",X"8F",X"AF",X"AF",X"FF",X"B5",X"05",X"9F", + X"0B",X"0D",X"4F",X"CF",X"6D",X"CD",X"76",X"FE",X"FD",X"FF",X"7F",X"FF",X"7B",X"8D",X"EF",X"F7", + X"CF",X"FE",X"07",X"EF",X"06",X"0F",X"0F",X"07",X"0F",X"05",X"0F",X"0E",X"07",X"0B",X"0F",X"EE", + X"0F",X"96",X"FB",X"B7",X"AD",X"AF",X"A5",X"8F",X"2B",X"9B",X"47",X"8D",X"1B",X"EB",X"F7",X"FF", + X"F7",X"03",X"31",X"00",X"00",X"00",X"0B",X"08",X"00",X"05",X"09",X"09",X"00",X"02",X"38",X"03", + X"0B",X"87",X"0F",X"CD",X"07",X"0A",X"0E",X"07",X"0B",X"05",X"0A",X"07",X"03",X"00",X"70",X"00", + X"FF",X"83",X"FE",X"FD",X"03",X"0F",X"00",X"02",X"0E",X"80",X"22",X"C1",X"F0",X"F0",X"B0",X"F0", + X"3F",X"0F",X"76",X"07",X"0B",X"04",X"0D",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"30", + X"B1",X"30",X"F2",X"10",X"E1",X"10",X"F0",X"10",X"B0",X"10",X"B0",X"10",X"D0",X"10",X"D0",X"10", + X"BF",X"FF",X"FE",X"F7",X"2F",X"CF",X"0F",X"8B",X"0B",X"0E",X"05",X"09",X"F0",X"F0",X"F0",X"80", + X"73",X"0F",X"07",X"0F",X"0F",X"0F",X"07",X"07",X"0D",X"0B",X"00",X"08",X"00",X"C0",X"00",X"80", + X"DF",X"1F",X"DB",X"17",X"BF",X"1B",X"BF",X"1B",X"F7",X"1C",X"EA",X"14",X"F0",X"10",X"B0",X"30", + X"0F",X"3F",X"0B",X"0F",X"0F",X"0D",X"0E",X"07",X"0F",X"0D",X"0E",X"09",X"74",X"08",X"30",X"00", + X"0F",X"0F",X"0F",X"0D",X"0F",X"07",X"0F",X"0F",X"0E",X"0F",X"0B",X"07",X"0E",X"0B",X"0B",X"0F", + X"0D",X"07",X"0E",X"0D",X"0F",X"FF",X"0F",X"1E",X"0B",X"D5",X"0D",X"F7",X"0B",X"DD",X"0B",X"1E", + X"0F",X"0B",X"0B",X"0F",X"0E",X"0F",X"0E",X"0F",X"0F",X"0F",X"0F",X"0B",X"0F",X"07",X"0E",X"0F", + X"0F",X"0D",X"EB",X"0D",X"FF",X"1E",X"8F",X"FD",X"5D",X"C7",X"5F",X"1F",X"FB",X"5F",X"0F",X"7B", + X"0F",X"1F",X"07",X"D3",X"01",X"F0",X"00",X"D0",X"01",X"13",X"01",X"F1",X"00",X"05",X"0F",X"0F", + X"0B",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"0F", + X"0F",X"7F",X"F6",X"50",X"50",X"10",X"50",X"C0",X"80",X"F0",X"F0",X"10",X"E0",X"00",X"05",X"0F", + X"0F",X"0E",X"0C",X"08",X"0C",X"08",X"00",X"00",X"08",X"08",X"00",X"00",X"08",X"08",X"0C",X"0E", + X"00",X"00",X"01",X"0B",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"C0",X"90",X"C0",X"F3",X"7F",X"7F",X"1F",X"EF",X"1F",X"CF",X"5F",X"8F",X"FF",X"FF",X"7F",X"FF", + X"00",X"00",X"00",X"0C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"06",X"FF",X"0F",X"EF",X"1F",X"CF",X"1F",X"9F",X"1F",X"9F",X"1F",X"BF",X"1F",X"AF",X"1F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"68",X"78",X"5A",X"87",X"0D",X"A2",X"2A",X"22",X"66",X"66",X"EE",X"EE",X"66",X"66",X"66", + X"F0",X"E0",X"3C",X"28",X"0F",X"69",X"E1",X"F0",X"C3",X"87",X"00",X"FF",X"FF",X"00",X"96",X"00", + X"C1",X"2D",X"C3",X"0B",X"1E",X"D2",X"A1",X"2D",X"69",X"0F",X"00",X"FF",X"FF",X"00",X"78",X"00", + X"F0",X"F0",X"C1",X"B0",X"2D",X"0B",X"45",X"45",X"44",X"66",X"66",X"77",X"77",X"66",X"66",X"66", + X"F0",X"F0",X"34",X"F0",X"F0",X"E0",X"F0",X"34",X"F0",X"78",X"B0",X"F0",X"92",X"34",X"F0",X"F0", + X"F0",X"F0",X"16",X"F0",X"F0",X"D0",X"F0",X"92",X"F0",X"E0",X"F0",X"92",X"F0",X"F0",X"34",X"F0", + X"78",X"F0",X"78",X"F0",X"92",X"34",X"D0",X"F0",X"F0",X"F0",X"92",X"C1",X"F0",X"F0",X"F0",X"F0", + X"D0",X"F0",X"E0",X"34",X"92",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"92",X"F0",X"E0",X"F0",X"F0", + X"03",X"90",X"08",X"87",X"41",X"0F",X"0B",X"2D",X"07",X"02",X"08",X"41",X"09",X"0D",X"0F",X"0A", + X"0E",X"0A",X"01",X"00",X"0C",X"0C",X"0F",X"43",X"94",X"0B",X"03",X"A1",X"07",X"03",X"28",X"05", + X"07",X"0F",X"C2",X"07",X"03",X"04",X"02",X"41",X"02",X"01",X"09",X"08",X"0E",X"43",X"0E",X"09", + X"0B",X"03",X"00",X"10",X"08",X"48",X"02",X"0F",X"09",X"03",X"25",X"4B",X"09",X"09",X"08",X"0E", + X"83",X"07",X"0F",X"07",X"83",X"0F",X"0F",X"2C",X"41",X"41",X"29",X"29",X"0F",X"07",X"03",X"01", + X"07",X"70",X"0F",X"1C",X"49",X"83",X"41",X"20",X"0F",X"07",X"0D",X"07",X"02",X"03",X"02",X"00", + X"1C",X"0F",X"83",X"0F",X"0B",X"0A",X"0F",X"0F",X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"07",X"02",X"01",X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"DF",X"EF",X"AA",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"BF",X"FF",X"55",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"CF",X"FF",X"AA",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88", + X"3F",X"FF",X"55",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"0F",X"8F",X"AD",X"AD",X"0F",X"5E",X"2D",X"8F",X"4F",X"DE",X"9E",X"AF",X"8F",X"5E",X"8F",X"4B", + X"3F",X"6F",X"5F",X"2F",X"BF",X"2F",X"BF",X"1F",X"2F",X"5F",X"AF",X"6F",X"BF",X"5F",X"AF",X"1F", + X"0F",X"2F",X"2F",X"0F",X"0F",X"8F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"0F",X"4F",X"0F",X"0F", + X"0F",X"1F",X"2F",X"1F",X"0F",X"0F",X"0F",X"1F",X"1F",X"4F",X"0F",X"0F",X"2F",X"0F",X"0F",X"2F", + X"1E",X"3C",X"96",X"5A",X"38",X"34",X"1E",X"3C",X"34",X"1E",X"50",X"F0",X"3C",X"D2",X"34",X"F0", + X"DF",X"AF",X"4F",X"CF",X"8F",X"8F",X"5E",X"8E",X"0F",X"0D",X"4B",X"2D",X"50",X"F0",X"F0",X"D0", + X"8F",X"1F",X"2F",X"2F",X"0F",X"4F",X"0F",X"AF",X"BF",X"EF",X"1E",X"0F",X"D2",X"A0",X"F0",X"F0", + X"0F",X"4F",X"8F",X"9F",X"4F",X"CF",X"2F",X"CF",X"EF",X"3F",X"4F",X"CF",X"0F",X"0F",X"58",X"F0", + X"0F",X"4A",X"0C",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A5",X"4B",X"0D",X"87",X"07",X"0B",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"5A",X"4B",X"0F",X"09",X"86",X"0F",X"0B",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00", + X"0F",X"1C",X"29",X"1C",X"4B",X"A5",X"1A",X"06",X"04",X"0F",X"0F",X"07",X"0E",X"0C",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"EF",X"DF", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"55",X"FF",X"BF", + X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"FF",X"CF", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"55",X"FF",X"3F", + X"4F",X"2F",X"0F",X"0F",X"2F",X"2F",X"9F",X"1F",X"2F",X"0F",X"0F",X"0F",X"4F",X"2F",X"0F",X"8F", + X"0F",X"1F",X"8F",X"0F",X"9F",X"0F",X"0F",X"8F",X"0F",X"AF",X"0F",X"1F",X"8F",X"4F",X"0F",X"1F", + X"0F",X"9F",X"4F",X"0F",X"0F",X"0F",X"0F",X"0F",X"4F",X"0F",X"0F",X"0F",X"0F",X"4F",X"8F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"87",X"97",X"0F",X"4B",X"A7",X"87",X"0F",X"0F",X"A7",X"0F", + X"4F",X"8F",X"0F",X"2F",X"8F",X"5F",X"1F",X"8F",X"4F",X"2F",X"1F",X"0F",X"0F",X"1F",X"0F",X"C1", + X"0F",X"CF",X"1F",X"2F",X"CF",X"0F",X"BF",X"1F",X"1F",X"2F",X"0F",X"0F",X"0F",X"60",X"06",X"F0", + X"0F",X"0F",X"1F",X"0F",X"4F",X"1F",X"0F",X"3F",X"2F",X"0B",X"07",X"07",X"0B",X"C1",X"F0",X"F0", + X"87",X"85",X"87",X"B7",X"07",X"D3",X"43",X"C3",X"A1",X"C2",X"C1",X"F0",X"E0",X"F0",X"F0",X"F0", + X"0F",X"0F",X"1F",X"8F",X"0F",X"0F",X"0F",X"4F",X"4F",X"1F",X"AF",X"6F",X"FF",X"1F",X"2D",X"B0", + X"CF",X"0F",X"8F",X"0F",X"0F",X"0F",X"8F",X"8F",X"2F",X"4F",X"FF",X"4F",X"87",X"0A",X"61",X"F0", + X"0F",X"0F",X"4F",X"8F",X"0F",X"4F",X"0F",X"4F",X"8F",X"3F",X"5F",X"BF",X"9F",X"1C",X"0D",X"E0", + X"0F",X"0F",X"4F",X"0F",X"0F",X"2F",X"1F",X"8F",X"0F",X"2F",X"1F",X"6F",X"BF",X"4F",X"8F",X"94", + X"0F",X"0F",X"0F",X"2F",X"0F",X"8F",X"0F",X"0F",X"1F",X"0F",X"4F",X"8F",X"1F",X"4F",X"4F",X"0F", + X"2F",X"8F",X"1F",X"2F",X"0F",X"0F",X"0F",X"1F",X"4F",X"AF",X"2F",X"8F",X"4F",X"2F",X"4F",X"1F", + X"0F",X"4F",X"4F",X"0F",X"1F",X"0F",X"1F",X"0F",X"0F",X"0F",X"0F",X"4F",X"0F",X"8F",X"1F",X"0F", + X"0F",X"2F",X"4F",X"2F",X"0F",X"1F",X"0F",X"2F",X"2F",X"8F",X"0F",X"0F",X"4F",X"0F",X"0F",X"4F", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0E",X"0C",X"08",X"00",X"08",X"0C",X"00",X"00",X"00",X"00", + X"00",X"00",X"04",X"0D",X"0F",X"0F",X"0D",X"05",X"03",X"0E",X"0E",X"09",X"0B",X"04",X"00",X"00", + X"00",X"00",X"00",X"00",X"0B",X"07",X"0F",X"0F",X"0E",X"0D",X"09",X"0F",X"07",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"03",X"01",X"07",X"02",X"03",X"07",X"03",X"01",X"00",X"00",X"00", + X"0F",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"05",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"28",X"CD",X"00",X"10",X"49",X"10",X"B0",X"0B",X"CD",X"00",X"A0",X"A9",X"2C",X"B0",X"04",X"68", + X"2C",X"00",X"A0",X"68",X"2C",X"03",X"C0",X"78",X"B8",X"C2",X"FF",X"9A",X"CD",X"00",X"10",X"49", + X"10",X"B0",X"0A",X"CD",X"00",X"A0",X"A9",X"2C",X"B0",X"03",X"2C",X"03",X"A0",X"2C",X"FF",X"C0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"17",X"FF",X"17",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/burnin_rubber_sound_prog.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/burnin_rubber_sound_prog.vhd new file mode 100644 index 00000000..c538d601 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/burnin_rubber_sound_prog.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity burnin_rubber_sound_prog is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of burnin_rubber_sound_prog is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"78",X"D8",X"A2",X"FF",X"9A",X"A2",X"72",X"A9",X"00",X"95",X"00",X"CA",X"D0",X"FB",X"20",X"1D", + X"F0",X"AD",X"00",X"A0",X"A9",X"FF",X"8D",X"00",X"C0",X"58",X"4C",X"1A",X"F0",X"A2",X"0F",X"8E", + X"00",X"40",X"8E",X"00",X"80",X"BD",X"50",X"F0",X"8D",X"00",X"20",X"8D",X"00",X"60",X"CA",X"10", + X"EE",X"60",X"A2",X"0A",X"8E",X"00",X"40",X"BD",X"50",X"F0",X"8D",X"00",X"20",X"CA",X"10",X"F4", + X"60",X"A2",X"0A",X"8E",X"00",X"80",X"BD",X"50",X"F0",X"8D",X"00",X"60",X"CA",X"10",X"F4",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"48",X"8A",X"48",X"98",X"48",X"AD",X"00",X"A0",X"30",X"37",X"A5",X"51",X"C9",X"01",X"F0",X"13", + X"C9",X"05",X"F0",X"0F",X"AD",X"00",X"A0",X"85",X"51",X"85",X"6D",X"C9",X"14",X"90",X"0A",X"A9", + X"00",X"85",X"51",X"68",X"A8",X"68",X"AA",X"68",X"40",X"A2",X"FF",X"9A",X"20",X"32",X"F0",X"A5", + X"51",X"58",X"0A",X"AA",X"BD",X"2A",X"F1",X"85",X"4D",X"BD",X"2B",X"F1",X"85",X"4E",X"6C",X"4D", + X"00",X"29",X"07",X"85",X"4A",X"A9",X"00",X"85",X"4C",X"A5",X"4A",X"48",X"20",X"FA",X"F0",X"AA", + X"BD",X"06",X"F1",X"85",X"44",X"85",X"45",X"BD",X"09",X"F1",X"85",X"46",X"85",X"47",X"BD",X"0C", + X"F1",X"85",X"48",X"85",X"49",X"BD",X"0F",X"F1",X"85",X"32",X"BD",X"12",X"F1",X"85",X"34",X"BD", + X"15",X"F1",X"85",X"36",X"68",X"0A",X"AA",X"BD",X"18",X"F1",X"85",X"14",X"BD",X"19",X"F1",X"85", + X"15",X"BD",X"1E",X"F1",X"85",X"16",X"BD",X"1F",X"F1",X"85",X"17",X"BD",X"24",X"F1",X"85",X"18", + X"BD",X"25",X"F1",X"85",X"19",X"85",X"10",X"4C",X"83",X"F0",X"48",X"A2",X"49",X"A9",X"00",X"95", + X"00",X"CA",X"D0",X"FB",X"68",X"60",X"0F",X"0A",X"0F",X"0F",X"0A",X"0F",X"0C",X"08",X"0C",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"8B",X"F7",X"DA",X"F7",X"37",X"FC",X"A6",X"F7", + X"65",X"F9",X"50",X"FC",X"C0",X"F7",X"EF",X"FA",X"68",X"FC",X"00",X"F0",X"52",X"F1",X"83",X"F1", + X"83",X"F1",X"83",X"F1",X"52",X"F1",X"52",X"F1",X"52",X"F1",X"A4",X"F1",X"A4",X"F1",X"A4",X"F1", + X"0F",X"F2",X"0F",X"F2",X"0F",X"F2",X"0F",X"F2",X"0F",X"F2",X"0F",X"F2",X"0F",X"F2",X"0F",X"F2", + X"0F",X"F2",X"A5",X"6A",X"D0",X"27",X"A5",X"51",X"C9",X"01",X"D0",X"03",X"4C",X"63",X"F1",X"C9", + X"05",X"D0",X"02",X"85",X"6A",X"0A",X"AA",X"BD",X"30",X"F2",X"85",X"53",X"85",X"5C",X"BD",X"31", + X"F2",X"85",X"54",X"A9",X"00",X"85",X"59",X"85",X"5F",X"A9",X"08",X"85",X"62",X"4C",X"19",X"F0", + X"4C",X"D2",X"F1",X"A5",X"10",X"F0",X"F9",X"A5",X"51",X"0A",X"AA",X"BD",X"30",X"F2",X"85",X"55", + X"85",X"5D",X"BD",X"31",X"F2",X"85",X"56",X"A9",X"00",X"85",X"5A",X"85",X"60",X"A9",X"02",X"85", + X"63",X"4C",X"19",X"F0",X"A5",X"6F",X"D0",X"20",X"A5",X"51",X"0A",X"AA",X"BD",X"30",X"F2",X"85", + X"57",X"85",X"5E",X"BD",X"31",X"F2",X"85",X"58",X"A9",X"00",X"85",X"5B",X"85",X"61",X"A9",X"04", + X"85",X"64",X"A5",X"51",X"C9",X"08",X"F0",X"03",X"4C",X"19",X"F0",X"A9",X"FF",X"85",X"6F",X"4C", + X"19",X"F0",X"A9",X"00",X"85",X"6A",X"A2",X"04",X"BD",X"30",X"F2",X"85",X"65",X"BD",X"31",X"F2", + X"85",X"66",X"A0",X"00",X"B1",X"65",X"C9",X"80",X"F0",X"15",X"8D",X"00",X"80",X"C8",X"B1",X"65", + X"8D",X"00",X"60",X"C8",X"B1",X"65",X"85",X"67",X"20",X"02",X"F2",X"C8",X"4C",X"E4",X"F1",X"4C", + X"19",X"F0",X"A9",X"F0",X"85",X"68",X"C6",X"68",X"D0",X"FC",X"C6",X"67",X"D0",X"F8",X"60",X"A5", + X"6D",X"85",X"6E",X"0A",X"AA",X"BD",X"30",X"F2",X"85",X"53",X"85",X"5C",X"85",X"69",X"BD",X"31", + X"F2",X"85",X"54",X"A9",X"00",X"85",X"59",X"85",X"5F",X"A9",X"01",X"85",X"62",X"4C",X"19",X"F0", + X"83",X"F0",X"58",X"F2",X"89",X"F2",X"ED",X"F2",X"87",X"F3",X"B5",X"F3",X"E6",X"F3",X"17",X"F4", + X"30",X"F4",X"61",X"F4",X"71",X"F4",X"96",X"F4",X"AF",X"F4",X"C8",X"F4",X"E1",X"F4",X"FA",X"F4", + X"13",X"F5",X"23",X"F5",X"33",X"F5",X"43",X"F5",X"00",X"00",X"01",X"01",X"00",X"01",X"07",X"F7", + X"01",X"08",X"0C",X"01",X"06",X"1F",X"20",X"08",X"0B",X"01",X"06",X"1C",X"10",X"08",X"0C",X"01", + X"06",X"1F",X"20",X"08",X"0B",X"01",X"06",X"1C",X"20",X"08",X"09",X"01",X"06",X"16",X"30",X"06", + X"1A",X"10",X"06",X"00",X"01",X"08",X"00",X"01",X"80",X"07",X"F0",X"01",X"03",X"00",X"01",X"02", + X"B3",X"08",X"09",X"0F",X"08",X"02",X"59",X"08",X"09",X"0E",X"08",X"02",X"B3",X"08",X"09",X"0D", + X"08",X"02",X"59",X"08",X"09",X"0C",X"08",X"02",X"B3",X"08",X"09",X"0B",X"08",X"02",X"59",X"08", + X"09",X"0A",X"08",X"02",X"B3",X"08",X"09",X"09",X"08",X"02",X"59",X"08",X"09",X"08",X"08",X"02", + X"B3",X"08",X"09",X"07",X"08",X"02",X"59",X"08",X"09",X"06",X"08",X"02",X"B3",X"08",X"09",X"05", + X"08",X"02",X"59",X"08",X"09",X"04",X"08",X"02",X"B3",X"08",X"09",X"03",X"08",X"02",X"59",X"08", + X"09",X"02",X"08",X"02",X"B3",X"08",X"09",X"00",X"01",X"02",X"00",X"01",X"80",X"09",X"0B",X"01", + X"03",X"00",X"01",X"02",X"5F",X"04",X"02",X"3C",X"04",X"02",X"5C",X"04",X"02",X"3A",X"04",X"02", + X"5A",X"04",X"02",X"39",X"04",X"02",X"58",X"04",X"02",X"37",X"04",X"02",X"57",X"04",X"02",X"35", + X"04",X"02",X"54",X"04",X"02",X"33",X"04",X"02",X"53",X"04",X"02",X"31",X"04",X"02",X"51",X"04", + X"02",X"2E",X"04",X"02",X"4F",X"04",X"02",X"2D",X"04",X"02",X"4D",X"04",X"02",X"2B",X"04",X"02", + X"4B",X"04",X"02",X"29",X"04",X"02",X"49",X"04",X"02",X"27",X"04",X"02",X"47",X"04",X"02",X"26", + X"04",X"02",X"45",X"04",X"02",X"24",X"04",X"02",X"44",X"04",X"02",X"22",X"04",X"02",X"42",X"04", + X"02",X"20",X"04",X"02",X"40",X"04",X"02",X"2E",X"04",X"02",X"3E",X"04",X"02",X"28",X"04",X"02", + X"3C",X"04",X"02",X"1A",X"04",X"02",X"3A",X"04",X"02",X"18",X"04",X"02",X"38",X"04",X"02",X"16", + X"04",X"02",X"36",X"04",X"02",X"14",X"04",X"02",X"34",X"04",X"02",X"12",X"04",X"02",X"30",X"04", + X"02",X"0E",X"04",X"02",X"00",X"01",X"80",X"09",X"0B",X"01",X"02",X"00",X"01",X"02",X"2A",X"05", + X"02",X"8E",X"05",X"02",X"25",X"05",X"02",X"7E",X"05",X"02",X"21",X"05",X"02",X"20",X"05",X"02", + X"1D",X"05",X"02",X"64",X"05",X"02",X"1C",X"05",X"02",X"5E",X"05",X"02",X"1F",X"05",X"02",X"6A", + X"05",X"02",X"00",X"06",X"80",X"07",X"F7",X"01",X"08",X"0A",X"01",X"06",X"10",X"20",X"08",X"0C", + X"01",X"06",X"1F",X"20",X"08",X"0B",X"01",X"06",X"1C",X"10",X"08",X"0C",X"01",X"06",X"1F",X"20", + X"08",X"0B",X"01",X"06",X"1C",X"20",X"08",X"09",X"01",X"06",X"16",X"30",X"06",X"1A",X"10",X"06", + X"00",X"01",X"08",X"00",X"01",X"80",X"00",X"00",X"01",X"01",X"00",X"01",X"06",X"1F",X"01",X"08", + X"0A",X"05",X"06",X"14",X"01",X"08",X"0C",X"05",X"06",X"18",X"01",X"08",X"0D",X"05",X"06",X"10", + X"01",X"08",X"0C",X"10",X"08",X"0A",X"05",X"08",X"08",X"05",X"08",X"06",X"05",X"08",X"04",X"05", + X"08",X"02",X"05",X"06",X"00",X"01",X"80",X"08",X"0B",X"01",X"06",X"1F",X"0A",X"08",X"0A",X"02", + X"06",X"1C",X"02",X"08",X"0B",X"02",X"06",X"18",X"02",X"08",X"07",X"02",X"08",X"00",X"01",X"80", + X"0A",X"0D",X"01",X"05",X"00",X"01",X"04",X"77",X"0A",X"04",X"3B",X"0A",X"04",X"77",X"0A",X"04", + X"3B",X"0A",X"04",X"77",X"0A",X"04",X"3B",X"0A",X"04",X"77",X"0A",X"04",X"3B",X"0A",X"04",X"77", + X"0A",X"04",X"3B",X"0A",X"04",X"77",X"0A",X"04",X"3B",X"0A",X"0A",X"00",X"01",X"04",X"00",X"01", + X"80",X"05",X"00",X"01",X"04",X"2F",X"01",X"0A",X"0F",X"0F",X"0A",X"00",X"01",X"04",X"00",X"01", + X"80",X"05",X"00",X"01",X"0A",X"0D",X"01",X"04",X"7F",X"04",X"04",X"5F",X"04",X"04",X"78",X"04", + X"04",X"58",X"04",X"04",X"70",X"04",X"04",X"50",X"04",X"04",X"68",X"04",X"04",X"48",X"04",X"0A", + X"00",X"01",X"04",X"00",X"01",X"80",X"00",X"FF",X"01",X"01",X"08",X"01",X"08",X"0A",X"02",X"00", + X"FF",X"01",X"01",X"07",X"01",X"08",X"09",X"02",X"00",X"BF",X"01",X"01",X"07",X"01",X"81",X"00", + X"6F",X"01",X"01",X"08",X"01",X"08",X"0A",X"02",X"00",X"6F",X"01",X"01",X"07",X"01",X"08",X"09", + X"02",X"00",X"2F",X"01",X"01",X"07",X"01",X"81",X"00",X"BF",X"01",X"01",X"07",X"01",X"08",X"0A", + X"02",X"00",X"BF",X"01",X"01",X"06",X"01",X"08",X"09",X"02",X"00",X"7F",X"01",X"01",X"06",X"01", + X"81",X"00",X"1F",X"01",X"01",X"07",X"01",X"08",X"0A",X"01",X"00",X"1F",X"01",X"01",X"06",X"01", + X"08",X"0A",X"01",X"00",X"CF",X"01",X"01",X"05",X"01",X"81",X"00",X"6F",X"01",X"01",X"06",X"01", + X"08",X"0A",X"01",X"00",X"6F",X"01",X"01",X"05",X"01",X"08",X"0A",X"01",X"00",X"2F",X"01",X"01", + X"05",X"01",X"81",X"00",X"BF",X"01",X"01",X"05",X"01",X"08",X"0A",X"01",X"00",X"BF",X"01",X"01", + X"04",X"01",X"81",X"00",X"2F",X"01",X"01",X"05",X"01",X"08",X"0A",X"01",X"00",X"2F",X"01",X"01", + X"04",X"01",X"81",X"00",X"1F",X"01",X"01",X"05",X"01",X"08",X"0A",X"01",X"00",X"1F",X"01",X"01", + X"04",X"01",X"81",X"00",X"00",X"01",X"01",X"00",X"01",X"08",X"00",X"01",X"81",X"4C",X"83",X"F0", + X"48",X"8A",X"48",X"98",X"48",X"A5",X"10",X"F0",X"F4",X"A5",X"11",X"29",X"07",X"E6",X"11",X"0A", + X"AA",X"BD",X"7E",X"F5",X"85",X"12",X"BD",X"7F",X"F5",X"85",X"13",X"A9",X"07",X"8D",X"00",X"80", + X"A5",X"62",X"05",X"63",X"05",X"64",X"49",X"FF",X"8D",X"00",X"60",X"6C",X"12",X"00",X"67",X"F6", + X"67",X"F6",X"67",X"F6",X"10",X"F7",X"8E",X"F5",X"E9",X"F5",X"20",X"F6",X"83",X"F0",X"A5",X"5C", + X"F0",X"23",X"A5",X"59",X"D0",X"1D",X"A4",X"5F",X"B1",X"53",X"C9",X"80",X"F0",X"21",X"C9",X"81", + X"F0",X"16",X"8D",X"00",X"80",X"C8",X"B1",X"53",X"8D",X"00",X"60",X"C8",X"B1",X"53",X"85",X"59", + X"C8",X"84",X"5F",X"C6",X"59",X"4C",X"83",X"F0",X"A9",X"00",X"85",X"5F",X"4C",X"83",X"F0",X"A5", + X"51",X"C9",X"01",X"F0",X"0F",X"C9",X"05",X"F0",X"0B",X"A9",X"00",X"85",X"6A",X"A5",X"6E",X"85", + X"6D",X"4C",X"0F",X"F2",X"A9",X"08",X"8D",X"00",X"80",X"A9",X"00",X"8D",X"00",X"60",X"85",X"5C", + X"85",X"6A",X"85",X"51",X"85",X"62",X"4C",X"83",X"F0",X"A5",X"5D",X"F0",X"1F",X"A5",X"5A",X"D0", + X"19",X"A4",X"60",X"B1",X"55",X"C9",X"80",X"F0",X"16",X"8D",X"00",X"80",X"C8",X"B1",X"55",X"8D", + X"00",X"60",X"C8",X"B1",X"55",X"85",X"5A",X"C8",X"84",X"60",X"C6",X"5A",X"4C",X"83",X"F0",X"A9", + X"09",X"8D",X"00",X"80",X"A9",X"00",X"8D",X"00",X"60",X"85",X"5D",X"85",X"63",X"4C",X"83",X"F0", + X"A5",X"5E",X"F0",X"1F",X"A5",X"5B",X"D0",X"19",X"A4",X"61",X"B1",X"57",X"C9",X"80",X"F0",X"16", + X"8D",X"00",X"80",X"C8",X"B1",X"57",X"8D",X"00",X"60",X"C8",X"B1",X"57",X"85",X"5B",X"C8",X"84", + X"61",X"C6",X"5B",X"4C",X"83",X"F0",X"A9",X"00",X"85",X"6F",X"85",X"5E",X"85",X"64",X"4C",X"83", + X"F0",X"20",X"FA",X"F0",X"20",X"32",X"F0",X"E6",X"4C",X"4C",X"A9",X"F0",X"20",X"FA",X"F0",X"20", + X"32",X"F0",X"A9",X"01",X"4C",X"A1",X"F0",X"B5",X"1A",X"D0",X"75",X"A1",X"14",X"C9",X"FE",X"F0", + X"E0",X"C9",X"FF",X"F0",X"E7",X"20",X"64",X"F7",X"48",X"29",X"0F",X"A8",X"B9",X"6B",X"F7",X"95", + X"26",X"B9",X"7B",X"F7",X"95",X"27",X"68",X"85",X"4B",X"4A",X"4A",X"4A",X"4A",X"A8",X"D0",X"0A", + X"95",X"26",X"95",X"27",X"95",X"2C",X"95",X"2D",X"F0",X"29",X"56",X"27",X"76",X"26",X"88",X"D0", + X"F9",X"18",X"A5",X"4B",X"75",X"32",X"48",X"29",X"0F",X"A8",X"B9",X"6B",X"F7",X"95",X"2C",X"B9", + X"7B",X"F7",X"95",X"2D",X"68",X"4A",X"4A",X"4A",X"4A",X"A8",X"56",X"2D",X"76",X"2C",X"88",X"D0", + X"F9",X"B5",X"44",X"95",X"45",X"A1",X"14",X"20",X"64",X"F7",X"95",X"1A",X"95",X"20",X"A0",X"02", + X"56",X"20",X"88",X"D0",X"FB",X"B5",X"20",X"95",X"21",X"D6",X"1A",X"D6",X"21",X"4C",X"83",X"F0", + X"D6",X"1A",X"D6",X"21",X"D0",X"0A",X"B5",X"20",X"95",X"21",X"B5",X"45",X"F0",X"02",X"D6",X"45", + X"B5",X"3E",X"29",X"01",X"D0",X"0D",X"F6",X"3E",X"B5",X"26",X"95",X"38",X"B5",X"27",X"95",X"39", + X"4C",X"83",X"F0",X"F6",X"3E",X"B5",X"2C",X"95",X"38",X"B5",X"2D",X"95",X"39",X"4C",X"83",X"F0", + X"A2",X"05",X"8E",X"00",X"40",X"B5",X"38",X"8D",X"00",X"20",X"CA",X"10",X"F5",X"A5",X"4C",X"29", + X"01",X"D0",X"0C",X"A9",X"07",X"8D",X"00",X"40",X"A9",X"F8",X"8D",X"00",X"20",X"D0",X"0A",X"A9", + X"07",X"8D",X"00",X"40",X"A9",X"DC",X"8D",X"00",X"20",X"A9",X"08",X"8D",X"00",X"40",X"A5",X"45", + X"8D",X"00",X"20",X"A9",X"09",X"8D",X"00",X"40",X"A5",X"47",X"8D",X"00",X"20",X"A9",X"0A",X"8D", + X"00",X"40",X"A5",X"49",X"8D",X"00",X"20",X"A9",X"06",X"8D",X"00",X"40",X"A9",X"02",X"8D",X"00", + X"20",X"4C",X"83",X"F0",X"F6",X"14",X"D0",X"02",X"F6",X"15",X"60",X"65",X"23",X"F3",X"D5",X"C6", + X"C7",X"D6",X"F2",X"1B",X"51",X"91",X"DD",X"32",X"91",X"F9",X"6A",X"16",X"15",X"13",X"12",X"11", + X"10",X"0F",X"0E",X"0E",X"0D",X"0C",X"0B",X"0B",X"0A",X"09",X"09",X"47",X"20",X"47",X"10",X"47", + X"10",X"47",X"60",X"49",X"20",X"47",X"20",X"49",X"20",X"47",X"20",X"47",X"10",X"47",X"10",X"47", + X"40",X"47",X"40",X"00",X"40",X"FF",X"44",X"20",X"44",X"10",X"44",X"10",X"44",X"60",X"45",X"20", + X"44",X"20",X"45",X"20",X"44",X"20",X"44",X"10",X"44",X"10",X"44",X"40",X"44",X"40",X"00",X"40", + X"40",X"20",X"40",X"10",X"40",X"10",X"40",X"60",X"40",X"20",X"40",X"20",X"40",X"20",X"40",X"20", + X"40",X"10",X"40",X"10",X"40",X"40",X"40",X"40",X"00",X"40",X"44",X"18",X"44",X"18",X"40",X"18", + X"40",X"18",X"42",X"18",X"42",X"18",X"45",X"30",X"44",X"18",X"44",X"18",X"40",X"18",X"40",X"18", + X"42",X"18",X"42",X"18",X"37",X"30",X"44",X"18",X"44",X"18",X"40",X"18",X"40",X"18",X"42",X"18", + X"42",X"18",X"44",X"18",X"45",X"18",X"47",X"18",X"47",X"18",X"50",X"18",X"47",X"18",X"44",X"18", + X"47",X"18",X"50",X"30",X"50",X"18",X"49",X"30",X"45",X"18",X"4B",X"18",X"47",X"30",X"44",X"18", + X"49",X"18",X"45",X"30",X"42",X"18",X"47",X"18",X"44",X"30",X"40",X"18",X"40",X"18",X"44",X"18", + X"47",X"18",X"47",X"18",X"42",X"18",X"45",X"18",X"49",X"18",X"49",X"18",X"47",X"18",X"4B",X"18", + X"52",X"18",X"54",X"18",X"50",X"30",X"00",X"30",X"50",X"24",X"4B",X"0C",X"45",X"30",X"4B",X"24", + X"49",X"0C",X"44",X"30",X"44",X"24",X"45",X"0C",X"47",X"30",X"30",X"0C",X"32",X"0C",X"34",X"0C", + X"35",X"0C",X"37",X"0C",X"39",X"0C",X"3B",X"0C",X"40",X"0C",X"45",X"24",X"47",X"0C",X"49",X"30", + X"32",X"0C",X"34",X"0C",X"35",X"0C",X"37",X"0C",X"39",X"0C",X"3B",X"0C",X"30",X"0C",X"32",X"0C", + X"44",X"18",X"44",X"18",X"45",X"18",X"45",X"18",X"47",X"18",X"47",X"18",X"40",X"30",X"44",X"18", + X"40",X"18",X"42",X"18",X"45",X"18",X"44",X"18",X"42",X"18",X"40",X"30",X"44",X"18",X"44",X"0C", + X"44",X"0C",X"40",X"18",X"40",X"0C",X"40",X"0C",X"45",X"18",X"44",X"18",X"42",X"30",X"44",X"18", + X"44",X"0C",X"44",X"0C",X"40",X"18",X"40",X"0C",X"40",X"0C",X"44",X"18",X"42",X"18",X"40",X"30", + X"44",X"18",X"44",X"0C",X"44",X"0C",X"40",X"18",X"40",X"0C",X"40",X"0C",X"42",X"0C",X"44",X"0C", + X"45",X"0C",X"47",X"0C",X"4B",X"30",X"44",X"18",X"44",X"0C",X"44",X"0C",X"40",X"18",X"40",X"0C", + X"40",X"0C",X"45",X"18",X"44",X"18",X"42",X"30",X"44",X"18",X"44",X"0C",X"44",X"0C",X"40",X"18", + X"40",X"0C",X"40",X"0C",X"3B",X"0C",X"39",X"0C",X"3B",X"0C",X"40",X"0C",X"42",X"30",X"44",X"18", + X"44",X"0C",X"44",X"0C",X"40",X"18",X"40",X"0C",X"40",X"0C",X"42",X"0C",X"44",X"0C",X"45",X"0C", + X"47",X"0C",X"49",X"30",X"4B",X"18",X"4B",X"0C",X"4B",X"0C",X"47",X"18",X"47",X"0C",X"47",X"0C", + X"50",X"0C",X"4B",X"0C",X"49",X"0C",X"4B",X"0C",X"50",X"30",X"50",X"18",X"49",X"18",X"45",X"18", + X"47",X"18",X"4B",X"18",X"47",X"18",X"44",X"18",X"45",X"18",X"49",X"18",X"45",X"18",X"42",X"18", + X"44",X"18",X"47",X"18",X"44",X"18",X"40",X"30",X"50",X"30",X"49",X"18",X"45",X"18",X"4B",X"18", + X"4B",X"18",X"47",X"18",X"44",X"18",X"49",X"30",X"45",X"18",X"42",X"18",X"47",X"18",X"47",X"18", + X"44",X"18",X"40",X"18",X"FE",X"40",X"18",X"40",X"18",X"39",X"18",X"39",X"18",X"3B",X"18",X"3B", + X"18",X"42",X"30",X"40",X"18",X"40",X"18",X"39",X"18",X"39",X"18",X"3B",X"18",X"3B",X"18",X"34", + X"30",X"40",X"18",X"40",X"18",X"39",X"18",X"39",X"18",X"3B",X"18",X"3B",X"18",X"40",X"18",X"42", + X"18",X"44",X"18",X"44",X"18",X"49",X"18",X"44",X"18",X"40",X"18",X"44",X"18",X"49",X"30",X"49", + X"18",X"45",X"30",X"42",X"18",X"47",X"18",X"44",X"30",X"40",X"18",X"45",X"18",X"42",X"30",X"3B", + X"18",X"44",X"18",X"40",X"30",X"39",X"18",X"39",X"18",X"40",X"18",X"44",X"18",X"44",X"18",X"3B", + X"18",X"42",X"18",X"45",X"18",X"45",X"18",X"44",X"18",X"47",X"18",X"4B",X"18",X"50",X"18",X"49", + X"30",X"00",X"30",X"49",X"24",X"47",X"0C",X"42",X"30",X"47",X"24",X"45",X"0C",X"40",X"30",X"40", + X"24",X"42",X"0C",X"44",X"30",X"29",X"0C",X"2B",X"0C",X"30",X"0C",X"32",X"0C",X"34",X"0C",X"35", + X"0C",X"37",X"0C",X"39",X"0C",X"42",X"24",X"44",X"0C",X"45",X"30",X"2B",X"0C",X"30",X"0C",X"32", + X"0C",X"34",X"0C",X"35",X"0C",X"37",X"0C",X"39",X"0C",X"3B",X"0C",X"40",X"18",X"40",X"18",X"42", + X"18",X"42",X"18",X"44",X"18",X"44",X"18",X"39",X"30",X"40",X"18",X"39",X"18",X"3B",X"18",X"42", + X"18",X"40",X"18",X"3B",X"18",X"39",X"30",X"40",X"18",X"40",X"0C",X"40",X"0C",X"39",X"18",X"39", + X"0C",X"39",X"0C",X"42",X"18",X"40",X"18",X"3B",X"30",X"3B",X"18",X"3B",X"0C",X"3B",X"0C",X"39", + X"18",X"39",X"0C",X"39",X"0C",X"40",X"18",X"3B",X"18",X"39",X"30",X"40",X"18",X"40",X"0C",X"40", + X"0C",X"39",X"18",X"39",X"0C",X"39",X"0C",X"3B",X"0C",X"40",X"0C",X"42",X"0C",X"44",X"0C",X"47", + X"30",X"40",X"18",X"40",X"0C",X"40",X"0C",X"39",X"18",X"39",X"0C",X"39",X"0C",X"42",X"18",X"40", + X"18",X"3B",X"30",X"40",X"18",X"40",X"0C",X"40",X"0C",X"39",X"18",X"39",X"0C",X"39",X"0C",X"37", + X"0C",X"35",X"0C",X"37",X"0C",X"39",X"0C",X"3B",X"30",X"40",X"18",X"40",X"0C",X"40",X"0C",X"39", + X"18",X"39",X"0C",X"39",X"0C",X"3B",X"0C",X"40",X"0C",X"42",X"0C",X"44",X"0C",X"45",X"30",X"47", + X"18",X"47",X"0C",X"47",X"0C",X"44",X"18",X"44",X"0C",X"44",X"0C",X"49",X"0C",X"47",X"0C",X"45", + X"0C",X"47",X"0C",X"49",X"30",X"49",X"18",X"45",X"18",X"42",X"18",X"44",X"18",X"47",X"18",X"44", + X"18",X"40",X"18",X"42",X"18",X"45",X"18",X"42",X"18",X"3B",X"18",X"40",X"18",X"44",X"18",X"40", + X"18",X"39",X"30",X"49",X"30",X"45",X"18",X"42",X"18",X"47",X"18",X"47",X"18",X"44",X"18",X"40", + X"18",X"45",X"30",X"42",X"18",X"3B",X"18",X"44",X"18",X"44",X"18",X"40",X"18",X"39",X"18",X"34", + X"24",X"34",X"0C",X"30",X"30",X"32",X"24",X"32",X"0C",X"35",X"30",X"34",X"24",X"34",X"0C",X"30", + X"30",X"32",X"24",X"32",X"0C",X"27",X"30",X"34",X"24",X"34",X"0C",X"30",X"30",X"32",X"24",X"32", + X"0C",X"35",X"30",X"30",X"18",X"34",X"18",X"32",X"18",X"35",X"18",X"34",X"24",X"30",X"0C",X"34", + X"30",X"40",X"24",X"39",X"0C",X"39",X"30",X"3B",X"24",X"37",X"0C",X"37",X"30",X"39",X"24",X"35", + X"0C",X"32",X"30",X"37",X"24",X"34",X"0C",X"34",X"30",X"30",X"30",X"34",X"18",X"34",X"18",X"32", + X"30",X"35",X"18",X"35",X"18",X"34",X"30",X"30",X"18",X"32",X"18",X"30",X"30",X"00",X"30",X"40", + X"24",X"3B",X"0C",X"35",X"30",X"3B",X"24",X"39",X"0C",X"34",X"30",X"34",X"24",X"35",X"0C",X"40", + X"30",X"00",X"60",X"35",X"24",X"37",X"0C",X"42",X"30",X"00",X"60",X"34",X"18",X"34",X"18",X"32", + X"18",X"32",X"18",X"30",X"18",X"30",X"18",X"30",X"30",X"34",X"24",X"34",X"0C",X"30",X"30",X"32", + X"24",X"32",X"0C",X"35",X"30",X"34",X"24",X"34",X"0C",X"30",X"30",X"30",X"24",X"32",X"0C",X"35", + X"30",X"35",X"24",X"35",X"0C",X"32",X"30",X"30",X"24",X"30",X"0C",X"34",X"30",X"34",X"24",X"34", + X"0C",X"30",X"30",X"32",X"24",X"32",X"0C",X"37",X"30",X"54",X"18",X"54",X"0C",X"54",X"0C",X"50", + X"18",X"50",X"0C",X"50",X"0C",X"55",X"18",X"54",X"18",X"52",X"30",X"54",X"18",X"54",X"0C",X"54", + X"0C",X"50",X"18",X"50",X"0C",X"50",X"0C",X"4B",X"0C",X"49",X"0C",X"4B",X"0C",X"50",X"0C",X"52", + X"30",X"54",X"18",X"54",X"0C",X"54",X"0C",X"50",X"18",X"50",X"0C",X"50",X"0C",X"52",X"0C",X"54", + X"0C",X"55",X"0C",X"57",X"0C",X"59",X"30",X"5B",X"18",X"5B",X"0C",X"5B",X"0C",X"57",X"18",X"57", + X"0C",X"57",X"0C",X"60",X"0C",X"5B",X"0C",X"59",X"0C",X"5B",X"0C",X"60",X"30",X"60",X"18",X"59", + X"18",X"55",X"18",X"57",X"18",X"5B",X"18",X"57",X"18",X"54",X"18",X"55",X"18",X"59",X"18",X"55", + X"18",X"52",X"18",X"54",X"18",X"57",X"18",X"54",X"18",X"50",X"30",X"60",X"30",X"59",X"18",X"55", + X"18",X"5B",X"18",X"5B",X"18",X"57",X"18",X"54",X"18",X"59",X"30",X"55",X"18",X"52",X"18",X"57", + X"18",X"57",X"18",X"54",X"18",X"50",X"18",X"47",X"60",X"49",X"18",X"47",X"18",X"45",X"18",X"47", + X"78",X"44",X"18",X"45",X"18",X"49",X"18",X"47",X"18",X"45",X"18",X"47",X"C0",X"00",X"60",X"FF", + X"44",X"60",X"45",X"18",X"44",X"18",X"42",X"18",X"44",X"78",X"40",X"18",X"42",X"18",X"45",X"18", + X"44",X"18",X"42",X"18",X"44",X"C0",X"00",X"60",X"40",X"60",X"40",X"60",X"40",X"60",X"40",X"60", + X"40",X"30",X"40",X"30",X"40",X"78",X"00",X"60",X"78",X"D8",X"A2",X"FF",X"9A",X"AD",X"00",X"A0", + X"A9",X"00",X"8D",X"00",X"C0",X"A0",X"00",X"A2",X"00",X"B9",X"00",X"F0",X"95",X"00",X"C8",X"E8", + X"D0",X"F7",X"B9",X"00",X"F0",X"9D",X"00",X"01",X"C8",X"E8",X"D0",X"F6",X"B5",X"00",X"D9",X"00", + X"F0",X"D0",X"4E",X"C8",X"E8",X"D0",X"F5",X"BD",X"00",X"01",X"D9",X"00",X"F0",X"D0",X"42",X"C8", + X"E8",X"D0",X"F4",X"C8",X"C0",X"40",X"D0",X"CF",X"A2",X"00",X"BD",X"D9",X"FC",X"8D",X"00",X"40", + X"E8",X"BD",X"D9",X"FC",X"8D",X"00",X"20",X"E8",X"E0",X"18",X"D0",X"EE",X"A2",X"00",X"A0",X"00", + X"88",X"D0",X"FD",X"CA",X"D0",X"FA",X"4C",X"00",X"F0",X"00",X"66",X"01",X"01",X"02",X"1C",X"03", + X"01",X"04",X"EF",X"05",X"00",X"07",X"F8",X"08",X"10",X"09",X"10",X"0A",X"10",X"0C",X"30",X"0D", + X"09",X"A0",X"00",X"B9",X"12",X"FD",X"8D",X"00",X"40",X"C8",X"B9",X"12",X"FD",X"8D",X"00",X"20", + X"C8",X"C0",X"18",X"D0",X"EE",X"A2",X"A0",X"A0",X"00",X"88",X"D0",X"FD",X"CA",X"D0",X"FA",X"4C", + X"F1",X"FC",X"00",X"CC",X"01",X"02",X"02",X"A4",X"03",X"02",X"04",X"7E",X"05",X"02",X"07",X"38", + X"08",X"10",X"09",X"10",X"0A",X"10",X"0C",X"30",X"0D",X"09",X"20",X"42",X"55",X"52",X"4E",X"49", + X"4E",X"22",X"20",X"52",X"55",X"42",X"42",X"45",X"52",X"20",X"53",X"6F",X"75",X"6E",X"64",X"20", + X"50",X"72",X"6F",X"67",X"72",X"61",X"6D",X"20",X"20",X"43",X"6F",X"70",X"79",X"72",X"69",X"67", + X"68",X"74",X"20",X"31",X"39",X"38",X"32",X"20",X"28",X"63",X"29",X"20",X"44",X"41",X"54",X"41", + X"20",X"45",X"41",X"53",X"54",X"20",X"63",X"6F",X"72",X"70",X"2E",X"20",X"20",X"70",X"72",X"6F", + X"67",X"72",X"61",X"6D",X"65",X"64",X"20",X"62",X"79",X"20",X"54",X"2E",X"4B",X"69",X"74",X"61", + X"7A",X"61",X"77",X"61",X"20",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"50",X"F5",X"78",X"FC",X"60",X"F0"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/fg_sp_graphx_1.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/fg_sp_graphx_1.vhd new file mode 100644 index 00000000..1c967b93 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/fg_sp_graphx_1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity fg_sp_graphx_1 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 prom of fg_sp_graphx_1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"62",X"E2",X"82",X"FE",X"7E",X"02", + X"00",X"7E",X"FE",X"80",X"80",X"80",X"FE",X"7E",X"00",X"FE",X"FE",X"04",X"08",X"04",X"FE",X"FE", + X"00",X"FE",X"FE",X"12",X"12",X"12",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"7C",X"FE",X"C6",X"C6",X"FE",X"7C",X"00",X"00",X"FE",X"FE",X"38",X"7C",X"EE",X"C6",X"00", + X"00",X"60",X"60",X"00",X"0C",X"0E",X"06",X"00",X"00",X"28",X"28",X"28",X"28",X"28",X"28",X"00", + X"00",X"44",X"6C",X"38",X"38",X"6C",X"44",X"00",X"00",X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38", + X"00",X"00",X"80",X"84",X"FE",X"FE",X"80",X"80",X"00",X"C4",X"E6",X"F2",X"B2",X"BA",X"9E",X"8C", + X"00",X"40",X"C2",X"92",X"9A",X"9E",X"F6",X"62",X"00",X"30",X"38",X"2C",X"26",X"FE",X"FE",X"20", + X"00",X"4E",X"CE",X"8A",X"8A",X"8A",X"FA",X"70",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60", + X"00",X"06",X"06",X"E2",X"F2",X"1A",X"0E",X"06",X"00",X"6C",X"9E",X"9A",X"B2",X"B2",X"EC",X"60", + X"00",X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38", + X"00",X"00",X"80",X"84",X"FE",X"FE",X"80",X"80",X"00",X"C4",X"E6",X"F2",X"B2",X"BA",X"9E",X"8C", + X"00",X"40",X"C2",X"92",X"9A",X"9E",X"F6",X"62",X"00",X"30",X"38",X"2C",X"26",X"FE",X"FE",X"20", + X"00",X"4E",X"CE",X"8A",X"8A",X"8A",X"FA",X"70",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60", + X"00",X"06",X"06",X"E2",X"F2",X"1A",X"0E",X"06",X"00",X"6C",X"9E",X"9A",X"B2",X"B2",X"EC",X"60", + X"00",X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"00",X"00",X"00",X"00",X"16",X"0E",X"00", + X"00",X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"F8",X"FC",X"26",X"22",X"26",X"FC",X"F8", + X"00",X"FE",X"FE",X"92",X"92",X"92",X"FE",X"6C",X"00",X"38",X"7C",X"C6",X"82",X"82",X"C6",X"44", + X"00",X"FE",X"FE",X"82",X"82",X"C6",X"7C",X"38",X"00",X"00",X"FE",X"FE",X"92",X"92",X"92",X"82", + X"00",X"FE",X"FE",X"12",X"12",X"12",X"12",X"02",X"00",X"38",X"7C",X"C6",X"82",X"92",X"F2",X"F2", + X"00",X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82", + X"00",X"40",X"C0",X"80",X"80",X"80",X"FE",X"7E",X"00",X"FE",X"FE",X"30",X"78",X"EC",X"C6",X"82", + X"00",X"00",X"FE",X"FE",X"80",X"80",X"80",X"80",X"00",X"FE",X"FE",X"1C",X"38",X"1C",X"FE",X"FE", + X"00",X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C", + X"00",X"FE",X"FE",X"22",X"22",X"22",X"3E",X"1C",X"00",X"7C",X"FE",X"82",X"A2",X"E2",X"7E",X"BC", + X"00",X"FE",X"FE",X"22",X"62",X"F2",X"DE",X"9C",X"00",X"4C",X"DE",X"92",X"92",X"96",X"F4",X"60", + X"00",X"00",X"02",X"02",X"FE",X"FE",X"02",X"02",X"00",X"7E",X"FE",X"80",X"80",X"80",X"FE",X"7E", + X"00",X"1E",X"3E",X"70",X"E0",X"70",X"3E",X"1E",X"00",X"3E",X"FE",X"70",X"38",X"70",X"FE",X"3E", + X"00",X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"00",X"06",X"1E",X"F0",X"F0",X"1E",X"06", + X"00",X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"F8",X"FC",X"26",X"22",X"26",X"FC",X"F8", + X"00",X"FE",X"FE",X"92",X"92",X"92",X"FE",X"6C",X"00",X"38",X"7C",X"C6",X"82",X"82",X"C6",X"44", + X"00",X"FE",X"FE",X"82",X"82",X"C6",X"7C",X"38",X"00",X"00",X"FE",X"FE",X"92",X"92",X"92",X"82", + X"00",X"FE",X"FE",X"12",X"12",X"12",X"12",X"02",X"00",X"38",X"7C",X"C6",X"82",X"92",X"F2",X"F2", + X"00",X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82", + X"00",X"40",X"C0",X"80",X"80",X"80",X"FE",X"7E",X"00",X"FE",X"FE",X"30",X"78",X"EC",X"C6",X"82", + X"00",X"00",X"FE",X"FE",X"80",X"80",X"80",X"80",X"00",X"FE",X"FE",X"1C",X"38",X"1C",X"FE",X"FE", + X"00",X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C", + X"00",X"FE",X"FE",X"22",X"22",X"22",X"3E",X"1C",X"00",X"7C",X"FE",X"82",X"A2",X"E2",X"7E",X"BC", + X"00",X"FE",X"FE",X"22",X"62",X"F2",X"DE",X"9C",X"00",X"4C",X"DE",X"92",X"92",X"96",X"F4",X"60", + X"00",X"00",X"02",X"02",X"FE",X"FE",X"02",X"02",X"00",X"7E",X"FE",X"80",X"80",X"80",X"FE",X"7E", + X"00",X"1E",X"3E",X"70",X"E0",X"70",X"3E",X"1E",X"00",X"3E",X"FE",X"70",X"38",X"70",X"FE",X"3E", + X"00",X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"00",X"06",X"1E",X"F0",X"F0",X"1E",X"06", + X"00",X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"60",X"60",X"08",X"1C",X"0E",X"06",X"00", + X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"50",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"7E",X"81",X"BD",X"BD",X"A5",X"A5",X"81",X"7E", + X"00",X"FF",X"FF",X"C3",X"C3",X"E7",X"7E",X"7E",X"FF",X"DB",X"DB",X"DB",X"7E",X"FF",X"C3",X"C3", + X"F7",X"76",X"7E",X"FF",X"C3",X"C3",X"FF",X"7E",X"00",X"76",X"81",X"81",X"81",X"81",X"81",X"76", + X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"00",X"00",X"70",X"89",X"89",X"89",X"89",X"89",X"06", + X"00",X"00",X"81",X"89",X"89",X"89",X"89",X"76",X"00",X"06",X"08",X"08",X"08",X"08",X"F7",X"00", + X"00",X"06",X"89",X"89",X"89",X"89",X"89",X"70",X"00",X"76",X"89",X"89",X"89",X"89",X"89",X"70", + X"00",X"06",X"01",X"01",X"01",X"01",X"01",X"76",X"00",X"76",X"89",X"89",X"89",X"89",X"89",X"76", + X"00",X"06",X"89",X"89",X"89",X"89",X"89",X"76",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1F",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"1F",X"00",X"00",X"00", + X"00",X"00",X"00",X"F8",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"F8",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08", + X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"50",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"6C",X"82",X"6C",X"00",X"6C",X"82",X"6C",X"00",X"00",X"00",X"EE",X"00",X"6C",X"82",X"6C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"00",X"00",X"00",X"00",X"00",X"E2",X"92",X"8C", + X"00",X"00",X"00",X"00",X"82",X"92",X"92",X"6C",X"00",X"00",X"00",X"00",X"0E",X"10",X"10",X"EC", + X"00",X"00",X"00",X"00",X"8E",X"92",X"92",X"E2",X"00",X"00",X"00",X"00",X"7C",X"92",X"92",X"60", + X"00",X"00",X"00",X"00",X"82",X"42",X"22",X"1E",X"00",X"00",X"00",X"00",X"6C",X"92",X"92",X"6C", + X"00",X"00",X"00",X"00",X"4C",X"92",X"92",X"7C",X"00",X"6C",X"82",X"6C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"30",X"FC",X"FE",X"AA",X"AA",X"D6",X"D6",X"FE",X"FC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"7F",X"60",X"6F",X"7C",X"7C",X"6C",X"6F",X"7F",X"18",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"40",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"3F",X"7F",X"C0",X"8A",X"AA",X"AA", + X"40",X"40",X"40",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"D5",X"D5",X"94",X"C0",X"7F",X"3F",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"FF",X"BD",X"D1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"02", + X"D1",X"BD",X"FF",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"38",X"10",X"40",X"00",X"10",X"00",X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"FC",X"FE",X"06",X"7E",X"F6",X"C6",X"C6",X"16", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"3F",X"FF",X"FF",X"F0",X"8A",X"AA",X"BF",X"86", + X"16",X"C6",X"C6",X"F6",X"7E",X"06",X"FE",X"FC",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"86",X"BF",X"AA",X"8A",X"F0",X"FF",X"FF",X"3F",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"FF",X"19",X"11",X"35",X"B7", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"08",X"00",X"01",X"01",X"81",X"19",X"61", + X"B7",X"35",X"11",X"19",X"FF",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"61",X"19",X"81",X"01",X"01",X"00",X"08",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"00",X"00",X"00",X"00",X"00",X"E0",X"FC",X"FE",X"87",X"F7",X"FF",X"F7",X"C6",X"C4",X"00", + X"03",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"FF",X"E1",X"84",X"92",X"8A",X"AA",X"BF",X"90", + X"00",X"C4",X"C6",X"F7",X"FF",X"F7",X"87",X"FE",X"FC",X"E0",X"00",X"00",X"00",X"00",X"00",X"E0", + X"90",X"BF",X"AA",X"8A",X"92",X"84",X"E1",X"FF",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"03", + X"80",X"C0",X"00",X"00",X"00",X"00",X"00",X"07",X"8F",X"FF",X"00",X"00",X"80",X"C2",X"FF",X"FB", + X"03",X"07",X"00",X"00",X"00",X"00",X"00",X"30",X"3B",X"1F",X"1E",X"1F",X"1B",X"1B",X"1D",X"1D", + X"FB",X"FF",X"C2",X"80",X"00",X"00",X"FF",X"8F",X"07",X"00",X"00",X"00",X"00",X"00",X"C0",X"80", + X"1D",X"1D",X"1B",X"1B",X"1F",X"1E",X"1F",X"3B",X"30",X"00",X"00",X"00",X"00",X"00",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"10",X"D0",X"F0",X"D0",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"1F",X"F8",X"C5",X"15",X"5F",X"70", + X"10",X"D0",X"F0",X"D0",X"10",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"5F",X"15",X"C5",X"F8",X"1F",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"9C",X"FC",X"77",X"E1",X"C1",X"85",X"FF",X"F7", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"1E",X"1C",X"19",X"19",X"1B",X"1A", + X"F7",X"FF",X"85",X"C1",X"E1",X"77",X"FC",X"9C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1A",X"1B",X"19",X"19",X"1C",X"1E",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"80",X"00",X"00",X"00",X"38",X"FC",X"02",X"56",X"56", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"AA",X"02",X"FC",X"38",X"00",X"00",X"00",X"80",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"FC",X"87",X"1F",X"31",X"B7", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01", + X"B7",X"31",X"1F",X"87",X"FC",X"70",X"00",X"00",X"00",X"02",X"08",X"00",X"44",X"00",X"00",X"00", + X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"7F",X"F0",X"0A",X"AB",X"FE",X"00", + X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"FE",X"AB",X"0A",X"F0",X"7F",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"01",X"00",X"00",X"1C",X"3F",X"41",X"5F",X"79", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"10",X"00",X"01",X"00",X"00",X"00",X"61", + X"79",X"5F",X"41",X"3F",X"1C",X"00",X"00",X"01",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"89",X"00",X"00",X"10",X"80",X"00",X"41",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"FC",X"06",X"AA",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"56",X"56",X"06",X"FC",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"1C",X"3F",X"41",X"5F",X"79", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00", + X"79",X"5F",X"41",X"3F",X"1C",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"F8",X"00",X"78",X"78",X"03",X"03",X"03",X"F8",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"7F",X"7F",X"21",X"2D",X"21",X"21",X"7F",X"7F",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1C",X"00",X"0E",X"1C",X"00",X"00",X"1C",X"0E",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"20",X"20",X"18",X"00",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"18",X"18",X"FC",X"76",X"43",X"FF",X"FF",X"73",X"06",X"FC",X"18",X"18",X"00",X"00", + X"18",X"18",X"3C",X"7E",X"D7",X"D7",X"FE",X"FE",X"FE",X"FE",X"D7",X"D7",X"7E",X"3C",X"18",X"18", + X"08",X"10",X"00",X"00",X"00",X"78",X"CD",X"FD",X"FD",X"CD",X"78",X"00",X"00",X"00",X"10",X"08", + X"21",X"42",X"00",X"00",X"00",X"21",X"12",X"0D",X"0D",X"12",X"21",X"00",X"00",X"00",X"42",X"21", + X"90",X"92",X"92",X"92",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"48",X"48",X"48",X"48", + X"24",X"24",X"24",X"24",X"1F",X"00",X"03",X"07",X"07",X"03",X"00",X"1F",X"92",X"92",X"92",X"12", + X"00",X"0F",X"18",X"08",X"D8",X"0F",X"58",X"48",X"58",X"4F",X"18",X"CF",X"18",X"0F",X"18",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"06",X"07",X"07",X"06",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"00",X"C0",X"10",X"02",X"02",X"02",X"02",X"10",X"C0",X"00",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"02",X"00",X"02",X"02",X"00",X"02",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"00",X"C0",X"10",X"02",X"02",X"02",X"02",X"10",X"C0",X"00",X"C0",X"00",X"00", + X"00",X"00",X"30",X"30",X"30",X"00",X"30",X"36",X"36",X"30",X"00",X"30",X"30",X"30",X"00",X"00", + X"00",X"00",X"C0",X"00",X"C0",X"10",X"02",X"02",X"02",X"02",X"10",X"C0",X"00",X"C0",X"00",X"00", + X"00",X"00",X"60",X"60",X"60",X"00",X"60",X"6E",X"6E",X"60",X"00",X"60",X"60",X"60",X"00",X"00", + X"00",X"00",X"00",X"10",X"10",X"90",X"78",X"C8",X"C8",X"78",X"08",X"08",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"10",X"3D",X"7B",X"16",X"10",X"78",X"3C",X"08",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"46",X"46",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"14",X"14",X"14",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"90",X"FA",X"FD",X"FE",X"FE",X"DE",X"FC",X"EC",X"F8",X"FC",X"FC",X"FC",X"F8",X"38",X"10", + X"00",X"33",X"7B",X"3F",X"3F",X"7E",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"5F",X"1F",X"29",X"18", + X"00",X"16",X"BF",X"FE",X"F7",X"FF",X"BE",X"FC",X"78",X"FC",X"FE",X"DC",X"9C",X"FC",X"EA",X"C0", + X"10",X"3B",X"7F",X"7F",X"7F",X"3B",X"7F",X"EF",X"6F",X"3F",X"7F",X"7F",X"FE",X"7F",X"73",X"20", + X"21",X"FB",X"FE",X"FE",X"4C",X"8C",X"76",X"FD",X"FE",X"DD",X"78",X"7C",X"BE",X"FC",X"F8",X"70", + X"05",X"7E",X"3F",X"7F",X"77",X"FB",X"F5",X"F7",X"79",X"7E",X"7F",X"5E",X"37",X"07",X"03",X"01", + X"E0",X"D8",X"EC",X"5C",X"D6",X"AE",X"FF",X"77",X"EE",X"8C",X"AE",X"54",X"48",X"F8",X"30",X"C0", + X"12",X"3B",X"7F",X"7F",X"7F",X"28",X"DF",X"D2",X"4D",X"75",X"FB",X"65",X"FB",X"65",X"2F",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"BE",X"F8",X"69",X"F2",X"76",X"FC",X"DC",X"F0", + X"00",X"30",X"40",X"80",X"00",X"00",X"80",X"40",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"F0",X"BC",X"F0",X"D5",X"F6",X"6D",X"27",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"01",X"49",X"6E",X"39",X"1F",X"6B",X"2D",X"7D",X"5F", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1D",X"3F",X"BD",X"F7",X"F9",X"F9",X"82",X"87",X"00",X"10",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"90",X"F0",X"FC",X"FC",X"FC",X"F8",X"F8",X"B0",X"58",X"80",X"10",X"80",X"C0",X"00",X"00", + X"00",X"05",X"09",X"93",X"EF",X"EF",X"7F",X"FD",X"FF",X"FF",X"FF",X"FD",X"F7",X"F5",X"FB",X"FF", + X"80",X"B0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F7",X"FB",X"79",X"DB",X"F7",X"FB",X"D6",X"7F",X"F9",X"B0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"1E",X"07",X"0B",X"3F",X"FF",X"7F",X"D5",X"DF",X"FF",X"7B",X"3D",X"C7",X"6B",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"5F",X"26",X"01",X"00", + X"FF",X"EF",X"6F",X"F7",X"ED",X"FD",X"F7",X"7F",X"EF",X"AF",X"41",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"01",X"03",X"05",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A0",X"D0",X"FA",X"7E",X"FC",X"DE",X"FC",X"58",X"BC",X"F8",X"F0",X"70",X"C0",X"C0",X"80",X"00", + X"00",X"07",X"1F",X"DB",X"EB",X"EB",X"FE",X"BF",X"5D",X"25",X"4B",X"A1",X"0D",X"53",X"13",X"0A", + X"90",X"F8",X"FC",X"FC",X"FC",X"FA",X"7E",X"BC",X"FE",X"E5",X"EE",X"F4",X"E4",X"F0",X"E0",X"00", + X"43",X"23",X"41",X"12",X"2D",X"4B",X"9D",X"E1",X"8F",X"FF",X"FF",X"7F",X"5F",X"FF",X"76",X"60", + X"10",X"D6",X"D4",X"FF",X"FF",X"BF",X"FF",X"6F",X"FF",X"FF",X"FE",X"FC",X"FE",X"EC",X"EB",X"F0", + X"00",X"01",X"02",X"07",X"0F",X"07",X"05",X"03",X"0F",X"BF",X"FD",X"7F",X"7F",X"1F",X"3B",X"3E", + X"F0",X"EA",X"FA",X"F4",X"EC",X"F2",X"DF",X"FF",X"FF",X"FF",X"A7",X"FB",X"B0",X"33",X"01",X"00", + X"1F",X"37",X"1F",X"17",X"15",X"17",X"3D",X"7F",X"7F",X"3B",X"5F",X"BF",X"5B",X"00",X"00",X"00", + X"80",X"00",X"00",X"10",X"48",X"94",X"0C",X"12",X"02",X"28",X"16",X"01",X"8C",X"A4",X"40",X"50", + X"12",X"60",X"8E",X"25",X"20",X"40",X"09",X"16",X"68",X"4E",X"A0",X"40",X"00",X"01",X"04",X"04", + X"A8",X"C0",X"12",X"B0",X"40",X"06",X"04",X"22",X"D0",X"18",X"E0",X"10",X"20",X"88",X"40",X"20", + X"00",X"02",X"01",X"00",X"42",X"80",X"00",X"00",X"80",X"34",X"40",X"23",X"0B",X"08",X"05",X"03", + X"10",X"04",X"10",X"11",X"01",X"02",X"80",X"08",X"86",X"25",X"01",X"80",X"10",X"00",X"20",X"D0", + X"0A",X"00",X"00",X"04",X"00",X"04",X"02",X"01",X"0C",X"0A",X"05",X"00",X"00",X"0A",X"00",X"02", + X"00",X"80",X"20",X"00",X"80",X"44",X"80",X"22",X"25",X"0A",X"90",X"44",X"60",X"10",X"D0",X"00", + X"00",X"48",X"04",X"00",X"14",X"4A",X"00",X"04",X"12",X"20",X"10",X"82",X"46",X"09",X"14",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"58",X"74",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F8",X"B8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"1C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"20",X"20",X"80",X"00",X"40", + X"00",X"00",X"00",X"04",X"20",X"04",X"00",X"93",X"40",X"09",X"60",X"7A",X"F5",X"FA",X"F4",X"F8", + X"00",X"20",X"20",X"00",X"80",X"00",X"20",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F8",X"BC",X"11",X"28",X"58",X"30",X"10",X"00",X"22",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"56",X"2E",X"52",X"0C",X"0F",X"BF",X"37",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"06",X"02",X"01",X"05",X"08",X"02", + X"07",X"25",X"8F",X"0F",X"2C",X"8A",X"49",X"04",X"2D",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"02",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"20",X"40",X"20",X"10",X"00",X"00",X"C0",X"80",X"00",X"80",X"C0", + X"00",X"00",X"00",X"01",X"00",X"00",X"A0",X"12",X"14",X"02",X"01",X"20",X"40",X"01",X"80",X"40", + X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"01",X"22",X"01",X"81",X"40",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09",X"00",X"08",X"10",X"00",X"80",X"48",X"90",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"01", + X"80",X"80",X"C0",X"40",X"20",X"40",X"C0",X"A0",X"05",X"0A",X"04",X"04",X"14",X"08",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"06",X"06",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"40",X"A0",X"D0",X"E8",X"F4",X"0A",X"05",X"05",X"0A",X"F4",X"E8",X"D0",X"A0",X"40",X"80", + X"01",X"02",X"05",X"0B",X"17",X"2F",X"57",X"A2",X"A2",X"57",X"2F",X"17",X"0B",X"05",X"02",X"01", + X"00",X"A0",X"80",X"0A",X"82",X"19",X"8A",X"2C",X"40",X"90",X"04",X"10",X"54",X"4E",X"0A",X"00", + X"00",X"80",X"92",X"12",X"41",X"40",X"02",X"00",X"01",X"00",X"84",X"80",X"2E",X"23",X"04",X"00", + X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"00",X"20",X"20",X"20",X"20",X"E0",X"00",X"00",X"00", + X"00",X"00",X"00",X"09",X"01",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"1F",X"10",X"38",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"40",X"E0",X"60",X"00",X"08",X"3E",X"77",X"63",X"C1",X"C1",X"63",X"77",X"3E",X"08", + X"00",X"00",X"00",X"0C",X"E8",X"E8",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"40",X"40",X"46",X"40",X"40",X"46",X"40",X"42",X"02",X"02",X"02",X"1E",X"10",X"38",X"10", + X"00",X"00",X"80",X"00",X"00",X"00",X"30",X"00",X"80",X"04",X"00",X"10",X"00",X"00",X"00",X"00", + X"00",X"80",X"80",X"08",X"80",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"C0",X"90",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"38",X"78",X"10",X"10",X"20",X"40",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"63",X"77",X"00",X"00",X"00",X"00",X"00",X"19",X"16",X"38",X"10", + X"00",X"02",X"17",X"7E",X"FC",X"D6",X"74",X"7C",X"74",X"D4",X"F8",X"70",X"00",X"00",X"80",X"00", + X"01",X"02",X"9E",X"BE",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF",X"BE",X"9E",X"81",X"00",X"00", + X"00",X"60",X"70",X"60",X"60",X"60",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"23",X"03",X"0B",X"0B",X"07",X"9F",X"03",X"02",X"02",X"02",X"02",X"0E",X"1C",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"C1",X"FB",X"FF",X"FF",X"FF",X"BF",X"87",X"C1",X"C3",X"E7",X"FF",X"FF",X"7E",X"3C", + X"F0",X"FE",X"FF",X"FF",X"FF",X"CF",X"C1",X"C0",X"E1",X"F3",X"FF",X"7F",X"3F",X"0E",X"00",X"00", + X"00",X"00",X"C1",X"FB",X"FF",X"3F",X"07",X"00",X"00",X"00",X"C1",X"FF",X"FF",X"3F",X"07",X"00", + X"F0",X"FE",X"FF",X"EF",X"C3",X"C0",X"C0",X"E0",X"F0",X"FE",X"7F",X"0F",X"01",X"00",X"00",X"00", + X"00",X"01",X"C1",X"FB",X"FF",X"FF",X"FF",X"BF",X"87",X"C1",X"C3",X"E7",X"FF",X"FF",X"7E",X"3C", + X"F0",X"FE",X"FF",X"FF",X"7F",X"0F",X"01",X"00",X"01",X"CF",X"FF",X"FF",X"FE",X"F0",X"F0",X"00", + X"00",X"00",X"01",X"C1",X"FB",X"FF",X"3F",X"FF",X"FF",X"FE",X"00",X"C0",X"F8",X"FF",X"3F",X"07", + X"00",X"F0",X"FE",X"7F",X"0F",X"01",X"00",X"03",X"1F",X"FF",X"FE",X"7F",X"0F",X"01",X"00",X"00", + X"00",X"00",X"C1",X"FB",X"FF",X"FF",X"3F",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"FE",X"FF",X"7F",X"0F",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C1",X"FB",X"FF",X"FF",X"FF",X"BF",X"87",X"83",X"03",X"03",X"03",X"03",X"03",X"00", + X"F0",X"FE",X"FF",X"FF",X"FF",X"CF",X"C3",X"C1",X"C1",X"C1",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"37",X"3F",X"3F",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"C1",X"C1",X"C1",X"03",X"07",X"07",X"C7",X"FF",X"FF",X"FF",X"3F",X"07",X"03",X"00", + X"1E",X"3F",X"7F",X"FF",X"F1",X"E0",X"E0",X"FE",X"7F",X"3F",X"0F",X"01",X"00",X"00",X"00",X"00", + X"00",X"01",X"C1",X"FB",X"FF",X"FF",X"FF",X"BF",X"87",X"C1",X"C3",X"E7",X"FF",X"FF",X"7E",X"3C", + X"F0",X"FE",X"FF",X"FF",X"3F",X"0F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"01",X"C1",X"FB",X"FF",X"FF",X"FF",X"FF",X"F8",X"F8",X"F8",X"FD",X"FF",X"FF",X"FF",X"3F", + X"F0",X"FE",X"FF",X"FF",X"0F",X"00",X"03",X"07",X"03",X"F0",X"FE",X"FF",X"FF",X"0F",X"01",X"00", + X"00",X"00",X"08",X"08",X"F8",X"08",X"08",X"00",X"F8",X"10",X"20",X"10",X"F8",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"81",X"01",X"01",X"01",X"01",X"01",X"01",X"FF", + X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF", + X"00",X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"FF",X"80",X"80",X"80",X"80",X"80",X"80", + X"7F",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"7F", + X"00",X"7F",X"40",X"40",X"40",X"40",X"40",X"40",X"FF",X"81",X"81",X"81",X"81",X"81",X"81",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/fg_sp_graphx_2.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/fg_sp_graphx_2.vhd new file mode 100644 index 00000000..ad10ab3a --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/fg_sp_graphx_2.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity fg_sp_graphx_2 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 prom of fg_sp_graphx_2 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + 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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"28",X"28",X"28",X"28",X"28",X"28",X"00", + X"00",X"44",X"6C",X"38",X"38",X"6C",X"44",X"00",X"00",X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38", + X"00",X"00",X"80",X"84",X"FE",X"FE",X"80",X"80",X"00",X"C4",X"E6",X"F2",X"B2",X"BA",X"9E",X"8C", + X"00",X"40",X"C2",X"92",X"9A",X"9E",X"F6",X"62",X"00",X"30",X"38",X"2C",X"26",X"FE",X"FE",X"20", + X"00",X"4E",X"CE",X"8A",X"8A",X"8A",X"FA",X"70",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60", + X"00",X"06",X"06",X"E2",X"F2",X"1A",X"0E",X"06",X"00",X"6C",X"9E",X"9A",X"B2",X"B2",X"EC",X"60", + X"00",X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38", + X"00",X"00",X"80",X"84",X"FE",X"FE",X"80",X"80",X"00",X"C4",X"E6",X"F2",X"B2",X"BA",X"9E",X"8C", + X"00",X"40",X"C2",X"92",X"9A",X"9E",X"F6",X"62",X"00",X"30",X"38",X"2C",X"26",X"FE",X"FE",X"20", + X"00",X"4E",X"CE",X"8A",X"8A",X"8A",X"FA",X"70",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60", + X"00",X"06",X"06",X"E2",X"F2",X"1A",X"0E",X"06",X"00",X"6C",X"9E",X"9A",X"B2",X"B2",X"EC",X"60", + X"00",X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"00",X"00",X"00",X"00",X"16",X"0E",X"00", + X"00",X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"F8",X"FC",X"26",X"22",X"26",X"FC",X"F8", + X"00",X"FE",X"FE",X"92",X"92",X"92",X"FE",X"6C",X"00",X"38",X"7C",X"C6",X"82",X"82",X"C6",X"44", + X"00",X"FE",X"FE",X"82",X"82",X"C6",X"7C",X"38",X"00",X"00",X"FE",X"FE",X"92",X"92",X"92",X"82", + X"00",X"FE",X"FE",X"12",X"12",X"12",X"12",X"02",X"00",X"38",X"7C",X"C6",X"82",X"92",X"F2",X"F2", + X"00",X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82", + X"00",X"40",X"C0",X"80",X"80",X"80",X"FE",X"7E",X"00",X"FE",X"FE",X"30",X"78",X"EC",X"C6",X"82", + X"00",X"00",X"FE",X"FE",X"80",X"80",X"80",X"80",X"00",X"FE",X"FE",X"1C",X"38",X"1C",X"FE",X"FE", + X"00",X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C", + X"00",X"FE",X"FE",X"22",X"22",X"22",X"3E",X"1C",X"00",X"7C",X"FE",X"82",X"A2",X"E2",X"7E",X"BC", + X"00",X"FE",X"FE",X"22",X"62",X"F2",X"DE",X"9C",X"00",X"4C",X"DE",X"92",X"92",X"96",X"F4",X"60", + X"00",X"00",X"02",X"02",X"FE",X"FE",X"02",X"02",X"00",X"7E",X"FE",X"80",X"80",X"80",X"FE",X"7E", + X"00",X"1E",X"3E",X"70",X"E0",X"70",X"3E",X"1E",X"00",X"3E",X"FE",X"70",X"38",X"70",X"FE",X"3E", + X"00",X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"00",X"06",X"1E",X"F0",X"F0",X"1E",X"06", + X"00",X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"F8",X"FC",X"26",X"22",X"26",X"FC",X"F8", + X"00",X"FE",X"FE",X"92",X"92",X"92",X"FE",X"6C",X"00",X"38",X"7C",X"C6",X"82",X"82",X"C6",X"44", + X"00",X"FE",X"FE",X"82",X"82",X"C6",X"7C",X"38",X"00",X"00",X"FE",X"FE",X"92",X"92",X"92",X"82", + X"00",X"FE",X"FE",X"12",X"12",X"12",X"12",X"02",X"00",X"38",X"7C",X"C6",X"82",X"92",X"F2",X"F2", + X"00",X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82", + X"00",X"40",X"C0",X"80",X"80",X"80",X"FE",X"7E",X"00",X"FE",X"FE",X"30",X"78",X"EC",X"C6",X"82", + X"00",X"00",X"FE",X"FE",X"80",X"80",X"80",X"80",X"00",X"FE",X"FE",X"1C",X"38",X"1C",X"FE",X"FE", + X"00",X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C", + X"00",X"FE",X"FE",X"22",X"22",X"22",X"3E",X"1C",X"00",X"7C",X"FE",X"82",X"A2",X"E2",X"7E",X"BC", + X"00",X"FE",X"FE",X"22",X"62",X"F2",X"DE",X"9C",X"00",X"4C",X"DE",X"92",X"92",X"96",X"F4",X"60", + X"00",X"00",X"02",X"02",X"FE",X"FE",X"02",X"02",X"00",X"7E",X"FE",X"80",X"80",X"80",X"FE",X"7E", + X"00",X"1E",X"3E",X"70",X"E0",X"70",X"3E",X"1E",X"00",X"3E",X"FE",X"70",X"38",X"70",X"FE",X"3E", + X"00",X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"00",X"06",X"1E",X"F0",X"F0",X"1E",X"06", + X"00",X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"60",X"60",X"08",X"1C",X"0E",X"06",X"00", + X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"50",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"7E",X"81",X"BD",X"BD",X"A5",X"A5",X"81",X"7E", + X"00",X"FF",X"FF",X"C3",X"C3",X"E7",X"7E",X"7E",X"FF",X"DB",X"DB",X"DB",X"7E",X"FF",X"C3",X"C3", + X"F7",X"76",X"7E",X"FF",X"C3",X"C3",X"FF",X"7E",X"FF",X"89",X"7E",X"7E",X"7E",X"7E",X"7E",X"89", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"88",X"FF",X"FF",X"8F",X"76",X"76",X"76",X"76",X"76",X"F9", + X"FF",X"FF",X"7E",X"76",X"76",X"76",X"76",X"89",X"FF",X"F9",X"F7",X"F7",X"F7",X"F7",X"08",X"FF", + X"FF",X"F9",X"76",X"76",X"76",X"76",X"76",X"8F",X"FF",X"89",X"76",X"76",X"76",X"76",X"76",X"8F", + X"FF",X"F9",X"FE",X"FE",X"FE",X"FE",X"FE",X"89",X"FF",X"89",X"76",X"76",X"76",X"76",X"76",X"89", + X"FF",X"F9",X"76",X"76",X"76",X"76",X"76",X"89",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"00",X"00",X"00", + X"00",X"00",X"00",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8", + X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"50",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"EE",X"00",X"00",X"76",X"76",X"00",X"00",X"EE", + X"00",X"6C",X"82",X"6C",X"00",X"6C",X"82",X"6C",X"00",X"00",X"00",X"EE",X"00",X"6C",X"82",X"6C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"00",X"00",X"00",X"00",X"00",X"E2",X"92",X"8C", + X"00",X"00",X"00",X"00",X"82",X"92",X"92",X"6C",X"00",X"00",X"00",X"00",X"0E",X"10",X"10",X"EC", + X"00",X"00",X"00",X"00",X"8E",X"92",X"92",X"E2",X"00",X"00",X"00",X"00",X"7C",X"92",X"92",X"60", + X"00",X"00",X"00",X"00",X"82",X"42",X"22",X"1E",X"00",X"00",X"00",X"00",X"6C",X"92",X"92",X"6C", + X"00",X"00",X"00",X"00",X"4C",X"92",X"92",X"7C",X"00",X"6C",X"82",X"6C",X"00",X"00",X"00",X"00", + X"C2",X"94",X"6A",X"FC",X"FE",X"FF",X"FF",X"FE",X"FC",X"FE",X"FE",X"FE",X"FE",X"FC",X"D8",X"00", + X"00",X"46",X"7F",X"3F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"1F",X"3F",X"7E",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"84",X"28",X"D4",X"F8",X"FC",X"FE",X"FE",X"FC",X"F8",X"FC",X"FC",X"FC",X"FC",X"F8",X"B0",X"00", + X"01",X"8D",X"FE",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"7F",X"FD",X"48", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"50",X"A8",X"F0",X"F8",X"FC",X"FC",X"F8",X"F0",X"F8",X"F8",X"F8",X"F8",X"F0",X"60",X"00", + X"03",X"1A",X"FD",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"FF",X"FB",X"90", + X"00",X"01",X"01",X"00",X"00",X"01",X"03",X"03",X"03",X"03",X"01",X"01",X"00",X"00",X"01",X"00", + X"10",X"A0",X"50",X"E0",X"F0",X"F8",X"F8",X"F0",X"E0",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"00", + X"06",X"34",X"FB",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F6",X"20", + X"00",X"02",X"03",X"01",X"01",X"03",X"07",X"07",X"07",X"07",X"03",X"03",X"00",X"01",X"03",X"01", + X"20",X"40",X"A0",X"C0",X"E0",X"F0",X"F0",X"E0",X"C0",X"E0",X"E0",X"E0",X"E0",X"C0",X"80",X"00", + X"0C",X"69",X"F6",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"ED",X"40", + X"00",X"04",X"07",X"03",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"01",X"03",X"07",X"02", + X"40",X"80",X"40",X"80",X"C0",X"E0",X"E0",X"C0",X"80",X"C0",X"C0",X"C0",X"C0",X"80",X"00",X"00", + X"18",X"D2",X"ED",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"DB",X"80", + X"00",X"08",X"0F",X"07",X"07",X"0F",X"1F",X"1F",X"1F",X"1F",X"0F",X"0F",X"03",X"07",X"0F",X"04", + X"80",X"00",X"80",X"00",X"80",X"C0",X"C0",X"80",X"00",X"80",X"80",X"80",X"80",X"00",X"00",X"00", + X"30",X"A5",X"DA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"B6",X"00", + X"00",X"11",X"1F",X"0F",X"0F",X"1F",X"3F",X"3F",X"3F",X"3F",X"1F",X"1F",X"07",X"0F",X"1F",X"09", + X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"61",X"4A",X"B5",X"FE",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF",X"FF",X"FE",X"6C",X"00", + X"00",X"23",X"3F",X"1F",X"1F",X"3F",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"0F",X"1F",X"3F",X"12", + X"78",X"FC",X"FC",X"70",X"02",X"00",X"7D",X"7D",X"7D",X"7D",X"00",X"02",X"FC",X"FC",X"78",X"00", + X"00",X"7C",X"FE",X"FE",X"40",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"40",X"38",X"FE",X"FE",X"7C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"20",X"00",X"80",X"A0",X"A0", + X"00",X"00",X"00",X"00",X"0E",X"1F",X"1F",X"1F",X"1F",X"1E",X"40",X"80",X"3F",X"7F",X"7F",X"7F", + X"A0",X"A0",X"80",X"00",X"20",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"7F",X"7F",X"3F",X"80",X"40",X"1E",X"1F",X"1F",X"1F",X"1F",X"0E",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"78",X"78",X"7F",X"78",X"00",X"7E",X"5E", + X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"25",X"00",X"04",X"10",X"00",X"68",X"1F",X"76",X"3C", + X"5E",X"7E",X"00",X"78",X"7F",X"78",X"78",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1C",X"46",X"0F",X"28",X"00",X"00",X"04",X"00",X"24",X"00",X"00",X"04",X"00",X"00",X"00",X"00", + X"00",X"E0",X"F0",X"F0",X"F0",X"F0",X"E0",X"FE",X"03",X"01",X"F8",X"F8",X"F8",X"F9",X"F9",X"F9", + X"00",X"03",X"07",X"07",X"07",X"07",X"03",X"3F",X"C0",X"00",X"00",X"0F",X"7F",X"7F",X"7F",X"7F", + X"F9",X"F9",X"F9",X"F8",X"F8",X"F8",X"01",X"02",X"FC",X"E0",X"F0",X"F0",X"F0",X"F0",X"E0",X"00", + X"7F",X"7F",X"7F",X"7F",X"0F",X"00",X"00",X"C0",X"3F",X"03",X"07",X"07",X"07",X"07",X"03",X"00", + X"00",X"00",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"F8",X"FF",X"FE",X"0C",X"FE",X"FE",X"FE",X"BE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C1",X"01",X"12",X"00",X"60",X"00",X"9C", + X"BE",X"FE",X"FE",X"FE",X"0C",X"FE",X"FF",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00", + X"9C",X"00",X"60",X"00",X"12",X"01",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"F8",X"F8",X"F8",X"F8",X"F8",X"F0",X"02",X"01",X"F9",X"F9",X"F9",X"F9",X"F8",X"F8",X"F8", + X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"F0",X"00",X"1F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F", + X"F8",X"F8",X"F8",X"F9",X"F9",X"F9",X"F9",X"01",X"02",X"F0",X"F8",X"F8",X"F8",X"F8",X"F8",X"E0", + X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"1F",X"00",X"F0",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"07", + X"00",X"C0",X"E0",X"F0",X"F0",X"F0",X"FF",X"D8",X"B0",X"00",X"FF",X"FF",X"FF",X"FD",X"DD",X"DC", + X"00",X"07",X"0F",X"1F",X"1F",X"1F",X"1F",X"7F",X"7F",X"3C",X"2F",X"27",X"27",X"27",X"25",X"25", + X"DC",X"DD",X"FD",X"FF",X"FF",X"FF",X"00",X"B0",X"D8",X"FF",X"F0",X"F0",X"F0",X"E0",X"C0",X"00", + X"25",X"25",X"27",X"27",X"27",X"2F",X"3C",X"7F",X"7F",X"1F",X"1F",X"1F",X"1F",X"0F",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"70",X"00",X"E0",X"E0",X"E0",X"E8",X"E8", + X"00",X"00",X"00",X"00",X"00",X"1F",X"3F",X"3F",X"3F",X"1E",X"E0",X"07",X"3F",X"FF",X"FF",X"FF", + X"E8",X"E8",X"E0",X"E0",X"E0",X"00",X"70",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"3F",X"07",X"E0",X"1E",X"3F",X"3F",X"3F",X"1F",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"BE",X"3B",X"F8",X"FE",X"FE",X"FA",X"9A",X"B8", + X"00",X"00",X"1F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1F",X"10",X"21",X"23",X"27",X"27",X"27",X"26", + X"B8",X"9A",X"FA",X"FE",X"FE",X"F8",X"3B",X"BE",X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"00",X"00", + X"26",X"27",X"27",X"27",X"23",X"21",X"10",X"1F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1F",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"B8",X"7C",X"7C",X"7C",X"78",X"02",X"FD",X"FC",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FC",X"FD",X"02",X"78",X"7C",X"7C",X"7C",X"B8",X"40",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"04",X"00",X"08",X"FA",X"FC",X"F9",X"F8",X"F0",X"03",X"78",X"FE",X"FE",X"BE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"02",X"02",X"02", + X"BE",X"FE",X"FE",X"78",X"03",X"F0",X"F8",X"F9",X"FC",X"F8",X"08",X"00",X"40",X"00",X"00",X"00", + X"02",X"02",X"02",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"40", + X"00",X"00",X"00",X"00",X"00",X"7F",X"7F",X"7F",X"7F",X"1C",X"00",X"0F",X"FF",X"FF",X"FF",X"FF", + X"40",X"40",X"00",X"00",X"00",X"00",X"00",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"0F",X"00",X"1C",X"7F",X"7F",X"7F",X"7F",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"98",X"3C",X"3C",X"3C",X"1C",X"00",X"3E",X"3E",X"3E", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"80",X"04",X"00",X"00",X"12",X"00",X"80", + X"3E",X"3E",X"3E",X"00",X"1C",X"3C",X"3C",X"3C",X"98",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"00",X"02",X"88",X"01",X"04",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"7C",X"7C",X"F8",X"02",X"F8",X"FC",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FC",X"F8",X"02",X"F8",X"7C",X"7C",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"18",X"3C",X"3C",X"3D",X"40",X"BE",X"BE",X"BE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"02",X"00",X"00",X"00",X"04",X"02",X"00", + X"BE",X"BE",X"BE",X"40",X"3D",X"3C",X"3C",X"18",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"04",X"00",X"00",X"00",X"02",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3E",X"3E",X"3E",X"18",X"FF",X"FC",X"84",X"84",X"84",X"84",X"FC",X"FF",X"18",X"3E",X"3E",X"3E", + X"FE",X"FE",X"FE",X"18",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"18",X"FE",X"FE",X"FE", + X"18",X"7E",X"7E",X"7E",X"1C",X"00",X"FC",X"03",X"03",X"FC",X"1C",X"7E",X"7E",X"7E",X"18",X"00", + X"00",X"30",X"FC",X"FC",X"FC",X"78",X"FF",X"80",X"80",X"FF",X"00",X"58",X"FC",X"FC",X"FC",X"30", + X"1C",X"3E",X"3E",X"20",X"FE",X"F1",X"E3",X"FF",X"FF",X"E3",X"F1",X"FE",X"3E",X"3E",X"1C",X"00", + X"00",X"78",X"FC",X"FC",X"7D",X"3F",X"67",X"5F",X"5F",X"67",X"3F",X"41",X"FC",X"FC",X"FC",X"78", + X"FE",X"FE",X"FE",X"38",X"FC",X"FE",X"FE",X"FF",X"FF",X"FE",X"FE",X"FC",X"38",X"FE",X"FE",X"FE", + X"FE",X"FE",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"7C",X"FE",X"FE", + X"18",X"BC",X"BC",X"FE",X"FE",X"FF",X"FA",X"F2",X"02",X"37",X"FF",X"FE",X"FE",X"BC",X"BC",X"18", + X"63",X"F7",X"F7",X"FF",X"FF",X"5F",X"7F",X"73",X"72",X"6D",X"7F",X"FF",X"FF",X"F7",X"F7",X"63", + X"FC",X"FE",X"FE",X"FE",X"00",X"08",X"08",X"00",X"00",X"20",X"20",X"00",X"FE",X"FE",X"FE",X"FC", + X"7F",X"FF",X"FF",X"FF",X"20",X"80",X"87",X"8F",X"8F",X"87",X"80",X"20",X"FF",X"FF",X"FF",X"7F", + X"EF",X"EF",X"FF",X"1F",X"DF",X"1F",X"7F",X"5F",X"7F",X"5F",X"1F",X"1F",X"1F",X"FF",X"FF",X"FF", + X"F3",X"F3",X"F3",X"42",X"40",X"4C",X"5E",X"7F",X"7F",X"5E",X"4C",X"40",X"42",X"F3",X"F3",X"F3", + X"E0",X"00",X"00",X"8E",X"CE",X"C0",X"E2",X"C2",X"E2",X"E2",X"C0",X"8E",X"8E",X"00",X"00",X"E0", + X"79",X"00",X"02",X"07",X"3F",X"3F",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"15",X"00",X"00",X"79", + X"E0",X"E0",X"00",X"EE",X"0E",X"E0",X"F2",X"12",X"12",X"F2",X"E0",X"0E",X"EE",X"00",X"E0",X"E0", + X"79",X"00",X"00",X"FC",X"FE",X"BE",X"FC",X"FE",X"FE",X"FC",X"FE",X"FE",X"3C",X"08",X"00",X"79", + X"E0",X"E0",X"00",X"EE",X"0E",X"E0",X"F2",X"12",X"12",X"F2",X"E0",X"0E",X"EE",X"00",X"E0",X"E0", + X"79",X"01",X"30",X"F1",X"F0",X"87",X"F7",X"F1",X"F1",X"F7",X"C7",X"F0",X"31",X"30",X"01",X"79", + X"E0",X"E0",X"00",X"EE",X"0E",X"E0",X"F2",X"12",X"12",X"F2",X"E0",X"0E",X"EE",X"00",X"E0",X"E0", + X"79",X"09",X"60",X"69",X"68",X"0F",X"6F",X"61",X"61",X"6F",X"0F",X"68",X"69",X"60",X"09",X"79", + X"00",X"78",X"FC",X"EC",X"EC",X"60",X"80",X"30",X"30",X"80",X"70",X"F4",X"F4",X"FC",X"78",X"00", + X"00",X"78",X"FC",X"EC",X"EC",X"42",X"84",X"29",X"29",X"84",X"42",X"F4",X"F4",X"FC",X"78",X"00", + X"3C",X"3C",X"38",X"40",X"80",X"00",X"E0",X"E1",X"E1",X"E0",X"00",X"80",X"40",X"38",X"3C",X"3C", + X"10",X"7C",X"7C",X"7C",X"18",X"40",X"5F",X"5F",X"5F",X"5F",X"40",X"18",X"7C",X"7C",X"7C",X"10", + X"80",X"60",X"04",X"9A",X"E8",X"FC",X"F8",X"70",X"F8",X"F4",X"E0",X"52",X"B0",X"00",X"50",X"20", + X"00",X"80",X"05",X"E7",X"0D",X"BF",X"3F",X"2F",X"96",X"BF",X"BF",X"9F",X"06",X"20",X"12",X"00", + X"00",X"A8",X"40",X"E8",X"1C",X"90",X"40",X"88",X"D0",X"E0",X"F0",X"F8",X"70",X"28",X"C0",X"00", + X"21",X"44",X"32",X"C4",X"2A",X"6D",X"97",X"53",X"37",X"57",X"17",X"9F",X"2F",X"B2",X"24",X"41", + X"42",X"04",X"40",X"E4",X"F2",X"F0",X"C8",X"12",X"99",X"A2",X"F4",X"F8",X"F4",X"7A",X"74",X"80", + X"0A",X"8B",X"45",X"0B",X"9F",X"7F",X"BF",X"DF",X"5F",X"3F",X"8F",X"23",X"49",X"13",X"04",X"02", + X"20",X"20",X"10",X"F8",X"FC",X"FC",X"FE",X"FF",X"FC",X"FE",X"FC",X"F8",X"F0",X"F0",X"C0",X"00", + X"33",X"14",X"8D",X"8F",X"3B",X"DF",X"BF",X"7F",X"3F",X"5F",X"BF",X"FF",X"5F",X"3F",X"15",X"08", + X"00",X"00",X"00",X"00",X"30",X"78",X"3C",X"38",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"B0",X"7C",X"EC",X"DE",X"9C",X"CA",X"E7",X"72",X"AE", + X"00",X"40",X"80",X"00",X"00",X"00",X"B0",X"60",X"70",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"EE",X"F2",X"8E",X"3A",X"2C",X"F6",X"7B",X"7E",X"02",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"02",X"B6",X"95",X"16",X"A0",X"77",X"77",X"CF",X"E7", + X"00",X"00",X"02",X"06",X"07",X"07",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"2B",X"43",X"D3",X"6C",X"8C",X"16",X"3E",X"3F",X"08",X"20",X"00",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"02",X"01",X"06",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"40",X"A6",X"C2",X"FA",X"E8",X"F8",X"F0",X"C8",X"80",X"00",X"20",X"60",X"00",X"00",X"00", + X"02",X"0C",X"1B",X"41",X"13",X"3D",X"F8",X"9F",X"CF",X"9F",X"0E",X"DE",X"C8",X"EA",X"F4",X"FE", + X"00",X"C0",X"70",X"80",X"40",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"3E",X"DF",X"EE",X"DA",X"C4",X"A9",X"F0",X"32",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"20",X"38",X"36",X"46",X"8F",X"9E",X"7F",X"7C",X"60",X"FE",X"F3",X"3F",X"9F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"01",X"01",X"03",X"50",X"A2",X"4D",X"02",X"01", + X"C3",X"7B",X"FD",X"FF",X"3A",X"B3",X"3A",X"AC",X"1D",X"51",X"82",X"00",X"00",X"00",X"00",X"00", + X"02",X"01",X"02",X"04",X"0A",X"00",X"02",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"20",X"C4",X"F0",X"FA",X"F8",X"F8",X"F4",X"60",X"84",X"88",X"80",X"20",X"20",X"40",X"00", + X"01",X"08",X"01",X"27",X"1F",X"3F",X"F1",X"FA",X"FF",X"FF",X"FF",X"FE",X"FE",X"FF",X"FE",X"FF", + X"00",X"00",X"60",X"F0",X"F8",X"F4",X"E0",X"F0",X"F0",X"FA",X"F0",X"C8",X"58",X"80",X"00",X"00", + X"FC",X"FE",X"FE",X"FD",X"DB",X"F7",X"FB",X"FF",X"7F",X"BF",X"FF",X"AF",X"F6",X"61",X"01",X"00", + X"80",X"28",X"2B",X"00",X"FE",X"FE",X"FF",X"FE",X"77",X"FE",X"F5",X"FB",X"FF",X"5F",X"3F",X"3F", + X"01",X"02",X"05",X"08",X"00",X"09",X"0B",X"0F",X"95",X"6E",X"4F",X"FF",X"2F",X"20",X"46",X"59", + X"FF",X"FF",X"F5",X"FB",X"FF",X"FF",X"EE",X"FB",X"FF",X"FF",X"7F",X"EE",X"4D",X"C8",X"04",X"00", + X"27",X"8B",X"A7",X"2F",X"2F",X"2B",X"4F",X"0F",X"9B",X"0D",X"A7",X"40",X"A4",X"00",X"00",X"00", + X"00",X"00",X"00",X"20",X"D0",X"B8",X"18",X"14",X"0C",X"22",X"70",X"0A",X"F0",X"80",X"58",X"00", + X"05",X"10",X"BC",X"EC",X"00",X"40",X"8B",X"26",X"68",X"48",X"20",X"00",X"01",X"01",X"06",X"00", + X"00",X"00",X"40",X"A0",X"42",X"08",X"08",X"00",X"20",X"40",X"80",X"00",X"80",X"40",X"00",X"40", + X"00",X"04",X"01",X"01",X"06",X"00",X"00",X"10",X"88",X"75",X"7A",X"60",X"4A",X"0C",X"14",X"1E", + X"00",X"40",X"14",X"30",X"35",X"02",X"80",X"08",X"9C",X"2B",X"01",X"00",X"80",X"00",X"20",X"F0", + X"00",X"0A",X"00",X"00",X"04",X"00",X"11",X"01",X"00",X"04",X"0A",X"00",X"00",X"0A",X"0A",X"03", + X"00",X"80",X"80",X"20",X"00",X"C4",X"84",X"20",X"24",X"28",X"80",X"C4",X"E0",X"60",X"58",X"60", + X"00",X"00",X"4C",X"00",X"00",X"14",X"4E",X"08",X"00",X"18",X"38",X"82",X"C6",X"40",X"14",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"78",X"38",X"FC",X"FA",X"F0",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"F4",X"F0",X"74",X"30",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"08",X"16",X"1C",X"1F",X"1F",X"3F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"21",X"1D",X"0F",X"0C",X"08",X"08",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"20",X"20",X"80",X"00",X"40", + X"00",X"00",X"00",X"04",X"20",X"04",X"00",X"93",X"40",X"29",X"68",X"7A",X"F5",X"FA",X"F4",X"F8", + X"00",X"20",X"20",X"00",X"80",X"00",X"20",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"F4",X"FC",X"75",X"28",X"78",X"30",X"10",X"00",X"22",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"5E",X"2E",X"56",X"1C",X"0F",X"BB",X"37",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"06",X"02",X"01",X"05",X"08",X"02", + X"07",X"25",X"8F",X"0F",X"2C",X"8A",X"49",X"04",X"2D",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"02",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"20",X"40",X"20",X"10",X"00",X"00",X"C0",X"80",X"00",X"80",X"C0", + X"00",X"00",X"00",X"01",X"00",X"00",X"A0",X"12",X"14",X"02",X"01",X"20",X"40",X"01",X"80",X"40", + X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"01",X"22",X"01",X"81",X"40",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09",X"00",X"08",X"10",X"00",X"80",X"48",X"90",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"01", + X"80",X"80",X"C0",X"40",X"20",X"40",X"C0",X"A0",X"05",X"0A",X"04",X"04",X"14",X"08",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"00",X"80",X"CE",X"CE",X"C0",X"E0",X"E0",X"E0",X"E0",X"C0",X"CE",X"CE",X"80",X"00",X"E0", + X"79",X"00",X"3F",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"3F",X"00",X"79", + X"CF",X"03",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"03",X"CF", + X"03",X"00",X"03",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"03",X"00",X"03", + X"C0",X"E0",X"F0",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"F8",X"F0",X"E0",X"C0", + X"03",X"07",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"7F",X"3F",X"1F",X"0F",X"07",X"03", + X"C0",X"48",X"7C",X"FC",X"7D",X"E6",X"75",X"D2",X"BC",X"6C",X"FA",X"EC",X"AA",X"B0",X"76",X"10", + X"00",X"82",X"15",X"0C",X"4E",X"07",X"ED",X"FF",X"FE",X"FF",X"8F",X"07",X"21",X"04",X"01",X"00", + X"00",X"F0",X"08",X"F4",X"14",X"14",X"F4",X"08",X"F0",X"60",X"60",X"60",X"E0",X"E0",X"00",X"00", + X"FC",X"FF",X"C0",X"C9",X"C1",X"C1",X"C9",X"C0",X"FF",X"FC",X"04",X"04",X"3F",X"3F",X"40",X"28", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"20",X"90",X"48",X"64",X"98",X"80",X"00",X"00", + X"20",X"90",X"C8",X"E4",X"F2",X"69",X"34",X"62",X"EB",X"F7",X"22",X"22",X"F7",X"EB",X"63",X"36", + X"00",X"F0",X"0C",X"00",X"E4",X"E0",X"E0",X"0C",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FA",X"C3",X"C0",X"C8",X"C7",X"C1",X"C8",X"C6",X"C3",X"FA",X"FA",X"0A",X"3E",X"3A",X"44",X"20", + X"00",X"04",X"D4",X"54",X"34",X"79",X"F9",X"E0",X"80",X"C4",X"64",X"34",X"90",X"E0",X"60",X"00", + X"00",X"80",X"80",X"0E",X"86",X"07",X"07",X"FF",X"FF",X"FF",X"06",X"03",X"C1",X"90",X"00",X"00", + X"80",X"80",X"80",X"80",X"BC",X"44",X"44",X"FC",X"90",X"B0",X"60",X"C0",X"80",X"00",X"00",X"00", + X"88",X"88",X"88",X"88",X"88",X"E3",X"F7",X"88",X"FF",X"88",X"00",X"00",X"39",X"3F",X"06",X"28", + X"02",X"15",X"6C",X"E2",X"F2",X"F8",X"FC",X"FC",X"FC",X"FC",X"F8",X"70",X"00",X"80",X"80",X"00", + X"03",X"9E",X"BE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"BE",X"9F",X"81",X"00",X"00", + X"E0",X"60",X"70",X"60",X"60",X"60",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"83",X"21",X"01",X"09",X"09",X"07",X"9F",X"03",X"06",X"06",X"06",X"1E",X"1E",X"20",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"78",X"3E",X"06",X"00",X"00",X"00",X"81",X"C3",X"7E",X"3C", + X"80",X"80",X"80",X"B0",X"BE",X"8F",X"81",X"80",X"80",X"80",X"C0",X"71",X"3F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"38",X"07",X"00",X"00",X"00",X"00",X"00",X"C0",X"38",X"07",X"00", + X"C0",X"80",X"90",X"AE",X"83",X"80",X"80",X"80",X"80",X"C0",X"70",X"0E",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"78",X"3E",X"06",X"00",X"00",X"00",X"81",X"C3",X"7E",X"3C", + X"80",X"80",X"80",X"F0",X"7E",X"0F",X"01",X"00",X"00",X"80",X"80",X"81",X"8E",X"80",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"38",X"00",X"01",X"FE",X"00",X"00",X"00",X"C0",X"38",X"07", + X"00",X"80",X"80",X"70",X"0E",X"01",X"00",X"02",X"10",X"80",X"80",X"70",X"0E",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"F8",X"3F",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"F0",X"7E",X"0F",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"78",X"3C",X"06",X"82",X"02",X"02",X"02",X"02",X"03",X"00", + X"80",X"80",X"80",X"B0",X"BE",X"8F",X"83",X"81",X"81",X"81",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"24",X"20",X"3C",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C0",X"C0",X"00",X"04",X"04",X"04",X"04",X"C0",X"F8",X"3C",X"07",X"03",X"00", + X"10",X"20",X"4E",X"9F",X"91",X"80",X"C0",X"C0",X"70",X"3E",X"0F",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"78",X"3E",X"06",X"00",X"00",X"00",X"81",X"C3",X"7E",X"3C", + X"80",X"80",X"80",X"F0",X"3E",X"0F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"E0",X"07",X"1F",X"18",X"C0",X"C0",X"00",X"00",X"C0",X"F8",X"3F", + X"80",X"80",X"F0",X"FE",X"0F",X"00",X"03",X"06",X"03",X"80",X"80",X"F0",X"FE",X"0F",X"01",X"00", + X"00",X"00",X"08",X"08",X"F8",X"08",X"08",X"00",X"F8",X"10",X"20",X"10",X"F8",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"81",X"01",X"01",X"01",X"01",X"01",X"01",X"FF", + X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF", + X"00",X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"FF",X"80",X"80",X"80",X"80",X"80",X"80", + X"7F",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"7F", + X"00",X"7F",X"40",X"40",X"40",X"40",X"40",X"40",X"FF",X"81",X"81",X"81",X"81",X"81",X"81",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/fg_sp_graphx_3.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/fg_sp_graphx_3.vhd new file mode 100644 index 00000000..ed0cb8c9 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/Roms/fg_sp_graphx_3.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity fg_sp_graphx_3 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 prom of fg_sp_graphx_3 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38", + X"00",X"00",X"80",X"84",X"FE",X"FE",X"80",X"80",X"00",X"C4",X"E6",X"F2",X"B2",X"BA",X"9E",X"8C", + X"00",X"40",X"C2",X"92",X"9A",X"9E",X"F6",X"62",X"00",X"30",X"38",X"2C",X"26",X"FE",X"FE",X"20", + X"00",X"4E",X"CE",X"8A",X"8A",X"8A",X"FA",X"70",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60", + X"00",X"06",X"06",X"E2",X"F2",X"1A",X"0E",X"06",X"00",X"6C",X"9E",X"9A",X"B2",X"B2",X"EC",X"60", + X"00",X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"00",X"00",X"00",X"00",X"16",X"0E",X"00", + X"00",X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"F8",X"FC",X"26",X"22",X"26",X"FC",X"F8", + X"00",X"FE",X"FE",X"92",X"92",X"92",X"FE",X"6C",X"00",X"38",X"7C",X"C6",X"82",X"82",X"C6",X"44", + X"00",X"FE",X"FE",X"82",X"82",X"C6",X"7C",X"38",X"00",X"00",X"FE",X"FE",X"92",X"92",X"92",X"82", + X"00",X"FE",X"FE",X"12",X"12",X"12",X"12",X"02",X"00",X"38",X"7C",X"C6",X"82",X"92",X"F2",X"F2", + X"00",X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82", + X"00",X"40",X"C0",X"80",X"80",X"80",X"FE",X"7E",X"00",X"FE",X"FE",X"30",X"78",X"EC",X"C6",X"82", + X"00",X"00",X"FE",X"FE",X"80",X"80",X"80",X"80",X"00",X"FE",X"FE",X"1C",X"38",X"1C",X"FE",X"FE", + X"00",X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C", + X"00",X"FE",X"FE",X"22",X"22",X"22",X"3E",X"1C",X"00",X"7C",X"FE",X"82",X"A2",X"E2",X"7E",X"BC", + X"00",X"FE",X"FE",X"22",X"62",X"F2",X"DE",X"9C",X"00",X"4C",X"DE",X"92",X"92",X"96",X"F4",X"60", + X"00",X"00",X"02",X"02",X"FE",X"FE",X"02",X"02",X"00",X"7E",X"FE",X"80",X"80",X"80",X"FE",X"7E", + X"00",X"1E",X"3E",X"70",X"E0",X"70",X"3E",X"1E",X"00",X"3E",X"FE",X"70",X"38",X"70",X"FE",X"3E", + X"00",X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"00",X"06",X"1E",X"F0",X"F0",X"1E",X"06", + X"00",X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7E",X"81",X"BD",X"BD",X"A5",X"A5",X"81",X"7E", + X"00",X"FF",X"FF",X"C3",X"C3",X"E7",X"7E",X"7E",X"FF",X"DB",X"DB",X"DB",X"7E",X"FF",X"C3",X"C3", + X"F7",X"76",X"7E",X"FF",X"C3",X"C3",X"FF",X"7E",X"00",X"76",X"81",X"81",X"81",X"81",X"81",X"76", + X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"00",X"00",X"70",X"89",X"89",X"89",X"89",X"89",X"06", + X"00",X"00",X"81",X"89",X"89",X"89",X"89",X"76",X"00",X"06",X"08",X"08",X"08",X"08",X"F7",X"00", + X"00",X"06",X"89",X"89",X"89",X"89",X"89",X"70",X"00",X"76",X"89",X"89",X"89",X"89",X"89",X"70", + X"00",X"06",X"01",X"01",X"01",X"01",X"01",X"76",X"00",X"76",X"89",X"89",X"89",X"89",X"89",X"76", + X"00",X"06",X"89",X"89",X"89",X"89",X"89",X"76",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1F",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"1F",X"00",X"00",X"00", + X"00",X"00",X"00",X"F8",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"F8",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08", + X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"50",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"70",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"42",X"20",X"E8",X"E0",X"D8",X"78",X"FC",X"D8",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"C0",X"D2",X"65",X"E6",X"43",X"7F",X"1D",X"3B",X"7E",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"84",X"40",X"D0",X"C0",X"B0",X"F0",X"F8",X"B0",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"80",X"A4",X"CA",X"CD",X"87",X"FF",X"3A",X"77",X"FD",X"48", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"08",X"80",X"A0",X"80",X"60",X"E0",X"F0",X"60",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"49",X"94",X"9B",X"0F",X"FF",X"75",X"EF",X"FB",X"90", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"01",X"03",X"01",X"01",X"00",X"00",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"10",X"00",X"40",X"00",X"C0",X"C0",X"E0",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"92",X"29",X"37",X"1F",X"FE",X"EB",X"DF",X"F6",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"03",X"07",X"02",X"03",X"00",X"01",X"03",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"80",X"00",X"80",X"80",X"C0",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"01",X"24",X"52",X"6E",X"3E",X"FD",X"D7",X"BF",X"ED",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0D",X"06",X"0E",X"04",X"07",X"01",X"03",X"07",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"02",X"48",X"A4",X"DD",X"7C",X"FB",X"AF",X"7F",X"DB",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"1A",X"0C",X"1C",X"08",X"0F",X"03",X"07",X"0F",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"90",X"48",X"BA",X"F8",X"F6",X"5E",X"FF",X"B6",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"30",X"34",X"19",X"39",X"10",X"1F",X"07",X"0E",X"1F",X"09", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"21",X"90",X"74",X"F0",X"EC",X"BC",X"FE",X"6C",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"60",X"69",X"32",X"73",X"21",X"3F",X"0E",X"1D",X"3F",X"12", + X"08",X"1C",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7C",X"44",X"30",X"00", + X"00",X"1C",X"06",X"0E",X"00",X"00",X"0F",X"1C",X"1C",X"0C",X"0F",X"40",X"18",X"70",X"44",X"30", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"20",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"10",X"60",X"40",X"38",X"00",X"3C",X"70", + X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"21",X"00",X"04",X"00",X"00",X"00",X"18",X"77",X"01", + X"70",X"3C",X"00",X"38",X"40",X"60",X"10",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"47",X"08",X"00",X"00",X"00",X"04",X"00",X"20",X"00",X"00",X"04",X"00",X"00",X"00",X"00", + X"C0",X"80",X"00",X"80",X"80",X"00",X"80",X"C0",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"01",X"03",X"02",X"07",X"02",X"05",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"C0",X"80",X"00",X"80",X"80",X"00",X"80",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"05",X"02",X"07",X"02",X"03",X"01", + X"00",X"00",X"00",X"00",X"70",X"80",X"70",X"A0",X"C0",X"40",X"3E",X"0C",X"18",X"10",X"34",X"F6", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"02",X"02",X"02",X"02", + X"F6",X"34",X"10",X"18",X"0C",X"3E",X"80",X"C0",X"D0",X"80",X"A0",X"70",X"00",X"00",X"00",X"00", + X"02",X"02",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"40",X"80",X"80",X"40",X"00",X"E0",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"03",X"07", + X"03",X"02",X"0D",X"05",X"01",X"0C",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"03",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"E0",X"00",X"40",X"80",X"80",X"40",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0C",X"01",X"05",X"0D",X"02",X"03", + X"00",X"C0",X"00",X"80",X"50",X"40",X"00",X"00",X"80",X"00",X"00",X"00",X"80",X"C2",X"FF",X"FB", + X"00",X"07",X"04",X"09",X"0F",X"14",X"0F",X"38",X"3F",X"1C",X"0E",X"07",X"03",X"03",X"07",X"07", + X"FB",X"FF",X"C2",X"80",X"00",X"00",X"00",X"80",X"80",X"80",X"00",X"80",X"00",X"00",X"C0",X"00", + X"07",X"07",X"03",X"03",X"07",X"0E",X"1C",X"3F",X"35",X"08",X"02",X"15",X"0A",X"04",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"1F",X"02",X"2A",X"10",X"1A",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"1A",X"10",X"2A",X"02",X"1F",X"00",X"00",X"00",X"00", + X"00",X"80",X"00",X"00",X"80",X"00",X"00",X"00",X"9C",X"38",X"70",X"E0",X"C0",X"84",X"FE",X"F6", + X"00",X"0F",X"04",X"12",X"34",X"08",X"3E",X"2A",X"0F",X"00",X"00",X"00",X"01",X"01",X"03",X"03", + X"F6",X"FE",X"84",X"C0",X"E0",X"70",X"38",X"9C",X"00",X"00",X"00",X"80",X"00",X"00",X"80",X"00", + X"03",X"03",X"01",X"01",X"00",X"00",X"00",X"0F",X"2A",X"3E",X"08",X"34",X"12",X"04",X"0F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"50",X"60",X"50",X"38",X"00",X"00",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"00",X"00",X"38",X"50",X"60",X"50",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"04",X"00",X"78",X"82",X"34",X"D1",X"E0",X"70",X"00",X"00",X"1E",X"30",X"F6", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F6",X"30",X"1E",X"00",X"00",X"70",X"80",X"51",X"84",X"A0",X"70",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"1C",X"14",X"6A",X"20",X"5A",X"1C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"40",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"5A",X"20",X"6A",X"14",X"1C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"30",X"10",X"1C",X"00",X"00",X"1E",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00", + X"38",X"1E",X"00",X"00",X"1C",X"30",X"28",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"00",X"00",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"00",X"00",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"10",X"20",X"1C",X"00",X"00",X"1E",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"1E",X"00",X"00",X"1C",X"20",X"10",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"02",X"06",X"00",X"F8",X"03",X"03",X"03",X"78",X"78",X"00",X"F8",X"00",X"1E",X"10",X"1C", + X"0E",X"1E",X"02",X"00",X"7F",X"7F",X"3F",X"33",X"3F",X"3F",X"7F",X"7F",X"00",X"60",X"70",X"40", + X"2C",X"60",X"74",X"68",X"38",X"30",X"00",X"FC",X"FC",X"00",X"2C",X"36",X"0E",X"1E",X"24",X"00", + X"00",X"58",X"3C",X"18",X"10",X"30",X"00",X"7F",X"7F",X"00",X"60",X"60",X"E0",X"E8",X"F0",X"68", + X"00",X"0C",X"06",X"00",X"00",X"0E",X"1C",X"00",X"00",X"00",X"00",X"00",X"22",X"1A",X"14",X"00", + X"00",X"28",X"34",X"1C",X"14",X"00",X"18",X"20",X"20",X"18",X"00",X"00",X"C0",X"E8",X"F0",X"68", + X"70",X"7E",X"62",X"00",X"00",X"70",X"40",X"FC",X"FC",X"70",X"00",X"00",X"00",X"06",X"16",X"0E", + X"60",X"26",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"62",X"06", + X"08",X"10",X"00",X"00",X"00",X"78",X"C8",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"21",X"42",X"00",X"00",X"00",X"01",X"12",X"05",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"84",X"C4",X"FC",X"F0",X"D0",X"90",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"1F",X"7F",X"7B",X"77",X"77",X"7B",X"7F",X"1F",X"00",X"00",X"00",X"00", + X"60",X"20",X"60",X"E0",X"20",X"E0",X"80",X"80",X"80",X"80",X"E0",X"20",X"E0",X"00",X"00",X"00", + X"00",X"80",X"80",X"31",X"3F",X"37",X"27",X"07",X"3F",X"3F",X"3F",X"3F",X"31",X"11",X"00",X"11", + X"00",X"F0",X"F0",X"68",X"28",X"3F",X"1F",X"BF",X"9F",X"DF",X"BF",X"62",X"62",X"F0",X"F0",X"00", + X"00",X"7F",X"FD",X"F8",X"C0",X"D8",X"B0",X"B6",X"BD",X"EE",X"FF",X"F3",X"FE",X"FF",X"7F",X"00", + X"80",X"80",X"00",X"08",X"08",X"0F",X"1F",X"1F",X"1F",X"1F",X"0F",X"02",X"02",X"00",X"00",X"80", + X"00",X"7F",X"FF",X"FB",X"2B",X"DB",X"33",X"37",X"BF",X"6F",X"7F",X"33",X"F7",X"F7",X"7F",X"00", + X"80",X"C0",X"00",X"08",X"08",X"0F",X"1F",X"1F",X"1F",X"1F",X"0F",X"02",X"02",X"00",X"C0",X"80", + X"01",X"78",X"F8",X"F8",X"38",X"F8",X"38",X"3E",X"BE",X"78",X"78",X"38",X"F8",X"F8",X"78",X"01", + X"80",X"C0",X"00",X"08",X"08",X"0F",X"FF",X"1F",X"1F",X"FF",X"0F",X"02",X"02",X"00",X"C0",X"80", + X"01",X"F0",X"F0",X"F8",X"F8",X"F8",X"FF",X"FE",X"FE",X"FF",X"F8",X"F8",X"F8",X"F0",X"F0",X"01", + X"00",X"20",X"60",X"50",X"50",X"10",X"78",X"C8",X"C8",X"78",X"88",X"0C",X"0C",X"0C",X"08",X"00", + X"00",X"08",X"0C",X"1C",X"1C",X"3C",X"78",X"10",X"16",X"7B",X"3D",X"48",X"48",X"60",X"20",X"00", + X"14",X"14",X"00",X"30",X"60",X"F8",X"1C",X"1E",X"1E",X"1C",X"F8",X"60",X"30",X"00",X"08",X"08", + X"00",X"00",X"04",X"0C",X"00",X"3F",X"20",X"20",X"20",X"20",X"3F",X"00",X"00",X"20",X"20",X"00", + X"00",X"00",X"00",X"08",X"80",X"40",X"90",X"40",X"00",X"00",X"80",X"00",X"00",X"00",X"10",X"00", + X"00",X"00",X"00",X"20",X"00",X"30",X"02",X"08",X"02",X"13",X"08",X"14",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"10",X"20",X"10",X"08",X"10",X"28",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"2E",X"32",X"20",X"00", + X"00",X"00",X"00",X"00",X"90",X"80",X"C0",X"00",X"10",X"00",X"20",X"30",X"70",X"28",X"40",X"00", + X"00",X"00",X"00",X"00",X"07",X"1F",X"1F",X"0E",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"F8",X"DC",X"EC",X"7E",X"77",X"F8",X"D4",X"B8",X"F8",X"E0",X"C0",X"00",X"00", + X"00",X"00",X"04",X"0E",X"1B",X"18",X"35",X"3F",X"1F",X"1F",X"3F",X"7F",X"0F",X"1C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"08",X"40",X"E0",X"51",X"A1", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E1",X"B3",X"84",X"08",X"08",X"00",X"48",X"2C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"03",X"05",X"0D",X"27", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"09",X"03",X"91",X"40",X"84",X"12",X"2C",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"80",X"C8",X"70",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"2C",X"68",X"9D",X"C0",X"92",X"0C",X"D8",X"C0",X"E0",X"F0",X"FE", + X"00",X"80",X"40",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"06",X"3A",X"51",X"8A",X"12",X"00",X"00",X"30",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"0C",X"1E",X"51",X"1C",X"40",X"3A",X"33",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"2B",X"0C",X"14",X"08",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"70",X"F8",X"D0",X"F8",X"50",X"20",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"0B",X"2B",X"60",X"FA",X"71",X"7A",X"4C",X"4E",X"82",X"6C",X"70",X"9C", + X"00",X"00",X"60",X"10",X"08",X"04",X"80",X"C0",X"80",X"DA",X"90",X"08",X"18",X"80",X"00",X"00", + X"BC",X"DE",X"BE",X"ED",X"DA",X"B4",X"FA",X"FF",X"7F",X"B7",X"EF",X"AF",X"F2",X"61",X"01",X"00", + X"00",X"00",X"28",X"00",X"2A",X"54",X"82",X"9E",X"27",X"9E",X"F5",X"BB",X"7F",X"5F",X"3F",X"3F", + X"00",X"00",X"01",X"00",X"00",X"00",X"02",X"04",X"01",X"2A",X"47",X"6D",X"22",X"00",X"02",X"18", + X"0F",X"17",X"25",X"5B",X"F7",X"FF",X"EE",X"FB",X"FF",X"FF",X"27",X"EA",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"04",X"05",X"03",X"0D",X"0F",X"1B",X"09",X"07",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"10",X"08",X"04",X"00",X"00",X"00",X"0A",X"90",X"00",X"18",X"00", + X"01",X"00",X"14",X"08",X"00",X"00",X"08",X"20",X"28",X"48",X"20",X"00",X"00",X"01",X"00",X"00", + X"00",X"00",X"00",X"20",X"42",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"80",X"70",X"70",X"00",X"00",X"00",X"04",X"00", + X"00",X"00",X"10",X"10",X"01",X"02",X"80",X"08",X"86",X"25",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"44",X"80",X"20",X"24",X"08",X"80",X"44",X"60",X"00",X"58",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"10",X"82",X"46",X"00",X"14",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"4E",X"FE",X"DE",X"85",X"87",X"C7",X"A7",X"8B",X"FF", + X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"07",X"47",X"CE",X"CD",X"C6",X"7C",X"7E",X"AC",X"50",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"1A",X"3E",X"7E",X"2F",X"7F",X"FF",X"20",X"EF",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00", + X"FE",X"7F",X"E2",X"7F",X"7F",X"7F",X"FF",X"FE",X"54",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"A0",X"60",X"A0",X"50",X"A0",X"F0",X"58",X"A8",X"70",X"A8",X"D4",X"F8", + X"00",X"00",X"C4",X"AE",X"77",X"AF",X"D6",X"FF",X"FF",X"FF",X"FD",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"FA",X"B4",X"3C",X"F8",X"D4",X"F8",X"94",X"58",X"B0",X"60",X"C0",X"00",X"00",X"00",X"00", + X"FF",X"47",X"6F",X"FF",X"FD",X"FE",X"7D",X"7F",X"AE",X"76",X"BD",X"FA",X"94",X"08",X"00",X"00", + X"00",X"00",X"00",X"0A",X"15",X"7F",X"FD",X"FB",X"FF",X"7F",X"FF",X"7F",X"FF",X"BF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"03",X"02",X"07",X"0F",X"19",X"0F",X"0F",X"0F",X"1F",X"1C",X"0E", + X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"FE",X"FF",X"57",X"2B",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0B",X"07",X"03",X"07",X"02",X"04",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"88",X"B4",X"D8",X"F8",X"74",X"EA",X"7E",X"7E",X"B3",X"4D",X"CA",X"B4",X"9A",X"D6",X"FC", + X"00",X"71",X"CE",X"FD",X"2A",X"F7",X"EC",X"D7",X"B7",X"57",X"2D",X"26",X"41",X"6B",X"83",X"DB", + X"FE",X"FE",X"FC",X"FE",X"7B",X"9D",X"CA",X"C4",X"92",X"3C",X"C0",X"C0",X"A0",X"40",X"80",X"00", + X"F7",X"EB",X"FD",X"FB",X"FF",X"EF",X"FF",X"FD",X"FE",X"7F",X"B7",X"CB",X"FC",X"BA",X"11",X"00", + X"00",X"00",X"00",X"01",X"A1",X"65",X"77",X"8B",X"6D",X"3E",X"1A",X"15",X"CB",X"EB",X"B4",X"79", + X"00",X"00",X"00",X"00",X"08",X"00",X"02",X"00",X"01",X"02",X"04",X"02",X"01",X"4B",X"67",X"0F", + X"DF",X"FF",X"FF",X"5F",X"3F",X"D7",X"ED",X"FF",X"7F",X"EE",X"55",X"0E",X"1D",X"08",X"00",X"00", + X"1F",X"1E",X"0C",X"09",X"12",X"04",X"01",X"10",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"C0",X"60",X"80",X"00",X"00",X"80",X"B8",X"70",X"64",X"18",X"B0", + X"00",X"80",X"00",X"00",X"24",X"56",X"83",X"04",X"37",X"50",X"BA",X"D5",X"B6",X"68",X"6B",X"9C", + X"24",X"2A",X"00",X"86",X"0A",X"11",X"82",X"04",X"12",X"18",X"40",X"80",X"20",X"40",X"80",X"00", + X"D4",X"0A",X"54",X"09",X"28",X"00",X"0A",X"21",X"18",X"56",X"A5",X"02",X"10",X"22",X"01",X"00", + X"00",X"00",X"00",X"00",X"20",X"00",X"20",X"82",X"28",X"10",X"0A",X"14",X"08",X"02",X"24",X"59", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"01",X"00",X"04",X"02",X"00",X"48",X"64",X"0C", + X"55",X"2A",X"18",X"06",X"1A",X"94",X"0D",X"0B",X"02",X"40",X"10",X"00",X"09",X"00",X"00",X"00", + X"10",X"1A",X"0C",X"09",X"10",X"04",X"00",X"10",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F0",X"70",X"28",X"28",X"3F",X"1B",X"19",X"19",X"1B",X"3F",X"22",X"22",X"70",X"F0",X"00", + X"00",X"7F",X"C0",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"C0",X"7F",X"00", + X"00",X"FC",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"FC",X"00", + X"00",X"0F",X"1C",X"10",X"10",X"F0",X"90",X"90",X"90",X"90",X"F0",X"10",X"10",X"1C",X"0F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"A0",X"48",X"12",X"BA",X"5B",X"E6",X"F4",X"F8",X"B0",X"90",X"D8",X"48",X"02",X"08",X"00", + X"00",X"02",X"07",X"0C",X"0F",X"06",X"E7",X"3F",X"F6",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"F0",X"08",X"08",X"08",X"08",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"80",X"BF",X"BE",X"BE",X"BE",X"BE",X"BF",X"80",X"F8",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"60",X"30",X"18",X"00",X"00",X"00",X"00", + X"C0",X"60",X"30",X"18",X"0C",X"06",X"03",X"23",X"63",X"63",X"00",X"00",X"63",X"63",X"22",X"00", + X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"10",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FC",X"FF",X"F1",X"F8",X"FE",X"F1",X"F9",X"FC",X"FC",X"04",X"04",X"00",X"04",X"00",X"00", + X"00",X"04",X"50",X"04",X"30",X"69",X"C0",X"80",X"00",X"40",X"24",X"00",X"80",X"60",X"00",X"00", + X"00",X"00",X"00",X"06",X"04",X"05",X"04",X"FF",X"7F",X"06",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"77",X"77",X"77",X"77",X"7F",X"7F",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"60",X"F0",X"D0",X"74",X"7C",X"74",X"D4",X"F8",X"70",X"00",X"00",X"00",X"00", + X"00",X"00",X"9C",X"BE",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF",X"BE",X"9C",X"80",X"00",X"00", + X"00",X"E0",X"F0",X"E0",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"7C",X"FD",X"FD",X"FD",X"FD",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"08",X"F8",X"08",X"08",X"00",X"F8",X"10",X"20",X"10",X"F8",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"81",X"01",X"01",X"01",X"01",X"01",X"01",X"FF", + X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF", + X"00",X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"FF",X"80",X"80",X"80",X"80",X"80",X"80", + X"7F",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"7F", + X"00",X"7F",X"40",X"40",X"40",X"40",X"40",X"40",X"FF",X"81",X"81",X"81",X"81",X"81",X"81",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/YM2149_linmix_sep.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/YM2149_linmix_sep.vhd new file mode 100644 index 00000000..6ed2498a --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/YM2149_linmix_sep.vhd @@ -0,0 +1,574 @@ +-- changes for seperate audio outputs and enable now enables cpu access as well +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + O_CHAN : out std_logic_vector(1 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal cnt_div_t1 : std_logic_vector(3 downto 0); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8; + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process(RESET_L, CLK) + begin + -- looks like registers are latches in real chip, but the address is caught at the end of the address state. + if (RESET_L = '0') then + addr <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA = '1') then + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end if; + end process; + + p_wdata : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + elsif rising_edge(CLK) then + if (ENA = '1') then + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, reg, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + -- envelope shapes + -- C AtAlH + -- 0 0 x x \___ + -- + -- 0 1 x x /___ + -- + -- 1 0 0 0 \\\\ + -- + -- 1 0 0 1 \___ + -- + -- 1 0 1 0 \/\/ + -- ___ + -- 1 0 1 1 \ + -- + -- 1 1 0 0 //// + -- ___ + -- 1 1 0 1 / + -- + -- 1 1 1 0 /\/\ + -- + -- 1 1 1 1 /___ + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + cnt_div_t1 <= cnt_div; + end if; + end process; + + p_audio_output : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_AUDIO <= (others => '0'); + O_CHAN <= (others => '0'); + elsif rising_edge(CLK) then + + if (ENA = '1') then + O_AUDIO <= dac_amp(7 downto 0); + O_CHAN <= cnt_div_t1(1 downto 0); + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then -- resync + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end if; + end process; +end architecture RTL; diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/build_id.tcl b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/build_id.v b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/build_id.v new file mode 100644 index 00000000..c76bbf65 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171226" +`define BUILD_TIME "145326" diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/burnin_rubber _sound.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/burnin_rubber _sound.vhd new file mode 100644 index 00000000..8a619de8 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/burnin_rubber _sound.vhd @@ -0,0 +1,426 @@ +--------------------------------------------------------------------------------- +-- burnin rubber sound by Dar (darfpga@aol.fr) (05/12/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T65(b) core.Ver 301 by MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Use burnin_rubber_de10_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.ALL; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity burnin_rubber_sound is +port +( + clock_12 : in std_logic; + reset : in std_logic; + + sound_req : in std_logic; + sound_code_in : in std_logic_vector(7 downto 0); + sound_timing : in std_logic; + + audio_out : out std_logic_vector(10 downto 0); + + dbg_cpu_addr: out std_logic_vector(15 downto 0) + ); +end burnin_rubber_sound; + +architecture syn of burnin_rubber_sound is + + -- clocks, reset + signal clock_12n : std_logic; + signal clock_div1 : std_logic_vector(8 downto 0) := (others =>'0'); + signal clock_div2 : std_logic_vector(4 downto 0) := (others =>'0'); + signal clock_500K : std_logic; + signal ayx_clock : std_logic; + signal reset_n : std_logic; + + -- cpu signals + signal cpu_addr : std_logic_vector(23 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_di_dec : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_rw_n : std_logic; + signal cpu_nmi_n : std_logic; + signal cpu_irq_n : std_logic; + signal cpu_sync : std_logic; + + -- program rom signals + signal prog_rom_cs : std_logic; + signal prog_rom_do : std_logic_vector(7 downto 0); + + -- working ram signals + signal wram_cs : std_logic; + signal wram_we : std_logic; + signal wram_do : std_logic_vector(7 downto 0); + + -- sound req management + signal nmi_reg : std_logic; + signal nmi_reg_cs : std_logic; + signal nmi_reg_we : std_logic; + signal sound_code : std_logic_vector(7 downto 0); + signal sound_code_cs : std_logic; + + -- ay-3-8910 signal + signal ay1_bc1 : std_logic; + signal ay1_bdir : std_logic; + signal ay1_audio_chan : std_logic_vector(1 downto 0); + signal ay1_audio_muxed: std_logic_vector(7 downto 0); + signal ay1_chan_a: std_logic_vector(7 downto 0); + signal ay1_chan_b: std_logic_vector(7 downto 0); + signal ay1_chan_c: std_logic_vector(7 downto 0); + + signal ay2_bc1 : std_logic; + signal ay2_bdir : std_logic; + signal ay2_audio_chan : std_logic_vector(1 downto 0); + signal ay2_audio_muxed: std_logic_vector(7 downto 0); + signal ay2_chan_a: std_logic_vector(7 downto 0); + signal ay2_chan_b: std_logic_vector(7 downto 0); + signal ay2_chan_c: std_logic_vector(7 downto 0); + + -- digital filtering AY2 channel A + signal uin : integer range -256 to 255; + signal u3 : integer range -32768 to 32767; + signal u4 : integer range -32768 to 32767; + signal du3 : integer range -32768*4096 to 32767*4096; + signal du4 : integer range -32768*4096 to 32767*4096; + signal uout : integer range -32768 to 32767; + signal uout_lim : integer range -128 to 127; + +begin + +process (clock_12, cpu_sync) +begin + if rising_edge(clock_12) then + if cpu_sync = '1' then + dbg_cpu_addr <= cpu_addr(15 downto 0); + end if; + end if; +end process; + +reset_n <= not reset; +clock_12n <= not clock_12; + +process (clock_12, reset) + begin + if reset='1' then + clock_div1 <= (others => '0'); + clock_div2 <= (others => '0'); + else + if rising_edge(clock_12) then + if clock_div1 = "111111111" then -- divide by 512 (23.437kHz) + clock_div1 <= "000000000"; + else + clock_div1 <= clock_div1 + '1'; + end if; + if clock_div2 = "10111" then -- divide by 24 + clock_div2 <= "00000"; + else + clock_div2 <= clock_div2 + '1'; + end if; + end if; + end if; +end process; + +clock_500K <= clock_div2(4); --12MHz/24 = 500kHz +ayx_clock <= clock_div1(2); --12MHz/8 = 1.5MHz + +--static ADDRESS_MAP_START( audio_map, AS_PROGRAM, 8, btime_state ) +-- AM_RANGE(0x0000, 0x03ff) AM_MIRROR(0x1c00) AM_RAM AM_SHARE("audio_rambase") +-- AM_RANGE(0x2000, 0x3fff) AM_DEVWRITE("ay1", ay8910_device, data_w) +-- AM_RANGE(0x4000, 0x5fff) AM_DEVWRITE("ay1", ay8910_device, address_w) +-- AM_RANGE(0x6000, 0x7fff) AM_DEVWRITE("ay2", ay8910_device, data_w) +-- AM_RANGE(0x8000, 0x9fff) AM_DEVWRITE("ay2", ay8910_device, address_w) +-- AM_RANGE(0xa000, 0xbfff) AM_READ(audio_command_r) +-- AM_RANGE(0xc000, 0xdfff) AM_WRITE(audio_nmi_enable_w) +-- AM_RANGE(0xe000, 0xefff) AM_MIRROR(0x1000) AM_ROM +--ADDRESS_MAP_END + +-- chip select +wram_cs <= '1' when cpu_addr(15 downto 13) = "000" else '0'; -- working ram 0000-07ff .. 1fff +ay1_bc1 <= '1' when cpu_addr(15 downto 13) = "010" else '0'; +ay1_bdir <= '1' when cpu_addr(15 downto 13) = "001" or ay1_bc1 = '1' else '0'; +ay2_bc1 <= '1' when cpu_addr(15 downto 13) = "100" else '0'; +ay2_bdir <= '1' when cpu_addr(15 downto 13) = "011" or ay2_bc1 = '1' else '0'; +sound_code_cs <= '1' when cpu_addr(15 downto 13) = "101" else '0'; +nmi_reg_cs <= '1' when cpu_addr(15 downto 13) = "110" else '0'; +prog_rom_cs <= '1' when cpu_addr(15 downto 13) = "111" else '0'; + +-- write enable +wram_we <= '1' when wram_cs = '1' and cpu_rw_n = '0' else '0'; +nmi_reg_we <= '1' when nmi_reg_cs = '1' and cpu_rw_n = '0' else '0'; + +-- cpu di mux +cpu_di <= wram_do when wram_cs = '1' else + prog_rom_do when prog_rom_cs = '1' else + sound_code when sound_code_cs = '1' else + X"FF"; + +-- regsiter sound code and irq management +process (clock_12) +begin + if rising_edge(clock_12) then + if sound_req = '1' then + sound_code <= sound_code_in; + cpu_irq_n <= '0'; + end if; + if sound_code_cs = '1' then + cpu_irq_n <= '1'; + end if; + end if; +end process; + +-- nmi autorisation management +process (reset, clock_12) +begin + if reset = '1' then + nmi_reg <= '0'; + else + if rising_edge(clock_12) then + if nmi_reg_we = '1' then + nmi_reg <= cpu_do(0); + end if; + end if; + end if; +end process; + +-- nmi +cpu_nmi_n <= '0' when nmi_reg = '1' and sound_timing = '1' else '1'; + +-- demux AY chips output +process (ayx_clock) +begin + if rising_edge(ayx_clock) then + if ay1_audio_chan = "00" then ay1_chan_a <= ay1_audio_muxed; end if; + if ay1_audio_chan = "01" then ay1_chan_b <= ay1_audio_muxed; end if; + if ay1_audio_chan = "10" then ay1_chan_c <= ay1_audio_muxed; end if; + if ay2_audio_chan = "00" then ay2_chan_a <= ay2_audio_muxed; end if; + if ay2_audio_chan = "01" then ay2_chan_b <= ay2_audio_muxed; end if; + if ay2_audio_chan = "10" then ay2_chan_c <= ay2_audio_muxed; end if; + end if; +end process; + +-- AOP Rauch passe bande filter +-- +-- ----------o------------ +-- u4^ | | | +-- | --- C4 | | R5 | +-- | --- | | | +-- | | C3 | | +-- --| R1 |----o----||---o------|\ | +-- ^ | ------> u3 | \__o--- +-- | | | / ^ +-- |uin | | R2 --|/ | +-- | | | | | uout +-- | | | | +-- ------------o--------------o---------- +-- +-- +-- i1 = (sin+u3)/R1 +-- i2 = -u3/R2 +-- i3 = (u4-u3)/R5 +-- i4 = i2-i1-i3 +-- +-- u3(t+dt) = u3(t) + i3(t)*dt/C3; +-- u4(t+dt) = u4(t) + i4(t)*dt/C4; + +-- uout = u4-u3 + +-- R1 = 5000; +-- R2 = 10000; +-- C3 = 0.068e-6; +-- C4 = 0.068e-6; +-- R5 = 47000; +-- +-- dt = 1/f_ech = 1/23437 +-- dt/C3 = dt/C4 = 627 +-- +-- (i3(t)*dt/C3)*8192 = du3*8192 = ((u4-u3)/47000*627)*8192 +-- = (u4-u3)*109 +-- +-- (i4(t)*dt/C4)*8192 = du4*8192 = (-u3/10000 -(uin+u3)/5000 -(u4-u3)/47000)*627*8192 +-- = -u3(514+1027-109) - uin*1027 - u4*109 +-- = -(u4*109 + u3*1432 + uin*1027) +-- + +-- down sample to 23.437kHz and filter AY2 channel A +uin <= to_integer(unsigned(ay2_chan_a)); + +process (clock_12) +begin + if rising_edge(clock_12) then + + if clock_div1 = "000000000" then + du3 <= u4*109 - u3*109; + du4 <= u4*109 + u3*1432 + uin*1027*16; -- add gain(16) to uin + end if; + + if clock_div1 = "000000001" then + u3 <= u3 + du3/8192; + u4 <= u4 - du4/8192; + end if; + + if clock_div1 = "000000010" then + uout <= (u4 - u3) / 8; -- adjust output gain + end if; + + -- limit signed dynamique before return to unsigned + if clock_div1 = "000000011" then + if uout > 127 then + uout_lim <= 127; + elsif uout < -127 then + uout_lim <= -127; + else + uout_lim <= uout; + end if; + end if; + + if clock_div1 = "000000100" then + + audio_out <= ("000"&ay1_chan_a(7 downto 0)) + + ("000"&ay1_chan_b(7 downto 0)) + + ("000"&ay1_chan_c(7 downto 0)) + + ("000"&std_logic_vector(to_unsigned(uout_lim+128,8)))+ + ("000"&ay2_chan_b(7 downto 0)) + + ("000"&ay2_chan_c(7 downto 0)); + end if; + + end if; +end process; + +--------------------------- +-- components +--------------------------- + +cpu_inst : entity work.T65 +port map +( + Mode => "00", -- 6502 + Res_n => reset_n, + Enable => '1', + Clk => clock_500K, + Rdy => '1', + Abort_n => '1', + IRQ_n => cpu_irq_n, + NMI_n => cpu_nmi_n, + SO_n => '1',--cpu_so_n, + R_W_n => cpu_rw_n, + Sync => cpu_sync, -- open + EF => open, + MF => open, + XF => open, + ML_n => open, + VP_n => open, + VDA => open, + VPA => open, + A => cpu_addr, + DI => cpu_di, + DO => cpu_do +); + + +-- working ram +wram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 11) +port map( + clk => clock_12n, + we => wram_we, + addr => cpu_addr(10 downto 0), + d => cpu_do, + q => wram_do +); + +-- program rom +program_rom: entity work.burnin_rubber_sound_prog +port map( + clk => clock_12n, + addr => cpu_addr(11 downto 0), + data => prog_rom_do +); + +-- AY-3-8910 #1 +ay_3_8910_1 : entity work.YM2149 +port map( + -- data bus + I_DA => cpu_do, -- in std_logic_vector(7 downto 0); + O_DA => open, -- out std_logic_vector(7 downto 0); + O_DA_OE_L => open, -- out std_logic; + -- control + I_A9_L => '0', -- in std_logic; + I_A8 => '1', -- in std_logic; + I_BDIR => ay1_bdir, -- in std_logic; + I_BC2 => '1', -- in std_logic; + I_BC1 => ay1_bc1, -- in std_logic; + I_SEL_L => '1', -- in std_logic; + + O_AUDIO => ay1_audio_muxed, -- out std_logic_vector(7 downto 0); + O_CHAN => ay1_audio_chan, -- out std_logic_vector(1 downto 0); + + -- port a + I_IOA => X"00", -- in std_logic_vector(7 downto 0); + O_IOA => open, -- out std_logic_vector(7 downto 0); + O_IOA_OE_L => open, -- out std_logic; + -- port b + I_IOB => X"00", -- in std_logic_vector(7 downto 0); + O_IOB => open, -- out std_logic_vector(7 downto 0); + O_IOB_OE_L => open, -- out std_logic; + + ENA => '1', -- in std_logic; -- clock enable for higher speed operation + RESET_L => reset_n, -- in std_logic; + CLK => ayx_clock -- in std_logic -- note 6 Mhz +); + +-- AY-3-8910 #2 +ay_3_8910_2 : entity work.YM2149 +port map( + -- data bus + I_DA => cpu_do, -- in std_logic_vector(7 downto 0); + O_DA => open, -- out std_logic_vector(7 downto 0); + O_DA_OE_L => open, -- out std_logic; + -- control + I_A9_L => '0', -- in std_logic; + I_A8 => '1', -- in std_logic; + I_BDIR => ay2_bdir, -- in std_logic; + I_BC2 => '1', -- in std_logic; + I_BC1 => ay2_bc1, -- in std_logic; + I_SEL_L => '1', -- in std_logic; + + O_AUDIO => ay2_audio_muxed, -- out std_logic_vector(7 downto 0); + O_CHAN => ay2_audio_chan, -- out std_logic_vector(1 downto 0); + + -- port a + I_IOA => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOA => open, -- out std_logic_vector(7 downto 0); + O_IOA_OE_L => open, -- out std_logic; + -- port b + I_IOB => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOB => open, -- out std_logic_vector(7 downto 0); + O_IOB_OE_L => open, -- out std_logic; + + ENA => '1', --cpu_ena, -- in std_logic; -- clock enable for higher speed operation + RESET_L => reset_n, -- in std_logic; + CLK => ayx_clock -- in std_logic -- note 6 Mhz +); + + +end SYN; diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/burnin_rubber.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/burnin_rubber.vhd new file mode 100644 index 00000000..06231f08 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/burnin_rubber.vhd @@ -0,0 +1,817 @@ +--------------------------------------------------------------------------------- +-- burnin rubber by Dar (darfpga@aol.fr) (05/12/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T65(b) core.Ver 301 by MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Use burnin_rubber_de10_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.ALL; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity burnin_rubber is +port +( + clock_12 : in std_logic; + reset : in std_logic; + + video_r : out std_logic_vector(2 downto 0); + video_g : out std_logic_vector(2 downto 0); + video_b : out std_logic_vector(1 downto 0); + + video_hs : out std_logic; + video_vs : out std_logic; + video_blankn : out std_logic; + video_csync : out std_logic; + + audio_out : out std_logic_vector(10 downto 0); + + start2 : in std_logic; + start1 : in std_logic; + coin1 : in std_logic; + + fire1 : in std_logic; + right1 : in std_logic; + left1 : in std_logic; + down1 : in std_logic; + up1 : in std_logic; + + fire2 : in std_logic; + right2 : in std_logic; + left2 : in std_logic; + down2 : in std_logic; + up2 : in std_logic; + + dbg_cpu_addr: out std_logic_vector(15 downto 0) + ); +end burnin_rubber; + +architecture syn of burnin_rubber is + + -- clocks, reset + signal clock_12n : std_logic; + signal clock_6 : std_logic := '0'; + signal reset_n : std_logic; + + -- cpu signals + signal cpu_addr : std_logic_vector(23 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_di_dec : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_rw_n : std_logic; + signal cpu_nmi_n : std_logic; + signal cpu_sync : std_logic; + signal cpu_ena : std_logic; + + -- program rom signals + signal prog_rom_cs : std_logic; + signal prog_rom_do : std_logic_vector(7 downto 0); + + -- working ram signals + signal wram_cs : std_logic; + signal wram_we : std_logic; + signal wram_do : std_logic_vector(7 downto 0); + + -- foreground ram signals + signal fg_ram_cs : std_logic; + signal fg_ram_low_we : std_logic; + signal fg_ram_high_we : std_logic; + signal fg_ram_addr_sel : std_logic_vector(1 downto 0); + signal fg_ram_addr : std_logic_vector(9 downto 0); + signal fg_ram_low_do : std_logic_vector(7 downto 0); + signal fg_ram_high_do : std_logic_vector(1 downto 0); + + + -- video scan counter + signal hcnt : std_logic_vector(8 downto 0); + signal vcnt : std_logic_vector(8 downto 0); + signal hsync0 : std_logic; + signal hsync1 : std_logic; + signal hsync2 : std_logic; + signal csync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic; + + signal hcnt_flip : std_logic_vector(8 downto 0); + signal vcnt_flip : std_logic_vector(8 downto 0); + signal cocktail_we : std_logic; + signal cocktail_flip : std_logic := '0'; + signal hcnt8_r : std_logic; + signal hcnt8_rr : std_logic; + + -- io + signal io_cs : std_logic; + signal dip_sw1 : std_logic_vector(7 downto 0); + signal dip_sw2 : std_logic_vector(7 downto 0); + signal btn_p1 : std_logic_vector(7 downto 0); + signal btn_p2 : std_logic_vector(7 downto 0); + signal btn_system : std_logic_vector(7 downto 0); + + -- foreground and sprite graphix + signal sprite_attr : std_logic_vector( 2 downto 0); + signal sprite_tile : std_logic_vector( 7 downto 0); + signal sprite_line : std_logic_vector( 7 downto 0); + signal sprite_buffer_addr : std_logic_vector( 7 downto 0); + signal sprite_buffer_addr_flip : std_logic_vector( 7 downto 0); + signal sprite_buffer_di : std_logic_vector( 2 downto 0); + signal sprite_buffer_do : std_logic_vector( 2 downto 0); + signal fg_grphx_addr : std_logic_vector(12 downto 0); + signal fg_grphx_addr_early : std_logic_vector(12 downto 0); + signal fg_grphx_1_do : std_logic_vector( 7 downto 0); + signal fg_grphx_2_do : std_logic_vector( 7 downto 0); + signal fg_grphx_3_do : std_logic_vector( 7 downto 0); + signal fg_sp_grphx_1 : std_logic_vector( 7 downto 0); + signal fg_sp_grphx_2 : std_logic_vector( 7 downto 0); + signal fg_sp_grphx_3 : std_logic_vector( 7 downto 0); + signal display_tile : std_logic; + signal fg_low_priority : std_logic; + signal fg_sp_bits : std_logic_vector( 2 downto 0); + signal sp_bits_out : std_logic_vector( 2 downto 0); + signal fg_bits : std_logic_vector( 2 downto 0); + + -- color palette + signal palette_addr : std_logic_vector(3 downto 0); + signal palette_cs : std_logic; + signal palette_we : std_logic; + signal palette_do : std_logic_vector(7 downto 0); + + -- background ram + signal bg_ram_addr : std_logic_vector(9 downto 0); + signal bg_ram_cs : std_logic; + signal bg_ram_we : std_logic; + signal bg_ram_do : std_logic_vector(3 downto 0); + + -- background control + signal bport_cs : std_logic; + signal bport_we : std_logic; + signal scroll1 : std_logic_vector(3 downto 0); + signal bshift_cs : std_logic; + signal bshift_we : std_logic; + signal scroll2 : std_logic_vector(7 downto 0); + + signal bg_hcnt : std_logic_vector( 7 downto 0); + signal bg_scan_hcnt : std_logic_vector( 8 downto 0); + signal bg_scan_addr : std_logic_vector( 9 downto 0); + signal bg_grphx_addr : std_logic_vector(11 downto 0); + signal bg_grphx_1_do : std_logic_vector( 7 downto 0); + signal bg_grphx_2_do : std_logic_vector( 7 downto 0); + signal bg_grphx_1 : std_logic_vector( 7 downto 0); + signal bg_grphx_2 : std_logic_vector( 3 downto 0); + signal bg_bits : std_logic_vector( 2 downto 0); + signal bg_bits_skew_0: std_logic_vector( 2 downto 0); + signal bg_bits_skew_1: std_logic_vector( 2 downto 0); + signal bg_bits_skew_2: std_logic_vector( 2 downto 0); + signal bg_bits_skew_3: std_logic_vector( 2 downto 0); + signal bg_bits_skew_4: std_logic_vector( 2 downto 0); + signal bg_bits_skew_5: std_logic_vector( 2 downto 0); + + -- misc + signal raz_nmi_we : std_logic; + signal coin1_r : std_logic; + signal sound_req : std_logic; + +begin + +--process (clock_12, cpu_sync) +--begin +-- if rising_edge(clock_12) then +-- if cpu_sync = '1' then +-- dbg_cpu_addr <= cpu_addr(15 downto 0); +-- end if; +-- end if; +--end process; + +reset_n <= not reset; +clock_12n <= not clock_12; + +process (clock_12, reset) + begin + if reset='1' then + clock_6 <= '0'; + else + if rising_edge(clock_12) then + clock_6 <= not clock_6; + end if; + end if; +end process; + +------------------- +-- Video scanner -- +------------------- + +-- make hcnt and vcnt video scanner (from schematics !) +-- +-- hcnt [0..255,256..383] => 384 pixels, 384/6Mhz => 1 line is 64us (15.625KHz) +-- vcnt [8..255,256..279] => 272 lines, 1 frame is 272 x 64us = 17.41ms (57.44Hz) + +process (reset, clock_12) +begin + if reset='1' then + hcnt <= (others => '0'); + vcnt <= (others => '0'); + else + if rising_edge(clock_12) and clock_6 = '1' then + hcnt <= hcnt + '1'; + if hcnt = 383 then + hcnt <= (others => '0'); + if vcnt = 260 then -- total should be 272 from Bump&Jump schematics ! + vcnt <= (others => '0'); + else + vcnt <= vcnt + '1'; + end if; + end if; + end if; + + end if; +end process; + +hcnt_flip <= hcnt when cocktail_flip = '0' else not hcnt; +vcnt_flip <= not vcnt when cocktail_flip = '0' else vcnt; + +--static ADDRESS_MAP_START( bnj_map, AS_PROGRAM, 8, btime_state ) +-- AM_RANGE(0x0000, 0x07ff) AM_RAM AM_SHARE("rambase") +-- AM_RANGE(0x1000, 0x1000) AM_READ_PORT("DSW1") +-- AM_RANGE(0x1001, 0x1001) AM_READ_PORT("DSW2") AM_WRITE(bnj_video_control_w) +-- AM_RANGE(0x1002, 0x1002) AM_READ_PORT("P1") AM_WRITE(audio_command_w) +-- AM_RANGE(0x1003, 0x1003) AM_READ_PORT("P2") +-- AM_RANGE(0x1004, 0x1004) AM_READ_PORT("SYSTEM") +-- AM_RANGE(0x4000, 0x43ff) AM_RAM AM_SHARE("videoram") +-- AM_RANGE(0x4400, 0x47ff) AM_RAM AM_SHARE("colorram") +-- AM_RANGE(0x4800, 0x4bff) AM_READWRITE(btime_mirrorvideoram_r, btime_mirrorvideoram_w) +-- AM_RANGE(0x4c00, 0x4fff) AM_READWRITE(btime_mirrorcolorram_r, btime_mirrorcolorram_w) +-- AM_RANGE(0x5000, 0x51ff) AM_RAM_WRITE(bnj_background_w) AM_SHARE("bnj_bgram") +-- AM_RANGE(0x5200, 0x53ff) AM_RAM +-- AM_RANGE(0x5400, 0x5400) AM_WRITE(bnj_scroll1_w) +-- AM_RANGE(0x5800, 0x5800) AM_WRITE(bnj_scroll2_w) +-- AM_RANGE(0x5c00, 0x5c0f) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") +-- AM_RANGE(0xa000, 0xffff) AM_ROM +--ADDRESS_MAP_END + +--ROM_START( brubber ) +-- ROM_REGION( 0x10000, "maincpu", 0 ) +-- /* a000-bfff space for the service ROM */ +-- ROM_LOAD( "brubber.12c", 0xc000, 0x2000, CRC(b5279c70) SHA1(5fb1c50040dc4e9444aed440e2c3cf4c79b72311) ) +-- ROM_LOAD( "brubber.12d", 0xe000, 0x2000, CRC(b2ce51f5) SHA1(5e38ea24bcafef1faba023def96532abd6f97d38) ) +-- +-- ROM_REGION( 0x10000, "audiocpu", 0 ) +-- ROM_LOAD( "bnj6c.bin", 0xe000, 0x1000, CRC(8c02f662) SHA1(1279d564e65fd3ccac25b1f9fbb40d910de2b544) ) +-- +-- ROM_REGION( 0x6000, "gfx1", 0 ) +-- ROM_LOAD( "bnj4e.bin", 0x0000, 0x2000, CRC(b864d082) SHA1(cacf71fa6c0f7121d077381a0ff6222f534295ab) ) +-- ROM_LOAD( "bnj4f.bin", 0x2000, 0x2000, CRC(6c31d77a) SHA1(5e52554f594f569527af4768d244cc40a7b4460a) ) +-- ROM_LOAD( "bnj4h.bin", 0x4000, 0x2000, CRC(5824e6fb) SHA1(e98f0eb476b8f033f5cc70a6e503afc4e651fd45) ) +-- +-- ROM_REGION( 0x2000, "gfx2", 0 ) +-- ROM_LOAD( "bnj10e.bin", 0x0000, 0x1000, CRC(f4e9eb49) SHA1(b356512d2ebd4e2005e76496b434e5ecebadb251) ) +-- ROM_LOAD( "bnj10f.bin", 0x1000, 0x1000, CRC(a9ffacb4) SHA1(49d5f9c0b695f474197fbb761bacc065b6b5808a) ) +--ROM_END + +-- dip_sw1 -- cocktail/unkown/unkown/test/coinage_b[2]/coinage_a[2] +-- dip_sw2 -- off/off/off/easy/no_continue/bonus[3]/lives +-- btn_p1 -- nu/nu/unkonw/jump/down/up/left/right +-- btn_p2 -- nu/nu/unkonw/jump/down/up/left/right +-- btn_system -- coin2/coin1/unkown/start2/start1/unknown/unknown/tilt + +dip_sw1 <= "00001111"; +dip_sw2 <= "00010111"; +btn_p1 <= not("000"&fire1 & down1 & up1 & left1 & right1); +btn_p2 <= not("000"&fire2 & down2 & up2 & left2 & right2); +btn_system <= not('0'&coin1&'0'&start2&start1&"000"); + +-- misc (coin, nmi, cocktail) +process (reset,clock_12) +begin + if reset = '1' then + cpu_nmi_n <= '1'; + cocktail_flip <= '0'; + else + if rising_edge(clock_12)then + coin1_r <= coin1; + if coin1_r = '0' and coin1 = '1' then + cpu_nmi_n <= '0'; + end if; + if raz_nmi_we = '1' then + cpu_nmi_n <= '1'; + end if; + if cocktail_we = '1' then + cocktail_flip <= dip_sw1(7) and cpu_do(0); + end if; + end if; + end if; +end process; + + +cpu_ena <= '1' when hcnt(2 downto 0) = "111" and clock_6 = '1' else '0'; + +-- chip select +wram_cs <= '1' when cpu_addr(15 downto 11) = "00000" else '0'; -- working ram 0000-07ff +io_cs <= '1' when cpu_addr(15 downto 3) = "0001000000000" else '0'; -- player/dip_sw 1000-1007 (1004) +fg_ram_cs <= '1' when cpu_addr(15 downto 12) = "0100" else '0'; -- foreground ram 4000-4fff +bg_ram_cs <= '1' when cpu_addr(15 downto 9) = "0101000" else '0'; -- background ram 5000-51ff +bport_cs <= '1' when cpu_addr(15 downto 8) = "01010100" else '0'; -- scroll 1 54xX +bshift_cs <= '1' when cpu_addr(15 downto 8) = "01011000" else '0'; -- scroll 2 58xX +palette_cs <= '1' when cpu_addr(15 downto 4) = "010111000000" else '0'; -- palette ram 5c00-5c0f +prog_rom_cs <= '1' when cpu_addr(15 downto 14) = "11" else '0'; -- program rom c000-ffff + +-- write enable +wram_we <= '1' when wram_cs = '1' and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 0000-07ff +raz_nmi_we <= '1' when io_cs = '1' and cpu_addr(2 downto 0) = "000" and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 1000 +cocktail_we <= '1' when io_cs = '1' and cpu_addr(2 downto 0) = "001" and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 1001 +sound_req <= '1' when io_cs = '1' and cpu_addr(2 downto 0) = "010" and cpu_rw_n = '0' else '0'; -- 1002 +fg_ram_low_we <= '1' when fg_ram_cs = '1' and cpu_addr(10) = '0' and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 4000-43ff & 4800-4bff +fg_ram_high_we <= '1' when fg_ram_cs = '1' and cpu_addr(10) = '1' and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 4400-47ff & 4c00-4fff +bg_ram_we <= '1' when bg_ram_cs = '1' and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 5000-51ff +bport_we <= '1' when bport_cs = '1' and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 54xx +bshift_we <= '1' when bshift_cs = '1' and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 58XX +palette_we <= '1' when palette_cs = '1' and cpu_rw_n = '0' and cpu_ena = '1' else '0'; -- 5c00-5c0f + +-- cpu di mux +cpu_di <= wram_do when wram_cs = '1' else + prog_rom_do when prog_rom_cs = '1' else + vblank&dip_sw1(6 downto 0) when (io_cs = '1') and (cpu_addr(2 downto 0) = "000") else + dip_sw2 when (io_cs = '1') and (cpu_addr(2 downto 0) = "001") else + btn_p1 when (io_cs = '1') and (cpu_addr(2 downto 0) = "010") else + btn_p2 when (io_cs = '1') and (cpu_addr(2 downto 0) = "011") else + btn_system when (io_cs = '1') and (cpu_addr(2 downto 0) = "100") else + fg_ram_low_do when fg_ram_cs = '1' else + bg_ram_do&X"0" when bg_ram_cs = '1' else + X"FF"; + +-- decrypt fetched instruction +cpu_di_dec <= cpu_di when cpu_sync = '0' else + cpu_di(7) & cpu_di(5) & cpu_di(6) & cpu_di(4 downto 0); + +---------------------------- +-- foreground and sprites -- +---------------------------- + +-- foreground ram addr +fg_ram_addr_sel <= "00" when cpu_ena = '1' and cpu_addr(11) = '0' else + "01" when cpu_ena = '1' and cpu_addr(11) = '1' else + "10" when cpu_ena = '0' and hcnt(8) = '0' else + "11"; + +with fg_ram_addr_sel select +fg_ram_addr <= cpu_addr(4 downto 0) & cpu_addr(9 downto 5) when "00", -- cpu mirrored addressing + cpu_addr(9 downto 0) when "01", -- cpu normal addressing + vcnt_flip(7 downto 3) & hcnt_flip(7 downto 3) when "10", -- foreground tile scan addressing + "00000" & hcnt(6 downto 2) when others; -- sprite data scan addressing + +-- latch sprite data, +-- manage fg and sprite graphix rom address +-- manage sprite line buffer address +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '1' then + + if hcnt(3 downto 0) = "0000" then + sprite_attr <= fg_ram_low_do(2 downto 0); + end if; + if hcnt(3 downto 0) = "0100" then + sprite_tile <= fg_ram_low_do(7 downto 0); + end if; + if hcnt(3 downto 0) = "1000" then + if sprite_attr(1) = '0' then + sprite_line <= vcnt_flip(7 downto 0) - 1 + fg_ram_low_do(7 downto 0); + else + sprite_line <= (vcnt_flip(7 downto 0) - 1 + fg_ram_low_do(7 downto 0)) xor X"0F"; -- flip V + end if; + end if; + + if hcnt(2 downto 0) = "100" then + hcnt8_r <= hcnt(8); + fg_grphx_addr_early <= fg_ram_high_do & fg_ram_low_do & vcnt_flip(2 downto 0); -- fg_ram_low_do(7) = '1' => low priority foreground + if hcnt8_r = '1' then + fg_grphx_addr <= sprite_tile & not (sprite_attr(2) xor hcnt_flip(3) xor cocktail_flip) & sprite_line(3 downto 0); + if hcnt(3) = '1' then + if (sprite_line(7 downto 4) = "1111") and (sprite_attr(0) = '1') then + display_tile <= '1'; + else + display_tile <= '0'; + end if; + end if; + else + fg_grphx_addr <= fg_grphx_addr_early; + display_tile <= '1'; + end if; + end if; + + if hcnt8_r = '1' then + if hcnt(3 downto 0) = X"D" then + sprite_buffer_addr <= fg_ram_low_do(7 downto 0); + hcnt8_rr <= '1'; + else + sprite_buffer_addr <= sprite_buffer_addr + '1'; + end if; + else + if hcnt(7 downto 0) = X"0D" then + sprite_buffer_addr <= (others => '0'); + hcnt8_rr <= '0'; + else + sprite_buffer_addr <= sprite_buffer_addr + '1'; + end if; + end if; + + end if; +end process; + +sprite_buffer_addr_flip <= not (sprite_buffer_addr) when hcnt8_rr = '0' and cocktail_flip = '1' else sprite_buffer_addr; + +-- latch and shift foreground and sprite graphics +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '1' then + if hcnt(2 downto 0) = "101" then + if display_tile = '1' then + fg_sp_grphx_1 <= fg_grphx_1_do; + fg_sp_grphx_2 <= fg_grphx_2_do; + fg_sp_grphx_3 <= fg_grphx_3_do; + fg_low_priority <= fg_grphx_addr(10); -- #fg_ram_low_do(7) + else + fg_sp_grphx_1 <= (others =>'0'); + fg_sp_grphx_2 <= (others =>'0'); + fg_sp_grphx_3 <= (others =>'0'); + end if; + elsif cocktail_flip = '0' or hcnt8_rr = '1' then + fg_sp_grphx_1 <= '0' & fg_sp_grphx_1(7 downto 1); + fg_sp_grphx_2 <= '0' & fg_sp_grphx_2(7 downto 1); + fg_sp_grphx_3 <= '0' & fg_sp_grphx_3(7 downto 1); + else + fg_sp_grphx_1 <= fg_sp_grphx_1(6 downto 0) & '0'; + fg_sp_grphx_2 <= fg_sp_grphx_2(6 downto 0) & '0'; + fg_sp_grphx_3 <= fg_sp_grphx_3(6 downto 0) & '0'; + end if; + end if; +end process; + +fg_sp_bits <= fg_sp_grphx_3(0) & fg_sp_grphx_2(0) & fg_sp_grphx_1(0) when cocktail_flip = '0' or hcnt8_rr = '1' else + fg_sp_grphx_3(7) & fg_sp_grphx_2(7) & fg_sp_grphx_1(7); + +-- data to sprite buffer +sprite_buffer_di <= "000" when hcnt8_rr = '0' else -- clear ram after read + sprite_buffer_do when fg_sp_bits = "000" else fg_sp_bits; -- sp vs sp priority rules + +-- read sprite buffer +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '0' then + if hcnt8_rr = '0' then + sp_bits_out <= sprite_buffer_do; + else + sp_bits_out <= "000"; + end if; + end if; +end process; + +-- mux foreground and sprite buffer output with priorities +fg_bits <= sp_bits_out when (fg_sp_bits = "000") or (sp_bits_out/="000" and fg_low_priority = '1') else fg_sp_bits; + +---------------- +-- background -- +---------------- +bg_hcnt(2 downto 0) <= hcnt_flip(2 downto 0); + +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '1' then + + -- M4H latch hcnt bit 3 to 7 (8 pixels delay) + if hcnt(2 downto 0) = "111" then + bg_hcnt(7 downto 3) <= hcnt_flip(7 downto 3); + end if; + + end if; +end process; + +-- latch scroll1 & 2 data +process (clock_12n) +begin + if rising_edge(clock_12n) and clock_6 = '1' then + if bport_we = '1' then + scroll1 <= cpu_do(3 downto 0); + end if; + if bshift_we = '1' then + scroll2 <= cpu_do; + end if; + end if; +end process; + +-- manage background ram address +bg_scan_hcnt <= ('0'&bg_hcnt) + (scroll1(1)&scroll2); + +bg_scan_addr <= '0' & bg_scan_hcnt(8) & vcnt_flip(7) & bg_scan_hcnt(7 downto 4) & vcnt_flip(6 downto 4); + +bg_ram_addr <= cpu_addr(9 downto 0) when cpu_ena = '1' else bg_scan_addr; + +-- manage background rom address +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '0' then + if bg_scan_hcnt(1 downto 0) = "00" then + bg_grphx_addr <= '1' & vcnt_flip(7) & bg_ram_do & bg_scan_hcnt(3 downto 2) & vcnt_flip(3 downto 0); + end if; + end if; +end process; + +-- latch and shift background graphics +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '1' then + if scroll1 = "0000" then + bg_grphx_1 <= (others => '0'); + bg_grphx_2 <= (others => '0'); + else + if bg_scan_hcnt(1 downto 0) = "00" then + bg_grphx_1 <= bg_grphx_1_do; + bg_grphx_2 <= bg_grphx_2_do(3 downto 0); + elsif cocktail_flip = '0' then + bg_grphx_1 <= '0' & bg_grphx_1(7 downto 1); + bg_grphx_2 <= '0' & bg_grphx_2(3 downto 1); + else + bg_grphx_1 <= bg_grphx_1(6 downto 0) & '0'; + bg_grphx_2 <= bg_grphx_2(2 downto 0) & '0'; + end if; + end if; + end if; +end process; + +bg_bits_skew_0 <= bg_grphx_2(0) & bg_grphx_1(4) & bg_grphx_1(0) when cocktail_flip = '0' else + bg_grphx_2(3) & bg_grphx_1(7) & bg_grphx_1(3); + +-- delay background graphics w.r.t. foreground graphics +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '1' then + bg_bits_skew_1 <= bg_bits_skew_0; + bg_bits_skew_2 <= bg_bits_skew_1; + bg_bits_skew_3 <= bg_bits_skew_2; + bg_bits_skew_4 <= bg_bits_skew_3; + bg_bits_skew_5 <= bg_bits_skew_4; + end if; +end process; + +-- manage color palette address +palette_addr <= cpu_addr(3 downto 0) when palette_we = '1' else + '1'&bg_bits_skew_4 when fg_bits = "000" else + '0'&fg_bits; + +-- get palette output +process (clock_12) +begin + if rising_edge(clock_12) and clock_6 = '0' then + video_r <= not palette_do(2 downto 0); + video_g <= not palette_do(5 downto 3); + video_b <= not palette_do(7 downto 6); + end if; +end process; + +---------------------------- +-- video syncs and blanks -- +---------------------------- + +video_csync <= csync; + +process(clock_12) + constant hcnt_base : integer := 312; --320 + variable vsync_cnt : std_logic_vector(3 downto 0); +begin + +if rising_edge(clock_12) and clock_6 = '1' then + + if hcnt = hcnt_base+0 then hsync0 <= '0'; + elsif hcnt = hcnt_base+24 then hsync0 <= '1'; + end if; + + if hcnt = hcnt_base+0 then hsync1 <= '0'; + elsif hcnt = hcnt_base+12 then hsync1 <= '1'; + elsif hcnt = hcnt_base+192-384 then hsync1 <= '0'; + elsif hcnt = hcnt_base+204-384 then hsync1 <= '1'; + end if; + + if hcnt = hcnt_base+0 then hsync2 <= '0'; + elsif hcnt = hcnt_base+192-12-384 then hsync2 <= '1'; + elsif hcnt = hcnt_base+192-384 then hsync2 <= '0'; + elsif hcnt = hcnt_base+0-12 then hsync2 <= '1'; + end if; + + if hcnt = hcnt_base then + if vcnt = 240 then + vsync_cnt := X"0"; + else + if vsync_cnt < X"F" then vsync_cnt := vsync_cnt + '1'; end if; + end if; + end if; + + if vsync_cnt = 0 then csync <= hsync1; + elsif vsync_cnt = 1 then csync <= hsync1; + elsif vsync_cnt = 2 then csync <= hsync1; + elsif vsync_cnt = 3 then csync <= hsync2; + elsif vsync_cnt = 4 then csync <= hsync2; + elsif vsync_cnt = 5 then csync <= hsync2; + elsif vsync_cnt = 6 then csync <= hsync1; + elsif vsync_cnt = 7 then csync <= hsync1; + elsif vsync_cnt = 8 then csync <= hsync1; + else csync <= hsync0; + end if; + + if hcnt = 267 then hblank <= '1'; + elsif hcnt = 14 then hblank <= '0'; + end if; + + if vcnt = 248 then vblank <= '1'; + elsif vcnt = 8 then vblank <= '0'; + end if; + + -- external sync and blank outputs + video_blankn <= not (hblank or vblank); + + video_hs <= hsync0; + + if vsync_cnt = 0 then video_vs <= '0'; + elsif vsync_cnt = 8 then video_vs <= '1'; + end if; + +end if; +end process; + +--------------------------- +-- components +--------------------------- + +cpu_inst : entity work.T65 +port map +( + Mode => "00", -- 6502 + Res_n => reset_n, + Enable => cpu_ena, + Clk => clock_12, + Rdy => '1', + Abort_n => '1', + IRQ_n => '1',--cpu_irq_n, + NMI_n => cpu_nmi_n, + SO_n => '1',--cpu_so_n, + R_W_n => cpu_rw_n, + Sync => cpu_sync, -- open + EF => open, + MF => open, + XF => open, + ML_n => open, + VP_n => open, + VDA => open, + VPA => open, + A => cpu_addr, + DI => cpu_di_dec, + DO => cpu_do +); + + +-- working ram +wram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 11) +port map( + clk => clock_12n, + we => wram_we, + addr => cpu_addr( 10 downto 0), + d => cpu_do, + q => wram_do +); + +-- program rom +program_rom: entity work.burnin_rubber_prog +port map( + clk => clock_12n, + addr => cpu_addr(13 downto 0), + data => prog_rom_do +); + +-- foreground ram low +fg_ram_low : entity work.gen_ram +generic map( dWidth => 8, aWidth => 10) +port map( + clk => clock_12n, + we => fg_ram_low_we, + addr => fg_ram_addr, + d => cpu_do, + q => fg_ram_low_do +); + +-- foreground ram high +fg_ram_high : entity work.gen_ram +generic map( dWidth => 2, aWidth => 10) +port map( + clk => clock_12n, + we => fg_ram_high_we, + addr => fg_ram_addr, + d => cpu_do(1 downto 0), + q => fg_ram_high_do +); + +-- foreground and sprite graphix rom bit #1 +fg_sp_graphx_1: entity work.fg_sp_graphx_1 +port map( + clk => clock_12n, + addr => fg_grphx_addr, + data => fg_grphx_1_do +); + +-- foreground and sprite graphix rom bit #2 +fg_sp_graphx_2: entity work.fg_sp_graphx_2 +port map( + clk => clock_12n, + addr => fg_grphx_addr, + data => fg_grphx_2_do +); + +-- foreground and sprite graphix rom bit #3 +fg_sp_graphx_3: entity work.fg_sp_graphx_3 +port map( + clk => clock_12n, + addr => fg_grphx_addr, + data => fg_grphx_3_do +); + +-- sprite buffer ram +sprite_buffer_ram : entity work.gen_ram +generic map( dWidth => 3, aWidth => 8) +port map( + clk => clock_12n, + we => clock_6, + addr => sprite_buffer_addr_flip, + d => sprite_buffer_di, + q => sprite_buffer_do +); + +-- color palette ram +color_ram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 4) +port map( + clk => clock_12n, + we => palette_we, + addr => palette_addr, + d => cpu_do, + q => palette_do +); + +-- background ram +background_ram : entity work.gen_ram +generic map( dWidth => 4, aWidth => 10) +port map( + clk => clock_12n, + we => bg_ram_we, + addr => bg_ram_addr, + d => cpu_do(7 downto 4), + q => bg_ram_do +); + +-- background graphix rom bit #3&2 +bg_graphx_1: entity work.bg_graphx_1 +port map( + clk => clock_12n, + addr => bg_grphx_addr, + data => bg_grphx_1_do +); + +-- background graphix rom bit #1 +bg_graphx_2: entity work.bg_graphx_2 +port map( + clk => clock_12n, + addr => bg_grphx_addr, + data => bg_grphx_2_do +); + +-- burnin rubber sound part +burnin_rubber_sound: entity work.burnin_rubber_sound +port map( + clock_12 => clock_12, + reset => reset, + + sound_req => sound_req, + sound_code_in => cpu_do, + sound_timing => vcnt(3), + + audio_out => audio_out, + + dbg_cpu_addr => dbg_cpu_addr +); + +end SYN; diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/burnin_rubber_mist.sv b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/burnin_rubber_mist.sv new file mode 100644 index 00000000..aa5d8daa --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/burnin_rubber_mist.sv @@ -0,0 +1,167 @@ +module burnin_rubber_mist +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Burn.Rubb;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_48, clk_12, clk_6, clk_24; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_48), + .c1(clk_12), + .c2(clk_6), + .c3(clk_24) +); + +wire m_up = ~status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = ~status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = ~status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = ~status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +burnin_rubber burnin_rubber( + .clock_12(clk_12), + .reset(status[0] | status[6] | buttons[1]), + .video_r(r), + .video_g(g), + .video_b(b), + .video_csync(), + .video_blankn(blankn), + .video_hs(hs), + .video_vs(vs), + .audio_out(audio), + .start2(m_start2), + .start1(m_start1), + .coin1(m_coin), + .fire1(m_fire), + .right1(m_right), + .left1(m_left), + .down1(m_down), + .up1(m_up), + .fire2(m_fire), + .right2(m_right), + .left2(m_left), + .down2(m_down), + .up2(m_up), + .dbg_cpu_addr() +); + +wire [10:0] audio; + +dac dac ( + .clk_i(clk_48), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [2:0] r, g; +wire [1:0] b; +wire blankn; + +video_mixer #(.LINE_LENGTH(320), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_48), + .ce_pix(clk_6), + .ce_pix_actual(clk_6), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn ? r&r : "000000"), + .G(blankn ? g&g : "000000"), + .B(blankn ? b&b : "0000"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_48 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_48), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule + + + + diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/dac.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/dac.vhd new file mode 100644 index 00000000..b1ecdcb7 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_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 := 11 + ); + 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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/gen_ram.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/gen_ram.vhd new file mode 100644 index 00000000..f1a95608 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/gen_ram.vhd @@ -0,0 +1,84 @@ +-- ----------------------------------------------------------------------- +-- +-- Syntiac's generic VHDL support files. +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- +-- Modified April 2016 by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +-- Remove address register when writing +-- +-- ----------------------------------------------------------------------- +-- +-- gen_rwram.vhd +-- +-- ----------------------------------------------------------------------- +-- +-- generic ram. +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity gen_ram is + generic ( + dWidth : integer := 8; + aWidth : integer := 10 + ); + port ( + clk : in std_logic; + we : in std_logic; + addr : in std_logic_vector((aWidth-1) downto 0); + d : in std_logic_vector((dWidth-1) downto 0); + q : out std_logic_vector((dWidth-1) downto 0) + ); +end entity; + +-- ----------------------------------------------------------------------- + +architecture rtl of gen_ram is + subtype addressRange is integer range 0 to ((2**aWidth)-1); + type ramDef is array(addressRange) of std_logic_vector((dWidth-1) downto 0); + signal ram: ramDef; + + signal rAddrReg : std_logic_vector((aWidth-1) downto 0); + signal qReg : std_logic_vector((dWidth-1) downto 0); +begin +-- ----------------------------------------------------------------------- +-- Signals to entity interface +-- ----------------------------------------------------------------------- +-- q <= qReg; + +-- ----------------------------------------------------------------------- +-- Memory write +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if we = '1' then + ram(to_integer(unsigned(addr))) <= d; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Memory read +-- ----------------------------------------------------------------------- +process(clk) + begin + if rising_edge(clk) then +-- qReg <= ram(to_integer(unsigned(rAddrReg))); +-- rAddrReg <= addr; +---- qReg <= ram(to_integer(unsigned(addr))); + q <= ram(to_integer(unsigned(addr))); + end if; + end process; +--q <= ram(to_integer(unsigned(addr))); +end architecture; + diff --git a/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/hq2x.sv b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/keyboard.v b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/mist_io.v b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/osd.v b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/pll.qip b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/pll.v b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/pll.v new file mode 100644 index 00000000..fe052027 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/pll.v @@ -0,0 +1,396 @@ +// 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 ( + areset, + inclk0, + c0, + c1, + c2, + c3); + + input areset; + input inclk0; + output c0; + output c1; + output c2; + output c3; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [4:0] sub_wire0; + wire [0:0] sub_wire7 = 1'h0; + wire [2:2] sub_wire4 = sub_wire0[2:2]; + wire [0:0] sub_wire3 = sub_wire0[0:0]; + wire [3:3] sub_wire2 = sub_wire0[3:3]; + wire [1:1] sub_wire1 = sub_wire0[1:1]; + wire c1 = sub_wire1; + wire c3 = sub_wire2; + wire c0 = sub_wire3; + wire c2 = sub_wire4; + wire sub_wire5 = inclk0; + wire [1:0] sub_wire6 = {sub_wire7, sub_wire5}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire6), + .clk (sub_wire0), + .activeclock (), + .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 = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 16, + altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 9, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 4, + altpll_component.clk1_phase_shift = "0", + altpll_component.clk2_divide_by = 9, + altpll_component.clk2_duty_cycle = 50, + altpll_component.clk2_multiply_by = 2, + altpll_component.clk2_phase_shift = "0", + altpll_component.clk3_divide_by = 9, + altpll_component.clk3_duty_cycle = 50, + altpll_component.clk3_multiply_by = 8, + altpll_component.clk3_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_USED", + 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_USED", + 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 "9" +// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "9" +// Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +// Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "9" +// 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: DUTY_CYCLE3 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "48.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "12.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "6.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "24.000000" +// 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: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "16" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "4" +// Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "2" +// Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "8" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "48.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "12.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "6.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "24.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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 "ps" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "9" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "16" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "4" +// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "2" +// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "9" +// Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "8" +// Retrieval info: CONSTANT: CLK3_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_USED" +// 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_USED" +// 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: areset 0 0 0 0 INPUT GND "areset" +// 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +// 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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/scandoubler.v b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..36e71ed2 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/t65/T65.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/t65/T65.vhd new file mode 100644 index 00000000..09253fe0 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/t65/T65_ALU.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/t65/T65_ALU.vhd new file mode 100644 index 00000000..b1f6d632 --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/t65/T65_MCode.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/t65/T65_MCode.vhd new file mode 100644 index 00000000..6c6c864a --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/t65/T65_Pack.vhd b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/t65/T65_Pack.vhd new file mode 100644 index 00000000..e025e1bf --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_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/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/video_mixer.sv b/Arcade/Data East Cassette/Burnin Rubber_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Data East Cassette/Burnin Rubber_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/Arcade/Galaxian Hardware/AzurianAttack_MiST/Azurian.qpf b/Arcade/Galaxian Hardware/AzurianAttack_MiST/Azurian.qpf new file mode 100644 index 00000000..43a9e280 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/Azurian.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:59:16 November 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "14:59:16 November 16, 2017" + +# Revisions + +PROJECT_REVISION = "Azurian" \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/Azurian.qsf b/Arcade/Galaxian Hardware/AzurianAttack_MiST/Azurian.qsf new file mode 100644 index 00000000..77a1506b --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/Azurian.qsf @@ -0,0 +1,190 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 18:12:35 November 17, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Galaxian_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80as.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_6L.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1K.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1H.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_HIT.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_FIR.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/sine_package.vhd +set_global_assignment -name VHDL_FILE rtl/mc_stars.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_vco.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_b.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_a.vhd +set_global_assignment -name VHDL_FILE rtl/mc_missile.vhd +set_global_assignment -name VHDL_FILE rtl/mc_logic.vhd +set_global_assignment -name VHDL_FILE rtl/mc_ld_pls.vhd +set_global_assignment -name VHDL_FILE rtl/mc_inport.vhd +set_global_assignment -name VHDL_FILE rtl/mc_hv_count.vhd +set_global_assignment -name VHDL_FILE rtl/mc_col_pal.vhd +set_global_assignment -name VHDL_FILE rtl/mc_bram.vhd +set_global_assignment -name VHDL_FILE rtl/mc_adec.vhd +set_global_assignment -name VHDL_FILE rtl/galaxian.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Azurian +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Galaxian) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Galaxian) +# -------------------- +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name VHDL_FILE rtl/mc_video.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Azurian.sv +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_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/Azurian.srf b/Arcade/Galaxian Hardware/AzurianAttack_MiST/Azurian.srf new file mode 100644 index 00000000..14cddd5e --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/Azurian.srf @@ -0,0 +1,54 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Clock multiplexers are found and protected" { } { } 0 19016 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169177 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169203 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/README.txt b/Arcade/Galaxian Hardware/AzurianAttack_MiST/README.txt new file mode 100644 index 00000000..6609ce77 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Azurian Attack port to MiST by Gehstock +-- 18 December 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Galaxian hardware +-- Copyright(c) 2004 Katsumi Degawa +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- F2 : Coin + Start 2 players +-- F1 : Coin + Start 1 player +-- SPACE : Fire +-- ARROW KEYS : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/Release/Azurian.rbf b/Arcade/Galaxian Hardware/AzurianAttack_MiST/Release/Azurian.rbf new file mode 100644 index 00000000..67d2cd86 Binary files /dev/null and b/Arcade/Galaxian Hardware/AzurianAttack_MiST/Release/Azurian.rbf differ diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/clean.bat b/Arcade/Galaxian Hardware/AzurianAttack_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_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/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/Azurian.sv b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/Azurian.sv new file mode 100644 index 00000000..78042604 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/Azurian.sv @@ -0,0 +1,176 @@ +//============================================================================ +// Arcade: Azurian +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Azurian +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Azurian Att.;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_18, clk_12, clk_6, clk_4p5; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_18), + .c1(clk_12), + .c2(clk_6), + .c3(clk_4p5) +); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +galaxian azurian +( + .W_CLK_18M(clk_18), + .W_CLK_12M(clk_12), + .W_CLK_6M(clk_6), + .I_RESET(status[0] | status[6] | buttons[1]), + .P1_CSJUDLR({m_coin,m_start1,m_fire,m_up,m_down,m_left,m_right}), + .P2_CSJUDLR({1'b0, m_start2,m_fire,m_up,m_down,m_left,m_right}), + .W_R(r), + .W_G(g), + .W_B(b), + .W_H_SYNC(hs), + .W_V_SYNC(vs), + .HBLANK(hblank), + .VBLANK(vblank), + .W_SDAT_A(audio_a), + .W_SDAT_B(audio_b) +); + +wire [7:0] audio_a, audio_b; +wire [10:0] audio = {1'b0, audio_b, 2'b0} + {3'b0, audio_a}; + +dac dac ( + .clk_i(clk_18), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [2:0] r, g, b; +wire hblank, vblank; +wire blankn = ~(hblank | vblank); +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_18), + .ce_pix(clk_4p5), + .ce_pix_actual(clk_4p5), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn?r:"000"), + .G(blankn?g:"000"), + .B(blankn?b:"000"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_18 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_18), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GALAXIAN_1H.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GALAXIAN_1H.vhd new file mode 100644 index 00000000..6f39d31b --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GALAXIAN_1H.vhd @@ -0,0 +1,280 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_1H is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end entity; + +architecture prom of GALAXIAN_1H is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"00",x"00", -- 0x0050 + x"00",x"00",x"00",x"00",x"08",x"58",x"F0",x"F0", -- 0x0058 + x"00",x"00",x"00",x"02",x"07",x"07",x"06",x"00", -- 0x0060 + x"06",x"1E",x"3E",x"1A",x"19",x"3F",x"3F",x"7D", -- 0x0068 + x"37",x"36",x"32",x"76",x"74",x"1E",x"06",x"00", -- 0x0070 + x"00",x"07",x"02",x"3E",x"3E",x"02",x"07",x"00", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"00", -- 0x0158 + x"02",x"02",x"07",x"02",x"00",x"00",x"00",x"00", -- 0x0160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0168 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0170 + x"01",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0178 + x"0F",x"0F",x"0F",x"07",x"07",x"07",x"03",x"01", -- 0x0180 + x"30",x"20",x"00",x"00",x"00",x"00",x"00",x"1C", -- 0x0188 + x"70",x"78",x"7C",x"7E",x"7F",x"7E",x"7E",x"3C", -- 0x0190 + x"00",x"00",x"00",x"00",x"00",x"40",x"40",x"20", -- 0x0198 + x"03",x"03",x"01",x"01",x"01",x"01",x"01",x"00", -- 0x01A0 + x"03",x"03",x"03",x"07",x"07",x"03",x"03",x"03", -- 0x01A8 + x"02",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01B0 + x"F8",x"FE",x"7F",x"7C",x"3C",x"1C",x"0E",x"06", -- 0x01B8 + x"00",x"80",x"C0",x"E0",x"E0",x"E0",x"F0",x"F0", -- 0x01C0 + x"FF",x"7F",x"1F",x"0F",x"93",x"F8",x"F0",x"58", -- 0x01C8 + x"00",x"01",x"01",x"03",x"03",x"03",x"00",x"00", -- 0x01D0 + x"FC",x"F0",x"F8",x"F8",x"F8",x"FC",x"7D",x"1C", -- 0x01D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FB",x"F1",x"F8", -- 0x01E0 + x"FF",x"FF",x"FE",x"FC",x"FE",x"FE",x"FF",x"FF", -- 0x01E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"7F",x"0F", -- 0x01F0 + x"00",x"00",x"00",x"00",x"08",x"3C",x"7E",x"FF", -- 0x01F8 + x"00",x"00",x"00",x"02",x"06",x"0F",x"10",x"0F", -- 0x0200 + x"06",x"0E",x"1E",x"38",x"78",x"88",x"08",x"88", -- 0x0208 + x"06",x"02",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0210 + x"78",x"38",x"1E",x"0E",x"06",x"00",x"00",x"00", -- 0x0218 + x"01",x"02",x"06",x"0E",x"02",x"02",x"02",x"02", -- 0x0220 + x"00",x"80",x"C0",x"E0",x"80",x"80",x"80",x"80", -- 0x0228 + x"06",x"04",x"0C",x"0C",x"1C",x"3F",x"38",x"38", -- 0x0230 + x"C0",x"40",x"60",x"60",x"70",x"F8",x"38",x"38", -- 0x0238 + x"F8",x"B0",x"90",x"D0",x"E8",x"E4",x"97",x"10", -- 0x0240 + x"00",x"00",x"00",x"00",x"00",x"00",x"F0",x"E0", -- 0x0248 + x"09",x"08",x"0A",x"0C",x"0C",x"0E",x"0C",x"08", -- 0x0250 + x"40",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0270 + x"01",x"03",x"66",x"9C",x"9C",x"66",x"03",x"01", -- 0x0278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0290 + x"3F",x"83",x"86",x"BC",x"BC",x"86",x"83",x"3F", -- 0x0298 + x"01",x"02",x"05",x"0B",x"17",x"2C",x"5C",x"9F", -- 0x02A0 + x"80",x"40",x"A0",x"D0",x"E8",x"34",x"3A",x"F9", -- 0x02A8 + x"9F",x"5C",x"2C",x"17",x"0B",x"05",x"02",x"01", -- 0x02B0 + x"F9",x"3A",x"34",x"E8",x"D0",x"A0",x"40",x"80", -- 0x02B8 + x"01",x"21",x"70",x"20",x"03",x"03",x"0F",x"CF", -- 0x02C0 + x"80",x"84",x"0E",x"04",x"C0",x"C0",x"F0",x"F3", -- 0x02C8 + x"CF",x"0F",x"03",x"03",x"20",x"70",x"21",x"01", -- 0x02D0 + x"F3",x"F0",x"C0",x"C0",x"04",x"0E",x"84",x"80", -- 0x02D8 + x"00",x"3E",x"7E",x"7F",x"7E",x"7E",x"7E",x"7E", -- 0x02E0 + x"00",x"80",x"C0",x"E0",x"70",x"B8",x"DC",x"EE", -- 0x02E8 + x"7E",x"7C",x"7C",x"0C",x"3C",x"7C",x"7F",x"7F", -- 0x02F0 + x"F6",x"FF",x"FE",x"EF",x"D6",x"EE",x"DE",x"DE", -- 0x02F8 + x"00",x"00",x"00",x"C0",x"F0",x"F8",x"7E",x"1F", -- 0x0300 + x"00",x"00",x"00",x"03",x"0F",x"1F",x"7E",x"F8", -- 0x0308 + x"1F",x"7E",x"F8",x"F0",x"C0",x"00",x"00",x"00", -- 0x0310 + x"F8",x"7E",x"1F",x"0F",x"03",x"00",x"00",x"00", -- 0x0318 + x"07",x"03",x"03",x"01",x"00",x"00",x"00",x"00", -- 0x0320 + x"00",x"00",x"00",x"00",x"01",x"03",x"03",x"07", -- 0x0328 + x"00",x"3F",x"3F",x"1D",x"1D",x"0D",x"0F",x"07", -- 0x0330 + x"07",x"0F",x"0D",x"1D",x"1D",x"3F",x"3F",x"00", -- 0x0338 + x"E0",x"FC",x"FF",x"3F",x"07",x"00",x"00",x"00", -- 0x0340 + x"00",x"00",x"00",x"07",x"3F",x"FF",x"FC",x"E0", -- 0x0348 + x"03",x"1F",x"FF",x"FE",x"F0",x"E0",x"E0",x"E0", -- 0x0350 + x"E0",x"E0",x"E0",x"F0",x"FE",x"FF",x"1F",x"03", -- 0x0358 + x"E3",x"E1",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0", -- 0x0360 + x"E0",x"F0",x"F8",x"FC",x"FE",x"FF",x"EF",x"E7", -- 0x0368 + x"07",x"07",x"07",x"07",x"07",x"07",x"87",x"C7", -- 0x0370 + x"E7",x"F7",x"FF",x"7F",x"3F",x"1F",x"0F",x"07", -- 0x0378 + x"00",x"00",x"00",x"02",x"05",x"00",x"03",x"0C", -- 0x0380 + x"00",x"00",x"00",x"10",x"50",x"68",x"88",x"C8", -- 0x0388 + x"03",x"0A",x"03",x"01",x"04",x"03",x"00",x"00", -- 0x0390 + x"F4",x"A0",x"C0",x"70",x"40",x"20",x"00",x"00", -- 0x0398 + x"00",x"00",x"00",x"00",x"02",x"0A",x"04",x"00", -- 0x03A0 + x"00",x"00",x"00",x"00",x"50",x"A0",x"00",x"20", -- 0x03A8 + x"00",x"09",x"01",x"02",x"00",x"00",x"00",x"00", -- 0x03B0 + x"38",x"10",x"00",x"40",x"20",x"00",x"00",x"00", -- 0x03B8 + x"00",x"02",x"01",x"01",x"01",x"40",x"13",x"01", -- 0x03C0 + x"00",x"00",x"00",x"04",x"0C",x"18",x"80",x"90", -- 0x03C8 + x"00",x"08",x"00",x"00",x"02",x"04",x"00",x"00", -- 0x03D0 + x"82",x"CC",x"00",x"10",x"98",x"84",x"00",x"00", -- 0x03D8 + x"08",x"04",x"00",x"02",x"8C",x"0E",x"07",x"0F", -- 0x03E0 + x"01",x"12",x"00",x"04",x"00",x"C0",x"C8",x"E0", -- 0x03E8 + x"07",x"03",x"21",x"00",x"80",x"21",x"48",x"81", -- 0x03F0 + x"C2",x"80",x"01",x"00",x"22",x"00",x"02",x"01", -- 0x03F8 + x"FF",x"FF",x"FF",x"FF",x"7F",x"7F",x"3F",x"1E", -- 0x0400 + x"8F",x"CF",x"9F",x"BF",x"3F",x"FF",x"FF",x"FF", -- 0x0408 + x"E0",x"F8",x"FE",x"FF",x"FF",x"FF",x"FE",x"E0", -- 0x0410 + x"E0",x"E0",x"C0",x"C0",x"80",x"80",x"00",x"00", -- 0x0418 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FC",x"F0", -- 0x0420 + x"00",x"80",x"F8",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0428 + x"00",x"00",x"00",x"00",x"E0",x"80",x"00",x"00", -- 0x0430 + x"FC",x"F8",x"F8",x"F0",x"E0",x"00",x"00",x"00", -- 0x0438 + x"00",x"00",x"00",x"80",x"E0",x"F0",x"F8",x"FC", -- 0x0440 + x"0F",x"1F",x"3F",x"3F",x"7F",x"7F",x"FF",x"FF", -- 0x0448 + x"00",x"00",x"00",x"00",x"01",x"01",x"04",x"0E", -- 0x0450 + x"3F",x"9F",x"9F",x"CF",x"CF",x"CF",x"E7",x"E7", -- 0x0458 + x"00",x"03",x"1F",x"7F",x"FF",x"FF",x"FF",x"7F", -- 0x0460 + x"FC",x"FC",x"FE",x"FE",x"FE",x"FF",x"FF",x"FF", -- 0x0468 + x"00",x"38",x"AF",x"CB",x"E5",x"F2",x"F9",x"F9", -- 0x0470 + x"BE",x"BF",x"5F",x"5F",x"5F",x"2F",x"2F",x"2F", -- 0x0478 + x"00",x"00",x"00",x"C0",x"F0",x"F8",x"7C",x"7E", -- 0x0480 + x"00",x"00",x"80",x"80",x"C0",x"C0",x"C0",x"00", -- 0x0488 + x"01",x"01",x"01",x"03",x"03",x"03",x"07",x"07", -- 0x0490 + x"07",x"0F",x"0F",x"0F",x"1F",x"1F",x"1F",x"1F", -- 0x0498 + x"1F",x"3F",x"3F",x"7F",x"7F",x"7F",x"FF",x"FF", -- 0x04A0 + x"FF",x"FF",x"FE",x"FE",x"FE",x"FE",x"FC",x"FC", -- 0x04A8 + x"0F",x"0F",x"0F",x"1F",x"1F",x"3F",x"3F",x"7F", -- 0x04B0 + x"7F",x"7E",x"FE",x"FE",x"FE",x"FC",x"FC",x"FC", -- 0x04B8 + x"00",x"00",x"00",x"00",x"01",x"01",x"03",x"03", -- 0x04C0 + x"07",x"07",x"0F",x"0F",x"1F",x"1F",x"3F",x"3F", -- 0x04C8 + x"07",x"07",x"0F",x"0F",x"1F",x"3F",x"3F",x"7F", -- 0x04D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FE",x"FE", -- 0x04D8 + x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC", -- 0x04E0 + x"FC",x"FC",x"3C",x"18",x"08",x"00",x"00",x"00", -- 0x04E8 + x"E0",x"C0",x"80",x"80",x"00",x"00",x"00",x"00", -- 0x04F0 + x"FE",x"FE",x"FC",x"FC",x"F0",x"F0",x"F0",x"F0", -- 0x04F8 + x"7F",x"7F",x"FF",x"FF",x"FF",x"FF",x"FE",x"FE", -- 0x0500 + x"FC",x"FC",x"FC",x"FC",x"FC",x"FE",x"FE",x"FE", -- 0x0508 + x"FF",x"FF",x"FF",x"FF",x"C3",x"01",x"01",x"00", -- 0x0510 + x"33",x"3F",x"1F",x"00",x"00",x"00",x"00",x"00", -- 0x0518 + x"C0",x"80",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0520 + x"C0",x"40",x"40",x"40",x"60",x"60",x"40",x"C0", -- 0x0528 + x"00",x"00",x"80",x"80",x"80",x"C0",x"C0",x"C0", -- 0x0530 + x"F8",x"F0",x"F0",x"E0",x"E0",x"C0",x"80",x"80", -- 0x0538 + x"FF",x"F8",x"E0",x"C0",x"80",x"00",x"00",x"00", -- 0x0540 + x"E0",x"E0",x"E0",x"E0",x"F0",x"F0",x"FE",x"FF", -- 0x0548 + x"F8",x"F8",x"F8",x"F0",x"F0",x"F0",x"F0",x"E0", -- 0x0550 + x"E0",x"E0",x"40",x"00",x"00",x"00",x"00",x"00", -- 0x0558 + x"00",x"00",x"00",x"00",x"FF",x"FF",x"FF",x"FF", -- 0x0560 + x"FF",x"FF",x"FF",x"FF",x"00",x"00",x"00",x"00", -- 0x0568 + x"F0",x"F8",x"FC",x"FE",x"1F",x"0F",x"07",x"07", -- 0x0570 + x"07",x"07",x"0F",x"1F",x"FE",x"FC",x"F8",x"F0", -- 0x0578 + x"E1",x"E1",x"E1",x"E1",x"FF",x"FF",x"FF",x"FF", -- 0x0580 + x"1E",x"3F",x"7F",x"FF",x"F3",x"E1",x"E1",x"E1", -- 0x0588 + x"07",x"0F",x"9F",x"FF",x"FC",x"F8",x"F0",x"E0", -- 0x0590 + x"C0",x"C0",x"C0",x"C0",x"FF",x"FF",x"FF",x"FF", -- 0x0598 + x"00",x"00",x"00",x"00",x"00",x"00",x"FF",x"FF", -- 0x05A0 + x"FF",x"FF",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A8 + x"FF",x"FF",x"FF",x"FF",x"00",x"00",x"01",x"07", -- 0x05B0 + x"1F",x"7F",x"FE",x"F8",x"FF",x"FF",x"FF",x"FF", -- 0x05B8 + x"FF",x"FF",x"FF",x"FF",x"1F",x"7F",x"FE",x"F8", -- 0x05C0 + x"E0",x"80",x"00",x"00",x"FF",x"FF",x"FF",x"FF", -- 0x05C8 + x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"FF",x"FF", -- 0x05D0 + x"FF",x"FF",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0", -- 0x05D8 + x"38",x"78",x"F8",x"F8",x"F0",x"E0",x"E0",x"E0", -- 0x05E0 + x"E0",x"E0",x"E0",x"F0",x"FF",x"FF",x"7F",x"3F", -- 0x05E8 + x"1C",x"1E",x"1F",x"1F",x"0F",x"07",x"07",x"07", -- 0x05F0 + x"07",x"07",x"07",x"0F",x"FF",x"FF",x"FE",x"FC", -- 0x05F8 + x"80",x"C0",x"E0",x"F0",x"F8",x"7C",x"3E",x"1F", -- 0x0600 + x"0F",x"07",x"03",x"03",x"FF",x"FF",x"FF",x"FF", -- 0x0608 + x"01",x"03",x"07",x"0F",x"1F",x"3E",x"7C",x"F8", -- 0x0610 + x"F0",x"E0",x"C0",x"C0",x"FF",x"FF",x"FF",x"FF", -- 0x0618 + x"00",x"00",x"00",x"00",x"81",x"87",x"00",x"00", -- 0x0620 + x"00",x"00",x"00",x"00",x"80",x"80",x"C0",x"00", -- 0x0628 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0630 + x"10",x"10",x"30",x"30",x"30",x"60",x"40",x"C0", -- 0x0638 + x"03",x"0F",x"1F",x"1B",x"39",x"70",x"73",x"37", -- 0x0640 + x"C0",x"C0",x"E8",x"FC",x"FC",x"9C",x"9C",x"EE", -- 0x0648 + x"3F",x"1F",x"07",x"1F",x"1E",x"0F",x"0F",x"01", -- 0x0650 + x"DE",x"DF",x"9F",x"A7",x"47",x"AF",x"FC",x"E0", -- 0x0658 + x"7F",x"7E",x"7E",x"7F",x"7F",x"7F",x"7E",x"78", -- 0x0660 + x"FE",x"EE",x"EE",x"F8",x"E0",x"80",x"00",x"00", -- 0x0668 + x"62",x"0E",x"3E",x"7E",x"7A",x"73",x"6B",x"59", -- 0x0670 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0678 + x"00",x"80",x"40",x"20",x"10",x"08",x"04",x"02", -- 0x0680 + x"00",x"10",x"08",x"08",x"1C",x"0C",x"00",x"00", -- 0x0688 + x"01",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0690 + x"E0",x"E0",x"70",x"06",x"02",x"00",x"60",x"20", -- 0x0698 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"02", -- 0x06A0 + x"00",x"04",x"08",x"18",x"30",x"20",x"E0",x"40", -- 0x06A8 + x"00",x"00",x"71",x"12",x"11",x"16",x"04",x"04", -- 0x06B0 + x"00",x"00",x"80",x"00",x"00",x"00",x"00",x"70", -- 0x06B8 + x"31",x"08",x"00",x"00",x"00",x"00",x"01",x"01", -- 0x06C0 + x"C0",x"00",x"00",x"00",x"40",x"C0",x"78",x"00", -- 0x06C8 + x"01",x"06",x"0C",x"08",x"08",x"10",x"20",x"00", -- 0x06D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D8 + x"00",x"00",x"00",x"00",x"00",x"0A",x"0F",x"03", -- 0x06E0 + x"38",x"1E",x"00",x"00",x"00",x"00",x"00",x"80", -- 0x06E8 + x"03",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F0 + x"B0",x"30",x"30",x"1C",x"0C",x"04",x"02",x"00", -- 0x06F8 + x"00",x"80",x"40",x"30",x"08",x"05",x"07",x"03", -- 0x0700 + x"80",x"40",x"20",x"10",x"6C",x"90",x"0E",x"21", -- 0x0708 + x"01",x"01",x"03",x"06",x"04",x"04",x"1B",x"3A", -- 0x0710 + x"48",x"38",x"0E",x"1F",x"0F",x"07",x"01",x"D9", -- 0x0718 + x"00",x"00",x"00",x"00",x"00",x"06",x"04",x"09", -- 0x0720 + x"01",x"02",x"06",x"0C",x"38",x"70",x"58",x"AC", -- 0x0728 + x"D3",x"C6",x"87",x"6B",x"F4",x"A4",x"08",x"CC", -- 0x0730 + x"C8",x"D0",x"10",x"40",x"80",x"80",x"00",x"CF", -- 0x0738 + x"C5",x"02",x"00",x"06",x"02",x"01",x"00",x"02", -- 0x0740 + x"3F",x"8F",x"07",x"02",x"08",x"15",x"C7",x"F5", -- 0x0748 + x"02",x"06",x"0C",x"18",x"30",x"20",x"40",x"00", -- 0x0750 + x"74",x"22",x"01",x"00",x"02",x"04",x"08",x"10", -- 0x0758 + x"EF",x"EE",x"79",x"28",x"84",x"91",x"0B",x"15", -- 0x0760 + x"98",x"30",x"20",x"20",x"C0",x"00",x"40",x"F8", -- 0x0768 + x"94",x"C4",x"28",x"D0",x"30",x"00",x"00",x"00", -- 0x0770 + x"70",x"08",x"04",x"02",x"01",x"00",x"00",x"00", -- 0x0778 + x"00",x"80",x"60",x"10",x"0C",x"07",x"03",x"01", -- 0x0780 + x"20",x"20",x"10",x"10",x"08",x"9C",x"FF",x"FF", -- 0x0788 + x"10",x"0D",x"03",x"01",x"00",x"03",x"07",x"FF", -- 0x0790 + x"FF",x"FF",x"FB",x"FB",x"F7",x"E1",x"F0",x"E0", -- 0x0798 + x"00",x"00",x"40",x"41",x"42",x"46",x"DC",x"FD", -- 0x07A0 + x"00",x"02",x"04",x"18",x"20",x"60",x"C0",x"80", -- 0x07A8 + x"FF",x"FF",x"FF",x"FF",x"C7",x"03",x"07",x"00", -- 0x07B0 + x"80",x"04",x"18",x"20",x"C0",x"80",x"E0",x"FF", -- 0x07B8 + x"01",x"00",x"00",x"01",x"03",x"0F",x"18",x"60", -- 0x07C0 + x"80",x"F0",x"F0",x"F8",x"FC",x"7D",x"7F",x"FF", -- 0x07C8 + x"01",x"03",x"04",x"08",x"10",x"20",x"40",x"00", -- 0x07D0 + x"E7",x"83",x"01",x"01",x"00",x"00",x"00",x"00", -- 0x07D8 + x"0F",x"00",x"00",x"0B",x"0E",x"07",x"FF",x"FB", -- 0x07E0 + x"C0",x"00",x"40",x"C0",x"38",x"0C",x"80",x"80", -- 0x07E8 + x"F8",x"F8",x"DC",x"8C",x"86",x"82",x"82",x"80", -- 0x07F0 + x"C0",x"60",x"20",x"10",x"08",x"04",x"00",x"00" -- 0x07F8 + ); + +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GALAXIAN_1K.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GALAXIAN_1K.vhd new file mode 100644 index 00000000..942316be --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GALAXIAN_1K.vhd @@ -0,0 +1,280 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_1K is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_1K is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"00",x"00", -- 0x0050 + x"00",x"00",x"00",x"00",x"08",x"FE",x"F0",x"F0", -- 0x0058 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0060 + x"00",x"00",x"00",x"04",x"06",x"00",x"00",x"02", -- 0x0068 + x"08",x"08",x"0C",x"08",x"08",x"00",x"00",x"00", -- 0x0070 + x"00",x"27",x"62",x"C0",x"90",x"62",x"27",x"00", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"00", -- 0x0158 + x"00",x"02",x"07",x"02",x"00",x"00",x"00",x"00", -- 0x0160 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0180 + x"0F",x"1F",x"3F",x"3F",x"1F",x"1F",x"1F",x"03", -- 0x0188 + x"0F",x"07",x"03",x"01",x"00",x"01",x"01",x"03", -- 0x0190 + x"7F",x"7F",x"7F",x"7F",x"7F",x"3F",x"3F",x"1F", -- 0x0198 + x"1C",x"1C",x"3E",x"3E",x"3E",x"3E",x"7E",x"7F", -- 0x01A0 + x"00",x"00",x"00",x"00",x"00",x"0C",x"0C",x"1C", -- 0x01A8 + x"01",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01B0 + x"07",x"01",x"00",x"03",x"03",x"03",x"01",x"01", -- 0x01B8 + x"FF",x"7F",x"3F",x"1F",x"1F",x"1F",x"0F",x"0F", -- 0x01C0 + x"00",x"80",x"E0",x"F0",x"6C",x"07",x"0F",x"A7", -- 0x01C8 + x"FF",x"FE",x"FE",x"3C",x"0C",x"00",x"00",x"00", -- 0x01D0 + x"03",x"0F",x"07",x"07",x"07",x"03",x"82",x"E3", -- 0x01D8 + x"00",x"00",x"00",x"00",x"00",x"04",x"0E",x"07", -- 0x01E0 + x"00",x"00",x"01",x"03",x"01",x"01",x"00",x"00", -- 0x01E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F0 + x"FF",x"FF",x"FF",x"FF",x"F7",x"C3",x"81",x"00", -- 0x01F8 + x"00",x"00",x"00",x"00",x"00",x"03",x"0F",x"03", -- 0x0200 + x"3C",x"18",x"18",x"38",x"78",x"F8",x"F8",x"F8", -- 0x0208 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0210 + x"78",x"38",x"18",x"18",x"3C",x"00",x"00",x"00", -- 0x0218 + x"00",x"01",x"01",x"03",x"03",x"03",x"03",x"03", -- 0x0220 + x"00",x"00",x"00",x"80",x"80",x"80",x"80",x"80", -- 0x0228 + x"07",x"07",x"2F",x"3F",x"3F",x"3F",x"20",x"00", -- 0x0230 + x"C0",x"C0",x"E8",x"F8",x"F8",x"F8",x"08",x"00", -- 0x0238 + x"00",x"40",x"70",x"30",x"38",x"3C",x"1F",x"1F", -- 0x0240 + x"00",x"00",x"00",x"40",x"60",x"70",x"C0",x"80", -- 0x0248 + x"0F",x"0E",x"0E",x"0C",x"38",x"30",x"10",x"00", -- 0x0250 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0270 + x"18",x"18",x"78",x"9C",x"9C",x"78",x"18",x"18", -- 0x0278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0290 + x"3F",x"0F",x"1E",x"44",x"44",x"1E",x"0F",x"3F", -- 0x0298 + x"01",x"02",x"04",x"09",x"11",x"23",x"47",x"8E", -- 0x02A0 + x"80",x"40",x"20",x"90",x"88",x"C4",x"E2",x"71", -- 0x02A8 + x"8E",x"47",x"23",x"11",x"09",x"04",x"02",x"01", -- 0x02B0 + x"71",x"E2",x"C4",x"88",x"90",x"20",x"40",x"80", -- 0x02B8 + x"00",x"00",x"07",x"1C",x"1B",x"32",x"2E",x"2C", -- 0x02C0 + x"00",x"00",x"E0",x"38",x"D8",x"4C",x"34",x"34", -- 0x02C8 + x"2C",x"2E",x"32",x"1B",x"1C",x"07",x"00",x"00", -- 0x02D0 + x"34",x"34",x"4C",x"D8",x"38",x"E0",x"00",x"00", -- 0x02D8 + x"FF",x"FF",x"FF",x"80",x"AF",x"A5",x"DB",x"81", -- 0x02E0 + x"80",x"60",x"B0",x"58",x"EC",x"76",x"3B",x"5D", -- 0x02E8 + x"9D",x"87",x"FF",x"FB",x"DB",x"C3",x"DE",x"F6", -- 0x02F0 + x"69",x"76",x"47",x"D6",x"A9",x"9F",x"B7",x"F7", -- 0x02F8 + x"03",x"06",x"0C",x"FC",x"CE",x"E7",x"71",x"3C", -- 0x0300 + x"C0",x"60",x"30",x"3F",x"73",x"E7",x"8E",x"3C", -- 0x0308 + x"3C",x"71",x"E7",x"CE",x"FC",x"0C",x"06",x"03", -- 0x0310 + x"3C",x"8E",x"E7",x"73",x"3E",x"30",x"60",x"C0", -- 0x0318 + x"0E",x"0E",x"07",x"07",x"03",x"03",x"07",x"01", -- 0x0320 + x"01",x"01",x"03",x"03",x"07",x"07",x"0E",x"0E", -- 0x0328 + x"FF",x"FF",x"70",x"7E",x"3A",x"3E",x"1C",x"1C", -- 0x0330 + x"1C",x"1C",x"3E",x"3A",x"7E",x"70",x"FF",x"FF", -- 0x0338 + x"E0",x"FC",x"FF",x"3F",x"07",x"00",x"00",x"00", -- 0x0340 + x"00",x"00",x"00",x"07",x"3F",x"FF",x"FC",x"E0", -- 0x0348 + x"03",x"1F",x"FF",x"FE",x"F0",x"E0",x"E0",x"E0", -- 0x0350 + x"E0",x"E0",x"E0",x"F0",x"FE",x"FF",x"1F",x"03", -- 0x0358 + x"E3",x"E1",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0", -- 0x0360 + x"E0",x"F0",x"F8",x"FC",x"FE",x"FF",x"EF",x"E7", -- 0x0368 + x"07",x"07",x"07",x"07",x"07",x"07",x"87",x"C7", -- 0x0370 + x"E7",x"F7",x"FF",x"7F",x"3F",x"1F",x"0F",x"07", -- 0x0378 + x"00",x"01",x"03",x"07",x"03",x"07",x"0F",x"3F", -- 0x0380 + x"80",x"80",x"D8",x"F8",x"F8",x"F0",x"F0",x"F0", -- 0x0388 + x"1F",x"1F",x"1F",x"0F",x"03",x"07",x"07",x"01", -- 0x0390 + x"F8",x"F8",x"F0",x"E0",x"F8",x"FC",x"78",x"00", -- 0x0398 + x"00",x"00",x"00",x"00",x"00",x"04",x"01",x"03", -- 0x03A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"40",x"90", -- 0x03A8 + x"07",x"02",x"02",x"08",x"00",x"00",x"00",x"00", -- 0x03B0 + x"C0",x"80",x"A0",x"10",x"00",x"00",x"00",x"00", -- 0x03B8 + x"00",x"00",x"00",x"04",x"24",x"04",x"4E",x"27", -- 0x03C0 + x"00",x"00",x"20",x"40",x"11",x"80",x"A4",x"C8", -- 0x03C8 + x"07",x"03",x"25",x"00",x"08",x"00",x"00",x"00", -- 0x03D0 + x"C0",x"20",x"90",x"A0",x"20",x"50",x"00",x"00", -- 0x03D8 + x"00",x"00",x"42",x"20",x"04",x"0F",x"E7",x"3F", -- 0x03E0 + x"00",x"20",x"44",x"C8",x"80",x"80",x"D0",x"EC", -- 0x03E8 + x"07",x"07",x"0D",x"1D",x"29",x"42",x"01",x"00", -- 0x03F0 + x"C0",x"A0",x"B0",x"88",x"44",x"20",x"10",x"08", -- 0x03F8 + x"00",x"00",x"00",x"00",x"80",x"80",x"C0",x"E1", -- 0x0400 + x"70",x"30",x"60",x"40",x"C0",x"00",x"00",x"00", -- 0x0408 + x"1F",x"07",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x0410 + x"1F",x"1F",x"3F",x"3F",x"7F",x"7F",x"FF",x"FF", -- 0x0418 + x"00",x"00",x"00",x"00",x"00",x"00",x"03",x"0F", -- 0x0420 + x"FF",x"7F",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0428 + x"FF",x"FF",x"FF",x"F8",x"00",x"00",x"00",x"00", -- 0x0430 + x"03",x"07",x"07",x"0F",x"1F",x"FF",x"FF",x"FF", -- 0x0438 + x"FF",x"FF",x"FF",x"7F",x"1F",x"0F",x"07",x"03", -- 0x0440 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0448 + x"00",x"00",x"00",x"00",x"00",x"02",x"03",x"01", -- 0x0450 + x"C0",x"60",x"60",x"30",x"30",x"30",x"18",x"18", -- 0x0458 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"80", -- 0x0460 + x"03",x"03",x"01",x"01",x"01",x"00",x"00",x"00", -- 0x0468 + x"00",x"C0",x"50",x"34",x"1A",x"0D",x"06",x"06", -- 0x0470 + x"40",x"40",x"A0",x"A0",x"A0",x"D0",x"D0",x"D0", -- 0x0478 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"80", -- 0x0480 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0488 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0490 + x"FF",x"FF",x"FE",x"FE",x"FE",x"FC",x"FC",x"FC", -- 0x0498 + x"F8",x"F8",x"F8",x"F8",x"F0",x"F0",x"F0",x"F0", -- 0x04A0 + x"E0",x"E0",x"C0",x"C0",x"C0",x"80",x"80",x"80", -- 0x04A8 + x"FF",x"FF",x"FF",x"FE",x"FE",x"FC",x"FC",x"F8", -- 0x04B0 + x"F8",x"F8",x"F0",x"F0",x"E0",x"E0",x"C0",x"C0", -- 0x04B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x04C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FE",x"FE",x"FC", -- 0x04C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FE",x"FE",x"FC", -- 0x04D0 + x"FC",x"F8",x"F8",x"F0",x"E0",x"C0",x"C0",x"80", -- 0x04D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F0 + x"C0",x"80",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x04F8 + x"FC",x"F8",x"F8",x"F0",x"F0",x"E0",x"E0",x"E0", -- 0x0500 + x"80",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0508 + x"00",x"00",x"00",x"00",x"00",x"01",x"01",x"00", -- 0x0510 + x"33",x"3F",x"1F",x"00",x"00",x"00",x"00",x"00", -- 0x0518 + x"C0",x"80",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0520 + x"C0",x"40",x"40",x"40",x"60",x"60",x"40",x"C0", -- 0x0528 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"C0", -- 0x0530 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0538 + x"0F",x"38",x"E0",x"C0",x"80",x"00",x"00",x"00", -- 0x0540 + x"00",x"00",x"00",x"00",x"00",x"00",x"06",x"07", -- 0x0548 + x"C0",x"C0",x"C0",x"C0",x"C0",x"80",x"80",x"00", -- 0x0550 + x"E0",x"E0",x"40",x"00",x"00",x"00",x"00",x"00", -- 0x0558 + x"00",x"00",x"00",x"00",x"FF",x"FF",x"FF",x"FF", -- 0x0560 + x"FF",x"FF",x"FF",x"FF",x"00",x"00",x"00",x"00", -- 0x0568 + x"F0",x"F8",x"FC",x"FE",x"1F",x"0F",x"07",x"07", -- 0x0570 + x"07",x"07",x"0F",x"1F",x"FE",x"FC",x"F8",x"F0", -- 0x0578 + x"E1",x"E1",x"E1",x"E1",x"FF",x"FF",x"FF",x"FF", -- 0x0580 + x"1E",x"3F",x"7F",x"FF",x"F3",x"E1",x"E1",x"E1", -- 0x0588 + x"07",x"0F",x"9F",x"FF",x"FC",x"F8",x"F0",x"E0", -- 0x0590 + x"C0",x"C0",x"C0",x"C0",x"FF",x"FF",x"FF",x"FF", -- 0x0598 + x"00",x"00",x"00",x"00",x"00",x"00",x"FF",x"FF", -- 0x05A0 + x"FF",x"FF",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A8 + x"FF",x"FF",x"FF",x"FF",x"00",x"00",x"01",x"07", -- 0x05B0 + x"1F",x"7F",x"FE",x"F8",x"FF",x"FF",x"FF",x"FF", -- 0x05B8 + x"FF",x"FF",x"FF",x"FF",x"1F",x"7F",x"FE",x"F8", -- 0x05C0 + x"E0",x"80",x"00",x"00",x"FF",x"FF",x"FF",x"FF", -- 0x05C8 + x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"FF",x"FF", -- 0x05D0 + x"FF",x"FF",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0", -- 0x05D8 + x"38",x"78",x"F8",x"F8",x"F0",x"E0",x"E0",x"E0", -- 0x05E0 + x"E0",x"E0",x"E0",x"F0",x"FF",x"FF",x"7F",x"3F", -- 0x05E8 + x"1C",x"1E",x"1F",x"1F",x"0F",x"07",x"07",x"07", -- 0x05F0 + x"07",x"07",x"07",x"0F",x"FF",x"FF",x"FE",x"FC", -- 0x05F8 + x"80",x"C0",x"E0",x"F0",x"F8",x"7C",x"3E",x"1F", -- 0x0600 + x"0F",x"07",x"03",x"03",x"FF",x"FF",x"FF",x"FF", -- 0x0608 + x"01",x"03",x"07",x"0F",x"1F",x"3E",x"7C",x"F8", -- 0x0610 + x"F0",x"E0",x"C0",x"C0",x"FF",x"FF",x"FF",x"FF", -- 0x0618 + x"00",x"00",x"C3",x"2C",x"10",x"11",x"00",x"00", -- 0x0620 + x"00",x"00",x"00",x"80",x"40",x"20",x"10",x"10", -- 0x0628 + x"00",x"FE",x"FF",x"FE",x"70",x"E0",x"FC",x"F0", -- 0x0630 + x"08",x"08",x"14",x"14",x"28",x"48",x"10",x"20", -- 0x0638 + x"00",x"00",x"00",x"04",x"06",x"0F",x"0C",x"08", -- 0x0640 + x"00",x"00",x"00",x"00",x"67",x"06",x"06",x"01", -- 0x0648 + x"00",x"00",x"00",x"00",x"01",x"00",x"00",x"00", -- 0x0650 + x"20",x"20",x"60",x"58",x"B8",x"50",x"00",x"00", -- 0x0658 + x"F0",x"E7",x"FF",x"DE",x"D0",x"C6",x"FD",x"F7", -- 0x0660 + x"C7",x"D7",x"7F",x"00",x"DC",x"70",x"C0",x"00", -- 0x0668 + x"DF",x"FF",x"FD",x"F9",x"F5",x"ED",x"C7",x"A7", -- 0x0670 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0678 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0680 + x"00",x"00",x"00",x"00",x"18",x"0D",x"02",x"04", -- 0x0688 + x"00",x"00",x"00",x"00",x"00",x"01",x"01",x"02", -- 0x0690 + x"62",x"27",x"10",x"E6",x"92",x"0C",x"68",x"20", -- 0x0698 + x"00",x"00",x"00",x"00",x"00",x"C0",x"61",x"13", -- 0x06A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A8 + x"12",x"04",x"F1",x"52",x"31",x"36",x"05",x"04", -- 0x06B0 + x"C0",x"20",x"A0",x"20",x"20",x"40",x"40",x"80", -- 0x06B8 + x"05",x"04",x"02",x"01",x"00",x"01",x"01",x"01", -- 0x06C0 + x"C0",x"40",x"40",x"40",x"C0",x"C0",x"FC",x"8A", -- 0x06C8 + x"01",x"06",x"08",x"00",x"00",x"00",x"00",x"00", -- 0x06D0 + x"72",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D8 + x"00",x"00",x"00",x"00",x"00",x"08",x"0C",x"02", -- 0x06E0 + x"00",x"78",x"20",x"20",x"10",x"10",x"20",x"20", -- 0x06E8 + x"13",x"0F",x"E3",x"00",x"00",x"00",x"00",x"00", -- 0x06F0 + x"70",x"D0",x"10",x"0C",x"04",x"00",x"00",x"00", -- 0x06F8 + x"00",x"00",x"00",x"00",x"00",x"01",x"01",x"03", -- 0x0700 + x"00",x"00",x"00",x"10",x"7C",x"FF",x"FF",x"DF", -- 0x0708 + x"03",x"07",x"07",x"09",x"0F",x"0F",x"05",x"0D", -- 0x0710 + x"37",x"8F",x"C7",x"82",x"01",x"87",x"E1",x"F9", -- 0x0718 + x"00",x"00",x"00",x"00",x"00",x"0F",x"9F",x"FF", -- 0x0720 + x"00",x"00",x"00",x"00",x"00",x"40",x"B8",x"78", -- 0x0728 + x"9C",x"2F",x"74",x"F8",x"F1",x"A7",x"0F",x"CF", -- 0x0730 + x"70",x"60",x"F0",x"E0",x"E0",x"C0",x"C0",x"E0", -- 0x0738 + x"0E",x"07",x"07",x"0B",x"07",x"03",x"01",x"01", -- 0x0740 + x"FF",x"7F",x"EF",x"F6",x"74",x"8F",x"8B",x"8E", -- 0x0748 + x"01",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0750 + x"DF",x"77",x"23",x"03",x"03",x"03",x"00",x"00", -- 0x0758 + x"EF",x"EF",x"7F",x"2F",x"8F",x"9F",x"3F",x"7E", -- 0x0760 + x"E0",x"D0",x"F0",x"F0",x"E0",x"E0",x"80",x"10", -- 0x0768 + x"6E",x"3E",x"DC",x"F8",x"F8",x"30",x"00",x"00", -- 0x0770 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0778 + x"00",x"00",x"00",x"00",x"00",x"01",x"00",x"00", -- 0x0780 + x"00",x"00",x"00",x"00",x"00",x"94",x"F7",x"33", -- 0x0788 + x"00",x"01",x"00",x"00",x"00",x"03",x"02",x"00", -- 0x0790 + x"1A",x"8E",x"C8",x"FA",x"D6",x"33",x"7D",x"FF", -- 0x0798 + x"00",x"00",x"00",x"00",x"00",x"02",x"14",x"35", -- 0x07A0 + x"00",x"00",x"00",x"00",x"00",x"40",x"80",x"00", -- 0x07A8 + x"24",x"28",x"49",x"DF",x"D7",x"77",x"CE",x"F8", -- 0x07B0 + x"00",x"00",x"00",x"00",x"80",x"80",x"20",x"00", -- 0x07B8 + x"01",x"00",x"00",x"01",x"00",x"01",x"00",x"00", -- 0x07C0 + x"87",x"FB",x"8E",x"19",x"F7",x"63",x"42",x"9C", -- 0x07C8 + x"00",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07D0 + x"66",x"82",x"01",x"01",x"00",x"00",x"00",x"00", -- 0x07D8 + x"FF",x"FF",x"F8",x"EA",x"AE",x"79",x"DC",x"4A", -- 0x07E0 + x"C0",x"80",x"40",x"00",x"00",x"00",x"80",x"00", -- 0x07E8 + x"40",x"70",x"58",x"08",x"00",x"00",x"00",x"00", -- 0x07F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x07F8 + ); + +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GALAXIAN_6L.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GALAXIAN_6L.vhd new file mode 100644 index 00000000..69425a6e --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GALAXIAN_6L.vhd @@ -0,0 +1,28 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_6L is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_6L is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + x"00",x"7A",x"36",x"07",x"00",x"F0",x"38",x"1F", -- 0x0000 + x"00",x"C7",x"F0",x"3F",x"00",x"DB",x"C6",x"38", -- 0x0008 + x"00",x"36",x"07",x"F0",x"00",x"33",x"3F",x"DB", -- 0x0010 + x"00",x"3F",x"57",x"C6",x"00",x"C6",x"3F",x"FF" -- 0x0018 + ); + +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GAL_FIR.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GAL_FIR.vhd new file mode 100644 index 00000000..5aff2022 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GAL_FIR.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_FIR 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 prom of GAL_FIR is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AC",X"68",X"72",X"C7",X"93",X"3F",X"80",X"C8",X"5C",X"A1",X"22",X"90",X"B9",X"8A",X"41",X"62", + X"C2",X"A1",X"40",X"6A",X"C9",X"7F",X"64",X"3C",X"BC",X"AD",X"5B",X"4C",X"D4",X"62",X"3D",X"D3", + X"7F",X"31",X"A3",X"BE",X"5D",X"49",X"C7",X"7D",X"28",X"C0",X"A1",X"7A",X"7D",X"2B",X"C9",X"91", + X"80",X"6B",X"39",X"95",X"BA",X"91",X"27",X"C1",X"91",X"7E",X"6D",X"31",X"C0",X"A4",X"7C",X"7B", + X"37",X"80",X"CB",X"7E",X"88",X"64",X"40",X"8F",X"C3",X"83",X"83",X"68",X"36",X"D0",X"8C",X"29", + X"B4",X"B1",X"52",X"4B",X"E9",X"3E",X"74",X"C4",X"73",X"81",X"2B",X"AD",X"B9",X"4E",X"4B",X"CB", + X"91",X"76",X"33",X"B6",X"A5",X"6E",X"4A",X"63",X"D7",X"7C",X"3E",X"7E",X"DE",X"45",X"67",X"C1", + X"84",X"2D",X"A8",X"A9",X"20",X"AC",X"B5",X"7E",X"47",X"5F",X"DD",X"6E",X"44",X"BD",X"97",X"22", + X"AE",X"A4",X"25",X"CB",X"93",X"77",X"3C",X"78",X"CB",X"83",X"29",X"B3",X"AB",X"7D",X"5D",X"44", + X"A4",X"BC",X"79",X"8C",X"3A",X"76",X"CF",X"78",X"44",X"6B",X"D9",X"6B",X"3B",X"9A",X"CC",X"26", + X"A4",X"A3",X"1D",X"BA",X"A9",X"83",X"71",X"3A",X"8B",X"CC",X"6A",X"3E",X"E5",X"28",X"A4",X"A3", + X"1E",X"C9",X"9C",X"78",X"32",X"94",X"C4",X"74",X"88",X"2A",X"A2",X"BC",X"1A",X"E2",X"4B",X"86", + X"B3",X"72",X"48",X"68",X"D2",X"83",X"32",X"A4",X"B2",X"73",X"4E",X"5A",X"C8",X"9C",X"2C",X"90", + X"C1",X"7B",X"5E",X"41",X"CC",X"99",X"6F",X"3A",X"8B",X"C9",X"7A",X"84",X"23",X"BC",X"9D",X"33", + X"CC",X"82",X"24",X"D7",X"6C",X"47",X"D1",X"87",X"5C",X"41",X"C5",X"9F",X"71",X"35",X"A8",X"B9", + X"67",X"4F",X"5F",X"CE",X"8A",X"43",X"C6",X"80",X"54",X"4A",X"B1",X"AE",X"87",X"50",X"4F",X"C6", + X"9F",X"55",X"45",X"BB",X"AC",X"5C",X"41",X"A9",X"BE",X"5C",X"4C",X"72",X"D4",X"71",X"42",X"DA", + X"20",X"CF",X"6C",X"3D",X"D5",X"8A",X"78",X"39",X"7B",X"BF",X"99",X"75",X"37",X"99",X"C7",X"28", + X"7B",X"C3",X"91",X"58",X"46",X"9D",X"BB",X"88",X"60",X"40",X"9A",X"BB",X"8C",X"3B",X"6A",X"BA", + X"AC",X"31",X"7F",X"C8",X"2F",X"78",X"DC",X"33",X"AE",X"80",X"34",X"EE",X"38",X"74",X"D5",X"1F", + X"98",X"BA",X"82",X"58",X"4A",X"D6",X"86",X"56",X"49",X"F0",X"34",X"73",X"BD",X"9A",X"43",X"67", + X"C3",X"8D",X"2E",X"8B",X"B9",X"40",X"C6",X"33",X"B7",X"A5",X"27",X"8A",X"BA",X"42",X"BF",X"8A", + X"3A",X"6F",X"D1",X"5C",X"41",X"DF",X"6A",X"42",X"C3",X"A4",X"33",X"80",X"CC",X"5C",X"43",X"89", + X"BE",X"96",X"53",X"4E",X"8D",X"D4",X"2E",X"BD",X"56",X"6C",X"DA",X"53",X"47",X"9C",X"C8",X"2A", + X"75",X"B3",X"B0",X"2F",X"80",X"CA",X"2B",X"81",X"CD",X"35",X"7E",X"CE",X"32",X"81",X"CD",X"74", + X"40",X"74",X"D8",X"4E",X"58",X"D3",X"85",X"4D",X"53",X"AE",X"B8",X"61",X"3D",X"9F",X"C3",X"30", + X"86",X"D0",X"5E",X"47",X"7D",X"C6",X"91",X"4E",X"4E",X"A9",X"B9",X"6D",X"34",X"9F",X"B7",X"3F", + X"C6",X"7A",X"37",X"81",X"C5",X"8C",X"33",X"88",X"D3",X"44",X"59",X"82",X"C8",X"88",X"42",X"61", + X"AF",X"A2",X"44",X"D9",X"48",X"52",X"89",X"BC",X"99",X"2E",X"7E",X"B4",X"38",X"B7",X"9E",X"20", + X"E4",X"56",X"63",X"D9",X"56",X"43",X"B1",X"B8",X"37",X"6B",X"D3",X"6D",X"31",X"C8",X"65",X"8D", + X"B9",X"0B",X"BA",X"86",X"4D",X"D7",X"4E",X"4B",X"E7",X"3C",X"95",X"AD",X"1D",X"D8",X"72",X"35", + X"B4",X"A5",X"2F",X"B3",X"B6",X"44",X"57",X"93",X"CB",X"67",X"3F",X"A1",X"C7",X"21",X"89",X"9C", + X"5A",X"D8",X"20",X"A3",X"BA",X"25",X"89",X"AD",X"37",X"D8",X"5D",X"53",X"DC",X"77",X"43",X"70", + X"E1",X"46",X"59",X"83",X"CC",X"6E",X"37",X"E7",X"56",X"4E",X"86",X"D3",X"27",X"9E",X"AA",X"44", + X"C0",X"19",X"E9",X"54",X"63",X"DB",X"51",X"4D",X"88",X"CF",X"30",X"91",X"C5",X"66",X"35",X"C1", + X"9C",X"33",X"79",X"A7",X"BA",X"53",X"41",X"DD",X"4B",X"73",X"D2",X"25",X"7F",X"BB",X"9D",X"37", + X"68",X"A9",X"BD",X"3B",X"5C",X"CF",X"61",X"47",X"C9",X"9E",X"47",X"55",X"AF",X"96",X"5D",X"D0", + X"28",X"7E",X"D3",X"48",X"51",X"C7",X"95",X"21",X"BB",X"A6",X"3A",X"67",X"C3",X"81",X"37",X"DE", + X"7D",X"3F",X"72",X"AA",X"B4",X"15",X"DC",X"6C",X"47",X"D2",X"71",X"28",X"EB",X"2E",X"9F",X"93", + X"6C",X"9C",X"37",X"DB",X"43",X"AC",X"37",X"D3",X"4F",X"AC",X"8D",X"1B",X"DF",X"7E",X"46",X"6B", + X"BA",X"A5",X"35",X"73",X"CB",X"41",X"7E",X"C8",X"1D",X"D3",X"60",X"5F",X"DB",X"44",X"57",X"C2", + X"A2",X"41",X"5B",X"AE",X"96",X"5E",X"CC",X"10",X"CF",X"83",X"31",X"DF",X"59",X"46",X"CC",X"87", + X"28",X"D7",X"84",X"3D",X"7A",X"DD",X"3A",X"7B",X"C8",X"36",X"66",X"C8",X"60",X"9A",X"8F",X"29", + X"A8",X"B3",X"83",X"1F",X"D6",X"81",X"33",X"C4",X"82",X"2A",X"D4",X"6B",X"70",X"CA",X"1B",X"A9", + X"AB",X"22",X"AE",X"9E",X"49",X"D3",X"45",X"5A",X"A1",X"BB",X"70",X"27",X"E9",X"49",X"72",X"CC", + X"38",X"67",X"B6",X"AD",X"41",X"57",X"B7",X"8C",X"39",X"E4",X"70",X"4B",X"63",X"C7",X"52",X"AE", + X"8A",X"36",X"8A",X"BB",X"8E",X"2F",X"87",X"AB",X"B2",X"2D",X"72",X"94",X"CD",X"39",X"67",X"D9", + X"2B",X"86",X"C8",X"50",X"4D",X"BC",X"A1",X"3F",X"6B",X"BC",X"7C",X"48",X"E0",X"20",X"BA",X"83", + X"43",X"D4",X"26",X"BD",X"A2",X"3E",X"6C",X"CA",X"8A",X"38",X"7B",X"AF",X"AE",X"23",X"91",X"C0", + X"37",X"76",X"A3",X"C2",X"39",X"63",X"D9",X"48",X"5A",X"93",X"C9",X"43",X"62",X"90",X"B1",X"37", + X"D1",X"53",X"74",X"B1",X"37",X"F6",X"23",X"82",X"C3",X"52",X"4A",X"BB",X"75",X"95",X"88",X"3D", + X"90",X"C3",X"76",X"3B",X"87",X"A9",X"70",X"A6",X"61",X"4F",X"AE",X"B6",X"50",X"4B",X"E2",X"4A", + X"63",X"DC",X"3E",X"63",X"92",X"CC",X"4F",X"4D",X"E3",X"4A",X"5B",X"89",X"D0",X"47",X"5E",X"90", + X"D0",X"49",X"5B",X"7E",X"C6",X"76",X"3E",X"8C",X"AA",X"A4",X"15",X"CD",X"89",X"43",X"80",X"BD", + X"65",X"A8",X"3D",X"8E",X"CF",X"0B",X"C0",X"8E",X"46",X"76",X"C9",X"7A",X"3E",X"88",X"AA",X"A8", + X"18",X"BF",X"9C",X"2E",X"C3",X"85",X"2B",X"DC",X"6C",X"45",X"DB",X"4B",X"5F",X"92",X"AD",X"3D", + X"C3",X"4F",X"86",X"A6",X"75",X"81",X"36",X"E7",X"37",X"A6",X"7D",X"A5",X"5A",X"58",X"D8",X"4E", + X"56",X"AB",X"8E",X"49",X"DD",X"68",X"40",X"8A",X"B0",X"53",X"C3",X"4F",X"60",X"92",X"C6",X"51", + X"54",X"9A",X"C5",X"55",X"4D",X"93",X"C2",X"70",X"2F",X"E3",X"50",X"5B",X"8D",X"AF",X"48",X"AA", + X"81",X"98",X"4C",X"65",X"C1",X"66",X"BB",X"23",X"B0",X"9B",X"39",X"83",X"A4",X"B3",X"1A",X"B0", + X"9D",X"31",X"C3",X"8E",X"2B",X"E2",X"54",X"5A",X"DC",X"32",X"86",X"CA",X"14",X"C9",X"83",X"43", + X"83",X"AD",X"A6",X"15",X"DA",X"6D",X"4C",X"87",X"AF",X"63",X"B9",X"3A",X"8C",X"C5",X"0D",X"CC", + X"79",X"58",X"74",X"C9",X"7D",X"42",X"7C",X"B7",X"5C",X"A9",X"7B",X"41",X"93",X"B6",X"81",X"32", + X"9D",X"92",X"6B",X"87",X"9D",X"94",X"4A",X"6C",X"B7",X"A4",X"1B",X"BD",X"88",X"4D",X"7D",X"BD", + X"4D",X"99",X"8A",X"51",X"CF",X"1B",X"F2",X"56",X"5A",X"72",X"C3",X"4B",X"BE",X"63",X"52",X"E1", + X"2F",X"77",X"91",X"93",X"52",X"C0",X"37",X"E1",X"53",X"5A",X"DA",X"35",X"77",X"85",X"D5",X"39", + X"6D",X"80",X"D3",X"50",X"58",X"D3",X"2D",X"9A",X"B2",X"23",X"BC",X"8C",X"52",X"71",X"C1",X"8D", + X"3E",X"76",X"B3",X"6F",X"6D",X"A1",X"49",X"C9",X"2E",X"D1",X"38",X"C6",X"55",X"8B",X"7C",X"86", + X"B2",X"33",X"7E",X"AD",X"99",X"3C",X"80",X"A3",X"6E",X"88",X"98",X"50",X"AA",X"79",X"99",X"27", + X"FB",X"1D",X"AE",X"63",X"8F",X"94",X"51",X"B0",X"4A",X"AD",X"86",X"8B",X"39",X"EA",X"1B",X"AB", + X"9A",X"4C",X"73",X"B8",X"9A",X"3A",X"76",X"AC",X"64",X"88",X"8B",X"6D",X"A6",X"71",X"97",X"40", + X"8C",X"B5",X"4A",X"A0",X"68",X"86",X"8C",X"98",X"69",X"59",X"DE",X"1F",X"AB",X"A0",X"36",X"A8", + X"A7",X"28",X"E0",X"58",X"59",X"CE",X"37",X"82",X"C8",X"2E",X"A4",X"5A",X"AF",X"62",X"8E",X"C2", + X"2D",X"79",X"91",X"C2",X"2A",X"96",X"77",X"8A",X"99",X"8E",X"3D",X"C7",X"61",X"57",X"9D",X"A3", + X"44",X"DE",X"34",X"88",X"B1",X"37",X"89",X"A3",X"B3",X"15",X"CB",X"73",X"43",X"BA",X"8D",X"47", + X"9D",X"6F",X"C9",X"15",X"D1",X"72",X"53",X"CA",X"48",X"6B",X"9B",X"89",X"6A",X"A0",X"57",X"BE", + X"45",X"9C",X"A5",X"5E",X"54",X"CA",X"63",X"52",X"E1",X"25",X"AE",X"93",X"35",X"E5",X"2A",X"A5", + X"97",X"40",X"8A",X"9A",X"73",X"81",X"8E",X"57",X"CC",X"68",X"67",X"5D",X"C5",X"94",X"43",X"6E", + X"AA",X"A8",X"30",X"9D",X"6E",X"B3",X"6B",X"4B",X"AB",X"79",X"90",X"93",X"50",X"89",X"81",X"8A", + X"A4",X"42",X"9B",X"7F",X"67",X"9F",X"A8",X"48",X"80",X"BA",X"23",X"C5",X"6A",X"5E",X"91",X"99", + X"62",X"9A",X"91",X"6A",X"5A",X"D9",X"3D",X"81",X"B2",X"34",X"C5",X"7A",X"3F",X"BB",X"90",X"3D", + X"D0",X"50",X"65",X"95",X"94",X"63",X"C6",X"2D",X"A6",X"91",X"3D",X"CA",X"5F",X"66",X"91",X"97", + X"A6",X"35",X"A6",X"97",X"2E",X"D9",X"41",X"8F",X"A4",X"3E",X"A2",X"B0",X"2E",X"B5",X"7A",X"55", + X"C9",X"3F",X"84",X"C3",X"42",X"8A",X"72",X"9F",X"65",X"95",X"72",X"84",X"8A",X"58",X"C6",X"73", + X"47",X"D9",X"35",X"90",X"9F",X"4D",X"80",X"A8",X"A1",X"30",X"8F",X"8B",X"C5",X"18",X"B5",X"70", + X"65",X"B0",X"5D",X"93",X"93",X"7B",X"48",X"CB",X"52",X"7D",X"B0",X"3D",X"98",X"BA",X"2E",X"AD", + X"86",X"4A",X"BD",X"6E",X"4C",X"DA",X"53",X"78",X"77",X"96",X"75",X"83",X"82",X"82",X"A5",X"3D", + X"86",X"A2",X"A7",X"31",X"8B",X"8E",X"C3",X"20",X"AA",X"92",X"3A",X"C0",X"87",X"51",X"77",X"AD", + X"62",X"B9",X"4F",X"7F",X"BC",X"1E",X"BF",X"7E",X"51",X"C3",X"50",X"72",X"C0",X"49",X"8A",X"81", + X"72",X"AA",X"7B",X"55",X"8C",X"83",X"CA",X"2B",X"97",X"9C",X"4B",X"86",X"9F",X"B0",X"14",X"EA", + X"3C",X"8A",X"9B",X"51",X"C2",X"25",X"C7",X"70",X"5F",X"AF",X"52",X"C6",X"29",X"B8",X"7F",X"5F", + X"A3",X"5C",X"CB",X"26",X"AE",X"8B",X"3C",X"D6",X"48",X"8A",X"74",X"A2",X"8D",X"3F",X"D3",X"2A", + X"B9",X"7B",X"4D",X"A6",X"69",X"B6",X"6E",X"56",X"8A",X"A1",X"64",X"C3",X"28",X"B2",X"7D",X"60", + X"A6",X"58",X"D4",X"11",X"D1",X"5C",X"7A",X"A8",X"42",X"96",X"C7",X"27",X"A9",X"90",X"44",X"89", + X"9F",X"69",X"90",X"A7",X"25",X"DB",X"46",X"7C",X"B7",X"42",X"9A",X"6E",X"99",X"8C",X"81",X"41", + X"C7",X"7A",X"58",X"8D",X"83",X"B2",X"29",X"C1",X"6E",X"52",X"DA",X"44",X"83",X"B6",X"2A",X"C4", + X"41",X"A6",X"7A",X"76",X"98",X"5B",X"B6",X"86",X"42",X"A2",X"8A",X"4B",X"95",X"97",X"65",X"B7", + X"56",X"6C",X"D2",X"1E",X"B6",X"94",X"36",X"DD",X"38",X"96",X"7B",X"70",X"9E",X"95",X"59",X"77", + X"82",X"8D",X"7C",X"78",X"DC",X"01",X"CD",X"70",X"5D",X"76",X"B4",X"91",X"35",X"BD",X"48",X"D3", + X"36",X"8E",X"B7",X"2C",X"BE",X"49",X"CA",X"4C",X"72",X"CB",X"29",X"B9",X"82",X"3B",X"CC",X"71", + X"4B",X"D1",X"4F",X"6A",X"8D",X"C9",X"46",X"6A",X"CA",X"28",X"99",X"A9",X"61",X"59",X"AA",X"78", + X"8F",X"98",X"35",X"CE",X"64",X"58",X"95",X"A7",X"49",X"AC",X"57",X"9B",X"7C",X"70",X"DE",X"14", + X"A9",X"A3",X"3F",X"7B",X"C9",X"57",X"5F",X"D6",X"17",X"C5",X"7D",X"58",X"9E",X"71",X"B8",X"3D", + X"72",X"A7",X"6C",X"A7",X"80",X"3A",X"E5",X"22",X"A5",X"61",X"B6",X"86",X"38",X"D9",X"56",X"57", + X"9A",X"8E",X"64",X"97",X"96",X"7D",X"45",X"CC",X"5D",X"5A",X"A8",X"AA",X"3C",X"7E",X"97",X"C1", + X"22",X"9B",X"A7",X"45",X"7F",X"A1",X"B4",X"1D",X"BB",X"51",X"B9",X"7A",X"45",X"91",X"A5",X"67", + X"B8",X"34",X"9E",X"A8",X"35",X"88",X"B0",X"54",X"A8",X"8C",X"31",X"E7",X"41",X"6A",X"C7",X"41", + X"85",X"BA",X"2D",X"B1",X"A0",X"35",X"90",X"9F",X"75",X"A0",X"5D",X"52",X"CA",X"59",X"84",X"9A", + X"52",X"B2",X"66",X"AF",X"43",X"6E",X"BC",X"59",X"89",X"95",X"8B",X"74",X"44",X"AE",X"85",X"96", + X"7B",X"4A",X"8B",X"BD",X"7E",X"2F",X"D2",X"68",X"4D",X"D9",X"41",X"6F",X"CA",X"4D",X"62",X"A0", + X"B7",X"3C",X"76",X"D1",X"2E",X"98",X"B1",X"2A",X"BB",X"8D",X"2F",X"E2",X"4A",X"6C",X"C4",X"49", + X"64",X"A5",X"88",X"80",X"9E",X"2A",X"DD",X"59",X"54",X"CE",X"60",X"54",X"9E",X"9D",X"42",X"BF", + X"92",X"34",X"98",X"B7",X"40",X"77",X"9F",X"BC",X"28",X"93",X"B8",X"44",X"67",X"A7",X"AC",X"41", + X"6F",X"9F",X"91",X"50",X"C4",X"37",X"B1",X"7A",X"5B",X"DD",X"4C",X"58",X"C6",X"5D",X"51",X"BA", + X"82",X"47",X"D6",X"6B",X"45",X"AC",X"60",X"C5",X"3D",X"7D",X"CA",X"33",X"8D",X"AE",X"42",X"88", + X"CB",X"4F",X"5D",X"84",X"C3",X"31",X"B4",X"6B",X"6C",X"AD",X"73",X"AB",X"23",X"D5",X"6B",X"43", + X"D1",X"6A",X"47",X"CB",X"4B",X"77",X"C4",X"2B",X"BC",X"94",X"35",X"C6",X"77",X"3E",X"9E",X"94", + X"77",X"A5",X"43",X"7C",X"99",X"BD",X"3A",X"79",X"C8",X"2B",X"B8",X"83",X"37",X"D2",X"77",X"4F", + X"78",X"BD",X"43",X"AC",X"80",X"66",X"C8",X"28",X"89",X"A3",X"AF",X"2A",X"92",X"B9",X"3D",X"80", + X"CC",X"27",X"9A",X"B0",X"48",X"66",X"AD",X"8D",X"44",X"D0",X"6A",X"44",X"AA",X"87",X"6B",X"C7", + X"25",X"A3",X"AB",X"41",X"70",X"AD",X"71",X"9C",X"74",X"45",X"C9",X"91",X"51",X"5D",X"D9",X"4E", + X"62",X"C7",X"61",X"4C",X"A4",X"97",X"78",X"95",X"3D",X"9E",X"A8",X"30",X"D4",X"4B",X"81",X"B2", + X"33",X"C5",X"65",X"A4",X"63",X"4E",X"A8",X"98",X"5F",X"C0",X"30",X"96",X"B5",X"3D",X"75",X"B2", + X"92",X"31",X"B1",X"A5",X"33",X"A4",X"AD",X"43",X"68",X"B4",X"7A",X"51",X"DB",X"45",X"74",X"C9", + X"2D",X"95",X"AD",X"3B",X"8E",X"A9",X"3D",X"C0",X"70",X"62",X"D5",X"27",X"A7",X"9E",X"3F",X"7C", + X"BC",X"50",X"A4",X"8E",X"34",X"A3",X"A1",X"4E",X"99",X"BC",X"35",X"7B",X"BD",X"67",X"45",X"AA", + X"94",X"62",X"C1",X"3E",X"74",X"CB",X"41",X"74",X"A3",X"50",X"B6",X"9F",X"47",X"68",X"A6",X"AF", + X"4A",X"62",X"94",X"AC",X"3F",X"AD",X"A9",X"3F",X"72",X"8A",X"C7",X"54",X"5E",X"7A",X"C0",X"80", + X"4D",X"6B",X"B7",X"71",X"86",X"9F",X"2C",X"DC",X"60",X"59",X"79",X"BB",X"7C",X"40",X"A8",X"AC", + X"63",X"48",X"D4",X"67",X"56",X"79",X"B8",X"8D",X"38",X"BE",X"7E",X"3C",X"B0",X"97",X"54",X"C2", + X"37",X"98",X"B4",X"32",X"90",X"B9",X"4F",X"5E",X"B2",X"A0",X"34",X"9F",X"A3",X"35",X"AD",X"9B", + X"38",X"BB",X"97",X"4E",X"64",X"A4",X"94",X"53",X"D0",X"45",X"6A",X"C2",X"6E",X"42",X"CC",X"77", + X"52",X"73",X"BB",X"61",X"89",X"B2",X"2D",X"9C",X"B4",X"43",X"77",X"C5",X"57",X"59",X"93",X"A6", + X"5B",X"B6",X"50",X"63",X"BE",X"8D",X"4D",X"6A",X"A2",X"AA",X"6F",X"3F",X"C2",X"86",X"4B",X"75", + X"BD",X"76",X"4B",X"D2",X"5A",X"5A",X"8A",X"BF",X"5B",X"56",X"B3",X"9F",X"4E",X"66",X"C4",X"5D", + X"51",X"C0",X"68",X"70",X"C1",X"3E",X"75",X"BB",X"50",X"A6",X"88",X"3A",X"AB",X"A4",X"79",X"3A", + X"BC",X"8E",X"4A",X"74",X"B7",X"82",X"42",X"D2",X"5F",X"5A",X"7F",X"B4",X"8D",X"41",X"86",X"C0", + X"55",X"5F",X"C0",X"44",X"96",X"B6",X"5A",X"5A",X"84",X"BD",X"78",X"52",X"6C",X"BA",X"82",X"41", + X"BD",X"83",X"3E",X"A9",X"91",X"56",X"CA",X"38",X"95",X"AA",X"39",X"8B",X"AE",X"4D",X"8C",X"AC", + X"35",X"BC",X"79",X"52",X"C1",X"5A",X"80",X"C2",X"41",X"73",X"A8",X"4C",X"B1",X"9C",X"63",X"4F", + X"BB",X"8B",X"4B",X"70",X"B2",X"7F",X"46",X"D3",X"48",X"A3",X"94",X"3D",X"94",X"B6",X"52",X"61", + X"BD",X"49",X"91",X"B9",X"58",X"61",X"77",X"BD",X"4D",X"A9",X"84",X"43",X"CF",X"6A",X"58",X"74", + X"C2",X"57",X"93",X"61",X"84",X"BB",X"2E",X"B6",X"86",X"4B",X"C7",X"71",X"54",X"76",X"AF",X"73", + X"5D",X"D2",X"40",X"85",X"B7",X"59",X"5A",X"94",X"AF",X"40",X"9D",X"A1",X"32",X"BD",X"71",X"72", + X"BC",X"51",X"60",X"97",X"AC",X"7F",X"47",X"8D",X"B7",X"57",X"5B",X"C1",X"7B",X"52",X"73",X"AB", + X"8B",X"44",X"C1",X"82",X"42",X"BD",X"75",X"4B",X"B0",X"9D",X"6A",X"50",X"8A",X"AD",X"8E",X"53", + X"65",X"9C",X"AE",X"65",X"51",X"AF",X"99",X"43",X"80",X"B4",X"7E",X"3D",X"B9",X"6B",X"66",X"C2", + X"45",X"B4",X"81",X"50",X"72",X"BC",X"6E",X"4E",X"BA",X"7A",X"4A",X"C1",X"6F",X"5A",X"BB",X"89", + X"5C",X"5E",X"9B",X"AF",X"5E",X"5C",X"CA",X"43",X"87",X"B0",X"41",X"85",X"BA",X"4D",X"77",X"BA", + X"76",X"4A",X"A7",X"9D",X"54",X"61",X"AA",X"9C",X"47",X"7B",X"B2",X"8B",X"51",X"6C",X"9A",X"A4", + X"42",X"A4",X"A6",X"3A",X"A5",X"97",X"3F",X"9E",X"A7",X"78",X"4E",X"7F",X"B1",X"8A",X"58",X"64", + X"B8",X"88",X"48",X"87",X"B5",X"6E",X"49",X"BE",X"59",X"93",X"A5",X"46",X"74",X"9E",X"A3",X"35", + X"C2",X"72",X"55",X"C2",X"5B",X"60",X"B9",X"79",X"48",X"C8",X"57",X"84",X"B1",X"4B",X"6C",X"97", + X"AC",X"3F",X"8C",X"AF",X"47",X"AF",X"89",X"4A",X"7D",X"A4",X"9E",X"4F",X"6A",X"B1",X"8E",X"45", + X"88",X"B2",X"70",X"4B",X"A7",X"9C",X"41",X"AD",X"96",X"49",X"7B",X"B6",X"77",X"4B",X"B4",X"8D", + X"56",X"67",X"A2",X"A0",X"3E",X"B2",X"84",X"45",X"AC",X"9A",X"78",X"44",X"B1",X"80",X"52",X"C9", + X"4B",X"7E",X"B7",X"3C",X"A1",X"99",X"40",X"9F",X"A3",X"7C",X"4C",X"8A",X"B0",X"76",X"4C",X"9D", + X"A6",X"3F",X"9C",X"A5",X"5E",X"5C",X"B7",X"85",X"4E",X"7E",X"B4",X"6A",X"56",X"CD",X"4B",X"99", + X"6F",X"69",X"C4",X"45",X"89",X"B2",X"60",X"60",X"7F",X"BB",X"57",X"6E",X"B4",X"84",X"66",X"59", + X"BD",X"4A",X"9F",X"A0",X"5B",X"5F",X"A1",X"A4",X"65",X"57",X"94",X"A3",X"8E",X"46",X"8A",X"9B", + X"58",X"B7",X"78",X"4C",X"9B",X"A1",X"40",X"AF",X"87",X"42",X"B4",X"80",X"5E",X"BB",X"4B",X"7D", + X"BB",X"42",X"95",X"A1",X"42",X"AA",X"98",X"59",X"64",X"A4",X"A0",X"5F",X"5D",X"9C",X"A7",X"66", + X"57",X"A0",X"A4",X"5E",X"61",X"8A",X"B4",X"4D",X"92",X"A5",X"55",X"68",X"8F",X"B1",X"55",X"6C", + X"BE",X"51",X"88",X"A6",X"36",X"C2",X"6C",X"60",X"B2",X"84",X"4D",X"84",X"A8",X"4A",X"A5",X"9E", + X"60",X"5D",X"AD",X"92",X"76",X"4E",X"94",X"A8",X"72",X"4C",X"B0",X"7A",X"57",X"B8",X"85",X"72", + X"51",X"C2",X"59",X"6C",X"B1",X"86",X"69",X"5A",X"92",X"A9",X"7B",X"50",X"8B",X"B3",X"41",X"AD", + X"6F",X"61",X"B7",X"82",X"6E",X"55",X"A0",X"9F",X"4B",X"87",X"B1",X"52",X"9B",X"96",X"59",X"68", + X"B7",X"55",X"85",X"B1",X"64",X"65",X"70",X"BB",X"6A",X"5F",X"B0",X"8A",X"76",X"55",X"82",X"AE", + X"82",X"5F",X"66",X"A1",X"9C",X"48",X"B7",X"67",X"60",X"B8",X"76",X"4D",X"B7",X"76",X"62",X"B1", + X"7C",X"55",X"84",X"AD",X"77",X"55",X"8B",X"AC",X"40",X"9A",X"A1",X"75",X"57",X"7D",X"A6",X"91", + X"75",X"5C",X"74",X"AE",X"7D",X"52",X"C1",X"58",X"74",X"B7",X"45",X"95",X"A1",X"70",X"57",X"89", + X"AA",X"81",X"5B",X"6D",X"9F",X"9E",X"6F",X"57",X"AB",X"8E",X"63",X"5E",X"B0",X"80",X"4E",X"B1", + X"88",X"4C",X"9E",X"9A",X"46",X"98",X"A4",X"6C",X"55",X"B0",X"84",X"56",X"B8",X"48",X"92",X"A3", + X"7D",X"69",X"5C",X"A6",X"98",X"51",X"83",X"B5",X"4C",X"8E",X"A3",X"69",X"5E",X"80",X"AF",X"6B", + X"5B",X"B3",X"7C",X"52",X"B1",X"88",X"81",X"50",X"88",X"A7",X"83",X"54",X"82",X"AB",X"46",X"9F", + X"9F",X"4B",X"94",X"9F",X"42",X"A8",X"92",X"84",X"59",X"77",X"B3",X"46",X"A5",X"8C",X"4A",X"AE", + X"8A",X"59",X"A9",X"82",X"67",X"60",X"99",X"9F",X"81",X"6A",X"5B",X"BF",X"4F",X"9C",X"82",X"54", + X"BA",X"75",X"55",X"A7",X"8A",X"4B",X"A4",X"96",X"82",X"61",X"67",X"9A",X"9E",X"4D",X"8A",X"A7", + X"7F",X"73",X"52",X"BB",X"60",X"73",X"AC",X"83",X"73",X"59",X"89",X"A4",X"88",X"50",X"95",X"A2", + X"67",X"63",X"7D",X"B0",X"72",X"59",X"A9",X"8F",X"50",X"87",X"AC",X"47",X"9C",X"97",X"7B",X"53", + X"92",X"A0",X"7B",X"5B",X"7F",X"B1",X"49",X"8D",X"A4",X"7B",X"66",X"62",X"B4",X"76",X"66",X"AA", + X"81",X"62",X"6D",X"AF",X"80",X"6D",X"5C",X"97",X"9C",X"86",X"69",X"60",X"AE",X"80",X"4E",X"B9", + X"66",X"6D",X"AA",X"83",X"64",X"69",X"AD",X"86",X"6B",X"60",X"8C",X"AA",X"65",X"66",X"AF",X"80", + X"51",X"9A",X"9B",X"7B",X"72",X"57",X"A5",X"92",X"87",X"67",X"66",X"86",X"B2",X"58",X"8E",X"8B", + X"5F",X"B0",X"71",X"6B",X"63",X"A7",X"8F",X"85",X"67",X"63",X"B2",X"61",X"6F",X"AE",X"81",X"7F", + X"4E",X"A4",X"8D",X"51",X"9F",X"99",X"73",X"62",X"75",X"B6",X"66",X"79",X"9F",X"50",X"B7",X"4C", + X"8E",X"9E",X"7D",X"5C",X"7F",X"AF",X"4B",X"8D",X"A1",X"7D",X"65",X"66",X"AE",X"7B",X"62",X"AD", + X"7B",X"6C",X"5F",X"A8",X"8D",X"84",X"66",X"65",X"A7",X"8D",X"75",X"58",X"9F",X"97",X"74",X"60", + X"79",X"A4",X"8E",X"6A",X"5F",X"A7",X"8D",X"53",X"A7",X"87",X"73",X"57",X"B1",X"74",X"68",X"AD", + X"48",X"A0",X"94",X"81",X"6D",X"5F",X"94",X"9C",X"85",X"6D",X"5F",X"97",X"9D",X"78",X"5B",X"87", + X"AA",X"5E",X"6C",X"A6",X"8A",X"7A",X"5D",X"7B",X"9E",X"96",X"59",X"7D",X"AB",X"4C",X"98",X"95", + X"4B",X"A5",X"8B",X"55",X"A5",X"8D",X"71",X"60",X"84",X"A4",X"84",X"7F",X"5A",X"82",X"AB",X"5B", + X"78",X"B2",X"5B",X"7F",X"A2",X"4D",X"94",X"A2",X"51",X"98",X"93",X"78",X"57",X"9B",X"95",X"7D", + X"57",X"90",X"9D",X"53",X"A2",X"8D",X"6C",X"65",X"81",X"AD",X"68",X"71",X"A9",X"53",X"A4",X"82", + X"7A",X"55",X"A4",X"88",X"53",X"A5",X"8D",X"7F",X"6A",X"63",X"A7",X"87",X"59",X"A5",X"8A",X"77", + X"61",X"7B",X"AD",X"73",X"6B",X"A1",X"7F",X"6F",X"60",X"B2",X"6C",X"66",X"AA",X"82",X"81",X"5E", + X"75",X"9D",X"92",X"7D",X"6C",X"63",X"B0",X"73",X"60",X"A8",X"86",X"80",X"62",X"71",X"99",X"9A", + X"50",X"97",X"92",X"51",X"9D",X"96",X"51",X"A5",X"79",X"5D",X"AA",X"85",X"80",X"64",X"6D",X"AB", + X"77",X"64",X"A9",X"82",X"77",X"5F",X"85",X"A1",X"85",X"7F",X"5B",X"88",X"A4",X"4E",X"95",X"98", + X"81",X"69",X"69",X"B1",X"55",X"90",X"99",X"4F",X"A7",X"7E",X"59",X"AA",X"7C",X"5B",X"9E",X"92", + X"7E",X"70",X"5F",X"A1",X"8F",X"85",X"5F",X"78",X"A6",X"7F",X"77",X"5A",X"A0",X"87",X"58",X"A0", + X"93",X"59",X"97",X"94",X"5B",X"76",X"9F",X"8E",X"63",X"72",X"AC",X"57",X"81",X"A6",X"66",X"68", + X"A7",X"83",X"5C",X"A7",X"80",X"7A",X"59",X"97",X"9A",X"5D",X"7A",X"AD",X"66",X"72",X"A1",X"80", + X"70",X"62",X"A7",X"85",X"7B",X"5F",X"7E",X"9D",X"8E",X"73",X"5F",X"93",X"9D",X"63",X"6D",X"AA", + X"7B",X"89",X"5B",X"7F",X"A0",X"84",X"64",X"78",X"A5",X"7A",X"75",X"5E",X"9C",X"93",X"7F",X"7C", + X"58",X"A0",X"8D",X"80",X"61",X"77",X"9D",X"91",X"65",X"71",X"A4",X"80",X"76",X"5E",X"A4",X"89", + X"7C",X"62",X"78",X"9D",X"8D",X"7D",X"6C",X"68",X"B0",X"69",X"78",X"A3",X"54",X"9F",X"8A",X"79", + X"63",X"7A",X"9E",X"8D",X"64",X"71",X"AD",X"6D",X"6D",X"9D",X"86",X"6F",X"68",X"82",X"A8",X"6A", + X"74",X"A2",X"7A",X"73",X"61",X"B1",X"66",X"73",X"A8",X"5C",X"7D",X"A7",X"6C",X"6C",X"AA",X"56", + X"97",X"89",X"55",X"A7",X"85",X"85",X"6E",X"66",X"A6",X"82",X"82",X"5F",X"81",X"A5",X"55",X"8A", + X"9C",X"7C",X"81",X"5B",X"8A",X"9F",X"5E",X"7E",X"A9",X"5D",X"79",X"9E",X"87",X"61",X"76",X"9E", + X"8C",X"65",X"72",X"A2",X"83",X"78",X"60",X"A2",X"86",X"7C",X"5E",X"9B",X"8C",X"56",X"AD",X"66", + X"71",X"A3",X"81",X"82",X"66",X"74",X"AE",X"5E",X"82",X"9B",X"58",X"8E",X"9E",X"63",X"72",X"A1", + X"84",X"72",X"62",X"9F",X"8B",X"81",X"73",X"65",X"89",X"9D",X"7F",X"84",X"5E",X"84",X"9E",X"7C", + X"7B",X"5E",X"8B",X"96",X"8C",X"56",X"96",X"90",X"80",X"66",X"74",X"9A",X"92",X"61",X"78",X"9E", + X"87",X"69",X"72",X"A2",X"7F",X"76",X"63",X"8B",X"9A",X"83",X"5B",X"8F",X"98",X"7B",X"7F",X"5B", + X"92",X"98",X"5A",X"9D",X"86",X"81",X"62",X"80",X"A0",X"7B",X"76",X"61",X"9A",X"91",X"80",X"7B", + X"5E",X"91",X"96",X"7F",X"6E",X"69",X"99",X"94",X"64",X"75",X"A6",X"74",X"64",X"8F",X"9D",X"65", + X"72",X"A1",X"83",X"74",X"62",X"9F",X"89",X"82",X"72",X"67",X"88",X"9D",X"7A",X"62",X"AC",X"5A", + X"8F",X"90",X"7F",X"6E",X"6B",X"8E",X"9D",X"61",X"86",X"9B",X"56",X"9D",X"88",X"7C",X"64",X"7B", + X"99",X"8E",X"5E",X"7F",X"9F",X"7F",X"83",X"63",X"7D",X"A5",X"6A",X"6C",X"99",X"8F",X"57",X"A1", + X"7C",X"68",X"9C",X"86",X"6B",X"72",X"A2",X"7B",X"81",X"5C",X"98",X"90",X"77",X"61",X"A5",X"71", + X"6B",X"A0",X"87",X"73",X"68",X"A2",X"80",X"80",X"63",X"7D",X"9E",X"81",X"60",X"A2",X"77",X"69", + X"A8",X"6B",X"6D",X"9D",X"83",X"7E",X"65",X"7C",X"9D",X"86",X"62",X"80",X"A1",X"6F",X"68",X"A0", + X"83",X"84",X"6C",X"6E",X"92",X"9A",X"5D",X"8C",X"8F",X"5F",X"A1",X"7F",X"7F",X"65",X"7B",X"98", + X"8C",X"61",X"7C",X"A1",X"78",X"66",X"A3",X"68",X"75",X"A3",X"7A",X"87",X"69",X"70",X"8E",X"97", + X"7C",X"62",X"93",X"90",X"79",X"6B",X"74",X"A0",X"83",X"63",X"87",X"9E",X"6D",X"70",X"A1",X"60", + X"8E",X"91",X"7A",X"73",X"68",X"97",X"8E",X"84",X"73",X"68",X"8D",X"9A",X"75",X"66",X"9E",X"7F", + X"60",X"9A",X"8E",X"61",X"8D",X"92",X"57",X"96",X"8E",X"81",X"79",X"65",X"9C",X"87",X"7A",X"67", + X"80",X"9E",X"7D",X"85",X"64",X"7B",X"9B",X"85",X"72",X"68",X"98",X"8F",X"74",X"66",X"9A",X"89", + X"5D",X"8D",X"96",X"7C",X"60",X"A1",X"7C",X"69",X"9D",X"81",X"78",X"65",X"A2",X"78",X"69",X"A8", + X"62",X"83",X"95",X"7E",X"76",X"67",X"8B",X"97",X"7B",X"61",X"A7",X"6B",X"76",X"9C",X"7F",X"77", + X"66",X"91",X"95",X"77",X"64",X"98",X"8E",X"64",X"7B",X"9D",X"7F",X"61",X"94",X"8F",X"7C",X"66", + X"82",X"9D",X"7A",X"87",X"66",X"7A",X"A0",X"6E",X"6D",X"A0",X"7F",X"84",X"71",X"6B",X"9E",X"83", + X"7E",X"62",X"90",X"92",X"7B",X"79",X"62",X"A4",X"79",X"70",X"99",X"84",X"62",X"8B",X"92",X"7F", + X"74",X"6B",X"8A",X"99",X"75",X"68",X"99",X"8C",X"68",X"77",X"9D",X"7D",X"83",X"6F",X"6D",X"91", + X"91",X"83",X"6F",X"6E",X"99",X"8C",X"69",X"76",X"9F",X"79",X"68",X"A1",X"70",X"6D",X"9B",X"86", + X"60",X"9C",X"7C",X"6A",X"9F",X"7B",X"84",X"65",X"81",X"A0",X"61",X"89",X"91",X"7D",X"7B",X"65", + X"8D",X"95",X"7E",X"83",X"70",X"6D",X"A3",X"73",X"70",X"A1",X"67",X"7F",X"9C",X"5A",X"98",X"7F", + X"6B",X"A0",X"78",X"87",X"60",X"8A",X"95",X"7C",X"81",X"61",X"94",X"8E",X"7F",X"7A",X"67",X"88", + X"93",X"88",X"6F",X"71",X"A0",X"67",X"78",X"98",X"88",X"6D",X"72",X"9E",X"7E",X"83",X"78",X"67", + X"8D",X"92",X"82",X"63",X"8F",X"8F",X"7D",X"7A",X"66",X"8F",X"93",X"7B",X"66",X"A3",X"6B",X"7B", + X"97",X"7E",X"74",X"6B",X"9B",X"86",X"7F",X"80",X"66",X"82",X"95",X"87",X"62",X"88",X"95",X"7D", + X"82",X"6B",X"77",X"99",X"86",X"66",X"91",X"8C",X"74",X"6C",X"98",X"85",X"7B",X"66",X"97",X"87", + X"80",X"74",X"6D",X"8C",X"96",X"73",X"70",X"A1",X"64",X"7A",X"93",X"8D",X"64",X"80",X"96",X"82", + X"6F",X"71",X"99",X"87",X"65",X"82",X"98",X"7F",X"82",X"71",X"6F",X"92",X"8D",X"83",X"6E",X"73", + X"95",X"8C",X"6E",X"74",X"9A",X"7E",X"82",X"69",X"7E",X"9F",X"62",X"88",X"91",X"64",X"8F",X"8F", + X"65",X"7E",X"96",X"83",X"63",X"8D",X"90",X"7F",X"7D",X"67",X"98",X"85",X"7E",X"66",X"92",X"8B", + X"7C",X"6C",X"7C",X"9B",X"7C",X"69",X"94",X"86",X"7F",X"72",X"6F",X"8F",X"91",X"78",X"68",X"97", + X"89",X"7B",X"67",X"97",X"86",X"80",X"74",X"6C",X"94",X"8C",X"7E",X"82",X"6B",X"7C",X"9F",X"67", + X"82",X"96",X"6A",X"77",X"9A",X"7E",X"83",X"78",X"69",X"98",X"86",X"81",X"74",X"6D",X"8C",X"91", + X"81",X"7A",X"69",X"99",X"80",X"65",X"90",X"8F",X"7D",X"66",X"96",X"87",X"7F",X"67",X"8D",X"8F", + X"61",X"98",X"7F",X"67",X"8E",X"90",X"7D",X"82",X"69",X"7D",X"96",X"86",X"6A",X"7D",X"9D",X"6F", + X"76",X"99",X"6E",X"71",X"99",X"83",X"83",X"71",X"71",X"8F",X"91",X"71",X"72",X"9A",X"7D",X"84", + X"6A",X"7A",X"8C",X"94",X"6B",X"7D",X"94",X"7F",X"6D",X"79",X"97",X"84",X"67",X"85",X"93",X"81", + X"73",X"74",X"9B",X"7A",X"84",X"68",X"80",X"97",X"7E",X"83",X"69",X"82",X"99",X"69",X"82",X"97", + X"65",X"87",X"91",X"63",X"93",X"86",X"7F",X"76",X"6C",X"94",X"89",X"82",X"6D",X"78",X"96",X"86", + X"69",X"80",X"97",X"79",X"6D",X"97",X"7D",X"6A",X"9A",X"76",X"6D",X"98",X"83",X"81",X"7D",X"6C", + X"80",X"93",X"87",X"65",X"96",X"83",X"81",X"78",X"6B",X"99",X"82",X"82",X"73",X"70",X"91",X"8D", + X"7C",X"84",X"69",X"80",X"97",X"7B",X"85",X"6C",X"79",X"92",X"8B",X"73",X"71",X"9B",X"75",X"6E", + X"91",X"8E",X"70",X"73",X"97",X"84",X"6B",X"80",X"98",X"77",X"70",X"95",X"7F",X"67",X"93",X"89", + X"7F",X"7E",X"6B",X"83",X"95",X"7F",X"82",X"78",X"6C",X"98",X"83",X"81",X"79",X"6B",X"96",X"84", + X"67",X"95",X"84",X"68",X"8E",X"8F",X"71",X"72",X"8F",X"8F",X"6B",X"80",X"93",X"7A",X"6B",X"91", + X"87",X"65",X"90",X"8D",X"74",X"6E",X"93",X"89",X"7D",X"82",X"6B",X"7E",X"93",X"87",X"6B",X"7F", + X"97",X"7A",X"86",X"6B",X"7E",X"95",X"7D",X"83",X"71",X"74",X"93",X"88",X"7F",X"7E",X"69",X"96", + X"83",X"81",X"79",X"6C",X"8B",X"90",X"7D",X"83",X"77",X"6E",X"8A",X"92",X"77",X"71",X"98",X"78", + X"6F",X"9B",X"6E",X"7D",X"94",X"7A",X"83",X"65",X"93",X"88",X"81",X"78",X"6F",X"86",X"96",X"71", + X"79",X"94",X"7D",X"80",X"6C",X"7E",X"91",X"87",X"7E",X"80",X"6B",X"80",X"8F",X"8B",X"6B",X"7D", + X"95",X"7D",X"83",X"72",X"73",X"92",X"88",X"80",X"6E",X"7C",X"95",X"80",X"6D",X"7F",X"95",X"7D", + X"83",X"77",X"6E",X"92",X"88",X"7F",X"6F",X"7A",X"96",X"7F",X"6E",X"80",X"99",X"6B",X"7F",X"90", + X"80",X"75",X"72",X"94",X"87",X"75",X"72",X"99",X"78",X"6F",X"8C",X"8F",X"6C",X"7C",X"92",X"80", + X"78",X"6E",X"90",X"8C",X"72",X"73",X"96",X"81",X"81",X"6D",X"7F",X"95",X"7D",X"83",X"7B",X"6E", + X"83",X"93",X"7E",X"83",X"6A",X"88",X"90",X"66",X"8C",X"8D",X"69",X"86",X"92",X"7B",X"85",X"70", + X"76",X"8D",X"8E",X"70",X"78",X"96",X"7C",X"85",X"6F",X"79",X"98",X"74",X"71",X"90",X"89",X"7C", + X"83",X"6B",X"83",X"91",X"80",X"80",X"70",X"79",X"90",X"88",X"7E",X"81",X"6E",X"7D",X"98",X"71", + X"7B",X"93",X"7A",X"85",X"6B",X"80",X"92",X"81",X"80",X"71",X"79",X"99",X"74",X"78",X"93",X"7C", + X"83",X"70",X"78",X"8D",X"8B",X"7E",X"80",X"6C",X"82",X"90",X"84",X"6A",X"8B",X"8C",X"7D",X"81", + X"6B",X"8B",X"8F",X"6D",X"82",X"92",X"6C",X"7F",X"94",X"72",X"74",X"91",X"86",X"6D",X"82",X"93", + X"69",X"82",X"91",X"80",X"6E",X"81",X"94",X"77",X"73",X"93",X"7C",X"6F",X"97",X"78",X"71",X"8B", + X"8F",X"6C",X"82",X"8E",X"7D",X"81",X"6F",X"7C",X"8F",X"87",X"7E",X"80",X"6E",X"7E",X"8E",X"8A", + X"70",X"78",X"95",X"7D",X"84",X"78",X"71",X"87",X"91",X"79",X"70",X"91",X"85",X"7C",X"6F",X"8B", + X"8C",X"67",X"90",X"82",X"6F",X"91",X"84",X"76",X"72",X"8D",X"8D",X"70",X"7D",X"93",X"6F",X"7D", + X"95",X"68",X"88",X"8B",X"80",X"78",X"73",X"96",X"7D",X"84",X"73",X"75",X"93",X"83",X"81",X"77", + X"72",X"8E",X"8A",X"7E",X"80",X"6D",X"8C",X"8C",X"6A",X"83",X"8F",X"81",X"6D",X"85",X"8F",X"7E", + X"6D",X"88",X"8D",X"7F",X"6F",X"82",X"91",X"7D",X"6F",X"85",X"8F",X"7D",X"7D",X"6D",X"90",X"88", + X"7C",X"6E",X"94",X"80",X"70",X"8E",X"87",X"76",X"74",X"92",X"81",X"7D",X"6D",X"8F",X"87",X"7F", + X"71",X"7C",X"92",X"81",X"73",X"7A",X"95",X"7C",X"84",X"7B",X"6F",X"8D",X"8A",X"7B",X"71",X"82", + X"92",X"79",X"73",X"91",X"7E",X"6D",X"8D",X"89",X"7D",X"83",X"6D",X"84",X"8F",X"7D",X"83",X"70", + X"7B",X"8B",X"8B",X"7B",X"85",X"71",X"7A",X"93",X"7E",X"82",X"75",X"75",X"89",X"8D",X"7D",X"6D", + X"90",X"85",X"81",X"79",X"71",X"8D",X"8A",X"79",X"72",X"91",X"83",X"7D",X"6F",X"86",X"8E",X"7D", + X"70",X"85",X"90",X"7A",X"86",X"74",X"76",X"91",X"82",X"81",X"79",X"72",X"87",X"8D",X"80",X"6D", + X"86",X"8E",X"7E",X"82",X"76",X"74",X"89",X"8B",X"82",X"72",X"7F",X"94",X"6F",X"80",X"8D",X"7E", + X"73",X"7B",X"92",X"7F",X"71",X"8A",X"89",X"6A",X"89",X"8B",X"81",X"71",X"7F",X"91",X"7C",X"84", + X"79",X"72",X"8D",X"89",X"6C",X"8C",X"86",X"7F",X"7C",X"71",X"83",X"8D",X"83",X"7E",X"81",X"6E", + X"83",X"8D",X"85",X"71",X"7C",X"91",X"7E",X"82",X"7D",X"70",X"88",X"8D",X"7D",X"83",X"6E",X"84", + X"8F",X"7C",X"83",X"70",X"7E",X"90",X"7F",X"82",X"76",X"76",X"93",X"7E",X"83",X"7A",X"72",X"8D", + X"89",X"76",X"75",X"92",X"7F",X"83",X"76",X"76",X"92",X"7F",X"6F",X"8A",X"8A",X"7D",X"72",X"83", + X"90",X"79",X"75",X"8A",X"87",X"6B",X"89",X"89",X"7F",X"7F",X"71",X"81",X"93",X"70",X"7E",X"8E", + X"80",X"79",X"73",X"8E",X"88",X"79",X"72",X"8E",X"86",X"7B",X"72",X"8E",X"85",X"6E",X"8E",X"84", + X"6F",X"85",X"8E",X"78",X"74",X"91",X"7C",X"71",X"94",X"7A",X"73",X"8A",X"8C",X"76",X"76",X"8F", + X"84",X"7D",X"83",X"6E",X"86",X"8B",X"81",X"71",X"83",X"8D",X"7E",X"78",X"75",X"92",X"81",X"81", + X"7D",X"72",X"82",X"8E",X"80",X"80",X"7E",X"70",X"85",X"8C",X"83",X"70",X"80",X"8E",X"7F",X"72", + X"81",X"90",X"7A",X"86",X"72",X"7D",X"90",X"77",X"74",X"8C",X"88",X"7D",X"83",X"75",X"78",X"8C", + X"88",X"7D",X"83",X"74",X"79",X"8F",X"83",X"6F",X"87",X"8C",X"79",X"73",X"8A",X"89",X"7D",X"83", + X"76",X"76",X"8C",X"87",X"7F",X"7D",X"70",X"8C",X"87",X"80",X"71",X"84",X"8D",X"7C",X"73",X"8C", + X"83",X"6E",X"89",X"8A",X"7C",X"73",X"90",X"7E",X"83",X"70",X"84",X"8C",X"7E",X"78",X"78",X"93", + X"7A",X"73",X"8A",X"89",X"7C",X"84",X"77",X"76",X"90",X"81",X"81",X"7A",X"73",X"8B",X"89",X"71", + X"7E",X"8F",X"7E",X"71",X"8B",X"86",X"7F",X"7E",X"70",X"8D",X"87",X"72",X"7D",X"8E",X"82",X"73", + X"7E",X"8F",X"7F",X"82",X"7D",X"72",X"88",X"8C",X"6F",X"86",X"89",X"7D",X"81",X"70",X"83",X"8C", + X"82",X"70",X"83",X"8C",X"81",X"72",X"80",X"8E",X"7D",X"83",X"7A",X"74",X"86",X"8C",X"7C",X"72", + X"87",X"8B",X"7D",X"83",X"78",X"76",X"8F",X"82",X"71",X"8D",X"82",X"80",X"7E",X"72",X"83",X"8D", + X"7E",X"83",X"74",X"7E",X"8F",X"7B",X"85",X"74",X"7B",X"8F",X"7F",X"81",X"7B",X"73",X"87",X"8A", + X"80",X"72",X"8B",X"84",X"7E",X"80",X"70",X"8B",X"87",X"7E",X"82",X"73",X"7D",X"8C",X"86",X"77", + X"79",X"91",X"79",X"77",X"90",X"7A",X"77",X"90",X"79",X"75",X"8B",X"87",X"77",X"79",X"91",X"74", + X"7D",X"8C",X"7F",X"72",X"85",X"8B",X"7D",X"72",X"87",X"89",X"7F",X"7B",X"74",X"8D",X"86",X"76", + X"7A",X"91",X"74",X"7A",X"8B",X"86",X"78",X"77",X"8E",X"82",X"7F",X"81",X"73",X"7E",X"8C",X"84", + X"76",X"7B",X"91",X"77",X"77",X"8A",X"87",X"76",X"79",X"8B",X"86",X"75",X"7B",X"8B",X"85",X"72", + X"83",X"89",X"7E",X"7E",X"73",X"8F",X"80",X"73",X"83",X"8D",X"7D",X"84",X"73",X"7E",X"8B",X"84", + X"74",X"7D",X"8C",X"82",X"74",X"7F",X"8D",X"80",X"7B",X"74",X"8D",X"84",X"79",X"76",X"8F",X"80", + X"82",X"72",X"85",X"8A",X"7C",X"82",X"71",X"85",X"8A",X"7F",X"81",X"76",X"7B",X"8F",X"7F",X"83", + X"75",X"7B",X"89",X"89",X"73",X"81",X"8B",X"7C",X"84",X"74",X"7D",X"8C",X"81",X"71",X"89",X"87", + X"80",X"72",X"88",X"87",X"7F",X"75",X"82",X"8C",X"7B",X"84",X"73",X"7F",X"8E",X"7A",X"76",X"8D", + X"81",X"7E",X"74",X"8C",X"84",X"71",X"85",X"8A",X"7E",X"74",X"86",X"8A",X"7B",X"75",X"8A",X"85", + X"71",X"8B",X"83",X"73",X"89",X"85",X"7B",X"75",X"87",X"8A",X"79",X"76",X"8C",X"83",X"7F",X"80", + X"73",X"81",X"89",X"86",X"73",X"7D",X"8B",X"84",X"7A",X"76",X"8C",X"83",X"7F",X"75",X"81",X"8D", + X"7D",X"84",X"77",X"7A",X"8E",X"7B",X"75",X"8D",X"80",X"81",X"7B",X"75",X"8C",X"84",X"7F",X"73", + X"87",X"88",X"7D",X"82",X"75",X"7D",X"8D",X"7F",X"74",X"8D",X"7E",X"75",X"8D",X"7E",X"74",X"88", + X"88",X"7A",X"78",X"8D",X"7C",X"75",X"87",X"89",X"7A",X"76",X"88",X"89",X"77",X"7A",X"8E",X"7C", + X"74",X"8A",X"85",X"7E",X"82",X"76",X"7B",X"89",X"87",X"72",X"88",X"85",X"7E",X"81",X"74",X"7F", + X"88",X"87",X"75",X"7E",X"8E",X"77",X"79",X"8A",X"85",X"77",X"7A",X"8B",X"83",X"76",X"7F",X"8C", + X"73",X"7E",X"8B",X"82",X"75",X"7E",X"8C",X"7F",X"77",X"7C",X"8D",X"80",X"75",X"86",X"87",X"73", + X"7F",X"8B",X"80",X"7F",X"74",X"89",X"85",X"72",X"89",X"85",X"73",X"88",X"85",X"7D",X"82",X"71", + X"8A",X"84",X"83",X"74",X"82",X"89",X"81",X"78",X"7D",X"8C",X"7F",X"7C",X"76",X"8A",X"86",X"7B", + X"77",X"8C",X"81",X"80",X"7E",X"74",X"86",X"88",X"82",X"7A",X"78",X"8B",X"83",X"7E",X"82",X"77", + X"7B",X"88",X"87",X"7A",X"77",X"86",X"89",X"78",X"7A",X"8C",X"7F",X"81",X"79",X"78",X"87",X"87", + X"81",X"76",X"80",X"8D",X"74",X"81",X"89",X"7D",X"83",X"76",X"7D",X"8B",X"81",X"73",X"87",X"88", + X"7D",X"76",X"8D",X"7D",X"77",X"8A",X"82",X"7A",X"78",X"89",X"86",X"76",X"7C",X"8B",X"81",X"7D", + X"75",X"8B",X"82",X"74",X"8A",X"82",X"74",X"8B",X"81",X"80",X"7E",X"75",X"85",X"8A",X"77",X"7B", + X"8A",X"83",X"77",X"7C",X"8B",X"81",X"77",X"7D",X"8D",X"7D",X"83",X"7A",X"78",X"89",X"86",X"7D", + X"83",X"79",X"79",X"8A",X"84",X"75",X"80",X"8A",X"80",X"7B",X"78",X"8E",X"7C",X"78",X"8B",X"7F", + X"81",X"7C",X"76",X"86",X"87",X"80",X"74",X"85",X"88",X"7B",X"76",X"8C",X"81",X"82",X"78",X"7C", + X"8A",X"80",X"7B",X"78",X"8C",X"80",X"7E",X"75",X"87",X"87",X"7D",X"76",X"86",X"88",X"7B",X"77", + X"87",X"87",X"79",X"7A",X"8C",X"7B",X"78",X"8C",X"80",X"81",X"7D",X"76",X"85",X"88",X"80",X"7E", + X"76",X"86",X"88",X"7D",X"76",X"84",X"89",X"7B",X"79",X"89",X"81",X"80",X"7B",X"77",X"89",X"84", + X"80",X"7F",X"75",X"88",X"84",X"7F",X"77",X"7F",X"8B",X"80",X"78",X"7E",X"8C",X"7B",X"79",X"88", + X"83",X"77",X"7F",X"8C",X"76",X"7F",X"89",X"7F",X"78",X"7C",X"8B",X"81",X"76",X"83",X"8A",X"74", + X"83",X"88",X"75",X"82",X"89",X"74",X"81",X"89",X"7D",X"83",X"77",X"7C",X"8C",X"7E",X"76",X"88", + X"86",X"7E",X"83",X"7A",X"79",X"83",X"89",X"7F",X"76",X"88",X"85",X"74",X"84",X"89",X"75",X"82", + X"88",X"7D",X"83",X"75",X"80",X"88",X"82",X"7A",X"7B",X"8B",X"7E",X"82",X"7B",X"78",X"88",X"86", + X"76",X"83",X"88",X"74",X"83",X"88",X"7E",X"76",X"85",X"87",X"7E",X"82",X"7C",X"78",X"83",X"87", + X"83",X"76",X"80",X"89",X"80",X"77",X"81",X"8A",X"7E",X"81",X"7E",X"77",X"81",X"89",X"81",X"78", + X"7C",X"8B",X"80",X"82",X"74",X"86",X"85",X"80",X"77",X"82",X"88",X"7F",X"7A",X"7B",X"8C",X"7E", + X"82",X"7B",X"78",X"87",X"86",X"7E",X"82",X"76",X"81",X"8A",X"7A",X"79",X"87",X"86",X"7A",X"79", + X"89",X"83",X"7F",X"81",X"76",X"83",X"89",X"78",X"7C",X"89",X"82",X"78",X"7C",X"8B",X"7F",X"81", + X"7C",X"77",X"87",X"85",X"7E",X"81",X"77",X"7E",X"8A",X"80",X"81",X"7F",X"77",X"81",X"89",X"80", + X"80",X"7F",X"76",X"84",X"88",X"7E",X"82",X"79",X"7B",X"87",X"86",X"7C",X"79",X"88",X"83",X"76", + X"81",X"88",X"80",X"77",X"81",X"89",X"7D",X"78",X"86",X"84",X"76",X"81",X"88",X"80",X"77",X"85", + X"86",X"76",X"7E",X"89",X"81",X"78",X"7F",X"8A",X"7E",X"78",X"89",X"81",X"80",X"7E",X"77",X"82", + X"87",X"82",X"7F",X"81",X"78",X"7D",X"88",X"83",X"7F",X"77",X"86",X"85",X"7E",X"82",X"76",X"80", + X"88",X"82",X"7E",X"77",X"86",X"85",X"7F",X"77",X"86",X"85",X"7F",X"78",X"81",X"8A",X"75",X"83", + X"87",X"77",X"7F",X"8A",X"79",X"7B",X"88",X"84",X"76",X"84",X"85",X"7E",X"78",X"82",X"88",X"7F", + X"78",X"84",X"87",X"76",X"7F",X"88",X"82",X"7E",X"82",X"77",X"7F",X"89",X"7E",X"82",X"7B",X"7A", + X"87",X"85",X"76",X"81",X"88",X"80",X"77",X"81",X"88",X"7E",X"82",X"7E",X"78",X"82",X"87",X"81", + X"77",X"80",X"88",X"7F",X"78",X"81",X"89",X"7E",X"82",X"7E",X"78",X"82",X"88",X"81",X"78",X"7F", + X"89",X"7E",X"82",X"7E",X"78",X"83",X"88",X"7A",X"7B",X"88",X"81",X"7E",X"77",X"87",X"84",X"7F", + X"78",X"82",X"89",X"75",X"84",X"85",X"7F",X"81",X"78",X"7E",X"8A",X"7E",X"79",X"89",X"80",X"81", + X"7D",X"78",X"85",X"86",X"81",X"76",X"86",X"84",X"80",X"79",X"7E",X"88",X"81",X"79",X"7D",X"8A", + X"7E",X"82",X"7E",X"7A",X"7D",X"88",X"82",X"81",X"79",X"7F",X"8A",X"79",X"7B",X"88",X"82",X"7F", + X"7F",X"77",X"85",X"86",X"7F",X"78",X"82",X"88",X"7F",X"82",X"7B",X"7A",X"86",X"85",X"7F",X"81", + X"77",X"82",X"87",X"80",X"78",X"83",X"86",X"7D",X"83",X"77",X"81",X"88",X"7F",X"82",X"7B",X"7A", + X"88",X"83",X"77",X"83",X"87",X"78",X"7E",X"88",X"80",X"80",X"7F",X"79",X"7D",X"87",X"83",X"80", + X"77",X"83",X"85",X"7F",X"7A",X"7C",X"89",X"81",X"7A",X"7D",X"8A",X"7A",X"7B",X"86",X"84",X"7A", + X"7C",X"89",X"7F",X"82",X"7C",X"7A",X"88",X"81",X"77",X"85",X"86",X"77",X"84",X"85",X"77",X"81", + X"88",X"78",X"7D",X"87",X"82",X"78",X"81",X"87",X"7A",X"7C",X"89",X"7D",X"79",X"87",X"83",X"7A", + X"7C",X"88",X"82",X"7A",X"7D",X"88",X"80",X"78",X"86",X"83",X"76",X"84",X"86",X"7E",X"78",X"86", + X"83",X"7E",X"81",X"77",X"81",X"86",X"83",X"79",X"7E",X"88",X"7F",X"81",X"7D",X"79",X"86",X"84", + X"7E",X"82",X"77",X"81",X"86",X"82",X"78",X"82",X"86",X"80",X"7D",X"7A",X"89",X"80",X"7F",X"78", + X"88",X"81",X"78",X"87",X"81",X"7F",X"81",X"78",X"82",X"88",X"79",X"7F",X"88",X"7B",X"7B",X"85", + X"85",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"79",X"84",X"85",X"80",X"80",X"78",X"86",X"84",X"77", + X"81",X"87",X"7E",X"82",X"7A",X"7D",X"89",X"7E",X"82",X"7D",X"7A",X"82",X"87",X"7F",X"81",X"7F", + X"79",X"83",X"87",X"7A",X"7C",X"87",X"81",X"7E",X"79",X"85",X"85",X"7E",X"79",X"84",X"86",X"79", + X"7E",X"88",X"7B",X"7B",X"86",X"83",X"7F",X"82",X"79",X"7E",X"87",X"81",X"7D",X"79",X"86",X"84", + X"7F",X"79",X"84",X"85",X"77",X"85",X"84",X"7F",X"81",X"7A",X"7D",X"86",X"83",X"7E",X"82",X"7B", + X"7C",X"87",X"81",X"78",X"81",X"86",X"7F",X"79",X"82",X"86",X"7E",X"79",X"81",X"87",X"7E",X"79", + X"87",X"82",X"7F",X"80",X"78",X"84",X"85",X"7C",X"7B",X"87",X"81",X"80",X"78",X"86",X"83",X"80", + X"7B",X"7C",X"88",X"81",X"7C",X"7C",X"89",X"7B",X"7B",X"85",X"84",X"7B",X"7B",X"85",X"84",X"7C", + X"7A",X"86",X"84",X"7C",X"7B",X"87",X"82",X"7F",X"79",X"85",X"84",X"78",X"84",X"84",X"7A",X"7E", + X"87",X"81",X"7A",X"81",X"86",X"7A",X"7C",X"87",X"81",X"7F",X"81",X"7A",X"7F",X"88",X"7E",X"7A", + X"85",X"83",X"7A",X"7E",X"88",X"7B",X"7D",X"88",X"7D",X"7B",X"87",X"80",X"79",X"84",X"84",X"7E", + X"82",X"79",X"7F",X"87",X"80",X"80",X"79",X"83",X"86",X"7F",X"79",X"83",X"85",X"78",X"80",X"87", + X"7F",X"81",X"7A",X"7F",X"88",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"7A",X"84",X"85",X"7F",X"79", + X"81",X"87",X"7E",X"82",X"7B",X"7E",X"87",X"7E",X"79",X"84",X"85",X"7E",X"82",X"7C",X"7B",X"84", + X"86",X"78",X"83",X"84",X"80",X"7A",X"7E",X"86",X"82",X"7A",X"7E",X"87",X"81",X"7A",X"7F",X"87", + X"80",X"7E",X"79",X"86",X"83",X"7F",X"81",X"79",X"81",X"86",X"7E",X"82",X"7B",X"7D",X"87",X"80", + X"81",X"7F",X"7A",X"81",X"87",X"7C",X"7B",X"86",X"82",X"7C",X"7B",X"86",X"83",X"7D",X"7A",X"88", + X"7E",X"7B",X"85",X"82",X"7B",X"7D",X"87",X"80",X"7E",X"7A",X"85",X"84",X"7E",X"7A",X"85",X"84", + X"7E",X"7A",X"84",X"84",X"7E",X"82",X"79",X"80",X"86",X"7E",X"7A",X"85",X"83",X"7F",X"80",X"79", + X"85",X"84",X"79",X"82",X"86",X"79",X"81",X"86",X"7B",X"7D",X"87",X"7F",X"79",X"86",X"81",X"79", + X"85",X"83",X"79",X"82",X"85",X"78",X"82",X"85",X"7F",X"81",X"7B",X"7D",X"87",X"80",X"80",X"7F", + X"7A",X"83",X"86",X"7B",X"7D",X"86",X"81",X"7B",X"7D",X"86",X"82",X"7C",X"7D",X"88",X"7D",X"7B", + X"83",X"85",X"7E",X"7A",X"83",X"85",X"7C",X"7C",X"86",X"80",X"7F",X"7A",X"85",X"83",X"79",X"85", + X"83",X"7A",X"81",X"86",X"79",X"80",X"85",X"81",X"7E",X"7B",X"87",X"80",X"81",X"7E",X"7B",X"83", + X"86",X"79",X"81",X"84",X"80",X"7B",X"80",X"86",X"7F",X"7D",X"7D",X"88",X"7E",X"82",X"7C",X"7C", + X"85",X"83",X"79",X"81",X"86",X"7F",X"7A",X"82",X"86",X"79",X"80",X"85",X"81",X"7A",X"7F",X"86", + X"81",X"7B",X"7E",X"87",X"7F",X"80",X"80",X"7B",X"80",X"87",X"7E",X"7A",X"85",X"83",X"7F",X"7A", + X"84",X"84",X"7F",X"7C",X"7E",X"87",X"7E",X"82",X"7D",X"7B",X"85",X"81",X"7F",X"7A",X"85",X"82", + X"7F",X"7B",X"80",X"86",X"80",X"7B",X"80",X"86",X"7F",X"80",X"80",X"7A",X"81",X"85",X"7F",X"7A", + X"82",X"85",X"80",X"7B",X"81",X"86",X"7C",X"7C",X"86",X"81",X"81",X"7C",X"7E",X"86",X"7F",X"80", + X"79",X"84",X"84",X"7F",X"80",X"7F",X"7A",X"83",X"84",X"7F",X"81",X"7B",X"7E",X"83",X"85",X"7D", + X"7C",X"86",X"81",X"7A",X"81",X"85",X"7F",X"7B",X"84",X"82",X"7F",X"81",X"7A",X"80",X"85",X"81", + X"7F",X"81",X"7D",X"7C",X"84",X"84",X"7F",X"7A",X"82",X"85",X"7F",X"81",X"7F",X"7A",X"84",X"83", + X"7F",X"80",X"7A",X"81",X"85",X"80",X"80",X"7D",X"7C",X"86",X"81",X"80",X"80",X"7A",X"85",X"82", + X"7F",X"81",X"7B",X"7E",X"85",X"82",X"7F",X"81",X"7B",X"7F",X"84",X"83",X"7C",X"7D",X"85",X"82", + X"7C",X"7E",X"86",X"7D",X"7C",X"85",X"82",X"7F",X"81",X"7E",X"7B",X"84",X"83",X"81",X"7C",X"7D", + X"87",X"7C",X"7E",X"86",X"7F",X"7B",X"86",X"80",X"81",X"7C",X"7E",X"86",X"7F",X"7B",X"83",X"84", + X"7F",X"80",X"7A",X"81",X"85",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"7E",X"7C",X"87",X"7E",X"7C", + X"85",X"80",X"7B",X"84",X"82",X"79",X"82",X"84",X"81",X"7A",X"81",X"85",X"80",X"7F",X"7B",X"86", + X"81",X"7A",X"83",X"84",X"7F",X"81",X"7F",X"7B",X"82",X"85",X"7B",X"7D",X"85",X"81",X"7F",X"81", + X"7D",X"7C",X"85",X"82",X"80",X"7A",X"83",X"83",X"80",X"7D",X"7D",X"86",X"80",X"7F",X"7B",X"84", + X"83",X"7F",X"81",X"7E",X"7C",X"83",X"84",X"7B",X"81",X"85",X"7C",X"7E",X"86",X"7C",X"7D",X"84", + X"84",X"7C",X"7E",X"85",X"80",X"7C",X"7D",X"85",X"81",X"7F",X"81",X"7C",X"7F",X"86",X"7F",X"81", + X"7F",X"7B",X"84",X"83",X"7C",X"7F",X"86",X"7B",X"7E",X"84",X"82",X"7D",X"7D",X"85",X"80",X"7F", + X"7B",X"86",X"80",X"80",X"7F",X"7B",X"82",X"85",X"7B",X"80",X"84",X"80",X"7D",X"7D",X"85",X"82", + X"7D",X"7D",X"85",X"81",X"7D",X"7D",X"84",X"82",X"7D",X"7E",X"86",X"7D",X"7C",X"84",X"82",X"7B", + X"80",X"85",X"7F",X"80",X"80",X"7B",X"81",X"85",X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"7B", + X"81",X"84",X"7F",X"7B",X"83",X"83",X"7F",X"81",X"7B",X"80",X"83",X"83",X"7D",X"7C",X"85",X"81", + X"7F",X"81",X"7D",X"7D",X"83",X"83",X"80",X"7B",X"83",X"83",X"80",X"7B",X"81",X"84",X"80",X"7C", + X"80",X"85",X"7B",X"7E",X"84",X"82",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"80",X"7B",X"83",X"84", + X"7A",X"83",X"82",X"80",X"7C",X"81",X"85",X"7B",X"7F",X"84",X"80",X"7F",X"81",X"7C",X"7F",X"85", + X"7E",X"7C",X"83",X"84",X"7F",X"81",X"7B",X"80",X"84",X"7F",X"81",X"7D",X"7C",X"83",X"83",X"80", + X"7B",X"80",X"84",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F",X"7C",X"81",X"85",X"7B",X"7F",X"85", + X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"80",X"80",X"7B",X"82",X"83",X"7F",X"81",X"7D",X"7D", + X"85",X"80",X"80",X"80",X"7C",X"80",X"85",X"80",X"80",X"7F",X"7C",X"85",X"81",X"7B",X"82",X"83", + X"7A",X"82",X"83",X"7F",X"81",X"7B",X"80",X"85",X"7F",X"7C",X"84",X"82",X"7B",X"80",X"84",X"81", + X"7C",X"7F",X"85",X"7F",X"82",X"7D",X"7E",X"85",X"80",X"7B",X"82",X"83",X"7F",X"80",X"7B",X"85", + X"81",X"7B",X"81",X"84",X"80",X"7C",X"83",X"82",X"7B",X"80",X"84",X"80",X"81",X"7C",X"81",X"85", + X"7B",X"7F",X"85",X"7D",X"7D",X"84",X"81",X"80",X"81",X"7E",X"7C",X"83",X"83",X"7F",X"7C",X"81", + X"84",X"7F",X"81",X"7C",X"7F",X"85",X"7F",X"7C",X"82",X"83",X"7E",X"7C",X"82",X"84",X"7F",X"81", + X"7F",X"7C",X"81",X"84",X"80",X"80",X"81",X"7C",X"80",X"85",X"7F",X"7C",X"84",X"80",X"81",X"7C", + X"7F",X"84",X"81",X"7E",X"7D",X"84",X"82",X"7D",X"7D",X"84",X"81",X"7E",X"7C",X"84",X"81",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"7C",X"82",X"83",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F", + X"7C",X"80",X"83",X"82",X"7D",X"7E",X"84",X"81",X"7F",X"81",X"7C",X"80",X"84",X"81",X"7D",X"7E", + X"84",X"80",X"7F",X"7C",X"83",X"83",X"7E",X"7D",X"84",X"81",X"7B",X"82",X"83",X"7F",X"7C",X"81", + X"83",X"80",X"7C",X"81",X"84",X"7F",X"80",X"80",X"7C",X"81",X"84",X"7D",X"7D",X"83",X"82",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"80",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"84",X"81", + X"7F",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"85",X"80",X"80",X"7F",X"7C",X"83",X"82",X"7C", + X"81",X"84",X"7C",X"80",X"84",X"7D",X"7E",X"85",X"7F",X"7C",X"83",X"82",X"7F",X"81",X"7C",X"81", + X"84",X"80",X"80",X"80",X"7D",X"7F",X"83",X"82",X"7C",X"81",X"83",X"7F",X"81",X"7C",X"7F",X"83", + X"81",X"7F",X"81",X"7D",X"7E",X"85",X"80",X"80",X"7F",X"7C",X"82",X"83",X"7D",X"7E",X"83",X"82", + X"7E",X"7D",X"84",X"81",X"80",X"80",X"7C",X"81",X"84",X"80",X"81",X"7E",X"7D",X"84",X"82",X"7C", + X"82",X"83",X"7C",X"7F",X"84",X"80",X"80",X"81",X"7D",X"7E",X"83",X"82",X"80",X"80",X"7C",X"82", + X"83",X"7C",X"80",X"84",X"7D",X"7D",X"84",X"80",X"81",X"7C",X"82",X"83",X"7F",X"7E",X"7E",X"84", + X"80",X"80",X"80",X"7D",X"7E",X"85",X"80",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7F",X"7C",X"82", + X"83",X"7B",X"80",X"83",X"80",X"7D",X"7E",X"84",X"80",X"80",X"80",X"7D",X"7F",X"84",X"7F",X"7C", + X"84",X"81",X"80",X"7C",X"83",X"82",X"7C",X"82",X"82",X"7C",X"80",X"84",X"7D",X"7E",X"84",X"80", + X"80",X"80",X"7C",X"83",X"82",X"80",X"7E",X"7E",X"85",X"7E",X"7D",X"82",X"83",X"7E",X"7D",X"83", + X"80",X"7C",X"83",X"81",X"7C",X"83",X"81",X"80",X"80",X"7C",X"7F",X"82",X"82",X"7E",X"7D",X"83", + X"82",X"7E",X"7D",X"83",X"82",X"7E",X"7E",X"84",X"7F",X"7C",X"84",X"80",X"7C",X"83",X"81",X"7F", + X"80",X"7C",X"81",X"83",X"80",X"7F",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7B",X"82",X"82",X"7F", + X"80",X"7C",X"82",X"82",X"80",X"7D",X"82",X"83",X"7B",X"82",X"82",X"80",X"7D",X"80",X"83",X"80", + X"7D",X"80",X"84",X"7F",X"81",X"7F",X"7D",X"82",X"83",X"80",X"7C",X"81",X"83",X"7F",X"7D",X"81", + X"84",X"7D",X"7F",X"84",X"7F",X"7D",X"84",X"80",X"81",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7E", + X"82",X"83",X"7F",X"81",X"7D",X"7F",X"83",X"81",X"7D",X"7F",X"84",X"80",X"7C",X"83",X"81",X"7C", + X"82",X"82",X"7C",X"80",X"83",X"80",X"80",X"80",X"7D",X"7E",X"83",X"81",X"80",X"80",X"7F",X"7D", + X"82",X"83",X"80",X"80",X"80",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7D",X"82",X"82",X"80",X"7E", + X"7D",X"84",X"81",X"80",X"80",X"7D",X"80",X"84",X"7E",X"7E",X"83",X"81",X"7F",X"7D",X"82",X"82", + X"7E",X"7E",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"7D",X"82",X"83",X"7F",X"7D",X"83",X"81",X"7C", + X"82",X"81",X"7F",X"81",X"7D",X"80",X"83",X"7F",X"7D",X"83",X"81",X"7F",X"81",X"7C",X"81",X"83", + X"7F",X"80",X"7F",X"7D",X"82",X"82",X"80",X"7D",X"80",X"83",X"80",X"7D",X"82",X"82",X"7F",X"81", + X"7D",X"7F",X"82",X"82",X"7D",X"81",X"83",X"7F",X"81",X"7D",X"7E",X"84",X"7F",X"7D",X"83",X"80", + X"7D",X"83",X"81",X"80",X"7E",X"7E",X"84",X"7E",X"7E",X"82",X"81",X"7D",X"80",X"83",X"81",X"7E", + X"7E",X"83",X"81",X"7D",X"80",X"83",X"7E",X"7E",X"83",X"81",X"80",X"80",X"7C",X"82",X"82",X"7E", + X"7E",X"83",X"81",X"7E",X"7E",X"83",X"80",X"80",X"7F",X"7D",X"83",X"80",X"80",X"7D",X"83",X"81", + X"80",X"7D",X"80",X"83",X"7F",X"81",X"7E",X"7F",X"83",X"7F",X"7D",X"83",X"80",X"7C",X"83",X"81", + X"7D",X"82",X"82",X"7C",X"81",X"82",X"80",X"7E",X"7F",X"83",X"81",X"7E",X"7F",X"83",X"80",X"80", + X"81",X"7D",X"7F",X"83",X"81",X"7D",X"80",X"83",X"80",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"7F", + X"83",X"80",X"7D",X"83",X"80",X"7F",X"7D",X"83",X"81",X"80",X"80",X"7D",X"81",X"83",X"80",X"7D", + X"83",X"81",X"80",X"80",X"7D",X"80",X"82",X"81",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81", + X"80",X"81",X"7E",X"7E",X"82",X"82",X"7F",X"7D",X"82",X"82",X"7C",X"81",X"82",X"81",X"7D",X"81", + X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"81",X"7E",X"7E", + X"83",X"81",X"7F",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82",X"82",X"7E",X"7E",X"83", + X"80",X"80",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"7F",X"7E",X"83",X"80",X"7D",X"81",X"83", + X"7F",X"80",X"80",X"7D",X"80",X"83",X"7D",X"7F",X"83",X"80",X"81",X"7E",X"7E",X"83",X"80",X"80", + X"80",X"7D",X"80",X"82",X"82",X"7D",X"80",X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"80",X"80",X"7D",X"80",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"81",X"7F",X"7E",X"82",X"81", + X"7D",X"81",X"82",X"7F",X"81",X"7D",X"80",X"82",X"81",X"7E",X"7F",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"7D",X"81",X"82",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"7F",X"7D",X"81",X"83",X"7F", + X"7E",X"82",X"81",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"81",X"82",X"7F",X"80",X"7E",X"7E",X"82", + X"82",X"80",X"80",X"7D",X"81",X"83",X"7E",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82", + X"82",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"80",X"82",X"80",X"7E",X"80",X"83",X"80", + X"7F",X"7E",X"83",X"81",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"83",X"7F", + X"7E",X"83",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"80",X"7D",X"80",X"82", + X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"82",X"80",X"7F",X"7E",X"83",X"7F",X"7E", + X"83",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"81",X"81",X"80",X"7E",X"7F",X"83",X"80", + X"7F",X"7E",X"83",X"80",X"80",X"80",X"7F",X"7E",X"82",X"82",X"80",X"80",X"80",X"7D",X"81",X"82", + X"7D",X"80",X"83",X"7F",X"7E",X"82",X"81",X"7D",X"80",X"82",X"80",X"7D",X"81",X"81",X"80",X"7D", + X"81",X"82",X"80",X"7E",X"7F",X"83",X"80",X"80",X"80",X"7E",X"7F",X"82",X"82",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"82",X"82",X"80",X"80",X"80",X"7E",X"80",X"82", + X"81",X"7E",X"81",X"82",X"7F",X"81",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"80",X"82",X"81", + X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E",X"80",X"82",X"80", + X"80",X"80",X"7D",X"82",X"81",X"80",X"80",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"82",X"81", + X"7F",X"81",X"7E",X"7F",X"82",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"7D", + X"81",X"82",X"7D",X"80",X"82",X"80",X"7E",X"81",X"82",X"7D",X"81",X"81",X"80",X"7D",X"81",X"82", + X"7F",X"80",X"7E",X"7F",X"82",X"81",X"7F",X"81",X"7D",X"81",X"82",X"7E",X"7F",X"82",X"81",X"7E", + X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E", + X"7F",X"82",X"81",X"7E",X"81",X"82",X"7E",X"7F",X"82",X"80",X"80",X"7E",X"81",X"82",X"7F",X"80", + X"7E",X"80",X"81",X"82",X"7F",X"7E",X"82",X"81",X"7F",X"81",X"7F",X"7E",X"82",X"81",X"7E",X"80", + X"82",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E", + X"82",X"81",X"80",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"82",X"80",X"7F",X"7F",X"83",X"7E",X"7F", + X"82",X"80",X"7F",X"7E",X"82",X"81",X"7F",X"7E",X"82",X"81",X"80",X"7E",X"81",X"81",X"80",X"7E", + X"80",X"82",X"80",X"7F",X"7E",X"83",X"80",X"80",X"80",X"7E",X"81",X"82",X"80",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7E",X"7F",X"82",X"81",X"7F",X"7F",X"83",X"7E",X"7F",X"82",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GAL_HIT.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GAL_HIT.vhd new file mode 100644 index 00000000..7d2fd29c --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/GAL_HIT.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_HIT 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 prom of GAL_HIT is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"65",X"75",X"88",X"90",X"93",X"9B",X"A3",X"A3",X"A3",X"A6",X"9E",X"9B",X"9B",X"A3",X"AB",X"B6", + X"B9",X"B9",X"BE",X"B9",X"AE",X"A6",X"9E",X"98",X"88",X"78",X"68",X"65",X"65",X"65",X"62",X"68", + X"68",X"65",X"5D",X"52",X"47",X"47",X"4A",X"4D",X"4D",X"4D",X"52",X"65",X"7D",X"88",X"90",X"9B", + X"A3",X"AE",X"AE",X"AB",X"AB",X"9E",X"98",X"88",X"70",X"52",X"37",X"1F",X"17",X"1F",X"27",X"3A", + X"5A",X"68",X"78",X"83",X"93",X"A3",X"AB",X"AE",X"A3",X"93",X"88",X"88",X"83",X"88",X"8B",X"88", + X"78",X"62",X"4A",X"42",X"3A",X"42",X"4D",X"55",X"65",X"78",X"83",X"8B",X"93",X"90",X"88",X"88", + X"98",X"A6",X"A6",X"AB",X"9E",X"8B",X"7D",X"68",X"70",X"88",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC", + X"FC",X"FC",X"DC",X"9B",X"4D",X"14",X"01",X"04",X"2F",X"52",X"5D",X"68",X"78",X"80",X"78",X"70", + X"5D",X"47",X"32",X"1F",X"14",X"09",X"11",X"1C",X"32",X"52",X"83",X"B9",X"D1",X"C9",X"AB",X"8B", + X"70",X"68",X"75",X"78",X"80",X"8B",X"8B",X"98",X"AB",X"BE",X"C1",X"AB",X"83",X"5D",X"3A",X"17", + X"11",X"17",X"27",X"3A",X"65",X"90",X"AE",X"B6",X"9B",X"78",X"55",X"4A",X"4D",X"5A",X"5D",X"52", + X"4A",X"4A",X"52",X"78",X"AB",X"D4",X"FC",X"FC",X"F7",X"E9",X"E1",X"D1",X"C9",X"BE",X"AB",X"90", + X"52",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"2F",X"4A",X"52",X"47",X"47",X"62",X"70",X"7D", + X"7D",X"78",X"7D",X"90",X"B3",X"CE",X"EC",X"FC",X"FC",X"FC",X"FC",X"F4",X"E9",X"F4",X"FC",X"FC", + X"FC",X"FC",X"CE",X"98",X"65",X"2C",X"01",X"01",X"01",X"01",X"01",X"32",X"6D",X"7D",X"68",X"4A", + X"27",X"11",X"1C",X"3A",X"4D",X"62",X"68",X"65",X"68",X"70",X"80",X"9B",X"D1",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"A3",X"75",X"55",X"62",X"80",X"A3",X"BE",X"CE",X"C1",X"90",X"4A",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"88",X"C9",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC", + X"B6",X"90",X"68",X"3F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1F",X"83",X"BE",X"D1",X"CE", + X"D4",X"F4",X"FC",X"FC",X"FC",X"F7",X"D1",X"CE",X"DC",X"F7",X"FC",X"FC",X"FC",X"FC",X"D1",X"8B", + X"68",X"68",X"88",X"A6",X"C1",X"D9",X"D4",X"BE",X"A3",X"88",X"75",X"68",X"62",X"5D",X"62",X"68", + X"6D",X"78",X"75",X"55",X"2C",X"11",X"11",X"2F",X"55",X"75",X"83",X"93",X"9E",X"B9",X"E9",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"68",X"32",X"11",X"17",X"32",X"52",X"7D", + X"AE",X"E1",X"F7",X"E1",X"A3",X"62",X"17",X"01",X"01",X"01",X"01",X"01",X"1C",X"4D",X"7D",X"90", + X"9B",X"A6",X"B6",X"BE",X"A6",X"70",X"37",X"14",X"14",X"1C",X"14",X"1C",X"2F",X"3A",X"3A",X"3A", + X"4A",X"52",X"4A",X"47",X"3A",X"24",X"11",X"14",X"27",X"3A",X"65",X"9E",X"D4",X"FC",X"FC",X"F7", + X"D4",X"AB",X"93",X"93",X"93",X"83",X"68",X"4D",X"37",X"37",X"5D",X"9B",X"EC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"CE",X"AB",X"93",X"7D",X"65",X"65",X"75",X"88",X"93",X"98",X"98",X"93", + X"93",X"90",X"93",X"8B",X"90",X"90",X"90",X"8B",X"8B",X"90",X"8B",X"90",X"90",X"90",X"90",X"8B", + X"8B",X"8B",X"8B",X"8B",X"88",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"83",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"78",X"75",X"78",X"75",X"78", + X"78",X"78",X"75",X"78",X"75",X"70",X"75",X"75",X"75",X"75",X"70",X"6D",X"68",X"6D",X"70",X"6D", + X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"70",X"70",X"70",X"75",X"75",X"75",X"75", + X"75",X"70",X"62",X"4D",X"4D",X"4D",X"47",X"4A",X"68",X"98",X"B6",X"B3",X"9B",X"78",X"5A",X"3F", + X"32",X"2F",X"32",X"3F",X"5A",X"90",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"E9",X"90",X"4D",X"3A", + X"47",X"5D",X"5D",X"4D",X"3A",X"27",X"1C",X"14",X"11",X"0C",X"01",X"01",X"01",X"01",X"01",X"01", + X"04",X"4A",X"9E",X"F7",X"FC",X"FC",X"FC",X"FC",X"EC",X"E4",X"E4",X"D1",X"AB",X"80",X"62",X"47", + X"37",X"2F",X"2C",X"24",X"04",X"01",X"24",X"52",X"70",X"70",X"62",X"4D",X"3F",X"37",X"37",X"3A", + X"4D",X"62",X"78",X"93",X"AE",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"B6",X"68", + X"2C",X"01",X"01",X"01",X"01",X"01",X"01",X"09",X"47",X"65",X"68",X"68",X"62",X"5A",X"52",X"4D", + X"52",X"4D",X"52",X"52",X"5A",X"5D",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"65",X"37",X"1C", + X"09",X"09",X"1C",X"32",X"4D",X"70",X"93",X"AB",X"C9",X"D9",X"E9",X"EF",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"F7",X"6D",X"0C",X"01",X"01",X"01",X"01",X"01",X"17",X"62",X"83",X"78", + X"5A",X"37",X"14",X"04",X"01",X"01",X"01",X"01",X"04",X"11",X"1C",X"1C",X"01",X"01",X"0C",X"3F", + X"6D",X"7D",X"78",X"68",X"65",X"83",X"B3",X"E1",X"F4",X"E4",X"C6",X"A3",X"8B",X"75",X"68",X"65", + X"5D",X"62",X"65",X"62",X"5A",X"3F",X"27",X"17",X"1F",X"5A",X"9E",X"CE",X"D4",X"C9",X"AE",X"A6", + X"AE",X"AB",X"9B",X"83",X"80",X"98",X"9B",X"9B",X"9B",X"B6",X"D9",X"E4",X"E1",X"DC",X"E1",X"D4", + X"B3",X"83",X"5A",X"3A",X"1F",X"11",X"0C",X"11",X"14",X"1C",X"1F",X"2C",X"2C",X"1F",X"27",X"32", + X"3F",X"5D",X"83",X"9B",X"93",X"93",X"88",X"7D",X"7D",X"75",X"70",X"70",X"6D",X"68",X"68",X"68", + X"5A",X"5A",X"75",X"88",X"93",X"93",X"90",X"90",X"88",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"80", + X"7D",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80",X"83",X"83",X"80",X"80", + X"80",X"7D",X"7D",X"70",X"70",X"6D",X"75",X"83",X"90",X"93",X"90",X"88",X"88",X"80",X"78",X"7D", + X"70",X"68",X"70",X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"75",X"70",X"68",X"4D",X"3A", + X"4A",X"70",X"93",X"A3",X"B6",X"B9",X"B3",X"A3",X"90",X"80",X"75",X"70",X"68",X"68",X"68",X"65", + X"68",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"75",X"78", + X"78",X"78",X"78",X"78",X"78",X"78",X"70",X"55",X"37",X"1F",X"24",X"47",X"68",X"7D",X"88",X"8B", + X"88",X"88",X"88",X"8B",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"C9",X"AB",X"80",X"5A", + X"4A",X"47",X"37",X"2C",X"32",X"4D",X"70",X"78",X"7D",X"8B",X"90",X"88",X"68",X"4A",X"2C",X"1C", + X"11",X"09",X"01",X"01",X"01",X"01",X"14",X"27",X"47",X"70",X"AE",X"E1",X"F4",X"E4",X"D1",X"AE", + X"93",X"80",X"70",X"68",X"62",X"62",X"65",X"68",X"6D",X"75",X"78",X"78",X"65",X"4A",X"4D",X"5A", + X"62",X"65",X"68",X"88",X"B9",X"EC",X"FC",X"F4",X"D1",X"B6",X"B3",X"AE",X"A3",X"98",X"A3",X"C6", + X"D9",X"D4",X"D4",X"E1",X"E1",X"C9",X"9E",X"78",X"62",X"3F",X"32",X"2C",X"27",X"2C",X"32",X"37", + X"3F",X"47",X"4A",X"52",X"55",X"5A",X"5D",X"5D",X"5A",X"3F",X"27",X"14",X"11",X"14",X"24",X"4A", + X"80",X"A6",X"BE",X"C6",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC",X"BE",X"AB",X"8B", + X"5D",X"2F",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"70",X"6D",X"5D",X"4D", + X"4D",X"68",X"9B",X"BE",X"C9",X"B9",X"B3",X"AB",X"9B",X"A3",X"B3",X"C6",X"D1",X"B6",X"8B",X"52", + X"1C",X"11",X"11",X"14",X"37",X"62",X"90",X"9E",X"9B",X"83",X"75",X"5D",X"47",X"32",X"2F",X"24", + X"17",X"11",X"11",X"17",X"27",X"5D",X"A3",X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"EF",X"CE", + X"9B",X"7D",X"68",X"62",X"62",X"7D",X"98",X"9E",X"93",X"7D",X"6D",X"5D",X"55",X"52",X"52",X"52", + X"55",X"55",X"5D",X"62",X"65",X"68",X"6D",X"70",X"75",X"7D",X"78",X"7D",X"80",X"83",X"78",X"62", + X"3A",X"27",X"14",X"17",X"27",X"3F",X"5A",X"78",X"98",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70",X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32", + X"04",X"01",X"01",X"01",X"01",X"01",X"11",X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78", + X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24",X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93", + X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90",X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E", + X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E",X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B", + X"88",X"75",X"52",X"37",X"1F",X"1C",X"27",X"37",X"4D",X"68",X"83",X"AE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D1",X"9B",X"65",X"42",X"3A",X"52",X"80",X"AE",X"D4",X"E9",X"E4",X"C6", + X"80",X"3A",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"32",X"88",X"C6",X"F7",X"FC", + X"E4",X"CE",X"B9",X"A3",X"80",X"62",X"47",X"37",X"2F",X"2C",X"2F",X"37",X"3F",X"3A",X"32",X"3A", + X"37",X"32",X"37",X"3A",X"52",X"7D",X"B3",X"DC",X"E4",X"E1",X"D1",X"D1",X"E1",X"FC",X"FC",X"FC", + X"FC",X"F4",X"CE",X"A3",X"83",X"75",X"7D",X"83",X"83",X"88",X"98",X"A6",X"A6",X"98",X"88",X"75", + X"68",X"5D",X"5A",X"5A",X"5A",X"62",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"7D",X"83",X"83", + X"80",X"75",X"68",X"70",X"80",X"8B",X"93",X"98",X"98",X"90",X"90",X"8B",X"90",X"98",X"A3",X"AE", + X"B6",X"C9",X"C9",X"C1",X"B3",X"A3",X"98",X"8B",X"78",X"75",X"70",X"6D",X"65",X"68",X"70",X"80", + X"83",X"83",X"88",X"8B",X"83",X"78",X"68",X"5D",X"52",X"42",X"2C",X"27",X"2C",X"3A",X"47",X"42", + X"42",X"52",X"70",X"8B",X"A6",X"AB",X"A3",X"9E",X"9E",X"B3",X"B9",X"B9",X"BE",X"BE",X"B9",X"A3", + X"88",X"68",X"5D",X"5A",X"5A",X"52",X"52",X"68",X"70",X"65",X"62",X"62",X"68",X"7D",X"8B",X"8B", + X"83",X"75",X"65",X"68",X"75",X"80",X"9B",X"C1",X"EC",X"FC",X"FC",X"F7",X"EF",X"E9",X"D1",X"A3", + X"78",X"5D",X"42",X"2C",X"14",X"0C",X"09",X"0C",X"0C",X"17",X"2C",X"47",X"62",X"75",X"75",X"68", + X"62",X"52",X"4A",X"4A",X"42",X"3F",X"4A",X"55",X"68",X"90",X"A3",X"B9",X"C6",X"CE",X"E4",X"FC", + X"FC",X"EC",X"E9",X"E9",X"DC",X"C1",X"B3",X"A6",X"98",X"75",X"52",X"3A",X"2C",X"1C",X"11",X"01", + X"0C",X"1F",X"37",X"52",X"70",X"78",X"78",X"68",X"62",X"62",X"75",X"98",X"B6",X"BE",X"B3",X"AB", + X"A6",X"9B",X"9E",X"AE",X"B9",X"C1",X"AE",X"90",X"5D",X"32",X"2C",X"27",X"2C",X"3F",X"62",X"83", + X"93",X"90",X"88",X"80",X"70",X"5D",X"52",X"47",X"3A",X"2F",X"24",X"1F",X"2C",X"3A",X"68",X"A3", + X"D4",X"F4",X"FC",X"FC",X"F4",X"E9",X"E9",X"DC",X"B9",X"90",X"78",X"68",X"5D",X"62",X"7D",X"93", + X"9B",X"90",X"7D",X"70",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5A",X"5D",X"65",X"68",X"68",X"70", + X"70",X"75",X"78",X"78",X"7D",X"80",X"80",X"78",X"65",X"3F",X"27",X"17",X"1C",X"2C",X"3F",X"5D", + X"78",X"93",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70", + X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32",X"04",X"01",X"01",X"01",X"01",X"01",X"11", + X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78",X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24", + X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93",X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90", + X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E", + X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B",X"88",X"75",X"52",X"37",X"1F",X"1C",X"24", + X"37",X"4D",X"68",X"88",X"AE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"9B",X"65", + X"3F",X"37",X"52",X"80",X"B3",X"D9",X"EC",X"EC",X"C9",X"7D",X"37",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"27",X"88",X"D1",X"FC",X"FC",X"EC",X"D1",X"BE",X"A3",X"7D",X"62",X"3A", + X"2C",X"1F",X"1F",X"24",X"2C",X"32",X"2C",X"27",X"2F",X"27",X"27",X"27",X"2C",X"47",X"7D",X"C1", + X"F7",X"FC",X"FC",X"E9",X"E1",X"EC",X"FC",X"FC",X"FC",X"FC",X"FC",X"E4",X"AE",X"88",X"78",X"83", + X"8B",X"8B",X"93",X"A3",X"B9",X"BE",X"A6",X"90",X"75",X"65",X"52",X"52",X"52",X"4D",X"55",X"5D", + X"62",X"68",X"70",X"70",X"70",X"75",X"80",X"8B",X"90",X"90",X"8B",X"83",X"90",X"98",X"9B",X"9E", + X"9E",X"9B",X"93",X"93",X"8B",X"90",X"8B",X"8B",X"8B",X"88",X"8B",X"8B",X"8B",X"8B",X"88",X"8B", + X"8B",X"8B",X"8B",X"8B",X"8B",X"88",X"8B",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"80",X"80", + X"80",X"7D",X"65",X"47",X"52",X"68",X"78",X"78",X"65",X"5A",X"5D",X"6D",X"75",X"78",X"70",X"68", + X"70",X"90",X"C9",X"EC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A6",X"68",X"42",X"3A",X"37",X"3A",X"5D", + X"7D",X"83",X"68",X"55",X"52",X"47",X"32",X"17",X"09",X"01",X"01",X"09",X"17",X"2C",X"52",X"9B", + X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"DC",X"A6",X"78",X"62",X"47",X"1F",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"3F",X"7D",X"A3",X"9B",X"80",X"5D",X"4A",X"5A",X"7D",X"90",X"9B",X"AB", + X"A6",X"AB",X"AB",X"9E",X"A6",X"BE",X"D4",X"E4",X"D4",X"A6",X"88",X"7D",X"88",X"88",X"83",X"90", + X"A3",X"AB",X"A6",X"9E",X"98",X"8B",X"83",X"80",X"80",X"80",X"83",X"83",X"88",X"8B",X"8B",X"90", + X"90",X"90",X"93",X"98",X"98",X"9B",X"93",X"98",X"93",X"93",X"93",X"93",X"93",X"93",X"90",X"90", + X"90",X"8B",X"8B",X"83",X"80",X"7D",X"68",X"52",X"52",X"62",X"68",X"88",X"AB",X"C6",X"C9",X"C9", + X"B6",X"A6",X"9E",X"8B",X"83",X"8B",X"A3",X"B3",X"AE",X"98",X"80",X"6D",X"5D",X"52",X"47",X"42", + X"47",X"3F",X"47",X"42",X"42",X"4D",X"62",X"65",X"68",X"68",X"68",X"68",X"68",X"68",X"68",X"68", + X"65",X"68",X"68",X"68",X"6D",X"70",X"6D",X"6D",X"70",X"75",X"70",X"75",X"78",X"75",X"78",X"75", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"7D",X"80",X"80",X"6D",X"65",X"70",X"80",X"80",X"68", + X"52",X"32",X"2C",X"37",X"68",X"9B",X"B6",X"B6",X"B6",X"C1",X"D4",X"D9",X"C6",X"A3",X"78",X"5A", + X"3F",X"32",X"32",X"3A",X"55",X"8B",X"CE",X"FC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A3",X"62",X"2F", + X"1C",X"09",X"01",X"01",X"1C",X"47",X"5D",X"68",X"80",X"93",X"90",X"80",X"70",X"5A",X"4D",X"52", + X"68",X"78",X"7D",X"70",X"5D",X"4A",X"3A",X"32",X"32",X"2F",X"27",X"27",X"1C",X"11",X"09",X"0C", + X"14",X"2C",X"42",X"75",X"AB",X"DC",X"F7",X"FC",X"FC",X"F7",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"BE",X"88",X"4D",X"11",X"01",X"01",X"0C",X"3F",X"75",X"9E",X"B6",X"B3", + X"93",X"70",X"52",X"3A",X"1F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"3F", + X"52",X"62",X"68",X"7D",X"9E",X"C1",X"E4",X"FC",X"FC",X"F7",X"E1",X"BE",X"A3",X"90",X"80",X"88", + X"AB",X"E1",X"FC",X"FC",X"FC",X"FC",X"F7",X"BE",X"7D",X"3F",X"0C",X"01",X"01",X"01",X"01",X"27", + X"70",X"B6",X"E9",X"FC",X"FC",X"E9",X"AE",X"83",X"62",X"4D",X"2F",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"3F",X"98",X"CE",X"D1",X"BE",X"B6",X"C1",X"D4",X"E9",X"FC",X"E9",X"C9",X"AB", + X"9B",X"88",X"5D",X"37",X"27",X"27",X"1F",X"1C",X"1C",X"1F",X"37",X"70",X"B6",X"FC",X"FC",X"FC", + X"FC",X"FC",X"F4",X"F4",X"E4",X"C6",X"98",X"70",X"5A",X"3A",X"37",X"47",X"6D",X"AE",X"F7",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"93",X"55",X"17",X"01",X"01",X"01",X"1C",X"4A",X"80",X"AB", + X"B3",X"A6",X"A3",X"A3",X"A3",X"A6",X"9B",X"78",X"42",X"11",X"04",X"11",X"1C",X"1F",X"37",X"55", + X"7D",X"8B",X"80",X"5D",X"47",X"4D",X"65",X"6D",X"5D",X"4A",X"3F",X"4D",X"7D",X"B6",X"EC",X"FC", + X"FC",X"FC",X"E4",X"C6",X"9E",X"98",X"9B",X"90",X"75",X"5D",X"62",X"7D",X"9B",X"C6",X"E1",X"E9", + X"D9",X"B3",X"93",X"83",X"70",X"68",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5D",X"65",X"65",X"68", + X"5A",X"37",X"2F",X"4A",X"65",X"6D",X"68",X"75",X"93",X"BE",X"E4",X"EC",X"D1",X"B3",X"9E",X"AB", + X"AB",X"9E",X"80",X"65",X"42",X"32",X"32",X"4A",X"75",X"90",X"A3",X"BE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"D1",X"93",X"5A",X"3A",X"3A",X"47",X"5A",X"7D",X"A6",X"CE",X"CE",X"B9",X"A6",X"9B",X"80", + X"52",X"1C",X"01",X"01",X"01",X"11",X"47",X"78",X"9E",X"AB",X"9B",X"78",X"5A",X"2C",X"14",X"1C", + X"27",X"1F",X"11",X"01",X"01",X"01",X"1C",X"3F",X"75",X"AB",X"C9",X"D4",X"DC",X"CE",X"C9",X"D1", + X"E1",X"F4",X"FC",X"FC",X"FC",X"E4",X"BE",X"90",X"70",X"4A",X"11",X"01",X"01",X"01",X"01",X"09", + X"17",X"4A",X"90",X"D4",X"FC",X"FC",X"FC",X"F4",X"E9",X"E9",X"FC",X"FC",X"E4",X"B3",X"80",X"52", + X"2F",X"1C",X"1F",X"32",X"68",X"AE",X"F4",X"FC",X"FC",X"FC",X"E4",X"C9",X"AB",X"80",X"5D",X"47", + X"37",X"42",X"75",X"AB",X"DC",X"FC",X"FC",X"FC",X"D9",X"93",X"55",X"37",X"2F",X"3A",X"52",X"62", + X"68",X"68",X"55",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1C",X"32",X"4D",X"68", + X"9B",X"CE",X"E4",X"F4",X"EC",X"E4",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9", + X"88",X"4A",X"17",X"04",X"11",X"42",X"75",X"88",X"9B",X"B6",X"BE",X"A6",X"7D",X"4D",X"1C",X"01", + X"01",X"17",X"27",X"32",X"4D",X"7D",X"A6",X"B3",X"B9",X"C6",X"D1",X"D9",X"D9",X"CE",X"BE",X"A6", + X"90",X"65",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"14",X"68",X"93",X"98",X"83",X"75",X"7D", + X"9E",X"BE",X"C9",X"BE",X"A6",X"9E",X"B6",X"D9",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9",X"C1", + X"B3",X"9B",X"75",X"5D",X"47",X"2F",X"2F",X"4A",X"68",X"7D",X"7D",X"78",X"83",X"90",X"9E",X"AE", + X"A3",X"83",X"75",X"52",X"3F",X"4A",X"5D",X"62",X"55",X"3F",X"2F",X"24",X"32",X"5A",X"7D",X"90", + X"AB",X"CE",X"E4",X"FC",X"FC",X"FC",X"E9",X"CE",X"B3",X"98",X"88",X"83",X"83",X"90",X"B3",X"EC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"75",X"42",X"27",X"14",X"01",X"01",X"1C",X"3F",X"52",X"5A", + X"68",X"78",X"68",X"47",X"17",X"01",X"01",X"09",X"27",X"37",X"4A",X"65",X"75",X"6D",X"65",X"68", + X"68",X"5D",X"4D",X"42",X"27",X"0C",X"0C",X"14",X"1C",X"1F",X"3A",X"68",X"9E",X"CE",X"E1",X"DC", + X"DC",X"DC",X"DC",X"CE",X"A6",X"75",X"5A",X"4A",X"3A",X"4A",X"70",X"98",X"BE",X"E1",X"E9",X"E4", + X"B9",X"9E",X"90",X"8B",X"88",X"75",X"52",X"2F",X"2F",X"4A",X"5D",X"68",X"78",X"80",X"70",X"70", + X"7D",X"8B",X"9E",X"B6",X"BE",X"B6",X"AE",X"9B",X"98",X"AE",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"B9",X"9E",X"88",X"65",X"4D",X"47",X"3F",X"2F",X"11",X"01",X"04", + X"1F",X"2F",X"2F",X"1F",X"11",X"01",X"0C",X"2C",X"4D",X"62",X"78",X"98",X"AB",X"BE",X"DC",X"F4", + X"F7",X"E4",X"E1",X"DC",X"C1",X"9E",X"88",X"62",X"3A",X"14",X"01",X"11",X"17",X"27",X"32",X"55", + X"88",X"B6",X"E4",X"F7",X"E4",X"C6",X"A3",X"75",X"5A",X"52",X"5A",X"68",X"78",X"80",X"80",X"5A", + X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"3F",X"70",X"A3",X"C9",X"E1",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"C6",X"B3",X"98",X"93",X"9B",X"AB",X"B9",X"AB",X"98",X"83",X"68",X"52", + X"4A",X"2F",X"17",X"04",X"01",X"0C",X"37",X"75",X"A3",X"B9",X"D1",X"CE",X"B3",X"A3",X"9B",X"93", + X"93",X"A6",X"BE",X"B9",X"9E",X"7D",X"55",X"37",X"27",X"27",X"4A",X"80",X"A6",X"B3",X"AE",X"AB", + X"B9",X"C6",X"B9",X"B3",X"A3",X"80",X"5D",X"4A",X"47",X"3A",X"32",X"3A",X"5A",X"7D",X"83",X"90", + X"8B",X"83",X"7D",X"70",X"65",X"6D",X"7D",X"78",X"65",X"47",X"1F",X"0C",X"01",X"01",X"09",X"2C", + X"68",X"AE",X"CE",X"D1",X"CE",X"D4",X"E4",X"E4",X"CE",X"A6",X"98",X"9B",X"AB",X"BE",X"CE",X"CE", + X"B9",X"90",X"52",X"14",X"01",X"01",X"01",X"01",X"09",X"3A",X"78",X"9E",X"AE",X"B9",X"CE",X"CE", + X"B9",X"A6",X"90",X"7D",X"7D",X"83",X"80",X"68",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75", + X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6",X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4", + X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A",X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC", + X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52",X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B", + X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9",X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01", + X"01",X"01",X"01",X"01",X"01",X"24",X"47",X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4", + X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3",X"9B",X"98",X"98",X"90",X"83",X"88",X"A6",X"C9",X"DC", + X"D9",X"BE",X"AB",X"7D",X"52",X"2F",X"27",X"1F",X"11",X"17",X"27",X"2F",X"2F",X"3F",X"52",X"5D", + X"5A",X"65",X"70",X"75",X"80",X"88",X"8B",X"9B",X"AB",X"BE",X"C6",X"AE",X"83",X"55",X"27",X"09", + X"09",X"27",X"52",X"83",X"93",X"98",X"93",X"88",X"83",X"80",X"70",X"55",X"3F",X"2C",X"27",X"32", + X"47",X"65",X"8B",X"AE",X"D4",X"E9",X"D9",X"B3",X"98",X"90",X"93",X"88",X"68",X"4D",X"4A",X"5A", + X"68",X"6D",X"7D",X"8B",X"90",X"8B",X"88",X"8B",X"98",X"9E",X"9B",X"83",X"62",X"2F",X"09",X"04", + X"1F",X"47",X"6D",X"98",X"AE",X"B6",X"B3",X"AB",X"9B",X"9B",X"A3",X"B6",X"C6",X"B9",X"9B",X"83", + X"78",X"6D",X"65",X"5A",X"5A",X"68",X"88",X"A6",X"B6",X"A3",X"8B",X"75",X"68",X"6D",X"6D",X"65", + X"5D",X"5D",X"68",X"80",X"A3",X"CE",X"DC",X"D4",X"CE",X"CE",X"C9",X"C6",X"CE",X"BE",X"AB",X"90", + X"80",X"80",X"8B",X"98",X"9E",X"B6",X"DC",X"E4",X"E4",X"E1",X"CE",X"C6",X"B6",X"98",X"80",X"7D", + X"75",X"70",X"68",X"68",X"62",X"3F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"11",X"47",X"68",X"90",X"B6",X"CE",X"D4",X"E1",X"E9",X"E9",X"E4",X"E4",X"E9",X"E4",X"D4",X"C6", + X"A6",X"78",X"42",X"14",X"01",X"01",X"01",X"01",X"14",X"42",X"78",X"AB",X"D1",X"E1",X"D9",X"C6", + X"9B",X"7D",X"75",X"78",X"88",X"93",X"8B",X"88",X"70",X"4D",X"2F",X"24",X"1C",X"24",X"27",X"24", + X"27",X"3A",X"62",X"88",X"B3",X"CE",X"DC",X"EC",X"EF",X"E1",X"CE",X"BE",X"A3",X"83",X"68",X"52", + X"4D",X"55",X"65",X"78",X"78",X"80",X"90",X"90",X"90",X"8B",X"75",X"5D",X"4D",X"52",X"62",X"80", + X"A3",X"B6",X"B6",X"B6",X"A6",X"90",X"83",X"88",X"93",X"9E",X"BE",X"D1",X"C9",X"AE",X"8B",X"62", + X"3F",X"27",X"1C",X"32",X"62",X"88",X"9B",X"A3",X"AB",X"C1",X"CE",X"C1",X"B6",X"A6",X"90",X"6D", + X"5D",X"55",X"3F",X"2F",X"2F",X"47",X"5D",X"65",X"6D",X"75",X"78",X"83",X"7D",X"75",X"7D",X"83", + X"80",X"68",X"4D",X"2F",X"14",X"04",X"04",X"17",X"37",X"70",X"A6",X"C1",X"C1",X"B9",X"BE",X"D1", + X"D4",X"C1",X"A3",X"98",X"9E",X"AE",X"C9",X"D4",X"D4",X"C6",X"98",X"5D",X"24",X"01",X"01",X"01", + X"01",X"17",X"4A",X"7D",X"A3",X"AE",X"B9",X"C9",X"C6",X"B6",X"A3",X"8B",X"7D",X"80",X"83",X"83", + X"6D",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75",X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6", + X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4",X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A", + X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC",X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52", + X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B",X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9", + X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"47", + X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4",X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3", + X"9B",X"98",X"98",X"8B",X"83",X"8B",X"A6",X"C9",X"E1",X"DC",X"C1",X"A6",X"7D",X"4D",X"2C",X"24", + X"17",X"0C",X"11",X"1F",X"2C",X"2C",X"3A",X"52",X"5D",X"5A",X"65",X"70",X"78",X"88",X"90",X"90", + X"9E",X"AB",X"C1",X"C6",X"A6",X"78",X"3F",X"11",X"01",X"01",X"14",X"47",X"80",X"93",X"98",X"93", + X"83",X"70",X"65",X"4D",X"2F",X"14",X"04",X"04",X"27",X"47",X"70",X"A3",X"D1",X"FC",X"FC",X"F7", + X"C9",X"A6",X"9B",X"9B",X"8B",X"70",X"5A",X"5D",X"75",X"7D",X"80",X"8B",X"9E",X"9B",X"93",X"8B", + X"98",X"A3",X"AE",X"AE",X"93",X"68",X"32",X"04",X"04",X"24",X"52",X"88",X"B6",X"C9",X"B9",X"AB", + X"98",X"80",X"80",X"90",X"A6",X"B9",X"BE",X"A6",X"93",X"8B",X"80",X"70",X"4D",X"37",X"3F",X"62", + X"88",X"9E",X"98",X"80",X"65",X"55",X"62",X"68",X"68",X"70",X"75",X"78",X"93",X"C6",X"FC",X"FC", + X"FC",X"FC",X"F7",X"E9",X"DC",X"D4",X"BE",X"A3",X"80",X"68",X"70",X"75",X"75",X"70",X"80",X"A3", + X"B3",X"B3",X"AE",X"98",X"83",X"75",X"5D",X"52",X"5A",X"68",X"78",X"83",X"83",X"78",X"4A",X"11", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"78",X"A6",X"D1",X"E9",X"E4", + X"E1",X"E1",X"DC",X"D9",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"B9",X"75",X"2F",X"01",X"01",X"01", + X"01",X"01",X"01",X"27",X"5D",X"9B",X"D4",X"F4",X"EC",X"CE",X"A6",X"93",X"9E",X"B6",X"B6",X"A3", + X"93",X"8B",X"83",X"70",X"68",X"78",X"93",X"A6",X"9E",X"90",X"83",X"98",X"AE",X"C9",X"D4",X"DC", + X"CE",X"A6",X"7D",X"65",X"52",X"2C",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"4D",X"9E", + X"E4",X"FC",X"FC",X"FC",X"EC",X"EC",X"FC",X"FC",X"FC",X"FC",X"E9",X"AE",X"78",X"4A",X"2F",X"2F", + X"52",X"8B",X"C6",X"F4",X"FC",X"F7",X"DC",X"B3",X"80",X"4D",X"17",X"01",X"01",X"01",X"1C",X"3F", + X"70",X"A6",X"D1",X"E9",X"E1",X"CE",X"B9",X"B3",X"AE",X"A6",X"88",X"5A",X"1F",X"01",X"01",X"01", + X"01",X"01",X"14",X"52",X"8B",X"B9",X"C6",X"B6",X"A6",X"9E",X"90",X"75",X"68",X"52",X"4A",X"52", + X"68",X"88",X"93",X"83",X"62",X"3F",X"1F",X"17",X"2F",X"4D",X"68",X"75",X"83",X"9E",X"D1",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D4",X"BE",X"B3",X"A3",X"A6",X"BE",X"D4",X"E1",X"CE",X"B3",X"A6",X"98", + X"75",X"4A",X"27",X"1C",X"2F",X"4D",X"68",X"7D",X"68",X"47",X"17",X"01",X"01",X"01",X"01",X"01", + X"04",X"0C",X"1F",X"32",X"4A",X"5D",X"80",X"B3",X"F7",X"FC",X"FC",X"FC",X"EC",X"D4",X"CE",X"BE", + X"C1",X"CE",X"D9",X"C9",X"A3",X"83",X"70",X"5A",X"3F",X"32",X"3F",X"5D",X"68",X"65",X"47",X"2C", + X"17",X"04",X"09",X"27",X"4A",X"68",X"90",X"9E",X"98",X"88",X"7D",X"83",X"9E",X"CE",X"E9",X"F7", + X"E4",X"BE",X"9E",X"68",X"37",X"09",X"01",X"01",X"01",X"04",X"14",X"37",X"55",X"65",X"70",X"88", + X"AE",X"DC",X"FC",X"F4",X"D1",X"AE",X"93",X"80",X"78",X"83",X"9B",X"B3",X"B3",X"98",X"70",X"47", + X"24",X"17",X"32",X"62",X"9B",X"C9",X"CE",X"B9",X"A3",X"9B",X"88",X"70",X"5D",X"55",X"68",X"93", + X"B6",X"BE",X"B3",X"AE",X"AE",X"A3",X"90",X"90",X"98",X"9B",X"AB",X"AB",X"AE",X"B3",X"AB",X"93", + X"78",X"65",X"68",X"78",X"75",X"70",X"68",X"78",X"8B",X"93",X"93",X"9E",X"B9",X"DC",X"FC",X"FC", + X"FC",X"D4",X"93",X"62",X"42",X"1C",X"01",X"01",X"04",X"0C",X"0C",X"1F",X"4A",X"78",X"AB",X"C9", + X"DC",X"E1",X"D9",X"C6",X"AB",X"90",X"70",X"47",X"09",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"1C",X"47",X"62",X"75",X"88",X"AB",X"D1",X"E9",X"EC",X"E9",X"E4",X"DC",X"F7",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"9E",X"80",X"75",X"7D",X"70",X"6D",X"75",X"80",X"8B",X"80",X"65", + X"4A",X"2C",X"04",X"01",X"01",X"01",X"04",X"2C",X"52",X"62",X"5A",X"4D",X"5A",X"78",X"9B",X"B3", + X"C1",X"AB",X"93",X"83",X"78",X"62",X"4D",X"4A",X"52",X"4A",X"3F",X"4D",X"5D",X"7D",X"90",X"9B", + X"9E",X"83",X"68",X"62",X"5D",X"68",X"78",X"88",X"88",X"8B",X"8B",X"80",X"62",X"47",X"3F",X"3A", + X"32",X"37",X"37",X"37",X"4D",X"70",X"88",X"8B",X"80",X"70",X"70",X"8B",X"B6",X"D4",X"D4",X"CE", + X"B9",X"B9",X"C9",X"C9",X"C6",X"B6",X"B9",X"D4",X"FC",X"FC",X"FC",X"FC",X"EC",X"B6",X"80",X"52", + X"37",X"2F",X"2C",X"37",X"62",X"98",X"D1",X"FC",X"FC",X"EC",X"D1",X"A3",X"68",X"4A",X"32",X"27", + X"27",X"3A",X"55",X"68",X"62",X"52",X"3F",X"1C",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"37", + X"5A",X"70",X"88",X"88",X"7D",X"65",X"52",X"47",X"52",X"68",X"83",X"9E",X"AE",X"B6",X"C1",X"B9", + X"B6",X"AE",X"98",X"78",X"5D",X"42",X"32",X"2C",X"2F",X"4D",X"7D",X"B9",X"F7",X"FC",X"FC",X"FC", + X"E1",X"AB",X"83",X"65",X"52",X"5A",X"68",X"65",X"52",X"3F",X"3F",X"3F",X"37",X"37",X"52",X"7D", + X"A6",X"C1",X"BE",X"9E",X"88",X"7D",X"68",X"5A",X"47",X"47",X"62",X"90",X"B3",X"C6",X"D9",X"EF", + X"FC",X"FC",X"E4",X"CE",X"B9",X"B3",X"B3",X"AE",X"AB",X"9B",X"75",X"55",X"37",X"11",X"01",X"01", + X"01",X"01",X"04",X"4D",X"88",X"AB",X"B3",X"AE",X"A3",X"9B",X"AE",X"C6",X"CE",X"C9",X"BE",X"B6", + X"B3",X"AB",X"AE",X"C6",X"EF",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"88",X"4A",X"14",X"01", + X"09",X"2C",X"52",X"78",X"93",X"93",X"78",X"47",X"0C",X"01",X"01",X"01",X"01",X"09",X"09",X"11", + X"27",X"4D",X"62",X"68",X"7D",X"90",X"9E",X"AE",X"AB",X"8B",X"70",X"62",X"52",X"3A",X"1C",X"04", + X"11",X"2F",X"5A",X"83",X"9E",X"B3",X"B9",X"B9",X"AB",X"80",X"62",X"4D",X"4D",X"5A",X"65",X"75", + X"7D",X"83",X"83",X"70",X"4D",X"1F",X"0C",X"14",X"32",X"5D",X"70",X"68",X"65",X"68",X"83",X"9E", + X"9E",X"93",X"88",X"83",X"9B",X"BE",X"D9",X"E1",X"D1",X"B6",X"A3",X"93",X"88",X"88",X"8B",X"98", + X"A3",X"C6",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"D4",X"B3",X"88",X"65",X"4A",X"32",X"3A",X"5D", + X"88",X"B3",X"D4",X"E4",X"E1",X"B9",X"78",X"37",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"14",X"37",X"42",X"4A",X"5A",X"68",X"78",X"90",X"AE",X"C9",X"E1",X"E1", + X"C9",X"93",X"65",X"4D",X"32",X"1F",X"17",X"27",X"37",X"3F",X"42",X"4D",X"68",X"88",X"98",X"A3", + X"B6",X"C9",X"D4",X"E4",X"E4",X"D4",X"BE",X"A6",X"AE",X"C6",X"E4",X"FC",X"FC",X"FC",X"E4",X"AB", + X"6D",X"3F",X"27",X"2F",X"52",X"83",X"AB",X"AB",X"AE",X"AE",X"AE",X"98",X"70",X"5A",X"5A",X"65", + X"7D",X"88",X"80",X"5D",X"3A",X"24",X"11",X"11",X"2F",X"52",X"75",X"83",X"93",X"A3",X"C9",X"EF", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"98",X"5A",X"1F",X"01",X"01",X"01",X"11",X"2F", + X"5D",X"90",X"BE",X"E4",X"FC",X"FC",X"D9",X"A3",X"78",X"65",X"68",X"75",X"70",X"65",X"5A",X"4A", + X"2C",X"14",X"04",X"11",X"37",X"68",X"9B",X"A6",X"9B",X"88",X"83",X"90",X"93",X"90",X"8B",X"83", + X"7D",X"83",X"93",X"A6",X"B6",X"BE",X"B9",X"9E",X"68",X"42",X"2C",X"2F",X"47",X"5D",X"78",X"88", + X"90",X"93",X"90",X"70",X"52",X"37",X"17",X"11",X"17",X"2C",X"37",X"3F",X"4D",X"4A",X"3F",X"32", + X"2F",X"37",X"5A",X"7D",X"9B",X"9E",X"A6",X"AE",X"B6",X"D4",X"FC",X"FC",X"FC",X"FC",X"FC",X"EC", + X"E1",X"B9",X"93",X"6D",X"5A",X"5A",X"5D",X"68",X"75",X"78",X"83",X"83",X"83",X"83",X"70",X"5D", + X"4A",X"4D",X"62",X"7D",X"90",X"98",X"88",X"62",X"2F",X"01",X"01",X"01",X"01",X"1C",X"37",X"52", + X"65",X"68",X"5A",X"52",X"5D",X"75",X"7D",X"75",X"5D",X"4A",X"4D",X"65",X"88",X"AB",X"C6",X"D9", + X"D4",X"B6",X"93",X"83",X"70",X"5A",X"47",X"47",X"4A",X"3F",X"3A",X"3F",X"32",X"27",X"17",X"1F", + X"3F",X"68",X"93",X"9E",X"9B",X"93",X"98",X"A6",X"AB",X"AB",X"A3",X"A6",X"BE",X"E1",X"F7",X"FC", + X"FC",X"EC",X"D1",X"AE",X"93",X"8B",X"9B",X"B3",X"B6",X"B6",X"C6",X"C6",X"B6",X"A6",X"9E",X"93", + X"7D",X"5D",X"37",X"1C",X"1F",X"27",X"2C",X"37",X"52",X"75",X"93",X"98",X"8B",X"7D",X"65",X"5D", + X"65",X"75",X"88",X"9B",X"9E",X"9B",X"8B",X"80",X"83",X"8B",X"8B",X"83",X"93",X"AB",X"C9",X"DC", + X"CE",X"B9",X"A6",X"83",X"5D",X"32",X"17",X"01",X"01",X"04",X"1C",X"4A",X"80",X"B6",X"DC",X"E1", + X"D4",X"BE",X"A6",X"98",X"90",X"88",X"6D",X"4D",X"2C",X"11",X"04",X"04",X"1C",X"4D",X"83",X"B6", + X"DC",X"E4",X"D1",X"C1",X"B3",X"9B",X"80",X"68",X"68",X"68",X"75",X"7D",X"7D",X"70",X"52",X"2C", + X"04",X"01",X"01",X"01",X"11",X"2F",X"47",X"5D",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC", + X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E",X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E", + X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52",X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01", + X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3",X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB", + X"93",X"78",X"65",X"62",X"68",X"70",X"80",X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70", + X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3",X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88", + X"7D",X"62",X"47",X"2F",X"11",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"78",X"93",X"9B", + X"9E",X"93",X"98",X"9B",X"98",X"A3",X"A6",X"AB",X"B3",X"C1",X"D1",X"CE",X"BE",X"AE",X"98",X"7D", + X"75",X"65",X"52",X"4A",X"3F",X"3A",X"3F",X"52",X"68",X"80",X"93",X"AB",X"B6",X"C9",X"E1",X"E4", + X"D4",X"CE",X"CE",X"C9",X"BE",X"9E",X"7D",X"5A",X"37",X"27",X"1C",X"1F",X"37",X"5A",X"75",X"80", + X"8B",X"93",X"90",X"8B",X"88",X"88",X"80",X"80",X"83",X"80",X"88",X"A3",X"C6",X"E1",X"FC",X"FC", + X"F4",X"CE",X"A3",X"80",X"65",X"4A",X"37",X"37",X"3F",X"47",X"52",X"62",X"70",X"7D",X"70",X"62", + X"52",X"55",X"68",X"78",X"80",X"75",X"65",X"65",X"5D",X"55",X"5A",X"5A",X"65",X"80",X"98",X"A3", + X"9B",X"8B",X"7D",X"80",X"88",X"90",X"98",X"9B",X"93",X"93",X"9E",X"AE",X"B9",X"B6",X"AE",X"AE", + X"A6",X"93",X"78",X"65",X"52",X"4D",X"4A",X"52",X"68",X"78",X"88",X"93",X"90",X"83",X"80",X"6D", + X"5D",X"5D",X"62",X"68",X"6D",X"6D",X"5D",X"4A",X"37",X"2F",X"32",X"52",X"75",X"93",X"A6",X"AE", + X"AB",X"AE",X"B6",X"C6",X"BE",X"C1",X"B9",X"A6",X"98",X"8B",X"70",X"52",X"3A",X"2C",X"37",X"42", + X"5A",X"68",X"70",X"78",X"7D",X"88",X"93",X"98",X"90",X"7D",X"7D",X"88",X"90",X"98",X"93",X"7D", + X"52",X"2C",X"09",X"01",X"01",X"09",X"32",X"52",X"70",X"88",X"9B",X"93",X"90",X"93",X"98",X"90", + X"83",X"70",X"65",X"62",X"78",X"93",X"AE",X"BE",X"C6",X"B9",X"9E",X"83",X"70",X"65",X"5D",X"5A", + X"5A",X"5D",X"5A",X"55",X"55",X"47",X"37",X"27",X"1F",X"37",X"5A",X"78",X"88",X"8B",X"8B",X"93", + X"A3",X"A6",X"AB",X"A6",X"AB",X"BE",X"D4",X"E4",X"EC",X"EC",X"E1",X"C9",X"A6",X"90",X"83",X"90", + X"98",X"9B",X"9E",X"AE",X"AB",X"A6",X"9E",X"9B",X"9B",X"90",X"78",X"5A",X"3F",X"37",X"37",X"37", + X"3F",X"52",X"68",X"88",X"83",X"78",X"68",X"5A",X"55",X"65",X"78",X"8B",X"9E",X"A3",X"9B",X"90", + X"83",X"88",X"8B",X"88",X"80",X"8B",X"9E",X"B9",X"C9",X"B9",X"A6",X"93",X"75",X"52",X"32",X"1C", + X"11",X"0C",X"14",X"2C",X"5A",X"8B",X"BE",X"DC",X"E1",X"D9",X"C6",X"AE",X"9E",X"98",X"8B",X"75", + X"55",X"32",X"1C",X"11",X"11",X"24",X"52",X"88",X"B6",X"D9",X"E4",X"CE",X"BE",X"AE",X"98",X"7D", + X"68",X"65",X"68",X"75",X"78",X"7D",X"70",X"52",X"2F",X"09",X"01",X"01",X"01",X"11",X"2F",X"47", + X"5A",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC",X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E", + X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E",X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52", + X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01",X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3", + X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB",X"93",X"78",X"65",X"62",X"68",X"70",X"80", + X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70",X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3", + X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88",X"7D",X"62",X"47",X"2C",X"0C",X"01",X"01", + X"01",X"01",X"01",X"14",X"3A",X"65",X"7D",X"98",X"A3",X"A3",X"98",X"9B",X"9E",X"9E",X"A6",X"AB", + X"AB",X"B6",X"C6",X"D4",X"CE",X"BE",X"AB",X"90",X"78",X"68",X"5A",X"47",X"32",X"27",X"1F",X"24", + X"3A",X"62",X"80",X"9E",X"B9",X"CE",X"D4",X"E9",X"EC",X"E1",X"D1",X"D1",X"CE",X"C6",X"A6",X"80", + X"55",X"2F",X"17",X"04",X"11",X"2F",X"62",X"83",X"9B",X"A6",X"AB",X"9B",X"90",X"8B",X"88",X"78", + X"70",X"65",X"5A",X"65",X"88",X"A6",X"CE",X"EF",X"FC",X"FC",X"E1",X"B6",X"9E",X"88",X"68",X"52", + X"4A",X"47",X"3F",X"37",X"3A",X"47",X"47",X"3A",X"2F",X"2F",X"4A",X"68",X"80",X"83",X"75",X"65", + X"65",X"65",X"68",X"75",X"7D",X"88",X"9E",X"AB",X"AB",X"98",X"80",X"78",X"7D",X"80",X"8B",X"9E", + X"9E",X"9B",X"9E",X"AE",X"BE",X"C1",X"B3",X"A6",X"A3",X"A6",X"AB",X"9B",X"83",X"68",X"52",X"42", + X"3F",X"52",X"68",X"80",X"93",X"A3",X"A6",X"B3",X"A6",X"93",X"88",X"88",X"93",X"90",X"83",X"68", + X"4D",X"37",X"2C",X"2F",X"47",X"68",X"90",X"AB",X"AE",X"A6",X"A6",X"9B",X"88",X"75",X"68",X"62", + X"52",X"42",X"32",X"27",X"11",X"01",X"01",X"11",X"27",X"3F",X"5A",X"65",X"68",X"78",X"8B",X"A6", + X"C1",X"C6",X"B9",X"B3",X"B3",X"AB",X"A3",X"8B",X"68",X"42",X"24",X"11",X"11",X"11",X"27",X"4D", + X"70",X"98",X"B9",X"DC",X"E9",X"E9",X"E1",X"CE",X"AB",X"98",X"90",X"83",X"83",X"93",X"A3",X"B6", + X"AE",X"A3",X"90",X"78",X"5D",X"4A",X"4D",X"62",X"78",X"83",X"80",X"80",X"83",X"7D",X"68",X"52", + X"37",X"1F",X"1F",X"2F",X"47",X"55",X"65",X"7D",X"90",X"93",X"98",X"A3",X"AE",X"B3",X"B9",X"B6", + X"B6",X"C1",X"C6",X"B9",X"A6",X"8B",X"80",X"70",X"65",X"52",X"4A",X"52",X"62",X"65",X"68",X"7D", + X"90",X"AB",X"C6",X"D1",X"CE",X"AE",X"88",X"68",X"65",X"62",X"52",X"52",X"4D",X"3F",X"2F",X"27", + X"27",X"3A",X"62",X"83",X"9E",X"B3",X"A6",X"9E",X"93",X"90",X"8B",X"7D",X"68",X"62",X"65",X"65", + X"65",X"55",X"3F",X"27",X"14",X"11",X"14",X"1C",X"2F",X"4A",X"62",X"78",X"98",X"B6",X"D1",X"E4", + X"E4",X"E1",X"E4",X"F7",X"FC",X"F7",X"E4",X"D1",X"BE",X"AB",X"98",X"83",X"8B",X"98",X"93",X"90", + X"93",X"90",X"83",X"78",X"70",X"6D",X"62",X"4A",X"2C",X"17",X"14",X"1C",X"27",X"3F",X"4D",X"5D", + X"68",X"68",X"68",X"68",X"75",X"8B",X"9E",X"A6",X"9E",X"9B",X"98",X"98",X"93",X"80",X"70",X"62", + X"52",X"4A",X"42",X"3A",X"2F",X"27",X"2C",X"2F",X"3F",X"5D",X"80",X"90",X"9B",X"A3",X"AE",X"C9", + X"E1",X"E4",X"DC",X"CE",X"C9",X"CE",X"C6",X"B3",X"98",X"8B",X"83",X"75",X"68",X"6D",X"7D",X"90", + X"A3",X"B3",X"B9",X"AE",X"98",X"7D",X"70",X"62",X"4A",X"2F",X"17",X"11",X"17",X"24",X"37",X"52", + X"62",X"75",X"80",X"80",X"80",X"88",X"8B",X"8B",X"98",X"9B",X"9E",X"AB",X"B6",X"AE",X"A3",X"90", + X"83",X"80",X"7D",X"83",X"90",X"90",X"88",X"75",X"62",X"52",X"47",X"42",X"4A",X"5D",X"75",X"8B", + X"A3",X"AB",X"AB",X"A3",X"93",X"98",X"9E",X"AE",X"BE",X"BE",X"AB",X"88",X"68",X"52",X"3A",X"37", + X"47",X"62",X"83",X"98",X"A3",X"9B",X"98",X"98",X"88",X"68",X"52",X"4D",X"52",X"62",X"65",X"62", + X"62",X"5D",X"4A",X"37",X"27",X"2C",X"3F",X"5D",X"6D",X"75",X"75",X"80",X"90",X"A3",X"B3",X"BE", + X"C6",X"C1",X"B9",X"AB",X"9E",X"83",X"68",X"52",X"3F",X"27",X"11",X"0C",X"11",X"1C",X"3F",X"68", + X"9B",X"B6",X"BE",X"B6",X"B3",X"B6",X"BE",X"C9",X"C6",X"AE",X"9B",X"8B",X"80",X"7D",X"83",X"93", + X"A3",X"AE",X"A3",X"9E",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"7D",X"68",X"62",X"5D",X"62",X"5D", + X"52",X"4D",X"5A",X"52",X"52",X"52",X"52",X"52",X"5A",X"5A",X"5A",X"62",X"68",X"78",X"88",X"90", + X"98",X"A6",X"B6",X"B9",X"B6",X"B3",X"B6",X"B9",X"B9",X"B6",X"AE",X"AB",X"93",X"78",X"65",X"4D", + X"32",X"24",X"24",X"32",X"52",X"70",X"83",X"88",X"83",X"7D",X"70",X"65",X"68",X"6D",X"6D",X"6D", + X"68",X"65",X"68",X"68",X"65",X"5D",X"55",X"5D",X"70",X"8B",X"90",X"93",X"8B",X"80",X"7D",X"7D", + X"8B",X"9E",X"A6",X"A3",X"9E",X"9E",X"A3",X"A3",X"98",X"88",X"80",X"75",X"68",X"62",X"55",X"4D", + X"4A",X"4D",X"5D",X"75",X"93",X"AE",X"B6",X"AB",X"93",X"78",X"65",X"52",X"5A",X"5D",X"65",X"78", + X"88",X"88",X"80",X"75",X"70",X"68",X"5D",X"5A",X"5D",X"62",X"68",X"70",X"75",X"78",X"7D",X"7D", + X"80",X"78",X"70",X"65",X"5D",X"52",X"5A",X"70",X"8B",X"A3",X"AE",X"AE",X"A6",X"9B",X"90",X"83", + X"75",X"68",X"55",X"4D",X"4A",X"4A",X"4D",X"5A",X"78",X"93",X"B9",X"D4",X"E4",X"E1",X"CE",X"BE", + X"AE",X"9B",X"88",X"78",X"78",X"78",X"78",X"68",X"62",X"55",X"4D",X"3A",X"32",X"3A",X"4D",X"68", + X"7D",X"80",X"7D",X"78",X"75",X"7D",X"88",X"98",X"A3",X"AE",X"AE",X"AB",X"AE",X"B6",X"C6",X"D1", + X"D4",X"D4",X"C6",X"AB",X"98",X"83",X"78",X"65",X"4D",X"3F",X"3F",X"3F",X"4A",X"5A",X"68",X"70", + X"68",X"68",X"70",X"80",X"8B",X"93",X"8B",X"7D",X"70",X"6D",X"68",X"70",X"75",X"75",X"78",X"78", + X"75",X"68",X"65",X"62",X"6D",X"83",X"98",X"AE",X"B6",X"A6",X"98",X"90",X"80",X"75",X"68",X"5D", + X"62",X"68",X"80",X"93",X"9B",X"93",X"90",X"80",X"6D",X"5A",X"4A",X"42",X"47",X"52",X"5D",X"6D", + X"83",X"90",X"90",X"83",X"80",X"80",X"75",X"75",X"70",X"68",X"65",X"5A",X"52",X"4D",X"52",X"65", + X"7D",X"98",X"A6",X"AB",X"AB",X"A6",X"9E",X"9B",X"90",X"80",X"75",X"6D",X"65",X"52",X"52",X"52", + X"52",X"4D",X"42",X"3F",X"47",X"4A",X"55",X"5D",X"62",X"62",X"62",X"62",X"68",X"7D",X"88",X"93", + X"A3",X"9E",X"A3",X"98",X"90",X"90",X"98",X"A3",X"B6",X"C1",X"BE",X"B6",X"B3",X"AB",X"9B",X"88", + X"75",X"70",X"68",X"65",X"70",X"78",X"7D",X"70",X"68",X"68",X"68",X"68",X"65",X"62",X"5D",X"68", + X"7D",X"90",X"9B",X"9B",X"98",X"98",X"98",X"93",X"98",X"9E",X"9B",X"98",X"93",X"93",X"90",X"83", + X"80",X"80",X"78",X"68",X"62",X"62",X"65",X"75",X"83",X"88",X"8B",X"90",X"8B",X"7D",X"70",X"68", + X"65",X"5D",X"55",X"52",X"4D",X"4A",X"4D",X"5A",X"5D",X"65",X"70",X"80",X"8B",X"93",X"9E",X"9E", + X"9B",X"9E",X"A3",X"9B",X"98",X"90",X"88",X"83",X"83",X"88",X"90",X"A6",X"B9",X"BE",X"C1",X"C6", + X"C6",X"C6",X"B6",X"9B",X"83",X"65",X"52",X"4A",X"4D",X"5D",X"6D",X"80",X"8B",X"93",X"8B",X"80", + X"65",X"5A",X"52",X"52",X"52",X"47",X"3F",X"3A",X"47",X"52",X"5D",X"6D",X"83",X"93",X"9B",X"9E", + X"98",X"8B",X"88",X"80",X"80",X"78",X"6D",X"68",X"68",X"70",X"70",X"68",X"68",X"62",X"5A",X"5A", + X"5D",X"5A",X"5D",X"65",X"70",X"75",X"8B",X"98",X"9B",X"9B",X"9B",X"93",X"88",X"88",X"83",X"88", + X"88",X"93",X"9B",X"98",X"8B",X"80",X"78",X"70",X"68",X"68",X"70",X"80",X"88",X"90",X"93",X"9B", + X"9E",X"98",X"98",X"98",X"98",X"90",X"83",X"78",X"78",X"6D",X"6D",X"78",X"88",X"98",X"A3",X"AB", + X"AB",X"A6",X"98",X"83",X"70",X"52",X"47",X"37",X"32",X"27",X"27",X"37",X"47",X"4D",X"65",X"75", + X"88",X"90",X"98",X"90",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"68",X"62",X"5D",X"4D",X"42", + X"3A",X"3A",X"3F",X"47",X"52",X"5A",X"68",X"78",X"83",X"90",X"A3",X"AE",X"B6",X"B9",X"B6",X"AE", + X"B3",X"B6",X"C1",X"C6",X"BE",X"B9",X"B9",X"AE",X"9B",X"88",X"80",X"75",X"68",X"65",X"65",X"70", + X"78",X"83",X"8B",X"90",X"88",X"7D",X"65",X"5A",X"55",X"5A",X"52",X"4D",X"47",X"42",X"3F",X"47", + X"4A",X"52",X"65",X"7D",X"93",X"9B",X"98",X"93",X"90",X"93",X"9B",X"A6",X"AE",X"AE",X"A6",X"98", + X"8B",X"78",X"68",X"5A",X"52",X"52",X"5A",X"65",X"68",X"75",X"75",X"70",X"70",X"7D",X"80",X"83", + X"83",X"80",X"80",X"80",X"8B",X"98",X"A3",X"A3",X"A6",X"A3",X"9B",X"93",X"90",X"8B",X"88",X"80", + X"78",X"70",X"62",X"5A",X"5A",X"52",X"52",X"55",X"5A",X"62",X"68",X"75",X"70",X"6D",X"65",X"65", + X"68",X"6D",X"70",X"70",X"70",X"75",X"75",X"7D",X"83",X"88",X"93",X"9B",X"A3",X"A3",X"A6",X"A6", + X"A3",X"9E",X"93",X"88",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"7D",X"70",X"68",X"62", + X"62",X"68",X"70",X"78",X"7D",X"7D",X"78",X"75",X"68",X"68",X"62",X"62",X"68",X"78",X"78",X"7D", + X"75",X"68",X"6D",X"6D",X"70",X"75",X"7D",X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"80",X"83", + X"88",X"8B",X"88",X"83",X"80",X"80",X"83",X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D", + X"75",X"6D",X"68",X"75",X"80",X"83",X"88",X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"75",X"68",X"5D",X"52",X"4A",X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B", + X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B",X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62", + X"65",X"70",X"78",X"7D",X"80",X"88",X"8B",X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90", + X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"7D",X"78",X"78",X"75",X"70",X"70",X"6D",X"68",X"6D",X"70",X"78",X"80", + X"80",X"80",X"83",X"88",X"90",X"8B",X"8B",X"8B",X"88",X"80",X"7D",X"78",X"70",X"68",X"68",X"68", + X"68",X"6D",X"6D",X"70",X"78",X"7D",X"83",X"8B",X"8B",X"90",X"8B",X"88",X"88",X"88",X"88",X"83", + X"80",X"80",X"83",X"80",X"80",X"7D",X"83",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"78",X"78", + X"75",X"70",X"70",X"70",X"75",X"78",X"78",X"78",X"75",X"75",X"70",X"70",X"75",X"78",X"75",X"75", + X"75",X"75",X"78",X"7D",X"80",X"7D",X"7D",X"7D",X"83",X"88",X"8B",X"88",X"88",X"88",X"88",X"88", + X"8B",X"90",X"90",X"88",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"7D",X"7D",X"80",X"7D",X"78", + X"75",X"70",X"70",X"78",X"80",X"88",X"88",X"88",X"88",X"83",X"7D",X"78",X"78",X"80",X"83",X"83", + X"83",X"80",X"78",X"75",X"75",X"75",X"78",X"80",X"80",X"83",X"83",X"80",X"7D",X"78",X"6D",X"68", + X"65",X"62",X"5D",X"5A",X"62",X"65",X"68",X"75",X"80",X"8B",X"90",X"93",X"90",X"88",X"83",X"80", + X"78",X"75",X"75",X"70",X"68",X"65",X"5D",X"5D",X"55",X"5A",X"5D",X"65",X"68",X"75",X"75",X"80", + X"83",X"8B",X"90",X"9B",X"A3",X"A6",X"A6",X"9E",X"9B",X"98",X"98",X"9E",X"9E",X"A3",X"A3",X"A6", + X"A3",X"9B",X"8B",X"88",X"7D",X"75",X"6D",X"68",X"6D",X"75",X"7D",X"7D",X"83",X"83",X"80",X"75", + X"6D",X"68",X"68",X"68",X"65",X"62",X"5D",X"5A",X"5A",X"5D",X"62",X"68",X"78",X"80",X"83",X"80", + X"7D",X"80",X"83",X"8B",X"98",X"9B",X"9B",X"98",X"90",X"8B",X"7D",X"70",X"68",X"62",X"65",X"68", + X"70",X"78",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"7D",X"7D",X"7D",X"83",X"90",X"98", + X"9B",X"9E",X"9B",X"98",X"90",X"8B",X"83",X"83",X"7D",X"75",X"70",X"65",X"5D",X"5D",X"5A",X"5D", + X"62",X"65",X"68",X"75",X"75",X"75",X"75",X"68",X"6D",X"6D",X"70",X"70",X"75",X"70",X"75",X"75", + X"78",X"7D",X"83",X"90",X"98",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"88",X"83",X"7D",X"7D", + X"7D",X"80",X"83",X"80",X"80",X"7D",X"75",X"68",X"65",X"65",X"68",X"75",X"78",X"7D",X"78",X"78", + X"78",X"6D",X"68",X"65",X"68",X"6D",X"78",X"7D",X"7D",X"75",X"6D",X"6D",X"70",X"75",X"78",X"80", + X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"83",X"83",X"88",X"8B",X"88",X"83",X"80",X"80",X"83", + X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D",X"75",X"6D",X"68",X"75",X"80",X"83",X"88", + X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D",X"80",X"80",X"75",X"68",X"5D",X"52",X"4A", + X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B",X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B", + X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62",X"65",X"70",X"78",X"7D",X"80",X"88",X"8B", + X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90",X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D", + X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"75", + X"75",X"70",X"75",X"6D",X"68",X"6D",X"70",X"78",X"80",X"83",X"80",X"83",X"88",X"90",X"8B",X"8B", + X"88",X"83",X"7D",X"78",X"75",X"6D",X"68",X"68",X"68",X"65",X"68",X"68",X"68",X"70",X"75",X"7D", + X"88",X"83",X"88",X"88",X"80",X"83",X"83",X"88",X"8B",X"88",X"88",X"88",X"83",X"80",X"7D",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"7D",X"75",X"75",X"75",X"75",X"70", + X"70",X"68",X"68",X"68",X"68",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"83",X"83",X"83",X"88", + X"88",X"90",X"98",X"98",X"93",X"90",X"90",X"8B",X"88",X"88",X"8B",X"88",X"80",X"78",X"78",X"75", + X"70",X"68",X"68",X"65",X"68",X"70",X"78",X"78",X"78",X"75",X"75",X"70",X"78",X"80",X"83",X"83", + X"80",X"7D",X"70",X"68",X"65",X"68",X"70",X"7D",X"83",X"83",X"83",X"80",X"75",X"70",X"68",X"65", + X"65",X"65",X"68",X"6D",X"70",X"78",X"7D",X"7D",X"7D",X"83",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"80",X"83",X"8B",X"90",X"93",X"93",X"8B",X"83",X"7D",X"78",X"70",X"6D",X"68",X"65",X"65",X"62", + X"65",X"68",X"70",X"7D",X"88",X"88",X"93",X"90",X"90",X"90",X"90",X"93",X"93",X"93",X"98",X"90", + X"88",X"80",X"78",X"78",X"75",X"78",X"80",X"88",X"90",X"90",X"93",X"8B",X"8B",X"88",X"7D",X"78", + X"6D",X"65",X"65",X"68",X"6D",X"75",X"80",X"83",X"88",X"88",X"88",X"83",X"83",X"83",X"83",X"80", + X"7D",X"80",X"7D",X"75",X"6D",X"68",X"5D",X"55",X"52",X"52",X"62",X"68",X"70",X"75",X"75",X"75", + X"78",X"7D",X"83",X"80",X"83",X"83",X"83",X"83",X"88",X"8B",X"90",X"98",X"98",X"9B",X"9B",X"93", + X"8B",X"83",X"7D",X"78",X"78",X"70",X"75",X"7D",X"80",X"80",X"83",X"80",X"80",X"75",X"70",X"68", + X"68",X"68",X"65",X"68",X"68",X"65",X"68",X"70",X"78",X"7D",X"88",X"88",X"88",X"83",X"83",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75", + X"75",X"7D",X"83",X"83",X"88",X"83",X"88",X"83",X"88",X"83",X"83",X"8B",X"88",X"8B",X"88",X"88", + X"80",X"7D",X"7D",X"75",X"6D",X"68",X"6D",X"70",X"7D",X"80",X"7D",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80", + X"83",X"83",X"80",X"80",X"7D",X"78",X"75",X"70",X"68",X"6D",X"75",X"78",X"7D",X"80",X"80",X"80", + X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"88",X"88",X"8B",X"8B",X"8B", + X"8B",X"88",X"83",X"83",X"80",X"78",X"75",X"75",X"70",X"70",X"75",X"75",X"80",X"83",X"80",X"83", + X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70", + X"75",X"75",X"78",X"7D",X"7D",X"80",X"80",X"83",X"83",X"83",X"83",X"88",X"83",X"83",X"83",X"88", + X"83",X"83",X"88",X"8B",X"88",X"88",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"80",X"80",X"80", + X"83",X"83",X"83",X"7D",X"7D",X"75",X"75",X"75",X"75",X"75",X"70",X"75",X"75",X"75",X"78",X"83", + X"80",X"83",X"80",X"7D",X"80",X"78",X"78",X"80",X"80",X"80",X"7D",X"80",X"80",X"80",X"7D",X"75", + X"70",X"68",X"68",X"68",X"68",X"68",X"70",X"75",X"7D",X"83",X"8B",X"90",X"90",X"8B",X"83",X"80", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70",X"75",X"75", + X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"7D",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"83",X"83", + X"8B",X"8B",X"8B",X"88",X"83",X"83",X"80",X"83",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"7D",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78", + X"78",X"78",X"78",X"78",X"7D",X"80",X"78",X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D", + X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"78",X"7D",X"78",X"7D",X"80",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80", + X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"78",X"80", + X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"75",X"75",X"83",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"88",X"83", + X"80",X"80",X"7D",X"78",X"75",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"75",X"75",X"78", + X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"78",X"78",X"78",X"75",X"75",X"75",X"70",X"75",X"75",X"7D",X"7D",X"80",X"80",X"80", + X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"78",X"78",X"7D", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"78", + X"78",X"78",X"78",X"78",X"78",X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83", + X"83",X"83",X"88",X"83",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"7D",X"78",X"78",X"78",X"75",X"75", + X"75",X"78",X"7D",X"78",X"83",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"78",X"78",X"78",X"78",X"75",X"75",X"75",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80", + X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"78", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"80",X"83",X"83",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"78",X"78",X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D",X"78",X"78",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"83",X"80",X"80",X"83",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"7D",X"80",X"80",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"7D",X"78",X"78",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..5a0cf5cd --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1560 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 12287) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + x"00",x"AF",x"32",x"01",x"70",x"C3",x"C8",x"00", -- 0x0000 + x"41",x"5A",x"55",x"52",x"49",x"41",x"4E",x"20", -- 0x0008 + x"41",x"54",x"54",x"41",x"43",x"4B",x"20",x"43", -- 0x0010 + x"4F",x"50",x"59",x"52",x"49",x"47",x"48",x"54", -- 0x0018 + x"20",x"52",x"41",x"49",x"54",x"20",x"45",x"4C", -- 0x0020 + x"45",x"43",x"54",x"52",x"4F",x"4E",x"49",x"43", -- 0x0028 + x"53",x"20",x"4C",x"54",x"44",x"20",x"31",x"39", -- 0x0030 + x"38",x"32",x"20",x"41",x"4C",x"4C",x"20",x"52", -- 0x0038 + x"49",x"47",x"48",x"54",x"53",x"20",x"52",x"45", -- 0x0040 + x"53",x"45",x"52",x"56",x"45",x"44",x"00",x"00", -- 0x0048 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0050 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0058 + x"00",x"00",x"00",x"00",x"00",x"00",x"F5",x"C5", -- 0x0060 + x"D5",x"E5",x"DD",x"E5",x"FD",x"E5",x"3A",x"00", -- 0x0068 + x"78",x"AF",x"32",x"01",x"70",x"21",x"B6",x"40", -- 0x0070 + x"35",x"21",x"C0",x"41",x"11",x"00",x"58",x"01", -- 0x0078 + x"80",x"00",x"ED",x"B0",x"3A",x"AF",x"40",x"CB", -- 0x0080 + x"67",x"28",x"14",x"11",x"04",x"00",x"06",x"04", -- 0x0088 + x"21",x"63",x"58",x"3E",x"F3",x"96",x"77",x"19", -- 0x0090 + x"3E",x"5E",x"96",x"77",x"19",x"10",x"F4",x"CD", -- 0x0098 + x"F4",x"0F",x"3A",x"BF",x"40",x"A7",x"C4",x"CD", -- 0x00A0 + x"04",x"DD",x"21",x"AF",x"40",x"DD",x"CB",x"00", -- 0x00A8 + x"4E",x"C2",x"C3",x"18",x"CD",x"66",x"22",x"3E", -- 0x00B0 + x"FF",x"32",x"01",x"70",x"FD",x"E1",x"DD",x"E1", -- 0x00B8 + x"E1",x"D1",x"C1",x"F1",x"ED",x"45",x"00",x"00", -- 0x00C0 + x"31",x"00",x"44",x"CD",x"F4",x"12",x"AF",x"21", -- 0x00C8 + x"00",x"60",x"06",x"04",x"77",x"23",x"10",x"FC", -- 0x00D0 + x"3C",x"06",x"04",x"77",x"23",x"10",x"FC",x"AF", -- 0x00D8 + x"06",x"08",x"21",x"00",x"68",x"77",x"23",x"10", -- 0x00E0 + x"FC",x"06",x"08",x"21",x"01",x"70",x"77",x"23", -- 0x00E8 + x"10",x"FC",x"3D",x"32",x"00",x"78",x"21",x"16", -- 0x00F0 + x"11",x"11",x"00",x"40",x"01",x"00",x"01",x"ED", -- 0x00F8 + x"B0",x"06",x"01",x"3A",x"00",x"70",x"CB",x"47", -- 0x0100 + x"28",x"01",x"04",x"78",x"32",x"B2",x"40",x"32", -- 0x0108 + x"B1",x"40",x"CD",x"42",x"13",x"C3",x"BE",x"01", -- 0x0110 + x"31",x"00",x"44",x"DD",x"CB",x"00",x"DE",x"DD", -- 0x0118 + x"CB",x"00",x"96",x"DD",x"CB",x"00",x"8E",x"AF", -- 0x0120 + x"32",x"BF",x"40",x"32",x"EE",x"40",x"32",x"EF", -- 0x0128 + x"40",x"CD",x"42",x"13",x"CD",x"F4",x"12",x"CD", -- 0x0130 + x"B6",x"12",x"DD",x"36",x"1F",x"05",x"DD",x"36", -- 0x0138 + x"1E",x"04",x"21",x"A7",x"01",x"FD",x"21",x"0F", -- 0x0140 + x"53",x"06",x"11",x"CD",x"3F",x"12",x"DD",x"21", -- 0x0148 + x"AF",x"40",x"3A",x"00",x"68",x"CB",x"47",x"20", -- 0x0150 + x"06",x"CB",x"4F",x"20",x"2A",x"18",x"EF",x"DD", -- 0x0158 + x"CB",x"00",x"FE",x"DD",x"CB",x"00",x"B6",x"21", -- 0x0160 + x"D9",x"40",x"CB",x"DE",x"21",x"B8",x"01",x"FD", -- 0x0168 + x"21",x"01",x"51",x"06",x"06",x"CD",x"3F",x"12", -- 0x0170 + x"3A",x"B0",x"40",x"D6",x"01",x"27",x"32",x"B0", -- 0x0178 + x"40",x"CD",x"9E",x"12",x"C3",x"A9",x"05",x"3A", -- 0x0180 + x"B0",x"40",x"FE",x"02",x"38",x"C0",x"21",x"D9", -- 0x0188 + x"40",x"CB",x"DE",x"DD",x"CB",x"00",x"BE",x"DD", -- 0x0190 + x"CB",x"00",x"F6",x"D6",x"02",x"27",x"32",x"B0", -- 0x0198 + x"40",x"CD",x"9E",x"12",x"C3",x"A9",x"05",x"50", -- 0x01A0 + x"55",x"53",x"48",x"40",x"53",x"54",x"41",x"52", -- 0x01A8 + x"54",x"40",x"42",x"55",x"54",x"54",x"4F",x"4E", -- 0x01B0 + x"40",x"40",x"40",x"40",x"40",x"40",x"DD",x"21", -- 0x01B8 + x"C0",x"41",x"CD",x"F4",x"12",x"3E",x"64",x"CD", -- 0x01C0 + x"38",x"13",x"DD",x"36",x"07",x"01",x"DD",x"36", -- 0x01C8 + x"06",x"04",x"FD",x"21",x"23",x"53",x"3E",x"02", -- 0x01D0 + x"CD",x"38",x"13",x"11",x"E0",x"FF",x"21",x"7D", -- 0x01D8 + x"04",x"06",x"14",x"CD",x"64",x"04",x"3E",x"14", -- 0x01E0 + x"CD",x"38",x"13",x"DD",x"36",x"0F",x"02",x"FD", -- 0x01E8 + x"21",x"67",x"52",x"21",x"91",x"04",x"06",x"08", -- 0x01F0 + x"CD",x"64",x"04",x"3E",x"50",x"CD",x"38",x"13", -- 0x01F8 + x"DD",x"36",x"20",x"FC",x"DD",x"36",x"22",x"FC", -- 0x0200 + x"DD",x"36",x"1C",x"00",x"DD",x"36",x"3E",x"00", -- 0x0208 + x"DD",x"36",x"3F",x"01",x"21",x"B0",x"52",x"11", -- 0x0210 + x"99",x"04",x"06",x"0D",x"1A",x"77",x"13",x"23", -- 0x0218 + x"1A",x"77",x"13",x"23",x"23",x"23",x"1A",x"77", -- 0x0220 + x"13",x"23",x"1A",x"77",x"13",x"D5",x"11",x"DB", -- 0x0228 + x"FF",x"19",x"D1",x"10",x"E7",x"3E",x"24",x"32", -- 0x0230 + x"0E",x"51",x"3E",x"1D",x"32",x"EE",x"50",x"21", -- 0x0238 + x"D5",x"03",x"11",x"E0",x"FF",x"FD",x"21",x"BF", -- 0x0240 + x"52",x"06",x"0E",x"CD",x"73",x"04",x"21",x"DD", -- 0x0248 + x"41",x"22",x"C0",x"40",x"21",x"08",x"03",x"22", -- 0x0250 + x"C2",x"40",x"21",x"BF",x"40",x"CB",x"C6",x"CB", -- 0x0258 + x"CE",x"3E",x"FF",x"CD",x"38",x"13",x"CB",x"86", -- 0x0260 + x"CB",x"8E",x"CD",x"F4",x"12",x"3E",x"32",x"CD", -- 0x0268 + x"38",x"13",x"DD",x"36",x"00",x"FC",x"DD",x"36", -- 0x0270 + x"02",x"FC",x"DD",x"36",x"3E",x"00",x"DD",x"36", -- 0x0278 + x"3F",x"01",x"21",x"A0",x"52",x"11",x"99",x"04", -- 0x0280 + x"06",x"0D",x"1A",x"77",x"13",x"23",x"1A",x"77", -- 0x0288 + x"13",x"13",x"13",x"D5",x"11",x"DF",x"FF",x"19", -- 0x0290 + x"D1",x"10",x"EF",x"21",x"C1",x"41",x"22",x"C0", -- 0x0298 + x"40",x"21",x"03",x"02",x"22",x"C2",x"40",x"21", -- 0x02A0 + x"BF",x"40",x"CB",x"C6",x"DD",x"36",x"09",x"03", -- 0x02A8 + x"21",x"B3",x"03",x"FD",x"21",x"C4",x"52",x"06", -- 0x02B0 + x"0E",x"CD",x"3F",x"12",x"21",x"D5",x"03",x"11", -- 0x02B8 + x"E0",x"FF",x"FD",x"21",x"BF",x"52",x"06",x"0E", -- 0x02C0 + x"CD",x"73",x"04",x"3E",x"32",x"CD",x"38",x"13", -- 0x02C8 + x"11",x"00",x"42",x"21",x"C1",x"03",x"01",x"14", -- 0x02D0 + x"00",x"ED",x"B0",x"21",x"CE",x"41",x"06",x"10", -- 0x02D8 + x"36",x"60",x"23",x"36",x"04",x"23",x"10",x"F8", -- 0x02E0 + x"06",x"06",x"36",x"00",x"23",x"36",x"04",x"23", -- 0x02E8 + x"10",x"F8",x"DD",x"21",x"BF",x"40",x"DD",x"CB", -- 0x02F0 + x"00",x"DE",x"21",x"E3",x"03",x"06",x"05",x"C5", -- 0x02F8 + x"11",x"C4",x"40",x"01",x"0A",x"00",x"ED",x"B0", -- 0x0300 + x"FD",x"2A",x"CC",x"40",x"EB",x"2A",x"CA",x"40", -- 0x0308 + x"EB",x"DD",x"CB",x"00",x"D6",x"1A",x"BE",x"20", -- 0x0310 + x"FC",x"23",x"FD",x"36",x"00",x"01",x"DD",x"CB", -- 0x0318 + x"00",x"56",x"20",x"FA",x"C1",x"10",x"D8",x"3E", -- 0x0320 + x"32",x"CD",x"38",x"13",x"FD",x"21",x"B8",x"52", -- 0x0328 + x"DD",x"21",x"B8",x"51",x"21",x"4C",x"04",x"11", -- 0x0330 + x"E0",x"FF",x"06",x"02",x"FD",x"E5",x"DD",x"E5", -- 0x0338 + x"C5",x"7E",x"FD",x"77",x"00",x"23",x"FD",x"19", -- 0x0340 + x"7E",x"FD",x"77",x"00",x"23",x"3E",x"32",x"CD", -- 0x0348 + x"38",x"13",x"06",x"0A",x"7E",x"DD",x"77",x"00", -- 0x0350 + x"23",x"DD",x"19",x"10",x"F7",x"3E",x"32",x"CD", -- 0x0358 + x"38",x"13",x"C1",x"DD",x"E1",x"FD",x"E1",x"DD", -- 0x0360 + x"23",x"DD",x"23",x"DD",x"23",x"FD",x"23",x"FD", -- 0x0368 + x"23",x"FD",x"23",x"10",x"C7",x"3E",x"FF",x"CD", -- 0x0370 + x"38",x"13",x"AF",x"32",x"BF",x"40",x"CD",x"F4", -- 0x0378 + x"12",x"3E",x"32",x"CD",x"38",x"13",x"CD",x"B6", -- 0x0380 + x"12",x"CD",x"AA",x"12",x"3A",x"BC",x"40",x"3C", -- 0x0388 + x"FE",x"05",x"20",x"02",x"3E",x"01",x"32",x"BC", -- 0x0390 + x"40",x"32",x"1E",x"40",x"21",x"AF",x"40",x"CB", -- 0x0398 + x"D6",x"E5",x"CD",x"93",x"06",x"E1",x"CB",x"8E", -- 0x03A0 + x"3E",x"40",x"CD",x"38",x"13",x"CD",x"AA",x"12", -- 0x03A8 + x"C3",x"BE",x"01",x"46",x"41",x"54",x"41",x"4C", -- 0x03B0 + x"49",x"54",x"59",x"40",x"53",x"43",x"4F",x"52", -- 0x03B8 + x"45",x"00",x"14",x"03",x"3F",x"00",x"18",x"00", -- 0x03C0 + x"5C",x"00",x"13",x"06",x"6F",x"00",x"15",x"06", -- 0x03C8 + x"8B",x"00",x"32",x"04",x"A2",x"13",x"1F",x"20", -- 0x03D0 + x"29",x"22",x"19",x"17",x"18",x"24",x"10",x"01", -- 0x03D8 + x"09",x"08",x"02",x"1A",x"04",x"A9",x"51",x"0A", -- 0x03E0 + x"01",x"D2",x"41",x"00",x"42",x"50",x"24",x"04", -- 0x03E8 + x"AC",x"51",x"0A",x"01",x"D8",x"41",x"04",x"42", -- 0x03F0 + x"4C",x"2E",x"04",x"AF",x"51",x"0A",x"01",x"DE", -- 0x03F8 + x"41",x"08",x"42",x"50",x"38",x"04",x"B2",x"51", -- 0x0400 + x"0A",x"01",x"E4",x"41",x"0C",x"42",x"4C",x"42", -- 0x0408 + x"04",x"B5",x"51",x"0A",x"01",x"EA",x"41",x"10", -- 0x0410 + x"42",x"4C",x"10",x"05",x"03",x"10",x"20",x"1F", -- 0x0418 + x"19",x"1E",x"24",x"23",x"01",x"00",x"00",x"10", -- 0x0420 + x"20",x"1F",x"19",x"1E",x"24",x"23",x"02",x"00", -- 0x0428 + x"00",x"10",x"20",x"1F",x"19",x"1E",x"24",x"23", -- 0x0430 + x"01",x"05",x"00",x"10",x"20",x"1F",x"19",x"1E", -- 0x0438 + x"24",x"23",x"10",x"03",x"00",x"10",x"20",x"1F", -- 0x0440 + x"19",x"1E",x"24",x"23",x"0C",x"10",x"01",x"00", -- 0x0448 + x"00",x"10",x"20",x"1F",x"19",x"1E",x"24",x"23", -- 0x0450 + x"0D",x"10",x"10",x"05",x"00",x"10",x"20",x"1F", -- 0x0458 + x"19",x"1E",x"24",x"23",x"7E",x"FD",x"77",x"00", -- 0x0460 + x"23",x"FD",x"19",x"3E",x"0A",x"CD",x"38",x"13", -- 0x0468 + x"10",x"F2",x"C9",x"7E",x"FD",x"77",x"00",x"23", -- 0x0470 + x"FD",x"19",x"10",x"F7",x"C9",x"22",x"11",x"19", -- 0x0478 + x"24",x"10",x"15",x"1C",x"15",x"13",x"24",x"22", -- 0x0480 + x"1F",x"1E",x"19",x"13",x"23",x"10",x"1C",x"24", -- 0x0488 + x"14",x"20",x"22",x"15",x"23",x"15",x"1E",x"24", -- 0x0490 + x"23",x"68",x"6B",x"68",x"6B",x"69",x"6A",x"69", -- 0x0498 + x"6A",x"6C",x"6F",x"BB",x"B5",x"6D",x"6E",x"BA", -- 0x04A0 + x"B4",x"AC",x"AF",x"BB",x"B5",x"AD",x"AE",x"BA", -- 0x04A8 + x"B4",x"B0",x"B3",x"68",x"6B",x"B1",x"B2",x"69", -- 0x04B0 + x"6A",x"0A",x"0A",x"BD",x"BF",x"68",x"6B",x"BC", -- 0x04B8 + x"BE",x"69",x"6A",x"C1",x"C3",x"B7",x"B9",x"C0", -- 0x04C0 + x"C2",x"B6",x"B8",x"10",x"10",x"0F",x"DC",x"13", -- 0x04C8 + x"05",x"0F",x"DC",x"E0",x"04",x"0F",x"F5",x"DC", -- 0x04D0 + x"2F",x"05",x"F1",x"0F",x"DC",x"63",x"05",x"C9", -- 0x04D8 + x"DD",x"21",x"37",x"40",x"FD",x"21",x"04",x"42", -- 0x04E0 + x"DD",x"CB",x"00",x"56",x"F5",x"C4",x"D6",x"1C", -- 0x04E8 + x"F1",x"C0",x"F5",x"CD",x"67",x"0B",x"E6",x"0F", -- 0x04F0 + x"6F",x"26",x"00",x"29",x"11",x"89",x"05",x"19", -- 0x04F8 + x"7E",x"FD",x"77",x"00",x"23",x"7E",x"FD",x"77", -- 0x0500 + x"03",x"FD",x"36",x"01",x"13",x"DD",x"36",x"00", -- 0x0508 + x"07",x"F1",x"C9",x"21",x"C3",x"40",x"35",x"C0", -- 0x0510 + x"F5",x"36",x"03",x"2B",x"46",x"2A",x"C0",x"40", -- 0x0518 + x"7E",x"3C",x"FE",x"08",x"20",x"02",x"3E",x"01", -- 0x0520 + x"77",x"23",x"23",x"10",x"FB",x"F1",x"C9",x"2A", -- 0x0528 + x"CC",x"40",x"7E",x"A7",x"28",x"01",x"34",x"2A", -- 0x0530 + x"CA",x"40",x"35",x"20",x"05",x"21",x"BF",x"40", -- 0x0538 + x"CB",x"96",x"21",x"C9",x"40",x"35",x"C0",x"36", -- 0x0540 + x"08",x"2B",x"7E",x"A7",x"C8",x"35",x"2A",x"C6", -- 0x0548 + x"40",x"EB",x"2A",x"C4",x"40",x"7E",x"12",x"23", -- 0x0550 + x"22",x"C4",x"40",x"21",x"E0",x"FF",x"19",x"22", -- 0x0558 + x"C6",x"40",x"C9",x"3A",x"92",x"51",x"FE",x"10", -- 0x0560 + x"C8",x"21",x"45",x"40",x"FD",x"21",x"0C",x"42", -- 0x0568 + x"34",x"7E",x"E6",x"18",x"20",x"0A",x"FD",x"36", -- 0x0570 + x"02",x"07",x"3E",x"05",x"32",x"92",x"51",x"C9", -- 0x0578 + x"FD",x"36",x"02",x"06",x"AF",x"32",x"92",x"51", -- 0x0580 + x"C9",x"28",x"94",x"B8",x"94",x"AB",x"76",x"A0", -- 0x0588 + x"A6",x"40",x"A8",x"40",x"78",x"63",x"63",x"85", -- 0x0590 + x"6B",x"73",x"7C",x"59",x"8C",x"79",x"93",x"79", -- 0x0598 + x"99",x"89",x"A4",x"95",x"9C",x"60",x"A0",x"54", -- 0x05A0 + x"A8",x"DD",x"CB",x"00",x"EE",x"CD",x"17",x"13", -- 0x05A8 + x"CD",x"AA",x"12",x"06",x"03",x"3A",x"00",x"68", -- 0x05B0 + x"4F",x"CB",x"7F",x"28",x"02",x"06",x"05",x"78", -- 0x05B8 + x"32",x"1D",x"40",x"06",x"04",x"CB",x"71",x"28", -- 0x05C0 + x"02",x"06",x"02",x"3A",x"00",x"70",x"0F",x"0F", -- 0x05C8 + x"E6",x"01",x"EE",x"01",x"80",x"32",x"F4",x"40", -- 0x05D0 + x"21",x"1D",x"40",x"11",x"00",x"41",x"01",x"1A", -- 0x05D8 + x"00",x"ED",x"B0",x"21",x"A9",x"40",x"06",x"03", -- 0x05E0 + x"AF",x"77",x"23",x"10",x"FC",x"CD",x"4E",x"12", -- 0x05E8 + x"3A",x"AF",x"40",x"CB",x"7F",x"20",x"0D",x"21", -- 0x05F0 + x"AC",x"40",x"06",x"03",x"AF",x"77",x"23",x"10", -- 0x05F8 + x"FC",x"CD",x"57",x"12",x"21",x"BE",x"40",x"06", -- 0x0600 + x"50",x"3A",x"00",x"70",x"CB",x"4F",x"28",x"02", -- 0x0608 + x"06",x"70",x"78",x"F6",x"03",x"77",x"21",x"AF", -- 0x0610 + x"40",x"4E",x"06",x"00",x"CB",x"A6",x"CB",x"69", -- 0x0618 + x"20",x"0B",x"3A",x"00",x"70",x"CB",x"5F",x"28", -- 0x0620 + x"04",x"06",x"01",x"CB",x"E6",x"78",x"32",x"06", -- 0x0628 + x"70",x"32",x"07",x"70",x"11",x"E0",x"FF",x"21", -- 0x0630 + x"9F",x"53",x"06",x"06",x"3E",x"10",x"77",x"19", -- 0x0638 + x"10",x"FC",x"3A",x"1D",x"40",x"32",x"BF",x"53", -- 0x0640 + x"A7",x"28",x"0A",x"47",x"21",x"9F",x"53",x"3E", -- 0x0648 + x"0F",x"77",x"19",x"10",x"FC",x"DD",x"21",x"C0", -- 0x0650 + x"41",x"DD",x"36",x"13",x"02",x"DD",x"36",x"12", -- 0x0658 + x"04",x"DD",x"36",x"17",x"06",x"CD",x"2E",x"08", -- 0x0660 + x"06",x"06",x"C5",x"21",x"02",x"08",x"FD",x"21", -- 0x0668 + x"49",x"52",x"06",x"05",x"CD",x"3F",x"12",x"3E", -- 0x0670 + x"10",x"CD",x"38",x"13",x"21",x"F2",x"07",x"FD", -- 0x0678 + x"21",x"49",x"52",x"06",x"05",x"CD",x"3F",x"12", -- 0x0680 + x"3E",x"0A",x"CD",x"38",x"13",x"C1",x"10",x"DA", -- 0x0688 + x"CD",x"17",x"13",x"21",x"16",x"11",x"11",x"00", -- 0x0690 + x"40",x"01",x"15",x"00",x"ED",x"B0",x"21",x"4D", -- 0x0698 + x"11",x"11",x"37",x"40",x"01",x"70",x"00",x"ED", -- 0x06A0 + x"B0",x"21",x"95",x"0E",x"3A",x"1E",x"40",x"E6", -- 0x06A8 + x"03",x"20",x"03",x"21",x"40",x"10",x"CD",x"07", -- 0x06B0 + x"14",x"CD",x"C4",x"13",x"21",x"AF",x"40",x"CB", -- 0x06B8 + x"CE",x"CD",x"B9",x"07",x"3A",x"01",x"40",x"CB", -- 0x06C0 + x"47",x"C2",x"D2",x"06",x"CD",x"83",x"09",x"C3", -- 0x06C8 + x"C1",x"06",x"DD",x"21",x"37",x"40",x"06",x"07", -- 0x06D0 + x"11",x"10",x"00",x"DD",x"CB",x"00",x"FE",x"DD", -- 0x06D8 + x"19",x"10",x"F8",x"CD",x"B9",x"07",x"3A",x"16", -- 0x06E0 + x"40",x"A7",x"20",x"F7",x"3A",x"01",x"40",x"CB", -- 0x06E8 + x"57",x"28",x"F0",x"21",x"AF",x"40",x"CB",x"56", -- 0x06F0 + x"C0",x"CB",x"8E",x"3E",x"40",x"CD",x"38",x"13", -- 0x06F8 + x"21",x"00",x"68",x"AF",x"06",x"03",x"77",x"23", -- 0x0700 + x"10",x"FC",x"CD",x"17",x"13",x"3A",x"AF",x"40", -- 0x0708 + x"CB",x"77",x"C2",x"45",x"07",x"3A",x"1D",x"40", -- 0x0710 + x"A7",x"C2",x"95",x"07",x"CD",x"46",x"08",x"CD", -- 0x0718 + x"14",x"21",x"3A",x"1D",x"40",x"A7",x"C2",x"95", -- 0x0720 + x"07",x"21",x"06",x"70",x"AF",x"77",x"23",x"77", -- 0x0728 + x"21",x"AF",x"40",x"CB",x"A6",x"CD",x"07",x"08", -- 0x0730 + x"3E",x"64",x"CD",x"38",x"13",x"21",x"AF",x"40", -- 0x0738 + x"CB",x"9E",x"C3",x"BE",x"01",x"3A",x"1D",x"40", -- 0x0740 + x"A7",x"20",x"28",x"CD",x"07",x"08",x"DD",x"36", -- 0x0748 + x"17",x"06",x"3A",x"AF",x"40",x"4F",x"CD",x"2E", -- 0x0750 + x"08",x"3E",x"30",x"CD",x"38",x"13",x"CD",x"46", -- 0x0758 + x"08",x"CD",x"14",x"21",x"3A",x"00",x"41",x"A7", -- 0x0760 + x"20",x"10",x"3A",x"1D",x"40",x"A7",x"20",x"03", -- 0x0768 + x"C3",x"29",x"07",x"3A",x"00",x"41",x"A7",x"CA", -- 0x0770 + x"95",x"07",x"21",x"1D",x"40",x"11",x"00",x"41", -- 0x0778 + x"06",x"1A",x"1A",x"4F",x"7E",x"12",x"71",x"13", -- 0x0780 + x"23",x"10",x"F7",x"21",x"AF",x"40",x"3E",x"20", -- 0x0788 + x"AE",x"77",x"C3",x"95",x"07",x"3A",x"1E",x"40", -- 0x0790 + x"E6",x"03",x"CA",x"16",x"06",x"FD",x"21",x"37", -- 0x0798 + x"40",x"3D",x"20",x"06",x"FD",x"34",x"F7",x"C3", -- 0x07A0 + x"16",x"06",x"3D",x"20",x"06",x"FD",x"34",x"FC", -- 0x07A8 + x"C3",x"16",x"06",x"FD",x"34",x"FA",x"C3",x"16", -- 0x07B0 + x"06",x"3A",x"1E",x"40",x"E6",x"03",x"28",x"1F", -- 0x07B8 + x"CD",x"18",x"0B",x"CD",x"C4",x"08",x"CD",x"F6", -- 0x07C0 + x"25",x"CD",x"96",x"28",x"CD",x"11",x"1F",x"CD", -- 0x07C8 + x"7D",x"20",x"CD",x"08",x"14",x"CD",x"00",x"0C", -- 0x07D0 + x"CD",x"73",x"08",x"CD",x"F2",x"24",x"C9",x"CD", -- 0x07D8 + x"73",x"08",x"CD",x"08",x"14",x"CD",x"30",x"17", -- 0x07E0 + x"CD",x"7F",x"19",x"CD",x"54",x"0E",x"CD",x"4B", -- 0x07E8 + x"25",x"C9",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x07F0 + x"40",x"40",x"40",x"40",x"50",x"4C",x"41",x"59", -- 0x07F8 + x"45",x"52",x"52",x"45",x"41",x"44",x"59",x"DD", -- 0x0800 + x"21",x"C0",x"41",x"DD",x"36",x"13",x"02",x"DD", -- 0x0808 + x"36",x"12",x"04",x"3E",x"01",x"CD",x"38",x"13", -- 0x0810 + x"21",x"25",x"08",x"FD",x"21",x"89",x"52",x"06", -- 0x0818 + x"09",x"CD",x"3F",x"12",x"C9",x"47",x"41",x"4D", -- 0x0820 + x"45",x"40",x"4F",x"56",x"45",x"52",x"21",x"FC", -- 0x0828 + x"07",x"FD",x"21",x"6B",x"52",x"06",x"06",x"CD", -- 0x0830 + x"3F",x"12",x"3E",x"01",x"CB",x"69",x"20",x"02", -- 0x0838 + x"3E",x"02",x"32",x"8B",x"51",x"C9",x"11",x"A9", -- 0x0840 + x"40",x"3A",x"AF",x"40",x"4F",x"CB",x"6F",x"20", -- 0x0848 + x"03",x"11",x"AC",x"40",x"D5",x"21",x"B3",x"40", -- 0x0850 + x"E5",x"06",x"03",x"1A",x"BE",x"38",x"11",x"20", -- 0x0858 + x"04",x"23",x"13",x"10",x"F6",x"D1",x"E1",x"01", -- 0x0860 + x"03",x"00",x"ED",x"B0",x"CD",x"60",x"12",x"C9", -- 0x0868 + x"E1",x"E1",x"C9",x"06",x"01",x"11",x"A9",x"40", -- 0x0870 + x"3A",x"AF",x"40",x"CB",x"6F",x"20",x"05",x"11", -- 0x0878 + x"AC",x"40",x"CB",x"20",x"21",x"BE",x"40",x"78", -- 0x0880 + x"A6",x"C8",x"1A",x"A7",x"20",x"08",x"13",x"7E", -- 0x0888 + x"E6",x"F0",x"4F",x"1A",x"B9",x"D8",x"78",x"AE", -- 0x0890 + x"77",x"21",x"1D",x"40",x"34",x"11",x"E0",x"FF", -- 0x0898 + x"21",x"9F",x"53",x"06",x"06",x"3E",x"10",x"77", -- 0x08A0 + x"19",x"10",x"FC",x"3A",x"1D",x"40",x"32",x"BF", -- 0x08A8 + x"53",x"A7",x"28",x"0A",x"47",x"21",x"9F",x"53", -- 0x08B0 + x"3E",x"0F",x"77",x"19",x"10",x"FC",x"21",x"D9", -- 0x08B8 + x"40",x"CB",x"E6",x"C9",x"3A",x"01",x"40",x"CB", -- 0x08C0 + x"47",x"C0",x"DD",x"21",x"37",x"40",x"FD",x"21", -- 0x08C8 + x"04",x"42",x"3A",x"1E",x"40",x"E6",x"03",x"FE", -- 0x08D0 + x"01",x"CA",x"74",x"25",x"FE",x"02",x"CA",x"4B", -- 0x08D8 + x"27",x"FE",x"03",x"CA",x"58",x"1F",x"C9",x"1E", -- 0x08E0 + x"00",x"3A",x"00",x"42",x"FD",x"96",x"00",x"30", -- 0x08E8 + x"04",x"ED",x"44",x"CB",x"C3",x"47",x"3A",x"03", -- 0x08F0 + x"42",x"FD",x"96",x"03",x"30",x"04",x"ED",x"44", -- 0x08F8 + x"CB",x"CB",x"4F",x"B8",x"38",x"04",x"CB",x"FB", -- 0x0900 + x"48",x"47",x"CB",x"21",x"CB",x"21",x"78",x"B9", -- 0x0908 + x"30",x"0B",x"CB",x"20",x"80",x"30",x"0C",x"0E", -- 0x0910 + x"01",x"06",x"01",x"18",x"0A",x"0E",x"00",x"06", -- 0x0918 + x"02",x"18",x"04",x"0E",x"01",x"06",x"02",x"CB", -- 0x0920 + x"7B",x"28",x"03",x"78",x"41",x"4F",x"CB",x"43", -- 0x0928 + x"28",x"04",x"78",x"ED",x"44",x"47",x"CB",x"4B", -- 0x0930 + x"28",x"04",x"79",x"ED",x"44",x"4F",x"C9",x"DD", -- 0x0938 + x"21",x"37",x"40",x"FD",x"21",x"04",x"42",x"DD", -- 0x0940 + x"7E",x"DF",x"FE",x"07",x"C8",x"06",x"07",x"DD", -- 0x0948 + x"CB",x"00",x"56",x"CA",x"07",x"14",x"CD",x"78", -- 0x0950 + x"09",x"10",x"F4",x"C9",x"DD",x"21",x"37",x"40", -- 0x0958 + x"FD",x"21",x"04",x"42",x"06",x"07",x"FD",x"BE", -- 0x0960 + x"01",x"F5",x"C5",x"E5",x"CC",x"07",x"14",x"E1", -- 0x0968 + x"C1",x"F1",x"CD",x"78",x"09",x"10",x"EF",x"C9", -- 0x0970 + x"11",x"10",x"00",x"DD",x"19",x"11",x"04",x"00", -- 0x0978 + x"FD",x"19",x"C9",x"3A",x"1E",x"40",x"E6",x"03", -- 0x0980 + x"FE",x"01",x"CA",x"98",x"09",x"FE",x"02",x"CA", -- 0x0988 + x"B3",x"09",x"FE",x"03",x"CA",x"CE",x"09",x"C9", -- 0x0990 + x"21",x"2E",x"40",x"7E",x"A7",x"C0",x"3A",x"18", -- 0x0998 + x"40",x"FE",x"01",x"D0",x"21",x"CF",x"40",x"35", -- 0x09A0 + x"C0",x"23",x"35",x"C0",x"36",x"02",x"21",x"1E", -- 0x09A8 + x"40",x"34",x"C9",x"21",x"33",x"40",x"7E",x"A7", -- 0x09B0 + x"C0",x"21",x"16",x"40",x"7E",x"A7",x"C0",x"21", -- 0x09B8 + x"CF",x"40",x"35",x"C0",x"23",x"35",x"C0",x"36", -- 0x09C0 + x"02",x"21",x"1E",x"40",x"34",x"C9",x"21",x"31", -- 0x09C8 + x"40",x"7E",x"A7",x"C0",x"3A",x"19",x"40",x"A7", -- 0x09D0 + x"C0",x"01",x"00",x"01",x"C5",x"CD",x"B9",x"07", -- 0x09D8 + x"3A",x"16",x"40",x"A7",x"20",x"F7",x"C1",x"0B", -- 0x09E0 + x"78",x"B1",x"20",x"F0",x"21",x"AF",x"40",x"CB", -- 0x09E8 + x"8E",x"21",x"00",x"42",x"11",x"01",x"42",x"01", -- 0x09F0 + x"40",x"00",x"36",x"00",x"ED",x"B0",x"3E",x"50", -- 0x09F8 + x"CD",x"38",x"13",x"CD",x"17",x"13",x"3E",x"08", -- 0x0A00 + x"CD",x"38",x"13",x"3A",x"1E",x"40",x"3C",x"32", -- 0x0A08 + x"1E",x"40",x"CD",x"40",x"10",x"3E",x"20",x"CD", -- 0x0A10 + x"38",x"13",x"11",x"00",x"42",x"21",x"29",x"0A", -- 0x0A18 + x"01",x"04",x"00",x"ED",x"B0",x"E1",x"C3",x"BC", -- 0x0A20 + x"06",x"E0",x"11",x"01",x"E0",x"21",x"AF",x"40", -- 0x0A28 + x"CB",x"8E",x"21",x"00",x"68",x"AF",x"77",x"23", -- 0x0A30 + x"77",x"23",x"77",x"31",x"00",x"44",x"21",x"28", -- 0x0A38 + x"40",x"FD",x"21",x"05",x"53",x"AF",x"ED",x"67", -- 0x0A40 + x"FD",x"77",x"00",x"ED",x"67",x"FD",x"77",x"20", -- 0x0A48 + x"ED",x"67",x"2B",x"AF",x"ED",x"67",x"FD",x"77", -- 0x0A50 + x"40",x"ED",x"67",x"FD",x"77",x"60",x"ED",x"67", -- 0x0A58 + x"3E",x"60",x"CD",x"38",x"13",x"21",x"D1",x"41", -- 0x0A60 + x"22",x"C0",x"40",x"21",x"12",x"03",x"22",x"C2", -- 0x0A68 + x"40",x"3E",x"01",x"32",x"BF",x"40",x"06",x"11", -- 0x0A70 + x"FD",x"21",x"05",x"53",x"21",x"EF",x"40",x"E5", -- 0x0A78 + x"CB",x"FE",x"3E",x"01",x"CD",x"38",x"13",x"21", -- 0x0A80 + x"28",x"40",x"7E",x"90",x"27",x"77",x"F5",x"AF", -- 0x0A88 + x"ED",x"67",x"FD",x"77",x"00",x"ED",x"67",x"FD", -- 0x0A90 + x"77",x"20",x"ED",x"67",x"2B",x"F1",x"7E",x"DE", -- 0x0A98 + x"00",x"27",x"77",x"AF",x"ED",x"67",x"FD",x"77", -- 0x0AA0 + x"40",x"ED",x"67",x"FD",x"77",x"60",x"ED",x"67", -- 0x0AA8 + x"16",x"00",x"58",x"E5",x"C5",x"FD",x"E5",x"CD", -- 0x0AB0 + x"72",x"19",x"FD",x"E1",x"C1",x"E1",x"7E",x"A7", -- 0x0AB8 + x"20",x"C0",x"06",x"01",x"23",x"7E",x"A7",x"20", -- 0x0AC0 + x"B9",x"E1",x"CB",x"BE",x"3E",x"60",x"CD",x"38", -- 0x0AC8 + x"13",x"21",x"D1",x"41",x"3E",x"04",x"BE",x"20", -- 0x0AD0 + x"FD",x"AF",x"32",x"BF",x"40",x"21",x"14",x"0B", -- 0x0AD8 + x"FD",x"21",x"65",x"53",x"06",x"04",x"CD",x"3F", -- 0x0AE0 + x"12",x"3E",x"78",x"CD",x"38",x"13",x"CD",x"17", -- 0x0AE8 + x"13",x"21",x"1E",x"40",x"34",x"7E",x"E6",x"C0", -- 0x0AF0 + x"28",x"03",x"3E",x"3D",x"77",x"CD",x"7F",x"26", -- 0x0AF8 + x"21",x"00",x"42",x"36",x"80",x"23",x"36",x"10", -- 0x0B00 + x"23",x"36",x"01",x"23",x"36",x"80",x"CD",x"95", -- 0x0B08 + x"0E",x"C3",x"BC",x"06",x"48",x"4F",x"4D",x"45", -- 0x0B10 + x"DD",x"21",x"37",x"40",x"FD",x"21",x"04",x"42", -- 0x0B18 + x"21",x"16",x"40",x"06",x"07",x"AF",x"77",x"23", -- 0x0B20 + x"10",x"FC",x"06",x"07",x"DD",x"CB",x"00",x"56", -- 0x0B28 + x"28",x"17",x"DD",x"CB",x"00",x"46",x"20",x"11", -- 0x0B30 + x"FD",x"7E",x"01",x"D6",x"13",x"FE",x"07",x"30", -- 0x0B38 + x"08",x"21",x"16",x"40",x"34",x"85",x"6F",x"23", -- 0x0B40 + x"34",x"CD",x"78",x"09",x"10",x"DE",x"C9",x"DD", -- 0x0B48 + x"CB",x"00",x"46",x"C0",x"AF",x"FD",x"77",x"00", -- 0x0B50 + x"FD",x"77",x"01",x"FD",x"77",x"03",x"DD",x"CB", -- 0x0B58 + x"00",x"8E",x"DD",x"CB",x"00",x"96",x"C9",x"E5", -- 0x0B60 + x"21",x"A7",x"40",x"7E",x"0F",x"AE",x"07",x"23", -- 0x0B68 + x"34",x"86",x"EA",x"76",x"0B",x"34",x"2B",x"77", -- 0x0B70 + x"E1",x"C9",x"05",x"20",x"05",x"20",x"05",x"20", -- 0x0B78 + x"05",x"20",x"05",x"20",x"05",x"21",x"05",x"22", -- 0x0B80 + x"05",x"12",x"05",x"02",x"05",x"12",x"05",x"11", -- 0x0B88 + x"05",x"FE",x"05",x"20",x"05",x"2F",x"05",x"1F", -- 0x0B90 + x"05",x"1E",x"05",x"0E",x"05",x"1E",x"05",x"1F", -- 0x0B98 + x"05",x"2F",x"05",x"20",x"05",x"21",x"05",x"11", -- 0x0BA0 + x"05",x"12",x"05",x"02",x"05",x"F2",x"05",x"F1", -- 0x0BA8 + x"05",x"E1",x"05",x"E0",x"05",x"E1",x"05",x"F1", -- 0x0BB0 + x"05",x"F1",x"05",x"F1",x"05",x"F1",x"05",x"F1", -- 0x0BB8 + x"05",x"E1",x"05",x"E0",x"05",x"E1",x"05",x"F1", -- 0x0BC0 + x"05",x"F2",x"05",x"02",x"05",x"12",x"05",x"11", -- 0x0BC8 + x"05",x"21",x"05",x"20",x"05",x"2F",x"05",x"1F", -- 0x0BD0 + x"05",x"1E",x"05",x"0E",x"05",x"FE",x"05",x"FF", -- 0x0BD8 + x"05",x"EF",x"05",x"E0",x"05",x"E0",x"05",x"FF", -- 0x0BE0 + x"05",x"FF",x"05",x"FF",x"05",x"FF",x"05",x"FF", -- 0x0BE8 + x"05",x"FF",x"05",x"FF",x"05",x"FE",x"05",x"0E", -- 0x0BF0 + x"05",x"1E",x"05",x"1F",x"05",x"1E",x"05",x"20", -- 0x0BF8 + x"3A",x"01",x"40",x"CB",x"47",x"C0",x"FD",x"21", -- 0x0C00 + x"00",x"42",x"FD",x"66",x"00",x"FD",x"6E",x"03", -- 0x0C08 + x"DD",x"21",x"37",x"40",x"FD",x"21",x"04",x"42", -- 0x0C10 + x"06",x"07",x"DD",x"CB",x"00",x"56",x"E5",x"C5", -- 0x0C18 + x"C4",x"2B",x"0C",x"C1",x"E1",x"CD",x"78",x"09", -- 0x0C20 + x"10",x"F0",x"C9",x"DD",x"CB",x"00",x"46",x"C0", -- 0x0C28 + x"7C",x"FD",x"96",x"00",x"57",x"30",x"02",x"ED", -- 0x0C30 + x"44",x"FE",x"10",x"D0",x"47",x"3E",x"10",x"90", -- 0x0C38 + x"47",x"7D",x"FD",x"96",x"03",x"4F",x"30",x"02", -- 0x0C40 + x"ED",x"44",x"FE",x"10",x"D0",x"7A",x"F5",x"21", -- 0x0C48 + x"AC",x"14",x"FD",x"7E",x"01",x"D6",x"13",x"FE", -- 0x0C50 + x"06",x"D2",x"C8",x"0C",x"0F",x"0F",x"0F",x"5F", -- 0x0C58 + x"16",x"00",x"19",x"E5",x"21",x"D9",x"0C",x"3A", -- 0x0C60 + x"01",x"42",x"BE",x"28",x"05",x"23",x"23",x"23", -- 0x0C68 + x"18",x"F8",x"23",x"5E",x"23",x"56",x"E1",x"F1", -- 0x0C70 + x"A7",x"FA",x"AF",x"0C",x"CB",x"27",x"85",x"6F", -- 0x0C78 + x"3E",x"00",x"8C",x"67",x"EB",x"1A",x"81",x"C6", -- 0x0C80 + x"20",x"23",x"BE",x"DA",x"BC",x"0C",x"2B",x"13", -- 0x0C88 + x"1A",x"81",x"C6",x"20",x"BE",x"28",x"03",x"D2", -- 0x0C90 + x"C2",x"0C",x"3A",x"1E",x"40",x"E6",x"03",x"CA", -- 0x0C98 + x"79",x"0E",x"CD",x"EB",x"18",x"DD",x"CB",x"00", -- 0x0CA0 + x"C6",x"21",x"01",x"40",x"CB",x"C6",x"C9",x"ED", -- 0x0CA8 + x"44",x"CB",x"27",x"83",x"5F",x"3E",x"00",x"8A", -- 0x0CB0 + x"57",x"C3",x"84",x"0C",x"13",x"13",x"23",x"10", -- 0x0CB8 + x"C4",x"C9",x"23",x"23",x"13",x"10",x"BE",x"C9", -- 0x0CC0 + x"21",x"F1",x"0D",x"FD",x"7E",x"01",x"11",x"20", -- 0x0CC8 + x"00",x"BE",x"23",x"CA",x"63",x"0C",x"19",x"18", -- 0x0CD0 + x"F8",x"10",x"F1",x"0C",x"50",x"11",x"0D",x"11", -- 0x0CD8 + x"31",x"0D",x"91",x"51",x"0D",x"12",x"71",x"0D", -- 0x0CE0 + x"52",x"91",x"0D",x"92",x"B1",x"0D",x"D2",x"D1", -- 0x0CE8 + x"0D",x"25",x"21",x"24",x"21",x"24",x"21",x"29", -- 0x0CF0 + x"23",x"2A",x"23",x"2B",x"23",x"2C",x"23",x"2B", -- 0x0CF8 + x"23",x"2A",x"23",x"29",x"23",x"24",x"21",x"24", -- 0x0D00 + x"21",x"25",x"21",x"50",x"50",x"50",x"50",x"50", -- 0x0D08 + x"50",x"50",x"50",x"50",x"50",x"50",x"50",x"2E", -- 0x0D10 + x"2A",x"2E",x"2B",x"2E",x"2B",x"2C",x"26",x"2C", -- 0x0D18 + x"25",x"2C",x"24",x"2C",x"23",x"2C",x"24",x"2C", -- 0x0D20 + x"25",x"2C",x"26",x"2E",x"2B",x"2E",x"2B",x"2E", -- 0x0D28 + x"2A",x"2C",x"22",x"2C",x"22",x"2C",x"22",x"2C", -- 0x0D30 + x"22",x"2C",x"22",x"2C",x"22",x"29",x"25",x"29", -- 0x0D38 + x"25",x"28",x"26",x"28",x"26",x"28",x"26",x"28", -- 0x0D40 + x"26",x"2A",x"24",x"29",x"25",x"28",x"26",x"27", -- 0x0D48 + x"27",x"28",x"28",x"29",x"27",x"2A",x"26",x"2B", -- 0x0D50 + x"25",x"29",x"27",x"29",x"27",x"29",x"27",x"29", -- 0x0D58 + x"27",x"2A",x"26",x"2A",x"26",x"2D",x"23",x"2D", -- 0x0D60 + x"23",x"2D",x"23",x"2D",x"23",x"2D",x"23",x"2D", -- 0x0D68 + x"23",x"2B",x"2B",x"2B",x"2A",x"2B",x"29",x"2D", -- 0x0D70 + x"2A",x"2B",x"2A",x"2B",x"29",x"2B",x"29",x"2B", -- 0x0D78 + x"26",x"2C",x"25",x"2F",x"24",x"2F",x"24",x"2F", -- 0x0D80 + x"25",x"2F",x"26",x"2F",x"2C",x"2F",x"2C",x"2F", -- 0x0D88 + x"2B",x"24",x"24",x"25",x"22",x"26",x"22",x"25", -- 0x0D90 + x"22",x"25",x"24",x"26",x"24",x"26",x"24",x"29", -- 0x0D98 + x"24",x"2A",x"23",x"2B",x"20",x"2B",x"20",x"2A", -- 0x0DA0 + x"20",x"29",x"20",x"23",x"20",x"23",x"20",x"24", -- 0x0DA8 + x"20",x"2F",x"2B",x"2F",x"2C",x"2F",x"2C",x"2F", -- 0x0DB0 + x"26",x"2F",x"25",x"2F",x"24",x"2F",x"24",x"2C", -- 0x0DB8 + x"25",x"2B",x"26",x"2B",x"29",x"2B",x"29",x"2B", -- 0x0DC0 + x"2A",x"2D",x"2A",x"2B",x"29",x"2B",x"2A",x"2B", -- 0x0DC8 + x"2B",x"24",x"20",x"23",x"20",x"23",x"20",x"29", -- 0x0DD0 + x"20",x"2A",x"20",x"2B",x"20",x"2B",x"20",x"2A", -- 0x0DD8 + x"23",x"29",x"24",x"26",x"24",x"26",x"24",x"25", -- 0x0DE0 + x"24",x"25",x"22",x"26",x"22",x"25",x"22",x"24", -- 0x0DE8 + x"24",x"33",x"0F",x"08",x"0F",x"08",x"0F",x"08", -- 0x0DF0 + x"0F",x"08",x"0F",x"08",x"0F",x"08",x"0F",x"08", -- 0x0DF8 + x"0F",x"08",x"0F",x"08",x"0F",x"06",x"0F",x"04", -- 0x0E00 + x"0F",x"02",x"0F",x"00",x"0F",x"00",x"0F",x"00", -- 0x0E08 + x"0F",x"00",x"B3",x"0F",x"00",x"0F",x"00",x"0F", -- 0x0E10 + x"00",x"0F",x"00",x"0F",x"02",x"0F",x"04",x"0F", -- 0x0E18 + x"06",x"0F",x"08",x"0F",x"08",x"0F",x"08",x"0F", -- 0x0E20 + x"08",x"0F",x"08",x"0F",x"08",x"0F",x"08",x"0F", -- 0x0E28 + x"08",x"0F",x"08",x"97",x"0F",x"06",x"0F",x"05", -- 0x0E30 + x"0F",x"04",x"0F",x"03",x"0F",x"02",x"0F",x"01", -- 0x0E38 + x"0F",x"00",x"0F",x"00",x"0F",x"00",x"0F",x"00", -- 0x0E40 + x"0F",x"00",x"0F",x"00",x"0F",x"00",x"0F",x"00", -- 0x0E48 + x"0F",x"00",x"0F",x"00",x"3A",x"01",x"40",x"CB", -- 0x0E50 + x"47",x"C0",x"FD",x"21",x"00",x"42",x"FD",x"66", -- 0x0E58 + x"00",x"FD",x"6E",x"03",x"FD",x"21",x"04",x"42", -- 0x0E60 + x"06",x"04",x"E5",x"C5",x"CD",x"30",x"0C",x"C1", -- 0x0E68 + x"E1",x"11",x"04",x"00",x"FD",x"19",x"10",x"F2", -- 0x0E70 + x"C9",x"E1",x"E1",x"E1",x"FD",x"7E",x"01",x"FE", -- 0x0E78 + x"33",x"28",x"0A",x"FE",x"B3",x"28",x"06",x"21", -- 0x0E80 + x"01",x"40",x"CB",x"C6",x"C9",x"1A",x"FE",x"08", -- 0x0E88 + x"20",x"F5",x"C3",x"2D",x"0A",x"0E",x"02",x"21", -- 0x0E90 + x"C4",x"41",x"11",x"F0",x"0F",x"1A",x"47",x"13", -- 0x0E98 + x"1A",x"13",x"36",x"00",x"23",x"77",x"23",x"10", -- 0x0EA0 + x"F9",x"0D",x"20",x"F1",x"21",x"11",x"0F",x"46", -- 0x0EA8 + x"23",x"C5",x"5E",x"23",x"56",x"23",x"46",x"23", -- 0x0EB0 + x"4E",x"23",x"D5",x"C5",x"06",x"00",x"ED",x"B0", -- 0x0EB8 + x"C1",x"D1",x"E5",x"21",x"20",x"00",x"19",x"EB", -- 0x0EC0 + x"E1",x"10",x"EF",x"C1",x"10",x"E3",x"3E",x"2C", -- 0x0EC8 + x"06",x"26",x"21",x"A0",x"0F",x"5E",x"23",x"56", -- 0x0ED0 + x"23",x"12",x"10",x"F9",x"C9",x"3A",x"B6",x"40", -- 0x0ED8 + x"A7",x"C0",x"3E",x"0A",x"32",x"B6",x"40",x"3A", -- 0x0EE0 + x"09",x"40",x"CB",x"27",x"21",x"A0",x"0F",x"5F", -- 0x0EE8 + x"16",x"00",x"19",x"5E",x"23",x"56",x"3E",x"2C", -- 0x0EF0 + x"12",x"CD",x"67",x"0B",x"E6",x"1F",x"32",x"09", -- 0x0EF8 + x"40",x"CB",x"27",x"21",x"A0",x"0F",x"5F",x"16", -- 0x0F00 + x"00",x"19",x"5E",x"23",x"56",x"3E",x"10",x"12", -- 0x0F08 + x"C9",x"03",x"42",x"50",x"0C",x"06",x"2D",x"2D", -- 0x0F10 + x"2D",x"92",x"AA",x"10",x"2D",x"2D",x"2D",x"93", -- 0x0F18 + x"A9",x"0B",x"2D",x"2D",x"2D",x"94",x"A8",x"AB", -- 0x0F20 + x"2D",x"2D",x"92",x"95",x"10",x"10",x"2D",x"2D", -- 0x0F28 + x"96",x"A7",x"10",x"10",x"2D",x"98",x"97",x"10", -- 0x0F30 + x"10",x"10",x"2D",x"99",x"A1",x"10",x"10",x"10", -- 0x0F38 + x"98",x"A0",x"A2",x"A6",x"10",x"10",x"9A",x"9F", -- 0x0F40 + x"10",x"A5",x"10",x"10",x"9B",x"9E",x"A3",x"A4", -- 0x0F48 + x"10",x"10",x"9C",x"10",x"10",x"10",x"10",x"10", -- 0x0F50 + x"9D",x"10",x"10",x"10",x"10",x"10",x"59",x"50", -- 0x0F58 + x"08",x"06",x"35",x"2E",x"3D",x"2D",x"2D",x"2D", -- 0x0F60 + x"34",x"2E",x"3C",x"81",x"85",x"88",x"33",x"39", -- 0x0F68 + x"3B",x"2E",x"84",x"87",x"32",x"2D",x"2D",x"80", -- 0x0F70 + x"83",x"2D",x"31",x"2D",x"2D",x"2D",x"2D",x"2D", -- 0x0F78 + x"30",x"38",x"2D",x"2D",x"2D",x"2D",x"2F",x"37", -- 0x0F80 + x"2D",x"3F",x"2D",x"2D",x"10",x"36",x"3A",x"3E", -- 0x0F88 + x"82",x"86",x"90",x"53",x"02",x"05",x"8A",x"8C", -- 0x0F90 + x"8E",x"90",x"10",x"89",x"8B",x"8D",x"8F",x"91", -- 0x0F98 + x"72",x"50",x"D1",x"50",x"EF",x"50",x"0E",x"51", -- 0x0FA0 + x"10",x"51",x"4E",x"51",x"94",x"51",x"F8",x"51", -- 0x0FA8 + x"19",x"52",x"83",x"53",x"5A",x"52",x"78",x"52", -- 0x0FB0 + x"9A",x"52",x"9E",x"52",x"B3",x"52",x"B9",x"52", -- 0x0FB8 + x"BB",x"52",x"DA",x"52",x"DD",x"52",x"FB",x"52", -- 0x0FC0 + x"43",x"53",x"18",x"53",x"1A",x"53",x"1C",x"53", -- 0x0FC8 + x"3D",x"53",x"3E",x"53",x"54",x"53",x"5C",x"53", -- 0x0FD0 + x"77",x"53",x"7D",x"53",x"9A",x"53",x"B8",x"53", -- 0x0FD8 + x"BB",x"53",x"BE",x"53",x"A2",x"53",x"44",x"53", -- 0x0FE0 + x"A7",x"53",x"28",x"53",x"00",x"50",x"00",x"50", -- 0x0FE8 + x"06",x"06",x"17",x"03",x"DD",x"21",x"AF",x"40", -- 0x0FF0 + x"3A",x"00",x"60",x"CB",x"67",x"C2",x"3A",x"10", -- 0x0FF8 + x"DD",x"CB",x"00",x"46",x"28",x"27",x"DD",x"7E", -- 0x1000 + x"01",x"FE",x"99",x"28",x"1C",x"DD",x"35",x"02", -- 0x1008 + x"20",x"17",x"DD",x"7E",x"01",x"C6",x"01",x"27", -- 0x1010 + x"DD",x"77",x"01",x"DD",x"7E",x"03",x"DD",x"77", -- 0x1018 + x"02",x"CD",x"9E",x"12",x"21",x"D9",x"40",x"CB", -- 0x1020 + x"D6",x"DD",x"CB",x"00",x"86",x"DD",x"7E",x"01", -- 0x1028 + x"A7",x"C8",x"DD",x"CB",x"00",x"5E",x"CA",x"18", -- 0x1030 + x"01",x"C9",x"DD",x"CB",x"00",x"C6",x"18",x"ED", -- 0x1038 + x"21",x"CB",x"41",x"36",x"02",x"23",x"23",x"06", -- 0x1040 + x"18",x"3E",x"04",x"77",x"23",x"23",x"10",x"FB", -- 0x1048 + x"21",x"C2",x"10",x"11",x"04",x"42",x"01",x"10", -- 0x1050 + x"00",x"ED",x"B0",x"3A",x"AF",x"40",x"CB",x"67", -- 0x1058 + x"28",x"0A",x"21",x"04",x"42",x"35",x"35",x"21", -- 0x1060 + x"08",x"42",x"35",x"35",x"11",x"E0",x"FF",x"21", -- 0x1068 + x"0E",x"11",x"FD",x"21",x"A5",x"53",x"06",x"08", -- 0x1070 + x"CD",x"73",x"04",x"21",x"BC",x"10",x"11",x"D2", -- 0x1078 + x"41",x"06",x"06",x"7E",x"12",x"13",x"13",x"12", -- 0x1080 + x"13",x"13",x"13",x"13",x"23",x"10",x"F4",x"21", -- 0x1088 + x"A9",x"53",x"DD",x"21",x"D2",x"10",x"06",x"1E", -- 0x1090 + x"E5",x"C5",x"DD",x"5E",x"00",x"DD",x"23",x"DD", -- 0x1098 + x"56",x"00",x"DD",x"23",x"06",x"06",x"73",x"23", -- 0x10A0 + x"72",x"23",x"23",x"10",x"F9",x"C1",x"E1",x"11", -- 0x10A8 + x"E0",x"FF",x"19",x"10",x"E3",x"21",x"99",x"99", -- 0x10B0 + x"22",x"27",x"40",x"C9",x"20",x"90",x"F7",x"63", -- 0x10B8 + x"AA",x"00",x"31",x"33",x"02",x"30",x"21",x"B3", -- 0x10C0 + x"02",x"30",x"10",x"97",x"02",x"30",x"40",x"17", -- 0x10C8 + x"02",x"30",x"10",x"0C",x"CA",x"CB",x"C8",x"C9", -- 0x10D0 + x"0C",x"10",x"10",x"0E",x"0C",x"0D",x"10",x"10", -- 0x10D8 + x"CA",x"CB",x"C8",x"C9",x"10",x"10",x"0D",x"0C", -- 0x10E0 + x"10",x"0E",x"0C",x"10",x"CA",x"CB",x"C8",x"C9", -- 0x10E8 + x"0E",x"10",x"CA",x"CB",x"C8",x"C9",x"0C",x"10", -- 0x10F0 + x"0E",x"0D",x"10",x"0C",x"CA",x"CB",x"C8",x"C9", -- 0x10F8 + x"CA",x"CB",x"C8",x"C9",x"0C",x"0E",x"0C",x"0D", -- 0x1100 + x"0E",x"10",x"0D",x"0C",x"0C",x"10",x"64",x"66", -- 0x1108 + x"18",x"1F",x"1D",x"15",x"67",x"65",x"03",x"00", -- 0x1110 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1118 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1120 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1128 + x"00",x"00",x"00",x"03",x"01",x"0F",x"10",x"0A", -- 0x1130 + x"13",x"08",x"17",x"19",x"20",x"99",x"99",x"01", -- 0x1138 + x"00",x"3C",x"00",x"01",x"15",x"03",x"03",x"23", -- 0x1140 + x"02",x"0A",x"32",x"FF",x"10",x"00",x"00",x"00", -- 0x1148 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1150 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1190 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x11A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x11A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x11B0 + x"00",x"00",x"00",x"00",x"00",x"AA",x"02",x"00", -- 0x11B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x11C0 + x"01",x"00",x"50",x"00",x"00",x"00",x"01",x"00", -- 0x11C8 + x"00",x"01",x"00",x"01",x"00",x"00",x"00",x"00", -- 0x11D0 + x"00",x"03",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x11D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"03",x"01", -- 0x11E0 + x"01",x"01",x"01",x"01",x"01",x"01",x"01",x"00", -- 0x11E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x11F0 + x"FF",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x11F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1200 + x"00",x"00",x"FF",x"00",x"00",x"00",x"00",x"00", -- 0x1208 + x"00",x"00",x"00",x"00",x"00",x"00",x"21",x"23", -- 0x1210 + x"12",x"FD",x"21",x"A0",x"53",x"06",x"1C",x"CD", -- 0x1218 + x"3F",x"12",x"C9",x"53",x"43",x"4F",x"52",x"45", -- 0x1220 + x"5B",x"31",x"40",x"40",x"48",x"49",x"47",x"48", -- 0x1228 + x"40",x"53",x"43",x"4F",x"52",x"45",x"40",x"40", -- 0x1230 + x"53",x"43",x"4F",x"52",x"45",x"5B",x"32",x"11", -- 0x1238 + x"E0",x"FF",x"7E",x"23",x"D6",x"30",x"FD",x"77", -- 0x1240 + x"00",x"FD",x"19",x"10",x"F5",x"C9",x"21",x"A9", -- 0x1248 + x"40",x"FD",x"21",x"81",x"53",x"18",x"12",x"21", -- 0x1250 + x"AC",x"40",x"FD",x"21",x"01",x"51",x"18",x"09", -- 0x1258 + x"21",x"B3",x"40",x"FD",x"21",x"41",x"52",x"18", -- 0x1260 + x"00",x"06",x"03",x"11",x"E0",x"FF",x"0E",x"00", -- 0x1268 + x"7E",x"F5",x"1F",x"1F",x"1F",x"1F",x"CD",x"8A", -- 0x1270 + x"12",x"78",x"FE",x"01",x"CC",x"87",x"12",x"F1", -- 0x1278 + x"CD",x"8A",x"12",x"23",x"10",x"EA",x"C9",x"CB", -- 0x1280 + x"C1",x"C9",x"E6",x"0F",x"20",x"0C",x"CB",x"41", -- 0x1288 + x"20",x"08",x"3E",x"10",x"FD",x"77",x"00",x"FD", -- 0x1290 + x"19",x"C9",x"CB",x"C1",x"18",x"F6",x"FD",x"21", -- 0x1298 + x"7F",x"50",x"21",x"B0",x"40",x"06",x"01",x"C3", -- 0x12A0 + x"6B",x"12",x"21",x"16",x"11",x"11",x"00",x"40", -- 0x12A8 + x"01",x"A9",x"00",x"ED",x"B0",x"C9",x"DD",x"21", -- 0x12B0 + x"C0",x"41",x"DD",x"36",x"00",x"00",x"DD",x"36", -- 0x12B8 + x"01",x"03",x"CD",x"16",x"12",x"DD",x"36",x"02", -- 0x12C0 + x"00",x"DD",x"36",x"03",x"01",x"CD",x"4E",x"12", -- 0x12C8 + x"CD",x"57",x"12",x"CD",x"60",x"12",x"DD",x"36", -- 0x12D0 + x"3E",x"00",x"DD",x"36",x"3F",x"01",x"21",x"EE", -- 0x12D8 + x"12",x"FD",x"21",x"5F",x"51",x"06",x"06",x"CD", -- 0x12E0 + x"3F",x"12",x"CD",x"9E",x"12",x"C9",x"43",x"52", -- 0x12E8 + x"45",x"44",x"49",x"54",x"21",x"00",x"50",x"01", -- 0x12F0 + x"00",x"04",x"36",x"10",x"23",x"0B",x"79",x"B0", -- 0x12F8 + x"20",x"F8",x"21",x"C0",x"41",x"06",x"FF",x"36", -- 0x1300 + x"00",x"23",x"10",x"FB",x"21",x"00",x"42",x"06", -- 0x1308 + x"40",x"36",x"00",x"23",x"10",x"FB",x"C9",x"11", -- 0x1310 + x"03",x"00",x"21",x"02",x"50",x"0E",x"20",x"06", -- 0x1318 + x"1D",x"36",x"10",x"23",x"10",x"FB",x"19",x"0D", -- 0x1320 + x"20",x"F5",x"CD",x"0C",x"13",x"21",x"C4",x"41", -- 0x1328 + x"06",x"1D",x"AF",x"77",x"23",x"10",x"FC",x"C9", -- 0x1330 + x"32",x"B6",x"40",x"3A",x"B6",x"40",x"A7",x"C8", -- 0x1338 + x"18",x"F9",x"3E",x"FF",x"32",x"01",x"70",x"C9", -- 0x1340 + x"3A",x"AF",x"40",x"CB",x"57",x"20",x"23",x"CB", -- 0x1348 + x"6F",x"20",x"1B",x"3A",x"00",x"70",x"CB",x"5F", -- 0x1350 + x"28",x"14",x"3A",x"00",x"68",x"CB",x"3F",x"CB", -- 0x1358 + x"3F",x"47",x"CB",x"A8",x"3A",x"00",x"60",x"CB", -- 0x1360 + x"77",x"78",x"C8",x"CB",x"EF",x"C9",x"3A",x"00", -- 0x1368 + x"60",x"C9",x"21",x"B7",x"40",x"7E",x"23",x"35", -- 0x1370 + x"C0",x"23",x"5E",x"23",x"56",x"13",x"23",x"35", -- 0x1378 + x"20",x"05",x"11",x"96",x"13",x"36",x"14",x"1A", -- 0x1380 + x"47",x"13",x"1A",x"CB",x"EF",x"2B",x"72",x"2B", -- 0x1388 + x"73",x"2B",x"70",x"2B",x"77",x"C9",x"50",x"02", -- 0x1390 + x"5A",x"04",x"3C",x"09",x"46",x"00",x"28",x"02", -- 0x1398 + x"50",x"08",x"5A",x"00",x"5A",x"06",x"50",x"09", -- 0x13A0 + x"4B",x"0A",x"41",x"00",x"05",x"01",x"05",x"02", -- 0x13A8 + x"05",x"04",x"05",x"08",x"5A",x"01",x"50",x"02", -- 0x13B0 + x"46",x"05",x"63",x"01",x"63",x"05",x"3E",x"00", -- 0x13B8 + x"32",x"01",x"70",x"C9",x"11",x"00",x"42",x"21", -- 0x13C0 + x"FF",x"13",x"3A",x"1E",x"40",x"E6",x"03",x"20", -- 0x13C8 + x"03",x"21",x"03",x"14",x"01",x"04",x"00",x"ED", -- 0x13D0 + x"B0",x"21",x"1D",x"40",x"35",x"11",x"E0",x"FF", -- 0x13D8 + x"21",x"9F",x"53",x"06",x"06",x"3E",x"10",x"77", -- 0x13E0 + x"19",x"10",x"FC",x"3A",x"1D",x"40",x"32",x"BF", -- 0x13E8 + x"53",x"A7",x"28",x"0A",x"47",x"21",x"9F",x"53", -- 0x13F0 + x"3E",x"0F",x"77",x"19",x"10",x"FC",x"C9",x"80", -- 0x13F8 + x"10",x"01",x"80",x"E0",x"11",x"01",x"E0",x"E9", -- 0x1400 + x"3A",x"01",x"40",x"CB",x"47",x"C0",x"DD",x"21", -- 0x1408 + x"20",x"42",x"FD",x"21",x"06",x"40",x"06",x"04", -- 0x1410 + x"FD",x"7E",x"00",x"A7",x"28",x"45",x"DD",x"7E", -- 0x1418 + x"03",x"ED",x"44",x"D6",x"14",x"6F",x"DD",x"66", -- 0x1420 + x"01",x"0E",x"00",x"DD",x"E5",x"FD",x"E5",x"C5", -- 0x1428 + x"3A",x"1E",x"40",x"E6",x"03",x"CA",x"6C",x"15", -- 0x1430 + x"FD",x"21",x"04",x"42",x"DD",x"21",x"37",x"40", -- 0x1438 + x"06",x"07",x"DD",x"CB",x"00",x"4E",x"C4",x"70", -- 0x1440 + x"14",x"CD",x"78",x"09",x"10",x"F4",x"79",x"C1", -- 0x1448 + x"FD",x"E1",x"DD",x"E1",x"CB",x"47",x"28",x"0B", -- 0x1450 + x"AF",x"DD",x"77",x"01",x"DD",x"77",x"03",x"FD", -- 0x1458 + x"36",x"00",x"00",x"11",x"08",x"00",x"DD",x"19", -- 0x1460 + x"11",x"04",x"00",x"FD",x"19",x"10",x"A9",x"C9", -- 0x1468 + x"7C",x"FD",x"96",x"00",x"FE",x"10",x"D0",x"57", -- 0x1470 + x"7D",x"FD",x"96",x"03",x"ED",x"44",x"FE",x"10", -- 0x1478 + x"D0",x"5F",x"E5",x"21",x"AC",x"14",x"FD",x"7E", -- 0x1480 + x"01",x"D6",x"13",x"87",x"87",x"87",x"87",x"87", -- 0x1488 + x"CB",x"22",x"82",x"85",x"6F",x"3E",x"00",x"8C", -- 0x1490 + x"67",x"7B",x"BE",x"30",x"0D",x"23",x"BE",x"38", -- 0x1498 + x"09",x"0E",x"FF",x"CD",x"EB",x"18",x"DD",x"CB", -- 0x14A0 + x"00",x"C6",x"E1",x"C9",x"07",x"00",x"07",x"00", -- 0x14A8 + x"07",x"00",x"07",x"00",x"07",x"00",x"07",x"00", -- 0x14B0 + x"07",x"00",x"07",x"00",x"32",x"32",x"32",x"32", -- 0x14B8 + x"32",x"32",x"32",x"32",x"32",x"32",x"32",x"32", -- 0x14C0 + x"32",x"32",x"32",x"32",x"07",x"00",x"07",x"00", -- 0x14C8 + x"07",x"00",x"07",x"00",x"07",x"00",x"07",x"00", -- 0x14D0 + x"07",x"00",x"07",x"00",x"32",x"32",x"32",x"32", -- 0x14D8 + x"32",x"32",x"32",x"32",x"32",x"32",x"32",x"32", -- 0x14E0 + x"32",x"32",x"32",x"32",x"08",x"07",x"09",x"06", -- 0x14E8 + x"0A",x"05",x"0B",x"04",x"0C",x"03",x"0D",x"02", -- 0x14F0 + x"0E",x"01",x"0F",x"00",x"0F",x"00",x"0E",x"01", -- 0x14F8 + x"0D",x"02",x"0C",x"03",x"0B",x"04",x"0A",x"05", -- 0x1500 + x"09",x"06",x"08",x"07",x"00",x"00",x"00",x"00", -- 0x1508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1510 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1518 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1520 + x"00",x"00",x"00",x"00",x"0F",x"00",x"0F",x"00", -- 0x1528 + x"0F",x"00",x"0F",x"00",x"0F",x"00",x"0F",x"00", -- 0x1530 + x"0F",x"00",x"0F",x"00",x"0F",x"00",x"0F",x"00", -- 0x1538 + x"0F",x"01",x"0F",x"02",x"0F",x"03",x"0F",x"04", -- 0x1540 + x"0F",x"05",x"0F",x"06",x"0C",x"03",x"0C",x"03", -- 0x1548 + x"0C",x"03",x"0C",x"03",x"0D",x"02",x"0E",x"01", -- 0x1550 + x"0F",x"00",x"0F",x"00",x"0F",x"00",x"0F",x"00", -- 0x1558 + x"0E",x"01",x"0D",x"02",x"0C",x"03",x"0C",x"03", -- 0x1560 + x"0C",x"03",x"0C",x"03",x"EB",x"7A",x"2F",x"57", -- 0x1568 + x"1D",x"1D",x"1D",x"CD",x"64",x"16",x"7E",x"FE", -- 0x1570 + x"10",x"28",x"44",x"E5",x"FD",x"E1",x"C5",x"D5", -- 0x1578 + x"21",x"B9",x"16",x"11",x"11",x"00",x"06",x"07", -- 0x1580 + x"BE",x"28",x"07",x"19",x"10",x"FA",x"D1",x"C1", -- 0x1588 + x"18",x"2D",x"23",x"D1",x"C1",x"78",x"CB",x"27", -- 0x1590 + x"85",x"6F",x"3E",x"00",x"8C",x"67",x"79",x"BE", -- 0x1598 + x"28",x"03",x"D2",x"BF",x"15",x"23",x"BE",x"DA", -- 0x15A0 + x"BF",x"15",x"D5",x"FD",x"7E",x"00",x"FE",x"0C", -- 0x15A8 + x"28",x"12",x"FE",x"0E",x"28",x"18",x"FE",x"0D", -- 0x15B0 + x"28",x"2A",x"E6",x"F8",x"20",x"3C",x"D1",x"0E", -- 0x15B8 + x"00",x"C3",x"4E",x"14",x"FD",x"36",x"00",x"10", -- 0x15C0 + x"11",x"00",x"01",x"C3",x"27",x"16",x"FD",x"36", -- 0x15C8 + x"00",x"10",x"11",x"50",x"00",x"FD",x"7E",x"E0", -- 0x15D0 + x"FE",x"0D",x"C2",x"27",x"16",x"FD",x"36",x"E0", -- 0x15D8 + x"10",x"C3",x"27",x"16",x"FD",x"36",x"00",x"10", -- 0x15E0 + x"11",x"50",x"00",x"FD",x"7E",x"20",x"FE",x"0E", -- 0x15E8 + x"C2",x"27",x"16",x"FD",x"36",x"20",x"10",x"C3", -- 0x15F0 + x"27",x"16",x"FD",x"7E",x"00",x"21",x"9B",x"16", -- 0x15F8 + x"06",x"04",x"BE",x"28",x"06",x"23",x"23",x"23", -- 0x1600 + x"10",x"F8",x"C7",x"23",x"5E",x"23",x"56",x"FD", -- 0x1608 + x"19",x"FD",x"36",x"00",x"10",x"FD",x"36",x"01", -- 0x1610 + x"10",x"FD",x"36",x"20",x"10",x"FD",x"36",x"21", -- 0x1618 + x"10",x"11",x"30",x"00",x"C3",x"27",x"16",x"CD", -- 0x1620 + x"72",x"19",x"DD",x"21",x"77",x"40",x"FD",x"21", -- 0x1628 + x"14",x"42",x"06",x"03",x"DD",x"CB",x"00",x"46", -- 0x1630 + x"28",x"0B",x"CD",x"78",x"09",x"10",x"F5",x"0E", -- 0x1638 + x"01",x"D1",x"C3",x"4E",x"14",x"DD",x"36",x"00", -- 0x1640 + x"01",x"FD",x"36",x"01",x"1C",x"FD",x"36",x"02", -- 0x1648 + x"06",x"D1",x"7A",x"2F",x"D6",x"08",x"FD",x"77", -- 0x1650 + x"00",x"3E",x"08",x"83",x"FD",x"77",x"03",x"0E", -- 0x1658 + x"01",x"C3",x"4E",x"14",x"7B",x"E6",x"07",x"4F", -- 0x1660 + x"3E",x"07",x"91",x"4F",x"7B",x"E6",x"F8",x"C6", -- 0x1668 + x"10",x"CB",x"3F",x"CB",x"3F",x"F5",x"21",x"C0", -- 0x1670 + x"41",x"85",x"6F",x"3E",x"00",x"8C",x"67",x"7A", -- 0x1678 + x"86",x"47",x"E6",x"F8",x"6F",x"78",x"E6",x"07", -- 0x1680 + x"47",x"26",x"00",x"29",x"29",x"F1",x"CB",x"3F", -- 0x1688 + x"85",x"6F",x"3E",x"00",x"85",x"6F",x"3E",x"50", -- 0x1690 + x"8C",x"67",x"C9",x"C8",x"00",x"00",x"C9",x"FF", -- 0x1698 + x"FF",x"CA",x"E0",x"FF",x"CB",x"DF",x"FF",x"B9", -- 0x16A0 + x"A9",x"17",x"A1",x"91",x"14",x"89",x"79",x"11", -- 0x16A8 + x"71",x"61",x"0E",x"59",x"49",x"0B",x"41",x"31", -- 0x16B0 + x"08",x"0D",x"04",x"00",x"06",x"00",x"06",x"00", -- 0x16B8 + x"06",x"00",x"06",x"00",x"06",x"00",x"06",x"00", -- 0x16C0 + x"07",x"00",x"0E",x"07",x"00",x"07",x"00",x"07", -- 0x16C8 + x"00",x"07",x"00",x"07",x"00",x"07",x"00",x"05", -- 0x16D0 + x"00",x"05",x"00",x"C8",x"00",x"00",x"00",x"03", -- 0x16D8 + x"00",x"03",x"00",x"04",x"00",x"04",x"00",x"02", -- 0x16E0 + x"00",x"04",x"00",x"05",x"C9",x"07",x"05",x"07", -- 0x16E8 + x"02",x"07",x"00",x"07",x"00",x"07",x"00",x"07", -- 0x16F0 + x"00",x"07",x"00",x"07",x"01",x"CA",x"05",x"00", -- 0x16F8 + x"06",x"00",x"06",x"00",x"05",x"00",x"04",x"00", -- 0x1700 + x"04",x"00",x"03",x"00",x"01",x"00",x"CB",x"07", -- 0x1708 + x"01",x"07",x"02",x"07",x"02",x"07",x"02",x"07", -- 0x1710 + x"02",x"07",x"03",x"07",x"06",x"07",x"06",x"0C", -- 0x1718 + x"32",x"32",x"07",x"01",x"07",x"01",x"07",x"01", -- 0x1720 + x"07",x"01",x"07",x"01",x"07",x"01",x"07",x"01", -- 0x1728 + x"3A",x"01",x"40",x"CB",x"47",x"C0",x"FD",x"21", -- 0x1730 + x"00",x"42",x"21",x"1B",x"18",x"11",x"15",x"00", -- 0x1738 + x"FD",x"7E",x"01",x"BE",x"28",x"03",x"19",x"18", -- 0x1740 + x"FA",x"06",x"0A",x"23",x"FD",x"7E",x"00",x"86", -- 0x1748 + x"ED",x"44",x"57",x"FD",x"7E",x"03",x"23",x"96", -- 0x1750 + x"23",x"5F",x"E5",x"C5",x"CD",x"64",x"16",x"7E", -- 0x1758 + x"FE",x"10",x"CA",x"14",x"18",x"E5",x"DD",x"E1", -- 0x1760 + x"C5",x"D5",x"21",x"B9",x"16",x"11",x"11",x"00", -- 0x1768 + x"06",x"07",x"BE",x"28",x"08",x"19",x"10",x"FA", -- 0x1770 + x"D1",x"C1",x"C3",x"14",x"18",x"23",x"D1",x"C1", -- 0x1778 + x"78",x"CB",x"27",x"85",x"6F",x"3E",x"00",x"8C", -- 0x1780 + x"67",x"79",x"BE",x"D2",x"14",x"18",x"23",x"BE", -- 0x1788 + x"DA",x"14",x"18",x"DD",x"7E",x"00",x"FE",x"0C", -- 0x1790 + x"28",x"0F",x"FE",x"0E",x"28",x"15",x"FE",x"0D", -- 0x1798 + x"28",x"27",x"E6",x"F8",x"20",x"39",x"C3",x"14", -- 0x17A0 + x"18",x"DD",x"36",x"00",x"10",x"11",x"00",x"01", -- 0x17A8 + x"C3",x"09",x"18",x"DD",x"36",x"00",x"10",x"11", -- 0x17B0 + x"50",x"00",x"DD",x"7E",x"E0",x"FE",x"0D",x"C2", -- 0x17B8 + x"09",x"18",x"DD",x"36",x"E0",x"10",x"C3",x"09", -- 0x17C0 + x"18",x"DD",x"36",x"00",x"10",x"11",x"50",x"00", -- 0x17C8 + x"DD",x"7E",x"20",x"FE",x"0E",x"C2",x"09",x"18", -- 0x17D0 + x"DD",x"36",x"20",x"10",x"C3",x"09",x"18",x"DD", -- 0x17D8 + x"7E",x"00",x"21",x"9B",x"16",x"06",x"04",x"BE", -- 0x17E0 + x"28",x"06",x"23",x"23",x"23",x"10",x"F8",x"C7", -- 0x17E8 + x"23",x"5E",x"23",x"56",x"DD",x"19",x"DD",x"36", -- 0x17F0 + x"00",x"10",x"DD",x"36",x"01",x"10",x"DD",x"36", -- 0x17F8 + x"20",x"10",x"DD",x"36",x"21",x"10",x"11",x"30", -- 0x1800 + x"00",x"CD",x"72",x"19",x"21",x"01",x"40",x"CB", -- 0x1808 + x"C6",x"C1",x"E1",x"C9",x"C1",x"E1",x"05",x"C2", -- 0x1810 + x"4C",x"17",x"C9",x"10",x"00",x"01",x"00",x"05", -- 0x1818 + x"02",x"01",x"03",x"09",x"06",x"03",x"06",x"0C", -- 0x1820 + x"0A",x"09",x"0B",x"02",x"0D",x"02",x"0D",x"06", -- 0x1828 + x"50",x"09",x"03",x"06",x"06",x"0C",x"06",x"03", -- 0x1830 + x"0A",x"0F",x"0A",x"09",x"0C",x"03",x"0E",x"05", -- 0x1838 + x"0E",x"0D",x"0E",x"0F",x"0E",x"11",x"00",x"03", -- 0x1840 + x"00",x"05",x"00",x"0B",x"00",x"0D",x"02",x"08", -- 0x1848 + x"05",x"03",x"05",x"0D",x"0C",x"05",x"0C",x"0B", -- 0x1850 + x"0F",x"08",x"D2",x"0F",x"04",x"0D",x"06",x"0C", -- 0x1858 + x"02",x"09",x"06",x"08",x"09",x"06",x"0B",x"03", -- 0x1860 + x"09",x"00",x"04",x"00",x"00",x"06",x"00",x"91", -- 0x1868 + x"0F",x"03",x"0F",x"05",x"0F",x"0B",x"0F",x"0D", -- 0x1870 + x"0D",x"08",x"0A",x"03",x"0A",x"0D",x"03",x"05", -- 0x1878 + x"03",x"0B",x"00",x"08",x"12",x"00",x"0B",x"02", -- 0x1880 + x"09",x"03",x"0D",x"06",x"09",x"07",x"06",x"09", -- 0x1888 + x"04",x"0C",x"06",x"0F",x"0B",x"0F",x"0F",x"09", -- 0x1890 + x"0F",x"92",x"0F",x"0B",x"0D",x"09",x"0C",x"0D", -- 0x1898 + x"09",x"09",x"08",x"06",x"06",x"04",x"03",x"06", -- 0x18A0 + x"00",x"0B",x"00",x"0F",x"06",x"0F",x"52",x"00", -- 0x18A8 + x"04",x"02",x"06",x"03",x"02",x"06",x"06",x"07", -- 0x18B0 + x"09",x"09",x"0B",x"0C",x"09",x"0F",x"04",x"00", -- 0x18B8 + x"00",x"09",x"00",x"CD",x"48",x"1B",x"CD",x"E7", -- 0x18C0 + x"1D",x"3A",x"1E",x"40",x"E6",x"03",x"28",x"09", -- 0x18C8 + x"CD",x"D6",x"1C",x"CD",x"DD",x"0E",x"C3",x"B4", -- 0x18D0 + x"00",x"CD",x"81",x"1A",x"CD",x"FF",x"19",x"CD", -- 0x18D8 + x"AE",x"1A",x"CD",x"E7",x"1A",x"CD",x"CA",x"1D", -- 0x18E0 + x"C3",x"B4",x"00",x"DD",x"CB",x"00",x"46",x"C0", -- 0x18E8 + x"3A",x"AF",x"40",x"CB",x"57",x"C0",x"FD",x"E5", -- 0x18F0 + x"C5",x"47",x"FD",x"7E",x"01",x"D6",x"13",x"CB", -- 0x18F8 + x"27",x"5F",x"16",x"00",x"21",x"39",x"19",x"19", -- 0x1900 + x"5E",x"23",x"56",x"EB",x"CD",x"07",x"14",x"21", -- 0x1908 + x"AB",x"40",x"CB",x"68",x"F5",x"20",x"03",x"21", -- 0x1910 + x"AE",x"40",x"7B",x"86",x"27",x"77",x"2B",x"7A", -- 0x1918 + x"8E",x"27",x"77",x"2B",x"3E",x"00",x"8E",x"27", -- 0x1920 + x"77",x"21",x"4E",x"12",x"F1",x"20",x"03",x"21", -- 0x1928 + x"57",x"12",x"CD",x"07",x"14",x"C1",x"FD",x"E1", -- 0x1930 + x"C9",x"45",x"19",x"4E",x"19",x"57",x"19",x"00", -- 0x1938 + x"00",x"00",x"00",x"69",x"19",x"11",x"00",x"02", -- 0x1940 + x"21",x"EE",x"40",x"CB",x"DE",x"C9",x"11",x"53", -- 0x1948 + x"00",x"21",x"EE",x"40",x"CB",x"DE",x"C9",x"21", -- 0x1950 + x"EE",x"40",x"CB",x"D6",x"FD",x"7E",x"02",x"11", -- 0x1958 + x"00",x"01",x"FE",x"06",x"C8",x"11",x"50",x"01", -- 0x1960 + x"C9",x"11",x"00",x"01",x"21",x"EE",x"40",x"CB", -- 0x1968 + x"D6",x"C9",x"3A",x"AF",x"40",x"CB",x"57",x"C0", -- 0x1970 + x"47",x"FD",x"E5",x"C5",x"C3",x"0F",x"19",x"3A", -- 0x1978 + x"01",x"40",x"CB",x"47",x"C0",x"FD",x"21",x"24", -- 0x1980 + x"42",x"06",x"04",x"DD",x"21",x"00",x"42",x"C5", -- 0x1988 + x"FD",x"7E",x"01",x"DD",x"96",x"00",x"FE",x"10", -- 0x1990 + x"30",x"5C",x"4F",x"FD",x"7E",x"03",x"2F",x"D6", -- 0x1998 + x"50",x"47",x"DD",x"7E",x"03",x"90",x"FA",x"AE", -- 0x19A0 + x"19",x"FE",x"10",x"30",x"49",x"AF",x"47",x"FD", -- 0x19A8 + x"7E",x"03",x"2F",x"D6",x"70",x"DD",x"96",x"03", -- 0x19B0 + x"F2",x"F6",x"19",x"FE",x"10",x"38",x"02",x"3E", -- 0x19B8 + x"10",x"F5",x"21",x"D9",x"0C",x"3A",x"01",x"42", -- 0x19C0 + x"BE",x"28",x"05",x"23",x"23",x"23",x"18",x"F8", -- 0x19C8 + x"23",x"5E",x"23",x"56",x"EB",x"79",x"CB",x"27", -- 0x19D0 + x"85",x"6F",x"3E",x"00",x"8C",x"67",x"F1",x"5F", -- 0x19D8 + x"78",x"C6",x"20",x"BE",x"D2",x"F6",x"19",x"23", -- 0x19E0 + x"7B",x"C6",x"20",x"BE",x"DA",x"F6",x"19",x"21", -- 0x19E8 + x"01",x"40",x"CB",x"C6",x"C1",x"C9",x"11",x"08", -- 0x19F0 + x"00",x"FD",x"19",x"C1",x"10",x"91",x"C9",x"DD", -- 0x19F8 + x"21",x"24",x"42",x"FD",x"21",x"2C",x"42",x"01", -- 0x1A00 + x"09",x"02",x"3A",x"29",x"40",x"5F",x"DD",x"7E", -- 0x1A08 + x"01",x"A7",x"F5",x"C4",x"35",x"1A",x"F1",x"CC", -- 0x1A10 + x"57",x"1A",x"FD",x"7E",x"01",x"A7",x"F5",x"C4", -- 0x1A18 + x"46",x"1A",x"F1",x"CC",x"6C",x"1A",x"05",x"C8", -- 0x1A20 + x"D5",x"11",x"10",x"00",x"DD",x"19",x"FD",x"19", -- 0x1A28 + x"D1",x"0E",x"35",x"18",x"D9",x"DD",x"7E",x"03", -- 0x1A30 + x"93",x"DD",x"77",x"03",x"D0",x"DD",x"36",x"01", -- 0x1A38 + x"00",x"DD",x"36",x"03",x"00",x"C9",x"FD",x"7E", -- 0x1A40 + x"03",x"93",x"FD",x"77",x"03",x"D0",x"FD",x"36", -- 0x1A48 + x"01",x"00",x"FD",x"36",x"03",x"00",x"C9",x"FD", -- 0x1A50 + x"7E",x"03",x"FE",x"2C",x"D0",x"DD",x"36",x"03", -- 0x1A58 + x"5E",x"21",x"0C",x"42",x"7E",x"81",x"3C",x"3C", -- 0x1A60 + x"DD",x"77",x"01",x"C9",x"DD",x"7E",x"03",x"FE", -- 0x1A68 + x"2C",x"D0",x"FD",x"36",x"03",x"5E",x"21",x"0C", -- 0x1A70 + x"42",x"7E",x"81",x"3D",x"3D",x"FD",x"77",x"01", -- 0x1A78 + x"C9",x"11",x"D2",x"41",x"FD",x"21",x"20",x"40", -- 0x1A80 + x"21",x"D2",x"40",x"06",x"06",x"0E",x"01",x"35", -- 0x1A88 + x"28",x"10",x"13",x"13",x"13",x"13",x"13",x"13", -- 0x1A90 + x"79",x"ED",x"44",x"4F",x"23",x"FD",x"23",x"10", -- 0x1A98 + x"EE",x"C9",x"FD",x"7E",x"00",x"77",x"1A",x"81", -- 0x1AA0 + x"12",x"13",x"13",x"12",x"18",x"E6",x"21",x"D8", -- 0x1AA8 + x"40",x"35",x"C0",x"3A",x"26",x"40",x"77",x"FD", -- 0x1AB0 + x"21",x"04",x"42",x"11",x"04",x"00",x"06",x"04", -- 0x1AB8 + x"21",x"D1",x"40",x"4E",x"FD",x"7E",x"00",x"81", -- 0x1AC0 + x"FD",x"77",x"00",x"FE",x"10",x"DC",x"E0",x"1A", -- 0x1AC8 + x"FE",x"E0",x"D4",x"E0",x"1A",x"FD",x"19",x"10", -- 0x1AD0 + x"EB",x"21",x"CA",x"41",x"7E",x"81",x"77",x"C9", -- 0x1AD8 + x"F5",x"7E",x"ED",x"44",x"77",x"F1",x"C9",x"3A", -- 0x1AE0 + x"01",x"40",x"CB",x"47",x"C0",x"3A",x"B6",x"40", -- 0x1AE8 + x"A7",x"F0",x"3A",x"2B",x"40",x"32",x"B6",x"40", -- 0x1AF0 + x"3A",x"65",x"53",x"FE",x"18",x"28",x"11",x"21", -- 0x1AF8 + x"0C",x"1B",x"FD",x"21",x"65",x"53",x"06",x"04", -- 0x1B00 + x"CD",x"3F",x"12",x"C9",x"48",x"4F",x"4D",x"45", -- 0x1B08 + x"FD",x"21",x"05",x"53",x"21",x"28",x"40",x"7E", -- 0x1B10 + x"D6",x"99",x"27",x"77",x"F5",x"AF",x"ED",x"67", -- 0x1B18 + x"FD",x"77",x"00",x"ED",x"67",x"FD",x"77",x"20", -- 0x1B20 + x"ED",x"67",x"2B",x"F1",x"7E",x"DE",x"00",x"27", -- 0x1B28 + x"77",x"AF",x"ED",x"67",x"FD",x"77",x"40",x"ED", -- 0x1B30 + x"67",x"FD",x"77",x"60",x"ED",x"67",x"7E",x"23", -- 0x1B38 + x"B6",x"C0",x"21",x"01",x"40",x"CB",x"C6",x"C9", -- 0x1B40 + x"DD",x"21",x"00",x"40",x"FD",x"21",x"00",x"42", -- 0x1B48 + x"DD",x"CB",x"01",x"46",x"C2",x"FD",x"1B",x"CD", -- 0x1B50 + x"48",x"13",x"E6",x"0F",x"DD",x"BE",x"02",x"C4", -- 0x1B58 + x"90",x"1B",x"FD",x"7E",x"03",x"DD",x"86",x"03", -- 0x1B60 + x"21",x"CE",x"1C",x"F5",x"3A",x"1E",x"40",x"E6", -- 0x1B68 + x"03",x"20",x"03",x"21",x"D2",x"1C",x"F1",x"BE", -- 0x1B70 + x"D0",x"23",x"BE",x"D8",x"23",x"47",x"FD",x"7E", -- 0x1B78 + x"00",x"DD",x"86",x"04",x"BE",x"D0",x"23",x"BE", -- 0x1B80 + x"D8",x"FD",x"77",x"00",x"FD",x"70",x"03",x"C9", -- 0x1B88 + x"DD",x"4E",x"02",x"DD",x"77",x"02",x"21",x"D9", -- 0x1B90 + x"1B",x"11",x"E2",x"1B",x"06",x"09",x"BE",x"28", -- 0x1B98 + x"07",x"23",x"13",x"13",x"13",x"10",x"F7",x"C9", -- 0x1BA0 + x"1A",x"A7",x"28",x"03",x"FD",x"77",x"01",x"13", -- 0x1BA8 + x"1A",x"DD",x"77",x"03",x"13",x"1A",x"DD",x"77", -- 0x1BB0 + x"04",x"3A",x"1E",x"40",x"E6",x"03",x"C0",x"CB", -- 0x1BB8 + x"79",x"20",x"0D",x"DD",x"CB",x"03",x"26",x"DD", -- 0x1BC0 + x"CB",x"04",x"26",x"DD",x"CB",x"02",x"FE",x"C9", -- 0x1BC8 + x"DD",x"CB",x"03",x"2E",x"DD",x"CB",x"04",x"2E", -- 0x1BD0 + x"C9",x"00",x"01",x"02",x"04",x"08",x"05",x"09", -- 0x1BD8 + x"06",x"0A",x"00",x"00",x"00",x"50",x"02",x"00", -- 0x1BE0 + x"10",x"FE",x"00",x"11",x"00",x"02",x"91",x"00", -- 0x1BE8 + x"FE",x"52",x"02",x"02",x"D2",x"02",x"FE",x"12", -- 0x1BF0 + x"FE",x"02",x"92",x"FE",x"FE",x"DD",x"CB",x"01", -- 0x1BF8 + x"56",x"C0",x"DD",x"CB",x"01",x"4E",x"CA",x"6C", -- 0x1C00 + x"1C",x"DD",x"35",x"00",x"C0",x"DD",x"36",x"00", -- 0x1C08 + x"08",x"FD",x"7E",x"02",x"FE",x"06",x"28",x"28", -- 0x1C10 + x"3E",x"04",x"FD",x"86",x"01",x"FE",x"40",x"28", -- 0x1C18 + x"33",x"FD",x"77",x"01",x"FD",x"35",x"02",x"FD", -- 0x1C20 + x"21",x"14",x"42",x"06",x"03",x"11",x"04",x"00", -- 0x1C28 + x"FD",x"7E",x"01",x"C6",x"04",x"FD",x"77",x"01", -- 0x1C30 + x"FD",x"35",x"02",x"FD",x"19",x"10",x"F1",x"C9", -- 0x1C38 + x"FD",x"34",x"02",x"FD",x"21",x"14",x"42",x"11", -- 0x1C40 + x"04",x"00",x"06",x"03",x"FD",x"34",x"02",x"FD", -- 0x1C48 + x"19",x"10",x"F9",x"C9",x"AF",x"06",x"04",x"FD", -- 0x1C50 + x"77",x"00",x"FD",x"23",x"10",x"F9",x"21",x"14", -- 0x1C58 + x"42",x"06",x"0C",x"77",x"23",x"10",x"FC",x"DD", -- 0x1C60 + x"CB",x"01",x"D6",x"C9",x"FD",x"56",x"00",x"FD", -- 0x1C68 + x"5E",x"03",x"7A",x"C6",x"08",x"FD",x"77",x"00", -- 0x1C70 + x"7B",x"D6",x"08",x"FD",x"77",x"03",x"FD",x"36", -- 0x1C78 + x"01",x"34",x"FD",x"36",x"02",x"06",x"DD",x"CB", -- 0x1C80 + x"01",x"CE",x"DD",x"36",x"00",x"08",x"21",x"D9", -- 0x1C88 + x"40",x"CB",x"C6",x"DD",x"21",x"77",x"40",x"FD", -- 0x1C90 + x"21",x"14",x"42",x"21",x"C5",x"1C",x"06",x"03", -- 0x1C98 + x"7A",x"86",x"FD",x"77",x"00",x"23",x"7E",x"FD", -- 0x1CA0 + x"77",x"01",x"23",x"FD",x"36",x"02",x"06",x"7B", -- 0x1CA8 + x"86",x"FD",x"77",x"03",x"23",x"DD",x"CB",x"00", -- 0x1CB0 + x"8E",x"DD",x"CB",x"00",x"96",x"D5",x"CD",x"78", -- 0x1CB8 + x"09",x"D1",x"10",x"DC",x"C9",x"08",x"35",x"08", -- 0x1CC0 + x"F8",x"36",x"F8",x"F8",x"37",x"08",x"D8",x"20", -- 0x1CC8 + x"D8",x"20",x"E8",x"34",x"E0",x"18",x"DD",x"21", -- 0x1CD0 + x"37",x"40",x"FD",x"21",x"04",x"42",x"DD",x"7E", -- 0x1CD8 + x"FF",x"A7",x"28",x"03",x"DD",x"35",x"FF",x"06", -- 0x1CE0 + x"07",x"DD",x"CB",x"00",x"4E",x"C5",x"C4",x"F8", -- 0x1CE8 + x"1C",x"C1",x"CD",x"78",x"09",x"10",x"F2",x"C9", -- 0x1CF0 + x"DD",x"CB",x"00",x"46",x"C2",x"1A",x"1D",x"DD", -- 0x1CF8 + x"6E",x"01",x"DD",x"66",x"02",x"CD",x"07",x"14", -- 0x1D00 + x"78",x"FD",x"86",x"00",x"FD",x"77",x"00",x"79", -- 0x1D08 + x"FD",x"86",x"03",x"FD",x"77",x"03",x"DD",x"35", -- 0x1D10 + x"0E",x"C9",x"DD",x"CB",x"00",x"5E",x"28",x"22", -- 0x1D18 + x"DD",x"35",x"05",x"C0",x"FD",x"7E",x"01",x"3C", -- 0x1D20 + x"FE",x"20",x"28",x"08",x"FD",x"77",x"01",x"DD", -- 0x1D28 + x"36",x"05",x"04",x"C9",x"AF",x"DD",x"77",x"00", -- 0x1D30 + x"FD",x"77",x"00",x"FD",x"77",x"03",x"FD",x"77", -- 0x1D38 + x"01",x"C9",x"3A",x"A7",x"40",x"32",x"36",x"40", -- 0x1D40 + x"FD",x"36",x"01",x"1C",x"FD",x"36",x"02",x"07", -- 0x1D48 + x"DD",x"36",x"05",x"04",x"DD",x"CB",x"00",x"DE", -- 0x1D50 + x"C9",x"DD",x"7E",x"0D",x"A7",x"20",x"0A",x"3A", -- 0x1D58 + x"F4",x"40",x"DD",x"77",x"0D",x"01",x"00",x"00", -- 0x1D60 + x"C9",x"DD",x"35",x"0D",x"DD",x"6E",x"03",x"DD", -- 0x1D68 + x"66",x"04",x"DD",x"35",x"05",x"20",x"0F",x"DD", -- 0x1D70 + x"35",x"06",x"23",x"7E",x"DD",x"77",x"05",x"23", -- 0x1D78 + x"DD",x"75",x"03",x"DD",x"74",x"04",x"7E",x"CB", -- 0x1D80 + x"2F",x"CB",x"2F",x"CB",x"2F",x"CB",x"2F",x"47", -- 0x1D88 + x"7E",x"E6",x"0F",x"CB",x"5F",x"28",x"02",x"F6", -- 0x1D90 + x"F0",x"4F",x"C9",x"DD",x"46",x"03",x"DD",x"4E", -- 0x1D98 + x"04",x"C9",x"CD",x"59",x"1D",x"DD",x"CB",x"0F", -- 0x1DA0 + x"46",x"28",x"04",x"78",x"ED",x"44",x"47",x"DD", -- 0x1DA8 + x"CB",x"0F",x"4E",x"28",x"04",x"79",x"ED",x"44", -- 0x1DB0 + x"4F",x"DD",x"CB",x"0F",x"56",x"28",x"02",x"CB", -- 0x1DB8 + x"20",x"DD",x"CB",x"0F",x"5E",x"28",x"02",x"CB", -- 0x1DC0 + x"21",x"C9",x"3A",x"01",x"40",x"CB",x"47",x"C0", -- 0x1DC8 + x"FD",x"21",x"14",x"42",x"DD",x"21",x"77",x"40", -- 0x1DD0 + x"06",x"03",x"DD",x"CB",x"00",x"46",x"C4",x"1A", -- 0x1DD8 + x"1D",x"CD",x"78",x"09",x"10",x"F4",x"C9",x"DD", -- 0x1DE0 + x"21",x"06",x"40",x"FD",x"21",x"20",x"42",x"06", -- 0x1DE8 + x"04",x"DD",x"7E",x"00",x"A7",x"CC",x"49",x"1E", -- 0x1DF0 + x"C4",x"0B",x"1E",x"11",x"04",x"00",x"DD",x"19", -- 0x1DF8 + x"11",x"08",x"00",x"FD",x"19",x"10",x"EA",x"CD", -- 0x1E00 + x"E9",x"1E",x"C9",x"C5",x"D5",x"DD",x"35",x"00", -- 0x1E08 + x"20",x"0F",x"FD",x"36",x"01",x"00",x"FD",x"36", -- 0x1E10 + x"03",x"00",x"DD",x"36",x"00",x"00",x"D1",x"C1", -- 0x1E18 + x"C9",x"FD",x"7E",x"03",x"FE",x"E0",x"30",x"EA", -- 0x1E20 + x"FE",x"08",x"38",x"E6",x"FD",x"7E",x"01",x"FE", -- 0x1E28 + x"F8",x"30",x"DF",x"FE",x"16",x"38",x"DB",x"DD", -- 0x1E30 + x"86",x"02",x"FD",x"77",x"01",x"FD",x"7E",x"03", -- 0x1E38 + x"DD",x"86",x"01",x"FD",x"77",x"03",x"D1",x"C1", -- 0x1E40 + x"C9",x"C5",x"D5",x"3A",x"01",x"40",x"CB",x"47", -- 0x1E48 + x"C2",x"46",x"1E",x"CD",x"48",x"13",x"CB",x"6F", -- 0x1E50 + x"CA",x"46",x"1E",x"21",x"06",x"40",x"06",x"04", -- 0x1E58 + x"11",x"04",x"00",x"0E",x"1C",x"3A",x"1E",x"40", -- 0x1E60 + x"E6",x"03",x"20",x"02",x"0E",x"01",x"79",x"BE", -- 0x1E68 + x"38",x"D4",x"19",x"10",x"FA",x"21",x"BF",x"1E", -- 0x1E70 + x"11",x"C7",x"1E",x"06",x"08",x"3A",x"01",x"42", -- 0x1E78 + x"BE",x"28",x"07",x"23",x"13",x"13",x"13",x"13", -- 0x1E80 + x"10",x"F6",x"EB",x"3A",x"00",x"42",x"86",x"FD", -- 0x1E88 + x"77",x"01",x"23",x"3A",x"03",x"42",x"47",x"3E", -- 0x1E90 + x"F0",x"90",x"86",x"FD",x"77",x"03",x"23",x"7E", -- 0x1E98 + x"DD",x"77",x"02",x"23",x"7E",x"DD",x"77",x"01", -- 0x1EA0 + x"21",x"E7",x"1E",x"3A",x"1E",x"40",x"E6",x"03", -- 0x1EA8 + x"20",x"01",x"23",x"7E",x"DD",x"77",x"00",x"21", -- 0x1EB0 + x"D9",x"40",x"CB",x"CE",x"D1",x"C1",x"C9",x"50", -- 0x1EB8 + x"10",x"11",x"91",x"52",x"D2",x"12",x"92",x"09", -- 0x1EC0 + x"FD",x"00",x"FC",x"09",x"08",x"00",x"04",x"10", -- 0x1EC8 + x"02",x"04",x"00",x"00",x"02",x"FC",x"00",x"0F", -- 0x1ED0 + x"FA",x"04",x"FC",x"00",x"FA",x"FC",x"FC",x"0F", -- 0x1ED8 + x"09",x"04",x"04",x"00",x"09",x"FC",x"04",x"20", -- 0x1EE0 + x"0B",x"FD",x"21",x"20",x"42",x"06",x"04",x"11", -- 0x1EE8 + x"08",x"00",x"FD",x"7E",x"01",x"FD",x"E5",x"C5", -- 0x1EF0 + x"05",x"28",x"0A",x"FD",x"19",x"FD",x"BE",x"01", -- 0x1EF8 + x"CC",x"0D",x"1F",x"18",x"F3",x"C1",x"FD",x"E1", -- 0x1F00 + x"FD",x"19",x"10",x"E6",x"C9",x"FD",x"34",x"01", -- 0x1F08 + x"C9",x"3A",x"17",x"40",x"A7",x"C8",x"3E",x"13", -- 0x1F10 + x"21",x"1F",x"1F",x"CD",x"5C",x"09",x"C9",x"DD", -- 0x1F18 + x"CB",x"08",x"66",x"C4",x"41",x"1F",x"FD",x"7E", -- 0x1F20 + x"03",x"FE",x"10",x"DA",x"4F",x"0B",x"FE",x"F0", -- 0x1F28 + x"D2",x"4F",x"0B",x"FD",x"7E",x"00",x"FE",x"10", -- 0x1F30 + x"DA",x"4F",x"0B",x"FE",x"F0",x"D8",x"C3",x"4F", -- 0x1F38 + x"0B",x"DD",x"7E",x"0E",x"A7",x"F0",x"DD",x"36", -- 0x1F40 + x"0E",x"02",x"CD",x"E7",x"08",x"CB",x"28",x"CB", -- 0x1F48 + x"29",x"DD",x"70",x"03",x"DD",x"71",x"04",x"C9", -- 0x1F50 + x"CD",x"5F",x"1F",x"CD",x"2D",x"20",x"C9",x"DD", -- 0x1F58 + x"7E",x"FA",x"A7",x"C8",x"DD",x"7E",x"E2",x"DD", -- 0x1F60 + x"BE",x"F9",x"D0",x"21",x"72",x"1F",x"CD",x"3F", -- 0x1F68 + x"09",x"C9",x"FD",x"36",x"01",x"15",x"FD",x"36", -- 0x1F70 + x"02",x"06",x"CD",x"67",x"0B",x"FE",x"10",x"30", -- 0x1F78 + x"02",x"CB",x"E7",x"FE",x"F0",x"38",x"02",x"D6", -- 0x1F80 + x"10",x"57",x"26",x"10",x"CD",x"67",x"0B",x"CB", -- 0x1F88 + x"57",x"20",x"02",x"26",x"F0",x"CB",x"4F",x"20", -- 0x1F90 + x"01",x"EB",x"FD",x"72",x"00",x"FD",x"74",x"03", -- 0x1F98 + x"DD",x"E5",x"D1",x"13",x"21",x"75",x"20",x"01", -- 0x1FA0 + x"08",x"00",x"ED",x"B0",x"CD",x"E7",x"08",x"78", -- 0x1FA8 + x"A7",x"20",x"02",x"06",x"01",x"79",x"A7",x"20", -- 0x1FB0 + x"02",x"0E",x"01",x"DD",x"70",x"03",x"DD",x"71", -- 0x1FB8 + x"04",x"21",x"31",x"40",x"35",x"DD",x"CB",x"00", -- 0x1FC0 + x"CE",x"DD",x"CB",x"00",x"D6",x"21",x"DC",x"1F", -- 0x1FC8 + x"FD",x"E5",x"DD",x"E5",x"CD",x"3F",x"09",x"DD", -- 0x1FD0 + x"E1",x"FD",x"E1",x"C9",x"E1",x"DD",x"E5",x"D1", -- 0x1FD8 + x"FD",x"E5",x"E1",x"DD",x"E1",x"FD",x"E1",x"CD", -- 0x1FE0 + x"F8",x"1F",x"DD",x"7E",x"03",x"77",x"23",x"DD", -- 0x1FE8 + x"7E",x"04",x"77",x"DD",x"CB",x"08",x"DE",x"C9", -- 0x1FF0 + x"D5",x"E5",x"DD",x"72",x"0C",x"DD",x"73",x"0B", -- 0x1FF8 + x"DD",x"74",x"0A",x"DD",x"75",x"09",x"21",x"81", -- 0x2000 + x"29",x"13",x"01",x"08",x"00",x"ED",x"B0",x"E1", -- 0x2008 + x"D1",x"FD",x"7E",x"00",x"C6",x"02",x"77",x"23", -- 0x2010 + x"36",x"13",x"23",x"36",x"01",x"23",x"FD",x"7E", -- 0x2018 + x"03",x"C6",x"08",x"77",x"EB",x"CB",x"CE",x"CB", -- 0x2020 + x"D6",x"23",x"23",x"23",x"C9",x"DD",x"21",x"37", -- 0x2028 + x"40",x"DD",x"7E",x"E2",x"A7",x"C8",x"3E",x"15", -- 0x2030 + x"21",x"3F",x"20",x"CD",x"5C",x"09",x"C9",x"DD", -- 0x2038 + x"CB",x"08",x"5E",x"C8",x"DD",x"66",x"0C",x"DD", -- 0x2040 + x"6E",x"0B",x"CB",x"46",x"C8",x"21",x"5C",x"20", -- 0x2048 + x"FD",x"E5",x"DD",x"E5",x"CD",x"3F",x"09",x"DD", -- 0x2050 + x"E1",x"FD",x"E1",x"C9",x"E1",x"DD",x"E5",x"D1", -- 0x2058 + x"FD",x"E5",x"E1",x"DD",x"E1",x"FD",x"E1",x"CD", -- 0x2060 + x"F8",x"1F",x"CD",x"E7",x"08",x"70",x"23",x"71", -- 0x2068 + x"DD",x"CB",x"08",x"DE",x"C9",x"9B",x"1D",x"00", -- 0x2070 + x"00",x"00",x"00",x"00",x"00",x"DD",x"21",x"37", -- 0x2078 + x"40",x"DD",x"7E",x"E2",x"A7",x"C8",x"3E",x"15", -- 0x2080 + x"21",x"E4",x"20",x"CD",x"5C",x"09",x"DD",x"21", -- 0x2088 + x"37",x"40",x"DD",x"7E",x"E0",x"A7",x"C8",x"DD", -- 0x2090 + x"21",x"37",x"40",x"FD",x"21",x"04",x"42",x"06", -- 0x2098 + x"07",x"DD",x"CB",x"00",x"46",x"DD",x"E5",x"FD", -- 0x20A0 + x"E5",x"C5",x"C4",x"B8",x"20",x"C1",x"FD",x"E1", -- 0x20A8 + x"DD",x"E1",x"CD",x"78",x"09",x"10",x"EA",x"C9", -- 0x20B0 + x"DD",x"CB",x"08",x"5E",x"C8",x"DD",x"66",x"0C", -- 0x20B8 + x"DD",x"6E",x"0B",x"CB",x"46",x"C0",x"CB",x"4E", -- 0x20C0 + x"C8",x"DD",x"56",x"0A",x"DD",x"5E",x"09",x"13", -- 0x20C8 + x"1A",x"FE",x"13",x"C0",x"E5",x"D5",x"FD",x"E1", -- 0x20D0 + x"DD",x"E1",x"CD",x"E7",x"08",x"DD",x"70",x"03", -- 0x20D8 + x"DD",x"71",x"04",x"C9",x"FD",x"7E",x"00",x"FE", -- 0x20E0 + x"10",x"DA",x"4F",x"0B",x"FE",x"F0",x"D2",x"4F", -- 0x20E8 + x"0B",x"FD",x"7E",x"03",x"FE",x"10",x"DA",x"4F", -- 0x20F0 + x"0B",x"FE",x"F0",x"D2",x"4F",x"0B",x"DD",x"CB", -- 0x20F8 + x"00",x"46",x"C0",x"DD",x"7E",x"0E",x"E6",x"18", -- 0x2100 + x"20",x"05",x"FD",x"36",x"02",x"07",x"C9",x"FD", -- 0x2108 + x"36",x"02",x"06",x"C9",x"DD",x"21",x"C0",x"41", -- 0x2110 + x"DD",x"36",x"1B",x"06",x"DD",x"36",x"1A",x"04", -- 0x2118 + x"DD",x"36",x"1F",x"06",x"DD",x"36",x"1E",x"00", -- 0x2120 + x"DD",x"36",x"31",x"02",x"DD",x"36",x"30",x"00", -- 0x2128 + x"DD",x"36",x"35",x"02",x"DD",x"36",x"34",x"04", -- 0x2130 + x"21",x"20",x"22",x"FD",x"21",x"4D",x"53",x"06", -- 0x2138 + x"15",x"CD",x"3F",x"12",x"21",x"35",x"22",x"FD", -- 0x2140 + x"21",x"38",x"52",x"06",x"04",x"CD",x"3F",x"12", -- 0x2148 + x"11",x"00",x"03",x"3A",x"B0",x"40",x"A7",x"20", -- 0x2150 + x"29",x"D5",x"21",x"39",x"22",x"3A",x"B1",x"40", -- 0x2158 + x"DD",x"36",x"1E",x"04",x"3D",x"28",x"07",x"DD", -- 0x2160 + x"36",x"1E",x"00",x"21",x"47",x"22",x"FD",x"21", -- 0x2168 + x"CF",x"52",x"06",x"0E",x"CD",x"3F",x"12",x"D1", -- 0x2170 + x"CD",x"F5",x"21",x"C2",x"53",x"21",x"CD",x"17", -- 0x2178 + x"13",x"C9",x"D5",x"DD",x"36",x"1E",x"04",x"21", -- 0x2180 + x"55",x"22",x"FD",x"21",x"0F",x"53",x"06",x"11", -- 0x2188 + x"CD",x"3F",x"12",x"D1",x"AF",x"3D",x"08",x"CD", -- 0x2190 + x"48",x"13",x"CB",x"6F",x"08",x"20",x"03",x"08", -- 0x2198 + x"20",x"0A",x"CD",x"F5",x"21",x"C2",x"97",x"21", -- 0x21A0 + x"CD",x"17",x"13",x"C9",x"3A",x"B0",x"40",x"D6", -- 0x21A8 + x"01",x"27",x"32",x"B0",x"40",x"CD",x"9E",x"12", -- 0x21B0 + x"3A",x"00",x"68",x"06",x"03",x"CB",x"7F",x"28", -- 0x21B8 + x"02",x"06",x"05",x"78",x"32",x"1D",x"40",x"CD", -- 0x21C0 + x"17",x"13",x"3A",x"AF",x"40",x"CB",x"6F",x"28", -- 0x21C8 + x"12",x"21",x"A9",x"40",x"AF",x"77",x"23",x"77", -- 0x21D0 + x"23",x"77",x"CD",x"4E",x"12",x"21",x"BE",x"40", -- 0x21D8 + x"CB",x"C6",x"C9",x"21",x"AC",x"40",x"AF",x"77", -- 0x21E0 + x"23",x"77",x"23",x"77",x"CD",x"57",x"12",x"21", -- 0x21E8 + x"BE",x"40",x"CB",x"CE",x"C9",x"3E",x"05",x"CD", -- 0x21F0 + x"38",x"13",x"FD",x"21",x"3A",x"52",x"7B",x"D6", -- 0x21F8 + x"01",x"27",x"5F",x"7A",x"DE",x"00",x"27",x"57", -- 0x2200 + x"FD",x"77",x"00",x"7B",x"E6",x"0F",x"FD",x"77", -- 0x2208 + x"C0",x"7B",x"CB",x"3F",x"CB",x"3F",x"CB",x"3F", -- 0x2210 + x"CB",x"3F",x"FD",x"77",x"E0",x"7B",x"B2",x"C9", -- 0x2218 + x"54",x"4F",x"40",x"43",x"4F",x"4E",x"54",x"49", -- 0x2220 + x"4E",x"55",x"45",x"40",x"59",x"4F",x"55",x"52", -- 0x2228 + x"40",x"47",x"41",x"4D",x"45",x"54",x"49",x"4D", -- 0x2230 + x"45",x"49",x"4E",x"53",x"45",x"52",x"54",x"40", -- 0x2238 + x"41",x"40",x"43",x"4F",x"49",x"4E",x"40",x"49", -- 0x2240 + x"4E",x"53",x"45",x"52",x"54",x"40",x"32",x"40", -- 0x2248 + x"43",x"4F",x"49",x"4E",x"53",x"50",x"52",x"45", -- 0x2250 + x"53",x"53",x"40",x"46",x"49",x"52",x"45",x"40", -- 0x2258 + x"42",x"55",x"54",x"54",x"4F",x"4E",x"3A",x"EE", -- 0x2260 + x"40",x"A7",x"C2",x"72",x"23",x"21",x"D9",x"40", -- 0x2268 + x"46",x"CB",x"18",x"DC",x"EC",x"22",x"CB",x"18", -- 0x2270 + x"DC",x"FA",x"22",x"CB",x"18",x"DC",x"08",x"23", -- 0x2278 + x"CB",x"18",x"DC",x"21",x"23",x"CB",x"18",x"DC", -- 0x2280 + x"3A",x"23",x"CB",x"18",x"DC",x"53",x"23",x"3E", -- 0x2288 + x"FF",x"32",x"E2",x"40",x"3A",x"EF",x"40",x"CB", -- 0x2290 + x"67",x"C4",x"8F",x"24",x"E6",x"EF",x"C2",x"4F", -- 0x2298 + x"24",x"3A",x"EF",x"40",x"CB",x"7F",x"C4",x"E2", -- 0x22A0 + x"24",x"21",x"DA",x"40",x"46",x"CB",x"18",x"DC", -- 0x22A8 + x"98",x"23",x"CB",x"18",x"DC",x"A6",x"23",x"CB", -- 0x22B0 + x"18",x"DC",x"B1",x"23",x"CB",x"18",x"DC",x"C9", -- 0x22B8 + x"23",x"CB",x"18",x"DC",x"21",x"24",x"CB",x"18", -- 0x22C0 + x"DC",x"37",x"24",x"3A",x"E2",x"40",x"32",x"00", -- 0x22C8 + x"78",x"3A",x"E3",x"40",x"21",x"06",x"68",x"77", -- 0x22D0 + x"0F",x"77",x"3A",x"AF",x"40",x"CB",x"57",x"C0", -- 0x22D8 + x"21",x"03",x"68",x"3A",x"DA",x"40",x"77",x"0F", -- 0x22E0 + x"23",x"23",x"77",x"C9",x"21",x"D9",x"40",x"CB", -- 0x22E8 + x"86",x"23",x"CB",x"C6",x"3E",x"30",x"32",x"DB", -- 0x22F0 + x"40",x"C9",x"21",x"D9",x"40",x"CB",x"8E",x"23", -- 0x22F8 + x"CB",x"CE",x"3E",x"04",x"32",x"DC",x"40",x"C9", -- 0x2300 + x"21",x"D9",x"40",x"CB",x"96",x"23",x"CB",x"D6", -- 0x2308 + x"21",x"1C",x"23",x"11",x"DD",x"40",x"01",x"06", -- 0x2310 + x"00",x"ED",x"B0",x"C9",x"B9",x"23",x"08",x"01", -- 0x2318 + x"02",x"21",x"D9",x"40",x"CB",x"9E",x"23",x"CB", -- 0x2320 + x"DE",x"21",x"35",x"23",x"11",x"E4",x"40",x"01", -- 0x2328 + x"06",x"00",x"ED",x"B0",x"C9",x"D1",x"23",x"28", -- 0x2330 + x"01",x"02",x"21",x"D9",x"40",x"CB",x"A6",x"23", -- 0x2338 + x"CB",x"E6",x"21",x"4E",x"23",x"11",x"E9",x"40", -- 0x2340 + x"01",x"06",x"00",x"ED",x"B0",x"C9",x"29",x"24", -- 0x2348 + x"07",x"01",x"01",x"3A",x"AF",x"40",x"CB",x"57", -- 0x2350 + x"C0",x"21",x"D9",x"40",x"CB",x"AE",x"23",x"CB", -- 0x2358 + x"EE",x"21",x"6D",x"23",x"11",x"E4",x"40",x"01", -- 0x2360 + x"06",x"00",x"ED",x"B0",x"C9",x"3F",x"24",x"08", -- 0x2368 + x"01",x"03",x"21",x"EE",x"40",x"CB",x"56",x"20", -- 0x2370 + x"12",x"CB",x"5E",x"CA",x"6D",x"22",x"CB",x"9E", -- 0x2378 + x"23",x"CB",x"DE",x"21",x"F3",x"40",x"36",x"E0", -- 0x2380 + x"C3",x"6D",x"22",x"CB",x"96",x"23",x"CB",x"D6", -- 0x2388 + x"21",x"F2",x"40",x"36",x"00",x"C3",x"6D",x"22", -- 0x2390 + x"21",x"DB",x"40",x"35",x"C0",x"21",x"DA",x"40", -- 0x2398 + x"CB",x"86",x"2B",x"CB",x"EE",x"C9",x"21",x"DC", -- 0x23A0 + x"40",x"35",x"C0",x"21",x"DA",x"40",x"CB",x"8E", -- 0x23A8 + x"C9",x"FD",x"21",x"DD",x"40",x"0E",x"04",x"CD", -- 0x23B0 + x"AD",x"24",x"C9",x"4B",x"06",x"FF",x"03",x"4B", -- 0x23B8 + x"06",x"FF",x"03",x"4B",x"06",x"FF",x"03",x"1C", -- 0x23C0 + x"0C",x"FD",x"21",x"E4",x"40",x"0E",x"08",x"CD", -- 0x23C8 + x"AD",x"24",x"C9",x"68",x"05",x"FF",x"02",x"68", -- 0x23D0 + x"05",x"FF",x"02",x"68",x"05",x"FF",x"02",x"68", -- 0x23D8 + x"13",x"FF",x"02",x"68",x"05",x"FF",x"02",x"68", -- 0x23E0 + x"05",x"FF",x"02",x"68",x"05",x"FF",x"02",x"68", -- 0x23E8 + x"08",x"FF",x"02",x"4B",x"08",x"FF",x"02",x"1C", -- 0x23F0 + x"08",x"FF",x"02",x"4B",x"08",x"FF",x"02",x"68", -- 0x23F8 + x"08",x"FF",x"02",x"4B",x"08",x"FF",x"02",x"1C", -- 0x2400 + x"08",x"FF",x"02",x"4B",x"08",x"FF",x"02",x"68", -- 0x2408 + x"13",x"FF",x"02",x"68",x"05",x"FF",x"02",x"68", -- 0x2410 + x"05",x"FF",x"02",x"68",x"05",x"FF",x"02",x"68", -- 0x2418 + x"13",x"FD",x"21",x"E9",x"40",x"0E",x"10",x"CD", -- 0x2420 + x"AD",x"24",x"C9",x"9A",x"05",x"FF",x"04",x"9A", -- 0x2428 + x"05",x"FF",x"04",x"8E",x"03",x"9A",x"0C",x"FD", -- 0x2430 + x"21",x"E4",x"40",x"0E",x"20",x"CD",x"AD",x"24", -- 0x2438 + x"C9",x"80",x"10",x"FF",x"06",x"70",x"08",x"68", -- 0x2440 + x"10",x"FF",x"06",x"55",x"08",x"40",x"18",x"3A", -- 0x2448 + x"EF",x"40",x"CB",x"5F",x"20",x"1F",x"CB",x"57", -- 0x2450 + x"CA",x"A1",x"22",x"21",x"F2",x"40",x"3E",x"10", -- 0x2458 + x"86",x"77",x"32",x"E2",x"40",x"3E",x"03",x"32", -- 0x2460 + x"E3",x"40",x"D2",x"A1",x"22",x"21",x"EF",x"40", -- 0x2468 + x"CB",x"96",x"C3",x"A1",x"22",x"21",x"F3",x"40", -- 0x2470 + x"7E",x"D6",x"10",x"77",x"32",x"E2",x"40",x"3E", -- 0x2478 + x"03",x"32",x"E3",x"40",x"D2",x"A1",x"22",x"21", -- 0x2480 + x"EF",x"40",x"CB",x"9E",x"C3",x"A1",x"22",x"F5", -- 0x2488 + x"21",x"F0",x"40",x"7E",x"32",x"E2",x"40",x"3E", -- 0x2490 + x"03",x"32",x"E3",x"40",x"F1",x"23",x"35",x"C0", -- 0x2498 + x"36",x"0A",x"2B",x"CB",x"56",x"28",x"03",x"36", -- 0x24A0 + x"B8",x"C9",x"36",x"B4",x"C9",x"FD",x"35",x"03", -- 0x24A8 + x"20",x"1F",x"FD",x"35",x"02",x"20",x"07",x"21", -- 0x24B0 + x"DA",x"40",x"7E",x"A9",x"77",x"C9",x"FD",x"6E", -- 0x24B8 + x"00",x"FD",x"66",x"01",x"23",x"23",x"FD",x"75", -- 0x24C0 + x"00",x"FD",x"74",x"01",x"23",x"7E",x"FD",x"77", -- 0x24C8 + x"03",x"FD",x"6E",x"00",x"FD",x"66",x"01",x"7E", -- 0x24D0 + x"32",x"E2",x"40",x"FD",x"7E",x"04",x"32",x"E3", -- 0x24D8 + x"40",x"C9",x"3A",x"28",x"40",x"E6",x"0F",x"C6", -- 0x24E0 + x"80",x"32",x"E2",x"40",x"3E",x"03",x"32",x"E3", -- 0x24E8 + x"40",x"C9",x"3A",x"17",x"40",x"A7",x"20",x"08", -- 0x24F0 + x"21",x"EF",x"40",x"CB",x"A6",x"C3",x"21",x"25", -- 0x24F8 + x"3A",x"01",x"40",x"CB",x"47",x"20",x"F1",x"21", -- 0x2500 + x"EF",x"40",x"CB",x"66",x"20",x"13",x"3A",x"1E", -- 0x2508 + x"40",x"E6",x"03",x"FE",x"02",x"20",x"0A",x"CB", -- 0x2510 + x"E6",x"21",x"F0",x"40",x"36",x"B8",x"23",x"36", -- 0x2518 + x"0A",x"3A",x"AF",x"40",x"CB",x"57",x"C0",x"3A", -- 0x2520 + x"16",x"40",x"A7",x"20",x"0A",x"AF",x"21",x"00", -- 0x2528 + x"68",x"77",x"23",x"77",x"23",x"77",x"C9",x"CB", -- 0x2530 + x"27",x"3C",x"ED",x"44",x"06",x"04",x"21",x"04", -- 0x2538 + x"60",x"77",x"23",x"0F",x"10",x"FB",x"3E",x"01", -- 0x2540 + x"C3",x"2E",x"25",x"3A",x"AF",x"40",x"CB",x"57", -- 0x2548 + x"C0",x"3E",x"01",x"06",x"04",x"21",x"00",x"68", -- 0x2550 + x"77",x"23",x"10",x"FC",x"3A",x"27",x"40",x"E6", -- 0x2558 + x"F0",x"0F",x"0F",x"0F",x"0F",x"47",x"3E",x"0F", -- 0x2560 + x"90",x"06",x"04",x"21",x"04",x"60",x"77",x"0F", -- 0x2568 + x"23",x"10",x"FB",x"C9",x"DD",x"7E",x"DF",x"A7", -- 0x2570 + x"28",x"05",x"DD",x"7E",x"FF",x"A7",x"C0",x"CD", -- 0x2578 + x"67",x"0B",x"E6",x"3F",x"DD",x"77",x"FF",x"DD", -- 0x2580 + x"7E",x"F7",x"A7",x"C8",x"DD",x"7E",x"E1",x"DD", -- 0x2588 + x"BE",x"F8",x"D0",x"21",x"9A",x"25",x"CD",x"3F", -- 0x2590 + x"09",x"C9",x"FD",x"36",x"00",x"10",x"FD",x"36", -- 0x2598 + x"01",x"14",x"06",x"03",x"3A",x"2E",x"40",x"FE", -- 0x25A0 + x"03",x"30",x"02",x"06",x"05",x"FD",x"70",x"02", -- 0x25A8 + x"CD",x"67",x"0B",x"FD",x"77",x"03",x"DD",x"E5", -- 0x25B0 + x"D1",x"13",x"21",x"EE",x"25",x"01",x"08",x"00", -- 0x25B8 + x"ED",x"B0",x"CD",x"67",x"0B",x"6F",x"26",x"00", -- 0x25C0 + x"3A",x"1F",x"40",x"4F",x"06",x"08",x"29",x"7C", -- 0x25C8 + x"91",x"38",x"02",x"67",x"2C",x"10",x"F7",x"7C", -- 0x25D0 + x"DD",x"77",x"07",x"3A",x"F4",x"40",x"DD",x"77", -- 0x25D8 + x"0E",x"21",x"2E",x"40",x"35",x"DD",x"CB",x"00", -- 0x25E0 + x"CE",x"DD",x"CB",x"00",x"D6",x"C9",x"59",x"1D", -- 0x25E8 + x"79",x"0B",x"01",x"2C",x"00",x"01",x"DD",x"21", -- 0x25F0 + x"37",x"40",x"DD",x"7E",x"E1",x"A7",x"C8",x"3E", -- 0x25F8 + x"14",x"21",x"08",x"26",x"CD",x"5C",x"09",x"C9", -- 0x2600 + x"DD",x"CB",x"08",x"46",x"28",x"3E",x"DD",x"CB", -- 0x2608 + x"00",x"7E",x"20",x"1A",x"DD",x"7E",x"06",x"A7", -- 0x2610 + x"C0",x"DD",x"36",x"06",x"43",x"11",x"79",x"0B", -- 0x2618 + x"DD",x"73",x"03",x"DD",x"72",x"04",x"DD",x"36", -- 0x2620 + x"05",x"01",x"DD",x"35",x"07",x"C0",x"DD",x"CB", -- 0x2628 + x"08",x"26",x"AF",x"32",x"01",x"70",x"DD",x"36", -- 0x2630 + x"01",x"9B",x"DD",x"36",x"02",x"1D",x"3C",x"32", -- 0x2638 + x"01",x"70",x"CD",x"E7",x"08",x"DD",x"70",x"03", -- 0x2640 + x"DD",x"71",x"04",x"C9",x"FD",x"7E",x"00",x"FE", -- 0x2648 + x"10",x"38",x"0E",x"FE",x"F0",x"30",x"0A",x"FD", -- 0x2650 + x"7E",x"03",x"FE",x"02",x"38",x"03",x"FE",x"F0", -- 0x2658 + x"D8",x"DD",x"CB",x"00",x"46",x"C0",x"DD",x"CB", -- 0x2660 + x"00",x"8E",x"DD",x"CB",x"00",x"96",x"AF",x"FD", -- 0x2668 + x"77",x"00",x"FD",x"77",x"01",x"FD",x"77",x"03", -- 0x2670 + x"CD",x"67",x"0B",x"32",x"36",x"40",x"C9",x"3A", -- 0x2678 + x"1E",x"40",x"E6",x"1F",x"CB",x"2F",x"CB",x"2F", -- 0x2680 + x"A7",x"28",x"01",x"3D",x"6F",x"26",x"00",x"29", -- 0x2688 + x"29",x"29",x"E5",x"29",x"D1",x"19",x"11",x"A3", -- 0x2690 + x"26",x"19",x"11",x"1F",x"40",x"01",x"18",x"00", -- 0x2698 + x"ED",x"B0",x"C9",x"0E",x"10",x"0A",x"09",x"07", -- 0x26A0 + x"15",x"07",x"1C",x"99",x"99",x"02",x"00",x"3B", -- 0x26A8 + x"00",x"02",x"1E",x"04",x"04",x"32",x"02",x"0E", -- 0x26B0 + x"28",x"00",x"10",x"0D",x"0A",x"09",x"06",x"07", -- 0x26B8 + x"13",x"08",x"18",x"99",x"99",x"02",x"00",x"3A", -- 0x26C0 + x"00",x"02",x"23",x"05",x"05",x"3C",x"02",x"10", -- 0x26C8 + x"1E",x"00",x"10",x"0C",x"09",x"08",x"05",x"06", -- 0x26D0 + x"0C",x"07",x"16",x"99",x"99",x"02",x"00",x"39", -- 0x26D8 + x"00",x"03",x"23",x"05",x"05",x"46",x"02",x"12", -- 0x26E0 + x"14",x"00",x"10",x"0B",x"09",x"08",x"05",x"06", -- 0x26E8 + x"0C",x"04",x"14",x"99",x"99",x"02",x"00",x"38", -- 0x26F0 + x"00",x"03",x"28",x"06",x"05",x"50",x"03",x"14", -- 0x26F8 + x"0A",x"00",x"10",x"0A",x"0A",x"04",x"07",x"07", -- 0x2700 + x"06",x"04",x"13",x"99",x"99",x"02",x"00",x"37", -- 0x2708 + x"00",x"03",x"32",x"07",x"06",x"5A",x"03",x"16", -- 0x2710 + x"08",x"00",x"10",x"09",x"08",x"05",x"07",x"04", -- 0x2718 + x"06",x"03",x"12",x"99",x"99",x"02",x"00",x"36", -- 0x2720 + x"00",x"03",x"32",x"07",x"07",x"64",x"04",x"19", -- 0x2728 + x"06",x"00",x"10",x"07",x"08",x"05",x"07",x"04", -- 0x2730 + x"06",x"03",x"11",x"99",x"99",x"03",x"00",x"1A", -- 0x2738 + x"00",x"03",x"32",x"07",x"07",x"78",x"04",x"19", -- 0x2740 + x"04",x"00",x"10",x"DD",x"21",x"37",x"40",x"DD", -- 0x2748 + x"E5",x"CD",x"EC",x"27",x"DD",x"E1",x"DD",x"7E", -- 0x2750 + x"FB",x"DD",x"BE",x"E5",x"C8",x"DD",x"7E",x"FC", -- 0x2758 + x"A7",x"C8",x"DD",x"7E",x"DF",x"A7",x"28",x"05", -- 0x2760 + x"DD",x"7E",x"FF",x"A7",x"C0",x"DD",x"7E",x"FD", -- 0x2768 + x"DD",x"77",x"FF",x"21",x"7A",x"27",x"CD",x"3F", -- 0x2770 + x"09",x"C9",x"DD",x"E5",x"D1",x"13",x"21",x"DD", -- 0x2778 + x"27",x"01",x"0F",x"00",x"ED",x"B0",x"CD",x"67", -- 0x2780 + x"0B",x"DD",x"77",x"0F",x"06",x"10",x"16",x"02", -- 0x2788 + x"CB",x"7F",x"28",x"04",x"06",x"F0",x"16",x"FE", -- 0x2790 + x"0E",x"10",x"1E",x"02",x"CB",x"77",x"28",x"04", -- 0x2798 + x"0E",x"F0",x"1E",x"FE",x"FD",x"70",x"00",x"FD", -- 0x27A0 + x"71",x"03",x"DD",x"72",x"03",x"DD",x"73",x"04", -- 0x27A8 + x"CD",x"67",x"0B",x"E6",x"3F",x"F6",x"07",x"DD", -- 0x27B0 + x"77",x"0E",x"FD",x"36",x"01",x"18",x"06",x"00", -- 0x27B8 + x"3A",x"33",x"40",x"FE",x"03",x"30",x"02",x"06", -- 0x27C0 + x"01",x"FD",x"70",x"02",x"DD",x"CB",x"00",x"CE", -- 0x27C8 + x"DD",x"CB",x"00",x"D6",x"21",x"33",x"40",x"35", -- 0x27D0 + x"DD",x"CB",x"08",x"DE",x"C9",x"9B",x"1D",x"00", -- 0x27D8 + x"00",x"01",x"11",x"00",x"01",x"00",x"00",x"00", -- 0x27E0 + x"00",x"00",x"04",x"00",x"3E",x"18",x"21",x"3D", -- 0x27E8 + x"28",x"CD",x"5C",x"09",x"DD",x"21",x"37",x"40", -- 0x27F0 + x"DD",x"7E",x"FF",x"A7",x"C0",x"DD",x"7E",x"E0", -- 0x27F8 + x"DD",x"BE",x"F6",x"D0",x"CD",x"67",x"0B",x"6F", -- 0x2800 + x"26",x"00",x"3A",x"1C",x"40",x"4F",x"06",x"08", -- 0x2808 + x"29",x"7C",x"91",x"38",x"02",x"67",x"2C",x"10", -- 0x2810 + x"F7",x"4C",x"0C",x"DD",x"21",x"37",x"40",x"FD", -- 0x2818 + x"21",x"04",x"42",x"06",x"07",x"FD",x"7E",x"01", -- 0x2820 + x"FE",x"18",x"20",x"03",x"0D",x"28",x"06",x"CD", -- 0x2828 + x"78",x"09",x"10",x"F1",x"C9",x"DD",x"CB",x"08", -- 0x2830 + x"66",x"C0",x"C3",x"4B",x"28",x"DD",x"CB",x"00", -- 0x2838 + x"46",x"C8",x"DD",x"CB",x"08",x"66",x"C0",x"DD", -- 0x2840 + x"CB",x"08",x"E6",x"FD",x"E5",x"21",x"56",x"28", -- 0x2848 + x"CD",x"3F",x"09",x"FD",x"E1",x"C9",x"D1",x"D1", -- 0x2850 + x"1A",x"47",x"3A",x"00",x"42",x"B8",x"38",x"04", -- 0x2858 + x"78",x"C6",x"E0",x"47",x"78",x"C6",x"10",x"FD", -- 0x2860 + x"77",x"00",x"FD",x"36",x"01",x"13",x"FD",x"36", -- 0x2868 + x"02",x"06",x"13",x"13",x"13",x"1A",x"FD",x"77", -- 0x2870 + x"03",x"DD",x"E5",x"D1",x"13",x"21",x"81",x"29", -- 0x2878 + x"01",x"08",x"00",x"ED",x"B0",x"DD",x"36",x"0E", -- 0x2880 + x"0A",x"DD",x"CB",x"08",x"E6",x"DD",x"CB",x"00", -- 0x2888 + x"CE",x"DD",x"CB",x"00",x"D6",x"C9",x"DD",x"21", -- 0x2890 + x"37",x"40",x"DD",x"7E",x"FB",x"A7",x"C8",x"3E", -- 0x2898 + x"18",x"21",x"A8",x"28",x"CD",x"5C",x"09",x"C9", -- 0x28A0 + x"DD",x"CB",x"08",x"5E",x"C2",x"E4",x"28",x"DD", -- 0x28A8 + x"CB",x"00",x"7E",x"C2",x"5F",x"29",x"CD",x"2F", -- 0x28B0 + x"29",x"FD",x"7E",x"00",x"FE",x"20",x"47",x"30", -- 0x28B8 + x"04",x"FD",x"36",x"00",x"20",x"78",x"FE",x"E0", -- 0x28C0 + x"38",x"04",x"FD",x"36",x"00",x"DF",x"FD",x"7E", -- 0x28C8 + x"03",x"FE",x"20",x"47",x"30",x"04",x"FD",x"36", -- 0x28D0 + x"03",x"20",x"78",x"FE",x"E0",x"38",x"04",x"FD", -- 0x28D8 + x"36",x"03",x"DF",x"C9",x"FD",x"7E",x"00",x"FE", -- 0x28E0 + x"08",x"DA",x"4F",x"0B",x"FE",x"F8",x"D2",x"4F", -- 0x28E8 + x"0B",x"FD",x"7E",x"03",x"FE",x"08",x"DA",x"4F", -- 0x28F0 + x"0B",x"FE",x"F8",x"D2",x"4F",x"0B",x"DD",x"7E", -- 0x28F8 + x"0E",x"A7",x"C0",x"DD",x"CB",x"08",x"9E",x"CD", -- 0x2900 + x"67",x"0B",x"F6",x"0F",x"DD",x"77",x"0E",x"21", -- 0x2908 + x"2B",x"29",x"DD",x"E5",x"D1",x"13",x"3E",x"00", -- 0x2910 + x"32",x"01",x"70",x"01",x"04",x"00",x"ED",x"B0", -- 0x2918 + x"3C",x"32",x"01",x"70",x"CD",x"67",x"0B",x"DD", -- 0x2920 + x"77",x"07",x"C9",x"A2",x"1D",x"C1",x"0B",x"DD", -- 0x2928 + x"7E",x"06",x"A7",x"C0",x"DD",x"36",x"06",x"11", -- 0x2930 + x"11",x"C1",x"0B",x"DD",x"73",x"03",x"DD",x"72", -- 0x2938 + x"04",x"DD",x"36",x"05",x"01",x"DD",x"46",x"0F", -- 0x2940 + x"CB",x"60",x"28",x"04",x"3E",x"02",x"A8",x"47", -- 0x2948 + x"CB",x"68",x"28",x"04",x"3E",x"08",x"A8",x"47", -- 0x2950 + x"DD",x"70",x"0F",x"DD",x"35",x"07",x"C0",x"DD", -- 0x2958 + x"E5",x"D1",x"13",x"21",x"DD",x"27",x"01",x"04", -- 0x2960 + x"00",x"AF",x"32",x"01",x"70",x"ED",x"B0",x"3C", -- 0x2968 + x"32",x"01",x"70",x"CD",x"E7",x"08",x"DD",x"70", -- 0x2970 + x"03",x"DD",x"71",x"04",x"DD",x"CB",x"08",x"DE", -- 0x2978 + x"C9",x"9B",x"1D",x"00",x"00",x"00",x"00",x"00", -- 0x2980 + x"00",x"7F",x"7E",x"7F",x"7E",x"7F",x"7E",x"7F", -- 0x2988 + x"7E",x"7F",x"7E",x"7F",x"7E",x"7F",x"7E",x"7F", -- 0x2990 + x"7E",x"7F",x"7E",x"7F",x"7E",x"7F",x"7E",x"7F", -- 0x2998 + x"7E",x"5F",x"5E",x"5F",x"5E",x"5F",x"5E",x"5F", -- 0x29A0 + x"5E",x"5F",x"5E",x"5F",x"5E",x"5F",x"5E",x"5F", -- 0x29A8 + x"5E",x"5F",x"5E",x"5F",x"5E",x"5F",x"5E",x"5F", -- 0x29B0 + x"5E",x"5F",x"5E",x"5F",x"5E",x"5F",x"5E",x"5F", -- 0x29B8 + x"5E",x"3F",x"3E",x"3F",x"3E",x"3F",x"3E",x"3F", -- 0x29C0 + x"3E",x"3F",x"3E",x"3F",x"3E",x"3F",x"3E",x"3F", -- 0x29C8 + x"3E",x"3F",x"3E",x"3F",x"3E",x"3F",x"3E",x"3F", -- 0x29D0 + x"3E",x"3F",x"3E",x"3F",x"3E",x"3F",x"3E",x"3F", -- 0x29D8 + x"3E",x"1F",x"1E",x"1F",x"1E",x"1F",x"1E",x"1F", -- 0x29E0 + x"1E",x"1F",x"1E",x"1F",x"1E",x"1F",x"1E",x"1F", -- 0x29E8 + x"1E",x"1F",x"1E",x"1F",x"1E",x"1F",x"1E",x"1F", -- 0x29F0 + x"1E",x"1F",x"1E",x"1F",x"1E",x"1F",x"1E",x"1F", -- 0x29F8 + x"1E",x"FF",x"FF",x"FD",x"FD",x"FF",x"FF",x"FD", -- 0x2A00 + x"FD",x"FF",x"FF",x"FD",x"FD",x"FF",x"FF",x"FD", -- 0x2A08 + x"FD",x"FF",x"FF",x"FD",x"FD",x"FF",x"FF",x"FD", -- 0x2A10 + x"FD",x"FF",x"FF",x"FD",x"FD",x"FF",x"FF",x"FD", -- 0x2A18 + x"FD",x"DF",x"DF",x"DD",x"DD",x"DF",x"DF",x"DD", -- 0x2A20 + x"DD",x"DF",x"DF",x"DD",x"DD",x"DF",x"DF",x"DD", -- 0x2A28 + x"DD",x"DF",x"DF",x"DD",x"DD",x"DF",x"DF",x"DD", -- 0x2A30 + x"DD",x"DF",x"DF",x"DD",x"DD",x"DF",x"DF",x"DD", -- 0x2A38 + x"DD",x"BF",x"BF",x"BD",x"BD",x"BF",x"BF",x"BD", -- 0x2A40 + x"BD",x"BF",x"BF",x"BD",x"BD",x"BF",x"BF",x"BD", -- 0x2A48 + x"BD",x"BF",x"BF",x"BD",x"BD",x"BF",x"BF",x"BD", -- 0x2A50 + x"BD",x"BF",x"BF",x"BD",x"BD",x"BF",x"BF",x"BD", -- 0x2A58 + x"BD",x"9F",x"9F",x"9D",x"9D",x"9F",x"9F",x"9D", -- 0x2A60 + x"9D",x"9F",x"9F",x"9D",x"9D",x"9F",x"9F",x"9D", -- 0x2A68 + x"9D",x"9F",x"9F",x"9D",x"9D",x"9F",x"9F",x"9D", -- 0x2A70 + x"9D",x"9F",x"9F",x"9D",x"9D",x"9F",x"9F",x"9D", -- 0x2A78 + x"9D",x"7F",x"7F",x"7D",x"7D",x"7F",x"7F",x"7D", -- 0x2A80 + x"7D",x"7F",x"7F",x"7D",x"7D",x"7F",x"7F",x"7D", -- 0x2A88 + x"7D",x"7F",x"7F",x"7D",x"7D",x"7F",x"7F",x"7D", -- 0x2A90 + x"7D",x"7F",x"7F",x"7D",x"7D",x"7F",x"7F",x"7D", -- 0x2A98 + x"7D",x"5F",x"5F",x"5D",x"5D",x"5F",x"5F",x"5D", -- 0x2AA0 + x"5D",x"5F",x"5F",x"5D",x"5D",x"5F",x"5F",x"5D", -- 0x2AA8 + x"5D",x"5F",x"5F",x"5D",x"5D",x"5F",x"5F",x"5D", -- 0x2AB0 + x"5D",x"5F",x"5F",x"5D",x"5D",x"5F",x"5F",x"5D", -- 0x2AB8 + x"5D",x"3F",x"3F",x"3D",x"3D",x"3F",x"3F",x"3D", -- 0x2AC0 + x"3D",x"3F",x"3F",x"3D",x"3D",x"3F",x"3F",x"3D", -- 0x2AC8 + x"3D",x"3F",x"3F",x"3D",x"3D",x"3F",x"3F",x"3D", -- 0x2AD0 + x"3D",x"3F",x"3F",x"3D",x"3D",x"3F",x"3F",x"3D", -- 0x2AD8 + x"3D",x"1F",x"1F",x"1D",x"1D",x"1F",x"1F",x"1D", -- 0x2AE0 + x"1D",x"1F",x"1F",x"1D",x"1D",x"1F",x"1F",x"1D", -- 0x2AE8 + x"1D",x"1F",x"1F",x"1D",x"1D",x"1F",x"1F",x"1D", -- 0x2AF0 + x"1D",x"1F",x"1F",x"1D",x"1D",x"1F",x"1F",x"1D", -- 0x2AF8 + x"1D",x"FF",x"FE",x"FD",x"FC",x"FF",x"FE",x"FD", -- 0x2B00 + x"FC",x"FF",x"FE",x"FD",x"FC",x"FF",x"FE",x"FD", -- 0x2B08 + x"FC",x"FF",x"FE",x"FD",x"FC",x"FF",x"FE",x"FD", -- 0x2B10 + x"FC",x"FF",x"FE",x"FD",x"FC",x"FF",x"FE",x"FD", -- 0x2B18 + x"FC",x"DF",x"DE",x"DD",x"DC",x"DF",x"DE",x"DD", -- 0x2B20 + x"DC",x"DF",x"DE",x"DD",x"DC",x"DF",x"DE",x"DD", -- 0x2B28 + x"DC",x"DF",x"DE",x"DD",x"DC",x"DF",x"DE",x"DD", -- 0x2B30 + x"DC",x"DF",x"DE",x"DD",x"DC",x"DF",x"DE",x"DD", -- 0x2B38 + x"DC",x"BF",x"BE",x"BD",x"BC",x"BF",x"BE",x"BD", -- 0x2B40 + x"BC",x"BF",x"BE",x"BD",x"BC",x"BF",x"BE",x"BD", -- 0x2B48 + x"BC",x"BF",x"BE",x"BD",x"BC",x"BF",x"BE",x"BD", -- 0x2B50 + x"BC",x"BF",x"BE",x"BD",x"BC",x"BF",x"BE",x"BD", -- 0x2B58 + x"BC",x"9F",x"9E",x"9D",x"9C",x"9F",x"9E",x"9D", -- 0x2B60 + x"9C",x"9F",x"9E",x"9D",x"9C",x"9F",x"9E",x"9D", -- 0x2B68 + x"9C",x"9F",x"9E",x"9D",x"9C",x"9F",x"9E",x"9D", -- 0x2B70 + x"9C",x"9F",x"9E",x"9D",x"9C",x"9F",x"9E",x"9D", -- 0x2B78 + x"9C",x"7F",x"7E",x"7D",x"7C",x"7F",x"7E",x"7D", -- 0x2B80 + x"7C",x"7F",x"7E",x"7D",x"7C",x"7F",x"7E",x"7D", -- 0x2B88 + x"7C",x"7F",x"7E",x"7D",x"7C",x"7F",x"7E",x"7D", -- 0x2B90 + x"7C",x"7F",x"7E",x"7D",x"7C",x"7F",x"7E",x"7D", -- 0x2B98 + x"7C",x"5F",x"5E",x"5D",x"5C",x"5F",x"5E",x"5D", -- 0x2BA0 + x"5C",x"5F",x"5E",x"5D",x"5C",x"5F",x"5E",x"5D", -- 0x2BA8 + x"5C",x"5F",x"5E",x"5D",x"5C",x"5F",x"5E",x"5D", -- 0x2BB0 + x"5C",x"5F",x"5E",x"5D",x"5C",x"5F",x"5E",x"5D", -- 0x2BB8 + x"5C",x"3F",x"3E",x"3D",x"3C",x"3F",x"3E",x"3D", -- 0x2BC0 + x"3C",x"3F",x"3E",x"3D",x"3C",x"3F",x"3E",x"3D", -- 0x2BC8 + x"3C",x"3F",x"3E",x"3D",x"3C",x"3F",x"3E",x"3D", -- 0x2BD0 + x"3C",x"3F",x"3E",x"3D",x"3C",x"3F",x"3E",x"3D", -- 0x2BD8 + x"3C",x"1F",x"1E",x"1D",x"1C",x"1F",x"1E",x"1D", -- 0x2BE0 + x"1C",x"1F",x"1E",x"1D",x"1C",x"1F",x"1E",x"1D", -- 0x2BE8 + x"1C",x"1F",x"1E",x"1D",x"1C",x"1F",x"1E",x"1D", -- 0x2BF0 + x"1C",x"1F",x"1E",x"1D",x"1C",x"1F",x"1E",x"1D", -- 0x2BF8 + x"1C",x"FF",x"FF",x"FF",x"FF",x"FB",x"FB",x"FB", -- 0x2C00 + x"FB",x"FF",x"FF",x"FF",x"FF",x"FB",x"FB",x"FB", -- 0x2C08 + x"FB",x"FF",x"FF",x"FF",x"FF",x"FB",x"FB",x"FB", -- 0x2C10 + x"FB",x"FF",x"FF",x"FF",x"FF",x"FB",x"FB",x"FB", -- 0x2C18 + x"FB",x"DF",x"DF",x"DF",x"DF",x"DB",x"DB",x"DB", -- 0x2C20 + x"DB",x"DF",x"DF",x"DF",x"DF",x"DB",x"DB",x"DB", -- 0x2C28 + x"DB",x"DF",x"DF",x"DF",x"DF",x"DB",x"DB",x"DB", -- 0x2C30 + x"DB",x"DF",x"DF",x"DF",x"DF",x"DB",x"DB",x"DB", -- 0x2C38 + x"DB",x"BF",x"BF",x"BF",x"BF",x"BB",x"BB",x"BB", -- 0x2C40 + x"BB",x"BF",x"BF",x"BF",x"BF",x"BB",x"BB",x"BB", -- 0x2C48 + x"BB",x"BF",x"BF",x"BF",x"BF",x"BB",x"BB",x"BB", -- 0x2C50 + x"BB",x"BF",x"BF",x"BF",x"BF",x"BB",x"BB",x"BB", -- 0x2C58 + x"BB",x"9F",x"9F",x"9F",x"9F",x"9B",x"9B",x"9B", -- 0x2C60 + x"9B",x"9F",x"9F",x"9F",x"9F",x"9B",x"9B",x"9B", -- 0x2C68 + x"9B",x"9F",x"9F",x"9F",x"9F",x"9B",x"9B",x"9B", -- 0x2C70 + x"9B",x"9F",x"9F",x"9F",x"9F",x"9B",x"9B",x"9B", -- 0x2C78 + x"9B",x"7F",x"7F",x"7F",x"7F",x"7B",x"7B",x"7B", -- 0x2C80 + x"7B",x"7F",x"7F",x"7F",x"7F",x"7B",x"7B",x"7B", -- 0x2C88 + x"7B",x"7F",x"7F",x"7F",x"7F",x"7B",x"7B",x"7B", -- 0x2C90 + x"7B",x"7F",x"7F",x"7F",x"7F",x"7B",x"7B",x"7B", -- 0x2C98 + x"7B",x"5F",x"5F",x"5F",x"5F",x"5B",x"5B",x"5B", -- 0x2CA0 + x"5B",x"5F",x"5F",x"5F",x"5F",x"5B",x"5B",x"5B", -- 0x2CA8 + x"5B",x"5F",x"5F",x"5F",x"5F",x"5B",x"5B",x"5B", -- 0x2CB0 + x"5B",x"5F",x"5F",x"5F",x"5F",x"5B",x"5B",x"5B", -- 0x2CB8 + x"5B",x"3F",x"3F",x"3F",x"3F",x"3B",x"3B",x"3B", -- 0x2CC0 + x"3B",x"3F",x"3F",x"3F",x"3F",x"3B",x"3B",x"3B", -- 0x2CC8 + x"3B",x"3F",x"3F",x"3F",x"3F",x"3B",x"3B",x"3B", -- 0x2CD0 + x"3B",x"3F",x"3F",x"3F",x"3F",x"3B",x"3B",x"3B", -- 0x2CD8 + x"3B",x"1F",x"1F",x"1F",x"1F",x"1B",x"1B",x"1B", -- 0x2CE0 + x"1B",x"1F",x"1F",x"1F",x"1F",x"1B",x"1B",x"1B", -- 0x2CE8 + x"1B",x"1F",x"1F",x"1F",x"1F",x"1B",x"1B",x"1B", -- 0x2CF0 + x"1B",x"1F",x"1F",x"1F",x"1F",x"1B",x"1B",x"1B", -- 0x2CF8 + x"1B",x"FF",x"FE",x"FF",x"FE",x"FB",x"FA",x"FB", -- 0x2D00 + x"FA",x"FF",x"FE",x"FF",x"FE",x"FB",x"FA",x"FB", -- 0x2D08 + x"FA",x"FF",x"FE",x"FF",x"FE",x"FB",x"FA",x"FB", -- 0x2D10 + x"FA",x"FF",x"FE",x"FF",x"FE",x"FB",x"FA",x"FB", -- 0x2D18 + x"FA",x"DF",x"DE",x"DF",x"DE",x"DB",x"DA",x"DB", -- 0x2D20 + x"DA",x"DF",x"DE",x"DF",x"DE",x"DB",x"DA",x"DB", -- 0x2D28 + x"DA",x"DF",x"DE",x"DF",x"DE",x"DB",x"DA",x"DB", -- 0x2D30 + x"DA",x"DF",x"DE",x"DF",x"DE",x"DB",x"DA",x"DB", -- 0x2D38 + x"DA",x"BF",x"BE",x"BF",x"BE",x"BB",x"BA",x"BB", -- 0x2D40 + x"BA",x"BF",x"BE",x"BF",x"BE",x"BB",x"BA",x"BB", -- 0x2D48 + x"BA",x"BF",x"BE",x"BF",x"BE",x"BB",x"BA",x"BB", -- 0x2D50 + x"BA",x"BF",x"BE",x"BF",x"BE",x"BB",x"BA",x"BB", -- 0x2D58 + x"BA",x"9F",x"9E",x"9F",x"9E",x"9B",x"9A",x"9B", -- 0x2D60 + x"9A",x"9F",x"9E",x"9F",x"9E",x"9B",x"9A",x"9B", -- 0x2D68 + x"9A",x"9F",x"9E",x"9F",x"9E",x"9B",x"9A",x"9B", -- 0x2D70 + x"9A",x"9F",x"9E",x"9F",x"9E",x"9B",x"9A",x"9B", -- 0x2D78 + x"9A",x"7F",x"7E",x"7F",x"7E",x"7B",x"7A",x"7B", -- 0x2D80 + x"7A",x"7F",x"7E",x"7F",x"7E",x"7B",x"7A",x"7B", -- 0x2D88 + x"7A",x"7F",x"7E",x"7F",x"7E",x"7B",x"7A",x"7B", -- 0x2D90 + x"7A",x"7F",x"7E",x"7F",x"7E",x"7B",x"7A",x"7B", -- 0x2D98 + x"7A",x"5F",x"5E",x"5F",x"5E",x"5B",x"5A",x"5B", -- 0x2DA0 + x"5A",x"5F",x"5E",x"5F",x"5E",x"5B",x"5A",x"5B", -- 0x2DA8 + x"5A",x"5F",x"5E",x"5F",x"5E",x"5B",x"5A",x"5B", -- 0x2DB0 + x"5A",x"5F",x"5E",x"5F",x"5E",x"5B",x"5A",x"5B", -- 0x2DB8 + x"5A",x"3F",x"3E",x"3F",x"3E",x"3B",x"3A",x"3B", -- 0x2DC0 + x"3A",x"3F",x"3E",x"3F",x"3E",x"3B",x"3A",x"3B", -- 0x2DC8 + x"3A",x"3F",x"3E",x"3F",x"3E",x"3B",x"3A",x"3B", -- 0x2DD0 + x"3A",x"3F",x"3E",x"3F",x"3E",x"3B",x"3A",x"3B", -- 0x2DD8 + x"3A",x"1F",x"1E",x"1F",x"1E",x"1B",x"1A",x"1B", -- 0x2DE0 + x"1A",x"1F",x"1E",x"1F",x"1E",x"1B",x"1A",x"1B", -- 0x2DE8 + x"1A",x"1F",x"1E",x"1F",x"1E",x"1B",x"1A",x"1B", -- 0x2DF0 + x"1A",x"1F",x"1E",x"1F",x"1E",x"1B",x"1A",x"1B", -- 0x2DF8 + x"1A",x"FF",x"FF",x"FD",x"FD",x"FB",x"FB",x"F9", -- 0x2E00 + x"F9",x"FF",x"FF",x"FD",x"FD",x"FB",x"FB",x"F9", -- 0x2E08 + x"F9",x"FF",x"FF",x"FD",x"FD",x"FB",x"FB",x"F9", -- 0x2E10 + x"F9",x"FF",x"FF",x"FD",x"FD",x"FB",x"FB",x"F9", -- 0x2E18 + x"F9",x"DF",x"DF",x"DD",x"DD",x"DB",x"DB",x"D9", -- 0x2E20 + x"D9",x"DF",x"DF",x"DD",x"DD",x"DB",x"DB",x"D9", -- 0x2E28 + x"D9",x"DF",x"DF",x"DD",x"DD",x"DB",x"DB",x"D9", -- 0x2E30 + x"D9",x"DF",x"DF",x"DD",x"DD",x"DB",x"DB",x"D9", -- 0x2E38 + x"D9",x"BF",x"BF",x"BD",x"BD",x"BB",x"BB",x"B9", -- 0x2E40 + x"B9",x"BF",x"BF",x"BD",x"BD",x"BB",x"BB",x"B9", -- 0x2E48 + x"B9",x"BF",x"BF",x"BD",x"BD",x"BB",x"BB",x"B9", -- 0x2E50 + x"B9",x"BF",x"BF",x"BD",x"BD",x"BB",x"BB",x"B9", -- 0x2E58 + x"B9",x"9F",x"9F",x"9D",x"9D",x"9B",x"9B",x"99", -- 0x2E60 + x"99",x"9F",x"9F",x"9D",x"9D",x"9B",x"9B",x"99", -- 0x2E68 + x"99",x"9F",x"9F",x"9D",x"9D",x"9B",x"9B",x"99", -- 0x2E70 + x"99",x"9F",x"9F",x"9D",x"9D",x"9B",x"9B",x"99", -- 0x2E78 + x"99",x"7F",x"7F",x"7D",x"7D",x"7B",x"7B",x"79", -- 0x2E80 + x"79",x"7F",x"7F",x"7D",x"7D",x"7B",x"7B",x"79", -- 0x2E88 + x"79",x"7F",x"7F",x"7D",x"7D",x"7B",x"7B",x"79", -- 0x2E90 + x"79",x"7F",x"7F",x"7D",x"7D",x"7B",x"7B",x"79", -- 0x2E98 + x"79",x"5F",x"5F",x"5D",x"5D",x"5B",x"5B",x"59", -- 0x2EA0 + x"59",x"5F",x"5F",x"5D",x"5D",x"5B",x"5B",x"59", -- 0x2EA8 + x"59",x"5F",x"5F",x"5D",x"5D",x"5B",x"5B",x"59", -- 0x2EB0 + x"59",x"5F",x"5F",x"5D",x"5D",x"5B",x"5B",x"59", -- 0x2EB8 + x"59",x"3F",x"3F",x"3D",x"3D",x"3B",x"3B",x"39", -- 0x2EC0 + x"39",x"3F",x"3F",x"3D",x"3D",x"3B",x"3B",x"39", -- 0x2EC8 + x"39",x"3F",x"3F",x"3D",x"3D",x"3B",x"3B",x"39", -- 0x2ED0 + x"39",x"3F",x"3F",x"3D",x"3D",x"3B",x"3B",x"39", -- 0x2ED8 + x"39",x"1F",x"1F",x"1D",x"1D",x"1B",x"1B",x"19", -- 0x2EE0 + x"19",x"1F",x"1F",x"1D",x"1D",x"1B",x"1B",x"19", -- 0x2EE8 + x"19",x"1F",x"1F",x"1D",x"1D",x"1B",x"1B",x"19", -- 0x2EF0 + x"19",x"1F",x"1F",x"1D",x"1D",x"1B",x"1B",x"19", -- 0x2EF8 + x"19",x"FF",x"FE",x"FD",x"FC",x"FB",x"FA",x"F9", -- 0x2F00 + x"F8",x"FF",x"FE",x"FD",x"FC",x"FB",x"FA",x"F9", -- 0x2F08 + x"F8",x"FF",x"FE",x"FD",x"FC",x"FB",x"FA",x"F9", -- 0x2F10 + x"F8",x"FF",x"FE",x"FD",x"FC",x"FB",x"FA",x"F9", -- 0x2F18 + x"F8",x"DF",x"DE",x"DD",x"DC",x"DB",x"DA",x"D9", -- 0x2F20 + x"D8",x"DF",x"DE",x"DD",x"DC",x"DB",x"DA",x"D9", -- 0x2F28 + x"D8",x"DF",x"DE",x"DD",x"DC",x"DB",x"DA",x"D9", -- 0x2F30 + x"D8",x"DF",x"DE",x"DD",x"DC",x"DB",x"DA",x"D9", -- 0x2F38 + x"D8",x"BF",x"BE",x"BD",x"BC",x"BB",x"BA",x"B9", -- 0x2F40 + x"B8",x"BF",x"BE",x"BD",x"BC",x"BB",x"BA",x"B9", -- 0x2F48 + x"B8",x"BF",x"BE",x"BD",x"BC",x"BB",x"BA",x"B9", -- 0x2F50 + x"B8",x"BF",x"BE",x"BD",x"BC",x"BB",x"BA",x"B9", -- 0x2F58 + x"B8",x"9F",x"9E",x"9D",x"9C",x"9B",x"9A",x"99", -- 0x2F60 + x"98",x"9F",x"9E",x"9D",x"9C",x"9B",x"9A",x"99", -- 0x2F68 + x"98",x"9F",x"9E",x"9D",x"9C",x"9B",x"9A",x"99", -- 0x2F70 + x"98",x"9F",x"9E",x"9D",x"9C",x"9B",x"9A",x"99", -- 0x2F78 + x"98",x"7F",x"7E",x"7D",x"7C",x"7B",x"7A",x"79", -- 0x2F80 + x"78",x"7F",x"7E",x"7D",x"7C",x"7B",x"7A",x"79", -- 0x2F88 + x"78",x"7F",x"7E",x"7D",x"7C",x"7B",x"7A",x"79", -- 0x2F90 + x"78",x"7F",x"7E",x"7D",x"7C",x"7B",x"7A",x"79", -- 0x2F98 + x"78",x"5F",x"5E",x"5D",x"5C",x"5B",x"5A",x"59", -- 0x2FA0 + x"58",x"5F",x"5E",x"5D",x"5C",x"5B",x"5A",x"59", -- 0x2FA8 + x"58",x"5F",x"5E",x"5D",x"5C",x"5B",x"5A",x"59", -- 0x2FB0 + x"58",x"5F",x"5E",x"5D",x"5C",x"5B",x"5A",x"59", -- 0x2FB8 + x"58",x"3F",x"3E",x"3D",x"3C",x"3B",x"3A",x"39", -- 0x2FC0 + x"38",x"3F",x"3E",x"3D",x"3C",x"3B",x"3A",x"39", -- 0x2FC8 + x"38",x"3F",x"3E",x"3D",x"3C",x"3B",x"3A",x"39", -- 0x2FD0 + x"38",x"3F",x"3E",x"3D",x"3C",x"3B",x"3A",x"39", -- 0x2FD8 + x"38",x"1F",x"1E",x"1D",x"1C",x"1B",x"1A",x"19", -- 0x2FE0 + x"18",x"1F",x"1E",x"1D",x"1C",x"1B",x"1A",x"19", -- 0x2FE8 + x"18",x"1F",x"1E",x"1D",x"1C",x"1B",x"1A",x"19", -- 0x2FF0 + x"18",x"1F",x"1E",x"1D",x"1C",x"1B",x"1A",x"19" -- 0x2FF8 + ); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; + diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/build_id.tcl b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_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/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/build_id.v b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/build_id.v new file mode 100644 index 00000000..2a638338 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180109" +`define BUILD_TIME "174542" diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c07d2629 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1093 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..6bd576cf --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..ee217402 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2026 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..679730ab --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80as.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80as.vhd new file mode 100644 index 00000000..fe477f50 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/cpu/T80as.vhd @@ -0,0 +1,283 @@ +------------------------------------------------------------------------------ +-- t80as.vhd : The non-tristate signal edition of t80a.vhd +-- +-- 2003.2.7 non-tristate modification by Tatsuyuki Satoh +-- +-- 1.separate 'D' to 'DO' and 'DI'. +-- 2.added 'DOE' to 'DO' enable signal.(data direction) +-- 3.MREQ_n,IORQ_n,RD_n,WR_n,RFSH_n,A doesn't become the condition of 'Z'. +-- +-- There is a mark of "--AS" in all the change points. +-- +------------------------------------------------------------------------------ + +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80as is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); +--AS-- D : inout std_logic_vector(7 downto 0) +--AS>> + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + DOE : out std_logic +--< 'Z'); +--AS-- D <= DO when Write = '1' and BUSAK_n_i = '1' else (others => 'Z'); +--AS>> + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DOE <= Write when BUSAK_n_i = '1' else '0'; +--< Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, +-- DInst => D, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then +--AS-- DI_Reg <= to_x01(D); +--AS>> + DI_Reg <= to_x01(DI); +--< 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/dac.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/dac.vhd new file mode 100644 index 00000000..b1ecdcb7 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_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 := 11 + ); + 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/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/dpram.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..dafe8385 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/galaxian.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/galaxian.vhd new file mode 100644 index 00000000..5f8a3a74 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/galaxian.vhd @@ -0,0 +1,446 @@ +------------------------------------------------------------------------------ +-- FPGA GALAXIAN +-- +-- Version downto 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important not +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +-- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--use work.pkg_galaxian.all; + +entity galaxian is + port( + W_CLK_18M : in std_logic; + W_CLK_12M : in std_logic; + W_CLK_6M : in std_logic; + + P1_CSJUDLR : in std_logic_vector(6 downto 0); + P2_CSJUDLR : in std_logic_vector(6 downto 0); + I_RESET : in std_logic; + + W_R : out std_logic_vector(2 downto 0); + W_G : out std_logic_vector(2 downto 0); + W_B : out std_logic_vector(2 downto 0); + HBLANK : out std_logic; + VBLANK : out std_logic; + W_H_SYNC : out std_logic; + W_V_SYNC : out std_logic; + W_SDAT_A : out std_logic_vector( 7 downto 0); + W_SDAT_B : out std_logic_vector( 7 downto 0); + O_CMPBL : out std_logic + ); +end; + +architecture RTL of galaxian is + -- CPU ADDRESS BUS + signal W_A : std_logic_vector(15 downto 0) := (others => '0'); + -- CPU IF + signal W_CPU_CLK : std_logic := '0'; + signal W_CPU_MREQn : std_logic := '0'; + signal W_CPU_NMIn : std_logic := '0'; + signal W_CPU_RDn : std_logic := '0'; + signal W_CPU_RFSHn : std_logic := '0'; + signal W_CPU_WAITn : std_logic := '0'; + signal W_CPU_WRn : std_logic := '0'; + signal W_CPU_WR : std_logic := '0'; + signal W_RESETn : std_logic := '0'; + -------- H and V COUNTER ------------------------- + signal W_C_BLn : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_C_BLXn : std_logic := '0'; + signal W_H_BL : std_logic := '0'; + signal W_H_SYNC_int : std_logic := '0'; + signal W_V_BLn : std_logic := '0'; + signal W_V_BL2n : std_logic := '0'; + signal W_V_SYNC_int : std_logic := '0'; + signal W_H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal W_V_CNT : std_logic_vector(7 downto 0) := (others => '0'); + -------- CPU RAM ---------------------------- + signal W_CPU_RAM_DO : std_logic_vector(7 downto 0) := (others => '0'); + -------- ADDRESS DECDER ---------------------- + signal W_BD_G : std_logic := '0'; + signal W_CPU_RAM_CS : std_logic := '0'; + signal W_CPU_RAM_RD : std_logic := '0'; +-- signal W_CPU_RAM_WR : std_logic := '0'; + signal W_CPU_ROM_CS : std_logic := '0'; + signal W_DIP_OE : std_logic := '0'; + signal W_H_FLIP : std_logic := '0'; + signal W_DRIVER_WE : std_logic := '0'; + signal W_OBJ_RAM_RD : std_logic := '0'; + signal W_OBJ_RAM_RQ : std_logic := '0'; + signal W_OBJ_RAM_WR : std_logic := '0'; + signal W_PITCH : std_logic := '0'; + signal W_SOUND_WE : std_logic := '0'; + signal W_STARS_ON : std_logic := '0'; + signal W_STARS_OFFn : std_logic := '0'; + signal W_SW0_OE : std_logic := '0'; + signal W_SW1_OE : std_logic := '0'; + signal W_V_FLIP : std_logic := '0'; + signal W_VID_RAM_RD : std_logic := '0'; + signal W_VID_RAM_WR : std_logic := '0'; + signal W_WDR_OE : std_logic := '0'; + --------- INPORT ----------------------------- + signal W_SW_DO : std_logic_vector( 7 downto 0) := (others => '0'); + --------- VIDEO ----------------------------- + signal W_VID_DO : std_logic_vector( 7 downto 0) := (others => '0'); + ----- DATA I/F ------------------------------------- + signal W_CPU_ROM_DO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_ROM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_RAM_CLK : std_logic := '0'; + signal W_VOL1 : std_logic := '0'; + signal W_VOL2 : std_logic := '0'; + signal W_FIRE : std_logic := '0'; + signal W_HIT : std_logic := '0'; + signal W_FS : std_logic_vector( 2 downto 0) := (others => '0'); + + signal blx_comb : std_logic := '0'; + signal W_1VF : std_logic := '0'; + signal W_256HnX : std_logic := '0'; + signal W_8HF : std_logic := '0'; + signal W_DAC_A : std_logic := '0'; + signal W_DAC_B : std_logic := '0'; + signal W_MISSILEn : std_logic := '0'; + signal W_SHELLn : std_logic := '0'; + signal W_MS_D : std_logic := '0'; + signal W_MS_R : std_logic := '0'; + signal W_MS_G : std_logic := '0'; + signal W_MS_B : std_logic := '0'; + + signal new_sw : std_logic_vector( 2 downto 0) := (others => '0'); + signal in_game : std_logic_vector( 1 downto 0) := (others => '0'); + signal ROM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal rst_count : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_STARS_B : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_G : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_R : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VIDEO_B : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_G : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_R : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_WAV_A0 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A1 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A2 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D2 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_DAC : std_logic_vector( 3 downto 0) := (others => '0'); + +begin + mc_vid : entity work.MC_VIDEO + port map( + I_CLK_18M => W_CLK_18M, + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT => W_H_CNT, + I_V_CNT => W_V_CNT, + I_H_FLIP => W_H_FLIP, + I_V_FLIP => W_V_FLIP, + I_V_BLn => W_V_BLn, + I_C_BLn => W_C_BLn, + I_A => W_A(9 downto 0), + I_OBJ_SUB_A => "000", + I_BD => W_BDI, + I_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + I_OBJ_RAM_RD => W_OBJ_RAM_RD, + I_OBJ_RAM_WR => W_OBJ_RAM_WR, + I_VID_RAM_RD => W_VID_RAM_RD, + I_VID_RAM_WR => W_VID_RAM_WR, + I_DRIVER_WR => W_DRIVER_WE, + O_C_BLnX => W_C_BLnX, + O_8HF => W_8HF, + O_256HnX => W_256HnX, + O_1VF => W_1VF, + O_MISSILEn => W_MISSILEn, + O_SHELLn => W_SHELLn, + O_BD => W_VID_DO, + O_VID => W_VID, + O_COL => W_COL + ); + + cpu : entity work.T80as + port map ( + RESET_n => W_RESETn, + CLK_n => W_CPU_CLK, + WAIT_n => W_CPU_WAITn, + INT_n => '1', + NMI_n => W_CPU_NMIn, + BUSRQ_n => '1', + MREQ_n => W_CPU_MREQn, + RD_n => W_CPU_RDn, + WR_n => W_CPU_WRn, + RFSH_n => W_CPU_RFSHn, + A => W_A, + DI => W_BDO, + DO => W_BDI, + M1_n => open, + IORQ_n => open, + HALT_n => open, + BUSAK_n => open, + DOE => open + ); + + mc_cpu_ram : entity work.MC_CPU_RAM + port map ( + I_CLK => W_CPU_RAM_CLK, + I_ADDR => W_A(9 downto 0), + I_D => W_BDI, + I_WE => W_CPU_WR, + I_OE => W_CPU_RAM_RD, + O_D => W_CPU_RAM_DO + ); + + mc_adec : entity work.MC_ADEC + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_CPU_CLK => W_CPU_CLK, + I_RSTn => W_RESETn, + + I_CPU_A => W_A, + I_CPU_D => W_BDI(0), + I_MREQn => W_CPU_MREQn, + I_RFSHn => W_CPU_RFSHn, + I_RDn => W_CPU_RDn, + I_WRn => W_CPU_WRn, + I_H_BL => W_H_BL, + I_V_BLn => W_V_BLn, + + O_WAITn => W_CPU_WAITn, + O_NMIn => W_CPU_NMIn, + O_CPU_ROM_CS => W_CPU_ROM_CS, + O_CPU_RAM_RD => W_CPU_RAM_RD, +-- O_CPU_RAM_WR => W_CPU_RAM_WR, + O_CPU_RAM_CS => W_CPU_RAM_CS, + O_OBJ_RAM_RD => W_OBJ_RAM_RD, + O_OBJ_RAM_WR => W_OBJ_RAM_WR, + O_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + O_VID_RAM_RD => W_VID_RAM_RD, + O_VID_RAM_WR => W_VID_RAM_WR, + O_SW0_OE => W_SW0_OE, + O_SW1_OE => W_SW1_OE, + O_DIP_OE => W_DIP_OE, + O_WDR_OE => W_WDR_OE, + O_DRIVER_WE => W_DRIVER_WE, + O_SOUND_WE => W_SOUND_WE, + O_PITCH => W_PITCH, + O_H_FLIP => W_H_FLIP, + O_V_FLIP => W_V_FLIP, + O_BD_G => W_BD_G, + O_STARS_ON => W_STARS_ON + ); + +-- active high buttons + mc_inport : entity work.MC_INPORT + port map ( + I_COIN1 => P1_CSJUDLR(6), + I_COIN2 => P2_CSJUDLR(6), + I_1P_START => P1_CSJUDLR(5), + I_2P_START => P2_CSJUDLR(5), + I_1P_SH => P1_CSJUDLR(4), + I_2P_SH => P2_CSJUDLR(4), + I_1P_LE => P1_CSJUDLR(1), + I_2P_LE => P2_CSJUDLR(3), + I_1P_RI => P1_CSJUDLR(0), + I_2P_RI => P2_CSJUDLR(2), + I_SW0_OE => W_SW0_OE, + I_SW1_OE => W_SW1_OE, + I_DIP_OE => W_DIP_OE, + O_D => W_SW_DO + ); + + mc_hv : entity work.MC_HV_COUNT + port map( + I_CLK => W_CLK_6M, + I_RSTn => W_RESETn, + O_H_CNT => W_H_CNT, + O_H_SYNC => W_H_SYNC_int, + O_H_BL => W_H_BL, + O_V_CNT => W_V_CNT, + O_V_SYNC => W_V_SYNC_int, + O_V_BL2n => W_V_BL2n, + O_V_BLn => W_V_BLn, + O_C_BLn => W_C_BLn + ); + + mc_col_pal : entity work.MC_COL_PAL + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_VID => W_VID, + I_COL => W_COL, + I_C_BLnX => W_C_BLnX, + O_C_BLXn => W_C_BLXn, + O_STARS_OFFn => W_STARS_OFFn, + O_R => W_VIDEO_R, + O_G => W_VIDEO_G, + O_B => W_VIDEO_B + ); + + mc_stars : entity work.MC_STARS + port map ( + I_CLK_18M => W_CLK_18M, + I_CLK_6M => W_CLK_6M, + I_H_FLIP => W_H_FLIP, + I_V_SYNC => W_V_SYNC_int, + I_8HF => W_8HF, + I_256HnX => W_256HnX, + I_1VF => W_1VF, + I_2V => W_V_CNT(1), + I_STARS_ON => W_STARS_ON, + I_STARS_OFFn => W_STARS_OFFn, + O_R => W_STARS_R, + O_G => W_STARS_G, + O_B => W_STARS_B, + O_NOISE => open + ); + + mc_sound_a : entity work.MC_SOUND_A + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT1 => W_H_CNT(1), + I_BD => W_BDI, + I_PITCH => W_PITCH, + I_VOL1 => W_VOL1, + I_VOL2 => W_VOL2, + O_SDAT => W_SDAT_A, + O_DO => open + ); + + vmc_sound_b : entity work.MC_SOUND_B + port map( + I_CLK1 => W_CLK_6M, + I_RSTn => rst_count(3), + I_SW => new_sw, + I_DAC => W_DAC, + I_FS => W_FS, + O_SDAT => W_SDAT_B + ); + +--------- ROM ------------------------------------------------------- + mc_roms : entity work.ROM_PGM_0 + port map ( + CLK => W_CLK_12M, + ADDR => W_A(13 downto 0), + DATA => W_CPU_ROM_DO + ); + +-------- VIDEO ----------------------------- + blx_comb <= not ( W_C_BLXn and W_V_BL2n ); + W_V_SYNC <= not W_V_SYNC_int; + W_H_SYNC <= not W_H_SYNC_int; + O_CMPBL <= W_C_BLnX; + + -- MISSILE => Yellow ; + -- SHELL => White ; + W_MS_D <= not (W_MISSILEn and W_SHELLn); + W_MS_R <= not blx_comb and W_MS_D; + W_MS_G <= not blx_comb and W_MS_D; + W_MS_B <= not blx_comb and W_MS_D and not W_SHELLn ; + + W_R <= W_VIDEO_R or (W_STARS_R & "0") or (W_MS_R & W_MS_R & "0"); + W_G <= W_VIDEO_G or (W_STARS_G & "0") or (W_MS_G & W_MS_G & "0"); + W_B <= W_VIDEO_B or (W_STARS_B & "0") or (W_MS_B & W_MS_B & "0"); + + process(W_CLK_6M) + begin + if rising_edge(W_CLK_6M) then + HBLANK <= not W_C_BLXn; + VBLANK <= not W_V_BL2n; + end if; + end process; + + +----- CPU I/F ------------------------------------- + + W_CPU_CLK <= W_H_CNT(0); + W_CPU_RAM_CLK <= W_CLK_12M and W_CPU_RAM_CS; + + W_CPU_ROM_DOB <= W_CPU_ROM_DO when W_CPU_ROM_CS = '1' else (others=>'0'); + + W_RESETn <= not I_RESET; + W_BDO <= W_SW_DO or W_VID_DO or W_CPU_RAM_DO or W_CPU_ROM_DOB ; + W_CPU_WR <= not W_CPU_WRn; + + new_sw <= (W_FS(2) or W_FS(1) or W_FS(0)) & W_HIT & W_FIRE; + + process(W_CPU_CLK, I_RESET) + begin + if (I_RESET = '1') then + rst_count <= (others => '0'); + elsif rising_edge( W_CPU_CLK) then + if ( rst_count /= x"f") then + rst_count <= rst_count + 1; + end if; + end if; + end process; + +----- Parts 9L --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_FS <= (others=>'0'); + W_HIT <= '0'; + W_FIRE <= '0'; + W_VOL1 <= '0'; + W_VOL2 <= '0'; + elsif rising_edge(W_CLK_12M) then + if (W_SOUND_WE = '1') then + case(W_A(2 downto 0)) is + when "000" => W_FS(0) <= W_BDI(0); + when "001" => W_FS(1) <= W_BDI(0); + when "010" => W_FS(2) <= W_BDI(0); + when "011" => W_HIT <= W_BDI(0); +-- when "100" => UNUSED <= W_BDI(0); + when "101" => W_FIRE <= W_BDI(0); + when "110" => W_VOL1 <= W_BDI(0); + when "111" => W_VOL2 <= W_BDI(0); + when others => null; + end case; + end if; + end if; + end process; + +----- Parts 9M --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_DAC <= (others=>'0'); + elsif rising_edge(W_CLK_12M) then + if (W_DRIVER_WE = '1') then + case(W_A(2 downto 0)) is + -- next 4 outputs go off board via ULN2075 buffer +-- when "000" => 1P START <= W_BDI(0); +-- when "001" => 2P START <= W_BDI(0); +-- when "010" => COIN LOCK <= W_BDI(0); +-- when "011" => COIN CTR <= W_BDI(0); + when "100" => W_DAC(0) <= W_BDI(0); -- 1M + when "101" => W_DAC(1) <= W_BDI(0); -- 470K + when "110" => W_DAC(2) <= W_BDI(0); -- 220K + when "111" => W_DAC(3) <= W_BDI(0); -- 100K + when others => null; + end case; + end if; + end if; + end process; + +------------------------------------------------------------------------------- +end RTL; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/hq2x.sv b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_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/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/keyboard.v b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_adec.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_adec.vhd new file mode 100644 index 00000000..7245ce8c --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_adec.vhd @@ -0,0 +1,251 @@ +--------------------------------------------------------------------- +-- FPGA GALAXIAN ADDRESS DECDER +-- +-- Version : 2.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +--------------------------------------------------------------------- +-- +--GALAXIAN Address Map +-- +-- Address Item(R..read-mode W..wight-mode) Parts +--0000 - 1FFF CPU-ROM..R ( 7H or 7K ) +--2000 - 3FFF CPU-ROM..R ( 7L ) +--4000 - 47FF CPU-RAM..RW ( 7N & 7P ) +--5000 - 57FF VID-RAM..RW +--5800 - 5FFF OBJ-RAM..RW +--6000 - SW0..R LAMP......W +--6800 - SW1..R SOUND.....W +--7000 - DIP..R +--7001 NMI_ON....W +--7004 STARS_ON..W +--7006 H_FLIP....W +--7007 V-FLIP....W +--7800 WDR..R PITCH.....W +-- +--W MODE +--6000 1P START +--6001 2P START +--6002 COIN LOCKOUT +--6003 COIN COUNTER +--6004 - 6007 SOUND CONTROL(OSC) +-- +--6800 SOUND CONTROL(FS1) +--6801 SOUND CONTROL(FS2) +--6802 SOUND CONTROL(FS3) +--6803 SOUND CONTROL(HIT) +--6805 SOUND CONTROL(SHOT) +--6806 SOUND CONTROL(VOL1) +--6807 SOUND CONTROL(VOL2) +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_ADEC is + port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_CPU_CLK : in std_logic; + I_RSTn : in std_logic; + + I_CPU_A : in std_logic_vector(15 downto 0); + I_CPU_D : in std_logic; + I_MREQn : in std_logic; + I_RFSHn : in std_logic; + I_RDn : in std_logic; + I_WRn : in std_logic; + I_H_BL : in std_logic; + I_V_BLn : in std_logic; + + O_WAITn : out std_logic; + O_NMIn : out std_logic; + O_CPU_ROM_CS : out std_logic; + O_CPU_RAM_RD : out std_logic; + O_CPU_RAM_WR : out std_logic; + O_CPU_RAM_CS : out std_logic; + O_OBJ_RAM_RD : out std_logic; + O_OBJ_RAM_WR : out std_logic; + O_OBJ_RAM_RQ : out std_logic; + O_VID_RAM_RD : out std_logic; + O_VID_RAM_WR : out std_logic; + O_SW0_OE : out std_logic; + O_SW1_OE : out std_logic; + O_DIP_OE : out std_logic; + O_WDR_OE : out std_logic; + O_DRIVER_WE : out std_logic; + O_SOUND_WE : out std_logic; + O_PITCH : out std_logic; + O_H_FLIP : out std_logic; + O_V_FLIP : out std_logic; + O_BD_G : out std_logic; + O_STARS_ON : out std_logic + ); +end; + +architecture RTL of MC_ADEC is + signal W_8E1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8E2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8P_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8M_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_9N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_NMI_ONn : std_logic := '0'; + -------- CPU WAITn ---------------------------------------------- +-- signal W_6S1_Q : std_logic := '0'; + signal W_6S1_Qn : std_logic := '0'; +-- signal W_6S2_Qn : std_logic := '0'; + + signal W_V_BL : std_logic := '0'; + +begin + W_NMI_ONn <= W_9N_Q(1); -- galaxian + +-- O_WAITn <= '1' ; -- No Wait + O_WAITn <= W_6S1_Qn; + + process(I_CPU_CLK, I_V_BLn) + begin + if (I_V_BLn = '0') then +-- W_6S1_Q <= '0'; + W_6S1_Qn <= '1'; + elsif rising_edge(I_CPU_CLK) then +-- W_6S1_Q <= not (I_H_BL or W_8P_Q(2)); + W_6S1_Qn <= I_H_BL or W_8P_Q(2); + end if; + end process; + +-- process(I_CPU_CLK) +-- begin +-- if falling_edge(I_CPU_CLK) then +-- W_6S2_Qn <= not W_6S1_Q; +-- end if; +-- end process; + +-------- CPU NMIn ----------------------------------------------- + W_V_BL <= not I_V_BLn; + process(W_V_BL, W_NMI_ONn) + begin + if (W_NMI_ONn = '0') then + O_NMIn <= '1'; + elsif rising_edge(W_V_BL) then + O_NMIn <= '0'; + end if; + end process; + + ------------------------------------------------------------------- + u_8e1 : entity work.LOGIC_74XX139 + port map ( + I_G => I_MREQn, + I_Sel(1) => I_CPU_A(15), + I_Sel(0) => I_CPU_A(14), + O_Q => W_8E1_Q + ); + + ---------- CPU_ROM CS 0000 - 3FFF --------------------------- + u_8e2 : entity work.LOGIC_74XX139 + port map ( + I_G => I_RDn, + I_Sel(1) => W_8E1_Q(0), + I_Sel(0) => I_CPU_A(13), + O_Q => W_8E2_Q + ); + + O_CPU_ROM_CS <= not (W_8E2_Q(0) and W_8E2_Q(1) ) ; -- 0000 - 3FFF + ------------------------------------------------------------------- + -- ADDRESS + -- W_8E1_Q[0] = 0000 - 3FFF ---- CPU_ROM_USE + -- W_8E1_Q[1] = 4000 - 7FFF ---- GALAXIAN USE *1 + -- W_8E1_Q[2] = 8000 - BFFF ---- MOONCREST USE + -- W_8E1_Q[3] = C000 - FFFF + + u_8p : entity work.LOGIC_74XX138 + port map ( + I_G1 => I_RFSHn, + I_G2a => W_8E1_Q(1), -- <= *1 + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8P_Q + ); + + u_8n : entity work.LOGIC_74XX138 + port map ( + I_G1 => '1', + I_G2a => I_RDn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8N_Q + ); + + u_8m : entity work.LOGIC_74XX138 + port map ( + -- I_G1 => W_6S2_Qn, + I_G1 => '1', -- No Wait + I_G2a => I_WRn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8M_Q + ); + + O_BD_G <= not (W_8E1_Q(0) and W_8P_Q(0)); + O_OBJ_RAM_RQ <= not W_8P_Q(3); + + O_CPU_RAM_CS <= not (W_8N_Q(0) and W_8M_Q(0)); + + O_WDR_OE <= not W_8N_Q(7); + O_DIP_OE <= not W_8N_Q(6); + O_SW1_OE <= not W_8N_Q(5); + O_SW0_OE <= not W_8N_Q(4); + O_OBJ_RAM_RD <= not W_8N_Q(3); + O_VID_RAM_RD <= not W_8N_Q(2); +-- UNUSED <= not W_8N_Q(1); + O_CPU_RAM_RD <= not W_8N_Q(0); + + O_PITCH <= not W_8M_Q(7); +-- STARS_ON_ENA <= not W_8M_Q(6); + O_SOUND_WE <= not W_8M_Q(5); + O_DRIVER_WE <= not W_8M_Q(4); + O_OBJ_RAM_WR <= not W_8M_Q(3); + O_VID_RAM_WR <= not W_8M_Q(2); +-- UNUSED <= not W_8M_Q(1); + O_CPU_RAM_WR <= not W_8M_Q(0); + + ----- Parts 9N --------- + + process(I_CLK_12M, I_RSTn) + begin + if (I_RSTn = '0') then + W_9N_Q <= (others => '0'); + elsif rising_edge(I_CLK_12M) then + if (W_8M_Q(6) = '0') then + case I_CPU_A(2 downto 0) is + when "000" => W_9N_Q(0) <= I_CPU_D; + when "001" => W_9N_Q(1) <= I_CPU_D; + when "010" => W_9N_Q(2) <= I_CPU_D; + when "011" => W_9N_Q(3) <= I_CPU_D; + when "100" => W_9N_Q(4) <= I_CPU_D; + when "101" => W_9N_Q(5) <= I_CPU_D; + when "110" => W_9N_Q(6) <= I_CPU_D; + when "111" => W_9N_Q(7) <= I_CPU_D; + when others => null; + end case; + end if; + end if; + end process; + + O_STARS_ON <= W_9N_Q(4); + O_H_FLIP <= W_9N_Q(6); + O_V_FLIP <= W_9N_Q(7); + +end RTL; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_bram.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_bram.vhd new file mode 100644 index 00000000..a6df1ce1 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_bram.vhd @@ -0,0 +1,182 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA & GALAXIAN +-- FPGA BLOCK RAM I/F (XILINX SPARTAN) +-- +-- Version : 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- mc_col_rom(6L) added by k.Degawa +-- +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. K.Degawa +-- 2004- 9-18 added Xilinx Device K.Degawa +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_top.v use +entity MC_CPU_RAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(9 downto 0); + I_D : in std_logic_vector(7 downto 0); + I_WE : in std_logic; + I_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) + ); +end; +architecture RTL of MC_CPU_RAM is + + signal W_D : std_logic_vector(7 downto 0) := (others => '0'); +begin + O_D <= W_D when I_OE ='1' else (others=>'0'); + + ram_inst : work.spram generic map(10,8) + port map + ( + address => I_ADDR, + clock => I_CLK, + data => I_D, + wren => I_WE, + q => W_D + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_OBJ_RAM is + port( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(7 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(7 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); + end; + +architecture RTL of MC_OBJ_RAM is +begin + + ram_inst : work.dpram generic map(8,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_VID_RAM is + port ( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(9 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(9 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of MC_VID_RAM is +begin + ram_inst : work.dpram generic map(10,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_LRAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(7 downto 0); + I_D : in std_logic_vector(4 downto 0); + I_WE : in std_logic; + O_Dn : out std_logic_vector(4 downto 0) + ); +end; + +architecture RTL of MC_LRAM is + signal W_D : std_logic_vector(4 downto 0) := (others => '0'); +begin + + O_Dn <= not W_D; + + ram_inst : work.dpram generic map(8,5) + port map + ( + clock_a => I_CLK, + address_a => I_ADDR, + data_a => I_D, + wren_a => not I_WE, + + clock_b => not I_CLK, + address_b => I_ADDR, + data_b => (others => '0'), + q_b => W_D, + enable_b => '1', + wren_b => '0' + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_clocks.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_clocks.vhd new file mode 100644 index 00000000..5a4d0094 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_clocks.vhd @@ -0,0 +1,85 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA CLOCK GEN +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +----------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity CLOCKGEN is +port ( + CLKIN_IN : in std_logic; + RST_IN : in std_logic; + -- + O_CLK_24M : out std_logic; + O_CLK_18M : out std_logic; + O_CLK_12M : out std_logic; + O_CLK_06M : out std_logic +); +end; + +architecture RTL of CLOCKGEN is + signal state : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr1 : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr2 : std_logic_vector(2 downto 0) := (others => '0'); + signal CLKFB_IN : std_logic := '0'; + signal CLK0_BUF : std_logic := '0'; + signal CLKFX_BUF : std_logic := '0'; + signal CLK_72M : std_logic := '0'; + signal I_DCM_LOCKED : std_logic := '0'; + +begin + dcm_inst : DCM_SP + generic map ( + CLKFX_MULTIPLY => 9, + CLKFX_DIVIDE => 4, + CLKIN_PERIOD => 31.25 + ) + port map ( + CLKIN => CLKIN_IN, + CLKFB => CLKFB_IN, + RST => RST_IN, + CLK0 => CLK0_BUF, + CLKFX => CLKFX_BUF, + LOCKED => I_DCM_LOCKED + ); + + BUFG0 : BUFG port map (I=> CLK0_BUF, O => CLKFB_IN); + BUFG1 : BUFG port map (I=> CLKFX_BUF, O => CLK_72M); + O_CLK_06M <= ctr2(2); + O_CLK_12M <= ctr2(1); + O_CLK_24M <= ctr2(0); + O_CLK_18M <= ctr1(1); + + -- generate all clocks, 36Mhz, 18Mhz, 24Mhz, 12Mhz and 6Mhz + process(CLK_72M) + begin + if rising_edge(CLK_72M) then + if (I_DCM_LOCKED = '0') then + state <= "00"; + ctr1 <= (others=>'0'); + ctr2 <= (others=>'0'); + else + ctr1 <= ctr1 + 1; + case state is + when "00" => state <= "01"; ctr2 <= ctr2 + 1; + when "01" => state <= "10"; ctr2 <= ctr2 + 1; + when "10" => state <= "00"; + when "11" => state <= "00"; + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_col_pal.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_col_pal.vhd new file mode 100644 index 00000000..c4dc06ad --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_col_pal.vhd @@ -0,0 +1,78 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA COLOR-PALETTE +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-18 added Xilinx Device. K.Degawa +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; +-- use ieee.numeric_std.all; + +--library UNISIM; +-- use UNISIM.Vcomponents.all; + +entity MC_COL_PAL is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_VID : in std_logic_vector(1 downto 0); + I_COL : in std_logic_vector(2 downto 0); + I_C_BLnX : in std_logic; + + O_C_BLXn : out std_logic; + O_STARS_OFFn : out std_logic; + O_R : out std_logic_vector(2 downto 0); + O_G : out std_logic_vector(2 downto 0); + O_B : out std_logic_vector(2 downto 0) +); +end; + +architecture RTL of MC_COL_PAL is + --- Parts 6M -------------------------------------------------------- + signal W_COL_ROM_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6M_DI : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_DO : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_CLR : std_logic := '0'; + +begin + W_6M_DI <= I_COL(2 downto 0) & I_VID(1 downto 0) & not (I_VID(0) or I_VID(1)) & I_C_BLnX; + W_6M_CLR <= W_6M_DI(0) or W_6M_DO(0); + O_C_BLXn <= W_6M_DI(0) or W_6M_DO(0); + O_STARS_OFFn <= W_6M_DO(1); + +--always@(posedge I_CLK_6M or negedge W_6M_CLR) + process(I_CLK_6M, W_6M_CLR) + begin + if (W_6M_CLR = '0') then + W_6M_DO <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + W_6M_DO <= W_6M_DI; + end if; + end process; + + --- COL ROM -------------------------------------------------------- +--wire W_COL_ROM_OEn = W_6M_DO[1]; + + galaxian_6l : entity work.GALAXIAN_6L + port map ( + CLK => I_CLK_12M, + ADDR => W_6M_DO(6 downto 2), + DATA => W_COL_ROM_DO + ); + + --- VID OUT -------------------------------------------------------- + O_R <= W_COL_ROM_DO(2 downto 0); + O_G <= W_COL_ROM_DO(5 downto 3); + O_B <= W_COL_ROM_DO(7 downto 6) & "0"; + +end; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_hv_count.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_hv_count.vhd new file mode 100644 index 00000000..f310321b --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_hv_count.vhd @@ -0,0 +1,145 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA H & V COUNTER +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 +----------------------------------------------------------------------- +-- MoonCrest hv_count +-- H_CNT 0 - 255 , 384 - 511 Total 384 count +-- V_CNT 0 - 255 , 504 - 511 Total 264 count +------------------------------------------------------------------------------------------- +-- H_CNT[0], H_CNT[1], H_CNT[2], H_CNT[3], H_CNT[4], H_CNT[5], H_CNT[6], H_CNT[7], H_CNT[8], +-- 1 H 2 H 4 H 8 H 16 H 32 H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT[0], V_CNT[1], V_CNT[2], V_CNT[3], V_CNT[4], V_CNT[5], V_CNT[6], V_CNT[7] +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_HV_COUNT is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + O_H_CNT : out std_logic_vector(8 downto 0); + O_H_SYNC : out std_logic; + O_H_BL : out std_logic; + O_V_BL2n : out std_logic; + O_V_CNT : out std_logic_vector(7 downto 0); + O_V_SYNC : out std_logic; + O_V_BLn : out std_logic; + O_C_BLn : out std_logic + ); +end; + +architecture RTL of MC_HV_COUNT is + signal H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal V_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal H_SYNC : std_logic := '0'; + signal H_CLK : std_logic := '0'; + signal H_BL : std_logic := '0'; + signal V_BLn : std_logic := '0'; + signal V_BL2n : std_logic := '0'; + +begin +--------- H_COUNT ---------------------------------------- + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if (H_CNT = 255) then + H_CNT <= std_logic_vector(to_unsigned(384, H_CNT'length)); + else + H_CNT <= H_CNT + 1 ; + end if; + end if; + end process; + + O_H_CNT <= H_CNT; + +--------- H_SYNC ---------------------------------------- + H_CLK <= H_CNT(4); + process(H_CLK, H_CNT(8)) + begin + if (H_CNT(8) = '0') then + H_SYNC <= '0'; + elsif rising_edge(H_CLK) then + H_SYNC <= (not H_CNT(6) ) and H_CNT(5); + end if; + end process; + + O_H_SYNC <= H_SYNC; + +--------- H_BL ------------------------------------------ + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if H_CNT = 387 then + H_BL <= '1'; + elsif H_CNT = 503 then + H_BL <= '0'; + end if; + end if; + end process; + + O_H_BL <= H_BL; + +--------- V_COUNT ---------------------------------------- + process(H_SYNC, I_RSTn) + begin + if (I_RSTn = '0') then + V_CNT <= (others => '0'); + elsif rising_edge(H_SYNC) then + if (V_CNT = 255) then + V_CNT <= std_logic_vector(to_unsigned(504, V_CNT'length)); + else + V_CNT <= V_CNT + 1 ; + end if; + end if; + end process; + + O_V_CNT <= V_CNT(7 downto 0); + O_V_SYNC <= V_CNT(8); + +--------- V_BLn ------------------------------------------ + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BLn <= '0'; + elsif V_CNT(7 downto 0) = 15 then + V_BLn <= '1'; + end if; + end if; + end process; + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BL2n <= '0'; + elsif V_CNT(7 downto 0) = 16 then + V_BL2n <= '1'; + end if; + end if; + end process; + + O_V_BLn <= V_BLn; + O_V_BL2n <= V_BL2n; +------- C_BLn ------------------------------------------ + O_C_BLn <= V_BLn and (not H_CNT(8)); + +end; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_inport.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_inport.vhd new file mode 100644 index 00000000..677a03d1 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_inport.vhd @@ -0,0 +1,74 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA INPORT +-- +-- Version : 1.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004-4-30 galaxian modify by K.DEGAWA +----------------------------------------------------------------------- + +-- DIP SW 0 1 2 3 4 5 +----------------------------------------------------------------- +-- COIN CHUTE +-- 1 COIN/1 PLAY 1'b0 1'b0 +-- 2 COIN/1 PLAY 1'b1 1'b0 +-- 1 COIN/2 PLAY 1'b0 1'b1 +-- FREE PLAY 1'b1 1'b1 +-- BOUNS +-- 1'b0 1'b0 +-- 1'b1 1'b0 +-- 1'b0 1'b1 +-- 1'b1 1'b1 +-- LIVES +-- 2 1'b0 +-- 3 1'b1 +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_INPORT is +port ( + I_COIN1 : in std_logic; -- active high + I_COIN2 : in std_logic; -- active high + I_1P_LE : in std_logic; -- active high + I_1P_RI : in std_logic; -- active high + I_1P_SH : in std_logic; -- active high + I_2P_LE : in std_logic; + I_2P_RI : in std_logic; + I_2P_SH : in std_logic; + I_1P_START : in std_logic; -- active high + I_2P_START : in std_logic; -- active high + I_SW0_OE : in std_logic; + I_SW1_OE : in std_logic; + I_DIP_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) +); + +end; + +architecture RTL of MC_INPORT is + + constant W_TABLE : std_logic := '0'; -- UP = 0; + constant W_TEST : std_logic := '0'; + constant W_SERVICE : std_logic := '0'; + + signal W_SW0_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SW1_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_DIP_DO : std_logic_vector(7 downto 0) := (others => '0'); + +begin + + W_SW0_DO <= x"00" when I_SW0_OE = '0' else '0' & I_2P_SH & I_1P_SH & I_COIN1 & I_1P_LE & I_1P_RI & I_2P_LE & I_2P_RI; + W_SW1_DO <= x"00" when I_SW1_OE = '0' else "10" & I_1P_LE & I_1P_RI & I_2P_LE & I_2P_RI & I_2P_START & I_1P_START; + W_DIP_DO <= x"00" when I_DIP_OE = '0' else "00000100"; + O_D <= W_SW0_DO or W_SW1_DO or W_DIP_DO ; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_ld_pls.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_ld_pls.vhd new file mode 100644 index 00000000..0945fe35 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_ld_pls.vhd @@ -0,0 +1,115 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA VIDEO-LD_PLS_GEN +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_LD_PLS is + port ( + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_3D_DI : in std_logic; + + O_LDn : out std_logic; + O_CNTRLDn : out std_logic; + O_CNTRCLRn : out std_logic; + O_COLLn : out std_logic; + O_VPLn : out std_logic; + O_OBJDATALn : out std_logic; + O_MLDn : out std_logic; + O_SLDn : out std_logic + ); +end; + +architecture RTL of MC_LD_PLS is + signal W_4C1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C1_Q3 : std_logic := '0'; + signal W_4C2_B : std_logic := '0'; + signal W_4D1_G : std_logic := '0'; + signal W_4D1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4D2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_5C_Q : std_logic := '0'; + signal W_HCNT : std_logic := '0'; +begin + O_LDn <= W_4D1_G; + O_CNTRLDn <= W_4D1_Q(2); + O_CNTRCLRn <= W_4D1_Q(0); + O_COLLn <= W_4D2_Q(2); + O_VPLn <= W_4D2_Q(0); + O_OBJDATALn <= W_4C1_Q(2); + O_MLDn <= W_4C2_Q(0); + O_SLDn <= W_4C2_Q(1); + W_4D1_G <= not (I_H_CNT(0) and I_H_CNT(1) and I_H_CNT(2)); + W_HCNT <= not (I_H_CNT(6) and I_H_CNT(5) and I_H_CNT(4) and I_H_CNT(3)); + -- Parts 4D + u_4d1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_G, + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q =>W_4D1_Q + ); + + u_4d2 : entity work.LOGIC_74XX139 + port map( + I_G => W_5C_Q, + I_Sel(1) => I_H_CNT(2), + I_Sel(0) => I_H_CNT(1), + O_Q => W_4D2_Q + ); + + -- Parts 4C + u_4c1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D2_Q(1), + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q => W_4C1_Q + ); + + u_4c2 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_Q(3), + I_Sel(1) => W_4C2_B, + I_Sel(0) => W_HCNT, + O_Q => W_4C2_Q + ); + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_5C_Q <= I_H_CNT(0); + end if; + end process; + + -- 2004-9-22 added + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + W_4C1_Q3 <= W_4C1_Q(3); + end if; + end process; + + process(W_4C1_Q3) + begin + if rising_edge(W_4C1_Q3) then + W_4C2_B <= I_3D_DI; + end if; + end process; + +end RTL; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_logic.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_logic.vhd new file mode 100644 index 00000000..5dae8a87 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_logic.vhd @@ -0,0 +1,92 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA LOGIC IP MODULE +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx138 +-- 3-to-8 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX138 is + port ( + I_G1 : in std_logic; + I_G2a : in std_logic; + I_G2b : in std_logic; + I_Sel : in std_logic_vector(2 downto 0); + O_Q : out std_logic_vector(7 downto 0) + ); +end logic_74xx138; + +architecture RTL of LOGIC_74XX138 is + signal I_G : std_logic_vector(2 downto 0) := (others => '0'); + +begin + I_G <= I_G1 & I_G2a & I_G2b; + + xx138 : process(I_G, I_Sel) + begin + if(I_G = "100" ) then + case I_Sel is + when "000" => O_Q <= "11111110"; + when "001" => O_Q <= "11111101"; + when "010" => O_Q <= "11111011"; + when "011" => O_Q <= "11110111"; + when "100" => O_Q <= "11101111"; + when "101" => O_Q <= "11011111"; + when "110" => O_Q <= "10111111"; + when "111" => O_Q <= "01111111"; + when others => null; + end case; + else + O_Q <= (others => '1'); + end if; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx139 +-- 2-to-4 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX139 is + port ( + I_G : in std_logic; + I_Sel : in std_logic_vector(1 downto 0); + O_Q : out std_logic_vector(3 downto 0) + ); +end; + +architecture RTL of LOGIC_74XX139 is +begin + xx139 : process (I_G, I_Sel) + begin + if I_G = '0' then + case I_Sel is + when "00" => O_Q <= "1110"; + when "01" => O_Q <= "1101"; + when "10" => O_Q <= "1011"; + when "11" => O_Q <= "0111"; + when others => null; + end case; + else + O_Q <= "1111"; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_missile.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_missile.vhd new file mode 100644 index 00000000..e924e09e --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_missile.vhd @@ -0,0 +1,107 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA VIDEO-MISSILE +---- +---- Version : 2.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_MISSILE is + port( + I_CLK_6M : in std_logic; + I_CLK_18M : in std_logic; + I_C_BLn_X : in std_logic; + I_MLDn : in std_logic; + I_SLDn : in std_logic; + I_HPOS : in std_logic_vector (7 downto 0); + + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic + ); +end; + +architecture RTL of MC_MISSILE is + signal W_45R_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_45S_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_5P1_Q : std_logic := '0'; + signal W_5P2_Q : std_logic := '0'; + signal W_5P1_CLK : std_logic := '0'; + signal W_5P2_CLK : std_logic := '0'; +begin + + O_MISSILEn <= W_5P1_CLK; + O_SHELLn <= W_5P2_CLK; + + -- missile counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if (I_MLDn = '0') then + W_45R_Q <= I_HPOS; + else + if (I_C_BLn_X = '1') then + W_45R_Q <= W_45R_Q + 1; + if (W_45R_Q(7 downto 0) = "11111010") and W_5P1_Q = '1' then + W_5P1_CLK <= '0'; + else + W_5P1_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- shell counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if(I_SLDn = '0') then + W_45S_Q <= I_HPOS; + else + if(I_C_BLn_X = '1') then + W_45S_Q <= W_45S_Q + 1; + if (W_45S_Q(7 downto 0) = "11111010") and W_5P2_Q = '1' then + W_5P2_CLK <= '0'; + else + W_5P2_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_MLDn) and clock active on rising edge (W_5P1_CLK) + process(W_5P1_CLK, I_MLDn) + begin + if (I_MLDn = '0') then + W_5P1_Q <= '1'; + elsif rising_edge(W_5P1_CLK) then + W_5P1_Q <= '0'; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_SLDn) and clock active on rising edge (W_5P2_CLK) + process(W_5P2_CLK, I_SLDn) + begin + if (I_SLDn = '0') then + W_5P2_Q <= '1'; + elsif rising_edge(W_5P2_CLK) then + W_5P2_Q <= '0'; + end if; + end process; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_sound_a.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_sound_a.vhd new file mode 100644 index 00000000..ee0c66be --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_sound_a.vhd @@ -0,0 +1,117 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA SOUND I/F +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + use IEEE.std_logic_arith.all; + +entity MC_SOUND_A is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT1 : in std_logic; + I_BD : in std_logic_vector(7 downto 0); + I_PITCH : in std_logic; + I_VOL1 : in std_logic; + I_VOL2 : in std_logic; + + O_SDAT : out std_logic_vector(7 downto 0); + O_DO : out std_logic_vector(3 downto 0) +); +end; + +architecture RTL of MC_SOUND_A is + signal W_PITCH : std_logic := '0'; + signal W_89K_LDn : std_logic := '0'; + signal W_89K_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_89K_LDATA : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6T_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_SDAT0 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT2 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT3 : std_logic_vector(7 downto 0) := (others => '0'); + +begin + O_DO <= W_6T_Q; + + process (I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_PITCH <= I_PITCH; + if (W_89K_Q = x"ff") then + W_89K_LDn <= '0' ; + else + W_89K_LDn <= '1' ; + end if; + end if; + end process; + + -- Parts 9J + process (W_PITCH) + begin + if falling_edge(W_PITCH) then + W_89K_LDATA <= I_BD; + end if; + end process; + + process (I_H_CNT1) + begin + if rising_edge(I_H_CNT1) then + if (W_89K_LDn = '0') then + W_89K_Q <= W_89K_LDATA; + else + W_89K_Q <= W_89K_Q + 1; + end if; + end if; + end process; + + process (W_89K_LDn) + begin + if falling_edge(W_89K_LDn) then + W_6T_Q <= W_6T_Q + 1; + end if; + end process; + + process (I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + O_SDAT <= (x"14" + W_SDAT3) + (W_SDAT0 + W_SDAT2); + + if W_6T_Q(0)='1' then + W_SDAT0 <= x"2a"; + else + W_SDAT0 <= (others => '0'); + end if; + + if W_6T_Q(2)='1' then + if I_VOL1 = '1' then + W_SDAT2 <= x"69"; + else + W_SDAT2 <= x"39"; + end if; + else + W_SDAT2 <= (others => '0'); + end if; + + if (W_6T_Q(3)='1') and (I_VOL2 = '1') then + W_SDAT3 <= x"48" ; + else + W_SDAT3 <= (others => '0'); + end if; + + end if; + end process; + +end; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_sound_b.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_sound_b.vhd new file mode 100644 index 00000000..b74e4bb1 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_sound_b.vhd @@ -0,0 +1,253 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA WAVE SOUND +---- +---- Version : 1.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does no guarantee this program. +---- You can use this at your own risk. +---- +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--pragma translate_off +-- use ieee.std_logic_textio.all; +-- use std.textio.all; +--pragma translate_on + +entity MC_SOUND_B is + port( + I_CLK1 : in std_logic; -- 6MHz + I_RSTn : in std_logic; + I_SW : in std_logic_vector( 2 downto 0); + I_DAC : in std_logic_vector( 3 downto 0); + I_FS : in std_logic_vector( 2 downto 0); + O_SDAT : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_B is +constant sample_time : integer := 557; -- sample time : 557 = 11025Hz, 557/2 = 22050Hz +constant fire_cnt : std_logic_vector(15 downto 0) := x"2000"; +constant hit_cnt : std_logic_vector(15 downto 0) := x"2000"; + +signal sample : std_logic_vector(10 downto 0) := (others => '0'); +signal sample_pls : std_logic := '0'; +signal s0_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s0_trg : std_logic := '0'; +signal s1_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s1_trg : std_logic := '0'; +signal fire_addr : std_logic_vector(15 downto 0) := (others => '0'); +signal hit_addr : std_logic_vector(15 downto 0) := (others => '0'); + +signal WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); +signal WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + +signal W_VCO1_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO1_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal VCO_CTR : std_logic_vector(24 downto 0) := (others => '0'); + +signal SDAT : std_logic_vector(10 downto 0) := (others => '0'); + +begin + -- ideally we should divide by 5 because this is the sum of 5 channels + -- but in practice we divide by 4 and just clip sounds that are too loud. + O_SDAT <= SDAT(9 downto 2) when SDAT(10) = '0' else (others=>'1'); -- clip overrange sounds + + process(I_CLK1) + begin + if rising_edge(I_CLK1) then + SDAT <= ("000" & W_VCO3_OUT) + ( ( ("000" & W_VCO2_OUT) + ("000" & W_VCO1_OUT) ) + ( ("000" & WAV_D0) + ("000" & WAV_D1) ) ); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + sample <= (others => '0'); + sample_pls <= '0'; + elsif rising_edge(I_CLK1) then + if (sample = sample_time - 1) then + sample <= (others => '0'); + sample_pls <= '1'; + else + sample <= sample + 1; + sample_pls <= '0'; + end if; + end if; + end process; + +------------- FIRE SOUND ------------------------------------------ + mc_roms_fire : entity work.GAL_FIR + port map ( + CLK => I_CLK1, + ADDR => fire_addr(12 downto 0), + DATA => WAV_D0 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s0_trg_ff <= (others => '0'); + s0_trg <= '0'; + elsif rising_edge(I_CLK1) then + s0_trg_ff(0) <= I_SW(0); + s0_trg_ff(1) <= s0_trg_ff(0); + s0_trg <= not s0_trg_ff(1) and s0_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + fire_addr <= fire_cnt; + elsif rising_edge(I_CLK1) then + if (s0_trg = '1') then + fire_addr <= (others => '0'); + else + if(sample_pls = '1') then + if(fire_addr <= fire_cnt) then + fire_addr <= fire_addr + 1; + else + fire_addr <= fire_addr ; + end if; + end if; + end if; + end if; + end process; + +------------- HIT SOUND ------------------------------------------ + mc_roms_hit : entity work.GAL_HIT + port map ( + CLK => I_CLK1, + ADDR => hit_addr(12 downto 0), + DATA => WAV_D1 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s1_trg_ff <= (others => '0'); + s1_trg <= '0'; + elsif rising_edge(I_CLK1) then + s1_trg_ff(0) <= I_SW(1); + s1_trg_ff(1) <= s1_trg_ff(0); + s1_trg <= not s1_trg_ff(1) and s1_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + hit_addr <= hit_cnt; + elsif rising_edge(I_CLK1) then + if (s1_trg = '1') then + hit_addr <= (others => '0'); + else + if (sample_pls = '1') then + if (hit_addr <= hit_cnt) then + hit_addr <= hit_addr + 1 ; + else + hit_addr <= hit_addr ; + end if; + end if; + end if; + end if; + end process; + +--------------- EFFECT SOUND --------------------------------------- + +-- 9R modulator voltage generator based on DAC value + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + VCO_CTR <= (others=>'0'); + elsif rising_edge(I_CLK1) then + VCO_CTR <= VCO_CTR + (not I_DAC); + end if; + end process; + + -- modulator frequency lookup tables for the three VCOs + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + elsif rising_edge(I_CLK1) then + case VCO_CTR(23 downto 19) is + when "00000" => W_VCO1_STEP <= x"2A"; W_VCO2_STEP <= x"3A"; W_VCO3_STEP <= x"54"; + when "00001" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"39"; W_VCO3_STEP <= x"53"; + when "00010" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"38"; W_VCO3_STEP <= x"52"; + when "00011" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"50"; + when "00100" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"4F"; + when "00101" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"36"; W_VCO3_STEP <= x"4E"; + when "00110" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"35"; W_VCO3_STEP <= x"4D"; + when "00111" => W_VCO1_STEP <= x"26"; W_VCO2_STEP <= x"34"; W_VCO3_STEP <= x"4C"; + when "01000" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"4A"; + when "01001" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"49"; + when "01010" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"32"; W_VCO3_STEP <= x"48"; + when "01011" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"31"; W_VCO3_STEP <= x"47"; + when "01100" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"30"; W_VCO3_STEP <= x"46"; + when "01101" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"44"; + when "01110" => W_VCO1_STEP <= x"22"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"43"; + when "01111" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2E"; W_VCO3_STEP <= x"42"; + when "10000" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2D"; W_VCO3_STEP <= x"41"; + when "10001" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2C"; W_VCO3_STEP <= x"40"; + when "10010" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3F"; + when "10011" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3D"; + when "10100" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2A"; W_VCO3_STEP <= x"3C"; + when "10101" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"29"; W_VCO3_STEP <= x"3B"; + when "10110" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"3A"; + when "10111" => W_VCO1_STEP <= x"1D"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"39"; + when "11000" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"27"; W_VCO3_STEP <= x"37"; + when "11001" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"26"; W_VCO3_STEP <= x"36"; + when "11010" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"25"; W_VCO3_STEP <= x"35"; + when "11011" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"34"; + when "11100" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"33"; + when "11101" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"23"; W_VCO3_STEP <= x"32"; + when "11110" => W_VCO1_STEP <= x"19"; W_VCO2_STEP <= x"22"; W_VCO3_STEP <= x"30"; + when "11111" => W_VCO1_STEP <= x"18"; W_VCO2_STEP <= x"21"; W_VCO3_STEP <= x"2F"; + when others => null; + end case; + end if; + end process; + +-- 8R VCO 240Hz - 140Hz (8) + mc_vco1 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(0), + I_STEP => W_VCO1_STEP, + O_WAV => W_VCO1_OUT + ); + +-- 8S VCO 330Hz - 190Hz (11) + mc_vco2 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(1), + I_STEP => W_VCO2_STEP, + O_WAV => W_VCO2_OUT + ); + +-- 8T VCO 480Hz - 270Hz (16) + mc_vco3 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(2), + I_STEP => W_VCO3_STEP, + O_WAV => W_VCO3_OUT + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_sound_vco.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_sound_vco.vhd new file mode 100644 index 00000000..e2a63e85 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_sound_vco.vhd @@ -0,0 +1,49 @@ +-------------------------------------------------------------------------------- +---- FPGA VCO +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +use work.sine_package.all; + +-- O_CLK = (I_CLK / 2^20) * I_STEP +entity MC_SOUND_VCO is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + I_FS : in std_logic; + I_STEP : in std_logic_vector( 7 downto 0); + O_WAV : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_VCO is + signal VCO1_CTR : std_logic_vector(19 downto 0) := (others => '0'); + signal sine : std_logic_vector(14 downto 0) := (others => '0'); + +begin + O_WAV <= sine(14 downto 7); + process(I_CLK, I_RSTn) + begin + if (I_RSTn = '0') then + VCO1_CTR <= (others=>'0'); + elsif rising_edge(I_CLK) then + if I_FS = '1' then + VCO1_CTR <= VCO1_CTR + I_STEP; + case VCO1_CTR(19 downto 18) is + when "00" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "01" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when "10" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "11" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_stars.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_stars.vhd new file mode 100644 index 00000000..b91197b3 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_stars.vhd @@ -0,0 +1,90 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA STARS +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity MC_STARS is + port ( + I_CLK_18M : in std_logic; + I_CLK_6M : in std_logic; + I_H_FLIP : in std_logic; + I_V_SYNC : in std_logic; + I_8HF : in std_logic; + I_256HnX : in std_logic; + I_1VF : in std_logic; + I_2V : in std_logic; + I_STARS_ON : in std_logic; + I_STARS_OFFn : in std_logic; + + O_R : out std_logic_vector(1 downto 0); + O_G : out std_logic_vector(1 downto 0); + O_B : out std_logic_vector(1 downto 0); + O_NOISE : out std_logic + ); +end; + +architecture RTL of MC_STARS is + signal CLK_1C : std_logic := '0'; + signal W_2D_Qn : std_logic := '0'; + + signal W_3B : std_logic := '0'; + signal noise : std_logic := '0'; + signal W_2A : std_logic := '0'; + signal W_4P : std_logic := '0'; + signal CLK_1AB : std_logic := '0'; + signal W_1AB_Q : std_logic_vector(15 downto 0) := (others => '0'); + signal W_1C_Q : std_logic_vector( 1 downto 0) := (others => '0'); +begin + O_R <= (W_1AB_Q( 9) & W_1AB_Q (8) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_G <= (W_1AB_Q(11) & W_1AB_Q(10) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_B <= (W_1AB_Q(13) & W_1AB_Q(12) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + + CLK_1C <= not (I_CLK_18M and (not I_CLK_6M )and (not I_V_SYNC) and I_256HnX); + CLK_1AB <= not (CLK_1C or (not (I_H_FLIP or W_1C_Q(1)))); + W_3B <= W_2D_Qn xor W_1AB_Q(4); + + W_2A <= '0' when (W_1AB_Q(7 downto 0) = x"ff") else '1'; + W_4P <= not (( I_8HF xor I_1VF ) and W_2D_Qn and I_STARS_OFFn); + + O_NOISE <= noise ; + + process(I_2V) + begin + if rising_edge(I_2V) then + noise <= W_2D_Qn; + end if; + end process; + + process(CLK_1C, I_V_SYNC) + begin + if(I_V_SYNC = '1') then + W_1C_Q <= (others => '0'); + elsif rising_edge(CLK_1C) then + W_1C_Q <= W_1C_Q(0) & '1'; + end if; + end process; + + process(CLK_1AB, I_STARS_ON) + begin + if(I_STARS_ON = '0') then + W_1AB_Q <= (others => '0'); + W_2D_Qn <= '1'; + elsif rising_edge(CLK_1AB) then + W_1AB_Q <= W_1AB_Q(14 downto 0) & W_3B; + W_2D_Qn <= not W_1AB_Q(15); + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_video.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_video.vhd new file mode 100644 index 00000000..dbe0d0d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mc_video.vhd @@ -0,0 +1,433 @@ +-------------------------------------------------------------------------------- +---- FPGA GALAXIAN VIDEO +---- +---- Version : 2.50 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 4-30 galaxian modify by K.DEGAWA +---- 2004- 5- 6 first release. +---- 2004- 8-23 Improvement with T80-IP. +---- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +-------------------------------------------------------------------------------- + +------------------------------------------------------------------------------------------- +-- H_CNT(0), H_CNT(1), H_CNT(2), H_CNT(3), H_CNT(4), H_CNT(5), H_CNT(6), H_CNT(7), H_CNT(8), +-- 1 H 2 H 4 H 8 H 16 H 32H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT(0), V_CNT(1), V_CNT(2), V_CNT(3), V_CNT(4), V_CNT(5), V_CNT(6), V_CNT(7) +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_VIDEO is + port( + I_CLK_18M : in std_logic; + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_V_CNT : in std_logic_vector(7 downto 0); + I_H_FLIP : in std_logic; + I_V_FLIP : in std_logic; + I_V_BLn : in std_logic; + I_C_BLn : in std_logic; + + I_A : in std_logic_vector(9 downto 0); + I_BD : in std_logic_vector(7 downto 0); + I_OBJ_SUB_A : in std_logic_vector(2 downto 0); + I_OBJ_RAM_RQ : in std_logic; + I_OBJ_RAM_RD : in std_logic; + I_OBJ_RAM_WR : in std_logic; + I_VID_RAM_RD : in std_logic; + I_VID_RAM_WR : in std_logic; + I_DRIVER_WR : in std_logic; + + O_C_BLnX : out std_logic; + O_8HF : out std_logic; + O_256HnX : out std_logic; + O_1VF : out std_logic; + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic; + + O_BD : out std_logic_vector(7 downto 0); + O_VID : out std_logic_vector(1 downto 0); + O_COL : out std_logic_vector(2 downto 0) + ); +end; + +architecture RTL of MC_VIDEO is + + signal WB_LDn : std_logic := '0'; + signal WB_CNTRLDn : std_logic := '0'; + signal WB_CNTRCLRn : std_logic := '0'; + signal WB_COLLn : std_logic := '0'; + signal WB_VPLn : std_logic := '0'; + signal WB_OBJDATALn : std_logic := '0'; + signal WB_MLDn : std_logic := '0'; + signal WB_SLDn : std_logic := '0'; + signal W_3D : std_logic := '0'; + signal W_LDn : std_logic := '0'; + signal W_CNTRLDn : std_logic := '0'; + signal W_CNTRCLRn : std_logic := '0'; + signal W_COLLn : std_logic := '0'; + signal W_VPLn : std_logic := '0'; + signal W_OBJDATALn : std_logic := '0'; + signal W_MLDn : std_logic := '0'; + signal W_SLDn : std_logic := '0'; + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_H_POSI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_2M_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6K_Q : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_6P_Q : std_logic_vector( 6 downto 0) := (others => '0'); + signal W_45T_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2KL : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2HJ : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_RV : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_RC : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_O_OBJ_ROM_A : std_logic_vector(10 downto 0) := (others => '0'); + signal W_VID_RAM_A : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AA : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AB : std_logic_vector(11 downto 0) := (others => '0'); + signal C_2HJ : std_logic_vector( 1 downto 0) := (others => '0'); + signal C_2KL : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_CD : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_1M : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_A : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_B : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_Y : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_LRAM_DI : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_LRAM_DO : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_1H_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_1K_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_LRAM_A : std_logic_vector( 7 downto 0) := (others => '0'); +-- signal W_OBJ_RAM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_HF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_45N_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6J_Q : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DA : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DB : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_256HnX : std_logic := '0'; + signal W_2N : std_logic := '0'; + signal W_45T_CLR : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_H_FLIP1 : std_logic := '0'; + signal W_H_FLIP2 : std_logic := '0'; + signal W_H_FLIP1X : std_logic := '0'; + signal W_H_FLIP2X : std_logic := '0'; + signal W_LRAM_AND : std_logic := '0'; + signal W_RAW0 : std_logic := '0'; + signal W_RAW1 : std_logic := '0'; + signal W_RAW_OR : std_logic := '0'; + signal W_SRCLK : std_logic := '0'; + signal W_SRLD : std_logic := '0'; + signal W_VID_RAM_CS : std_logic := '0'; + signal W_CLK_6Mn : std_logic := '0'; + +begin + ld_pls : entity work.MC_LD_PLS + port map( + I_CLK_6M => I_CLK_6M, + I_H_CNT => I_H_CNT, + I_3D_DI => W_3D, + + O_LDn => WB_LDn, + O_CNTRLDn => WB_CNTRLDn, + O_CNTRCLRn => WB_CNTRCLRn, + O_COLLn => WB_COLLn, + O_VPLn => WB_VPLn, + O_OBJDATALn => WB_OBJDATALn, + O_MLDn => WB_MLDn, + O_SLDn => WB_SLDn + ); + + obj_ram : entity work.MC_OBJ_RAM + port map( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(7 downto 0), + I_WEA => I_OBJ_RAM_WR, + I_CEA => I_OBJ_RAM_RQ, + I_DA => I_BD, + O_DA => W_OBJ_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_OBJ_RAM_AB, + I_WEB => '0', + I_CEB => '1', + I_DB => x"00", + O_DB => W_OBJ_RAM_DOB + ); + + lram : entity work.MC_LRAM + port map( + I_CLK => I_CLK_18M, + I_ADDR => W_LRAM_A, + I_WE => W_CLK_6Mn, + I_D => W_LRAM_DI, + O_Dn => W_LRAM_DO + ); + + missile : entity work.MC_MISSILE + port map( + I_CLK_18M => I_CLK_18M, + I_CLK_6M => I_CLK_6M, + I_C_BLn_X => W_C_BLnX, + I_MLDn => W_MLDn, + I_SLDn => W_SLDn, + I_HPOS => W_H_POSI, + O_MISSILEn => O_MISSILEn, + O_SHELLn => O_SHELLn + ); + + vid_ram : entity work.MC_VID_RAM + port map ( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(9 downto 0), + I_DA => W_VID_RAM_DI, + I_WEA => I_VID_RAM_WR, + I_CEA => W_VID_RAM_CS, + O_DA => W_VID_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_VID_RAM_A(9 downto 0), + I_DB => x"00", + I_WEB => '0', + I_CEB => '1', + O_DB => W_VID_RAM_DOB + ); + + -- 1K VID-Rom + k_rom : entity work.GALAXIAN_1K + port map ( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1K_D + ); + + -- 1H VID-Rom + h_rom : entity work.GALAXIAN_1H + port map( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1H_D + ); + +----------------------------------------------------------------------------------- + + process(I_CLK_12M) + begin + if falling_edge(I_CLK_12M) then + W_LDn <= WB_LDn; + W_CNTRLDn <= WB_CNTRLDn; + W_CNTRCLRn <= WB_CNTRCLRn; + W_COLLn <= WB_COLLn; + W_VPLn <= WB_VPLn; + W_OBJDATALn <= WB_OBJDATALn; + W_MLDn <= WB_MLDn; + W_SLDn <= WB_SLDn; + end if; + end process; + + W_CLK_6Mn <= not I_CLK_6M; + + W_6J_DA <= I_H_FLIP & W_HF_CNT(7) & W_HF_CNT(3) & I_H_CNT(2); + W_6J_DB <= W_OBJ_D(6) & ( W_HF_CNT(3) and I_H_CNT(1) ) & I_H_CNT(2) & I_H_CNT(1); + W_6J_Q <= W_6J_DB when I_H_CNT(8) = '1' else W_6J_DA; + + W_H_FLIP1 <= (not I_H_CNT(8)) and I_H_FLIP; + + W_HF_CNT(7 downto 3) <= not I_H_CNT(7 downto 3) when W_H_FLIP1 = '1' else I_H_CNT(7 downto 3); + W_VF_CNT <= not I_V_CNT when I_V_FLIP = '1' else I_V_CNT; + + O_8HF <= W_HF_CNT(3); + O_1VF <= W_VF_CNT(0); + W_H_FLIP2 <= W_6J_Q(3); + +-- Parts 4F,5F + W_OBJ_RAM_AB <= "0" & I_H_CNT(8) & W_6J_Q(2) & W_HF_CNT(6 downto 4) & W_6J_Q(1 downto 0); +-- W_OBJ_RAM_A <= W_OBJ_RAM_AB when I_OBJ_RAM_RQ = '0' else I_A(7 downto 0) ; + + process(I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_H_POSI <= W_OBJ_RAM_DOB; + end if; + end process; + + W_OBJ_RAM_D <= W_OBJ_RAM_DOA when I_OBJ_RAM_RD = '1' else (others => '0'); + +-- Parts 4L + process(W_OBJDATALn) + begin + if rising_edge(W_OBJDATALn) then + W_OBJ_D <= W_H_POSI; + end if; + end process; + +-- Parts 4,5N + W_45N_Q <= W_VF_CNT + W_H_POSI; + W_3D <= '0' when W_45N_Q = x"FF" else '1'; + + process(W_VPLn, I_V_BLn) + begin + if (I_V_BLn = '0') then + W_2M_Q <= (others => '0'); + elsif rising_edge(W_VPLn) then + W_2M_Q <= W_45N_Q; + end if; + end process; + + W_2N <= I_H_CNT(8) and W_OBJ_D(7); + W_1M <= W_2M_Q(3 downto 0) xor (W_2N & W_2N & W_2N & W_2N); + W_VID_RAM_CS <= I_VID_RAM_RD or I_VID_RAM_WR; + W_VID_RAM_DI <= I_BD when I_VID_RAM_WR = '1' else (others => '0'); + W_VID_RAM_AA <= (not ( W_2M_Q(7) and W_2M_Q(6) and W_2M_Q(5) and W_2M_Q(4))) & (not W_VID_RAM_CS) & "0000000000"; -- I_A(9:0) + W_VID_RAM_AB <= "00" & W_2M_Q(7 downto 4) & W_1M(3) & W_HF_CNT(7 downto 3); + W_VID_RAM_A <= W_VID_RAM_AB when I_C_BLn = '1' else W_VID_RAM_AA; + W_VID_RAM_D <= W_VID_RAM_DOA when I_VID_RAM_RD = '1' else (others => '0'); + +---- VIDEO DATA OUTPUT -------------- + + O_BD <= W_OBJ_RAM_D or W_VID_RAM_D; + W_SRLD <= not (W_LDn or W_VID_RAM_A(11)); + W_OBJ_ROM_AB <= W_OBJ_D(5 downto 0) & W_1M(3) & (W_OBJ_D(6) xor I_H_CNT(3)); + W_OBJ_ROM_A <= W_OBJ_ROM_AB when I_H_CNT(8) = '1' else W_VID_RAM_DOB; + W_O_OBJ_ROM_A <= W_OBJ_ROM_A & W_1M(2 downto 0); + +----------------------------------------------------------------------------------- + + W_3L_A <= reg_2HJ(7) & reg_2KL(7) & "1" & W_SRLD; + W_3L_B <= reg_2HJ(0) & reg_2KL(0) & W_SRLD & "1"; + W_3L_Y <= W_3L_B when W_H_FLIP2X = '1' else W_3L_A; -- (3)=RAW1,(2)=RAW0 + C_2HJ <= W_3L_Y(1 downto 0); + C_2KL <= W_3L_Y(1 downto 0); + W_RAW0 <= W_3L_Y(2); + W_RAW1 <= W_3L_Y(3); + W_SRCLK <= I_CLK_6M; + +-------- PARTS 2KL ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2KL) is + when "00" => reg_2KL <= reg_2KL; + when "10" => reg_2KL <= reg_2KL(6 downto 0) & "0"; + when "01" => reg_2KL <= "0" & reg_2KL(7 downto 1); + when "11" => reg_2KL <= W_1K_D; + when others => null; + end case; + end if; + end process; + +-------- PARTS 2HJ ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2HJ) is + when "00" => reg_2HJ <= reg_2HJ; + when "10" => reg_2HJ <= reg_2HJ(6 downto 0) & "0"; + when "01" => reg_2HJ <= "0" & reg_2HJ(7 downto 1); + when "11" => reg_2HJ <= W_1H_D; + when others => null; + end case; + end if; + end process; + +------- SHT2 ----------------------------------------------------- + +-- Parts 6K + process(W_COLLn) + begin + if rising_edge(W_COLLn) then + W_6K_Q <= W_H_POSI(2 downto 0); + end if; + end process; + +-- Parts 6P + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + if (W_LDn = '0') then + W_6P_Q <= W_H_FLIP2 & W_H_FLIP1 & I_C_BLn & (not I_H_CNT(8)) & W_6K_Q(2 downto 0); + else + W_6P_Q <= W_6P_Q; + end if; + end if; + end process; + + W_H_FLIP2X <= W_6P_Q(6); + W_H_FLIP1X <= W_6P_Q(5); + W_C_BLnX <= W_6P_Q(4); + W_256HnX <= W_6P_Q(3); + W_CD <= W_6P_Q(2 downto 0); + O_256HnX <= W_256HnX; + O_C_BLnX <= W_C_BLnX; + W_45T_CLR <= W_CNTRCLRn or W_256HnX ; + + process(I_CLK_6M, W_45T_CLR) + begin + if (W_45T_CLR = '0') then + W_45T_Q <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + if (W_CNTRLDn = '0') then + W_45T_Q <= W_H_POSI; + else + W_45T_Q <= W_45T_Q + 1; + end if; + end if; + end process; + + W_LRAM_A <= (not W_45T_Q) when W_H_FLIP1X = '1' else W_45T_Q; + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_RV <= W_LRAM_DO(1 downto 0); + W_RC <= W_LRAM_DO(4 downto 2); + end if; + end process; + + W_LRAM_AND <= not (not ((W_LRAM_A(4) or W_LRAM_A(5)) or (W_LRAM_A(6) or W_LRAM_A(7))) or W_256HnX ); + W_RAW_OR <= W_RAW0 or W_RAW1 ; + + W_VID(0) <= not (not (W_RAW0 and W_RV(1)) and W_RV(0)); + W_VID(1) <= not (not (W_RAW1 and W_RV(0)) and W_RV(1)); + W_COL(0) <= not (not (W_RAW_OR and W_CD(0) and W_RC(1) and W_RC(2)) and W_RC(0)); + W_COL(1) <= not (not (W_RAW_OR and W_CD(1) and W_RC(2) and W_RC(0)) and W_RC(1)); + W_COL(2) <= not (not (W_RAW_OR and W_CD(2) and W_RC(0) and W_RC(1)) and W_RC(2)); + + O_VID <= W_VID; + O_COL <= W_COL; + + W_LRAM_DI(0) <= W_LRAM_AND and W_VID(0); + W_LRAM_DI(1) <= W_LRAM_AND and W_VID(1); + W_LRAM_DI(2) <= W_LRAM_AND and W_COL(0); + W_LRAM_DI(3) <= W_LRAM_AND and W_COL(1); + W_LRAM_DI(4) <= W_LRAM_AND and W_COL(2); + +end RTL; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mist_io.v b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_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/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/osd.v b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_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/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/pll.qip b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_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 VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/pll.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/pll.vhd new file mode 100644 index 00000000..bb04a979 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/pll.vhd @@ -0,0 +1,451 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + c3 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + clk3_divide_by : NATURAL; + clk3_duty_cycle : NATURAL; + clk3_multiply_by : NATURAL; + clk3_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire2 <= sub_wire0(3); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c3 <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 3, + clk0_duty_cycle => 50, + clk0_multiply_by => 2, + clk0_phase_shift => "0", + clk1_divide_by => 9, + clk1_duty_cycle => 50, + clk1_multiply_by => 4, + clk1_phase_shift => "0", + clk2_divide_by => 9, + clk2_duty_cycle => 50, + clk2_multiply_by => 2, + clk2_phase_shift => "0", + clk3_divide_by => 6, + clk3_duty_cycle => 50, + clk3_multiply_by => 1, + clk3_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_USED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire6, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "3" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "6" +-- 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: DUTY_CYCLE3 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "18.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "12.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "6.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "4.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 "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "4" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "18.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "12.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "6.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "4.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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: PHASE_SHIFT_UNIT3 STRING "ps" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "3" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "4" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "6" +-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK3_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_USED" +-- 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_USED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/scandoubler.v b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..36e71ed2 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_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/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/sine_package.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/sine_package.vhd new file mode 100644 index 00000000..473caa04 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/sine_package.vhd @@ -0,0 +1,152 @@ +library ieee; +use ieee.std_logic_1164.all; + +package sine_package is + + subtype table_value_type is integer range 0 to 16383; + subtype table_index_type is std_logic_vector( 6 downto 0 ); + + function get_table_value (table_index: table_index_type) return table_value_type; + +end; + +package body sine_package is + + function get_table_value (table_index: table_index_type) return table_value_type is + variable table_value: table_value_type; + begin + case table_index is + when "0000000" => table_value := 101; + when "0000001" => table_value := 302; + when "0000010" => table_value := 503; + when "0000011" => table_value := 703; + when "0000100" => table_value := 904; + when "0000101" => table_value := 1105; + when "0000110" => table_value := 1305; + when "0000111" => table_value := 1506; + when "0001000" => table_value := 1706; + when "0001001" => table_value := 1906; + when "0001010" => table_value := 2105; + when "0001011" => table_value := 2304; + when "0001100" => table_value := 2503; + when "0001101" => table_value := 2702; + when "0001110" => table_value := 2900; + when "0001111" => table_value := 3098; + when "0010000" => table_value := 3295; + when "0010001" => table_value := 3491; + when "0010010" => table_value := 3688; + when "0010011" => table_value := 3883; + when "0010100" => table_value := 4078; + when "0010101" => table_value := 4273; + when "0010110" => table_value := 4466; + when "0010111" => table_value := 4659; + when "0011000" => table_value := 4852; + when "0011001" => table_value := 5044; + when "0011010" => table_value := 5234; + when "0011011" => table_value := 5425; + when "0011100" => table_value := 5614; + when "0011101" => table_value := 5802; + when "0011110" => table_value := 5990; + when "0011111" => table_value := 6177; + when "0100000" => table_value := 6362; + when "0100001" => table_value := 6547; + when "0100010" => table_value := 6731; + when "0100011" => table_value := 6914; + when "0100100" => table_value := 7095; + when "0100101" => table_value := 7276; + when "0100110" => table_value := 7456; + when "0100111" => table_value := 7634; + when "0101000" => table_value := 7811; + when "0101001" => table_value := 7988; + when "0101010" => table_value := 8162; + when "0101011" => table_value := 8336; + when "0101100" => table_value := 8509; + when "0101101" => table_value := 8680; + when "0101110" => table_value := 8850; + when "0101111" => table_value := 9018; + when "0110000" => table_value := 9185; + when "0110001" => table_value := 9351; + when "0110010" => table_value := 9515; + when "0110011" => table_value := 9678; + when "0110100" => table_value := 9840; + when "0110101" => table_value := 10000; + when "0110110" => table_value := 10158; + when "0110111" => table_value := 10315; + when "0111000" => table_value := 10471; + when "0111001" => table_value := 10625; + when "0111010" => table_value := 10777; + when "0111011" => table_value := 10927; + when "0111100" => table_value := 11076; + when "0111101" => table_value := 11224; + when "0111110" => table_value := 11369; + when "0111111" => table_value := 11513; + when "1000000" => table_value := 11655; + when "1000001" => table_value := 11796; + when "1000010" => table_value := 11934; + when "1000011" => table_value := 12071; + when "1000100" => table_value := 12206; + when "1000101" => table_value := 12339; + when "1000110" => table_value := 12471; + when "1000111" => table_value := 12600; + when "1001000" => table_value := 12728; + when "1001001" => table_value := 12853; + when "1001010" => table_value := 12977; + when "1001011" => table_value := 13099; + when "1001100" => table_value := 13219; + when "1001101" => table_value := 13336; + when "1001110" => table_value := 13452; + when "1001111" => table_value := 13566; + when "1010000" => table_value := 13678; + when "1010001" => table_value := 13787; + when "1010010" => table_value := 13895; + when "1010011" => table_value := 14000; + when "1010100" => table_value := 14104; + when "1010101" => table_value := 14205; + when "1010110" => table_value := 14304; + when "1010111" => table_value := 14401; + when "1011000" => table_value := 14496; + when "1011001" => table_value := 14588; + when "1011010" => table_value := 14679; + when "1011011" => table_value := 14767; + when "1011100" => table_value := 14853; + when "1011101" => table_value := 14936; + when "1011110" => table_value := 15018; + when "1011111" => table_value := 15097; + when "1100000" => table_value := 15174; + when "1100001" => table_value := 15249; + when "1100010" => table_value := 15321; + when "1100011" => table_value := 15391; + when "1100100" => table_value := 15459; + when "1100101" => table_value := 15524; + when "1100110" => table_value := 15587; + when "1100111" => table_value := 15648; + when "1101000" => table_value := 15706; + when "1101001" => table_value := 15762; + when "1101010" => table_value := 15816; + when "1101011" => table_value := 15867; + when "1101100" => table_value := 15916; + when "1101101" => table_value := 15963; + when "1101110" => table_value := 16007; + when "1101111" => table_value := 16048; + when "1110000" => table_value := 16088; + when "1110001" => table_value := 16124; + when "1110010" => table_value := 16159; + when "1110011" => table_value := 16191; + when "1110100" => table_value := 16220; + when "1110101" => table_value := 16247; + when "1110110" => table_value := 16272; + when "1110111" => table_value := 16294; + when "1111000" => table_value := 16314; + when "1111001" => table_value := 16331; + when "1111010" => table_value := 16346; + when "1111011" => table_value := 16358; + when "1111100" => table_value := 16368; + when "1111101" => table_value := 16375; + when "1111110" => table_value := 16380; + when "1111111" => table_value := 16383; + when others => null; + end case; + return table_value; + end; + +end; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/spram.vhd b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/spram.vhd new file mode 100644 index 00000000..ad6b58b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone V", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/video_mixer.sv b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..7b2b9717 --- /dev/null +++ b/Arcade/Galaxian Hardware/AzurianAttack_MiST/rtl/video_mixer.sv @@ -0,0 +1,246 @@ +// +// +// 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; +// Scanline FIX +reg [DWIDTH:0] Rd,Gd,Bd; +always @(posedge clk_sys) {Rd,Gd,Bd} <= {R,G,B}; +// Scanline FIX + +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(Rd), + .g_in(Gd), + .b_in(Bd), + + .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/Arcade/Galaxian Hardware/BlackHole_MiST/BlackHole.qpf b/Arcade/Galaxian Hardware/BlackHole_MiST/BlackHole.qpf new file mode 100644 index 00000000..fd1b9b51 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/BlackHole.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:59:16 November 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "14:59:16 November 16, 2017" + +# Revisions + +PROJECT_REVISION = "BlackHole" \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/BlackHole.qsf b/Arcade/Galaxian Hardware/BlackHole_MiST/BlackHole.qsf new file mode 100644 index 00000000..a6ca2898 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/BlackHole.qsf @@ -0,0 +1,190 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 18:12:35 November 17, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# BlackHole_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80as.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_6L.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1K.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1H.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_HIT.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_FIR.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/sine_package.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/BlackHole.sv +set_global_assignment -name VHDL_FILE rtl/mc_video.vhd +set_global_assignment -name VHDL_FILE rtl/mc_stars.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_vco.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_b.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_a.vhd +set_global_assignment -name VHDL_FILE rtl/mc_missile.vhd +set_global_assignment -name VHDL_FILE rtl/mc_logic.vhd +set_global_assignment -name VHDL_FILE rtl/mc_ld_pls.vhd +set_global_assignment -name VHDL_FILE rtl/mc_inport.vhd +set_global_assignment -name VHDL_FILE rtl/mc_hv_count.vhd +set_global_assignment -name VHDL_FILE rtl/mc_col_pal.vhd +set_global_assignment -name VHDL_FILE rtl/mc_bram.vhd +set_global_assignment -name VHDL_FILE rtl/mc_adec.vhd +set_global_assignment -name VHDL_FILE rtl/galaxian.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY BlackHole +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Galaxian) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Galaxian) +# -------------------- +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/BlackHole.srf b/Arcade/Galaxian Hardware/BlackHole_MiST/BlackHole.srf new file mode 100644 index 00000000..063fa14d --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/BlackHole.srf @@ -0,0 +1,52 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Design contains 1 input pin(s) that do not drive logic" { } { } 0 21074 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/README.txt b/Arcade/Galaxian Hardware/BlackHole_MiST/README.txt new file mode 100644 index 00000000..e32c947b --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Black Hole port to MiST by Gehstock +-- 18 December 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Galaxian hardware +-- Copyright(c) 2004 Katsumi Degawa +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- F2 : Coin + Start 2 players +-- F1 : Coin + Start 1 player +-- SPACE : Fire +-- ARROW KEYS : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/Release/BlackHole.rbf b/Arcade/Galaxian Hardware/BlackHole_MiST/Release/BlackHole.rbf new file mode 100644 index 00000000..1a6a8849 Binary files /dev/null and b/Arcade/Galaxian Hardware/BlackHole_MiST/Release/BlackHole.rbf differ diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/clean.bat b/Arcade/Galaxian Hardware/BlackHole_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_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/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/BlackHole.sv b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/BlackHole.sv new file mode 100644 index 00000000..6a436fca --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/BlackHole.sv @@ -0,0 +1,176 @@ +//============================================================================ +// Arcade: BlackHole +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module BlackHole +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "BlackHole;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_18, clk_12, clk_6, clk_4p5; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_18), + .c1(clk_12), + .c2(clk_6), + .c3(clk_4p5)//for now, needs a fix +); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +galaxian blackhole +( + .W_CLK_18M(clk_18), + .W_CLK_12M(clk_12), + .W_CLK_6M(clk_6), + .I_RESET(status[0] | status[6] | buttons[1]), + .P1_CSJUDLR({m_coin,m_start1,m_fire,2'b00,m_left,m_right}), + .P2_CSJUDLR({1'b0, m_start2,m_fire,2'b00,m_down,m_up}), + .W_R(r), + .W_G(g), + .W_B(b), + .W_H_SYNC(hs), + .W_V_SYNC(vs), + .HBLANK(hblank), + .VBLANK(vblank), + .W_SDAT_A(audio_a), + .W_SDAT_B(audio_b) +); + +wire [7:0] audio_a, audio_b; +wire [10:0] audio = {1'b0, audio_b, 2'b0} + {3'b0, audio_a}; + +dac dac ( + .clk_i(clk_18), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [2:0] r, g, b; +wire hblank, vblank; +wire blankn = ~(hblank | vblank); +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_18), + .ce_pix(clk_4p5), + .ce_pix_actual(clk_4p5), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn?r:"000"), + .G(blankn?g:"000"), + .B(blankn?b:"000"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_18 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_18), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GALAXIAN_1H.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GALAXIAN_1H.vhd new file mode 100644 index 00000000..73af8474 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GALAXIAN_1H.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_1H is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_1H is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"22",X"3E",X"00",X"3E",X"2A",X"2A",X"2A",X"00",X"00",X"3E",X"22",X"22",X"3E",X"00",X"3E",X"22", + X"22",X"3E",X"00",X"02",X"3E",X"22",X"00",X"00",X"00",X"3E",X"22",X"22",X"3E",X"00",X"3E",X"22", + X"C0",X"E0",X"E0",X"F0",X"70",X"70",X"78",X"78",X"03",X"07",X"07",X"0F",X"0E",X"0E",X"1E",X"1E", + X"3C",X"3C",X"3E",X"1F",X"1F",X"0F",X"07",X"03",X"3C",X"3C",X"7C",X"F8",X"F8",X"F0",X"E0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"43",X"12",X"06",X"0C",X"38",X"7A",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"01",X"00",X"00",X"00",X"60",X"E0",X"F0",X"F0",X"FC", + X"03",X"07",X"0F",X"0E",X"00",X"00",X"00",X"00",X"E0",X"E0",X"30",X"18",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"07",X"07",X"03",X"00",X"00",X"00",X"00",X"40",X"E0",X"F0",X"E0", + X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"06", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"8F",X"FF",X"7F",X"3F",X"7F",X"FF",X"FF",X"7F", + X"00",X"00",X"00",X"00",X"00",X"08",X"18",X"7D",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"80", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"80",X"C0",X"F0",X"F0",X"E0",X"C0",X"C0",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"7F",X"3F",X"3F",X"3F",X"7F",X"FF",X"EF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"E7",X"00",X"00",X"80",X"80",X"80",X"80",X"C0",X"E0",X"E0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"00",X"00",X"01",X"03",X"07",X"07",X"07",X"9F",X"80",X"80",X"C0",X"E0",X"F0",X"F0",X"FF",X"FF", + X"9F",X"07",X"07",X"07",X"03",X"01",X"00",X"00",X"FF",X"FF",X"F0",X"F0",X"E0",X"C0",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"60",X"60",X"02",X"02",X"63",X"00",X"00",X"00",X"01",X"03",X"07",X"03",X"03", + X"63",X"03",X"03",X"63",X"63",X"03",X"03",X"63",X"03",X"03",X"03",X"33",X"33",X"32",X"30",X"20", + X"63",X"03",X"03",X"63",X"63",X"03",X"03",X"63",X"20",X"30",X"32",X"33",X"33",X"03",X"03",X"03", + X"63",X"02",X"02",X"60",X"60",X"00",X"00",X"00",X"03",X"03",X"07",X"03",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"3F",X"00",X"00",X"00",X"00",X"F8",X"F9",X"6F",X"0F", + X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"67",X"F9",X"F8",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"1F",X"7F",X"FF",X"F0",X"FF",X"FF",X"E0",X"E0",X"E0",X"C0",X"80",X"80",X"F0",X"F0", + X"FF",X"F0",X"FF",X"7F",X"1F",X"1F",X"1F",X"00",X"F0",X"80",X"80",X"C0",X"E0",X"E0",X"E0",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"3F",X"00",X"00",X"00",X"00",X"F8",X"69",X"0F",X"6F", + X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"69",X"F9",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"1F",X"7F",X"FF",X"F0",X"FF",X"FF",X"E0",X"E0",X"E0",X"C0",X"80",X"80",X"F0",X"F0", + X"FF",X"F0",X"FF",X"7F",X"1F",X"1F",X"1F",X"00",X"F0",X"80",X"80",X"C0",X"E0",X"E0",X"E0",X"00", + X"71",X"FF",X"FF",X"FF",X"7F",X"7F",X"3F",X"1F",X"87",X"CF",X"DF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"1F",X"1F",X"7F",X"FF",X"FF",X"FF",X"FF",X"7F",X"FF",X"FF",X"79",X"F0",X"F0",X"F0",X"E0",X"80", + X"00",X"18",X"B8",X"FC",X"FF",X"FF",X"FF",X"FF",X"1F",X"3F",X"7E",X"F8",X"F0",X"F0",X"C0",X"80", + X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"E0",X"E0",X"E0",X"E0",X"E0",X"F0",X"F0",X"F8", + X"1F",X"1F",X"1F",X"3F",X"7F",X"FF",X"FF",X"E7",X"00",X"80",X"CB",X"CF",X"FF",X"FF",X"FF",X"FF", + X"E3",X"C7",X"CF",X"1F",X"3C",X"78",X"F0",X"80",X"FF",X"FF",X"FF",X"FF",X"7F",X"7E",X"3C",X"10", + X"FF",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F8",X"FC",X"FF",X"FF",X"FE",X"E0",X"E0",X"E0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"0F",X"06",X"F0",X"F0",X"F8",X"FC",X"FE",X"C7",X"83",X"00", + X"3C",X"18",X"81",X"C3",X"C3",X"81",X"18",X"3C",X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00", + X"3C",X"18",X"BD",X"FF",X"FF",X"BD",X"18",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"02",X"02",X"FE",X"FE",X"42",X"02",X"00",X"00", + X"62",X"F2",X"BA",X"9A",X"9E",X"CE",X"46",X"00",X"8C",X"DE",X"F2",X"B2",X"92",X"86",X"04",X"00", + X"08",X"FE",X"FE",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BE",X"A2",X"A2",X"A2",X"E6",X"E4",X"00", + X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"C0",X"E0",X"B0",X"9E",X"8E",X"C0",X"C0",X"00", + X"0C",X"6E",X"9A",X"9A",X"B2",X"F2",X"6C",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00", + X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00",X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00", + X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00", + X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00", + X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00",X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00", + X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00",X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00", + X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00",X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00", + X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00",X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00", + X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"FF",X"F0",X"F0",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FC",X"FF",X"07",X"07",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"80",X"80",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"F8",X"FC",X"3C",X"3C",X"FC",X"FC",X"FC",X"FC",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"1F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"F0",X"F8", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"3F",X"7F",X"FE",X"FE",X"FE",X"FE",X"00",X"00",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"7F",X"FF",X"F0",X"F0",X"FF",X"7F",X"3F", + X"FF",X"FF",X"FF",X"03",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C0",X"C0",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"80",X"80",X"80",X"00",X"00",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"FF",X"7F",X"3F",X"1F",X"00",X"00",X"1F",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF", + X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"F0",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"1F",X"3F",X"7F",X"FF",X"F0", + X"FF",X"00",X"00",X"E0",X"E0",X"E0",X"E0",X"00",X"FF",X"00",X"00",X"7F",X"7F",X"7F",X"7F",X"00", + X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"00",X"00",X"FF",X"FF",X"FF",X"C3",X"E7",X"FF",X"3C",X"3C",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"81",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"07",X"07",X"07",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0", + X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"3F",X"3C",X"3C",X"3F",X"1F",X"0F",X"07", + X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"FE",X"FF",X"0F",X"0F",X"FF",X"FE",X"FC",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"07",X"0F", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"F8",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"3C",X"3C",X"3C",X"3C",X"3C",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF", + X"03",X"07",X"0F",X"1F",X"1F",X"3E",X"3C",X"3C",X"C0",X"E0",X"F0",X"F8",X"F8",X"7C",X"3C",X"3C", + X"78",X"78",X"70",X"70",X"F0",X"E0",X"E0",X"C0",X"1E",X"1E",X"0E",X"0E",X"0F",X"07",X"07",X"03", + X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"3F",X"00",X"00",X"00",X"00",X"F8",X"69",X"0F",X"0F", + X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"69",X"F8",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"1F",X"7F",X"FF",X"F0",X"FF",X"FF",X"E0",X"E0",X"E0",X"C0",X"80",X"80",X"F0",X"F0", + X"FF",X"F0",X"FF",X"7F",X"1F",X"1F",X"1F",X"00",X"F0",X"80",X"80",X"C0",X"E0",X"E0",X"E0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"C1",X"00",X"00",X"00",X"00",X"00",X"01",X"57",X"50", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F7",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"2F",X"00",X"7F",X"FF",X"FF",X"FF",X"01",X"00",X"C0",X"00",X"C0",X"80",X"80",X"F0",X"F0", + X"FF",X"FF",X"FF",X"7F",X"00",X"2F",X"00",X"00",X"F0",X"80",X"80",X"C0",X"00",X"C0",X"00",X"00", + X"7F",X"7F",X"3F",X"1F",X"0F",X"07",X"03",X"01",X"07",X"07",X"03",X"03",X"01",X"01",X"00",X"00", + X"3F",X"3F",X"1F",X"1F",X"1F",X"0F",X"0F",X"0F",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"7F",X"7F",X"7F",X"7F",X"7F",X"FF", + X"0F",X"0F",X"0F",X"1F",X"1F",X"1F",X"3F",X"3F",X"00",X"00",X"01",X"01",X"03",X"03",X"07",X"07", + X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F",X"7F",X"C0",X"7A",X"38",X"0C",X"06",X"12",X"43",X"01", + X"01",X"43",X"12",X"06",X"0C",X"38",X"7A",X"C0",X"18",X"9A",X"28",X"1C",X"49",X"18",X"08",X"18", + X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00", + X"80",X"90",X"90",X"90",X"FE",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GALAXIAN_1K.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GALAXIAN_1K.vhd new file mode 100644 index 00000000..b5bcbc4e --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GALAXIAN_1K.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_1K is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_1K is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"22",X"3E",X"00",X"3E",X"2A",X"2A",X"2A",X"00",X"00",X"3E",X"22",X"22",X"3E",X"00",X"3E",X"22", + X"22",X"3E",X"00",X"02",X"3E",X"22",X"00",X"00",X"00",X"3E",X"22",X"22",X"3E",X"00",X"3E",X"22", + X"00",X"18",X"18",X"0C",X"0C",X"0C",X"06",X"07",X"00",X"18",X"18",X"30",X"30",X"30",X"60",X"E0", + X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"02",X"04",X"10",X"68",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"3F",X"7F",X"3F",X"3F",X"7F",X"3F",X"1F",X"CC",X"FC",X"FC",X"DC",X"5E",X"EE",X"EE",X"EE", + X"1F",X"3F",X"3F",X"3F",X"3F",X"7F",X"61",X"C0",X"FC",X"FC",X"FE",X"FF",X"FE",X"FE",X"FF",X"1D", + X"00",X"00",X"67",X"FF",X"7D",X"38",X"38",X"1C",X"03",X"36",X"FC",X"FC",X"B8",X"18",X"0E",X"1F", + X"18",X"1C",X"3C",X"3F",X"3F",X"6F",X"46",X"80",X"1C",X"1C",X"3C",X"FE",X"FE",X"C7",X"01",X"00", + X"80",X"60",X"70",X"38",X"3F",X"1F",X"1F",X"0F",X"02",X"07",X"0F",X"FF",X"FF",X"FF",X"FB",X"F9", + X"06",X"0F",X"0F",X"1F",X"1F",X"1F",X"3F",X"7F",X"70",X"00",X"80",X"C0",X"80",X"01",X"03",X"07", + X"08",X"1C",X"FE",X"FF",X"FF",X"F7",X"E7",X"82",X"21",X"76",X"FE",X"FE",X"FC",X"BC",X"3E",X"7F", + X"00",X"00",X"18",X"7C",X"FC",X"FE",X"FC",X"F0",X"7F",X"3F",X"0E",X"0E",X"1E",X"3C",X"3C",X"78", + X"FF",X"3F",X"1F",X"1F",X"1F",X"1F",X"0E",X"0E",X"87",X"CF",X"C6",X"C2",X"80",X"C0",X"10",X"FF", + X"0F",X"1F",X"1F",X"1F",X"1C",X"38",X"60",X"80",X"FF",X"FF",X"FF",X"C7",X"07",X"03",X"03",X"01", + X"E0",X"C0",X"00",X"00",X"00",X"18",X"FF",X"FF",X"78",X"70",X"70",X"70",X"38",X"18",X"1C",X"FC", + X"FF",X"FF",X"F3",X"E1",X"C0",X"80",X"80",X"00",X"FE",X"FE",X"FE",X"FF",X"FF",X"1F",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"A0",X"80", + X"00",X"00",X"01",X"03",X"07",X"67",X"65",X"FD",X"80",X"80",X"C0",X"E0",X"F0",X"F0",X"DF",X"DF", + X"FD",X"65",X"66",X"07",X"03",X"01",X"00",X"00",X"DF",X"DF",X"30",X"F0",X"E0",X"C0",X"80",X"80", + X"00",X"02",X"03",X"01",X"00",X"00",X"00",X"00",X"80",X"A0",X"E0",X"C0",X"00",X"00",X"00",X"00", + X"F0",X"F8",X"F8",X"FC",X"FC",X"FE",X"FE",X"FF",X"00",X"00",X"00",X"01",X"03",X"07",X"03",X"03", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"03",X"87",X"8F",X"FF",X"FF",X"FE",X"F0",X"E0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"E0",X"F0",X"FE",X"FF",X"FF",X"8F",X"87",X"03", + X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0",X"03",X"03",X"07",X"03",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"01",X"97",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"97",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"2F",X"00",X"7F",X"FF",X"FF",X"FF",X"01",X"00",X"C0",X"00",X"C0",X"80",X"80",X"F0",X"F0", + X"FF",X"FF",X"FF",X"7F",X"00",X"2F",X"00",X"00",X"F0",X"80",X"80",X"C0",X"00",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"FF",X"00",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"FF", + X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00", + X"1F",X"30",X"1F",X"00",X"00",X"0F",X"00",X"FE",X"E0",X"20",X"E0",X"00",X"00",X"00",X"00",X"00", + X"00",X"0F",X"00",X"00",X"1F",X"30",X"1F",X"00",X"00",X"00",X"00",X"00",X"E0",X"20",X"E0",X"00", + X"71",X"FF",X"FF",X"FF",X"7F",X"7E",X"3C",X"1C",X"17",X"CF",X"DF",X"FF",X"FF",X"FB",X"21",X"00", + X"1E",X"1F",X"7F",X"FF",X"F9",X"F8",X"F8",X"7C",X"00",X"00",X"86",X"CF",X"CF",X"0F",X"1F",X"70", + X"00",X"18",X"B8",X"FC",X"FF",X"FF",X"FF",X"1F",X"1F",X"3F",X"7E",X"F8",X"F0",X"F0",X"C0",X"80", + X"0F",X"07",X"03",X"03",X"83",X"87",X"07",X"07",X"E0",X"E0",X"E0",X"E0",X"E0",X"F0",X"F0",X"78", + X"1C",X"1C",X"1E",X"3E",X"7E",X"FF",X"FF",X"E7",X"FF",X"7F",X"3C",X"30",X"00",X"00",X"00",X"E0", + X"E3",X"C7",X"EF",X"1F",X"3C",X"78",X"F0",X"80",X"F1",X"FF",X"FF",X"FF",X"7F",X"7E",X"3C",X"10", + X"02",X"80",X"00",X"08",X"08",X"18",X"38",X"78",X"38",X"3C",X"3F",X"7F",X"FE",X"60",X"60",X"E0", + X"FC",X"FF",X"FF",X"FF",X"FF",X"1F",X"0F",X"06",X"F0",X"F0",X"F8",X"FC",X"FE",X"C7",X"83",X"00", + X"00",X"00",X"3C",X"3C",X"3C",X"3C",X"00",X"00",X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00", + X"00",X"00",X"3C",X"3C",X"3C",X"3C",X"00",X"00",X"1F",X"11",X"11",X"1F",X"00",X"1F",X"11",X"11", + X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"02",X"02",X"FE",X"FE",X"42",X"02",X"00",X"00", + X"62",X"F2",X"BA",X"9A",X"9E",X"CE",X"46",X"00",X"8C",X"DE",X"F2",X"B2",X"92",X"86",X"04",X"00", + X"08",X"FE",X"FE",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BE",X"A2",X"A2",X"A2",X"E6",X"E4",X"00", + X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"C0",X"E0",X"B0",X"9E",X"8E",X"C0",X"C0",X"00", + X"0C",X"6E",X"9A",X"9A",X"B2",X"F2",X"6C",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00", + X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00",X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00", + X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00", + X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00", + X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00",X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00", + X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00",X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00", + X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00",X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00", + X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00",X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00", + X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"FF",X"F0",X"F0",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FC",X"FF",X"07",X"07",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"80",X"80",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"F8",X"FC",X"3C",X"3C",X"FC",X"FC",X"FC",X"FC",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"1F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"F0",X"F8", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"3F",X"7F",X"FE",X"FE",X"FE",X"FE",X"00",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"7F",X"FF",X"F0",X"F0",X"FF",X"7F",X"3F", + X"FF",X"FF",X"FF",X"03",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C0",X"C0",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"80",X"80",X"80",X"00",X"00",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"FF",X"7F",X"3F",X"1F",X"00",X"00",X"1F",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF", + X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"F0",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"1F",X"3F",X"7F",X"FF",X"F0", + X"FF",X"00",X"00",X"E0",X"E0",X"E0",X"E0",X"00",X"FF",X"00",X"00",X"7F",X"7F",X"7F",X"7F",X"00", + X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"00",X"00",X"FF",X"FF",X"FF",X"C3",X"E7",X"FF",X"3C",X"3C",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"81",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"07",X"07",X"07",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0", + X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"3F",X"3C",X"3C",X"3F",X"1F",X"0F",X"07", + X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"FE",X"FF",X"0F",X"0F",X"FF",X"FE",X"FC",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"07",X"0F", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"F8",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"3C",X"3C",X"3C",X"3C",X"3C",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0", + X"07",X"06",X"0C",X"0C",X"0C",X"18",X"18",X"00",X"E0",X"60",X"30",X"30",X"30",X"18",X"18",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"FF",X"00",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"FF", + X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00", + X"1F",X"30",X"1F",X"00",X"00",X"0F",X"00",X"FE",X"E0",X"20",X"E0",X"00",X"00",X"00",X"00",X"00", + X"00",X"0F",X"00",X"00",X"1F",X"30",X"1F",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"E0",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"06",X"3E",X"00",X"00",X"00",X"00",X"F8",X"F9",X"AF",X"AF", + X"06",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"F9",X"F8",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"1F",X"7F",X"FF",X"F0",X"FF",X"FF",X"E0",X"E0",X"E0",X"C0",X"80",X"80",X"F0",X"F0", + X"FF",X"F0",X"FF",X"7F",X"1F",X"1F",X"1F",X"00",X"F0",X"80",X"80",X"C0",X"E0",X"E0",X"E0",X"00", + X"7F",X"7F",X"3F",X"1F",X"0F",X"07",X"03",X"01",X"07",X"07",X"03",X"03",X"01",X"01",X"00",X"00", + X"3F",X"3F",X"1F",X"1F",X"1F",X"0F",X"0F",X"0F",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"7F",X"7F",X"7F",X"7F",X"7F",X"FF", + X"0F",X"0F",X"0F",X"1F",X"1F",X"1F",X"3F",X"3F",X"00",X"00",X"01",X"01",X"03",X"03",X"07",X"07", + X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F",X"7F",X"00",X"68",X"10",X"04",X"02",X"10",X"00",X"00", + X"00",X"00",X"10",X"02",X"04",X"10",X"68",X"00",X"18",X"92",X"08",X"0C",X"48",X"10",X"08",X"18", + X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00", + X"80",X"90",X"90",X"90",X"FE",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GALAXIAN_6L.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GALAXIAN_6L.vhd new file mode 100644 index 00000000..2f811f7d --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GALAXIAN_6L.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_6L is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_6L is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"F6",X"00",X"16",X"C0",X"3F",X"00",X"D8",X"07",X"3F",X"00",X"C0",X"C4",X"07", + X"00",X"C0",X"A0",X"07",X"00",X"00",X"00",X"07",X"00",X"F6",X"07",X"F0",X"00",X"76",X"07",X"C6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GAL_FIR.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GAL_FIR.vhd new file mode 100644 index 00000000..5aff2022 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GAL_FIR.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_FIR 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 prom of GAL_FIR is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AC",X"68",X"72",X"C7",X"93",X"3F",X"80",X"C8",X"5C",X"A1",X"22",X"90",X"B9",X"8A",X"41",X"62", + X"C2",X"A1",X"40",X"6A",X"C9",X"7F",X"64",X"3C",X"BC",X"AD",X"5B",X"4C",X"D4",X"62",X"3D",X"D3", + X"7F",X"31",X"A3",X"BE",X"5D",X"49",X"C7",X"7D",X"28",X"C0",X"A1",X"7A",X"7D",X"2B",X"C9",X"91", + X"80",X"6B",X"39",X"95",X"BA",X"91",X"27",X"C1",X"91",X"7E",X"6D",X"31",X"C0",X"A4",X"7C",X"7B", + X"37",X"80",X"CB",X"7E",X"88",X"64",X"40",X"8F",X"C3",X"83",X"83",X"68",X"36",X"D0",X"8C",X"29", + X"B4",X"B1",X"52",X"4B",X"E9",X"3E",X"74",X"C4",X"73",X"81",X"2B",X"AD",X"B9",X"4E",X"4B",X"CB", + X"91",X"76",X"33",X"B6",X"A5",X"6E",X"4A",X"63",X"D7",X"7C",X"3E",X"7E",X"DE",X"45",X"67",X"C1", + X"84",X"2D",X"A8",X"A9",X"20",X"AC",X"B5",X"7E",X"47",X"5F",X"DD",X"6E",X"44",X"BD",X"97",X"22", + X"AE",X"A4",X"25",X"CB",X"93",X"77",X"3C",X"78",X"CB",X"83",X"29",X"B3",X"AB",X"7D",X"5D",X"44", + X"A4",X"BC",X"79",X"8C",X"3A",X"76",X"CF",X"78",X"44",X"6B",X"D9",X"6B",X"3B",X"9A",X"CC",X"26", + X"A4",X"A3",X"1D",X"BA",X"A9",X"83",X"71",X"3A",X"8B",X"CC",X"6A",X"3E",X"E5",X"28",X"A4",X"A3", + X"1E",X"C9",X"9C",X"78",X"32",X"94",X"C4",X"74",X"88",X"2A",X"A2",X"BC",X"1A",X"E2",X"4B",X"86", + X"B3",X"72",X"48",X"68",X"D2",X"83",X"32",X"A4",X"B2",X"73",X"4E",X"5A",X"C8",X"9C",X"2C",X"90", + X"C1",X"7B",X"5E",X"41",X"CC",X"99",X"6F",X"3A",X"8B",X"C9",X"7A",X"84",X"23",X"BC",X"9D",X"33", + X"CC",X"82",X"24",X"D7",X"6C",X"47",X"D1",X"87",X"5C",X"41",X"C5",X"9F",X"71",X"35",X"A8",X"B9", + X"67",X"4F",X"5F",X"CE",X"8A",X"43",X"C6",X"80",X"54",X"4A",X"B1",X"AE",X"87",X"50",X"4F",X"C6", + X"9F",X"55",X"45",X"BB",X"AC",X"5C",X"41",X"A9",X"BE",X"5C",X"4C",X"72",X"D4",X"71",X"42",X"DA", + X"20",X"CF",X"6C",X"3D",X"D5",X"8A",X"78",X"39",X"7B",X"BF",X"99",X"75",X"37",X"99",X"C7",X"28", + X"7B",X"C3",X"91",X"58",X"46",X"9D",X"BB",X"88",X"60",X"40",X"9A",X"BB",X"8C",X"3B",X"6A",X"BA", + X"AC",X"31",X"7F",X"C8",X"2F",X"78",X"DC",X"33",X"AE",X"80",X"34",X"EE",X"38",X"74",X"D5",X"1F", + X"98",X"BA",X"82",X"58",X"4A",X"D6",X"86",X"56",X"49",X"F0",X"34",X"73",X"BD",X"9A",X"43",X"67", + X"C3",X"8D",X"2E",X"8B",X"B9",X"40",X"C6",X"33",X"B7",X"A5",X"27",X"8A",X"BA",X"42",X"BF",X"8A", + X"3A",X"6F",X"D1",X"5C",X"41",X"DF",X"6A",X"42",X"C3",X"A4",X"33",X"80",X"CC",X"5C",X"43",X"89", + X"BE",X"96",X"53",X"4E",X"8D",X"D4",X"2E",X"BD",X"56",X"6C",X"DA",X"53",X"47",X"9C",X"C8",X"2A", + X"75",X"B3",X"B0",X"2F",X"80",X"CA",X"2B",X"81",X"CD",X"35",X"7E",X"CE",X"32",X"81",X"CD",X"74", + X"40",X"74",X"D8",X"4E",X"58",X"D3",X"85",X"4D",X"53",X"AE",X"B8",X"61",X"3D",X"9F",X"C3",X"30", + X"86",X"D0",X"5E",X"47",X"7D",X"C6",X"91",X"4E",X"4E",X"A9",X"B9",X"6D",X"34",X"9F",X"B7",X"3F", + X"C6",X"7A",X"37",X"81",X"C5",X"8C",X"33",X"88",X"D3",X"44",X"59",X"82",X"C8",X"88",X"42",X"61", + X"AF",X"A2",X"44",X"D9",X"48",X"52",X"89",X"BC",X"99",X"2E",X"7E",X"B4",X"38",X"B7",X"9E",X"20", + X"E4",X"56",X"63",X"D9",X"56",X"43",X"B1",X"B8",X"37",X"6B",X"D3",X"6D",X"31",X"C8",X"65",X"8D", + X"B9",X"0B",X"BA",X"86",X"4D",X"D7",X"4E",X"4B",X"E7",X"3C",X"95",X"AD",X"1D",X"D8",X"72",X"35", + X"B4",X"A5",X"2F",X"B3",X"B6",X"44",X"57",X"93",X"CB",X"67",X"3F",X"A1",X"C7",X"21",X"89",X"9C", + X"5A",X"D8",X"20",X"A3",X"BA",X"25",X"89",X"AD",X"37",X"D8",X"5D",X"53",X"DC",X"77",X"43",X"70", + X"E1",X"46",X"59",X"83",X"CC",X"6E",X"37",X"E7",X"56",X"4E",X"86",X"D3",X"27",X"9E",X"AA",X"44", + X"C0",X"19",X"E9",X"54",X"63",X"DB",X"51",X"4D",X"88",X"CF",X"30",X"91",X"C5",X"66",X"35",X"C1", + X"9C",X"33",X"79",X"A7",X"BA",X"53",X"41",X"DD",X"4B",X"73",X"D2",X"25",X"7F",X"BB",X"9D",X"37", + X"68",X"A9",X"BD",X"3B",X"5C",X"CF",X"61",X"47",X"C9",X"9E",X"47",X"55",X"AF",X"96",X"5D",X"D0", + X"28",X"7E",X"D3",X"48",X"51",X"C7",X"95",X"21",X"BB",X"A6",X"3A",X"67",X"C3",X"81",X"37",X"DE", + X"7D",X"3F",X"72",X"AA",X"B4",X"15",X"DC",X"6C",X"47",X"D2",X"71",X"28",X"EB",X"2E",X"9F",X"93", + X"6C",X"9C",X"37",X"DB",X"43",X"AC",X"37",X"D3",X"4F",X"AC",X"8D",X"1B",X"DF",X"7E",X"46",X"6B", + X"BA",X"A5",X"35",X"73",X"CB",X"41",X"7E",X"C8",X"1D",X"D3",X"60",X"5F",X"DB",X"44",X"57",X"C2", + X"A2",X"41",X"5B",X"AE",X"96",X"5E",X"CC",X"10",X"CF",X"83",X"31",X"DF",X"59",X"46",X"CC",X"87", + X"28",X"D7",X"84",X"3D",X"7A",X"DD",X"3A",X"7B",X"C8",X"36",X"66",X"C8",X"60",X"9A",X"8F",X"29", + X"A8",X"B3",X"83",X"1F",X"D6",X"81",X"33",X"C4",X"82",X"2A",X"D4",X"6B",X"70",X"CA",X"1B",X"A9", + X"AB",X"22",X"AE",X"9E",X"49",X"D3",X"45",X"5A",X"A1",X"BB",X"70",X"27",X"E9",X"49",X"72",X"CC", + X"38",X"67",X"B6",X"AD",X"41",X"57",X"B7",X"8C",X"39",X"E4",X"70",X"4B",X"63",X"C7",X"52",X"AE", + X"8A",X"36",X"8A",X"BB",X"8E",X"2F",X"87",X"AB",X"B2",X"2D",X"72",X"94",X"CD",X"39",X"67",X"D9", + X"2B",X"86",X"C8",X"50",X"4D",X"BC",X"A1",X"3F",X"6B",X"BC",X"7C",X"48",X"E0",X"20",X"BA",X"83", + X"43",X"D4",X"26",X"BD",X"A2",X"3E",X"6C",X"CA",X"8A",X"38",X"7B",X"AF",X"AE",X"23",X"91",X"C0", + X"37",X"76",X"A3",X"C2",X"39",X"63",X"D9",X"48",X"5A",X"93",X"C9",X"43",X"62",X"90",X"B1",X"37", + X"D1",X"53",X"74",X"B1",X"37",X"F6",X"23",X"82",X"C3",X"52",X"4A",X"BB",X"75",X"95",X"88",X"3D", + X"90",X"C3",X"76",X"3B",X"87",X"A9",X"70",X"A6",X"61",X"4F",X"AE",X"B6",X"50",X"4B",X"E2",X"4A", + X"63",X"DC",X"3E",X"63",X"92",X"CC",X"4F",X"4D",X"E3",X"4A",X"5B",X"89",X"D0",X"47",X"5E",X"90", + X"D0",X"49",X"5B",X"7E",X"C6",X"76",X"3E",X"8C",X"AA",X"A4",X"15",X"CD",X"89",X"43",X"80",X"BD", + X"65",X"A8",X"3D",X"8E",X"CF",X"0B",X"C0",X"8E",X"46",X"76",X"C9",X"7A",X"3E",X"88",X"AA",X"A8", + X"18",X"BF",X"9C",X"2E",X"C3",X"85",X"2B",X"DC",X"6C",X"45",X"DB",X"4B",X"5F",X"92",X"AD",X"3D", + X"C3",X"4F",X"86",X"A6",X"75",X"81",X"36",X"E7",X"37",X"A6",X"7D",X"A5",X"5A",X"58",X"D8",X"4E", + X"56",X"AB",X"8E",X"49",X"DD",X"68",X"40",X"8A",X"B0",X"53",X"C3",X"4F",X"60",X"92",X"C6",X"51", + X"54",X"9A",X"C5",X"55",X"4D",X"93",X"C2",X"70",X"2F",X"E3",X"50",X"5B",X"8D",X"AF",X"48",X"AA", + X"81",X"98",X"4C",X"65",X"C1",X"66",X"BB",X"23",X"B0",X"9B",X"39",X"83",X"A4",X"B3",X"1A",X"B0", + X"9D",X"31",X"C3",X"8E",X"2B",X"E2",X"54",X"5A",X"DC",X"32",X"86",X"CA",X"14",X"C9",X"83",X"43", + X"83",X"AD",X"A6",X"15",X"DA",X"6D",X"4C",X"87",X"AF",X"63",X"B9",X"3A",X"8C",X"C5",X"0D",X"CC", + X"79",X"58",X"74",X"C9",X"7D",X"42",X"7C",X"B7",X"5C",X"A9",X"7B",X"41",X"93",X"B6",X"81",X"32", + X"9D",X"92",X"6B",X"87",X"9D",X"94",X"4A",X"6C",X"B7",X"A4",X"1B",X"BD",X"88",X"4D",X"7D",X"BD", + X"4D",X"99",X"8A",X"51",X"CF",X"1B",X"F2",X"56",X"5A",X"72",X"C3",X"4B",X"BE",X"63",X"52",X"E1", + X"2F",X"77",X"91",X"93",X"52",X"C0",X"37",X"E1",X"53",X"5A",X"DA",X"35",X"77",X"85",X"D5",X"39", + X"6D",X"80",X"D3",X"50",X"58",X"D3",X"2D",X"9A",X"B2",X"23",X"BC",X"8C",X"52",X"71",X"C1",X"8D", + X"3E",X"76",X"B3",X"6F",X"6D",X"A1",X"49",X"C9",X"2E",X"D1",X"38",X"C6",X"55",X"8B",X"7C",X"86", + X"B2",X"33",X"7E",X"AD",X"99",X"3C",X"80",X"A3",X"6E",X"88",X"98",X"50",X"AA",X"79",X"99",X"27", + X"FB",X"1D",X"AE",X"63",X"8F",X"94",X"51",X"B0",X"4A",X"AD",X"86",X"8B",X"39",X"EA",X"1B",X"AB", + X"9A",X"4C",X"73",X"B8",X"9A",X"3A",X"76",X"AC",X"64",X"88",X"8B",X"6D",X"A6",X"71",X"97",X"40", + X"8C",X"B5",X"4A",X"A0",X"68",X"86",X"8C",X"98",X"69",X"59",X"DE",X"1F",X"AB",X"A0",X"36",X"A8", + X"A7",X"28",X"E0",X"58",X"59",X"CE",X"37",X"82",X"C8",X"2E",X"A4",X"5A",X"AF",X"62",X"8E",X"C2", + X"2D",X"79",X"91",X"C2",X"2A",X"96",X"77",X"8A",X"99",X"8E",X"3D",X"C7",X"61",X"57",X"9D",X"A3", + X"44",X"DE",X"34",X"88",X"B1",X"37",X"89",X"A3",X"B3",X"15",X"CB",X"73",X"43",X"BA",X"8D",X"47", + X"9D",X"6F",X"C9",X"15",X"D1",X"72",X"53",X"CA",X"48",X"6B",X"9B",X"89",X"6A",X"A0",X"57",X"BE", + X"45",X"9C",X"A5",X"5E",X"54",X"CA",X"63",X"52",X"E1",X"25",X"AE",X"93",X"35",X"E5",X"2A",X"A5", + X"97",X"40",X"8A",X"9A",X"73",X"81",X"8E",X"57",X"CC",X"68",X"67",X"5D",X"C5",X"94",X"43",X"6E", + X"AA",X"A8",X"30",X"9D",X"6E",X"B3",X"6B",X"4B",X"AB",X"79",X"90",X"93",X"50",X"89",X"81",X"8A", + X"A4",X"42",X"9B",X"7F",X"67",X"9F",X"A8",X"48",X"80",X"BA",X"23",X"C5",X"6A",X"5E",X"91",X"99", + X"62",X"9A",X"91",X"6A",X"5A",X"D9",X"3D",X"81",X"B2",X"34",X"C5",X"7A",X"3F",X"BB",X"90",X"3D", + X"D0",X"50",X"65",X"95",X"94",X"63",X"C6",X"2D",X"A6",X"91",X"3D",X"CA",X"5F",X"66",X"91",X"97", + X"A6",X"35",X"A6",X"97",X"2E",X"D9",X"41",X"8F",X"A4",X"3E",X"A2",X"B0",X"2E",X"B5",X"7A",X"55", + X"C9",X"3F",X"84",X"C3",X"42",X"8A",X"72",X"9F",X"65",X"95",X"72",X"84",X"8A",X"58",X"C6",X"73", + X"47",X"D9",X"35",X"90",X"9F",X"4D",X"80",X"A8",X"A1",X"30",X"8F",X"8B",X"C5",X"18",X"B5",X"70", + X"65",X"B0",X"5D",X"93",X"93",X"7B",X"48",X"CB",X"52",X"7D",X"B0",X"3D",X"98",X"BA",X"2E",X"AD", + X"86",X"4A",X"BD",X"6E",X"4C",X"DA",X"53",X"78",X"77",X"96",X"75",X"83",X"82",X"82",X"A5",X"3D", + X"86",X"A2",X"A7",X"31",X"8B",X"8E",X"C3",X"20",X"AA",X"92",X"3A",X"C0",X"87",X"51",X"77",X"AD", + X"62",X"B9",X"4F",X"7F",X"BC",X"1E",X"BF",X"7E",X"51",X"C3",X"50",X"72",X"C0",X"49",X"8A",X"81", + X"72",X"AA",X"7B",X"55",X"8C",X"83",X"CA",X"2B",X"97",X"9C",X"4B",X"86",X"9F",X"B0",X"14",X"EA", + X"3C",X"8A",X"9B",X"51",X"C2",X"25",X"C7",X"70",X"5F",X"AF",X"52",X"C6",X"29",X"B8",X"7F",X"5F", + X"A3",X"5C",X"CB",X"26",X"AE",X"8B",X"3C",X"D6",X"48",X"8A",X"74",X"A2",X"8D",X"3F",X"D3",X"2A", + X"B9",X"7B",X"4D",X"A6",X"69",X"B6",X"6E",X"56",X"8A",X"A1",X"64",X"C3",X"28",X"B2",X"7D",X"60", + X"A6",X"58",X"D4",X"11",X"D1",X"5C",X"7A",X"A8",X"42",X"96",X"C7",X"27",X"A9",X"90",X"44",X"89", + X"9F",X"69",X"90",X"A7",X"25",X"DB",X"46",X"7C",X"B7",X"42",X"9A",X"6E",X"99",X"8C",X"81",X"41", + X"C7",X"7A",X"58",X"8D",X"83",X"B2",X"29",X"C1",X"6E",X"52",X"DA",X"44",X"83",X"B6",X"2A",X"C4", + X"41",X"A6",X"7A",X"76",X"98",X"5B",X"B6",X"86",X"42",X"A2",X"8A",X"4B",X"95",X"97",X"65",X"B7", + X"56",X"6C",X"D2",X"1E",X"B6",X"94",X"36",X"DD",X"38",X"96",X"7B",X"70",X"9E",X"95",X"59",X"77", + X"82",X"8D",X"7C",X"78",X"DC",X"01",X"CD",X"70",X"5D",X"76",X"B4",X"91",X"35",X"BD",X"48",X"D3", + X"36",X"8E",X"B7",X"2C",X"BE",X"49",X"CA",X"4C",X"72",X"CB",X"29",X"B9",X"82",X"3B",X"CC",X"71", + X"4B",X"D1",X"4F",X"6A",X"8D",X"C9",X"46",X"6A",X"CA",X"28",X"99",X"A9",X"61",X"59",X"AA",X"78", + X"8F",X"98",X"35",X"CE",X"64",X"58",X"95",X"A7",X"49",X"AC",X"57",X"9B",X"7C",X"70",X"DE",X"14", + X"A9",X"A3",X"3F",X"7B",X"C9",X"57",X"5F",X"D6",X"17",X"C5",X"7D",X"58",X"9E",X"71",X"B8",X"3D", + X"72",X"A7",X"6C",X"A7",X"80",X"3A",X"E5",X"22",X"A5",X"61",X"B6",X"86",X"38",X"D9",X"56",X"57", + X"9A",X"8E",X"64",X"97",X"96",X"7D",X"45",X"CC",X"5D",X"5A",X"A8",X"AA",X"3C",X"7E",X"97",X"C1", + X"22",X"9B",X"A7",X"45",X"7F",X"A1",X"B4",X"1D",X"BB",X"51",X"B9",X"7A",X"45",X"91",X"A5",X"67", + X"B8",X"34",X"9E",X"A8",X"35",X"88",X"B0",X"54",X"A8",X"8C",X"31",X"E7",X"41",X"6A",X"C7",X"41", + X"85",X"BA",X"2D",X"B1",X"A0",X"35",X"90",X"9F",X"75",X"A0",X"5D",X"52",X"CA",X"59",X"84",X"9A", + X"52",X"B2",X"66",X"AF",X"43",X"6E",X"BC",X"59",X"89",X"95",X"8B",X"74",X"44",X"AE",X"85",X"96", + X"7B",X"4A",X"8B",X"BD",X"7E",X"2F",X"D2",X"68",X"4D",X"D9",X"41",X"6F",X"CA",X"4D",X"62",X"A0", + X"B7",X"3C",X"76",X"D1",X"2E",X"98",X"B1",X"2A",X"BB",X"8D",X"2F",X"E2",X"4A",X"6C",X"C4",X"49", + X"64",X"A5",X"88",X"80",X"9E",X"2A",X"DD",X"59",X"54",X"CE",X"60",X"54",X"9E",X"9D",X"42",X"BF", + X"92",X"34",X"98",X"B7",X"40",X"77",X"9F",X"BC",X"28",X"93",X"B8",X"44",X"67",X"A7",X"AC",X"41", + X"6F",X"9F",X"91",X"50",X"C4",X"37",X"B1",X"7A",X"5B",X"DD",X"4C",X"58",X"C6",X"5D",X"51",X"BA", + X"82",X"47",X"D6",X"6B",X"45",X"AC",X"60",X"C5",X"3D",X"7D",X"CA",X"33",X"8D",X"AE",X"42",X"88", + X"CB",X"4F",X"5D",X"84",X"C3",X"31",X"B4",X"6B",X"6C",X"AD",X"73",X"AB",X"23",X"D5",X"6B",X"43", + X"D1",X"6A",X"47",X"CB",X"4B",X"77",X"C4",X"2B",X"BC",X"94",X"35",X"C6",X"77",X"3E",X"9E",X"94", + X"77",X"A5",X"43",X"7C",X"99",X"BD",X"3A",X"79",X"C8",X"2B",X"B8",X"83",X"37",X"D2",X"77",X"4F", + X"78",X"BD",X"43",X"AC",X"80",X"66",X"C8",X"28",X"89",X"A3",X"AF",X"2A",X"92",X"B9",X"3D",X"80", + X"CC",X"27",X"9A",X"B0",X"48",X"66",X"AD",X"8D",X"44",X"D0",X"6A",X"44",X"AA",X"87",X"6B",X"C7", + X"25",X"A3",X"AB",X"41",X"70",X"AD",X"71",X"9C",X"74",X"45",X"C9",X"91",X"51",X"5D",X"D9",X"4E", + X"62",X"C7",X"61",X"4C",X"A4",X"97",X"78",X"95",X"3D",X"9E",X"A8",X"30",X"D4",X"4B",X"81",X"B2", + X"33",X"C5",X"65",X"A4",X"63",X"4E",X"A8",X"98",X"5F",X"C0",X"30",X"96",X"B5",X"3D",X"75",X"B2", + X"92",X"31",X"B1",X"A5",X"33",X"A4",X"AD",X"43",X"68",X"B4",X"7A",X"51",X"DB",X"45",X"74",X"C9", + X"2D",X"95",X"AD",X"3B",X"8E",X"A9",X"3D",X"C0",X"70",X"62",X"D5",X"27",X"A7",X"9E",X"3F",X"7C", + X"BC",X"50",X"A4",X"8E",X"34",X"A3",X"A1",X"4E",X"99",X"BC",X"35",X"7B",X"BD",X"67",X"45",X"AA", + X"94",X"62",X"C1",X"3E",X"74",X"CB",X"41",X"74",X"A3",X"50",X"B6",X"9F",X"47",X"68",X"A6",X"AF", + X"4A",X"62",X"94",X"AC",X"3F",X"AD",X"A9",X"3F",X"72",X"8A",X"C7",X"54",X"5E",X"7A",X"C0",X"80", + X"4D",X"6B",X"B7",X"71",X"86",X"9F",X"2C",X"DC",X"60",X"59",X"79",X"BB",X"7C",X"40",X"A8",X"AC", + X"63",X"48",X"D4",X"67",X"56",X"79",X"B8",X"8D",X"38",X"BE",X"7E",X"3C",X"B0",X"97",X"54",X"C2", + X"37",X"98",X"B4",X"32",X"90",X"B9",X"4F",X"5E",X"B2",X"A0",X"34",X"9F",X"A3",X"35",X"AD",X"9B", + X"38",X"BB",X"97",X"4E",X"64",X"A4",X"94",X"53",X"D0",X"45",X"6A",X"C2",X"6E",X"42",X"CC",X"77", + X"52",X"73",X"BB",X"61",X"89",X"B2",X"2D",X"9C",X"B4",X"43",X"77",X"C5",X"57",X"59",X"93",X"A6", + X"5B",X"B6",X"50",X"63",X"BE",X"8D",X"4D",X"6A",X"A2",X"AA",X"6F",X"3F",X"C2",X"86",X"4B",X"75", + X"BD",X"76",X"4B",X"D2",X"5A",X"5A",X"8A",X"BF",X"5B",X"56",X"B3",X"9F",X"4E",X"66",X"C4",X"5D", + X"51",X"C0",X"68",X"70",X"C1",X"3E",X"75",X"BB",X"50",X"A6",X"88",X"3A",X"AB",X"A4",X"79",X"3A", + X"BC",X"8E",X"4A",X"74",X"B7",X"82",X"42",X"D2",X"5F",X"5A",X"7F",X"B4",X"8D",X"41",X"86",X"C0", + X"55",X"5F",X"C0",X"44",X"96",X"B6",X"5A",X"5A",X"84",X"BD",X"78",X"52",X"6C",X"BA",X"82",X"41", + X"BD",X"83",X"3E",X"A9",X"91",X"56",X"CA",X"38",X"95",X"AA",X"39",X"8B",X"AE",X"4D",X"8C",X"AC", + X"35",X"BC",X"79",X"52",X"C1",X"5A",X"80",X"C2",X"41",X"73",X"A8",X"4C",X"B1",X"9C",X"63",X"4F", + X"BB",X"8B",X"4B",X"70",X"B2",X"7F",X"46",X"D3",X"48",X"A3",X"94",X"3D",X"94",X"B6",X"52",X"61", + X"BD",X"49",X"91",X"B9",X"58",X"61",X"77",X"BD",X"4D",X"A9",X"84",X"43",X"CF",X"6A",X"58",X"74", + X"C2",X"57",X"93",X"61",X"84",X"BB",X"2E",X"B6",X"86",X"4B",X"C7",X"71",X"54",X"76",X"AF",X"73", + X"5D",X"D2",X"40",X"85",X"B7",X"59",X"5A",X"94",X"AF",X"40",X"9D",X"A1",X"32",X"BD",X"71",X"72", + X"BC",X"51",X"60",X"97",X"AC",X"7F",X"47",X"8D",X"B7",X"57",X"5B",X"C1",X"7B",X"52",X"73",X"AB", + X"8B",X"44",X"C1",X"82",X"42",X"BD",X"75",X"4B",X"B0",X"9D",X"6A",X"50",X"8A",X"AD",X"8E",X"53", + X"65",X"9C",X"AE",X"65",X"51",X"AF",X"99",X"43",X"80",X"B4",X"7E",X"3D",X"B9",X"6B",X"66",X"C2", + X"45",X"B4",X"81",X"50",X"72",X"BC",X"6E",X"4E",X"BA",X"7A",X"4A",X"C1",X"6F",X"5A",X"BB",X"89", + X"5C",X"5E",X"9B",X"AF",X"5E",X"5C",X"CA",X"43",X"87",X"B0",X"41",X"85",X"BA",X"4D",X"77",X"BA", + X"76",X"4A",X"A7",X"9D",X"54",X"61",X"AA",X"9C",X"47",X"7B",X"B2",X"8B",X"51",X"6C",X"9A",X"A4", + X"42",X"A4",X"A6",X"3A",X"A5",X"97",X"3F",X"9E",X"A7",X"78",X"4E",X"7F",X"B1",X"8A",X"58",X"64", + X"B8",X"88",X"48",X"87",X"B5",X"6E",X"49",X"BE",X"59",X"93",X"A5",X"46",X"74",X"9E",X"A3",X"35", + X"C2",X"72",X"55",X"C2",X"5B",X"60",X"B9",X"79",X"48",X"C8",X"57",X"84",X"B1",X"4B",X"6C",X"97", + X"AC",X"3F",X"8C",X"AF",X"47",X"AF",X"89",X"4A",X"7D",X"A4",X"9E",X"4F",X"6A",X"B1",X"8E",X"45", + X"88",X"B2",X"70",X"4B",X"A7",X"9C",X"41",X"AD",X"96",X"49",X"7B",X"B6",X"77",X"4B",X"B4",X"8D", + X"56",X"67",X"A2",X"A0",X"3E",X"B2",X"84",X"45",X"AC",X"9A",X"78",X"44",X"B1",X"80",X"52",X"C9", + X"4B",X"7E",X"B7",X"3C",X"A1",X"99",X"40",X"9F",X"A3",X"7C",X"4C",X"8A",X"B0",X"76",X"4C",X"9D", + X"A6",X"3F",X"9C",X"A5",X"5E",X"5C",X"B7",X"85",X"4E",X"7E",X"B4",X"6A",X"56",X"CD",X"4B",X"99", + X"6F",X"69",X"C4",X"45",X"89",X"B2",X"60",X"60",X"7F",X"BB",X"57",X"6E",X"B4",X"84",X"66",X"59", + X"BD",X"4A",X"9F",X"A0",X"5B",X"5F",X"A1",X"A4",X"65",X"57",X"94",X"A3",X"8E",X"46",X"8A",X"9B", + X"58",X"B7",X"78",X"4C",X"9B",X"A1",X"40",X"AF",X"87",X"42",X"B4",X"80",X"5E",X"BB",X"4B",X"7D", + X"BB",X"42",X"95",X"A1",X"42",X"AA",X"98",X"59",X"64",X"A4",X"A0",X"5F",X"5D",X"9C",X"A7",X"66", + X"57",X"A0",X"A4",X"5E",X"61",X"8A",X"B4",X"4D",X"92",X"A5",X"55",X"68",X"8F",X"B1",X"55",X"6C", + X"BE",X"51",X"88",X"A6",X"36",X"C2",X"6C",X"60",X"B2",X"84",X"4D",X"84",X"A8",X"4A",X"A5",X"9E", + X"60",X"5D",X"AD",X"92",X"76",X"4E",X"94",X"A8",X"72",X"4C",X"B0",X"7A",X"57",X"B8",X"85",X"72", + X"51",X"C2",X"59",X"6C",X"B1",X"86",X"69",X"5A",X"92",X"A9",X"7B",X"50",X"8B",X"B3",X"41",X"AD", + X"6F",X"61",X"B7",X"82",X"6E",X"55",X"A0",X"9F",X"4B",X"87",X"B1",X"52",X"9B",X"96",X"59",X"68", + X"B7",X"55",X"85",X"B1",X"64",X"65",X"70",X"BB",X"6A",X"5F",X"B0",X"8A",X"76",X"55",X"82",X"AE", + X"82",X"5F",X"66",X"A1",X"9C",X"48",X"B7",X"67",X"60",X"B8",X"76",X"4D",X"B7",X"76",X"62",X"B1", + X"7C",X"55",X"84",X"AD",X"77",X"55",X"8B",X"AC",X"40",X"9A",X"A1",X"75",X"57",X"7D",X"A6",X"91", + X"75",X"5C",X"74",X"AE",X"7D",X"52",X"C1",X"58",X"74",X"B7",X"45",X"95",X"A1",X"70",X"57",X"89", + X"AA",X"81",X"5B",X"6D",X"9F",X"9E",X"6F",X"57",X"AB",X"8E",X"63",X"5E",X"B0",X"80",X"4E",X"B1", + X"88",X"4C",X"9E",X"9A",X"46",X"98",X"A4",X"6C",X"55",X"B0",X"84",X"56",X"B8",X"48",X"92",X"A3", + X"7D",X"69",X"5C",X"A6",X"98",X"51",X"83",X"B5",X"4C",X"8E",X"A3",X"69",X"5E",X"80",X"AF",X"6B", + X"5B",X"B3",X"7C",X"52",X"B1",X"88",X"81",X"50",X"88",X"A7",X"83",X"54",X"82",X"AB",X"46",X"9F", + X"9F",X"4B",X"94",X"9F",X"42",X"A8",X"92",X"84",X"59",X"77",X"B3",X"46",X"A5",X"8C",X"4A",X"AE", + X"8A",X"59",X"A9",X"82",X"67",X"60",X"99",X"9F",X"81",X"6A",X"5B",X"BF",X"4F",X"9C",X"82",X"54", + X"BA",X"75",X"55",X"A7",X"8A",X"4B",X"A4",X"96",X"82",X"61",X"67",X"9A",X"9E",X"4D",X"8A",X"A7", + X"7F",X"73",X"52",X"BB",X"60",X"73",X"AC",X"83",X"73",X"59",X"89",X"A4",X"88",X"50",X"95",X"A2", + X"67",X"63",X"7D",X"B0",X"72",X"59",X"A9",X"8F",X"50",X"87",X"AC",X"47",X"9C",X"97",X"7B",X"53", + X"92",X"A0",X"7B",X"5B",X"7F",X"B1",X"49",X"8D",X"A4",X"7B",X"66",X"62",X"B4",X"76",X"66",X"AA", + X"81",X"62",X"6D",X"AF",X"80",X"6D",X"5C",X"97",X"9C",X"86",X"69",X"60",X"AE",X"80",X"4E",X"B9", + X"66",X"6D",X"AA",X"83",X"64",X"69",X"AD",X"86",X"6B",X"60",X"8C",X"AA",X"65",X"66",X"AF",X"80", + X"51",X"9A",X"9B",X"7B",X"72",X"57",X"A5",X"92",X"87",X"67",X"66",X"86",X"B2",X"58",X"8E",X"8B", + X"5F",X"B0",X"71",X"6B",X"63",X"A7",X"8F",X"85",X"67",X"63",X"B2",X"61",X"6F",X"AE",X"81",X"7F", + X"4E",X"A4",X"8D",X"51",X"9F",X"99",X"73",X"62",X"75",X"B6",X"66",X"79",X"9F",X"50",X"B7",X"4C", + X"8E",X"9E",X"7D",X"5C",X"7F",X"AF",X"4B",X"8D",X"A1",X"7D",X"65",X"66",X"AE",X"7B",X"62",X"AD", + X"7B",X"6C",X"5F",X"A8",X"8D",X"84",X"66",X"65",X"A7",X"8D",X"75",X"58",X"9F",X"97",X"74",X"60", + X"79",X"A4",X"8E",X"6A",X"5F",X"A7",X"8D",X"53",X"A7",X"87",X"73",X"57",X"B1",X"74",X"68",X"AD", + X"48",X"A0",X"94",X"81",X"6D",X"5F",X"94",X"9C",X"85",X"6D",X"5F",X"97",X"9D",X"78",X"5B",X"87", + X"AA",X"5E",X"6C",X"A6",X"8A",X"7A",X"5D",X"7B",X"9E",X"96",X"59",X"7D",X"AB",X"4C",X"98",X"95", + X"4B",X"A5",X"8B",X"55",X"A5",X"8D",X"71",X"60",X"84",X"A4",X"84",X"7F",X"5A",X"82",X"AB",X"5B", + X"78",X"B2",X"5B",X"7F",X"A2",X"4D",X"94",X"A2",X"51",X"98",X"93",X"78",X"57",X"9B",X"95",X"7D", + X"57",X"90",X"9D",X"53",X"A2",X"8D",X"6C",X"65",X"81",X"AD",X"68",X"71",X"A9",X"53",X"A4",X"82", + X"7A",X"55",X"A4",X"88",X"53",X"A5",X"8D",X"7F",X"6A",X"63",X"A7",X"87",X"59",X"A5",X"8A",X"77", + X"61",X"7B",X"AD",X"73",X"6B",X"A1",X"7F",X"6F",X"60",X"B2",X"6C",X"66",X"AA",X"82",X"81",X"5E", + X"75",X"9D",X"92",X"7D",X"6C",X"63",X"B0",X"73",X"60",X"A8",X"86",X"80",X"62",X"71",X"99",X"9A", + X"50",X"97",X"92",X"51",X"9D",X"96",X"51",X"A5",X"79",X"5D",X"AA",X"85",X"80",X"64",X"6D",X"AB", + X"77",X"64",X"A9",X"82",X"77",X"5F",X"85",X"A1",X"85",X"7F",X"5B",X"88",X"A4",X"4E",X"95",X"98", + X"81",X"69",X"69",X"B1",X"55",X"90",X"99",X"4F",X"A7",X"7E",X"59",X"AA",X"7C",X"5B",X"9E",X"92", + X"7E",X"70",X"5F",X"A1",X"8F",X"85",X"5F",X"78",X"A6",X"7F",X"77",X"5A",X"A0",X"87",X"58",X"A0", + X"93",X"59",X"97",X"94",X"5B",X"76",X"9F",X"8E",X"63",X"72",X"AC",X"57",X"81",X"A6",X"66",X"68", + X"A7",X"83",X"5C",X"A7",X"80",X"7A",X"59",X"97",X"9A",X"5D",X"7A",X"AD",X"66",X"72",X"A1",X"80", + X"70",X"62",X"A7",X"85",X"7B",X"5F",X"7E",X"9D",X"8E",X"73",X"5F",X"93",X"9D",X"63",X"6D",X"AA", + X"7B",X"89",X"5B",X"7F",X"A0",X"84",X"64",X"78",X"A5",X"7A",X"75",X"5E",X"9C",X"93",X"7F",X"7C", + X"58",X"A0",X"8D",X"80",X"61",X"77",X"9D",X"91",X"65",X"71",X"A4",X"80",X"76",X"5E",X"A4",X"89", + X"7C",X"62",X"78",X"9D",X"8D",X"7D",X"6C",X"68",X"B0",X"69",X"78",X"A3",X"54",X"9F",X"8A",X"79", + X"63",X"7A",X"9E",X"8D",X"64",X"71",X"AD",X"6D",X"6D",X"9D",X"86",X"6F",X"68",X"82",X"A8",X"6A", + X"74",X"A2",X"7A",X"73",X"61",X"B1",X"66",X"73",X"A8",X"5C",X"7D",X"A7",X"6C",X"6C",X"AA",X"56", + X"97",X"89",X"55",X"A7",X"85",X"85",X"6E",X"66",X"A6",X"82",X"82",X"5F",X"81",X"A5",X"55",X"8A", + X"9C",X"7C",X"81",X"5B",X"8A",X"9F",X"5E",X"7E",X"A9",X"5D",X"79",X"9E",X"87",X"61",X"76",X"9E", + X"8C",X"65",X"72",X"A2",X"83",X"78",X"60",X"A2",X"86",X"7C",X"5E",X"9B",X"8C",X"56",X"AD",X"66", + X"71",X"A3",X"81",X"82",X"66",X"74",X"AE",X"5E",X"82",X"9B",X"58",X"8E",X"9E",X"63",X"72",X"A1", + X"84",X"72",X"62",X"9F",X"8B",X"81",X"73",X"65",X"89",X"9D",X"7F",X"84",X"5E",X"84",X"9E",X"7C", + X"7B",X"5E",X"8B",X"96",X"8C",X"56",X"96",X"90",X"80",X"66",X"74",X"9A",X"92",X"61",X"78",X"9E", + X"87",X"69",X"72",X"A2",X"7F",X"76",X"63",X"8B",X"9A",X"83",X"5B",X"8F",X"98",X"7B",X"7F",X"5B", + X"92",X"98",X"5A",X"9D",X"86",X"81",X"62",X"80",X"A0",X"7B",X"76",X"61",X"9A",X"91",X"80",X"7B", + X"5E",X"91",X"96",X"7F",X"6E",X"69",X"99",X"94",X"64",X"75",X"A6",X"74",X"64",X"8F",X"9D",X"65", + X"72",X"A1",X"83",X"74",X"62",X"9F",X"89",X"82",X"72",X"67",X"88",X"9D",X"7A",X"62",X"AC",X"5A", + X"8F",X"90",X"7F",X"6E",X"6B",X"8E",X"9D",X"61",X"86",X"9B",X"56",X"9D",X"88",X"7C",X"64",X"7B", + X"99",X"8E",X"5E",X"7F",X"9F",X"7F",X"83",X"63",X"7D",X"A5",X"6A",X"6C",X"99",X"8F",X"57",X"A1", + X"7C",X"68",X"9C",X"86",X"6B",X"72",X"A2",X"7B",X"81",X"5C",X"98",X"90",X"77",X"61",X"A5",X"71", + X"6B",X"A0",X"87",X"73",X"68",X"A2",X"80",X"80",X"63",X"7D",X"9E",X"81",X"60",X"A2",X"77",X"69", + X"A8",X"6B",X"6D",X"9D",X"83",X"7E",X"65",X"7C",X"9D",X"86",X"62",X"80",X"A1",X"6F",X"68",X"A0", + X"83",X"84",X"6C",X"6E",X"92",X"9A",X"5D",X"8C",X"8F",X"5F",X"A1",X"7F",X"7F",X"65",X"7B",X"98", + X"8C",X"61",X"7C",X"A1",X"78",X"66",X"A3",X"68",X"75",X"A3",X"7A",X"87",X"69",X"70",X"8E",X"97", + X"7C",X"62",X"93",X"90",X"79",X"6B",X"74",X"A0",X"83",X"63",X"87",X"9E",X"6D",X"70",X"A1",X"60", + X"8E",X"91",X"7A",X"73",X"68",X"97",X"8E",X"84",X"73",X"68",X"8D",X"9A",X"75",X"66",X"9E",X"7F", + X"60",X"9A",X"8E",X"61",X"8D",X"92",X"57",X"96",X"8E",X"81",X"79",X"65",X"9C",X"87",X"7A",X"67", + X"80",X"9E",X"7D",X"85",X"64",X"7B",X"9B",X"85",X"72",X"68",X"98",X"8F",X"74",X"66",X"9A",X"89", + X"5D",X"8D",X"96",X"7C",X"60",X"A1",X"7C",X"69",X"9D",X"81",X"78",X"65",X"A2",X"78",X"69",X"A8", + X"62",X"83",X"95",X"7E",X"76",X"67",X"8B",X"97",X"7B",X"61",X"A7",X"6B",X"76",X"9C",X"7F",X"77", + X"66",X"91",X"95",X"77",X"64",X"98",X"8E",X"64",X"7B",X"9D",X"7F",X"61",X"94",X"8F",X"7C",X"66", + X"82",X"9D",X"7A",X"87",X"66",X"7A",X"A0",X"6E",X"6D",X"A0",X"7F",X"84",X"71",X"6B",X"9E",X"83", + X"7E",X"62",X"90",X"92",X"7B",X"79",X"62",X"A4",X"79",X"70",X"99",X"84",X"62",X"8B",X"92",X"7F", + X"74",X"6B",X"8A",X"99",X"75",X"68",X"99",X"8C",X"68",X"77",X"9D",X"7D",X"83",X"6F",X"6D",X"91", + X"91",X"83",X"6F",X"6E",X"99",X"8C",X"69",X"76",X"9F",X"79",X"68",X"A1",X"70",X"6D",X"9B",X"86", + X"60",X"9C",X"7C",X"6A",X"9F",X"7B",X"84",X"65",X"81",X"A0",X"61",X"89",X"91",X"7D",X"7B",X"65", + X"8D",X"95",X"7E",X"83",X"70",X"6D",X"A3",X"73",X"70",X"A1",X"67",X"7F",X"9C",X"5A",X"98",X"7F", + X"6B",X"A0",X"78",X"87",X"60",X"8A",X"95",X"7C",X"81",X"61",X"94",X"8E",X"7F",X"7A",X"67",X"88", + X"93",X"88",X"6F",X"71",X"A0",X"67",X"78",X"98",X"88",X"6D",X"72",X"9E",X"7E",X"83",X"78",X"67", + X"8D",X"92",X"82",X"63",X"8F",X"8F",X"7D",X"7A",X"66",X"8F",X"93",X"7B",X"66",X"A3",X"6B",X"7B", + X"97",X"7E",X"74",X"6B",X"9B",X"86",X"7F",X"80",X"66",X"82",X"95",X"87",X"62",X"88",X"95",X"7D", + X"82",X"6B",X"77",X"99",X"86",X"66",X"91",X"8C",X"74",X"6C",X"98",X"85",X"7B",X"66",X"97",X"87", + X"80",X"74",X"6D",X"8C",X"96",X"73",X"70",X"A1",X"64",X"7A",X"93",X"8D",X"64",X"80",X"96",X"82", + X"6F",X"71",X"99",X"87",X"65",X"82",X"98",X"7F",X"82",X"71",X"6F",X"92",X"8D",X"83",X"6E",X"73", + X"95",X"8C",X"6E",X"74",X"9A",X"7E",X"82",X"69",X"7E",X"9F",X"62",X"88",X"91",X"64",X"8F",X"8F", + X"65",X"7E",X"96",X"83",X"63",X"8D",X"90",X"7F",X"7D",X"67",X"98",X"85",X"7E",X"66",X"92",X"8B", + X"7C",X"6C",X"7C",X"9B",X"7C",X"69",X"94",X"86",X"7F",X"72",X"6F",X"8F",X"91",X"78",X"68",X"97", + X"89",X"7B",X"67",X"97",X"86",X"80",X"74",X"6C",X"94",X"8C",X"7E",X"82",X"6B",X"7C",X"9F",X"67", + X"82",X"96",X"6A",X"77",X"9A",X"7E",X"83",X"78",X"69",X"98",X"86",X"81",X"74",X"6D",X"8C",X"91", + X"81",X"7A",X"69",X"99",X"80",X"65",X"90",X"8F",X"7D",X"66",X"96",X"87",X"7F",X"67",X"8D",X"8F", + X"61",X"98",X"7F",X"67",X"8E",X"90",X"7D",X"82",X"69",X"7D",X"96",X"86",X"6A",X"7D",X"9D",X"6F", + X"76",X"99",X"6E",X"71",X"99",X"83",X"83",X"71",X"71",X"8F",X"91",X"71",X"72",X"9A",X"7D",X"84", + X"6A",X"7A",X"8C",X"94",X"6B",X"7D",X"94",X"7F",X"6D",X"79",X"97",X"84",X"67",X"85",X"93",X"81", + X"73",X"74",X"9B",X"7A",X"84",X"68",X"80",X"97",X"7E",X"83",X"69",X"82",X"99",X"69",X"82",X"97", + X"65",X"87",X"91",X"63",X"93",X"86",X"7F",X"76",X"6C",X"94",X"89",X"82",X"6D",X"78",X"96",X"86", + X"69",X"80",X"97",X"79",X"6D",X"97",X"7D",X"6A",X"9A",X"76",X"6D",X"98",X"83",X"81",X"7D",X"6C", + X"80",X"93",X"87",X"65",X"96",X"83",X"81",X"78",X"6B",X"99",X"82",X"82",X"73",X"70",X"91",X"8D", + X"7C",X"84",X"69",X"80",X"97",X"7B",X"85",X"6C",X"79",X"92",X"8B",X"73",X"71",X"9B",X"75",X"6E", + X"91",X"8E",X"70",X"73",X"97",X"84",X"6B",X"80",X"98",X"77",X"70",X"95",X"7F",X"67",X"93",X"89", + X"7F",X"7E",X"6B",X"83",X"95",X"7F",X"82",X"78",X"6C",X"98",X"83",X"81",X"79",X"6B",X"96",X"84", + X"67",X"95",X"84",X"68",X"8E",X"8F",X"71",X"72",X"8F",X"8F",X"6B",X"80",X"93",X"7A",X"6B",X"91", + X"87",X"65",X"90",X"8D",X"74",X"6E",X"93",X"89",X"7D",X"82",X"6B",X"7E",X"93",X"87",X"6B",X"7F", + X"97",X"7A",X"86",X"6B",X"7E",X"95",X"7D",X"83",X"71",X"74",X"93",X"88",X"7F",X"7E",X"69",X"96", + X"83",X"81",X"79",X"6C",X"8B",X"90",X"7D",X"83",X"77",X"6E",X"8A",X"92",X"77",X"71",X"98",X"78", + X"6F",X"9B",X"6E",X"7D",X"94",X"7A",X"83",X"65",X"93",X"88",X"81",X"78",X"6F",X"86",X"96",X"71", + X"79",X"94",X"7D",X"80",X"6C",X"7E",X"91",X"87",X"7E",X"80",X"6B",X"80",X"8F",X"8B",X"6B",X"7D", + X"95",X"7D",X"83",X"72",X"73",X"92",X"88",X"80",X"6E",X"7C",X"95",X"80",X"6D",X"7F",X"95",X"7D", + X"83",X"77",X"6E",X"92",X"88",X"7F",X"6F",X"7A",X"96",X"7F",X"6E",X"80",X"99",X"6B",X"7F",X"90", + X"80",X"75",X"72",X"94",X"87",X"75",X"72",X"99",X"78",X"6F",X"8C",X"8F",X"6C",X"7C",X"92",X"80", + X"78",X"6E",X"90",X"8C",X"72",X"73",X"96",X"81",X"81",X"6D",X"7F",X"95",X"7D",X"83",X"7B",X"6E", + X"83",X"93",X"7E",X"83",X"6A",X"88",X"90",X"66",X"8C",X"8D",X"69",X"86",X"92",X"7B",X"85",X"70", + X"76",X"8D",X"8E",X"70",X"78",X"96",X"7C",X"85",X"6F",X"79",X"98",X"74",X"71",X"90",X"89",X"7C", + X"83",X"6B",X"83",X"91",X"80",X"80",X"70",X"79",X"90",X"88",X"7E",X"81",X"6E",X"7D",X"98",X"71", + X"7B",X"93",X"7A",X"85",X"6B",X"80",X"92",X"81",X"80",X"71",X"79",X"99",X"74",X"78",X"93",X"7C", + X"83",X"70",X"78",X"8D",X"8B",X"7E",X"80",X"6C",X"82",X"90",X"84",X"6A",X"8B",X"8C",X"7D",X"81", + X"6B",X"8B",X"8F",X"6D",X"82",X"92",X"6C",X"7F",X"94",X"72",X"74",X"91",X"86",X"6D",X"82",X"93", + X"69",X"82",X"91",X"80",X"6E",X"81",X"94",X"77",X"73",X"93",X"7C",X"6F",X"97",X"78",X"71",X"8B", + X"8F",X"6C",X"82",X"8E",X"7D",X"81",X"6F",X"7C",X"8F",X"87",X"7E",X"80",X"6E",X"7E",X"8E",X"8A", + X"70",X"78",X"95",X"7D",X"84",X"78",X"71",X"87",X"91",X"79",X"70",X"91",X"85",X"7C",X"6F",X"8B", + X"8C",X"67",X"90",X"82",X"6F",X"91",X"84",X"76",X"72",X"8D",X"8D",X"70",X"7D",X"93",X"6F",X"7D", + X"95",X"68",X"88",X"8B",X"80",X"78",X"73",X"96",X"7D",X"84",X"73",X"75",X"93",X"83",X"81",X"77", + X"72",X"8E",X"8A",X"7E",X"80",X"6D",X"8C",X"8C",X"6A",X"83",X"8F",X"81",X"6D",X"85",X"8F",X"7E", + X"6D",X"88",X"8D",X"7F",X"6F",X"82",X"91",X"7D",X"6F",X"85",X"8F",X"7D",X"7D",X"6D",X"90",X"88", + X"7C",X"6E",X"94",X"80",X"70",X"8E",X"87",X"76",X"74",X"92",X"81",X"7D",X"6D",X"8F",X"87",X"7F", + X"71",X"7C",X"92",X"81",X"73",X"7A",X"95",X"7C",X"84",X"7B",X"6F",X"8D",X"8A",X"7B",X"71",X"82", + X"92",X"79",X"73",X"91",X"7E",X"6D",X"8D",X"89",X"7D",X"83",X"6D",X"84",X"8F",X"7D",X"83",X"70", + X"7B",X"8B",X"8B",X"7B",X"85",X"71",X"7A",X"93",X"7E",X"82",X"75",X"75",X"89",X"8D",X"7D",X"6D", + X"90",X"85",X"81",X"79",X"71",X"8D",X"8A",X"79",X"72",X"91",X"83",X"7D",X"6F",X"86",X"8E",X"7D", + X"70",X"85",X"90",X"7A",X"86",X"74",X"76",X"91",X"82",X"81",X"79",X"72",X"87",X"8D",X"80",X"6D", + X"86",X"8E",X"7E",X"82",X"76",X"74",X"89",X"8B",X"82",X"72",X"7F",X"94",X"6F",X"80",X"8D",X"7E", + X"73",X"7B",X"92",X"7F",X"71",X"8A",X"89",X"6A",X"89",X"8B",X"81",X"71",X"7F",X"91",X"7C",X"84", + X"79",X"72",X"8D",X"89",X"6C",X"8C",X"86",X"7F",X"7C",X"71",X"83",X"8D",X"83",X"7E",X"81",X"6E", + X"83",X"8D",X"85",X"71",X"7C",X"91",X"7E",X"82",X"7D",X"70",X"88",X"8D",X"7D",X"83",X"6E",X"84", + X"8F",X"7C",X"83",X"70",X"7E",X"90",X"7F",X"82",X"76",X"76",X"93",X"7E",X"83",X"7A",X"72",X"8D", + X"89",X"76",X"75",X"92",X"7F",X"83",X"76",X"76",X"92",X"7F",X"6F",X"8A",X"8A",X"7D",X"72",X"83", + X"90",X"79",X"75",X"8A",X"87",X"6B",X"89",X"89",X"7F",X"7F",X"71",X"81",X"93",X"70",X"7E",X"8E", + X"80",X"79",X"73",X"8E",X"88",X"79",X"72",X"8E",X"86",X"7B",X"72",X"8E",X"85",X"6E",X"8E",X"84", + X"6F",X"85",X"8E",X"78",X"74",X"91",X"7C",X"71",X"94",X"7A",X"73",X"8A",X"8C",X"76",X"76",X"8F", + X"84",X"7D",X"83",X"6E",X"86",X"8B",X"81",X"71",X"83",X"8D",X"7E",X"78",X"75",X"92",X"81",X"81", + X"7D",X"72",X"82",X"8E",X"80",X"80",X"7E",X"70",X"85",X"8C",X"83",X"70",X"80",X"8E",X"7F",X"72", + X"81",X"90",X"7A",X"86",X"72",X"7D",X"90",X"77",X"74",X"8C",X"88",X"7D",X"83",X"75",X"78",X"8C", + X"88",X"7D",X"83",X"74",X"79",X"8F",X"83",X"6F",X"87",X"8C",X"79",X"73",X"8A",X"89",X"7D",X"83", + X"76",X"76",X"8C",X"87",X"7F",X"7D",X"70",X"8C",X"87",X"80",X"71",X"84",X"8D",X"7C",X"73",X"8C", + X"83",X"6E",X"89",X"8A",X"7C",X"73",X"90",X"7E",X"83",X"70",X"84",X"8C",X"7E",X"78",X"78",X"93", + X"7A",X"73",X"8A",X"89",X"7C",X"84",X"77",X"76",X"90",X"81",X"81",X"7A",X"73",X"8B",X"89",X"71", + X"7E",X"8F",X"7E",X"71",X"8B",X"86",X"7F",X"7E",X"70",X"8D",X"87",X"72",X"7D",X"8E",X"82",X"73", + X"7E",X"8F",X"7F",X"82",X"7D",X"72",X"88",X"8C",X"6F",X"86",X"89",X"7D",X"81",X"70",X"83",X"8C", + X"82",X"70",X"83",X"8C",X"81",X"72",X"80",X"8E",X"7D",X"83",X"7A",X"74",X"86",X"8C",X"7C",X"72", + X"87",X"8B",X"7D",X"83",X"78",X"76",X"8F",X"82",X"71",X"8D",X"82",X"80",X"7E",X"72",X"83",X"8D", + X"7E",X"83",X"74",X"7E",X"8F",X"7B",X"85",X"74",X"7B",X"8F",X"7F",X"81",X"7B",X"73",X"87",X"8A", + X"80",X"72",X"8B",X"84",X"7E",X"80",X"70",X"8B",X"87",X"7E",X"82",X"73",X"7D",X"8C",X"86",X"77", + X"79",X"91",X"79",X"77",X"90",X"7A",X"77",X"90",X"79",X"75",X"8B",X"87",X"77",X"79",X"91",X"74", + X"7D",X"8C",X"7F",X"72",X"85",X"8B",X"7D",X"72",X"87",X"89",X"7F",X"7B",X"74",X"8D",X"86",X"76", + X"7A",X"91",X"74",X"7A",X"8B",X"86",X"78",X"77",X"8E",X"82",X"7F",X"81",X"73",X"7E",X"8C",X"84", + X"76",X"7B",X"91",X"77",X"77",X"8A",X"87",X"76",X"79",X"8B",X"86",X"75",X"7B",X"8B",X"85",X"72", + X"83",X"89",X"7E",X"7E",X"73",X"8F",X"80",X"73",X"83",X"8D",X"7D",X"84",X"73",X"7E",X"8B",X"84", + X"74",X"7D",X"8C",X"82",X"74",X"7F",X"8D",X"80",X"7B",X"74",X"8D",X"84",X"79",X"76",X"8F",X"80", + X"82",X"72",X"85",X"8A",X"7C",X"82",X"71",X"85",X"8A",X"7F",X"81",X"76",X"7B",X"8F",X"7F",X"83", + X"75",X"7B",X"89",X"89",X"73",X"81",X"8B",X"7C",X"84",X"74",X"7D",X"8C",X"81",X"71",X"89",X"87", + X"80",X"72",X"88",X"87",X"7F",X"75",X"82",X"8C",X"7B",X"84",X"73",X"7F",X"8E",X"7A",X"76",X"8D", + X"81",X"7E",X"74",X"8C",X"84",X"71",X"85",X"8A",X"7E",X"74",X"86",X"8A",X"7B",X"75",X"8A",X"85", + X"71",X"8B",X"83",X"73",X"89",X"85",X"7B",X"75",X"87",X"8A",X"79",X"76",X"8C",X"83",X"7F",X"80", + X"73",X"81",X"89",X"86",X"73",X"7D",X"8B",X"84",X"7A",X"76",X"8C",X"83",X"7F",X"75",X"81",X"8D", + X"7D",X"84",X"77",X"7A",X"8E",X"7B",X"75",X"8D",X"80",X"81",X"7B",X"75",X"8C",X"84",X"7F",X"73", + X"87",X"88",X"7D",X"82",X"75",X"7D",X"8D",X"7F",X"74",X"8D",X"7E",X"75",X"8D",X"7E",X"74",X"88", + X"88",X"7A",X"78",X"8D",X"7C",X"75",X"87",X"89",X"7A",X"76",X"88",X"89",X"77",X"7A",X"8E",X"7C", + X"74",X"8A",X"85",X"7E",X"82",X"76",X"7B",X"89",X"87",X"72",X"88",X"85",X"7E",X"81",X"74",X"7F", + X"88",X"87",X"75",X"7E",X"8E",X"77",X"79",X"8A",X"85",X"77",X"7A",X"8B",X"83",X"76",X"7F",X"8C", + X"73",X"7E",X"8B",X"82",X"75",X"7E",X"8C",X"7F",X"77",X"7C",X"8D",X"80",X"75",X"86",X"87",X"73", + X"7F",X"8B",X"80",X"7F",X"74",X"89",X"85",X"72",X"89",X"85",X"73",X"88",X"85",X"7D",X"82",X"71", + X"8A",X"84",X"83",X"74",X"82",X"89",X"81",X"78",X"7D",X"8C",X"7F",X"7C",X"76",X"8A",X"86",X"7B", + X"77",X"8C",X"81",X"80",X"7E",X"74",X"86",X"88",X"82",X"7A",X"78",X"8B",X"83",X"7E",X"82",X"77", + X"7B",X"88",X"87",X"7A",X"77",X"86",X"89",X"78",X"7A",X"8C",X"7F",X"81",X"79",X"78",X"87",X"87", + X"81",X"76",X"80",X"8D",X"74",X"81",X"89",X"7D",X"83",X"76",X"7D",X"8B",X"81",X"73",X"87",X"88", + X"7D",X"76",X"8D",X"7D",X"77",X"8A",X"82",X"7A",X"78",X"89",X"86",X"76",X"7C",X"8B",X"81",X"7D", + X"75",X"8B",X"82",X"74",X"8A",X"82",X"74",X"8B",X"81",X"80",X"7E",X"75",X"85",X"8A",X"77",X"7B", + X"8A",X"83",X"77",X"7C",X"8B",X"81",X"77",X"7D",X"8D",X"7D",X"83",X"7A",X"78",X"89",X"86",X"7D", + X"83",X"79",X"79",X"8A",X"84",X"75",X"80",X"8A",X"80",X"7B",X"78",X"8E",X"7C",X"78",X"8B",X"7F", + X"81",X"7C",X"76",X"86",X"87",X"80",X"74",X"85",X"88",X"7B",X"76",X"8C",X"81",X"82",X"78",X"7C", + X"8A",X"80",X"7B",X"78",X"8C",X"80",X"7E",X"75",X"87",X"87",X"7D",X"76",X"86",X"88",X"7B",X"77", + X"87",X"87",X"79",X"7A",X"8C",X"7B",X"78",X"8C",X"80",X"81",X"7D",X"76",X"85",X"88",X"80",X"7E", + X"76",X"86",X"88",X"7D",X"76",X"84",X"89",X"7B",X"79",X"89",X"81",X"80",X"7B",X"77",X"89",X"84", + X"80",X"7F",X"75",X"88",X"84",X"7F",X"77",X"7F",X"8B",X"80",X"78",X"7E",X"8C",X"7B",X"79",X"88", + X"83",X"77",X"7F",X"8C",X"76",X"7F",X"89",X"7F",X"78",X"7C",X"8B",X"81",X"76",X"83",X"8A",X"74", + X"83",X"88",X"75",X"82",X"89",X"74",X"81",X"89",X"7D",X"83",X"77",X"7C",X"8C",X"7E",X"76",X"88", + X"86",X"7E",X"83",X"7A",X"79",X"83",X"89",X"7F",X"76",X"88",X"85",X"74",X"84",X"89",X"75",X"82", + X"88",X"7D",X"83",X"75",X"80",X"88",X"82",X"7A",X"7B",X"8B",X"7E",X"82",X"7B",X"78",X"88",X"86", + X"76",X"83",X"88",X"74",X"83",X"88",X"7E",X"76",X"85",X"87",X"7E",X"82",X"7C",X"78",X"83",X"87", + X"83",X"76",X"80",X"89",X"80",X"77",X"81",X"8A",X"7E",X"81",X"7E",X"77",X"81",X"89",X"81",X"78", + X"7C",X"8B",X"80",X"82",X"74",X"86",X"85",X"80",X"77",X"82",X"88",X"7F",X"7A",X"7B",X"8C",X"7E", + X"82",X"7B",X"78",X"87",X"86",X"7E",X"82",X"76",X"81",X"8A",X"7A",X"79",X"87",X"86",X"7A",X"79", + X"89",X"83",X"7F",X"81",X"76",X"83",X"89",X"78",X"7C",X"89",X"82",X"78",X"7C",X"8B",X"7F",X"81", + X"7C",X"77",X"87",X"85",X"7E",X"81",X"77",X"7E",X"8A",X"80",X"81",X"7F",X"77",X"81",X"89",X"80", + X"80",X"7F",X"76",X"84",X"88",X"7E",X"82",X"79",X"7B",X"87",X"86",X"7C",X"79",X"88",X"83",X"76", + X"81",X"88",X"80",X"77",X"81",X"89",X"7D",X"78",X"86",X"84",X"76",X"81",X"88",X"80",X"77",X"85", + X"86",X"76",X"7E",X"89",X"81",X"78",X"7F",X"8A",X"7E",X"78",X"89",X"81",X"80",X"7E",X"77",X"82", + X"87",X"82",X"7F",X"81",X"78",X"7D",X"88",X"83",X"7F",X"77",X"86",X"85",X"7E",X"82",X"76",X"80", + X"88",X"82",X"7E",X"77",X"86",X"85",X"7F",X"77",X"86",X"85",X"7F",X"78",X"81",X"8A",X"75",X"83", + X"87",X"77",X"7F",X"8A",X"79",X"7B",X"88",X"84",X"76",X"84",X"85",X"7E",X"78",X"82",X"88",X"7F", + X"78",X"84",X"87",X"76",X"7F",X"88",X"82",X"7E",X"82",X"77",X"7F",X"89",X"7E",X"82",X"7B",X"7A", + X"87",X"85",X"76",X"81",X"88",X"80",X"77",X"81",X"88",X"7E",X"82",X"7E",X"78",X"82",X"87",X"81", + X"77",X"80",X"88",X"7F",X"78",X"81",X"89",X"7E",X"82",X"7E",X"78",X"82",X"88",X"81",X"78",X"7F", + X"89",X"7E",X"82",X"7E",X"78",X"83",X"88",X"7A",X"7B",X"88",X"81",X"7E",X"77",X"87",X"84",X"7F", + X"78",X"82",X"89",X"75",X"84",X"85",X"7F",X"81",X"78",X"7E",X"8A",X"7E",X"79",X"89",X"80",X"81", + X"7D",X"78",X"85",X"86",X"81",X"76",X"86",X"84",X"80",X"79",X"7E",X"88",X"81",X"79",X"7D",X"8A", + X"7E",X"82",X"7E",X"7A",X"7D",X"88",X"82",X"81",X"79",X"7F",X"8A",X"79",X"7B",X"88",X"82",X"7F", + X"7F",X"77",X"85",X"86",X"7F",X"78",X"82",X"88",X"7F",X"82",X"7B",X"7A",X"86",X"85",X"7F",X"81", + X"77",X"82",X"87",X"80",X"78",X"83",X"86",X"7D",X"83",X"77",X"81",X"88",X"7F",X"82",X"7B",X"7A", + X"88",X"83",X"77",X"83",X"87",X"78",X"7E",X"88",X"80",X"80",X"7F",X"79",X"7D",X"87",X"83",X"80", + X"77",X"83",X"85",X"7F",X"7A",X"7C",X"89",X"81",X"7A",X"7D",X"8A",X"7A",X"7B",X"86",X"84",X"7A", + X"7C",X"89",X"7F",X"82",X"7C",X"7A",X"88",X"81",X"77",X"85",X"86",X"77",X"84",X"85",X"77",X"81", + X"88",X"78",X"7D",X"87",X"82",X"78",X"81",X"87",X"7A",X"7C",X"89",X"7D",X"79",X"87",X"83",X"7A", + X"7C",X"88",X"82",X"7A",X"7D",X"88",X"80",X"78",X"86",X"83",X"76",X"84",X"86",X"7E",X"78",X"86", + X"83",X"7E",X"81",X"77",X"81",X"86",X"83",X"79",X"7E",X"88",X"7F",X"81",X"7D",X"79",X"86",X"84", + X"7E",X"82",X"77",X"81",X"86",X"82",X"78",X"82",X"86",X"80",X"7D",X"7A",X"89",X"80",X"7F",X"78", + X"88",X"81",X"78",X"87",X"81",X"7F",X"81",X"78",X"82",X"88",X"79",X"7F",X"88",X"7B",X"7B",X"85", + X"85",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"79",X"84",X"85",X"80",X"80",X"78",X"86",X"84",X"77", + X"81",X"87",X"7E",X"82",X"7A",X"7D",X"89",X"7E",X"82",X"7D",X"7A",X"82",X"87",X"7F",X"81",X"7F", + X"79",X"83",X"87",X"7A",X"7C",X"87",X"81",X"7E",X"79",X"85",X"85",X"7E",X"79",X"84",X"86",X"79", + X"7E",X"88",X"7B",X"7B",X"86",X"83",X"7F",X"82",X"79",X"7E",X"87",X"81",X"7D",X"79",X"86",X"84", + X"7F",X"79",X"84",X"85",X"77",X"85",X"84",X"7F",X"81",X"7A",X"7D",X"86",X"83",X"7E",X"82",X"7B", + X"7C",X"87",X"81",X"78",X"81",X"86",X"7F",X"79",X"82",X"86",X"7E",X"79",X"81",X"87",X"7E",X"79", + X"87",X"82",X"7F",X"80",X"78",X"84",X"85",X"7C",X"7B",X"87",X"81",X"80",X"78",X"86",X"83",X"80", + X"7B",X"7C",X"88",X"81",X"7C",X"7C",X"89",X"7B",X"7B",X"85",X"84",X"7B",X"7B",X"85",X"84",X"7C", + X"7A",X"86",X"84",X"7C",X"7B",X"87",X"82",X"7F",X"79",X"85",X"84",X"78",X"84",X"84",X"7A",X"7E", + X"87",X"81",X"7A",X"81",X"86",X"7A",X"7C",X"87",X"81",X"7F",X"81",X"7A",X"7F",X"88",X"7E",X"7A", + X"85",X"83",X"7A",X"7E",X"88",X"7B",X"7D",X"88",X"7D",X"7B",X"87",X"80",X"79",X"84",X"84",X"7E", + X"82",X"79",X"7F",X"87",X"80",X"80",X"79",X"83",X"86",X"7F",X"79",X"83",X"85",X"78",X"80",X"87", + X"7F",X"81",X"7A",X"7F",X"88",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"7A",X"84",X"85",X"7F",X"79", + X"81",X"87",X"7E",X"82",X"7B",X"7E",X"87",X"7E",X"79",X"84",X"85",X"7E",X"82",X"7C",X"7B",X"84", + X"86",X"78",X"83",X"84",X"80",X"7A",X"7E",X"86",X"82",X"7A",X"7E",X"87",X"81",X"7A",X"7F",X"87", + X"80",X"7E",X"79",X"86",X"83",X"7F",X"81",X"79",X"81",X"86",X"7E",X"82",X"7B",X"7D",X"87",X"80", + X"81",X"7F",X"7A",X"81",X"87",X"7C",X"7B",X"86",X"82",X"7C",X"7B",X"86",X"83",X"7D",X"7A",X"88", + X"7E",X"7B",X"85",X"82",X"7B",X"7D",X"87",X"80",X"7E",X"7A",X"85",X"84",X"7E",X"7A",X"85",X"84", + X"7E",X"7A",X"84",X"84",X"7E",X"82",X"79",X"80",X"86",X"7E",X"7A",X"85",X"83",X"7F",X"80",X"79", + X"85",X"84",X"79",X"82",X"86",X"79",X"81",X"86",X"7B",X"7D",X"87",X"7F",X"79",X"86",X"81",X"79", + X"85",X"83",X"79",X"82",X"85",X"78",X"82",X"85",X"7F",X"81",X"7B",X"7D",X"87",X"80",X"80",X"7F", + X"7A",X"83",X"86",X"7B",X"7D",X"86",X"81",X"7B",X"7D",X"86",X"82",X"7C",X"7D",X"88",X"7D",X"7B", + X"83",X"85",X"7E",X"7A",X"83",X"85",X"7C",X"7C",X"86",X"80",X"7F",X"7A",X"85",X"83",X"79",X"85", + X"83",X"7A",X"81",X"86",X"79",X"80",X"85",X"81",X"7E",X"7B",X"87",X"80",X"81",X"7E",X"7B",X"83", + X"86",X"79",X"81",X"84",X"80",X"7B",X"80",X"86",X"7F",X"7D",X"7D",X"88",X"7E",X"82",X"7C",X"7C", + X"85",X"83",X"79",X"81",X"86",X"7F",X"7A",X"82",X"86",X"79",X"80",X"85",X"81",X"7A",X"7F",X"86", + X"81",X"7B",X"7E",X"87",X"7F",X"80",X"80",X"7B",X"80",X"87",X"7E",X"7A",X"85",X"83",X"7F",X"7A", + X"84",X"84",X"7F",X"7C",X"7E",X"87",X"7E",X"82",X"7D",X"7B",X"85",X"81",X"7F",X"7A",X"85",X"82", + X"7F",X"7B",X"80",X"86",X"80",X"7B",X"80",X"86",X"7F",X"80",X"80",X"7A",X"81",X"85",X"7F",X"7A", + X"82",X"85",X"80",X"7B",X"81",X"86",X"7C",X"7C",X"86",X"81",X"81",X"7C",X"7E",X"86",X"7F",X"80", + X"79",X"84",X"84",X"7F",X"80",X"7F",X"7A",X"83",X"84",X"7F",X"81",X"7B",X"7E",X"83",X"85",X"7D", + X"7C",X"86",X"81",X"7A",X"81",X"85",X"7F",X"7B",X"84",X"82",X"7F",X"81",X"7A",X"80",X"85",X"81", + X"7F",X"81",X"7D",X"7C",X"84",X"84",X"7F",X"7A",X"82",X"85",X"7F",X"81",X"7F",X"7A",X"84",X"83", + X"7F",X"80",X"7A",X"81",X"85",X"80",X"80",X"7D",X"7C",X"86",X"81",X"80",X"80",X"7A",X"85",X"82", + X"7F",X"81",X"7B",X"7E",X"85",X"82",X"7F",X"81",X"7B",X"7F",X"84",X"83",X"7C",X"7D",X"85",X"82", + X"7C",X"7E",X"86",X"7D",X"7C",X"85",X"82",X"7F",X"81",X"7E",X"7B",X"84",X"83",X"81",X"7C",X"7D", + X"87",X"7C",X"7E",X"86",X"7F",X"7B",X"86",X"80",X"81",X"7C",X"7E",X"86",X"7F",X"7B",X"83",X"84", + X"7F",X"80",X"7A",X"81",X"85",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"7E",X"7C",X"87",X"7E",X"7C", + X"85",X"80",X"7B",X"84",X"82",X"79",X"82",X"84",X"81",X"7A",X"81",X"85",X"80",X"7F",X"7B",X"86", + X"81",X"7A",X"83",X"84",X"7F",X"81",X"7F",X"7B",X"82",X"85",X"7B",X"7D",X"85",X"81",X"7F",X"81", + X"7D",X"7C",X"85",X"82",X"80",X"7A",X"83",X"83",X"80",X"7D",X"7D",X"86",X"80",X"7F",X"7B",X"84", + X"83",X"7F",X"81",X"7E",X"7C",X"83",X"84",X"7B",X"81",X"85",X"7C",X"7E",X"86",X"7C",X"7D",X"84", + X"84",X"7C",X"7E",X"85",X"80",X"7C",X"7D",X"85",X"81",X"7F",X"81",X"7C",X"7F",X"86",X"7F",X"81", + X"7F",X"7B",X"84",X"83",X"7C",X"7F",X"86",X"7B",X"7E",X"84",X"82",X"7D",X"7D",X"85",X"80",X"7F", + X"7B",X"86",X"80",X"80",X"7F",X"7B",X"82",X"85",X"7B",X"80",X"84",X"80",X"7D",X"7D",X"85",X"82", + X"7D",X"7D",X"85",X"81",X"7D",X"7D",X"84",X"82",X"7D",X"7E",X"86",X"7D",X"7C",X"84",X"82",X"7B", + X"80",X"85",X"7F",X"80",X"80",X"7B",X"81",X"85",X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"7B", + X"81",X"84",X"7F",X"7B",X"83",X"83",X"7F",X"81",X"7B",X"80",X"83",X"83",X"7D",X"7C",X"85",X"81", + X"7F",X"81",X"7D",X"7D",X"83",X"83",X"80",X"7B",X"83",X"83",X"80",X"7B",X"81",X"84",X"80",X"7C", + X"80",X"85",X"7B",X"7E",X"84",X"82",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"80",X"7B",X"83",X"84", + X"7A",X"83",X"82",X"80",X"7C",X"81",X"85",X"7B",X"7F",X"84",X"80",X"7F",X"81",X"7C",X"7F",X"85", + X"7E",X"7C",X"83",X"84",X"7F",X"81",X"7B",X"80",X"84",X"7F",X"81",X"7D",X"7C",X"83",X"83",X"80", + X"7B",X"80",X"84",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F",X"7C",X"81",X"85",X"7B",X"7F",X"85", + X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"80",X"80",X"7B",X"82",X"83",X"7F",X"81",X"7D",X"7D", + X"85",X"80",X"80",X"80",X"7C",X"80",X"85",X"80",X"80",X"7F",X"7C",X"85",X"81",X"7B",X"82",X"83", + X"7A",X"82",X"83",X"7F",X"81",X"7B",X"80",X"85",X"7F",X"7C",X"84",X"82",X"7B",X"80",X"84",X"81", + X"7C",X"7F",X"85",X"7F",X"82",X"7D",X"7E",X"85",X"80",X"7B",X"82",X"83",X"7F",X"80",X"7B",X"85", + X"81",X"7B",X"81",X"84",X"80",X"7C",X"83",X"82",X"7B",X"80",X"84",X"80",X"81",X"7C",X"81",X"85", + X"7B",X"7F",X"85",X"7D",X"7D",X"84",X"81",X"80",X"81",X"7E",X"7C",X"83",X"83",X"7F",X"7C",X"81", + X"84",X"7F",X"81",X"7C",X"7F",X"85",X"7F",X"7C",X"82",X"83",X"7E",X"7C",X"82",X"84",X"7F",X"81", + X"7F",X"7C",X"81",X"84",X"80",X"80",X"81",X"7C",X"80",X"85",X"7F",X"7C",X"84",X"80",X"81",X"7C", + X"7F",X"84",X"81",X"7E",X"7D",X"84",X"82",X"7D",X"7D",X"84",X"81",X"7E",X"7C",X"84",X"81",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"7C",X"82",X"83",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F", + X"7C",X"80",X"83",X"82",X"7D",X"7E",X"84",X"81",X"7F",X"81",X"7C",X"80",X"84",X"81",X"7D",X"7E", + X"84",X"80",X"7F",X"7C",X"83",X"83",X"7E",X"7D",X"84",X"81",X"7B",X"82",X"83",X"7F",X"7C",X"81", + X"83",X"80",X"7C",X"81",X"84",X"7F",X"80",X"80",X"7C",X"81",X"84",X"7D",X"7D",X"83",X"82",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"80",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"84",X"81", + X"7F",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"85",X"80",X"80",X"7F",X"7C",X"83",X"82",X"7C", + X"81",X"84",X"7C",X"80",X"84",X"7D",X"7E",X"85",X"7F",X"7C",X"83",X"82",X"7F",X"81",X"7C",X"81", + X"84",X"80",X"80",X"80",X"7D",X"7F",X"83",X"82",X"7C",X"81",X"83",X"7F",X"81",X"7C",X"7F",X"83", + X"81",X"7F",X"81",X"7D",X"7E",X"85",X"80",X"80",X"7F",X"7C",X"82",X"83",X"7D",X"7E",X"83",X"82", + X"7E",X"7D",X"84",X"81",X"80",X"80",X"7C",X"81",X"84",X"80",X"81",X"7E",X"7D",X"84",X"82",X"7C", + X"82",X"83",X"7C",X"7F",X"84",X"80",X"80",X"81",X"7D",X"7E",X"83",X"82",X"80",X"80",X"7C",X"82", + X"83",X"7C",X"80",X"84",X"7D",X"7D",X"84",X"80",X"81",X"7C",X"82",X"83",X"7F",X"7E",X"7E",X"84", + X"80",X"80",X"80",X"7D",X"7E",X"85",X"80",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7F",X"7C",X"82", + X"83",X"7B",X"80",X"83",X"80",X"7D",X"7E",X"84",X"80",X"80",X"80",X"7D",X"7F",X"84",X"7F",X"7C", + X"84",X"81",X"80",X"7C",X"83",X"82",X"7C",X"82",X"82",X"7C",X"80",X"84",X"7D",X"7E",X"84",X"80", + X"80",X"80",X"7C",X"83",X"82",X"80",X"7E",X"7E",X"85",X"7E",X"7D",X"82",X"83",X"7E",X"7D",X"83", + X"80",X"7C",X"83",X"81",X"7C",X"83",X"81",X"80",X"80",X"7C",X"7F",X"82",X"82",X"7E",X"7D",X"83", + X"82",X"7E",X"7D",X"83",X"82",X"7E",X"7E",X"84",X"7F",X"7C",X"84",X"80",X"7C",X"83",X"81",X"7F", + X"80",X"7C",X"81",X"83",X"80",X"7F",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7B",X"82",X"82",X"7F", + X"80",X"7C",X"82",X"82",X"80",X"7D",X"82",X"83",X"7B",X"82",X"82",X"80",X"7D",X"80",X"83",X"80", + X"7D",X"80",X"84",X"7F",X"81",X"7F",X"7D",X"82",X"83",X"80",X"7C",X"81",X"83",X"7F",X"7D",X"81", + X"84",X"7D",X"7F",X"84",X"7F",X"7D",X"84",X"80",X"81",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7E", + X"82",X"83",X"7F",X"81",X"7D",X"7F",X"83",X"81",X"7D",X"7F",X"84",X"80",X"7C",X"83",X"81",X"7C", + X"82",X"82",X"7C",X"80",X"83",X"80",X"80",X"80",X"7D",X"7E",X"83",X"81",X"80",X"80",X"7F",X"7D", + X"82",X"83",X"80",X"80",X"80",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7D",X"82",X"82",X"80",X"7E", + X"7D",X"84",X"81",X"80",X"80",X"7D",X"80",X"84",X"7E",X"7E",X"83",X"81",X"7F",X"7D",X"82",X"82", + X"7E",X"7E",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"7D",X"82",X"83",X"7F",X"7D",X"83",X"81",X"7C", + X"82",X"81",X"7F",X"81",X"7D",X"80",X"83",X"7F",X"7D",X"83",X"81",X"7F",X"81",X"7C",X"81",X"83", + X"7F",X"80",X"7F",X"7D",X"82",X"82",X"80",X"7D",X"80",X"83",X"80",X"7D",X"82",X"82",X"7F",X"81", + X"7D",X"7F",X"82",X"82",X"7D",X"81",X"83",X"7F",X"81",X"7D",X"7E",X"84",X"7F",X"7D",X"83",X"80", + X"7D",X"83",X"81",X"80",X"7E",X"7E",X"84",X"7E",X"7E",X"82",X"81",X"7D",X"80",X"83",X"81",X"7E", + X"7E",X"83",X"81",X"7D",X"80",X"83",X"7E",X"7E",X"83",X"81",X"80",X"80",X"7C",X"82",X"82",X"7E", + X"7E",X"83",X"81",X"7E",X"7E",X"83",X"80",X"80",X"7F",X"7D",X"83",X"80",X"80",X"7D",X"83",X"81", + X"80",X"7D",X"80",X"83",X"7F",X"81",X"7E",X"7F",X"83",X"7F",X"7D",X"83",X"80",X"7C",X"83",X"81", + X"7D",X"82",X"82",X"7C",X"81",X"82",X"80",X"7E",X"7F",X"83",X"81",X"7E",X"7F",X"83",X"80",X"80", + X"81",X"7D",X"7F",X"83",X"81",X"7D",X"80",X"83",X"80",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"7F", + X"83",X"80",X"7D",X"83",X"80",X"7F",X"7D",X"83",X"81",X"80",X"80",X"7D",X"81",X"83",X"80",X"7D", + X"83",X"81",X"80",X"80",X"7D",X"80",X"82",X"81",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81", + X"80",X"81",X"7E",X"7E",X"82",X"82",X"7F",X"7D",X"82",X"82",X"7C",X"81",X"82",X"81",X"7D",X"81", + X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"81",X"7E",X"7E", + X"83",X"81",X"7F",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82",X"82",X"7E",X"7E",X"83", + X"80",X"80",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"7F",X"7E",X"83",X"80",X"7D",X"81",X"83", + X"7F",X"80",X"80",X"7D",X"80",X"83",X"7D",X"7F",X"83",X"80",X"81",X"7E",X"7E",X"83",X"80",X"80", + X"80",X"7D",X"80",X"82",X"82",X"7D",X"80",X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"80",X"80",X"7D",X"80",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"81",X"7F",X"7E",X"82",X"81", + X"7D",X"81",X"82",X"7F",X"81",X"7D",X"80",X"82",X"81",X"7E",X"7F",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"7D",X"81",X"82",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"7F",X"7D",X"81",X"83",X"7F", + X"7E",X"82",X"81",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"81",X"82",X"7F",X"80",X"7E",X"7E",X"82", + X"82",X"80",X"80",X"7D",X"81",X"83",X"7E",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82", + X"82",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"80",X"82",X"80",X"7E",X"80",X"83",X"80", + X"7F",X"7E",X"83",X"81",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"83",X"7F", + X"7E",X"83",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"80",X"7D",X"80",X"82", + X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"82",X"80",X"7F",X"7E",X"83",X"7F",X"7E", + X"83",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"81",X"81",X"80",X"7E",X"7F",X"83",X"80", + X"7F",X"7E",X"83",X"80",X"80",X"80",X"7F",X"7E",X"82",X"82",X"80",X"80",X"80",X"7D",X"81",X"82", + X"7D",X"80",X"83",X"7F",X"7E",X"82",X"81",X"7D",X"80",X"82",X"80",X"7D",X"81",X"81",X"80",X"7D", + X"81",X"82",X"80",X"7E",X"7F",X"83",X"80",X"80",X"80",X"7E",X"7F",X"82",X"82",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"82",X"82",X"80",X"80",X"80",X"7E",X"80",X"82", + X"81",X"7E",X"81",X"82",X"7F",X"81",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"80",X"82",X"81", + X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E",X"80",X"82",X"80", + X"80",X"80",X"7D",X"82",X"81",X"80",X"80",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"82",X"81", + X"7F",X"81",X"7E",X"7F",X"82",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"7D", + X"81",X"82",X"7D",X"80",X"82",X"80",X"7E",X"81",X"82",X"7D",X"81",X"81",X"80",X"7D",X"81",X"82", + X"7F",X"80",X"7E",X"7F",X"82",X"81",X"7F",X"81",X"7D",X"81",X"82",X"7E",X"7F",X"82",X"81",X"7E", + X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E", + X"7F",X"82",X"81",X"7E",X"81",X"82",X"7E",X"7F",X"82",X"80",X"80",X"7E",X"81",X"82",X"7F",X"80", + X"7E",X"80",X"81",X"82",X"7F",X"7E",X"82",X"81",X"7F",X"81",X"7F",X"7E",X"82",X"81",X"7E",X"80", + X"82",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E", + X"82",X"81",X"80",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"82",X"80",X"7F",X"7F",X"83",X"7E",X"7F", + X"82",X"80",X"7F",X"7E",X"82",X"81",X"7F",X"7E",X"82",X"81",X"80",X"7E",X"81",X"81",X"80",X"7E", + X"80",X"82",X"80",X"7F",X"7E",X"83",X"80",X"80",X"80",X"7E",X"81",X"82",X"80",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7E",X"7F",X"82",X"81",X"7F",X"7F",X"83",X"7E",X"7F",X"82",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GAL_HIT.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GAL_HIT.vhd new file mode 100644 index 00000000..7d2fd29c --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/GAL_HIT.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_HIT 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 prom of GAL_HIT is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"65",X"75",X"88",X"90",X"93",X"9B",X"A3",X"A3",X"A3",X"A6",X"9E",X"9B",X"9B",X"A3",X"AB",X"B6", + X"B9",X"B9",X"BE",X"B9",X"AE",X"A6",X"9E",X"98",X"88",X"78",X"68",X"65",X"65",X"65",X"62",X"68", + X"68",X"65",X"5D",X"52",X"47",X"47",X"4A",X"4D",X"4D",X"4D",X"52",X"65",X"7D",X"88",X"90",X"9B", + X"A3",X"AE",X"AE",X"AB",X"AB",X"9E",X"98",X"88",X"70",X"52",X"37",X"1F",X"17",X"1F",X"27",X"3A", + X"5A",X"68",X"78",X"83",X"93",X"A3",X"AB",X"AE",X"A3",X"93",X"88",X"88",X"83",X"88",X"8B",X"88", + X"78",X"62",X"4A",X"42",X"3A",X"42",X"4D",X"55",X"65",X"78",X"83",X"8B",X"93",X"90",X"88",X"88", + X"98",X"A6",X"A6",X"AB",X"9E",X"8B",X"7D",X"68",X"70",X"88",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC", + X"FC",X"FC",X"DC",X"9B",X"4D",X"14",X"01",X"04",X"2F",X"52",X"5D",X"68",X"78",X"80",X"78",X"70", + X"5D",X"47",X"32",X"1F",X"14",X"09",X"11",X"1C",X"32",X"52",X"83",X"B9",X"D1",X"C9",X"AB",X"8B", + X"70",X"68",X"75",X"78",X"80",X"8B",X"8B",X"98",X"AB",X"BE",X"C1",X"AB",X"83",X"5D",X"3A",X"17", + X"11",X"17",X"27",X"3A",X"65",X"90",X"AE",X"B6",X"9B",X"78",X"55",X"4A",X"4D",X"5A",X"5D",X"52", + X"4A",X"4A",X"52",X"78",X"AB",X"D4",X"FC",X"FC",X"F7",X"E9",X"E1",X"D1",X"C9",X"BE",X"AB",X"90", + X"52",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"2F",X"4A",X"52",X"47",X"47",X"62",X"70",X"7D", + X"7D",X"78",X"7D",X"90",X"B3",X"CE",X"EC",X"FC",X"FC",X"FC",X"FC",X"F4",X"E9",X"F4",X"FC",X"FC", + X"FC",X"FC",X"CE",X"98",X"65",X"2C",X"01",X"01",X"01",X"01",X"01",X"32",X"6D",X"7D",X"68",X"4A", + X"27",X"11",X"1C",X"3A",X"4D",X"62",X"68",X"65",X"68",X"70",X"80",X"9B",X"D1",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"A3",X"75",X"55",X"62",X"80",X"A3",X"BE",X"CE",X"C1",X"90",X"4A",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"88",X"C9",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC", + X"B6",X"90",X"68",X"3F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1F",X"83",X"BE",X"D1",X"CE", + X"D4",X"F4",X"FC",X"FC",X"FC",X"F7",X"D1",X"CE",X"DC",X"F7",X"FC",X"FC",X"FC",X"FC",X"D1",X"8B", + X"68",X"68",X"88",X"A6",X"C1",X"D9",X"D4",X"BE",X"A3",X"88",X"75",X"68",X"62",X"5D",X"62",X"68", + X"6D",X"78",X"75",X"55",X"2C",X"11",X"11",X"2F",X"55",X"75",X"83",X"93",X"9E",X"B9",X"E9",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"68",X"32",X"11",X"17",X"32",X"52",X"7D", + X"AE",X"E1",X"F7",X"E1",X"A3",X"62",X"17",X"01",X"01",X"01",X"01",X"01",X"1C",X"4D",X"7D",X"90", + X"9B",X"A6",X"B6",X"BE",X"A6",X"70",X"37",X"14",X"14",X"1C",X"14",X"1C",X"2F",X"3A",X"3A",X"3A", + X"4A",X"52",X"4A",X"47",X"3A",X"24",X"11",X"14",X"27",X"3A",X"65",X"9E",X"D4",X"FC",X"FC",X"F7", + X"D4",X"AB",X"93",X"93",X"93",X"83",X"68",X"4D",X"37",X"37",X"5D",X"9B",X"EC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"CE",X"AB",X"93",X"7D",X"65",X"65",X"75",X"88",X"93",X"98",X"98",X"93", + X"93",X"90",X"93",X"8B",X"90",X"90",X"90",X"8B",X"8B",X"90",X"8B",X"90",X"90",X"90",X"90",X"8B", + X"8B",X"8B",X"8B",X"8B",X"88",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"83",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"78",X"75",X"78",X"75",X"78", + X"78",X"78",X"75",X"78",X"75",X"70",X"75",X"75",X"75",X"75",X"70",X"6D",X"68",X"6D",X"70",X"6D", + X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"70",X"70",X"70",X"75",X"75",X"75",X"75", + X"75",X"70",X"62",X"4D",X"4D",X"4D",X"47",X"4A",X"68",X"98",X"B6",X"B3",X"9B",X"78",X"5A",X"3F", + X"32",X"2F",X"32",X"3F",X"5A",X"90",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"E9",X"90",X"4D",X"3A", + X"47",X"5D",X"5D",X"4D",X"3A",X"27",X"1C",X"14",X"11",X"0C",X"01",X"01",X"01",X"01",X"01",X"01", + X"04",X"4A",X"9E",X"F7",X"FC",X"FC",X"FC",X"FC",X"EC",X"E4",X"E4",X"D1",X"AB",X"80",X"62",X"47", + X"37",X"2F",X"2C",X"24",X"04",X"01",X"24",X"52",X"70",X"70",X"62",X"4D",X"3F",X"37",X"37",X"3A", + X"4D",X"62",X"78",X"93",X"AE",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"B6",X"68", + X"2C",X"01",X"01",X"01",X"01",X"01",X"01",X"09",X"47",X"65",X"68",X"68",X"62",X"5A",X"52",X"4D", + X"52",X"4D",X"52",X"52",X"5A",X"5D",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"65",X"37",X"1C", + X"09",X"09",X"1C",X"32",X"4D",X"70",X"93",X"AB",X"C9",X"D9",X"E9",X"EF",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"F7",X"6D",X"0C",X"01",X"01",X"01",X"01",X"01",X"17",X"62",X"83",X"78", + X"5A",X"37",X"14",X"04",X"01",X"01",X"01",X"01",X"04",X"11",X"1C",X"1C",X"01",X"01",X"0C",X"3F", + X"6D",X"7D",X"78",X"68",X"65",X"83",X"B3",X"E1",X"F4",X"E4",X"C6",X"A3",X"8B",X"75",X"68",X"65", + X"5D",X"62",X"65",X"62",X"5A",X"3F",X"27",X"17",X"1F",X"5A",X"9E",X"CE",X"D4",X"C9",X"AE",X"A6", + X"AE",X"AB",X"9B",X"83",X"80",X"98",X"9B",X"9B",X"9B",X"B6",X"D9",X"E4",X"E1",X"DC",X"E1",X"D4", + X"B3",X"83",X"5A",X"3A",X"1F",X"11",X"0C",X"11",X"14",X"1C",X"1F",X"2C",X"2C",X"1F",X"27",X"32", + X"3F",X"5D",X"83",X"9B",X"93",X"93",X"88",X"7D",X"7D",X"75",X"70",X"70",X"6D",X"68",X"68",X"68", + X"5A",X"5A",X"75",X"88",X"93",X"93",X"90",X"90",X"88",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"80", + X"7D",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80",X"83",X"83",X"80",X"80", + X"80",X"7D",X"7D",X"70",X"70",X"6D",X"75",X"83",X"90",X"93",X"90",X"88",X"88",X"80",X"78",X"7D", + X"70",X"68",X"70",X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"75",X"70",X"68",X"4D",X"3A", + X"4A",X"70",X"93",X"A3",X"B6",X"B9",X"B3",X"A3",X"90",X"80",X"75",X"70",X"68",X"68",X"68",X"65", + X"68",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"75",X"78", + X"78",X"78",X"78",X"78",X"78",X"78",X"70",X"55",X"37",X"1F",X"24",X"47",X"68",X"7D",X"88",X"8B", + X"88",X"88",X"88",X"8B",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"C9",X"AB",X"80",X"5A", + X"4A",X"47",X"37",X"2C",X"32",X"4D",X"70",X"78",X"7D",X"8B",X"90",X"88",X"68",X"4A",X"2C",X"1C", + X"11",X"09",X"01",X"01",X"01",X"01",X"14",X"27",X"47",X"70",X"AE",X"E1",X"F4",X"E4",X"D1",X"AE", + X"93",X"80",X"70",X"68",X"62",X"62",X"65",X"68",X"6D",X"75",X"78",X"78",X"65",X"4A",X"4D",X"5A", + X"62",X"65",X"68",X"88",X"B9",X"EC",X"FC",X"F4",X"D1",X"B6",X"B3",X"AE",X"A3",X"98",X"A3",X"C6", + X"D9",X"D4",X"D4",X"E1",X"E1",X"C9",X"9E",X"78",X"62",X"3F",X"32",X"2C",X"27",X"2C",X"32",X"37", + X"3F",X"47",X"4A",X"52",X"55",X"5A",X"5D",X"5D",X"5A",X"3F",X"27",X"14",X"11",X"14",X"24",X"4A", + X"80",X"A6",X"BE",X"C6",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC",X"BE",X"AB",X"8B", + X"5D",X"2F",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"70",X"6D",X"5D",X"4D", + X"4D",X"68",X"9B",X"BE",X"C9",X"B9",X"B3",X"AB",X"9B",X"A3",X"B3",X"C6",X"D1",X"B6",X"8B",X"52", + X"1C",X"11",X"11",X"14",X"37",X"62",X"90",X"9E",X"9B",X"83",X"75",X"5D",X"47",X"32",X"2F",X"24", + X"17",X"11",X"11",X"17",X"27",X"5D",X"A3",X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"EF",X"CE", + X"9B",X"7D",X"68",X"62",X"62",X"7D",X"98",X"9E",X"93",X"7D",X"6D",X"5D",X"55",X"52",X"52",X"52", + X"55",X"55",X"5D",X"62",X"65",X"68",X"6D",X"70",X"75",X"7D",X"78",X"7D",X"80",X"83",X"78",X"62", + X"3A",X"27",X"14",X"17",X"27",X"3F",X"5A",X"78",X"98",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70",X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32", + X"04",X"01",X"01",X"01",X"01",X"01",X"11",X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78", + X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24",X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93", + X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90",X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E", + X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E",X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B", + X"88",X"75",X"52",X"37",X"1F",X"1C",X"27",X"37",X"4D",X"68",X"83",X"AE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D1",X"9B",X"65",X"42",X"3A",X"52",X"80",X"AE",X"D4",X"E9",X"E4",X"C6", + X"80",X"3A",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"32",X"88",X"C6",X"F7",X"FC", + X"E4",X"CE",X"B9",X"A3",X"80",X"62",X"47",X"37",X"2F",X"2C",X"2F",X"37",X"3F",X"3A",X"32",X"3A", + X"37",X"32",X"37",X"3A",X"52",X"7D",X"B3",X"DC",X"E4",X"E1",X"D1",X"D1",X"E1",X"FC",X"FC",X"FC", + X"FC",X"F4",X"CE",X"A3",X"83",X"75",X"7D",X"83",X"83",X"88",X"98",X"A6",X"A6",X"98",X"88",X"75", + X"68",X"5D",X"5A",X"5A",X"5A",X"62",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"7D",X"83",X"83", + X"80",X"75",X"68",X"70",X"80",X"8B",X"93",X"98",X"98",X"90",X"90",X"8B",X"90",X"98",X"A3",X"AE", + X"B6",X"C9",X"C9",X"C1",X"B3",X"A3",X"98",X"8B",X"78",X"75",X"70",X"6D",X"65",X"68",X"70",X"80", + X"83",X"83",X"88",X"8B",X"83",X"78",X"68",X"5D",X"52",X"42",X"2C",X"27",X"2C",X"3A",X"47",X"42", + X"42",X"52",X"70",X"8B",X"A6",X"AB",X"A3",X"9E",X"9E",X"B3",X"B9",X"B9",X"BE",X"BE",X"B9",X"A3", + X"88",X"68",X"5D",X"5A",X"5A",X"52",X"52",X"68",X"70",X"65",X"62",X"62",X"68",X"7D",X"8B",X"8B", + X"83",X"75",X"65",X"68",X"75",X"80",X"9B",X"C1",X"EC",X"FC",X"FC",X"F7",X"EF",X"E9",X"D1",X"A3", + X"78",X"5D",X"42",X"2C",X"14",X"0C",X"09",X"0C",X"0C",X"17",X"2C",X"47",X"62",X"75",X"75",X"68", + X"62",X"52",X"4A",X"4A",X"42",X"3F",X"4A",X"55",X"68",X"90",X"A3",X"B9",X"C6",X"CE",X"E4",X"FC", + X"FC",X"EC",X"E9",X"E9",X"DC",X"C1",X"B3",X"A6",X"98",X"75",X"52",X"3A",X"2C",X"1C",X"11",X"01", + X"0C",X"1F",X"37",X"52",X"70",X"78",X"78",X"68",X"62",X"62",X"75",X"98",X"B6",X"BE",X"B3",X"AB", + X"A6",X"9B",X"9E",X"AE",X"B9",X"C1",X"AE",X"90",X"5D",X"32",X"2C",X"27",X"2C",X"3F",X"62",X"83", + X"93",X"90",X"88",X"80",X"70",X"5D",X"52",X"47",X"3A",X"2F",X"24",X"1F",X"2C",X"3A",X"68",X"A3", + X"D4",X"F4",X"FC",X"FC",X"F4",X"E9",X"E9",X"DC",X"B9",X"90",X"78",X"68",X"5D",X"62",X"7D",X"93", + X"9B",X"90",X"7D",X"70",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5A",X"5D",X"65",X"68",X"68",X"70", + X"70",X"75",X"78",X"78",X"7D",X"80",X"80",X"78",X"65",X"3F",X"27",X"17",X"1C",X"2C",X"3F",X"5D", + X"78",X"93",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70", + X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32",X"04",X"01",X"01",X"01",X"01",X"01",X"11", + X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78",X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24", + X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93",X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90", + X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E", + X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B",X"88",X"75",X"52",X"37",X"1F",X"1C",X"24", + X"37",X"4D",X"68",X"88",X"AE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"9B",X"65", + X"3F",X"37",X"52",X"80",X"B3",X"D9",X"EC",X"EC",X"C9",X"7D",X"37",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"27",X"88",X"D1",X"FC",X"FC",X"EC",X"D1",X"BE",X"A3",X"7D",X"62",X"3A", + X"2C",X"1F",X"1F",X"24",X"2C",X"32",X"2C",X"27",X"2F",X"27",X"27",X"27",X"2C",X"47",X"7D",X"C1", + X"F7",X"FC",X"FC",X"E9",X"E1",X"EC",X"FC",X"FC",X"FC",X"FC",X"FC",X"E4",X"AE",X"88",X"78",X"83", + X"8B",X"8B",X"93",X"A3",X"B9",X"BE",X"A6",X"90",X"75",X"65",X"52",X"52",X"52",X"4D",X"55",X"5D", + X"62",X"68",X"70",X"70",X"70",X"75",X"80",X"8B",X"90",X"90",X"8B",X"83",X"90",X"98",X"9B",X"9E", + X"9E",X"9B",X"93",X"93",X"8B",X"90",X"8B",X"8B",X"8B",X"88",X"8B",X"8B",X"8B",X"8B",X"88",X"8B", + X"8B",X"8B",X"8B",X"8B",X"8B",X"88",X"8B",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"80",X"80", + X"80",X"7D",X"65",X"47",X"52",X"68",X"78",X"78",X"65",X"5A",X"5D",X"6D",X"75",X"78",X"70",X"68", + X"70",X"90",X"C9",X"EC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A6",X"68",X"42",X"3A",X"37",X"3A",X"5D", + X"7D",X"83",X"68",X"55",X"52",X"47",X"32",X"17",X"09",X"01",X"01",X"09",X"17",X"2C",X"52",X"9B", + X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"DC",X"A6",X"78",X"62",X"47",X"1F",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"3F",X"7D",X"A3",X"9B",X"80",X"5D",X"4A",X"5A",X"7D",X"90",X"9B",X"AB", + X"A6",X"AB",X"AB",X"9E",X"A6",X"BE",X"D4",X"E4",X"D4",X"A6",X"88",X"7D",X"88",X"88",X"83",X"90", + X"A3",X"AB",X"A6",X"9E",X"98",X"8B",X"83",X"80",X"80",X"80",X"83",X"83",X"88",X"8B",X"8B",X"90", + X"90",X"90",X"93",X"98",X"98",X"9B",X"93",X"98",X"93",X"93",X"93",X"93",X"93",X"93",X"90",X"90", + X"90",X"8B",X"8B",X"83",X"80",X"7D",X"68",X"52",X"52",X"62",X"68",X"88",X"AB",X"C6",X"C9",X"C9", + X"B6",X"A6",X"9E",X"8B",X"83",X"8B",X"A3",X"B3",X"AE",X"98",X"80",X"6D",X"5D",X"52",X"47",X"42", + X"47",X"3F",X"47",X"42",X"42",X"4D",X"62",X"65",X"68",X"68",X"68",X"68",X"68",X"68",X"68",X"68", + X"65",X"68",X"68",X"68",X"6D",X"70",X"6D",X"6D",X"70",X"75",X"70",X"75",X"78",X"75",X"78",X"75", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"7D",X"80",X"80",X"6D",X"65",X"70",X"80",X"80",X"68", + X"52",X"32",X"2C",X"37",X"68",X"9B",X"B6",X"B6",X"B6",X"C1",X"D4",X"D9",X"C6",X"A3",X"78",X"5A", + X"3F",X"32",X"32",X"3A",X"55",X"8B",X"CE",X"FC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A3",X"62",X"2F", + X"1C",X"09",X"01",X"01",X"1C",X"47",X"5D",X"68",X"80",X"93",X"90",X"80",X"70",X"5A",X"4D",X"52", + X"68",X"78",X"7D",X"70",X"5D",X"4A",X"3A",X"32",X"32",X"2F",X"27",X"27",X"1C",X"11",X"09",X"0C", + X"14",X"2C",X"42",X"75",X"AB",X"DC",X"F7",X"FC",X"FC",X"F7",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"BE",X"88",X"4D",X"11",X"01",X"01",X"0C",X"3F",X"75",X"9E",X"B6",X"B3", + X"93",X"70",X"52",X"3A",X"1F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"3F", + X"52",X"62",X"68",X"7D",X"9E",X"C1",X"E4",X"FC",X"FC",X"F7",X"E1",X"BE",X"A3",X"90",X"80",X"88", + X"AB",X"E1",X"FC",X"FC",X"FC",X"FC",X"F7",X"BE",X"7D",X"3F",X"0C",X"01",X"01",X"01",X"01",X"27", + X"70",X"B6",X"E9",X"FC",X"FC",X"E9",X"AE",X"83",X"62",X"4D",X"2F",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"3F",X"98",X"CE",X"D1",X"BE",X"B6",X"C1",X"D4",X"E9",X"FC",X"E9",X"C9",X"AB", + X"9B",X"88",X"5D",X"37",X"27",X"27",X"1F",X"1C",X"1C",X"1F",X"37",X"70",X"B6",X"FC",X"FC",X"FC", + X"FC",X"FC",X"F4",X"F4",X"E4",X"C6",X"98",X"70",X"5A",X"3A",X"37",X"47",X"6D",X"AE",X"F7",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"93",X"55",X"17",X"01",X"01",X"01",X"1C",X"4A",X"80",X"AB", + X"B3",X"A6",X"A3",X"A3",X"A3",X"A6",X"9B",X"78",X"42",X"11",X"04",X"11",X"1C",X"1F",X"37",X"55", + X"7D",X"8B",X"80",X"5D",X"47",X"4D",X"65",X"6D",X"5D",X"4A",X"3F",X"4D",X"7D",X"B6",X"EC",X"FC", + X"FC",X"FC",X"E4",X"C6",X"9E",X"98",X"9B",X"90",X"75",X"5D",X"62",X"7D",X"9B",X"C6",X"E1",X"E9", + X"D9",X"B3",X"93",X"83",X"70",X"68",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5D",X"65",X"65",X"68", + X"5A",X"37",X"2F",X"4A",X"65",X"6D",X"68",X"75",X"93",X"BE",X"E4",X"EC",X"D1",X"B3",X"9E",X"AB", + X"AB",X"9E",X"80",X"65",X"42",X"32",X"32",X"4A",X"75",X"90",X"A3",X"BE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"D1",X"93",X"5A",X"3A",X"3A",X"47",X"5A",X"7D",X"A6",X"CE",X"CE",X"B9",X"A6",X"9B",X"80", + X"52",X"1C",X"01",X"01",X"01",X"11",X"47",X"78",X"9E",X"AB",X"9B",X"78",X"5A",X"2C",X"14",X"1C", + X"27",X"1F",X"11",X"01",X"01",X"01",X"1C",X"3F",X"75",X"AB",X"C9",X"D4",X"DC",X"CE",X"C9",X"D1", + X"E1",X"F4",X"FC",X"FC",X"FC",X"E4",X"BE",X"90",X"70",X"4A",X"11",X"01",X"01",X"01",X"01",X"09", + X"17",X"4A",X"90",X"D4",X"FC",X"FC",X"FC",X"F4",X"E9",X"E9",X"FC",X"FC",X"E4",X"B3",X"80",X"52", + X"2F",X"1C",X"1F",X"32",X"68",X"AE",X"F4",X"FC",X"FC",X"FC",X"E4",X"C9",X"AB",X"80",X"5D",X"47", + X"37",X"42",X"75",X"AB",X"DC",X"FC",X"FC",X"FC",X"D9",X"93",X"55",X"37",X"2F",X"3A",X"52",X"62", + X"68",X"68",X"55",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1C",X"32",X"4D",X"68", + X"9B",X"CE",X"E4",X"F4",X"EC",X"E4",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9", + X"88",X"4A",X"17",X"04",X"11",X"42",X"75",X"88",X"9B",X"B6",X"BE",X"A6",X"7D",X"4D",X"1C",X"01", + X"01",X"17",X"27",X"32",X"4D",X"7D",X"A6",X"B3",X"B9",X"C6",X"D1",X"D9",X"D9",X"CE",X"BE",X"A6", + X"90",X"65",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"14",X"68",X"93",X"98",X"83",X"75",X"7D", + X"9E",X"BE",X"C9",X"BE",X"A6",X"9E",X"B6",X"D9",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9",X"C1", + X"B3",X"9B",X"75",X"5D",X"47",X"2F",X"2F",X"4A",X"68",X"7D",X"7D",X"78",X"83",X"90",X"9E",X"AE", + X"A3",X"83",X"75",X"52",X"3F",X"4A",X"5D",X"62",X"55",X"3F",X"2F",X"24",X"32",X"5A",X"7D",X"90", + X"AB",X"CE",X"E4",X"FC",X"FC",X"FC",X"E9",X"CE",X"B3",X"98",X"88",X"83",X"83",X"90",X"B3",X"EC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"75",X"42",X"27",X"14",X"01",X"01",X"1C",X"3F",X"52",X"5A", + X"68",X"78",X"68",X"47",X"17",X"01",X"01",X"09",X"27",X"37",X"4A",X"65",X"75",X"6D",X"65",X"68", + X"68",X"5D",X"4D",X"42",X"27",X"0C",X"0C",X"14",X"1C",X"1F",X"3A",X"68",X"9E",X"CE",X"E1",X"DC", + X"DC",X"DC",X"DC",X"CE",X"A6",X"75",X"5A",X"4A",X"3A",X"4A",X"70",X"98",X"BE",X"E1",X"E9",X"E4", + X"B9",X"9E",X"90",X"8B",X"88",X"75",X"52",X"2F",X"2F",X"4A",X"5D",X"68",X"78",X"80",X"70",X"70", + X"7D",X"8B",X"9E",X"B6",X"BE",X"B6",X"AE",X"9B",X"98",X"AE",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"B9",X"9E",X"88",X"65",X"4D",X"47",X"3F",X"2F",X"11",X"01",X"04", + X"1F",X"2F",X"2F",X"1F",X"11",X"01",X"0C",X"2C",X"4D",X"62",X"78",X"98",X"AB",X"BE",X"DC",X"F4", + X"F7",X"E4",X"E1",X"DC",X"C1",X"9E",X"88",X"62",X"3A",X"14",X"01",X"11",X"17",X"27",X"32",X"55", + X"88",X"B6",X"E4",X"F7",X"E4",X"C6",X"A3",X"75",X"5A",X"52",X"5A",X"68",X"78",X"80",X"80",X"5A", + X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"3F",X"70",X"A3",X"C9",X"E1",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"C6",X"B3",X"98",X"93",X"9B",X"AB",X"B9",X"AB",X"98",X"83",X"68",X"52", + X"4A",X"2F",X"17",X"04",X"01",X"0C",X"37",X"75",X"A3",X"B9",X"D1",X"CE",X"B3",X"A3",X"9B",X"93", + X"93",X"A6",X"BE",X"B9",X"9E",X"7D",X"55",X"37",X"27",X"27",X"4A",X"80",X"A6",X"B3",X"AE",X"AB", + X"B9",X"C6",X"B9",X"B3",X"A3",X"80",X"5D",X"4A",X"47",X"3A",X"32",X"3A",X"5A",X"7D",X"83",X"90", + X"8B",X"83",X"7D",X"70",X"65",X"6D",X"7D",X"78",X"65",X"47",X"1F",X"0C",X"01",X"01",X"09",X"2C", + X"68",X"AE",X"CE",X"D1",X"CE",X"D4",X"E4",X"E4",X"CE",X"A6",X"98",X"9B",X"AB",X"BE",X"CE",X"CE", + X"B9",X"90",X"52",X"14",X"01",X"01",X"01",X"01",X"09",X"3A",X"78",X"9E",X"AE",X"B9",X"CE",X"CE", + X"B9",X"A6",X"90",X"7D",X"7D",X"83",X"80",X"68",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75", + X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6",X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4", + X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A",X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC", + X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52",X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B", + X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9",X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01", + X"01",X"01",X"01",X"01",X"01",X"24",X"47",X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4", + X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3",X"9B",X"98",X"98",X"90",X"83",X"88",X"A6",X"C9",X"DC", + X"D9",X"BE",X"AB",X"7D",X"52",X"2F",X"27",X"1F",X"11",X"17",X"27",X"2F",X"2F",X"3F",X"52",X"5D", + X"5A",X"65",X"70",X"75",X"80",X"88",X"8B",X"9B",X"AB",X"BE",X"C6",X"AE",X"83",X"55",X"27",X"09", + X"09",X"27",X"52",X"83",X"93",X"98",X"93",X"88",X"83",X"80",X"70",X"55",X"3F",X"2C",X"27",X"32", + X"47",X"65",X"8B",X"AE",X"D4",X"E9",X"D9",X"B3",X"98",X"90",X"93",X"88",X"68",X"4D",X"4A",X"5A", + X"68",X"6D",X"7D",X"8B",X"90",X"8B",X"88",X"8B",X"98",X"9E",X"9B",X"83",X"62",X"2F",X"09",X"04", + X"1F",X"47",X"6D",X"98",X"AE",X"B6",X"B3",X"AB",X"9B",X"9B",X"A3",X"B6",X"C6",X"B9",X"9B",X"83", + X"78",X"6D",X"65",X"5A",X"5A",X"68",X"88",X"A6",X"B6",X"A3",X"8B",X"75",X"68",X"6D",X"6D",X"65", + X"5D",X"5D",X"68",X"80",X"A3",X"CE",X"DC",X"D4",X"CE",X"CE",X"C9",X"C6",X"CE",X"BE",X"AB",X"90", + X"80",X"80",X"8B",X"98",X"9E",X"B6",X"DC",X"E4",X"E4",X"E1",X"CE",X"C6",X"B6",X"98",X"80",X"7D", + X"75",X"70",X"68",X"68",X"62",X"3F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"11",X"47",X"68",X"90",X"B6",X"CE",X"D4",X"E1",X"E9",X"E9",X"E4",X"E4",X"E9",X"E4",X"D4",X"C6", + X"A6",X"78",X"42",X"14",X"01",X"01",X"01",X"01",X"14",X"42",X"78",X"AB",X"D1",X"E1",X"D9",X"C6", + X"9B",X"7D",X"75",X"78",X"88",X"93",X"8B",X"88",X"70",X"4D",X"2F",X"24",X"1C",X"24",X"27",X"24", + X"27",X"3A",X"62",X"88",X"B3",X"CE",X"DC",X"EC",X"EF",X"E1",X"CE",X"BE",X"A3",X"83",X"68",X"52", + X"4D",X"55",X"65",X"78",X"78",X"80",X"90",X"90",X"90",X"8B",X"75",X"5D",X"4D",X"52",X"62",X"80", + X"A3",X"B6",X"B6",X"B6",X"A6",X"90",X"83",X"88",X"93",X"9E",X"BE",X"D1",X"C9",X"AE",X"8B",X"62", + X"3F",X"27",X"1C",X"32",X"62",X"88",X"9B",X"A3",X"AB",X"C1",X"CE",X"C1",X"B6",X"A6",X"90",X"6D", + X"5D",X"55",X"3F",X"2F",X"2F",X"47",X"5D",X"65",X"6D",X"75",X"78",X"83",X"7D",X"75",X"7D",X"83", + X"80",X"68",X"4D",X"2F",X"14",X"04",X"04",X"17",X"37",X"70",X"A6",X"C1",X"C1",X"B9",X"BE",X"D1", + X"D4",X"C1",X"A3",X"98",X"9E",X"AE",X"C9",X"D4",X"D4",X"C6",X"98",X"5D",X"24",X"01",X"01",X"01", + X"01",X"17",X"4A",X"7D",X"A3",X"AE",X"B9",X"C9",X"C6",X"B6",X"A3",X"8B",X"7D",X"80",X"83",X"83", + X"6D",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75",X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6", + X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4",X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A", + X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC",X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52", + X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B",X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9", + X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"47", + X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4",X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3", + X"9B",X"98",X"98",X"8B",X"83",X"8B",X"A6",X"C9",X"E1",X"DC",X"C1",X"A6",X"7D",X"4D",X"2C",X"24", + X"17",X"0C",X"11",X"1F",X"2C",X"2C",X"3A",X"52",X"5D",X"5A",X"65",X"70",X"78",X"88",X"90",X"90", + X"9E",X"AB",X"C1",X"C6",X"A6",X"78",X"3F",X"11",X"01",X"01",X"14",X"47",X"80",X"93",X"98",X"93", + X"83",X"70",X"65",X"4D",X"2F",X"14",X"04",X"04",X"27",X"47",X"70",X"A3",X"D1",X"FC",X"FC",X"F7", + X"C9",X"A6",X"9B",X"9B",X"8B",X"70",X"5A",X"5D",X"75",X"7D",X"80",X"8B",X"9E",X"9B",X"93",X"8B", + X"98",X"A3",X"AE",X"AE",X"93",X"68",X"32",X"04",X"04",X"24",X"52",X"88",X"B6",X"C9",X"B9",X"AB", + X"98",X"80",X"80",X"90",X"A6",X"B9",X"BE",X"A6",X"93",X"8B",X"80",X"70",X"4D",X"37",X"3F",X"62", + X"88",X"9E",X"98",X"80",X"65",X"55",X"62",X"68",X"68",X"70",X"75",X"78",X"93",X"C6",X"FC",X"FC", + X"FC",X"FC",X"F7",X"E9",X"DC",X"D4",X"BE",X"A3",X"80",X"68",X"70",X"75",X"75",X"70",X"80",X"A3", + X"B3",X"B3",X"AE",X"98",X"83",X"75",X"5D",X"52",X"5A",X"68",X"78",X"83",X"83",X"78",X"4A",X"11", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"78",X"A6",X"D1",X"E9",X"E4", + X"E1",X"E1",X"DC",X"D9",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"B9",X"75",X"2F",X"01",X"01",X"01", + X"01",X"01",X"01",X"27",X"5D",X"9B",X"D4",X"F4",X"EC",X"CE",X"A6",X"93",X"9E",X"B6",X"B6",X"A3", + X"93",X"8B",X"83",X"70",X"68",X"78",X"93",X"A6",X"9E",X"90",X"83",X"98",X"AE",X"C9",X"D4",X"DC", + X"CE",X"A6",X"7D",X"65",X"52",X"2C",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"4D",X"9E", + X"E4",X"FC",X"FC",X"FC",X"EC",X"EC",X"FC",X"FC",X"FC",X"FC",X"E9",X"AE",X"78",X"4A",X"2F",X"2F", + X"52",X"8B",X"C6",X"F4",X"FC",X"F7",X"DC",X"B3",X"80",X"4D",X"17",X"01",X"01",X"01",X"1C",X"3F", + X"70",X"A6",X"D1",X"E9",X"E1",X"CE",X"B9",X"B3",X"AE",X"A6",X"88",X"5A",X"1F",X"01",X"01",X"01", + X"01",X"01",X"14",X"52",X"8B",X"B9",X"C6",X"B6",X"A6",X"9E",X"90",X"75",X"68",X"52",X"4A",X"52", + X"68",X"88",X"93",X"83",X"62",X"3F",X"1F",X"17",X"2F",X"4D",X"68",X"75",X"83",X"9E",X"D1",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D4",X"BE",X"B3",X"A3",X"A6",X"BE",X"D4",X"E1",X"CE",X"B3",X"A6",X"98", + X"75",X"4A",X"27",X"1C",X"2F",X"4D",X"68",X"7D",X"68",X"47",X"17",X"01",X"01",X"01",X"01",X"01", + X"04",X"0C",X"1F",X"32",X"4A",X"5D",X"80",X"B3",X"F7",X"FC",X"FC",X"FC",X"EC",X"D4",X"CE",X"BE", + X"C1",X"CE",X"D9",X"C9",X"A3",X"83",X"70",X"5A",X"3F",X"32",X"3F",X"5D",X"68",X"65",X"47",X"2C", + X"17",X"04",X"09",X"27",X"4A",X"68",X"90",X"9E",X"98",X"88",X"7D",X"83",X"9E",X"CE",X"E9",X"F7", + X"E4",X"BE",X"9E",X"68",X"37",X"09",X"01",X"01",X"01",X"04",X"14",X"37",X"55",X"65",X"70",X"88", + X"AE",X"DC",X"FC",X"F4",X"D1",X"AE",X"93",X"80",X"78",X"83",X"9B",X"B3",X"B3",X"98",X"70",X"47", + X"24",X"17",X"32",X"62",X"9B",X"C9",X"CE",X"B9",X"A3",X"9B",X"88",X"70",X"5D",X"55",X"68",X"93", + X"B6",X"BE",X"B3",X"AE",X"AE",X"A3",X"90",X"90",X"98",X"9B",X"AB",X"AB",X"AE",X"B3",X"AB",X"93", + X"78",X"65",X"68",X"78",X"75",X"70",X"68",X"78",X"8B",X"93",X"93",X"9E",X"B9",X"DC",X"FC",X"FC", + X"FC",X"D4",X"93",X"62",X"42",X"1C",X"01",X"01",X"04",X"0C",X"0C",X"1F",X"4A",X"78",X"AB",X"C9", + X"DC",X"E1",X"D9",X"C6",X"AB",X"90",X"70",X"47",X"09",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"1C",X"47",X"62",X"75",X"88",X"AB",X"D1",X"E9",X"EC",X"E9",X"E4",X"DC",X"F7",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"9E",X"80",X"75",X"7D",X"70",X"6D",X"75",X"80",X"8B",X"80",X"65", + X"4A",X"2C",X"04",X"01",X"01",X"01",X"04",X"2C",X"52",X"62",X"5A",X"4D",X"5A",X"78",X"9B",X"B3", + X"C1",X"AB",X"93",X"83",X"78",X"62",X"4D",X"4A",X"52",X"4A",X"3F",X"4D",X"5D",X"7D",X"90",X"9B", + X"9E",X"83",X"68",X"62",X"5D",X"68",X"78",X"88",X"88",X"8B",X"8B",X"80",X"62",X"47",X"3F",X"3A", + X"32",X"37",X"37",X"37",X"4D",X"70",X"88",X"8B",X"80",X"70",X"70",X"8B",X"B6",X"D4",X"D4",X"CE", + X"B9",X"B9",X"C9",X"C9",X"C6",X"B6",X"B9",X"D4",X"FC",X"FC",X"FC",X"FC",X"EC",X"B6",X"80",X"52", + X"37",X"2F",X"2C",X"37",X"62",X"98",X"D1",X"FC",X"FC",X"EC",X"D1",X"A3",X"68",X"4A",X"32",X"27", + X"27",X"3A",X"55",X"68",X"62",X"52",X"3F",X"1C",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"37", + X"5A",X"70",X"88",X"88",X"7D",X"65",X"52",X"47",X"52",X"68",X"83",X"9E",X"AE",X"B6",X"C1",X"B9", + X"B6",X"AE",X"98",X"78",X"5D",X"42",X"32",X"2C",X"2F",X"4D",X"7D",X"B9",X"F7",X"FC",X"FC",X"FC", + X"E1",X"AB",X"83",X"65",X"52",X"5A",X"68",X"65",X"52",X"3F",X"3F",X"3F",X"37",X"37",X"52",X"7D", + X"A6",X"C1",X"BE",X"9E",X"88",X"7D",X"68",X"5A",X"47",X"47",X"62",X"90",X"B3",X"C6",X"D9",X"EF", + X"FC",X"FC",X"E4",X"CE",X"B9",X"B3",X"B3",X"AE",X"AB",X"9B",X"75",X"55",X"37",X"11",X"01",X"01", + X"01",X"01",X"04",X"4D",X"88",X"AB",X"B3",X"AE",X"A3",X"9B",X"AE",X"C6",X"CE",X"C9",X"BE",X"B6", + X"B3",X"AB",X"AE",X"C6",X"EF",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"88",X"4A",X"14",X"01", + X"09",X"2C",X"52",X"78",X"93",X"93",X"78",X"47",X"0C",X"01",X"01",X"01",X"01",X"09",X"09",X"11", + X"27",X"4D",X"62",X"68",X"7D",X"90",X"9E",X"AE",X"AB",X"8B",X"70",X"62",X"52",X"3A",X"1C",X"04", + X"11",X"2F",X"5A",X"83",X"9E",X"B3",X"B9",X"B9",X"AB",X"80",X"62",X"4D",X"4D",X"5A",X"65",X"75", + X"7D",X"83",X"83",X"70",X"4D",X"1F",X"0C",X"14",X"32",X"5D",X"70",X"68",X"65",X"68",X"83",X"9E", + X"9E",X"93",X"88",X"83",X"9B",X"BE",X"D9",X"E1",X"D1",X"B6",X"A3",X"93",X"88",X"88",X"8B",X"98", + X"A3",X"C6",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"D4",X"B3",X"88",X"65",X"4A",X"32",X"3A",X"5D", + X"88",X"B3",X"D4",X"E4",X"E1",X"B9",X"78",X"37",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"14",X"37",X"42",X"4A",X"5A",X"68",X"78",X"90",X"AE",X"C9",X"E1",X"E1", + X"C9",X"93",X"65",X"4D",X"32",X"1F",X"17",X"27",X"37",X"3F",X"42",X"4D",X"68",X"88",X"98",X"A3", + X"B6",X"C9",X"D4",X"E4",X"E4",X"D4",X"BE",X"A6",X"AE",X"C6",X"E4",X"FC",X"FC",X"FC",X"E4",X"AB", + X"6D",X"3F",X"27",X"2F",X"52",X"83",X"AB",X"AB",X"AE",X"AE",X"AE",X"98",X"70",X"5A",X"5A",X"65", + X"7D",X"88",X"80",X"5D",X"3A",X"24",X"11",X"11",X"2F",X"52",X"75",X"83",X"93",X"A3",X"C9",X"EF", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"98",X"5A",X"1F",X"01",X"01",X"01",X"11",X"2F", + X"5D",X"90",X"BE",X"E4",X"FC",X"FC",X"D9",X"A3",X"78",X"65",X"68",X"75",X"70",X"65",X"5A",X"4A", + X"2C",X"14",X"04",X"11",X"37",X"68",X"9B",X"A6",X"9B",X"88",X"83",X"90",X"93",X"90",X"8B",X"83", + X"7D",X"83",X"93",X"A6",X"B6",X"BE",X"B9",X"9E",X"68",X"42",X"2C",X"2F",X"47",X"5D",X"78",X"88", + X"90",X"93",X"90",X"70",X"52",X"37",X"17",X"11",X"17",X"2C",X"37",X"3F",X"4D",X"4A",X"3F",X"32", + X"2F",X"37",X"5A",X"7D",X"9B",X"9E",X"A6",X"AE",X"B6",X"D4",X"FC",X"FC",X"FC",X"FC",X"FC",X"EC", + X"E1",X"B9",X"93",X"6D",X"5A",X"5A",X"5D",X"68",X"75",X"78",X"83",X"83",X"83",X"83",X"70",X"5D", + X"4A",X"4D",X"62",X"7D",X"90",X"98",X"88",X"62",X"2F",X"01",X"01",X"01",X"01",X"1C",X"37",X"52", + X"65",X"68",X"5A",X"52",X"5D",X"75",X"7D",X"75",X"5D",X"4A",X"4D",X"65",X"88",X"AB",X"C6",X"D9", + X"D4",X"B6",X"93",X"83",X"70",X"5A",X"47",X"47",X"4A",X"3F",X"3A",X"3F",X"32",X"27",X"17",X"1F", + X"3F",X"68",X"93",X"9E",X"9B",X"93",X"98",X"A6",X"AB",X"AB",X"A3",X"A6",X"BE",X"E1",X"F7",X"FC", + X"FC",X"EC",X"D1",X"AE",X"93",X"8B",X"9B",X"B3",X"B6",X"B6",X"C6",X"C6",X"B6",X"A6",X"9E",X"93", + X"7D",X"5D",X"37",X"1C",X"1F",X"27",X"2C",X"37",X"52",X"75",X"93",X"98",X"8B",X"7D",X"65",X"5D", + X"65",X"75",X"88",X"9B",X"9E",X"9B",X"8B",X"80",X"83",X"8B",X"8B",X"83",X"93",X"AB",X"C9",X"DC", + X"CE",X"B9",X"A6",X"83",X"5D",X"32",X"17",X"01",X"01",X"04",X"1C",X"4A",X"80",X"B6",X"DC",X"E1", + X"D4",X"BE",X"A6",X"98",X"90",X"88",X"6D",X"4D",X"2C",X"11",X"04",X"04",X"1C",X"4D",X"83",X"B6", + X"DC",X"E4",X"D1",X"C1",X"B3",X"9B",X"80",X"68",X"68",X"68",X"75",X"7D",X"7D",X"70",X"52",X"2C", + X"04",X"01",X"01",X"01",X"11",X"2F",X"47",X"5D",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC", + X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E",X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E", + X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52",X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01", + X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3",X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB", + X"93",X"78",X"65",X"62",X"68",X"70",X"80",X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70", + X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3",X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88", + X"7D",X"62",X"47",X"2F",X"11",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"78",X"93",X"9B", + X"9E",X"93",X"98",X"9B",X"98",X"A3",X"A6",X"AB",X"B3",X"C1",X"D1",X"CE",X"BE",X"AE",X"98",X"7D", + X"75",X"65",X"52",X"4A",X"3F",X"3A",X"3F",X"52",X"68",X"80",X"93",X"AB",X"B6",X"C9",X"E1",X"E4", + X"D4",X"CE",X"CE",X"C9",X"BE",X"9E",X"7D",X"5A",X"37",X"27",X"1C",X"1F",X"37",X"5A",X"75",X"80", + X"8B",X"93",X"90",X"8B",X"88",X"88",X"80",X"80",X"83",X"80",X"88",X"A3",X"C6",X"E1",X"FC",X"FC", + X"F4",X"CE",X"A3",X"80",X"65",X"4A",X"37",X"37",X"3F",X"47",X"52",X"62",X"70",X"7D",X"70",X"62", + X"52",X"55",X"68",X"78",X"80",X"75",X"65",X"65",X"5D",X"55",X"5A",X"5A",X"65",X"80",X"98",X"A3", + X"9B",X"8B",X"7D",X"80",X"88",X"90",X"98",X"9B",X"93",X"93",X"9E",X"AE",X"B9",X"B6",X"AE",X"AE", + X"A6",X"93",X"78",X"65",X"52",X"4D",X"4A",X"52",X"68",X"78",X"88",X"93",X"90",X"83",X"80",X"6D", + X"5D",X"5D",X"62",X"68",X"6D",X"6D",X"5D",X"4A",X"37",X"2F",X"32",X"52",X"75",X"93",X"A6",X"AE", + X"AB",X"AE",X"B6",X"C6",X"BE",X"C1",X"B9",X"A6",X"98",X"8B",X"70",X"52",X"3A",X"2C",X"37",X"42", + X"5A",X"68",X"70",X"78",X"7D",X"88",X"93",X"98",X"90",X"7D",X"7D",X"88",X"90",X"98",X"93",X"7D", + X"52",X"2C",X"09",X"01",X"01",X"09",X"32",X"52",X"70",X"88",X"9B",X"93",X"90",X"93",X"98",X"90", + X"83",X"70",X"65",X"62",X"78",X"93",X"AE",X"BE",X"C6",X"B9",X"9E",X"83",X"70",X"65",X"5D",X"5A", + X"5A",X"5D",X"5A",X"55",X"55",X"47",X"37",X"27",X"1F",X"37",X"5A",X"78",X"88",X"8B",X"8B",X"93", + X"A3",X"A6",X"AB",X"A6",X"AB",X"BE",X"D4",X"E4",X"EC",X"EC",X"E1",X"C9",X"A6",X"90",X"83",X"90", + X"98",X"9B",X"9E",X"AE",X"AB",X"A6",X"9E",X"9B",X"9B",X"90",X"78",X"5A",X"3F",X"37",X"37",X"37", + X"3F",X"52",X"68",X"88",X"83",X"78",X"68",X"5A",X"55",X"65",X"78",X"8B",X"9E",X"A3",X"9B",X"90", + X"83",X"88",X"8B",X"88",X"80",X"8B",X"9E",X"B9",X"C9",X"B9",X"A6",X"93",X"75",X"52",X"32",X"1C", + X"11",X"0C",X"14",X"2C",X"5A",X"8B",X"BE",X"DC",X"E1",X"D9",X"C6",X"AE",X"9E",X"98",X"8B",X"75", + X"55",X"32",X"1C",X"11",X"11",X"24",X"52",X"88",X"B6",X"D9",X"E4",X"CE",X"BE",X"AE",X"98",X"7D", + X"68",X"65",X"68",X"75",X"78",X"7D",X"70",X"52",X"2F",X"09",X"01",X"01",X"01",X"11",X"2F",X"47", + X"5A",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC",X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E", + X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E",X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52", + X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01",X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3", + X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB",X"93",X"78",X"65",X"62",X"68",X"70",X"80", + X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70",X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3", + X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88",X"7D",X"62",X"47",X"2C",X"0C",X"01",X"01", + X"01",X"01",X"01",X"14",X"3A",X"65",X"7D",X"98",X"A3",X"A3",X"98",X"9B",X"9E",X"9E",X"A6",X"AB", + X"AB",X"B6",X"C6",X"D4",X"CE",X"BE",X"AB",X"90",X"78",X"68",X"5A",X"47",X"32",X"27",X"1F",X"24", + X"3A",X"62",X"80",X"9E",X"B9",X"CE",X"D4",X"E9",X"EC",X"E1",X"D1",X"D1",X"CE",X"C6",X"A6",X"80", + X"55",X"2F",X"17",X"04",X"11",X"2F",X"62",X"83",X"9B",X"A6",X"AB",X"9B",X"90",X"8B",X"88",X"78", + X"70",X"65",X"5A",X"65",X"88",X"A6",X"CE",X"EF",X"FC",X"FC",X"E1",X"B6",X"9E",X"88",X"68",X"52", + X"4A",X"47",X"3F",X"37",X"3A",X"47",X"47",X"3A",X"2F",X"2F",X"4A",X"68",X"80",X"83",X"75",X"65", + X"65",X"65",X"68",X"75",X"7D",X"88",X"9E",X"AB",X"AB",X"98",X"80",X"78",X"7D",X"80",X"8B",X"9E", + X"9E",X"9B",X"9E",X"AE",X"BE",X"C1",X"B3",X"A6",X"A3",X"A6",X"AB",X"9B",X"83",X"68",X"52",X"42", + X"3F",X"52",X"68",X"80",X"93",X"A3",X"A6",X"B3",X"A6",X"93",X"88",X"88",X"93",X"90",X"83",X"68", + X"4D",X"37",X"2C",X"2F",X"47",X"68",X"90",X"AB",X"AE",X"A6",X"A6",X"9B",X"88",X"75",X"68",X"62", + X"52",X"42",X"32",X"27",X"11",X"01",X"01",X"11",X"27",X"3F",X"5A",X"65",X"68",X"78",X"8B",X"A6", + X"C1",X"C6",X"B9",X"B3",X"B3",X"AB",X"A3",X"8B",X"68",X"42",X"24",X"11",X"11",X"11",X"27",X"4D", + X"70",X"98",X"B9",X"DC",X"E9",X"E9",X"E1",X"CE",X"AB",X"98",X"90",X"83",X"83",X"93",X"A3",X"B6", + X"AE",X"A3",X"90",X"78",X"5D",X"4A",X"4D",X"62",X"78",X"83",X"80",X"80",X"83",X"7D",X"68",X"52", + X"37",X"1F",X"1F",X"2F",X"47",X"55",X"65",X"7D",X"90",X"93",X"98",X"A3",X"AE",X"B3",X"B9",X"B6", + X"B6",X"C1",X"C6",X"B9",X"A6",X"8B",X"80",X"70",X"65",X"52",X"4A",X"52",X"62",X"65",X"68",X"7D", + X"90",X"AB",X"C6",X"D1",X"CE",X"AE",X"88",X"68",X"65",X"62",X"52",X"52",X"4D",X"3F",X"2F",X"27", + X"27",X"3A",X"62",X"83",X"9E",X"B3",X"A6",X"9E",X"93",X"90",X"8B",X"7D",X"68",X"62",X"65",X"65", + X"65",X"55",X"3F",X"27",X"14",X"11",X"14",X"1C",X"2F",X"4A",X"62",X"78",X"98",X"B6",X"D1",X"E4", + X"E4",X"E1",X"E4",X"F7",X"FC",X"F7",X"E4",X"D1",X"BE",X"AB",X"98",X"83",X"8B",X"98",X"93",X"90", + X"93",X"90",X"83",X"78",X"70",X"6D",X"62",X"4A",X"2C",X"17",X"14",X"1C",X"27",X"3F",X"4D",X"5D", + X"68",X"68",X"68",X"68",X"75",X"8B",X"9E",X"A6",X"9E",X"9B",X"98",X"98",X"93",X"80",X"70",X"62", + X"52",X"4A",X"42",X"3A",X"2F",X"27",X"2C",X"2F",X"3F",X"5D",X"80",X"90",X"9B",X"A3",X"AE",X"C9", + X"E1",X"E4",X"DC",X"CE",X"C9",X"CE",X"C6",X"B3",X"98",X"8B",X"83",X"75",X"68",X"6D",X"7D",X"90", + X"A3",X"B3",X"B9",X"AE",X"98",X"7D",X"70",X"62",X"4A",X"2F",X"17",X"11",X"17",X"24",X"37",X"52", + X"62",X"75",X"80",X"80",X"80",X"88",X"8B",X"8B",X"98",X"9B",X"9E",X"AB",X"B6",X"AE",X"A3",X"90", + X"83",X"80",X"7D",X"83",X"90",X"90",X"88",X"75",X"62",X"52",X"47",X"42",X"4A",X"5D",X"75",X"8B", + X"A3",X"AB",X"AB",X"A3",X"93",X"98",X"9E",X"AE",X"BE",X"BE",X"AB",X"88",X"68",X"52",X"3A",X"37", + X"47",X"62",X"83",X"98",X"A3",X"9B",X"98",X"98",X"88",X"68",X"52",X"4D",X"52",X"62",X"65",X"62", + X"62",X"5D",X"4A",X"37",X"27",X"2C",X"3F",X"5D",X"6D",X"75",X"75",X"80",X"90",X"A3",X"B3",X"BE", + X"C6",X"C1",X"B9",X"AB",X"9E",X"83",X"68",X"52",X"3F",X"27",X"11",X"0C",X"11",X"1C",X"3F",X"68", + X"9B",X"B6",X"BE",X"B6",X"B3",X"B6",X"BE",X"C9",X"C6",X"AE",X"9B",X"8B",X"80",X"7D",X"83",X"93", + X"A3",X"AE",X"A3",X"9E",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"7D",X"68",X"62",X"5D",X"62",X"5D", + X"52",X"4D",X"5A",X"52",X"52",X"52",X"52",X"52",X"5A",X"5A",X"5A",X"62",X"68",X"78",X"88",X"90", + X"98",X"A6",X"B6",X"B9",X"B6",X"B3",X"B6",X"B9",X"B9",X"B6",X"AE",X"AB",X"93",X"78",X"65",X"4D", + X"32",X"24",X"24",X"32",X"52",X"70",X"83",X"88",X"83",X"7D",X"70",X"65",X"68",X"6D",X"6D",X"6D", + X"68",X"65",X"68",X"68",X"65",X"5D",X"55",X"5D",X"70",X"8B",X"90",X"93",X"8B",X"80",X"7D",X"7D", + X"8B",X"9E",X"A6",X"A3",X"9E",X"9E",X"A3",X"A3",X"98",X"88",X"80",X"75",X"68",X"62",X"55",X"4D", + X"4A",X"4D",X"5D",X"75",X"93",X"AE",X"B6",X"AB",X"93",X"78",X"65",X"52",X"5A",X"5D",X"65",X"78", + X"88",X"88",X"80",X"75",X"70",X"68",X"5D",X"5A",X"5D",X"62",X"68",X"70",X"75",X"78",X"7D",X"7D", + X"80",X"78",X"70",X"65",X"5D",X"52",X"5A",X"70",X"8B",X"A3",X"AE",X"AE",X"A6",X"9B",X"90",X"83", + X"75",X"68",X"55",X"4D",X"4A",X"4A",X"4D",X"5A",X"78",X"93",X"B9",X"D4",X"E4",X"E1",X"CE",X"BE", + X"AE",X"9B",X"88",X"78",X"78",X"78",X"78",X"68",X"62",X"55",X"4D",X"3A",X"32",X"3A",X"4D",X"68", + X"7D",X"80",X"7D",X"78",X"75",X"7D",X"88",X"98",X"A3",X"AE",X"AE",X"AB",X"AE",X"B6",X"C6",X"D1", + X"D4",X"D4",X"C6",X"AB",X"98",X"83",X"78",X"65",X"4D",X"3F",X"3F",X"3F",X"4A",X"5A",X"68",X"70", + X"68",X"68",X"70",X"80",X"8B",X"93",X"8B",X"7D",X"70",X"6D",X"68",X"70",X"75",X"75",X"78",X"78", + X"75",X"68",X"65",X"62",X"6D",X"83",X"98",X"AE",X"B6",X"A6",X"98",X"90",X"80",X"75",X"68",X"5D", + X"62",X"68",X"80",X"93",X"9B",X"93",X"90",X"80",X"6D",X"5A",X"4A",X"42",X"47",X"52",X"5D",X"6D", + X"83",X"90",X"90",X"83",X"80",X"80",X"75",X"75",X"70",X"68",X"65",X"5A",X"52",X"4D",X"52",X"65", + X"7D",X"98",X"A6",X"AB",X"AB",X"A6",X"9E",X"9B",X"90",X"80",X"75",X"6D",X"65",X"52",X"52",X"52", + X"52",X"4D",X"42",X"3F",X"47",X"4A",X"55",X"5D",X"62",X"62",X"62",X"62",X"68",X"7D",X"88",X"93", + X"A3",X"9E",X"A3",X"98",X"90",X"90",X"98",X"A3",X"B6",X"C1",X"BE",X"B6",X"B3",X"AB",X"9B",X"88", + X"75",X"70",X"68",X"65",X"70",X"78",X"7D",X"70",X"68",X"68",X"68",X"68",X"65",X"62",X"5D",X"68", + X"7D",X"90",X"9B",X"9B",X"98",X"98",X"98",X"93",X"98",X"9E",X"9B",X"98",X"93",X"93",X"90",X"83", + X"80",X"80",X"78",X"68",X"62",X"62",X"65",X"75",X"83",X"88",X"8B",X"90",X"8B",X"7D",X"70",X"68", + X"65",X"5D",X"55",X"52",X"4D",X"4A",X"4D",X"5A",X"5D",X"65",X"70",X"80",X"8B",X"93",X"9E",X"9E", + X"9B",X"9E",X"A3",X"9B",X"98",X"90",X"88",X"83",X"83",X"88",X"90",X"A6",X"B9",X"BE",X"C1",X"C6", + X"C6",X"C6",X"B6",X"9B",X"83",X"65",X"52",X"4A",X"4D",X"5D",X"6D",X"80",X"8B",X"93",X"8B",X"80", + X"65",X"5A",X"52",X"52",X"52",X"47",X"3F",X"3A",X"47",X"52",X"5D",X"6D",X"83",X"93",X"9B",X"9E", + X"98",X"8B",X"88",X"80",X"80",X"78",X"6D",X"68",X"68",X"70",X"70",X"68",X"68",X"62",X"5A",X"5A", + X"5D",X"5A",X"5D",X"65",X"70",X"75",X"8B",X"98",X"9B",X"9B",X"9B",X"93",X"88",X"88",X"83",X"88", + X"88",X"93",X"9B",X"98",X"8B",X"80",X"78",X"70",X"68",X"68",X"70",X"80",X"88",X"90",X"93",X"9B", + X"9E",X"98",X"98",X"98",X"98",X"90",X"83",X"78",X"78",X"6D",X"6D",X"78",X"88",X"98",X"A3",X"AB", + X"AB",X"A6",X"98",X"83",X"70",X"52",X"47",X"37",X"32",X"27",X"27",X"37",X"47",X"4D",X"65",X"75", + X"88",X"90",X"98",X"90",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"68",X"62",X"5D",X"4D",X"42", + X"3A",X"3A",X"3F",X"47",X"52",X"5A",X"68",X"78",X"83",X"90",X"A3",X"AE",X"B6",X"B9",X"B6",X"AE", + X"B3",X"B6",X"C1",X"C6",X"BE",X"B9",X"B9",X"AE",X"9B",X"88",X"80",X"75",X"68",X"65",X"65",X"70", + X"78",X"83",X"8B",X"90",X"88",X"7D",X"65",X"5A",X"55",X"5A",X"52",X"4D",X"47",X"42",X"3F",X"47", + X"4A",X"52",X"65",X"7D",X"93",X"9B",X"98",X"93",X"90",X"93",X"9B",X"A6",X"AE",X"AE",X"A6",X"98", + X"8B",X"78",X"68",X"5A",X"52",X"52",X"5A",X"65",X"68",X"75",X"75",X"70",X"70",X"7D",X"80",X"83", + X"83",X"80",X"80",X"80",X"8B",X"98",X"A3",X"A3",X"A6",X"A3",X"9B",X"93",X"90",X"8B",X"88",X"80", + X"78",X"70",X"62",X"5A",X"5A",X"52",X"52",X"55",X"5A",X"62",X"68",X"75",X"70",X"6D",X"65",X"65", + X"68",X"6D",X"70",X"70",X"70",X"75",X"75",X"7D",X"83",X"88",X"93",X"9B",X"A3",X"A3",X"A6",X"A6", + X"A3",X"9E",X"93",X"88",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"7D",X"70",X"68",X"62", + X"62",X"68",X"70",X"78",X"7D",X"7D",X"78",X"75",X"68",X"68",X"62",X"62",X"68",X"78",X"78",X"7D", + X"75",X"68",X"6D",X"6D",X"70",X"75",X"7D",X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"80",X"83", + X"88",X"8B",X"88",X"83",X"80",X"80",X"83",X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D", + X"75",X"6D",X"68",X"75",X"80",X"83",X"88",X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"75",X"68",X"5D",X"52",X"4A",X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B", + X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B",X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62", + X"65",X"70",X"78",X"7D",X"80",X"88",X"8B",X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90", + X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"7D",X"78",X"78",X"75",X"70",X"70",X"6D",X"68",X"6D",X"70",X"78",X"80", + X"80",X"80",X"83",X"88",X"90",X"8B",X"8B",X"8B",X"88",X"80",X"7D",X"78",X"70",X"68",X"68",X"68", + X"68",X"6D",X"6D",X"70",X"78",X"7D",X"83",X"8B",X"8B",X"90",X"8B",X"88",X"88",X"88",X"88",X"83", + X"80",X"80",X"83",X"80",X"80",X"7D",X"83",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"78",X"78", + X"75",X"70",X"70",X"70",X"75",X"78",X"78",X"78",X"75",X"75",X"70",X"70",X"75",X"78",X"75",X"75", + X"75",X"75",X"78",X"7D",X"80",X"7D",X"7D",X"7D",X"83",X"88",X"8B",X"88",X"88",X"88",X"88",X"88", + X"8B",X"90",X"90",X"88",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"7D",X"7D",X"80",X"7D",X"78", + X"75",X"70",X"70",X"78",X"80",X"88",X"88",X"88",X"88",X"83",X"7D",X"78",X"78",X"80",X"83",X"83", + X"83",X"80",X"78",X"75",X"75",X"75",X"78",X"80",X"80",X"83",X"83",X"80",X"7D",X"78",X"6D",X"68", + X"65",X"62",X"5D",X"5A",X"62",X"65",X"68",X"75",X"80",X"8B",X"90",X"93",X"90",X"88",X"83",X"80", + X"78",X"75",X"75",X"70",X"68",X"65",X"5D",X"5D",X"55",X"5A",X"5D",X"65",X"68",X"75",X"75",X"80", + X"83",X"8B",X"90",X"9B",X"A3",X"A6",X"A6",X"9E",X"9B",X"98",X"98",X"9E",X"9E",X"A3",X"A3",X"A6", + X"A3",X"9B",X"8B",X"88",X"7D",X"75",X"6D",X"68",X"6D",X"75",X"7D",X"7D",X"83",X"83",X"80",X"75", + X"6D",X"68",X"68",X"68",X"65",X"62",X"5D",X"5A",X"5A",X"5D",X"62",X"68",X"78",X"80",X"83",X"80", + X"7D",X"80",X"83",X"8B",X"98",X"9B",X"9B",X"98",X"90",X"8B",X"7D",X"70",X"68",X"62",X"65",X"68", + X"70",X"78",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"7D",X"7D",X"7D",X"83",X"90",X"98", + X"9B",X"9E",X"9B",X"98",X"90",X"8B",X"83",X"83",X"7D",X"75",X"70",X"65",X"5D",X"5D",X"5A",X"5D", + X"62",X"65",X"68",X"75",X"75",X"75",X"75",X"68",X"6D",X"6D",X"70",X"70",X"75",X"70",X"75",X"75", + X"78",X"7D",X"83",X"90",X"98",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"88",X"83",X"7D",X"7D", + X"7D",X"80",X"83",X"80",X"80",X"7D",X"75",X"68",X"65",X"65",X"68",X"75",X"78",X"7D",X"78",X"78", + X"78",X"6D",X"68",X"65",X"68",X"6D",X"78",X"7D",X"7D",X"75",X"6D",X"6D",X"70",X"75",X"78",X"80", + X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"83",X"83",X"88",X"8B",X"88",X"83",X"80",X"80",X"83", + X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D",X"75",X"6D",X"68",X"75",X"80",X"83",X"88", + X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D",X"80",X"80",X"75",X"68",X"5D",X"52",X"4A", + X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B",X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B", + X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62",X"65",X"70",X"78",X"7D",X"80",X"88",X"8B", + X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90",X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D", + X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"75", + X"75",X"70",X"75",X"6D",X"68",X"6D",X"70",X"78",X"80",X"83",X"80",X"83",X"88",X"90",X"8B",X"8B", + X"88",X"83",X"7D",X"78",X"75",X"6D",X"68",X"68",X"68",X"65",X"68",X"68",X"68",X"70",X"75",X"7D", + X"88",X"83",X"88",X"88",X"80",X"83",X"83",X"88",X"8B",X"88",X"88",X"88",X"83",X"80",X"7D",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"7D",X"75",X"75",X"75",X"75",X"70", + X"70",X"68",X"68",X"68",X"68",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"83",X"83",X"83",X"88", + X"88",X"90",X"98",X"98",X"93",X"90",X"90",X"8B",X"88",X"88",X"8B",X"88",X"80",X"78",X"78",X"75", + X"70",X"68",X"68",X"65",X"68",X"70",X"78",X"78",X"78",X"75",X"75",X"70",X"78",X"80",X"83",X"83", + X"80",X"7D",X"70",X"68",X"65",X"68",X"70",X"7D",X"83",X"83",X"83",X"80",X"75",X"70",X"68",X"65", + X"65",X"65",X"68",X"6D",X"70",X"78",X"7D",X"7D",X"7D",X"83",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"80",X"83",X"8B",X"90",X"93",X"93",X"8B",X"83",X"7D",X"78",X"70",X"6D",X"68",X"65",X"65",X"62", + X"65",X"68",X"70",X"7D",X"88",X"88",X"93",X"90",X"90",X"90",X"90",X"93",X"93",X"93",X"98",X"90", + X"88",X"80",X"78",X"78",X"75",X"78",X"80",X"88",X"90",X"90",X"93",X"8B",X"8B",X"88",X"7D",X"78", + X"6D",X"65",X"65",X"68",X"6D",X"75",X"80",X"83",X"88",X"88",X"88",X"83",X"83",X"83",X"83",X"80", + X"7D",X"80",X"7D",X"75",X"6D",X"68",X"5D",X"55",X"52",X"52",X"62",X"68",X"70",X"75",X"75",X"75", + X"78",X"7D",X"83",X"80",X"83",X"83",X"83",X"83",X"88",X"8B",X"90",X"98",X"98",X"9B",X"9B",X"93", + X"8B",X"83",X"7D",X"78",X"78",X"70",X"75",X"7D",X"80",X"80",X"83",X"80",X"80",X"75",X"70",X"68", + X"68",X"68",X"65",X"68",X"68",X"65",X"68",X"70",X"78",X"7D",X"88",X"88",X"88",X"83",X"83",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75", + X"75",X"7D",X"83",X"83",X"88",X"83",X"88",X"83",X"88",X"83",X"83",X"8B",X"88",X"8B",X"88",X"88", + X"80",X"7D",X"7D",X"75",X"6D",X"68",X"6D",X"70",X"7D",X"80",X"7D",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80", + X"83",X"83",X"80",X"80",X"7D",X"78",X"75",X"70",X"68",X"6D",X"75",X"78",X"7D",X"80",X"80",X"80", + X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"88",X"88",X"8B",X"8B",X"8B", + X"8B",X"88",X"83",X"83",X"80",X"78",X"75",X"75",X"70",X"70",X"75",X"75",X"80",X"83",X"80",X"83", + X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70", + X"75",X"75",X"78",X"7D",X"7D",X"80",X"80",X"83",X"83",X"83",X"83",X"88",X"83",X"83",X"83",X"88", + X"83",X"83",X"88",X"8B",X"88",X"88",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"80",X"80",X"80", + X"83",X"83",X"83",X"7D",X"7D",X"75",X"75",X"75",X"75",X"75",X"70",X"75",X"75",X"75",X"78",X"83", + X"80",X"83",X"80",X"7D",X"80",X"78",X"78",X"80",X"80",X"80",X"7D",X"80",X"80",X"80",X"7D",X"75", + X"70",X"68",X"68",X"68",X"68",X"68",X"70",X"75",X"7D",X"83",X"8B",X"90",X"90",X"8B",X"83",X"80", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70",X"75",X"75", + X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"7D",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"83",X"83", + X"8B",X"8B",X"8B",X"88",X"83",X"83",X"80",X"83",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"7D",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78", + X"78",X"78",X"78",X"78",X"7D",X"80",X"78",X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D", + X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"78",X"7D",X"78",X"7D",X"80",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80", + X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"78",X"80", + X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"75",X"75",X"83",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"88",X"83", + X"80",X"80",X"7D",X"78",X"75",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"75",X"75",X"78", + X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"78",X"78",X"78",X"75",X"75",X"75",X"70",X"75",X"75",X"7D",X"7D",X"80",X"80",X"80", + X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"78",X"78",X"7D", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"78", + X"78",X"78",X"78",X"78",X"78",X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83", + X"83",X"83",X"88",X"83",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"7D",X"78",X"78",X"78",X"75",X"75", + X"75",X"78",X"7D",X"78",X"83",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"78",X"78",X"78",X"78",X"75",X"75",X"75",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80", + X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"78", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"80",X"83",X"83",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"78",X"78",X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D",X"78",X"78",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"83",X"80",X"80",X"83",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"7D",X"80",X"80",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"7D",X"78",X"78",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..3ca80bee --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,790 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 12287) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AF",X"32",X"01",X"70",X"C3",X"50",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"AF",X"32", + X"01",X"70",X"21",X"00",X"42",X"11",X"00",X"58",X"01",X"80",X"00",X"ED",X"B0",X"CD",X"4F",X"01", + X"3A",X"01",X"40",X"87",X"28",X"12",X"D6",X"02",X"5F",X"16",X"00",X"21",X"E3",X"00",X"19",X"5E", + X"23",X"56",X"EB",X"11",X"98",X"00",X"D5",X"E9",X"CD",X"C4",X"26",X"CD",X"7F",X"01",X"21",X"07", + X"40",X"35",X"3A",X"00",X"78",X"CD",X"CA",X"01",X"3A",X"00",X"60",X"32",X"05",X"40",X"3A",X"00", + X"68",X"32",X"06",X"40",X"3A",X"00",X"40",X"87",X"28",X"1A",X"D6",X"02",X"5F",X"16",X"00",X"21", + X"0B",X"01",X"19",X"5E",X"23",X"56",X"21",X"0C",X"00",X"39",X"73",X"23",X"72",X"AF",X"32",X"00", + X"40",X"32",X"01",X"40",X"3E",X"FF",X"32",X"01",X"70",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1", + X"F1",X"ED",X"45",X"46",X"19",X"54",X"19",X"58",X"19",X"53",X"1E",X"67",X"1E",X"7B",X"1E",X"00", + X"09",X"00",X"09",X"8C",X"20",X"9F",X"20",X"B2",X"20",X"27",X"10",X"49",X"10",X"46",X"10",X"53", + X"10",X"96",X"18",X"A6",X"18",X"B0",X"18",X"00",X"09",X"C3",X"18",X"C7",X"18",X"00",X"09",X"CC", + X"1B",X"4A",X"1C",X"9B",X"1C",X"18",X"1D",X"AD",X"1D",X"4E",X"1F",X"00",X"09",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"00",X"00",X"BC",X"0F",X"00",X"00",X"00",X"00",X"D7", + X"1F",X"5E",X"15",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E6",X"11",X"00",X"00",X"25", + X"14",X"00",X"00",X"00",X"00",X"49",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"B2",X"08",X"0E", + X"06",X"21",X"FA",X"40",X"11",X"A1",X"53",X"CD",X"3C",X"07",X"21",X"40",X"41",X"11",X"41",X"52", + X"CD",X"3C",X"07",X"3A",X"08",X"40",X"3D",X"CA",X"73",X"01",X"21",X"3A",X"41",X"11",X"E1",X"50", + X"CD",X"3C",X"07",X"0E",X"02",X"21",X"0A",X"40",X"11",X"DF",X"52",X"CD",X"3C",X"07",X"C9",X"3A", + X"00",X"60",X"E6",X"01",X"57",X"3A",X"02",X"40",X"CB",X"27",X"B2",X"E6",X"0F",X"32",X"02",X"40", + X"FE",X"0C",X"C0",X"3A",X"00",X"68",X"E6",X"C0",X"07",X"07",X"FE",X"03",X"57",X"3A",X"03",X"60", + X"7A",X"CA",X"BE",X"01",X"3C",X"21",X"03",X"40",X"86",X"27",X"57",X"77",X"AF",X"ED",X"6F",X"C6", + X"58",X"32",X"0A",X"40",X"AF",X"ED",X"6F",X"C6",X"58",X"32",X"0B",X"40",X"72",X"C9",X"21",X"6F", + X"40",X"34",X"CB",X"46",X"3E",X"00",X"CA",X"A4",X"01",X"C9",X"21",X"04",X"40",X"3A",X"00",X"40", + X"A7",X"28",X"08",X"36",X"59",X"FE",X"06",X"38",X"02",X"36",X"4E",X"7E",X"FE",X"59",X"28",X"1A", + X"21",X"00",X"40",X"7E",X"FE",X"22",X"28",X"69",X"3A",X"00",X"40",X"D6",X"01",X"D8",X"5F",X"16", + X"00",X"21",X"67",X"02",X"19",X"7E",X"32",X"00",X"40",X"C9",X"3A",X"03",X"40",X"A7",X"28",X"E8", + X"3E",X"4E",X"77",X"3E",X"06",X"32",X"00",X"40",X"C9",X"3A",X"06",X"40",X"2F",X"57",X"3A",X"00", + X"68",X"A2",X"E6",X"03",X"C8",X"57",X"3D",X"28",X"05",X"3A",X"03",X"40",X"3D",X"C8",X"D5",X"AF", + X"06",X"03",X"21",X"F7",X"40",X"11",X"37",X"41",X"77",X"12",X"23",X"13",X"10",X"FA",X"3E",X"58", + X"06",X"06",X"21",X"FA",X"40",X"11",X"3A",X"41",X"77",X"12",X"23",X"13",X"10",X"FA",X"D1",X"7A", + X"32",X"08",X"40",X"21",X"03",X"40",X"7E",X"92",X"27",X"CD",X"AA",X"01",X"21",X"00",X"40",X"18", + X"97",X"3A",X"02",X"40",X"FE",X"0C",X"C2",X"09",X"02",X"3A",X"6F",X"40",X"E6",X"01",X"C2",X"09", + X"02",X"3E",X"06",X"32",X"00",X"40",X"C9",X"03",X"03",X"04",X"05",X"01",X"22",X"08",X"09",X"0A", + X"0B",X"1E",X"0E",X"14",X"10",X"19",X"1E",X"19",X"14",X"07",X"1E",X"01",X"3F",X"3F",X"3F",X"13", + X"1B",X"14",X"13",X"1E",X"07",X"07",X"0E",X"19",X"07",X"3A",X"0F",X"40",X"3C",X"32",X"0F",X"40", + X"CB",X"47",X"C8",X"0F",X"E6",X"07",X"57",X"0E",X"07",X"21",X"10",X"40",X"06",X"00",X"09",X"5E", + X"AF",X"83",X"28",X"1B",X"CB",X"5B",X"28",X"0B",X"E6",X"07",X"5F",X"7A",X"BB",X"DC",X"C4",X"02", + X"CD",X"C4",X"02",X"7B",X"E6",X"07",X"5F",X"7A",X"BB",X"DC",X"C4",X"02",X"CD",X"C4",X"02",X"0D", + X"F2",X"99",X"02",X"C9",X"D5",X"21",X"28",X"40",X"09",X"7E",X"3C",X"E6",X"07",X"77",X"57",X"21", + X"18",X"40",X"09",X"5E",X"7B",X"E6",X"C0",X"28",X"25",X"AF",X"82",X"28",X"1F",X"CB",X"47",X"28", + X"1D",X"7B",X"E6",X"C0",X"FE",X"40",X"28",X"3A",X"FE",X"80",X"28",X"12",X"7B",X"E6",X"07",X"CB", + X"57",X"C4",X"26",X"03",X"CD",X"63",X"21",X"83",X"5F",X"CD",X"4D",X"21",X"D1",X"C9",X"7B",X"E6", + X"07",X"CB",X"57",X"C4",X"26",X"03",X"6F",X"7B",X"E6",X"38",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F", + X"CB",X"57",X"C4",X"26",X"03",X"CD",X"63",X"21",X"82",X"57",X"7D",X"83",X"5F",X"CD",X"4D",X"21", + X"D1",X"C9",X"2E",X"00",X"18",X"E1",X"3E",X"FF",X"C9",X"06",X"07",X"21",X"20",X"40",X"58",X"16", + X"00",X"19",X"7E",X"6F",X"CD",X"BC",X"21",X"30",X"11",X"7B",X"85",X"5F",X"CD",X"86",X"21",X"7B", + X"FE",X"10",X"DC",X"B0",X"06",X"FE",X"F9",X"D4",X"B0",X"06",X"05",X"F2",X"2B",X"03",X"C9",X"3A", + X"09",X"40",X"A7",X"CA",X"6C",X"03",X"3A",X"00",X"70",X"E6",X"02",X"C2",X"6C",X"03",X"3A",X"06", + X"40",X"2F",X"21",X"00",X"68",X"A6",X"E6",X"10",X"C8",X"C3",X"77",X"03",X"3A",X"05",X"40",X"2F", + X"21",X"00",X"60",X"A6",X"E6",X"10",X"C8",X"06",X"06",X"CD",X"BC",X"21",X"7B",X"FE",X"A0",X"D2", + X"93",X"03",X"05",X"F2",X"79",X"03",X"06",X"06",X"CD",X"BC",X"21",X"D2",X"A0",X"03",X"05",X"F2", + X"88",X"03",X"C9",X"21",X"20",X"40",X"16",X"00",X"58",X"19",X"7E",X"A7",X"F2",X"82",X"03",X"C9", + X"3A",X"09",X"40",X"5F",X"16",X"00",X"21",X"F2",X"40",X"19",X"7E",X"3D",X"C2",X"C9",X"03",X"3A", + X"38",X"42",X"C6",X"7F",X"57",X"1E",X"D4",X"CD",X"86",X"21",X"3E",X"01",X"32",X"30",X"40",X"21", + X"20",X"40",X"58",X"16",X"00",X"19",X"36",X"FD",X"C9",X"3A",X"58",X"42",X"C6",X"08",X"C3",X"B4", + X"03",X"3A",X"09",X"40",X"A7",X"CA",X"22",X"04",X"3A",X"00",X"70",X"E6",X"02",X"C2",X"22",X"04", + X"3A",X"00",X"68",X"E6",X"0C",X"C8",X"CB",X"57",X"CA",X"2B",X"04",X"3E",X"FF",X"21",X"09",X"40", + X"5E",X"16",X"00",X"21",X"F2",X"40",X"19",X"56",X"15",X"CA",X"0D",X"04",X"21",X"58",X"42",X"11", + X"04",X"00",X"86",X"FE",X"10",X"C8",X"FE",X"E0",X"C8",X"77",X"19",X"77",X"C9",X"21",X"34",X"42", + X"86",X"FE",X"6A",X"C8",X"FE",X"96",X"C8",X"11",X"02",X"00",X"77",X"19",X"77",X"19",X"77",X"19", + X"77",X"C9",X"3A",X"00",X"60",X"E6",X"0C",X"C8",X"C3",X"E6",X"03",X"3E",X"01",X"C3",X"ED",X"03", + X"3A",X"09",X"40",X"4F",X"06",X"00",X"21",X"C0",X"40",X"09",X"3A",X"73",X"40",X"3C",X"E6",X"03", + X"32",X"73",X"40",X"C6",X"26",X"4F",X"09",X"11",X"FC",X"FF",X"06",X"04",X"7E",X"E5",X"CD",X"00", + X"09",X"FE",X"FF",X"C4",X"39",X"08",X"CC",X"26",X"08",X"E1",X"19",X"79",X"90",X"4F",X"F2",X"4C", + X"04",X"C9",X"0E",X"05",X"21",X"C0",X"40",X"3A",X"09",X"40",X"85",X"6F",X"5F",X"3E",X"00",X"8C", + X"67",X"57",X"23",X"23",X"E5",X"7E",X"23",X"46",X"6F",X"60",X"B0",X"CA",X"87",X"04",X"CB",X"41", + X"20",X"31",X"3E",X"DC",X"CD",X"39",X"08",X"E1",X"1A",X"BE",X"C2",X"9F",X"04",X"13",X"23",X"1A", + X"BE",X"C2",X"B8",X"04",X"13",X"13",X"13",X"23",X"23",X"23",X"0D",X"F2",X"74",X"04",X"C9",X"E5", + X"1A",X"6F",X"13",X"1A",X"67",X"CD",X"26",X"08",X"1B",X"E1",X"7E",X"12",X"23",X"13",X"7E",X"12", + X"C3",X"94",X"04",X"3E",X"04",X"C3",X"84",X"04",X"1B",X"2B",X"C3",X"9F",X"04",X"21",X"7A",X"40", + X"34",X"CA",X"05",X"05",X"21",X"7A",X"40",X"7E",X"E6",X"03",X"C6",X"A1",X"4F",X"21",X"50",X"41", + X"06",X"00",X"09",X"EB",X"21",X"F0",X"21",X"09",X"09",X"7E",X"23",X"46",X"6F",X"60",X"E6",X"1F", + X"47",X"3A",X"0D",X"40",X"80",X"FE",X"1E",X"D2",X"83",X"05",X"3A",X"0D",X"40",X"85",X"6F",X"3A", + X"09",X"40",X"A7",X"C2",X"A4",X"05",X"1A",X"E6",X"0F",X"3C",X"ED",X"44",X"77",X"79",X"D6",X"04", + X"4F",X"D2",X"CD",X"04",X"C9",X"11",X"0D",X"40",X"1A",X"C6",X"A7",X"6F",X"26",X"53",X"3E",X"FF", + X"01",X"E0",X"FF",X"77",X"09",X"77",X"09",X"77",X"09",X"77",X"09",X"77",X"23",X"09",X"77",X"09", + X"77",X"09",X"77",X"23",X"09",X"77",X"09",X"77",X"09",X"77",X"23",X"09",X"77",X"09",X"77",X"23", + X"09",X"77",X"09",X"77",X"2B",X"09",X"77",X"09",X"77",X"2B",X"09",X"77",X"09",X"77",X"09",X"77", + X"2B",X"09",X"77",X"09",X"77",X"09",X"77",X"2B",X"09",X"77",X"09",X"77",X"09",X"77",X"09",X"77", + X"09",X"77",X"EB",X"34",X"21",X"71",X"05",X"11",X"60",X"53",X"0E",X"10",X"CD",X"3C",X"07",X"21", + X"81",X"05",X"11",X"A0",X"50",X"0E",X"02",X"3A",X"08",X"40",X"3D",X"C4",X"3C",X"07",X"C3",X"C4", + X"04",X"59",X"6B",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"66",X"67",X"FF",X"6D",X"63",X"6A",X"6C", + X"65",X"5A",X"6B",X"3A",X"09",X"40",X"A7",X"C2",X"97",X"05",X"1A",X"E6",X"0F",X"C4",X"B5",X"05", + X"1A",X"E6",X"F0",X"12",X"C3",X"FD",X"04",X"1A",X"E6",X"F0",X"C4",X"BA",X"05",X"1A",X"E6",X"0F", + X"12",X"C3",X"FD",X"04",X"1A",X"E6",X"F0",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"3C", + X"ED",X"44",X"C3",X"FC",X"04",X"21",X"C0",X"40",X"35",X"C9",X"21",X"00",X"41",X"35",X"C9",X"21", + X"7B",X"40",X"34",X"CB",X"46",X"C8",X"3A",X"0C",X"40",X"FE",X"52",X"CA",X"E5",X"05",X"21",X"06", + X"42",X"01",X"02",X"00",X"35",X"09",X"35",X"09",X"35",X"09",X"35",X"7E",X"FE",X"A0",X"C0",X"3E", + X"52",X"32",X"0C",X"40",X"C9",X"21",X"06",X"42",X"01",X"02",X"00",X"34",X"09",X"34",X"09",X"34", + X"09",X"34",X"7E",X"FE",X"60",X"C0",X"3E",X"4C",X"32",X"0C",X"40",X"C9",X"3A",X"09",X"40",X"4F", + X"06",X"00",X"1E",X"5D",X"21",X"FC",X"40",X"3A",X"00",X"70",X"E6",X"01",X"CA",X"12",X"06",X"1E", + X"59",X"2B",X"09",X"7B",X"BE",X"C0",X"21",X"7C",X"40",X"59",X"79",X"07",X"07",X"4F",X"09",X"7E", + X"FE",X"4E",X"C8",X"3E",X"01",X"32",X"48",X"40",X"36",X"4E",X"21",X"F0",X"40",X"4B",X"09",X"34", + X"C3",X"55",X"07",X"3A",X"0E",X"40",X"3D",X"FA",X"43",X"06",X"4F",X"06",X"00",X"21",X"92",X"40", + X"09",X"36",X"21",X"0E",X"02",X"21",X"92",X"40",X"06",X"00",X"09",X"7E",X"A7",X"CA",X"7A",X"06", + X"35",X"7E",X"16",X"0C",X"FE",X"20",X"28",X"13",X"FE",X"10",X"28",X"0F",X"16",X"10",X"FE",X"18", + X"28",X"09",X"FE",X"08",X"28",X"05",X"A7",X"28",X"1A",X"18",X"0F",X"21",X"85",X"52",X"7A",X"11", + X"C0",X"FF",X"41",X"04",X"19",X"10",X"FD",X"CD",X"39",X"08",X"0D",X"F2",X"45",X"06",X"AF",X"32", + X"0E",X"40",X"C9",X"79",X"3D",X"3E",X"2E",X"21",X"05",X"52",X"CC",X"39",X"08",X"28",X"EB",X"79", + X"A7",X"3E",X"32",X"21",X"25",X"52",X"28",X"05",X"3E",X"2C",X"21",X"C5",X"51",X"77",X"23",X"3C", + X"77",X"79",X"A7",X"2E",X"45",X"28",X"02",X"2E",X"A5",X"3E",X"FF",X"77",X"23",X"77",X"18",X"CA", + X"D5",X"11",X"00",X"00",X"CD",X"86",X"21",X"D1",X"C9",X"F5",X"C5",X"E5",X"21",X"02",X"50",X"3E", + X"FF",X"0E",X"20",X"06",X"1D",X"77",X"23",X"10",X"FC",X"23",X"23",X"23",X"0D",X"C2",X"C3",X"06", + X"E1",X"C1",X"F1",X"C9",X"F5",X"C5",X"D5",X"E5",X"3A",X"09",X"40",X"4F",X"06",X"00",X"21",X"F9", + X"40",X"09",X"7E",X"83",X"27",X"77",X"2B",X"7E",X"8A",X"27",X"77",X"2B",X"7E",X"CE",X"00",X"27", + X"77",X"11",X"FA",X"40",X"EB",X"09",X"EB",X"06",X"03",X"4E",X"AF",X"ED",X"6F",X"C6",X"58",X"12", + X"13",X"AF",X"ED",X"6F",X"C6",X"58",X"12",X"13",X"71",X"23",X"10",X"ED",X"2B",X"D5",X"11",X"48", + X"41",X"EB",X"1A",X"96",X"27",X"1B",X"2B",X"1A",X"9E",X"27",X"1B",X"2B",X"1A",X"9E",X"27",X"DA", + X"36",X"07",X"01",X"03",X"00",X"EB",X"ED",X"B0",X"D1",X"1B",X"21",X"45",X"41",X"EB",X"01",X"06", + X"00",X"ED",X"B8",X"C3",X"37",X"07",X"E1",X"E1",X"D1",X"C1",X"F1",X"C9",X"F5",X"C5",X"D5",X"E5", + X"06",X"00",X"ED",X"A0",X"E2",X"50",X"07",X"7B",X"D6",X"21",X"5F",X"7A",X"98",X"57",X"18",X"F2", + X"E1",X"D1",X"C1",X"F1",X"C9",X"3A",X"09",X"40",X"4F",X"06",X"00",X"21",X"F0",X"40",X"09",X"56", + X"21",X"F2",X"40",X"09",X"7E",X"3D",X"C2",X"D2",X"07",X"15",X"CA",X"8A",X"07",X"15",X"CA",X"9F", + X"07",X"15",X"CA",X"B4",X"07",X"3E",X"E8",X"21",X"1A",X"52",X"CD",X"39",X"08",X"3E",X"EC",X"21", + X"1C",X"52",X"CD",X"39",X"08",X"16",X"02",X"C3",X"C6",X"07",X"3E",X"E0",X"21",X"1A",X"52",X"CD", + X"39",X"08",X"3E",X"E4",X"21",X"1C",X"52",X"CD",X"39",X"08",X"16",X"01",X"C3",X"C6",X"07",X"3E", + X"3C",X"21",X"1A",X"52",X"CD",X"39",X"08",X"3E",X"40",X"21",X"09",X"02",X"CD",X"39",X"08",X"16", + X"02",X"C3",X"C6",X"07",X"3E",X"34",X"21",X"1A",X"52",X"CD",X"39",X"08",X"3E",X"38",X"21",X"1C", + X"52",X"CD",X"39",X"08",X"16",X"07",X"06",X"1D",X"CD",X"ED",X"20",X"05",X"78",X"FE",X"19",X"20", + X"F7",X"C9",X"15",X"CA",X"E4",X"07",X"15",X"CA",X"EA",X"07",X"15",X"CA",X"F0",X"07",X"01",X"02", + X"3A",X"C3",X"F3",X"07",X"01",X"01",X"38",X"C3",X"F3",X"07",X"01",X"02",X"0F",X"C3",X"F3",X"07", + X"01",X"07",X"0D",X"21",X"59",X"42",X"70",X"23",X"71",X"04",X"21",X"5D",X"42",X"70",X"23",X"71", + X"23",X"7E",X"FE",X"E0",X"C2",X"10",X"08",X"3A",X"5B",X"42",X"FE",X"D0",X"C2",X"10",X"08",X"C9", + X"3A",X"34",X"42",X"C6",X"78",X"32",X"58",X"42",X"32",X"5C",X"42",X"3E",X"D0",X"32",X"5B",X"42", + X"3E",X"E0",X"32",X"5F",X"42",X"C9",X"F5",X"D5",X"E5",X"3E",X"FF",X"11",X"E0",X"FF",X"77",X"23", + X"77",X"19",X"77",X"2B",X"77",X"E1",X"D1",X"F1",X"C9",X"F5",X"D5",X"E5",X"C6",X"02",X"77",X"3C", + X"23",X"77",X"D6",X"02",X"11",X"E0",X"FF",X"19",X"77",X"3D",X"2B",X"77",X"E1",X"D1",X"F1",X"C9", + X"01",X"04",X"00",X"21",X"00",X"40",X"77",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"F9",X"06",X"80", + X"21",X"00",X"58",X"77",X"23",X"10",X"FC",X"16",X"58",X"21",X"FA",X"40",X"3E",X"03",X"06",X"06", + X"72",X"23",X"10",X"FC",X"3D",X"21",X"40",X"41",X"FE",X"02",X"28",X"F2",X"21",X"3A",X"41",X"FE", + X"01",X"28",X"EB",X"21",X"0A",X"40",X"72",X"23",X"72",X"3E",X"FF",X"01",X"04",X"00",X"21",X"00", + X"50",X"77",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"ED",X"5F",X"32",X"91",X"40",X"AF",X"32",X"06", + X"70",X"32",X"07",X"70",X"3E",X"FF",X"32",X"01",X"70",X"3E",X"05",X"32",X"00",X"40",X"00",X"18", + X"FD",X"C9",X"3E",X"22",X"32",X"00",X"40",X"C3",X"B7",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CD",X"B9",X"06",X"AF",X"32",X"0D",X"40",X"21",X"C1",X"40",X"3A",X"09",X"40",X"06",X"00",X"4F", + X"09",X"AF",X"06",X"0F",X"77",X"23",X"10",X"FC",X"3A",X"E3",X"51",X"FE",X"24",X"28",X"27",X"21", + X"E3",X"51",X"3E",X"24",X"0E",X"02",X"06",X"02",X"CD",X"39",X"08",X"C6",X"08",X"23",X"23",X"10", + X"F7",X"21",X"23",X"52",X"3E",X"28",X"0D",X"20",X"ED",X"21",X"06",X"42",X"06",X"04",X"36",X"00", + X"23",X"36",X"02",X"23",X"10",X"F8",X"16",X"06",X"06",X"05",X"3E",X"1E",X"CD",X"ED",X"20",X"16", + X"00",X"CD",X"DC",X"20",X"16",X"06",X"04",X"B8",X"C2",X"4C",X"09",X"16",X"05",X"06",X"1E",X"CD", + X"ED",X"20",X"3A",X"09",X"40",X"4F",X"06",X"00",X"21",X"F2",X"40",X"09",X"36",X"02",X"21",X"F4", + X"40",X"09",X"7E",X"FE",X"4E",X"CA",X"4C",X"0A",X"36",X"4E",X"21",X"C0",X"40",X"09",X"36",X"9E", + X"21",X"50",X"41",X"11",X"A6",X"09",X"CB",X"71",X"01",X"00",X"A6",X"C2",X"9A",X"09",X"ED",X"67", + X"1A",X"ED",X"6F",X"23",X"13",X"10",X"F7",X"C3",X"4C",X"0A",X"ED",X"6F",X"1A",X"ED",X"67",X"23", + X"13",X"10",X"F7",X"C3",X"4C",X"0A",X"06",X"06",X"06",X"06",X"06",X"06",X"00",X"06",X"06",X"06", + X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06", + X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06", + X"00",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06", + X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06", + X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"00",X"00",X"05",X"05",X"05",X"05",X"05",X"05",X"00", + X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05", + X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05", + X"05",X"05",X"05",X"00",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05", + X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05", + X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"00",X"00",X"06",X"00",X"CD",X"FF", + X"20",X"30",X"01",X"02",X"48",X"04",X"CD",X"FF",X"20",X"44",X"81",X"02",X"48",X"04",X"CD",X"FF", + X"20",X"70",X"01",X"02",X"70",X"04",X"CD",X"FF",X"20",X"84",X"81",X"02",X"70",X"04",X"CD",X"FF", + X"20",X"B4",X"01",X"06",X"40",X"04",X"CD",X"FF",X"20",X"C8",X"81",X"06",X"40",X"0E",X"00",X"CD", + X"63",X"21",X"CD",X"4C",X"0D",X"0E",X"02",X"CD",X"63",X"21",X"CD",X"4C",X"0D",X"0E",X"04",X"CD", + X"63",X"21",X"CD",X"4C",X"0D",X"3A",X"09",X"40",X"4F",X"06",X"00",X"21",X"F3",X"40",X"09",X"7E", + X"87",X"C6",X"10",X"21",X"10",X"40",X"06",X"06",X"77",X"23",X"10",X"FC",X"21",X"00",X"00",X"22", + X"28",X"40",X"22",X"2A",X"40",X"22",X"2C",X"40",X"22",X"C2",X"40",X"22",X"C4",X"40",X"22",X"C6", + X"40",X"22",X"92",X"40",X"AF",X"32",X"94",X"40",X"06",X"07",X"CD",X"B0",X"06",X"05",X"F2",X"CA", + X"0A",X"3E",X"FF",X"32",X"00",X"68",X"32",X"01",X"68",X"CD",X"55",X"07",X"3E",X"0C",X"32",X"01", + X"40",X"06",X"06",X"3A",X"09",X"40",X"6F",X"26",X"00",X"0E",X"05",X"CD",X"BC",X"21",X"D2",X"FB", + X"0A",X"CD",X"8B",X"26",X"DA",X"02",X"0B",X"0D",X"F2",X"EB",X"0A",X"05",X"F2",X"E9",X"0A",X"C3", + X"22",X"0B",X"CD",X"B0",X"06",X"C5",X"11",X"C2",X"40",X"79",X"E6",X"0E",X"4F",X"06",X"00",X"09", + X"19",X"7E",X"A7",X"C2",X"1C",X"0B",X"36",X"8C",X"C1",X"C3",X"FB",X"0A",X"36",X"8B",X"C1",X"C3", + X"FB",X"0A",X"06",X"06",X"CD",X"BC",X"21",X"38",X"07",X"05",X"F2",X"24",X"0B",X"C3",X"F3",X"0B", + X"7B",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"21",X"0D",X"40",X"96",X"FE",X"07",X"DA",X"29",X"0B", + X"5F",X"C5",X"7A",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"D6",X"02",X"47",X"80",X"80",X"4F",X"21", + X"9F",X"0B",X"06",X"00",X"09",X"7E",X"23",X"56",X"C1",X"4F",X"7B",X"B9",X"DA",X"29",X"0B",X"7A", + X"93",X"DA",X"29",X"0B",X"23",X"86",X"21",X"50",X"41",X"16",X"00",X"5F",X"19",X"3A",X"09",X"40", + X"0E",X"F0",X"A7",X"20",X"02",X"0E",X"0F",X"7E",X"A1",X"CA",X"29",X"0B",X"79",X"2F",X"A6",X"77", + X"CD",X"B0",X"06",X"11",X"10",X"00",X"CD",X"D4",X"06",X"3E",X"01",X"32",X"64",X"40",X"3A",X"09", + X"40",X"21",X"C0",X"40",X"5F",X"16",X"00",X"19",X"35",X"CA",X"AE",X"0E",X"C3",X"29",X"0B",X"07", + X"08",X"A4",X"07",X"09",X"A1",X"07",X"0A",X"9D",X"07",X"0B",X"98",X"07",X"0C",X"92",X"08",X"0D", + X"8C",X"08",X"0E",X"85",X"08",X"0E",X"7E",X"09",X"0F",X"76",X"09",X"0F",X"6F",X"09",X"0F",X"68", + X"0A",X"10",X"61",X"0A",X"10",X"5A",X"0B",X"10",X"53",X"0B",X"10",X"00",X"0A",X"10",X"07",X"0A", + X"10",X"0E",X"09",X"0F",X"15",X"09",X"0F",X"1C",X"09",X"0F",X"23",X"08",X"0E",X"2B",X"08",X"0E", + X"32",X"08",X"0D",X"39",X"07",X"0C",X"3F",X"07",X"0B",X"45",X"07",X"0A",X"4A",X"07",X"09",X"4E", + X"07",X"08",X"51",X"06",X"06",X"CD",X"29",X"26",X"DA",X"02",X"0C",X"05",X"F2",X"F5",X"0B",X"C3", + X"33",X"0C",X"CD",X"BC",X"21",X"CD",X"2E",X"24",X"7C",X"D6",X"50",X"85",X"16",X"02",X"FE",X"30", + X"38",X"0D",X"16",X"01",X"FE",X"50",X"38",X"07",X"16",X"03",X"FE",X"E0",X"38",X"01",X"15",X"21", + X"0E",X"40",X"72",X"CD",X"B0",X"06",X"3E",X"FF",X"32",X"7A",X"40",X"3E",X"01",X"32",X"50",X"40", + X"C3",X"FB",X"0B",X"06",X"05",X"CD",X"EB",X"25",X"DA",X"B5",X"0D",X"05",X"F2",X"35",X"0C",X"3A", + X"0D",X"40",X"FE",X"0A",X"DA",X"79",X"0C",X"0E",X"06",X"CD",X"63",X"21",X"7A",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"D6",X"02",X"4F",X"81",X"81",X"4F",X"16",X"03",X"06",X"00",X"21",X"9F",X"0B", + X"09",X"7E",X"23",X"96",X"ED",X"44",X"3C",X"23",X"46",X"CD",X"FE",X"25",X"DA",X"8A",X"0E",X"04", + X"3D",X"C2",X"69",X"0C",X"23",X"15",X"C2",X"61",X"0C",X"01",X"06",X"00",X"CD",X"63",X"21",X"EB", + X"0E",X"05",X"CD",X"63",X"21",X"7B",X"D6",X"E6",X"DA",X"B0",X"0C",X"D6",X"05",X"DA",X"A6",X"0C", + X"D6",X"10",X"DA",X"B0",X"0C",X"E5",X"21",X"C2",X"40",X"09",X"3A",X"09",X"40",X"16",X"00",X"5F", + X"19",X"70",X"E1",X"C3",X"B0",X"0C",X"7A",X"94",X"DA",X"B0",X"0C",X"D6",X"1E",X"DA",X"B8",X"0C", + X"0D",X"0D",X"F2",X"82",X"0C",X"C3",X"00",X"0D",X"E5",X"21",X"C1",X"40",X"09",X"3A",X"09",X"40", + X"16",X"00",X"5F",X"19",X"EB",X"E1",X"1A",X"A7",X"CA",X"B0",X"0C",X"13",X"1A",X"A7",X"C2",X"B0", + X"0C",X"3C",X"12",X"3E",X"05",X"B9",X"11",X"00",X"01",X"C4",X"EA",X"0C",X"11",X"00",X"03",X"CC", + X"EA",X"0C",X"3E",X"01",X"32",X"5C",X"40",X"C3",X"B0",X"0C",X"F5",X"E5",X"CD",X"D4",X"06",X"21", + X"C8",X"40",X"3A",X"09",X"40",X"5F",X"7A",X"C6",X"1E",X"16",X"00",X"19",X"77",X"E1",X"F1",X"C9", + X"3A",X"09",X"40",X"4F",X"06",X"00",X"21",X"C0",X"40",X"09",X"7E",X"A7",X"CA",X"AE",X"0E",X"0E", + X"00",X"CD",X"63",X"21",X"3E",X"50",X"BB",X"CA",X"37",X"0D",X"3E",X"51",X"BB",X"CA",X"37",X"0D", + X"3E",X"90",X"BB",X"CA",X"37",X"0D",X"3E",X"91",X"BB",X"CA",X"37",X"0D",X"0C",X"0C",X"3E",X"04", + X"B9",X"D2",X"11",X"0D",X"C3",X"E1",X"0A",X"3E",X"2F",X"CD",X"A8",X"24",X"E6",X"F0",X"C4",X"4C", + X"0D",X"21",X"58",X"40",X"7E",X"A7",X"20",X"E4",X"34",X"C3",X"2C",X"0D",X"F5",X"C5",X"D5",X"E5", + X"EB",X"41",X"0C",X"CD",X"63",X"21",X"7A",X"CB",X"3F",X"57",X"7C",X"CB",X"3F",X"82",X"C6",X"08", + X"67",X"0E",X"06",X"CD",X"63",X"21",X"7A",X"94",X"38",X"2F",X"16",X"49",X"FE",X"A0",X"D2",X"81", + X"0D",X"16",X"89",X"FE",X"40",X"D2",X"81",X"0D",X"16",X"C9",X"FE",X"10",X"D2",X"81",X"0D",X"16", + X"01",X"21",X"18",X"40",X"48",X"06",X"00",X"09",X"AF",X"32",X"01",X"40",X"72",X"23",X"72",X"3E", + X"0C",X"32",X"01",X"40",X"E1",X"D1",X"C1",X"F1",X"C9",X"ED",X"44",X"16",X"79",X"FE",X"A0",X"D2", + X"81",X"0D",X"16",X"B9",X"FE",X"40",X"D2",X"81",X"0D",X"16",X"F9",X"FE",X"10",X"D2",X"81",X"0D", + X"16",X"01",X"C3",X"81",X"0D",X"3E",X"0D",X"32",X"01",X"40",X"AF",X"32",X"58",X"40",X"48",X"06", + X"06",X"CD",X"B0",X"06",X"05",X"F2",X"C1",X"0D",X"3E",X"01",X"32",X"4C",X"40",X"79",X"E6",X"06", + X"4F",X"CD",X"63",X"21",X"EB",X"0C",X"CD",X"63",X"21",X"06",X"06",X"CD",X"DF",X"0F",X"CD",X"EB", + X"0F",X"CD",X"FD",X"0F",X"06",X"07",X"CD",X"DF",X"0F",X"CD",X"4D",X"21",X"0D",X"EB",X"CD",X"4D", + X"21",X"CD",X"FD",X"0F",X"06",X"01",X"CD",X"DF",X"0F",X"CD",X"EB",X"0F",X"CD",X"FD",X"0F",X"04", + X"CD",X"DF",X"0F",X"CD",X"4D",X"21",X"0C",X"EB",X"CD",X"4D",X"21",X"CD",X"FD",X"0F",X"06",X"06", + X"CD",X"DF",X"0F",X"CD",X"EB",X"0F",X"CD",X"FD",X"0F",X"04",X"CD",X"DF",X"0F",X"CD",X"4D",X"21", + X"0D",X"EB",X"CD",X"4D",X"21",X"CD",X"FD",X"0F",X"06",X"01",X"CD",X"DF",X"0F",X"CD",X"EB",X"0F", + X"CD",X"FD",X"0F",X"04",X"CD",X"DF",X"0F",X"CD",X"4D",X"21",X"0C",X"EB",X"CD",X"4D",X"21",X"CD", + X"FD",X"0F",X"04",X"CD",X"DF",X"0F",X"CD",X"EB",X"0F",X"CD",X"FD",X"0F",X"04",X"CD",X"DF",X"0F", + X"CD",X"4D",X"21",X"0D",X"EB",X"CD",X"4D",X"21",X"CD",X"FD",X"0F",X"11",X"00",X"00",X"0E",X"07", + X"CD",X"4D",X"21",X"0D",X"F2",X"60",X"0E",X"3A",X"09",X"40",X"4F",X"06",X"00",X"21",X"F0",X"40", + X"09",X"35",X"CD",X"B9",X"06",X"AF",X"32",X"00",X"68",X"32",X"01",X"68",X"06",X"0A",X"CD",X"FD", + X"0F",X"10",X"FB",X"3E",X"0E",X"32",X"00",X"40",X"18",X"FE",X"3E",X"0D",X"32",X"01",X"40",X"AF", + X"32",X"58",X"40",X"06",X"06",X"CD",X"B0",X"06",X"05",X"F2",X"95",X"0E",X"11",X"00",X"00",X"0E", + X"05",X"CD",X"4D",X"21",X"0D",X"F2",X"A1",X"0E",X"CD",X"09",X"11",X"C3",X"72",X"0E",X"AF",X"32", + X"01",X"40",X"06",X"06",X"CD",X"B0",X"06",X"05",X"F2",X"B4",X"0E",X"11",X"00",X"00",X"0E",X"05", + X"CD",X"4D",X"21",X"0D",X"F2",X"C0",X"0E",X"3E",X"0E",X"32",X"01",X"40",X"3A",X"06",X"42",X"A7", + X"20",X"FA",X"AF",X"32",X"01",X"40",X"06",X"00",X"CD",X"FF",X"20",X"80",X"09",X"02",X"18",X"04", + X"CD",X"FF",X"20",X"70",X"0A",X"02",X"18",X"04",X"CD",X"FF",X"20",X"80",X"0B",X"06",X"28",X"04", + X"CD",X"FF",X"20",X"70",X"0C",X"06",X"28",X"CD",X"B9",X"06",X"21",X"18",X"18",X"22",X"10",X"40", + X"22",X"12",X"40",X"21",X"00",X"00",X"22",X"14",X"40",X"21",X"01",X"01",X"22",X"18",X"40",X"22", + X"1A",X"40",X"3E",X"0F",X"32",X"01",X"40",X"3A",X"43",X"42",X"FE",X"50",X"38",X"F9",X"AF",X"32", + X"01",X"40",X"CD",X"FD",X"0F",X"CD",X"FD",X"0F",X"06",X"0F",X"16",X"05",X"CD",X"ED",X"20",X"21", + X"AE",X"0F",X"11",X"2F",X"52",X"0E",X"04",X"CD",X"3C",X"07",X"06",X"06",X"CD",X"FD",X"0F",X"10", + X"FB",X"CD",X"B9",X"06",X"3E",X"9F",X"CD",X"A8",X"24",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB", + X"3F",X"21",X"B2",X"0F",X"4F",X"06",X"00",X"09",X"7E",X"67",X"6F",X"22",X"18",X"40",X"22",X"1A", + X"40",X"21",X"1F",X"1F",X"22",X"10",X"40",X"22",X"12",X"40",X"3E",X"0F",X"32",X"01",X"40",X"06", + X"04",X"0E",X"03",X"CD",X"63",X"21",X"7A",X"FE",X"F0",X"D2",X"89",X"0F",X"7B",X"FE",X"03",X"DA", + X"89",X"0F",X"0D",X"F2",X"73",X"0F",X"C3",X"71",X"0F",X"11",X"10",X"00",X"CD",X"4D",X"21",X"21", + X"10",X"40",X"16",X"00",X"59",X"19",X"36",X"00",X"05",X"C2",X"82",X"0F",X"AF",X"32",X"01",X"40", + X"06",X"03",X"CD",X"FD",X"0F",X"10",X"FB",X"3E",X"0F",X"32",X"00",X"40",X"18",X"FE",X"FC",X"6A", + X"6A",X"64",X"79",X"49",X"38",X"08",X"7F",X"BF",X"8F",X"FF",X"CF",X"4F",X"3A",X"09",X"40",X"4F", + X"06",X"00",X"21",X"F0",X"40",X"09",X"7E",X"A7",X"16",X"12",X"CA",X"D9",X"0F",X"3A",X"0D",X"40", + X"FE",X"18",X"16",X"11",X"CA",X"D9",X"0F",X"16",X"10",X"21",X"00",X"40",X"72",X"18",X"FE",X"C5", + X"0E",X"06",X"CD",X"1B",X"24",X"0C",X"CD",X"1B",X"24",X"C1",X"C9",X"D5",X"C5",X"F5",X"4F",X"11", + X"00",X"00",X"CD",X"4D",X"21",X"0C",X"CD",X"4D",X"21",X"F1",X"C1",X"D1",X"C9",X"F5",X"3E",X"0D", + X"32",X"07",X"40",X"3A",X"07",X"40",X"A7",X"C2",X"03",X"10",X"F1",X"C9",X"F5",X"C5",X"E5",X"21", + X"50",X"41",X"06",X"00",X"09",X"06",X"0F",X"3A",X"09",X"40",X"A7",X"C2",X"20",X"10",X"06",X"F0", + X"7E",X"A0",X"77",X"E1",X"C1",X"F1",X"C9",X"CD",X"BD",X"04",X"CD",X"BF",X"10",X"CD",X"33",X"06", + X"CD",X"29",X"03",X"CD",X"4F",X"03",X"CD",X"FC",X"05",X"CD",X"89",X"02",X"CD",X"56",X"10",X"CD", + X"D1",X"03",X"CD",X"BF",X"05",X"C9",X"CD",X"BD",X"04",X"CD",X"33",X"06",X"CD",X"FC",X"05",X"CD", + X"BF",X"05",X"C9",X"C3",X"89",X"02",X"0E",X"05",X"21",X"C6",X"40",X"3A",X"09",X"40",X"5F",X"16", + X"00",X"19",X"7E",X"A7",X"CA",X"72",X"10",X"FE",X"8C",X"CA",X"7A",X"10",X"FE",X"01",X"CA",X"9B", + X"10",X"35",X"2B",X"2B",X"0D",X"0D",X"F2",X"62",X"10",X"C9",X"79",X"CB",X"3F",X"CB",X"3F",X"CB", + X"27",X"ED",X"44",X"C6",X"0A",X"47",X"CD",X"63",X"21",X"82",X"57",X"CD",X"4D",X"21",X"0D",X"90", + X"90",X"D6",X"14",X"57",X"CD",X"4D",X"21",X"0C",X"C3",X"71",X"10",X"CD",X"63",X"21",X"E5",X"EB", + X"0D",X"CD",X"63",X"21",X"79",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"ED",X"44",X"C6",X"10",X"82", + X"57",X"CD",X"4D",X"21",X"0C",X"C6",X"14",X"57",X"CD",X"4D",X"21",X"E1",X"C3",X"71",X"10",X"21", + X"C8",X"40",X"3A",X"09",X"40",X"4F",X"06",X"00",X"09",X"7E",X"A7",X"C8",X"FE",X"1F",X"30",X"07", + X"FE",X"01",X"CC",X"F2",X"10",X"35",X"C9",X"CD",X"F2",X"10",X"36",X"1E",X"D6",X"21",X"ED",X"44", + X"0E",X"06",X"CD",X"63",X"21",X"1E",X"F0",X"CD",X"2E",X"24",X"11",X"E0",X"FF",X"77",X"3C",X"19", + X"77",X"C9",X"F5",X"C5",X"D5",X"E5",X"21",X"1E",X"50",X"11",X"20",X"00",X"3E",X"FF",X"06",X"20", + X"77",X"19",X"10",X"FC",X"E1",X"D1",X"C1",X"F1",X"C9",X"3E",X"01",X"32",X"3A",X"40",X"21",X"09", + X"40",X"4E",X"06",X"00",X"21",X"F0",X"40",X"09",X"35",X"21",X"07",X"40",X"77",X"DD",X"21",X"50", + X"42",X"FD",X"21",X"7F",X"40",X"D6",X"02",X"FD",X"77",X"00",X"3E",X"02",X"CD",X"C9",X"11",X"3E", + X"05",X"CD",X"D6",X"11",X"DD",X"7E",X"08",X"FE",X"18",X"38",X"16",X"FE",X"D8",X"30",X"24",X"D6", + X"08",X"DD",X"77",X"00",X"DD",X"77",X"04",X"C6",X"10",X"DD",X"77",X"08",X"DD",X"77",X"0C",X"18", + X"22",X"3E",X"10",X"DD",X"77",X"00",X"DD",X"77",X"04",X"3E",X"20",X"DD",X"77",X"08",X"DD",X"77", + X"0C",X"18",X"10",X"3E",X"D0",X"DD",X"77",X"00",X"DD",X"77",X"04",X"3E",X"E0",X"DD",X"77",X"08", + X"DD",X"77",X"0C",X"DD",X"7E",X"0B",X"DD",X"77",X"03",X"DD",X"7E",X"0F",X"DD",X"77",X"07",X"CD", + X"FD",X"0F",X"FD",X"34",X"00",X"FD",X"7E",X"00",X"FE",X"0C",X"C8",X"E6",X"03",X"FE",X"01",X"28", + X"14",X"FE",X"02",X"28",X"1C",X"FE",X"03",X"28",X"24",X"3E",X"02",X"CD",X"C9",X"11",X"3E",X"05", + X"CD",X"D6",X"11",X"18",X"DA",X"3E",X"01",X"CD",X"C9",X"11",X"3E",X"11",X"CD",X"D6",X"11",X"18", + X"CE",X"3E",X"06",X"CD",X"C9",X"11",X"3E",X"05",X"CD",X"D6",X"11",X"18",X"C2",X"3E",X"07",X"CD", + X"C9",X"11",X"3E",X"11",X"CD",X"D6",X"11",X"18",X"B6",X"DD",X"77",X"02",X"DD",X"77",X"06",X"DD", + X"77",X"0A",X"DD",X"77",X"0E",X"C9",X"DD",X"77",X"09",X"3C",X"DD",X"77",X"0D",X"3C",X"DD",X"77", + X"01",X"3C",X"DD",X"77",X"05",X"C9",X"CD",X"B9",X"06",X"0E",X"07",X"11",X"00",X"00",X"CD",X"4D", + X"21",X"0D",X"F2",X"EE",X"11",X"21",X"F2",X"40",X"06",X"00",X"3A",X"09",X"40",X"4F",X"09",X"3E", + X"03",X"77",X"21",X"F3",X"40",X"09",X"46",X"3E",X"0A",X"3D",X"10",X"FD",X"32",X"95",X"40",X"3E", + X"18",X"32",X"75",X"40",X"3E",X"01",X"32",X"96",X"40",X"3E",X"0E",X"32",X"77",X"40",X"3E",X"0F", + X"32",X"78",X"40",X"CD",X"55",X"07",X"06",X"00",X"CD",X"FF",X"20",X"80",X"0B",X"06",X"28",X"04", + X"CD",X"FF",X"20",X"80",X"09",X"02",X"18",X"04",X"CD",X"FF",X"20",X"70",X"0C",X"06",X"28",X"04", + X"CD",X"FF",X"20",X"70",X"0A",X"02",X"18",X"11",X"05",X"0E",X"CD",X"7A",X"18",X"16",X"06",X"06", + X"1D",X"04",X"CD",X"ED",X"20",X"05",X"05",X"20",X"F8",X"AF",X"DD",X"21",X"00",X"42",X"DD",X"77", + X"06",X"DD",X"77",X"08",X"DD",X"77",X"0A",X"DD",X"77",X"0C",X"21",X"F1",X"40",X"06",X"00",X"3A", + X"09",X"40",X"4F",X"09",X"7E",X"CD",X"B4",X"13",X"21",X"FF",X"FF",X"22",X"00",X"68",X"22",X"01", + X"68",X"3E",X"01",X"32",X"72",X"40",X"32",X"79",X"40",X"3E",X"10",X"32",X"01",X"40",X"3E",X"0A", + X"CD",X"6F",X"18",X"BB",X"30",X"FA",X"AF",X"32",X"01",X"40",X"3E",X"06",X"CD",X"12",X"13",X"C6", + X"05",X"CD",X"0C",X"14",X"06",X"00",X"21",X"F1",X"40",X"3A",X"09",X"40",X"4F",X"09",X"7E",X"3D", + X"3E",X"12",X"28",X"02",X"3D",X"3D",X"32",X"01",X"40",X"CD",X"6F",X"18",X"7A",X"CB",X"7F",X"20", + X"17",X"FE",X"08",X"38",X"13",X"FE",X"15",X"30",X"10",X"7B",X"CB",X"7F",X"20",X"2B",X"FE",X"08", + X"38",X"27",X"FE",X"1A",X"30",X"24",X"18",X"4A",X"AF",X"F5",X"7B",X"FE",X"15",X"38",X"07",X"3E", + X"02",X"CD",X"12",X"13",X"18",X"05",X"3E",X"06",X"CD",X"12",X"13",X"3C",X"CD",X"0C",X"14",X"47", + X"F1",X"A7",X"78",X"28",X"18",X"C6",X"30",X"18",X"14",X"AF",X"F5",X"3E",X"06",X"CD",X"12",X"13", + X"C6",X"05",X"CD",X"0C",X"14",X"47",X"F1",X"A7",X"78",X"28",X"02",X"C6",X"06",X"32",X"72",X"40", + X"18",X"10",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CD",X"A8",X"24",X"CB",X"3F",X"CB",X"3F",X"CB", + X"3F",X"C9",X"06",X"07",X"0E",X"13",X"05",X"CD",X"B4",X"26",X"DC",X"64",X"13",X"04",X"0D",X"3E", + X"0D",X"B9",X"20",X"02",X"0E",X"07",X"3E",X"FF",X"B9",X"20",X"EB",X"10",X"E7",X"06",X"07",X"05", + X"CD",X"32",X"26",X"DA",X"8F",X"13",X"04",X"10",X"F6",X"06",X"0E",X"05",X"CD",X"0F",X"26",X"DA", + X"E5",X"13",X"04",X"10",X"F6",X"06",X"07",X"05",X"CD",X"20",X"26",X"DA",X"E5",X"13",X"04",X"10", + X"F6",X"C3",X"B9",X"12",X"21",X"20",X"40",X"58",X"16",X"00",X"19",X"7E",X"CB",X"7F",X"28",X"0B", + X"F5",X"3E",X"01",X"32",X"60",X"40",X"F1",X"ED",X"44",X"77",X"C9",X"57",X"79",X"FE",X"11",X"C8", + X"FE",X"10",X"C8",X"FE",X"05",X"C8",X"FE",X"04",X"C8",X"FE",X"03",X"C8",X"7A",X"18",X"E1",X"3E", + X"01",X"32",X"50",X"40",X"11",X"00",X"00",X"CD",X"86",X"21",X"21",X"F1",X"40",X"06",X"00",X"3A", + X"09",X"40",X"4F",X"09",X"34",X"7E",X"FE",X"02",X"28",X"31",X"CD",X"B4",X"13",X"FE",X"01",X"28", + X"1E",X"C3",X"46",X"13",X"21",X"C5",X"13",X"4F",X"09",X"46",X"DD",X"21",X"42",X"42",X"DD",X"70", + X"00",X"DD",X"70",X"08",X"C9",X"06",X"06",X"07",X"01",X"06",X"07",X"01",X"03",X"04",X"06",X"AF", + X"32",X"7F",X"40",X"3E",X"12",X"32",X"01",X"40",X"C3",X"46",X"13",X"CD",X"FB",X"13",X"CD",X"C1", + X"14",X"3E",X"19",X"18",X"08",X"CD",X"FB",X"13",X"CD",X"09",X"11",X"3E",X"1A",X"21",X"00",X"00", + X"22",X"00",X"68",X"22",X"01",X"68",X"32",X"00",X"40",X"18",X"FE",X"AF",X"32",X"01",X"40",X"11", + X"00",X"00",X"06",X"07",X"05",X"CD",X"86",X"21",X"04",X"10",X"F9",X"C9",X"21",X"15",X"14",X"16", + X"00",X"5F",X"19",X"7E",X"C9",X"07",X"CF",X"8F",X"4F",X"08",X"49",X"89",X"C9",X"01",X"F9",X"B9", + X"79",X"38",X"7F",X"BF",X"FF",X"21",X"F0",X"40",X"06",X"00",X"3A",X"09",X"40",X"4F",X"09",X"7E", + X"FE",X"00",X"28",X"0D",X"23",X"7E",X"FE",X"0A",X"28",X"0B",X"3E",X"1D",X"32",X"00",X"40",X"18", + X"FE",X"3E",X"1B",X"18",X"F7",X"3E",X"1C",X"18",X"F3",X"3A",X"08",X"40",X"3D",X"28",X"3E",X"3A", + X"09",X"40",X"A7",X"20",X"03",X"3E",X"40",X"CB",X"AF",X"32",X"09",X"40",X"21",X"F0",X"40",X"4F", + X"06",X"00",X"09",X"7E",X"A7",X"79",X"28",X"E1",X"21",X"00",X"70",X"CB",X"4E",X"20",X"0F",X"A7", + X"28",X"05",X"01",X"01",X"01",X"18",X"03",X"01",X"00",X"00",X"ED",X"43",X"06",X"70",X"CD",X"B9", + X"06",X"11",X"00",X"00",X"0E",X"07",X"CD",X"4D",X"21",X"0D",X"F2",X"86",X"14",X"21",X"F2",X"40", + X"06",X"00",X"4F",X"09",X"46",X"3E",X"1E",X"80",X"32",X"00",X"40",X"18",X"FE",X"21",X"7F",X"40", + X"34",X"7E",X"E6",X"F0",X"BE",X"C0",X"DD",X"E5",X"7E",X"E6",X"E0",X"BE",X"DD",X"21",X"42",X"42", + X"28",X"0B",X"3E",X"02",X"DD",X"77",X"00",X"DD",X"77",X"08",X"DD",X"E1",X"C9",X"3E",X"04",X"18", + X"F3",X"3E",X"01",X"32",X"3A",X"40",X"21",X"07",X"40",X"77",X"DD",X"21",X"40",X"42",X"FD",X"21", + X"7F",X"40",X"D6",X"02",X"FD",X"77",X"00",X"3E",X"02",X"CD",X"41",X"15",X"3E",X"05",X"CD",X"4E", + X"15",X"DD",X"7E",X"00",X"DD",X"77",X"10",X"D6",X"10",X"DD",X"77",X"14",X"DD",X"7E",X"03",X"C6", + X"10",X"DD",X"77",X"13",X"DD",X"77",X"17",X"CD",X"FD",X"0F",X"FD",X"34",X"00",X"FD",X"7E",X"00", + X"FE",X"0C",X"C8",X"E6",X"03",X"FE",X"01",X"28",X"14",X"FE",X"02",X"28",X"1C",X"FE",X"03",X"28", + X"24",X"3E",X"02",X"CD",X"41",X"15",X"3E",X"05",X"CD",X"4E",X"15",X"18",X"DA",X"3E",X"01",X"CD", + X"41",X"15",X"3E",X"11",X"CD",X"4E",X"15",X"18",X"CE",X"3E",X"06",X"CD",X"41",X"15",X"3E",X"05", + X"CD",X"4E",X"15",X"18",X"C2",X"3E",X"07",X"CD",X"41",X"15",X"3E",X"11",X"CD",X"4E",X"15",X"18", + X"B6",X"DD",X"77",X"12",X"DD",X"77",X"16",X"DD",X"77",X"0A",X"DD",X"77",X"02",X"C9",X"DD",X"77", + X"01",X"3C",X"DD",X"77",X"11",X"3C",X"DD",X"77",X"09",X"3C",X"DD",X"77",X"15",X"C9",X"CD",X"B9", + X"06",X"06",X"08",X"11",X"00",X"00",X"48",X"0D",X"CD",X"4D",X"21",X"10",X"F9",X"3E",X"1F",X"3D", + X"47",X"16",X"00",X"CD",X"DC",X"20",X"16",X"03",X"CD",X"ED",X"20",X"FE",X"02",X"20",X"F0",X"3A", + X"09",X"40",X"FE",X"00",X"28",X"05",X"21",X"AA",X"16",X"18",X"03",X"21",X"A1",X"16",X"22",X"8E", + X"40",X"3E",X"0C",X"32",X"7F",X"40",X"AF",X"32",X"8A",X"40",X"3E",X"18",X"32",X"8B",X"40",X"3E", + X"E0",X"32",X"8C",X"40",X"3E",X"E8",X"32",X"8D",X"40",X"3E",X"14",X"32",X"01",X"40",X"3A",X"01", + X"40",X"FE",X"00",X"20",X"F9",X"3E",X"7D",X"32",X"07",X"40",X"3A",X"07",X"40",X"A7",X"20",X"FA", + X"3A",X"F0",X"40",X"A7",X"20",X"1D",X"3A",X"08",X"40",X"3D",X"28",X"06",X"3A",X"30",X"41",X"A7", + X"20",X"11",X"21",X"00",X"00",X"22",X"06",X"70",X"AF",X"32",X"F2",X"40",X"32",X"32",X"41",X"3E", + X"05",X"18",X"02",X"3E",X"14",X"32",X"00",X"40",X"18",X"FE",X"21",X"07",X"40",X"7E",X"E6",X"F8", + X"BE",X"C0",X"3A",X"8A",X"40",X"32",X"82",X"40",X"3A",X"8B",X"40",X"32",X"83",X"40",X"CD",X"51", + X"16",X"3A",X"8C",X"40",X"32",X"82",X"40",X"CD",X"51",X"16",X"3E",X"60",X"32",X"82",X"40",X"3A", + X"8D",X"40",X"32",X"83",X"40",X"CD",X"51",X"16",X"21",X"8A",X"40",X"CD",X"5A",X"16",X"21",X"8B", + X"40",X"CD",X"66",X"16",X"21",X"99",X"16",X"CD",X"54",X"16",X"21",X"8C",X"40",X"CD",X"62",X"16", + X"21",X"9D",X"16",X"CD",X"54",X"16",X"3E",X"60",X"32",X"82",X"40",X"21",X"8D",X"40",X"CD",X"6E", + X"16",X"2A",X"8E",X"40",X"CD",X"54",X"16",X"21",X"7F",X"40",X"35",X"C0",X"AF",X"32",X"01",X"40", + X"C9",X"21",X"90",X"16",X"22",X"80",X"40",X"C3",X"72",X"16",X"3E",X"08",X"86",X"77",X"32",X"82", + X"40",X"C9",X"3E",X"F8",X"18",X"F6",X"3E",X"08",X"86",X"77",X"32",X"83",X"40",X"C9",X"3E",X"F8", + X"18",X"F6",X"2A",X"80",X"40",X"3A",X"82",X"40",X"57",X"3A",X"83",X"40",X"5F",X"E5",X"CD",X"2E", + X"24",X"EB",X"E1",X"01",X"E0",X"FF",X"7E",X"A7",X"C8",X"12",X"EB",X"09",X"EB",X"23",X"18",X"F6", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"6E",X"66",X"65",X"00",X"65",X"69",X"64", + X"00",X"6B",X"68",X"62",X"70",X"65",X"6C",X"FF",X"59",X"00",X"6B",X"68",X"62",X"70",X"65",X"6C", + X"FF",X"5A",X"00",X"3A",X"71",X"40",X"CB",X"7F",X"20",X"44",X"FE",X"1C",X"30",X"40",X"3A",X"70", + X"40",X"CB",X"7F",X"20",X"39",X"FE",X"02",X"38",X"35",X"FE",X"1F",X"30",X"31",X"3A",X"71",X"40", + X"CB",X"27",X"CB",X"27",X"CB",X"27",X"57",X"3A",X"70",X"40",X"CB",X"27",X"CB",X"27",X"CB",X"27", + X"5F",X"0E",X"02",X"CD",X"4D",X"21",X"C6",X"F0",X"5F",X"0C",X"CD",X"4D",X"21",X"7A",X"C6",X"10", + X"57",X"0D",X"0D",X"CD",X"4D",X"21",X"7B",X"C6",X"10",X"5F",X"0D",X"C3",X"4D",X"21",X"11",X"00", + X"00",X"0E",X"00",X"CD",X"4D",X"21",X"0C",X"CD",X"4D",X"21",X"0C",X"CD",X"4D",X"21",X"0C",X"C3", + X"4D",X"21",X"21",X"96",X"40",X"35",X"7E",X"A7",X"28",X"14",X"21",X"77",X"40",X"46",X"21",X"78", + X"40",X"4E",X"CD",X"6F",X"18",X"7A",X"B8",X"20",X"32",X"7B",X"B9",X"C8",X"18",X"2D",X"3A",X"95", + X"40",X"CB",X"27",X"CB",X"27",X"77",X"3A",X"7E",X"40",X"A7",X"20",X"04",X"3E",X"30",X"18",X"01", + X"AF",X"32",X"7E",X"40",X"21",X"74",X"40",X"34",X"7E",X"FE",X"0E",X"20",X"02",X"AF",X"77",X"21", + X"75",X"40",X"35",X"7E",X"FE",X"0D",X"20",X"03",X"3E",X"17",X"77",X"3A",X"76",X"40",X"06",X"00", + X"4F",X"DD",X"21",X"83",X"23",X"DD",X"09",X"3A",X"09",X"40",X"4F",X"21",X"C0",X"40",X"09",X"7E", + X"CB",X"7F",X"20",X"13",X"3A",X"77",X"40",X"DD",X"86",X"01",X"57",X"3A",X"78",X"40",X"DD",X"86", + X"00",X"5F",X"3E",X"FF",X"CD",X"83",X"18",X"DD",X"23",X"DD",X"23",X"23",X"04",X"3E",X"18",X"B8", + X"20",X"DD",X"CD",X"6F",X"18",X"06",X"00",X"3A",X"7E",X"40",X"32",X"76",X"40",X"4F",X"DD",X"21", + X"83",X"23",X"DD",X"09",X"7A",X"32",X"77",X"40",X"7B",X"32",X"78",X"40",X"3A",X"09",X"40",X"4F", + X"21",X"C0",X"40",X"09",X"3A",X"77",X"40",X"DD",X"86",X"01",X"57",X"FA",X"F0",X"17",X"FE",X"02", + X"38",X"2E",X"FE",X"1E",X"30",X"2A",X"3A",X"78",X"40",X"DD",X"86",X"00",X"5F",X"FA",X"F0",X"17", + X"FE",X"02",X"38",X"1C",X"FE",X"1F",X"30",X"18",X"3A",X"74",X"40",X"B8",X"28",X"0A",X"3A",X"75", + X"40",X"B8",X"28",X"04",X"3E",X"54",X"18",X"02",X"3E",X"56",X"77",X"CD",X"83",X"18",X"18",X"03", + X"3E",X"FF",X"77",X"DD",X"23",X"DD",X"23",X"23",X"04",X"3E",X"18",X"B8",X"20",X"B6",X"C9",X"21", + X"79",X"40",X"35",X"7E",X"A7",X"C0",X"3A",X"95",X"40",X"77",X"21",X"90",X"40",X"7E",X"3C",X"E6", + X"07",X"77",X"57",X"21",X"72",X"40",X"5E",X"7B",X"E6",X"C0",X"28",X"27",X"AF",X"82",X"CA",X"B3", + X"16",X"CB",X"47",X"28",X"1E",X"7B",X"E6",X"C0",X"FE",X"40",X"28",X"3C",X"FE",X"80",X"28",X"13", + X"7B",X"E6",X"07",X"CB",X"57",X"C4",X"6C",X"18",X"CD",X"6F",X"18",X"83",X"5F",X"CD",X"7A",X"18", + X"C3",X"B3",X"16",X"7B",X"E6",X"07",X"CB",X"57",X"C4",X"6C",X"18",X"6F",X"7B",X"E6",X"38",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"57",X"C4",X"6C",X"18",X"CD",X"6F",X"18",X"82",X"57",X"7D", + X"83",X"5F",X"CD",X"7A",X"18",X"C3",X"B3",X"16",X"2E",X"00",X"18",X"E0",X"3E",X"FF",X"C9",X"E5", + X"21",X"71",X"40",X"56",X"21",X"70",X"40",X"5E",X"E1",X"C9",X"21",X"71",X"40",X"72",X"21",X"70", + X"40",X"73",X"C9",X"CB",X"22",X"CB",X"22",X"CB",X"22",X"CB",X"23",X"CB",X"23",X"CB",X"23",X"E5", + X"CD",X"2E",X"24",X"77",X"E1",X"C9",X"CD",X"FF",X"17",X"CD",X"12",X"17",X"CD",X"D1",X"03",X"CD", + X"4F",X"03",X"CD",X"29",X"03",X"C9",X"CD",X"D1",X"03",X"CD",X"4F",X"03",X"CD",X"29",X"03",X"C9", + X"CD",X"FF",X"17",X"CD",X"12",X"17",X"CD",X"D1",X"03",X"CD",X"4F",X"03",X"CD",X"29",X"03",X"CD", + X"9D",X"14",X"C9",X"CD",X"EA",X"15",X"C9",X"CD",X"95",X"24",X"CD",X"C5",X"20",X"21",X"06",X"70", + X"AF",X"77",X"23",X"77",X"06",X"1F",X"16",X"06",X"CD",X"ED",X"20",X"06",X"16",X"16",X"02",X"CD", + X"ED",X"20",X"04",X"CD",X"ED",X"20",X"21",X"C1",X"1A",X"22",X"88",X"40",X"21",X"C6",X"52",X"22", + X"BE",X"40",X"3E",X"01",X"32",X"04",X"70",X"CD",X"BB",X"19",X"CD",X"92",X"19",X"3E",X"01",X"32", + X"01",X"40",X"3A",X"0C",X"42",X"FE",X"4F",X"20",X"F9",X"3E",X"02",X"32",X"01",X"40",X"3A",X"0C", + X"42",X"A7",X"20",X"FA",X"06",X"7D",X"CD",X"06",X"1A",X"21",X"C6",X"52",X"22",X"BE",X"40",X"3E", + X"02",X"32",X"01",X"40",X"3A",X"0C",X"42",X"FE",X"B7",X"20",X"F9",X"3E",X"03",X"32",X"01",X"40", + X"3A",X"0C",X"42",X"FE",X"57",X"20",X"F9",X"06",X"82",X"CD",X"06",X"1A",X"AF",X"32",X"01",X"40", + X"3C",X"32",X"00",X"40",X"18",X"FE",X"3A",X"12",X"42",X"E6",X"07",X"20",X"03",X"CD",X"66",X"19", + X"CD",X"81",X"19",X"C9",X"CD",X"81",X"19",X"C9",X"3A",X"0C",X"42",X"E6",X"07",X"20",X"03",X"CD", + X"A0",X"19",X"CD",X"81",X"19",X"C9",X"2A",X"88",X"40",X"ED",X"5B",X"BE",X"40",X"06",X"08",X"7E", + X"12",X"23",X"13",X"10",X"FA",X"22",X"88",X"40",X"EB",X"11",X"D8",X"FF",X"19",X"22",X"BE",X"40", + X"C9",X"3A",X"0C",X"42",X"57",X"15",X"0E",X"08",X"06",X"06",X"CD",X"DC",X"20",X"04",X"0D",X"20", + X"F9",X"C9",X"0E",X"08",X"06",X"06",X"16",X"B0",X"CD",X"DC",X"20",X"04",X"0D",X"20",X"F9",X"C9", + X"2A",X"BE",X"40",X"06",X"08",X"36",X"FF",X"23",X"10",X"FB",X"11",X"D8",X"FF",X"19",X"22",X"BE", + X"40",X"C9",X"06",X"08",X"0A",X"0C",X"01",X"07",X"09",X"0B",X"0D",X"21",X"B2",X"19",X"0E",X"04", + X"16",X"01",X"46",X"CD",X"ED",X"20",X"0D",X"23",X"20",X"F8",X"0E",X"05",X"16",X"03",X"46",X"CD", + X"ED",X"20",X"0D",X"23",X"20",X"F8",X"11",X"2C",X"1A",X"21",X"60",X"53",X"CD",X"FB",X"19",X"11", + X"29",X"1B",X"21",X"D6",X"52",X"CD",X"FB",X"19",X"11",X"33",X"1B",X"21",X"17",X"53",X"CD",X"FB", + X"19",X"11",X"45",X"1A",X"21",X"BF",X"53",X"CD",X"FB",X"19",X"C9",X"01",X"E0",X"FF",X"1A",X"A7", + X"C8",X"77",X"09",X"13",X"18",X"F5",X"AF",X"32",X"01",X"40",X"78",X"32",X"07",X"40",X"3A",X"07", + X"40",X"A7",X"20",X"FA",X"C9",X"E5",X"D5",X"C5",X"21",X"00",X"50",X"06",X"00",X"09",X"11",X"20", + X"00",X"06",X"20",X"36",X"FF",X"19",X"10",X"FB",X"C1",X"D1",X"E1",X"C9",X"59",X"6B",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"66",X"67",X"FF",X"6D",X"63",X"6A",X"6C",X"65",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"5A",X"6B",X"00",X"63",X"6C",X"65",X"64",X"67",X"6E",X"00",X"6B",X"6A",X"67",X"69", + X"6E",X"6D",X"FF",X"00",X"6F",X"68",X"62",X"63",X"55",X"FF",X"66",X"6A",X"68",X"65",X"00",X"6F", + X"6A",X"69",X"FD",X"6D",X"FF",X"6B",X"6A",X"67",X"69",X"6E",X"00",X"62",X"64",X"64",X"FF",X"59", + X"FF",X"6C",X"6A",X"63",X"55",X"65",X"6E",X"00",X"63",X"67",X"6E",X"70",X"FF",X"6C",X"65",X"6D", + X"63",X"FD",X"65",X"FF",X"00",X"67",X"69",X"6D",X"65",X"6C",X"6E",X"FF",X"63",X"6A",X"67",X"69", + X"00",X"59",X"FF",X"6A",X"6C",X"FF",X"5A",X"FF",X"6B",X"68",X"62",X"70",X"65",X"6C",X"6D",X"FF", + X"00",X"6B",X"FD",X"6D",X"66",X"00",X"6B",X"68",X"62",X"70",X"00",X"6A",X"69",X"68",X"70",X"FF", + X"59",X"FF",X"6B",X"68",X"62",X"70",X"65",X"6C",X"FF",X"00",X"6F",X"FD",X"6E",X"6E",X"6A",X"69", + X"00",X"FF",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"90",X"FF",X"FF",X"91",X"92",X"93",X"94",X"95", + X"96",X"FF",X"97",X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"FF",X"9E",X"9F",X"A0",X"A1",X"A2",X"A3", + X"A4",X"FF",X"A5",X"A6",X"A7",X"A8",X"A9",X"AA",X"AB",X"FF",X"AC",X"AD",X"AE",X"AF",X"B0",X"B1", + X"B2",X"FF",X"B3",X"B4",X"B5",X"B6",X"B7",X"B8",X"FF",X"B9",X"BA",X"BB",X"BC",X"BD",X"BE",X"BF", + X"FF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"FF",X"FF",X"C6",X"C7",X"C8",X"C9",X"CA",X"CB",X"FF", + X"FF",X"CC",X"CD",X"CE",X"CF",X"D0",X"D1",X"FF",X"FF",X"D2",X"D3",X"D4",X"D5",X"D6",X"FF",X"FF", + X"FF",X"D7",X"D8",X"D9",X"DA",X"DB",X"FF",X"FF",X"FF",X"78",X"7A",X"7C",X"7E",X"80",X"82",X"84", + X"86",X"88",X"00",X"71",X"FF",X"79",X"7B",X"7D",X"7F",X"81",X"83",X"85",X"87",X"89",X"FF",X"72", + X"73",X"74",X"75",X"76",X"77",X"00",X"FD",X"FE",X"6A",X"00",X"59",X"58",X"FF",X"00",X"5A",X"58", + X"FF",X"00",X"5B",X"58",X"FF",X"00",X"5D",X"58",X"FF",X"00",X"5E",X"58",X"FF",X"00",X"59",X"58", + X"58",X"FF",X"00",X"5B",X"58",X"58",X"FF",X"00",X"5D",X"58",X"58",X"FF",X"00",X"FF",X"5D",X"58", + X"58",X"58",X"FF",X"00",X"59",X"58",X"58",X"58",X"58",X"FF",X"00",X"59",X"FF",X"63",X"6A",X"67", + X"69",X"FF",X"FF",X"59",X"FF",X"6B",X"68",X"62",X"70",X"00",X"59",X"FF",X"63",X"6A",X"67",X"69", + X"FF",X"FF",X"5A",X"FF",X"6B",X"68",X"62",X"70",X"6D",X"00",X"59",X"FF",X"63",X"6A",X"67",X"69", + X"FF",X"FF",X"5B",X"FF",X"6B",X"68",X"62",X"70",X"6D",X"00",X"5A",X"FF",X"63",X"6A",X"67",X"69", + X"6D",X"FF",X"FF",X"59",X"FF",X"6B",X"68",X"62",X"70",X"00",X"F1",X"F2",X"F3",X"F4",X"F5",X"F6", + X"F7",X"00",X"F0",X"F4",X"F4",X"F4",X"F4",X"F4",X"F4",X"F4",X"F8",X"00",X"CD",X"95",X"24",X"CD", + X"96",X"1F",X"CD",X"A9",X"1F",X"CD",X"D0",X"20",X"CD",X"B6",X"1F",X"11",X"54",X"1A",X"21",X"8A", + X"52",X"CD",X"C1",X"1F",X"06",X"04",X"CD",X"FF",X"20",X"68",X"02",X"02",X"68",X"11",X"4A",X"1B", + X"21",X"CD",X"51",X"CD",X"C1",X"1F",X"11",X"4C",X"1A",X"CD",X"C1",X"1F",X"06",X"00",X"CD",X"FF", + X"20",X"38",X"01",X"01",X"80",X"06",X"01",X"CD",X"FF",X"20",X"60",X"37",X"01",X"80",X"11",X"5E", + X"1B",X"21",X"F1",X"51",X"CD",X"C1",X"1F",X"11",X"4C",X"1A",X"CD",X"C1",X"1F",X"06",X"02",X"CD", + X"FF",X"20",X"3A",X"01",X"06",X"A0",X"06",X"03",X"CD",X"FF",X"20",X"5E",X"37",X"06",X"A0",X"11", + X"63",X"1B",X"21",X"F5",X"51",X"CD",X"C1",X"1F",X"11",X"4C",X"1A",X"CD",X"C1",X"1F",X"06",X"82", + X"CD",X"06",X"1A",X"3E",X"03",X"32",X"00",X"40",X"18",X"FE",X"CD",X"B9",X"06",X"CD",X"B6",X"1F", + X"11",X"5F",X"1A",X"21",X"AD",X"52",X"CD",X"C1",X"1F",X"3A",X"00",X"70",X"CB",X"47",X"28",X"05", + X"11",X"74",X"1B",X"18",X"03",X"11",X"6D",X"1B",X"21",X"6F",X"53",X"CD",X"C1",X"1F",X"11",X"4C", + X"1A",X"CD",X"C1",X"1F",X"11",X"6B",X"1A",X"CD",X"C1",X"1F",X"11",X"78",X"1A",X"21",X"51",X"53", + X"CD",X"C1",X"1F",X"11",X"68",X"1B",X"CD",X"C1",X"1F",X"11",X"4C",X"1A",X"CD",X"C1",X"1F",X"06", + X"41",X"CD",X"06",X"1A",X"3E",X"04",X"32",X"00",X"40",X"18",X"FE",X"0E",X"0D",X"CD",X"15",X"1A", + X"0E",X"0F",X"CD",X"15",X"1A",X"0E",X"11",X"CD",X"15",X"1A",X"11",X"85",X"1A",X"21",X"AA",X"52", + X"CD",X"C1",X"1F",X"11",X"91",X"1A",X"21",X"CC",X"52",X"CD",X"C1",X"1F",X"21",X"D1",X"1C",X"3A", + X"00",X"68",X"CB",X"07",X"CB",X"07",X"E6",X"03",X"47",X"87",X"87",X"80",X"4F",X"06",X"00",X"09", + X"E9",X"11",X"7B",X"1B",X"18",X"0D",X"11",X"8A",X"1B",X"18",X"08",X"11",X"9A",X"1B",X"18",X"03", + X"11",X"AA",X"1B",X"21",X"CF",X"52",X"CD",X"C1",X"1F",X"06",X"82",X"CD",X"06",X"1A",X"06",X"06", + X"C5",X"0E",X"0A",X"CD",X"15",X"1A",X"06",X"19",X"CD",X"06",X"1A",X"11",X"85",X"1A",X"21",X"AA", + X"52",X"CD",X"FB",X"19",X"06",X"19",X"CD",X"06",X"1A",X"C1",X"10",X"E4",X"06",X"82",X"CD",X"06", + X"1A",X"3E",X"05",X"32",X"00",X"40",X"18",X"FE",X"31",X"00",X"44",X"AF",X"21",X"06",X"70",X"77", + X"23",X"77",X"32",X"F1",X"40",X"32",X"31",X"41",X"3E",X"59",X"32",X"F4",X"40",X"32",X"34",X"41", + X"3E",X"01",X"32",X"F3",X"40",X"32",X"33",X"41",X"3C",X"3C",X"32",X"F0",X"40",X"32",X"30",X"41", + X"21",X"09",X"40",X"36",X"00",X"21",X"7C",X"40",X"36",X"59",X"23",X"36",X"59",X"CD",X"95",X"24", + X"06",X"80",X"21",X"00",X"42",X"36",X"00",X"23",X"10",X"FB",X"CD",X"96",X"1F",X"06",X"01",X"16", + X"03",X"CD",X"ED",X"20",X"06",X"1F",X"16",X"06",X"CD",X"ED",X"20",X"16",X"03",X"06",X"0C",X"CD", + X"ED",X"20",X"06",X"0E",X"CD",X"ED",X"20",X"11",X"A1",X"1A",X"21",X"2C",X"52",X"CD",X"FB",X"19", + X"3A",X"03",X"40",X"3D",X"28",X"11",X"11",X"91",X"1A",X"21",X"2E",X"53",X"CD",X"FB",X"19",X"11", + X"BA",X"1A",X"CD",X"FB",X"19",X"18",X"0F",X"11",X"AB",X"1A",X"21",X"2E",X"53",X"CD",X"FB",X"19", + X"11",X"BA",X"1A",X"CD",X"FB",X"19",X"3E",X"06",X"32",X"00",X"40",X"18",X"FE",X"CD",X"95",X"24", + X"CD",X"96",X"1F",X"21",X"C0",X"40",X"3A",X"09",X"40",X"16",X"00",X"5F",X"19",X"06",X"2A",X"36", + X"FF",X"23",X"10",X"FB",X"3E",X"59",X"21",X"F4",X"40",X"19",X"77",X"AF",X"21",X"F1",X"40",X"19", + X"77",X"CD",X"B6",X"1F",X"06",X"03",X"16",X"02",X"CD",X"ED",X"20",X"04",X"CD",X"ED",X"20",X"16", + X"06",X"04",X"CD",X"ED",X"20",X"04",X"CD",X"ED",X"20",X"06",X"03",X"16",X"00",X"CD",X"DC",X"20", + X"04",X"CD",X"DC",X"20",X"04",X"CD",X"DC",X"20",X"04",X"CD",X"DC",X"20",X"3E",X"01",X"32",X"40", + X"40",X"AF",X"32",X"3F",X"40",X"3A",X"08",X"40",X"3D",X"20",X"0F",X"21",X"A0",X"50",X"36",X"FF", + X"21",X"80",X"50",X"36",X"FF",X"0E",X"01",X"CD",X"15",X"1A",X"CD",X"97",X"1E",X"3E",X"04",X"32", + X"01",X"40",X"3A",X"43",X"42",X"FE",X"E0",X"20",X"F9",X"AF",X"32",X"01",X"40",X"3E",X"05",X"32", + X"01",X"40",X"3A",X"4B",X"42",X"FE",X"D0",X"20",X"F9",X"3E",X"06",X"32",X"01",X"40",X"3A",X"4B", + X"42",X"FE",X"18",X"20",X"F9",X"AF",X"32",X"01",X"40",X"CD",X"D7",X"1E",X"3E",X"07",X"32",X"00", + X"40",X"18",X"FE",X"0E",X"00",X"CD",X"63",X"21",X"1C",X"1C",X"CD",X"4D",X"21",X"0C",X"CD",X"63", + X"21",X"1C",X"1C",X"CD",X"4D",X"21",X"C9",X"0E",X"02",X"CD",X"63",X"21",X"1D",X"1D",X"CD",X"4D", + X"21",X"0C",X"CD",X"63",X"21",X"1D",X"1D",X"CD",X"4D",X"21",X"C9",X"01",X"00",X"04",X"CD",X"63", + X"21",X"1D",X"1D",X"CD",X"4D",X"21",X"0C",X"10",X"F5",X"3A",X"3F",X"40",X"21",X"45",X"1F",X"4F", + X"09",X"7E",X"BB",X"CC",X"05",X"1F",X"C9",X"06",X"00",X"CD",X"FF",X"20",X"70",X"0C",X"06",X"18", + X"06",X"01",X"CD",X"FF",X"20",X"80",X"0B",X"06",X"18",X"06",X"02",X"CD",X"FF",X"20",X"70",X"0A", + X"02",X"E0",X"06",X"03",X"CD",X"FF",X"20",X"80",X"09",X"02",X"E0",X"06",X"1E",X"16",X"06",X"CD", + X"ED",X"20",X"04",X"CD",X"ED",X"20",X"11",X"BA",X"1B",X"21",X"7E",X"52",X"CD",X"FB",X"19",X"13", + X"21",X"9F",X"52",X"CD",X"FB",X"19",X"C9",X"21",X"E3",X"51",X"3E",X"24",X"CD",X"39",X"08",X"21", + X"E5",X"51",X"3E",X"2C",X"CD",X"39",X"08",X"21",X"23",X"52",X"3E",X"28",X"CD",X"39",X"08",X"21", + X"25",X"52",X"3E",X"30",X"CD",X"39",X"08",X"11",X"00",X"00",X"0E",X"00",X"06",X"04",X"CD",X"4D", + X"21",X"0C",X"10",X"FA",X"C9",X"21",X"21",X"1F",X"3A",X"3F",X"40",X"87",X"87",X"5F",X"16",X"00", + X"19",X"3E",X"FF",X"5E",X"23",X"56",X"12",X"23",X"5E",X"23",X"56",X"12",X"21",X"3F",X"40",X"34", + X"C9",X"7E",X"52",X"BE",X"51",X"5E",X"52",X"DE",X"51",X"3E",X"52",X"FE",X"51",X"1E",X"52",X"1E", + X"52",X"9F",X"52",X"9F",X"51",X"7F",X"52",X"BF",X"51",X"5F",X"52",X"DF",X"51",X"3F",X"52",X"FF", + X"51",X"1F",X"52",X"1F",X"52",X"C8",X"B8",X"A8",X"90",X"78",X"60",X"48",X"30",X"18",X"06",X"0E", + X"16",X"03",X"CD",X"ED",X"20",X"06",X"10",X"CD",X"ED",X"20",X"11",X"A6",X"1A",X"21",X"2E",X"52", + X"CD",X"FB",X"19",X"11",X"B2",X"1A",X"21",X"50",X"52",X"CD",X"FB",X"19",X"21",X"70",X"51",X"3A", + X"09",X"40",X"A7",X"28",X"04",X"36",X"5A",X"18",X"02",X"36",X"59",X"06",X"28",X"CD",X"06",X"1A", + X"0E",X"0E",X"CD",X"15",X"1A",X"0E",X"10",X"CD",X"15",X"1A",X"01",X"04",X"1A",X"16",X"07",X"3E", + X"08",X"32",X"00",X"40",X"18",X"FE",X"11",X"2C",X"1A",X"21",X"60",X"53",X"CD",X"FB",X"19",X"11", + X"45",X"1A",X"21",X"BF",X"53",X"CD",X"FB",X"19",X"C9",X"01",X"0E",X"09",X"16",X"03",X"CD",X"ED", + X"20",X"04",X"0D",X"20",X"F9",X"C9",X"06",X"20",X"21",X"40",X"42",X"36",X"00",X"23",X"10",X"FB", + X"C9",X"01",X"E0",X"FF",X"1A",X"A7",X"C8",X"77",X"3E",X"0B",X"32",X"07",X"40",X"3A",X"07",X"40", + X"A7",X"20",X"FA",X"09",X"13",X"18",X"ED",X"06",X"41",X"CD",X"06",X"1A",X"CD",X"B9",X"06",X"11", + X"00",X"00",X"0E",X"00",X"CD",X"4D",X"21",X"0E",X"02",X"CD",X"4D",X"21",X"0E",X"04",X"CD",X"4D", + X"21",X"0C",X"CD",X"4D",X"21",X"3A",X"4C",X"42",X"C6",X"07",X"47",X"3A",X"58",X"42",X"B8",X"28", + X"1A",X"38",X"0D",X"3E",X"09",X"32",X"01",X"40",X"3A",X"58",X"42",X"B8",X"20",X"FA",X"18",X"0B", + X"3E",X"0A",X"32",X"01",X"40",X"3A",X"58",X"42",X"B8",X"20",X"FA",X"3A",X"47",X"42",X"C6",X"0B", + X"47",X"3E",X"0B",X"32",X"01",X"40",X"3E",X"01",X"32",X"68",X"40",X"3A",X"5B",X"42",X"B8",X"20", + X"FA",X"3E",X"01",X"32",X"44",X"40",X"AF",X"32",X"68",X"40",X"32",X"01",X"40",X"06",X"96",X"CD", + X"06",X"1A",X"CD",X"B6",X"1F",X"06",X"01",X"CD",X"06",X"1A",X"06",X"0F",X"16",X"03",X"CD",X"ED", + X"20",X"06",X"11",X"CD",X"ED",X"20",X"11",X"5F",X"1A",X"21",X"8F",X"52",X"CD",X"FB",X"19",X"11", + X"68",X"1B",X"21",X"11",X"52",X"CD",X"FB",X"19",X"11",X"00",X"05",X"CD",X"D4",X"06",X"06",X"41", + X"CD",X"06",X"1A",X"21",X"F3",X"40",X"3A",X"09",X"40",X"B7",X"28",X"03",X"21",X"33",X"41",X"3E", + X"07",X"BE",X"28",X"01",X"34",X"3E",X"13",X"32",X"00",X"40",X"18",X"FE",X"0E",X"06",X"CD",X"63", + X"21",X"15",X"CD",X"4D",X"21",X"0E",X"07",X"CD",X"63",X"21",X"15",X"CD",X"4D",X"21",X"C9",X"0E", + X"06",X"CD",X"63",X"21",X"14",X"CD",X"4D",X"21",X"0E",X"07",X"CD",X"63",X"21",X"14",X"CD",X"4D", + X"21",X"C9",X"0E",X"06",X"CD",X"63",X"21",X"1D",X"CD",X"4D",X"21",X"0E",X"07",X"CD",X"63",X"21", + X"1D",X"CD",X"4D",X"21",X"C9",X"06",X"80",X"21",X"00",X"42",X"36",X"00",X"23",X"10",X"FB",X"C9", + X"06",X"20",X"21",X"00",X"42",X"36",X"00",X"23",X"23",X"10",X"FA",X"C9",X"F5",X"E5",X"D5",X"78", + X"87",X"5F",X"16",X"00",X"21",X"00",X"42",X"19",X"D1",X"72",X"E1",X"F1",X"C9",X"F5",X"E5",X"D5", + X"78",X"87",X"3C",X"5F",X"16",X"00",X"21",X"00",X"42",X"19",X"D1",X"72",X"E1",X"F1",X"C9",X"F5", + X"C5",X"D5",X"E5",X"21",X"40",X"42",X"16",X"00",X"78",X"87",X"87",X"5F",X"19",X"EB",X"21",X"08", + X"00",X"39",X"D5",X"5E",X"23",X"56",X"EB",X"D1",X"78",X"FE",X"03",X"30",X"18",X"7E",X"F5",X"3A", + X"09",X"40",X"B7",X"28",X"0B",X"3A",X"00",X"70",X"CB",X"4F",X"20",X"04",X"F1",X"3D",X"18",X"02", + X"F1",X"3C",X"12",X"18",X"02",X"7E",X"12",X"06",X"03",X"13",X"23",X"7E",X"12",X"10",X"FA",X"23", + X"EB",X"21",X"08",X"00",X"39",X"73",X"23",X"72",X"E1",X"D1",X"C1",X"F1",X"C9",X"F5",X"DD",X"E5", + X"D5",X"DD",X"21",X"40",X"42",X"CD",X"B3",X"21",X"D1",X"DD",X"72",X"00",X"DD",X"73",X"03",X"DD", + X"E1",X"F1",X"C9",X"DD",X"E5",X"F5",X"DD",X"21",X"40",X"42",X"CD",X"B3",X"21",X"DD",X"7E",X"00", + X"DD",X"B6",X"03",X"28",X"0B",X"DD",X"56",X"00",X"DD",X"5E",X"03",X"F1",X"DD",X"E1",X"37",X"C9", + X"F1",X"37",X"3F",X"DD",X"E1",X"C9",X"F5",X"DD",X"E5",X"D5",X"C5",X"48",X"DD",X"21",X"60",X"42", + X"CD",X"B3",X"21",X"C1",X"D1",X"D5",X"3A",X"09",X"40",X"A7",X"28",X"07",X"3A",X"00",X"70",X"CB", + X"4F",X"28",X"05",X"7B",X"C6",X"05",X"2F",X"5F",X"DD",X"72",X"01",X"DD",X"73",X"03",X"D1",X"DD", + X"E1",X"F1",X"C9",X"79",X"87",X"87",X"5F",X"16",X"00",X"DD",X"19",X"C9",X"DD",X"E5",X"F5",X"C5", + X"48",X"DD",X"21",X"60",X"42",X"CD",X"B3",X"21",X"C1",X"DD",X"56",X"01",X"DD",X"5E",X"03",X"3A", + X"09",X"40",X"B7",X"28",X"07",X"3A",X"00",X"70",X"CB",X"4F",X"28",X"05",X"7B",X"C6",X"05",X"2F", + X"5F",X"7A",X"B3",X"28",X"05",X"F1",X"DD",X"E1",X"37",X"C9",X"F1",X"DD",X"E1",X"37",X"3F",X"C9", + X"F0",X"51",X"EF",X"51",X"EE",X"51",X"ED",X"51",X"EC",X"51",X"EB",X"51",X"EA",X"51",X"D0",X"51", + X"CF",X"51",X"CE",X"51",X"CD",X"51",X"CC",X"51",X"CB",X"51",X"CA",X"51",X"B0",X"51",X"AF",X"51", + X"AE",X"51",X"AD",X"51",X"AC",X"51",X"AB",X"51",X"AA",X"51",X"8F",X"51",X"8E",X"51",X"8D",X"51", + X"8C",X"51",X"8B",X"51",X"8A",X"51",X"89",X"51",X"6F",X"51",X"6E",X"51",X"6D",X"51",X"6C",X"51", + X"6B",X"51",X"6A",X"51",X"69",X"51",X"4F",X"51",X"4E",X"51",X"4D",X"51",X"4C",X"51",X"4B",X"51", + X"4A",X"51",X"49",X"51",X"2F",X"51",X"2E",X"51",X"2D",X"51",X"2C",X"51",X"2B",X"51",X"2A",X"51", + X"29",X"51",X"28",X"51",X"0E",X"51",X"0D",X"51",X"0C",X"51",X"0B",X"51",X"0A",X"51",X"09",X"51", + X"08",X"51",X"ED",X"50",X"EC",X"50",X"EB",X"50",X"EA",X"50",X"E9",X"50",X"E8",X"50",X"CC",X"50", + X"CB",X"50",X"CA",X"50",X"C9",X"50",X"C8",X"50",X"C7",X"50",X"AB",X"50",X"AA",X"50",X"A9",X"50", + X"A8",X"50",X"A7",X"50",X"8A",X"50",X"89",X"50",X"88",X"50",X"87",X"50",X"69",X"50",X"68",X"50", + X"67",X"50",X"48",X"50",X"47",X"50",X"10",X"52",X"0F",X"52",X"0E",X"52",X"0D",X"52",X"0C",X"52", + X"0B",X"52",X"0A",X"52",X"30",X"52",X"2F",X"52",X"2E",X"52",X"2D",X"52",X"2C",X"52",X"2B",X"52", + X"2A",X"52",X"50",X"52",X"4F",X"52",X"4E",X"52",X"4D",X"52",X"4C",X"52",X"4B",X"52",X"4A",X"52", + X"6F",X"52",X"6E",X"52",X"6D",X"52",X"6C",X"52",X"6B",X"52",X"6A",X"52",X"69",X"52",X"8F",X"52", + X"8E",X"52",X"8D",X"52",X"8C",X"52",X"8B",X"52",X"8A",X"52",X"89",X"52",X"AF",X"52",X"AE",X"52", + X"AD",X"52",X"AC",X"52",X"AB",X"52",X"AA",X"52",X"A9",X"52",X"CF",X"52",X"CE",X"52",X"CD",X"52", + X"CC",X"52",X"CB",X"52",X"CA",X"52",X"C9",X"52",X"C8",X"52",X"EE",X"52",X"ED",X"52",X"EC",X"52", + X"EB",X"52",X"EA",X"52",X"E9",X"52",X"E8",X"52",X"0D",X"53",X"0C",X"53",X"0B",X"53",X"0A",X"53", + X"09",X"53",X"08",X"53",X"2C",X"53",X"2B",X"53",X"2A",X"53",X"29",X"53",X"28",X"53",X"27",X"53", + X"4B",X"53",X"4A",X"53",X"49",X"53",X"48",X"53",X"47",X"53",X"6A",X"53",X"69",X"53",X"68",X"53", + X"67",X"53",X"89",X"53",X"88",X"53",X"87",X"53",X"A8",X"53",X"A7",X"53",X"F5",X"D5",X"DD",X"E5", + X"DD",X"21",X"F0",X"21",X"59",X"16",X"00",X"EB",X"29",X"EB",X"DD",X"19",X"DD",X"6E",X"00",X"DD", + X"66",X"01",X"3A",X"0D",X"40",X"5F",X"16",X"00",X"19",X"DD",X"E1",X"D1",X"F1",X"C9",X"E5",X"16", + X"00",X"59",X"21",X"50",X"41",X"19",X"3A",X"09",X"40",X"A7",X"7E",X"28",X"08",X"E6",X"F0",X"0F", + X"0F",X"0F",X"0F",X"18",X"02",X"E6",X"0F",X"A7",X"28",X"07",X"CD",X"3C",X"23",X"CD",X"5B",X"24", + X"37",X"E1",X"C9",X"FF",X"08",X"01",X"07",X"03",X"05",X"04",X"03",X"04",X"01",X"04",X"FF",X"02", + X"FD",X"00",X"FB",X"FE",X"FC",X"FC",X"FE",X"FB",X"00",X"FB",X"02",X"FB",X"04",X"FD",X"06",X"00", + X"05",X"02",X"04",X"03",X"02",X"03",X"00",X"01",X"FE",X"FF",X"FE",X"FD",X"FF",X"FC",X"01",X"FC", + X"03",X"FE",X"05",X"00",X"08",X"02",X"06",X"04",X"04",X"04",X"02",X"04",X"00",X"03",X"FE",X"01", + X"FC",X"FF",X"FB",X"FD",X"FD",X"FB",X"FF",X"FB",X"01",X"FB",X"03",X"FC",X"05",X"FE",X"07",X"00", + X"05",X"02",X"04",X"03",X"02",X"03",X"00",X"01",X"FE",X"FF",X"FE",X"FD",X"FF",X"FC",X"01",X"FC", + X"03",X"FE",X"05",X"E5",X"21",X"C0",X"40",X"3A",X"09",X"40",X"5F",X"16",X"00",X"19",X"59",X"19", + X"7E",X"3C",X"20",X"03",X"A7",X"E1",X"C9",X"21",X"83",X"23",X"3A",X"7E",X"40",X"5F",X"19",X"79", + X"87",X"5F",X"19",X"7E",X"5F",X"3A",X"70",X"40",X"83",X"87",X"87",X"87",X"5F",X"23",X"7E",X"57", + X"3A",X"71",X"40",X"82",X"87",X"87",X"87",X"57",X"37",X"E1",X"C9",X"F5",X"DD",X"E5",X"D5",X"DD", + X"21",X"42",X"42",X"CD",X"B3",X"21",X"D1",X"DD",X"70",X"00",X"DD",X"E1",X"F1",X"C9",X"F5",X"D5", + X"C5",X"7A",X"C6",X"04",X"57",X"CB",X"3A",X"CB",X"3A",X"CB",X"3A",X"3E",X"1F",X"92",X"26",X"00", + X"6F",X"06",X"05",X"29",X"10",X"FD",X"7B",X"C6",X"04",X"5F",X"CB",X"3B",X"CB",X"3B",X"CB",X"3B", + X"16",X"00",X"19",X"11",X"00",X"50",X"19",X"C1",X"D1",X"F1",X"C9",X"F5",X"C5",X"E5",X"11",X"00", + X"50",X"A7",X"ED",X"52",X"E5",X"7D",X"E6",X"1F",X"5F",X"D5",X"21",X"00",X"42",X"87",X"5F",X"16", + X"00",X"19",X"7E",X"D1",X"F5",X"7B",X"87",X"87",X"87",X"5F",X"06",X"05",X"F1",X"E1",X"E5",X"F5", + X"CB",X"3C",X"CB",X"1D",X"10",X"FA",X"3E",X"1F",X"95",X"87",X"87",X"87",X"57",X"F1",X"82",X"57", + X"E1",X"E1",X"C1",X"F1",X"C9",X"E5",X"C5",X"21",X"00",X"50",X"01",X"00",X"04",X"36",X"FF",X"0D", + X"23",X"20",X"FA",X"10",X"F8",X"C1",X"E1",X"C9",X"C5",X"E5",X"47",X"CD",X"B7",X"24",X"90",X"28", + X"03",X"30",X"FB",X"80",X"E1",X"C1",X"C9",X"21",X"91",X"40",X"3A",X"91",X"40",X"4F",X"CB",X"27", + X"CB",X"27",X"81",X"3C",X"32",X"91",X"40",X"C9",X"CD",X"A8",X"24",X"FE",X"FF",X"28",X"01",X"3C", + X"C9",X"21",X"34",X"42",X"7E",X"C6",X"78",X"67",X"2E",X"D0",X"C9",X"21",X"58",X"42",X"7E",X"67", + X"2E",X"D0",X"C9",X"21",X"0A",X"42",X"7E",X"C6",X"70",X"67",X"2E",X"28",X"C9",X"21",X"40",X"42", + X"78",X"87",X"87",X"4F",X"06",X"00",X"09",X"46",X"23",X"7E",X"23",X"23",X"4E",X"E6",X"3F",X"C9", + X"C1",X"E1",X"F1",X"37",X"C9",X"C1",X"E1",X"F1",X"37",X"3F",X"C9",X"CD",X"D1",X"24",X"78",X"C6", + X"0C",X"94",X"DA",X"05",X"25",X"D6",X"18",X"D2",X"05",X"25",X"79",X"C6",X"05",X"95",X"DA",X"05", + X"25",X"D6",X"15",X"D2",X"05",X"25",X"C3",X"00",X"25",X"CD",X"DB",X"24",X"C3",X"0E",X"25",X"CD", + X"D1",X"24",X"78",X"C6",X"04",X"94",X"DA",X"05",X"25",X"D6",X"10",X"D2",X"05",X"25",X"79",X"C6", + X"07",X"95",X"DA",X"05",X"25",X"D6",X"20",X"D2",X"05",X"25",X"C3",X"00",X"25",X"CD",X"DB",X"24", + X"C3",X"32",X"25",X"D5",X"CD",X"BC",X"21",X"7A",X"4B",X"D1",X"D2",X"05",X"25",X"D6",X"06",X"94", + X"DA",X"05",X"25",X"D6",X"0A",X"D2",X"05",X"25",X"79",X"D6",X"13",X"95",X"DA",X"05",X"25",X"D6", + X"0F",X"D2",X"05",X"25",X"C3",X"00",X"25",X"D5",X"CD",X"BC",X"21",X"7A",X"4B",X"D1",X"D2",X"05", + X"25",X"94",X"DA",X"05",X"25",X"D6",X"1E",X"D2",X"05",X"25",X"79",X"C6",X"07",X"95",X"DA",X"05", + X"25",X"D6",X"15",X"D2",X"05",X"25",X"C3",X"00",X"25",X"D5",X"CD",X"BC",X"21",X"7A",X"4B",X"D1", + X"D2",X"05",X"25",X"94",X"DA",X"05",X"25",X"D6",X"0E",X"D2",X"05",X"25",X"79",X"C6",X"07",X"95", + X"DA",X"05",X"25",X"D6",X"15",X"D2",X"05",X"25",X"C3",X"00",X"25",X"D5",X"CD",X"BC",X"21",X"7A", + X"4B",X"D1",X"D2",X"05",X"25",X"94",X"DA",X"05",X"25",X"D6",X"0A",X"D2",X"05",X"25",X"79",X"C6", + X"07",X"95",X"DA",X"05",X"25",X"D6",X"0D",X"D2",X"05",X"25",X"C3",X"00",X"25",X"F5",X"E5",X"C5", + X"CD",X"ED",X"24",X"FE",X"02",X"CA",X"0B",X"25",X"C3",X"05",X"25",X"F5",X"E5",X"C5",X"CD",X"ED", + X"24",X"FE",X"01",X"CA",X"29",X"25",X"FE",X"37",X"CA",X"29",X"25",X"C3",X"05",X"25",X"F5",X"E5", + X"C5",X"D5",X"48",X"CD",X"5E",X"23",X"42",X"4B",X"D1",X"D2",X"05",X"25",X"C3",X"4D",X"25",X"F5", + X"E5",X"C5",X"D5",X"48",X"CD",X"E3",X"23",X"42",X"4B",X"D1",X"D2",X"05",X"25",X"C3",X"4D",X"25", + X"F5",X"E5",X"C5",X"CD",X"DB",X"24",X"C3",X"53",X"25",X"F5",X"E5",X"C5",X"CD",X"E3",X"24",X"C3", + X"77",X"25",X"F5",X"E5",X"C5",X"06",X"02",X"CD",X"ED",X"24",X"60",X"69",X"FE",X"0C",X"C2",X"05", + X"25",X"C1",X"C5",X"C3",X"77",X"25",X"F5",X"E5",X"C5",X"D5",X"CD",X"00",X"09",X"62",X"6B",X"D1", + X"D2",X"05",X"25",X"C3",X"99",X"25",X"F5",X"E5",X"C5",X"D5",X"CD",X"00",X"09",X"62",X"6B",X"D1", + X"D2",X"05",X"25",X"C3",X"99",X"25",X"F5",X"E5",X"C5",X"41",X"CD",X"ED",X"24",X"FE",X"02",X"28", + X"03",X"C3",X"05",X"25",X"60",X"69",X"C1",X"C5",X"C3",X"99",X"25",X"F5",X"E5",X"C5",X"D5",X"CD", + X"00",X"09",X"62",X"6B",X"D1",X"D2",X"05",X"25",X"C3",X"99",X"25",X"F5",X"E5",X"C5",X"41",X"CD", + X"ED",X"24",X"FE",X"01",X"28",X"07",X"FE",X"37",X"28",X"03",X"C3",X"05",X"25",X"60",X"69",X"C1", + X"C5",X"C3",X"99",X"25",X"F5",X"E5",X"C5",X"D5",X"CD",X"5E",X"23",X"62",X"6B",X"D1",X"D2",X"05", + X"25",X"C3",X"BB",X"25",X"F5",X"E5",X"C5",X"D5",X"CD",X"E3",X"23",X"62",X"6B",X"D1",X"D2",X"05", + X"25",X"C3",X"BB",X"25",X"F5",X"C5",X"E5",X"DD",X"E5",X"21",X"FF",X"FF",X"22",X"06",X"68",X"DD", + X"21",X"30",X"40",X"DD",X"CB",X"00",X"46",X"28",X"13",X"3E",X"03",X"DD",X"77",X"01",X"21",X"05", + X"68",X"DD",X"75",X"03",X"DD",X"74",X"04",X"CD",X"E1",X"27",X"18",X"04",X"AF",X"32",X"05",X"68", + X"DD",X"21",X"35",X"40",X"DD",X"CB",X"00",X"46",X"28",X"10",X"3E",X"08",X"DD",X"77",X"01",X"21", + X"03",X"68",X"DD",X"75",X"03",X"DD",X"74",X"04",X"18",X"18",X"DD",X"21",X"3A",X"40",X"DD",X"CB", + X"00",X"46",X"28",X"14",X"3E",X"0C",X"DD",X"77",X"01",X"21",X"03",X"68",X"DD",X"75",X"03",X"DD", + X"74",X"04",X"CD",X"E1",X"27",X"C3",X"2C",X"27",X"AF",X"32",X"03",X"68",X"DD",X"21",X"40",X"40", + X"DD",X"CB",X"00",X"46",X"28",X"06",X"21",X"CB",X"28",X"C3",X"D1",X"27",X"DD",X"21",X"44",X"40", + X"DD",X"CB",X"00",X"46",X"28",X"06",X"21",X"08",X"29",X"C3",X"D1",X"27",X"DD",X"21",X"48",X"40", + X"DD",X"CB",X"00",X"46",X"28",X"05",X"21",X"1C",X"29",X"18",X"76",X"DD",X"21",X"4C",X"40",X"DD", + X"CB",X"00",X"46",X"28",X"05",X"21",X"35",X"29",X"18",X"67",X"DD",X"21",X"50",X"40",X"DD",X"CB", + X"00",X"46",X"28",X"05",X"21",X"5C",X"29",X"18",X"58",X"DD",X"21",X"54",X"40",X"DD",X"CB",X"00", + X"46",X"28",X"05",X"21",X"6A",X"29",X"18",X"49",X"DD",X"21",X"68",X"40",X"DD",X"CB",X"00",X"46", + X"28",X"05",X"21",X"C4",X"29",X"18",X"3A",X"DD",X"21",X"58",X"40",X"DD",X"CB",X"00",X"46",X"28", + X"05",X"21",X"78",X"29",X"18",X"2B",X"DD",X"21",X"5C",X"40",X"DD",X"CB",X"00",X"46",X"28",X"05", + X"21",X"8D",X"29",X"18",X"1C",X"DD",X"21",X"60",X"40",X"DD",X"CB",X"00",X"46",X"28",X"05",X"21", + X"9A",X"29",X"18",X"0D",X"DD",X"21",X"64",X"40",X"DD",X"CB",X"00",X"46",X"28",X"08",X"21",X"B3", + X"29",X"CD",X"0B",X"28",X"18",X"05",X"3E",X"FF",X"32",X"00",X"78",X"DD",X"E1",X"E1",X"C1",X"F1", + X"C9",X"DD",X"CB",X"00",X"4E",X"20",X"14",X"DD",X"CB",X"00",X"CE",X"DD",X"7E",X"01",X"DD",X"77", + X"02",X"DD",X"6E",X"03",X"DD",X"66",X"04",X"3E",X"FF",X"77",X"C9",X"DD",X"35",X"02",X"C0",X"DD", + X"6E",X"03",X"DD",X"66",X"04",X"AF",X"77",X"DD",X"77",X"00",X"C9",X"DD",X"CB",X"00",X"4E",X"20", + X"3A",X"DD",X"CB",X"00",X"CE",X"DD",X"75",X"01",X"DD",X"74",X"02",X"DD",X"6E",X"01",X"DD",X"66", + X"02",X"7E",X"23",X"DD",X"75",X"01",X"DD",X"74",X"02",X"FE",X"FF",X"28",X"24",X"F5",X"21",X"AB", + X"28",X"E6",X"1F",X"4F",X"06",X"00",X"09",X"7E",X"32",X"00",X"78",X"F1",X"E6",X"E0",X"CB",X"3F", + X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"3C",X"DD",X"77",X"03",X"C9",X"DD",X"35",X"03",X"28",X"CB", + X"C9",X"AF",X"DD",X"77",X"00",X"2F",X"32",X"00",X"78",X"C9",X"DD",X"CB",X"00",X"4E",X"20",X"1E", + X"DD",X"CB",X"00",X"CE",X"DD",X"75",X"01",X"DD",X"74",X"02",X"AF",X"DD",X"77",X"04",X"3E",X"A0", + X"DD",X"77",X"05",X"DD",X"36",X"06",X"01",X"DD",X"7E",X"05",X"32",X"00",X"78",X"C9",X"DD",X"CB", + X"04",X"46",X"20",X"23",X"DD",X"7E",X"06",X"3D",X"DD",X"77",X"06",X"C0",X"DD",X"7E",X"05",X"3D", + X"DD",X"77",X"05",X"FE",X"55",X"20",X"DC",X"3E",X"FF",X"DD",X"77",X"04",X"2F",X"DD",X"CB",X"00", + X"8E",X"DD",X"6E",X"01",X"DD",X"66",X"02",X"CD",X"0B",X"28",X"C9",X"00",X"0E",X"1B",X"28",X"34", + X"40",X"4A",X"55",X"5E",X"67",X"70",X"78",X"80",X"87",X"8D",X"94",X"9A",X"A0",X"A5",X"AA",X"AF", + X"B3",X"B8",X"BC",X"C0",X"C3",X"C6",X"CA",X"CD",X"D0",X"D2",X"FF",X"31",X"30",X"2B",X"27",X"30", + X"2C",X"29",X"25",X"2E",X"2A",X"27",X"24",X"2C",X"29",X"25",X"22",X"20",X"22",X"24",X"25",X"22", + X"24",X"25",X"27",X"24",X"25",X"27",X"29",X"25",X"27",X"29",X"2A",X"27",X"29",X"2A",X"2C",X"2A", + X"2C",X"2E",X"30",X"28",X"2A",X"2C",X"2E",X"2A",X"2C",X"2E",X"30",X"2C",X"2E",X"30",X"31",X"2C", + X"2E",X"30",X"31",X"2C",X"2E",X"30",X"91",X"FF",X"EC",X"CB",X"47",X"89",X"87",X"85",X"84",X"E0", + X"84",X"42",X"44",X"E2",X"40",X"42",X"44",X"45",X"47",X"49",X"EB",X"FF",X"30",X"3F",X"30",X"3F", + X"30",X"3F",X"30",X"3F",X"32",X"3F",X"32",X"3F",X"32",X"3F",X"32",X"3F",X"30",X"3F",X"30",X"3F", + X"30",X"3F",X"30",X"3F",X"FF",X"67",X"EB",X"0B",X"09",X"07",X"05",X"04",X"02",X"0B",X"09",X"07", + X"05",X"04",X"02",X"0B",X"09",X"07",X"05",X"04",X"02",X"0B",X"09",X"07",X"05",X"04",X"02",X"0B", + X"09",X"07",X"05",X"04",X"02",X"0B",X"09",X"07",X"05",X"04",X"02",X"FF",X"00",X"0C",X"00",X"00", + X"0C",X"00",X"00",X"01",X"03",X"05",X"07",X"09",X"0B",X"FF",X"00",X"0C",X"00",X"00",X"0C",X"00", + X"00",X"01",X"03",X"05",X"07",X"09",X"0B",X"FF",X"00",X"02",X"04",X"05",X"07",X"04",X"06",X"08", + X"09",X"0B",X"07",X"09",X"0B",X"0C",X"0E",X"0C",X"0E",X"10",X"11",X"13",X"FF",X"03",X"05",X"0B", + X"03",X"05",X"0B",X"03",X"05",X"0B",X"03",X"05",X"0B",X"FF",X"04",X"05",X"07",X"09",X"0B",X"1F", + X"0B",X"1F",X"0B",X"1F",X"0B",X"1F",X"0C",X"0E",X"10",X"11",X"10",X"1F",X"10",X"1F",X"10",X"1F", + X"10",X"1F",X"FF",X"0A",X"09",X"08",X"07",X"0A",X"09",X"08",X"07",X"0A",X"09",X"08",X"07",X"0A", + X"09",X"08",X"07",X"FF",X"90",X"87",X"89",X"80",X"90",X"87",X"89",X"80",X"90",X"87",X"89",X"80", + X"90",X"87",X"89",X"80",X"90",X"87",X"89",X"80",X"90",X"87",X"89",X"80",X"90",X"87",X"89",X"80", + X"90",X"87",X"89",X"80",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/build_id.tcl b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_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/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/build_id.v b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/build_id.v new file mode 100644 index 00000000..bef80912 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180103" +`define BUILD_TIME "172130" diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c07d2629 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1093 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..6bd576cf --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..ee217402 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2026 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..679730ab --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80as.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80as.vhd new file mode 100644 index 00000000..fe477f50 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/cpu/T80as.vhd @@ -0,0 +1,283 @@ +------------------------------------------------------------------------------ +-- t80as.vhd : The non-tristate signal edition of t80a.vhd +-- +-- 2003.2.7 non-tristate modification by Tatsuyuki Satoh +-- +-- 1.separate 'D' to 'DO' and 'DI'. +-- 2.added 'DOE' to 'DO' enable signal.(data direction) +-- 3.MREQ_n,IORQ_n,RD_n,WR_n,RFSH_n,A doesn't become the condition of 'Z'. +-- +-- There is a mark of "--AS" in all the change points. +-- +------------------------------------------------------------------------------ + +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80as is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); +--AS-- D : inout std_logic_vector(7 downto 0) +--AS>> + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + DOE : out std_logic +--< 'Z'); +--AS-- D <= DO when Write = '1' and BUSAK_n_i = '1' else (others => 'Z'); +--AS>> + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DOE <= Write when BUSAK_n_i = '1' else '0'; +--< Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, +-- DInst => D, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then +--AS-- DI_Reg <= to_x01(D); +--AS>> + DI_Reg <= to_x01(DI); +--< 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/dac.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/dac.vhd new file mode 100644 index 00000000..b1ecdcb7 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_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 := 11 + ); + 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/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/dpram.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..dafe8385 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/galaxian.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/galaxian.vhd new file mode 100644 index 00000000..b881e738 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/galaxian.vhd @@ -0,0 +1,446 @@ +------------------------------------------------------------------------------ +-- FPGA GALAXIAN +-- +-- Version downto 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important not +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +-- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--use work.pkg_galaxian.all; + +entity galaxian is + port( + W_CLK_18M : in std_logic; + W_CLK_12M : in std_logic; + W_CLK_6M : in std_logic; + + P1_CSJUDLR : in std_logic_vector(6 downto 0); + P2_CSJUDLR : in std_logic_vector(6 downto 0); + I_RESET : in std_logic; + + W_R : out std_logic_vector(2 downto 0); + W_G : out std_logic_vector(2 downto 0); + W_B : out std_logic_vector(2 downto 0); + HBLANK : out std_logic; + VBLANK : out std_logic; + W_H_SYNC : out std_logic; + W_V_SYNC : out std_logic; + W_SDAT_A : out std_logic_vector( 7 downto 0); + W_SDAT_B : out std_logic_vector( 7 downto 0); + O_CMPBL : out std_logic + ); +end; + +architecture RTL of galaxian is + -- CPU ADDRESS BUS + signal W_A : std_logic_vector(15 downto 0) := (others => '0'); + -- CPU IF + signal W_CPU_CLK : std_logic := '0'; + signal W_CPU_MREQn : std_logic := '0'; + signal W_CPU_NMIn : std_logic := '0'; + signal W_CPU_RDn : std_logic := '0'; + signal W_CPU_RFSHn : std_logic := '0'; + signal W_CPU_WAITn : std_logic := '0'; + signal W_CPU_WRn : std_logic := '0'; + signal W_CPU_WR : std_logic := '0'; + signal W_RESETn : std_logic := '0'; + -------- H and V COUNTER ------------------------- + signal W_C_BLn : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_C_BLXn : std_logic := '0'; + signal W_H_BL : std_logic := '0'; + signal W_H_SYNC_int : std_logic := '0'; + signal W_V_BLn : std_logic := '0'; + signal W_V_BL2n : std_logic := '0'; + signal W_V_SYNC_int : std_logic := '0'; + signal W_H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal W_V_CNT : std_logic_vector(7 downto 0) := (others => '0'); + -------- CPU RAM ---------------------------- + signal W_CPU_RAM_DO : std_logic_vector(7 downto 0) := (others => '0'); + -------- ADDRESS DECDER ---------------------- + signal W_BD_G : std_logic := '0'; + signal W_CPU_RAM_CS : std_logic := '0'; + signal W_CPU_RAM_RD : std_logic := '0'; +-- signal W_CPU_RAM_WR : std_logic := '0'; + signal W_CPU_ROM_CS : std_logic := '0'; + signal W_DIP_OE : std_logic := '0'; + signal W_H_FLIP : std_logic := '0'; + signal W_DRIVER_WE : std_logic := '0'; + signal W_OBJ_RAM_RD : std_logic := '0'; + signal W_OBJ_RAM_RQ : std_logic := '0'; + signal W_OBJ_RAM_WR : std_logic := '0'; + signal W_PITCH : std_logic := '0'; + signal W_SOUND_WE : std_logic := '0'; + signal W_STARS_ON : std_logic := '0'; + signal W_STARS_OFFn : std_logic := '0'; + signal W_SW0_OE : std_logic := '0'; + signal W_SW1_OE : std_logic := '0'; + signal W_V_FLIP : std_logic := '0'; + signal W_VID_RAM_RD : std_logic := '0'; + signal W_VID_RAM_WR : std_logic := '0'; + signal W_WDR_OE : std_logic := '0'; + --------- INPORT ----------------------------- + signal W_SW_DO : std_logic_vector( 7 downto 0) := (others => '0'); + --------- VIDEO ----------------------------- + signal W_VID_DO : std_logic_vector( 7 downto 0) := (others => '0'); + ----- DATA I/F ------------------------------------- + signal W_CPU_ROM_DO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_ROM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_RAM_CLK : std_logic := '0'; + signal W_VOL1 : std_logic := '0'; + signal W_VOL2 : std_logic := '0'; + signal W_FIRE : std_logic := '0'; + signal W_HIT : std_logic := '0'; + signal W_FS : std_logic_vector( 2 downto 0) := (others => '0'); + + signal blx_comb : std_logic := '0'; + signal W_1VF : std_logic := '0'; + signal W_256HnX : std_logic := '0'; + signal W_8HF : std_logic := '0'; + signal W_DAC_A : std_logic := '0'; + signal W_DAC_B : std_logic := '0'; + signal W_MISSILEn : std_logic := '0'; + signal W_SHELLn : std_logic := '0'; + signal W_MS_D : std_logic := '0'; + signal W_MS_R : std_logic := '0'; + signal W_MS_G : std_logic := '0'; + signal W_MS_B : std_logic := '0'; + + signal new_sw : std_logic_vector( 2 downto 0) := (others => '0'); + signal in_game : std_logic_vector( 1 downto 0) := (others => '0'); + signal ROM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal rst_count : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_STARS_B : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_G : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_R : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VIDEO_B : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_G : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_R : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_WAV_A0 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A1 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A2 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D2 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_DAC : std_logic_vector( 3 downto 0) := (others => '0'); + +begin + mc_vid : entity work.MC_VIDEO + port map( + I_CLK_18M => W_CLK_18M, + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT => W_H_CNT, + I_V_CNT => W_V_CNT, + I_H_FLIP => W_H_FLIP, + I_V_FLIP => W_V_FLIP, + I_V_BLn => W_V_BLn, + I_C_BLn => W_C_BLn, + I_A => W_A(9 downto 0), + I_OBJ_SUB_A => "000", + I_BD => W_BDI, + I_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + I_OBJ_RAM_RD => W_OBJ_RAM_RD, + I_OBJ_RAM_WR => W_OBJ_RAM_WR, + I_VID_RAM_RD => W_VID_RAM_RD, + I_VID_RAM_WR => W_VID_RAM_WR, + I_DRIVER_WR => W_DRIVER_WE, + O_C_BLnX => W_C_BLnX, + O_8HF => W_8HF, + O_256HnX => W_256HnX, + O_1VF => W_1VF, + O_MISSILEn => W_MISSILEn, + O_SHELLn => W_SHELLn, + O_BD => W_VID_DO, + O_VID => W_VID, + O_COL => W_COL + ); + + cpu : entity work.T80as + port map ( + RESET_n => W_RESETn, + CLK_n => W_CPU_CLK, + WAIT_n => W_CPU_WAITn, + INT_n => '1', + NMI_n => W_CPU_NMIn, + BUSRQ_n => '1', + MREQ_n => W_CPU_MREQn, + RD_n => W_CPU_RDn, + WR_n => W_CPU_WRn, + RFSH_n => W_CPU_RFSHn, + A => W_A, + DI => W_BDO, + DO => W_BDI, + M1_n => open, + IORQ_n => open, + HALT_n => open, + BUSAK_n => open, + DOE => open + ); + + mc_cpu_ram : entity work.MC_CPU_RAM + port map ( + I_CLK => W_CPU_RAM_CLK, + I_ADDR => W_A(9 downto 0), + I_D => W_BDI, + I_WE => W_CPU_WR, + I_OE => W_CPU_RAM_RD, + O_D => W_CPU_RAM_DO + ); + + mc_adec : entity work.MC_ADEC + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_CPU_CLK => W_CPU_CLK, + I_RSTn => W_RESETn, + + I_CPU_A => W_A, + I_CPU_D => W_BDI(0), + I_MREQn => W_CPU_MREQn, + I_RFSHn => W_CPU_RFSHn, + I_RDn => W_CPU_RDn, + I_WRn => W_CPU_WRn, + I_H_BL => W_H_BL, + I_V_BLn => W_V_BLn, + + O_WAITn => W_CPU_WAITn, + O_NMIn => W_CPU_NMIn, + O_CPU_ROM_CS => W_CPU_ROM_CS, + O_CPU_RAM_RD => W_CPU_RAM_RD, +-- O_CPU_RAM_WR => W_CPU_RAM_WR, + O_CPU_RAM_CS => W_CPU_RAM_CS, + O_OBJ_RAM_RD => W_OBJ_RAM_RD, + O_OBJ_RAM_WR => W_OBJ_RAM_WR, + O_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + O_VID_RAM_RD => W_VID_RAM_RD, + O_VID_RAM_WR => W_VID_RAM_WR, + O_SW0_OE => W_SW0_OE, + O_SW1_OE => W_SW1_OE, + O_DIP_OE => W_DIP_OE, + O_WDR_OE => W_WDR_OE, + O_DRIVER_WE => W_DRIVER_WE, + O_SOUND_WE => W_SOUND_WE, + O_PITCH => W_PITCH, + O_H_FLIP => W_H_FLIP, + O_V_FLIP => W_V_FLIP, + O_BD_G => W_BD_G, + O_STARS_ON => W_STARS_ON + ); + + -- active high buttons + mc_inport : entity work.MC_INPORT + port map ( + I_COIN1 => P1_CSJUDLR(6), + I_COIN2 => P2_CSJUDLR(6), + I_1P_START => P1_CSJUDLR(5), + I_2P_START => P2_CSJUDLR(5), + I_1P_SH => P1_CSJUDLR(4), + I_2P_SH => P2_CSJUDLR(4), + I_1P_LE => P1_CSJUDLR(1), + I_2P_LE => P2_CSJUDLR(1), + I_1P_RI => P1_CSJUDLR(0), + I_2P_RI => P2_CSJUDLR(0), + I_SW0_OE => W_SW0_OE, + I_SW1_OE => W_SW1_OE, + I_DIP_OE => W_DIP_OE, + O_D => W_SW_DO + ); + + mc_hv : entity work.MC_HV_COUNT + port map( + I_CLK => W_CLK_6M, + I_RSTn => W_RESETn, + O_H_CNT => W_H_CNT, + O_H_SYNC => W_H_SYNC_int, + O_H_BL => W_H_BL, + O_V_CNT => W_V_CNT, + O_V_SYNC => W_V_SYNC_int, + O_V_BL2n => W_V_BL2n, + O_V_BLn => W_V_BLn, + O_C_BLn => W_C_BLn + ); + + mc_col_pal : entity work.MC_COL_PAL + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_VID => W_VID, + I_COL => W_COL, + I_C_BLnX => W_C_BLnX, + O_C_BLXn => W_C_BLXn, + O_STARS_OFFn => W_STARS_OFFn, + O_R => W_VIDEO_R, + O_G => W_VIDEO_G, + O_B => W_VIDEO_B + ); + + mc_stars : entity work.MC_STARS + port map ( + I_CLK_18M => W_CLK_18M, + I_CLK_6M => W_CLK_6M, + I_H_FLIP => W_H_FLIP, + I_V_SYNC => W_V_SYNC_int, + I_8HF => W_8HF, + I_256HnX => W_256HnX, + I_1VF => W_1VF, + I_2V => W_V_CNT(1), + I_STARS_ON => W_STARS_ON, + I_STARS_OFFn => W_STARS_OFFn, + O_R => W_STARS_R, + O_G => W_STARS_G, + O_B => W_STARS_B, + O_NOISE => open + ); + + mc_sound_a : entity work.MC_SOUND_A + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT1 => W_H_CNT(1), + I_BD => W_BDI, + I_PITCH => W_PITCH, + I_VOL1 => W_VOL1, + I_VOL2 => W_VOL2, + O_SDAT => W_SDAT_A, + O_DO => open + ); + + vmc_sound_b : entity work.MC_SOUND_B + port map( + I_CLK1 => W_CLK_6M, + I_RSTn => rst_count(3), + I_SW => new_sw, + I_DAC => W_DAC, + I_FS => W_FS, + O_SDAT => W_SDAT_B + ); + +--------- ROM ------------------------------------------------------- + mc_roms : entity work.ROM_PGM_0 + port map ( + CLK => W_CLK_12M, + ADDR => W_A(13 downto 0), + DATA => W_CPU_ROM_DO + ); + +-------- VIDEO ----------------------------- + blx_comb <= not ( W_C_BLXn and W_V_BL2n ); + W_V_SYNC <= not W_V_SYNC_int; + W_H_SYNC <= not W_H_SYNC_int; + O_CMPBL <= W_C_BLnX; + + -- MISSILE => Yellow ; + -- SHELL => White ; + W_MS_D <= not (W_MISSILEn and W_SHELLn); + W_MS_R <= not blx_comb and W_MS_D; + W_MS_G <= not blx_comb and W_MS_D; + W_MS_B <= not blx_comb and W_MS_D and not W_SHELLn ; + + W_R <= W_VIDEO_R or (W_STARS_R & "0") or (W_MS_R & W_MS_R & "0"); + W_G <= W_VIDEO_G or (W_STARS_G & "0") or (W_MS_G & W_MS_G & "0"); + W_B <= W_VIDEO_B or (W_STARS_B & "0") or (W_MS_B & W_MS_B & "0"); + + process(W_CLK_6M) + begin + if rising_edge(W_CLK_6M) then + HBLANK <= not W_C_BLXn; + VBLANK <= not W_V_BL2n; + end if; + end process; + + +----- CPU I/F ------------------------------------- + + W_CPU_CLK <= W_H_CNT(0); + W_CPU_RAM_CLK <= W_CLK_12M and W_CPU_RAM_CS; + + W_CPU_ROM_DOB <= W_CPU_ROM_DO when W_CPU_ROM_CS = '1' else (others=>'0'); + + W_RESETn <= not I_RESET; + W_BDO <= W_SW_DO or W_VID_DO or W_CPU_RAM_DO or W_CPU_ROM_DOB ; + W_CPU_WR <= not W_CPU_WRn; + + new_sw <= (W_FS(2) or W_FS(1) or W_FS(0)) & W_HIT & W_FIRE; + + process(W_CPU_CLK, I_RESET) + begin + if (I_RESET = '1') then + rst_count <= (others => '0'); + elsif rising_edge( W_CPU_CLK) then + if ( rst_count /= x"f") then + rst_count <= rst_count + 1; + end if; + end if; + end process; + +----- Parts 9L --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_FS <= (others=>'0'); + W_HIT <= '0'; + W_FIRE <= '0'; + W_VOL1 <= '0'; + W_VOL2 <= '0'; + elsif rising_edge(W_CLK_12M) then + if (W_SOUND_WE = '1') then + case(W_A(2 downto 0)) is + when "000" => W_FS(0) <= W_BDI(0); + when "001" => W_FS(1) <= W_BDI(0); + when "010" => W_FS(2) <= W_BDI(0); + when "011" => W_HIT <= W_BDI(0); +-- when "100" => UNUSED <= W_BDI(0); + when "101" => W_FIRE <= W_BDI(0); + when "110" => W_VOL1 <= W_BDI(0); + when "111" => W_VOL2 <= W_BDI(0); + when others => null; + end case; + end if; + end if; + end process; + +----- Parts 9M --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_DAC <= (others=>'0'); + elsif rising_edge(W_CLK_12M) then + if (W_DRIVER_WE = '1') then + case(W_A(2 downto 0)) is + -- next 4 outputs go off board via ULN2075 buffer +-- when "000" => 1P START <= W_BDI(0); +-- when "001" => 2P START <= W_BDI(0); +-- when "010" => COIN LOCK <= W_BDI(0); +-- when "011" => COIN CTR <= W_BDI(0); + when "100" => W_DAC(0) <= W_BDI(0); -- 1M + when "101" => W_DAC(1) <= W_BDI(0); -- 470K + when "110" => W_DAC(2) <= W_BDI(0); -- 220K + when "111" => W_DAC(3) <= W_BDI(0); -- 100K + when others => null; + end case; + end if; + end if; + end process; + +------------------------------------------------------------------------------- +end RTL; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/hq2x.sv b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_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/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/keyboard.v b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_adec.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_adec.vhd new file mode 100644 index 00000000..7245ce8c --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_adec.vhd @@ -0,0 +1,251 @@ +--------------------------------------------------------------------- +-- FPGA GALAXIAN ADDRESS DECDER +-- +-- Version : 2.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +--------------------------------------------------------------------- +-- +--GALAXIAN Address Map +-- +-- Address Item(R..read-mode W..wight-mode) Parts +--0000 - 1FFF CPU-ROM..R ( 7H or 7K ) +--2000 - 3FFF CPU-ROM..R ( 7L ) +--4000 - 47FF CPU-RAM..RW ( 7N & 7P ) +--5000 - 57FF VID-RAM..RW +--5800 - 5FFF OBJ-RAM..RW +--6000 - SW0..R LAMP......W +--6800 - SW1..R SOUND.....W +--7000 - DIP..R +--7001 NMI_ON....W +--7004 STARS_ON..W +--7006 H_FLIP....W +--7007 V-FLIP....W +--7800 WDR..R PITCH.....W +-- +--W MODE +--6000 1P START +--6001 2P START +--6002 COIN LOCKOUT +--6003 COIN COUNTER +--6004 - 6007 SOUND CONTROL(OSC) +-- +--6800 SOUND CONTROL(FS1) +--6801 SOUND CONTROL(FS2) +--6802 SOUND CONTROL(FS3) +--6803 SOUND CONTROL(HIT) +--6805 SOUND CONTROL(SHOT) +--6806 SOUND CONTROL(VOL1) +--6807 SOUND CONTROL(VOL2) +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_ADEC is + port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_CPU_CLK : in std_logic; + I_RSTn : in std_logic; + + I_CPU_A : in std_logic_vector(15 downto 0); + I_CPU_D : in std_logic; + I_MREQn : in std_logic; + I_RFSHn : in std_logic; + I_RDn : in std_logic; + I_WRn : in std_logic; + I_H_BL : in std_logic; + I_V_BLn : in std_logic; + + O_WAITn : out std_logic; + O_NMIn : out std_logic; + O_CPU_ROM_CS : out std_logic; + O_CPU_RAM_RD : out std_logic; + O_CPU_RAM_WR : out std_logic; + O_CPU_RAM_CS : out std_logic; + O_OBJ_RAM_RD : out std_logic; + O_OBJ_RAM_WR : out std_logic; + O_OBJ_RAM_RQ : out std_logic; + O_VID_RAM_RD : out std_logic; + O_VID_RAM_WR : out std_logic; + O_SW0_OE : out std_logic; + O_SW1_OE : out std_logic; + O_DIP_OE : out std_logic; + O_WDR_OE : out std_logic; + O_DRIVER_WE : out std_logic; + O_SOUND_WE : out std_logic; + O_PITCH : out std_logic; + O_H_FLIP : out std_logic; + O_V_FLIP : out std_logic; + O_BD_G : out std_logic; + O_STARS_ON : out std_logic + ); +end; + +architecture RTL of MC_ADEC is + signal W_8E1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8E2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8P_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8M_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_9N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_NMI_ONn : std_logic := '0'; + -------- CPU WAITn ---------------------------------------------- +-- signal W_6S1_Q : std_logic := '0'; + signal W_6S1_Qn : std_logic := '0'; +-- signal W_6S2_Qn : std_logic := '0'; + + signal W_V_BL : std_logic := '0'; + +begin + W_NMI_ONn <= W_9N_Q(1); -- galaxian + +-- O_WAITn <= '1' ; -- No Wait + O_WAITn <= W_6S1_Qn; + + process(I_CPU_CLK, I_V_BLn) + begin + if (I_V_BLn = '0') then +-- W_6S1_Q <= '0'; + W_6S1_Qn <= '1'; + elsif rising_edge(I_CPU_CLK) then +-- W_6S1_Q <= not (I_H_BL or W_8P_Q(2)); + W_6S1_Qn <= I_H_BL or W_8P_Q(2); + end if; + end process; + +-- process(I_CPU_CLK) +-- begin +-- if falling_edge(I_CPU_CLK) then +-- W_6S2_Qn <= not W_6S1_Q; +-- end if; +-- end process; + +-------- CPU NMIn ----------------------------------------------- + W_V_BL <= not I_V_BLn; + process(W_V_BL, W_NMI_ONn) + begin + if (W_NMI_ONn = '0') then + O_NMIn <= '1'; + elsif rising_edge(W_V_BL) then + O_NMIn <= '0'; + end if; + end process; + + ------------------------------------------------------------------- + u_8e1 : entity work.LOGIC_74XX139 + port map ( + I_G => I_MREQn, + I_Sel(1) => I_CPU_A(15), + I_Sel(0) => I_CPU_A(14), + O_Q => W_8E1_Q + ); + + ---------- CPU_ROM CS 0000 - 3FFF --------------------------- + u_8e2 : entity work.LOGIC_74XX139 + port map ( + I_G => I_RDn, + I_Sel(1) => W_8E1_Q(0), + I_Sel(0) => I_CPU_A(13), + O_Q => W_8E2_Q + ); + + O_CPU_ROM_CS <= not (W_8E2_Q(0) and W_8E2_Q(1) ) ; -- 0000 - 3FFF + ------------------------------------------------------------------- + -- ADDRESS + -- W_8E1_Q[0] = 0000 - 3FFF ---- CPU_ROM_USE + -- W_8E1_Q[1] = 4000 - 7FFF ---- GALAXIAN USE *1 + -- W_8E1_Q[2] = 8000 - BFFF ---- MOONCREST USE + -- W_8E1_Q[3] = C000 - FFFF + + u_8p : entity work.LOGIC_74XX138 + port map ( + I_G1 => I_RFSHn, + I_G2a => W_8E1_Q(1), -- <= *1 + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8P_Q + ); + + u_8n : entity work.LOGIC_74XX138 + port map ( + I_G1 => '1', + I_G2a => I_RDn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8N_Q + ); + + u_8m : entity work.LOGIC_74XX138 + port map ( + -- I_G1 => W_6S2_Qn, + I_G1 => '1', -- No Wait + I_G2a => I_WRn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8M_Q + ); + + O_BD_G <= not (W_8E1_Q(0) and W_8P_Q(0)); + O_OBJ_RAM_RQ <= not W_8P_Q(3); + + O_CPU_RAM_CS <= not (W_8N_Q(0) and W_8M_Q(0)); + + O_WDR_OE <= not W_8N_Q(7); + O_DIP_OE <= not W_8N_Q(6); + O_SW1_OE <= not W_8N_Q(5); + O_SW0_OE <= not W_8N_Q(4); + O_OBJ_RAM_RD <= not W_8N_Q(3); + O_VID_RAM_RD <= not W_8N_Q(2); +-- UNUSED <= not W_8N_Q(1); + O_CPU_RAM_RD <= not W_8N_Q(0); + + O_PITCH <= not W_8M_Q(7); +-- STARS_ON_ENA <= not W_8M_Q(6); + O_SOUND_WE <= not W_8M_Q(5); + O_DRIVER_WE <= not W_8M_Q(4); + O_OBJ_RAM_WR <= not W_8M_Q(3); + O_VID_RAM_WR <= not W_8M_Q(2); +-- UNUSED <= not W_8M_Q(1); + O_CPU_RAM_WR <= not W_8M_Q(0); + + ----- Parts 9N --------- + + process(I_CLK_12M, I_RSTn) + begin + if (I_RSTn = '0') then + W_9N_Q <= (others => '0'); + elsif rising_edge(I_CLK_12M) then + if (W_8M_Q(6) = '0') then + case I_CPU_A(2 downto 0) is + when "000" => W_9N_Q(0) <= I_CPU_D; + when "001" => W_9N_Q(1) <= I_CPU_D; + when "010" => W_9N_Q(2) <= I_CPU_D; + when "011" => W_9N_Q(3) <= I_CPU_D; + when "100" => W_9N_Q(4) <= I_CPU_D; + when "101" => W_9N_Q(5) <= I_CPU_D; + when "110" => W_9N_Q(6) <= I_CPU_D; + when "111" => W_9N_Q(7) <= I_CPU_D; + when others => null; + end case; + end if; + end if; + end process; + + O_STARS_ON <= W_9N_Q(4); + O_H_FLIP <= W_9N_Q(6); + O_V_FLIP <= W_9N_Q(7); + +end RTL; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_bram.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_bram.vhd new file mode 100644 index 00000000..a6df1ce1 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_bram.vhd @@ -0,0 +1,182 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA & GALAXIAN +-- FPGA BLOCK RAM I/F (XILINX SPARTAN) +-- +-- Version : 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- mc_col_rom(6L) added by k.Degawa +-- +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. K.Degawa +-- 2004- 9-18 added Xilinx Device K.Degawa +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_top.v use +entity MC_CPU_RAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(9 downto 0); + I_D : in std_logic_vector(7 downto 0); + I_WE : in std_logic; + I_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) + ); +end; +architecture RTL of MC_CPU_RAM is + + signal W_D : std_logic_vector(7 downto 0) := (others => '0'); +begin + O_D <= W_D when I_OE ='1' else (others=>'0'); + + ram_inst : work.spram generic map(10,8) + port map + ( + address => I_ADDR, + clock => I_CLK, + data => I_D, + wren => I_WE, + q => W_D + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_OBJ_RAM is + port( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(7 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(7 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); + end; + +architecture RTL of MC_OBJ_RAM is +begin + + ram_inst : work.dpram generic map(8,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_VID_RAM is + port ( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(9 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(9 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of MC_VID_RAM is +begin + ram_inst : work.dpram generic map(10,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_LRAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(7 downto 0); + I_D : in std_logic_vector(4 downto 0); + I_WE : in std_logic; + O_Dn : out std_logic_vector(4 downto 0) + ); +end; + +architecture RTL of MC_LRAM is + signal W_D : std_logic_vector(4 downto 0) := (others => '0'); +begin + + O_Dn <= not W_D; + + ram_inst : work.dpram generic map(8,5) + port map + ( + clock_a => I_CLK, + address_a => I_ADDR, + data_a => I_D, + wren_a => not I_WE, + + clock_b => not I_CLK, + address_b => I_ADDR, + data_b => (others => '0'), + q_b => W_D, + enable_b => '1', + wren_b => '0' + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_clocks.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_clocks.vhd new file mode 100644 index 00000000..014e6f7a --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_clocks.vhd @@ -0,0 +1,88 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA CLOCK GEN +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +----------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library unisim; + use unisim.vcomponents.all; + +entity CLOCKGEN is +port ( + CLKIN_IN : in std_logic; + RST_IN : in std_logic; + -- + O_CLK_24M : out std_logic; + O_CLK_18M : out std_logic; + O_CLK_12M : out std_logic; + O_CLK_06M : out std_logic +); +end; + +architecture RTL of CLOCKGEN is + signal state : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr1 : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr2 : std_logic_vector(2 downto 0) := (others => '0'); + signal CLKFB_IN : std_logic := '0'; + signal CLK0_BUF : std_logic := '0'; + signal CLKFX_BUF : std_logic := '0'; + signal CLK_72M : std_logic := '0'; + signal I_DCM_LOCKED : std_logic := '0'; + +begin + dcm_inst : DCM_SP + generic map ( + CLKFX_MULTIPLY => 9, + CLKFX_DIVIDE => 4, + CLKIN_PERIOD => 31.25 + ) + port map ( + CLKIN => CLKIN_IN, + CLKFB => CLKFB_IN, + RST => RST_IN, + CLK0 => CLK0_BUF, + CLKFX => CLKFX_BUF, + LOCKED => I_DCM_LOCKED + ); + + BUFG0 : BUFG port map (I=> CLK0_BUF, O => CLKFB_IN); + BUFG1 : BUFG port map (I=> CLKFX_BUF, O => CLK_72M); + O_CLK_06M <= ctr2(2); + O_CLK_12M <= ctr2(1); + O_CLK_24M <= ctr2(0); + O_CLK_18M <= ctr1(1); + + -- generate all clocks, 36Mhz, 18Mhz, 24Mhz, 12Mhz and 6Mhz + process(CLK_72M) + begin + if rising_edge(CLK_72M) then + if (I_DCM_LOCKED = '0') then + state <= "00"; + ctr1 <= (others=>'0'); + ctr2 <= (others=>'0'); + else + ctr1 <= ctr1 + 1; + case state is + when "00" => state <= "01"; ctr2 <= ctr2 + 1; + when "01" => state <= "10"; ctr2 <= ctr2 + 1; + when "10" => state <= "00"; + when "11" => state <= "00"; + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_col_pal.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_col_pal.vhd new file mode 100644 index 00000000..c4dc06ad --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_col_pal.vhd @@ -0,0 +1,78 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA COLOR-PALETTE +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-18 added Xilinx Device. K.Degawa +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; +-- use ieee.numeric_std.all; + +--library UNISIM; +-- use UNISIM.Vcomponents.all; + +entity MC_COL_PAL is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_VID : in std_logic_vector(1 downto 0); + I_COL : in std_logic_vector(2 downto 0); + I_C_BLnX : in std_logic; + + O_C_BLXn : out std_logic; + O_STARS_OFFn : out std_logic; + O_R : out std_logic_vector(2 downto 0); + O_G : out std_logic_vector(2 downto 0); + O_B : out std_logic_vector(2 downto 0) +); +end; + +architecture RTL of MC_COL_PAL is + --- Parts 6M -------------------------------------------------------- + signal W_COL_ROM_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6M_DI : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_DO : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_CLR : std_logic := '0'; + +begin + W_6M_DI <= I_COL(2 downto 0) & I_VID(1 downto 0) & not (I_VID(0) or I_VID(1)) & I_C_BLnX; + W_6M_CLR <= W_6M_DI(0) or W_6M_DO(0); + O_C_BLXn <= W_6M_DI(0) or W_6M_DO(0); + O_STARS_OFFn <= W_6M_DO(1); + +--always@(posedge I_CLK_6M or negedge W_6M_CLR) + process(I_CLK_6M, W_6M_CLR) + begin + if (W_6M_CLR = '0') then + W_6M_DO <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + W_6M_DO <= W_6M_DI; + end if; + end process; + + --- COL ROM -------------------------------------------------------- +--wire W_COL_ROM_OEn = W_6M_DO[1]; + + galaxian_6l : entity work.GALAXIAN_6L + port map ( + CLK => I_CLK_12M, + ADDR => W_6M_DO(6 downto 2), + DATA => W_COL_ROM_DO + ); + + --- VID OUT -------------------------------------------------------- + O_R <= W_COL_ROM_DO(2 downto 0); + O_G <= W_COL_ROM_DO(5 downto 3); + O_B <= W_COL_ROM_DO(7 downto 6) & "0"; + +end; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_hv_count.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_hv_count.vhd new file mode 100644 index 00000000..f310321b --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_hv_count.vhd @@ -0,0 +1,145 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA H & V COUNTER +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 +----------------------------------------------------------------------- +-- MoonCrest hv_count +-- H_CNT 0 - 255 , 384 - 511 Total 384 count +-- V_CNT 0 - 255 , 504 - 511 Total 264 count +------------------------------------------------------------------------------------------- +-- H_CNT[0], H_CNT[1], H_CNT[2], H_CNT[3], H_CNT[4], H_CNT[5], H_CNT[6], H_CNT[7], H_CNT[8], +-- 1 H 2 H 4 H 8 H 16 H 32 H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT[0], V_CNT[1], V_CNT[2], V_CNT[3], V_CNT[4], V_CNT[5], V_CNT[6], V_CNT[7] +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_HV_COUNT is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + O_H_CNT : out std_logic_vector(8 downto 0); + O_H_SYNC : out std_logic; + O_H_BL : out std_logic; + O_V_BL2n : out std_logic; + O_V_CNT : out std_logic_vector(7 downto 0); + O_V_SYNC : out std_logic; + O_V_BLn : out std_logic; + O_C_BLn : out std_logic + ); +end; + +architecture RTL of MC_HV_COUNT is + signal H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal V_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal H_SYNC : std_logic := '0'; + signal H_CLK : std_logic := '0'; + signal H_BL : std_logic := '0'; + signal V_BLn : std_logic := '0'; + signal V_BL2n : std_logic := '0'; + +begin +--------- H_COUNT ---------------------------------------- + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if (H_CNT = 255) then + H_CNT <= std_logic_vector(to_unsigned(384, H_CNT'length)); + else + H_CNT <= H_CNT + 1 ; + end if; + end if; + end process; + + O_H_CNT <= H_CNT; + +--------- H_SYNC ---------------------------------------- + H_CLK <= H_CNT(4); + process(H_CLK, H_CNT(8)) + begin + if (H_CNT(8) = '0') then + H_SYNC <= '0'; + elsif rising_edge(H_CLK) then + H_SYNC <= (not H_CNT(6) ) and H_CNT(5); + end if; + end process; + + O_H_SYNC <= H_SYNC; + +--------- H_BL ------------------------------------------ + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if H_CNT = 387 then + H_BL <= '1'; + elsif H_CNT = 503 then + H_BL <= '0'; + end if; + end if; + end process; + + O_H_BL <= H_BL; + +--------- V_COUNT ---------------------------------------- + process(H_SYNC, I_RSTn) + begin + if (I_RSTn = '0') then + V_CNT <= (others => '0'); + elsif rising_edge(H_SYNC) then + if (V_CNT = 255) then + V_CNT <= std_logic_vector(to_unsigned(504, V_CNT'length)); + else + V_CNT <= V_CNT + 1 ; + end if; + end if; + end process; + + O_V_CNT <= V_CNT(7 downto 0); + O_V_SYNC <= V_CNT(8); + +--------- V_BLn ------------------------------------------ + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BLn <= '0'; + elsif V_CNT(7 downto 0) = 15 then + V_BLn <= '1'; + end if; + end if; + end process; + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BL2n <= '0'; + elsif V_CNT(7 downto 0) = 16 then + V_BL2n <= '1'; + end if; + end if; + end process; + + O_V_BLn <= V_BLn; + O_V_BL2n <= V_BL2n; +------- C_BLn ------------------------------------------ + O_C_BLn <= V_BLn and (not H_CNT(8)); + +end; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_inport.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_inport.vhd new file mode 100644 index 00000000..1d61cf9c --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_inport.vhd @@ -0,0 +1,72 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA INPORT +-- +-- Version : 1.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004-4-30 galaxian modify by K.DEGAWA +----------------------------------------------------------------------- + +-- DIP SW 0 1 2 3 4 5 +----------------------------------------------------------------- +-- COIN CHUTE +-- 1 COIN/1 PLAY 1'b0 1'b0 +-- 2 COIN/1 PLAY 1'b1 1'b0 +-- 1 COIN/2 PLAY 1'b0 1'b1 +-- FREE PLAY 1'b1 1'b1 +-- BOUNS +-- 1'b0 1'b0 +-- 1'b1 1'b0 +-- 1'b0 1'b1 +-- 1'b1 1'b1 +-- LIVES +-- 2 1'b0 +-- 3 1'b1 +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_INPORT is +port ( + I_COIN1 : in std_logic; -- active high + I_COIN2 : in std_logic; -- active high + I_1P_LE : in std_logic; -- active high + I_1P_RI : in std_logic; -- active high + I_1P_SH : in std_logic; -- active high + I_2P_LE : in std_logic; + I_2P_RI : in std_logic; + I_2P_SH : in std_logic; + I_1P_START : in std_logic; -- active high + I_2P_START : in std_logic; -- active high + I_SW0_OE : in std_logic; + I_SW1_OE : in std_logic; + I_DIP_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) +); + +end; + +architecture RTL of MC_INPORT is + +signal W_TABLE : std_logic := '1'; -- UP TYPE = 1; + + signal W_SW0_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SW1_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_DIP_DO : std_logic_vector(7 downto 0) := (others => '0'); + +begin + + W_SW0_DO <= x"00" when I_SW0_OE = '0' else "000" & I_1P_SH & I_1P_RI & I_1P_LE & I_COIN2 & I_COIN1; + W_SW1_DO <= x"00" when I_SW1_OE = '0' else "000" & I_2P_SH & I_2P_RI & I_2P_LE & I_2P_START & I_1P_START; + W_DIP_DO <= x"00" when I_DIP_OE = '0' else "00000110"; + O_D <= W_SW0_DO or W_SW1_DO or W_DIP_DO ; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_ld_pls.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_ld_pls.vhd new file mode 100644 index 00000000..0945fe35 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_ld_pls.vhd @@ -0,0 +1,115 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA VIDEO-LD_PLS_GEN +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_LD_PLS is + port ( + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_3D_DI : in std_logic; + + O_LDn : out std_logic; + O_CNTRLDn : out std_logic; + O_CNTRCLRn : out std_logic; + O_COLLn : out std_logic; + O_VPLn : out std_logic; + O_OBJDATALn : out std_logic; + O_MLDn : out std_logic; + O_SLDn : out std_logic + ); +end; + +architecture RTL of MC_LD_PLS is + signal W_4C1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C1_Q3 : std_logic := '0'; + signal W_4C2_B : std_logic := '0'; + signal W_4D1_G : std_logic := '0'; + signal W_4D1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4D2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_5C_Q : std_logic := '0'; + signal W_HCNT : std_logic := '0'; +begin + O_LDn <= W_4D1_G; + O_CNTRLDn <= W_4D1_Q(2); + O_CNTRCLRn <= W_4D1_Q(0); + O_COLLn <= W_4D2_Q(2); + O_VPLn <= W_4D2_Q(0); + O_OBJDATALn <= W_4C1_Q(2); + O_MLDn <= W_4C2_Q(0); + O_SLDn <= W_4C2_Q(1); + W_4D1_G <= not (I_H_CNT(0) and I_H_CNT(1) and I_H_CNT(2)); + W_HCNT <= not (I_H_CNT(6) and I_H_CNT(5) and I_H_CNT(4) and I_H_CNT(3)); + -- Parts 4D + u_4d1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_G, + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q =>W_4D1_Q + ); + + u_4d2 : entity work.LOGIC_74XX139 + port map( + I_G => W_5C_Q, + I_Sel(1) => I_H_CNT(2), + I_Sel(0) => I_H_CNT(1), + O_Q => W_4D2_Q + ); + + -- Parts 4C + u_4c1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D2_Q(1), + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q => W_4C1_Q + ); + + u_4c2 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_Q(3), + I_Sel(1) => W_4C2_B, + I_Sel(0) => W_HCNT, + O_Q => W_4C2_Q + ); + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_5C_Q <= I_H_CNT(0); + end if; + end process; + + -- 2004-9-22 added + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + W_4C1_Q3 <= W_4C1_Q(3); + end if; + end process; + + process(W_4C1_Q3) + begin + if rising_edge(W_4C1_Q3) then + W_4C2_B <= I_3D_DI; + end if; + end process; + +end RTL; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_logic.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_logic.vhd new file mode 100644 index 00000000..5dae8a87 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_logic.vhd @@ -0,0 +1,92 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA LOGIC IP MODULE +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx138 +-- 3-to-8 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX138 is + port ( + I_G1 : in std_logic; + I_G2a : in std_logic; + I_G2b : in std_logic; + I_Sel : in std_logic_vector(2 downto 0); + O_Q : out std_logic_vector(7 downto 0) + ); +end logic_74xx138; + +architecture RTL of LOGIC_74XX138 is + signal I_G : std_logic_vector(2 downto 0) := (others => '0'); + +begin + I_G <= I_G1 & I_G2a & I_G2b; + + xx138 : process(I_G, I_Sel) + begin + if(I_G = "100" ) then + case I_Sel is + when "000" => O_Q <= "11111110"; + when "001" => O_Q <= "11111101"; + when "010" => O_Q <= "11111011"; + when "011" => O_Q <= "11110111"; + when "100" => O_Q <= "11101111"; + when "101" => O_Q <= "11011111"; + when "110" => O_Q <= "10111111"; + when "111" => O_Q <= "01111111"; + when others => null; + end case; + else + O_Q <= (others => '1'); + end if; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx139 +-- 2-to-4 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX139 is + port ( + I_G : in std_logic; + I_Sel : in std_logic_vector(1 downto 0); + O_Q : out std_logic_vector(3 downto 0) + ); +end; + +architecture RTL of LOGIC_74XX139 is +begin + xx139 : process (I_G, I_Sel) + begin + if I_G = '0' then + case I_Sel is + when "00" => O_Q <= "1110"; + when "01" => O_Q <= "1101"; + when "10" => O_Q <= "1011"; + when "11" => O_Q <= "0111"; + when others => null; + end case; + else + O_Q <= "1111"; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_missile.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_missile.vhd new file mode 100644 index 00000000..c5aa6633 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_missile.vhd @@ -0,0 +1,107 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA VIDEO-MISSILE +---- +---- Version : 2.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_MISSILE is + port( + I_CLK_6M : in std_logic; + I_CLK_18M : in std_logic; + I_C_BLn_X : in std_logic; + I_MLDn : in std_logic; + I_SLDn : in std_logic; + I_HPOS : in std_logic_vector (7 downto 0); + + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic + ); +end; + +architecture RTL of MC_MISSILE is + signal W_45R_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_45S_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_5P1_Q : std_logic := '0'; + signal W_5P2_Q : std_logic := '0'; + signal W_5P1_CLK : std_logic := '0'; + signal W_5P2_CLK : std_logic := '0'; +begin + + O_MISSILEn <= W_5P1_CLK; + O_SHELLn <= W_5P2_CLK; + + -- missile counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if (I_MLDn = '0') then + W_45R_Q <= I_HPOS; + else + if (I_C_BLn_X = '1') then + W_45R_Q <= W_45R_Q + 1; + if (W_45R_Q(7 downto 2) = "111111") and W_5P1_Q = '1' then + W_5P1_CLK <= '0'; + else + W_5P1_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- shell counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if(I_SLDn = '0') then + W_45S_Q <= I_HPOS; + else + if(I_C_BLn_X = '1') then + W_45S_Q <= W_45S_Q + 1; + if (W_45S_Q(7 downto 2) = "111111") and W_5P2_Q = '1' then + W_5P2_CLK <= '0'; + else + W_5P2_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_MLDn) and clock active on rising edge (W_5P1_CLK) + process(W_5P1_CLK, I_MLDn) + begin + if (I_MLDn = '0') then + W_5P1_Q <= '1'; + elsif rising_edge(W_5P1_CLK) then + W_5P1_Q <= '0'; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_SLDn) and clock active on rising edge (W_5P2_CLK) + process(W_5P2_CLK, I_SLDn) + begin + if (I_SLDn = '0') then + W_5P2_Q <= '1'; + elsif rising_edge(W_5P2_CLK) then + W_5P2_Q <= '0'; + end if; + end process; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_sound_a.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_sound_a.vhd new file mode 100644 index 00000000..ee0c66be --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_sound_a.vhd @@ -0,0 +1,117 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA SOUND I/F +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + use IEEE.std_logic_arith.all; + +entity MC_SOUND_A is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT1 : in std_logic; + I_BD : in std_logic_vector(7 downto 0); + I_PITCH : in std_logic; + I_VOL1 : in std_logic; + I_VOL2 : in std_logic; + + O_SDAT : out std_logic_vector(7 downto 0); + O_DO : out std_logic_vector(3 downto 0) +); +end; + +architecture RTL of MC_SOUND_A is + signal W_PITCH : std_logic := '0'; + signal W_89K_LDn : std_logic := '0'; + signal W_89K_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_89K_LDATA : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6T_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_SDAT0 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT2 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT3 : std_logic_vector(7 downto 0) := (others => '0'); + +begin + O_DO <= W_6T_Q; + + process (I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_PITCH <= I_PITCH; + if (W_89K_Q = x"ff") then + W_89K_LDn <= '0' ; + else + W_89K_LDn <= '1' ; + end if; + end if; + end process; + + -- Parts 9J + process (W_PITCH) + begin + if falling_edge(W_PITCH) then + W_89K_LDATA <= I_BD; + end if; + end process; + + process (I_H_CNT1) + begin + if rising_edge(I_H_CNT1) then + if (W_89K_LDn = '0') then + W_89K_Q <= W_89K_LDATA; + else + W_89K_Q <= W_89K_Q + 1; + end if; + end if; + end process; + + process (W_89K_LDn) + begin + if falling_edge(W_89K_LDn) then + W_6T_Q <= W_6T_Q + 1; + end if; + end process; + + process (I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + O_SDAT <= (x"14" + W_SDAT3) + (W_SDAT0 + W_SDAT2); + + if W_6T_Q(0)='1' then + W_SDAT0 <= x"2a"; + else + W_SDAT0 <= (others => '0'); + end if; + + if W_6T_Q(2)='1' then + if I_VOL1 = '1' then + W_SDAT2 <= x"69"; + else + W_SDAT2 <= x"39"; + end if; + else + W_SDAT2 <= (others => '0'); + end if; + + if (W_6T_Q(3)='1') and (I_VOL2 = '1') then + W_SDAT3 <= x"48" ; + else + W_SDAT3 <= (others => '0'); + end if; + + end if; + end process; + +end; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_sound_b.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_sound_b.vhd new file mode 100644 index 00000000..b74e4bb1 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_sound_b.vhd @@ -0,0 +1,253 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA WAVE SOUND +---- +---- Version : 1.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does no guarantee this program. +---- You can use this at your own risk. +---- +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--pragma translate_off +-- use ieee.std_logic_textio.all; +-- use std.textio.all; +--pragma translate_on + +entity MC_SOUND_B is + port( + I_CLK1 : in std_logic; -- 6MHz + I_RSTn : in std_logic; + I_SW : in std_logic_vector( 2 downto 0); + I_DAC : in std_logic_vector( 3 downto 0); + I_FS : in std_logic_vector( 2 downto 0); + O_SDAT : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_B is +constant sample_time : integer := 557; -- sample time : 557 = 11025Hz, 557/2 = 22050Hz +constant fire_cnt : std_logic_vector(15 downto 0) := x"2000"; +constant hit_cnt : std_logic_vector(15 downto 0) := x"2000"; + +signal sample : std_logic_vector(10 downto 0) := (others => '0'); +signal sample_pls : std_logic := '0'; +signal s0_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s0_trg : std_logic := '0'; +signal s1_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s1_trg : std_logic := '0'; +signal fire_addr : std_logic_vector(15 downto 0) := (others => '0'); +signal hit_addr : std_logic_vector(15 downto 0) := (others => '0'); + +signal WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); +signal WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + +signal W_VCO1_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO1_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal VCO_CTR : std_logic_vector(24 downto 0) := (others => '0'); + +signal SDAT : std_logic_vector(10 downto 0) := (others => '0'); + +begin + -- ideally we should divide by 5 because this is the sum of 5 channels + -- but in practice we divide by 4 and just clip sounds that are too loud. + O_SDAT <= SDAT(9 downto 2) when SDAT(10) = '0' else (others=>'1'); -- clip overrange sounds + + process(I_CLK1) + begin + if rising_edge(I_CLK1) then + SDAT <= ("000" & W_VCO3_OUT) + ( ( ("000" & W_VCO2_OUT) + ("000" & W_VCO1_OUT) ) + ( ("000" & WAV_D0) + ("000" & WAV_D1) ) ); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + sample <= (others => '0'); + sample_pls <= '0'; + elsif rising_edge(I_CLK1) then + if (sample = sample_time - 1) then + sample <= (others => '0'); + sample_pls <= '1'; + else + sample <= sample + 1; + sample_pls <= '0'; + end if; + end if; + end process; + +------------- FIRE SOUND ------------------------------------------ + mc_roms_fire : entity work.GAL_FIR + port map ( + CLK => I_CLK1, + ADDR => fire_addr(12 downto 0), + DATA => WAV_D0 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s0_trg_ff <= (others => '0'); + s0_trg <= '0'; + elsif rising_edge(I_CLK1) then + s0_trg_ff(0) <= I_SW(0); + s0_trg_ff(1) <= s0_trg_ff(0); + s0_trg <= not s0_trg_ff(1) and s0_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + fire_addr <= fire_cnt; + elsif rising_edge(I_CLK1) then + if (s0_trg = '1') then + fire_addr <= (others => '0'); + else + if(sample_pls = '1') then + if(fire_addr <= fire_cnt) then + fire_addr <= fire_addr + 1; + else + fire_addr <= fire_addr ; + end if; + end if; + end if; + end if; + end process; + +------------- HIT SOUND ------------------------------------------ + mc_roms_hit : entity work.GAL_HIT + port map ( + CLK => I_CLK1, + ADDR => hit_addr(12 downto 0), + DATA => WAV_D1 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s1_trg_ff <= (others => '0'); + s1_trg <= '0'; + elsif rising_edge(I_CLK1) then + s1_trg_ff(0) <= I_SW(1); + s1_trg_ff(1) <= s1_trg_ff(0); + s1_trg <= not s1_trg_ff(1) and s1_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + hit_addr <= hit_cnt; + elsif rising_edge(I_CLK1) then + if (s1_trg = '1') then + hit_addr <= (others => '0'); + else + if (sample_pls = '1') then + if (hit_addr <= hit_cnt) then + hit_addr <= hit_addr + 1 ; + else + hit_addr <= hit_addr ; + end if; + end if; + end if; + end if; + end process; + +--------------- EFFECT SOUND --------------------------------------- + +-- 9R modulator voltage generator based on DAC value + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + VCO_CTR <= (others=>'0'); + elsif rising_edge(I_CLK1) then + VCO_CTR <= VCO_CTR + (not I_DAC); + end if; + end process; + + -- modulator frequency lookup tables for the three VCOs + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + elsif rising_edge(I_CLK1) then + case VCO_CTR(23 downto 19) is + when "00000" => W_VCO1_STEP <= x"2A"; W_VCO2_STEP <= x"3A"; W_VCO3_STEP <= x"54"; + when "00001" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"39"; W_VCO3_STEP <= x"53"; + when "00010" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"38"; W_VCO3_STEP <= x"52"; + when "00011" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"50"; + when "00100" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"4F"; + when "00101" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"36"; W_VCO3_STEP <= x"4E"; + when "00110" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"35"; W_VCO3_STEP <= x"4D"; + when "00111" => W_VCO1_STEP <= x"26"; W_VCO2_STEP <= x"34"; W_VCO3_STEP <= x"4C"; + when "01000" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"4A"; + when "01001" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"49"; + when "01010" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"32"; W_VCO3_STEP <= x"48"; + when "01011" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"31"; W_VCO3_STEP <= x"47"; + when "01100" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"30"; W_VCO3_STEP <= x"46"; + when "01101" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"44"; + when "01110" => W_VCO1_STEP <= x"22"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"43"; + when "01111" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2E"; W_VCO3_STEP <= x"42"; + when "10000" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2D"; W_VCO3_STEP <= x"41"; + when "10001" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2C"; W_VCO3_STEP <= x"40"; + when "10010" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3F"; + when "10011" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3D"; + when "10100" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2A"; W_VCO3_STEP <= x"3C"; + when "10101" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"29"; W_VCO3_STEP <= x"3B"; + when "10110" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"3A"; + when "10111" => W_VCO1_STEP <= x"1D"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"39"; + when "11000" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"27"; W_VCO3_STEP <= x"37"; + when "11001" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"26"; W_VCO3_STEP <= x"36"; + when "11010" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"25"; W_VCO3_STEP <= x"35"; + when "11011" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"34"; + when "11100" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"33"; + when "11101" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"23"; W_VCO3_STEP <= x"32"; + when "11110" => W_VCO1_STEP <= x"19"; W_VCO2_STEP <= x"22"; W_VCO3_STEP <= x"30"; + when "11111" => W_VCO1_STEP <= x"18"; W_VCO2_STEP <= x"21"; W_VCO3_STEP <= x"2F"; + when others => null; + end case; + end if; + end process; + +-- 8R VCO 240Hz - 140Hz (8) + mc_vco1 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(0), + I_STEP => W_VCO1_STEP, + O_WAV => W_VCO1_OUT + ); + +-- 8S VCO 330Hz - 190Hz (11) + mc_vco2 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(1), + I_STEP => W_VCO2_STEP, + O_WAV => W_VCO2_OUT + ); + +-- 8T VCO 480Hz - 270Hz (16) + mc_vco3 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(2), + I_STEP => W_VCO3_STEP, + O_WAV => W_VCO3_OUT + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_sound_vco.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_sound_vco.vhd new file mode 100644 index 00000000..e2a63e85 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_sound_vco.vhd @@ -0,0 +1,49 @@ +-------------------------------------------------------------------------------- +---- FPGA VCO +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +use work.sine_package.all; + +-- O_CLK = (I_CLK / 2^20) * I_STEP +entity MC_SOUND_VCO is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + I_FS : in std_logic; + I_STEP : in std_logic_vector( 7 downto 0); + O_WAV : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_VCO is + signal VCO1_CTR : std_logic_vector(19 downto 0) := (others => '0'); + signal sine : std_logic_vector(14 downto 0) := (others => '0'); + +begin + O_WAV <= sine(14 downto 7); + process(I_CLK, I_RSTn) + begin + if (I_RSTn = '0') then + VCO1_CTR <= (others=>'0'); + elsif rising_edge(I_CLK) then + if I_FS = '1' then + VCO1_CTR <= VCO1_CTR + I_STEP; + case VCO1_CTR(19 downto 18) is + when "00" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "01" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when "10" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "11" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_stars.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_stars.vhd new file mode 100644 index 00000000..b91197b3 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_stars.vhd @@ -0,0 +1,90 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA STARS +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity MC_STARS is + port ( + I_CLK_18M : in std_logic; + I_CLK_6M : in std_logic; + I_H_FLIP : in std_logic; + I_V_SYNC : in std_logic; + I_8HF : in std_logic; + I_256HnX : in std_logic; + I_1VF : in std_logic; + I_2V : in std_logic; + I_STARS_ON : in std_logic; + I_STARS_OFFn : in std_logic; + + O_R : out std_logic_vector(1 downto 0); + O_G : out std_logic_vector(1 downto 0); + O_B : out std_logic_vector(1 downto 0); + O_NOISE : out std_logic + ); +end; + +architecture RTL of MC_STARS is + signal CLK_1C : std_logic := '0'; + signal W_2D_Qn : std_logic := '0'; + + signal W_3B : std_logic := '0'; + signal noise : std_logic := '0'; + signal W_2A : std_logic := '0'; + signal W_4P : std_logic := '0'; + signal CLK_1AB : std_logic := '0'; + signal W_1AB_Q : std_logic_vector(15 downto 0) := (others => '0'); + signal W_1C_Q : std_logic_vector( 1 downto 0) := (others => '0'); +begin + O_R <= (W_1AB_Q( 9) & W_1AB_Q (8) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_G <= (W_1AB_Q(11) & W_1AB_Q(10) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_B <= (W_1AB_Q(13) & W_1AB_Q(12) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + + CLK_1C <= not (I_CLK_18M and (not I_CLK_6M )and (not I_V_SYNC) and I_256HnX); + CLK_1AB <= not (CLK_1C or (not (I_H_FLIP or W_1C_Q(1)))); + W_3B <= W_2D_Qn xor W_1AB_Q(4); + + W_2A <= '0' when (W_1AB_Q(7 downto 0) = x"ff") else '1'; + W_4P <= not (( I_8HF xor I_1VF ) and W_2D_Qn and I_STARS_OFFn); + + O_NOISE <= noise ; + + process(I_2V) + begin + if rising_edge(I_2V) then + noise <= W_2D_Qn; + end if; + end process; + + process(CLK_1C, I_V_SYNC) + begin + if(I_V_SYNC = '1') then + W_1C_Q <= (others => '0'); + elsif rising_edge(CLK_1C) then + W_1C_Q <= W_1C_Q(0) & '1'; + end if; + end process; + + process(CLK_1AB, I_STARS_ON) + begin + if(I_STARS_ON = '0') then + W_1AB_Q <= (others => '0'); + W_2D_Qn <= '1'; + elsif rising_edge(CLK_1AB) then + W_1AB_Q <= W_1AB_Q(14 downto 0) & W_3B; + W_2D_Qn <= not W_1AB_Q(15); + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_video.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_video.vhd new file mode 100644 index 00000000..dbe0d0d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mc_video.vhd @@ -0,0 +1,433 @@ +-------------------------------------------------------------------------------- +---- FPGA GALAXIAN VIDEO +---- +---- Version : 2.50 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 4-30 galaxian modify by K.DEGAWA +---- 2004- 5- 6 first release. +---- 2004- 8-23 Improvement with T80-IP. +---- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +-------------------------------------------------------------------------------- + +------------------------------------------------------------------------------------------- +-- H_CNT(0), H_CNT(1), H_CNT(2), H_CNT(3), H_CNT(4), H_CNT(5), H_CNT(6), H_CNT(7), H_CNT(8), +-- 1 H 2 H 4 H 8 H 16 H 32H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT(0), V_CNT(1), V_CNT(2), V_CNT(3), V_CNT(4), V_CNT(5), V_CNT(6), V_CNT(7) +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_VIDEO is + port( + I_CLK_18M : in std_logic; + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_V_CNT : in std_logic_vector(7 downto 0); + I_H_FLIP : in std_logic; + I_V_FLIP : in std_logic; + I_V_BLn : in std_logic; + I_C_BLn : in std_logic; + + I_A : in std_logic_vector(9 downto 0); + I_BD : in std_logic_vector(7 downto 0); + I_OBJ_SUB_A : in std_logic_vector(2 downto 0); + I_OBJ_RAM_RQ : in std_logic; + I_OBJ_RAM_RD : in std_logic; + I_OBJ_RAM_WR : in std_logic; + I_VID_RAM_RD : in std_logic; + I_VID_RAM_WR : in std_logic; + I_DRIVER_WR : in std_logic; + + O_C_BLnX : out std_logic; + O_8HF : out std_logic; + O_256HnX : out std_logic; + O_1VF : out std_logic; + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic; + + O_BD : out std_logic_vector(7 downto 0); + O_VID : out std_logic_vector(1 downto 0); + O_COL : out std_logic_vector(2 downto 0) + ); +end; + +architecture RTL of MC_VIDEO is + + signal WB_LDn : std_logic := '0'; + signal WB_CNTRLDn : std_logic := '0'; + signal WB_CNTRCLRn : std_logic := '0'; + signal WB_COLLn : std_logic := '0'; + signal WB_VPLn : std_logic := '0'; + signal WB_OBJDATALn : std_logic := '0'; + signal WB_MLDn : std_logic := '0'; + signal WB_SLDn : std_logic := '0'; + signal W_3D : std_logic := '0'; + signal W_LDn : std_logic := '0'; + signal W_CNTRLDn : std_logic := '0'; + signal W_CNTRCLRn : std_logic := '0'; + signal W_COLLn : std_logic := '0'; + signal W_VPLn : std_logic := '0'; + signal W_OBJDATALn : std_logic := '0'; + signal W_MLDn : std_logic := '0'; + signal W_SLDn : std_logic := '0'; + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_H_POSI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_2M_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6K_Q : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_6P_Q : std_logic_vector( 6 downto 0) := (others => '0'); + signal W_45T_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2KL : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2HJ : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_RV : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_RC : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_O_OBJ_ROM_A : std_logic_vector(10 downto 0) := (others => '0'); + signal W_VID_RAM_A : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AA : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AB : std_logic_vector(11 downto 0) := (others => '0'); + signal C_2HJ : std_logic_vector( 1 downto 0) := (others => '0'); + signal C_2KL : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_CD : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_1M : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_A : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_B : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_Y : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_LRAM_DI : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_LRAM_DO : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_1H_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_1K_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_LRAM_A : std_logic_vector( 7 downto 0) := (others => '0'); +-- signal W_OBJ_RAM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_HF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_45N_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6J_Q : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DA : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DB : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_256HnX : std_logic := '0'; + signal W_2N : std_logic := '0'; + signal W_45T_CLR : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_H_FLIP1 : std_logic := '0'; + signal W_H_FLIP2 : std_logic := '0'; + signal W_H_FLIP1X : std_logic := '0'; + signal W_H_FLIP2X : std_logic := '0'; + signal W_LRAM_AND : std_logic := '0'; + signal W_RAW0 : std_logic := '0'; + signal W_RAW1 : std_logic := '0'; + signal W_RAW_OR : std_logic := '0'; + signal W_SRCLK : std_logic := '0'; + signal W_SRLD : std_logic := '0'; + signal W_VID_RAM_CS : std_logic := '0'; + signal W_CLK_6Mn : std_logic := '0'; + +begin + ld_pls : entity work.MC_LD_PLS + port map( + I_CLK_6M => I_CLK_6M, + I_H_CNT => I_H_CNT, + I_3D_DI => W_3D, + + O_LDn => WB_LDn, + O_CNTRLDn => WB_CNTRLDn, + O_CNTRCLRn => WB_CNTRCLRn, + O_COLLn => WB_COLLn, + O_VPLn => WB_VPLn, + O_OBJDATALn => WB_OBJDATALn, + O_MLDn => WB_MLDn, + O_SLDn => WB_SLDn + ); + + obj_ram : entity work.MC_OBJ_RAM + port map( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(7 downto 0), + I_WEA => I_OBJ_RAM_WR, + I_CEA => I_OBJ_RAM_RQ, + I_DA => I_BD, + O_DA => W_OBJ_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_OBJ_RAM_AB, + I_WEB => '0', + I_CEB => '1', + I_DB => x"00", + O_DB => W_OBJ_RAM_DOB + ); + + lram : entity work.MC_LRAM + port map( + I_CLK => I_CLK_18M, + I_ADDR => W_LRAM_A, + I_WE => W_CLK_6Mn, + I_D => W_LRAM_DI, + O_Dn => W_LRAM_DO + ); + + missile : entity work.MC_MISSILE + port map( + I_CLK_18M => I_CLK_18M, + I_CLK_6M => I_CLK_6M, + I_C_BLn_X => W_C_BLnX, + I_MLDn => W_MLDn, + I_SLDn => W_SLDn, + I_HPOS => W_H_POSI, + O_MISSILEn => O_MISSILEn, + O_SHELLn => O_SHELLn + ); + + vid_ram : entity work.MC_VID_RAM + port map ( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(9 downto 0), + I_DA => W_VID_RAM_DI, + I_WEA => I_VID_RAM_WR, + I_CEA => W_VID_RAM_CS, + O_DA => W_VID_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_VID_RAM_A(9 downto 0), + I_DB => x"00", + I_WEB => '0', + I_CEB => '1', + O_DB => W_VID_RAM_DOB + ); + + -- 1K VID-Rom + k_rom : entity work.GALAXIAN_1K + port map ( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1K_D + ); + + -- 1H VID-Rom + h_rom : entity work.GALAXIAN_1H + port map( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1H_D + ); + +----------------------------------------------------------------------------------- + + process(I_CLK_12M) + begin + if falling_edge(I_CLK_12M) then + W_LDn <= WB_LDn; + W_CNTRLDn <= WB_CNTRLDn; + W_CNTRCLRn <= WB_CNTRCLRn; + W_COLLn <= WB_COLLn; + W_VPLn <= WB_VPLn; + W_OBJDATALn <= WB_OBJDATALn; + W_MLDn <= WB_MLDn; + W_SLDn <= WB_SLDn; + end if; + end process; + + W_CLK_6Mn <= not I_CLK_6M; + + W_6J_DA <= I_H_FLIP & W_HF_CNT(7) & W_HF_CNT(3) & I_H_CNT(2); + W_6J_DB <= W_OBJ_D(6) & ( W_HF_CNT(3) and I_H_CNT(1) ) & I_H_CNT(2) & I_H_CNT(1); + W_6J_Q <= W_6J_DB when I_H_CNT(8) = '1' else W_6J_DA; + + W_H_FLIP1 <= (not I_H_CNT(8)) and I_H_FLIP; + + W_HF_CNT(7 downto 3) <= not I_H_CNT(7 downto 3) when W_H_FLIP1 = '1' else I_H_CNT(7 downto 3); + W_VF_CNT <= not I_V_CNT when I_V_FLIP = '1' else I_V_CNT; + + O_8HF <= W_HF_CNT(3); + O_1VF <= W_VF_CNT(0); + W_H_FLIP2 <= W_6J_Q(3); + +-- Parts 4F,5F + W_OBJ_RAM_AB <= "0" & I_H_CNT(8) & W_6J_Q(2) & W_HF_CNT(6 downto 4) & W_6J_Q(1 downto 0); +-- W_OBJ_RAM_A <= W_OBJ_RAM_AB when I_OBJ_RAM_RQ = '0' else I_A(7 downto 0) ; + + process(I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_H_POSI <= W_OBJ_RAM_DOB; + end if; + end process; + + W_OBJ_RAM_D <= W_OBJ_RAM_DOA when I_OBJ_RAM_RD = '1' else (others => '0'); + +-- Parts 4L + process(W_OBJDATALn) + begin + if rising_edge(W_OBJDATALn) then + W_OBJ_D <= W_H_POSI; + end if; + end process; + +-- Parts 4,5N + W_45N_Q <= W_VF_CNT + W_H_POSI; + W_3D <= '0' when W_45N_Q = x"FF" else '1'; + + process(W_VPLn, I_V_BLn) + begin + if (I_V_BLn = '0') then + W_2M_Q <= (others => '0'); + elsif rising_edge(W_VPLn) then + W_2M_Q <= W_45N_Q; + end if; + end process; + + W_2N <= I_H_CNT(8) and W_OBJ_D(7); + W_1M <= W_2M_Q(3 downto 0) xor (W_2N & W_2N & W_2N & W_2N); + W_VID_RAM_CS <= I_VID_RAM_RD or I_VID_RAM_WR; + W_VID_RAM_DI <= I_BD when I_VID_RAM_WR = '1' else (others => '0'); + W_VID_RAM_AA <= (not ( W_2M_Q(7) and W_2M_Q(6) and W_2M_Q(5) and W_2M_Q(4))) & (not W_VID_RAM_CS) & "0000000000"; -- I_A(9:0) + W_VID_RAM_AB <= "00" & W_2M_Q(7 downto 4) & W_1M(3) & W_HF_CNT(7 downto 3); + W_VID_RAM_A <= W_VID_RAM_AB when I_C_BLn = '1' else W_VID_RAM_AA; + W_VID_RAM_D <= W_VID_RAM_DOA when I_VID_RAM_RD = '1' else (others => '0'); + +---- VIDEO DATA OUTPUT -------------- + + O_BD <= W_OBJ_RAM_D or W_VID_RAM_D; + W_SRLD <= not (W_LDn or W_VID_RAM_A(11)); + W_OBJ_ROM_AB <= W_OBJ_D(5 downto 0) & W_1M(3) & (W_OBJ_D(6) xor I_H_CNT(3)); + W_OBJ_ROM_A <= W_OBJ_ROM_AB when I_H_CNT(8) = '1' else W_VID_RAM_DOB; + W_O_OBJ_ROM_A <= W_OBJ_ROM_A & W_1M(2 downto 0); + +----------------------------------------------------------------------------------- + + W_3L_A <= reg_2HJ(7) & reg_2KL(7) & "1" & W_SRLD; + W_3L_B <= reg_2HJ(0) & reg_2KL(0) & W_SRLD & "1"; + W_3L_Y <= W_3L_B when W_H_FLIP2X = '1' else W_3L_A; -- (3)=RAW1,(2)=RAW0 + C_2HJ <= W_3L_Y(1 downto 0); + C_2KL <= W_3L_Y(1 downto 0); + W_RAW0 <= W_3L_Y(2); + W_RAW1 <= W_3L_Y(3); + W_SRCLK <= I_CLK_6M; + +-------- PARTS 2KL ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2KL) is + when "00" => reg_2KL <= reg_2KL; + when "10" => reg_2KL <= reg_2KL(6 downto 0) & "0"; + when "01" => reg_2KL <= "0" & reg_2KL(7 downto 1); + when "11" => reg_2KL <= W_1K_D; + when others => null; + end case; + end if; + end process; + +-------- PARTS 2HJ ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2HJ) is + when "00" => reg_2HJ <= reg_2HJ; + when "10" => reg_2HJ <= reg_2HJ(6 downto 0) & "0"; + when "01" => reg_2HJ <= "0" & reg_2HJ(7 downto 1); + when "11" => reg_2HJ <= W_1H_D; + when others => null; + end case; + end if; + end process; + +------- SHT2 ----------------------------------------------------- + +-- Parts 6K + process(W_COLLn) + begin + if rising_edge(W_COLLn) then + W_6K_Q <= W_H_POSI(2 downto 0); + end if; + end process; + +-- Parts 6P + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + if (W_LDn = '0') then + W_6P_Q <= W_H_FLIP2 & W_H_FLIP1 & I_C_BLn & (not I_H_CNT(8)) & W_6K_Q(2 downto 0); + else + W_6P_Q <= W_6P_Q; + end if; + end if; + end process; + + W_H_FLIP2X <= W_6P_Q(6); + W_H_FLIP1X <= W_6P_Q(5); + W_C_BLnX <= W_6P_Q(4); + W_256HnX <= W_6P_Q(3); + W_CD <= W_6P_Q(2 downto 0); + O_256HnX <= W_256HnX; + O_C_BLnX <= W_C_BLnX; + W_45T_CLR <= W_CNTRCLRn or W_256HnX ; + + process(I_CLK_6M, W_45T_CLR) + begin + if (W_45T_CLR = '0') then + W_45T_Q <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + if (W_CNTRLDn = '0') then + W_45T_Q <= W_H_POSI; + else + W_45T_Q <= W_45T_Q + 1; + end if; + end if; + end process; + + W_LRAM_A <= (not W_45T_Q) when W_H_FLIP1X = '1' else W_45T_Q; + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_RV <= W_LRAM_DO(1 downto 0); + W_RC <= W_LRAM_DO(4 downto 2); + end if; + end process; + + W_LRAM_AND <= not (not ((W_LRAM_A(4) or W_LRAM_A(5)) or (W_LRAM_A(6) or W_LRAM_A(7))) or W_256HnX ); + W_RAW_OR <= W_RAW0 or W_RAW1 ; + + W_VID(0) <= not (not (W_RAW0 and W_RV(1)) and W_RV(0)); + W_VID(1) <= not (not (W_RAW1 and W_RV(0)) and W_RV(1)); + W_COL(0) <= not (not (W_RAW_OR and W_CD(0) and W_RC(1) and W_RC(2)) and W_RC(0)); + W_COL(1) <= not (not (W_RAW_OR and W_CD(1) and W_RC(2) and W_RC(0)) and W_RC(1)); + W_COL(2) <= not (not (W_RAW_OR and W_CD(2) and W_RC(0) and W_RC(1)) and W_RC(2)); + + O_VID <= W_VID; + O_COL <= W_COL; + + W_LRAM_DI(0) <= W_LRAM_AND and W_VID(0); + W_LRAM_DI(1) <= W_LRAM_AND and W_VID(1); + W_LRAM_DI(2) <= W_LRAM_AND and W_COL(0); + W_LRAM_DI(3) <= W_LRAM_AND and W_COL(1); + W_LRAM_DI(4) <= W_LRAM_AND and W_COL(2); + +end RTL; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mist_io.v b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_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/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/osd.v b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_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/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/pll.qip b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_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 VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/pll.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d76a5e1d --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/pll.vhd @@ -0,0 +1,451 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + c3 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + clk3_divide_by : NATURAL; + clk3_duty_cycle : NATURAL; + clk3_multiply_by : NATURAL; + clk3_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire2 <= sub_wire0(3); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c3 <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 3, + clk0_duty_cycle => 50, + clk0_multiply_by => 2, + clk0_phase_shift => "0", + clk1_divide_by => 9, + clk1_duty_cycle => 50, + clk1_multiply_by => 4, + clk1_phase_shift => "0", + clk2_divide_by => 9, + clk2_duty_cycle => 50, + clk2_multiply_by => 2, + clk2_phase_shift => "0", + clk3_divide_by => 6, + clk3_duty_cycle => 50, + clk3_multiply_by => 1, + clk3_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_USED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire6, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "3" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "6" +-- 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: DUTY_CYCLE3 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "18.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "12.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "6.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "4.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 "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "4" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "18.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "12.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "6.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "4.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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 "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "3" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "4" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "6" +-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK3_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_USED" +-- 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_USED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/scandoubler.v b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..eba1d598 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_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/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/sine_package.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/sine_package.vhd new file mode 100644 index 00000000..473caa04 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/sine_package.vhd @@ -0,0 +1,152 @@ +library ieee; +use ieee.std_logic_1164.all; + +package sine_package is + + subtype table_value_type is integer range 0 to 16383; + subtype table_index_type is std_logic_vector( 6 downto 0 ); + + function get_table_value (table_index: table_index_type) return table_value_type; + +end; + +package body sine_package is + + function get_table_value (table_index: table_index_type) return table_value_type is + variable table_value: table_value_type; + begin + case table_index is + when "0000000" => table_value := 101; + when "0000001" => table_value := 302; + when "0000010" => table_value := 503; + when "0000011" => table_value := 703; + when "0000100" => table_value := 904; + when "0000101" => table_value := 1105; + when "0000110" => table_value := 1305; + when "0000111" => table_value := 1506; + when "0001000" => table_value := 1706; + when "0001001" => table_value := 1906; + when "0001010" => table_value := 2105; + when "0001011" => table_value := 2304; + when "0001100" => table_value := 2503; + when "0001101" => table_value := 2702; + when "0001110" => table_value := 2900; + when "0001111" => table_value := 3098; + when "0010000" => table_value := 3295; + when "0010001" => table_value := 3491; + when "0010010" => table_value := 3688; + when "0010011" => table_value := 3883; + when "0010100" => table_value := 4078; + when "0010101" => table_value := 4273; + when "0010110" => table_value := 4466; + when "0010111" => table_value := 4659; + when "0011000" => table_value := 4852; + when "0011001" => table_value := 5044; + when "0011010" => table_value := 5234; + when "0011011" => table_value := 5425; + when "0011100" => table_value := 5614; + when "0011101" => table_value := 5802; + when "0011110" => table_value := 5990; + when "0011111" => table_value := 6177; + when "0100000" => table_value := 6362; + when "0100001" => table_value := 6547; + when "0100010" => table_value := 6731; + when "0100011" => table_value := 6914; + when "0100100" => table_value := 7095; + when "0100101" => table_value := 7276; + when "0100110" => table_value := 7456; + when "0100111" => table_value := 7634; + when "0101000" => table_value := 7811; + when "0101001" => table_value := 7988; + when "0101010" => table_value := 8162; + when "0101011" => table_value := 8336; + when "0101100" => table_value := 8509; + when "0101101" => table_value := 8680; + when "0101110" => table_value := 8850; + when "0101111" => table_value := 9018; + when "0110000" => table_value := 9185; + when "0110001" => table_value := 9351; + when "0110010" => table_value := 9515; + when "0110011" => table_value := 9678; + when "0110100" => table_value := 9840; + when "0110101" => table_value := 10000; + when "0110110" => table_value := 10158; + when "0110111" => table_value := 10315; + when "0111000" => table_value := 10471; + when "0111001" => table_value := 10625; + when "0111010" => table_value := 10777; + when "0111011" => table_value := 10927; + when "0111100" => table_value := 11076; + when "0111101" => table_value := 11224; + when "0111110" => table_value := 11369; + when "0111111" => table_value := 11513; + when "1000000" => table_value := 11655; + when "1000001" => table_value := 11796; + when "1000010" => table_value := 11934; + when "1000011" => table_value := 12071; + when "1000100" => table_value := 12206; + when "1000101" => table_value := 12339; + when "1000110" => table_value := 12471; + when "1000111" => table_value := 12600; + when "1001000" => table_value := 12728; + when "1001001" => table_value := 12853; + when "1001010" => table_value := 12977; + when "1001011" => table_value := 13099; + when "1001100" => table_value := 13219; + when "1001101" => table_value := 13336; + when "1001110" => table_value := 13452; + when "1001111" => table_value := 13566; + when "1010000" => table_value := 13678; + when "1010001" => table_value := 13787; + when "1010010" => table_value := 13895; + when "1010011" => table_value := 14000; + when "1010100" => table_value := 14104; + when "1010101" => table_value := 14205; + when "1010110" => table_value := 14304; + when "1010111" => table_value := 14401; + when "1011000" => table_value := 14496; + when "1011001" => table_value := 14588; + when "1011010" => table_value := 14679; + when "1011011" => table_value := 14767; + when "1011100" => table_value := 14853; + when "1011101" => table_value := 14936; + when "1011110" => table_value := 15018; + when "1011111" => table_value := 15097; + when "1100000" => table_value := 15174; + when "1100001" => table_value := 15249; + when "1100010" => table_value := 15321; + when "1100011" => table_value := 15391; + when "1100100" => table_value := 15459; + when "1100101" => table_value := 15524; + when "1100110" => table_value := 15587; + when "1100111" => table_value := 15648; + when "1101000" => table_value := 15706; + when "1101001" => table_value := 15762; + when "1101010" => table_value := 15816; + when "1101011" => table_value := 15867; + when "1101100" => table_value := 15916; + when "1101101" => table_value := 15963; + when "1101110" => table_value := 16007; + when "1101111" => table_value := 16048; + when "1110000" => table_value := 16088; + when "1110001" => table_value := 16124; + when "1110010" => table_value := 16159; + when "1110011" => table_value := 16191; + when "1110100" => table_value := 16220; + when "1110101" => table_value := 16247; + when "1110110" => table_value := 16272; + when "1110111" => table_value := 16294; + when "1111000" => table_value := 16314; + when "1111001" => table_value := 16331; + when "1111010" => table_value := 16346; + when "1111011" => table_value := 16358; + when "1111100" => table_value := 16368; + when "1111101" => table_value := 16375; + when "1111110" => table_value := 16380; + when "1111111" => table_value := 16383; + when others => null; + end case; + return table_value; + end; + +end; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/spram.vhd b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/spram.vhd new file mode 100644 index 00000000..ad6b58b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone V", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/video_mixer.sv b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..b9f7e424 --- /dev/null +++ b/Arcade/Galaxian Hardware/BlackHole_MiST/rtl/video_mixer.sv @@ -0,0 +1,243 @@ +// +// +// 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; +reg [DWIDTH:0] Rd,Gd,Bd; +always @(posedge clk_sys) {Rd,Gd,Bd} <= {R,G,B}; +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(Rd), + .g_in(Gd), + .b_in(Bd), + + .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/Arcade/Galaxian Hardware/Catacomb_MiST/Catacomb.qpf b/Arcade/Galaxian Hardware/Catacomb_MiST/Catacomb.qpf new file mode 100644 index 00000000..3b0d4109 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/Catacomb.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:59:16 November 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "14:59:16 November 16, 2017" + +# Revisions + +PROJECT_REVISION = "Catacomb" \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/Catacomb.qsf b/Arcade/Galaxian Hardware/Catacomb_MiST/Catacomb.qsf new file mode 100644 index 00000000..5e04b7ba --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/Catacomb.qsf @@ -0,0 +1,190 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 18:12:35 November 17, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Galaxian_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80as.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_6L.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1K.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1H.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_HIT.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_FIR.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/sine_package.vhd +set_global_assignment -name VHDL_FILE rtl/mc_stars.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_vco.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_b.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_a.vhd +set_global_assignment -name VHDL_FILE rtl/mc_missile.vhd +set_global_assignment -name VHDL_FILE rtl/mc_logic.vhd +set_global_assignment -name VHDL_FILE rtl/mc_ld_pls.vhd +set_global_assignment -name VHDL_FILE rtl/mc_inport.vhd +set_global_assignment -name VHDL_FILE rtl/mc_hv_count.vhd +set_global_assignment -name VHDL_FILE rtl/mc_col_pal.vhd +set_global_assignment -name VHDL_FILE rtl/mc_bram.vhd +set_global_assignment -name VHDL_FILE rtl/mc_adec.vhd +set_global_assignment -name VHDL_FILE rtl/galaxian.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Catacomb +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Galaxian) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Galaxian) +# -------------------- +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name VHDL_FILE rtl/mc_video.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Catacomb.sv +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_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/Catacomb.srf b/Arcade/Galaxian Hardware/Catacomb_MiST/Catacomb.srf new file mode 100644 index 00000000..14cddd5e --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/Catacomb.srf @@ -0,0 +1,54 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Clock multiplexers are found and protected" { } { } 0 19016 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169177 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169203 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/README.txt b/Arcade/Galaxian Hardware/Catacomb_MiST/README.txt new file mode 100644 index 00000000..f7001aa3 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Catacomb port to MiST by Gehstock +-- 19 December 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Galaxian hardware +-- Copyright(c) 2004 Katsumi Degawa +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- F2 : Coin + Start 2 players +-- F1 : Coin + Start 1 player +-- SPACE : Fire +-- ARROW KEYS : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/Release/Catacomb.rbf b/Arcade/Galaxian Hardware/Catacomb_MiST/Release/Catacomb.rbf new file mode 100644 index 00000000..9ec4c661 Binary files /dev/null and b/Arcade/Galaxian Hardware/Catacomb_MiST/Release/Catacomb.rbf differ diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/clean.bat b/Arcade/Galaxian Hardware/Catacomb_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_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/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/Catacomb.sv b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/Catacomb.sv new file mode 100644 index 00000000..0ee557ef --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/Catacomb.sv @@ -0,0 +1,176 @@ +//============================================================================ +// Arcade: Catacomb +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Catacomb +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Catacomb;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_18, clk_12, clk_6, clk_4p5; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_18), + .c1(clk_12), + .c2(clk_6), + .c3(clk_4p5)//for now, needs a fix +); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +galaxian catacomb +( + .W_CLK_18M(clk_18), + .W_CLK_12M(clk_12), + .W_CLK_6M(clk_6), + .I_RESET(status[0] | status[6] | buttons[1]), + .P1_CSJUDLR({m_coin,m_start1,m_fire,m_up,m_down,m_left,m_right}), + .P2_CSJUDLR({1'b0, m_start2,m_fire,m_up,m_down,m_left,m_right}), + .W_R(r), + .W_G(g), + .W_B(b), + .W_H_SYNC(hs), + .W_V_SYNC(vs), + .HBLANK(hblank), + .VBLANK(vblank), + .W_SDAT_A(audio_a), + .W_SDAT_B(audio_b) +); + +wire [7:0] audio_a, audio_b; +wire [10:0] audio = {1'b0, audio_b, 2'b0} + {3'b0, audio_a}; + +dac dac ( + .clk_i(clk_18), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [2:0] r, g, b; +wire hblank, vblank; + +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_18), + .ce_pix(clk_4p5), + .ce_pix_actual(clk_4p5), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_18 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_18), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GALAXIAN_1H.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GALAXIAN_1H.vhd new file mode 100644 index 00000000..dec55c15 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GALAXIAN_1H.vhd @@ -0,0 +1,285 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GALAXIAN_1H is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GALAXIAN_1H is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"CF",x"0F",x"0F",x"0F",x"0F",x"0E",x"0C",x"08", -- 0x0050 + x"08",x"0C",x"0E",x"0E",x"0F",x"0F",x"0F",x"8F", -- 0x0058 + x"00",x"00",x"00",x"18",x"18",x"00",x"00",x"00", -- 0x0060 + x"18",x"28",x"38",x"2C",x"38",x"28",x"18",x"00", -- 0x0068 + x"40",x"20",x"10",x"08",x"04",x"02",x"00",x"00", -- 0x0070 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"00", -- 0x0158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0160 + x"0D",x"53",x"31",x"19",x"08",x"04",x"F2",x"00", -- 0x0168 + x"3C",x"42",x"A5",x"A5",x"A5",x"99",x"42",x"3C", -- 0x0170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0180 + x"00",x"00",x"00",x"00",x"03",x"07",x"07",x"7B", -- 0x0188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0190 + x"07",x"07",x"03",x"00",x"00",x"00",x"00",x"00", -- 0x0198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01B8 + x"F0",x"10",x"30",x"60",x"C0",x"C0",x"60",x"E0", -- 0x01C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01C8 + x"01",x"01",x"01",x"01",x"02",x"03",x"01",x"01", -- 0x01D0 + x"18",x"3C",x"7E",x"FF",x"3C",x"3C",x"3C",x"3C", -- 0x01D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01E0 + x"40",x"60",x"40",x"60",x"40",x"60",x"40",x"60", -- 0x01E8 + x"3C",x"42",x"81",x"A5",x"A5",x"99",x"42",x"3C", -- 0x01F0 + x"FF",x"9F",x"9F",x"9F",x"FF",x"91",x"91",x"91", -- 0x01F8 + x"80",x"40",x"20",x"10",x"00",x"02",x"26",x"24", -- 0x0200 + x"00",x"00",x"00",x"00",x"01",x"41",x"63",x"2F", -- 0x0208 + x"24",x"27",x"03",x"00",x"10",x"20",x"40",x"80", -- 0x0210 + x"2F",x"E3",x"C1",x"01",x"00",x"00",x"00",x"00", -- 0x0218 + x"07",x"08",x"08",x"08",x"07",x"00",x"07",x"08", -- 0x0220 + x"C0",x"20",x"20",x"20",x"C0",x"00",x"C0",x"20", -- 0x0228 + x"08",x"08",x"07",x"00",x"00",x"0F",x"04",x"00", -- 0x0230 + x"20",x"20",x"C0",x"00",x"20",x"E0",x"20",x"00", -- 0x0238 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0240 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0248 + x"07",x"00",x"06",x"09",x"08",x"08",x"04",x"00", -- 0x0250 + x"C0",x"00",x"20",x"20",x"A0",x"60",x"20",x"00", -- 0x0258 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0260 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0268 + x"07",x"00",x"07",x"09",x"09",x"08",x"04",x"00", -- 0x0270 + x"C0",x"00",x"C0",x"20",x"20",x"20",x"40",x"00", -- 0x0278 + x"01",x"07",x"1F",x"3F",x"3F",x"7F",x"7F",x"FF", -- 0x0280 + x"80",x"E0",x"F0",x"F8",x"F8",x"FC",x"FC",x"FE", -- 0x0288 + x"FF",x"7F",x"7F",x"3F",x"3F",x"1F",x"07",x"01", -- 0x0290 + x"FE",x"FC",x"FC",x"F8",x"F8",x"F0",x"E0",x"80", -- 0x0298 + x"01",x"03",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x02A0 + x"80",x"C0",x"C0",x"C0",x"CE",x"D0",x"E0",x"E0", -- 0x02A8 + x"03",x"03",x"03",x"03",x"03",x"03",x"03",x"01", -- 0x02B0 + x"E0",x"E0",x"D0",x"CE",x"C0",x"C0",x"C0",x"80", -- 0x02B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"0F", -- 0x02C0 + x"00",x"07",x"0F",x"1F",x"00",x"00",x"FF",x"FF", -- 0x02C8 + x"01",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D0 + x"FF",x"00",x"00",x"1F",x"0F",x"07",x"00",x"00", -- 0x02D8 + x"00",x"00",x"00",x"00",x"01",x"00",x"07",x"F8", -- 0x02E0 + x"00",x"00",x"00",x"00",x"C0",x"1C",x"FA",x"03", -- 0x02E8 + x"07",x"00",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x02F0 + x"FA",x"1C",x"C0",x"00",x"00",x"00",x"00",x"00", -- 0x02F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"02",x"00", -- 0x0300 + x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"E4", -- 0x0308 + x"00",x"02",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0310 + x"E4",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0", -- 0x0318 + x"0F",x"07",x"07",x"07",x"07",x"07",x"07",x"07", -- 0x0320 + x"F0",x"80",x"C0",x"E0",x"F0",x"F8",x"F8",x"F8", -- 0x0328 + x"07",x"07",x"07",x"07",x"07",x"07",x"07",x"0F", -- 0x0330 + x"F8",x"F8",x"F8",x"F0",x"E0",x"C0",x"80",x"F0", -- 0x0338 + x"0F",x"01",x"01",x"01",x"01",x"01",x"01",x"07", -- 0x0340 + x"C0",x"00",x"00",x"00",x"00",x"00",x"00",x"8F", -- 0x0348 + x"07",x"01",x"01",x"01",x"01",x"01",x"01",x"0F", -- 0x0350 + x"8F",x"00",x"00",x"00",x"00",x"00",x"00",x"E0", -- 0x0358 + x"01",x"07",x"1F",x"3F",x"3F",x"7F",x"7F",x"FF", -- 0x0360 + x"80",x"E0",x"F0",x"F8",x"F8",x"FC",x"FC",x"FE", -- 0x0368 + x"FF",x"7F",x"7F",x"3F",x"3F",x"1F",x"07",x"01", -- 0x0370 + x"FE",x"FC",x"FC",x"F8",x"F8",x"F0",x"E0",x"80", -- 0x0378 + x"00",x"00",x"0D",x"16",x"15",x"1B",x"3E",x"35", -- 0x0380 + x"00",x"E0",x"50",x"FC",x"AE",x"57",x"AB",x"F5", -- 0x0388 + x"6B",x"5E",x"75",x"2B",x"3D",x"16",x"0C",x"00", -- 0x0390 + x"5D",x"AB",x"F6",x"6E",x"DA",x"34",x"18",x"00", -- 0x0398 + x"00",x"00",x"00",x"00",x"01",x"00",x"07",x"F8", -- 0x03A0 + x"00",x"00",x"00",x"01",x"C6",x"1E",x"FC",x"10", -- 0x03A8 + x"07",x"00",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x03B0 + x"E0",x"00",x"C0",x"00",x"00",x"00",x"00",x"00", -- 0x03B8 + x"00",x"00",x"00",x"00",x"01",x"00",x"07",x"F8", -- 0x03C0 + x"00",x"00",x"00",x"00",x"C0",x"00",x"F0",x"1C", -- 0x03C8 + x"07",x"00",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x03D0 + x"FE",x"03",x"C0",x"00",x"00",x"00",x"00",x"00", -- 0x03D8 + x"0A",x"1B",x"39",x"4D",x"4C",x"FA",x"FE",x"CA", -- 0x03E0 + x"01",x"E3",x"DD",x"00",x"38",x"FC",x"E1",x"E3", -- 0x03E8 + x"CA",x"FE",x"FA",x"4C",x"4D",x"39",x"1B",x"0A", -- 0x03F0 + x"E3",x"FD",x"3C",x"38",x"00",x"C1",x"E3",x"1D", -- 0x03F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0400 + x"81",x"81",x"81",x"81",x"81",x"81",x"81",x"FF", -- 0x0408 + x"81",x"81",x"81",x"81",x"81",x"81",x"81",x"81", -- 0x0410 + x"FF",x"81",x"81",x"81",x"81",x"81",x"81",x"81", -- 0x0418 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"01", -- 0x0420 + x"00",x"00",x"00",x"00",x"80",x"80",x"C0",x"C0", -- 0x0428 + x"00",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0430 + x"80",x"C0",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0438 + x"02",x"03",x"00",x"00",x"03",x"03",x"02",x"02", -- 0x0440 + x"E0",x"F0",x"F0",x"F0",x"B0",x"F0",x"B0",x"B0", -- 0x0448 + x"07",x"07",x"07",x"03",x"03",x"00",x"00",x"00", -- 0x0450 + x"F0",x"B0",x"B0",x"F0",x"B0",x"A0",x"E0",x"C0", -- 0x0458 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x0460 + x"00",x"00",x"00",x"00",x"00",x"40",x"C0",x"C0", -- 0x0468 + x"03",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0470 + x"80",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0478 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x0480 + x"00",x"00",x"00",x"00",x"00",x"00",x"C0",x"C0", -- 0x0488 + x"03",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0490 + x"80",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0498 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"02", -- 0x04A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"C0", -- 0x04A8 + x"03",x"02",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04B0 + x"F0",x"C0",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04B8 + x"0A",x"1B",x"39",x"4D",x"7C",x"CA",x"CA",x"FE", -- 0x04C0 + x"00",x"F8",x"C7",x"00",x"20",x"30",x"F0",x"F8", -- 0x04C8 + x"FE",x"CA",x"CA",x"7C",x"4D",x"3D",x"1B",x"0A", -- 0x04D0 + x"F8",x"F7",x"30",x"20",x"00",x"C0",x"F8",x"07", -- 0x04D8 + x"0F",x"09",x"01",x"03",x"01",x"01",x"02",x"02", -- 0x04E0 + x"78",x"48",x"40",x"80",x"E0",x"60",x"A0",x"80", -- 0x04E8 + x"02",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F0 + x"00",x"00",x"00",x"20",x"00",x"00",x"00",x"00", -- 0x04F8 + x"00",x"01",x"01",x"01",x"01",x"00",x"02",x"07", -- 0x0500 + x"80",x"C0",x"E0",x"E0",x"E0",x"C0",x"E0",x"D0", -- 0x0508 + x"06",x"26",x"3F",x"06",x"01",x"01",x"01",x"01", -- 0x0510 + x"C0",x"E0",x"C0",x"D0",x"E0",x"40",x"20",x"80", -- 0x0518 + x"0F",x"09",x"01",x"01",x"03",x"01",x"07",x"03", -- 0x0520 + x"78",x"48",x"40",x"E0",x"A0",x"E0",x"40",x"C0", -- 0x0528 + x"01",x"01",x"01",x"01",x"00",x"02",x"00",x"00", -- 0x0530 + x"C0",x"80",x"40",x"00",x"00",x"00",x"00",x"00", -- 0x0538 + x"00",x"01",x"01",x"01",x"03",x"00",x"07",x"04", -- 0x0540 + x"80",x"C0",x"C0",x"C0",x"E0",x"C0",x"D0",x"F0", -- 0x0548 + x"04",x"07",x"04",x"00",x"03",x"01",x"03",x"07", -- 0x0550 + x"D0",x"D0",x"F0",x"C0",x"E0",x"C0",x"E0",x"F0", -- 0x0558 + x"0F",x"09",x"01",x"01",x"00",x"03",x"03",x"01", -- 0x0560 + x"78",x"48",x"00",x"C0",x"E0",x"A0",x"C0",x"40", -- 0x0568 + x"01",x"00",x"00",x"01",x"01",x"00",x"00",x"00", -- 0x0570 + x"C0",x"80",x"C0",x"60",x"20",x"40",x"00",x"00", -- 0x0578 + x"00",x"01",x"01",x"01",x"03",x"03",x"04",x"04", -- 0x0580 + x"80",x"C0",x"C0",x"C0",x"E0",x"E0",x"D0",x"D0", -- 0x0588 + x"07",x"04",x"04",x"03",x"02",x"01",x"03",x"07", -- 0x0590 + x"F0",x"D0",x"C0",x"E0",x"E0",x"C0",x"E0",x"F0", -- 0x0598 + x"0F",x"09",x"01",x"01",x"03",x"01",x"02",x"01", -- 0x05A0 + x"78",x"48",x"00",x"C0",x"E0",x"80",x"C0",x"00", -- 0x05A8 + x"01",x"01",x"02",x"01",x"01",x"01",x"00",x"00", -- 0x05B0 + x"C0",x"C0",x"80",x"80",x"00",x"00",x"80",x"80", -- 0x05B8 + x"00",x"01",x"01",x"01",x"03",x"00",x"04",x"07", -- 0x05C0 + x"80",x"C0",x"C0",x"C0",x"E0",x"C0",x"F0",x"D0", -- 0x05C8 + x"04",x"04",x"07",x"00",x"01",x"01",x"03",x"07", -- 0x05D0 + x"D0",x"F0",x"D0",x"C0",x"E0",x"40",x"60",x"70", -- 0x05D8 + x"0A",x"1B",x"39",x"4D",x"7C",x"CA",x"CA",x"FE", -- 0x05E0 + x"03",x"C7",x"EB",x"00",x"3F",x"3F",x"C7",x"C7", -- 0x05E8 + x"FE",x"CA",x"CA",x"7C",x"4D",x"39",x"1B",x"0A", -- 0x05F0 + x"C7",x"FF",x"3F",x"3F",x"00",x"C3",x"C7",x"3B", -- 0x05F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0600 + x"B6",x"6D",x"DB",x"B6",x"6D",x"DB",x"B6",x"6D", -- 0x0608 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0610 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"FF", -- 0x0620 + x"00",x"00",x"00",x"00",x"00",x"00",x"FF",x"FF", -- 0x0628 + x"00",x"00",x"00",x"00",x"00",x"FF",x"FF",x"FF", -- 0x0630 + x"00",x"00",x"00",x"00",x"FF",x"FF",x"FF",x"FF", -- 0x0638 + x"00",x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0640 + x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0648 + x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0650 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0658 + x"01",x"03",x"04",x"03",x"27",x"3E",x"6C",x"F8", -- 0x0660 + x"86",x"CF",x"2F",x"C6",x"E0",x"70",x"36",x"1F", -- 0x0668 + x"FE",x"6F",x"3F",x"27",x"03",x"04",x"03",x"01", -- 0x0670 + x"7F",x"F6",x"F0",x"E0",x"C6",x"2F",x"CF",x"86", -- 0x0678 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0680 + x"E7",x"24",x"24",x"3C",x"3C",x"24",x"24",x"E7", -- 0x0688 + x"00",x"70",x"F0",x"9B",x"8B",x"C0",x"60",x"00", -- 0x0690 + x"FF",x"D3",x"81",x"C9",x"82",x"91",x"CB",x"F3", -- 0x0698 + x"00",x"00",x"00",x"01",x"01",x"03",x"04",x"06", -- 0x06A0 + x"80",x"80",x"00",x"00",x"80",x"C0",x"C0",x"A0", -- 0x06A8 + x"15",x"0B",x"0D",x"0F",x"02",x"07",x"01",x"01", -- 0x06B0 + x"88",x"78",x"F8",x"B0",x"E0",x"B0",x"E0",x"40", -- 0x06B8 + x"00",x"02",x"03",x"0E",x"16",x"23",x"17",x"0C", -- 0x06C0 + x"48",x"B0",x"20",x"44",x"98",x"20",x"A0",x"C0", -- 0x06C8 + x"0F",x"0C",x"17",x"23",x"16",x"0F",x"02",x"02", -- 0x06D0 + x"C0",x"C0",x"A0",x"20",x"98",x"44",x"B0",x"48", -- 0x06D8 + x"00",x"1D",x"0F",x"07",x"07",x"0F",x"0F",x"0F", -- 0x06E0 + x"00",x"C0",x"80",x"00",x"00",x"80",x"80",x"C0", -- 0x06E8 + x"1F",x"1F",x"1F",x"03",x"09",x"0F",x"00",x"00", -- 0x06F0 + x"C0",x"C0",x"40",x"00",x"00",x"00",x"00",x"00", -- 0x06F8 + x"20",x"10",x"08",x"04",x"04",x"41",x"03",x"01", -- 0x0700 + x"00",x"00",x"01",x"02",x"1C",x"80",x"A2",x"60", -- 0x0708 + x"06",x"13",x"20",x"40",x"00",x"02",x"10",x"00", -- 0x0710 + x"40",x"CC",x"80",x"60",x"10",x"08",x"03",x"00", -- 0x0718 + x"08",x"04",x"04",x"02",x"81",x"43",x"22",x"15", -- 0x0720 + x"01",x"06",x"08",x"10",x"30",x"20",x"C0",x"A0", -- 0x0728 + x"0F",x"09",x"06",x"33",x"40",x"81",x"01",x"02", -- 0x0730 + x"50",x"DE",x"61",x"D0",x"10",x"18",x"08",x"04", -- 0x0738 + x"04",x"02",x"02",x"01",x"06",x"8F",x"76",x"1A", -- 0x0740 + x"04",x"08",x"10",x"C0",x"B0",x"E8",x"2F",x"98", -- 0x0748 + x"1B",x"1C",x"0A",x"07",x"07",x"08",x"08",x"10", -- 0x0750 + x"EC",x"CC",x"B8",x"F0",x"90",x"08",x"86",x"41", -- 0x0758 + x"80",x"40",x"25",x"1F",x"17",x"0D",x"5B",x"B2", -- 0x0760 + x"21",x"41",x"42",x"B4",x"FC",x"B0",x"D8",x"EE", -- 0x0768 + x"1A",x"0F",x"05",x"1E",x"1D",x"23",x"40",x"80", -- 0x0770 + x"E9",x"56",x"F8",x"DC",x"E8",x"4C",x"82",x"81", -- 0x0778 + x"00",x"03",x"0F",x"3F",x"3F",x"7F",x"FF",x"FF", -- 0x0780 + x"00",x"80",x"80",x"E0",x"E0",x"F0",x"F8",x"FE", -- 0x0788 + x"FF",x"FF",x"7F",x"7F",x"1F",x"0F",x"0F",x"06", -- 0x0790 + x"FF",x"FF",x"FE",x"FC",x"F0",x"E0",x"00",x"00", -- 0x0798 + x"28",x"44",x"00",x"08",x"08",x"10",x"00",x"40", -- 0x07A0 + x"00",x"20",x"00",x"66",x"02",x"00",x"20",x"44", -- 0x07A8 + x"0A",x"08",x"20",x"A0",x"41",x"08",x"0A",x"00", -- 0x07B0 + x"46",x"00",x"00",x"C0",x"00",x"04",x"10",x"10", -- 0x07B8 + x"20",x"0E",x"CD",x"FC",x"1F",x"E5",x"CD",x"58", -- 0x07C0 + x"3E",x"CD",x"62",x"3D",x"CD",x"F4",x"3C",x"E1", -- 0x07C8 + x"C5",x"D5",x"4F",x"CD",x"39",x"23",x"47",x"C5", -- 0x07D0 + x"E5",x"2A",x"71",x"0E",x"E3",x"06",x"82",x"C5", -- 0x07D8 + x"33",x"CD",x"2D",x"33",x"C4",x"03",x"19",x"22", -- 0x07E0 + x"79",x"0E",x"ED",x"73",x"7B",x"0E",x"7E",x"FE", -- 0x07E8 + x"3A",x"28",x"29",x"B7",x"C2",x"99",x"10",x"23", -- 0x07F0 + x"7E",x"23",x"B6",x"CA",x"37",x"10",x"23",x"5E" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GALAXIAN_1K.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GALAXIAN_1K.vhd new file mode 100644 index 00000000..4ed5bb4c --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GALAXIAN_1K.vhd @@ -0,0 +1,285 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GALAXIAN_1K is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GALAXIAN_1K is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"CF",x"0F",x"0F",x"0F",x"0F",x"0E",x"0C",x"08", -- 0x0050 + x"08",x"0C",x"0E",x"0E",x"0F",x"0F",x"0F",x"8F", -- 0x0058 + x"00",x"00",x"00",x"18",x"18",x"00",x"00",x"00", -- 0x0060 + x"18",x"28",x"38",x"2C",x"38",x"28",x"18",x"00", -- 0x0068 + x"40",x"20",x"10",x"08",x"04",x"02",x"00",x"00", -- 0x0070 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"00", -- 0x0158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0160 + x"0D",x"13",x"11",x"09",x"00",x"00",x"F0",x"00", -- 0x0168 + x"3C",x"42",x"A5",x"A5",x"A5",x"99",x"42",x"3C", -- 0x0170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"03", -- 0x0180 + x"00",x"00",x"00",x"03",x"04",x"08",x"78",x"FC", -- 0x0188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0190 + x"78",x"08",x"04",x"03",x"00",x"00",x"00",x"00", -- 0x0198 + x"00",x"00",x"00",x"00",x"81",x"42",x"24",x"18", -- 0x01A0 + x"00",x"30",x"48",x"84",x"03",x"00",x"00",x"00", -- 0x01A8 + x"00",x"10",x"28",x"44",x"83",x"00",x"00",x"00", -- 0x01B0 + x"00",x"00",x"00",x"00",x"83",x"44",x"28",x"10", -- 0x01B8 + x"F0",x"10",x"30",x"60",x"C0",x"C0",x"60",x"E0", -- 0x01C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01C8 + x"01",x"01",x"01",x"01",x"02",x"03",x"01",x"01", -- 0x01D0 + x"18",x"3C",x"7E",x"FF",x"3C",x"3C",x"3C",x"3C", -- 0x01D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01E0 + x"40",x"60",x"40",x"60",x"40",x"60",x"40",x"60", -- 0x01E8 + x"3C",x"42",x"81",x"A5",x"A5",x"99",x"42",x"3C", -- 0x01F0 + x"FF",x"9F",x"9F",x"9F",x"FF",x"91",x"91",x"91", -- 0x01F8 + x"80",x"40",x"20",x"10",x"00",x"02",x"26",x"24", -- 0x0200 + x"00",x"00",x"00",x"00",x"01",x"41",x"63",x"2F", -- 0x0208 + x"24",x"27",x"03",x"00",x"10",x"20",x"40",x"80", -- 0x0210 + x"2F",x"E3",x"C1",x"01",x"00",x"00",x"00",x"00", -- 0x0218 + x"07",x"08",x"08",x"08",x"07",x"00",x"07",x"08", -- 0x0220 + x"C0",x"20",x"20",x"20",x"C0",x"00",x"C0",x"20", -- 0x0228 + x"08",x"08",x"07",x"00",x"00",x"0F",x"04",x"00", -- 0x0230 + x"20",x"20",x"C0",x"00",x"20",x"E0",x"20",x"00", -- 0x0238 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0240 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0248 + x"07",x"00",x"06",x"09",x"08",x"08",x"04",x"00", -- 0x0250 + x"C0",x"00",x"20",x"20",x"A0",x"60",x"20",x"00", -- 0x0258 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0260 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0268 + x"07",x"00",x"07",x"09",x"09",x"08",x"04",x"00", -- 0x0270 + x"C0",x"00",x"C0",x"20",x"20",x"20",x"40",x"00", -- 0x0278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0290 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0298 + x"00",x"00",x"01",x"00",x"08",x"1D",x"1C",x"1C", -- 0x02A0 + x"00",x"00",x"80",x"00",x"00",x"80",x"00",x"00", -- 0x02A8 + x"1C",x"1C",x"1D",x"08",x"00",x"01",x"00",x"00", -- 0x02B0 + x"00",x"00",x"80",x"00",x"00",x"80",x"00",x"00", -- 0x02B8 + x"00",x"00",x"00",x"00",x"00",x"01",x"1E",x"F0", -- 0x02C0 + x"00",x"00",x"00",x"00",x"FF",x"FF",x"00",x"00", -- 0x02C8 + x"1E",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D0 + x"00",x"FF",x"FF",x"00",x"00",x"00",x"00",x"00", -- 0x02D8 + x"00",x"00",x"00",x"01",x"02",x"07",x"F8",x"07", -- 0x02E0 + x"00",x"00",x"00",x"C0",x"00",x"DC",x"3A",x"C3", -- 0x02E8 + x"F8",x"07",x"02",x"01",x"00",x"00",x"00",x"00", -- 0x02F0 + x"3A",x"DC",x"00",x"C0",x"00",x"00",x"00",x"00", -- 0x02F8 + x"00",x"00",x"00",x"01",x"03",x"07",x"0D",x"1F", -- 0x0300 + x"00",x"00",x"10",x"10",x"18",x"18",x"1E",x"1A", -- 0x0308 + x"1F",x"0D",x"07",x"03",x"01",x"00",x"00",x"00", -- 0x0310 + x"1A",x"1E",x"18",x"18",x"10",x"10",x"00",x"00", -- 0x0318 + x"0F",x"07",x"05",x"06",x"07",x"07",x"03",x"05", -- 0x0320 + x"F0",x"80",x"C0",x"E0",x"70",x"B8",x"D8",x"EF", -- 0x0328 + x"05",x"03",x"07",x"07",x"06",x"05",x"07",x"0F", -- 0x0330 + x"EF",x"D8",x"B8",x"70",x"E0",x"C0",x"80",x"F0", -- 0x0338 + x"00",x"00",x"00",x"00",x"02",x"82",x"CE",x"FF", -- 0x0340 + x"00",x"00",x"00",x"00",x"80",x"80",x"C0",x"F0", -- 0x0348 + x"FF",x"CE",x"82",x"02",x"00",x"00",x"00",x"00", -- 0x0350 + x"F0",x"C0",x"80",x"80",x"00",x"00",x"00",x"00", -- 0x0358 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0360 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0368 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0378 + x"00",x"00",x"00",x"0D",x"0B",x"0E",x"15",x"1E", -- 0x0380 + x"00",x"00",x"E0",x"A0",x"58",x"FC",x"5E",x"AA", -- 0x0388 + x"35",x"2B",x"3E",x"15",x"1A",x"0C",x"00",x"00", -- 0x0390 + x"F6",x"5E",x"A8",x"D4",x"2C",x"18",x"00",x"00", -- 0x0398 + x"00",x"00",x"00",x"01",x"02",x"07",x"F8",x"07", -- 0x03A0 + x"00",x"00",x"00",x"C1",x"06",x"DE",x"3C",x"D0", -- 0x03A8 + x"F8",x"07",x"02",x"01",x"00",x"00",x"00",x"00", -- 0x03B0 + x"20",x"C0",x"00",x"C0",x"00",x"00",x"00",x"00", -- 0x03B8 + x"00",x"00",x"00",x"01",x"02",x"07",x"F8",x"07", -- 0x03C0 + x"00",x"00",x"00",x"C0",x"00",x"C0",x"30",x"DC", -- 0x03C8 + x"F8",x"07",x"02",x"01",x"00",x"00",x"00",x"00", -- 0x03D0 + x"3E",x"C3",x"00",x"C0",x"00",x"00",x"00",x"00", -- 0x03D8 + x"0A",x"1B",x"39",x"4D",x"4C",x"FA",x"FE",x"CA", -- 0x03E0 + x"01",x"E3",x"DD",x"00",x"38",x"FC",x"E1",x"E3", -- 0x03E8 + x"CA",x"FE",x"FA",x"4C",x"4D",x"39",x"1B",x"0A", -- 0x03F0 + x"E3",x"FD",x"3C",x"38",x"00",x"C1",x"E3",x"1D", -- 0x03F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0400 + x"81",x"81",x"81",x"81",x"81",x"81",x"81",x"FF", -- 0x0408 + x"81",x"81",x"81",x"81",x"81",x"81",x"81",x"81", -- 0x0410 + x"FF",x"81",x"81",x"81",x"81",x"81",x"81",x"81", -- 0x0418 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"01", -- 0x0420 + x"00",x"00",x"00",x"00",x"80",x"80",x"C0",x"C0", -- 0x0428 + x"00",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0430 + x"80",x"C0",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0438 + x"02",x"03",x"00",x"00",x"03",x"03",x"02",x"02", -- 0x0440 + x"E0",x"F0",x"F0",x"F0",x"B0",x"F0",x"B0",x"B0", -- 0x0448 + x"07",x"07",x"07",x"03",x"03",x"00",x"00",x"00", -- 0x0450 + x"F0",x"B0",x"B0",x"F0",x"B0",x"A0",x"E0",x"C0", -- 0x0458 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x0460 + x"00",x"00",x"00",x"00",x"00",x"40",x"C0",x"C0", -- 0x0468 + x"03",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0470 + x"80",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0478 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x0480 + x"00",x"00",x"00",x"00",x"00",x"00",x"C0",x"C0", -- 0x0488 + x"03",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0490 + x"80",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0498 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"02", -- 0x04A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"C0", -- 0x04A8 + x"03",x"02",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04B0 + x"F0",x"C0",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04B8 + x"0A",x"1B",x"39",x"4D",x"7C",x"CA",x"CA",x"FE", -- 0x04C0 + x"00",x"F8",x"C7",x"00",x"20",x"30",x"F0",x"F8", -- 0x04C8 + x"FE",x"CA",x"CA",x"7C",x"4D",x"3D",x"1B",x"0A", -- 0x04D0 + x"F8",x"F7",x"30",x"20",x"00",x"C0",x"F8",x"07", -- 0x04D8 + x"0F",x"09",x"01",x"03",x"01",x"01",x"02",x"02", -- 0x04E0 + x"78",x"48",x"40",x"80",x"E0",x"60",x"A0",x"80", -- 0x04E8 + x"02",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F0 + x"00",x"00",x"00",x"20",x"00",x"00",x"00",x"00", -- 0x04F8 + x"00",x"01",x"01",x"01",x"01",x"00",x"02",x"07", -- 0x0500 + x"80",x"C0",x"E0",x"E0",x"E0",x"C0",x"E0",x"D0", -- 0x0508 + x"06",x"26",x"3F",x"06",x"01",x"01",x"01",x"01", -- 0x0510 + x"C0",x"E0",x"C0",x"D0",x"E0",x"40",x"20",x"80", -- 0x0518 + x"0F",x"09",x"01",x"01",x"03",x"01",x"07",x"03", -- 0x0520 + x"78",x"48",x"40",x"E0",x"A0",x"E0",x"40",x"C0", -- 0x0528 + x"01",x"01",x"01",x"01",x"00",x"02",x"00",x"00", -- 0x0530 + x"C0",x"80",x"40",x"00",x"00",x"00",x"00",x"00", -- 0x0538 + x"00",x"01",x"01",x"01",x"03",x"00",x"07",x"04", -- 0x0540 + x"80",x"C0",x"C0",x"C0",x"E0",x"C0",x"D0",x"F0", -- 0x0548 + x"04",x"07",x"04",x"00",x"03",x"01",x"03",x"07", -- 0x0550 + x"D0",x"D0",x"F0",x"C0",x"E0",x"C0",x"E0",x"F0", -- 0x0558 + x"0F",x"09",x"01",x"01",x"00",x"03",x"03",x"01", -- 0x0560 + x"78",x"48",x"00",x"C0",x"E0",x"A0",x"C0",x"40", -- 0x0568 + x"01",x"00",x"00",x"01",x"01",x"00",x"00",x"00", -- 0x0570 + x"C0",x"80",x"C0",x"60",x"20",x"40",x"00",x"00", -- 0x0578 + x"00",x"01",x"01",x"01",x"03",x"03",x"04",x"04", -- 0x0580 + x"80",x"C0",x"C0",x"C0",x"E0",x"E0",x"D0",x"D0", -- 0x0588 + x"07",x"04",x"04",x"03",x"02",x"01",x"03",x"07", -- 0x0590 + x"F0",x"D0",x"C0",x"E0",x"E0",x"C0",x"E0",x"F0", -- 0x0598 + x"0F",x"09",x"01",x"01",x"03",x"01",x"02",x"01", -- 0x05A0 + x"78",x"48",x"00",x"C0",x"E0",x"80",x"C0",x"00", -- 0x05A8 + x"01",x"01",x"02",x"01",x"01",x"01",x"00",x"00", -- 0x05B0 + x"C0",x"C0",x"80",x"80",x"00",x"00",x"80",x"80", -- 0x05B8 + x"00",x"01",x"01",x"01",x"03",x"00",x"04",x"07", -- 0x05C0 + x"80",x"C0",x"C0",x"C0",x"E0",x"C0",x"F0",x"D0", -- 0x05C8 + x"04",x"04",x"07",x"00",x"01",x"01",x"03",x"07", -- 0x05D0 + x"D0",x"F0",x"D0",x"C0",x"E0",x"40",x"60",x"70", -- 0x05D8 + x"0A",x"1B",x"39",x"4D",x"7C",x"CA",x"CA",x"FE", -- 0x05E0 + x"03",x"C7",x"EB",x"00",x"3F",x"3F",x"C7",x"C7", -- 0x05E8 + x"FE",x"CA",x"CA",x"7C",x"4D",x"39",x"1B",x"0A", -- 0x05F0 + x"C7",x"FF",x"3F",x"3F",x"00",x"C3",x"C7",x"3B", -- 0x05F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0600 + x"6D",x"DB",x"B6",x"6D",x"DB",x"B6",x"6D",x"DB", -- 0x0608 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0610 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"FF", -- 0x0620 + x"00",x"00",x"00",x"00",x"00",x"00",x"FF",x"FF", -- 0x0628 + x"00",x"00",x"00",x"00",x"00",x"FF",x"FF",x"FF", -- 0x0630 + x"00",x"00",x"00",x"00",x"FF",x"FF",x"FF",x"FF", -- 0x0638 + x"00",x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0640 + x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0648 + x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0650 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0658 + x"01",x"03",x"04",x"03",x"27",x"3E",x"6C",x"F8", -- 0x0660 + x"86",x"CF",x"2F",x"C6",x"E0",x"70",x"36",x"1F", -- 0x0668 + x"FE",x"6F",x"3F",x"27",x"03",x"04",x"03",x"01", -- 0x0670 + x"7F",x"F6",x"F0",x"E0",x"C6",x"2F",x"CF",x"86", -- 0x0678 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0680 + x"E7",x"24",x"24",x"3C",x"3C",x"24",x"24",x"E7", -- 0x0688 + x"00",x"70",x"F0",x"9B",x"8B",x"C0",x"60",x"00", -- 0x0690 + x"FF",x"D3",x"81",x"C9",x"82",x"91",x"CB",x"F3", -- 0x0698 + x"00",x"00",x"00",x"01",x"01",x"03",x"04",x"06", -- 0x06A0 + x"80",x"80",x"00",x"00",x"80",x"C0",x"C0",x"A0", -- 0x06A8 + x"15",x"0B",x"0D",x"0F",x"02",x"07",x"01",x"01", -- 0x06B0 + x"88",x"78",x"F8",x"B0",x"E0",x"B0",x"E0",x"40", -- 0x06B8 + x"00",x"02",x"03",x"0E",x"16",x"23",x"17",x"0C", -- 0x06C0 + x"48",x"B0",x"20",x"44",x"98",x"20",x"A0",x"C0", -- 0x06C8 + x"0F",x"0C",x"17",x"23",x"16",x"0F",x"02",x"02", -- 0x06D0 + x"C0",x"C0",x"A0",x"20",x"98",x"44",x"B0",x"48", -- 0x06D8 + x"00",x"1D",x"0F",x"07",x"07",x"0F",x"0F",x"0F", -- 0x06E0 + x"00",x"C0",x"80",x"00",x"00",x"80",x"80",x"C0", -- 0x06E8 + x"1F",x"1F",x"1F",x"03",x"09",x"0F",x"00",x"00", -- 0x06F0 + x"C0",x"C0",x"40",x"00",x"00",x"00",x"00",x"00", -- 0x06F8 + x"20",x"10",x"08",x"04",x"04",x"41",x"03",x"01", -- 0x0700 + x"00",x"00",x"01",x"02",x"1C",x"80",x"A2",x"60", -- 0x0708 + x"06",x"13",x"20",x"40",x"00",x"02",x"10",x"00", -- 0x0710 + x"40",x"CC",x"80",x"60",x"10",x"08",x"03",x"00", -- 0x0718 + x"08",x"04",x"04",x"02",x"81",x"43",x"22",x"15", -- 0x0720 + x"01",x"06",x"08",x"10",x"30",x"20",x"C0",x"A0", -- 0x0728 + x"0F",x"09",x"06",x"33",x"40",x"81",x"01",x"02", -- 0x0730 + x"50",x"DE",x"61",x"D0",x"10",x"18",x"08",x"04", -- 0x0738 + x"04",x"02",x"02",x"01",x"06",x"8F",x"76",x"1A", -- 0x0740 + x"04",x"08",x"10",x"C0",x"B0",x"E8",x"2F",x"98", -- 0x0748 + x"1B",x"1C",x"0A",x"07",x"07",x"08",x"08",x"10", -- 0x0750 + x"EC",x"CC",x"B8",x"F0",x"90",x"08",x"86",x"41", -- 0x0758 + x"80",x"40",x"25",x"1F",x"17",x"0D",x"5B",x"B2", -- 0x0760 + x"21",x"41",x"42",x"B4",x"FC",x"B0",x"D8",x"EE", -- 0x0768 + x"1A",x"0F",x"05",x"1E",x"1D",x"23",x"40",x"80", -- 0x0770 + x"E9",x"56",x"F8",x"DC",x"E8",x"4C",x"82",x"81", -- 0x0778 + x"00",x"03",x"0F",x"3F",x"3F",x"7F",x"FF",x"FF", -- 0x0780 + x"00",x"80",x"80",x"E0",x"E0",x"F0",x"F8",x"FE", -- 0x0788 + x"FF",x"FF",x"7F",x"7F",x"1F",x"0F",x"0F",x"06", -- 0x0790 + x"FF",x"FF",x"FE",x"FC",x"F0",x"E0",x"00",x"00", -- 0x0798 + x"68",x"40",x"00",x"0C",x"10",x"00",x"00",x"48", -- 0x07A0 + x"00",x"00",x"65",x"44",x"00",x"00",x"64",x"85", -- 0x07A8 + x"14",x"0C",x"60",x"E0",x"01",x"08",x"14",x"08", -- 0x07B0 + x"04",x"02",x"00",x"40",x"80",x"10",x"0C",x"10", -- 0x07B8 + x"06",x"86",x"82",x"E6",x"FF",x"28",x"70",x"00", -- 0x07C0 + x"40",x"40",x"40",x"80",x"81",x"02",x"84",x"48", -- 0x07C8 + x"07",x"04",x"8B",x"4E",x"3B",x"37",x"2E",x"3D", -- 0x07D0 + x"F0",x"50",x"A0",x"6C",x"3E",x"D4",x"B0",x"54", -- 0x07D8 + x"10",x"08",x"05",x"02",x"01",x"87",x"4B",x"26", -- 0x07E0 + x"10",x"20",x"A0",x"60",x"D0",x"48",x"F1",x"B2", -- 0x07E8 + x"1C",x"0B",x"0F",x"3D",x"33",x"9E",x"75",x"57", -- 0x07F0 + x"DC",x"EC",x"74",x"BC",x"DD",x"76",x"D4",x"5E" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GALAXIAN_6L.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GALAXIAN_6L.vhd new file mode 100644 index 00000000..e989225e --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GALAXIAN_6L.vhd @@ -0,0 +1,33 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GALAXIAN_6L is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(4 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GALAXIAN_6L is + + + type ROM_ARRAY is array(0 to 31) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"7A",x"36",x"07",x"00",x"F0",x"38",x"1F", -- 0x0000 + x"00",x"C7",x"F0",x"3F",x"00",x"DB",x"C6",x"38", -- 0x0008 + x"00",x"36",x"07",x"F0",x"00",x"33",x"3F",x"DB", -- 0x0010 + x"00",x"3F",x"57",x"C6",x"00",x"C6",x"3F",x"FF" -- 0x0018 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GAL_FIR.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GAL_FIR.vhd new file mode 100644 index 00000000..5aff2022 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GAL_FIR.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_FIR 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 prom of GAL_FIR is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AC",X"68",X"72",X"C7",X"93",X"3F",X"80",X"C8",X"5C",X"A1",X"22",X"90",X"B9",X"8A",X"41",X"62", + X"C2",X"A1",X"40",X"6A",X"C9",X"7F",X"64",X"3C",X"BC",X"AD",X"5B",X"4C",X"D4",X"62",X"3D",X"D3", + X"7F",X"31",X"A3",X"BE",X"5D",X"49",X"C7",X"7D",X"28",X"C0",X"A1",X"7A",X"7D",X"2B",X"C9",X"91", + X"80",X"6B",X"39",X"95",X"BA",X"91",X"27",X"C1",X"91",X"7E",X"6D",X"31",X"C0",X"A4",X"7C",X"7B", + X"37",X"80",X"CB",X"7E",X"88",X"64",X"40",X"8F",X"C3",X"83",X"83",X"68",X"36",X"D0",X"8C",X"29", + X"B4",X"B1",X"52",X"4B",X"E9",X"3E",X"74",X"C4",X"73",X"81",X"2B",X"AD",X"B9",X"4E",X"4B",X"CB", + X"91",X"76",X"33",X"B6",X"A5",X"6E",X"4A",X"63",X"D7",X"7C",X"3E",X"7E",X"DE",X"45",X"67",X"C1", + X"84",X"2D",X"A8",X"A9",X"20",X"AC",X"B5",X"7E",X"47",X"5F",X"DD",X"6E",X"44",X"BD",X"97",X"22", + X"AE",X"A4",X"25",X"CB",X"93",X"77",X"3C",X"78",X"CB",X"83",X"29",X"B3",X"AB",X"7D",X"5D",X"44", + X"A4",X"BC",X"79",X"8C",X"3A",X"76",X"CF",X"78",X"44",X"6B",X"D9",X"6B",X"3B",X"9A",X"CC",X"26", + X"A4",X"A3",X"1D",X"BA",X"A9",X"83",X"71",X"3A",X"8B",X"CC",X"6A",X"3E",X"E5",X"28",X"A4",X"A3", + X"1E",X"C9",X"9C",X"78",X"32",X"94",X"C4",X"74",X"88",X"2A",X"A2",X"BC",X"1A",X"E2",X"4B",X"86", + X"B3",X"72",X"48",X"68",X"D2",X"83",X"32",X"A4",X"B2",X"73",X"4E",X"5A",X"C8",X"9C",X"2C",X"90", + X"C1",X"7B",X"5E",X"41",X"CC",X"99",X"6F",X"3A",X"8B",X"C9",X"7A",X"84",X"23",X"BC",X"9D",X"33", + X"CC",X"82",X"24",X"D7",X"6C",X"47",X"D1",X"87",X"5C",X"41",X"C5",X"9F",X"71",X"35",X"A8",X"B9", + X"67",X"4F",X"5F",X"CE",X"8A",X"43",X"C6",X"80",X"54",X"4A",X"B1",X"AE",X"87",X"50",X"4F",X"C6", + X"9F",X"55",X"45",X"BB",X"AC",X"5C",X"41",X"A9",X"BE",X"5C",X"4C",X"72",X"D4",X"71",X"42",X"DA", + X"20",X"CF",X"6C",X"3D",X"D5",X"8A",X"78",X"39",X"7B",X"BF",X"99",X"75",X"37",X"99",X"C7",X"28", + X"7B",X"C3",X"91",X"58",X"46",X"9D",X"BB",X"88",X"60",X"40",X"9A",X"BB",X"8C",X"3B",X"6A",X"BA", + X"AC",X"31",X"7F",X"C8",X"2F",X"78",X"DC",X"33",X"AE",X"80",X"34",X"EE",X"38",X"74",X"D5",X"1F", + X"98",X"BA",X"82",X"58",X"4A",X"D6",X"86",X"56",X"49",X"F0",X"34",X"73",X"BD",X"9A",X"43",X"67", + X"C3",X"8D",X"2E",X"8B",X"B9",X"40",X"C6",X"33",X"B7",X"A5",X"27",X"8A",X"BA",X"42",X"BF",X"8A", + X"3A",X"6F",X"D1",X"5C",X"41",X"DF",X"6A",X"42",X"C3",X"A4",X"33",X"80",X"CC",X"5C",X"43",X"89", + X"BE",X"96",X"53",X"4E",X"8D",X"D4",X"2E",X"BD",X"56",X"6C",X"DA",X"53",X"47",X"9C",X"C8",X"2A", + X"75",X"B3",X"B0",X"2F",X"80",X"CA",X"2B",X"81",X"CD",X"35",X"7E",X"CE",X"32",X"81",X"CD",X"74", + X"40",X"74",X"D8",X"4E",X"58",X"D3",X"85",X"4D",X"53",X"AE",X"B8",X"61",X"3D",X"9F",X"C3",X"30", + X"86",X"D0",X"5E",X"47",X"7D",X"C6",X"91",X"4E",X"4E",X"A9",X"B9",X"6D",X"34",X"9F",X"B7",X"3F", + X"C6",X"7A",X"37",X"81",X"C5",X"8C",X"33",X"88",X"D3",X"44",X"59",X"82",X"C8",X"88",X"42",X"61", + X"AF",X"A2",X"44",X"D9",X"48",X"52",X"89",X"BC",X"99",X"2E",X"7E",X"B4",X"38",X"B7",X"9E",X"20", + X"E4",X"56",X"63",X"D9",X"56",X"43",X"B1",X"B8",X"37",X"6B",X"D3",X"6D",X"31",X"C8",X"65",X"8D", + X"B9",X"0B",X"BA",X"86",X"4D",X"D7",X"4E",X"4B",X"E7",X"3C",X"95",X"AD",X"1D",X"D8",X"72",X"35", + X"B4",X"A5",X"2F",X"B3",X"B6",X"44",X"57",X"93",X"CB",X"67",X"3F",X"A1",X"C7",X"21",X"89",X"9C", + X"5A",X"D8",X"20",X"A3",X"BA",X"25",X"89",X"AD",X"37",X"D8",X"5D",X"53",X"DC",X"77",X"43",X"70", + X"E1",X"46",X"59",X"83",X"CC",X"6E",X"37",X"E7",X"56",X"4E",X"86",X"D3",X"27",X"9E",X"AA",X"44", + X"C0",X"19",X"E9",X"54",X"63",X"DB",X"51",X"4D",X"88",X"CF",X"30",X"91",X"C5",X"66",X"35",X"C1", + X"9C",X"33",X"79",X"A7",X"BA",X"53",X"41",X"DD",X"4B",X"73",X"D2",X"25",X"7F",X"BB",X"9D",X"37", + X"68",X"A9",X"BD",X"3B",X"5C",X"CF",X"61",X"47",X"C9",X"9E",X"47",X"55",X"AF",X"96",X"5D",X"D0", + X"28",X"7E",X"D3",X"48",X"51",X"C7",X"95",X"21",X"BB",X"A6",X"3A",X"67",X"C3",X"81",X"37",X"DE", + X"7D",X"3F",X"72",X"AA",X"B4",X"15",X"DC",X"6C",X"47",X"D2",X"71",X"28",X"EB",X"2E",X"9F",X"93", + X"6C",X"9C",X"37",X"DB",X"43",X"AC",X"37",X"D3",X"4F",X"AC",X"8D",X"1B",X"DF",X"7E",X"46",X"6B", + X"BA",X"A5",X"35",X"73",X"CB",X"41",X"7E",X"C8",X"1D",X"D3",X"60",X"5F",X"DB",X"44",X"57",X"C2", + X"A2",X"41",X"5B",X"AE",X"96",X"5E",X"CC",X"10",X"CF",X"83",X"31",X"DF",X"59",X"46",X"CC",X"87", + X"28",X"D7",X"84",X"3D",X"7A",X"DD",X"3A",X"7B",X"C8",X"36",X"66",X"C8",X"60",X"9A",X"8F",X"29", + X"A8",X"B3",X"83",X"1F",X"D6",X"81",X"33",X"C4",X"82",X"2A",X"D4",X"6B",X"70",X"CA",X"1B",X"A9", + X"AB",X"22",X"AE",X"9E",X"49",X"D3",X"45",X"5A",X"A1",X"BB",X"70",X"27",X"E9",X"49",X"72",X"CC", + X"38",X"67",X"B6",X"AD",X"41",X"57",X"B7",X"8C",X"39",X"E4",X"70",X"4B",X"63",X"C7",X"52",X"AE", + X"8A",X"36",X"8A",X"BB",X"8E",X"2F",X"87",X"AB",X"B2",X"2D",X"72",X"94",X"CD",X"39",X"67",X"D9", + X"2B",X"86",X"C8",X"50",X"4D",X"BC",X"A1",X"3F",X"6B",X"BC",X"7C",X"48",X"E0",X"20",X"BA",X"83", + X"43",X"D4",X"26",X"BD",X"A2",X"3E",X"6C",X"CA",X"8A",X"38",X"7B",X"AF",X"AE",X"23",X"91",X"C0", + X"37",X"76",X"A3",X"C2",X"39",X"63",X"D9",X"48",X"5A",X"93",X"C9",X"43",X"62",X"90",X"B1",X"37", + X"D1",X"53",X"74",X"B1",X"37",X"F6",X"23",X"82",X"C3",X"52",X"4A",X"BB",X"75",X"95",X"88",X"3D", + X"90",X"C3",X"76",X"3B",X"87",X"A9",X"70",X"A6",X"61",X"4F",X"AE",X"B6",X"50",X"4B",X"E2",X"4A", + X"63",X"DC",X"3E",X"63",X"92",X"CC",X"4F",X"4D",X"E3",X"4A",X"5B",X"89",X"D0",X"47",X"5E",X"90", + X"D0",X"49",X"5B",X"7E",X"C6",X"76",X"3E",X"8C",X"AA",X"A4",X"15",X"CD",X"89",X"43",X"80",X"BD", + X"65",X"A8",X"3D",X"8E",X"CF",X"0B",X"C0",X"8E",X"46",X"76",X"C9",X"7A",X"3E",X"88",X"AA",X"A8", + X"18",X"BF",X"9C",X"2E",X"C3",X"85",X"2B",X"DC",X"6C",X"45",X"DB",X"4B",X"5F",X"92",X"AD",X"3D", + X"C3",X"4F",X"86",X"A6",X"75",X"81",X"36",X"E7",X"37",X"A6",X"7D",X"A5",X"5A",X"58",X"D8",X"4E", + X"56",X"AB",X"8E",X"49",X"DD",X"68",X"40",X"8A",X"B0",X"53",X"C3",X"4F",X"60",X"92",X"C6",X"51", + X"54",X"9A",X"C5",X"55",X"4D",X"93",X"C2",X"70",X"2F",X"E3",X"50",X"5B",X"8D",X"AF",X"48",X"AA", + X"81",X"98",X"4C",X"65",X"C1",X"66",X"BB",X"23",X"B0",X"9B",X"39",X"83",X"A4",X"B3",X"1A",X"B0", + X"9D",X"31",X"C3",X"8E",X"2B",X"E2",X"54",X"5A",X"DC",X"32",X"86",X"CA",X"14",X"C9",X"83",X"43", + X"83",X"AD",X"A6",X"15",X"DA",X"6D",X"4C",X"87",X"AF",X"63",X"B9",X"3A",X"8C",X"C5",X"0D",X"CC", + X"79",X"58",X"74",X"C9",X"7D",X"42",X"7C",X"B7",X"5C",X"A9",X"7B",X"41",X"93",X"B6",X"81",X"32", + X"9D",X"92",X"6B",X"87",X"9D",X"94",X"4A",X"6C",X"B7",X"A4",X"1B",X"BD",X"88",X"4D",X"7D",X"BD", + X"4D",X"99",X"8A",X"51",X"CF",X"1B",X"F2",X"56",X"5A",X"72",X"C3",X"4B",X"BE",X"63",X"52",X"E1", + X"2F",X"77",X"91",X"93",X"52",X"C0",X"37",X"E1",X"53",X"5A",X"DA",X"35",X"77",X"85",X"D5",X"39", + X"6D",X"80",X"D3",X"50",X"58",X"D3",X"2D",X"9A",X"B2",X"23",X"BC",X"8C",X"52",X"71",X"C1",X"8D", + X"3E",X"76",X"B3",X"6F",X"6D",X"A1",X"49",X"C9",X"2E",X"D1",X"38",X"C6",X"55",X"8B",X"7C",X"86", + X"B2",X"33",X"7E",X"AD",X"99",X"3C",X"80",X"A3",X"6E",X"88",X"98",X"50",X"AA",X"79",X"99",X"27", + X"FB",X"1D",X"AE",X"63",X"8F",X"94",X"51",X"B0",X"4A",X"AD",X"86",X"8B",X"39",X"EA",X"1B",X"AB", + X"9A",X"4C",X"73",X"B8",X"9A",X"3A",X"76",X"AC",X"64",X"88",X"8B",X"6D",X"A6",X"71",X"97",X"40", + X"8C",X"B5",X"4A",X"A0",X"68",X"86",X"8C",X"98",X"69",X"59",X"DE",X"1F",X"AB",X"A0",X"36",X"A8", + X"A7",X"28",X"E0",X"58",X"59",X"CE",X"37",X"82",X"C8",X"2E",X"A4",X"5A",X"AF",X"62",X"8E",X"C2", + X"2D",X"79",X"91",X"C2",X"2A",X"96",X"77",X"8A",X"99",X"8E",X"3D",X"C7",X"61",X"57",X"9D",X"A3", + X"44",X"DE",X"34",X"88",X"B1",X"37",X"89",X"A3",X"B3",X"15",X"CB",X"73",X"43",X"BA",X"8D",X"47", + X"9D",X"6F",X"C9",X"15",X"D1",X"72",X"53",X"CA",X"48",X"6B",X"9B",X"89",X"6A",X"A0",X"57",X"BE", + X"45",X"9C",X"A5",X"5E",X"54",X"CA",X"63",X"52",X"E1",X"25",X"AE",X"93",X"35",X"E5",X"2A",X"A5", + X"97",X"40",X"8A",X"9A",X"73",X"81",X"8E",X"57",X"CC",X"68",X"67",X"5D",X"C5",X"94",X"43",X"6E", + X"AA",X"A8",X"30",X"9D",X"6E",X"B3",X"6B",X"4B",X"AB",X"79",X"90",X"93",X"50",X"89",X"81",X"8A", + X"A4",X"42",X"9B",X"7F",X"67",X"9F",X"A8",X"48",X"80",X"BA",X"23",X"C5",X"6A",X"5E",X"91",X"99", + X"62",X"9A",X"91",X"6A",X"5A",X"D9",X"3D",X"81",X"B2",X"34",X"C5",X"7A",X"3F",X"BB",X"90",X"3D", + X"D0",X"50",X"65",X"95",X"94",X"63",X"C6",X"2D",X"A6",X"91",X"3D",X"CA",X"5F",X"66",X"91",X"97", + X"A6",X"35",X"A6",X"97",X"2E",X"D9",X"41",X"8F",X"A4",X"3E",X"A2",X"B0",X"2E",X"B5",X"7A",X"55", + X"C9",X"3F",X"84",X"C3",X"42",X"8A",X"72",X"9F",X"65",X"95",X"72",X"84",X"8A",X"58",X"C6",X"73", + X"47",X"D9",X"35",X"90",X"9F",X"4D",X"80",X"A8",X"A1",X"30",X"8F",X"8B",X"C5",X"18",X"B5",X"70", + X"65",X"B0",X"5D",X"93",X"93",X"7B",X"48",X"CB",X"52",X"7D",X"B0",X"3D",X"98",X"BA",X"2E",X"AD", + X"86",X"4A",X"BD",X"6E",X"4C",X"DA",X"53",X"78",X"77",X"96",X"75",X"83",X"82",X"82",X"A5",X"3D", + X"86",X"A2",X"A7",X"31",X"8B",X"8E",X"C3",X"20",X"AA",X"92",X"3A",X"C0",X"87",X"51",X"77",X"AD", + X"62",X"B9",X"4F",X"7F",X"BC",X"1E",X"BF",X"7E",X"51",X"C3",X"50",X"72",X"C0",X"49",X"8A",X"81", + X"72",X"AA",X"7B",X"55",X"8C",X"83",X"CA",X"2B",X"97",X"9C",X"4B",X"86",X"9F",X"B0",X"14",X"EA", + X"3C",X"8A",X"9B",X"51",X"C2",X"25",X"C7",X"70",X"5F",X"AF",X"52",X"C6",X"29",X"B8",X"7F",X"5F", + X"A3",X"5C",X"CB",X"26",X"AE",X"8B",X"3C",X"D6",X"48",X"8A",X"74",X"A2",X"8D",X"3F",X"D3",X"2A", + X"B9",X"7B",X"4D",X"A6",X"69",X"B6",X"6E",X"56",X"8A",X"A1",X"64",X"C3",X"28",X"B2",X"7D",X"60", + X"A6",X"58",X"D4",X"11",X"D1",X"5C",X"7A",X"A8",X"42",X"96",X"C7",X"27",X"A9",X"90",X"44",X"89", + X"9F",X"69",X"90",X"A7",X"25",X"DB",X"46",X"7C",X"B7",X"42",X"9A",X"6E",X"99",X"8C",X"81",X"41", + X"C7",X"7A",X"58",X"8D",X"83",X"B2",X"29",X"C1",X"6E",X"52",X"DA",X"44",X"83",X"B6",X"2A",X"C4", + X"41",X"A6",X"7A",X"76",X"98",X"5B",X"B6",X"86",X"42",X"A2",X"8A",X"4B",X"95",X"97",X"65",X"B7", + X"56",X"6C",X"D2",X"1E",X"B6",X"94",X"36",X"DD",X"38",X"96",X"7B",X"70",X"9E",X"95",X"59",X"77", + X"82",X"8D",X"7C",X"78",X"DC",X"01",X"CD",X"70",X"5D",X"76",X"B4",X"91",X"35",X"BD",X"48",X"D3", + X"36",X"8E",X"B7",X"2C",X"BE",X"49",X"CA",X"4C",X"72",X"CB",X"29",X"B9",X"82",X"3B",X"CC",X"71", + X"4B",X"D1",X"4F",X"6A",X"8D",X"C9",X"46",X"6A",X"CA",X"28",X"99",X"A9",X"61",X"59",X"AA",X"78", + X"8F",X"98",X"35",X"CE",X"64",X"58",X"95",X"A7",X"49",X"AC",X"57",X"9B",X"7C",X"70",X"DE",X"14", + X"A9",X"A3",X"3F",X"7B",X"C9",X"57",X"5F",X"D6",X"17",X"C5",X"7D",X"58",X"9E",X"71",X"B8",X"3D", + X"72",X"A7",X"6C",X"A7",X"80",X"3A",X"E5",X"22",X"A5",X"61",X"B6",X"86",X"38",X"D9",X"56",X"57", + X"9A",X"8E",X"64",X"97",X"96",X"7D",X"45",X"CC",X"5D",X"5A",X"A8",X"AA",X"3C",X"7E",X"97",X"C1", + X"22",X"9B",X"A7",X"45",X"7F",X"A1",X"B4",X"1D",X"BB",X"51",X"B9",X"7A",X"45",X"91",X"A5",X"67", + X"B8",X"34",X"9E",X"A8",X"35",X"88",X"B0",X"54",X"A8",X"8C",X"31",X"E7",X"41",X"6A",X"C7",X"41", + X"85",X"BA",X"2D",X"B1",X"A0",X"35",X"90",X"9F",X"75",X"A0",X"5D",X"52",X"CA",X"59",X"84",X"9A", + X"52",X"B2",X"66",X"AF",X"43",X"6E",X"BC",X"59",X"89",X"95",X"8B",X"74",X"44",X"AE",X"85",X"96", + X"7B",X"4A",X"8B",X"BD",X"7E",X"2F",X"D2",X"68",X"4D",X"D9",X"41",X"6F",X"CA",X"4D",X"62",X"A0", + X"B7",X"3C",X"76",X"D1",X"2E",X"98",X"B1",X"2A",X"BB",X"8D",X"2F",X"E2",X"4A",X"6C",X"C4",X"49", + X"64",X"A5",X"88",X"80",X"9E",X"2A",X"DD",X"59",X"54",X"CE",X"60",X"54",X"9E",X"9D",X"42",X"BF", + X"92",X"34",X"98",X"B7",X"40",X"77",X"9F",X"BC",X"28",X"93",X"B8",X"44",X"67",X"A7",X"AC",X"41", + X"6F",X"9F",X"91",X"50",X"C4",X"37",X"B1",X"7A",X"5B",X"DD",X"4C",X"58",X"C6",X"5D",X"51",X"BA", + X"82",X"47",X"D6",X"6B",X"45",X"AC",X"60",X"C5",X"3D",X"7D",X"CA",X"33",X"8D",X"AE",X"42",X"88", + X"CB",X"4F",X"5D",X"84",X"C3",X"31",X"B4",X"6B",X"6C",X"AD",X"73",X"AB",X"23",X"D5",X"6B",X"43", + X"D1",X"6A",X"47",X"CB",X"4B",X"77",X"C4",X"2B",X"BC",X"94",X"35",X"C6",X"77",X"3E",X"9E",X"94", + X"77",X"A5",X"43",X"7C",X"99",X"BD",X"3A",X"79",X"C8",X"2B",X"B8",X"83",X"37",X"D2",X"77",X"4F", + X"78",X"BD",X"43",X"AC",X"80",X"66",X"C8",X"28",X"89",X"A3",X"AF",X"2A",X"92",X"B9",X"3D",X"80", + X"CC",X"27",X"9A",X"B0",X"48",X"66",X"AD",X"8D",X"44",X"D0",X"6A",X"44",X"AA",X"87",X"6B",X"C7", + X"25",X"A3",X"AB",X"41",X"70",X"AD",X"71",X"9C",X"74",X"45",X"C9",X"91",X"51",X"5D",X"D9",X"4E", + X"62",X"C7",X"61",X"4C",X"A4",X"97",X"78",X"95",X"3D",X"9E",X"A8",X"30",X"D4",X"4B",X"81",X"B2", + X"33",X"C5",X"65",X"A4",X"63",X"4E",X"A8",X"98",X"5F",X"C0",X"30",X"96",X"B5",X"3D",X"75",X"B2", + X"92",X"31",X"B1",X"A5",X"33",X"A4",X"AD",X"43",X"68",X"B4",X"7A",X"51",X"DB",X"45",X"74",X"C9", + X"2D",X"95",X"AD",X"3B",X"8E",X"A9",X"3D",X"C0",X"70",X"62",X"D5",X"27",X"A7",X"9E",X"3F",X"7C", + X"BC",X"50",X"A4",X"8E",X"34",X"A3",X"A1",X"4E",X"99",X"BC",X"35",X"7B",X"BD",X"67",X"45",X"AA", + X"94",X"62",X"C1",X"3E",X"74",X"CB",X"41",X"74",X"A3",X"50",X"B6",X"9F",X"47",X"68",X"A6",X"AF", + X"4A",X"62",X"94",X"AC",X"3F",X"AD",X"A9",X"3F",X"72",X"8A",X"C7",X"54",X"5E",X"7A",X"C0",X"80", + X"4D",X"6B",X"B7",X"71",X"86",X"9F",X"2C",X"DC",X"60",X"59",X"79",X"BB",X"7C",X"40",X"A8",X"AC", + X"63",X"48",X"D4",X"67",X"56",X"79",X"B8",X"8D",X"38",X"BE",X"7E",X"3C",X"B0",X"97",X"54",X"C2", + X"37",X"98",X"B4",X"32",X"90",X"B9",X"4F",X"5E",X"B2",X"A0",X"34",X"9F",X"A3",X"35",X"AD",X"9B", + X"38",X"BB",X"97",X"4E",X"64",X"A4",X"94",X"53",X"D0",X"45",X"6A",X"C2",X"6E",X"42",X"CC",X"77", + X"52",X"73",X"BB",X"61",X"89",X"B2",X"2D",X"9C",X"B4",X"43",X"77",X"C5",X"57",X"59",X"93",X"A6", + X"5B",X"B6",X"50",X"63",X"BE",X"8D",X"4D",X"6A",X"A2",X"AA",X"6F",X"3F",X"C2",X"86",X"4B",X"75", + X"BD",X"76",X"4B",X"D2",X"5A",X"5A",X"8A",X"BF",X"5B",X"56",X"B3",X"9F",X"4E",X"66",X"C4",X"5D", + X"51",X"C0",X"68",X"70",X"C1",X"3E",X"75",X"BB",X"50",X"A6",X"88",X"3A",X"AB",X"A4",X"79",X"3A", + X"BC",X"8E",X"4A",X"74",X"B7",X"82",X"42",X"D2",X"5F",X"5A",X"7F",X"B4",X"8D",X"41",X"86",X"C0", + X"55",X"5F",X"C0",X"44",X"96",X"B6",X"5A",X"5A",X"84",X"BD",X"78",X"52",X"6C",X"BA",X"82",X"41", + X"BD",X"83",X"3E",X"A9",X"91",X"56",X"CA",X"38",X"95",X"AA",X"39",X"8B",X"AE",X"4D",X"8C",X"AC", + X"35",X"BC",X"79",X"52",X"C1",X"5A",X"80",X"C2",X"41",X"73",X"A8",X"4C",X"B1",X"9C",X"63",X"4F", + X"BB",X"8B",X"4B",X"70",X"B2",X"7F",X"46",X"D3",X"48",X"A3",X"94",X"3D",X"94",X"B6",X"52",X"61", + X"BD",X"49",X"91",X"B9",X"58",X"61",X"77",X"BD",X"4D",X"A9",X"84",X"43",X"CF",X"6A",X"58",X"74", + X"C2",X"57",X"93",X"61",X"84",X"BB",X"2E",X"B6",X"86",X"4B",X"C7",X"71",X"54",X"76",X"AF",X"73", + X"5D",X"D2",X"40",X"85",X"B7",X"59",X"5A",X"94",X"AF",X"40",X"9D",X"A1",X"32",X"BD",X"71",X"72", + X"BC",X"51",X"60",X"97",X"AC",X"7F",X"47",X"8D",X"B7",X"57",X"5B",X"C1",X"7B",X"52",X"73",X"AB", + X"8B",X"44",X"C1",X"82",X"42",X"BD",X"75",X"4B",X"B0",X"9D",X"6A",X"50",X"8A",X"AD",X"8E",X"53", + X"65",X"9C",X"AE",X"65",X"51",X"AF",X"99",X"43",X"80",X"B4",X"7E",X"3D",X"B9",X"6B",X"66",X"C2", + X"45",X"B4",X"81",X"50",X"72",X"BC",X"6E",X"4E",X"BA",X"7A",X"4A",X"C1",X"6F",X"5A",X"BB",X"89", + X"5C",X"5E",X"9B",X"AF",X"5E",X"5C",X"CA",X"43",X"87",X"B0",X"41",X"85",X"BA",X"4D",X"77",X"BA", + X"76",X"4A",X"A7",X"9D",X"54",X"61",X"AA",X"9C",X"47",X"7B",X"B2",X"8B",X"51",X"6C",X"9A",X"A4", + X"42",X"A4",X"A6",X"3A",X"A5",X"97",X"3F",X"9E",X"A7",X"78",X"4E",X"7F",X"B1",X"8A",X"58",X"64", + X"B8",X"88",X"48",X"87",X"B5",X"6E",X"49",X"BE",X"59",X"93",X"A5",X"46",X"74",X"9E",X"A3",X"35", + X"C2",X"72",X"55",X"C2",X"5B",X"60",X"B9",X"79",X"48",X"C8",X"57",X"84",X"B1",X"4B",X"6C",X"97", + X"AC",X"3F",X"8C",X"AF",X"47",X"AF",X"89",X"4A",X"7D",X"A4",X"9E",X"4F",X"6A",X"B1",X"8E",X"45", + X"88",X"B2",X"70",X"4B",X"A7",X"9C",X"41",X"AD",X"96",X"49",X"7B",X"B6",X"77",X"4B",X"B4",X"8D", + X"56",X"67",X"A2",X"A0",X"3E",X"B2",X"84",X"45",X"AC",X"9A",X"78",X"44",X"B1",X"80",X"52",X"C9", + X"4B",X"7E",X"B7",X"3C",X"A1",X"99",X"40",X"9F",X"A3",X"7C",X"4C",X"8A",X"B0",X"76",X"4C",X"9D", + X"A6",X"3F",X"9C",X"A5",X"5E",X"5C",X"B7",X"85",X"4E",X"7E",X"B4",X"6A",X"56",X"CD",X"4B",X"99", + X"6F",X"69",X"C4",X"45",X"89",X"B2",X"60",X"60",X"7F",X"BB",X"57",X"6E",X"B4",X"84",X"66",X"59", + X"BD",X"4A",X"9F",X"A0",X"5B",X"5F",X"A1",X"A4",X"65",X"57",X"94",X"A3",X"8E",X"46",X"8A",X"9B", + X"58",X"B7",X"78",X"4C",X"9B",X"A1",X"40",X"AF",X"87",X"42",X"B4",X"80",X"5E",X"BB",X"4B",X"7D", + X"BB",X"42",X"95",X"A1",X"42",X"AA",X"98",X"59",X"64",X"A4",X"A0",X"5F",X"5D",X"9C",X"A7",X"66", + X"57",X"A0",X"A4",X"5E",X"61",X"8A",X"B4",X"4D",X"92",X"A5",X"55",X"68",X"8F",X"B1",X"55",X"6C", + X"BE",X"51",X"88",X"A6",X"36",X"C2",X"6C",X"60",X"B2",X"84",X"4D",X"84",X"A8",X"4A",X"A5",X"9E", + X"60",X"5D",X"AD",X"92",X"76",X"4E",X"94",X"A8",X"72",X"4C",X"B0",X"7A",X"57",X"B8",X"85",X"72", + X"51",X"C2",X"59",X"6C",X"B1",X"86",X"69",X"5A",X"92",X"A9",X"7B",X"50",X"8B",X"B3",X"41",X"AD", + X"6F",X"61",X"B7",X"82",X"6E",X"55",X"A0",X"9F",X"4B",X"87",X"B1",X"52",X"9B",X"96",X"59",X"68", + X"B7",X"55",X"85",X"B1",X"64",X"65",X"70",X"BB",X"6A",X"5F",X"B0",X"8A",X"76",X"55",X"82",X"AE", + X"82",X"5F",X"66",X"A1",X"9C",X"48",X"B7",X"67",X"60",X"B8",X"76",X"4D",X"B7",X"76",X"62",X"B1", + X"7C",X"55",X"84",X"AD",X"77",X"55",X"8B",X"AC",X"40",X"9A",X"A1",X"75",X"57",X"7D",X"A6",X"91", + X"75",X"5C",X"74",X"AE",X"7D",X"52",X"C1",X"58",X"74",X"B7",X"45",X"95",X"A1",X"70",X"57",X"89", + X"AA",X"81",X"5B",X"6D",X"9F",X"9E",X"6F",X"57",X"AB",X"8E",X"63",X"5E",X"B0",X"80",X"4E",X"B1", + X"88",X"4C",X"9E",X"9A",X"46",X"98",X"A4",X"6C",X"55",X"B0",X"84",X"56",X"B8",X"48",X"92",X"A3", + X"7D",X"69",X"5C",X"A6",X"98",X"51",X"83",X"B5",X"4C",X"8E",X"A3",X"69",X"5E",X"80",X"AF",X"6B", + X"5B",X"B3",X"7C",X"52",X"B1",X"88",X"81",X"50",X"88",X"A7",X"83",X"54",X"82",X"AB",X"46",X"9F", + X"9F",X"4B",X"94",X"9F",X"42",X"A8",X"92",X"84",X"59",X"77",X"B3",X"46",X"A5",X"8C",X"4A",X"AE", + X"8A",X"59",X"A9",X"82",X"67",X"60",X"99",X"9F",X"81",X"6A",X"5B",X"BF",X"4F",X"9C",X"82",X"54", + X"BA",X"75",X"55",X"A7",X"8A",X"4B",X"A4",X"96",X"82",X"61",X"67",X"9A",X"9E",X"4D",X"8A",X"A7", + X"7F",X"73",X"52",X"BB",X"60",X"73",X"AC",X"83",X"73",X"59",X"89",X"A4",X"88",X"50",X"95",X"A2", + X"67",X"63",X"7D",X"B0",X"72",X"59",X"A9",X"8F",X"50",X"87",X"AC",X"47",X"9C",X"97",X"7B",X"53", + X"92",X"A0",X"7B",X"5B",X"7F",X"B1",X"49",X"8D",X"A4",X"7B",X"66",X"62",X"B4",X"76",X"66",X"AA", + X"81",X"62",X"6D",X"AF",X"80",X"6D",X"5C",X"97",X"9C",X"86",X"69",X"60",X"AE",X"80",X"4E",X"B9", + X"66",X"6D",X"AA",X"83",X"64",X"69",X"AD",X"86",X"6B",X"60",X"8C",X"AA",X"65",X"66",X"AF",X"80", + X"51",X"9A",X"9B",X"7B",X"72",X"57",X"A5",X"92",X"87",X"67",X"66",X"86",X"B2",X"58",X"8E",X"8B", + X"5F",X"B0",X"71",X"6B",X"63",X"A7",X"8F",X"85",X"67",X"63",X"B2",X"61",X"6F",X"AE",X"81",X"7F", + X"4E",X"A4",X"8D",X"51",X"9F",X"99",X"73",X"62",X"75",X"B6",X"66",X"79",X"9F",X"50",X"B7",X"4C", + X"8E",X"9E",X"7D",X"5C",X"7F",X"AF",X"4B",X"8D",X"A1",X"7D",X"65",X"66",X"AE",X"7B",X"62",X"AD", + X"7B",X"6C",X"5F",X"A8",X"8D",X"84",X"66",X"65",X"A7",X"8D",X"75",X"58",X"9F",X"97",X"74",X"60", + X"79",X"A4",X"8E",X"6A",X"5F",X"A7",X"8D",X"53",X"A7",X"87",X"73",X"57",X"B1",X"74",X"68",X"AD", + X"48",X"A0",X"94",X"81",X"6D",X"5F",X"94",X"9C",X"85",X"6D",X"5F",X"97",X"9D",X"78",X"5B",X"87", + X"AA",X"5E",X"6C",X"A6",X"8A",X"7A",X"5D",X"7B",X"9E",X"96",X"59",X"7D",X"AB",X"4C",X"98",X"95", + X"4B",X"A5",X"8B",X"55",X"A5",X"8D",X"71",X"60",X"84",X"A4",X"84",X"7F",X"5A",X"82",X"AB",X"5B", + X"78",X"B2",X"5B",X"7F",X"A2",X"4D",X"94",X"A2",X"51",X"98",X"93",X"78",X"57",X"9B",X"95",X"7D", + X"57",X"90",X"9D",X"53",X"A2",X"8D",X"6C",X"65",X"81",X"AD",X"68",X"71",X"A9",X"53",X"A4",X"82", + X"7A",X"55",X"A4",X"88",X"53",X"A5",X"8D",X"7F",X"6A",X"63",X"A7",X"87",X"59",X"A5",X"8A",X"77", + X"61",X"7B",X"AD",X"73",X"6B",X"A1",X"7F",X"6F",X"60",X"B2",X"6C",X"66",X"AA",X"82",X"81",X"5E", + X"75",X"9D",X"92",X"7D",X"6C",X"63",X"B0",X"73",X"60",X"A8",X"86",X"80",X"62",X"71",X"99",X"9A", + X"50",X"97",X"92",X"51",X"9D",X"96",X"51",X"A5",X"79",X"5D",X"AA",X"85",X"80",X"64",X"6D",X"AB", + X"77",X"64",X"A9",X"82",X"77",X"5F",X"85",X"A1",X"85",X"7F",X"5B",X"88",X"A4",X"4E",X"95",X"98", + X"81",X"69",X"69",X"B1",X"55",X"90",X"99",X"4F",X"A7",X"7E",X"59",X"AA",X"7C",X"5B",X"9E",X"92", + X"7E",X"70",X"5F",X"A1",X"8F",X"85",X"5F",X"78",X"A6",X"7F",X"77",X"5A",X"A0",X"87",X"58",X"A0", + X"93",X"59",X"97",X"94",X"5B",X"76",X"9F",X"8E",X"63",X"72",X"AC",X"57",X"81",X"A6",X"66",X"68", + X"A7",X"83",X"5C",X"A7",X"80",X"7A",X"59",X"97",X"9A",X"5D",X"7A",X"AD",X"66",X"72",X"A1",X"80", + X"70",X"62",X"A7",X"85",X"7B",X"5F",X"7E",X"9D",X"8E",X"73",X"5F",X"93",X"9D",X"63",X"6D",X"AA", + X"7B",X"89",X"5B",X"7F",X"A0",X"84",X"64",X"78",X"A5",X"7A",X"75",X"5E",X"9C",X"93",X"7F",X"7C", + X"58",X"A0",X"8D",X"80",X"61",X"77",X"9D",X"91",X"65",X"71",X"A4",X"80",X"76",X"5E",X"A4",X"89", + X"7C",X"62",X"78",X"9D",X"8D",X"7D",X"6C",X"68",X"B0",X"69",X"78",X"A3",X"54",X"9F",X"8A",X"79", + X"63",X"7A",X"9E",X"8D",X"64",X"71",X"AD",X"6D",X"6D",X"9D",X"86",X"6F",X"68",X"82",X"A8",X"6A", + X"74",X"A2",X"7A",X"73",X"61",X"B1",X"66",X"73",X"A8",X"5C",X"7D",X"A7",X"6C",X"6C",X"AA",X"56", + X"97",X"89",X"55",X"A7",X"85",X"85",X"6E",X"66",X"A6",X"82",X"82",X"5F",X"81",X"A5",X"55",X"8A", + X"9C",X"7C",X"81",X"5B",X"8A",X"9F",X"5E",X"7E",X"A9",X"5D",X"79",X"9E",X"87",X"61",X"76",X"9E", + X"8C",X"65",X"72",X"A2",X"83",X"78",X"60",X"A2",X"86",X"7C",X"5E",X"9B",X"8C",X"56",X"AD",X"66", + X"71",X"A3",X"81",X"82",X"66",X"74",X"AE",X"5E",X"82",X"9B",X"58",X"8E",X"9E",X"63",X"72",X"A1", + X"84",X"72",X"62",X"9F",X"8B",X"81",X"73",X"65",X"89",X"9D",X"7F",X"84",X"5E",X"84",X"9E",X"7C", + X"7B",X"5E",X"8B",X"96",X"8C",X"56",X"96",X"90",X"80",X"66",X"74",X"9A",X"92",X"61",X"78",X"9E", + X"87",X"69",X"72",X"A2",X"7F",X"76",X"63",X"8B",X"9A",X"83",X"5B",X"8F",X"98",X"7B",X"7F",X"5B", + X"92",X"98",X"5A",X"9D",X"86",X"81",X"62",X"80",X"A0",X"7B",X"76",X"61",X"9A",X"91",X"80",X"7B", + X"5E",X"91",X"96",X"7F",X"6E",X"69",X"99",X"94",X"64",X"75",X"A6",X"74",X"64",X"8F",X"9D",X"65", + X"72",X"A1",X"83",X"74",X"62",X"9F",X"89",X"82",X"72",X"67",X"88",X"9D",X"7A",X"62",X"AC",X"5A", + X"8F",X"90",X"7F",X"6E",X"6B",X"8E",X"9D",X"61",X"86",X"9B",X"56",X"9D",X"88",X"7C",X"64",X"7B", + X"99",X"8E",X"5E",X"7F",X"9F",X"7F",X"83",X"63",X"7D",X"A5",X"6A",X"6C",X"99",X"8F",X"57",X"A1", + X"7C",X"68",X"9C",X"86",X"6B",X"72",X"A2",X"7B",X"81",X"5C",X"98",X"90",X"77",X"61",X"A5",X"71", + X"6B",X"A0",X"87",X"73",X"68",X"A2",X"80",X"80",X"63",X"7D",X"9E",X"81",X"60",X"A2",X"77",X"69", + X"A8",X"6B",X"6D",X"9D",X"83",X"7E",X"65",X"7C",X"9D",X"86",X"62",X"80",X"A1",X"6F",X"68",X"A0", + X"83",X"84",X"6C",X"6E",X"92",X"9A",X"5D",X"8C",X"8F",X"5F",X"A1",X"7F",X"7F",X"65",X"7B",X"98", + X"8C",X"61",X"7C",X"A1",X"78",X"66",X"A3",X"68",X"75",X"A3",X"7A",X"87",X"69",X"70",X"8E",X"97", + X"7C",X"62",X"93",X"90",X"79",X"6B",X"74",X"A0",X"83",X"63",X"87",X"9E",X"6D",X"70",X"A1",X"60", + X"8E",X"91",X"7A",X"73",X"68",X"97",X"8E",X"84",X"73",X"68",X"8D",X"9A",X"75",X"66",X"9E",X"7F", + X"60",X"9A",X"8E",X"61",X"8D",X"92",X"57",X"96",X"8E",X"81",X"79",X"65",X"9C",X"87",X"7A",X"67", + X"80",X"9E",X"7D",X"85",X"64",X"7B",X"9B",X"85",X"72",X"68",X"98",X"8F",X"74",X"66",X"9A",X"89", + X"5D",X"8D",X"96",X"7C",X"60",X"A1",X"7C",X"69",X"9D",X"81",X"78",X"65",X"A2",X"78",X"69",X"A8", + X"62",X"83",X"95",X"7E",X"76",X"67",X"8B",X"97",X"7B",X"61",X"A7",X"6B",X"76",X"9C",X"7F",X"77", + X"66",X"91",X"95",X"77",X"64",X"98",X"8E",X"64",X"7B",X"9D",X"7F",X"61",X"94",X"8F",X"7C",X"66", + X"82",X"9D",X"7A",X"87",X"66",X"7A",X"A0",X"6E",X"6D",X"A0",X"7F",X"84",X"71",X"6B",X"9E",X"83", + X"7E",X"62",X"90",X"92",X"7B",X"79",X"62",X"A4",X"79",X"70",X"99",X"84",X"62",X"8B",X"92",X"7F", + X"74",X"6B",X"8A",X"99",X"75",X"68",X"99",X"8C",X"68",X"77",X"9D",X"7D",X"83",X"6F",X"6D",X"91", + X"91",X"83",X"6F",X"6E",X"99",X"8C",X"69",X"76",X"9F",X"79",X"68",X"A1",X"70",X"6D",X"9B",X"86", + X"60",X"9C",X"7C",X"6A",X"9F",X"7B",X"84",X"65",X"81",X"A0",X"61",X"89",X"91",X"7D",X"7B",X"65", + X"8D",X"95",X"7E",X"83",X"70",X"6D",X"A3",X"73",X"70",X"A1",X"67",X"7F",X"9C",X"5A",X"98",X"7F", + X"6B",X"A0",X"78",X"87",X"60",X"8A",X"95",X"7C",X"81",X"61",X"94",X"8E",X"7F",X"7A",X"67",X"88", + X"93",X"88",X"6F",X"71",X"A0",X"67",X"78",X"98",X"88",X"6D",X"72",X"9E",X"7E",X"83",X"78",X"67", + X"8D",X"92",X"82",X"63",X"8F",X"8F",X"7D",X"7A",X"66",X"8F",X"93",X"7B",X"66",X"A3",X"6B",X"7B", + X"97",X"7E",X"74",X"6B",X"9B",X"86",X"7F",X"80",X"66",X"82",X"95",X"87",X"62",X"88",X"95",X"7D", + X"82",X"6B",X"77",X"99",X"86",X"66",X"91",X"8C",X"74",X"6C",X"98",X"85",X"7B",X"66",X"97",X"87", + X"80",X"74",X"6D",X"8C",X"96",X"73",X"70",X"A1",X"64",X"7A",X"93",X"8D",X"64",X"80",X"96",X"82", + X"6F",X"71",X"99",X"87",X"65",X"82",X"98",X"7F",X"82",X"71",X"6F",X"92",X"8D",X"83",X"6E",X"73", + X"95",X"8C",X"6E",X"74",X"9A",X"7E",X"82",X"69",X"7E",X"9F",X"62",X"88",X"91",X"64",X"8F",X"8F", + X"65",X"7E",X"96",X"83",X"63",X"8D",X"90",X"7F",X"7D",X"67",X"98",X"85",X"7E",X"66",X"92",X"8B", + X"7C",X"6C",X"7C",X"9B",X"7C",X"69",X"94",X"86",X"7F",X"72",X"6F",X"8F",X"91",X"78",X"68",X"97", + X"89",X"7B",X"67",X"97",X"86",X"80",X"74",X"6C",X"94",X"8C",X"7E",X"82",X"6B",X"7C",X"9F",X"67", + X"82",X"96",X"6A",X"77",X"9A",X"7E",X"83",X"78",X"69",X"98",X"86",X"81",X"74",X"6D",X"8C",X"91", + X"81",X"7A",X"69",X"99",X"80",X"65",X"90",X"8F",X"7D",X"66",X"96",X"87",X"7F",X"67",X"8D",X"8F", + X"61",X"98",X"7F",X"67",X"8E",X"90",X"7D",X"82",X"69",X"7D",X"96",X"86",X"6A",X"7D",X"9D",X"6F", + X"76",X"99",X"6E",X"71",X"99",X"83",X"83",X"71",X"71",X"8F",X"91",X"71",X"72",X"9A",X"7D",X"84", + X"6A",X"7A",X"8C",X"94",X"6B",X"7D",X"94",X"7F",X"6D",X"79",X"97",X"84",X"67",X"85",X"93",X"81", + X"73",X"74",X"9B",X"7A",X"84",X"68",X"80",X"97",X"7E",X"83",X"69",X"82",X"99",X"69",X"82",X"97", + X"65",X"87",X"91",X"63",X"93",X"86",X"7F",X"76",X"6C",X"94",X"89",X"82",X"6D",X"78",X"96",X"86", + X"69",X"80",X"97",X"79",X"6D",X"97",X"7D",X"6A",X"9A",X"76",X"6D",X"98",X"83",X"81",X"7D",X"6C", + X"80",X"93",X"87",X"65",X"96",X"83",X"81",X"78",X"6B",X"99",X"82",X"82",X"73",X"70",X"91",X"8D", + X"7C",X"84",X"69",X"80",X"97",X"7B",X"85",X"6C",X"79",X"92",X"8B",X"73",X"71",X"9B",X"75",X"6E", + X"91",X"8E",X"70",X"73",X"97",X"84",X"6B",X"80",X"98",X"77",X"70",X"95",X"7F",X"67",X"93",X"89", + X"7F",X"7E",X"6B",X"83",X"95",X"7F",X"82",X"78",X"6C",X"98",X"83",X"81",X"79",X"6B",X"96",X"84", + X"67",X"95",X"84",X"68",X"8E",X"8F",X"71",X"72",X"8F",X"8F",X"6B",X"80",X"93",X"7A",X"6B",X"91", + X"87",X"65",X"90",X"8D",X"74",X"6E",X"93",X"89",X"7D",X"82",X"6B",X"7E",X"93",X"87",X"6B",X"7F", + X"97",X"7A",X"86",X"6B",X"7E",X"95",X"7D",X"83",X"71",X"74",X"93",X"88",X"7F",X"7E",X"69",X"96", + X"83",X"81",X"79",X"6C",X"8B",X"90",X"7D",X"83",X"77",X"6E",X"8A",X"92",X"77",X"71",X"98",X"78", + X"6F",X"9B",X"6E",X"7D",X"94",X"7A",X"83",X"65",X"93",X"88",X"81",X"78",X"6F",X"86",X"96",X"71", + X"79",X"94",X"7D",X"80",X"6C",X"7E",X"91",X"87",X"7E",X"80",X"6B",X"80",X"8F",X"8B",X"6B",X"7D", + X"95",X"7D",X"83",X"72",X"73",X"92",X"88",X"80",X"6E",X"7C",X"95",X"80",X"6D",X"7F",X"95",X"7D", + X"83",X"77",X"6E",X"92",X"88",X"7F",X"6F",X"7A",X"96",X"7F",X"6E",X"80",X"99",X"6B",X"7F",X"90", + X"80",X"75",X"72",X"94",X"87",X"75",X"72",X"99",X"78",X"6F",X"8C",X"8F",X"6C",X"7C",X"92",X"80", + X"78",X"6E",X"90",X"8C",X"72",X"73",X"96",X"81",X"81",X"6D",X"7F",X"95",X"7D",X"83",X"7B",X"6E", + X"83",X"93",X"7E",X"83",X"6A",X"88",X"90",X"66",X"8C",X"8D",X"69",X"86",X"92",X"7B",X"85",X"70", + X"76",X"8D",X"8E",X"70",X"78",X"96",X"7C",X"85",X"6F",X"79",X"98",X"74",X"71",X"90",X"89",X"7C", + X"83",X"6B",X"83",X"91",X"80",X"80",X"70",X"79",X"90",X"88",X"7E",X"81",X"6E",X"7D",X"98",X"71", + X"7B",X"93",X"7A",X"85",X"6B",X"80",X"92",X"81",X"80",X"71",X"79",X"99",X"74",X"78",X"93",X"7C", + X"83",X"70",X"78",X"8D",X"8B",X"7E",X"80",X"6C",X"82",X"90",X"84",X"6A",X"8B",X"8C",X"7D",X"81", + X"6B",X"8B",X"8F",X"6D",X"82",X"92",X"6C",X"7F",X"94",X"72",X"74",X"91",X"86",X"6D",X"82",X"93", + X"69",X"82",X"91",X"80",X"6E",X"81",X"94",X"77",X"73",X"93",X"7C",X"6F",X"97",X"78",X"71",X"8B", + X"8F",X"6C",X"82",X"8E",X"7D",X"81",X"6F",X"7C",X"8F",X"87",X"7E",X"80",X"6E",X"7E",X"8E",X"8A", + X"70",X"78",X"95",X"7D",X"84",X"78",X"71",X"87",X"91",X"79",X"70",X"91",X"85",X"7C",X"6F",X"8B", + X"8C",X"67",X"90",X"82",X"6F",X"91",X"84",X"76",X"72",X"8D",X"8D",X"70",X"7D",X"93",X"6F",X"7D", + X"95",X"68",X"88",X"8B",X"80",X"78",X"73",X"96",X"7D",X"84",X"73",X"75",X"93",X"83",X"81",X"77", + X"72",X"8E",X"8A",X"7E",X"80",X"6D",X"8C",X"8C",X"6A",X"83",X"8F",X"81",X"6D",X"85",X"8F",X"7E", + X"6D",X"88",X"8D",X"7F",X"6F",X"82",X"91",X"7D",X"6F",X"85",X"8F",X"7D",X"7D",X"6D",X"90",X"88", + X"7C",X"6E",X"94",X"80",X"70",X"8E",X"87",X"76",X"74",X"92",X"81",X"7D",X"6D",X"8F",X"87",X"7F", + X"71",X"7C",X"92",X"81",X"73",X"7A",X"95",X"7C",X"84",X"7B",X"6F",X"8D",X"8A",X"7B",X"71",X"82", + X"92",X"79",X"73",X"91",X"7E",X"6D",X"8D",X"89",X"7D",X"83",X"6D",X"84",X"8F",X"7D",X"83",X"70", + X"7B",X"8B",X"8B",X"7B",X"85",X"71",X"7A",X"93",X"7E",X"82",X"75",X"75",X"89",X"8D",X"7D",X"6D", + X"90",X"85",X"81",X"79",X"71",X"8D",X"8A",X"79",X"72",X"91",X"83",X"7D",X"6F",X"86",X"8E",X"7D", + X"70",X"85",X"90",X"7A",X"86",X"74",X"76",X"91",X"82",X"81",X"79",X"72",X"87",X"8D",X"80",X"6D", + X"86",X"8E",X"7E",X"82",X"76",X"74",X"89",X"8B",X"82",X"72",X"7F",X"94",X"6F",X"80",X"8D",X"7E", + X"73",X"7B",X"92",X"7F",X"71",X"8A",X"89",X"6A",X"89",X"8B",X"81",X"71",X"7F",X"91",X"7C",X"84", + X"79",X"72",X"8D",X"89",X"6C",X"8C",X"86",X"7F",X"7C",X"71",X"83",X"8D",X"83",X"7E",X"81",X"6E", + X"83",X"8D",X"85",X"71",X"7C",X"91",X"7E",X"82",X"7D",X"70",X"88",X"8D",X"7D",X"83",X"6E",X"84", + X"8F",X"7C",X"83",X"70",X"7E",X"90",X"7F",X"82",X"76",X"76",X"93",X"7E",X"83",X"7A",X"72",X"8D", + X"89",X"76",X"75",X"92",X"7F",X"83",X"76",X"76",X"92",X"7F",X"6F",X"8A",X"8A",X"7D",X"72",X"83", + X"90",X"79",X"75",X"8A",X"87",X"6B",X"89",X"89",X"7F",X"7F",X"71",X"81",X"93",X"70",X"7E",X"8E", + X"80",X"79",X"73",X"8E",X"88",X"79",X"72",X"8E",X"86",X"7B",X"72",X"8E",X"85",X"6E",X"8E",X"84", + X"6F",X"85",X"8E",X"78",X"74",X"91",X"7C",X"71",X"94",X"7A",X"73",X"8A",X"8C",X"76",X"76",X"8F", + X"84",X"7D",X"83",X"6E",X"86",X"8B",X"81",X"71",X"83",X"8D",X"7E",X"78",X"75",X"92",X"81",X"81", + X"7D",X"72",X"82",X"8E",X"80",X"80",X"7E",X"70",X"85",X"8C",X"83",X"70",X"80",X"8E",X"7F",X"72", + X"81",X"90",X"7A",X"86",X"72",X"7D",X"90",X"77",X"74",X"8C",X"88",X"7D",X"83",X"75",X"78",X"8C", + X"88",X"7D",X"83",X"74",X"79",X"8F",X"83",X"6F",X"87",X"8C",X"79",X"73",X"8A",X"89",X"7D",X"83", + X"76",X"76",X"8C",X"87",X"7F",X"7D",X"70",X"8C",X"87",X"80",X"71",X"84",X"8D",X"7C",X"73",X"8C", + X"83",X"6E",X"89",X"8A",X"7C",X"73",X"90",X"7E",X"83",X"70",X"84",X"8C",X"7E",X"78",X"78",X"93", + X"7A",X"73",X"8A",X"89",X"7C",X"84",X"77",X"76",X"90",X"81",X"81",X"7A",X"73",X"8B",X"89",X"71", + X"7E",X"8F",X"7E",X"71",X"8B",X"86",X"7F",X"7E",X"70",X"8D",X"87",X"72",X"7D",X"8E",X"82",X"73", + X"7E",X"8F",X"7F",X"82",X"7D",X"72",X"88",X"8C",X"6F",X"86",X"89",X"7D",X"81",X"70",X"83",X"8C", + X"82",X"70",X"83",X"8C",X"81",X"72",X"80",X"8E",X"7D",X"83",X"7A",X"74",X"86",X"8C",X"7C",X"72", + X"87",X"8B",X"7D",X"83",X"78",X"76",X"8F",X"82",X"71",X"8D",X"82",X"80",X"7E",X"72",X"83",X"8D", + X"7E",X"83",X"74",X"7E",X"8F",X"7B",X"85",X"74",X"7B",X"8F",X"7F",X"81",X"7B",X"73",X"87",X"8A", + X"80",X"72",X"8B",X"84",X"7E",X"80",X"70",X"8B",X"87",X"7E",X"82",X"73",X"7D",X"8C",X"86",X"77", + X"79",X"91",X"79",X"77",X"90",X"7A",X"77",X"90",X"79",X"75",X"8B",X"87",X"77",X"79",X"91",X"74", + X"7D",X"8C",X"7F",X"72",X"85",X"8B",X"7D",X"72",X"87",X"89",X"7F",X"7B",X"74",X"8D",X"86",X"76", + X"7A",X"91",X"74",X"7A",X"8B",X"86",X"78",X"77",X"8E",X"82",X"7F",X"81",X"73",X"7E",X"8C",X"84", + X"76",X"7B",X"91",X"77",X"77",X"8A",X"87",X"76",X"79",X"8B",X"86",X"75",X"7B",X"8B",X"85",X"72", + X"83",X"89",X"7E",X"7E",X"73",X"8F",X"80",X"73",X"83",X"8D",X"7D",X"84",X"73",X"7E",X"8B",X"84", + X"74",X"7D",X"8C",X"82",X"74",X"7F",X"8D",X"80",X"7B",X"74",X"8D",X"84",X"79",X"76",X"8F",X"80", + X"82",X"72",X"85",X"8A",X"7C",X"82",X"71",X"85",X"8A",X"7F",X"81",X"76",X"7B",X"8F",X"7F",X"83", + X"75",X"7B",X"89",X"89",X"73",X"81",X"8B",X"7C",X"84",X"74",X"7D",X"8C",X"81",X"71",X"89",X"87", + X"80",X"72",X"88",X"87",X"7F",X"75",X"82",X"8C",X"7B",X"84",X"73",X"7F",X"8E",X"7A",X"76",X"8D", + X"81",X"7E",X"74",X"8C",X"84",X"71",X"85",X"8A",X"7E",X"74",X"86",X"8A",X"7B",X"75",X"8A",X"85", + X"71",X"8B",X"83",X"73",X"89",X"85",X"7B",X"75",X"87",X"8A",X"79",X"76",X"8C",X"83",X"7F",X"80", + X"73",X"81",X"89",X"86",X"73",X"7D",X"8B",X"84",X"7A",X"76",X"8C",X"83",X"7F",X"75",X"81",X"8D", + X"7D",X"84",X"77",X"7A",X"8E",X"7B",X"75",X"8D",X"80",X"81",X"7B",X"75",X"8C",X"84",X"7F",X"73", + X"87",X"88",X"7D",X"82",X"75",X"7D",X"8D",X"7F",X"74",X"8D",X"7E",X"75",X"8D",X"7E",X"74",X"88", + X"88",X"7A",X"78",X"8D",X"7C",X"75",X"87",X"89",X"7A",X"76",X"88",X"89",X"77",X"7A",X"8E",X"7C", + X"74",X"8A",X"85",X"7E",X"82",X"76",X"7B",X"89",X"87",X"72",X"88",X"85",X"7E",X"81",X"74",X"7F", + X"88",X"87",X"75",X"7E",X"8E",X"77",X"79",X"8A",X"85",X"77",X"7A",X"8B",X"83",X"76",X"7F",X"8C", + X"73",X"7E",X"8B",X"82",X"75",X"7E",X"8C",X"7F",X"77",X"7C",X"8D",X"80",X"75",X"86",X"87",X"73", + X"7F",X"8B",X"80",X"7F",X"74",X"89",X"85",X"72",X"89",X"85",X"73",X"88",X"85",X"7D",X"82",X"71", + X"8A",X"84",X"83",X"74",X"82",X"89",X"81",X"78",X"7D",X"8C",X"7F",X"7C",X"76",X"8A",X"86",X"7B", + X"77",X"8C",X"81",X"80",X"7E",X"74",X"86",X"88",X"82",X"7A",X"78",X"8B",X"83",X"7E",X"82",X"77", + X"7B",X"88",X"87",X"7A",X"77",X"86",X"89",X"78",X"7A",X"8C",X"7F",X"81",X"79",X"78",X"87",X"87", + X"81",X"76",X"80",X"8D",X"74",X"81",X"89",X"7D",X"83",X"76",X"7D",X"8B",X"81",X"73",X"87",X"88", + X"7D",X"76",X"8D",X"7D",X"77",X"8A",X"82",X"7A",X"78",X"89",X"86",X"76",X"7C",X"8B",X"81",X"7D", + X"75",X"8B",X"82",X"74",X"8A",X"82",X"74",X"8B",X"81",X"80",X"7E",X"75",X"85",X"8A",X"77",X"7B", + X"8A",X"83",X"77",X"7C",X"8B",X"81",X"77",X"7D",X"8D",X"7D",X"83",X"7A",X"78",X"89",X"86",X"7D", + X"83",X"79",X"79",X"8A",X"84",X"75",X"80",X"8A",X"80",X"7B",X"78",X"8E",X"7C",X"78",X"8B",X"7F", + X"81",X"7C",X"76",X"86",X"87",X"80",X"74",X"85",X"88",X"7B",X"76",X"8C",X"81",X"82",X"78",X"7C", + X"8A",X"80",X"7B",X"78",X"8C",X"80",X"7E",X"75",X"87",X"87",X"7D",X"76",X"86",X"88",X"7B",X"77", + X"87",X"87",X"79",X"7A",X"8C",X"7B",X"78",X"8C",X"80",X"81",X"7D",X"76",X"85",X"88",X"80",X"7E", + X"76",X"86",X"88",X"7D",X"76",X"84",X"89",X"7B",X"79",X"89",X"81",X"80",X"7B",X"77",X"89",X"84", + X"80",X"7F",X"75",X"88",X"84",X"7F",X"77",X"7F",X"8B",X"80",X"78",X"7E",X"8C",X"7B",X"79",X"88", + X"83",X"77",X"7F",X"8C",X"76",X"7F",X"89",X"7F",X"78",X"7C",X"8B",X"81",X"76",X"83",X"8A",X"74", + X"83",X"88",X"75",X"82",X"89",X"74",X"81",X"89",X"7D",X"83",X"77",X"7C",X"8C",X"7E",X"76",X"88", + X"86",X"7E",X"83",X"7A",X"79",X"83",X"89",X"7F",X"76",X"88",X"85",X"74",X"84",X"89",X"75",X"82", + X"88",X"7D",X"83",X"75",X"80",X"88",X"82",X"7A",X"7B",X"8B",X"7E",X"82",X"7B",X"78",X"88",X"86", + X"76",X"83",X"88",X"74",X"83",X"88",X"7E",X"76",X"85",X"87",X"7E",X"82",X"7C",X"78",X"83",X"87", + X"83",X"76",X"80",X"89",X"80",X"77",X"81",X"8A",X"7E",X"81",X"7E",X"77",X"81",X"89",X"81",X"78", + X"7C",X"8B",X"80",X"82",X"74",X"86",X"85",X"80",X"77",X"82",X"88",X"7F",X"7A",X"7B",X"8C",X"7E", + X"82",X"7B",X"78",X"87",X"86",X"7E",X"82",X"76",X"81",X"8A",X"7A",X"79",X"87",X"86",X"7A",X"79", + X"89",X"83",X"7F",X"81",X"76",X"83",X"89",X"78",X"7C",X"89",X"82",X"78",X"7C",X"8B",X"7F",X"81", + X"7C",X"77",X"87",X"85",X"7E",X"81",X"77",X"7E",X"8A",X"80",X"81",X"7F",X"77",X"81",X"89",X"80", + X"80",X"7F",X"76",X"84",X"88",X"7E",X"82",X"79",X"7B",X"87",X"86",X"7C",X"79",X"88",X"83",X"76", + X"81",X"88",X"80",X"77",X"81",X"89",X"7D",X"78",X"86",X"84",X"76",X"81",X"88",X"80",X"77",X"85", + X"86",X"76",X"7E",X"89",X"81",X"78",X"7F",X"8A",X"7E",X"78",X"89",X"81",X"80",X"7E",X"77",X"82", + X"87",X"82",X"7F",X"81",X"78",X"7D",X"88",X"83",X"7F",X"77",X"86",X"85",X"7E",X"82",X"76",X"80", + X"88",X"82",X"7E",X"77",X"86",X"85",X"7F",X"77",X"86",X"85",X"7F",X"78",X"81",X"8A",X"75",X"83", + X"87",X"77",X"7F",X"8A",X"79",X"7B",X"88",X"84",X"76",X"84",X"85",X"7E",X"78",X"82",X"88",X"7F", + X"78",X"84",X"87",X"76",X"7F",X"88",X"82",X"7E",X"82",X"77",X"7F",X"89",X"7E",X"82",X"7B",X"7A", + X"87",X"85",X"76",X"81",X"88",X"80",X"77",X"81",X"88",X"7E",X"82",X"7E",X"78",X"82",X"87",X"81", + X"77",X"80",X"88",X"7F",X"78",X"81",X"89",X"7E",X"82",X"7E",X"78",X"82",X"88",X"81",X"78",X"7F", + X"89",X"7E",X"82",X"7E",X"78",X"83",X"88",X"7A",X"7B",X"88",X"81",X"7E",X"77",X"87",X"84",X"7F", + X"78",X"82",X"89",X"75",X"84",X"85",X"7F",X"81",X"78",X"7E",X"8A",X"7E",X"79",X"89",X"80",X"81", + X"7D",X"78",X"85",X"86",X"81",X"76",X"86",X"84",X"80",X"79",X"7E",X"88",X"81",X"79",X"7D",X"8A", + X"7E",X"82",X"7E",X"7A",X"7D",X"88",X"82",X"81",X"79",X"7F",X"8A",X"79",X"7B",X"88",X"82",X"7F", + X"7F",X"77",X"85",X"86",X"7F",X"78",X"82",X"88",X"7F",X"82",X"7B",X"7A",X"86",X"85",X"7F",X"81", + X"77",X"82",X"87",X"80",X"78",X"83",X"86",X"7D",X"83",X"77",X"81",X"88",X"7F",X"82",X"7B",X"7A", + X"88",X"83",X"77",X"83",X"87",X"78",X"7E",X"88",X"80",X"80",X"7F",X"79",X"7D",X"87",X"83",X"80", + X"77",X"83",X"85",X"7F",X"7A",X"7C",X"89",X"81",X"7A",X"7D",X"8A",X"7A",X"7B",X"86",X"84",X"7A", + X"7C",X"89",X"7F",X"82",X"7C",X"7A",X"88",X"81",X"77",X"85",X"86",X"77",X"84",X"85",X"77",X"81", + X"88",X"78",X"7D",X"87",X"82",X"78",X"81",X"87",X"7A",X"7C",X"89",X"7D",X"79",X"87",X"83",X"7A", + X"7C",X"88",X"82",X"7A",X"7D",X"88",X"80",X"78",X"86",X"83",X"76",X"84",X"86",X"7E",X"78",X"86", + X"83",X"7E",X"81",X"77",X"81",X"86",X"83",X"79",X"7E",X"88",X"7F",X"81",X"7D",X"79",X"86",X"84", + X"7E",X"82",X"77",X"81",X"86",X"82",X"78",X"82",X"86",X"80",X"7D",X"7A",X"89",X"80",X"7F",X"78", + X"88",X"81",X"78",X"87",X"81",X"7F",X"81",X"78",X"82",X"88",X"79",X"7F",X"88",X"7B",X"7B",X"85", + X"85",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"79",X"84",X"85",X"80",X"80",X"78",X"86",X"84",X"77", + X"81",X"87",X"7E",X"82",X"7A",X"7D",X"89",X"7E",X"82",X"7D",X"7A",X"82",X"87",X"7F",X"81",X"7F", + X"79",X"83",X"87",X"7A",X"7C",X"87",X"81",X"7E",X"79",X"85",X"85",X"7E",X"79",X"84",X"86",X"79", + X"7E",X"88",X"7B",X"7B",X"86",X"83",X"7F",X"82",X"79",X"7E",X"87",X"81",X"7D",X"79",X"86",X"84", + X"7F",X"79",X"84",X"85",X"77",X"85",X"84",X"7F",X"81",X"7A",X"7D",X"86",X"83",X"7E",X"82",X"7B", + X"7C",X"87",X"81",X"78",X"81",X"86",X"7F",X"79",X"82",X"86",X"7E",X"79",X"81",X"87",X"7E",X"79", + X"87",X"82",X"7F",X"80",X"78",X"84",X"85",X"7C",X"7B",X"87",X"81",X"80",X"78",X"86",X"83",X"80", + X"7B",X"7C",X"88",X"81",X"7C",X"7C",X"89",X"7B",X"7B",X"85",X"84",X"7B",X"7B",X"85",X"84",X"7C", + X"7A",X"86",X"84",X"7C",X"7B",X"87",X"82",X"7F",X"79",X"85",X"84",X"78",X"84",X"84",X"7A",X"7E", + X"87",X"81",X"7A",X"81",X"86",X"7A",X"7C",X"87",X"81",X"7F",X"81",X"7A",X"7F",X"88",X"7E",X"7A", + X"85",X"83",X"7A",X"7E",X"88",X"7B",X"7D",X"88",X"7D",X"7B",X"87",X"80",X"79",X"84",X"84",X"7E", + X"82",X"79",X"7F",X"87",X"80",X"80",X"79",X"83",X"86",X"7F",X"79",X"83",X"85",X"78",X"80",X"87", + X"7F",X"81",X"7A",X"7F",X"88",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"7A",X"84",X"85",X"7F",X"79", + X"81",X"87",X"7E",X"82",X"7B",X"7E",X"87",X"7E",X"79",X"84",X"85",X"7E",X"82",X"7C",X"7B",X"84", + X"86",X"78",X"83",X"84",X"80",X"7A",X"7E",X"86",X"82",X"7A",X"7E",X"87",X"81",X"7A",X"7F",X"87", + X"80",X"7E",X"79",X"86",X"83",X"7F",X"81",X"79",X"81",X"86",X"7E",X"82",X"7B",X"7D",X"87",X"80", + X"81",X"7F",X"7A",X"81",X"87",X"7C",X"7B",X"86",X"82",X"7C",X"7B",X"86",X"83",X"7D",X"7A",X"88", + X"7E",X"7B",X"85",X"82",X"7B",X"7D",X"87",X"80",X"7E",X"7A",X"85",X"84",X"7E",X"7A",X"85",X"84", + X"7E",X"7A",X"84",X"84",X"7E",X"82",X"79",X"80",X"86",X"7E",X"7A",X"85",X"83",X"7F",X"80",X"79", + X"85",X"84",X"79",X"82",X"86",X"79",X"81",X"86",X"7B",X"7D",X"87",X"7F",X"79",X"86",X"81",X"79", + X"85",X"83",X"79",X"82",X"85",X"78",X"82",X"85",X"7F",X"81",X"7B",X"7D",X"87",X"80",X"80",X"7F", + X"7A",X"83",X"86",X"7B",X"7D",X"86",X"81",X"7B",X"7D",X"86",X"82",X"7C",X"7D",X"88",X"7D",X"7B", + X"83",X"85",X"7E",X"7A",X"83",X"85",X"7C",X"7C",X"86",X"80",X"7F",X"7A",X"85",X"83",X"79",X"85", + X"83",X"7A",X"81",X"86",X"79",X"80",X"85",X"81",X"7E",X"7B",X"87",X"80",X"81",X"7E",X"7B",X"83", + X"86",X"79",X"81",X"84",X"80",X"7B",X"80",X"86",X"7F",X"7D",X"7D",X"88",X"7E",X"82",X"7C",X"7C", + X"85",X"83",X"79",X"81",X"86",X"7F",X"7A",X"82",X"86",X"79",X"80",X"85",X"81",X"7A",X"7F",X"86", + X"81",X"7B",X"7E",X"87",X"7F",X"80",X"80",X"7B",X"80",X"87",X"7E",X"7A",X"85",X"83",X"7F",X"7A", + X"84",X"84",X"7F",X"7C",X"7E",X"87",X"7E",X"82",X"7D",X"7B",X"85",X"81",X"7F",X"7A",X"85",X"82", + X"7F",X"7B",X"80",X"86",X"80",X"7B",X"80",X"86",X"7F",X"80",X"80",X"7A",X"81",X"85",X"7F",X"7A", + X"82",X"85",X"80",X"7B",X"81",X"86",X"7C",X"7C",X"86",X"81",X"81",X"7C",X"7E",X"86",X"7F",X"80", + X"79",X"84",X"84",X"7F",X"80",X"7F",X"7A",X"83",X"84",X"7F",X"81",X"7B",X"7E",X"83",X"85",X"7D", + X"7C",X"86",X"81",X"7A",X"81",X"85",X"7F",X"7B",X"84",X"82",X"7F",X"81",X"7A",X"80",X"85",X"81", + X"7F",X"81",X"7D",X"7C",X"84",X"84",X"7F",X"7A",X"82",X"85",X"7F",X"81",X"7F",X"7A",X"84",X"83", + X"7F",X"80",X"7A",X"81",X"85",X"80",X"80",X"7D",X"7C",X"86",X"81",X"80",X"80",X"7A",X"85",X"82", + X"7F",X"81",X"7B",X"7E",X"85",X"82",X"7F",X"81",X"7B",X"7F",X"84",X"83",X"7C",X"7D",X"85",X"82", + X"7C",X"7E",X"86",X"7D",X"7C",X"85",X"82",X"7F",X"81",X"7E",X"7B",X"84",X"83",X"81",X"7C",X"7D", + X"87",X"7C",X"7E",X"86",X"7F",X"7B",X"86",X"80",X"81",X"7C",X"7E",X"86",X"7F",X"7B",X"83",X"84", + X"7F",X"80",X"7A",X"81",X"85",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"7E",X"7C",X"87",X"7E",X"7C", + X"85",X"80",X"7B",X"84",X"82",X"79",X"82",X"84",X"81",X"7A",X"81",X"85",X"80",X"7F",X"7B",X"86", + X"81",X"7A",X"83",X"84",X"7F",X"81",X"7F",X"7B",X"82",X"85",X"7B",X"7D",X"85",X"81",X"7F",X"81", + X"7D",X"7C",X"85",X"82",X"80",X"7A",X"83",X"83",X"80",X"7D",X"7D",X"86",X"80",X"7F",X"7B",X"84", + X"83",X"7F",X"81",X"7E",X"7C",X"83",X"84",X"7B",X"81",X"85",X"7C",X"7E",X"86",X"7C",X"7D",X"84", + X"84",X"7C",X"7E",X"85",X"80",X"7C",X"7D",X"85",X"81",X"7F",X"81",X"7C",X"7F",X"86",X"7F",X"81", + X"7F",X"7B",X"84",X"83",X"7C",X"7F",X"86",X"7B",X"7E",X"84",X"82",X"7D",X"7D",X"85",X"80",X"7F", + X"7B",X"86",X"80",X"80",X"7F",X"7B",X"82",X"85",X"7B",X"80",X"84",X"80",X"7D",X"7D",X"85",X"82", + X"7D",X"7D",X"85",X"81",X"7D",X"7D",X"84",X"82",X"7D",X"7E",X"86",X"7D",X"7C",X"84",X"82",X"7B", + X"80",X"85",X"7F",X"80",X"80",X"7B",X"81",X"85",X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"7B", + X"81",X"84",X"7F",X"7B",X"83",X"83",X"7F",X"81",X"7B",X"80",X"83",X"83",X"7D",X"7C",X"85",X"81", + X"7F",X"81",X"7D",X"7D",X"83",X"83",X"80",X"7B",X"83",X"83",X"80",X"7B",X"81",X"84",X"80",X"7C", + X"80",X"85",X"7B",X"7E",X"84",X"82",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"80",X"7B",X"83",X"84", + X"7A",X"83",X"82",X"80",X"7C",X"81",X"85",X"7B",X"7F",X"84",X"80",X"7F",X"81",X"7C",X"7F",X"85", + X"7E",X"7C",X"83",X"84",X"7F",X"81",X"7B",X"80",X"84",X"7F",X"81",X"7D",X"7C",X"83",X"83",X"80", + X"7B",X"80",X"84",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F",X"7C",X"81",X"85",X"7B",X"7F",X"85", + X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"80",X"80",X"7B",X"82",X"83",X"7F",X"81",X"7D",X"7D", + X"85",X"80",X"80",X"80",X"7C",X"80",X"85",X"80",X"80",X"7F",X"7C",X"85",X"81",X"7B",X"82",X"83", + X"7A",X"82",X"83",X"7F",X"81",X"7B",X"80",X"85",X"7F",X"7C",X"84",X"82",X"7B",X"80",X"84",X"81", + X"7C",X"7F",X"85",X"7F",X"82",X"7D",X"7E",X"85",X"80",X"7B",X"82",X"83",X"7F",X"80",X"7B",X"85", + X"81",X"7B",X"81",X"84",X"80",X"7C",X"83",X"82",X"7B",X"80",X"84",X"80",X"81",X"7C",X"81",X"85", + X"7B",X"7F",X"85",X"7D",X"7D",X"84",X"81",X"80",X"81",X"7E",X"7C",X"83",X"83",X"7F",X"7C",X"81", + X"84",X"7F",X"81",X"7C",X"7F",X"85",X"7F",X"7C",X"82",X"83",X"7E",X"7C",X"82",X"84",X"7F",X"81", + X"7F",X"7C",X"81",X"84",X"80",X"80",X"81",X"7C",X"80",X"85",X"7F",X"7C",X"84",X"80",X"81",X"7C", + X"7F",X"84",X"81",X"7E",X"7D",X"84",X"82",X"7D",X"7D",X"84",X"81",X"7E",X"7C",X"84",X"81",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"7C",X"82",X"83",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F", + X"7C",X"80",X"83",X"82",X"7D",X"7E",X"84",X"81",X"7F",X"81",X"7C",X"80",X"84",X"81",X"7D",X"7E", + X"84",X"80",X"7F",X"7C",X"83",X"83",X"7E",X"7D",X"84",X"81",X"7B",X"82",X"83",X"7F",X"7C",X"81", + X"83",X"80",X"7C",X"81",X"84",X"7F",X"80",X"80",X"7C",X"81",X"84",X"7D",X"7D",X"83",X"82",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"80",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"84",X"81", + X"7F",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"85",X"80",X"80",X"7F",X"7C",X"83",X"82",X"7C", + X"81",X"84",X"7C",X"80",X"84",X"7D",X"7E",X"85",X"7F",X"7C",X"83",X"82",X"7F",X"81",X"7C",X"81", + X"84",X"80",X"80",X"80",X"7D",X"7F",X"83",X"82",X"7C",X"81",X"83",X"7F",X"81",X"7C",X"7F",X"83", + X"81",X"7F",X"81",X"7D",X"7E",X"85",X"80",X"80",X"7F",X"7C",X"82",X"83",X"7D",X"7E",X"83",X"82", + X"7E",X"7D",X"84",X"81",X"80",X"80",X"7C",X"81",X"84",X"80",X"81",X"7E",X"7D",X"84",X"82",X"7C", + X"82",X"83",X"7C",X"7F",X"84",X"80",X"80",X"81",X"7D",X"7E",X"83",X"82",X"80",X"80",X"7C",X"82", + X"83",X"7C",X"80",X"84",X"7D",X"7D",X"84",X"80",X"81",X"7C",X"82",X"83",X"7F",X"7E",X"7E",X"84", + X"80",X"80",X"80",X"7D",X"7E",X"85",X"80",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7F",X"7C",X"82", + X"83",X"7B",X"80",X"83",X"80",X"7D",X"7E",X"84",X"80",X"80",X"80",X"7D",X"7F",X"84",X"7F",X"7C", + X"84",X"81",X"80",X"7C",X"83",X"82",X"7C",X"82",X"82",X"7C",X"80",X"84",X"7D",X"7E",X"84",X"80", + X"80",X"80",X"7C",X"83",X"82",X"80",X"7E",X"7E",X"85",X"7E",X"7D",X"82",X"83",X"7E",X"7D",X"83", + X"80",X"7C",X"83",X"81",X"7C",X"83",X"81",X"80",X"80",X"7C",X"7F",X"82",X"82",X"7E",X"7D",X"83", + X"82",X"7E",X"7D",X"83",X"82",X"7E",X"7E",X"84",X"7F",X"7C",X"84",X"80",X"7C",X"83",X"81",X"7F", + X"80",X"7C",X"81",X"83",X"80",X"7F",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7B",X"82",X"82",X"7F", + X"80",X"7C",X"82",X"82",X"80",X"7D",X"82",X"83",X"7B",X"82",X"82",X"80",X"7D",X"80",X"83",X"80", + X"7D",X"80",X"84",X"7F",X"81",X"7F",X"7D",X"82",X"83",X"80",X"7C",X"81",X"83",X"7F",X"7D",X"81", + X"84",X"7D",X"7F",X"84",X"7F",X"7D",X"84",X"80",X"81",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7E", + X"82",X"83",X"7F",X"81",X"7D",X"7F",X"83",X"81",X"7D",X"7F",X"84",X"80",X"7C",X"83",X"81",X"7C", + X"82",X"82",X"7C",X"80",X"83",X"80",X"80",X"80",X"7D",X"7E",X"83",X"81",X"80",X"80",X"7F",X"7D", + X"82",X"83",X"80",X"80",X"80",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7D",X"82",X"82",X"80",X"7E", + X"7D",X"84",X"81",X"80",X"80",X"7D",X"80",X"84",X"7E",X"7E",X"83",X"81",X"7F",X"7D",X"82",X"82", + X"7E",X"7E",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"7D",X"82",X"83",X"7F",X"7D",X"83",X"81",X"7C", + X"82",X"81",X"7F",X"81",X"7D",X"80",X"83",X"7F",X"7D",X"83",X"81",X"7F",X"81",X"7C",X"81",X"83", + X"7F",X"80",X"7F",X"7D",X"82",X"82",X"80",X"7D",X"80",X"83",X"80",X"7D",X"82",X"82",X"7F",X"81", + X"7D",X"7F",X"82",X"82",X"7D",X"81",X"83",X"7F",X"81",X"7D",X"7E",X"84",X"7F",X"7D",X"83",X"80", + X"7D",X"83",X"81",X"80",X"7E",X"7E",X"84",X"7E",X"7E",X"82",X"81",X"7D",X"80",X"83",X"81",X"7E", + X"7E",X"83",X"81",X"7D",X"80",X"83",X"7E",X"7E",X"83",X"81",X"80",X"80",X"7C",X"82",X"82",X"7E", + X"7E",X"83",X"81",X"7E",X"7E",X"83",X"80",X"80",X"7F",X"7D",X"83",X"80",X"80",X"7D",X"83",X"81", + X"80",X"7D",X"80",X"83",X"7F",X"81",X"7E",X"7F",X"83",X"7F",X"7D",X"83",X"80",X"7C",X"83",X"81", + X"7D",X"82",X"82",X"7C",X"81",X"82",X"80",X"7E",X"7F",X"83",X"81",X"7E",X"7F",X"83",X"80",X"80", + X"81",X"7D",X"7F",X"83",X"81",X"7D",X"80",X"83",X"80",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"7F", + X"83",X"80",X"7D",X"83",X"80",X"7F",X"7D",X"83",X"81",X"80",X"80",X"7D",X"81",X"83",X"80",X"7D", + X"83",X"81",X"80",X"80",X"7D",X"80",X"82",X"81",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81", + X"80",X"81",X"7E",X"7E",X"82",X"82",X"7F",X"7D",X"82",X"82",X"7C",X"81",X"82",X"81",X"7D",X"81", + X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"81",X"7E",X"7E", + X"83",X"81",X"7F",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82",X"82",X"7E",X"7E",X"83", + X"80",X"80",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"7F",X"7E",X"83",X"80",X"7D",X"81",X"83", + X"7F",X"80",X"80",X"7D",X"80",X"83",X"7D",X"7F",X"83",X"80",X"81",X"7E",X"7E",X"83",X"80",X"80", + X"80",X"7D",X"80",X"82",X"82",X"7D",X"80",X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"80",X"80",X"7D",X"80",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"81",X"7F",X"7E",X"82",X"81", + X"7D",X"81",X"82",X"7F",X"81",X"7D",X"80",X"82",X"81",X"7E",X"7F",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"7D",X"81",X"82",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"7F",X"7D",X"81",X"83",X"7F", + X"7E",X"82",X"81",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"81",X"82",X"7F",X"80",X"7E",X"7E",X"82", + X"82",X"80",X"80",X"7D",X"81",X"83",X"7E",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82", + X"82",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"80",X"82",X"80",X"7E",X"80",X"83",X"80", + X"7F",X"7E",X"83",X"81",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"83",X"7F", + X"7E",X"83",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"80",X"7D",X"80",X"82", + X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"82",X"80",X"7F",X"7E",X"83",X"7F",X"7E", + X"83",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"81",X"81",X"80",X"7E",X"7F",X"83",X"80", + X"7F",X"7E",X"83",X"80",X"80",X"80",X"7F",X"7E",X"82",X"82",X"80",X"80",X"80",X"7D",X"81",X"82", + X"7D",X"80",X"83",X"7F",X"7E",X"82",X"81",X"7D",X"80",X"82",X"80",X"7D",X"81",X"81",X"80",X"7D", + X"81",X"82",X"80",X"7E",X"7F",X"83",X"80",X"80",X"80",X"7E",X"7F",X"82",X"82",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"82",X"82",X"80",X"80",X"80",X"7E",X"80",X"82", + X"81",X"7E",X"81",X"82",X"7F",X"81",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"80",X"82",X"81", + X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E",X"80",X"82",X"80", + X"80",X"80",X"7D",X"82",X"81",X"80",X"80",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"82",X"81", + X"7F",X"81",X"7E",X"7F",X"82",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"7D", + X"81",X"82",X"7D",X"80",X"82",X"80",X"7E",X"81",X"82",X"7D",X"81",X"81",X"80",X"7D",X"81",X"82", + X"7F",X"80",X"7E",X"7F",X"82",X"81",X"7F",X"81",X"7D",X"81",X"82",X"7E",X"7F",X"82",X"81",X"7E", + X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E", + X"7F",X"82",X"81",X"7E",X"81",X"82",X"7E",X"7F",X"82",X"80",X"80",X"7E",X"81",X"82",X"7F",X"80", + X"7E",X"80",X"81",X"82",X"7F",X"7E",X"82",X"81",X"7F",X"81",X"7F",X"7E",X"82",X"81",X"7E",X"80", + X"82",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E", + X"82",X"81",X"80",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"82",X"80",X"7F",X"7F",X"83",X"7E",X"7F", + X"82",X"80",X"7F",X"7E",X"82",X"81",X"7F",X"7E",X"82",X"81",X"80",X"7E",X"81",X"81",X"80",X"7E", + X"80",X"82",X"80",X"7F",X"7E",X"83",X"80",X"80",X"80",X"7E",X"81",X"82",X"80",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7E",X"7F",X"82",X"81",X"7F",X"7F",X"83",X"7E",X"7F",X"82",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GAL_HIT.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GAL_HIT.vhd new file mode 100644 index 00000000..7d2fd29c --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/GAL_HIT.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_HIT 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 prom of GAL_HIT is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"65",X"75",X"88",X"90",X"93",X"9B",X"A3",X"A3",X"A3",X"A6",X"9E",X"9B",X"9B",X"A3",X"AB",X"B6", + X"B9",X"B9",X"BE",X"B9",X"AE",X"A6",X"9E",X"98",X"88",X"78",X"68",X"65",X"65",X"65",X"62",X"68", + X"68",X"65",X"5D",X"52",X"47",X"47",X"4A",X"4D",X"4D",X"4D",X"52",X"65",X"7D",X"88",X"90",X"9B", + X"A3",X"AE",X"AE",X"AB",X"AB",X"9E",X"98",X"88",X"70",X"52",X"37",X"1F",X"17",X"1F",X"27",X"3A", + X"5A",X"68",X"78",X"83",X"93",X"A3",X"AB",X"AE",X"A3",X"93",X"88",X"88",X"83",X"88",X"8B",X"88", + X"78",X"62",X"4A",X"42",X"3A",X"42",X"4D",X"55",X"65",X"78",X"83",X"8B",X"93",X"90",X"88",X"88", + X"98",X"A6",X"A6",X"AB",X"9E",X"8B",X"7D",X"68",X"70",X"88",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC", + X"FC",X"FC",X"DC",X"9B",X"4D",X"14",X"01",X"04",X"2F",X"52",X"5D",X"68",X"78",X"80",X"78",X"70", + X"5D",X"47",X"32",X"1F",X"14",X"09",X"11",X"1C",X"32",X"52",X"83",X"B9",X"D1",X"C9",X"AB",X"8B", + X"70",X"68",X"75",X"78",X"80",X"8B",X"8B",X"98",X"AB",X"BE",X"C1",X"AB",X"83",X"5D",X"3A",X"17", + X"11",X"17",X"27",X"3A",X"65",X"90",X"AE",X"B6",X"9B",X"78",X"55",X"4A",X"4D",X"5A",X"5D",X"52", + X"4A",X"4A",X"52",X"78",X"AB",X"D4",X"FC",X"FC",X"F7",X"E9",X"E1",X"D1",X"C9",X"BE",X"AB",X"90", + X"52",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"2F",X"4A",X"52",X"47",X"47",X"62",X"70",X"7D", + X"7D",X"78",X"7D",X"90",X"B3",X"CE",X"EC",X"FC",X"FC",X"FC",X"FC",X"F4",X"E9",X"F4",X"FC",X"FC", + X"FC",X"FC",X"CE",X"98",X"65",X"2C",X"01",X"01",X"01",X"01",X"01",X"32",X"6D",X"7D",X"68",X"4A", + X"27",X"11",X"1C",X"3A",X"4D",X"62",X"68",X"65",X"68",X"70",X"80",X"9B",X"D1",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"A3",X"75",X"55",X"62",X"80",X"A3",X"BE",X"CE",X"C1",X"90",X"4A",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"88",X"C9",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC", + X"B6",X"90",X"68",X"3F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1F",X"83",X"BE",X"D1",X"CE", + X"D4",X"F4",X"FC",X"FC",X"FC",X"F7",X"D1",X"CE",X"DC",X"F7",X"FC",X"FC",X"FC",X"FC",X"D1",X"8B", + X"68",X"68",X"88",X"A6",X"C1",X"D9",X"D4",X"BE",X"A3",X"88",X"75",X"68",X"62",X"5D",X"62",X"68", + X"6D",X"78",X"75",X"55",X"2C",X"11",X"11",X"2F",X"55",X"75",X"83",X"93",X"9E",X"B9",X"E9",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"68",X"32",X"11",X"17",X"32",X"52",X"7D", + X"AE",X"E1",X"F7",X"E1",X"A3",X"62",X"17",X"01",X"01",X"01",X"01",X"01",X"1C",X"4D",X"7D",X"90", + X"9B",X"A6",X"B6",X"BE",X"A6",X"70",X"37",X"14",X"14",X"1C",X"14",X"1C",X"2F",X"3A",X"3A",X"3A", + X"4A",X"52",X"4A",X"47",X"3A",X"24",X"11",X"14",X"27",X"3A",X"65",X"9E",X"D4",X"FC",X"FC",X"F7", + X"D4",X"AB",X"93",X"93",X"93",X"83",X"68",X"4D",X"37",X"37",X"5D",X"9B",X"EC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"CE",X"AB",X"93",X"7D",X"65",X"65",X"75",X"88",X"93",X"98",X"98",X"93", + X"93",X"90",X"93",X"8B",X"90",X"90",X"90",X"8B",X"8B",X"90",X"8B",X"90",X"90",X"90",X"90",X"8B", + X"8B",X"8B",X"8B",X"8B",X"88",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"83",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"78",X"75",X"78",X"75",X"78", + X"78",X"78",X"75",X"78",X"75",X"70",X"75",X"75",X"75",X"75",X"70",X"6D",X"68",X"6D",X"70",X"6D", + X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"70",X"70",X"70",X"75",X"75",X"75",X"75", + X"75",X"70",X"62",X"4D",X"4D",X"4D",X"47",X"4A",X"68",X"98",X"B6",X"B3",X"9B",X"78",X"5A",X"3F", + X"32",X"2F",X"32",X"3F",X"5A",X"90",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"E9",X"90",X"4D",X"3A", + X"47",X"5D",X"5D",X"4D",X"3A",X"27",X"1C",X"14",X"11",X"0C",X"01",X"01",X"01",X"01",X"01",X"01", + X"04",X"4A",X"9E",X"F7",X"FC",X"FC",X"FC",X"FC",X"EC",X"E4",X"E4",X"D1",X"AB",X"80",X"62",X"47", + X"37",X"2F",X"2C",X"24",X"04",X"01",X"24",X"52",X"70",X"70",X"62",X"4D",X"3F",X"37",X"37",X"3A", + X"4D",X"62",X"78",X"93",X"AE",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"B6",X"68", + X"2C",X"01",X"01",X"01",X"01",X"01",X"01",X"09",X"47",X"65",X"68",X"68",X"62",X"5A",X"52",X"4D", + X"52",X"4D",X"52",X"52",X"5A",X"5D",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"65",X"37",X"1C", + X"09",X"09",X"1C",X"32",X"4D",X"70",X"93",X"AB",X"C9",X"D9",X"E9",X"EF",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"F7",X"6D",X"0C",X"01",X"01",X"01",X"01",X"01",X"17",X"62",X"83",X"78", + X"5A",X"37",X"14",X"04",X"01",X"01",X"01",X"01",X"04",X"11",X"1C",X"1C",X"01",X"01",X"0C",X"3F", + X"6D",X"7D",X"78",X"68",X"65",X"83",X"B3",X"E1",X"F4",X"E4",X"C6",X"A3",X"8B",X"75",X"68",X"65", + X"5D",X"62",X"65",X"62",X"5A",X"3F",X"27",X"17",X"1F",X"5A",X"9E",X"CE",X"D4",X"C9",X"AE",X"A6", + X"AE",X"AB",X"9B",X"83",X"80",X"98",X"9B",X"9B",X"9B",X"B6",X"D9",X"E4",X"E1",X"DC",X"E1",X"D4", + X"B3",X"83",X"5A",X"3A",X"1F",X"11",X"0C",X"11",X"14",X"1C",X"1F",X"2C",X"2C",X"1F",X"27",X"32", + X"3F",X"5D",X"83",X"9B",X"93",X"93",X"88",X"7D",X"7D",X"75",X"70",X"70",X"6D",X"68",X"68",X"68", + X"5A",X"5A",X"75",X"88",X"93",X"93",X"90",X"90",X"88",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"80", + X"7D",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80",X"83",X"83",X"80",X"80", + X"80",X"7D",X"7D",X"70",X"70",X"6D",X"75",X"83",X"90",X"93",X"90",X"88",X"88",X"80",X"78",X"7D", + X"70",X"68",X"70",X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"75",X"70",X"68",X"4D",X"3A", + X"4A",X"70",X"93",X"A3",X"B6",X"B9",X"B3",X"A3",X"90",X"80",X"75",X"70",X"68",X"68",X"68",X"65", + X"68",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"75",X"78", + X"78",X"78",X"78",X"78",X"78",X"78",X"70",X"55",X"37",X"1F",X"24",X"47",X"68",X"7D",X"88",X"8B", + X"88",X"88",X"88",X"8B",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"C9",X"AB",X"80",X"5A", + X"4A",X"47",X"37",X"2C",X"32",X"4D",X"70",X"78",X"7D",X"8B",X"90",X"88",X"68",X"4A",X"2C",X"1C", + X"11",X"09",X"01",X"01",X"01",X"01",X"14",X"27",X"47",X"70",X"AE",X"E1",X"F4",X"E4",X"D1",X"AE", + X"93",X"80",X"70",X"68",X"62",X"62",X"65",X"68",X"6D",X"75",X"78",X"78",X"65",X"4A",X"4D",X"5A", + X"62",X"65",X"68",X"88",X"B9",X"EC",X"FC",X"F4",X"D1",X"B6",X"B3",X"AE",X"A3",X"98",X"A3",X"C6", + X"D9",X"D4",X"D4",X"E1",X"E1",X"C9",X"9E",X"78",X"62",X"3F",X"32",X"2C",X"27",X"2C",X"32",X"37", + X"3F",X"47",X"4A",X"52",X"55",X"5A",X"5D",X"5D",X"5A",X"3F",X"27",X"14",X"11",X"14",X"24",X"4A", + X"80",X"A6",X"BE",X"C6",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC",X"BE",X"AB",X"8B", + X"5D",X"2F",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"70",X"6D",X"5D",X"4D", + X"4D",X"68",X"9B",X"BE",X"C9",X"B9",X"B3",X"AB",X"9B",X"A3",X"B3",X"C6",X"D1",X"B6",X"8B",X"52", + X"1C",X"11",X"11",X"14",X"37",X"62",X"90",X"9E",X"9B",X"83",X"75",X"5D",X"47",X"32",X"2F",X"24", + X"17",X"11",X"11",X"17",X"27",X"5D",X"A3",X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"EF",X"CE", + X"9B",X"7D",X"68",X"62",X"62",X"7D",X"98",X"9E",X"93",X"7D",X"6D",X"5D",X"55",X"52",X"52",X"52", + X"55",X"55",X"5D",X"62",X"65",X"68",X"6D",X"70",X"75",X"7D",X"78",X"7D",X"80",X"83",X"78",X"62", + X"3A",X"27",X"14",X"17",X"27",X"3F",X"5A",X"78",X"98",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70",X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32", + X"04",X"01",X"01",X"01",X"01",X"01",X"11",X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78", + X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24",X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93", + X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90",X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E", + X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E",X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B", + X"88",X"75",X"52",X"37",X"1F",X"1C",X"27",X"37",X"4D",X"68",X"83",X"AE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D1",X"9B",X"65",X"42",X"3A",X"52",X"80",X"AE",X"D4",X"E9",X"E4",X"C6", + X"80",X"3A",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"32",X"88",X"C6",X"F7",X"FC", + X"E4",X"CE",X"B9",X"A3",X"80",X"62",X"47",X"37",X"2F",X"2C",X"2F",X"37",X"3F",X"3A",X"32",X"3A", + X"37",X"32",X"37",X"3A",X"52",X"7D",X"B3",X"DC",X"E4",X"E1",X"D1",X"D1",X"E1",X"FC",X"FC",X"FC", + X"FC",X"F4",X"CE",X"A3",X"83",X"75",X"7D",X"83",X"83",X"88",X"98",X"A6",X"A6",X"98",X"88",X"75", + X"68",X"5D",X"5A",X"5A",X"5A",X"62",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"7D",X"83",X"83", + X"80",X"75",X"68",X"70",X"80",X"8B",X"93",X"98",X"98",X"90",X"90",X"8B",X"90",X"98",X"A3",X"AE", + X"B6",X"C9",X"C9",X"C1",X"B3",X"A3",X"98",X"8B",X"78",X"75",X"70",X"6D",X"65",X"68",X"70",X"80", + X"83",X"83",X"88",X"8B",X"83",X"78",X"68",X"5D",X"52",X"42",X"2C",X"27",X"2C",X"3A",X"47",X"42", + X"42",X"52",X"70",X"8B",X"A6",X"AB",X"A3",X"9E",X"9E",X"B3",X"B9",X"B9",X"BE",X"BE",X"B9",X"A3", + X"88",X"68",X"5D",X"5A",X"5A",X"52",X"52",X"68",X"70",X"65",X"62",X"62",X"68",X"7D",X"8B",X"8B", + X"83",X"75",X"65",X"68",X"75",X"80",X"9B",X"C1",X"EC",X"FC",X"FC",X"F7",X"EF",X"E9",X"D1",X"A3", + X"78",X"5D",X"42",X"2C",X"14",X"0C",X"09",X"0C",X"0C",X"17",X"2C",X"47",X"62",X"75",X"75",X"68", + X"62",X"52",X"4A",X"4A",X"42",X"3F",X"4A",X"55",X"68",X"90",X"A3",X"B9",X"C6",X"CE",X"E4",X"FC", + X"FC",X"EC",X"E9",X"E9",X"DC",X"C1",X"B3",X"A6",X"98",X"75",X"52",X"3A",X"2C",X"1C",X"11",X"01", + X"0C",X"1F",X"37",X"52",X"70",X"78",X"78",X"68",X"62",X"62",X"75",X"98",X"B6",X"BE",X"B3",X"AB", + X"A6",X"9B",X"9E",X"AE",X"B9",X"C1",X"AE",X"90",X"5D",X"32",X"2C",X"27",X"2C",X"3F",X"62",X"83", + X"93",X"90",X"88",X"80",X"70",X"5D",X"52",X"47",X"3A",X"2F",X"24",X"1F",X"2C",X"3A",X"68",X"A3", + X"D4",X"F4",X"FC",X"FC",X"F4",X"E9",X"E9",X"DC",X"B9",X"90",X"78",X"68",X"5D",X"62",X"7D",X"93", + X"9B",X"90",X"7D",X"70",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5A",X"5D",X"65",X"68",X"68",X"70", + X"70",X"75",X"78",X"78",X"7D",X"80",X"80",X"78",X"65",X"3F",X"27",X"17",X"1C",X"2C",X"3F",X"5D", + X"78",X"93",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70", + X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32",X"04",X"01",X"01",X"01",X"01",X"01",X"11", + X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78",X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24", + X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93",X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90", + X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E", + X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B",X"88",X"75",X"52",X"37",X"1F",X"1C",X"24", + X"37",X"4D",X"68",X"88",X"AE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"9B",X"65", + X"3F",X"37",X"52",X"80",X"B3",X"D9",X"EC",X"EC",X"C9",X"7D",X"37",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"27",X"88",X"D1",X"FC",X"FC",X"EC",X"D1",X"BE",X"A3",X"7D",X"62",X"3A", + X"2C",X"1F",X"1F",X"24",X"2C",X"32",X"2C",X"27",X"2F",X"27",X"27",X"27",X"2C",X"47",X"7D",X"C1", + X"F7",X"FC",X"FC",X"E9",X"E1",X"EC",X"FC",X"FC",X"FC",X"FC",X"FC",X"E4",X"AE",X"88",X"78",X"83", + X"8B",X"8B",X"93",X"A3",X"B9",X"BE",X"A6",X"90",X"75",X"65",X"52",X"52",X"52",X"4D",X"55",X"5D", + X"62",X"68",X"70",X"70",X"70",X"75",X"80",X"8B",X"90",X"90",X"8B",X"83",X"90",X"98",X"9B",X"9E", + X"9E",X"9B",X"93",X"93",X"8B",X"90",X"8B",X"8B",X"8B",X"88",X"8B",X"8B",X"8B",X"8B",X"88",X"8B", + X"8B",X"8B",X"8B",X"8B",X"8B",X"88",X"8B",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"80",X"80", + X"80",X"7D",X"65",X"47",X"52",X"68",X"78",X"78",X"65",X"5A",X"5D",X"6D",X"75",X"78",X"70",X"68", + X"70",X"90",X"C9",X"EC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A6",X"68",X"42",X"3A",X"37",X"3A",X"5D", + X"7D",X"83",X"68",X"55",X"52",X"47",X"32",X"17",X"09",X"01",X"01",X"09",X"17",X"2C",X"52",X"9B", + X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"DC",X"A6",X"78",X"62",X"47",X"1F",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"3F",X"7D",X"A3",X"9B",X"80",X"5D",X"4A",X"5A",X"7D",X"90",X"9B",X"AB", + X"A6",X"AB",X"AB",X"9E",X"A6",X"BE",X"D4",X"E4",X"D4",X"A6",X"88",X"7D",X"88",X"88",X"83",X"90", + X"A3",X"AB",X"A6",X"9E",X"98",X"8B",X"83",X"80",X"80",X"80",X"83",X"83",X"88",X"8B",X"8B",X"90", + X"90",X"90",X"93",X"98",X"98",X"9B",X"93",X"98",X"93",X"93",X"93",X"93",X"93",X"93",X"90",X"90", + X"90",X"8B",X"8B",X"83",X"80",X"7D",X"68",X"52",X"52",X"62",X"68",X"88",X"AB",X"C6",X"C9",X"C9", + X"B6",X"A6",X"9E",X"8B",X"83",X"8B",X"A3",X"B3",X"AE",X"98",X"80",X"6D",X"5D",X"52",X"47",X"42", + X"47",X"3F",X"47",X"42",X"42",X"4D",X"62",X"65",X"68",X"68",X"68",X"68",X"68",X"68",X"68",X"68", + X"65",X"68",X"68",X"68",X"6D",X"70",X"6D",X"6D",X"70",X"75",X"70",X"75",X"78",X"75",X"78",X"75", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"7D",X"80",X"80",X"6D",X"65",X"70",X"80",X"80",X"68", + X"52",X"32",X"2C",X"37",X"68",X"9B",X"B6",X"B6",X"B6",X"C1",X"D4",X"D9",X"C6",X"A3",X"78",X"5A", + X"3F",X"32",X"32",X"3A",X"55",X"8B",X"CE",X"FC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A3",X"62",X"2F", + X"1C",X"09",X"01",X"01",X"1C",X"47",X"5D",X"68",X"80",X"93",X"90",X"80",X"70",X"5A",X"4D",X"52", + X"68",X"78",X"7D",X"70",X"5D",X"4A",X"3A",X"32",X"32",X"2F",X"27",X"27",X"1C",X"11",X"09",X"0C", + X"14",X"2C",X"42",X"75",X"AB",X"DC",X"F7",X"FC",X"FC",X"F7",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"BE",X"88",X"4D",X"11",X"01",X"01",X"0C",X"3F",X"75",X"9E",X"B6",X"B3", + X"93",X"70",X"52",X"3A",X"1F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"3F", + X"52",X"62",X"68",X"7D",X"9E",X"C1",X"E4",X"FC",X"FC",X"F7",X"E1",X"BE",X"A3",X"90",X"80",X"88", + X"AB",X"E1",X"FC",X"FC",X"FC",X"FC",X"F7",X"BE",X"7D",X"3F",X"0C",X"01",X"01",X"01",X"01",X"27", + X"70",X"B6",X"E9",X"FC",X"FC",X"E9",X"AE",X"83",X"62",X"4D",X"2F",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"3F",X"98",X"CE",X"D1",X"BE",X"B6",X"C1",X"D4",X"E9",X"FC",X"E9",X"C9",X"AB", + X"9B",X"88",X"5D",X"37",X"27",X"27",X"1F",X"1C",X"1C",X"1F",X"37",X"70",X"B6",X"FC",X"FC",X"FC", + X"FC",X"FC",X"F4",X"F4",X"E4",X"C6",X"98",X"70",X"5A",X"3A",X"37",X"47",X"6D",X"AE",X"F7",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"93",X"55",X"17",X"01",X"01",X"01",X"1C",X"4A",X"80",X"AB", + X"B3",X"A6",X"A3",X"A3",X"A3",X"A6",X"9B",X"78",X"42",X"11",X"04",X"11",X"1C",X"1F",X"37",X"55", + X"7D",X"8B",X"80",X"5D",X"47",X"4D",X"65",X"6D",X"5D",X"4A",X"3F",X"4D",X"7D",X"B6",X"EC",X"FC", + X"FC",X"FC",X"E4",X"C6",X"9E",X"98",X"9B",X"90",X"75",X"5D",X"62",X"7D",X"9B",X"C6",X"E1",X"E9", + X"D9",X"B3",X"93",X"83",X"70",X"68",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5D",X"65",X"65",X"68", + X"5A",X"37",X"2F",X"4A",X"65",X"6D",X"68",X"75",X"93",X"BE",X"E4",X"EC",X"D1",X"B3",X"9E",X"AB", + X"AB",X"9E",X"80",X"65",X"42",X"32",X"32",X"4A",X"75",X"90",X"A3",X"BE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"D1",X"93",X"5A",X"3A",X"3A",X"47",X"5A",X"7D",X"A6",X"CE",X"CE",X"B9",X"A6",X"9B",X"80", + X"52",X"1C",X"01",X"01",X"01",X"11",X"47",X"78",X"9E",X"AB",X"9B",X"78",X"5A",X"2C",X"14",X"1C", + X"27",X"1F",X"11",X"01",X"01",X"01",X"1C",X"3F",X"75",X"AB",X"C9",X"D4",X"DC",X"CE",X"C9",X"D1", + X"E1",X"F4",X"FC",X"FC",X"FC",X"E4",X"BE",X"90",X"70",X"4A",X"11",X"01",X"01",X"01",X"01",X"09", + X"17",X"4A",X"90",X"D4",X"FC",X"FC",X"FC",X"F4",X"E9",X"E9",X"FC",X"FC",X"E4",X"B3",X"80",X"52", + X"2F",X"1C",X"1F",X"32",X"68",X"AE",X"F4",X"FC",X"FC",X"FC",X"E4",X"C9",X"AB",X"80",X"5D",X"47", + X"37",X"42",X"75",X"AB",X"DC",X"FC",X"FC",X"FC",X"D9",X"93",X"55",X"37",X"2F",X"3A",X"52",X"62", + X"68",X"68",X"55",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1C",X"32",X"4D",X"68", + X"9B",X"CE",X"E4",X"F4",X"EC",X"E4",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9", + X"88",X"4A",X"17",X"04",X"11",X"42",X"75",X"88",X"9B",X"B6",X"BE",X"A6",X"7D",X"4D",X"1C",X"01", + X"01",X"17",X"27",X"32",X"4D",X"7D",X"A6",X"B3",X"B9",X"C6",X"D1",X"D9",X"D9",X"CE",X"BE",X"A6", + X"90",X"65",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"14",X"68",X"93",X"98",X"83",X"75",X"7D", + X"9E",X"BE",X"C9",X"BE",X"A6",X"9E",X"B6",X"D9",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9",X"C1", + X"B3",X"9B",X"75",X"5D",X"47",X"2F",X"2F",X"4A",X"68",X"7D",X"7D",X"78",X"83",X"90",X"9E",X"AE", + X"A3",X"83",X"75",X"52",X"3F",X"4A",X"5D",X"62",X"55",X"3F",X"2F",X"24",X"32",X"5A",X"7D",X"90", + X"AB",X"CE",X"E4",X"FC",X"FC",X"FC",X"E9",X"CE",X"B3",X"98",X"88",X"83",X"83",X"90",X"B3",X"EC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"75",X"42",X"27",X"14",X"01",X"01",X"1C",X"3F",X"52",X"5A", + X"68",X"78",X"68",X"47",X"17",X"01",X"01",X"09",X"27",X"37",X"4A",X"65",X"75",X"6D",X"65",X"68", + X"68",X"5D",X"4D",X"42",X"27",X"0C",X"0C",X"14",X"1C",X"1F",X"3A",X"68",X"9E",X"CE",X"E1",X"DC", + X"DC",X"DC",X"DC",X"CE",X"A6",X"75",X"5A",X"4A",X"3A",X"4A",X"70",X"98",X"BE",X"E1",X"E9",X"E4", + X"B9",X"9E",X"90",X"8B",X"88",X"75",X"52",X"2F",X"2F",X"4A",X"5D",X"68",X"78",X"80",X"70",X"70", + X"7D",X"8B",X"9E",X"B6",X"BE",X"B6",X"AE",X"9B",X"98",X"AE",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"B9",X"9E",X"88",X"65",X"4D",X"47",X"3F",X"2F",X"11",X"01",X"04", + X"1F",X"2F",X"2F",X"1F",X"11",X"01",X"0C",X"2C",X"4D",X"62",X"78",X"98",X"AB",X"BE",X"DC",X"F4", + X"F7",X"E4",X"E1",X"DC",X"C1",X"9E",X"88",X"62",X"3A",X"14",X"01",X"11",X"17",X"27",X"32",X"55", + X"88",X"B6",X"E4",X"F7",X"E4",X"C6",X"A3",X"75",X"5A",X"52",X"5A",X"68",X"78",X"80",X"80",X"5A", + X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"3F",X"70",X"A3",X"C9",X"E1",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"C6",X"B3",X"98",X"93",X"9B",X"AB",X"B9",X"AB",X"98",X"83",X"68",X"52", + X"4A",X"2F",X"17",X"04",X"01",X"0C",X"37",X"75",X"A3",X"B9",X"D1",X"CE",X"B3",X"A3",X"9B",X"93", + X"93",X"A6",X"BE",X"B9",X"9E",X"7D",X"55",X"37",X"27",X"27",X"4A",X"80",X"A6",X"B3",X"AE",X"AB", + X"B9",X"C6",X"B9",X"B3",X"A3",X"80",X"5D",X"4A",X"47",X"3A",X"32",X"3A",X"5A",X"7D",X"83",X"90", + X"8B",X"83",X"7D",X"70",X"65",X"6D",X"7D",X"78",X"65",X"47",X"1F",X"0C",X"01",X"01",X"09",X"2C", + X"68",X"AE",X"CE",X"D1",X"CE",X"D4",X"E4",X"E4",X"CE",X"A6",X"98",X"9B",X"AB",X"BE",X"CE",X"CE", + X"B9",X"90",X"52",X"14",X"01",X"01",X"01",X"01",X"09",X"3A",X"78",X"9E",X"AE",X"B9",X"CE",X"CE", + X"B9",X"A6",X"90",X"7D",X"7D",X"83",X"80",X"68",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75", + X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6",X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4", + X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A",X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC", + X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52",X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B", + X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9",X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01", + X"01",X"01",X"01",X"01",X"01",X"24",X"47",X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4", + X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3",X"9B",X"98",X"98",X"90",X"83",X"88",X"A6",X"C9",X"DC", + X"D9",X"BE",X"AB",X"7D",X"52",X"2F",X"27",X"1F",X"11",X"17",X"27",X"2F",X"2F",X"3F",X"52",X"5D", + X"5A",X"65",X"70",X"75",X"80",X"88",X"8B",X"9B",X"AB",X"BE",X"C6",X"AE",X"83",X"55",X"27",X"09", + X"09",X"27",X"52",X"83",X"93",X"98",X"93",X"88",X"83",X"80",X"70",X"55",X"3F",X"2C",X"27",X"32", + X"47",X"65",X"8B",X"AE",X"D4",X"E9",X"D9",X"B3",X"98",X"90",X"93",X"88",X"68",X"4D",X"4A",X"5A", + X"68",X"6D",X"7D",X"8B",X"90",X"8B",X"88",X"8B",X"98",X"9E",X"9B",X"83",X"62",X"2F",X"09",X"04", + X"1F",X"47",X"6D",X"98",X"AE",X"B6",X"B3",X"AB",X"9B",X"9B",X"A3",X"B6",X"C6",X"B9",X"9B",X"83", + X"78",X"6D",X"65",X"5A",X"5A",X"68",X"88",X"A6",X"B6",X"A3",X"8B",X"75",X"68",X"6D",X"6D",X"65", + X"5D",X"5D",X"68",X"80",X"A3",X"CE",X"DC",X"D4",X"CE",X"CE",X"C9",X"C6",X"CE",X"BE",X"AB",X"90", + X"80",X"80",X"8B",X"98",X"9E",X"B6",X"DC",X"E4",X"E4",X"E1",X"CE",X"C6",X"B6",X"98",X"80",X"7D", + X"75",X"70",X"68",X"68",X"62",X"3F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"11",X"47",X"68",X"90",X"B6",X"CE",X"D4",X"E1",X"E9",X"E9",X"E4",X"E4",X"E9",X"E4",X"D4",X"C6", + X"A6",X"78",X"42",X"14",X"01",X"01",X"01",X"01",X"14",X"42",X"78",X"AB",X"D1",X"E1",X"D9",X"C6", + X"9B",X"7D",X"75",X"78",X"88",X"93",X"8B",X"88",X"70",X"4D",X"2F",X"24",X"1C",X"24",X"27",X"24", + X"27",X"3A",X"62",X"88",X"B3",X"CE",X"DC",X"EC",X"EF",X"E1",X"CE",X"BE",X"A3",X"83",X"68",X"52", + X"4D",X"55",X"65",X"78",X"78",X"80",X"90",X"90",X"90",X"8B",X"75",X"5D",X"4D",X"52",X"62",X"80", + X"A3",X"B6",X"B6",X"B6",X"A6",X"90",X"83",X"88",X"93",X"9E",X"BE",X"D1",X"C9",X"AE",X"8B",X"62", + X"3F",X"27",X"1C",X"32",X"62",X"88",X"9B",X"A3",X"AB",X"C1",X"CE",X"C1",X"B6",X"A6",X"90",X"6D", + X"5D",X"55",X"3F",X"2F",X"2F",X"47",X"5D",X"65",X"6D",X"75",X"78",X"83",X"7D",X"75",X"7D",X"83", + X"80",X"68",X"4D",X"2F",X"14",X"04",X"04",X"17",X"37",X"70",X"A6",X"C1",X"C1",X"B9",X"BE",X"D1", + X"D4",X"C1",X"A3",X"98",X"9E",X"AE",X"C9",X"D4",X"D4",X"C6",X"98",X"5D",X"24",X"01",X"01",X"01", + X"01",X"17",X"4A",X"7D",X"A3",X"AE",X"B9",X"C9",X"C6",X"B6",X"A3",X"8B",X"7D",X"80",X"83",X"83", + X"6D",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75",X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6", + X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4",X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A", + X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC",X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52", + X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B",X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9", + X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"47", + X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4",X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3", + X"9B",X"98",X"98",X"8B",X"83",X"8B",X"A6",X"C9",X"E1",X"DC",X"C1",X"A6",X"7D",X"4D",X"2C",X"24", + X"17",X"0C",X"11",X"1F",X"2C",X"2C",X"3A",X"52",X"5D",X"5A",X"65",X"70",X"78",X"88",X"90",X"90", + X"9E",X"AB",X"C1",X"C6",X"A6",X"78",X"3F",X"11",X"01",X"01",X"14",X"47",X"80",X"93",X"98",X"93", + X"83",X"70",X"65",X"4D",X"2F",X"14",X"04",X"04",X"27",X"47",X"70",X"A3",X"D1",X"FC",X"FC",X"F7", + X"C9",X"A6",X"9B",X"9B",X"8B",X"70",X"5A",X"5D",X"75",X"7D",X"80",X"8B",X"9E",X"9B",X"93",X"8B", + X"98",X"A3",X"AE",X"AE",X"93",X"68",X"32",X"04",X"04",X"24",X"52",X"88",X"B6",X"C9",X"B9",X"AB", + X"98",X"80",X"80",X"90",X"A6",X"B9",X"BE",X"A6",X"93",X"8B",X"80",X"70",X"4D",X"37",X"3F",X"62", + X"88",X"9E",X"98",X"80",X"65",X"55",X"62",X"68",X"68",X"70",X"75",X"78",X"93",X"C6",X"FC",X"FC", + X"FC",X"FC",X"F7",X"E9",X"DC",X"D4",X"BE",X"A3",X"80",X"68",X"70",X"75",X"75",X"70",X"80",X"A3", + X"B3",X"B3",X"AE",X"98",X"83",X"75",X"5D",X"52",X"5A",X"68",X"78",X"83",X"83",X"78",X"4A",X"11", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"78",X"A6",X"D1",X"E9",X"E4", + X"E1",X"E1",X"DC",X"D9",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"B9",X"75",X"2F",X"01",X"01",X"01", + X"01",X"01",X"01",X"27",X"5D",X"9B",X"D4",X"F4",X"EC",X"CE",X"A6",X"93",X"9E",X"B6",X"B6",X"A3", + X"93",X"8B",X"83",X"70",X"68",X"78",X"93",X"A6",X"9E",X"90",X"83",X"98",X"AE",X"C9",X"D4",X"DC", + X"CE",X"A6",X"7D",X"65",X"52",X"2C",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"4D",X"9E", + X"E4",X"FC",X"FC",X"FC",X"EC",X"EC",X"FC",X"FC",X"FC",X"FC",X"E9",X"AE",X"78",X"4A",X"2F",X"2F", + X"52",X"8B",X"C6",X"F4",X"FC",X"F7",X"DC",X"B3",X"80",X"4D",X"17",X"01",X"01",X"01",X"1C",X"3F", + X"70",X"A6",X"D1",X"E9",X"E1",X"CE",X"B9",X"B3",X"AE",X"A6",X"88",X"5A",X"1F",X"01",X"01",X"01", + X"01",X"01",X"14",X"52",X"8B",X"B9",X"C6",X"B6",X"A6",X"9E",X"90",X"75",X"68",X"52",X"4A",X"52", + X"68",X"88",X"93",X"83",X"62",X"3F",X"1F",X"17",X"2F",X"4D",X"68",X"75",X"83",X"9E",X"D1",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D4",X"BE",X"B3",X"A3",X"A6",X"BE",X"D4",X"E1",X"CE",X"B3",X"A6",X"98", + X"75",X"4A",X"27",X"1C",X"2F",X"4D",X"68",X"7D",X"68",X"47",X"17",X"01",X"01",X"01",X"01",X"01", + X"04",X"0C",X"1F",X"32",X"4A",X"5D",X"80",X"B3",X"F7",X"FC",X"FC",X"FC",X"EC",X"D4",X"CE",X"BE", + X"C1",X"CE",X"D9",X"C9",X"A3",X"83",X"70",X"5A",X"3F",X"32",X"3F",X"5D",X"68",X"65",X"47",X"2C", + X"17",X"04",X"09",X"27",X"4A",X"68",X"90",X"9E",X"98",X"88",X"7D",X"83",X"9E",X"CE",X"E9",X"F7", + X"E4",X"BE",X"9E",X"68",X"37",X"09",X"01",X"01",X"01",X"04",X"14",X"37",X"55",X"65",X"70",X"88", + X"AE",X"DC",X"FC",X"F4",X"D1",X"AE",X"93",X"80",X"78",X"83",X"9B",X"B3",X"B3",X"98",X"70",X"47", + X"24",X"17",X"32",X"62",X"9B",X"C9",X"CE",X"B9",X"A3",X"9B",X"88",X"70",X"5D",X"55",X"68",X"93", + X"B6",X"BE",X"B3",X"AE",X"AE",X"A3",X"90",X"90",X"98",X"9B",X"AB",X"AB",X"AE",X"B3",X"AB",X"93", + X"78",X"65",X"68",X"78",X"75",X"70",X"68",X"78",X"8B",X"93",X"93",X"9E",X"B9",X"DC",X"FC",X"FC", + X"FC",X"D4",X"93",X"62",X"42",X"1C",X"01",X"01",X"04",X"0C",X"0C",X"1F",X"4A",X"78",X"AB",X"C9", + X"DC",X"E1",X"D9",X"C6",X"AB",X"90",X"70",X"47",X"09",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"1C",X"47",X"62",X"75",X"88",X"AB",X"D1",X"E9",X"EC",X"E9",X"E4",X"DC",X"F7",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"9E",X"80",X"75",X"7D",X"70",X"6D",X"75",X"80",X"8B",X"80",X"65", + X"4A",X"2C",X"04",X"01",X"01",X"01",X"04",X"2C",X"52",X"62",X"5A",X"4D",X"5A",X"78",X"9B",X"B3", + X"C1",X"AB",X"93",X"83",X"78",X"62",X"4D",X"4A",X"52",X"4A",X"3F",X"4D",X"5D",X"7D",X"90",X"9B", + X"9E",X"83",X"68",X"62",X"5D",X"68",X"78",X"88",X"88",X"8B",X"8B",X"80",X"62",X"47",X"3F",X"3A", + X"32",X"37",X"37",X"37",X"4D",X"70",X"88",X"8B",X"80",X"70",X"70",X"8B",X"B6",X"D4",X"D4",X"CE", + X"B9",X"B9",X"C9",X"C9",X"C6",X"B6",X"B9",X"D4",X"FC",X"FC",X"FC",X"FC",X"EC",X"B6",X"80",X"52", + X"37",X"2F",X"2C",X"37",X"62",X"98",X"D1",X"FC",X"FC",X"EC",X"D1",X"A3",X"68",X"4A",X"32",X"27", + X"27",X"3A",X"55",X"68",X"62",X"52",X"3F",X"1C",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"37", + X"5A",X"70",X"88",X"88",X"7D",X"65",X"52",X"47",X"52",X"68",X"83",X"9E",X"AE",X"B6",X"C1",X"B9", + X"B6",X"AE",X"98",X"78",X"5D",X"42",X"32",X"2C",X"2F",X"4D",X"7D",X"B9",X"F7",X"FC",X"FC",X"FC", + X"E1",X"AB",X"83",X"65",X"52",X"5A",X"68",X"65",X"52",X"3F",X"3F",X"3F",X"37",X"37",X"52",X"7D", + X"A6",X"C1",X"BE",X"9E",X"88",X"7D",X"68",X"5A",X"47",X"47",X"62",X"90",X"B3",X"C6",X"D9",X"EF", + X"FC",X"FC",X"E4",X"CE",X"B9",X"B3",X"B3",X"AE",X"AB",X"9B",X"75",X"55",X"37",X"11",X"01",X"01", + X"01",X"01",X"04",X"4D",X"88",X"AB",X"B3",X"AE",X"A3",X"9B",X"AE",X"C6",X"CE",X"C9",X"BE",X"B6", + X"B3",X"AB",X"AE",X"C6",X"EF",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"88",X"4A",X"14",X"01", + X"09",X"2C",X"52",X"78",X"93",X"93",X"78",X"47",X"0C",X"01",X"01",X"01",X"01",X"09",X"09",X"11", + X"27",X"4D",X"62",X"68",X"7D",X"90",X"9E",X"AE",X"AB",X"8B",X"70",X"62",X"52",X"3A",X"1C",X"04", + X"11",X"2F",X"5A",X"83",X"9E",X"B3",X"B9",X"B9",X"AB",X"80",X"62",X"4D",X"4D",X"5A",X"65",X"75", + X"7D",X"83",X"83",X"70",X"4D",X"1F",X"0C",X"14",X"32",X"5D",X"70",X"68",X"65",X"68",X"83",X"9E", + X"9E",X"93",X"88",X"83",X"9B",X"BE",X"D9",X"E1",X"D1",X"B6",X"A3",X"93",X"88",X"88",X"8B",X"98", + X"A3",X"C6",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"D4",X"B3",X"88",X"65",X"4A",X"32",X"3A",X"5D", + X"88",X"B3",X"D4",X"E4",X"E1",X"B9",X"78",X"37",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"14",X"37",X"42",X"4A",X"5A",X"68",X"78",X"90",X"AE",X"C9",X"E1",X"E1", + X"C9",X"93",X"65",X"4D",X"32",X"1F",X"17",X"27",X"37",X"3F",X"42",X"4D",X"68",X"88",X"98",X"A3", + X"B6",X"C9",X"D4",X"E4",X"E4",X"D4",X"BE",X"A6",X"AE",X"C6",X"E4",X"FC",X"FC",X"FC",X"E4",X"AB", + X"6D",X"3F",X"27",X"2F",X"52",X"83",X"AB",X"AB",X"AE",X"AE",X"AE",X"98",X"70",X"5A",X"5A",X"65", + X"7D",X"88",X"80",X"5D",X"3A",X"24",X"11",X"11",X"2F",X"52",X"75",X"83",X"93",X"A3",X"C9",X"EF", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"98",X"5A",X"1F",X"01",X"01",X"01",X"11",X"2F", + X"5D",X"90",X"BE",X"E4",X"FC",X"FC",X"D9",X"A3",X"78",X"65",X"68",X"75",X"70",X"65",X"5A",X"4A", + X"2C",X"14",X"04",X"11",X"37",X"68",X"9B",X"A6",X"9B",X"88",X"83",X"90",X"93",X"90",X"8B",X"83", + X"7D",X"83",X"93",X"A6",X"B6",X"BE",X"B9",X"9E",X"68",X"42",X"2C",X"2F",X"47",X"5D",X"78",X"88", + X"90",X"93",X"90",X"70",X"52",X"37",X"17",X"11",X"17",X"2C",X"37",X"3F",X"4D",X"4A",X"3F",X"32", + X"2F",X"37",X"5A",X"7D",X"9B",X"9E",X"A6",X"AE",X"B6",X"D4",X"FC",X"FC",X"FC",X"FC",X"FC",X"EC", + X"E1",X"B9",X"93",X"6D",X"5A",X"5A",X"5D",X"68",X"75",X"78",X"83",X"83",X"83",X"83",X"70",X"5D", + X"4A",X"4D",X"62",X"7D",X"90",X"98",X"88",X"62",X"2F",X"01",X"01",X"01",X"01",X"1C",X"37",X"52", + X"65",X"68",X"5A",X"52",X"5D",X"75",X"7D",X"75",X"5D",X"4A",X"4D",X"65",X"88",X"AB",X"C6",X"D9", + X"D4",X"B6",X"93",X"83",X"70",X"5A",X"47",X"47",X"4A",X"3F",X"3A",X"3F",X"32",X"27",X"17",X"1F", + X"3F",X"68",X"93",X"9E",X"9B",X"93",X"98",X"A6",X"AB",X"AB",X"A3",X"A6",X"BE",X"E1",X"F7",X"FC", + X"FC",X"EC",X"D1",X"AE",X"93",X"8B",X"9B",X"B3",X"B6",X"B6",X"C6",X"C6",X"B6",X"A6",X"9E",X"93", + X"7D",X"5D",X"37",X"1C",X"1F",X"27",X"2C",X"37",X"52",X"75",X"93",X"98",X"8B",X"7D",X"65",X"5D", + X"65",X"75",X"88",X"9B",X"9E",X"9B",X"8B",X"80",X"83",X"8B",X"8B",X"83",X"93",X"AB",X"C9",X"DC", + X"CE",X"B9",X"A6",X"83",X"5D",X"32",X"17",X"01",X"01",X"04",X"1C",X"4A",X"80",X"B6",X"DC",X"E1", + X"D4",X"BE",X"A6",X"98",X"90",X"88",X"6D",X"4D",X"2C",X"11",X"04",X"04",X"1C",X"4D",X"83",X"B6", + X"DC",X"E4",X"D1",X"C1",X"B3",X"9B",X"80",X"68",X"68",X"68",X"75",X"7D",X"7D",X"70",X"52",X"2C", + X"04",X"01",X"01",X"01",X"11",X"2F",X"47",X"5D",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC", + X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E",X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E", + X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52",X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01", + X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3",X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB", + X"93",X"78",X"65",X"62",X"68",X"70",X"80",X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70", + X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3",X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88", + X"7D",X"62",X"47",X"2F",X"11",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"78",X"93",X"9B", + X"9E",X"93",X"98",X"9B",X"98",X"A3",X"A6",X"AB",X"B3",X"C1",X"D1",X"CE",X"BE",X"AE",X"98",X"7D", + X"75",X"65",X"52",X"4A",X"3F",X"3A",X"3F",X"52",X"68",X"80",X"93",X"AB",X"B6",X"C9",X"E1",X"E4", + X"D4",X"CE",X"CE",X"C9",X"BE",X"9E",X"7D",X"5A",X"37",X"27",X"1C",X"1F",X"37",X"5A",X"75",X"80", + X"8B",X"93",X"90",X"8B",X"88",X"88",X"80",X"80",X"83",X"80",X"88",X"A3",X"C6",X"E1",X"FC",X"FC", + X"F4",X"CE",X"A3",X"80",X"65",X"4A",X"37",X"37",X"3F",X"47",X"52",X"62",X"70",X"7D",X"70",X"62", + X"52",X"55",X"68",X"78",X"80",X"75",X"65",X"65",X"5D",X"55",X"5A",X"5A",X"65",X"80",X"98",X"A3", + X"9B",X"8B",X"7D",X"80",X"88",X"90",X"98",X"9B",X"93",X"93",X"9E",X"AE",X"B9",X"B6",X"AE",X"AE", + X"A6",X"93",X"78",X"65",X"52",X"4D",X"4A",X"52",X"68",X"78",X"88",X"93",X"90",X"83",X"80",X"6D", + X"5D",X"5D",X"62",X"68",X"6D",X"6D",X"5D",X"4A",X"37",X"2F",X"32",X"52",X"75",X"93",X"A6",X"AE", + X"AB",X"AE",X"B6",X"C6",X"BE",X"C1",X"B9",X"A6",X"98",X"8B",X"70",X"52",X"3A",X"2C",X"37",X"42", + X"5A",X"68",X"70",X"78",X"7D",X"88",X"93",X"98",X"90",X"7D",X"7D",X"88",X"90",X"98",X"93",X"7D", + X"52",X"2C",X"09",X"01",X"01",X"09",X"32",X"52",X"70",X"88",X"9B",X"93",X"90",X"93",X"98",X"90", + X"83",X"70",X"65",X"62",X"78",X"93",X"AE",X"BE",X"C6",X"B9",X"9E",X"83",X"70",X"65",X"5D",X"5A", + X"5A",X"5D",X"5A",X"55",X"55",X"47",X"37",X"27",X"1F",X"37",X"5A",X"78",X"88",X"8B",X"8B",X"93", + X"A3",X"A6",X"AB",X"A6",X"AB",X"BE",X"D4",X"E4",X"EC",X"EC",X"E1",X"C9",X"A6",X"90",X"83",X"90", + X"98",X"9B",X"9E",X"AE",X"AB",X"A6",X"9E",X"9B",X"9B",X"90",X"78",X"5A",X"3F",X"37",X"37",X"37", + X"3F",X"52",X"68",X"88",X"83",X"78",X"68",X"5A",X"55",X"65",X"78",X"8B",X"9E",X"A3",X"9B",X"90", + X"83",X"88",X"8B",X"88",X"80",X"8B",X"9E",X"B9",X"C9",X"B9",X"A6",X"93",X"75",X"52",X"32",X"1C", + X"11",X"0C",X"14",X"2C",X"5A",X"8B",X"BE",X"DC",X"E1",X"D9",X"C6",X"AE",X"9E",X"98",X"8B",X"75", + X"55",X"32",X"1C",X"11",X"11",X"24",X"52",X"88",X"B6",X"D9",X"E4",X"CE",X"BE",X"AE",X"98",X"7D", + X"68",X"65",X"68",X"75",X"78",X"7D",X"70",X"52",X"2F",X"09",X"01",X"01",X"01",X"11",X"2F",X"47", + X"5A",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC",X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E", + X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E",X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52", + X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01",X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3", + X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB",X"93",X"78",X"65",X"62",X"68",X"70",X"80", + X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70",X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3", + X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88",X"7D",X"62",X"47",X"2C",X"0C",X"01",X"01", + X"01",X"01",X"01",X"14",X"3A",X"65",X"7D",X"98",X"A3",X"A3",X"98",X"9B",X"9E",X"9E",X"A6",X"AB", + X"AB",X"B6",X"C6",X"D4",X"CE",X"BE",X"AB",X"90",X"78",X"68",X"5A",X"47",X"32",X"27",X"1F",X"24", + X"3A",X"62",X"80",X"9E",X"B9",X"CE",X"D4",X"E9",X"EC",X"E1",X"D1",X"D1",X"CE",X"C6",X"A6",X"80", + X"55",X"2F",X"17",X"04",X"11",X"2F",X"62",X"83",X"9B",X"A6",X"AB",X"9B",X"90",X"8B",X"88",X"78", + X"70",X"65",X"5A",X"65",X"88",X"A6",X"CE",X"EF",X"FC",X"FC",X"E1",X"B6",X"9E",X"88",X"68",X"52", + X"4A",X"47",X"3F",X"37",X"3A",X"47",X"47",X"3A",X"2F",X"2F",X"4A",X"68",X"80",X"83",X"75",X"65", + X"65",X"65",X"68",X"75",X"7D",X"88",X"9E",X"AB",X"AB",X"98",X"80",X"78",X"7D",X"80",X"8B",X"9E", + X"9E",X"9B",X"9E",X"AE",X"BE",X"C1",X"B3",X"A6",X"A3",X"A6",X"AB",X"9B",X"83",X"68",X"52",X"42", + X"3F",X"52",X"68",X"80",X"93",X"A3",X"A6",X"B3",X"A6",X"93",X"88",X"88",X"93",X"90",X"83",X"68", + X"4D",X"37",X"2C",X"2F",X"47",X"68",X"90",X"AB",X"AE",X"A6",X"A6",X"9B",X"88",X"75",X"68",X"62", + X"52",X"42",X"32",X"27",X"11",X"01",X"01",X"11",X"27",X"3F",X"5A",X"65",X"68",X"78",X"8B",X"A6", + X"C1",X"C6",X"B9",X"B3",X"B3",X"AB",X"A3",X"8B",X"68",X"42",X"24",X"11",X"11",X"11",X"27",X"4D", + X"70",X"98",X"B9",X"DC",X"E9",X"E9",X"E1",X"CE",X"AB",X"98",X"90",X"83",X"83",X"93",X"A3",X"B6", + X"AE",X"A3",X"90",X"78",X"5D",X"4A",X"4D",X"62",X"78",X"83",X"80",X"80",X"83",X"7D",X"68",X"52", + X"37",X"1F",X"1F",X"2F",X"47",X"55",X"65",X"7D",X"90",X"93",X"98",X"A3",X"AE",X"B3",X"B9",X"B6", + X"B6",X"C1",X"C6",X"B9",X"A6",X"8B",X"80",X"70",X"65",X"52",X"4A",X"52",X"62",X"65",X"68",X"7D", + X"90",X"AB",X"C6",X"D1",X"CE",X"AE",X"88",X"68",X"65",X"62",X"52",X"52",X"4D",X"3F",X"2F",X"27", + X"27",X"3A",X"62",X"83",X"9E",X"B3",X"A6",X"9E",X"93",X"90",X"8B",X"7D",X"68",X"62",X"65",X"65", + X"65",X"55",X"3F",X"27",X"14",X"11",X"14",X"1C",X"2F",X"4A",X"62",X"78",X"98",X"B6",X"D1",X"E4", + X"E4",X"E1",X"E4",X"F7",X"FC",X"F7",X"E4",X"D1",X"BE",X"AB",X"98",X"83",X"8B",X"98",X"93",X"90", + X"93",X"90",X"83",X"78",X"70",X"6D",X"62",X"4A",X"2C",X"17",X"14",X"1C",X"27",X"3F",X"4D",X"5D", + X"68",X"68",X"68",X"68",X"75",X"8B",X"9E",X"A6",X"9E",X"9B",X"98",X"98",X"93",X"80",X"70",X"62", + X"52",X"4A",X"42",X"3A",X"2F",X"27",X"2C",X"2F",X"3F",X"5D",X"80",X"90",X"9B",X"A3",X"AE",X"C9", + X"E1",X"E4",X"DC",X"CE",X"C9",X"CE",X"C6",X"B3",X"98",X"8B",X"83",X"75",X"68",X"6D",X"7D",X"90", + X"A3",X"B3",X"B9",X"AE",X"98",X"7D",X"70",X"62",X"4A",X"2F",X"17",X"11",X"17",X"24",X"37",X"52", + X"62",X"75",X"80",X"80",X"80",X"88",X"8B",X"8B",X"98",X"9B",X"9E",X"AB",X"B6",X"AE",X"A3",X"90", + X"83",X"80",X"7D",X"83",X"90",X"90",X"88",X"75",X"62",X"52",X"47",X"42",X"4A",X"5D",X"75",X"8B", + X"A3",X"AB",X"AB",X"A3",X"93",X"98",X"9E",X"AE",X"BE",X"BE",X"AB",X"88",X"68",X"52",X"3A",X"37", + X"47",X"62",X"83",X"98",X"A3",X"9B",X"98",X"98",X"88",X"68",X"52",X"4D",X"52",X"62",X"65",X"62", + X"62",X"5D",X"4A",X"37",X"27",X"2C",X"3F",X"5D",X"6D",X"75",X"75",X"80",X"90",X"A3",X"B3",X"BE", + X"C6",X"C1",X"B9",X"AB",X"9E",X"83",X"68",X"52",X"3F",X"27",X"11",X"0C",X"11",X"1C",X"3F",X"68", + X"9B",X"B6",X"BE",X"B6",X"B3",X"B6",X"BE",X"C9",X"C6",X"AE",X"9B",X"8B",X"80",X"7D",X"83",X"93", + X"A3",X"AE",X"A3",X"9E",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"7D",X"68",X"62",X"5D",X"62",X"5D", + X"52",X"4D",X"5A",X"52",X"52",X"52",X"52",X"52",X"5A",X"5A",X"5A",X"62",X"68",X"78",X"88",X"90", + X"98",X"A6",X"B6",X"B9",X"B6",X"B3",X"B6",X"B9",X"B9",X"B6",X"AE",X"AB",X"93",X"78",X"65",X"4D", + X"32",X"24",X"24",X"32",X"52",X"70",X"83",X"88",X"83",X"7D",X"70",X"65",X"68",X"6D",X"6D",X"6D", + X"68",X"65",X"68",X"68",X"65",X"5D",X"55",X"5D",X"70",X"8B",X"90",X"93",X"8B",X"80",X"7D",X"7D", + X"8B",X"9E",X"A6",X"A3",X"9E",X"9E",X"A3",X"A3",X"98",X"88",X"80",X"75",X"68",X"62",X"55",X"4D", + X"4A",X"4D",X"5D",X"75",X"93",X"AE",X"B6",X"AB",X"93",X"78",X"65",X"52",X"5A",X"5D",X"65",X"78", + X"88",X"88",X"80",X"75",X"70",X"68",X"5D",X"5A",X"5D",X"62",X"68",X"70",X"75",X"78",X"7D",X"7D", + X"80",X"78",X"70",X"65",X"5D",X"52",X"5A",X"70",X"8B",X"A3",X"AE",X"AE",X"A6",X"9B",X"90",X"83", + X"75",X"68",X"55",X"4D",X"4A",X"4A",X"4D",X"5A",X"78",X"93",X"B9",X"D4",X"E4",X"E1",X"CE",X"BE", + X"AE",X"9B",X"88",X"78",X"78",X"78",X"78",X"68",X"62",X"55",X"4D",X"3A",X"32",X"3A",X"4D",X"68", + X"7D",X"80",X"7D",X"78",X"75",X"7D",X"88",X"98",X"A3",X"AE",X"AE",X"AB",X"AE",X"B6",X"C6",X"D1", + X"D4",X"D4",X"C6",X"AB",X"98",X"83",X"78",X"65",X"4D",X"3F",X"3F",X"3F",X"4A",X"5A",X"68",X"70", + X"68",X"68",X"70",X"80",X"8B",X"93",X"8B",X"7D",X"70",X"6D",X"68",X"70",X"75",X"75",X"78",X"78", + X"75",X"68",X"65",X"62",X"6D",X"83",X"98",X"AE",X"B6",X"A6",X"98",X"90",X"80",X"75",X"68",X"5D", + X"62",X"68",X"80",X"93",X"9B",X"93",X"90",X"80",X"6D",X"5A",X"4A",X"42",X"47",X"52",X"5D",X"6D", + X"83",X"90",X"90",X"83",X"80",X"80",X"75",X"75",X"70",X"68",X"65",X"5A",X"52",X"4D",X"52",X"65", + X"7D",X"98",X"A6",X"AB",X"AB",X"A6",X"9E",X"9B",X"90",X"80",X"75",X"6D",X"65",X"52",X"52",X"52", + X"52",X"4D",X"42",X"3F",X"47",X"4A",X"55",X"5D",X"62",X"62",X"62",X"62",X"68",X"7D",X"88",X"93", + X"A3",X"9E",X"A3",X"98",X"90",X"90",X"98",X"A3",X"B6",X"C1",X"BE",X"B6",X"B3",X"AB",X"9B",X"88", + X"75",X"70",X"68",X"65",X"70",X"78",X"7D",X"70",X"68",X"68",X"68",X"68",X"65",X"62",X"5D",X"68", + X"7D",X"90",X"9B",X"9B",X"98",X"98",X"98",X"93",X"98",X"9E",X"9B",X"98",X"93",X"93",X"90",X"83", + X"80",X"80",X"78",X"68",X"62",X"62",X"65",X"75",X"83",X"88",X"8B",X"90",X"8B",X"7D",X"70",X"68", + X"65",X"5D",X"55",X"52",X"4D",X"4A",X"4D",X"5A",X"5D",X"65",X"70",X"80",X"8B",X"93",X"9E",X"9E", + X"9B",X"9E",X"A3",X"9B",X"98",X"90",X"88",X"83",X"83",X"88",X"90",X"A6",X"B9",X"BE",X"C1",X"C6", + X"C6",X"C6",X"B6",X"9B",X"83",X"65",X"52",X"4A",X"4D",X"5D",X"6D",X"80",X"8B",X"93",X"8B",X"80", + X"65",X"5A",X"52",X"52",X"52",X"47",X"3F",X"3A",X"47",X"52",X"5D",X"6D",X"83",X"93",X"9B",X"9E", + X"98",X"8B",X"88",X"80",X"80",X"78",X"6D",X"68",X"68",X"70",X"70",X"68",X"68",X"62",X"5A",X"5A", + X"5D",X"5A",X"5D",X"65",X"70",X"75",X"8B",X"98",X"9B",X"9B",X"9B",X"93",X"88",X"88",X"83",X"88", + X"88",X"93",X"9B",X"98",X"8B",X"80",X"78",X"70",X"68",X"68",X"70",X"80",X"88",X"90",X"93",X"9B", + X"9E",X"98",X"98",X"98",X"98",X"90",X"83",X"78",X"78",X"6D",X"6D",X"78",X"88",X"98",X"A3",X"AB", + X"AB",X"A6",X"98",X"83",X"70",X"52",X"47",X"37",X"32",X"27",X"27",X"37",X"47",X"4D",X"65",X"75", + X"88",X"90",X"98",X"90",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"68",X"62",X"5D",X"4D",X"42", + X"3A",X"3A",X"3F",X"47",X"52",X"5A",X"68",X"78",X"83",X"90",X"A3",X"AE",X"B6",X"B9",X"B6",X"AE", + X"B3",X"B6",X"C1",X"C6",X"BE",X"B9",X"B9",X"AE",X"9B",X"88",X"80",X"75",X"68",X"65",X"65",X"70", + X"78",X"83",X"8B",X"90",X"88",X"7D",X"65",X"5A",X"55",X"5A",X"52",X"4D",X"47",X"42",X"3F",X"47", + X"4A",X"52",X"65",X"7D",X"93",X"9B",X"98",X"93",X"90",X"93",X"9B",X"A6",X"AE",X"AE",X"A6",X"98", + X"8B",X"78",X"68",X"5A",X"52",X"52",X"5A",X"65",X"68",X"75",X"75",X"70",X"70",X"7D",X"80",X"83", + X"83",X"80",X"80",X"80",X"8B",X"98",X"A3",X"A3",X"A6",X"A3",X"9B",X"93",X"90",X"8B",X"88",X"80", + X"78",X"70",X"62",X"5A",X"5A",X"52",X"52",X"55",X"5A",X"62",X"68",X"75",X"70",X"6D",X"65",X"65", + X"68",X"6D",X"70",X"70",X"70",X"75",X"75",X"7D",X"83",X"88",X"93",X"9B",X"A3",X"A3",X"A6",X"A6", + X"A3",X"9E",X"93",X"88",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"7D",X"70",X"68",X"62", + X"62",X"68",X"70",X"78",X"7D",X"7D",X"78",X"75",X"68",X"68",X"62",X"62",X"68",X"78",X"78",X"7D", + X"75",X"68",X"6D",X"6D",X"70",X"75",X"7D",X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"80",X"83", + X"88",X"8B",X"88",X"83",X"80",X"80",X"83",X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D", + X"75",X"6D",X"68",X"75",X"80",X"83",X"88",X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"75",X"68",X"5D",X"52",X"4A",X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B", + X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B",X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62", + X"65",X"70",X"78",X"7D",X"80",X"88",X"8B",X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90", + X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"7D",X"78",X"78",X"75",X"70",X"70",X"6D",X"68",X"6D",X"70",X"78",X"80", + X"80",X"80",X"83",X"88",X"90",X"8B",X"8B",X"8B",X"88",X"80",X"7D",X"78",X"70",X"68",X"68",X"68", + X"68",X"6D",X"6D",X"70",X"78",X"7D",X"83",X"8B",X"8B",X"90",X"8B",X"88",X"88",X"88",X"88",X"83", + X"80",X"80",X"83",X"80",X"80",X"7D",X"83",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"78",X"78", + X"75",X"70",X"70",X"70",X"75",X"78",X"78",X"78",X"75",X"75",X"70",X"70",X"75",X"78",X"75",X"75", + X"75",X"75",X"78",X"7D",X"80",X"7D",X"7D",X"7D",X"83",X"88",X"8B",X"88",X"88",X"88",X"88",X"88", + X"8B",X"90",X"90",X"88",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"7D",X"7D",X"80",X"7D",X"78", + X"75",X"70",X"70",X"78",X"80",X"88",X"88",X"88",X"88",X"83",X"7D",X"78",X"78",X"80",X"83",X"83", + X"83",X"80",X"78",X"75",X"75",X"75",X"78",X"80",X"80",X"83",X"83",X"80",X"7D",X"78",X"6D",X"68", + X"65",X"62",X"5D",X"5A",X"62",X"65",X"68",X"75",X"80",X"8B",X"90",X"93",X"90",X"88",X"83",X"80", + X"78",X"75",X"75",X"70",X"68",X"65",X"5D",X"5D",X"55",X"5A",X"5D",X"65",X"68",X"75",X"75",X"80", + X"83",X"8B",X"90",X"9B",X"A3",X"A6",X"A6",X"9E",X"9B",X"98",X"98",X"9E",X"9E",X"A3",X"A3",X"A6", + X"A3",X"9B",X"8B",X"88",X"7D",X"75",X"6D",X"68",X"6D",X"75",X"7D",X"7D",X"83",X"83",X"80",X"75", + X"6D",X"68",X"68",X"68",X"65",X"62",X"5D",X"5A",X"5A",X"5D",X"62",X"68",X"78",X"80",X"83",X"80", + X"7D",X"80",X"83",X"8B",X"98",X"9B",X"9B",X"98",X"90",X"8B",X"7D",X"70",X"68",X"62",X"65",X"68", + X"70",X"78",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"7D",X"7D",X"7D",X"83",X"90",X"98", + X"9B",X"9E",X"9B",X"98",X"90",X"8B",X"83",X"83",X"7D",X"75",X"70",X"65",X"5D",X"5D",X"5A",X"5D", + X"62",X"65",X"68",X"75",X"75",X"75",X"75",X"68",X"6D",X"6D",X"70",X"70",X"75",X"70",X"75",X"75", + X"78",X"7D",X"83",X"90",X"98",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"88",X"83",X"7D",X"7D", + X"7D",X"80",X"83",X"80",X"80",X"7D",X"75",X"68",X"65",X"65",X"68",X"75",X"78",X"7D",X"78",X"78", + X"78",X"6D",X"68",X"65",X"68",X"6D",X"78",X"7D",X"7D",X"75",X"6D",X"6D",X"70",X"75",X"78",X"80", + X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"83",X"83",X"88",X"8B",X"88",X"83",X"80",X"80",X"83", + X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D",X"75",X"6D",X"68",X"75",X"80",X"83",X"88", + X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D",X"80",X"80",X"75",X"68",X"5D",X"52",X"4A", + X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B",X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B", + X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62",X"65",X"70",X"78",X"7D",X"80",X"88",X"8B", + X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90",X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D", + X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"75", + X"75",X"70",X"75",X"6D",X"68",X"6D",X"70",X"78",X"80",X"83",X"80",X"83",X"88",X"90",X"8B",X"8B", + X"88",X"83",X"7D",X"78",X"75",X"6D",X"68",X"68",X"68",X"65",X"68",X"68",X"68",X"70",X"75",X"7D", + X"88",X"83",X"88",X"88",X"80",X"83",X"83",X"88",X"8B",X"88",X"88",X"88",X"83",X"80",X"7D",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"7D",X"75",X"75",X"75",X"75",X"70", + X"70",X"68",X"68",X"68",X"68",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"83",X"83",X"83",X"88", + X"88",X"90",X"98",X"98",X"93",X"90",X"90",X"8B",X"88",X"88",X"8B",X"88",X"80",X"78",X"78",X"75", + X"70",X"68",X"68",X"65",X"68",X"70",X"78",X"78",X"78",X"75",X"75",X"70",X"78",X"80",X"83",X"83", + X"80",X"7D",X"70",X"68",X"65",X"68",X"70",X"7D",X"83",X"83",X"83",X"80",X"75",X"70",X"68",X"65", + X"65",X"65",X"68",X"6D",X"70",X"78",X"7D",X"7D",X"7D",X"83",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"80",X"83",X"8B",X"90",X"93",X"93",X"8B",X"83",X"7D",X"78",X"70",X"6D",X"68",X"65",X"65",X"62", + X"65",X"68",X"70",X"7D",X"88",X"88",X"93",X"90",X"90",X"90",X"90",X"93",X"93",X"93",X"98",X"90", + X"88",X"80",X"78",X"78",X"75",X"78",X"80",X"88",X"90",X"90",X"93",X"8B",X"8B",X"88",X"7D",X"78", + X"6D",X"65",X"65",X"68",X"6D",X"75",X"80",X"83",X"88",X"88",X"88",X"83",X"83",X"83",X"83",X"80", + X"7D",X"80",X"7D",X"75",X"6D",X"68",X"5D",X"55",X"52",X"52",X"62",X"68",X"70",X"75",X"75",X"75", + X"78",X"7D",X"83",X"80",X"83",X"83",X"83",X"83",X"88",X"8B",X"90",X"98",X"98",X"9B",X"9B",X"93", + X"8B",X"83",X"7D",X"78",X"78",X"70",X"75",X"7D",X"80",X"80",X"83",X"80",X"80",X"75",X"70",X"68", + X"68",X"68",X"65",X"68",X"68",X"65",X"68",X"70",X"78",X"7D",X"88",X"88",X"88",X"83",X"83",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75", + X"75",X"7D",X"83",X"83",X"88",X"83",X"88",X"83",X"88",X"83",X"83",X"8B",X"88",X"8B",X"88",X"88", + X"80",X"7D",X"7D",X"75",X"6D",X"68",X"6D",X"70",X"7D",X"80",X"7D",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80", + X"83",X"83",X"80",X"80",X"7D",X"78",X"75",X"70",X"68",X"6D",X"75",X"78",X"7D",X"80",X"80",X"80", + X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"88",X"88",X"8B",X"8B",X"8B", + X"8B",X"88",X"83",X"83",X"80",X"78",X"75",X"75",X"70",X"70",X"75",X"75",X"80",X"83",X"80",X"83", + X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70", + X"75",X"75",X"78",X"7D",X"7D",X"80",X"80",X"83",X"83",X"83",X"83",X"88",X"83",X"83",X"83",X"88", + X"83",X"83",X"88",X"8B",X"88",X"88",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"80",X"80",X"80", + X"83",X"83",X"83",X"7D",X"7D",X"75",X"75",X"75",X"75",X"75",X"70",X"75",X"75",X"75",X"78",X"83", + X"80",X"83",X"80",X"7D",X"80",X"78",X"78",X"80",X"80",X"80",X"7D",X"80",X"80",X"80",X"7D",X"75", + X"70",X"68",X"68",X"68",X"68",X"68",X"70",X"75",X"7D",X"83",X"8B",X"90",X"90",X"8B",X"83",X"80", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70",X"75",X"75", + X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"7D",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"83",X"83", + X"8B",X"8B",X"8B",X"88",X"83",X"83",X"80",X"83",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"7D",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78", + X"78",X"78",X"78",X"78",X"7D",X"80",X"78",X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D", + X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"78",X"7D",X"78",X"7D",X"80",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80", + X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"78",X"80", + X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"75",X"75",X"83",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"88",X"83", + X"80",X"80",X"7D",X"78",X"75",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"75",X"75",X"78", + X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"78",X"78",X"78",X"75",X"75",X"75",X"70",X"75",X"75",X"7D",X"7D",X"80",X"80",X"80", + X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"78",X"78",X"7D", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"78", + X"78",X"78",X"78",X"78",X"78",X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83", + X"83",X"83",X"88",X"83",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"7D",X"78",X"78",X"78",X"75",X"75", + X"75",X"78",X"7D",X"78",X"83",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"78",X"78",X"78",X"78",X"75",X"75",X"75",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80", + X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"78", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"80",X"83",X"83",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"78",X"78",X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D",X"78",X"78",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"83",X"80",X"80",X"83",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"7D",X"80",X"80",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"7D",X"78",X"78",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..8b3669d9 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,2077 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity ROM_PGM_0 is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(13 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of ROM_PGM_0 is + + + type ROM_ARRAY is array(0 to 16383) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"C3",x"16",x"0A",x"FF",x"FF",x"FF",x"FF",x"2F", -- 0x0000 + x"47",x"7E",x"70",x"2F",x"B0",x"2F",x"12",x"13", -- 0x0008 + x"23",x"C9",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0010 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0018 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0020 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0028 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0030 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0038 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0040 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0048 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0050 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0058 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"E5",x"F5", -- 0x0060 + x"21",x"13",x"40",x"34",x"AF",x"32",x"01",x"70", -- 0x0068 + x"3E",x"01",x"32",x"01",x"70",x"3A",x"00",x"78", -- 0x0070 + x"F1",x"E1",x"C9",x"F5",x"C5",x"D5",x"E5",x"DD", -- 0x0078 + x"E5",x"FD",x"E5",x"3A",x"00",x"78",x"CD",x"D3", -- 0x0080 + x"08",x"AF",x"32",x"01",x"70",x"21",x"14",x"40", -- 0x0088 + x"34",x"CB",x"5E",x"28",x"03",x"32",x"03",x"60", -- 0x0090 + x"3E",x"01",x"32",x"01",x"70",x"32",x"04",x"70", -- 0x0098 + x"21",x"13",x"40",x"7E",x"BE",x"28",x"FD",x"3A", -- 0x00A0 + x"05",x"40",x"32",x"06",x"70",x"32",x"07",x"70", -- 0x00A8 + x"06",x"08",x"DD",x"21",x"3B",x"40",x"FD",x"21", -- 0x00B0 + x"40",x"58",x"DD",x"7E",x"00",x"FD",x"77",x"00", -- 0x00B8 + x"DD",x"7E",x"01",x"FD",x"77",x"03",x"DD",x"7E", -- 0x00C0 + x"04",x"FD",x"77",x"02",x"DD",x"7E",x"05",x"FD", -- 0x00C8 + x"77",x"01",x"11",x"04",x"00",x"FD",x"19",x"11", -- 0x00D0 + x"0A",x"00",x"DD",x"19",x"10",x"DC",x"06",x"08", -- 0x00D8 + x"DD",x"21",x"CF",x"40",x"FD",x"21",x"60",x"58", -- 0x00E0 + x"CD",x"88",x"06",x"E6",x"01",x"DD",x"86",x"00", -- 0x00E8 + x"C6",x"08",x"FD",x"77",x"01",x"DD",x"7E",x"01", -- 0x00F0 + x"21",x"05",x"40",x"CB",x"46",x"20",x"04",x"C6", -- 0x00F8 + x"10",x"ED",x"44",x"FD",x"77",x"03",x"11",x"05", -- 0x0100 + x"00",x"DD",x"19",x"11",x"04",x"00",x"FD",x"19", -- 0x0108 + x"10",x"D6",x"21",x"8F",x"40",x"11",x"00",x"58", -- 0x0110 + x"01",x"40",x"00",x"ED",x"B0",x"3A",x"15",x"40", -- 0x0118 + x"FE",x"FA",x"38",x"23",x"3A",x"44",x"52",x"FE", -- 0x0120 + x"2B",x"20",x"1C",x"DD",x"21",x"31",x"52",x"3E", -- 0x0128 + x"27",x"DD",x"96",x"64",x"D6",x"0A",x"28",x"0F", -- 0x0130 + x"DD",x"21",x"7F",x"40",x"3E",x"FA",x"C6",x"1B", -- 0x0138 + x"DD",x"77",x"9C",x"AF",x"32",x"15",x"40",x"21", -- 0x0140 + x"06",x"40",x"11",x"09",x"40",x"3A",x"00",x"60", -- 0x0148 + x"CD",x"07",x"00",x"3A",x"00",x"68",x"CD",x"07", -- 0x0150 + x"00",x"0E",x"00",x"DD",x"21",x"63",x"10",x"CD", -- 0x0158 + x"C4",x"0F",x"20",x"06",x"0C",x"CD",x"C4",x"0F", -- 0x0160 + x"28",x"2E",x"3E",x"01",x"32",x"03",x"60",x"32", -- 0x0168 + x"14",x"40",x"3A",x"00",x"68",x"07",x"07",x"07", -- 0x0170 + x"E6",x"06",x"81",x"87",x"6F",x"26",x"00",x"11", -- 0x0178 + x"6B",x"10",x"19",x"3A",x"1C",x"40",x"86",x"27", -- 0x0180 + x"32",x"1C",x"40",x"23",x"3A",x"1B",x"40",x"8E", -- 0x0188 + x"27",x"30",x"02",x"3E",x"99",x"32",x"1B",x"40", -- 0x0190 + x"FD",x"E1",x"DD",x"E1",x"E1",x"D1",x"C1",x"F1", -- 0x0198 + x"C9",x"21",x"00",x"40",x"11",x"01",x"40",x"01", -- 0x01A0 + x"4E",x"01",x"36",x"00",x"ED",x"B0",x"C9",x"21", -- 0x01A8 + x"3B",x"40",x"11",x"3C",x"40",x"01",x"13",x"01", -- 0x01B0 + x"36",x"00",x"ED",x"B0",x"C9",x"CD",x"7B",x"00", -- 0x01B8 + x"21",x"00",x"50",x"11",x"01",x"50",x"01",x"FF", -- 0x01C0 + x"03",x"36",x"10",x"ED",x"B0",x"CD",x"AF",x"01", -- 0x01C8 + x"21",x"8F",x"40",x"06",x"20",x"23",x"70",x"23", -- 0x01D0 + x"10",x"FB",x"21",x"15",x"40",x"34",x"CD",x"7B", -- 0x01D8 + x"00",x"CD",x"7F",x"08",x"AF",x"32",x"3F",x"41", -- 0x01E0 + x"CD",x"8C",x"09",x"3D",x"32",x"00",x"78",x"C9", -- 0x01E8 + x"DD",x"6E",x"00",x"DD",x"66",x"01",x"DD",x"23", -- 0x01F0 + x"DD",x"23",x"7D",x"3C",x"C8",x"11",x"E0",x"FF", -- 0x01F8 + x"DD",x"7E",x"00",x"DD",x"23",x"FE",x"24",x"28", -- 0x0200 + x"E7",x"CB",x"7F",x"20",x"06",x"D6",x"30",x"77", -- 0x0208 + x"19",x"18",x"ED",x"DD",x"7E",x"FF",x"87",x"87", -- 0x0210 + x"CD",x"61",x"06",x"19",x"18",x"F2",x"DD",x"21", -- 0x0218 + x"CF",x"40",x"06",x"08",x"DD",x"7E",x"00",x"B7", -- 0x0220 + x"28",x"77",x"DD",x"7E",x"04",x"32",x"0C",x"40", -- 0x0228 + x"DD",x"7E",x"00",x"DD",x"86",x"02",x"DD",x"77", -- 0x0230 + x"00",x"E6",x"F8",x"20",x"06",x"DD",x"36",x"00", -- 0x0238 + x"00",x"18",x"5E",x"DD",x"7E",x"01",x"DD",x"86", -- 0x0240 + x"03",x"DD",x"77",x"01",x"2F",x"E6",x"F0",x"28", -- 0x0248 + x"EC",x"DD",x"6E",x"00",x"DD",x"66",x"01",x"DD", -- 0x0250 + x"E5",x"C5",x"0E",x"00",x"DD",x"7E",x"04",x"B7", -- 0x0258 + x"28",x"02",x"0E",x"80",x"CD",x"17",x"05",x"C1", -- 0x0260 + x"DD",x"E1",x"C2",x"3D",x"02",x"3A",x"00",x"40", -- 0x0268 + x"E6",x"01",x"20",x"2D",x"DD",x"56",x"01",x"DD", -- 0x0270 + x"5E",x"00",x"CD",x"BF",x"05",x"28",x"22",x"E6", -- 0x0278 + x"FC",x"FE",x"60",x"28",x"0F",x"FE",x"70",x"28", -- 0x0280 + x"0B",x"FE",x"64",x"28",x"07",x"3E",x"07",x"CD", -- 0x0288 + x"DE",x"06",x"18",x"A9",x"7E",x"CD",x"B3",x"02", -- 0x0290 + x"18",x"A3",x"C0",x"CD",x"88",x"06",x"E6",x"01", -- 0x0298 + x"C9",x"11",x"05",x"00",x"DD",x"19",x"05",x"C2", -- 0x02A0 + x"24",x"02",x"C9",x"00",x"00",x"FF",x"FF",x"E0", -- 0x02A8 + x"FF",x"DF",x"FF",x"F5",x"E6",x"03",x"87",x"E5", -- 0x02B0 + x"5F",x"16",x"00",x"21",x"AB",x"02",x"19",x"5E", -- 0x02B8 + x"23",x"56",x"E1",x"19",x"7D",x"E6",x"1F",x"FE", -- 0x02C0 + x"1C",x"30",x"2E",x"3E",x"E0",x"CD",x"61",x"06", -- 0x02C8 + x"DD",x"E5",x"CD",x"FB",x"02",x"20",x"06",x"DD", -- 0x02D0 + x"75",x"00",x"DD",x"74",x"01",x"DD",x"E1",x"F1", -- 0x02D8 + x"0E",x"03",x"E6",x"FC",x"FE",x"60",x"28",x"07", -- 0x02E0 + x"0C",x"FE",x"70",x"28",x"02",x"0E",x"03",x"79", -- 0x02E8 + x"CD",x"A8",x"09",x"3E",x"15",x"CD",x"DE",x"06", -- 0x02F0 + x"C9",x"F1",x"C9",x"DD",x"21",x"F7",x"40",x"DD", -- 0x02F8 + x"7E",x"01",x"3C",x"C8",x"3C",x"DD",x"23",x"DD", -- 0x0300 + x"23",x"20",x"F4",x"F6",x"01",x"C9",x"21",x"DD", -- 0x0308 + x"21",x"3B",x"40",x"06",x"08",x"AF",x"32",x"28", -- 0x0310 + x"40",x"DD",x"7E",x"00",x"E6",x"FC",x"20",x"0B", -- 0x0318 + x"DD",x"36",x"01",x"00",x"DD",x"36",x"07",x"03", -- 0x0320 + x"C3",x"6A",x"03",x"3A",x"00",x"40",x"DD",x"A6", -- 0x0328 + x"09",x"C2",x"6A",x"03",x"DD",x"7E",x"08",x"B7", -- 0x0330 + x"20",x"24",x"DD",x"7E",x"00",x"DD",x"86",x"02", -- 0x0338 + x"DD",x"77",x"00",x"E6",x"F8",x"20",x"07",x"DD", -- 0x0340 + x"36",x"00",x"00",x"C3",x"6A",x"03",x"DD",x"7E", -- 0x0348 + x"01",x"DD",x"86",x"03",x"DD",x"77",x"01",x"C6", -- 0x0350 + x"18",x"E6",x"E0",x"CA",x"47",x"03",x"DD",x"7E", -- 0x0358 + x"07",x"C5",x"DD",x"E5",x"CD",x"80",x"03",x"DD", -- 0x0360 + x"E1",x"C1",x"21",x"28",x"40",x"DD",x"7E",x"07", -- 0x0368 + x"FE",x"02",x"20",x"01",x"34",x"11",x"0A",x"00", -- 0x0370 + x"DD",x"19",x"05",x"C2",x"19",x"03",x"C9",x"31", -- 0x0378 + x"B7",x"CA",x"8F",x"03",x"FE",x"01",x"CA",x"DE", -- 0x0380 + x"03",x"FE",x"02",x"CA",x"05",x"04",x"C9",x"DD", -- 0x0388 + x"7E",x"05",x"FE",x"16",x"C0",x"DD",x"7E",x"02", -- 0x0390 + x"CB",x"2F",x"32",x"D1",x"40",x"32",x"D6",x"40", -- 0x0398 + x"DD",x"7E",x"02",x"B7",x"28",x"0A",x"CB",x"7F", -- 0x03A0 + x"3E",x"1E",x"28",x"1C",x"3E",x"1D",x"18",x"18", -- 0x03A8 + x"CD",x"88",x"06",x"CB",x"57",x"28",x"14",x"CB", -- 0x03B0 + x"4F",x"3E",x"17",x"28",x"0B",x"CD",x"88",x"06", -- 0x03B8 + x"CB",x"47",x"3E",x"1D",x"28",x"02",x"3E",x"1E", -- 0x03C0 + x"DD",x"77",x"0F",x"ED",x"5B",x"3B",x"40",x"CD", -- 0x03C8 + x"BF",x"05",x"C8",x"CD",x"75",x"05",x"DD",x"21", -- 0x03D0 + x"45",x"40",x"CD",x"75",x"05",x"C9",x"CD",x"88", -- 0x03D8 + x"06",x"E6",x"C0",x"DD",x"B6",x"05",x"DD",x"77", -- 0x03E0 + x"05",x"CD",x"88",x"06",x"DD",x"77",x"04",x"CD", -- 0x03E8 + x"88",x"06",x"E6",x"0F",x"C0",x"DD",x"34",x"05", -- 0x03F0 + x"DD",x"7E",x"05",x"E6",x"3F",x"FE",x"3C",x"C0", -- 0x03F8 + x"DD",x"36",x"00",x"00",x"C9",x"3A",x"00",x"40", -- 0x0400 + x"E6",x"07",x"20",x"26",x"3A",x"3B",x"40",x"DD", -- 0x0408 + x"BE",x"00",x"0E",x"FF",x"38",x"02",x"0E",x"01", -- 0x0410 + x"C6",x"20",x"E6",x"C0",x"20",x"02",x"0E",x"00", -- 0x0418 + x"DD",x"7E",x"02",x"81",x"4F",x"CB",x"7F",x"28", -- 0x0420 + x"02",x"ED",x"44",x"FE",x"04",x"28",x"03",x"DD", -- 0x0428 + x"71",x"02",x"CD",x"88",x"06",x"E6",x"03",x"20", -- 0x0430 + x"03",x"DD",x"34",x"01",x"CD",x"88",x"06",x"E6", -- 0x0438 + x"0F",x"20",x"11",x"DD",x"7E",x"03",x"FE",x"01", -- 0x0440 + x"20",x"07",x"CD",x"88",x"06",x"E6",x"0F",x"20", -- 0x0448 + x"03",x"DD",x"34",x"03",x"CD",x"9F",x"04",x"DD", -- 0x0450 + x"5E",x"00",x"DD",x"56",x"01",x"CD",x"BF",x"05", -- 0x0458 + x"C4",x"75",x"05",x"CD",x"88",x"06",x"E6",x"1F", -- 0x0460 + x"C0",x"3A",x"21",x"40",x"CB",x"5F",x"C8",x"DD", -- 0x0468 + x"5E",x"00",x"DD",x"7E",x"01",x"C6",x"10",x"57", -- 0x0470 + x"D5",x"DD",x"21",x"E3",x"40",x"06",x"06",x"11", -- 0x0478 + x"05",x"00",x"CD",x"DF",x"04",x"D1",x"C0",x"DD", -- 0x0480 + x"73",x"00",x"DD",x"72",x"01",x"DD",x"36",x"02", -- 0x0488 + x"00",x"DD",x"36",x"03",x"03",x"DD",x"36",x"04", -- 0x0490 + x"00",x"3E",x"20",x"CD",x"DE",x"06",x"C9",x"C5", -- 0x0498 + x"DD",x"5E",x"00",x"DD",x"56",x"01",x"7B",x"D6", -- 0x04A0 + x"0A",x"5F",x"D5",x"CD",x"C3",x"04",x"0E",x"02", -- 0x04A8 + x"D1",x"20",x"0B",x"7B",x"C6",x"14",x"5F",x"CD", -- 0x04B0 + x"C3",x"04",x"28",x"05",x"0E",x"FE",x"DD",x"71", -- 0x04B8 + x"02",x"C1",x"C9",x"06",x"07",x"7A",x"C6",x"12", -- 0x04C0 + x"7A",x"D6",x"06",x"57",x"C5",x"CD",x"BF",x"05", -- 0x04C8 + x"C1",x"C0",x"10",x"F4",x"AF",x"C9",x"11",x"05", -- 0x04D0 + x"00",x"06",x"08",x"DD",x"21",x"CF",x"40",x"DD", -- 0x04D8 + x"7E",x"00",x"B7",x"C8",x"DD",x"19",x"10",x"F7", -- 0x04E0 + x"F6",x"01",x"C9",x"11",x"0A",x"00",x"06",x"06", -- 0x04E8 + x"DD",x"21",x"4F",x"40",x"18",x"E9",x"DD",x"75", -- 0x04F0 + x"00",x"DD",x"74",x"01",x"DD",x"73",x"02",x"DD", -- 0x04F8 + x"72",x"03",x"DD",x"71",x"04",x"DD",x"70",x"05", -- 0x0500 + x"D9",x"DD",x"75",x"06",x"DD",x"74",x"07",x"DD", -- 0x0508 + x"73",x"08",x"DD",x"72",x"09",x"D9",x"C9",x"C5", -- 0x0510 + x"DD",x"E5",x"CB",x"81",x"06",x"08",x"DD",x"21", -- 0x0518 + x"3B",x"40",x"CB",x"79",x"20",x"07",x"DD",x"7E", -- 0x0520 + x"07",x"FE",x"02",x"28",x"0A",x"CD",x"9E",x"05", -- 0x0528 + x"20",x"05",x"CB",x"C1",x"CD",x"75",x"05",x"11", -- 0x0530 + x"0A",x"00",x"DD",x"19",x"10",x"E4",x"79",x"E6", -- 0x0538 + x"01",x"DD",x"E1",x"C1",x"C9",x"D5",x"7A",x"C6", -- 0x0540 + x"08",x"1F",x"1F",x"E6",x"3E",x"5F",x"16",x"00", -- 0x0548 + x"21",x"8F",x"40",x"19",x"7E",x"ED",x"44",x"D1", -- 0x0550 + x"D5",x"83",x"C6",x"08",x"ED",x"44",x"E6",x"F8", -- 0x0558 + x"6F",x"26",x"00",x"29",x"29",x"7A",x"C6",x"08", -- 0x0560 + x"5F",x"CB",x"3B",x"CB",x"3B",x"CB",x"3B",x"16", -- 0x0568 + x"50",x"19",x"7E",x"D1",x"C9",x"F5",x"C5",x"DD", -- 0x0570 + x"36",x"03",x"00",x"DD",x"7E",x"05",x"DD",x"36", -- 0x0578 + x"05",x"38",x"DD",x"36",x"07",x"01",x"0E",x"05", -- 0x0580 + x"FE",x"15",x"28",x"02",x"0E",x"04",x"79",x"CD", -- 0x0588 + x"A8",x"09",x"3E",x"15",x"CD",x"DE",x"06",x"AF", -- 0x0590 + x"32",x"0C",x"40",x"C1",x"F1",x"C9",x"DD",x"7E", -- 0x0598 + x"00",x"B7",x"28",x"18",x"95",x"C6",x"08",x"E6", -- 0x05A0 + x"F0",x"C0",x"DD",x"7E",x"01",x"94",x"C6",x"08", -- 0x05A8 + x"E6",x"F0",x"C0",x"DD",x"7E",x"07",x"FE",x"01", -- 0x05B0 + x"28",x"02",x"BF",x"C9",x"F6",x"FF",x"C9",x"CD", -- 0x05B8 + x"45",x"05",x"7E",x"FE",x"10",x"C8",x"FE",x"0C", -- 0x05C0 + x"C8",x"E6",x"FD",x"FE",x"34",x"7E",x"C8",x"E6", -- 0x05C8 + x"F0",x"FE",x"E0",x"7E",x"C9",x"01",x"01",x"01", -- 0x05D0 + x"18",x"03",x"01",x"06",x"04",x"7E",x"1F",x"1F", -- 0x05D8 + x"1F",x"1F",x"CD",x"ED",x"05",x"7E",x"CD",x"ED", -- 0x05E0 + x"05",x"23",x"10",x"F1",x"C9",x"0D",x"E6",x"0F", -- 0x05E8 + x"20",x"08",x"CB",x"79",x"20",x"04",x"3E",x"10", -- 0x05F0 + x"18",x"02",x"0E",x"FF",x"FD",x"77",x"00",x"11", -- 0x05F8 + x"E0",x"FF",x"FD",x"19",x"C9",x"E5",x"D5",x"C5", -- 0x0600 + x"F5",x"E5",x"87",x"87",x"6F",x"26",x"00",x"11", -- 0x0608 + x"2A",x"06",x"19",x"D1",x"13",x"13",x"13",x"06", -- 0x0610 + x"04",x"AF",x"1A",x"8E",x"27",x"12",x"2B",x"1B", -- 0x0618 + x"10",x"F8",x"F1",x"C1",x"D1",x"E1",x"C9",x"00", -- 0x0620 + x"00",x"00",x"00",x"00",x"00",x"00",x"10",x"00", -- 0x0628 + x"00",x"01",x"03",x"00",x"00",x"03",x"45",x"00", -- 0x0630 + x"00",x"05",x"34",x"00",x"00",x"09",x"25",x"00", -- 0x0638 + x"00",x"16",x"22",x"11",x"FF",x"FF",x"B7",x"ED", -- 0x0640 + x"5A",x"20",x"F8",x"21",x"00",x"40",x"34",x"C9", -- 0x0648 + x"3A",x"0D",x"40",x"DD",x"86",x"00",x"DD",x"77", -- 0x0650 + x"00",x"E6",x"F8",x"C0",x"DD",x"36",x"00",x"00", -- 0x0658 + x"C9",x"F5",x"E5",x"77",x"23",x"3C",x"77",x"D5", -- 0x0660 + x"11",x"1F",x"00",x"19",x"3C",x"77",x"3C",x"23", -- 0x0668 + x"77",x"D1",x"E1",x"F1",x"C9",x"F5",x"E5",x"D5", -- 0x0670 + x"36",x"10",x"23",x"36",x"10",x"11",x"1F",x"00", -- 0x0678 + x"19",x"36",x"10",x"23",x"36",x"10",x"18",x"E9", -- 0x0680 + x"E5",x"2A",x"01",x"40",x"ED",x"5F",x"8C",x"CE", -- 0x0688 + x"A7",x"67",x"8D",x"88",x"CE",x"86",x"6F",x"22", -- 0x0690 + x"01",x"40",x"E1",x"C9",x"CD",x"7B",x"00",x"21", -- 0x0698 + x"83",x"10",x"0E",x"AC",x"1E",x"00",x"46",x"04", -- 0x06A0 + x"C8",x"23",x"7E",x"23",x"05",x"32",x"00",x"78", -- 0x06A8 + x"E5",x"1C",x"7B",x"E6",x"03",x"20",x"0C",x"79", -- 0x06B0 + x"E6",x"01",x"32",x"05",x"68",x"CB",x"09",x"AF", -- 0x06B8 + x"32",x"05",x"68",x"21",x"13",x"40",x"7E",x"BE", -- 0x06C0 + x"28",x"FD",x"E1",x"10",x"E3",x"3E",x"FF",x"32", -- 0x06C8 + x"00",x"78",x"3A",x"00",x"78",x"3E",x"05",x"10", -- 0x06D0 + x"FE",x"3D",x"20",x"FB",x"18",x"C8",x"C5",x"4F", -- 0x06D8 + x"3A",x"10",x"40",x"B7",x"79",x"C1",x"C0",x"FD", -- 0x06E0 + x"E5",x"FD",x"21",x"3F",x"41",x"CD",x"F3",x"06", -- 0x06E8 + x"FD",x"E1",x"C9",x"FE",x"20",x"28",x"1D",x"FE", -- 0x06F0 + x"23",x"28",x"22",x"FE",x"06",x"28",x"1E",x"FE", -- 0x06F8 + x"15",x"28",x"23",x"FE",x"21",x"28",x"28",x"FE", -- 0x0700 + x"08",x"28",x"2D",x"FE",x"12",x"28",x"32",x"FE", -- 0x0708 + x"07",x"28",x"3C",x"C9",x"FD",x"CB",x"00",x"D6", -- 0x0710 + x"FD",x"36",x"04",x"78",x"C9",x"FD",x"CB",x"00", -- 0x0718 + x"CE",x"FD",x"36",x"03",x"14",x"C9",x"FD",x"CB", -- 0x0720 + x"00",x"C6",x"FD",x"36",x"02",x"32",x"C9",x"FD", -- 0x0728 + x"CB",x"00",x"E6",x"FD",x"36",x"06",x"64",x"C9", -- 0x0730 + x"FD",x"CB",x"00",x"EE",x"FD",x"36",x"07",x"C8", -- 0x0738 + x"C9",x"FD",x"CB",x"00",x"F6",x"FD",x"36",x"08", -- 0x0740 + x"64",x"3E",x"01",x"CD",x"8C",x"09",x"C9",x"FD", -- 0x0748 + x"CB",x"00",x"FE",x"CD",x"88",x"06",x"E6",x"07", -- 0x0750 + x"C6",x"08",x"FD",x"77",x"09",x"C9",x"F5",x"E5", -- 0x0758 + x"21",x"03",x"40",x"34",x"7E",x"E6",x"3E",x"3C", -- 0x0760 + x"6F",x"26",x"00",x"D5",x"11",x"8F",x"40",x"19", -- 0x0768 + x"D1",x"3A",x"03",x"40",x"E6",x"C0",x"0F",x"0F", -- 0x0770 + x"0F",x"0F",x"0F",x"77",x"E1",x"F1",x"C9",x"45", -- 0x0778 + x"53",x"50",x"52",x"45",x"53",x"53",x"40",x"53", -- 0x0780 + x"54",x"41",x"52",x"54",x"40",x"42",x"55",x"54", -- 0x0788 + x"54",x"4F",x"4E",x"24",x"C8",x"52",x"4F",x"4E", -- 0x0790 + x"45",x"40",x"50",x"4C",x"41",x"59",x"45",x"52", -- 0x0798 + x"24",x"4A",x"52",x"4F",x"4E",x"4C",x"59",x"24", -- 0x07A0 + x"FF",x"FF",x"2A",x"53",x"4F",x"52",x"40",x"54", -- 0x07A8 + x"57",x"4F",x"40",x"50",x"4C",x"41",x"59",x"45", -- 0x07B0 + x"52",x"24",x"FF",x"FF",x"44",x"52",x"5B",x"50", -- 0x07B8 + x"4C",x"41",x"59",x"5B",x"24",x"0C",x"53",x"46", -- 0x07C0 + x"4F",x"52",x"40",x"41",x"4D",x"55",x"53",x"45", -- 0x07C8 + x"4D",x"45",x"4E",x"54",x"40",x"4F",x"4E",x"4C", -- 0x07D0 + x"59",x"24",x"D3",x"52",x"5E",x"40",x"31",x"39", -- 0x07D8 + x"38",x"32",x"24",x"D5",x"52",x"4D",x"54",x"4D", -- 0x07E0 + x"40",x"47",x"41",x"4D",x"45",x"53",x"24",x"FF", -- 0x07E8 + x"FF",x"43",x"41",x"54",x"41",x"43",x"4F",x"4D", -- 0x07F0 + x"42",x"C9",x"C4",x"52",x"53",x"43",x"4F",x"52", -- 0x07F8 + x"45",x"40",x"54",x"41",x"42",x"4C",x"45",x"5B", -- 0x0800 + x"24",x"C8",x"52",x"95",x"40",x"3C",x"3C",x"3C", -- 0x0808 + x"40",x"39",x"32",x"35",x"24",x"CB",x"52",x"98", -- 0x0810 + x"40",x"3C",x"3C",x"3C",x"40",x"33",x"34",x"35", -- 0x0818 + x"24",x"CE",x"52",x"9C",x"40",x"3C",x"3C",x"3C", -- 0x0820 + x"40",x"35",x"33",x"34",x"24",x"FF",x"FF",x"8A", -- 0x0828 + x"52",x"50",x"4C",x"41",x"59",x"45",x"52",x"40", -- 0x0830 + x"4F",x"4E",x"45",x"24",x"FF",x"FF",x"8A",x"52", -- 0x0838 + x"50",x"4C",x"41",x"59",x"45",x"52",x"40",x"54", -- 0x0840 + x"57",x"4F",x"24",x"FF",x"FF",x"8C",x"52",x"47", -- 0x0848 + x"41",x"4D",x"45",x"40",x"4F",x"56",x"45",x"52", -- 0x0850 + x"24",x"FF",x"FF",x"7F",x"53",x"43",x"52",x"45", -- 0x0858 + x"44",x"49",x"54",x"53",x"5B",x"24",x"21",x"53", -- 0x0860 + x"31",x"40",x"55",x"50",x"24",x"01",x"52",x"48", -- 0x0868 + x"49",x"47",x"48",x"24",x"FF",x"FF",x"E1",x"50", -- 0x0870 + x"32",x"40",x"55",x"50",x"24",x"FF",x"FF",x"DD", -- 0x0878 + x"21",x"5B",x"08",x"CD",x"F0",x"01",x"3A",x"17", -- 0x0880 + x"40",x"FE",x"01",x"20",x"07",x"DD",x"21",x"76", -- 0x0888 + x"08",x"CD",x"F0",x"01",x"FD",x"21",x"A0",x"53", -- 0x0890 + x"21",x"2C",x"40",x"CD",x"DA",x"05",x"FD",x"21", -- 0x0898 + x"80",x"52",x"21",x"1D",x"40",x"CD",x"DA",x"05", -- 0x08A0 + x"21",x"1B",x"40",x"01",x"01",x"01",x"FD",x"21", -- 0x08A8 + x"7F",x"52",x"CD",x"DD",x"05",x"3A",x"1C",x"40", -- 0x08B0 + x"FE",x"50",x"3E",x"10",x"20",x"02",x"3E",x"2D", -- 0x08B8 + x"FD",x"77",x"00",x"3A",x"17",x"40",x"B7",x"C8", -- 0x08C0 + x"FD",x"21",x"60",x"51",x"21",x"33",x"40",x"CD", -- 0x08C8 + x"DA",x"05",x"C9",x"FD",x"21",x"3F",x"41",x"FD", -- 0x08D0 + x"34",x"01",x"AF",x"32",x"03",x"68",x"32",x"05", -- 0x08D8 + x"68",x"3E",x"FF",x"32",x"00",x"78",x"3A",x"10", -- 0x08E0 + x"40",x"B7",x"C0",x"FD",x"CB",x"00",x"46",x"C4", -- 0x08E8 + x"16",x"09",x"FD",x"CB",x"00",x"4E",x"C4",x"37", -- 0x08F0 + x"09",x"FD",x"CB",x"00",x"56",x"C4",x"4B",x"09", -- 0x08F8 + x"FD",x"CB",x"00",x"6E",x"C4",x"6C",x"09",x"FD", -- 0x0900 + x"CB",x"00",x"76",x"C4",x"83",x"09",x"FD",x"CB", -- 0x0908 + x"00",x"7E",x"C4",x"96",x"09",x"C9",x"FD",x"CB", -- 0x0910 + x"02",x"56",x"20",x"05",x"3E",x"01",x"32",x"03", -- 0x0918 + x"68",x"CD",x"88",x"06",x"E6",x"0F",x"20",x"06", -- 0x0920 + x"CD",x"88",x"06",x"32",x"00",x"78",x"FD",x"35", -- 0x0928 + x"02",x"C0",x"FD",x"CB",x"00",x"86",x"C9",x"FD", -- 0x0930 + x"CB",x"03",x"4E",x"20",x"05",x"3E",x"01",x"32", -- 0x0938 + x"05",x"68",x"FD",x"35",x"03",x"C0",x"FD",x"CB", -- 0x0940 + x"00",x"8E",x"C9",x"FD",x"CB",x"01",x"46",x"C0", -- 0x0948 + x"FD",x"7E",x"04",x"D6",x"04",x"FD",x"77",x"04", -- 0x0950 + x"FD",x"7E",x"04",x"32",x"00",x"78",x"F0",x"FD", -- 0x0958 + x"CB",x"00",x"96",x"3E",x"FF",x"32",x"00",x"78", -- 0x0960 + x"FD",x"77",x"04",x"C9",x"FD",x"7E",x"01",x"E6", -- 0x0968 + x"04",x"3E",x"FF",x"20",x"02",x"3E",x"80",x"32", -- 0x0970 + x"00",x"78",x"FD",x"35",x"07",x"C0",x"FD",x"CB", -- 0x0978 + x"00",x"AE",x"C9",x"FD",x"35",x"08",x"C0",x"FD", -- 0x0980 + x"CB",x"00",x"B6",x"AF",x"32",x"00",x"68",x"32", -- 0x0988 + x"01",x"68",x"32",x"02",x"68",x"C9",x"FD",x"7E", -- 0x0990 + x"09",x"87",x"87",x"87",x"32",x"00",x"78",x"FD", -- 0x0998 + x"35",x"09",x"C0",x"FD",x"CB",x"00",x"BE",x"C9", -- 0x09A0 + x"DD",x"E5",x"F5",x"C5",x"D5",x"E5",x"F5",x"3A", -- 0x09A8 + x"10",x"40",x"B7",x"20",x"3F",x"3A",x"0C",x"40", -- 0x09B0 + x"B7",x"CA",x"F4",x"09",x"2A",x"24",x"40",x"F1", -- 0x09B8 + x"E5",x"CD",x"05",x"06",x"E1",x"11",x"1D",x"40", -- 0x09C0 + x"CD",x"FC",x"09",x"DD",x"2A",x"24",x"40",x"DD", -- 0x09C8 + x"CB",x"06",x"46",x"20",x"1E",x"DD",x"7E",x"00", -- 0x09D0 + x"DD",x"B6",x"01",x"20",x"16",x"DD",x"7E",x"02", -- 0x09D8 + x"FE",x"50",x"38",x"0F",x"DD",x"CB",x"06",x"C6", -- 0x09E0 + x"DD",x"34",x"05",x"CD",x"05",x"0D",x"3E",x"08", -- 0x09E8 + x"CD",x"DE",x"06",x"F5",x"F1",x"E1",x"D1",x"C1", -- 0x09F0 + x"F1",x"DD",x"E1",x"C9",x"E5",x"D5",x"06",x"04", -- 0x09F8 + x"1A",x"BE",x"20",x"06",x"23",x"13",x"10",x"F8", -- 0x0A00 + x"18",x"08",x"30",x"06",x"7E",x"12",x"23",x"13", -- 0x0A08 + x"10",x"FA",x"D1",x"E1",x"C9",x"31",x"31",x"00", -- 0x0A10 + x"44",x"CD",x"A1",x"01",x"21",x"F7",x"0C",x"22", -- 0x0A18 + x"24",x"40",x"11",x"2C",x"40",x"01",x"0E",x"00", -- 0x0A20 + x"ED",x"B0",x"31",x"00",x"44",x"AF",x"32",x"18", -- 0x0A28 + x"40",x"32",x"05",x"40",x"CD",x"73",x"0A",x"CD", -- 0x0A30 + x"AB",x"0A",x"CD",x"B9",x"0A",x"3E",x"01",x"32", -- 0x0A38 + x"10",x"40",x"21",x"DC",x"05",x"22",x"11",x"40", -- 0x0A40 + x"21",x"00",x"20",x"22",x"26",x"40",x"CD",x"D4", -- 0x0A48 + x"0A",x"3E",x"07",x"32",x"21",x"40",x"CD",x"95", -- 0x0A50 + x"0C",x"21",x"01",x"00",x"CD",x"BC",x"0A",x"3A", -- 0x0A58 + x"0E",x"40",x"B7",x"28",x"C5",x"2A",x"11",x"40", -- 0x0A60 + x"2B",x"22",x"11",x"40",x"7C",x"B5",x"20",x"E1", -- 0x0A68 + x"C3",x"2A",x"0A",x"CD",x"BD",x"01",x"DD",x"21", -- 0x0A70 + x"BC",x"07",x"CD",x"F0",x"01",x"3A",x"E5",x"07", -- 0x0A78 + x"FE",x"4D",x"C2",x"00",x"00",x"21",x"07",x"53", -- 0x0A80 + x"11",x"F1",x"07",x"01",x"C0",x"FF",x"1A",x"13", -- 0x0A88 + x"D6",x"30",x"77",x"09",x"D9",x"21",x"1E",x"00", -- 0x0A90 + x"CD",x"BC",x"0A",x"CD",x"7B",x"00",x"D9",x"1A", -- 0x0A98 + x"FE",x"C9",x"20",x"EA",x"CD",x"B9",x"0A",x"CD", -- 0x0AA0 + x"B9",x"0A",x"C9",x"CD",x"BD",x"01",x"DD",x"21", -- 0x0AA8 + x"FA",x"07",x"CD",x"F0",x"01",x"CD",x"B9",x"0A", -- 0x0AB0 + x"C9",x"21",x"90",x"01",x"E5",x"3A",x"1B",x"40", -- 0x0AB8 + x"B7",x"C2",x"6B",x"0B",x"7D",x"E6",x"01",x"CC", -- 0x0AC0 + x"7B",x"00",x"C4",x"5E",x"07",x"E1",x"2B",x"7C", -- 0x0AC8 + x"B5",x"20",x"E9",x"C9",x"CD",x"BD",x"01",x"21", -- 0x0AD0 + x"E3",x"0C",x"11",x"3B",x"40",x"01",x"14",x"00", -- 0x0AD8 + x"ED",x"B0",x"21",x"96",x"0E",x"11",x"23",x"41", -- 0x0AE0 + x"01",x"1C",x"00",x"ED",x"B0",x"21",x"00",x"20", -- 0x0AE8 + x"22",x"26",x"40",x"21",x"9F",x"10",x"22",x"22", -- 0x0AF0 + x"40",x"CD",x"10",x"0B",x"AF",x"32",x"21",x"40", -- 0x0AF8 + x"3E",x"50",x"32",x"0E",x"40",x"3E",x"32",x"32", -- 0x0B00 + x"3A",x"40",x"3E",x"01",x"32",x"04",x"70",x"C9", -- 0x0B08 + x"21",x"F7",x"40",x"06",x"29",x"36",x"FF",x"23", -- 0x0B10 + x"10",x"FB",x"36",x"FE",x"C9",x"3A",x"00",x"40", -- 0x0B18 + x"E6",x"03",x"C0",x"DD",x"21",x"F7",x"40",x"06", -- 0x0B20 + x"14",x"DD",x"7E",x"01",x"FE",x"FF",x"28",x"34", -- 0x0B28 + x"DD",x"34",x"00",x"DD",x"6E",x"00",x"7D",x"E6", -- 0x0B30 + x"1F",x"FE",x"1C",x"28",x"23",x"DD",x"66",x"01", -- 0x0B38 + x"CB",x"46",x"28",x"06",x"DD",x"35",x"00",x"DD", -- 0x0B40 + x"6E",x"00",x"7E",x"E6",x"F0",x"FE",x"E0",x"20", -- 0x0B48 + x"0F",x"7E",x"C6",x"04",x"FE",x"F0",x"28",x"05", -- 0x0B50 + x"CD",x"61",x"06",x"18",x"07",x"CD",x"75",x"06", -- 0x0B58 + x"DD",x"36",x"01",x"FF",x"DD",x"23",x"DD",x"23", -- 0x0B60 + x"10",x"BF",x"C9",x"31",x"00",x"44",x"AF",x"32", -- 0x0B68 + x"10",x"40",x"CD",x"BD",x"01",x"DD",x"21",x"7F", -- 0x0B70 + x"07",x"CD",x"F0",x"01",x"3A",x"1B",x"40",x"FE", -- 0x0B78 + x"01",x"DD",x"21",x"AA",x"07",x"C4",x"F0",x"01", -- 0x0B80 + x"CD",x"7B",x"00",x"CD",x"94",x"08",x"DD",x"21", -- 0x0B88 + x"5B",x"10",x"CD",x"C4",x"0F",x"01",x"99",x"00", -- 0x0B90 + x"28",x"0F",x"3A",x"1B",x"40",x"FE",x"01",x"28", -- 0x0B98 + x"D4",x"CD",x"C4",x"0F",x"01",x"98",x"01",x"20", -- 0x0BA0 + x"CC",x"3A",x"1B",x"40",x"81",x"27",x"32",x"1B", -- 0x0BA8 + x"40",x"78",x"32",x"17",x"40",x"AF",x"32",x"18", -- 0x0BB0 + x"40",x"21",x"F7",x"0C",x"11",x"2C",x"40",x"01", -- 0x0BB8 + x"0E",x"00",x"ED",x"B0",x"DD",x"21",x"7F",x"10", -- 0x0BC0 + x"CD",x"C4",x"0F",x"CA",x"D6",x"0B",x"3E",x"05", -- 0x0BC8 + x"32",x"31",x"40",x"32",x"38",x"40",x"3A",x"18", -- 0x0BD0 + x"40",x"B7",x"DD",x"21",x"2C",x"40",x"28",x"04", -- 0x0BD8 + x"DD",x"21",x"33",x"40",x"DD",x"22",x"24",x"40", -- 0x0BE0 + x"DD",x"7E",x"05",x"B7",x"CA",x"20",x"0C",x"CD", -- 0x0BE8 + x"7E",x"0C",x"3A",x"17",x"40",x"B7",x"06",x"14", -- 0x0BF0 + x"28",x"02",x"06",x"64",x"CD",x"7B",x"00",x"10", -- 0x0BF8 + x"FB",x"DD",x"2A",x"24",x"40",x"DD",x"35",x"05", -- 0x0C00 + x"CD",x"D4",x"0A",x"CD",x"05",x"0D",x"CD",x"F7", -- 0x0C08 + x"0F",x"CD",x"25",x"10",x"CD",x"9C",x"06",x"CD", -- 0x0C10 + x"95",x"0C",x"3A",x"0E",x"40",x"B7",x"20",x"F7", -- 0x0C18 + x"DD",x"7E",x"05",x"B7",x"20",x"11",x"CD",x"7E", -- 0x0C20 + x"0C",x"DD",x"21",x"4D",x"08",x"CD",x"F0",x"01", -- 0x0C28 + x"06",x"96",x"CD",x"7B",x"00",x"10",x"FB",x"3A", -- 0x0C30 + x"17",x"40",x"B7",x"3A",x"31",x"40",x"21",x"38", -- 0x0C38 + x"40",x"28",x"01",x"B6",x"B7",x"CA",x"6A",x"0C", -- 0x0C40 + x"3A",x"17",x"40",x"B7",x"28",x"88",x"3A",x"18", -- 0x0C48 + x"40",x"EE",x"01",x"32",x"18",x"40",x"32",x"05", -- 0x0C50 + x"40",x"DD",x"21",x"7B",x"10",x"CD",x"C4",x"0F", -- 0x0C58 + x"CA",x"D6",x"0B",x"AF",x"32",x"05",x"40",x"C3", -- 0x0C60 + x"D6",x"0B",x"CD",x"BD",x"01",x"DD",x"21",x"4D", -- 0x0C68 + x"08",x"CD",x"F0",x"01",x"06",x"64",x"CD",x"7B", -- 0x0C70 + x"00",x"10",x"FB",x"C3",x"2A",x"0A",x"CD",x"BD", -- 0x0C78 + x"01",x"3A",x"18",x"40",x"B7",x"DD",x"21",x"2F", -- 0x0C80 + x"08",x"28",x"04",x"DD",x"21",x"3E",x"08",x"CD", -- 0x0C88 + x"F0",x"01",x"C9",x"ED",x"4B",x"CD",x"7B",x"00", -- 0x0C90 + x"21",x"00",x"40",x"34",x"CD",x"1E",x"0D",x"CD", -- 0x0C98 + x"7F",x"0D",x"CD",x"B3",x"0E",x"CD",x"0F",x"03", -- 0x0CA0 + x"CD",x"1E",x"02",x"CD",x"6E",x"0F",x"3A",x"00", -- 0x0CA8 + x"40",x"E6",x"01",x"CC",x"94",x"08",x"CD",x"1D", -- 0x0CB0 + x"0B",x"3A",x"42",x"40",x"21",x"4C",x"40",x"BE", -- 0x0CB8 + x"28",x"16",x"DD",x"21",x"3B",x"40",x"CD",x"75", -- 0x0CC0 + x"05",x"DD",x"21",x"45",x"40",x"DD",x"7E",x"01", -- 0x0CC8 + x"D6",x"09",x"DD",x"77",x"01",x"CD",x"75",x"05", -- 0x0CD0 + x"21",x"0E",x"40",x"3A",x"42",x"40",x"B7",x"28", -- 0x0CD8 + x"01",x"35",x"C9",x"80",x"BE",x"00",x"00",x"04", -- 0x0CE0 + x"16",x"00",x"00",x"00",x"00",x"80",x"CE",x"00", -- 0x0CE8 + x"00",x"04",x"17",x"00",x"00",x"00",x"00",x"00", -- 0x0CF0 + x"00",x"00",x"00",x"00",x"03",x"00",x"00",x"00", -- 0x0CF8 + x"00",x"00",x"00",x"03",x"00",x"DD",x"2A",x"24", -- 0x0D00 + x"40",x"21",x"DE",x"51",x"DD",x"4E",x"05",x"79", -- 0x0D08 + x"B7",x"C8",x"0D",x"3E",x"30",x"CD",x"61",x"06", -- 0x0D10 + x"11",x"C0",x"FF",x"19",x"18",x"F1",x"3A",x"00", -- 0x0D18 + x"40",x"E6",x"03",x"C0",x"CD",x"5E",x"07",x"CD", -- 0x0D20 + x"5E",x"07",x"21",x"1C",x"50",x"3E",x"20",x"11", -- 0x0D28 + x"1D",x"50",x"01",x"1B",x"00",x"ED",x"B8",x"01", -- 0x0D30 + x"3B",x"00",x"09",x"EB",x"09",x"EB",x"3D",x"20", -- 0x0D38 + x"F1",x"CD",x"C5",x"0D",x"3E",x"C0",x"32",x"42", -- 0x0D40 + x"50",x"32",x"A2",x"53",x"3A",x"21",x"40",x"CB", -- 0x0D48 + x"47",x"C8",x"CD",x"88",x"06",x"E6",x"03",x"C0", -- 0x0D50 + x"CD",x"88",x"06",x"5F",x"16",x"10",x"CD",x"45", -- 0x0D58 + x"05",x"CD",x"B4",x"0D",x"C0",x"CD",x"88",x"06", -- 0x0D60 + x"E6",x"01",x"3E",x"70",x"28",x"02",x"3E",x"60", -- 0x0D68 + x"4F",x"CD",x"88",x"06",x"E6",x"07",x"79",x"20", -- 0x0D70 + x"02",x"3E",x"6C",x"CD",x"61",x"06",x"C9",x"3A", -- 0x0D78 + x"21",x"40",x"CB",x"67",x"C8",x"3A",x"00",x"40", -- 0x0D80 + x"E6",x"1F",x"C0",x"21",x"C3",x"50",x"CD",x"88", -- 0x0D88 + x"06",x"E6",x"01",x"20",x"03",x"21",x"E3",x"50", -- 0x0D90 + x"06",x"06",x"CD",x"B4",x"0D",x"20",x"0E",x"CD", -- 0x0D98 + x"88",x"06",x"E6",x"07",x"3E",x"68",x"28",x"02", -- 0x0DA0 + x"3E",x"64",x"CD",x"61",x"06",x"11",x"80",x"00", -- 0x0DA8 + x"19",x"10",x"E7",x"C9",x"E5",x"7E",x"23",x"B6", -- 0x0DB0 + x"C5",x"01",x"20",x"00",x"09",x"C1",x"B6",x"2B", -- 0x0DB8 + x"B6",x"FE",x"10",x"E1",x"C9",x"21",x"02",x"50", -- 0x0DC0 + x"06",x"20",x"11",x"20",x"00",x"36",x"10",x"19", -- 0x0DC8 + x"10",x"FB",x"2A",x"26",x"40",x"7E",x"FE",x"FE", -- 0x0DD0 + x"DD",x"2A",x"24",x"40",x"20",x"1C",x"3A",x"1E", -- 0x0DD8 + x"53",x"EE",x"1C",x"32",x"1E",x"53",x"E5",x"21", -- 0x0DE0 + x"96",x"0E",x"11",x"23",x"41",x"01",x"1C",x"00", -- 0x0DE8 + x"ED",x"B0",x"DD",x"34",x"04",x"CD",x"F7",x"0F", -- 0x0DF0 + x"E1",x"23",x"7E",x"3C",x"20",x"03",x"21",x"00", -- 0x0DF8 + x"20",x"4E",x"23",x"22",x"26",x"40",x"DD",x"21", -- 0x0E00 + x"23",x"41",x"06",x"04",x"C5",x"DD",x"7E",x"03", -- 0x0E08 + x"A1",x"2E",x"00",x"11",x"00",x"00",x"28",x"04", -- 0x0E10 + x"2C",x"11",x"20",x"00",x"DD",x"7E",x"04",x"A1", -- 0x0E18 + x"28",x"05",x"2E",x"02",x"11",x"E0",x"FF",x"DD", -- 0x0E20 + x"75",x"02",x"DD",x"6E",x"00",x"DD",x"66",x"01", -- 0x0E28 + x"19",x"DD",x"75",x"00",x"DD",x"74",x"01",x"DD", -- 0x0E30 + x"6E",x"05",x"DD",x"66",x"06",x"DD",x"5E",x"00", -- 0x0E38 + x"DD",x"56",x"01",x"B7",x"ED",x"52",x"28",x"3D", -- 0x0E40 + x"01",x"E0",x"FF",x"CB",x"7C",x"28",x"03",x"01", -- 0x0E48 + x"20",x"00",x"F5",x"E5",x"2A",x"22",x"40",x"23", -- 0x0E50 + x"7E",x"C6",x"C0",x"E1",x"19",x"77",x"22",x"29", -- 0x0E58 + x"40",x"09",x"B7",x"ED",x"52",x"20",x"F5",x"19", -- 0x0E60 + x"F1",x"E5",x"DD",x"7E",x"02",x"28",x"02",x"C6", -- 0x0E68 + x"03",x"6F",x"26",x"00",x"11",x"90",x"0E",x"19", -- 0x0E70 + x"5E",x"E1",x"7B",x"E6",x"FD",x"FE",x"6D",x"20", -- 0x0E78 + x"03",x"2A",x"29",x"40",x"73",x"C1",x"11",x"07", -- 0x0E80 + x"00",x"DD",x"19",x"05",x"C2",x"0C",x"0E",x"C9", -- 0x0E88 + x"34",x"6C",x"6D",x"36",x"6F",x"6E",x"82",x"53", -- 0x0E90 + x"00",x"80",x"40",x"82",x"53",x"02",x"52",x"00", -- 0x0E98 + x"20",x"10",x"02",x"52",x"E2",x"51",x"00",x"08", -- 0x0EA0 + x"04",x"E2",x"51",x"62",x"50",x"00",x"02",x"01", -- 0x0EA8 + x"62",x"50",x"01",x"3A",x"10",x"40",x"B7",x"C2", -- 0x0EB0 + x"31",x"0F",x"3A",x"42",x"40",x"B7",x"C0",x"FD", -- 0x0EB8 + x"21",x"3B",x"40",x"DD",x"21",x"47",x"10",x"AF", -- 0x0EC0 + x"FD",x"77",x"02",x"FD",x"77",x"03",x"CD",x"C4", -- 0x0EC8 + x"0F",x"CC",x"E7",x"0E",x"CD",x"C4",x"0F",x"CC", -- 0x0ED0 + x"F4",x"0E",x"3A",x"3D",x"40",x"32",x"47",x"40", -- 0x0ED8 + x"CD",x"C4",x"0F",x"C4",x"01",x"0F",x"C9",x"FD", -- 0x0EE0 + x"7E",x"00",x"E6",x"FE",x"FE",x"18",x"C8",x"FD", -- 0x0EE8 + x"36",x"02",x"FE",x"C9",x"FD",x"7E",x"00",x"E6", -- 0x0EF0 + x"FE",x"FE",x"D8",x"C8",x"FD",x"36",x"02",x"02", -- 0x0EF8 + x"C9",x"DD",x"21",x"CF",x"40",x"06",x"02",x"11", -- 0x0F00 + x"05",x"00",x"CD",x"DF",x"04",x"C0",x"ED",x"5B", -- 0x0F08 + x"3B",x"40",x"1D",x"1D",x"DD",x"73",x"00",x"7A", -- 0x0F10 + x"D6",x"10",x"DD",x"77",x"01",x"3A",x"3D",x"40", -- 0x0F18 + x"DD",x"77",x"02",x"DD",x"36",x"03",x"FA",x"DD", -- 0x0F20 + x"36",x"04",x"01",x"3E",x"06",x"CD",x"DE",x"06", -- 0x0F28 + x"C9",x"CD",x"88",x"06",x"E6",x"1F",x"CC",x"01", -- 0x0F30 + x"0F",x"DD",x"21",x"3B",x"40",x"3A",x"3D",x"40", -- 0x0F38 + x"32",x"47",x"40",x"3A",x"3B",x"40",x"0E",x"FF", -- 0x0F40 + x"FE",x"C0",x"30",x"14",x"0E",x"01",x"FE",x"40", -- 0x0F48 + x"38",x"0E",x"CD",x"88",x"06",x"E6",x"3F",x"20", -- 0x0F50 + x"0B",x"CD",x"88",x"06",x"E6",x"02",x"3D",x"4F", -- 0x0F58 + x"79",x"32",x"3D",x"40",x"CD",x"9F",x"04",x"3A", -- 0x0F60 + x"3D",x"40",x"32",x"47",x"40",x"C9",x"CD",x"88", -- 0x0F68 + x"06",x"E6",x"3F",x"C0",x"21",x"21",x"40",x"CB", -- 0x0F70 + x"4E",x"C8",x"0E",x"01",x"CB",x"56",x"28",x"02", -- 0x0F78 + x"0E",x"03",x"3A",x"28",x"40",x"B9",x"D0",x"CD", -- 0x0F80 + x"8B",x"0F",x"C9",x"DD",x"21",x"4F",x"40",x"06", -- 0x0F88 + x"06",x"11",x"0A",x"00",x"CD",x"DF",x"04",x"C0", -- 0x0F90 + x"3E",x"12",x"CD",x"DE",x"06",x"CD",x"88",x"06", -- 0x0F98 + x"E6",x"7F",x"C6",x"40",x"5F",x"16",x"28",x"CD", -- 0x0FA0 + x"BF",x"05",x"20",x"F1",x"EB",x"11",x"01",x"01", -- 0x0FA8 + x"01",x"00",x"15",x"CD",x"88",x"06",x"E6",x"07", -- 0x0FB0 + x"4F",x"D9",x"21",x"00",x"02",x"11",x"00",x"00", -- 0x0FB8 + x"D9",x"C3",x"F6",x"04",x"D5",x"E5",x"DD",x"E5", -- 0x0FC0 + x"3A",x"18",x"40",x"B7",x"28",x"04",x"DD",x"23", -- 0x0FC8 + x"DD",x"23",x"DD",x"66",x"00",x"CB",x"7C",x"20", -- 0x0FD0 + x"11",x"2E",x"00",x"7E",x"2F",x"DD",x"A6",x"01", -- 0x0FD8 + x"DD",x"E1",x"11",x"04",x"00",x"DD",x"19",x"E1", -- 0x0FE0 + x"D1",x"C9",x"7C",x"E6",x"7F",x"6F",x"26",x"00", -- 0x0FE8 + x"11",x"09",x"40",x"19",x"7E",x"18",x"E6",x"F5", -- 0x0FF0 + x"D5",x"E5",x"DD",x"E5",x"DD",x"2A",x"24",x"40", -- 0x0FF8 + x"DD",x"7E",x"04",x"FE",x"08",x"20",x"04",x"DD", -- 0x1000 + x"36",x"04",x"07",x"DD",x"7E",x"04",x"E6",x"07", -- 0x1008 + x"6F",x"26",x"00",x"11",x"9F",x"10",x"29",x"19", -- 0x1010 + x"7E",x"32",x"21",x"40",x"22",x"22",x"40",x"DD", -- 0x1018 + x"E1",x"E1",x"D1",x"F1",x"C9",x"DD",x"2A",x"24", -- 0x1020 + x"40",x"DD",x"7E",x"04",x"E6",x"07",x"21",x"00", -- 0x1028 + x"20",x"4F",x"22",x"26",x"40",x"0D",x"F8",x"7E", -- 0x1030 + x"FE",x"FF",x"20",x"03",x"21",x"00",x"20",x"7E", -- 0x1038 + x"FE",x"FE",x"23",x"20",x"F2",x"18",x"EB",x"60", -- 0x1040 + x"04",x"68",x"04",x"60",x"08",x"68",x"08",x"80", -- 0x1048 + x"10",x"81",x"10",x"60",x"80",x"60",x"40",x"60", -- 0x1050 + x"20",x"61",x"20",x"68",x"01",x"68",x"01",x"68", -- 0x1058 + x"02",x"68",x"02",x"80",x"01",x"80",x"01",x"80", -- 0x1060 + x"02",x"80",x"02",x"50",x"00",x"00",x"03",x"00", -- 0x1068 + x"01",x"00",x"03",x"50",x"00",x"00",x"05",x"00", -- 0x1070 + x"01",x"00",x"05",x"70",x"08",x"70",x"08",x"70", -- 0x1078 + x"04",x"70",x"04",x"14",x"FF",x"0A",x"10",x"05", -- 0x1080 + x"00",x"0A",x"20",x"05",x"00",x"0A",x"30",x"05", -- 0x1088 + x"00",x"28",x"30",x"05",x"20",x"05",x"10",x"28", -- 0x1090 + x"00",x"14",x"FF",x"0A",x"E0",x"FF",x"FF",x"E2", -- 0x1098 + x"00",x"E1",x"01",x"EB",x"02",x"FB",x"03",x"EF", -- 0x10A0 + x"00",x"FF",x"00",x"ED",x"00",x"EE",x"00",x"FF", -- 0x10A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x10B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x10B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x10C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x10C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x10D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x10D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x10E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x10E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x10F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x10F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1100 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1108 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1110 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1118 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1120 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1128 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1130 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1138 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1140 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1148 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1150 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1158 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1160 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1168 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1170 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1178 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1180 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1188 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1190 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1198 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x11A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x11A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x11B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x11B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x11C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x11C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x11D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x11D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x11E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x11E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x11F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x11F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1200 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1208 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1210 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1218 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1220 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1228 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1230 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1238 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1240 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1248 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1250 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1258 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1260 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1268 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1270 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1278 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1280 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1288 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1290 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1298 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x12A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x12A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x12B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x12B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x12C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x12C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x12D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x12D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x12E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x12E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x12F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x12F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1300 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1308 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1310 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1318 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1320 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1328 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1330 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1338 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1340 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1348 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1350 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1358 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1360 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1368 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1370 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1378 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1380 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1388 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1390 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1398 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x13A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x13A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x13B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x13B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x13C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x13C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x13D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x13D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x13E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x13E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x13F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x13F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1400 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1408 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1410 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1418 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1420 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1428 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1430 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1438 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1440 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1448 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1450 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1458 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1460 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1468 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1470 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1478 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1480 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1488 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1490 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1498 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x14A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x14A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x14B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x14B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x14C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x14C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x14D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x14D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x14E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x14E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x14F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x14F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1500 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1508 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1510 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1518 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1520 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1528 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1530 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1538 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1540 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1548 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1550 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1558 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1560 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1568 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1570 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1578 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1580 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1588 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1590 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1598 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x15A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x15A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x15B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x15B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x15C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x15C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x15D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x15D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x15E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x15E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x15F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x15F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1600 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1608 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1610 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1618 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1620 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1628 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1630 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1638 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1640 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1648 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1650 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1658 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1660 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1668 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1670 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1678 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1680 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1688 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1690 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1698 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x16A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x16A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x16B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x16B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x16C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x16C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x16D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x16D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x16E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x16E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x16F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x16F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1700 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1708 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1710 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1718 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1720 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1728 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1730 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1738 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1740 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1748 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1750 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1758 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1760 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1768 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1770 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1778 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1780 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1788 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1790 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1798 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x17A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x17A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x17B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x17B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x17C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x17C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x17D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x17D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x17E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x17E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x17F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x17F8 + x"DD",x"7E",x"04",x"FE",x"08",x"20",x"04",x"DD", -- 0x1800 + x"36",x"04",x"07",x"DD",x"7E",x"04",x"E6",x"07", -- 0x1808 + x"6F",x"26",x"00",x"11",x"9F",x"10",x"29",x"19", -- 0x1810 + x"7E",x"32",x"21",x"40",x"22",x"22",x"40",x"DD", -- 0x1818 + x"E1",x"E1",x"D1",x"F1",x"C9",x"DD",x"2A",x"24", -- 0x1820 + x"40",x"DD",x"7E",x"04",x"E6",x"07",x"21",x"00", -- 0x1828 + x"20",x"4F",x"22",x"26",x"40",x"0D",x"F8",x"7E", -- 0x1830 + x"FE",x"FF",x"20",x"03",x"21",x"00",x"20",x"7E", -- 0x1838 + x"FE",x"FE",x"23",x"20",x"F2",x"18",x"EB",x"60", -- 0x1840 + x"04",x"68",x"04",x"60",x"08",x"68",x"08",x"80", -- 0x1848 + x"10",x"81",x"10",x"60",x"80",x"60",x"40",x"60", -- 0x1850 + x"20",x"61",x"20",x"68",x"01",x"68",x"01",x"68", -- 0x1858 + x"02",x"68",x"02",x"80",x"01",x"80",x"01",x"80", -- 0x1860 + x"02",x"80",x"02",x"50",x"00",x"00",x"03",x"00", -- 0x1868 + x"01",x"00",x"03",x"50",x"00",x"00",x"05",x"00", -- 0x1870 + x"01",x"00",x"05",x"70",x"08",x"70",x"08",x"70", -- 0x1878 + x"04",x"70",x"04",x"14",x"FF",x"0A",x"10",x"05", -- 0x1880 + x"00",x"0A",x"20",x"05",x"00",x"0A",x"30",x"05", -- 0x1888 + x"00",x"28",x"30",x"05",x"20",x"05",x"10",x"28", -- 0x1890 + x"00",x"14",x"FF",x"0A",x"E0",x"FF",x"FF",x"E2", -- 0x1898 + x"00",x"E1",x"01",x"EB",x"02",x"FB",x"03",x"EF", -- 0x18A0 + x"00",x"FF",x"00",x"ED",x"00",x"EE",x"00",x"FF", -- 0x18A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x18B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x18B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x18C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x18C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x18D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x18D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x18E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x18E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x18F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x18F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1900 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1908 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1910 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1918 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1920 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1928 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1930 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1938 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1940 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1948 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1950 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1958 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1960 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1968 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1970 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1978 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1980 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1988 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1990 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1998 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x19A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x19A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x19B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x19B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x19C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x19C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x19D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x19D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x19E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x19E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x19F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x19F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1A98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1AA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1AA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1AB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1AB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1AC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1AC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1AD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1AD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1AE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1AE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1AF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1AF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1B98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1BA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1BA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1BB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1BB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1BC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1BC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1BD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1BD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1BE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1BE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1BF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1BF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1C98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1CA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1CA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1CB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1CB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1CC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1CC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1CD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1CD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1CE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1CE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1CF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1CF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1D98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1DA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1DA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1DB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1DB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1DC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1DC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1DD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1DD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1DE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1DE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1DF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1DF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1E98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1EA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1EA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1EB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1EB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1EC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1EC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1ED0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1ED8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1EE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1EE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1EF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1EF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1F98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1FA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1FA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1FB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1FB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1FC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1FC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1FD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1FD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1FE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1FE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1FF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x1FF8 + x"00",x"42",x"42",x"42",x"02",x"00",x"00",x"00", -- 0x2000 + x"02",x"02",x"02",x"02",x"02",x"40",x"41",x"41", -- 0x2008 + x"00",x"41",x"41",x"01",x"01",x"01",x"41",x"40", -- 0x2010 + x"40",x"40",x"02",x"82",x"82",x"80",x"80",x"80", -- 0x2018 + x"81",x"80",x"80",x"80",x"81",x"80",x"24",x"24", -- 0x2020 + x"00",x"24",x"21",x"20",x"01",x"81",x"00",x"00", -- 0x2028 + x"42",x"02",x"10",x"12",x"42",x"04",x"12",x"00", -- 0x2030 + x"40",x"68",x"18",x"00",x"00",x"00",x"6A",x"10", -- 0x2038 + x"00",x"5A",x"90",x"00",x"00",x"00",x"00",x"00", -- 0x2040 + x"80",x"01",x"80",x"00",x"00",x"00",x"00",x"40", -- 0x2048 + x"42",x"00",x"02",x"40",x"42",x"40",x"02",x"00", -- 0x2050 + x"40",x"02",x"00",x"40",x"01",x"01",x"41",x"00", -- 0x2058 + x"00",x"81",x"82",x"80",x"82",x"80",x"81",x"00", -- 0x2060 + x"82",x"00",x"80",x"24",x"A4",x"01",x"81",x"04", -- 0x2068 + x"04",x"11",x"04",x"05",x"04",x"11",x"28",x"60", -- 0x2070 + x"28",x"58",x"10",x"A4",x"00",x"40",x"10",x"1A", -- 0x2078 + x"40",x"00",x"08",x"88",x"AA",x"98",x"01",x"80", -- 0x2080 + x"FE",x"00",x"42",x"42",x"42",x"02",x"00",x"00", -- 0x2088 + x"00",x"02",x"02",x"02",x"02",x"02",x"40",x"41", -- 0x2090 + x"41",x"00",x"41",x"41",x"01",x"01",x"01",x"41", -- 0x2098 + x"40",x"40",x"40",x"02",x"82",x"82",x"80",x"80", -- 0x20A0 + x"80",x"81",x"80",x"80",x"80",x"81",x"80",x"00", -- 0x20A8 + x"82",x"00",x"80",x"24",x"A4",x"01",x"81",x"04", -- 0x20B0 + x"04",x"11",x"04",x"05",x"04",x"11",x"28",x"60", -- 0x20B8 + x"28",x"58",x"10",x"A4",x"00",x"40",x"10",x"1A", -- 0x20C0 + x"40",x"00",x"08",x"88",x"AA",x"98",x"01",x"80", -- 0x20C8 + x"FE",x"24",x"24",x"00",x"24",x"21",x"20",x"01", -- 0x20D0 + x"81",x"00",x"00",x"42",x"02",x"10",x"12",x"42", -- 0x20D8 + x"04",x"12",x"00",x"40",x"68",x"18",x"00",x"00", -- 0x20E0 + x"00",x"6A",x"10",x"50",x"5A",x"80",x"00",x"42", -- 0x20E8 + x"42",x"42",x"02",x"00",x"00",x"00",x"02",x"02", -- 0x20F0 + x"02",x"02",x"02",x"40",x"41",x"41",x"00",x"41", -- 0x20F8 + x"41",x"01",x"01",x"01",x"41",x"40",x"40",x"40", -- 0x2100 + x"02",x"82",x"82",x"80",x"80",x"80",x"81",x"80", -- 0x2108 + x"80",x"80",x"81",x"80",x"00",x"00",x"00",x"00", -- 0x2110 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"01", -- 0x2118 + x"80",x"00",x"00",x"00",x"00",x"40",x"42",x"00", -- 0x2120 + x"02",x"40",x"42",x"40",x"02",x"00",x"40",x"02", -- 0x2128 + x"00",x"40",x"01",x"01",x"41",x"00",x"00",x"81", -- 0x2130 + x"82",x"80",x"82",x"80",x"81",x"00",x"00",x"00", -- 0x2138 + x"00",x"FE",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2140 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2148 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2150 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2190 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21C8 + x"00",x"24",x"24",x"00",x"24",x"21",x"20",x"01", -- 0x21D0 + x"81",x"00",x"00",x"42",x"02",x"10",x"12",x"42", -- 0x21D8 + x"04",x"12",x"00",x"40",x"68",x"18",x"00",x"00", -- 0x21E0 + x"00",x"6A",x"10",x"50",x"5A",x"80",x"00",x"42", -- 0x21E8 + x"42",x"42",x"02",x"00",x"00",x"00",x"02",x"02", -- 0x21F0 + x"02",x"02",x"02",x"40",x"41",x"41",x"00",x"41", -- 0x21F8 + x"41",x"01",x"01",x"01",x"41",x"40",x"40",x"40", -- 0x2200 + x"02",x"82",x"82",x"80",x"80",x"80",x"81",x"80", -- 0x2208 + x"80",x"80",x"81",x"80",x"00",x"00",x"00",x"00", -- 0x2210 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"01", -- 0x2218 + x"80",x"00",x"00",x"00",x"00",x"40",x"42",x"00", -- 0x2220 + x"02",x"40",x"42",x"40",x"02",x"00",x"40",x"02", -- 0x2228 + x"00",x"40",x"01",x"01",x"41",x"00",x"00",x"81", -- 0x2230 + x"82",x"80",x"82",x"80",x"81",x"00",x"00",x"00", -- 0x2238 + x"00",x"FE",x"FF",x"FE",x"FF",x"FE",x"FF",x"FE", -- 0x2240 + x"00",x"00",x"00",x"00",x"FE",x"FF",x"FF",x"FF", -- 0x2248 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2250 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2258 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2260 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2268 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2270 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2278 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2280 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2288 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2290 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2298 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x22A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x22A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x22B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x22B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x22C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x22C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x22D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x22D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x22E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x22E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x22F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x22F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2300 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2308 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2310 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2318 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2320 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2328 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2330 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2338 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2340 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2348 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2350 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2358 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2360 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2368 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2370 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2378 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2380 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2388 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2390 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2398 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x23A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x23A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x23B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x23B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x23C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x23C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x23D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x23D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x23E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x23E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x23F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x23F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2400 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2408 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2410 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2418 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2420 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2428 + x"FF",x"FF",x"00",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2430 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2438 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2440 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2448 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2450 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2458 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2460 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2468 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2470 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2478 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2480 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2488 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2490 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2498 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x24A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x24A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x24B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x24B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x24C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x24C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x24D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x24D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x24E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x24E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x24F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x24F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2500 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2508 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2510 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2518 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2520 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2528 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2530 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2538 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2540 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2548 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2550 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2558 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2560 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2568 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2570 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2578 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2580 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2588 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2590 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2598 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x25A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x25A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x25B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x25B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x25C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x25C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x25D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x25D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x25E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x25E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x25F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x25F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2600 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2608 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2610 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2618 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2620 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2628 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2630 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2638 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2640 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2648 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2650 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2658 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2660 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2668 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2670 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2678 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2680 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2688 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2690 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2698 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x26A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x26A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x26B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x26B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x26C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x26C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x26D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x26D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x26E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x26E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x26F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x26F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2700 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2708 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2710 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2718 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2720 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2728 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2730 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2738 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2740 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2748 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2750 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2758 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2760 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2768 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2770 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2778 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2780 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2788 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2790 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2798 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x27A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x27A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x27B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x27B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x27C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x27C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x27D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x27D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x27E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x27E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x27F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x27F8 + x"00",x"42",x"42",x"42",x"02",x"00",x"00",x"00", -- 0x2800 + x"02",x"02",x"02",x"02",x"02",x"40",x"41",x"41", -- 0x2808 + x"00",x"41",x"41",x"01",x"01",x"01",x"41",x"40", -- 0x2810 + x"40",x"40",x"02",x"82",x"82",x"80",x"80",x"80", -- 0x2818 + x"81",x"80",x"80",x"80",x"81",x"80",x"24",x"24", -- 0x2820 + x"00",x"24",x"21",x"20",x"01",x"81",x"00",x"00", -- 0x2828 + x"42",x"02",x"10",x"12",x"42",x"04",x"12",x"00", -- 0x2830 + x"40",x"68",x"18",x"00",x"00",x"00",x"6A",x"10", -- 0x2838 + x"00",x"5A",x"90",x"00",x"00",x"00",x"00",x"00", -- 0x2840 + x"80",x"01",x"80",x"00",x"00",x"00",x"00",x"40", -- 0x2848 + x"42",x"00",x"02",x"40",x"42",x"40",x"02",x"00", -- 0x2850 + x"40",x"02",x"00",x"40",x"01",x"01",x"41",x"00", -- 0x2858 + x"00",x"81",x"82",x"80",x"82",x"80",x"81",x"00", -- 0x2860 + x"82",x"00",x"80",x"24",x"A4",x"01",x"81",x"04", -- 0x2868 + x"04",x"11",x"04",x"05",x"04",x"11",x"28",x"60", -- 0x2870 + x"28",x"58",x"10",x"A4",x"00",x"40",x"10",x"1A", -- 0x2878 + x"40",x"00",x"08",x"88",x"AA",x"98",x"01",x"80", -- 0x2880 + x"FE",x"00",x"42",x"42",x"42",x"02",x"00",x"00", -- 0x2888 + x"00",x"02",x"02",x"02",x"02",x"02",x"40",x"41", -- 0x2890 + x"41",x"00",x"41",x"41",x"01",x"01",x"01",x"41", -- 0x2898 + x"40",x"40",x"40",x"02",x"82",x"82",x"80",x"80", -- 0x28A0 + x"80",x"81",x"80",x"80",x"80",x"81",x"80",x"00", -- 0x28A8 + x"82",x"00",x"80",x"24",x"A4",x"01",x"81",x"04", -- 0x28B0 + x"04",x"11",x"04",x"05",x"04",x"11",x"28",x"60", -- 0x28B8 + x"28",x"58",x"10",x"A4",x"00",x"40",x"10",x"1A", -- 0x28C0 + x"40",x"00",x"08",x"88",x"AA",x"98",x"01",x"80", -- 0x28C8 + x"FE",x"24",x"24",x"00",x"24",x"21",x"20",x"01", -- 0x28D0 + x"81",x"00",x"00",x"42",x"02",x"10",x"12",x"42", -- 0x28D8 + x"04",x"12",x"00",x"40",x"68",x"18",x"00",x"00", -- 0x28E0 + x"00",x"6A",x"10",x"50",x"5A",x"80",x"00",x"42", -- 0x28E8 + x"42",x"42",x"02",x"00",x"00",x"00",x"02",x"02", -- 0x28F0 + x"02",x"02",x"02",x"40",x"41",x"41",x"00",x"41", -- 0x28F8 + x"41",x"01",x"01",x"01",x"41",x"40",x"40",x"40", -- 0x2900 + x"02",x"82",x"82",x"80",x"80",x"80",x"81",x"80", -- 0x2908 + x"80",x"80",x"81",x"80",x"00",x"00",x"00",x"00", -- 0x2910 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"01", -- 0x2918 + x"80",x"00",x"00",x"00",x"00",x"40",x"42",x"00", -- 0x2920 + x"02",x"40",x"42",x"40",x"02",x"00",x"40",x"02", -- 0x2928 + x"00",x"40",x"01",x"01",x"41",x"00",x"00",x"81", -- 0x2930 + x"82",x"80",x"82",x"80",x"81",x"00",x"00",x"00", -- 0x2938 + x"00",x"FE",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2940 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2948 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2950 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2958 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2960 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2968 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2970 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2978 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2980 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2988 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2990 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2998 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29C8 + x"00",x"24",x"24",x"00",x"24",x"21",x"20",x"01", -- 0x29D0 + x"81",x"00",x"00",x"42",x"02",x"10",x"12",x"42", -- 0x29D8 + x"04",x"12",x"00",x"40",x"68",x"18",x"00",x"00", -- 0x29E0 + x"00",x"6A",x"10",x"50",x"5A",x"80",x"00",x"42", -- 0x29E8 + x"42",x"42",x"02",x"00",x"00",x"00",x"02",x"02", -- 0x29F0 + x"02",x"02",x"02",x"40",x"41",x"41",x"00",x"41", -- 0x29F8 + x"41",x"01",x"01",x"01",x"41",x"40",x"40",x"40", -- 0x2A00 + x"02",x"82",x"82",x"80",x"80",x"80",x"81",x"80", -- 0x2A08 + x"80",x"80",x"81",x"80",x"00",x"00",x"00",x"00", -- 0x2A10 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"01", -- 0x2A18 + x"80",x"00",x"00",x"00",x"00",x"40",x"42",x"00", -- 0x2A20 + x"02",x"40",x"42",x"40",x"02",x"00",x"40",x"02", -- 0x2A28 + x"00",x"40",x"01",x"01",x"41",x"00",x"00",x"81", -- 0x2A30 + x"82",x"80",x"82",x"80",x"81",x"00",x"00",x"00", -- 0x2A38 + x"00",x"FE",x"FF",x"FE",x"FF",x"FE",x"FF",x"FE", -- 0x2A40 + x"00",x"00",x"00",x"00",x"FE",x"FF",x"FF",x"FF", -- 0x2A48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C28 + x"FF",x"FF",x"00",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2ED0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2ED8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FF8 + x"00",x"42",x"42",x"42",x"02",x"00",x"00",x"00", -- 0x3000 + x"02",x"02",x"02",x"02",x"02",x"40",x"41",x"41", -- 0x3008 + x"00",x"41",x"41",x"01",x"01",x"01",x"41",x"40", -- 0x3010 + x"40",x"40",x"02",x"82",x"82",x"80",x"80",x"80", -- 0x3018 + x"81",x"80",x"80",x"80",x"81",x"80",x"24",x"24", -- 0x3020 + x"00",x"24",x"21",x"20",x"01",x"81",x"00",x"00", -- 0x3028 + x"42",x"02",x"10",x"12",x"42",x"04",x"12",x"00", -- 0x3030 + x"40",x"68",x"18",x"00",x"00",x"00",x"6A",x"10", -- 0x3038 + x"00",x"5A",x"90",x"00",x"00",x"00",x"00",x"00", -- 0x3040 + x"80",x"01",x"80",x"00",x"00",x"00",x"00",x"40", -- 0x3048 + x"42",x"00",x"02",x"40",x"42",x"40",x"02",x"00", -- 0x3050 + x"40",x"02",x"00",x"40",x"01",x"01",x"41",x"00", -- 0x3058 + x"00",x"81",x"82",x"80",x"82",x"80",x"81",x"00", -- 0x3060 + x"82",x"00",x"80",x"24",x"A4",x"01",x"81",x"04", -- 0x3068 + x"04",x"11",x"04",x"05",x"04",x"11",x"28",x"60", -- 0x3070 + x"28",x"58",x"10",x"A4",x"00",x"40",x"10",x"1A", -- 0x3078 + x"40",x"00",x"08",x"88",x"AA",x"98",x"01",x"80", -- 0x3080 + x"FE",x"00",x"42",x"42",x"42",x"02",x"00",x"00", -- 0x3088 + x"00",x"02",x"02",x"02",x"02",x"02",x"40",x"41", -- 0x3090 + x"41",x"00",x"41",x"41",x"01",x"01",x"01",x"41", -- 0x3098 + x"40",x"40",x"40",x"02",x"82",x"82",x"80",x"80", -- 0x30A0 + x"80",x"81",x"80",x"80",x"80",x"81",x"80",x"00", -- 0x30A8 + x"82",x"00",x"80",x"24",x"A4",x"01",x"81",x"04", -- 0x30B0 + x"04",x"11",x"04",x"05",x"04",x"11",x"28",x"60", -- 0x30B8 + x"28",x"58",x"10",x"A4",x"00",x"40",x"10",x"1A", -- 0x30C0 + x"40",x"00",x"08",x"88",x"AA",x"98",x"01",x"80", -- 0x30C8 + x"FE",x"24",x"24",x"00",x"24",x"21",x"20",x"01", -- 0x30D0 + x"81",x"00",x"00",x"42",x"02",x"10",x"12",x"42", -- 0x30D8 + x"04",x"12",x"00",x"40",x"68",x"18",x"00",x"00", -- 0x30E0 + x"00",x"6A",x"10",x"50",x"5A",x"80",x"00",x"42", -- 0x30E8 + x"42",x"42",x"02",x"00",x"00",x"00",x"02",x"02", -- 0x30F0 + x"02",x"02",x"02",x"40",x"41",x"41",x"00",x"41", -- 0x30F8 + x"41",x"01",x"01",x"01",x"41",x"40",x"40",x"40", -- 0x3100 + x"02",x"82",x"82",x"80",x"80",x"80",x"81",x"80", -- 0x3108 + x"80",x"80",x"81",x"80",x"00",x"00",x"00",x"00", -- 0x3110 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"01", -- 0x3118 + x"80",x"00",x"00",x"00",x"00",x"40",x"42",x"00", -- 0x3120 + x"02",x"40",x"42",x"40",x"02",x"00",x"40",x"02", -- 0x3128 + x"00",x"40",x"01",x"01",x"41",x"00",x"00",x"81", -- 0x3130 + x"82",x"80",x"82",x"80",x"81",x"00",x"00",x"00", -- 0x3138 + x"00",x"FE",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3140 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3148 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3150 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3190 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31C8 + x"00",x"24",x"24",x"00",x"24",x"21",x"20",x"01", -- 0x31D0 + x"81",x"00",x"00",x"42",x"02",x"10",x"12",x"42", -- 0x31D8 + x"04",x"12",x"00",x"40",x"68",x"18",x"00",x"00", -- 0x31E0 + x"00",x"6A",x"10",x"50",x"5A",x"80",x"00",x"42", -- 0x31E8 + x"42",x"42",x"02",x"00",x"00",x"00",x"02",x"02", -- 0x31F0 + x"02",x"02",x"02",x"40",x"41",x"41",x"00",x"41", -- 0x31F8 + x"41",x"01",x"01",x"01",x"41",x"40",x"40",x"40", -- 0x3200 + x"02",x"82",x"82",x"80",x"80",x"80",x"81",x"80", -- 0x3208 + x"80",x"80",x"81",x"80",x"00",x"00",x"00",x"00", -- 0x3210 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"01", -- 0x3218 + x"80",x"00",x"00",x"00",x"00",x"40",x"42",x"00", -- 0x3220 + x"02",x"40",x"42",x"40",x"02",x"00",x"40",x"02", -- 0x3228 + x"00",x"40",x"01",x"01",x"41",x"00",x"00",x"81", -- 0x3230 + x"82",x"80",x"82",x"80",x"81",x"00",x"00",x"00", -- 0x3238 + x"00",x"FE",x"FF",x"FE",x"FF",x"FE",x"FF",x"FE", -- 0x3240 + x"00",x"00",x"00",x"00",x"FE",x"FF",x"FF",x"FF", -- 0x3248 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3250 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3258 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3260 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3268 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3270 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3278 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3280 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3288 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3290 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3298 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x32A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x32A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x32B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x32B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x32C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x32C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x32D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x32D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x32E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x32E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x32F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x32F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3300 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3308 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3310 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3318 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3320 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3328 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3330 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3338 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3340 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3348 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3350 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3358 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3360 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3368 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3370 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3378 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3380 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3388 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3390 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3398 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x33A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x33A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x33B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x33B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x33C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x33C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x33D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x33D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x33E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x33E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x33F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x33F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3400 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3408 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3410 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3418 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3420 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3428 + x"FF",x"FF",x"00",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3430 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3438 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3440 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3448 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3450 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3458 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3460 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3468 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3470 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3478 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3480 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3488 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3490 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3498 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x34A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x34A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x34B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x34B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x34C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x34C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x34D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x34D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x34E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x34E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x34F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x34F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3500 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3508 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3510 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3518 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3520 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3528 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3530 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3538 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3540 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3548 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3550 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3558 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3560 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3568 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3570 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3578 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3580 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3588 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3590 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3598 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3600 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3608 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3610 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3618 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3620 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3628 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3630 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3638 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3640 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3648 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3650 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3658 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3660 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3668 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3670 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3678 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3680 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3688 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3690 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3698 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3700 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3708 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3710 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3718 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3720 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3728 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3730 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3738 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3740 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3748 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3750 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3758 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3760 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3768 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3770 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3778 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3780 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3788 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3790 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3798 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37F8 + x"00",x"42",x"42",x"42",x"02",x"00",x"00",x"00", -- 0x3800 + x"02",x"02",x"02",x"02",x"02",x"40",x"41",x"41", -- 0x3808 + x"00",x"41",x"41",x"01",x"01",x"01",x"41",x"40", -- 0x3810 + x"40",x"40",x"02",x"82",x"82",x"80",x"80",x"80", -- 0x3818 + x"81",x"80",x"80",x"80",x"81",x"80",x"24",x"24", -- 0x3820 + x"00",x"24",x"21",x"20",x"01",x"81",x"00",x"00", -- 0x3828 + x"42",x"02",x"10",x"12",x"42",x"04",x"12",x"00", -- 0x3830 + x"40",x"68",x"18",x"00",x"00",x"00",x"6A",x"10", -- 0x3838 + x"00",x"5A",x"90",x"00",x"00",x"00",x"00",x"00", -- 0x3840 + x"80",x"01",x"80",x"00",x"00",x"00",x"00",x"40", -- 0x3848 + x"42",x"00",x"02",x"40",x"42",x"40",x"02",x"00", -- 0x3850 + x"40",x"02",x"00",x"40",x"01",x"01",x"41",x"00", -- 0x3858 + x"00",x"81",x"82",x"80",x"82",x"80",x"81",x"00", -- 0x3860 + x"82",x"00",x"80",x"24",x"A4",x"01",x"81",x"04", -- 0x3868 + x"04",x"11",x"04",x"05",x"04",x"11",x"28",x"60", -- 0x3870 + x"28",x"58",x"10",x"A4",x"00",x"40",x"10",x"1A", -- 0x3878 + x"40",x"00",x"08",x"88",x"AA",x"98",x"01",x"80", -- 0x3880 + x"FE",x"00",x"42",x"42",x"42",x"02",x"00",x"00", -- 0x3888 + x"00",x"02",x"02",x"02",x"02",x"02",x"40",x"41", -- 0x3890 + x"41",x"00",x"41",x"41",x"01",x"01",x"01",x"41", -- 0x3898 + x"40",x"40",x"40",x"02",x"82",x"82",x"80",x"80", -- 0x38A0 + x"80",x"81",x"80",x"80",x"80",x"81",x"80",x"00", -- 0x38A8 + x"82",x"00",x"80",x"24",x"A4",x"01",x"81",x"04", -- 0x38B0 + x"04",x"11",x"04",x"05",x"04",x"11",x"28",x"60", -- 0x38B8 + x"28",x"58",x"10",x"A4",x"00",x"40",x"10",x"1A", -- 0x38C0 + x"40",x"00",x"08",x"88",x"AA",x"98",x"01",x"80", -- 0x38C8 + x"FE",x"24",x"24",x"00",x"24",x"21",x"20",x"01", -- 0x38D0 + x"81",x"00",x"00",x"42",x"02",x"10",x"12",x"42", -- 0x38D8 + x"04",x"12",x"00",x"40",x"68",x"18",x"00",x"00", -- 0x38E0 + x"00",x"6A",x"10",x"50",x"5A",x"80",x"00",x"42", -- 0x38E8 + x"42",x"42",x"02",x"00",x"00",x"00",x"02",x"02", -- 0x38F0 + x"02",x"02",x"02",x"40",x"41",x"41",x"00",x"41", -- 0x38F8 + x"41",x"01",x"01",x"01",x"41",x"40",x"40",x"40", -- 0x3900 + x"02",x"82",x"82",x"80",x"80",x"80",x"81",x"80", -- 0x3908 + x"80",x"80",x"81",x"80",x"00",x"00",x"00",x"00", -- 0x3910 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"01", -- 0x3918 + x"80",x"00",x"00",x"00",x"00",x"40",x"42",x"00", -- 0x3920 + x"02",x"40",x"42",x"40",x"02",x"00",x"40",x"02", -- 0x3928 + x"00",x"40",x"01",x"01",x"41",x"00",x"00",x"81", -- 0x3930 + x"82",x"80",x"82",x"80",x"81",x"00",x"00",x"00", -- 0x3938 + x"00",x"FE",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3940 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3948 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3950 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3958 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3960 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3968 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3970 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3978 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3980 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3988 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3990 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3998 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39C8 + x"00",x"24",x"24",x"00",x"24",x"21",x"20",x"01", -- 0x39D0 + x"81",x"00",x"00",x"42",x"02",x"10",x"12",x"42", -- 0x39D8 + x"04",x"12",x"00",x"40",x"68",x"18",x"00",x"00", -- 0x39E0 + x"00",x"6A",x"10",x"50",x"5A",x"80",x"00",x"42", -- 0x39E8 + x"42",x"42",x"02",x"00",x"00",x"00",x"02",x"02", -- 0x39F0 + x"02",x"02",x"02",x"40",x"41",x"41",x"00",x"41", -- 0x39F8 + x"41",x"01",x"01",x"01",x"41",x"40",x"40",x"40", -- 0x3A00 + x"02",x"82",x"82",x"80",x"80",x"80",x"81",x"80", -- 0x3A08 + x"80",x"80",x"81",x"80",x"00",x"00",x"00",x"00", -- 0x3A10 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"01", -- 0x3A18 + x"80",x"00",x"00",x"00",x"00",x"40",x"42",x"00", -- 0x3A20 + x"02",x"40",x"42",x"40",x"02",x"00",x"40",x"02", -- 0x3A28 + x"00",x"40",x"01",x"01",x"41",x"00",x"00",x"81", -- 0x3A30 + x"82",x"80",x"82",x"80",x"81",x"00",x"00",x"00", -- 0x3A38 + x"00",x"FE",x"FF",x"FE",x"FF",x"FE",x"FF",x"FE", -- 0x3A40 + x"00",x"00",x"00",x"00",x"FE",x"FF",x"FF",x"FF", -- 0x3A48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3A50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3A58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3A60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3A68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3A70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3A78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3A80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3A88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3A90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3A98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3AA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3AA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3AB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3AB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3AC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3AC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3AD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3AD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3AE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3AE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3AF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3AF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3B98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3BA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3BA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3BB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3BB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3BC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3BC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3BD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3BD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3BE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3BE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3BF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3BF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C28 + x"FF",x"FF",x"00",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3C98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3CA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3CA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3CB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3CB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3CC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3CC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3CD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3CD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3CE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3CE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3CF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3CF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3ED0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3ED8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF" -- 0x3FF8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/build_id.tcl b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_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/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/build_id.v b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/build_id.v new file mode 100644 index 00000000..d4de7b4b --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180108" +`define BUILD_TIME "213440" diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c07d2629 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1093 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..6bd576cf --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..ee217402 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2026 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..679730ab --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80as.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80as.vhd new file mode 100644 index 00000000..fe477f50 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/cpu/T80as.vhd @@ -0,0 +1,283 @@ +------------------------------------------------------------------------------ +-- t80as.vhd : The non-tristate signal edition of t80a.vhd +-- +-- 2003.2.7 non-tristate modification by Tatsuyuki Satoh +-- +-- 1.separate 'D' to 'DO' and 'DI'. +-- 2.added 'DOE' to 'DO' enable signal.(data direction) +-- 3.MREQ_n,IORQ_n,RD_n,WR_n,RFSH_n,A doesn't become the condition of 'Z'. +-- +-- There is a mark of "--AS" in all the change points. +-- +------------------------------------------------------------------------------ + +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80as is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); +--AS-- D : inout std_logic_vector(7 downto 0) +--AS>> + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + DOE : out std_logic +--< 'Z'); +--AS-- D <= DO when Write = '1' and BUSAK_n_i = '1' else (others => 'Z'); +--AS>> + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DOE <= Write when BUSAK_n_i = '1' else '0'; +--< Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, +-- DInst => D, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then +--AS-- DI_Reg <= to_x01(D); +--AS>> + DI_Reg <= to_x01(DI); +--< 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/dac.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/dac.vhd new file mode 100644 index 00000000..b1ecdcb7 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_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 := 11 + ); + 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/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/dpram.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..dafe8385 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/galaxian.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/galaxian.vhd new file mode 100644 index 00000000..08fc21b3 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/galaxian.vhd @@ -0,0 +1,446 @@ +------------------------------------------------------------------------------ +-- FPGA GALAXIAN +-- +-- Version downto 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important not +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +-- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--use work.pkg_galaxian.all; + +entity galaxian is + port( + W_CLK_18M : in std_logic; + W_CLK_12M : in std_logic; + W_CLK_6M : in std_logic; + + P1_CSJUDLR : in std_logic_vector(6 downto 0); + P2_CSJUDLR : in std_logic_vector(6 downto 0); + I_RESET : in std_logic; + + W_R : out std_logic_vector(2 downto 0); + W_G : out std_logic_vector(2 downto 0); + W_B : out std_logic_vector(2 downto 0); + HBLANK : out std_logic; + VBLANK : out std_logic; + W_H_SYNC : out std_logic; + W_V_SYNC : out std_logic; + W_SDAT_A : out std_logic_vector( 7 downto 0); + W_SDAT_B : out std_logic_vector( 7 downto 0); + O_CMPBL : out std_logic + ); +end; + +architecture RTL of galaxian is + -- CPU ADDRESS BUS + signal W_A : std_logic_vector(15 downto 0) := (others => '0'); + -- CPU IF + signal W_CPU_CLK : std_logic := '0'; + signal W_CPU_MREQn : std_logic := '0'; + signal W_CPU_NMIn : std_logic := '0'; + signal W_CPU_RDn : std_logic := '0'; + signal W_CPU_RFSHn : std_logic := '0'; + signal W_CPU_WAITn : std_logic := '0'; + signal W_CPU_WRn : std_logic := '0'; + signal W_CPU_WR : std_logic := '0'; + signal W_RESETn : std_logic := '0'; + -------- H and V COUNTER ------------------------- + signal W_C_BLn : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_C_BLXn : std_logic := '0'; + signal W_H_BL : std_logic := '0'; + signal W_H_SYNC_int : std_logic := '0'; + signal W_V_BLn : std_logic := '0'; + signal W_V_BL2n : std_logic := '0'; + signal W_V_SYNC_int : std_logic := '0'; + signal W_H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal W_V_CNT : std_logic_vector(7 downto 0) := (others => '0'); + -------- CPU RAM ---------------------------- + signal W_CPU_RAM_DO : std_logic_vector(7 downto 0) := (others => '0'); + -------- ADDRESS DECDER ---------------------- + signal W_BD_G : std_logic := '0'; + signal W_CPU_RAM_CS : std_logic := '0'; + signal W_CPU_RAM_RD : std_logic := '0'; +-- signal W_CPU_RAM_WR : std_logic := '0'; + signal W_CPU_ROM_CS : std_logic := '0'; + signal W_DIP_OE : std_logic := '0'; + signal W_H_FLIP : std_logic := '0'; + signal W_DRIVER_WE : std_logic := '0'; + signal W_OBJ_RAM_RD : std_logic := '0'; + signal W_OBJ_RAM_RQ : std_logic := '0'; + signal W_OBJ_RAM_WR : std_logic := '0'; + signal W_PITCH : std_logic := '0'; + signal W_SOUND_WE : std_logic := '0'; + signal W_STARS_ON : std_logic := '0'; + signal W_STARS_OFFn : std_logic := '0'; + signal W_SW0_OE : std_logic := '0'; + signal W_SW1_OE : std_logic := '0'; + signal W_V_FLIP : std_logic := '0'; + signal W_VID_RAM_RD : std_logic := '0'; + signal W_VID_RAM_WR : std_logic := '0'; + signal W_WDR_OE : std_logic := '0'; + --------- INPORT ----------------------------- + signal W_SW_DO : std_logic_vector( 7 downto 0) := (others => '0'); + --------- VIDEO ----------------------------- + signal W_VID_DO : std_logic_vector( 7 downto 0) := (others => '0'); + ----- DATA I/F ------------------------------------- + signal W_CPU_ROM_DO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_ROM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_RAM_CLK : std_logic := '0'; + signal W_VOL1 : std_logic := '0'; + signal W_VOL2 : std_logic := '0'; + signal W_FIRE : std_logic := '0'; + signal W_HIT : std_logic := '0'; + signal W_FS : std_logic_vector( 2 downto 0) := (others => '0'); + + signal blx_comb : std_logic := '0'; + signal W_1VF : std_logic := '0'; + signal W_256HnX : std_logic := '0'; + signal W_8HF : std_logic := '0'; + signal W_DAC_A : std_logic := '0'; + signal W_DAC_B : std_logic := '0'; + signal W_MISSILEn : std_logic := '0'; + signal W_SHELLn : std_logic := '0'; + signal W_MS_D : std_logic := '0'; + signal W_MS_R : std_logic := '0'; + signal W_MS_G : std_logic := '0'; + signal W_MS_B : std_logic := '0'; + + signal new_sw : std_logic_vector( 2 downto 0) := (others => '0'); + signal in_game : std_logic_vector( 1 downto 0) := (others => '0'); + signal ROM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal rst_count : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_STARS_B : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_G : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_R : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VIDEO_B : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_G : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_R : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_WAV_A0 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A1 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A2 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D2 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_DAC : std_logic_vector( 3 downto 0) := (others => '0'); + +begin + mc_vid : entity work.MC_VIDEO + port map( + I_CLK_18M => W_CLK_18M, + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT => W_H_CNT, + I_V_CNT => W_V_CNT, + I_H_FLIP => W_H_FLIP, + I_V_FLIP => W_V_FLIP, + I_V_BLn => W_V_BLn, + I_C_BLn => W_C_BLn, + I_A => W_A(9 downto 0), + I_OBJ_SUB_A => "000", + I_BD => W_BDI, + I_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + I_OBJ_RAM_RD => W_OBJ_RAM_RD, + I_OBJ_RAM_WR => W_OBJ_RAM_WR, + I_VID_RAM_RD => W_VID_RAM_RD, + I_VID_RAM_WR => W_VID_RAM_WR, + I_DRIVER_WR => W_DRIVER_WE, + O_C_BLnX => W_C_BLnX, + O_8HF => W_8HF, + O_256HnX => W_256HnX, + O_1VF => W_1VF, + O_MISSILEn => W_MISSILEn, + O_SHELLn => W_SHELLn, + O_BD => W_VID_DO, + O_VID => W_VID, + O_COL => W_COL + ); + + cpu : entity work.T80as + port map ( + RESET_n => W_RESETn, + CLK_n => W_CPU_CLK, + WAIT_n => W_CPU_WAITn, + INT_n => '1', + NMI_n => W_CPU_NMIn, + BUSRQ_n => '1', + MREQ_n => W_CPU_MREQn, + RD_n => W_CPU_RDn, + WR_n => W_CPU_WRn, + RFSH_n => W_CPU_RFSHn, + A => W_A, + DI => W_BDO, + DO => W_BDI, + M1_n => open, + IORQ_n => open, + HALT_n => open, + BUSAK_n => open, + DOE => open + ); + + mc_cpu_ram : entity work.MC_CPU_RAM + port map ( + I_CLK => W_CPU_RAM_CLK, + I_ADDR => W_A(9 downto 0), + I_D => W_BDI, + I_WE => W_CPU_WR, + I_OE => W_CPU_RAM_RD, + O_D => W_CPU_RAM_DO + ); + + mc_adec : entity work.MC_ADEC + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_CPU_CLK => W_CPU_CLK, + I_RSTn => W_RESETn, + + I_CPU_A => W_A, + I_CPU_D => W_BDI(0), + I_MREQn => W_CPU_MREQn, + I_RFSHn => W_CPU_RFSHn, + I_RDn => W_CPU_RDn, + I_WRn => W_CPU_WRn, + I_H_BL => W_H_BL, + I_V_BLn => W_V_BLn, + + O_WAITn => W_CPU_WAITn, + O_NMIn => W_CPU_NMIn, + O_CPU_ROM_CS => W_CPU_ROM_CS, + O_CPU_RAM_RD => W_CPU_RAM_RD, +-- O_CPU_RAM_WR => W_CPU_RAM_WR, + O_CPU_RAM_CS => W_CPU_RAM_CS, + O_OBJ_RAM_RD => W_OBJ_RAM_RD, + O_OBJ_RAM_WR => W_OBJ_RAM_WR, + O_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + O_VID_RAM_RD => W_VID_RAM_RD, + O_VID_RAM_WR => W_VID_RAM_WR, + O_SW0_OE => W_SW0_OE, + O_SW1_OE => W_SW1_OE, + O_DIP_OE => W_DIP_OE, + O_WDR_OE => W_WDR_OE, + O_DRIVER_WE => W_DRIVER_WE, + O_SOUND_WE => W_SOUND_WE, + O_PITCH => W_PITCH, + O_H_FLIP => W_H_FLIP, + O_V_FLIP => W_V_FLIP, + O_BD_G => W_BD_G, + O_STARS_ON => W_STARS_ON + ); + +-- active high buttons + mc_inport : entity work.MC_INPORT + port map ( + I_COIN1 => P1_CSJUDLR(6), + I_COIN2 => P2_CSJUDLR(6), + I_1P_START => P1_CSJUDLR(5), + I_2P_START => P2_CSJUDLR(5), + I_1P_SH => P1_CSJUDLR(4), + I_2P_SH => P2_CSJUDLR(4), + I_1P_LE => P1_CSJUDLR(1), + I_2P_LE => P2_CSJUDLR(1), + I_1P_RI => P1_CSJUDLR(0), + I_2P_RI => P2_CSJUDLR(0), + I_SW0_OE => W_SW0_OE, + I_SW1_OE => W_SW1_OE, + I_DIP_OE => W_DIP_OE, + O_D => W_SW_DO + ); + + mc_hv : entity work.MC_HV_COUNT + port map( + I_CLK => W_CLK_6M, + I_RSTn => W_RESETn, + O_H_CNT => W_H_CNT, + O_H_SYNC => W_H_SYNC_int, + O_H_BL => W_H_BL, + O_V_CNT => W_V_CNT, + O_V_SYNC => W_V_SYNC_int, + O_V_BL2n => W_V_BL2n, + O_V_BLn => W_V_BLn, + O_C_BLn => W_C_BLn + ); + + mc_col_pal : entity work.MC_COL_PAL + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_VID => W_VID, + I_COL => W_COL, + I_C_BLnX => W_C_BLnX, + O_C_BLXn => W_C_BLXn, + O_STARS_OFFn => W_STARS_OFFn, + O_R => W_VIDEO_R, + O_G => W_VIDEO_G, + O_B => W_VIDEO_B + ); + + mc_stars : entity work.MC_STARS + port map ( + I_CLK_18M => W_CLK_18M, + I_CLK_6M => W_CLK_6M, + I_H_FLIP => W_H_FLIP, + I_V_SYNC => W_V_SYNC_int, + I_8HF => W_8HF, + I_256HnX => W_256HnX, + I_1VF => W_1VF, + I_2V => W_V_CNT(1), + I_STARS_ON => W_STARS_ON, + I_STARS_OFFn => W_STARS_OFFn, + O_R => W_STARS_R, + O_G => W_STARS_G, + O_B => W_STARS_B, + O_NOISE => open + ); + + mc_sound_a : entity work.MC_SOUND_A + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT1 => W_H_CNT(1), + I_BD => W_BDI, + I_PITCH => W_PITCH, + I_VOL1 => W_VOL1, + I_VOL2 => W_VOL2, + O_SDAT => W_SDAT_A, + O_DO => open + ); + + vmc_sound_b : entity work.MC_SOUND_B + port map( + I_CLK1 => W_CLK_6M, + I_RSTn => rst_count(3), + I_SW => new_sw, + I_DAC => W_DAC, + I_FS => W_FS, + O_SDAT => W_SDAT_B + ); + +--------- ROM ------------------------------------------------------- + mc_roms : entity work.ROM_PGM_0 + port map ( + CLK => W_CLK_12M, + ADDR => W_A(13 downto 0), + DATA => W_CPU_ROM_DO + ); + +-------- VIDEO ----------------------------- + blx_comb <= not ( W_C_BLXn and W_V_BL2n ); + W_V_SYNC <= not W_V_SYNC_int; + W_H_SYNC <= not W_H_SYNC_int; + O_CMPBL <= W_C_BLnX; + + -- MISSILE => Yellow ; + -- SHELL => White ; + W_MS_D <= not (W_MISSILEn and W_SHELLn); + W_MS_R <= not blx_comb and W_MS_D; + W_MS_G <= not blx_comb and W_MS_D; + W_MS_B <= not blx_comb and W_MS_D and not W_SHELLn ; + + W_R <= W_VIDEO_R or (W_STARS_R & "0") or (W_MS_R & W_MS_R & "0"); + W_G <= W_VIDEO_G or (W_STARS_G & "0") or (W_MS_G & W_MS_G & "0"); + W_B <= W_VIDEO_B or (W_STARS_B & "0") or (W_MS_B & W_MS_B & "0"); + + process(W_CLK_6M) + begin + if rising_edge(W_CLK_6M) then + HBLANK <= not W_C_BLXn; + VBLANK <= not W_V_BL2n; + end if; + end process; + + +----- CPU I/F ------------------------------------- + + W_CPU_CLK <= W_H_CNT(0); + W_CPU_RAM_CLK <= W_CLK_12M and W_CPU_RAM_CS; + + W_CPU_ROM_DOB <= W_CPU_ROM_DO when W_CPU_ROM_CS = '1' else (others=>'0'); + + W_RESETn <= not I_RESET; + W_BDO <= W_SW_DO or W_VID_DO or W_CPU_RAM_DO or W_CPU_ROM_DOB ; + W_CPU_WR <= not W_CPU_WRn; + + new_sw <= (W_FS(2) or W_FS(1) or W_FS(0)) & W_HIT & W_FIRE; + + process(W_CPU_CLK, I_RESET) + begin + if (I_RESET = '1') then + rst_count <= (others => '0'); + elsif rising_edge( W_CPU_CLK) then + if ( rst_count /= x"f") then + rst_count <= rst_count + 1; + end if; + end if; + end process; + +----- Parts 9L --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_FS <= (others=>'0'); + W_HIT <= '0'; + W_FIRE <= '0'; + W_VOL1 <= '0'; + W_VOL2 <= '0'; + elsif rising_edge(W_CLK_12M) then + if (W_SOUND_WE = '1') then + case(W_A(2 downto 0)) is + when "000" => W_FS(0) <= W_BDI(0); + when "001" => W_FS(1) <= W_BDI(0); + when "010" => W_FS(2) <= W_BDI(0); + when "011" => W_HIT <= W_BDI(0); +-- when "100" => UNUSED <= W_BDI(0); + when "101" => W_FIRE <= W_BDI(0); + when "110" => W_VOL1 <= W_BDI(0); + when "111" => W_VOL2 <= W_BDI(0); + when others => null; + end case; + end if; + end if; + end process; + +----- Parts 9M --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_DAC <= (others=>'0'); + elsif rising_edge(W_CLK_12M) then + if (W_DRIVER_WE = '1') then + case(W_A(2 downto 0)) is + -- next 4 outputs go off board via ULN2075 buffer +-- when "000" => 1P START <= W_BDI(0); +-- when "001" => 2P START <= W_BDI(0); +-- when "010" => COIN LOCK <= W_BDI(0); +-- when "011" => COIN CTR <= W_BDI(0); + when "100" => W_DAC(0) <= W_BDI(0); -- 1M + when "101" => W_DAC(1) <= W_BDI(0); -- 470K + when "110" => W_DAC(2) <= W_BDI(0); -- 220K + when "111" => W_DAC(3) <= W_BDI(0); -- 100K + when others => null; + end case; + end if; + end if; + end process; + +------------------------------------------------------------------------------- +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/hq2x.sv b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_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/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/keyboard.v b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_adec.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_adec.vhd new file mode 100644 index 00000000..7245ce8c --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_adec.vhd @@ -0,0 +1,251 @@ +--------------------------------------------------------------------- +-- FPGA GALAXIAN ADDRESS DECDER +-- +-- Version : 2.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +--------------------------------------------------------------------- +-- +--GALAXIAN Address Map +-- +-- Address Item(R..read-mode W..wight-mode) Parts +--0000 - 1FFF CPU-ROM..R ( 7H or 7K ) +--2000 - 3FFF CPU-ROM..R ( 7L ) +--4000 - 47FF CPU-RAM..RW ( 7N & 7P ) +--5000 - 57FF VID-RAM..RW +--5800 - 5FFF OBJ-RAM..RW +--6000 - SW0..R LAMP......W +--6800 - SW1..R SOUND.....W +--7000 - DIP..R +--7001 NMI_ON....W +--7004 STARS_ON..W +--7006 H_FLIP....W +--7007 V-FLIP....W +--7800 WDR..R PITCH.....W +-- +--W MODE +--6000 1P START +--6001 2P START +--6002 COIN LOCKOUT +--6003 COIN COUNTER +--6004 - 6007 SOUND CONTROL(OSC) +-- +--6800 SOUND CONTROL(FS1) +--6801 SOUND CONTROL(FS2) +--6802 SOUND CONTROL(FS3) +--6803 SOUND CONTROL(HIT) +--6805 SOUND CONTROL(SHOT) +--6806 SOUND CONTROL(VOL1) +--6807 SOUND CONTROL(VOL2) +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_ADEC is + port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_CPU_CLK : in std_logic; + I_RSTn : in std_logic; + + I_CPU_A : in std_logic_vector(15 downto 0); + I_CPU_D : in std_logic; + I_MREQn : in std_logic; + I_RFSHn : in std_logic; + I_RDn : in std_logic; + I_WRn : in std_logic; + I_H_BL : in std_logic; + I_V_BLn : in std_logic; + + O_WAITn : out std_logic; + O_NMIn : out std_logic; + O_CPU_ROM_CS : out std_logic; + O_CPU_RAM_RD : out std_logic; + O_CPU_RAM_WR : out std_logic; + O_CPU_RAM_CS : out std_logic; + O_OBJ_RAM_RD : out std_logic; + O_OBJ_RAM_WR : out std_logic; + O_OBJ_RAM_RQ : out std_logic; + O_VID_RAM_RD : out std_logic; + O_VID_RAM_WR : out std_logic; + O_SW0_OE : out std_logic; + O_SW1_OE : out std_logic; + O_DIP_OE : out std_logic; + O_WDR_OE : out std_logic; + O_DRIVER_WE : out std_logic; + O_SOUND_WE : out std_logic; + O_PITCH : out std_logic; + O_H_FLIP : out std_logic; + O_V_FLIP : out std_logic; + O_BD_G : out std_logic; + O_STARS_ON : out std_logic + ); +end; + +architecture RTL of MC_ADEC is + signal W_8E1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8E2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8P_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8M_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_9N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_NMI_ONn : std_logic := '0'; + -------- CPU WAITn ---------------------------------------------- +-- signal W_6S1_Q : std_logic := '0'; + signal W_6S1_Qn : std_logic := '0'; +-- signal W_6S2_Qn : std_logic := '0'; + + signal W_V_BL : std_logic := '0'; + +begin + W_NMI_ONn <= W_9N_Q(1); -- galaxian + +-- O_WAITn <= '1' ; -- No Wait + O_WAITn <= W_6S1_Qn; + + process(I_CPU_CLK, I_V_BLn) + begin + if (I_V_BLn = '0') then +-- W_6S1_Q <= '0'; + W_6S1_Qn <= '1'; + elsif rising_edge(I_CPU_CLK) then +-- W_6S1_Q <= not (I_H_BL or W_8P_Q(2)); + W_6S1_Qn <= I_H_BL or W_8P_Q(2); + end if; + end process; + +-- process(I_CPU_CLK) +-- begin +-- if falling_edge(I_CPU_CLK) then +-- W_6S2_Qn <= not W_6S1_Q; +-- end if; +-- end process; + +-------- CPU NMIn ----------------------------------------------- + W_V_BL <= not I_V_BLn; + process(W_V_BL, W_NMI_ONn) + begin + if (W_NMI_ONn = '0') then + O_NMIn <= '1'; + elsif rising_edge(W_V_BL) then + O_NMIn <= '0'; + end if; + end process; + + ------------------------------------------------------------------- + u_8e1 : entity work.LOGIC_74XX139 + port map ( + I_G => I_MREQn, + I_Sel(1) => I_CPU_A(15), + I_Sel(0) => I_CPU_A(14), + O_Q => W_8E1_Q + ); + + ---------- CPU_ROM CS 0000 - 3FFF --------------------------- + u_8e2 : entity work.LOGIC_74XX139 + port map ( + I_G => I_RDn, + I_Sel(1) => W_8E1_Q(0), + I_Sel(0) => I_CPU_A(13), + O_Q => W_8E2_Q + ); + + O_CPU_ROM_CS <= not (W_8E2_Q(0) and W_8E2_Q(1) ) ; -- 0000 - 3FFF + ------------------------------------------------------------------- + -- ADDRESS + -- W_8E1_Q[0] = 0000 - 3FFF ---- CPU_ROM_USE + -- W_8E1_Q[1] = 4000 - 7FFF ---- GALAXIAN USE *1 + -- W_8E1_Q[2] = 8000 - BFFF ---- MOONCREST USE + -- W_8E1_Q[3] = C000 - FFFF + + u_8p : entity work.LOGIC_74XX138 + port map ( + I_G1 => I_RFSHn, + I_G2a => W_8E1_Q(1), -- <= *1 + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8P_Q + ); + + u_8n : entity work.LOGIC_74XX138 + port map ( + I_G1 => '1', + I_G2a => I_RDn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8N_Q + ); + + u_8m : entity work.LOGIC_74XX138 + port map ( + -- I_G1 => W_6S2_Qn, + I_G1 => '1', -- No Wait + I_G2a => I_WRn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8M_Q + ); + + O_BD_G <= not (W_8E1_Q(0) and W_8P_Q(0)); + O_OBJ_RAM_RQ <= not W_8P_Q(3); + + O_CPU_RAM_CS <= not (W_8N_Q(0) and W_8M_Q(0)); + + O_WDR_OE <= not W_8N_Q(7); + O_DIP_OE <= not W_8N_Q(6); + O_SW1_OE <= not W_8N_Q(5); + O_SW0_OE <= not W_8N_Q(4); + O_OBJ_RAM_RD <= not W_8N_Q(3); + O_VID_RAM_RD <= not W_8N_Q(2); +-- UNUSED <= not W_8N_Q(1); + O_CPU_RAM_RD <= not W_8N_Q(0); + + O_PITCH <= not W_8M_Q(7); +-- STARS_ON_ENA <= not W_8M_Q(6); + O_SOUND_WE <= not W_8M_Q(5); + O_DRIVER_WE <= not W_8M_Q(4); + O_OBJ_RAM_WR <= not W_8M_Q(3); + O_VID_RAM_WR <= not W_8M_Q(2); +-- UNUSED <= not W_8M_Q(1); + O_CPU_RAM_WR <= not W_8M_Q(0); + + ----- Parts 9N --------- + + process(I_CLK_12M, I_RSTn) + begin + if (I_RSTn = '0') then + W_9N_Q <= (others => '0'); + elsif rising_edge(I_CLK_12M) then + if (W_8M_Q(6) = '0') then + case I_CPU_A(2 downto 0) is + when "000" => W_9N_Q(0) <= I_CPU_D; + when "001" => W_9N_Q(1) <= I_CPU_D; + when "010" => W_9N_Q(2) <= I_CPU_D; + when "011" => W_9N_Q(3) <= I_CPU_D; + when "100" => W_9N_Q(4) <= I_CPU_D; + when "101" => W_9N_Q(5) <= I_CPU_D; + when "110" => W_9N_Q(6) <= I_CPU_D; + when "111" => W_9N_Q(7) <= I_CPU_D; + when others => null; + end case; + end if; + end if; + end process; + + O_STARS_ON <= W_9N_Q(4); + O_H_FLIP <= W_9N_Q(6); + O_V_FLIP <= W_9N_Q(7); + +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_bram.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_bram.vhd new file mode 100644 index 00000000..a6df1ce1 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_bram.vhd @@ -0,0 +1,182 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA & GALAXIAN +-- FPGA BLOCK RAM I/F (XILINX SPARTAN) +-- +-- Version : 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- mc_col_rom(6L) added by k.Degawa +-- +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. K.Degawa +-- 2004- 9-18 added Xilinx Device K.Degawa +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_top.v use +entity MC_CPU_RAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(9 downto 0); + I_D : in std_logic_vector(7 downto 0); + I_WE : in std_logic; + I_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) + ); +end; +architecture RTL of MC_CPU_RAM is + + signal W_D : std_logic_vector(7 downto 0) := (others => '0'); +begin + O_D <= W_D when I_OE ='1' else (others=>'0'); + + ram_inst : work.spram generic map(10,8) + port map + ( + address => I_ADDR, + clock => I_CLK, + data => I_D, + wren => I_WE, + q => W_D + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_OBJ_RAM is + port( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(7 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(7 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); + end; + +architecture RTL of MC_OBJ_RAM is +begin + + ram_inst : work.dpram generic map(8,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_VID_RAM is + port ( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(9 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(9 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of MC_VID_RAM is +begin + ram_inst : work.dpram generic map(10,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_LRAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(7 downto 0); + I_D : in std_logic_vector(4 downto 0); + I_WE : in std_logic; + O_Dn : out std_logic_vector(4 downto 0) + ); +end; + +architecture RTL of MC_LRAM is + signal W_D : std_logic_vector(4 downto 0) := (others => '0'); +begin + + O_Dn <= not W_D; + + ram_inst : work.dpram generic map(8,5) + port map + ( + clock_a => I_CLK, + address_a => I_ADDR, + data_a => I_D, + wren_a => not I_WE, + + clock_b => not I_CLK, + address_b => I_ADDR, + data_b => (others => '0'), + q_b => W_D, + enable_b => '1', + wren_b => '0' + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_clocks.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_clocks.vhd new file mode 100644 index 00000000..5a4d0094 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_clocks.vhd @@ -0,0 +1,85 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA CLOCK GEN +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +----------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity CLOCKGEN is +port ( + CLKIN_IN : in std_logic; + RST_IN : in std_logic; + -- + O_CLK_24M : out std_logic; + O_CLK_18M : out std_logic; + O_CLK_12M : out std_logic; + O_CLK_06M : out std_logic +); +end; + +architecture RTL of CLOCKGEN is + signal state : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr1 : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr2 : std_logic_vector(2 downto 0) := (others => '0'); + signal CLKFB_IN : std_logic := '0'; + signal CLK0_BUF : std_logic := '0'; + signal CLKFX_BUF : std_logic := '0'; + signal CLK_72M : std_logic := '0'; + signal I_DCM_LOCKED : std_logic := '0'; + +begin + dcm_inst : DCM_SP + generic map ( + CLKFX_MULTIPLY => 9, + CLKFX_DIVIDE => 4, + CLKIN_PERIOD => 31.25 + ) + port map ( + CLKIN => CLKIN_IN, + CLKFB => CLKFB_IN, + RST => RST_IN, + CLK0 => CLK0_BUF, + CLKFX => CLKFX_BUF, + LOCKED => I_DCM_LOCKED + ); + + BUFG0 : BUFG port map (I=> CLK0_BUF, O => CLKFB_IN); + BUFG1 : BUFG port map (I=> CLKFX_BUF, O => CLK_72M); + O_CLK_06M <= ctr2(2); + O_CLK_12M <= ctr2(1); + O_CLK_24M <= ctr2(0); + O_CLK_18M <= ctr1(1); + + -- generate all clocks, 36Mhz, 18Mhz, 24Mhz, 12Mhz and 6Mhz + process(CLK_72M) + begin + if rising_edge(CLK_72M) then + if (I_DCM_LOCKED = '0') then + state <= "00"; + ctr1 <= (others=>'0'); + ctr2 <= (others=>'0'); + else + ctr1 <= ctr1 + 1; + case state is + when "00" => state <= "01"; ctr2 <= ctr2 + 1; + when "01" => state <= "10"; ctr2 <= ctr2 + 1; + when "10" => state <= "00"; + when "11" => state <= "00"; + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_col_pal.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_col_pal.vhd new file mode 100644 index 00000000..c4dc06ad --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_col_pal.vhd @@ -0,0 +1,78 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA COLOR-PALETTE +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-18 added Xilinx Device. K.Degawa +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; +-- use ieee.numeric_std.all; + +--library UNISIM; +-- use UNISIM.Vcomponents.all; + +entity MC_COL_PAL is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_VID : in std_logic_vector(1 downto 0); + I_COL : in std_logic_vector(2 downto 0); + I_C_BLnX : in std_logic; + + O_C_BLXn : out std_logic; + O_STARS_OFFn : out std_logic; + O_R : out std_logic_vector(2 downto 0); + O_G : out std_logic_vector(2 downto 0); + O_B : out std_logic_vector(2 downto 0) +); +end; + +architecture RTL of MC_COL_PAL is + --- Parts 6M -------------------------------------------------------- + signal W_COL_ROM_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6M_DI : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_DO : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_CLR : std_logic := '0'; + +begin + W_6M_DI <= I_COL(2 downto 0) & I_VID(1 downto 0) & not (I_VID(0) or I_VID(1)) & I_C_BLnX; + W_6M_CLR <= W_6M_DI(0) or W_6M_DO(0); + O_C_BLXn <= W_6M_DI(0) or W_6M_DO(0); + O_STARS_OFFn <= W_6M_DO(1); + +--always@(posedge I_CLK_6M or negedge W_6M_CLR) + process(I_CLK_6M, W_6M_CLR) + begin + if (W_6M_CLR = '0') then + W_6M_DO <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + W_6M_DO <= W_6M_DI; + end if; + end process; + + --- COL ROM -------------------------------------------------------- +--wire W_COL_ROM_OEn = W_6M_DO[1]; + + galaxian_6l : entity work.GALAXIAN_6L + port map ( + CLK => I_CLK_12M, + ADDR => W_6M_DO(6 downto 2), + DATA => W_COL_ROM_DO + ); + + --- VID OUT -------------------------------------------------------- + O_R <= W_COL_ROM_DO(2 downto 0); + O_G <= W_COL_ROM_DO(5 downto 3); + O_B <= W_COL_ROM_DO(7 downto 6) & "0"; + +end; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_hv_count.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_hv_count.vhd new file mode 100644 index 00000000..f310321b --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_hv_count.vhd @@ -0,0 +1,145 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA H & V COUNTER +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 +----------------------------------------------------------------------- +-- MoonCrest hv_count +-- H_CNT 0 - 255 , 384 - 511 Total 384 count +-- V_CNT 0 - 255 , 504 - 511 Total 264 count +------------------------------------------------------------------------------------------- +-- H_CNT[0], H_CNT[1], H_CNT[2], H_CNT[3], H_CNT[4], H_CNT[5], H_CNT[6], H_CNT[7], H_CNT[8], +-- 1 H 2 H 4 H 8 H 16 H 32 H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT[0], V_CNT[1], V_CNT[2], V_CNT[3], V_CNT[4], V_CNT[5], V_CNT[6], V_CNT[7] +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_HV_COUNT is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + O_H_CNT : out std_logic_vector(8 downto 0); + O_H_SYNC : out std_logic; + O_H_BL : out std_logic; + O_V_BL2n : out std_logic; + O_V_CNT : out std_logic_vector(7 downto 0); + O_V_SYNC : out std_logic; + O_V_BLn : out std_logic; + O_C_BLn : out std_logic + ); +end; + +architecture RTL of MC_HV_COUNT is + signal H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal V_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal H_SYNC : std_logic := '0'; + signal H_CLK : std_logic := '0'; + signal H_BL : std_logic := '0'; + signal V_BLn : std_logic := '0'; + signal V_BL2n : std_logic := '0'; + +begin +--------- H_COUNT ---------------------------------------- + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if (H_CNT = 255) then + H_CNT <= std_logic_vector(to_unsigned(384, H_CNT'length)); + else + H_CNT <= H_CNT + 1 ; + end if; + end if; + end process; + + O_H_CNT <= H_CNT; + +--------- H_SYNC ---------------------------------------- + H_CLK <= H_CNT(4); + process(H_CLK, H_CNT(8)) + begin + if (H_CNT(8) = '0') then + H_SYNC <= '0'; + elsif rising_edge(H_CLK) then + H_SYNC <= (not H_CNT(6) ) and H_CNT(5); + end if; + end process; + + O_H_SYNC <= H_SYNC; + +--------- H_BL ------------------------------------------ + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if H_CNT = 387 then + H_BL <= '1'; + elsif H_CNT = 503 then + H_BL <= '0'; + end if; + end if; + end process; + + O_H_BL <= H_BL; + +--------- V_COUNT ---------------------------------------- + process(H_SYNC, I_RSTn) + begin + if (I_RSTn = '0') then + V_CNT <= (others => '0'); + elsif rising_edge(H_SYNC) then + if (V_CNT = 255) then + V_CNT <= std_logic_vector(to_unsigned(504, V_CNT'length)); + else + V_CNT <= V_CNT + 1 ; + end if; + end if; + end process; + + O_V_CNT <= V_CNT(7 downto 0); + O_V_SYNC <= V_CNT(8); + +--------- V_BLn ------------------------------------------ + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BLn <= '0'; + elsif V_CNT(7 downto 0) = 15 then + V_BLn <= '1'; + end if; + end if; + end process; + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BL2n <= '0'; + elsif V_CNT(7 downto 0) = 16 then + V_BL2n <= '1'; + end if; + end if; + end process; + + O_V_BLn <= V_BLn; + O_V_BL2n <= V_BL2n; +------- C_BLn ------------------------------------------ + O_C_BLn <= V_BLn and (not H_CNT(8)); + +end; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_inport.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_inport.vhd new file mode 100644 index 00000000..87a5b3b1 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_inport.vhd @@ -0,0 +1,74 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA INPORT +-- +-- Version : 1.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004-4-30 galaxian modify by K.DEGAWA +----------------------------------------------------------------------- + +-- DIP SW 0 1 2 3 4 5 +----------------------------------------------------------------- +-- COIN CHUTE +-- 1 COIN/1 PLAY 1'b0 1'b0 +-- 2 COIN/1 PLAY 1'b1 1'b0 +-- 1 COIN/2 PLAY 1'b0 1'b1 +-- FREE PLAY 1'b1 1'b1 +-- BOUNS +-- 1'b0 1'b0 +-- 1'b1 1'b0 +-- 1'b0 1'b1 +-- 1'b1 1'b1 +-- LIVES +-- 2 1'b0 +-- 3 1'b1 +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_INPORT is +port ( + I_COIN1 : in std_logic; -- active high + I_COIN2 : in std_logic; -- active high + I_1P_LE : in std_logic; -- active high + I_1P_RI : in std_logic; -- active high + I_1P_SH : in std_logic; -- active high + I_2P_LE : in std_logic; + I_2P_RI : in std_logic; + I_2P_SH : in std_logic; + I_1P_START : in std_logic; -- active high + I_2P_START : in std_logic; -- active high + I_SW0_OE : in std_logic; + I_SW1_OE : in std_logic; + I_DIP_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) +); + +end; + +architecture RTL of MC_INPORT is + + constant W_TABLE : std_logic := '0'; -- UP = 0; + constant W_TEST : std_logic := '0'; + constant W_SERVICE : std_logic := '0'; + + signal W_SW0_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SW1_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_DIP_DO : std_logic_vector(7 downto 0) := (others => '0'); + +begin + + W_SW0_DO <= x"00" when I_SW0_OE = '0' else W_SERVICE & W_TEST & W_TABLE & I_1P_SH & I_1P_RI & I_1P_LE & I_COIN2 & I_COIN1; + W_SW1_DO <= x"00" when I_SW1_OE = '0' else "010" & I_2P_SH & I_2P_RI & I_2P_LE & I_2P_START & I_1P_START; + W_DIP_DO <= x"00" when I_DIP_OE = '0' else "00000000"; + O_D <= W_SW0_DO or W_SW1_DO or W_DIP_DO ; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_ld_pls.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_ld_pls.vhd new file mode 100644 index 00000000..0945fe35 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_ld_pls.vhd @@ -0,0 +1,115 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA VIDEO-LD_PLS_GEN +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_LD_PLS is + port ( + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_3D_DI : in std_logic; + + O_LDn : out std_logic; + O_CNTRLDn : out std_logic; + O_CNTRCLRn : out std_logic; + O_COLLn : out std_logic; + O_VPLn : out std_logic; + O_OBJDATALn : out std_logic; + O_MLDn : out std_logic; + O_SLDn : out std_logic + ); +end; + +architecture RTL of MC_LD_PLS is + signal W_4C1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C1_Q3 : std_logic := '0'; + signal W_4C2_B : std_logic := '0'; + signal W_4D1_G : std_logic := '0'; + signal W_4D1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4D2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_5C_Q : std_logic := '0'; + signal W_HCNT : std_logic := '0'; +begin + O_LDn <= W_4D1_G; + O_CNTRLDn <= W_4D1_Q(2); + O_CNTRCLRn <= W_4D1_Q(0); + O_COLLn <= W_4D2_Q(2); + O_VPLn <= W_4D2_Q(0); + O_OBJDATALn <= W_4C1_Q(2); + O_MLDn <= W_4C2_Q(0); + O_SLDn <= W_4C2_Q(1); + W_4D1_G <= not (I_H_CNT(0) and I_H_CNT(1) and I_H_CNT(2)); + W_HCNT <= not (I_H_CNT(6) and I_H_CNT(5) and I_H_CNT(4) and I_H_CNT(3)); + -- Parts 4D + u_4d1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_G, + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q =>W_4D1_Q + ); + + u_4d2 : entity work.LOGIC_74XX139 + port map( + I_G => W_5C_Q, + I_Sel(1) => I_H_CNT(2), + I_Sel(0) => I_H_CNT(1), + O_Q => W_4D2_Q + ); + + -- Parts 4C + u_4c1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D2_Q(1), + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q => W_4C1_Q + ); + + u_4c2 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_Q(3), + I_Sel(1) => W_4C2_B, + I_Sel(0) => W_HCNT, + O_Q => W_4C2_Q + ); + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_5C_Q <= I_H_CNT(0); + end if; + end process; + + -- 2004-9-22 added + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + W_4C1_Q3 <= W_4C1_Q(3); + end if; + end process; + + process(W_4C1_Q3) + begin + if rising_edge(W_4C1_Q3) then + W_4C2_B <= I_3D_DI; + end if; + end process; + +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_logic.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_logic.vhd new file mode 100644 index 00000000..5dae8a87 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_logic.vhd @@ -0,0 +1,92 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA LOGIC IP MODULE +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx138 +-- 3-to-8 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX138 is + port ( + I_G1 : in std_logic; + I_G2a : in std_logic; + I_G2b : in std_logic; + I_Sel : in std_logic_vector(2 downto 0); + O_Q : out std_logic_vector(7 downto 0) + ); +end logic_74xx138; + +architecture RTL of LOGIC_74XX138 is + signal I_G : std_logic_vector(2 downto 0) := (others => '0'); + +begin + I_G <= I_G1 & I_G2a & I_G2b; + + xx138 : process(I_G, I_Sel) + begin + if(I_G = "100" ) then + case I_Sel is + when "000" => O_Q <= "11111110"; + when "001" => O_Q <= "11111101"; + when "010" => O_Q <= "11111011"; + when "011" => O_Q <= "11110111"; + when "100" => O_Q <= "11101111"; + when "101" => O_Q <= "11011111"; + when "110" => O_Q <= "10111111"; + when "111" => O_Q <= "01111111"; + when others => null; + end case; + else + O_Q <= (others => '1'); + end if; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx139 +-- 2-to-4 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX139 is + port ( + I_G : in std_logic; + I_Sel : in std_logic_vector(1 downto 0); + O_Q : out std_logic_vector(3 downto 0) + ); +end; + +architecture RTL of LOGIC_74XX139 is +begin + xx139 : process (I_G, I_Sel) + begin + if I_G = '0' then + case I_Sel is + when "00" => O_Q <= "1110"; + when "01" => O_Q <= "1101"; + when "10" => O_Q <= "1011"; + when "11" => O_Q <= "0111"; + when others => null; + end case; + else + O_Q <= "1111"; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_missile.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_missile.vhd new file mode 100644 index 00000000..c5aa6633 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_missile.vhd @@ -0,0 +1,107 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA VIDEO-MISSILE +---- +---- Version : 2.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_MISSILE is + port( + I_CLK_6M : in std_logic; + I_CLK_18M : in std_logic; + I_C_BLn_X : in std_logic; + I_MLDn : in std_logic; + I_SLDn : in std_logic; + I_HPOS : in std_logic_vector (7 downto 0); + + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic + ); +end; + +architecture RTL of MC_MISSILE is + signal W_45R_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_45S_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_5P1_Q : std_logic := '0'; + signal W_5P2_Q : std_logic := '0'; + signal W_5P1_CLK : std_logic := '0'; + signal W_5P2_CLK : std_logic := '0'; +begin + + O_MISSILEn <= W_5P1_CLK; + O_SHELLn <= W_5P2_CLK; + + -- missile counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if (I_MLDn = '0') then + W_45R_Q <= I_HPOS; + else + if (I_C_BLn_X = '1') then + W_45R_Q <= W_45R_Q + 1; + if (W_45R_Q(7 downto 2) = "111111") and W_5P1_Q = '1' then + W_5P1_CLK <= '0'; + else + W_5P1_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- shell counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if(I_SLDn = '0') then + W_45S_Q <= I_HPOS; + else + if(I_C_BLn_X = '1') then + W_45S_Q <= W_45S_Q + 1; + if (W_45S_Q(7 downto 2) = "111111") and W_5P2_Q = '1' then + W_5P2_CLK <= '0'; + else + W_5P2_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_MLDn) and clock active on rising edge (W_5P1_CLK) + process(W_5P1_CLK, I_MLDn) + begin + if (I_MLDn = '0') then + W_5P1_Q <= '1'; + elsif rising_edge(W_5P1_CLK) then + W_5P1_Q <= '0'; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_SLDn) and clock active on rising edge (W_5P2_CLK) + process(W_5P2_CLK, I_SLDn) + begin + if (I_SLDn = '0') then + W_5P2_Q <= '1'; + elsif rising_edge(W_5P2_CLK) then + W_5P2_Q <= '0'; + end if; + end process; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_sound_a.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_sound_a.vhd new file mode 100644 index 00000000..ee0c66be --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_sound_a.vhd @@ -0,0 +1,117 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA SOUND I/F +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + use IEEE.std_logic_arith.all; + +entity MC_SOUND_A is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT1 : in std_logic; + I_BD : in std_logic_vector(7 downto 0); + I_PITCH : in std_logic; + I_VOL1 : in std_logic; + I_VOL2 : in std_logic; + + O_SDAT : out std_logic_vector(7 downto 0); + O_DO : out std_logic_vector(3 downto 0) +); +end; + +architecture RTL of MC_SOUND_A is + signal W_PITCH : std_logic := '0'; + signal W_89K_LDn : std_logic := '0'; + signal W_89K_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_89K_LDATA : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6T_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_SDAT0 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT2 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT3 : std_logic_vector(7 downto 0) := (others => '0'); + +begin + O_DO <= W_6T_Q; + + process (I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_PITCH <= I_PITCH; + if (W_89K_Q = x"ff") then + W_89K_LDn <= '0' ; + else + W_89K_LDn <= '1' ; + end if; + end if; + end process; + + -- Parts 9J + process (W_PITCH) + begin + if falling_edge(W_PITCH) then + W_89K_LDATA <= I_BD; + end if; + end process; + + process (I_H_CNT1) + begin + if rising_edge(I_H_CNT1) then + if (W_89K_LDn = '0') then + W_89K_Q <= W_89K_LDATA; + else + W_89K_Q <= W_89K_Q + 1; + end if; + end if; + end process; + + process (W_89K_LDn) + begin + if falling_edge(W_89K_LDn) then + W_6T_Q <= W_6T_Q + 1; + end if; + end process; + + process (I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + O_SDAT <= (x"14" + W_SDAT3) + (W_SDAT0 + W_SDAT2); + + if W_6T_Q(0)='1' then + W_SDAT0 <= x"2a"; + else + W_SDAT0 <= (others => '0'); + end if; + + if W_6T_Q(2)='1' then + if I_VOL1 = '1' then + W_SDAT2 <= x"69"; + else + W_SDAT2 <= x"39"; + end if; + else + W_SDAT2 <= (others => '0'); + end if; + + if (W_6T_Q(3)='1') and (I_VOL2 = '1') then + W_SDAT3 <= x"48" ; + else + W_SDAT3 <= (others => '0'); + end if; + + end if; + end process; + +end; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_sound_b.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_sound_b.vhd new file mode 100644 index 00000000..b74e4bb1 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_sound_b.vhd @@ -0,0 +1,253 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA WAVE SOUND +---- +---- Version : 1.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does no guarantee this program. +---- You can use this at your own risk. +---- +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--pragma translate_off +-- use ieee.std_logic_textio.all; +-- use std.textio.all; +--pragma translate_on + +entity MC_SOUND_B is + port( + I_CLK1 : in std_logic; -- 6MHz + I_RSTn : in std_logic; + I_SW : in std_logic_vector( 2 downto 0); + I_DAC : in std_logic_vector( 3 downto 0); + I_FS : in std_logic_vector( 2 downto 0); + O_SDAT : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_B is +constant sample_time : integer := 557; -- sample time : 557 = 11025Hz, 557/2 = 22050Hz +constant fire_cnt : std_logic_vector(15 downto 0) := x"2000"; +constant hit_cnt : std_logic_vector(15 downto 0) := x"2000"; + +signal sample : std_logic_vector(10 downto 0) := (others => '0'); +signal sample_pls : std_logic := '0'; +signal s0_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s0_trg : std_logic := '0'; +signal s1_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s1_trg : std_logic := '0'; +signal fire_addr : std_logic_vector(15 downto 0) := (others => '0'); +signal hit_addr : std_logic_vector(15 downto 0) := (others => '0'); + +signal WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); +signal WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + +signal W_VCO1_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO1_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal VCO_CTR : std_logic_vector(24 downto 0) := (others => '0'); + +signal SDAT : std_logic_vector(10 downto 0) := (others => '0'); + +begin + -- ideally we should divide by 5 because this is the sum of 5 channels + -- but in practice we divide by 4 and just clip sounds that are too loud. + O_SDAT <= SDAT(9 downto 2) when SDAT(10) = '0' else (others=>'1'); -- clip overrange sounds + + process(I_CLK1) + begin + if rising_edge(I_CLK1) then + SDAT <= ("000" & W_VCO3_OUT) + ( ( ("000" & W_VCO2_OUT) + ("000" & W_VCO1_OUT) ) + ( ("000" & WAV_D0) + ("000" & WAV_D1) ) ); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + sample <= (others => '0'); + sample_pls <= '0'; + elsif rising_edge(I_CLK1) then + if (sample = sample_time - 1) then + sample <= (others => '0'); + sample_pls <= '1'; + else + sample <= sample + 1; + sample_pls <= '0'; + end if; + end if; + end process; + +------------- FIRE SOUND ------------------------------------------ + mc_roms_fire : entity work.GAL_FIR + port map ( + CLK => I_CLK1, + ADDR => fire_addr(12 downto 0), + DATA => WAV_D0 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s0_trg_ff <= (others => '0'); + s0_trg <= '0'; + elsif rising_edge(I_CLK1) then + s0_trg_ff(0) <= I_SW(0); + s0_trg_ff(1) <= s0_trg_ff(0); + s0_trg <= not s0_trg_ff(1) and s0_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + fire_addr <= fire_cnt; + elsif rising_edge(I_CLK1) then + if (s0_trg = '1') then + fire_addr <= (others => '0'); + else + if(sample_pls = '1') then + if(fire_addr <= fire_cnt) then + fire_addr <= fire_addr + 1; + else + fire_addr <= fire_addr ; + end if; + end if; + end if; + end if; + end process; + +------------- HIT SOUND ------------------------------------------ + mc_roms_hit : entity work.GAL_HIT + port map ( + CLK => I_CLK1, + ADDR => hit_addr(12 downto 0), + DATA => WAV_D1 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s1_trg_ff <= (others => '0'); + s1_trg <= '0'; + elsif rising_edge(I_CLK1) then + s1_trg_ff(0) <= I_SW(1); + s1_trg_ff(1) <= s1_trg_ff(0); + s1_trg <= not s1_trg_ff(1) and s1_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + hit_addr <= hit_cnt; + elsif rising_edge(I_CLK1) then + if (s1_trg = '1') then + hit_addr <= (others => '0'); + else + if (sample_pls = '1') then + if (hit_addr <= hit_cnt) then + hit_addr <= hit_addr + 1 ; + else + hit_addr <= hit_addr ; + end if; + end if; + end if; + end if; + end process; + +--------------- EFFECT SOUND --------------------------------------- + +-- 9R modulator voltage generator based on DAC value + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + VCO_CTR <= (others=>'0'); + elsif rising_edge(I_CLK1) then + VCO_CTR <= VCO_CTR + (not I_DAC); + end if; + end process; + + -- modulator frequency lookup tables for the three VCOs + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + elsif rising_edge(I_CLK1) then + case VCO_CTR(23 downto 19) is + when "00000" => W_VCO1_STEP <= x"2A"; W_VCO2_STEP <= x"3A"; W_VCO3_STEP <= x"54"; + when "00001" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"39"; W_VCO3_STEP <= x"53"; + when "00010" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"38"; W_VCO3_STEP <= x"52"; + when "00011" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"50"; + when "00100" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"4F"; + when "00101" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"36"; W_VCO3_STEP <= x"4E"; + when "00110" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"35"; W_VCO3_STEP <= x"4D"; + when "00111" => W_VCO1_STEP <= x"26"; W_VCO2_STEP <= x"34"; W_VCO3_STEP <= x"4C"; + when "01000" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"4A"; + when "01001" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"49"; + when "01010" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"32"; W_VCO3_STEP <= x"48"; + when "01011" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"31"; W_VCO3_STEP <= x"47"; + when "01100" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"30"; W_VCO3_STEP <= x"46"; + when "01101" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"44"; + when "01110" => W_VCO1_STEP <= x"22"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"43"; + when "01111" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2E"; W_VCO3_STEP <= x"42"; + when "10000" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2D"; W_VCO3_STEP <= x"41"; + when "10001" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2C"; W_VCO3_STEP <= x"40"; + when "10010" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3F"; + when "10011" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3D"; + when "10100" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2A"; W_VCO3_STEP <= x"3C"; + when "10101" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"29"; W_VCO3_STEP <= x"3B"; + when "10110" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"3A"; + when "10111" => W_VCO1_STEP <= x"1D"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"39"; + when "11000" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"27"; W_VCO3_STEP <= x"37"; + when "11001" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"26"; W_VCO3_STEP <= x"36"; + when "11010" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"25"; W_VCO3_STEP <= x"35"; + when "11011" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"34"; + when "11100" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"33"; + when "11101" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"23"; W_VCO3_STEP <= x"32"; + when "11110" => W_VCO1_STEP <= x"19"; W_VCO2_STEP <= x"22"; W_VCO3_STEP <= x"30"; + when "11111" => W_VCO1_STEP <= x"18"; W_VCO2_STEP <= x"21"; W_VCO3_STEP <= x"2F"; + when others => null; + end case; + end if; + end process; + +-- 8R VCO 240Hz - 140Hz (8) + mc_vco1 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(0), + I_STEP => W_VCO1_STEP, + O_WAV => W_VCO1_OUT + ); + +-- 8S VCO 330Hz - 190Hz (11) + mc_vco2 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(1), + I_STEP => W_VCO2_STEP, + O_WAV => W_VCO2_OUT + ); + +-- 8T VCO 480Hz - 270Hz (16) + mc_vco3 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(2), + I_STEP => W_VCO3_STEP, + O_WAV => W_VCO3_OUT + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_sound_vco.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_sound_vco.vhd new file mode 100644 index 00000000..e2a63e85 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_sound_vco.vhd @@ -0,0 +1,49 @@ +-------------------------------------------------------------------------------- +---- FPGA VCO +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +use work.sine_package.all; + +-- O_CLK = (I_CLK / 2^20) * I_STEP +entity MC_SOUND_VCO is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + I_FS : in std_logic; + I_STEP : in std_logic_vector( 7 downto 0); + O_WAV : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_VCO is + signal VCO1_CTR : std_logic_vector(19 downto 0) := (others => '0'); + signal sine : std_logic_vector(14 downto 0) := (others => '0'); + +begin + O_WAV <= sine(14 downto 7); + process(I_CLK, I_RSTn) + begin + if (I_RSTn = '0') then + VCO1_CTR <= (others=>'0'); + elsif rising_edge(I_CLK) then + if I_FS = '1' then + VCO1_CTR <= VCO1_CTR + I_STEP; + case VCO1_CTR(19 downto 18) is + when "00" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "01" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when "10" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "11" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_stars.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_stars.vhd new file mode 100644 index 00000000..b91197b3 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_stars.vhd @@ -0,0 +1,90 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA STARS +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity MC_STARS is + port ( + I_CLK_18M : in std_logic; + I_CLK_6M : in std_logic; + I_H_FLIP : in std_logic; + I_V_SYNC : in std_logic; + I_8HF : in std_logic; + I_256HnX : in std_logic; + I_1VF : in std_logic; + I_2V : in std_logic; + I_STARS_ON : in std_logic; + I_STARS_OFFn : in std_logic; + + O_R : out std_logic_vector(1 downto 0); + O_G : out std_logic_vector(1 downto 0); + O_B : out std_logic_vector(1 downto 0); + O_NOISE : out std_logic + ); +end; + +architecture RTL of MC_STARS is + signal CLK_1C : std_logic := '0'; + signal W_2D_Qn : std_logic := '0'; + + signal W_3B : std_logic := '0'; + signal noise : std_logic := '0'; + signal W_2A : std_logic := '0'; + signal W_4P : std_logic := '0'; + signal CLK_1AB : std_logic := '0'; + signal W_1AB_Q : std_logic_vector(15 downto 0) := (others => '0'); + signal W_1C_Q : std_logic_vector( 1 downto 0) := (others => '0'); +begin + O_R <= (W_1AB_Q( 9) & W_1AB_Q (8) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_G <= (W_1AB_Q(11) & W_1AB_Q(10) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_B <= (W_1AB_Q(13) & W_1AB_Q(12) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + + CLK_1C <= not (I_CLK_18M and (not I_CLK_6M )and (not I_V_SYNC) and I_256HnX); + CLK_1AB <= not (CLK_1C or (not (I_H_FLIP or W_1C_Q(1)))); + W_3B <= W_2D_Qn xor W_1AB_Q(4); + + W_2A <= '0' when (W_1AB_Q(7 downto 0) = x"ff") else '1'; + W_4P <= not (( I_8HF xor I_1VF ) and W_2D_Qn and I_STARS_OFFn); + + O_NOISE <= noise ; + + process(I_2V) + begin + if rising_edge(I_2V) then + noise <= W_2D_Qn; + end if; + end process; + + process(CLK_1C, I_V_SYNC) + begin + if(I_V_SYNC = '1') then + W_1C_Q <= (others => '0'); + elsif rising_edge(CLK_1C) then + W_1C_Q <= W_1C_Q(0) & '1'; + end if; + end process; + + process(CLK_1AB, I_STARS_ON) + begin + if(I_STARS_ON = '0') then + W_1AB_Q <= (others => '0'); + W_2D_Qn <= '1'; + elsif rising_edge(CLK_1AB) then + W_1AB_Q <= W_1AB_Q(14 downto 0) & W_3B; + W_2D_Qn <= not W_1AB_Q(15); + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_video.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_video.vhd new file mode 100644 index 00000000..d06e75ad --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mc_video.vhd @@ -0,0 +1,433 @@ +-------------------------------------------------------------------------------- +---- FPGA GALAXIAN VIDEO +---- +---- Version : 2.50 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 4-30 galaxian modify by K.DEGAWA +---- 2004- 5- 6 first release. +---- 2004- 8-23 Improvement with T80-IP. +---- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +-------------------------------------------------------------------------------- + +------------------------------------------------------------------------------------------- +-- H_CNT(0), H_CNT(1), H_CNT(2), H_CNT(3), H_CNT(4), H_CNT(5), H_CNT(6), H_CNT(7), H_CNT(8), +-- 1 H 2 H 4 H 8 H 16 H 32H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT(0), V_CNT(1), V_CNT(2), V_CNT(3), V_CNT(4), V_CNT(5), V_CNT(6), V_CNT(7) +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_VIDEO is + port( + I_CLK_18M : in std_logic; + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_V_CNT : in std_logic_vector(7 downto 0); + I_H_FLIP : in std_logic; + I_V_FLIP : in std_logic; + I_V_BLn : in std_logic; + I_C_BLn : in std_logic; + + I_A : in std_logic_vector(9 downto 0); + I_BD : in std_logic_vector(7 downto 0); + I_OBJ_SUB_A : in std_logic_vector(2 downto 0); + I_OBJ_RAM_RQ : in std_logic; + I_OBJ_RAM_RD : in std_logic; + I_OBJ_RAM_WR : in std_logic; + I_VID_RAM_RD : in std_logic; + I_VID_RAM_WR : in std_logic; + I_DRIVER_WR : in std_logic; + + O_C_BLnX : out std_logic; + O_8HF : out std_logic; + O_256HnX : out std_logic; + O_1VF : out std_logic; + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic; + + O_BD : out std_logic_vector(7 downto 0); + O_VID : out std_logic_vector(1 downto 0); + O_COL : out std_logic_vector(2 downto 0) + ); +end; + +architecture RTL of MC_VIDEO is + + signal WB_LDn : std_logic := '0'; + signal WB_CNTRLDn : std_logic := '0'; + signal WB_CNTRCLRn : std_logic := '0'; + signal WB_COLLn : std_logic := '0'; + signal WB_VPLn : std_logic := '0'; + signal WB_OBJDATALn : std_logic := '0'; + signal WB_MLDn : std_logic := '0'; + signal WB_SLDn : std_logic := '0'; + signal W_3D : std_logic := '0'; + signal W_LDn : std_logic := '0'; + signal W_CNTRLDn : std_logic := '0'; + signal W_CNTRCLRn : std_logic := '0'; + signal W_COLLn : std_logic := '0'; + signal W_VPLn : std_logic := '0'; + signal W_OBJDATALn : std_logic := '0'; + signal W_MLDn : std_logic := '0'; + signal W_SLDn : std_logic := '0'; + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_H_POSI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_2M_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6K_Q : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_6P_Q : std_logic_vector( 6 downto 0) := (others => '0'); + signal W_45T_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2KL : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2HJ : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_RV : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_RC : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_O_OBJ_ROM_A : std_logic_vector(10 downto 0) := (others => '0'); + signal W_VID_RAM_A : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AA : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AB : std_logic_vector(11 downto 0) := (others => '0'); + signal C_2HJ : std_logic_vector( 1 downto 0) := (others => '0'); + signal C_2KL : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_CD : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_1M : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_A : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_B : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_Y : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_LRAM_DI : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_LRAM_DO : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_1H_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_1K_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_LRAM_A : std_logic_vector( 7 downto 0) := (others => '0'); +-- signal W_OBJ_RAM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_HF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_45N_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6J_Q : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DA : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DB : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_256HnX : std_logic := '0'; + signal W_2N : std_logic := '0'; + signal W_45T_CLR : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_H_FLIP1 : std_logic := '0'; + signal W_H_FLIP2 : std_logic := '0'; + signal W_H_FLIP1X : std_logic := '0'; + signal W_H_FLIP2X : std_logic := '0'; + signal W_LRAM_AND : std_logic := '0'; + signal W_RAW0 : std_logic := '0'; + signal W_RAW1 : std_logic := '0'; + signal W_RAW_OR : std_logic := '0'; + signal W_SRCLK : std_logic := '0'; + signal W_SRLD : std_logic := '0'; + signal W_VID_RAM_CS : std_logic := '0'; + signal W_CLK_6Mn : std_logic := '0'; + +begin + ld_pls : entity work.MC_LD_PLS + port map( + I_CLK_6M => I_CLK_6M, + I_H_CNT => I_H_CNT, + I_3D_DI => W_3D, + + O_LDn => WB_LDn, + O_CNTRLDn => WB_CNTRLDn, + O_CNTRCLRn => WB_CNTRCLRn, + O_COLLn => WB_COLLn, + O_VPLn => WB_VPLn, + O_OBJDATALn => WB_OBJDATALn, + O_MLDn => WB_MLDn, + O_SLDn => WB_SLDn + ); + + obj_ram : entity work.MC_OBJ_RAM + port map( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(7 downto 0), + I_WEA => I_OBJ_RAM_WR, + I_CEA => I_OBJ_RAM_RQ, + I_DA => I_BD, + O_DA => W_OBJ_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_OBJ_RAM_AB, + I_WEB => '0', + I_CEB => '1', + I_DB => x"00", + O_DB => W_OBJ_RAM_DOB + ); + + lram : entity work.MC_LRAM + port map( + I_CLK => I_CLK_18M, + I_ADDR => W_LRAM_A, + I_WE => W_CLK_6Mn, + I_D => W_LRAM_DI, + O_Dn => W_LRAM_DO + ); + + missile : entity work.MC_MISSILE + port map( + I_CLK_18M => I_CLK_18M, + I_CLK_6M => I_CLK_6M, + I_C_BLn_X => W_C_BLnX, + I_MLDn => W_MLDn, + I_SLDn => W_SLDn, + I_HPOS => W_H_POSI, + O_MISSILEn => O_MISSILEn, + O_SHELLn => O_SHELLn + ); + + vid_ram : entity work.MC_VID_RAM + port map ( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(9 downto 0), + I_DA => W_VID_RAM_DI, + I_WEA => I_VID_RAM_WR, + I_CEA => W_VID_RAM_CS, + O_DA => W_VID_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_VID_RAM_A(9 downto 0), + I_DB => x"00", + I_WEB => '0', + I_CEB => '1', + O_DB => W_VID_RAM_DOB + ); + + -- 1H VID-Rom + k_rom : entity work.GALAXIAN_1H + port map ( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1H_D + ); + + -- 1K VID-Rom + h_rom : entity work.GALAXIAN_1K + port map( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1K_D + ); + +----------------------------------------------------------------------------------- + + process(I_CLK_12M) + begin + if falling_edge(I_CLK_12M) then + W_LDn <= WB_LDn; + W_CNTRLDn <= WB_CNTRLDn; + W_CNTRCLRn <= WB_CNTRCLRn; + W_COLLn <= WB_COLLn; + W_VPLn <= WB_VPLn; + W_OBJDATALn <= WB_OBJDATALn; + W_MLDn <= WB_MLDn; + W_SLDn <= WB_SLDn; + end if; + end process; + + W_CLK_6Mn <= not I_CLK_6M; + + W_6J_DA <= I_H_FLIP & W_HF_CNT(7) & W_HF_CNT(3) & I_H_CNT(2); + W_6J_DB <= W_OBJ_D(6) & ( W_HF_CNT(3) and I_H_CNT(1) ) & I_H_CNT(2) & I_H_CNT(1); + W_6J_Q <= W_6J_DB when I_H_CNT(8) = '1' else W_6J_DA; + + W_H_FLIP1 <= (not I_H_CNT(8)) and I_H_FLIP; + + W_HF_CNT(7 downto 3) <= not I_H_CNT(7 downto 3) when W_H_FLIP1 = '1' else I_H_CNT(7 downto 3); + W_VF_CNT <= not I_V_CNT when I_V_FLIP = '1' else I_V_CNT; + + O_8HF <= W_HF_CNT(3); + O_1VF <= W_VF_CNT(0); + W_H_FLIP2 <= W_6J_Q(3); + +-- Parts 4F,5F + W_OBJ_RAM_AB <= "0" & I_H_CNT(8) & W_6J_Q(2) & W_HF_CNT(6 downto 4) & W_6J_Q(1 downto 0); +-- W_OBJ_RAM_A <= W_OBJ_RAM_AB when I_OBJ_RAM_RQ = '0' else I_A(7 downto 0) ; + + process(I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_H_POSI <= W_OBJ_RAM_DOB; + end if; + end process; + + W_OBJ_RAM_D <= W_OBJ_RAM_DOA when I_OBJ_RAM_RD = '1' else (others => '0'); + +-- Parts 4L + process(W_OBJDATALn) + begin + if rising_edge(W_OBJDATALn) then + W_OBJ_D <= W_H_POSI; + end if; + end process; + +-- Parts 4,5N + W_45N_Q <= W_VF_CNT + W_H_POSI; + W_3D <= '0' when W_45N_Q = x"FF" else '1'; + + process(W_VPLn, I_V_BLn) + begin + if (I_V_BLn = '0') then + W_2M_Q <= (others => '0'); + elsif rising_edge(W_VPLn) then + W_2M_Q <= W_45N_Q; + end if; + end process; + + W_2N <= I_H_CNT(8) and W_OBJ_D(7); + W_1M <= W_2M_Q(3 downto 0) xor (W_2N & W_2N & W_2N & W_2N); + W_VID_RAM_CS <= I_VID_RAM_RD or I_VID_RAM_WR; + W_VID_RAM_DI <= I_BD when I_VID_RAM_WR = '1' else (others => '0'); + W_VID_RAM_AA <= (not ( W_2M_Q(7) and W_2M_Q(6) and W_2M_Q(5) and W_2M_Q(4))) & (not W_VID_RAM_CS) & "0000000000"; -- I_A(9:0) + W_VID_RAM_AB <= "00" & W_2M_Q(7 downto 4) & W_1M(3) & W_HF_CNT(7 downto 3); + W_VID_RAM_A <= W_VID_RAM_AB when I_C_BLn = '1' else W_VID_RAM_AA; + W_VID_RAM_D <= W_VID_RAM_DOA when I_VID_RAM_RD = '1' else (others => '0'); + +---- VIDEO DATA OUTPUT -------------- + + O_BD <= W_OBJ_RAM_D or W_VID_RAM_D; + W_SRLD <= not (W_LDn or W_VID_RAM_A(11)); + W_OBJ_ROM_AB <= W_OBJ_D(5 downto 0) & W_1M(3) & (W_OBJ_D(6) xor I_H_CNT(3)); + W_OBJ_ROM_A <= W_OBJ_ROM_AB when I_H_CNT(8) = '1' else W_VID_RAM_DOB; + W_O_OBJ_ROM_A <= W_OBJ_ROM_A & W_1M(2 downto 0); + +----------------------------------------------------------------------------------- + + W_3L_A <= reg_2HJ(7) & reg_2KL(7) & "1" & W_SRLD; + W_3L_B <= reg_2HJ(0) & reg_2KL(0) & W_SRLD & "1"; + W_3L_Y <= W_3L_B when W_H_FLIP2X = '1' else W_3L_A; -- (3)=RAW1,(2)=RAW0 + C_2HJ <= W_3L_Y(1 downto 0); + C_2KL <= W_3L_Y(1 downto 0); + W_RAW0 <= W_3L_Y(2); + W_RAW1 <= W_3L_Y(3); + W_SRCLK <= I_CLK_6M; + +-------- PARTS 2KL ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2KL) is + when "00" => reg_2KL <= reg_2KL; + when "10" => reg_2KL <= reg_2KL(6 downto 0) & "0"; + when "01" => reg_2KL <= "0" & reg_2KL(7 downto 1); + when "11" => reg_2KL <= W_1K_D; + when others => null; + end case; + end if; + end process; + +-------- PARTS 2HJ ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2HJ) is + when "00" => reg_2HJ <= reg_2HJ; + when "10" => reg_2HJ <= reg_2HJ(6 downto 0) & "0"; + when "01" => reg_2HJ <= "0" & reg_2HJ(7 downto 1); + when "11" => reg_2HJ <= W_1H_D; + when others => null; + end case; + end if; + end process; + +------- SHT2 ----------------------------------------------------- + +-- Parts 6K + process(W_COLLn) + begin + if rising_edge(W_COLLn) then + W_6K_Q <= W_H_POSI(2 downto 0); + end if; + end process; + +-- Parts 6P + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + if (W_LDn = '0') then + W_6P_Q <= W_H_FLIP2 & W_H_FLIP1 & I_C_BLn & (not I_H_CNT(8)) & W_6K_Q(2 downto 0); + else + W_6P_Q <= W_6P_Q; + end if; + end if; + end process; + + W_H_FLIP2X <= W_6P_Q(6); + W_H_FLIP1X <= W_6P_Q(5); + W_C_BLnX <= W_6P_Q(4); + W_256HnX <= W_6P_Q(3); + W_CD <= W_6P_Q(2 downto 0); + O_256HnX <= W_256HnX; + O_C_BLnX <= W_C_BLnX; + W_45T_CLR <= W_CNTRCLRn or W_256HnX ; + + process(I_CLK_6M, W_45T_CLR) + begin + if (W_45T_CLR = '0') then + W_45T_Q <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + if (W_CNTRLDn = '0') then + W_45T_Q <= W_H_POSI; + else + W_45T_Q <= W_45T_Q + 1; + end if; + end if; + end process; + + W_LRAM_A <= (not W_45T_Q) when W_H_FLIP1X = '1' else W_45T_Q; + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_RV <= W_LRAM_DO(1 downto 0); + W_RC <= W_LRAM_DO(4 downto 2); + end if; + end process; + + W_LRAM_AND <= not (not ((W_LRAM_A(4) or W_LRAM_A(5)) or (W_LRAM_A(6) or W_LRAM_A(7))) or W_256HnX ); + W_RAW_OR <= W_RAW0 or W_RAW1 ; + + W_VID(0) <= not (not (W_RAW0 and W_RV(1)) and W_RV(0)); + W_VID(1) <= not (not (W_RAW1 and W_RV(0)) and W_RV(1)); + W_COL(0) <= not (not (W_RAW_OR and W_CD(0) and W_RC(1) and W_RC(2)) and W_RC(0)); + W_COL(1) <= not (not (W_RAW_OR and W_CD(1) and W_RC(2) and W_RC(0)) and W_RC(1)); + W_COL(2) <= not (not (W_RAW_OR and W_CD(2) and W_RC(0) and W_RC(1)) and W_RC(2)); + + O_VID <= W_VID; + O_COL <= W_COL; + + W_LRAM_DI(0) <= W_LRAM_AND and W_VID(0); + W_LRAM_DI(1) <= W_LRAM_AND and W_VID(1); + W_LRAM_DI(2) <= W_LRAM_AND and W_COL(0); + W_LRAM_DI(3) <= W_LRAM_AND and W_COL(1); + W_LRAM_DI(4) <= W_LRAM_AND and W_COL(2); + +end RTL; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mist_io.v b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_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/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/osd.v b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_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/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/pll.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d76a5e1d --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/pll.vhd @@ -0,0 +1,451 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + c3 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + clk3_divide_by : NATURAL; + clk3_duty_cycle : NATURAL; + clk3_multiply_by : NATURAL; + clk3_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire2 <= sub_wire0(3); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c3 <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 3, + clk0_duty_cycle => 50, + clk0_multiply_by => 2, + clk0_phase_shift => "0", + clk1_divide_by => 9, + clk1_duty_cycle => 50, + clk1_multiply_by => 4, + clk1_phase_shift => "0", + clk2_divide_by => 9, + clk2_duty_cycle => 50, + clk2_multiply_by => 2, + clk2_phase_shift => "0", + clk3_divide_by => 6, + clk3_duty_cycle => 50, + clk3_multiply_by => 1, + clk3_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_USED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire6, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "3" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "6" +-- 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: DUTY_CYCLE3 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "18.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "12.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "6.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "4.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 "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "4" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "18.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "12.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "6.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "4.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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 "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "3" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "4" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "6" +-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK3_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_USED" +-- 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_USED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/scandoubler.v b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..36e71ed2 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_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/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/sine_package.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/sine_package.vhd new file mode 100644 index 00000000..473caa04 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/sine_package.vhd @@ -0,0 +1,152 @@ +library ieee; +use ieee.std_logic_1164.all; + +package sine_package is + + subtype table_value_type is integer range 0 to 16383; + subtype table_index_type is std_logic_vector( 6 downto 0 ); + + function get_table_value (table_index: table_index_type) return table_value_type; + +end; + +package body sine_package is + + function get_table_value (table_index: table_index_type) return table_value_type is + variable table_value: table_value_type; + begin + case table_index is + when "0000000" => table_value := 101; + when "0000001" => table_value := 302; + when "0000010" => table_value := 503; + when "0000011" => table_value := 703; + when "0000100" => table_value := 904; + when "0000101" => table_value := 1105; + when "0000110" => table_value := 1305; + when "0000111" => table_value := 1506; + when "0001000" => table_value := 1706; + when "0001001" => table_value := 1906; + when "0001010" => table_value := 2105; + when "0001011" => table_value := 2304; + when "0001100" => table_value := 2503; + when "0001101" => table_value := 2702; + when "0001110" => table_value := 2900; + when "0001111" => table_value := 3098; + when "0010000" => table_value := 3295; + when "0010001" => table_value := 3491; + when "0010010" => table_value := 3688; + when "0010011" => table_value := 3883; + when "0010100" => table_value := 4078; + when "0010101" => table_value := 4273; + when "0010110" => table_value := 4466; + when "0010111" => table_value := 4659; + when "0011000" => table_value := 4852; + when "0011001" => table_value := 5044; + when "0011010" => table_value := 5234; + when "0011011" => table_value := 5425; + when "0011100" => table_value := 5614; + when "0011101" => table_value := 5802; + when "0011110" => table_value := 5990; + when "0011111" => table_value := 6177; + when "0100000" => table_value := 6362; + when "0100001" => table_value := 6547; + when "0100010" => table_value := 6731; + when "0100011" => table_value := 6914; + when "0100100" => table_value := 7095; + when "0100101" => table_value := 7276; + when "0100110" => table_value := 7456; + when "0100111" => table_value := 7634; + when "0101000" => table_value := 7811; + when "0101001" => table_value := 7988; + when "0101010" => table_value := 8162; + when "0101011" => table_value := 8336; + when "0101100" => table_value := 8509; + when "0101101" => table_value := 8680; + when "0101110" => table_value := 8850; + when "0101111" => table_value := 9018; + when "0110000" => table_value := 9185; + when "0110001" => table_value := 9351; + when "0110010" => table_value := 9515; + when "0110011" => table_value := 9678; + when "0110100" => table_value := 9840; + when "0110101" => table_value := 10000; + when "0110110" => table_value := 10158; + when "0110111" => table_value := 10315; + when "0111000" => table_value := 10471; + when "0111001" => table_value := 10625; + when "0111010" => table_value := 10777; + when "0111011" => table_value := 10927; + when "0111100" => table_value := 11076; + when "0111101" => table_value := 11224; + when "0111110" => table_value := 11369; + when "0111111" => table_value := 11513; + when "1000000" => table_value := 11655; + when "1000001" => table_value := 11796; + when "1000010" => table_value := 11934; + when "1000011" => table_value := 12071; + when "1000100" => table_value := 12206; + when "1000101" => table_value := 12339; + when "1000110" => table_value := 12471; + when "1000111" => table_value := 12600; + when "1001000" => table_value := 12728; + when "1001001" => table_value := 12853; + when "1001010" => table_value := 12977; + when "1001011" => table_value := 13099; + when "1001100" => table_value := 13219; + when "1001101" => table_value := 13336; + when "1001110" => table_value := 13452; + when "1001111" => table_value := 13566; + when "1010000" => table_value := 13678; + when "1010001" => table_value := 13787; + when "1010010" => table_value := 13895; + when "1010011" => table_value := 14000; + when "1010100" => table_value := 14104; + when "1010101" => table_value := 14205; + when "1010110" => table_value := 14304; + when "1010111" => table_value := 14401; + when "1011000" => table_value := 14496; + when "1011001" => table_value := 14588; + when "1011010" => table_value := 14679; + when "1011011" => table_value := 14767; + when "1011100" => table_value := 14853; + when "1011101" => table_value := 14936; + when "1011110" => table_value := 15018; + when "1011111" => table_value := 15097; + when "1100000" => table_value := 15174; + when "1100001" => table_value := 15249; + when "1100010" => table_value := 15321; + when "1100011" => table_value := 15391; + when "1100100" => table_value := 15459; + when "1100101" => table_value := 15524; + when "1100110" => table_value := 15587; + when "1100111" => table_value := 15648; + when "1101000" => table_value := 15706; + when "1101001" => table_value := 15762; + when "1101010" => table_value := 15816; + when "1101011" => table_value := 15867; + when "1101100" => table_value := 15916; + when "1101101" => table_value := 15963; + when "1101110" => table_value := 16007; + when "1101111" => table_value := 16048; + when "1110000" => table_value := 16088; + when "1110001" => table_value := 16124; + when "1110010" => table_value := 16159; + when "1110011" => table_value := 16191; + when "1110100" => table_value := 16220; + when "1110101" => table_value := 16247; + when "1110110" => table_value := 16272; + when "1110111" => table_value := 16294; + when "1111000" => table_value := 16314; + when "1111001" => table_value := 16331; + when "1111010" => table_value := 16346; + when "1111011" => table_value := 16358; + when "1111100" => table_value := 16368; + when "1111101" => table_value := 16375; + when "1111110" => table_value := 16380; + when "1111111" => table_value := 16383; + when others => null; + end case; + return table_value; + end; + +end; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/spram.vhd b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/spram.vhd new file mode 100644 index 00000000..ad6b58b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone V", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/video_mixer.sv b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..b9f7e424 --- /dev/null +++ b/Arcade/Galaxian Hardware/Catacomb_MiST/rtl/video_mixer.sv @@ -0,0 +1,243 @@ +// +// +// 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; +reg [DWIDTH:0] Rd,Gd,Bd; +always @(posedge clk_sys) {Rd,Gd,Bd} <= {R,G,B}; +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(Rd), + .g_in(Gd), + .b_in(Bd), + + .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/Arcade/Galaxian Hardware/Galaxian_MiST/Galaxian.qpf b/Arcade/Galaxian Hardware/Galaxian_MiST/Galaxian.qpf new file mode 100644 index 00000000..a6d5b3bc --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/Galaxian.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:59:16 November 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "14:59:16 November 16, 2017" + +# Revisions + +PROJECT_REVISION = "Galaxian" \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/Galaxian.qsf b/Arcade/Galaxian Hardware/Galaxian_MiST/Galaxian.qsf new file mode 100644 index 00000000..d789a9f3 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/Galaxian.qsf @@ -0,0 +1,190 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 18:12:35 November 17, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Galaxian_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80as.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_6L.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1K.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1H.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_HIT.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_FIR.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/sine_package.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Galaxian.sv +set_global_assignment -name VHDL_FILE rtl/mc_video.vhd +set_global_assignment -name VHDL_FILE rtl/mc_stars.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_vco.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_b.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_a.vhd +set_global_assignment -name VHDL_FILE rtl/mc_missile.vhd +set_global_assignment -name VHDL_FILE rtl/mc_logic.vhd +set_global_assignment -name VHDL_FILE rtl/mc_ld_pls.vhd +set_global_assignment -name VHDL_FILE rtl/mc_inport.vhd +set_global_assignment -name VHDL_FILE rtl/mc_hv_count.vhd +set_global_assignment -name VHDL_FILE rtl/mc_col_pal.vhd +set_global_assignment -name VHDL_FILE rtl/mc_bram.vhd +set_global_assignment -name VHDL_FILE rtl/mc_adec.vhd +set_global_assignment -name VHDL_FILE rtl/galaxian.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Galaxian +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Galaxian) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Galaxian) +# -------------------- +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/Galaxian.srf b/Arcade/Galaxian Hardware/Galaxian_MiST/Galaxian.srf new file mode 100644 index 00000000..14cddd5e --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/Galaxian.srf @@ -0,0 +1,54 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Clock multiplexers are found and protected" { } { } 0 19016 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169177 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169203 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/README.txt b/Arcade/Galaxian Hardware/Galaxian_MiST/README.txt new file mode 100644 index 00000000..2d3e4abb --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Galaxian port to MiST by Gehstock +-- 18 December 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Galaxian hardware +-- Copyright(c) 2004 Katsumi Degawa +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- F2 : Coin + Start 2 players +-- F1 : Coin + Start 1 player +-- SPACE : Fire +-- ARROW KEYS : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/Release/Galaxian.rbf b/Arcade/Galaxian Hardware/Galaxian_MiST/Release/Galaxian.rbf new file mode 100644 index 00000000..e2c1c682 Binary files /dev/null and b/Arcade/Galaxian Hardware/Galaxian_MiST/Release/Galaxian.rbf differ diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/clean.bat b/Arcade/Galaxian Hardware/Galaxian_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_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/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/Galaxian.sv b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/Galaxian.sv new file mode 100644 index 00000000..3d264181 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/Galaxian.sv @@ -0,0 +1,176 @@ +//============================================================================ +// Arcade: Galaxian +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Galaxian +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Galaxian;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_18, clk_12, clk_6, clk_4p5; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_18), + .c1(clk_12), + .c2(clk_6), + .c3(clk_4p5)//for now, needs a fix +); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +galaxiant galaxiant +( + .W_CLK_18M(clk_18), + .W_CLK_12M(clk_12), + .W_CLK_6M(clk_6), + .I_RESET(status[0] | status[6] | buttons[1]), + .P1_CSJUDLR({m_coin,m_start1,m_fire,m_up,m_down,m_left,m_right}), + .P2_CSJUDLR({1'b0, m_start2,m_fire,m_up,m_down,m_left,m_right}), + .W_R(r), + .W_G(g), + .W_B(b), + .W_H_SYNC(hs), + .W_V_SYNC(vs), + .HBLANK(hblank), + .VBLANK(vblank), + .W_SDAT_A(audio_a), + .W_SDAT_B(audio_b) +); + +wire [7:0] audio_a, audio_b; +wire [10:0] audio = {1'b0, audio_b, 2'b0} + {3'b0, audio_a}; + +dac dac ( + .clk_i(clk_18), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [2:0] r, g, b; +wire hblank, vblank; +wire blankn = ~(hblank | vblank); +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_18), + .ce_pix(clk_4p5), + .ce_pix_actual(clk_4p5), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn?r:"000"), + .G(blankn?g:"000"), + .B(blankn?b:"000"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_18 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_18), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GALAXIAN_1H.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GALAXIAN_1H.vhd new file mode 100644 index 00000000..2bfaccd3 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GALAXIAN_1H.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_1H is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_1H is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"02",X"02",X"FE",X"FE",X"42",X"02",X"00",X"00", + X"62",X"F2",X"BA",X"9A",X"9E",X"CE",X"46",X"00",X"8C",X"DE",X"F2",X"B2",X"92",X"86",X"04",X"00", + X"08",X"FE",X"FE",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BE",X"A2",X"A2",X"A2",X"E6",X"E4",X"00", + X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"C0",X"E0",X"B0",X"9E",X"8E",X"C0",X"C0",X"00", + X"0C",X"6E",X"9A",X"9A",X"B2",X"F2",X"6C",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00", + X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00",X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00", + X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00",X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00", + X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00",X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00", + X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00",X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00", + X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00",X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00", + X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00", + X"FC",X"FE",X"02",X"02",X"02",X"06",X"04",X"00",X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00", + X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00", + X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00", + X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00",X"7A",X"FC",X"8E",X"8A",X"82",X"FE",X"7C",X"00", + X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00",X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00", + X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00", + X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0",X"00",X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00", + X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00", + X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"C0",X"20",X"20",X"70",X"FC",X"7E",X"FC", + X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"70",X"20",X"20",X"C0",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF",X"00",X"00",X"00",X"60",X"20",X"20",X"3C",X"FE", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"FF",X"3F",X"FE",X"3C",X"20",X"20",X"60",X"00",X"00", + X"00",X"00",X"00",X"06",X"02",X"02",X"03",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0", + X"03",X"0F",X"03",X"02",X"02",X"06",X"00",X"00",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"0C",X"02",X"02",X"07",X"0F",X"07",X"0F",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"C0", + X"07",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"10",X"10",X"38",X"FE",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"38",X"10",X"10",X"30",X"00",X"00",X"00", + X"00",X"00",X"03",X"01",X"01",X"03",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"F0", + X"0F",X"03",X"01",X"01",X"03",X"00",X"00",X"00",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"01",X"0F",X"07",X"1F",X"00",X"00",X"80",X"00",X"00",X"80",X"C0",X"E0", + X"07",X"07",X"02",X"04",X"0C",X"00",X"00",X"00",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"00",X"0A",X"07",X"1F",X"0F",X"00",X"00",X"80",X"80",X"80",X"80",X"C0",X"C0", + X"07",X"0F",X"08",X"10",X"00",X"00",X"00",X"00",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"04",X"07",X"1B",X"0F",X"0F",X"00",X"00",X"40",X"60",X"C0",X"80",X"C0",X"C0", + X"0F",X"3B",X"10",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"05",X"07",X"27",X"3F",X"00",X"00",X"00",X"00",X"08",X"D8",X"E0",X"C0", + X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"05",X"02",X"07",X"2F",X"3B",X"00",X"00",X"00",X"88",X"C8",X"F0",X"C0",X"C0", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"13",X"1F",X"00",X"00",X"00",X"00",X"40",X"40",X"E4",X"FC", + X"03",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"38",X"70",X"F7",X"FF",X"00",X"00",X"FC",X"20",X"70",X"E0",X"FC",X"F0", + X"F7",X"70",X"38",X"00",X"00",X"00",X"00",X"00",X"FC",X"E0",X"70",X"20",X"FC",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"06",X"0C",X"7F",X"00",X"00",X"00",X"18",X"08",X"1C",X"FE",X"F8", + X"0C",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"1C",X"08",X"18",X"00",X"00",X"00",X"00", + X"02",X"07",X"07",X"0F",X"0F",X"0F",X"1F",X"18",X"00",X"00",X"00",X"80",X"80",X"80",X"C0",X"C0", + X"17",X"37",X"38",X"3F",X"70",X"7F",X"7F",X"00",X"40",X"60",X"E0",X"E0",X"70",X"F0",X"F0",X"00", + X"02",X"02",X"07",X"07",X"0F",X"0F",X"1F",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"00", + X"C3",X"FF",X"FF",X"7E",X"00",X"00",X"C3",X"C3",X"00",X"00",X"7E",X"FF",X"FF",X"C3",X"C3",X"C3", + X"00",X"01",X"03",X"07",X"03",X"07",X"0F",X"3F",X"80",X"80",X"D8",X"F8",X"F8",X"F0",X"F0",X"F0", + X"1F",X"1F",X"1F",X"0F",X"03",X"07",X"07",X"01",X"F8",X"F8",X"F0",X"E0",X"F8",X"FC",X"78",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"90", + X"07",X"02",X"02",X"08",X"00",X"00",X"00",X"00",X"C0",X"80",X"A0",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"04",X"24",X"04",X"4E",X"27",X"00",X"00",X"20",X"40",X"11",X"80",X"A4",X"C8", + X"07",X"03",X"25",X"00",X"08",X"00",X"00",X"00",X"C0",X"20",X"90",X"A0",X"20",X"50",X"00",X"00", + X"00",X"00",X"42",X"20",X"04",X"0F",X"E7",X"3F",X"00",X"20",X"44",X"C8",X"80",X"80",X"D0",X"EC", + X"07",X"07",X"0D",X"1D",X"29",X"42",X"01",X"00",X"C0",X"A0",X"B0",X"88",X"44",X"20",X"10",X"08", + X"07",X"08",X"08",X"08",X"07",X"00",X"09",X"0A",X"C0",X"20",X"20",X"20",X"C0",X"00",X"C0",X"20", + X"0A",X"0A",X"0E",X"00",X"00",X"0F",X"04",X"00",X"20",X"20",X"40",X"00",X"20",X"E0",X"20",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20", + X"07",X"00",X"06",X"09",X"08",X"08",X"04",X"00",X"C0",X"00",X"20",X"20",X"A0",X"60",X"20",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20", + X"07",X"00",X"08",X"0D",X"0B",X"09",X"08",X"00",X"C0",X"00",X"C0",X"20",X"20",X"20",X"20",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20", + X"07",X"00",X"06",X"09",X"09",X"09",X"06",X"00",X"C0",X"00",X"C0",X"20",X"20",X"20",X"C0",X"00", + X"1C",X"3E",X"61",X"41",X"43",X"3E",X"1C",X"00",X"01",X"01",X"7F",X"7F",X"21",X"01",X"00",X"00", + X"31",X"79",X"5D",X"4D",X"4F",X"67",X"23",X"00",X"46",X"6F",X"79",X"59",X"49",X"43",X"02",X"00", + X"04",X"7F",X"7F",X"64",X"34",X"1C",X"0C",X"00",X"0E",X"5F",X"51",X"51",X"51",X"73",X"72",X"00", + X"06",X"4F",X"49",X"49",X"69",X"3F",X"1E",X"00",X"60",X"70",X"58",X"4F",X"47",X"60",X"60",X"00", + X"06",X"37",X"4D",X"4D",X"59",X"79",X"36",X"00",X"3C",X"7E",X"4B",X"49",X"49",X"79",X"30",X"00", + X"C0",X"C0",X"C0",X"FF",X"FF",X"FF",X"00",X"00",X"DF",X"1F",X"00",X"00",X"7F",X"FF",X"FF",X"C0", + X"7F",X"FF",X"FF",X"DB",X"DB",X"DB",X"DB",X"DF",X"FF",X"C0",X"C0",X"FF",X"FF",X"FF",X"00",X"00", + X"00",X"7F",X"FF",X"FF",X"C0",X"C0",X"FF",X"FF",X"C3",X"C3",X"C3",X"C3",X"FF",X"FF",X"7E",X"00", + X"20",X"20",X"00",X"10",X"28",X"28",X"28",X"3E",X"2A",X"2A",X"2A",X"12",X"00",X"20",X"20",X"3E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00", + X"00",X"00",X"0F",X"03",X"01",X"01",X"03",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"80",X"FC", + X"03",X"01",X"01",X"03",X"0F",X"00",X"00",X"00",X"80",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"00", + X"00",X"00",X"06",X"03",X"01",X"01",X"01",X"03",X"00",X"00",X"00",X"C0",X"C0",X"E0",X"F0",X"C0", + X"00",X"03",X"03",X"07",X"1F",X"07",X"00",X"00",X"F0",X"9C",X"C0",X"E0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"80",X"E0",X"70",X"F0",X"F0",X"F8", + X"02",X"03",X"27",X"1F",X"0F",X"02",X"00",X"00",X"48",X"E0",X"98",X"CC",X"E0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"00",X"00",X"60",X"30",X"38",X"78",X"F8",X"F8", + X"03",X"27",X"3F",X"1F",X"0F",X"00",X"00",X"00",X"78",X"C8",X"A0",X"90",X"C8",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"23",X"00",X"00",X"20",X"10",X"18",X"38",X"FC",X"78", + X"33",X"1F",X"1F",X"0F",X"01",X"00",X"00",X"00",X"78",X"D8",X"48",X"20",X"B0",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"31",X"1F",X"00",X"00",X"00",X"08",X"08",X"1C",X"7C",X"7C", + X"1F",X"1F",X"06",X"02",X"00",X"00",X"00",X"00",X"F8",X"B8",X"90",X"C0",X"40",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"10",X"19",X"1F",X"00",X"00",X"00",X"00",X"04",X"04",X"4C",X"7C", + X"1F",X"0E",X"06",X"02",X"00",X"00",X"00",X"00",X"FC",X"B8",X"B0",X"A0",X"80",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04",X"00",X"03",X"04",X"08",X"10",X"21",X"20",X"80", + X"08",X"10",X"10",X"20",X"1C",X"08",X"04",X"08",X"C0",X"A1",X"07",X"01",X"38",X"70",X"F7",X"FF", + X"00",X"00",X"C3",X"2C",X"10",X"11",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"20",X"10",X"10", + X"00",X"FE",X"FF",X"FE",X"70",X"E0",X"FC",X"F0",X"08",X"08",X"14",X"14",X"28",X"48",X"10",X"20", + X"08",X"10",X"10",X"09",X"04",X"03",X"00",X"00",X"F7",X"70",X"38",X"81",X"67",X"11",X"D0",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"03",X"00",X"00",X"00",X"00",X"00", + X"FC",X"E0",X"70",X"FE",X"FF",X"FE",X"00",X"00",X"40",X"40",X"00",X"00",X"00",X"40",X"40",X"80", + X"00",X"21",X"19",X"C2",X"24",X"18",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"0D",X"02",X"04", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"02",X"62",X"27",X"10",X"E6",X"92",X"0C",X"68",X"20", + X"00",X"00",X"00",X"00",X"00",X"C0",X"61",X"13",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"12",X"04",X"F1",X"52",X"31",X"36",X"05",X"04",X"C0",X"20",X"A0",X"20",X"20",X"40",X"40",X"80", + X"05",X"04",X"02",X"01",X"00",X"01",X"01",X"01",X"C0",X"40",X"40",X"40",X"C0",X"C0",X"FC",X"8A", + X"01",X"06",X"08",X"00",X"00",X"00",X"00",X"00",X"72",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"02",X"00",X"78",X"20",X"20",X"10",X"10",X"20",X"20", + X"13",X"0F",X"E3",X"00",X"00",X"00",X"00",X"00",X"70",X"D0",X"10",X"0C",X"04",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"00",X"00",X"00",X"10",X"7C",X"FF",X"FF",X"DF", + X"03",X"07",X"07",X"09",X"0F",X"0F",X"05",X"0D",X"37",X"8F",X"C7",X"82",X"01",X"87",X"E1",X"F9", + X"00",X"00",X"00",X"00",X"00",X"0F",X"9F",X"FF",X"00",X"00",X"00",X"00",X"00",X"40",X"B8",X"78", + X"9C",X"2F",X"74",X"F8",X"F1",X"A7",X"0F",X"CF",X"70",X"60",X"F0",X"E0",X"E0",X"C0",X"C0",X"E0", + X"0E",X"07",X"07",X"0B",X"07",X"03",X"01",X"01",X"FF",X"7F",X"EF",X"F6",X"74",X"8F",X"8B",X"8E", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DF",X"77",X"23",X"03",X"03",X"03",X"00",X"00", + X"EF",X"EF",X"7F",X"2F",X"8F",X"9F",X"3F",X"7E",X"E0",X"D0",X"F0",X"F0",X"E0",X"E0",X"80",X"10", + X"6E",X"3E",X"DC",X"F8",X"F8",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"94",X"F7",X"33", + X"00",X"01",X"00",X"00",X"00",X"03",X"02",X"00",X"1A",X"8E",X"C8",X"FA",X"D6",X"33",X"7D",X"FF", + X"00",X"00",X"00",X"00",X"00",X"02",X"14",X"35",X"00",X"00",X"00",X"00",X"00",X"40",X"80",X"00", + X"24",X"28",X"49",X"DF",X"D7",X"77",X"CE",X"F8",X"00",X"00",X"00",X"00",X"80",X"80",X"20",X"00", + X"01",X"00",X"00",X"01",X"00",X"01",X"00",X"00",X"87",X"FB",X"8E",X"19",X"F7",X"63",X"42",X"9C", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"82",X"01",X"01",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"F8",X"EA",X"AE",X"79",X"DC",X"4A",X"C0",X"80",X"40",X"00",X"00",X"00",X"80",X"00", + X"40",X"70",X"58",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GALAXIAN_1K.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GALAXIAN_1K.vhd new file mode 100644 index 00000000..bf31894a --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GALAXIAN_1K.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_1K is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_1K is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"02",X"02",X"FE",X"FE",X"42",X"02",X"00",X"00", + X"62",X"F2",X"BA",X"9A",X"9E",X"CE",X"46",X"00",X"8C",X"DE",X"F2",X"B2",X"92",X"86",X"04",X"00", + X"08",X"FE",X"FE",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BE",X"A2",X"A2",X"A2",X"E6",X"E4",X"00", + X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"C0",X"E0",X"B0",X"9E",X"8E",X"C0",X"C0",X"00", + X"0C",X"6E",X"9A",X"9A",X"B2",X"F2",X"6C",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00", + X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00",X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00", + X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00",X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00", + X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00",X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00", + X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00",X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00", + X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00",X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00", + X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00", + X"FC",X"FE",X"02",X"02",X"02",X"06",X"04",X"00",X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00", + X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00", + X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00", + X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00",X"7A",X"FC",X"8E",X"8A",X"82",X"FE",X"7C",X"00", + X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00",X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00", + X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00", + X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0",X"00",X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00", + X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00", + X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"18",X"0C",X"0C",X"08",X"20",X"00",X"20", + X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"08",X"0C",X"0C",X"18",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF",X"00",X"00",X"00",X"0E",X"0C",X"08",X"00",X"10", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"FF",X"00",X"10",X"00",X"08",X"0C",X"0E",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"E0",X"C0",X"80",X"00",X"00", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"00",X"00", + X"00",X"01",X"00",X"00",X"00",X"02",X"00",X"02",X"00",X"80",X"C0",X"C0",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"06",X"04",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"04",X"06",X"07",X"03",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"30",X"70",X"60",X"40",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"60",X"70",X"30",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"38",X"70",X"60",X"00",X"00", + X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"00",X"00",X"00",X"00",X"38",X"70",X"00",X"00", + X"00",X"00",X"02",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"38",X"3C",X"00", + X"00",X"00",X"06",X"06",X"06",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"00",X"0C",X"1C",X"18",X"10",X"00",X"00",X"00",X"3C",X"1C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"00",X"04",X"0C",X"18",X"18",X"00",X"00",X"00",X"3C",X"1C",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40", + X"00",X"0E",X"1C",X"18",X"00",X"00",X"00",X"00",X"00",X"38",X"1C",X"0C",X"00",X"00",X"00",X"00", + X"00",X"01",X"07",X"01",X"00",X"00",X"07",X"00",X"00",X"FE",X"FF",X"FE",X"70",X"E0",X"FC",X"00", + X"07",X"00",X"00",X"01",X"07",X"01",X"00",X"00",X"FC",X"E0",X"70",X"FE",X"FF",X"FE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7E",X"3C",X"08",X"1C",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"1C",X"08",X"3C",X"7E",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"08",X"07",X"00",X"0F",X"00",X"00",X"7F",X"80",X"80",X"00",X"00",X"80",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"C3",X"FF",X"FF",X"7E",X"00",X"00",X"C3",X"C3",X"00",X"00",X"7E",X"FF",X"FF",X"C3",X"C3",X"C3", + X"00",X"00",X"00",X"02",X"05",X"00",X"03",X"0C",X"00",X"00",X"00",X"10",X"50",X"68",X"88",X"C8", + X"03",X"0A",X"03",X"01",X"04",X"03",X"00",X"00",X"F4",X"A0",X"C0",X"70",X"40",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"0A",X"04",X"00",X"00",X"00",X"00",X"00",X"50",X"A0",X"00",X"20", + X"00",X"09",X"01",X"02",X"00",X"00",X"00",X"00",X"38",X"10",X"00",X"40",X"20",X"00",X"00",X"00", + X"00",X"02",X"01",X"01",X"01",X"40",X"13",X"01",X"00",X"00",X"00",X"04",X"0C",X"18",X"80",X"90", + X"00",X"08",X"00",X"00",X"02",X"04",X"00",X"00",X"82",X"CC",X"00",X"10",X"98",X"84",X"00",X"00", + X"08",X"04",X"00",X"02",X"8C",X"0E",X"07",X"0F",X"01",X"12",X"00",X"04",X"00",X"C0",X"C8",X"E0", + X"07",X"03",X"21",X"00",X"80",X"21",X"48",X"81",X"C2",X"80",X"01",X"00",X"22",X"00",X"02",X"01", + X"07",X"08",X"08",X"08",X"07",X"00",X"09",X"0A",X"C0",X"20",X"20",X"20",X"C0",X"00",X"C0",X"20", + X"0A",X"0A",X"0E",X"00",X"00",X"0F",X"04",X"00",X"20",X"20",X"40",X"00",X"20",X"E0",X"20",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20", + X"07",X"00",X"06",X"09",X"08",X"08",X"04",X"00",X"C0",X"00",X"20",X"20",X"A0",X"60",X"20",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20", + X"07",X"00",X"08",X"0D",X"0B",X"09",X"08",X"00",X"C0",X"00",X"C0",X"20",X"20",X"20",X"20",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20", + X"07",X"00",X"06",X"09",X"09",X"09",X"06",X"00",X"C0",X"00",X"C0",X"20",X"20",X"20",X"C0",X"00", + X"1C",X"3E",X"61",X"41",X"43",X"3E",X"1C",X"00",X"01",X"01",X"7F",X"7F",X"21",X"01",X"00",X"00", + X"31",X"79",X"5D",X"4D",X"4F",X"67",X"23",X"00",X"46",X"6F",X"79",X"59",X"49",X"43",X"02",X"00", + X"04",X"7F",X"7F",X"64",X"34",X"1C",X"0C",X"00",X"0E",X"5F",X"51",X"51",X"51",X"73",X"72",X"00", + X"06",X"4F",X"49",X"49",X"69",X"3F",X"1E",X"00",X"60",X"70",X"58",X"4F",X"47",X"60",X"60",X"00", + X"06",X"37",X"4D",X"4D",X"59",X"79",X"36",X"00",X"3C",X"7E",X"4B",X"49",X"49",X"79",X"30",X"00", + X"C0",X"C0",X"C0",X"FF",X"FF",X"FF",X"00",X"00",X"DF",X"1F",X"00",X"00",X"7F",X"FF",X"FF",X"C0", + X"7F",X"FF",X"FF",X"DB",X"DB",X"DB",X"DB",X"DF",X"FF",X"C0",X"C0",X"FF",X"FF",X"FF",X"00",X"00", + X"00",X"7F",X"FF",X"FF",X"C0",X"C0",X"FF",X"FF",X"C3",X"C3",X"C3",X"C3",X"FF",X"FF",X"7E",X"00", + X"20",X"20",X"00",X"10",X"28",X"28",X"28",X"3E",X"2A",X"2A",X"2A",X"12",X"00",X"20",X"20",X"3E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"03",X"07",X"0F",X"1F",X"00",X"00",X"00",X"00",X"80",X"C0",X"80",X"FC", + X"0F",X"07",X"03",X"03",X"00",X"00",X"00",X"00",X"80",X"C0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"C0", + X"0F",X"0F",X"07",X"07",X"02",X"00",X"00",X"00",X"F0",X"9C",X"C0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"0F",X"00",X"00",X"00",X"00",X"40",X"E0",X"E0",X"E0", + X"07",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"C0",X"E0",X"98",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"20",X"F0",X"F0",X"F0", + X"07",X"07",X"0F",X"07",X"00",X"00",X"00",X"00",X"F0",X"C0",X"A0",X"90",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"03",X"07",X"07",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0", + X"07",X"0F",X"07",X"00",X"00",X"00",X"00",X"00",X"F0",X"D0",X"40",X"20",X"30",X"10",X"00",X"00", + X"00",X"00",X"00",X"01",X"03",X"03",X"07",X"0F",X"00",X"00",X"00",X"00",X"C0",X"F0",X"F8",X"F0", + X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"B0",X"90",X"C0",X"40",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"0F",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F8",X"F8", + X"07",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"A0",X"80",X"80",X"80",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"08",X"00", + X"07",X"0E",X"0C",X"04",X"0C",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"81",X"87",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"30",X"60",X"40",X"C0", + X"00",X"04",X"06",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"60",X"00",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00", + X"02",X"E6",X"7C",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"40",X"20",X"10",X"08",X"04",X"02",X"00",X"10",X"08",X"08",X"1C",X"0C",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"70",X"06",X"02",X"00",X"60",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"00",X"04",X"08",X"18",X"30",X"20",X"E0",X"40", + X"00",X"00",X"71",X"12",X"11",X"16",X"04",X"04",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"70", + X"31",X"08",X"00",X"00",X"00",X"00",X"01",X"01",X"C0",X"00",X"00",X"00",X"40",X"C0",X"78",X"00", + X"01",X"06",X"0C",X"08",X"08",X"10",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0A",X"0F",X"03",X"38",X"1E",X"00",X"00",X"00",X"00",X"00",X"80", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"B0",X"30",X"30",X"1C",X"0C",X"04",X"02",X"00", + X"00",X"80",X"40",X"30",X"08",X"05",X"07",X"03",X"80",X"40",X"20",X"10",X"6C",X"90",X"0E",X"21", + X"01",X"01",X"03",X"06",X"04",X"04",X"1B",X"3A",X"48",X"38",X"0E",X"1F",X"0F",X"07",X"01",X"D9", + X"00",X"00",X"00",X"00",X"00",X"06",X"04",X"09",X"01",X"02",X"06",X"0C",X"38",X"70",X"58",X"AC", + X"D3",X"C6",X"87",X"6B",X"F4",X"A4",X"08",X"CC",X"C8",X"D0",X"10",X"40",X"80",X"80",X"00",X"CF", + X"C5",X"02",X"00",X"06",X"02",X"01",X"00",X"02",X"3F",X"8F",X"07",X"02",X"08",X"15",X"C7",X"F5", + X"02",X"06",X"0C",X"18",X"30",X"20",X"40",X"00",X"74",X"22",X"01",X"00",X"02",X"04",X"08",X"10", + X"EF",X"EE",X"79",X"28",X"84",X"91",X"0B",X"15",X"98",X"30",X"20",X"20",X"C0",X"00",X"40",X"F8", + X"94",X"C4",X"28",X"D0",X"30",X"00",X"00",X"00",X"70",X"08",X"04",X"02",X"01",X"00",X"00",X"00", + X"00",X"80",X"60",X"10",X"0C",X"07",X"03",X"01",X"20",X"20",X"10",X"10",X"08",X"9C",X"FF",X"FF", + X"10",X"0D",X"03",X"01",X"00",X"03",X"07",X"FF",X"FF",X"FF",X"FB",X"FB",X"F7",X"E1",X"F0",X"E0", + X"00",X"00",X"40",X"41",X"42",X"46",X"DC",X"FD",X"00",X"02",X"04",X"18",X"20",X"60",X"C0",X"80", + X"FF",X"FF",X"FF",X"FF",X"C7",X"03",X"07",X"00",X"80",X"04",X"18",X"20",X"C0",X"80",X"E0",X"FF", + X"01",X"00",X"00",X"01",X"03",X"0F",X"18",X"60",X"80",X"F0",X"F0",X"F8",X"FC",X"7D",X"7F",X"FF", + X"01",X"03",X"04",X"08",X"10",X"20",X"40",X"00",X"E7",X"83",X"01",X"01",X"00",X"00",X"00",X"00", + X"0F",X"00",X"00",X"0B",X"0E",X"07",X"FF",X"FB",X"C0",X"00",X"40",X"C0",X"38",X"0C",X"80",X"80", + X"F8",X"F8",X"DC",X"8C",X"86",X"82",X"82",X"80",X"C0",X"60",X"20",X"10",X"08",X"04",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GALAXIAN_6L.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GALAXIAN_6L.vhd new file mode 100644 index 00000000..2f811f7d --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GALAXIAN_6L.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_6L is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_6L is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"F6",X"00",X"16",X"C0",X"3F",X"00",X"D8",X"07",X"3F",X"00",X"C0",X"C4",X"07", + X"00",X"C0",X"A0",X"07",X"00",X"00",X"00",X"07",X"00",X"F6",X"07",X"F0",X"00",X"76",X"07",X"C6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GAL_FIR.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GAL_FIR.vhd new file mode 100644 index 00000000..5aff2022 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GAL_FIR.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_FIR 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 prom of GAL_FIR is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AC",X"68",X"72",X"C7",X"93",X"3F",X"80",X"C8",X"5C",X"A1",X"22",X"90",X"B9",X"8A",X"41",X"62", + X"C2",X"A1",X"40",X"6A",X"C9",X"7F",X"64",X"3C",X"BC",X"AD",X"5B",X"4C",X"D4",X"62",X"3D",X"D3", + X"7F",X"31",X"A3",X"BE",X"5D",X"49",X"C7",X"7D",X"28",X"C0",X"A1",X"7A",X"7D",X"2B",X"C9",X"91", + X"80",X"6B",X"39",X"95",X"BA",X"91",X"27",X"C1",X"91",X"7E",X"6D",X"31",X"C0",X"A4",X"7C",X"7B", + X"37",X"80",X"CB",X"7E",X"88",X"64",X"40",X"8F",X"C3",X"83",X"83",X"68",X"36",X"D0",X"8C",X"29", + X"B4",X"B1",X"52",X"4B",X"E9",X"3E",X"74",X"C4",X"73",X"81",X"2B",X"AD",X"B9",X"4E",X"4B",X"CB", + X"91",X"76",X"33",X"B6",X"A5",X"6E",X"4A",X"63",X"D7",X"7C",X"3E",X"7E",X"DE",X"45",X"67",X"C1", + X"84",X"2D",X"A8",X"A9",X"20",X"AC",X"B5",X"7E",X"47",X"5F",X"DD",X"6E",X"44",X"BD",X"97",X"22", + X"AE",X"A4",X"25",X"CB",X"93",X"77",X"3C",X"78",X"CB",X"83",X"29",X"B3",X"AB",X"7D",X"5D",X"44", + X"A4",X"BC",X"79",X"8C",X"3A",X"76",X"CF",X"78",X"44",X"6B",X"D9",X"6B",X"3B",X"9A",X"CC",X"26", + X"A4",X"A3",X"1D",X"BA",X"A9",X"83",X"71",X"3A",X"8B",X"CC",X"6A",X"3E",X"E5",X"28",X"A4",X"A3", + X"1E",X"C9",X"9C",X"78",X"32",X"94",X"C4",X"74",X"88",X"2A",X"A2",X"BC",X"1A",X"E2",X"4B",X"86", + X"B3",X"72",X"48",X"68",X"D2",X"83",X"32",X"A4",X"B2",X"73",X"4E",X"5A",X"C8",X"9C",X"2C",X"90", + X"C1",X"7B",X"5E",X"41",X"CC",X"99",X"6F",X"3A",X"8B",X"C9",X"7A",X"84",X"23",X"BC",X"9D",X"33", + X"CC",X"82",X"24",X"D7",X"6C",X"47",X"D1",X"87",X"5C",X"41",X"C5",X"9F",X"71",X"35",X"A8",X"B9", + X"67",X"4F",X"5F",X"CE",X"8A",X"43",X"C6",X"80",X"54",X"4A",X"B1",X"AE",X"87",X"50",X"4F",X"C6", + X"9F",X"55",X"45",X"BB",X"AC",X"5C",X"41",X"A9",X"BE",X"5C",X"4C",X"72",X"D4",X"71",X"42",X"DA", + X"20",X"CF",X"6C",X"3D",X"D5",X"8A",X"78",X"39",X"7B",X"BF",X"99",X"75",X"37",X"99",X"C7",X"28", + X"7B",X"C3",X"91",X"58",X"46",X"9D",X"BB",X"88",X"60",X"40",X"9A",X"BB",X"8C",X"3B",X"6A",X"BA", + X"AC",X"31",X"7F",X"C8",X"2F",X"78",X"DC",X"33",X"AE",X"80",X"34",X"EE",X"38",X"74",X"D5",X"1F", + X"98",X"BA",X"82",X"58",X"4A",X"D6",X"86",X"56",X"49",X"F0",X"34",X"73",X"BD",X"9A",X"43",X"67", + X"C3",X"8D",X"2E",X"8B",X"B9",X"40",X"C6",X"33",X"B7",X"A5",X"27",X"8A",X"BA",X"42",X"BF",X"8A", + X"3A",X"6F",X"D1",X"5C",X"41",X"DF",X"6A",X"42",X"C3",X"A4",X"33",X"80",X"CC",X"5C",X"43",X"89", + X"BE",X"96",X"53",X"4E",X"8D",X"D4",X"2E",X"BD",X"56",X"6C",X"DA",X"53",X"47",X"9C",X"C8",X"2A", + X"75",X"B3",X"B0",X"2F",X"80",X"CA",X"2B",X"81",X"CD",X"35",X"7E",X"CE",X"32",X"81",X"CD",X"74", + X"40",X"74",X"D8",X"4E",X"58",X"D3",X"85",X"4D",X"53",X"AE",X"B8",X"61",X"3D",X"9F",X"C3",X"30", + X"86",X"D0",X"5E",X"47",X"7D",X"C6",X"91",X"4E",X"4E",X"A9",X"B9",X"6D",X"34",X"9F",X"B7",X"3F", + X"C6",X"7A",X"37",X"81",X"C5",X"8C",X"33",X"88",X"D3",X"44",X"59",X"82",X"C8",X"88",X"42",X"61", + X"AF",X"A2",X"44",X"D9",X"48",X"52",X"89",X"BC",X"99",X"2E",X"7E",X"B4",X"38",X"B7",X"9E",X"20", + X"E4",X"56",X"63",X"D9",X"56",X"43",X"B1",X"B8",X"37",X"6B",X"D3",X"6D",X"31",X"C8",X"65",X"8D", + X"B9",X"0B",X"BA",X"86",X"4D",X"D7",X"4E",X"4B",X"E7",X"3C",X"95",X"AD",X"1D",X"D8",X"72",X"35", + X"B4",X"A5",X"2F",X"B3",X"B6",X"44",X"57",X"93",X"CB",X"67",X"3F",X"A1",X"C7",X"21",X"89",X"9C", + X"5A",X"D8",X"20",X"A3",X"BA",X"25",X"89",X"AD",X"37",X"D8",X"5D",X"53",X"DC",X"77",X"43",X"70", + X"E1",X"46",X"59",X"83",X"CC",X"6E",X"37",X"E7",X"56",X"4E",X"86",X"D3",X"27",X"9E",X"AA",X"44", + X"C0",X"19",X"E9",X"54",X"63",X"DB",X"51",X"4D",X"88",X"CF",X"30",X"91",X"C5",X"66",X"35",X"C1", + X"9C",X"33",X"79",X"A7",X"BA",X"53",X"41",X"DD",X"4B",X"73",X"D2",X"25",X"7F",X"BB",X"9D",X"37", + X"68",X"A9",X"BD",X"3B",X"5C",X"CF",X"61",X"47",X"C9",X"9E",X"47",X"55",X"AF",X"96",X"5D",X"D0", + X"28",X"7E",X"D3",X"48",X"51",X"C7",X"95",X"21",X"BB",X"A6",X"3A",X"67",X"C3",X"81",X"37",X"DE", + X"7D",X"3F",X"72",X"AA",X"B4",X"15",X"DC",X"6C",X"47",X"D2",X"71",X"28",X"EB",X"2E",X"9F",X"93", + X"6C",X"9C",X"37",X"DB",X"43",X"AC",X"37",X"D3",X"4F",X"AC",X"8D",X"1B",X"DF",X"7E",X"46",X"6B", + X"BA",X"A5",X"35",X"73",X"CB",X"41",X"7E",X"C8",X"1D",X"D3",X"60",X"5F",X"DB",X"44",X"57",X"C2", + X"A2",X"41",X"5B",X"AE",X"96",X"5E",X"CC",X"10",X"CF",X"83",X"31",X"DF",X"59",X"46",X"CC",X"87", + X"28",X"D7",X"84",X"3D",X"7A",X"DD",X"3A",X"7B",X"C8",X"36",X"66",X"C8",X"60",X"9A",X"8F",X"29", + X"A8",X"B3",X"83",X"1F",X"D6",X"81",X"33",X"C4",X"82",X"2A",X"D4",X"6B",X"70",X"CA",X"1B",X"A9", + X"AB",X"22",X"AE",X"9E",X"49",X"D3",X"45",X"5A",X"A1",X"BB",X"70",X"27",X"E9",X"49",X"72",X"CC", + X"38",X"67",X"B6",X"AD",X"41",X"57",X"B7",X"8C",X"39",X"E4",X"70",X"4B",X"63",X"C7",X"52",X"AE", + X"8A",X"36",X"8A",X"BB",X"8E",X"2F",X"87",X"AB",X"B2",X"2D",X"72",X"94",X"CD",X"39",X"67",X"D9", + X"2B",X"86",X"C8",X"50",X"4D",X"BC",X"A1",X"3F",X"6B",X"BC",X"7C",X"48",X"E0",X"20",X"BA",X"83", + X"43",X"D4",X"26",X"BD",X"A2",X"3E",X"6C",X"CA",X"8A",X"38",X"7B",X"AF",X"AE",X"23",X"91",X"C0", + X"37",X"76",X"A3",X"C2",X"39",X"63",X"D9",X"48",X"5A",X"93",X"C9",X"43",X"62",X"90",X"B1",X"37", + X"D1",X"53",X"74",X"B1",X"37",X"F6",X"23",X"82",X"C3",X"52",X"4A",X"BB",X"75",X"95",X"88",X"3D", + X"90",X"C3",X"76",X"3B",X"87",X"A9",X"70",X"A6",X"61",X"4F",X"AE",X"B6",X"50",X"4B",X"E2",X"4A", + X"63",X"DC",X"3E",X"63",X"92",X"CC",X"4F",X"4D",X"E3",X"4A",X"5B",X"89",X"D0",X"47",X"5E",X"90", + X"D0",X"49",X"5B",X"7E",X"C6",X"76",X"3E",X"8C",X"AA",X"A4",X"15",X"CD",X"89",X"43",X"80",X"BD", + X"65",X"A8",X"3D",X"8E",X"CF",X"0B",X"C0",X"8E",X"46",X"76",X"C9",X"7A",X"3E",X"88",X"AA",X"A8", + X"18",X"BF",X"9C",X"2E",X"C3",X"85",X"2B",X"DC",X"6C",X"45",X"DB",X"4B",X"5F",X"92",X"AD",X"3D", + X"C3",X"4F",X"86",X"A6",X"75",X"81",X"36",X"E7",X"37",X"A6",X"7D",X"A5",X"5A",X"58",X"D8",X"4E", + X"56",X"AB",X"8E",X"49",X"DD",X"68",X"40",X"8A",X"B0",X"53",X"C3",X"4F",X"60",X"92",X"C6",X"51", + X"54",X"9A",X"C5",X"55",X"4D",X"93",X"C2",X"70",X"2F",X"E3",X"50",X"5B",X"8D",X"AF",X"48",X"AA", + X"81",X"98",X"4C",X"65",X"C1",X"66",X"BB",X"23",X"B0",X"9B",X"39",X"83",X"A4",X"B3",X"1A",X"B0", + X"9D",X"31",X"C3",X"8E",X"2B",X"E2",X"54",X"5A",X"DC",X"32",X"86",X"CA",X"14",X"C9",X"83",X"43", + X"83",X"AD",X"A6",X"15",X"DA",X"6D",X"4C",X"87",X"AF",X"63",X"B9",X"3A",X"8C",X"C5",X"0D",X"CC", + X"79",X"58",X"74",X"C9",X"7D",X"42",X"7C",X"B7",X"5C",X"A9",X"7B",X"41",X"93",X"B6",X"81",X"32", + X"9D",X"92",X"6B",X"87",X"9D",X"94",X"4A",X"6C",X"B7",X"A4",X"1B",X"BD",X"88",X"4D",X"7D",X"BD", + X"4D",X"99",X"8A",X"51",X"CF",X"1B",X"F2",X"56",X"5A",X"72",X"C3",X"4B",X"BE",X"63",X"52",X"E1", + X"2F",X"77",X"91",X"93",X"52",X"C0",X"37",X"E1",X"53",X"5A",X"DA",X"35",X"77",X"85",X"D5",X"39", + X"6D",X"80",X"D3",X"50",X"58",X"D3",X"2D",X"9A",X"B2",X"23",X"BC",X"8C",X"52",X"71",X"C1",X"8D", + X"3E",X"76",X"B3",X"6F",X"6D",X"A1",X"49",X"C9",X"2E",X"D1",X"38",X"C6",X"55",X"8B",X"7C",X"86", + X"B2",X"33",X"7E",X"AD",X"99",X"3C",X"80",X"A3",X"6E",X"88",X"98",X"50",X"AA",X"79",X"99",X"27", + X"FB",X"1D",X"AE",X"63",X"8F",X"94",X"51",X"B0",X"4A",X"AD",X"86",X"8B",X"39",X"EA",X"1B",X"AB", + X"9A",X"4C",X"73",X"B8",X"9A",X"3A",X"76",X"AC",X"64",X"88",X"8B",X"6D",X"A6",X"71",X"97",X"40", + X"8C",X"B5",X"4A",X"A0",X"68",X"86",X"8C",X"98",X"69",X"59",X"DE",X"1F",X"AB",X"A0",X"36",X"A8", + X"A7",X"28",X"E0",X"58",X"59",X"CE",X"37",X"82",X"C8",X"2E",X"A4",X"5A",X"AF",X"62",X"8E",X"C2", + X"2D",X"79",X"91",X"C2",X"2A",X"96",X"77",X"8A",X"99",X"8E",X"3D",X"C7",X"61",X"57",X"9D",X"A3", + X"44",X"DE",X"34",X"88",X"B1",X"37",X"89",X"A3",X"B3",X"15",X"CB",X"73",X"43",X"BA",X"8D",X"47", + X"9D",X"6F",X"C9",X"15",X"D1",X"72",X"53",X"CA",X"48",X"6B",X"9B",X"89",X"6A",X"A0",X"57",X"BE", + X"45",X"9C",X"A5",X"5E",X"54",X"CA",X"63",X"52",X"E1",X"25",X"AE",X"93",X"35",X"E5",X"2A",X"A5", + X"97",X"40",X"8A",X"9A",X"73",X"81",X"8E",X"57",X"CC",X"68",X"67",X"5D",X"C5",X"94",X"43",X"6E", + X"AA",X"A8",X"30",X"9D",X"6E",X"B3",X"6B",X"4B",X"AB",X"79",X"90",X"93",X"50",X"89",X"81",X"8A", + X"A4",X"42",X"9B",X"7F",X"67",X"9F",X"A8",X"48",X"80",X"BA",X"23",X"C5",X"6A",X"5E",X"91",X"99", + X"62",X"9A",X"91",X"6A",X"5A",X"D9",X"3D",X"81",X"B2",X"34",X"C5",X"7A",X"3F",X"BB",X"90",X"3D", + X"D0",X"50",X"65",X"95",X"94",X"63",X"C6",X"2D",X"A6",X"91",X"3D",X"CA",X"5F",X"66",X"91",X"97", + X"A6",X"35",X"A6",X"97",X"2E",X"D9",X"41",X"8F",X"A4",X"3E",X"A2",X"B0",X"2E",X"B5",X"7A",X"55", + X"C9",X"3F",X"84",X"C3",X"42",X"8A",X"72",X"9F",X"65",X"95",X"72",X"84",X"8A",X"58",X"C6",X"73", + X"47",X"D9",X"35",X"90",X"9F",X"4D",X"80",X"A8",X"A1",X"30",X"8F",X"8B",X"C5",X"18",X"B5",X"70", + X"65",X"B0",X"5D",X"93",X"93",X"7B",X"48",X"CB",X"52",X"7D",X"B0",X"3D",X"98",X"BA",X"2E",X"AD", + X"86",X"4A",X"BD",X"6E",X"4C",X"DA",X"53",X"78",X"77",X"96",X"75",X"83",X"82",X"82",X"A5",X"3D", + X"86",X"A2",X"A7",X"31",X"8B",X"8E",X"C3",X"20",X"AA",X"92",X"3A",X"C0",X"87",X"51",X"77",X"AD", + X"62",X"B9",X"4F",X"7F",X"BC",X"1E",X"BF",X"7E",X"51",X"C3",X"50",X"72",X"C0",X"49",X"8A",X"81", + X"72",X"AA",X"7B",X"55",X"8C",X"83",X"CA",X"2B",X"97",X"9C",X"4B",X"86",X"9F",X"B0",X"14",X"EA", + X"3C",X"8A",X"9B",X"51",X"C2",X"25",X"C7",X"70",X"5F",X"AF",X"52",X"C6",X"29",X"B8",X"7F",X"5F", + X"A3",X"5C",X"CB",X"26",X"AE",X"8B",X"3C",X"D6",X"48",X"8A",X"74",X"A2",X"8D",X"3F",X"D3",X"2A", + X"B9",X"7B",X"4D",X"A6",X"69",X"B6",X"6E",X"56",X"8A",X"A1",X"64",X"C3",X"28",X"B2",X"7D",X"60", + X"A6",X"58",X"D4",X"11",X"D1",X"5C",X"7A",X"A8",X"42",X"96",X"C7",X"27",X"A9",X"90",X"44",X"89", + X"9F",X"69",X"90",X"A7",X"25",X"DB",X"46",X"7C",X"B7",X"42",X"9A",X"6E",X"99",X"8C",X"81",X"41", + X"C7",X"7A",X"58",X"8D",X"83",X"B2",X"29",X"C1",X"6E",X"52",X"DA",X"44",X"83",X"B6",X"2A",X"C4", + X"41",X"A6",X"7A",X"76",X"98",X"5B",X"B6",X"86",X"42",X"A2",X"8A",X"4B",X"95",X"97",X"65",X"B7", + X"56",X"6C",X"D2",X"1E",X"B6",X"94",X"36",X"DD",X"38",X"96",X"7B",X"70",X"9E",X"95",X"59",X"77", + X"82",X"8D",X"7C",X"78",X"DC",X"01",X"CD",X"70",X"5D",X"76",X"B4",X"91",X"35",X"BD",X"48",X"D3", + X"36",X"8E",X"B7",X"2C",X"BE",X"49",X"CA",X"4C",X"72",X"CB",X"29",X"B9",X"82",X"3B",X"CC",X"71", + X"4B",X"D1",X"4F",X"6A",X"8D",X"C9",X"46",X"6A",X"CA",X"28",X"99",X"A9",X"61",X"59",X"AA",X"78", + X"8F",X"98",X"35",X"CE",X"64",X"58",X"95",X"A7",X"49",X"AC",X"57",X"9B",X"7C",X"70",X"DE",X"14", + X"A9",X"A3",X"3F",X"7B",X"C9",X"57",X"5F",X"D6",X"17",X"C5",X"7D",X"58",X"9E",X"71",X"B8",X"3D", + X"72",X"A7",X"6C",X"A7",X"80",X"3A",X"E5",X"22",X"A5",X"61",X"B6",X"86",X"38",X"D9",X"56",X"57", + X"9A",X"8E",X"64",X"97",X"96",X"7D",X"45",X"CC",X"5D",X"5A",X"A8",X"AA",X"3C",X"7E",X"97",X"C1", + X"22",X"9B",X"A7",X"45",X"7F",X"A1",X"B4",X"1D",X"BB",X"51",X"B9",X"7A",X"45",X"91",X"A5",X"67", + X"B8",X"34",X"9E",X"A8",X"35",X"88",X"B0",X"54",X"A8",X"8C",X"31",X"E7",X"41",X"6A",X"C7",X"41", + X"85",X"BA",X"2D",X"B1",X"A0",X"35",X"90",X"9F",X"75",X"A0",X"5D",X"52",X"CA",X"59",X"84",X"9A", + X"52",X"B2",X"66",X"AF",X"43",X"6E",X"BC",X"59",X"89",X"95",X"8B",X"74",X"44",X"AE",X"85",X"96", + X"7B",X"4A",X"8B",X"BD",X"7E",X"2F",X"D2",X"68",X"4D",X"D9",X"41",X"6F",X"CA",X"4D",X"62",X"A0", + X"B7",X"3C",X"76",X"D1",X"2E",X"98",X"B1",X"2A",X"BB",X"8D",X"2F",X"E2",X"4A",X"6C",X"C4",X"49", + X"64",X"A5",X"88",X"80",X"9E",X"2A",X"DD",X"59",X"54",X"CE",X"60",X"54",X"9E",X"9D",X"42",X"BF", + X"92",X"34",X"98",X"B7",X"40",X"77",X"9F",X"BC",X"28",X"93",X"B8",X"44",X"67",X"A7",X"AC",X"41", + X"6F",X"9F",X"91",X"50",X"C4",X"37",X"B1",X"7A",X"5B",X"DD",X"4C",X"58",X"C6",X"5D",X"51",X"BA", + X"82",X"47",X"D6",X"6B",X"45",X"AC",X"60",X"C5",X"3D",X"7D",X"CA",X"33",X"8D",X"AE",X"42",X"88", + X"CB",X"4F",X"5D",X"84",X"C3",X"31",X"B4",X"6B",X"6C",X"AD",X"73",X"AB",X"23",X"D5",X"6B",X"43", + X"D1",X"6A",X"47",X"CB",X"4B",X"77",X"C4",X"2B",X"BC",X"94",X"35",X"C6",X"77",X"3E",X"9E",X"94", + X"77",X"A5",X"43",X"7C",X"99",X"BD",X"3A",X"79",X"C8",X"2B",X"B8",X"83",X"37",X"D2",X"77",X"4F", + X"78",X"BD",X"43",X"AC",X"80",X"66",X"C8",X"28",X"89",X"A3",X"AF",X"2A",X"92",X"B9",X"3D",X"80", + X"CC",X"27",X"9A",X"B0",X"48",X"66",X"AD",X"8D",X"44",X"D0",X"6A",X"44",X"AA",X"87",X"6B",X"C7", + X"25",X"A3",X"AB",X"41",X"70",X"AD",X"71",X"9C",X"74",X"45",X"C9",X"91",X"51",X"5D",X"D9",X"4E", + X"62",X"C7",X"61",X"4C",X"A4",X"97",X"78",X"95",X"3D",X"9E",X"A8",X"30",X"D4",X"4B",X"81",X"B2", + X"33",X"C5",X"65",X"A4",X"63",X"4E",X"A8",X"98",X"5F",X"C0",X"30",X"96",X"B5",X"3D",X"75",X"B2", + X"92",X"31",X"B1",X"A5",X"33",X"A4",X"AD",X"43",X"68",X"B4",X"7A",X"51",X"DB",X"45",X"74",X"C9", + X"2D",X"95",X"AD",X"3B",X"8E",X"A9",X"3D",X"C0",X"70",X"62",X"D5",X"27",X"A7",X"9E",X"3F",X"7C", + X"BC",X"50",X"A4",X"8E",X"34",X"A3",X"A1",X"4E",X"99",X"BC",X"35",X"7B",X"BD",X"67",X"45",X"AA", + X"94",X"62",X"C1",X"3E",X"74",X"CB",X"41",X"74",X"A3",X"50",X"B6",X"9F",X"47",X"68",X"A6",X"AF", + X"4A",X"62",X"94",X"AC",X"3F",X"AD",X"A9",X"3F",X"72",X"8A",X"C7",X"54",X"5E",X"7A",X"C0",X"80", + X"4D",X"6B",X"B7",X"71",X"86",X"9F",X"2C",X"DC",X"60",X"59",X"79",X"BB",X"7C",X"40",X"A8",X"AC", + X"63",X"48",X"D4",X"67",X"56",X"79",X"B8",X"8D",X"38",X"BE",X"7E",X"3C",X"B0",X"97",X"54",X"C2", + X"37",X"98",X"B4",X"32",X"90",X"B9",X"4F",X"5E",X"B2",X"A0",X"34",X"9F",X"A3",X"35",X"AD",X"9B", + X"38",X"BB",X"97",X"4E",X"64",X"A4",X"94",X"53",X"D0",X"45",X"6A",X"C2",X"6E",X"42",X"CC",X"77", + X"52",X"73",X"BB",X"61",X"89",X"B2",X"2D",X"9C",X"B4",X"43",X"77",X"C5",X"57",X"59",X"93",X"A6", + X"5B",X"B6",X"50",X"63",X"BE",X"8D",X"4D",X"6A",X"A2",X"AA",X"6F",X"3F",X"C2",X"86",X"4B",X"75", + X"BD",X"76",X"4B",X"D2",X"5A",X"5A",X"8A",X"BF",X"5B",X"56",X"B3",X"9F",X"4E",X"66",X"C4",X"5D", + X"51",X"C0",X"68",X"70",X"C1",X"3E",X"75",X"BB",X"50",X"A6",X"88",X"3A",X"AB",X"A4",X"79",X"3A", + X"BC",X"8E",X"4A",X"74",X"B7",X"82",X"42",X"D2",X"5F",X"5A",X"7F",X"B4",X"8D",X"41",X"86",X"C0", + X"55",X"5F",X"C0",X"44",X"96",X"B6",X"5A",X"5A",X"84",X"BD",X"78",X"52",X"6C",X"BA",X"82",X"41", + X"BD",X"83",X"3E",X"A9",X"91",X"56",X"CA",X"38",X"95",X"AA",X"39",X"8B",X"AE",X"4D",X"8C",X"AC", + X"35",X"BC",X"79",X"52",X"C1",X"5A",X"80",X"C2",X"41",X"73",X"A8",X"4C",X"B1",X"9C",X"63",X"4F", + X"BB",X"8B",X"4B",X"70",X"B2",X"7F",X"46",X"D3",X"48",X"A3",X"94",X"3D",X"94",X"B6",X"52",X"61", + X"BD",X"49",X"91",X"B9",X"58",X"61",X"77",X"BD",X"4D",X"A9",X"84",X"43",X"CF",X"6A",X"58",X"74", + X"C2",X"57",X"93",X"61",X"84",X"BB",X"2E",X"B6",X"86",X"4B",X"C7",X"71",X"54",X"76",X"AF",X"73", + X"5D",X"D2",X"40",X"85",X"B7",X"59",X"5A",X"94",X"AF",X"40",X"9D",X"A1",X"32",X"BD",X"71",X"72", + X"BC",X"51",X"60",X"97",X"AC",X"7F",X"47",X"8D",X"B7",X"57",X"5B",X"C1",X"7B",X"52",X"73",X"AB", + X"8B",X"44",X"C1",X"82",X"42",X"BD",X"75",X"4B",X"B0",X"9D",X"6A",X"50",X"8A",X"AD",X"8E",X"53", + X"65",X"9C",X"AE",X"65",X"51",X"AF",X"99",X"43",X"80",X"B4",X"7E",X"3D",X"B9",X"6B",X"66",X"C2", + X"45",X"B4",X"81",X"50",X"72",X"BC",X"6E",X"4E",X"BA",X"7A",X"4A",X"C1",X"6F",X"5A",X"BB",X"89", + X"5C",X"5E",X"9B",X"AF",X"5E",X"5C",X"CA",X"43",X"87",X"B0",X"41",X"85",X"BA",X"4D",X"77",X"BA", + X"76",X"4A",X"A7",X"9D",X"54",X"61",X"AA",X"9C",X"47",X"7B",X"B2",X"8B",X"51",X"6C",X"9A",X"A4", + X"42",X"A4",X"A6",X"3A",X"A5",X"97",X"3F",X"9E",X"A7",X"78",X"4E",X"7F",X"B1",X"8A",X"58",X"64", + X"B8",X"88",X"48",X"87",X"B5",X"6E",X"49",X"BE",X"59",X"93",X"A5",X"46",X"74",X"9E",X"A3",X"35", + X"C2",X"72",X"55",X"C2",X"5B",X"60",X"B9",X"79",X"48",X"C8",X"57",X"84",X"B1",X"4B",X"6C",X"97", + X"AC",X"3F",X"8C",X"AF",X"47",X"AF",X"89",X"4A",X"7D",X"A4",X"9E",X"4F",X"6A",X"B1",X"8E",X"45", + X"88",X"B2",X"70",X"4B",X"A7",X"9C",X"41",X"AD",X"96",X"49",X"7B",X"B6",X"77",X"4B",X"B4",X"8D", + X"56",X"67",X"A2",X"A0",X"3E",X"B2",X"84",X"45",X"AC",X"9A",X"78",X"44",X"B1",X"80",X"52",X"C9", + X"4B",X"7E",X"B7",X"3C",X"A1",X"99",X"40",X"9F",X"A3",X"7C",X"4C",X"8A",X"B0",X"76",X"4C",X"9D", + X"A6",X"3F",X"9C",X"A5",X"5E",X"5C",X"B7",X"85",X"4E",X"7E",X"B4",X"6A",X"56",X"CD",X"4B",X"99", + X"6F",X"69",X"C4",X"45",X"89",X"B2",X"60",X"60",X"7F",X"BB",X"57",X"6E",X"B4",X"84",X"66",X"59", + X"BD",X"4A",X"9F",X"A0",X"5B",X"5F",X"A1",X"A4",X"65",X"57",X"94",X"A3",X"8E",X"46",X"8A",X"9B", + X"58",X"B7",X"78",X"4C",X"9B",X"A1",X"40",X"AF",X"87",X"42",X"B4",X"80",X"5E",X"BB",X"4B",X"7D", + X"BB",X"42",X"95",X"A1",X"42",X"AA",X"98",X"59",X"64",X"A4",X"A0",X"5F",X"5D",X"9C",X"A7",X"66", + X"57",X"A0",X"A4",X"5E",X"61",X"8A",X"B4",X"4D",X"92",X"A5",X"55",X"68",X"8F",X"B1",X"55",X"6C", + X"BE",X"51",X"88",X"A6",X"36",X"C2",X"6C",X"60",X"B2",X"84",X"4D",X"84",X"A8",X"4A",X"A5",X"9E", + X"60",X"5D",X"AD",X"92",X"76",X"4E",X"94",X"A8",X"72",X"4C",X"B0",X"7A",X"57",X"B8",X"85",X"72", + X"51",X"C2",X"59",X"6C",X"B1",X"86",X"69",X"5A",X"92",X"A9",X"7B",X"50",X"8B",X"B3",X"41",X"AD", + X"6F",X"61",X"B7",X"82",X"6E",X"55",X"A0",X"9F",X"4B",X"87",X"B1",X"52",X"9B",X"96",X"59",X"68", + X"B7",X"55",X"85",X"B1",X"64",X"65",X"70",X"BB",X"6A",X"5F",X"B0",X"8A",X"76",X"55",X"82",X"AE", + X"82",X"5F",X"66",X"A1",X"9C",X"48",X"B7",X"67",X"60",X"B8",X"76",X"4D",X"B7",X"76",X"62",X"B1", + X"7C",X"55",X"84",X"AD",X"77",X"55",X"8B",X"AC",X"40",X"9A",X"A1",X"75",X"57",X"7D",X"A6",X"91", + X"75",X"5C",X"74",X"AE",X"7D",X"52",X"C1",X"58",X"74",X"B7",X"45",X"95",X"A1",X"70",X"57",X"89", + X"AA",X"81",X"5B",X"6D",X"9F",X"9E",X"6F",X"57",X"AB",X"8E",X"63",X"5E",X"B0",X"80",X"4E",X"B1", + X"88",X"4C",X"9E",X"9A",X"46",X"98",X"A4",X"6C",X"55",X"B0",X"84",X"56",X"B8",X"48",X"92",X"A3", + X"7D",X"69",X"5C",X"A6",X"98",X"51",X"83",X"B5",X"4C",X"8E",X"A3",X"69",X"5E",X"80",X"AF",X"6B", + X"5B",X"B3",X"7C",X"52",X"B1",X"88",X"81",X"50",X"88",X"A7",X"83",X"54",X"82",X"AB",X"46",X"9F", + X"9F",X"4B",X"94",X"9F",X"42",X"A8",X"92",X"84",X"59",X"77",X"B3",X"46",X"A5",X"8C",X"4A",X"AE", + X"8A",X"59",X"A9",X"82",X"67",X"60",X"99",X"9F",X"81",X"6A",X"5B",X"BF",X"4F",X"9C",X"82",X"54", + X"BA",X"75",X"55",X"A7",X"8A",X"4B",X"A4",X"96",X"82",X"61",X"67",X"9A",X"9E",X"4D",X"8A",X"A7", + X"7F",X"73",X"52",X"BB",X"60",X"73",X"AC",X"83",X"73",X"59",X"89",X"A4",X"88",X"50",X"95",X"A2", + X"67",X"63",X"7D",X"B0",X"72",X"59",X"A9",X"8F",X"50",X"87",X"AC",X"47",X"9C",X"97",X"7B",X"53", + X"92",X"A0",X"7B",X"5B",X"7F",X"B1",X"49",X"8D",X"A4",X"7B",X"66",X"62",X"B4",X"76",X"66",X"AA", + X"81",X"62",X"6D",X"AF",X"80",X"6D",X"5C",X"97",X"9C",X"86",X"69",X"60",X"AE",X"80",X"4E",X"B9", + X"66",X"6D",X"AA",X"83",X"64",X"69",X"AD",X"86",X"6B",X"60",X"8C",X"AA",X"65",X"66",X"AF",X"80", + X"51",X"9A",X"9B",X"7B",X"72",X"57",X"A5",X"92",X"87",X"67",X"66",X"86",X"B2",X"58",X"8E",X"8B", + X"5F",X"B0",X"71",X"6B",X"63",X"A7",X"8F",X"85",X"67",X"63",X"B2",X"61",X"6F",X"AE",X"81",X"7F", + X"4E",X"A4",X"8D",X"51",X"9F",X"99",X"73",X"62",X"75",X"B6",X"66",X"79",X"9F",X"50",X"B7",X"4C", + X"8E",X"9E",X"7D",X"5C",X"7F",X"AF",X"4B",X"8D",X"A1",X"7D",X"65",X"66",X"AE",X"7B",X"62",X"AD", + X"7B",X"6C",X"5F",X"A8",X"8D",X"84",X"66",X"65",X"A7",X"8D",X"75",X"58",X"9F",X"97",X"74",X"60", + X"79",X"A4",X"8E",X"6A",X"5F",X"A7",X"8D",X"53",X"A7",X"87",X"73",X"57",X"B1",X"74",X"68",X"AD", + X"48",X"A0",X"94",X"81",X"6D",X"5F",X"94",X"9C",X"85",X"6D",X"5F",X"97",X"9D",X"78",X"5B",X"87", + X"AA",X"5E",X"6C",X"A6",X"8A",X"7A",X"5D",X"7B",X"9E",X"96",X"59",X"7D",X"AB",X"4C",X"98",X"95", + X"4B",X"A5",X"8B",X"55",X"A5",X"8D",X"71",X"60",X"84",X"A4",X"84",X"7F",X"5A",X"82",X"AB",X"5B", + X"78",X"B2",X"5B",X"7F",X"A2",X"4D",X"94",X"A2",X"51",X"98",X"93",X"78",X"57",X"9B",X"95",X"7D", + X"57",X"90",X"9D",X"53",X"A2",X"8D",X"6C",X"65",X"81",X"AD",X"68",X"71",X"A9",X"53",X"A4",X"82", + X"7A",X"55",X"A4",X"88",X"53",X"A5",X"8D",X"7F",X"6A",X"63",X"A7",X"87",X"59",X"A5",X"8A",X"77", + X"61",X"7B",X"AD",X"73",X"6B",X"A1",X"7F",X"6F",X"60",X"B2",X"6C",X"66",X"AA",X"82",X"81",X"5E", + X"75",X"9D",X"92",X"7D",X"6C",X"63",X"B0",X"73",X"60",X"A8",X"86",X"80",X"62",X"71",X"99",X"9A", + X"50",X"97",X"92",X"51",X"9D",X"96",X"51",X"A5",X"79",X"5D",X"AA",X"85",X"80",X"64",X"6D",X"AB", + X"77",X"64",X"A9",X"82",X"77",X"5F",X"85",X"A1",X"85",X"7F",X"5B",X"88",X"A4",X"4E",X"95",X"98", + X"81",X"69",X"69",X"B1",X"55",X"90",X"99",X"4F",X"A7",X"7E",X"59",X"AA",X"7C",X"5B",X"9E",X"92", + X"7E",X"70",X"5F",X"A1",X"8F",X"85",X"5F",X"78",X"A6",X"7F",X"77",X"5A",X"A0",X"87",X"58",X"A0", + X"93",X"59",X"97",X"94",X"5B",X"76",X"9F",X"8E",X"63",X"72",X"AC",X"57",X"81",X"A6",X"66",X"68", + X"A7",X"83",X"5C",X"A7",X"80",X"7A",X"59",X"97",X"9A",X"5D",X"7A",X"AD",X"66",X"72",X"A1",X"80", + X"70",X"62",X"A7",X"85",X"7B",X"5F",X"7E",X"9D",X"8E",X"73",X"5F",X"93",X"9D",X"63",X"6D",X"AA", + X"7B",X"89",X"5B",X"7F",X"A0",X"84",X"64",X"78",X"A5",X"7A",X"75",X"5E",X"9C",X"93",X"7F",X"7C", + X"58",X"A0",X"8D",X"80",X"61",X"77",X"9D",X"91",X"65",X"71",X"A4",X"80",X"76",X"5E",X"A4",X"89", + X"7C",X"62",X"78",X"9D",X"8D",X"7D",X"6C",X"68",X"B0",X"69",X"78",X"A3",X"54",X"9F",X"8A",X"79", + X"63",X"7A",X"9E",X"8D",X"64",X"71",X"AD",X"6D",X"6D",X"9D",X"86",X"6F",X"68",X"82",X"A8",X"6A", + X"74",X"A2",X"7A",X"73",X"61",X"B1",X"66",X"73",X"A8",X"5C",X"7D",X"A7",X"6C",X"6C",X"AA",X"56", + X"97",X"89",X"55",X"A7",X"85",X"85",X"6E",X"66",X"A6",X"82",X"82",X"5F",X"81",X"A5",X"55",X"8A", + X"9C",X"7C",X"81",X"5B",X"8A",X"9F",X"5E",X"7E",X"A9",X"5D",X"79",X"9E",X"87",X"61",X"76",X"9E", + X"8C",X"65",X"72",X"A2",X"83",X"78",X"60",X"A2",X"86",X"7C",X"5E",X"9B",X"8C",X"56",X"AD",X"66", + X"71",X"A3",X"81",X"82",X"66",X"74",X"AE",X"5E",X"82",X"9B",X"58",X"8E",X"9E",X"63",X"72",X"A1", + X"84",X"72",X"62",X"9F",X"8B",X"81",X"73",X"65",X"89",X"9D",X"7F",X"84",X"5E",X"84",X"9E",X"7C", + X"7B",X"5E",X"8B",X"96",X"8C",X"56",X"96",X"90",X"80",X"66",X"74",X"9A",X"92",X"61",X"78",X"9E", + X"87",X"69",X"72",X"A2",X"7F",X"76",X"63",X"8B",X"9A",X"83",X"5B",X"8F",X"98",X"7B",X"7F",X"5B", + X"92",X"98",X"5A",X"9D",X"86",X"81",X"62",X"80",X"A0",X"7B",X"76",X"61",X"9A",X"91",X"80",X"7B", + X"5E",X"91",X"96",X"7F",X"6E",X"69",X"99",X"94",X"64",X"75",X"A6",X"74",X"64",X"8F",X"9D",X"65", + X"72",X"A1",X"83",X"74",X"62",X"9F",X"89",X"82",X"72",X"67",X"88",X"9D",X"7A",X"62",X"AC",X"5A", + X"8F",X"90",X"7F",X"6E",X"6B",X"8E",X"9D",X"61",X"86",X"9B",X"56",X"9D",X"88",X"7C",X"64",X"7B", + X"99",X"8E",X"5E",X"7F",X"9F",X"7F",X"83",X"63",X"7D",X"A5",X"6A",X"6C",X"99",X"8F",X"57",X"A1", + X"7C",X"68",X"9C",X"86",X"6B",X"72",X"A2",X"7B",X"81",X"5C",X"98",X"90",X"77",X"61",X"A5",X"71", + X"6B",X"A0",X"87",X"73",X"68",X"A2",X"80",X"80",X"63",X"7D",X"9E",X"81",X"60",X"A2",X"77",X"69", + X"A8",X"6B",X"6D",X"9D",X"83",X"7E",X"65",X"7C",X"9D",X"86",X"62",X"80",X"A1",X"6F",X"68",X"A0", + X"83",X"84",X"6C",X"6E",X"92",X"9A",X"5D",X"8C",X"8F",X"5F",X"A1",X"7F",X"7F",X"65",X"7B",X"98", + X"8C",X"61",X"7C",X"A1",X"78",X"66",X"A3",X"68",X"75",X"A3",X"7A",X"87",X"69",X"70",X"8E",X"97", + X"7C",X"62",X"93",X"90",X"79",X"6B",X"74",X"A0",X"83",X"63",X"87",X"9E",X"6D",X"70",X"A1",X"60", + X"8E",X"91",X"7A",X"73",X"68",X"97",X"8E",X"84",X"73",X"68",X"8D",X"9A",X"75",X"66",X"9E",X"7F", + X"60",X"9A",X"8E",X"61",X"8D",X"92",X"57",X"96",X"8E",X"81",X"79",X"65",X"9C",X"87",X"7A",X"67", + X"80",X"9E",X"7D",X"85",X"64",X"7B",X"9B",X"85",X"72",X"68",X"98",X"8F",X"74",X"66",X"9A",X"89", + X"5D",X"8D",X"96",X"7C",X"60",X"A1",X"7C",X"69",X"9D",X"81",X"78",X"65",X"A2",X"78",X"69",X"A8", + X"62",X"83",X"95",X"7E",X"76",X"67",X"8B",X"97",X"7B",X"61",X"A7",X"6B",X"76",X"9C",X"7F",X"77", + X"66",X"91",X"95",X"77",X"64",X"98",X"8E",X"64",X"7B",X"9D",X"7F",X"61",X"94",X"8F",X"7C",X"66", + X"82",X"9D",X"7A",X"87",X"66",X"7A",X"A0",X"6E",X"6D",X"A0",X"7F",X"84",X"71",X"6B",X"9E",X"83", + X"7E",X"62",X"90",X"92",X"7B",X"79",X"62",X"A4",X"79",X"70",X"99",X"84",X"62",X"8B",X"92",X"7F", + X"74",X"6B",X"8A",X"99",X"75",X"68",X"99",X"8C",X"68",X"77",X"9D",X"7D",X"83",X"6F",X"6D",X"91", + X"91",X"83",X"6F",X"6E",X"99",X"8C",X"69",X"76",X"9F",X"79",X"68",X"A1",X"70",X"6D",X"9B",X"86", + X"60",X"9C",X"7C",X"6A",X"9F",X"7B",X"84",X"65",X"81",X"A0",X"61",X"89",X"91",X"7D",X"7B",X"65", + X"8D",X"95",X"7E",X"83",X"70",X"6D",X"A3",X"73",X"70",X"A1",X"67",X"7F",X"9C",X"5A",X"98",X"7F", + X"6B",X"A0",X"78",X"87",X"60",X"8A",X"95",X"7C",X"81",X"61",X"94",X"8E",X"7F",X"7A",X"67",X"88", + X"93",X"88",X"6F",X"71",X"A0",X"67",X"78",X"98",X"88",X"6D",X"72",X"9E",X"7E",X"83",X"78",X"67", + X"8D",X"92",X"82",X"63",X"8F",X"8F",X"7D",X"7A",X"66",X"8F",X"93",X"7B",X"66",X"A3",X"6B",X"7B", + X"97",X"7E",X"74",X"6B",X"9B",X"86",X"7F",X"80",X"66",X"82",X"95",X"87",X"62",X"88",X"95",X"7D", + X"82",X"6B",X"77",X"99",X"86",X"66",X"91",X"8C",X"74",X"6C",X"98",X"85",X"7B",X"66",X"97",X"87", + X"80",X"74",X"6D",X"8C",X"96",X"73",X"70",X"A1",X"64",X"7A",X"93",X"8D",X"64",X"80",X"96",X"82", + X"6F",X"71",X"99",X"87",X"65",X"82",X"98",X"7F",X"82",X"71",X"6F",X"92",X"8D",X"83",X"6E",X"73", + X"95",X"8C",X"6E",X"74",X"9A",X"7E",X"82",X"69",X"7E",X"9F",X"62",X"88",X"91",X"64",X"8F",X"8F", + X"65",X"7E",X"96",X"83",X"63",X"8D",X"90",X"7F",X"7D",X"67",X"98",X"85",X"7E",X"66",X"92",X"8B", + X"7C",X"6C",X"7C",X"9B",X"7C",X"69",X"94",X"86",X"7F",X"72",X"6F",X"8F",X"91",X"78",X"68",X"97", + X"89",X"7B",X"67",X"97",X"86",X"80",X"74",X"6C",X"94",X"8C",X"7E",X"82",X"6B",X"7C",X"9F",X"67", + X"82",X"96",X"6A",X"77",X"9A",X"7E",X"83",X"78",X"69",X"98",X"86",X"81",X"74",X"6D",X"8C",X"91", + X"81",X"7A",X"69",X"99",X"80",X"65",X"90",X"8F",X"7D",X"66",X"96",X"87",X"7F",X"67",X"8D",X"8F", + X"61",X"98",X"7F",X"67",X"8E",X"90",X"7D",X"82",X"69",X"7D",X"96",X"86",X"6A",X"7D",X"9D",X"6F", + X"76",X"99",X"6E",X"71",X"99",X"83",X"83",X"71",X"71",X"8F",X"91",X"71",X"72",X"9A",X"7D",X"84", + X"6A",X"7A",X"8C",X"94",X"6B",X"7D",X"94",X"7F",X"6D",X"79",X"97",X"84",X"67",X"85",X"93",X"81", + X"73",X"74",X"9B",X"7A",X"84",X"68",X"80",X"97",X"7E",X"83",X"69",X"82",X"99",X"69",X"82",X"97", + X"65",X"87",X"91",X"63",X"93",X"86",X"7F",X"76",X"6C",X"94",X"89",X"82",X"6D",X"78",X"96",X"86", + X"69",X"80",X"97",X"79",X"6D",X"97",X"7D",X"6A",X"9A",X"76",X"6D",X"98",X"83",X"81",X"7D",X"6C", + X"80",X"93",X"87",X"65",X"96",X"83",X"81",X"78",X"6B",X"99",X"82",X"82",X"73",X"70",X"91",X"8D", + X"7C",X"84",X"69",X"80",X"97",X"7B",X"85",X"6C",X"79",X"92",X"8B",X"73",X"71",X"9B",X"75",X"6E", + X"91",X"8E",X"70",X"73",X"97",X"84",X"6B",X"80",X"98",X"77",X"70",X"95",X"7F",X"67",X"93",X"89", + X"7F",X"7E",X"6B",X"83",X"95",X"7F",X"82",X"78",X"6C",X"98",X"83",X"81",X"79",X"6B",X"96",X"84", + X"67",X"95",X"84",X"68",X"8E",X"8F",X"71",X"72",X"8F",X"8F",X"6B",X"80",X"93",X"7A",X"6B",X"91", + X"87",X"65",X"90",X"8D",X"74",X"6E",X"93",X"89",X"7D",X"82",X"6B",X"7E",X"93",X"87",X"6B",X"7F", + X"97",X"7A",X"86",X"6B",X"7E",X"95",X"7D",X"83",X"71",X"74",X"93",X"88",X"7F",X"7E",X"69",X"96", + X"83",X"81",X"79",X"6C",X"8B",X"90",X"7D",X"83",X"77",X"6E",X"8A",X"92",X"77",X"71",X"98",X"78", + X"6F",X"9B",X"6E",X"7D",X"94",X"7A",X"83",X"65",X"93",X"88",X"81",X"78",X"6F",X"86",X"96",X"71", + X"79",X"94",X"7D",X"80",X"6C",X"7E",X"91",X"87",X"7E",X"80",X"6B",X"80",X"8F",X"8B",X"6B",X"7D", + X"95",X"7D",X"83",X"72",X"73",X"92",X"88",X"80",X"6E",X"7C",X"95",X"80",X"6D",X"7F",X"95",X"7D", + X"83",X"77",X"6E",X"92",X"88",X"7F",X"6F",X"7A",X"96",X"7F",X"6E",X"80",X"99",X"6B",X"7F",X"90", + X"80",X"75",X"72",X"94",X"87",X"75",X"72",X"99",X"78",X"6F",X"8C",X"8F",X"6C",X"7C",X"92",X"80", + X"78",X"6E",X"90",X"8C",X"72",X"73",X"96",X"81",X"81",X"6D",X"7F",X"95",X"7D",X"83",X"7B",X"6E", + X"83",X"93",X"7E",X"83",X"6A",X"88",X"90",X"66",X"8C",X"8D",X"69",X"86",X"92",X"7B",X"85",X"70", + X"76",X"8D",X"8E",X"70",X"78",X"96",X"7C",X"85",X"6F",X"79",X"98",X"74",X"71",X"90",X"89",X"7C", + X"83",X"6B",X"83",X"91",X"80",X"80",X"70",X"79",X"90",X"88",X"7E",X"81",X"6E",X"7D",X"98",X"71", + X"7B",X"93",X"7A",X"85",X"6B",X"80",X"92",X"81",X"80",X"71",X"79",X"99",X"74",X"78",X"93",X"7C", + X"83",X"70",X"78",X"8D",X"8B",X"7E",X"80",X"6C",X"82",X"90",X"84",X"6A",X"8B",X"8C",X"7D",X"81", + X"6B",X"8B",X"8F",X"6D",X"82",X"92",X"6C",X"7F",X"94",X"72",X"74",X"91",X"86",X"6D",X"82",X"93", + X"69",X"82",X"91",X"80",X"6E",X"81",X"94",X"77",X"73",X"93",X"7C",X"6F",X"97",X"78",X"71",X"8B", + X"8F",X"6C",X"82",X"8E",X"7D",X"81",X"6F",X"7C",X"8F",X"87",X"7E",X"80",X"6E",X"7E",X"8E",X"8A", + X"70",X"78",X"95",X"7D",X"84",X"78",X"71",X"87",X"91",X"79",X"70",X"91",X"85",X"7C",X"6F",X"8B", + X"8C",X"67",X"90",X"82",X"6F",X"91",X"84",X"76",X"72",X"8D",X"8D",X"70",X"7D",X"93",X"6F",X"7D", + X"95",X"68",X"88",X"8B",X"80",X"78",X"73",X"96",X"7D",X"84",X"73",X"75",X"93",X"83",X"81",X"77", + X"72",X"8E",X"8A",X"7E",X"80",X"6D",X"8C",X"8C",X"6A",X"83",X"8F",X"81",X"6D",X"85",X"8F",X"7E", + X"6D",X"88",X"8D",X"7F",X"6F",X"82",X"91",X"7D",X"6F",X"85",X"8F",X"7D",X"7D",X"6D",X"90",X"88", + X"7C",X"6E",X"94",X"80",X"70",X"8E",X"87",X"76",X"74",X"92",X"81",X"7D",X"6D",X"8F",X"87",X"7F", + X"71",X"7C",X"92",X"81",X"73",X"7A",X"95",X"7C",X"84",X"7B",X"6F",X"8D",X"8A",X"7B",X"71",X"82", + X"92",X"79",X"73",X"91",X"7E",X"6D",X"8D",X"89",X"7D",X"83",X"6D",X"84",X"8F",X"7D",X"83",X"70", + X"7B",X"8B",X"8B",X"7B",X"85",X"71",X"7A",X"93",X"7E",X"82",X"75",X"75",X"89",X"8D",X"7D",X"6D", + X"90",X"85",X"81",X"79",X"71",X"8D",X"8A",X"79",X"72",X"91",X"83",X"7D",X"6F",X"86",X"8E",X"7D", + X"70",X"85",X"90",X"7A",X"86",X"74",X"76",X"91",X"82",X"81",X"79",X"72",X"87",X"8D",X"80",X"6D", + X"86",X"8E",X"7E",X"82",X"76",X"74",X"89",X"8B",X"82",X"72",X"7F",X"94",X"6F",X"80",X"8D",X"7E", + X"73",X"7B",X"92",X"7F",X"71",X"8A",X"89",X"6A",X"89",X"8B",X"81",X"71",X"7F",X"91",X"7C",X"84", + X"79",X"72",X"8D",X"89",X"6C",X"8C",X"86",X"7F",X"7C",X"71",X"83",X"8D",X"83",X"7E",X"81",X"6E", + X"83",X"8D",X"85",X"71",X"7C",X"91",X"7E",X"82",X"7D",X"70",X"88",X"8D",X"7D",X"83",X"6E",X"84", + X"8F",X"7C",X"83",X"70",X"7E",X"90",X"7F",X"82",X"76",X"76",X"93",X"7E",X"83",X"7A",X"72",X"8D", + X"89",X"76",X"75",X"92",X"7F",X"83",X"76",X"76",X"92",X"7F",X"6F",X"8A",X"8A",X"7D",X"72",X"83", + X"90",X"79",X"75",X"8A",X"87",X"6B",X"89",X"89",X"7F",X"7F",X"71",X"81",X"93",X"70",X"7E",X"8E", + X"80",X"79",X"73",X"8E",X"88",X"79",X"72",X"8E",X"86",X"7B",X"72",X"8E",X"85",X"6E",X"8E",X"84", + X"6F",X"85",X"8E",X"78",X"74",X"91",X"7C",X"71",X"94",X"7A",X"73",X"8A",X"8C",X"76",X"76",X"8F", + X"84",X"7D",X"83",X"6E",X"86",X"8B",X"81",X"71",X"83",X"8D",X"7E",X"78",X"75",X"92",X"81",X"81", + X"7D",X"72",X"82",X"8E",X"80",X"80",X"7E",X"70",X"85",X"8C",X"83",X"70",X"80",X"8E",X"7F",X"72", + X"81",X"90",X"7A",X"86",X"72",X"7D",X"90",X"77",X"74",X"8C",X"88",X"7D",X"83",X"75",X"78",X"8C", + X"88",X"7D",X"83",X"74",X"79",X"8F",X"83",X"6F",X"87",X"8C",X"79",X"73",X"8A",X"89",X"7D",X"83", + X"76",X"76",X"8C",X"87",X"7F",X"7D",X"70",X"8C",X"87",X"80",X"71",X"84",X"8D",X"7C",X"73",X"8C", + X"83",X"6E",X"89",X"8A",X"7C",X"73",X"90",X"7E",X"83",X"70",X"84",X"8C",X"7E",X"78",X"78",X"93", + X"7A",X"73",X"8A",X"89",X"7C",X"84",X"77",X"76",X"90",X"81",X"81",X"7A",X"73",X"8B",X"89",X"71", + X"7E",X"8F",X"7E",X"71",X"8B",X"86",X"7F",X"7E",X"70",X"8D",X"87",X"72",X"7D",X"8E",X"82",X"73", + X"7E",X"8F",X"7F",X"82",X"7D",X"72",X"88",X"8C",X"6F",X"86",X"89",X"7D",X"81",X"70",X"83",X"8C", + X"82",X"70",X"83",X"8C",X"81",X"72",X"80",X"8E",X"7D",X"83",X"7A",X"74",X"86",X"8C",X"7C",X"72", + X"87",X"8B",X"7D",X"83",X"78",X"76",X"8F",X"82",X"71",X"8D",X"82",X"80",X"7E",X"72",X"83",X"8D", + X"7E",X"83",X"74",X"7E",X"8F",X"7B",X"85",X"74",X"7B",X"8F",X"7F",X"81",X"7B",X"73",X"87",X"8A", + X"80",X"72",X"8B",X"84",X"7E",X"80",X"70",X"8B",X"87",X"7E",X"82",X"73",X"7D",X"8C",X"86",X"77", + X"79",X"91",X"79",X"77",X"90",X"7A",X"77",X"90",X"79",X"75",X"8B",X"87",X"77",X"79",X"91",X"74", + X"7D",X"8C",X"7F",X"72",X"85",X"8B",X"7D",X"72",X"87",X"89",X"7F",X"7B",X"74",X"8D",X"86",X"76", + X"7A",X"91",X"74",X"7A",X"8B",X"86",X"78",X"77",X"8E",X"82",X"7F",X"81",X"73",X"7E",X"8C",X"84", + X"76",X"7B",X"91",X"77",X"77",X"8A",X"87",X"76",X"79",X"8B",X"86",X"75",X"7B",X"8B",X"85",X"72", + X"83",X"89",X"7E",X"7E",X"73",X"8F",X"80",X"73",X"83",X"8D",X"7D",X"84",X"73",X"7E",X"8B",X"84", + X"74",X"7D",X"8C",X"82",X"74",X"7F",X"8D",X"80",X"7B",X"74",X"8D",X"84",X"79",X"76",X"8F",X"80", + X"82",X"72",X"85",X"8A",X"7C",X"82",X"71",X"85",X"8A",X"7F",X"81",X"76",X"7B",X"8F",X"7F",X"83", + X"75",X"7B",X"89",X"89",X"73",X"81",X"8B",X"7C",X"84",X"74",X"7D",X"8C",X"81",X"71",X"89",X"87", + X"80",X"72",X"88",X"87",X"7F",X"75",X"82",X"8C",X"7B",X"84",X"73",X"7F",X"8E",X"7A",X"76",X"8D", + X"81",X"7E",X"74",X"8C",X"84",X"71",X"85",X"8A",X"7E",X"74",X"86",X"8A",X"7B",X"75",X"8A",X"85", + X"71",X"8B",X"83",X"73",X"89",X"85",X"7B",X"75",X"87",X"8A",X"79",X"76",X"8C",X"83",X"7F",X"80", + X"73",X"81",X"89",X"86",X"73",X"7D",X"8B",X"84",X"7A",X"76",X"8C",X"83",X"7F",X"75",X"81",X"8D", + X"7D",X"84",X"77",X"7A",X"8E",X"7B",X"75",X"8D",X"80",X"81",X"7B",X"75",X"8C",X"84",X"7F",X"73", + X"87",X"88",X"7D",X"82",X"75",X"7D",X"8D",X"7F",X"74",X"8D",X"7E",X"75",X"8D",X"7E",X"74",X"88", + X"88",X"7A",X"78",X"8D",X"7C",X"75",X"87",X"89",X"7A",X"76",X"88",X"89",X"77",X"7A",X"8E",X"7C", + X"74",X"8A",X"85",X"7E",X"82",X"76",X"7B",X"89",X"87",X"72",X"88",X"85",X"7E",X"81",X"74",X"7F", + X"88",X"87",X"75",X"7E",X"8E",X"77",X"79",X"8A",X"85",X"77",X"7A",X"8B",X"83",X"76",X"7F",X"8C", + X"73",X"7E",X"8B",X"82",X"75",X"7E",X"8C",X"7F",X"77",X"7C",X"8D",X"80",X"75",X"86",X"87",X"73", + X"7F",X"8B",X"80",X"7F",X"74",X"89",X"85",X"72",X"89",X"85",X"73",X"88",X"85",X"7D",X"82",X"71", + X"8A",X"84",X"83",X"74",X"82",X"89",X"81",X"78",X"7D",X"8C",X"7F",X"7C",X"76",X"8A",X"86",X"7B", + X"77",X"8C",X"81",X"80",X"7E",X"74",X"86",X"88",X"82",X"7A",X"78",X"8B",X"83",X"7E",X"82",X"77", + X"7B",X"88",X"87",X"7A",X"77",X"86",X"89",X"78",X"7A",X"8C",X"7F",X"81",X"79",X"78",X"87",X"87", + X"81",X"76",X"80",X"8D",X"74",X"81",X"89",X"7D",X"83",X"76",X"7D",X"8B",X"81",X"73",X"87",X"88", + X"7D",X"76",X"8D",X"7D",X"77",X"8A",X"82",X"7A",X"78",X"89",X"86",X"76",X"7C",X"8B",X"81",X"7D", + X"75",X"8B",X"82",X"74",X"8A",X"82",X"74",X"8B",X"81",X"80",X"7E",X"75",X"85",X"8A",X"77",X"7B", + X"8A",X"83",X"77",X"7C",X"8B",X"81",X"77",X"7D",X"8D",X"7D",X"83",X"7A",X"78",X"89",X"86",X"7D", + X"83",X"79",X"79",X"8A",X"84",X"75",X"80",X"8A",X"80",X"7B",X"78",X"8E",X"7C",X"78",X"8B",X"7F", + X"81",X"7C",X"76",X"86",X"87",X"80",X"74",X"85",X"88",X"7B",X"76",X"8C",X"81",X"82",X"78",X"7C", + X"8A",X"80",X"7B",X"78",X"8C",X"80",X"7E",X"75",X"87",X"87",X"7D",X"76",X"86",X"88",X"7B",X"77", + X"87",X"87",X"79",X"7A",X"8C",X"7B",X"78",X"8C",X"80",X"81",X"7D",X"76",X"85",X"88",X"80",X"7E", + X"76",X"86",X"88",X"7D",X"76",X"84",X"89",X"7B",X"79",X"89",X"81",X"80",X"7B",X"77",X"89",X"84", + X"80",X"7F",X"75",X"88",X"84",X"7F",X"77",X"7F",X"8B",X"80",X"78",X"7E",X"8C",X"7B",X"79",X"88", + X"83",X"77",X"7F",X"8C",X"76",X"7F",X"89",X"7F",X"78",X"7C",X"8B",X"81",X"76",X"83",X"8A",X"74", + X"83",X"88",X"75",X"82",X"89",X"74",X"81",X"89",X"7D",X"83",X"77",X"7C",X"8C",X"7E",X"76",X"88", + X"86",X"7E",X"83",X"7A",X"79",X"83",X"89",X"7F",X"76",X"88",X"85",X"74",X"84",X"89",X"75",X"82", + X"88",X"7D",X"83",X"75",X"80",X"88",X"82",X"7A",X"7B",X"8B",X"7E",X"82",X"7B",X"78",X"88",X"86", + X"76",X"83",X"88",X"74",X"83",X"88",X"7E",X"76",X"85",X"87",X"7E",X"82",X"7C",X"78",X"83",X"87", + X"83",X"76",X"80",X"89",X"80",X"77",X"81",X"8A",X"7E",X"81",X"7E",X"77",X"81",X"89",X"81",X"78", + X"7C",X"8B",X"80",X"82",X"74",X"86",X"85",X"80",X"77",X"82",X"88",X"7F",X"7A",X"7B",X"8C",X"7E", + X"82",X"7B",X"78",X"87",X"86",X"7E",X"82",X"76",X"81",X"8A",X"7A",X"79",X"87",X"86",X"7A",X"79", + X"89",X"83",X"7F",X"81",X"76",X"83",X"89",X"78",X"7C",X"89",X"82",X"78",X"7C",X"8B",X"7F",X"81", + X"7C",X"77",X"87",X"85",X"7E",X"81",X"77",X"7E",X"8A",X"80",X"81",X"7F",X"77",X"81",X"89",X"80", + X"80",X"7F",X"76",X"84",X"88",X"7E",X"82",X"79",X"7B",X"87",X"86",X"7C",X"79",X"88",X"83",X"76", + X"81",X"88",X"80",X"77",X"81",X"89",X"7D",X"78",X"86",X"84",X"76",X"81",X"88",X"80",X"77",X"85", + X"86",X"76",X"7E",X"89",X"81",X"78",X"7F",X"8A",X"7E",X"78",X"89",X"81",X"80",X"7E",X"77",X"82", + X"87",X"82",X"7F",X"81",X"78",X"7D",X"88",X"83",X"7F",X"77",X"86",X"85",X"7E",X"82",X"76",X"80", + X"88",X"82",X"7E",X"77",X"86",X"85",X"7F",X"77",X"86",X"85",X"7F",X"78",X"81",X"8A",X"75",X"83", + X"87",X"77",X"7F",X"8A",X"79",X"7B",X"88",X"84",X"76",X"84",X"85",X"7E",X"78",X"82",X"88",X"7F", + X"78",X"84",X"87",X"76",X"7F",X"88",X"82",X"7E",X"82",X"77",X"7F",X"89",X"7E",X"82",X"7B",X"7A", + X"87",X"85",X"76",X"81",X"88",X"80",X"77",X"81",X"88",X"7E",X"82",X"7E",X"78",X"82",X"87",X"81", + X"77",X"80",X"88",X"7F",X"78",X"81",X"89",X"7E",X"82",X"7E",X"78",X"82",X"88",X"81",X"78",X"7F", + X"89",X"7E",X"82",X"7E",X"78",X"83",X"88",X"7A",X"7B",X"88",X"81",X"7E",X"77",X"87",X"84",X"7F", + X"78",X"82",X"89",X"75",X"84",X"85",X"7F",X"81",X"78",X"7E",X"8A",X"7E",X"79",X"89",X"80",X"81", + X"7D",X"78",X"85",X"86",X"81",X"76",X"86",X"84",X"80",X"79",X"7E",X"88",X"81",X"79",X"7D",X"8A", + X"7E",X"82",X"7E",X"7A",X"7D",X"88",X"82",X"81",X"79",X"7F",X"8A",X"79",X"7B",X"88",X"82",X"7F", + X"7F",X"77",X"85",X"86",X"7F",X"78",X"82",X"88",X"7F",X"82",X"7B",X"7A",X"86",X"85",X"7F",X"81", + X"77",X"82",X"87",X"80",X"78",X"83",X"86",X"7D",X"83",X"77",X"81",X"88",X"7F",X"82",X"7B",X"7A", + X"88",X"83",X"77",X"83",X"87",X"78",X"7E",X"88",X"80",X"80",X"7F",X"79",X"7D",X"87",X"83",X"80", + X"77",X"83",X"85",X"7F",X"7A",X"7C",X"89",X"81",X"7A",X"7D",X"8A",X"7A",X"7B",X"86",X"84",X"7A", + X"7C",X"89",X"7F",X"82",X"7C",X"7A",X"88",X"81",X"77",X"85",X"86",X"77",X"84",X"85",X"77",X"81", + X"88",X"78",X"7D",X"87",X"82",X"78",X"81",X"87",X"7A",X"7C",X"89",X"7D",X"79",X"87",X"83",X"7A", + X"7C",X"88",X"82",X"7A",X"7D",X"88",X"80",X"78",X"86",X"83",X"76",X"84",X"86",X"7E",X"78",X"86", + X"83",X"7E",X"81",X"77",X"81",X"86",X"83",X"79",X"7E",X"88",X"7F",X"81",X"7D",X"79",X"86",X"84", + X"7E",X"82",X"77",X"81",X"86",X"82",X"78",X"82",X"86",X"80",X"7D",X"7A",X"89",X"80",X"7F",X"78", + X"88",X"81",X"78",X"87",X"81",X"7F",X"81",X"78",X"82",X"88",X"79",X"7F",X"88",X"7B",X"7B",X"85", + X"85",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"79",X"84",X"85",X"80",X"80",X"78",X"86",X"84",X"77", + X"81",X"87",X"7E",X"82",X"7A",X"7D",X"89",X"7E",X"82",X"7D",X"7A",X"82",X"87",X"7F",X"81",X"7F", + X"79",X"83",X"87",X"7A",X"7C",X"87",X"81",X"7E",X"79",X"85",X"85",X"7E",X"79",X"84",X"86",X"79", + X"7E",X"88",X"7B",X"7B",X"86",X"83",X"7F",X"82",X"79",X"7E",X"87",X"81",X"7D",X"79",X"86",X"84", + X"7F",X"79",X"84",X"85",X"77",X"85",X"84",X"7F",X"81",X"7A",X"7D",X"86",X"83",X"7E",X"82",X"7B", + X"7C",X"87",X"81",X"78",X"81",X"86",X"7F",X"79",X"82",X"86",X"7E",X"79",X"81",X"87",X"7E",X"79", + X"87",X"82",X"7F",X"80",X"78",X"84",X"85",X"7C",X"7B",X"87",X"81",X"80",X"78",X"86",X"83",X"80", + X"7B",X"7C",X"88",X"81",X"7C",X"7C",X"89",X"7B",X"7B",X"85",X"84",X"7B",X"7B",X"85",X"84",X"7C", + X"7A",X"86",X"84",X"7C",X"7B",X"87",X"82",X"7F",X"79",X"85",X"84",X"78",X"84",X"84",X"7A",X"7E", + X"87",X"81",X"7A",X"81",X"86",X"7A",X"7C",X"87",X"81",X"7F",X"81",X"7A",X"7F",X"88",X"7E",X"7A", + X"85",X"83",X"7A",X"7E",X"88",X"7B",X"7D",X"88",X"7D",X"7B",X"87",X"80",X"79",X"84",X"84",X"7E", + X"82",X"79",X"7F",X"87",X"80",X"80",X"79",X"83",X"86",X"7F",X"79",X"83",X"85",X"78",X"80",X"87", + X"7F",X"81",X"7A",X"7F",X"88",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"7A",X"84",X"85",X"7F",X"79", + X"81",X"87",X"7E",X"82",X"7B",X"7E",X"87",X"7E",X"79",X"84",X"85",X"7E",X"82",X"7C",X"7B",X"84", + X"86",X"78",X"83",X"84",X"80",X"7A",X"7E",X"86",X"82",X"7A",X"7E",X"87",X"81",X"7A",X"7F",X"87", + X"80",X"7E",X"79",X"86",X"83",X"7F",X"81",X"79",X"81",X"86",X"7E",X"82",X"7B",X"7D",X"87",X"80", + X"81",X"7F",X"7A",X"81",X"87",X"7C",X"7B",X"86",X"82",X"7C",X"7B",X"86",X"83",X"7D",X"7A",X"88", + X"7E",X"7B",X"85",X"82",X"7B",X"7D",X"87",X"80",X"7E",X"7A",X"85",X"84",X"7E",X"7A",X"85",X"84", + X"7E",X"7A",X"84",X"84",X"7E",X"82",X"79",X"80",X"86",X"7E",X"7A",X"85",X"83",X"7F",X"80",X"79", + X"85",X"84",X"79",X"82",X"86",X"79",X"81",X"86",X"7B",X"7D",X"87",X"7F",X"79",X"86",X"81",X"79", + X"85",X"83",X"79",X"82",X"85",X"78",X"82",X"85",X"7F",X"81",X"7B",X"7D",X"87",X"80",X"80",X"7F", + X"7A",X"83",X"86",X"7B",X"7D",X"86",X"81",X"7B",X"7D",X"86",X"82",X"7C",X"7D",X"88",X"7D",X"7B", + X"83",X"85",X"7E",X"7A",X"83",X"85",X"7C",X"7C",X"86",X"80",X"7F",X"7A",X"85",X"83",X"79",X"85", + X"83",X"7A",X"81",X"86",X"79",X"80",X"85",X"81",X"7E",X"7B",X"87",X"80",X"81",X"7E",X"7B",X"83", + X"86",X"79",X"81",X"84",X"80",X"7B",X"80",X"86",X"7F",X"7D",X"7D",X"88",X"7E",X"82",X"7C",X"7C", + X"85",X"83",X"79",X"81",X"86",X"7F",X"7A",X"82",X"86",X"79",X"80",X"85",X"81",X"7A",X"7F",X"86", + X"81",X"7B",X"7E",X"87",X"7F",X"80",X"80",X"7B",X"80",X"87",X"7E",X"7A",X"85",X"83",X"7F",X"7A", + X"84",X"84",X"7F",X"7C",X"7E",X"87",X"7E",X"82",X"7D",X"7B",X"85",X"81",X"7F",X"7A",X"85",X"82", + X"7F",X"7B",X"80",X"86",X"80",X"7B",X"80",X"86",X"7F",X"80",X"80",X"7A",X"81",X"85",X"7F",X"7A", + X"82",X"85",X"80",X"7B",X"81",X"86",X"7C",X"7C",X"86",X"81",X"81",X"7C",X"7E",X"86",X"7F",X"80", + X"79",X"84",X"84",X"7F",X"80",X"7F",X"7A",X"83",X"84",X"7F",X"81",X"7B",X"7E",X"83",X"85",X"7D", + X"7C",X"86",X"81",X"7A",X"81",X"85",X"7F",X"7B",X"84",X"82",X"7F",X"81",X"7A",X"80",X"85",X"81", + X"7F",X"81",X"7D",X"7C",X"84",X"84",X"7F",X"7A",X"82",X"85",X"7F",X"81",X"7F",X"7A",X"84",X"83", + X"7F",X"80",X"7A",X"81",X"85",X"80",X"80",X"7D",X"7C",X"86",X"81",X"80",X"80",X"7A",X"85",X"82", + X"7F",X"81",X"7B",X"7E",X"85",X"82",X"7F",X"81",X"7B",X"7F",X"84",X"83",X"7C",X"7D",X"85",X"82", + X"7C",X"7E",X"86",X"7D",X"7C",X"85",X"82",X"7F",X"81",X"7E",X"7B",X"84",X"83",X"81",X"7C",X"7D", + X"87",X"7C",X"7E",X"86",X"7F",X"7B",X"86",X"80",X"81",X"7C",X"7E",X"86",X"7F",X"7B",X"83",X"84", + X"7F",X"80",X"7A",X"81",X"85",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"7E",X"7C",X"87",X"7E",X"7C", + X"85",X"80",X"7B",X"84",X"82",X"79",X"82",X"84",X"81",X"7A",X"81",X"85",X"80",X"7F",X"7B",X"86", + X"81",X"7A",X"83",X"84",X"7F",X"81",X"7F",X"7B",X"82",X"85",X"7B",X"7D",X"85",X"81",X"7F",X"81", + X"7D",X"7C",X"85",X"82",X"80",X"7A",X"83",X"83",X"80",X"7D",X"7D",X"86",X"80",X"7F",X"7B",X"84", + X"83",X"7F",X"81",X"7E",X"7C",X"83",X"84",X"7B",X"81",X"85",X"7C",X"7E",X"86",X"7C",X"7D",X"84", + X"84",X"7C",X"7E",X"85",X"80",X"7C",X"7D",X"85",X"81",X"7F",X"81",X"7C",X"7F",X"86",X"7F",X"81", + X"7F",X"7B",X"84",X"83",X"7C",X"7F",X"86",X"7B",X"7E",X"84",X"82",X"7D",X"7D",X"85",X"80",X"7F", + X"7B",X"86",X"80",X"80",X"7F",X"7B",X"82",X"85",X"7B",X"80",X"84",X"80",X"7D",X"7D",X"85",X"82", + X"7D",X"7D",X"85",X"81",X"7D",X"7D",X"84",X"82",X"7D",X"7E",X"86",X"7D",X"7C",X"84",X"82",X"7B", + X"80",X"85",X"7F",X"80",X"80",X"7B",X"81",X"85",X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"7B", + X"81",X"84",X"7F",X"7B",X"83",X"83",X"7F",X"81",X"7B",X"80",X"83",X"83",X"7D",X"7C",X"85",X"81", + X"7F",X"81",X"7D",X"7D",X"83",X"83",X"80",X"7B",X"83",X"83",X"80",X"7B",X"81",X"84",X"80",X"7C", + X"80",X"85",X"7B",X"7E",X"84",X"82",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"80",X"7B",X"83",X"84", + X"7A",X"83",X"82",X"80",X"7C",X"81",X"85",X"7B",X"7F",X"84",X"80",X"7F",X"81",X"7C",X"7F",X"85", + X"7E",X"7C",X"83",X"84",X"7F",X"81",X"7B",X"80",X"84",X"7F",X"81",X"7D",X"7C",X"83",X"83",X"80", + X"7B",X"80",X"84",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F",X"7C",X"81",X"85",X"7B",X"7F",X"85", + X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"80",X"80",X"7B",X"82",X"83",X"7F",X"81",X"7D",X"7D", + X"85",X"80",X"80",X"80",X"7C",X"80",X"85",X"80",X"80",X"7F",X"7C",X"85",X"81",X"7B",X"82",X"83", + X"7A",X"82",X"83",X"7F",X"81",X"7B",X"80",X"85",X"7F",X"7C",X"84",X"82",X"7B",X"80",X"84",X"81", + X"7C",X"7F",X"85",X"7F",X"82",X"7D",X"7E",X"85",X"80",X"7B",X"82",X"83",X"7F",X"80",X"7B",X"85", + X"81",X"7B",X"81",X"84",X"80",X"7C",X"83",X"82",X"7B",X"80",X"84",X"80",X"81",X"7C",X"81",X"85", + X"7B",X"7F",X"85",X"7D",X"7D",X"84",X"81",X"80",X"81",X"7E",X"7C",X"83",X"83",X"7F",X"7C",X"81", + X"84",X"7F",X"81",X"7C",X"7F",X"85",X"7F",X"7C",X"82",X"83",X"7E",X"7C",X"82",X"84",X"7F",X"81", + X"7F",X"7C",X"81",X"84",X"80",X"80",X"81",X"7C",X"80",X"85",X"7F",X"7C",X"84",X"80",X"81",X"7C", + X"7F",X"84",X"81",X"7E",X"7D",X"84",X"82",X"7D",X"7D",X"84",X"81",X"7E",X"7C",X"84",X"81",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"7C",X"82",X"83",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F", + X"7C",X"80",X"83",X"82",X"7D",X"7E",X"84",X"81",X"7F",X"81",X"7C",X"80",X"84",X"81",X"7D",X"7E", + X"84",X"80",X"7F",X"7C",X"83",X"83",X"7E",X"7D",X"84",X"81",X"7B",X"82",X"83",X"7F",X"7C",X"81", + X"83",X"80",X"7C",X"81",X"84",X"7F",X"80",X"80",X"7C",X"81",X"84",X"7D",X"7D",X"83",X"82",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"80",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"84",X"81", + X"7F",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"85",X"80",X"80",X"7F",X"7C",X"83",X"82",X"7C", + X"81",X"84",X"7C",X"80",X"84",X"7D",X"7E",X"85",X"7F",X"7C",X"83",X"82",X"7F",X"81",X"7C",X"81", + X"84",X"80",X"80",X"80",X"7D",X"7F",X"83",X"82",X"7C",X"81",X"83",X"7F",X"81",X"7C",X"7F",X"83", + X"81",X"7F",X"81",X"7D",X"7E",X"85",X"80",X"80",X"7F",X"7C",X"82",X"83",X"7D",X"7E",X"83",X"82", + X"7E",X"7D",X"84",X"81",X"80",X"80",X"7C",X"81",X"84",X"80",X"81",X"7E",X"7D",X"84",X"82",X"7C", + X"82",X"83",X"7C",X"7F",X"84",X"80",X"80",X"81",X"7D",X"7E",X"83",X"82",X"80",X"80",X"7C",X"82", + X"83",X"7C",X"80",X"84",X"7D",X"7D",X"84",X"80",X"81",X"7C",X"82",X"83",X"7F",X"7E",X"7E",X"84", + X"80",X"80",X"80",X"7D",X"7E",X"85",X"80",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7F",X"7C",X"82", + X"83",X"7B",X"80",X"83",X"80",X"7D",X"7E",X"84",X"80",X"80",X"80",X"7D",X"7F",X"84",X"7F",X"7C", + X"84",X"81",X"80",X"7C",X"83",X"82",X"7C",X"82",X"82",X"7C",X"80",X"84",X"7D",X"7E",X"84",X"80", + X"80",X"80",X"7C",X"83",X"82",X"80",X"7E",X"7E",X"85",X"7E",X"7D",X"82",X"83",X"7E",X"7D",X"83", + X"80",X"7C",X"83",X"81",X"7C",X"83",X"81",X"80",X"80",X"7C",X"7F",X"82",X"82",X"7E",X"7D",X"83", + X"82",X"7E",X"7D",X"83",X"82",X"7E",X"7E",X"84",X"7F",X"7C",X"84",X"80",X"7C",X"83",X"81",X"7F", + X"80",X"7C",X"81",X"83",X"80",X"7F",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7B",X"82",X"82",X"7F", + X"80",X"7C",X"82",X"82",X"80",X"7D",X"82",X"83",X"7B",X"82",X"82",X"80",X"7D",X"80",X"83",X"80", + X"7D",X"80",X"84",X"7F",X"81",X"7F",X"7D",X"82",X"83",X"80",X"7C",X"81",X"83",X"7F",X"7D",X"81", + X"84",X"7D",X"7F",X"84",X"7F",X"7D",X"84",X"80",X"81",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7E", + X"82",X"83",X"7F",X"81",X"7D",X"7F",X"83",X"81",X"7D",X"7F",X"84",X"80",X"7C",X"83",X"81",X"7C", + X"82",X"82",X"7C",X"80",X"83",X"80",X"80",X"80",X"7D",X"7E",X"83",X"81",X"80",X"80",X"7F",X"7D", + X"82",X"83",X"80",X"80",X"80",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7D",X"82",X"82",X"80",X"7E", + X"7D",X"84",X"81",X"80",X"80",X"7D",X"80",X"84",X"7E",X"7E",X"83",X"81",X"7F",X"7D",X"82",X"82", + X"7E",X"7E",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"7D",X"82",X"83",X"7F",X"7D",X"83",X"81",X"7C", + X"82",X"81",X"7F",X"81",X"7D",X"80",X"83",X"7F",X"7D",X"83",X"81",X"7F",X"81",X"7C",X"81",X"83", + X"7F",X"80",X"7F",X"7D",X"82",X"82",X"80",X"7D",X"80",X"83",X"80",X"7D",X"82",X"82",X"7F",X"81", + X"7D",X"7F",X"82",X"82",X"7D",X"81",X"83",X"7F",X"81",X"7D",X"7E",X"84",X"7F",X"7D",X"83",X"80", + X"7D",X"83",X"81",X"80",X"7E",X"7E",X"84",X"7E",X"7E",X"82",X"81",X"7D",X"80",X"83",X"81",X"7E", + X"7E",X"83",X"81",X"7D",X"80",X"83",X"7E",X"7E",X"83",X"81",X"80",X"80",X"7C",X"82",X"82",X"7E", + X"7E",X"83",X"81",X"7E",X"7E",X"83",X"80",X"80",X"7F",X"7D",X"83",X"80",X"80",X"7D",X"83",X"81", + X"80",X"7D",X"80",X"83",X"7F",X"81",X"7E",X"7F",X"83",X"7F",X"7D",X"83",X"80",X"7C",X"83",X"81", + X"7D",X"82",X"82",X"7C",X"81",X"82",X"80",X"7E",X"7F",X"83",X"81",X"7E",X"7F",X"83",X"80",X"80", + X"81",X"7D",X"7F",X"83",X"81",X"7D",X"80",X"83",X"80",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"7F", + X"83",X"80",X"7D",X"83",X"80",X"7F",X"7D",X"83",X"81",X"80",X"80",X"7D",X"81",X"83",X"80",X"7D", + X"83",X"81",X"80",X"80",X"7D",X"80",X"82",X"81",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81", + X"80",X"81",X"7E",X"7E",X"82",X"82",X"7F",X"7D",X"82",X"82",X"7C",X"81",X"82",X"81",X"7D",X"81", + X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"81",X"7E",X"7E", + X"83",X"81",X"7F",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82",X"82",X"7E",X"7E",X"83", + X"80",X"80",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"7F",X"7E",X"83",X"80",X"7D",X"81",X"83", + X"7F",X"80",X"80",X"7D",X"80",X"83",X"7D",X"7F",X"83",X"80",X"81",X"7E",X"7E",X"83",X"80",X"80", + X"80",X"7D",X"80",X"82",X"82",X"7D",X"80",X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"80",X"80",X"7D",X"80",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"81",X"7F",X"7E",X"82",X"81", + X"7D",X"81",X"82",X"7F",X"81",X"7D",X"80",X"82",X"81",X"7E",X"7F",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"7D",X"81",X"82",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"7F",X"7D",X"81",X"83",X"7F", + X"7E",X"82",X"81",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"81",X"82",X"7F",X"80",X"7E",X"7E",X"82", + X"82",X"80",X"80",X"7D",X"81",X"83",X"7E",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82", + X"82",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"80",X"82",X"80",X"7E",X"80",X"83",X"80", + X"7F",X"7E",X"83",X"81",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"83",X"7F", + X"7E",X"83",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"80",X"7D",X"80",X"82", + X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"82",X"80",X"7F",X"7E",X"83",X"7F",X"7E", + X"83",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"81",X"81",X"80",X"7E",X"7F",X"83",X"80", + X"7F",X"7E",X"83",X"80",X"80",X"80",X"7F",X"7E",X"82",X"82",X"80",X"80",X"80",X"7D",X"81",X"82", + X"7D",X"80",X"83",X"7F",X"7E",X"82",X"81",X"7D",X"80",X"82",X"80",X"7D",X"81",X"81",X"80",X"7D", + X"81",X"82",X"80",X"7E",X"7F",X"83",X"80",X"80",X"80",X"7E",X"7F",X"82",X"82",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"82",X"82",X"80",X"80",X"80",X"7E",X"80",X"82", + X"81",X"7E",X"81",X"82",X"7F",X"81",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"80",X"82",X"81", + X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E",X"80",X"82",X"80", + X"80",X"80",X"7D",X"82",X"81",X"80",X"80",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"82",X"81", + X"7F",X"81",X"7E",X"7F",X"82",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"7D", + X"81",X"82",X"7D",X"80",X"82",X"80",X"7E",X"81",X"82",X"7D",X"81",X"81",X"80",X"7D",X"81",X"82", + X"7F",X"80",X"7E",X"7F",X"82",X"81",X"7F",X"81",X"7D",X"81",X"82",X"7E",X"7F",X"82",X"81",X"7E", + X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E", + X"7F",X"82",X"81",X"7E",X"81",X"82",X"7E",X"7F",X"82",X"80",X"80",X"7E",X"81",X"82",X"7F",X"80", + X"7E",X"80",X"81",X"82",X"7F",X"7E",X"82",X"81",X"7F",X"81",X"7F",X"7E",X"82",X"81",X"7E",X"80", + X"82",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E", + X"82",X"81",X"80",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"82",X"80",X"7F",X"7F",X"83",X"7E",X"7F", + X"82",X"80",X"7F",X"7E",X"82",X"81",X"7F",X"7E",X"82",X"81",X"80",X"7E",X"81",X"81",X"80",X"7E", + X"80",X"82",X"80",X"7F",X"7E",X"83",X"80",X"80",X"80",X"7E",X"81",X"82",X"80",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7E",X"7F",X"82",X"81",X"7F",X"7F",X"83",X"7E",X"7F",X"82",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GAL_HIT.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GAL_HIT.vhd new file mode 100644 index 00000000..7d2fd29c --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/GAL_HIT.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_HIT 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 prom of GAL_HIT is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"65",X"75",X"88",X"90",X"93",X"9B",X"A3",X"A3",X"A3",X"A6",X"9E",X"9B",X"9B",X"A3",X"AB",X"B6", + X"B9",X"B9",X"BE",X"B9",X"AE",X"A6",X"9E",X"98",X"88",X"78",X"68",X"65",X"65",X"65",X"62",X"68", + X"68",X"65",X"5D",X"52",X"47",X"47",X"4A",X"4D",X"4D",X"4D",X"52",X"65",X"7D",X"88",X"90",X"9B", + X"A3",X"AE",X"AE",X"AB",X"AB",X"9E",X"98",X"88",X"70",X"52",X"37",X"1F",X"17",X"1F",X"27",X"3A", + X"5A",X"68",X"78",X"83",X"93",X"A3",X"AB",X"AE",X"A3",X"93",X"88",X"88",X"83",X"88",X"8B",X"88", + X"78",X"62",X"4A",X"42",X"3A",X"42",X"4D",X"55",X"65",X"78",X"83",X"8B",X"93",X"90",X"88",X"88", + X"98",X"A6",X"A6",X"AB",X"9E",X"8B",X"7D",X"68",X"70",X"88",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC", + X"FC",X"FC",X"DC",X"9B",X"4D",X"14",X"01",X"04",X"2F",X"52",X"5D",X"68",X"78",X"80",X"78",X"70", + X"5D",X"47",X"32",X"1F",X"14",X"09",X"11",X"1C",X"32",X"52",X"83",X"B9",X"D1",X"C9",X"AB",X"8B", + X"70",X"68",X"75",X"78",X"80",X"8B",X"8B",X"98",X"AB",X"BE",X"C1",X"AB",X"83",X"5D",X"3A",X"17", + X"11",X"17",X"27",X"3A",X"65",X"90",X"AE",X"B6",X"9B",X"78",X"55",X"4A",X"4D",X"5A",X"5D",X"52", + X"4A",X"4A",X"52",X"78",X"AB",X"D4",X"FC",X"FC",X"F7",X"E9",X"E1",X"D1",X"C9",X"BE",X"AB",X"90", + X"52",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"2F",X"4A",X"52",X"47",X"47",X"62",X"70",X"7D", + X"7D",X"78",X"7D",X"90",X"B3",X"CE",X"EC",X"FC",X"FC",X"FC",X"FC",X"F4",X"E9",X"F4",X"FC",X"FC", + X"FC",X"FC",X"CE",X"98",X"65",X"2C",X"01",X"01",X"01",X"01",X"01",X"32",X"6D",X"7D",X"68",X"4A", + X"27",X"11",X"1C",X"3A",X"4D",X"62",X"68",X"65",X"68",X"70",X"80",X"9B",X"D1",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"A3",X"75",X"55",X"62",X"80",X"A3",X"BE",X"CE",X"C1",X"90",X"4A",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"88",X"C9",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC", + X"B6",X"90",X"68",X"3F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1F",X"83",X"BE",X"D1",X"CE", + X"D4",X"F4",X"FC",X"FC",X"FC",X"F7",X"D1",X"CE",X"DC",X"F7",X"FC",X"FC",X"FC",X"FC",X"D1",X"8B", + X"68",X"68",X"88",X"A6",X"C1",X"D9",X"D4",X"BE",X"A3",X"88",X"75",X"68",X"62",X"5D",X"62",X"68", + X"6D",X"78",X"75",X"55",X"2C",X"11",X"11",X"2F",X"55",X"75",X"83",X"93",X"9E",X"B9",X"E9",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"68",X"32",X"11",X"17",X"32",X"52",X"7D", + X"AE",X"E1",X"F7",X"E1",X"A3",X"62",X"17",X"01",X"01",X"01",X"01",X"01",X"1C",X"4D",X"7D",X"90", + X"9B",X"A6",X"B6",X"BE",X"A6",X"70",X"37",X"14",X"14",X"1C",X"14",X"1C",X"2F",X"3A",X"3A",X"3A", + X"4A",X"52",X"4A",X"47",X"3A",X"24",X"11",X"14",X"27",X"3A",X"65",X"9E",X"D4",X"FC",X"FC",X"F7", + X"D4",X"AB",X"93",X"93",X"93",X"83",X"68",X"4D",X"37",X"37",X"5D",X"9B",X"EC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"CE",X"AB",X"93",X"7D",X"65",X"65",X"75",X"88",X"93",X"98",X"98",X"93", + X"93",X"90",X"93",X"8B",X"90",X"90",X"90",X"8B",X"8B",X"90",X"8B",X"90",X"90",X"90",X"90",X"8B", + X"8B",X"8B",X"8B",X"8B",X"88",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"83",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"78",X"75",X"78",X"75",X"78", + X"78",X"78",X"75",X"78",X"75",X"70",X"75",X"75",X"75",X"75",X"70",X"6D",X"68",X"6D",X"70",X"6D", + X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"70",X"70",X"70",X"75",X"75",X"75",X"75", + X"75",X"70",X"62",X"4D",X"4D",X"4D",X"47",X"4A",X"68",X"98",X"B6",X"B3",X"9B",X"78",X"5A",X"3F", + X"32",X"2F",X"32",X"3F",X"5A",X"90",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"E9",X"90",X"4D",X"3A", + X"47",X"5D",X"5D",X"4D",X"3A",X"27",X"1C",X"14",X"11",X"0C",X"01",X"01",X"01",X"01",X"01",X"01", + X"04",X"4A",X"9E",X"F7",X"FC",X"FC",X"FC",X"FC",X"EC",X"E4",X"E4",X"D1",X"AB",X"80",X"62",X"47", + X"37",X"2F",X"2C",X"24",X"04",X"01",X"24",X"52",X"70",X"70",X"62",X"4D",X"3F",X"37",X"37",X"3A", + X"4D",X"62",X"78",X"93",X"AE",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"B6",X"68", + X"2C",X"01",X"01",X"01",X"01",X"01",X"01",X"09",X"47",X"65",X"68",X"68",X"62",X"5A",X"52",X"4D", + X"52",X"4D",X"52",X"52",X"5A",X"5D",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"65",X"37",X"1C", + X"09",X"09",X"1C",X"32",X"4D",X"70",X"93",X"AB",X"C9",X"D9",X"E9",X"EF",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"F7",X"6D",X"0C",X"01",X"01",X"01",X"01",X"01",X"17",X"62",X"83",X"78", + X"5A",X"37",X"14",X"04",X"01",X"01",X"01",X"01",X"04",X"11",X"1C",X"1C",X"01",X"01",X"0C",X"3F", + X"6D",X"7D",X"78",X"68",X"65",X"83",X"B3",X"E1",X"F4",X"E4",X"C6",X"A3",X"8B",X"75",X"68",X"65", + X"5D",X"62",X"65",X"62",X"5A",X"3F",X"27",X"17",X"1F",X"5A",X"9E",X"CE",X"D4",X"C9",X"AE",X"A6", + X"AE",X"AB",X"9B",X"83",X"80",X"98",X"9B",X"9B",X"9B",X"B6",X"D9",X"E4",X"E1",X"DC",X"E1",X"D4", + X"B3",X"83",X"5A",X"3A",X"1F",X"11",X"0C",X"11",X"14",X"1C",X"1F",X"2C",X"2C",X"1F",X"27",X"32", + X"3F",X"5D",X"83",X"9B",X"93",X"93",X"88",X"7D",X"7D",X"75",X"70",X"70",X"6D",X"68",X"68",X"68", + X"5A",X"5A",X"75",X"88",X"93",X"93",X"90",X"90",X"88",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"80", + X"7D",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80",X"83",X"83",X"80",X"80", + X"80",X"7D",X"7D",X"70",X"70",X"6D",X"75",X"83",X"90",X"93",X"90",X"88",X"88",X"80",X"78",X"7D", + X"70",X"68",X"70",X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"75",X"70",X"68",X"4D",X"3A", + X"4A",X"70",X"93",X"A3",X"B6",X"B9",X"B3",X"A3",X"90",X"80",X"75",X"70",X"68",X"68",X"68",X"65", + X"68",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"75",X"78", + X"78",X"78",X"78",X"78",X"78",X"78",X"70",X"55",X"37",X"1F",X"24",X"47",X"68",X"7D",X"88",X"8B", + X"88",X"88",X"88",X"8B",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"C9",X"AB",X"80",X"5A", + X"4A",X"47",X"37",X"2C",X"32",X"4D",X"70",X"78",X"7D",X"8B",X"90",X"88",X"68",X"4A",X"2C",X"1C", + X"11",X"09",X"01",X"01",X"01",X"01",X"14",X"27",X"47",X"70",X"AE",X"E1",X"F4",X"E4",X"D1",X"AE", + X"93",X"80",X"70",X"68",X"62",X"62",X"65",X"68",X"6D",X"75",X"78",X"78",X"65",X"4A",X"4D",X"5A", + X"62",X"65",X"68",X"88",X"B9",X"EC",X"FC",X"F4",X"D1",X"B6",X"B3",X"AE",X"A3",X"98",X"A3",X"C6", + X"D9",X"D4",X"D4",X"E1",X"E1",X"C9",X"9E",X"78",X"62",X"3F",X"32",X"2C",X"27",X"2C",X"32",X"37", + X"3F",X"47",X"4A",X"52",X"55",X"5A",X"5D",X"5D",X"5A",X"3F",X"27",X"14",X"11",X"14",X"24",X"4A", + X"80",X"A6",X"BE",X"C6",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC",X"BE",X"AB",X"8B", + X"5D",X"2F",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"70",X"6D",X"5D",X"4D", + X"4D",X"68",X"9B",X"BE",X"C9",X"B9",X"B3",X"AB",X"9B",X"A3",X"B3",X"C6",X"D1",X"B6",X"8B",X"52", + X"1C",X"11",X"11",X"14",X"37",X"62",X"90",X"9E",X"9B",X"83",X"75",X"5D",X"47",X"32",X"2F",X"24", + X"17",X"11",X"11",X"17",X"27",X"5D",X"A3",X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"EF",X"CE", + X"9B",X"7D",X"68",X"62",X"62",X"7D",X"98",X"9E",X"93",X"7D",X"6D",X"5D",X"55",X"52",X"52",X"52", + X"55",X"55",X"5D",X"62",X"65",X"68",X"6D",X"70",X"75",X"7D",X"78",X"7D",X"80",X"83",X"78",X"62", + X"3A",X"27",X"14",X"17",X"27",X"3F",X"5A",X"78",X"98",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70",X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32", + X"04",X"01",X"01",X"01",X"01",X"01",X"11",X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78", + X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24",X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93", + X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90",X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E", + X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E",X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B", + X"88",X"75",X"52",X"37",X"1F",X"1C",X"27",X"37",X"4D",X"68",X"83",X"AE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D1",X"9B",X"65",X"42",X"3A",X"52",X"80",X"AE",X"D4",X"E9",X"E4",X"C6", + X"80",X"3A",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"32",X"88",X"C6",X"F7",X"FC", + X"E4",X"CE",X"B9",X"A3",X"80",X"62",X"47",X"37",X"2F",X"2C",X"2F",X"37",X"3F",X"3A",X"32",X"3A", + X"37",X"32",X"37",X"3A",X"52",X"7D",X"B3",X"DC",X"E4",X"E1",X"D1",X"D1",X"E1",X"FC",X"FC",X"FC", + X"FC",X"F4",X"CE",X"A3",X"83",X"75",X"7D",X"83",X"83",X"88",X"98",X"A6",X"A6",X"98",X"88",X"75", + X"68",X"5D",X"5A",X"5A",X"5A",X"62",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"7D",X"83",X"83", + X"80",X"75",X"68",X"70",X"80",X"8B",X"93",X"98",X"98",X"90",X"90",X"8B",X"90",X"98",X"A3",X"AE", + X"B6",X"C9",X"C9",X"C1",X"B3",X"A3",X"98",X"8B",X"78",X"75",X"70",X"6D",X"65",X"68",X"70",X"80", + X"83",X"83",X"88",X"8B",X"83",X"78",X"68",X"5D",X"52",X"42",X"2C",X"27",X"2C",X"3A",X"47",X"42", + X"42",X"52",X"70",X"8B",X"A6",X"AB",X"A3",X"9E",X"9E",X"B3",X"B9",X"B9",X"BE",X"BE",X"B9",X"A3", + X"88",X"68",X"5D",X"5A",X"5A",X"52",X"52",X"68",X"70",X"65",X"62",X"62",X"68",X"7D",X"8B",X"8B", + X"83",X"75",X"65",X"68",X"75",X"80",X"9B",X"C1",X"EC",X"FC",X"FC",X"F7",X"EF",X"E9",X"D1",X"A3", + X"78",X"5D",X"42",X"2C",X"14",X"0C",X"09",X"0C",X"0C",X"17",X"2C",X"47",X"62",X"75",X"75",X"68", + X"62",X"52",X"4A",X"4A",X"42",X"3F",X"4A",X"55",X"68",X"90",X"A3",X"B9",X"C6",X"CE",X"E4",X"FC", + X"FC",X"EC",X"E9",X"E9",X"DC",X"C1",X"B3",X"A6",X"98",X"75",X"52",X"3A",X"2C",X"1C",X"11",X"01", + X"0C",X"1F",X"37",X"52",X"70",X"78",X"78",X"68",X"62",X"62",X"75",X"98",X"B6",X"BE",X"B3",X"AB", + X"A6",X"9B",X"9E",X"AE",X"B9",X"C1",X"AE",X"90",X"5D",X"32",X"2C",X"27",X"2C",X"3F",X"62",X"83", + X"93",X"90",X"88",X"80",X"70",X"5D",X"52",X"47",X"3A",X"2F",X"24",X"1F",X"2C",X"3A",X"68",X"A3", + X"D4",X"F4",X"FC",X"FC",X"F4",X"E9",X"E9",X"DC",X"B9",X"90",X"78",X"68",X"5D",X"62",X"7D",X"93", + X"9B",X"90",X"7D",X"70",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5A",X"5D",X"65",X"68",X"68",X"70", + X"70",X"75",X"78",X"78",X"7D",X"80",X"80",X"78",X"65",X"3F",X"27",X"17",X"1C",X"2C",X"3F",X"5D", + X"78",X"93",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70", + X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32",X"04",X"01",X"01",X"01",X"01",X"01",X"11", + X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78",X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24", + X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93",X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90", + X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E", + X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B",X"88",X"75",X"52",X"37",X"1F",X"1C",X"24", + X"37",X"4D",X"68",X"88",X"AE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"9B",X"65", + X"3F",X"37",X"52",X"80",X"B3",X"D9",X"EC",X"EC",X"C9",X"7D",X"37",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"27",X"88",X"D1",X"FC",X"FC",X"EC",X"D1",X"BE",X"A3",X"7D",X"62",X"3A", + X"2C",X"1F",X"1F",X"24",X"2C",X"32",X"2C",X"27",X"2F",X"27",X"27",X"27",X"2C",X"47",X"7D",X"C1", + X"F7",X"FC",X"FC",X"E9",X"E1",X"EC",X"FC",X"FC",X"FC",X"FC",X"FC",X"E4",X"AE",X"88",X"78",X"83", + X"8B",X"8B",X"93",X"A3",X"B9",X"BE",X"A6",X"90",X"75",X"65",X"52",X"52",X"52",X"4D",X"55",X"5D", + X"62",X"68",X"70",X"70",X"70",X"75",X"80",X"8B",X"90",X"90",X"8B",X"83",X"90",X"98",X"9B",X"9E", + X"9E",X"9B",X"93",X"93",X"8B",X"90",X"8B",X"8B",X"8B",X"88",X"8B",X"8B",X"8B",X"8B",X"88",X"8B", + X"8B",X"8B",X"8B",X"8B",X"8B",X"88",X"8B",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"80",X"80", + X"80",X"7D",X"65",X"47",X"52",X"68",X"78",X"78",X"65",X"5A",X"5D",X"6D",X"75",X"78",X"70",X"68", + X"70",X"90",X"C9",X"EC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A6",X"68",X"42",X"3A",X"37",X"3A",X"5D", + X"7D",X"83",X"68",X"55",X"52",X"47",X"32",X"17",X"09",X"01",X"01",X"09",X"17",X"2C",X"52",X"9B", + X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"DC",X"A6",X"78",X"62",X"47",X"1F",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"3F",X"7D",X"A3",X"9B",X"80",X"5D",X"4A",X"5A",X"7D",X"90",X"9B",X"AB", + X"A6",X"AB",X"AB",X"9E",X"A6",X"BE",X"D4",X"E4",X"D4",X"A6",X"88",X"7D",X"88",X"88",X"83",X"90", + X"A3",X"AB",X"A6",X"9E",X"98",X"8B",X"83",X"80",X"80",X"80",X"83",X"83",X"88",X"8B",X"8B",X"90", + X"90",X"90",X"93",X"98",X"98",X"9B",X"93",X"98",X"93",X"93",X"93",X"93",X"93",X"93",X"90",X"90", + X"90",X"8B",X"8B",X"83",X"80",X"7D",X"68",X"52",X"52",X"62",X"68",X"88",X"AB",X"C6",X"C9",X"C9", + X"B6",X"A6",X"9E",X"8B",X"83",X"8B",X"A3",X"B3",X"AE",X"98",X"80",X"6D",X"5D",X"52",X"47",X"42", + X"47",X"3F",X"47",X"42",X"42",X"4D",X"62",X"65",X"68",X"68",X"68",X"68",X"68",X"68",X"68",X"68", + X"65",X"68",X"68",X"68",X"6D",X"70",X"6D",X"6D",X"70",X"75",X"70",X"75",X"78",X"75",X"78",X"75", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"7D",X"80",X"80",X"6D",X"65",X"70",X"80",X"80",X"68", + X"52",X"32",X"2C",X"37",X"68",X"9B",X"B6",X"B6",X"B6",X"C1",X"D4",X"D9",X"C6",X"A3",X"78",X"5A", + X"3F",X"32",X"32",X"3A",X"55",X"8B",X"CE",X"FC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A3",X"62",X"2F", + X"1C",X"09",X"01",X"01",X"1C",X"47",X"5D",X"68",X"80",X"93",X"90",X"80",X"70",X"5A",X"4D",X"52", + X"68",X"78",X"7D",X"70",X"5D",X"4A",X"3A",X"32",X"32",X"2F",X"27",X"27",X"1C",X"11",X"09",X"0C", + X"14",X"2C",X"42",X"75",X"AB",X"DC",X"F7",X"FC",X"FC",X"F7",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"BE",X"88",X"4D",X"11",X"01",X"01",X"0C",X"3F",X"75",X"9E",X"B6",X"B3", + X"93",X"70",X"52",X"3A",X"1F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"3F", + X"52",X"62",X"68",X"7D",X"9E",X"C1",X"E4",X"FC",X"FC",X"F7",X"E1",X"BE",X"A3",X"90",X"80",X"88", + X"AB",X"E1",X"FC",X"FC",X"FC",X"FC",X"F7",X"BE",X"7D",X"3F",X"0C",X"01",X"01",X"01",X"01",X"27", + X"70",X"B6",X"E9",X"FC",X"FC",X"E9",X"AE",X"83",X"62",X"4D",X"2F",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"3F",X"98",X"CE",X"D1",X"BE",X"B6",X"C1",X"D4",X"E9",X"FC",X"E9",X"C9",X"AB", + X"9B",X"88",X"5D",X"37",X"27",X"27",X"1F",X"1C",X"1C",X"1F",X"37",X"70",X"B6",X"FC",X"FC",X"FC", + X"FC",X"FC",X"F4",X"F4",X"E4",X"C6",X"98",X"70",X"5A",X"3A",X"37",X"47",X"6D",X"AE",X"F7",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"93",X"55",X"17",X"01",X"01",X"01",X"1C",X"4A",X"80",X"AB", + X"B3",X"A6",X"A3",X"A3",X"A3",X"A6",X"9B",X"78",X"42",X"11",X"04",X"11",X"1C",X"1F",X"37",X"55", + X"7D",X"8B",X"80",X"5D",X"47",X"4D",X"65",X"6D",X"5D",X"4A",X"3F",X"4D",X"7D",X"B6",X"EC",X"FC", + X"FC",X"FC",X"E4",X"C6",X"9E",X"98",X"9B",X"90",X"75",X"5D",X"62",X"7D",X"9B",X"C6",X"E1",X"E9", + X"D9",X"B3",X"93",X"83",X"70",X"68",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5D",X"65",X"65",X"68", + X"5A",X"37",X"2F",X"4A",X"65",X"6D",X"68",X"75",X"93",X"BE",X"E4",X"EC",X"D1",X"B3",X"9E",X"AB", + X"AB",X"9E",X"80",X"65",X"42",X"32",X"32",X"4A",X"75",X"90",X"A3",X"BE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"D1",X"93",X"5A",X"3A",X"3A",X"47",X"5A",X"7D",X"A6",X"CE",X"CE",X"B9",X"A6",X"9B",X"80", + X"52",X"1C",X"01",X"01",X"01",X"11",X"47",X"78",X"9E",X"AB",X"9B",X"78",X"5A",X"2C",X"14",X"1C", + X"27",X"1F",X"11",X"01",X"01",X"01",X"1C",X"3F",X"75",X"AB",X"C9",X"D4",X"DC",X"CE",X"C9",X"D1", + X"E1",X"F4",X"FC",X"FC",X"FC",X"E4",X"BE",X"90",X"70",X"4A",X"11",X"01",X"01",X"01",X"01",X"09", + X"17",X"4A",X"90",X"D4",X"FC",X"FC",X"FC",X"F4",X"E9",X"E9",X"FC",X"FC",X"E4",X"B3",X"80",X"52", + X"2F",X"1C",X"1F",X"32",X"68",X"AE",X"F4",X"FC",X"FC",X"FC",X"E4",X"C9",X"AB",X"80",X"5D",X"47", + X"37",X"42",X"75",X"AB",X"DC",X"FC",X"FC",X"FC",X"D9",X"93",X"55",X"37",X"2F",X"3A",X"52",X"62", + X"68",X"68",X"55",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1C",X"32",X"4D",X"68", + X"9B",X"CE",X"E4",X"F4",X"EC",X"E4",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9", + X"88",X"4A",X"17",X"04",X"11",X"42",X"75",X"88",X"9B",X"B6",X"BE",X"A6",X"7D",X"4D",X"1C",X"01", + X"01",X"17",X"27",X"32",X"4D",X"7D",X"A6",X"B3",X"B9",X"C6",X"D1",X"D9",X"D9",X"CE",X"BE",X"A6", + X"90",X"65",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"14",X"68",X"93",X"98",X"83",X"75",X"7D", + X"9E",X"BE",X"C9",X"BE",X"A6",X"9E",X"B6",X"D9",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9",X"C1", + X"B3",X"9B",X"75",X"5D",X"47",X"2F",X"2F",X"4A",X"68",X"7D",X"7D",X"78",X"83",X"90",X"9E",X"AE", + X"A3",X"83",X"75",X"52",X"3F",X"4A",X"5D",X"62",X"55",X"3F",X"2F",X"24",X"32",X"5A",X"7D",X"90", + X"AB",X"CE",X"E4",X"FC",X"FC",X"FC",X"E9",X"CE",X"B3",X"98",X"88",X"83",X"83",X"90",X"B3",X"EC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"75",X"42",X"27",X"14",X"01",X"01",X"1C",X"3F",X"52",X"5A", + X"68",X"78",X"68",X"47",X"17",X"01",X"01",X"09",X"27",X"37",X"4A",X"65",X"75",X"6D",X"65",X"68", + X"68",X"5D",X"4D",X"42",X"27",X"0C",X"0C",X"14",X"1C",X"1F",X"3A",X"68",X"9E",X"CE",X"E1",X"DC", + X"DC",X"DC",X"DC",X"CE",X"A6",X"75",X"5A",X"4A",X"3A",X"4A",X"70",X"98",X"BE",X"E1",X"E9",X"E4", + X"B9",X"9E",X"90",X"8B",X"88",X"75",X"52",X"2F",X"2F",X"4A",X"5D",X"68",X"78",X"80",X"70",X"70", + X"7D",X"8B",X"9E",X"B6",X"BE",X"B6",X"AE",X"9B",X"98",X"AE",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"B9",X"9E",X"88",X"65",X"4D",X"47",X"3F",X"2F",X"11",X"01",X"04", + X"1F",X"2F",X"2F",X"1F",X"11",X"01",X"0C",X"2C",X"4D",X"62",X"78",X"98",X"AB",X"BE",X"DC",X"F4", + X"F7",X"E4",X"E1",X"DC",X"C1",X"9E",X"88",X"62",X"3A",X"14",X"01",X"11",X"17",X"27",X"32",X"55", + X"88",X"B6",X"E4",X"F7",X"E4",X"C6",X"A3",X"75",X"5A",X"52",X"5A",X"68",X"78",X"80",X"80",X"5A", + X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"3F",X"70",X"A3",X"C9",X"E1",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"C6",X"B3",X"98",X"93",X"9B",X"AB",X"B9",X"AB",X"98",X"83",X"68",X"52", + X"4A",X"2F",X"17",X"04",X"01",X"0C",X"37",X"75",X"A3",X"B9",X"D1",X"CE",X"B3",X"A3",X"9B",X"93", + X"93",X"A6",X"BE",X"B9",X"9E",X"7D",X"55",X"37",X"27",X"27",X"4A",X"80",X"A6",X"B3",X"AE",X"AB", + X"B9",X"C6",X"B9",X"B3",X"A3",X"80",X"5D",X"4A",X"47",X"3A",X"32",X"3A",X"5A",X"7D",X"83",X"90", + X"8B",X"83",X"7D",X"70",X"65",X"6D",X"7D",X"78",X"65",X"47",X"1F",X"0C",X"01",X"01",X"09",X"2C", + X"68",X"AE",X"CE",X"D1",X"CE",X"D4",X"E4",X"E4",X"CE",X"A6",X"98",X"9B",X"AB",X"BE",X"CE",X"CE", + X"B9",X"90",X"52",X"14",X"01",X"01",X"01",X"01",X"09",X"3A",X"78",X"9E",X"AE",X"B9",X"CE",X"CE", + X"B9",X"A6",X"90",X"7D",X"7D",X"83",X"80",X"68",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75", + X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6",X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4", + X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A",X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC", + X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52",X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B", + X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9",X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01", + X"01",X"01",X"01",X"01",X"01",X"24",X"47",X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4", + X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3",X"9B",X"98",X"98",X"90",X"83",X"88",X"A6",X"C9",X"DC", + X"D9",X"BE",X"AB",X"7D",X"52",X"2F",X"27",X"1F",X"11",X"17",X"27",X"2F",X"2F",X"3F",X"52",X"5D", + X"5A",X"65",X"70",X"75",X"80",X"88",X"8B",X"9B",X"AB",X"BE",X"C6",X"AE",X"83",X"55",X"27",X"09", + X"09",X"27",X"52",X"83",X"93",X"98",X"93",X"88",X"83",X"80",X"70",X"55",X"3F",X"2C",X"27",X"32", + X"47",X"65",X"8B",X"AE",X"D4",X"E9",X"D9",X"B3",X"98",X"90",X"93",X"88",X"68",X"4D",X"4A",X"5A", + X"68",X"6D",X"7D",X"8B",X"90",X"8B",X"88",X"8B",X"98",X"9E",X"9B",X"83",X"62",X"2F",X"09",X"04", + X"1F",X"47",X"6D",X"98",X"AE",X"B6",X"B3",X"AB",X"9B",X"9B",X"A3",X"B6",X"C6",X"B9",X"9B",X"83", + X"78",X"6D",X"65",X"5A",X"5A",X"68",X"88",X"A6",X"B6",X"A3",X"8B",X"75",X"68",X"6D",X"6D",X"65", + X"5D",X"5D",X"68",X"80",X"A3",X"CE",X"DC",X"D4",X"CE",X"CE",X"C9",X"C6",X"CE",X"BE",X"AB",X"90", + X"80",X"80",X"8B",X"98",X"9E",X"B6",X"DC",X"E4",X"E4",X"E1",X"CE",X"C6",X"B6",X"98",X"80",X"7D", + X"75",X"70",X"68",X"68",X"62",X"3F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"11",X"47",X"68",X"90",X"B6",X"CE",X"D4",X"E1",X"E9",X"E9",X"E4",X"E4",X"E9",X"E4",X"D4",X"C6", + X"A6",X"78",X"42",X"14",X"01",X"01",X"01",X"01",X"14",X"42",X"78",X"AB",X"D1",X"E1",X"D9",X"C6", + X"9B",X"7D",X"75",X"78",X"88",X"93",X"8B",X"88",X"70",X"4D",X"2F",X"24",X"1C",X"24",X"27",X"24", + X"27",X"3A",X"62",X"88",X"B3",X"CE",X"DC",X"EC",X"EF",X"E1",X"CE",X"BE",X"A3",X"83",X"68",X"52", + X"4D",X"55",X"65",X"78",X"78",X"80",X"90",X"90",X"90",X"8B",X"75",X"5D",X"4D",X"52",X"62",X"80", + X"A3",X"B6",X"B6",X"B6",X"A6",X"90",X"83",X"88",X"93",X"9E",X"BE",X"D1",X"C9",X"AE",X"8B",X"62", + X"3F",X"27",X"1C",X"32",X"62",X"88",X"9B",X"A3",X"AB",X"C1",X"CE",X"C1",X"B6",X"A6",X"90",X"6D", + X"5D",X"55",X"3F",X"2F",X"2F",X"47",X"5D",X"65",X"6D",X"75",X"78",X"83",X"7D",X"75",X"7D",X"83", + X"80",X"68",X"4D",X"2F",X"14",X"04",X"04",X"17",X"37",X"70",X"A6",X"C1",X"C1",X"B9",X"BE",X"D1", + X"D4",X"C1",X"A3",X"98",X"9E",X"AE",X"C9",X"D4",X"D4",X"C6",X"98",X"5D",X"24",X"01",X"01",X"01", + X"01",X"17",X"4A",X"7D",X"A3",X"AE",X"B9",X"C9",X"C6",X"B6",X"A3",X"8B",X"7D",X"80",X"83",X"83", + X"6D",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75",X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6", + X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4",X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A", + X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC",X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52", + X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B",X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9", + X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"47", + X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4",X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3", + X"9B",X"98",X"98",X"8B",X"83",X"8B",X"A6",X"C9",X"E1",X"DC",X"C1",X"A6",X"7D",X"4D",X"2C",X"24", + X"17",X"0C",X"11",X"1F",X"2C",X"2C",X"3A",X"52",X"5D",X"5A",X"65",X"70",X"78",X"88",X"90",X"90", + X"9E",X"AB",X"C1",X"C6",X"A6",X"78",X"3F",X"11",X"01",X"01",X"14",X"47",X"80",X"93",X"98",X"93", + X"83",X"70",X"65",X"4D",X"2F",X"14",X"04",X"04",X"27",X"47",X"70",X"A3",X"D1",X"FC",X"FC",X"F7", + X"C9",X"A6",X"9B",X"9B",X"8B",X"70",X"5A",X"5D",X"75",X"7D",X"80",X"8B",X"9E",X"9B",X"93",X"8B", + X"98",X"A3",X"AE",X"AE",X"93",X"68",X"32",X"04",X"04",X"24",X"52",X"88",X"B6",X"C9",X"B9",X"AB", + X"98",X"80",X"80",X"90",X"A6",X"B9",X"BE",X"A6",X"93",X"8B",X"80",X"70",X"4D",X"37",X"3F",X"62", + X"88",X"9E",X"98",X"80",X"65",X"55",X"62",X"68",X"68",X"70",X"75",X"78",X"93",X"C6",X"FC",X"FC", + X"FC",X"FC",X"F7",X"E9",X"DC",X"D4",X"BE",X"A3",X"80",X"68",X"70",X"75",X"75",X"70",X"80",X"A3", + X"B3",X"B3",X"AE",X"98",X"83",X"75",X"5D",X"52",X"5A",X"68",X"78",X"83",X"83",X"78",X"4A",X"11", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"78",X"A6",X"D1",X"E9",X"E4", + X"E1",X"E1",X"DC",X"D9",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"B9",X"75",X"2F",X"01",X"01",X"01", + X"01",X"01",X"01",X"27",X"5D",X"9B",X"D4",X"F4",X"EC",X"CE",X"A6",X"93",X"9E",X"B6",X"B6",X"A3", + X"93",X"8B",X"83",X"70",X"68",X"78",X"93",X"A6",X"9E",X"90",X"83",X"98",X"AE",X"C9",X"D4",X"DC", + X"CE",X"A6",X"7D",X"65",X"52",X"2C",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"4D",X"9E", + X"E4",X"FC",X"FC",X"FC",X"EC",X"EC",X"FC",X"FC",X"FC",X"FC",X"E9",X"AE",X"78",X"4A",X"2F",X"2F", + X"52",X"8B",X"C6",X"F4",X"FC",X"F7",X"DC",X"B3",X"80",X"4D",X"17",X"01",X"01",X"01",X"1C",X"3F", + X"70",X"A6",X"D1",X"E9",X"E1",X"CE",X"B9",X"B3",X"AE",X"A6",X"88",X"5A",X"1F",X"01",X"01",X"01", + X"01",X"01",X"14",X"52",X"8B",X"B9",X"C6",X"B6",X"A6",X"9E",X"90",X"75",X"68",X"52",X"4A",X"52", + X"68",X"88",X"93",X"83",X"62",X"3F",X"1F",X"17",X"2F",X"4D",X"68",X"75",X"83",X"9E",X"D1",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D4",X"BE",X"B3",X"A3",X"A6",X"BE",X"D4",X"E1",X"CE",X"B3",X"A6",X"98", + X"75",X"4A",X"27",X"1C",X"2F",X"4D",X"68",X"7D",X"68",X"47",X"17",X"01",X"01",X"01",X"01",X"01", + X"04",X"0C",X"1F",X"32",X"4A",X"5D",X"80",X"B3",X"F7",X"FC",X"FC",X"FC",X"EC",X"D4",X"CE",X"BE", + X"C1",X"CE",X"D9",X"C9",X"A3",X"83",X"70",X"5A",X"3F",X"32",X"3F",X"5D",X"68",X"65",X"47",X"2C", + X"17",X"04",X"09",X"27",X"4A",X"68",X"90",X"9E",X"98",X"88",X"7D",X"83",X"9E",X"CE",X"E9",X"F7", + X"E4",X"BE",X"9E",X"68",X"37",X"09",X"01",X"01",X"01",X"04",X"14",X"37",X"55",X"65",X"70",X"88", + X"AE",X"DC",X"FC",X"F4",X"D1",X"AE",X"93",X"80",X"78",X"83",X"9B",X"B3",X"B3",X"98",X"70",X"47", + X"24",X"17",X"32",X"62",X"9B",X"C9",X"CE",X"B9",X"A3",X"9B",X"88",X"70",X"5D",X"55",X"68",X"93", + X"B6",X"BE",X"B3",X"AE",X"AE",X"A3",X"90",X"90",X"98",X"9B",X"AB",X"AB",X"AE",X"B3",X"AB",X"93", + X"78",X"65",X"68",X"78",X"75",X"70",X"68",X"78",X"8B",X"93",X"93",X"9E",X"B9",X"DC",X"FC",X"FC", + X"FC",X"D4",X"93",X"62",X"42",X"1C",X"01",X"01",X"04",X"0C",X"0C",X"1F",X"4A",X"78",X"AB",X"C9", + X"DC",X"E1",X"D9",X"C6",X"AB",X"90",X"70",X"47",X"09",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"1C",X"47",X"62",X"75",X"88",X"AB",X"D1",X"E9",X"EC",X"E9",X"E4",X"DC",X"F7",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"9E",X"80",X"75",X"7D",X"70",X"6D",X"75",X"80",X"8B",X"80",X"65", + X"4A",X"2C",X"04",X"01",X"01",X"01",X"04",X"2C",X"52",X"62",X"5A",X"4D",X"5A",X"78",X"9B",X"B3", + X"C1",X"AB",X"93",X"83",X"78",X"62",X"4D",X"4A",X"52",X"4A",X"3F",X"4D",X"5D",X"7D",X"90",X"9B", + X"9E",X"83",X"68",X"62",X"5D",X"68",X"78",X"88",X"88",X"8B",X"8B",X"80",X"62",X"47",X"3F",X"3A", + X"32",X"37",X"37",X"37",X"4D",X"70",X"88",X"8B",X"80",X"70",X"70",X"8B",X"B6",X"D4",X"D4",X"CE", + X"B9",X"B9",X"C9",X"C9",X"C6",X"B6",X"B9",X"D4",X"FC",X"FC",X"FC",X"FC",X"EC",X"B6",X"80",X"52", + X"37",X"2F",X"2C",X"37",X"62",X"98",X"D1",X"FC",X"FC",X"EC",X"D1",X"A3",X"68",X"4A",X"32",X"27", + X"27",X"3A",X"55",X"68",X"62",X"52",X"3F",X"1C",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"37", + X"5A",X"70",X"88",X"88",X"7D",X"65",X"52",X"47",X"52",X"68",X"83",X"9E",X"AE",X"B6",X"C1",X"B9", + X"B6",X"AE",X"98",X"78",X"5D",X"42",X"32",X"2C",X"2F",X"4D",X"7D",X"B9",X"F7",X"FC",X"FC",X"FC", + X"E1",X"AB",X"83",X"65",X"52",X"5A",X"68",X"65",X"52",X"3F",X"3F",X"3F",X"37",X"37",X"52",X"7D", + X"A6",X"C1",X"BE",X"9E",X"88",X"7D",X"68",X"5A",X"47",X"47",X"62",X"90",X"B3",X"C6",X"D9",X"EF", + X"FC",X"FC",X"E4",X"CE",X"B9",X"B3",X"B3",X"AE",X"AB",X"9B",X"75",X"55",X"37",X"11",X"01",X"01", + X"01",X"01",X"04",X"4D",X"88",X"AB",X"B3",X"AE",X"A3",X"9B",X"AE",X"C6",X"CE",X"C9",X"BE",X"B6", + X"B3",X"AB",X"AE",X"C6",X"EF",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"88",X"4A",X"14",X"01", + X"09",X"2C",X"52",X"78",X"93",X"93",X"78",X"47",X"0C",X"01",X"01",X"01",X"01",X"09",X"09",X"11", + X"27",X"4D",X"62",X"68",X"7D",X"90",X"9E",X"AE",X"AB",X"8B",X"70",X"62",X"52",X"3A",X"1C",X"04", + X"11",X"2F",X"5A",X"83",X"9E",X"B3",X"B9",X"B9",X"AB",X"80",X"62",X"4D",X"4D",X"5A",X"65",X"75", + X"7D",X"83",X"83",X"70",X"4D",X"1F",X"0C",X"14",X"32",X"5D",X"70",X"68",X"65",X"68",X"83",X"9E", + X"9E",X"93",X"88",X"83",X"9B",X"BE",X"D9",X"E1",X"D1",X"B6",X"A3",X"93",X"88",X"88",X"8B",X"98", + X"A3",X"C6",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"D4",X"B3",X"88",X"65",X"4A",X"32",X"3A",X"5D", + X"88",X"B3",X"D4",X"E4",X"E1",X"B9",X"78",X"37",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"14",X"37",X"42",X"4A",X"5A",X"68",X"78",X"90",X"AE",X"C9",X"E1",X"E1", + X"C9",X"93",X"65",X"4D",X"32",X"1F",X"17",X"27",X"37",X"3F",X"42",X"4D",X"68",X"88",X"98",X"A3", + X"B6",X"C9",X"D4",X"E4",X"E4",X"D4",X"BE",X"A6",X"AE",X"C6",X"E4",X"FC",X"FC",X"FC",X"E4",X"AB", + X"6D",X"3F",X"27",X"2F",X"52",X"83",X"AB",X"AB",X"AE",X"AE",X"AE",X"98",X"70",X"5A",X"5A",X"65", + X"7D",X"88",X"80",X"5D",X"3A",X"24",X"11",X"11",X"2F",X"52",X"75",X"83",X"93",X"A3",X"C9",X"EF", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"98",X"5A",X"1F",X"01",X"01",X"01",X"11",X"2F", + X"5D",X"90",X"BE",X"E4",X"FC",X"FC",X"D9",X"A3",X"78",X"65",X"68",X"75",X"70",X"65",X"5A",X"4A", + X"2C",X"14",X"04",X"11",X"37",X"68",X"9B",X"A6",X"9B",X"88",X"83",X"90",X"93",X"90",X"8B",X"83", + X"7D",X"83",X"93",X"A6",X"B6",X"BE",X"B9",X"9E",X"68",X"42",X"2C",X"2F",X"47",X"5D",X"78",X"88", + X"90",X"93",X"90",X"70",X"52",X"37",X"17",X"11",X"17",X"2C",X"37",X"3F",X"4D",X"4A",X"3F",X"32", + X"2F",X"37",X"5A",X"7D",X"9B",X"9E",X"A6",X"AE",X"B6",X"D4",X"FC",X"FC",X"FC",X"FC",X"FC",X"EC", + X"E1",X"B9",X"93",X"6D",X"5A",X"5A",X"5D",X"68",X"75",X"78",X"83",X"83",X"83",X"83",X"70",X"5D", + X"4A",X"4D",X"62",X"7D",X"90",X"98",X"88",X"62",X"2F",X"01",X"01",X"01",X"01",X"1C",X"37",X"52", + X"65",X"68",X"5A",X"52",X"5D",X"75",X"7D",X"75",X"5D",X"4A",X"4D",X"65",X"88",X"AB",X"C6",X"D9", + X"D4",X"B6",X"93",X"83",X"70",X"5A",X"47",X"47",X"4A",X"3F",X"3A",X"3F",X"32",X"27",X"17",X"1F", + X"3F",X"68",X"93",X"9E",X"9B",X"93",X"98",X"A6",X"AB",X"AB",X"A3",X"A6",X"BE",X"E1",X"F7",X"FC", + X"FC",X"EC",X"D1",X"AE",X"93",X"8B",X"9B",X"B3",X"B6",X"B6",X"C6",X"C6",X"B6",X"A6",X"9E",X"93", + X"7D",X"5D",X"37",X"1C",X"1F",X"27",X"2C",X"37",X"52",X"75",X"93",X"98",X"8B",X"7D",X"65",X"5D", + X"65",X"75",X"88",X"9B",X"9E",X"9B",X"8B",X"80",X"83",X"8B",X"8B",X"83",X"93",X"AB",X"C9",X"DC", + X"CE",X"B9",X"A6",X"83",X"5D",X"32",X"17",X"01",X"01",X"04",X"1C",X"4A",X"80",X"B6",X"DC",X"E1", + X"D4",X"BE",X"A6",X"98",X"90",X"88",X"6D",X"4D",X"2C",X"11",X"04",X"04",X"1C",X"4D",X"83",X"B6", + X"DC",X"E4",X"D1",X"C1",X"B3",X"9B",X"80",X"68",X"68",X"68",X"75",X"7D",X"7D",X"70",X"52",X"2C", + X"04",X"01",X"01",X"01",X"11",X"2F",X"47",X"5D",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC", + X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E",X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E", + X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52",X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01", + X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3",X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB", + X"93",X"78",X"65",X"62",X"68",X"70",X"80",X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70", + X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3",X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88", + X"7D",X"62",X"47",X"2F",X"11",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"78",X"93",X"9B", + X"9E",X"93",X"98",X"9B",X"98",X"A3",X"A6",X"AB",X"B3",X"C1",X"D1",X"CE",X"BE",X"AE",X"98",X"7D", + X"75",X"65",X"52",X"4A",X"3F",X"3A",X"3F",X"52",X"68",X"80",X"93",X"AB",X"B6",X"C9",X"E1",X"E4", + X"D4",X"CE",X"CE",X"C9",X"BE",X"9E",X"7D",X"5A",X"37",X"27",X"1C",X"1F",X"37",X"5A",X"75",X"80", + X"8B",X"93",X"90",X"8B",X"88",X"88",X"80",X"80",X"83",X"80",X"88",X"A3",X"C6",X"E1",X"FC",X"FC", + X"F4",X"CE",X"A3",X"80",X"65",X"4A",X"37",X"37",X"3F",X"47",X"52",X"62",X"70",X"7D",X"70",X"62", + X"52",X"55",X"68",X"78",X"80",X"75",X"65",X"65",X"5D",X"55",X"5A",X"5A",X"65",X"80",X"98",X"A3", + X"9B",X"8B",X"7D",X"80",X"88",X"90",X"98",X"9B",X"93",X"93",X"9E",X"AE",X"B9",X"B6",X"AE",X"AE", + X"A6",X"93",X"78",X"65",X"52",X"4D",X"4A",X"52",X"68",X"78",X"88",X"93",X"90",X"83",X"80",X"6D", + X"5D",X"5D",X"62",X"68",X"6D",X"6D",X"5D",X"4A",X"37",X"2F",X"32",X"52",X"75",X"93",X"A6",X"AE", + X"AB",X"AE",X"B6",X"C6",X"BE",X"C1",X"B9",X"A6",X"98",X"8B",X"70",X"52",X"3A",X"2C",X"37",X"42", + X"5A",X"68",X"70",X"78",X"7D",X"88",X"93",X"98",X"90",X"7D",X"7D",X"88",X"90",X"98",X"93",X"7D", + X"52",X"2C",X"09",X"01",X"01",X"09",X"32",X"52",X"70",X"88",X"9B",X"93",X"90",X"93",X"98",X"90", + X"83",X"70",X"65",X"62",X"78",X"93",X"AE",X"BE",X"C6",X"B9",X"9E",X"83",X"70",X"65",X"5D",X"5A", + X"5A",X"5D",X"5A",X"55",X"55",X"47",X"37",X"27",X"1F",X"37",X"5A",X"78",X"88",X"8B",X"8B",X"93", + X"A3",X"A6",X"AB",X"A6",X"AB",X"BE",X"D4",X"E4",X"EC",X"EC",X"E1",X"C9",X"A6",X"90",X"83",X"90", + X"98",X"9B",X"9E",X"AE",X"AB",X"A6",X"9E",X"9B",X"9B",X"90",X"78",X"5A",X"3F",X"37",X"37",X"37", + X"3F",X"52",X"68",X"88",X"83",X"78",X"68",X"5A",X"55",X"65",X"78",X"8B",X"9E",X"A3",X"9B",X"90", + X"83",X"88",X"8B",X"88",X"80",X"8B",X"9E",X"B9",X"C9",X"B9",X"A6",X"93",X"75",X"52",X"32",X"1C", + X"11",X"0C",X"14",X"2C",X"5A",X"8B",X"BE",X"DC",X"E1",X"D9",X"C6",X"AE",X"9E",X"98",X"8B",X"75", + X"55",X"32",X"1C",X"11",X"11",X"24",X"52",X"88",X"B6",X"D9",X"E4",X"CE",X"BE",X"AE",X"98",X"7D", + X"68",X"65",X"68",X"75",X"78",X"7D",X"70",X"52",X"2F",X"09",X"01",X"01",X"01",X"11",X"2F",X"47", + X"5A",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC",X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E", + X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E",X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52", + X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01",X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3", + X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB",X"93",X"78",X"65",X"62",X"68",X"70",X"80", + X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70",X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3", + X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88",X"7D",X"62",X"47",X"2C",X"0C",X"01",X"01", + X"01",X"01",X"01",X"14",X"3A",X"65",X"7D",X"98",X"A3",X"A3",X"98",X"9B",X"9E",X"9E",X"A6",X"AB", + X"AB",X"B6",X"C6",X"D4",X"CE",X"BE",X"AB",X"90",X"78",X"68",X"5A",X"47",X"32",X"27",X"1F",X"24", + X"3A",X"62",X"80",X"9E",X"B9",X"CE",X"D4",X"E9",X"EC",X"E1",X"D1",X"D1",X"CE",X"C6",X"A6",X"80", + X"55",X"2F",X"17",X"04",X"11",X"2F",X"62",X"83",X"9B",X"A6",X"AB",X"9B",X"90",X"8B",X"88",X"78", + X"70",X"65",X"5A",X"65",X"88",X"A6",X"CE",X"EF",X"FC",X"FC",X"E1",X"B6",X"9E",X"88",X"68",X"52", + X"4A",X"47",X"3F",X"37",X"3A",X"47",X"47",X"3A",X"2F",X"2F",X"4A",X"68",X"80",X"83",X"75",X"65", + X"65",X"65",X"68",X"75",X"7D",X"88",X"9E",X"AB",X"AB",X"98",X"80",X"78",X"7D",X"80",X"8B",X"9E", + X"9E",X"9B",X"9E",X"AE",X"BE",X"C1",X"B3",X"A6",X"A3",X"A6",X"AB",X"9B",X"83",X"68",X"52",X"42", + X"3F",X"52",X"68",X"80",X"93",X"A3",X"A6",X"B3",X"A6",X"93",X"88",X"88",X"93",X"90",X"83",X"68", + X"4D",X"37",X"2C",X"2F",X"47",X"68",X"90",X"AB",X"AE",X"A6",X"A6",X"9B",X"88",X"75",X"68",X"62", + X"52",X"42",X"32",X"27",X"11",X"01",X"01",X"11",X"27",X"3F",X"5A",X"65",X"68",X"78",X"8B",X"A6", + X"C1",X"C6",X"B9",X"B3",X"B3",X"AB",X"A3",X"8B",X"68",X"42",X"24",X"11",X"11",X"11",X"27",X"4D", + X"70",X"98",X"B9",X"DC",X"E9",X"E9",X"E1",X"CE",X"AB",X"98",X"90",X"83",X"83",X"93",X"A3",X"B6", + X"AE",X"A3",X"90",X"78",X"5D",X"4A",X"4D",X"62",X"78",X"83",X"80",X"80",X"83",X"7D",X"68",X"52", + X"37",X"1F",X"1F",X"2F",X"47",X"55",X"65",X"7D",X"90",X"93",X"98",X"A3",X"AE",X"B3",X"B9",X"B6", + X"B6",X"C1",X"C6",X"B9",X"A6",X"8B",X"80",X"70",X"65",X"52",X"4A",X"52",X"62",X"65",X"68",X"7D", + X"90",X"AB",X"C6",X"D1",X"CE",X"AE",X"88",X"68",X"65",X"62",X"52",X"52",X"4D",X"3F",X"2F",X"27", + X"27",X"3A",X"62",X"83",X"9E",X"B3",X"A6",X"9E",X"93",X"90",X"8B",X"7D",X"68",X"62",X"65",X"65", + X"65",X"55",X"3F",X"27",X"14",X"11",X"14",X"1C",X"2F",X"4A",X"62",X"78",X"98",X"B6",X"D1",X"E4", + X"E4",X"E1",X"E4",X"F7",X"FC",X"F7",X"E4",X"D1",X"BE",X"AB",X"98",X"83",X"8B",X"98",X"93",X"90", + X"93",X"90",X"83",X"78",X"70",X"6D",X"62",X"4A",X"2C",X"17",X"14",X"1C",X"27",X"3F",X"4D",X"5D", + X"68",X"68",X"68",X"68",X"75",X"8B",X"9E",X"A6",X"9E",X"9B",X"98",X"98",X"93",X"80",X"70",X"62", + X"52",X"4A",X"42",X"3A",X"2F",X"27",X"2C",X"2F",X"3F",X"5D",X"80",X"90",X"9B",X"A3",X"AE",X"C9", + X"E1",X"E4",X"DC",X"CE",X"C9",X"CE",X"C6",X"B3",X"98",X"8B",X"83",X"75",X"68",X"6D",X"7D",X"90", + X"A3",X"B3",X"B9",X"AE",X"98",X"7D",X"70",X"62",X"4A",X"2F",X"17",X"11",X"17",X"24",X"37",X"52", + X"62",X"75",X"80",X"80",X"80",X"88",X"8B",X"8B",X"98",X"9B",X"9E",X"AB",X"B6",X"AE",X"A3",X"90", + X"83",X"80",X"7D",X"83",X"90",X"90",X"88",X"75",X"62",X"52",X"47",X"42",X"4A",X"5D",X"75",X"8B", + X"A3",X"AB",X"AB",X"A3",X"93",X"98",X"9E",X"AE",X"BE",X"BE",X"AB",X"88",X"68",X"52",X"3A",X"37", + X"47",X"62",X"83",X"98",X"A3",X"9B",X"98",X"98",X"88",X"68",X"52",X"4D",X"52",X"62",X"65",X"62", + X"62",X"5D",X"4A",X"37",X"27",X"2C",X"3F",X"5D",X"6D",X"75",X"75",X"80",X"90",X"A3",X"B3",X"BE", + X"C6",X"C1",X"B9",X"AB",X"9E",X"83",X"68",X"52",X"3F",X"27",X"11",X"0C",X"11",X"1C",X"3F",X"68", + X"9B",X"B6",X"BE",X"B6",X"B3",X"B6",X"BE",X"C9",X"C6",X"AE",X"9B",X"8B",X"80",X"7D",X"83",X"93", + X"A3",X"AE",X"A3",X"9E",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"7D",X"68",X"62",X"5D",X"62",X"5D", + X"52",X"4D",X"5A",X"52",X"52",X"52",X"52",X"52",X"5A",X"5A",X"5A",X"62",X"68",X"78",X"88",X"90", + X"98",X"A6",X"B6",X"B9",X"B6",X"B3",X"B6",X"B9",X"B9",X"B6",X"AE",X"AB",X"93",X"78",X"65",X"4D", + X"32",X"24",X"24",X"32",X"52",X"70",X"83",X"88",X"83",X"7D",X"70",X"65",X"68",X"6D",X"6D",X"6D", + X"68",X"65",X"68",X"68",X"65",X"5D",X"55",X"5D",X"70",X"8B",X"90",X"93",X"8B",X"80",X"7D",X"7D", + X"8B",X"9E",X"A6",X"A3",X"9E",X"9E",X"A3",X"A3",X"98",X"88",X"80",X"75",X"68",X"62",X"55",X"4D", + X"4A",X"4D",X"5D",X"75",X"93",X"AE",X"B6",X"AB",X"93",X"78",X"65",X"52",X"5A",X"5D",X"65",X"78", + X"88",X"88",X"80",X"75",X"70",X"68",X"5D",X"5A",X"5D",X"62",X"68",X"70",X"75",X"78",X"7D",X"7D", + X"80",X"78",X"70",X"65",X"5D",X"52",X"5A",X"70",X"8B",X"A3",X"AE",X"AE",X"A6",X"9B",X"90",X"83", + X"75",X"68",X"55",X"4D",X"4A",X"4A",X"4D",X"5A",X"78",X"93",X"B9",X"D4",X"E4",X"E1",X"CE",X"BE", + X"AE",X"9B",X"88",X"78",X"78",X"78",X"78",X"68",X"62",X"55",X"4D",X"3A",X"32",X"3A",X"4D",X"68", + X"7D",X"80",X"7D",X"78",X"75",X"7D",X"88",X"98",X"A3",X"AE",X"AE",X"AB",X"AE",X"B6",X"C6",X"D1", + X"D4",X"D4",X"C6",X"AB",X"98",X"83",X"78",X"65",X"4D",X"3F",X"3F",X"3F",X"4A",X"5A",X"68",X"70", + X"68",X"68",X"70",X"80",X"8B",X"93",X"8B",X"7D",X"70",X"6D",X"68",X"70",X"75",X"75",X"78",X"78", + X"75",X"68",X"65",X"62",X"6D",X"83",X"98",X"AE",X"B6",X"A6",X"98",X"90",X"80",X"75",X"68",X"5D", + X"62",X"68",X"80",X"93",X"9B",X"93",X"90",X"80",X"6D",X"5A",X"4A",X"42",X"47",X"52",X"5D",X"6D", + X"83",X"90",X"90",X"83",X"80",X"80",X"75",X"75",X"70",X"68",X"65",X"5A",X"52",X"4D",X"52",X"65", + X"7D",X"98",X"A6",X"AB",X"AB",X"A6",X"9E",X"9B",X"90",X"80",X"75",X"6D",X"65",X"52",X"52",X"52", + X"52",X"4D",X"42",X"3F",X"47",X"4A",X"55",X"5D",X"62",X"62",X"62",X"62",X"68",X"7D",X"88",X"93", + X"A3",X"9E",X"A3",X"98",X"90",X"90",X"98",X"A3",X"B6",X"C1",X"BE",X"B6",X"B3",X"AB",X"9B",X"88", + X"75",X"70",X"68",X"65",X"70",X"78",X"7D",X"70",X"68",X"68",X"68",X"68",X"65",X"62",X"5D",X"68", + X"7D",X"90",X"9B",X"9B",X"98",X"98",X"98",X"93",X"98",X"9E",X"9B",X"98",X"93",X"93",X"90",X"83", + X"80",X"80",X"78",X"68",X"62",X"62",X"65",X"75",X"83",X"88",X"8B",X"90",X"8B",X"7D",X"70",X"68", + X"65",X"5D",X"55",X"52",X"4D",X"4A",X"4D",X"5A",X"5D",X"65",X"70",X"80",X"8B",X"93",X"9E",X"9E", + X"9B",X"9E",X"A3",X"9B",X"98",X"90",X"88",X"83",X"83",X"88",X"90",X"A6",X"B9",X"BE",X"C1",X"C6", + X"C6",X"C6",X"B6",X"9B",X"83",X"65",X"52",X"4A",X"4D",X"5D",X"6D",X"80",X"8B",X"93",X"8B",X"80", + X"65",X"5A",X"52",X"52",X"52",X"47",X"3F",X"3A",X"47",X"52",X"5D",X"6D",X"83",X"93",X"9B",X"9E", + X"98",X"8B",X"88",X"80",X"80",X"78",X"6D",X"68",X"68",X"70",X"70",X"68",X"68",X"62",X"5A",X"5A", + X"5D",X"5A",X"5D",X"65",X"70",X"75",X"8B",X"98",X"9B",X"9B",X"9B",X"93",X"88",X"88",X"83",X"88", + X"88",X"93",X"9B",X"98",X"8B",X"80",X"78",X"70",X"68",X"68",X"70",X"80",X"88",X"90",X"93",X"9B", + X"9E",X"98",X"98",X"98",X"98",X"90",X"83",X"78",X"78",X"6D",X"6D",X"78",X"88",X"98",X"A3",X"AB", + X"AB",X"A6",X"98",X"83",X"70",X"52",X"47",X"37",X"32",X"27",X"27",X"37",X"47",X"4D",X"65",X"75", + X"88",X"90",X"98",X"90",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"68",X"62",X"5D",X"4D",X"42", + X"3A",X"3A",X"3F",X"47",X"52",X"5A",X"68",X"78",X"83",X"90",X"A3",X"AE",X"B6",X"B9",X"B6",X"AE", + X"B3",X"B6",X"C1",X"C6",X"BE",X"B9",X"B9",X"AE",X"9B",X"88",X"80",X"75",X"68",X"65",X"65",X"70", + X"78",X"83",X"8B",X"90",X"88",X"7D",X"65",X"5A",X"55",X"5A",X"52",X"4D",X"47",X"42",X"3F",X"47", + X"4A",X"52",X"65",X"7D",X"93",X"9B",X"98",X"93",X"90",X"93",X"9B",X"A6",X"AE",X"AE",X"A6",X"98", + X"8B",X"78",X"68",X"5A",X"52",X"52",X"5A",X"65",X"68",X"75",X"75",X"70",X"70",X"7D",X"80",X"83", + X"83",X"80",X"80",X"80",X"8B",X"98",X"A3",X"A3",X"A6",X"A3",X"9B",X"93",X"90",X"8B",X"88",X"80", + X"78",X"70",X"62",X"5A",X"5A",X"52",X"52",X"55",X"5A",X"62",X"68",X"75",X"70",X"6D",X"65",X"65", + X"68",X"6D",X"70",X"70",X"70",X"75",X"75",X"7D",X"83",X"88",X"93",X"9B",X"A3",X"A3",X"A6",X"A6", + X"A3",X"9E",X"93",X"88",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"7D",X"70",X"68",X"62", + X"62",X"68",X"70",X"78",X"7D",X"7D",X"78",X"75",X"68",X"68",X"62",X"62",X"68",X"78",X"78",X"7D", + X"75",X"68",X"6D",X"6D",X"70",X"75",X"7D",X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"80",X"83", + X"88",X"8B",X"88",X"83",X"80",X"80",X"83",X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D", + X"75",X"6D",X"68",X"75",X"80",X"83",X"88",X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"75",X"68",X"5D",X"52",X"4A",X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B", + X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B",X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62", + X"65",X"70",X"78",X"7D",X"80",X"88",X"8B",X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90", + X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"7D",X"78",X"78",X"75",X"70",X"70",X"6D",X"68",X"6D",X"70",X"78",X"80", + X"80",X"80",X"83",X"88",X"90",X"8B",X"8B",X"8B",X"88",X"80",X"7D",X"78",X"70",X"68",X"68",X"68", + X"68",X"6D",X"6D",X"70",X"78",X"7D",X"83",X"8B",X"8B",X"90",X"8B",X"88",X"88",X"88",X"88",X"83", + X"80",X"80",X"83",X"80",X"80",X"7D",X"83",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"78",X"78", + X"75",X"70",X"70",X"70",X"75",X"78",X"78",X"78",X"75",X"75",X"70",X"70",X"75",X"78",X"75",X"75", + X"75",X"75",X"78",X"7D",X"80",X"7D",X"7D",X"7D",X"83",X"88",X"8B",X"88",X"88",X"88",X"88",X"88", + X"8B",X"90",X"90",X"88",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"7D",X"7D",X"80",X"7D",X"78", + X"75",X"70",X"70",X"78",X"80",X"88",X"88",X"88",X"88",X"83",X"7D",X"78",X"78",X"80",X"83",X"83", + X"83",X"80",X"78",X"75",X"75",X"75",X"78",X"80",X"80",X"83",X"83",X"80",X"7D",X"78",X"6D",X"68", + X"65",X"62",X"5D",X"5A",X"62",X"65",X"68",X"75",X"80",X"8B",X"90",X"93",X"90",X"88",X"83",X"80", + X"78",X"75",X"75",X"70",X"68",X"65",X"5D",X"5D",X"55",X"5A",X"5D",X"65",X"68",X"75",X"75",X"80", + X"83",X"8B",X"90",X"9B",X"A3",X"A6",X"A6",X"9E",X"9B",X"98",X"98",X"9E",X"9E",X"A3",X"A3",X"A6", + X"A3",X"9B",X"8B",X"88",X"7D",X"75",X"6D",X"68",X"6D",X"75",X"7D",X"7D",X"83",X"83",X"80",X"75", + X"6D",X"68",X"68",X"68",X"65",X"62",X"5D",X"5A",X"5A",X"5D",X"62",X"68",X"78",X"80",X"83",X"80", + X"7D",X"80",X"83",X"8B",X"98",X"9B",X"9B",X"98",X"90",X"8B",X"7D",X"70",X"68",X"62",X"65",X"68", + X"70",X"78",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"7D",X"7D",X"7D",X"83",X"90",X"98", + X"9B",X"9E",X"9B",X"98",X"90",X"8B",X"83",X"83",X"7D",X"75",X"70",X"65",X"5D",X"5D",X"5A",X"5D", + X"62",X"65",X"68",X"75",X"75",X"75",X"75",X"68",X"6D",X"6D",X"70",X"70",X"75",X"70",X"75",X"75", + X"78",X"7D",X"83",X"90",X"98",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"88",X"83",X"7D",X"7D", + X"7D",X"80",X"83",X"80",X"80",X"7D",X"75",X"68",X"65",X"65",X"68",X"75",X"78",X"7D",X"78",X"78", + X"78",X"6D",X"68",X"65",X"68",X"6D",X"78",X"7D",X"7D",X"75",X"6D",X"6D",X"70",X"75",X"78",X"80", + X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"83",X"83",X"88",X"8B",X"88",X"83",X"80",X"80",X"83", + X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D",X"75",X"6D",X"68",X"75",X"80",X"83",X"88", + X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D",X"80",X"80",X"75",X"68",X"5D",X"52",X"4A", + X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B",X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B", + X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62",X"65",X"70",X"78",X"7D",X"80",X"88",X"8B", + X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90",X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D", + X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"75", + X"75",X"70",X"75",X"6D",X"68",X"6D",X"70",X"78",X"80",X"83",X"80",X"83",X"88",X"90",X"8B",X"8B", + X"88",X"83",X"7D",X"78",X"75",X"6D",X"68",X"68",X"68",X"65",X"68",X"68",X"68",X"70",X"75",X"7D", + X"88",X"83",X"88",X"88",X"80",X"83",X"83",X"88",X"8B",X"88",X"88",X"88",X"83",X"80",X"7D",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"7D",X"75",X"75",X"75",X"75",X"70", + X"70",X"68",X"68",X"68",X"68",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"83",X"83",X"83",X"88", + X"88",X"90",X"98",X"98",X"93",X"90",X"90",X"8B",X"88",X"88",X"8B",X"88",X"80",X"78",X"78",X"75", + X"70",X"68",X"68",X"65",X"68",X"70",X"78",X"78",X"78",X"75",X"75",X"70",X"78",X"80",X"83",X"83", + X"80",X"7D",X"70",X"68",X"65",X"68",X"70",X"7D",X"83",X"83",X"83",X"80",X"75",X"70",X"68",X"65", + X"65",X"65",X"68",X"6D",X"70",X"78",X"7D",X"7D",X"7D",X"83",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"80",X"83",X"8B",X"90",X"93",X"93",X"8B",X"83",X"7D",X"78",X"70",X"6D",X"68",X"65",X"65",X"62", + X"65",X"68",X"70",X"7D",X"88",X"88",X"93",X"90",X"90",X"90",X"90",X"93",X"93",X"93",X"98",X"90", + X"88",X"80",X"78",X"78",X"75",X"78",X"80",X"88",X"90",X"90",X"93",X"8B",X"8B",X"88",X"7D",X"78", + X"6D",X"65",X"65",X"68",X"6D",X"75",X"80",X"83",X"88",X"88",X"88",X"83",X"83",X"83",X"83",X"80", + X"7D",X"80",X"7D",X"75",X"6D",X"68",X"5D",X"55",X"52",X"52",X"62",X"68",X"70",X"75",X"75",X"75", + X"78",X"7D",X"83",X"80",X"83",X"83",X"83",X"83",X"88",X"8B",X"90",X"98",X"98",X"9B",X"9B",X"93", + X"8B",X"83",X"7D",X"78",X"78",X"70",X"75",X"7D",X"80",X"80",X"83",X"80",X"80",X"75",X"70",X"68", + X"68",X"68",X"65",X"68",X"68",X"65",X"68",X"70",X"78",X"7D",X"88",X"88",X"88",X"83",X"83",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75", + X"75",X"7D",X"83",X"83",X"88",X"83",X"88",X"83",X"88",X"83",X"83",X"8B",X"88",X"8B",X"88",X"88", + X"80",X"7D",X"7D",X"75",X"6D",X"68",X"6D",X"70",X"7D",X"80",X"7D",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80", + X"83",X"83",X"80",X"80",X"7D",X"78",X"75",X"70",X"68",X"6D",X"75",X"78",X"7D",X"80",X"80",X"80", + X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"88",X"88",X"8B",X"8B",X"8B", + X"8B",X"88",X"83",X"83",X"80",X"78",X"75",X"75",X"70",X"70",X"75",X"75",X"80",X"83",X"80",X"83", + X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70", + X"75",X"75",X"78",X"7D",X"7D",X"80",X"80",X"83",X"83",X"83",X"83",X"88",X"83",X"83",X"83",X"88", + X"83",X"83",X"88",X"8B",X"88",X"88",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"80",X"80",X"80", + X"83",X"83",X"83",X"7D",X"7D",X"75",X"75",X"75",X"75",X"75",X"70",X"75",X"75",X"75",X"78",X"83", + X"80",X"83",X"80",X"7D",X"80",X"78",X"78",X"80",X"80",X"80",X"7D",X"80",X"80",X"80",X"7D",X"75", + X"70",X"68",X"68",X"68",X"68",X"68",X"70",X"75",X"7D",X"83",X"8B",X"90",X"90",X"8B",X"83",X"80", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70",X"75",X"75", + X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"7D",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"83",X"83", + X"8B",X"8B",X"8B",X"88",X"83",X"83",X"80",X"83",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"7D",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78", + X"78",X"78",X"78",X"78",X"7D",X"80",X"78",X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D", + X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"78",X"7D",X"78",X"7D",X"80",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80", + X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"78",X"80", + X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"75",X"75",X"83",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"88",X"83", + X"80",X"80",X"7D",X"78",X"75",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"75",X"75",X"78", + X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"78",X"78",X"78",X"75",X"75",X"75",X"70",X"75",X"75",X"7D",X"7D",X"80",X"80",X"80", + X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"78",X"78",X"7D", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"78", + X"78",X"78",X"78",X"78",X"78",X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83", + X"83",X"83",X"88",X"83",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"7D",X"78",X"78",X"78",X"75",X"75", + X"75",X"78",X"7D",X"78",X"83",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"78",X"78",X"78",X"78",X"75",X"75",X"75",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80", + X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"78", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"80",X"83",X"83",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"78",X"78",X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D",X"78",X"78",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"83",X"80",X"80",X"83",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"7D",X"80",X"80",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"7D",X"78",X"78",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..ee7591a2 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,662 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 10239) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AF",X"32",X"01",X"70",X"C3",X"55",X"1A",X"FF",X"3A",X"07",X"40",X"0F",X"D0",X"33",X"33",X"C9", + X"77",X"23",X"10",X"FC",X"C9",X"FF",X"9F",X"FF",X"77",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"C9", + X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"C9",X"87",X"E1",X"5F",X"16",X"00",X"19",X"5E",X"23", + X"56",X"EB",X"E9",X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"00",X"00",X"FF",X"3A",X"1E",X"40",X"47", + X"87",X"87",X"80",X"3C",X"32",X"1E",X"40",X"C9",X"0E",X"00",X"06",X"08",X"BA",X"38",X"01",X"92", + X"3F",X"CB",X"11",X"CB",X"1A",X"10",X"F5",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"8D",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"AF",X"32", + X"01",X"70",X"3A",X"1A",X"40",X"A7",X"C2",X"CD",X"1B",X"21",X"20",X"40",X"11",X"00",X"58",X"01", + X"80",X"00",X"ED",X"B0",X"3A",X"00",X"78",X"3A",X"15",X"40",X"32",X"16",X"40",X"3A",X"13",X"40", + X"32",X"15",X"40",X"2A",X"10",X"40",X"22",X"13",X"40",X"3A",X"00",X"70",X"32",X"12",X"40",X"3A", + X"00",X"68",X"32",X"11",X"40",X"3A",X"00",X"60",X"32",X"10",X"40",X"CB",X"77",X"C2",X"00",X"00", + X"21",X"5F",X"42",X"35",X"CD",X"EF",X"18",X"CD",X"31",X"19",X"CD",X"7C",X"19",X"CD",X"F5",X"16", + X"CD",X"98",X"18",X"CD",X"C0",X"18",X"21",X"D8",X"00",X"E5",X"3A",X"05",X"40",X"EF",X"E6",X"00", + X"56",X"01",X"F2",X"03",X"36",X"05",X"7B",X"07",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"3E", + X"01",X"32",X"01",X"70",X"F1",X"C9",X"2A",X"0B",X"40",X"06",X"20",X"3E",X"10",X"D7",X"22",X"0B", + X"40",X"21",X"08",X"40",X"35",X"C0",X"2D",X"36",X"01",X"2D",X"36",X"00",X"2D",X"36",X"01",X"AF", + X"32",X"0A",X"40",X"3A",X"11",X"40",X"07",X"07",X"E6",X"03",X"32",X"00",X"40",X"3A",X"12",X"40", + X"E6",X"04",X"0F",X"0F",X"32",X"1F",X"40",X"11",X"1B",X"05",X"CD",X"46",X"06",X"3A",X"10",X"40", + X"E6",X"20",X"07",X"07",X"07",X"32",X"0F",X"40",X"3A",X"00",X"70",X"E6",X"03",X"21",X"52",X"01", + X"E7",X"32",X"AC",X"40",X"CD",X"95",X"05",X"3E",X"01",X"32",X"40",X"53",X"3E",X"25",X"32",X"20", + X"53",X"3E",X"20",X"32",X"00",X"53",X"11",X"04",X"06",X"CD",X"F2",X"08",X"11",X"03",X"05",X"C3", + X"F2",X"08",X"07",X"10",X"12",X"20",X"CD",X"0D",X"09",X"CD",X"8E",X"09",X"21",X"D7",X"03",X"E5", + X"3A",X"0A",X"40",X"EF",X"8C",X"01",X"BE",X"01",X"C6",X"01",X"E1",X"01",X"18",X"02",X"3F",X"02", + X"67",X"02",X"8E",X"02",X"C6",X"01",X"9D",X"02",X"D1",X"02",X"2E",X"03",X"E8",X"02",X"FD",X"02", + X"14",X"06",X"61",X"06",X"D8",X"06",X"2E",X"03",X"22",X"03",X"00",X"00",X"11",X"01",X"07",X"CD", + X"F2",X"08",X"11",X"00",X"06",X"CD",X"F2",X"08",X"3E",X"01",X"32",X"07",X"40",X"32",X"04",X"70", + X"32",X"02",X"70",X"32",X"03",X"70",X"21",X"0A",X"40",X"34",X"AF",X"32",X"19",X"40",X"32",X"0D", + X"40",X"32",X"0E",X"40",X"32",X"06",X"40",X"21",X"60",X"10",X"22",X"08",X"40",X"C9",X"3E",X"01", + X"32",X"19",X"40",X"C3",X"36",X"03",X"21",X"00",X"41",X"06",X"80",X"AF",X"D7",X"32",X"5F",X"42", + X"32",X"24",X"42",X"21",X"02",X"50",X"22",X"0B",X"40",X"21",X"09",X"40",X"36",X"20",X"2C",X"34", + X"C9",X"2A",X"0B",X"40",X"06",X"1C",X"3E",X"10",X"D7",X"11",X"04",X"00",X"19",X"22",X"0B",X"40", + X"21",X"09",X"40",X"35",X"C0",X"2C",X"34",X"21",X"40",X"04",X"22",X"08",X"40",X"AF",X"06",X"30", + X"21",X"00",X"42",X"D7",X"32",X"06",X"70",X"32",X"07",X"70",X"32",X"18",X"40",X"3E",X"01",X"32", + X"38",X"42",X"21",X"B1",X"1D",X"C3",X"98",X"05",X"CD",X"63",X"03",X"21",X"08",X"40",X"35",X"C0", + X"36",X"50",X"2C",X"16",X"06",X"7E",X"82",X"5F",X"CD",X"F2",X"08",X"35",X"C0",X"2C",X"34",X"21", + X"20",X"04",X"22",X"08",X"40",X"21",X"B0",X"42",X"AF",X"47",X"D7",X"32",X"41",X"42",X"C9",X"CD", + X"63",X"03",X"CD",X"BE",X"0B",X"CD",X"C3",X"0C",X"CD",X"67",X"03",X"21",X"08",X"40",X"35",X"C0", + X"36",X"D2",X"2C",X"CD",X"41",X"03",X"EB",X"21",X"41",X"42",X"34",X"EB",X"35",X"C0",X"36",X"D2", + X"2C",X"34",X"AF",X"32",X"58",X"40",X"C9",X"CD",X"63",X"03",X"CD",X"BE",X"0B",X"CD",X"C3",X"0C", + X"CD",X"67",X"03",X"21",X"09",X"40",X"35",X"C0",X"2C",X"34",X"AF",X"32",X"58",X"40",X"21",X"40", + X"11",X"22",X"08",X"40",X"21",X"41",X"42",X"34",X"11",X"0F",X"06",X"C3",X"F2",X"08",X"CD",X"63", + X"03",X"CD",X"BE",X"0B",X"CD",X"C3",X"0C",X"CD",X"67",X"03",X"C3",X"36",X"03",X"CD",X"63",X"03", + X"2A",X"0B",X"40",X"06",X"1C",X"3E",X"10",X"D7",X"11",X"04",X"00",X"19",X"22",X"0B",X"40",X"21", + X"09",X"40",X"35",X"C0",X"2C",X"34",X"21",X"B0",X"42",X"AF",X"47",X"D7",X"21",X"60",X"40",X"06", + X"40",X"D7",X"21",X"40",X"04",X"22",X"08",X"40",X"CD",X"95",X"05",X"11",X"00",X"06",X"C3",X"F2", + X"08",X"11",X"01",X"07",X"CD",X"F2",X"08",X"11",X"00",X"06",X"CD",X"F2",X"08",X"21",X"0A",X"40", + X"34",X"21",X"60",X"10",X"22",X"08",X"40",X"C9",X"21",X"00",X"41",X"06",X"80",X"AF",X"D7",X"32", + X"5F",X"42",X"32",X"38",X"42",X"21",X"09",X"40",X"36",X"40",X"C3",X"93",X"05",X"11",X"1B",X"05", + X"CD",X"46",X"06",X"EB",X"11",X"18",X"42",X"01",X"08",X"00",X"ED",X"B0",X"AF",X"32",X"5F",X"42", + X"3C",X"32",X"1D",X"42",X"21",X"0A",X"40",X"34",X"2C",X"36",X"96",X"21",X"40",X"06",X"22",X"45", + X"42",X"C9",X"3E",X"01",X"32",X"0A",X"40",X"21",X"03",X"03",X"22",X"08",X"40",X"C9",X"21",X"09", + X"40",X"35",X"C0",X"2C",X"34",X"C9",X"21",X"08",X"40",X"35",X"C0",X"36",X"3C",X"2C",X"C3",X"31", + X"03",X"7E",X"D9",X"3D",X"47",X"0F",X"0F",X"0F",X"5F",X"16",X"00",X"21",X"30",X"43",X"19",X"36", + X"01",X"2C",X"36",X"00",X"2C",X"36",X"0D",X"2C",X"2C",X"36",X"00",X"2C",X"36",X"0C",X"2C",X"2C", + X"70",X"D9",X"C9",X"AF",X"C3",X"72",X"09",X"3A",X"41",X"42",X"A7",X"C8",X"3D",X"C8",X"47",X"3A", + X"5F",X"42",X"4F",X"E6",X"3F",X"28",X"49",X"FE",X"20",X"C0",X"79",X"07",X"07",X"E6",X"03",X"4F", + X"87",X"81",X"5F",X"16",X"00",X"21",X"9A",X"03",X"19",X"11",X"93",X"51",X"CD",X"AF",X"03",X"05", + X"C8",X"21",X"A6",X"03",X"CD",X"AF",X"03",X"10",X"FB",X"C9",X"01",X"05",X"00",X"02",X"00",X"00", + X"03",X"00",X"00",X"08",X"00",X"00",X"01",X"00",X"00",X"10",X"08",X"00",X"10",X"06",X"00",X"0E", + X"03",X"7E",X"12",X"23",X"7B",X"D6",X"20",X"5F",X"0D",X"C2",X"B1",X"03",X"C6",X"62",X"5F",X"C9", + X"21",X"93",X"51",X"11",X"E0",X"FF",X"0E",X"03",X"3E",X"10",X"77",X"19",X"0D",X"C2",X"CA",X"03", + X"7D",X"C6",X"62",X"6F",X"10",X"F0",X"C9",X"3A",X"02",X"40",X"A7",X"C8",X"21",X"05",X"40",X"34", + X"2C",X"2C",X"36",X"00",X"AF",X"32",X"0A",X"40",X"32",X"C2",X"41",X"32",X"DF",X"41",X"32",X"B0", + X"40",X"C9",X"CD",X"0D",X"09",X"CD",X"8E",X"09",X"21",X"92",X"04",X"E5",X"3A",X"0A",X"40",X"EF", + X"08",X"04",X"30",X"04",X"43",X"04",X"73",X"04",X"21",X"91",X"1D",X"CD",X"98",X"05",X"21",X"60", + X"40",X"06",X"40",X"AF",X"D7",X"21",X"60",X"42",X"D7",X"06",X"50",X"D7",X"32",X"38",X"42",X"32", + X"B0",X"40",X"21",X"02",X"50",X"22",X"0B",X"40",X"21",X"09",X"40",X"36",X"10",X"2C",X"34",X"C9", + X"21",X"19",X"40",X"35",X"C2",X"73",X"04",X"21",X"0A",X"40",X"34",X"21",X"00",X"41",X"06",X"80", + X"AF",X"D7",X"C9",X"2A",X"0B",X"40",X"06",X"1C",X"3E",X"10",X"D7",X"11",X"04",X"00",X"19",X"06", + X"1C",X"D7",X"19",X"22",X"0B",X"40",X"21",X"09",X"40",X"35",X"C0",X"2C",X"34",X"AF",X"32",X"06", + X"70",X"32",X"07",X"70",X"32",X"18",X"40",X"11",X"02",X"07",X"CD",X"F2",X"08",X"11",X"01",X"06", + X"CD",X"F2",X"08",X"3A",X"5F",X"42",X"E6",X"20",X"28",X"11",X"3A",X"02",X"40",X"A7",X"C8",X"47", + X"3E",X"01",X"32",X"00",X"60",X"05",X"C8",X"32",X"01",X"60",X"C9",X"32",X"00",X"60",X"32",X"01", + X"60",X"C9",X"3A",X"11",X"40",X"CB",X"47",X"20",X"59",X"CB",X"4F",X"C8",X"3A",X"02",X"40",X"FE", + X"02",X"D8",X"D6",X"02",X"32",X"02",X"40",X"21",X"1B",X"05",X"11",X"A0",X"41",X"01",X"20",X"00", + X"ED",X"B0",X"3A",X"1F",X"40",X"0F",X"DC",X"0F",X"05",X"21",X"00",X"01",X"22",X"0D",X"40",X"21", + X"1B",X"05",X"11",X"80",X"41",X"01",X"20",X"00",X"ED",X"B0",X"3A",X"1F",X"40",X"0F",X"DC",X"15", + X"05",X"AF",X"32",X"0A",X"40",X"3E",X"03",X"32",X"05",X"40",X"3E",X"01",X"32",X"06",X"40",X"32", + X"D1",X"41",X"11",X"04",X"06",X"CD",X"F2",X"08",X"11",X"00",X"04",X"CD",X"F2",X"08",X"1C",X"C3", + X"F2",X"08",X"3A",X"02",X"40",X"A7",X"28",X"11",X"3D",X"32",X"02",X"40",X"21",X"A0",X"41",X"06", + X"20",X"AF",X"D7",X"21",X"00",X"00",X"C3",X"BC",X"04",X"3E",X"01",X"32",X"05",X"40",X"C9",X"3E", + X"03",X"32",X"B5",X"41",X"C9",X"3E",X"03",X"32",X"95",X"41",X"C9",X"00",X"00",X"00",X"00",X"F8", + X"1F",X"F8",X"1F",X"F8",X"1F",X"F0",X"0F",X"E0",X"07",X"40",X"02",X"3C",X"14",X"00",X"02",X"00", + X"02",X"00",X"0F",X"00",X"00",X"00",X"CD",X"0D",X"09",X"CD",X"8E",X"09",X"3A",X"0A",X"40",X"EF", + X"50",X"05",X"83",X"05",X"A5",X"05",X"05",X"06",X"14",X"06",X"61",X"06",X"D8",X"06",X"3D",X"07", + X"21",X"00",X"41",X"06",X"80",X"AF",X"32",X"00",X"60",X"32",X"01",X"60",X"D7",X"32",X"5F",X"42", + X"21",X"00",X"42",X"06",X"17",X"D7",X"2C",X"06",X"18",X"D7",X"21",X"60",X"42",X"06",X"46",X"D7", + X"3E",X"01",X"32",X"26",X"42",X"21",X"0A",X"40",X"34",X"2D",X"36",X"20",X"21",X"00",X"50",X"22", + X"0B",X"40",X"C9",X"2A",X"0B",X"40",X"06",X"20",X"3E",X"10",X"D7",X"22",X"0B",X"40",X"21",X"09", + X"40",X"35",X"C0",X"2C",X"34",X"21",X"71",X"1D",X"11",X"21",X"40",X"06",X"20",X"7E",X"12",X"23", + X"1C",X"1C",X"10",X"F9",X"C9",X"11",X"80",X"41",X"CD",X"46",X"06",X"EB",X"11",X"18",X"42",X"01", + X"08",X"00",X"ED",X"B0",X"AF",X"32",X"5F",X"42",X"32",X"20",X"42",X"32",X"06",X"70",X"32",X"07", + X"70",X"32",X"18",X"40",X"21",X"0A",X"40",X"34",X"2D",X"36",X"96",X"21",X"40",X"06",X"22",X"45", + X"42",X"3A",X"06",X"40",X"0F",X"D0",X"3A",X"0E",X"40",X"0F",X"38",X"20",X"11",X"00",X"05",X"CD", + X"F2",X"08",X"1E",X"02",X"CD",X"F2",X"08",X"14",X"CD",X"F2",X"08",X"1E",X"04",X"CD",X"F2",X"08", + X"11",X"03",X"07",X"CD",X"F2",X"08",X"11",X"00",X"07",X"C3",X"F2",X"08",X"11",X"03",X"05",X"CD", + X"F2",X"08",X"C3",X"E2",X"05",X"21",X"09",X"40",X"35",X"C0",X"36",X"14",X"2C",X"34",X"11",X"82", + X"06",X"C3",X"F2",X"08",X"21",X"09",X"40",X"35",X"C0",X"36",X"0A",X"2C",X"34",X"21",X"01",X"00", + X"22",X"00",X"42",X"3E",X"80",X"32",X"02",X"42",X"21",X"E3",X"15",X"11",X"4A",X"42",X"01",X"10", + X"00",X"ED",X"B0",X"AF",X"32",X"58",X"40",X"32",X"5A",X"40",X"11",X"03",X"07",X"CD",X"F2",X"08", + X"11",X"00",X"02",X"C3",X"F2",X"08",X"21",X"00",X"41",X"06",X"10",X"0E",X"01",X"1A",X"A1",X"28", + X"0B",X"36",X"01",X"23",X"CB",X"01",X"30",X"F5",X"13",X"10",X"F2",X"C9",X"36",X"00",X"C3",X"53", + X"06",X"CD",X"37",X"08",X"CD",X"98",X"08",X"CD",X"74",X"0A",X"CD",X"C3",X"0C",X"CD",X"BE",X"0B", + X"CD",X"32",X"0A",X"CD",X"0B",X"0B",X"CD",X"77",X"0B",X"CD",X"27",X"12",X"CD",X"9E",X"12",X"CD", + X"E5",X"08",X"CD",X"0C",X"14",X"CD",X"44",X"13",X"CD",X"E1",X"13",X"CD",X"F3",X"14",X"CD",X"ED", + X"12",X"CD",X"27",X"13",X"CD",X"A6",X"16",X"CD",X"15",X"15",X"CD",X"55",X"15",X"CD",X"C3",X"15", + X"CD",X"F4",X"15",X"CD",X"21",X"16",X"CD",X"37",X"16",X"CD",X"B8",X"16",X"CD",X"88",X"16",X"CD", + X"8E",X"19",X"3A",X"08",X"42",X"2A",X"00",X"42",X"B4",X"B5",X"0F",X"D8",X"3A",X"25",X"42",X"0F", + X"D0",X"21",X"60",X"42",X"11",X"05",X"00",X"06",X"0E",X"AF",X"B6",X"19",X"10",X"FC",X"0F",X"D8", + X"21",X"09",X"40",X"35",X"C0",X"2C",X"34",X"C9",X"21",X"0A",X"40",X"3A",X"1D",X"42",X"A7",X"20", + X"20",X"3A",X"B5",X"41",X"A7",X"28",X"3B",X"3A",X"0E",X"40",X"A7",X"28",X"35",X"34",X"2D",X"36", + X"82",X"3A",X"06",X"40",X"0F",X"D0",X"11",X"02",X"06",X"CD",X"F2",X"08",X"1E",X"00",X"C3",X"F2", + X"08",X"3A",X"B5",X"41",X"A7",X"28",X"0B",X"3A",X"0E",X"40",X"A7",X"28",X"05",X"34",X"2D",X"36", + X"50",X"C9",X"3A",X"06",X"40",X"0F",X"30",X"05",X"36",X"04",X"C3",X"0E",X"07",X"36",X"0E",X"C3", + X"0E",X"07",X"3A",X"06",X"40",X"0F",X"30",X"E5",X"3E",X"01",X"32",X"05",X"40",X"AF",X"32",X"06", + X"40",X"32",X"0A",X"40",X"CD",X"B5",X"1C",X"11",X"00",X"06",X"C3",X"F2",X"08",X"21",X"09",X"40", + X"35",X"C0",X"2C",X"AF",X"77",X"32",X"22",X"42",X"32",X"2B",X"42",X"11",X"80",X"41",X"CD",X"64", + X"07",X"21",X"18",X"42",X"01",X"08",X"00",X"ED",X"B0",X"3E",X"01",X"32",X"0D",X"40",X"3E",X"04", + X"32",X"05",X"40",X"C9",X"21",X"00",X"41",X"06",X"10",X"0E",X"01",X"AF",X"CB",X"46",X"28",X"01", + X"B1",X"23",X"CB",X"01",X"30",X"F6",X"12",X"13",X"10",X"F1",X"C9",X"CD",X"0D",X"09",X"CD",X"8E", + X"09",X"3A",X"0A",X"40",X"EF",X"50",X"05",X"83",X"05",X"95",X"07",X"05",X"06",X"14",X"06",X"61", + X"06",X"E8",X"07",X"18",X"08",X"11",X"A0",X"41",X"CD",X"46",X"06",X"EB",X"11",X"18",X"42",X"01", + X"08",X"00",X"ED",X"B0",X"AF",X"32",X"5F",X"42",X"32",X"20",X"42",X"3A",X"0F",X"40",X"A7",X"28", + X"09",X"32",X"18",X"40",X"32",X"06",X"70",X"32",X"07",X"70",X"21",X"0A",X"40",X"34",X"2D",X"36", + X"96",X"21",X"30",X"08",X"22",X"45",X"42",X"3A",X"06",X"40",X"0F",X"D0",X"11",X"03",X"05",X"CD", + X"F2",X"08",X"11",X"03",X"06",X"CD",X"F2",X"08",X"1C",X"CD",X"F2",X"08",X"11",X"03",X"07",X"CD", + X"F2",X"08",X"11",X"00",X"07",X"C3",X"F2",X"08",X"21",X"0A",X"40",X"3A",X"1D",X"42",X"A7",X"20", + X"1B",X"3A",X"95",X"41",X"A7",X"CA",X"22",X"07",X"34",X"2D",X"36",X"82",X"3A",X"06",X"40",X"0F", + X"D0",X"11",X"03",X"06",X"CD",X"F2",X"08",X"1E",X"00",X"C3",X"F2",X"08",X"3A",X"95",X"41",X"A7", + X"CA",X"12",X"07",X"34",X"2D",X"36",X"50",X"C9",X"21",X"09",X"40",X"35",X"C0",X"2C",X"AF",X"77", + X"32",X"0D",X"40",X"3E",X"03",X"32",X"05",X"40",X"11",X"A0",X"41",X"CD",X"64",X"07",X"21",X"18", + X"42",X"01",X"08",X"00",X"ED",X"B0",X"C9",X"21",X"00",X"42",X"CB",X"46",X"28",X"39",X"2C",X"2C", + X"3A",X"06",X"40",X"0F",X"D2",X"92",X"08",X"3A",X"18",X"40",X"0F",X"38",X"3F",X"3A",X"10",X"40", + X"47",X"CB",X"5F",X"28",X"06",X"7E",X"FE",X"17",X"38",X"01",X"35",X"CB",X"50",X"28",X"06",X"7E", + X"FE",X"E9",X"30",X"01",X"34",X"7E",X"2F",X"C6",X"80",X"0E",X"06",X"21",X"54",X"40",X"06",X"04", + X"77",X"2C",X"71",X"2C",X"10",X"FA",X"C9",X"2C",X"CB",X"46",X"20",X"06",X"2C",X"36",X"00",X"C3", + X"65",X"08",X"2C",X"7E",X"2F",X"C6",X"80",X"0E",X"07",X"C3",X"6B",X"08",X"3A",X"11",X"40",X"C3", + X"50",X"08",X"3A",X"3F",X"42",X"C3",X"50",X"08",X"CD",X"BC",X"08",X"2A",X"09",X"42",X"3A",X"18", + X"40",X"0F",X"38",X"0D",X"7D",X"2F",X"C6",X"FC",X"32",X"9F",X"40",X"7C",X"2F",X"32",X"9D",X"40", + X"C9",X"7D",X"3D",X"32",X"9F",X"40",X"7C",X"2F",X"32",X"9D",X"40",X"C9",X"21",X"08",X"42",X"CB", + X"46",X"23",X"28",X"0F",X"7E",X"D6",X"04",X"77",X"D6",X"0E",X"D6",X"04",X"D0",X"3E",X"01",X"32", + X"0B",X"42",X"C9",X"36",X"DC",X"2C",X"3A",X"00",X"42",X"CB",X"47",X"28",X"05",X"3A",X"02",X"42", + X"77",X"C9",X"36",X"00",X"C9",X"3A",X"0B",X"42",X"0F",X"D0",X"AF",X"32",X"0B",X"42",X"32",X"08", + X"42",X"C9",X"E5",X"26",X"40",X"3A",X"A0",X"40",X"6F",X"CB",X"7E",X"28",X"0E",X"72",X"2C",X"73", + X"2C",X"7D",X"FE",X"C0",X"30",X"02",X"3E",X"C0",X"32",X"A0",X"40",X"E1",X"C9",X"21",X"08",X"42", + X"CB",X"46",X"28",X"2A",X"2C",X"7E",X"D6",X"22",X"FE",X"50",X"30",X"22",X"2C",X"3A",X"0E",X"42", + X"96",X"ED",X"44",X"47",X"C6",X"02",X"E6",X"0F",X"FE",X"03",X"30",X"12",X"78",X"0F",X"0F",X"0F", + X"0F",X"E6",X"0F",X"5F",X"16",X"00",X"21",X"F0",X"41",X"19",X"CB",X"46",X"20",X"4A",X"2A",X"0E", + X"42",X"ED",X"5B",X"10",X"42",X"3A",X"0D",X"42",X"A7",X"20",X"12",X"CB",X"7C",X"20",X"04",X"7D", + X"BB",X"30",X"2A",X"3A",X"5F",X"42",X"E6",X"03",X"C0",X"23",X"C3",X"6C",X"09",X"CB",X"7C",X"28", + X"04",X"7D",X"BA",X"38",X"1E",X"3A",X"5F",X"42",X"E6",X"03",X"C0",X"2B",X"22",X"0E",X"42",X"7D", + X"ED",X"44",X"21",X"28",X"40",X"06",X"09",X"77",X"2C",X"2C",X"10",X"FB",X"C9",X"3E",X"01",X"32", + X"0D",X"42",X"C9",X"AF",X"32",X"0D",X"42",X"C9",X"2A",X"0E",X"42",X"C3",X"6F",X"09",X"AF",X"11", + X"E8",X"41",X"12",X"1C",X"12",X"1C",X"0E",X"06",X"21",X"23",X"41",X"06",X"0A",X"AF",X"B6",X"2C", + X"10",X"FC",X"12",X"1C",X"7D",X"C6",X"06",X"6F",X"0D",X"C2",X"9B",X"09",X"AF",X"12",X"1C",X"12", + X"1C",X"12",X"1C",X"21",X"23",X"41",X"0E",X"0A",X"D5",X"11",X"10",X"00",X"06",X"06",X"AF",X"B6", + X"19",X"10",X"FC",X"D1",X"12",X"1C",X"7D",X"D6",X"5F",X"6F",X"0D",X"C2",X"B8",X"09",X"21",X"FC", + X"41",X"06",X"0A",X"1E",X"22",X"CB",X"46",X"20",X"09",X"2D",X"7B",X"C6",X"10",X"5F",X"10",X"F5", + X"1E",X"22",X"21",X"F3",X"41",X"06",X"0A",X"16",X"E0",X"CB",X"46",X"20",X"09",X"2C",X"7A",X"D6", + X"10",X"57",X"10",X"F5",X"16",X"E0",X"ED",X"53",X"10",X"42",X"21",X"EA",X"41",X"0E",X"01",X"06", + X"04",X"AF",X"B6",X"2C",X"10",X"FC",X"A9",X"32",X"21",X"42",X"A9",X"B6",X"2C",X"B6",X"A9",X"32", + X"20",X"42",X"21",X"D0",X"42",X"11",X"20",X"00",X"06",X"07",X"AF",X"B6",X"19",X"10",X"FC",X"A9", + X"32",X"26",X"42",X"A9",X"21",X"B1",X"42",X"06",X"08",X"B6",X"19",X"10",X"FC",X"A9",X"32",X"25", + X"42",X"C9",X"3A",X"00",X"42",X"0F",X"D0",X"3A",X"08",X"42",X"0F",X"D8",X"3A",X"06",X"40",X"0F", + X"30",X"26",X"3A",X"18",X"40",X"0F",X"38",X"15",X"3A",X"13",X"40",X"2F",X"47",X"3A",X"10",X"40", + X"A0",X"E6",X"10",X"C8",X"3E",X"01",X"32",X"08",X"42",X"32",X"CC",X"41",X"C9",X"3A",X"14",X"40", + X"2F",X"47",X"3A",X"11",X"40",X"C3",X"50",X"0A",X"3A",X"5F",X"42",X"E6",X"1F",X"C0",X"3E",X"01", + X"32",X"08",X"42",X"C9",X"DD",X"21",X"60",X"42",X"3A",X"5F",X"42",X"0F",X"38",X"0B",X"DD",X"34", + X"01",X"DD",X"34",X"01",X"11",X"05",X"00",X"DD",X"19",X"FD",X"21",X"81",X"40",X"06",X"07",X"DD", + X"CB",X"00",X"46",X"28",X"27",X"DD",X"7E",X"01",X"C6",X"02",X"DD",X"77",X"01",X"C6",X"04",X"38", + X"1B",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"DD",X"5E",X"04",X"CB",X"13",X"9F",X"57",X"19",X"DD", + X"75",X"02",X"DD",X"74",X"03",X"7C",X"C6",X"10",X"FE",X"20",X"30",X"0A",X"AF",X"DD",X"77",X"00", + X"DD",X"77",X"01",X"DD",X"77",X"03",X"3A",X"18",X"40",X"0F",X"38",X"29",X"DD",X"7E",X"01",X"2F", + X"3D",X"FD",X"77",X"02",X"DD",X"7E",X"03",X"2F",X"4F",X"78",X"FE",X"05",X"38",X"01",X"0C",X"FD", + X"71",X"00",X"11",X"05",X"00",X"DD",X"19",X"DD",X"34",X"01",X"DD",X"34",X"01",X"DD",X"19",X"1D", + X"FD",X"19",X"10",X"9B",X"C9",X"DD",X"7E",X"01",X"D6",X"04",X"FD",X"77",X"02",X"DD",X"7E",X"03", + X"2F",X"4F",X"78",X"FE",X"05",X"38",X"D8",X"0D",X"C3",X"DF",X"0A",X"21",X"08",X"42",X"CB",X"46", + X"C8",X"23",X"7E",X"FE",X"68",X"D0",X"D6",X"1E",X"D8",X"06",X"06",X"D6",X"07",X"D8",X"D6",X"05", + X"38",X"03",X"10",X"F7",X"C9",X"23",X"3A",X"0E",X"42",X"96",X"ED",X"44",X"4F",X"E6",X"0F",X"D6", + X"02",X"FE",X"0B",X"D0",X"04",X"79",X"E6",X"F0",X"80",X"0F",X"0F",X"0F",X"0F",X"5F",X"16",X"00", + X"21",X"00",X"41",X"19",X"CB",X"46",X"C8",X"72",X"16",X"01",X"5D",X"CD",X"F2",X"08",X"7A",X"32", + X"0B",X"42",X"32",X"B1",X"42",X"AF",X"32",X"B2",X"42",X"2A",X"09",X"42",X"22",X"B3",X"42",X"16", + X"03",X"7B",X"FE",X"50",X"38",X"0C",X"E6",X"70",X"0F",X"0F",X"0F",X"0F",X"D6",X"04",X"5F",X"C3", + X"F2",X"08",X"1E",X"00",X"C3",X"F2",X"08",X"3A",X"00",X"42",X"0F",X"D0",X"DD",X"21",X"60",X"42", + X"11",X"05",X"00",X"06",X"0E",X"CD",X"8D",X"0B",X"DD",X"19",X"10",X"F9",X"C9",X"DD",X"CB",X"00", + X"46",X"C8",X"DD",X"7E",X"01",X"C6",X"1F",X"93",X"38",X"10",X"D6",X"09",X"D0",X"3A",X"02",X"42", + X"DD",X"96",X"03",X"83",X"FE",X"0B",X"D0",X"C3",X"B4",X"0B",X"3A",X"02",X"42",X"DD",X"96",X"03", + X"C6",X"02",X"BB",X"D0",X"DD",X"36",X"00",X"00",X"3E",X"01",X"32",X"04",X"42",X"C9",X"3A",X"18", + X"40",X"0F",X"38",X"2E",X"DD",X"21",X"B0",X"42",X"FD",X"21",X"60",X"40",X"06",X"03",X"0E",X"07", + X"CD",X"20",X"0C",X"11",X"20",X"00",X"DD",X"19",X"11",X"04",X"00",X"FD",X"19",X"10",X"F1",X"06", + X"05",X"0C",X"CD",X"20",X"0C",X"11",X"20",X"00",X"DD",X"19",X"11",X"04",X"00",X"FD",X"19",X"10", + X"F1",X"C9",X"DD",X"21",X"B0",X"42",X"FD",X"21",X"60",X"40",X"06",X"03",X"0E",X"09",X"CD",X"20", + X"0C",X"11",X"20",X"00",X"DD",X"19",X"11",X"04",X"00",X"FD",X"19",X"10",X"F1",X"06",X"05",X"0D", + X"CD",X"20",X"0C",X"11",X"20",X"00",X"DD",X"19",X"11",X"04",X"00",X"FD",X"19",X"10",X"F1",X"C9", + X"DD",X"CB",X"00",X"46",X"CA",X"98",X"0C",X"DD",X"7E",X"16",X"FD",X"77",X"02",X"DD",X"7E",X"03", + X"D6",X"08",X"FD",X"77",X"03",X"DD",X"7E",X"04",X"2F",X"91",X"FD",X"77",X"00",X"DD",X"7E",X"05", + X"A7",X"F2",X"58",X"0C",X"FE",X"FA",X"FA",X"82",X"0C",X"2F",X"C6",X"12",X"F6",X"40",X"DD",X"86", + X"0F",X"FD",X"77",X"01",X"FD",X"34",X"03",X"C9",X"FE",X"06",X"F2",X"6E",X"0C",X"C6",X"11",X"F6", + X"C0",X"DD",X"86",X"0F",X"FD",X"77",X"01",X"FD",X"34",X"03",X"FD",X"34",X"00",X"C9",X"FE",X"0C", + X"F2",X"90",X"0C",X"2F",X"C6",X"1E",X"F6",X"80",X"DD",X"86",X"0F",X"FD",X"77",X"01",X"FD",X"34", + X"00",X"C9",X"FE",X"F4",X"FA",X"94",X"0C",X"C6",X"1D",X"DD",X"86",X"0F",X"FD",X"77",X"01",X"C9", + X"D6",X"18",X"18",X"AC",X"C6",X"18",X"18",X"A8",X"DD",X"CB",X"01",X"46",X"CA",X"BA",X"0C",X"FD", + X"36",X"02",X"07",X"DD",X"7E",X"03",X"D6",X"08",X"FD",X"77",X"03",X"DD",X"7E",X"04",X"2F",X"91", + X"FD",X"77",X"00",X"DD",X"7E",X"12",X"FD",X"77",X"01",X"C9",X"FD",X"36",X"03",X"F8",X"FD",X"36", + X"00",X"F8",X"C9",X"DD",X"21",X"B0",X"42",X"11",X"20",X"00",X"06",X"08",X"D9",X"CD",X"D6",X"0C", + X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"CB",X"01",X"46",X"C2",X"E4",X"10",X"DD",X"CB",X"00", + X"46",X"C8",X"DD",X"7E",X"02",X"EF",X"06",X"0D",X"71",X"0D",X"D1",X"0D",X"2B",X"0E",X"6B",X"0E", + X"99",X"0E",X"07",X"0F",X"3C",X"0F",X"66",X"0F",X"AF",X"0F",X"1F",X"10",X"8E",X"10",X"91",X"10", + X"9B",X"10",X"C2",X"10",X"D8",X"10",X"DD",X"36",X"17",X"00",X"3E",X"01",X"32",X"C2",X"41",X"CD", + X"47",X"11",X"DD",X"5E",X"07",X"16",X"01",X"CD",X"F2",X"08",X"7B",X"E6",X"70",X"21",X"D1",X"1D", + X"0F",X"0F",X"0F",X"5F",X"16",X"00",X"19",X"7E",X"DD",X"77",X"16",X"23",X"7E",X"DD",X"77",X"18", + X"7B",X"FE",X"0E",X"28",X"23",X"DD",X"36",X"0F",X"00",X"DD",X"36",X"10",X"03",X"DD",X"36",X"11", + X"0C",X"DD",X"36",X"13",X"00",X"DD",X"34",X"02",X"DD",X"CB",X"06",X"46",X"20",X"05",X"DD",X"36", + X"05",X"0C",X"C9",X"DD",X"36",X"05",X"F4",X"C9",X"DD",X"36",X"0F",X"18",X"AF",X"DD",X"CB",X"20", + X"46",X"28",X"01",X"3C",X"DD",X"CB",X"40",X"46",X"28",X"01",X"3C",X"32",X"2A",X"42",X"C3",X"39", + X"0D",X"DD",X"6E",X"13",X"26",X"1E",X"DD",X"7E",X"03",X"86",X"DD",X"77",X"03",X"2C",X"DD",X"CB", + X"06",X"46",X"20",X"24",X"DD",X"7E",X"04",X"86",X"DD",X"77",X"04",X"C6",X"07",X"FE",X"0E",X"38", + X"3B",X"2C",X"DD",X"75",X"13",X"DD",X"35",X"10",X"C0",X"DD",X"36",X"10",X"04",X"DD",X"35",X"05", + X"DD",X"35",X"11",X"C0",X"DD",X"34",X"02",X"C9",X"DD",X"7E",X"04",X"96",X"DD",X"77",X"04",X"C6", + X"07",X"FE",X"0E",X"38",X"17",X"2C",X"DD",X"75",X"13",X"DD",X"35",X"10",X"C0",X"DD",X"36",X"10", + X"04",X"DD",X"34",X"05",X"DD",X"35",X"11",X"C0",X"DD",X"34",X"02",X"C9",X"DD",X"36",X"02",X"05", + X"C9",X"DD",X"34",X"03",X"DD",X"7E",X"07",X"E6",X"70",X"FE",X"60",X"28",X"43",X"3A",X"02",X"42", + X"47",X"DD",X"7E",X"04",X"90",X"38",X"28",X"1F",X"C6",X"10",X"FE",X"30",X"30",X"02",X"3E",X"30", + X"FE",X"70",X"38",X"02",X"3E",X"70",X"DD",X"77",X"19",X"DD",X"96",X"04",X"ED",X"44",X"DD",X"77", + X"09",X"AF",X"DD",X"77",X"1A",X"DD",X"77",X"1B",X"DD",X"77",X"1C",X"DD",X"34",X"02",X"C9",X"1F", + X"D6",X"10",X"FE",X"D0",X"38",X"02",X"3E",X"D0",X"FE",X"90",X"30",X"DA",X"3E",X"90",X"18",X"D6", + X"3A",X"D0",X"42",X"0F",X"30",X"B7",X"3A",X"E9",X"42",X"18",X"CB",X"DD",X"34",X"03",X"CD",X"6B", + X"11",X"DD",X"7E",X"09",X"DD",X"86",X"19",X"DD",X"77",X"04",X"C6",X"07",X"FE",X"0E",X"38",X"24", + X"DD",X"7E",X"03",X"C6",X"48",X"38",X"20",X"3A",X"00",X"42",X"0F",X"D0",X"CD",X"B0",X"11",X"3A", + X"2B",X"42",X"0F",X"D8",X"2A",X"13",X"42",X"DD",X"7E",X"03",X"BC",X"CA",X"E0",X"11",X"C6",X"19", + X"2D",X"20",X"F7",X"C9",X"DD",X"34",X"02",X"DD",X"34",X"02",X"C9",X"3A",X"5F",X"42",X"E6",X"01", + X"3C",X"DD",X"86",X"03",X"DD",X"77",X"03",X"D6",X"06",X"FE",X"03",X"38",X"18",X"CD",X"6B",X"11", + X"DD",X"7E",X"19",X"A7",X"FA",X"90",X"0E",X"DD",X"86",X"09",X"38",X"09",X"DD",X"77",X"04",X"C9", + X"DD",X"86",X"09",X"38",X"F7",X"DD",X"34",X"02",X"C9",X"DD",X"36",X"03",X"08",X"DD",X"34",X"17", + X"DD",X"36",X"05",X"00",X"DD",X"7E",X"07",X"E6",X"70",X"FE",X"70",X"28",X"2D",X"3A",X"00",X"42", + X"0F",X"30",X"23",X"3A",X"24",X"42",X"A7",X"20",X"06",X"3A",X"21",X"42",X"A7",X"28",X"17",X"DD", + X"7E",X"04",X"1F",X"4F",X"CD",X"3C",X"00",X"E6",X"1F",X"81",X"C6",X"20",X"DD",X"77",X"04",X"DD", + X"36",X"10",X"28",X"DD",X"34",X"02",X"DD",X"34",X"02",X"C9",X"3A",X"2A",X"42",X"A7",X"20",X"12", + X"DD",X"36",X"00",X"00",X"3A",X"1E",X"42",X"3C",X"FE",X"03",X"38",X"02",X"3E",X"02",X"32",X"1E", + X"42",X"C9",X"AF",X"DD",X"CB",X"20",X"46",X"28",X"01",X"3C",X"DD",X"CB",X"40",X"46",X"28",X"01", + X"3C",X"32",X"2A",X"42",X"C3",X"AD",X"0E",X"DD",X"46",X"03",X"04",X"CD",X"47",X"11",X"DD",X"7E", + X"03",X"DD",X"70",X"03",X"90",X"28",X"14",X"FE",X"19",X"D0",X"E6",X"01",X"C0",X"DD",X"CB",X"06", + X"46",X"20",X"04",X"DD",X"34",X"05",X"C9",X"DD",X"35",X"05",X"C9",X"DD",X"36",X"00",X"00",X"26", + X"41",X"DD",X"6E",X"07",X"16",X"00",X"36",X"01",X"5D",X"C3",X"F2",X"08",X"DD",X"34",X"03",X"3A", + X"02",X"42",X"DD",X"96",X"04",X"ED",X"44",X"17",X"5F",X"9F",X"57",X"CB",X"13",X"CB",X"12",X"DD", + X"66",X"04",X"DD",X"6E",X"09",X"A7",X"ED",X"52",X"DD",X"74",X"04",X"DD",X"75",X"09",X"DD",X"35", + X"10",X"C0",X"DD",X"34",X"02",X"C9",X"DD",X"34",X"03",X"DD",X"7E",X"03",X"D6",X"60",X"FE",X"40", + X"30",X"09",X"DD",X"7E",X"04",X"D6",X"60",X"FE",X"40",X"38",X"0C",X"CD",X"DD",X"0D",X"DD",X"36", + X"18",X"03",X"DD",X"36",X"10",X"64",X"C9",X"DD",X"34",X"02",X"DD",X"34",X"02",X"DD",X"36",X"10", + X"03",X"DD",X"36",X"11",X"0C",X"DD",X"36",X"05",X"00",X"DD",X"36",X"13",X"00",X"3A",X"02",X"42", + X"DD",X"96",X"04",X"38",X"05",X"DD",X"36",X"06",X"00",X"C9",X"DD",X"36",X"06",X"01",X"C9",X"DD", + X"34",X"03",X"CD",X"6B",X"11",X"DD",X"7E",X"17",X"FE",X"04",X"28",X"48",X"30",X"4D",X"DD",X"7E", + X"09",X"DD",X"86",X"19",X"DD",X"77",X"04",X"C6",X"07",X"FE",X"0E",X"38",X"29",X"DD",X"7E",X"03", + X"C6",X"40",X"38",X"27",X"DD",X"35",X"10",X"28",X"27",X"3A",X"00",X"42",X"0F",X"D0",X"CD",X"B0", + X"11",X"3A",X"2B",X"42",X"0F",X"D8",X"2A",X"13",X"42",X"DD",X"7E",X"03",X"BC",X"CA",X"E0",X"11", + X"C6",X"19",X"2D",X"20",X"F7",X"C9",X"DD",X"36",X"02",X"05",X"C9",X"DD",X"36",X"02",X"04",X"C9", + X"DD",X"35",X"02",X"C9",X"3A",X"5F",X"42",X"E6",X"01",X"28",X"B3",X"3A",X"02",X"42",X"DD",X"96", + X"09",X"38",X"06",X"DD",X"34",X"09",X"C3",X"BE",X"0F",X"DD",X"35",X"09",X"C3",X"BE",X"0F",X"DD", + X"6E",X"13",X"26",X"1E",X"DD",X"7E",X"03",X"96",X"DD",X"77",X"03",X"2C",X"DD",X"CB",X"06",X"46", + X"20",X"2E",X"DD",X"7E",X"04",X"96",X"DD",X"77",X"04",X"2C",X"DD",X"75",X"13",X"DD",X"35",X"10", + X"C0",X"DD",X"36",X"10",X"04",X"DD",X"35",X"05",X"DD",X"35",X"11",X"C0",X"DD",X"34",X"02",X"DD", + X"36",X"10",X"03",X"DD",X"36",X"11",X"0C",X"DD",X"36",X"05",X"0C",X"DD",X"36",X"13",X"00",X"C9", + X"DD",X"7E",X"04",X"86",X"DD",X"77",X"04",X"2C",X"DD",X"75",X"13",X"DD",X"35",X"10",X"C0",X"DD", + X"36",X"10",X"04",X"DD",X"34",X"05",X"DD",X"35",X"11",X"C0",X"DD",X"34",X"02",X"DD",X"36",X"10", + X"03",X"DD",X"36",X"11",X"0C",X"DD",X"36",X"05",X"F4",X"DD",X"36",X"13",X"00",X"C9",X"C3",X"71", + X"0D",X"DD",X"34",X"03",X"DD",X"36",X"02",X"08",X"C3",X"7B",X"0F",X"DD",X"7E",X"07",X"2F",X"E6", + X"03",X"47",X"3C",X"DD",X"77",X"16",X"07",X"07",X"07",X"07",X"C6",X"8C",X"DD",X"77",X"03",X"DD", + X"36",X"10",X"18",X"DD",X"34",X"02",X"DD",X"36",X"0F",X"00",X"78",X"A7",X"C0",X"DD",X"36",X"0F", + X"18",X"C9",X"DD",X"34",X"04",X"DD",X"35",X"10",X"C0",X"DD",X"7E",X"07",X"C6",X"4B",X"5F",X"16", + X"06",X"CD",X"F2",X"08",X"DD",X"34",X"02",X"C9",X"DD",X"7E",X"04",X"D6",X"C8",X"FE",X"05",X"D8", + X"DD",X"34",X"04",X"C9",X"DD",X"7E",X"02",X"EF",X"F0",X"10",X"12",X"11",X"3D",X"11",X"46",X"11", + X"DD",X"36",X"10",X"04",X"DD",X"36",X"11",X"04",X"DD",X"36",X"12",X"1C",X"DD",X"34",X"02",X"DD", + X"7E",X"07",X"FE",X"70",X"30",X"06",X"3E",X"07",X"32",X"DF",X"41",X"C9",X"3E",X"17",X"32",X"DF", + X"41",X"C9",X"DD",X"35",X"10",X"C0",X"DD",X"36",X"10",X"04",X"DD",X"34",X"12",X"DD",X"35",X"11", + X"C0",X"DD",X"7E",X"07",X"FE",X"70",X"30",X"05",X"DD",X"36",X"01",X"00",X"C9",X"DD",X"36",X"10", + X"32",X"3A",X"2D",X"42",X"C6",X"20",X"DD",X"77",X"12",X"DD",X"34",X"02",X"C9",X"DD",X"35",X"10", + X"C0",X"DD",X"36",X"01",X"00",X"C9",X"C9",X"DD",X"7E",X"07",X"E6",X"70",X"0F",X"4F",X"0F",X"81", + X"ED",X"44",X"C6",X"7C",X"DD",X"77",X"03",X"DD",X"7E",X"07",X"E6",X"0F",X"07",X"07",X"07",X"07", + X"C6",X"07",X"4F",X"3A",X"0E",X"42",X"81",X"DD",X"77",X"04",X"C9",X"DD",X"7E",X"18",X"E6",X"03", + X"3C",X"47",X"DD",X"66",X"19",X"DD",X"6E",X"1A",X"DD",X"56",X"1B",X"DD",X"5E",X"1C",X"7D",X"4C", + X"87",X"30",X"01",X"25",X"82",X"57",X"3E",X"00",X"8C",X"FE",X"80",X"20",X"01",X"79",X"67",X"4D", + X"ED",X"44",X"87",X"30",X"01",X"2D",X"83",X"5F",X"3E",X"00",X"8D",X"FE",X"80",X"20",X"01",X"79", + X"6F",X"10",X"DB",X"DD",X"74",X"19",X"DD",X"75",X"1A",X"DD",X"72",X"1B",X"DD",X"73",X"1C",X"C9", + X"3E",X"F0",X"DD",X"96",X"03",X"57",X"3A",X"02",X"42",X"DD",X"96",X"04",X"38",X"07",X"CD",X"D0", + X"11",X"DD",X"77",X"05",X"C9",X"ED",X"44",X"CD",X"D0",X"11",X"ED",X"44",X"DD",X"77",X"05",X"C9", + X"CD",X"48",X"00",X"79",X"A7",X"F2",X"DA",X"11",X"3E",X"80",X"07",X"07",X"07",X"E6",X"07",X"C9", + X"11",X"05",X"00",X"21",X"60",X"42",X"06",X"0E",X"CB",X"46",X"28",X"04",X"19",X"10",X"F9",X"C9", + X"36",X"01",X"23",X"DD",X"7E",X"03",X"77",X"3E",X"F0",X"96",X"57",X"23",X"23",X"DD",X"7E",X"04", + X"77",X"23",X"3A",X"02",X"42",X"DD",X"96",X"04",X"38",X"05",X"CD",X"18",X"12",X"77",X"C9",X"ED", + X"44",X"CD",X"18",X"12",X"ED",X"44",X"77",X"C9",X"CD",X"48",X"00",X"CD",X"3C",X"00",X"E6",X"1F", + X"81",X"C6",X"06",X"F0",X"3E",X"7F",X"C9",X"3A",X"08",X"42",X"0F",X"D0",X"DD",X"21",X"D0",X"42", + X"11",X"20",X"00",X"06",X"07",X"D9",X"CD",X"3F",X"12",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD", + X"CB",X"00",X"46",X"C8",X"2A",X"09",X"42",X"DD",X"7E",X"03",X"95",X"C6",X"02",X"FE",X"06",X"D0", + X"DD",X"7E",X"04",X"94",X"C6",X"05",X"FE",X"0C",X"D0",X"3E",X"01",X"32",X"0B",X"42",X"DD",X"36", + X"00",X"00",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"00",X"11",X"04",X"03",X"01",X"50",X"03", + X"DD",X"7E",X"07",X"B9",X"DA",X"F2",X"08",X"1C",X"D6",X"10",X"10",X"F7",X"21",X"01",X"F0",X"22", + X"2B",X"42",X"3A",X"2A",X"42",X"FE",X"02",X"CC",X"92",X"12",X"32",X"2D",X"42",X"83",X"5F",X"C3", + X"F2",X"08",X"DD",X"CB",X"20",X"46",X"C0",X"DD",X"CB",X"40",X"46",X"C0",X"3C",X"C9",X"3A",X"00", + X"42",X"0F",X"D0",X"DD",X"21",X"D0",X"42",X"11",X"20",X"00",X"06",X"07",X"D9",X"CD",X"B6",X"12", + X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"CB",X"00",X"46",X"C8",X"DD",X"7E",X"03",X"C6",X"21", + X"D6",X"05",X"38",X"16",X"D6",X"0C",X"D0",X"3A",X"02",X"42",X"DD",X"96",X"04",X"C6",X"0A",X"FE", + X"15",X"D0",X"3E",X"01",X"32",X"04",X"42",X"C3",X"5E",X"12",X"3A",X"02",X"42",X"DD",X"96",X"04", + X"C6",X"07",X"FE",X"0F",X"D0",X"3E",X"01",X"32",X"04",X"42",X"C3",X"5E",X"12",X"21",X"04",X"42", + X"CB",X"46",X"C8",X"36",X"00",X"21",X"00",X"01",X"22",X"00",X"42",X"21",X"0A",X"04",X"22",X"05", + X"42",X"11",X"05",X"02",X"CD",X"F2",X"08",X"3A",X"1A",X"42",X"A7",X"28",X"01",X"3D",X"32",X"1A", + X"42",X"21",X"1D",X"42",X"35",X"7E",X"FE",X"06",X"38",X"02",X"36",X"05",X"3A",X"06",X"40",X"0F", + X"D0",X"3E",X"01",X"32",X"03",X"68",X"C9",X"3A",X"01",X"42",X"0F",X"D0",X"21",X"05",X"42",X"35", + X"C0",X"36",X"0A",X"23",X"16",X"02",X"5E",X"CD",X"F2",X"08",X"35",X"C0",X"AF",X"32",X"01",X"42", + X"32",X"03",X"68",X"C9",X"3A",X"28",X"42",X"0F",X"D0",X"AF",X"32",X"28",X"42",X"3A",X"20",X"42", + X"0F",X"D8",X"2A",X"1A",X"42",X"7C",X"85",X"1F",X"FE",X"04",X"38",X"02",X"3E",X"03",X"3C",X"47", + X"21",X"91",X"43",X"11",X"E1",X"FF",X"7E",X"2B",X"B6",X"28",X"04",X"19",X"10",X"F8",X"C9",X"E5", + X"DD",X"E1",X"3A",X"15",X"42",X"DD",X"77",X"06",X"A7",X"20",X"30",X"21",X"FC",X"41",X"01",X"0A", + X"00",X"3E",X"01",X"ED",X"B9",X"C0",X"E0",X"1E",X"3F",X"2C",X"3A",X"EF",X"41",X"0F",X"30",X"2D", + X"16",X"04",X"26",X"41",X"7D",X"E6",X"0F",X"C6",X"50",X"6F",X"42",X"CB",X"46",X"20",X"2F",X"7D", + X"D6",X"10",X"6F",X"10",X"F6",X"83",X"6F",X"0D",X"20",X"F0",X"C9",X"21",X"F3",X"41",X"01",X"0A", + X"00",X"3E",X"01",X"ED",X"B1",X"C0",X"E0",X"1E",X"41",X"2D",X"C3",X"8A",X"13",X"16",X"05",X"26", + X"41",X"7D",X"E6",X"0F",X"C6",X"60",X"6F",X"7B",X"C6",X"10",X"5F",X"C3",X"9A",X"13",X"36",X"00", + X"DD",X"75",X"07",X"DD",X"36",X"00",X"01",X"DD",X"36",X"02",X"00",X"16",X"01",X"5D",X"C3",X"F2", + X"08",X"2A",X"0E",X"42",X"ED",X"5B",X"10",X"42",X"CB",X"7C",X"28",X"0B",X"7D",X"92",X"FE",X"1C", + X"30",X"11",X"AF",X"32",X"15",X"42",X"C9",X"7B",X"95",X"FE",X"1C",X"30",X"06",X"3E",X"01",X"32", + X"15",X"42",X"C9",X"CD",X"3C",X"00",X"E6",X"01",X"32",X"15",X"42",X"C9",X"3A",X"20",X"42",X"0F", + X"D8",X"3A",X"00",X"42",X"0F",X"D0",X"3A",X"29",X"42",X"0F",X"D0",X"AF",X"32",X"29",X"42",X"2A", + X"D0",X"42",X"7C",X"B5",X"0F",X"D8",X"3A",X"15",X"42",X"4F",X"0F",X"DA",X"BE",X"14",X"21",X"79", + X"41",X"06",X"04",X"CB",X"46",X"20",X"3B",X"2D",X"10",X"F9",X"2E",X"6A",X"06",X"04",X"CB",X"46", + X"20",X"04",X"2D",X"10",X"F9",X"C9",X"DD",X"21",X"90",X"43",X"11",X"E0",X"FF",X"06",X"04",X"DD", + X"7E",X"00",X"DD",X"B6",X"01",X"28",X"05",X"DD",X"19",X"10",X"F4",X"C9",X"36",X"00",X"DD",X"36", + X"00",X"01",X"DD",X"36",X"02",X"00",X"DD",X"71",X"06",X"DD",X"75",X"07",X"16",X"01",X"5D",X"C3", + X"F2",X"08",X"DD",X"21",X"D0",X"42",X"CD",X"5C",X"14",X"7D",X"D6",X"0F",X"6F",X"FD",X"21",X"F0", + X"42",X"06",X"03",X"0E",X"02",X"CB",X"46",X"C4",X"8E",X"14",X"2D",X"10",X"F8",X"C9",X"CD",X"9B", + X"14",X"11",X"20",X"00",X"FD",X"19",X"0D",X"C0",X"06",X"01",X"C9",X"FD",X"CB",X"00",X"46",X"C0", + X"FD",X"CB",X"01",X"46",X"C0",X"36",X"00",X"FD",X"36",X"00",X"01",X"FD",X"36",X"02",X"00",X"DD", + X"7E",X"06",X"FD",X"77",X"06",X"FD",X"75",X"07",X"16",X"01",X"5D",X"C3",X"F2",X"08",X"21",X"76", + X"41",X"06",X"04",X"CB",X"46",X"20",X"10",X"2C",X"10",X"F9",X"2E",X"65",X"06",X"04",X"CB",X"46", + X"C2",X"46",X"14",X"2C",X"10",X"F8",X"C9",X"DD",X"21",X"D0",X"42",X"CD",X"5C",X"14",X"7D",X"D6", + X"11",X"6F",X"FD",X"21",X"F0",X"42",X"06",X"03",X"0E",X"02",X"CB",X"46",X"C4",X"8E",X"14",X"2C", + X"10",X"F8",X"C9",X"3A",X"00",X"42",X"0F",X"D0",X"3A",X"2B",X"42",X"0F",X"D8",X"21",X"18",X"42", + X"35",X"C0",X"36",X"3C",X"23",X"35",X"C0",X"36",X"14",X"23",X"7E",X"FE",X"07",X"C8",X"30",X"02", + X"34",X"C9",X"36",X"07",X"C9",X"3A",X"00",X"42",X"0F",X"D0",X"3A",X"20",X"42",X"0F",X"D8",X"3A", + X"2B",X"42",X"0F",X"D8",X"2A",X"1A",X"42",X"7C",X"FE",X"02",X"30",X"01",X"AF",X"85",X"E6",X"0F", + X"3C",X"47",X"21",X"4A",X"42",X"11",X"E3",X"15",X"35",X"28",X"05",X"AF",X"32",X"28",X"42",X"C9", + X"0E",X"00",X"1A",X"77",X"23",X"13",X"35",X"CC",X"DF",X"15",X"10",X"F8",X"79",X"A7",X"C8",X"3E", + X"01",X"32",X"28",X"42",X"C9",X"3A",X"00",X"42",X"0F",X"D0",X"3A",X"EF",X"41",X"0F",X"D0",X"3A", + X"2B",X"42",X"0F",X"D8",X"3A",X"06",X"40",X"0F",X"30",X"3D",X"21",X"45",X"42",X"35",X"C0",X"36", + X"3C",X"3A",X"21",X"42",X"0F",X"38",X"2C",X"23",X"35",X"C0",X"34",X"2A",X"77",X"41",X"7C",X"85", + X"E6",X"03",X"4F",X"2A",X"1A",X"42",X"7C",X"85",X"C8",X"0F",X"0F",X"E6",X"03",X"2F",X"C6",X"0A", + X"91",X"32",X"46",X"42",X"07",X"07",X"32",X"2F",X"42",X"07",X"32",X"4A",X"42",X"3E",X"01",X"32", + X"2E",X"42",X"C9",X"3E",X"02",X"18",X"ED",X"21",X"45",X"42",X"35",X"C0",X"36",X"3C",X"23",X"35", + X"C0",X"36",X"05",X"3E",X"5A",X"32",X"2F",X"42",X"3E",X"2D",X"32",X"4A",X"42",X"3E",X"01",X"32", + X"2E",X"42",X"C9",X"21",X"2E",X"42",X"CB",X"46",X"C8",X"23",X"35",X"C0",X"2B",X"36",X"00",X"3A", + X"00",X"42",X"0F",X"D0",X"3A",X"EF",X"41",X"0F",X"D0",X"3E",X"01",X"32",X"29",X"42",X"C9",X"1A", + X"77",X"0C",X"C9",X"05",X"2F",X"43",X"77",X"71",X"6D",X"67",X"65",X"4F",X"49",X"43",X"3D",X"3B", + X"35",X"2B",X"29",X"25",X"21",X"E8",X"41",X"06",X"04",X"3A",X"1B",X"42",X"A7",X"20",X"16",X"1E", + X"01",X"16",X"84",X"CB",X"46",X"20",X"09",X"23",X"CB",X"46",X"20",X"04",X"23",X"1C",X"10",X"F3", + X"ED",X"53",X"13",X"42",X"C9",X"1E",X"02",X"16",X"9D",X"18",X"E8",X"1E",X"03",X"16",X"B6",X"18", + X"E2",X"3A",X"20",X"42",X"0F",X"D0",X"3A",X"25",X"42",X"0F",X"D0",X"3A",X"22",X"42",X"0F",X"D8", + X"21",X"01",X"00",X"22",X"22",X"42",X"C9",X"21",X"22",X"42",X"CB",X"46",X"C8",X"23",X"35",X"C0", + X"2B",X"36",X"00",X"11",X"1B",X"05",X"CD",X"46",X"06",X"AF",X"32",X"1A",X"42",X"32",X"5F",X"42", + X"21",X"01",X"00",X"22",X"0E",X"42",X"2A",X"1B",X"42",X"24",X"7D",X"FE",X"07",X"28",X"03",X"30", + X"22",X"3C",X"6F",X"22",X"1B",X"42",X"11",X"00",X"07",X"CD",X"F2",X"08",X"3A",X"1E",X"42",X"A7", + X"C8",X"21",X"77",X"41",X"36",X"01",X"3D",X"32",X"1E",X"42",X"C8",X"23",X"36",X"01",X"AF",X"32", + X"1E",X"42",X"C9",X"3E",X"07",X"C3",X"62",X"16",X"21",X"2B",X"42",X"CB",X"46",X"C8",X"3A",X"24", + X"42",X"A7",X"20",X"0B",X"3A",X"21",X"42",X"A7",X"20",X"05",X"3A",X"26",X"42",X"0F",X"D0",X"23", + X"35",X"C0",X"2B",X"36",X"00",X"C9",X"3A",X"07",X"40",X"0F",X"D8",X"21",X"DF",X"41",X"7E",X"A7", + X"C8",X"0F",X"0F",X"32",X"04",X"68",X"35",X"C9",X"3A",X"07",X"40",X"0F",X"D8",X"21",X"23",X"41", + X"11",X"06",X"00",X"4B",X"3E",X"01",X"06",X"0A",X"86",X"2C",X"10",X"FC",X"19",X"0D",X"C2",X"C6", + X"16",X"21",X"00",X"68",X"06",X"03",X"3D",X"28",X"14",X"36",X"01",X"2C",X"10",X"F8",X"FE",X"02", + X"38",X"05",X"AF",X"32",X"24",X"42",X"C9",X"3E",X"01",X"32",X"24",X"42",X"C9",X"36",X"00",X"2C", + X"10",X"FB",X"C3",X"DE",X"16",X"AF",X"32",X"C0",X"41",X"3D",X"32",X"C1",X"41",X"CD",X"47",X"17", + X"CD",X"D0",X"17",X"CD",X"19",X"18",X"CD",X"5D",X"17",X"CD",X"4F",X"18",X"CD",X"76",X"18",X"CD", + X"23",X"17",X"3A",X"C0",X"41",X"32",X"06",X"68",X"0F",X"32",X"07",X"68",X"3A",X"C1",X"41",X"32", + X"00",X"78",X"C9",X"3A",X"CC",X"41",X"3D",X"C2",X"33",X"17",X"32",X"CC",X"41",X"3E",X"08",X"32", + X"CE",X"41",X"C9",X"3A",X"CE",X"41",X"A7",X"CA",X"43",X"17",X"3D",X"32",X"CE",X"41",X"3A",X"07", + X"40",X"EE",X"01",X"32",X"05",X"68",X"C9",X"3A",X"D1",X"41",X"3D",X"C0",X"32",X"D1",X"41",X"3C", + X"32",X"D2",X"41",X"32",X"D6",X"41",X"21",X"68",X"1E",X"22",X"D3",X"41",X"C9",X"21",X"D2",X"41", + X"CD",X"6C",X"17",X"21",X"CF",X"41",X"CD",X"6C",X"17",X"21",X"CD",X"41",X"7E",X"A7",X"C8",X"EB", + X"3E",X"02",X"32",X"C0",X"41",X"3A",X"D5",X"41",X"32",X"C1",X"41",X"3A",X"D6",X"41",X"3D",X"C2", + X"A2",X"17",X"2A",X"D3",X"41",X"7E",X"FE",X"E0",X"28",X"1C",X"23",X"22",X"D3",X"41",X"47",X"E6", + X"1F",X"21",X"A9",X"17",X"E7",X"32",X"D5",X"41",X"78",X"E6",X"E0",X"07",X"07",X"07",X"21",X"C8", + X"17",X"E7",X"32",X"D6",X"41",X"C9",X"AF",X"12",X"C9",X"FF",X"00",X"40",X"55",X"5F",X"68",X"70", + X"80",X"8E",X"9A",X"A0",X"AA",X"B4",X"B8",X"C0",X"C7",X"CD",X"D0",X"D5",X"DA",X"DC",X"E0",X"1C", + X"35",X"87",X"A5",X"C4",X"D3",X"CA",X"E3",X"E6",X"01",X"02",X"04",X"08",X"10",X"20",X"40",X"00", + X"3A",X"06",X"40",X"0F",X"D0",X"21",X"C2",X"41",X"7E",X"3D",X"C2",X"E5",X"17",X"77",X"21",X"02", + X"A0",X"22",X"C3",X"41",X"C9",X"3A",X"26",X"42",X"0F",X"D8",X"23",X"3A",X"5F",X"42",X"0F",X"38", + X"10",X"3A",X"C4",X"41",X"FE",X"60",X"30",X"01",X"34",X"A7",X"CA",X"01",X"18",X"3D",X"32",X"C4", + X"41",X"7E",X"E6",X"03",X"C2",X"0C",X"18",X"3E",X"60",X"C3",X"15",X"18",X"0F",X"3A",X"C4",X"41", + X"30",X"03",X"C6",X"60",X"1F",X"32",X"C1",X"41",X"C9",X"3A",X"06",X"40",X"0F",X"D0",X"3A",X"DF", + X"41",X"FE",X"06",X"C2",X"3A",X"18",X"3A",X"CD",X"41",X"0F",X"D8",X"3E",X"01",X"32",X"CF",X"41", + X"32",X"D6",X"41",X"21",X"BD",X"1E",X"22",X"D3",X"41",X"C9",X"FE",X"16",X"C0",X"AF",X"32",X"CF", + X"41",X"3C",X"32",X"CD",X"41",X"32",X"D6",X"41",X"21",X"DF",X"1E",X"22",X"D3",X"41",X"C9",X"2A", + X"C7",X"41",X"CB",X"45",X"CA",X"5E",X"18",X"21",X"00",X"80",X"22",X"C7",X"41",X"C9",X"7C",X"A7", + X"C8",X"3D",X"32",X"C8",X"41",X"E6",X"04",X"CA",X"6C",X"18",X"3E",X"81",X"3D",X"32",X"C1",X"41", + X"3E",X"01",X"32",X"C0",X"41",X"C9",X"21",X"C9",X"41",X"7E",X"3D",X"C2",X"86",X"18",X"77",X"21", + X"20",X"00",X"22",X"CA",X"41",X"C9",X"23",X"7E",X"A7",X"C8",X"35",X"23",X"7E",X"C6",X"04",X"77", + X"32",X"C1",X"41",X"AF",X"32",X"C0",X"41",X"C9",X"3A",X"D0",X"41",X"A7",X"28",X"08",X"AF",X"32", + X"D0",X"41",X"3E",X"0F",X"18",X"0C",X"3A",X"5F",X"42",X"C6",X"01",X"D0",X"3A",X"1F",X"42",X"A7", + X"C8",X"3D",X"32",X"1F",X"42",X"06",X"04",X"21",X"04",X"60",X"77",X"23",X"0F",X"10",X"FB",X"C9", + X"3A",X"B0",X"40",X"0F",X"D0",X"2A",X"B1",X"40",X"7E",X"E6",X"07",X"20",X"1B",X"EB",X"2A",X"B3", + X"40",X"7E",X"FE",X"3F",X"28",X"11",X"23",X"22",X"B3",X"40",X"D6",X"30",X"2A",X"B5",X"40",X"77", + X"01",X"E0",X"FF",X"09",X"22",X"B5",X"40",X"EB",X"35",X"C0",X"AF",X"32",X"B0",X"40",X"C9",X"3A", + X"00",X"40",X"FE",X"03",X"28",X"21",X"21",X"10",X"40",X"7E",X"2C",X"2C",X"2C",X"B6",X"2C",X"2C", + X"2F",X"A6",X"2C",X"A6",X"CB",X"7F",X"20",X"16",X"E6",X"03",X"C8",X"21",X"04",X"40",X"34",X"CB", + X"47",X"C8",X"E6",X"02",X"C8",X"34",X"C9",X"21",X"00",X"09",X"22",X"01",X"40",X"C9",X"21",X"02", + X"40",X"7E",X"FE",X"63",X"D0",X"34",X"3E",X"01",X"32",X"C9",X"41",X"11",X"01",X"07",X"C3",X"F2", + X"08",X"21",X"03",X"40",X"7E",X"A7",X"20",X"3C",X"2C",X"B6",X"C8",X"35",X"2D",X"36",X"0F",X"3A", + X"00",X"40",X"FE",X"03",X"C8",X"3D",X"28",X"1C",X"21",X"02",X"40",X"3D",X"CC",X"4F",X"19",X"7E", + X"FE",X"63",X"C8",X"30",X"0C",X"34",X"3E",X"01",X"32",X"C9",X"41",X"11",X"01",X"07",X"C3",X"F2", + X"08",X"36",X"63",X"C9",X"21",X"01",X"40",X"CB",X"46",X"28",X"06",X"36",X"00",X"2C",X"C3",X"4F", + X"19",X"36",X"01",X"C9",X"0F",X"0F",X"0F",X"32",X"03",X"60",X"35",X"C9",X"3A",X"02",X"40",X"FE", + X"09",X"30",X"06",X"3E",X"01",X"32",X"02",X"60",X"C9",X"AF",X"32",X"02",X"60",X"C9",X"3A",X"5F", + X"42",X"C6",X"09",X"E6",X"1F",X"C0",X"3A",X"07",X"40",X"0F",X"D0",X"3A",X"00",X"42",X"0F",X"D0", + X"DD",X"21",X"D0",X"42",X"06",X"00",X"D9",X"11",X"20",X"00",X"06",X"07",X"D9",X"DD",X"66",X"03", + X"DD",X"6E",X"04",X"DD",X"4E",X"1A",X"CD",X"12",X"1A",X"D9",X"DD",X"19",X"10",X"EE",X"DD",X"21", + X"60",X"42",X"11",X"05",X"00",X"06",X"07",X"D9",X"DD",X"66",X"01",X"DD",X"6E",X"03",X"DD",X"4E", + X"04",X"CD",X"12",X"1A",X"D9",X"DD",X"19",X"10",X"EE",X"D9",X"3A",X"02",X"42",X"4F",X"3A",X"0E", + X"42",X"C6",X"80",X"91",X"CB",X"2F",X"CB",X"2F",X"CB",X"2F",X"CB",X"2F",X"CB",X"2F",X"80",X"CB", + X"2F",X"4F",X"CD",X"3C",X"00",X"41",X"87",X"9F",X"20",X"01",X"3C",X"80",X"C6",X"01",X"FA",X"0E", + X"1A",X"FE",X"02",X"30",X"05",X"AF",X"32",X"3F",X"42",X"C9",X"3E",X"04",X"18",X"F8",X"3E",X"08", + X"18",X"F4",X"DD",X"CB",X"00",X"46",X"C8",X"7C",X"D6",X"80",X"D8",X"1E",X"00",X"D6",X"34",X"38", + X"04",X"1C",X"D6",X"34",X"D0",X"3A",X"02",X"42",X"95",X"D6",X"40",X"FE",X"80",X"D0",X"E6",X"60", + X"6F",X"79",X"E6",X"80",X"B5",X"0F",X"0F",X"0F",X"0F",X"B3",X"5F",X"16",X"00",X"21",X"45",X"1A", + X"19",X"7E",X"80",X"47",X"C9",X"02",X"03",X"FE",X"02",X"FF",X"FE",X"00",X"FF",X"00",X"01",X"01", + X"02",X"02",X"FE",X"FE",X"03",X"21",X"00",X"50",X"06",X"04",X"3E",X"10",X"77",X"2C",X"C2",X"5C", + X"1A",X"24",X"3A",X"00",X"78",X"10",X"F3",X"21",X"00",X"58",X"AF",X"77",X"2C",X"C2",X"6B",X"1A", + X"AF",X"21",X"00",X"60",X"06",X"04",X"77",X"23",X"10",X"FC",X"3C",X"06",X"04",X"77",X"23",X"10", + X"FC",X"AF",X"06",X"08",X"21",X"00",X"68",X"77",X"23",X"10",X"FC",X"06",X"08",X"21",X"01",X"70", + X"77",X"23",X"10",X"FC",X"3D",X"32",X"00",X"78",X"0E",X"20",X"21",X"00",X"40",X"06",X"04",X"79", + X"C6",X"2F",X"77",X"2C",X"C2",X"A0",X"1A",X"3C",X"24",X"10",X"F5",X"21",X"00",X"40",X"06",X"04", + X"79",X"C6",X"2F",X"BE",X"20",X"45",X"2C",X"C2",X"B1",X"1A",X"3C",X"24",X"10",X"F3",X"3A",X"00", + X"78",X"0D",X"C2",X"9A",X"1A",X"31",X"00",X"44",X"0E",X"20",X"21",X"00",X"50",X"06",X"04",X"79", + X"C6",X"2F",X"77",X"2C",X"C2",X"D0",X"1A",X"3C",X"24",X"10",X"F5",X"3A",X"00",X"78",X"21",X"00", + X"50",X"06",X"04",X"79",X"C6",X"2F",X"BE",X"20",X"16",X"2C",X"C2",X"E4",X"1A",X"3C",X"24",X"10", + X"F3",X"3A",X"00",X"78",X"0D",X"C2",X"CA",X"1A",X"C3",X"70",X"1B",X"3E",X"01",X"18",X"05",X"CD", + X"5D",X"1B",X"3E",X"02",X"32",X"F3",X"51",X"11",X"2D",X"1B",X"21",X"33",X"52",X"01",X"20",X"00", + X"D9",X"06",X"07",X"D9",X"1A",X"77",X"09",X"13",X"D9",X"10",X"F8",X"AF",X"32",X"01",X"70",X"3A", + X"00",X"78",X"3A",X"00",X"60",X"E6",X"40",X"C2",X"1B",X"1B",X"C3",X"00",X"00",X"1D",X"11",X"22", + X"10",X"14",X"11",X"12",X"4F",X"3A",X"00",X"60",X"47",X"3A",X"00",X"68",X"A0",X"E6",X"04",X"28", + X"10",X"79",X"E6",X"0F",X"32",X"D3",X"51",X"79",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"32",X"F3", + X"51",X"11",X"56",X"1B",X"18",X"B4",X"1D",X"1F",X"22",X"10",X"14",X"11",X"12",X"21",X"00",X"50", + X"06",X"04",X"3E",X"10",X"77",X"2C",X"C2",X"64",X"1B",X"24",X"3A",X"00",X"78",X"10",X"F3",X"C9", + X"CD",X"5D",X"1B",X"21",X"00",X"00",X"06",X"28",X"AF",X"86",X"2C",X"C2",X"79",X"1B",X"24",X"4F", + X"3A",X"00",X"78",X"79",X"10",X"F3",X"A7",X"C2",X"34",X"1B",X"21",X"00",X"40",X"06",X"C0",X"D7", + X"3D",X"06",X"40",X"D7",X"AF",X"D7",X"D7",X"06",X"A0",X"D7",X"32",X"01",X"70",X"32",X"05",X"70", + X"32",X"06",X"70",X"32",X"07",X"70",X"32",X"18",X"40",X"3A",X"00",X"78",X"3E",X"20",X"32",X"08", + X"40",X"3E",X"03",X"32",X"1A",X"40",X"21",X"C0",X"C0",X"22",X"A0",X"40",X"3E",X"01",X"32",X"04", + X"70",X"32",X"02",X"70",X"32",X"03",X"70",X"32",X"01",X"70",X"C3",X"00",X"20",X"21",X"D8",X"00", + X"E5",X"3D",X"CA",X"3A",X"1C",X"3D",X"CA",X"28",X"1D",X"3D",X"C2",X"00",X"00",X"21",X"00",X"58", + X"3A",X"1E",X"40",X"77",X"C6",X"2F",X"2C",X"C2",X"E3",X"1B",X"3A",X"1E",X"40",X"BE",X"20",X"3C", + X"C6",X"2F",X"2C",X"C2",X"ED",X"1B",X"3A",X"00",X"78",X"CD",X"3C",X"00",X"21",X"08",X"40",X"35", + X"C0",X"AF",X"21",X"00",X"58",X"47",X"D7",X"3E",X"01",X"32",X"06",X"40",X"32",X"1A",X"40",X"32", + X"00",X"60",X"32",X"01",X"60",X"32",X"02",X"60",X"32",X"26",X"42",X"32",X"5F",X"42",X"32",X"38", + X"42",X"3E",X"1F",X"32",X"13",X"52",X"3E",X"1B",X"32",X"F3",X"51",X"C9",X"21",X"00",X"58",X"AF", + X"77",X"2C",X"C2",X"30",X"1C",X"3E",X"03",X"C3",X"04",X"1B",X"CD",X"F5",X"16",X"CD",X"A6",X"16", + X"3A",X"00",X"78",X"3A",X"00",X"60",X"47",X"E6",X"83",X"28",X"05",X"3E",X"01",X"32",X"C9",X"41", + X"3A",X"00",X"68",X"4F",X"E6",X"03",X"28",X"05",X"3E",X"16",X"32",X"DF",X"41",X"78",X"B1",X"E6", + X"0C",X"28",X"05",X"3E",X"06",X"32",X"DF",X"41",X"78",X"B1",X"E6",X"10",X"28",X"05",X"3E",X"01", + X"32",X"CC",X"41",X"3A",X"00",X"68",X"07",X"07",X"E6",X"03",X"CD",X"CF",X"1C",X"3A",X"00",X"70", + X"E6",X"03",X"C6",X"04",X"CD",X"CF",X"1C",X"3A",X"00",X"70",X"0F",X"0F",X"E6",X"01",X"C6",X"08", + X"CD",X"CF",X"1C",X"3A",X"00",X"60",X"E6",X"40",X"C0",X"AF",X"32",X"06",X"40",X"3E",X"02",X"32", + X"1A",X"40",X"21",X"10",X"30",X"22",X"08",X"40",X"21",X"00",X"50",X"22",X"0B",X"40",X"AF",X"21", + X"00",X"60",X"06",X"04",X"D7",X"3E",X"01",X"21",X"04",X"60",X"06",X"04",X"D7",X"AF",X"06",X"08", + X"21",X"00",X"68",X"D7",X"06",X"05",X"21",X"01",X"70",X"D7",X"3D",X"32",X"00",X"78",X"C9",X"47", + X"87",X"87",X"80",X"5F",X"16",X"00",X"21",X"F6",X"1C",X"19",X"06",X"02",X"5E",X"23",X"56",X"23", + X"D5",X"10",X"F9",X"46",X"D9",X"E1",X"D1",X"01",X"E0",X"FF",X"D9",X"D9",X"1A",X"D6",X"30",X"77", + X"13",X"09",X"D9",X"10",X"F6",X"C9",X"12",X"1F",X"D6",X"52",X"10",X"22",X"1F",X"D6",X"52",X"10", + X"32",X"1F",X"D6",X"52",X"10",X"42",X"1F",X"D6",X"52",X"10",X"52",X"1F",X"D8",X"52",X"0B",X"5D", + X"1F",X"D8",X"52",X"0B",X"68",X"1F",X"D8",X"52",X"0B",X"73",X"1F",X"D8",X"52",X"0B",X"7E",X"1F", + X"DA",X"52",X"09",X"87",X"1F",X"DA",X"52",X"09",X"21",X"08",X"40",X"3A",X"00",X"78",X"7E",X"A7", + X"CA",X"51",X"1D",X"D9",X"2A",X"0B",X"40",X"06",X"10",X"36",X"30",X"23",X"36",X"32",X"23",X"10", + X"F8",X"06",X"10",X"36",X"34",X"23",X"36",X"36",X"23",X"10",X"F8",X"22",X"0B",X"40",X"D9",X"35", + X"C0",X"23",X"7E",X"A7",X"28",X"02",X"35",X"C0",X"3A",X"00",X"60",X"E6",X"40",X"C0",X"21",X"00", + X"50",X"22",X"0B",X"40",X"3E",X"20",X"32",X"08",X"40",X"AF",X"32",X"1A",X"40",X"32",X"05",X"40", + X"C9",X"00",X"05",X"00",X"00",X"01",X"01",X"02",X"03",X"03",X"04",X"04",X"04",X"04",X"00",X"00", + X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"05",X"05",X"00",X"00",X"06",X"06",X"06",X"06",X"06", + X"06",X"00",X"05",X"00",X"00",X"01",X"01",X"02",X"03",X"03",X"04",X"04",X"04",X"04",X"00",X"00", + X"00",X"06",X"06",X"06",X"06",X"06",X"06",X"05",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06", + X"06",X"00",X"05",X"00",X"00",X"01",X"01",X"02",X"03",X"05",X"04",X"05",X"04",X"04",X"00",X"00", + X"00",X"00",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"00",X"00",X"07",X"07",X"06", + X"06",X"00",X"00",X"00",X"00",X"04",X"01",X"04",X"02",X"04",X"01",X"03",X"03",X"02",X"02",X"01", + X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"01",X"FF",X"00",X"FF",X"00",X"FF",X"01",X"FF",X"00", + X"FF",X"01",X"FF",X"00",X"00",X"01",X"FF",X"00",X"FF",X"01",X"00",X"01",X"FF",X"00",X"00",X"01", + X"FF",X"01",X"00",X"01",X"FF",X"01",X"00",X"01",X"00",X"01",X"FF",X"01",X"00",X"01",X"00",X"01", + X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"01",X"01",X"00",X"01",X"00",X"01",X"01",X"01", + X"00",X"01",X"01",X"01",X"00",X"01",X"01",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"01", + X"01",X"00",X"01",X"01",X"01",X"00",X"01",X"01",X"01",X"00",X"01",X"00",X"01",X"01",X"01",X"00", + X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"11",X"10",X"0F",X"0E",X"0D",X"0C",X"0B",X"0A", + X"09",X"08",X"07",X"41",X"42",X"41",X"42",X"45",X"42",X"45",X"47",X"45",X"47",X"6A",X"60",X"41", + X"42",X"41",X"42",X"45",X"42",X"45",X"47",X"45",X"47",X"6A",X"60",X"45",X"23",X"24",X"23",X"24", + X"23",X"24",X"23",X"24",X"23",X"24",X"23",X"24",X"23",X"24",X"23",X"24",X"02",X"03",X"05",X"06", + X"07",X"08",X"09",X"0A",X"02",X"03",X"05",X"06",X"07",X"08",X"09",X"0A",X"02",X"03",X"05",X"06", + X"07",X"08",X"09",X"0A",X"02",X"03",X"05",X"06",X"07",X"08",X"09",X"0A",X"E0",X"08",X"07",X"06", + X"05",X"03",X"02",X"08",X"07",X"06",X"05",X"03",X"02",X"02",X"03",X"05",X"06",X"07",X"08",X"09", + X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"0F",X"0E",X"0D",X"0C",X"0B",X"0C",X"0D",X"E0",X"02", + X"17",X"16",X"01",X"16",X"02",X"03",X"05",X"06",X"07",X"18",X"20",X"07",X"06",X"05",X"03",X"02", + X"03",X"06",X"07",X"08",X"09",X"0A",X"19",X"20",X"0A",X"09",X"08",X"07",X"08",X"0A",X"0B",X"0C", + X"0D",X"0E",X"1A",X"20",X"0E",X"0D",X"0C",X"0B",X"0A",X"0B",X"0D",X"0E",X"0F",X"10",X"11",X"1B", + X"3C",X"E0",X"31",X"40",X"43",X"4F",X"49",X"4E",X"40",X"31",X"40",X"43",X"52",X"45",X"44",X"49", + X"54",X"40",X"32",X"40",X"43",X"4F",X"49",X"4E",X"53",X"40",X"31",X"40",X"43",X"52",X"45",X"44", + X"49",X"54",X"31",X"40",X"43",X"4F",X"49",X"4E",X"40",X"32",X"40",X"43",X"52",X"45",X"44",X"49", + X"54",X"53",X"46",X"52",X"45",X"45",X"40",X"50",X"4C",X"41",X"59",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"37",X"30",X"30",X"30",X"42",X"4F",X"4E", + X"55",X"53",X"40",X"31",X"30",X"30",X"30",X"30",X"42",X"4F",X"4E",X"55",X"53",X"40",X"31",X"32", + X"30",X"30",X"30",X"42",X"4F",X"4E",X"55",X"53",X"40",X"32",X"30",X"30",X"30",X"30",X"47",X"41", + X"4C",X"41",X"58",X"49",X"50",X"40",X"32",X"47",X"41",X"4C",X"41",X"58",X"49",X"50",X"40",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"21",X"A2",X"40",X"06",X"1E",X"36",X"00",X"23",X"10",X"FB",X"26",X"40",X"3A",X"A1",X"40",X"6F", + X"7E",X"87",X"30",X"05",X"CD",X"67",X"20",X"18",X"F1",X"E6",X"0F",X"4F",X"06",X"00",X"36",X"FF", + X"2C",X"5E",X"36",X"FF",X"2C",X"7D",X"FE",X"C0",X"30",X"02",X"3E",X"C0",X"32",X"A1",X"40",X"7B", + X"21",X"3D",X"20",X"09",X"5E",X"23",X"56",X"21",X"0A",X"20",X"E5",X"EB",X"E9",X"55",X"20",X"5E", + X"20",X"5F",X"21",X"A6",X"21",X"FE",X"21",X"31",X"22",X"F1",X"22",X"B7",X"24",X"E4",X"7B",X"73", + X"8E",X"10",X"FF",X"FF",X"FF",X"CD",X"E1",X"20",X"CD",X"04",X"21",X"C3",X"31",X"21",X"CD",X"E1", + X"20",X"DA",X"83",X"25",X"C3",X"A7",X"25",X"3A",X"5F",X"42",X"47",X"E6",X"0F",X"28",X"2D",X"21", + X"20",X"41",X"85",X"6F",X"3A",X"38",X"42",X"0F",X"D8",X"0E",X"10",X"06",X"06",X"C5",X"E5",X"7D", + X"CB",X"46",X"20",X"05",X"CD",X"5E",X"20",X"18",X"0B",X"CD",X"E1",X"20",X"0E",X"00",X"CD",X"1D", + X"21",X"CD",X"31",X"21",X"E1",X"C1",X"7D",X"81",X"6F",X"10",X"E2",X"C9",X"3A",X"06",X"40",X"A7", + X"28",X"05",X"32",X"AB",X"40",X"18",X"05",X"3A",X"AB",X"40",X"A7",X"C8",X"3A",X"0D",X"40",X"CD", + X"4E",X"21",X"11",X"E0",X"FF",X"CB",X"60",X"28",X"14",X"3E",X"10",X"77",X"19",X"77",X"19",X"77", + X"3A",X"0E",X"40",X"A7",X"C8",X"3A",X"0D",X"40",X"EE",X"01",X"CD",X"4E",X"21",X"3C",X"77",X"19", + X"36",X"25",X"19",X"36",X"20",X"CB",X"60",X"C0",X"3A",X"06",X"40",X"A7",X"C0",X"32",X"AB",X"40", + X"C9",X"47",X"E6",X"0F",X"0F",X"0F",X"4F",X"E6",X"03",X"67",X"79",X"E6",X"C0",X"6F",X"78",X"0F", + X"0F",X"0F",X"0F",X"E6",X"07",X"4F",X"1F",X"F5",X"89",X"2F",X"E6",X"0F",X"85",X"6F",X"11",X"00", + X"50",X"19",X"F1",X"C9",X"F5",X"78",X"FE",X"70",X"38",X"04",X"06",X"80",X"F1",X"C9",X"E6",X"0F", + X"47",X"3A",X"5F",X"42",X"E6",X"0F",X"0E",X"00",X"B8",X"30",X"01",X"0D",X"F1",X"F5",X"78",X"FE", + X"70",X"30",X"E7",X"3A",X"5F",X"42",X"0F",X"0F",X"0F",X"0F",X"80",X"81",X"E6",X"03",X"47",X"F1", + X"C9",X"EB",X"38",X"09",X"21",X"57",X"21",X"78",X"E7",X"EB",X"C3",X"A9",X"25",X"78",X"A7",X"F2", + X"46",X"21",X"3E",X"A4",X"18",X"04",X"21",X"5B",X"21",X"E7",X"EB",X"C3",X"85",X"25",X"21",X"40", + X"53",X"A7",X"C8",X"21",X"E0",X"50",X"C9",X"41",X"35",X"41",X"31",X"44",X"38",X"44",X"3C",X"A7", + X"28",X"39",X"3D",X"28",X"22",X"3D",X"87",X"87",X"87",X"87",X"2F",X"E6",X"30",X"C6",X"C0",X"21", + X"DA",X"51",X"CD",X"85",X"25",X"21",X"DC",X"51",X"CD",X"85",X"25",X"21",X"1A",X"52",X"CD",X"85", + X"25",X"21",X"1C",X"52",X"C3",X"85",X"25",X"21",X"DA",X"51",X"11",X"1C",X"00",X"0E",X"04",X"06", + X"04",X"36",X"40",X"23",X"10",X"FB",X"19",X"0D",X"20",X"F5",X"C9",X"CD",X"87",X"21",X"3E",X"60", + X"21",X"FC",X"51",X"C3",X"85",X"25",X"4F",X"CF",X"CD",X"90",X"22",X"79",X"81",X"81",X"4F",X"06", + X"00",X"21",X"D0",X"22",X"09",X"A7",X"06",X"03",X"1A",X"8E",X"27",X"12",X"13",X"23",X"10",X"F8", + X"1B",X"D5",X"1B",X"67",X"1A",X"6F",X"29",X"29",X"29",X"29",X"7C",X"21",X"AC",X"40",X"BE",X"D4", + X"9C",X"22",X"13",X"3A",X"0D",X"40",X"CD",X"56",X"22",X"D1",X"21",X"AA",X"40",X"06",X"03",X"1A", + X"BE",X"D8",X"20",X"05",X"1B",X"2B",X"10",X"F7",X"C9",X"CD",X"90",X"22",X"21",X"A8",X"40",X"06", + X"03",X"1A",X"77",X"13",X"23",X"10",X"FA",X"1B",X"DD",X"21",X"41",X"52",X"18",X"63",X"FE",X"03", + X"30",X"26",X"F5",X"21",X"A2",X"40",X"11",X"AD",X"40",X"A7",X"28",X"0E",X"21",X"A5",X"40",X"11", + X"AE",X"40",X"3D",X"28",X"05",X"21",X"A8",X"40",X"5D",X"54",X"36",X"00",X"23",X"36",X"00",X"23", + X"36",X"00",X"EB",X"36",X"00",X"F1",X"18",X"09",X"3D",X"F5",X"CD",X"FE",X"21",X"F1",X"C8",X"18", + X"F7",X"FE",X"03",X"30",X"18",X"A7",X"11",X"A4",X"40",X"28",X"1B",X"3D",X"20",X"0A",X"3A",X"0E", + X"40",X"A7",X"C8",X"11",X"A7",X"40",X"18",X"0E",X"11",X"AA",X"40",X"18",X"AB",X"3D",X"F5",X"CD", + X"31",X"22",X"F1",X"C8",X"18",X"F7",X"DD",X"21",X"81",X"53",X"A7",X"28",X"04",X"DD",X"21",X"21", + X"51",X"21",X"E0",X"FF",X"EB",X"06",X"03",X"0E",X"04",X"7E",X"0F",X"0F",X"0F",X"0F",X"CD",X"79", + X"22",X"7E",X"CD",X"79",X"22",X"2B",X"10",X"F1",X"C9",X"E6",X"0F",X"28",X"04",X"0E",X"00",X"18", + X"07",X"79",X"A7",X"28",X"03",X"3E",X"80",X"0D",X"C6",X"90",X"DD",X"77",X"00",X"DD",X"19",X"C9", + X"11",X"A2",X"40",X"3A",X"0D",X"40",X"A7",X"C8",X"11",X"A5",X"40",X"C9",X"3A",X"0D",X"40",X"21", + X"AD",X"40",X"85",X"6F",X"CB",X"46",X"C0",X"36",X"01",X"3E",X"01",X"32",X"C7",X"41",X"21",X"1D", + X"42",X"34",X"46",X"21",X"9E",X"53",X"0E",X"05",X"3A",X"00",X"42",X"A7",X"28",X"03",X"05",X"28", + X"08",X"3E",X"66",X"CD",X"93",X"25",X"0D",X"10",X"F8",X"0D",X"F8",X"CD",X"91",X"25",X"18",X"F9", + X"30",X"00",X"00",X"40",X"00",X"00",X"50",X"00",X"00",X"60",X"00",X"00",X"60",X"00",X"00",X"80", + X"00",X"00",X"00",X"01",X"00",X"50",X"01",X"00",X"00",X"02",X"00",X"00",X"03",X"00",X"00",X"08", + X"00",X"21",X"5C",X"23",X"87",X"F5",X"E6",X"3F",X"5F",X"16",X"00",X"19",X"5E",X"23",X"56",X"EB", + X"5E",X"23",X"56",X"23",X"EB",X"01",X"E0",X"FF",X"F1",X"38",X"0E",X"FA",X"23",X"23",X"1A",X"D6", + X"30",X"FE",X"0F",X"C8",X"77",X"13",X"09",X"18",X"F5",X"1A",X"FE",X"3F",X"C8",X"36",X"40",X"13", + X"09",X"18",X"F6",X"22",X"B5",X"40",X"EB",X"22",X"B3",X"40",X"7B",X"E6",X"1F",X"47",X"87",X"C6", + X"20",X"6F",X"26",X"40",X"22",X"B1",X"40",X"E5",X"CB",X"3B",X"CB",X"3B",X"7A",X"E6",X"03",X"0F", + X"0F",X"B3",X"E6",X"F8",X"4F",X"21",X"00",X"50",X"78",X"85",X"6F",X"11",X"20",X"00",X"43",X"36", + X"10",X"19",X"10",X"FB",X"E1",X"71",X"3E",X"01",X"32",X"B0",X"40",X"C9",X"7E",X"23",X"8B",X"23", + X"9F",X"23",X"AC",X"23",X"B9",X"23",X"C6",X"23",X"D1",X"23",X"EF",X"23",X"01",X"24",X"1B",X"24", + X"35",X"24",X"4C",X"24",X"61",X"24",X"76",X"24",X"8B",X"24",X"A0",X"24",X"AB",X"24",X"96",X"52", + X"47",X"41",X"4D",X"45",X"40",X"40",X"4F",X"56",X"45",X"52",X"3F",X"F1",X"52",X"50",X"55",X"53", + X"48",X"40",X"53",X"54",X"41",X"52",X"54",X"40",X"42",X"55",X"54",X"54",X"4F",X"4E",X"3F",X"94", + X"52",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"30",X"4E",X"45",X"3F",X"94",X"52",X"50",X"4C", + X"41",X"59",X"45",X"52",X"40",X"54",X"57",X"4F",X"3F",X"80",X"52",X"48",X"49",X"47",X"48",X"40", + X"53",X"43",X"4F",X"52",X"45",X"3F",X"7F",X"53",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"40", + X"3F",X"98",X"53",X"42",X"4F",X"4E",X"55",X"53",X"40",X"47",X"41",X"4C",X"41",X"58",X"49",X"50", + X"40",X"46",X"4F",X"52",X"40",X"40",X"40",X"30",X"30",X"30",X"40",X"D0",X"D1",X"D2",X"3F",X"D1", + X"52",X"43",X"4F",X"4E",X"56",X"4F",X"59",X"40",X"40",X"43",X"48",X"41",X"52",X"47",X"45",X"52", + X"3F",X"4F",X"53",X"5B",X"40",X"53",X"43",X"4F",X"52",X"45",X"40",X"41",X"44",X"56",X"41",X"4E", + X"43",X"45",X"40",X"54",X"41",X"42",X"4C",X"45",X"40",X"5B",X"3F",X"69",X"53",X"4D",X"49",X"53", + X"53",X"49",X"4F",X"4E",X"D3",X"40",X"44",X"45",X"53",X"54",X"52",X"4F",X"59",X"40",X"41",X"4C", + X"49",X"45",X"4E",X"53",X"3F",X"27",X"53",X"57",X"45",X"40",X"41",X"52",X"45",X"40",X"54",X"48", + X"45",X"40",X"47",X"41",X"4C",X"41",X"58",X"49",X"41",X"4E",X"53",X"3F",X"D9",X"52",X"40",X"40", + X"33",X"30",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"36",X"30",X"40",X"40",X"D0",X"D1",X"D2", + X"3F",X"D7",X"52",X"40",X"40",X"34",X"30",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"38",X"30", + X"40",X"40",X"D0",X"D1",X"D2",X"3F",X"D5",X"52",X"40",X"40",X"35",X"30",X"40",X"40",X"40",X"40", + X"40",X"40",X"31",X"30",X"30",X"40",X"40",X"D0",X"D1",X"D2",X"3F",X"D3",X"52",X"40",X"40",X"36", + X"30",X"40",X"40",X"40",X"40",X"40",X"40",X"33",X"30",X"30",X"40",X"40",X"D0",X"D1",X"D2",X"3F", + X"7C",X"52",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"9E",X"9F",X"3F",X"7F",X"53",X"46",X"52",X"45", + X"45",X"40",X"50",X"4C",X"41",X"59",X"3F",X"A7",X"28",X"66",X"3D",X"28",X"2E",X"3D",X"28",X"08", + X"3A",X"1D",X"42",X"47",X"CF",X"C3",X"B3",X"22",X"3A",X"AC",X"40",X"FE",X"FF",X"C8",X"3E",X"06", + X"CD",X"F1",X"22",X"3A",X"AC",X"40",X"E6",X"0F",X"32",X"38",X"51",X"3A",X"AC",X"40",X"E6",X"F0", + X"20",X"01",X"3C",X"0F",X"0F",X"0F",X"0F",X"32",X"58",X"51",X"C9",X"3A",X"06",X"40",X"0F",X"D8", + X"3A",X"11",X"40",X"E6",X"C0",X"FE",X"C0",X"3E",X"10",X"CA",X"F1",X"22",X"3E",X"05",X"CD",X"F1", + X"22",X"3A",X"02",X"40",X"FE",X"63",X"38",X"02",X"3E",X"63",X"CD",X"69",X"25",X"47",X"E6",X"F0", + X"28",X"07",X"0F",X"0F",X"0F",X"0F",X"32",X"9F",X"52",X"78",X"E6",X"0F",X"32",X"7F",X"52",X"C9", + X"CF",X"3A",X"20",X"42",X"A7",X"28",X"05",X"3E",X"01",X"32",X"D0",X"41",X"3A",X"1C",X"42",X"3C", + X"FE",X"30",X"38",X"02",X"3E",X"30",X"CD",X"69",X"25",X"F5",X"21",X"7E",X"50",X"E6",X"F0",X"28", + X"10",X"0F",X"0F",X"0F",X"0F",X"47",X"0E",X"10",X"3E",X"68",X"CD",X"85",X"25",X"0D",X"0D",X"10", + X"F7",X"F1",X"E6",X"0F",X"47",X"11",X"1F",X"00",X"28",X"08",X"3E",X"6C",X"CD",X"A0",X"25",X"0D", + X"10",X"F8",X"0D",X"F8",X"CD",X"9E",X"25",X"18",X"F9",X"47",X"E6",X"0F",X"C6",X"00",X"27",X"4F", + X"78",X"E6",X"F0",X"28",X"0B",X"0F",X"0F",X"0F",X"0F",X"47",X"AF",X"C6",X"16",X"27",X"10",X"FB", + X"81",X"27",X"C9",X"3E",X"2C",X"D5",X"11",X"1F",X"00",X"CD",X"A0",X"25",X"CD",X"A0",X"25",X"D1", + X"C9",X"3E",X"2E",X"D5",X"11",X"DF",X"FF",X"CD",X"A0",X"25",X"C6",X"FC",X"18",X"EE",X"3E",X"2C", + X"77",X"3C",X"23",X"77",X"3C",X"19",X"C9",X"3E",X"2C",X"D5",X"11",X"20",X"00",X"77",X"C6",X"02", + X"19",X"77",X"D1",X"C9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/build_id.tcl b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_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/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/build_id.v b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/build_id.v new file mode 100644 index 00000000..43fddd44 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180103" +`define BUILD_TIME "171607" diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c07d2629 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1093 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..6bd576cf --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..ee217402 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2026 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..679730ab --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80as.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80as.vhd new file mode 100644 index 00000000..fe477f50 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/cpu/T80as.vhd @@ -0,0 +1,283 @@ +------------------------------------------------------------------------------ +-- t80as.vhd : The non-tristate signal edition of t80a.vhd +-- +-- 2003.2.7 non-tristate modification by Tatsuyuki Satoh +-- +-- 1.separate 'D' to 'DO' and 'DI'. +-- 2.added 'DOE' to 'DO' enable signal.(data direction) +-- 3.MREQ_n,IORQ_n,RD_n,WR_n,RFSH_n,A doesn't become the condition of 'Z'. +-- +-- There is a mark of "--AS" in all the change points. +-- +------------------------------------------------------------------------------ + +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80as is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); +--AS-- D : inout std_logic_vector(7 downto 0) +--AS>> + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + DOE : out std_logic +--< 'Z'); +--AS-- D <= DO when Write = '1' and BUSAK_n_i = '1' else (others => 'Z'); +--AS>> + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DOE <= Write when BUSAK_n_i = '1' else '0'; +--< Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, +-- DInst => D, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then +--AS-- DI_Reg <= to_x01(D); +--AS>> + DI_Reg <= to_x01(DI); +--< 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/dac.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/dac.vhd new file mode 100644 index 00000000..b1ecdcb7 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_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 := 11 + ); + 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/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/dpram.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..dafe8385 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/galaxian.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/galaxian.vhd new file mode 100644 index 00000000..16453e8f --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/galaxian.vhd @@ -0,0 +1,446 @@ +------------------------------------------------------------------------------ +-- FPGA GALAXIAN +-- +-- Version downto 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important not +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +-- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--use work.pkg_galaxian.all; + +entity galaxiant is + port( + W_CLK_18M : in std_logic; + W_CLK_12M : in std_logic; + W_CLK_6M : in std_logic; + + P1_CSJUDLR : in std_logic_vector(6 downto 0); + P2_CSJUDLR : in std_logic_vector(6 downto 0); + I_RESET : in std_logic; + + W_R : out std_logic_vector(2 downto 0); + W_G : out std_logic_vector(2 downto 0); + W_B : out std_logic_vector(2 downto 0); + HBLANK : out std_logic; + VBLANK : out std_logic; + W_H_SYNC : out std_logic; + W_V_SYNC : out std_logic; + W_SDAT_A : out std_logic_vector( 7 downto 0); + W_SDAT_B : out std_logic_vector( 7 downto 0); + O_CMPBL : out std_logic + ); +end; + +architecture RTL of galaxiant is + -- CPU ADDRESS BUS + signal W_A : std_logic_vector(15 downto 0) := (others => '0'); + -- CPU IF + signal W_CPU_CLK : std_logic := '0'; + signal W_CPU_MREQn : std_logic := '0'; + signal W_CPU_NMIn : std_logic := '0'; + signal W_CPU_RDn : std_logic := '0'; + signal W_CPU_RFSHn : std_logic := '0'; + signal W_CPU_WAITn : std_logic := '0'; + signal W_CPU_WRn : std_logic := '0'; + signal W_CPU_WR : std_logic := '0'; + signal W_RESETn : std_logic := '0'; + -------- H and V COUNTER ------------------------- + signal W_C_BLn : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_C_BLXn : std_logic := '0'; + signal W_H_BL : std_logic := '0'; + signal W_H_SYNC_int : std_logic := '0'; + signal W_V_BLn : std_logic := '0'; + signal W_V_BL2n : std_logic := '0'; + signal W_V_SYNC_int : std_logic := '0'; + signal W_H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal W_V_CNT : std_logic_vector(7 downto 0) := (others => '0'); + -------- CPU RAM ---------------------------- + signal W_CPU_RAM_DO : std_logic_vector(7 downto 0) := (others => '0'); + -------- ADDRESS DECDER ---------------------- + signal W_BD_G : std_logic := '0'; + signal W_CPU_RAM_CS : std_logic := '0'; + signal W_CPU_RAM_RD : std_logic := '0'; +-- signal W_CPU_RAM_WR : std_logic := '0'; + signal W_CPU_ROM_CS : std_logic := '0'; + signal W_DIP_OE : std_logic := '0'; + signal W_H_FLIP : std_logic := '0'; + signal W_DRIVER_WE : std_logic := '0'; + signal W_OBJ_RAM_RD : std_logic := '0'; + signal W_OBJ_RAM_RQ : std_logic := '0'; + signal W_OBJ_RAM_WR : std_logic := '0'; + signal W_PITCH : std_logic := '0'; + signal W_SOUND_WE : std_logic := '0'; + signal W_STARS_ON : std_logic := '0'; + signal W_STARS_OFFn : std_logic := '0'; + signal W_SW0_OE : std_logic := '0'; + signal W_SW1_OE : std_logic := '0'; + signal W_V_FLIP : std_logic := '0'; + signal W_VID_RAM_RD : std_logic := '0'; + signal W_VID_RAM_WR : std_logic := '0'; + signal W_WDR_OE : std_logic := '0'; + --------- INPORT ----------------------------- + signal W_SW_DO : std_logic_vector( 7 downto 0) := (others => '0'); + --------- VIDEO ----------------------------- + signal W_VID_DO : std_logic_vector( 7 downto 0) := (others => '0'); + ----- DATA I/F ------------------------------------- + signal W_CPU_ROM_DO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_ROM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_RAM_CLK : std_logic := '0'; + signal W_VOL1 : std_logic := '0'; + signal W_VOL2 : std_logic := '0'; + signal W_FIRE : std_logic := '0'; + signal W_HIT : std_logic := '0'; + signal W_FS : std_logic_vector( 2 downto 0) := (others => '0'); + + signal blx_comb : std_logic := '0'; + signal W_1VF : std_logic := '0'; + signal W_256HnX : std_logic := '0'; + signal W_8HF : std_logic := '0'; + signal W_DAC_A : std_logic := '0'; + signal W_DAC_B : std_logic := '0'; + signal W_MISSILEn : std_logic := '0'; + signal W_SHELLn : std_logic := '0'; + signal W_MS_D : std_logic := '0'; + signal W_MS_R : std_logic := '0'; + signal W_MS_G : std_logic := '0'; + signal W_MS_B : std_logic := '0'; + + signal new_sw : std_logic_vector( 2 downto 0) := (others => '0'); + signal in_game : std_logic_vector( 1 downto 0) := (others => '0'); + signal ROM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal rst_count : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_STARS_B : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_G : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_R : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VIDEO_B : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_G : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_R : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_WAV_A0 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A1 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A2 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D2 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_DAC : std_logic_vector( 3 downto 0) := (others => '0'); + +begin + mc_vid : entity work.MC_VIDEO + port map( + I_CLK_18M => W_CLK_18M, + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT => W_H_CNT, + I_V_CNT => W_V_CNT, + I_H_FLIP => W_H_FLIP, + I_V_FLIP => W_V_FLIP, + I_V_BLn => W_V_BLn, + I_C_BLn => W_C_BLn, + I_A => W_A(9 downto 0), + I_OBJ_SUB_A => "000", + I_BD => W_BDI, + I_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + I_OBJ_RAM_RD => W_OBJ_RAM_RD, + I_OBJ_RAM_WR => W_OBJ_RAM_WR, + I_VID_RAM_RD => W_VID_RAM_RD, + I_VID_RAM_WR => W_VID_RAM_WR, + I_DRIVER_WR => W_DRIVER_WE, + O_C_BLnX => W_C_BLnX, + O_8HF => W_8HF, + O_256HnX => W_256HnX, + O_1VF => W_1VF, + O_MISSILEn => W_MISSILEn, + O_SHELLn => W_SHELLn, + O_BD => W_VID_DO, + O_VID => W_VID, + O_COL => W_COL + ); + + cpu : entity work.T80as + port map ( + RESET_n => W_RESETn, + CLK_n => W_CPU_CLK, + WAIT_n => W_CPU_WAITn, + INT_n => '1', + NMI_n => W_CPU_NMIn, + BUSRQ_n => '1', + MREQ_n => W_CPU_MREQn, + RD_n => W_CPU_RDn, + WR_n => W_CPU_WRn, + RFSH_n => W_CPU_RFSHn, + A => W_A, + DI => W_BDO, + DO => W_BDI, + M1_n => open, + IORQ_n => open, + HALT_n => open, + BUSAK_n => open, + DOE => open + ); + + mc_cpu_ram : entity work.MC_CPU_RAM + port map ( + I_CLK => W_CPU_RAM_CLK, + I_ADDR => W_A(9 downto 0), + I_D => W_BDI, + I_WE => W_CPU_WR, + I_OE => W_CPU_RAM_RD, + O_D => W_CPU_RAM_DO + ); + + mc_adec : entity work.MC_ADEC + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_CPU_CLK => W_CPU_CLK, + I_RSTn => W_RESETn, + + I_CPU_A => W_A, + I_CPU_D => W_BDI(0), + I_MREQn => W_CPU_MREQn, + I_RFSHn => W_CPU_RFSHn, + I_RDn => W_CPU_RDn, + I_WRn => W_CPU_WRn, + I_H_BL => W_H_BL, + I_V_BLn => W_V_BLn, + + O_WAITn => W_CPU_WAITn, + O_NMIn => W_CPU_NMIn, + O_CPU_ROM_CS => W_CPU_ROM_CS, + O_CPU_RAM_RD => W_CPU_RAM_RD, +-- O_CPU_RAM_WR => W_CPU_RAM_WR, + O_CPU_RAM_CS => W_CPU_RAM_CS, + O_OBJ_RAM_RD => W_OBJ_RAM_RD, + O_OBJ_RAM_WR => W_OBJ_RAM_WR, + O_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + O_VID_RAM_RD => W_VID_RAM_RD, + O_VID_RAM_WR => W_VID_RAM_WR, + O_SW0_OE => W_SW0_OE, + O_SW1_OE => W_SW1_OE, + O_DIP_OE => W_DIP_OE, + O_WDR_OE => W_WDR_OE, + O_DRIVER_WE => W_DRIVER_WE, + O_SOUND_WE => W_SOUND_WE, + O_PITCH => W_PITCH, + O_H_FLIP => W_H_FLIP, + O_V_FLIP => W_V_FLIP, + O_BD_G => W_BD_G, + O_STARS_ON => W_STARS_ON + ); + + -- active high buttons + mc_inport : entity work.MC_INPORT + port map ( + I_COIN1 => P1_CSJUDLR(6), + I_COIN2 => P2_CSJUDLR(6), + I_1P_START => P1_CSJUDLR(5), + I_2P_START => P2_CSJUDLR(5), + I_1P_SH => P1_CSJUDLR(4), + I_2P_SH => P2_CSJUDLR(4), + I_1P_LE => P1_CSJUDLR(1), + I_2P_LE => P2_CSJUDLR(1), + I_1P_RI => P1_CSJUDLR(0), + I_2P_RI => P2_CSJUDLR(0), + I_SW0_OE => W_SW0_OE, + I_SW1_OE => W_SW1_OE, + I_DIP_OE => W_DIP_OE, + O_D => W_SW_DO + ); + + mc_hv : entity work.MC_HV_COUNT + port map( + I_CLK => W_CLK_6M, + I_RSTn => W_RESETn, + O_H_CNT => W_H_CNT, + O_H_SYNC => W_H_SYNC_int, + O_H_BL => W_H_BL, + O_V_CNT => W_V_CNT, + O_V_SYNC => W_V_SYNC_int, + O_V_BL2n => W_V_BL2n, + O_V_BLn => W_V_BLn, + O_C_BLn => W_C_BLn + ); + + mc_col_pal : entity work.MC_COL_PAL + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_VID => W_VID, + I_COL => W_COL, + I_C_BLnX => W_C_BLnX, + O_C_BLXn => W_C_BLXn, + O_STARS_OFFn => W_STARS_OFFn, + O_R => W_VIDEO_R, + O_G => W_VIDEO_G, + O_B => W_VIDEO_B + ); + + mc_stars : entity work.MC_STARS + port map ( + I_CLK_18M => W_CLK_18M, + I_CLK_6M => W_CLK_6M, + I_H_FLIP => W_H_FLIP, + I_V_SYNC => W_V_SYNC_int, + I_8HF => W_8HF, + I_256HnX => W_256HnX, + I_1VF => W_1VF, + I_2V => W_V_CNT(1), + I_STARS_ON => W_STARS_ON, + I_STARS_OFFn => W_STARS_OFFn, + O_R => W_STARS_R, + O_G => W_STARS_G, + O_B => W_STARS_B, + O_NOISE => open + ); + + mc_sound_a : entity work.MC_SOUND_A + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT1 => W_H_CNT(1), + I_BD => W_BDI, + I_PITCH => W_PITCH, + I_VOL1 => W_VOL1, + I_VOL2 => W_VOL2, + O_SDAT => W_SDAT_A, + O_DO => open + ); + + vmc_sound_b : entity work.MC_SOUND_B + port map( + I_CLK1 => W_CLK_6M, + I_RSTn => rst_count(3), + I_SW => new_sw, + I_DAC => W_DAC, + I_FS => W_FS, + O_SDAT => W_SDAT_B + ); + +--------- ROM ------------------------------------------------------- + mc_roms : entity work.ROM_PGM_0 + port map ( + CLK => W_CLK_12M, + ADDR => W_A(13 downto 0), + DATA => W_CPU_ROM_DO + ); + +-------- VIDEO ----------------------------- + blx_comb <= not ( W_C_BLXn and W_V_BL2n ); + W_V_SYNC <= not W_V_SYNC_int; + W_H_SYNC <= not W_H_SYNC_int; + O_CMPBL <= W_C_BLnX; + + -- MISSILE => Yellow ; + -- SHELL => White ; + W_MS_D <= not (W_MISSILEn and W_SHELLn); + W_MS_R <= not blx_comb and W_MS_D; + W_MS_G <= not blx_comb and W_MS_D; + W_MS_B <= not blx_comb and W_MS_D and not W_SHELLn ; + + W_R <= W_VIDEO_R or (W_STARS_R & "0") or (W_MS_R & W_MS_R & "0"); + W_G <= W_VIDEO_G or (W_STARS_G & "0") or (W_MS_G & W_MS_G & "0"); + W_B <= W_VIDEO_B or (W_STARS_B & "0") or (W_MS_B & W_MS_B & "0"); + + process(W_CLK_6M) + begin + if rising_edge(W_CLK_6M) then + HBLANK <= not W_C_BLXn; + VBLANK <= not W_V_BL2n; + end if; + end process; + + +----- CPU I/F ------------------------------------- + + W_CPU_CLK <= W_H_CNT(0); + W_CPU_RAM_CLK <= W_CLK_12M and W_CPU_RAM_CS; + + W_CPU_ROM_DOB <= W_CPU_ROM_DO when W_CPU_ROM_CS = '1' else (others=>'0'); + + W_RESETn <= not I_RESET; + W_BDO <= W_SW_DO or W_VID_DO or W_CPU_RAM_DO or W_CPU_ROM_DOB ; + W_CPU_WR <= not W_CPU_WRn; + + new_sw <= (W_FS(2) or W_FS(1) or W_FS(0)) & W_HIT & W_FIRE; + + process(W_CPU_CLK, I_RESET) + begin + if (I_RESET = '1') then + rst_count <= (others => '0'); + elsif rising_edge( W_CPU_CLK) then + if ( rst_count /= x"f") then + rst_count <= rst_count + 1; + end if; + end if; + end process; + +----- Parts 9L --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_FS <= (others=>'0'); + W_HIT <= '0'; + W_FIRE <= '0'; + W_VOL1 <= '0'; + W_VOL2 <= '0'; + elsif rising_edge(W_CLK_12M) then + if (W_SOUND_WE = '1') then + case(W_A(2 downto 0)) is + when "000" => W_FS(0) <= W_BDI(0); + when "001" => W_FS(1) <= W_BDI(0); + when "010" => W_FS(2) <= W_BDI(0); + when "011" => W_HIT <= W_BDI(0); +-- when "100" => UNUSED <= W_BDI(0); + when "101" => W_FIRE <= W_BDI(0); + when "110" => W_VOL1 <= W_BDI(0); + when "111" => W_VOL2 <= W_BDI(0); + when others => null; + end case; + end if; + end if; + end process; + +----- Parts 9M --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_DAC <= (others=>'0'); + elsif rising_edge(W_CLK_12M) then + if (W_DRIVER_WE = '1') then + case(W_A(2 downto 0)) is + -- next 4 outputs go off board via ULN2075 buffer +-- when "000" => 1P START <= W_BDI(0); +-- when "001" => 2P START <= W_BDI(0); +-- when "010" => COIN LOCK <= W_BDI(0); +-- when "011" => COIN CTR <= W_BDI(0); + when "100" => W_DAC(0) <= W_BDI(0); -- 1M + when "101" => W_DAC(1) <= W_BDI(0); -- 470K + when "110" => W_DAC(2) <= W_BDI(0); -- 220K + when "111" => W_DAC(3) <= W_BDI(0); -- 100K + when others => null; + end case; + end if; + end if; + end process; + +------------------------------------------------------------------------------- +end RTL; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/hq2x.sv b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_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/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/keyboard.v b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_adec.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_adec.vhd new file mode 100644 index 00000000..7245ce8c --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_adec.vhd @@ -0,0 +1,251 @@ +--------------------------------------------------------------------- +-- FPGA GALAXIAN ADDRESS DECDER +-- +-- Version : 2.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +--------------------------------------------------------------------- +-- +--GALAXIAN Address Map +-- +-- Address Item(R..read-mode W..wight-mode) Parts +--0000 - 1FFF CPU-ROM..R ( 7H or 7K ) +--2000 - 3FFF CPU-ROM..R ( 7L ) +--4000 - 47FF CPU-RAM..RW ( 7N & 7P ) +--5000 - 57FF VID-RAM..RW +--5800 - 5FFF OBJ-RAM..RW +--6000 - SW0..R LAMP......W +--6800 - SW1..R SOUND.....W +--7000 - DIP..R +--7001 NMI_ON....W +--7004 STARS_ON..W +--7006 H_FLIP....W +--7007 V-FLIP....W +--7800 WDR..R PITCH.....W +-- +--W MODE +--6000 1P START +--6001 2P START +--6002 COIN LOCKOUT +--6003 COIN COUNTER +--6004 - 6007 SOUND CONTROL(OSC) +-- +--6800 SOUND CONTROL(FS1) +--6801 SOUND CONTROL(FS2) +--6802 SOUND CONTROL(FS3) +--6803 SOUND CONTROL(HIT) +--6805 SOUND CONTROL(SHOT) +--6806 SOUND CONTROL(VOL1) +--6807 SOUND CONTROL(VOL2) +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_ADEC is + port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_CPU_CLK : in std_logic; + I_RSTn : in std_logic; + + I_CPU_A : in std_logic_vector(15 downto 0); + I_CPU_D : in std_logic; + I_MREQn : in std_logic; + I_RFSHn : in std_logic; + I_RDn : in std_logic; + I_WRn : in std_logic; + I_H_BL : in std_logic; + I_V_BLn : in std_logic; + + O_WAITn : out std_logic; + O_NMIn : out std_logic; + O_CPU_ROM_CS : out std_logic; + O_CPU_RAM_RD : out std_logic; + O_CPU_RAM_WR : out std_logic; + O_CPU_RAM_CS : out std_logic; + O_OBJ_RAM_RD : out std_logic; + O_OBJ_RAM_WR : out std_logic; + O_OBJ_RAM_RQ : out std_logic; + O_VID_RAM_RD : out std_logic; + O_VID_RAM_WR : out std_logic; + O_SW0_OE : out std_logic; + O_SW1_OE : out std_logic; + O_DIP_OE : out std_logic; + O_WDR_OE : out std_logic; + O_DRIVER_WE : out std_logic; + O_SOUND_WE : out std_logic; + O_PITCH : out std_logic; + O_H_FLIP : out std_logic; + O_V_FLIP : out std_logic; + O_BD_G : out std_logic; + O_STARS_ON : out std_logic + ); +end; + +architecture RTL of MC_ADEC is + signal W_8E1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8E2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8P_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8M_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_9N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_NMI_ONn : std_logic := '0'; + -------- CPU WAITn ---------------------------------------------- +-- signal W_6S1_Q : std_logic := '0'; + signal W_6S1_Qn : std_logic := '0'; +-- signal W_6S2_Qn : std_logic := '0'; + + signal W_V_BL : std_logic := '0'; + +begin + W_NMI_ONn <= W_9N_Q(1); -- galaxian + +-- O_WAITn <= '1' ; -- No Wait + O_WAITn <= W_6S1_Qn; + + process(I_CPU_CLK, I_V_BLn) + begin + if (I_V_BLn = '0') then +-- W_6S1_Q <= '0'; + W_6S1_Qn <= '1'; + elsif rising_edge(I_CPU_CLK) then +-- W_6S1_Q <= not (I_H_BL or W_8P_Q(2)); + W_6S1_Qn <= I_H_BL or W_8P_Q(2); + end if; + end process; + +-- process(I_CPU_CLK) +-- begin +-- if falling_edge(I_CPU_CLK) then +-- W_6S2_Qn <= not W_6S1_Q; +-- end if; +-- end process; + +-------- CPU NMIn ----------------------------------------------- + W_V_BL <= not I_V_BLn; + process(W_V_BL, W_NMI_ONn) + begin + if (W_NMI_ONn = '0') then + O_NMIn <= '1'; + elsif rising_edge(W_V_BL) then + O_NMIn <= '0'; + end if; + end process; + + ------------------------------------------------------------------- + u_8e1 : entity work.LOGIC_74XX139 + port map ( + I_G => I_MREQn, + I_Sel(1) => I_CPU_A(15), + I_Sel(0) => I_CPU_A(14), + O_Q => W_8E1_Q + ); + + ---------- CPU_ROM CS 0000 - 3FFF --------------------------- + u_8e2 : entity work.LOGIC_74XX139 + port map ( + I_G => I_RDn, + I_Sel(1) => W_8E1_Q(0), + I_Sel(0) => I_CPU_A(13), + O_Q => W_8E2_Q + ); + + O_CPU_ROM_CS <= not (W_8E2_Q(0) and W_8E2_Q(1) ) ; -- 0000 - 3FFF + ------------------------------------------------------------------- + -- ADDRESS + -- W_8E1_Q[0] = 0000 - 3FFF ---- CPU_ROM_USE + -- W_8E1_Q[1] = 4000 - 7FFF ---- GALAXIAN USE *1 + -- W_8E1_Q[2] = 8000 - BFFF ---- MOONCREST USE + -- W_8E1_Q[3] = C000 - FFFF + + u_8p : entity work.LOGIC_74XX138 + port map ( + I_G1 => I_RFSHn, + I_G2a => W_8E1_Q(1), -- <= *1 + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8P_Q + ); + + u_8n : entity work.LOGIC_74XX138 + port map ( + I_G1 => '1', + I_G2a => I_RDn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8N_Q + ); + + u_8m : entity work.LOGIC_74XX138 + port map ( + -- I_G1 => W_6S2_Qn, + I_G1 => '1', -- No Wait + I_G2a => I_WRn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8M_Q + ); + + O_BD_G <= not (W_8E1_Q(0) and W_8P_Q(0)); + O_OBJ_RAM_RQ <= not W_8P_Q(3); + + O_CPU_RAM_CS <= not (W_8N_Q(0) and W_8M_Q(0)); + + O_WDR_OE <= not W_8N_Q(7); + O_DIP_OE <= not W_8N_Q(6); + O_SW1_OE <= not W_8N_Q(5); + O_SW0_OE <= not W_8N_Q(4); + O_OBJ_RAM_RD <= not W_8N_Q(3); + O_VID_RAM_RD <= not W_8N_Q(2); +-- UNUSED <= not W_8N_Q(1); + O_CPU_RAM_RD <= not W_8N_Q(0); + + O_PITCH <= not W_8M_Q(7); +-- STARS_ON_ENA <= not W_8M_Q(6); + O_SOUND_WE <= not W_8M_Q(5); + O_DRIVER_WE <= not W_8M_Q(4); + O_OBJ_RAM_WR <= not W_8M_Q(3); + O_VID_RAM_WR <= not W_8M_Q(2); +-- UNUSED <= not W_8M_Q(1); + O_CPU_RAM_WR <= not W_8M_Q(0); + + ----- Parts 9N --------- + + process(I_CLK_12M, I_RSTn) + begin + if (I_RSTn = '0') then + W_9N_Q <= (others => '0'); + elsif rising_edge(I_CLK_12M) then + if (W_8M_Q(6) = '0') then + case I_CPU_A(2 downto 0) is + when "000" => W_9N_Q(0) <= I_CPU_D; + when "001" => W_9N_Q(1) <= I_CPU_D; + when "010" => W_9N_Q(2) <= I_CPU_D; + when "011" => W_9N_Q(3) <= I_CPU_D; + when "100" => W_9N_Q(4) <= I_CPU_D; + when "101" => W_9N_Q(5) <= I_CPU_D; + when "110" => W_9N_Q(6) <= I_CPU_D; + when "111" => W_9N_Q(7) <= I_CPU_D; + when others => null; + end case; + end if; + end if; + end process; + + O_STARS_ON <= W_9N_Q(4); + O_H_FLIP <= W_9N_Q(6); + O_V_FLIP <= W_9N_Q(7); + +end RTL; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_bram.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_bram.vhd new file mode 100644 index 00000000..a6df1ce1 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_bram.vhd @@ -0,0 +1,182 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA & GALAXIAN +-- FPGA BLOCK RAM I/F (XILINX SPARTAN) +-- +-- Version : 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- mc_col_rom(6L) added by k.Degawa +-- +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. K.Degawa +-- 2004- 9-18 added Xilinx Device K.Degawa +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_top.v use +entity MC_CPU_RAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(9 downto 0); + I_D : in std_logic_vector(7 downto 0); + I_WE : in std_logic; + I_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) + ); +end; +architecture RTL of MC_CPU_RAM is + + signal W_D : std_logic_vector(7 downto 0) := (others => '0'); +begin + O_D <= W_D when I_OE ='1' else (others=>'0'); + + ram_inst : work.spram generic map(10,8) + port map + ( + address => I_ADDR, + clock => I_CLK, + data => I_D, + wren => I_WE, + q => W_D + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_OBJ_RAM is + port( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(7 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(7 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); + end; + +architecture RTL of MC_OBJ_RAM is +begin + + ram_inst : work.dpram generic map(8,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_VID_RAM is + port ( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(9 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(9 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of MC_VID_RAM is +begin + ram_inst : work.dpram generic map(10,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_LRAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(7 downto 0); + I_D : in std_logic_vector(4 downto 0); + I_WE : in std_logic; + O_Dn : out std_logic_vector(4 downto 0) + ); +end; + +architecture RTL of MC_LRAM is + signal W_D : std_logic_vector(4 downto 0) := (others => '0'); +begin + + O_Dn <= not W_D; + + ram_inst : work.dpram generic map(8,5) + port map + ( + clock_a => I_CLK, + address_a => I_ADDR, + data_a => I_D, + wren_a => not I_WE, + + clock_b => not I_CLK, + address_b => I_ADDR, + data_b => (others => '0'), + q_b => W_D, + enable_b => '1', + wren_b => '0' + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_clocks.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_clocks.vhd new file mode 100644 index 00000000..5a4d0094 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_clocks.vhd @@ -0,0 +1,85 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA CLOCK GEN +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +----------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity CLOCKGEN is +port ( + CLKIN_IN : in std_logic; + RST_IN : in std_logic; + -- + O_CLK_24M : out std_logic; + O_CLK_18M : out std_logic; + O_CLK_12M : out std_logic; + O_CLK_06M : out std_logic +); +end; + +architecture RTL of CLOCKGEN is + signal state : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr1 : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr2 : std_logic_vector(2 downto 0) := (others => '0'); + signal CLKFB_IN : std_logic := '0'; + signal CLK0_BUF : std_logic := '0'; + signal CLKFX_BUF : std_logic := '0'; + signal CLK_72M : std_logic := '0'; + signal I_DCM_LOCKED : std_logic := '0'; + +begin + dcm_inst : DCM_SP + generic map ( + CLKFX_MULTIPLY => 9, + CLKFX_DIVIDE => 4, + CLKIN_PERIOD => 31.25 + ) + port map ( + CLKIN => CLKIN_IN, + CLKFB => CLKFB_IN, + RST => RST_IN, + CLK0 => CLK0_BUF, + CLKFX => CLKFX_BUF, + LOCKED => I_DCM_LOCKED + ); + + BUFG0 : BUFG port map (I=> CLK0_BUF, O => CLKFB_IN); + BUFG1 : BUFG port map (I=> CLKFX_BUF, O => CLK_72M); + O_CLK_06M <= ctr2(2); + O_CLK_12M <= ctr2(1); + O_CLK_24M <= ctr2(0); + O_CLK_18M <= ctr1(1); + + -- generate all clocks, 36Mhz, 18Mhz, 24Mhz, 12Mhz and 6Mhz + process(CLK_72M) + begin + if rising_edge(CLK_72M) then + if (I_DCM_LOCKED = '0') then + state <= "00"; + ctr1 <= (others=>'0'); + ctr2 <= (others=>'0'); + else + ctr1 <= ctr1 + 1; + case state is + when "00" => state <= "01"; ctr2 <= ctr2 + 1; + when "01" => state <= "10"; ctr2 <= ctr2 + 1; + when "10" => state <= "00"; + when "11" => state <= "00"; + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_col_pal.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_col_pal.vhd new file mode 100644 index 00000000..c4dc06ad --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_col_pal.vhd @@ -0,0 +1,78 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA COLOR-PALETTE +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-18 added Xilinx Device. K.Degawa +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; +-- use ieee.numeric_std.all; + +--library UNISIM; +-- use UNISIM.Vcomponents.all; + +entity MC_COL_PAL is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_VID : in std_logic_vector(1 downto 0); + I_COL : in std_logic_vector(2 downto 0); + I_C_BLnX : in std_logic; + + O_C_BLXn : out std_logic; + O_STARS_OFFn : out std_logic; + O_R : out std_logic_vector(2 downto 0); + O_G : out std_logic_vector(2 downto 0); + O_B : out std_logic_vector(2 downto 0) +); +end; + +architecture RTL of MC_COL_PAL is + --- Parts 6M -------------------------------------------------------- + signal W_COL_ROM_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6M_DI : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_DO : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_CLR : std_logic := '0'; + +begin + W_6M_DI <= I_COL(2 downto 0) & I_VID(1 downto 0) & not (I_VID(0) or I_VID(1)) & I_C_BLnX; + W_6M_CLR <= W_6M_DI(0) or W_6M_DO(0); + O_C_BLXn <= W_6M_DI(0) or W_6M_DO(0); + O_STARS_OFFn <= W_6M_DO(1); + +--always@(posedge I_CLK_6M or negedge W_6M_CLR) + process(I_CLK_6M, W_6M_CLR) + begin + if (W_6M_CLR = '0') then + W_6M_DO <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + W_6M_DO <= W_6M_DI; + end if; + end process; + + --- COL ROM -------------------------------------------------------- +--wire W_COL_ROM_OEn = W_6M_DO[1]; + + galaxian_6l : entity work.GALAXIAN_6L + port map ( + CLK => I_CLK_12M, + ADDR => W_6M_DO(6 downto 2), + DATA => W_COL_ROM_DO + ); + + --- VID OUT -------------------------------------------------------- + O_R <= W_COL_ROM_DO(2 downto 0); + O_G <= W_COL_ROM_DO(5 downto 3); + O_B <= W_COL_ROM_DO(7 downto 6) & "0"; + +end; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_hv_count.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_hv_count.vhd new file mode 100644 index 00000000..f310321b --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_hv_count.vhd @@ -0,0 +1,145 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA H & V COUNTER +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 +----------------------------------------------------------------------- +-- MoonCrest hv_count +-- H_CNT 0 - 255 , 384 - 511 Total 384 count +-- V_CNT 0 - 255 , 504 - 511 Total 264 count +------------------------------------------------------------------------------------------- +-- H_CNT[0], H_CNT[1], H_CNT[2], H_CNT[3], H_CNT[4], H_CNT[5], H_CNT[6], H_CNT[7], H_CNT[8], +-- 1 H 2 H 4 H 8 H 16 H 32 H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT[0], V_CNT[1], V_CNT[2], V_CNT[3], V_CNT[4], V_CNT[5], V_CNT[6], V_CNT[7] +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_HV_COUNT is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + O_H_CNT : out std_logic_vector(8 downto 0); + O_H_SYNC : out std_logic; + O_H_BL : out std_logic; + O_V_BL2n : out std_logic; + O_V_CNT : out std_logic_vector(7 downto 0); + O_V_SYNC : out std_logic; + O_V_BLn : out std_logic; + O_C_BLn : out std_logic + ); +end; + +architecture RTL of MC_HV_COUNT is + signal H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal V_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal H_SYNC : std_logic := '0'; + signal H_CLK : std_logic := '0'; + signal H_BL : std_logic := '0'; + signal V_BLn : std_logic := '0'; + signal V_BL2n : std_logic := '0'; + +begin +--------- H_COUNT ---------------------------------------- + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if (H_CNT = 255) then + H_CNT <= std_logic_vector(to_unsigned(384, H_CNT'length)); + else + H_CNT <= H_CNT + 1 ; + end if; + end if; + end process; + + O_H_CNT <= H_CNT; + +--------- H_SYNC ---------------------------------------- + H_CLK <= H_CNT(4); + process(H_CLK, H_CNT(8)) + begin + if (H_CNT(8) = '0') then + H_SYNC <= '0'; + elsif rising_edge(H_CLK) then + H_SYNC <= (not H_CNT(6) ) and H_CNT(5); + end if; + end process; + + O_H_SYNC <= H_SYNC; + +--------- H_BL ------------------------------------------ + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if H_CNT = 387 then + H_BL <= '1'; + elsif H_CNT = 503 then + H_BL <= '0'; + end if; + end if; + end process; + + O_H_BL <= H_BL; + +--------- V_COUNT ---------------------------------------- + process(H_SYNC, I_RSTn) + begin + if (I_RSTn = '0') then + V_CNT <= (others => '0'); + elsif rising_edge(H_SYNC) then + if (V_CNT = 255) then + V_CNT <= std_logic_vector(to_unsigned(504, V_CNT'length)); + else + V_CNT <= V_CNT + 1 ; + end if; + end if; + end process; + + O_V_CNT <= V_CNT(7 downto 0); + O_V_SYNC <= V_CNT(8); + +--------- V_BLn ------------------------------------------ + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BLn <= '0'; + elsif V_CNT(7 downto 0) = 15 then + V_BLn <= '1'; + end if; + end if; + end process; + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BL2n <= '0'; + elsif V_CNT(7 downto 0) = 16 then + V_BL2n <= '1'; + end if; + end if; + end process; + + O_V_BLn <= V_BLn; + O_V_BL2n <= V_BL2n; +------- C_BLn ------------------------------------------ + O_C_BLn <= V_BLn and (not H_CNT(8)); + +end; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_inport.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_inport.vhd new file mode 100644 index 00000000..69a20cbe --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_inport.vhd @@ -0,0 +1,74 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA INPORT +-- +-- Version : 1.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004-4-30 galaxian modify by K.DEGAWA +----------------------------------------------------------------------- + +-- DIP SW 0 1 2 3 4 5 +----------------------------------------------------------------- +-- COIN CHUTE +-- 1 COIN/1 PLAY 1'b0 1'b0 +-- 2 COIN/1 PLAY 1'b1 1'b0 +-- 1 COIN/2 PLAY 1'b0 1'b1 +-- FREE PLAY 1'b1 1'b1 +-- BOUNS +-- 1'b0 1'b0 +-- 1'b1 1'b0 +-- 1'b0 1'b1 +-- 1'b1 1'b1 +-- LIVES +-- 2 1'b0 +-- 3 1'b1 +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_INPORT is +port ( + I_COIN1 : in std_logic; -- active high + I_COIN2 : in std_logic; -- active high + I_1P_LE : in std_logic; -- active high + I_1P_RI : in std_logic; -- active high + I_1P_SH : in std_logic; -- active high + I_2P_LE : in std_logic; + I_2P_RI : in std_logic; + I_2P_SH : in std_logic; + I_1P_START : in std_logic; -- active high + I_2P_START : in std_logic; -- active high + I_SW0_OE : in std_logic; + I_SW1_OE : in std_logic; + I_DIP_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) +); + +end; + +architecture RTL of MC_INPORT is + + constant W_TABLE : std_logic := '0'; -- UP = 0; + constant W_TEST : std_logic := '0'; + constant W_SERVICE : std_logic := '0'; + + signal W_SW0_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SW1_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_DIP_DO : std_logic_vector(7 downto 0) := (others => '0'); + +begin + + W_SW0_DO <= x"00" when I_SW0_OE = '0' else W_SERVICE & W_TEST & W_TABLE & I_1P_SH & I_1P_RI & I_1P_LE & I_COIN2 & I_COIN1; + W_SW1_DO <= x"00" when I_SW1_OE = '0' else "000" & I_2P_SH & I_2P_RI & I_2P_LE & I_2P_START & I_1P_START; + W_DIP_DO <= x"00" when I_DIP_OE = '0' else "00000100"; + O_D <= W_SW0_DO or W_SW1_DO or W_DIP_DO ; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_ld_pls.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_ld_pls.vhd new file mode 100644 index 00000000..0945fe35 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_ld_pls.vhd @@ -0,0 +1,115 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA VIDEO-LD_PLS_GEN +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_LD_PLS is + port ( + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_3D_DI : in std_logic; + + O_LDn : out std_logic; + O_CNTRLDn : out std_logic; + O_CNTRCLRn : out std_logic; + O_COLLn : out std_logic; + O_VPLn : out std_logic; + O_OBJDATALn : out std_logic; + O_MLDn : out std_logic; + O_SLDn : out std_logic + ); +end; + +architecture RTL of MC_LD_PLS is + signal W_4C1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C1_Q3 : std_logic := '0'; + signal W_4C2_B : std_logic := '0'; + signal W_4D1_G : std_logic := '0'; + signal W_4D1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4D2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_5C_Q : std_logic := '0'; + signal W_HCNT : std_logic := '0'; +begin + O_LDn <= W_4D1_G; + O_CNTRLDn <= W_4D1_Q(2); + O_CNTRCLRn <= W_4D1_Q(0); + O_COLLn <= W_4D2_Q(2); + O_VPLn <= W_4D2_Q(0); + O_OBJDATALn <= W_4C1_Q(2); + O_MLDn <= W_4C2_Q(0); + O_SLDn <= W_4C2_Q(1); + W_4D1_G <= not (I_H_CNT(0) and I_H_CNT(1) and I_H_CNT(2)); + W_HCNT <= not (I_H_CNT(6) and I_H_CNT(5) and I_H_CNT(4) and I_H_CNT(3)); + -- Parts 4D + u_4d1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_G, + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q =>W_4D1_Q + ); + + u_4d2 : entity work.LOGIC_74XX139 + port map( + I_G => W_5C_Q, + I_Sel(1) => I_H_CNT(2), + I_Sel(0) => I_H_CNT(1), + O_Q => W_4D2_Q + ); + + -- Parts 4C + u_4c1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D2_Q(1), + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q => W_4C1_Q + ); + + u_4c2 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_Q(3), + I_Sel(1) => W_4C2_B, + I_Sel(0) => W_HCNT, + O_Q => W_4C2_Q + ); + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_5C_Q <= I_H_CNT(0); + end if; + end process; + + -- 2004-9-22 added + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + W_4C1_Q3 <= W_4C1_Q(3); + end if; + end process; + + process(W_4C1_Q3) + begin + if rising_edge(W_4C1_Q3) then + W_4C2_B <= I_3D_DI; + end if; + end process; + +end RTL; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_logic.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_logic.vhd new file mode 100644 index 00000000..5dae8a87 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_logic.vhd @@ -0,0 +1,92 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA LOGIC IP MODULE +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx138 +-- 3-to-8 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX138 is + port ( + I_G1 : in std_logic; + I_G2a : in std_logic; + I_G2b : in std_logic; + I_Sel : in std_logic_vector(2 downto 0); + O_Q : out std_logic_vector(7 downto 0) + ); +end logic_74xx138; + +architecture RTL of LOGIC_74XX138 is + signal I_G : std_logic_vector(2 downto 0) := (others => '0'); + +begin + I_G <= I_G1 & I_G2a & I_G2b; + + xx138 : process(I_G, I_Sel) + begin + if(I_G = "100" ) then + case I_Sel is + when "000" => O_Q <= "11111110"; + when "001" => O_Q <= "11111101"; + when "010" => O_Q <= "11111011"; + when "011" => O_Q <= "11110111"; + when "100" => O_Q <= "11101111"; + when "101" => O_Q <= "11011111"; + when "110" => O_Q <= "10111111"; + when "111" => O_Q <= "01111111"; + when others => null; + end case; + else + O_Q <= (others => '1'); + end if; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx139 +-- 2-to-4 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX139 is + port ( + I_G : in std_logic; + I_Sel : in std_logic_vector(1 downto 0); + O_Q : out std_logic_vector(3 downto 0) + ); +end; + +architecture RTL of LOGIC_74XX139 is +begin + xx139 : process (I_G, I_Sel) + begin + if I_G = '0' then + case I_Sel is + when "00" => O_Q <= "1110"; + when "01" => O_Q <= "1101"; + when "10" => O_Q <= "1011"; + when "11" => O_Q <= "0111"; + when others => null; + end case; + else + O_Q <= "1111"; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_missile.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_missile.vhd new file mode 100644 index 00000000..c5aa6633 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_missile.vhd @@ -0,0 +1,107 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA VIDEO-MISSILE +---- +---- Version : 2.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_MISSILE is + port( + I_CLK_6M : in std_logic; + I_CLK_18M : in std_logic; + I_C_BLn_X : in std_logic; + I_MLDn : in std_logic; + I_SLDn : in std_logic; + I_HPOS : in std_logic_vector (7 downto 0); + + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic + ); +end; + +architecture RTL of MC_MISSILE is + signal W_45R_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_45S_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_5P1_Q : std_logic := '0'; + signal W_5P2_Q : std_logic := '0'; + signal W_5P1_CLK : std_logic := '0'; + signal W_5P2_CLK : std_logic := '0'; +begin + + O_MISSILEn <= W_5P1_CLK; + O_SHELLn <= W_5P2_CLK; + + -- missile counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if (I_MLDn = '0') then + W_45R_Q <= I_HPOS; + else + if (I_C_BLn_X = '1') then + W_45R_Q <= W_45R_Q + 1; + if (W_45R_Q(7 downto 2) = "111111") and W_5P1_Q = '1' then + W_5P1_CLK <= '0'; + else + W_5P1_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- shell counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if(I_SLDn = '0') then + W_45S_Q <= I_HPOS; + else + if(I_C_BLn_X = '1') then + W_45S_Q <= W_45S_Q + 1; + if (W_45S_Q(7 downto 2) = "111111") and W_5P2_Q = '1' then + W_5P2_CLK <= '0'; + else + W_5P2_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_MLDn) and clock active on rising edge (W_5P1_CLK) + process(W_5P1_CLK, I_MLDn) + begin + if (I_MLDn = '0') then + W_5P1_Q <= '1'; + elsif rising_edge(W_5P1_CLK) then + W_5P1_Q <= '0'; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_SLDn) and clock active on rising edge (W_5P2_CLK) + process(W_5P2_CLK, I_SLDn) + begin + if (I_SLDn = '0') then + W_5P2_Q <= '1'; + elsif rising_edge(W_5P2_CLK) then + W_5P2_Q <= '0'; + end if; + end process; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_sound_a.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_sound_a.vhd new file mode 100644 index 00000000..ee0c66be --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_sound_a.vhd @@ -0,0 +1,117 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA SOUND I/F +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + use IEEE.std_logic_arith.all; + +entity MC_SOUND_A is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT1 : in std_logic; + I_BD : in std_logic_vector(7 downto 0); + I_PITCH : in std_logic; + I_VOL1 : in std_logic; + I_VOL2 : in std_logic; + + O_SDAT : out std_logic_vector(7 downto 0); + O_DO : out std_logic_vector(3 downto 0) +); +end; + +architecture RTL of MC_SOUND_A is + signal W_PITCH : std_logic := '0'; + signal W_89K_LDn : std_logic := '0'; + signal W_89K_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_89K_LDATA : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6T_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_SDAT0 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT2 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT3 : std_logic_vector(7 downto 0) := (others => '0'); + +begin + O_DO <= W_6T_Q; + + process (I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_PITCH <= I_PITCH; + if (W_89K_Q = x"ff") then + W_89K_LDn <= '0' ; + else + W_89K_LDn <= '1' ; + end if; + end if; + end process; + + -- Parts 9J + process (W_PITCH) + begin + if falling_edge(W_PITCH) then + W_89K_LDATA <= I_BD; + end if; + end process; + + process (I_H_CNT1) + begin + if rising_edge(I_H_CNT1) then + if (W_89K_LDn = '0') then + W_89K_Q <= W_89K_LDATA; + else + W_89K_Q <= W_89K_Q + 1; + end if; + end if; + end process; + + process (W_89K_LDn) + begin + if falling_edge(W_89K_LDn) then + W_6T_Q <= W_6T_Q + 1; + end if; + end process; + + process (I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + O_SDAT <= (x"14" + W_SDAT3) + (W_SDAT0 + W_SDAT2); + + if W_6T_Q(0)='1' then + W_SDAT0 <= x"2a"; + else + W_SDAT0 <= (others => '0'); + end if; + + if W_6T_Q(2)='1' then + if I_VOL1 = '1' then + W_SDAT2 <= x"69"; + else + W_SDAT2 <= x"39"; + end if; + else + W_SDAT2 <= (others => '0'); + end if; + + if (W_6T_Q(3)='1') and (I_VOL2 = '1') then + W_SDAT3 <= x"48" ; + else + W_SDAT3 <= (others => '0'); + end if; + + end if; + end process; + +end; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_sound_b.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_sound_b.vhd new file mode 100644 index 00000000..b74e4bb1 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_sound_b.vhd @@ -0,0 +1,253 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA WAVE SOUND +---- +---- Version : 1.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does no guarantee this program. +---- You can use this at your own risk. +---- +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--pragma translate_off +-- use ieee.std_logic_textio.all; +-- use std.textio.all; +--pragma translate_on + +entity MC_SOUND_B is + port( + I_CLK1 : in std_logic; -- 6MHz + I_RSTn : in std_logic; + I_SW : in std_logic_vector( 2 downto 0); + I_DAC : in std_logic_vector( 3 downto 0); + I_FS : in std_logic_vector( 2 downto 0); + O_SDAT : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_B is +constant sample_time : integer := 557; -- sample time : 557 = 11025Hz, 557/2 = 22050Hz +constant fire_cnt : std_logic_vector(15 downto 0) := x"2000"; +constant hit_cnt : std_logic_vector(15 downto 0) := x"2000"; + +signal sample : std_logic_vector(10 downto 0) := (others => '0'); +signal sample_pls : std_logic := '0'; +signal s0_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s0_trg : std_logic := '0'; +signal s1_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s1_trg : std_logic := '0'; +signal fire_addr : std_logic_vector(15 downto 0) := (others => '0'); +signal hit_addr : std_logic_vector(15 downto 0) := (others => '0'); + +signal WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); +signal WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + +signal W_VCO1_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO1_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal VCO_CTR : std_logic_vector(24 downto 0) := (others => '0'); + +signal SDAT : std_logic_vector(10 downto 0) := (others => '0'); + +begin + -- ideally we should divide by 5 because this is the sum of 5 channels + -- but in practice we divide by 4 and just clip sounds that are too loud. + O_SDAT <= SDAT(9 downto 2) when SDAT(10) = '0' else (others=>'1'); -- clip overrange sounds + + process(I_CLK1) + begin + if rising_edge(I_CLK1) then + SDAT <= ("000" & W_VCO3_OUT) + ( ( ("000" & W_VCO2_OUT) + ("000" & W_VCO1_OUT) ) + ( ("000" & WAV_D0) + ("000" & WAV_D1) ) ); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + sample <= (others => '0'); + sample_pls <= '0'; + elsif rising_edge(I_CLK1) then + if (sample = sample_time - 1) then + sample <= (others => '0'); + sample_pls <= '1'; + else + sample <= sample + 1; + sample_pls <= '0'; + end if; + end if; + end process; + +------------- FIRE SOUND ------------------------------------------ + mc_roms_fire : entity work.GAL_FIR + port map ( + CLK => I_CLK1, + ADDR => fire_addr(12 downto 0), + DATA => WAV_D0 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s0_trg_ff <= (others => '0'); + s0_trg <= '0'; + elsif rising_edge(I_CLK1) then + s0_trg_ff(0) <= I_SW(0); + s0_trg_ff(1) <= s0_trg_ff(0); + s0_trg <= not s0_trg_ff(1) and s0_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + fire_addr <= fire_cnt; + elsif rising_edge(I_CLK1) then + if (s0_trg = '1') then + fire_addr <= (others => '0'); + else + if(sample_pls = '1') then + if(fire_addr <= fire_cnt) then + fire_addr <= fire_addr + 1; + else + fire_addr <= fire_addr ; + end if; + end if; + end if; + end if; + end process; + +------------- HIT SOUND ------------------------------------------ + mc_roms_hit : entity work.GAL_HIT + port map ( + CLK => I_CLK1, + ADDR => hit_addr(12 downto 0), + DATA => WAV_D1 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s1_trg_ff <= (others => '0'); + s1_trg <= '0'; + elsif rising_edge(I_CLK1) then + s1_trg_ff(0) <= I_SW(1); + s1_trg_ff(1) <= s1_trg_ff(0); + s1_trg <= not s1_trg_ff(1) and s1_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + hit_addr <= hit_cnt; + elsif rising_edge(I_CLK1) then + if (s1_trg = '1') then + hit_addr <= (others => '0'); + else + if (sample_pls = '1') then + if (hit_addr <= hit_cnt) then + hit_addr <= hit_addr + 1 ; + else + hit_addr <= hit_addr ; + end if; + end if; + end if; + end if; + end process; + +--------------- EFFECT SOUND --------------------------------------- + +-- 9R modulator voltage generator based on DAC value + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + VCO_CTR <= (others=>'0'); + elsif rising_edge(I_CLK1) then + VCO_CTR <= VCO_CTR + (not I_DAC); + end if; + end process; + + -- modulator frequency lookup tables for the three VCOs + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + elsif rising_edge(I_CLK1) then + case VCO_CTR(23 downto 19) is + when "00000" => W_VCO1_STEP <= x"2A"; W_VCO2_STEP <= x"3A"; W_VCO3_STEP <= x"54"; + when "00001" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"39"; W_VCO3_STEP <= x"53"; + when "00010" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"38"; W_VCO3_STEP <= x"52"; + when "00011" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"50"; + when "00100" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"4F"; + when "00101" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"36"; W_VCO3_STEP <= x"4E"; + when "00110" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"35"; W_VCO3_STEP <= x"4D"; + when "00111" => W_VCO1_STEP <= x"26"; W_VCO2_STEP <= x"34"; W_VCO3_STEP <= x"4C"; + when "01000" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"4A"; + when "01001" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"49"; + when "01010" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"32"; W_VCO3_STEP <= x"48"; + when "01011" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"31"; W_VCO3_STEP <= x"47"; + when "01100" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"30"; W_VCO3_STEP <= x"46"; + when "01101" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"44"; + when "01110" => W_VCO1_STEP <= x"22"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"43"; + when "01111" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2E"; W_VCO3_STEP <= x"42"; + when "10000" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2D"; W_VCO3_STEP <= x"41"; + when "10001" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2C"; W_VCO3_STEP <= x"40"; + when "10010" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3F"; + when "10011" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3D"; + when "10100" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2A"; W_VCO3_STEP <= x"3C"; + when "10101" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"29"; W_VCO3_STEP <= x"3B"; + when "10110" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"3A"; + when "10111" => W_VCO1_STEP <= x"1D"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"39"; + when "11000" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"27"; W_VCO3_STEP <= x"37"; + when "11001" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"26"; W_VCO3_STEP <= x"36"; + when "11010" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"25"; W_VCO3_STEP <= x"35"; + when "11011" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"34"; + when "11100" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"33"; + when "11101" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"23"; W_VCO3_STEP <= x"32"; + when "11110" => W_VCO1_STEP <= x"19"; W_VCO2_STEP <= x"22"; W_VCO3_STEP <= x"30"; + when "11111" => W_VCO1_STEP <= x"18"; W_VCO2_STEP <= x"21"; W_VCO3_STEP <= x"2F"; + when others => null; + end case; + end if; + end process; + +-- 8R VCO 240Hz - 140Hz (8) + mc_vco1 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(0), + I_STEP => W_VCO1_STEP, + O_WAV => W_VCO1_OUT + ); + +-- 8S VCO 330Hz - 190Hz (11) + mc_vco2 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(1), + I_STEP => W_VCO2_STEP, + O_WAV => W_VCO2_OUT + ); + +-- 8T VCO 480Hz - 270Hz (16) + mc_vco3 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(2), + I_STEP => W_VCO3_STEP, + O_WAV => W_VCO3_OUT + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_sound_vco.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_sound_vco.vhd new file mode 100644 index 00000000..e2a63e85 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_sound_vco.vhd @@ -0,0 +1,49 @@ +-------------------------------------------------------------------------------- +---- FPGA VCO +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +use work.sine_package.all; + +-- O_CLK = (I_CLK / 2^20) * I_STEP +entity MC_SOUND_VCO is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + I_FS : in std_logic; + I_STEP : in std_logic_vector( 7 downto 0); + O_WAV : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_VCO is + signal VCO1_CTR : std_logic_vector(19 downto 0) := (others => '0'); + signal sine : std_logic_vector(14 downto 0) := (others => '0'); + +begin + O_WAV <= sine(14 downto 7); + process(I_CLK, I_RSTn) + begin + if (I_RSTn = '0') then + VCO1_CTR <= (others=>'0'); + elsif rising_edge(I_CLK) then + if I_FS = '1' then + VCO1_CTR <= VCO1_CTR + I_STEP; + case VCO1_CTR(19 downto 18) is + when "00" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "01" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when "10" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "11" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_stars.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_stars.vhd new file mode 100644 index 00000000..b91197b3 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_stars.vhd @@ -0,0 +1,90 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA STARS +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity MC_STARS is + port ( + I_CLK_18M : in std_logic; + I_CLK_6M : in std_logic; + I_H_FLIP : in std_logic; + I_V_SYNC : in std_logic; + I_8HF : in std_logic; + I_256HnX : in std_logic; + I_1VF : in std_logic; + I_2V : in std_logic; + I_STARS_ON : in std_logic; + I_STARS_OFFn : in std_logic; + + O_R : out std_logic_vector(1 downto 0); + O_G : out std_logic_vector(1 downto 0); + O_B : out std_logic_vector(1 downto 0); + O_NOISE : out std_logic + ); +end; + +architecture RTL of MC_STARS is + signal CLK_1C : std_logic := '0'; + signal W_2D_Qn : std_logic := '0'; + + signal W_3B : std_logic := '0'; + signal noise : std_logic := '0'; + signal W_2A : std_logic := '0'; + signal W_4P : std_logic := '0'; + signal CLK_1AB : std_logic := '0'; + signal W_1AB_Q : std_logic_vector(15 downto 0) := (others => '0'); + signal W_1C_Q : std_logic_vector( 1 downto 0) := (others => '0'); +begin + O_R <= (W_1AB_Q( 9) & W_1AB_Q (8) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_G <= (W_1AB_Q(11) & W_1AB_Q(10) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_B <= (W_1AB_Q(13) & W_1AB_Q(12) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + + CLK_1C <= not (I_CLK_18M and (not I_CLK_6M )and (not I_V_SYNC) and I_256HnX); + CLK_1AB <= not (CLK_1C or (not (I_H_FLIP or W_1C_Q(1)))); + W_3B <= W_2D_Qn xor W_1AB_Q(4); + + W_2A <= '0' when (W_1AB_Q(7 downto 0) = x"ff") else '1'; + W_4P <= not (( I_8HF xor I_1VF ) and W_2D_Qn and I_STARS_OFFn); + + O_NOISE <= noise ; + + process(I_2V) + begin + if rising_edge(I_2V) then + noise <= W_2D_Qn; + end if; + end process; + + process(CLK_1C, I_V_SYNC) + begin + if(I_V_SYNC = '1') then + W_1C_Q <= (others => '0'); + elsif rising_edge(CLK_1C) then + W_1C_Q <= W_1C_Q(0) & '1'; + end if; + end process; + + process(CLK_1AB, I_STARS_ON) + begin + if(I_STARS_ON = '0') then + W_1AB_Q <= (others => '0'); + W_2D_Qn <= '1'; + elsif rising_edge(CLK_1AB) then + W_1AB_Q <= W_1AB_Q(14 downto 0) & W_3B; + W_2D_Qn <= not W_1AB_Q(15); + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_video.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_video.vhd new file mode 100644 index 00000000..dbe0d0d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mc_video.vhd @@ -0,0 +1,433 @@ +-------------------------------------------------------------------------------- +---- FPGA GALAXIAN VIDEO +---- +---- Version : 2.50 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 4-30 galaxian modify by K.DEGAWA +---- 2004- 5- 6 first release. +---- 2004- 8-23 Improvement with T80-IP. +---- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +-------------------------------------------------------------------------------- + +------------------------------------------------------------------------------------------- +-- H_CNT(0), H_CNT(1), H_CNT(2), H_CNT(3), H_CNT(4), H_CNT(5), H_CNT(6), H_CNT(7), H_CNT(8), +-- 1 H 2 H 4 H 8 H 16 H 32H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT(0), V_CNT(1), V_CNT(2), V_CNT(3), V_CNT(4), V_CNT(5), V_CNT(6), V_CNT(7) +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_VIDEO is + port( + I_CLK_18M : in std_logic; + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_V_CNT : in std_logic_vector(7 downto 0); + I_H_FLIP : in std_logic; + I_V_FLIP : in std_logic; + I_V_BLn : in std_logic; + I_C_BLn : in std_logic; + + I_A : in std_logic_vector(9 downto 0); + I_BD : in std_logic_vector(7 downto 0); + I_OBJ_SUB_A : in std_logic_vector(2 downto 0); + I_OBJ_RAM_RQ : in std_logic; + I_OBJ_RAM_RD : in std_logic; + I_OBJ_RAM_WR : in std_logic; + I_VID_RAM_RD : in std_logic; + I_VID_RAM_WR : in std_logic; + I_DRIVER_WR : in std_logic; + + O_C_BLnX : out std_logic; + O_8HF : out std_logic; + O_256HnX : out std_logic; + O_1VF : out std_logic; + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic; + + O_BD : out std_logic_vector(7 downto 0); + O_VID : out std_logic_vector(1 downto 0); + O_COL : out std_logic_vector(2 downto 0) + ); +end; + +architecture RTL of MC_VIDEO is + + signal WB_LDn : std_logic := '0'; + signal WB_CNTRLDn : std_logic := '0'; + signal WB_CNTRCLRn : std_logic := '0'; + signal WB_COLLn : std_logic := '0'; + signal WB_VPLn : std_logic := '0'; + signal WB_OBJDATALn : std_logic := '0'; + signal WB_MLDn : std_logic := '0'; + signal WB_SLDn : std_logic := '0'; + signal W_3D : std_logic := '0'; + signal W_LDn : std_logic := '0'; + signal W_CNTRLDn : std_logic := '0'; + signal W_CNTRCLRn : std_logic := '0'; + signal W_COLLn : std_logic := '0'; + signal W_VPLn : std_logic := '0'; + signal W_OBJDATALn : std_logic := '0'; + signal W_MLDn : std_logic := '0'; + signal W_SLDn : std_logic := '0'; + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_H_POSI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_2M_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6K_Q : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_6P_Q : std_logic_vector( 6 downto 0) := (others => '0'); + signal W_45T_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2KL : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2HJ : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_RV : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_RC : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_O_OBJ_ROM_A : std_logic_vector(10 downto 0) := (others => '0'); + signal W_VID_RAM_A : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AA : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AB : std_logic_vector(11 downto 0) := (others => '0'); + signal C_2HJ : std_logic_vector( 1 downto 0) := (others => '0'); + signal C_2KL : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_CD : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_1M : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_A : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_B : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_Y : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_LRAM_DI : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_LRAM_DO : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_1H_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_1K_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_LRAM_A : std_logic_vector( 7 downto 0) := (others => '0'); +-- signal W_OBJ_RAM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_HF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_45N_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6J_Q : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DA : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DB : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_256HnX : std_logic := '0'; + signal W_2N : std_logic := '0'; + signal W_45T_CLR : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_H_FLIP1 : std_logic := '0'; + signal W_H_FLIP2 : std_logic := '0'; + signal W_H_FLIP1X : std_logic := '0'; + signal W_H_FLIP2X : std_logic := '0'; + signal W_LRAM_AND : std_logic := '0'; + signal W_RAW0 : std_logic := '0'; + signal W_RAW1 : std_logic := '0'; + signal W_RAW_OR : std_logic := '0'; + signal W_SRCLK : std_logic := '0'; + signal W_SRLD : std_logic := '0'; + signal W_VID_RAM_CS : std_logic := '0'; + signal W_CLK_6Mn : std_logic := '0'; + +begin + ld_pls : entity work.MC_LD_PLS + port map( + I_CLK_6M => I_CLK_6M, + I_H_CNT => I_H_CNT, + I_3D_DI => W_3D, + + O_LDn => WB_LDn, + O_CNTRLDn => WB_CNTRLDn, + O_CNTRCLRn => WB_CNTRCLRn, + O_COLLn => WB_COLLn, + O_VPLn => WB_VPLn, + O_OBJDATALn => WB_OBJDATALn, + O_MLDn => WB_MLDn, + O_SLDn => WB_SLDn + ); + + obj_ram : entity work.MC_OBJ_RAM + port map( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(7 downto 0), + I_WEA => I_OBJ_RAM_WR, + I_CEA => I_OBJ_RAM_RQ, + I_DA => I_BD, + O_DA => W_OBJ_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_OBJ_RAM_AB, + I_WEB => '0', + I_CEB => '1', + I_DB => x"00", + O_DB => W_OBJ_RAM_DOB + ); + + lram : entity work.MC_LRAM + port map( + I_CLK => I_CLK_18M, + I_ADDR => W_LRAM_A, + I_WE => W_CLK_6Mn, + I_D => W_LRAM_DI, + O_Dn => W_LRAM_DO + ); + + missile : entity work.MC_MISSILE + port map( + I_CLK_18M => I_CLK_18M, + I_CLK_6M => I_CLK_6M, + I_C_BLn_X => W_C_BLnX, + I_MLDn => W_MLDn, + I_SLDn => W_SLDn, + I_HPOS => W_H_POSI, + O_MISSILEn => O_MISSILEn, + O_SHELLn => O_SHELLn + ); + + vid_ram : entity work.MC_VID_RAM + port map ( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(9 downto 0), + I_DA => W_VID_RAM_DI, + I_WEA => I_VID_RAM_WR, + I_CEA => W_VID_RAM_CS, + O_DA => W_VID_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_VID_RAM_A(9 downto 0), + I_DB => x"00", + I_WEB => '0', + I_CEB => '1', + O_DB => W_VID_RAM_DOB + ); + + -- 1K VID-Rom + k_rom : entity work.GALAXIAN_1K + port map ( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1K_D + ); + + -- 1H VID-Rom + h_rom : entity work.GALAXIAN_1H + port map( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1H_D + ); + +----------------------------------------------------------------------------------- + + process(I_CLK_12M) + begin + if falling_edge(I_CLK_12M) then + W_LDn <= WB_LDn; + W_CNTRLDn <= WB_CNTRLDn; + W_CNTRCLRn <= WB_CNTRCLRn; + W_COLLn <= WB_COLLn; + W_VPLn <= WB_VPLn; + W_OBJDATALn <= WB_OBJDATALn; + W_MLDn <= WB_MLDn; + W_SLDn <= WB_SLDn; + end if; + end process; + + W_CLK_6Mn <= not I_CLK_6M; + + W_6J_DA <= I_H_FLIP & W_HF_CNT(7) & W_HF_CNT(3) & I_H_CNT(2); + W_6J_DB <= W_OBJ_D(6) & ( W_HF_CNT(3) and I_H_CNT(1) ) & I_H_CNT(2) & I_H_CNT(1); + W_6J_Q <= W_6J_DB when I_H_CNT(8) = '1' else W_6J_DA; + + W_H_FLIP1 <= (not I_H_CNT(8)) and I_H_FLIP; + + W_HF_CNT(7 downto 3) <= not I_H_CNT(7 downto 3) when W_H_FLIP1 = '1' else I_H_CNT(7 downto 3); + W_VF_CNT <= not I_V_CNT when I_V_FLIP = '1' else I_V_CNT; + + O_8HF <= W_HF_CNT(3); + O_1VF <= W_VF_CNT(0); + W_H_FLIP2 <= W_6J_Q(3); + +-- Parts 4F,5F + W_OBJ_RAM_AB <= "0" & I_H_CNT(8) & W_6J_Q(2) & W_HF_CNT(6 downto 4) & W_6J_Q(1 downto 0); +-- W_OBJ_RAM_A <= W_OBJ_RAM_AB when I_OBJ_RAM_RQ = '0' else I_A(7 downto 0) ; + + process(I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_H_POSI <= W_OBJ_RAM_DOB; + end if; + end process; + + W_OBJ_RAM_D <= W_OBJ_RAM_DOA when I_OBJ_RAM_RD = '1' else (others => '0'); + +-- Parts 4L + process(W_OBJDATALn) + begin + if rising_edge(W_OBJDATALn) then + W_OBJ_D <= W_H_POSI; + end if; + end process; + +-- Parts 4,5N + W_45N_Q <= W_VF_CNT + W_H_POSI; + W_3D <= '0' when W_45N_Q = x"FF" else '1'; + + process(W_VPLn, I_V_BLn) + begin + if (I_V_BLn = '0') then + W_2M_Q <= (others => '0'); + elsif rising_edge(W_VPLn) then + W_2M_Q <= W_45N_Q; + end if; + end process; + + W_2N <= I_H_CNT(8) and W_OBJ_D(7); + W_1M <= W_2M_Q(3 downto 0) xor (W_2N & W_2N & W_2N & W_2N); + W_VID_RAM_CS <= I_VID_RAM_RD or I_VID_RAM_WR; + W_VID_RAM_DI <= I_BD when I_VID_RAM_WR = '1' else (others => '0'); + W_VID_RAM_AA <= (not ( W_2M_Q(7) and W_2M_Q(6) and W_2M_Q(5) and W_2M_Q(4))) & (not W_VID_RAM_CS) & "0000000000"; -- I_A(9:0) + W_VID_RAM_AB <= "00" & W_2M_Q(7 downto 4) & W_1M(3) & W_HF_CNT(7 downto 3); + W_VID_RAM_A <= W_VID_RAM_AB when I_C_BLn = '1' else W_VID_RAM_AA; + W_VID_RAM_D <= W_VID_RAM_DOA when I_VID_RAM_RD = '1' else (others => '0'); + +---- VIDEO DATA OUTPUT -------------- + + O_BD <= W_OBJ_RAM_D or W_VID_RAM_D; + W_SRLD <= not (W_LDn or W_VID_RAM_A(11)); + W_OBJ_ROM_AB <= W_OBJ_D(5 downto 0) & W_1M(3) & (W_OBJ_D(6) xor I_H_CNT(3)); + W_OBJ_ROM_A <= W_OBJ_ROM_AB when I_H_CNT(8) = '1' else W_VID_RAM_DOB; + W_O_OBJ_ROM_A <= W_OBJ_ROM_A & W_1M(2 downto 0); + +----------------------------------------------------------------------------------- + + W_3L_A <= reg_2HJ(7) & reg_2KL(7) & "1" & W_SRLD; + W_3L_B <= reg_2HJ(0) & reg_2KL(0) & W_SRLD & "1"; + W_3L_Y <= W_3L_B when W_H_FLIP2X = '1' else W_3L_A; -- (3)=RAW1,(2)=RAW0 + C_2HJ <= W_3L_Y(1 downto 0); + C_2KL <= W_3L_Y(1 downto 0); + W_RAW0 <= W_3L_Y(2); + W_RAW1 <= W_3L_Y(3); + W_SRCLK <= I_CLK_6M; + +-------- PARTS 2KL ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2KL) is + when "00" => reg_2KL <= reg_2KL; + when "10" => reg_2KL <= reg_2KL(6 downto 0) & "0"; + when "01" => reg_2KL <= "0" & reg_2KL(7 downto 1); + when "11" => reg_2KL <= W_1K_D; + when others => null; + end case; + end if; + end process; + +-------- PARTS 2HJ ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2HJ) is + when "00" => reg_2HJ <= reg_2HJ; + when "10" => reg_2HJ <= reg_2HJ(6 downto 0) & "0"; + when "01" => reg_2HJ <= "0" & reg_2HJ(7 downto 1); + when "11" => reg_2HJ <= W_1H_D; + when others => null; + end case; + end if; + end process; + +------- SHT2 ----------------------------------------------------- + +-- Parts 6K + process(W_COLLn) + begin + if rising_edge(W_COLLn) then + W_6K_Q <= W_H_POSI(2 downto 0); + end if; + end process; + +-- Parts 6P + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + if (W_LDn = '0') then + W_6P_Q <= W_H_FLIP2 & W_H_FLIP1 & I_C_BLn & (not I_H_CNT(8)) & W_6K_Q(2 downto 0); + else + W_6P_Q <= W_6P_Q; + end if; + end if; + end process; + + W_H_FLIP2X <= W_6P_Q(6); + W_H_FLIP1X <= W_6P_Q(5); + W_C_BLnX <= W_6P_Q(4); + W_256HnX <= W_6P_Q(3); + W_CD <= W_6P_Q(2 downto 0); + O_256HnX <= W_256HnX; + O_C_BLnX <= W_C_BLnX; + W_45T_CLR <= W_CNTRCLRn or W_256HnX ; + + process(I_CLK_6M, W_45T_CLR) + begin + if (W_45T_CLR = '0') then + W_45T_Q <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + if (W_CNTRLDn = '0') then + W_45T_Q <= W_H_POSI; + else + W_45T_Q <= W_45T_Q + 1; + end if; + end if; + end process; + + W_LRAM_A <= (not W_45T_Q) when W_H_FLIP1X = '1' else W_45T_Q; + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_RV <= W_LRAM_DO(1 downto 0); + W_RC <= W_LRAM_DO(4 downto 2); + end if; + end process; + + W_LRAM_AND <= not (not ((W_LRAM_A(4) or W_LRAM_A(5)) or (W_LRAM_A(6) or W_LRAM_A(7))) or W_256HnX ); + W_RAW_OR <= W_RAW0 or W_RAW1 ; + + W_VID(0) <= not (not (W_RAW0 and W_RV(1)) and W_RV(0)); + W_VID(1) <= not (not (W_RAW1 and W_RV(0)) and W_RV(1)); + W_COL(0) <= not (not (W_RAW_OR and W_CD(0) and W_RC(1) and W_RC(2)) and W_RC(0)); + W_COL(1) <= not (not (W_RAW_OR and W_CD(1) and W_RC(2) and W_RC(0)) and W_RC(1)); + W_COL(2) <= not (not (W_RAW_OR and W_CD(2) and W_RC(0) and W_RC(1)) and W_RC(2)); + + O_VID <= W_VID; + O_COL <= W_COL; + + W_LRAM_DI(0) <= W_LRAM_AND and W_VID(0); + W_LRAM_DI(1) <= W_LRAM_AND and W_VID(1); + W_LRAM_DI(2) <= W_LRAM_AND and W_COL(0); + W_LRAM_DI(3) <= W_LRAM_AND and W_COL(1); + W_LRAM_DI(4) <= W_LRAM_AND and W_COL(2); + +end RTL; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mist_io.v b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_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/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/osd.v b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_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/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/pll.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d76a5e1d --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/pll.vhd @@ -0,0 +1,451 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + c3 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + clk3_divide_by : NATURAL; + clk3_duty_cycle : NATURAL; + clk3_multiply_by : NATURAL; + clk3_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire2 <= sub_wire0(3); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c3 <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 3, + clk0_duty_cycle => 50, + clk0_multiply_by => 2, + clk0_phase_shift => "0", + clk1_divide_by => 9, + clk1_duty_cycle => 50, + clk1_multiply_by => 4, + clk1_phase_shift => "0", + clk2_divide_by => 9, + clk2_duty_cycle => 50, + clk2_multiply_by => 2, + clk2_phase_shift => "0", + clk3_divide_by => 6, + clk3_duty_cycle => 50, + clk3_multiply_by => 1, + clk3_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_USED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire6, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "3" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "6" +-- 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: DUTY_CYCLE3 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "18.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "12.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "6.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "4.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 "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "4" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "18.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "12.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "6.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "4.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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 "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "3" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "4" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "6" +-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK3_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_USED" +-- 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_USED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/scandoubler.v b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..36e71ed2 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_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/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/sine_package.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/sine_package.vhd new file mode 100644 index 00000000..473caa04 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/sine_package.vhd @@ -0,0 +1,152 @@ +library ieee; +use ieee.std_logic_1164.all; + +package sine_package is + + subtype table_value_type is integer range 0 to 16383; + subtype table_index_type is std_logic_vector( 6 downto 0 ); + + function get_table_value (table_index: table_index_type) return table_value_type; + +end; + +package body sine_package is + + function get_table_value (table_index: table_index_type) return table_value_type is + variable table_value: table_value_type; + begin + case table_index is + when "0000000" => table_value := 101; + when "0000001" => table_value := 302; + when "0000010" => table_value := 503; + when "0000011" => table_value := 703; + when "0000100" => table_value := 904; + when "0000101" => table_value := 1105; + when "0000110" => table_value := 1305; + when "0000111" => table_value := 1506; + when "0001000" => table_value := 1706; + when "0001001" => table_value := 1906; + when "0001010" => table_value := 2105; + when "0001011" => table_value := 2304; + when "0001100" => table_value := 2503; + when "0001101" => table_value := 2702; + when "0001110" => table_value := 2900; + when "0001111" => table_value := 3098; + when "0010000" => table_value := 3295; + when "0010001" => table_value := 3491; + when "0010010" => table_value := 3688; + when "0010011" => table_value := 3883; + when "0010100" => table_value := 4078; + when "0010101" => table_value := 4273; + when "0010110" => table_value := 4466; + when "0010111" => table_value := 4659; + when "0011000" => table_value := 4852; + when "0011001" => table_value := 5044; + when "0011010" => table_value := 5234; + when "0011011" => table_value := 5425; + when "0011100" => table_value := 5614; + when "0011101" => table_value := 5802; + when "0011110" => table_value := 5990; + when "0011111" => table_value := 6177; + when "0100000" => table_value := 6362; + when "0100001" => table_value := 6547; + when "0100010" => table_value := 6731; + when "0100011" => table_value := 6914; + when "0100100" => table_value := 7095; + when "0100101" => table_value := 7276; + when "0100110" => table_value := 7456; + when "0100111" => table_value := 7634; + when "0101000" => table_value := 7811; + when "0101001" => table_value := 7988; + when "0101010" => table_value := 8162; + when "0101011" => table_value := 8336; + when "0101100" => table_value := 8509; + when "0101101" => table_value := 8680; + when "0101110" => table_value := 8850; + when "0101111" => table_value := 9018; + when "0110000" => table_value := 9185; + when "0110001" => table_value := 9351; + when "0110010" => table_value := 9515; + when "0110011" => table_value := 9678; + when "0110100" => table_value := 9840; + when "0110101" => table_value := 10000; + when "0110110" => table_value := 10158; + when "0110111" => table_value := 10315; + when "0111000" => table_value := 10471; + when "0111001" => table_value := 10625; + when "0111010" => table_value := 10777; + when "0111011" => table_value := 10927; + when "0111100" => table_value := 11076; + when "0111101" => table_value := 11224; + when "0111110" => table_value := 11369; + when "0111111" => table_value := 11513; + when "1000000" => table_value := 11655; + when "1000001" => table_value := 11796; + when "1000010" => table_value := 11934; + when "1000011" => table_value := 12071; + when "1000100" => table_value := 12206; + when "1000101" => table_value := 12339; + when "1000110" => table_value := 12471; + when "1000111" => table_value := 12600; + when "1001000" => table_value := 12728; + when "1001001" => table_value := 12853; + when "1001010" => table_value := 12977; + when "1001011" => table_value := 13099; + when "1001100" => table_value := 13219; + when "1001101" => table_value := 13336; + when "1001110" => table_value := 13452; + when "1001111" => table_value := 13566; + when "1010000" => table_value := 13678; + when "1010001" => table_value := 13787; + when "1010010" => table_value := 13895; + when "1010011" => table_value := 14000; + when "1010100" => table_value := 14104; + when "1010101" => table_value := 14205; + when "1010110" => table_value := 14304; + when "1010111" => table_value := 14401; + when "1011000" => table_value := 14496; + when "1011001" => table_value := 14588; + when "1011010" => table_value := 14679; + when "1011011" => table_value := 14767; + when "1011100" => table_value := 14853; + when "1011101" => table_value := 14936; + when "1011110" => table_value := 15018; + when "1011111" => table_value := 15097; + when "1100000" => table_value := 15174; + when "1100001" => table_value := 15249; + when "1100010" => table_value := 15321; + when "1100011" => table_value := 15391; + when "1100100" => table_value := 15459; + when "1100101" => table_value := 15524; + when "1100110" => table_value := 15587; + when "1100111" => table_value := 15648; + when "1101000" => table_value := 15706; + when "1101001" => table_value := 15762; + when "1101010" => table_value := 15816; + when "1101011" => table_value := 15867; + when "1101100" => table_value := 15916; + when "1101101" => table_value := 15963; + when "1101110" => table_value := 16007; + when "1101111" => table_value := 16048; + when "1110000" => table_value := 16088; + when "1110001" => table_value := 16124; + when "1110010" => table_value := 16159; + when "1110011" => table_value := 16191; + when "1110100" => table_value := 16220; + when "1110101" => table_value := 16247; + when "1110110" => table_value := 16272; + when "1110111" => table_value := 16294; + when "1111000" => table_value := 16314; + when "1111001" => table_value := 16331; + when "1111010" => table_value := 16346; + when "1111011" => table_value := 16358; + when "1111100" => table_value := 16368; + when "1111101" => table_value := 16375; + when "1111110" => table_value := 16380; + when "1111111" => table_value := 16383; + when others => null; + end case; + return table_value; + end; + +end; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/spram.vhd b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/spram.vhd new file mode 100644 index 00000000..ad6b58b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone V", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/video_mixer.sv b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..b9f7e424 --- /dev/null +++ b/Arcade/Galaxian Hardware/Galaxian_MiST/rtl/video_mixer.sv @@ -0,0 +1,243 @@ +// +// +// 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; +reg [DWIDTH:0] Rd,Gd,Bd; +always @(posedge clk_sys) {Rd,Gd,Bd} <= {R,G,B}; +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(Rd), + .g_in(Gd), + .b_in(Bd), + + .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/Arcade/Galaxian Hardware/MoonCresta_MiST/MoonCresta.qpf b/Arcade/Galaxian Hardware/MoonCresta_MiST/MoonCresta.qpf new file mode 100644 index 00000000..35d49f9b --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/MoonCresta.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:59:16 November 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "14:59:16 November 16, 2017" + +# Revisions + +PROJECT_REVISION = "MoonCresta" +PROJECT_REVISION = "Arcade-MoonCresta" diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/MoonCresta.qsf b/Arcade/Galaxian Hardware/MoonCresta_MiST/MoonCresta.qsf new file mode 100644 index 00000000..49d7e724 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/MoonCresta.qsf @@ -0,0 +1,143 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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.2 Build 203 01/18/2017 SJ Standard Edition +# Date created = 01:53:32 April 20, 2017 +# +# -------------------------------------------------------------------------- # + +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 PLL_1 -to "pll:pll|altpll:altpll_component" + + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY MoonCresta +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SAVE_DISK_SPACE OFF +set_global_assignment -name SMART_RECOMPILE ON +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 MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +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)" +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" + +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" + +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 USE_CONFIGURATION_DEVICE OFF +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" +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 +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80as.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_6L.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1K.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1H.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_HIT.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_FIR.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/sine_package.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/MoonCresta.sv +set_global_assignment -name VHDL_FILE rtl/mc_video.vhd +set_global_assignment -name VHDL_FILE rtl/mc_stars.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_vco.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_b.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_a.vhd +set_global_assignment -name VHDL_FILE rtl/mc_missile.vhd +set_global_assignment -name VHDL_FILE rtl/mc_logic.vhd +set_global_assignment -name VHDL_FILE rtl/mc_ld_pls.vhd +set_global_assignment -name VHDL_FILE rtl/mc_inport.vhd +set_global_assignment -name VHDL_FILE rtl/mc_hv_count.vhd +set_global_assignment -name VHDL_FILE rtl/mc_col_pal.vhd +set_global_assignment -name VHDL_FILE rtl/mc_bram.vhd +set_global_assignment -name VHDL_FILE rtl/mc_adec.vhd +set_global_assignment -name VHDL_FILE rtl/galaxian.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/MoonCresta.srf b/Arcade/Galaxian Hardware/MoonCresta_MiST/MoonCresta.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/MoonCresta.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/README.txt b/Arcade/Galaxian Hardware/MoonCresta_MiST/README.txt new file mode 100644 index 00000000..9291cb56 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/README.txt @@ -0,0 +1,25 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Moon Cresta port to MiST by Gehstock +-- 18 December 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Galaxian hardware +-- Copyright(c) 2004 Katsumi Degawa +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- F2 : Coin + Start 2 players +-- F1 : Coin + Start 1 player +-- SPACE : Fire +-- ARROW KEYS : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + +ToDo: Video Fix/Rotate \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/Release/MoonCresta.rbf b/Arcade/Galaxian Hardware/MoonCresta_MiST/Release/MoonCresta.rbf new file mode 100644 index 00000000..faa2c01a Binary files /dev/null and b/Arcade/Galaxian Hardware/MoonCresta_MiST/Release/MoonCresta.rbf differ diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/clean.bat b/Arcade/Galaxian Hardware/MoonCresta_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_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/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/MoonCresta.sv b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/MoonCresta.sv new file mode 100644 index 00000000..fc063551 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/MoonCresta.sv @@ -0,0 +1,176 @@ +//============================================================================ +// Arcade: Moon Cresta +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module MoonCresta +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "MoonCresta;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_18, clk_12, clk_6, clk_4p5; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_18), + .c1(clk_12), + .c2(clk_6), + .c3(clk_4p5)//for now, needs a fix +); + +wire m_up = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +galaxian mooncresta +( + .W_CLK_18M(clk_18), + .W_CLK_12M(clk_12), + .W_CLK_6M(clk_6), + .I_RESET(status[0] | status[6] | buttons[1]), + .P1_CSJUDLR({m_coin,m_start1,m_fire,m_up,m_down,m_left,m_right}), + .P2_CSJUDLR({1'b0, m_start2,m_fire,m_up,m_down,m_left,m_right}), + .W_R(r), + .W_G(g), + .W_B(b), + .W_H_SYNC(hs), + .W_V_SYNC(vs), + .HBLANK(hblank), + .VBLANK(vblank), + .W_SDAT_A(audio_a), + .W_SDAT_B(audio_b) +); + +wire [7:0] audio_a, audio_b; +wire [10:0] audio = {1'b0, audio_b, 2'b0} + {3'b0, audio_a}; + +dac dac ( + .clk_i(clk_18), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [2:0] r, g, b; +wire hblank, vblank; +wire blankn = ~(hblank | vblank); +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_18), + .ce_pix(clk_4p5), + .ce_pix_actual(clk_4p5), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn?r:"000"), + .G(blankn?g:"000"), + .B(blankn?b:"000"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_18 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_18), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GALAXIAN_1H.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GALAXIAN_1H.vhd new file mode 100644 index 00000000..b9ce0580 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GALAXIAN_1H.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_1H is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_1H is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"02",X"02",X"FE",X"FE",X"42",X"02",X"00",X"00", + X"62",X"F2",X"BA",X"9A",X"9E",X"CE",X"46",X"00",X"8C",X"DE",X"F2",X"B2",X"92",X"86",X"04",X"00", + X"08",X"FE",X"FE",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BE",X"A2",X"A2",X"A2",X"E6",X"E4",X"00", + X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"C0",X"E0",X"B0",X"9E",X"8E",X"C0",X"C0",X"00", + X"0C",X"6E",X"9A",X"9A",X"B2",X"F2",X"6C",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00", + X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00",X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00", + X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00",X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00", + X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00",X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00", + X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00",X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00", + X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00",X"FC",X"FE",X"02",X"02",X"02",X"06",X"04",X"00", + X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00",X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00", + X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00",X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00", + X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00",X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00", + X"7A",X"FC",X"8E",X"8A",X"82",X"FE",X"7C",X"00",X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00", + X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00",X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00", + X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00",X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0",X"00", + X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00",X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00", + X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00",X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"E0",X"F0",X"FB",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"D0",X"00",X"00", + X"81",X"42",X"24",X"18",X"18",X"24",X"42",X"81",X"00",X"18",X"18",X"18",X"18",X"18",X"00",X"00", + X"00",X"00",X"00",X"00",X"06",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00", + X"00",X"28",X"28",X"28",X"28",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"0A",X"08",X"08",X"10",X"20",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"10",X"08",X"08",X"0A",X"07",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"06",X"0C",X"18",X"3C",X"3E",X"BE",X"DE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"BE",X"3E",X"3C",X"18",X"0C",X"06",X"02",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"01",X"00",X"C0",X"E0",X"E0",X"A0",X"C0",X"60",X"A0", + X"01",X"03",X"03",X"01",X"07",X"0F",X"3F",X"FF",X"E0",X"80",X"60",X"F0",X"F8",X"FC",X"FE",X"FF", + X"3F",X"0F",X"07",X"01",X"03",X"03",X"01",X"01",X"FE",X"FC",X"F8",X"F0",X"60",X"80",X"E0",X"A0", + X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"60",X"C0",X"A0",X"E0",X"E0",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"54",X"D8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"3B",X"7D",X"E8",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0", + X"74",X"3F",X"08",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"04",X"00",X"3A",X"7D",X"EA",X"00",X"00",X"04",X"40",X"80",X"24",X"02",X"40", + X"74",X"1A",X"00",X"00",X"02",X"00",X"00",X"00",X"28",X"14",X"00",X"10",X"00",X"20",X"00",X"00", + X"00",X"40",X"80",X"20",X"40",X"11",X"19",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"16",X"10",X"00",X"18",X"0E",X"06",X"03",X"33",X"20",X"21",X"7E",X"7F",X"09",X"06",X"00",X"10", + X"33",X"00",X"10",X"38",X"3C",X"66",X"6A",X"31",X"3D",X"3D",X"11",X"3F",X"3E",X"10",X"00",X"40", + X"11",X"40",X"80",X"20",X"56",X"10",X"7F",X"7F",X"80",X"20",X"40",X"10",X"38",X"3C",X"6E",X"66", + X"10",X"16",X"00",X"00",X"01",X"09",X"3B",X"0F",X"33",X"11",X"00",X"18",X"0E",X"06",X"03",X"33", + X"06",X"00",X"0C",X"0C",X"0C",X"0C",X"0C",X"40",X"33",X"00",X"28",X"28",X"7F",X"7E",X"28",X"28", + X"80",X"23",X"4F",X"1E",X"38",X"00",X"1E",X"07",X"00",X"0C",X"02",X"09",X"00",X"08",X"00",X"20", + X"00",X"08",X"04",X"06",X"03",X"7F",X"7F",X"00",X"40",X"10",X"26",X"0C",X"18",X"7F",X"7F",X"00", + X"00",X"02",X"07",X"0C",X"0B",X"03",X"03",X"17",X"00",X"20",X"20",X"00",X"80",X"C8",X"C8",X"E4", + X"23",X"03",X"13",X"09",X"08",X"03",X"00",X"00",X"F0",X"E0",X"C4",X"E8",X"C0",X"20",X"C0",X"00", + X"00",X"00",X"02",X"09",X"01",X"02",X"04",X"00",X"00",X"00",X"00",X"10",X"00",X"48",X"30",X"20", + X"0E",X"14",X"01",X"03",X"04",X"01",X"00",X"00",X"68",X"04",X"40",X"20",X"10",X"00",X"00",X"00", + X"00",X"04",X"04",X"00",X"02",X"65",X"1A",X"07",X"00",X"40",X"82",X"84",X"08",X"20",X"60",X"C0", + X"09",X"05",X"06",X"21",X"02",X"12",X"24",X"00",X"90",X"C6",X"80",X"61",X"10",X"08",X"40",X"00", + X"90",X"40",X"20",X"19",X"86",X"44",X"03",X"03",X"55",X"02",X"95",X"2A",X"44",X"C8",X"90",X"C3", + X"77",X"CB",X"1B",X"0D",X"50",X"21",X"41",X"81",X"E0",X"E8",X"D4",X"86",X"01",X"48",X"24",X"02", + X"04",X"10",X"48",X"20",X"00",X"81",X"43",X"07",X"20",X"08",X"12",X"04",X"00",X"81",X"C2",X"E0", + X"07",X"43",X"81",X"00",X"20",X"48",X"10",X"04",X"E0",X"C2",X"81",X"00",X"04",X"12",X"08",X"20", + X"04",X"10",X"48",X"20",X"00",X"81",X"43",X"07",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"A0", + X"07",X"43",X"81",X"00",X"20",X"48",X"10",X"04",X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"09",X"24",X"10",X"00",X"40",X"21",X"03",X"07",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"00", + X"47",X"83",X"01",X"40",X"90",X"20",X"00",X"08",X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"01",X"09",X"08",X"20",X"20",X"01",X"03",X"C7",X"40",X"00",X"00",X"00",X"00",X"80",X"C0",X"80", + X"07",X"02",X"C1",X"00",X"40",X"80",X"00",X"20",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"09",X"08",X"00",X"60",X"01",X"03",X"C7",X"20",X"28",X"00",X"00",X"00",X"80",X"C0",X"A0", + X"07",X"02",X"C1",X"00",X"40",X"00",X"00",X"00",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"04",X"04",X"20",X"10",X"80",X"41",X"03",X"07",X"48",X"90",X"04",X"00",X"00",X"80",X"C0",X"A0", + X"C7",X"02",X"00",X"80",X"00",X"00",X"00",X"00",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"04",X"22",X"10",X"80",X"40",X"01",X"83",X"07",X"50",X"54",X"08",X"02",X"00",X"80",X"C0",X"E0", + X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"04",X"22",X"10",X"40",X"20",X"81",X"03",X"07",X"20",X"44",X"08",X"02",X"04",X"81",X"C0",X"E0", + X"05",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"04",X"10",X"48",X"20",X"00",X"81",X"43",X"07",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80", + X"07",X"43",X"81",X"00",X"20",X"48",X"10",X"04",X"80",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"02",X"08",X"24",X"10",X"00",X"40",X"21",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"03",X"21",X"40",X"00",X"10",X"24",X"08",X"02",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"08",X"24",X"10",X"40",X"21",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"03",X"21",X"40",X"10",X"24",X"08",X"02",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"02",X"08",X"14",X"08",X"31",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"31",X"08",X"14",X"08",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"02",X"04",X"08",X"10",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"10",X"08",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"09",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"05",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"0B",X"0B", + X"07",X"0F",X"0D",X"04",X"0E",X"01",X"01",X"01",X"BF",X"9F",X"07",X"60",X"7C",X"7E",X"FE",X"FE", + X"02",X"06",X"06",X"03",X"01",X"00",X"00",X"00",X"F7",X"7F",X"FF",X"F3",X"FF",X"7F",X"13",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"40",X"20",X"10",X"08",X"04",X"03",X"00",X"10",X"08",X"08",X"1C",X"0C",X"C0",X"20", + X"01",X"02",X"02",X"01",X"00",X"00",X"00",X"00",X"E0",X"F0",X"70",X"06",X"0A",X"10",X"60",X"20", + X"31",X"08",X"00",X"00",X"00",X"00",X"01",X"01",X"C1",X"20",X"18",X"08",X"48",X"C4",X"7B",X"00", + X"01",X"06",X"0C",X"08",X"08",X"10",X"20",X"00",X"00",X"10",X"20",X"20",X"13",X"0C",X"00",X"00", + X"00",X"80",X"40",X"30",X"08",X"05",X"07",X"01",X"80",X"40",X"20",X"10",X"63",X"90",X"0E",X"21", + X"01",X"01",X"03",X"06",X"04",X"04",X"0B",X"3A",X"48",X"38",X"0E",X"1F",X"0F",X"07",X"01",X"D9", + X"C5",X"02",X"00",X"06",X"02",X"05",X"0E",X"0E",X"3F",X"8F",X"07",X"02",X"08",X"15",X"C7",X"F5", + X"0E",X"07",X"0F",X"18",X"30",X"20",X"40",X"00",X"74",X"A2",X"D9",X"0C",X"02",X"0C",X"0C",X"12", + X"00",X"00",X"20",X"08",X"02",X"00",X"00",X"02",X"00",X"00",X"04",X"08",X"08",X"80",X"65",X"32", + X"11",X"04",X"03",X"00",X"00",X"00",X"00",X"AA",X"18",X"0C",X"4B",X"20",X"03",X"80",X"C0",X"80", + X"02",X"0C",X"00",X"01",X"00",X"04",X"10",X"42",X"58",X"83",X"32",X"10",X"21",X"80",X"02",X"08", + X"01",X"00",X"04",X"00",X"10",X"00",X"40",X"00",X"00",X"17",X"09",X"16",X"20",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"81",X"C7",X"E9",X"E8",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"60", + X"FE",X"FF",X"E7",X"C3",X"0F",X"1F",X"03",X"0F",X"30",X"30",X"30",X"B0",X"30",X"60",X"C0",X"C0", + X"83",X"A2",X"18",X"0E",X"8F",X"9F",X"9F",X"FE",X"80",X"A0",X"D0",X"48",X"68",X"B0",X"00",X"00", + X"FE",X"FE",X"7C",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"00",X"04",X"08",X"18",X"30",X"20",X"E0",X"40", + X"00",X"00",X"71",X"12",X"11",X"16",X"04",X"84",X"00",X"00",X"80",X"60",X"10",X"08",X"08",X"10", + X"40",X"21",X"22",X"40",X"20",X"CA",X"0F",X"03",X"78",X"9E",X"10",X"08",X"04",X"08",X"10",X"C0", + X"23",X"41",X"00",X"A4",X"28",X"10",X"00",X"00",X"B0",X"30",X"30",X"1C",X"0C",X"04",X"02",X"00", + X"00",X"0C",X"32",X"41",X"00",X"06",X"04",X"09",X"01",X"02",X"06",X"0C",X"38",X"3C",X"5C",X"A8", + X"D3",X"C6",X"87",X"6B",X"F4",X"A0",X"08",X"CC",X"C0",X"C0",X"10",X"40",X"80",X"80",X"00",X"CF", + X"EF",X"EE",X"79",X"28",X"84",X"91",X"0B",X"15",X"98",X"30",X"20",X"20",X"C0",X"00",X"40",X"F8", + X"94",X"C4",X"28",X"D0",X"30",X"30",X"C0",X"00",X"70",X"28",X"64",X"C2",X"C1",X"00",X"00",X"00", + X"00",X"01",X"00",X"42",X"04",X"20",X"84",X"60",X"00",X"00",X"10",X"00",X"00",X"00",X"80",X"00", + X"22",X"50",X"1D",X"1D",X"01",X"C6",X"06",X"19",X"10",X"80",X"60",X"10",X"60",X"00",X"00",X"B2", + X"38",X"84",X"01",X"22",X"00",X"10",X"08",X"02",X"00",X"00",X"40",X"10",X"80",X"20",X"00",X"08", + X"10",X"00",X"08",X"82",X"00",X"41",X"00",X"80",X"00",X"08",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"00",X"00",X"00",X"00",X"0D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"7F",X"00",X"00",X"06",X"00",X"00",X"0C",X"C0",X"C0", + X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"0C",X"00",X"00",X"06",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"65",X"1F",X"0B",X"00",X"00",X"00",X"03",X"00",X"00",X"CC",X"C0", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"18",X"00",X"00",X"18",X"00",X"00", + X"00",X"00",X"00",X"20",X"1A",X"04",X"0A",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"E0", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"80",X"00",X"20",X"10",X"00",X"40",X"20", + X"00",X"00",X"00",X"10",X"1A",X"04",X"0A",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"82",X"01",X"08",X"04",X"20",X"10",X"80",X"40", + X"00",X"00",X"10",X"08",X"0A",X"04",X"0A",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"03",X"03",X"01",X"00",X"00",X"00",X"02",X"02",X"C0",X"82",X"11",X"08",X"80",X"80",X"00",X"00", + X"00",X"04",X"04",X"02",X"03",X"06",X"03",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"03",X"03",X"00",X"00",X"02",X"02",X"10",X"10",X"80",X"00",X"00",X"24",X"24",X"00",X"00",X"00", + X"00",X"01",X"01",X"01",X"01",X"03",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80", + X"03",X"03",X"00",X"00",X"04",X"24",X"20",X"00",X"80",X"80",X"00",X"00",X"40",X"48",X"08",X"00", + X"02",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"06",X"00",X"00",X"0C",X"00",X"00", + X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"06",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"03",X"00",X"02",X"28",X"00",X"00", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"02",X"00",X"03",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"01",X"00",X"01",X"00",X"84",X"00",X"00", + X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"84",X"00",X"01",X"00",X"01",X"00",X"00", + X"00",X"00",X"00",X"02",X"20",X"00",X"00",X"00",X"06",X"00",X"00",X"00",X"02",X"00",X"00",X"00", + X"00",X"00",X"20",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"06",X"00", + X"00",X"08",X"00",X"40",X"00",X"00",X"00",X"00",X"08",X"00",X"09",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"40",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"00",X"08",X"00", + X"20",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"00",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"20",X"00",X"00",X"00",X"20",X"00",X"22",X"00",X"00",X"00", + X"00",X"C0",X"00",X"01",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"01",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00", + X"20",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00", + X"00",X"00",X"01",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"05",X"1F",X"36",X"39",X"72",X"E0",X"E8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"04",X"02",X"02",X"35",X"10",X"72",X"25",X"2A",X"80",X"58",X"50", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"11",X"4C",X"60",X"01",X"86", + X"00",X"00",X"18",X"1A",X"10",X"02",X"19",X"0A",X"10",X"42",X"40",X"00",X"10",X"40",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"01",X"80",X"61",X"0C",X"10",X"84",X"80", + X"00",X"20",X"28",X"20",X"04",X"42",X"10",X"10",X"00",X"00",X"00",X"10",X"00",X"40",X"00",X"00", + X"00",X"01",X"00",X"00",X"02",X"81",X"00",X"40",X"00",X"0D",X"68",X"10",X"00",X"82",X"00",X"00", + X"40",X"10",X"00",X"00",X"00",X"A0",X"20",X"00",X"00",X"00",X"00",X"20",X"00",X"80",X"00",X"00", + X"00",X"08",X"01",X"00",X"00",X"80",X"80",X"20",X"19",X"00",X"80",X"00",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"01",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"80",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"02",X"00",X"80",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"40",X"00",X"00",X"00",X"00",X"08", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"09",X"30",X"1F",X"63",X"4E",X"D9",X"00",X"90",X"F4",X"E6",X"28",X"CC",X"46",X"B3", + X"E3",X"7B",X"7C",X"1F",X"25",X"30",X"0F",X"02",X"C6",X"F6",X"DC",X"68",X"9E",X"24",X"80",X"80", + X"00",X"00",X"04",X"19",X"08",X"3F",X"2F",X"6C",X"00",X"C0",X"E0",X"F4",X"26",X"88",X"8E",X"E7", + X"E1",X"3D",X"0E",X"23",X"80",X"0F",X"02",X"00",X"EE",X"DC",X"68",X"9C",X"28",X"00",X"00",X"00", + X"00",X"00",X"00",X"05",X"01",X"00",X"1F",X"3E",X"00",X"00",X"C0",X"E0",X"FC",X"38",X"9C",X"1E", + X"38",X"1D",X"16",X"10",X"0F",X"02",X"00",X"00",X"D4",X"B8",X"D0",X"18",X"80",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"01",X"0C",X"1E",X"00",X"00",X"00",X"80",X"D0",X"F8",X"10",X"CC", + X"0C",X"06",X"0C",X"07",X"01",X"00",X"00",X"00",X"B0",X"D0",X"00",X"80",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"07",X"04",X"0E",X"00",X"00",X"00",X"40",X"D0",X"B0",X"50",X"E8", + X"06",X"04",X"01",X"01",X"00",X"00",X"00",X"00",X"A0",X"80",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"06",X"00",X"00",X"00",X"00",X"40",X"E0",X"60",X"70", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"C0",X"80",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0E",X"12",X"06",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0", + X"07",X"0F",X"06",X"12",X"0E",X"00",X"00",X"00",X"F0",X"E0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"07",X"09",X"06",X"0F",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0", + X"1F",X"0F",X"25",X"1C",X"00",X"00",X"00",X"00",X"F0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"02",X"05",X"00",X"07",X"03",X"0F",X"00",X"00",X"00",X"80",X"80",X"00",X"C0",X"C0", + X"0F",X"2D",X"1C",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"70",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"00",X"02",X"01",X"0B",X"27",X"00",X"00",X"80",X"40",X"40",X"80",X"80",X"C0", + X"27",X"19",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"60",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"15",X"27",X"00",X"00",X"00",X"40",X"20",X"E0",X"E0",X"80", + X"17",X"1B",X"03",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"E0",X"E0",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"05",X"0B",X"0B",X"00",X"00",X"00",X"10",X"48",X"68",X"F8",X"C0", + X"0D",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"E0",X"E0",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"04",X"09",X"0B",X"0F",X"01",X"00",X"00",X"00",X"10",X"48",X"E8",X"F8",X"C0", + X"03",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"0E",X"12",X"06",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0", + X"07",X"0F",X"06",X"12",X"0E",X"00",X"00",X"00",X"F0",X"E0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"06",X"0A",X"06",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0", + X"07",X"0F",X"06",X"0A",X"06",X"00",X"00",X"00",X"F0",X"E0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"04",X"0A",X"06",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0", + X"07",X"0F",X"06",X"0A",X"04",X"00",X"00",X"00",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"06",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0", + X"07",X"03",X"06",X"02",X"00",X"00",X"00",X"00",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"03",X"03",X"06",X"00",X"00",X"00",X"00",X"00",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"06",X"02",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"FE",X"1E",X"06",X"06",X"06",X"06",X"06",X"06", + X"C0",X"C0",X"C0",X"C0",X"C0",X"F0",X"FF",X"00",X"06",X"06",X"06",X"06",X"06",X"1E",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"06",X"08",X"DF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"DF",X"08",X"06",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"37",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"37",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0D",X"00",X"00",X"00",X"00",X"00",X"40",X"80",X"FF", + X"0D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"80",X"40",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"7F", + X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"20",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"DF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DF",X"10",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"2F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2F",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"54",X"7C",X"00",X"78",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"78",X"00",X"6C",X"50",X"7C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"1E",X"3E",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"3E",X"1E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"1C",X"3C",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"3C",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"38",X"78",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"78",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"70",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"60",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"60",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GALAXIAN_1K.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GALAXIAN_1K.vhd new file mode 100644 index 00000000..75eca2cc --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GALAXIAN_1K.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_1K is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_1K is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"02",X"02",X"FE",X"FE",X"42",X"02",X"00",X"00", + X"62",X"F2",X"BA",X"9A",X"9E",X"CE",X"46",X"00",X"8C",X"DE",X"F2",X"B2",X"92",X"86",X"04",X"00", + X"08",X"FE",X"FE",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BE",X"A2",X"A2",X"A2",X"E6",X"E4",X"00", + X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"C0",X"E0",X"B0",X"9E",X"8E",X"C0",X"C0",X"00", + X"0C",X"6E",X"9A",X"9A",X"B2",X"F2",X"6C",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00", + X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00",X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00", + X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00",X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00", + X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00",X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00", + X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00",X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00", + X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00",X"FC",X"FE",X"02",X"02",X"02",X"06",X"04",X"00", + X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00",X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00", + X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00",X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00", + X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00",X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00", + X"7A",X"FC",X"8E",X"8A",X"82",X"FE",X"7C",X"00",X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00", + X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00",X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00", + X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00",X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0",X"00", + X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00",X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00", + X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00",X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"E0",X"F0",X"FB",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"D0",X"00",X"00", + X"81",X"42",X"24",X"18",X"18",X"24",X"42",X"81",X"00",X"18",X"18",X"18",X"18",X"18",X"00",X"00", + X"00",X"00",X"00",X"00",X"06",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00", + X"00",X"28",X"28",X"28",X"28",X"28",X"00",X"00",X"00",X"41",X"FF",X"FF",X"41",X"00",X"68",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"0E",X"0E",X"0C",X"1D",X"3F",X"E1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"1D",X"0C",X"0E",X"0E",X"07",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"06",X"0E",X"1C",X"3E",X"AD",X"E1",X"ED", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E1",X"AD",X"3E",X"1C",X"0E",X"06",X"03",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"03",X"0F",X"03",X"01",X"01",X"03",X"FF",X"FC",X"F0",X"F0",X"F0",X"F0",X"E0",X"E0", + X"03",X"07",X"07",X"0F",X"3B",X"F8",X"FB",X"F8",X"E0",X"E0",X"F0",X"FC",X"EE",X"0F",X"EF",X"0F", + X"FB",X"F8",X"3B",X"0F",X"07",X"07",X"03",X"03",X"EF",X"0F",X"EE",X"FC",X"F0",X"E0",X"E0",X"E0", + X"01",X"01",X"03",X"0F",X"03",X"01",X"00",X"00",X"E0",X"F0",X"F0",X"F0",X"F0",X"FC",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"29",X"26",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"18",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"2B",X"66",X"C1",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"48", + X"46",X"39",X"0A",X"00",X"00",X"00",X"00",X"00",X"90",X"00",X"00",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"04",X"10",X"12",X"0A",X"1D",X"00",X"00",X"04",X"00",X"10",X"04",X"88",X"00", + X"18",X"20",X"11",X"00",X"02",X"00",X"00",X"00",X"00",X"44",X"20",X"10",X"40",X"20",X"00",X"00", + X"00",X"40",X"80",X"20",X"40",X"11",X"19",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"16",X"10",X"00",X"18",X"0E",X"06",X"03",X"33",X"20",X"21",X"7E",X"7F",X"09",X"06",X"00",X"10", + X"33",X"00",X"10",X"38",X"3C",X"66",X"6A",X"31",X"3D",X"3D",X"11",X"3F",X"3E",X"10",X"00",X"40", + X"11",X"40",X"80",X"20",X"56",X"10",X"7F",X"7F",X"80",X"20",X"40",X"10",X"38",X"3C",X"6E",X"66", + X"10",X"16",X"00",X"00",X"01",X"09",X"3B",X"0F",X"33",X"11",X"00",X"18",X"0E",X"06",X"03",X"33", + X"06",X"00",X"0C",X"0C",X"0C",X"0C",X"0C",X"40",X"33",X"00",X"28",X"28",X"7F",X"7E",X"28",X"28", + X"80",X"23",X"4F",X"1E",X"38",X"00",X"1E",X"07",X"00",X"0C",X"02",X"09",X"00",X"08",X"00",X"20", + X"00",X"08",X"04",X"06",X"03",X"7F",X"7F",X"00",X"40",X"10",X"26",X"0C",X"18",X"7F",X"7F",X"00", + X"00",X"00",X"00",X"03",X"06",X"2D",X"1F",X"0F",X"20",X"40",X"C8",X"FC",X"FE",X"F4",X"F0",X"F8", + X"1F",X"1F",X"4D",X"37",X"07",X"0D",X"07",X"02",X"FC",X"FC",X"FA",X"F0",X"F4",X"DC",X"08",X"20", + X"00",X"00",X"00",X"00",X"05",X"03",X"07",X"07",X"00",X"00",X"00",X"00",X"20",X"80",X"E0",X"C0", + X"07",X"07",X"02",X"09",X"00",X"00",X"00",X"00",X"E0",X"E0",X"D0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"20",X"10",X"0D",X"07",X"03",X"00",X"00",X"08",X"10",X"40",X"84",X"F8",X"C0", + X"09",X"35",X"46",X"05",X"08",X"00",X"00",X"00",X"80",X"C0",X"A0",X"80",X"40",X"40",X"00",X"00", + X"10",X"88",X"04",X"21",X"01",X"0F",X"E7",X"3F",X"14",X"84",X"18",X"30",X"D0",X"C0",X"E0",X"F0", + X"0F",X"0F",X"17",X"07",X"47",X"0D",X"10",X"20",X"FC",X"F3",X"F0",X"F4",X"B0",X"50",X"08",X"04", + X"3C",X"42",X"81",X"A5",X"A5",X"99",X"42",X"3C",X"20",X"10",X"0E",X"10",X"20",X"0E",X"14",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"14",X"0E",X"00",X"3E",X"10",X"08",X"10",X"3E", + X"01",X"02",X"06",X"0C",X"1C",X"19",X"3B",X"37",X"80",X"40",X"20",X"00",X"00",X"80",X"00",X"A0", + X"37",X"3B",X"19",X"1C",X"0C",X"06",X"02",X"01",X"A0",X"00",X"80",X"00",X"00",X"20",X"40",X"80", + X"00",X"01",X"07",X"0E",X"1E",X"1D",X"3B",X"3F",X"40",X"A0",X"10",X"00",X"00",X"80",X"C0",X"00", + X"37",X"33",X"31",X"18",X"08",X"08",X"05",X"06",X"A0",X"00",X"80",X"00",X"00",X"80",X"00",X"00", + X"00",X"00",X"03",X"0F",X"1E",X"3D",X"3B",X"3F",X"00",X"30",X"E8",X"88",X"08",X"80",X"C0",X"80", + X"37",X"32",X"31",X"30",X"10",X"12",X"1C",X"00",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"0F",X"1F",X"1D",X"3B",X"3F",X"00",X"00",X"FC",X"E4",X"04",X"84",X"C0",X"A0", + X"37",X"32",X"31",X"20",X"20",X"3C",X"00",X"00",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"07",X"0F",X"1F",X"1D",X"3B",X"37",X"00",X"00",X"F0",X"FE",X"02",X"82",X"C4",X"A0", + X"37",X"22",X"60",X"40",X"78",X"00",X"00",X"00",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"0F",X"1F",X"3D",X"3B",X"67",X"00",X"00",X"E0",X"F0",X"1C",X"83",X"C1",X"E2", + X"46",X"82",X"40",X"20",X"00",X"00",X"00",X"00",X"A4",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"0F",X"1E",X"39",X"63",X"87",X"00",X"00",X"C0",X"F0",X"78",X"9C",X"C6",X"E1", + X"85",X"40",X"21",X"00",X"00",X"00",X"00",X"00",X"A1",X"02",X"84",X"00",X"00",X"00",X"00",X"00", + X"01",X"02",X"06",X"0C",X"1C",X"19",X"3B",X"37",X"80",X"40",X"20",X"00",X"00",X"80",X"00",X"80", + X"37",X"3B",X"19",X"1C",X"0C",X"06",X"02",X"01",X"80",X"00",X"80",X"00",X"00",X"20",X"40",X"80", + X"00",X"01",X"02",X"06",X"0C",X"0C",X"1D",X"1B",X"00",X"80",X"40",X"00",X"00",X"00",X"80",X"80", + X"1B",X"1D",X"0C",X"0C",X"06",X"02",X"01",X"00",X"80",X"80",X"00",X"00",X"00",X"40",X"80",X"00", + X"00",X"00",X"01",X"02",X"04",X"0C",X"1D",X"1B",X"00",X"00",X"80",X"40",X"00",X"00",X"80",X"80", + X"1B",X"1D",X"0C",X"04",X"02",X"01",X"00",X"00",X"80",X"80",X"00",X"00",X"40",X"80",X"00",X"00", + X"00",X"00",X"00",X"01",X"02",X"06",X"0D",X"0F",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00", + X"0F",X"0D",X"06",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"02",X"04",X"0F",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"0F",X"04",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"07",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"07",X"0C",X"00",X"03",X"0F",X"1C",X"30",X"61",X"63",X"C3", + X"08",X"10",X"30",X"20",X"1C",X"08",X"05",X"09",X"C7",X"AF",X"07",X"31",X"7C",X"7E",X"FF",X"FF", + X"08",X"18",X"38",X"1D",X"0E",X"03",X"00",X"00",X"F7",X"7F",X"FF",X"F3",X"7F",X"9F",X"FB",X"2C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0E",X"1F",X"0F",X"06",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"18",X"0D",X"C2",X"24", + X"00",X"02",X"02",X"01",X"00",X"01",X"01",X"02",X"62",X"27",X"10",X"E6",X"9A",X"1C",X"68",X"20", + X"05",X"04",X"02",X"01",X"00",X"01",X"01",X"01",X"C1",X"20",X"18",X"08",X"C8",X"C4",X"FF",X"8A", + X"01",X"06",X"08",X"00",X"00",X"00",X"00",X"00",X"72",X"11",X"20",X"20",X"13",X"0C",X"00",X"00", + X"00",X"00",X"01",X"02",X"04",X"09",X"19",X"19",X"00",X"00",X"80",X"F3",X"7F",X"FF",X"FF",X"DF", + X"1B",X"07",X"07",X"09",X"0F",X"0F",X"05",X"0D",X"37",X"8F",X"C7",X"82",X"01",X"87",X"E1",X"F9", + X"0E",X"07",X"07",X"0B",X"0F",X"3F",X"7F",X"3D",X"FF",X"7F",X"EF",X"F6",X"74",X"8D",X"8B",X"8E", + X"3D",X"19",X"33",X"07",X"07",X"01",X"00",X"00",X"DF",X"F7",X"FB",X"DF",X"8B",X"8B",X"04",X"02", + X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"04",X"A8",X"08",X"10",X"05",X"02", + X"01",X"00",X"00",X"28",X"02",X"00",X"00",X"00",X"01",X"06",X"4F",X"AF",X"6F",X"BF",X"BF",X"7F", + X"02",X"0C",X"88",X"20",X"00",X"00",X"00",X"02",X"7F",X"7F",X"3A",X"1D",X"2F",X"84",X"03",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"16",X"09",X"17",X"20",X"00",X"80",X"00", + X"00",X"10",X"FB",X"7D",X"30",X"11",X"80",X"38",X"00",X"00",X"00",X"80",X"40",X"20",X"10",X"10", + X"DE",X"FF",X"FF",X"FF",X"7F",X"FF",X"FF",X"FF",X"08",X"08",X"14",X"94",X"28",X"48",X"90",X"B8", + X"FF",X"E2",X"78",X"FE",X"FF",X"FF",X"99",X"FC",X"7C",X"68",X"10",X"01",X"48",X"F0",X"C0",X"80", + X"3D",X"39",X"19",X"C2",X"24",X"18",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"61",X"13",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"12",X"04",X"F1",X"52",X"31",X"36",X"05",X"84",X"C0",X"20",X"A0",X"60",X"30",X"48",X"48",X"90", + X"40",X"21",X"22",X"40",X"20",X"C8",X"0C",X"02",X"60",X"F8",X"30",X"28",X"14",X"18",X"30",X"60", + X"33",X"4F",X"E3",X"A4",X"28",X"10",X"00",X"00",X"70",X"D0",X"10",X"0C",X"04",X"00",X"00",X"00", + X"00",X"0C",X"32",X"47",X"9F",X"EF",X"9F",X"FF",X"00",X"60",X"60",X"50",X"04",X"CE",X"BE",X"78", + X"9C",X"2C",X"74",X"F8",X"F1",X"A3",X"0F",X"CF",X"76",X"6A",X"FC",X"E0",X"E0",X"C0",X"C0",X"E0", + X"EF",X"EF",X"7F",X"2F",X"8F",X"9F",X"3F",X"7E",X"E0",X"D0",X"F0",X"F8",X"F8",X"F0",X"A4",X"80", + X"6F",X"3F",X"DF",X"F8",X"31",X"30",X"C0",X"00",X"88",X"F0",X"F0",X"E0",X"E0",X"C0",X"00",X"00", + X"00",X"01",X"00",X"02",X"04",X"01",X"84",X"20",X"00",X"20",X"00",X"40",X"00",X"00",X"00",X"00", + X"22",X"90",X"C1",X"35",X"F8",X"F6",X"7E",X"F8",X"00",X"80",X"20",X"10",X"62",X"10",X"00",X"00", + X"F8",X"FC",X"ED",X"BC",X"C8",X"74",X"0A",X"02",X"00",X"00",X"40",X"10",X"00",X"40",X"20",X"00", + X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"90",X"00",X"00",X"40",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"00",X"07",X"00",X"01",X"7F",X"08",X"30",X"C0",X"18",X"E0",X"0C",X"D8",X"00", + X"01",X"00",X"07",X"00",X"03",X"00",X"00",X"00",X"C0",X"0C",X"E0",X"18",X"C0",X"30",X"08",X"00", + X"00",X"01",X"00",X"02",X"01",X"61",X"1F",X"03",X"00",X"00",X"D8",X"20",X"CC",X"30",X"CC",X"C0", + X"01",X"0C",X"03",X"0C",X"03",X"00",X"00",X"00",X"98",X"00",X"D8",X"40",X"20",X"80",X"40",X"00", + X"00",X"00",X"00",X"21",X"18",X"04",X"02",X"01",X"00",X"00",X"20",X"98",X"46",X"30",X"CC",X"E0", + X"0D",X"02",X"09",X"04",X"02",X"02",X"01",X"00",X"CC",X"B0",X"00",X"A0",X"90",X"40",X"00",X"00", + X"00",X"00",X"00",X"10",X"08",X"04",X"02",X"01",X"00",X"00",X"00",X"20",X"90",X"4C",X"A2",X"D8", + X"0B",X"05",X"12",X"09",X"05",X"04",X"02",X"00",X"84",X"00",X"28",X"14",X"20",X"90",X"00",X"00", + X"00",X"00",X"10",X"08",X"08",X"04",X"02",X"11",X"00",X"00",X"00",X"00",X"A0",X"90",X"4C",X"A2", + X"13",X"0B",X"25",X"14",X"12",X"0A",X"08",X"00",X"D8",X"84",X"50",X"48",X"80",X"80",X"00",X"00", + X"00",X"04",X"04",X"02",X"02",X"02",X"13",X"4F",X"00",X"00",X"00",X"00",X"50",X"50",X"28",X"A8", + X"2B",X"2B",X"24",X"24",X"2A",X"0A",X"00",X"00",X"A4",X"32",X"08",X"50",X"50",X"00",X"00",X"00", + X"00",X"01",X"01",X"01",X"01",X"09",X"29",X"2B",X"00",X"00",X"00",X"00",X"00",X"20",X"28",X"A8", + X"2B",X"2B",X"48",X"51",X"95",X"04",X"00",X"00",X"A8",X"A8",X"24",X"04",X"42",X"40",X"00",X"00", + X"00",X"00",X"03",X"00",X"07",X"00",X"00",X"00",X"08",X"30",X"C0",X"18",X"E0",X"0C",X"00",X"18", + X"00",X"00",X"07",X"00",X"03",X"00",X"00",X"00",X"00",X"0C",X"E0",X"18",X"C0",X"30",X"08",X"00", + X"00",X"00",X"06",X"00",X"0D",X"00",X"00",X"00",X"04",X"18",X"C0",X"0C",X"B2",X"28",X"00",X"00", + X"00",X"00",X"0D",X"00",X"06",X"00",X"00",X"00",X"00",X"28",X"B2",X"0C",X"C0",X"18",X"04",X"00", + X"00",X"08",X"04",X"80",X"0A",X"00",X"00",X"00",X"0C",X"50",X"86",X"09",X"50",X"84",X"00",X"0A", + X"00",X"00",X"0A",X"10",X"04",X"08",X"00",X"00",X"00",X"84",X"50",X"09",X"86",X"50",X"0C",X"02", + X"10",X"08",X"20",X"16",X"00",X"00",X"00",X"00",X"50",X"82",X"0C",X"20",X"12",X"00",X"00",X"05", + X"00",X"00",X"00",X"16",X"20",X"08",X"10",X"00",X"00",X"00",X"12",X"20",X"0C",X"82",X"50",X"00", + X"08",X"48",X"14",X"00",X"00",X"00",X"00",X"00",X"82",X"0C",X"31",X"00",X"00",X"00",X"00",X"02", + X"00",X"00",X"00",X"00",X"04",X"48",X"08",X"10",X"00",X"00",X"00",X"00",X"31",X"0C",X"82",X"00", + X"60",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"30",X"02",X"00",X"00",X"00",X"00",X"05", + X"00",X"00",X"00",X"00",X"00",X"24",X"60",X"00",X"00",X"00",X"00",X"00",X"02",X"30",X"06",X"01", + X"20",X"84",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"10",X"00",X"04",X"00",X"00",X"00",X"0A", + X"00",X"00",X"00",X"00",X"00",X"84",X"20",X"40",X"00",X"00",X"00",X"04",X"00",X"10",X"20",X"04", + X"04",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"14", + X"00",X"00",X"00",X"00",X"40",X"00",X"04",X"00",X"00",X"00",X"08",X"00",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"0A",X"14",X"00",X"21",X"EA",X"44", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"02",X"14",X"00",X"20",X"00",X"01",X"94",X"80",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"04", + X"00",X"00",X"00",X"00",X"10",X"02",X"01",X"08",X"10",X"00",X"41",X"08",X"40",X"00",X"00",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"01",X"08",X"10",X"00",X"80", + X"00",X"00",X"00",X"20",X"04",X"02",X"00",X"10",X"01",X"10",X"00",X"80",X"00",X"00",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"08",X"10",X"00",X"80",X"00",X"01", + X"40",X"00",X"00",X"02",X"00",X"00",X"20",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"08",X"00",X"80",X"00",X"00",X"00",X"21",X"00", + X"00",X"08",X"00",X"00",X"01",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"80",X"00",X"00",X"01",X"40",X"00",X"00", + X"00",X"00",X"00",X"02",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"05",X"05",X"2F",X"3C",X"7F",X"37",X"66",X"00",X"90",X"34",X"BE",X"F4",X"F4",X"FA",X"7F", + X"FC",X"7C",X"7F",X"3F",X"5F",X"2F",X"14",X"02",X"3E",X"0C",X"20",X"94",X"FA",X"FE",X"64",X"40", + X"00",X"02",X"02",X"17",X"0F",X"3E",X"1B",X"33",X"00",X"C0",X"80",X"D4",X"FE",X"F4",X"FA",X"1F", + X"7E",X"3E",X"1F",X"1F",X"0F",X"14",X"02",X"00",X"16",X"20",X"94",X"F8",X"FC",X"68",X"40",X"00", + X"00",X"00",X"02",X"03",X"0F",X"07",X"1D",X"19",X"00",X"00",X"C0",X"C8",X"FC",X"F8",X"74",X"FE", + X"3F",X"1E",X"1F",X"0F",X"04",X"02",X"00",X"00",X"2C",X"40",X"28",X"F0",X"50",X"40",X"00",X"00", + X"00",X"00",X"00",X"02",X"05",X"03",X"0F",X"0D",X"00",X"00",X"00",X"80",X"90",X"F8",X"E0",X"3C", + X"0F",X"07",X"0B",X"02",X"01",X"00",X"00",X"00",X"40",X"20",X"F8",X"50",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"07",X"07",X"05",X"00",X"00",X"00",X"40",X"90",X"F0",X"F0",X"18", + X"07",X"03",X"00",X"01",X"00",X"00",X"00",X"00",X"50",X"E0",X"D0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"40",X"E0",X"E0",X"B0", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"A0", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"A0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"07",X"06",X"00",X"00",X"C0",X"C0",X"B0",X"70",X"60",X"00", + X"00",X"06",X"07",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"60",X"70",X"B0",X"C0",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"07",X"06",X"00",X"00",X"00",X"60",X"E0",X"D8",X"B8",X"20",X"00", + X"0C",X"0C",X"02",X"02",X"03",X"01",X"01",X"00",X"00",X"00",X"C0",X"E0",X"60",X"80",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"38",X"70",X"C8",X"3C",X"38", + X"0C",X"0E",X"02",X"07",X"06",X"07",X"02",X"00",X"00",X"00",X"80",X"C0",X"C0",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"06",X"00",X"00",X"00",X"00",X"38",X"FC",X"80",X"38", + X"06",X"06",X"0D",X"0D",X"0D",X"04",X"00",X"00",X"3C",X"00",X"80",X"80",X"80",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"00",X"00",X"00",X"00",X"00",X"C0",X"DC",X"7E", + X"06",X"04",X"0C",X"1B",X"1B",X"17",X"12",X"00",X"14",X"38",X"1C",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"60",X"64",X"3E", + X"02",X"0E",X"3D",X"3B",X"06",X"06",X"00",X"00",X"0E",X"18",X"1C",X"0C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"1E",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"3C", + X"38",X"36",X"0E",X"0C",X"00",X"00",X"00",X"00",X"0E",X"36",X"38",X"18",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"07",X"06",X"00",X"00",X"C0",X"C0",X"B0",X"70",X"60",X"00", + X"00",X"06",X"07",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"60",X"70",X"B0",X"C0",X"C0",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"07",X"06",X"00",X"00",X"00",X"C0",X"C0",X"B0",X"60",X"00", + X"00",X"06",X"07",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"60",X"B0",X"C0",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"06",X"00",X"00",X"00",X"00",X"C0",X"A0",X"60",X"00", + X"00",X"06",X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"A0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"02",X"00",X"00",X"00",X"00",X"C0",X"A0",X"60",X"00", + X"00",X"02",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"A0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"02",X"00",X"00",X"00",X"00",X"80",X"40",X"80",X"00", + X"00",X"02",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"80", + X"00",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"80",X"B0",X"A0",X"A0",X"A0",X"A0",X"A0",X"FE",X"02",X"1A",X"0A",X"0A",X"0A",X"0A",X"0A", + X"A0",X"A0",X"A0",X"A0",X"B0",X"80",X"FF",X"00",X"0A",X"0A",X"0A",X"0A",X"1A",X"02",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"2D",X"00",X"00",X"00",X"00",X"00",X"10",X"38",X"40", + X"2D",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"38",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"00",X"00",X"00",X"00",X"00",X"08",X"1C",X"A0", + X"0A",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"1C",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"04",X"0C",X"50", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"50",X"0C",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"46",X"A8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A8",X"46",X"02",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"23",X"34", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"34",X"23",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"1A", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1A",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"38",X"44",X"7C",X"00",X"7C",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"7C",X"00",X"54",X"54",X"7C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"1E",X"21",X"D1",X"19",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"19",X"D1",X"21",X"1E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"1C",X"22",X"D2",X"1A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1A",X"D2",X"22",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"38",X"44",X"A4",X"34",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"34",X"A4",X"44",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"48",X"88",X"68",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"68",X"88",X"48",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"20",X"50",X"90",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"50",X"90",X"50",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"60",X"A0",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"A0",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"A0",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"A0",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GALAXIAN_6L.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GALAXIAN_6L.vhd new file mode 100644 index 00000000..9cf7380a --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GALAXIAN_6L.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_6L is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_6L is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"7A",X"36",X"07",X"00",X"F0",X"38",X"1F",X"00",X"C7",X"F0",X"3F",X"00",X"DB",X"C6",X"38", + X"00",X"36",X"07",X"F0",X"00",X"33",X"3F",X"DB",X"00",X"3F",X"57",X"C6",X"00",X"C6",X"3F",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GAL_FIR.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GAL_FIR.vhd new file mode 100644 index 00000000..5aff2022 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GAL_FIR.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_FIR 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 prom of GAL_FIR is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AC",X"68",X"72",X"C7",X"93",X"3F",X"80",X"C8",X"5C",X"A1",X"22",X"90",X"B9",X"8A",X"41",X"62", + X"C2",X"A1",X"40",X"6A",X"C9",X"7F",X"64",X"3C",X"BC",X"AD",X"5B",X"4C",X"D4",X"62",X"3D",X"D3", + X"7F",X"31",X"A3",X"BE",X"5D",X"49",X"C7",X"7D",X"28",X"C0",X"A1",X"7A",X"7D",X"2B",X"C9",X"91", + X"80",X"6B",X"39",X"95",X"BA",X"91",X"27",X"C1",X"91",X"7E",X"6D",X"31",X"C0",X"A4",X"7C",X"7B", + X"37",X"80",X"CB",X"7E",X"88",X"64",X"40",X"8F",X"C3",X"83",X"83",X"68",X"36",X"D0",X"8C",X"29", + X"B4",X"B1",X"52",X"4B",X"E9",X"3E",X"74",X"C4",X"73",X"81",X"2B",X"AD",X"B9",X"4E",X"4B",X"CB", + X"91",X"76",X"33",X"B6",X"A5",X"6E",X"4A",X"63",X"D7",X"7C",X"3E",X"7E",X"DE",X"45",X"67",X"C1", + X"84",X"2D",X"A8",X"A9",X"20",X"AC",X"B5",X"7E",X"47",X"5F",X"DD",X"6E",X"44",X"BD",X"97",X"22", + X"AE",X"A4",X"25",X"CB",X"93",X"77",X"3C",X"78",X"CB",X"83",X"29",X"B3",X"AB",X"7D",X"5D",X"44", + X"A4",X"BC",X"79",X"8C",X"3A",X"76",X"CF",X"78",X"44",X"6B",X"D9",X"6B",X"3B",X"9A",X"CC",X"26", + X"A4",X"A3",X"1D",X"BA",X"A9",X"83",X"71",X"3A",X"8B",X"CC",X"6A",X"3E",X"E5",X"28",X"A4",X"A3", + X"1E",X"C9",X"9C",X"78",X"32",X"94",X"C4",X"74",X"88",X"2A",X"A2",X"BC",X"1A",X"E2",X"4B",X"86", + X"B3",X"72",X"48",X"68",X"D2",X"83",X"32",X"A4",X"B2",X"73",X"4E",X"5A",X"C8",X"9C",X"2C",X"90", + X"C1",X"7B",X"5E",X"41",X"CC",X"99",X"6F",X"3A",X"8B",X"C9",X"7A",X"84",X"23",X"BC",X"9D",X"33", + X"CC",X"82",X"24",X"D7",X"6C",X"47",X"D1",X"87",X"5C",X"41",X"C5",X"9F",X"71",X"35",X"A8",X"B9", + X"67",X"4F",X"5F",X"CE",X"8A",X"43",X"C6",X"80",X"54",X"4A",X"B1",X"AE",X"87",X"50",X"4F",X"C6", + X"9F",X"55",X"45",X"BB",X"AC",X"5C",X"41",X"A9",X"BE",X"5C",X"4C",X"72",X"D4",X"71",X"42",X"DA", + X"20",X"CF",X"6C",X"3D",X"D5",X"8A",X"78",X"39",X"7B",X"BF",X"99",X"75",X"37",X"99",X"C7",X"28", + X"7B",X"C3",X"91",X"58",X"46",X"9D",X"BB",X"88",X"60",X"40",X"9A",X"BB",X"8C",X"3B",X"6A",X"BA", + X"AC",X"31",X"7F",X"C8",X"2F",X"78",X"DC",X"33",X"AE",X"80",X"34",X"EE",X"38",X"74",X"D5",X"1F", + X"98",X"BA",X"82",X"58",X"4A",X"D6",X"86",X"56",X"49",X"F0",X"34",X"73",X"BD",X"9A",X"43",X"67", + X"C3",X"8D",X"2E",X"8B",X"B9",X"40",X"C6",X"33",X"B7",X"A5",X"27",X"8A",X"BA",X"42",X"BF",X"8A", + X"3A",X"6F",X"D1",X"5C",X"41",X"DF",X"6A",X"42",X"C3",X"A4",X"33",X"80",X"CC",X"5C",X"43",X"89", + X"BE",X"96",X"53",X"4E",X"8D",X"D4",X"2E",X"BD",X"56",X"6C",X"DA",X"53",X"47",X"9C",X"C8",X"2A", + X"75",X"B3",X"B0",X"2F",X"80",X"CA",X"2B",X"81",X"CD",X"35",X"7E",X"CE",X"32",X"81",X"CD",X"74", + X"40",X"74",X"D8",X"4E",X"58",X"D3",X"85",X"4D",X"53",X"AE",X"B8",X"61",X"3D",X"9F",X"C3",X"30", + X"86",X"D0",X"5E",X"47",X"7D",X"C6",X"91",X"4E",X"4E",X"A9",X"B9",X"6D",X"34",X"9F",X"B7",X"3F", + X"C6",X"7A",X"37",X"81",X"C5",X"8C",X"33",X"88",X"D3",X"44",X"59",X"82",X"C8",X"88",X"42",X"61", + X"AF",X"A2",X"44",X"D9",X"48",X"52",X"89",X"BC",X"99",X"2E",X"7E",X"B4",X"38",X"B7",X"9E",X"20", + X"E4",X"56",X"63",X"D9",X"56",X"43",X"B1",X"B8",X"37",X"6B",X"D3",X"6D",X"31",X"C8",X"65",X"8D", + X"B9",X"0B",X"BA",X"86",X"4D",X"D7",X"4E",X"4B",X"E7",X"3C",X"95",X"AD",X"1D",X"D8",X"72",X"35", + X"B4",X"A5",X"2F",X"B3",X"B6",X"44",X"57",X"93",X"CB",X"67",X"3F",X"A1",X"C7",X"21",X"89",X"9C", + X"5A",X"D8",X"20",X"A3",X"BA",X"25",X"89",X"AD",X"37",X"D8",X"5D",X"53",X"DC",X"77",X"43",X"70", + X"E1",X"46",X"59",X"83",X"CC",X"6E",X"37",X"E7",X"56",X"4E",X"86",X"D3",X"27",X"9E",X"AA",X"44", + X"C0",X"19",X"E9",X"54",X"63",X"DB",X"51",X"4D",X"88",X"CF",X"30",X"91",X"C5",X"66",X"35",X"C1", + X"9C",X"33",X"79",X"A7",X"BA",X"53",X"41",X"DD",X"4B",X"73",X"D2",X"25",X"7F",X"BB",X"9D",X"37", + X"68",X"A9",X"BD",X"3B",X"5C",X"CF",X"61",X"47",X"C9",X"9E",X"47",X"55",X"AF",X"96",X"5D",X"D0", + X"28",X"7E",X"D3",X"48",X"51",X"C7",X"95",X"21",X"BB",X"A6",X"3A",X"67",X"C3",X"81",X"37",X"DE", + X"7D",X"3F",X"72",X"AA",X"B4",X"15",X"DC",X"6C",X"47",X"D2",X"71",X"28",X"EB",X"2E",X"9F",X"93", + X"6C",X"9C",X"37",X"DB",X"43",X"AC",X"37",X"D3",X"4F",X"AC",X"8D",X"1B",X"DF",X"7E",X"46",X"6B", + X"BA",X"A5",X"35",X"73",X"CB",X"41",X"7E",X"C8",X"1D",X"D3",X"60",X"5F",X"DB",X"44",X"57",X"C2", + X"A2",X"41",X"5B",X"AE",X"96",X"5E",X"CC",X"10",X"CF",X"83",X"31",X"DF",X"59",X"46",X"CC",X"87", + X"28",X"D7",X"84",X"3D",X"7A",X"DD",X"3A",X"7B",X"C8",X"36",X"66",X"C8",X"60",X"9A",X"8F",X"29", + X"A8",X"B3",X"83",X"1F",X"D6",X"81",X"33",X"C4",X"82",X"2A",X"D4",X"6B",X"70",X"CA",X"1B",X"A9", + X"AB",X"22",X"AE",X"9E",X"49",X"D3",X"45",X"5A",X"A1",X"BB",X"70",X"27",X"E9",X"49",X"72",X"CC", + X"38",X"67",X"B6",X"AD",X"41",X"57",X"B7",X"8C",X"39",X"E4",X"70",X"4B",X"63",X"C7",X"52",X"AE", + X"8A",X"36",X"8A",X"BB",X"8E",X"2F",X"87",X"AB",X"B2",X"2D",X"72",X"94",X"CD",X"39",X"67",X"D9", + X"2B",X"86",X"C8",X"50",X"4D",X"BC",X"A1",X"3F",X"6B",X"BC",X"7C",X"48",X"E0",X"20",X"BA",X"83", + X"43",X"D4",X"26",X"BD",X"A2",X"3E",X"6C",X"CA",X"8A",X"38",X"7B",X"AF",X"AE",X"23",X"91",X"C0", + X"37",X"76",X"A3",X"C2",X"39",X"63",X"D9",X"48",X"5A",X"93",X"C9",X"43",X"62",X"90",X"B1",X"37", + X"D1",X"53",X"74",X"B1",X"37",X"F6",X"23",X"82",X"C3",X"52",X"4A",X"BB",X"75",X"95",X"88",X"3D", + X"90",X"C3",X"76",X"3B",X"87",X"A9",X"70",X"A6",X"61",X"4F",X"AE",X"B6",X"50",X"4B",X"E2",X"4A", + X"63",X"DC",X"3E",X"63",X"92",X"CC",X"4F",X"4D",X"E3",X"4A",X"5B",X"89",X"D0",X"47",X"5E",X"90", + X"D0",X"49",X"5B",X"7E",X"C6",X"76",X"3E",X"8C",X"AA",X"A4",X"15",X"CD",X"89",X"43",X"80",X"BD", + X"65",X"A8",X"3D",X"8E",X"CF",X"0B",X"C0",X"8E",X"46",X"76",X"C9",X"7A",X"3E",X"88",X"AA",X"A8", + X"18",X"BF",X"9C",X"2E",X"C3",X"85",X"2B",X"DC",X"6C",X"45",X"DB",X"4B",X"5F",X"92",X"AD",X"3D", + X"C3",X"4F",X"86",X"A6",X"75",X"81",X"36",X"E7",X"37",X"A6",X"7D",X"A5",X"5A",X"58",X"D8",X"4E", + X"56",X"AB",X"8E",X"49",X"DD",X"68",X"40",X"8A",X"B0",X"53",X"C3",X"4F",X"60",X"92",X"C6",X"51", + X"54",X"9A",X"C5",X"55",X"4D",X"93",X"C2",X"70",X"2F",X"E3",X"50",X"5B",X"8D",X"AF",X"48",X"AA", + X"81",X"98",X"4C",X"65",X"C1",X"66",X"BB",X"23",X"B0",X"9B",X"39",X"83",X"A4",X"B3",X"1A",X"B0", + X"9D",X"31",X"C3",X"8E",X"2B",X"E2",X"54",X"5A",X"DC",X"32",X"86",X"CA",X"14",X"C9",X"83",X"43", + X"83",X"AD",X"A6",X"15",X"DA",X"6D",X"4C",X"87",X"AF",X"63",X"B9",X"3A",X"8C",X"C5",X"0D",X"CC", + X"79",X"58",X"74",X"C9",X"7D",X"42",X"7C",X"B7",X"5C",X"A9",X"7B",X"41",X"93",X"B6",X"81",X"32", + X"9D",X"92",X"6B",X"87",X"9D",X"94",X"4A",X"6C",X"B7",X"A4",X"1B",X"BD",X"88",X"4D",X"7D",X"BD", + X"4D",X"99",X"8A",X"51",X"CF",X"1B",X"F2",X"56",X"5A",X"72",X"C3",X"4B",X"BE",X"63",X"52",X"E1", + X"2F",X"77",X"91",X"93",X"52",X"C0",X"37",X"E1",X"53",X"5A",X"DA",X"35",X"77",X"85",X"D5",X"39", + X"6D",X"80",X"D3",X"50",X"58",X"D3",X"2D",X"9A",X"B2",X"23",X"BC",X"8C",X"52",X"71",X"C1",X"8D", + X"3E",X"76",X"B3",X"6F",X"6D",X"A1",X"49",X"C9",X"2E",X"D1",X"38",X"C6",X"55",X"8B",X"7C",X"86", + X"B2",X"33",X"7E",X"AD",X"99",X"3C",X"80",X"A3",X"6E",X"88",X"98",X"50",X"AA",X"79",X"99",X"27", + X"FB",X"1D",X"AE",X"63",X"8F",X"94",X"51",X"B0",X"4A",X"AD",X"86",X"8B",X"39",X"EA",X"1B",X"AB", + X"9A",X"4C",X"73",X"B8",X"9A",X"3A",X"76",X"AC",X"64",X"88",X"8B",X"6D",X"A6",X"71",X"97",X"40", + X"8C",X"B5",X"4A",X"A0",X"68",X"86",X"8C",X"98",X"69",X"59",X"DE",X"1F",X"AB",X"A0",X"36",X"A8", + X"A7",X"28",X"E0",X"58",X"59",X"CE",X"37",X"82",X"C8",X"2E",X"A4",X"5A",X"AF",X"62",X"8E",X"C2", + X"2D",X"79",X"91",X"C2",X"2A",X"96",X"77",X"8A",X"99",X"8E",X"3D",X"C7",X"61",X"57",X"9D",X"A3", + X"44",X"DE",X"34",X"88",X"B1",X"37",X"89",X"A3",X"B3",X"15",X"CB",X"73",X"43",X"BA",X"8D",X"47", + X"9D",X"6F",X"C9",X"15",X"D1",X"72",X"53",X"CA",X"48",X"6B",X"9B",X"89",X"6A",X"A0",X"57",X"BE", + X"45",X"9C",X"A5",X"5E",X"54",X"CA",X"63",X"52",X"E1",X"25",X"AE",X"93",X"35",X"E5",X"2A",X"A5", + X"97",X"40",X"8A",X"9A",X"73",X"81",X"8E",X"57",X"CC",X"68",X"67",X"5D",X"C5",X"94",X"43",X"6E", + X"AA",X"A8",X"30",X"9D",X"6E",X"B3",X"6B",X"4B",X"AB",X"79",X"90",X"93",X"50",X"89",X"81",X"8A", + X"A4",X"42",X"9B",X"7F",X"67",X"9F",X"A8",X"48",X"80",X"BA",X"23",X"C5",X"6A",X"5E",X"91",X"99", + X"62",X"9A",X"91",X"6A",X"5A",X"D9",X"3D",X"81",X"B2",X"34",X"C5",X"7A",X"3F",X"BB",X"90",X"3D", + X"D0",X"50",X"65",X"95",X"94",X"63",X"C6",X"2D",X"A6",X"91",X"3D",X"CA",X"5F",X"66",X"91",X"97", + X"A6",X"35",X"A6",X"97",X"2E",X"D9",X"41",X"8F",X"A4",X"3E",X"A2",X"B0",X"2E",X"B5",X"7A",X"55", + X"C9",X"3F",X"84",X"C3",X"42",X"8A",X"72",X"9F",X"65",X"95",X"72",X"84",X"8A",X"58",X"C6",X"73", + X"47",X"D9",X"35",X"90",X"9F",X"4D",X"80",X"A8",X"A1",X"30",X"8F",X"8B",X"C5",X"18",X"B5",X"70", + X"65",X"B0",X"5D",X"93",X"93",X"7B",X"48",X"CB",X"52",X"7D",X"B0",X"3D",X"98",X"BA",X"2E",X"AD", + X"86",X"4A",X"BD",X"6E",X"4C",X"DA",X"53",X"78",X"77",X"96",X"75",X"83",X"82",X"82",X"A5",X"3D", + X"86",X"A2",X"A7",X"31",X"8B",X"8E",X"C3",X"20",X"AA",X"92",X"3A",X"C0",X"87",X"51",X"77",X"AD", + X"62",X"B9",X"4F",X"7F",X"BC",X"1E",X"BF",X"7E",X"51",X"C3",X"50",X"72",X"C0",X"49",X"8A",X"81", + X"72",X"AA",X"7B",X"55",X"8C",X"83",X"CA",X"2B",X"97",X"9C",X"4B",X"86",X"9F",X"B0",X"14",X"EA", + X"3C",X"8A",X"9B",X"51",X"C2",X"25",X"C7",X"70",X"5F",X"AF",X"52",X"C6",X"29",X"B8",X"7F",X"5F", + X"A3",X"5C",X"CB",X"26",X"AE",X"8B",X"3C",X"D6",X"48",X"8A",X"74",X"A2",X"8D",X"3F",X"D3",X"2A", + X"B9",X"7B",X"4D",X"A6",X"69",X"B6",X"6E",X"56",X"8A",X"A1",X"64",X"C3",X"28",X"B2",X"7D",X"60", + X"A6",X"58",X"D4",X"11",X"D1",X"5C",X"7A",X"A8",X"42",X"96",X"C7",X"27",X"A9",X"90",X"44",X"89", + X"9F",X"69",X"90",X"A7",X"25",X"DB",X"46",X"7C",X"B7",X"42",X"9A",X"6E",X"99",X"8C",X"81",X"41", + X"C7",X"7A",X"58",X"8D",X"83",X"B2",X"29",X"C1",X"6E",X"52",X"DA",X"44",X"83",X"B6",X"2A",X"C4", + X"41",X"A6",X"7A",X"76",X"98",X"5B",X"B6",X"86",X"42",X"A2",X"8A",X"4B",X"95",X"97",X"65",X"B7", + X"56",X"6C",X"D2",X"1E",X"B6",X"94",X"36",X"DD",X"38",X"96",X"7B",X"70",X"9E",X"95",X"59",X"77", + X"82",X"8D",X"7C",X"78",X"DC",X"01",X"CD",X"70",X"5D",X"76",X"B4",X"91",X"35",X"BD",X"48",X"D3", + X"36",X"8E",X"B7",X"2C",X"BE",X"49",X"CA",X"4C",X"72",X"CB",X"29",X"B9",X"82",X"3B",X"CC",X"71", + X"4B",X"D1",X"4F",X"6A",X"8D",X"C9",X"46",X"6A",X"CA",X"28",X"99",X"A9",X"61",X"59",X"AA",X"78", + X"8F",X"98",X"35",X"CE",X"64",X"58",X"95",X"A7",X"49",X"AC",X"57",X"9B",X"7C",X"70",X"DE",X"14", + X"A9",X"A3",X"3F",X"7B",X"C9",X"57",X"5F",X"D6",X"17",X"C5",X"7D",X"58",X"9E",X"71",X"B8",X"3D", + X"72",X"A7",X"6C",X"A7",X"80",X"3A",X"E5",X"22",X"A5",X"61",X"B6",X"86",X"38",X"D9",X"56",X"57", + X"9A",X"8E",X"64",X"97",X"96",X"7D",X"45",X"CC",X"5D",X"5A",X"A8",X"AA",X"3C",X"7E",X"97",X"C1", + X"22",X"9B",X"A7",X"45",X"7F",X"A1",X"B4",X"1D",X"BB",X"51",X"B9",X"7A",X"45",X"91",X"A5",X"67", + X"B8",X"34",X"9E",X"A8",X"35",X"88",X"B0",X"54",X"A8",X"8C",X"31",X"E7",X"41",X"6A",X"C7",X"41", + X"85",X"BA",X"2D",X"B1",X"A0",X"35",X"90",X"9F",X"75",X"A0",X"5D",X"52",X"CA",X"59",X"84",X"9A", + X"52",X"B2",X"66",X"AF",X"43",X"6E",X"BC",X"59",X"89",X"95",X"8B",X"74",X"44",X"AE",X"85",X"96", + X"7B",X"4A",X"8B",X"BD",X"7E",X"2F",X"D2",X"68",X"4D",X"D9",X"41",X"6F",X"CA",X"4D",X"62",X"A0", + X"B7",X"3C",X"76",X"D1",X"2E",X"98",X"B1",X"2A",X"BB",X"8D",X"2F",X"E2",X"4A",X"6C",X"C4",X"49", + X"64",X"A5",X"88",X"80",X"9E",X"2A",X"DD",X"59",X"54",X"CE",X"60",X"54",X"9E",X"9D",X"42",X"BF", + X"92",X"34",X"98",X"B7",X"40",X"77",X"9F",X"BC",X"28",X"93",X"B8",X"44",X"67",X"A7",X"AC",X"41", + X"6F",X"9F",X"91",X"50",X"C4",X"37",X"B1",X"7A",X"5B",X"DD",X"4C",X"58",X"C6",X"5D",X"51",X"BA", + X"82",X"47",X"D6",X"6B",X"45",X"AC",X"60",X"C5",X"3D",X"7D",X"CA",X"33",X"8D",X"AE",X"42",X"88", + X"CB",X"4F",X"5D",X"84",X"C3",X"31",X"B4",X"6B",X"6C",X"AD",X"73",X"AB",X"23",X"D5",X"6B",X"43", + X"D1",X"6A",X"47",X"CB",X"4B",X"77",X"C4",X"2B",X"BC",X"94",X"35",X"C6",X"77",X"3E",X"9E",X"94", + X"77",X"A5",X"43",X"7C",X"99",X"BD",X"3A",X"79",X"C8",X"2B",X"B8",X"83",X"37",X"D2",X"77",X"4F", + X"78",X"BD",X"43",X"AC",X"80",X"66",X"C8",X"28",X"89",X"A3",X"AF",X"2A",X"92",X"B9",X"3D",X"80", + X"CC",X"27",X"9A",X"B0",X"48",X"66",X"AD",X"8D",X"44",X"D0",X"6A",X"44",X"AA",X"87",X"6B",X"C7", + X"25",X"A3",X"AB",X"41",X"70",X"AD",X"71",X"9C",X"74",X"45",X"C9",X"91",X"51",X"5D",X"D9",X"4E", + X"62",X"C7",X"61",X"4C",X"A4",X"97",X"78",X"95",X"3D",X"9E",X"A8",X"30",X"D4",X"4B",X"81",X"B2", + X"33",X"C5",X"65",X"A4",X"63",X"4E",X"A8",X"98",X"5F",X"C0",X"30",X"96",X"B5",X"3D",X"75",X"B2", + X"92",X"31",X"B1",X"A5",X"33",X"A4",X"AD",X"43",X"68",X"B4",X"7A",X"51",X"DB",X"45",X"74",X"C9", + X"2D",X"95",X"AD",X"3B",X"8E",X"A9",X"3D",X"C0",X"70",X"62",X"D5",X"27",X"A7",X"9E",X"3F",X"7C", + X"BC",X"50",X"A4",X"8E",X"34",X"A3",X"A1",X"4E",X"99",X"BC",X"35",X"7B",X"BD",X"67",X"45",X"AA", + X"94",X"62",X"C1",X"3E",X"74",X"CB",X"41",X"74",X"A3",X"50",X"B6",X"9F",X"47",X"68",X"A6",X"AF", + X"4A",X"62",X"94",X"AC",X"3F",X"AD",X"A9",X"3F",X"72",X"8A",X"C7",X"54",X"5E",X"7A",X"C0",X"80", + X"4D",X"6B",X"B7",X"71",X"86",X"9F",X"2C",X"DC",X"60",X"59",X"79",X"BB",X"7C",X"40",X"A8",X"AC", + X"63",X"48",X"D4",X"67",X"56",X"79",X"B8",X"8D",X"38",X"BE",X"7E",X"3C",X"B0",X"97",X"54",X"C2", + X"37",X"98",X"B4",X"32",X"90",X"B9",X"4F",X"5E",X"B2",X"A0",X"34",X"9F",X"A3",X"35",X"AD",X"9B", + X"38",X"BB",X"97",X"4E",X"64",X"A4",X"94",X"53",X"D0",X"45",X"6A",X"C2",X"6E",X"42",X"CC",X"77", + X"52",X"73",X"BB",X"61",X"89",X"B2",X"2D",X"9C",X"B4",X"43",X"77",X"C5",X"57",X"59",X"93",X"A6", + X"5B",X"B6",X"50",X"63",X"BE",X"8D",X"4D",X"6A",X"A2",X"AA",X"6F",X"3F",X"C2",X"86",X"4B",X"75", + X"BD",X"76",X"4B",X"D2",X"5A",X"5A",X"8A",X"BF",X"5B",X"56",X"B3",X"9F",X"4E",X"66",X"C4",X"5D", + X"51",X"C0",X"68",X"70",X"C1",X"3E",X"75",X"BB",X"50",X"A6",X"88",X"3A",X"AB",X"A4",X"79",X"3A", + X"BC",X"8E",X"4A",X"74",X"B7",X"82",X"42",X"D2",X"5F",X"5A",X"7F",X"B4",X"8D",X"41",X"86",X"C0", + X"55",X"5F",X"C0",X"44",X"96",X"B6",X"5A",X"5A",X"84",X"BD",X"78",X"52",X"6C",X"BA",X"82",X"41", + X"BD",X"83",X"3E",X"A9",X"91",X"56",X"CA",X"38",X"95",X"AA",X"39",X"8B",X"AE",X"4D",X"8C",X"AC", + X"35",X"BC",X"79",X"52",X"C1",X"5A",X"80",X"C2",X"41",X"73",X"A8",X"4C",X"B1",X"9C",X"63",X"4F", + X"BB",X"8B",X"4B",X"70",X"B2",X"7F",X"46",X"D3",X"48",X"A3",X"94",X"3D",X"94",X"B6",X"52",X"61", + X"BD",X"49",X"91",X"B9",X"58",X"61",X"77",X"BD",X"4D",X"A9",X"84",X"43",X"CF",X"6A",X"58",X"74", + X"C2",X"57",X"93",X"61",X"84",X"BB",X"2E",X"B6",X"86",X"4B",X"C7",X"71",X"54",X"76",X"AF",X"73", + X"5D",X"D2",X"40",X"85",X"B7",X"59",X"5A",X"94",X"AF",X"40",X"9D",X"A1",X"32",X"BD",X"71",X"72", + X"BC",X"51",X"60",X"97",X"AC",X"7F",X"47",X"8D",X"B7",X"57",X"5B",X"C1",X"7B",X"52",X"73",X"AB", + X"8B",X"44",X"C1",X"82",X"42",X"BD",X"75",X"4B",X"B0",X"9D",X"6A",X"50",X"8A",X"AD",X"8E",X"53", + X"65",X"9C",X"AE",X"65",X"51",X"AF",X"99",X"43",X"80",X"B4",X"7E",X"3D",X"B9",X"6B",X"66",X"C2", + X"45",X"B4",X"81",X"50",X"72",X"BC",X"6E",X"4E",X"BA",X"7A",X"4A",X"C1",X"6F",X"5A",X"BB",X"89", + X"5C",X"5E",X"9B",X"AF",X"5E",X"5C",X"CA",X"43",X"87",X"B0",X"41",X"85",X"BA",X"4D",X"77",X"BA", + X"76",X"4A",X"A7",X"9D",X"54",X"61",X"AA",X"9C",X"47",X"7B",X"B2",X"8B",X"51",X"6C",X"9A",X"A4", + X"42",X"A4",X"A6",X"3A",X"A5",X"97",X"3F",X"9E",X"A7",X"78",X"4E",X"7F",X"B1",X"8A",X"58",X"64", + X"B8",X"88",X"48",X"87",X"B5",X"6E",X"49",X"BE",X"59",X"93",X"A5",X"46",X"74",X"9E",X"A3",X"35", + X"C2",X"72",X"55",X"C2",X"5B",X"60",X"B9",X"79",X"48",X"C8",X"57",X"84",X"B1",X"4B",X"6C",X"97", + X"AC",X"3F",X"8C",X"AF",X"47",X"AF",X"89",X"4A",X"7D",X"A4",X"9E",X"4F",X"6A",X"B1",X"8E",X"45", + X"88",X"B2",X"70",X"4B",X"A7",X"9C",X"41",X"AD",X"96",X"49",X"7B",X"B6",X"77",X"4B",X"B4",X"8D", + X"56",X"67",X"A2",X"A0",X"3E",X"B2",X"84",X"45",X"AC",X"9A",X"78",X"44",X"B1",X"80",X"52",X"C9", + X"4B",X"7E",X"B7",X"3C",X"A1",X"99",X"40",X"9F",X"A3",X"7C",X"4C",X"8A",X"B0",X"76",X"4C",X"9D", + X"A6",X"3F",X"9C",X"A5",X"5E",X"5C",X"B7",X"85",X"4E",X"7E",X"B4",X"6A",X"56",X"CD",X"4B",X"99", + X"6F",X"69",X"C4",X"45",X"89",X"B2",X"60",X"60",X"7F",X"BB",X"57",X"6E",X"B4",X"84",X"66",X"59", + X"BD",X"4A",X"9F",X"A0",X"5B",X"5F",X"A1",X"A4",X"65",X"57",X"94",X"A3",X"8E",X"46",X"8A",X"9B", + X"58",X"B7",X"78",X"4C",X"9B",X"A1",X"40",X"AF",X"87",X"42",X"B4",X"80",X"5E",X"BB",X"4B",X"7D", + X"BB",X"42",X"95",X"A1",X"42",X"AA",X"98",X"59",X"64",X"A4",X"A0",X"5F",X"5D",X"9C",X"A7",X"66", + X"57",X"A0",X"A4",X"5E",X"61",X"8A",X"B4",X"4D",X"92",X"A5",X"55",X"68",X"8F",X"B1",X"55",X"6C", + X"BE",X"51",X"88",X"A6",X"36",X"C2",X"6C",X"60",X"B2",X"84",X"4D",X"84",X"A8",X"4A",X"A5",X"9E", + X"60",X"5D",X"AD",X"92",X"76",X"4E",X"94",X"A8",X"72",X"4C",X"B0",X"7A",X"57",X"B8",X"85",X"72", + X"51",X"C2",X"59",X"6C",X"B1",X"86",X"69",X"5A",X"92",X"A9",X"7B",X"50",X"8B",X"B3",X"41",X"AD", + X"6F",X"61",X"B7",X"82",X"6E",X"55",X"A0",X"9F",X"4B",X"87",X"B1",X"52",X"9B",X"96",X"59",X"68", + X"B7",X"55",X"85",X"B1",X"64",X"65",X"70",X"BB",X"6A",X"5F",X"B0",X"8A",X"76",X"55",X"82",X"AE", + X"82",X"5F",X"66",X"A1",X"9C",X"48",X"B7",X"67",X"60",X"B8",X"76",X"4D",X"B7",X"76",X"62",X"B1", + X"7C",X"55",X"84",X"AD",X"77",X"55",X"8B",X"AC",X"40",X"9A",X"A1",X"75",X"57",X"7D",X"A6",X"91", + X"75",X"5C",X"74",X"AE",X"7D",X"52",X"C1",X"58",X"74",X"B7",X"45",X"95",X"A1",X"70",X"57",X"89", + X"AA",X"81",X"5B",X"6D",X"9F",X"9E",X"6F",X"57",X"AB",X"8E",X"63",X"5E",X"B0",X"80",X"4E",X"B1", + X"88",X"4C",X"9E",X"9A",X"46",X"98",X"A4",X"6C",X"55",X"B0",X"84",X"56",X"B8",X"48",X"92",X"A3", + X"7D",X"69",X"5C",X"A6",X"98",X"51",X"83",X"B5",X"4C",X"8E",X"A3",X"69",X"5E",X"80",X"AF",X"6B", + X"5B",X"B3",X"7C",X"52",X"B1",X"88",X"81",X"50",X"88",X"A7",X"83",X"54",X"82",X"AB",X"46",X"9F", + X"9F",X"4B",X"94",X"9F",X"42",X"A8",X"92",X"84",X"59",X"77",X"B3",X"46",X"A5",X"8C",X"4A",X"AE", + X"8A",X"59",X"A9",X"82",X"67",X"60",X"99",X"9F",X"81",X"6A",X"5B",X"BF",X"4F",X"9C",X"82",X"54", + X"BA",X"75",X"55",X"A7",X"8A",X"4B",X"A4",X"96",X"82",X"61",X"67",X"9A",X"9E",X"4D",X"8A",X"A7", + X"7F",X"73",X"52",X"BB",X"60",X"73",X"AC",X"83",X"73",X"59",X"89",X"A4",X"88",X"50",X"95",X"A2", + X"67",X"63",X"7D",X"B0",X"72",X"59",X"A9",X"8F",X"50",X"87",X"AC",X"47",X"9C",X"97",X"7B",X"53", + X"92",X"A0",X"7B",X"5B",X"7F",X"B1",X"49",X"8D",X"A4",X"7B",X"66",X"62",X"B4",X"76",X"66",X"AA", + X"81",X"62",X"6D",X"AF",X"80",X"6D",X"5C",X"97",X"9C",X"86",X"69",X"60",X"AE",X"80",X"4E",X"B9", + X"66",X"6D",X"AA",X"83",X"64",X"69",X"AD",X"86",X"6B",X"60",X"8C",X"AA",X"65",X"66",X"AF",X"80", + X"51",X"9A",X"9B",X"7B",X"72",X"57",X"A5",X"92",X"87",X"67",X"66",X"86",X"B2",X"58",X"8E",X"8B", + X"5F",X"B0",X"71",X"6B",X"63",X"A7",X"8F",X"85",X"67",X"63",X"B2",X"61",X"6F",X"AE",X"81",X"7F", + X"4E",X"A4",X"8D",X"51",X"9F",X"99",X"73",X"62",X"75",X"B6",X"66",X"79",X"9F",X"50",X"B7",X"4C", + X"8E",X"9E",X"7D",X"5C",X"7F",X"AF",X"4B",X"8D",X"A1",X"7D",X"65",X"66",X"AE",X"7B",X"62",X"AD", + X"7B",X"6C",X"5F",X"A8",X"8D",X"84",X"66",X"65",X"A7",X"8D",X"75",X"58",X"9F",X"97",X"74",X"60", + X"79",X"A4",X"8E",X"6A",X"5F",X"A7",X"8D",X"53",X"A7",X"87",X"73",X"57",X"B1",X"74",X"68",X"AD", + X"48",X"A0",X"94",X"81",X"6D",X"5F",X"94",X"9C",X"85",X"6D",X"5F",X"97",X"9D",X"78",X"5B",X"87", + X"AA",X"5E",X"6C",X"A6",X"8A",X"7A",X"5D",X"7B",X"9E",X"96",X"59",X"7D",X"AB",X"4C",X"98",X"95", + X"4B",X"A5",X"8B",X"55",X"A5",X"8D",X"71",X"60",X"84",X"A4",X"84",X"7F",X"5A",X"82",X"AB",X"5B", + X"78",X"B2",X"5B",X"7F",X"A2",X"4D",X"94",X"A2",X"51",X"98",X"93",X"78",X"57",X"9B",X"95",X"7D", + X"57",X"90",X"9D",X"53",X"A2",X"8D",X"6C",X"65",X"81",X"AD",X"68",X"71",X"A9",X"53",X"A4",X"82", + X"7A",X"55",X"A4",X"88",X"53",X"A5",X"8D",X"7F",X"6A",X"63",X"A7",X"87",X"59",X"A5",X"8A",X"77", + X"61",X"7B",X"AD",X"73",X"6B",X"A1",X"7F",X"6F",X"60",X"B2",X"6C",X"66",X"AA",X"82",X"81",X"5E", + X"75",X"9D",X"92",X"7D",X"6C",X"63",X"B0",X"73",X"60",X"A8",X"86",X"80",X"62",X"71",X"99",X"9A", + X"50",X"97",X"92",X"51",X"9D",X"96",X"51",X"A5",X"79",X"5D",X"AA",X"85",X"80",X"64",X"6D",X"AB", + X"77",X"64",X"A9",X"82",X"77",X"5F",X"85",X"A1",X"85",X"7F",X"5B",X"88",X"A4",X"4E",X"95",X"98", + X"81",X"69",X"69",X"B1",X"55",X"90",X"99",X"4F",X"A7",X"7E",X"59",X"AA",X"7C",X"5B",X"9E",X"92", + X"7E",X"70",X"5F",X"A1",X"8F",X"85",X"5F",X"78",X"A6",X"7F",X"77",X"5A",X"A0",X"87",X"58",X"A0", + X"93",X"59",X"97",X"94",X"5B",X"76",X"9F",X"8E",X"63",X"72",X"AC",X"57",X"81",X"A6",X"66",X"68", + X"A7",X"83",X"5C",X"A7",X"80",X"7A",X"59",X"97",X"9A",X"5D",X"7A",X"AD",X"66",X"72",X"A1",X"80", + X"70",X"62",X"A7",X"85",X"7B",X"5F",X"7E",X"9D",X"8E",X"73",X"5F",X"93",X"9D",X"63",X"6D",X"AA", + X"7B",X"89",X"5B",X"7F",X"A0",X"84",X"64",X"78",X"A5",X"7A",X"75",X"5E",X"9C",X"93",X"7F",X"7C", + X"58",X"A0",X"8D",X"80",X"61",X"77",X"9D",X"91",X"65",X"71",X"A4",X"80",X"76",X"5E",X"A4",X"89", + X"7C",X"62",X"78",X"9D",X"8D",X"7D",X"6C",X"68",X"B0",X"69",X"78",X"A3",X"54",X"9F",X"8A",X"79", + X"63",X"7A",X"9E",X"8D",X"64",X"71",X"AD",X"6D",X"6D",X"9D",X"86",X"6F",X"68",X"82",X"A8",X"6A", + X"74",X"A2",X"7A",X"73",X"61",X"B1",X"66",X"73",X"A8",X"5C",X"7D",X"A7",X"6C",X"6C",X"AA",X"56", + X"97",X"89",X"55",X"A7",X"85",X"85",X"6E",X"66",X"A6",X"82",X"82",X"5F",X"81",X"A5",X"55",X"8A", + X"9C",X"7C",X"81",X"5B",X"8A",X"9F",X"5E",X"7E",X"A9",X"5D",X"79",X"9E",X"87",X"61",X"76",X"9E", + X"8C",X"65",X"72",X"A2",X"83",X"78",X"60",X"A2",X"86",X"7C",X"5E",X"9B",X"8C",X"56",X"AD",X"66", + X"71",X"A3",X"81",X"82",X"66",X"74",X"AE",X"5E",X"82",X"9B",X"58",X"8E",X"9E",X"63",X"72",X"A1", + X"84",X"72",X"62",X"9F",X"8B",X"81",X"73",X"65",X"89",X"9D",X"7F",X"84",X"5E",X"84",X"9E",X"7C", + X"7B",X"5E",X"8B",X"96",X"8C",X"56",X"96",X"90",X"80",X"66",X"74",X"9A",X"92",X"61",X"78",X"9E", + X"87",X"69",X"72",X"A2",X"7F",X"76",X"63",X"8B",X"9A",X"83",X"5B",X"8F",X"98",X"7B",X"7F",X"5B", + X"92",X"98",X"5A",X"9D",X"86",X"81",X"62",X"80",X"A0",X"7B",X"76",X"61",X"9A",X"91",X"80",X"7B", + X"5E",X"91",X"96",X"7F",X"6E",X"69",X"99",X"94",X"64",X"75",X"A6",X"74",X"64",X"8F",X"9D",X"65", + X"72",X"A1",X"83",X"74",X"62",X"9F",X"89",X"82",X"72",X"67",X"88",X"9D",X"7A",X"62",X"AC",X"5A", + X"8F",X"90",X"7F",X"6E",X"6B",X"8E",X"9D",X"61",X"86",X"9B",X"56",X"9D",X"88",X"7C",X"64",X"7B", + X"99",X"8E",X"5E",X"7F",X"9F",X"7F",X"83",X"63",X"7D",X"A5",X"6A",X"6C",X"99",X"8F",X"57",X"A1", + X"7C",X"68",X"9C",X"86",X"6B",X"72",X"A2",X"7B",X"81",X"5C",X"98",X"90",X"77",X"61",X"A5",X"71", + X"6B",X"A0",X"87",X"73",X"68",X"A2",X"80",X"80",X"63",X"7D",X"9E",X"81",X"60",X"A2",X"77",X"69", + X"A8",X"6B",X"6D",X"9D",X"83",X"7E",X"65",X"7C",X"9D",X"86",X"62",X"80",X"A1",X"6F",X"68",X"A0", + X"83",X"84",X"6C",X"6E",X"92",X"9A",X"5D",X"8C",X"8F",X"5F",X"A1",X"7F",X"7F",X"65",X"7B",X"98", + X"8C",X"61",X"7C",X"A1",X"78",X"66",X"A3",X"68",X"75",X"A3",X"7A",X"87",X"69",X"70",X"8E",X"97", + X"7C",X"62",X"93",X"90",X"79",X"6B",X"74",X"A0",X"83",X"63",X"87",X"9E",X"6D",X"70",X"A1",X"60", + X"8E",X"91",X"7A",X"73",X"68",X"97",X"8E",X"84",X"73",X"68",X"8D",X"9A",X"75",X"66",X"9E",X"7F", + X"60",X"9A",X"8E",X"61",X"8D",X"92",X"57",X"96",X"8E",X"81",X"79",X"65",X"9C",X"87",X"7A",X"67", + X"80",X"9E",X"7D",X"85",X"64",X"7B",X"9B",X"85",X"72",X"68",X"98",X"8F",X"74",X"66",X"9A",X"89", + X"5D",X"8D",X"96",X"7C",X"60",X"A1",X"7C",X"69",X"9D",X"81",X"78",X"65",X"A2",X"78",X"69",X"A8", + X"62",X"83",X"95",X"7E",X"76",X"67",X"8B",X"97",X"7B",X"61",X"A7",X"6B",X"76",X"9C",X"7F",X"77", + X"66",X"91",X"95",X"77",X"64",X"98",X"8E",X"64",X"7B",X"9D",X"7F",X"61",X"94",X"8F",X"7C",X"66", + X"82",X"9D",X"7A",X"87",X"66",X"7A",X"A0",X"6E",X"6D",X"A0",X"7F",X"84",X"71",X"6B",X"9E",X"83", + X"7E",X"62",X"90",X"92",X"7B",X"79",X"62",X"A4",X"79",X"70",X"99",X"84",X"62",X"8B",X"92",X"7F", + X"74",X"6B",X"8A",X"99",X"75",X"68",X"99",X"8C",X"68",X"77",X"9D",X"7D",X"83",X"6F",X"6D",X"91", + X"91",X"83",X"6F",X"6E",X"99",X"8C",X"69",X"76",X"9F",X"79",X"68",X"A1",X"70",X"6D",X"9B",X"86", + X"60",X"9C",X"7C",X"6A",X"9F",X"7B",X"84",X"65",X"81",X"A0",X"61",X"89",X"91",X"7D",X"7B",X"65", + X"8D",X"95",X"7E",X"83",X"70",X"6D",X"A3",X"73",X"70",X"A1",X"67",X"7F",X"9C",X"5A",X"98",X"7F", + X"6B",X"A0",X"78",X"87",X"60",X"8A",X"95",X"7C",X"81",X"61",X"94",X"8E",X"7F",X"7A",X"67",X"88", + X"93",X"88",X"6F",X"71",X"A0",X"67",X"78",X"98",X"88",X"6D",X"72",X"9E",X"7E",X"83",X"78",X"67", + X"8D",X"92",X"82",X"63",X"8F",X"8F",X"7D",X"7A",X"66",X"8F",X"93",X"7B",X"66",X"A3",X"6B",X"7B", + X"97",X"7E",X"74",X"6B",X"9B",X"86",X"7F",X"80",X"66",X"82",X"95",X"87",X"62",X"88",X"95",X"7D", + X"82",X"6B",X"77",X"99",X"86",X"66",X"91",X"8C",X"74",X"6C",X"98",X"85",X"7B",X"66",X"97",X"87", + X"80",X"74",X"6D",X"8C",X"96",X"73",X"70",X"A1",X"64",X"7A",X"93",X"8D",X"64",X"80",X"96",X"82", + X"6F",X"71",X"99",X"87",X"65",X"82",X"98",X"7F",X"82",X"71",X"6F",X"92",X"8D",X"83",X"6E",X"73", + X"95",X"8C",X"6E",X"74",X"9A",X"7E",X"82",X"69",X"7E",X"9F",X"62",X"88",X"91",X"64",X"8F",X"8F", + X"65",X"7E",X"96",X"83",X"63",X"8D",X"90",X"7F",X"7D",X"67",X"98",X"85",X"7E",X"66",X"92",X"8B", + X"7C",X"6C",X"7C",X"9B",X"7C",X"69",X"94",X"86",X"7F",X"72",X"6F",X"8F",X"91",X"78",X"68",X"97", + X"89",X"7B",X"67",X"97",X"86",X"80",X"74",X"6C",X"94",X"8C",X"7E",X"82",X"6B",X"7C",X"9F",X"67", + X"82",X"96",X"6A",X"77",X"9A",X"7E",X"83",X"78",X"69",X"98",X"86",X"81",X"74",X"6D",X"8C",X"91", + X"81",X"7A",X"69",X"99",X"80",X"65",X"90",X"8F",X"7D",X"66",X"96",X"87",X"7F",X"67",X"8D",X"8F", + X"61",X"98",X"7F",X"67",X"8E",X"90",X"7D",X"82",X"69",X"7D",X"96",X"86",X"6A",X"7D",X"9D",X"6F", + X"76",X"99",X"6E",X"71",X"99",X"83",X"83",X"71",X"71",X"8F",X"91",X"71",X"72",X"9A",X"7D",X"84", + X"6A",X"7A",X"8C",X"94",X"6B",X"7D",X"94",X"7F",X"6D",X"79",X"97",X"84",X"67",X"85",X"93",X"81", + X"73",X"74",X"9B",X"7A",X"84",X"68",X"80",X"97",X"7E",X"83",X"69",X"82",X"99",X"69",X"82",X"97", + X"65",X"87",X"91",X"63",X"93",X"86",X"7F",X"76",X"6C",X"94",X"89",X"82",X"6D",X"78",X"96",X"86", + X"69",X"80",X"97",X"79",X"6D",X"97",X"7D",X"6A",X"9A",X"76",X"6D",X"98",X"83",X"81",X"7D",X"6C", + X"80",X"93",X"87",X"65",X"96",X"83",X"81",X"78",X"6B",X"99",X"82",X"82",X"73",X"70",X"91",X"8D", + X"7C",X"84",X"69",X"80",X"97",X"7B",X"85",X"6C",X"79",X"92",X"8B",X"73",X"71",X"9B",X"75",X"6E", + X"91",X"8E",X"70",X"73",X"97",X"84",X"6B",X"80",X"98",X"77",X"70",X"95",X"7F",X"67",X"93",X"89", + X"7F",X"7E",X"6B",X"83",X"95",X"7F",X"82",X"78",X"6C",X"98",X"83",X"81",X"79",X"6B",X"96",X"84", + X"67",X"95",X"84",X"68",X"8E",X"8F",X"71",X"72",X"8F",X"8F",X"6B",X"80",X"93",X"7A",X"6B",X"91", + X"87",X"65",X"90",X"8D",X"74",X"6E",X"93",X"89",X"7D",X"82",X"6B",X"7E",X"93",X"87",X"6B",X"7F", + X"97",X"7A",X"86",X"6B",X"7E",X"95",X"7D",X"83",X"71",X"74",X"93",X"88",X"7F",X"7E",X"69",X"96", + X"83",X"81",X"79",X"6C",X"8B",X"90",X"7D",X"83",X"77",X"6E",X"8A",X"92",X"77",X"71",X"98",X"78", + X"6F",X"9B",X"6E",X"7D",X"94",X"7A",X"83",X"65",X"93",X"88",X"81",X"78",X"6F",X"86",X"96",X"71", + X"79",X"94",X"7D",X"80",X"6C",X"7E",X"91",X"87",X"7E",X"80",X"6B",X"80",X"8F",X"8B",X"6B",X"7D", + X"95",X"7D",X"83",X"72",X"73",X"92",X"88",X"80",X"6E",X"7C",X"95",X"80",X"6D",X"7F",X"95",X"7D", + X"83",X"77",X"6E",X"92",X"88",X"7F",X"6F",X"7A",X"96",X"7F",X"6E",X"80",X"99",X"6B",X"7F",X"90", + X"80",X"75",X"72",X"94",X"87",X"75",X"72",X"99",X"78",X"6F",X"8C",X"8F",X"6C",X"7C",X"92",X"80", + X"78",X"6E",X"90",X"8C",X"72",X"73",X"96",X"81",X"81",X"6D",X"7F",X"95",X"7D",X"83",X"7B",X"6E", + X"83",X"93",X"7E",X"83",X"6A",X"88",X"90",X"66",X"8C",X"8D",X"69",X"86",X"92",X"7B",X"85",X"70", + X"76",X"8D",X"8E",X"70",X"78",X"96",X"7C",X"85",X"6F",X"79",X"98",X"74",X"71",X"90",X"89",X"7C", + X"83",X"6B",X"83",X"91",X"80",X"80",X"70",X"79",X"90",X"88",X"7E",X"81",X"6E",X"7D",X"98",X"71", + X"7B",X"93",X"7A",X"85",X"6B",X"80",X"92",X"81",X"80",X"71",X"79",X"99",X"74",X"78",X"93",X"7C", + X"83",X"70",X"78",X"8D",X"8B",X"7E",X"80",X"6C",X"82",X"90",X"84",X"6A",X"8B",X"8C",X"7D",X"81", + X"6B",X"8B",X"8F",X"6D",X"82",X"92",X"6C",X"7F",X"94",X"72",X"74",X"91",X"86",X"6D",X"82",X"93", + X"69",X"82",X"91",X"80",X"6E",X"81",X"94",X"77",X"73",X"93",X"7C",X"6F",X"97",X"78",X"71",X"8B", + X"8F",X"6C",X"82",X"8E",X"7D",X"81",X"6F",X"7C",X"8F",X"87",X"7E",X"80",X"6E",X"7E",X"8E",X"8A", + X"70",X"78",X"95",X"7D",X"84",X"78",X"71",X"87",X"91",X"79",X"70",X"91",X"85",X"7C",X"6F",X"8B", + X"8C",X"67",X"90",X"82",X"6F",X"91",X"84",X"76",X"72",X"8D",X"8D",X"70",X"7D",X"93",X"6F",X"7D", + X"95",X"68",X"88",X"8B",X"80",X"78",X"73",X"96",X"7D",X"84",X"73",X"75",X"93",X"83",X"81",X"77", + X"72",X"8E",X"8A",X"7E",X"80",X"6D",X"8C",X"8C",X"6A",X"83",X"8F",X"81",X"6D",X"85",X"8F",X"7E", + X"6D",X"88",X"8D",X"7F",X"6F",X"82",X"91",X"7D",X"6F",X"85",X"8F",X"7D",X"7D",X"6D",X"90",X"88", + X"7C",X"6E",X"94",X"80",X"70",X"8E",X"87",X"76",X"74",X"92",X"81",X"7D",X"6D",X"8F",X"87",X"7F", + X"71",X"7C",X"92",X"81",X"73",X"7A",X"95",X"7C",X"84",X"7B",X"6F",X"8D",X"8A",X"7B",X"71",X"82", + X"92",X"79",X"73",X"91",X"7E",X"6D",X"8D",X"89",X"7D",X"83",X"6D",X"84",X"8F",X"7D",X"83",X"70", + X"7B",X"8B",X"8B",X"7B",X"85",X"71",X"7A",X"93",X"7E",X"82",X"75",X"75",X"89",X"8D",X"7D",X"6D", + X"90",X"85",X"81",X"79",X"71",X"8D",X"8A",X"79",X"72",X"91",X"83",X"7D",X"6F",X"86",X"8E",X"7D", + X"70",X"85",X"90",X"7A",X"86",X"74",X"76",X"91",X"82",X"81",X"79",X"72",X"87",X"8D",X"80",X"6D", + X"86",X"8E",X"7E",X"82",X"76",X"74",X"89",X"8B",X"82",X"72",X"7F",X"94",X"6F",X"80",X"8D",X"7E", + X"73",X"7B",X"92",X"7F",X"71",X"8A",X"89",X"6A",X"89",X"8B",X"81",X"71",X"7F",X"91",X"7C",X"84", + X"79",X"72",X"8D",X"89",X"6C",X"8C",X"86",X"7F",X"7C",X"71",X"83",X"8D",X"83",X"7E",X"81",X"6E", + X"83",X"8D",X"85",X"71",X"7C",X"91",X"7E",X"82",X"7D",X"70",X"88",X"8D",X"7D",X"83",X"6E",X"84", + X"8F",X"7C",X"83",X"70",X"7E",X"90",X"7F",X"82",X"76",X"76",X"93",X"7E",X"83",X"7A",X"72",X"8D", + X"89",X"76",X"75",X"92",X"7F",X"83",X"76",X"76",X"92",X"7F",X"6F",X"8A",X"8A",X"7D",X"72",X"83", + X"90",X"79",X"75",X"8A",X"87",X"6B",X"89",X"89",X"7F",X"7F",X"71",X"81",X"93",X"70",X"7E",X"8E", + X"80",X"79",X"73",X"8E",X"88",X"79",X"72",X"8E",X"86",X"7B",X"72",X"8E",X"85",X"6E",X"8E",X"84", + X"6F",X"85",X"8E",X"78",X"74",X"91",X"7C",X"71",X"94",X"7A",X"73",X"8A",X"8C",X"76",X"76",X"8F", + X"84",X"7D",X"83",X"6E",X"86",X"8B",X"81",X"71",X"83",X"8D",X"7E",X"78",X"75",X"92",X"81",X"81", + X"7D",X"72",X"82",X"8E",X"80",X"80",X"7E",X"70",X"85",X"8C",X"83",X"70",X"80",X"8E",X"7F",X"72", + X"81",X"90",X"7A",X"86",X"72",X"7D",X"90",X"77",X"74",X"8C",X"88",X"7D",X"83",X"75",X"78",X"8C", + X"88",X"7D",X"83",X"74",X"79",X"8F",X"83",X"6F",X"87",X"8C",X"79",X"73",X"8A",X"89",X"7D",X"83", + X"76",X"76",X"8C",X"87",X"7F",X"7D",X"70",X"8C",X"87",X"80",X"71",X"84",X"8D",X"7C",X"73",X"8C", + X"83",X"6E",X"89",X"8A",X"7C",X"73",X"90",X"7E",X"83",X"70",X"84",X"8C",X"7E",X"78",X"78",X"93", + X"7A",X"73",X"8A",X"89",X"7C",X"84",X"77",X"76",X"90",X"81",X"81",X"7A",X"73",X"8B",X"89",X"71", + X"7E",X"8F",X"7E",X"71",X"8B",X"86",X"7F",X"7E",X"70",X"8D",X"87",X"72",X"7D",X"8E",X"82",X"73", + X"7E",X"8F",X"7F",X"82",X"7D",X"72",X"88",X"8C",X"6F",X"86",X"89",X"7D",X"81",X"70",X"83",X"8C", + X"82",X"70",X"83",X"8C",X"81",X"72",X"80",X"8E",X"7D",X"83",X"7A",X"74",X"86",X"8C",X"7C",X"72", + X"87",X"8B",X"7D",X"83",X"78",X"76",X"8F",X"82",X"71",X"8D",X"82",X"80",X"7E",X"72",X"83",X"8D", + X"7E",X"83",X"74",X"7E",X"8F",X"7B",X"85",X"74",X"7B",X"8F",X"7F",X"81",X"7B",X"73",X"87",X"8A", + X"80",X"72",X"8B",X"84",X"7E",X"80",X"70",X"8B",X"87",X"7E",X"82",X"73",X"7D",X"8C",X"86",X"77", + X"79",X"91",X"79",X"77",X"90",X"7A",X"77",X"90",X"79",X"75",X"8B",X"87",X"77",X"79",X"91",X"74", + X"7D",X"8C",X"7F",X"72",X"85",X"8B",X"7D",X"72",X"87",X"89",X"7F",X"7B",X"74",X"8D",X"86",X"76", + X"7A",X"91",X"74",X"7A",X"8B",X"86",X"78",X"77",X"8E",X"82",X"7F",X"81",X"73",X"7E",X"8C",X"84", + X"76",X"7B",X"91",X"77",X"77",X"8A",X"87",X"76",X"79",X"8B",X"86",X"75",X"7B",X"8B",X"85",X"72", + X"83",X"89",X"7E",X"7E",X"73",X"8F",X"80",X"73",X"83",X"8D",X"7D",X"84",X"73",X"7E",X"8B",X"84", + X"74",X"7D",X"8C",X"82",X"74",X"7F",X"8D",X"80",X"7B",X"74",X"8D",X"84",X"79",X"76",X"8F",X"80", + X"82",X"72",X"85",X"8A",X"7C",X"82",X"71",X"85",X"8A",X"7F",X"81",X"76",X"7B",X"8F",X"7F",X"83", + X"75",X"7B",X"89",X"89",X"73",X"81",X"8B",X"7C",X"84",X"74",X"7D",X"8C",X"81",X"71",X"89",X"87", + X"80",X"72",X"88",X"87",X"7F",X"75",X"82",X"8C",X"7B",X"84",X"73",X"7F",X"8E",X"7A",X"76",X"8D", + X"81",X"7E",X"74",X"8C",X"84",X"71",X"85",X"8A",X"7E",X"74",X"86",X"8A",X"7B",X"75",X"8A",X"85", + X"71",X"8B",X"83",X"73",X"89",X"85",X"7B",X"75",X"87",X"8A",X"79",X"76",X"8C",X"83",X"7F",X"80", + X"73",X"81",X"89",X"86",X"73",X"7D",X"8B",X"84",X"7A",X"76",X"8C",X"83",X"7F",X"75",X"81",X"8D", + X"7D",X"84",X"77",X"7A",X"8E",X"7B",X"75",X"8D",X"80",X"81",X"7B",X"75",X"8C",X"84",X"7F",X"73", + X"87",X"88",X"7D",X"82",X"75",X"7D",X"8D",X"7F",X"74",X"8D",X"7E",X"75",X"8D",X"7E",X"74",X"88", + X"88",X"7A",X"78",X"8D",X"7C",X"75",X"87",X"89",X"7A",X"76",X"88",X"89",X"77",X"7A",X"8E",X"7C", + X"74",X"8A",X"85",X"7E",X"82",X"76",X"7B",X"89",X"87",X"72",X"88",X"85",X"7E",X"81",X"74",X"7F", + X"88",X"87",X"75",X"7E",X"8E",X"77",X"79",X"8A",X"85",X"77",X"7A",X"8B",X"83",X"76",X"7F",X"8C", + X"73",X"7E",X"8B",X"82",X"75",X"7E",X"8C",X"7F",X"77",X"7C",X"8D",X"80",X"75",X"86",X"87",X"73", + X"7F",X"8B",X"80",X"7F",X"74",X"89",X"85",X"72",X"89",X"85",X"73",X"88",X"85",X"7D",X"82",X"71", + X"8A",X"84",X"83",X"74",X"82",X"89",X"81",X"78",X"7D",X"8C",X"7F",X"7C",X"76",X"8A",X"86",X"7B", + X"77",X"8C",X"81",X"80",X"7E",X"74",X"86",X"88",X"82",X"7A",X"78",X"8B",X"83",X"7E",X"82",X"77", + X"7B",X"88",X"87",X"7A",X"77",X"86",X"89",X"78",X"7A",X"8C",X"7F",X"81",X"79",X"78",X"87",X"87", + X"81",X"76",X"80",X"8D",X"74",X"81",X"89",X"7D",X"83",X"76",X"7D",X"8B",X"81",X"73",X"87",X"88", + X"7D",X"76",X"8D",X"7D",X"77",X"8A",X"82",X"7A",X"78",X"89",X"86",X"76",X"7C",X"8B",X"81",X"7D", + X"75",X"8B",X"82",X"74",X"8A",X"82",X"74",X"8B",X"81",X"80",X"7E",X"75",X"85",X"8A",X"77",X"7B", + X"8A",X"83",X"77",X"7C",X"8B",X"81",X"77",X"7D",X"8D",X"7D",X"83",X"7A",X"78",X"89",X"86",X"7D", + X"83",X"79",X"79",X"8A",X"84",X"75",X"80",X"8A",X"80",X"7B",X"78",X"8E",X"7C",X"78",X"8B",X"7F", + X"81",X"7C",X"76",X"86",X"87",X"80",X"74",X"85",X"88",X"7B",X"76",X"8C",X"81",X"82",X"78",X"7C", + X"8A",X"80",X"7B",X"78",X"8C",X"80",X"7E",X"75",X"87",X"87",X"7D",X"76",X"86",X"88",X"7B",X"77", + X"87",X"87",X"79",X"7A",X"8C",X"7B",X"78",X"8C",X"80",X"81",X"7D",X"76",X"85",X"88",X"80",X"7E", + X"76",X"86",X"88",X"7D",X"76",X"84",X"89",X"7B",X"79",X"89",X"81",X"80",X"7B",X"77",X"89",X"84", + X"80",X"7F",X"75",X"88",X"84",X"7F",X"77",X"7F",X"8B",X"80",X"78",X"7E",X"8C",X"7B",X"79",X"88", + X"83",X"77",X"7F",X"8C",X"76",X"7F",X"89",X"7F",X"78",X"7C",X"8B",X"81",X"76",X"83",X"8A",X"74", + X"83",X"88",X"75",X"82",X"89",X"74",X"81",X"89",X"7D",X"83",X"77",X"7C",X"8C",X"7E",X"76",X"88", + X"86",X"7E",X"83",X"7A",X"79",X"83",X"89",X"7F",X"76",X"88",X"85",X"74",X"84",X"89",X"75",X"82", + X"88",X"7D",X"83",X"75",X"80",X"88",X"82",X"7A",X"7B",X"8B",X"7E",X"82",X"7B",X"78",X"88",X"86", + X"76",X"83",X"88",X"74",X"83",X"88",X"7E",X"76",X"85",X"87",X"7E",X"82",X"7C",X"78",X"83",X"87", + X"83",X"76",X"80",X"89",X"80",X"77",X"81",X"8A",X"7E",X"81",X"7E",X"77",X"81",X"89",X"81",X"78", + X"7C",X"8B",X"80",X"82",X"74",X"86",X"85",X"80",X"77",X"82",X"88",X"7F",X"7A",X"7B",X"8C",X"7E", + X"82",X"7B",X"78",X"87",X"86",X"7E",X"82",X"76",X"81",X"8A",X"7A",X"79",X"87",X"86",X"7A",X"79", + X"89",X"83",X"7F",X"81",X"76",X"83",X"89",X"78",X"7C",X"89",X"82",X"78",X"7C",X"8B",X"7F",X"81", + X"7C",X"77",X"87",X"85",X"7E",X"81",X"77",X"7E",X"8A",X"80",X"81",X"7F",X"77",X"81",X"89",X"80", + X"80",X"7F",X"76",X"84",X"88",X"7E",X"82",X"79",X"7B",X"87",X"86",X"7C",X"79",X"88",X"83",X"76", + X"81",X"88",X"80",X"77",X"81",X"89",X"7D",X"78",X"86",X"84",X"76",X"81",X"88",X"80",X"77",X"85", + X"86",X"76",X"7E",X"89",X"81",X"78",X"7F",X"8A",X"7E",X"78",X"89",X"81",X"80",X"7E",X"77",X"82", + X"87",X"82",X"7F",X"81",X"78",X"7D",X"88",X"83",X"7F",X"77",X"86",X"85",X"7E",X"82",X"76",X"80", + X"88",X"82",X"7E",X"77",X"86",X"85",X"7F",X"77",X"86",X"85",X"7F",X"78",X"81",X"8A",X"75",X"83", + X"87",X"77",X"7F",X"8A",X"79",X"7B",X"88",X"84",X"76",X"84",X"85",X"7E",X"78",X"82",X"88",X"7F", + X"78",X"84",X"87",X"76",X"7F",X"88",X"82",X"7E",X"82",X"77",X"7F",X"89",X"7E",X"82",X"7B",X"7A", + X"87",X"85",X"76",X"81",X"88",X"80",X"77",X"81",X"88",X"7E",X"82",X"7E",X"78",X"82",X"87",X"81", + X"77",X"80",X"88",X"7F",X"78",X"81",X"89",X"7E",X"82",X"7E",X"78",X"82",X"88",X"81",X"78",X"7F", + X"89",X"7E",X"82",X"7E",X"78",X"83",X"88",X"7A",X"7B",X"88",X"81",X"7E",X"77",X"87",X"84",X"7F", + X"78",X"82",X"89",X"75",X"84",X"85",X"7F",X"81",X"78",X"7E",X"8A",X"7E",X"79",X"89",X"80",X"81", + X"7D",X"78",X"85",X"86",X"81",X"76",X"86",X"84",X"80",X"79",X"7E",X"88",X"81",X"79",X"7D",X"8A", + X"7E",X"82",X"7E",X"7A",X"7D",X"88",X"82",X"81",X"79",X"7F",X"8A",X"79",X"7B",X"88",X"82",X"7F", + X"7F",X"77",X"85",X"86",X"7F",X"78",X"82",X"88",X"7F",X"82",X"7B",X"7A",X"86",X"85",X"7F",X"81", + X"77",X"82",X"87",X"80",X"78",X"83",X"86",X"7D",X"83",X"77",X"81",X"88",X"7F",X"82",X"7B",X"7A", + X"88",X"83",X"77",X"83",X"87",X"78",X"7E",X"88",X"80",X"80",X"7F",X"79",X"7D",X"87",X"83",X"80", + X"77",X"83",X"85",X"7F",X"7A",X"7C",X"89",X"81",X"7A",X"7D",X"8A",X"7A",X"7B",X"86",X"84",X"7A", + X"7C",X"89",X"7F",X"82",X"7C",X"7A",X"88",X"81",X"77",X"85",X"86",X"77",X"84",X"85",X"77",X"81", + X"88",X"78",X"7D",X"87",X"82",X"78",X"81",X"87",X"7A",X"7C",X"89",X"7D",X"79",X"87",X"83",X"7A", + X"7C",X"88",X"82",X"7A",X"7D",X"88",X"80",X"78",X"86",X"83",X"76",X"84",X"86",X"7E",X"78",X"86", + X"83",X"7E",X"81",X"77",X"81",X"86",X"83",X"79",X"7E",X"88",X"7F",X"81",X"7D",X"79",X"86",X"84", + X"7E",X"82",X"77",X"81",X"86",X"82",X"78",X"82",X"86",X"80",X"7D",X"7A",X"89",X"80",X"7F",X"78", + X"88",X"81",X"78",X"87",X"81",X"7F",X"81",X"78",X"82",X"88",X"79",X"7F",X"88",X"7B",X"7B",X"85", + X"85",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"79",X"84",X"85",X"80",X"80",X"78",X"86",X"84",X"77", + X"81",X"87",X"7E",X"82",X"7A",X"7D",X"89",X"7E",X"82",X"7D",X"7A",X"82",X"87",X"7F",X"81",X"7F", + X"79",X"83",X"87",X"7A",X"7C",X"87",X"81",X"7E",X"79",X"85",X"85",X"7E",X"79",X"84",X"86",X"79", + X"7E",X"88",X"7B",X"7B",X"86",X"83",X"7F",X"82",X"79",X"7E",X"87",X"81",X"7D",X"79",X"86",X"84", + X"7F",X"79",X"84",X"85",X"77",X"85",X"84",X"7F",X"81",X"7A",X"7D",X"86",X"83",X"7E",X"82",X"7B", + X"7C",X"87",X"81",X"78",X"81",X"86",X"7F",X"79",X"82",X"86",X"7E",X"79",X"81",X"87",X"7E",X"79", + X"87",X"82",X"7F",X"80",X"78",X"84",X"85",X"7C",X"7B",X"87",X"81",X"80",X"78",X"86",X"83",X"80", + X"7B",X"7C",X"88",X"81",X"7C",X"7C",X"89",X"7B",X"7B",X"85",X"84",X"7B",X"7B",X"85",X"84",X"7C", + X"7A",X"86",X"84",X"7C",X"7B",X"87",X"82",X"7F",X"79",X"85",X"84",X"78",X"84",X"84",X"7A",X"7E", + X"87",X"81",X"7A",X"81",X"86",X"7A",X"7C",X"87",X"81",X"7F",X"81",X"7A",X"7F",X"88",X"7E",X"7A", + X"85",X"83",X"7A",X"7E",X"88",X"7B",X"7D",X"88",X"7D",X"7B",X"87",X"80",X"79",X"84",X"84",X"7E", + X"82",X"79",X"7F",X"87",X"80",X"80",X"79",X"83",X"86",X"7F",X"79",X"83",X"85",X"78",X"80",X"87", + X"7F",X"81",X"7A",X"7F",X"88",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"7A",X"84",X"85",X"7F",X"79", + X"81",X"87",X"7E",X"82",X"7B",X"7E",X"87",X"7E",X"79",X"84",X"85",X"7E",X"82",X"7C",X"7B",X"84", + X"86",X"78",X"83",X"84",X"80",X"7A",X"7E",X"86",X"82",X"7A",X"7E",X"87",X"81",X"7A",X"7F",X"87", + X"80",X"7E",X"79",X"86",X"83",X"7F",X"81",X"79",X"81",X"86",X"7E",X"82",X"7B",X"7D",X"87",X"80", + X"81",X"7F",X"7A",X"81",X"87",X"7C",X"7B",X"86",X"82",X"7C",X"7B",X"86",X"83",X"7D",X"7A",X"88", + X"7E",X"7B",X"85",X"82",X"7B",X"7D",X"87",X"80",X"7E",X"7A",X"85",X"84",X"7E",X"7A",X"85",X"84", + X"7E",X"7A",X"84",X"84",X"7E",X"82",X"79",X"80",X"86",X"7E",X"7A",X"85",X"83",X"7F",X"80",X"79", + X"85",X"84",X"79",X"82",X"86",X"79",X"81",X"86",X"7B",X"7D",X"87",X"7F",X"79",X"86",X"81",X"79", + X"85",X"83",X"79",X"82",X"85",X"78",X"82",X"85",X"7F",X"81",X"7B",X"7D",X"87",X"80",X"80",X"7F", + X"7A",X"83",X"86",X"7B",X"7D",X"86",X"81",X"7B",X"7D",X"86",X"82",X"7C",X"7D",X"88",X"7D",X"7B", + X"83",X"85",X"7E",X"7A",X"83",X"85",X"7C",X"7C",X"86",X"80",X"7F",X"7A",X"85",X"83",X"79",X"85", + X"83",X"7A",X"81",X"86",X"79",X"80",X"85",X"81",X"7E",X"7B",X"87",X"80",X"81",X"7E",X"7B",X"83", + X"86",X"79",X"81",X"84",X"80",X"7B",X"80",X"86",X"7F",X"7D",X"7D",X"88",X"7E",X"82",X"7C",X"7C", + X"85",X"83",X"79",X"81",X"86",X"7F",X"7A",X"82",X"86",X"79",X"80",X"85",X"81",X"7A",X"7F",X"86", + X"81",X"7B",X"7E",X"87",X"7F",X"80",X"80",X"7B",X"80",X"87",X"7E",X"7A",X"85",X"83",X"7F",X"7A", + X"84",X"84",X"7F",X"7C",X"7E",X"87",X"7E",X"82",X"7D",X"7B",X"85",X"81",X"7F",X"7A",X"85",X"82", + X"7F",X"7B",X"80",X"86",X"80",X"7B",X"80",X"86",X"7F",X"80",X"80",X"7A",X"81",X"85",X"7F",X"7A", + X"82",X"85",X"80",X"7B",X"81",X"86",X"7C",X"7C",X"86",X"81",X"81",X"7C",X"7E",X"86",X"7F",X"80", + X"79",X"84",X"84",X"7F",X"80",X"7F",X"7A",X"83",X"84",X"7F",X"81",X"7B",X"7E",X"83",X"85",X"7D", + X"7C",X"86",X"81",X"7A",X"81",X"85",X"7F",X"7B",X"84",X"82",X"7F",X"81",X"7A",X"80",X"85",X"81", + X"7F",X"81",X"7D",X"7C",X"84",X"84",X"7F",X"7A",X"82",X"85",X"7F",X"81",X"7F",X"7A",X"84",X"83", + X"7F",X"80",X"7A",X"81",X"85",X"80",X"80",X"7D",X"7C",X"86",X"81",X"80",X"80",X"7A",X"85",X"82", + X"7F",X"81",X"7B",X"7E",X"85",X"82",X"7F",X"81",X"7B",X"7F",X"84",X"83",X"7C",X"7D",X"85",X"82", + X"7C",X"7E",X"86",X"7D",X"7C",X"85",X"82",X"7F",X"81",X"7E",X"7B",X"84",X"83",X"81",X"7C",X"7D", + X"87",X"7C",X"7E",X"86",X"7F",X"7B",X"86",X"80",X"81",X"7C",X"7E",X"86",X"7F",X"7B",X"83",X"84", + X"7F",X"80",X"7A",X"81",X"85",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"7E",X"7C",X"87",X"7E",X"7C", + X"85",X"80",X"7B",X"84",X"82",X"79",X"82",X"84",X"81",X"7A",X"81",X"85",X"80",X"7F",X"7B",X"86", + X"81",X"7A",X"83",X"84",X"7F",X"81",X"7F",X"7B",X"82",X"85",X"7B",X"7D",X"85",X"81",X"7F",X"81", + X"7D",X"7C",X"85",X"82",X"80",X"7A",X"83",X"83",X"80",X"7D",X"7D",X"86",X"80",X"7F",X"7B",X"84", + X"83",X"7F",X"81",X"7E",X"7C",X"83",X"84",X"7B",X"81",X"85",X"7C",X"7E",X"86",X"7C",X"7D",X"84", + X"84",X"7C",X"7E",X"85",X"80",X"7C",X"7D",X"85",X"81",X"7F",X"81",X"7C",X"7F",X"86",X"7F",X"81", + X"7F",X"7B",X"84",X"83",X"7C",X"7F",X"86",X"7B",X"7E",X"84",X"82",X"7D",X"7D",X"85",X"80",X"7F", + X"7B",X"86",X"80",X"80",X"7F",X"7B",X"82",X"85",X"7B",X"80",X"84",X"80",X"7D",X"7D",X"85",X"82", + X"7D",X"7D",X"85",X"81",X"7D",X"7D",X"84",X"82",X"7D",X"7E",X"86",X"7D",X"7C",X"84",X"82",X"7B", + X"80",X"85",X"7F",X"80",X"80",X"7B",X"81",X"85",X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"7B", + X"81",X"84",X"7F",X"7B",X"83",X"83",X"7F",X"81",X"7B",X"80",X"83",X"83",X"7D",X"7C",X"85",X"81", + X"7F",X"81",X"7D",X"7D",X"83",X"83",X"80",X"7B",X"83",X"83",X"80",X"7B",X"81",X"84",X"80",X"7C", + X"80",X"85",X"7B",X"7E",X"84",X"82",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"80",X"7B",X"83",X"84", + X"7A",X"83",X"82",X"80",X"7C",X"81",X"85",X"7B",X"7F",X"84",X"80",X"7F",X"81",X"7C",X"7F",X"85", + X"7E",X"7C",X"83",X"84",X"7F",X"81",X"7B",X"80",X"84",X"7F",X"81",X"7D",X"7C",X"83",X"83",X"80", + X"7B",X"80",X"84",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F",X"7C",X"81",X"85",X"7B",X"7F",X"85", + X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"80",X"80",X"7B",X"82",X"83",X"7F",X"81",X"7D",X"7D", + X"85",X"80",X"80",X"80",X"7C",X"80",X"85",X"80",X"80",X"7F",X"7C",X"85",X"81",X"7B",X"82",X"83", + X"7A",X"82",X"83",X"7F",X"81",X"7B",X"80",X"85",X"7F",X"7C",X"84",X"82",X"7B",X"80",X"84",X"81", + X"7C",X"7F",X"85",X"7F",X"82",X"7D",X"7E",X"85",X"80",X"7B",X"82",X"83",X"7F",X"80",X"7B",X"85", + X"81",X"7B",X"81",X"84",X"80",X"7C",X"83",X"82",X"7B",X"80",X"84",X"80",X"81",X"7C",X"81",X"85", + X"7B",X"7F",X"85",X"7D",X"7D",X"84",X"81",X"80",X"81",X"7E",X"7C",X"83",X"83",X"7F",X"7C",X"81", + X"84",X"7F",X"81",X"7C",X"7F",X"85",X"7F",X"7C",X"82",X"83",X"7E",X"7C",X"82",X"84",X"7F",X"81", + X"7F",X"7C",X"81",X"84",X"80",X"80",X"81",X"7C",X"80",X"85",X"7F",X"7C",X"84",X"80",X"81",X"7C", + X"7F",X"84",X"81",X"7E",X"7D",X"84",X"82",X"7D",X"7D",X"84",X"81",X"7E",X"7C",X"84",X"81",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"7C",X"82",X"83",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F", + X"7C",X"80",X"83",X"82",X"7D",X"7E",X"84",X"81",X"7F",X"81",X"7C",X"80",X"84",X"81",X"7D",X"7E", + X"84",X"80",X"7F",X"7C",X"83",X"83",X"7E",X"7D",X"84",X"81",X"7B",X"82",X"83",X"7F",X"7C",X"81", + X"83",X"80",X"7C",X"81",X"84",X"7F",X"80",X"80",X"7C",X"81",X"84",X"7D",X"7D",X"83",X"82",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"80",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"84",X"81", + X"7F",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"85",X"80",X"80",X"7F",X"7C",X"83",X"82",X"7C", + X"81",X"84",X"7C",X"80",X"84",X"7D",X"7E",X"85",X"7F",X"7C",X"83",X"82",X"7F",X"81",X"7C",X"81", + X"84",X"80",X"80",X"80",X"7D",X"7F",X"83",X"82",X"7C",X"81",X"83",X"7F",X"81",X"7C",X"7F",X"83", + X"81",X"7F",X"81",X"7D",X"7E",X"85",X"80",X"80",X"7F",X"7C",X"82",X"83",X"7D",X"7E",X"83",X"82", + X"7E",X"7D",X"84",X"81",X"80",X"80",X"7C",X"81",X"84",X"80",X"81",X"7E",X"7D",X"84",X"82",X"7C", + X"82",X"83",X"7C",X"7F",X"84",X"80",X"80",X"81",X"7D",X"7E",X"83",X"82",X"80",X"80",X"7C",X"82", + X"83",X"7C",X"80",X"84",X"7D",X"7D",X"84",X"80",X"81",X"7C",X"82",X"83",X"7F",X"7E",X"7E",X"84", + X"80",X"80",X"80",X"7D",X"7E",X"85",X"80",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7F",X"7C",X"82", + X"83",X"7B",X"80",X"83",X"80",X"7D",X"7E",X"84",X"80",X"80",X"80",X"7D",X"7F",X"84",X"7F",X"7C", + X"84",X"81",X"80",X"7C",X"83",X"82",X"7C",X"82",X"82",X"7C",X"80",X"84",X"7D",X"7E",X"84",X"80", + X"80",X"80",X"7C",X"83",X"82",X"80",X"7E",X"7E",X"85",X"7E",X"7D",X"82",X"83",X"7E",X"7D",X"83", + X"80",X"7C",X"83",X"81",X"7C",X"83",X"81",X"80",X"80",X"7C",X"7F",X"82",X"82",X"7E",X"7D",X"83", + X"82",X"7E",X"7D",X"83",X"82",X"7E",X"7E",X"84",X"7F",X"7C",X"84",X"80",X"7C",X"83",X"81",X"7F", + X"80",X"7C",X"81",X"83",X"80",X"7F",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7B",X"82",X"82",X"7F", + X"80",X"7C",X"82",X"82",X"80",X"7D",X"82",X"83",X"7B",X"82",X"82",X"80",X"7D",X"80",X"83",X"80", + X"7D",X"80",X"84",X"7F",X"81",X"7F",X"7D",X"82",X"83",X"80",X"7C",X"81",X"83",X"7F",X"7D",X"81", + X"84",X"7D",X"7F",X"84",X"7F",X"7D",X"84",X"80",X"81",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7E", + X"82",X"83",X"7F",X"81",X"7D",X"7F",X"83",X"81",X"7D",X"7F",X"84",X"80",X"7C",X"83",X"81",X"7C", + X"82",X"82",X"7C",X"80",X"83",X"80",X"80",X"80",X"7D",X"7E",X"83",X"81",X"80",X"80",X"7F",X"7D", + X"82",X"83",X"80",X"80",X"80",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7D",X"82",X"82",X"80",X"7E", + X"7D",X"84",X"81",X"80",X"80",X"7D",X"80",X"84",X"7E",X"7E",X"83",X"81",X"7F",X"7D",X"82",X"82", + X"7E",X"7E",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"7D",X"82",X"83",X"7F",X"7D",X"83",X"81",X"7C", + X"82",X"81",X"7F",X"81",X"7D",X"80",X"83",X"7F",X"7D",X"83",X"81",X"7F",X"81",X"7C",X"81",X"83", + X"7F",X"80",X"7F",X"7D",X"82",X"82",X"80",X"7D",X"80",X"83",X"80",X"7D",X"82",X"82",X"7F",X"81", + X"7D",X"7F",X"82",X"82",X"7D",X"81",X"83",X"7F",X"81",X"7D",X"7E",X"84",X"7F",X"7D",X"83",X"80", + X"7D",X"83",X"81",X"80",X"7E",X"7E",X"84",X"7E",X"7E",X"82",X"81",X"7D",X"80",X"83",X"81",X"7E", + X"7E",X"83",X"81",X"7D",X"80",X"83",X"7E",X"7E",X"83",X"81",X"80",X"80",X"7C",X"82",X"82",X"7E", + X"7E",X"83",X"81",X"7E",X"7E",X"83",X"80",X"80",X"7F",X"7D",X"83",X"80",X"80",X"7D",X"83",X"81", + X"80",X"7D",X"80",X"83",X"7F",X"81",X"7E",X"7F",X"83",X"7F",X"7D",X"83",X"80",X"7C",X"83",X"81", + X"7D",X"82",X"82",X"7C",X"81",X"82",X"80",X"7E",X"7F",X"83",X"81",X"7E",X"7F",X"83",X"80",X"80", + X"81",X"7D",X"7F",X"83",X"81",X"7D",X"80",X"83",X"80",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"7F", + X"83",X"80",X"7D",X"83",X"80",X"7F",X"7D",X"83",X"81",X"80",X"80",X"7D",X"81",X"83",X"80",X"7D", + X"83",X"81",X"80",X"80",X"7D",X"80",X"82",X"81",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81", + X"80",X"81",X"7E",X"7E",X"82",X"82",X"7F",X"7D",X"82",X"82",X"7C",X"81",X"82",X"81",X"7D",X"81", + X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"81",X"7E",X"7E", + X"83",X"81",X"7F",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82",X"82",X"7E",X"7E",X"83", + X"80",X"80",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"7F",X"7E",X"83",X"80",X"7D",X"81",X"83", + X"7F",X"80",X"80",X"7D",X"80",X"83",X"7D",X"7F",X"83",X"80",X"81",X"7E",X"7E",X"83",X"80",X"80", + X"80",X"7D",X"80",X"82",X"82",X"7D",X"80",X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"80",X"80",X"7D",X"80",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"81",X"7F",X"7E",X"82",X"81", + X"7D",X"81",X"82",X"7F",X"81",X"7D",X"80",X"82",X"81",X"7E",X"7F",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"7D",X"81",X"82",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"7F",X"7D",X"81",X"83",X"7F", + X"7E",X"82",X"81",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"81",X"82",X"7F",X"80",X"7E",X"7E",X"82", + X"82",X"80",X"80",X"7D",X"81",X"83",X"7E",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82", + X"82",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"80",X"82",X"80",X"7E",X"80",X"83",X"80", + X"7F",X"7E",X"83",X"81",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"83",X"7F", + X"7E",X"83",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"80",X"7D",X"80",X"82", + X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"82",X"80",X"7F",X"7E",X"83",X"7F",X"7E", + X"83",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"81",X"81",X"80",X"7E",X"7F",X"83",X"80", + X"7F",X"7E",X"83",X"80",X"80",X"80",X"7F",X"7E",X"82",X"82",X"80",X"80",X"80",X"7D",X"81",X"82", + X"7D",X"80",X"83",X"7F",X"7E",X"82",X"81",X"7D",X"80",X"82",X"80",X"7D",X"81",X"81",X"80",X"7D", + X"81",X"82",X"80",X"7E",X"7F",X"83",X"80",X"80",X"80",X"7E",X"7F",X"82",X"82",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"82",X"82",X"80",X"80",X"80",X"7E",X"80",X"82", + X"81",X"7E",X"81",X"82",X"7F",X"81",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"80",X"82",X"81", + X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E",X"80",X"82",X"80", + X"80",X"80",X"7D",X"82",X"81",X"80",X"80",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"82",X"81", + X"7F",X"81",X"7E",X"7F",X"82",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"7D", + X"81",X"82",X"7D",X"80",X"82",X"80",X"7E",X"81",X"82",X"7D",X"81",X"81",X"80",X"7D",X"81",X"82", + X"7F",X"80",X"7E",X"7F",X"82",X"81",X"7F",X"81",X"7D",X"81",X"82",X"7E",X"7F",X"82",X"81",X"7E", + X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E", + X"7F",X"82",X"81",X"7E",X"81",X"82",X"7E",X"7F",X"82",X"80",X"80",X"7E",X"81",X"82",X"7F",X"80", + X"7E",X"80",X"81",X"82",X"7F",X"7E",X"82",X"81",X"7F",X"81",X"7F",X"7E",X"82",X"81",X"7E",X"80", + X"82",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E", + X"82",X"81",X"80",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"82",X"80",X"7F",X"7F",X"83",X"7E",X"7F", + X"82",X"80",X"7F",X"7E",X"82",X"81",X"7F",X"7E",X"82",X"81",X"80",X"7E",X"81",X"81",X"80",X"7E", + X"80",X"82",X"80",X"7F",X"7E",X"83",X"80",X"80",X"80",X"7E",X"81",X"82",X"80",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7E",X"7F",X"82",X"81",X"7F",X"7F",X"83",X"7E",X"7F",X"82",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GAL_HIT.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GAL_HIT.vhd new file mode 100644 index 00000000..7d2fd29c --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/GAL_HIT.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_HIT 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 prom of GAL_HIT is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"65",X"75",X"88",X"90",X"93",X"9B",X"A3",X"A3",X"A3",X"A6",X"9E",X"9B",X"9B",X"A3",X"AB",X"B6", + X"B9",X"B9",X"BE",X"B9",X"AE",X"A6",X"9E",X"98",X"88",X"78",X"68",X"65",X"65",X"65",X"62",X"68", + X"68",X"65",X"5D",X"52",X"47",X"47",X"4A",X"4D",X"4D",X"4D",X"52",X"65",X"7D",X"88",X"90",X"9B", + X"A3",X"AE",X"AE",X"AB",X"AB",X"9E",X"98",X"88",X"70",X"52",X"37",X"1F",X"17",X"1F",X"27",X"3A", + X"5A",X"68",X"78",X"83",X"93",X"A3",X"AB",X"AE",X"A3",X"93",X"88",X"88",X"83",X"88",X"8B",X"88", + X"78",X"62",X"4A",X"42",X"3A",X"42",X"4D",X"55",X"65",X"78",X"83",X"8B",X"93",X"90",X"88",X"88", + X"98",X"A6",X"A6",X"AB",X"9E",X"8B",X"7D",X"68",X"70",X"88",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC", + X"FC",X"FC",X"DC",X"9B",X"4D",X"14",X"01",X"04",X"2F",X"52",X"5D",X"68",X"78",X"80",X"78",X"70", + X"5D",X"47",X"32",X"1F",X"14",X"09",X"11",X"1C",X"32",X"52",X"83",X"B9",X"D1",X"C9",X"AB",X"8B", + X"70",X"68",X"75",X"78",X"80",X"8B",X"8B",X"98",X"AB",X"BE",X"C1",X"AB",X"83",X"5D",X"3A",X"17", + X"11",X"17",X"27",X"3A",X"65",X"90",X"AE",X"B6",X"9B",X"78",X"55",X"4A",X"4D",X"5A",X"5D",X"52", + X"4A",X"4A",X"52",X"78",X"AB",X"D4",X"FC",X"FC",X"F7",X"E9",X"E1",X"D1",X"C9",X"BE",X"AB",X"90", + X"52",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"2F",X"4A",X"52",X"47",X"47",X"62",X"70",X"7D", + X"7D",X"78",X"7D",X"90",X"B3",X"CE",X"EC",X"FC",X"FC",X"FC",X"FC",X"F4",X"E9",X"F4",X"FC",X"FC", + X"FC",X"FC",X"CE",X"98",X"65",X"2C",X"01",X"01",X"01",X"01",X"01",X"32",X"6D",X"7D",X"68",X"4A", + X"27",X"11",X"1C",X"3A",X"4D",X"62",X"68",X"65",X"68",X"70",X"80",X"9B",X"D1",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"A3",X"75",X"55",X"62",X"80",X"A3",X"BE",X"CE",X"C1",X"90",X"4A",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"88",X"C9",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC", + X"B6",X"90",X"68",X"3F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1F",X"83",X"BE",X"D1",X"CE", + X"D4",X"F4",X"FC",X"FC",X"FC",X"F7",X"D1",X"CE",X"DC",X"F7",X"FC",X"FC",X"FC",X"FC",X"D1",X"8B", + X"68",X"68",X"88",X"A6",X"C1",X"D9",X"D4",X"BE",X"A3",X"88",X"75",X"68",X"62",X"5D",X"62",X"68", + X"6D",X"78",X"75",X"55",X"2C",X"11",X"11",X"2F",X"55",X"75",X"83",X"93",X"9E",X"B9",X"E9",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"68",X"32",X"11",X"17",X"32",X"52",X"7D", + X"AE",X"E1",X"F7",X"E1",X"A3",X"62",X"17",X"01",X"01",X"01",X"01",X"01",X"1C",X"4D",X"7D",X"90", + X"9B",X"A6",X"B6",X"BE",X"A6",X"70",X"37",X"14",X"14",X"1C",X"14",X"1C",X"2F",X"3A",X"3A",X"3A", + X"4A",X"52",X"4A",X"47",X"3A",X"24",X"11",X"14",X"27",X"3A",X"65",X"9E",X"D4",X"FC",X"FC",X"F7", + X"D4",X"AB",X"93",X"93",X"93",X"83",X"68",X"4D",X"37",X"37",X"5D",X"9B",X"EC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"CE",X"AB",X"93",X"7D",X"65",X"65",X"75",X"88",X"93",X"98",X"98",X"93", + X"93",X"90",X"93",X"8B",X"90",X"90",X"90",X"8B",X"8B",X"90",X"8B",X"90",X"90",X"90",X"90",X"8B", + X"8B",X"8B",X"8B",X"8B",X"88",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"83",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"78",X"75",X"78",X"75",X"78", + X"78",X"78",X"75",X"78",X"75",X"70",X"75",X"75",X"75",X"75",X"70",X"6D",X"68",X"6D",X"70",X"6D", + X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"70",X"70",X"70",X"75",X"75",X"75",X"75", + X"75",X"70",X"62",X"4D",X"4D",X"4D",X"47",X"4A",X"68",X"98",X"B6",X"B3",X"9B",X"78",X"5A",X"3F", + X"32",X"2F",X"32",X"3F",X"5A",X"90",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"E9",X"90",X"4D",X"3A", + X"47",X"5D",X"5D",X"4D",X"3A",X"27",X"1C",X"14",X"11",X"0C",X"01",X"01",X"01",X"01",X"01",X"01", + X"04",X"4A",X"9E",X"F7",X"FC",X"FC",X"FC",X"FC",X"EC",X"E4",X"E4",X"D1",X"AB",X"80",X"62",X"47", + X"37",X"2F",X"2C",X"24",X"04",X"01",X"24",X"52",X"70",X"70",X"62",X"4D",X"3F",X"37",X"37",X"3A", + X"4D",X"62",X"78",X"93",X"AE",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"B6",X"68", + X"2C",X"01",X"01",X"01",X"01",X"01",X"01",X"09",X"47",X"65",X"68",X"68",X"62",X"5A",X"52",X"4D", + X"52",X"4D",X"52",X"52",X"5A",X"5D",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"65",X"37",X"1C", + X"09",X"09",X"1C",X"32",X"4D",X"70",X"93",X"AB",X"C9",X"D9",X"E9",X"EF",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"F7",X"6D",X"0C",X"01",X"01",X"01",X"01",X"01",X"17",X"62",X"83",X"78", + X"5A",X"37",X"14",X"04",X"01",X"01",X"01",X"01",X"04",X"11",X"1C",X"1C",X"01",X"01",X"0C",X"3F", + X"6D",X"7D",X"78",X"68",X"65",X"83",X"B3",X"E1",X"F4",X"E4",X"C6",X"A3",X"8B",X"75",X"68",X"65", + X"5D",X"62",X"65",X"62",X"5A",X"3F",X"27",X"17",X"1F",X"5A",X"9E",X"CE",X"D4",X"C9",X"AE",X"A6", + X"AE",X"AB",X"9B",X"83",X"80",X"98",X"9B",X"9B",X"9B",X"B6",X"D9",X"E4",X"E1",X"DC",X"E1",X"D4", + X"B3",X"83",X"5A",X"3A",X"1F",X"11",X"0C",X"11",X"14",X"1C",X"1F",X"2C",X"2C",X"1F",X"27",X"32", + X"3F",X"5D",X"83",X"9B",X"93",X"93",X"88",X"7D",X"7D",X"75",X"70",X"70",X"6D",X"68",X"68",X"68", + X"5A",X"5A",X"75",X"88",X"93",X"93",X"90",X"90",X"88",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"80", + X"7D",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80",X"83",X"83",X"80",X"80", + X"80",X"7D",X"7D",X"70",X"70",X"6D",X"75",X"83",X"90",X"93",X"90",X"88",X"88",X"80",X"78",X"7D", + X"70",X"68",X"70",X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"75",X"70",X"68",X"4D",X"3A", + X"4A",X"70",X"93",X"A3",X"B6",X"B9",X"B3",X"A3",X"90",X"80",X"75",X"70",X"68",X"68",X"68",X"65", + X"68",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"75",X"78", + X"78",X"78",X"78",X"78",X"78",X"78",X"70",X"55",X"37",X"1F",X"24",X"47",X"68",X"7D",X"88",X"8B", + X"88",X"88",X"88",X"8B",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"C9",X"AB",X"80",X"5A", + X"4A",X"47",X"37",X"2C",X"32",X"4D",X"70",X"78",X"7D",X"8B",X"90",X"88",X"68",X"4A",X"2C",X"1C", + X"11",X"09",X"01",X"01",X"01",X"01",X"14",X"27",X"47",X"70",X"AE",X"E1",X"F4",X"E4",X"D1",X"AE", + X"93",X"80",X"70",X"68",X"62",X"62",X"65",X"68",X"6D",X"75",X"78",X"78",X"65",X"4A",X"4D",X"5A", + X"62",X"65",X"68",X"88",X"B9",X"EC",X"FC",X"F4",X"D1",X"B6",X"B3",X"AE",X"A3",X"98",X"A3",X"C6", + X"D9",X"D4",X"D4",X"E1",X"E1",X"C9",X"9E",X"78",X"62",X"3F",X"32",X"2C",X"27",X"2C",X"32",X"37", + X"3F",X"47",X"4A",X"52",X"55",X"5A",X"5D",X"5D",X"5A",X"3F",X"27",X"14",X"11",X"14",X"24",X"4A", + X"80",X"A6",X"BE",X"C6",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC",X"BE",X"AB",X"8B", + X"5D",X"2F",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"70",X"6D",X"5D",X"4D", + X"4D",X"68",X"9B",X"BE",X"C9",X"B9",X"B3",X"AB",X"9B",X"A3",X"B3",X"C6",X"D1",X"B6",X"8B",X"52", + X"1C",X"11",X"11",X"14",X"37",X"62",X"90",X"9E",X"9B",X"83",X"75",X"5D",X"47",X"32",X"2F",X"24", + X"17",X"11",X"11",X"17",X"27",X"5D",X"A3",X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"EF",X"CE", + X"9B",X"7D",X"68",X"62",X"62",X"7D",X"98",X"9E",X"93",X"7D",X"6D",X"5D",X"55",X"52",X"52",X"52", + X"55",X"55",X"5D",X"62",X"65",X"68",X"6D",X"70",X"75",X"7D",X"78",X"7D",X"80",X"83",X"78",X"62", + X"3A",X"27",X"14",X"17",X"27",X"3F",X"5A",X"78",X"98",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70",X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32", + X"04",X"01",X"01",X"01",X"01",X"01",X"11",X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78", + X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24",X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93", + X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90",X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E", + X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E",X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B", + X"88",X"75",X"52",X"37",X"1F",X"1C",X"27",X"37",X"4D",X"68",X"83",X"AE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D1",X"9B",X"65",X"42",X"3A",X"52",X"80",X"AE",X"D4",X"E9",X"E4",X"C6", + X"80",X"3A",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"32",X"88",X"C6",X"F7",X"FC", + X"E4",X"CE",X"B9",X"A3",X"80",X"62",X"47",X"37",X"2F",X"2C",X"2F",X"37",X"3F",X"3A",X"32",X"3A", + X"37",X"32",X"37",X"3A",X"52",X"7D",X"B3",X"DC",X"E4",X"E1",X"D1",X"D1",X"E1",X"FC",X"FC",X"FC", + X"FC",X"F4",X"CE",X"A3",X"83",X"75",X"7D",X"83",X"83",X"88",X"98",X"A6",X"A6",X"98",X"88",X"75", + X"68",X"5D",X"5A",X"5A",X"5A",X"62",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"7D",X"83",X"83", + X"80",X"75",X"68",X"70",X"80",X"8B",X"93",X"98",X"98",X"90",X"90",X"8B",X"90",X"98",X"A3",X"AE", + X"B6",X"C9",X"C9",X"C1",X"B3",X"A3",X"98",X"8B",X"78",X"75",X"70",X"6D",X"65",X"68",X"70",X"80", + X"83",X"83",X"88",X"8B",X"83",X"78",X"68",X"5D",X"52",X"42",X"2C",X"27",X"2C",X"3A",X"47",X"42", + X"42",X"52",X"70",X"8B",X"A6",X"AB",X"A3",X"9E",X"9E",X"B3",X"B9",X"B9",X"BE",X"BE",X"B9",X"A3", + X"88",X"68",X"5D",X"5A",X"5A",X"52",X"52",X"68",X"70",X"65",X"62",X"62",X"68",X"7D",X"8B",X"8B", + X"83",X"75",X"65",X"68",X"75",X"80",X"9B",X"C1",X"EC",X"FC",X"FC",X"F7",X"EF",X"E9",X"D1",X"A3", + X"78",X"5D",X"42",X"2C",X"14",X"0C",X"09",X"0C",X"0C",X"17",X"2C",X"47",X"62",X"75",X"75",X"68", + X"62",X"52",X"4A",X"4A",X"42",X"3F",X"4A",X"55",X"68",X"90",X"A3",X"B9",X"C6",X"CE",X"E4",X"FC", + X"FC",X"EC",X"E9",X"E9",X"DC",X"C1",X"B3",X"A6",X"98",X"75",X"52",X"3A",X"2C",X"1C",X"11",X"01", + X"0C",X"1F",X"37",X"52",X"70",X"78",X"78",X"68",X"62",X"62",X"75",X"98",X"B6",X"BE",X"B3",X"AB", + X"A6",X"9B",X"9E",X"AE",X"B9",X"C1",X"AE",X"90",X"5D",X"32",X"2C",X"27",X"2C",X"3F",X"62",X"83", + X"93",X"90",X"88",X"80",X"70",X"5D",X"52",X"47",X"3A",X"2F",X"24",X"1F",X"2C",X"3A",X"68",X"A3", + X"D4",X"F4",X"FC",X"FC",X"F4",X"E9",X"E9",X"DC",X"B9",X"90",X"78",X"68",X"5D",X"62",X"7D",X"93", + X"9B",X"90",X"7D",X"70",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5A",X"5D",X"65",X"68",X"68",X"70", + X"70",X"75",X"78",X"78",X"7D",X"80",X"80",X"78",X"65",X"3F",X"27",X"17",X"1C",X"2C",X"3F",X"5D", + X"78",X"93",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70", + X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32",X"04",X"01",X"01",X"01",X"01",X"01",X"11", + X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78",X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24", + X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93",X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90", + X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E", + X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B",X"88",X"75",X"52",X"37",X"1F",X"1C",X"24", + X"37",X"4D",X"68",X"88",X"AE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"9B",X"65", + X"3F",X"37",X"52",X"80",X"B3",X"D9",X"EC",X"EC",X"C9",X"7D",X"37",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"27",X"88",X"D1",X"FC",X"FC",X"EC",X"D1",X"BE",X"A3",X"7D",X"62",X"3A", + X"2C",X"1F",X"1F",X"24",X"2C",X"32",X"2C",X"27",X"2F",X"27",X"27",X"27",X"2C",X"47",X"7D",X"C1", + X"F7",X"FC",X"FC",X"E9",X"E1",X"EC",X"FC",X"FC",X"FC",X"FC",X"FC",X"E4",X"AE",X"88",X"78",X"83", + X"8B",X"8B",X"93",X"A3",X"B9",X"BE",X"A6",X"90",X"75",X"65",X"52",X"52",X"52",X"4D",X"55",X"5D", + X"62",X"68",X"70",X"70",X"70",X"75",X"80",X"8B",X"90",X"90",X"8B",X"83",X"90",X"98",X"9B",X"9E", + X"9E",X"9B",X"93",X"93",X"8B",X"90",X"8B",X"8B",X"8B",X"88",X"8B",X"8B",X"8B",X"8B",X"88",X"8B", + X"8B",X"8B",X"8B",X"8B",X"8B",X"88",X"8B",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"80",X"80", + X"80",X"7D",X"65",X"47",X"52",X"68",X"78",X"78",X"65",X"5A",X"5D",X"6D",X"75",X"78",X"70",X"68", + X"70",X"90",X"C9",X"EC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A6",X"68",X"42",X"3A",X"37",X"3A",X"5D", + X"7D",X"83",X"68",X"55",X"52",X"47",X"32",X"17",X"09",X"01",X"01",X"09",X"17",X"2C",X"52",X"9B", + X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"DC",X"A6",X"78",X"62",X"47",X"1F",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"3F",X"7D",X"A3",X"9B",X"80",X"5D",X"4A",X"5A",X"7D",X"90",X"9B",X"AB", + X"A6",X"AB",X"AB",X"9E",X"A6",X"BE",X"D4",X"E4",X"D4",X"A6",X"88",X"7D",X"88",X"88",X"83",X"90", + X"A3",X"AB",X"A6",X"9E",X"98",X"8B",X"83",X"80",X"80",X"80",X"83",X"83",X"88",X"8B",X"8B",X"90", + X"90",X"90",X"93",X"98",X"98",X"9B",X"93",X"98",X"93",X"93",X"93",X"93",X"93",X"93",X"90",X"90", + X"90",X"8B",X"8B",X"83",X"80",X"7D",X"68",X"52",X"52",X"62",X"68",X"88",X"AB",X"C6",X"C9",X"C9", + X"B6",X"A6",X"9E",X"8B",X"83",X"8B",X"A3",X"B3",X"AE",X"98",X"80",X"6D",X"5D",X"52",X"47",X"42", + X"47",X"3F",X"47",X"42",X"42",X"4D",X"62",X"65",X"68",X"68",X"68",X"68",X"68",X"68",X"68",X"68", + X"65",X"68",X"68",X"68",X"6D",X"70",X"6D",X"6D",X"70",X"75",X"70",X"75",X"78",X"75",X"78",X"75", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"7D",X"80",X"80",X"6D",X"65",X"70",X"80",X"80",X"68", + X"52",X"32",X"2C",X"37",X"68",X"9B",X"B6",X"B6",X"B6",X"C1",X"D4",X"D9",X"C6",X"A3",X"78",X"5A", + X"3F",X"32",X"32",X"3A",X"55",X"8B",X"CE",X"FC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A3",X"62",X"2F", + X"1C",X"09",X"01",X"01",X"1C",X"47",X"5D",X"68",X"80",X"93",X"90",X"80",X"70",X"5A",X"4D",X"52", + X"68",X"78",X"7D",X"70",X"5D",X"4A",X"3A",X"32",X"32",X"2F",X"27",X"27",X"1C",X"11",X"09",X"0C", + X"14",X"2C",X"42",X"75",X"AB",X"DC",X"F7",X"FC",X"FC",X"F7",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"BE",X"88",X"4D",X"11",X"01",X"01",X"0C",X"3F",X"75",X"9E",X"B6",X"B3", + X"93",X"70",X"52",X"3A",X"1F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"3F", + X"52",X"62",X"68",X"7D",X"9E",X"C1",X"E4",X"FC",X"FC",X"F7",X"E1",X"BE",X"A3",X"90",X"80",X"88", + X"AB",X"E1",X"FC",X"FC",X"FC",X"FC",X"F7",X"BE",X"7D",X"3F",X"0C",X"01",X"01",X"01",X"01",X"27", + X"70",X"B6",X"E9",X"FC",X"FC",X"E9",X"AE",X"83",X"62",X"4D",X"2F",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"3F",X"98",X"CE",X"D1",X"BE",X"B6",X"C1",X"D4",X"E9",X"FC",X"E9",X"C9",X"AB", + X"9B",X"88",X"5D",X"37",X"27",X"27",X"1F",X"1C",X"1C",X"1F",X"37",X"70",X"B6",X"FC",X"FC",X"FC", + X"FC",X"FC",X"F4",X"F4",X"E4",X"C6",X"98",X"70",X"5A",X"3A",X"37",X"47",X"6D",X"AE",X"F7",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"93",X"55",X"17",X"01",X"01",X"01",X"1C",X"4A",X"80",X"AB", + X"B3",X"A6",X"A3",X"A3",X"A3",X"A6",X"9B",X"78",X"42",X"11",X"04",X"11",X"1C",X"1F",X"37",X"55", + X"7D",X"8B",X"80",X"5D",X"47",X"4D",X"65",X"6D",X"5D",X"4A",X"3F",X"4D",X"7D",X"B6",X"EC",X"FC", + X"FC",X"FC",X"E4",X"C6",X"9E",X"98",X"9B",X"90",X"75",X"5D",X"62",X"7D",X"9B",X"C6",X"E1",X"E9", + X"D9",X"B3",X"93",X"83",X"70",X"68",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5D",X"65",X"65",X"68", + X"5A",X"37",X"2F",X"4A",X"65",X"6D",X"68",X"75",X"93",X"BE",X"E4",X"EC",X"D1",X"B3",X"9E",X"AB", + X"AB",X"9E",X"80",X"65",X"42",X"32",X"32",X"4A",X"75",X"90",X"A3",X"BE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"D1",X"93",X"5A",X"3A",X"3A",X"47",X"5A",X"7D",X"A6",X"CE",X"CE",X"B9",X"A6",X"9B",X"80", + X"52",X"1C",X"01",X"01",X"01",X"11",X"47",X"78",X"9E",X"AB",X"9B",X"78",X"5A",X"2C",X"14",X"1C", + X"27",X"1F",X"11",X"01",X"01",X"01",X"1C",X"3F",X"75",X"AB",X"C9",X"D4",X"DC",X"CE",X"C9",X"D1", + X"E1",X"F4",X"FC",X"FC",X"FC",X"E4",X"BE",X"90",X"70",X"4A",X"11",X"01",X"01",X"01",X"01",X"09", + X"17",X"4A",X"90",X"D4",X"FC",X"FC",X"FC",X"F4",X"E9",X"E9",X"FC",X"FC",X"E4",X"B3",X"80",X"52", + X"2F",X"1C",X"1F",X"32",X"68",X"AE",X"F4",X"FC",X"FC",X"FC",X"E4",X"C9",X"AB",X"80",X"5D",X"47", + X"37",X"42",X"75",X"AB",X"DC",X"FC",X"FC",X"FC",X"D9",X"93",X"55",X"37",X"2F",X"3A",X"52",X"62", + X"68",X"68",X"55",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1C",X"32",X"4D",X"68", + X"9B",X"CE",X"E4",X"F4",X"EC",X"E4",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9", + X"88",X"4A",X"17",X"04",X"11",X"42",X"75",X"88",X"9B",X"B6",X"BE",X"A6",X"7D",X"4D",X"1C",X"01", + X"01",X"17",X"27",X"32",X"4D",X"7D",X"A6",X"B3",X"B9",X"C6",X"D1",X"D9",X"D9",X"CE",X"BE",X"A6", + X"90",X"65",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"14",X"68",X"93",X"98",X"83",X"75",X"7D", + X"9E",X"BE",X"C9",X"BE",X"A6",X"9E",X"B6",X"D9",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9",X"C1", + X"B3",X"9B",X"75",X"5D",X"47",X"2F",X"2F",X"4A",X"68",X"7D",X"7D",X"78",X"83",X"90",X"9E",X"AE", + X"A3",X"83",X"75",X"52",X"3F",X"4A",X"5D",X"62",X"55",X"3F",X"2F",X"24",X"32",X"5A",X"7D",X"90", + X"AB",X"CE",X"E4",X"FC",X"FC",X"FC",X"E9",X"CE",X"B3",X"98",X"88",X"83",X"83",X"90",X"B3",X"EC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"75",X"42",X"27",X"14",X"01",X"01",X"1C",X"3F",X"52",X"5A", + X"68",X"78",X"68",X"47",X"17",X"01",X"01",X"09",X"27",X"37",X"4A",X"65",X"75",X"6D",X"65",X"68", + X"68",X"5D",X"4D",X"42",X"27",X"0C",X"0C",X"14",X"1C",X"1F",X"3A",X"68",X"9E",X"CE",X"E1",X"DC", + X"DC",X"DC",X"DC",X"CE",X"A6",X"75",X"5A",X"4A",X"3A",X"4A",X"70",X"98",X"BE",X"E1",X"E9",X"E4", + X"B9",X"9E",X"90",X"8B",X"88",X"75",X"52",X"2F",X"2F",X"4A",X"5D",X"68",X"78",X"80",X"70",X"70", + X"7D",X"8B",X"9E",X"B6",X"BE",X"B6",X"AE",X"9B",X"98",X"AE",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"B9",X"9E",X"88",X"65",X"4D",X"47",X"3F",X"2F",X"11",X"01",X"04", + X"1F",X"2F",X"2F",X"1F",X"11",X"01",X"0C",X"2C",X"4D",X"62",X"78",X"98",X"AB",X"BE",X"DC",X"F4", + X"F7",X"E4",X"E1",X"DC",X"C1",X"9E",X"88",X"62",X"3A",X"14",X"01",X"11",X"17",X"27",X"32",X"55", + X"88",X"B6",X"E4",X"F7",X"E4",X"C6",X"A3",X"75",X"5A",X"52",X"5A",X"68",X"78",X"80",X"80",X"5A", + X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"3F",X"70",X"A3",X"C9",X"E1",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"C6",X"B3",X"98",X"93",X"9B",X"AB",X"B9",X"AB",X"98",X"83",X"68",X"52", + X"4A",X"2F",X"17",X"04",X"01",X"0C",X"37",X"75",X"A3",X"B9",X"D1",X"CE",X"B3",X"A3",X"9B",X"93", + X"93",X"A6",X"BE",X"B9",X"9E",X"7D",X"55",X"37",X"27",X"27",X"4A",X"80",X"A6",X"B3",X"AE",X"AB", + X"B9",X"C6",X"B9",X"B3",X"A3",X"80",X"5D",X"4A",X"47",X"3A",X"32",X"3A",X"5A",X"7D",X"83",X"90", + X"8B",X"83",X"7D",X"70",X"65",X"6D",X"7D",X"78",X"65",X"47",X"1F",X"0C",X"01",X"01",X"09",X"2C", + X"68",X"AE",X"CE",X"D1",X"CE",X"D4",X"E4",X"E4",X"CE",X"A6",X"98",X"9B",X"AB",X"BE",X"CE",X"CE", + X"B9",X"90",X"52",X"14",X"01",X"01",X"01",X"01",X"09",X"3A",X"78",X"9E",X"AE",X"B9",X"CE",X"CE", + X"B9",X"A6",X"90",X"7D",X"7D",X"83",X"80",X"68",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75", + X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6",X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4", + X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A",X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC", + X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52",X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B", + X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9",X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01", + X"01",X"01",X"01",X"01",X"01",X"24",X"47",X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4", + X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3",X"9B",X"98",X"98",X"90",X"83",X"88",X"A6",X"C9",X"DC", + X"D9",X"BE",X"AB",X"7D",X"52",X"2F",X"27",X"1F",X"11",X"17",X"27",X"2F",X"2F",X"3F",X"52",X"5D", + X"5A",X"65",X"70",X"75",X"80",X"88",X"8B",X"9B",X"AB",X"BE",X"C6",X"AE",X"83",X"55",X"27",X"09", + X"09",X"27",X"52",X"83",X"93",X"98",X"93",X"88",X"83",X"80",X"70",X"55",X"3F",X"2C",X"27",X"32", + X"47",X"65",X"8B",X"AE",X"D4",X"E9",X"D9",X"B3",X"98",X"90",X"93",X"88",X"68",X"4D",X"4A",X"5A", + X"68",X"6D",X"7D",X"8B",X"90",X"8B",X"88",X"8B",X"98",X"9E",X"9B",X"83",X"62",X"2F",X"09",X"04", + X"1F",X"47",X"6D",X"98",X"AE",X"B6",X"B3",X"AB",X"9B",X"9B",X"A3",X"B6",X"C6",X"B9",X"9B",X"83", + X"78",X"6D",X"65",X"5A",X"5A",X"68",X"88",X"A6",X"B6",X"A3",X"8B",X"75",X"68",X"6D",X"6D",X"65", + X"5D",X"5D",X"68",X"80",X"A3",X"CE",X"DC",X"D4",X"CE",X"CE",X"C9",X"C6",X"CE",X"BE",X"AB",X"90", + X"80",X"80",X"8B",X"98",X"9E",X"B6",X"DC",X"E4",X"E4",X"E1",X"CE",X"C6",X"B6",X"98",X"80",X"7D", + X"75",X"70",X"68",X"68",X"62",X"3F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"11",X"47",X"68",X"90",X"B6",X"CE",X"D4",X"E1",X"E9",X"E9",X"E4",X"E4",X"E9",X"E4",X"D4",X"C6", + X"A6",X"78",X"42",X"14",X"01",X"01",X"01",X"01",X"14",X"42",X"78",X"AB",X"D1",X"E1",X"D9",X"C6", + X"9B",X"7D",X"75",X"78",X"88",X"93",X"8B",X"88",X"70",X"4D",X"2F",X"24",X"1C",X"24",X"27",X"24", + X"27",X"3A",X"62",X"88",X"B3",X"CE",X"DC",X"EC",X"EF",X"E1",X"CE",X"BE",X"A3",X"83",X"68",X"52", + X"4D",X"55",X"65",X"78",X"78",X"80",X"90",X"90",X"90",X"8B",X"75",X"5D",X"4D",X"52",X"62",X"80", + X"A3",X"B6",X"B6",X"B6",X"A6",X"90",X"83",X"88",X"93",X"9E",X"BE",X"D1",X"C9",X"AE",X"8B",X"62", + X"3F",X"27",X"1C",X"32",X"62",X"88",X"9B",X"A3",X"AB",X"C1",X"CE",X"C1",X"B6",X"A6",X"90",X"6D", + X"5D",X"55",X"3F",X"2F",X"2F",X"47",X"5D",X"65",X"6D",X"75",X"78",X"83",X"7D",X"75",X"7D",X"83", + X"80",X"68",X"4D",X"2F",X"14",X"04",X"04",X"17",X"37",X"70",X"A6",X"C1",X"C1",X"B9",X"BE",X"D1", + X"D4",X"C1",X"A3",X"98",X"9E",X"AE",X"C9",X"D4",X"D4",X"C6",X"98",X"5D",X"24",X"01",X"01",X"01", + X"01",X"17",X"4A",X"7D",X"A3",X"AE",X"B9",X"C9",X"C6",X"B6",X"A3",X"8B",X"7D",X"80",X"83",X"83", + X"6D",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75",X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6", + X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4",X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A", + X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC",X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52", + X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B",X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9", + X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"47", + X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4",X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3", + X"9B",X"98",X"98",X"8B",X"83",X"8B",X"A6",X"C9",X"E1",X"DC",X"C1",X"A6",X"7D",X"4D",X"2C",X"24", + X"17",X"0C",X"11",X"1F",X"2C",X"2C",X"3A",X"52",X"5D",X"5A",X"65",X"70",X"78",X"88",X"90",X"90", + X"9E",X"AB",X"C1",X"C6",X"A6",X"78",X"3F",X"11",X"01",X"01",X"14",X"47",X"80",X"93",X"98",X"93", + X"83",X"70",X"65",X"4D",X"2F",X"14",X"04",X"04",X"27",X"47",X"70",X"A3",X"D1",X"FC",X"FC",X"F7", + X"C9",X"A6",X"9B",X"9B",X"8B",X"70",X"5A",X"5D",X"75",X"7D",X"80",X"8B",X"9E",X"9B",X"93",X"8B", + X"98",X"A3",X"AE",X"AE",X"93",X"68",X"32",X"04",X"04",X"24",X"52",X"88",X"B6",X"C9",X"B9",X"AB", + X"98",X"80",X"80",X"90",X"A6",X"B9",X"BE",X"A6",X"93",X"8B",X"80",X"70",X"4D",X"37",X"3F",X"62", + X"88",X"9E",X"98",X"80",X"65",X"55",X"62",X"68",X"68",X"70",X"75",X"78",X"93",X"C6",X"FC",X"FC", + X"FC",X"FC",X"F7",X"E9",X"DC",X"D4",X"BE",X"A3",X"80",X"68",X"70",X"75",X"75",X"70",X"80",X"A3", + X"B3",X"B3",X"AE",X"98",X"83",X"75",X"5D",X"52",X"5A",X"68",X"78",X"83",X"83",X"78",X"4A",X"11", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"78",X"A6",X"D1",X"E9",X"E4", + X"E1",X"E1",X"DC",X"D9",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"B9",X"75",X"2F",X"01",X"01",X"01", + X"01",X"01",X"01",X"27",X"5D",X"9B",X"D4",X"F4",X"EC",X"CE",X"A6",X"93",X"9E",X"B6",X"B6",X"A3", + X"93",X"8B",X"83",X"70",X"68",X"78",X"93",X"A6",X"9E",X"90",X"83",X"98",X"AE",X"C9",X"D4",X"DC", + X"CE",X"A6",X"7D",X"65",X"52",X"2C",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"4D",X"9E", + X"E4",X"FC",X"FC",X"FC",X"EC",X"EC",X"FC",X"FC",X"FC",X"FC",X"E9",X"AE",X"78",X"4A",X"2F",X"2F", + X"52",X"8B",X"C6",X"F4",X"FC",X"F7",X"DC",X"B3",X"80",X"4D",X"17",X"01",X"01",X"01",X"1C",X"3F", + X"70",X"A6",X"D1",X"E9",X"E1",X"CE",X"B9",X"B3",X"AE",X"A6",X"88",X"5A",X"1F",X"01",X"01",X"01", + X"01",X"01",X"14",X"52",X"8B",X"B9",X"C6",X"B6",X"A6",X"9E",X"90",X"75",X"68",X"52",X"4A",X"52", + X"68",X"88",X"93",X"83",X"62",X"3F",X"1F",X"17",X"2F",X"4D",X"68",X"75",X"83",X"9E",X"D1",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D4",X"BE",X"B3",X"A3",X"A6",X"BE",X"D4",X"E1",X"CE",X"B3",X"A6",X"98", + X"75",X"4A",X"27",X"1C",X"2F",X"4D",X"68",X"7D",X"68",X"47",X"17",X"01",X"01",X"01",X"01",X"01", + X"04",X"0C",X"1F",X"32",X"4A",X"5D",X"80",X"B3",X"F7",X"FC",X"FC",X"FC",X"EC",X"D4",X"CE",X"BE", + X"C1",X"CE",X"D9",X"C9",X"A3",X"83",X"70",X"5A",X"3F",X"32",X"3F",X"5D",X"68",X"65",X"47",X"2C", + X"17",X"04",X"09",X"27",X"4A",X"68",X"90",X"9E",X"98",X"88",X"7D",X"83",X"9E",X"CE",X"E9",X"F7", + X"E4",X"BE",X"9E",X"68",X"37",X"09",X"01",X"01",X"01",X"04",X"14",X"37",X"55",X"65",X"70",X"88", + X"AE",X"DC",X"FC",X"F4",X"D1",X"AE",X"93",X"80",X"78",X"83",X"9B",X"B3",X"B3",X"98",X"70",X"47", + X"24",X"17",X"32",X"62",X"9B",X"C9",X"CE",X"B9",X"A3",X"9B",X"88",X"70",X"5D",X"55",X"68",X"93", + X"B6",X"BE",X"B3",X"AE",X"AE",X"A3",X"90",X"90",X"98",X"9B",X"AB",X"AB",X"AE",X"B3",X"AB",X"93", + X"78",X"65",X"68",X"78",X"75",X"70",X"68",X"78",X"8B",X"93",X"93",X"9E",X"B9",X"DC",X"FC",X"FC", + X"FC",X"D4",X"93",X"62",X"42",X"1C",X"01",X"01",X"04",X"0C",X"0C",X"1F",X"4A",X"78",X"AB",X"C9", + X"DC",X"E1",X"D9",X"C6",X"AB",X"90",X"70",X"47",X"09",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"1C",X"47",X"62",X"75",X"88",X"AB",X"D1",X"E9",X"EC",X"E9",X"E4",X"DC",X"F7",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"9E",X"80",X"75",X"7D",X"70",X"6D",X"75",X"80",X"8B",X"80",X"65", + X"4A",X"2C",X"04",X"01",X"01",X"01",X"04",X"2C",X"52",X"62",X"5A",X"4D",X"5A",X"78",X"9B",X"B3", + X"C1",X"AB",X"93",X"83",X"78",X"62",X"4D",X"4A",X"52",X"4A",X"3F",X"4D",X"5D",X"7D",X"90",X"9B", + X"9E",X"83",X"68",X"62",X"5D",X"68",X"78",X"88",X"88",X"8B",X"8B",X"80",X"62",X"47",X"3F",X"3A", + X"32",X"37",X"37",X"37",X"4D",X"70",X"88",X"8B",X"80",X"70",X"70",X"8B",X"B6",X"D4",X"D4",X"CE", + X"B9",X"B9",X"C9",X"C9",X"C6",X"B6",X"B9",X"D4",X"FC",X"FC",X"FC",X"FC",X"EC",X"B6",X"80",X"52", + X"37",X"2F",X"2C",X"37",X"62",X"98",X"D1",X"FC",X"FC",X"EC",X"D1",X"A3",X"68",X"4A",X"32",X"27", + X"27",X"3A",X"55",X"68",X"62",X"52",X"3F",X"1C",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"37", + X"5A",X"70",X"88",X"88",X"7D",X"65",X"52",X"47",X"52",X"68",X"83",X"9E",X"AE",X"B6",X"C1",X"B9", + X"B6",X"AE",X"98",X"78",X"5D",X"42",X"32",X"2C",X"2F",X"4D",X"7D",X"B9",X"F7",X"FC",X"FC",X"FC", + X"E1",X"AB",X"83",X"65",X"52",X"5A",X"68",X"65",X"52",X"3F",X"3F",X"3F",X"37",X"37",X"52",X"7D", + X"A6",X"C1",X"BE",X"9E",X"88",X"7D",X"68",X"5A",X"47",X"47",X"62",X"90",X"B3",X"C6",X"D9",X"EF", + X"FC",X"FC",X"E4",X"CE",X"B9",X"B3",X"B3",X"AE",X"AB",X"9B",X"75",X"55",X"37",X"11",X"01",X"01", + X"01",X"01",X"04",X"4D",X"88",X"AB",X"B3",X"AE",X"A3",X"9B",X"AE",X"C6",X"CE",X"C9",X"BE",X"B6", + X"B3",X"AB",X"AE",X"C6",X"EF",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"88",X"4A",X"14",X"01", + X"09",X"2C",X"52",X"78",X"93",X"93",X"78",X"47",X"0C",X"01",X"01",X"01",X"01",X"09",X"09",X"11", + X"27",X"4D",X"62",X"68",X"7D",X"90",X"9E",X"AE",X"AB",X"8B",X"70",X"62",X"52",X"3A",X"1C",X"04", + X"11",X"2F",X"5A",X"83",X"9E",X"B3",X"B9",X"B9",X"AB",X"80",X"62",X"4D",X"4D",X"5A",X"65",X"75", + X"7D",X"83",X"83",X"70",X"4D",X"1F",X"0C",X"14",X"32",X"5D",X"70",X"68",X"65",X"68",X"83",X"9E", + X"9E",X"93",X"88",X"83",X"9B",X"BE",X"D9",X"E1",X"D1",X"B6",X"A3",X"93",X"88",X"88",X"8B",X"98", + X"A3",X"C6",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"D4",X"B3",X"88",X"65",X"4A",X"32",X"3A",X"5D", + X"88",X"B3",X"D4",X"E4",X"E1",X"B9",X"78",X"37",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"14",X"37",X"42",X"4A",X"5A",X"68",X"78",X"90",X"AE",X"C9",X"E1",X"E1", + X"C9",X"93",X"65",X"4D",X"32",X"1F",X"17",X"27",X"37",X"3F",X"42",X"4D",X"68",X"88",X"98",X"A3", + X"B6",X"C9",X"D4",X"E4",X"E4",X"D4",X"BE",X"A6",X"AE",X"C6",X"E4",X"FC",X"FC",X"FC",X"E4",X"AB", + X"6D",X"3F",X"27",X"2F",X"52",X"83",X"AB",X"AB",X"AE",X"AE",X"AE",X"98",X"70",X"5A",X"5A",X"65", + X"7D",X"88",X"80",X"5D",X"3A",X"24",X"11",X"11",X"2F",X"52",X"75",X"83",X"93",X"A3",X"C9",X"EF", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"98",X"5A",X"1F",X"01",X"01",X"01",X"11",X"2F", + X"5D",X"90",X"BE",X"E4",X"FC",X"FC",X"D9",X"A3",X"78",X"65",X"68",X"75",X"70",X"65",X"5A",X"4A", + X"2C",X"14",X"04",X"11",X"37",X"68",X"9B",X"A6",X"9B",X"88",X"83",X"90",X"93",X"90",X"8B",X"83", + X"7D",X"83",X"93",X"A6",X"B6",X"BE",X"B9",X"9E",X"68",X"42",X"2C",X"2F",X"47",X"5D",X"78",X"88", + X"90",X"93",X"90",X"70",X"52",X"37",X"17",X"11",X"17",X"2C",X"37",X"3F",X"4D",X"4A",X"3F",X"32", + X"2F",X"37",X"5A",X"7D",X"9B",X"9E",X"A6",X"AE",X"B6",X"D4",X"FC",X"FC",X"FC",X"FC",X"FC",X"EC", + X"E1",X"B9",X"93",X"6D",X"5A",X"5A",X"5D",X"68",X"75",X"78",X"83",X"83",X"83",X"83",X"70",X"5D", + X"4A",X"4D",X"62",X"7D",X"90",X"98",X"88",X"62",X"2F",X"01",X"01",X"01",X"01",X"1C",X"37",X"52", + X"65",X"68",X"5A",X"52",X"5D",X"75",X"7D",X"75",X"5D",X"4A",X"4D",X"65",X"88",X"AB",X"C6",X"D9", + X"D4",X"B6",X"93",X"83",X"70",X"5A",X"47",X"47",X"4A",X"3F",X"3A",X"3F",X"32",X"27",X"17",X"1F", + X"3F",X"68",X"93",X"9E",X"9B",X"93",X"98",X"A6",X"AB",X"AB",X"A3",X"A6",X"BE",X"E1",X"F7",X"FC", + X"FC",X"EC",X"D1",X"AE",X"93",X"8B",X"9B",X"B3",X"B6",X"B6",X"C6",X"C6",X"B6",X"A6",X"9E",X"93", + X"7D",X"5D",X"37",X"1C",X"1F",X"27",X"2C",X"37",X"52",X"75",X"93",X"98",X"8B",X"7D",X"65",X"5D", + X"65",X"75",X"88",X"9B",X"9E",X"9B",X"8B",X"80",X"83",X"8B",X"8B",X"83",X"93",X"AB",X"C9",X"DC", + X"CE",X"B9",X"A6",X"83",X"5D",X"32",X"17",X"01",X"01",X"04",X"1C",X"4A",X"80",X"B6",X"DC",X"E1", + X"D4",X"BE",X"A6",X"98",X"90",X"88",X"6D",X"4D",X"2C",X"11",X"04",X"04",X"1C",X"4D",X"83",X"B6", + X"DC",X"E4",X"D1",X"C1",X"B3",X"9B",X"80",X"68",X"68",X"68",X"75",X"7D",X"7D",X"70",X"52",X"2C", + X"04",X"01",X"01",X"01",X"11",X"2F",X"47",X"5D",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC", + X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E",X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E", + X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52",X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01", + X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3",X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB", + X"93",X"78",X"65",X"62",X"68",X"70",X"80",X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70", + X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3",X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88", + X"7D",X"62",X"47",X"2F",X"11",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"78",X"93",X"9B", + X"9E",X"93",X"98",X"9B",X"98",X"A3",X"A6",X"AB",X"B3",X"C1",X"D1",X"CE",X"BE",X"AE",X"98",X"7D", + X"75",X"65",X"52",X"4A",X"3F",X"3A",X"3F",X"52",X"68",X"80",X"93",X"AB",X"B6",X"C9",X"E1",X"E4", + X"D4",X"CE",X"CE",X"C9",X"BE",X"9E",X"7D",X"5A",X"37",X"27",X"1C",X"1F",X"37",X"5A",X"75",X"80", + X"8B",X"93",X"90",X"8B",X"88",X"88",X"80",X"80",X"83",X"80",X"88",X"A3",X"C6",X"E1",X"FC",X"FC", + X"F4",X"CE",X"A3",X"80",X"65",X"4A",X"37",X"37",X"3F",X"47",X"52",X"62",X"70",X"7D",X"70",X"62", + X"52",X"55",X"68",X"78",X"80",X"75",X"65",X"65",X"5D",X"55",X"5A",X"5A",X"65",X"80",X"98",X"A3", + X"9B",X"8B",X"7D",X"80",X"88",X"90",X"98",X"9B",X"93",X"93",X"9E",X"AE",X"B9",X"B6",X"AE",X"AE", + X"A6",X"93",X"78",X"65",X"52",X"4D",X"4A",X"52",X"68",X"78",X"88",X"93",X"90",X"83",X"80",X"6D", + X"5D",X"5D",X"62",X"68",X"6D",X"6D",X"5D",X"4A",X"37",X"2F",X"32",X"52",X"75",X"93",X"A6",X"AE", + X"AB",X"AE",X"B6",X"C6",X"BE",X"C1",X"B9",X"A6",X"98",X"8B",X"70",X"52",X"3A",X"2C",X"37",X"42", + X"5A",X"68",X"70",X"78",X"7D",X"88",X"93",X"98",X"90",X"7D",X"7D",X"88",X"90",X"98",X"93",X"7D", + X"52",X"2C",X"09",X"01",X"01",X"09",X"32",X"52",X"70",X"88",X"9B",X"93",X"90",X"93",X"98",X"90", + X"83",X"70",X"65",X"62",X"78",X"93",X"AE",X"BE",X"C6",X"B9",X"9E",X"83",X"70",X"65",X"5D",X"5A", + X"5A",X"5D",X"5A",X"55",X"55",X"47",X"37",X"27",X"1F",X"37",X"5A",X"78",X"88",X"8B",X"8B",X"93", + X"A3",X"A6",X"AB",X"A6",X"AB",X"BE",X"D4",X"E4",X"EC",X"EC",X"E1",X"C9",X"A6",X"90",X"83",X"90", + X"98",X"9B",X"9E",X"AE",X"AB",X"A6",X"9E",X"9B",X"9B",X"90",X"78",X"5A",X"3F",X"37",X"37",X"37", + X"3F",X"52",X"68",X"88",X"83",X"78",X"68",X"5A",X"55",X"65",X"78",X"8B",X"9E",X"A3",X"9B",X"90", + X"83",X"88",X"8B",X"88",X"80",X"8B",X"9E",X"B9",X"C9",X"B9",X"A6",X"93",X"75",X"52",X"32",X"1C", + X"11",X"0C",X"14",X"2C",X"5A",X"8B",X"BE",X"DC",X"E1",X"D9",X"C6",X"AE",X"9E",X"98",X"8B",X"75", + X"55",X"32",X"1C",X"11",X"11",X"24",X"52",X"88",X"B6",X"D9",X"E4",X"CE",X"BE",X"AE",X"98",X"7D", + X"68",X"65",X"68",X"75",X"78",X"7D",X"70",X"52",X"2F",X"09",X"01",X"01",X"01",X"11",X"2F",X"47", + X"5A",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC",X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E", + X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E",X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52", + X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01",X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3", + X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB",X"93",X"78",X"65",X"62",X"68",X"70",X"80", + X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70",X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3", + X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88",X"7D",X"62",X"47",X"2C",X"0C",X"01",X"01", + X"01",X"01",X"01",X"14",X"3A",X"65",X"7D",X"98",X"A3",X"A3",X"98",X"9B",X"9E",X"9E",X"A6",X"AB", + X"AB",X"B6",X"C6",X"D4",X"CE",X"BE",X"AB",X"90",X"78",X"68",X"5A",X"47",X"32",X"27",X"1F",X"24", + X"3A",X"62",X"80",X"9E",X"B9",X"CE",X"D4",X"E9",X"EC",X"E1",X"D1",X"D1",X"CE",X"C6",X"A6",X"80", + X"55",X"2F",X"17",X"04",X"11",X"2F",X"62",X"83",X"9B",X"A6",X"AB",X"9B",X"90",X"8B",X"88",X"78", + X"70",X"65",X"5A",X"65",X"88",X"A6",X"CE",X"EF",X"FC",X"FC",X"E1",X"B6",X"9E",X"88",X"68",X"52", + X"4A",X"47",X"3F",X"37",X"3A",X"47",X"47",X"3A",X"2F",X"2F",X"4A",X"68",X"80",X"83",X"75",X"65", + X"65",X"65",X"68",X"75",X"7D",X"88",X"9E",X"AB",X"AB",X"98",X"80",X"78",X"7D",X"80",X"8B",X"9E", + X"9E",X"9B",X"9E",X"AE",X"BE",X"C1",X"B3",X"A6",X"A3",X"A6",X"AB",X"9B",X"83",X"68",X"52",X"42", + X"3F",X"52",X"68",X"80",X"93",X"A3",X"A6",X"B3",X"A6",X"93",X"88",X"88",X"93",X"90",X"83",X"68", + X"4D",X"37",X"2C",X"2F",X"47",X"68",X"90",X"AB",X"AE",X"A6",X"A6",X"9B",X"88",X"75",X"68",X"62", + X"52",X"42",X"32",X"27",X"11",X"01",X"01",X"11",X"27",X"3F",X"5A",X"65",X"68",X"78",X"8B",X"A6", + X"C1",X"C6",X"B9",X"B3",X"B3",X"AB",X"A3",X"8B",X"68",X"42",X"24",X"11",X"11",X"11",X"27",X"4D", + X"70",X"98",X"B9",X"DC",X"E9",X"E9",X"E1",X"CE",X"AB",X"98",X"90",X"83",X"83",X"93",X"A3",X"B6", + X"AE",X"A3",X"90",X"78",X"5D",X"4A",X"4D",X"62",X"78",X"83",X"80",X"80",X"83",X"7D",X"68",X"52", + X"37",X"1F",X"1F",X"2F",X"47",X"55",X"65",X"7D",X"90",X"93",X"98",X"A3",X"AE",X"B3",X"B9",X"B6", + X"B6",X"C1",X"C6",X"B9",X"A6",X"8B",X"80",X"70",X"65",X"52",X"4A",X"52",X"62",X"65",X"68",X"7D", + X"90",X"AB",X"C6",X"D1",X"CE",X"AE",X"88",X"68",X"65",X"62",X"52",X"52",X"4D",X"3F",X"2F",X"27", + X"27",X"3A",X"62",X"83",X"9E",X"B3",X"A6",X"9E",X"93",X"90",X"8B",X"7D",X"68",X"62",X"65",X"65", + X"65",X"55",X"3F",X"27",X"14",X"11",X"14",X"1C",X"2F",X"4A",X"62",X"78",X"98",X"B6",X"D1",X"E4", + X"E4",X"E1",X"E4",X"F7",X"FC",X"F7",X"E4",X"D1",X"BE",X"AB",X"98",X"83",X"8B",X"98",X"93",X"90", + X"93",X"90",X"83",X"78",X"70",X"6D",X"62",X"4A",X"2C",X"17",X"14",X"1C",X"27",X"3F",X"4D",X"5D", + X"68",X"68",X"68",X"68",X"75",X"8B",X"9E",X"A6",X"9E",X"9B",X"98",X"98",X"93",X"80",X"70",X"62", + X"52",X"4A",X"42",X"3A",X"2F",X"27",X"2C",X"2F",X"3F",X"5D",X"80",X"90",X"9B",X"A3",X"AE",X"C9", + X"E1",X"E4",X"DC",X"CE",X"C9",X"CE",X"C6",X"B3",X"98",X"8B",X"83",X"75",X"68",X"6D",X"7D",X"90", + X"A3",X"B3",X"B9",X"AE",X"98",X"7D",X"70",X"62",X"4A",X"2F",X"17",X"11",X"17",X"24",X"37",X"52", + X"62",X"75",X"80",X"80",X"80",X"88",X"8B",X"8B",X"98",X"9B",X"9E",X"AB",X"B6",X"AE",X"A3",X"90", + X"83",X"80",X"7D",X"83",X"90",X"90",X"88",X"75",X"62",X"52",X"47",X"42",X"4A",X"5D",X"75",X"8B", + X"A3",X"AB",X"AB",X"A3",X"93",X"98",X"9E",X"AE",X"BE",X"BE",X"AB",X"88",X"68",X"52",X"3A",X"37", + X"47",X"62",X"83",X"98",X"A3",X"9B",X"98",X"98",X"88",X"68",X"52",X"4D",X"52",X"62",X"65",X"62", + X"62",X"5D",X"4A",X"37",X"27",X"2C",X"3F",X"5D",X"6D",X"75",X"75",X"80",X"90",X"A3",X"B3",X"BE", + X"C6",X"C1",X"B9",X"AB",X"9E",X"83",X"68",X"52",X"3F",X"27",X"11",X"0C",X"11",X"1C",X"3F",X"68", + X"9B",X"B6",X"BE",X"B6",X"B3",X"B6",X"BE",X"C9",X"C6",X"AE",X"9B",X"8B",X"80",X"7D",X"83",X"93", + X"A3",X"AE",X"A3",X"9E",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"7D",X"68",X"62",X"5D",X"62",X"5D", + X"52",X"4D",X"5A",X"52",X"52",X"52",X"52",X"52",X"5A",X"5A",X"5A",X"62",X"68",X"78",X"88",X"90", + X"98",X"A6",X"B6",X"B9",X"B6",X"B3",X"B6",X"B9",X"B9",X"B6",X"AE",X"AB",X"93",X"78",X"65",X"4D", + X"32",X"24",X"24",X"32",X"52",X"70",X"83",X"88",X"83",X"7D",X"70",X"65",X"68",X"6D",X"6D",X"6D", + X"68",X"65",X"68",X"68",X"65",X"5D",X"55",X"5D",X"70",X"8B",X"90",X"93",X"8B",X"80",X"7D",X"7D", + X"8B",X"9E",X"A6",X"A3",X"9E",X"9E",X"A3",X"A3",X"98",X"88",X"80",X"75",X"68",X"62",X"55",X"4D", + X"4A",X"4D",X"5D",X"75",X"93",X"AE",X"B6",X"AB",X"93",X"78",X"65",X"52",X"5A",X"5D",X"65",X"78", + X"88",X"88",X"80",X"75",X"70",X"68",X"5D",X"5A",X"5D",X"62",X"68",X"70",X"75",X"78",X"7D",X"7D", + X"80",X"78",X"70",X"65",X"5D",X"52",X"5A",X"70",X"8B",X"A3",X"AE",X"AE",X"A6",X"9B",X"90",X"83", + X"75",X"68",X"55",X"4D",X"4A",X"4A",X"4D",X"5A",X"78",X"93",X"B9",X"D4",X"E4",X"E1",X"CE",X"BE", + X"AE",X"9B",X"88",X"78",X"78",X"78",X"78",X"68",X"62",X"55",X"4D",X"3A",X"32",X"3A",X"4D",X"68", + X"7D",X"80",X"7D",X"78",X"75",X"7D",X"88",X"98",X"A3",X"AE",X"AE",X"AB",X"AE",X"B6",X"C6",X"D1", + X"D4",X"D4",X"C6",X"AB",X"98",X"83",X"78",X"65",X"4D",X"3F",X"3F",X"3F",X"4A",X"5A",X"68",X"70", + X"68",X"68",X"70",X"80",X"8B",X"93",X"8B",X"7D",X"70",X"6D",X"68",X"70",X"75",X"75",X"78",X"78", + X"75",X"68",X"65",X"62",X"6D",X"83",X"98",X"AE",X"B6",X"A6",X"98",X"90",X"80",X"75",X"68",X"5D", + X"62",X"68",X"80",X"93",X"9B",X"93",X"90",X"80",X"6D",X"5A",X"4A",X"42",X"47",X"52",X"5D",X"6D", + X"83",X"90",X"90",X"83",X"80",X"80",X"75",X"75",X"70",X"68",X"65",X"5A",X"52",X"4D",X"52",X"65", + X"7D",X"98",X"A6",X"AB",X"AB",X"A6",X"9E",X"9B",X"90",X"80",X"75",X"6D",X"65",X"52",X"52",X"52", + X"52",X"4D",X"42",X"3F",X"47",X"4A",X"55",X"5D",X"62",X"62",X"62",X"62",X"68",X"7D",X"88",X"93", + X"A3",X"9E",X"A3",X"98",X"90",X"90",X"98",X"A3",X"B6",X"C1",X"BE",X"B6",X"B3",X"AB",X"9B",X"88", + X"75",X"70",X"68",X"65",X"70",X"78",X"7D",X"70",X"68",X"68",X"68",X"68",X"65",X"62",X"5D",X"68", + X"7D",X"90",X"9B",X"9B",X"98",X"98",X"98",X"93",X"98",X"9E",X"9B",X"98",X"93",X"93",X"90",X"83", + X"80",X"80",X"78",X"68",X"62",X"62",X"65",X"75",X"83",X"88",X"8B",X"90",X"8B",X"7D",X"70",X"68", + X"65",X"5D",X"55",X"52",X"4D",X"4A",X"4D",X"5A",X"5D",X"65",X"70",X"80",X"8B",X"93",X"9E",X"9E", + X"9B",X"9E",X"A3",X"9B",X"98",X"90",X"88",X"83",X"83",X"88",X"90",X"A6",X"B9",X"BE",X"C1",X"C6", + X"C6",X"C6",X"B6",X"9B",X"83",X"65",X"52",X"4A",X"4D",X"5D",X"6D",X"80",X"8B",X"93",X"8B",X"80", + X"65",X"5A",X"52",X"52",X"52",X"47",X"3F",X"3A",X"47",X"52",X"5D",X"6D",X"83",X"93",X"9B",X"9E", + X"98",X"8B",X"88",X"80",X"80",X"78",X"6D",X"68",X"68",X"70",X"70",X"68",X"68",X"62",X"5A",X"5A", + X"5D",X"5A",X"5D",X"65",X"70",X"75",X"8B",X"98",X"9B",X"9B",X"9B",X"93",X"88",X"88",X"83",X"88", + X"88",X"93",X"9B",X"98",X"8B",X"80",X"78",X"70",X"68",X"68",X"70",X"80",X"88",X"90",X"93",X"9B", + X"9E",X"98",X"98",X"98",X"98",X"90",X"83",X"78",X"78",X"6D",X"6D",X"78",X"88",X"98",X"A3",X"AB", + X"AB",X"A6",X"98",X"83",X"70",X"52",X"47",X"37",X"32",X"27",X"27",X"37",X"47",X"4D",X"65",X"75", + X"88",X"90",X"98",X"90",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"68",X"62",X"5D",X"4D",X"42", + X"3A",X"3A",X"3F",X"47",X"52",X"5A",X"68",X"78",X"83",X"90",X"A3",X"AE",X"B6",X"B9",X"B6",X"AE", + X"B3",X"B6",X"C1",X"C6",X"BE",X"B9",X"B9",X"AE",X"9B",X"88",X"80",X"75",X"68",X"65",X"65",X"70", + X"78",X"83",X"8B",X"90",X"88",X"7D",X"65",X"5A",X"55",X"5A",X"52",X"4D",X"47",X"42",X"3F",X"47", + X"4A",X"52",X"65",X"7D",X"93",X"9B",X"98",X"93",X"90",X"93",X"9B",X"A6",X"AE",X"AE",X"A6",X"98", + X"8B",X"78",X"68",X"5A",X"52",X"52",X"5A",X"65",X"68",X"75",X"75",X"70",X"70",X"7D",X"80",X"83", + X"83",X"80",X"80",X"80",X"8B",X"98",X"A3",X"A3",X"A6",X"A3",X"9B",X"93",X"90",X"8B",X"88",X"80", + X"78",X"70",X"62",X"5A",X"5A",X"52",X"52",X"55",X"5A",X"62",X"68",X"75",X"70",X"6D",X"65",X"65", + X"68",X"6D",X"70",X"70",X"70",X"75",X"75",X"7D",X"83",X"88",X"93",X"9B",X"A3",X"A3",X"A6",X"A6", + X"A3",X"9E",X"93",X"88",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"7D",X"70",X"68",X"62", + X"62",X"68",X"70",X"78",X"7D",X"7D",X"78",X"75",X"68",X"68",X"62",X"62",X"68",X"78",X"78",X"7D", + X"75",X"68",X"6D",X"6D",X"70",X"75",X"7D",X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"80",X"83", + X"88",X"8B",X"88",X"83",X"80",X"80",X"83",X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D", + X"75",X"6D",X"68",X"75",X"80",X"83",X"88",X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"75",X"68",X"5D",X"52",X"4A",X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B", + X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B",X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62", + X"65",X"70",X"78",X"7D",X"80",X"88",X"8B",X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90", + X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"7D",X"78",X"78",X"75",X"70",X"70",X"6D",X"68",X"6D",X"70",X"78",X"80", + X"80",X"80",X"83",X"88",X"90",X"8B",X"8B",X"8B",X"88",X"80",X"7D",X"78",X"70",X"68",X"68",X"68", + X"68",X"6D",X"6D",X"70",X"78",X"7D",X"83",X"8B",X"8B",X"90",X"8B",X"88",X"88",X"88",X"88",X"83", + X"80",X"80",X"83",X"80",X"80",X"7D",X"83",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"78",X"78", + X"75",X"70",X"70",X"70",X"75",X"78",X"78",X"78",X"75",X"75",X"70",X"70",X"75",X"78",X"75",X"75", + X"75",X"75",X"78",X"7D",X"80",X"7D",X"7D",X"7D",X"83",X"88",X"8B",X"88",X"88",X"88",X"88",X"88", + X"8B",X"90",X"90",X"88",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"7D",X"7D",X"80",X"7D",X"78", + X"75",X"70",X"70",X"78",X"80",X"88",X"88",X"88",X"88",X"83",X"7D",X"78",X"78",X"80",X"83",X"83", + X"83",X"80",X"78",X"75",X"75",X"75",X"78",X"80",X"80",X"83",X"83",X"80",X"7D",X"78",X"6D",X"68", + X"65",X"62",X"5D",X"5A",X"62",X"65",X"68",X"75",X"80",X"8B",X"90",X"93",X"90",X"88",X"83",X"80", + X"78",X"75",X"75",X"70",X"68",X"65",X"5D",X"5D",X"55",X"5A",X"5D",X"65",X"68",X"75",X"75",X"80", + X"83",X"8B",X"90",X"9B",X"A3",X"A6",X"A6",X"9E",X"9B",X"98",X"98",X"9E",X"9E",X"A3",X"A3",X"A6", + X"A3",X"9B",X"8B",X"88",X"7D",X"75",X"6D",X"68",X"6D",X"75",X"7D",X"7D",X"83",X"83",X"80",X"75", + X"6D",X"68",X"68",X"68",X"65",X"62",X"5D",X"5A",X"5A",X"5D",X"62",X"68",X"78",X"80",X"83",X"80", + X"7D",X"80",X"83",X"8B",X"98",X"9B",X"9B",X"98",X"90",X"8B",X"7D",X"70",X"68",X"62",X"65",X"68", + X"70",X"78",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"7D",X"7D",X"7D",X"83",X"90",X"98", + X"9B",X"9E",X"9B",X"98",X"90",X"8B",X"83",X"83",X"7D",X"75",X"70",X"65",X"5D",X"5D",X"5A",X"5D", + X"62",X"65",X"68",X"75",X"75",X"75",X"75",X"68",X"6D",X"6D",X"70",X"70",X"75",X"70",X"75",X"75", + X"78",X"7D",X"83",X"90",X"98",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"88",X"83",X"7D",X"7D", + X"7D",X"80",X"83",X"80",X"80",X"7D",X"75",X"68",X"65",X"65",X"68",X"75",X"78",X"7D",X"78",X"78", + X"78",X"6D",X"68",X"65",X"68",X"6D",X"78",X"7D",X"7D",X"75",X"6D",X"6D",X"70",X"75",X"78",X"80", + X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"83",X"83",X"88",X"8B",X"88",X"83",X"80",X"80",X"83", + X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D",X"75",X"6D",X"68",X"75",X"80",X"83",X"88", + X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D",X"80",X"80",X"75",X"68",X"5D",X"52",X"4A", + X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B",X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B", + X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62",X"65",X"70",X"78",X"7D",X"80",X"88",X"8B", + X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90",X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D", + X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"75", + X"75",X"70",X"75",X"6D",X"68",X"6D",X"70",X"78",X"80",X"83",X"80",X"83",X"88",X"90",X"8B",X"8B", + X"88",X"83",X"7D",X"78",X"75",X"6D",X"68",X"68",X"68",X"65",X"68",X"68",X"68",X"70",X"75",X"7D", + X"88",X"83",X"88",X"88",X"80",X"83",X"83",X"88",X"8B",X"88",X"88",X"88",X"83",X"80",X"7D",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"7D",X"75",X"75",X"75",X"75",X"70", + X"70",X"68",X"68",X"68",X"68",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"83",X"83",X"83",X"88", + X"88",X"90",X"98",X"98",X"93",X"90",X"90",X"8B",X"88",X"88",X"8B",X"88",X"80",X"78",X"78",X"75", + X"70",X"68",X"68",X"65",X"68",X"70",X"78",X"78",X"78",X"75",X"75",X"70",X"78",X"80",X"83",X"83", + X"80",X"7D",X"70",X"68",X"65",X"68",X"70",X"7D",X"83",X"83",X"83",X"80",X"75",X"70",X"68",X"65", + X"65",X"65",X"68",X"6D",X"70",X"78",X"7D",X"7D",X"7D",X"83",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"80",X"83",X"8B",X"90",X"93",X"93",X"8B",X"83",X"7D",X"78",X"70",X"6D",X"68",X"65",X"65",X"62", + X"65",X"68",X"70",X"7D",X"88",X"88",X"93",X"90",X"90",X"90",X"90",X"93",X"93",X"93",X"98",X"90", + X"88",X"80",X"78",X"78",X"75",X"78",X"80",X"88",X"90",X"90",X"93",X"8B",X"8B",X"88",X"7D",X"78", + X"6D",X"65",X"65",X"68",X"6D",X"75",X"80",X"83",X"88",X"88",X"88",X"83",X"83",X"83",X"83",X"80", + X"7D",X"80",X"7D",X"75",X"6D",X"68",X"5D",X"55",X"52",X"52",X"62",X"68",X"70",X"75",X"75",X"75", + X"78",X"7D",X"83",X"80",X"83",X"83",X"83",X"83",X"88",X"8B",X"90",X"98",X"98",X"9B",X"9B",X"93", + X"8B",X"83",X"7D",X"78",X"78",X"70",X"75",X"7D",X"80",X"80",X"83",X"80",X"80",X"75",X"70",X"68", + X"68",X"68",X"65",X"68",X"68",X"65",X"68",X"70",X"78",X"7D",X"88",X"88",X"88",X"83",X"83",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75", + X"75",X"7D",X"83",X"83",X"88",X"83",X"88",X"83",X"88",X"83",X"83",X"8B",X"88",X"8B",X"88",X"88", + X"80",X"7D",X"7D",X"75",X"6D",X"68",X"6D",X"70",X"7D",X"80",X"7D",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80", + X"83",X"83",X"80",X"80",X"7D",X"78",X"75",X"70",X"68",X"6D",X"75",X"78",X"7D",X"80",X"80",X"80", + X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"88",X"88",X"8B",X"8B",X"8B", + X"8B",X"88",X"83",X"83",X"80",X"78",X"75",X"75",X"70",X"70",X"75",X"75",X"80",X"83",X"80",X"83", + X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70", + X"75",X"75",X"78",X"7D",X"7D",X"80",X"80",X"83",X"83",X"83",X"83",X"88",X"83",X"83",X"83",X"88", + X"83",X"83",X"88",X"8B",X"88",X"88",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"80",X"80",X"80", + X"83",X"83",X"83",X"7D",X"7D",X"75",X"75",X"75",X"75",X"75",X"70",X"75",X"75",X"75",X"78",X"83", + X"80",X"83",X"80",X"7D",X"80",X"78",X"78",X"80",X"80",X"80",X"7D",X"80",X"80",X"80",X"7D",X"75", + X"70",X"68",X"68",X"68",X"68",X"68",X"70",X"75",X"7D",X"83",X"8B",X"90",X"90",X"8B",X"83",X"80", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70",X"75",X"75", + X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"7D",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"83",X"83", + X"8B",X"8B",X"8B",X"88",X"83",X"83",X"80",X"83",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"7D",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78", + X"78",X"78",X"78",X"78",X"7D",X"80",X"78",X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D", + X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"78",X"7D",X"78",X"7D",X"80",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80", + X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"78",X"80", + X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"75",X"75",X"83",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"88",X"83", + X"80",X"80",X"7D",X"78",X"75",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"75",X"75",X"78", + X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"78",X"78",X"78",X"75",X"75",X"75",X"70",X"75",X"75",X"7D",X"7D",X"80",X"80",X"80", + X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"78",X"78",X"7D", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"78", + X"78",X"78",X"78",X"78",X"78",X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83", + X"83",X"83",X"88",X"83",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"7D",X"78",X"78",X"78",X"75",X"75", + X"75",X"78",X"7D",X"78",X"83",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"78",X"78",X"78",X"78",X"75",X"75",X"75",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80", + X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"78", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"80",X"83",X"83",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"78",X"78",X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D",X"78",X"78",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"83",X"80",X"80",X"83",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"7D",X"80",X"80",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"7D",X"78",X"78",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..742f9975 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AF",X"32",X"01",X"70",X"C3",X"AD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F5",X"3A",X"00",X"78",X"AF",X"32",X"01",X"70",X"F1",X"C3", + X"DE",X"00",X"3A",X"00",X"78",X"3E",X"01",X"32",X"04",X"70",X"AF",X"32",X"01",X"70",X"21",X"FF", + X"00",X"22",X"00",X"40",X"31",X"00",X"44",X"CD",X"2B",X"01",X"AF",X"32",X"04",X"40",X"CD",X"CF", + X"00",X"C3",X"29",X"02",X"AF",X"32",X"01",X"70",X"AF",X"32",X"04",X"40",X"21",X"1D",X"40",X"3E", + X"04",X"36",X"00",X"23",X"3D",X"C2",X"A1",X"00",X"36",X"20",X"C3",X"29",X"02",X"21",X"00",X"40", + X"11",X"00",X"04",X"36",X"00",X"23",X"1B",X"7A",X"B3",X"C2",X"B3",X"00",X"31",X"00",X"44",X"3E", + X"0E",X"CD",X"92",X"08",X"3E",X"02",X"CD",X"32",X"09",X"CD",X"38",X"2F",X"C3",X"72",X"00",X"21", + X"1D",X"40",X"3E",X"04",X"36",X"20",X"23",X"3D",X"C2",X"D4",X"00",X"36",X"40",X"C9",X"F5",X"C5", + X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"CD",X"32",X"01",X"3A",X"00",X"78",X"31",X"00",X"44",X"3A", + X"3A",X"40",X"FE",X"04",X"C2",X"FA",X"00",X"32",X"32",X"40",X"00",X"21",X"05",X"40",X"34",X"7E", + X"B7",X"C2",X"06",X"01",X"23",X"34",X"CD",X"9F",X"03",X"3A",X"05",X"40",X"E6",X"03",X"C2",X"14", + X"01",X"CD",X"7A",X"04",X"CD",X"4D",X"01",X"CD",X"D6",X"01",X"3A",X"33",X"40",X"E6",X"01",X"C2", + X"8A",X"00",X"CD",X"F2",X"01",X"CD",X"F2",X"01",X"C3",X"29",X"02",X"21",X"8B",X"03",X"22",X"02", + X"40",X"C9",X"32",X"07",X"40",X"2A",X"00",X"40",X"7D",X"FE",X"FF",X"C8",X"11",X"09",X"40",X"29", + X"19",X"EB",X"21",X"00",X"00",X"39",X"23",X"23",X"EB",X"73",X"23",X"72",X"C9",X"3A",X"00",X"60", + X"E6",X"01",X"C2",X"C0",X"01",X"3A",X"00",X"60",X"E6",X"02",X"C2",X"40",X"03",X"3A",X"31",X"40", + X"B7",X"C8",X"CD",X"30",X"03",X"B7",X"CA",X"8D",X"01",X"3A",X"32",X"40",X"FE",X"50",X"D2",X"7A", + X"01",X"47",X"3A",X"3A",X"40",X"80",X"27",X"32",X"32",X"40",X"AF",X"32",X"31",X"40",X"CD",X"61", + X"0E",X"3A",X"35",X"40",X"B7",X"C0",X"AF",X"32",X"04",X"40",X"C3",X"72",X"00",X"3A",X"39",X"40", + X"3C",X"32",X"39",X"40",X"47",X"AF",X"32",X"31",X"40",X"3A",X"38",X"40",X"B8",X"C0",X"3E",X"00", + X"32",X"39",X"40",X"3A",X"32",X"40",X"FE",X"50",X"D2",X"B1",X"01",X"C6",X"01",X"27",X"32",X"32", + X"40",X"CD",X"61",X"0E",X"3A",X"35",X"40",X"B7",X"C0",X"AF",X"32",X"04",X"40",X"C3",X"72",X"00", + X"3E",X"00",X"32",X"37",X"40",X"3C",X"32",X"31",X"40",X"32",X"03",X"60",X"C9",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"0A",X"21",X"27",X"40",X"11",X"1D",X"40",X"AF",X"BE", + X"CA",X"E7",X"01",X"35",X"C2",X"EB",X"01",X"1A",X"E6",X"EF",X"12",X"23",X"13",X"05",X"C2",X"DE", + X"01",X"C9",X"21",X"1D",X"40",X"3A",X"05",X"40",X"E6",X"00",X"C2",X"01",X"02",X"7E",X"F6",X"40", + X"77",X"23",X"3A",X"05",X"40",X"E6",X"00",X"C2",X"0E",X"02",X"7E",X"F6",X"40",X"77",X"23",X"3A", + X"05",X"40",X"E6",X"00",X"C2",X"1B",X"02",X"7E",X"F6",X"40",X"77",X"23",X"3A",X"05",X"40",X"E6", + X"01",X"C2",X"28",X"02",X"7E",X"F6",X"40",X"77",X"C9",X"3A",X"00",X"78",X"3A",X"04",X"40",X"B7", + X"C2",X"6C",X"02",X"3E",X"FF",X"32",X"00",X"40",X"00",X"AF",X"32",X"01",X"70",X"3E",X"01",X"32", + X"01",X"70",X"00",X"01",X"00",X"0F",X"21",X"1D",X"40",X"7E",X"E6",X"30",X"C2",X"55",X"02",X"7E", + X"E6",X"C0",X"C2",X"5E",X"02",X"23",X"0C",X"05",X"C2",X"49",X"02",X"C3",X"38",X"02",X"AF",X"32", + X"01",X"70",X"79",X"32",X"00",X"40",X"7E",X"E6",X"80",X"CA",X"8C",X"02",X"2A",X"00",X"40",X"11", + X"09",X"40",X"29",X"19",X"5E",X"23",X"56",X"EB",X"F9",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1", + X"AF",X"32",X"01",X"70",X"3E",X"01",X"32",X"01",X"70",X"F1",X"ED",X"45",X"36",X"80",X"2A",X"00", + X"40",X"11",X"95",X"03",X"29",X"19",X"5E",X"23",X"56",X"EB",X"F9",X"2A",X"00",X"40",X"EB",X"2A", + X"02",X"40",X"19",X"19",X"5E",X"23",X"56",X"EB",X"AF",X"32",X"01",X"70",X"3E",X"01",X"32",X"01", + X"70",X"E9",X"F5",X"AF",X"32",X"01",X"70",X"F1",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5", + X"F5",X"3A",X"04",X"40",X"B7",X"C3",X"E8",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AF",X"32",X"01",X"70",X"3E",X"01",X"32",X"01", + X"70",X"F1",X"D6",X"01",X"DA",X"07",X"03",X"F5",X"21",X"00",X"01",X"E5",X"E1",X"2B",X"7C",X"B5", + X"C2",X"FB",X"02",X"F1",X"C3",X"F2",X"02",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"C9", + X"AF",X"32",X"01",X"70",X"2A",X"00",X"40",X"11",X"1D",X"40",X"19",X"7E",X"E6",X"7F",X"77",X"C3", + X"29",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AF",X"32",X"03",X"60",X"32",X"04",X"68",X"3A",X"37",X"40",X"C9",X"00",X"00",X"00",X"00",X"00", + X"3E",X"01",X"32",X"37",X"40",X"32",X"31",X"40",X"32",X"04",X"68",X"C9",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"00",X"10",X"00", + X"30",X"00",X"20",X"7C",X"0A",X"E0",X"43",X"A8",X"43",X"70",X"43",X"38",X"43",X"E0",X"43",X"00", + X"2A",X"EF",X"40",X"7E",X"E6",X"F8",X"FE",X"F8",X"C2",X"39",X"04",X"7E",X"FE",X"FF",X"CA",X"39", + X"04",X"FE",X"F8",X"C2",X"CA",X"03",X"23",X"7E",X"32",X"06",X"68",X"0F",X"32",X"07",X"68",X"0F", + X"32",X"FA",X"40",X"23",X"22",X"EF",X"40",X"C3",X"79",X"04",X"FE",X"FA",X"C2",X"DB",X"03",X"23", + X"7E",X"32",X"F3",X"40",X"23",X"22",X"F5",X"40",X"C3",X"F8",X"03",X"FE",X"FB",X"C2",X"03",X"04", + X"3A",X"F3",X"40",X"FE",X"00",X"CA",X"F8",X"03",X"2A",X"F5",X"40",X"22",X"EF",X"40",X"3A",X"F3", + X"40",X"3D",X"32",X"F3",X"40",X"C3",X"79",X"04",X"2A",X"EF",X"40",X"23",X"23",X"22",X"EF",X"40", + X"C3",X"79",X"04",X"FE",X"FC",X"C2",X"14",X"04",X"23",X"7E",X"32",X"F4",X"40",X"23",X"22",X"F7", + X"40",X"C3",X"F8",X"03",X"FE",X"FD",X"C2",X"31",X"04",X"3A",X"F4",X"40",X"FE",X"00",X"CA",X"F8", + X"03",X"2A",X"F7",X"40",X"22",X"EF",X"40",X"3A",X"F4",X"40",X"3D",X"32",X"F4",X"40",X"C3",X"79", + X"04",X"FE",X"FE",X"C2",X"F8",X"03",X"C3",X"79",X"04",X"7E",X"32",X"00",X"78",X"3A",X"F9",X"40", + X"47",X"3A",X"F1",X"40",X"3C",X"32",X"F1",X"40",X"B8",X"DA",X"79",X"04",X"AF",X"32",X"F1",X"40", + X"3A",X"FA",X"40",X"E6",X"01",X"C2",X"62",X"04",X"2A",X"EF",X"40",X"23",X"22",X"EF",X"40",X"C3", + X"79",X"04",X"3A",X"F2",X"40",X"3C",X"32",X"F2",X"40",X"23",X"46",X"3A",X"F2",X"40",X"B8",X"DA", + X"79",X"04",X"AF",X"32",X"F2",X"40",X"C3",X"F8",X"03",X"C9",X"00",X"2A",X"FB",X"40",X"7E",X"E6", + X"F0",X"FE",X"F0",X"C2",X"11",X"05",X"7E",X"FE",X"FA",X"C2",X"99",X"04",X"23",X"7E",X"32",X"FE", + X"40",X"23",X"22",X"00",X"41",X"22",X"FB",X"40",X"C9",X"FE",X"FB",X"C2",X"B4",X"04",X"3A",X"FE", + X"40",X"FE",X"00",X"CA",X"E7",X"04",X"2A",X"00",X"41",X"22",X"FB",X"40",X"3A",X"FE",X"40",X"3D", + X"32",X"FE",X"40",X"C9",X"FE",X"FC",X"C2",X"C6",X"04",X"23",X"7E",X"32",X"FF",X"40",X"23",X"22", + X"00",X"41",X"22",X"FB",X"40",X"C9",X"FE",X"FD",X"C2",X"E1",X"04",X"3A",X"FF",X"40",X"FE",X"00", + X"CA",X"E7",X"04",X"2A",X"02",X"41",X"22",X"FB",X"40",X"3A",X"FF",X"40",X"3D",X"32",X"FF",X"40", + X"C9",X"FE",X"FE",X"C2",X"E7",X"04",X"C9",X"2A",X"FB",X"40",X"23",X"22",X"FB",X"40",X"C9",X"2A", + X"FB",X"40",X"7E",X"32",X"04",X"60",X"0F",X"32",X"05",X"60",X"0F",X"32",X"06",X"60",X"0F",X"32", + X"07",X"60",X"0F",X"32",X"00",X"68",X"0F",X"32",X"01",X"68",X"0F",X"32",X"02",X"68",X"C3",X"2C", + X"05",X"7E",X"E6",X"90",X"FE",X"80",X"C2",X"20",X"05",X"7E",X"32",X"05",X"68",X"C3",X"2C",X"05", + X"7E",X"E6",X"90",X"FE",X"90",X"C2",X"EF",X"04",X"7E",X"32",X"03",X"68",X"3A",X"04",X"41",X"47", + X"3A",X"FD",X"40",X"3C",X"32",X"FD",X"40",X"B8",X"D8",X"AF",X"32",X"FD",X"40",X"C3",X"E7",X"04", + X"F8",X"02",X"FA",X"02",X"1F",X"3F",X"5F",X"3F",X"5F",X"3F",X"5F",X"3F",X"7F",X"E0",X"F0",X"F7", + X"F7",X"7C",X"BC",X"DC",X"EC",X"F4",X"F7",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"3F",X"5F",X"3F", + X"5F",X"3F",X"5F",X"3F",X"7F",X"E0",X"F0",X"F7",X"F7",X"7C",X"BC",X"DC",X"EC",X"F4",X"F7",X"F0", + X"E0",X"C0",X"80",X"00",X"55",X"AA",X"A8",X"A0",X"80",X"00",X"FB",X"00",X"FF",X"FE",X"F8",X"02", + X"00",X"00",X"01",X"00",X"03",X"00",X"06",X"00",X"0A",X"00",X"0F",X"00",X"15",X"00",X"1C",X"00", + X"24",X"00",X"2D",X"00",X"37",X"00",X"42",X"00",X"FA",X"02",X"F8",X"01",X"D5",X"D3",X"CD",X"C7", + X"F8",X"02",X"FC",X"02",X"D5",X"D3",X"CD",X"C7",X"FD",X"00",X"FF",X"FF",X"FF",X"FF",X"FB",X"00", + X"FF",X"FE",X"F8",X"01",X"FA",X"02",X"D1",X"C9",X"C3",X"B8",X"AF",X"A0",X"94",X"87",X"6F",X"5E", + X"3F",X"28",X"0D",X"FA",X"05",X"3F",X"0D",X"5E",X"28",X"6F",X"3F",X"87",X"5E",X"3F",X"6F",X"A0", + X"87",X"AF",X"94",X"B8",X"A0",X"C3",X"AF",X"C9",X"B8",X"D1",X"C3",X"FB",X"00",X"FF",X"FE",X"F8", + X"02",X"B8",X"B0",X"A8",X"A0",X"98",X"90",X"88",X"80",X"70",X"60",X"50",X"40",X"3C",X"34",X"2C", + X"24",X"1B",X"17",X"13",X"0F",X"0B",X"07",X"03",X"13",X"FA",X"03",X"1F",X"23",X"27",X"2B",X"2F", + X"33",X"37",X"3B",X"3B",X"37",X"33",X"2F",X"2B",X"27",X"23",X"1F",X"FB",X"00",X"FF",X"FE",X"F8", + X"01",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"86",X"85",X"84",X"85",X"86",X"87",X"88", + X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"8E",X"8D",X"8C",X"8D",X"8E",X"8F",X"90",X"91",X"92", + X"93",X"FA",X"05",X"A0",X"B0",X"C0",X"D0",X"E0",X"C0",X"80",X"7E",X"7C",X"78",X"70",X"68",X"60", + X"58",X"50",X"48",X"40",X"18",X"10",X"08",X"FB",X"00",X"FF",X"FE",X"F8",X"0B",X"0D",X"D0",X"28", + X"CA",X"3F",X"C4",X"5E",X"B8",X"6F",X"AF",X"87",X"A0",X"94",X"94",X"87",X"A0",X"6F",X"AF",X"5E", + X"B8",X"3F",X"C4",X"28",X"CA",X"0D",X"D0",X"D0",X"D0",X"CA",X"28",X"C4",X"3F",X"B8",X"5E",X"AF", + X"6E",X"A0",X"87",X"94",X"94",X"6B",X"FF",X"F8",X"00",X"FE",X"F8",X"0B",X"80",X"9A",X"AA",X"9A", + X"80",X"9A",X"AA",X"9A",X"A5",X"8E",X"A5",X"8E",X"A5",X"8E",X"A5",X"8E",X"FF",X"F8",X"00",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"0B",X"13",X"65",X"63",X"51",X"91",X"C3",X"AA",X"A9",X"A5",X"BB",X"D5",X"6A",X"40",X"D5", + X"80",X"C9",X"12",X"D3",X"D9",X"C9",X"33",X"12",X"C0",X"00",X"FF",X"F8",X"00",X"FE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"09",X"B8",X"AF",X"A0",X"94",X"AF",X"A0",X"94",X"87", + X"A0",X"94",X"87",X"6F",X"94",X"87",X"6F",X"5E",X"87",X"6F",X"54",X"3F",X"6F",X"5E",X"3F",X"28", + X"5E",X"3F",X"28",X"0D",X"FF",X"F8",X"00",X"FE",X"F8",X"0B",X"E0",X"C0",X"80",X"BF",X"9F",X"8F", + X"87",X"83",X"7B",X"3B",X"1B",X"0B",X"03",X"01",X"00",X"00",X"FF",X"F8",X"00",X"FE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"07", + X"FA",X"01",X"00",X"00",X"28",X"00",X"54",X"00",X"FF",X"02",X"54",X"01",X"80",X"10",X"94",X"01", + X"80",X"02",X"94",X"01",X"AA",X"10",X"FF",X"04",X"FB",X"00",X"F8",X"0F",X"C0",X"00",X"FF",X"06", + X"C0",X"00",X"FF",X"05",X"C0",X"00",X"FF",X"04",X"C0",X"00",X"FF",X"03",X"C0",X"00",X"FF",X"02", + X"C0",X"00",X"FF",X"01",X"C0",X"00",X"FF",X"01",X"F8",X"07",X"F8",X"01",X"FA",X"07",X"C0",X"FF", + X"C0",X"FF",X"E0",X"DF",X"DE",X"DD",X"DC",X"DB",X"DA",X"DC",X"DA",X"DB",X"DC",X"DD",X"DE",X"DF", + X"E0",X"E1",X"E2",X"E3",X"E4",X"E5",X"E6",X"E7",X"E8",X"E9",X"FB",X"00",X"FF",X"FE",X"F8",X"03", + X"54",X"67",X"77",X"C7",X"D7",X"E7",X"F7",X"FF",X"F8",X"07",X"FF",X"10",X"54",X"04",X"FF",X"04", + X"54",X"04",X"77",X"04",X"8E",X"04",X"77",X"04",X"8E",X"04",X"77",X"04",X"67",X"04",X"FF",X"04", + X"67",X"04",X"80",X"04",X"9A",X"0C",X"A5",X"04",X"8E",X"04",X"77",X"04",X"A5",X"04",X"8E",X"04", + X"77",X"04",X"A5",X"04",X"8E",X"04",X"AA",X"04",X"FF",X"04",X"A5",X"04",X"AA",X"10",X"FF",X"00", + X"FE",X"00",X"F8",X"03",X"C7",X"FF",X"D5",X"C7",X"BC",X"FF",X"C7",X"BC",X"AA",X"FF",X"BC",X"AA", + X"8E",X"8E",X"FF",X"FF",X"8E",X"87",X"8E",X"94",X"9A",X"94",X"9A",X"A5",X"AA",X"AA",X"FF",X"FF", + X"8E",X"FF",X"8E",X"F8",X"07",X"94",X"03",X"8E",X"05",X"FF",X"02",X"A5",X"00",X"FF",X"03",X"AA", + X"00",X"FF",X"00",X"FE",X"00",X"F8",X"03",X"FC",X"01",X"1B",X"34",X"44",X"FA",X"07",X"54",X"FB", + X"00",X"FF",X"54",X"FF",X"54",X"FF",X"54",X"FF",X"FA",X"07",X"54",X"FB",X"00",X"44",X"54",X"67", + X"FA",X"07",X"77",X"FB",X"00",X"FF",X"77",X"FF",X"77",X"FF",X"77",X"FF",X"FA",X"07",X"77",X"FB", + X"00",X"54",X"77",X"80",X"FA",X"07",X"8E",X"FB",X"00",X"FF",X"8E",X"FF",X"8E",X"FF",X"8E",X"FF", + X"FA",X"07",X"8E",X"FB",X"00",X"77",X"8E",X"A5",X"FA",X"07",X"AB",X"FB",X"00",X"FF",X"AB",X"FF", + X"AB",X"FF",X"AB",X"FF",X"FA",X"07",X"AB",X"FB",X"00",X"FD",X"00",X"FF",X"FE",X"F8",X"00",X"FF", + X"FE",X"F8",X"17",X"FA",X"0E",X"AA",X"04",X"D5",X"01",X"FF",X"00",X"FB",X"00",X"F8",X"07",X"FE", + X"00",X"30",X"31",X"32",X"33",X"34",X"35",X"36",X"37",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E", + X"3F",X"00",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"81",X"80",X"FE",X"80",X"FA",X"08",X"91",X"FB",X"00",X"90",X"FE",X"80",X"90", + X"00",X"FE",X"00",X"E5",X"D5",X"57",X"FE",X"0E",X"CA",X"C9",X"08",X"3A",X"35",X"40",X"B7",X"CA", + X"EB",X"08",X"3A",X"FA",X"40",X"E6",X"04",X"C2",X"EB",X"08",X"7A",X"FE",X"10",X"CA",X"D1",X"08", + X"FE",X"05",X"CA",X"D1",X"08",X"FE",X"06",X"CA",X"D1",X"08",X"FE",X"07",X"CA",X"D1",X"08",X"FE", + X"08",X"CA",X"D1",X"08",X"FE",X"09",X"CA",X"D1",X"08",X"3A",X"FA",X"40",X"E6",X"02",X"C2",X"EB", + X"08",X"21",X"EE",X"08",X"7A",X"07",X"07",X"E6",X"FC",X"5F",X"16",X"00",X"19",X"7E",X"32",X"F9", + X"40",X"23",X"7E",X"32",X"EF",X"40",X"23",X"7E",X"32",X"F0",X"40",X"D1",X"E1",X"C9",X"02",X"40", + X"05",X"00",X"01",X"7E",X"05",X"00",X"01",X"B2",X"05",X"00",X"01",X"DF",X"05",X"00",X"01",X"0F", + X"06",X"00",X"01",X"4B",X"06",X"00",X"02",X"7A",X"06",X"00",X"02",X"A0",X"06",X"00",X"02",X"C6", + X"06",X"00",X"02",X"E8",X"06",X"00",X"03",X"0E",X"07",X"00",X"02",X"6E",X"07",X"00",X"04",X"B2", + X"07",X"00",X"01",X"E5",X"07",X"00",X"01",X"3D",X"08",X"00",X"03",X"2A",X"07",X"00",X"02",X"41", + X"08",X"00",X"00",X"E5",X"D5",X"57",X"FE",X"02",X"CA",X"42",X"09",X"3A",X"35",X"40",X"B7",X"CA", + X"62",X"09",X"00",X"21",X"65",X"09",X"7A",X"07",X"07",X"E6",X"FC",X"5F",X"16",X"00",X"19",X"7E", + X"32",X"04",X"41",X"23",X"7E",X"32",X"FB",X"40",X"23",X"7E",X"32",X"FC",X"40",X"23",X"7E",X"32", + X"FD",X"40",X"D1",X"E1",X"C9",X"01",X"83",X"08",X"00",X"01",X"86",X"08",X"00",X"01",X"8E",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F5",X"C5",X"D5",X"E5",X"D5",X"DD",X"E1",X"DD",X"7E",X"01",X"87",X"06",X"00",X"4F",X"FD", + X"21",X"00",X"58",X"FD",X"09",X"FD",X"36",X"00",X"00",X"DD",X"7E",X"00",X"FD",X"77",X"01",X"DD", + X"46",X"02",X"3E",X"1B",X"90",X"B7",X"CA",X"B4",X"09",X"21",X"40",X"50",X"01",X"20",X"00",X"09", + X"3D",X"C2",X"AF",X"09",X"DD",X"4E",X"01",X"06",X"00",X"09",X"01",X"E0",X"FF",X"DD",X"23",X"DD", + X"23",X"DD",X"23",X"DD",X"7E",X"00",X"FE",X"FF",X"CA",X"D8",X"09",X"77",X"09",X"7C",X"FE",X"50", + X"DA",X"D8",X"09",X"DD",X"23",X"C3",X"C3",X"09",X"E1",X"D1",X"C1",X"F1",X"C9",X"00",X"F5",X"C5", + X"D5",X"E5",X"D5",X"DD",X"E1",X"DD",X"7E",X"01",X"87",X"06",X"00",X"4F",X"FD",X"21",X"00",X"58", + X"FD",X"09",X"FD",X"36",X"00",X"00",X"DD",X"7E",X"00",X"FD",X"77",X"01",X"DD",X"46",X"02",X"3E", + X"1B",X"90",X"B7",X"CA",X"13",X"0A",X"FD",X"21",X"40",X"50",X"01",X"20",X"00",X"FD",X"09",X"3D", + X"C2",X"0D",X"0A",X"DD",X"4E",X"01",X"06",X"00",X"FD",X"09",X"01",X"E0",X"FF",X"DD",X"56",X"05", + X"DD",X"66",X"04",X"DD",X"6E",X"03",X"CB",X"42",X"CA",X"35",X"0A",X"7E",X"E6",X"0F",X"FD",X"77", + X"00",X"23",X"C3",X"3F",X"0A",X"7E",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"FD",X"77",X"00",X"FD", + X"09",X"15",X"C2",X"26",X"0A",X"E1",X"D1",X"C1",X"F1",X"C9",X"00",X"21",X"00",X"50",X"01",X"00", + X"04",X"36",X"24",X"23",X"0B",X"78",X"B1",X"C2",X"51",X"0A",X"00",X"21",X"40",X"58",X"01",X"40", + X"00",X"36",X"00",X"23",X"0B",X"78",X"B1",X"C2",X"61",X"0A",X"C9",X"00",X"21",X"40",X"41",X"01", + X"80",X"01",X"36",X"00",X"23",X"0B",X"78",X"B1",X"C2",X"72",X"0A",X"C9",X"00",X"3A",X"33",X"40", + X"B7",X"C2",X"3D",X"0B",X"06",X"00",X"3A",X"32",X"40",X"B7",X"CA",X"8E",X"0A",X"04",X"78",X"32", + X"35",X"40",X"CD",X"A2",X"0A",X"3E",X"01",X"32",X"34",X"40",X"3E",X"01",X"32",X"04",X"40",X"C3", + X"94",X"00",X"00",X"3E",X"01",X"32",X"3F",X"40",X"CD",X"4A",X"0A",X"CD",X"FC",X"0C",X"CD",X"61", + X"0E",X"3A",X"35",X"40",X"B7",X"C2",X"CF",X"0A",X"CD",X"A4",X"0D",X"CD",X"6F",X"2D",X"3E",X"FF", + X"CD",X"B2",X"02",X"3E",X"FF",X"CD",X"B2",X"02",X"AF",X"32",X"3F",X"40",X"C3",X"21",X"0B",X"CD", + X"6F",X"2D",X"3A",X"32",X"40",X"FE",X"01",X"C2",X"E0",X"0A",X"CD",X"9B",X"0E",X"C3",X"E3",X"0A", + X"CD",X"D2",X"0E",X"00",X"3A",X"00",X"68",X"E6",X"02",X"FE",X"02",X"CA",X"FB",X"0A",X"3A",X"00", + X"68",X"E6",X"01",X"FE",X"01",X"CA",X"14",X"0B",X"C3",X"D2",X"0A",X"3A",X"32",X"40",X"FE",X"02", + X"DA",X"D2",X"0A",X"3E",X"01",X"32",X"3F",X"40",X"3A",X"32",X"40",X"C6",X"98",X"27",X"32",X"32", + X"40",X"C3",X"21",X"0B",X"AF",X"32",X"3F",X"40",X"3A",X"32",X"40",X"C6",X"99",X"27",X"32",X"32", + X"40",X"CD",X"61",X"0E",X"CD",X"6B",X"0A",X"CD",X"A1",X"0C",X"AF",X"CD",X"1E",X"0C",X"3E",X"01", + X"CD",X"1E",X"0C",X"3A",X"BE",X"40",X"32",X"41",X"40",X"CD",X"FC",X"0C",X"C9",X"00",X"AF",X"32", + X"33",X"40",X"CD",X"5A",X"0A",X"3A",X"97",X"40",X"3D",X"32",X"97",X"40",X"3A",X"40",X"40",X"CD", + X"1E",X"0C",X"3A",X"97",X"40",X"B7",X"CA",X"A1",X"0B",X"3A",X"3F",X"40",X"B7",X"CA",X"90",X"0B", + X"3A",X"41",X"40",X"B7",X"CA",X"90",X"0B",X"3A",X"40",X"40",X"3C",X"E6",X"01",X"32",X"40",X"40", + X"3A",X"3C",X"40",X"B7",X"CA",X"90",X"0B",X"3A",X"40",X"40",X"B7",X"C2",X"89",X"0B",X"3E",X"01", + X"32",X"06",X"70",X"32",X"07",X"70",X"C3",X"90",X"0B",X"AF",X"32",X"06",X"70",X"32",X"07",X"70", + X"CD",X"6B",X"0A",X"3A",X"40",X"40",X"CD",X"56",X"0C",X"3E",X"01",X"32",X"04",X"40",X"C3",X"94", + X"00",X"3A",X"35",X"40",X"B7",X"CA",X"72",X"00",X"CD",X"0C",X"0F",X"3A",X"9E",X"40",X"B7",X"C2", + X"E8",X"0B",X"3A",X"9D",X"40",X"B7",X"CA",X"E8",X"0B",X"CD",X"A1",X"0C",X"3A",X"9B",X"40",X"C6", + X"10",X"F6",X"01",X"E6",X"F1",X"32",X"9B",X"40",X"3C",X"32",X"9C",X"40",X"3E",X"01",X"32",X"9E", + X"40",X"3A",X"40",X"40",X"CD",X"1E",X"0C",X"3A",X"3F",X"40",X"B7",X"CA",X"90",X"0B",X"3A",X"41", + X"40",X"B7",X"C2",X"67",X"0B",X"C3",X"90",X"0B",X"AF",X"32",X"9D",X"40",X"CD",X"00",X"2A",X"3A", + X"3F",X"40",X"B7",X"CA",X"FD",X"0B",X"3A",X"41",X"40",X"B7",X"C2",X"67",X"0B",X"CD",X"78",X"0F", + X"AF",X"32",X"33",X"40",X"32",X"34",X"40",X"32",X"35",X"40",X"32",X"3F",X"40",X"32",X"40",X"40", + X"3E",X"01",X"32",X"06",X"70",X"32",X"07",X"70",X"32",X"04",X"40",X"C3",X"72",X"00",X"00",X"B7", + X"C2",X"2A",X"0C",X"FD",X"21",X"9F",X"40",X"C3",X"2E",X"0C",X"FD",X"21",X"BE",X"40",X"DD",X"21", + X"97",X"40",X"01",X"01",X"00",X"11",X"01",X"00",X"26",X"08",X"CD",X"EC",X"0C",X"DD",X"21",X"40", + X"41",X"01",X"01",X"00",X"26",X"0F",X"CD",X"EC",X"0C",X"DD",X"21",X"82",X"41",X"01",X"14",X"00", + X"26",X"08",X"CD",X"EC",X"0C",X"C9",X"00",X"B7",X"C2",X"68",X"0C",X"3A",X"BE",X"40",X"32",X"41", + X"40",X"DD",X"21",X"9F",X"40",X"C3",X"72",X"0C",X"3A",X"9F",X"40",X"32",X"41",X"40",X"DD",X"21", + X"BE",X"40",X"FD",X"21",X"97",X"40",X"01",X"01",X"00",X"11",X"01",X"00",X"26",X"08",X"CD",X"EC", + X"0C",X"FD",X"21",X"40",X"41",X"11",X"01",X"00",X"26",X"0F",X"CD",X"EC",X"0C",X"FD",X"21",X"82", + X"41",X"11",X"14",X"00",X"26",X"08",X"CD",X"EC",X"0C",X"AF",X"32",X"26",X"42",X"32",X"27",X"42", + X"C9",X"00",X"3E",X"03",X"32",X"97",X"40",X"3A",X"9D",X"40",X"B7",X"C2",X"C2",X"0C",X"AF",X"32", + X"98",X"40",X"32",X"99",X"40",X"32",X"9A",X"40",X"3E",X"01",X"32",X"9B",X"40",X"3E",X"02",X"32", + X"9C",X"40",X"AF",X"32",X"9D",X"40",X"32",X"9E",X"40",X"AF",X"32",X"26",X"42",X"32",X"27",X"42", + X"3E",X"03",X"32",X"40",X"41",X"32",X"45",X"41",X"32",X"4A",X"41",X"3E",X"01",X"21",X"82",X"41", + X"11",X"14",X"00",X"06",X"08",X"77",X"19",X"05",X"C2",X"E5",X"0C",X"C9",X"00",X"DD",X"7E",X"00", + X"FD",X"77",X"00",X"DD",X"09",X"FD",X"19",X"25",X"C2",X"ED",X"0C",X"C9",X"00",X"11",X"5F",X"0D", + X"CD",X"80",X"09",X"11",X"7E",X"0D",X"CD",X"DD",X"09",X"11",X"84",X"0D",X"CD",X"DD",X"09",X"11", + X"8A",X"0D",X"CD",X"DD",X"09",X"21",X"54",X"40",X"06",X"0A",X"0E",X"00",X"7E",X"FE",X"24",X"C2", + X"23",X"0D",X"0C",X"23",X"05",X"C2",X"1C",X"0D",X"79",X"0F",X"E6",X"0F",X"C6",X"09",X"4F",X"DD", + X"21",X"51",X"40",X"DD",X"36",X"00",X"03",X"DD",X"36",X"01",X"02",X"DD",X"71",X"02",X"DD",X"36", + X"0D",X"FF",X"11",X"51",X"40",X"CD",X"80",X"09",X"3A",X"3F",X"40",X"B7",X"C0",X"3A",X"35",X"40", + X"B7",X"C8",X"11",X"90",X"0D",X"CD",X"80",X"09",X"11",X"9A",X"0D",X"CD",X"80",X"09",X"C9",X"04", + X"00",X"00",X"24",X"01",X"29",X"1C",X"1D",X"24",X"24",X"24",X"24",X"24",X"11",X"12",X"2B",X"1C", + X"0C",X"18",X"1B",X"0E",X"24",X"24",X"24",X"24",X"24",X"02",X"29",X"17",X"0D",X"FF",X"07",X"01", + X"00",X"A0",X"40",X"06",X"07",X"01",X"0B",X"42",X"40",X"06",X"07",X"01",X"16",X"BF",X"40",X"06", + X"04",X"00",X"16",X"24",X"24",X"24",X"24",X"24",X"24",X"FF",X"07",X"01",X"16",X"24",X"24",X"24", + X"24",X"24",X"24",X"FF",X"00",X"3E",X"01",X"32",X"04",X"40",X"3E",X"40",X"CD",X"B2",X"02",X"11", + X"F2",X"0D",X"CD",X"48",X"2A",X"3E",X"40",X"CD",X"B2",X"02",X"11",X"0B",X"0E",X"CD",X"48",X"2A", + X"3E",X"40",X"CD",X"B2",X"02",X"11",X"1A",X"0E",X"CD",X"48",X"2A",X"3E",X"40",X"CD",X"B2",X"02", + X"11",X"2B",X"0E",X"CD",X"80",X"09",X"3E",X"40",X"CD",X"B2",X"02",X"11",X"40",X"0E",X"CD",X"80", + X"09",X"3E",X"80",X"CD",X"B2",X"02",X"11",X"55",X"0E",X"CD",X"80",X"09",X"3E",X"FF",X"CD",X"B2", + X"02",X"C9",X"03",X"06",X"05",X"1D",X"1B",X"12",X"19",X"24",X"1D",X"18",X"24",X"1D",X"11",X"0E", + X"24",X"1C",X"19",X"0A",X"0C",X"0E",X"24",X"20",X"0A",X"1B",X"FF",X"02",X"09",X"09",X"16",X"18", + X"18",X"17",X"24",X"0C",X"1B",X"0E",X"1C",X"1D",X"0A",X"FF",X"0E",X"0E",X"09",X"1D",X"1B",X"22", + X"24",X"12",X"1D",X"24",X"17",X"18",X"20",X"24",X"28",X"28",X"FF",X"04",X"11",X"06",X"22",X"18", + X"1E",X"24",X"0C",X"0A",X"17",X"24",X"10",X"0E",X"1D",X"24",X"0A",X"24",X"15",X"18",X"1D",X"FF", + X"04",X"13",X"06",X"18",X"0F",X"24",X"0F",X"1E",X"17",X"24",X"0A",X"17",X"0D",X"24",X"1D",X"11", + X"1B",X"12",X"15",X"15",X"FF",X"07",X"1B",X"0A",X"3E",X"3C",X"3A",X"38",X"36",X"34",X"32",X"30", + X"FF",X"00",X"3A",X"3A",X"40",X"FE",X"04",X"CA",X"77",X"0E",X"11",X"8B",X"0E",X"CD",X"80",X"09", + X"11",X"95",X"0E",X"CD",X"DD",X"09",X"C9",X"11",X"7E",X"0E",X"CD",X"80",X"09",X"C9",X"05",X"1F", + X"00",X"0F",X"1B",X"0E",X"0E",X"24",X"19",X"15",X"0A",X"22",X"FF",X"05",X"1F",X"00",X"0C",X"1B", + X"0E",X"0D",X"12",X"1D",X"FF",X"05",X"1F",X"07",X"32",X"40",X"02",X"00",X"11",X"AF",X"0E",X"CD", + X"80",X"09",X"11",X"B7",X"0E",X"CD",X"80",X"09",X"11",X"CA",X"0E",X"CD",X"80",X"09",X"C9",X"04", + X"10",X"0C",X"19",X"1E",X"1C",X"11",X"FF",X"04",X"12",X"07",X"01",X"24",X"19",X"15",X"0A",X"22", + X"0E",X"1B",X"24",X"0B",X"1E",X"1D",X"1D",X"18",X"17",X"FF",X"04",X"14",X"0C",X"18",X"17",X"15", + X"22",X"FF",X"00",X"11",X"E6",X"0E",X"CD",X"80",X"09",X"11",X"EE",X"0E",X"CD",X"80",X"09",X"11", + X"02",X"0F",X"CD",X"80",X"09",X"C9",X"04",X"10",X"0C",X"19",X"1E",X"1C",X"11",X"FF",X"04",X"12", + X"07",X"01",X"24",X"18",X"1B",X"24",X"02",X"24",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"1C",X"24", + X"24",X"FF",X"04",X"14",X"0B",X"0B",X"1E",X"1D",X"1D",X"18",X"17",X"FF",X"00",X"3A",X"9E",X"40", + X"B7",X"C2",X"1B",X"0F",X"3A",X"9D",X"40",X"B7",X"C2",X"34",X"0F",X"3A",X"40",X"40",X"B7",X"C2", + X"28",X"0F",X"11",X"40",X"0F",X"C3",X"2B",X"0F",X"11",X"51",X"0F",X"CD",X"80",X"09",X"3E",X"80", + X"CD",X"B2",X"02",X"C9",X"11",X"62",X"0F",X"CD",X"80",X"09",X"3E",X"80",X"CD",X"B2",X"02",X"C9", + X"00",X"0D",X"07",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"24",X"01",X"24",X"18",X"1F",X"0E",X"1B", + X"FF",X"00",X"0D",X"07",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"24",X"02",X"24",X"18",X"1F",X"0E", + X"1B",X"FF",X"00",X"0D",X"04",X"0E",X"17",X"13",X"18",X"22",X"24",X"0A",X"17",X"18",X"1D",X"11", + X"0E",X"1B",X"24",X"10",X"0A",X"16",X"0E",X"FF",X"00",X"11",X"8E",X"0F",X"CD",X"80",X"09",X"3E", + X"01",X"32",X"04",X"40",X"3E",X"80",X"CD",X"B2",X"02",X"AF",X"32",X"04",X"40",X"C9",X"00",X"11", + X"09",X"10",X"0A",X"16",X"0E",X"24",X"18",X"1F",X"0E",X"1B",X"FF",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"3A",X"3A",X"42",X"FE",X"04",X"CA",X"23",X"10",X"3A",X"9B",X"40",X"E6",X"F0",X"FE",X"50", + X"DA",X"1B",X"10",X"3A",X"3C",X"42",X"FE",X"01",X"CA",X"23",X"10",X"3A",X"05",X"40",X"E6",X"01", + X"C2",X"7F",X"10",X"3A",X"3B",X"42",X"FE",X"04",X"DA",X"7F",X"10",X"3A",X"3C",X"42",X"B7",X"CA", + X"7F",X"10",X"3A",X"26",X"42",X"B7",X"C2",X"41",X"10",X"3A",X"27",X"42",X"FE",X"20",X"DA",X"7F", + X"10",X"3A",X"3A",X"42",X"FE",X"03",X"CA",X"67",X"10",X"06",X"08",X"AF",X"32",X"39",X"42",X"00", + X"CD",X"6B",X"11",X"3A",X"39",X"42",X"3C",X"32",X"39",X"42",X"05",X"C2",X"4F",X"10",X"CD",X"E7", + X"10",X"CD",X"82",X"10",X"C3",X"7F",X"10",X"3A",X"3C",X"42",X"3D",X"0F",X"E6",X"03",X"32",X"39", + X"42",X"CD",X"6B",X"11",X"3A",X"39",X"42",X"C6",X"04",X"32",X"39",X"42",X"CD",X"6B",X"11",X"CD", + X"10",X"03",X"C9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"21",X"73",X"41",X"DD",X"7E",X"00",X"B7", + X"C8",X"3A",X"4B",X"42",X"DD",X"86",X"04",X"DD",X"77",X"04",X"DD",X"7E",X"03",X"C6",X"08",X"DD", + X"77",X"03",X"CD",X"42",X"11",X"DD",X"7E",X"03",X"FE",X"F7",X"D8",X"21",X"E0",X"53",X"06",X"20", + X"36",X"24",X"23",X"05",X"C2",X"10",X"11",X"DD",X"36",X"00",X"00",X"AF",X"32",X"4D",X"42",X"FD", + X"21",X"82",X"41",X"11",X"14",X"00",X"06",X"04",X"FD",X"7E",X"13",X"FE",X"FF",X"C2",X"39",X"11", + X"FD",X"36",X"13",X"00",X"FD",X"36",X"27",X"00",X"C9",X"FD",X"19",X"FD",X"19",X"05",X"C2",X"28", + X"11",X"C9",X"00",X"DD",X"7E",X"04",X"C6",X"04",X"47",X"DD",X"7E",X"03",X"0F",X"0F",X"E6",X"3E", + X"21",X"00",X"58",X"5F",X"16",X"00",X"19",X"70",X"23",X"36",X"07",X"FD",X"21",X"E0",X"53",X"7B", + X"0F",X"E6",X"1F",X"5F",X"FD",X"19",X"FD",X"36",X"00",X"81",X"C9",X"00",X"C5",X"DD",X"21",X"82", + X"41",X"11",X"14",X"00",X"3A",X"39",X"42",X"B7",X"CA",X"81",X"11",X"DD",X"19",X"3D",X"C2",X"7B", + X"11",X"DD",X"7E",X"00",X"B7",X"CA",X"E3",X"11",X"3A",X"4E",X"42",X"B7",X"CA",X"97",X"11",X"DD", + X"36",X"05",X"05",X"DD",X"36",X"07",X"00",X"DD",X"7E",X"05",X"B7",X"CA",X"B6",X"11",X"3D",X"CA", + X"BC",X"11",X"3D",X"CA",X"C2",X"11",X"3D",X"CA",X"C8",X"11",X"3D",X"CA",X"CE",X"11",X"3D",X"CA", + X"D4",X"11",X"3D",X"CA",X"DA",X"11",X"CD",X"0E",X"12",X"C3",X"E0",X"11",X"CD",X"89",X"13",X"C3", + X"E0",X"11",X"CD",X"C7",X"13",X"C3",X"E0",X"11",X"CD",X"A2",X"14",X"C3",X"E0",X"11",X"CD",X"14", + X"16",X"C3",X"E0",X"11",X"CD",X"DC",X"16",X"C3",X"E0",X"11",X"CD",X"CD",X"17",X"C3",X"E0",X"11", + X"CD",X"88",X"18",X"C1",X"C9",X"00",X"DD",X"7E",X"03",X"FE",X"08",X"DA",X"F7",X"11",X"DD",X"7E", + X"04",X"FE",X"F4",X"D8",X"FE",X"FC",X"D0",X"DD",X"36",X"05",X"04",X"DD",X"36",X"07",X"00",X"DD", + X"36",X"02",X"00",X"3A",X"3A",X"42",X"FE",X"03",X"C0",X"DD",X"36",X"03",X"00",X"C9",X"00",X"3A", + X"3A",X"42",X"B7",X"CA",X"28",X"12",X"FE",X"01",X"CA",X"41",X"12",X"FE",X"02",X"CA",X"66",X"12", + X"FE",X"03",X"CA",X"8B",X"12",X"C3",X"A4",X"12",X"DD",X"7E",X"07",X"B7",X"C2",X"3D",X"12",X"3A", + X"3A",X"42",X"CD",X"92",X"08",X"FD",X"21",X"29",X"13",X"CD",X"BD",X"12",X"C9",X"CD",X"EF",X"12", + X"C9",X"DD",X"7E",X"07",X"B7",X"C2",X"62",X"12",X"3A",X"3A",X"42",X"CD",X"92",X"08",X"3A",X"39", + X"42",X"C6",X"08",X"CD",X"20",X"18",X"DD",X"36",X"04",X"78",X"DD",X"36",X"03",X"80",X"DD",X"36", + X"01",X"24",X"CD",X"20",X"1A",X"C9",X"DD",X"7E",X"07",X"B7",X"C2",X"87",X"12",X"3A",X"3A",X"42", + X"CD",X"92",X"08",X"3A",X"39",X"42",X"C6",X"10",X"CD",X"20",X"18",X"DD",X"36",X"04",X"78",X"DD", + X"36",X"03",X"80",X"DD",X"36",X"01",X"24",X"CD",X"20",X"1A",X"C9",X"DD",X"7E",X"07",X"B7",X"C2", + X"A0",X"12",X"3A",X"3A",X"42",X"CD",X"92",X"08",X"FD",X"21",X"49",X"13",X"CD",X"BD",X"12",X"C9", + X"CD",X"EF",X"12",X"C9",X"DD",X"7E",X"07",X"B7",X"C2",X"B9",X"12",X"3A",X"3A",X"42",X"CD",X"92", + X"08",X"FD",X"21",X"69",X"13",X"CD",X"BD",X"12",X"C9",X"CD",X"EF",X"12",X"C9",X"00",X"3A",X"39", + X"42",X"07",X"07",X"E6",X"1C",X"5F",X"16",X"00",X"FD",X"19",X"FD",X"7E",X"00",X"DD",X"77",X"03", + X"FD",X"7E",X"01",X"DD",X"77",X"04",X"FD",X"7E",X"02",X"DD",X"77",X"0A",X"FD",X"7E",X"03",X"DD", + X"77",X"0B",X"DD",X"36",X"01",X"24",X"DD",X"36",X"06",X"10",X"DD",X"36",X"07",X"01",X"C9",X"DD", + X"7E",X"06",X"E6",X"01",X"CA",X"FA",X"12",X"DD",X"35",X"01",X"DD",X"7E",X"03",X"DD",X"86",X"0A", + X"DD",X"77",X"03",X"DD",X"7E",X"04",X"DD",X"86",X"0B",X"DD",X"77",X"04",X"DD",X"35",X"06",X"C0", + X"3A",X"3A",X"42",X"B7",X"CA",X"20",X"13",X"DD",X"36",X"05",X"01",X"DD",X"36",X"07",X"00",X"C9", + X"DD",X"36",X"05",X"02",X"DD",X"36",X"07",X"00",X"C9",X"60",X"70",X"FE",X"FE",X"60",X"70",X"FE", + X"FE",X"60",X"78",X"FF",X"00",X"60",X"78",X"FF",X"00",X"60",X"80",X"FE",X"02",X"60",X"80",X"FE", + X"02",X"58",X"78",X"FE",X"00",X"58",X"78",X"FE",X"00",X"30",X"20",X"06",X"04",X"20",X"B0",X"06", + X"FD",X"20",X"40",X"06",X"03",X"50",X"90",X"06",X"FC",X"60",X"A0",X"06",X"FD",X"40",X"50",X"04", + X"02",X"70",X"C0",X"05",X"FC",X"80",X"50",X"06",X"04",X"00",X"20",X"02",X"00",X"00",X"38",X"03", + X"00",X"00",X"50",X"02",X"00",X"00",X"68",X"03",X"00",X"00",X"88",X"03",X"00",X"00",X"A0",X"02", + X"00",X"00",X"B8",X"03",X"00",X"00",X"D0",X"02",X"00",X"00",X"3A",X"3A",X"42",X"FE",X"03",X"CA", + X"BE",X"13",X"FE",X"04",X"CA",X"BE",X"13",X"DD",X"7E",X"07",X"B7",X"C2",X"B7",X"13",X"21",X"41", + X"42",X"06",X"01",X"0E",X"00",X"3A",X"3A",X"42",X"FE",X"01",X"C2",X"AF",X"13",X"0E",X"50",X"CD", + X"08",X"18",X"EE",X"01",X"CD",X"20",X"18",X"CD",X"20",X"1A",X"CD",X"E5",X"11",X"C9",X"DD",X"36", + X"05",X"02",X"DD",X"36",X"07",X"00",X"C9",X"00",X"3A",X"3A",X"42",X"B7",X"CA",X"E1",X"13",X"FE", + X"01",X"CA",X"2E",X"14",X"FE",X"02",X"CA",X"2E",X"14",X"FE",X"03",X"CA",X"66",X"14",X"C3",X"7C", + X"14",X"DD",X"7E",X"07",X"B7",X"C2",X"F3",X"13",X"3A",X"27",X"42",X"0F",X"E6",X"01",X"C6",X"02", + X"CD",X"20",X"18",X"DD",X"7E",X"13",X"FE",X"FF",X"C8",X"CD",X"20",X"1A",X"CD",X"E5",X"11",X"3A", + X"39",X"42",X"E6",X"01",X"CA",X"1F",X"14",X"3A",X"9B",X"40",X"E6",X"F0",X"CA",X"1F",X"14",X"DD", + X"E5",X"FD",X"E1",X"11",X"EC",X"FF",X"FD",X"19",X"FD",X"7E",X"00",X"B7",X"CA",X"25",X"14",X"3A", + X"3C",X"42",X"FE",X"05",X"D0",X"DD",X"36",X"05",X"03",X"DD",X"36",X"07",X"00",X"C9",X"DD",X"7E", + X"07",X"B7",X"C2",X"4F",X"14",X"3A",X"3D",X"42",X"47",X"3A",X"3E",X"42",X"B8",X"DA",X"56",X"14", + X"21",X"42",X"42",X"06",X"07",X"0E",X"30",X"CD",X"08",X"18",X"EE",X"01",X"CD",X"20",X"18",X"CD", + X"20",X"1A",X"CD",X"E5",X"11",X"C9",X"3A",X"3E",X"42",X"3C",X"32",X"3E",X"42",X"DD",X"36",X"05", + X"03",X"DD",X"36",X"07",X"00",X"C9",X"DD",X"7E",X"03",X"DD",X"86",X"0A",X"DD",X"77",X"03",X"DD", + X"7E",X"04",X"DD",X"86",X"0B",X"DD",X"77",X"04",X"CD",X"E5",X"11",X"C9",X"DD",X"7E",X"07",X"B7", + X"C2",X"90",X"14",X"21",X"42",X"42",X"06",X"01",X"0E",X"52",X"CD",X"08",X"18",X"CD",X"20",X"18", + X"CD",X"20",X"1A",X"CD",X"E5",X"11",X"3A",X"3D",X"42",X"47",X"3A",X"3E",X"42",X"B8",X"DA",X"56", + X"14",X"C9",X"00",X"3A",X"3A",X"42",X"B7",X"CA",X"BA",X"14",X"FE",X"01",X"CA",X"BA",X"14",X"FE", + X"02",X"CA",X"BA",X"14",X"FE",X"03",X"C8",X"C3",X"59",X"15",X"3A",X"9B",X"40",X"E6",X"F0",X"FE", + X"C0",X"DA",X"CC",X"14",X"3A",X"3C",X"42",X"FE",X"01",X"CA",X"9B",X"15",X"DD",X"7E",X"07",X"B7", + X"C2",X"45",X"15",X"3A",X"2B",X"42",X"D6",X"20",X"47",X"3A",X"2B",X"42",X"C6",X"20",X"4F",X"DD", + X"7E",X"04",X"B8",X"DA",X"07",X"15",X"B9",X"D2",X"07",X"15",X"DD",X"7E",X"03",X"FE",X"80",X"DA", + X"FA",X"14",X"FE",X"A0",X"D2",X"FA",X"14",X"C3",X"25",X"15",X"FE",X"60",X"DA",X"11",X"15",X"FE", + X"80",X"D2",X"11",X"15",X"C3",X"1B",X"15",X"21",X"43",X"42",X"06",X"0F",X"0E",X"40",X"C3",X"2F", + X"15",X"21",X"44",X"42",X"06",X"0F",X"0E",X"20",X"C3",X"2F",X"15",X"21",X"45",X"42",X"06",X"03", + X"0E",X"20",X"C3",X"2F",X"15",X"21",X"46",X"42",X"06",X"03",X"0E",X"1C",X"C3",X"2F",X"15",X"CD", + X"08",X"18",X"47",X"DD",X"7E",X"05",X"FE",X"02",X"C2",X"41",X"15",X"78",X"EE",X"01",X"C3",X"42", + X"15",X"78",X"CD",X"20",X"18",X"CD",X"20",X"1A",X"CD",X"E5",X"11",X"DD",X"7E",X"05",X"FE",X"04", + X"C0",X"3A",X"3E",X"42",X"3D",X"32",X"3E",X"42",X"C9",X"DD",X"7E",X"07",X"B7",X"C2",X"78",X"15", + X"DD",X"36",X"0B",X"00",X"3A",X"9B",X"40",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"E6",X"03",X"C6", + X"04",X"DD",X"77",X"0A",X"DD",X"36",X"07",X"01",X"DD",X"7E",X"04",X"DD",X"86",X"0B",X"DD",X"77", + X"04",X"DD",X"7E",X"03",X"DD",X"86",X"0A",X"DD",X"77",X"03",X"CD",X"E5",X"11",X"DD",X"7E",X"05", + X"FE",X"04",X"C0",X"3A",X"3E",X"42",X"3D",X"32",X"3E",X"42",X"C9",X"3A",X"3A",X"42",X"FE",X"01", + X"CA",X"F9",X"15",X"DD",X"7E",X"07",X"B7",X"C2",X"F6",X"15",X"3A",X"46",X"42",X"3C",X"32",X"46", + X"42",X"3A",X"2B",X"42",X"47",X"DD",X"7E",X"04",X"90",X"DA",X"CA",X"15",X"47",X"3A",X"46",X"42", + X"F6",X"54",X"E6",X"55",X"32",X"46",X"42",X"C3",X"D7",X"15",X"2F",X"3C",X"47",X"3A",X"46",X"42", + X"F6",X"56",X"E6",X"57",X"32",X"46",X"42",X"CD",X"20",X"18",X"3A",X"46",X"42",X"E6",X"01",X"C2", + X"F6",X"15",X"78",X"0F",X"0F",X"0F",X"0F",X"0F",X"E6",X"07",X"C6",X"00",X"FE",X"02",X"D2",X"F3", + X"15",X"3E",X"01",X"DD",X"77",X"11",X"C3",X"45",X"15",X"DD",X"7E",X"07",X"B7",X"C2",X"0D",X"16", + X"21",X"46",X"42",X"06",X"07",X"0E",X"58",X"CD",X"08",X"18",X"CD",X"20",X"18",X"C3",X"45",X"15", + X"00",X"00",X"00",X"00",X"00",X"3A",X"3A",X"42",X"B7",X"CA",X"2E",X"16",X"FE",X"01",X"CA",X"58", + X"16",X"FE",X"02",X"CA",X"2E",X"16",X"FE",X"03",X"CA",X"6D",X"16",X"C3",X"81",X"16",X"DD",X"7E", + X"07",X"B7",X"C2",X"54",X"16",X"3A",X"3A",X"42",X"CD",X"92",X"08",X"21",X"47",X"42",X"06",X"03", + X"0E",X"18",X"CD",X"08",X"18",X"DD",X"36",X"04",X"78",X"DD",X"36",X"03",X"50",X"DD",X"36",X"01", + X"24",X"CD",X"20",X"18",X"CD",X"20",X"1A",X"C9",X"DD",X"7E",X"07",X"B7",X"C2",X"69",X"16",X"3A", + X"3A",X"42",X"CD",X"92",X"08",X"CD",X"A3",X"16",X"C9",X"CD",X"EF",X"12",X"C9",X"DD",X"36",X"05", + X"00",X"DD",X"36",X"07",X"00",X"3A",X"3C",X"42",X"3D",X"32",X"3C",X"42",X"DD",X"36",X"00",X"00", + X"C9",X"3A",X"3A",X"42",X"CD",X"92",X"08",X"DD",X"36",X"05",X"02",X"DD",X"36",X"07",X"00",X"FD", + X"21",X"69",X"13",X"3A",X"2B",X"42",X"47",X"3A",X"27",X"42",X"E6",X"3F",X"D6",X"20",X"80",X"DD", + X"77",X"04",X"C9",X"00",X"DD",X"7E",X"03",X"E6",X"3F",X"C6",X"40",X"DD",X"77",X"03",X"3A",X"3C", + X"42",X"FE",X"01",X"C2",X"BD",X"16",X"DD",X"7E",X"03",X"E6",X"3F",X"C6",X"10",X"DD",X"7E",X"04", + X"E6",X"3F",X"C6",X"50",X"DD",X"77",X"04",X"DD",X"36",X"0A",X"00",X"DD",X"36",X"0B",X"00",X"DD", + X"36",X"01",X"24",X"DD",X"36",X"06",X"10",X"DD",X"36",X"07",X"01",X"C9",X"00",X"3A",X"3A",X"42", + X"FE",X"03",X"CA",X"36",X"17",X"FE",X"04",X"CA",X"4C",X"17",X"DD",X"7E",X"07",X"B7",X"C2",X"00", + X"17",X"DD",X"36",X"06",X"40",X"DD",X"36",X"07",X"01",X"3A",X"4E",X"42",X"3D",X"32",X"4E",X"42", + X"DD",X"7E",X"01",X"FE",X"24",X"CA",X"0B",X"17",X"DD",X"34",X"01",X"DD",X"7E",X"04",X"2F",X"0F", + X"0F",X"0F",X"0F",X"E6",X"0F",X"D6",X"08",X"DD",X"86",X"04",X"DD",X"77",X"04",X"DD",X"7E",X"03", + X"2F",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"D6",X"08",X"DD",X"86",X"03",X"DD",X"77",X"03",X"DD", + X"35",X"06",X"CA",X"8A",X"17",X"C9",X"DD",X"7E",X"07",X"B7",X"C2",X"6E",X"17",X"DD",X"36",X"06", + X"80",X"DD",X"36",X"07",X"01",X"AF",X"32",X"4E",X"42",X"C3",X"6E",X"17",X"DD",X"7E",X"07",X"B7", + X"C2",X"6E",X"17",X"DD",X"36",X"07",X"01",X"3A",X"4E",X"42",X"3D",X"32",X"4E",X"42",X"DD",X"36", + X"06",X"80",X"DD",X"36",X"0A",X"02",X"DD",X"36",X"0B",X"00",X"DD",X"36",X"07",X"01",X"DD",X"7E", + X"04",X"DD",X"86",X"0B",X"DD",X"77",X"04",X"DD",X"7E",X"03",X"DD",X"86",X"0A",X"DD",X"77",X"03", + X"CD",X"B2",X"17",X"DD",X"35",X"06",X"CA",X"8A",X"17",X"C9",X"3E",X"01",X"32",X"04",X"40",X"3A", + X"9B",X"40",X"32",X"9C",X"40",X"E6",X"F0",X"F6",X"01",X"32",X"9B",X"40",X"AF",X"32",X"26",X"42", + X"32",X"27",X"42",X"3E",X"01",X"32",X"33",X"40",X"3E",X"40",X"CD",X"B2",X"02",X"AF",X"32",X"04", + X"40",X"C9",X"00",X"DD",X"7E",X"03",X"FE",X"02",X"DA",X"C4",X"17",X"DD",X"7E",X"04",X"FE",X"F4", + X"D8",X"FE",X"FC",X"D0",X"DD",X"36",X"05",X"06",X"DD",X"36",X"07",X"00",X"C9",X"00",X"DD",X"7E", + X"07",X"B7",X"C2",X"DD",X"17",X"DD",X"36",X"06",X"80",X"DD",X"36",X"07",X"01",X"DD",X"35",X"06", + X"CA",X"E4",X"17",X"C9",X"3E",X"01",X"32",X"04",X"40",X"3A",X"9B",X"40",X"32",X"9C",X"40",X"E6", + X"F0",X"F6",X"01",X"32",X"9B",X"40",X"AF",X"32",X"26",X"42",X"32",X"27",X"42",X"3E",X"01",X"32", + X"33",X"40",X"3E",X"40",X"CD",X"B2",X"02",X"C9",X"00",X"7E",X"C6",X"06",X"A0",X"77",X"E6",X"FE", + X"81",X"4F",X"DD",X"7E",X"0F",X"FE",X"01",X"CA",X"1C",X"18",X"79",X"C9",X"79",X"F6",X"01",X"C9", + X"00",X"FD",X"21",X"00",X"1C",X"57",X"07",X"07",X"07",X"E6",X"F8",X"5F",X"7A",X"0F",X"0F",X"0F", + X"0F",X"0F",X"E6",X"03",X"57",X"FD",X"19",X"FD",X"7E",X"00",X"DD",X"77",X"08",X"3A",X"3A",X"42", + X"FE",X"01",X"CA",X"63",X"18",X"FE",X"03",X"CA",X"63",X"18",X"FE",X"04",X"CA",X"63",X"18",X"3A", + X"40",X"41",X"FE",X"01",X"CA",X"63",X"18",X"3A",X"9B",X"40",X"E6",X"F0",X"C2",X"63",X"18",X"DD", + X"36",X"08",X"02",X"FD",X"7E",X"01",X"DD",X"77",X"0D",X"FD",X"7E",X"02",X"DD",X"77",X"0E",X"FD", + X"7E",X"03",X"DD",X"77",X"0F",X"FD",X"7E",X"04",X"DD",X"77",X"10",X"FD",X"7E",X"05",X"DD",X"77", + X"11",X"FD",X"7E",X"06",X"DD",X"77",X"02",X"C9",X"00",X"21",X"A8",X"19",X"DD",X"7E",X"01",X"57", + X"3A",X"3A",X"42",X"FE",X"04",X"C2",X"A2",X"18",X"DD",X"7E",X"05",X"FE",X"02",X"DA",X"A2",X"18", + X"16",X"01",X"3A",X"3A",X"42",X"FE",X"03",X"C2",X"B2",X"18",X"7A",X"FE",X"1D",X"D2",X"B2",X"18", + X"16",X"1D",X"7A",X"5F",X"16",X"00",X"19",X"FD",X"21",X"40",X"58",X"3A",X"3A",X"42",X"FE",X"03", + X"CA",X"D2",X"18",X"3A",X"39",X"42",X"07",X"07",X"E6",X"FC",X"5F",X"16",X"00",X"FD",X"19",X"C3", + X"DE",X"18",X"3A",X"39",X"42",X"E6",X"FC",X"CA",X"DE",X"18",X"FD",X"21",X"50",X"58",X"DD",X"7E", + X"04",X"FD",X"77",X"00",X"7E",X"57",X"3A",X"3A",X"42",X"FE",X"01",X"C2",X"0F",X"19",X"DD",X"7E", + X"02",X"E6",X"F0",X"FE",X"50",X"C2",X"0F",X"19",X"7A",X"C6",X"08",X"EE",X"07",X"57",X"DD",X"7E", + X"0E",X"E6",X"18",X"FE",X"00",X"CA",X"0F",X"19",X"FE",X"18",X"CA",X"0F",X"19",X"16",X"E9",X"3A", + X"3A",X"42",X"B7",X"C2",X"24",X"19",X"3A",X"39",X"42",X"E6",X"01",X"CA",X"24",X"19",X"7A",X"EE", + X"40",X"EE",X"80",X"57",X"3A",X"3A",X"42",X"FE",X"04",X"C2",X"34",X"19",X"7A",X"F6",X"40",X"E6", + X"F7",X"C6",X"08",X"57",X"7A",X"C6",X"20",X"FD",X"77",X"01",X"3A",X"3F",X"42",X"FD",X"77",X"02", + X"DD",X"7E",X"05",X"FE",X"03",X"C2",X"4E",X"19",X"3A",X"40",X"42",X"FD",X"77",X"02",X"DD",X"7E", + X"03",X"FD",X"77",X"03",X"3A",X"3A",X"42",X"FE",X"04",X"C0",X"DD",X"7E",X"13",X"B7",X"C8",X"2F", + X"DD",X"E5",X"DD",X"21",X"40",X"58",X"07",X"07",X"E6",X"FC",X"5F",X"16",X"00",X"DD",X"19",X"DD", + X"36",X"02",X"01",X"FD",X"7E",X"02",X"FE",X"02",X"C2",X"7F",X"19",X"DD",X"36",X"02",X"03",X"FD", + X"7E",X"01",X"D6",X"08",X"DD",X"77",X"01",X"FD",X"7E",X"00",X"DD",X"77",X"00",X"FD",X"7E",X"03", + X"C6",X"10",X"DD",X"77",X"03",X"FD",X"E1",X"FD",X"E5",X"FD",X"7E",X"05",X"FE",X"03",X"CA",X"A5", + X"19",X"DD",X"36",X"01",X"09",X"DD",X"E1",X"C9",X"00",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7", + X"87",X"86",X"85",X"84",X"83",X"82",X"81",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"47",X"46", + X"45",X"44",X"43",X"42",X"41",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"00",X"FD",X"21", + X"E8",X"19",X"3D",X"87",X"5F",X"16",X"00",X"FD",X"19",X"FD",X"7E",X"01",X"2F",X"3C",X"DD",X"77", + X"0A",X"FD",X"7E",X"00",X"DD",X"77",X"0B",X"C9",X"00",X"FD",X"FF",X"FC",X"FD",X"FB",X"FC",X"FC", + X"FB",X"FD",X"FC",X"FF",X"FD",X"00",X"FD",X"00",X"FC",X"01",X"FB",X"03",X"FC",X"04",X"FD",X"05", + X"FF",X"04",X"00",X"03",X"00",X"03",X"01",X"04",X"03",X"05",X"04",X"04",X"05",X"03",X"04",X"01", + X"03",X"00",X"03",X"00",X"04",X"FF",X"05",X"FD",X"04",X"FC",X"03",X"FB",X"01",X"FC",X"00",X"FD", + X"00",X"DD",X"7E",X"07",X"B7",X"C2",X"35",X"1A",X"DD",X"7E",X"08",X"DD",X"77",X"09",X"DD",X"36", + X"07",X"01",X"C3",X"38",X"1B",X"DD",X"7E",X"09",X"3D",X"DD",X"77",X"09",X"C0",X"DD",X"7E",X"08", + X"DD",X"77",X"09",X"DD",X"7E",X"12",X"3D",X"DD",X"77",X"12",X"C2",X"64",X"1B",X"DD",X"35",X"0E", + X"C2",X"71",X"1A",X"DD",X"36",X"07",X"00",X"DD",X"7E",X"05",X"FE",X"00",X"CA",X"6C",X"1A",X"FE", + X"01",X"CA",X"6C",X"1A",X"FE",X"04",X"C0",X"DD",X"36",X"05",X"01",X"C9",X"3C",X"DD",X"77",X"05", + X"C9",X"DD",X"7E",X"0E",X"E6",X"07",X"FE",X"02",X"C2",X"8B",X"1A",X"DD",X"7E",X"02",X"E6",X"0F", + X"CA",X"8B",X"1A",X"FE",X"05",X"D2",X"8B",X"1A",X"DD",X"35",X"0E",X"DD",X"7E",X"0D",X"DD",X"86", + X"0F",X"C2",X"96",X"1A",X"3E",X"1C",X"FE",X"1D",X"C2",X"9D",X"1A",X"3E",X"01",X"DD",X"77",X"0D", + X"DD",X"7E",X"0E",X"E6",X"03",X"C2",X"1D",X"1B",X"DD",X"7E",X"0E",X"E6",X"07",X"C2",X"10",X"1B", + X"DD",X"7E",X"0E",X"E6",X"0F",X"C2",X"EC",X"1A",X"DD",X"7E",X"02",X"E6",X"0F",X"FE",X"02",X"CA", + X"CF",X"1A",X"FE",X"03",X"CA",X"D8",X"1A",X"FE",X"04",X"CA",X"E1",X"1A",X"C3",X"EC",X"1A",X"DD", + X"34",X"10",X"DD",X"34",X"11",X"C3",X"EC",X"1A",X"DD",X"35",X"10",X"DD",X"35",X"11",X"C3",X"EC", + X"1A",X"DD",X"7E",X"0F",X"2F",X"3C",X"DD",X"77",X"0F",X"C3",X"EC",X"1A",X"DD",X"7E",X"02",X"E6", + X"0F",X"FE",X"06",X"CA",X"FE",X"1A",X"FE",X"07",X"CA",X"07",X"1B",X"C3",X"10",X"1B",X"DD",X"34", + X"10",X"DD",X"34",X"11",X"C3",X"10",X"1B",X"DD",X"35",X"10",X"DD",X"35",X"11",X"C3",X"10",X"1B", + X"DD",X"7E",X"02",X"E6",X"F0",X"FE",X"20",X"C2",X"1D",X"1B",X"DD",X"35",X"01",X"DD",X"7E",X"02", + X"E6",X"F0",X"FE",X"10",X"CA",X"35",X"1B",X"FE",X"20",X"CA",X"38",X"1B",X"DD",X"7E",X"0D",X"DD", + X"77",X"01",X"C3",X"38",X"1B",X"DD",X"35",X"01",X"DD",X"7E",X"0D",X"CD",X"CD",X"19",X"DD",X"7E", + X"0D",X"D6",X"04",X"DA",X"55",X"1B",X"D6",X"07",X"DA",X"5E",X"1B",X"D6",X"07",X"DA",X"55",X"1B", + X"D6",X"07",X"DA",X"5E",X"1B",X"DD",X"7E",X"10",X"DD",X"77",X"12",X"C3",X"64",X"1B",X"DD",X"7E", + X"11",X"DD",X"77",X"12",X"DD",X"7E",X"03",X"DD",X"86",X"0A",X"DD",X"77",X"03",X"DD",X"7E",X"04", + X"DD",X"86",X"0B",X"DD",X"77",X"04",X"C9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"0F",X"09",X"01",X"03",X"03",X"00",X"00",X"01",X"0F",X"09",X"FF",X"03",X"03",X"00",X"00", + X"01",X"01",X"1E",X"01",X"01",X"02",X"00",X"00",X"01",X"01",X"1E",X"FF",X"01",X"02",X"00",X"00", + X"02",X"08",X"09",X"01",X"01",X"01",X"10",X"00",X"02",X"16",X"09",X"FF",X"01",X"01",X"10",X"00", + X"01",X"08",X"09",X"01",X"02",X"02",X"10",X"00",X"01",X"16",X"09",X"FF",X"02",X"02",X"10",X"00", + X"04",X"08",X"09",X"01",X"01",X"01",X"10",X"00",X"04",X"16",X"09",X"FF",X"01",X"01",X"10",X"00", + X"02",X"08",X"09",X"01",X"02",X"02",X"10",X"00",X"02",X"16",X"09",X"FF",X"02",X"02",X"10",X"00", + X"01",X"08",X"09",X"01",X"03",X"03",X"10",X"00",X"01",X"16",X"09",X"FF",X"03",X"03",X"10",X"00", + X"01",X"08",X"09",X"01",X"04",X"04",X"10",X"00",X"01",X"16",X"09",X"FF",X"04",X"04",X"10",X"00", + X"04",X"08",X"09",X"01",X"01",X"01",X"10",X"00",X"04",X"16",X"09",X"FF",X"01",X"01",X"10",X"00", + X"02",X"08",X"09",X"01",X"02",X"02",X"10",X"00",X"02",X"16",X"09",X"FF",X"02",X"02",X"10",X"00", + X"02",X"08",X"09",X"01",X"01",X"03",X"10",X"00",X"02",X"16",X"09",X"FF",X"01",X"03",X"10",X"00", + X"02",X"08",X"09",X"01",X"02",X"04",X"10",X"00",X"02",X"16",X"09",X"FF",X"02",X"04",X"10",X"00", + X"01",X"0F",X"1F",X"01",X"01",X"01",X"22",X"00",X"01",X"0F",X"1F",X"FF",X"01",X"01",X"22",X"00", + X"01",X"01",X"2F",X"01",X"01",X"01",X"22",X"00",X"01",X"01",X"2F",X"FF",X"01",X"01",X"22",X"00", + X"01",X"16",X"3F",X"01",X"04",X"04",X"03",X"00",X"01",X"08",X"3F",X"FF",X"04",X"04",X"03",X"00", + X"01",X"16",X"3F",X"01",X"04",X"04",X"03",X"00",X"01",X"08",X"3F",X"FF",X"04",X"04",X"03",X"00", + X"01",X"16",X"1F",X"01",X"04",X"04",X"07",X"00",X"01",X"08",X"1F",X"FF",X"04",X"04",X"07",X"00", + X"01",X"16",X"1F",X"01",X"04",X"04",X"07",X"00",X"01",X"08",X"1F",X"FF",X"04",X"04",X"07",X"00", + X"01",X"16",X"7F",X"01",X"01",X"01",X"04",X"00",X"01",X"08",X"7F",X"FF",X"01",X"01",X"04",X"00", + X"01",X"16",X"7F",X"01",X"01",X"01",X"04",X"00",X"01",X"08",X"7F",X"FF",X"01",X"01",X"04",X"00", + X"01",X"16",X"7F",X"01",X"02",X"01",X"04",X"00",X"01",X"08",X"7F",X"FF",X"02",X"01",X"04",X"00", + X"01",X"16",X"7F",X"01",X"02",X"01",X"04",X"00",X"01",X"08",X"7F",X"FF",X"02",X"01",X"04",X"00", + X"01",X"16",X"7F",X"01",X"03",X"01",X"04",X"00",X"01",X"08",X"7F",X"FF",X"03",X"01",X"04",X"00", + X"01",X"16",X"7F",X"01",X"03",X"01",X"04",X"00",X"01",X"08",X"7F",X"FF",X"03",X"01",X"04",X"00", + X"01",X"08",X"1D",X"01",X"02",X"02",X"00",X"00",X"01",X"08",X"1D",X"FF",X"02",X"02",X"00",X"00", + X"01",X"16",X"1D",X"01",X"02",X"02",X"00",X"00",X"01",X"08",X"1D",X"FF",X"02",X"02",X"00",X"00", + X"01",X"16",X"1D",X"01",X"03",X"02",X"00",X"00",X"01",X"08",X"1D",X"FF",X"03",X"02",X"00",X"00", + X"01",X"16",X"1D",X"01",X"03",X"02",X"00",X"00",X"01",X"08",X"1D",X"FF",X"03",X"02",X"00",X"00", + X"01",X"16",X"1D",X"01",X"04",X"03",X"00",X"00",X"01",X"08",X"1D",X"FF",X"04",X"03",X"00",X"00", + X"01",X"16",X"1D",X"01",X"04",X"03",X"00",X"00",X"01",X"08",X"1D",X"FF",X"04",X"03",X"00",X"00", + X"01",X"16",X"1D",X"01",X"05",X"03",X"00",X"00",X"01",X"08",X"1D",X"FF",X"05",X"03",X"00",X"00", + X"01",X"16",X"1D",X"01",X"05",X"03",X"00",X"00",X"01",X"08",X"1D",X"FF",X"05",X"03",X"00",X"00", + X"01",X"16",X"0F",X"01",X"01",X"01",X"06",X"00",X"01",X"08",X"0F",X"FF",X"01",X"01",X"06",X"00", + X"01",X"16",X"0F",X"01",X"02",X"01",X"06",X"00",X"01",X"08",X"0F",X"FF",X"02",X"01",X"06",X"00", + X"01",X"16",X"0F",X"01",X"02",X"02",X"07",X"00",X"01",X"08",X"0F",X"FF",X"02",X"02",X"07",X"00", + X"01",X"16",X"0F",X"01",X"04",X"02",X"07",X"00",X"01",X"08",X"0F",X"FF",X"04",X"02",X"07",X"00", + X"01",X"16",X"0F",X"01",X"01",X"02",X"06",X"00",X"01",X"08",X"0F",X"FF",X"01",X"02",X"06",X"00", + X"01",X"16",X"0F",X"01",X"01",X"03",X"06",X"00",X"01",X"08",X"0F",X"FF",X"01",X"03",X"06",X"00", + X"01",X"16",X"0F",X"01",X"02",X"04",X"07",X"00",X"01",X"08",X"0F",X"FF",X"02",X"04",X"07",X"00", + X"01",X"16",X"0F",X"01",X"02",X"06",X"07",X"00",X"01",X"08",X"0F",X"FF",X"02",X"06",X"07",X"00", + X"01",X"0F",X"09",X"01",X"01",X"01",X"00",X"00",X"01",X"0F",X"09",X"01",X"01",X"01",X"00",X"00", + X"02",X"04",X"08",X"01",X"02",X"02",X"60",X"00",X"02",X"1A",X"08",X"FF",X"02",X"02",X"60",X"00", + X"01",X"19",X"11",X"01",X"03",X"03",X"00",X"00",X"01",X"0F",X"07",X"01",X"01",X"01",X"00",X"00", + X"01",X"08",X"15",X"FF",X"03",X"03",X"00",X"00",X"01",X"01",X"07",X"FF",X"01",X"01",X"00",X"00", + X"01",X"16",X"1F",X"01",X"02",X"03",X"54",X"00",X"01",X"16",X"1F",X"01",X"01",X"03",X"54",X"00", + X"01",X"16",X"1F",X"01",X"01",X"01",X"54",X"00",X"01",X"16",X"1F",X"01",X"02",X"03",X"54",X"00", + X"01",X"16",X"1F",X"01",X"02",X"04",X"54",X"00",X"01",X"16",X"1F",X"01",X"01",X"04",X"54",X"00", + X"01",X"16",X"1F",X"01",X"02",X"02",X"54",X"00",X"01",X"16",X"1F",X"01",X"01",X"02",X"54",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"3A",X"3B",X"42",X"FE",X"04",X"DA",X"12",X"20",X"CD",X"DD",X"23",X"CD",X"20",X"20",X"CD", + X"6B",X"21",X"3A",X"3B",X"42",X"FE",X"03",X"C2",X"1D",X"20",X"CD",X"50",X"22",X"CD",X"10",X"03", + X"00",X"11",X"14",X"00",X"01",X"04",X"04",X"DD",X"21",X"40",X"41",X"DD",X"7E",X"00",X"FE",X"01", + X"C2",X"7B",X"20",X"FD",X"21",X"82",X"41",X"26",X"08",X"2E",X"01",X"FD",X"7E",X"00",X"B7",X"CA", + X"75",X"20",X"DD",X"7E",X"04",X"D6",X"0E",X"80",X"FD",X"BE",X"04",X"D2",X"75",X"20",X"DD",X"7E", + X"04",X"C6",X"0F",X"90",X"FD",X"BE",X"04",X"DA",X"75",X"20",X"DD",X"7E",X"03",X"D6",X"08",X"81", + X"FD",X"BE",X"03",X"D2",X"75",X"20",X"DD",X"7E",X"03",X"C6",X"10",X"91",X"FD",X"BE",X"03",X"DA", + X"75",X"20",X"C3",X"24",X"21",X"FD",X"19",X"25",X"C2",X"3B",X"20",X"DD",X"21",X"45",X"41",X"DD", + X"7E",X"00",X"FE",X"01",X"C2",X"CF",X"20",X"FD",X"21",X"82",X"41",X"26",X"08",X"2E",X"02",X"FD", + X"7E",X"00",X"B7",X"CA",X"C9",X"20",X"DD",X"7E",X"04",X"D6",X"0A",X"80",X"FD",X"BE",X"04",X"D2", + X"C9",X"20",X"DD",X"7E",X"04",X"C6",X"1B",X"90",X"FD",X"BE",X"04",X"DA",X"C9",X"20",X"DD",X"7E", + X"03",X"D6",X"08",X"81",X"FD",X"BE",X"03",X"D2",X"C9",X"20",X"DD",X"7E",X"03",X"C6",X"10",X"91", + X"FD",X"BE",X"03",X"DA",X"C9",X"20",X"C3",X"24",X"21",X"FD",X"19",X"25",X"C2",X"8F",X"20",X"DD", + X"21",X"4A",X"41",X"DD",X"7E",X"00",X"FE",X"01",X"C2",X"23",X"21",X"FD",X"21",X"82",X"41",X"26", + X"08",X"2E",X"03",X"FD",X"7E",X"00",X"B7",X"CA",X"1D",X"21",X"DD",X"7E",X"04",X"D6",X"0F",X"80", + X"FD",X"BE",X"04",X"D2",X"1D",X"21",X"DD",X"7E",X"04",X"C6",X"20",X"90",X"FD",X"BE",X"04",X"DA", + X"1D",X"21",X"DD",X"7E",X"03",X"D6",X"10",X"81",X"FD",X"BE",X"03",X"D2",X"1D",X"21",X"DD",X"7E", + X"03",X"C6",X"10",X"91",X"FD",X"BE",X"03",X"DA",X"1D",X"21",X"C3",X"24",X"21",X"FD",X"19",X"25", + X"C2",X"E3",X"20",X"C9",X"3E",X"01",X"32",X"04",X"40",X"FD",X"36",X"02",X"00",X"7D",X"CD",X"0A", + X"27",X"3A",X"40",X"41",X"FE",X"01",X"C2",X"3E",X"21",X"3E",X"03",X"32",X"40",X"41",X"3A",X"45", + X"41",X"FE",X"01",X"C2",X"4B",X"21",X"3E",X"03",X"32",X"45",X"41",X"3A",X"4A",X"41",X"FE",X"01", + X"C2",X"58",X"21",X"3E",X"03",X"32",X"4A",X"41",X"00",X"AF",X"32",X"28",X"42",X"32",X"29",X"42", + X"3A",X"3C",X"42",X"32",X"4E",X"42",X"AF",X"32",X"04",X"40",X"C9",X"C9",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"21",X"45",X"41",X"DD",X"7E",X"00", + X"FE",X"01",X"C2",X"FF",X"21",X"FD",X"7E",X"00",X"B7",X"CA",X"FF",X"21",X"DD",X"7E",X"04",X"C6", + X"06",X"80",X"FD",X"BE",X"04",X"D2",X"FF",X"21",X"DD",X"7E",X"04",X"C6",X"1B",X"90",X"FD",X"BE", + X"04",X"DA",X"FF",X"21",X"DD",X"7E",X"03",X"C6",X"04",X"81",X"FD",X"BE",X"03",X"D2",X"FF",X"21", + X"DD",X"7E",X"03",X"C6",X"10",X"91",X"FD",X"BE",X"03",X"DA",X"FF",X"21",X"C3",X"46",X"22",X"DD", + X"21",X"4A",X"41",X"DD",X"7E",X"00",X"FE",X"01",X"C2",X"45",X"22",X"FD",X"7E",X"00",X"B7",X"CA", + X"45",X"22",X"DD",X"7E",X"04",X"C6",X"01",X"80",X"FD",X"BE",X"04",X"D2",X"45",X"22",X"DD",X"7E", + X"04",X"C6",X"20",X"90",X"FD",X"BE",X"04",X"DA",X"45",X"22",X"DD",X"7E",X"03",X"D6",X"04",X"81", + X"FD",X"BE",X"03",X"D2",X"45",X"22",X"DD",X"7E",X"03",X"C6",X"10",X"91",X"FD",X"BE",X"03",X"DA", + X"45",X"22",X"C3",X"46",X"22",X"C9",X"AF",X"32",X"4D",X"42",X"3E",X"FF",X"32",X"2D",X"42",X"C9", + X"3A",X"4A",X"41",X"FE",X"01",X"CA",X"DC",X"23",X"3A",X"45",X"41",X"FE",X"01",X"CA",X"6B",X"22", + X"3A",X"40",X"41",X"FE",X"01",X"CA",X"76",X"22",X"C3",X"DC",X"23",X"3A",X"4A",X"41",X"FE",X"02", + X"CA",X"EF",X"22",X"C3",X"DC",X"23",X"3A",X"45",X"41",X"FE",X"02",X"CA",X"89",X"22",X"3A",X"4A", + X"41",X"FE",X"02",X"CA",X"7C",X"23",X"C3",X"DC",X"23",X"06",X"06",X"0E",X"1B",X"16",X"02",X"1E", + X"0F",X"26",X"0A",X"2E",X"0A",X"DD",X"21",X"45",X"41",X"FD",X"21",X"40",X"41",X"CD",X"40",X"25", + X"B7",X"C2",X"BA",X"22",X"06",X"0D",X"0E",X"13",X"16",X"05",X"1E",X"0B",X"26",X"08",X"2E",X"10", + X"CD",X"FC",X"24",X"B7",X"C2",X"D2",X"22",X"C3",X"DC",X"23",X"AF",X"32",X"40",X"41",X"3A",X"97", + X"40",X"3D",X"32",X"97",X"40",X"3E",X"01",X"CD",X"84",X"25",X"3E",X"01",X"32",X"45",X"41",X"C3", + X"DC",X"23",X"3E",X"01",X"32",X"45",X"41",X"3A",X"48",X"41",X"D6",X"08",X"32",X"43",X"41",X"3A", + X"49",X"41",X"C6",X"08",X"32",X"44",X"41",X"3E",X"01",X"CD",X"E5",X"25",X"C3",X"DC",X"23",X"06", + X"01",X"0E",X"20",X"16",X"06",X"1E",X"1B",X"26",X"02",X"2E",X"0A",X"DD",X"21",X"4A",X"41",X"FD", + X"21",X"45",X"41",X"CD",X"40",X"25",X"B7",X"C2",X"20",X"23",X"06",X"0D",X"0E",X"13",X"16",X"0D", + X"1E",X"13",X"26",X"00",X"2E",X"10",X"CD",X"FC",X"24",X"B7",X"C2",X"4A",X"23",X"C3",X"DC",X"23", + X"3A",X"40",X"41",X"FE",X"01",X"C2",X"2F",X"23",X"3A",X"97",X"40",X"3D",X"32",X"97",X"40",X"AF", + X"32",X"40",X"41",X"32",X"45",X"41",X"3A",X"97",X"40",X"3D",X"32",X"97",X"40",X"3E",X"02",X"CD", + X"84",X"25",X"3E",X"01",X"32",X"4A",X"41",X"C3",X"DC",X"23",X"3E",X"01",X"32",X"4A",X"41",X"3A", + X"4D",X"41",X"D6",X"10",X"32",X"48",X"41",X"D6",X"08",X"32",X"43",X"41",X"3A",X"4E",X"41",X"32", + X"49",X"41",X"C6",X"08",X"32",X"44",X"41",X"3A",X"40",X"41",X"FE",X"01",X"CA",X"74",X"23",X"3E", + X"02",X"C3",X"76",X"23",X"3E",X"03",X"CD",X"E5",X"25",X"C3",X"DC",X"23",X"06",X"01",X"0E",X"20", + X"16",X"02",X"1E",X"0F",X"26",X"02",X"2E",X"0A",X"DD",X"21",X"4A",X"41",X"FD",X"21",X"40",X"41", + X"CD",X"40",X"25",X"B7",X"C2",X"C7",X"23",X"06",X"0D",X"0E",X"13",X"16",X"05",X"1E",X"0B",X"26", + X"00",X"2E",X"10",X"CD",X"FC",X"24",X"B7",X"CA",X"DC",X"23",X"3E",X"01",X"32",X"4A",X"41",X"3A", + X"4D",X"41",X"D6",X"10",X"32",X"43",X"41",X"3A",X"4E",X"41",X"C6",X"08",X"32",X"44",X"41",X"3E", + X"02",X"CD",X"E5",X"25",X"C3",X"DC",X"23",X"AF",X"32",X"40",X"41",X"3A",X"97",X"40",X"3D",X"32", + X"97",X"40",X"3E",X"01",X"CD",X"84",X"25",X"3E",X"01",X"32",X"4A",X"41",X"C9",X"00",X"26",X"05", + X"DD",X"21",X"59",X"41",X"2E",X"08",X"FD",X"21",X"82",X"41",X"11",X"14",X"00",X"DD",X"7E",X"00", + X"B7",X"CA",X"44",X"24",X"FD",X"7E",X"00",X"B7",X"CA",X"3E",X"24",X"3A",X"3A",X"42",X"FE",X"04", + X"CA",X"17",X"24",X"DD",X"7E",X"04",X"FD",X"BE",X"04",X"DA",X"3E",X"24",X"D6",X"10",X"FD",X"BE", + X"04",X"D2",X"3E",X"24",X"C3",X"2A",X"24",X"DD",X"7E",X"04",X"D6",X"04",X"FD",X"BE",X"04",X"DA", + X"3E",X"24",X"D6",X"08",X"FD",X"BE",X"04",X"D2",X"3E",X"24",X"DD",X"7E",X"03",X"FD",X"BE",X"03", + X"DA",X"3E",X"24",X"D6",X"0C",X"FD",X"BE",X"03",X"D2",X"3E",X"24",X"C3",X"4E",X"24",X"FD",X"19", + X"2D",X"C2",X"F4",X"23",X"11",X"05",X"00",X"DD",X"19",X"25",X"C2",X"E4",X"23",X"C9",X"DD",X"36", + X"04",X"00",X"FD",X"7E",X"05",X"FE",X"03",X"C2",X"61",X"24",X"3A",X"3E",X"42",X"3D",X"32",X"3E", + X"42",X"3A",X"3A",X"42",X"C6",X"05",X"CD",X"92",X"08",X"3A",X"3A",X"42",X"B7",X"C2",X"7E",X"24", + X"7D",X"E6",X"01",X"C2",X"7E",X"24",X"FD",X"36",X"19",X"02",X"FD",X"36",X"1B",X"00",X"3A",X"3A", + X"42",X"FE",X"03",X"CA",X"B9",X"24",X"3E",X"08",X"95",X"CD",X"3A",X"28",X"01",X"00",X"01",X"3A", + X"3A",X"42",X"FE",X"00",X"CA",X"A7",X"24",X"FE",X"01",X"CA",X"AD",X"24",X"FE",X"02",X"CA",X"B3", + X"24",X"01",X"00",X"01",X"C3",X"C2",X"24",X"01",X"50",X"00",X"C3",X"C2",X"24",X"01",X"60",X"00", + X"C3",X"C2",X"24",X"01",X"30",X"00",X"C3",X"C2",X"24",X"3E",X"08",X"95",X"CD",X"BB",X"28",X"01", + X"00",X"02",X"CD",X"C9",X"24",X"CD",X"E8",X"26",X"C9",X"00",X"3A",X"35",X"40",X"B7",X"C8",X"21", + X"9A",X"40",X"79",X"86",X"27",X"77",X"2B",X"78",X"8E",X"27",X"77",X"2B",X"3E",X"00",X"8E",X"27", + X"77",X"47",X"3A",X"3D",X"40",X"B8",X"C0",X"3A",X"9E",X"40",X"B7",X"C0",X"3A",X"9D",X"40",X"B7", + X"C0",X"3E",X"10",X"CD",X"92",X"08",X"3E",X"01",X"32",X"9D",X"40",X"C9",X"00",X"DD",X"7E",X"00", + X"FE",X"02",X"C2",X"3E",X"25",X"FD",X"7E",X"00",X"FE",X"01",X"C2",X"3E",X"25",X"DD",X"7E",X"04", + X"80",X"93",X"FD",X"BE",X"04",X"D2",X"3E",X"25",X"DD",X"7E",X"04",X"81",X"92",X"FD",X"BE",X"04", + X"DA",X"3E",X"25",X"DD",X"7E",X"03",X"84",X"D6",X"0F",X"FD",X"BE",X"03",X"D2",X"3E",X"25",X"DD", + X"7E",X"03",X"C6",X"11",X"95",X"FD",X"BE",X"03",X"DA",X"3E",X"25",X"3E",X"01",X"C9",X"AF",X"C9", + X"00",X"DD",X"7E",X"00",X"FE",X"02",X"C2",X"82",X"25",X"FD",X"7E",X"00",X"FE",X"01",X"C2",X"82", + X"25",X"DD",X"7E",X"04",X"80",X"93",X"FD",X"BE",X"04",X"D2",X"82",X"25",X"DD",X"7E",X"04",X"81", + X"92",X"FD",X"BE",X"04",X"DA",X"82",X"25",X"DD",X"7E",X"03",X"84",X"D6",X"0E",X"FD",X"BE",X"03", + X"D2",X"82",X"25",X"DD",X"7E",X"03",X"C6",X"0E",X"95",X"FD",X"BE",X"03",X"DA",X"82",X"25",X"3E", + X"01",X"C9",X"AF",X"C9",X"00",X"F5",X"3E",X"01",X"32",X"04",X"40",X"F1",X"CD",X"0A",X"27",X"3E", + X"0C",X"CD",X"92",X"08",X"11",X"CD",X"25",X"CD",X"80",X"09",X"C3",X"70",X"29",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"3E",X"06",X"CD",X"C3",X"2A",X"3E",X"08",X"CD",X"C3",X"2A",X"3E",X"17", + X"CD",X"C3",X"2A",X"AF",X"32",X"28",X"42",X"32",X"29",X"42",X"3A",X"9B",X"40",X"3C",X"32",X"9B", + X"40",X"AF",X"32",X"26",X"42",X"32",X"27",X"42",X"AF",X"32",X"04",X"40",X"C9",X"0C",X"06",X"07", + X"1C",X"18",X"1B",X"1B",X"22",X"24",X"17",X"18",X"24",X"0B",X"18",X"17",X"1E",X"1C",X"24",X"24", + X"24",X"24",X"24",X"24",X"FF",X"00",X"32",X"32",X"42",X"3E",X"01",X"32",X"04",X"40",X"3A",X"40", + X"41",X"FE",X"01",X"C2",X"FB",X"25",X"3E",X"01",X"CD",X"87",X"34",X"3A",X"45",X"41",X"FE",X"01", + X"C2",X"08",X"26",X"3E",X"02",X"CD",X"87",X"34",X"3A",X"4A",X"41",X"FE",X"01",X"C2",X"15",X"26", + X"3E",X"03",X"CD",X"87",X"34",X"00",X"3E",X"0B",X"CD",X"92",X"08",X"11",X"AD",X"26",X"CD",X"80", + X"09",X"11",X"BB",X"26",X"CD",X"80",X"09",X"11",X"CF",X"26",X"CD",X"80",X"09",X"11",X"DB",X"26", + X"CD",X"DD",X"09",X"3A",X"30",X"42",X"B7",X"CA",X"55",X"26",X"47",X"3A",X"32",X"42",X"4F",X"AF", + X"32",X"32",X"42",X"3A",X"32",X"42",X"81",X"27",X"32",X"32",X"42",X"78",X"3D",X"27",X"47",X"C2", + X"43",X"26",X"C3",X"59",X"26",X"AF",X"32",X"32",X"42",X"11",X"E1",X"26",X"CD",X"DD",X"09",X"3E", + X"FF",X"CD",X"B2",X"02",X"3E",X"FF",X"CD",X"B2",X"02",X"3E",X"FF",X"CD",X"B2",X"02",X"3E",X"FF", + X"CD",X"B2",X"02",X"3E",X"FF",X"CD",X"B2",X"02",X"3E",X"06",X"CD",X"C3",X"2A",X"3E",X"08",X"CD", + X"C3",X"2A",X"3E",X"17",X"CD",X"C3",X"2A",X"3A",X"32",X"42",X"47",X"0E",X"00",X"CD",X"C9",X"24", + X"CD",X"E8",X"26",X"3A",X"9B",X"40",X"3C",X"32",X"9B",X"40",X"AF",X"32",X"26",X"42",X"32",X"27", + X"42",X"AF",X"32",X"28",X"42",X"32",X"29",X"42",X"AF",X"32",X"04",X"40",X"C9",X"02",X"17",X"09", + X"1B",X"12",X"10",X"11",X"1D",X"24",X"18",X"17",X"24",X"28",X"FF",X"04",X"06",X"07",X"0D",X"18", + X"0C",X"14",X"12",X"17",X"10",X"24",X"0B",X"18",X"17",X"1E",X"1C",X"24",X"24",X"24",X"FF",X"04", + X"08",X"0C",X"24",X"2A",X"24",X"24",X"24",X"24",X"24",X"2E",X"FF",X"04",X"08",X"0F",X"32",X"42", + X"03",X"04",X"08",X"15",X"32",X"42",X"04",X"C9",X"00",X"3A",X"40",X"40",X"B7",X"C2",X"F7",X"26", + X"11",X"FE",X"26",X"CD",X"DD",X"09",X"C9",X"11",X"04",X"27",X"CD",X"DD",X"09",X"C9",X"07",X"01", + X"00",X"98",X"40",X"06",X"07",X"01",X"16",X"98",X"40",X"06",X"00",X"3D",X"CA",X"17",X"27",X"3D", + X"CA",X"2A",X"27",X"3D",X"CA",X"35",X"27",X"DD",X"21",X"40",X"41",X"DD",X"7E",X"04",X"D6",X"08", + X"DD",X"77",X"04",X"FD",X"21",X"40",X"58",X"C3",X"3D",X"27",X"DD",X"21",X"45",X"41",X"FD",X"21", + X"44",X"58",X"C3",X"3D",X"27",X"DD",X"21",X"4A",X"41",X"FD",X"21",X"4C",X"58",X"CD",X"50",X"29", + X"AF",X"32",X"4F",X"41",X"32",X"59",X"41",X"32",X"5E",X"41",X"32",X"63",X"41",X"32",X"68",X"41", + X"32",X"6D",X"41",X"CD",X"21",X"28",X"CD",X"10",X"28",X"3E",X"01",X"CD",X"32",X"09",X"3A",X"4D", + X"42",X"FE",X"01",X"CA",X"6A",X"27",X"FD",X"21",X"50",X"58",X"DD",X"7E",X"03",X"D6",X"08",X"DD", + X"77",X"03",X"DD",X"36",X"00",X"00",X"21",X"FC",X"27",X"06",X"05",X"00",X"FD",X"21",X"50",X"58", + X"DD",X"7E",X"04",X"FD",X"77",X"00",X"7E",X"FD",X"77",X"01",X"FD",X"36",X"02",X"0C",X"DD",X"7E", + X"03",X"FD",X"77",X"03",X"FD",X"21",X"54",X"58",X"DD",X"7E",X"04",X"C6",X"10",X"FD",X"77",X"00", + X"23",X"7E",X"FD",X"77",X"01",X"FD",X"36",X"02",X"0C",X"DD",X"7E",X"03",X"FD",X"77",X"03",X"FD", + X"21",X"58",X"58",X"DD",X"7E",X"04",X"FD",X"77",X"00",X"23",X"7E",X"FD",X"77",X"01",X"FD",X"36", + X"02",X"0C",X"DD",X"7E",X"03",X"C6",X"10",X"FD",X"77",X"03",X"FD",X"21",X"5C",X"58",X"DD",X"7E", + X"04",X"C6",X"10",X"FD",X"77",X"00",X"23",X"7E",X"FD",X"77",X"01",X"FD",X"36",X"02",X"0C",X"23", + X"DD",X"7E",X"03",X"C6",X"10",X"FD",X"77",X"03",X"3E",X"20",X"CD",X"B2",X"02",X"05",X"C2",X"7B", + X"27",X"3E",X"FF",X"CD",X"B2",X"02",X"3E",X"FF",X"CD",X"B2",X"02",X"C9",X"31",X"30",X"39",X"38", + X"33",X"32",X"3B",X"3A",X"35",X"34",X"3D",X"3C",X"37",X"36",X"3F",X"3E",X"09",X"09",X"09",X"09", + X"00",X"21",X"40",X"58",X"06",X"08",X"23",X"36",X"09",X"23",X"23",X"23",X"05",X"C2",X"16",X"28", + X"C9",X"00",X"21",X"00",X"50",X"06",X"20",X"11",X"03",X"00",X"0E",X"1C",X"19",X"36",X"24",X"23", + X"0D",X"C2",X"2D",X"28",X"23",X"05",X"C2",X"2A",X"28",X"C9",X"00",X"4F",X"DD",X"21",X"40",X"58", + X"07",X"07",X"E6",X"1C",X"5F",X"16",X"00",X"DD",X"19",X"CD",X"50",X"29",X"FD",X"36",X"00",X"00", + X"FD",X"7E",X"04",X"DD",X"77",X"00",X"FD",X"7E",X"03",X"DD",X"77",X"03",X"DD",X"36",X"02",X"0C", + X"DD",X"36",X"01",X"1C",X"06",X"03",X"3E",X"08",X"CD",X"B2",X"02",X"DD",X"34",X"01",X"05",X"C2", + X"66",X"28",X"3E",X"08",X"CD",X"B2",X"02",X"DD",X"36",X"01",X"09",X"3A",X"3C",X"42",X"3D",X"32", + X"3C",X"42",X"3A",X"3A",X"42",X"FE",X"04",X"C0",X"21",X"40",X"58",X"06",X"08",X"23",X"36",X"09", + X"23",X"23",X"23",X"05",X"C2",X"8D",X"28",X"06",X"08",X"DD",X"21",X"82",X"41",X"11",X"14",X"00", + X"DD",X"7E",X"00",X"B7",X"CA",X"B4",X"28",X"DD",X"7E",X"13",X"B7",X"C2",X"B4",X"28",X"79",X"2F", + X"DD",X"77",X"13",X"C9",X"DD",X"19",X"05",X"C2",X"A0",X"28",X"C9",X"00",X"DD",X"21",X"40",X"58", + X"FE",X"04",X"DA",X"C9",X"28",X"DD",X"21",X"50",X"58",X"CD",X"50",X"29",X"DD",X"36",X"02",X"0C", + X"DD",X"36",X"06",X"0C",X"DD",X"36",X"0A",X"0C",X"DD",X"36",X"0E",X"0C",X"FD",X"36",X"00",X"00", + X"06",X"08",X"3E",X"08",X"90",X"C6",X"20",X"DD",X"77",X"01",X"F6",X"40",X"DD",X"77",X"05",X"E6", + X"3F",X"F6",X"80",X"DD",X"77",X"09",X"F6",X"C0",X"DD",X"77",X"0D",X"3E",X"08",X"90",X"4F",X"FD", + X"7E",X"04",X"C6",X"08",X"81",X"DD",X"77",X"00",X"DD",X"77",X"04",X"FD",X"7E",X"04",X"D6",X"08", + X"91",X"DD",X"77",X"08",X"DD",X"77",X"0C",X"FD",X"7E",X"03",X"C6",X"08",X"81",X"DD",X"77",X"07", + X"DD",X"77",X"0F",X"91",X"FD",X"7E",X"03",X"D6",X"08",X"DD",X"77",X"03",X"DD",X"77",X"0B",X"3E", + X"08",X"CD",X"B2",X"02",X"05",X"C2",X"E2",X"28",X"DD",X"36",X"01",X"09",X"DD",X"36",X"05",X"09", + X"DD",X"36",X"09",X"09",X"DD",X"36",X"0D",X"09",X"3A",X"3C",X"42",X"3D",X"32",X"3C",X"42",X"C9", + X"00",X"E5",X"C5",X"06",X"20",X"21",X"60",X"58",X"36",X"00",X"23",X"05",X"C2",X"58",X"29",X"C1", + X"E1",X"C9",X"E6",X"40",X"28",X"03",X"3E",X"FF",X"C9",X"3A",X"39",X"BC",X"A7",X"C8",X"97",X"37", + X"3E",X"FF",X"CD",X"B2",X"02",X"3E",X"FF",X"CD",X"B2",X"02",X"3E",X"FF",X"CD",X"B2",X"02",X"00", + X"3E",X"FF",X"CD",X"B2",X"02",X"3E",X"FF",X"CD",X"B2",X"02",X"C3",X"A4",X"25",X"39",X"BC",X"A7", + X"20",X"06",X"CD",X"9C",X"BB",X"28",X"04",X"C9",X"2A",X"3A",X"BC",X"3E",X"FF",X"32",X"39",X"BC", + X"7E",X"F5",X"23",X"22",X"3A",X"BC",X"7E",X"D6",X"FF",X"20",X"03",X"32",X"39",X"BC",X"F1",X"C9", + X"CD",X"5D",X"BB",X"FE",X"02",X"C0",X"32",X"3C",X"BC",X"32",X"3D",X"BC",X"CD",X"29",X"BC",X"20", + X"16",X"3E",X"0D",X"32",X"3F",X"BC",X"CD",X"24",X"BC",X"32",X"3E",X"BC",X"3E",X"02",X"20",X"02", + X"A7",X"C9",X"CD",X"49",X"BC",X"18",X"0F",X"FE",X"02",X"C0",X"CD",X"5D",X"BB",X"32",X"3E",X"BC", + X"CD",X"5D",X"BB",X"32",X"3F",X"BC",X"21",X"40",X"1F",X"2D",X"20",X"FD",X"25",X"20",X"FA",X"21", + X"3C",X"BC",X"3A",X"9D",X"BC",X"A7",X"C8",X"3A",X"3E",X"BC",X"47",X"21",X"03",X"BC",X"11",X"0C", + X"00",X"DD",X"21",X"98",X"40",X"FD",X"21",X"42",X"40",X"26",X"05",X"2E",X"00",X"DD",X"7E",X"00", + X"FD",X"96",X"00",X"DA",X"34",X"2A",X"C2",X"40",X"2A",X"DD",X"7E",X"01",X"FD",X"96",X"01",X"DA", + X"34",X"2A",X"C2",X"40",X"2A",X"DD",X"7E",X"02",X"FD",X"96",X"02",X"DA",X"34",X"2A",X"CA",X"34", + X"2A",X"C3",X"40",X"2A",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"2C",X"25",X"C2",X"0D",X"2A",X"C9", + X"7D",X"32",X"EE",X"40",X"CD",X"DE",X"2A",X"C9",X"00",X"F5",X"C5",X"D5",X"E5",X"D5",X"DD",X"E1", + X"DD",X"7E",X"01",X"87",X"06",X"00",X"4F",X"FD",X"21",X"00",X"58",X"FD",X"09",X"DD",X"56",X"02", + X"3E",X"1C",X"92",X"87",X"87",X"87",X"FD",X"77",X"00",X"DD",X"7E",X"00",X"FD",X"77",X"01",X"DD", + X"46",X"02",X"3E",X"1B",X"90",X"B7",X"CA",X"84",X"2A",X"21",X"40",X"50",X"01",X"20",X"00",X"09", + X"3D",X"C2",X"7F",X"2A",X"DD",X"4E",X"01",X"06",X"00",X"09",X"11",X"E0",X"FF",X"DD",X"23",X"DD", + X"23",X"DD",X"23",X"DD",X"7E",X"00",X"FE",X"FF",X"CA",X"B0",X"2A",X"77",X"19",X"06",X"08",X"FD", + X"35",X"00",X"3E",X"03",X"CD",X"B2",X"02",X"05",X"C2",X"9F",X"2A",X"DD",X"23",X"C3",X"93",X"2A", + X"FD",X"35",X"00",X"CA",X"BE",X"2A",X"3E",X"03",X"CD",X"B2",X"02",X"C3",X"B0",X"2A",X"E1",X"D1", + X"C1",X"F1",X"C9",X"00",X"C5",X"D5",X"E5",X"21",X"00",X"50",X"5F",X"16",X"00",X"19",X"11",X"20", + X"00",X"06",X"20",X"36",X"24",X"19",X"05",X"C2",X"D3",X"2A",X"E1",X"D1",X"C1",X"C9",X"00",X"CD", + X"6F",X"2D",X"CD",X"99",X"2E",X"3E",X"60",X"32",X"30",X"42",X"3E",X"10",X"32",X"31",X"42",X"11", + X"52",X"2D",X"CD",X"80",X"09",X"11",X"5E",X"2D",X"CD",X"80",X"09",X"11",X"63",X"2D",X"CD",X"DD", + X"09",X"11",X"69",X"2D",X"CD",X"DD",X"09",X"AF",X"32",X"EB",X"40",X"AF",X"32",X"EC",X"40",X"3A", + X"40",X"40",X"B7",X"C2",X"1C",X"2B",X"3A",X"00",X"60",X"C3",X"1F",X"2B",X"3A",X"00",X"68",X"32", + X"2E",X"42",X"E6",X"04",X"C2",X"3A",X"2B",X"3A",X"2E",X"42",X"E6",X"08",X"C2",X"48",X"2B",X"3A", + X"2E",X"42",X"E6",X"10",X"C2",X"C3",X"2B",X"C3",X"57",X"2B",X"3A",X"EB",X"40",X"B7",X"CA",X"40", + X"2C",X"3D",X"32",X"EB",X"40",X"C3",X"57",X"2B",X"3A",X"EB",X"40",X"FE",X"1C",X"CA",X"40",X"2C", + X"3C",X"32",X"EB",X"40",X"C3",X"57",X"2B",X"DD",X"21",X"40",X"58",X"21",X"89",X"2B",X"3A",X"EB", + X"40",X"07",X"E6",X"FE",X"5F",X"16",X"00",X"19",X"7E",X"DD",X"77",X"00",X"23",X"7E",X"DD",X"77", + X"03",X"DD",X"36",X"01",X"20",X"DD",X"36",X"02",X"02",X"3A",X"40",X"40",X"B7",X"CA",X"40",X"2C", + X"DD",X"35",X"00",X"DD",X"35",X"00",X"C3",X"40",X"2C",X"35",X"9C",X"45",X"9C",X"55",X"9C",X"65", + X"9C",X"75",X"9C",X"85",X"9C",X"95",X"9C",X"A5",X"9C",X"B5",X"9C",X"35",X"AC",X"45",X"AC",X"55", + X"AC",X"65",X"AC",X"75",X"AC",X"85",X"AC",X"95",X"AC",X"A5",X"AC",X"B5",X"AC",X"C9",X"AC",X"35", + X"BC",X"45",X"BC",X"55",X"BC",X"65",X"BC",X"75",X"BC",X"85",X"BC",X"95",X"BC",X"A5",X"BC",X"B5", + X"BC",X"C7",X"BC",X"3A",X"EB",X"40",X"FE",X"1C",X"CA",X"84",X"2C",X"FE",X"12",X"CA",X"06",X"2C", + X"FE",X"12",X"DA",X"DF",X"2B",X"FE",X"1B",X"CA",X"E4",X"2B",X"C6",X"09",X"C3",X"E6",X"2B",X"C6", + X"0A",X"C3",X"E6",X"2B",X"3E",X"2C",X"32",X"ED",X"40",X"3A",X"EC",X"40",X"FE",X"0B",X"D2",X"40", + X"2C",X"21",X"E0",X"40",X"5F",X"16",X"00",X"19",X"3A",X"ED",X"40",X"77",X"3A",X"EC",X"40",X"3C", + X"32",X"EC",X"40",X"C3",X"21",X"2C",X"3E",X"24",X"32",X"ED",X"40",X"3A",X"EC",X"40",X"B7",X"CA", + X"40",X"2C",X"3D",X"32",X"EC",X"40",X"21",X"E0",X"40",X"5F",X"16",X"00",X"19",X"3A",X"ED",X"40", + X"77",X"DD",X"21",X"DD",X"40",X"DD",X"36",X"00",X"06",X"DD",X"36",X"01",X"12",X"DD",X"36",X"02", + X"0B",X"DD",X"36",X"0D",X"FF",X"11",X"DD",X"40",X"CD",X"80",X"09",X"3E",X"50",X"CD",X"B2",X"02", + X"3E",X"30",X"CD",X"B2",X"02",X"21",X"31",X"42",X"7E",X"D6",X"01",X"27",X"77",X"C2",X"58",X"2C", + X"36",X"10",X"2B",X"7E",X"D6",X"01",X"27",X"77",X"21",X"30",X"42",X"7E",X"FE",X"00",X"C2",X"75", + X"2C",X"23",X"7E",X"FE",X"01",X"C2",X"75",X"2C",X"AF",X"32",X"31",X"42",X"11",X"69",X"2D",X"CD", + X"DD",X"09",X"C3",X"84",X"2C",X"11",X"63",X"2D",X"CD",X"DD",X"09",X"11",X"69",X"2D",X"CD",X"DD", + X"09",X"C3",X"0F",X"2B",X"3A",X"EE",X"40",X"47",X"3E",X"04",X"90",X"47",X"B7",X"CA",X"DE",X"2C", + X"DD",X"21",X"4B",X"40",X"FD",X"21",X"4E",X"40",X"11",X"FA",X"FF",X"0E",X"03",X"DD",X"7E",X"00", + X"FD",X"77",X"00",X"DD",X"23",X"FD",X"23",X"0D",X"C2",X"9D",X"2C",X"DD",X"19",X"FD",X"19",X"05", + X"C2",X"9B",X"2C",X"3A",X"EE",X"40",X"47",X"3E",X"04",X"90",X"47",X"DD",X"21",X"7E",X"40",X"FD", + X"21",X"8C",X"40",X"0E",X"0A",X"DD",X"7E",X"00",X"FD",X"77",X"00",X"DD",X"23",X"FD",X"23",X"0D", + X"C2",X"C5",X"2C",X"11",X"E8",X"FF",X"DD",X"19",X"FD",X"19",X"05",X"C2",X"C3",X"2C",X"3A",X"EE", + X"40",X"47",X"4F",X"FD",X"21",X"42",X"40",X"B7",X"CA",X"F5",X"2C",X"FD",X"23",X"FD",X"23",X"FD", + X"23",X"05",X"C2",X"EB",X"2C",X"DD",X"21",X"98",X"40",X"06",X"03",X"DD",X"7E",X"00",X"FD",X"77", + X"00",X"DD",X"23",X"FD",X"23",X"05",X"C2",X"FB",X"2C",X"FD",X"21",X"54",X"40",X"79",X"B7",X"CA", + X"1B",X"2D",X"11",X"0E",X"00",X"FD",X"19",X"0D",X"C2",X"15",X"2D",X"DD",X"21",X"E0",X"40",X"0E", + X"0A",X"DD",X"7E",X"00",X"FD",X"77",X"00",X"DD",X"23",X"FD",X"23",X"0D",X"C2",X"21",X"2D",X"CD", + X"6F",X"2D",X"AF",X"32",X"40",X"58",X"3E",X"FF",X"CD",X"B2",X"02",X"3E",X"FF",X"CD",X"B2",X"02", + X"3E",X"FF",X"CD",X"B2",X"02",X"06",X"1C",X"3E",X"02",X"CD",X"C3",X"2A",X"3C",X"05",X"C2",X"49", + X"2D",X"C9",X"02",X"1A",X"07",X"1B",X"0E",X"10",X"24",X"1D",X"12",X"16",X"0E",X"FF",X"07",X"1C", + X"0C",X"2D",X"FF",X"07",X"1C",X"0A",X"30",X"42",X"02",X"07",X"1C",X"0D",X"31",X"42",X"01",X"00", + X"3E",X"02",X"06",X"18",X"CD",X"C3",X"2A",X"3C",X"05",X"C2",X"74",X"2D",X"11",X"41",X"2E",X"CD", + X"80",X"09",X"11",X"53",X"2E",X"CD",X"80",X"09",X"11",X"7B",X"2E",X"CD",X"DD",X"09",X"DD",X"21", + X"51",X"40",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"05",X"DD",X"36",X"02",X"11",X"DD",X"36", + X"0D",X"FF",X"11",X"51",X"40",X"CD",X"80",X"09",X"11",X"5B",X"2E",X"CD",X"80",X"09",X"11",X"81", + X"2E",X"CD",X"DD",X"09",X"DD",X"21",X"5F",X"40",X"DD",X"36",X"00",X"01",X"DD",X"36",X"01",X"07", + X"DD",X"36",X"02",X"11",X"DD",X"36",X"0D",X"FF",X"11",X"5F",X"40",X"CD",X"80",X"09",X"11",X"63", + X"2E",X"CD",X"80",X"09",X"11",X"87",X"2E",X"CD",X"DD",X"09",X"DD",X"21",X"6D",X"40",X"DD",X"36", + X"00",X"02",X"DD",X"36",X"01",X"09",X"DD",X"36",X"02",X"11",X"DD",X"36",X"0D",X"FF",X"11",X"6D", + X"40",X"CD",X"80",X"09",X"11",X"6B",X"2E",X"CD",X"80",X"09",X"11",X"8D",X"2E",X"CD",X"DD",X"09", + X"DD",X"21",X"7B",X"40",X"DD",X"36",X"00",X"03",X"DD",X"36",X"01",X"0B",X"DD",X"36",X"02",X"11", + X"DD",X"36",X"0D",X"FF",X"11",X"7B",X"40",X"CD",X"80",X"09",X"11",X"73",X"2E",X"CD",X"80",X"09", + X"11",X"93",X"2E",X"CD",X"DD",X"09",X"DD",X"21",X"89",X"40",X"DD",X"36",X"00",X"04",X"DD",X"36", + X"01",X"0D",X"DD",X"36",X"02",X"11",X"DD",X"36",X"0D",X"FF",X"11",X"89",X"40",X"CD",X"80",X"09", + X"C9",X"06",X"03",X"0A",X"1C",X"0C",X"18",X"1B",X"0E",X"24",X"24",X"24",X"24",X"24",X"17",X"0A", + X"16",X"0E",X"FF",X"0C",X"05",X"04",X"17",X"18",X"01",X"2D",X"FF",X"0C",X"07",X"04",X"17",X"18", + X"02",X"2D",X"FF",X"0C",X"09",X"04",X"17",X"18",X"03",X"2D",X"FF",X"0C",X"0B",X"04",X"17",X"18", + X"04",X"2D",X"FF",X"0C",X"0D",X"04",X"17",X"18",X"05",X"2D",X"FF",X"0C",X"05",X"09",X"42",X"40", + X"06",X"0C",X"07",X"09",X"45",X"40",X"06",X"0C",X"09",X"09",X"48",X"40",X"06",X"0C",X"0B",X"09", + X"4B",X"40",X"06",X"0C",X"0D",X"09",X"4E",X"40",X"06",X"00",X"11",X"D4",X"2E",X"CD",X"80",X"09", + X"11",X"E9",X"2E",X"CD",X"80",X"09",X"11",X"F2",X"2E",X"CD",X"80",X"09",X"11",X"08",X"2F",X"CD", + X"80",X"09",X"11",X"20",X"2F",X"CD",X"80",X"09",X"21",X"E0",X"40",X"06",X"0A",X"36",X"24",X"23", + X"05",X"C2",X"BD",X"2E",X"3E",X"01",X"32",X"00",X"60",X"3E",X"01",X"32",X"01",X"60",X"3E",X"01", + X"32",X"02",X"60",X"C9",X"05",X"10",X"06",X"17",X"0A",X"16",X"0E",X"24",X"1B",X"0E",X"10",X"12", + X"1C",X"1D",X"1B",X"0A",X"1D",X"12",X"18",X"17",X"FF",X"06",X"12",X"05",X"17",X"0A",X"16",X"0E", + X"2D",X"FF",X"07",X"14",X"05",X"0A",X"24",X"0B",X"24",X"0C",X"24",X"0D",X"24",X"0E",X"24",X"0F", + X"24",X"10",X"24",X"11",X"24",X"12",X"24",X"FF",X"07",X"16",X"05",X"13",X"24",X"14",X"24",X"15", + X"24",X"16",X"24",X"17",X"24",X"18",X"24",X"19",X"24",X"1A",X"24",X"1B",X"24",X"A3",X"A1",X"FF", + X"07",X"18",X"05",X"1C",X"24",X"1D",X"24",X"1E",X"24",X"1F",X"24",X"20",X"24",X"21",X"24",X"22", + X"24",X"23",X"24",X"2C",X"24",X"A2",X"A0",X"FF",X"3A",X"00",X"70",X"47",X"E6",X"08",X"3E",X"00", + X"28",X"01",X"3C",X"32",X"3C",X"40",X"78",X"E6",X"04",X"3E",X"00",X"00",X"00",X"3C",X"32",X"36", + X"40",X"78",X"E6",X"01",X"3E",X"03",X"20",X"02",X"3C",X"3C",X"32",X"3D",X"40",X"3A",X"00",X"68", + X"47",X"E6",X"40",X"3E",X"01",X"20",X"01",X"3C",X"32",X"38",X"40",X"78",X"E6",X"80",X"3E",X"03", + X"20",X"02",X"3C",X"3C",X"32",X"3A",X"40",X"3E",X"01",X"00",X"00",X"00",X"32",X"06",X"70",X"32", + X"07",X"70",X"18",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"54", + X"40",X"06",X"05",X"0E",X"0A",X"DD",X"21",X"D3",X"2F",X"3A",X"36",X"40",X"B7",X"CA",X"A4",X"2F", + X"DD",X"21",X"DD",X"2F",X"DD",X"7E",X"00",X"77",X"23",X"DD",X"23",X"0D",X"C2",X"A4",X"2F",X"23", + X"23",X"23",X"23",X"05",X"C2",X"93",X"2F",X"21",X"42",X"40",X"06",X"05",X"36",X"00",X"23",X"36", + X"50",X"23",X"36",X"00",X"23",X"05",X"C2",X"BC",X"2F",X"3A",X"3A",X"40",X"FE",X"04",X"C0",X"32", + X"32",X"40",X"C9",X"3F",X"3D",X"3B",X"39",X"37",X"35",X"33",X"31",X"2F",X"24",X"3E",X"3C",X"3A", + X"38",X"36",X"34",X"32",X"30",X"24",X"24",X"00",X"00",X"0E",X"23",X"CD",X"C8",X"B4",X"EB",X"CD", + X"B6",X"A4",X"D1",X"E1",X"01",X"80",X"00",X"09",X"EB",X"B7",X"28",X"B0",X"11",X"80",X"00",X"73", + X"00",X"CD",X"FE",X"32",X"3A",X"3B",X"42",X"FE",X"03",X"C2",X"20",X"30",X"3A",X"27",X"42",X"E6", + X"03",X"C2",X"2B",X"30",X"CD",X"7E",X"30",X"CD",X"EB",X"30",X"CD",X"50",X"31",X"C3",X"2B",X"30", + X"FE",X"04",X"DA",X"28",X"30",X"CD",X"42",X"30",X"CD",X"50",X"31",X"CD",X"6A",X"33",X"CD",X"D1", + X"36",X"3A",X"3B",X"42",X"FE",X"04",X"DA",X"3F",X"30",X"CD",X"E7",X"31",X"CD",X"F7",X"33",X"CD", + X"10",X"03",X"00",X"3A",X"2E",X"42",X"E6",X"04",X"C2",X"58",X"30",X"3A",X"2E",X"42",X"E6",X"08", + X"C2",X"6B",X"30",X"AF",X"32",X"28",X"42",X"C9",X"3A",X"2D",X"42",X"B7",X"C2",X"65",X"30",X"3E", + X"FE",X"32",X"28",X"42",X"C9",X"3E",X"FF",X"32",X"28",X"42",X"C9",X"3A",X"2D",X"42",X"B7",X"C2", + X"78",X"30",X"3E",X"02",X"32",X"28",X"42",X"C9",X"3E",X"01",X"32",X"28",X"42",X"C9",X"00",X"3A", + X"26",X"42",X"FE",X"02",X"D8",X"AF",X"32",X"28",X"42",X"3A",X"2E",X"42",X"E6",X"04",X"CA",X"A1", + X"30",X"3A",X"22",X"42",X"FE",X"C0",X"CA",X"B6",X"30",X"C6",X"01",X"32",X"22",X"42",X"C3",X"B6", + X"30",X"3A",X"2E",X"42",X"E6",X"08",X"CA",X"B6",X"30",X"3A",X"22",X"42",X"FE",X"40",X"CA",X"B6", + X"30",X"D6",X"01",X"32",X"22",X"42",X"3A",X"24",X"42",X"A7",X"CA",X"C2",X"30",X"3D",X"32",X"24", + X"42",X"C9",X"3A",X"22",X"42",X"A7",X"F2",X"CB",X"30",X"2F",X"3C",X"D6",X"40",X"0F",X"0F",X"0F", + X"0F",X"0F",X"E6",X"07",X"32",X"24",X"42",X"3A",X"22",X"42",X"E6",X"80",X"CA",X"E5",X"30",X"3E", + X"FF",X"32",X"28",X"42",X"C9",X"3E",X"01",X"32",X"28",X"42",X"C9",X"00",X"3A",X"26",X"42",X"FE", + X"02",X"D8",X"AF",X"32",X"29",X"42",X"3A",X"2E",X"42",X"E6",X"10",X"CA",X"0E",X"31",X"3A",X"23", + X"42",X"FE",X"C0",X"CA",X"1B",X"31",X"C6",X"01",X"32",X"23",X"42",X"C3",X"1B",X"31",X"3A",X"23", + X"42",X"FE",X"40",X"CA",X"1B",X"31",X"D6",X"01",X"32",X"23",X"42",X"3A",X"25",X"42",X"A7",X"CA", + X"27",X"31",X"3D",X"32",X"25",X"42",X"C9",X"3A",X"23",X"42",X"A7",X"F2",X"30",X"31",X"2F",X"3C", + X"D6",X"40",X"0F",X"0F",X"0F",X"0F",X"0F",X"E6",X"07",X"32",X"25",X"42",X"3A",X"23",X"42",X"E6", + X"80",X"CA",X"4A",X"31",X"3E",X"FF",X"32",X"29",X"42",X"C9",X"3E",X"01",X"32",X"29",X"42",X"C9", + X"00",X"06",X"03",X"0E",X"01",X"11",X"FB",X"FF",X"DD",X"21",X"4A",X"41",X"DD",X"7E",X"00",X"FE", + X"01",X"CA",X"6C",X"31",X"FE",X"02",X"CA",X"D1",X"31",X"C3",X"DF",X"31",X"3A",X"28",X"42",X"FE", + X"02",X"CA",X"91",X"31",X"FE",X"01",X"CA",X"91",X"31",X"FE",X"FE",X"CA",X"86",X"31",X"FE",X"FF", + X"CA",X"86",X"31",X"C3",X"A2",X"31",X"3A",X"2B",X"42",X"FE",X"20",X"D2",X"99",X"31",X"C3",X"A2", + X"31",X"3A",X"2B",X"42",X"FE",X"D8",X"D2",X"A2",X"31",X"3A",X"28",X"42",X"DD",X"86",X"04",X"DD", + X"77",X"04",X"3A",X"29",X"42",X"FE",X"01",X"CA",X"B2",X"31",X"FE",X"FF",X"CA",X"BD",X"31",X"C3", + X"DB",X"31",X"3A",X"2C",X"42",X"FE",X"F0",X"DA",X"C5",X"31",X"C3",X"DB",X"31",X"3A",X"2C",X"42", + X"FE",X"30",X"DA",X"DB",X"31",X"3A",X"29",X"42",X"DD",X"86",X"03",X"DD",X"77",X"03",X"C3",X"DB", + X"31",X"3A",X"2A",X"42",X"DD",X"66",X"03",X"84",X"DD",X"77",X"03",X"78",X"CD",X"87",X"34",X"DD", + X"19",X"0C",X"05",X"C2",X"5C",X"31",X"C9",X"00",X"3A",X"2E",X"42",X"E6",X"10",X"C2",X"F5",X"31", + X"AF",X"32",X"34",X"42",X"C9",X"3A",X"34",X"42",X"B7",X"C0",X"3E",X"01",X"32",X"34",X"42",X"3A", + X"72",X"41",X"B7",X"CA",X"13",X"32",X"FE",X"01",X"CA",X"23",X"32",X"FE",X"02",X"CA",X"33",X"32", + X"C3",X"44",X"32",X"3A",X"40",X"41",X"FE",X"01",X"C2",X"44",X"32",X"3A",X"59",X"41",X"A7",X"CA", + X"54",X"32",X"C9",X"3A",X"45",X"41",X"FE",X"01",X"C2",X"44",X"32",X"3A",X"5E",X"41",X"A7",X"CA", + X"6A",X"32",X"C9",X"3A",X"4A",X"41",X"FE",X"01",X"C2",X"44",X"32",X"3A",X"68",X"41",X"A7",X"CA", + X"80",X"32",X"C9",X"B3",X"3A",X"72",X"41",X"3C",X"FE",X"03",X"DA",X"4E",X"32",X"AF",X"32",X"72", + X"41",X"C3",X"FF",X"31",X"3E",X"01",X"32",X"72",X"41",X"3E",X"00",X"CD",X"32",X"09",X"DD",X"21", + X"59",X"41",X"FD",X"21",X"59",X"41",X"CD",X"96",X"32",X"C9",X"3E",X"02",X"32",X"72",X"41",X"3E", + X"00",X"CD",X"32",X"09",X"DD",X"21",X"5E",X"41",X"FD",X"21",X"63",X"41",X"CD",X"AD",X"32",X"C9", + X"3E",X"00",X"32",X"72",X"41",X"3E",X"00",X"CD",X"32",X"09",X"DD",X"21",X"68",X"41",X"FD",X"21", + X"6D",X"41",X"CD",X"C6",X"32",X"C9",X"00",X"3A",X"43",X"41",X"D6",X"01",X"32",X"35",X"42",X"3A", + X"44",X"41",X"C6",X"08",X"32",X"36",X"42",X"32",X"37",X"42",X"C3",X"DF",X"32",X"00",X"3A",X"48", + X"41",X"C6",X"03",X"32",X"35",X"42",X"3A",X"49",X"41",X"C6",X"08",X"32",X"36",X"42",X"C6",X"10", + X"32",X"37",X"42",X"C3",X"DF",X"32",X"00",X"3A",X"4D",X"41",X"C6",X"04",X"32",X"35",X"42",X"3A", + X"4E",X"41",X"C6",X"04",X"32",X"36",X"42",X"C6",X"18",X"32",X"37",X"42",X"C3",X"DF",X"32",X"00", + X"DD",X"36",X"00",X"01",X"FD",X"36",X"00",X"01",X"3A",X"35",X"42",X"DD",X"77",X"03",X"FD",X"77", + X"03",X"3A",X"36",X"42",X"DD",X"77",X"04",X"3A",X"37",X"42",X"FD",X"77",X"04",X"C9",X"00",X"3A", + X"35",X"40",X"A7",X"CA",X"1B",X"33",X"3A",X"40",X"40",X"A7",X"C2",X"13",X"33",X"3A",X"00",X"60", + X"C3",X"16",X"33",X"3A",X"00",X"68",X"00",X"32",X"2E",X"42",X"C9",X"3A",X"26",X"42",X"FE",X"03", + X"DA",X"2B",X"33",X"3A",X"3B",X"42",X"FE",X"03",X"CA",X"46",X"33",X"3A",X"27",X"42",X"E6",X"0F", + X"C0",X"3A",X"2F",X"42",X"3C",X"E6",X"0F",X"32",X"2F",X"42",X"4F",X"06",X"00",X"21",X"5A",X"33", + X"09",X"7E",X"32",X"2E",X"42",X"C9",X"3A",X"2B",X"42",X"D6",X"81",X"DA",X"54",X"33",X"3E",X"04", + X"32",X"2E",X"42",X"C9",X"3E",X"08",X"32",X"2E",X"42",X"C9",X"14",X"08",X"14",X"04",X"18",X"08", + X"14",X"08",X"14",X"04",X"18",X"08",X"14",X"04",X"18",X"08",X"00",X"DD",X"21",X"4F",X"41",X"DD", + X"7E",X"00",X"B7",X"C8",X"3A",X"27",X"42",X"E6",X"03",X"C2",X"95",X"33",X"DD",X"7E",X"01",X"B7", + X"C2",X"87",X"33",X"DD",X"36",X"01",X"15",X"DD",X"7E",X"01",X"3C",X"FE",X"18",X"C2",X"92",X"33", + X"3E",X"15",X"DD",X"77",X"01",X"FD",X"21",X"40",X"41",X"FD",X"7E",X"00",X"B7",X"CA",X"B3",X"33", + X"FE",X"03",X"CA",X"B3",X"33",X"FD",X"7E",X"04",X"DD",X"77",X"04",X"FD",X"7E",X"03",X"C6",X"10", + X"DD",X"77",X"03",X"FD",X"21",X"45",X"41",X"FD",X"7E",X"00",X"B7",X"CA",X"D3",X"33",X"FE",X"03", + X"CA",X"D3",X"33",X"FD",X"7E",X"04",X"C6",X"08",X"DD",X"77",X"04",X"FD",X"7E",X"03",X"C6",X"10", + X"DD",X"77",X"03",X"FD",X"21",X"4A",X"41",X"FD",X"7E",X"00",X"B7",X"CA",X"F3",X"33",X"FE",X"03", + X"CA",X"F3",X"33",X"FD",X"7E",X"04",X"C6",X"08",X"DD",X"77",X"04",X"FD",X"7E",X"03",X"C6",X"10", + X"DD",X"77",X"03",X"CD",X"DE",X"35",X"C9",X"00",X"26",X"05",X"2E",X"01",X"DD",X"21",X"59",X"41", + X"DD",X"7E",X"00",X"B7",X"CA",X"20",X"34",X"DD",X"7E",X"03",X"D6",X"04",X"DD",X"77",X"03",X"FE", + X"04",X"D2",X"1C",X"34",X"DD",X"36",X"00",X"00",X"DD",X"36",X"04",X"00",X"7D",X"CD",X"2B",X"34", + X"11",X"05",X"00",X"DD",X"19",X"2C",X"25",X"C2",X"00",X"34",X"C9",X"00",X"3D",X"47",X"DD",X"21", + X"59",X"41",X"B7",X"CA",X"3F",X"34",X"11",X"05",X"00",X"DD",X"19",X"3D",X"C2",X"39",X"34",X"78", + X"FD",X"21",X"60",X"58",X"07",X"07",X"E6",X"FC",X"5F",X"16",X"00",X"FD",X"19",X"DD",X"7E",X"04", + X"FD",X"77",X"01",X"3A",X"3C",X"40",X"B7",X"CA",X"6B",X"34",X"3A",X"40",X"40",X"B7",X"CA",X"6B", + X"34",X"DD",X"7E",X"03",X"2F",X"FD",X"77",X"03",X"C3",X"71",X"34",X"DD",X"7E",X"03",X"FD",X"77", + X"03",X"DD",X"7E",X"04",X"B7",X"C2",X"7C",X"34",X"DD",X"36",X"00",X"00",X"FD",X"7E",X"03",X"FE", + X"F8",X"D8",X"DD",X"36",X"04",X"00",X"C9",X"00",X"F5",X"3A",X"4D",X"42",X"B7",X"CA",X"41",X"35", + X"FE",X"FF",X"CA",X"2D",X"35",X"F1",X"3D",X"CA",X"A2",X"34",X"3D",X"CA",X"BF",X"34",X"3D",X"CA", + X"F6",X"34",X"DD",X"21",X"40",X"41",X"FD",X"21",X"40",X"58",X"DD",X"7E",X"04",X"FD",X"77",X"00", + X"FD",X"36",X"01",X"10",X"FD",X"36",X"02",X"03",X"DD",X"7E",X"03",X"FD",X"77",X"03",X"C9",X"DD", + X"21",X"45",X"41",X"FD",X"21",X"44",X"58",X"DD",X"7E",X"04",X"FD",X"77",X"00",X"FD",X"36",X"01", + X"12",X"FD",X"36",X"02",X"04",X"DD",X"7E",X"03",X"FD",X"77",X"03",X"FD",X"21",X"48",X"58",X"DD", + X"7E",X"04",X"C6",X"10",X"FD",X"77",X"00",X"FD",X"36",X"01",X"11",X"FD",X"36",X"02",X"04",X"DD", + X"7E",X"03",X"FD",X"77",X"03",X"C9",X"DD",X"21",X"4A",X"41",X"FD",X"21",X"4C",X"58",X"DD",X"7E", + X"04",X"FD",X"77",X"00",X"FD",X"36",X"01",X"14",X"FD",X"36",X"02",X"05",X"DD",X"7E",X"03",X"FD", + X"77",X"03",X"FD",X"21",X"50",X"58",X"DD",X"7E",X"04",X"C6",X"10",X"FD",X"77",X"00",X"FD",X"36", + X"01",X"13",X"FD",X"36",X"02",X"05",X"DD",X"7E",X"03",X"FD",X"77",X"03",X"C9",X"F1",X"C5",X"D5", + X"E5",X"DD",X"E5",X"FD",X"E5",X"3D",X"CA",X"98",X"35",X"3D",X"CA",X"A6",X"35",X"3D",X"CA",X"B4", + X"35",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"3A",X"45",X"41",X"FE",X"01",X"C2",X"5E",X"35", + X"DD",X"21",X"45",X"41",X"21",X"CC",X"35",X"06",X"02",X"0E",X"04",X"CD",X"4A",X"36",X"3A",X"40", + X"41",X"FE",X"01",X"C2",X"74",X"35",X"DD",X"21",X"40",X"41",X"21",X"C7",X"35",X"06",X"02",X"0E", + X"02",X"CD",X"4A",X"36",X"3A",X"4A",X"41",X"FE",X"01",X"C2",X"8A",X"35",X"DD",X"21",X"4A",X"41", + X"21",X"D5",X"35",X"06",X"02",X"0E",X"04",X"CD",X"4A",X"36",X"3E",X"FF",X"32",X"4D",X"42",X"FD", + X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"C9",X"DD",X"21",X"40",X"41",X"06",X"01",X"0E",X"02", + X"CD",X"9D",X"36",X"C3",X"BF",X"35",X"DD",X"21",X"45",X"41",X"06",X"01",X"0E",X"04",X"CD",X"9D", + X"36",X"C3",X"BF",X"35",X"DD",X"21",X"4A",X"41",X"06",X"02",X"0E",X"04",X"CD",X"9D",X"36",X"FD", + X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"C9",X"03",X"42",X"40",X"43",X"41",X"04",X"4A",X"48",X"46", + X"44",X"4B",X"49",X"47",X"45",X"05",X"52",X"50",X"4E",X"4C",X"53",X"51",X"4F",X"4D",X"00",X"3A", + X"4F",X"41",X"B7",X"C8",X"3A",X"4D",X"42",X"FE",X"01",X"C2",X"0B",X"36",X"DD",X"21",X"4F",X"41", + X"FD",X"21",X"54",X"58",X"DD",X"7E",X"04",X"FD",X"77",X"00",X"DD",X"7E",X"01",X"FD",X"77",X"01", + X"FD",X"36",X"02",X"06",X"DD",X"7E",X"03",X"FD",X"77",X"03",X"C9",X"3A",X"50",X"41",X"FE",X"15", + X"CA",X"1D",X"36",X"FE",X"16",X"CA",X"23",X"36",X"FE",X"17",X"CA",X"29",X"36",X"21",X"3B",X"36", + X"C3",X"2F",X"36",X"21",X"40",X"36",X"C3",X"2F",X"36",X"21",X"45",X"36",X"C3",X"2F",X"36",X"DD", + X"21",X"4F",X"41",X"06",X"02",X"0E",X"02",X"CD",X"4A",X"36",X"C9",X"06",X"56",X"54",X"57",X"55", + X"06",X"5A",X"58",X"5B",X"59",X"06",X"5E",X"5C",X"5F",X"5D",X"00",X"DD",X"7E",X"03",X"0F",X"0F", + X"E6",X"3E",X"5F",X"16",X"00",X"FD",X"21",X"00",X"58",X"FD",X"19",X"DD",X"7E",X"04",X"2F",X"57", + X"7B",X"0F",X"E6",X"1F",X"5F",X"C5",X"7A",X"2F",X"C6",X"00",X"FD",X"77",X"00",X"7E",X"FD",X"77", + X"01",X"FD",X"23",X"FD",X"23",X"05",X"C2",X"66",X"36",X"C1",X"FD",X"21",X"E0",X"53",X"16",X"00", + X"FD",X"19",X"11",X"E0",X"FF",X"FD",X"E5",X"C5",X"23",X"7E",X"FD",X"77",X"00",X"FD",X"19",X"0D", + X"C2",X"88",X"36",X"C1",X"FD",X"E1",X"FD",X"23",X"05",X"C2",X"85",X"36",X"C9",X"00",X"78",X"FE", + X"01",X"C2",X"AC",X"36",X"DD",X"7E",X"03",X"C6",X"08",X"C3",X"AF",X"36",X"DD",X"7E",X"03",X"0F", + X"0F",X"E6",X"3E",X"5F",X"16",X"00",X"FD",X"21",X"00",X"58",X"FD",X"19",X"DD",X"7E",X"04",X"2F", + X"57",X"7A",X"2F",X"C6",X"00",X"FD",X"77",X"00",X"FD",X"23",X"FD",X"23",X"05",X"C2",X"C1",X"36", + X"C9",X"00",X"3A",X"3B",X"42",X"FE",X"03",X"C0",X"DD",X"21",X"54",X"41",X"DD",X"7E",X"01",X"B7", + X"C2",X"E7",X"36",X"DD",X"36",X"01",X"15",X"3A",X"27",X"42",X"E6",X"03",X"C2",X"FD",X"36",X"DD", + X"7E",X"01",X"3C",X"FE",X"18",X"C2",X"FA",X"36",X"3E",X"15",X"DD",X"77",X"01",X"FD",X"21",X"40", + X"41",X"FD",X"7E",X"00",X"FE",X"01",X"C2",X"17",X"37",X"FD",X"7E",X"04",X"DD",X"77",X"04",X"FD", + X"7E",X"03",X"C6",X"10",X"DD",X"77",X"03",X"FD",X"21",X"45",X"41",X"FD",X"7E",X"00",X"FE",X"01", + X"C2",X"33",X"37",X"FD",X"7E",X"04",X"C6",X"08",X"DD",X"77",X"04",X"FD",X"7E",X"03",X"C6",X"10", + X"DD",X"77",X"03",X"FD",X"21",X"4A",X"41",X"FD",X"7E",X"00",X"FE",X"01",X"C2",X"4F",X"37",X"FD", + X"7E",X"04",X"C6",X"08",X"DD",X"77",X"04",X"FD",X"7E",X"03",X"C6",X"10",X"DD",X"77",X"03",X"CD", + X"53",X"37",X"C9",X"00",X"DD",X"21",X"54",X"41",X"FD",X"21",X"58",X"58",X"FD",X"36",X"01",X"15", + X"DD",X"7E",X"04",X"FD",X"77",X"00",X"3A",X"2E",X"42",X"E6",X"10",X"C2",X"75",X"37",X"FD",X"36", + X"01",X"09",X"C3",X"7E",X"37",X"DD",X"7E",X"01",X"FD",X"77",X"01",X"C3",X"7E",X"37",X"FD",X"36", + X"02",X"0C",X"DD",X"7E",X"03",X"FD",X"77",X"03",X"C9",X"0D",X"0A",X"52",X"65",X"61",X"64",X"2D", + X"61",X"66",X"74",X"65",X"72",X"2D",X"77",X"72",X"69",X"74",X"65",X"00",X"0D",X"0A",X"4C",X"6F", + X"67",X"69",X"63",X"61",X"6C",X"20",X"64",X"69",X"73",X"6B",X"20",X"65",X"72",X"72",X"6F",X"72", + X"20",X"80",X"00",X"00",X"68",X"2C",X"20",X"64",X"72",X"69",X"76",X"65",X"20",X"00",X"2C",X"20", + X"62",X"6C",X"6F",X"63",X"6B",X"20",X"80",X"00",X"00",X"81",X"00",X"00",X"68",X"0D",X"0A",X"00", + X"20",X"65",X"72",X"72",X"6F",X"72",X"3A",X"20",X"44",X"72",X"69",X"76",X"65",X"20",X"00",X"00", + X"0D",X"0A",X"44",X"72",X"69",X"76",X"65",X"20",X"00",X"20",X"6E",X"6F",X"74",X"20",X"72",X"65", + X"61",X"64",X"79",X"0D",X"0A",X"00",X"0D",X"0A",X"44",X"69",X"73",X"6B",X"65",X"74",X"74",X"65", + X"00",X"CD",X"27",X"38",X"3A",X"3B",X"42",X"FE",X"04",X"DA",X"24",X"38",X"3A",X"3C",X"42",X"B7", + X"C2",X"24",X"38",X"3A",X"9B",X"40",X"3C",X"32",X"9B",X"40",X"AF",X"32",X"26",X"42",X"32",X"27", + X"42",X"CD",X"96",X"39",X"CD",X"10",X"03",X"00",X"CD",X"61",X"3D",X"3A",X"2D",X"42",X"B7",X"CA", + X"36",X"38",X"3D",X"32",X"2D",X"42",X"00",X"3A",X"26",X"42",X"21",X"27",X"42",X"B6",X"C2",X"9A", + X"38",X"21",X"FE",X"38",X"3A",X"35",X"40",X"B7",X"C2",X"4E",X"38",X"21",X"1A",X"39",X"3A",X"9B", + X"40",X"E6",X"0F",X"3D",X"07",X"E6",X"FE",X"4F",X"06",X"00",X"09",X"7E",X"32",X"3B",X"42",X"D6", + X"04",X"32",X"3A",X"42",X"23",X"7E",X"32",X"3F",X"42",X"32",X"40",X"42",X"AF",X"32",X"3E",X"42", + X"3A",X"9B",X"40",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"C6",X"01",X"32",X"3D",X"42",X"21",X"2E", + X"39",X"3A",X"3A",X"42",X"07",X"07",X"E6",X"FC",X"4F",X"06",X"00",X"09",X"7E",X"32",X"00",X"60", + X"23",X"7E",X"32",X"01",X"60",X"23",X"7E",X"32",X"02",X"60",X"3A",X"3B",X"42",X"3D",X"CA",X"AD", + X"38",X"3D",X"CA",X"B3",X"38",X"3D",X"CA",X"B9",X"38",X"00",X"C3",X"BF",X"38",X"CD",X"00",X"3A", + X"C3",X"F2",X"38",X"CD",X"11",X"3B",X"C3",X"F2",X"38",X"CD",X"E0",X"3B",X"C3",X"F2",X"38",X"00", + X"3A",X"27",X"42",X"21",X"26",X"42",X"B6",X"C2",X"F2",X"38",X"3E",X"01",X"32",X"4F",X"41",X"0E", + X"00",X"21",X"82",X"41",X"06",X"08",X"11",X"14",X"00",X"7E",X"B7",X"CA",X"DF",X"38",X"0C",X"19", + X"05",X"C2",X"D9",X"38",X"79",X"32",X"3C",X"42",X"CD",X"81",X"39",X"AF",X"32",X"4D",X"42",X"CD", + X"5A",X"39",X"21",X"27",X"42",X"34",X"7E",X"B7",X"C2",X"FD",X"38",X"2B",X"34",X"C9",X"01",X"00", + X"04",X"03",X"04",X"05",X"06",X"00",X"06",X"02",X"03",X"00",X"05",X"00",X"05",X"02",X"07",X"03", + X"07",X"05",X"03",X"00",X"08",X"00",X"08",X"02",X"02",X"00",X"01",X"00",X"03",X"00",X"06",X"02", + X"05",X"02",X"03",X"00",X"04",X"05",X"03",X"00",X"08",X"00",X"07",X"03",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"00",X"01",X"01",X"00",X"01",X"01", + X"01",X"00",X"00",X"21",X"00",X"50",X"06",X"20",X"0E",X"1C",X"23",X"23",X"23",X"36",X"24",X"23", + X"0D",X"C2",X"4D",X"39",X"23",X"05",X"C2",X"48",X"39",X"C9",X"00",X"21",X"40",X"58",X"06",X"20", + X"36",X"00",X"23",X"05",X"C2",X"60",X"39",X"C9",X"00",X"21",X"00",X"50",X"06",X"20",X"11",X"19", + X"00",X"0E",X"06",X"19",X"36",X"24",X"23",X"0D",X"C2",X"74",X"39",X"23",X"05",X"C2",X"71",X"39", + X"C9",X"00",X"21",X"82",X"41",X"06",X"08",X"0E",X"13",X"23",X"36",X"00",X"23",X"0D",X"C2",X"8A", + X"39",X"05",X"C2",X"87",X"39",X"C9",X"00",X"21",X"82",X"41",X"06",X"08",X"0E",X"13",X"36",X"01", + X"23",X"36",X"00",X"23",X"0D",X"C2",X"A1",X"39",X"05",X"C2",X"9C",X"39",X"C9",X"00",X"3A",X"27", + X"42",X"0F",X"0F",X"0F",X"E6",X"1F",X"47",X"3A",X"26",X"42",X"07",X"07",X"07",X"07",X"07",X"E6", + X"E0",X"B0",X"C9",X"00",X"3A",X"40",X"41",X"B8",X"C2",X"D0",X"39",X"79",X"32",X"40",X"41",X"C9", + X"3A",X"45",X"41",X"B8",X"C2",X"DC",X"39",X"79",X"32",X"45",X"41",X"C9",X"3A",X"4A",X"41",X"B8", + X"C0",X"79",X"32",X"4A",X"41",X"C9",X"00",X"3A",X"4A",X"41",X"B8",X"C2",X"F3",X"39",X"79",X"32", + X"4A",X"41",X"C9",X"3A",X"45",X"41",X"B8",X"C2",X"FF",X"39",X"79",X"32",X"45",X"41",X"C9",X"C9", + X"00",X"3A",X"27",X"42",X"E6",X"07",X"C0",X"CD",X"AD",X"39",X"B7",X"CA",X"41",X"3A",X"FE",X"01", + X"CA",X"6F",X"3A",X"FE",X"03",X"CA",X"82",X"3A",X"FE",X"04",X"CA",X"8F",X"3A",X"FE",X"05",X"CA", + X"9C",X"3A",X"FE",X"07",X"CA",X"A4",X"3A",X"FE",X"14",X"CA",X"AF",X"3A",X"FE",X"23",X"CA",X"C8", + X"3A",X"FE",X"24",X"CA",X"DA",X"3A",X"FE",X"25",X"CA",X"E7",X"3A",X"FE",X"2F",X"CA",X"F9",X"3A", + X"C9",X"CD",X"42",X"39",X"CD",X"5A",X"39",X"3E",X"0A",X"CD",X"92",X"08",X"3E",X"08",X"32",X"43", + X"41",X"3E",X"00",X"32",X"48",X"41",X"32",X"4D",X"41",X"3E",X"78",X"32",X"44",X"41",X"3E",X"70", + X"32",X"49",X"41",X"32",X"4E",X"41",X"3E",X"01",X"32",X"4D",X"42",X"CD",X"68",X"39",X"C9",X"3E", + X"FF",X"32",X"2A",X"42",X"3A",X"40",X"41",X"FE",X"03",X"C0",X"06",X"03",X"0E",X"02",X"CD",X"C3", + X"39",X"C9",X"3A",X"45",X"41",X"B7",X"C8",X"06",X"03",X"0E",X"02",X"CD",X"C3",X"39",X"C9",X"3A", + X"45",X"41",X"B7",X"C0",X"06",X"03",X"0E",X"02",X"CD",X"C3",X"39",X"C9",X"06",X"03",X"0E",X"02", + X"CD",X"C3",X"39",X"C9",X"3E",X"01",X"32",X"4F",X"41",X"3E",X"15",X"32",X"50",X"41",X"C9",X"3E", + X"00",X"32",X"29",X"42",X"06",X"02",X"0E",X"01",X"CD",X"C3",X"39",X"3E",X"01",X"32",X"2A",X"42", + X"AF",X"32",X"4F",X"41",X"CD",X"5A",X"39",X"C9",X"3A",X"45",X"41",X"B7",X"C8",X"3A",X"4A",X"41", + X"B7",X"C8",X"06",X"02",X"0E",X"03",X"CD",X"E6",X"39",X"C9",X"3A",X"45",X"41",X"B7",X"C0",X"06", + X"02",X"0E",X"03",X"CD",X"E6",X"39",X"C9",X"3E",X"01",X"32",X"29",X"42",X"3E",X"00",X"32",X"2A", + X"42",X"06",X"02",X"0E",X"03",X"CD",X"C3",X"39",X"C9",X"AF",X"32",X"29",X"42",X"3A",X"9C",X"40", + X"32",X"9B",X"40",X"21",X"26",X"42",X"36",X"FF",X"23",X"36",X"FF",X"3E",X"01",X"32",X"4F",X"41", + X"C9",X"00",X"3A",X"27",X"42",X"E6",X"07",X"C0",X"CD",X"AD",X"39",X"B7",X"CA",X"2A",X"3B",X"FE", + X"01",X"CA",X"4C",X"3B",X"FE",X"14",X"CA",X"53",X"3B",X"C9",X"3E",X"01",X"32",X"4D",X"42",X"AF", + X"32",X"28",X"42",X"32",X"29",X"42",X"CD",X"50",X"29",X"3E",X"80",X"CD",X"B2",X"02",X"CD",X"68", + X"39",X"3E",X"0D",X"CD",X"92",X"08",X"3E",X"FF",X"32",X"29",X"42",X"C9",X"11",X"CF",X"3B",X"CD", + X"80",X"09",X"C9",X"3A",X"40",X"41",X"FE",X"01",X"C2",X"60",X"3B",X"3E",X"03",X"32",X"40",X"41", + X"3A",X"45",X"41",X"FE",X"01",X"C2",X"6D",X"3B",X"3E",X"03",X"32",X"45",X"41",X"AF",X"32",X"29", + X"42",X"3E",X"0E",X"CD",X"C3",X"2A",X"3A",X"4A",X"41",X"FE",X"01",X"C2",X"83",X"3B",X"3E",X"03", + X"32",X"4A",X"41",X"3E",X"01",X"32",X"04",X"40",X"AF",X"32",X"59",X"41",X"32",X"5E",X"41",X"32", + X"63",X"41",X"32",X"68",X"41",X"32",X"6D",X"41",X"CD",X"50",X"29",X"CD",X"5A",X"39",X"3E",X"FF", + X"CD",X"B2",X"02",X"3E",X"FF",X"CD",X"B2",X"02",X"AF",X"32",X"28",X"42",X"32",X"29",X"42",X"32", + X"4F",X"41",X"3A",X"9B",X"40",X"E6",X"F0",X"C6",X"10",X"F6",X"01",X"32",X"9B",X"40",X"3C",X"32", + X"9C",X"40",X"3E",X"FF",X"32",X"26",X"42",X"32",X"27",X"42",X"AF",X"32",X"04",X"40",X"C9",X"0C", + X"0E",X"09",X"0F",X"0A",X"1B",X"24",X"18",X"1E",X"1D",X"24",X"28",X"24",X"24",X"24",X"24",X"FF", + X"00",X"3A",X"26",X"42",X"E6",X"F8",X"FE",X"01",X"D2",X"F3",X"3B",X"CD",X"AD",X"39",X"FE",X"3F", + X"DA",X"F6",X"3B",X"CD",X"A8",X"3D",X"3A",X"27",X"42",X"E6",X"07",X"C0",X"3A",X"26",X"42",X"E6", + X"F8",X"FE",X"02",X"D0",X"CD",X"AD",X"39",X"B7",X"CA",X"25",X"3C",X"FE",X"04",X"CA",X"29",X"3C", + X"FE",X"06",X"CA",X"7D",X"3C",X"FE",X"2C",X"CA",X"8D",X"3C",X"FE",X"32",X"CA",X"C9",X"3C",X"FE", + X"40",X"CA",X"CF",X"3C",X"C9",X"CD",X"50",X"29",X"C9",X"3A",X"45",X"41",X"FE",X"03",X"CA",X"49", + X"3C",X"3A",X"4A",X"41",X"FE",X"03",X"CA",X"49",X"3C",X"3A",X"9B",X"40",X"3C",X"32",X"9B",X"40", + X"3E",X"FF",X"32",X"26",X"42",X"32",X"27",X"42",X"C9",X"3E",X"80",X"32",X"22",X"42",X"32",X"23", + X"42",X"3E",X"08",X"32",X"24",X"42",X"32",X"25",X"42",X"AF",X"32",X"28",X"42",X"32",X"29",X"42", + X"3E",X"01",X"32",X"4D",X"42",X"CD",X"68",X"39",X"3A",X"36",X"40",X"B7",X"C2",X"76",X"3C",X"11", + X"35",X"3D",X"CD",X"80",X"09",X"C9",X"11",X"E5",X"3C",X"CD",X"80",X"09",X"C9",X"3E",X"FF",X"32", + X"29",X"42",X"3E",X"0F",X"CD",X"92",X"08",X"3E",X"15",X"32",X"55",X"41",X"C9",X"AF",X"32",X"29", + X"42",X"3E",X"FF",X"32",X"2A",X"42",X"06",X"03",X"0E",X"02",X"CD",X"C3",X"39",X"AF",X"32",X"4F", + X"41",X"3E",X"0E",X"CD",X"C3",X"2A",X"3E",X"30",X"32",X"30",X"42",X"3E",X"10",X"32",X"31",X"42", + X"11",X"40",X"3D",X"CD",X"80",X"09",X"11",X"50",X"3D",X"CD",X"80",X"09",X"11",X"55",X"3D",X"CD", + X"DD",X"09",X"11",X"5B",X"3D",X"CD",X"DD",X"09",X"C9",X"3E",X"01",X"32",X"4F",X"41",X"C9",X"AF", + X"32",X"2A",X"42",X"3A",X"36",X"40",X"B7",X"C2",X"E1",X"3C",X"11",X"21",X"3D",X"CD",X"80",X"09", + X"C9",X"11",X"E5",X"3C",X"C9",X"0C",X"0E",X"05",X"16",X"0A",X"14",X"0E",X"24",X"1B",X"18",X"0C", + X"14",X"0E",X"1D",X"1C",X"24",X"0D",X"18",X"0C",X"14",X"FF",X"0C",X"10",X"07",X"16",X"0E",X"1C", + X"1C",X"0A",X"10",X"0E",X"24",X"02",X"FF",X"0C",X"12",X"07",X"16",X"0E",X"1C",X"1C",X"0A",X"10", + X"0E",X"24",X"02",X"FF",X"0C",X"14",X"07",X"16",X"0E",X"1C",X"1C",X"0A",X"10",X"0E",X"24",X"03", + X"FF",X"0C",X"06",X"07",X"6E",X"6C",X"6A",X"68",X"66",X"64",X"62",X"60",X"24",X"6F",X"6D",X"6B", + X"69",X"67",X"65",X"63",X"FF",X"0C",X"0E",X"0A",X"6F",X"6D",X"6B",X"69",X"67",X"65",X"63",X"FF", + X"02",X"06",X"07",X"0D",X"18",X"0C",X"14",X"12",X"17",X"10",X"24",X"1D",X"12",X"16",X"0E",X"FF", + X"0C",X"08",X"0C",X"2D",X"FF",X"07",X"08",X"0A",X"30",X"42",X"02",X"07",X"08",X"0D",X"31",X"42", + X"01",X"00",X"3A",X"40",X"41",X"FE",X"01",X"C2",X"7E",X"3D",X"DD",X"21",X"40",X"41",X"DD",X"7E", + X"04",X"C6",X"08",X"32",X"2B",X"42",X"DD",X"7E",X"03",X"C6",X"08",X"32",X"2C",X"42",X"3A",X"45", + X"41",X"FE",X"01",X"C2",X"8D",X"3D",X"DD",X"21",X"45",X"41",X"C3",X"97",X"3D",X"3A",X"4A",X"41", + X"FE",X"01",X"C0",X"DD",X"21",X"4A",X"41",X"DD",X"7E",X"04",X"C6",X"10",X"32",X"2B",X"42",X"DD", + X"7E",X"03",X"C6",X"10",X"32",X"2C",X"42",X"C9",X"00",X"3A",X"27",X"42",X"E6",X"03",X"C0",X"21", + X"31",X"42",X"7E",X"D6",X"01",X"27",X"77",X"C2",X"C2",X"3D",X"36",X"10",X"2B",X"7E",X"D6",X"01", + X"27",X"77",X"21",X"30",X"42",X"7E",X"FE",X"00",X"C2",X"7C",X"3E",X"23",X"7E",X"FE",X"01",X"C2", + X"7C",X"3E",X"AF",X"32",X"31",X"42",X"11",X"5B",X"3D",X"CD",X"DD",X"09",X"3E",X"0C",X"CD",X"92", + X"08",X"11",X"89",X"3E",X"CD",X"80",X"09",X"3E",X"01",X"32",X"04",X"40",X"3E",X"FF",X"CD",X"B2", + X"02",X"3E",X"FF",X"CD",X"B2",X"02",X"3E",X"FF",X"CD",X"B2",X"02",X"3E",X"06",X"CD",X"C3",X"2A", + X"3E",X"08",X"CD",X"C3",X"2A",X"3A",X"45",X"41",X"FE",X"02",X"C2",X"29",X"3E",X"3E",X"03",X"32", + X"45",X"41",X"3A",X"49",X"41",X"C6",X"08",X"32",X"44",X"41",X"3A",X"48",X"41",X"D6",X"08",X"32", + X"43",X"41",X"AF",X"32",X"48",X"41",X"C3",X"61",X"3E",X"3E",X"03",X"32",X"4A",X"41",X"3A",X"4E", + X"41",X"32",X"49",X"41",X"C6",X"08",X"32",X"44",X"41",X"3A",X"45",X"41",X"FE",X"01",X"C2",X"55", + X"3E",X"3A",X"4D",X"41",X"D6",X"10",X"32",X"48",X"41",X"D6",X"08",X"32",X"43",X"41",X"AF",X"32", + X"4D",X"41",X"C3",X"61",X"3E",X"3A",X"4D",X"41",X"D6",X"10",X"32",X"43",X"41",X"AF",X"32",X"4D", + X"41",X"AF",X"32",X"28",X"42",X"32",X"29",X"42",X"3A",X"9B",X"40",X"3C",X"32",X"9B",X"40",X"3E", + X"FF",X"32",X"26",X"42",X"32",X"27",X"42",X"AF",X"32",X"04",X"40",X"C9",X"11",X"55",X"3D",X"CD", + X"DD",X"09",X"11",X"5B",X"3D",X"CD",X"DD",X"09",X"C9",X"0C",X"06",X"07",X"1C",X"18",X"1B",X"1B", + X"22",X"24",X"17",X"18",X"24",X"0B",X"18",X"17",X"1E",X"1C",X"24",X"24",X"24",X"24",X"24",X"24", + X"FF",X"00",X"9F",X"D3",X"04",X"21",X"00",X"00",X"CD",X"3C",X"B9",X"CD",X"21",X"B9",X"D3",X"04", + X"AF",X"C9",X"C5",X"06",X"7F",X"3A",X"5B",X"B9",X"A7",X"28",X"02",X"06",X"7D",X"78",X"C1",X"C9", + X"21",X"1F",X"00",X"3A",X"58",X"B9",X"E6",X"10",X"20",X"03",X"21",X"4B",X"00",X"2B",X"E3",X"E3", + X"7D",X"B4",X"20",X"F9",X"C9",X"01",X"06",X"0B",X"10",X"03",X"08",X"0D",X"12",X"05",X"0A",X"0F", + X"02",X"07",X"0C",X"11",X"04",X"09",X"0E",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"FF",X"FF",X"E4",X"BA",X"EE",X"BA",X"F0",X"BA",X"F6",X"BA",X"FC",X"BA",X"02",X"BB", + X"7F",X"B9",X"00",X"63",X"B9",X"51",X"B5",X"68",X"93",X"68",X"93",X"00",X"01",X"03",X"AF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"38",X"9A",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/build_id.tcl b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_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/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/build_id.v b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/build_id.v new file mode 100644 index 00000000..77b57328 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180103" +`define BUILD_TIME "171046" diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c07d2629 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1093 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..6bd576cf --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..ee217402 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2026 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..679730ab --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80as.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80as.vhd new file mode 100644 index 00000000..fe477f50 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/cpu/T80as.vhd @@ -0,0 +1,283 @@ +------------------------------------------------------------------------------ +-- t80as.vhd : The non-tristate signal edition of t80a.vhd +-- +-- 2003.2.7 non-tristate modification by Tatsuyuki Satoh +-- +-- 1.separate 'D' to 'DO' and 'DI'. +-- 2.added 'DOE' to 'DO' enable signal.(data direction) +-- 3.MREQ_n,IORQ_n,RD_n,WR_n,RFSH_n,A doesn't become the condition of 'Z'. +-- +-- There is a mark of "--AS" in all the change points. +-- +------------------------------------------------------------------------------ + +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80as is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); +--AS-- D : inout std_logic_vector(7 downto 0) +--AS>> + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + DOE : out std_logic +--< 'Z'); +--AS-- D <= DO when Write = '1' and BUSAK_n_i = '1' else (others => 'Z'); +--AS>> + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DOE <= Write when BUSAK_n_i = '1' else '0'; +--< Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, +-- DInst => D, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then +--AS-- DI_Reg <= to_x01(D); +--AS>> + DI_Reg <= to_x01(DI); +--< 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/dac.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/dac.vhd new file mode 100644 index 00000000..b1ecdcb7 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_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 := 11 + ); + 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/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/dpram.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..dafe8385 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/galaxian.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/galaxian.vhd new file mode 100644 index 00000000..b881e738 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/galaxian.vhd @@ -0,0 +1,446 @@ +------------------------------------------------------------------------------ +-- FPGA GALAXIAN +-- +-- Version downto 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important not +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +-- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--use work.pkg_galaxian.all; + +entity galaxian is + port( + W_CLK_18M : in std_logic; + W_CLK_12M : in std_logic; + W_CLK_6M : in std_logic; + + P1_CSJUDLR : in std_logic_vector(6 downto 0); + P2_CSJUDLR : in std_logic_vector(6 downto 0); + I_RESET : in std_logic; + + W_R : out std_logic_vector(2 downto 0); + W_G : out std_logic_vector(2 downto 0); + W_B : out std_logic_vector(2 downto 0); + HBLANK : out std_logic; + VBLANK : out std_logic; + W_H_SYNC : out std_logic; + W_V_SYNC : out std_logic; + W_SDAT_A : out std_logic_vector( 7 downto 0); + W_SDAT_B : out std_logic_vector( 7 downto 0); + O_CMPBL : out std_logic + ); +end; + +architecture RTL of galaxian is + -- CPU ADDRESS BUS + signal W_A : std_logic_vector(15 downto 0) := (others => '0'); + -- CPU IF + signal W_CPU_CLK : std_logic := '0'; + signal W_CPU_MREQn : std_logic := '0'; + signal W_CPU_NMIn : std_logic := '0'; + signal W_CPU_RDn : std_logic := '0'; + signal W_CPU_RFSHn : std_logic := '0'; + signal W_CPU_WAITn : std_logic := '0'; + signal W_CPU_WRn : std_logic := '0'; + signal W_CPU_WR : std_logic := '0'; + signal W_RESETn : std_logic := '0'; + -------- H and V COUNTER ------------------------- + signal W_C_BLn : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_C_BLXn : std_logic := '0'; + signal W_H_BL : std_logic := '0'; + signal W_H_SYNC_int : std_logic := '0'; + signal W_V_BLn : std_logic := '0'; + signal W_V_BL2n : std_logic := '0'; + signal W_V_SYNC_int : std_logic := '0'; + signal W_H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal W_V_CNT : std_logic_vector(7 downto 0) := (others => '0'); + -------- CPU RAM ---------------------------- + signal W_CPU_RAM_DO : std_logic_vector(7 downto 0) := (others => '0'); + -------- ADDRESS DECDER ---------------------- + signal W_BD_G : std_logic := '0'; + signal W_CPU_RAM_CS : std_logic := '0'; + signal W_CPU_RAM_RD : std_logic := '0'; +-- signal W_CPU_RAM_WR : std_logic := '0'; + signal W_CPU_ROM_CS : std_logic := '0'; + signal W_DIP_OE : std_logic := '0'; + signal W_H_FLIP : std_logic := '0'; + signal W_DRIVER_WE : std_logic := '0'; + signal W_OBJ_RAM_RD : std_logic := '0'; + signal W_OBJ_RAM_RQ : std_logic := '0'; + signal W_OBJ_RAM_WR : std_logic := '0'; + signal W_PITCH : std_logic := '0'; + signal W_SOUND_WE : std_logic := '0'; + signal W_STARS_ON : std_logic := '0'; + signal W_STARS_OFFn : std_logic := '0'; + signal W_SW0_OE : std_logic := '0'; + signal W_SW1_OE : std_logic := '0'; + signal W_V_FLIP : std_logic := '0'; + signal W_VID_RAM_RD : std_logic := '0'; + signal W_VID_RAM_WR : std_logic := '0'; + signal W_WDR_OE : std_logic := '0'; + --------- INPORT ----------------------------- + signal W_SW_DO : std_logic_vector( 7 downto 0) := (others => '0'); + --------- VIDEO ----------------------------- + signal W_VID_DO : std_logic_vector( 7 downto 0) := (others => '0'); + ----- DATA I/F ------------------------------------- + signal W_CPU_ROM_DO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_ROM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_RAM_CLK : std_logic := '0'; + signal W_VOL1 : std_logic := '0'; + signal W_VOL2 : std_logic := '0'; + signal W_FIRE : std_logic := '0'; + signal W_HIT : std_logic := '0'; + signal W_FS : std_logic_vector( 2 downto 0) := (others => '0'); + + signal blx_comb : std_logic := '0'; + signal W_1VF : std_logic := '0'; + signal W_256HnX : std_logic := '0'; + signal W_8HF : std_logic := '0'; + signal W_DAC_A : std_logic := '0'; + signal W_DAC_B : std_logic := '0'; + signal W_MISSILEn : std_logic := '0'; + signal W_SHELLn : std_logic := '0'; + signal W_MS_D : std_logic := '0'; + signal W_MS_R : std_logic := '0'; + signal W_MS_G : std_logic := '0'; + signal W_MS_B : std_logic := '0'; + + signal new_sw : std_logic_vector( 2 downto 0) := (others => '0'); + signal in_game : std_logic_vector( 1 downto 0) := (others => '0'); + signal ROM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal rst_count : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_STARS_B : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_G : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_R : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VIDEO_B : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_G : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_R : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_WAV_A0 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A1 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A2 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D2 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_DAC : std_logic_vector( 3 downto 0) := (others => '0'); + +begin + mc_vid : entity work.MC_VIDEO + port map( + I_CLK_18M => W_CLK_18M, + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT => W_H_CNT, + I_V_CNT => W_V_CNT, + I_H_FLIP => W_H_FLIP, + I_V_FLIP => W_V_FLIP, + I_V_BLn => W_V_BLn, + I_C_BLn => W_C_BLn, + I_A => W_A(9 downto 0), + I_OBJ_SUB_A => "000", + I_BD => W_BDI, + I_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + I_OBJ_RAM_RD => W_OBJ_RAM_RD, + I_OBJ_RAM_WR => W_OBJ_RAM_WR, + I_VID_RAM_RD => W_VID_RAM_RD, + I_VID_RAM_WR => W_VID_RAM_WR, + I_DRIVER_WR => W_DRIVER_WE, + O_C_BLnX => W_C_BLnX, + O_8HF => W_8HF, + O_256HnX => W_256HnX, + O_1VF => W_1VF, + O_MISSILEn => W_MISSILEn, + O_SHELLn => W_SHELLn, + O_BD => W_VID_DO, + O_VID => W_VID, + O_COL => W_COL + ); + + cpu : entity work.T80as + port map ( + RESET_n => W_RESETn, + CLK_n => W_CPU_CLK, + WAIT_n => W_CPU_WAITn, + INT_n => '1', + NMI_n => W_CPU_NMIn, + BUSRQ_n => '1', + MREQ_n => W_CPU_MREQn, + RD_n => W_CPU_RDn, + WR_n => W_CPU_WRn, + RFSH_n => W_CPU_RFSHn, + A => W_A, + DI => W_BDO, + DO => W_BDI, + M1_n => open, + IORQ_n => open, + HALT_n => open, + BUSAK_n => open, + DOE => open + ); + + mc_cpu_ram : entity work.MC_CPU_RAM + port map ( + I_CLK => W_CPU_RAM_CLK, + I_ADDR => W_A(9 downto 0), + I_D => W_BDI, + I_WE => W_CPU_WR, + I_OE => W_CPU_RAM_RD, + O_D => W_CPU_RAM_DO + ); + + mc_adec : entity work.MC_ADEC + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_CPU_CLK => W_CPU_CLK, + I_RSTn => W_RESETn, + + I_CPU_A => W_A, + I_CPU_D => W_BDI(0), + I_MREQn => W_CPU_MREQn, + I_RFSHn => W_CPU_RFSHn, + I_RDn => W_CPU_RDn, + I_WRn => W_CPU_WRn, + I_H_BL => W_H_BL, + I_V_BLn => W_V_BLn, + + O_WAITn => W_CPU_WAITn, + O_NMIn => W_CPU_NMIn, + O_CPU_ROM_CS => W_CPU_ROM_CS, + O_CPU_RAM_RD => W_CPU_RAM_RD, +-- O_CPU_RAM_WR => W_CPU_RAM_WR, + O_CPU_RAM_CS => W_CPU_RAM_CS, + O_OBJ_RAM_RD => W_OBJ_RAM_RD, + O_OBJ_RAM_WR => W_OBJ_RAM_WR, + O_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + O_VID_RAM_RD => W_VID_RAM_RD, + O_VID_RAM_WR => W_VID_RAM_WR, + O_SW0_OE => W_SW0_OE, + O_SW1_OE => W_SW1_OE, + O_DIP_OE => W_DIP_OE, + O_WDR_OE => W_WDR_OE, + O_DRIVER_WE => W_DRIVER_WE, + O_SOUND_WE => W_SOUND_WE, + O_PITCH => W_PITCH, + O_H_FLIP => W_H_FLIP, + O_V_FLIP => W_V_FLIP, + O_BD_G => W_BD_G, + O_STARS_ON => W_STARS_ON + ); + + -- active high buttons + mc_inport : entity work.MC_INPORT + port map ( + I_COIN1 => P1_CSJUDLR(6), + I_COIN2 => P2_CSJUDLR(6), + I_1P_START => P1_CSJUDLR(5), + I_2P_START => P2_CSJUDLR(5), + I_1P_SH => P1_CSJUDLR(4), + I_2P_SH => P2_CSJUDLR(4), + I_1P_LE => P1_CSJUDLR(1), + I_2P_LE => P2_CSJUDLR(1), + I_1P_RI => P1_CSJUDLR(0), + I_2P_RI => P2_CSJUDLR(0), + I_SW0_OE => W_SW0_OE, + I_SW1_OE => W_SW1_OE, + I_DIP_OE => W_DIP_OE, + O_D => W_SW_DO + ); + + mc_hv : entity work.MC_HV_COUNT + port map( + I_CLK => W_CLK_6M, + I_RSTn => W_RESETn, + O_H_CNT => W_H_CNT, + O_H_SYNC => W_H_SYNC_int, + O_H_BL => W_H_BL, + O_V_CNT => W_V_CNT, + O_V_SYNC => W_V_SYNC_int, + O_V_BL2n => W_V_BL2n, + O_V_BLn => W_V_BLn, + O_C_BLn => W_C_BLn + ); + + mc_col_pal : entity work.MC_COL_PAL + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_VID => W_VID, + I_COL => W_COL, + I_C_BLnX => W_C_BLnX, + O_C_BLXn => W_C_BLXn, + O_STARS_OFFn => W_STARS_OFFn, + O_R => W_VIDEO_R, + O_G => W_VIDEO_G, + O_B => W_VIDEO_B + ); + + mc_stars : entity work.MC_STARS + port map ( + I_CLK_18M => W_CLK_18M, + I_CLK_6M => W_CLK_6M, + I_H_FLIP => W_H_FLIP, + I_V_SYNC => W_V_SYNC_int, + I_8HF => W_8HF, + I_256HnX => W_256HnX, + I_1VF => W_1VF, + I_2V => W_V_CNT(1), + I_STARS_ON => W_STARS_ON, + I_STARS_OFFn => W_STARS_OFFn, + O_R => W_STARS_R, + O_G => W_STARS_G, + O_B => W_STARS_B, + O_NOISE => open + ); + + mc_sound_a : entity work.MC_SOUND_A + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT1 => W_H_CNT(1), + I_BD => W_BDI, + I_PITCH => W_PITCH, + I_VOL1 => W_VOL1, + I_VOL2 => W_VOL2, + O_SDAT => W_SDAT_A, + O_DO => open + ); + + vmc_sound_b : entity work.MC_SOUND_B + port map( + I_CLK1 => W_CLK_6M, + I_RSTn => rst_count(3), + I_SW => new_sw, + I_DAC => W_DAC, + I_FS => W_FS, + O_SDAT => W_SDAT_B + ); + +--------- ROM ------------------------------------------------------- + mc_roms : entity work.ROM_PGM_0 + port map ( + CLK => W_CLK_12M, + ADDR => W_A(13 downto 0), + DATA => W_CPU_ROM_DO + ); + +-------- VIDEO ----------------------------- + blx_comb <= not ( W_C_BLXn and W_V_BL2n ); + W_V_SYNC <= not W_V_SYNC_int; + W_H_SYNC <= not W_H_SYNC_int; + O_CMPBL <= W_C_BLnX; + + -- MISSILE => Yellow ; + -- SHELL => White ; + W_MS_D <= not (W_MISSILEn and W_SHELLn); + W_MS_R <= not blx_comb and W_MS_D; + W_MS_G <= not blx_comb and W_MS_D; + W_MS_B <= not blx_comb and W_MS_D and not W_SHELLn ; + + W_R <= W_VIDEO_R or (W_STARS_R & "0") or (W_MS_R & W_MS_R & "0"); + W_G <= W_VIDEO_G or (W_STARS_G & "0") or (W_MS_G & W_MS_G & "0"); + W_B <= W_VIDEO_B or (W_STARS_B & "0") or (W_MS_B & W_MS_B & "0"); + + process(W_CLK_6M) + begin + if rising_edge(W_CLK_6M) then + HBLANK <= not W_C_BLXn; + VBLANK <= not W_V_BL2n; + end if; + end process; + + +----- CPU I/F ------------------------------------- + + W_CPU_CLK <= W_H_CNT(0); + W_CPU_RAM_CLK <= W_CLK_12M and W_CPU_RAM_CS; + + W_CPU_ROM_DOB <= W_CPU_ROM_DO when W_CPU_ROM_CS = '1' else (others=>'0'); + + W_RESETn <= not I_RESET; + W_BDO <= W_SW_DO or W_VID_DO or W_CPU_RAM_DO or W_CPU_ROM_DOB ; + W_CPU_WR <= not W_CPU_WRn; + + new_sw <= (W_FS(2) or W_FS(1) or W_FS(0)) & W_HIT & W_FIRE; + + process(W_CPU_CLK, I_RESET) + begin + if (I_RESET = '1') then + rst_count <= (others => '0'); + elsif rising_edge( W_CPU_CLK) then + if ( rst_count /= x"f") then + rst_count <= rst_count + 1; + end if; + end if; + end process; + +----- Parts 9L --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_FS <= (others=>'0'); + W_HIT <= '0'; + W_FIRE <= '0'; + W_VOL1 <= '0'; + W_VOL2 <= '0'; + elsif rising_edge(W_CLK_12M) then + if (W_SOUND_WE = '1') then + case(W_A(2 downto 0)) is + when "000" => W_FS(0) <= W_BDI(0); + when "001" => W_FS(1) <= W_BDI(0); + when "010" => W_FS(2) <= W_BDI(0); + when "011" => W_HIT <= W_BDI(0); +-- when "100" => UNUSED <= W_BDI(0); + when "101" => W_FIRE <= W_BDI(0); + when "110" => W_VOL1 <= W_BDI(0); + when "111" => W_VOL2 <= W_BDI(0); + when others => null; + end case; + end if; + end if; + end process; + +----- Parts 9M --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_DAC <= (others=>'0'); + elsif rising_edge(W_CLK_12M) then + if (W_DRIVER_WE = '1') then + case(W_A(2 downto 0)) is + -- next 4 outputs go off board via ULN2075 buffer +-- when "000" => 1P START <= W_BDI(0); +-- when "001" => 2P START <= W_BDI(0); +-- when "010" => COIN LOCK <= W_BDI(0); +-- when "011" => COIN CTR <= W_BDI(0); + when "100" => W_DAC(0) <= W_BDI(0); -- 1M + when "101" => W_DAC(1) <= W_BDI(0); -- 470K + when "110" => W_DAC(2) <= W_BDI(0); -- 220K + when "111" => W_DAC(3) <= W_BDI(0); -- 100K + when others => null; + end case; + end if; + end if; + end process; + +------------------------------------------------------------------------------- +end RTL; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/hq2x.sv b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_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/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/keyboard.v b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_adec.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_adec.vhd new file mode 100644 index 00000000..7245ce8c --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_adec.vhd @@ -0,0 +1,251 @@ +--------------------------------------------------------------------- +-- FPGA GALAXIAN ADDRESS DECDER +-- +-- Version : 2.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +--------------------------------------------------------------------- +-- +--GALAXIAN Address Map +-- +-- Address Item(R..read-mode W..wight-mode) Parts +--0000 - 1FFF CPU-ROM..R ( 7H or 7K ) +--2000 - 3FFF CPU-ROM..R ( 7L ) +--4000 - 47FF CPU-RAM..RW ( 7N & 7P ) +--5000 - 57FF VID-RAM..RW +--5800 - 5FFF OBJ-RAM..RW +--6000 - SW0..R LAMP......W +--6800 - SW1..R SOUND.....W +--7000 - DIP..R +--7001 NMI_ON....W +--7004 STARS_ON..W +--7006 H_FLIP....W +--7007 V-FLIP....W +--7800 WDR..R PITCH.....W +-- +--W MODE +--6000 1P START +--6001 2P START +--6002 COIN LOCKOUT +--6003 COIN COUNTER +--6004 - 6007 SOUND CONTROL(OSC) +-- +--6800 SOUND CONTROL(FS1) +--6801 SOUND CONTROL(FS2) +--6802 SOUND CONTROL(FS3) +--6803 SOUND CONTROL(HIT) +--6805 SOUND CONTROL(SHOT) +--6806 SOUND CONTROL(VOL1) +--6807 SOUND CONTROL(VOL2) +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_ADEC is + port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_CPU_CLK : in std_logic; + I_RSTn : in std_logic; + + I_CPU_A : in std_logic_vector(15 downto 0); + I_CPU_D : in std_logic; + I_MREQn : in std_logic; + I_RFSHn : in std_logic; + I_RDn : in std_logic; + I_WRn : in std_logic; + I_H_BL : in std_logic; + I_V_BLn : in std_logic; + + O_WAITn : out std_logic; + O_NMIn : out std_logic; + O_CPU_ROM_CS : out std_logic; + O_CPU_RAM_RD : out std_logic; + O_CPU_RAM_WR : out std_logic; + O_CPU_RAM_CS : out std_logic; + O_OBJ_RAM_RD : out std_logic; + O_OBJ_RAM_WR : out std_logic; + O_OBJ_RAM_RQ : out std_logic; + O_VID_RAM_RD : out std_logic; + O_VID_RAM_WR : out std_logic; + O_SW0_OE : out std_logic; + O_SW1_OE : out std_logic; + O_DIP_OE : out std_logic; + O_WDR_OE : out std_logic; + O_DRIVER_WE : out std_logic; + O_SOUND_WE : out std_logic; + O_PITCH : out std_logic; + O_H_FLIP : out std_logic; + O_V_FLIP : out std_logic; + O_BD_G : out std_logic; + O_STARS_ON : out std_logic + ); +end; + +architecture RTL of MC_ADEC is + signal W_8E1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8E2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8P_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8M_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_9N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_NMI_ONn : std_logic := '0'; + -------- CPU WAITn ---------------------------------------------- +-- signal W_6S1_Q : std_logic := '0'; + signal W_6S1_Qn : std_logic := '0'; +-- signal W_6S2_Qn : std_logic := '0'; + + signal W_V_BL : std_logic := '0'; + +begin + W_NMI_ONn <= W_9N_Q(1); -- galaxian + +-- O_WAITn <= '1' ; -- No Wait + O_WAITn <= W_6S1_Qn; + + process(I_CPU_CLK, I_V_BLn) + begin + if (I_V_BLn = '0') then +-- W_6S1_Q <= '0'; + W_6S1_Qn <= '1'; + elsif rising_edge(I_CPU_CLK) then +-- W_6S1_Q <= not (I_H_BL or W_8P_Q(2)); + W_6S1_Qn <= I_H_BL or W_8P_Q(2); + end if; + end process; + +-- process(I_CPU_CLK) +-- begin +-- if falling_edge(I_CPU_CLK) then +-- W_6S2_Qn <= not W_6S1_Q; +-- end if; +-- end process; + +-------- CPU NMIn ----------------------------------------------- + W_V_BL <= not I_V_BLn; + process(W_V_BL, W_NMI_ONn) + begin + if (W_NMI_ONn = '0') then + O_NMIn <= '1'; + elsif rising_edge(W_V_BL) then + O_NMIn <= '0'; + end if; + end process; + + ------------------------------------------------------------------- + u_8e1 : entity work.LOGIC_74XX139 + port map ( + I_G => I_MREQn, + I_Sel(1) => I_CPU_A(15), + I_Sel(0) => I_CPU_A(14), + O_Q => W_8E1_Q + ); + + ---------- CPU_ROM CS 0000 - 3FFF --------------------------- + u_8e2 : entity work.LOGIC_74XX139 + port map ( + I_G => I_RDn, + I_Sel(1) => W_8E1_Q(0), + I_Sel(0) => I_CPU_A(13), + O_Q => W_8E2_Q + ); + + O_CPU_ROM_CS <= not (W_8E2_Q(0) and W_8E2_Q(1) ) ; -- 0000 - 3FFF + ------------------------------------------------------------------- + -- ADDRESS + -- W_8E1_Q[0] = 0000 - 3FFF ---- CPU_ROM_USE + -- W_8E1_Q[1] = 4000 - 7FFF ---- GALAXIAN USE *1 + -- W_8E1_Q[2] = 8000 - BFFF ---- MOONCREST USE + -- W_8E1_Q[3] = C000 - FFFF + + u_8p : entity work.LOGIC_74XX138 + port map ( + I_G1 => I_RFSHn, + I_G2a => W_8E1_Q(1), -- <= *1 + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8P_Q + ); + + u_8n : entity work.LOGIC_74XX138 + port map ( + I_G1 => '1', + I_G2a => I_RDn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8N_Q + ); + + u_8m : entity work.LOGIC_74XX138 + port map ( + -- I_G1 => W_6S2_Qn, + I_G1 => '1', -- No Wait + I_G2a => I_WRn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8M_Q + ); + + O_BD_G <= not (W_8E1_Q(0) and W_8P_Q(0)); + O_OBJ_RAM_RQ <= not W_8P_Q(3); + + O_CPU_RAM_CS <= not (W_8N_Q(0) and W_8M_Q(0)); + + O_WDR_OE <= not W_8N_Q(7); + O_DIP_OE <= not W_8N_Q(6); + O_SW1_OE <= not W_8N_Q(5); + O_SW0_OE <= not W_8N_Q(4); + O_OBJ_RAM_RD <= not W_8N_Q(3); + O_VID_RAM_RD <= not W_8N_Q(2); +-- UNUSED <= not W_8N_Q(1); + O_CPU_RAM_RD <= not W_8N_Q(0); + + O_PITCH <= not W_8M_Q(7); +-- STARS_ON_ENA <= not W_8M_Q(6); + O_SOUND_WE <= not W_8M_Q(5); + O_DRIVER_WE <= not W_8M_Q(4); + O_OBJ_RAM_WR <= not W_8M_Q(3); + O_VID_RAM_WR <= not W_8M_Q(2); +-- UNUSED <= not W_8M_Q(1); + O_CPU_RAM_WR <= not W_8M_Q(0); + + ----- Parts 9N --------- + + process(I_CLK_12M, I_RSTn) + begin + if (I_RSTn = '0') then + W_9N_Q <= (others => '0'); + elsif rising_edge(I_CLK_12M) then + if (W_8M_Q(6) = '0') then + case I_CPU_A(2 downto 0) is + when "000" => W_9N_Q(0) <= I_CPU_D; + when "001" => W_9N_Q(1) <= I_CPU_D; + when "010" => W_9N_Q(2) <= I_CPU_D; + when "011" => W_9N_Q(3) <= I_CPU_D; + when "100" => W_9N_Q(4) <= I_CPU_D; + when "101" => W_9N_Q(5) <= I_CPU_D; + when "110" => W_9N_Q(6) <= I_CPU_D; + when "111" => W_9N_Q(7) <= I_CPU_D; + when others => null; + end case; + end if; + end if; + end process; + + O_STARS_ON <= W_9N_Q(4); + O_H_FLIP <= W_9N_Q(6); + O_V_FLIP <= W_9N_Q(7); + +end RTL; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_bram.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_bram.vhd new file mode 100644 index 00000000..a6df1ce1 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_bram.vhd @@ -0,0 +1,182 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA & GALAXIAN +-- FPGA BLOCK RAM I/F (XILINX SPARTAN) +-- +-- Version : 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- mc_col_rom(6L) added by k.Degawa +-- +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. K.Degawa +-- 2004- 9-18 added Xilinx Device K.Degawa +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_top.v use +entity MC_CPU_RAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(9 downto 0); + I_D : in std_logic_vector(7 downto 0); + I_WE : in std_logic; + I_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) + ); +end; +architecture RTL of MC_CPU_RAM is + + signal W_D : std_logic_vector(7 downto 0) := (others => '0'); +begin + O_D <= W_D when I_OE ='1' else (others=>'0'); + + ram_inst : work.spram generic map(10,8) + port map + ( + address => I_ADDR, + clock => I_CLK, + data => I_D, + wren => I_WE, + q => W_D + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_OBJ_RAM is + port( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(7 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(7 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); + end; + +architecture RTL of MC_OBJ_RAM is +begin + + ram_inst : work.dpram generic map(8,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_VID_RAM is + port ( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(9 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(9 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of MC_VID_RAM is +begin + ram_inst : work.dpram generic map(10,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_LRAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(7 downto 0); + I_D : in std_logic_vector(4 downto 0); + I_WE : in std_logic; + O_Dn : out std_logic_vector(4 downto 0) + ); +end; + +architecture RTL of MC_LRAM is + signal W_D : std_logic_vector(4 downto 0) := (others => '0'); +begin + + O_Dn <= not W_D; + + ram_inst : work.dpram generic map(8,5) + port map + ( + clock_a => I_CLK, + address_a => I_ADDR, + data_a => I_D, + wren_a => not I_WE, + + clock_b => not I_CLK, + address_b => I_ADDR, + data_b => (others => '0'), + q_b => W_D, + enable_b => '1', + wren_b => '0' + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_clocks.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_clocks.vhd new file mode 100644 index 00000000..014e6f7a --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_clocks.vhd @@ -0,0 +1,88 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA CLOCK GEN +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +----------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library unisim; + use unisim.vcomponents.all; + +entity CLOCKGEN is +port ( + CLKIN_IN : in std_logic; + RST_IN : in std_logic; + -- + O_CLK_24M : out std_logic; + O_CLK_18M : out std_logic; + O_CLK_12M : out std_logic; + O_CLK_06M : out std_logic +); +end; + +architecture RTL of CLOCKGEN is + signal state : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr1 : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr2 : std_logic_vector(2 downto 0) := (others => '0'); + signal CLKFB_IN : std_logic := '0'; + signal CLK0_BUF : std_logic := '0'; + signal CLKFX_BUF : std_logic := '0'; + signal CLK_72M : std_logic := '0'; + signal I_DCM_LOCKED : std_logic := '0'; + +begin + dcm_inst : DCM_SP + generic map ( + CLKFX_MULTIPLY => 9, + CLKFX_DIVIDE => 4, + CLKIN_PERIOD => 31.25 + ) + port map ( + CLKIN => CLKIN_IN, + CLKFB => CLKFB_IN, + RST => RST_IN, + CLK0 => CLK0_BUF, + CLKFX => CLKFX_BUF, + LOCKED => I_DCM_LOCKED + ); + + BUFG0 : BUFG port map (I=> CLK0_BUF, O => CLKFB_IN); + BUFG1 : BUFG port map (I=> CLKFX_BUF, O => CLK_72M); + O_CLK_06M <= ctr2(2); + O_CLK_12M <= ctr2(1); + O_CLK_24M <= ctr2(0); + O_CLK_18M <= ctr1(1); + + -- generate all clocks, 36Mhz, 18Mhz, 24Mhz, 12Mhz and 6Mhz + process(CLK_72M) + begin + if rising_edge(CLK_72M) then + if (I_DCM_LOCKED = '0') then + state <= "00"; + ctr1 <= (others=>'0'); + ctr2 <= (others=>'0'); + else + ctr1 <= ctr1 + 1; + case state is + when "00" => state <= "01"; ctr2 <= ctr2 + 1; + when "01" => state <= "10"; ctr2 <= ctr2 + 1; + when "10" => state <= "00"; + when "11" => state <= "00"; + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_col_pal.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_col_pal.vhd new file mode 100644 index 00000000..c4dc06ad --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_col_pal.vhd @@ -0,0 +1,78 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA COLOR-PALETTE +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-18 added Xilinx Device. K.Degawa +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; +-- use ieee.numeric_std.all; + +--library UNISIM; +-- use UNISIM.Vcomponents.all; + +entity MC_COL_PAL is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_VID : in std_logic_vector(1 downto 0); + I_COL : in std_logic_vector(2 downto 0); + I_C_BLnX : in std_logic; + + O_C_BLXn : out std_logic; + O_STARS_OFFn : out std_logic; + O_R : out std_logic_vector(2 downto 0); + O_G : out std_logic_vector(2 downto 0); + O_B : out std_logic_vector(2 downto 0) +); +end; + +architecture RTL of MC_COL_PAL is + --- Parts 6M -------------------------------------------------------- + signal W_COL_ROM_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6M_DI : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_DO : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_CLR : std_logic := '0'; + +begin + W_6M_DI <= I_COL(2 downto 0) & I_VID(1 downto 0) & not (I_VID(0) or I_VID(1)) & I_C_BLnX; + W_6M_CLR <= W_6M_DI(0) or W_6M_DO(0); + O_C_BLXn <= W_6M_DI(0) or W_6M_DO(0); + O_STARS_OFFn <= W_6M_DO(1); + +--always@(posedge I_CLK_6M or negedge W_6M_CLR) + process(I_CLK_6M, W_6M_CLR) + begin + if (W_6M_CLR = '0') then + W_6M_DO <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + W_6M_DO <= W_6M_DI; + end if; + end process; + + --- COL ROM -------------------------------------------------------- +--wire W_COL_ROM_OEn = W_6M_DO[1]; + + galaxian_6l : entity work.GALAXIAN_6L + port map ( + CLK => I_CLK_12M, + ADDR => W_6M_DO(6 downto 2), + DATA => W_COL_ROM_DO + ); + + --- VID OUT -------------------------------------------------------- + O_R <= W_COL_ROM_DO(2 downto 0); + O_G <= W_COL_ROM_DO(5 downto 3); + O_B <= W_COL_ROM_DO(7 downto 6) & "0"; + +end; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_hv_count.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_hv_count.vhd new file mode 100644 index 00000000..f310321b --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_hv_count.vhd @@ -0,0 +1,145 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA H & V COUNTER +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 +----------------------------------------------------------------------- +-- MoonCrest hv_count +-- H_CNT 0 - 255 , 384 - 511 Total 384 count +-- V_CNT 0 - 255 , 504 - 511 Total 264 count +------------------------------------------------------------------------------------------- +-- H_CNT[0], H_CNT[1], H_CNT[2], H_CNT[3], H_CNT[4], H_CNT[5], H_CNT[6], H_CNT[7], H_CNT[8], +-- 1 H 2 H 4 H 8 H 16 H 32 H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT[0], V_CNT[1], V_CNT[2], V_CNT[3], V_CNT[4], V_CNT[5], V_CNT[6], V_CNT[7] +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_HV_COUNT is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + O_H_CNT : out std_logic_vector(8 downto 0); + O_H_SYNC : out std_logic; + O_H_BL : out std_logic; + O_V_BL2n : out std_logic; + O_V_CNT : out std_logic_vector(7 downto 0); + O_V_SYNC : out std_logic; + O_V_BLn : out std_logic; + O_C_BLn : out std_logic + ); +end; + +architecture RTL of MC_HV_COUNT is + signal H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal V_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal H_SYNC : std_logic := '0'; + signal H_CLK : std_logic := '0'; + signal H_BL : std_logic := '0'; + signal V_BLn : std_logic := '0'; + signal V_BL2n : std_logic := '0'; + +begin +--------- H_COUNT ---------------------------------------- + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if (H_CNT = 255) then + H_CNT <= std_logic_vector(to_unsigned(384, H_CNT'length)); + else + H_CNT <= H_CNT + 1 ; + end if; + end if; + end process; + + O_H_CNT <= H_CNT; + +--------- H_SYNC ---------------------------------------- + H_CLK <= H_CNT(4); + process(H_CLK, H_CNT(8)) + begin + if (H_CNT(8) = '0') then + H_SYNC <= '0'; + elsif rising_edge(H_CLK) then + H_SYNC <= (not H_CNT(6) ) and H_CNT(5); + end if; + end process; + + O_H_SYNC <= H_SYNC; + +--------- H_BL ------------------------------------------ + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if H_CNT = 387 then + H_BL <= '1'; + elsif H_CNT = 503 then + H_BL <= '0'; + end if; + end if; + end process; + + O_H_BL <= H_BL; + +--------- V_COUNT ---------------------------------------- + process(H_SYNC, I_RSTn) + begin + if (I_RSTn = '0') then + V_CNT <= (others => '0'); + elsif rising_edge(H_SYNC) then + if (V_CNT = 255) then + V_CNT <= std_logic_vector(to_unsigned(504, V_CNT'length)); + else + V_CNT <= V_CNT + 1 ; + end if; + end if; + end process; + + O_V_CNT <= V_CNT(7 downto 0); + O_V_SYNC <= V_CNT(8); + +--------- V_BLn ------------------------------------------ + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BLn <= '0'; + elsif V_CNT(7 downto 0) = 15 then + V_BLn <= '1'; + end if; + end if; + end process; + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BL2n <= '0'; + elsif V_CNT(7 downto 0) = 16 then + V_BL2n <= '1'; + end if; + end if; + end process; + + O_V_BLn <= V_BLn; + O_V_BL2n <= V_BL2n; +------- C_BLn ------------------------------------------ + O_C_BLn <= V_BLn and (not H_CNT(8)); + +end; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_inport.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_inport.vhd new file mode 100644 index 00000000..69a20cbe --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_inport.vhd @@ -0,0 +1,74 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA INPORT +-- +-- Version : 1.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004-4-30 galaxian modify by K.DEGAWA +----------------------------------------------------------------------- + +-- DIP SW 0 1 2 3 4 5 +----------------------------------------------------------------- +-- COIN CHUTE +-- 1 COIN/1 PLAY 1'b0 1'b0 +-- 2 COIN/1 PLAY 1'b1 1'b0 +-- 1 COIN/2 PLAY 1'b0 1'b1 +-- FREE PLAY 1'b1 1'b1 +-- BOUNS +-- 1'b0 1'b0 +-- 1'b1 1'b0 +-- 1'b0 1'b1 +-- 1'b1 1'b1 +-- LIVES +-- 2 1'b0 +-- 3 1'b1 +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_INPORT is +port ( + I_COIN1 : in std_logic; -- active high + I_COIN2 : in std_logic; -- active high + I_1P_LE : in std_logic; -- active high + I_1P_RI : in std_logic; -- active high + I_1P_SH : in std_logic; -- active high + I_2P_LE : in std_logic; + I_2P_RI : in std_logic; + I_2P_SH : in std_logic; + I_1P_START : in std_logic; -- active high + I_2P_START : in std_logic; -- active high + I_SW0_OE : in std_logic; + I_SW1_OE : in std_logic; + I_DIP_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) +); + +end; + +architecture RTL of MC_INPORT is + + constant W_TABLE : std_logic := '0'; -- UP = 0; + constant W_TEST : std_logic := '0'; + constant W_SERVICE : std_logic := '0'; + + signal W_SW0_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SW1_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_DIP_DO : std_logic_vector(7 downto 0) := (others => '0'); + +begin + + W_SW0_DO <= x"00" when I_SW0_OE = '0' else W_SERVICE & W_TEST & W_TABLE & I_1P_SH & I_1P_RI & I_1P_LE & I_COIN2 & I_COIN1; + W_SW1_DO <= x"00" when I_SW1_OE = '0' else "000" & I_2P_SH & I_2P_RI & I_2P_LE & I_2P_START & I_1P_START; + W_DIP_DO <= x"00" when I_DIP_OE = '0' else "00000100"; + O_D <= W_SW0_DO or W_SW1_DO or W_DIP_DO ; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_ld_pls.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_ld_pls.vhd new file mode 100644 index 00000000..0945fe35 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_ld_pls.vhd @@ -0,0 +1,115 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA VIDEO-LD_PLS_GEN +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_LD_PLS is + port ( + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_3D_DI : in std_logic; + + O_LDn : out std_logic; + O_CNTRLDn : out std_logic; + O_CNTRCLRn : out std_logic; + O_COLLn : out std_logic; + O_VPLn : out std_logic; + O_OBJDATALn : out std_logic; + O_MLDn : out std_logic; + O_SLDn : out std_logic + ); +end; + +architecture RTL of MC_LD_PLS is + signal W_4C1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C1_Q3 : std_logic := '0'; + signal W_4C2_B : std_logic := '0'; + signal W_4D1_G : std_logic := '0'; + signal W_4D1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4D2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_5C_Q : std_logic := '0'; + signal W_HCNT : std_logic := '0'; +begin + O_LDn <= W_4D1_G; + O_CNTRLDn <= W_4D1_Q(2); + O_CNTRCLRn <= W_4D1_Q(0); + O_COLLn <= W_4D2_Q(2); + O_VPLn <= W_4D2_Q(0); + O_OBJDATALn <= W_4C1_Q(2); + O_MLDn <= W_4C2_Q(0); + O_SLDn <= W_4C2_Q(1); + W_4D1_G <= not (I_H_CNT(0) and I_H_CNT(1) and I_H_CNT(2)); + W_HCNT <= not (I_H_CNT(6) and I_H_CNT(5) and I_H_CNT(4) and I_H_CNT(3)); + -- Parts 4D + u_4d1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_G, + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q =>W_4D1_Q + ); + + u_4d2 : entity work.LOGIC_74XX139 + port map( + I_G => W_5C_Q, + I_Sel(1) => I_H_CNT(2), + I_Sel(0) => I_H_CNT(1), + O_Q => W_4D2_Q + ); + + -- Parts 4C + u_4c1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D2_Q(1), + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q => W_4C1_Q + ); + + u_4c2 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_Q(3), + I_Sel(1) => W_4C2_B, + I_Sel(0) => W_HCNT, + O_Q => W_4C2_Q + ); + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_5C_Q <= I_H_CNT(0); + end if; + end process; + + -- 2004-9-22 added + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + W_4C1_Q3 <= W_4C1_Q(3); + end if; + end process; + + process(W_4C1_Q3) + begin + if rising_edge(W_4C1_Q3) then + W_4C2_B <= I_3D_DI; + end if; + end process; + +end RTL; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_logic.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_logic.vhd new file mode 100644 index 00000000..5dae8a87 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_logic.vhd @@ -0,0 +1,92 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA LOGIC IP MODULE +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx138 +-- 3-to-8 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX138 is + port ( + I_G1 : in std_logic; + I_G2a : in std_logic; + I_G2b : in std_logic; + I_Sel : in std_logic_vector(2 downto 0); + O_Q : out std_logic_vector(7 downto 0) + ); +end logic_74xx138; + +architecture RTL of LOGIC_74XX138 is + signal I_G : std_logic_vector(2 downto 0) := (others => '0'); + +begin + I_G <= I_G1 & I_G2a & I_G2b; + + xx138 : process(I_G, I_Sel) + begin + if(I_G = "100" ) then + case I_Sel is + when "000" => O_Q <= "11111110"; + when "001" => O_Q <= "11111101"; + when "010" => O_Q <= "11111011"; + when "011" => O_Q <= "11110111"; + when "100" => O_Q <= "11101111"; + when "101" => O_Q <= "11011111"; + when "110" => O_Q <= "10111111"; + when "111" => O_Q <= "01111111"; + when others => null; + end case; + else + O_Q <= (others => '1'); + end if; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx139 +-- 2-to-4 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX139 is + port ( + I_G : in std_logic; + I_Sel : in std_logic_vector(1 downto 0); + O_Q : out std_logic_vector(3 downto 0) + ); +end; + +architecture RTL of LOGIC_74XX139 is +begin + xx139 : process (I_G, I_Sel) + begin + if I_G = '0' then + case I_Sel is + when "00" => O_Q <= "1110"; + when "01" => O_Q <= "1101"; + when "10" => O_Q <= "1011"; + when "11" => O_Q <= "0111"; + when others => null; + end case; + else + O_Q <= "1111"; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_missile.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_missile.vhd new file mode 100644 index 00000000..c5aa6633 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_missile.vhd @@ -0,0 +1,107 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA VIDEO-MISSILE +---- +---- Version : 2.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_MISSILE is + port( + I_CLK_6M : in std_logic; + I_CLK_18M : in std_logic; + I_C_BLn_X : in std_logic; + I_MLDn : in std_logic; + I_SLDn : in std_logic; + I_HPOS : in std_logic_vector (7 downto 0); + + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic + ); +end; + +architecture RTL of MC_MISSILE is + signal W_45R_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_45S_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_5P1_Q : std_logic := '0'; + signal W_5P2_Q : std_logic := '0'; + signal W_5P1_CLK : std_logic := '0'; + signal W_5P2_CLK : std_logic := '0'; +begin + + O_MISSILEn <= W_5P1_CLK; + O_SHELLn <= W_5P2_CLK; + + -- missile counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if (I_MLDn = '0') then + W_45R_Q <= I_HPOS; + else + if (I_C_BLn_X = '1') then + W_45R_Q <= W_45R_Q + 1; + if (W_45R_Q(7 downto 2) = "111111") and W_5P1_Q = '1' then + W_5P1_CLK <= '0'; + else + W_5P1_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- shell counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if(I_SLDn = '0') then + W_45S_Q <= I_HPOS; + else + if(I_C_BLn_X = '1') then + W_45S_Q <= W_45S_Q + 1; + if (W_45S_Q(7 downto 2) = "111111") and W_5P2_Q = '1' then + W_5P2_CLK <= '0'; + else + W_5P2_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_MLDn) and clock active on rising edge (W_5P1_CLK) + process(W_5P1_CLK, I_MLDn) + begin + if (I_MLDn = '0') then + W_5P1_Q <= '1'; + elsif rising_edge(W_5P1_CLK) then + W_5P1_Q <= '0'; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_SLDn) and clock active on rising edge (W_5P2_CLK) + process(W_5P2_CLK, I_SLDn) + begin + if (I_SLDn = '0') then + W_5P2_Q <= '1'; + elsif rising_edge(W_5P2_CLK) then + W_5P2_Q <= '0'; + end if; + end process; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_sound_a.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_sound_a.vhd new file mode 100644 index 00000000..ee0c66be --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_sound_a.vhd @@ -0,0 +1,117 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA SOUND I/F +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + use IEEE.std_logic_arith.all; + +entity MC_SOUND_A is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT1 : in std_logic; + I_BD : in std_logic_vector(7 downto 0); + I_PITCH : in std_logic; + I_VOL1 : in std_logic; + I_VOL2 : in std_logic; + + O_SDAT : out std_logic_vector(7 downto 0); + O_DO : out std_logic_vector(3 downto 0) +); +end; + +architecture RTL of MC_SOUND_A is + signal W_PITCH : std_logic := '0'; + signal W_89K_LDn : std_logic := '0'; + signal W_89K_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_89K_LDATA : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6T_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_SDAT0 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT2 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT3 : std_logic_vector(7 downto 0) := (others => '0'); + +begin + O_DO <= W_6T_Q; + + process (I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_PITCH <= I_PITCH; + if (W_89K_Q = x"ff") then + W_89K_LDn <= '0' ; + else + W_89K_LDn <= '1' ; + end if; + end if; + end process; + + -- Parts 9J + process (W_PITCH) + begin + if falling_edge(W_PITCH) then + W_89K_LDATA <= I_BD; + end if; + end process; + + process (I_H_CNT1) + begin + if rising_edge(I_H_CNT1) then + if (W_89K_LDn = '0') then + W_89K_Q <= W_89K_LDATA; + else + W_89K_Q <= W_89K_Q + 1; + end if; + end if; + end process; + + process (W_89K_LDn) + begin + if falling_edge(W_89K_LDn) then + W_6T_Q <= W_6T_Q + 1; + end if; + end process; + + process (I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + O_SDAT <= (x"14" + W_SDAT3) + (W_SDAT0 + W_SDAT2); + + if W_6T_Q(0)='1' then + W_SDAT0 <= x"2a"; + else + W_SDAT0 <= (others => '0'); + end if; + + if W_6T_Q(2)='1' then + if I_VOL1 = '1' then + W_SDAT2 <= x"69"; + else + W_SDAT2 <= x"39"; + end if; + else + W_SDAT2 <= (others => '0'); + end if; + + if (W_6T_Q(3)='1') and (I_VOL2 = '1') then + W_SDAT3 <= x"48" ; + else + W_SDAT3 <= (others => '0'); + end if; + + end if; + end process; + +end; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_sound_b.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_sound_b.vhd new file mode 100644 index 00000000..b74e4bb1 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_sound_b.vhd @@ -0,0 +1,253 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA WAVE SOUND +---- +---- Version : 1.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does no guarantee this program. +---- You can use this at your own risk. +---- +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--pragma translate_off +-- use ieee.std_logic_textio.all; +-- use std.textio.all; +--pragma translate_on + +entity MC_SOUND_B is + port( + I_CLK1 : in std_logic; -- 6MHz + I_RSTn : in std_logic; + I_SW : in std_logic_vector( 2 downto 0); + I_DAC : in std_logic_vector( 3 downto 0); + I_FS : in std_logic_vector( 2 downto 0); + O_SDAT : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_B is +constant sample_time : integer := 557; -- sample time : 557 = 11025Hz, 557/2 = 22050Hz +constant fire_cnt : std_logic_vector(15 downto 0) := x"2000"; +constant hit_cnt : std_logic_vector(15 downto 0) := x"2000"; + +signal sample : std_logic_vector(10 downto 0) := (others => '0'); +signal sample_pls : std_logic := '0'; +signal s0_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s0_trg : std_logic := '0'; +signal s1_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s1_trg : std_logic := '0'; +signal fire_addr : std_logic_vector(15 downto 0) := (others => '0'); +signal hit_addr : std_logic_vector(15 downto 0) := (others => '0'); + +signal WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); +signal WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + +signal W_VCO1_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO1_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal VCO_CTR : std_logic_vector(24 downto 0) := (others => '0'); + +signal SDAT : std_logic_vector(10 downto 0) := (others => '0'); + +begin + -- ideally we should divide by 5 because this is the sum of 5 channels + -- but in practice we divide by 4 and just clip sounds that are too loud. + O_SDAT <= SDAT(9 downto 2) when SDAT(10) = '0' else (others=>'1'); -- clip overrange sounds + + process(I_CLK1) + begin + if rising_edge(I_CLK1) then + SDAT <= ("000" & W_VCO3_OUT) + ( ( ("000" & W_VCO2_OUT) + ("000" & W_VCO1_OUT) ) + ( ("000" & WAV_D0) + ("000" & WAV_D1) ) ); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + sample <= (others => '0'); + sample_pls <= '0'; + elsif rising_edge(I_CLK1) then + if (sample = sample_time - 1) then + sample <= (others => '0'); + sample_pls <= '1'; + else + sample <= sample + 1; + sample_pls <= '0'; + end if; + end if; + end process; + +------------- FIRE SOUND ------------------------------------------ + mc_roms_fire : entity work.GAL_FIR + port map ( + CLK => I_CLK1, + ADDR => fire_addr(12 downto 0), + DATA => WAV_D0 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s0_trg_ff <= (others => '0'); + s0_trg <= '0'; + elsif rising_edge(I_CLK1) then + s0_trg_ff(0) <= I_SW(0); + s0_trg_ff(1) <= s0_trg_ff(0); + s0_trg <= not s0_trg_ff(1) and s0_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + fire_addr <= fire_cnt; + elsif rising_edge(I_CLK1) then + if (s0_trg = '1') then + fire_addr <= (others => '0'); + else + if(sample_pls = '1') then + if(fire_addr <= fire_cnt) then + fire_addr <= fire_addr + 1; + else + fire_addr <= fire_addr ; + end if; + end if; + end if; + end if; + end process; + +------------- HIT SOUND ------------------------------------------ + mc_roms_hit : entity work.GAL_HIT + port map ( + CLK => I_CLK1, + ADDR => hit_addr(12 downto 0), + DATA => WAV_D1 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s1_trg_ff <= (others => '0'); + s1_trg <= '0'; + elsif rising_edge(I_CLK1) then + s1_trg_ff(0) <= I_SW(1); + s1_trg_ff(1) <= s1_trg_ff(0); + s1_trg <= not s1_trg_ff(1) and s1_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + hit_addr <= hit_cnt; + elsif rising_edge(I_CLK1) then + if (s1_trg = '1') then + hit_addr <= (others => '0'); + else + if (sample_pls = '1') then + if (hit_addr <= hit_cnt) then + hit_addr <= hit_addr + 1 ; + else + hit_addr <= hit_addr ; + end if; + end if; + end if; + end if; + end process; + +--------------- EFFECT SOUND --------------------------------------- + +-- 9R modulator voltage generator based on DAC value + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + VCO_CTR <= (others=>'0'); + elsif rising_edge(I_CLK1) then + VCO_CTR <= VCO_CTR + (not I_DAC); + end if; + end process; + + -- modulator frequency lookup tables for the three VCOs + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + elsif rising_edge(I_CLK1) then + case VCO_CTR(23 downto 19) is + when "00000" => W_VCO1_STEP <= x"2A"; W_VCO2_STEP <= x"3A"; W_VCO3_STEP <= x"54"; + when "00001" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"39"; W_VCO3_STEP <= x"53"; + when "00010" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"38"; W_VCO3_STEP <= x"52"; + when "00011" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"50"; + when "00100" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"4F"; + when "00101" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"36"; W_VCO3_STEP <= x"4E"; + when "00110" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"35"; W_VCO3_STEP <= x"4D"; + when "00111" => W_VCO1_STEP <= x"26"; W_VCO2_STEP <= x"34"; W_VCO3_STEP <= x"4C"; + when "01000" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"4A"; + when "01001" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"49"; + when "01010" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"32"; W_VCO3_STEP <= x"48"; + when "01011" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"31"; W_VCO3_STEP <= x"47"; + when "01100" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"30"; W_VCO3_STEP <= x"46"; + when "01101" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"44"; + when "01110" => W_VCO1_STEP <= x"22"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"43"; + when "01111" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2E"; W_VCO3_STEP <= x"42"; + when "10000" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2D"; W_VCO3_STEP <= x"41"; + when "10001" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2C"; W_VCO3_STEP <= x"40"; + when "10010" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3F"; + when "10011" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3D"; + when "10100" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2A"; W_VCO3_STEP <= x"3C"; + when "10101" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"29"; W_VCO3_STEP <= x"3B"; + when "10110" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"3A"; + when "10111" => W_VCO1_STEP <= x"1D"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"39"; + when "11000" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"27"; W_VCO3_STEP <= x"37"; + when "11001" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"26"; W_VCO3_STEP <= x"36"; + when "11010" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"25"; W_VCO3_STEP <= x"35"; + when "11011" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"34"; + when "11100" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"33"; + when "11101" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"23"; W_VCO3_STEP <= x"32"; + when "11110" => W_VCO1_STEP <= x"19"; W_VCO2_STEP <= x"22"; W_VCO3_STEP <= x"30"; + when "11111" => W_VCO1_STEP <= x"18"; W_VCO2_STEP <= x"21"; W_VCO3_STEP <= x"2F"; + when others => null; + end case; + end if; + end process; + +-- 8R VCO 240Hz - 140Hz (8) + mc_vco1 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(0), + I_STEP => W_VCO1_STEP, + O_WAV => W_VCO1_OUT + ); + +-- 8S VCO 330Hz - 190Hz (11) + mc_vco2 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(1), + I_STEP => W_VCO2_STEP, + O_WAV => W_VCO2_OUT + ); + +-- 8T VCO 480Hz - 270Hz (16) + mc_vco3 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(2), + I_STEP => W_VCO3_STEP, + O_WAV => W_VCO3_OUT + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_sound_vco.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_sound_vco.vhd new file mode 100644 index 00000000..e2a63e85 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_sound_vco.vhd @@ -0,0 +1,49 @@ +-------------------------------------------------------------------------------- +---- FPGA VCO +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +use work.sine_package.all; + +-- O_CLK = (I_CLK / 2^20) * I_STEP +entity MC_SOUND_VCO is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + I_FS : in std_logic; + I_STEP : in std_logic_vector( 7 downto 0); + O_WAV : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_VCO is + signal VCO1_CTR : std_logic_vector(19 downto 0) := (others => '0'); + signal sine : std_logic_vector(14 downto 0) := (others => '0'); + +begin + O_WAV <= sine(14 downto 7); + process(I_CLK, I_RSTn) + begin + if (I_RSTn = '0') then + VCO1_CTR <= (others=>'0'); + elsif rising_edge(I_CLK) then + if I_FS = '1' then + VCO1_CTR <= VCO1_CTR + I_STEP; + case VCO1_CTR(19 downto 18) is + when "00" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "01" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when "10" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "11" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_stars.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_stars.vhd new file mode 100644 index 00000000..b91197b3 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_stars.vhd @@ -0,0 +1,90 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA STARS +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity MC_STARS is + port ( + I_CLK_18M : in std_logic; + I_CLK_6M : in std_logic; + I_H_FLIP : in std_logic; + I_V_SYNC : in std_logic; + I_8HF : in std_logic; + I_256HnX : in std_logic; + I_1VF : in std_logic; + I_2V : in std_logic; + I_STARS_ON : in std_logic; + I_STARS_OFFn : in std_logic; + + O_R : out std_logic_vector(1 downto 0); + O_G : out std_logic_vector(1 downto 0); + O_B : out std_logic_vector(1 downto 0); + O_NOISE : out std_logic + ); +end; + +architecture RTL of MC_STARS is + signal CLK_1C : std_logic := '0'; + signal W_2D_Qn : std_logic := '0'; + + signal W_3B : std_logic := '0'; + signal noise : std_logic := '0'; + signal W_2A : std_logic := '0'; + signal W_4P : std_logic := '0'; + signal CLK_1AB : std_logic := '0'; + signal W_1AB_Q : std_logic_vector(15 downto 0) := (others => '0'); + signal W_1C_Q : std_logic_vector( 1 downto 0) := (others => '0'); +begin + O_R <= (W_1AB_Q( 9) & W_1AB_Q (8) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_G <= (W_1AB_Q(11) & W_1AB_Q(10) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_B <= (W_1AB_Q(13) & W_1AB_Q(12) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + + CLK_1C <= not (I_CLK_18M and (not I_CLK_6M )and (not I_V_SYNC) and I_256HnX); + CLK_1AB <= not (CLK_1C or (not (I_H_FLIP or W_1C_Q(1)))); + W_3B <= W_2D_Qn xor W_1AB_Q(4); + + W_2A <= '0' when (W_1AB_Q(7 downto 0) = x"ff") else '1'; + W_4P <= not (( I_8HF xor I_1VF ) and W_2D_Qn and I_STARS_OFFn); + + O_NOISE <= noise ; + + process(I_2V) + begin + if rising_edge(I_2V) then + noise <= W_2D_Qn; + end if; + end process; + + process(CLK_1C, I_V_SYNC) + begin + if(I_V_SYNC = '1') then + W_1C_Q <= (others => '0'); + elsif rising_edge(CLK_1C) then + W_1C_Q <= W_1C_Q(0) & '1'; + end if; + end process; + + process(CLK_1AB, I_STARS_ON) + begin + if(I_STARS_ON = '0') then + W_1AB_Q <= (others => '0'); + W_2D_Qn <= '1'; + elsif rising_edge(CLK_1AB) then + W_1AB_Q <= W_1AB_Q(14 downto 0) & W_3B; + W_2D_Qn <= not W_1AB_Q(15); + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_video.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_video.vhd new file mode 100644 index 00000000..6c7c3250 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mc_video.vhd @@ -0,0 +1,447 @@ +-------------------------------------------------------------------------------- +---- FPGA GALAXIAN VIDEO +---- +---- Version : 2.50 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 4-30 galaxian modify by K.DEGAWA +---- 2004- 5- 6 first release. +---- 2004- 8-23 Improvement with T80-IP. +---- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +-------------------------------------------------------------------------------- + +------------------------------------------------------------------------------------------- +-- H_CNT(0), H_CNT(1), H_CNT(2), H_CNT(3), H_CNT(4), H_CNT(5), H_CNT(6), H_CNT(7), H_CNT(8), +-- 1 H 2 H 4 H 8 H 16 H 32H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT(0), V_CNT(1), V_CNT(2), V_CNT(3), V_CNT(4), V_CNT(5), V_CNT(6), V_CNT(7) +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_VIDEO is + port( + I_CLK_18M : in std_logic; + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_V_CNT : in std_logic_vector(7 downto 0); + I_H_FLIP : in std_logic; + I_V_FLIP : in std_logic; + I_V_BLn : in std_logic; + I_C_BLn : in std_logic; + + I_A : in std_logic_vector(9 downto 0); + I_BD : in std_logic_vector(7 downto 0); + I_OBJ_SUB_A : in std_logic_vector(2 downto 0); + I_OBJ_RAM_RQ : in std_logic; + I_OBJ_RAM_RD : in std_logic; + I_OBJ_RAM_WR : in std_logic; + I_VID_RAM_RD : in std_logic; + I_VID_RAM_WR : in std_logic; + I_DRIVER_WR : in std_logic; + + O_C_BLnX : out std_logic; + O_8HF : out std_logic; + O_256HnX : out std_logic; + O_1VF : out std_logic; + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic; + + O_BD : out std_logic_vector(7 downto 0); + O_VID : out std_logic_vector(1 downto 0); + O_COL : out std_logic_vector(2 downto 0) + ); +end; + +architecture RTL of MC_VIDEO is + + signal WB_LDn : std_logic := '0'; + signal WB_CNTRLDn : std_logic := '0'; + signal WB_CNTRCLRn : std_logic := '0'; + signal WB_COLLn : std_logic := '0'; + signal WB_VPLn : std_logic := '0'; + signal WB_OBJDATALn : std_logic := '0'; + signal WB_MLDn : std_logic := '0'; + signal WB_SLDn : std_logic := '0'; + signal W_3D : std_logic := '0'; + signal W_LDn : std_logic := '0'; + signal W_CNTRLDn : std_logic := '0'; + signal W_CNTRCLRn : std_logic := '0'; + signal W_COLLn : std_logic := '0'; + signal W_VPLn : std_logic := '0'; + signal W_OBJDATALn : std_logic := '0'; + signal W_MLDn : std_logic := '0'; + signal W_SLDn : std_logic := '0'; + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_H_POSI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_2M_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6K_Q : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_6P_Q : std_logic_vector( 6 downto 0) := (others => '0'); + signal W_45T_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2KL : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2HJ : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_RV : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_RC : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_O_OBJ_ROM_A : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_A : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AA : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AB : std_logic_vector(11 downto 0) := (others => '0'); + signal C_2HJ : std_logic_vector( 1 downto 0) := (others => '0'); + signal C_2KL : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_CD : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_1M : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_A : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_B : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_Y : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_LRAM_DI : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_LRAM_DO : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_1H_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_1K_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_LRAM_A : std_logic_vector( 7 downto 0) := (others => '0'); +-- signal W_OBJ_RAM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_HF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_45N_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6J_Q : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DA : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DB : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_256HnX : std_logic := '0'; + signal W_2N : std_logic := '0'; + signal W_45T_CLR : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_H_FLIP1 : std_logic := '0'; + signal W_H_FLIP2 : std_logic := '0'; + signal W_H_FLIP1X : std_logic := '0'; + signal W_H_FLIP2X : std_logic := '0'; + signal W_LRAM_AND : std_logic := '0'; + signal W_RAW0 : std_logic := '0'; + signal W_RAW1 : std_logic := '0'; + signal W_RAW_OR : std_logic := '0'; + signal W_SRCLK : std_logic := '0'; + signal W_SRLD : std_logic := '0'; + signal W_VID_RAM_CS : std_logic := '0'; + signal W_CLK_6Mn : std_logic := '0'; + + type bank_a is array(0 to 3) of std_logic_vector(7 downto 0); + signal bank : bank_a; + +begin + ld_pls : entity work.MC_LD_PLS + port map( + I_CLK_6M => I_CLK_6M, + I_H_CNT => I_H_CNT, + I_3D_DI => W_3D, + + O_LDn => WB_LDn, + O_CNTRLDn => WB_CNTRLDn, + O_CNTRCLRn => WB_CNTRCLRn, + O_COLLn => WB_COLLn, + O_VPLn => WB_VPLn, + O_OBJDATALn => WB_OBJDATALn, + O_MLDn => WB_MLDn, + O_SLDn => WB_SLDn + ); + + obj_ram : entity work.MC_OBJ_RAM + port map( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(7 downto 0), + I_WEA => I_OBJ_RAM_WR, + I_CEA => I_OBJ_RAM_RQ, + I_DA => I_BD, + O_DA => W_OBJ_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_OBJ_RAM_AB, + I_WEB => '0', + I_CEB => '1', + I_DB => x"00", + O_DB => W_OBJ_RAM_DOB + ); + + lram : entity work.MC_LRAM + port map( + I_CLK => I_CLK_18M, + I_ADDR => W_LRAM_A, + I_WE => W_CLK_6Mn, + I_D => W_LRAM_DI, + O_Dn => W_LRAM_DO + ); + + missile : entity work.MC_MISSILE + port map( + I_CLK_18M => I_CLK_18M, + I_CLK_6M => I_CLK_6M, + I_C_BLn_X => W_C_BLnX, + I_MLDn => W_MLDn, + I_SLDn => W_SLDn, + I_HPOS => W_H_POSI, + O_MISSILEn => O_MISSILEn, + O_SHELLn => O_SHELLn + ); + + vid_ram : entity work.MC_VID_RAM + port map ( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(9 downto 0), + I_DA => W_VID_RAM_DI, + I_WEA => I_VID_RAM_WR, + I_CEA => W_VID_RAM_CS, + O_DA => W_VID_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_VID_RAM_A(9 downto 0), + I_DB => x"00", + I_WEB => '0', + I_CEB => '1', + O_DB => W_VID_RAM_DOB + ); + + -- 1K VID-Rom + k_rom : entity work.GALAXIAN_1K + port map ( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1K_D + ); + + -- 1H VID-Rom + h_rom : entity work.GALAXIAN_1H + port map( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1H_D + ); + +----------------------------------------------------------------------------------- + + process(I_CLK_12M) + begin + if falling_edge(I_CLK_12M) then + W_LDn <= WB_LDn; + W_CNTRLDn <= WB_CNTRLDn; + W_CNTRCLRn <= WB_CNTRCLRn; + W_COLLn <= WB_COLLn; + W_VPLn <= WB_VPLn; + W_OBJDATALn <= WB_OBJDATALn; + W_MLDn <= WB_MLDn; + W_SLDn <= WB_SLDn; + end if; + end process; + + W_CLK_6Mn <= not I_CLK_6M; + + W_6J_DA <= I_H_FLIP & W_HF_CNT(7) & W_HF_CNT(3) & I_H_CNT(2); + W_6J_DB <= W_OBJ_D(6) & ( W_HF_CNT(3) and I_H_CNT(1) ) & I_H_CNT(2) & I_H_CNT(1); + W_6J_Q <= W_6J_DB when I_H_CNT(8) = '1' else W_6J_DA; + + W_H_FLIP1 <= (not I_H_CNT(8)) and I_H_FLIP; + + W_HF_CNT(7 downto 3) <= not I_H_CNT(7 downto 3) when W_H_FLIP1 = '1' else I_H_CNT(7 downto 3); + W_VF_CNT <= not I_V_CNT when I_V_FLIP = '1' else I_V_CNT; + + O_8HF <= W_HF_CNT(3); + O_1VF <= W_VF_CNT(0); + W_H_FLIP2 <= W_6J_Q(3); + +-- Parts 4F,5F + W_OBJ_RAM_AB <= "0" & I_H_CNT(8) & W_6J_Q(2) & W_HF_CNT(6 downto 4) & W_6J_Q(1 downto 0); +-- W_OBJ_RAM_A <= W_OBJ_RAM_AB when I_OBJ_RAM_RQ = '0' else I_A(7 downto 0) ; + + process(I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_H_POSI <= W_OBJ_RAM_DOB; + end if; + end process; + + W_OBJ_RAM_D <= W_OBJ_RAM_DOA when I_OBJ_RAM_RD = '1' else (others => '0'); + +-- Parts 4L + process(W_OBJDATALn) + begin + if rising_edge(W_OBJDATALn) then + W_OBJ_D <= W_H_POSI; + end if; + end process; + +-- Parts 4,5N + W_45N_Q <= W_VF_CNT + W_H_POSI; + W_3D <= '0' when W_45N_Q = x"FF" else '1'; + + process(W_VPLn, I_V_BLn) + begin + if (I_V_BLn = '0') then + W_2M_Q <= (others => '0'); + elsif rising_edge(W_VPLn) then + W_2M_Q <= W_45N_Q; + end if; + end process; + + process(I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + if I_DRIVER_WR = '1' and I_A(2) = '0' then + bank(to_integer(unsigned(I_A(1 downto 0)))) <= I_BD; + end if; + end if; + end process; + + W_2N <= I_H_CNT(8) and W_OBJ_D(7); + W_1M <= W_2M_Q(3 downto 0) xor (W_2N & W_2N & W_2N & W_2N); + W_VID_RAM_CS <= I_VID_RAM_RD or I_VID_RAM_WR; + W_VID_RAM_DI <= I_BD when I_VID_RAM_WR = '1' else (others => '0'); + W_VID_RAM_AA <= (not ( W_2M_Q(7) and W_2M_Q(6) and W_2M_Q(5) and W_2M_Q(4))) & (not W_VID_RAM_CS) & "0000000000"; -- I_A(9:0) + W_VID_RAM_AB <= "00" & W_2M_Q(7 downto 4) & W_1M(3) & W_HF_CNT(7 downto 3); + W_VID_RAM_A <= W_VID_RAM_AB when I_C_BLn = '1' else W_VID_RAM_AA; + W_VID_RAM_D <= W_VID_RAM_DOA when I_VID_RAM_RD = '1' else (others => '0'); + +---- VIDEO DATA OUTPUT -------------- + + O_BD <= W_OBJ_RAM_D or W_VID_RAM_D; + W_SRLD <= not (W_LDn or W_VID_RAM_A(11)); + W_OBJ_ROM_AB <= W_OBJ_D(5 downto 0) & W_1M(3) & (W_OBJ_D(6) xor I_H_CNT(3)); + W_OBJ_ROM_A <= W_OBJ_ROM_AB when I_H_CNT(8) = '1' else W_VID_RAM_DOB; + W_O_OBJ_ROM_A <= '1' & bank(0)(0) & bank(1)(0) & W_OBJ_ROM_A(5 downto 0) & W_1M(2 downto 0) + when (bank(2) /= X"00" and W_OBJ_ROM_A(7 downto 6) = "10") else + '0' & W_OBJ_ROM_A & W_1M(2 downto 0); + +----------------------------------------------------------------------------------- + + W_3L_A <= reg_2HJ(7) & reg_2KL(7) & "1" & W_SRLD; + W_3L_B <= reg_2HJ(0) & reg_2KL(0) & W_SRLD & "1"; + W_3L_Y <= W_3L_B when W_H_FLIP2X = '1' else W_3L_A; -- (3)=RAW1,(2)=RAW0 + C_2HJ <= W_3L_Y(1 downto 0); + C_2KL <= W_3L_Y(1 downto 0); + W_RAW0 <= W_3L_Y(2); + W_RAW1 <= W_3L_Y(3); + W_SRCLK <= I_CLK_6M; + +-------- PARTS 2KL ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2KL) is + when "00" => reg_2KL <= reg_2KL; + when "10" => reg_2KL <= reg_2KL(6 downto 0) & "0"; + when "01" => reg_2KL <= "0" & reg_2KL(7 downto 1); + when "11" => reg_2KL <= W_1K_D; + when others => null; + end case; + end if; + end process; + +-------- PARTS 2HJ ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2HJ) is + when "00" => reg_2HJ <= reg_2HJ; + when "10" => reg_2HJ <= reg_2HJ(6 downto 0) & "0"; + when "01" => reg_2HJ <= "0" & reg_2HJ(7 downto 1); + when "11" => reg_2HJ <= W_1H_D; + when others => null; + end case; + end if; + end process; + +------- SHT2 ----------------------------------------------------- + +-- Parts 6K + process(W_COLLn) + begin + if rising_edge(W_COLLn) then + W_6K_Q <= W_H_POSI(2 downto 0); + end if; + end process; + +-- Parts 6P + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + if (W_LDn = '0') then + W_6P_Q <= W_H_FLIP2 & W_H_FLIP1 & I_C_BLn & (not I_H_CNT(8)) & W_6K_Q(2 downto 0); + else + W_6P_Q <= W_6P_Q; + end if; + end if; + end process; + + W_H_FLIP2X <= W_6P_Q(6); + W_H_FLIP1X <= W_6P_Q(5); + W_C_BLnX <= W_6P_Q(4); + W_256HnX <= W_6P_Q(3); + W_CD <= W_6P_Q(2 downto 0); + O_256HnX <= W_256HnX; + O_C_BLnX <= W_C_BLnX; + W_45T_CLR <= W_CNTRCLRn or W_256HnX ; + + process(I_CLK_6M, W_45T_CLR) + begin + if (W_45T_CLR = '0') then + W_45T_Q <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + if (W_CNTRLDn = '0') then + W_45T_Q <= W_H_POSI; + else + W_45T_Q <= W_45T_Q + 1; + end if; + end if; + end process; + + W_LRAM_A <= (not W_45T_Q) when W_H_FLIP1X = '1' else W_45T_Q; + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_RV <= W_LRAM_DO(1 downto 0); + W_RC <= W_LRAM_DO(4 downto 2); + end if; + end process; + + W_LRAM_AND <= not (not ((W_LRAM_A(4) or W_LRAM_A(5)) or (W_LRAM_A(6) or W_LRAM_A(7))) or W_256HnX ); + W_RAW_OR <= W_RAW0 or W_RAW1 ; + + W_VID(0) <= not (not (W_RAW0 and W_RV(1)) and W_RV(0)); + W_VID(1) <= not (not (W_RAW1 and W_RV(0)) and W_RV(1)); + W_COL(0) <= not (not (W_RAW_OR and W_CD(0) and W_RC(1) and W_RC(2)) and W_RC(0)); + W_COL(1) <= not (not (W_RAW_OR and W_CD(1) and W_RC(2) and W_RC(0)) and W_RC(1)); + W_COL(2) <= not (not (W_RAW_OR and W_CD(2) and W_RC(0) and W_RC(1)) and W_RC(2)); + + O_VID <= W_VID; + O_COL <= W_COL; + + W_LRAM_DI(0) <= W_LRAM_AND and W_VID(0); + W_LRAM_DI(1) <= W_LRAM_AND and W_VID(1); + W_LRAM_DI(2) <= W_LRAM_AND and W_COL(0); + W_LRAM_DI(3) <= W_LRAM_AND and W_COL(1); + W_LRAM_DI(4) <= W_LRAM_AND and W_COL(2); + +end RTL; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mist_io.v b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_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/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/osd.v b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_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/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/pll.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d76a5e1d --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/pll.vhd @@ -0,0 +1,451 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + c3 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + clk3_divide_by : NATURAL; + clk3_duty_cycle : NATURAL; + clk3_multiply_by : NATURAL; + clk3_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire2 <= sub_wire0(3); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c3 <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 3, + clk0_duty_cycle => 50, + clk0_multiply_by => 2, + clk0_phase_shift => "0", + clk1_divide_by => 9, + clk1_duty_cycle => 50, + clk1_multiply_by => 4, + clk1_phase_shift => "0", + clk2_divide_by => 9, + clk2_duty_cycle => 50, + clk2_multiply_by => 2, + clk2_phase_shift => "0", + clk3_divide_by => 6, + clk3_duty_cycle => 50, + clk3_multiply_by => 1, + clk3_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_USED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire6, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "3" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "6" +-- 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: DUTY_CYCLE3 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "18.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "12.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "6.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "4.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 "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "4" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "18.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "12.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "6.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "4.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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 "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "3" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "4" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "6" +-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK3_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_USED" +-- 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_USED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/scandoubler.v b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..2a921604 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/scandoubler.v @@ -0,0 +1,195 @@ +// +// 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/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/sine_package.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/sine_package.vhd new file mode 100644 index 00000000..473caa04 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/sine_package.vhd @@ -0,0 +1,152 @@ +library ieee; +use ieee.std_logic_1164.all; + +package sine_package is + + subtype table_value_type is integer range 0 to 16383; + subtype table_index_type is std_logic_vector( 6 downto 0 ); + + function get_table_value (table_index: table_index_type) return table_value_type; + +end; + +package body sine_package is + + function get_table_value (table_index: table_index_type) return table_value_type is + variable table_value: table_value_type; + begin + case table_index is + when "0000000" => table_value := 101; + when "0000001" => table_value := 302; + when "0000010" => table_value := 503; + when "0000011" => table_value := 703; + when "0000100" => table_value := 904; + when "0000101" => table_value := 1105; + when "0000110" => table_value := 1305; + when "0000111" => table_value := 1506; + when "0001000" => table_value := 1706; + when "0001001" => table_value := 1906; + when "0001010" => table_value := 2105; + when "0001011" => table_value := 2304; + when "0001100" => table_value := 2503; + when "0001101" => table_value := 2702; + when "0001110" => table_value := 2900; + when "0001111" => table_value := 3098; + when "0010000" => table_value := 3295; + when "0010001" => table_value := 3491; + when "0010010" => table_value := 3688; + when "0010011" => table_value := 3883; + when "0010100" => table_value := 4078; + when "0010101" => table_value := 4273; + when "0010110" => table_value := 4466; + when "0010111" => table_value := 4659; + when "0011000" => table_value := 4852; + when "0011001" => table_value := 5044; + when "0011010" => table_value := 5234; + when "0011011" => table_value := 5425; + when "0011100" => table_value := 5614; + when "0011101" => table_value := 5802; + when "0011110" => table_value := 5990; + when "0011111" => table_value := 6177; + when "0100000" => table_value := 6362; + when "0100001" => table_value := 6547; + when "0100010" => table_value := 6731; + when "0100011" => table_value := 6914; + when "0100100" => table_value := 7095; + when "0100101" => table_value := 7276; + when "0100110" => table_value := 7456; + when "0100111" => table_value := 7634; + when "0101000" => table_value := 7811; + when "0101001" => table_value := 7988; + when "0101010" => table_value := 8162; + when "0101011" => table_value := 8336; + when "0101100" => table_value := 8509; + when "0101101" => table_value := 8680; + when "0101110" => table_value := 8850; + when "0101111" => table_value := 9018; + when "0110000" => table_value := 9185; + when "0110001" => table_value := 9351; + when "0110010" => table_value := 9515; + when "0110011" => table_value := 9678; + when "0110100" => table_value := 9840; + when "0110101" => table_value := 10000; + when "0110110" => table_value := 10158; + when "0110111" => table_value := 10315; + when "0111000" => table_value := 10471; + when "0111001" => table_value := 10625; + when "0111010" => table_value := 10777; + when "0111011" => table_value := 10927; + when "0111100" => table_value := 11076; + when "0111101" => table_value := 11224; + when "0111110" => table_value := 11369; + when "0111111" => table_value := 11513; + when "1000000" => table_value := 11655; + when "1000001" => table_value := 11796; + when "1000010" => table_value := 11934; + when "1000011" => table_value := 12071; + when "1000100" => table_value := 12206; + when "1000101" => table_value := 12339; + when "1000110" => table_value := 12471; + when "1000111" => table_value := 12600; + when "1001000" => table_value := 12728; + when "1001001" => table_value := 12853; + when "1001010" => table_value := 12977; + when "1001011" => table_value := 13099; + when "1001100" => table_value := 13219; + when "1001101" => table_value := 13336; + when "1001110" => table_value := 13452; + when "1001111" => table_value := 13566; + when "1010000" => table_value := 13678; + when "1010001" => table_value := 13787; + when "1010010" => table_value := 13895; + when "1010011" => table_value := 14000; + when "1010100" => table_value := 14104; + when "1010101" => table_value := 14205; + when "1010110" => table_value := 14304; + when "1010111" => table_value := 14401; + when "1011000" => table_value := 14496; + when "1011001" => table_value := 14588; + when "1011010" => table_value := 14679; + when "1011011" => table_value := 14767; + when "1011100" => table_value := 14853; + when "1011101" => table_value := 14936; + when "1011110" => table_value := 15018; + when "1011111" => table_value := 15097; + when "1100000" => table_value := 15174; + when "1100001" => table_value := 15249; + when "1100010" => table_value := 15321; + when "1100011" => table_value := 15391; + when "1100100" => table_value := 15459; + when "1100101" => table_value := 15524; + when "1100110" => table_value := 15587; + when "1100111" => table_value := 15648; + when "1101000" => table_value := 15706; + when "1101001" => table_value := 15762; + when "1101010" => table_value := 15816; + when "1101011" => table_value := 15867; + when "1101100" => table_value := 15916; + when "1101101" => table_value := 15963; + when "1101110" => table_value := 16007; + when "1101111" => table_value := 16048; + when "1110000" => table_value := 16088; + when "1110001" => table_value := 16124; + when "1110010" => table_value := 16159; + when "1110011" => table_value := 16191; + when "1110100" => table_value := 16220; + when "1110101" => table_value := 16247; + when "1110110" => table_value := 16272; + when "1110111" => table_value := 16294; + when "1111000" => table_value := 16314; + when "1111001" => table_value := 16331; + when "1111010" => table_value := 16346; + when "1111011" => table_value := 16358; + when "1111100" => table_value := 16368; + when "1111101" => table_value := 16375; + when "1111110" => table_value := 16380; + when "1111111" => table_value := 16383; + when others => null; + end case; + return table_value; + end; + +end; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/spram.vhd b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/spram.vhd new file mode 100644 index 00000000..ad6b58b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone V", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/video_mixer.sv b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..b9f7e424 --- /dev/null +++ b/Arcade/Galaxian Hardware/MoonCresta_MiST/rtl/video_mixer.sv @@ -0,0 +1,243 @@ +// +// +// 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; +reg [DWIDTH:0] Rd,Gd,Bd; +always @(posedge clk_sys) {Rd,Gd,Bd} <= {R,G,B}; +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(Rd), + .g_in(Gd), + .b_in(Bd), + + .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/Arcade/Galaxian Hardware/MrDoNightmare_MiST/MrDoNightmare.qpf b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/MrDoNightmare.qpf new file mode 100644 index 00000000..842b51ab --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/MrDoNightmare.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:59:16 November 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "14:59:16 November 16, 2017" + +# Revisions + +PROJECT_REVISION = "MrDoNightmare" \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/MrDoNightmare.qsf b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/MrDoNightmare.qsf new file mode 100644 index 00000000..bc2e9fc5 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/MrDoNightmare.qsf @@ -0,0 +1,190 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 18:12:35 November 17, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# MrDoNightmare_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80as.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_6L.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1K.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1H.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_HIT.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_FIR.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/sine_package.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/MrDoNightmare.sv +set_global_assignment -name VHDL_FILE rtl/mc_video.vhd +set_global_assignment -name VHDL_FILE rtl/mc_stars.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_vco.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_b.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_a.vhd +set_global_assignment -name VHDL_FILE rtl/mc_missile.vhd +set_global_assignment -name VHDL_FILE rtl/mc_logic.vhd +set_global_assignment -name VHDL_FILE rtl/mc_ld_pls.vhd +set_global_assignment -name VHDL_FILE rtl/mc_inport.vhd +set_global_assignment -name VHDL_FILE rtl/mc_hv_count.vhd +set_global_assignment -name VHDL_FILE rtl/mc_col_pal.vhd +set_global_assignment -name VHDL_FILE rtl/mc_bram.vhd +set_global_assignment -name VHDL_FILE rtl/mc_adec.vhd +set_global_assignment -name VHDL_FILE rtl/galaxian.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY MrDoNightmare +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Galaxian) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Galaxian) +# -------------------- +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/MrDoNightmare.srf b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/MrDoNightmare.srf new file mode 100644 index 00000000..cdf208db --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/MrDoNightmare.srf @@ -0,0 +1,54 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No output dependent on input pin \"SPI_SS2\"" { } { } 0 15610 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at MrDoNightmare.sv(86): object \"m_bomb\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/README.txt b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/README.txt new file mode 100644 index 00000000..bdd3a884 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Mr. Do´s Nightmare port to MiST by Gehstock +-- 18 December 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Galaxian hardware +-- Copyright(c) 2004 Katsumi Degawa +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- F2 : Coin + Start 2 players +-- F1 : Coin + Start 1 player +-- SPACE : Fire +-- ARROW KEYS : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/Release/MrDoNightmare.rbf b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/Release/MrDoNightmare.rbf new file mode 100644 index 00000000..7720684a Binary files /dev/null and b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/Release/MrDoNightmare.rbf differ diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/clean.bat b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_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/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/MrDoNightmare.sv b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/MrDoNightmare.sv new file mode 100644 index 00000000..2c0dc7f9 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/MrDoNightmare.sv @@ -0,0 +1,176 @@ +//============================================================================ +// Arcade: MrDoNightmare +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module MrDoNightmare +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "MrDoNightmare;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_18, clk_12, clk_6, clk_4p5; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_18), + .c1(clk_12), + .c2(clk_6), + .c3(clk_4p5)//for now, needs a fix +); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +galaxian mrdo +( + .W_CLK_18M(clk_18), + .W_CLK_12M(clk_12), + .W_CLK_6M(clk_6), + .I_RESET(status[0] | status[6] | buttons[1]), + .P1_CSJUDLR({m_coin,m_start1,m_fire,2'b00,m_left,m_right}), + .P2_CSJUDLR({1'b0, m_start2,m_fire,2'b00,m_up ,m_down }), + .W_R(r), + .W_G(g), + .W_B(b), + .W_H_SYNC(hs), + .W_V_SYNC(vs), + .HBLANK(hblank), + .VBLANK(vblank), + .W_SDAT_A(audio_a), + .W_SDAT_B(audio_b) +); + +wire [7:0] audio_a, audio_b; +wire [10:0] audio = {1'b0, audio_b, 2'b0} + {3'b0, audio_a}; + +dac dac ( + .clk_i(clk_18), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [2:0] r, g, b; +wire hblank, vblank; +wire blankn = ~(hblank | vblank); +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_18), + .ce_pix(clk_4p5), + .ce_pix_actual(clk_4p5), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn?r:"000"), + .G(blankn?g:"000"), + .B(blankn?b:"000"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_18 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_18), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GALAXIAN_1H.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GALAXIAN_1H.vhd new file mode 100644 index 00000000..df224504 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GALAXIAN_1H.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_1H is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_1H is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"02",X"02",X"FE",X"FE",X"42",X"02",X"00",X"00", + X"62",X"F2",X"BA",X"9A",X"9E",X"CE",X"46",X"00",X"8C",X"DE",X"F2",X"B2",X"92",X"86",X"04",X"00", + X"08",X"FE",X"FE",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BE",X"A2",X"A2",X"A2",X"E6",X"E4",X"00", + X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"C0",X"E0",X"B0",X"9E",X"8E",X"C0",X"C0",X"00", + X"0C",X"6E",X"9A",X"9A",X"B2",X"F2",X"6C",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00", + X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00",X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00", + X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00",X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00", + X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00",X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00", + X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00",X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00", + X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00",X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00", + X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00", + X"FC",X"FE",X"02",X"02",X"02",X"06",X"04",X"00",X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00", + X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00", + X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00", + X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00",X"7A",X"FC",X"8E",X"8A",X"82",X"FE",X"7C",X"00", + X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00",X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00", + X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00", + X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0",X"00",X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00", + X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00", + X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"00", + X"FF",X"FF",X"F7",X"FF",X"FF",X"FE",X"FF",X"FF",X"F7",X"FF",X"FF",X"FF",X"FF",X"DF",X"FF",X"FD", + X"BF",X"F7",X"FF",X"FF",X"FF",X"FF",X"DF",X"FF",X"FF",X"FF",X"FF",X"DF",X"FF",X"FF",X"FB",X"FF", + X"B0",X"C0",X"82",X"C3",X"C2",X"81",X"83",X"81",X"03",X"07",X"1F",X"77",X"EB",X"ED",X"36",X"DB", + X"C3",X"82",X"C1",X"81",X"82",X"C3",X"A0",X"F0",X"67",X"36",X"6D",X"E3",X"7F",X"DF",X"07",X"03", + X"FF",X"FF",X"DF",X"AF",X"A1",X"BE",X"A9",X"D4",X"F7",X"FF",X"E7",X"DB",X"A1",X"40",X"C0",X"18", + X"FA",X"FD",X"FE",X"FF",X"FF",X"FD",X"DF",X"FF",X"21",X"C0",X"40",X"00",X"81",X"C3",X"E7",X"FF", + X"F0",X"EF",X"DF",X"BF",X"BF",X"BF",X"BF",X"3F",X"0F",X"E7",X"E3",X"F1",X"F8",X"F0",X"F0",X"F8", + X"0F",X"BF",X"BF",X"BF",X"BF",X"DF",X"EF",X"F0",X"F0",X"E0",X"F8",X"F0",X"F1",X"E3",X"E7",X"1F", + X"FF",X"FD",X"F2",X"F2",X"E9",X"CF",X"C9",X"D5",X"F7",X"FF",X"FF",X"7F",X"3F",X"9F",X"CF",X"F5", + X"9F",X"C9",X"C7",X"E1",X"F6",X"FA",X"DD",X"FF",X"F7",X"CF",X"9F",X"3F",X"7F",X"FF",X"FB",X"FF", + X"F8",X"C0",X"B0",X"78",X"48",X"48",X"B0",X"C0",X"00",X"00",X"60",X"20",X"21",X"61",X"40",X"40", + X"C0",X"B0",X"48",X"48",X"78",X"B0",X"C0",X"F8",X"40",X"40",X"61",X"21",X"20",X"60",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE", + X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"7F",X"37",X"3F",X"7F",X"7E",X"7F",X"3F",X"F4",X"FC",X"FC",X"FC",X"F8",X"DC",X"FC",X"FC", + X"1F",X"17",X"3F",X"3F",X"3F",X"0F",X"1F",X"3F",X"F8",X"F8",X"FC",X"DC",X"FC",X"FE",X"FA",X"FE", + X"00",X"00",X"04",X"0C",X"1C",X"3C",X"7C",X"7A",X"00",X"C0",X"C0",X"D8",X"D8",X"F8",X"78",X"FC", + X"7F",X"79",X"3F",X"06",X"00",X"00",X"00",X"00",X"FE",X"FE",X"74",X"34",X"30",X"30",X"00",X"00", + X"00",X"00",X"08",X"18",X"3C",X"7C",X"7C",X"7A",X"00",X"00",X"00",X"18",X"3C",X"7C",X"7E",X"FE", + X"7F",X"79",X"3F",X"06",X"00",X"00",X"00",X"00",X"FE",X"FC",X"78",X"30",X"30",X"30",X"00",X"00", + X"00",X"00",X"10",X"18",X"3C",X"3C",X"7C",X"7A",X"00",X"30",X"30",X"30",X"70",X"FC",X"7C",X"FC", + X"7F",X"79",X"3F",X"06",X"00",X"00",X"00",X"00",X"F8",X"F8",X"F0",X"D0",X"C0",X"C0",X"00",X"00", + X"00",X"03",X"0F",X"03",X"3F",X"3F",X"07",X"03",X"00",X"00",X"80",X"F8",X"F8",X"E0",X"FE",X"BE", + X"07",X"0D",X"0D",X"07",X"07",X"07",X"03",X"00",X"00",X"80",X"7C",X"F8",X"F0",X"E0",X"C0",X"00", + X"00",X"01",X"03",X"07",X"3F",X"3F",X"07",X"03",X"00",X"C0",X"F0",X"F8",X"F8",X"F0",X"80",X"80", + X"07",X"0D",X"0D",X"07",X"07",X"07",X"03",X"00",X"00",X"80",X"70",X"FC",X"F8",X"F0",X"E0",X"00", + X"00",X"00",X"00",X"03",X"0F",X"07",X"3F",X"3F",X"00",X"00",X"E0",X"E0",X"FE",X"FE",X"F0",X"A0", + X"07",X"0D",X"0D",X"07",X"07",X"07",X"03",X"00",X"00",X"80",X"70",X"F8",X"FC",X"F0",X"C0",X"00", + X"FF",X"1F",X"17",X"1F",X"3F",X"FE",X"1F",X"1F",X"F7",X"F8",X"F8",X"F8",X"F8",X"DF",X"FC",X"F8", + X"1F",X"17",X"FF",X"1F",X"1F",X"1F",X"1F",X"FF",X"F8",X"F8",X"FF",X"D8",X"F8",X"FC",X"F8",X"FF", + X"FF",X"FE",X"FA",X"F1",X"E4",X"F0",X"F9",X"F1",X"1F",X"AF",X"97",X"4B",X"BC",X"C7",X"3F",X"E0", + X"AE",X"F0",X"FB",X"F0",X"E5",X"F0",X"DB",X"FF",X"0F",X"E8",X"97",X"69",X"8A",X"15",X"C5",X"EB", + X"FF",X"FF",X"F7",X"FD",X"F8",X"F2",X"F9",X"FC",X"CF",X"B7",X"7B",X"7D",X"BE",X"0E",X"C7",X"3F", + X"BE",X"F9",X"F2",X"E4",X"F1",X"FB",X"DF",X"FF",X"D3",X"2E",X"DE",X"BD",X"7B",X"77",X"0F",X"FF", + X"00",X"00",X"19",X"35",X"35",X"3D",X"19",X"01",X"00",X"00",X"40",X"40",X"40",X"40",X"40",X"40", + X"19",X"35",X"35",X"3C",X"18",X"00",X"00",X"00",X"40",X"40",X"C0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"32",X"4A",X"4A",X"7A",X"32",X"02",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"10", + X"32",X"4A",X"4B",X"79",X"30",X"00",X"00",X"00",X"10",X"10",X"30",X"E0",X"00",X"00",X"00",X"00", + X"7F",X"3F",X"0F",X"03",X"00",X"00",X"00",X"00",X"FC",X"7F",X"3F",X"7F",X"FC",X"F0",X"F0",X"FC", + X"1F",X"1F",X"3F",X"7F",X"FF",X"FC",X"F0",X"F0",X"1C",X"1E",X"0F",X"0F",X"1F",X"1C",X"1C",X"1C", + X"F0",X"F0",X"F8",X"7F",X"3F",X"1F",X"1E",X"1C",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"7C",X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"01",X"03",X"07",X"0F",X"1F",X"3E", + X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"30", + X"3F",X"00",X"1C",X"26",X"3E",X"1C",X"00",X"00",X"E0",X"00",X"70",X"98",X"F8",X"70",X"00",X"00", + X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"30",X"10",X"10", + X"00",X"3F",X"00",X"1C",X"26",X"26",X"1C",X"00",X"30",X"E0",X"00",X"70",X"98",X"98",X"70",X"00", + X"00",X"00",X"00",X"00",X"00",X"03",X"04",X"08",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"08",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"20",X"20",X"40",X"80",X"00",X"00",X"00",X"00", + X"03",X"03",X"0B",X"1F",X"73",X"7F",X"7F",X"73",X"00",X"00",X"00",X"9C",X"FE",X"FE",X"F8",X"F0", + X"1F",X"0B",X"03",X"7B",X"79",X"7D",X"3C",X"1E",X"F0",X"F8",X"7C",X"B8",X"98",X"80",X"00",X"00", + X"00",X"01",X"07",X"1E",X"3C",X"7F",X"7F",X"3F",X"00",X"80",X"C0",X"40",X"E0",X"98",X"FC",X"FC", + X"7F",X"7C",X"3E",X"3D",X"1E",X"1E",X"0C",X"00",X"94",X"E0",X"60",X"F0",X"78",X"38",X"00",X"00", + X"00",X"00",X"1C",X"1E",X"1F",X"0F",X"07",X"07",X"0C",X"0C",X"0C",X"0C",X"CC",X"9C",X"F2",X"FE", + X"1F",X"3F",X"3F",X"07",X"00",X"00",X"00",X"00",X"FE",X"F2",X"9C",X"CC",X"0C",X"0C",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"01",X"73",X"53",X"51",X"0C",X"CC",X"CC",X"CC",X"CC",X"9C",X"F2",X"FE", + X"51",X"53",X"73",X"01",X"00",X"00",X"00",X"00",X"FE",X"F2",X"9C",X"CC",X"CC",X"CC",X"CC",X"0C", + X"BD",X"40",X"80",X"00",X"80",X"80",X"80",X"00",X"78",X"70",X"70",X"79",X"3F",X"1F",X"0F",X"03", + X"00",X"00",X"00",X"00",X"03",X"0F",X"1F",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"83", + X"00",X"E0",X"F8",X"FE",X"FF",X"3F",X"0F",X"03",X"00",X"00",X"C0",X"00",X"01",X"07",X"0F",X"07", + X"FE",X"FE",X"F8",X"E0",X"01",X"07",X"0F",X"07",X"3F",X"7F",X"7F",X"3F",X"1F",X"00",X"00",X"00", + X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"7F",X"7F",X"3F",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"07",X"1F",X"3F",X"3F",X"7F",X"F0",X"F0",X"F8",X"FC",X"FE",X"FC",X"C0",X"00", + X"F0",X"E0",X"E1",X"E1",X"E1",X"E1",X"E1",X"E0",X"FF",X"3F",X"FF",X"FF",X"FF",X"FC",X"F8",X"F0", + X"E1",X"E1",X"E1",X"E0",X"E0",X"E0",X"F0",X"F8",X"0F",X"1F",X"3F",X"7F",X"F8",X"F0",X"E0",X"E0", + X"F8",X"78",X"78",X"78",X"F8",X"F8",X"F0",X"E0",X"F8",X"78",X"78",X"78",X"F8",X"F0",X"E0",X"F0", + X"F8",X"78",X"78",X"78",X"F8",X"F0",X"E0",X"F0",X"FF",X"FF",X"FF",X"F8",X"F8",X"78",X"78",X"78", + X"F8",X"FC",X"FE",X"FE",X"FE",X"1E",X"1F",X"1F",X"FC",X"FC",X"FC",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"E0",X"F0",X"F8",X"FC",X"FC",X"7C",X"00",X"00",X"00",X"00",X"01",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"FF", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"F0",X"F8",X"FC",X"FE",X"1F",X"0F",X"07",X"07", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"82",X"82",X"01",X"01",X"01",X"01",X"01",X"01",X"21",X"A1", + X"82",X"83",X"80",X"80",X"80",X"80",X"80",X"FF",X"A1",X"E1",X"01",X"01",X"01",X"01",X"01",X"FF", + X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"01",X"01",X"01",X"01",X"01",X"01",X"61",X"81", + X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"81",X"61",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"82",X"82",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"83",X"82",X"82",X"80",X"80",X"80",X"80",X"80",X"E1",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"81",X"82",X"01",X"01",X"01",X"01",X"01",X"01",X"21",X"A1", + X"82",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"C1",X"E1",X"01",X"01",X"01",X"01",X"01",X"01", + X"FF",X"80",X"80",X"80",X"80",X"80",X"81",X"82",X"FF",X"01",X"01",X"01",X"01",X"01",X"E1",X"81", + X"82",X"81",X"80",X"80",X"80",X"80",X"80",X"80",X"81",X"E1",X"01",X"01",X"01",X"01",X"01",X"01", + X"00",X"0F",X"3F",X"7F",X"4F",X"4C",X"48",X"78",X"00",X"E0",X"F0",X"F8",X"F8",X"18",X"00",X"00", + X"78",X"48",X"4C",X"4F",X"7F",X"3F",X"0F",X"00",X"00",X"00",X"18",X"F8",X"F8",X"F0",X"E0",X"00", + X"00",X"0F",X"3F",X"7F",X"4F",X"4C",X"48",X"7B",X"00",X"E0",X"F0",X"F8",X"F8",X"F8",X"78",X"28", + X"7B",X"49",X"4D",X"4F",X"7F",X"3F",X"0F",X"00",X"20",X"F0",X"F8",X"F8",X"F8",X"F0",X"E0",X"00", + X"00",X"0F",X"3F",X"7F",X"4F",X"4C",X"48",X"7B",X"00",X"E0",X"F0",X"F8",X"F8",X"F8",X"70",X"20", + X"7B",X"49",X"4D",X"4F",X"7F",X"3F",X"0F",X"00",X"28",X"F8",X"F8",X"F8",X"F8",X"F0",X"E0",X"00", + X"7C",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF",X"C7",X"00",X"00",X"00",X"00", + X"E3",X"E7",X"E7",X"C7",X"07",X"07",X"0F",X"1F",X"CF",X"FF",X"FF",X"FF",X"F0",X"E0",X"E0",X"E0", + X"FE",X"FC",X"F8",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0E",X"1E",X"1C",X"3C",X"78",X"F8",X"FC",X"3E",X"0E",X"0F",X"0F",X"07",X"07",X"07",X"0F",X"0F", + X"FE",X"FC",X"F8",X"F0",X"F8",X"3C",X"1C",X"1E",X"07",X"87",X"87",X"87",X"07",X"07",X"0F",X"1F", + X"B0",X"C0",X"82",X"C3",X"C2",X"80",X"83",X"80",X"07",X"03",X"01",X"E1",X"03",X"01",X"E0",X"01", + X"C3",X"80",X"C3",X"80",X"82",X"C3",X"A0",X"F0",X"61",X"82",X"61",X"01",X"A3",X"E1",X"01",X"03", + X"00",X"10",X"70",X"E0",X"80",X"80",X"80",X"E0",X"00",X"08",X"08",X"04",X"04",X"04",X"04",X"04", + X"E0",X"80",X"80",X"80",X"E0",X"70",X"10",X"00",X"04",X"04",X"04",X"04",X"04",X"08",X"08",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GALAXIAN_1K.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GALAXIAN_1K.vhd new file mode 100644 index 00000000..25afe613 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GALAXIAN_1K.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_1K is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_1K is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"02",X"02",X"FE",X"FE",X"42",X"02",X"00",X"00", + X"62",X"F2",X"BA",X"9A",X"9E",X"CE",X"46",X"00",X"8C",X"DE",X"F2",X"B2",X"92",X"86",X"04",X"00", + X"08",X"FE",X"FE",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BE",X"A2",X"A2",X"A2",X"E6",X"E4",X"00", + X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"C0",X"E0",X"B0",X"9E",X"8E",X"C0",X"C0",X"00", + X"0C",X"6E",X"9A",X"9A",X"B2",X"F2",X"6C",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00", + X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00",X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00", + X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00",X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00", + X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00",X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00", + X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00",X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00", + X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00",X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00", + X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00", + X"FC",X"FE",X"02",X"02",X"02",X"06",X"04",X"00",X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00", + X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00", + X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00", + X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00",X"7A",X"FC",X"8E",X"8A",X"82",X"FE",X"7C",X"00", + X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00",X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00", + X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00", + X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0",X"00",X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00", + X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00", + X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"09",X"30",X"42",X"23",X"03",X"42",X"60",X"42",X"40",X"08",X"20",X"80",X"00",X"08",X"84",X"00", + X"20",X"41",X"22",X"40",X"42",X"23",X"18",X"05",X"82",X"84",X"88",X"00",X"80",X"E0",X"08",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"3C",X"7E",X"66",X"5A", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"7E",X"7E",X"7E",X"3C",X"18",X"00",X"00", + X"00",X"00",X"00",X"02",X"07",X"17",X"0B",X"88",X"00",X"00",X"18",X"0C",X"46",X"6E",X"6E",X"06", + X"F8",X"08",X"10",X"00",X"00",X"00",X"00",X"00",X"0E",X"1E",X"06",X"0E",X"0C",X"18",X"00",X"00", + X"00",X"00",X"00",X"03",X"05",X"05",X"1A",X"1C",X"00",X"00",X"00",X"00",X"80",X"C0",X"60",X"30", + X"0B",X"0D",X"12",X"0A",X"03",X"02",X"00",X"00",X"C0",X"A0",X"40",X"80",X"00",X"00",X"00",X"00", + X"03",X"07",X"3F",X"7F",X"4F",X"4F",X"3F",X"1F",X"FE",X"FF",X"9F",X"DE",X"DC",X"9C",X"BE",X"BF", + X"1F",X"3F",X"4F",X"4F",X"7F",X"3F",X"07",X"03",X"BF",X"BE",X"9C",X"DC",X"DE",X"9F",X"FF",X"FE", + X"FF",X"FF",X"FF",X"7F",X"4F",X"AB",X"05",X"02",X"A0",X"D8",X"FA",X"FC",X"FE",X"FE",X"FE",X"BE", + X"00",X"00",X"60",X"28",X"64",X"7A",X"7E",X"7F",X"4F",X"27",X"0B",X"02",X"00",X"00",X"80",X"00", + X"00",X"FF",X"F7",X"BF",X"FF",X"00",X"FF",X"FE",X"00",X"FF",X"F3",X"5F",X"FF",X"00",X"FF",X"FF", + X"D7",X"FF",X"00",X"FF",X"FB",X"9E",X"FF",X"00",X"DB",X"FF",X"00",X"FF",X"DF",X"FD",X"FF",X"00", + X"80",X"80",X"C0",X"C0",X"80",X"80",X"80",X"40",X"03",X"02",X"02",X"02",X"06",X"02",X"02",X"02", + X"60",X"60",X"40",X"40",X"40",X"70",X"40",X"C0",X"06",X"06",X"02",X"03",X"01",X"01",X"01",X"01", + X"00",X"02",X"00",X"00",X"04",X"03",X"2B",X"07",X"00",X"DE",X"18",X"80",X"08",X"40",X"90",X"80", + X"0F",X"29",X"0F",X"06",X"00",X"00",X"00",X"00",X"94",X"00",X"22",X"02",X"02",X"32",X"00",X"00", + X"00",X"10",X"00",X"00",X"08",X"23",X"0B",X"07",X"00",X"00",X"00",X"00",X"00",X"44",X"94",X"80", + X"2F",X"09",X"0F",X"06",X"00",X"00",X"00",X"00",X"88",X"22",X"02",X"12",X"02",X"30",X"00",X"00", + X"00",X"20",X"00",X"00",X"08",X"03",X"2B",X"07",X"00",X"30",X"00",X"20",X"00",X"12",X"82",X"A2", + X"2F",X"09",X"0F",X"06",X"00",X"00",X"00",X"00",X"8A",X"22",X"08",X"48",X"08",X"C8",X"00",X"00", + X"00",X"3C",X"01",X"00",X"21",X"24",X"00",X"01",X"00",X"02",X"02",X"16",X"46",X"00",X"22",X"CA", + X"07",X"0D",X"0D",X"07",X"00",X"02",X"00",X"00",X"E0",X"E2",X"90",X"40",X"00",X"40",X"00",X"00", + X"00",X"1E",X"00",X"01",X"28",X"22",X"00",X"01",X"00",X"00",X"60",X"00",X"40",X"00",X"40",X"C0", + X"07",X"0D",X"0D",X"07",X"00",X"01",X"00",X"00",X"E0",X"E0",X"80",X"50",X"02",X"20",X"00",X"00", + X"00",X"03",X"00",X"3D",X"00",X"02",X"28",X"21",X"00",X"E0",X"00",X"00",X"22",X"8A",X"00",X"C0", + X"07",X"0D",X"0D",X"07",X"00",X"01",X"00",X"00",X"E0",X"E0",X"80",X"50",X"00",X"42",X"00",X"00", + X"00",X"E0",X"60",X"E0",X"C0",X"00",X"E0",X"60",X"00",X"07",X"03",X"05",X"07",X"00",X"03",X"05", + X"E0",X"E0",X"00",X"E0",X"A0",X"E0",X"C0",X"00",X"07",X"07",X"00",X"07",X"06",X"03",X"03",X"00", + X"00",X"00",X"00",X"04",X"0E",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"04",X"0E",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"07",X"02",X"00",X"00",X"00",X"00",X"30",X"08",X"04",X"00",X"00", + X"00",X"00",X"04",X"0E",X"04",X"00",X"00",X"00",X"00",X"04",X"08",X"10",X"20",X"00",X"00",X"00", + X"00",X"00",X"1A",X"36",X"36",X"3E",X"1E",X"0E",X"00",X"00",X"38",X"3C",X"38",X"30",X"38",X"3C", + X"1E",X"36",X"36",X"3F",X"1B",X"01",X"00",X"00",X"3C",X"38",X"30",X"78",X"FC",X"F8",X"00",X"00", + X"00",X"00",X"34",X"4C",X"4C",X"7C",X"3C",X"1C",X"00",X"00",X"0E",X"0C",X"08",X"0E",X"0C",X"08", + X"3C",X"4C",X"4C",X"7E",X"37",X"03",X"00",X"00",X"08",X"0C",X"0E",X"18",X"FC",X"FE",X"00",X"00", + X"43",X"30",X"0C",X"03",X"00",X"00",X"00",X"00",X"8C",X"43",X"20",X"43",X"8C",X"90",X"90",X"8C", + X"17",X"10",X"30",X"40",X"83",X"8C",X"90",X"90",X"14",X"12",X"09",X"09",X"13",X"14",X"14",X"14", + X"90",X"90",X"88",X"47",X"20",X"11",X"12",X"14",X"90",X"90",X"90",X"90",X"90",X"90",X"90",X"90", + X"44",X"88",X"90",X"90",X"90",X"90",X"90",X"90",X"00",X"00",X"01",X"02",X"04",X"08",X"11",X"22", + X"00",X"00",X"11",X"3B",X"3F",X"3F",X"00",X"00",X"00",X"00",X"88",X"DC",X"FC",X"FC",X"1C",X"0C", + X"00",X"3F",X"1F",X"27",X"3E",X"1C",X"00",X"00",X"1C",X"F8",X"F0",X"98",X"F8",X"70",X"00",X"00", + X"00",X"24",X"36",X"3F",X"00",X"00",X"00",X"00",X"00",X"24",X"6C",X"FC",X"1C",X"0C",X"0C",X"0C", + X"00",X"00",X"3F",X"1F",X"27",X"26",X"1C",X"00",X"0C",X"1C",X"F8",X"F0",X"98",X"98",X"70",X"00", + X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"0F",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0", + X"0F",X"0F",X"07",X"03",X"00",X"00",X"00",X"00",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"03",X"00",X"38",X"7C",X"72",X"7E",X"7E",X"72",X"02",X"02",X"02",X"02",X"94",X"00",X"A0",X"00", + X"7C",X"38",X"02",X"00",X"20",X"09",X"00",X"09",X"A0",X"00",X"20",X"0C",X"04",X"84",X"04",X"00", + X"00",X"00",X"00",X"01",X"0B",X"03",X"2B",X"03",X"00",X"78",X"00",X"C0",X"E0",X"90",X"F0",X"F4", + X"0B",X"23",X"09",X"00",X"04",X"00",X"00",X"0F",X"94",X"E0",X"C0",X"00",X"28",X"08",X"00",X"80", + X"1F",X"38",X"20",X"08",X"00",X"05",X"00",X"01",X"0C",X"00",X"04",X"00",X"38",X"7C",X"72",X"7E", + X"44",X"51",X"44",X"60",X"20",X"20",X"00",X"00",X"7E",X"72",X"7C",X"38",X"00",X"08",X"00",X"0C", + X"03",X"00",X"00",X"00",X"00",X"70",X"51",X"50",X"CC",X"00",X"04",X"80",X"38",X"7C",X"72",X"7E", + X"51",X"50",X"71",X"00",X"00",X"00",X"00",X"03",X"7E",X"72",X"7C",X"38",X"00",X"88",X"00",X"CC", + X"3C",X"7E",X"FE",X"7E",X"FE",X"FC",X"FE",X"F6",X"48",X"50",X"50",X"49",X"26",X"10",X"0C",X"03", + X"00",X"00",X"00",X"00",X"03",X"0C",X"10",X"27",X"7E",X"FE",X"FE",X"EC",X"FE",X"FE",X"7C",X"00", + X"00",X"E0",X"18",X"06",X"C1",X"30",X"0C",X"03",X"00",X"00",X"C0",X"00",X"01",X"06",X"08",X"06", + X"FE",X"06",X"18",X"E0",X"01",X"06",X"08",X"06",X"20",X"40",X"40",X"20",X"1F",X"00",X"00",X"00", + X"1F",X"20",X"C0",X"00",X"00",X"C1",X"21",X"21",X"40",X"40",X"3F",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"07",X"18",X"30",X"20",X"40",X"90",X"90",X"88",X"04",X"02",X"3C",X"C0",X"00", + X"90",X"A0",X"A1",X"A1",X"A1",X"A1",X"A1",X"A0",X"C7",X"20",X"E0",X"00",X"03",X"04",X"08",X"90", + X"A1",X"A1",X"A1",X"A0",X"20",X"20",X"10",X"08",X"0F",X"10",X"20",X"47",X"88",X"90",X"A0",X"A0", + X"88",X"48",X"48",X"48",X"C8",X"08",X"10",X"E0",X"88",X"48",X"48",X"48",X"88",X"10",X"20",X"10", + X"C8",X"48",X"48",X"48",X"88",X"10",X"20",X"10",X"E0",X"04",X"0F",X"08",X"C8",X"48",X"48",X"48", + X"F8",X"04",X"02",X"02",X"E2",X"12",X"11",X"10",X"04",X"04",X"FC",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"E0",X"10",X"08",X"04",X"04",X"7C",X"00",X"00",X"00",X"00",X"01",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"82",X"82",X"01",X"01",X"01",X"01",X"01",X"01",X"21",X"A1", + X"82",X"83",X"80",X"80",X"80",X"80",X"80",X"FF",X"A1",X"E1",X"01",X"01",X"01",X"01",X"01",X"FF", + X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"01",X"01",X"01",X"01",X"01",X"01",X"61",X"81", + X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"81",X"61",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"82",X"82",X"F0",X"08",X"04",X"E2",X"11",X"09",X"05",X"05", + X"83",X"82",X"82",X"80",X"80",X"80",X"80",X"80",X"E1",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"81",X"82",X"01",X"01",X"01",X"01",X"01",X"01",X"21",X"A1", + X"82",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"C1",X"E1",X"01",X"01",X"01",X"01",X"01",X"01", + X"FF",X"80",X"80",X"80",X"80",X"80",X"81",X"82",X"FF",X"01",X"01",X"01",X"01",X"01",X"E1",X"81", + X"82",X"81",X"80",X"80",X"80",X"80",X"80",X"80",X"81",X"E1",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"82",X"82",X"01",X"01",X"01",X"01",X"01",X"01",X"21",X"A1", + X"82",X"83",X"80",X"80",X"80",X"80",X"80",X"FF",X"A1",X"E1",X"01",X"01",X"01",X"01",X"01",X"FF", + X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"01",X"01",X"01",X"01",X"01",X"01",X"61",X"81", + X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"81",X"61",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"82",X"82",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"83",X"82",X"82",X"80",X"80",X"80",X"80",X"80",X"E1",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"80",X"80",X"80",X"80",X"80",X"80",X"81",X"82",X"01",X"01",X"01",X"01",X"01",X"01",X"21",X"A1", + X"82",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"C1",X"E1",X"01",X"01",X"01",X"01",X"01",X"01", + X"FF",X"80",X"80",X"80",X"80",X"80",X"81",X"82",X"FF",X"01",X"01",X"01",X"01",X"01",X"E1",X"81", + X"82",X"81",X"80",X"80",X"80",X"80",X"80",X"80",X"81",X"E1",X"01",X"01",X"01",X"01",X"01",X"01", + X"00",X"0F",X"38",X"70",X"70",X"60",X"60",X"70",X"00",X"E0",X"31",X"19",X"0B",X"0E",X"0C",X"08", + X"70",X"60",X"60",X"70",X"70",X"38",X"0F",X"00",X"08",X"0C",X"0E",X"0B",X"19",X"31",X"E0",X"00", + X"00",X"0F",X"38",X"70",X"70",X"43",X"47",X"74",X"00",X"E4",X"34",X"1C",X"0C",X"0C",X"8C",X"D8", + X"74",X"46",X"42",X"70",X"70",X"38",X"0F",X"00",X"D8",X"0C",X"0E",X"0B",X"19",X"31",X"E0",X"00", + X"00",X"0F",X"38",X"70",X"60",X"63",X"67",X"74",X"00",X"E0",X"31",X"19",X"0B",X"0E",X"8C",X"D8", + X"74",X"66",X"62",X"60",X"70",X"38",X"0F",X"00",X"D8",X"0C",X"0C",X"0C",X"1C",X"34",X"E4",X"00", + X"7C",X"82",X"01",X"01",X"01",X"01",X"01",X"82",X"E0",X"00",X"38",X"C7",X"00",X"00",X"00",X"00", + X"23",X"24",X"24",X"C4",X"05",X"05",X"09",X"11",X"CF",X"30",X"00",X"8F",X"90",X"A0",X"A0",X"A0", + X"02",X"04",X"F8",X"00",X"00",X"00",X"00",X"00",X"09",X"09",X"09",X"09",X"09",X"09",X"11",X"E1", + X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"12",X"09",X"09",X"09",X"09",X"09",X"09",X"09", + X"0A",X"12",X"14",X"24",X"48",X"88",X"C4",X"22",X"0A",X"09",X"09",X"05",X"05",X"05",X"09",X"09", + X"E2",X"04",X"08",X"10",X"C8",X"24",X"14",X"12",X"05",X"85",X"85",X"85",X"05",X"05",X"09",X"11", + X"09",X"30",X"42",X"23",X"02",X"40",X"63",X"40",X"48",X"04",X"02",X"E2",X"00",X"02",X"E0",X"02", + X"23",X"40",X"23",X"40",X"42",X"23",X"18",X"05",X"62",X"80",X"62",X"02",X"A0",X"E2",X"00",X"24", + X"00",X"10",X"70",X"E0",X"E0",X"C0",X"C0",X"E0",X"00",X"08",X"09",X"05",X"05",X"07",X"06",X"04", + X"E0",X"C0",X"C0",X"E0",X"E0",X"70",X"10",X"00",X"04",X"06",X"07",X"05",X"05",X"09",X"08",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GALAXIAN_6L.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GALAXIAN_6L.vhd new file mode 100644 index 00000000..9d5c2fdc --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GALAXIAN_6L.vhd @@ -0,0 +1,26 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_6L is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_6L is + type rom is array(31 downto 0) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"C6",X"07",X"76",X"00",X"C0",X"80",X"1E",X"00",X"80",X"C0",X"1E",X"00",X"76",X"C0",X"F6",X"00", + X"07",X"C4",X"C0",X"00",X"A4",X"07",X"F6",X"00",X"F6",X"07",X"C0",X"00",X"F6",X"21",X"1E",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; + + diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GAL_FIR.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GAL_FIR.vhd new file mode 100644 index 00000000..5aff2022 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GAL_FIR.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_FIR 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 prom of GAL_FIR is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AC",X"68",X"72",X"C7",X"93",X"3F",X"80",X"C8",X"5C",X"A1",X"22",X"90",X"B9",X"8A",X"41",X"62", + X"C2",X"A1",X"40",X"6A",X"C9",X"7F",X"64",X"3C",X"BC",X"AD",X"5B",X"4C",X"D4",X"62",X"3D",X"D3", + X"7F",X"31",X"A3",X"BE",X"5D",X"49",X"C7",X"7D",X"28",X"C0",X"A1",X"7A",X"7D",X"2B",X"C9",X"91", + X"80",X"6B",X"39",X"95",X"BA",X"91",X"27",X"C1",X"91",X"7E",X"6D",X"31",X"C0",X"A4",X"7C",X"7B", + X"37",X"80",X"CB",X"7E",X"88",X"64",X"40",X"8F",X"C3",X"83",X"83",X"68",X"36",X"D0",X"8C",X"29", + X"B4",X"B1",X"52",X"4B",X"E9",X"3E",X"74",X"C4",X"73",X"81",X"2B",X"AD",X"B9",X"4E",X"4B",X"CB", + X"91",X"76",X"33",X"B6",X"A5",X"6E",X"4A",X"63",X"D7",X"7C",X"3E",X"7E",X"DE",X"45",X"67",X"C1", + X"84",X"2D",X"A8",X"A9",X"20",X"AC",X"B5",X"7E",X"47",X"5F",X"DD",X"6E",X"44",X"BD",X"97",X"22", + X"AE",X"A4",X"25",X"CB",X"93",X"77",X"3C",X"78",X"CB",X"83",X"29",X"B3",X"AB",X"7D",X"5D",X"44", + X"A4",X"BC",X"79",X"8C",X"3A",X"76",X"CF",X"78",X"44",X"6B",X"D9",X"6B",X"3B",X"9A",X"CC",X"26", + X"A4",X"A3",X"1D",X"BA",X"A9",X"83",X"71",X"3A",X"8B",X"CC",X"6A",X"3E",X"E5",X"28",X"A4",X"A3", + X"1E",X"C9",X"9C",X"78",X"32",X"94",X"C4",X"74",X"88",X"2A",X"A2",X"BC",X"1A",X"E2",X"4B",X"86", + X"B3",X"72",X"48",X"68",X"D2",X"83",X"32",X"A4",X"B2",X"73",X"4E",X"5A",X"C8",X"9C",X"2C",X"90", + X"C1",X"7B",X"5E",X"41",X"CC",X"99",X"6F",X"3A",X"8B",X"C9",X"7A",X"84",X"23",X"BC",X"9D",X"33", + X"CC",X"82",X"24",X"D7",X"6C",X"47",X"D1",X"87",X"5C",X"41",X"C5",X"9F",X"71",X"35",X"A8",X"B9", + X"67",X"4F",X"5F",X"CE",X"8A",X"43",X"C6",X"80",X"54",X"4A",X"B1",X"AE",X"87",X"50",X"4F",X"C6", + X"9F",X"55",X"45",X"BB",X"AC",X"5C",X"41",X"A9",X"BE",X"5C",X"4C",X"72",X"D4",X"71",X"42",X"DA", + X"20",X"CF",X"6C",X"3D",X"D5",X"8A",X"78",X"39",X"7B",X"BF",X"99",X"75",X"37",X"99",X"C7",X"28", + X"7B",X"C3",X"91",X"58",X"46",X"9D",X"BB",X"88",X"60",X"40",X"9A",X"BB",X"8C",X"3B",X"6A",X"BA", + X"AC",X"31",X"7F",X"C8",X"2F",X"78",X"DC",X"33",X"AE",X"80",X"34",X"EE",X"38",X"74",X"D5",X"1F", + X"98",X"BA",X"82",X"58",X"4A",X"D6",X"86",X"56",X"49",X"F0",X"34",X"73",X"BD",X"9A",X"43",X"67", + X"C3",X"8D",X"2E",X"8B",X"B9",X"40",X"C6",X"33",X"B7",X"A5",X"27",X"8A",X"BA",X"42",X"BF",X"8A", + X"3A",X"6F",X"D1",X"5C",X"41",X"DF",X"6A",X"42",X"C3",X"A4",X"33",X"80",X"CC",X"5C",X"43",X"89", + X"BE",X"96",X"53",X"4E",X"8D",X"D4",X"2E",X"BD",X"56",X"6C",X"DA",X"53",X"47",X"9C",X"C8",X"2A", + X"75",X"B3",X"B0",X"2F",X"80",X"CA",X"2B",X"81",X"CD",X"35",X"7E",X"CE",X"32",X"81",X"CD",X"74", + X"40",X"74",X"D8",X"4E",X"58",X"D3",X"85",X"4D",X"53",X"AE",X"B8",X"61",X"3D",X"9F",X"C3",X"30", + X"86",X"D0",X"5E",X"47",X"7D",X"C6",X"91",X"4E",X"4E",X"A9",X"B9",X"6D",X"34",X"9F",X"B7",X"3F", + X"C6",X"7A",X"37",X"81",X"C5",X"8C",X"33",X"88",X"D3",X"44",X"59",X"82",X"C8",X"88",X"42",X"61", + X"AF",X"A2",X"44",X"D9",X"48",X"52",X"89",X"BC",X"99",X"2E",X"7E",X"B4",X"38",X"B7",X"9E",X"20", + X"E4",X"56",X"63",X"D9",X"56",X"43",X"B1",X"B8",X"37",X"6B",X"D3",X"6D",X"31",X"C8",X"65",X"8D", + X"B9",X"0B",X"BA",X"86",X"4D",X"D7",X"4E",X"4B",X"E7",X"3C",X"95",X"AD",X"1D",X"D8",X"72",X"35", + X"B4",X"A5",X"2F",X"B3",X"B6",X"44",X"57",X"93",X"CB",X"67",X"3F",X"A1",X"C7",X"21",X"89",X"9C", + X"5A",X"D8",X"20",X"A3",X"BA",X"25",X"89",X"AD",X"37",X"D8",X"5D",X"53",X"DC",X"77",X"43",X"70", + X"E1",X"46",X"59",X"83",X"CC",X"6E",X"37",X"E7",X"56",X"4E",X"86",X"D3",X"27",X"9E",X"AA",X"44", + X"C0",X"19",X"E9",X"54",X"63",X"DB",X"51",X"4D",X"88",X"CF",X"30",X"91",X"C5",X"66",X"35",X"C1", + X"9C",X"33",X"79",X"A7",X"BA",X"53",X"41",X"DD",X"4B",X"73",X"D2",X"25",X"7F",X"BB",X"9D",X"37", + X"68",X"A9",X"BD",X"3B",X"5C",X"CF",X"61",X"47",X"C9",X"9E",X"47",X"55",X"AF",X"96",X"5D",X"D0", + X"28",X"7E",X"D3",X"48",X"51",X"C7",X"95",X"21",X"BB",X"A6",X"3A",X"67",X"C3",X"81",X"37",X"DE", + X"7D",X"3F",X"72",X"AA",X"B4",X"15",X"DC",X"6C",X"47",X"D2",X"71",X"28",X"EB",X"2E",X"9F",X"93", + X"6C",X"9C",X"37",X"DB",X"43",X"AC",X"37",X"D3",X"4F",X"AC",X"8D",X"1B",X"DF",X"7E",X"46",X"6B", + X"BA",X"A5",X"35",X"73",X"CB",X"41",X"7E",X"C8",X"1D",X"D3",X"60",X"5F",X"DB",X"44",X"57",X"C2", + X"A2",X"41",X"5B",X"AE",X"96",X"5E",X"CC",X"10",X"CF",X"83",X"31",X"DF",X"59",X"46",X"CC",X"87", + X"28",X"D7",X"84",X"3D",X"7A",X"DD",X"3A",X"7B",X"C8",X"36",X"66",X"C8",X"60",X"9A",X"8F",X"29", + X"A8",X"B3",X"83",X"1F",X"D6",X"81",X"33",X"C4",X"82",X"2A",X"D4",X"6B",X"70",X"CA",X"1B",X"A9", + X"AB",X"22",X"AE",X"9E",X"49",X"D3",X"45",X"5A",X"A1",X"BB",X"70",X"27",X"E9",X"49",X"72",X"CC", + X"38",X"67",X"B6",X"AD",X"41",X"57",X"B7",X"8C",X"39",X"E4",X"70",X"4B",X"63",X"C7",X"52",X"AE", + X"8A",X"36",X"8A",X"BB",X"8E",X"2F",X"87",X"AB",X"B2",X"2D",X"72",X"94",X"CD",X"39",X"67",X"D9", + X"2B",X"86",X"C8",X"50",X"4D",X"BC",X"A1",X"3F",X"6B",X"BC",X"7C",X"48",X"E0",X"20",X"BA",X"83", + X"43",X"D4",X"26",X"BD",X"A2",X"3E",X"6C",X"CA",X"8A",X"38",X"7B",X"AF",X"AE",X"23",X"91",X"C0", + X"37",X"76",X"A3",X"C2",X"39",X"63",X"D9",X"48",X"5A",X"93",X"C9",X"43",X"62",X"90",X"B1",X"37", + X"D1",X"53",X"74",X"B1",X"37",X"F6",X"23",X"82",X"C3",X"52",X"4A",X"BB",X"75",X"95",X"88",X"3D", + X"90",X"C3",X"76",X"3B",X"87",X"A9",X"70",X"A6",X"61",X"4F",X"AE",X"B6",X"50",X"4B",X"E2",X"4A", + X"63",X"DC",X"3E",X"63",X"92",X"CC",X"4F",X"4D",X"E3",X"4A",X"5B",X"89",X"D0",X"47",X"5E",X"90", + X"D0",X"49",X"5B",X"7E",X"C6",X"76",X"3E",X"8C",X"AA",X"A4",X"15",X"CD",X"89",X"43",X"80",X"BD", + X"65",X"A8",X"3D",X"8E",X"CF",X"0B",X"C0",X"8E",X"46",X"76",X"C9",X"7A",X"3E",X"88",X"AA",X"A8", + X"18",X"BF",X"9C",X"2E",X"C3",X"85",X"2B",X"DC",X"6C",X"45",X"DB",X"4B",X"5F",X"92",X"AD",X"3D", + X"C3",X"4F",X"86",X"A6",X"75",X"81",X"36",X"E7",X"37",X"A6",X"7D",X"A5",X"5A",X"58",X"D8",X"4E", + X"56",X"AB",X"8E",X"49",X"DD",X"68",X"40",X"8A",X"B0",X"53",X"C3",X"4F",X"60",X"92",X"C6",X"51", + X"54",X"9A",X"C5",X"55",X"4D",X"93",X"C2",X"70",X"2F",X"E3",X"50",X"5B",X"8D",X"AF",X"48",X"AA", + X"81",X"98",X"4C",X"65",X"C1",X"66",X"BB",X"23",X"B0",X"9B",X"39",X"83",X"A4",X"B3",X"1A",X"B0", + X"9D",X"31",X"C3",X"8E",X"2B",X"E2",X"54",X"5A",X"DC",X"32",X"86",X"CA",X"14",X"C9",X"83",X"43", + X"83",X"AD",X"A6",X"15",X"DA",X"6D",X"4C",X"87",X"AF",X"63",X"B9",X"3A",X"8C",X"C5",X"0D",X"CC", + X"79",X"58",X"74",X"C9",X"7D",X"42",X"7C",X"B7",X"5C",X"A9",X"7B",X"41",X"93",X"B6",X"81",X"32", + X"9D",X"92",X"6B",X"87",X"9D",X"94",X"4A",X"6C",X"B7",X"A4",X"1B",X"BD",X"88",X"4D",X"7D",X"BD", + X"4D",X"99",X"8A",X"51",X"CF",X"1B",X"F2",X"56",X"5A",X"72",X"C3",X"4B",X"BE",X"63",X"52",X"E1", + X"2F",X"77",X"91",X"93",X"52",X"C0",X"37",X"E1",X"53",X"5A",X"DA",X"35",X"77",X"85",X"D5",X"39", + X"6D",X"80",X"D3",X"50",X"58",X"D3",X"2D",X"9A",X"B2",X"23",X"BC",X"8C",X"52",X"71",X"C1",X"8D", + X"3E",X"76",X"B3",X"6F",X"6D",X"A1",X"49",X"C9",X"2E",X"D1",X"38",X"C6",X"55",X"8B",X"7C",X"86", + X"B2",X"33",X"7E",X"AD",X"99",X"3C",X"80",X"A3",X"6E",X"88",X"98",X"50",X"AA",X"79",X"99",X"27", + X"FB",X"1D",X"AE",X"63",X"8F",X"94",X"51",X"B0",X"4A",X"AD",X"86",X"8B",X"39",X"EA",X"1B",X"AB", + X"9A",X"4C",X"73",X"B8",X"9A",X"3A",X"76",X"AC",X"64",X"88",X"8B",X"6D",X"A6",X"71",X"97",X"40", + X"8C",X"B5",X"4A",X"A0",X"68",X"86",X"8C",X"98",X"69",X"59",X"DE",X"1F",X"AB",X"A0",X"36",X"A8", + X"A7",X"28",X"E0",X"58",X"59",X"CE",X"37",X"82",X"C8",X"2E",X"A4",X"5A",X"AF",X"62",X"8E",X"C2", + X"2D",X"79",X"91",X"C2",X"2A",X"96",X"77",X"8A",X"99",X"8E",X"3D",X"C7",X"61",X"57",X"9D",X"A3", + X"44",X"DE",X"34",X"88",X"B1",X"37",X"89",X"A3",X"B3",X"15",X"CB",X"73",X"43",X"BA",X"8D",X"47", + X"9D",X"6F",X"C9",X"15",X"D1",X"72",X"53",X"CA",X"48",X"6B",X"9B",X"89",X"6A",X"A0",X"57",X"BE", + X"45",X"9C",X"A5",X"5E",X"54",X"CA",X"63",X"52",X"E1",X"25",X"AE",X"93",X"35",X"E5",X"2A",X"A5", + X"97",X"40",X"8A",X"9A",X"73",X"81",X"8E",X"57",X"CC",X"68",X"67",X"5D",X"C5",X"94",X"43",X"6E", + X"AA",X"A8",X"30",X"9D",X"6E",X"B3",X"6B",X"4B",X"AB",X"79",X"90",X"93",X"50",X"89",X"81",X"8A", + X"A4",X"42",X"9B",X"7F",X"67",X"9F",X"A8",X"48",X"80",X"BA",X"23",X"C5",X"6A",X"5E",X"91",X"99", + X"62",X"9A",X"91",X"6A",X"5A",X"D9",X"3D",X"81",X"B2",X"34",X"C5",X"7A",X"3F",X"BB",X"90",X"3D", + X"D0",X"50",X"65",X"95",X"94",X"63",X"C6",X"2D",X"A6",X"91",X"3D",X"CA",X"5F",X"66",X"91",X"97", + X"A6",X"35",X"A6",X"97",X"2E",X"D9",X"41",X"8F",X"A4",X"3E",X"A2",X"B0",X"2E",X"B5",X"7A",X"55", + X"C9",X"3F",X"84",X"C3",X"42",X"8A",X"72",X"9F",X"65",X"95",X"72",X"84",X"8A",X"58",X"C6",X"73", + X"47",X"D9",X"35",X"90",X"9F",X"4D",X"80",X"A8",X"A1",X"30",X"8F",X"8B",X"C5",X"18",X"B5",X"70", + X"65",X"B0",X"5D",X"93",X"93",X"7B",X"48",X"CB",X"52",X"7D",X"B0",X"3D",X"98",X"BA",X"2E",X"AD", + X"86",X"4A",X"BD",X"6E",X"4C",X"DA",X"53",X"78",X"77",X"96",X"75",X"83",X"82",X"82",X"A5",X"3D", + X"86",X"A2",X"A7",X"31",X"8B",X"8E",X"C3",X"20",X"AA",X"92",X"3A",X"C0",X"87",X"51",X"77",X"AD", + X"62",X"B9",X"4F",X"7F",X"BC",X"1E",X"BF",X"7E",X"51",X"C3",X"50",X"72",X"C0",X"49",X"8A",X"81", + X"72",X"AA",X"7B",X"55",X"8C",X"83",X"CA",X"2B",X"97",X"9C",X"4B",X"86",X"9F",X"B0",X"14",X"EA", + X"3C",X"8A",X"9B",X"51",X"C2",X"25",X"C7",X"70",X"5F",X"AF",X"52",X"C6",X"29",X"B8",X"7F",X"5F", + X"A3",X"5C",X"CB",X"26",X"AE",X"8B",X"3C",X"D6",X"48",X"8A",X"74",X"A2",X"8D",X"3F",X"D3",X"2A", + X"B9",X"7B",X"4D",X"A6",X"69",X"B6",X"6E",X"56",X"8A",X"A1",X"64",X"C3",X"28",X"B2",X"7D",X"60", + X"A6",X"58",X"D4",X"11",X"D1",X"5C",X"7A",X"A8",X"42",X"96",X"C7",X"27",X"A9",X"90",X"44",X"89", + X"9F",X"69",X"90",X"A7",X"25",X"DB",X"46",X"7C",X"B7",X"42",X"9A",X"6E",X"99",X"8C",X"81",X"41", + X"C7",X"7A",X"58",X"8D",X"83",X"B2",X"29",X"C1",X"6E",X"52",X"DA",X"44",X"83",X"B6",X"2A",X"C4", + X"41",X"A6",X"7A",X"76",X"98",X"5B",X"B6",X"86",X"42",X"A2",X"8A",X"4B",X"95",X"97",X"65",X"B7", + X"56",X"6C",X"D2",X"1E",X"B6",X"94",X"36",X"DD",X"38",X"96",X"7B",X"70",X"9E",X"95",X"59",X"77", + X"82",X"8D",X"7C",X"78",X"DC",X"01",X"CD",X"70",X"5D",X"76",X"B4",X"91",X"35",X"BD",X"48",X"D3", + X"36",X"8E",X"B7",X"2C",X"BE",X"49",X"CA",X"4C",X"72",X"CB",X"29",X"B9",X"82",X"3B",X"CC",X"71", + X"4B",X"D1",X"4F",X"6A",X"8D",X"C9",X"46",X"6A",X"CA",X"28",X"99",X"A9",X"61",X"59",X"AA",X"78", + X"8F",X"98",X"35",X"CE",X"64",X"58",X"95",X"A7",X"49",X"AC",X"57",X"9B",X"7C",X"70",X"DE",X"14", + X"A9",X"A3",X"3F",X"7B",X"C9",X"57",X"5F",X"D6",X"17",X"C5",X"7D",X"58",X"9E",X"71",X"B8",X"3D", + X"72",X"A7",X"6C",X"A7",X"80",X"3A",X"E5",X"22",X"A5",X"61",X"B6",X"86",X"38",X"D9",X"56",X"57", + X"9A",X"8E",X"64",X"97",X"96",X"7D",X"45",X"CC",X"5D",X"5A",X"A8",X"AA",X"3C",X"7E",X"97",X"C1", + X"22",X"9B",X"A7",X"45",X"7F",X"A1",X"B4",X"1D",X"BB",X"51",X"B9",X"7A",X"45",X"91",X"A5",X"67", + X"B8",X"34",X"9E",X"A8",X"35",X"88",X"B0",X"54",X"A8",X"8C",X"31",X"E7",X"41",X"6A",X"C7",X"41", + X"85",X"BA",X"2D",X"B1",X"A0",X"35",X"90",X"9F",X"75",X"A0",X"5D",X"52",X"CA",X"59",X"84",X"9A", + X"52",X"B2",X"66",X"AF",X"43",X"6E",X"BC",X"59",X"89",X"95",X"8B",X"74",X"44",X"AE",X"85",X"96", + X"7B",X"4A",X"8B",X"BD",X"7E",X"2F",X"D2",X"68",X"4D",X"D9",X"41",X"6F",X"CA",X"4D",X"62",X"A0", + X"B7",X"3C",X"76",X"D1",X"2E",X"98",X"B1",X"2A",X"BB",X"8D",X"2F",X"E2",X"4A",X"6C",X"C4",X"49", + X"64",X"A5",X"88",X"80",X"9E",X"2A",X"DD",X"59",X"54",X"CE",X"60",X"54",X"9E",X"9D",X"42",X"BF", + X"92",X"34",X"98",X"B7",X"40",X"77",X"9F",X"BC",X"28",X"93",X"B8",X"44",X"67",X"A7",X"AC",X"41", + X"6F",X"9F",X"91",X"50",X"C4",X"37",X"B1",X"7A",X"5B",X"DD",X"4C",X"58",X"C6",X"5D",X"51",X"BA", + X"82",X"47",X"D6",X"6B",X"45",X"AC",X"60",X"C5",X"3D",X"7D",X"CA",X"33",X"8D",X"AE",X"42",X"88", + X"CB",X"4F",X"5D",X"84",X"C3",X"31",X"B4",X"6B",X"6C",X"AD",X"73",X"AB",X"23",X"D5",X"6B",X"43", + X"D1",X"6A",X"47",X"CB",X"4B",X"77",X"C4",X"2B",X"BC",X"94",X"35",X"C6",X"77",X"3E",X"9E",X"94", + X"77",X"A5",X"43",X"7C",X"99",X"BD",X"3A",X"79",X"C8",X"2B",X"B8",X"83",X"37",X"D2",X"77",X"4F", + X"78",X"BD",X"43",X"AC",X"80",X"66",X"C8",X"28",X"89",X"A3",X"AF",X"2A",X"92",X"B9",X"3D",X"80", + X"CC",X"27",X"9A",X"B0",X"48",X"66",X"AD",X"8D",X"44",X"D0",X"6A",X"44",X"AA",X"87",X"6B",X"C7", + X"25",X"A3",X"AB",X"41",X"70",X"AD",X"71",X"9C",X"74",X"45",X"C9",X"91",X"51",X"5D",X"D9",X"4E", + X"62",X"C7",X"61",X"4C",X"A4",X"97",X"78",X"95",X"3D",X"9E",X"A8",X"30",X"D4",X"4B",X"81",X"B2", + X"33",X"C5",X"65",X"A4",X"63",X"4E",X"A8",X"98",X"5F",X"C0",X"30",X"96",X"B5",X"3D",X"75",X"B2", + X"92",X"31",X"B1",X"A5",X"33",X"A4",X"AD",X"43",X"68",X"B4",X"7A",X"51",X"DB",X"45",X"74",X"C9", + X"2D",X"95",X"AD",X"3B",X"8E",X"A9",X"3D",X"C0",X"70",X"62",X"D5",X"27",X"A7",X"9E",X"3F",X"7C", + X"BC",X"50",X"A4",X"8E",X"34",X"A3",X"A1",X"4E",X"99",X"BC",X"35",X"7B",X"BD",X"67",X"45",X"AA", + X"94",X"62",X"C1",X"3E",X"74",X"CB",X"41",X"74",X"A3",X"50",X"B6",X"9F",X"47",X"68",X"A6",X"AF", + X"4A",X"62",X"94",X"AC",X"3F",X"AD",X"A9",X"3F",X"72",X"8A",X"C7",X"54",X"5E",X"7A",X"C0",X"80", + X"4D",X"6B",X"B7",X"71",X"86",X"9F",X"2C",X"DC",X"60",X"59",X"79",X"BB",X"7C",X"40",X"A8",X"AC", + X"63",X"48",X"D4",X"67",X"56",X"79",X"B8",X"8D",X"38",X"BE",X"7E",X"3C",X"B0",X"97",X"54",X"C2", + X"37",X"98",X"B4",X"32",X"90",X"B9",X"4F",X"5E",X"B2",X"A0",X"34",X"9F",X"A3",X"35",X"AD",X"9B", + X"38",X"BB",X"97",X"4E",X"64",X"A4",X"94",X"53",X"D0",X"45",X"6A",X"C2",X"6E",X"42",X"CC",X"77", + X"52",X"73",X"BB",X"61",X"89",X"B2",X"2D",X"9C",X"B4",X"43",X"77",X"C5",X"57",X"59",X"93",X"A6", + X"5B",X"B6",X"50",X"63",X"BE",X"8D",X"4D",X"6A",X"A2",X"AA",X"6F",X"3F",X"C2",X"86",X"4B",X"75", + X"BD",X"76",X"4B",X"D2",X"5A",X"5A",X"8A",X"BF",X"5B",X"56",X"B3",X"9F",X"4E",X"66",X"C4",X"5D", + X"51",X"C0",X"68",X"70",X"C1",X"3E",X"75",X"BB",X"50",X"A6",X"88",X"3A",X"AB",X"A4",X"79",X"3A", + X"BC",X"8E",X"4A",X"74",X"B7",X"82",X"42",X"D2",X"5F",X"5A",X"7F",X"B4",X"8D",X"41",X"86",X"C0", + X"55",X"5F",X"C0",X"44",X"96",X"B6",X"5A",X"5A",X"84",X"BD",X"78",X"52",X"6C",X"BA",X"82",X"41", + X"BD",X"83",X"3E",X"A9",X"91",X"56",X"CA",X"38",X"95",X"AA",X"39",X"8B",X"AE",X"4D",X"8C",X"AC", + X"35",X"BC",X"79",X"52",X"C1",X"5A",X"80",X"C2",X"41",X"73",X"A8",X"4C",X"B1",X"9C",X"63",X"4F", + X"BB",X"8B",X"4B",X"70",X"B2",X"7F",X"46",X"D3",X"48",X"A3",X"94",X"3D",X"94",X"B6",X"52",X"61", + X"BD",X"49",X"91",X"B9",X"58",X"61",X"77",X"BD",X"4D",X"A9",X"84",X"43",X"CF",X"6A",X"58",X"74", + X"C2",X"57",X"93",X"61",X"84",X"BB",X"2E",X"B6",X"86",X"4B",X"C7",X"71",X"54",X"76",X"AF",X"73", + X"5D",X"D2",X"40",X"85",X"B7",X"59",X"5A",X"94",X"AF",X"40",X"9D",X"A1",X"32",X"BD",X"71",X"72", + X"BC",X"51",X"60",X"97",X"AC",X"7F",X"47",X"8D",X"B7",X"57",X"5B",X"C1",X"7B",X"52",X"73",X"AB", + X"8B",X"44",X"C1",X"82",X"42",X"BD",X"75",X"4B",X"B0",X"9D",X"6A",X"50",X"8A",X"AD",X"8E",X"53", + X"65",X"9C",X"AE",X"65",X"51",X"AF",X"99",X"43",X"80",X"B4",X"7E",X"3D",X"B9",X"6B",X"66",X"C2", + X"45",X"B4",X"81",X"50",X"72",X"BC",X"6E",X"4E",X"BA",X"7A",X"4A",X"C1",X"6F",X"5A",X"BB",X"89", + X"5C",X"5E",X"9B",X"AF",X"5E",X"5C",X"CA",X"43",X"87",X"B0",X"41",X"85",X"BA",X"4D",X"77",X"BA", + X"76",X"4A",X"A7",X"9D",X"54",X"61",X"AA",X"9C",X"47",X"7B",X"B2",X"8B",X"51",X"6C",X"9A",X"A4", + X"42",X"A4",X"A6",X"3A",X"A5",X"97",X"3F",X"9E",X"A7",X"78",X"4E",X"7F",X"B1",X"8A",X"58",X"64", + X"B8",X"88",X"48",X"87",X"B5",X"6E",X"49",X"BE",X"59",X"93",X"A5",X"46",X"74",X"9E",X"A3",X"35", + X"C2",X"72",X"55",X"C2",X"5B",X"60",X"B9",X"79",X"48",X"C8",X"57",X"84",X"B1",X"4B",X"6C",X"97", + X"AC",X"3F",X"8C",X"AF",X"47",X"AF",X"89",X"4A",X"7D",X"A4",X"9E",X"4F",X"6A",X"B1",X"8E",X"45", + X"88",X"B2",X"70",X"4B",X"A7",X"9C",X"41",X"AD",X"96",X"49",X"7B",X"B6",X"77",X"4B",X"B4",X"8D", + X"56",X"67",X"A2",X"A0",X"3E",X"B2",X"84",X"45",X"AC",X"9A",X"78",X"44",X"B1",X"80",X"52",X"C9", + X"4B",X"7E",X"B7",X"3C",X"A1",X"99",X"40",X"9F",X"A3",X"7C",X"4C",X"8A",X"B0",X"76",X"4C",X"9D", + X"A6",X"3F",X"9C",X"A5",X"5E",X"5C",X"B7",X"85",X"4E",X"7E",X"B4",X"6A",X"56",X"CD",X"4B",X"99", + X"6F",X"69",X"C4",X"45",X"89",X"B2",X"60",X"60",X"7F",X"BB",X"57",X"6E",X"B4",X"84",X"66",X"59", + X"BD",X"4A",X"9F",X"A0",X"5B",X"5F",X"A1",X"A4",X"65",X"57",X"94",X"A3",X"8E",X"46",X"8A",X"9B", + X"58",X"B7",X"78",X"4C",X"9B",X"A1",X"40",X"AF",X"87",X"42",X"B4",X"80",X"5E",X"BB",X"4B",X"7D", + X"BB",X"42",X"95",X"A1",X"42",X"AA",X"98",X"59",X"64",X"A4",X"A0",X"5F",X"5D",X"9C",X"A7",X"66", + X"57",X"A0",X"A4",X"5E",X"61",X"8A",X"B4",X"4D",X"92",X"A5",X"55",X"68",X"8F",X"B1",X"55",X"6C", + X"BE",X"51",X"88",X"A6",X"36",X"C2",X"6C",X"60",X"B2",X"84",X"4D",X"84",X"A8",X"4A",X"A5",X"9E", + X"60",X"5D",X"AD",X"92",X"76",X"4E",X"94",X"A8",X"72",X"4C",X"B0",X"7A",X"57",X"B8",X"85",X"72", + X"51",X"C2",X"59",X"6C",X"B1",X"86",X"69",X"5A",X"92",X"A9",X"7B",X"50",X"8B",X"B3",X"41",X"AD", + X"6F",X"61",X"B7",X"82",X"6E",X"55",X"A0",X"9F",X"4B",X"87",X"B1",X"52",X"9B",X"96",X"59",X"68", + X"B7",X"55",X"85",X"B1",X"64",X"65",X"70",X"BB",X"6A",X"5F",X"B0",X"8A",X"76",X"55",X"82",X"AE", + X"82",X"5F",X"66",X"A1",X"9C",X"48",X"B7",X"67",X"60",X"B8",X"76",X"4D",X"B7",X"76",X"62",X"B1", + X"7C",X"55",X"84",X"AD",X"77",X"55",X"8B",X"AC",X"40",X"9A",X"A1",X"75",X"57",X"7D",X"A6",X"91", + X"75",X"5C",X"74",X"AE",X"7D",X"52",X"C1",X"58",X"74",X"B7",X"45",X"95",X"A1",X"70",X"57",X"89", + X"AA",X"81",X"5B",X"6D",X"9F",X"9E",X"6F",X"57",X"AB",X"8E",X"63",X"5E",X"B0",X"80",X"4E",X"B1", + X"88",X"4C",X"9E",X"9A",X"46",X"98",X"A4",X"6C",X"55",X"B0",X"84",X"56",X"B8",X"48",X"92",X"A3", + X"7D",X"69",X"5C",X"A6",X"98",X"51",X"83",X"B5",X"4C",X"8E",X"A3",X"69",X"5E",X"80",X"AF",X"6B", + X"5B",X"B3",X"7C",X"52",X"B1",X"88",X"81",X"50",X"88",X"A7",X"83",X"54",X"82",X"AB",X"46",X"9F", + X"9F",X"4B",X"94",X"9F",X"42",X"A8",X"92",X"84",X"59",X"77",X"B3",X"46",X"A5",X"8C",X"4A",X"AE", + X"8A",X"59",X"A9",X"82",X"67",X"60",X"99",X"9F",X"81",X"6A",X"5B",X"BF",X"4F",X"9C",X"82",X"54", + X"BA",X"75",X"55",X"A7",X"8A",X"4B",X"A4",X"96",X"82",X"61",X"67",X"9A",X"9E",X"4D",X"8A",X"A7", + X"7F",X"73",X"52",X"BB",X"60",X"73",X"AC",X"83",X"73",X"59",X"89",X"A4",X"88",X"50",X"95",X"A2", + X"67",X"63",X"7D",X"B0",X"72",X"59",X"A9",X"8F",X"50",X"87",X"AC",X"47",X"9C",X"97",X"7B",X"53", + X"92",X"A0",X"7B",X"5B",X"7F",X"B1",X"49",X"8D",X"A4",X"7B",X"66",X"62",X"B4",X"76",X"66",X"AA", + X"81",X"62",X"6D",X"AF",X"80",X"6D",X"5C",X"97",X"9C",X"86",X"69",X"60",X"AE",X"80",X"4E",X"B9", + X"66",X"6D",X"AA",X"83",X"64",X"69",X"AD",X"86",X"6B",X"60",X"8C",X"AA",X"65",X"66",X"AF",X"80", + X"51",X"9A",X"9B",X"7B",X"72",X"57",X"A5",X"92",X"87",X"67",X"66",X"86",X"B2",X"58",X"8E",X"8B", + X"5F",X"B0",X"71",X"6B",X"63",X"A7",X"8F",X"85",X"67",X"63",X"B2",X"61",X"6F",X"AE",X"81",X"7F", + X"4E",X"A4",X"8D",X"51",X"9F",X"99",X"73",X"62",X"75",X"B6",X"66",X"79",X"9F",X"50",X"B7",X"4C", + X"8E",X"9E",X"7D",X"5C",X"7F",X"AF",X"4B",X"8D",X"A1",X"7D",X"65",X"66",X"AE",X"7B",X"62",X"AD", + X"7B",X"6C",X"5F",X"A8",X"8D",X"84",X"66",X"65",X"A7",X"8D",X"75",X"58",X"9F",X"97",X"74",X"60", + X"79",X"A4",X"8E",X"6A",X"5F",X"A7",X"8D",X"53",X"A7",X"87",X"73",X"57",X"B1",X"74",X"68",X"AD", + X"48",X"A0",X"94",X"81",X"6D",X"5F",X"94",X"9C",X"85",X"6D",X"5F",X"97",X"9D",X"78",X"5B",X"87", + X"AA",X"5E",X"6C",X"A6",X"8A",X"7A",X"5D",X"7B",X"9E",X"96",X"59",X"7D",X"AB",X"4C",X"98",X"95", + X"4B",X"A5",X"8B",X"55",X"A5",X"8D",X"71",X"60",X"84",X"A4",X"84",X"7F",X"5A",X"82",X"AB",X"5B", + X"78",X"B2",X"5B",X"7F",X"A2",X"4D",X"94",X"A2",X"51",X"98",X"93",X"78",X"57",X"9B",X"95",X"7D", + X"57",X"90",X"9D",X"53",X"A2",X"8D",X"6C",X"65",X"81",X"AD",X"68",X"71",X"A9",X"53",X"A4",X"82", + X"7A",X"55",X"A4",X"88",X"53",X"A5",X"8D",X"7F",X"6A",X"63",X"A7",X"87",X"59",X"A5",X"8A",X"77", + X"61",X"7B",X"AD",X"73",X"6B",X"A1",X"7F",X"6F",X"60",X"B2",X"6C",X"66",X"AA",X"82",X"81",X"5E", + X"75",X"9D",X"92",X"7D",X"6C",X"63",X"B0",X"73",X"60",X"A8",X"86",X"80",X"62",X"71",X"99",X"9A", + X"50",X"97",X"92",X"51",X"9D",X"96",X"51",X"A5",X"79",X"5D",X"AA",X"85",X"80",X"64",X"6D",X"AB", + X"77",X"64",X"A9",X"82",X"77",X"5F",X"85",X"A1",X"85",X"7F",X"5B",X"88",X"A4",X"4E",X"95",X"98", + X"81",X"69",X"69",X"B1",X"55",X"90",X"99",X"4F",X"A7",X"7E",X"59",X"AA",X"7C",X"5B",X"9E",X"92", + X"7E",X"70",X"5F",X"A1",X"8F",X"85",X"5F",X"78",X"A6",X"7F",X"77",X"5A",X"A0",X"87",X"58",X"A0", + X"93",X"59",X"97",X"94",X"5B",X"76",X"9F",X"8E",X"63",X"72",X"AC",X"57",X"81",X"A6",X"66",X"68", + X"A7",X"83",X"5C",X"A7",X"80",X"7A",X"59",X"97",X"9A",X"5D",X"7A",X"AD",X"66",X"72",X"A1",X"80", + X"70",X"62",X"A7",X"85",X"7B",X"5F",X"7E",X"9D",X"8E",X"73",X"5F",X"93",X"9D",X"63",X"6D",X"AA", + X"7B",X"89",X"5B",X"7F",X"A0",X"84",X"64",X"78",X"A5",X"7A",X"75",X"5E",X"9C",X"93",X"7F",X"7C", + X"58",X"A0",X"8D",X"80",X"61",X"77",X"9D",X"91",X"65",X"71",X"A4",X"80",X"76",X"5E",X"A4",X"89", + X"7C",X"62",X"78",X"9D",X"8D",X"7D",X"6C",X"68",X"B0",X"69",X"78",X"A3",X"54",X"9F",X"8A",X"79", + X"63",X"7A",X"9E",X"8D",X"64",X"71",X"AD",X"6D",X"6D",X"9D",X"86",X"6F",X"68",X"82",X"A8",X"6A", + X"74",X"A2",X"7A",X"73",X"61",X"B1",X"66",X"73",X"A8",X"5C",X"7D",X"A7",X"6C",X"6C",X"AA",X"56", + X"97",X"89",X"55",X"A7",X"85",X"85",X"6E",X"66",X"A6",X"82",X"82",X"5F",X"81",X"A5",X"55",X"8A", + X"9C",X"7C",X"81",X"5B",X"8A",X"9F",X"5E",X"7E",X"A9",X"5D",X"79",X"9E",X"87",X"61",X"76",X"9E", + X"8C",X"65",X"72",X"A2",X"83",X"78",X"60",X"A2",X"86",X"7C",X"5E",X"9B",X"8C",X"56",X"AD",X"66", + X"71",X"A3",X"81",X"82",X"66",X"74",X"AE",X"5E",X"82",X"9B",X"58",X"8E",X"9E",X"63",X"72",X"A1", + X"84",X"72",X"62",X"9F",X"8B",X"81",X"73",X"65",X"89",X"9D",X"7F",X"84",X"5E",X"84",X"9E",X"7C", + X"7B",X"5E",X"8B",X"96",X"8C",X"56",X"96",X"90",X"80",X"66",X"74",X"9A",X"92",X"61",X"78",X"9E", + X"87",X"69",X"72",X"A2",X"7F",X"76",X"63",X"8B",X"9A",X"83",X"5B",X"8F",X"98",X"7B",X"7F",X"5B", + X"92",X"98",X"5A",X"9D",X"86",X"81",X"62",X"80",X"A0",X"7B",X"76",X"61",X"9A",X"91",X"80",X"7B", + X"5E",X"91",X"96",X"7F",X"6E",X"69",X"99",X"94",X"64",X"75",X"A6",X"74",X"64",X"8F",X"9D",X"65", + X"72",X"A1",X"83",X"74",X"62",X"9F",X"89",X"82",X"72",X"67",X"88",X"9D",X"7A",X"62",X"AC",X"5A", + X"8F",X"90",X"7F",X"6E",X"6B",X"8E",X"9D",X"61",X"86",X"9B",X"56",X"9D",X"88",X"7C",X"64",X"7B", + X"99",X"8E",X"5E",X"7F",X"9F",X"7F",X"83",X"63",X"7D",X"A5",X"6A",X"6C",X"99",X"8F",X"57",X"A1", + X"7C",X"68",X"9C",X"86",X"6B",X"72",X"A2",X"7B",X"81",X"5C",X"98",X"90",X"77",X"61",X"A5",X"71", + X"6B",X"A0",X"87",X"73",X"68",X"A2",X"80",X"80",X"63",X"7D",X"9E",X"81",X"60",X"A2",X"77",X"69", + X"A8",X"6B",X"6D",X"9D",X"83",X"7E",X"65",X"7C",X"9D",X"86",X"62",X"80",X"A1",X"6F",X"68",X"A0", + X"83",X"84",X"6C",X"6E",X"92",X"9A",X"5D",X"8C",X"8F",X"5F",X"A1",X"7F",X"7F",X"65",X"7B",X"98", + X"8C",X"61",X"7C",X"A1",X"78",X"66",X"A3",X"68",X"75",X"A3",X"7A",X"87",X"69",X"70",X"8E",X"97", + X"7C",X"62",X"93",X"90",X"79",X"6B",X"74",X"A0",X"83",X"63",X"87",X"9E",X"6D",X"70",X"A1",X"60", + X"8E",X"91",X"7A",X"73",X"68",X"97",X"8E",X"84",X"73",X"68",X"8D",X"9A",X"75",X"66",X"9E",X"7F", + X"60",X"9A",X"8E",X"61",X"8D",X"92",X"57",X"96",X"8E",X"81",X"79",X"65",X"9C",X"87",X"7A",X"67", + X"80",X"9E",X"7D",X"85",X"64",X"7B",X"9B",X"85",X"72",X"68",X"98",X"8F",X"74",X"66",X"9A",X"89", + X"5D",X"8D",X"96",X"7C",X"60",X"A1",X"7C",X"69",X"9D",X"81",X"78",X"65",X"A2",X"78",X"69",X"A8", + X"62",X"83",X"95",X"7E",X"76",X"67",X"8B",X"97",X"7B",X"61",X"A7",X"6B",X"76",X"9C",X"7F",X"77", + X"66",X"91",X"95",X"77",X"64",X"98",X"8E",X"64",X"7B",X"9D",X"7F",X"61",X"94",X"8F",X"7C",X"66", + X"82",X"9D",X"7A",X"87",X"66",X"7A",X"A0",X"6E",X"6D",X"A0",X"7F",X"84",X"71",X"6B",X"9E",X"83", + X"7E",X"62",X"90",X"92",X"7B",X"79",X"62",X"A4",X"79",X"70",X"99",X"84",X"62",X"8B",X"92",X"7F", + X"74",X"6B",X"8A",X"99",X"75",X"68",X"99",X"8C",X"68",X"77",X"9D",X"7D",X"83",X"6F",X"6D",X"91", + X"91",X"83",X"6F",X"6E",X"99",X"8C",X"69",X"76",X"9F",X"79",X"68",X"A1",X"70",X"6D",X"9B",X"86", + X"60",X"9C",X"7C",X"6A",X"9F",X"7B",X"84",X"65",X"81",X"A0",X"61",X"89",X"91",X"7D",X"7B",X"65", + X"8D",X"95",X"7E",X"83",X"70",X"6D",X"A3",X"73",X"70",X"A1",X"67",X"7F",X"9C",X"5A",X"98",X"7F", + X"6B",X"A0",X"78",X"87",X"60",X"8A",X"95",X"7C",X"81",X"61",X"94",X"8E",X"7F",X"7A",X"67",X"88", + X"93",X"88",X"6F",X"71",X"A0",X"67",X"78",X"98",X"88",X"6D",X"72",X"9E",X"7E",X"83",X"78",X"67", + X"8D",X"92",X"82",X"63",X"8F",X"8F",X"7D",X"7A",X"66",X"8F",X"93",X"7B",X"66",X"A3",X"6B",X"7B", + X"97",X"7E",X"74",X"6B",X"9B",X"86",X"7F",X"80",X"66",X"82",X"95",X"87",X"62",X"88",X"95",X"7D", + X"82",X"6B",X"77",X"99",X"86",X"66",X"91",X"8C",X"74",X"6C",X"98",X"85",X"7B",X"66",X"97",X"87", + X"80",X"74",X"6D",X"8C",X"96",X"73",X"70",X"A1",X"64",X"7A",X"93",X"8D",X"64",X"80",X"96",X"82", + X"6F",X"71",X"99",X"87",X"65",X"82",X"98",X"7F",X"82",X"71",X"6F",X"92",X"8D",X"83",X"6E",X"73", + X"95",X"8C",X"6E",X"74",X"9A",X"7E",X"82",X"69",X"7E",X"9F",X"62",X"88",X"91",X"64",X"8F",X"8F", + X"65",X"7E",X"96",X"83",X"63",X"8D",X"90",X"7F",X"7D",X"67",X"98",X"85",X"7E",X"66",X"92",X"8B", + X"7C",X"6C",X"7C",X"9B",X"7C",X"69",X"94",X"86",X"7F",X"72",X"6F",X"8F",X"91",X"78",X"68",X"97", + X"89",X"7B",X"67",X"97",X"86",X"80",X"74",X"6C",X"94",X"8C",X"7E",X"82",X"6B",X"7C",X"9F",X"67", + X"82",X"96",X"6A",X"77",X"9A",X"7E",X"83",X"78",X"69",X"98",X"86",X"81",X"74",X"6D",X"8C",X"91", + X"81",X"7A",X"69",X"99",X"80",X"65",X"90",X"8F",X"7D",X"66",X"96",X"87",X"7F",X"67",X"8D",X"8F", + X"61",X"98",X"7F",X"67",X"8E",X"90",X"7D",X"82",X"69",X"7D",X"96",X"86",X"6A",X"7D",X"9D",X"6F", + X"76",X"99",X"6E",X"71",X"99",X"83",X"83",X"71",X"71",X"8F",X"91",X"71",X"72",X"9A",X"7D",X"84", + X"6A",X"7A",X"8C",X"94",X"6B",X"7D",X"94",X"7F",X"6D",X"79",X"97",X"84",X"67",X"85",X"93",X"81", + X"73",X"74",X"9B",X"7A",X"84",X"68",X"80",X"97",X"7E",X"83",X"69",X"82",X"99",X"69",X"82",X"97", + X"65",X"87",X"91",X"63",X"93",X"86",X"7F",X"76",X"6C",X"94",X"89",X"82",X"6D",X"78",X"96",X"86", + X"69",X"80",X"97",X"79",X"6D",X"97",X"7D",X"6A",X"9A",X"76",X"6D",X"98",X"83",X"81",X"7D",X"6C", + X"80",X"93",X"87",X"65",X"96",X"83",X"81",X"78",X"6B",X"99",X"82",X"82",X"73",X"70",X"91",X"8D", + X"7C",X"84",X"69",X"80",X"97",X"7B",X"85",X"6C",X"79",X"92",X"8B",X"73",X"71",X"9B",X"75",X"6E", + X"91",X"8E",X"70",X"73",X"97",X"84",X"6B",X"80",X"98",X"77",X"70",X"95",X"7F",X"67",X"93",X"89", + X"7F",X"7E",X"6B",X"83",X"95",X"7F",X"82",X"78",X"6C",X"98",X"83",X"81",X"79",X"6B",X"96",X"84", + X"67",X"95",X"84",X"68",X"8E",X"8F",X"71",X"72",X"8F",X"8F",X"6B",X"80",X"93",X"7A",X"6B",X"91", + X"87",X"65",X"90",X"8D",X"74",X"6E",X"93",X"89",X"7D",X"82",X"6B",X"7E",X"93",X"87",X"6B",X"7F", + X"97",X"7A",X"86",X"6B",X"7E",X"95",X"7D",X"83",X"71",X"74",X"93",X"88",X"7F",X"7E",X"69",X"96", + X"83",X"81",X"79",X"6C",X"8B",X"90",X"7D",X"83",X"77",X"6E",X"8A",X"92",X"77",X"71",X"98",X"78", + X"6F",X"9B",X"6E",X"7D",X"94",X"7A",X"83",X"65",X"93",X"88",X"81",X"78",X"6F",X"86",X"96",X"71", + X"79",X"94",X"7D",X"80",X"6C",X"7E",X"91",X"87",X"7E",X"80",X"6B",X"80",X"8F",X"8B",X"6B",X"7D", + X"95",X"7D",X"83",X"72",X"73",X"92",X"88",X"80",X"6E",X"7C",X"95",X"80",X"6D",X"7F",X"95",X"7D", + X"83",X"77",X"6E",X"92",X"88",X"7F",X"6F",X"7A",X"96",X"7F",X"6E",X"80",X"99",X"6B",X"7F",X"90", + X"80",X"75",X"72",X"94",X"87",X"75",X"72",X"99",X"78",X"6F",X"8C",X"8F",X"6C",X"7C",X"92",X"80", + X"78",X"6E",X"90",X"8C",X"72",X"73",X"96",X"81",X"81",X"6D",X"7F",X"95",X"7D",X"83",X"7B",X"6E", + X"83",X"93",X"7E",X"83",X"6A",X"88",X"90",X"66",X"8C",X"8D",X"69",X"86",X"92",X"7B",X"85",X"70", + X"76",X"8D",X"8E",X"70",X"78",X"96",X"7C",X"85",X"6F",X"79",X"98",X"74",X"71",X"90",X"89",X"7C", + X"83",X"6B",X"83",X"91",X"80",X"80",X"70",X"79",X"90",X"88",X"7E",X"81",X"6E",X"7D",X"98",X"71", + X"7B",X"93",X"7A",X"85",X"6B",X"80",X"92",X"81",X"80",X"71",X"79",X"99",X"74",X"78",X"93",X"7C", + X"83",X"70",X"78",X"8D",X"8B",X"7E",X"80",X"6C",X"82",X"90",X"84",X"6A",X"8B",X"8C",X"7D",X"81", + X"6B",X"8B",X"8F",X"6D",X"82",X"92",X"6C",X"7F",X"94",X"72",X"74",X"91",X"86",X"6D",X"82",X"93", + X"69",X"82",X"91",X"80",X"6E",X"81",X"94",X"77",X"73",X"93",X"7C",X"6F",X"97",X"78",X"71",X"8B", + X"8F",X"6C",X"82",X"8E",X"7D",X"81",X"6F",X"7C",X"8F",X"87",X"7E",X"80",X"6E",X"7E",X"8E",X"8A", + X"70",X"78",X"95",X"7D",X"84",X"78",X"71",X"87",X"91",X"79",X"70",X"91",X"85",X"7C",X"6F",X"8B", + X"8C",X"67",X"90",X"82",X"6F",X"91",X"84",X"76",X"72",X"8D",X"8D",X"70",X"7D",X"93",X"6F",X"7D", + X"95",X"68",X"88",X"8B",X"80",X"78",X"73",X"96",X"7D",X"84",X"73",X"75",X"93",X"83",X"81",X"77", + X"72",X"8E",X"8A",X"7E",X"80",X"6D",X"8C",X"8C",X"6A",X"83",X"8F",X"81",X"6D",X"85",X"8F",X"7E", + X"6D",X"88",X"8D",X"7F",X"6F",X"82",X"91",X"7D",X"6F",X"85",X"8F",X"7D",X"7D",X"6D",X"90",X"88", + X"7C",X"6E",X"94",X"80",X"70",X"8E",X"87",X"76",X"74",X"92",X"81",X"7D",X"6D",X"8F",X"87",X"7F", + X"71",X"7C",X"92",X"81",X"73",X"7A",X"95",X"7C",X"84",X"7B",X"6F",X"8D",X"8A",X"7B",X"71",X"82", + X"92",X"79",X"73",X"91",X"7E",X"6D",X"8D",X"89",X"7D",X"83",X"6D",X"84",X"8F",X"7D",X"83",X"70", + X"7B",X"8B",X"8B",X"7B",X"85",X"71",X"7A",X"93",X"7E",X"82",X"75",X"75",X"89",X"8D",X"7D",X"6D", + X"90",X"85",X"81",X"79",X"71",X"8D",X"8A",X"79",X"72",X"91",X"83",X"7D",X"6F",X"86",X"8E",X"7D", + X"70",X"85",X"90",X"7A",X"86",X"74",X"76",X"91",X"82",X"81",X"79",X"72",X"87",X"8D",X"80",X"6D", + X"86",X"8E",X"7E",X"82",X"76",X"74",X"89",X"8B",X"82",X"72",X"7F",X"94",X"6F",X"80",X"8D",X"7E", + X"73",X"7B",X"92",X"7F",X"71",X"8A",X"89",X"6A",X"89",X"8B",X"81",X"71",X"7F",X"91",X"7C",X"84", + X"79",X"72",X"8D",X"89",X"6C",X"8C",X"86",X"7F",X"7C",X"71",X"83",X"8D",X"83",X"7E",X"81",X"6E", + X"83",X"8D",X"85",X"71",X"7C",X"91",X"7E",X"82",X"7D",X"70",X"88",X"8D",X"7D",X"83",X"6E",X"84", + X"8F",X"7C",X"83",X"70",X"7E",X"90",X"7F",X"82",X"76",X"76",X"93",X"7E",X"83",X"7A",X"72",X"8D", + X"89",X"76",X"75",X"92",X"7F",X"83",X"76",X"76",X"92",X"7F",X"6F",X"8A",X"8A",X"7D",X"72",X"83", + X"90",X"79",X"75",X"8A",X"87",X"6B",X"89",X"89",X"7F",X"7F",X"71",X"81",X"93",X"70",X"7E",X"8E", + X"80",X"79",X"73",X"8E",X"88",X"79",X"72",X"8E",X"86",X"7B",X"72",X"8E",X"85",X"6E",X"8E",X"84", + X"6F",X"85",X"8E",X"78",X"74",X"91",X"7C",X"71",X"94",X"7A",X"73",X"8A",X"8C",X"76",X"76",X"8F", + X"84",X"7D",X"83",X"6E",X"86",X"8B",X"81",X"71",X"83",X"8D",X"7E",X"78",X"75",X"92",X"81",X"81", + X"7D",X"72",X"82",X"8E",X"80",X"80",X"7E",X"70",X"85",X"8C",X"83",X"70",X"80",X"8E",X"7F",X"72", + X"81",X"90",X"7A",X"86",X"72",X"7D",X"90",X"77",X"74",X"8C",X"88",X"7D",X"83",X"75",X"78",X"8C", + X"88",X"7D",X"83",X"74",X"79",X"8F",X"83",X"6F",X"87",X"8C",X"79",X"73",X"8A",X"89",X"7D",X"83", + X"76",X"76",X"8C",X"87",X"7F",X"7D",X"70",X"8C",X"87",X"80",X"71",X"84",X"8D",X"7C",X"73",X"8C", + X"83",X"6E",X"89",X"8A",X"7C",X"73",X"90",X"7E",X"83",X"70",X"84",X"8C",X"7E",X"78",X"78",X"93", + X"7A",X"73",X"8A",X"89",X"7C",X"84",X"77",X"76",X"90",X"81",X"81",X"7A",X"73",X"8B",X"89",X"71", + X"7E",X"8F",X"7E",X"71",X"8B",X"86",X"7F",X"7E",X"70",X"8D",X"87",X"72",X"7D",X"8E",X"82",X"73", + X"7E",X"8F",X"7F",X"82",X"7D",X"72",X"88",X"8C",X"6F",X"86",X"89",X"7D",X"81",X"70",X"83",X"8C", + X"82",X"70",X"83",X"8C",X"81",X"72",X"80",X"8E",X"7D",X"83",X"7A",X"74",X"86",X"8C",X"7C",X"72", + X"87",X"8B",X"7D",X"83",X"78",X"76",X"8F",X"82",X"71",X"8D",X"82",X"80",X"7E",X"72",X"83",X"8D", + X"7E",X"83",X"74",X"7E",X"8F",X"7B",X"85",X"74",X"7B",X"8F",X"7F",X"81",X"7B",X"73",X"87",X"8A", + X"80",X"72",X"8B",X"84",X"7E",X"80",X"70",X"8B",X"87",X"7E",X"82",X"73",X"7D",X"8C",X"86",X"77", + X"79",X"91",X"79",X"77",X"90",X"7A",X"77",X"90",X"79",X"75",X"8B",X"87",X"77",X"79",X"91",X"74", + X"7D",X"8C",X"7F",X"72",X"85",X"8B",X"7D",X"72",X"87",X"89",X"7F",X"7B",X"74",X"8D",X"86",X"76", + X"7A",X"91",X"74",X"7A",X"8B",X"86",X"78",X"77",X"8E",X"82",X"7F",X"81",X"73",X"7E",X"8C",X"84", + X"76",X"7B",X"91",X"77",X"77",X"8A",X"87",X"76",X"79",X"8B",X"86",X"75",X"7B",X"8B",X"85",X"72", + X"83",X"89",X"7E",X"7E",X"73",X"8F",X"80",X"73",X"83",X"8D",X"7D",X"84",X"73",X"7E",X"8B",X"84", + X"74",X"7D",X"8C",X"82",X"74",X"7F",X"8D",X"80",X"7B",X"74",X"8D",X"84",X"79",X"76",X"8F",X"80", + X"82",X"72",X"85",X"8A",X"7C",X"82",X"71",X"85",X"8A",X"7F",X"81",X"76",X"7B",X"8F",X"7F",X"83", + X"75",X"7B",X"89",X"89",X"73",X"81",X"8B",X"7C",X"84",X"74",X"7D",X"8C",X"81",X"71",X"89",X"87", + X"80",X"72",X"88",X"87",X"7F",X"75",X"82",X"8C",X"7B",X"84",X"73",X"7F",X"8E",X"7A",X"76",X"8D", + X"81",X"7E",X"74",X"8C",X"84",X"71",X"85",X"8A",X"7E",X"74",X"86",X"8A",X"7B",X"75",X"8A",X"85", + X"71",X"8B",X"83",X"73",X"89",X"85",X"7B",X"75",X"87",X"8A",X"79",X"76",X"8C",X"83",X"7F",X"80", + X"73",X"81",X"89",X"86",X"73",X"7D",X"8B",X"84",X"7A",X"76",X"8C",X"83",X"7F",X"75",X"81",X"8D", + X"7D",X"84",X"77",X"7A",X"8E",X"7B",X"75",X"8D",X"80",X"81",X"7B",X"75",X"8C",X"84",X"7F",X"73", + X"87",X"88",X"7D",X"82",X"75",X"7D",X"8D",X"7F",X"74",X"8D",X"7E",X"75",X"8D",X"7E",X"74",X"88", + X"88",X"7A",X"78",X"8D",X"7C",X"75",X"87",X"89",X"7A",X"76",X"88",X"89",X"77",X"7A",X"8E",X"7C", + X"74",X"8A",X"85",X"7E",X"82",X"76",X"7B",X"89",X"87",X"72",X"88",X"85",X"7E",X"81",X"74",X"7F", + X"88",X"87",X"75",X"7E",X"8E",X"77",X"79",X"8A",X"85",X"77",X"7A",X"8B",X"83",X"76",X"7F",X"8C", + X"73",X"7E",X"8B",X"82",X"75",X"7E",X"8C",X"7F",X"77",X"7C",X"8D",X"80",X"75",X"86",X"87",X"73", + X"7F",X"8B",X"80",X"7F",X"74",X"89",X"85",X"72",X"89",X"85",X"73",X"88",X"85",X"7D",X"82",X"71", + X"8A",X"84",X"83",X"74",X"82",X"89",X"81",X"78",X"7D",X"8C",X"7F",X"7C",X"76",X"8A",X"86",X"7B", + X"77",X"8C",X"81",X"80",X"7E",X"74",X"86",X"88",X"82",X"7A",X"78",X"8B",X"83",X"7E",X"82",X"77", + X"7B",X"88",X"87",X"7A",X"77",X"86",X"89",X"78",X"7A",X"8C",X"7F",X"81",X"79",X"78",X"87",X"87", + X"81",X"76",X"80",X"8D",X"74",X"81",X"89",X"7D",X"83",X"76",X"7D",X"8B",X"81",X"73",X"87",X"88", + X"7D",X"76",X"8D",X"7D",X"77",X"8A",X"82",X"7A",X"78",X"89",X"86",X"76",X"7C",X"8B",X"81",X"7D", + X"75",X"8B",X"82",X"74",X"8A",X"82",X"74",X"8B",X"81",X"80",X"7E",X"75",X"85",X"8A",X"77",X"7B", + X"8A",X"83",X"77",X"7C",X"8B",X"81",X"77",X"7D",X"8D",X"7D",X"83",X"7A",X"78",X"89",X"86",X"7D", + X"83",X"79",X"79",X"8A",X"84",X"75",X"80",X"8A",X"80",X"7B",X"78",X"8E",X"7C",X"78",X"8B",X"7F", + X"81",X"7C",X"76",X"86",X"87",X"80",X"74",X"85",X"88",X"7B",X"76",X"8C",X"81",X"82",X"78",X"7C", + X"8A",X"80",X"7B",X"78",X"8C",X"80",X"7E",X"75",X"87",X"87",X"7D",X"76",X"86",X"88",X"7B",X"77", + X"87",X"87",X"79",X"7A",X"8C",X"7B",X"78",X"8C",X"80",X"81",X"7D",X"76",X"85",X"88",X"80",X"7E", + X"76",X"86",X"88",X"7D",X"76",X"84",X"89",X"7B",X"79",X"89",X"81",X"80",X"7B",X"77",X"89",X"84", + X"80",X"7F",X"75",X"88",X"84",X"7F",X"77",X"7F",X"8B",X"80",X"78",X"7E",X"8C",X"7B",X"79",X"88", + X"83",X"77",X"7F",X"8C",X"76",X"7F",X"89",X"7F",X"78",X"7C",X"8B",X"81",X"76",X"83",X"8A",X"74", + X"83",X"88",X"75",X"82",X"89",X"74",X"81",X"89",X"7D",X"83",X"77",X"7C",X"8C",X"7E",X"76",X"88", + X"86",X"7E",X"83",X"7A",X"79",X"83",X"89",X"7F",X"76",X"88",X"85",X"74",X"84",X"89",X"75",X"82", + X"88",X"7D",X"83",X"75",X"80",X"88",X"82",X"7A",X"7B",X"8B",X"7E",X"82",X"7B",X"78",X"88",X"86", + X"76",X"83",X"88",X"74",X"83",X"88",X"7E",X"76",X"85",X"87",X"7E",X"82",X"7C",X"78",X"83",X"87", + X"83",X"76",X"80",X"89",X"80",X"77",X"81",X"8A",X"7E",X"81",X"7E",X"77",X"81",X"89",X"81",X"78", + X"7C",X"8B",X"80",X"82",X"74",X"86",X"85",X"80",X"77",X"82",X"88",X"7F",X"7A",X"7B",X"8C",X"7E", + X"82",X"7B",X"78",X"87",X"86",X"7E",X"82",X"76",X"81",X"8A",X"7A",X"79",X"87",X"86",X"7A",X"79", + X"89",X"83",X"7F",X"81",X"76",X"83",X"89",X"78",X"7C",X"89",X"82",X"78",X"7C",X"8B",X"7F",X"81", + X"7C",X"77",X"87",X"85",X"7E",X"81",X"77",X"7E",X"8A",X"80",X"81",X"7F",X"77",X"81",X"89",X"80", + X"80",X"7F",X"76",X"84",X"88",X"7E",X"82",X"79",X"7B",X"87",X"86",X"7C",X"79",X"88",X"83",X"76", + X"81",X"88",X"80",X"77",X"81",X"89",X"7D",X"78",X"86",X"84",X"76",X"81",X"88",X"80",X"77",X"85", + X"86",X"76",X"7E",X"89",X"81",X"78",X"7F",X"8A",X"7E",X"78",X"89",X"81",X"80",X"7E",X"77",X"82", + X"87",X"82",X"7F",X"81",X"78",X"7D",X"88",X"83",X"7F",X"77",X"86",X"85",X"7E",X"82",X"76",X"80", + X"88",X"82",X"7E",X"77",X"86",X"85",X"7F",X"77",X"86",X"85",X"7F",X"78",X"81",X"8A",X"75",X"83", + X"87",X"77",X"7F",X"8A",X"79",X"7B",X"88",X"84",X"76",X"84",X"85",X"7E",X"78",X"82",X"88",X"7F", + X"78",X"84",X"87",X"76",X"7F",X"88",X"82",X"7E",X"82",X"77",X"7F",X"89",X"7E",X"82",X"7B",X"7A", + X"87",X"85",X"76",X"81",X"88",X"80",X"77",X"81",X"88",X"7E",X"82",X"7E",X"78",X"82",X"87",X"81", + X"77",X"80",X"88",X"7F",X"78",X"81",X"89",X"7E",X"82",X"7E",X"78",X"82",X"88",X"81",X"78",X"7F", + X"89",X"7E",X"82",X"7E",X"78",X"83",X"88",X"7A",X"7B",X"88",X"81",X"7E",X"77",X"87",X"84",X"7F", + X"78",X"82",X"89",X"75",X"84",X"85",X"7F",X"81",X"78",X"7E",X"8A",X"7E",X"79",X"89",X"80",X"81", + X"7D",X"78",X"85",X"86",X"81",X"76",X"86",X"84",X"80",X"79",X"7E",X"88",X"81",X"79",X"7D",X"8A", + X"7E",X"82",X"7E",X"7A",X"7D",X"88",X"82",X"81",X"79",X"7F",X"8A",X"79",X"7B",X"88",X"82",X"7F", + X"7F",X"77",X"85",X"86",X"7F",X"78",X"82",X"88",X"7F",X"82",X"7B",X"7A",X"86",X"85",X"7F",X"81", + X"77",X"82",X"87",X"80",X"78",X"83",X"86",X"7D",X"83",X"77",X"81",X"88",X"7F",X"82",X"7B",X"7A", + X"88",X"83",X"77",X"83",X"87",X"78",X"7E",X"88",X"80",X"80",X"7F",X"79",X"7D",X"87",X"83",X"80", + X"77",X"83",X"85",X"7F",X"7A",X"7C",X"89",X"81",X"7A",X"7D",X"8A",X"7A",X"7B",X"86",X"84",X"7A", + X"7C",X"89",X"7F",X"82",X"7C",X"7A",X"88",X"81",X"77",X"85",X"86",X"77",X"84",X"85",X"77",X"81", + X"88",X"78",X"7D",X"87",X"82",X"78",X"81",X"87",X"7A",X"7C",X"89",X"7D",X"79",X"87",X"83",X"7A", + X"7C",X"88",X"82",X"7A",X"7D",X"88",X"80",X"78",X"86",X"83",X"76",X"84",X"86",X"7E",X"78",X"86", + X"83",X"7E",X"81",X"77",X"81",X"86",X"83",X"79",X"7E",X"88",X"7F",X"81",X"7D",X"79",X"86",X"84", + X"7E",X"82",X"77",X"81",X"86",X"82",X"78",X"82",X"86",X"80",X"7D",X"7A",X"89",X"80",X"7F",X"78", + X"88",X"81",X"78",X"87",X"81",X"7F",X"81",X"78",X"82",X"88",X"79",X"7F",X"88",X"7B",X"7B",X"85", + X"85",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"79",X"84",X"85",X"80",X"80",X"78",X"86",X"84",X"77", + X"81",X"87",X"7E",X"82",X"7A",X"7D",X"89",X"7E",X"82",X"7D",X"7A",X"82",X"87",X"7F",X"81",X"7F", + X"79",X"83",X"87",X"7A",X"7C",X"87",X"81",X"7E",X"79",X"85",X"85",X"7E",X"79",X"84",X"86",X"79", + X"7E",X"88",X"7B",X"7B",X"86",X"83",X"7F",X"82",X"79",X"7E",X"87",X"81",X"7D",X"79",X"86",X"84", + X"7F",X"79",X"84",X"85",X"77",X"85",X"84",X"7F",X"81",X"7A",X"7D",X"86",X"83",X"7E",X"82",X"7B", + X"7C",X"87",X"81",X"78",X"81",X"86",X"7F",X"79",X"82",X"86",X"7E",X"79",X"81",X"87",X"7E",X"79", + X"87",X"82",X"7F",X"80",X"78",X"84",X"85",X"7C",X"7B",X"87",X"81",X"80",X"78",X"86",X"83",X"80", + X"7B",X"7C",X"88",X"81",X"7C",X"7C",X"89",X"7B",X"7B",X"85",X"84",X"7B",X"7B",X"85",X"84",X"7C", + X"7A",X"86",X"84",X"7C",X"7B",X"87",X"82",X"7F",X"79",X"85",X"84",X"78",X"84",X"84",X"7A",X"7E", + X"87",X"81",X"7A",X"81",X"86",X"7A",X"7C",X"87",X"81",X"7F",X"81",X"7A",X"7F",X"88",X"7E",X"7A", + X"85",X"83",X"7A",X"7E",X"88",X"7B",X"7D",X"88",X"7D",X"7B",X"87",X"80",X"79",X"84",X"84",X"7E", + X"82",X"79",X"7F",X"87",X"80",X"80",X"79",X"83",X"86",X"7F",X"79",X"83",X"85",X"78",X"80",X"87", + X"7F",X"81",X"7A",X"7F",X"88",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"7A",X"84",X"85",X"7F",X"79", + X"81",X"87",X"7E",X"82",X"7B",X"7E",X"87",X"7E",X"79",X"84",X"85",X"7E",X"82",X"7C",X"7B",X"84", + X"86",X"78",X"83",X"84",X"80",X"7A",X"7E",X"86",X"82",X"7A",X"7E",X"87",X"81",X"7A",X"7F",X"87", + X"80",X"7E",X"79",X"86",X"83",X"7F",X"81",X"79",X"81",X"86",X"7E",X"82",X"7B",X"7D",X"87",X"80", + X"81",X"7F",X"7A",X"81",X"87",X"7C",X"7B",X"86",X"82",X"7C",X"7B",X"86",X"83",X"7D",X"7A",X"88", + X"7E",X"7B",X"85",X"82",X"7B",X"7D",X"87",X"80",X"7E",X"7A",X"85",X"84",X"7E",X"7A",X"85",X"84", + X"7E",X"7A",X"84",X"84",X"7E",X"82",X"79",X"80",X"86",X"7E",X"7A",X"85",X"83",X"7F",X"80",X"79", + X"85",X"84",X"79",X"82",X"86",X"79",X"81",X"86",X"7B",X"7D",X"87",X"7F",X"79",X"86",X"81",X"79", + X"85",X"83",X"79",X"82",X"85",X"78",X"82",X"85",X"7F",X"81",X"7B",X"7D",X"87",X"80",X"80",X"7F", + X"7A",X"83",X"86",X"7B",X"7D",X"86",X"81",X"7B",X"7D",X"86",X"82",X"7C",X"7D",X"88",X"7D",X"7B", + X"83",X"85",X"7E",X"7A",X"83",X"85",X"7C",X"7C",X"86",X"80",X"7F",X"7A",X"85",X"83",X"79",X"85", + X"83",X"7A",X"81",X"86",X"79",X"80",X"85",X"81",X"7E",X"7B",X"87",X"80",X"81",X"7E",X"7B",X"83", + X"86",X"79",X"81",X"84",X"80",X"7B",X"80",X"86",X"7F",X"7D",X"7D",X"88",X"7E",X"82",X"7C",X"7C", + X"85",X"83",X"79",X"81",X"86",X"7F",X"7A",X"82",X"86",X"79",X"80",X"85",X"81",X"7A",X"7F",X"86", + X"81",X"7B",X"7E",X"87",X"7F",X"80",X"80",X"7B",X"80",X"87",X"7E",X"7A",X"85",X"83",X"7F",X"7A", + X"84",X"84",X"7F",X"7C",X"7E",X"87",X"7E",X"82",X"7D",X"7B",X"85",X"81",X"7F",X"7A",X"85",X"82", + X"7F",X"7B",X"80",X"86",X"80",X"7B",X"80",X"86",X"7F",X"80",X"80",X"7A",X"81",X"85",X"7F",X"7A", + X"82",X"85",X"80",X"7B",X"81",X"86",X"7C",X"7C",X"86",X"81",X"81",X"7C",X"7E",X"86",X"7F",X"80", + X"79",X"84",X"84",X"7F",X"80",X"7F",X"7A",X"83",X"84",X"7F",X"81",X"7B",X"7E",X"83",X"85",X"7D", + X"7C",X"86",X"81",X"7A",X"81",X"85",X"7F",X"7B",X"84",X"82",X"7F",X"81",X"7A",X"80",X"85",X"81", + X"7F",X"81",X"7D",X"7C",X"84",X"84",X"7F",X"7A",X"82",X"85",X"7F",X"81",X"7F",X"7A",X"84",X"83", + X"7F",X"80",X"7A",X"81",X"85",X"80",X"80",X"7D",X"7C",X"86",X"81",X"80",X"80",X"7A",X"85",X"82", + X"7F",X"81",X"7B",X"7E",X"85",X"82",X"7F",X"81",X"7B",X"7F",X"84",X"83",X"7C",X"7D",X"85",X"82", + X"7C",X"7E",X"86",X"7D",X"7C",X"85",X"82",X"7F",X"81",X"7E",X"7B",X"84",X"83",X"81",X"7C",X"7D", + X"87",X"7C",X"7E",X"86",X"7F",X"7B",X"86",X"80",X"81",X"7C",X"7E",X"86",X"7F",X"7B",X"83",X"84", + X"7F",X"80",X"7A",X"81",X"85",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"7E",X"7C",X"87",X"7E",X"7C", + X"85",X"80",X"7B",X"84",X"82",X"79",X"82",X"84",X"81",X"7A",X"81",X"85",X"80",X"7F",X"7B",X"86", + X"81",X"7A",X"83",X"84",X"7F",X"81",X"7F",X"7B",X"82",X"85",X"7B",X"7D",X"85",X"81",X"7F",X"81", + X"7D",X"7C",X"85",X"82",X"80",X"7A",X"83",X"83",X"80",X"7D",X"7D",X"86",X"80",X"7F",X"7B",X"84", + X"83",X"7F",X"81",X"7E",X"7C",X"83",X"84",X"7B",X"81",X"85",X"7C",X"7E",X"86",X"7C",X"7D",X"84", + X"84",X"7C",X"7E",X"85",X"80",X"7C",X"7D",X"85",X"81",X"7F",X"81",X"7C",X"7F",X"86",X"7F",X"81", + X"7F",X"7B",X"84",X"83",X"7C",X"7F",X"86",X"7B",X"7E",X"84",X"82",X"7D",X"7D",X"85",X"80",X"7F", + X"7B",X"86",X"80",X"80",X"7F",X"7B",X"82",X"85",X"7B",X"80",X"84",X"80",X"7D",X"7D",X"85",X"82", + X"7D",X"7D",X"85",X"81",X"7D",X"7D",X"84",X"82",X"7D",X"7E",X"86",X"7D",X"7C",X"84",X"82",X"7B", + X"80",X"85",X"7F",X"80",X"80",X"7B",X"81",X"85",X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"7B", + X"81",X"84",X"7F",X"7B",X"83",X"83",X"7F",X"81",X"7B",X"80",X"83",X"83",X"7D",X"7C",X"85",X"81", + X"7F",X"81",X"7D",X"7D",X"83",X"83",X"80",X"7B",X"83",X"83",X"80",X"7B",X"81",X"84",X"80",X"7C", + X"80",X"85",X"7B",X"7E",X"84",X"82",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"80",X"7B",X"83",X"84", + X"7A",X"83",X"82",X"80",X"7C",X"81",X"85",X"7B",X"7F",X"84",X"80",X"7F",X"81",X"7C",X"7F",X"85", + X"7E",X"7C",X"83",X"84",X"7F",X"81",X"7B",X"80",X"84",X"7F",X"81",X"7D",X"7C",X"83",X"83",X"80", + X"7B",X"80",X"84",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F",X"7C",X"81",X"85",X"7B",X"7F",X"85", + X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"80",X"80",X"7B",X"82",X"83",X"7F",X"81",X"7D",X"7D", + X"85",X"80",X"80",X"80",X"7C",X"80",X"85",X"80",X"80",X"7F",X"7C",X"85",X"81",X"7B",X"82",X"83", + X"7A",X"82",X"83",X"7F",X"81",X"7B",X"80",X"85",X"7F",X"7C",X"84",X"82",X"7B",X"80",X"84",X"81", + X"7C",X"7F",X"85",X"7F",X"82",X"7D",X"7E",X"85",X"80",X"7B",X"82",X"83",X"7F",X"80",X"7B",X"85", + X"81",X"7B",X"81",X"84",X"80",X"7C",X"83",X"82",X"7B",X"80",X"84",X"80",X"81",X"7C",X"81",X"85", + X"7B",X"7F",X"85",X"7D",X"7D",X"84",X"81",X"80",X"81",X"7E",X"7C",X"83",X"83",X"7F",X"7C",X"81", + X"84",X"7F",X"81",X"7C",X"7F",X"85",X"7F",X"7C",X"82",X"83",X"7E",X"7C",X"82",X"84",X"7F",X"81", + X"7F",X"7C",X"81",X"84",X"80",X"80",X"81",X"7C",X"80",X"85",X"7F",X"7C",X"84",X"80",X"81",X"7C", + X"7F",X"84",X"81",X"7E",X"7D",X"84",X"82",X"7D",X"7D",X"84",X"81",X"7E",X"7C",X"84",X"81",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"7C",X"82",X"83",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F", + X"7C",X"80",X"83",X"82",X"7D",X"7E",X"84",X"81",X"7F",X"81",X"7C",X"80",X"84",X"81",X"7D",X"7E", + X"84",X"80",X"7F",X"7C",X"83",X"83",X"7E",X"7D",X"84",X"81",X"7B",X"82",X"83",X"7F",X"7C",X"81", + X"83",X"80",X"7C",X"81",X"84",X"7F",X"80",X"80",X"7C",X"81",X"84",X"7D",X"7D",X"83",X"82",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"80",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"84",X"81", + X"7F",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"85",X"80",X"80",X"7F",X"7C",X"83",X"82",X"7C", + X"81",X"84",X"7C",X"80",X"84",X"7D",X"7E",X"85",X"7F",X"7C",X"83",X"82",X"7F",X"81",X"7C",X"81", + X"84",X"80",X"80",X"80",X"7D",X"7F",X"83",X"82",X"7C",X"81",X"83",X"7F",X"81",X"7C",X"7F",X"83", + X"81",X"7F",X"81",X"7D",X"7E",X"85",X"80",X"80",X"7F",X"7C",X"82",X"83",X"7D",X"7E",X"83",X"82", + X"7E",X"7D",X"84",X"81",X"80",X"80",X"7C",X"81",X"84",X"80",X"81",X"7E",X"7D",X"84",X"82",X"7C", + X"82",X"83",X"7C",X"7F",X"84",X"80",X"80",X"81",X"7D",X"7E",X"83",X"82",X"80",X"80",X"7C",X"82", + X"83",X"7C",X"80",X"84",X"7D",X"7D",X"84",X"80",X"81",X"7C",X"82",X"83",X"7F",X"7E",X"7E",X"84", + X"80",X"80",X"80",X"7D",X"7E",X"85",X"80",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7F",X"7C",X"82", + X"83",X"7B",X"80",X"83",X"80",X"7D",X"7E",X"84",X"80",X"80",X"80",X"7D",X"7F",X"84",X"7F",X"7C", + X"84",X"81",X"80",X"7C",X"83",X"82",X"7C",X"82",X"82",X"7C",X"80",X"84",X"7D",X"7E",X"84",X"80", + X"80",X"80",X"7C",X"83",X"82",X"80",X"7E",X"7E",X"85",X"7E",X"7D",X"82",X"83",X"7E",X"7D",X"83", + X"80",X"7C",X"83",X"81",X"7C",X"83",X"81",X"80",X"80",X"7C",X"7F",X"82",X"82",X"7E",X"7D",X"83", + X"82",X"7E",X"7D",X"83",X"82",X"7E",X"7E",X"84",X"7F",X"7C",X"84",X"80",X"7C",X"83",X"81",X"7F", + X"80",X"7C",X"81",X"83",X"80",X"7F",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7B",X"82",X"82",X"7F", + X"80",X"7C",X"82",X"82",X"80",X"7D",X"82",X"83",X"7B",X"82",X"82",X"80",X"7D",X"80",X"83",X"80", + X"7D",X"80",X"84",X"7F",X"81",X"7F",X"7D",X"82",X"83",X"80",X"7C",X"81",X"83",X"7F",X"7D",X"81", + X"84",X"7D",X"7F",X"84",X"7F",X"7D",X"84",X"80",X"81",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7E", + X"82",X"83",X"7F",X"81",X"7D",X"7F",X"83",X"81",X"7D",X"7F",X"84",X"80",X"7C",X"83",X"81",X"7C", + X"82",X"82",X"7C",X"80",X"83",X"80",X"80",X"80",X"7D",X"7E",X"83",X"81",X"80",X"80",X"7F",X"7D", + X"82",X"83",X"80",X"80",X"80",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7D",X"82",X"82",X"80",X"7E", + X"7D",X"84",X"81",X"80",X"80",X"7D",X"80",X"84",X"7E",X"7E",X"83",X"81",X"7F",X"7D",X"82",X"82", + X"7E",X"7E",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"7D",X"82",X"83",X"7F",X"7D",X"83",X"81",X"7C", + X"82",X"81",X"7F",X"81",X"7D",X"80",X"83",X"7F",X"7D",X"83",X"81",X"7F",X"81",X"7C",X"81",X"83", + X"7F",X"80",X"7F",X"7D",X"82",X"82",X"80",X"7D",X"80",X"83",X"80",X"7D",X"82",X"82",X"7F",X"81", + X"7D",X"7F",X"82",X"82",X"7D",X"81",X"83",X"7F",X"81",X"7D",X"7E",X"84",X"7F",X"7D",X"83",X"80", + X"7D",X"83",X"81",X"80",X"7E",X"7E",X"84",X"7E",X"7E",X"82",X"81",X"7D",X"80",X"83",X"81",X"7E", + X"7E",X"83",X"81",X"7D",X"80",X"83",X"7E",X"7E",X"83",X"81",X"80",X"80",X"7C",X"82",X"82",X"7E", + X"7E",X"83",X"81",X"7E",X"7E",X"83",X"80",X"80",X"7F",X"7D",X"83",X"80",X"80",X"7D",X"83",X"81", + X"80",X"7D",X"80",X"83",X"7F",X"81",X"7E",X"7F",X"83",X"7F",X"7D",X"83",X"80",X"7C",X"83",X"81", + X"7D",X"82",X"82",X"7C",X"81",X"82",X"80",X"7E",X"7F",X"83",X"81",X"7E",X"7F",X"83",X"80",X"80", + X"81",X"7D",X"7F",X"83",X"81",X"7D",X"80",X"83",X"80",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"7F", + X"83",X"80",X"7D",X"83",X"80",X"7F",X"7D",X"83",X"81",X"80",X"80",X"7D",X"81",X"83",X"80",X"7D", + X"83",X"81",X"80",X"80",X"7D",X"80",X"82",X"81",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81", + X"80",X"81",X"7E",X"7E",X"82",X"82",X"7F",X"7D",X"82",X"82",X"7C",X"81",X"82",X"81",X"7D",X"81", + X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"81",X"7E",X"7E", + X"83",X"81",X"7F",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82",X"82",X"7E",X"7E",X"83", + X"80",X"80",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"7F",X"7E",X"83",X"80",X"7D",X"81",X"83", + X"7F",X"80",X"80",X"7D",X"80",X"83",X"7D",X"7F",X"83",X"80",X"81",X"7E",X"7E",X"83",X"80",X"80", + X"80",X"7D",X"80",X"82",X"82",X"7D",X"80",X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"80",X"80",X"7D",X"80",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"81",X"7F",X"7E",X"82",X"81", + X"7D",X"81",X"82",X"7F",X"81",X"7D",X"80",X"82",X"81",X"7E",X"7F",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"7D",X"81",X"82",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"7F",X"7D",X"81",X"83",X"7F", + X"7E",X"82",X"81",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"81",X"82",X"7F",X"80",X"7E",X"7E",X"82", + X"82",X"80",X"80",X"7D",X"81",X"83",X"7E",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82", + X"82",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"80",X"82",X"80",X"7E",X"80",X"83",X"80", + X"7F",X"7E",X"83",X"81",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"83",X"7F", + X"7E",X"83",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"80",X"7D",X"80",X"82", + X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"82",X"80",X"7F",X"7E",X"83",X"7F",X"7E", + X"83",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"81",X"81",X"80",X"7E",X"7F",X"83",X"80", + X"7F",X"7E",X"83",X"80",X"80",X"80",X"7F",X"7E",X"82",X"82",X"80",X"80",X"80",X"7D",X"81",X"82", + X"7D",X"80",X"83",X"7F",X"7E",X"82",X"81",X"7D",X"80",X"82",X"80",X"7D",X"81",X"81",X"80",X"7D", + X"81",X"82",X"80",X"7E",X"7F",X"83",X"80",X"80",X"80",X"7E",X"7F",X"82",X"82",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"82",X"82",X"80",X"80",X"80",X"7E",X"80",X"82", + X"81",X"7E",X"81",X"82",X"7F",X"81",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"80",X"82",X"81", + X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E",X"80",X"82",X"80", + X"80",X"80",X"7D",X"82",X"81",X"80",X"80",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"82",X"81", + X"7F",X"81",X"7E",X"7F",X"82",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"7D", + X"81",X"82",X"7D",X"80",X"82",X"80",X"7E",X"81",X"82",X"7D",X"81",X"81",X"80",X"7D",X"81",X"82", + X"7F",X"80",X"7E",X"7F",X"82",X"81",X"7F",X"81",X"7D",X"81",X"82",X"7E",X"7F",X"82",X"81",X"7E", + X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E", + X"7F",X"82",X"81",X"7E",X"81",X"82",X"7E",X"7F",X"82",X"80",X"80",X"7E",X"81",X"82",X"7F",X"80", + X"7E",X"80",X"81",X"82",X"7F",X"7E",X"82",X"81",X"7F",X"81",X"7F",X"7E",X"82",X"81",X"7E",X"80", + X"82",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E", + X"82",X"81",X"80",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"82",X"80",X"7F",X"7F",X"83",X"7E",X"7F", + X"82",X"80",X"7F",X"7E",X"82",X"81",X"7F",X"7E",X"82",X"81",X"80",X"7E",X"81",X"81",X"80",X"7E", + X"80",X"82",X"80",X"7F",X"7E",X"83",X"80",X"80",X"80",X"7E",X"81",X"82",X"80",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7E",X"7F",X"82",X"81",X"7F",X"7F",X"83",X"7E",X"7F",X"82",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GAL_HIT.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GAL_HIT.vhd new file mode 100644 index 00000000..7d2fd29c --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/GAL_HIT.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_HIT 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 prom of GAL_HIT is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"65",X"75",X"88",X"90",X"93",X"9B",X"A3",X"A3",X"A3",X"A6",X"9E",X"9B",X"9B",X"A3",X"AB",X"B6", + X"B9",X"B9",X"BE",X"B9",X"AE",X"A6",X"9E",X"98",X"88",X"78",X"68",X"65",X"65",X"65",X"62",X"68", + X"68",X"65",X"5D",X"52",X"47",X"47",X"4A",X"4D",X"4D",X"4D",X"52",X"65",X"7D",X"88",X"90",X"9B", + X"A3",X"AE",X"AE",X"AB",X"AB",X"9E",X"98",X"88",X"70",X"52",X"37",X"1F",X"17",X"1F",X"27",X"3A", + X"5A",X"68",X"78",X"83",X"93",X"A3",X"AB",X"AE",X"A3",X"93",X"88",X"88",X"83",X"88",X"8B",X"88", + X"78",X"62",X"4A",X"42",X"3A",X"42",X"4D",X"55",X"65",X"78",X"83",X"8B",X"93",X"90",X"88",X"88", + X"98",X"A6",X"A6",X"AB",X"9E",X"8B",X"7D",X"68",X"70",X"88",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC", + X"FC",X"FC",X"DC",X"9B",X"4D",X"14",X"01",X"04",X"2F",X"52",X"5D",X"68",X"78",X"80",X"78",X"70", + X"5D",X"47",X"32",X"1F",X"14",X"09",X"11",X"1C",X"32",X"52",X"83",X"B9",X"D1",X"C9",X"AB",X"8B", + X"70",X"68",X"75",X"78",X"80",X"8B",X"8B",X"98",X"AB",X"BE",X"C1",X"AB",X"83",X"5D",X"3A",X"17", + X"11",X"17",X"27",X"3A",X"65",X"90",X"AE",X"B6",X"9B",X"78",X"55",X"4A",X"4D",X"5A",X"5D",X"52", + X"4A",X"4A",X"52",X"78",X"AB",X"D4",X"FC",X"FC",X"F7",X"E9",X"E1",X"D1",X"C9",X"BE",X"AB",X"90", + X"52",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"2F",X"4A",X"52",X"47",X"47",X"62",X"70",X"7D", + X"7D",X"78",X"7D",X"90",X"B3",X"CE",X"EC",X"FC",X"FC",X"FC",X"FC",X"F4",X"E9",X"F4",X"FC",X"FC", + X"FC",X"FC",X"CE",X"98",X"65",X"2C",X"01",X"01",X"01",X"01",X"01",X"32",X"6D",X"7D",X"68",X"4A", + X"27",X"11",X"1C",X"3A",X"4D",X"62",X"68",X"65",X"68",X"70",X"80",X"9B",X"D1",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"A3",X"75",X"55",X"62",X"80",X"A3",X"BE",X"CE",X"C1",X"90",X"4A",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"88",X"C9",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC", + X"B6",X"90",X"68",X"3F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1F",X"83",X"BE",X"D1",X"CE", + X"D4",X"F4",X"FC",X"FC",X"FC",X"F7",X"D1",X"CE",X"DC",X"F7",X"FC",X"FC",X"FC",X"FC",X"D1",X"8B", + X"68",X"68",X"88",X"A6",X"C1",X"D9",X"D4",X"BE",X"A3",X"88",X"75",X"68",X"62",X"5D",X"62",X"68", + X"6D",X"78",X"75",X"55",X"2C",X"11",X"11",X"2F",X"55",X"75",X"83",X"93",X"9E",X"B9",X"E9",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"68",X"32",X"11",X"17",X"32",X"52",X"7D", + X"AE",X"E1",X"F7",X"E1",X"A3",X"62",X"17",X"01",X"01",X"01",X"01",X"01",X"1C",X"4D",X"7D",X"90", + X"9B",X"A6",X"B6",X"BE",X"A6",X"70",X"37",X"14",X"14",X"1C",X"14",X"1C",X"2F",X"3A",X"3A",X"3A", + X"4A",X"52",X"4A",X"47",X"3A",X"24",X"11",X"14",X"27",X"3A",X"65",X"9E",X"D4",X"FC",X"FC",X"F7", + X"D4",X"AB",X"93",X"93",X"93",X"83",X"68",X"4D",X"37",X"37",X"5D",X"9B",X"EC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"CE",X"AB",X"93",X"7D",X"65",X"65",X"75",X"88",X"93",X"98",X"98",X"93", + X"93",X"90",X"93",X"8B",X"90",X"90",X"90",X"8B",X"8B",X"90",X"8B",X"90",X"90",X"90",X"90",X"8B", + X"8B",X"8B",X"8B",X"8B",X"88",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"83",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"78",X"75",X"78",X"75",X"78", + X"78",X"78",X"75",X"78",X"75",X"70",X"75",X"75",X"75",X"75",X"70",X"6D",X"68",X"6D",X"70",X"6D", + X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"70",X"70",X"70",X"75",X"75",X"75",X"75", + X"75",X"70",X"62",X"4D",X"4D",X"4D",X"47",X"4A",X"68",X"98",X"B6",X"B3",X"9B",X"78",X"5A",X"3F", + X"32",X"2F",X"32",X"3F",X"5A",X"90",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"E9",X"90",X"4D",X"3A", + X"47",X"5D",X"5D",X"4D",X"3A",X"27",X"1C",X"14",X"11",X"0C",X"01",X"01",X"01",X"01",X"01",X"01", + X"04",X"4A",X"9E",X"F7",X"FC",X"FC",X"FC",X"FC",X"EC",X"E4",X"E4",X"D1",X"AB",X"80",X"62",X"47", + X"37",X"2F",X"2C",X"24",X"04",X"01",X"24",X"52",X"70",X"70",X"62",X"4D",X"3F",X"37",X"37",X"3A", + X"4D",X"62",X"78",X"93",X"AE",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"B6",X"68", + X"2C",X"01",X"01",X"01",X"01",X"01",X"01",X"09",X"47",X"65",X"68",X"68",X"62",X"5A",X"52",X"4D", + X"52",X"4D",X"52",X"52",X"5A",X"5D",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"65",X"37",X"1C", + X"09",X"09",X"1C",X"32",X"4D",X"70",X"93",X"AB",X"C9",X"D9",X"E9",X"EF",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"F7",X"6D",X"0C",X"01",X"01",X"01",X"01",X"01",X"17",X"62",X"83",X"78", + X"5A",X"37",X"14",X"04",X"01",X"01",X"01",X"01",X"04",X"11",X"1C",X"1C",X"01",X"01",X"0C",X"3F", + X"6D",X"7D",X"78",X"68",X"65",X"83",X"B3",X"E1",X"F4",X"E4",X"C6",X"A3",X"8B",X"75",X"68",X"65", + X"5D",X"62",X"65",X"62",X"5A",X"3F",X"27",X"17",X"1F",X"5A",X"9E",X"CE",X"D4",X"C9",X"AE",X"A6", + X"AE",X"AB",X"9B",X"83",X"80",X"98",X"9B",X"9B",X"9B",X"B6",X"D9",X"E4",X"E1",X"DC",X"E1",X"D4", + X"B3",X"83",X"5A",X"3A",X"1F",X"11",X"0C",X"11",X"14",X"1C",X"1F",X"2C",X"2C",X"1F",X"27",X"32", + X"3F",X"5D",X"83",X"9B",X"93",X"93",X"88",X"7D",X"7D",X"75",X"70",X"70",X"6D",X"68",X"68",X"68", + X"5A",X"5A",X"75",X"88",X"93",X"93",X"90",X"90",X"88",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"80", + X"7D",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80",X"83",X"83",X"80",X"80", + X"80",X"7D",X"7D",X"70",X"70",X"6D",X"75",X"83",X"90",X"93",X"90",X"88",X"88",X"80",X"78",X"7D", + X"70",X"68",X"70",X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"75",X"70",X"68",X"4D",X"3A", + X"4A",X"70",X"93",X"A3",X"B6",X"B9",X"B3",X"A3",X"90",X"80",X"75",X"70",X"68",X"68",X"68",X"65", + X"68",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"75",X"78", + X"78",X"78",X"78",X"78",X"78",X"78",X"70",X"55",X"37",X"1F",X"24",X"47",X"68",X"7D",X"88",X"8B", + X"88",X"88",X"88",X"8B",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"C9",X"AB",X"80",X"5A", + X"4A",X"47",X"37",X"2C",X"32",X"4D",X"70",X"78",X"7D",X"8B",X"90",X"88",X"68",X"4A",X"2C",X"1C", + X"11",X"09",X"01",X"01",X"01",X"01",X"14",X"27",X"47",X"70",X"AE",X"E1",X"F4",X"E4",X"D1",X"AE", + X"93",X"80",X"70",X"68",X"62",X"62",X"65",X"68",X"6D",X"75",X"78",X"78",X"65",X"4A",X"4D",X"5A", + X"62",X"65",X"68",X"88",X"B9",X"EC",X"FC",X"F4",X"D1",X"B6",X"B3",X"AE",X"A3",X"98",X"A3",X"C6", + X"D9",X"D4",X"D4",X"E1",X"E1",X"C9",X"9E",X"78",X"62",X"3F",X"32",X"2C",X"27",X"2C",X"32",X"37", + X"3F",X"47",X"4A",X"52",X"55",X"5A",X"5D",X"5D",X"5A",X"3F",X"27",X"14",X"11",X"14",X"24",X"4A", + X"80",X"A6",X"BE",X"C6",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC",X"BE",X"AB",X"8B", + X"5D",X"2F",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"70",X"6D",X"5D",X"4D", + X"4D",X"68",X"9B",X"BE",X"C9",X"B9",X"B3",X"AB",X"9B",X"A3",X"B3",X"C6",X"D1",X"B6",X"8B",X"52", + X"1C",X"11",X"11",X"14",X"37",X"62",X"90",X"9E",X"9B",X"83",X"75",X"5D",X"47",X"32",X"2F",X"24", + X"17",X"11",X"11",X"17",X"27",X"5D",X"A3",X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"EF",X"CE", + X"9B",X"7D",X"68",X"62",X"62",X"7D",X"98",X"9E",X"93",X"7D",X"6D",X"5D",X"55",X"52",X"52",X"52", + X"55",X"55",X"5D",X"62",X"65",X"68",X"6D",X"70",X"75",X"7D",X"78",X"7D",X"80",X"83",X"78",X"62", + X"3A",X"27",X"14",X"17",X"27",X"3F",X"5A",X"78",X"98",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70",X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32", + X"04",X"01",X"01",X"01",X"01",X"01",X"11",X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78", + X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24",X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93", + X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90",X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E", + X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E",X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B", + X"88",X"75",X"52",X"37",X"1F",X"1C",X"27",X"37",X"4D",X"68",X"83",X"AE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D1",X"9B",X"65",X"42",X"3A",X"52",X"80",X"AE",X"D4",X"E9",X"E4",X"C6", + X"80",X"3A",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"32",X"88",X"C6",X"F7",X"FC", + X"E4",X"CE",X"B9",X"A3",X"80",X"62",X"47",X"37",X"2F",X"2C",X"2F",X"37",X"3F",X"3A",X"32",X"3A", + X"37",X"32",X"37",X"3A",X"52",X"7D",X"B3",X"DC",X"E4",X"E1",X"D1",X"D1",X"E1",X"FC",X"FC",X"FC", + X"FC",X"F4",X"CE",X"A3",X"83",X"75",X"7D",X"83",X"83",X"88",X"98",X"A6",X"A6",X"98",X"88",X"75", + X"68",X"5D",X"5A",X"5A",X"5A",X"62",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"7D",X"83",X"83", + X"80",X"75",X"68",X"70",X"80",X"8B",X"93",X"98",X"98",X"90",X"90",X"8B",X"90",X"98",X"A3",X"AE", + X"B6",X"C9",X"C9",X"C1",X"B3",X"A3",X"98",X"8B",X"78",X"75",X"70",X"6D",X"65",X"68",X"70",X"80", + X"83",X"83",X"88",X"8B",X"83",X"78",X"68",X"5D",X"52",X"42",X"2C",X"27",X"2C",X"3A",X"47",X"42", + X"42",X"52",X"70",X"8B",X"A6",X"AB",X"A3",X"9E",X"9E",X"B3",X"B9",X"B9",X"BE",X"BE",X"B9",X"A3", + X"88",X"68",X"5D",X"5A",X"5A",X"52",X"52",X"68",X"70",X"65",X"62",X"62",X"68",X"7D",X"8B",X"8B", + X"83",X"75",X"65",X"68",X"75",X"80",X"9B",X"C1",X"EC",X"FC",X"FC",X"F7",X"EF",X"E9",X"D1",X"A3", + X"78",X"5D",X"42",X"2C",X"14",X"0C",X"09",X"0C",X"0C",X"17",X"2C",X"47",X"62",X"75",X"75",X"68", + X"62",X"52",X"4A",X"4A",X"42",X"3F",X"4A",X"55",X"68",X"90",X"A3",X"B9",X"C6",X"CE",X"E4",X"FC", + X"FC",X"EC",X"E9",X"E9",X"DC",X"C1",X"B3",X"A6",X"98",X"75",X"52",X"3A",X"2C",X"1C",X"11",X"01", + X"0C",X"1F",X"37",X"52",X"70",X"78",X"78",X"68",X"62",X"62",X"75",X"98",X"B6",X"BE",X"B3",X"AB", + X"A6",X"9B",X"9E",X"AE",X"B9",X"C1",X"AE",X"90",X"5D",X"32",X"2C",X"27",X"2C",X"3F",X"62",X"83", + X"93",X"90",X"88",X"80",X"70",X"5D",X"52",X"47",X"3A",X"2F",X"24",X"1F",X"2C",X"3A",X"68",X"A3", + X"D4",X"F4",X"FC",X"FC",X"F4",X"E9",X"E9",X"DC",X"B9",X"90",X"78",X"68",X"5D",X"62",X"7D",X"93", + X"9B",X"90",X"7D",X"70",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5A",X"5D",X"65",X"68",X"68",X"70", + X"70",X"75",X"78",X"78",X"7D",X"80",X"80",X"78",X"65",X"3F",X"27",X"17",X"1C",X"2C",X"3F",X"5D", + X"78",X"93",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70", + X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32",X"04",X"01",X"01",X"01",X"01",X"01",X"11", + X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78",X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24", + X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93",X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90", + X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E", + X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B",X"88",X"75",X"52",X"37",X"1F",X"1C",X"24", + X"37",X"4D",X"68",X"88",X"AE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"9B",X"65", + X"3F",X"37",X"52",X"80",X"B3",X"D9",X"EC",X"EC",X"C9",X"7D",X"37",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"27",X"88",X"D1",X"FC",X"FC",X"EC",X"D1",X"BE",X"A3",X"7D",X"62",X"3A", + X"2C",X"1F",X"1F",X"24",X"2C",X"32",X"2C",X"27",X"2F",X"27",X"27",X"27",X"2C",X"47",X"7D",X"C1", + X"F7",X"FC",X"FC",X"E9",X"E1",X"EC",X"FC",X"FC",X"FC",X"FC",X"FC",X"E4",X"AE",X"88",X"78",X"83", + X"8B",X"8B",X"93",X"A3",X"B9",X"BE",X"A6",X"90",X"75",X"65",X"52",X"52",X"52",X"4D",X"55",X"5D", + X"62",X"68",X"70",X"70",X"70",X"75",X"80",X"8B",X"90",X"90",X"8B",X"83",X"90",X"98",X"9B",X"9E", + X"9E",X"9B",X"93",X"93",X"8B",X"90",X"8B",X"8B",X"8B",X"88",X"8B",X"8B",X"8B",X"8B",X"88",X"8B", + X"8B",X"8B",X"8B",X"8B",X"8B",X"88",X"8B",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"80",X"80", + X"80",X"7D",X"65",X"47",X"52",X"68",X"78",X"78",X"65",X"5A",X"5D",X"6D",X"75",X"78",X"70",X"68", + X"70",X"90",X"C9",X"EC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A6",X"68",X"42",X"3A",X"37",X"3A",X"5D", + X"7D",X"83",X"68",X"55",X"52",X"47",X"32",X"17",X"09",X"01",X"01",X"09",X"17",X"2C",X"52",X"9B", + X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"DC",X"A6",X"78",X"62",X"47",X"1F",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"3F",X"7D",X"A3",X"9B",X"80",X"5D",X"4A",X"5A",X"7D",X"90",X"9B",X"AB", + X"A6",X"AB",X"AB",X"9E",X"A6",X"BE",X"D4",X"E4",X"D4",X"A6",X"88",X"7D",X"88",X"88",X"83",X"90", + X"A3",X"AB",X"A6",X"9E",X"98",X"8B",X"83",X"80",X"80",X"80",X"83",X"83",X"88",X"8B",X"8B",X"90", + X"90",X"90",X"93",X"98",X"98",X"9B",X"93",X"98",X"93",X"93",X"93",X"93",X"93",X"93",X"90",X"90", + X"90",X"8B",X"8B",X"83",X"80",X"7D",X"68",X"52",X"52",X"62",X"68",X"88",X"AB",X"C6",X"C9",X"C9", + X"B6",X"A6",X"9E",X"8B",X"83",X"8B",X"A3",X"B3",X"AE",X"98",X"80",X"6D",X"5D",X"52",X"47",X"42", + X"47",X"3F",X"47",X"42",X"42",X"4D",X"62",X"65",X"68",X"68",X"68",X"68",X"68",X"68",X"68",X"68", + X"65",X"68",X"68",X"68",X"6D",X"70",X"6D",X"6D",X"70",X"75",X"70",X"75",X"78",X"75",X"78",X"75", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"7D",X"80",X"80",X"6D",X"65",X"70",X"80",X"80",X"68", + X"52",X"32",X"2C",X"37",X"68",X"9B",X"B6",X"B6",X"B6",X"C1",X"D4",X"D9",X"C6",X"A3",X"78",X"5A", + X"3F",X"32",X"32",X"3A",X"55",X"8B",X"CE",X"FC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A3",X"62",X"2F", + X"1C",X"09",X"01",X"01",X"1C",X"47",X"5D",X"68",X"80",X"93",X"90",X"80",X"70",X"5A",X"4D",X"52", + X"68",X"78",X"7D",X"70",X"5D",X"4A",X"3A",X"32",X"32",X"2F",X"27",X"27",X"1C",X"11",X"09",X"0C", + X"14",X"2C",X"42",X"75",X"AB",X"DC",X"F7",X"FC",X"FC",X"F7",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"BE",X"88",X"4D",X"11",X"01",X"01",X"0C",X"3F",X"75",X"9E",X"B6",X"B3", + X"93",X"70",X"52",X"3A",X"1F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"3F", + X"52",X"62",X"68",X"7D",X"9E",X"C1",X"E4",X"FC",X"FC",X"F7",X"E1",X"BE",X"A3",X"90",X"80",X"88", + X"AB",X"E1",X"FC",X"FC",X"FC",X"FC",X"F7",X"BE",X"7D",X"3F",X"0C",X"01",X"01",X"01",X"01",X"27", + X"70",X"B6",X"E9",X"FC",X"FC",X"E9",X"AE",X"83",X"62",X"4D",X"2F",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"3F",X"98",X"CE",X"D1",X"BE",X"B6",X"C1",X"D4",X"E9",X"FC",X"E9",X"C9",X"AB", + X"9B",X"88",X"5D",X"37",X"27",X"27",X"1F",X"1C",X"1C",X"1F",X"37",X"70",X"B6",X"FC",X"FC",X"FC", + X"FC",X"FC",X"F4",X"F4",X"E4",X"C6",X"98",X"70",X"5A",X"3A",X"37",X"47",X"6D",X"AE",X"F7",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"93",X"55",X"17",X"01",X"01",X"01",X"1C",X"4A",X"80",X"AB", + X"B3",X"A6",X"A3",X"A3",X"A3",X"A6",X"9B",X"78",X"42",X"11",X"04",X"11",X"1C",X"1F",X"37",X"55", + X"7D",X"8B",X"80",X"5D",X"47",X"4D",X"65",X"6D",X"5D",X"4A",X"3F",X"4D",X"7D",X"B6",X"EC",X"FC", + X"FC",X"FC",X"E4",X"C6",X"9E",X"98",X"9B",X"90",X"75",X"5D",X"62",X"7D",X"9B",X"C6",X"E1",X"E9", + X"D9",X"B3",X"93",X"83",X"70",X"68",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5D",X"65",X"65",X"68", + X"5A",X"37",X"2F",X"4A",X"65",X"6D",X"68",X"75",X"93",X"BE",X"E4",X"EC",X"D1",X"B3",X"9E",X"AB", + X"AB",X"9E",X"80",X"65",X"42",X"32",X"32",X"4A",X"75",X"90",X"A3",X"BE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"D1",X"93",X"5A",X"3A",X"3A",X"47",X"5A",X"7D",X"A6",X"CE",X"CE",X"B9",X"A6",X"9B",X"80", + X"52",X"1C",X"01",X"01",X"01",X"11",X"47",X"78",X"9E",X"AB",X"9B",X"78",X"5A",X"2C",X"14",X"1C", + X"27",X"1F",X"11",X"01",X"01",X"01",X"1C",X"3F",X"75",X"AB",X"C9",X"D4",X"DC",X"CE",X"C9",X"D1", + X"E1",X"F4",X"FC",X"FC",X"FC",X"E4",X"BE",X"90",X"70",X"4A",X"11",X"01",X"01",X"01",X"01",X"09", + X"17",X"4A",X"90",X"D4",X"FC",X"FC",X"FC",X"F4",X"E9",X"E9",X"FC",X"FC",X"E4",X"B3",X"80",X"52", + X"2F",X"1C",X"1F",X"32",X"68",X"AE",X"F4",X"FC",X"FC",X"FC",X"E4",X"C9",X"AB",X"80",X"5D",X"47", + X"37",X"42",X"75",X"AB",X"DC",X"FC",X"FC",X"FC",X"D9",X"93",X"55",X"37",X"2F",X"3A",X"52",X"62", + X"68",X"68",X"55",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1C",X"32",X"4D",X"68", + X"9B",X"CE",X"E4",X"F4",X"EC",X"E4",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9", + X"88",X"4A",X"17",X"04",X"11",X"42",X"75",X"88",X"9B",X"B6",X"BE",X"A6",X"7D",X"4D",X"1C",X"01", + X"01",X"17",X"27",X"32",X"4D",X"7D",X"A6",X"B3",X"B9",X"C6",X"D1",X"D9",X"D9",X"CE",X"BE",X"A6", + X"90",X"65",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"14",X"68",X"93",X"98",X"83",X"75",X"7D", + X"9E",X"BE",X"C9",X"BE",X"A6",X"9E",X"B6",X"D9",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9",X"C1", + X"B3",X"9B",X"75",X"5D",X"47",X"2F",X"2F",X"4A",X"68",X"7D",X"7D",X"78",X"83",X"90",X"9E",X"AE", + X"A3",X"83",X"75",X"52",X"3F",X"4A",X"5D",X"62",X"55",X"3F",X"2F",X"24",X"32",X"5A",X"7D",X"90", + X"AB",X"CE",X"E4",X"FC",X"FC",X"FC",X"E9",X"CE",X"B3",X"98",X"88",X"83",X"83",X"90",X"B3",X"EC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"75",X"42",X"27",X"14",X"01",X"01",X"1C",X"3F",X"52",X"5A", + X"68",X"78",X"68",X"47",X"17",X"01",X"01",X"09",X"27",X"37",X"4A",X"65",X"75",X"6D",X"65",X"68", + X"68",X"5D",X"4D",X"42",X"27",X"0C",X"0C",X"14",X"1C",X"1F",X"3A",X"68",X"9E",X"CE",X"E1",X"DC", + X"DC",X"DC",X"DC",X"CE",X"A6",X"75",X"5A",X"4A",X"3A",X"4A",X"70",X"98",X"BE",X"E1",X"E9",X"E4", + X"B9",X"9E",X"90",X"8B",X"88",X"75",X"52",X"2F",X"2F",X"4A",X"5D",X"68",X"78",X"80",X"70",X"70", + X"7D",X"8B",X"9E",X"B6",X"BE",X"B6",X"AE",X"9B",X"98",X"AE",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"B9",X"9E",X"88",X"65",X"4D",X"47",X"3F",X"2F",X"11",X"01",X"04", + X"1F",X"2F",X"2F",X"1F",X"11",X"01",X"0C",X"2C",X"4D",X"62",X"78",X"98",X"AB",X"BE",X"DC",X"F4", + X"F7",X"E4",X"E1",X"DC",X"C1",X"9E",X"88",X"62",X"3A",X"14",X"01",X"11",X"17",X"27",X"32",X"55", + X"88",X"B6",X"E4",X"F7",X"E4",X"C6",X"A3",X"75",X"5A",X"52",X"5A",X"68",X"78",X"80",X"80",X"5A", + X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"3F",X"70",X"A3",X"C9",X"E1",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"C6",X"B3",X"98",X"93",X"9B",X"AB",X"B9",X"AB",X"98",X"83",X"68",X"52", + X"4A",X"2F",X"17",X"04",X"01",X"0C",X"37",X"75",X"A3",X"B9",X"D1",X"CE",X"B3",X"A3",X"9B",X"93", + X"93",X"A6",X"BE",X"B9",X"9E",X"7D",X"55",X"37",X"27",X"27",X"4A",X"80",X"A6",X"B3",X"AE",X"AB", + X"B9",X"C6",X"B9",X"B3",X"A3",X"80",X"5D",X"4A",X"47",X"3A",X"32",X"3A",X"5A",X"7D",X"83",X"90", + X"8B",X"83",X"7D",X"70",X"65",X"6D",X"7D",X"78",X"65",X"47",X"1F",X"0C",X"01",X"01",X"09",X"2C", + X"68",X"AE",X"CE",X"D1",X"CE",X"D4",X"E4",X"E4",X"CE",X"A6",X"98",X"9B",X"AB",X"BE",X"CE",X"CE", + X"B9",X"90",X"52",X"14",X"01",X"01",X"01",X"01",X"09",X"3A",X"78",X"9E",X"AE",X"B9",X"CE",X"CE", + X"B9",X"A6",X"90",X"7D",X"7D",X"83",X"80",X"68",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75", + X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6",X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4", + X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A",X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC", + X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52",X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B", + X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9",X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01", + X"01",X"01",X"01",X"01",X"01",X"24",X"47",X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4", + X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3",X"9B",X"98",X"98",X"90",X"83",X"88",X"A6",X"C9",X"DC", + X"D9",X"BE",X"AB",X"7D",X"52",X"2F",X"27",X"1F",X"11",X"17",X"27",X"2F",X"2F",X"3F",X"52",X"5D", + X"5A",X"65",X"70",X"75",X"80",X"88",X"8B",X"9B",X"AB",X"BE",X"C6",X"AE",X"83",X"55",X"27",X"09", + X"09",X"27",X"52",X"83",X"93",X"98",X"93",X"88",X"83",X"80",X"70",X"55",X"3F",X"2C",X"27",X"32", + X"47",X"65",X"8B",X"AE",X"D4",X"E9",X"D9",X"B3",X"98",X"90",X"93",X"88",X"68",X"4D",X"4A",X"5A", + X"68",X"6D",X"7D",X"8B",X"90",X"8B",X"88",X"8B",X"98",X"9E",X"9B",X"83",X"62",X"2F",X"09",X"04", + X"1F",X"47",X"6D",X"98",X"AE",X"B6",X"B3",X"AB",X"9B",X"9B",X"A3",X"B6",X"C6",X"B9",X"9B",X"83", + X"78",X"6D",X"65",X"5A",X"5A",X"68",X"88",X"A6",X"B6",X"A3",X"8B",X"75",X"68",X"6D",X"6D",X"65", + X"5D",X"5D",X"68",X"80",X"A3",X"CE",X"DC",X"D4",X"CE",X"CE",X"C9",X"C6",X"CE",X"BE",X"AB",X"90", + X"80",X"80",X"8B",X"98",X"9E",X"B6",X"DC",X"E4",X"E4",X"E1",X"CE",X"C6",X"B6",X"98",X"80",X"7D", + X"75",X"70",X"68",X"68",X"62",X"3F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"11",X"47",X"68",X"90",X"B6",X"CE",X"D4",X"E1",X"E9",X"E9",X"E4",X"E4",X"E9",X"E4",X"D4",X"C6", + X"A6",X"78",X"42",X"14",X"01",X"01",X"01",X"01",X"14",X"42",X"78",X"AB",X"D1",X"E1",X"D9",X"C6", + X"9B",X"7D",X"75",X"78",X"88",X"93",X"8B",X"88",X"70",X"4D",X"2F",X"24",X"1C",X"24",X"27",X"24", + X"27",X"3A",X"62",X"88",X"B3",X"CE",X"DC",X"EC",X"EF",X"E1",X"CE",X"BE",X"A3",X"83",X"68",X"52", + X"4D",X"55",X"65",X"78",X"78",X"80",X"90",X"90",X"90",X"8B",X"75",X"5D",X"4D",X"52",X"62",X"80", + X"A3",X"B6",X"B6",X"B6",X"A6",X"90",X"83",X"88",X"93",X"9E",X"BE",X"D1",X"C9",X"AE",X"8B",X"62", + X"3F",X"27",X"1C",X"32",X"62",X"88",X"9B",X"A3",X"AB",X"C1",X"CE",X"C1",X"B6",X"A6",X"90",X"6D", + X"5D",X"55",X"3F",X"2F",X"2F",X"47",X"5D",X"65",X"6D",X"75",X"78",X"83",X"7D",X"75",X"7D",X"83", + X"80",X"68",X"4D",X"2F",X"14",X"04",X"04",X"17",X"37",X"70",X"A6",X"C1",X"C1",X"B9",X"BE",X"D1", + X"D4",X"C1",X"A3",X"98",X"9E",X"AE",X"C9",X"D4",X"D4",X"C6",X"98",X"5D",X"24",X"01",X"01",X"01", + X"01",X"17",X"4A",X"7D",X"A3",X"AE",X"B9",X"C9",X"C6",X"B6",X"A3",X"8B",X"7D",X"80",X"83",X"83", + X"6D",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75",X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6", + X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4",X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A", + X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC",X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52", + X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B",X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9", + X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"47", + X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4",X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3", + X"9B",X"98",X"98",X"8B",X"83",X"8B",X"A6",X"C9",X"E1",X"DC",X"C1",X"A6",X"7D",X"4D",X"2C",X"24", + X"17",X"0C",X"11",X"1F",X"2C",X"2C",X"3A",X"52",X"5D",X"5A",X"65",X"70",X"78",X"88",X"90",X"90", + X"9E",X"AB",X"C1",X"C6",X"A6",X"78",X"3F",X"11",X"01",X"01",X"14",X"47",X"80",X"93",X"98",X"93", + X"83",X"70",X"65",X"4D",X"2F",X"14",X"04",X"04",X"27",X"47",X"70",X"A3",X"D1",X"FC",X"FC",X"F7", + X"C9",X"A6",X"9B",X"9B",X"8B",X"70",X"5A",X"5D",X"75",X"7D",X"80",X"8B",X"9E",X"9B",X"93",X"8B", + X"98",X"A3",X"AE",X"AE",X"93",X"68",X"32",X"04",X"04",X"24",X"52",X"88",X"B6",X"C9",X"B9",X"AB", + X"98",X"80",X"80",X"90",X"A6",X"B9",X"BE",X"A6",X"93",X"8B",X"80",X"70",X"4D",X"37",X"3F",X"62", + X"88",X"9E",X"98",X"80",X"65",X"55",X"62",X"68",X"68",X"70",X"75",X"78",X"93",X"C6",X"FC",X"FC", + X"FC",X"FC",X"F7",X"E9",X"DC",X"D4",X"BE",X"A3",X"80",X"68",X"70",X"75",X"75",X"70",X"80",X"A3", + X"B3",X"B3",X"AE",X"98",X"83",X"75",X"5D",X"52",X"5A",X"68",X"78",X"83",X"83",X"78",X"4A",X"11", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"78",X"A6",X"D1",X"E9",X"E4", + X"E1",X"E1",X"DC",X"D9",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"B9",X"75",X"2F",X"01",X"01",X"01", + X"01",X"01",X"01",X"27",X"5D",X"9B",X"D4",X"F4",X"EC",X"CE",X"A6",X"93",X"9E",X"B6",X"B6",X"A3", + X"93",X"8B",X"83",X"70",X"68",X"78",X"93",X"A6",X"9E",X"90",X"83",X"98",X"AE",X"C9",X"D4",X"DC", + X"CE",X"A6",X"7D",X"65",X"52",X"2C",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"4D",X"9E", + X"E4",X"FC",X"FC",X"FC",X"EC",X"EC",X"FC",X"FC",X"FC",X"FC",X"E9",X"AE",X"78",X"4A",X"2F",X"2F", + X"52",X"8B",X"C6",X"F4",X"FC",X"F7",X"DC",X"B3",X"80",X"4D",X"17",X"01",X"01",X"01",X"1C",X"3F", + X"70",X"A6",X"D1",X"E9",X"E1",X"CE",X"B9",X"B3",X"AE",X"A6",X"88",X"5A",X"1F",X"01",X"01",X"01", + X"01",X"01",X"14",X"52",X"8B",X"B9",X"C6",X"B6",X"A6",X"9E",X"90",X"75",X"68",X"52",X"4A",X"52", + X"68",X"88",X"93",X"83",X"62",X"3F",X"1F",X"17",X"2F",X"4D",X"68",X"75",X"83",X"9E",X"D1",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D4",X"BE",X"B3",X"A3",X"A6",X"BE",X"D4",X"E1",X"CE",X"B3",X"A6",X"98", + X"75",X"4A",X"27",X"1C",X"2F",X"4D",X"68",X"7D",X"68",X"47",X"17",X"01",X"01",X"01",X"01",X"01", + X"04",X"0C",X"1F",X"32",X"4A",X"5D",X"80",X"B3",X"F7",X"FC",X"FC",X"FC",X"EC",X"D4",X"CE",X"BE", + X"C1",X"CE",X"D9",X"C9",X"A3",X"83",X"70",X"5A",X"3F",X"32",X"3F",X"5D",X"68",X"65",X"47",X"2C", + X"17",X"04",X"09",X"27",X"4A",X"68",X"90",X"9E",X"98",X"88",X"7D",X"83",X"9E",X"CE",X"E9",X"F7", + X"E4",X"BE",X"9E",X"68",X"37",X"09",X"01",X"01",X"01",X"04",X"14",X"37",X"55",X"65",X"70",X"88", + X"AE",X"DC",X"FC",X"F4",X"D1",X"AE",X"93",X"80",X"78",X"83",X"9B",X"B3",X"B3",X"98",X"70",X"47", + X"24",X"17",X"32",X"62",X"9B",X"C9",X"CE",X"B9",X"A3",X"9B",X"88",X"70",X"5D",X"55",X"68",X"93", + X"B6",X"BE",X"B3",X"AE",X"AE",X"A3",X"90",X"90",X"98",X"9B",X"AB",X"AB",X"AE",X"B3",X"AB",X"93", + X"78",X"65",X"68",X"78",X"75",X"70",X"68",X"78",X"8B",X"93",X"93",X"9E",X"B9",X"DC",X"FC",X"FC", + X"FC",X"D4",X"93",X"62",X"42",X"1C",X"01",X"01",X"04",X"0C",X"0C",X"1F",X"4A",X"78",X"AB",X"C9", + X"DC",X"E1",X"D9",X"C6",X"AB",X"90",X"70",X"47",X"09",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"1C",X"47",X"62",X"75",X"88",X"AB",X"D1",X"E9",X"EC",X"E9",X"E4",X"DC",X"F7",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"9E",X"80",X"75",X"7D",X"70",X"6D",X"75",X"80",X"8B",X"80",X"65", + X"4A",X"2C",X"04",X"01",X"01",X"01",X"04",X"2C",X"52",X"62",X"5A",X"4D",X"5A",X"78",X"9B",X"B3", + X"C1",X"AB",X"93",X"83",X"78",X"62",X"4D",X"4A",X"52",X"4A",X"3F",X"4D",X"5D",X"7D",X"90",X"9B", + X"9E",X"83",X"68",X"62",X"5D",X"68",X"78",X"88",X"88",X"8B",X"8B",X"80",X"62",X"47",X"3F",X"3A", + X"32",X"37",X"37",X"37",X"4D",X"70",X"88",X"8B",X"80",X"70",X"70",X"8B",X"B6",X"D4",X"D4",X"CE", + X"B9",X"B9",X"C9",X"C9",X"C6",X"B6",X"B9",X"D4",X"FC",X"FC",X"FC",X"FC",X"EC",X"B6",X"80",X"52", + X"37",X"2F",X"2C",X"37",X"62",X"98",X"D1",X"FC",X"FC",X"EC",X"D1",X"A3",X"68",X"4A",X"32",X"27", + X"27",X"3A",X"55",X"68",X"62",X"52",X"3F",X"1C",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"37", + X"5A",X"70",X"88",X"88",X"7D",X"65",X"52",X"47",X"52",X"68",X"83",X"9E",X"AE",X"B6",X"C1",X"B9", + X"B6",X"AE",X"98",X"78",X"5D",X"42",X"32",X"2C",X"2F",X"4D",X"7D",X"B9",X"F7",X"FC",X"FC",X"FC", + X"E1",X"AB",X"83",X"65",X"52",X"5A",X"68",X"65",X"52",X"3F",X"3F",X"3F",X"37",X"37",X"52",X"7D", + X"A6",X"C1",X"BE",X"9E",X"88",X"7D",X"68",X"5A",X"47",X"47",X"62",X"90",X"B3",X"C6",X"D9",X"EF", + X"FC",X"FC",X"E4",X"CE",X"B9",X"B3",X"B3",X"AE",X"AB",X"9B",X"75",X"55",X"37",X"11",X"01",X"01", + X"01",X"01",X"04",X"4D",X"88",X"AB",X"B3",X"AE",X"A3",X"9B",X"AE",X"C6",X"CE",X"C9",X"BE",X"B6", + X"B3",X"AB",X"AE",X"C6",X"EF",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"88",X"4A",X"14",X"01", + X"09",X"2C",X"52",X"78",X"93",X"93",X"78",X"47",X"0C",X"01",X"01",X"01",X"01",X"09",X"09",X"11", + X"27",X"4D",X"62",X"68",X"7D",X"90",X"9E",X"AE",X"AB",X"8B",X"70",X"62",X"52",X"3A",X"1C",X"04", + X"11",X"2F",X"5A",X"83",X"9E",X"B3",X"B9",X"B9",X"AB",X"80",X"62",X"4D",X"4D",X"5A",X"65",X"75", + X"7D",X"83",X"83",X"70",X"4D",X"1F",X"0C",X"14",X"32",X"5D",X"70",X"68",X"65",X"68",X"83",X"9E", + X"9E",X"93",X"88",X"83",X"9B",X"BE",X"D9",X"E1",X"D1",X"B6",X"A3",X"93",X"88",X"88",X"8B",X"98", + X"A3",X"C6",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"D4",X"B3",X"88",X"65",X"4A",X"32",X"3A",X"5D", + X"88",X"B3",X"D4",X"E4",X"E1",X"B9",X"78",X"37",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"14",X"37",X"42",X"4A",X"5A",X"68",X"78",X"90",X"AE",X"C9",X"E1",X"E1", + X"C9",X"93",X"65",X"4D",X"32",X"1F",X"17",X"27",X"37",X"3F",X"42",X"4D",X"68",X"88",X"98",X"A3", + X"B6",X"C9",X"D4",X"E4",X"E4",X"D4",X"BE",X"A6",X"AE",X"C6",X"E4",X"FC",X"FC",X"FC",X"E4",X"AB", + X"6D",X"3F",X"27",X"2F",X"52",X"83",X"AB",X"AB",X"AE",X"AE",X"AE",X"98",X"70",X"5A",X"5A",X"65", + X"7D",X"88",X"80",X"5D",X"3A",X"24",X"11",X"11",X"2F",X"52",X"75",X"83",X"93",X"A3",X"C9",X"EF", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"98",X"5A",X"1F",X"01",X"01",X"01",X"11",X"2F", + X"5D",X"90",X"BE",X"E4",X"FC",X"FC",X"D9",X"A3",X"78",X"65",X"68",X"75",X"70",X"65",X"5A",X"4A", + X"2C",X"14",X"04",X"11",X"37",X"68",X"9B",X"A6",X"9B",X"88",X"83",X"90",X"93",X"90",X"8B",X"83", + X"7D",X"83",X"93",X"A6",X"B6",X"BE",X"B9",X"9E",X"68",X"42",X"2C",X"2F",X"47",X"5D",X"78",X"88", + X"90",X"93",X"90",X"70",X"52",X"37",X"17",X"11",X"17",X"2C",X"37",X"3F",X"4D",X"4A",X"3F",X"32", + X"2F",X"37",X"5A",X"7D",X"9B",X"9E",X"A6",X"AE",X"B6",X"D4",X"FC",X"FC",X"FC",X"FC",X"FC",X"EC", + X"E1",X"B9",X"93",X"6D",X"5A",X"5A",X"5D",X"68",X"75",X"78",X"83",X"83",X"83",X"83",X"70",X"5D", + X"4A",X"4D",X"62",X"7D",X"90",X"98",X"88",X"62",X"2F",X"01",X"01",X"01",X"01",X"1C",X"37",X"52", + X"65",X"68",X"5A",X"52",X"5D",X"75",X"7D",X"75",X"5D",X"4A",X"4D",X"65",X"88",X"AB",X"C6",X"D9", + X"D4",X"B6",X"93",X"83",X"70",X"5A",X"47",X"47",X"4A",X"3F",X"3A",X"3F",X"32",X"27",X"17",X"1F", + X"3F",X"68",X"93",X"9E",X"9B",X"93",X"98",X"A6",X"AB",X"AB",X"A3",X"A6",X"BE",X"E1",X"F7",X"FC", + X"FC",X"EC",X"D1",X"AE",X"93",X"8B",X"9B",X"B3",X"B6",X"B6",X"C6",X"C6",X"B6",X"A6",X"9E",X"93", + X"7D",X"5D",X"37",X"1C",X"1F",X"27",X"2C",X"37",X"52",X"75",X"93",X"98",X"8B",X"7D",X"65",X"5D", + X"65",X"75",X"88",X"9B",X"9E",X"9B",X"8B",X"80",X"83",X"8B",X"8B",X"83",X"93",X"AB",X"C9",X"DC", + X"CE",X"B9",X"A6",X"83",X"5D",X"32",X"17",X"01",X"01",X"04",X"1C",X"4A",X"80",X"B6",X"DC",X"E1", + X"D4",X"BE",X"A6",X"98",X"90",X"88",X"6D",X"4D",X"2C",X"11",X"04",X"04",X"1C",X"4D",X"83",X"B6", + X"DC",X"E4",X"D1",X"C1",X"B3",X"9B",X"80",X"68",X"68",X"68",X"75",X"7D",X"7D",X"70",X"52",X"2C", + X"04",X"01",X"01",X"01",X"11",X"2F",X"47",X"5D",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC", + X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E",X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E", + X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52",X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01", + X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3",X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB", + X"93",X"78",X"65",X"62",X"68",X"70",X"80",X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70", + X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3",X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88", + X"7D",X"62",X"47",X"2F",X"11",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"78",X"93",X"9B", + X"9E",X"93",X"98",X"9B",X"98",X"A3",X"A6",X"AB",X"B3",X"C1",X"D1",X"CE",X"BE",X"AE",X"98",X"7D", + X"75",X"65",X"52",X"4A",X"3F",X"3A",X"3F",X"52",X"68",X"80",X"93",X"AB",X"B6",X"C9",X"E1",X"E4", + X"D4",X"CE",X"CE",X"C9",X"BE",X"9E",X"7D",X"5A",X"37",X"27",X"1C",X"1F",X"37",X"5A",X"75",X"80", + X"8B",X"93",X"90",X"8B",X"88",X"88",X"80",X"80",X"83",X"80",X"88",X"A3",X"C6",X"E1",X"FC",X"FC", + X"F4",X"CE",X"A3",X"80",X"65",X"4A",X"37",X"37",X"3F",X"47",X"52",X"62",X"70",X"7D",X"70",X"62", + X"52",X"55",X"68",X"78",X"80",X"75",X"65",X"65",X"5D",X"55",X"5A",X"5A",X"65",X"80",X"98",X"A3", + X"9B",X"8B",X"7D",X"80",X"88",X"90",X"98",X"9B",X"93",X"93",X"9E",X"AE",X"B9",X"B6",X"AE",X"AE", + X"A6",X"93",X"78",X"65",X"52",X"4D",X"4A",X"52",X"68",X"78",X"88",X"93",X"90",X"83",X"80",X"6D", + X"5D",X"5D",X"62",X"68",X"6D",X"6D",X"5D",X"4A",X"37",X"2F",X"32",X"52",X"75",X"93",X"A6",X"AE", + X"AB",X"AE",X"B6",X"C6",X"BE",X"C1",X"B9",X"A6",X"98",X"8B",X"70",X"52",X"3A",X"2C",X"37",X"42", + X"5A",X"68",X"70",X"78",X"7D",X"88",X"93",X"98",X"90",X"7D",X"7D",X"88",X"90",X"98",X"93",X"7D", + X"52",X"2C",X"09",X"01",X"01",X"09",X"32",X"52",X"70",X"88",X"9B",X"93",X"90",X"93",X"98",X"90", + X"83",X"70",X"65",X"62",X"78",X"93",X"AE",X"BE",X"C6",X"B9",X"9E",X"83",X"70",X"65",X"5D",X"5A", + X"5A",X"5D",X"5A",X"55",X"55",X"47",X"37",X"27",X"1F",X"37",X"5A",X"78",X"88",X"8B",X"8B",X"93", + X"A3",X"A6",X"AB",X"A6",X"AB",X"BE",X"D4",X"E4",X"EC",X"EC",X"E1",X"C9",X"A6",X"90",X"83",X"90", + X"98",X"9B",X"9E",X"AE",X"AB",X"A6",X"9E",X"9B",X"9B",X"90",X"78",X"5A",X"3F",X"37",X"37",X"37", + X"3F",X"52",X"68",X"88",X"83",X"78",X"68",X"5A",X"55",X"65",X"78",X"8B",X"9E",X"A3",X"9B",X"90", + X"83",X"88",X"8B",X"88",X"80",X"8B",X"9E",X"B9",X"C9",X"B9",X"A6",X"93",X"75",X"52",X"32",X"1C", + X"11",X"0C",X"14",X"2C",X"5A",X"8B",X"BE",X"DC",X"E1",X"D9",X"C6",X"AE",X"9E",X"98",X"8B",X"75", + X"55",X"32",X"1C",X"11",X"11",X"24",X"52",X"88",X"B6",X"D9",X"E4",X"CE",X"BE",X"AE",X"98",X"7D", + X"68",X"65",X"68",X"75",X"78",X"7D",X"70",X"52",X"2F",X"09",X"01",X"01",X"01",X"11",X"2F",X"47", + X"5A",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC",X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E", + X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E",X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52", + X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01",X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3", + X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB",X"93",X"78",X"65",X"62",X"68",X"70",X"80", + X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70",X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3", + X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88",X"7D",X"62",X"47",X"2C",X"0C",X"01",X"01", + X"01",X"01",X"01",X"14",X"3A",X"65",X"7D",X"98",X"A3",X"A3",X"98",X"9B",X"9E",X"9E",X"A6",X"AB", + X"AB",X"B6",X"C6",X"D4",X"CE",X"BE",X"AB",X"90",X"78",X"68",X"5A",X"47",X"32",X"27",X"1F",X"24", + X"3A",X"62",X"80",X"9E",X"B9",X"CE",X"D4",X"E9",X"EC",X"E1",X"D1",X"D1",X"CE",X"C6",X"A6",X"80", + X"55",X"2F",X"17",X"04",X"11",X"2F",X"62",X"83",X"9B",X"A6",X"AB",X"9B",X"90",X"8B",X"88",X"78", + X"70",X"65",X"5A",X"65",X"88",X"A6",X"CE",X"EF",X"FC",X"FC",X"E1",X"B6",X"9E",X"88",X"68",X"52", + X"4A",X"47",X"3F",X"37",X"3A",X"47",X"47",X"3A",X"2F",X"2F",X"4A",X"68",X"80",X"83",X"75",X"65", + X"65",X"65",X"68",X"75",X"7D",X"88",X"9E",X"AB",X"AB",X"98",X"80",X"78",X"7D",X"80",X"8B",X"9E", + X"9E",X"9B",X"9E",X"AE",X"BE",X"C1",X"B3",X"A6",X"A3",X"A6",X"AB",X"9B",X"83",X"68",X"52",X"42", + X"3F",X"52",X"68",X"80",X"93",X"A3",X"A6",X"B3",X"A6",X"93",X"88",X"88",X"93",X"90",X"83",X"68", + X"4D",X"37",X"2C",X"2F",X"47",X"68",X"90",X"AB",X"AE",X"A6",X"A6",X"9B",X"88",X"75",X"68",X"62", + X"52",X"42",X"32",X"27",X"11",X"01",X"01",X"11",X"27",X"3F",X"5A",X"65",X"68",X"78",X"8B",X"A6", + X"C1",X"C6",X"B9",X"B3",X"B3",X"AB",X"A3",X"8B",X"68",X"42",X"24",X"11",X"11",X"11",X"27",X"4D", + X"70",X"98",X"B9",X"DC",X"E9",X"E9",X"E1",X"CE",X"AB",X"98",X"90",X"83",X"83",X"93",X"A3",X"B6", + X"AE",X"A3",X"90",X"78",X"5D",X"4A",X"4D",X"62",X"78",X"83",X"80",X"80",X"83",X"7D",X"68",X"52", + X"37",X"1F",X"1F",X"2F",X"47",X"55",X"65",X"7D",X"90",X"93",X"98",X"A3",X"AE",X"B3",X"B9",X"B6", + X"B6",X"C1",X"C6",X"B9",X"A6",X"8B",X"80",X"70",X"65",X"52",X"4A",X"52",X"62",X"65",X"68",X"7D", + X"90",X"AB",X"C6",X"D1",X"CE",X"AE",X"88",X"68",X"65",X"62",X"52",X"52",X"4D",X"3F",X"2F",X"27", + X"27",X"3A",X"62",X"83",X"9E",X"B3",X"A6",X"9E",X"93",X"90",X"8B",X"7D",X"68",X"62",X"65",X"65", + X"65",X"55",X"3F",X"27",X"14",X"11",X"14",X"1C",X"2F",X"4A",X"62",X"78",X"98",X"B6",X"D1",X"E4", + X"E4",X"E1",X"E4",X"F7",X"FC",X"F7",X"E4",X"D1",X"BE",X"AB",X"98",X"83",X"8B",X"98",X"93",X"90", + X"93",X"90",X"83",X"78",X"70",X"6D",X"62",X"4A",X"2C",X"17",X"14",X"1C",X"27",X"3F",X"4D",X"5D", + X"68",X"68",X"68",X"68",X"75",X"8B",X"9E",X"A6",X"9E",X"9B",X"98",X"98",X"93",X"80",X"70",X"62", + X"52",X"4A",X"42",X"3A",X"2F",X"27",X"2C",X"2F",X"3F",X"5D",X"80",X"90",X"9B",X"A3",X"AE",X"C9", + X"E1",X"E4",X"DC",X"CE",X"C9",X"CE",X"C6",X"B3",X"98",X"8B",X"83",X"75",X"68",X"6D",X"7D",X"90", + X"A3",X"B3",X"B9",X"AE",X"98",X"7D",X"70",X"62",X"4A",X"2F",X"17",X"11",X"17",X"24",X"37",X"52", + X"62",X"75",X"80",X"80",X"80",X"88",X"8B",X"8B",X"98",X"9B",X"9E",X"AB",X"B6",X"AE",X"A3",X"90", + X"83",X"80",X"7D",X"83",X"90",X"90",X"88",X"75",X"62",X"52",X"47",X"42",X"4A",X"5D",X"75",X"8B", + X"A3",X"AB",X"AB",X"A3",X"93",X"98",X"9E",X"AE",X"BE",X"BE",X"AB",X"88",X"68",X"52",X"3A",X"37", + X"47",X"62",X"83",X"98",X"A3",X"9B",X"98",X"98",X"88",X"68",X"52",X"4D",X"52",X"62",X"65",X"62", + X"62",X"5D",X"4A",X"37",X"27",X"2C",X"3F",X"5D",X"6D",X"75",X"75",X"80",X"90",X"A3",X"B3",X"BE", + X"C6",X"C1",X"B9",X"AB",X"9E",X"83",X"68",X"52",X"3F",X"27",X"11",X"0C",X"11",X"1C",X"3F",X"68", + X"9B",X"B6",X"BE",X"B6",X"B3",X"B6",X"BE",X"C9",X"C6",X"AE",X"9B",X"8B",X"80",X"7D",X"83",X"93", + X"A3",X"AE",X"A3",X"9E",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"7D",X"68",X"62",X"5D",X"62",X"5D", + X"52",X"4D",X"5A",X"52",X"52",X"52",X"52",X"52",X"5A",X"5A",X"5A",X"62",X"68",X"78",X"88",X"90", + X"98",X"A6",X"B6",X"B9",X"B6",X"B3",X"B6",X"B9",X"B9",X"B6",X"AE",X"AB",X"93",X"78",X"65",X"4D", + X"32",X"24",X"24",X"32",X"52",X"70",X"83",X"88",X"83",X"7D",X"70",X"65",X"68",X"6D",X"6D",X"6D", + X"68",X"65",X"68",X"68",X"65",X"5D",X"55",X"5D",X"70",X"8B",X"90",X"93",X"8B",X"80",X"7D",X"7D", + X"8B",X"9E",X"A6",X"A3",X"9E",X"9E",X"A3",X"A3",X"98",X"88",X"80",X"75",X"68",X"62",X"55",X"4D", + X"4A",X"4D",X"5D",X"75",X"93",X"AE",X"B6",X"AB",X"93",X"78",X"65",X"52",X"5A",X"5D",X"65",X"78", + X"88",X"88",X"80",X"75",X"70",X"68",X"5D",X"5A",X"5D",X"62",X"68",X"70",X"75",X"78",X"7D",X"7D", + X"80",X"78",X"70",X"65",X"5D",X"52",X"5A",X"70",X"8B",X"A3",X"AE",X"AE",X"A6",X"9B",X"90",X"83", + X"75",X"68",X"55",X"4D",X"4A",X"4A",X"4D",X"5A",X"78",X"93",X"B9",X"D4",X"E4",X"E1",X"CE",X"BE", + X"AE",X"9B",X"88",X"78",X"78",X"78",X"78",X"68",X"62",X"55",X"4D",X"3A",X"32",X"3A",X"4D",X"68", + X"7D",X"80",X"7D",X"78",X"75",X"7D",X"88",X"98",X"A3",X"AE",X"AE",X"AB",X"AE",X"B6",X"C6",X"D1", + X"D4",X"D4",X"C6",X"AB",X"98",X"83",X"78",X"65",X"4D",X"3F",X"3F",X"3F",X"4A",X"5A",X"68",X"70", + X"68",X"68",X"70",X"80",X"8B",X"93",X"8B",X"7D",X"70",X"6D",X"68",X"70",X"75",X"75",X"78",X"78", + X"75",X"68",X"65",X"62",X"6D",X"83",X"98",X"AE",X"B6",X"A6",X"98",X"90",X"80",X"75",X"68",X"5D", + X"62",X"68",X"80",X"93",X"9B",X"93",X"90",X"80",X"6D",X"5A",X"4A",X"42",X"47",X"52",X"5D",X"6D", + X"83",X"90",X"90",X"83",X"80",X"80",X"75",X"75",X"70",X"68",X"65",X"5A",X"52",X"4D",X"52",X"65", + X"7D",X"98",X"A6",X"AB",X"AB",X"A6",X"9E",X"9B",X"90",X"80",X"75",X"6D",X"65",X"52",X"52",X"52", + X"52",X"4D",X"42",X"3F",X"47",X"4A",X"55",X"5D",X"62",X"62",X"62",X"62",X"68",X"7D",X"88",X"93", + X"A3",X"9E",X"A3",X"98",X"90",X"90",X"98",X"A3",X"B6",X"C1",X"BE",X"B6",X"B3",X"AB",X"9B",X"88", + X"75",X"70",X"68",X"65",X"70",X"78",X"7D",X"70",X"68",X"68",X"68",X"68",X"65",X"62",X"5D",X"68", + X"7D",X"90",X"9B",X"9B",X"98",X"98",X"98",X"93",X"98",X"9E",X"9B",X"98",X"93",X"93",X"90",X"83", + X"80",X"80",X"78",X"68",X"62",X"62",X"65",X"75",X"83",X"88",X"8B",X"90",X"8B",X"7D",X"70",X"68", + X"65",X"5D",X"55",X"52",X"4D",X"4A",X"4D",X"5A",X"5D",X"65",X"70",X"80",X"8B",X"93",X"9E",X"9E", + X"9B",X"9E",X"A3",X"9B",X"98",X"90",X"88",X"83",X"83",X"88",X"90",X"A6",X"B9",X"BE",X"C1",X"C6", + X"C6",X"C6",X"B6",X"9B",X"83",X"65",X"52",X"4A",X"4D",X"5D",X"6D",X"80",X"8B",X"93",X"8B",X"80", + X"65",X"5A",X"52",X"52",X"52",X"47",X"3F",X"3A",X"47",X"52",X"5D",X"6D",X"83",X"93",X"9B",X"9E", + X"98",X"8B",X"88",X"80",X"80",X"78",X"6D",X"68",X"68",X"70",X"70",X"68",X"68",X"62",X"5A",X"5A", + X"5D",X"5A",X"5D",X"65",X"70",X"75",X"8B",X"98",X"9B",X"9B",X"9B",X"93",X"88",X"88",X"83",X"88", + X"88",X"93",X"9B",X"98",X"8B",X"80",X"78",X"70",X"68",X"68",X"70",X"80",X"88",X"90",X"93",X"9B", + X"9E",X"98",X"98",X"98",X"98",X"90",X"83",X"78",X"78",X"6D",X"6D",X"78",X"88",X"98",X"A3",X"AB", + X"AB",X"A6",X"98",X"83",X"70",X"52",X"47",X"37",X"32",X"27",X"27",X"37",X"47",X"4D",X"65",X"75", + X"88",X"90",X"98",X"90",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"68",X"62",X"5D",X"4D",X"42", + X"3A",X"3A",X"3F",X"47",X"52",X"5A",X"68",X"78",X"83",X"90",X"A3",X"AE",X"B6",X"B9",X"B6",X"AE", + X"B3",X"B6",X"C1",X"C6",X"BE",X"B9",X"B9",X"AE",X"9B",X"88",X"80",X"75",X"68",X"65",X"65",X"70", + X"78",X"83",X"8B",X"90",X"88",X"7D",X"65",X"5A",X"55",X"5A",X"52",X"4D",X"47",X"42",X"3F",X"47", + X"4A",X"52",X"65",X"7D",X"93",X"9B",X"98",X"93",X"90",X"93",X"9B",X"A6",X"AE",X"AE",X"A6",X"98", + X"8B",X"78",X"68",X"5A",X"52",X"52",X"5A",X"65",X"68",X"75",X"75",X"70",X"70",X"7D",X"80",X"83", + X"83",X"80",X"80",X"80",X"8B",X"98",X"A3",X"A3",X"A6",X"A3",X"9B",X"93",X"90",X"8B",X"88",X"80", + X"78",X"70",X"62",X"5A",X"5A",X"52",X"52",X"55",X"5A",X"62",X"68",X"75",X"70",X"6D",X"65",X"65", + X"68",X"6D",X"70",X"70",X"70",X"75",X"75",X"7D",X"83",X"88",X"93",X"9B",X"A3",X"A3",X"A6",X"A6", + X"A3",X"9E",X"93",X"88",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"7D",X"70",X"68",X"62", + X"62",X"68",X"70",X"78",X"7D",X"7D",X"78",X"75",X"68",X"68",X"62",X"62",X"68",X"78",X"78",X"7D", + X"75",X"68",X"6D",X"6D",X"70",X"75",X"7D",X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"80",X"83", + X"88",X"8B",X"88",X"83",X"80",X"80",X"83",X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D", + X"75",X"6D",X"68",X"75",X"80",X"83",X"88",X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"75",X"68",X"5D",X"52",X"4A",X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B", + X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B",X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62", + X"65",X"70",X"78",X"7D",X"80",X"88",X"8B",X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90", + X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"7D",X"78",X"78",X"75",X"70",X"70",X"6D",X"68",X"6D",X"70",X"78",X"80", + X"80",X"80",X"83",X"88",X"90",X"8B",X"8B",X"8B",X"88",X"80",X"7D",X"78",X"70",X"68",X"68",X"68", + X"68",X"6D",X"6D",X"70",X"78",X"7D",X"83",X"8B",X"8B",X"90",X"8B",X"88",X"88",X"88",X"88",X"83", + X"80",X"80",X"83",X"80",X"80",X"7D",X"83",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"78",X"78", + X"75",X"70",X"70",X"70",X"75",X"78",X"78",X"78",X"75",X"75",X"70",X"70",X"75",X"78",X"75",X"75", + X"75",X"75",X"78",X"7D",X"80",X"7D",X"7D",X"7D",X"83",X"88",X"8B",X"88",X"88",X"88",X"88",X"88", + X"8B",X"90",X"90",X"88",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"7D",X"7D",X"80",X"7D",X"78", + X"75",X"70",X"70",X"78",X"80",X"88",X"88",X"88",X"88",X"83",X"7D",X"78",X"78",X"80",X"83",X"83", + X"83",X"80",X"78",X"75",X"75",X"75",X"78",X"80",X"80",X"83",X"83",X"80",X"7D",X"78",X"6D",X"68", + X"65",X"62",X"5D",X"5A",X"62",X"65",X"68",X"75",X"80",X"8B",X"90",X"93",X"90",X"88",X"83",X"80", + X"78",X"75",X"75",X"70",X"68",X"65",X"5D",X"5D",X"55",X"5A",X"5D",X"65",X"68",X"75",X"75",X"80", + X"83",X"8B",X"90",X"9B",X"A3",X"A6",X"A6",X"9E",X"9B",X"98",X"98",X"9E",X"9E",X"A3",X"A3",X"A6", + X"A3",X"9B",X"8B",X"88",X"7D",X"75",X"6D",X"68",X"6D",X"75",X"7D",X"7D",X"83",X"83",X"80",X"75", + X"6D",X"68",X"68",X"68",X"65",X"62",X"5D",X"5A",X"5A",X"5D",X"62",X"68",X"78",X"80",X"83",X"80", + X"7D",X"80",X"83",X"8B",X"98",X"9B",X"9B",X"98",X"90",X"8B",X"7D",X"70",X"68",X"62",X"65",X"68", + X"70",X"78",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"7D",X"7D",X"7D",X"83",X"90",X"98", + X"9B",X"9E",X"9B",X"98",X"90",X"8B",X"83",X"83",X"7D",X"75",X"70",X"65",X"5D",X"5D",X"5A",X"5D", + X"62",X"65",X"68",X"75",X"75",X"75",X"75",X"68",X"6D",X"6D",X"70",X"70",X"75",X"70",X"75",X"75", + X"78",X"7D",X"83",X"90",X"98",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"88",X"83",X"7D",X"7D", + X"7D",X"80",X"83",X"80",X"80",X"7D",X"75",X"68",X"65",X"65",X"68",X"75",X"78",X"7D",X"78",X"78", + X"78",X"6D",X"68",X"65",X"68",X"6D",X"78",X"7D",X"7D",X"75",X"6D",X"6D",X"70",X"75",X"78",X"80", + X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"83",X"83",X"88",X"8B",X"88",X"83",X"80",X"80",X"83", + X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D",X"75",X"6D",X"68",X"75",X"80",X"83",X"88", + X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D",X"80",X"80",X"75",X"68",X"5D",X"52",X"4A", + X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B",X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B", + X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62",X"65",X"70",X"78",X"7D",X"80",X"88",X"8B", + X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90",X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D", + X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"75", + X"75",X"70",X"75",X"6D",X"68",X"6D",X"70",X"78",X"80",X"83",X"80",X"83",X"88",X"90",X"8B",X"8B", + X"88",X"83",X"7D",X"78",X"75",X"6D",X"68",X"68",X"68",X"65",X"68",X"68",X"68",X"70",X"75",X"7D", + X"88",X"83",X"88",X"88",X"80",X"83",X"83",X"88",X"8B",X"88",X"88",X"88",X"83",X"80",X"7D",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"7D",X"75",X"75",X"75",X"75",X"70", + X"70",X"68",X"68",X"68",X"68",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"83",X"83",X"83",X"88", + X"88",X"90",X"98",X"98",X"93",X"90",X"90",X"8B",X"88",X"88",X"8B",X"88",X"80",X"78",X"78",X"75", + X"70",X"68",X"68",X"65",X"68",X"70",X"78",X"78",X"78",X"75",X"75",X"70",X"78",X"80",X"83",X"83", + X"80",X"7D",X"70",X"68",X"65",X"68",X"70",X"7D",X"83",X"83",X"83",X"80",X"75",X"70",X"68",X"65", + X"65",X"65",X"68",X"6D",X"70",X"78",X"7D",X"7D",X"7D",X"83",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"80",X"83",X"8B",X"90",X"93",X"93",X"8B",X"83",X"7D",X"78",X"70",X"6D",X"68",X"65",X"65",X"62", + X"65",X"68",X"70",X"7D",X"88",X"88",X"93",X"90",X"90",X"90",X"90",X"93",X"93",X"93",X"98",X"90", + X"88",X"80",X"78",X"78",X"75",X"78",X"80",X"88",X"90",X"90",X"93",X"8B",X"8B",X"88",X"7D",X"78", + X"6D",X"65",X"65",X"68",X"6D",X"75",X"80",X"83",X"88",X"88",X"88",X"83",X"83",X"83",X"83",X"80", + X"7D",X"80",X"7D",X"75",X"6D",X"68",X"5D",X"55",X"52",X"52",X"62",X"68",X"70",X"75",X"75",X"75", + X"78",X"7D",X"83",X"80",X"83",X"83",X"83",X"83",X"88",X"8B",X"90",X"98",X"98",X"9B",X"9B",X"93", + X"8B",X"83",X"7D",X"78",X"78",X"70",X"75",X"7D",X"80",X"80",X"83",X"80",X"80",X"75",X"70",X"68", + X"68",X"68",X"65",X"68",X"68",X"65",X"68",X"70",X"78",X"7D",X"88",X"88",X"88",X"83",X"83",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75", + X"75",X"7D",X"83",X"83",X"88",X"83",X"88",X"83",X"88",X"83",X"83",X"8B",X"88",X"8B",X"88",X"88", + X"80",X"7D",X"7D",X"75",X"6D",X"68",X"6D",X"70",X"7D",X"80",X"7D",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80", + X"83",X"83",X"80",X"80",X"7D",X"78",X"75",X"70",X"68",X"6D",X"75",X"78",X"7D",X"80",X"80",X"80", + X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"88",X"88",X"8B",X"8B",X"8B", + X"8B",X"88",X"83",X"83",X"80",X"78",X"75",X"75",X"70",X"70",X"75",X"75",X"80",X"83",X"80",X"83", + X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70", + X"75",X"75",X"78",X"7D",X"7D",X"80",X"80",X"83",X"83",X"83",X"83",X"88",X"83",X"83",X"83",X"88", + X"83",X"83",X"88",X"8B",X"88",X"88",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"80",X"80",X"80", + X"83",X"83",X"83",X"7D",X"7D",X"75",X"75",X"75",X"75",X"75",X"70",X"75",X"75",X"75",X"78",X"83", + X"80",X"83",X"80",X"7D",X"80",X"78",X"78",X"80",X"80",X"80",X"7D",X"80",X"80",X"80",X"7D",X"75", + X"70",X"68",X"68",X"68",X"68",X"68",X"70",X"75",X"7D",X"83",X"8B",X"90",X"90",X"8B",X"83",X"80", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70",X"75",X"75", + X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"7D",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"83",X"83", + X"8B",X"8B",X"8B",X"88",X"83",X"83",X"80",X"83",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"7D",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78", + X"78",X"78",X"78",X"78",X"7D",X"80",X"78",X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D", + X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"78",X"7D",X"78",X"7D",X"80",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80", + X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"78",X"80", + X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"75",X"75",X"83",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"88",X"83", + X"80",X"80",X"7D",X"78",X"75",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"75",X"75",X"78", + X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"78",X"78",X"78",X"75",X"75",X"75",X"70",X"75",X"75",X"7D",X"7D",X"80",X"80",X"80", + X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"78",X"78",X"7D", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"78", + X"78",X"78",X"78",X"78",X"78",X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83", + X"83",X"83",X"88",X"83",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"7D",X"78",X"78",X"78",X"75",X"75", + X"75",X"78",X"7D",X"78",X"83",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"78",X"78",X"78",X"78",X"75",X"75",X"75",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80", + X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"78", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"80",X"83",X"83",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"78",X"78",X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D",X"78",X"78",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"83",X"80",X"80",X"83",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"7D",X"80",X"80",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"7D",X"78",X"78",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..1b828ed1 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,662 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 10239) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AF",X"32",X"01",X"70",X"C3",X"D0",X"00",X"3A",X"36",X"40",X"3C",X"E6",X"07",X"32",X"36",X"40", + X"20",X"1A",X"06",X"1A",X"11",X"09",X"58",X"1A",X"FE",X"05",X"28",X"09",X"FE",X"06",X"20",X"08", + X"3E",X"05",X"12",X"18",X"03",X"3E",X"06",X"12",X"13",X"13",X"10",X"EB",X"C9",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"AF",X"32", + X"01",X"70",X"3A",X"00",X"40",X"3C",X"32",X"00",X"40",X"3A",X"35",X"40",X"3C",X"32",X"35",X"40", + X"CD",X"07",X"00",X"CD",X"FB",X"1B",X"AF",X"32",X"05",X"68",X"3A",X"00",X"60",X"CB",X"47",X"20", + X"06",X"AF",X"32",X"02",X"40",X"18",X"18",X"3A",X"02",X"40",X"B7",X"20",X"12",X"3E",X"01",X"32", + X"02",X"40",X"3A",X"01",X"40",X"37",X"3F",X"3C",X"27",X"32",X"01",X"40",X"CD",X"1D",X"17",X"FD", + X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"3A",X"00",X"78",X"3E",X"01",X"32",X"01",X"70",X"F1",X"C9", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"00",X"50",X"06",X"04",X"3E",X"10",X"77",X"2C",X"20",X"FC",X"24",X"3A",X"00",X"78",X"10", + X"F4",X"21",X"00",X"58",X"AF",X"77",X"2C",X"20",X"FC",X"3E",X"01",X"21",X"00",X"60",X"06",X"08", + X"77",X"23",X"10",X"FC",X"AF",X"21",X"00",X"68",X"06",X"08",X"77",X"23",X"10",X"FC",X"06",X"08", + X"21",X"01",X"70",X"77",X"23",X"10",X"FC",X"3D",X"32",X"00",X"78",X"3A",X"00",X"78",X"06",X"04", + X"21",X"00",X"40",X"AF",X"77",X"2C",X"20",X"FC",X"24",X"3A",X"00",X"78",X"10",X"F5",X"31",X"00", + X"44",X"18",X"1D",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CD",X"64",X"14",X"3E",X"01",X"32",X"07",X"68",X"3E",X"01",X"32",X"01",X"70",X"CD",X"70",X"14", + X"AF",X"32",X"06",X"70",X"32",X"07",X"70",X"CD",X"6B",X"15",X"CD",X"AD",X"14",X"AF",X"32",X"30", + X"40",X"3E",X"03",X"32",X"37",X"40",X"3E",X"01",X"32",X"32",X"40",X"AF",X"CD",X"B8",X"0E",X"CD", + X"C5",X"02",X"CD",X"F5",X"12",X"3A",X"00",X"78",X"CD",X"B9",X"14",X"3A",X"33",X"40",X"CD",X"B8", + X"0E",X"CD",X"93",X"0F",X"CD",X"87",X"13",X"CD",X"B4",X"0F",X"CD",X"5F",X"13",X"AF",X"32",X"35", + X"40",X"3A",X"40",X"40",X"32",X"40",X"58",X"3A",X"41",X"40",X"32",X"43",X"58",X"AF",X"32",X"4A", + X"40",X"32",X"42",X"40",X"32",X"43",X"40",X"32",X"57",X"40",X"32",X"59",X"40",X"32",X"5B",X"40", + X"32",X"44",X"58",X"32",X"48",X"58",X"32",X"4C",X"58",X"CD",X"E2",X"0F",X"CD",X"74",X"0C",X"21", + X"9C",X"1C",X"3A",X"45",X"40",X"B7",X"28",X"03",X"21",X"8B",X"1D",X"AF",X"CD",X"70",X"1C",X"3A", + X"40",X"58",X"E6",X"0F",X"20",X"1B",X"3A",X"43",X"58",X"E6",X"0F",X"20",X"14",X"CD",X"74",X"02", + X"B7",X"20",X"1A",X"3A",X"43",X"40",X"B7",X"28",X"11",X"47",X"AF",X"32",X"43",X"40",X"78",X"18", + X"0C",X"CD",X"74",X"02",X"B7",X"28",X"03",X"32",X"43",X"40",X"3A",X"42",X"40",X"CB",X"57",X"C2", + X"20",X"03",X"CB",X"5F",X"C2",X"4B",X"03",X"CB",X"47",X"C2",X"76",X"03",X"CB",X"4F",X"C2",X"A1", + X"03",X"CD",X"83",X"05",X"CD",X"98",X"07",X"CD",X"BC",X"13",X"CD",X"B6",X"11",X"3A",X"3A",X"40", + X"FE",X"1F",X"CA",X"B9",X"10",X"3A",X"2E",X"40",X"B7",X"28",X"07",X"3A",X"00",X"68",X"CB",X"4F", + X"20",X"17",X"3A",X"44",X"40",X"B7",X"20",X"34",X"CD",X"7F",X"12",X"3A",X"4A",X"40",X"FE",X"04", + X"20",X"2A",X"3A",X"45",X"40",X"B7",X"C2",X"2F",X"11",X"3A",X"32",X"40",X"37",X"3F",X"3C",X"27", + X"32",X"32",X"40",X"3A",X"33",X"40",X"3C",X"32",X"33",X"40",X"FE",X"0C",X"20",X"0B",X"AF",X"32", + X"33",X"40",X"3A",X"34",X"40",X"3C",X"32",X"34",X"40",X"C3",X"75",X"01",X"3E",X"01",X"CD",X"D5", + X"0C",X"C3",X"CF",X"01",X"C5",X"AF",X"4F",X"3A",X"00",X"60",X"CB",X"57",X"28",X"04",X"79",X"C6", + X"04",X"4F",X"3A",X"00",X"60",X"CB",X"5F",X"28",X"04",X"79",X"C6",X"08",X"4F",X"3A",X"00",X"60", + X"CB",X"67",X"28",X"04",X"79",X"C6",X"10",X"4F",X"3A",X"00",X"68",X"CB",X"57",X"28",X"04",X"79", + X"C6",X"01",X"4F",X"3A",X"00",X"68",X"CB",X"5F",X"28",X"04",X"79",X"C6",X"02",X"4F",X"79",X"C1", + X"C9",X"3A",X"30",X"40",X"B7",X"28",X"02",X"18",X"0C",X"01",X"0D",X"01",X"21",X"32",X"40",X"11", + X"3F",X"41",X"ED",X"B0",X"C9",X"01",X"0D",X"01",X"21",X"32",X"40",X"11",X"4C",X"42",X"ED",X"B0", + X"C9",X"3A",X"30",X"40",X"B7",X"28",X"02",X"18",X"0C",X"01",X"0D",X"01",X"21",X"3F",X"41",X"11", + X"32",X"40",X"ED",X"B0",X"C9",X"01",X"0D",X"01",X"21",X"4C",X"42",X"11",X"32",X"40",X"ED",X"B0", + X"C9",X"3A",X"2F",X"40",X"B7",X"C8",X"3A",X"30",X"40",X"EE",X"01",X"32",X"30",X"40",X"CD",X"D1", + X"02",X"3A",X"37",X"40",X"B7",X"28",X"EF",X"CD",X"87",X"13",X"CD",X"DC",X"13",X"CD",X"5F",X"13", + X"3A",X"2D",X"40",X"B7",X"28",X"09",X"3A",X"30",X"40",X"32",X"06",X"70",X"32",X"07",X"70",X"C9", + X"32",X"42",X"40",X"CD",X"DC",X"03",X"38",X"20",X"CD",X"61",X"04",X"3A",X"40",X"58",X"3D",X"32", + X"40",X"58",X"E6",X"0F",X"01",X"00",X"00",X"DD",X"21",X"CC",X"03",X"4F",X"DD",X"09",X"DD",X"7E", + X"00",X"4F",X"3E",X"14",X"81",X"32",X"41",X"58",X"C3",X"11",X"02",X"32",X"42",X"40",X"CD",X"1C", + X"04",X"38",X"20",X"CD",X"C3",X"04",X"3A",X"40",X"58",X"3C",X"32",X"40",X"58",X"E6",X"0F",X"01", + X"00",X"00",X"DD",X"21",X"CC",X"03",X"4F",X"DD",X"09",X"DD",X"7E",X"00",X"4F",X"3E",X"94",X"81", + X"32",X"41",X"58",X"C3",X"11",X"02",X"32",X"42",X"40",X"CD",X"30",X"04",X"38",X"20",X"CD",X"E0", + X"04",X"3A",X"43",X"58",X"3D",X"32",X"43",X"58",X"E6",X"0F",X"01",X"00",X"00",X"DD",X"21",X"CC", + X"03",X"4F",X"DD",X"09",X"DD",X"7E",X"00",X"4F",X"3E",X"17",X"81",X"32",X"41",X"58",X"C3",X"11", + X"02",X"32",X"42",X"40",X"CD",X"4A",X"04",X"38",X"20",X"CD",X"04",X"05",X"3A",X"43",X"58",X"3C", + X"32",X"43",X"58",X"E6",X"0F",X"01",X"00",X"00",X"DD",X"21",X"CC",X"03",X"4F",X"DD",X"09",X"DD", + X"7E",X"00",X"4F",X"3E",X"57",X"81",X"32",X"41",X"58",X"C3",X"11",X"02",X"01",X"01",X"01",X"01", + X"02",X"02",X"02",X"02",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"3A",X"40",X"58",X"E6", + X"0F",X"20",X"2D",X"3A",X"40",X"58",X"FE",X"20",X"28",X"24",X"CD",X"25",X"05",X"2B",X"7E",X"FE", + X"00",X"28",X"1B",X"FE",X"02",X"28",X"17",X"FE",X"06",X"CA",X"1B",X"0C",X"FE",X"07",X"28",X"0E", + X"FE",X"0D",X"28",X"0A",X"FE",X"0E",X"28",X"06",X"FE",X"0F",X"28",X"07",X"18",X"02",X"37",X"C9", + X"37",X"3F",X"C9",X"3A",X"4A",X"40",X"FE",X"03",X"20",X"F4",X"18",X"F4",X"3A",X"40",X"58",X"E6", + X"0F",X"20",X"ED",X"3A",X"40",X"58",X"FE",X"D0",X"28",X"E4",X"CD",X"25",X"05",X"23",X"18",X"BE", + X"3A",X"43",X"58",X"E6",X"0F",X"20",X"D9",X"3A",X"43",X"58",X"FE",X"20",X"28",X"D0",X"CD",X"25", + X"05",X"11",X"10",X"00",X"37",X"3F",X"ED",X"52",X"18",X"A4",X"3A",X"43",X"58",X"E6",X"0F",X"20", + X"BF",X"3A",X"43",X"58",X"FE",X"E0",X"28",X"B6",X"CD",X"25",X"05",X"11",X"10",X"00",X"19",X"18", + X"8D",X"3A",X"40",X"58",X"E6",X"0F",X"FE",X"08",X"20",X"58",X"3A",X"40",X"58",X"C6",X"08",X"32", + X"2C",X"41",X"3A",X"43",X"58",X"32",X"2D",X"41",X"CD",X"31",X"05",X"2B",X"7E",X"FE",X"03",X"28", + X"1C",X"FE",X"04",X"28",X"13",X"FE",X"05",X"20",X"39",X"3E",X"20",X"CD",X"BC",X"0D",X"3A",X"4D", + X"40",X"B7",X"20",X"0E",X"3C",X"32",X"4D",X"40",X"3E",X"20",X"CD",X"BC",X"0D",X"3E",X"10",X"CD", + X"BC",X"0D",X"3A",X"44",X"40",X"3D",X"32",X"44",X"40",X"3E",X"01",X"E5",X"21",X"64",X"1F",X"CD", + X"70",X"1C",X"E1",X"3E",X"01",X"77",X"CD",X"4D",X"05",X"3E",X"01",X"CD",X"04",X"0E",X"CD",X"7D", + X"0D",X"C9",X"C9",X"3A",X"40",X"58",X"E6",X"0F",X"FE",X"08",X"20",X"F6",X"3A",X"40",X"58",X"D6", + X"08",X"32",X"2C",X"41",X"3A",X"43",X"58",X"32",X"2D",X"41",X"CD",X"31",X"05",X"23",X"18",X"9C", + X"3A",X"43",X"58",X"E6",X"0F",X"FE",X"08",X"20",X"D9",X"3A",X"43",X"58",X"C6",X"08",X"32",X"2D", + X"41",X"3A",X"40",X"58",X"32",X"2C",X"41",X"CD",X"31",X"05",X"11",X"10",X"00",X"37",X"3F",X"ED", + X"52",X"C3",X"7C",X"04",X"3A",X"43",X"58",X"E6",X"0F",X"FE",X"08",X"20",X"B5",X"3A",X"43",X"58", + X"D6",X"08",X"32",X"2D",X"41",X"3A",X"40",X"58",X"32",X"2C",X"41",X"CD",X"31",X"05",X"11",X"10", + X"00",X"19",X"C3",X"7C",X"04",X"3A",X"40",X"58",X"32",X"2C",X"41",X"3A",X"43",X"58",X"32",X"2D", + X"41",X"3A",X"2C",X"41",X"D6",X"20",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"6F",X"3A", + X"2D",X"41",X"D6",X"20",X"85",X"6F",X"26",X"00",X"11",X"5C",X"40",X"19",X"C9",X"D5",X"E5",X"11", + X"5C",X"40",X"37",X"3F",X"ED",X"52",X"7D",X"E6",X"0F",X"CB",X"27",X"C6",X"02",X"47",X"7D",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"27",X"C6",X"04",X"4F",X"E1",X"D1",X"C9",X"79", + X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"B0",X"06",X"00",X"4F",X"DD",X"21",X"5C",X"40", + X"DD",X"09",X"C9",X"3A",X"55",X"40",X"3C",X"32",X"55",X"40",X"47",X"3A",X"54",X"40",X"B8",X"30", + X"22",X"AF",X"32",X"55",X"40",X"3A",X"53",X"40",X"E6",X"01",X"28",X"03",X"CD",X"E7",X"05",X"3A", + X"53",X"40",X"E6",X"02",X"28",X"03",X"CD",X"4C",X"06",X"3A",X"53",X"40",X"E6",X"04",X"28",X"03", + X"CD",X"B1",X"06",X"CD",X"16",X"07",X"CD",X"30",X"07",X"CD",X"4A",X"07",X"3A",X"50",X"58",X"57", + X"3A",X"53",X"58",X"5F",X"CD",X"64",X"07",X"DA",X"1B",X"0C",X"3A",X"54",X"58",X"57",X"3A",X"57", + X"58",X"5F",X"CD",X"64",X"07",X"DA",X"1B",X"0C",X"3A",X"58",X"58",X"57",X"3A",X"5B",X"58",X"5F", + X"CD",X"64",X"07",X"DA",X"1B",X"0C",X"C9",X"3A",X"57",X"40",X"B7",X"20",X"47",X"3A",X"56",X"40", + X"47",X"3A",X"47",X"58",X"80",X"32",X"47",X"58",X"FE",X"20",X"28",X"04",X"FE",X"E0",X"20",X"06", + X"78",X"ED",X"44",X"32",X"56",X"40",X"3A",X"47",X"58",X"E6",X"0F",X"20",X"27",X"3A",X"47",X"58", + X"E6",X"F0",X"47",X"3A",X"43",X"58",X"E6",X"F0",X"B8",X"20",X"19",X"3E",X"01",X"32",X"05",X"68", + X"32",X"57",X"40",X"3E",X"1E",X"32",X"45",X"58",X"3A",X"44",X"58",X"32",X"50",X"58",X"3A",X"47", + X"58",X"32",X"53",X"58",X"3A",X"57",X"40",X"B7",X"28",X"11",X"FE",X"10",X"30",X"0D",X"3C",X"32", + X"57",X"40",X"FE",X"10",X"20",X"05",X"3E",X"1D",X"32",X"45",X"58",X"C9",X"3A",X"59",X"40",X"B7", + X"20",X"47",X"3A",X"58",X"40",X"47",X"3A",X"4B",X"58",X"80",X"32",X"4B",X"58",X"FE",X"20",X"28", + X"04",X"FE",X"E0",X"20",X"06",X"78",X"ED",X"44",X"32",X"58",X"40",X"3A",X"4B",X"58",X"E6",X"0F", + X"20",X"27",X"3A",X"4B",X"58",X"E6",X"F0",X"47",X"3A",X"43",X"58",X"E6",X"F0",X"B8",X"20",X"19", + X"3E",X"01",X"32",X"05",X"68",X"32",X"59",X"40",X"3E",X"9E",X"32",X"49",X"58",X"3A",X"48",X"58", + X"32",X"54",X"58",X"3A",X"4B",X"58",X"32",X"57",X"58",X"3A",X"59",X"40",X"B7",X"28",X"11",X"FE", + X"10",X"30",X"0D",X"3C",X"32",X"59",X"40",X"FE",X"10",X"20",X"05",X"3E",X"9D",X"32",X"49",X"58", + X"C9",X"3A",X"5B",X"40",X"B7",X"20",X"47",X"3A",X"5A",X"40",X"47",X"3A",X"4C",X"58",X"80",X"32", + X"4C",X"58",X"FE",X"20",X"28",X"04",X"FE",X"D0",X"20",X"06",X"78",X"ED",X"44",X"32",X"5A",X"40", + X"3A",X"4C",X"58",X"E6",X"0F",X"20",X"27",X"3A",X"4C",X"58",X"E6",X"F0",X"47",X"3A",X"40",X"58", + X"E6",X"F0",X"B8",X"20",X"19",X"3E",X"01",X"32",X"05",X"68",X"32",X"5B",X"40",X"3E",X"62",X"32", + X"4D",X"58",X"3A",X"4C",X"58",X"32",X"58",X"58",X"3A",X"4F",X"58",X"32",X"5B",X"58",X"3A",X"5B", + X"40",X"B7",X"28",X"11",X"FE",X"10",X"30",X"0D",X"3C",X"32",X"5B",X"40",X"FE",X"10",X"20",X"05", + X"3E",X"61",X"32",X"4D",X"58",X"C9",X"3A",X"57",X"40",X"B7",X"28",X"13",X"3A",X"50",X"58",X"3C", + X"3C",X"32",X"50",X"58",X"FE",X"D8",X"20",X"07",X"AF",X"32",X"50",X"58",X"32",X"57",X"40",X"C9", + X"3A",X"59",X"40",X"B7",X"28",X"13",X"3A",X"54",X"58",X"3D",X"3D",X"32",X"54",X"58",X"FE",X"18", + X"20",X"07",X"AF",X"32",X"54",X"58",X"32",X"59",X"40",X"C9",X"3A",X"5B",X"40",X"B7",X"28",X"13", + X"3A",X"5B",X"58",X"3C",X"3C",X"32",X"5B",X"58",X"FE",X"E8",X"20",X"07",X"AF",X"32",X"58",X"58", + X"32",X"5B",X"40",X"C9",X"7A",X"C6",X"04",X"4F",X"3A",X"40",X"58",X"C6",X"04",X"CD",X"7F",X"07", + X"30",X"0C",X"7B",X"C6",X"04",X"4F",X"3A",X"43",X"58",X"C6",X"04",X"CD",X"7F",X"07",X"C9",X"47", + X"B8",X"38",X"08",X"79",X"90",X"FE",X"08",X"38",X"0D",X"18",X"08",X"78",X"91",X"FE",X"08",X"38", + X"05",X"18",X"00",X"37",X"3F",X"C9",X"37",X"C9",X"3A",X"45",X"40",X"B7",X"C0",X"3A",X"4D",X"40", + X"B7",X"20",X"4C",X"3A",X"4B",X"40",X"3C",X"32",X"4B",X"40",X"FE",X"3C",X"38",X"40",X"AF",X"32", + X"4B",X"40",X"3A",X"4C",X"40",X"FE",X"01",X"20",X"12",X"3A",X"5C",X"58",X"C6",X"10",X"32",X"5C", + X"58",X"3A",X"3B",X"40",X"CB",X"27",X"32",X"3B",X"40",X"18",X"10",X"3A",X"5C",X"58",X"D6",X"10", + X"32",X"5C",X"58",X"3A",X"3B",X"40",X"CB",X"3F",X"32",X"3B",X"40",X"3A",X"5C",X"58",X"FE",X"58", + X"28",X"04",X"FE",X"98",X"20",X"08",X"3A",X"4C",X"40",X"ED",X"44",X"32",X"4C",X"40",X"C9",X"3A", + X"4D",X"40",X"FE",X"01",X"20",X"1C",X"CD",X"FA",X"09",X"30",X"12",X"3A",X"4D",X"40",X"3C",X"32", + X"4D",X"40",X"AF",X"32",X"4B",X"40",X"32",X"51",X"40",X"32",X"50",X"40",X"C9",X"AF",X"32",X"4D", + X"40",X"C9",X"FE",X"02",X"20",X"55",X"3A",X"4B",X"40",X"3C",X"32",X"4B",X"40",X"FE",X"0A",X"C0", + X"AF",X"32",X"4B",X"40",X"3A",X"5C",X"58",X"47",X"3A",X"50",X"40",X"32",X"5C",X"58",X"78",X"32", + X"50",X"40",X"3A",X"51",X"40",X"3C",X"32",X"51",X"40",X"FE",X"08",X"C0",X"3E",X"03",X"32",X"4D", + X"40",X"AF",X"32",X"51",X"40",X"3A",X"4E",X"40",X"C6",X"02",X"CB",X"27",X"CB",X"27",X"CB",X"27", + X"CB",X"27",X"32",X"5C",X"58",X"3A",X"4F",X"40",X"C6",X"02",X"CB",X"27",X"CB",X"27",X"CB",X"27", + X"CB",X"27",X"32",X"5F",X"58",X"3E",X"39",X"32",X"5D",X"58",X"C9",X"FE",X"03",X"20",X"77",X"3A", + X"4B",X"40",X"3C",X"32",X"4B",X"40",X"FE",X"0A",X"C0",X"AF",X"32",X"4B",X"40",X"3A",X"5C",X"58", + X"47",X"3A",X"50",X"40",X"32",X"5C",X"58",X"78",X"32",X"50",X"40",X"3A",X"4E",X"40",X"3C",X"CB", + X"27",X"47",X"3A",X"4F",X"40",X"3C",X"3C",X"CB",X"27",X"4F",X"3A",X"5C",X"58",X"B7",X"20",X"07", + X"3E",X"06",X"CD",X"04",X"0E",X"18",X"05",X"3E",X"01",X"CD",X"04",X"0E",X"3A",X"51",X"40",X"3C", + X"32",X"51",X"40",X"FE",X"08",X"C0",X"3E",X"04",X"32",X"4D",X"40",X"AF",X"32",X"4B",X"40",X"32", + X"51",X"40",X"32",X"4C",X"40",X"32",X"52",X"40",X"AF",X"21",X"9E",X"1E",X"CD",X"70",X"1C",X"3A", + X"4E",X"40",X"47",X"3A",X"4F",X"40",X"4F",X"CD",X"6F",X"05",X"3E",X"01",X"DD",X"77",X"00",X"CD", + X"E4",X"14",X"CD",X"79",X"0A",X"C9",X"3A",X"4B",X"40",X"3C",X"E6",X"3F",X"32",X"4B",X"40",X"3A", + X"52",X"40",X"B7",X"20",X"16",X"3A",X"4B",X"40",X"B7",X"20",X"4B",X"3A",X"51",X"40",X"3C",X"32", + X"51",X"40",X"FE",X"0A",X"20",X"40",X"3E",X"01",X"32",X"52",X"40",X"CD",X"7C",X"09",X"30",X"36", + X"AF",X"32",X"52",X"40",X"32",X"4D",X"40",X"3A",X"4E",X"40",X"3C",X"CB",X"27",X"47",X"3A",X"4F", + X"40",X"3C",X"3C",X"CB",X"27",X"4F",X"3E",X"06",X"CD",X"04",X"0E",X"3A",X"4E",X"40",X"47",X"3A", + X"4F",X"40",X"4F",X"CD",X"6F",X"05",X"3E",X"06",X"DD",X"77",X"00",X"CD",X"7B",X"10",X"AF",X"21", + X"9C",X"1C",X"CD",X"70",X"1C",X"C9",X"CD",X"E3",X"09",X"38",X"6B",X"3A",X"4B",X"40",X"E6",X"01", + X"C8",X"3A",X"4B",X"40",X"E6",X"10",X"28",X"04",X"3E",X"39",X"18",X"02",X"3E",X"3A",X"32",X"5D", + X"58",X"3A",X"4C",X"40",X"CB",X"57",X"C2",X"35",X"0A",X"CB",X"5F",X"C2",X"46",X"0A",X"CB",X"47", + X"C2",X"57",X"0A",X"CB",X"4F",X"C2",X"68",X"0A",X"CD",X"79",X"0A",X"C9",X"3A",X"5C",X"58",X"E6", + X"0F",X"20",X"2E",X"3A",X"5F",X"58",X"E6",X"0F",X"20",X"27",X"3A",X"5C",X"58",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"D6",X"02",X"32",X"4E",X"40",X"4F",X"3A",X"5F",X"58",X"D6",X"20", + X"81",X"06",X"00",X"4F",X"DD",X"21",X"5C",X"40",X"DD",X"09",X"DD",X"7E",X"00",X"FE",X"01",X"28", + X"03",X"37",X"3F",X"C9",X"37",X"C9",X"AF",X"32",X"4D",X"40",X"3A",X"3B",X"40",X"47",X"3A",X"3A", + X"40",X"B0",X"32",X"3A",X"40",X"CD",X"DC",X"13",X"CD",X"7B",X"10",X"3E",X"50",X"CD",X"BC",X"0D", + X"CD",X"7D",X"0D",X"AF",X"21",X"9C",X"1C",X"CD",X"70",X"1C",X"3E",X"01",X"21",X"6D",X"1F",X"CD", + X"70",X"1C",X"C9",X"3A",X"40",X"58",X"4F",X"3A",X"5C",X"58",X"CD",X"7F",X"07",X"30",X"0A",X"3A", + X"43",X"58",X"4F",X"3A",X"5F",X"58",X"CD",X"7F",X"07",X"C9",X"AF",X"32",X"4F",X"40",X"0E",X"0D", + X"DD",X"21",X"5C",X"40",X"AF",X"32",X"4E",X"40",X"06",X"0C",X"DD",X"7E",X"00",X"FE",X"06",X"28", + X"22",X"DD",X"23",X"3A",X"4E",X"40",X"3C",X"32",X"4E",X"40",X"10",X"EE",X"DD",X"23",X"DD",X"23", + X"DD",X"23",X"DD",X"23",X"3A",X"4F",X"40",X"3C",X"32",X"4F",X"40",X"0D",X"79",X"B7",X"20",X"D4", + X"37",X"3F",X"C9",X"37",X"C9",X"3A",X"5C",X"58",X"3D",X"32",X"5C",X"58",X"E6",X"0F",X"20",X"03", + X"CD",X"79",X"0A",X"C3",X"7B",X"09",X"3A",X"5C",X"58",X"3C",X"32",X"5C",X"58",X"E6",X"0F",X"20", + X"03",X"CD",X"79",X"0A",X"C3",X"7B",X"09",X"3A",X"5F",X"58",X"3D",X"32",X"5F",X"58",X"E6",X"0F", + X"20",X"03",X"CD",X"79",X"0A",X"C3",X"7B",X"09",X"3A",X"5F",X"58",X"3C",X"32",X"5F",X"58",X"E6", + X"0F",X"20",X"03",X"CD",X"79",X"0A",X"C3",X"7B",X"09",X"06",X"10",X"AF",X"DD",X"21",X"2F",X"41", + X"DD",X"77",X"00",X"DD",X"23",X"10",X"F5",X"3A",X"5C",X"58",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F", + X"CB",X"3F",X"D6",X"02",X"32",X"4E",X"40",X"47",X"3A",X"5F",X"58",X"CB",X"3F",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"D6",X"02",X"32",X"4F",X"40",X"4F",X"CD",X"9B",X"0B",X"DD",X"21",X"2F",X"41", + X"1E",X"00",X"3A",X"2E",X"41",X"CB",X"57",X"28",X"07",X"DD",X"36",X"00",X"04",X"DD",X"23",X"1C", + X"CB",X"5F",X"28",X"07",X"DD",X"36",X"00",X"08",X"DD",X"23",X"1C",X"CB",X"47",X"28",X"07",X"DD", + X"36",X"00",X"01",X"DD",X"23",X"1C",X"CB",X"4F",X"28",X"07",X"DD",X"36",X"00",X"02",X"DD",X"23", + X"1C",X"3A",X"4C",X"40",X"B7",X"28",X"19",X"47",X"3A",X"2E",X"41",X"A0",X"28",X"12",X"DD",X"77", + X"00",X"DD",X"23",X"1C",X"DD",X"77",X"00",X"DD",X"23",X"1C",X"DD",X"77",X"00",X"DD",X"23",X"1C", + X"3A",X"40",X"58",X"47",X"3A",X"5C",X"58",X"B8",X"38",X"1E",X"3A",X"2E",X"41",X"CB",X"5F",X"28", + X"33",X"DD",X"36",X"00",X"08",X"DD",X"23",X"1C",X"DD",X"36",X"00",X"08",X"DD",X"23",X"1C",X"DD", + X"36",X"00",X"08",X"DD",X"23",X"1C",X"18",X"1C",X"3A",X"2E",X"41",X"CB",X"57",X"28",X"15",X"DD", + X"36",X"00",X"04",X"DD",X"23",X"1C",X"DD",X"36",X"00",X"04",X"DD",X"23",X"1C",X"DD",X"36",X"00", + X"04",X"DD",X"23",X"1C",X"3A",X"43",X"58",X"47",X"3A",X"5F",X"58",X"B8",X"38",X"1E",X"3A",X"2E", + X"41",X"CB",X"4F",X"28",X"33",X"DD",X"36",X"00",X"02",X"DD",X"23",X"1C",X"DD",X"36",X"00",X"02", + X"DD",X"23",X"1C",X"DD",X"36",X"00",X"02",X"DD",X"23",X"1C",X"18",X"1C",X"3A",X"2E",X"41",X"CB", + X"47",X"28",X"15",X"DD",X"36",X"00",X"01",X"DD",X"23",X"1C",X"DD",X"36",X"00",X"01",X"DD",X"23", + X"1C",X"DD",X"36",X"00",X"01",X"DD",X"23",X"1C",X"CD",X"ED",X"14",X"DD",X"21",X"2F",X"41",X"4F", + X"06",X"00",X"DD",X"09",X"DD",X"7E",X"00",X"32",X"4C",X"40",X"C9",X"AF",X"32",X"2E",X"41",X"C5", + X"D1",X"79",X"FE",X"00",X"28",X"0F",X"0D",X"CD",X"F8",X"0B",X"30",X"09",X"06",X"01",X"3A",X"2E", + X"41",X"B0",X"32",X"2E",X"41",X"D5",X"C1",X"79",X"FE",X"0C",X"28",X"0F",X"0C",X"CD",X"F8",X"0B", + X"30",X"09",X"06",X"02",X"3A",X"2E",X"41",X"B0",X"32",X"2E",X"41",X"D5",X"C1",X"78",X"FE",X"00", + X"28",X"0F",X"05",X"CD",X"F8",X"0B",X"30",X"09",X"06",X"04",X"3A",X"2E",X"41",X"B0",X"32",X"2E", + X"41",X"D5",X"C1",X"78",X"FE",X"0B",X"28",X"0F",X"04",X"CD",X"F8",X"0B",X"30",X"09",X"06",X"08", + X"3A",X"2E",X"41",X"B0",X"32",X"2E",X"41",X"C9",X"CD",X"6F",X"05",X"DD",X"7E",X"00",X"FE",X"01", + X"28",X"17",X"FE",X"09",X"28",X"13",X"FE",X"0A",X"28",X"0F",X"FE",X"08",X"28",X"0B",X"FE",X"0B", + X"28",X"07",X"FE",X"0C",X"28",X"03",X"37",X"3F",X"C9",X"37",X"C9",X"AF",X"32",X"50",X"58",X"32", + X"54",X"58",X"32",X"58",X"58",X"3E",X"00",X"21",X"5A",X"1E",X"CD",X"70",X"1C",X"3A",X"4D",X"40", + X"B7",X"28",X"07",X"AF",X"32",X"5C",X"58",X"32",X"4D",X"40",X"06",X"04",X"0E",X"24",X"79",X"32", + X"41",X"58",X"3E",X"1C",X"CD",X"D5",X"0C",X"0C",X"10",X"F4",X"AF",X"32",X"40",X"58",X"3E",X"1E", + X"CD",X"D5",X"0C",X"3A",X"45",X"40",X"B7",X"C2",X"2F",X"11",X"3A",X"37",X"40",X"3D",X"32",X"37", + X"40",X"CD",X"B1",X"02",X"CD",X"87",X"13",X"3A",X"37",X"40",X"B7",X"CA",X"57",X"1B",X"CD",X"F1", + X"02",X"C3",X"84",X"01",X"06",X"0A",X"3A",X"40",X"58",X"32",X"50",X"40",X"78",X"E6",X"01",X"28", + X"0B",X"3A",X"50",X"40",X"32",X"40",X"58",X"CD",X"A1",X"0C",X"18",X"07",X"AF",X"32",X"40",X"58", + X"CD",X"BD",X"0C",X"3E",X"0F",X"CD",X"D5",X"0C",X"10",X"E2",X"3A",X"50",X"40",X"32",X"40",X"58", + X"C9",X"C5",X"3A",X"30",X"40",X"B7",X"28",X"09",X"01",X"00",X"18",X"DD",X"21",X"CB",X"14",X"18", + X"07",X"01",X"00",X"01",X"DD",X"21",X"C7",X"14",X"CD",X"0D",X"0D",X"C1",X"C9",X"C5",X"3A",X"30", + X"40",X"B7",X"28",X"05",X"01",X"00",X"18",X"18",X"03",X"01",X"00",X"01",X"DD",X"21",X"CF",X"14", + X"CD",X"0D",X"0D",X"C1",X"C9",X"C5",X"47",X"AF",X"32",X"35",X"40",X"3A",X"00",X"78",X"3A",X"35", + X"40",X"B8",X"38",X"F7",X"C1",X"C9",X"21",X"00",X"50",X"06",X"04",X"3E",X"10",X"77",X"2C",X"20", + X"FC",X"24",X"10",X"F7",X"C9",X"21",X"00",X"50",X"06",X"04",X"7D",X"E6",X"1F",X"28",X"07",X"FE", + X"01",X"28",X"03",X"3E",X"10",X"77",X"2C",X"20",X"F1",X"24",X"10",X"EE",X"C9",X"21",X"A0",X"53", + X"11",X"E0",X"FF",X"78",X"FE",X"00",X"28",X"03",X"19",X"10",X"FD",X"09",X"DD",X"7E",X"00",X"B7", + X"C8",X"FE",X"20",X"20",X"04",X"3E",X"10",X"18",X"0E",X"FE",X"30",X"38",X"08",X"FE",X"39",X"30", + X"04",X"D6",X"30",X"18",X"02",X"D6",X"30",X"77",X"19",X"DD",X"23",X"18",X"DF",X"C5",X"F5",X"21", + X"A0",X"53",X"11",X"E0",X"FF",X"78",X"FE",X"00",X"28",X"03",X"19",X"10",X"FD",X"09",X"F1",X"FE", + X"20",X"20",X"04",X"3E",X"10",X"18",X"0E",X"FE",X"30",X"38",X"08",X"FE",X"39",X"30",X"04",X"D6", + X"30",X"18",X"02",X"D6",X"30",X"77",X"C1",X"C9",X"C5",X"F5",X"21",X"A0",X"53",X"11",X"E0",X"FF", + X"78",X"FE",X"00",X"28",X"03",X"19",X"10",X"FD",X"09",X"F1",X"77",X"C1",X"C9",X"01",X"01",X"00", + X"3A",X"30",X"40",X"B7",X"28",X"03",X"01",X"01",X"16",X"3A",X"3F",X"40",X"CD",X"DE",X"0D",X"04", + X"04",X"3A",X"3E",X"40",X"CD",X"DE",X"0D",X"04",X"04",X"3A",X"3D",X"40",X"CD",X"DE",X"0D",X"C9", + X"3A",X"06",X"40",X"01",X"01",X"0B",X"CD",X"DE",X"0D",X"01",X"01",X"0D",X"3A",X"05",X"40",X"CD", + X"DE",X"0D",X"01",X"01",X"0F",X"3A",X"04",X"40",X"CD",X"DE",X"0D",X"C9",X"F5",X"C5",X"37",X"3F", + X"47",X"3A",X"3D",X"40",X"80",X"27",X"32",X"3D",X"40",X"3A",X"3E",X"40",X"CE",X"00",X"27",X"32", + X"3E",X"40",X"3A",X"3F",X"40",X"CE",X"00",X"27",X"32",X"3F",X"40",X"C1",X"F1",X"C9",X"C5",X"F5", + X"21",X"A0",X"53",X"11",X"E0",X"FF",X"78",X"FE",X"00",X"28",X"03",X"19",X"10",X"FD",X"09",X"F1", + X"F5",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"77",X"11",X"E0",X"FF",X"19",X"F1",X"E6", + X"0F",X"77",X"C1",X"C9",X"F5",X"21",X"A0",X"53",X"11",X"E0",X"FF",X"78",X"FE",X"00",X"28",X"03", + X"19",X"10",X"FD",X"09",X"F1",X"DD",X"21",X"3C",X"0E",X"CB",X"27",X"CB",X"27",X"4F",X"06",X"00", + X"DD",X"09",X"DD",X"7E",X"00",X"77",X"23",X"DD",X"23",X"DD",X"7E",X"00",X"77",X"19",X"DD",X"23", + X"DD",X"7E",X"00",X"77",X"2B",X"DD",X"23",X"DD",X"7E",X"00",X"77",X"C9",X"10",X"10",X"10",X"10", + X"2E",X"2F",X"2D",X"2C",X"A0",X"A3",X"A0",X"A3",X"36",X"37",X"35",X"34",X"3A",X"3B",X"39",X"38", + X"3E",X"3F",X"3D",X"3C",X"42",X"43",X"41",X"40",X"46",X"47",X"45",X"44",X"4A",X"4B",X"49",X"48", + X"4E",X"2F",X"2D",X"4C",X"2E",X"4F",X"4D",X"2C",X"6A",X"2F",X"2D",X"68",X"2E",X"6B",X"69",X"2C", + X"6E",X"6F",X"6D",X"6C",X"72",X"73",X"71",X"70",X"72",X"73",X"71",X"70",X"52",X"53",X"51",X"50", + X"56",X"57",X"55",X"54",X"5A",X"5B",X"59",X"58",X"BA",X"BB",X"B9",X"B8",X"BE",X"BF",X"BD",X"BC", + X"C2",X"C3",X"D5",X"C0",X"C6",X"C7",X"C5",X"C4",X"CA",X"CB",X"C9",X"C8",X"CE",X"CF",X"CD",X"CC", + X"D2",X"D3",X"D1",X"D0",X"D6",X"D7",X"D5",X"D4",X"DA",X"DB",X"D9",X"D8",X"DE",X"DF",X"DD",X"DC", + X"32",X"33",X"31",X"30",X"FA",X"FB",X"F9",X"F8",X"21",X"B8",X"23",X"B7",X"28",X"07",X"47",X"11", + X"52",X"00",X"19",X"10",X"FD",X"7E",X"32",X"53",X"40",X"23",X"7E",X"32",X"54",X"40",X"23",X"7E", + X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"C6",X"20",X"32",X"40",X"40",X"23",X"7E",X"CB", + X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"C6",X"20",X"32",X"41",X"40",X"23",X"06",X"0D",X"11", + X"5C",X"40",X"C5",X"06",X"06",X"7E",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"12",X"13", + X"7E",X"E6",X"0F",X"12",X"13",X"23",X"10",X"ED",X"C1",X"13",X"13",X"13",X"13",X"10",X"E3",X"06", + X"1A",X"AF",X"11",X"09",X"58",X"12",X"13",X"13",X"10",X"FB",X"11",X"10",X"00",X"DD",X"21",X"5C", + X"40",X"FD",X"21",X"09",X"58",X"06",X"0D",X"DD",X"7E",X"00",X"FE",X"07",X"20",X"12",X"3E",X"05", + X"FD",X"77",X"00",X"FD",X"23",X"FD",X"23",X"FD",X"77",X"00",X"FD",X"23",X"FD",X"23",X"18",X"08", + X"FD",X"23",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"DD",X"19",X"10",X"DB",X"AF",X"32",X"44",X"40", + X"06",X"D0",X"DD",X"21",X"5C",X"40",X"DD",X"7E",X"00",X"FE",X"0F",X"CC",X"76",X"0F",X"FE",X"03", + X"28",X"08",X"FE",X"04",X"28",X"04",X"FE",X"05",X"20",X"07",X"3A",X"44",X"40",X"3C",X"32",X"44", + X"40",X"DD",X"23",X"10",X"E1",X"C9",X"3E",X"D0",X"90",X"4F",X"E6",X"F0",X"CB",X"3F",X"CB",X"3F", + X"CB",X"3F",X"C6",X"04",X"32",X"48",X"40",X"79",X"E6",X"0F",X"CB",X"27",X"C6",X"02",X"32",X"47", + X"40",X"AF",X"C9",X"3A",X"34",X"40",X"B7",X"28",X"08",X"47",X"C5",X"CD",X"A2",X"0F",X"C1",X"10", + X"F9",X"C9",X"3A",X"54",X"40",X"B7",X"28",X"06",X"3D",X"32",X"54",X"40",X"18",X"05",X"3E",X"07", + X"32",X"53",X"40",X"C9",X"DD",X"21",X"5C",X"40",X"01",X"04",X"02",X"DD",X"7E",X"00",X"C5",X"DD", + X"E5",X"CD",X"04",X"0E",X"DD",X"E1",X"C1",X"DD",X"23",X"04",X"04",X"78",X"FE",X"1A",X"20",X"EB", + X"06",X"02",X"0C",X"0C",X"DD",X"23",X"DD",X"23",X"DD",X"23",X"DD",X"23",X"79",X"FE",X"1E",X"20", + X"DA",X"C9",X"3E",X"94",X"32",X"41",X"58",X"3E",X"01",X"32",X"42",X"58",X"3A",X"45",X"40",X"B7", + X"28",X"05",X"CD",X"98",X"10",X"18",X"03",X"CD",X"7B",X"10",X"3A",X"53",X"40",X"E6",X"01",X"28", + X"19",X"3E",X"10",X"32",X"44",X"58",X"3E",X"1D",X"32",X"45",X"58",X"3E",X"01",X"32",X"46",X"58", + X"3E",X"20",X"32",X"47",X"58",X"3E",X"01",X"32",X"56",X"40",X"3A",X"53",X"40",X"E6",X"02",X"28", + X"19",X"3E",X"E0",X"32",X"48",X"58",X"3E",X"9D",X"32",X"49",X"58",X"3E",X"01",X"32",X"4A",X"58", + X"3E",X"E0",X"32",X"4B",X"58",X"3E",X"FF",X"32",X"58",X"40",X"3A",X"53",X"40",X"E6",X"04",X"28", + X"19",X"3E",X"D0",X"32",X"4C",X"58",X"3E",X"61",X"32",X"4D",X"58",X"3E",X"01",X"32",X"4E",X"58", + X"3E",X"10",X"32",X"4F",X"58",X"3E",X"FF",X"32",X"5A",X"40",X"AF",X"32",X"50",X"58",X"32",X"54", + X"58",X"32",X"58",X"58",X"3E",X"02",X"32",X"52",X"58",X"32",X"56",X"58",X"32",X"5A",X"58",X"3E", + X"23",X"32",X"51",X"58",X"32",X"55",X"58",X"32",X"59",X"58",X"C9",X"3E",X"58",X"32",X"5C",X"58", + X"3E",X"EF",X"32",X"5F",X"58",X"3E",X"38",X"32",X"5D",X"58",X"3E",X"04",X"32",X"5E",X"58",X"3E", + X"01",X"32",X"4C",X"40",X"32",X"3B",X"40",X"C9",X"3E",X"90",X"32",X"5C",X"58",X"21",X"B6",X"10", + X"3A",X"3C",X"40",X"4F",X"06",X"00",X"09",X"7E",X"32",X"5F",X"58",X"3E",X"14",X"32",X"5D",X"58", + X"3E",X"01",X"32",X"5E",X"58",X"C9",X"B0",X"70",X"30",X"AF",X"32",X"5C",X"58",X"CD",X"94",X"1C", + X"06",X"04",X"C5",X"AF",X"32",X"3A",X"40",X"CD",X"DC",X"13",X"3E",X"14",X"CD",X"D5",X"0C",X"3E", + X"1F",X"32",X"3A",X"40",X"CD",X"DC",X"13",X"3E",X"14",X"CD",X"D5",X"0C",X"C1",X"10",X"E3",X"CD", + X"ED",X"11",X"CD",X"D3",X"11",X"01",X"0B",X"08",X"DD",X"21",X"FB",X"11",X"CD",X"0D",X"0D",X"01", + X"0E",X"04",X"DD",X"21",X"07",X"12",X"CD",X"0D",X"0D",X"3E",X"04",X"32",X"1D",X"58",X"01",X"12", + X"09",X"DD",X"21",X"1C",X"12",X"CD",X"0D",X"0D",X"3E",X"C8",X"CD",X"D5",X"0C",X"AF",X"32",X"1D", + X"58",X"32",X"35",X"40",X"32",X"3A",X"40",X"CD",X"DC",X"13",X"3E",X"01",X"32",X"45",X"40",X"AF", + X"32",X"46",X"40",X"21",X"90",X"27",X"CD",X"C5",X"0E",X"CD",X"B4",X"0F",X"C3",X"84",X"01",X"CD", + X"D3",X"11",X"CD",X"ED",X"11",X"01",X"0B",X"05",X"DD",X"21",X"26",X"12",X"CD",X"0D",X"0D",X"3A", + X"44",X"40",X"B7",X"28",X"1A",X"47",X"AF",X"37",X"3F",X"3C",X"27",X"10",X"FC",X"01",X"0E",X"04", + X"CD",X"DE",X"0D",X"01",X"0E",X"07",X"DD",X"21",X"38",X"12",X"CD",X"0D",X"0D",X"18",X"21",X"01", + X"0E",X"04",X"DD",X"21",X"4A",X"12",X"CD",X"0D",X"0D",X"3A",X"3E",X"40",X"37",X"3F",X"C6",X"10", + X"27",X"32",X"3E",X"40",X"3A",X"3F",X"40",X"CE",X"00",X"27",X"32",X"3F",X"40",X"CD",X"7D",X"0D", + X"3A",X"46",X"40",X"B7",X"20",X"0C",X"01",X"12",X"07",X"DD",X"21",X"71",X"12",X"CD",X"0D",X"0D", + X"18",X"0A",X"01",X"12",X"05",X"DD",X"21",X"5E",X"12",X"CD",X"0D",X"0D",X"3E",X"F0",X"CD",X"D5", + X"0C",X"AF",X"32",X"45",X"40",X"32",X"46",X"40",X"3A",X"3C",X"40",X"FE",X"02",X"28",X"04",X"3C", + X"32",X"3C",X"40",X"C3",X"49",X"02",X"3A",X"45",X"40",X"B7",X"C8",X"CD",X"E3",X"09",X"D0",X"3E", + X"01",X"32",X"46",X"40",X"AF",X"32",X"5C",X"58",X"3A",X"37",X"40",X"3C",X"32",X"37",X"40",X"CD", + X"87",X"13",X"C9",X"01",X"04",X"02",X"AF",X"C5",X"CD",X"04",X"0E",X"C1",X"04",X"04",X"78",X"FE", + X"1A",X"20",X"F3",X"06",X"02",X"0C",X"0C",X"79",X"FE",X"1E",X"20",X"EA",X"C9",X"AF",X"01",X"1F", + X"00",X"21",X"40",X"58",X"11",X"41",X"58",X"77",X"ED",X"B0",X"C9",X"42",X"4F",X"4E",X"55",X"53", + X"20",X"52",X"4F",X"55",X"4E",X"44",X"00",X"45",X"58",X"54",X"52",X"41",X"20",X"4C",X"49",X"46", + X"45",X"20",X"43",X"48",X"41",X"4C",X"4C",X"45",X"4E",X"47",X"45",X"00",X"47",X"45",X"54",X"20", + X"52",X"45",X"41",X"44",X"59",X"00",X"42",X"4F",X"4E",X"55",X"53",X"20",X"52",X"4F",X"55",X"4E", + X"44",X"20",X"53",X"54",X"41",X"54",X"53",X"00",X"43",X"48",X"45",X"52",X"52",X"49",X"45",X"53", + X"20",X"52",X"45",X"4D",X"41",X"49",X"4E",X"45",X"44",X"00",X"42",X"4F",X"4E",X"55",X"53",X"20", + X"43",X"4F",X"4D",X"50",X"4C",X"45",X"54",X"45",X"20",X"31",X"30",X"30",X"30",X"00",X"52",X"45", + X"43",X"45",X"49",X"56",X"45",X"20",X"42",X"4F",X"4E",X"55",X"53",X"20",X"4C",X"49",X"46",X"45", + X"00",X"4E",X"4F",X"20",X"42",X"4F",X"4E",X"55",X"53",X"20",X"4C",X"49",X"46",X"45",X"00",X"3A", + X"4A",X"40",X"B7",X"28",X"0D",X"FE",X"01",X"28",X"20",X"FE",X"02",X"28",X"2E",X"FE",X"03",X"28", + X"3E",X"C9",X"3A",X"47",X"40",X"47",X"3A",X"48",X"40",X"4F",X"3E",X"1D",X"CD",X"04",X"0E",X"AF", + X"32",X"49",X"40",X"3C",X"32",X"4A",X"40",X"18",X"E8",X"3A",X"49",X"40",X"3C",X"32",X"49",X"40", + X"FE",X"3C",X"20",X"DD",X"3E",X"02",X"32",X"4A",X"40",X"18",X"D6",X"3A",X"47",X"40",X"47",X"3A", + X"48",X"40",X"4F",X"3E",X"1E",X"CD",X"04",X"0E",X"3E",X"03",X"32",X"4A",X"40",X"18",X"C2",X"3A", + X"40",X"58",X"E6",X"0F",X"20",X"BB",X"3A",X"43",X"58",X"E6",X"0F",X"20",X"B4",X"CD",X"25",X"05", + X"7E",X"FE",X"0F",X"20",X"AC",X"AF",X"CD",X"94",X"1C",X"3E",X"3C",X"CD",X"D5",X"0C",X"3E",X"04", + X"32",X"4A",X"40",X"18",X"9C",X"CD",X"E6",X"0C",X"DD",X"21",X"3F",X"13",X"CD",X"73",X"13",X"01", + X"00",X"01",X"DD",X"21",X"C7",X"14",X"CD",X"0D",X"0D",X"01",X"00",X"09",X"DD",X"21",X"D3",X"14", + X"CD",X"0D",X"0D",X"3A",X"2F",X"40",X"B7",X"28",X"16",X"01",X"00",X"18",X"DD",X"21",X"CB",X"14", + X"CD",X"0D",X"0D",X"3E",X"01",X"32",X"30",X"40",X"CD",X"7D",X"0D",X"AF",X"32",X"30",X"40",X"CD", + X"7D",X"0D",X"CD",X"A0",X"0D",X"CD",X"DC",X"13",X"CD",X"87",X"13",X"CD",X"5F",X"13",X"C9",X"00", + X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01", + X"1E",X"17",X"DD",X"21",X"DE",X"14",X"CD",X"0D",X"0D",X"01",X"1F",X"1A",X"3A",X"32",X"40",X"CD", + X"DE",X"0D",X"C9",X"C5",X"E5",X"21",X"01",X"58",X"06",X"20",X"DD",X"7E",X"00",X"77",X"23",X"23", + X"DD",X"23",X"10",X"F6",X"E1",X"C1",X"C9",X"16",X"00",X"D5",X"7A",X"CB",X"27",X"47",X"0E",X"1E", + X"3A",X"37",X"40",X"B7",X"28",X"08",X"3D",X"BA",X"28",X"04",X"38",X"02",X"18",X"04",X"3E",X"00", + X"18",X"0F",X"3A",X"38",X"40",X"DD",X"21",X"D8",X"13",X"16",X"00",X"5F",X"DD",X"19",X"DD",X"7E", + X"00",X"CD",X"04",X"0E",X"D1",X"14",X"7A",X"FE",X"04",X"20",X"CE",X"C9",X"3A",X"39",X"40",X"3C", + X"32",X"39",X"40",X"FE",X"0F",X"38",X"10",X"AF",X"32",X"39",X"40",X"3A",X"38",X"40",X"3C",X"E6", + X"03",X"32",X"38",X"40",X"CD",X"87",X"13",X"C9",X"11",X"12",X"11",X"10",X"3A",X"3A",X"40",X"CB", + X"47",X"20",X"04",X"3E",X"13",X"18",X"02",X"3E",X"18",X"01",X"1E",X"09",X"CD",X"04",X"0E",X"3A", + X"3A",X"40",X"CB",X"4F",X"20",X"04",X"3E",X"14",X"18",X"02",X"3E",X"19",X"01",X"1E",X"0B",X"CD", + X"04",X"0E",X"3A",X"3A",X"40",X"CB",X"57",X"20",X"04",X"3E",X"15",X"18",X"02",X"3E",X"1A",X"01", + X"1E",X"0D",X"CD",X"04",X"0E",X"3A",X"3A",X"40",X"CB",X"5F",X"20",X"04",X"3E",X"16",X"18",X"02", + X"3E",X"1B",X"01",X"1E",X"0F",X"CD",X"04",X"0E",X"3A",X"3A",X"40",X"CB",X"67",X"20",X"04",X"3E", + X"17",X"18",X"02",X"3E",X"1C",X"01",X"1E",X"11",X"CD",X"04",X"0E",X"C9",X"00",X"50",X"00",X"49", + X"56",X"41",X"4E",X"20",X"00",X"30",X"00",X"4D",X"49",X"4B",X"45",X"20",X"00",X"20",X"00",X"4D", + X"52",X"20",X"44",X"4F",X"00",X"10",X"00",X"4D",X"52",X"20",X"58",X"20",X"00",X"00",X"00",X"48", + X"45",X"4E",X"43",X"48",X"01",X"28",X"00",X"21",X"3C",X"14",X"11",X"04",X"40",X"ED",X"B0",X"C9", + X"3A",X"00",X"60",X"E6",X"20",X"FE",X"20",X"20",X"05",X"3E",X"01",X"32",X"2D",X"40",X"3A",X"00", + X"68",X"E6",X"C0",X"FE",X"C0",X"20",X"05",X"3E",X"01",X"32",X"2C",X"40",X"3A",X"00",X"70",X"E6", + X"01",X"FE",X"01",X"20",X"05",X"3E",X"01",X"32",X"2E",X"40",X"C9",X"AF",X"DD",X"77",X"00",X"DD", + X"23",X"DD",X"E5",X"C1",X"3A",X"00",X"78",X"78",X"FE",X"43",X"20",X"EF",X"C9",X"DD",X"21",X"30", + X"40",X"18",X"E8",X"DD",X"21",X"00",X"40",X"18",X"E2",X"AF",X"01",X"EF",X"00",X"21",X"40",X"40", + X"11",X"41",X"40",X"77",X"ED",X"B0",X"C9",X"31",X"53",X"54",X"00",X"32",X"4E",X"44",X"00",X"20", + X"20",X"20",X"00",X"48",X"49",X"47",X"48",X"20",X"53",X"43",X"4F",X"52",X"45",X"00",X"53",X"43", + X"45",X"4E",X"45",X"00",X"3A",X"00",X"40",X"E6",X"3F",X"32",X"59",X"43",X"C9",X"DD",X"21",X"0B", + X"15",X"3A",X"59",X"43",X"06",X"00",X"4F",X"DD",X"09",X"DD",X"7E",X"00",X"47",X"93",X"30",X"FC", + X"3A",X"59",X"43",X"3C",X"E6",X"3F",X"32",X"59",X"43",X"78",X"C9",X"44",X"41",X"6A",X"B1",X"8D", + X"5F",X"AF",X"C5",X"CE",X"DB",X"2C",X"13",X"B7",X"39",X"A3",X"4C",X"D2",X"8E",X"B4",X"90",X"17", + X"8C",X"3E",X"89",X"09",X"5A",X"20",X"C6",X"EF",X"5A",X"A0",X"BC",X"80",X"22",X"0A",X"5B",X"19", + X"97",X"D6",X"A7",X"74",X"D9",X"C8",X"B3",X"49",X"13",X"CC",X"0C",X"61",X"E9",X"A4",X"DC",X"2E", + X"49",X"56",X"90",X"84",X"1A",X"9F",X"80",X"00",X"0F",X"D0",X"17",X"00",X"03",X"00",X"00",X"01", + X"01",X"01",X"01",X"00",X"07",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"06",X"CD",X"E6",X"0C",X"3E",X"00", + X"32",X"03",X"40",X"AF",X"CD",X"94",X"1C",X"DD",X"21",X"4B",X"15",X"CD",X"73",X"13",X"01",X"00", + X"09",X"DD",X"21",X"D3",X"14",X"CD",X"0D",X"0D",X"CD",X"A0",X"0D",X"01",X"00",X"01",X"DD",X"21", + X"C7",X"14",X"CD",X"0D",X"0D",X"AF",X"32",X"30",X"40",X"CD",X"D9",X"02",X"CD",X"7D",X"0D",X"3A", + X"2F",X"40",X"B7",X"28",X"15",X"01",X"00",X"18",X"DD",X"21",X"CB",X"14",X"CD",X"0D",X"0D",X"3E", + X"01",X"32",X"30",X"40",X"CD",X"E5",X"02",X"CD",X"7D",X"0D",X"01",X"04",X"08",X"DD",X"21",X"E3", + X"16",X"DD",X"7E",X"00",X"CD",X"68",X"0D",X"04",X"DD",X"23",X"78",X"FE",X"14",X"20",X"F2",X"06", + X"08",X"0C",X"79",X"FE",X"08",X"20",X"EA",X"01",X"09",X"0A",X"DD",X"21",X"13",X"17",X"CD",X"0D", + X"0D",X"01",X"1F",X"00",X"DD",X"21",X"8D",X"16",X"3A",X"2C",X"40",X"B7",X"28",X"04",X"DD",X"21", + X"95",X"16",X"CD",X"0D",X"0D",X"CD",X"1D",X"17",X"01",X"1D",X"02",X"DD",X"21",X"B6",X"16",X"CD", + X"0D",X"0D",X"AF",X"32",X"5A",X"43",X"32",X"5B",X"43",X"3A",X"00",X"68",X"CB",X"47",X"28",X"17", + X"3A",X"2C",X"40",X"B7",X"20",X"0B",X"3A",X"01",X"40",X"B7",X"28",X"2A",X"3D",X"27",X"32",X"01", + X"40",X"AF",X"32",X"2F",X"40",X"18",X"2C",X"CB",X"4F",X"28",X"1B",X"3A",X"2C",X"40",X"B7",X"20", + X"0E",X"3A",X"01",X"40",X"FE",X"02",X"38",X"0E",X"3D",X"27",X"3D",X"27",X"32",X"01",X"40",X"3E", + X"01",X"32",X"2F",X"40",X"18",X"0D",X"3E",X"01",X"CD",X"D5",X"0C",X"CD",X"34",X"17",X"CD",X"72", + X"17",X"18",X"B6",X"3E",X"01",X"32",X"03",X"40",X"C9",X"50",X"52",X"45",X"53",X"53",X"20",X"31", + X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"53",X"54",X"41",X"52",X"54",X"20",X"4F",X"4E", + X"4C",X"59",X"00",X"50",X"52",X"45",X"53",X"53",X"20",X"31",X"20",X"4F",X"52",X"20",X"32",X"20", + X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"53",X"54",X"41",X"52",X"54",X"00",X"43",X"52",X"45", + X"44",X"49",X"54",X"53",X"00",X"46",X"52",X"45",X"45",X"50",X"4C",X"41",X"59",X"00",X"49",X"4E", + X"53",X"45",X"52",X"54",X"20",X"43",X"4F",X"49",X"4E",X"00",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"00",X"41",X"20",X"4B",X"52",X"41",X"5A",X"59",X"20",X"49",X"56", + X"41",X"4E",X"20",X"50",X"52",X"4F",X"44",X"55",X"43",X"54",X"49",X"4F",X"4E",X"00",X"48",X"20", + X"49",X"20",X"47",X"20",X"48",X"20",X"20",X"53",X"20",X"43",X"20",X"4F",X"20",X"52",X"20",X"45", + X"20",X"53",X"00",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"10",X"A1",X"A2",X"10",X"A4", + X"A5",X"A6",X"A7",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"B0",X"B1",X"B2",X"B3",X"B4", + X"B5",X"B6",X"B7",X"EC",X"ED",X"EE",X"EF",X"10",X"10",X"10",X"F0",X"F1",X"F2",X"F3",X"F4",X"F5", + X"F6",X"F7",X"C1",X"4E",X"49",X"47",X"48",X"54",X"4D",X"41",X"52",X"45",X"00",X"3A",X"2C",X"40", + X"B7",X"20",X"10",X"3A",X"03",X"40",X"FE",X"00",X"20",X"09",X"3A",X"01",X"40",X"01",X"1F",X"08", + X"CD",X"DE",X"0D",X"C9",X"3A",X"5A",X"43",X"3C",X"32",X"5A",X"43",X"3A",X"2C",X"40",X"B7",X"3E", + X"02",X"20",X"1C",X"3A",X"01",X"40",X"B7",X"20",X"16",X"DD",X"21",X"9E",X"16",X"3A",X"5A",X"43", + X"E6",X"20",X"28",X"04",X"DD",X"21",X"AA",X"16",X"01",X"0B",X"09",X"CD",X"0D",X"0D",X"C9",X"DD", + X"21",X"59",X"16",X"FE",X"01",X"28",X"04",X"DD",X"21",X"73",X"16",X"01",X"0B",X"02",X"CD",X"0D", + X"0D",X"C9",X"3A",X"5B",X"43",X"B7",X"CA",X"FC",X"18",X"FE",X"01",X"CA",X"65",X"19",X"FE",X"02", + X"CA",X"7C",X"19",X"FE",X"03",X"CA",X"CB",X"19",X"FE",X"04",X"CA",X"65",X"19",X"FE",X"05",X"CA", + X"7C",X"19",X"FE",X"06",X"CA",X"E4",X"19",X"FE",X"07",X"CA",X"65",X"19",X"FE",X"08",X"CA",X"7C", + X"19",X"FE",X"09",X"CA",X"FD",X"19",X"FE",X"0A",X"CA",X"16",X"1A",X"FE",X"0B",X"CA",X"7C",X"19", + X"FE",X"0C",X"CA",X"56",X"1A",X"FE",X"0D",X"CA",X"65",X"19",X"FE",X"0E",X"CA",X"7C",X"19",X"FE", + X"0F",X"CA",X"71",X"1A",X"FE",X"10",X"CA",X"65",X"19",X"FE",X"11",X"CA",X"7E",X"1A",X"FE",X"12", + X"CA",X"65",X"19",X"FE",X"13",X"CA",X"7E",X"1A",X"FE",X"14",X"CA",X"65",X"19",X"FE",X"15",X"CA", + X"7E",X"1A",X"FE",X"16",X"CA",X"65",X"19",X"FE",X"17",X"CA",X"91",X"1A",X"FE",X"18",X"CA",X"65", + X"19",X"FE",X"19",X"CA",X"C1",X"1A",X"FE",X"1A",X"CA",X"99",X"1A",X"FE",X"1B",X"CA",X"65",X"19", + X"FE",X"1C",X"CA",X"E2",X"1A",X"C9",X"49",X"4E",X"53",X"54",X"52",X"55",X"43",X"54",X"49",X"4F", + X"4E",X"53",X"00",X"43",X"4F",X"4C",X"4C",X"45",X"43",X"54",X"20",X"43",X"48",X"45",X"52",X"52", + X"49",X"45",X"53",X"20",X"46",X"4F",X"52",X"20",X"32",X"30",X"20",X"00",X"20",X"43",X"4F",X"4C", + X"4C",X"45",X"43",X"54",X"20",X"41",X"50",X"50",X"4C",X"45",X"53",X"20",X"46",X"4F",X"52",X"20", + X"33",X"30",X"20",X"20",X"00",X"20",X"44",X"49",X"41",X"4D",X"4F",X"4E",X"44",X"53",X"20",X"52", + X"45",X"4C",X"45",X"41",X"53",X"45",X"20",X"4D",X"52",X"20",X"58",X"20",X"20",X"00",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"43",X"41",X"54",X"43",X"48",X"20",X"4D",X"52",X"20",X"58",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"41",X"56",X"4F", + X"49",X"44",X"20",X"44",X"45",X"41",X"54",X"48",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"00", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"0D",X"0D",X"0D",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"03",X"01",X"04",X"01",X"05",X"01",X"06",X"01",X"06",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"0E",X"0E",X"0E",X"01",X"0E",X"02",X"DD",X"21",X"90",X"18",X"DD",X"E5",X"C5",X"CD", + X"0D",X"0D",X"C1",X"DD",X"E1",X"0C",X"79",X"FE",X"1C",X"20",X"F1",X"C9",X"3E",X"01",X"32",X"5B", + X"43",X"DD",X"21",X"4B",X"15",X"CD",X"73",X"13",X"CD",X"E5",X"18",X"DD",X"21",X"06",X"18",X"01", + X"0E",X"08",X"CD",X"0D",X"0D",X"01",X"12",X"02",X"DD",X"21",X"A9",X"18",X"C5",X"DD",X"E5",X"DD", + X"7E",X"00",X"CD",X"04",X"0E",X"DD",X"E1",X"C1",X"DD",X"23",X"04",X"04",X"78",X"FE",X"1A",X"20", + X"EB",X"06",X"02",X"0C",X"0C",X"79",X"FE",X"1C",X"20",X"E2",X"DD",X"21",X"13",X"18",X"01",X"10", + X"02",X"CD",X"0D",X"0D",X"3E",X"20",X"32",X"40",X"58",X"3E",X"B0",X"32",X"43",X"58",X"3E",X"01", + X"32",X"42",X"58",X"3E",X"94",X"32",X"41",X"58",X"3E",X"20",X"32",X"5C",X"43",X"3E",X"3C",X"32", + X"5D",X"43",X"C3",X"05",X"18",X"3A",X"5D",X"43",X"B7",X"28",X"07",X"3D",X"32",X"5D",X"43",X"C3", + X"05",X"18",X"3A",X"5B",X"43",X"3C",X"32",X"5B",X"43",X"C3",X"05",X"18",X"3A",X"5C",X"43",X"B7", + X"28",X"23",X"3D",X"32",X"5C",X"43",X"3A",X"40",X"58",X"3C",X"32",X"40",X"58",X"E6",X"0F",X"DD", + X"21",X"CC",X"03",X"4F",X"06",X"00",X"DD",X"09",X"DD",X"7E",X"00",X"4F",X"3E",X"94",X"81",X"32", + X"41",X"58",X"C3",X"05",X"18",X"3A",X"5B",X"43",X"3C",X"32",X"5B",X"43",X"C3",X"05",X"18",X"3A", + X"40",X"58",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"D6",X"02",X"47",X"3A",X"43",X"58",X"CB",X"3F", + X"CB",X"3F",X"CB",X"3F",X"4F",X"3E",X"01",X"CD",X"04",X"0E",X"C9",X"CD",X"AF",X"19",X"DD",X"21", + X"2C",X"18",X"01",X"10",X"02",X"CD",X"0D",X"0D",X"3E",X"20",X"32",X"5C",X"43",X"3E",X"78",X"32", + X"5D",X"43",X"18",X"C1",X"CD",X"AF",X"19",X"DD",X"21",X"45",X"18",X"01",X"10",X"02",X"CD",X"0D", + X"0D",X"3E",X"20",X"32",X"5C",X"43",X"3E",X"78",X"32",X"5D",X"43",X"18",X"A8",X"CD",X"AF",X"19", + X"DD",X"21",X"5E",X"18",X"01",X"10",X"02",X"CD",X"0D",X"0D",X"3E",X"18",X"32",X"5C",X"43",X"3E", + X"20",X"32",X"5D",X"43",X"18",X"8F",X"3A",X"5A",X"43",X"E6",X"08",X"28",X"0F",X"3E",X"06",X"01", + X"16",X"12",X"CD",X"04",X"0E",X"AF",X"32",X"5C",X"58",X"C3",X"05",X"18",X"3E",X"01",X"01",X"16", + X"12",X"CD",X"04",X"0E",X"3E",X"A0",X"32",X"5C",X"58",X"3E",X"B0",X"32",X"5F",X"58",X"3E",X"39", + X"32",X"5D",X"58",X"3E",X"04",X"32",X"5E",X"58",X"3A",X"5D",X"43",X"B7",X"CA",X"A5",X"19",X"3D", + X"32",X"5D",X"43",X"C3",X"05",X"18",X"AF",X"32",X"5C",X"58",X"DD",X"21",X"77",X"18",X"01",X"10", + X"02",X"CD",X"0D",X"0D",X"3E",X"18",X"32",X"5C",X"43",X"3E",X"3C",X"32",X"5D",X"43",X"C3",X"A5", + X"19",X"3E",X"24",X"32",X"41",X"58",X"3E",X"1E",X"32",X"5D",X"43",X"C3",X"A5",X"19",X"3A",X"41", + X"58",X"FE",X"27",X"28",X"04",X"3C",X"32",X"41",X"58",X"3E",X"1E",X"32",X"5D",X"43",X"C3",X"A5", + X"19",X"3E",X"78",X"32",X"5D",X"43",X"C3",X"A5",X"19",X"3E",X"FF",X"32",X"5D",X"43",X"C3",X"A5", + X"19",X"00",X"03",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"07",X"00",X"04",X"00",X"00",X"00", + X"00",X"00",X"04",X"00",X"02",X"00",X"03",X"00",X"03",X"00",X"03",X"00",X"00",X"00",X"02",X"00", + X"06",X"AF",X"32",X"40",X"58",X"DD",X"21",X"A1",X"1A",X"CD",X"73",X"13",X"CD",X"E5",X"18",X"DD", + X"21",X"CE",X"16",X"01",X"0E",X"04",X"CD",X"0D",X"0D",X"01",X"11",X"06",X"CD",X"E9",X"1A",X"C3", + X"A5",X"19",X"AF",X"32",X"5B",X"43",X"C3",X"05",X"18",X"DD",X"21",X"04",X"40",X"16",X"01",X"D5", + X"7A",X"CD",X"68",X"0D",X"DD",X"23",X"DD",X"23",X"DD",X"7E",X"00",X"04",X"04",X"04",X"CD",X"DE", + X"0D",X"DD",X"2B",X"DD",X"7E",X"00",X"04",X"04",X"CD",X"DE",X"0D",X"DD",X"2B",X"DD",X"7E",X"00", + X"04",X"04",X"CD",X"DE",X"0D",X"DD",X"23",X"DD",X"23",X"DD",X"23",X"04",X"04",X"04",X"04",X"DD", + X"7E",X"00",X"CD",X"3D",X"0D",X"DD",X"23",X"04",X"DD",X"7E",X"00",X"CD",X"3D",X"0D",X"DD",X"23", + X"04",X"DD",X"7E",X"00",X"CD",X"3D",X"0D",X"DD",X"23",X"04",X"DD",X"7E",X"00",X"CD",X"3D",X"0D", + X"DD",X"23",X"04",X"DD",X"7E",X"00",X"CD",X"3D",X"0D",X"DD",X"23",X"0C",X"0C",X"06",X"06",X"D1", + X"14",X"7A",X"FE",X"06",X"20",X"99",X"C9",X"3A",X"31",X"40",X"3C",X"32",X"31",X"40",X"AF",X"01", + X"1F",X"00",X"21",X"40",X"58",X"11",X"41",X"58",X"77",X"ED",X"B0",X"3E",X"00",X"21",X"79",X"1E", + X"CD",X"70",X"1C",X"01",X"0E",X"05",X"DD",X"21",X"E7",X"1B",X"CD",X"0D",X"0D",X"01",X"0F",X"05", + X"DD",X"21",X"E7",X"1B",X"CD",X"0D",X"0D",X"01",X"10",X"05",X"DD",X"21",X"E7",X"1B",X"CD",X"0D", + X"0D",X"DD",X"21",X"D6",X"1B",X"01",X"0F",X"06",X"DD",X"7E",X"00",X"B7",X"28",X"13",X"DD",X"E5", + X"C5",X"CD",X"3D",X"0D",X"3E",X"0F",X"CD",X"D5",X"0C",X"C1",X"DD",X"E1",X"DD",X"23",X"04",X"18", + X"E7",X"3E",X"3C",X"CD",X"D5",X"0C",X"CD",X"8A",X"1F",X"3A",X"2F",X"40",X"B7",X"28",X"14",X"3A", + X"31",X"40",X"FE",X"01",X"20",X"0D",X"CD",X"F1",X"02",X"DD",X"21",X"3F",X"13",X"CD",X"73",X"13", + X"C3",X"84",X"01",X"C3",X"50",X"01",X"47",X"20",X"41",X"20",X"4D",X"20",X"45",X"20",X"20",X"4F", + X"20",X"56",X"20",X"45",X"20",X"52",X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"DD",X"21",X"5E",X"43",X"CD", + X"21",X"1C",X"B7",X"20",X"02",X"06",X"FF",X"3A",X"65",X"43",X"B7",X"28",X"07",X"DD",X"21",X"65", + X"43",X"CD",X"21",X"1C",X"3A",X"6C",X"43",X"B8",X"C8",X"78",X"32",X"00",X"78",X"32",X"6C",X"43", + X"C9",X"DD",X"7E",X"00",X"B7",X"28",X"40",X"DD",X"7E",X"05",X"B7",X"28",X"06",X"3D",X"DD",X"77", + X"05",X"18",X"39",X"DD",X"66",X"03",X"DD",X"6E",X"04",X"7E",X"DD",X"77",X"06",X"23",X"7E",X"23", + X"DD",X"74",X"03",X"DD",X"75",X"04",X"B7",X"28",X"05",X"DD",X"77",X"05",X"18",X"1E",X"DD",X"7E", + X"00",X"FE",X"FF",X"28",X"04",X"3D",X"DD",X"77",X"00",X"DD",X"66",X"01",X"DD",X"6E",X"02",X"DD", + X"74",X"03",X"DD",X"75",X"04",X"18",X"BA",X"3E",X"FF",X"DD",X"77",X"06",X"DD",X"46",X"06",X"C9", + X"CD",X"89",X"1C",X"7E",X"DD",X"77",X"00",X"23",X"DD",X"74",X"01",X"DD",X"75",X"02",X"DD",X"74", + X"03",X"DD",X"75",X"04",X"AF",X"DD",X"77",X"05",X"C9",X"DD",X"21",X"5E",X"43",X"B7",X"C8",X"DD", + X"21",X"65",X"43",X"C9",X"CD",X"89",X"1C",X"AF",X"DD",X"77",X"00",X"C9",X"FF",X"8E",X"18",X"70", + X"12",X"40",X"06",X"55",X"06",X"70",X"06",X"FF",X"06",X"70",X"18",X"55",X"06",X"40",X"06",X"FF", + X"06",X"70",X"06",X"FF",X"06",X"70",X"06",X"FF",X"06",X"A0",X"0C",X"8E",X"12",X"80",X"18",X"40", + X"06",X"8E",X"18",X"70",X"12",X"40",X"06",X"55",X"06",X"70",X"06",X"FF",X"06",X"70",X"18",X"55", + X"06",X"40",X"06",X"FF",X"06",X"70",X"06",X"FF",X"06",X"96",X"06",X"8E",X"06",X"80",X"06",X"70", + X"30",X"FF",X"06",X"8E",X"18",X"70",X"12",X"40",X"06",X"55",X"06",X"70",X"06",X"FF",X"06",X"70", + X"18",X"55",X"06",X"40",X"06",X"FF",X"06",X"70",X"06",X"FF",X"06",X"70",X"06",X"FF",X"06",X"A0", + X"0C",X"8E",X"12",X"80",X"18",X"40",X"06",X"8E",X"18",X"70",X"12",X"40",X"06",X"55",X"06",X"70", + X"06",X"FF",X"06",X"70",X"18",X"55",X"06",X"40",X"06",X"FF",X"06",X"70",X"06",X"FF",X"06",X"96", + X"06",X"8E",X"06",X"80",X"06",X"70",X"30",X"FF",X"06",X"8E",X"12",X"70",X"12",X"40",X"0C",X"8E", + X"12",X"70",X"18",X"8A",X"06",X"70",X"06",X"40",X"06",X"FF",X"06",X"8A",X"12",X"80",X"18",X"FF", + X"18",X"8E",X"12",X"70",X"12",X"40",X"0C",X"8E",X"12",X"70",X"18",X"8A",X"06",X"70",X"06",X"40", + X"0C",X"A0",X"18",X"FF",X"30",X"8E",X"18",X"70",X"12",X"40",X"06",X"55",X"06",X"70",X"06",X"FF", + X"06",X"70",X"18",X"55",X"06",X"8E",X"06",X"70",X"06",X"40",X"0C",X"55",X"12",X"70",X"18",X"FF", + X"18",X"55",X"06",X"A0",X"0C",X"AA",X"0C",X"A0",X"0C",X"AA",X"0C",X"A0",X"12",X"40",X"06",X"96", + X"06",X"8E",X"06",X"80",X"0C",X"70",X"18",X"FF",X"48",X"00",X"00",X"FF",X"9A",X"06",X"80",X"06", + X"68",X"06",X"9A",X"06",X"80",X"06",X"68",X"06",X"9A",X"06",X"80",X"06",X"68",X"06",X"9A",X"06", + X"80",X"06",X"68",X"06",X"9A",X"06",X"68",X"06",X"80",X"06",X"9A",X"06",X"A0",X"06",X"80",X"06", + X"68",X"06",X"A0",X"06",X"80",X"06",X"68",X"06",X"80",X"06",X"A0",X"06",X"8E",X"06",X"78",X"06", + X"55",X"06",X"8E",X"06",X"78",X"06",X"55",X"06",X"78",X"06",X"8E",X"06",X"9A",X"06",X"80",X"06", + X"68",X"06",X"9A",X"06",X"80",X"06",X"68",X"06",X"9A",X"06",X"80",X"06",X"68",X"06",X"9A",X"06", + X"80",X"06",X"68",X"06",X"9A",X"06",X"68",X"06",X"80",X"06",X"9A",X"06",X"A0",X"06",X"80",X"06", + X"68",X"06",X"A0",X"06",X"80",X"06",X"68",X"06",X"80",X"06",X"A0",X"06",X"8E",X"06",X"78",X"06", + X"55",X"06",X"8E",X"06",X"78",X"06",X"55",X"06",X"78",X"06",X"8E",X"06",X"B4",X"06",X"B4",X"06", + X"B4",X"06",X"B4",X"06",X"B4",X"0C",X"B4",X"06",X"C0",X"0C",X"C0",X"06",X"BC",X"0C",X"B4",X"0C", + X"AA",X"0C",X"B4",X"06",X"B4",X"06",X"B4",X"06",X"B4",X"06",X"B4",X"0C",X"B4",X"06",X"C0",X"0C", + X"C0",X"06",X"BC",X"0C",X"B4",X"0C",X"AA",X"0C",X"B4",X"06",X"B4",X"06",X"B4",X"06",X"B4",X"06", + X"B4",X"0C",X"B4",X"06",X"C0",X"0C",X"C0",X"06",X"BC",X"0C",X"B4",X"0C",X"AA",X"0C",X"B4",X"0C", + X"CD",X"0C",X"C7",X"0C",X"C0",X"06",X"C7",X"30",X"00",X"00",X"01",X"FF",X"02",X"8E",X"08",X"80", + X"08",X"70",X"08",X"FF",X"08",X"80",X"08",X"70",X"08",X"68",X"08",X"FF",X"08",X"70",X"08",X"68", + X"08",X"55",X"08",X"FF",X"08",X"40",X"10",X"00",X"00",X"01",X"40",X"10",X"80",X"08",X"80",X"08", + X"68",X"10",X"40",X"10",X"40",X"10",X"80",X"08",X"80",X"08",X"68",X"10",X"40",X"10",X"40",X"10", + X"80",X"08",X"80",X"08",X"80",X"20",X"FF",X"08",X"02",X"10",X"40",X"18",X"00",X"00",X"FF",X"40", + X"05",X"80",X"05",X"40",X"05",X"68",X"05",X"40",X"05",X"80",X"05",X"40",X"05",X"68",X"05",X"40", + X"05",X"80",X"05",X"40",X"05",X"68",X"05",X"40",X"05",X"80",X"05",X"40",X"05",X"68",X"05",X"40", + X"05",X"8E",X"05",X"40",X"05",X"70",X"05",X"40",X"05",X"8E",X"05",X"40",X"05",X"70",X"05",X"40", + X"05",X"8E",X"05",X"40",X"05",X"70",X"05",X"40",X"05",X"8E",X"05",X"40",X"05",X"70",X"05",X"40", + X"05",X"80",X"05",X"40",X"05",X"68",X"05",X"40",X"05",X"80",X"05",X"40",X"05",X"68",X"05",X"40", + X"05",X"80",X"05",X"40",X"05",X"68",X"05",X"40",X"05",X"80",X"05",X"40",X"05",X"68",X"05",X"40", + X"05",X"70",X"05",X"40",X"05",X"55",X"05",X"40",X"05",X"70",X"05",X"40",X"05",X"55",X"05",X"40", + X"05",X"70",X"05",X"40",X"05",X"55",X"05",X"40",X"05",X"70",X"05",X"40",X"05",X"55",X"05",X"00", + X"00",X"FF",X"40",X"06",X"FF",X"06",X"A0",X"04",X"FF",X"08",X"68",X"06",X"FF",X"06",X"A0",X"04", + X"FF",X"08",X"70",X"06",X"FF",X"06",X"A0",X"04",X"FF",X"08",X"70",X"06",X"68",X"06",X"70",X"06", + X"FF",X"06",X"55",X"06",X"FF",X"06",X"9A",X"04",X"FF",X"08",X"55",X"06",X"FF",X"06",X"9A",X"04", + X"FF",X"08",X"68",X"06",X"FF",X"06",X"9A",X"04",X"FF",X"08",X"55",X"06",X"68",X"06",X"55",X"06", + X"FF",X"06",X"00",X"00",X"01",X"12",X"01",X"18",X"01",X"22",X"01",X"00",X"00",X"01",X"FF",X"04", + X"40",X"04",X"55",X"04",X"68",X"04",X"70",X"04",X"80",X"08",X"FF",X"04",X"00",X"00",X"06",X"03", + X"1A",X"BE",X"D8",X"C0",X"1B",X"2B",X"10",X"F8",X"37",X"C9",X"11",X"3F",X"40",X"21",X"26",X"40", + X"CD",X"7E",X"1F",X"D8",X"01",X"00",X"04",X"21",X"06",X"40",X"11",X"3F",X"40",X"E5",X"D5",X"C5", + X"CD",X"7E",X"1F",X"C1",X"D1",X"E1",X"30",X"09",X"D5",X"11",X"08",X"00",X"19",X"D1",X"0C",X"10", + X"EC",X"2B",X"2B",X"E5",X"79",X"32",X"6D",X"43",X"78",X"B7",X"28",X"10",X"AF",X"C6",X"08",X"10", + X"FC",X"4F",X"06",X"00",X"21",X"23",X"40",X"11",X"2B",X"40",X"ED",X"B8",X"D1",X"21",X"3D",X"40", + X"01",X"03",X"00",X"ED",X"B0",X"D5",X"E1",X"3E",X"20",X"12",X"13",X"01",X"04",X"00",X"ED",X"B0", + X"CD",X"F5",X"0C",X"DD",X"21",X"EC",X"22",X"CD",X"73",X"13",X"CD",X"A0",X"0D",X"01",X"06",X"06", + X"CD",X"E9",X"1A",X"DD",X"21",X"0C",X"23",X"01",X"04",X"06",X"CD",X"0D",X"0D",X"DD",X"21",X"1C", + X"23",X"01",X"13",X"06",X"CD",X"0D",X"0D",X"DD",X"21",X"2C",X"23",X"01",X"15",X"05",X"CD",X"0D", + X"0D",X"DD",X"21",X"3E",X"23",X"01",X"17",X"05",X"CD",X"0D",X"0D",X"DD",X"21",X"50",X"23",X"01", + X"19",X"06",X"CD",X"0D",X"0D",X"DD",X"21",X"60",X"23",X"01",X"1B",X"05",X"CD",X"0D",X"0D",X"3A", + X"6D",X"43",X"CB",X"27",X"C6",X"06",X"CB",X"27",X"16",X"00",X"5F",X"21",X"01",X"58",X"19",X"3E", + X"04",X"77",X"3E",X"35",X"32",X"5C",X"58",X"3E",X"A3",X"32",X"5F",X"58",X"3E",X"3F",X"32",X"5D", + X"58",X"3E",X"04",X"32",X"5E",X"58",X"AF",X"32",X"4E",X"40",X"32",X"4F",X"40",X"32",X"6E",X"43", + X"32",X"70",X"43",X"21",X"21",X"1F",X"CD",X"70",X"1C",X"3A",X"6D",X"43",X"B7",X"28",X"06",X"47", + X"AF",X"C6",X"08",X"10",X"FC",X"C6",X"03",X"F5",X"3A",X"6E",X"43",X"47",X"F1",X"80",X"4F",X"06", + X"00",X"DD",X"21",X"04",X"40",X"DD",X"09",X"AF",X"32",X"42",X"40",X"AF",X"32",X"71",X"43",X"3A", + X"42",X"40",X"B7",X"20",X"03",X"CD",X"74",X"02",X"CB",X"47",X"C2",X"E3",X"20",X"CB",X"4F",X"C2", + X"37",X"21",X"CB",X"57",X"C2",X"9B",X"21",X"CB",X"5F",X"C2",X"C4",X"21",X"CB",X"67",X"C2",X"0B", + X"22",X"CD",X"C7",X"22",X"06",X"0A",X"AF",X"32",X"42",X"40",X"3E",X"01",X"CD",X"D5",X"0C",X"3A", + X"71",X"43",X"B7",X"20",X"09",X"CD",X"74",X"02",X"B7",X"28",X"03",X"32",X"42",X"40",X"10",X"EA", + X"3A",X"70",X"43",X"3C",X"32",X"70",X"43",X"FE",X"F0",X"20",X"B0",X"AF",X"32",X"5C",X"58",X"CD", + X"94",X"1C",X"C9",X"3E",X"01",X"32",X"71",X"43",X"3A",X"5F",X"58",X"FE",X"A3",X"28",X"24",X"D6", + X"10",X"32",X"5F",X"58",X"3A",X"4F",X"40",X"3D",X"32",X"4F",X"40",X"FE",X"02",X"20",X"0E",X"3A", + X"4E",X"40",X"4F",X"06",X"00",X"21",X"B5",X"23",X"09",X"7E",X"32",X"4E",X"40",X"CD",X"EF",X"21", + X"C3",X"B1",X"20",X"3E",X"D3",X"32",X"5F",X"58",X"3E",X"03",X"32",X"4F",X"40",X"3A",X"4E",X"40", + X"06",X"00",X"4F",X"21",X"AC",X"23",X"09",X"7E",X"32",X"4E",X"40",X"4F",X"21",X"A9",X"23",X"09", + X"7E",X"32",X"5C",X"58",X"C3",X"B1",X"20",X"3E",X"01",X"32",X"71",X"43",X"3A",X"5F",X"58",X"FE", + X"D3",X"28",X"35",X"C6",X"10",X"32",X"5F",X"58",X"3A",X"4F",X"40",X"3C",X"32",X"4F",X"40",X"FE", + X"02",X"20",X"0D",X"3A",X"4E",X"40",X"FE",X"08",X"20",X"18",X"3D",X"32",X"4E",X"40",X"18",X"12", + X"FE",X"03",X"20",X"0E",X"3A",X"4E",X"40",X"06",X"00",X"4F",X"21",X"AC",X"23",X"09",X"7E",X"32", + X"4E",X"40",X"CD",X"EF",X"21",X"C3",X"B1",X"20",X"3E",X"A3",X"32",X"5F",X"58",X"AF",X"32",X"4F", + X"40",X"3A",X"4E",X"40",X"06",X"00",X"4F",X"21",X"B5",X"23",X"09",X"7E",X"32",X"4E",X"40",X"4F", + X"21",X"79",X"23",X"09",X"7E",X"32",X"5C",X"58",X"C3",X"B1",X"20",X"3E",X"01",X"32",X"71",X"43", + X"3A",X"4E",X"40",X"B7",X"28",X"0A",X"3D",X"32",X"4E",X"40",X"CD",X"EF",X"21",X"C3",X"B1",X"20", + X"3A",X"4F",X"40",X"4F",X"06",X"00",X"21",X"72",X"23",X"09",X"7E",X"32",X"4E",X"40",X"CD",X"EF", + X"21",X"C3",X"B1",X"20",X"3E",X"01",X"32",X"71",X"43",X"3A",X"4F",X"40",X"4F",X"06",X"00",X"21", + X"72",X"23",X"09",X"7E",X"47",X"3A",X"4E",X"40",X"B8",X"28",X"0A",X"3C",X"32",X"4E",X"40",X"CD", + X"EF",X"21",X"C3",X"B1",X"20",X"AF",X"32",X"4E",X"40",X"CD",X"EF",X"21",X"C3",X"B1",X"20",X"3A", + X"4F",X"40",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"06",X"00",X"4F",X"21",X"79",X"23", + X"09",X"3A",X"4E",X"40",X"4F",X"09",X"7E",X"32",X"5C",X"58",X"C9",X"3A",X"00",X"78",X"CD",X"74", + X"02",X"CB",X"67",X"20",X"F6",X"3E",X"01",X"21",X"64",X"1F",X"DD",X"E5",X"CD",X"70",X"1C",X"DD", + X"E1",X"3A",X"4F",X"40",X"FE",X"03",X"28",X"5C",X"4F",X"06",X"00",X"21",X"76",X"23",X"09",X"7E", + X"4F",X"3A",X"4E",X"40",X"81",X"CD",X"3E",X"22",X"CD",X"55",X"22",X"C3",X"B1",X"20",X"F5",X"3A", + X"6D",X"43",X"CB",X"27",X"C6",X"06",X"4F",X"3A",X"6E",X"43",X"C6",X"11",X"47",X"F1",X"DD",X"77", + X"00",X"CD",X"3D",X"0D",X"C9",X"3A",X"6E",X"43",X"FE",X"04",X"28",X"10",X"AF",X"32",X"6F",X"43", + X"CD",X"C7",X"22",X"3A",X"6E",X"43",X"3C",X"32",X"6E",X"43",X"DD",X"23",X"C9",X"3A",X"6E",X"43", + X"B7",X"28",X"F9",X"AF",X"32",X"6F",X"43",X"CD",X"C7",X"22",X"3A",X"6E",X"43",X"3D",X"32",X"6E", + X"43",X"DD",X"2B",X"C9",X"3A",X"4E",X"40",X"FE",X"00",X"20",X"0B",X"3E",X"20",X"CD",X"3E",X"22", + X"CD",X"55",X"22",X"C3",X"B1",X"20",X"FE",X"01",X"20",X"19",X"3A",X"6E",X"43",X"FE",X"04",X"20", + X"07",X"DD",X"7E",X"00",X"FE",X"20",X"20",X"03",X"CD",X"6D",X"22",X"3E",X"20",X"CD",X"3E",X"22", + X"C3",X"B1",X"20",X"AF",X"32",X"6F",X"43",X"CD",X"C7",X"22",X"AF",X"32",X"5C",X"58",X"CD",X"94", + X"1C",X"3E",X"A0",X"CD",X"D5",X"0C",X"C9",X"3A",X"6F",X"43",X"3C",X"E6",X"01",X"32",X"6F",X"43", + X"20",X"04",X"3E",X"5B",X"18",X"02",X"3E",X"20",X"F5",X"3A",X"6D",X"43",X"CB",X"27",X"C6",X"07", + X"4F",X"3A",X"6E",X"43",X"C6",X"11",X"47",X"F1",X"CD",X"3D",X"0D",X"C9",X"00",X"03",X"00",X"00", + X"00",X"00",X"03",X"00",X"03",X"00",X"03",X"00",X"03",X"00",X"03",X"00",X"00",X"00",X"00",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"43",X"4F",X"4E",X"47", + X"52",X"41",X"54",X"55",X"4C",X"41",X"54",X"49",X"4F",X"4E",X"53",X"00",X"45",X"4E",X"54",X"45", + X"52",X"20",X"59",X"4F",X"55",X"52",X"20",X"4E",X"41",X"4D",X"45",X"00",X"41",X"20",X"42",X"20", + X"43",X"20",X"44",X"20",X"45",X"20",X"46",X"20",X"47",X"20",X"48",X"20",X"49",X"00",X"4A",X"20", + X"4B",X"20",X"4C",X"20",X"4D",X"20",X"4E",X"20",X"4F",X"20",X"50",X"20",X"51",X"20",X"52",X"00", + X"53",X"20",X"54",X"20",X"55",X"20",X"56",X"20",X"57",X"20",X"58",X"20",X"59",X"20",X"5A",X"00", + X"53",X"50",X"41",X"43",X"45",X"20",X"20",X"45",X"52",X"41",X"53",X"45",X"20",X"20",X"45",X"4E", + X"44",X"00",X"08",X"08",X"07",X"02",X"41",X"4A",X"53",X"35",X"45",X"55",X"65",X"75",X"85",X"95", + X"A5",X"B5",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"35",X"45",X"55",X"65",X"75",X"85",X"95", + X"A5",X"B5",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3D",X"4D",X"5D",X"6D",X"7D",X"8D",X"9D", + X"AD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"45",X"7D",X"AD",X"00",X"00",X"00",X"01", + X"01",X"01",X"01",X"02",X"02",X"00",X"04",X"07",X"05",X"02",X"05",X"07",X"DE",X"11",X"11",X"11", + X"11",X"ED",X"11",X"11",X"11",X"11",X"11",X"11",X"13",X"31",X"13",X"31",X"13",X"31",X"13",X"31", + X"13",X"31",X"13",X"31",X"13",X"31",X"63",X"36",X"13",X"31",X"13",X"31",X"13",X"31",X"13",X"31", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"AC",X"CA",X"AA",X"AA", + X"AC",X"CA",X"78",X"87",X"77",X"77",X"78",X"87",X"9B",X"B9",X"99",X"99",X"9B",X"B9",X"11",X"11", + X"11",X"11",X"11",X"11",X"EF",X"11",X"51",X"15",X"11",X"FD",X"07",X"02",X"00",X"0C",X"11",X"31", + X"11",X"11",X"31",X"11",X"F1",X"11",X"13",X"11",X"11",X"11",X"DD",X"DD",X"DD",X"DD",X"DD",X"11", + X"61",X"11",X"11",X"11",X"41",X"11",X"11",X"11",X"14",X"11",X"11",X"11",X"11",X"41",X"11",X"11", + X"11",X"15",X"11",X"EE",X"EE",X"EE",X"EE",X"EE",X"11",X"41",X"11",X"11",X"11",X"15",X"11",X"11", + X"14",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"41",X"11",X"DD",X"DD",X"DD",X"DD",X"DD",X"11", + X"11",X"11",X"13",X"11",X"11",X"11",X"11",X"31",X"11",X"11",X"31",X"16",X"07",X"01",X"00",X"07", + X"00",X"DD",X"12",X"11",X"DD",X"00",X"0D",X"11",X"11",X"11",X"11",X"D0",X"D1",X"11",X"12",X"11", + X"16",X"1D",X"D1",X"11",X"42",X"31",X"11",X"1D",X"11",X"14",X"12",X"13",X"11",X"11",X"11",X"41", + X"42",X"31",X"31",X"11",X"21",X"22",X"22",X"22",X"22",X"12",X"11",X"13",X"13",X"25",X"14",X"11", + X"11",X"11",X"31",X"21",X"41",X"11",X"E1",X"11",X"13",X"24",X"11",X"1E",X"E1",X"11",X"11",X"21", + X"11",X"1E",X"0E",X"11",X"11",X"11",X"11",X"F0",X"00",X"EE",X"11",X"21",X"EE",X"00",X"07",X"01", + X"03",X"09",X"51",X"40",X"00",X"00",X"01",X"15",X"11",X"14",X"00",X"00",X"11",X"11",X"11",X"11", + X"40",X"01",X"11",X"14",X"01",X"11",X"11",X"11",X"11",X"40",X"00",X"11",X"11",X"11",X"14",X"00", + X"00",X"01",X"16",X"61",X"10",X"00",X"00",X"01",X"1E",X"F1",X"10",X"00",X"00",X"01",X"16",X"61", + X"10",X"00",X"00",X"11",X"11",X"11",X"14",X"00",X"01",X"11",X"11",X"11",X"11",X"40",X"11",X"11", + X"40",X"01",X"11",X"14",X"11",X"14",X"00",X"00",X"11",X"11",X"51",X"40",X"00",X"00",X"01",X"15", + X"07",X"01",X"05",X"04",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"14",X"61",X"11",X"11", + X"11",X"11",X"41",X"14",X"11",X"11",X"11",X"14",X"11",X"11",X"41",X"11",X"11",X"41",X"11",X"11", + X"14",X"11",X"16",X"11",X"1D",X"E1",X"11",X"41",X"14",X"11",X"1F",X"D1",X"11",X"61",X"11",X"41", + X"11",X"11",X"14",X"11",X"11",X"14",X"11",X"11",X"41",X"11",X"11",X"11",X"41",X"14",X"11",X"11", + X"11",X"11",X"16",X"41",X"11",X"11",X"15",X"11",X"11",X"11",X"11",X"51",X"11",X"11",X"11",X"11", + X"11",X"11",X"06",X"01",X"00",X"0C",X"11",X"12",X"44",X"61",X"21",X"11",X"12",X"12",X"44",X"11", + X"21",X"21",X"12",X"11",X"11",X"11",X"11",X"21",X"12",X"22",X"11",X"33",X"22",X"21",X"11",X"12", + X"11",X"33",X"21",X"11",X"11",X"12",X"11",X"11",X"21",X"11",X"12",X"22",X"11",X"D1",X"22",X"21", + X"12",X"11",X"11",X"D1",X"11",X"21",X"12",X"1D",X"EF",X"EE",X"D1",X"21",X"12",X"11",X"D1",X"11", + X"11",X"21",X"12",X"21",X"D1",X"33",X"12",X"21",X"11",X"21",X"11",X"33",X"12",X"51",X"11",X"21", + X"11",X"33",X"12",X"55",X"07",X"01",X"01",X"0C",X"DD",X"11",X"21",X"33",X"21",X"33",X"D1",X"11", + X"11",X"13",X"21",X"13",X"11",X"11",X"21",X"11",X"21",X"11",X"AC",X"AA",X"2C",X"AA",X"2C",X"AA", + X"78",X"77",X"78",X"77",X"78",X"77",X"9B",X"99",X"2B",X"99",X"2B",X"99",X"51",X"11",X"26",X"11", + X"21",X"11",X"AA",X"CA",X"2A",X"1A",X"2A",X"CA",X"77",X"87",X"77",X"87",X"77",X"87",X"99",X"B9", + X"29",X"B9",X"29",X"B9",X"11",X"11",X"21",X"11",X"21",X"11",X"11",X"1F",X"23",X"11",X"11",X"13", + X"11",X"EE",X"23",X"31",X"21",X"33",X"06",X"00",X"01",X"01",X"01",X"11",X"13",X"10",X"00",X"00", + X"11",X"13",X"11",X"13",X"00",X"00",X"11",X"FD",X"ED",X"E1",X"00",X"00",X"01",X"11",X"C1",X"10", + X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"01",X"B1",X"11",X"60",X"00",X"00",X"3E", + X"DE",X"D1",X"11",X"00",X"00",X"11",X"31",X"31",X"11",X"00",X"00",X"01",X"11",X"C1",X"10",X"00", + X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"01",X"B1",X"11",X"10",X"00",X"00",X"5E",X"DE", + X"D1",X"11",X"00",X"00",X"13",X"13",X"13",X"16",X"07",X"01",X"05",X"04",X"00",X"11",X"11",X"11", + X"11",X"00",X"01",X"3D",X"F1",X"1D",X"E3",X"10",X"13",X"DE",X"31",X"1E",X"DE",X"31",X"1D",X"E3", + X"11",X"11",X"3D",X"E1",X"11",X"11",X"11",X"11",X"11",X"11",X"1D",X"12",X"22",X"22",X"21",X"D1", + X"1D",X"11",X"31",X"13",X"11",X"D1",X"4D",X"1D",X"DD",X"DD",X"D1",X"D4",X"1D",X"11",X"16",X"61", + X"11",X"D1",X"4D",X"1E",X"EE",X"EE",X"E1",X"D4",X"1D",X"11",X"31",X"13",X"11",X"D1",X"1D",X"12", + X"22",X"22",X"21",X"D1",X"11",X"11",X"15",X"51",X"11",X"11",X"07",X"01",X"05",X"08",X"11",X"11", + X"11",X"11",X"11",X"15",X"1D",X"DD",X"D1",X"1E",X"EE",X"F1",X"1D",X"33",X"31",X"13",X"33",X"E1", + X"1D",X"32",X"21",X"12",X"23",X"E1",X"1D",X"12",X"41",X"61",X"21",X"E1",X"AA",X"CA",X"AA",X"AA", + X"AC",X"AA",X"77",X"87",X"77",X"77",X"78",X"77",X"99",X"B9",X"99",X"99",X"9B",X"99",X"1E",X"12", + X"11",X"14",X"21",X"D1",X"1E",X"32",X"21",X"12",X"23",X"D1",X"1E",X"33",X"31",X"13",X"33",X"D1", + X"1E",X"EE",X"E1",X"1D",X"DD",X"D1",X"51",X"11",X"11",X"11",X"11",X"11",X"07",X"01",X"02",X"0C", + X"00",X"25",X"11",X"11",X"12",X"00",X"02",X"55",X"11",X"11",X"11",X"20",X"22",X"22",X"22",X"22", + X"21",X"22",X"24",X"44",X"11",X"21",X"44",X"42",X"24",X"14",X"21",X"21",X"41",X"42",X"24",X"44", + X"21",X"21",X"44",X"42",X"21",X"11",X"21",X"11",X"11",X"12",X"22",X"21",X"22",X"22",X"22",X"22", + X"E1",X"E1",X"11",X"11",X"1E",X"1F",X"AA",X"AA",X"AA",X"AA",X"AA",X"CA",X"77",X"77",X"77",X"77", + X"77",X"87",X"99",X"99",X"99",X"99",X"99",X"B9",X"11",X"16",X"16",X"16",X"11",X"11",X"07",X"01", + X"02",X"06",X"EE",X"11",X"11",X"D1",X"11",X"11",X"F1",X"11",X"11",X"D1",X"11",X"11",X"11",X"11", + X"D1",X"D1",X"11",X"61",X"11",X"11",X"D1",X"D1",X"11",X"11",X"DD",X"D1",X"D1",X"D1",X"61",X"11", + X"11",X"11",X"D1",X"D1",X"11",X"11",X"11",X"11",X"D1",X"D1",X"11",X"61",X"11",X"11",X"D1",X"D1", + X"11",X"11",X"1D",X"DD",X"D1",X"D1",X"61",X"11",X"11",X"11",X"D1",X"D1",X"11",X"11",X"15",X"55", + X"D1",X"D1",X"11",X"61",X"11",X"55",X"D1",X"11",X"11",X"11",X"11",X"11",X"D1",X"11",X"11",X"11", + X"07",X"00",X"00",X"0C",X"33",X"33",X"33",X"33",X"33",X"3F",X"30",X"00",X"00",X"01",X"00",X"00", + X"33",X"33",X"33",X"33",X"33",X"33",X"00",X"00",X"10",X"00",X"00",X"03",X"33",X"33",X"33",X"33", + X"33",X"33",X"30",X"00",X"00",X"01",X"00",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"00",X"00", + X"10",X"00",X"00",X"03",X"33",X"33",X"33",X"33",X"33",X"33",X"30",X"00",X"00",X"01",X"00",X"00", + X"33",X"33",X"33",X"33",X"33",X"33",X"00",X"00",X"10",X"00",X"00",X"03",X"13",X"33",X"33",X"33", + X"33",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/build_id.tcl b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_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/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/build_id.v b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/build_id.v new file mode 100644 index 00000000..004d8e2f --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180103" +`define BUILD_TIME "170728" diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c07d2629 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1093 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..6bd576cf --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..ee217402 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2026 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..679730ab --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80as.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80as.vhd new file mode 100644 index 00000000..fe477f50 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/cpu/T80as.vhd @@ -0,0 +1,283 @@ +------------------------------------------------------------------------------ +-- t80as.vhd : The non-tristate signal edition of t80a.vhd +-- +-- 2003.2.7 non-tristate modification by Tatsuyuki Satoh +-- +-- 1.separate 'D' to 'DO' and 'DI'. +-- 2.added 'DOE' to 'DO' enable signal.(data direction) +-- 3.MREQ_n,IORQ_n,RD_n,WR_n,RFSH_n,A doesn't become the condition of 'Z'. +-- +-- There is a mark of "--AS" in all the change points. +-- +------------------------------------------------------------------------------ + +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80as is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); +--AS-- D : inout std_logic_vector(7 downto 0) +--AS>> + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + DOE : out std_logic +--< 'Z'); +--AS-- D <= DO when Write = '1' and BUSAK_n_i = '1' else (others => 'Z'); +--AS>> + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DOE <= Write when BUSAK_n_i = '1' else '0'; +--< Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, +-- DInst => D, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then +--AS-- DI_Reg <= to_x01(D); +--AS>> + DI_Reg <= to_x01(DI); +--< 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/dac.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/dac.vhd new file mode 100644 index 00000000..b1ecdcb7 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_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 := 11 + ); + 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/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/dpram.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..dafe8385 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/galaxian.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/galaxian.vhd new file mode 100644 index 00000000..b881e738 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/galaxian.vhd @@ -0,0 +1,446 @@ +------------------------------------------------------------------------------ +-- FPGA GALAXIAN +-- +-- Version downto 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important not +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +-- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--use work.pkg_galaxian.all; + +entity galaxian is + port( + W_CLK_18M : in std_logic; + W_CLK_12M : in std_logic; + W_CLK_6M : in std_logic; + + P1_CSJUDLR : in std_logic_vector(6 downto 0); + P2_CSJUDLR : in std_logic_vector(6 downto 0); + I_RESET : in std_logic; + + W_R : out std_logic_vector(2 downto 0); + W_G : out std_logic_vector(2 downto 0); + W_B : out std_logic_vector(2 downto 0); + HBLANK : out std_logic; + VBLANK : out std_logic; + W_H_SYNC : out std_logic; + W_V_SYNC : out std_logic; + W_SDAT_A : out std_logic_vector( 7 downto 0); + W_SDAT_B : out std_logic_vector( 7 downto 0); + O_CMPBL : out std_logic + ); +end; + +architecture RTL of galaxian is + -- CPU ADDRESS BUS + signal W_A : std_logic_vector(15 downto 0) := (others => '0'); + -- CPU IF + signal W_CPU_CLK : std_logic := '0'; + signal W_CPU_MREQn : std_logic := '0'; + signal W_CPU_NMIn : std_logic := '0'; + signal W_CPU_RDn : std_logic := '0'; + signal W_CPU_RFSHn : std_logic := '0'; + signal W_CPU_WAITn : std_logic := '0'; + signal W_CPU_WRn : std_logic := '0'; + signal W_CPU_WR : std_logic := '0'; + signal W_RESETn : std_logic := '0'; + -------- H and V COUNTER ------------------------- + signal W_C_BLn : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_C_BLXn : std_logic := '0'; + signal W_H_BL : std_logic := '0'; + signal W_H_SYNC_int : std_logic := '0'; + signal W_V_BLn : std_logic := '0'; + signal W_V_BL2n : std_logic := '0'; + signal W_V_SYNC_int : std_logic := '0'; + signal W_H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal W_V_CNT : std_logic_vector(7 downto 0) := (others => '0'); + -------- CPU RAM ---------------------------- + signal W_CPU_RAM_DO : std_logic_vector(7 downto 0) := (others => '0'); + -------- ADDRESS DECDER ---------------------- + signal W_BD_G : std_logic := '0'; + signal W_CPU_RAM_CS : std_logic := '0'; + signal W_CPU_RAM_RD : std_logic := '0'; +-- signal W_CPU_RAM_WR : std_logic := '0'; + signal W_CPU_ROM_CS : std_logic := '0'; + signal W_DIP_OE : std_logic := '0'; + signal W_H_FLIP : std_logic := '0'; + signal W_DRIVER_WE : std_logic := '0'; + signal W_OBJ_RAM_RD : std_logic := '0'; + signal W_OBJ_RAM_RQ : std_logic := '0'; + signal W_OBJ_RAM_WR : std_logic := '0'; + signal W_PITCH : std_logic := '0'; + signal W_SOUND_WE : std_logic := '0'; + signal W_STARS_ON : std_logic := '0'; + signal W_STARS_OFFn : std_logic := '0'; + signal W_SW0_OE : std_logic := '0'; + signal W_SW1_OE : std_logic := '0'; + signal W_V_FLIP : std_logic := '0'; + signal W_VID_RAM_RD : std_logic := '0'; + signal W_VID_RAM_WR : std_logic := '0'; + signal W_WDR_OE : std_logic := '0'; + --------- INPORT ----------------------------- + signal W_SW_DO : std_logic_vector( 7 downto 0) := (others => '0'); + --------- VIDEO ----------------------------- + signal W_VID_DO : std_logic_vector( 7 downto 0) := (others => '0'); + ----- DATA I/F ------------------------------------- + signal W_CPU_ROM_DO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_ROM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_RAM_CLK : std_logic := '0'; + signal W_VOL1 : std_logic := '0'; + signal W_VOL2 : std_logic := '0'; + signal W_FIRE : std_logic := '0'; + signal W_HIT : std_logic := '0'; + signal W_FS : std_logic_vector( 2 downto 0) := (others => '0'); + + signal blx_comb : std_logic := '0'; + signal W_1VF : std_logic := '0'; + signal W_256HnX : std_logic := '0'; + signal W_8HF : std_logic := '0'; + signal W_DAC_A : std_logic := '0'; + signal W_DAC_B : std_logic := '0'; + signal W_MISSILEn : std_logic := '0'; + signal W_SHELLn : std_logic := '0'; + signal W_MS_D : std_logic := '0'; + signal W_MS_R : std_logic := '0'; + signal W_MS_G : std_logic := '0'; + signal W_MS_B : std_logic := '0'; + + signal new_sw : std_logic_vector( 2 downto 0) := (others => '0'); + signal in_game : std_logic_vector( 1 downto 0) := (others => '0'); + signal ROM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal rst_count : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_STARS_B : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_G : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_R : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VIDEO_B : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_G : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_R : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_WAV_A0 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A1 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A2 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D2 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_DAC : std_logic_vector( 3 downto 0) := (others => '0'); + +begin + mc_vid : entity work.MC_VIDEO + port map( + I_CLK_18M => W_CLK_18M, + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT => W_H_CNT, + I_V_CNT => W_V_CNT, + I_H_FLIP => W_H_FLIP, + I_V_FLIP => W_V_FLIP, + I_V_BLn => W_V_BLn, + I_C_BLn => W_C_BLn, + I_A => W_A(9 downto 0), + I_OBJ_SUB_A => "000", + I_BD => W_BDI, + I_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + I_OBJ_RAM_RD => W_OBJ_RAM_RD, + I_OBJ_RAM_WR => W_OBJ_RAM_WR, + I_VID_RAM_RD => W_VID_RAM_RD, + I_VID_RAM_WR => W_VID_RAM_WR, + I_DRIVER_WR => W_DRIVER_WE, + O_C_BLnX => W_C_BLnX, + O_8HF => W_8HF, + O_256HnX => W_256HnX, + O_1VF => W_1VF, + O_MISSILEn => W_MISSILEn, + O_SHELLn => W_SHELLn, + O_BD => W_VID_DO, + O_VID => W_VID, + O_COL => W_COL + ); + + cpu : entity work.T80as + port map ( + RESET_n => W_RESETn, + CLK_n => W_CPU_CLK, + WAIT_n => W_CPU_WAITn, + INT_n => '1', + NMI_n => W_CPU_NMIn, + BUSRQ_n => '1', + MREQ_n => W_CPU_MREQn, + RD_n => W_CPU_RDn, + WR_n => W_CPU_WRn, + RFSH_n => W_CPU_RFSHn, + A => W_A, + DI => W_BDO, + DO => W_BDI, + M1_n => open, + IORQ_n => open, + HALT_n => open, + BUSAK_n => open, + DOE => open + ); + + mc_cpu_ram : entity work.MC_CPU_RAM + port map ( + I_CLK => W_CPU_RAM_CLK, + I_ADDR => W_A(9 downto 0), + I_D => W_BDI, + I_WE => W_CPU_WR, + I_OE => W_CPU_RAM_RD, + O_D => W_CPU_RAM_DO + ); + + mc_adec : entity work.MC_ADEC + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_CPU_CLK => W_CPU_CLK, + I_RSTn => W_RESETn, + + I_CPU_A => W_A, + I_CPU_D => W_BDI(0), + I_MREQn => W_CPU_MREQn, + I_RFSHn => W_CPU_RFSHn, + I_RDn => W_CPU_RDn, + I_WRn => W_CPU_WRn, + I_H_BL => W_H_BL, + I_V_BLn => W_V_BLn, + + O_WAITn => W_CPU_WAITn, + O_NMIn => W_CPU_NMIn, + O_CPU_ROM_CS => W_CPU_ROM_CS, + O_CPU_RAM_RD => W_CPU_RAM_RD, +-- O_CPU_RAM_WR => W_CPU_RAM_WR, + O_CPU_RAM_CS => W_CPU_RAM_CS, + O_OBJ_RAM_RD => W_OBJ_RAM_RD, + O_OBJ_RAM_WR => W_OBJ_RAM_WR, + O_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + O_VID_RAM_RD => W_VID_RAM_RD, + O_VID_RAM_WR => W_VID_RAM_WR, + O_SW0_OE => W_SW0_OE, + O_SW1_OE => W_SW1_OE, + O_DIP_OE => W_DIP_OE, + O_WDR_OE => W_WDR_OE, + O_DRIVER_WE => W_DRIVER_WE, + O_SOUND_WE => W_SOUND_WE, + O_PITCH => W_PITCH, + O_H_FLIP => W_H_FLIP, + O_V_FLIP => W_V_FLIP, + O_BD_G => W_BD_G, + O_STARS_ON => W_STARS_ON + ); + + -- active high buttons + mc_inport : entity work.MC_INPORT + port map ( + I_COIN1 => P1_CSJUDLR(6), + I_COIN2 => P2_CSJUDLR(6), + I_1P_START => P1_CSJUDLR(5), + I_2P_START => P2_CSJUDLR(5), + I_1P_SH => P1_CSJUDLR(4), + I_2P_SH => P2_CSJUDLR(4), + I_1P_LE => P1_CSJUDLR(1), + I_2P_LE => P2_CSJUDLR(1), + I_1P_RI => P1_CSJUDLR(0), + I_2P_RI => P2_CSJUDLR(0), + I_SW0_OE => W_SW0_OE, + I_SW1_OE => W_SW1_OE, + I_DIP_OE => W_DIP_OE, + O_D => W_SW_DO + ); + + mc_hv : entity work.MC_HV_COUNT + port map( + I_CLK => W_CLK_6M, + I_RSTn => W_RESETn, + O_H_CNT => W_H_CNT, + O_H_SYNC => W_H_SYNC_int, + O_H_BL => W_H_BL, + O_V_CNT => W_V_CNT, + O_V_SYNC => W_V_SYNC_int, + O_V_BL2n => W_V_BL2n, + O_V_BLn => W_V_BLn, + O_C_BLn => W_C_BLn + ); + + mc_col_pal : entity work.MC_COL_PAL + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_VID => W_VID, + I_COL => W_COL, + I_C_BLnX => W_C_BLnX, + O_C_BLXn => W_C_BLXn, + O_STARS_OFFn => W_STARS_OFFn, + O_R => W_VIDEO_R, + O_G => W_VIDEO_G, + O_B => W_VIDEO_B + ); + + mc_stars : entity work.MC_STARS + port map ( + I_CLK_18M => W_CLK_18M, + I_CLK_6M => W_CLK_6M, + I_H_FLIP => W_H_FLIP, + I_V_SYNC => W_V_SYNC_int, + I_8HF => W_8HF, + I_256HnX => W_256HnX, + I_1VF => W_1VF, + I_2V => W_V_CNT(1), + I_STARS_ON => W_STARS_ON, + I_STARS_OFFn => W_STARS_OFFn, + O_R => W_STARS_R, + O_G => W_STARS_G, + O_B => W_STARS_B, + O_NOISE => open + ); + + mc_sound_a : entity work.MC_SOUND_A + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT1 => W_H_CNT(1), + I_BD => W_BDI, + I_PITCH => W_PITCH, + I_VOL1 => W_VOL1, + I_VOL2 => W_VOL2, + O_SDAT => W_SDAT_A, + O_DO => open + ); + + vmc_sound_b : entity work.MC_SOUND_B + port map( + I_CLK1 => W_CLK_6M, + I_RSTn => rst_count(3), + I_SW => new_sw, + I_DAC => W_DAC, + I_FS => W_FS, + O_SDAT => W_SDAT_B + ); + +--------- ROM ------------------------------------------------------- + mc_roms : entity work.ROM_PGM_0 + port map ( + CLK => W_CLK_12M, + ADDR => W_A(13 downto 0), + DATA => W_CPU_ROM_DO + ); + +-------- VIDEO ----------------------------- + blx_comb <= not ( W_C_BLXn and W_V_BL2n ); + W_V_SYNC <= not W_V_SYNC_int; + W_H_SYNC <= not W_H_SYNC_int; + O_CMPBL <= W_C_BLnX; + + -- MISSILE => Yellow ; + -- SHELL => White ; + W_MS_D <= not (W_MISSILEn and W_SHELLn); + W_MS_R <= not blx_comb and W_MS_D; + W_MS_G <= not blx_comb and W_MS_D; + W_MS_B <= not blx_comb and W_MS_D and not W_SHELLn ; + + W_R <= W_VIDEO_R or (W_STARS_R & "0") or (W_MS_R & W_MS_R & "0"); + W_G <= W_VIDEO_G or (W_STARS_G & "0") or (W_MS_G & W_MS_G & "0"); + W_B <= W_VIDEO_B or (W_STARS_B & "0") or (W_MS_B & W_MS_B & "0"); + + process(W_CLK_6M) + begin + if rising_edge(W_CLK_6M) then + HBLANK <= not W_C_BLXn; + VBLANK <= not W_V_BL2n; + end if; + end process; + + +----- CPU I/F ------------------------------------- + + W_CPU_CLK <= W_H_CNT(0); + W_CPU_RAM_CLK <= W_CLK_12M and W_CPU_RAM_CS; + + W_CPU_ROM_DOB <= W_CPU_ROM_DO when W_CPU_ROM_CS = '1' else (others=>'0'); + + W_RESETn <= not I_RESET; + W_BDO <= W_SW_DO or W_VID_DO or W_CPU_RAM_DO or W_CPU_ROM_DOB ; + W_CPU_WR <= not W_CPU_WRn; + + new_sw <= (W_FS(2) or W_FS(1) or W_FS(0)) & W_HIT & W_FIRE; + + process(W_CPU_CLK, I_RESET) + begin + if (I_RESET = '1') then + rst_count <= (others => '0'); + elsif rising_edge( W_CPU_CLK) then + if ( rst_count /= x"f") then + rst_count <= rst_count + 1; + end if; + end if; + end process; + +----- Parts 9L --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_FS <= (others=>'0'); + W_HIT <= '0'; + W_FIRE <= '0'; + W_VOL1 <= '0'; + W_VOL2 <= '0'; + elsif rising_edge(W_CLK_12M) then + if (W_SOUND_WE = '1') then + case(W_A(2 downto 0)) is + when "000" => W_FS(0) <= W_BDI(0); + when "001" => W_FS(1) <= W_BDI(0); + when "010" => W_FS(2) <= W_BDI(0); + when "011" => W_HIT <= W_BDI(0); +-- when "100" => UNUSED <= W_BDI(0); + when "101" => W_FIRE <= W_BDI(0); + when "110" => W_VOL1 <= W_BDI(0); + when "111" => W_VOL2 <= W_BDI(0); + when others => null; + end case; + end if; + end if; + end process; + +----- Parts 9M --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_DAC <= (others=>'0'); + elsif rising_edge(W_CLK_12M) then + if (W_DRIVER_WE = '1') then + case(W_A(2 downto 0)) is + -- next 4 outputs go off board via ULN2075 buffer +-- when "000" => 1P START <= W_BDI(0); +-- when "001" => 2P START <= W_BDI(0); +-- when "010" => COIN LOCK <= W_BDI(0); +-- when "011" => COIN CTR <= W_BDI(0); + when "100" => W_DAC(0) <= W_BDI(0); -- 1M + when "101" => W_DAC(1) <= W_BDI(0); -- 470K + when "110" => W_DAC(2) <= W_BDI(0); -- 220K + when "111" => W_DAC(3) <= W_BDI(0); -- 100K + when others => null; + end case; + end if; + end if; + end process; + +------------------------------------------------------------------------------- +end RTL; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/hq2x.sv b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_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/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/keyboard.v b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_adec.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_adec.vhd new file mode 100644 index 00000000..7245ce8c --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_adec.vhd @@ -0,0 +1,251 @@ +--------------------------------------------------------------------- +-- FPGA GALAXIAN ADDRESS DECDER +-- +-- Version : 2.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +--------------------------------------------------------------------- +-- +--GALAXIAN Address Map +-- +-- Address Item(R..read-mode W..wight-mode) Parts +--0000 - 1FFF CPU-ROM..R ( 7H or 7K ) +--2000 - 3FFF CPU-ROM..R ( 7L ) +--4000 - 47FF CPU-RAM..RW ( 7N & 7P ) +--5000 - 57FF VID-RAM..RW +--5800 - 5FFF OBJ-RAM..RW +--6000 - SW0..R LAMP......W +--6800 - SW1..R SOUND.....W +--7000 - DIP..R +--7001 NMI_ON....W +--7004 STARS_ON..W +--7006 H_FLIP....W +--7007 V-FLIP....W +--7800 WDR..R PITCH.....W +-- +--W MODE +--6000 1P START +--6001 2P START +--6002 COIN LOCKOUT +--6003 COIN COUNTER +--6004 - 6007 SOUND CONTROL(OSC) +-- +--6800 SOUND CONTROL(FS1) +--6801 SOUND CONTROL(FS2) +--6802 SOUND CONTROL(FS3) +--6803 SOUND CONTROL(HIT) +--6805 SOUND CONTROL(SHOT) +--6806 SOUND CONTROL(VOL1) +--6807 SOUND CONTROL(VOL2) +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_ADEC is + port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_CPU_CLK : in std_logic; + I_RSTn : in std_logic; + + I_CPU_A : in std_logic_vector(15 downto 0); + I_CPU_D : in std_logic; + I_MREQn : in std_logic; + I_RFSHn : in std_logic; + I_RDn : in std_logic; + I_WRn : in std_logic; + I_H_BL : in std_logic; + I_V_BLn : in std_logic; + + O_WAITn : out std_logic; + O_NMIn : out std_logic; + O_CPU_ROM_CS : out std_logic; + O_CPU_RAM_RD : out std_logic; + O_CPU_RAM_WR : out std_logic; + O_CPU_RAM_CS : out std_logic; + O_OBJ_RAM_RD : out std_logic; + O_OBJ_RAM_WR : out std_logic; + O_OBJ_RAM_RQ : out std_logic; + O_VID_RAM_RD : out std_logic; + O_VID_RAM_WR : out std_logic; + O_SW0_OE : out std_logic; + O_SW1_OE : out std_logic; + O_DIP_OE : out std_logic; + O_WDR_OE : out std_logic; + O_DRIVER_WE : out std_logic; + O_SOUND_WE : out std_logic; + O_PITCH : out std_logic; + O_H_FLIP : out std_logic; + O_V_FLIP : out std_logic; + O_BD_G : out std_logic; + O_STARS_ON : out std_logic + ); +end; + +architecture RTL of MC_ADEC is + signal W_8E1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8E2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8P_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8M_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_9N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_NMI_ONn : std_logic := '0'; + -------- CPU WAITn ---------------------------------------------- +-- signal W_6S1_Q : std_logic := '0'; + signal W_6S1_Qn : std_logic := '0'; +-- signal W_6S2_Qn : std_logic := '0'; + + signal W_V_BL : std_logic := '0'; + +begin + W_NMI_ONn <= W_9N_Q(1); -- galaxian + +-- O_WAITn <= '1' ; -- No Wait + O_WAITn <= W_6S1_Qn; + + process(I_CPU_CLK, I_V_BLn) + begin + if (I_V_BLn = '0') then +-- W_6S1_Q <= '0'; + W_6S1_Qn <= '1'; + elsif rising_edge(I_CPU_CLK) then +-- W_6S1_Q <= not (I_H_BL or W_8P_Q(2)); + W_6S1_Qn <= I_H_BL or W_8P_Q(2); + end if; + end process; + +-- process(I_CPU_CLK) +-- begin +-- if falling_edge(I_CPU_CLK) then +-- W_6S2_Qn <= not W_6S1_Q; +-- end if; +-- end process; + +-------- CPU NMIn ----------------------------------------------- + W_V_BL <= not I_V_BLn; + process(W_V_BL, W_NMI_ONn) + begin + if (W_NMI_ONn = '0') then + O_NMIn <= '1'; + elsif rising_edge(W_V_BL) then + O_NMIn <= '0'; + end if; + end process; + + ------------------------------------------------------------------- + u_8e1 : entity work.LOGIC_74XX139 + port map ( + I_G => I_MREQn, + I_Sel(1) => I_CPU_A(15), + I_Sel(0) => I_CPU_A(14), + O_Q => W_8E1_Q + ); + + ---------- CPU_ROM CS 0000 - 3FFF --------------------------- + u_8e2 : entity work.LOGIC_74XX139 + port map ( + I_G => I_RDn, + I_Sel(1) => W_8E1_Q(0), + I_Sel(0) => I_CPU_A(13), + O_Q => W_8E2_Q + ); + + O_CPU_ROM_CS <= not (W_8E2_Q(0) and W_8E2_Q(1) ) ; -- 0000 - 3FFF + ------------------------------------------------------------------- + -- ADDRESS + -- W_8E1_Q[0] = 0000 - 3FFF ---- CPU_ROM_USE + -- W_8E1_Q[1] = 4000 - 7FFF ---- GALAXIAN USE *1 + -- W_8E1_Q[2] = 8000 - BFFF ---- MOONCREST USE + -- W_8E1_Q[3] = C000 - FFFF + + u_8p : entity work.LOGIC_74XX138 + port map ( + I_G1 => I_RFSHn, + I_G2a => W_8E1_Q(1), -- <= *1 + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8P_Q + ); + + u_8n : entity work.LOGIC_74XX138 + port map ( + I_G1 => '1', + I_G2a => I_RDn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8N_Q + ); + + u_8m : entity work.LOGIC_74XX138 + port map ( + -- I_G1 => W_6S2_Qn, + I_G1 => '1', -- No Wait + I_G2a => I_WRn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8M_Q + ); + + O_BD_G <= not (W_8E1_Q(0) and W_8P_Q(0)); + O_OBJ_RAM_RQ <= not W_8P_Q(3); + + O_CPU_RAM_CS <= not (W_8N_Q(0) and W_8M_Q(0)); + + O_WDR_OE <= not W_8N_Q(7); + O_DIP_OE <= not W_8N_Q(6); + O_SW1_OE <= not W_8N_Q(5); + O_SW0_OE <= not W_8N_Q(4); + O_OBJ_RAM_RD <= not W_8N_Q(3); + O_VID_RAM_RD <= not W_8N_Q(2); +-- UNUSED <= not W_8N_Q(1); + O_CPU_RAM_RD <= not W_8N_Q(0); + + O_PITCH <= not W_8M_Q(7); +-- STARS_ON_ENA <= not W_8M_Q(6); + O_SOUND_WE <= not W_8M_Q(5); + O_DRIVER_WE <= not W_8M_Q(4); + O_OBJ_RAM_WR <= not W_8M_Q(3); + O_VID_RAM_WR <= not W_8M_Q(2); +-- UNUSED <= not W_8M_Q(1); + O_CPU_RAM_WR <= not W_8M_Q(0); + + ----- Parts 9N --------- + + process(I_CLK_12M, I_RSTn) + begin + if (I_RSTn = '0') then + W_9N_Q <= (others => '0'); + elsif rising_edge(I_CLK_12M) then + if (W_8M_Q(6) = '0') then + case I_CPU_A(2 downto 0) is + when "000" => W_9N_Q(0) <= I_CPU_D; + when "001" => W_9N_Q(1) <= I_CPU_D; + when "010" => W_9N_Q(2) <= I_CPU_D; + when "011" => W_9N_Q(3) <= I_CPU_D; + when "100" => W_9N_Q(4) <= I_CPU_D; + when "101" => W_9N_Q(5) <= I_CPU_D; + when "110" => W_9N_Q(6) <= I_CPU_D; + when "111" => W_9N_Q(7) <= I_CPU_D; + when others => null; + end case; + end if; + end if; + end process; + + O_STARS_ON <= W_9N_Q(4); + O_H_FLIP <= W_9N_Q(6); + O_V_FLIP <= W_9N_Q(7); + +end RTL; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_bram.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_bram.vhd new file mode 100644 index 00000000..a6df1ce1 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_bram.vhd @@ -0,0 +1,182 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA & GALAXIAN +-- FPGA BLOCK RAM I/F (XILINX SPARTAN) +-- +-- Version : 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- mc_col_rom(6L) added by k.Degawa +-- +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. K.Degawa +-- 2004- 9-18 added Xilinx Device K.Degawa +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_top.v use +entity MC_CPU_RAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(9 downto 0); + I_D : in std_logic_vector(7 downto 0); + I_WE : in std_logic; + I_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) + ); +end; +architecture RTL of MC_CPU_RAM is + + signal W_D : std_logic_vector(7 downto 0) := (others => '0'); +begin + O_D <= W_D when I_OE ='1' else (others=>'0'); + + ram_inst : work.spram generic map(10,8) + port map + ( + address => I_ADDR, + clock => I_CLK, + data => I_D, + wren => I_WE, + q => W_D + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_OBJ_RAM is + port( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(7 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(7 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); + end; + +architecture RTL of MC_OBJ_RAM is +begin + + ram_inst : work.dpram generic map(8,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_VID_RAM is + port ( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(9 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(9 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of MC_VID_RAM is +begin + ram_inst : work.dpram generic map(10,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_LRAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(7 downto 0); + I_D : in std_logic_vector(4 downto 0); + I_WE : in std_logic; + O_Dn : out std_logic_vector(4 downto 0) + ); +end; + +architecture RTL of MC_LRAM is + signal W_D : std_logic_vector(4 downto 0) := (others => '0'); +begin + + O_Dn <= not W_D; + + ram_inst : work.dpram generic map(8,5) + port map + ( + clock_a => I_CLK, + address_a => I_ADDR, + data_a => I_D, + wren_a => not I_WE, + + clock_b => not I_CLK, + address_b => I_ADDR, + data_b => (others => '0'), + q_b => W_D, + enable_b => '1', + wren_b => '0' + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_clocks.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_clocks.vhd new file mode 100644 index 00000000..014e6f7a --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_clocks.vhd @@ -0,0 +1,88 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA CLOCK GEN +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +----------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library unisim; + use unisim.vcomponents.all; + +entity CLOCKGEN is +port ( + CLKIN_IN : in std_logic; + RST_IN : in std_logic; + -- + O_CLK_24M : out std_logic; + O_CLK_18M : out std_logic; + O_CLK_12M : out std_logic; + O_CLK_06M : out std_logic +); +end; + +architecture RTL of CLOCKGEN is + signal state : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr1 : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr2 : std_logic_vector(2 downto 0) := (others => '0'); + signal CLKFB_IN : std_logic := '0'; + signal CLK0_BUF : std_logic := '0'; + signal CLKFX_BUF : std_logic := '0'; + signal CLK_72M : std_logic := '0'; + signal I_DCM_LOCKED : std_logic := '0'; + +begin + dcm_inst : DCM_SP + generic map ( + CLKFX_MULTIPLY => 9, + CLKFX_DIVIDE => 4, + CLKIN_PERIOD => 31.25 + ) + port map ( + CLKIN => CLKIN_IN, + CLKFB => CLKFB_IN, + RST => RST_IN, + CLK0 => CLK0_BUF, + CLKFX => CLKFX_BUF, + LOCKED => I_DCM_LOCKED + ); + + BUFG0 : BUFG port map (I=> CLK0_BUF, O => CLKFB_IN); + BUFG1 : BUFG port map (I=> CLKFX_BUF, O => CLK_72M); + O_CLK_06M <= ctr2(2); + O_CLK_12M <= ctr2(1); + O_CLK_24M <= ctr2(0); + O_CLK_18M <= ctr1(1); + + -- generate all clocks, 36Mhz, 18Mhz, 24Mhz, 12Mhz and 6Mhz + process(CLK_72M) + begin + if rising_edge(CLK_72M) then + if (I_DCM_LOCKED = '0') then + state <= "00"; + ctr1 <= (others=>'0'); + ctr2 <= (others=>'0'); + else + ctr1 <= ctr1 + 1; + case state is + when "00" => state <= "01"; ctr2 <= ctr2 + 1; + when "01" => state <= "10"; ctr2 <= ctr2 + 1; + when "10" => state <= "00"; + when "11" => state <= "00"; + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_col_pal.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_col_pal.vhd new file mode 100644 index 00000000..c4dc06ad --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_col_pal.vhd @@ -0,0 +1,78 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA COLOR-PALETTE +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-18 added Xilinx Device. K.Degawa +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; +-- use ieee.numeric_std.all; + +--library UNISIM; +-- use UNISIM.Vcomponents.all; + +entity MC_COL_PAL is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_VID : in std_logic_vector(1 downto 0); + I_COL : in std_logic_vector(2 downto 0); + I_C_BLnX : in std_logic; + + O_C_BLXn : out std_logic; + O_STARS_OFFn : out std_logic; + O_R : out std_logic_vector(2 downto 0); + O_G : out std_logic_vector(2 downto 0); + O_B : out std_logic_vector(2 downto 0) +); +end; + +architecture RTL of MC_COL_PAL is + --- Parts 6M -------------------------------------------------------- + signal W_COL_ROM_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6M_DI : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_DO : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_CLR : std_logic := '0'; + +begin + W_6M_DI <= I_COL(2 downto 0) & I_VID(1 downto 0) & not (I_VID(0) or I_VID(1)) & I_C_BLnX; + W_6M_CLR <= W_6M_DI(0) or W_6M_DO(0); + O_C_BLXn <= W_6M_DI(0) or W_6M_DO(0); + O_STARS_OFFn <= W_6M_DO(1); + +--always@(posedge I_CLK_6M or negedge W_6M_CLR) + process(I_CLK_6M, W_6M_CLR) + begin + if (W_6M_CLR = '0') then + W_6M_DO <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + W_6M_DO <= W_6M_DI; + end if; + end process; + + --- COL ROM -------------------------------------------------------- +--wire W_COL_ROM_OEn = W_6M_DO[1]; + + galaxian_6l : entity work.GALAXIAN_6L + port map ( + CLK => I_CLK_12M, + ADDR => W_6M_DO(6 downto 2), + DATA => W_COL_ROM_DO + ); + + --- VID OUT -------------------------------------------------------- + O_R <= W_COL_ROM_DO(2 downto 0); + O_G <= W_COL_ROM_DO(5 downto 3); + O_B <= W_COL_ROM_DO(7 downto 6) & "0"; + +end; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_hv_count.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_hv_count.vhd new file mode 100644 index 00000000..f310321b --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_hv_count.vhd @@ -0,0 +1,145 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA H & V COUNTER +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 +----------------------------------------------------------------------- +-- MoonCrest hv_count +-- H_CNT 0 - 255 , 384 - 511 Total 384 count +-- V_CNT 0 - 255 , 504 - 511 Total 264 count +------------------------------------------------------------------------------------------- +-- H_CNT[0], H_CNT[1], H_CNT[2], H_CNT[3], H_CNT[4], H_CNT[5], H_CNT[6], H_CNT[7], H_CNT[8], +-- 1 H 2 H 4 H 8 H 16 H 32 H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT[0], V_CNT[1], V_CNT[2], V_CNT[3], V_CNT[4], V_CNT[5], V_CNT[6], V_CNT[7] +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_HV_COUNT is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + O_H_CNT : out std_logic_vector(8 downto 0); + O_H_SYNC : out std_logic; + O_H_BL : out std_logic; + O_V_BL2n : out std_logic; + O_V_CNT : out std_logic_vector(7 downto 0); + O_V_SYNC : out std_logic; + O_V_BLn : out std_logic; + O_C_BLn : out std_logic + ); +end; + +architecture RTL of MC_HV_COUNT is + signal H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal V_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal H_SYNC : std_logic := '0'; + signal H_CLK : std_logic := '0'; + signal H_BL : std_logic := '0'; + signal V_BLn : std_logic := '0'; + signal V_BL2n : std_logic := '0'; + +begin +--------- H_COUNT ---------------------------------------- + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if (H_CNT = 255) then + H_CNT <= std_logic_vector(to_unsigned(384, H_CNT'length)); + else + H_CNT <= H_CNT + 1 ; + end if; + end if; + end process; + + O_H_CNT <= H_CNT; + +--------- H_SYNC ---------------------------------------- + H_CLK <= H_CNT(4); + process(H_CLK, H_CNT(8)) + begin + if (H_CNT(8) = '0') then + H_SYNC <= '0'; + elsif rising_edge(H_CLK) then + H_SYNC <= (not H_CNT(6) ) and H_CNT(5); + end if; + end process; + + O_H_SYNC <= H_SYNC; + +--------- H_BL ------------------------------------------ + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if H_CNT = 387 then + H_BL <= '1'; + elsif H_CNT = 503 then + H_BL <= '0'; + end if; + end if; + end process; + + O_H_BL <= H_BL; + +--------- V_COUNT ---------------------------------------- + process(H_SYNC, I_RSTn) + begin + if (I_RSTn = '0') then + V_CNT <= (others => '0'); + elsif rising_edge(H_SYNC) then + if (V_CNT = 255) then + V_CNT <= std_logic_vector(to_unsigned(504, V_CNT'length)); + else + V_CNT <= V_CNT + 1 ; + end if; + end if; + end process; + + O_V_CNT <= V_CNT(7 downto 0); + O_V_SYNC <= V_CNT(8); + +--------- V_BLn ------------------------------------------ + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BLn <= '0'; + elsif V_CNT(7 downto 0) = 15 then + V_BLn <= '1'; + end if; + end if; + end process; + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BL2n <= '0'; + elsif V_CNT(7 downto 0) = 16 then + V_BL2n <= '1'; + end if; + end if; + end process; + + O_V_BLn <= V_BLn; + O_V_BL2n <= V_BL2n; +------- C_BLn ------------------------------------------ + O_C_BLn <= V_BLn and (not H_CNT(8)); + +end; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_inport.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_inport.vhd new file mode 100644 index 00000000..496f01ad --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_inport.vhd @@ -0,0 +1,71 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA INPORT +-- +-- Version : 1.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004-4-30 galaxian modify by K.DEGAWA +----------------------------------------------------------------------- + +-- DIP SW 0 1 2 3 4 5 +----------------------------------------------------------------- +-- COIN CHUTE +-- 1 COIN/1 PLAY 1'b0 1'b0 +-- 2 COIN/1 PLAY 1'b1 1'b0 +-- 1 COIN/2 PLAY 1'b0 1'b1 +-- FREE PLAY 1'b1 1'b1 +-- BOUNS +-- 1'b0 1'b0 +-- 1'b1 1'b0 +-- 1'b0 1'b1 +-- 1'b1 1'b1 +-- LIVES +-- 2 1'b0 +-- 3 1'b1 +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_INPORT is +port ( + I_COIN1 : in std_logic; -- active high + I_COIN2 : in std_logic; -- active high + I_1P_LE : in std_logic; -- active high + I_1P_RI : in std_logic; -- active high + I_1P_SH : in std_logic; -- active high + I_2P_LE : in std_logic; + I_2P_RI : in std_logic; + I_2P_SH : in std_logic; + I_1P_START : in std_logic; -- active high + I_2P_START : in std_logic; -- active high + I_SW0_OE : in std_logic; + I_SW1_OE : in std_logic; + I_DIP_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) +); + +end; + +architecture RTL of MC_INPORT is + + + signal W_SW0_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SW1_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_DIP_DO : std_logic_vector(7 downto 0) := (others => '0'); + +begin + + W_SW0_DO <= x"00" when I_SW0_OE = '0' else "00" & '0' & I_1P_SH & I_1P_RI & I_1P_LE & I_COIN2 & I_COIN1; + W_SW1_DO <= x"00" when I_SW1_OE = '0' else "000" & I_2P_SH & I_2P_RI & I_2P_LE & I_2P_START & I_1P_START; + W_DIP_DO <= x"00" when I_DIP_OE = '0' else "00000100"; + O_D <= W_SW0_DO or W_SW1_DO or W_DIP_DO ; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_ld_pls.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_ld_pls.vhd new file mode 100644 index 00000000..0945fe35 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_ld_pls.vhd @@ -0,0 +1,115 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA VIDEO-LD_PLS_GEN +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_LD_PLS is + port ( + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_3D_DI : in std_logic; + + O_LDn : out std_logic; + O_CNTRLDn : out std_logic; + O_CNTRCLRn : out std_logic; + O_COLLn : out std_logic; + O_VPLn : out std_logic; + O_OBJDATALn : out std_logic; + O_MLDn : out std_logic; + O_SLDn : out std_logic + ); +end; + +architecture RTL of MC_LD_PLS is + signal W_4C1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C1_Q3 : std_logic := '0'; + signal W_4C2_B : std_logic := '0'; + signal W_4D1_G : std_logic := '0'; + signal W_4D1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4D2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_5C_Q : std_logic := '0'; + signal W_HCNT : std_logic := '0'; +begin + O_LDn <= W_4D1_G; + O_CNTRLDn <= W_4D1_Q(2); + O_CNTRCLRn <= W_4D1_Q(0); + O_COLLn <= W_4D2_Q(2); + O_VPLn <= W_4D2_Q(0); + O_OBJDATALn <= W_4C1_Q(2); + O_MLDn <= W_4C2_Q(0); + O_SLDn <= W_4C2_Q(1); + W_4D1_G <= not (I_H_CNT(0) and I_H_CNT(1) and I_H_CNT(2)); + W_HCNT <= not (I_H_CNT(6) and I_H_CNT(5) and I_H_CNT(4) and I_H_CNT(3)); + -- Parts 4D + u_4d1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_G, + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q =>W_4D1_Q + ); + + u_4d2 : entity work.LOGIC_74XX139 + port map( + I_G => W_5C_Q, + I_Sel(1) => I_H_CNT(2), + I_Sel(0) => I_H_CNT(1), + O_Q => W_4D2_Q + ); + + -- Parts 4C + u_4c1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D2_Q(1), + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q => W_4C1_Q + ); + + u_4c2 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_Q(3), + I_Sel(1) => W_4C2_B, + I_Sel(0) => W_HCNT, + O_Q => W_4C2_Q + ); + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_5C_Q <= I_H_CNT(0); + end if; + end process; + + -- 2004-9-22 added + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + W_4C1_Q3 <= W_4C1_Q(3); + end if; + end process; + + process(W_4C1_Q3) + begin + if rising_edge(W_4C1_Q3) then + W_4C2_B <= I_3D_DI; + end if; + end process; + +end RTL; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_logic.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_logic.vhd new file mode 100644 index 00000000..5dae8a87 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_logic.vhd @@ -0,0 +1,92 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA LOGIC IP MODULE +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx138 +-- 3-to-8 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX138 is + port ( + I_G1 : in std_logic; + I_G2a : in std_logic; + I_G2b : in std_logic; + I_Sel : in std_logic_vector(2 downto 0); + O_Q : out std_logic_vector(7 downto 0) + ); +end logic_74xx138; + +architecture RTL of LOGIC_74XX138 is + signal I_G : std_logic_vector(2 downto 0) := (others => '0'); + +begin + I_G <= I_G1 & I_G2a & I_G2b; + + xx138 : process(I_G, I_Sel) + begin + if(I_G = "100" ) then + case I_Sel is + when "000" => O_Q <= "11111110"; + when "001" => O_Q <= "11111101"; + when "010" => O_Q <= "11111011"; + when "011" => O_Q <= "11110111"; + when "100" => O_Q <= "11101111"; + when "101" => O_Q <= "11011111"; + when "110" => O_Q <= "10111111"; + when "111" => O_Q <= "01111111"; + when others => null; + end case; + else + O_Q <= (others => '1'); + end if; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx139 +-- 2-to-4 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX139 is + port ( + I_G : in std_logic; + I_Sel : in std_logic_vector(1 downto 0); + O_Q : out std_logic_vector(3 downto 0) + ); +end; + +architecture RTL of LOGIC_74XX139 is +begin + xx139 : process (I_G, I_Sel) + begin + if I_G = '0' then + case I_Sel is + when "00" => O_Q <= "1110"; + when "01" => O_Q <= "1101"; + when "10" => O_Q <= "1011"; + when "11" => O_Q <= "0111"; + when others => null; + end case; + else + O_Q <= "1111"; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_missile.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_missile.vhd new file mode 100644 index 00000000..c5aa6633 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_missile.vhd @@ -0,0 +1,107 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA VIDEO-MISSILE +---- +---- Version : 2.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_MISSILE is + port( + I_CLK_6M : in std_logic; + I_CLK_18M : in std_logic; + I_C_BLn_X : in std_logic; + I_MLDn : in std_logic; + I_SLDn : in std_logic; + I_HPOS : in std_logic_vector (7 downto 0); + + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic + ); +end; + +architecture RTL of MC_MISSILE is + signal W_45R_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_45S_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_5P1_Q : std_logic := '0'; + signal W_5P2_Q : std_logic := '0'; + signal W_5P1_CLK : std_logic := '0'; + signal W_5P2_CLK : std_logic := '0'; +begin + + O_MISSILEn <= W_5P1_CLK; + O_SHELLn <= W_5P2_CLK; + + -- missile counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if (I_MLDn = '0') then + W_45R_Q <= I_HPOS; + else + if (I_C_BLn_X = '1') then + W_45R_Q <= W_45R_Q + 1; + if (W_45R_Q(7 downto 2) = "111111") and W_5P1_Q = '1' then + W_5P1_CLK <= '0'; + else + W_5P1_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- shell counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if(I_SLDn = '0') then + W_45S_Q <= I_HPOS; + else + if(I_C_BLn_X = '1') then + W_45S_Q <= W_45S_Q + 1; + if (W_45S_Q(7 downto 2) = "111111") and W_5P2_Q = '1' then + W_5P2_CLK <= '0'; + else + W_5P2_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_MLDn) and clock active on rising edge (W_5P1_CLK) + process(W_5P1_CLK, I_MLDn) + begin + if (I_MLDn = '0') then + W_5P1_Q <= '1'; + elsif rising_edge(W_5P1_CLK) then + W_5P1_Q <= '0'; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_SLDn) and clock active on rising edge (W_5P2_CLK) + process(W_5P2_CLK, I_SLDn) + begin + if (I_SLDn = '0') then + W_5P2_Q <= '1'; + elsif rising_edge(W_5P2_CLK) then + W_5P2_Q <= '0'; + end if; + end process; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_sound_a.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_sound_a.vhd new file mode 100644 index 00000000..ee0c66be --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_sound_a.vhd @@ -0,0 +1,117 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA SOUND I/F +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + use IEEE.std_logic_arith.all; + +entity MC_SOUND_A is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT1 : in std_logic; + I_BD : in std_logic_vector(7 downto 0); + I_PITCH : in std_logic; + I_VOL1 : in std_logic; + I_VOL2 : in std_logic; + + O_SDAT : out std_logic_vector(7 downto 0); + O_DO : out std_logic_vector(3 downto 0) +); +end; + +architecture RTL of MC_SOUND_A is + signal W_PITCH : std_logic := '0'; + signal W_89K_LDn : std_logic := '0'; + signal W_89K_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_89K_LDATA : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6T_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_SDAT0 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT2 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT3 : std_logic_vector(7 downto 0) := (others => '0'); + +begin + O_DO <= W_6T_Q; + + process (I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_PITCH <= I_PITCH; + if (W_89K_Q = x"ff") then + W_89K_LDn <= '0' ; + else + W_89K_LDn <= '1' ; + end if; + end if; + end process; + + -- Parts 9J + process (W_PITCH) + begin + if falling_edge(W_PITCH) then + W_89K_LDATA <= I_BD; + end if; + end process; + + process (I_H_CNT1) + begin + if rising_edge(I_H_CNT1) then + if (W_89K_LDn = '0') then + W_89K_Q <= W_89K_LDATA; + else + W_89K_Q <= W_89K_Q + 1; + end if; + end if; + end process; + + process (W_89K_LDn) + begin + if falling_edge(W_89K_LDn) then + W_6T_Q <= W_6T_Q + 1; + end if; + end process; + + process (I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + O_SDAT <= (x"14" + W_SDAT3) + (W_SDAT0 + W_SDAT2); + + if W_6T_Q(0)='1' then + W_SDAT0 <= x"2a"; + else + W_SDAT0 <= (others => '0'); + end if; + + if W_6T_Q(2)='1' then + if I_VOL1 = '1' then + W_SDAT2 <= x"69"; + else + W_SDAT2 <= x"39"; + end if; + else + W_SDAT2 <= (others => '0'); + end if; + + if (W_6T_Q(3)='1') and (I_VOL2 = '1') then + W_SDAT3 <= x"48" ; + else + W_SDAT3 <= (others => '0'); + end if; + + end if; + end process; + +end; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_sound_b.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_sound_b.vhd new file mode 100644 index 00000000..b74e4bb1 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_sound_b.vhd @@ -0,0 +1,253 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA WAVE SOUND +---- +---- Version : 1.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does no guarantee this program. +---- You can use this at your own risk. +---- +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--pragma translate_off +-- use ieee.std_logic_textio.all; +-- use std.textio.all; +--pragma translate_on + +entity MC_SOUND_B is + port( + I_CLK1 : in std_logic; -- 6MHz + I_RSTn : in std_logic; + I_SW : in std_logic_vector( 2 downto 0); + I_DAC : in std_logic_vector( 3 downto 0); + I_FS : in std_logic_vector( 2 downto 0); + O_SDAT : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_B is +constant sample_time : integer := 557; -- sample time : 557 = 11025Hz, 557/2 = 22050Hz +constant fire_cnt : std_logic_vector(15 downto 0) := x"2000"; +constant hit_cnt : std_logic_vector(15 downto 0) := x"2000"; + +signal sample : std_logic_vector(10 downto 0) := (others => '0'); +signal sample_pls : std_logic := '0'; +signal s0_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s0_trg : std_logic := '0'; +signal s1_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s1_trg : std_logic := '0'; +signal fire_addr : std_logic_vector(15 downto 0) := (others => '0'); +signal hit_addr : std_logic_vector(15 downto 0) := (others => '0'); + +signal WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); +signal WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + +signal W_VCO1_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO1_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal VCO_CTR : std_logic_vector(24 downto 0) := (others => '0'); + +signal SDAT : std_logic_vector(10 downto 0) := (others => '0'); + +begin + -- ideally we should divide by 5 because this is the sum of 5 channels + -- but in practice we divide by 4 and just clip sounds that are too loud. + O_SDAT <= SDAT(9 downto 2) when SDAT(10) = '0' else (others=>'1'); -- clip overrange sounds + + process(I_CLK1) + begin + if rising_edge(I_CLK1) then + SDAT <= ("000" & W_VCO3_OUT) + ( ( ("000" & W_VCO2_OUT) + ("000" & W_VCO1_OUT) ) + ( ("000" & WAV_D0) + ("000" & WAV_D1) ) ); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + sample <= (others => '0'); + sample_pls <= '0'; + elsif rising_edge(I_CLK1) then + if (sample = sample_time - 1) then + sample <= (others => '0'); + sample_pls <= '1'; + else + sample <= sample + 1; + sample_pls <= '0'; + end if; + end if; + end process; + +------------- FIRE SOUND ------------------------------------------ + mc_roms_fire : entity work.GAL_FIR + port map ( + CLK => I_CLK1, + ADDR => fire_addr(12 downto 0), + DATA => WAV_D0 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s0_trg_ff <= (others => '0'); + s0_trg <= '0'; + elsif rising_edge(I_CLK1) then + s0_trg_ff(0) <= I_SW(0); + s0_trg_ff(1) <= s0_trg_ff(0); + s0_trg <= not s0_trg_ff(1) and s0_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + fire_addr <= fire_cnt; + elsif rising_edge(I_CLK1) then + if (s0_trg = '1') then + fire_addr <= (others => '0'); + else + if(sample_pls = '1') then + if(fire_addr <= fire_cnt) then + fire_addr <= fire_addr + 1; + else + fire_addr <= fire_addr ; + end if; + end if; + end if; + end if; + end process; + +------------- HIT SOUND ------------------------------------------ + mc_roms_hit : entity work.GAL_HIT + port map ( + CLK => I_CLK1, + ADDR => hit_addr(12 downto 0), + DATA => WAV_D1 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s1_trg_ff <= (others => '0'); + s1_trg <= '0'; + elsif rising_edge(I_CLK1) then + s1_trg_ff(0) <= I_SW(1); + s1_trg_ff(1) <= s1_trg_ff(0); + s1_trg <= not s1_trg_ff(1) and s1_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + hit_addr <= hit_cnt; + elsif rising_edge(I_CLK1) then + if (s1_trg = '1') then + hit_addr <= (others => '0'); + else + if (sample_pls = '1') then + if (hit_addr <= hit_cnt) then + hit_addr <= hit_addr + 1 ; + else + hit_addr <= hit_addr ; + end if; + end if; + end if; + end if; + end process; + +--------------- EFFECT SOUND --------------------------------------- + +-- 9R modulator voltage generator based on DAC value + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + VCO_CTR <= (others=>'0'); + elsif rising_edge(I_CLK1) then + VCO_CTR <= VCO_CTR + (not I_DAC); + end if; + end process; + + -- modulator frequency lookup tables for the three VCOs + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + elsif rising_edge(I_CLK1) then + case VCO_CTR(23 downto 19) is + when "00000" => W_VCO1_STEP <= x"2A"; W_VCO2_STEP <= x"3A"; W_VCO3_STEP <= x"54"; + when "00001" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"39"; W_VCO3_STEP <= x"53"; + when "00010" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"38"; W_VCO3_STEP <= x"52"; + when "00011" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"50"; + when "00100" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"4F"; + when "00101" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"36"; W_VCO3_STEP <= x"4E"; + when "00110" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"35"; W_VCO3_STEP <= x"4D"; + when "00111" => W_VCO1_STEP <= x"26"; W_VCO2_STEP <= x"34"; W_VCO3_STEP <= x"4C"; + when "01000" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"4A"; + when "01001" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"49"; + when "01010" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"32"; W_VCO3_STEP <= x"48"; + when "01011" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"31"; W_VCO3_STEP <= x"47"; + when "01100" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"30"; W_VCO3_STEP <= x"46"; + when "01101" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"44"; + when "01110" => W_VCO1_STEP <= x"22"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"43"; + when "01111" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2E"; W_VCO3_STEP <= x"42"; + when "10000" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2D"; W_VCO3_STEP <= x"41"; + when "10001" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2C"; W_VCO3_STEP <= x"40"; + when "10010" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3F"; + when "10011" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3D"; + when "10100" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2A"; W_VCO3_STEP <= x"3C"; + when "10101" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"29"; W_VCO3_STEP <= x"3B"; + when "10110" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"3A"; + when "10111" => W_VCO1_STEP <= x"1D"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"39"; + when "11000" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"27"; W_VCO3_STEP <= x"37"; + when "11001" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"26"; W_VCO3_STEP <= x"36"; + when "11010" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"25"; W_VCO3_STEP <= x"35"; + when "11011" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"34"; + when "11100" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"33"; + when "11101" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"23"; W_VCO3_STEP <= x"32"; + when "11110" => W_VCO1_STEP <= x"19"; W_VCO2_STEP <= x"22"; W_VCO3_STEP <= x"30"; + when "11111" => W_VCO1_STEP <= x"18"; W_VCO2_STEP <= x"21"; W_VCO3_STEP <= x"2F"; + when others => null; + end case; + end if; + end process; + +-- 8R VCO 240Hz - 140Hz (8) + mc_vco1 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(0), + I_STEP => W_VCO1_STEP, + O_WAV => W_VCO1_OUT + ); + +-- 8S VCO 330Hz - 190Hz (11) + mc_vco2 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(1), + I_STEP => W_VCO2_STEP, + O_WAV => W_VCO2_OUT + ); + +-- 8T VCO 480Hz - 270Hz (16) + mc_vco3 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(2), + I_STEP => W_VCO3_STEP, + O_WAV => W_VCO3_OUT + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_sound_vco.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_sound_vco.vhd new file mode 100644 index 00000000..e2a63e85 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_sound_vco.vhd @@ -0,0 +1,49 @@ +-------------------------------------------------------------------------------- +---- FPGA VCO +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +use work.sine_package.all; + +-- O_CLK = (I_CLK / 2^20) * I_STEP +entity MC_SOUND_VCO is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + I_FS : in std_logic; + I_STEP : in std_logic_vector( 7 downto 0); + O_WAV : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_VCO is + signal VCO1_CTR : std_logic_vector(19 downto 0) := (others => '0'); + signal sine : std_logic_vector(14 downto 0) := (others => '0'); + +begin + O_WAV <= sine(14 downto 7); + process(I_CLK, I_RSTn) + begin + if (I_RSTn = '0') then + VCO1_CTR <= (others=>'0'); + elsif rising_edge(I_CLK) then + if I_FS = '1' then + VCO1_CTR <= VCO1_CTR + I_STEP; + case VCO1_CTR(19 downto 18) is + when "00" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "01" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when "10" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "11" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_stars.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_stars.vhd new file mode 100644 index 00000000..b91197b3 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_stars.vhd @@ -0,0 +1,90 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA STARS +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity MC_STARS is + port ( + I_CLK_18M : in std_logic; + I_CLK_6M : in std_logic; + I_H_FLIP : in std_logic; + I_V_SYNC : in std_logic; + I_8HF : in std_logic; + I_256HnX : in std_logic; + I_1VF : in std_logic; + I_2V : in std_logic; + I_STARS_ON : in std_logic; + I_STARS_OFFn : in std_logic; + + O_R : out std_logic_vector(1 downto 0); + O_G : out std_logic_vector(1 downto 0); + O_B : out std_logic_vector(1 downto 0); + O_NOISE : out std_logic + ); +end; + +architecture RTL of MC_STARS is + signal CLK_1C : std_logic := '0'; + signal W_2D_Qn : std_logic := '0'; + + signal W_3B : std_logic := '0'; + signal noise : std_logic := '0'; + signal W_2A : std_logic := '0'; + signal W_4P : std_logic := '0'; + signal CLK_1AB : std_logic := '0'; + signal W_1AB_Q : std_logic_vector(15 downto 0) := (others => '0'); + signal W_1C_Q : std_logic_vector( 1 downto 0) := (others => '0'); +begin + O_R <= (W_1AB_Q( 9) & W_1AB_Q (8) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_G <= (W_1AB_Q(11) & W_1AB_Q(10) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_B <= (W_1AB_Q(13) & W_1AB_Q(12) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + + CLK_1C <= not (I_CLK_18M and (not I_CLK_6M )and (not I_V_SYNC) and I_256HnX); + CLK_1AB <= not (CLK_1C or (not (I_H_FLIP or W_1C_Q(1)))); + W_3B <= W_2D_Qn xor W_1AB_Q(4); + + W_2A <= '0' when (W_1AB_Q(7 downto 0) = x"ff") else '1'; + W_4P <= not (( I_8HF xor I_1VF ) and W_2D_Qn and I_STARS_OFFn); + + O_NOISE <= noise ; + + process(I_2V) + begin + if rising_edge(I_2V) then + noise <= W_2D_Qn; + end if; + end process; + + process(CLK_1C, I_V_SYNC) + begin + if(I_V_SYNC = '1') then + W_1C_Q <= (others => '0'); + elsif rising_edge(CLK_1C) then + W_1C_Q <= W_1C_Q(0) & '1'; + end if; + end process; + + process(CLK_1AB, I_STARS_ON) + begin + if(I_STARS_ON = '0') then + W_1AB_Q <= (others => '0'); + W_2D_Qn <= '1'; + elsif rising_edge(CLK_1AB) then + W_1AB_Q <= W_1AB_Q(14 downto 0) & W_3B; + W_2D_Qn <= not W_1AB_Q(15); + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_video.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_video.vhd new file mode 100644 index 00000000..dbe0d0d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mc_video.vhd @@ -0,0 +1,433 @@ +-------------------------------------------------------------------------------- +---- FPGA GALAXIAN VIDEO +---- +---- Version : 2.50 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 4-30 galaxian modify by K.DEGAWA +---- 2004- 5- 6 first release. +---- 2004- 8-23 Improvement with T80-IP. +---- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +-------------------------------------------------------------------------------- + +------------------------------------------------------------------------------------------- +-- H_CNT(0), H_CNT(1), H_CNT(2), H_CNT(3), H_CNT(4), H_CNT(5), H_CNT(6), H_CNT(7), H_CNT(8), +-- 1 H 2 H 4 H 8 H 16 H 32H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT(0), V_CNT(1), V_CNT(2), V_CNT(3), V_CNT(4), V_CNT(5), V_CNT(6), V_CNT(7) +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_VIDEO is + port( + I_CLK_18M : in std_logic; + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_V_CNT : in std_logic_vector(7 downto 0); + I_H_FLIP : in std_logic; + I_V_FLIP : in std_logic; + I_V_BLn : in std_logic; + I_C_BLn : in std_logic; + + I_A : in std_logic_vector(9 downto 0); + I_BD : in std_logic_vector(7 downto 0); + I_OBJ_SUB_A : in std_logic_vector(2 downto 0); + I_OBJ_RAM_RQ : in std_logic; + I_OBJ_RAM_RD : in std_logic; + I_OBJ_RAM_WR : in std_logic; + I_VID_RAM_RD : in std_logic; + I_VID_RAM_WR : in std_logic; + I_DRIVER_WR : in std_logic; + + O_C_BLnX : out std_logic; + O_8HF : out std_logic; + O_256HnX : out std_logic; + O_1VF : out std_logic; + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic; + + O_BD : out std_logic_vector(7 downto 0); + O_VID : out std_logic_vector(1 downto 0); + O_COL : out std_logic_vector(2 downto 0) + ); +end; + +architecture RTL of MC_VIDEO is + + signal WB_LDn : std_logic := '0'; + signal WB_CNTRLDn : std_logic := '0'; + signal WB_CNTRCLRn : std_logic := '0'; + signal WB_COLLn : std_logic := '0'; + signal WB_VPLn : std_logic := '0'; + signal WB_OBJDATALn : std_logic := '0'; + signal WB_MLDn : std_logic := '0'; + signal WB_SLDn : std_logic := '0'; + signal W_3D : std_logic := '0'; + signal W_LDn : std_logic := '0'; + signal W_CNTRLDn : std_logic := '0'; + signal W_CNTRCLRn : std_logic := '0'; + signal W_COLLn : std_logic := '0'; + signal W_VPLn : std_logic := '0'; + signal W_OBJDATALn : std_logic := '0'; + signal W_MLDn : std_logic := '0'; + signal W_SLDn : std_logic := '0'; + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_H_POSI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_2M_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6K_Q : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_6P_Q : std_logic_vector( 6 downto 0) := (others => '0'); + signal W_45T_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2KL : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2HJ : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_RV : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_RC : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_O_OBJ_ROM_A : std_logic_vector(10 downto 0) := (others => '0'); + signal W_VID_RAM_A : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AA : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AB : std_logic_vector(11 downto 0) := (others => '0'); + signal C_2HJ : std_logic_vector( 1 downto 0) := (others => '0'); + signal C_2KL : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_CD : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_1M : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_A : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_B : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_Y : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_LRAM_DI : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_LRAM_DO : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_1H_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_1K_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_LRAM_A : std_logic_vector( 7 downto 0) := (others => '0'); +-- signal W_OBJ_RAM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_HF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_45N_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6J_Q : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DA : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DB : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_256HnX : std_logic := '0'; + signal W_2N : std_logic := '0'; + signal W_45T_CLR : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_H_FLIP1 : std_logic := '0'; + signal W_H_FLIP2 : std_logic := '0'; + signal W_H_FLIP1X : std_logic := '0'; + signal W_H_FLIP2X : std_logic := '0'; + signal W_LRAM_AND : std_logic := '0'; + signal W_RAW0 : std_logic := '0'; + signal W_RAW1 : std_logic := '0'; + signal W_RAW_OR : std_logic := '0'; + signal W_SRCLK : std_logic := '0'; + signal W_SRLD : std_logic := '0'; + signal W_VID_RAM_CS : std_logic := '0'; + signal W_CLK_6Mn : std_logic := '0'; + +begin + ld_pls : entity work.MC_LD_PLS + port map( + I_CLK_6M => I_CLK_6M, + I_H_CNT => I_H_CNT, + I_3D_DI => W_3D, + + O_LDn => WB_LDn, + O_CNTRLDn => WB_CNTRLDn, + O_CNTRCLRn => WB_CNTRCLRn, + O_COLLn => WB_COLLn, + O_VPLn => WB_VPLn, + O_OBJDATALn => WB_OBJDATALn, + O_MLDn => WB_MLDn, + O_SLDn => WB_SLDn + ); + + obj_ram : entity work.MC_OBJ_RAM + port map( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(7 downto 0), + I_WEA => I_OBJ_RAM_WR, + I_CEA => I_OBJ_RAM_RQ, + I_DA => I_BD, + O_DA => W_OBJ_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_OBJ_RAM_AB, + I_WEB => '0', + I_CEB => '1', + I_DB => x"00", + O_DB => W_OBJ_RAM_DOB + ); + + lram : entity work.MC_LRAM + port map( + I_CLK => I_CLK_18M, + I_ADDR => W_LRAM_A, + I_WE => W_CLK_6Mn, + I_D => W_LRAM_DI, + O_Dn => W_LRAM_DO + ); + + missile : entity work.MC_MISSILE + port map( + I_CLK_18M => I_CLK_18M, + I_CLK_6M => I_CLK_6M, + I_C_BLn_X => W_C_BLnX, + I_MLDn => W_MLDn, + I_SLDn => W_SLDn, + I_HPOS => W_H_POSI, + O_MISSILEn => O_MISSILEn, + O_SHELLn => O_SHELLn + ); + + vid_ram : entity work.MC_VID_RAM + port map ( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(9 downto 0), + I_DA => W_VID_RAM_DI, + I_WEA => I_VID_RAM_WR, + I_CEA => W_VID_RAM_CS, + O_DA => W_VID_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_VID_RAM_A(9 downto 0), + I_DB => x"00", + I_WEB => '0', + I_CEB => '1', + O_DB => W_VID_RAM_DOB + ); + + -- 1K VID-Rom + k_rom : entity work.GALAXIAN_1K + port map ( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1K_D + ); + + -- 1H VID-Rom + h_rom : entity work.GALAXIAN_1H + port map( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1H_D + ); + +----------------------------------------------------------------------------------- + + process(I_CLK_12M) + begin + if falling_edge(I_CLK_12M) then + W_LDn <= WB_LDn; + W_CNTRLDn <= WB_CNTRLDn; + W_CNTRCLRn <= WB_CNTRCLRn; + W_COLLn <= WB_COLLn; + W_VPLn <= WB_VPLn; + W_OBJDATALn <= WB_OBJDATALn; + W_MLDn <= WB_MLDn; + W_SLDn <= WB_SLDn; + end if; + end process; + + W_CLK_6Mn <= not I_CLK_6M; + + W_6J_DA <= I_H_FLIP & W_HF_CNT(7) & W_HF_CNT(3) & I_H_CNT(2); + W_6J_DB <= W_OBJ_D(6) & ( W_HF_CNT(3) and I_H_CNT(1) ) & I_H_CNT(2) & I_H_CNT(1); + W_6J_Q <= W_6J_DB when I_H_CNT(8) = '1' else W_6J_DA; + + W_H_FLIP1 <= (not I_H_CNT(8)) and I_H_FLIP; + + W_HF_CNT(7 downto 3) <= not I_H_CNT(7 downto 3) when W_H_FLIP1 = '1' else I_H_CNT(7 downto 3); + W_VF_CNT <= not I_V_CNT when I_V_FLIP = '1' else I_V_CNT; + + O_8HF <= W_HF_CNT(3); + O_1VF <= W_VF_CNT(0); + W_H_FLIP2 <= W_6J_Q(3); + +-- Parts 4F,5F + W_OBJ_RAM_AB <= "0" & I_H_CNT(8) & W_6J_Q(2) & W_HF_CNT(6 downto 4) & W_6J_Q(1 downto 0); +-- W_OBJ_RAM_A <= W_OBJ_RAM_AB when I_OBJ_RAM_RQ = '0' else I_A(7 downto 0) ; + + process(I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_H_POSI <= W_OBJ_RAM_DOB; + end if; + end process; + + W_OBJ_RAM_D <= W_OBJ_RAM_DOA when I_OBJ_RAM_RD = '1' else (others => '0'); + +-- Parts 4L + process(W_OBJDATALn) + begin + if rising_edge(W_OBJDATALn) then + W_OBJ_D <= W_H_POSI; + end if; + end process; + +-- Parts 4,5N + W_45N_Q <= W_VF_CNT + W_H_POSI; + W_3D <= '0' when W_45N_Q = x"FF" else '1'; + + process(W_VPLn, I_V_BLn) + begin + if (I_V_BLn = '0') then + W_2M_Q <= (others => '0'); + elsif rising_edge(W_VPLn) then + W_2M_Q <= W_45N_Q; + end if; + end process; + + W_2N <= I_H_CNT(8) and W_OBJ_D(7); + W_1M <= W_2M_Q(3 downto 0) xor (W_2N & W_2N & W_2N & W_2N); + W_VID_RAM_CS <= I_VID_RAM_RD or I_VID_RAM_WR; + W_VID_RAM_DI <= I_BD when I_VID_RAM_WR = '1' else (others => '0'); + W_VID_RAM_AA <= (not ( W_2M_Q(7) and W_2M_Q(6) and W_2M_Q(5) and W_2M_Q(4))) & (not W_VID_RAM_CS) & "0000000000"; -- I_A(9:0) + W_VID_RAM_AB <= "00" & W_2M_Q(7 downto 4) & W_1M(3) & W_HF_CNT(7 downto 3); + W_VID_RAM_A <= W_VID_RAM_AB when I_C_BLn = '1' else W_VID_RAM_AA; + W_VID_RAM_D <= W_VID_RAM_DOA when I_VID_RAM_RD = '1' else (others => '0'); + +---- VIDEO DATA OUTPUT -------------- + + O_BD <= W_OBJ_RAM_D or W_VID_RAM_D; + W_SRLD <= not (W_LDn or W_VID_RAM_A(11)); + W_OBJ_ROM_AB <= W_OBJ_D(5 downto 0) & W_1M(3) & (W_OBJ_D(6) xor I_H_CNT(3)); + W_OBJ_ROM_A <= W_OBJ_ROM_AB when I_H_CNT(8) = '1' else W_VID_RAM_DOB; + W_O_OBJ_ROM_A <= W_OBJ_ROM_A & W_1M(2 downto 0); + +----------------------------------------------------------------------------------- + + W_3L_A <= reg_2HJ(7) & reg_2KL(7) & "1" & W_SRLD; + W_3L_B <= reg_2HJ(0) & reg_2KL(0) & W_SRLD & "1"; + W_3L_Y <= W_3L_B when W_H_FLIP2X = '1' else W_3L_A; -- (3)=RAW1,(2)=RAW0 + C_2HJ <= W_3L_Y(1 downto 0); + C_2KL <= W_3L_Y(1 downto 0); + W_RAW0 <= W_3L_Y(2); + W_RAW1 <= W_3L_Y(3); + W_SRCLK <= I_CLK_6M; + +-------- PARTS 2KL ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2KL) is + when "00" => reg_2KL <= reg_2KL; + when "10" => reg_2KL <= reg_2KL(6 downto 0) & "0"; + when "01" => reg_2KL <= "0" & reg_2KL(7 downto 1); + when "11" => reg_2KL <= W_1K_D; + when others => null; + end case; + end if; + end process; + +-------- PARTS 2HJ ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2HJ) is + when "00" => reg_2HJ <= reg_2HJ; + when "10" => reg_2HJ <= reg_2HJ(6 downto 0) & "0"; + when "01" => reg_2HJ <= "0" & reg_2HJ(7 downto 1); + when "11" => reg_2HJ <= W_1H_D; + when others => null; + end case; + end if; + end process; + +------- SHT2 ----------------------------------------------------- + +-- Parts 6K + process(W_COLLn) + begin + if rising_edge(W_COLLn) then + W_6K_Q <= W_H_POSI(2 downto 0); + end if; + end process; + +-- Parts 6P + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + if (W_LDn = '0') then + W_6P_Q <= W_H_FLIP2 & W_H_FLIP1 & I_C_BLn & (not I_H_CNT(8)) & W_6K_Q(2 downto 0); + else + W_6P_Q <= W_6P_Q; + end if; + end if; + end process; + + W_H_FLIP2X <= W_6P_Q(6); + W_H_FLIP1X <= W_6P_Q(5); + W_C_BLnX <= W_6P_Q(4); + W_256HnX <= W_6P_Q(3); + W_CD <= W_6P_Q(2 downto 0); + O_256HnX <= W_256HnX; + O_C_BLnX <= W_C_BLnX; + W_45T_CLR <= W_CNTRCLRn or W_256HnX ; + + process(I_CLK_6M, W_45T_CLR) + begin + if (W_45T_CLR = '0') then + W_45T_Q <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + if (W_CNTRLDn = '0') then + W_45T_Q <= W_H_POSI; + else + W_45T_Q <= W_45T_Q + 1; + end if; + end if; + end process; + + W_LRAM_A <= (not W_45T_Q) when W_H_FLIP1X = '1' else W_45T_Q; + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_RV <= W_LRAM_DO(1 downto 0); + W_RC <= W_LRAM_DO(4 downto 2); + end if; + end process; + + W_LRAM_AND <= not (not ((W_LRAM_A(4) or W_LRAM_A(5)) or (W_LRAM_A(6) or W_LRAM_A(7))) or W_256HnX ); + W_RAW_OR <= W_RAW0 or W_RAW1 ; + + W_VID(0) <= not (not (W_RAW0 and W_RV(1)) and W_RV(0)); + W_VID(1) <= not (not (W_RAW1 and W_RV(0)) and W_RV(1)); + W_COL(0) <= not (not (W_RAW_OR and W_CD(0) and W_RC(1) and W_RC(2)) and W_RC(0)); + W_COL(1) <= not (not (W_RAW_OR and W_CD(1) and W_RC(2) and W_RC(0)) and W_RC(1)); + W_COL(2) <= not (not (W_RAW_OR and W_CD(2) and W_RC(0) and W_RC(1)) and W_RC(2)); + + O_VID <= W_VID; + O_COL <= W_COL; + + W_LRAM_DI(0) <= W_LRAM_AND and W_VID(0); + W_LRAM_DI(1) <= W_LRAM_AND and W_VID(1); + W_LRAM_DI(2) <= W_LRAM_AND and W_COL(0); + W_LRAM_DI(3) <= W_LRAM_AND and W_COL(1); + W_LRAM_DI(4) <= W_LRAM_AND and W_COL(2); + +end RTL; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mist_io.v b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_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/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/osd.v b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_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/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/pll.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d76a5e1d --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/pll.vhd @@ -0,0 +1,451 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + c3 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + clk3_divide_by : NATURAL; + clk3_duty_cycle : NATURAL; + clk3_multiply_by : NATURAL; + clk3_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire2 <= sub_wire0(3); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c3 <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 3, + clk0_duty_cycle => 50, + clk0_multiply_by => 2, + clk0_phase_shift => "0", + clk1_divide_by => 9, + clk1_duty_cycle => 50, + clk1_multiply_by => 4, + clk1_phase_shift => "0", + clk2_divide_by => 9, + clk2_duty_cycle => 50, + clk2_multiply_by => 2, + clk2_phase_shift => "0", + clk3_divide_by => 6, + clk3_duty_cycle => 50, + clk3_multiply_by => 1, + clk3_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_USED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire6, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "3" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "6" +-- 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: DUTY_CYCLE3 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "18.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "12.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "6.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "4.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 "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "4" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "18.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "12.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "6.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "4.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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 "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "3" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "4" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "6" +-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK3_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_USED" +-- 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_USED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/scandoubler.v b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..eba1d598 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_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/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/sine_package.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/sine_package.vhd new file mode 100644 index 00000000..473caa04 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/sine_package.vhd @@ -0,0 +1,152 @@ +library ieee; +use ieee.std_logic_1164.all; + +package sine_package is + + subtype table_value_type is integer range 0 to 16383; + subtype table_index_type is std_logic_vector( 6 downto 0 ); + + function get_table_value (table_index: table_index_type) return table_value_type; + +end; + +package body sine_package is + + function get_table_value (table_index: table_index_type) return table_value_type is + variable table_value: table_value_type; + begin + case table_index is + when "0000000" => table_value := 101; + when "0000001" => table_value := 302; + when "0000010" => table_value := 503; + when "0000011" => table_value := 703; + when "0000100" => table_value := 904; + when "0000101" => table_value := 1105; + when "0000110" => table_value := 1305; + when "0000111" => table_value := 1506; + when "0001000" => table_value := 1706; + when "0001001" => table_value := 1906; + when "0001010" => table_value := 2105; + when "0001011" => table_value := 2304; + when "0001100" => table_value := 2503; + when "0001101" => table_value := 2702; + when "0001110" => table_value := 2900; + when "0001111" => table_value := 3098; + when "0010000" => table_value := 3295; + when "0010001" => table_value := 3491; + when "0010010" => table_value := 3688; + when "0010011" => table_value := 3883; + when "0010100" => table_value := 4078; + when "0010101" => table_value := 4273; + when "0010110" => table_value := 4466; + when "0010111" => table_value := 4659; + when "0011000" => table_value := 4852; + when "0011001" => table_value := 5044; + when "0011010" => table_value := 5234; + when "0011011" => table_value := 5425; + when "0011100" => table_value := 5614; + when "0011101" => table_value := 5802; + when "0011110" => table_value := 5990; + when "0011111" => table_value := 6177; + when "0100000" => table_value := 6362; + when "0100001" => table_value := 6547; + when "0100010" => table_value := 6731; + when "0100011" => table_value := 6914; + when "0100100" => table_value := 7095; + when "0100101" => table_value := 7276; + when "0100110" => table_value := 7456; + when "0100111" => table_value := 7634; + when "0101000" => table_value := 7811; + when "0101001" => table_value := 7988; + when "0101010" => table_value := 8162; + when "0101011" => table_value := 8336; + when "0101100" => table_value := 8509; + when "0101101" => table_value := 8680; + when "0101110" => table_value := 8850; + when "0101111" => table_value := 9018; + when "0110000" => table_value := 9185; + when "0110001" => table_value := 9351; + when "0110010" => table_value := 9515; + when "0110011" => table_value := 9678; + when "0110100" => table_value := 9840; + when "0110101" => table_value := 10000; + when "0110110" => table_value := 10158; + when "0110111" => table_value := 10315; + when "0111000" => table_value := 10471; + when "0111001" => table_value := 10625; + when "0111010" => table_value := 10777; + when "0111011" => table_value := 10927; + when "0111100" => table_value := 11076; + when "0111101" => table_value := 11224; + when "0111110" => table_value := 11369; + when "0111111" => table_value := 11513; + when "1000000" => table_value := 11655; + when "1000001" => table_value := 11796; + when "1000010" => table_value := 11934; + when "1000011" => table_value := 12071; + when "1000100" => table_value := 12206; + when "1000101" => table_value := 12339; + when "1000110" => table_value := 12471; + when "1000111" => table_value := 12600; + when "1001000" => table_value := 12728; + when "1001001" => table_value := 12853; + when "1001010" => table_value := 12977; + when "1001011" => table_value := 13099; + when "1001100" => table_value := 13219; + when "1001101" => table_value := 13336; + when "1001110" => table_value := 13452; + when "1001111" => table_value := 13566; + when "1010000" => table_value := 13678; + when "1010001" => table_value := 13787; + when "1010010" => table_value := 13895; + when "1010011" => table_value := 14000; + when "1010100" => table_value := 14104; + when "1010101" => table_value := 14205; + when "1010110" => table_value := 14304; + when "1010111" => table_value := 14401; + when "1011000" => table_value := 14496; + when "1011001" => table_value := 14588; + when "1011010" => table_value := 14679; + when "1011011" => table_value := 14767; + when "1011100" => table_value := 14853; + when "1011101" => table_value := 14936; + when "1011110" => table_value := 15018; + when "1011111" => table_value := 15097; + when "1100000" => table_value := 15174; + when "1100001" => table_value := 15249; + when "1100010" => table_value := 15321; + when "1100011" => table_value := 15391; + when "1100100" => table_value := 15459; + when "1100101" => table_value := 15524; + when "1100110" => table_value := 15587; + when "1100111" => table_value := 15648; + when "1101000" => table_value := 15706; + when "1101001" => table_value := 15762; + when "1101010" => table_value := 15816; + when "1101011" => table_value := 15867; + when "1101100" => table_value := 15916; + when "1101101" => table_value := 15963; + when "1101110" => table_value := 16007; + when "1101111" => table_value := 16048; + when "1110000" => table_value := 16088; + when "1110001" => table_value := 16124; + when "1110010" => table_value := 16159; + when "1110011" => table_value := 16191; + when "1110100" => table_value := 16220; + when "1110101" => table_value := 16247; + when "1110110" => table_value := 16272; + when "1110111" => table_value := 16294; + when "1111000" => table_value := 16314; + when "1111001" => table_value := 16331; + when "1111010" => table_value := 16346; + when "1111011" => table_value := 16358; + when "1111100" => table_value := 16368; + when "1111101" => table_value := 16375; + when "1111110" => table_value := 16380; + when "1111111" => table_value := 16383; + when others => null; + end case; + return table_value; + end; + +end; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/spram.vhd b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/spram.vhd new file mode 100644 index 00000000..ad6b58b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone V", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/video_mixer.sv b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..b9f7e424 --- /dev/null +++ b/Arcade/Galaxian Hardware/MrDoNightmare_MiST/rtl/video_mixer.sv @@ -0,0 +1,243 @@ +// +// +// 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; +reg [DWIDTH:0] Rd,Gd,Bd; +always @(posedge clk_sys) {Rd,Gd,Bd} <= {R,G,B}; +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(Rd), + .g_in(Gd), + .b_in(Bd), + + .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/Arcade/Galaxian Hardware/Omega_MiST/Omega.qpf b/Arcade/Galaxian Hardware/Omega_MiST/Omega.qpf new file mode 100644 index 00000000..12eceeac --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/Omega.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:59:16 November 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "14:59:16 November 16, 2017" + +# Revisions + +PROJECT_REVISION = "Omega" \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Omega_MiST/Omega.qsf b/Arcade/Galaxian Hardware/Omega_MiST/Omega.qsf new file mode 100644 index 00000000..c61a11a7 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/Omega.qsf @@ -0,0 +1,190 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 18:12:35 November 17, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Galaxian_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80as.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_6L.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1K.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1H.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_HIT.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_FIR.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/sine_package.vhd +set_global_assignment -name VHDL_FILE rtl/mc_stars.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_vco.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_b.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_a.vhd +set_global_assignment -name VHDL_FILE rtl/mc_missile.vhd +set_global_assignment -name VHDL_FILE rtl/mc_logic.vhd +set_global_assignment -name VHDL_FILE rtl/mc_ld_pls.vhd +set_global_assignment -name VHDL_FILE rtl/mc_inport.vhd +set_global_assignment -name VHDL_FILE rtl/mc_hv_count.vhd +set_global_assignment -name VHDL_FILE rtl/mc_col_pal.vhd +set_global_assignment -name VHDL_FILE rtl/mc_bram.vhd +set_global_assignment -name VHDL_FILE rtl/mc_adec.vhd +set_global_assignment -name VHDL_FILE rtl/galaxian.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Omega +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Galaxian) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Galaxian) +# -------------------- +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name VHDL_FILE rtl/mc_video.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Omega.sv +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_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Omega_MiST/Omega.srf b/Arcade/Galaxian Hardware/Omega_MiST/Omega.srf new file mode 100644 index 00000000..14cddd5e --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/Omega.srf @@ -0,0 +1,54 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Clock multiplexers are found and protected" { } { } 0 19016 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169177 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169203 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} diff --git a/Arcade/Galaxian Hardware/Omega_MiST/README.txt b/Arcade/Galaxian Hardware/Omega_MiST/README.txt new file mode 100644 index 00000000..4bf7bde9 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/README.txt @@ -0,0 +1,25 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Omega port to MiST by Gehstock +-- 8 Januar 2018 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Galaxian hardware +-- Copyright(c) 2004 Katsumi Degawa +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- F2 : Coin + Start 2 players +-- F1 : Coin + Start 1 player +-- SPACE : Fire +-- ARROW KEYS : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + +ToDo: Video Fix/Rotate \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Omega_MiST/Release/Omega.rbf b/Arcade/Galaxian Hardware/Omega_MiST/Release/Omega.rbf new file mode 100644 index 00000000..f4056f23 Binary files /dev/null and b/Arcade/Galaxian Hardware/Omega_MiST/Release/Omega.rbf differ diff --git a/Arcade/Galaxian Hardware/Omega_MiST/clean.bat b/Arcade/Galaxian Hardware/Omega_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_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/Arcade/Galaxian Hardware/Omega_MiST/rtl/Omega.sv b/Arcade/Galaxian Hardware/Omega_MiST/rtl/Omega.sv new file mode 100644 index 00000000..e321dfc0 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/Omega.sv @@ -0,0 +1,176 @@ +//============================================================================ +// Arcade: Omega +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Omega +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Omega;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_18, clk_12, clk_6, clk_4p5; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_18), + .c1(clk_12), + .c2(clk_6), + .c3(clk_4p5)//for now, needs a fix +); + +wire m_up = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +galaxian omega +( + .W_CLK_18M(clk_18), + .W_CLK_12M(clk_12), + .W_CLK_6M(clk_6), + .I_RESET(status[0] | status[6] | buttons[1]), + .P1_CSJUDLR({m_coin,m_start1,m_fire,m_up,m_down,m_left,m_right}), + .P2_CSJUDLR({1'b0, m_start2,m_fire,m_up,m_down,m_left,m_right}), + .W_R(r), + .W_G(g), + .W_B(b), + .W_H_SYNC(hs), + .W_V_SYNC(vs), + .HBLANK(hblank), + .VBLANK(vblank), + .W_SDAT_A(audio_a), + .W_SDAT_B(audio_b) +); + +wire [7:0] audio_a, audio_b; +wire [10:0] audio = {1'b0, audio_b, 2'b0} + {3'b0, audio_a}; + +dac dac ( + .clk_i(clk_18), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [2:0] r, g, b; +wire hblank, vblank; +wire blankn = ~(hblank | vblank); +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_18), + .ce_pix(clk_4p5), + .ce_pix_actual(clk_4p5), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn?r:"000"), + .G(blankn?g:"000"), + .B(blankn?b:"000"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_18 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_18), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GALAXIAN_1H.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GALAXIAN_1H.vhd new file mode 100644 index 00000000..f7d8d13f --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GALAXIAN_1H.vhd @@ -0,0 +1,285 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GALAXIAN_1H is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GALAXIAN_1H is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0050 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0058 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0060 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x0068 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x0070 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"00", -- 0x0158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0178 + x"00",x"00",x"02",x"01",x"07",x"3C",x"60",x"42", -- 0x0180 + x"C1",x"8F",x"B8",x"E2",x"C1",x"63",x"26",x"38", -- 0x0188 + x"19",x"3B",x"7E",x"FC",x"F8",x"FE",x"F1",x"F0", -- 0x0190 + x"F0",x"F1",x"FE",x"F8",x"FC",x"7E",x"3B",x"19", -- 0x0198 + x"38",x"26",x"63",x"C1",x"E2",x"B8",x"8F",x"C1", -- 0x01A0 + x"42",x"60",x"3C",x"07",x"01",x"02",x"00",x"00", -- 0x01A8 + x"30",x"76",x"7D",x"F8",x"F8",x"FE",x"B1",x"F0", -- 0x01B0 + x"F0",x"B1",x"FE",x"F8",x"F8",x"7D",x"76",x"30", -- 0x01B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"80", -- 0x01C8 + x"01",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D0 + x"40",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x01E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"40",x"00", -- 0x01E8 + x"00",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F0 + x"40",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x0200 + x"00",x"00",x"00",x"00",x"00",x"80",x"A0",x"80", -- 0x0208 + x"07",x"00",x"02",x"00",x"00",x"00",x"00",x"00", -- 0x0210 + x"60",x"C0",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0218 + x"00",x"00",x"00",x"00",x"00",x"00",x"04",x"03", -- 0x0220 + x"00",x"00",x"00",x"00",x"40",x"20",x"20",x"E0", -- 0x0228 + x"01",x"02",x"05",x"01",x"00",x"00",x"00",x"00", -- 0x0230 + x"18",x"E0",x"D0",x"08",x"80",x"00",x"00",x"00", -- 0x0238 + x"00",x"00",x"00",x"00",x"08",x"08",x"08",x"06", -- 0x0240 + x"00",x"00",x"00",x"00",x"10",x"10",x"10",x"60", -- 0x0248 + x"13",x"0C",x"03",x"07",x"09",x"10",x"00",x"00", -- 0x0250 + x"C8",x"30",x"C0",x"E0",x"90",x"08",x"00",x"00", -- 0x0258 + x"30",x"18",x"08",x"0C",x"06",x"03",x"01",x"02", -- 0x0260 + x"18",x"29",x"66",x"40",x"60",x"91",x"CE",x"60", -- 0x0268 + x"60",x"CE",x"91",x"60",x"40",x"66",x"29",x"18", -- 0x0270 + x"02",x"01",x"03",x"06",x"0C",x"08",x"18",x"30", -- 0x0278 + x"55",x"55",x"55",x"95",x"25",x"25",x"29",x"C9", -- 0x0280 + x"13",x"12",x"E6",x"0C",x"38",x"E0",x"00",x"00", -- 0x0288 + x"D5",x"75",x"3D",x"2D",x"95",x"75",x"F5",x"9D", -- 0x0290 + x"9D",x"F5",x"75",x"95",x"2D",x"3D",x"75",x"D5", -- 0x0298 + x"00",x"00",x"38",x"07",x"39",x"03",x"87",x"7F", -- 0x02A0 + x"20",x"60",x"42",x"4F",x"7C",x"72",x"7D",x"7F", -- 0x02A8 + x"87",x"03",x"39",x"07",x"38",x"00",x"00",x"00", -- 0x02B0 + x"71",x"46",x"7C",x"4F",x"42",x"60",x"20",x"00", -- 0x02B8 + x"38",x"04",x"3A",x"01",x"01",x"03",x"87",x"7F", -- 0x02C0 + x"24",x"36",x"24",x"48",x"7C",x"72",x"7D",x"7F", -- 0x02C8 + x"87",x"03",x"01",x"01",x"3A",x"04",x"38",x"00", -- 0x02D0 + x"71",x"46",x"7C",x"48",x"24",x"36",x"24",x"00", -- 0x02D8 + x"FF",x"81",x"81",x"81",x"81",x"81",x"81",x"FF", -- 0x02E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E8 + x"00",x"5E",x"AE",x"7E",x"EE",x"7E",x"AE",x"5E", -- 0x02F0 + x"00",x"05",x"0A",x"07",x"0E",x"07",x"0A",x"05", -- 0x02F8 + x"00",x"38",x"06",x"39",x"01",x"03",x"87",x"7F", -- 0x0300 + x"22",x"33",x"24",x"48",x"7C",x"72",x"7D",x"7F", -- 0x0308 + x"87",x"03",x"01",x"39",x"06",x"38",x"00",x"00", -- 0x0310 + x"71",x"46",x"7C",x"48",x"24",x"33",x"22",x"00", -- 0x0318 + x"80",x"E2",x"B3",x"22",x"02",x"8B",x"CE",x"88", -- 0x0320 + x"80",x"E2",x"B3",x"22",x"02",x"0B",x"0E",x"08", -- 0x0328 + x"00",x"22",x"33",x"22",x"02",x"0B",x"0E",x"08", -- 0x0330 + x"00",x"22",x"33",x"22",x"02",x"0B",x"0E",x"08", -- 0x0338 + x"00",x"02",x"03",x"02",x"02",x"0B",x"0E",x"08", -- 0x0340 + x"00",x"02",x"03",x"02",x"02",x"03",x"02",x"00", -- 0x0348 + x"00",x"02",x"03",x"02",x"02",x"03",x"02",x"00", -- 0x0350 + x"00",x"02",x"03",x"02",x"00",x"00",x"00",x"00", -- 0x0358 + x"00",x"22",x"33",x"22",x"02",x"8B",x"CE",x"88", -- 0x0360 + x"00",x"02",x"03",x"02",x"02",x"0B",x"0E",x"08", -- 0x0368 + x"00",x"02",x"03",x"02",x"02",x"0B",x"0E",x"08", -- 0x0370 + x"00",x"00",x"00",x"00",x"02",x"03",x"02",x"00", -- 0x0378 + x"00",x"00",x"01",x"00",x"0E",x"11",x"11",x"00", -- 0x0380 + x"00",x"00",x"08",x"88",x"50",x"50",x"F0",x"F8", -- 0x0388 + x"00",x"11",x"11",x"0E",x"00",x"01",x"00",x"00", -- 0x0390 + x"F8",x"F0",x"50",x"50",x"88",x"08",x"00",x"00", -- 0x0398 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"01", -- 0x03A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"E0", -- 0x03A8 + x"01",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B0 + x"E0",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x03C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"80", -- 0x03C8 + x"01",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D0 + x"80",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"03", -- 0x03E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"C0", -- 0x03E8 + x"03",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F0 + x"C0",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F8 + x"00",x"00",x"00",x"00",x"07",x"0F",x"0B",x"03", -- 0x0400 + x"00",x"00",x"10",x"10",x"27",x"A8",x"D8",x"5C", -- 0x0408 + x"03",x"0B",x"0D",x"07",x"00",x"00",x"00",x"00", -- 0x0410 + x"5C",x"D8",x"A8",x"27",x"10",x"10",x"00",x"00", -- 0x0418 + x"00",x"00",x"00",x"00",x"07",x"0F",x"0B",x"03", -- 0x0420 + x"00",x"00",x"41",x"22",x"24",x"A8",x"D8",x"5C", -- 0x0428 + x"03",x"0B",x"0D",x"07",x"00",x"00",x"00",x"00", -- 0x0430 + x"5C",x"D8",x"A8",x"24",x"22",x"41",x"00",x"00", -- 0x0438 + x"00",x"00",x"00",x"00",x"07",x"0F",x"0B",x"03", -- 0x0440 + x"00",x"00",x"84",x"44",x"28",x"A8",x"D8",x"5C", -- 0x0448 + x"03",x"0B",x"0D",x"07",x"00",x"00",x"00",x"00", -- 0x0450 + x"5C",x"D8",x"A8",x"28",x"44",x"84",x"00",x"00", -- 0x0458 + x"00",x"00",x"00",x"00",x"07",x"0F",x"0B",x"03", -- 0x0460 + x"00",x"00",x"90",x"48",x"28",x"A8",x"D8",x"5C", -- 0x0468 + x"03",x"0B",x"0D",x"07",x"00",x"00",x"00",x"00", -- 0x0470 + x"5C",x"D8",x"A8",x"28",x"48",x"90",x"00",x"00", -- 0x0478 + x"00",x"00",x"00",x"00",x"07",x"0F",x"0B",x"03", -- 0x0480 + x"00",x"00",x"88",x"88",x"50",x"50",x"B0",x"B8", -- 0x0488 + x"03",x"0B",x"0D",x"07",x"00",x"00",x"00",x"00", -- 0x0490 + x"B8",x"B0",x"50",x"50",x"88",x"88",x"00",x"00", -- 0x0498 + x"00",x"00",x"00",x"07",x"0F",x"03",x"03",x"16", -- 0x04A0 + x"00",x"00",x"00",x"20",x"A4",x"A4",x"A8",x"B8", -- 0x04A8 + x"20",x"13",x"0E",x"00",x"03",x"02",x"00",x"00", -- 0x04B0 + x"B0",x"B8",x"70",x"A0",x"20",x"20",x"20",x"00", -- 0x04B8 + x"00",x"00",x"03",x"04",x"07",x"1F",x"3F",x"20", -- 0x04C0 + x"00",x"00",x"00",x"80",x"50",x"50",x"90",x"E6", -- 0x04C8 + x"13",x"0D",x"01",x"06",x"08",x"01",x"01",x"00", -- 0x04D0 + x"28",x"70",x"F0",x"70",x"80",x"00",x"00",x"00", -- 0x04D8 + x"00",x"00",x"00",x"01",x"0B",x"1F",x"10",x"10", -- 0x04E0 + x"00",x"00",x"80",x"40",x"20",x"20",x"60",x"4C", -- 0x04E8 + x"0F",x"00",x"1E",x"01",x"00",x"0C",x"00",x"00", -- 0x04F0 + x"F0",x"66",x"F8",x"E0",x"40",x"00",x"00",x"00", -- 0x04F8 + x"00",x"00",x"00",x"06",x"0C",x"0B",x"08",x"06", -- 0x0500 + x"00",x"00",x"00",x"60",x"30",x"10",x"10",x"60", -- 0x0508 + x"33",x"0C",x"03",x"07",x"31",x"00",x"00",x"00", -- 0x0510 + x"CC",x"30",x"C0",x"F0",x"8C",x"00",x"00",x"00", -- 0x0518 + x"00",x"00",x"00",x"00",x"07",x"08",x"08",x"00", -- 0x0520 + x"00",x"00",x"10",x"10",x"27",x"A8",x"D8",x"5C", -- 0x0528 + x"00",x"08",x"08",x"07",x"00",x"00",x"00",x"00", -- 0x0530 + x"5C",x"D8",x"A8",x"27",x"10",x"10",x"00",x"00", -- 0x0538 + x"00",x"00",x"00",x"00",x"00",x"07",x"08",x"08", -- 0x0540 + x"00",x"00",x"41",x"22",x"24",x"A8",x"D8",x"5C", -- 0x0548 + x"08",x"08",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0550 + x"5C",x"D8",x"A8",x"24",x"22",x"41",x"00",x"00", -- 0x0558 + x"00",x"00",x"00",x"00",x"07",x"08",x"08",x"00", -- 0x0560 + x"00",x"00",x"84",x"44",x"28",x"A8",x"D8",x"5C", -- 0x0568 + x"00",x"08",x"08",x"07",x"00",x"00",x"00",x"00", -- 0x0570 + x"5C",x"D8",x"A8",x"28",x"44",x"84",x"00",x"00", -- 0x0578 + x"00",x"00",x"00",x"00",x"00",x"07",x"08",x"08", -- 0x0580 + x"00",x"00",x"90",x"48",x"28",x"A8",x"D8",x"5C", -- 0x0588 + x"08",x"08",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0590 + x"5C",x"D8",x"A8",x"28",x"48",x"90",x"00",x"00", -- 0x0598 + x"00",x"00",x"00",x"00",x"00",x"0E",x"11",x"11", -- 0x05A0 + x"00",x"00",x"88",x"88",x"50",x"50",x"B0",x"B8", -- 0x05A8 + x"11",x"11",x"0E",x"00",x"00",x"00",x"00",x"00", -- 0x05B0 + x"B8",x"B0",x"50",x"50",x"88",x"88",x"00",x"00", -- 0x05B8 + x"00",x"00",x"00",x"07",x"08",x"00",x"00",x"10", -- 0x05C0 + x"00",x"00",x"00",x"20",x"A4",x"A4",x"A8",x"B8", -- 0x05C8 + x"20",x"13",x"0E",x"00",x"03",x"02",x"00",x"00", -- 0x05D0 + x"B0",x"B8",x"70",x"A0",x"20",x"20",x"20",x"00", -- 0x05D8 + x"00",x"00",x"03",x"04",x"00",x"10",x"20",x"20", -- 0x05E0 + x"00",x"00",x"00",x"80",x"50",x"50",x"90",x"E6", -- 0x05E8 + x"13",x"0D",x"01",x"06",x"08",x"01",x"01",x"00", -- 0x05F0 + x"28",x"70",x"F0",x"70",x"80",x"00",x"00",x"00", -- 0x05F8 + x"00",x"00",x"00",x"01",x"08",x"10",x"10",x"10", -- 0x0600 + x"00",x"00",x"80",x"40",x"20",x"20",x"60",x"4C", -- 0x0608 + x"0F",x"00",x"1E",x"01",x"00",x"0C",x"00",x"00", -- 0x0610 + x"F0",x"66",x"F8",x"E0",x"40",x"00",x"00",x"00", -- 0x0618 + x"00",x"00",x"00",x"06",x"08",x"08",x"08",x"06", -- 0x0620 + x"00",x"00",x"00",x"60",x"10",x"10",x"10",x"60", -- 0x0628 + x"33",x"0C",x"03",x"0F",x"31",x"00",x"00",x"00", -- 0x0630 + x"CC",x"30",x"C0",x"F0",x"8C",x"00",x"00",x"00", -- 0x0638 + x"00",x"66",x"77",x"77",x"77",x"55",x"DD",x"66", -- 0x0640 + x"00",x"60",x"70",x"70",x"70",x"50",x"D0",x"60", -- 0x0648 + x"00",x"06",x"07",x"07",x"07",x"05",x"0D",x"06", -- 0x0650 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0658 + x"35",x"16",x"B7",x"76",x"B5",x"16",x"35",x"00", -- 0x0660 + x"3C",x"42",x"81",x"A5",x"A5",x"99",x"42",x"3C", -- 0x0668 + x"F8",x"F8",x"F8",x"F8",x"B8",x"58",x"F8",x"00", -- 0x0670 + x"12",x"6A",x"94",x"D4",x"94",x"6A",x"12",x"00", -- 0x0678 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"6C", -- 0x0688 + x"00",x"01",x"00",x"01",x"03",x"00",x"04",x"02", -- 0x0690 + x"83",x"38",x"86",x"39",x"01",x"33",x"87",x"7E", -- 0x0698 + x"00",x"00",x"00",x"00",x"00",x"00",x"3B",x"00", -- 0x06A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"40", -- 0x06A8 + x"22",x"B3",x"24",x"48",x"7C",x"7E",x"7F",x"7F", -- 0x06B0 + x"00",x"20",x"40",x"80",x"80",x"40",x"20",x"20", -- 0x06B8 + x"04",x"00",x"03",x"01",x"00",x"01",x"00",x"00", -- 0x06C0 + x"87",x"33",x"01",x"39",x"86",x"38",x"83",x"6C", -- 0x06C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D8 + x"7F",x"7E",x"7C",x"48",x"24",x"B3",x"22",x"00", -- 0x06E0 + x"20",x"40",x"80",x"80",x"40",x"20",x"00",x"40", -- 0x06E8 + x"3B",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F0 + x"80",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0700 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0708 + x"00",x"00",x"00",x"00",x"00",x"00",x"02",x"01", -- 0x0710 + x"60",x"08",x"04",x"69",x"03",x"00",x"0A",x"B5", -- 0x0718 + x"00",x"00",x"00",x"00",x"00",x"00",x"11",x"19", -- 0x0720 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"08", -- 0x0728 + x"00",x"20",x"44",x"00",x"6C",x"2E",x"06",x"30", -- 0x0730 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"80", -- 0x0738 + x"02",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0740 + x"0A",x"00",x"03",x"69",x"04",x"08",x"60",x"00", -- 0x0748 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0750 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0758 + x"06",x"2E",x"6C",x"00",x"44",x"22",x"00",x"19", -- 0x0760 + x"80",x"00",x"00",x"00",x"00",x"00",x"00",x"80", -- 0x0768 + x"11",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0770 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0778 + x"04",x"00",x"00",x"40",x"00",x"00",x"00",x"00", -- 0x0780 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0788 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0790 + x"08",x"00",x"13",x"0C",x"00",x"23",x"31",x"4F", -- 0x0798 + x"00",x"00",x"00",x"00",x"00",x"10",x"00",x"00", -- 0x07A0 + x"01",x"00",x"00",x"00",x"00",x"04",x"00",x"00", -- 0x07A8 + x"00",x"08",x"C0",x"E8",x"80",x"40",x"A2",x"F0", -- 0x07B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07C0 + x"27",x"31",x"01",x"00",x"91",x"10",x"09",x"04", -- 0x07C8 + x"00",x"00",x"00",x"00",x"10",x"00",x"00",x"00", -- 0x07D0 + x"00",x"00",x"20",x"00",x"00",x"00",x"00",x"00", -- 0x07D8 + x"CE",x"A4",x"45",x"88",x"00",x"C2",x"00",x"00", -- 0x07E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"10", -- 0x07F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"04",x"00" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GALAXIAN_1K.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GALAXIAN_1K.vhd new file mode 100644 index 00000000..cb6701eb --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GALAXIAN_1K.vhd @@ -0,0 +1,285 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GALAXIAN_1K is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GALAXIAN_1K is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0050 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0058 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0060 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x0068 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x0070 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"00", -- 0x0158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0188 + x"00",x"00",x"60",x"F0",x"F8",x"FE",x"D1",x"F0", -- 0x0190 + x"F0",x"D1",x"FE",x"F8",x"F0",x"60",x"00",x"00", -- 0x0198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01A8 + x"00",x"00",x"60",x"F0",x"F8",x"FE",x"F5",x"FF", -- 0x01B0 + x"FF",x"F5",x"FE",x"F8",x"F0",x"60",x"00",x"00", -- 0x01B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"80", -- 0x01C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D0 + x"80",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"40",x"80", -- 0x01E8 + x"00",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F0 + x"80",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x0200 + x"00",x"00",x"00",x"00",x"00",x"00",x"20",x"C0", -- 0x0208 + x"01",x"01",x"02",x"00",x"00",x"00",x"00",x"00", -- 0x0210 + x"A0",x"00",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0218 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0220 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"0E", -- 0x0228 + x"01",x"03",x"04",x"01",x"00",x"00",x"00",x"00", -- 0x0230 + x"F8",x"00",x"10",x"08",x"80",x"00",x"00",x"00", -- 0x0238 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0240 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0248 + x"13",x"0F",x"00",x"04",x"08",x"10",x"00",x"00", -- 0x0250 + x"C8",x"F0",x"00",x"20",x"10",x"08",x"00",x"00", -- 0x0258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0270 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0278 + x"08",x"22",x"00",x"08",x"42",x"50",x"40",x"24", -- 0x0280 + x"40",x"40",x"08",x"40",x"40",x"00",x"00",x"00", -- 0x0288 + x"00",x"02",x"20",x"20",x"90",x"12",x"80",x"E0", -- 0x0290 + x"E0",x"80",x"12",x"90",x"20",x"20",x"02",x"00", -- 0x0298 + x"00",x"00",x"00",x"00",x"01",x"03",x"86",x"7D", -- 0x02A0 + x"00",x"00",x"00",x"00",x"FC",x"FE",x"FF",x"FF", -- 0x02A8 + x"86",x"03",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x02B0 + x"FF",x"FE",x"FC",x"00",x"00",x"00",x"00",x"00", -- 0x02B8 + x"00",x"00",x"00",x"00",x"01",x"03",x"86",x"7D", -- 0x02C0 + x"00",x"00",x"00",x"00",x"FC",x"FE",x"FF",x"FF", -- 0x02C8 + x"86",x"03",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x02D0 + x"FF",x"FE",x"FC",x"00",x"00",x"00",x"00",x"00", -- 0x02D8 + x"FF",x"81",x"81",x"81",x"81",x"81",x"81",x"FF", -- 0x02E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E8 + x"00",x"0E",x"1E",x"2E",x"0E",x"2E",x"1E",x"0E", -- 0x02F0 + x"00",x"00",x"01",x"02",x"00",x"02",x"01",x"00", -- 0x02F8 + x"00",x"00",x"00",x"00",x"01",x"03",x"86",x"7D", -- 0x0300 + x"00",x"00",x"00",x"00",x"FC",x"FE",x"FF",x"FF", -- 0x0308 + x"86",x"03",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x0310 + x"FF",x"FE",x"FC",x"00",x"00",x"00",x"00",x"00", -- 0x0318 + x"88",x"CE",x"8B",x"02",x"20",x"38",x"2C",x"08", -- 0x0320 + x"88",x"CE",x"8B",x"02",x"20",x"38",x"2C",x"08", -- 0x0328 + x"08",x"0E",x"0B",x"02",x"20",x"38",x"2C",x"08", -- 0x0330 + x"08",x"0E",x"0B",x"02",x"00",x"08",x"0C",x"08", -- 0x0338 + x"08",x"0E",x"0B",x"02",x"00",x"08",x"0C",x"08", -- 0x0340 + x"08",x"0E",x"0B",x"02",x"00",x"00",x"00",x"00", -- 0x0348 + x"00",x"02",x"03",x"02",x"00",x"00",x"00",x"00", -- 0x0350 + x"00",x"02",x"03",x"02",x"00",x"00",x"00",x"00", -- 0x0358 + x"08",x"0E",x"0B",x"02",x"20",x"38",x"2C",x"08", -- 0x0360 + x"08",x"0E",x"0B",x"02",x"20",x"38",x"2C",x"08", -- 0x0368 + x"00",x"02",x"03",x"02",x"00",x"08",x"0C",x"08", -- 0x0370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0378 + x"02",x"0C",x"10",x"20",x"40",x"80",x"80",x"40", -- 0x0380 + x"34",x"42",x"01",x"01",x"02",x"02",x"00",x"61", -- 0x0388 + x"40",x"80",x"80",x"40",x"20",x"10",x"0C",x"02", -- 0x0390 + x"61",x"00",x"02",x"02",x"01",x"01",x"42",x"34", -- 0x0398 + x"00",x"00",x"00",x"02",x"05",x"08",x"0C",x"18", -- 0x03A0 + x"00",x"00",x"00",x"40",x"D0",x"28",x"04",x"06", -- 0x03A8 + x"18",x"0C",x"08",x"05",x"02",x"00",x"00",x"00", -- 0x03B0 + x"06",x"04",x"28",x"D0",x"40",x"00",x"00",x"00", -- 0x03B8 + x"0B",x"36",x"22",x"20",x"40",x"20",x"62",x"80", -- 0x03C0 + x"50",x"B8",x"88",x"12",x"02",x"05",x"41",x"82", -- 0x03C8 + x"80",x"62",x"20",x"40",x"20",x"22",x"36",x"0B", -- 0x03D0 + x"82",x"41",x"05",x"02",x"12",x"88",x"B8",x"50", -- 0x03D8 + x"01",x"40",x"0A",x"00",x"12",x"00",x"24",x"81", -- 0x03E0 + x"00",x"02",x"A0",x"00",x"48",x"00",x"24",x"81", -- 0x03E8 + x"11",x"44",x"10",x"05",x"10",x"02",x"40",x"00", -- 0x03F0 + x"18",x"22",x"08",x"20",x"08",x"40",x"02",x"80", -- 0x03F8 + x"00",x"00",x"00",x"00",x"00",x"07",x"07",x"07", -- 0x0400 + x"00",x"00",x"10",x"10",x"27",x"28",x"60",x"60", -- 0x0408 + x"07",x"07",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0410 + x"60",x"60",x"28",x"27",x"10",x"10",x"00",x"00", -- 0x0418 + x"00",x"00",x"00",x"00",x"00",x"07",x"07",x"07", -- 0x0420 + x"00",x"00",x"41",x"22",x"24",x"28",x"60",x"60", -- 0x0428 + x"07",x"07",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0430 + x"60",x"60",x"28",x"24",x"22",x"41",x"00",x"00", -- 0x0438 + x"00",x"00",x"00",x"00",x"00",x"07",x"07",x"07", -- 0x0440 + x"00",x"00",x"84",x"44",x"28",x"28",x"60",x"60", -- 0x0448 + x"07",x"07",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0450 + x"60",x"60",x"28",x"28",x"44",x"84",x"00",x"00", -- 0x0458 + x"00",x"00",x"00",x"00",x"00",x"07",x"07",x"07", -- 0x0460 + x"00",x"00",x"90",x"48",x"28",x"28",x"60",x"60", -- 0x0468 + x"07",x"07",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0470 + x"60",x"60",x"28",x"28",x"48",x"90",x"00",x"00", -- 0x0478 + x"00",x"00",x"00",x"00",x"00",x"07",x"0E",x"0E", -- 0x0480 + x"00",x"00",x"88",x"88",x"50",x"50",x"C0",x"C0", -- 0x0488 + x"0E",x"0E",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0490 + x"C0",x"C0",x"50",x"50",x"88",x"88",x"00",x"00", -- 0x0498 + x"00",x"00",x"00",x"00",x"07",x"07",x"0F",x"0E", -- 0x04A0 + x"00",x"00",x"00",x"20",x"24",x"24",x"28",x"C8", -- 0x04A8 + x"1E",x"0D",x"00",x"00",x"03",x"02",x"00",x"00", -- 0x04B0 + x"C0",x"C0",x"80",x"A0",x"20",x"20",x"20",x"00", -- 0x04B8 + x"00",x"00",x"00",x"03",x"01",x"03",x"17",x"1F", -- 0x04C0 + x"00",x"00",x"00",x"00",x"90",x"90",x"10",x"E6", -- 0x04C8 + x"0D",x"01",x"01",x"06",x"08",x"01",x"01",x"00", -- 0x04D0 + x"C8",x"80",x"00",x"00",x"80",x"00",x"00",x"00", -- 0x04D8 + x"00",x"00",x"00",x"00",x"03",x"09",x"0F",x"0E", -- 0x04E0 + x"00",x"00",x"00",x"80",x"C0",x"C0",x"80",x"4C", -- 0x04E8 + x"01",x"01",x"1F",x"00",x"03",x"0C",x"00",x"00", -- 0x04F0 + x"B0",x"86",x"18",x"00",x"00",x"00",x"00",x"00", -- 0x04F8 + x"00",x"00",x"00",x"00",x"07",x"07",x"07",x"00", -- 0x0500 + x"00",x"00",x"00",x"00",x"E0",x"E0",x"E0",x"00", -- 0x0508 + x"33",x"0F",x"00",x"0C",x"30",x"00",x"00",x"00", -- 0x0510 + x"CC",x"F0",x"00",x"30",x"0C",x"00",x"00",x"00", -- 0x0518 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0520 + x"00",x"00",x"10",x"10",x"27",x"28",x"60",x"60", -- 0x0528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0530 + x"60",x"60",x"28",x"27",x"10",x"10",x"00",x"00", -- 0x0538 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0540 + x"00",x"00",x"41",x"22",x"24",x"28",x"60",x"60", -- 0x0548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0550 + x"60",x"60",x"28",x"24",x"22",x"41",x"00",x"00", -- 0x0558 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0560 + x"00",x"00",x"84",x"44",x"28",x"28",x"60",x"60", -- 0x0568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0570 + x"60",x"60",x"28",x"28",x"44",x"84",x"00",x"00", -- 0x0578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0580 + x"00",x"00",x"90",x"48",x"28",x"28",x"60",x"60", -- 0x0588 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0590 + x"60",x"60",x"28",x"28",x"48",x"90",x"00",x"00", -- 0x0598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A0 + x"00",x"00",x"88",x"88",x"50",x"50",x"C0",x"C0", -- 0x05A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05B0 + x"C0",x"C0",x"50",x"50",x"88",x"88",x"00",x"00", -- 0x05B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C0 + x"00",x"00",x"00",x"20",x"24",x"24",x"28",x"C8", -- 0x05C8 + x"00",x"01",x"00",x"00",x"03",x"02",x"00",x"00", -- 0x05D0 + x"C0",x"C0",x"80",x"A0",x"20",x"20",x"20",x"00", -- 0x05D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E0 + x"00",x"00",x"00",x"00",x"10",x"10",x"10",x"E6", -- 0x05E8 + x"01",x"01",x"01",x"06",x"08",x"01",x"01",x"00", -- 0x05F0 + x"C8",x"80",x"00",x"00",x"80",x"00",x"00",x"00", -- 0x05F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"4C", -- 0x0608 + x"01",x"01",x"1F",x"00",x"03",x"0C",x"00",x"00", -- 0x0610 + x"B0",x"86",x"18",x"00",x"00",x"00",x"00",x"00", -- 0x0618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0620 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0628 + x"33",x"0F",x"00",x"0C",x"30",x"00",x"00",x"00", -- 0x0630 + x"CC",x"F0",x"00",x"30",x"0C",x"00",x"00",x"00", -- 0x0638 + x"00",x"66",x"FF",x"FF",x"FF",x"FF",x"FF",x"66", -- 0x0640 + x"00",x"60",x"F0",x"F0",x"F0",x"F0",x"F0",x"60", -- 0x0648 + x"00",x"06",x"0F",x"0F",x"0F",x"0F",x"0F",x"06", -- 0x0650 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0658 + x"00",x"1E",x"BF",x"6F",x"BF",x"1E",x"00",x"00", -- 0x0660 + x"3C",x"42",x"81",x"A5",x"A5",x"99",x"42",x"3C", -- 0x0668 + x"50",x"50",x"50",x"50",x"F0",x"F0",x"F7",x"00", -- 0x0670 + x"12",x"0A",x"08",x"C8",x"08",x"0A",x"12",x"00", -- 0x0678 + x"00",x"00",x"00",x"00",x"00",x"01",x"02",x"04", -- 0x0680 + x"00",x"00",x"00",x"00",x"00",x"B6",x"00",x"6C", -- 0x0688 + x"04",x"01",x"04",x"09",x"13",x"10",x"24",x"12", -- 0x0690 + x"83",x"00",x"80",x"00",x"01",x"33",x"86",x"7D", -- 0x0698 + x"00",x"00",x"00",x"33",x"4C",x"80",x"3B",x"00", -- 0x06A0 + x"00",x"00",x"00",x"80",x"60",x"10",x"88",x"48", -- 0x06A8 + x"00",x"80",x"00",x"00",x"FC",x"FE",x"FF",x"FF", -- 0x06B0 + x"04",x"24",x"48",x"90",x"90",x"48",x"24",x"24", -- 0x06B8 + x"24",x"10",x"13",x"09",x"04",x"01",x"04",x"04", -- 0x06C0 + x"86",x"33",x"01",x"00",x"80",x"00",x"83",x"6C", -- 0x06C8 + x"02",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D0 + x"00",x"B6",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D8 + x"FF",x"FE",x"FC",x"00",x"00",x"80",x"00",x"00", -- 0x06E0 + x"24",x"48",x"90",x"90",x"48",x"24",x"04",x"48", -- 0x06E8 + x"3B",x"80",x"4C",x"33",x"00",x"00",x"00",x"00", -- 0x06F0 + x"88",x"10",x"60",x"80",x"00",x"00",x"00",x"00", -- 0x06F8 + x"00",x"00",x"00",x"00",x"00",x"02",x"04",x"01", -- 0x0700 + x"00",x"00",x"00",x"03",x"68",x"06",x"D1",x"0C", -- 0x0708 + x"02",x"09",x"11",x"22",x"28",x"48",x"02",x"51", -- 0x0710 + x"02",x"01",x"00",x"01",x"03",x"40",x"08",x"B1", -- 0x0718 + x"00",x"00",x"06",x"30",x"4D",x"00",x"40",x"40", -- 0x0720 + x"00",x"00",x"00",x"00",x"80",x"40",x"28",x"28", -- 0x0728 + x"80",x"00",x"00",x"00",x"6C",x"2E",x"86",x"B0", -- 0x0730 + x"04",x"14",x"90",x"C8",x"68",x"24",x"88",x"80", -- 0x0738 + x"02",x"48",x"28",x"22",x"11",x"09",x"02",x"01", -- 0x0740 + x"08",x"40",x"03",x"01",x"00",x"01",x"02",x"0C", -- 0x0748 + x"04",x"02",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0750 + x"D1",x"06",x"68",x"03",x"00",x"00",x"00",x"00", -- 0x0758 + x"86",x"2E",x"6C",x"00",x"00",x"00",x"80",x"40", -- 0x0760 + x"88",x"24",x"68",x"C8",x"90",x"14",x"04",x"28", -- 0x0768 + x"40",x"00",x"4D",x"30",x"06",x"00",x"00",x"00", -- 0x0770 + x"28",x"40",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0778 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"03", -- 0x0780 + x"00",x"31",x"43",x"88",x"00",x"60",x"C0",x"01", -- 0x0788 + x"02",x"30",x"10",x"20",x"23",x"42",x"40",x"00", -- 0x0790 + x"01",x"06",x"30",x"60",x"C2",x"AD",x"18",x"1D", -- 0x0798 + x"00",x"00",x"80",x"40",x"02",x"03",x"00",x"00", -- 0x07A0 + x"00",x"00",x"00",x"00",x"00",x"80",x"80",x"40", -- 0x07A8 + x"C0",x"68",x"50",x"82",x"F1",x"10",x"28",x"B0", -- 0x07B0 + x"40",x"08",x"04",x"02",x"82",x"C2",x"84",x"00", -- 0x07B8 + x"01",x"19",x"10",x"10",x"88",x"88",x"C4",x"40", -- 0x07C0 + x"05",x"98",x"86",x"47",x"05",x"00",x"40",x"64", -- 0x07C8 + x"60",x"20",x"00",x"04",x"03",x"00",x"80",x"00", -- 0x07D0 + x"3C",x"08",x"00",x"00",x"86",x"C1",x"00",x"00", -- 0x07D8 + x"88",x"10",x"70",x"E0",x"00",x"08",x"18",x"80", -- 0x07E0 + x"00",x"11",x"21",x"C3",x"01",x"11",x"32",x"60", -- 0x07E8 + x"00",x"00",x"04",x"08",x"70",x"C0",x"00",x"00", -- 0x07F0 + x"20",x"40",x"08",x"30",x"40",x"00",x"00",x"00" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GALAXIAN_6L.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GALAXIAN_6L.vhd new file mode 100644 index 00000000..e989225e --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GALAXIAN_6L.vhd @@ -0,0 +1,33 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GALAXIAN_6L is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(4 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GALAXIAN_6L is + + + type ROM_ARRAY is array(0 to 31) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"7A",x"36",x"07",x"00",x"F0",x"38",x"1F", -- 0x0000 + x"00",x"C7",x"F0",x"3F",x"00",x"DB",x"C6",x"38", -- 0x0008 + x"00",x"36",x"07",x"F0",x"00",x"33",x"3F",x"DB", -- 0x0010 + x"00",x"3F",x"57",x"C6",x"00",x"C6",x"3F",x"FF" -- 0x0018 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GAL_FIR.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GAL_FIR.vhd new file mode 100644 index 00000000..5aff2022 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GAL_FIR.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_FIR 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 prom of GAL_FIR is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AC",X"68",X"72",X"C7",X"93",X"3F",X"80",X"C8",X"5C",X"A1",X"22",X"90",X"B9",X"8A",X"41",X"62", + X"C2",X"A1",X"40",X"6A",X"C9",X"7F",X"64",X"3C",X"BC",X"AD",X"5B",X"4C",X"D4",X"62",X"3D",X"D3", + X"7F",X"31",X"A3",X"BE",X"5D",X"49",X"C7",X"7D",X"28",X"C0",X"A1",X"7A",X"7D",X"2B",X"C9",X"91", + X"80",X"6B",X"39",X"95",X"BA",X"91",X"27",X"C1",X"91",X"7E",X"6D",X"31",X"C0",X"A4",X"7C",X"7B", + X"37",X"80",X"CB",X"7E",X"88",X"64",X"40",X"8F",X"C3",X"83",X"83",X"68",X"36",X"D0",X"8C",X"29", + X"B4",X"B1",X"52",X"4B",X"E9",X"3E",X"74",X"C4",X"73",X"81",X"2B",X"AD",X"B9",X"4E",X"4B",X"CB", + X"91",X"76",X"33",X"B6",X"A5",X"6E",X"4A",X"63",X"D7",X"7C",X"3E",X"7E",X"DE",X"45",X"67",X"C1", + X"84",X"2D",X"A8",X"A9",X"20",X"AC",X"B5",X"7E",X"47",X"5F",X"DD",X"6E",X"44",X"BD",X"97",X"22", + X"AE",X"A4",X"25",X"CB",X"93",X"77",X"3C",X"78",X"CB",X"83",X"29",X"B3",X"AB",X"7D",X"5D",X"44", + X"A4",X"BC",X"79",X"8C",X"3A",X"76",X"CF",X"78",X"44",X"6B",X"D9",X"6B",X"3B",X"9A",X"CC",X"26", + X"A4",X"A3",X"1D",X"BA",X"A9",X"83",X"71",X"3A",X"8B",X"CC",X"6A",X"3E",X"E5",X"28",X"A4",X"A3", + X"1E",X"C9",X"9C",X"78",X"32",X"94",X"C4",X"74",X"88",X"2A",X"A2",X"BC",X"1A",X"E2",X"4B",X"86", + X"B3",X"72",X"48",X"68",X"D2",X"83",X"32",X"A4",X"B2",X"73",X"4E",X"5A",X"C8",X"9C",X"2C",X"90", + X"C1",X"7B",X"5E",X"41",X"CC",X"99",X"6F",X"3A",X"8B",X"C9",X"7A",X"84",X"23",X"BC",X"9D",X"33", + X"CC",X"82",X"24",X"D7",X"6C",X"47",X"D1",X"87",X"5C",X"41",X"C5",X"9F",X"71",X"35",X"A8",X"B9", + X"67",X"4F",X"5F",X"CE",X"8A",X"43",X"C6",X"80",X"54",X"4A",X"B1",X"AE",X"87",X"50",X"4F",X"C6", + X"9F",X"55",X"45",X"BB",X"AC",X"5C",X"41",X"A9",X"BE",X"5C",X"4C",X"72",X"D4",X"71",X"42",X"DA", + X"20",X"CF",X"6C",X"3D",X"D5",X"8A",X"78",X"39",X"7B",X"BF",X"99",X"75",X"37",X"99",X"C7",X"28", + X"7B",X"C3",X"91",X"58",X"46",X"9D",X"BB",X"88",X"60",X"40",X"9A",X"BB",X"8C",X"3B",X"6A",X"BA", + X"AC",X"31",X"7F",X"C8",X"2F",X"78",X"DC",X"33",X"AE",X"80",X"34",X"EE",X"38",X"74",X"D5",X"1F", + X"98",X"BA",X"82",X"58",X"4A",X"D6",X"86",X"56",X"49",X"F0",X"34",X"73",X"BD",X"9A",X"43",X"67", + X"C3",X"8D",X"2E",X"8B",X"B9",X"40",X"C6",X"33",X"B7",X"A5",X"27",X"8A",X"BA",X"42",X"BF",X"8A", + X"3A",X"6F",X"D1",X"5C",X"41",X"DF",X"6A",X"42",X"C3",X"A4",X"33",X"80",X"CC",X"5C",X"43",X"89", + X"BE",X"96",X"53",X"4E",X"8D",X"D4",X"2E",X"BD",X"56",X"6C",X"DA",X"53",X"47",X"9C",X"C8",X"2A", + X"75",X"B3",X"B0",X"2F",X"80",X"CA",X"2B",X"81",X"CD",X"35",X"7E",X"CE",X"32",X"81",X"CD",X"74", + X"40",X"74",X"D8",X"4E",X"58",X"D3",X"85",X"4D",X"53",X"AE",X"B8",X"61",X"3D",X"9F",X"C3",X"30", + X"86",X"D0",X"5E",X"47",X"7D",X"C6",X"91",X"4E",X"4E",X"A9",X"B9",X"6D",X"34",X"9F",X"B7",X"3F", + X"C6",X"7A",X"37",X"81",X"C5",X"8C",X"33",X"88",X"D3",X"44",X"59",X"82",X"C8",X"88",X"42",X"61", + X"AF",X"A2",X"44",X"D9",X"48",X"52",X"89",X"BC",X"99",X"2E",X"7E",X"B4",X"38",X"B7",X"9E",X"20", + X"E4",X"56",X"63",X"D9",X"56",X"43",X"B1",X"B8",X"37",X"6B",X"D3",X"6D",X"31",X"C8",X"65",X"8D", + X"B9",X"0B",X"BA",X"86",X"4D",X"D7",X"4E",X"4B",X"E7",X"3C",X"95",X"AD",X"1D",X"D8",X"72",X"35", + X"B4",X"A5",X"2F",X"B3",X"B6",X"44",X"57",X"93",X"CB",X"67",X"3F",X"A1",X"C7",X"21",X"89",X"9C", + X"5A",X"D8",X"20",X"A3",X"BA",X"25",X"89",X"AD",X"37",X"D8",X"5D",X"53",X"DC",X"77",X"43",X"70", + X"E1",X"46",X"59",X"83",X"CC",X"6E",X"37",X"E7",X"56",X"4E",X"86",X"D3",X"27",X"9E",X"AA",X"44", + X"C0",X"19",X"E9",X"54",X"63",X"DB",X"51",X"4D",X"88",X"CF",X"30",X"91",X"C5",X"66",X"35",X"C1", + X"9C",X"33",X"79",X"A7",X"BA",X"53",X"41",X"DD",X"4B",X"73",X"D2",X"25",X"7F",X"BB",X"9D",X"37", + X"68",X"A9",X"BD",X"3B",X"5C",X"CF",X"61",X"47",X"C9",X"9E",X"47",X"55",X"AF",X"96",X"5D",X"D0", + X"28",X"7E",X"D3",X"48",X"51",X"C7",X"95",X"21",X"BB",X"A6",X"3A",X"67",X"C3",X"81",X"37",X"DE", + X"7D",X"3F",X"72",X"AA",X"B4",X"15",X"DC",X"6C",X"47",X"D2",X"71",X"28",X"EB",X"2E",X"9F",X"93", + X"6C",X"9C",X"37",X"DB",X"43",X"AC",X"37",X"D3",X"4F",X"AC",X"8D",X"1B",X"DF",X"7E",X"46",X"6B", + X"BA",X"A5",X"35",X"73",X"CB",X"41",X"7E",X"C8",X"1D",X"D3",X"60",X"5F",X"DB",X"44",X"57",X"C2", + X"A2",X"41",X"5B",X"AE",X"96",X"5E",X"CC",X"10",X"CF",X"83",X"31",X"DF",X"59",X"46",X"CC",X"87", + X"28",X"D7",X"84",X"3D",X"7A",X"DD",X"3A",X"7B",X"C8",X"36",X"66",X"C8",X"60",X"9A",X"8F",X"29", + X"A8",X"B3",X"83",X"1F",X"D6",X"81",X"33",X"C4",X"82",X"2A",X"D4",X"6B",X"70",X"CA",X"1B",X"A9", + X"AB",X"22",X"AE",X"9E",X"49",X"D3",X"45",X"5A",X"A1",X"BB",X"70",X"27",X"E9",X"49",X"72",X"CC", + X"38",X"67",X"B6",X"AD",X"41",X"57",X"B7",X"8C",X"39",X"E4",X"70",X"4B",X"63",X"C7",X"52",X"AE", + X"8A",X"36",X"8A",X"BB",X"8E",X"2F",X"87",X"AB",X"B2",X"2D",X"72",X"94",X"CD",X"39",X"67",X"D9", + X"2B",X"86",X"C8",X"50",X"4D",X"BC",X"A1",X"3F",X"6B",X"BC",X"7C",X"48",X"E0",X"20",X"BA",X"83", + X"43",X"D4",X"26",X"BD",X"A2",X"3E",X"6C",X"CA",X"8A",X"38",X"7B",X"AF",X"AE",X"23",X"91",X"C0", + X"37",X"76",X"A3",X"C2",X"39",X"63",X"D9",X"48",X"5A",X"93",X"C9",X"43",X"62",X"90",X"B1",X"37", + X"D1",X"53",X"74",X"B1",X"37",X"F6",X"23",X"82",X"C3",X"52",X"4A",X"BB",X"75",X"95",X"88",X"3D", + X"90",X"C3",X"76",X"3B",X"87",X"A9",X"70",X"A6",X"61",X"4F",X"AE",X"B6",X"50",X"4B",X"E2",X"4A", + X"63",X"DC",X"3E",X"63",X"92",X"CC",X"4F",X"4D",X"E3",X"4A",X"5B",X"89",X"D0",X"47",X"5E",X"90", + X"D0",X"49",X"5B",X"7E",X"C6",X"76",X"3E",X"8C",X"AA",X"A4",X"15",X"CD",X"89",X"43",X"80",X"BD", + X"65",X"A8",X"3D",X"8E",X"CF",X"0B",X"C0",X"8E",X"46",X"76",X"C9",X"7A",X"3E",X"88",X"AA",X"A8", + X"18",X"BF",X"9C",X"2E",X"C3",X"85",X"2B",X"DC",X"6C",X"45",X"DB",X"4B",X"5F",X"92",X"AD",X"3D", + X"C3",X"4F",X"86",X"A6",X"75",X"81",X"36",X"E7",X"37",X"A6",X"7D",X"A5",X"5A",X"58",X"D8",X"4E", + X"56",X"AB",X"8E",X"49",X"DD",X"68",X"40",X"8A",X"B0",X"53",X"C3",X"4F",X"60",X"92",X"C6",X"51", + X"54",X"9A",X"C5",X"55",X"4D",X"93",X"C2",X"70",X"2F",X"E3",X"50",X"5B",X"8D",X"AF",X"48",X"AA", + X"81",X"98",X"4C",X"65",X"C1",X"66",X"BB",X"23",X"B0",X"9B",X"39",X"83",X"A4",X"B3",X"1A",X"B0", + X"9D",X"31",X"C3",X"8E",X"2B",X"E2",X"54",X"5A",X"DC",X"32",X"86",X"CA",X"14",X"C9",X"83",X"43", + X"83",X"AD",X"A6",X"15",X"DA",X"6D",X"4C",X"87",X"AF",X"63",X"B9",X"3A",X"8C",X"C5",X"0D",X"CC", + X"79",X"58",X"74",X"C9",X"7D",X"42",X"7C",X"B7",X"5C",X"A9",X"7B",X"41",X"93",X"B6",X"81",X"32", + X"9D",X"92",X"6B",X"87",X"9D",X"94",X"4A",X"6C",X"B7",X"A4",X"1B",X"BD",X"88",X"4D",X"7D",X"BD", + X"4D",X"99",X"8A",X"51",X"CF",X"1B",X"F2",X"56",X"5A",X"72",X"C3",X"4B",X"BE",X"63",X"52",X"E1", + X"2F",X"77",X"91",X"93",X"52",X"C0",X"37",X"E1",X"53",X"5A",X"DA",X"35",X"77",X"85",X"D5",X"39", + X"6D",X"80",X"D3",X"50",X"58",X"D3",X"2D",X"9A",X"B2",X"23",X"BC",X"8C",X"52",X"71",X"C1",X"8D", + X"3E",X"76",X"B3",X"6F",X"6D",X"A1",X"49",X"C9",X"2E",X"D1",X"38",X"C6",X"55",X"8B",X"7C",X"86", + X"B2",X"33",X"7E",X"AD",X"99",X"3C",X"80",X"A3",X"6E",X"88",X"98",X"50",X"AA",X"79",X"99",X"27", + X"FB",X"1D",X"AE",X"63",X"8F",X"94",X"51",X"B0",X"4A",X"AD",X"86",X"8B",X"39",X"EA",X"1B",X"AB", + X"9A",X"4C",X"73",X"B8",X"9A",X"3A",X"76",X"AC",X"64",X"88",X"8B",X"6D",X"A6",X"71",X"97",X"40", + X"8C",X"B5",X"4A",X"A0",X"68",X"86",X"8C",X"98",X"69",X"59",X"DE",X"1F",X"AB",X"A0",X"36",X"A8", + X"A7",X"28",X"E0",X"58",X"59",X"CE",X"37",X"82",X"C8",X"2E",X"A4",X"5A",X"AF",X"62",X"8E",X"C2", + X"2D",X"79",X"91",X"C2",X"2A",X"96",X"77",X"8A",X"99",X"8E",X"3D",X"C7",X"61",X"57",X"9D",X"A3", + X"44",X"DE",X"34",X"88",X"B1",X"37",X"89",X"A3",X"B3",X"15",X"CB",X"73",X"43",X"BA",X"8D",X"47", + X"9D",X"6F",X"C9",X"15",X"D1",X"72",X"53",X"CA",X"48",X"6B",X"9B",X"89",X"6A",X"A0",X"57",X"BE", + X"45",X"9C",X"A5",X"5E",X"54",X"CA",X"63",X"52",X"E1",X"25",X"AE",X"93",X"35",X"E5",X"2A",X"A5", + X"97",X"40",X"8A",X"9A",X"73",X"81",X"8E",X"57",X"CC",X"68",X"67",X"5D",X"C5",X"94",X"43",X"6E", + X"AA",X"A8",X"30",X"9D",X"6E",X"B3",X"6B",X"4B",X"AB",X"79",X"90",X"93",X"50",X"89",X"81",X"8A", + X"A4",X"42",X"9B",X"7F",X"67",X"9F",X"A8",X"48",X"80",X"BA",X"23",X"C5",X"6A",X"5E",X"91",X"99", + X"62",X"9A",X"91",X"6A",X"5A",X"D9",X"3D",X"81",X"B2",X"34",X"C5",X"7A",X"3F",X"BB",X"90",X"3D", + X"D0",X"50",X"65",X"95",X"94",X"63",X"C6",X"2D",X"A6",X"91",X"3D",X"CA",X"5F",X"66",X"91",X"97", + X"A6",X"35",X"A6",X"97",X"2E",X"D9",X"41",X"8F",X"A4",X"3E",X"A2",X"B0",X"2E",X"B5",X"7A",X"55", + X"C9",X"3F",X"84",X"C3",X"42",X"8A",X"72",X"9F",X"65",X"95",X"72",X"84",X"8A",X"58",X"C6",X"73", + X"47",X"D9",X"35",X"90",X"9F",X"4D",X"80",X"A8",X"A1",X"30",X"8F",X"8B",X"C5",X"18",X"B5",X"70", + X"65",X"B0",X"5D",X"93",X"93",X"7B",X"48",X"CB",X"52",X"7D",X"B0",X"3D",X"98",X"BA",X"2E",X"AD", + X"86",X"4A",X"BD",X"6E",X"4C",X"DA",X"53",X"78",X"77",X"96",X"75",X"83",X"82",X"82",X"A5",X"3D", + X"86",X"A2",X"A7",X"31",X"8B",X"8E",X"C3",X"20",X"AA",X"92",X"3A",X"C0",X"87",X"51",X"77",X"AD", + X"62",X"B9",X"4F",X"7F",X"BC",X"1E",X"BF",X"7E",X"51",X"C3",X"50",X"72",X"C0",X"49",X"8A",X"81", + X"72",X"AA",X"7B",X"55",X"8C",X"83",X"CA",X"2B",X"97",X"9C",X"4B",X"86",X"9F",X"B0",X"14",X"EA", + X"3C",X"8A",X"9B",X"51",X"C2",X"25",X"C7",X"70",X"5F",X"AF",X"52",X"C6",X"29",X"B8",X"7F",X"5F", + X"A3",X"5C",X"CB",X"26",X"AE",X"8B",X"3C",X"D6",X"48",X"8A",X"74",X"A2",X"8D",X"3F",X"D3",X"2A", + X"B9",X"7B",X"4D",X"A6",X"69",X"B6",X"6E",X"56",X"8A",X"A1",X"64",X"C3",X"28",X"B2",X"7D",X"60", + X"A6",X"58",X"D4",X"11",X"D1",X"5C",X"7A",X"A8",X"42",X"96",X"C7",X"27",X"A9",X"90",X"44",X"89", + X"9F",X"69",X"90",X"A7",X"25",X"DB",X"46",X"7C",X"B7",X"42",X"9A",X"6E",X"99",X"8C",X"81",X"41", + X"C7",X"7A",X"58",X"8D",X"83",X"B2",X"29",X"C1",X"6E",X"52",X"DA",X"44",X"83",X"B6",X"2A",X"C4", + X"41",X"A6",X"7A",X"76",X"98",X"5B",X"B6",X"86",X"42",X"A2",X"8A",X"4B",X"95",X"97",X"65",X"B7", + X"56",X"6C",X"D2",X"1E",X"B6",X"94",X"36",X"DD",X"38",X"96",X"7B",X"70",X"9E",X"95",X"59",X"77", + X"82",X"8D",X"7C",X"78",X"DC",X"01",X"CD",X"70",X"5D",X"76",X"B4",X"91",X"35",X"BD",X"48",X"D3", + X"36",X"8E",X"B7",X"2C",X"BE",X"49",X"CA",X"4C",X"72",X"CB",X"29",X"B9",X"82",X"3B",X"CC",X"71", + X"4B",X"D1",X"4F",X"6A",X"8D",X"C9",X"46",X"6A",X"CA",X"28",X"99",X"A9",X"61",X"59",X"AA",X"78", + X"8F",X"98",X"35",X"CE",X"64",X"58",X"95",X"A7",X"49",X"AC",X"57",X"9B",X"7C",X"70",X"DE",X"14", + X"A9",X"A3",X"3F",X"7B",X"C9",X"57",X"5F",X"D6",X"17",X"C5",X"7D",X"58",X"9E",X"71",X"B8",X"3D", + X"72",X"A7",X"6C",X"A7",X"80",X"3A",X"E5",X"22",X"A5",X"61",X"B6",X"86",X"38",X"D9",X"56",X"57", + X"9A",X"8E",X"64",X"97",X"96",X"7D",X"45",X"CC",X"5D",X"5A",X"A8",X"AA",X"3C",X"7E",X"97",X"C1", + X"22",X"9B",X"A7",X"45",X"7F",X"A1",X"B4",X"1D",X"BB",X"51",X"B9",X"7A",X"45",X"91",X"A5",X"67", + X"B8",X"34",X"9E",X"A8",X"35",X"88",X"B0",X"54",X"A8",X"8C",X"31",X"E7",X"41",X"6A",X"C7",X"41", + X"85",X"BA",X"2D",X"B1",X"A0",X"35",X"90",X"9F",X"75",X"A0",X"5D",X"52",X"CA",X"59",X"84",X"9A", + X"52",X"B2",X"66",X"AF",X"43",X"6E",X"BC",X"59",X"89",X"95",X"8B",X"74",X"44",X"AE",X"85",X"96", + X"7B",X"4A",X"8B",X"BD",X"7E",X"2F",X"D2",X"68",X"4D",X"D9",X"41",X"6F",X"CA",X"4D",X"62",X"A0", + X"B7",X"3C",X"76",X"D1",X"2E",X"98",X"B1",X"2A",X"BB",X"8D",X"2F",X"E2",X"4A",X"6C",X"C4",X"49", + X"64",X"A5",X"88",X"80",X"9E",X"2A",X"DD",X"59",X"54",X"CE",X"60",X"54",X"9E",X"9D",X"42",X"BF", + X"92",X"34",X"98",X"B7",X"40",X"77",X"9F",X"BC",X"28",X"93",X"B8",X"44",X"67",X"A7",X"AC",X"41", + X"6F",X"9F",X"91",X"50",X"C4",X"37",X"B1",X"7A",X"5B",X"DD",X"4C",X"58",X"C6",X"5D",X"51",X"BA", + X"82",X"47",X"D6",X"6B",X"45",X"AC",X"60",X"C5",X"3D",X"7D",X"CA",X"33",X"8D",X"AE",X"42",X"88", + X"CB",X"4F",X"5D",X"84",X"C3",X"31",X"B4",X"6B",X"6C",X"AD",X"73",X"AB",X"23",X"D5",X"6B",X"43", + X"D1",X"6A",X"47",X"CB",X"4B",X"77",X"C4",X"2B",X"BC",X"94",X"35",X"C6",X"77",X"3E",X"9E",X"94", + X"77",X"A5",X"43",X"7C",X"99",X"BD",X"3A",X"79",X"C8",X"2B",X"B8",X"83",X"37",X"D2",X"77",X"4F", + X"78",X"BD",X"43",X"AC",X"80",X"66",X"C8",X"28",X"89",X"A3",X"AF",X"2A",X"92",X"B9",X"3D",X"80", + X"CC",X"27",X"9A",X"B0",X"48",X"66",X"AD",X"8D",X"44",X"D0",X"6A",X"44",X"AA",X"87",X"6B",X"C7", + X"25",X"A3",X"AB",X"41",X"70",X"AD",X"71",X"9C",X"74",X"45",X"C9",X"91",X"51",X"5D",X"D9",X"4E", + X"62",X"C7",X"61",X"4C",X"A4",X"97",X"78",X"95",X"3D",X"9E",X"A8",X"30",X"D4",X"4B",X"81",X"B2", + X"33",X"C5",X"65",X"A4",X"63",X"4E",X"A8",X"98",X"5F",X"C0",X"30",X"96",X"B5",X"3D",X"75",X"B2", + X"92",X"31",X"B1",X"A5",X"33",X"A4",X"AD",X"43",X"68",X"B4",X"7A",X"51",X"DB",X"45",X"74",X"C9", + X"2D",X"95",X"AD",X"3B",X"8E",X"A9",X"3D",X"C0",X"70",X"62",X"D5",X"27",X"A7",X"9E",X"3F",X"7C", + X"BC",X"50",X"A4",X"8E",X"34",X"A3",X"A1",X"4E",X"99",X"BC",X"35",X"7B",X"BD",X"67",X"45",X"AA", + X"94",X"62",X"C1",X"3E",X"74",X"CB",X"41",X"74",X"A3",X"50",X"B6",X"9F",X"47",X"68",X"A6",X"AF", + X"4A",X"62",X"94",X"AC",X"3F",X"AD",X"A9",X"3F",X"72",X"8A",X"C7",X"54",X"5E",X"7A",X"C0",X"80", + X"4D",X"6B",X"B7",X"71",X"86",X"9F",X"2C",X"DC",X"60",X"59",X"79",X"BB",X"7C",X"40",X"A8",X"AC", + X"63",X"48",X"D4",X"67",X"56",X"79",X"B8",X"8D",X"38",X"BE",X"7E",X"3C",X"B0",X"97",X"54",X"C2", + X"37",X"98",X"B4",X"32",X"90",X"B9",X"4F",X"5E",X"B2",X"A0",X"34",X"9F",X"A3",X"35",X"AD",X"9B", + X"38",X"BB",X"97",X"4E",X"64",X"A4",X"94",X"53",X"D0",X"45",X"6A",X"C2",X"6E",X"42",X"CC",X"77", + X"52",X"73",X"BB",X"61",X"89",X"B2",X"2D",X"9C",X"B4",X"43",X"77",X"C5",X"57",X"59",X"93",X"A6", + X"5B",X"B6",X"50",X"63",X"BE",X"8D",X"4D",X"6A",X"A2",X"AA",X"6F",X"3F",X"C2",X"86",X"4B",X"75", + X"BD",X"76",X"4B",X"D2",X"5A",X"5A",X"8A",X"BF",X"5B",X"56",X"B3",X"9F",X"4E",X"66",X"C4",X"5D", + X"51",X"C0",X"68",X"70",X"C1",X"3E",X"75",X"BB",X"50",X"A6",X"88",X"3A",X"AB",X"A4",X"79",X"3A", + X"BC",X"8E",X"4A",X"74",X"B7",X"82",X"42",X"D2",X"5F",X"5A",X"7F",X"B4",X"8D",X"41",X"86",X"C0", + X"55",X"5F",X"C0",X"44",X"96",X"B6",X"5A",X"5A",X"84",X"BD",X"78",X"52",X"6C",X"BA",X"82",X"41", + X"BD",X"83",X"3E",X"A9",X"91",X"56",X"CA",X"38",X"95",X"AA",X"39",X"8B",X"AE",X"4D",X"8C",X"AC", + X"35",X"BC",X"79",X"52",X"C1",X"5A",X"80",X"C2",X"41",X"73",X"A8",X"4C",X"B1",X"9C",X"63",X"4F", + X"BB",X"8B",X"4B",X"70",X"B2",X"7F",X"46",X"D3",X"48",X"A3",X"94",X"3D",X"94",X"B6",X"52",X"61", + X"BD",X"49",X"91",X"B9",X"58",X"61",X"77",X"BD",X"4D",X"A9",X"84",X"43",X"CF",X"6A",X"58",X"74", + X"C2",X"57",X"93",X"61",X"84",X"BB",X"2E",X"B6",X"86",X"4B",X"C7",X"71",X"54",X"76",X"AF",X"73", + X"5D",X"D2",X"40",X"85",X"B7",X"59",X"5A",X"94",X"AF",X"40",X"9D",X"A1",X"32",X"BD",X"71",X"72", + X"BC",X"51",X"60",X"97",X"AC",X"7F",X"47",X"8D",X"B7",X"57",X"5B",X"C1",X"7B",X"52",X"73",X"AB", + X"8B",X"44",X"C1",X"82",X"42",X"BD",X"75",X"4B",X"B0",X"9D",X"6A",X"50",X"8A",X"AD",X"8E",X"53", + X"65",X"9C",X"AE",X"65",X"51",X"AF",X"99",X"43",X"80",X"B4",X"7E",X"3D",X"B9",X"6B",X"66",X"C2", + X"45",X"B4",X"81",X"50",X"72",X"BC",X"6E",X"4E",X"BA",X"7A",X"4A",X"C1",X"6F",X"5A",X"BB",X"89", + X"5C",X"5E",X"9B",X"AF",X"5E",X"5C",X"CA",X"43",X"87",X"B0",X"41",X"85",X"BA",X"4D",X"77",X"BA", + X"76",X"4A",X"A7",X"9D",X"54",X"61",X"AA",X"9C",X"47",X"7B",X"B2",X"8B",X"51",X"6C",X"9A",X"A4", + X"42",X"A4",X"A6",X"3A",X"A5",X"97",X"3F",X"9E",X"A7",X"78",X"4E",X"7F",X"B1",X"8A",X"58",X"64", + X"B8",X"88",X"48",X"87",X"B5",X"6E",X"49",X"BE",X"59",X"93",X"A5",X"46",X"74",X"9E",X"A3",X"35", + X"C2",X"72",X"55",X"C2",X"5B",X"60",X"B9",X"79",X"48",X"C8",X"57",X"84",X"B1",X"4B",X"6C",X"97", + X"AC",X"3F",X"8C",X"AF",X"47",X"AF",X"89",X"4A",X"7D",X"A4",X"9E",X"4F",X"6A",X"B1",X"8E",X"45", + X"88",X"B2",X"70",X"4B",X"A7",X"9C",X"41",X"AD",X"96",X"49",X"7B",X"B6",X"77",X"4B",X"B4",X"8D", + X"56",X"67",X"A2",X"A0",X"3E",X"B2",X"84",X"45",X"AC",X"9A",X"78",X"44",X"B1",X"80",X"52",X"C9", + X"4B",X"7E",X"B7",X"3C",X"A1",X"99",X"40",X"9F",X"A3",X"7C",X"4C",X"8A",X"B0",X"76",X"4C",X"9D", + X"A6",X"3F",X"9C",X"A5",X"5E",X"5C",X"B7",X"85",X"4E",X"7E",X"B4",X"6A",X"56",X"CD",X"4B",X"99", + X"6F",X"69",X"C4",X"45",X"89",X"B2",X"60",X"60",X"7F",X"BB",X"57",X"6E",X"B4",X"84",X"66",X"59", + X"BD",X"4A",X"9F",X"A0",X"5B",X"5F",X"A1",X"A4",X"65",X"57",X"94",X"A3",X"8E",X"46",X"8A",X"9B", + X"58",X"B7",X"78",X"4C",X"9B",X"A1",X"40",X"AF",X"87",X"42",X"B4",X"80",X"5E",X"BB",X"4B",X"7D", + X"BB",X"42",X"95",X"A1",X"42",X"AA",X"98",X"59",X"64",X"A4",X"A0",X"5F",X"5D",X"9C",X"A7",X"66", + X"57",X"A0",X"A4",X"5E",X"61",X"8A",X"B4",X"4D",X"92",X"A5",X"55",X"68",X"8F",X"B1",X"55",X"6C", + X"BE",X"51",X"88",X"A6",X"36",X"C2",X"6C",X"60",X"B2",X"84",X"4D",X"84",X"A8",X"4A",X"A5",X"9E", + X"60",X"5D",X"AD",X"92",X"76",X"4E",X"94",X"A8",X"72",X"4C",X"B0",X"7A",X"57",X"B8",X"85",X"72", + X"51",X"C2",X"59",X"6C",X"B1",X"86",X"69",X"5A",X"92",X"A9",X"7B",X"50",X"8B",X"B3",X"41",X"AD", + X"6F",X"61",X"B7",X"82",X"6E",X"55",X"A0",X"9F",X"4B",X"87",X"B1",X"52",X"9B",X"96",X"59",X"68", + X"B7",X"55",X"85",X"B1",X"64",X"65",X"70",X"BB",X"6A",X"5F",X"B0",X"8A",X"76",X"55",X"82",X"AE", + X"82",X"5F",X"66",X"A1",X"9C",X"48",X"B7",X"67",X"60",X"B8",X"76",X"4D",X"B7",X"76",X"62",X"B1", + X"7C",X"55",X"84",X"AD",X"77",X"55",X"8B",X"AC",X"40",X"9A",X"A1",X"75",X"57",X"7D",X"A6",X"91", + X"75",X"5C",X"74",X"AE",X"7D",X"52",X"C1",X"58",X"74",X"B7",X"45",X"95",X"A1",X"70",X"57",X"89", + X"AA",X"81",X"5B",X"6D",X"9F",X"9E",X"6F",X"57",X"AB",X"8E",X"63",X"5E",X"B0",X"80",X"4E",X"B1", + X"88",X"4C",X"9E",X"9A",X"46",X"98",X"A4",X"6C",X"55",X"B0",X"84",X"56",X"B8",X"48",X"92",X"A3", + X"7D",X"69",X"5C",X"A6",X"98",X"51",X"83",X"B5",X"4C",X"8E",X"A3",X"69",X"5E",X"80",X"AF",X"6B", + X"5B",X"B3",X"7C",X"52",X"B1",X"88",X"81",X"50",X"88",X"A7",X"83",X"54",X"82",X"AB",X"46",X"9F", + X"9F",X"4B",X"94",X"9F",X"42",X"A8",X"92",X"84",X"59",X"77",X"B3",X"46",X"A5",X"8C",X"4A",X"AE", + X"8A",X"59",X"A9",X"82",X"67",X"60",X"99",X"9F",X"81",X"6A",X"5B",X"BF",X"4F",X"9C",X"82",X"54", + X"BA",X"75",X"55",X"A7",X"8A",X"4B",X"A4",X"96",X"82",X"61",X"67",X"9A",X"9E",X"4D",X"8A",X"A7", + X"7F",X"73",X"52",X"BB",X"60",X"73",X"AC",X"83",X"73",X"59",X"89",X"A4",X"88",X"50",X"95",X"A2", + X"67",X"63",X"7D",X"B0",X"72",X"59",X"A9",X"8F",X"50",X"87",X"AC",X"47",X"9C",X"97",X"7B",X"53", + X"92",X"A0",X"7B",X"5B",X"7F",X"B1",X"49",X"8D",X"A4",X"7B",X"66",X"62",X"B4",X"76",X"66",X"AA", + X"81",X"62",X"6D",X"AF",X"80",X"6D",X"5C",X"97",X"9C",X"86",X"69",X"60",X"AE",X"80",X"4E",X"B9", + X"66",X"6D",X"AA",X"83",X"64",X"69",X"AD",X"86",X"6B",X"60",X"8C",X"AA",X"65",X"66",X"AF",X"80", + X"51",X"9A",X"9B",X"7B",X"72",X"57",X"A5",X"92",X"87",X"67",X"66",X"86",X"B2",X"58",X"8E",X"8B", + X"5F",X"B0",X"71",X"6B",X"63",X"A7",X"8F",X"85",X"67",X"63",X"B2",X"61",X"6F",X"AE",X"81",X"7F", + X"4E",X"A4",X"8D",X"51",X"9F",X"99",X"73",X"62",X"75",X"B6",X"66",X"79",X"9F",X"50",X"B7",X"4C", + X"8E",X"9E",X"7D",X"5C",X"7F",X"AF",X"4B",X"8D",X"A1",X"7D",X"65",X"66",X"AE",X"7B",X"62",X"AD", + X"7B",X"6C",X"5F",X"A8",X"8D",X"84",X"66",X"65",X"A7",X"8D",X"75",X"58",X"9F",X"97",X"74",X"60", + X"79",X"A4",X"8E",X"6A",X"5F",X"A7",X"8D",X"53",X"A7",X"87",X"73",X"57",X"B1",X"74",X"68",X"AD", + X"48",X"A0",X"94",X"81",X"6D",X"5F",X"94",X"9C",X"85",X"6D",X"5F",X"97",X"9D",X"78",X"5B",X"87", + X"AA",X"5E",X"6C",X"A6",X"8A",X"7A",X"5D",X"7B",X"9E",X"96",X"59",X"7D",X"AB",X"4C",X"98",X"95", + X"4B",X"A5",X"8B",X"55",X"A5",X"8D",X"71",X"60",X"84",X"A4",X"84",X"7F",X"5A",X"82",X"AB",X"5B", + X"78",X"B2",X"5B",X"7F",X"A2",X"4D",X"94",X"A2",X"51",X"98",X"93",X"78",X"57",X"9B",X"95",X"7D", + X"57",X"90",X"9D",X"53",X"A2",X"8D",X"6C",X"65",X"81",X"AD",X"68",X"71",X"A9",X"53",X"A4",X"82", + X"7A",X"55",X"A4",X"88",X"53",X"A5",X"8D",X"7F",X"6A",X"63",X"A7",X"87",X"59",X"A5",X"8A",X"77", + X"61",X"7B",X"AD",X"73",X"6B",X"A1",X"7F",X"6F",X"60",X"B2",X"6C",X"66",X"AA",X"82",X"81",X"5E", + X"75",X"9D",X"92",X"7D",X"6C",X"63",X"B0",X"73",X"60",X"A8",X"86",X"80",X"62",X"71",X"99",X"9A", + X"50",X"97",X"92",X"51",X"9D",X"96",X"51",X"A5",X"79",X"5D",X"AA",X"85",X"80",X"64",X"6D",X"AB", + X"77",X"64",X"A9",X"82",X"77",X"5F",X"85",X"A1",X"85",X"7F",X"5B",X"88",X"A4",X"4E",X"95",X"98", + X"81",X"69",X"69",X"B1",X"55",X"90",X"99",X"4F",X"A7",X"7E",X"59",X"AA",X"7C",X"5B",X"9E",X"92", + X"7E",X"70",X"5F",X"A1",X"8F",X"85",X"5F",X"78",X"A6",X"7F",X"77",X"5A",X"A0",X"87",X"58",X"A0", + X"93",X"59",X"97",X"94",X"5B",X"76",X"9F",X"8E",X"63",X"72",X"AC",X"57",X"81",X"A6",X"66",X"68", + X"A7",X"83",X"5C",X"A7",X"80",X"7A",X"59",X"97",X"9A",X"5D",X"7A",X"AD",X"66",X"72",X"A1",X"80", + X"70",X"62",X"A7",X"85",X"7B",X"5F",X"7E",X"9D",X"8E",X"73",X"5F",X"93",X"9D",X"63",X"6D",X"AA", + X"7B",X"89",X"5B",X"7F",X"A0",X"84",X"64",X"78",X"A5",X"7A",X"75",X"5E",X"9C",X"93",X"7F",X"7C", + X"58",X"A0",X"8D",X"80",X"61",X"77",X"9D",X"91",X"65",X"71",X"A4",X"80",X"76",X"5E",X"A4",X"89", + X"7C",X"62",X"78",X"9D",X"8D",X"7D",X"6C",X"68",X"B0",X"69",X"78",X"A3",X"54",X"9F",X"8A",X"79", + X"63",X"7A",X"9E",X"8D",X"64",X"71",X"AD",X"6D",X"6D",X"9D",X"86",X"6F",X"68",X"82",X"A8",X"6A", + X"74",X"A2",X"7A",X"73",X"61",X"B1",X"66",X"73",X"A8",X"5C",X"7D",X"A7",X"6C",X"6C",X"AA",X"56", + X"97",X"89",X"55",X"A7",X"85",X"85",X"6E",X"66",X"A6",X"82",X"82",X"5F",X"81",X"A5",X"55",X"8A", + X"9C",X"7C",X"81",X"5B",X"8A",X"9F",X"5E",X"7E",X"A9",X"5D",X"79",X"9E",X"87",X"61",X"76",X"9E", + X"8C",X"65",X"72",X"A2",X"83",X"78",X"60",X"A2",X"86",X"7C",X"5E",X"9B",X"8C",X"56",X"AD",X"66", + X"71",X"A3",X"81",X"82",X"66",X"74",X"AE",X"5E",X"82",X"9B",X"58",X"8E",X"9E",X"63",X"72",X"A1", + X"84",X"72",X"62",X"9F",X"8B",X"81",X"73",X"65",X"89",X"9D",X"7F",X"84",X"5E",X"84",X"9E",X"7C", + X"7B",X"5E",X"8B",X"96",X"8C",X"56",X"96",X"90",X"80",X"66",X"74",X"9A",X"92",X"61",X"78",X"9E", + X"87",X"69",X"72",X"A2",X"7F",X"76",X"63",X"8B",X"9A",X"83",X"5B",X"8F",X"98",X"7B",X"7F",X"5B", + X"92",X"98",X"5A",X"9D",X"86",X"81",X"62",X"80",X"A0",X"7B",X"76",X"61",X"9A",X"91",X"80",X"7B", + X"5E",X"91",X"96",X"7F",X"6E",X"69",X"99",X"94",X"64",X"75",X"A6",X"74",X"64",X"8F",X"9D",X"65", + X"72",X"A1",X"83",X"74",X"62",X"9F",X"89",X"82",X"72",X"67",X"88",X"9D",X"7A",X"62",X"AC",X"5A", + X"8F",X"90",X"7F",X"6E",X"6B",X"8E",X"9D",X"61",X"86",X"9B",X"56",X"9D",X"88",X"7C",X"64",X"7B", + X"99",X"8E",X"5E",X"7F",X"9F",X"7F",X"83",X"63",X"7D",X"A5",X"6A",X"6C",X"99",X"8F",X"57",X"A1", + X"7C",X"68",X"9C",X"86",X"6B",X"72",X"A2",X"7B",X"81",X"5C",X"98",X"90",X"77",X"61",X"A5",X"71", + X"6B",X"A0",X"87",X"73",X"68",X"A2",X"80",X"80",X"63",X"7D",X"9E",X"81",X"60",X"A2",X"77",X"69", + X"A8",X"6B",X"6D",X"9D",X"83",X"7E",X"65",X"7C",X"9D",X"86",X"62",X"80",X"A1",X"6F",X"68",X"A0", + X"83",X"84",X"6C",X"6E",X"92",X"9A",X"5D",X"8C",X"8F",X"5F",X"A1",X"7F",X"7F",X"65",X"7B",X"98", + X"8C",X"61",X"7C",X"A1",X"78",X"66",X"A3",X"68",X"75",X"A3",X"7A",X"87",X"69",X"70",X"8E",X"97", + X"7C",X"62",X"93",X"90",X"79",X"6B",X"74",X"A0",X"83",X"63",X"87",X"9E",X"6D",X"70",X"A1",X"60", + X"8E",X"91",X"7A",X"73",X"68",X"97",X"8E",X"84",X"73",X"68",X"8D",X"9A",X"75",X"66",X"9E",X"7F", + X"60",X"9A",X"8E",X"61",X"8D",X"92",X"57",X"96",X"8E",X"81",X"79",X"65",X"9C",X"87",X"7A",X"67", + X"80",X"9E",X"7D",X"85",X"64",X"7B",X"9B",X"85",X"72",X"68",X"98",X"8F",X"74",X"66",X"9A",X"89", + X"5D",X"8D",X"96",X"7C",X"60",X"A1",X"7C",X"69",X"9D",X"81",X"78",X"65",X"A2",X"78",X"69",X"A8", + X"62",X"83",X"95",X"7E",X"76",X"67",X"8B",X"97",X"7B",X"61",X"A7",X"6B",X"76",X"9C",X"7F",X"77", + X"66",X"91",X"95",X"77",X"64",X"98",X"8E",X"64",X"7B",X"9D",X"7F",X"61",X"94",X"8F",X"7C",X"66", + X"82",X"9D",X"7A",X"87",X"66",X"7A",X"A0",X"6E",X"6D",X"A0",X"7F",X"84",X"71",X"6B",X"9E",X"83", + X"7E",X"62",X"90",X"92",X"7B",X"79",X"62",X"A4",X"79",X"70",X"99",X"84",X"62",X"8B",X"92",X"7F", + X"74",X"6B",X"8A",X"99",X"75",X"68",X"99",X"8C",X"68",X"77",X"9D",X"7D",X"83",X"6F",X"6D",X"91", + X"91",X"83",X"6F",X"6E",X"99",X"8C",X"69",X"76",X"9F",X"79",X"68",X"A1",X"70",X"6D",X"9B",X"86", + X"60",X"9C",X"7C",X"6A",X"9F",X"7B",X"84",X"65",X"81",X"A0",X"61",X"89",X"91",X"7D",X"7B",X"65", + X"8D",X"95",X"7E",X"83",X"70",X"6D",X"A3",X"73",X"70",X"A1",X"67",X"7F",X"9C",X"5A",X"98",X"7F", + X"6B",X"A0",X"78",X"87",X"60",X"8A",X"95",X"7C",X"81",X"61",X"94",X"8E",X"7F",X"7A",X"67",X"88", + X"93",X"88",X"6F",X"71",X"A0",X"67",X"78",X"98",X"88",X"6D",X"72",X"9E",X"7E",X"83",X"78",X"67", + X"8D",X"92",X"82",X"63",X"8F",X"8F",X"7D",X"7A",X"66",X"8F",X"93",X"7B",X"66",X"A3",X"6B",X"7B", + X"97",X"7E",X"74",X"6B",X"9B",X"86",X"7F",X"80",X"66",X"82",X"95",X"87",X"62",X"88",X"95",X"7D", + X"82",X"6B",X"77",X"99",X"86",X"66",X"91",X"8C",X"74",X"6C",X"98",X"85",X"7B",X"66",X"97",X"87", + X"80",X"74",X"6D",X"8C",X"96",X"73",X"70",X"A1",X"64",X"7A",X"93",X"8D",X"64",X"80",X"96",X"82", + X"6F",X"71",X"99",X"87",X"65",X"82",X"98",X"7F",X"82",X"71",X"6F",X"92",X"8D",X"83",X"6E",X"73", + X"95",X"8C",X"6E",X"74",X"9A",X"7E",X"82",X"69",X"7E",X"9F",X"62",X"88",X"91",X"64",X"8F",X"8F", + X"65",X"7E",X"96",X"83",X"63",X"8D",X"90",X"7F",X"7D",X"67",X"98",X"85",X"7E",X"66",X"92",X"8B", + X"7C",X"6C",X"7C",X"9B",X"7C",X"69",X"94",X"86",X"7F",X"72",X"6F",X"8F",X"91",X"78",X"68",X"97", + X"89",X"7B",X"67",X"97",X"86",X"80",X"74",X"6C",X"94",X"8C",X"7E",X"82",X"6B",X"7C",X"9F",X"67", + X"82",X"96",X"6A",X"77",X"9A",X"7E",X"83",X"78",X"69",X"98",X"86",X"81",X"74",X"6D",X"8C",X"91", + X"81",X"7A",X"69",X"99",X"80",X"65",X"90",X"8F",X"7D",X"66",X"96",X"87",X"7F",X"67",X"8D",X"8F", + X"61",X"98",X"7F",X"67",X"8E",X"90",X"7D",X"82",X"69",X"7D",X"96",X"86",X"6A",X"7D",X"9D",X"6F", + X"76",X"99",X"6E",X"71",X"99",X"83",X"83",X"71",X"71",X"8F",X"91",X"71",X"72",X"9A",X"7D",X"84", + X"6A",X"7A",X"8C",X"94",X"6B",X"7D",X"94",X"7F",X"6D",X"79",X"97",X"84",X"67",X"85",X"93",X"81", + X"73",X"74",X"9B",X"7A",X"84",X"68",X"80",X"97",X"7E",X"83",X"69",X"82",X"99",X"69",X"82",X"97", + X"65",X"87",X"91",X"63",X"93",X"86",X"7F",X"76",X"6C",X"94",X"89",X"82",X"6D",X"78",X"96",X"86", + X"69",X"80",X"97",X"79",X"6D",X"97",X"7D",X"6A",X"9A",X"76",X"6D",X"98",X"83",X"81",X"7D",X"6C", + X"80",X"93",X"87",X"65",X"96",X"83",X"81",X"78",X"6B",X"99",X"82",X"82",X"73",X"70",X"91",X"8D", + X"7C",X"84",X"69",X"80",X"97",X"7B",X"85",X"6C",X"79",X"92",X"8B",X"73",X"71",X"9B",X"75",X"6E", + X"91",X"8E",X"70",X"73",X"97",X"84",X"6B",X"80",X"98",X"77",X"70",X"95",X"7F",X"67",X"93",X"89", + X"7F",X"7E",X"6B",X"83",X"95",X"7F",X"82",X"78",X"6C",X"98",X"83",X"81",X"79",X"6B",X"96",X"84", + X"67",X"95",X"84",X"68",X"8E",X"8F",X"71",X"72",X"8F",X"8F",X"6B",X"80",X"93",X"7A",X"6B",X"91", + X"87",X"65",X"90",X"8D",X"74",X"6E",X"93",X"89",X"7D",X"82",X"6B",X"7E",X"93",X"87",X"6B",X"7F", + X"97",X"7A",X"86",X"6B",X"7E",X"95",X"7D",X"83",X"71",X"74",X"93",X"88",X"7F",X"7E",X"69",X"96", + X"83",X"81",X"79",X"6C",X"8B",X"90",X"7D",X"83",X"77",X"6E",X"8A",X"92",X"77",X"71",X"98",X"78", + X"6F",X"9B",X"6E",X"7D",X"94",X"7A",X"83",X"65",X"93",X"88",X"81",X"78",X"6F",X"86",X"96",X"71", + X"79",X"94",X"7D",X"80",X"6C",X"7E",X"91",X"87",X"7E",X"80",X"6B",X"80",X"8F",X"8B",X"6B",X"7D", + X"95",X"7D",X"83",X"72",X"73",X"92",X"88",X"80",X"6E",X"7C",X"95",X"80",X"6D",X"7F",X"95",X"7D", + X"83",X"77",X"6E",X"92",X"88",X"7F",X"6F",X"7A",X"96",X"7F",X"6E",X"80",X"99",X"6B",X"7F",X"90", + X"80",X"75",X"72",X"94",X"87",X"75",X"72",X"99",X"78",X"6F",X"8C",X"8F",X"6C",X"7C",X"92",X"80", + X"78",X"6E",X"90",X"8C",X"72",X"73",X"96",X"81",X"81",X"6D",X"7F",X"95",X"7D",X"83",X"7B",X"6E", + X"83",X"93",X"7E",X"83",X"6A",X"88",X"90",X"66",X"8C",X"8D",X"69",X"86",X"92",X"7B",X"85",X"70", + X"76",X"8D",X"8E",X"70",X"78",X"96",X"7C",X"85",X"6F",X"79",X"98",X"74",X"71",X"90",X"89",X"7C", + X"83",X"6B",X"83",X"91",X"80",X"80",X"70",X"79",X"90",X"88",X"7E",X"81",X"6E",X"7D",X"98",X"71", + X"7B",X"93",X"7A",X"85",X"6B",X"80",X"92",X"81",X"80",X"71",X"79",X"99",X"74",X"78",X"93",X"7C", + X"83",X"70",X"78",X"8D",X"8B",X"7E",X"80",X"6C",X"82",X"90",X"84",X"6A",X"8B",X"8C",X"7D",X"81", + X"6B",X"8B",X"8F",X"6D",X"82",X"92",X"6C",X"7F",X"94",X"72",X"74",X"91",X"86",X"6D",X"82",X"93", + X"69",X"82",X"91",X"80",X"6E",X"81",X"94",X"77",X"73",X"93",X"7C",X"6F",X"97",X"78",X"71",X"8B", + X"8F",X"6C",X"82",X"8E",X"7D",X"81",X"6F",X"7C",X"8F",X"87",X"7E",X"80",X"6E",X"7E",X"8E",X"8A", + X"70",X"78",X"95",X"7D",X"84",X"78",X"71",X"87",X"91",X"79",X"70",X"91",X"85",X"7C",X"6F",X"8B", + X"8C",X"67",X"90",X"82",X"6F",X"91",X"84",X"76",X"72",X"8D",X"8D",X"70",X"7D",X"93",X"6F",X"7D", + X"95",X"68",X"88",X"8B",X"80",X"78",X"73",X"96",X"7D",X"84",X"73",X"75",X"93",X"83",X"81",X"77", + X"72",X"8E",X"8A",X"7E",X"80",X"6D",X"8C",X"8C",X"6A",X"83",X"8F",X"81",X"6D",X"85",X"8F",X"7E", + X"6D",X"88",X"8D",X"7F",X"6F",X"82",X"91",X"7D",X"6F",X"85",X"8F",X"7D",X"7D",X"6D",X"90",X"88", + X"7C",X"6E",X"94",X"80",X"70",X"8E",X"87",X"76",X"74",X"92",X"81",X"7D",X"6D",X"8F",X"87",X"7F", + X"71",X"7C",X"92",X"81",X"73",X"7A",X"95",X"7C",X"84",X"7B",X"6F",X"8D",X"8A",X"7B",X"71",X"82", + X"92",X"79",X"73",X"91",X"7E",X"6D",X"8D",X"89",X"7D",X"83",X"6D",X"84",X"8F",X"7D",X"83",X"70", + X"7B",X"8B",X"8B",X"7B",X"85",X"71",X"7A",X"93",X"7E",X"82",X"75",X"75",X"89",X"8D",X"7D",X"6D", + X"90",X"85",X"81",X"79",X"71",X"8D",X"8A",X"79",X"72",X"91",X"83",X"7D",X"6F",X"86",X"8E",X"7D", + X"70",X"85",X"90",X"7A",X"86",X"74",X"76",X"91",X"82",X"81",X"79",X"72",X"87",X"8D",X"80",X"6D", + X"86",X"8E",X"7E",X"82",X"76",X"74",X"89",X"8B",X"82",X"72",X"7F",X"94",X"6F",X"80",X"8D",X"7E", + X"73",X"7B",X"92",X"7F",X"71",X"8A",X"89",X"6A",X"89",X"8B",X"81",X"71",X"7F",X"91",X"7C",X"84", + X"79",X"72",X"8D",X"89",X"6C",X"8C",X"86",X"7F",X"7C",X"71",X"83",X"8D",X"83",X"7E",X"81",X"6E", + X"83",X"8D",X"85",X"71",X"7C",X"91",X"7E",X"82",X"7D",X"70",X"88",X"8D",X"7D",X"83",X"6E",X"84", + X"8F",X"7C",X"83",X"70",X"7E",X"90",X"7F",X"82",X"76",X"76",X"93",X"7E",X"83",X"7A",X"72",X"8D", + X"89",X"76",X"75",X"92",X"7F",X"83",X"76",X"76",X"92",X"7F",X"6F",X"8A",X"8A",X"7D",X"72",X"83", + X"90",X"79",X"75",X"8A",X"87",X"6B",X"89",X"89",X"7F",X"7F",X"71",X"81",X"93",X"70",X"7E",X"8E", + X"80",X"79",X"73",X"8E",X"88",X"79",X"72",X"8E",X"86",X"7B",X"72",X"8E",X"85",X"6E",X"8E",X"84", + X"6F",X"85",X"8E",X"78",X"74",X"91",X"7C",X"71",X"94",X"7A",X"73",X"8A",X"8C",X"76",X"76",X"8F", + X"84",X"7D",X"83",X"6E",X"86",X"8B",X"81",X"71",X"83",X"8D",X"7E",X"78",X"75",X"92",X"81",X"81", + X"7D",X"72",X"82",X"8E",X"80",X"80",X"7E",X"70",X"85",X"8C",X"83",X"70",X"80",X"8E",X"7F",X"72", + X"81",X"90",X"7A",X"86",X"72",X"7D",X"90",X"77",X"74",X"8C",X"88",X"7D",X"83",X"75",X"78",X"8C", + X"88",X"7D",X"83",X"74",X"79",X"8F",X"83",X"6F",X"87",X"8C",X"79",X"73",X"8A",X"89",X"7D",X"83", + X"76",X"76",X"8C",X"87",X"7F",X"7D",X"70",X"8C",X"87",X"80",X"71",X"84",X"8D",X"7C",X"73",X"8C", + X"83",X"6E",X"89",X"8A",X"7C",X"73",X"90",X"7E",X"83",X"70",X"84",X"8C",X"7E",X"78",X"78",X"93", + X"7A",X"73",X"8A",X"89",X"7C",X"84",X"77",X"76",X"90",X"81",X"81",X"7A",X"73",X"8B",X"89",X"71", + X"7E",X"8F",X"7E",X"71",X"8B",X"86",X"7F",X"7E",X"70",X"8D",X"87",X"72",X"7D",X"8E",X"82",X"73", + X"7E",X"8F",X"7F",X"82",X"7D",X"72",X"88",X"8C",X"6F",X"86",X"89",X"7D",X"81",X"70",X"83",X"8C", + X"82",X"70",X"83",X"8C",X"81",X"72",X"80",X"8E",X"7D",X"83",X"7A",X"74",X"86",X"8C",X"7C",X"72", + X"87",X"8B",X"7D",X"83",X"78",X"76",X"8F",X"82",X"71",X"8D",X"82",X"80",X"7E",X"72",X"83",X"8D", + X"7E",X"83",X"74",X"7E",X"8F",X"7B",X"85",X"74",X"7B",X"8F",X"7F",X"81",X"7B",X"73",X"87",X"8A", + X"80",X"72",X"8B",X"84",X"7E",X"80",X"70",X"8B",X"87",X"7E",X"82",X"73",X"7D",X"8C",X"86",X"77", + X"79",X"91",X"79",X"77",X"90",X"7A",X"77",X"90",X"79",X"75",X"8B",X"87",X"77",X"79",X"91",X"74", + X"7D",X"8C",X"7F",X"72",X"85",X"8B",X"7D",X"72",X"87",X"89",X"7F",X"7B",X"74",X"8D",X"86",X"76", + X"7A",X"91",X"74",X"7A",X"8B",X"86",X"78",X"77",X"8E",X"82",X"7F",X"81",X"73",X"7E",X"8C",X"84", + X"76",X"7B",X"91",X"77",X"77",X"8A",X"87",X"76",X"79",X"8B",X"86",X"75",X"7B",X"8B",X"85",X"72", + X"83",X"89",X"7E",X"7E",X"73",X"8F",X"80",X"73",X"83",X"8D",X"7D",X"84",X"73",X"7E",X"8B",X"84", + X"74",X"7D",X"8C",X"82",X"74",X"7F",X"8D",X"80",X"7B",X"74",X"8D",X"84",X"79",X"76",X"8F",X"80", + X"82",X"72",X"85",X"8A",X"7C",X"82",X"71",X"85",X"8A",X"7F",X"81",X"76",X"7B",X"8F",X"7F",X"83", + X"75",X"7B",X"89",X"89",X"73",X"81",X"8B",X"7C",X"84",X"74",X"7D",X"8C",X"81",X"71",X"89",X"87", + X"80",X"72",X"88",X"87",X"7F",X"75",X"82",X"8C",X"7B",X"84",X"73",X"7F",X"8E",X"7A",X"76",X"8D", + X"81",X"7E",X"74",X"8C",X"84",X"71",X"85",X"8A",X"7E",X"74",X"86",X"8A",X"7B",X"75",X"8A",X"85", + X"71",X"8B",X"83",X"73",X"89",X"85",X"7B",X"75",X"87",X"8A",X"79",X"76",X"8C",X"83",X"7F",X"80", + X"73",X"81",X"89",X"86",X"73",X"7D",X"8B",X"84",X"7A",X"76",X"8C",X"83",X"7F",X"75",X"81",X"8D", + X"7D",X"84",X"77",X"7A",X"8E",X"7B",X"75",X"8D",X"80",X"81",X"7B",X"75",X"8C",X"84",X"7F",X"73", + X"87",X"88",X"7D",X"82",X"75",X"7D",X"8D",X"7F",X"74",X"8D",X"7E",X"75",X"8D",X"7E",X"74",X"88", + X"88",X"7A",X"78",X"8D",X"7C",X"75",X"87",X"89",X"7A",X"76",X"88",X"89",X"77",X"7A",X"8E",X"7C", + X"74",X"8A",X"85",X"7E",X"82",X"76",X"7B",X"89",X"87",X"72",X"88",X"85",X"7E",X"81",X"74",X"7F", + X"88",X"87",X"75",X"7E",X"8E",X"77",X"79",X"8A",X"85",X"77",X"7A",X"8B",X"83",X"76",X"7F",X"8C", + X"73",X"7E",X"8B",X"82",X"75",X"7E",X"8C",X"7F",X"77",X"7C",X"8D",X"80",X"75",X"86",X"87",X"73", + X"7F",X"8B",X"80",X"7F",X"74",X"89",X"85",X"72",X"89",X"85",X"73",X"88",X"85",X"7D",X"82",X"71", + X"8A",X"84",X"83",X"74",X"82",X"89",X"81",X"78",X"7D",X"8C",X"7F",X"7C",X"76",X"8A",X"86",X"7B", + X"77",X"8C",X"81",X"80",X"7E",X"74",X"86",X"88",X"82",X"7A",X"78",X"8B",X"83",X"7E",X"82",X"77", + X"7B",X"88",X"87",X"7A",X"77",X"86",X"89",X"78",X"7A",X"8C",X"7F",X"81",X"79",X"78",X"87",X"87", + X"81",X"76",X"80",X"8D",X"74",X"81",X"89",X"7D",X"83",X"76",X"7D",X"8B",X"81",X"73",X"87",X"88", + X"7D",X"76",X"8D",X"7D",X"77",X"8A",X"82",X"7A",X"78",X"89",X"86",X"76",X"7C",X"8B",X"81",X"7D", + X"75",X"8B",X"82",X"74",X"8A",X"82",X"74",X"8B",X"81",X"80",X"7E",X"75",X"85",X"8A",X"77",X"7B", + X"8A",X"83",X"77",X"7C",X"8B",X"81",X"77",X"7D",X"8D",X"7D",X"83",X"7A",X"78",X"89",X"86",X"7D", + X"83",X"79",X"79",X"8A",X"84",X"75",X"80",X"8A",X"80",X"7B",X"78",X"8E",X"7C",X"78",X"8B",X"7F", + X"81",X"7C",X"76",X"86",X"87",X"80",X"74",X"85",X"88",X"7B",X"76",X"8C",X"81",X"82",X"78",X"7C", + X"8A",X"80",X"7B",X"78",X"8C",X"80",X"7E",X"75",X"87",X"87",X"7D",X"76",X"86",X"88",X"7B",X"77", + X"87",X"87",X"79",X"7A",X"8C",X"7B",X"78",X"8C",X"80",X"81",X"7D",X"76",X"85",X"88",X"80",X"7E", + X"76",X"86",X"88",X"7D",X"76",X"84",X"89",X"7B",X"79",X"89",X"81",X"80",X"7B",X"77",X"89",X"84", + X"80",X"7F",X"75",X"88",X"84",X"7F",X"77",X"7F",X"8B",X"80",X"78",X"7E",X"8C",X"7B",X"79",X"88", + X"83",X"77",X"7F",X"8C",X"76",X"7F",X"89",X"7F",X"78",X"7C",X"8B",X"81",X"76",X"83",X"8A",X"74", + X"83",X"88",X"75",X"82",X"89",X"74",X"81",X"89",X"7D",X"83",X"77",X"7C",X"8C",X"7E",X"76",X"88", + X"86",X"7E",X"83",X"7A",X"79",X"83",X"89",X"7F",X"76",X"88",X"85",X"74",X"84",X"89",X"75",X"82", + X"88",X"7D",X"83",X"75",X"80",X"88",X"82",X"7A",X"7B",X"8B",X"7E",X"82",X"7B",X"78",X"88",X"86", + X"76",X"83",X"88",X"74",X"83",X"88",X"7E",X"76",X"85",X"87",X"7E",X"82",X"7C",X"78",X"83",X"87", + X"83",X"76",X"80",X"89",X"80",X"77",X"81",X"8A",X"7E",X"81",X"7E",X"77",X"81",X"89",X"81",X"78", + X"7C",X"8B",X"80",X"82",X"74",X"86",X"85",X"80",X"77",X"82",X"88",X"7F",X"7A",X"7B",X"8C",X"7E", + X"82",X"7B",X"78",X"87",X"86",X"7E",X"82",X"76",X"81",X"8A",X"7A",X"79",X"87",X"86",X"7A",X"79", + X"89",X"83",X"7F",X"81",X"76",X"83",X"89",X"78",X"7C",X"89",X"82",X"78",X"7C",X"8B",X"7F",X"81", + X"7C",X"77",X"87",X"85",X"7E",X"81",X"77",X"7E",X"8A",X"80",X"81",X"7F",X"77",X"81",X"89",X"80", + X"80",X"7F",X"76",X"84",X"88",X"7E",X"82",X"79",X"7B",X"87",X"86",X"7C",X"79",X"88",X"83",X"76", + X"81",X"88",X"80",X"77",X"81",X"89",X"7D",X"78",X"86",X"84",X"76",X"81",X"88",X"80",X"77",X"85", + X"86",X"76",X"7E",X"89",X"81",X"78",X"7F",X"8A",X"7E",X"78",X"89",X"81",X"80",X"7E",X"77",X"82", + X"87",X"82",X"7F",X"81",X"78",X"7D",X"88",X"83",X"7F",X"77",X"86",X"85",X"7E",X"82",X"76",X"80", + X"88",X"82",X"7E",X"77",X"86",X"85",X"7F",X"77",X"86",X"85",X"7F",X"78",X"81",X"8A",X"75",X"83", + X"87",X"77",X"7F",X"8A",X"79",X"7B",X"88",X"84",X"76",X"84",X"85",X"7E",X"78",X"82",X"88",X"7F", + X"78",X"84",X"87",X"76",X"7F",X"88",X"82",X"7E",X"82",X"77",X"7F",X"89",X"7E",X"82",X"7B",X"7A", + X"87",X"85",X"76",X"81",X"88",X"80",X"77",X"81",X"88",X"7E",X"82",X"7E",X"78",X"82",X"87",X"81", + X"77",X"80",X"88",X"7F",X"78",X"81",X"89",X"7E",X"82",X"7E",X"78",X"82",X"88",X"81",X"78",X"7F", + X"89",X"7E",X"82",X"7E",X"78",X"83",X"88",X"7A",X"7B",X"88",X"81",X"7E",X"77",X"87",X"84",X"7F", + X"78",X"82",X"89",X"75",X"84",X"85",X"7F",X"81",X"78",X"7E",X"8A",X"7E",X"79",X"89",X"80",X"81", + X"7D",X"78",X"85",X"86",X"81",X"76",X"86",X"84",X"80",X"79",X"7E",X"88",X"81",X"79",X"7D",X"8A", + X"7E",X"82",X"7E",X"7A",X"7D",X"88",X"82",X"81",X"79",X"7F",X"8A",X"79",X"7B",X"88",X"82",X"7F", + X"7F",X"77",X"85",X"86",X"7F",X"78",X"82",X"88",X"7F",X"82",X"7B",X"7A",X"86",X"85",X"7F",X"81", + X"77",X"82",X"87",X"80",X"78",X"83",X"86",X"7D",X"83",X"77",X"81",X"88",X"7F",X"82",X"7B",X"7A", + X"88",X"83",X"77",X"83",X"87",X"78",X"7E",X"88",X"80",X"80",X"7F",X"79",X"7D",X"87",X"83",X"80", + X"77",X"83",X"85",X"7F",X"7A",X"7C",X"89",X"81",X"7A",X"7D",X"8A",X"7A",X"7B",X"86",X"84",X"7A", + X"7C",X"89",X"7F",X"82",X"7C",X"7A",X"88",X"81",X"77",X"85",X"86",X"77",X"84",X"85",X"77",X"81", + X"88",X"78",X"7D",X"87",X"82",X"78",X"81",X"87",X"7A",X"7C",X"89",X"7D",X"79",X"87",X"83",X"7A", + X"7C",X"88",X"82",X"7A",X"7D",X"88",X"80",X"78",X"86",X"83",X"76",X"84",X"86",X"7E",X"78",X"86", + X"83",X"7E",X"81",X"77",X"81",X"86",X"83",X"79",X"7E",X"88",X"7F",X"81",X"7D",X"79",X"86",X"84", + X"7E",X"82",X"77",X"81",X"86",X"82",X"78",X"82",X"86",X"80",X"7D",X"7A",X"89",X"80",X"7F",X"78", + X"88",X"81",X"78",X"87",X"81",X"7F",X"81",X"78",X"82",X"88",X"79",X"7F",X"88",X"7B",X"7B",X"85", + X"85",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"79",X"84",X"85",X"80",X"80",X"78",X"86",X"84",X"77", + X"81",X"87",X"7E",X"82",X"7A",X"7D",X"89",X"7E",X"82",X"7D",X"7A",X"82",X"87",X"7F",X"81",X"7F", + X"79",X"83",X"87",X"7A",X"7C",X"87",X"81",X"7E",X"79",X"85",X"85",X"7E",X"79",X"84",X"86",X"79", + X"7E",X"88",X"7B",X"7B",X"86",X"83",X"7F",X"82",X"79",X"7E",X"87",X"81",X"7D",X"79",X"86",X"84", + X"7F",X"79",X"84",X"85",X"77",X"85",X"84",X"7F",X"81",X"7A",X"7D",X"86",X"83",X"7E",X"82",X"7B", + X"7C",X"87",X"81",X"78",X"81",X"86",X"7F",X"79",X"82",X"86",X"7E",X"79",X"81",X"87",X"7E",X"79", + X"87",X"82",X"7F",X"80",X"78",X"84",X"85",X"7C",X"7B",X"87",X"81",X"80",X"78",X"86",X"83",X"80", + X"7B",X"7C",X"88",X"81",X"7C",X"7C",X"89",X"7B",X"7B",X"85",X"84",X"7B",X"7B",X"85",X"84",X"7C", + X"7A",X"86",X"84",X"7C",X"7B",X"87",X"82",X"7F",X"79",X"85",X"84",X"78",X"84",X"84",X"7A",X"7E", + X"87",X"81",X"7A",X"81",X"86",X"7A",X"7C",X"87",X"81",X"7F",X"81",X"7A",X"7F",X"88",X"7E",X"7A", + X"85",X"83",X"7A",X"7E",X"88",X"7B",X"7D",X"88",X"7D",X"7B",X"87",X"80",X"79",X"84",X"84",X"7E", + X"82",X"79",X"7F",X"87",X"80",X"80",X"79",X"83",X"86",X"7F",X"79",X"83",X"85",X"78",X"80",X"87", + X"7F",X"81",X"7A",X"7F",X"88",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"7A",X"84",X"85",X"7F",X"79", + X"81",X"87",X"7E",X"82",X"7B",X"7E",X"87",X"7E",X"79",X"84",X"85",X"7E",X"82",X"7C",X"7B",X"84", + X"86",X"78",X"83",X"84",X"80",X"7A",X"7E",X"86",X"82",X"7A",X"7E",X"87",X"81",X"7A",X"7F",X"87", + X"80",X"7E",X"79",X"86",X"83",X"7F",X"81",X"79",X"81",X"86",X"7E",X"82",X"7B",X"7D",X"87",X"80", + X"81",X"7F",X"7A",X"81",X"87",X"7C",X"7B",X"86",X"82",X"7C",X"7B",X"86",X"83",X"7D",X"7A",X"88", + X"7E",X"7B",X"85",X"82",X"7B",X"7D",X"87",X"80",X"7E",X"7A",X"85",X"84",X"7E",X"7A",X"85",X"84", + X"7E",X"7A",X"84",X"84",X"7E",X"82",X"79",X"80",X"86",X"7E",X"7A",X"85",X"83",X"7F",X"80",X"79", + X"85",X"84",X"79",X"82",X"86",X"79",X"81",X"86",X"7B",X"7D",X"87",X"7F",X"79",X"86",X"81",X"79", + X"85",X"83",X"79",X"82",X"85",X"78",X"82",X"85",X"7F",X"81",X"7B",X"7D",X"87",X"80",X"80",X"7F", + X"7A",X"83",X"86",X"7B",X"7D",X"86",X"81",X"7B",X"7D",X"86",X"82",X"7C",X"7D",X"88",X"7D",X"7B", + X"83",X"85",X"7E",X"7A",X"83",X"85",X"7C",X"7C",X"86",X"80",X"7F",X"7A",X"85",X"83",X"79",X"85", + X"83",X"7A",X"81",X"86",X"79",X"80",X"85",X"81",X"7E",X"7B",X"87",X"80",X"81",X"7E",X"7B",X"83", + X"86",X"79",X"81",X"84",X"80",X"7B",X"80",X"86",X"7F",X"7D",X"7D",X"88",X"7E",X"82",X"7C",X"7C", + X"85",X"83",X"79",X"81",X"86",X"7F",X"7A",X"82",X"86",X"79",X"80",X"85",X"81",X"7A",X"7F",X"86", + X"81",X"7B",X"7E",X"87",X"7F",X"80",X"80",X"7B",X"80",X"87",X"7E",X"7A",X"85",X"83",X"7F",X"7A", + X"84",X"84",X"7F",X"7C",X"7E",X"87",X"7E",X"82",X"7D",X"7B",X"85",X"81",X"7F",X"7A",X"85",X"82", + X"7F",X"7B",X"80",X"86",X"80",X"7B",X"80",X"86",X"7F",X"80",X"80",X"7A",X"81",X"85",X"7F",X"7A", + X"82",X"85",X"80",X"7B",X"81",X"86",X"7C",X"7C",X"86",X"81",X"81",X"7C",X"7E",X"86",X"7F",X"80", + X"79",X"84",X"84",X"7F",X"80",X"7F",X"7A",X"83",X"84",X"7F",X"81",X"7B",X"7E",X"83",X"85",X"7D", + X"7C",X"86",X"81",X"7A",X"81",X"85",X"7F",X"7B",X"84",X"82",X"7F",X"81",X"7A",X"80",X"85",X"81", + X"7F",X"81",X"7D",X"7C",X"84",X"84",X"7F",X"7A",X"82",X"85",X"7F",X"81",X"7F",X"7A",X"84",X"83", + X"7F",X"80",X"7A",X"81",X"85",X"80",X"80",X"7D",X"7C",X"86",X"81",X"80",X"80",X"7A",X"85",X"82", + X"7F",X"81",X"7B",X"7E",X"85",X"82",X"7F",X"81",X"7B",X"7F",X"84",X"83",X"7C",X"7D",X"85",X"82", + X"7C",X"7E",X"86",X"7D",X"7C",X"85",X"82",X"7F",X"81",X"7E",X"7B",X"84",X"83",X"81",X"7C",X"7D", + X"87",X"7C",X"7E",X"86",X"7F",X"7B",X"86",X"80",X"81",X"7C",X"7E",X"86",X"7F",X"7B",X"83",X"84", + X"7F",X"80",X"7A",X"81",X"85",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"7E",X"7C",X"87",X"7E",X"7C", + X"85",X"80",X"7B",X"84",X"82",X"79",X"82",X"84",X"81",X"7A",X"81",X"85",X"80",X"7F",X"7B",X"86", + X"81",X"7A",X"83",X"84",X"7F",X"81",X"7F",X"7B",X"82",X"85",X"7B",X"7D",X"85",X"81",X"7F",X"81", + X"7D",X"7C",X"85",X"82",X"80",X"7A",X"83",X"83",X"80",X"7D",X"7D",X"86",X"80",X"7F",X"7B",X"84", + X"83",X"7F",X"81",X"7E",X"7C",X"83",X"84",X"7B",X"81",X"85",X"7C",X"7E",X"86",X"7C",X"7D",X"84", + X"84",X"7C",X"7E",X"85",X"80",X"7C",X"7D",X"85",X"81",X"7F",X"81",X"7C",X"7F",X"86",X"7F",X"81", + X"7F",X"7B",X"84",X"83",X"7C",X"7F",X"86",X"7B",X"7E",X"84",X"82",X"7D",X"7D",X"85",X"80",X"7F", + X"7B",X"86",X"80",X"80",X"7F",X"7B",X"82",X"85",X"7B",X"80",X"84",X"80",X"7D",X"7D",X"85",X"82", + X"7D",X"7D",X"85",X"81",X"7D",X"7D",X"84",X"82",X"7D",X"7E",X"86",X"7D",X"7C",X"84",X"82",X"7B", + X"80",X"85",X"7F",X"80",X"80",X"7B",X"81",X"85",X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"7B", + X"81",X"84",X"7F",X"7B",X"83",X"83",X"7F",X"81",X"7B",X"80",X"83",X"83",X"7D",X"7C",X"85",X"81", + X"7F",X"81",X"7D",X"7D",X"83",X"83",X"80",X"7B",X"83",X"83",X"80",X"7B",X"81",X"84",X"80",X"7C", + X"80",X"85",X"7B",X"7E",X"84",X"82",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"80",X"7B",X"83",X"84", + X"7A",X"83",X"82",X"80",X"7C",X"81",X"85",X"7B",X"7F",X"84",X"80",X"7F",X"81",X"7C",X"7F",X"85", + X"7E",X"7C",X"83",X"84",X"7F",X"81",X"7B",X"80",X"84",X"7F",X"81",X"7D",X"7C",X"83",X"83",X"80", + X"7B",X"80",X"84",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F",X"7C",X"81",X"85",X"7B",X"7F",X"85", + X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"80",X"80",X"7B",X"82",X"83",X"7F",X"81",X"7D",X"7D", + X"85",X"80",X"80",X"80",X"7C",X"80",X"85",X"80",X"80",X"7F",X"7C",X"85",X"81",X"7B",X"82",X"83", + X"7A",X"82",X"83",X"7F",X"81",X"7B",X"80",X"85",X"7F",X"7C",X"84",X"82",X"7B",X"80",X"84",X"81", + X"7C",X"7F",X"85",X"7F",X"82",X"7D",X"7E",X"85",X"80",X"7B",X"82",X"83",X"7F",X"80",X"7B",X"85", + X"81",X"7B",X"81",X"84",X"80",X"7C",X"83",X"82",X"7B",X"80",X"84",X"80",X"81",X"7C",X"81",X"85", + X"7B",X"7F",X"85",X"7D",X"7D",X"84",X"81",X"80",X"81",X"7E",X"7C",X"83",X"83",X"7F",X"7C",X"81", + X"84",X"7F",X"81",X"7C",X"7F",X"85",X"7F",X"7C",X"82",X"83",X"7E",X"7C",X"82",X"84",X"7F",X"81", + X"7F",X"7C",X"81",X"84",X"80",X"80",X"81",X"7C",X"80",X"85",X"7F",X"7C",X"84",X"80",X"81",X"7C", + X"7F",X"84",X"81",X"7E",X"7D",X"84",X"82",X"7D",X"7D",X"84",X"81",X"7E",X"7C",X"84",X"81",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"7C",X"82",X"83",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F", + X"7C",X"80",X"83",X"82",X"7D",X"7E",X"84",X"81",X"7F",X"81",X"7C",X"80",X"84",X"81",X"7D",X"7E", + X"84",X"80",X"7F",X"7C",X"83",X"83",X"7E",X"7D",X"84",X"81",X"7B",X"82",X"83",X"7F",X"7C",X"81", + X"83",X"80",X"7C",X"81",X"84",X"7F",X"80",X"80",X"7C",X"81",X"84",X"7D",X"7D",X"83",X"82",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"80",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"84",X"81", + X"7F",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"85",X"80",X"80",X"7F",X"7C",X"83",X"82",X"7C", + X"81",X"84",X"7C",X"80",X"84",X"7D",X"7E",X"85",X"7F",X"7C",X"83",X"82",X"7F",X"81",X"7C",X"81", + X"84",X"80",X"80",X"80",X"7D",X"7F",X"83",X"82",X"7C",X"81",X"83",X"7F",X"81",X"7C",X"7F",X"83", + X"81",X"7F",X"81",X"7D",X"7E",X"85",X"80",X"80",X"7F",X"7C",X"82",X"83",X"7D",X"7E",X"83",X"82", + X"7E",X"7D",X"84",X"81",X"80",X"80",X"7C",X"81",X"84",X"80",X"81",X"7E",X"7D",X"84",X"82",X"7C", + X"82",X"83",X"7C",X"7F",X"84",X"80",X"80",X"81",X"7D",X"7E",X"83",X"82",X"80",X"80",X"7C",X"82", + X"83",X"7C",X"80",X"84",X"7D",X"7D",X"84",X"80",X"81",X"7C",X"82",X"83",X"7F",X"7E",X"7E",X"84", + X"80",X"80",X"80",X"7D",X"7E",X"85",X"80",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7F",X"7C",X"82", + X"83",X"7B",X"80",X"83",X"80",X"7D",X"7E",X"84",X"80",X"80",X"80",X"7D",X"7F",X"84",X"7F",X"7C", + X"84",X"81",X"80",X"7C",X"83",X"82",X"7C",X"82",X"82",X"7C",X"80",X"84",X"7D",X"7E",X"84",X"80", + X"80",X"80",X"7C",X"83",X"82",X"80",X"7E",X"7E",X"85",X"7E",X"7D",X"82",X"83",X"7E",X"7D",X"83", + X"80",X"7C",X"83",X"81",X"7C",X"83",X"81",X"80",X"80",X"7C",X"7F",X"82",X"82",X"7E",X"7D",X"83", + X"82",X"7E",X"7D",X"83",X"82",X"7E",X"7E",X"84",X"7F",X"7C",X"84",X"80",X"7C",X"83",X"81",X"7F", + X"80",X"7C",X"81",X"83",X"80",X"7F",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7B",X"82",X"82",X"7F", + X"80",X"7C",X"82",X"82",X"80",X"7D",X"82",X"83",X"7B",X"82",X"82",X"80",X"7D",X"80",X"83",X"80", + X"7D",X"80",X"84",X"7F",X"81",X"7F",X"7D",X"82",X"83",X"80",X"7C",X"81",X"83",X"7F",X"7D",X"81", + X"84",X"7D",X"7F",X"84",X"7F",X"7D",X"84",X"80",X"81",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7E", + X"82",X"83",X"7F",X"81",X"7D",X"7F",X"83",X"81",X"7D",X"7F",X"84",X"80",X"7C",X"83",X"81",X"7C", + X"82",X"82",X"7C",X"80",X"83",X"80",X"80",X"80",X"7D",X"7E",X"83",X"81",X"80",X"80",X"7F",X"7D", + X"82",X"83",X"80",X"80",X"80",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7D",X"82",X"82",X"80",X"7E", + X"7D",X"84",X"81",X"80",X"80",X"7D",X"80",X"84",X"7E",X"7E",X"83",X"81",X"7F",X"7D",X"82",X"82", + X"7E",X"7E",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"7D",X"82",X"83",X"7F",X"7D",X"83",X"81",X"7C", + X"82",X"81",X"7F",X"81",X"7D",X"80",X"83",X"7F",X"7D",X"83",X"81",X"7F",X"81",X"7C",X"81",X"83", + X"7F",X"80",X"7F",X"7D",X"82",X"82",X"80",X"7D",X"80",X"83",X"80",X"7D",X"82",X"82",X"7F",X"81", + X"7D",X"7F",X"82",X"82",X"7D",X"81",X"83",X"7F",X"81",X"7D",X"7E",X"84",X"7F",X"7D",X"83",X"80", + X"7D",X"83",X"81",X"80",X"7E",X"7E",X"84",X"7E",X"7E",X"82",X"81",X"7D",X"80",X"83",X"81",X"7E", + X"7E",X"83",X"81",X"7D",X"80",X"83",X"7E",X"7E",X"83",X"81",X"80",X"80",X"7C",X"82",X"82",X"7E", + X"7E",X"83",X"81",X"7E",X"7E",X"83",X"80",X"80",X"7F",X"7D",X"83",X"80",X"80",X"7D",X"83",X"81", + X"80",X"7D",X"80",X"83",X"7F",X"81",X"7E",X"7F",X"83",X"7F",X"7D",X"83",X"80",X"7C",X"83",X"81", + X"7D",X"82",X"82",X"7C",X"81",X"82",X"80",X"7E",X"7F",X"83",X"81",X"7E",X"7F",X"83",X"80",X"80", + X"81",X"7D",X"7F",X"83",X"81",X"7D",X"80",X"83",X"80",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"7F", + X"83",X"80",X"7D",X"83",X"80",X"7F",X"7D",X"83",X"81",X"80",X"80",X"7D",X"81",X"83",X"80",X"7D", + X"83",X"81",X"80",X"80",X"7D",X"80",X"82",X"81",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81", + X"80",X"81",X"7E",X"7E",X"82",X"82",X"7F",X"7D",X"82",X"82",X"7C",X"81",X"82",X"81",X"7D",X"81", + X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"81",X"7E",X"7E", + X"83",X"81",X"7F",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82",X"82",X"7E",X"7E",X"83", + X"80",X"80",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"7F",X"7E",X"83",X"80",X"7D",X"81",X"83", + X"7F",X"80",X"80",X"7D",X"80",X"83",X"7D",X"7F",X"83",X"80",X"81",X"7E",X"7E",X"83",X"80",X"80", + X"80",X"7D",X"80",X"82",X"82",X"7D",X"80",X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"80",X"80",X"7D",X"80",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"81",X"7F",X"7E",X"82",X"81", + X"7D",X"81",X"82",X"7F",X"81",X"7D",X"80",X"82",X"81",X"7E",X"7F",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"7D",X"81",X"82",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"7F",X"7D",X"81",X"83",X"7F", + X"7E",X"82",X"81",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"81",X"82",X"7F",X"80",X"7E",X"7E",X"82", + X"82",X"80",X"80",X"7D",X"81",X"83",X"7E",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82", + X"82",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"80",X"82",X"80",X"7E",X"80",X"83",X"80", + X"7F",X"7E",X"83",X"81",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"83",X"7F", + X"7E",X"83",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"80",X"7D",X"80",X"82", + X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"82",X"80",X"7F",X"7E",X"83",X"7F",X"7E", + X"83",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"81",X"81",X"80",X"7E",X"7F",X"83",X"80", + X"7F",X"7E",X"83",X"80",X"80",X"80",X"7F",X"7E",X"82",X"82",X"80",X"80",X"80",X"7D",X"81",X"82", + X"7D",X"80",X"83",X"7F",X"7E",X"82",X"81",X"7D",X"80",X"82",X"80",X"7D",X"81",X"81",X"80",X"7D", + X"81",X"82",X"80",X"7E",X"7F",X"83",X"80",X"80",X"80",X"7E",X"7F",X"82",X"82",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"82",X"82",X"80",X"80",X"80",X"7E",X"80",X"82", + X"81",X"7E",X"81",X"82",X"7F",X"81",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"80",X"82",X"81", + X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E",X"80",X"82",X"80", + X"80",X"80",X"7D",X"82",X"81",X"80",X"80",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"82",X"81", + X"7F",X"81",X"7E",X"7F",X"82",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"7D", + X"81",X"82",X"7D",X"80",X"82",X"80",X"7E",X"81",X"82",X"7D",X"81",X"81",X"80",X"7D",X"81",X"82", + X"7F",X"80",X"7E",X"7F",X"82",X"81",X"7F",X"81",X"7D",X"81",X"82",X"7E",X"7F",X"82",X"81",X"7E", + X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E", + X"7F",X"82",X"81",X"7E",X"81",X"82",X"7E",X"7F",X"82",X"80",X"80",X"7E",X"81",X"82",X"7F",X"80", + X"7E",X"80",X"81",X"82",X"7F",X"7E",X"82",X"81",X"7F",X"81",X"7F",X"7E",X"82",X"81",X"7E",X"80", + X"82",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E", + X"82",X"81",X"80",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"82",X"80",X"7F",X"7F",X"83",X"7E",X"7F", + X"82",X"80",X"7F",X"7E",X"82",X"81",X"7F",X"7E",X"82",X"81",X"80",X"7E",X"81",X"81",X"80",X"7E", + X"80",X"82",X"80",X"7F",X"7E",X"83",X"80",X"80",X"80",X"7E",X"81",X"82",X"80",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7E",X"7F",X"82",X"81",X"7F",X"7F",X"83",X"7E",X"7F",X"82",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GAL_HIT.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GAL_HIT.vhd new file mode 100644 index 00000000..7d2fd29c --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/GAL_HIT.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_HIT 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 prom of GAL_HIT is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"65",X"75",X"88",X"90",X"93",X"9B",X"A3",X"A3",X"A3",X"A6",X"9E",X"9B",X"9B",X"A3",X"AB",X"B6", + X"B9",X"B9",X"BE",X"B9",X"AE",X"A6",X"9E",X"98",X"88",X"78",X"68",X"65",X"65",X"65",X"62",X"68", + X"68",X"65",X"5D",X"52",X"47",X"47",X"4A",X"4D",X"4D",X"4D",X"52",X"65",X"7D",X"88",X"90",X"9B", + X"A3",X"AE",X"AE",X"AB",X"AB",X"9E",X"98",X"88",X"70",X"52",X"37",X"1F",X"17",X"1F",X"27",X"3A", + X"5A",X"68",X"78",X"83",X"93",X"A3",X"AB",X"AE",X"A3",X"93",X"88",X"88",X"83",X"88",X"8B",X"88", + X"78",X"62",X"4A",X"42",X"3A",X"42",X"4D",X"55",X"65",X"78",X"83",X"8B",X"93",X"90",X"88",X"88", + X"98",X"A6",X"A6",X"AB",X"9E",X"8B",X"7D",X"68",X"70",X"88",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC", + X"FC",X"FC",X"DC",X"9B",X"4D",X"14",X"01",X"04",X"2F",X"52",X"5D",X"68",X"78",X"80",X"78",X"70", + X"5D",X"47",X"32",X"1F",X"14",X"09",X"11",X"1C",X"32",X"52",X"83",X"B9",X"D1",X"C9",X"AB",X"8B", + X"70",X"68",X"75",X"78",X"80",X"8B",X"8B",X"98",X"AB",X"BE",X"C1",X"AB",X"83",X"5D",X"3A",X"17", + X"11",X"17",X"27",X"3A",X"65",X"90",X"AE",X"B6",X"9B",X"78",X"55",X"4A",X"4D",X"5A",X"5D",X"52", + X"4A",X"4A",X"52",X"78",X"AB",X"D4",X"FC",X"FC",X"F7",X"E9",X"E1",X"D1",X"C9",X"BE",X"AB",X"90", + X"52",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"2F",X"4A",X"52",X"47",X"47",X"62",X"70",X"7D", + X"7D",X"78",X"7D",X"90",X"B3",X"CE",X"EC",X"FC",X"FC",X"FC",X"FC",X"F4",X"E9",X"F4",X"FC",X"FC", + X"FC",X"FC",X"CE",X"98",X"65",X"2C",X"01",X"01",X"01",X"01",X"01",X"32",X"6D",X"7D",X"68",X"4A", + X"27",X"11",X"1C",X"3A",X"4D",X"62",X"68",X"65",X"68",X"70",X"80",X"9B",X"D1",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"A3",X"75",X"55",X"62",X"80",X"A3",X"BE",X"CE",X"C1",X"90",X"4A",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"88",X"C9",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC", + X"B6",X"90",X"68",X"3F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1F",X"83",X"BE",X"D1",X"CE", + X"D4",X"F4",X"FC",X"FC",X"FC",X"F7",X"D1",X"CE",X"DC",X"F7",X"FC",X"FC",X"FC",X"FC",X"D1",X"8B", + X"68",X"68",X"88",X"A6",X"C1",X"D9",X"D4",X"BE",X"A3",X"88",X"75",X"68",X"62",X"5D",X"62",X"68", + X"6D",X"78",X"75",X"55",X"2C",X"11",X"11",X"2F",X"55",X"75",X"83",X"93",X"9E",X"B9",X"E9",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"68",X"32",X"11",X"17",X"32",X"52",X"7D", + X"AE",X"E1",X"F7",X"E1",X"A3",X"62",X"17",X"01",X"01",X"01",X"01",X"01",X"1C",X"4D",X"7D",X"90", + X"9B",X"A6",X"B6",X"BE",X"A6",X"70",X"37",X"14",X"14",X"1C",X"14",X"1C",X"2F",X"3A",X"3A",X"3A", + X"4A",X"52",X"4A",X"47",X"3A",X"24",X"11",X"14",X"27",X"3A",X"65",X"9E",X"D4",X"FC",X"FC",X"F7", + X"D4",X"AB",X"93",X"93",X"93",X"83",X"68",X"4D",X"37",X"37",X"5D",X"9B",X"EC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"CE",X"AB",X"93",X"7D",X"65",X"65",X"75",X"88",X"93",X"98",X"98",X"93", + X"93",X"90",X"93",X"8B",X"90",X"90",X"90",X"8B",X"8B",X"90",X"8B",X"90",X"90",X"90",X"90",X"8B", + X"8B",X"8B",X"8B",X"8B",X"88",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"83",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"78",X"75",X"78",X"75",X"78", + X"78",X"78",X"75",X"78",X"75",X"70",X"75",X"75",X"75",X"75",X"70",X"6D",X"68",X"6D",X"70",X"6D", + X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"70",X"70",X"70",X"75",X"75",X"75",X"75", + X"75",X"70",X"62",X"4D",X"4D",X"4D",X"47",X"4A",X"68",X"98",X"B6",X"B3",X"9B",X"78",X"5A",X"3F", + X"32",X"2F",X"32",X"3F",X"5A",X"90",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"E9",X"90",X"4D",X"3A", + X"47",X"5D",X"5D",X"4D",X"3A",X"27",X"1C",X"14",X"11",X"0C",X"01",X"01",X"01",X"01",X"01",X"01", + X"04",X"4A",X"9E",X"F7",X"FC",X"FC",X"FC",X"FC",X"EC",X"E4",X"E4",X"D1",X"AB",X"80",X"62",X"47", + X"37",X"2F",X"2C",X"24",X"04",X"01",X"24",X"52",X"70",X"70",X"62",X"4D",X"3F",X"37",X"37",X"3A", + X"4D",X"62",X"78",X"93",X"AE",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"B6",X"68", + X"2C",X"01",X"01",X"01",X"01",X"01",X"01",X"09",X"47",X"65",X"68",X"68",X"62",X"5A",X"52",X"4D", + X"52",X"4D",X"52",X"52",X"5A",X"5D",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"65",X"37",X"1C", + X"09",X"09",X"1C",X"32",X"4D",X"70",X"93",X"AB",X"C9",X"D9",X"E9",X"EF",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"F7",X"6D",X"0C",X"01",X"01",X"01",X"01",X"01",X"17",X"62",X"83",X"78", + X"5A",X"37",X"14",X"04",X"01",X"01",X"01",X"01",X"04",X"11",X"1C",X"1C",X"01",X"01",X"0C",X"3F", + X"6D",X"7D",X"78",X"68",X"65",X"83",X"B3",X"E1",X"F4",X"E4",X"C6",X"A3",X"8B",X"75",X"68",X"65", + X"5D",X"62",X"65",X"62",X"5A",X"3F",X"27",X"17",X"1F",X"5A",X"9E",X"CE",X"D4",X"C9",X"AE",X"A6", + X"AE",X"AB",X"9B",X"83",X"80",X"98",X"9B",X"9B",X"9B",X"B6",X"D9",X"E4",X"E1",X"DC",X"E1",X"D4", + X"B3",X"83",X"5A",X"3A",X"1F",X"11",X"0C",X"11",X"14",X"1C",X"1F",X"2C",X"2C",X"1F",X"27",X"32", + X"3F",X"5D",X"83",X"9B",X"93",X"93",X"88",X"7D",X"7D",X"75",X"70",X"70",X"6D",X"68",X"68",X"68", + X"5A",X"5A",X"75",X"88",X"93",X"93",X"90",X"90",X"88",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"80", + X"7D",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80",X"83",X"83",X"80",X"80", + X"80",X"7D",X"7D",X"70",X"70",X"6D",X"75",X"83",X"90",X"93",X"90",X"88",X"88",X"80",X"78",X"7D", + X"70",X"68",X"70",X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"75",X"70",X"68",X"4D",X"3A", + X"4A",X"70",X"93",X"A3",X"B6",X"B9",X"B3",X"A3",X"90",X"80",X"75",X"70",X"68",X"68",X"68",X"65", + X"68",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"75",X"78", + X"78",X"78",X"78",X"78",X"78",X"78",X"70",X"55",X"37",X"1F",X"24",X"47",X"68",X"7D",X"88",X"8B", + X"88",X"88",X"88",X"8B",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"C9",X"AB",X"80",X"5A", + X"4A",X"47",X"37",X"2C",X"32",X"4D",X"70",X"78",X"7D",X"8B",X"90",X"88",X"68",X"4A",X"2C",X"1C", + X"11",X"09",X"01",X"01",X"01",X"01",X"14",X"27",X"47",X"70",X"AE",X"E1",X"F4",X"E4",X"D1",X"AE", + X"93",X"80",X"70",X"68",X"62",X"62",X"65",X"68",X"6D",X"75",X"78",X"78",X"65",X"4A",X"4D",X"5A", + X"62",X"65",X"68",X"88",X"B9",X"EC",X"FC",X"F4",X"D1",X"B6",X"B3",X"AE",X"A3",X"98",X"A3",X"C6", + X"D9",X"D4",X"D4",X"E1",X"E1",X"C9",X"9E",X"78",X"62",X"3F",X"32",X"2C",X"27",X"2C",X"32",X"37", + X"3F",X"47",X"4A",X"52",X"55",X"5A",X"5D",X"5D",X"5A",X"3F",X"27",X"14",X"11",X"14",X"24",X"4A", + X"80",X"A6",X"BE",X"C6",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC",X"BE",X"AB",X"8B", + X"5D",X"2F",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"70",X"6D",X"5D",X"4D", + X"4D",X"68",X"9B",X"BE",X"C9",X"B9",X"B3",X"AB",X"9B",X"A3",X"B3",X"C6",X"D1",X"B6",X"8B",X"52", + X"1C",X"11",X"11",X"14",X"37",X"62",X"90",X"9E",X"9B",X"83",X"75",X"5D",X"47",X"32",X"2F",X"24", + X"17",X"11",X"11",X"17",X"27",X"5D",X"A3",X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"EF",X"CE", + X"9B",X"7D",X"68",X"62",X"62",X"7D",X"98",X"9E",X"93",X"7D",X"6D",X"5D",X"55",X"52",X"52",X"52", + X"55",X"55",X"5D",X"62",X"65",X"68",X"6D",X"70",X"75",X"7D",X"78",X"7D",X"80",X"83",X"78",X"62", + X"3A",X"27",X"14",X"17",X"27",X"3F",X"5A",X"78",X"98",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70",X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32", + X"04",X"01",X"01",X"01",X"01",X"01",X"11",X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78", + X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24",X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93", + X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90",X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E", + X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E",X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B", + X"88",X"75",X"52",X"37",X"1F",X"1C",X"27",X"37",X"4D",X"68",X"83",X"AE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D1",X"9B",X"65",X"42",X"3A",X"52",X"80",X"AE",X"D4",X"E9",X"E4",X"C6", + X"80",X"3A",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"32",X"88",X"C6",X"F7",X"FC", + X"E4",X"CE",X"B9",X"A3",X"80",X"62",X"47",X"37",X"2F",X"2C",X"2F",X"37",X"3F",X"3A",X"32",X"3A", + X"37",X"32",X"37",X"3A",X"52",X"7D",X"B3",X"DC",X"E4",X"E1",X"D1",X"D1",X"E1",X"FC",X"FC",X"FC", + X"FC",X"F4",X"CE",X"A3",X"83",X"75",X"7D",X"83",X"83",X"88",X"98",X"A6",X"A6",X"98",X"88",X"75", + X"68",X"5D",X"5A",X"5A",X"5A",X"62",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"7D",X"83",X"83", + X"80",X"75",X"68",X"70",X"80",X"8B",X"93",X"98",X"98",X"90",X"90",X"8B",X"90",X"98",X"A3",X"AE", + X"B6",X"C9",X"C9",X"C1",X"B3",X"A3",X"98",X"8B",X"78",X"75",X"70",X"6D",X"65",X"68",X"70",X"80", + X"83",X"83",X"88",X"8B",X"83",X"78",X"68",X"5D",X"52",X"42",X"2C",X"27",X"2C",X"3A",X"47",X"42", + X"42",X"52",X"70",X"8B",X"A6",X"AB",X"A3",X"9E",X"9E",X"B3",X"B9",X"B9",X"BE",X"BE",X"B9",X"A3", + X"88",X"68",X"5D",X"5A",X"5A",X"52",X"52",X"68",X"70",X"65",X"62",X"62",X"68",X"7D",X"8B",X"8B", + X"83",X"75",X"65",X"68",X"75",X"80",X"9B",X"C1",X"EC",X"FC",X"FC",X"F7",X"EF",X"E9",X"D1",X"A3", + X"78",X"5D",X"42",X"2C",X"14",X"0C",X"09",X"0C",X"0C",X"17",X"2C",X"47",X"62",X"75",X"75",X"68", + X"62",X"52",X"4A",X"4A",X"42",X"3F",X"4A",X"55",X"68",X"90",X"A3",X"B9",X"C6",X"CE",X"E4",X"FC", + X"FC",X"EC",X"E9",X"E9",X"DC",X"C1",X"B3",X"A6",X"98",X"75",X"52",X"3A",X"2C",X"1C",X"11",X"01", + X"0C",X"1F",X"37",X"52",X"70",X"78",X"78",X"68",X"62",X"62",X"75",X"98",X"B6",X"BE",X"B3",X"AB", + X"A6",X"9B",X"9E",X"AE",X"B9",X"C1",X"AE",X"90",X"5D",X"32",X"2C",X"27",X"2C",X"3F",X"62",X"83", + X"93",X"90",X"88",X"80",X"70",X"5D",X"52",X"47",X"3A",X"2F",X"24",X"1F",X"2C",X"3A",X"68",X"A3", + X"D4",X"F4",X"FC",X"FC",X"F4",X"E9",X"E9",X"DC",X"B9",X"90",X"78",X"68",X"5D",X"62",X"7D",X"93", + X"9B",X"90",X"7D",X"70",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5A",X"5D",X"65",X"68",X"68",X"70", + X"70",X"75",X"78",X"78",X"7D",X"80",X"80",X"78",X"65",X"3F",X"27",X"17",X"1C",X"2C",X"3F",X"5D", + X"78",X"93",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70", + X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32",X"04",X"01",X"01",X"01",X"01",X"01",X"11", + X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78",X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24", + X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93",X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90", + X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E", + X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B",X"88",X"75",X"52",X"37",X"1F",X"1C",X"24", + X"37",X"4D",X"68",X"88",X"AE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"9B",X"65", + X"3F",X"37",X"52",X"80",X"B3",X"D9",X"EC",X"EC",X"C9",X"7D",X"37",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"27",X"88",X"D1",X"FC",X"FC",X"EC",X"D1",X"BE",X"A3",X"7D",X"62",X"3A", + X"2C",X"1F",X"1F",X"24",X"2C",X"32",X"2C",X"27",X"2F",X"27",X"27",X"27",X"2C",X"47",X"7D",X"C1", + X"F7",X"FC",X"FC",X"E9",X"E1",X"EC",X"FC",X"FC",X"FC",X"FC",X"FC",X"E4",X"AE",X"88",X"78",X"83", + X"8B",X"8B",X"93",X"A3",X"B9",X"BE",X"A6",X"90",X"75",X"65",X"52",X"52",X"52",X"4D",X"55",X"5D", + X"62",X"68",X"70",X"70",X"70",X"75",X"80",X"8B",X"90",X"90",X"8B",X"83",X"90",X"98",X"9B",X"9E", + X"9E",X"9B",X"93",X"93",X"8B",X"90",X"8B",X"8B",X"8B",X"88",X"8B",X"8B",X"8B",X"8B",X"88",X"8B", + X"8B",X"8B",X"8B",X"8B",X"8B",X"88",X"8B",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"80",X"80", + X"80",X"7D",X"65",X"47",X"52",X"68",X"78",X"78",X"65",X"5A",X"5D",X"6D",X"75",X"78",X"70",X"68", + X"70",X"90",X"C9",X"EC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A6",X"68",X"42",X"3A",X"37",X"3A",X"5D", + X"7D",X"83",X"68",X"55",X"52",X"47",X"32",X"17",X"09",X"01",X"01",X"09",X"17",X"2C",X"52",X"9B", + X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"DC",X"A6",X"78",X"62",X"47",X"1F",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"3F",X"7D",X"A3",X"9B",X"80",X"5D",X"4A",X"5A",X"7D",X"90",X"9B",X"AB", + X"A6",X"AB",X"AB",X"9E",X"A6",X"BE",X"D4",X"E4",X"D4",X"A6",X"88",X"7D",X"88",X"88",X"83",X"90", + X"A3",X"AB",X"A6",X"9E",X"98",X"8B",X"83",X"80",X"80",X"80",X"83",X"83",X"88",X"8B",X"8B",X"90", + X"90",X"90",X"93",X"98",X"98",X"9B",X"93",X"98",X"93",X"93",X"93",X"93",X"93",X"93",X"90",X"90", + X"90",X"8B",X"8B",X"83",X"80",X"7D",X"68",X"52",X"52",X"62",X"68",X"88",X"AB",X"C6",X"C9",X"C9", + X"B6",X"A6",X"9E",X"8B",X"83",X"8B",X"A3",X"B3",X"AE",X"98",X"80",X"6D",X"5D",X"52",X"47",X"42", + X"47",X"3F",X"47",X"42",X"42",X"4D",X"62",X"65",X"68",X"68",X"68",X"68",X"68",X"68",X"68",X"68", + X"65",X"68",X"68",X"68",X"6D",X"70",X"6D",X"6D",X"70",X"75",X"70",X"75",X"78",X"75",X"78",X"75", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"7D",X"80",X"80",X"6D",X"65",X"70",X"80",X"80",X"68", + X"52",X"32",X"2C",X"37",X"68",X"9B",X"B6",X"B6",X"B6",X"C1",X"D4",X"D9",X"C6",X"A3",X"78",X"5A", + X"3F",X"32",X"32",X"3A",X"55",X"8B",X"CE",X"FC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A3",X"62",X"2F", + X"1C",X"09",X"01",X"01",X"1C",X"47",X"5D",X"68",X"80",X"93",X"90",X"80",X"70",X"5A",X"4D",X"52", + X"68",X"78",X"7D",X"70",X"5D",X"4A",X"3A",X"32",X"32",X"2F",X"27",X"27",X"1C",X"11",X"09",X"0C", + X"14",X"2C",X"42",X"75",X"AB",X"DC",X"F7",X"FC",X"FC",X"F7",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"BE",X"88",X"4D",X"11",X"01",X"01",X"0C",X"3F",X"75",X"9E",X"B6",X"B3", + X"93",X"70",X"52",X"3A",X"1F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"3F", + X"52",X"62",X"68",X"7D",X"9E",X"C1",X"E4",X"FC",X"FC",X"F7",X"E1",X"BE",X"A3",X"90",X"80",X"88", + X"AB",X"E1",X"FC",X"FC",X"FC",X"FC",X"F7",X"BE",X"7D",X"3F",X"0C",X"01",X"01",X"01",X"01",X"27", + X"70",X"B6",X"E9",X"FC",X"FC",X"E9",X"AE",X"83",X"62",X"4D",X"2F",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"3F",X"98",X"CE",X"D1",X"BE",X"B6",X"C1",X"D4",X"E9",X"FC",X"E9",X"C9",X"AB", + X"9B",X"88",X"5D",X"37",X"27",X"27",X"1F",X"1C",X"1C",X"1F",X"37",X"70",X"B6",X"FC",X"FC",X"FC", + X"FC",X"FC",X"F4",X"F4",X"E4",X"C6",X"98",X"70",X"5A",X"3A",X"37",X"47",X"6D",X"AE",X"F7",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"93",X"55",X"17",X"01",X"01",X"01",X"1C",X"4A",X"80",X"AB", + X"B3",X"A6",X"A3",X"A3",X"A3",X"A6",X"9B",X"78",X"42",X"11",X"04",X"11",X"1C",X"1F",X"37",X"55", + X"7D",X"8B",X"80",X"5D",X"47",X"4D",X"65",X"6D",X"5D",X"4A",X"3F",X"4D",X"7D",X"B6",X"EC",X"FC", + X"FC",X"FC",X"E4",X"C6",X"9E",X"98",X"9B",X"90",X"75",X"5D",X"62",X"7D",X"9B",X"C6",X"E1",X"E9", + X"D9",X"B3",X"93",X"83",X"70",X"68",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5D",X"65",X"65",X"68", + X"5A",X"37",X"2F",X"4A",X"65",X"6D",X"68",X"75",X"93",X"BE",X"E4",X"EC",X"D1",X"B3",X"9E",X"AB", + X"AB",X"9E",X"80",X"65",X"42",X"32",X"32",X"4A",X"75",X"90",X"A3",X"BE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"D1",X"93",X"5A",X"3A",X"3A",X"47",X"5A",X"7D",X"A6",X"CE",X"CE",X"B9",X"A6",X"9B",X"80", + X"52",X"1C",X"01",X"01",X"01",X"11",X"47",X"78",X"9E",X"AB",X"9B",X"78",X"5A",X"2C",X"14",X"1C", + X"27",X"1F",X"11",X"01",X"01",X"01",X"1C",X"3F",X"75",X"AB",X"C9",X"D4",X"DC",X"CE",X"C9",X"D1", + X"E1",X"F4",X"FC",X"FC",X"FC",X"E4",X"BE",X"90",X"70",X"4A",X"11",X"01",X"01",X"01",X"01",X"09", + X"17",X"4A",X"90",X"D4",X"FC",X"FC",X"FC",X"F4",X"E9",X"E9",X"FC",X"FC",X"E4",X"B3",X"80",X"52", + X"2F",X"1C",X"1F",X"32",X"68",X"AE",X"F4",X"FC",X"FC",X"FC",X"E4",X"C9",X"AB",X"80",X"5D",X"47", + X"37",X"42",X"75",X"AB",X"DC",X"FC",X"FC",X"FC",X"D9",X"93",X"55",X"37",X"2F",X"3A",X"52",X"62", + X"68",X"68",X"55",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1C",X"32",X"4D",X"68", + X"9B",X"CE",X"E4",X"F4",X"EC",X"E4",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9", + X"88",X"4A",X"17",X"04",X"11",X"42",X"75",X"88",X"9B",X"B6",X"BE",X"A6",X"7D",X"4D",X"1C",X"01", + X"01",X"17",X"27",X"32",X"4D",X"7D",X"A6",X"B3",X"B9",X"C6",X"D1",X"D9",X"D9",X"CE",X"BE",X"A6", + X"90",X"65",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"14",X"68",X"93",X"98",X"83",X"75",X"7D", + X"9E",X"BE",X"C9",X"BE",X"A6",X"9E",X"B6",X"D9",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9",X"C1", + X"B3",X"9B",X"75",X"5D",X"47",X"2F",X"2F",X"4A",X"68",X"7D",X"7D",X"78",X"83",X"90",X"9E",X"AE", + X"A3",X"83",X"75",X"52",X"3F",X"4A",X"5D",X"62",X"55",X"3F",X"2F",X"24",X"32",X"5A",X"7D",X"90", + X"AB",X"CE",X"E4",X"FC",X"FC",X"FC",X"E9",X"CE",X"B3",X"98",X"88",X"83",X"83",X"90",X"B3",X"EC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"75",X"42",X"27",X"14",X"01",X"01",X"1C",X"3F",X"52",X"5A", + X"68",X"78",X"68",X"47",X"17",X"01",X"01",X"09",X"27",X"37",X"4A",X"65",X"75",X"6D",X"65",X"68", + X"68",X"5D",X"4D",X"42",X"27",X"0C",X"0C",X"14",X"1C",X"1F",X"3A",X"68",X"9E",X"CE",X"E1",X"DC", + X"DC",X"DC",X"DC",X"CE",X"A6",X"75",X"5A",X"4A",X"3A",X"4A",X"70",X"98",X"BE",X"E1",X"E9",X"E4", + X"B9",X"9E",X"90",X"8B",X"88",X"75",X"52",X"2F",X"2F",X"4A",X"5D",X"68",X"78",X"80",X"70",X"70", + X"7D",X"8B",X"9E",X"B6",X"BE",X"B6",X"AE",X"9B",X"98",X"AE",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"B9",X"9E",X"88",X"65",X"4D",X"47",X"3F",X"2F",X"11",X"01",X"04", + X"1F",X"2F",X"2F",X"1F",X"11",X"01",X"0C",X"2C",X"4D",X"62",X"78",X"98",X"AB",X"BE",X"DC",X"F4", + X"F7",X"E4",X"E1",X"DC",X"C1",X"9E",X"88",X"62",X"3A",X"14",X"01",X"11",X"17",X"27",X"32",X"55", + X"88",X"B6",X"E4",X"F7",X"E4",X"C6",X"A3",X"75",X"5A",X"52",X"5A",X"68",X"78",X"80",X"80",X"5A", + X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"3F",X"70",X"A3",X"C9",X"E1",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"C6",X"B3",X"98",X"93",X"9B",X"AB",X"B9",X"AB",X"98",X"83",X"68",X"52", + X"4A",X"2F",X"17",X"04",X"01",X"0C",X"37",X"75",X"A3",X"B9",X"D1",X"CE",X"B3",X"A3",X"9B",X"93", + X"93",X"A6",X"BE",X"B9",X"9E",X"7D",X"55",X"37",X"27",X"27",X"4A",X"80",X"A6",X"B3",X"AE",X"AB", + X"B9",X"C6",X"B9",X"B3",X"A3",X"80",X"5D",X"4A",X"47",X"3A",X"32",X"3A",X"5A",X"7D",X"83",X"90", + X"8B",X"83",X"7D",X"70",X"65",X"6D",X"7D",X"78",X"65",X"47",X"1F",X"0C",X"01",X"01",X"09",X"2C", + X"68",X"AE",X"CE",X"D1",X"CE",X"D4",X"E4",X"E4",X"CE",X"A6",X"98",X"9B",X"AB",X"BE",X"CE",X"CE", + X"B9",X"90",X"52",X"14",X"01",X"01",X"01",X"01",X"09",X"3A",X"78",X"9E",X"AE",X"B9",X"CE",X"CE", + X"B9",X"A6",X"90",X"7D",X"7D",X"83",X"80",X"68",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75", + X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6",X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4", + X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A",X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC", + X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52",X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B", + X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9",X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01", + X"01",X"01",X"01",X"01",X"01",X"24",X"47",X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4", + X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3",X"9B",X"98",X"98",X"90",X"83",X"88",X"A6",X"C9",X"DC", + X"D9",X"BE",X"AB",X"7D",X"52",X"2F",X"27",X"1F",X"11",X"17",X"27",X"2F",X"2F",X"3F",X"52",X"5D", + X"5A",X"65",X"70",X"75",X"80",X"88",X"8B",X"9B",X"AB",X"BE",X"C6",X"AE",X"83",X"55",X"27",X"09", + X"09",X"27",X"52",X"83",X"93",X"98",X"93",X"88",X"83",X"80",X"70",X"55",X"3F",X"2C",X"27",X"32", + X"47",X"65",X"8B",X"AE",X"D4",X"E9",X"D9",X"B3",X"98",X"90",X"93",X"88",X"68",X"4D",X"4A",X"5A", + X"68",X"6D",X"7D",X"8B",X"90",X"8B",X"88",X"8B",X"98",X"9E",X"9B",X"83",X"62",X"2F",X"09",X"04", + X"1F",X"47",X"6D",X"98",X"AE",X"B6",X"B3",X"AB",X"9B",X"9B",X"A3",X"B6",X"C6",X"B9",X"9B",X"83", + X"78",X"6D",X"65",X"5A",X"5A",X"68",X"88",X"A6",X"B6",X"A3",X"8B",X"75",X"68",X"6D",X"6D",X"65", + X"5D",X"5D",X"68",X"80",X"A3",X"CE",X"DC",X"D4",X"CE",X"CE",X"C9",X"C6",X"CE",X"BE",X"AB",X"90", + X"80",X"80",X"8B",X"98",X"9E",X"B6",X"DC",X"E4",X"E4",X"E1",X"CE",X"C6",X"B6",X"98",X"80",X"7D", + X"75",X"70",X"68",X"68",X"62",X"3F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"11",X"47",X"68",X"90",X"B6",X"CE",X"D4",X"E1",X"E9",X"E9",X"E4",X"E4",X"E9",X"E4",X"D4",X"C6", + X"A6",X"78",X"42",X"14",X"01",X"01",X"01",X"01",X"14",X"42",X"78",X"AB",X"D1",X"E1",X"D9",X"C6", + X"9B",X"7D",X"75",X"78",X"88",X"93",X"8B",X"88",X"70",X"4D",X"2F",X"24",X"1C",X"24",X"27",X"24", + X"27",X"3A",X"62",X"88",X"B3",X"CE",X"DC",X"EC",X"EF",X"E1",X"CE",X"BE",X"A3",X"83",X"68",X"52", + X"4D",X"55",X"65",X"78",X"78",X"80",X"90",X"90",X"90",X"8B",X"75",X"5D",X"4D",X"52",X"62",X"80", + X"A3",X"B6",X"B6",X"B6",X"A6",X"90",X"83",X"88",X"93",X"9E",X"BE",X"D1",X"C9",X"AE",X"8B",X"62", + X"3F",X"27",X"1C",X"32",X"62",X"88",X"9B",X"A3",X"AB",X"C1",X"CE",X"C1",X"B6",X"A6",X"90",X"6D", + X"5D",X"55",X"3F",X"2F",X"2F",X"47",X"5D",X"65",X"6D",X"75",X"78",X"83",X"7D",X"75",X"7D",X"83", + X"80",X"68",X"4D",X"2F",X"14",X"04",X"04",X"17",X"37",X"70",X"A6",X"C1",X"C1",X"B9",X"BE",X"D1", + X"D4",X"C1",X"A3",X"98",X"9E",X"AE",X"C9",X"D4",X"D4",X"C6",X"98",X"5D",X"24",X"01",X"01",X"01", + X"01",X"17",X"4A",X"7D",X"A3",X"AE",X"B9",X"C9",X"C6",X"B6",X"A3",X"8B",X"7D",X"80",X"83",X"83", + X"6D",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75",X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6", + X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4",X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A", + X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC",X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52", + X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B",X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9", + X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"47", + X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4",X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3", + X"9B",X"98",X"98",X"8B",X"83",X"8B",X"A6",X"C9",X"E1",X"DC",X"C1",X"A6",X"7D",X"4D",X"2C",X"24", + X"17",X"0C",X"11",X"1F",X"2C",X"2C",X"3A",X"52",X"5D",X"5A",X"65",X"70",X"78",X"88",X"90",X"90", + X"9E",X"AB",X"C1",X"C6",X"A6",X"78",X"3F",X"11",X"01",X"01",X"14",X"47",X"80",X"93",X"98",X"93", + X"83",X"70",X"65",X"4D",X"2F",X"14",X"04",X"04",X"27",X"47",X"70",X"A3",X"D1",X"FC",X"FC",X"F7", + X"C9",X"A6",X"9B",X"9B",X"8B",X"70",X"5A",X"5D",X"75",X"7D",X"80",X"8B",X"9E",X"9B",X"93",X"8B", + X"98",X"A3",X"AE",X"AE",X"93",X"68",X"32",X"04",X"04",X"24",X"52",X"88",X"B6",X"C9",X"B9",X"AB", + X"98",X"80",X"80",X"90",X"A6",X"B9",X"BE",X"A6",X"93",X"8B",X"80",X"70",X"4D",X"37",X"3F",X"62", + X"88",X"9E",X"98",X"80",X"65",X"55",X"62",X"68",X"68",X"70",X"75",X"78",X"93",X"C6",X"FC",X"FC", + X"FC",X"FC",X"F7",X"E9",X"DC",X"D4",X"BE",X"A3",X"80",X"68",X"70",X"75",X"75",X"70",X"80",X"A3", + X"B3",X"B3",X"AE",X"98",X"83",X"75",X"5D",X"52",X"5A",X"68",X"78",X"83",X"83",X"78",X"4A",X"11", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"78",X"A6",X"D1",X"E9",X"E4", + X"E1",X"E1",X"DC",X"D9",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"B9",X"75",X"2F",X"01",X"01",X"01", + X"01",X"01",X"01",X"27",X"5D",X"9B",X"D4",X"F4",X"EC",X"CE",X"A6",X"93",X"9E",X"B6",X"B6",X"A3", + X"93",X"8B",X"83",X"70",X"68",X"78",X"93",X"A6",X"9E",X"90",X"83",X"98",X"AE",X"C9",X"D4",X"DC", + X"CE",X"A6",X"7D",X"65",X"52",X"2C",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"4D",X"9E", + X"E4",X"FC",X"FC",X"FC",X"EC",X"EC",X"FC",X"FC",X"FC",X"FC",X"E9",X"AE",X"78",X"4A",X"2F",X"2F", + X"52",X"8B",X"C6",X"F4",X"FC",X"F7",X"DC",X"B3",X"80",X"4D",X"17",X"01",X"01",X"01",X"1C",X"3F", + X"70",X"A6",X"D1",X"E9",X"E1",X"CE",X"B9",X"B3",X"AE",X"A6",X"88",X"5A",X"1F",X"01",X"01",X"01", + X"01",X"01",X"14",X"52",X"8B",X"B9",X"C6",X"B6",X"A6",X"9E",X"90",X"75",X"68",X"52",X"4A",X"52", + X"68",X"88",X"93",X"83",X"62",X"3F",X"1F",X"17",X"2F",X"4D",X"68",X"75",X"83",X"9E",X"D1",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D4",X"BE",X"B3",X"A3",X"A6",X"BE",X"D4",X"E1",X"CE",X"B3",X"A6",X"98", + X"75",X"4A",X"27",X"1C",X"2F",X"4D",X"68",X"7D",X"68",X"47",X"17",X"01",X"01",X"01",X"01",X"01", + X"04",X"0C",X"1F",X"32",X"4A",X"5D",X"80",X"B3",X"F7",X"FC",X"FC",X"FC",X"EC",X"D4",X"CE",X"BE", + X"C1",X"CE",X"D9",X"C9",X"A3",X"83",X"70",X"5A",X"3F",X"32",X"3F",X"5D",X"68",X"65",X"47",X"2C", + X"17",X"04",X"09",X"27",X"4A",X"68",X"90",X"9E",X"98",X"88",X"7D",X"83",X"9E",X"CE",X"E9",X"F7", + X"E4",X"BE",X"9E",X"68",X"37",X"09",X"01",X"01",X"01",X"04",X"14",X"37",X"55",X"65",X"70",X"88", + X"AE",X"DC",X"FC",X"F4",X"D1",X"AE",X"93",X"80",X"78",X"83",X"9B",X"B3",X"B3",X"98",X"70",X"47", + X"24",X"17",X"32",X"62",X"9B",X"C9",X"CE",X"B9",X"A3",X"9B",X"88",X"70",X"5D",X"55",X"68",X"93", + X"B6",X"BE",X"B3",X"AE",X"AE",X"A3",X"90",X"90",X"98",X"9B",X"AB",X"AB",X"AE",X"B3",X"AB",X"93", + X"78",X"65",X"68",X"78",X"75",X"70",X"68",X"78",X"8B",X"93",X"93",X"9E",X"B9",X"DC",X"FC",X"FC", + X"FC",X"D4",X"93",X"62",X"42",X"1C",X"01",X"01",X"04",X"0C",X"0C",X"1F",X"4A",X"78",X"AB",X"C9", + X"DC",X"E1",X"D9",X"C6",X"AB",X"90",X"70",X"47",X"09",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"1C",X"47",X"62",X"75",X"88",X"AB",X"D1",X"E9",X"EC",X"E9",X"E4",X"DC",X"F7",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"9E",X"80",X"75",X"7D",X"70",X"6D",X"75",X"80",X"8B",X"80",X"65", + X"4A",X"2C",X"04",X"01",X"01",X"01",X"04",X"2C",X"52",X"62",X"5A",X"4D",X"5A",X"78",X"9B",X"B3", + X"C1",X"AB",X"93",X"83",X"78",X"62",X"4D",X"4A",X"52",X"4A",X"3F",X"4D",X"5D",X"7D",X"90",X"9B", + X"9E",X"83",X"68",X"62",X"5D",X"68",X"78",X"88",X"88",X"8B",X"8B",X"80",X"62",X"47",X"3F",X"3A", + X"32",X"37",X"37",X"37",X"4D",X"70",X"88",X"8B",X"80",X"70",X"70",X"8B",X"B6",X"D4",X"D4",X"CE", + X"B9",X"B9",X"C9",X"C9",X"C6",X"B6",X"B9",X"D4",X"FC",X"FC",X"FC",X"FC",X"EC",X"B6",X"80",X"52", + X"37",X"2F",X"2C",X"37",X"62",X"98",X"D1",X"FC",X"FC",X"EC",X"D1",X"A3",X"68",X"4A",X"32",X"27", + X"27",X"3A",X"55",X"68",X"62",X"52",X"3F",X"1C",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"37", + X"5A",X"70",X"88",X"88",X"7D",X"65",X"52",X"47",X"52",X"68",X"83",X"9E",X"AE",X"B6",X"C1",X"B9", + X"B6",X"AE",X"98",X"78",X"5D",X"42",X"32",X"2C",X"2F",X"4D",X"7D",X"B9",X"F7",X"FC",X"FC",X"FC", + X"E1",X"AB",X"83",X"65",X"52",X"5A",X"68",X"65",X"52",X"3F",X"3F",X"3F",X"37",X"37",X"52",X"7D", + X"A6",X"C1",X"BE",X"9E",X"88",X"7D",X"68",X"5A",X"47",X"47",X"62",X"90",X"B3",X"C6",X"D9",X"EF", + X"FC",X"FC",X"E4",X"CE",X"B9",X"B3",X"B3",X"AE",X"AB",X"9B",X"75",X"55",X"37",X"11",X"01",X"01", + X"01",X"01",X"04",X"4D",X"88",X"AB",X"B3",X"AE",X"A3",X"9B",X"AE",X"C6",X"CE",X"C9",X"BE",X"B6", + X"B3",X"AB",X"AE",X"C6",X"EF",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"88",X"4A",X"14",X"01", + X"09",X"2C",X"52",X"78",X"93",X"93",X"78",X"47",X"0C",X"01",X"01",X"01",X"01",X"09",X"09",X"11", + X"27",X"4D",X"62",X"68",X"7D",X"90",X"9E",X"AE",X"AB",X"8B",X"70",X"62",X"52",X"3A",X"1C",X"04", + X"11",X"2F",X"5A",X"83",X"9E",X"B3",X"B9",X"B9",X"AB",X"80",X"62",X"4D",X"4D",X"5A",X"65",X"75", + X"7D",X"83",X"83",X"70",X"4D",X"1F",X"0C",X"14",X"32",X"5D",X"70",X"68",X"65",X"68",X"83",X"9E", + X"9E",X"93",X"88",X"83",X"9B",X"BE",X"D9",X"E1",X"D1",X"B6",X"A3",X"93",X"88",X"88",X"8B",X"98", + X"A3",X"C6",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"D4",X"B3",X"88",X"65",X"4A",X"32",X"3A",X"5D", + X"88",X"B3",X"D4",X"E4",X"E1",X"B9",X"78",X"37",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"14",X"37",X"42",X"4A",X"5A",X"68",X"78",X"90",X"AE",X"C9",X"E1",X"E1", + X"C9",X"93",X"65",X"4D",X"32",X"1F",X"17",X"27",X"37",X"3F",X"42",X"4D",X"68",X"88",X"98",X"A3", + X"B6",X"C9",X"D4",X"E4",X"E4",X"D4",X"BE",X"A6",X"AE",X"C6",X"E4",X"FC",X"FC",X"FC",X"E4",X"AB", + X"6D",X"3F",X"27",X"2F",X"52",X"83",X"AB",X"AB",X"AE",X"AE",X"AE",X"98",X"70",X"5A",X"5A",X"65", + X"7D",X"88",X"80",X"5D",X"3A",X"24",X"11",X"11",X"2F",X"52",X"75",X"83",X"93",X"A3",X"C9",X"EF", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"98",X"5A",X"1F",X"01",X"01",X"01",X"11",X"2F", + X"5D",X"90",X"BE",X"E4",X"FC",X"FC",X"D9",X"A3",X"78",X"65",X"68",X"75",X"70",X"65",X"5A",X"4A", + X"2C",X"14",X"04",X"11",X"37",X"68",X"9B",X"A6",X"9B",X"88",X"83",X"90",X"93",X"90",X"8B",X"83", + X"7D",X"83",X"93",X"A6",X"B6",X"BE",X"B9",X"9E",X"68",X"42",X"2C",X"2F",X"47",X"5D",X"78",X"88", + X"90",X"93",X"90",X"70",X"52",X"37",X"17",X"11",X"17",X"2C",X"37",X"3F",X"4D",X"4A",X"3F",X"32", + X"2F",X"37",X"5A",X"7D",X"9B",X"9E",X"A6",X"AE",X"B6",X"D4",X"FC",X"FC",X"FC",X"FC",X"FC",X"EC", + X"E1",X"B9",X"93",X"6D",X"5A",X"5A",X"5D",X"68",X"75",X"78",X"83",X"83",X"83",X"83",X"70",X"5D", + X"4A",X"4D",X"62",X"7D",X"90",X"98",X"88",X"62",X"2F",X"01",X"01",X"01",X"01",X"1C",X"37",X"52", + X"65",X"68",X"5A",X"52",X"5D",X"75",X"7D",X"75",X"5D",X"4A",X"4D",X"65",X"88",X"AB",X"C6",X"D9", + X"D4",X"B6",X"93",X"83",X"70",X"5A",X"47",X"47",X"4A",X"3F",X"3A",X"3F",X"32",X"27",X"17",X"1F", + X"3F",X"68",X"93",X"9E",X"9B",X"93",X"98",X"A6",X"AB",X"AB",X"A3",X"A6",X"BE",X"E1",X"F7",X"FC", + X"FC",X"EC",X"D1",X"AE",X"93",X"8B",X"9B",X"B3",X"B6",X"B6",X"C6",X"C6",X"B6",X"A6",X"9E",X"93", + X"7D",X"5D",X"37",X"1C",X"1F",X"27",X"2C",X"37",X"52",X"75",X"93",X"98",X"8B",X"7D",X"65",X"5D", + X"65",X"75",X"88",X"9B",X"9E",X"9B",X"8B",X"80",X"83",X"8B",X"8B",X"83",X"93",X"AB",X"C9",X"DC", + X"CE",X"B9",X"A6",X"83",X"5D",X"32",X"17",X"01",X"01",X"04",X"1C",X"4A",X"80",X"B6",X"DC",X"E1", + X"D4",X"BE",X"A6",X"98",X"90",X"88",X"6D",X"4D",X"2C",X"11",X"04",X"04",X"1C",X"4D",X"83",X"B6", + X"DC",X"E4",X"D1",X"C1",X"B3",X"9B",X"80",X"68",X"68",X"68",X"75",X"7D",X"7D",X"70",X"52",X"2C", + X"04",X"01",X"01",X"01",X"11",X"2F",X"47",X"5D",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC", + X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E",X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E", + X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52",X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01", + X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3",X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB", + X"93",X"78",X"65",X"62",X"68",X"70",X"80",X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70", + X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3",X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88", + X"7D",X"62",X"47",X"2F",X"11",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"78",X"93",X"9B", + X"9E",X"93",X"98",X"9B",X"98",X"A3",X"A6",X"AB",X"B3",X"C1",X"D1",X"CE",X"BE",X"AE",X"98",X"7D", + X"75",X"65",X"52",X"4A",X"3F",X"3A",X"3F",X"52",X"68",X"80",X"93",X"AB",X"B6",X"C9",X"E1",X"E4", + X"D4",X"CE",X"CE",X"C9",X"BE",X"9E",X"7D",X"5A",X"37",X"27",X"1C",X"1F",X"37",X"5A",X"75",X"80", + X"8B",X"93",X"90",X"8B",X"88",X"88",X"80",X"80",X"83",X"80",X"88",X"A3",X"C6",X"E1",X"FC",X"FC", + X"F4",X"CE",X"A3",X"80",X"65",X"4A",X"37",X"37",X"3F",X"47",X"52",X"62",X"70",X"7D",X"70",X"62", + X"52",X"55",X"68",X"78",X"80",X"75",X"65",X"65",X"5D",X"55",X"5A",X"5A",X"65",X"80",X"98",X"A3", + X"9B",X"8B",X"7D",X"80",X"88",X"90",X"98",X"9B",X"93",X"93",X"9E",X"AE",X"B9",X"B6",X"AE",X"AE", + X"A6",X"93",X"78",X"65",X"52",X"4D",X"4A",X"52",X"68",X"78",X"88",X"93",X"90",X"83",X"80",X"6D", + X"5D",X"5D",X"62",X"68",X"6D",X"6D",X"5D",X"4A",X"37",X"2F",X"32",X"52",X"75",X"93",X"A6",X"AE", + X"AB",X"AE",X"B6",X"C6",X"BE",X"C1",X"B9",X"A6",X"98",X"8B",X"70",X"52",X"3A",X"2C",X"37",X"42", + X"5A",X"68",X"70",X"78",X"7D",X"88",X"93",X"98",X"90",X"7D",X"7D",X"88",X"90",X"98",X"93",X"7D", + X"52",X"2C",X"09",X"01",X"01",X"09",X"32",X"52",X"70",X"88",X"9B",X"93",X"90",X"93",X"98",X"90", + X"83",X"70",X"65",X"62",X"78",X"93",X"AE",X"BE",X"C6",X"B9",X"9E",X"83",X"70",X"65",X"5D",X"5A", + X"5A",X"5D",X"5A",X"55",X"55",X"47",X"37",X"27",X"1F",X"37",X"5A",X"78",X"88",X"8B",X"8B",X"93", + X"A3",X"A6",X"AB",X"A6",X"AB",X"BE",X"D4",X"E4",X"EC",X"EC",X"E1",X"C9",X"A6",X"90",X"83",X"90", + X"98",X"9B",X"9E",X"AE",X"AB",X"A6",X"9E",X"9B",X"9B",X"90",X"78",X"5A",X"3F",X"37",X"37",X"37", + X"3F",X"52",X"68",X"88",X"83",X"78",X"68",X"5A",X"55",X"65",X"78",X"8B",X"9E",X"A3",X"9B",X"90", + X"83",X"88",X"8B",X"88",X"80",X"8B",X"9E",X"B9",X"C9",X"B9",X"A6",X"93",X"75",X"52",X"32",X"1C", + X"11",X"0C",X"14",X"2C",X"5A",X"8B",X"BE",X"DC",X"E1",X"D9",X"C6",X"AE",X"9E",X"98",X"8B",X"75", + X"55",X"32",X"1C",X"11",X"11",X"24",X"52",X"88",X"B6",X"D9",X"E4",X"CE",X"BE",X"AE",X"98",X"7D", + X"68",X"65",X"68",X"75",X"78",X"7D",X"70",X"52",X"2F",X"09",X"01",X"01",X"01",X"11",X"2F",X"47", + X"5A",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC",X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E", + X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E",X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52", + X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01",X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3", + X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB",X"93",X"78",X"65",X"62",X"68",X"70",X"80", + X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70",X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3", + X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88",X"7D",X"62",X"47",X"2C",X"0C",X"01",X"01", + X"01",X"01",X"01",X"14",X"3A",X"65",X"7D",X"98",X"A3",X"A3",X"98",X"9B",X"9E",X"9E",X"A6",X"AB", + X"AB",X"B6",X"C6",X"D4",X"CE",X"BE",X"AB",X"90",X"78",X"68",X"5A",X"47",X"32",X"27",X"1F",X"24", + X"3A",X"62",X"80",X"9E",X"B9",X"CE",X"D4",X"E9",X"EC",X"E1",X"D1",X"D1",X"CE",X"C6",X"A6",X"80", + X"55",X"2F",X"17",X"04",X"11",X"2F",X"62",X"83",X"9B",X"A6",X"AB",X"9B",X"90",X"8B",X"88",X"78", + X"70",X"65",X"5A",X"65",X"88",X"A6",X"CE",X"EF",X"FC",X"FC",X"E1",X"B6",X"9E",X"88",X"68",X"52", + X"4A",X"47",X"3F",X"37",X"3A",X"47",X"47",X"3A",X"2F",X"2F",X"4A",X"68",X"80",X"83",X"75",X"65", + X"65",X"65",X"68",X"75",X"7D",X"88",X"9E",X"AB",X"AB",X"98",X"80",X"78",X"7D",X"80",X"8B",X"9E", + X"9E",X"9B",X"9E",X"AE",X"BE",X"C1",X"B3",X"A6",X"A3",X"A6",X"AB",X"9B",X"83",X"68",X"52",X"42", + X"3F",X"52",X"68",X"80",X"93",X"A3",X"A6",X"B3",X"A6",X"93",X"88",X"88",X"93",X"90",X"83",X"68", + X"4D",X"37",X"2C",X"2F",X"47",X"68",X"90",X"AB",X"AE",X"A6",X"A6",X"9B",X"88",X"75",X"68",X"62", + X"52",X"42",X"32",X"27",X"11",X"01",X"01",X"11",X"27",X"3F",X"5A",X"65",X"68",X"78",X"8B",X"A6", + X"C1",X"C6",X"B9",X"B3",X"B3",X"AB",X"A3",X"8B",X"68",X"42",X"24",X"11",X"11",X"11",X"27",X"4D", + X"70",X"98",X"B9",X"DC",X"E9",X"E9",X"E1",X"CE",X"AB",X"98",X"90",X"83",X"83",X"93",X"A3",X"B6", + X"AE",X"A3",X"90",X"78",X"5D",X"4A",X"4D",X"62",X"78",X"83",X"80",X"80",X"83",X"7D",X"68",X"52", + X"37",X"1F",X"1F",X"2F",X"47",X"55",X"65",X"7D",X"90",X"93",X"98",X"A3",X"AE",X"B3",X"B9",X"B6", + X"B6",X"C1",X"C6",X"B9",X"A6",X"8B",X"80",X"70",X"65",X"52",X"4A",X"52",X"62",X"65",X"68",X"7D", + X"90",X"AB",X"C6",X"D1",X"CE",X"AE",X"88",X"68",X"65",X"62",X"52",X"52",X"4D",X"3F",X"2F",X"27", + X"27",X"3A",X"62",X"83",X"9E",X"B3",X"A6",X"9E",X"93",X"90",X"8B",X"7D",X"68",X"62",X"65",X"65", + X"65",X"55",X"3F",X"27",X"14",X"11",X"14",X"1C",X"2F",X"4A",X"62",X"78",X"98",X"B6",X"D1",X"E4", + X"E4",X"E1",X"E4",X"F7",X"FC",X"F7",X"E4",X"D1",X"BE",X"AB",X"98",X"83",X"8B",X"98",X"93",X"90", + X"93",X"90",X"83",X"78",X"70",X"6D",X"62",X"4A",X"2C",X"17",X"14",X"1C",X"27",X"3F",X"4D",X"5D", + X"68",X"68",X"68",X"68",X"75",X"8B",X"9E",X"A6",X"9E",X"9B",X"98",X"98",X"93",X"80",X"70",X"62", + X"52",X"4A",X"42",X"3A",X"2F",X"27",X"2C",X"2F",X"3F",X"5D",X"80",X"90",X"9B",X"A3",X"AE",X"C9", + X"E1",X"E4",X"DC",X"CE",X"C9",X"CE",X"C6",X"B3",X"98",X"8B",X"83",X"75",X"68",X"6D",X"7D",X"90", + X"A3",X"B3",X"B9",X"AE",X"98",X"7D",X"70",X"62",X"4A",X"2F",X"17",X"11",X"17",X"24",X"37",X"52", + X"62",X"75",X"80",X"80",X"80",X"88",X"8B",X"8B",X"98",X"9B",X"9E",X"AB",X"B6",X"AE",X"A3",X"90", + X"83",X"80",X"7D",X"83",X"90",X"90",X"88",X"75",X"62",X"52",X"47",X"42",X"4A",X"5D",X"75",X"8B", + X"A3",X"AB",X"AB",X"A3",X"93",X"98",X"9E",X"AE",X"BE",X"BE",X"AB",X"88",X"68",X"52",X"3A",X"37", + X"47",X"62",X"83",X"98",X"A3",X"9B",X"98",X"98",X"88",X"68",X"52",X"4D",X"52",X"62",X"65",X"62", + X"62",X"5D",X"4A",X"37",X"27",X"2C",X"3F",X"5D",X"6D",X"75",X"75",X"80",X"90",X"A3",X"B3",X"BE", + X"C6",X"C1",X"B9",X"AB",X"9E",X"83",X"68",X"52",X"3F",X"27",X"11",X"0C",X"11",X"1C",X"3F",X"68", + X"9B",X"B6",X"BE",X"B6",X"B3",X"B6",X"BE",X"C9",X"C6",X"AE",X"9B",X"8B",X"80",X"7D",X"83",X"93", + X"A3",X"AE",X"A3",X"9E",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"7D",X"68",X"62",X"5D",X"62",X"5D", + X"52",X"4D",X"5A",X"52",X"52",X"52",X"52",X"52",X"5A",X"5A",X"5A",X"62",X"68",X"78",X"88",X"90", + X"98",X"A6",X"B6",X"B9",X"B6",X"B3",X"B6",X"B9",X"B9",X"B6",X"AE",X"AB",X"93",X"78",X"65",X"4D", + X"32",X"24",X"24",X"32",X"52",X"70",X"83",X"88",X"83",X"7D",X"70",X"65",X"68",X"6D",X"6D",X"6D", + X"68",X"65",X"68",X"68",X"65",X"5D",X"55",X"5D",X"70",X"8B",X"90",X"93",X"8B",X"80",X"7D",X"7D", + X"8B",X"9E",X"A6",X"A3",X"9E",X"9E",X"A3",X"A3",X"98",X"88",X"80",X"75",X"68",X"62",X"55",X"4D", + X"4A",X"4D",X"5D",X"75",X"93",X"AE",X"B6",X"AB",X"93",X"78",X"65",X"52",X"5A",X"5D",X"65",X"78", + X"88",X"88",X"80",X"75",X"70",X"68",X"5D",X"5A",X"5D",X"62",X"68",X"70",X"75",X"78",X"7D",X"7D", + X"80",X"78",X"70",X"65",X"5D",X"52",X"5A",X"70",X"8B",X"A3",X"AE",X"AE",X"A6",X"9B",X"90",X"83", + X"75",X"68",X"55",X"4D",X"4A",X"4A",X"4D",X"5A",X"78",X"93",X"B9",X"D4",X"E4",X"E1",X"CE",X"BE", + X"AE",X"9B",X"88",X"78",X"78",X"78",X"78",X"68",X"62",X"55",X"4D",X"3A",X"32",X"3A",X"4D",X"68", + X"7D",X"80",X"7D",X"78",X"75",X"7D",X"88",X"98",X"A3",X"AE",X"AE",X"AB",X"AE",X"B6",X"C6",X"D1", + X"D4",X"D4",X"C6",X"AB",X"98",X"83",X"78",X"65",X"4D",X"3F",X"3F",X"3F",X"4A",X"5A",X"68",X"70", + X"68",X"68",X"70",X"80",X"8B",X"93",X"8B",X"7D",X"70",X"6D",X"68",X"70",X"75",X"75",X"78",X"78", + X"75",X"68",X"65",X"62",X"6D",X"83",X"98",X"AE",X"B6",X"A6",X"98",X"90",X"80",X"75",X"68",X"5D", + X"62",X"68",X"80",X"93",X"9B",X"93",X"90",X"80",X"6D",X"5A",X"4A",X"42",X"47",X"52",X"5D",X"6D", + X"83",X"90",X"90",X"83",X"80",X"80",X"75",X"75",X"70",X"68",X"65",X"5A",X"52",X"4D",X"52",X"65", + X"7D",X"98",X"A6",X"AB",X"AB",X"A6",X"9E",X"9B",X"90",X"80",X"75",X"6D",X"65",X"52",X"52",X"52", + X"52",X"4D",X"42",X"3F",X"47",X"4A",X"55",X"5D",X"62",X"62",X"62",X"62",X"68",X"7D",X"88",X"93", + X"A3",X"9E",X"A3",X"98",X"90",X"90",X"98",X"A3",X"B6",X"C1",X"BE",X"B6",X"B3",X"AB",X"9B",X"88", + X"75",X"70",X"68",X"65",X"70",X"78",X"7D",X"70",X"68",X"68",X"68",X"68",X"65",X"62",X"5D",X"68", + X"7D",X"90",X"9B",X"9B",X"98",X"98",X"98",X"93",X"98",X"9E",X"9B",X"98",X"93",X"93",X"90",X"83", + X"80",X"80",X"78",X"68",X"62",X"62",X"65",X"75",X"83",X"88",X"8B",X"90",X"8B",X"7D",X"70",X"68", + X"65",X"5D",X"55",X"52",X"4D",X"4A",X"4D",X"5A",X"5D",X"65",X"70",X"80",X"8B",X"93",X"9E",X"9E", + X"9B",X"9E",X"A3",X"9B",X"98",X"90",X"88",X"83",X"83",X"88",X"90",X"A6",X"B9",X"BE",X"C1",X"C6", + X"C6",X"C6",X"B6",X"9B",X"83",X"65",X"52",X"4A",X"4D",X"5D",X"6D",X"80",X"8B",X"93",X"8B",X"80", + X"65",X"5A",X"52",X"52",X"52",X"47",X"3F",X"3A",X"47",X"52",X"5D",X"6D",X"83",X"93",X"9B",X"9E", + X"98",X"8B",X"88",X"80",X"80",X"78",X"6D",X"68",X"68",X"70",X"70",X"68",X"68",X"62",X"5A",X"5A", + X"5D",X"5A",X"5D",X"65",X"70",X"75",X"8B",X"98",X"9B",X"9B",X"9B",X"93",X"88",X"88",X"83",X"88", + X"88",X"93",X"9B",X"98",X"8B",X"80",X"78",X"70",X"68",X"68",X"70",X"80",X"88",X"90",X"93",X"9B", + X"9E",X"98",X"98",X"98",X"98",X"90",X"83",X"78",X"78",X"6D",X"6D",X"78",X"88",X"98",X"A3",X"AB", + X"AB",X"A6",X"98",X"83",X"70",X"52",X"47",X"37",X"32",X"27",X"27",X"37",X"47",X"4D",X"65",X"75", + X"88",X"90",X"98",X"90",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"68",X"62",X"5D",X"4D",X"42", + X"3A",X"3A",X"3F",X"47",X"52",X"5A",X"68",X"78",X"83",X"90",X"A3",X"AE",X"B6",X"B9",X"B6",X"AE", + X"B3",X"B6",X"C1",X"C6",X"BE",X"B9",X"B9",X"AE",X"9B",X"88",X"80",X"75",X"68",X"65",X"65",X"70", + X"78",X"83",X"8B",X"90",X"88",X"7D",X"65",X"5A",X"55",X"5A",X"52",X"4D",X"47",X"42",X"3F",X"47", + X"4A",X"52",X"65",X"7D",X"93",X"9B",X"98",X"93",X"90",X"93",X"9B",X"A6",X"AE",X"AE",X"A6",X"98", + X"8B",X"78",X"68",X"5A",X"52",X"52",X"5A",X"65",X"68",X"75",X"75",X"70",X"70",X"7D",X"80",X"83", + X"83",X"80",X"80",X"80",X"8B",X"98",X"A3",X"A3",X"A6",X"A3",X"9B",X"93",X"90",X"8B",X"88",X"80", + X"78",X"70",X"62",X"5A",X"5A",X"52",X"52",X"55",X"5A",X"62",X"68",X"75",X"70",X"6D",X"65",X"65", + X"68",X"6D",X"70",X"70",X"70",X"75",X"75",X"7D",X"83",X"88",X"93",X"9B",X"A3",X"A3",X"A6",X"A6", + X"A3",X"9E",X"93",X"88",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"7D",X"70",X"68",X"62", + X"62",X"68",X"70",X"78",X"7D",X"7D",X"78",X"75",X"68",X"68",X"62",X"62",X"68",X"78",X"78",X"7D", + X"75",X"68",X"6D",X"6D",X"70",X"75",X"7D",X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"80",X"83", + X"88",X"8B",X"88",X"83",X"80",X"80",X"83",X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D", + X"75",X"6D",X"68",X"75",X"80",X"83",X"88",X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"75",X"68",X"5D",X"52",X"4A",X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B", + X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B",X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62", + X"65",X"70",X"78",X"7D",X"80",X"88",X"8B",X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90", + X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"7D",X"78",X"78",X"75",X"70",X"70",X"6D",X"68",X"6D",X"70",X"78",X"80", + X"80",X"80",X"83",X"88",X"90",X"8B",X"8B",X"8B",X"88",X"80",X"7D",X"78",X"70",X"68",X"68",X"68", + X"68",X"6D",X"6D",X"70",X"78",X"7D",X"83",X"8B",X"8B",X"90",X"8B",X"88",X"88",X"88",X"88",X"83", + X"80",X"80",X"83",X"80",X"80",X"7D",X"83",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"78",X"78", + X"75",X"70",X"70",X"70",X"75",X"78",X"78",X"78",X"75",X"75",X"70",X"70",X"75",X"78",X"75",X"75", + X"75",X"75",X"78",X"7D",X"80",X"7D",X"7D",X"7D",X"83",X"88",X"8B",X"88",X"88",X"88",X"88",X"88", + X"8B",X"90",X"90",X"88",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"7D",X"7D",X"80",X"7D",X"78", + X"75",X"70",X"70",X"78",X"80",X"88",X"88",X"88",X"88",X"83",X"7D",X"78",X"78",X"80",X"83",X"83", + X"83",X"80",X"78",X"75",X"75",X"75",X"78",X"80",X"80",X"83",X"83",X"80",X"7D",X"78",X"6D",X"68", + X"65",X"62",X"5D",X"5A",X"62",X"65",X"68",X"75",X"80",X"8B",X"90",X"93",X"90",X"88",X"83",X"80", + X"78",X"75",X"75",X"70",X"68",X"65",X"5D",X"5D",X"55",X"5A",X"5D",X"65",X"68",X"75",X"75",X"80", + X"83",X"8B",X"90",X"9B",X"A3",X"A6",X"A6",X"9E",X"9B",X"98",X"98",X"9E",X"9E",X"A3",X"A3",X"A6", + X"A3",X"9B",X"8B",X"88",X"7D",X"75",X"6D",X"68",X"6D",X"75",X"7D",X"7D",X"83",X"83",X"80",X"75", + X"6D",X"68",X"68",X"68",X"65",X"62",X"5D",X"5A",X"5A",X"5D",X"62",X"68",X"78",X"80",X"83",X"80", + X"7D",X"80",X"83",X"8B",X"98",X"9B",X"9B",X"98",X"90",X"8B",X"7D",X"70",X"68",X"62",X"65",X"68", + X"70",X"78",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"7D",X"7D",X"7D",X"83",X"90",X"98", + X"9B",X"9E",X"9B",X"98",X"90",X"8B",X"83",X"83",X"7D",X"75",X"70",X"65",X"5D",X"5D",X"5A",X"5D", + X"62",X"65",X"68",X"75",X"75",X"75",X"75",X"68",X"6D",X"6D",X"70",X"70",X"75",X"70",X"75",X"75", + X"78",X"7D",X"83",X"90",X"98",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"88",X"83",X"7D",X"7D", + X"7D",X"80",X"83",X"80",X"80",X"7D",X"75",X"68",X"65",X"65",X"68",X"75",X"78",X"7D",X"78",X"78", + X"78",X"6D",X"68",X"65",X"68",X"6D",X"78",X"7D",X"7D",X"75",X"6D",X"6D",X"70",X"75",X"78",X"80", + X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"83",X"83",X"88",X"8B",X"88",X"83",X"80",X"80",X"83", + X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D",X"75",X"6D",X"68",X"75",X"80",X"83",X"88", + X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D",X"80",X"80",X"75",X"68",X"5D",X"52",X"4A", + X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B",X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B", + X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62",X"65",X"70",X"78",X"7D",X"80",X"88",X"8B", + X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90",X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D", + X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"75", + X"75",X"70",X"75",X"6D",X"68",X"6D",X"70",X"78",X"80",X"83",X"80",X"83",X"88",X"90",X"8B",X"8B", + X"88",X"83",X"7D",X"78",X"75",X"6D",X"68",X"68",X"68",X"65",X"68",X"68",X"68",X"70",X"75",X"7D", + X"88",X"83",X"88",X"88",X"80",X"83",X"83",X"88",X"8B",X"88",X"88",X"88",X"83",X"80",X"7D",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"7D",X"75",X"75",X"75",X"75",X"70", + X"70",X"68",X"68",X"68",X"68",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"83",X"83",X"83",X"88", + X"88",X"90",X"98",X"98",X"93",X"90",X"90",X"8B",X"88",X"88",X"8B",X"88",X"80",X"78",X"78",X"75", + X"70",X"68",X"68",X"65",X"68",X"70",X"78",X"78",X"78",X"75",X"75",X"70",X"78",X"80",X"83",X"83", + X"80",X"7D",X"70",X"68",X"65",X"68",X"70",X"7D",X"83",X"83",X"83",X"80",X"75",X"70",X"68",X"65", + X"65",X"65",X"68",X"6D",X"70",X"78",X"7D",X"7D",X"7D",X"83",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"80",X"83",X"8B",X"90",X"93",X"93",X"8B",X"83",X"7D",X"78",X"70",X"6D",X"68",X"65",X"65",X"62", + X"65",X"68",X"70",X"7D",X"88",X"88",X"93",X"90",X"90",X"90",X"90",X"93",X"93",X"93",X"98",X"90", + X"88",X"80",X"78",X"78",X"75",X"78",X"80",X"88",X"90",X"90",X"93",X"8B",X"8B",X"88",X"7D",X"78", + X"6D",X"65",X"65",X"68",X"6D",X"75",X"80",X"83",X"88",X"88",X"88",X"83",X"83",X"83",X"83",X"80", + X"7D",X"80",X"7D",X"75",X"6D",X"68",X"5D",X"55",X"52",X"52",X"62",X"68",X"70",X"75",X"75",X"75", + X"78",X"7D",X"83",X"80",X"83",X"83",X"83",X"83",X"88",X"8B",X"90",X"98",X"98",X"9B",X"9B",X"93", + X"8B",X"83",X"7D",X"78",X"78",X"70",X"75",X"7D",X"80",X"80",X"83",X"80",X"80",X"75",X"70",X"68", + X"68",X"68",X"65",X"68",X"68",X"65",X"68",X"70",X"78",X"7D",X"88",X"88",X"88",X"83",X"83",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75", + X"75",X"7D",X"83",X"83",X"88",X"83",X"88",X"83",X"88",X"83",X"83",X"8B",X"88",X"8B",X"88",X"88", + X"80",X"7D",X"7D",X"75",X"6D",X"68",X"6D",X"70",X"7D",X"80",X"7D",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80", + X"83",X"83",X"80",X"80",X"7D",X"78",X"75",X"70",X"68",X"6D",X"75",X"78",X"7D",X"80",X"80",X"80", + X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"88",X"88",X"8B",X"8B",X"8B", + X"8B",X"88",X"83",X"83",X"80",X"78",X"75",X"75",X"70",X"70",X"75",X"75",X"80",X"83",X"80",X"83", + X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70", + X"75",X"75",X"78",X"7D",X"7D",X"80",X"80",X"83",X"83",X"83",X"83",X"88",X"83",X"83",X"83",X"88", + X"83",X"83",X"88",X"8B",X"88",X"88",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"80",X"80",X"80", + X"83",X"83",X"83",X"7D",X"7D",X"75",X"75",X"75",X"75",X"75",X"70",X"75",X"75",X"75",X"78",X"83", + X"80",X"83",X"80",X"7D",X"80",X"78",X"78",X"80",X"80",X"80",X"7D",X"80",X"80",X"80",X"7D",X"75", + X"70",X"68",X"68",X"68",X"68",X"68",X"70",X"75",X"7D",X"83",X"8B",X"90",X"90",X"8B",X"83",X"80", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70",X"75",X"75", + X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"7D",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"83",X"83", + X"8B",X"8B",X"8B",X"88",X"83",X"83",X"80",X"83",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"7D",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78", + X"78",X"78",X"78",X"78",X"7D",X"80",X"78",X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D", + X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"78",X"7D",X"78",X"7D",X"80",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80", + X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"78",X"80", + X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"75",X"75",X"83",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"88",X"83", + X"80",X"80",X"7D",X"78",X"75",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"75",X"75",X"78", + X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"78",X"78",X"78",X"75",X"75",X"75",X"70",X"75",X"75",X"7D",X"7D",X"80",X"80",X"80", + X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"78",X"78",X"7D", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"78", + X"78",X"78",X"78",X"78",X"78",X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83", + X"83",X"83",X"88",X"83",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"7D",X"78",X"78",X"78",X"75",X"75", + X"75",X"78",X"7D",X"78",X"83",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"78",X"78",X"78",X"78",X"75",X"75",X"75",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80", + X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"78", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"80",X"83",X"83",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"78",X"78",X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D",X"78",X"78",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"83",X"80",X"80",X"83",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"7D",X"80",X"80",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"7D",X"78",X"78",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..33721787 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,2077 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity ROM_PGM_0 is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(13 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of ROM_PGM_0 is + + + type ROM_ARRAY is array(0 to 16383) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"AF",x"32",x"01",x"70",x"C3",x"69",x"00",x"FF", -- 0x0000 + x"77",x"3C",x"23",x"77",x"3C",x"19",x"C9",x"FF", -- 0x0008 + x"77",x"23",x"10",x"FC",x"C9",x"FF",x"FF",x"FF", -- 0x0010 + x"77",x"23",x"10",x"FC",x"0D",x"20",x"F9",x"C9", -- 0x0018 + x"85",x"6F",x"3E",x"00",x"8C",x"67",x"7E",x"C9", -- 0x0020 + x"87",x"E1",x"5F",x"16",x"00",x"19",x"5E",x"23", -- 0x0028 + x"56",x"EB",x"E9",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0030 + x"E5",x"26",x"40",x"3A",x"A0",x"40",x"6F",x"CB", -- 0x0038 + x"7E",x"28",x"0E",x"72",x"2C",x"73",x"2C",x"7D", -- 0x0040 + x"FE",x"C0",x"30",x"02",x"3E",x"C0",x"32",x"A0", -- 0x0048 + x"40",x"E1",x"C9",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0050 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0058 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"C3",x"94", -- 0x0060 + x"08",x"21",x"00",x"40",x"11",x"01",x"40",x"01", -- 0x0068 + x"00",x"04",x"36",x"00",x"ED",x"B0",x"31",x"00", -- 0x0070 + x"44",x"21",x"C0",x"40",x"06",x"40",x"3E",x"FF", -- 0x0078 + x"D7",x"32",x"00",x"78",x"3A",x"00",x"78",x"AF", -- 0x0080 + x"32",x"01",x"70",x"32",x"00",x"68",x"32",x"01", -- 0x0088 + x"68",x"32",x"02",x"68",x"32",x"04",x"60",x"32", -- 0x0090 + x"05",x"60",x"32",x"06",x"60",x"32",x"07",x"60", -- 0x0098 + x"3E",x"01",x"32",x"06",x"70",x"32",x"07",x"70", -- 0x00A0 + x"21",x"C0",x"C0",x"22",x"A0",x"40",x"32",x"04", -- 0x00A8 + x"70",x"21",x"00",x"50",x"22",x"0B",x"40",x"3E", -- 0x00B0 + x"20",x"32",x"08",x"40",x"3A",x"00",x"70",x"47", -- 0x00B8 + x"E6",x"01",x"3E",x"10",x"28",x"02",x"3E",x"20", -- 0x00C0 + x"32",x"17",x"40",x"78",x"0F",x"0F",x"E6",x"01", -- 0x00C8 + x"3E",x"05",x"20",x"02",x"3E",x"03",x"32",x"07", -- 0x00D0 + x"40",x"78",x"0F",x"0F",x"0F",x"E6",x"01",x"32", -- 0x00D8 + x"0F",x"40",x"3A",x"00",x"68",x"07",x"07",x"E6", -- 0x00E0 + x"03",x"32",x"00",x"40",x"21",x"00",x"00",x"2B", -- 0x00E8 + x"3A",x"00",x"78",x"7D",x"B4",x"21",x"00",x"58", -- 0x00F0 + x"01",x"00",x"01",x"16",x"00",x"72",x"23",x"0B", -- 0x00F8 + x"78",x"B1",x"20",x"F9",x"16",x"5D",x"21",x"00", -- 0x0100 + x"50",x"01",x"00",x"04",x"72",x"3A",x"00",x"78", -- 0x0108 + x"23",x"0B",x"78",x"B1",x"20",x"F6",x"3E",x"01", -- 0x0110 + x"32",x"01",x"70",x"26",x"40",x"3A",x"A1",x"40", -- 0x0118 + x"6F",x"7E",x"87",x"30",x"05",x"CD",x"5E",x"01", -- 0x0120 + x"18",x"F1",x"E6",x"0F",x"4F",x"06",x"00",x"36", -- 0x0128 + x"FF",x"23",x"5E",x"36",x"FF",x"2C",x"7D",x"FE", -- 0x0130 + x"C0",x"30",x"02",x"3E",x"C0",x"32",x"A1",x"40", -- 0x0138 + x"7B",x"21",x"4E",x"01",x"09",x"5E",x"23",x"56", -- 0x0140 + x"21",x"1B",x"01",x"E5",x"EB",x"E9",x"F0",x"02", -- 0x0148 + x"24",x"03",x"35",x"03",x"AD",x"03",x"4E",x"04", -- 0x0150 + x"6A",x"04",x"B1",x"04",x"BC",x"07",x"3A",x"5F", -- 0x0158 + x"42",x"47",x"E6",x"0F",x"CA",x"82",x"01",x"21", -- 0x0160 + x"81",x"42",x"CB",x"46",x"C0",x"E6",x"03",x"CA", -- 0x0168 + x"A6",x"02",x"FE",x"01",x"28",x"53",x"FE",x"02", -- 0x0170 + x"28",x"76",x"3A",x"00",x"41",x"A7",x"C8",x"C3", -- 0x0178 + x"F0",x"02",x"11",x"E0",x"FF",x"21",x"E0",x"50", -- 0x0180 + x"3A",x"0E",x"40",x"A7",x"28",x"22",x"36",x"02", -- 0x0188 + x"CD",x"BA",x"01",x"21",x"40",x"53",x"CD",x"B8", -- 0x0190 + x"01",x"3A",x"0D",x"40",x"A7",x"21",x"40",x"53", -- 0x0198 + x"28",x"03",x"21",x"E0",x"50",x"CB",x"60",x"C8", -- 0x01A0 + x"3A",x"06",x"40",x"0F",x"D0",x"C3",x"C1",x"01", -- 0x01A8 + x"21",x"E0",x"50",x"CD",x"C1",x"01",x"18",x"DB", -- 0x01B0 + x"36",x"01",x"19",x"36",x"25",x"19",x"36",x"20", -- 0x01B8 + x"C9",x"3E",x"10",x"77",x"19",x"77",x"19",x"77", -- 0x01C0 + x"C9",x"21",x"7D",x"53",x"11",x"4F",x"41",x"06", -- 0x01C8 + x"02",x"CD",x"3E",x"02",x"01",x"E2",x"FF",x"09", -- 0x01D0 + x"7B",x"FE",x"3F",x"28",x"09",x"FE",x"2F",x"28", -- 0x01D8 + x"0A",x"FE",x"1F",x"20",x"EA",x"C9",x"21",x"3D", -- 0x01E0 + x"52",x"18",x"E4",x"21",x"FD",x"50",x"18",x"DF", -- 0x01E8 + x"21",x"68",x"50",x"11",x"50",x"41",x"06",x"03", -- 0x01F0 + x"CD",x"17",x"02",x"01",x"1D",x"00",x"09",x"7B", -- 0x01F8 + x"FE",x"80",x"28",x"09",x"FE",x"B0",x"28",x"0A", -- 0x0200 + x"FE",x"E0",x"C8",x"18",x"E9",x"21",x"88",x"51", -- 0x0208 + x"18",x"E4",x"21",x"A8",x"52",x"18",x"DF",x"1A", -- 0x0210 + x"F5",x"13",x"1A",x"4F",x"F1",x"CB",x"4F",x"28", -- 0x0218 + x"10",x"79",x"CB",x"4F",x"28",x"07",x"36",x"C8", -- 0x0220 + x"23",x"13",x"10",x"EB",x"C9",x"36",x"C9",x"18", -- 0x0228 + x"F7",x"79",x"CB",x"4F",x"28",x"04",x"36",x"CA", -- 0x0230 + x"18",x"EE",x"36",x"10",x"18",x"EA",x"E5",x"D5", -- 0x0238 + x"1A",x"CB",x"4F",x"28",x"25",x"CB",x"57",x"20", -- 0x0240 + x"28",x"CB",x"5F",x"20",x"2B",x"1D",x"1A",x"CB", -- 0x0248 + x"4F",x"28",x"30",x"CB",x"57",x"20",x"30",x"CB", -- 0x0250 + x"5F",x"20",x"36",x"36",x"C8",x"2D",x"1D",x"10", -- 0x0258 + x"DF",x"D1",x"E1",x"2D",x"2D",x"7B",x"D6",x"04", -- 0x0260 + x"5F",x"C9",x"36",x"10",x"2D",x"36",x"10",x"18", -- 0x0268 + x"F0",x"CD",x"9E",x"02",x"36",x"5E",x"18",x"F4", -- 0x0270 + x"D6",x"10",x"12",x"E6",x"70",x"20",x"F5",x"1A", -- 0x0278 + x"CB",x"9F",x"12",x"36",x"CA",x"18",x"E5",x"CD", -- 0x0280 + x"9E",x"02",x"36",x"C8",x"2D",x"36",x"5F",x"18", -- 0x0288 + x"D0",x"D6",x"10",x"12",x"E6",x"70",x"20",x"F2", -- 0x0290 + x"1A",x"CB",x"9F",x"12",x"18",x"CE",x"CB",x"97", -- 0x0298 + x"CB",x"DF",x"F6",x"70",x"12",x"C9",x"3A",x"BA", -- 0x02A0 + x"40",x"0F",x"D0",x"78",x"E6",x"08",x"21",x"D8", -- 0x02A8 + x"02",x"28",x"03",x"21",x"E4",x"02",x"06",x"06", -- 0x02B0 + x"11",x"20",x"00",x"DD",x"21",x"AC",x"51",x"7E", -- 0x02B8 + x"DD",x"77",x"00",x"23",x"DD",x"19",x"10",x"F7", -- 0x02C0 + x"06",x"06",x"DD",x"21",x"AD",x"51",x"7E",x"DD", -- 0x02C8 + x"77",x"00",x"23",x"DD",x"19",x"10",x"F7",x"C9", -- 0x02D0 + x"10",x"10",x"10",x"10",x"10",x"10",x"30",x"31", -- 0x02D8 + x"32",x"33",x"34",x"35",x"10",x"10",x"10",x"10", -- 0x02E0 + x"10",x"10",x"4F",x"4E",x"36",x"37",x"4D",x"4C", -- 0x02E8 + x"21",x"A5",x"51",x"11",x"1F",x"00",x"06",x"06", -- 0x02F0 + x"DD",x"21",x"04",x"41",x"3A",x"5F",x"42",x"E6", -- 0x02F8 + x"10",x"28",x"15",x"FD",x"21",x"0A",x"41",x"DD", -- 0x0300 + x"7E",x"00",x"77",x"23",x"FD",x"7E",x"00",x"77", -- 0x0308 + x"19",x"DD",x"23",x"FD",x"23",x"10",x"F0",x"C9", -- 0x0310 + x"FD",x"21",x"1E",x"03",x"18",x"E9",x"4F",x"4E", -- 0x0318 + x"32",x"33",x"4D",x"4C",x"21",x"A5",x"51",x"11", -- 0x0320 + x"1F",x"00",x"06",x"06",x"3E",x"10",x"77",x"23", -- 0x0328 + x"77",x"19",x"10",x"FA",x"C9",x"FE",x"06",x"30", -- 0x0330 + x"4A",x"A7",x"28",x"39",x"3D",x"28",x"22",x"3D", -- 0x0338 + x"87",x"87",x"87",x"87",x"2F",x"E6",x"30",x"C6", -- 0x0340 + x"C0",x"21",x"D8",x"51",x"CD",x"9A",x"03",x"21", -- 0x0348 + x"DA",x"51",x"CD",x"9A",x"03",x"21",x"18",x"52", -- 0x0350 + x"CD",x"9A",x"03",x"21",x"1A",x"52",x"C3",x"9A", -- 0x0358 + x"03",x"21",x"D8",x"51",x"11",x"1C",x"00",x"0E", -- 0x0360 + x"04",x"06",x"04",x"36",x"10",x"23",x"10",x"FB", -- 0x0368 + x"19",x"0D",x"20",x"F5",x"C9",x"CD",x"61",x"03", -- 0x0370 + x"3E",x"58",x"32",x"0D",x"42",x"21",x"F9",x"51", -- 0x0378 + x"C3",x"9A",x"03",x"FE",x"06",x"47",x"3E",x"58", -- 0x0380 + x"28",x"09",x"78",x"FE",x"07",x"3E",x"60",x"28", -- 0x0388 + x"02",x"3E",x"54",x"21",x"F9",x"51",x"18",x"02", -- 0x0390 + x"3E",x"10",x"D5",x"11",x"1F",x"00",x"CF",x"CF", -- 0x0398 + x"D1",x"C9",x"3E",x"10",x"D5",x"11",x"DF",x"FF", -- 0x03A0 + x"CF",x"C6",x"FC",x"18",x"F2",x"A7",x"28",x"48", -- 0x03A8 + x"4F",x"CD",x"03",x"04",x"87",x"81",x"4F",x"06", -- 0x03B0 + x"00",x"21",x"12",x"04",x"09",x"A7",x"06",x"03", -- 0x03B8 + x"1A",x"8E",x"27",x"12",x"13",x"23",x"10",x"F8", -- 0x03C0 + x"D5",x"3A",x"0D",x"40",x"0F",x"30",x"02",x"3E", -- 0x03C8 + x"01",x"CD",x"6A",x"04",x"D1",x"1B",x"21",x"AA", -- 0x03D0 + x"40",x"06",x"03",x"1A",x"BE",x"D8",x"20",x"05", -- 0x03D8 + x"1B",x"2B",x"10",x"F7",x"C9",x"CD",x"03",x"04", -- 0x03E0 + x"21",x"A8",x"40",x"06",x"03",x"1A",x"77",x"13", -- 0x03E8 + x"23",x"10",x"FA",x"3E",x"02",x"C3",x"6A",x"04", -- 0x03F0 + x"CD",x"03",x"04",x"21",x"AB",x"40",x"A7",x"06", -- 0x03F8 + x"03",x"18",x"BD",x"F5",x"3A",x"0D",x"40",x"11", -- 0x0400 + x"A2",x"40",x"0F",x"30",x"03",x"11",x"A5",x"40", -- 0x0408 + x"F1",x"C9",x"00",x"00",x"00",x"20",x"00",x"00", -- 0x0410 + x"40",x"00",x"00",x"60",x"00",x"00",x"80",x"00", -- 0x0418 + x"00",x"00",x"01",x"00",x"20",x"01",x"00",x"40", -- 0x0420 + x"01",x"00",x"60",x"01",x"00",x"00",x"02",x"00", -- 0x0428 + x"00",x"02",x"00",x"00",x"02",x"00",x"00",x"02", -- 0x0430 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0438 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0440 + x"00",x"04",x"00",x"00",x"04",x"00",x"F5",x"21", -- 0x0448 + x"A2",x"40",x"A7",x"28",x"09",x"21",x"A5",x"40", -- 0x0450 + x"3D",x"28",x"03",x"21",x"A8",x"40",x"36",x"00", -- 0x0458 + x"23",x"36",x"00",x"23",x"36",x"00",x"F1",x"C3", -- 0x0460 + x"6A",x"04",x"21",x"A4",x"40",x"DD",x"21",x"81", -- 0x0468 + x"53",x"A7",x"28",x"11",x"21",x"A7",x"40",x"DD", -- 0x0470 + x"21",x"21",x"51",x"3D",x"28",x"07",x"21",x"AA", -- 0x0478 + x"40",x"DD",x"21",x"41",x"52",x"11",x"E0",x"FF", -- 0x0480 + x"06",x"03",x"0E",x"04",x"7E",x"0F",x"0F",x"0F", -- 0x0488 + x"0F",x"CD",x"9C",x"04",x"7E",x"CD",x"9C",x"04", -- 0x0490 + x"2B",x"10",x"F1",x"C9",x"E6",x"0F",x"28",x"08", -- 0x0498 + x"0E",x"00",x"DD",x"77",x"00",x"DD",x"19",x"C9", -- 0x04A0 + x"79",x"A7",x"28",x"F6",x"3E",x"10",x"0D",x"18", -- 0x04A8 + x"F1",x"87",x"F5",x"21",x"1E",x"05",x"E6",x"7F", -- 0x04B0 + x"5F",x"16",x"00",x"19",x"5E",x"23",x"56",x"EB", -- 0x04B8 + x"5E",x"23",x"56",x"23",x"EB",x"01",x"E0",x"FF", -- 0x04C0 + x"F1",x"38",x"0E",x"FA",x"E3",x"04",x"1A",x"FE", -- 0x04C8 + x"3F",x"C8",x"D6",x"30",x"77",x"13",x"09",x"18", -- 0x04D0 + x"F5",x"1A",x"FE",x"3F",x"C8",x"36",x"10",x"13", -- 0x04D8 + x"09",x"18",x"F6",x"22",x"B5",x"40",x"ED",x"53", -- 0x04E0 + x"B3",x"40",x"EB",x"7B",x"E6",x"1F",x"47",x"87", -- 0x04E8 + x"C6",x"20",x"6F",x"26",x"40",x"22",x"B1",x"40", -- 0x04F0 + x"CB",x"3B",x"CB",x"3B",x"7A",x"E6",x"03",x"0F", -- 0x04F8 + x"0F",x"B3",x"E6",x"F8",x"4F",x"21",x"00",x"50", -- 0x0500 + x"78",x"85",x"6F",x"11",x"20",x"00",x"43",x"36", -- 0x0508 + x"10",x"19",x"10",x"FB",x"2A",x"B1",x"40",x"71", -- 0x0510 + x"3E",x"01",x"32",x"B0",x"40",x"C9",x"6E",x"05", -- 0x0518 + x"7B",x"05",x"8F",x"05",x"9C",x"05",x"A9",x"05", -- 0x0520 + x"B6",x"05",x"D4",x"05",x"E4",x"05",x"ED",x"05", -- 0x0528 + x"FB",x"05",x"07",x"06",x"0F",x"06",x"16",x"06", -- 0x0530 + x"24",x"06",x"3E",x"06",x"4E",x"06",x"5E",x"06", -- 0x0538 + x"6E",x"06",x"7F",x"06",x"82",x"06",x"85",x"06", -- 0x0540 + x"88",x"06",x"8B",x"06",x"9C",x"06",x"A6",x"06", -- 0x0548 + x"B8",x"06",x"CD",x"06",x"E7",x"06",x"FA",x"06", -- 0x0550 + x"0D",x"07",x"20",x"07",x"33",x"07",x"46",x"07", -- 0x0558 + x"54",x"07",x"62",x"07",x"70",x"07",x"7E",x"07", -- 0x0560 + x"8C",x"07",x"9B",x"07",x"B5",x"07",x"96",x"52", -- 0x0568 + x"47",x"41",x"4D",x"45",x"40",x"40",x"4F",x"56", -- 0x0570 + x"45",x"52",x"3F",x"F1",x"52",x"50",x"55",x"53", -- 0x0578 + x"48",x"40",x"53",x"54",x"41",x"52",x"54",x"40", -- 0x0580 + x"42",x"55",x"54",x"54",x"4F",x"4E",x"3F",x"94", -- 0x0588 + x"52",x"50",x"4C",x"41",x"59",x"45",x"52",x"40", -- 0x0590 + x"4F",x"4E",x"45",x"3F",x"94",x"52",x"50",x"4C", -- 0x0598 + x"41",x"59",x"45",x"52",x"40",x"54",x"57",x"4F", -- 0x05A0 + x"3F",x"80",x"52",x"48",x"49",x"47",x"48",x"40", -- 0x05A8 + x"53",x"43",x"4F",x"52",x"45",x"3F",x"9F",x"53", -- 0x05B0 + x"40",x"43",x"52",x"45",x"44",x"49",x"54",x"40", -- 0x05B8 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x05C0 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x05C8 + x"40",x"40",x"40",x"3F",x"D1",x"52",x"49",x"4E", -- 0x05D0 + x"53",x"45",x"52",x"54",x"40",x"40",x"43",x"4F", -- 0x05D8 + x"49",x"4E",x"53",x"3F",x"1E",x"51",x"40",x"40", -- 0x05E0 + x"40",x"40",x"40",x"40",x"3F",x"5F",x"52",x"43", -- 0x05E8 + x"48",x"41",x"4E",x"43",x"45",x"40",x"54",x"49", -- 0x05F0 + x"4D",x"45",x"3F",x"94",x"52",x"46",x"49",x"52", -- 0x05F8 + x"45",x"40",x"40",x"55",x"46",x"4F",x"3F",x"4D", -- 0x0600 + x"52",x"40",x"40",x"40",x"40",x"40",x"3F",x"26", -- 0x0608 + x"52",x"50",x"4C",x"41",x"59",x"3F",x"89",x"52", -- 0x0610 + x"5B",x"40",x"40",x"4F",x"4D",x"45",x"47",x"41", -- 0x0618 + x"40",x"40",x"5B",x"3F",x"4F",x"53",x"5B",x"40", -- 0x0620 + x"53",x"43",x"4F",x"52",x"45",x"40",x"41",x"44", -- 0x0628 + x"56",x"41",x"4E",x"43",x"45",x"40",x"54",x"41", -- 0x0630 + x"42",x"4C",x"45",x"40",x"5B",x"3F",x"92",x"52", -- 0x0638 + x"34",x"30",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x0640 + x"40",x"40",x"40",x"38",x"30",x"3F",x"95",x"52", -- 0x0648 + x"38",x"30",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x0650 + x"40",x"40",x"31",x"36",x"30",x"3F",x"98",x"52", -- 0x0658 + x"32",x"30",x"30",x"40",x"40",x"40",x"40",x"40", -- 0x0660 + x"40",x"40",x"34",x"30",x"30",x"3F",x"BC",x"52", -- 0x0668 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x0670 + x"40",x"40",x"40",x"40",x"40",x"40",x"3F",x"D5", -- 0x0678 + x"52",x"3F",x"D5",x"52",x"3F",x"D5",x"52",x"3F", -- 0x0680 + x"D5",x"52",x"3F",x"78",x"53",x"42",x"4F",x"4E", -- 0x0688 + x"55",x"53",x"40",x"42",x"45",x"45",x"54",x"4C", -- 0x0690 + x"45",x"40",x"40",x"3F",x"58",x"51",x"30",x"30", -- 0x0698 + x"30",x"40",x"50",x"54",x"53",x"3F",x"D4",x"52", -- 0x06A0 + x"4F",x"4E",x"45",x"40",x"50",x"4C",x"41",x"59", -- 0x06A8 + x"45",x"52",x"40",x"4F",x"4E",x"4C",x"59",x"3F", -- 0x06B0 + x"F4",x"52",x"4F",x"4E",x"45",x"40",x"4F",x"52", -- 0x06B8 + x"40",x"54",x"57",x"4F",x"40",x"50",x"4C",x"41", -- 0x06C0 + x"59",x"45",x"52",x"53",x"3F",x"4D",x"53",x"5B", -- 0x06C8 + x"40",x"53",x"43",x"4F",x"52",x"45",x"40",x"52", -- 0x06D0 + x"41",x"4E",x"4B",x"49",x"4E",x"47",x"40",x"54", -- 0x06D8 + x"41",x"42",x"4C",x"45",x"40",x"5B",x"3F",x"F0", -- 0x06E0 + x"52",x"31",x"53",x"54",x"40",x"40",x"40",x"40", -- 0x06E8 + x"40",x"40",x"40",x"40",x"40",x"40",x"50",x"54", -- 0x06F0 + x"53",x"3F",x"F2",x"52",x"32",x"4E",x"44",x"40", -- 0x06F8 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x0700 + x"40",x"50",x"54",x"53",x"3F",x"F4",x"52",x"33", -- 0x0708 + x"52",x"44",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x0710 + x"40",x"40",x"40",x"40",x"50",x"54",x"53",x"3F", -- 0x0718 + x"F6",x"52",x"34",x"54",x"48",x"40",x"40",x"40", -- 0x0720 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"50", -- 0x0728 + x"54",x"53",x"3F",x"F8",x"52",x"35",x"54",x"48", -- 0x0730 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x0738 + x"40",x"40",x"50",x"54",x"53",x"3F",x"8F",x"52", -- 0x0740 + x"31",x"53",x"54",x"40",x"40",x"41",x"54",x"54", -- 0x0748 + x"41",x"43",x"4B",x"3F",x"8F",x"52",x"32",x"4E", -- 0x0750 + x"44",x"40",x"40",x"41",x"54",x"54",x"41",x"43", -- 0x0758 + x"4B",x"3F",x"8F",x"52",x"33",x"52",x"44",x"40", -- 0x0760 + x"40",x"41",x"54",x"54",x"41",x"43",x"4B",x"3F", -- 0x0768 + x"8F",x"52",x"34",x"54",x"48",x"40",x"40",x"41", -- 0x0770 + x"54",x"54",x"41",x"43",x"4B",x"3F",x"8F",x"52", -- 0x0778 + x"4E",x"45",x"58",x"54",x"40",x"41",x"54",x"54", -- 0x0780 + x"41",x"43",x"4B",x"3F",x"AF",x"52",x"4C",x"41", -- 0x0788 + x"53",x"54",x"40",x"41",x"54",x"54",x"41",x"43", -- 0x0790 + x"4B",x"40",x"3F",x"4F",x"53",x"43",x"48",x"41", -- 0x0798 + x"4C",x"4C",x"45",x"4E",x"47",x"45",x"40",x"4E", -- 0x07A0 + x"45",x"58",x"54",x"40",x"50",x"41",x"54",x"54", -- 0x07A8 + x"45",x"52",x"4E",x"40",x"3F",x"2D",x"52",x"47", -- 0x07B0 + x"4F",x"4F",x"44",x"3F",x"A7",x"CA",x"CB",x"07", -- 0x07B8 + x"3D",x"CA",x"EE",x"07",x"3D",x"CA",x"49",x"08", -- 0x07C0 + x"C3",x"2C",x"08",x"21",x"9F",x"53",x"11",x"E0", -- 0x07C8 + x"FF",x"3A",x"10",x"41",x"FE",x"15",x"38",x"02", -- 0x07D0 + x"3E",x"14",x"47",x"A7",x"28",x"06",x"36",x"CE", -- 0x07D8 + x"19",x"3D",x"20",x"F7",x"3E",x"15",x"90",x"47", -- 0x07E0 + x"36",x"10",x"19",x"10",x"FB",x"C9",x"3E",x"05", -- 0x07E8 + x"CD",x"B1",x"04",x"3A",x"02",x"40",x"FE",x"63", -- 0x07F0 + x"38",x"02",x"3E",x"63",x"CD",x"12",x"08",x"47", -- 0x07F8 + x"E6",x"F0",x"28",x"07",x"0F",x"0F",x"0F",x"0F", -- 0x0800 + x"32",x"9F",x"52",x"78",x"E6",x"0F",x"32",x"7F", -- 0x0808 + x"52",x"C9",x"47",x"E6",x"0F",x"C6",x"00",x"27", -- 0x0810 + x"4F",x"78",x"E6",x"F0",x"28",x"0B",x"0F",x"0F", -- 0x0818 + x"0F",x"0F",x"47",x"AF",x"C6",x"16",x"27",x"10", -- 0x0820 + x"FB",x"81",x"27",x"C9",x"3A",x"1D",x"41",x"47", -- 0x0828 + x"4F",x"21",x"7F",x"50",x"11",x"20",x"00",x"A7", -- 0x0830 + x"28",x"05",x"36",x"CC",x"19",x"10",x"FB",x"3E", -- 0x0838 + x"06",x"91",x"47",x"36",x"10",x"19",x"10",x"FB", -- 0x0840 + x"C9",x"DD",x"21",x"CE",x"43",x"FD",x"21",x"38", -- 0x0848 + x"52",x"0E",x"05",x"06",x"03",x"11",x"E0",x"FF", -- 0x0850 + x"26",x"04",x"DD",x"7E",x"00",x"0F",x"0F",x"0F", -- 0x0858 + x"0F",x"CD",x"77",x"08",x"DD",x"7E",x"00",x"CD", -- 0x0860 + x"77",x"08",x"DD",x"2B",x"10",x"EC",x"11",x"BE", -- 0x0868 + x"00",x"FD",x"19",x"0D",x"20",x"DD",x"C9",x"E6", -- 0x0870 + x"0F",x"6F",x"7C",x"A7",x"20",x"06",x"FD",x"75", -- 0x0878 + x"00",x"FD",x"19",x"C9",x"7D",x"A7",x"20",x"04", -- 0x0880 + x"25",x"FD",x"19",x"C9",x"26",x"00",x"FD",x"75", -- 0x0888 + x"00",x"FD",x"19",x"C9",x"F5",x"C5",x"D5",x"E5", -- 0x0890 + x"DD",x"E5",x"FD",x"E5",x"AF",x"32",x"01",x"70", -- 0x0898 + x"21",x"20",x"40",x"11",x"00",x"58",x"01",x"80", -- 0x08A0 + x"00",x"ED",x"B0",x"3A",x"00",x"78",x"3A",x"15", -- 0x08A8 + x"40",x"32",x"16",x"40",x"3A",x"13",x"40",x"32", -- 0x08B0 + x"15",x"40",x"2A",x"10",x"40",x"22",x"13",x"40", -- 0x08B8 + x"21",x"12",x"40",x"3A",x"00",x"70",x"77",x"2B", -- 0x08C0 + x"3A",x"00",x"68",x"77",x"2B",x"3A",x"00",x"60", -- 0x08C8 + x"77",x"21",x"5F",x"42",x"35",x"CD",x"1A",x"09", -- 0x08D0 + x"CD",x"3D",x"09",x"CD",x"86",x"09",x"CD",x"B8", -- 0x08D8 + x"09",x"3A",x"06",x"40",x"0F",x"38",x"10",x"AF", -- 0x08E0 + x"32",x"C0",x"58",x"32",x"A0",x"58",x"32",x"B0", -- 0x08E8 + x"58",x"32",x"D0",x"58",x"32",x"E0",x"58",x"CD", -- 0x08F0 + x"CC",x"2A",x"21",x"0C",x"09",x"E5",x"3A",x"05", -- 0x08F8 + x"40",x"EF",x"FF",x"09",x"C1",x"0A",x"05",x"0F", -- 0x0900 + x"80",x"11",x"A7",x"11",x"FD",x"E1",x"DD",x"E1", -- 0x0908 + x"E1",x"D1",x"C1",x"3E",x"01",x"32",x"01",x"70", -- 0x0910 + x"F1",x"C9",x"21",x"10",x"40",x"7E",x"23",x"23", -- 0x0918 + x"23",x"B6",x"23",x"23",x"2F",x"A6",x"23",x"A6", -- 0x0920 + x"E6",x"03",x"C8",x"CB",x"47",x"C4",x"38",x"09", -- 0x0928 + x"CB",x"4F",x"C8",x"21",x"81",x"58",x"34",x"C9", -- 0x0930 + x"21",x"85",x"58",x"34",x"C9",x"21",x"84",x"58", -- 0x0938 + x"7E",x"A7",x"20",x"3A",x"23",x"B6",x"C8",x"35", -- 0x0940 + x"2B",x"36",x"0F",x"3A",x"00",x"40",x"CB",x"47", -- 0x0948 + x"28",x"1C",x"21",x"02",x"40",x"7E",x"FE",x"63", -- 0x0950 + x"C8",x"30",x"10",x"34",x"21",x"90",x"58",x"CB", -- 0x0958 + x"CE",x"3A",x"06",x"40",x"0F",x"D8",x"11",x"01", -- 0x0960 + x"07",x"FF",x"C9",x"36",x"63",x"C9",x"21",x"01", -- 0x0968 + x"40",x"CB",x"46",x"28",x"06",x"36",x"00",x"23", -- 0x0970 + x"C3",x"55",x"09",x"36",x"01",x"C9",x"0F",x"0F", -- 0x0978 + x"0F",x"32",x"03",x"60",x"35",x"C9",x"21",x"80", -- 0x0980 + x"58",x"7E",x"A7",x"20",x"6A",x"23",x"B6",x"C8", -- 0x0988 + x"35",x"2B",x"36",x"0F",x"21",x"02",x"40",x"34", -- 0x0990 + x"34",x"34",x"3A",x"00",x"40",x"CB",x"4F",x"20", -- 0x0998 + x"02",x"34",x"34",x"7E",x"FE",x"63",x"C8",x"30", -- 0x09A0 + x"4B",x"21",x"90",x"58",x"CB",x"CE",x"3A",x"06", -- 0x09A8 + x"40",x"0F",x"D8",x"11",x"01",x"07",x"FF",x"C9", -- 0x09B0 + x"21",x"03",x"40",x"5E",x"16",x"06",x"1A",x"1C", -- 0x09B8 + x"73",x"23",x"86",x"3D",x"77",x"3A",x"B0",x"40", -- 0x09C0 + x"0F",x"D0",x"2A",x"B1",x"40",x"7E",x"E6",x"07", -- 0x09C8 + x"20",x"1B",x"EB",x"2A",x"B3",x"40",x"7E",x"FE", -- 0x09D0 + x"3F",x"28",x"11",x"23",x"22",x"B3",x"40",x"D6", -- 0x09D8 + x"30",x"2A",x"B5",x"40",x"77",x"01",x"E0",x"FF", -- 0x09E0 + x"09",x"22",x"B5",x"40",x"EB",x"35",x"C0",x"AF", -- 0x09E8 + x"32",x"B0",x"40",x"C9",x"36",x"63",x"C9",x"0F", -- 0x09F0 + x"0F",x"0F",x"32",x"04",x"68",x"35",x"C9",x"2A", -- 0x09F8 + x"0B",x"40",x"06",x"20",x"3E",x"10",x"D7",x"22", -- 0x0A00 + x"0B",x"40",x"21",x"08",x"40",x"35",x"C0",x"2D", -- 0x0A08 + x"2D",x"36",x"00",x"2D",x"36",x"01",x"AF",x"32", -- 0x0A10 + x"0A",x"40",x"21",x"41",x"0A",x"CD",x"30",x"0A", -- 0x0A18 + x"11",x"04",x"06",x"FF",x"11",x"00",x"05",x"FF", -- 0x0A20 + x"1E",x"02",x"FF",x"AF",x"32",x"80",x"42",x"C9", -- 0x0A28 + x"11",x"21",x"40",x"06",x"20",x"7E",x"12",x"23", -- 0x0A30 + x"1C",x"EB",x"36",x"00",x"EB",x"1C",x"10",x"F5", -- 0x0A38 + x"C9",x"00",x"05",x"00",x"00",x"00",x"01",x"06", -- 0x0A40 + x"00",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x0A48 + x"00",x"00",x"00",x"00",x"05",x"05",x"05",x"05", -- 0x0A50 + x"05",x"06",x"06",x"06",x"06",x"06",x"06",x"06", -- 0x0A58 + x"06",x"00",x"05",x"00",x"00",x"01",x"01",x"06", -- 0x0A60 + x"03",x"03",x"04",x"04",x"04",x"04",x"00",x"00", -- 0x0A68 + x"00",x"06",x"06",x"06",x"00",x"00",x"00",x"05", -- 0x0A70 + x"06",x"06",x"06",x"06",x"06",x"06",x"06",x"06", -- 0x0A78 + x"06",x"00",x"05",x"02",x"02",x"02",x"02",x"06", -- 0x0A80 + x"02",x"00",x"00",x"02",x"01",x"01",x"01",x"01", -- 0x0A88 + x"05",x"06",x"06",x"06",x"06",x"06",x"06",x"06", -- 0x0A90 + x"06",x"06",x"06",x"06",x"06",x"00",x"06",x"06", -- 0x0A98 + x"06",x"00",x"05",x"00",x"00",x"00",x"00",x"06", -- 0x0AA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AA8 + x"00",x"05",x"05",x"02",x"02",x"06",x"06",x"07", -- 0x0AB0 + x"07",x"04",x"04",x"00",x"00",x"00",x"06",x"06", -- 0x0AB8 + x"06",x"21",x"E9",x"0E",x"E5",x"3A",x"80",x"42", -- 0x0AC0 + x"EF",x"E9",x"0A",x"34",x"0B",x"6F",x"0B",x"90", -- 0x0AC8 + x"0B",x"C2",x"0B",x"D6",x"0B",x"F3",x"0B",x"34", -- 0x0AD0 + x"0C",x"5D",x"0C",x"5E",x"0C",x"5F",x"0C",x"79", -- 0x0AD8 + x"0C",x"F9",x"0C",x"49",x"0D",x"64",x"0D",x"65", -- 0x0AE0 + x"0D",x"AF",x"32",x"C0",x"58",x"32",x"A0",x"58", -- 0x0AE8 + x"32",x"B0",x"58",x"32",x"D0",x"58",x"32",x"E0", -- 0x0AF0 + x"58",x"21",x"20",x"40",x"11",x"21",x"40",x"01", -- 0x0AF8 + x"7F",x"00",x"36",x"00",x"ED",x"B0",x"21",x"00", -- 0x0B00 + x"41",x"11",x"01",x"41",x"01",x"FF",x"01",x"36", -- 0x0B08 + x"00",x"ED",x"B0",x"21",x"A0",x"42",x"11",x"A1", -- 0x0B10 + x"42",x"01",x"FF",x"00",x"36",x"00",x"ED",x"B0", -- 0x0B18 + x"21",x"02",x"50",x"22",x"0B",x"40",x"21",x"09", -- 0x0B20 + x"40",x"36",x"20",x"21",x"80",x"42",x"34",x"AF", -- 0x0B28 + x"32",x"06",x"40",x"C9",x"2A",x"0B",x"40",x"06", -- 0x0B30 + x"1E",x"3E",x"10",x"D7",x"11",x"02",x"00",x"19", -- 0x0B38 + x"22",x"0B",x"40",x"21",x"09",x"40",x"35",x"C0", -- 0x0B40 + x"21",x"81",x"0A",x"CD",x"30",x"0A",x"3E",x"01", -- 0x0B48 + x"32",x"06",x"70",x"32",x"07",x"70",x"21",x"80", -- 0x0B50 + x"42",x"34",x"2C",x"36",x"01",x"2C",x"36",x"0B", -- 0x0B58 + x"2C",x"36",x"1E",x"11",x"01",x"07",x"FF",x"11", -- 0x0B60 + x"11",x"06",x"FF",x"1E",x"07",x"FF",x"C9",x"21", -- 0x0B68 + x"83",x"42",x"35",x"C0",x"36",x"1E",x"2D",x"5E", -- 0x0B70 + x"34",x"16",x"06",x"FF",x"7B",x"FE",x"0E",x"C0", -- 0x0B78 + x"2D",x"2D",x"34",x"21",x"1C",x"0C",x"22",x"84", -- 0x0B80 + x"42",x"21",x"60",x"40",x"22",x"86",x"42",x"C9", -- 0x0B88 + x"21",x"83",x"42",x"35",x"C0",x"36",x"1E",x"2D", -- 0x0B90 + x"5E",x"34",x"16",x"06",x"FF",x"2A",x"84",x"42", -- 0x0B98 + x"ED",x"5B",x"86",x"42",x"01",x"08",x"00",x"ED", -- 0x0BA0 + x"B0",x"22",x"84",x"42",x"ED",x"53",x"86",x"42", -- 0x0BA8 + x"3A",x"82",x"42",x"FE",x"12",x"C0",x"21",x"80", -- 0x0BB0 + x"42",x"34",x"2C",x"2C",x"36",x"0C",x"2C",x"36", -- 0x0BB8 + x"1E",x"C9",x"21",x"83",x"42",x"35",x"C0",x"36", -- 0x0BC0 + x"0F",x"11",x"0E",x"06",x"FF",x"1C",x"FF",x"1C", -- 0x0BC8 + x"FF",x"2D",x"2D",x"2D",x"34",x"C9",x"21",x"83", -- 0x0BD0 + x"42",x"35",x"C0",x"36",x"0F",x"11",x"8E",x"06", -- 0x0BD8 + x"FF",x"1C",x"FF",x"1C",x"FF",x"2D",x"35",x"28", -- 0x0BE0 + x"04",x"2D",x"2D",x"35",x"C9",x"36",x"14",x"2D", -- 0x0BE8 + x"2D",x"34",x"C9",x"21",x"82",x"42",x"35",x"C0", -- 0x0BF0 + x"36",x"96",x"11",x"8D",x"06",x"FF",x"21",x"60", -- 0x0BF8 + x"40",x"11",x"61",x"40",x"01",x"1F",x"00",x"36", -- 0x0C00 + x"00",x"ED",x"B0",x"3A",x"00",x"40",x"C6",x"12", -- 0x0C08 + x"5F",x"16",x"06",x"FF",x"1E",x"06",x"FF",x"21", -- 0x0C10 + x"80",x"42",x"34",x"C9",x"34",x"EB",x"07",x"8B", -- 0x0C18 + x"8B",x"22",x"07",x"8B",x"34",x"EB",x"03",x"A3", -- 0x0C20 + x"8B",x"22",x"03",x"A3",x"34",x"EB",x"01",x"BB", -- 0x0C28 + x"8B",x"22",x"01",x"BB",x"21",x"82",x"42",x"35", -- 0x0C30 + x"C0",x"21",x"A1",x"0A",x"CD",x"30",x"0A",x"11", -- 0x0C38 + x"92",x"06",x"FF",x"1E",x"86",x"FF",x"1E",x"1A", -- 0x0C40 + x"06",x"06",x"FF",x"1C",x"10",x"FC",x"11",x"02", -- 0x0C48 + x"07",x"FF",x"21",x"80",x"42",x"34",x"34",x"34", -- 0x0C50 + x"2C",x"2C",x"36",x"DC",x"C9",x"C9",x"C9",x"3A", -- 0x0C58 + x"5F",x"42",x"0F",x"D8",x"21",x"82",x"42",x"35", -- 0x0C60 + x"C0",x"3E",x"20",x"32",x"09",x"40",x"21",x"02", -- 0x0C68 + x"50",x"22",x"0B",x"40",x"21",x"80",x"42",x"34", -- 0x0C70 + x"C9",x"2A",x"0B",x"40",x"06",x"1D",x"3E",x"10", -- 0x0C78 + x"D7",x"11",x"03",x"00",x"19",x"22",x"0B",x"40", -- 0x0C80 + x"21",x"09",x"40",x"35",x"C0",x"21",x"41",x"0A", -- 0x0C88 + x"CD",x"30",x"0A",x"21",x"E8",x"0C",x"22",x"07", -- 0x0C90 + x"42",x"AF",x"32",x"5F",x"42",x"3E",x"01",x"32", -- 0x0C98 + x"06",x"70",x"32",x"07",x"70",x"AF",x"32",x"0D", -- 0x0CA0 + x"40",x"21",x"92",x"10",x"11",x"00",x"41",x"01", -- 0x0CA8 + x"E0",x"00",x"ED",x"B0",x"21",x"66",x"0D",x"11", -- 0x0CB0 + x"50",x"41",x"01",x"90",x"00",x"ED",x"B0",x"3E", -- 0x0CB8 + x"01",x"32",x"00",x"41",x"3E",x"0B",x"32",x"1A", -- 0x0CC0 + x"41",x"21",x"01",x"00",x"22",x"00",x"42",x"3E", -- 0x0CC8 + x"18",x"32",x"02",x"42",x"3E",x"67",x"32",x"52", -- 0x0CD0 + x"40",x"32",x"54",x"40",x"11",x"00",x"02",x"FF", -- 0x0CD8 + x"21",x"80",x"42",x"34",x"2C",x"36",x"00",x"C9", -- 0x0CE0 + x"08",x"08",x"08",x"08",x"08",x"08",x"08",x"08", -- 0x0CE8 + x"08",x"08",x"08",x"08",x"08",x"08",x"08",x"08", -- 0x0CF0 + x"FF",x"CD",x"1C",x"15",x"CD",x"85",x"1C",x"CD", -- 0x0CF8 + x"AB",x"1C",x"CD",x"7B",x"18",x"CD",x"8E",x"18", -- 0x0D00 + x"3A",x"16",x"41",x"A7",x"CC",x"E0",x"1C",x"CD", -- 0x0D08 + x"1F",x"18",x"CD",x"13",x"19",x"CD",x"6D",x"0E", -- 0x0D10 + x"CD",x"65",x"1A",x"3A",x"8B",x"42",x"A7",x"CC", -- 0x0D18 + x"E0",x"1B",x"CD",x"41",x"1B",x"3A",x"1A",x"41", -- 0x0D20 + x"A7",x"28",x"07",x"3A",x"11",x"41",x"A7",x"28", -- 0x0D28 + x"01",x"C9",x"21",x"80",x"42",x"34",x"2C",x"2C", -- 0x0D30 + x"36",x"B4",x"AF",x"32",x"90",x"42",x"CD",x"00", -- 0x0D38 + x"12",x"11",x"00",x"06",x"FF",x"1E",x"02",x"FF", -- 0x0D40 + x"C9",x"CD",x"AB",x"1C",x"CD",x"7B",x"18",x"CD", -- 0x0D48 + x"8E",x"18",x"CD",x"C1",x"15",x"3A",x"5F",x"42", -- 0x0D50 + x"0F",x"D8",x"21",x"82",x"42",x"35",x"C0",x"2D", -- 0x0D58 + x"2D",x"36",x"00",x"C9",x"C9",x"C9",x"03",x"03", -- 0x0D60 + x"03",x"03",x"01",x"01",x"03",x"03",x"03",x"03", -- 0x0D68 + x"01",x"01",x"00",x"00",x"00",x"00",x"01",x"01", -- 0x0D70 + x"00",x"00",x"00",x"03",x"01",x"00",x"00",x"00", -- 0x0D78 + x"03",x"03",x"00",x"00",x"00",x"03",x"03",x"00", -- 0x0D80 + x"00",x"00",x"03",x"03",x"03",x"03",x"01",x"01", -- 0x0D88 + x"03",x"03",x"03",x"03",x"01",x"01",x"03",x"03", -- 0x0D90 + x"00",x"00",x"03",x"03",x"03",x"03",x"00",x"00", -- 0x0D98 + x"03",x"03",x"03",x"03",x"00",x"00",x"03",x"03", -- 0x0DA0 + x"03",x"03",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0DA8 + x"03",x"03",x"03",x"03",x"03",x"03",x"00",x"00", -- 0x0DB0 + x"03",x"03",x"03",x"03",x"00",x"00",x"03",x"03", -- 0x0DB8 + x"03",x"03",x"00",x"00",x"03",x"03",x"03",x"00", -- 0x0DC0 + x"00",x"00",x"00",x"00",x"03",x"00",x"03",x"03", -- 0x0DC8 + x"00",x"00",x"03",x"00",x"03",x"03",x"00",x"00", -- 0x0DD0 + x"03",x"00",x"03",x"03",x"00",x"00",x"03",x"00", -- 0x0DD8 + x"03",x"03",x"00",x"00",x"03",x"00",x"03",x"03", -- 0x0DE0 + x"00",x"00",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0DE8 + x"03",x"03",x"03",x"03",x"03",x"03",x"3A",x"16", -- 0x0DF0 + x"41",x"A7",x"C8",x"3A",x"88",x"42",x"EF",x"05", -- 0x0DF8 + x"0E",x"1B",x"0E",x"3E",x"0E",x"ED",x"5F",x"0F", -- 0x0E00 + x"3E",x"68",x"38",x"02",x"3E",x"B8",x"21",x"88", -- 0x0E08 + x"42",x"34",x"2C",x"77",x"2C",x"36",x"28",x"2C", -- 0x0E10 + x"36",x"01",x"C9",x"21",x"02",x"42",x"3A",x"89", -- 0x0E18 + x"42",x"BE",x"28",x"11",x"38",x"03",x"34",x"18", -- 0x0E20 + x"01",x"35",x"7E",x"2F",x"C6",x"80",x"32",x"58", -- 0x0E28 + x"40",x"32",x"5A",x"40",x"C9",x"21",x"88",x"42", -- 0x0E30 + x"34",x"AF",x"32",x"8B",x"42",x"C9",x"21",x"64", -- 0x0E38 + x"42",x"CB",x"46",x"C8",x"2C",x"3A",x"02",x"42", -- 0x0E40 + x"C6",x"08",x"96",x"D8",x"FE",x"10",x"D0",x"2C", -- 0x0E48 + x"2C",x"7E",x"FE",x"B8",x"D8",x"21",x"02",x"42", -- 0x0E50 + x"35",x"7E",x"2F",x"C6",x"80",x"32",x"58",x"40", -- 0x0E58 + x"32",x"5A",x"40",x"21",x"8A",x"42",x"35",x"C0", -- 0x0E60 + x"2D",x"2D",x"36",x"00",x"C9",x"3A",x"7C",x"42", -- 0x0E68 + x"0F",x"D8",x"DD",x"21",x"A0",x"42",x"11",x"20", -- 0x0E70 + x"00",x"06",x"08",x"D9",x"CD",x"85",x"0E",x"D9", -- 0x0E78 + x"DD",x"19",x"10",x"F7",x"C9",x"DD",x"CB",x"00", -- 0x0E80 + x"46",x"C8",x"DD",x"CB",x"08",x"46",x"C8",x"DD", -- 0x0E88 + x"CB",x"09",x"46",x"C0",x"DD",x"7E",x"0B",x"FE", -- 0x0E90 + x"80",x"D0",x"DD",x"7E",x"03",x"FE",x"60",x"D8", -- 0x0E98 + x"FE",x"C0",x"D0",x"DD",x"4E",x"06",x"DD",x"46", -- 0x0EA0 + x"08",x"3A",x"02",x"42",x"05",x"28",x"09",x"B9", -- 0x0EA8 + x"D8",x"4F",x"DD",x"7E",x"04",x"91",x"18",x"05", -- 0x0EB0 + x"B9",x"D0",x"DD",x"96",x"04",x"D8",x"47",x"3E", -- 0x0EB8 + x"E0",x"DD",x"96",x"03",x"DD",x"CB",x"19",x"46", -- 0x0EC0 + x"20",x"13",x"DD",x"4E",x"16",x"0D",x"28",x"0D", -- 0x0EC8 + x"0F",x"0F",x"0F",x"E6",x"1F",x"B8",x"C0",x"3E", -- 0x0ED0 + x"01",x"32",x"7C",x"42",x"C9",x"0F",x"0F",x"E6", -- 0x0ED8 + x"3F",x"B8",x"C0",x"3E",x"01",x"32",x"7C",x"42", -- 0x0EE0 + x"C9",x"3A",x"02",x"40",x"A7",x"C8",x"21",x"05", -- 0x0EE8 + x"40",x"34",x"AF",x"32",x"0A",x"40",x"32",x"81", -- 0x0EF0 + x"42",x"21",x"96",x"10",x"11",x"04",x"41",x"01", -- 0x0EF8 + x"0C",x"00",x"ED",x"B0",x"C9",x"21",x"E8",x"0F", -- 0x0F00 + x"E5",x"3A",x"0A",x"40",x"EF",x"13",x"0F",x"49", -- 0x0F08 + x"0F",x"DA",x"0F",x"AF",x"32",x"00",x"41",x"11", -- 0x0F10 + x"00",x"01",x"FF",x"21",x"61",x"0A",x"CD",x"30", -- 0x0F18 + x"0A",x"21",x"60",x"40",x"06",x"40",x"AF",x"D7", -- 0x0F20 + x"21",x"60",x"42",x"D7",x"06",x"40",x"D7",x"21", -- 0x0F28 + x"20",x"41",x"06",x"C0",x"D7",x"32",x"B0",x"40", -- 0x0F30 + x"32",x"06",x"40",x"21",x"02",x"50",x"22",x"0B", -- 0x0F38 + x"40",x"21",x"09",x"40",x"36",x"10",x"2C",x"34", -- 0x0F40 + x"C9",x"2A",x"0B",x"40",x"06",x"1D",x"3E",x"10", -- 0x0F48 + x"D7",x"11",x"03",x"00",x"19",x"06",x"1D",x"D7", -- 0x0F50 + x"19",x"22",x"0B",x"40",x"21",x"09",x"40",x"35", -- 0x0F58 + x"C0",x"2C",x"34",x"3E",x"01",x"32",x"06",x"70", -- 0x0F60 + x"32",x"07",x"70",x"AF",x"32",x"0D",x"40",x"11", -- 0x0F68 + x"01",x"07",x"FF",x"11",x"01",x"06",x"FF",x"1E", -- 0x0F70 + x"16",x"FF",x"1C",x"FF",x"3A",x"17",x"40",x"47", -- 0x0F78 + x"E6",x"0F",x"32",x"78",x"51",x"78",x"E6",x"F0", -- 0x0F80 + x"C8",x"0F",x"0F",x"0F",x"0F",x"32",x"98",x"51", -- 0x0F88 + x"C9",x"3A",x"00",x"42",x"0F",x"D0",x"DD",x"21", -- 0x0F90 + x"A0",x"42",x"11",x"20",x"00",x"06",x"08",x"D9", -- 0x0F98 + x"CD",x"A9",x"0F",x"D9",x"DD",x"19",x"10",x"F7", -- 0x0FA0 + x"C9",x"DD",x"CB",x"00",x"46",x"C8",x"DD",x"7E", -- 0x0FA8 + x"03",x"C6",x"39",x"D6",x"05",x"38",x"10",x"D6", -- 0x0FB0 + x"0C",x"D0",x"3A",x"02",x"42",x"DD",x"96",x"04", -- 0x0FB8 + x"C6",x"0A",x"FE",x"15",x"D0",x"18",x"0B",x"3A", -- 0x0FC0 + x"02",x"42",x"DD",x"96",x"04",x"C6",x"07",x"FE", -- 0x0FC8 + x"0F",x"D0",x"3E",x"01",x"32",x"04",x"42",x"C3", -- 0x0FD0 + x"9C",x"1A",x"3A",x"02",x"40",x"A7",x"C8",x"3D", -- 0x0FD8 + x"11",x"18",x"06",x"28",x"01",x"1C",x"FF",x"C9", -- 0x0FE0 + x"3A",x"11",x"40",x"CB",x"47",x"C2",x"7C",x"10", -- 0x0FE8 + x"CB",x"4F",x"C8",x"3A",x"02",x"40",x"FE",x"02", -- 0x0FF0 + x"D8",x"D6",x"02",x"32",x"02",x"40",x"21",x"00", -- 0x0FF8 + x"01",x"22",x"0D",x"40",x"AF",x"32",x"0A",x"40", -- 0x1000 + x"3E",x"03",x"32",x"05",x"40",x"3E",x"01",x"32", -- 0x1008 + x"06",x"40",x"11",x"04",x"06",x"FF",x"21",x"92", -- 0x1010 + x"10",x"11",x"00",x"41",x"01",x"E0",x"00",x"ED", -- 0x1018 + x"B0",x"21",x"92",x"10",x"11",x"E0",x"41",x"01", -- 0x1020 + x"20",x"00",x"ED",x"B0",x"DD",x"21",x"20",x"41", -- 0x1028 + x"21",x"10",x"42",x"0E",x"30",x"06",x"04",x"CB", -- 0x1030 + x"26",x"CB",x"26",x"DD",x"CB",x"00",x"46",x"28", -- 0x1038 + x"02",x"CB",x"C6",x"DD",x"CB",x"00",x"4E",x"28", -- 0x1040 + x"02",x"CB",x"CE",x"DD",x"23",x"10",x"E8",x"23", -- 0x1048 + x"0D",x"20",x"E2",x"3E",x"01",x"32",x"00",x"41", -- 0x1050 + x"32",x"E0",x"41",x"3A",x"07",x"40",x"32",x"1D", -- 0x1058 + x"41",x"32",x"FD",x"41",x"AF",x"32",x"52",x"40", -- 0x1060 + x"32",x"54",x"40",x"21",x"A0",x"58",x"CB",x"C6", -- 0x1068 + x"11",x"00",x"04",x"FF",x"3A",x"0E",x"40",x"0F", -- 0x1070 + x"D0",x"1C",x"FF",x"C9",x"3A",x"02",x"40",x"A7", -- 0x1078 + x"28",x"0A",x"3D",x"32",x"02",x"40",x"21",x"00", -- 0x1080 + x"00",x"C3",x"01",x"10",x"3E",x"01",x"32",x"05", -- 0x1088 + x"40",x"C9",x"00",x"80",x"00",x"06",x"6C",x"64", -- 0x1090 + x"64",x"64",x"64",x"65",x"30",x"31",x"32",x"33", -- 0x1098 + x"34",x"35",x"00",x"2E",x"00",x"00",x"00",x"00", -- 0x10A0 + x"00",x"1C",x"20",x"24",x"60",x"30",x"00",x"03", -- 0x10A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x10B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x10B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x10C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x10C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x10D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x10D8 + x"00",x"00",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x10E0 + x"01",x"01",x"01",x"01",x"01",x"01",x"00",x"00", -- 0x10E8 + x"00",x"00",x"01",x"01",x"00",x"00",x"00",x"01", -- 0x10F0 + x"01",x"00",x"00",x"00",x"01",x"01",x"00",x"00", -- 0x10F8 + x"00",x"01",x"01",x"00",x"00",x"00",x"01",x"01", -- 0x1100 + x"01",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x1108 + x"01",x"01",x"01",x"01",x"00",x"00",x"01",x"01", -- 0x1110 + x"01",x"01",x"00",x"00",x"01",x"01",x"01",x"01", -- 0x1118 + x"00",x"00",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x1120 + x"01",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x1128 + x"01",x"01",x"00",x"00",x"01",x"01",x"01",x"01", -- 0x1130 + x"00",x"00",x"01",x"01",x"01",x"01",x"00",x"00", -- 0x1138 + x"01",x"01",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x1140 + x"01",x"00",x"01",x"01",x"00",x"00",x"01",x"00", -- 0x1148 + x"01",x"01",x"00",x"00",x"01",x"00",x"01",x"01", -- 0x1150 + x"00",x"00",x"01",x"00",x"01",x"01",x"00",x"00", -- 0x1158 + x"01",x"00",x"01",x"01",x"00",x"00",x"01",x"01", -- 0x1160 + x"01",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x1168 + x"01",x"01",x"21",x"09",x"40",x"35",x"C0",x"36", -- 0x1170 + x"00",x"11",x"60",x"06",x"FF",x"2C",x"34",x"C9", -- 0x1178 + x"CD",x"85",x"1C",x"CD",x"AB",x"1C",x"CD",x"7B", -- 0x1180 + x"18",x"CD",x"8E",x"18",x"CD",x"1C",x"15",x"3A", -- 0x1188 + x"0A",x"40",x"EF",x"CE",x"11",x"0F",x"12",x"28", -- 0x1190 + x"12",x"A6",x"12",x"B7",x"12",x"F1",x"12",x"A0", -- 0x1198 + x"13",x"D1",x"13",x"6C",x"15",x"AB",x"15",x"CD", -- 0x11A0 + x"85",x"1C",x"CD",x"AB",x"1C",x"CD",x"7B",x"18", -- 0x11A8 + x"CD",x"8E",x"18",x"CD",x"1C",x"15",x"3A",x"0A", -- 0x11B0 + x"40",x"EF",x"CE",x"11",x"0F",x"12",x"69",x"12", -- 0x11B8 + x"A6",x"12",x"B7",x"12",x"F1",x"12",x"13",x"14", -- 0x11C0 + x"35",x"14",x"6C",x"15",x"AB",x"15",x"AF",x"32", -- 0x11C8 + x"B0",x"58",x"32",x"D0",x"58",x"32",x"E0",x"58", -- 0x11D0 + x"AF",x"32",x"81",x"42",x"21",x"00",x"42",x"06", -- 0x11D8 + x"10",x"D7",x"21",x"60",x"42",x"D7",x"06",x"40", -- 0x11E0 + x"D7",x"CD",x"00",x"12",x"21",x"89",x"1B",x"22", -- 0x11E8 + x"07",x"42",x"21",x"0A",x"40",x"34",x"2D",x"36", -- 0x11F0 + x"20",x"21",x"00",x"50",x"22",x"0B",x"40",x"C9", -- 0x11F8 + x"21",x"60",x"40",x"06",x"40",x"AF",x"D7",x"AF", -- 0x1200 + x"32",x"52",x"40",x"32",x"54",x"40",x"C9",x"2A", -- 0x1208 + x"0B",x"40",x"06",x"20",x"3E",x"10",x"D7",x"22", -- 0x1210 + x"0B",x"40",x"21",x"09",x"40",x"35",x"C0",x"2C", -- 0x1218 + x"34",x"21",x"41",x"0A",x"CD",x"30",x"0A",x"C9", -- 0x1220 + x"AF",x"32",x"5F",x"42",x"3E",x"01",x"32",x"06", -- 0x1228 + x"70",x"32",x"07",x"70",x"AF",x"32",x"0D",x"40", -- 0x1230 + x"21",x"0A",x"40",x"34",x"2D",x"36",x"00",x"3A", -- 0x1238 + x"0E",x"40",x"0F",x"38",x"1E",x"11",x"00",x"05", -- 0x1240 + x"FF",x"1E",x"02",x"FF",x"14",x"FF",x"1E",x"04", -- 0x1248 + x"FF",x"3A",x"14",x"41",x"A7",x"C2",x"5B",x"12", -- 0x1250 + x"1E",x"60",x"FF",x"11",x"03",x"07",x"FF",x"1E", -- 0x1258 + x"00",x"FF",x"C9",x"11",x"01",x"05",x"FF",x"18", -- 0x1260 + x"DC",x"AF",x"32",x"5F",x"42",x"3A",x"0F",x"40", -- 0x1268 + x"0F",x"30",x"07",x"AF",x"32",x"06",x"70",x"32", -- 0x1270 + x"07",x"70",x"3E",x"01",x"32",x"0D",x"40",x"21", -- 0x1278 + x"0A",x"40",x"34",x"2D",x"36",x"00",x"11",x"00", -- 0x1280 + x"05",x"FF",x"1C",x"FF",x"1C",x"FF",x"11",x"03", -- 0x1288 + x"06",x"FF",x"1C",x"FF",x"3A",x"14",x"41",x"A7", -- 0x1290 + x"C2",x"9E",x"12",x"1E",x"60",x"FF",x"11",x"03", -- 0x1298 + x"07",x"FF",x"1E",x"00",x"FF",x"C9",x"21",x"09", -- 0x12A0 + x"40",x"35",x"C0",x"36",x"14",x"2C",x"34",x"11", -- 0x12A8 + x"82",x"06",x"FF",x"1E",x"A0",x"FF",x"C9",x"21", -- 0x12B0 + x"09",x"40",x"35",x"C0",x"36",x"0A",x"2C",x"34", -- 0x12B8 + x"21",x"60",x"42",x"06",x"20",x"AF",x"D7",x"21", -- 0x12C0 + x"01",x"00",x"22",x"00",x"42",x"3E",x"18",x"32", -- 0x12C8 + x"02",x"42",x"AF",x"32",x"52",x"40",x"32",x"54", -- 0x12D0 + x"40",x"3A",x"07",x"40",x"A7",x"20",x"05",x"3E", -- 0x12D8 + x"02",x"32",x"1D",x"41",x"21",x"1D",x"41",x"35", -- 0x12E0 + x"11",x"03",x"07",x"FF",x"11",x"00",x"02",x"FF", -- 0x12E8 + x"C9",x"CD",x"4D",x"13",x"CD",x"76",x"17",x"CD", -- 0x12F0 + x"54",x"15",x"CD",x"AF",x"17",x"CD",x"C5",x"17", -- 0x12F8 + x"CD",x"1F",x"18",x"CD",x"13",x"19",x"CD",x"91", -- 0x1300 + x"0F",x"CD",x"DC",x"18",x"CD",x"65",x"1A",x"CD", -- 0x1308 + x"0A",x"1B",x"CD",x"A2",x"1B",x"CD",x"E0",x"1B", -- 0x1310 + x"CD",x"5E",x"1C",x"CD",x"41",x"1B",x"3A",x"1A", -- 0x1318 + x"41",x"A7",x"28",x"43",x"3A",x"11",x"41",x"A7", -- 0x1320 + x"28",x"4E",x"21",x"00",x"42",x"CB",x"46",x"C0", -- 0x1328 + x"23",x"CB",x"46",x"C0",x"3A",x"7C",x"42",x"0F", -- 0x1330 + x"D8",x"3A",x"60",x"42",x"47",x"3A",x"64",x"42", -- 0x1338 + x"4F",x"3A",x"68",x"42",x"B0",x"B1",x"0F",x"D8", -- 0x1340 + x"21",x"0A",x"40",x"34",x"C9",x"21",x"A0",x"42", -- 0x1348 + x"11",x"20",x"00",x"06",x"08",x"AF",x"B6",x"19", -- 0x1350 + x"10",x"FC",x"0F",x"21",x"C0",x"58",x"CB",x"D6", -- 0x1358 + x"D8",x"21",x"C0",x"58",x"CB",x"96",x"C9",x"3A", -- 0x1360 + x"01",x"42",x"0F",x"D8",x"AF",x"32",x"1D",x"41", -- 0x1368 + x"32",x"00",x"42",x"21",x"0A",x"40",x"34",x"C9", -- 0x1370 + x"21",x"00",x"42",x"CB",x"46",x"20",x"06",x"2C", -- 0x1378 + x"CB",x"46",x"C0",x"18",x"AF",x"AF",x"21",x"60", -- 0x1380 + x"42",x"06",x"20",x"D7",x"21",x"80",x"40",x"06", -- 0x1388 + x"20",x"D7",x"21",x"B7",x"40",x"36",x"00",x"23", -- 0x1390 + x"36",x"32",x"3E",x"08",x"32",x"0A",x"40",x"C9", -- 0x1398 + x"3A",x"1D",x"41",x"A7",x"20",x"14",x"11",x"00", -- 0x13A0 + x"06",x"FF",x"1E",x"02",x"FF",x"21",x"0A",x"40", -- 0x13A8 + x"36",x"09",x"2B",x"36",x"B4",x"AF",x"32",x"90", -- 0x13B0 + x"42",x"C9",x"3A",x"0E",x"40",x"0F",x"38",x"09", -- 0x13B8 + x"21",x"0A",x"40",x"36",x"04",x"2B",x"36",x"64", -- 0x13C0 + x"C9",x"21",x"0A",x"40",x"34",x"2D",x"36",x"64", -- 0x13C8 + x"C9",x"21",x"09",x"40",x"35",x"C0",x"3A",x"1D", -- 0x13D0 + x"41",x"A7",x"20",x"0C",x"3A",x"0E",x"40",x"0F", -- 0x13D8 + x"38",x"15",x"3E",x"01",x"32",x"05",x"40",x"C9", -- 0x13E0 + x"3A",x"FD",x"41",x"A7",x"20",x"15",x"21",x"0A", -- 0x13E8 + x"40",x"36",x"04",x"2B",x"36",x"01",x"C9",x"3A", -- 0x13F0 + x"FD",x"41",x"A7",x"20",x"06",x"3E",x"01",x"32", -- 0x13F8 + x"05",x"40",x"C9",x"CD",x"6B",x"14",x"CD",x"AC", -- 0x1400 + x"14",x"AF",x"32",x"0A",x"40",x"3E",x"04",x"32", -- 0x1408 + x"05",x"40",x"C9",x"3A",x"1D",x"41",x"A7",x"20", -- 0x1410 + x"14",x"11",x"00",x"06",x"FF",x"1E",x"03",x"FF", -- 0x1418 + x"21",x"0A",x"40",x"36",x"09",x"2B",x"36",x"B4", -- 0x1420 + x"AF",x"32",x"90",x"42",x"C9",x"21",x"0A",x"40", -- 0x1428 + x"34",x"2D",x"36",x"64",x"C9",x"21",x"09",x"40", -- 0x1430 + x"35",x"C0",x"3A",x"1D",x"41",x"A7",x"20",x"0C", -- 0x1438 + x"3A",x"FD",x"41",x"A7",x"20",x"15",x"3E",x"01", -- 0x1440 + x"32",x"05",x"40",x"C9",x"3A",x"FD",x"41",x"A7", -- 0x1448 + x"20",x"09",x"21",x"0A",x"40",x"36",x"04",x"2B", -- 0x1450 + x"36",x"01",x"C9",x"CD",x"6B",x"14",x"CD",x"AC", -- 0x1458 + x"14",x"AF",x"32",x"0A",x"40",x"3E",x"03",x"32", -- 0x1460 + x"05",x"40",x"C9",x"AF",x"21",x"A0",x"42",x"11", -- 0x1468 + x"20",x"00",x"06",x"08",x"CB",x"46",x"28",x"01", -- 0x1470 + x"3C",x"19",x"10",x"F8",x"47",x"21",x"12",x"41", -- 0x1478 + x"7E",x"90",x"77",x"21",x"96",x"10",x"11",x"04", -- 0x1480 + x"41",x"01",x"0C",x"00",x"ED",x"B0",x"3A",x"12", -- 0x1488 + x"41",x"A7",x"C8",x"47",x"16",x"00",x"DD",x"21", -- 0x1490 + x"2A",x"20",x"21",x"04",x"41",x"DD",x"5E",x"00", -- 0x1498 + x"19",x"DD",x"7E",x"01",x"77",x"1E",x"05",x"DD", -- 0x14A0 + x"19",x"10",x"EF",x"C9",x"21",x"00",x"41",x"DD", -- 0x14A8 + x"21",x"E0",x"41",x"06",x"20",x"DD",x"7E",x"00", -- 0x14B0 + x"4E",x"DD",x"71",x"00",x"77",x"DD",x"23",x"23", -- 0x14B8 + x"10",x"F3",x"DD",x"21",x"20",x"41",x"FD",x"21", -- 0x14C0 + x"10",x"42",x"06",x"30",x"FD",x"4E",x"00",x"3E", -- 0x14C8 + x"03",x"A1",x"6F",x"CB",x"09",x"CB",x"09",x"3E", -- 0x14D0 + x"03",x"A1",x"67",x"CB",x"09",x"CB",x"09",x"3E", -- 0x14D8 + x"03",x"A1",x"5F",x"CB",x"09",x"CB",x"09",x"3E", -- 0x14E0 + x"03",x"A1",x"57",x"FD",x"23",x"0E",x"04",x"CB", -- 0x14E8 + x"27",x"CB",x"27",x"DD",x"CB",x"00",x"4E",x"28", -- 0x14F0 + x"02",x"CB",x"CF",x"DD",x"CB",x"00",x"46",x"28", -- 0x14F8 + x"02",x"CB",x"C7",x"DD",x"23",x"0D",x"20",x"E7", -- 0x1500 + x"DD",x"72",x"FC",x"DD",x"73",x"FD",x"DD",x"74", -- 0x1508 + x"FE",x"DD",x"75",x"FF",x"FD",x"77",x"FF",x"05", -- 0x1510 + x"C2",x"CC",x"14",x"C9",x"3A",x"00",x"42",x"0F", -- 0x1518 + x"D0",x"3A",x"5F",x"42",x"E6",x"0F",x"C0",x"3A", -- 0x1520 + x"0D",x"42",x"16",x"02",x"FE",x"58",x"28",x"09", -- 0x1528 + x"FE",x"60",x"28",x"0E",x"FE",x"54",x"28",x"13", -- 0x1530 + x"C9",x"3E",x"60",x"32",x"0D",x"42",x"1E",x"07", -- 0x1538 + x"FF",x"C9",x"3E",x"54",x"32",x"0D",x"42",x"1E", -- 0x1540 + x"08",x"FF",x"C9",x"3E",x"58",x"32",x"0D",x"42", -- 0x1548 + x"1E",x"06",x"FF",x"C9",x"3A",x"1C",x"41",x"0F", -- 0x1550 + x"D0",x"3E",x"01",x"32",x"13",x"41",x"3A",x"5F", -- 0x1558 + x"42",x"E6",x"10",x"11",x"08",x"06",x"28",x"02", -- 0x1560 + x"1E",x"88",x"FF",x"C9",x"3A",x"16",x"41",x"A7", -- 0x1568 + x"CC",x"E0",x"1C",x"3A",x"B7",x"40",x"EF",x"68", -- 0x1570 + x"26",x"BC",x"26",x"F8",x"26",x"03",x"27",x"0F", -- 0x1578 + x"27",x"2B",x"27",x"78",x"27",x"79",x"27",x"AF", -- 0x1580 + x"27",x"E0",x"27",x"0D",x"28",x"84",x"28",x"A9", -- 0x1588 + x"28",x"B7",x"28",x"D2",x"28",x"DF",x"28",x"01", -- 0x1590 + x"29",x"10",x"29",x"79",x"29",x"93",x"29",x"B6", -- 0x1598 + x"29",x"C5",x"29",x"DF",x"29",x"F1",x"29",x"0A", -- 0x15A0 + x"2A",x"53",x"2A",x"CD",x"C1",x"15",x"3A",x"5F", -- 0x15A8 + x"42",x"0F",x"D8",x"21",x"09",x"40",x"35",x"C0", -- 0x15B0 + x"36",x"0A",x"2C",x"36",x"07",x"CD",x"23",x"17", -- 0x15B8 + x"C9",x"CD",x"D2",x"15",x"3A",x"90",x"42",x"EF", -- 0x15C0 + x"0B",x"16",x"32",x"16",x"8A",x"16",x"D9",x"16", -- 0x15C8 + x"F6",x"16",x"3A",x"5F",x"42",x"E6",x"07",x"C0", -- 0x15D0 + x"21",x"9B",x"42",x"7E",x"3C",x"FE",x"06",x"20", -- 0x15D8 + x"01",x"AF",x"77",x"21",x"1D",x"17",x"4F",x"06", -- 0x15E0 + x"00",x"09",x"7E",x"32",x"31",x"40",x"32",x"33", -- 0x15E8 + x"40",x"32",x"35",x"40",x"C9",x"21",x"4C",x"50", -- 0x15F0 + x"22",x"92",x"42",x"22",x"96",x"42",x"21",x"5E", -- 0x15F8 + x"50",x"22",x"94",x"42",x"21",x"AC",x"53",x"22", -- 0x1600 + x"98",x"42",x"C9",x"CD",x"00",x"12",x"CD",x"F5", -- 0x1608 + x"15",x"21",x"90",x"42",x"34",x"2C",x"36",x"32", -- 0x1610 + x"21",x"9A",x"42",x"36",x"07",x"2C",x"36",x"00", -- 0x1618 + x"2C",x"36",x"00",x"21",x"A0",x"58",x"CB",x"CE", -- 0x1620 + x"21",x"C0",x"58",x"CB",x"96",x"AF",x"32",x"B0", -- 0x1628 + x"58",x"C9",x"21",x"91",x"42",x"35",x"C0",x"36", -- 0x1630 + x"01",x"2D",x"34",x"21",x"39",x"40",x"D9",x"06", -- 0x1638 + x"00",x"3A",x"9C",x"42",x"4F",x"21",x"85",x"16", -- 0x1640 + x"09",x"7E",x"D9",x"06",x"13",x"77",x"2C",x"2C", -- 0x1648 + x"10",x"FB",x"3E",x"01",x"32",x"81",x"42",x"AF", -- 0x1650 + x"06",x"18",x"21",x"30",x"40",x"77",x"2C",x"2C", -- 0x1658 + x"10",x"FB",x"21",x"4C",x"50",x"0E",x"1C",x"06", -- 0x1660 + x"13",x"36",x"10",x"23",x"10",x"FB",x"11",x"0D", -- 0x1668 + x"00",x"19",x"0D",x"20",x"F2",x"11",x"00",x"06", -- 0x1670 + x"FF",x"3A",x"0D",x"40",x"1E",x"02",x"0F",x"D2", -- 0x1678 + x"38",x"00",x"1C",x"FF",x"C9",x"06",x"02",x"03", -- 0x1680 + x"07",x"00",x"21",x"91",x"42",x"35",x"C0",x"36", -- 0x1688 + x"03",x"06",x"13",x"3E",x"C8",x"2A",x"96",x"42", -- 0x1690 + x"ED",x"5B",x"98",x"42",x"77",x"12",x"13",x"23", -- 0x1698 + x"10",x"FA",x"06",x"28",x"2A",x"92",x"42",x"11", -- 0x16A0 + x"20",x"00",x"77",x"19",x"10",x"FC",x"2A",x"94", -- 0x16A8 + x"42",x"06",x"1C",x"77",x"19",x"10",x"FC",x"21", -- 0x16B0 + x"92",x"42",x"34",x"2C",x"2C",x"35",x"2A",x"96", -- 0x16B8 + x"42",x"19",x"22",x"96",x"42",x"2A",x"98",x"42", -- 0x16C0 + x"11",x"E0",x"FF",x"19",x"22",x"98",x"42",x"21", -- 0x16C8 + x"9A",x"42",x"35",x"C0",x"21",x"90",x"42",x"34", -- 0x16D0 + x"C9",x"CD",x"F5",x"15",x"21",x"90",x"42",x"36", -- 0x16D8 + x"01",x"2C",x"36",x"0A",x"21",x"9A",x"42",x"36", -- 0x16E0 + x"07",x"2C",x"2C",x"34",x"7E",x"FE",x"05",x"C0", -- 0x16E8 + x"3E",x"04",x"32",x"90",x"42",x"C9",x"3A",x"5F", -- 0x16F0 + x"42",x"E6",x"07",x"C0",x"3A",x"9B",x"42",x"2E", -- 0x16F8 + x"13",x"11",x"39",x"40",x"06",x"00",x"D6",x"01", -- 0x1700 + x"30",x"02",x"3E",x"05",x"4F",x"E5",x"F5",x"21", -- 0x1708 + x"1D",x"17",x"09",x"7E",x"12",x"1C",x"1C",x"F1", -- 0x1710 + x"E1",x"2D",x"20",x"EA",x"C9",x"00",x"03",x"02", -- 0x1718 + x"06",x"07",x"04",x"11",x"FD",x"FF",x"DD",x"21", -- 0x1720 + x"A4",x"40",x"3A",x"0D",x"40",x"0F",x"30",x"04", -- 0x1728 + x"DD",x"21",x"A7",x"40",x"FD",x"21",x"CE",x"43", -- 0x1730 + x"06",x"05",x"FD",x"7E",x"00",x"DD",x"BE",x"00", -- 0x1738 + x"20",x"0F",x"FD",x"7E",x"FF",x"DD",x"BE",x"FF", -- 0x1740 + x"20",x"07",x"FD",x"7E",x"FE",x"DD",x"BE",x"FE", -- 0x1748 + x"C8",x"30",x"04",x"FD",x"19",x"10",x"E3",x"3E", -- 0x1750 + x"05",x"90",x"C8",x"21",x"CE",x"43",x"11",x"D1", -- 0x1758 + x"43",x"47",x"87",x"80",x"06",x"00",x"4F",x"ED", -- 0x1760 + x"B8",x"2C",x"EB",x"DD",x"E5",x"E1",x"2D",x"2D", -- 0x1768 + x"01",x"03",x"00",x"ED",x"B0",x"C9",x"3A",x"1E", -- 0x1770 + x"41",x"0F",x"D8",x"21",x"A4",x"40",x"3A",x"0D", -- 0x1778 + x"40",x"0F",x"30",x"03",x"21",x"A7",x"40",x"3A", -- 0x1780 + x"17",x"40",x"47",x"7E",x"E6",x"0F",x"07",x"07", -- 0x1788 + x"07",x"07",x"4F",x"2D",x"7E",x"E6",x"F0",x"0F", -- 0x1790 + x"0F",x"0F",x"0F",x"B1",x"B8",x"D8",x"21",x"90", -- 0x1798 + x"58",x"CB",x"C6",x"21",x"1D",x"41",x"34",x"11", -- 0x17A0 + x"03",x"07",x"FF",x"2C",x"36",x"01",x"C9",x"3A", -- 0x17A8 + x"16",x"41",x"A7",x"C0",x"21",x"1C",x"41",x"7E", -- 0x17B0 + x"0F",x"D2",x"E0",x"1C",x"11",x"88",x"06",x"FF", -- 0x17B8 + x"36",x"00",x"C3",x"E0",x"1C",x"21",x"00",x"42", -- 0x17C0 + x"CB",x"46",x"28",x"3A",x"2C",x"2C",x"3A",x"0F", -- 0x17C8 + x"40",x"0F",x"30",x"06",x"3A",x"0D",x"40",x"0F", -- 0x17D0 + x"38",x"3F",x"3A",x"10",x"40",x"47",x"CB",x"5F", -- 0x17D8 + x"28",x"07",x"7E",x"FE",x"17",x"38",x"02",x"35", -- 0x17E0 + x"35",x"CB",x"50",x"28",x"07",x"7E",x"FE",x"E9", -- 0x17E8 + x"30",x"02",x"34",x"34",x"7E",x"2F",x"C6",x"80", -- 0x17F0 + x"0E",x"06",x"21",x"50",x"40",x"06",x"04",x"77", -- 0x17F8 + x"2C",x"71",x"2C",x"10",x"FA",x"C9",x"2C",x"CB", -- 0x1800 + x"46",x"20",x"05",x"2C",x"36",x"00",x"18",x"E4", -- 0x1808 + x"2C",x"7E",x"2F",x"C6",x"80",x"0E",x"07",x"18", -- 0x1810 + x"E1",x"3A",x"11",x"40",x"47",x"18",x"BE",x"21", -- 0x1818 + x"7C",x"42",x"CB",x"46",x"23",x"23",x"23",x"28", -- 0x1820 + x"0C",x"7E",x"D6",x"05",x"77",x"FE",x"34",x"30", -- 0x1828 + x"16",x"AF",x"32",x"7C",x"42",x"36",x"C7",x"2D", -- 0x1830 + x"2D",x"3A",x"00",x"42",x"0F",x"30",x"06",x"3A", -- 0x1838 + x"02",x"42",x"77",x"18",x"02",x"36",x"00",x"DD", -- 0x1840 + x"21",x"9D",x"40",x"FD",x"21",x"7D",x"42",x"3A", -- 0x1848 + x"0F",x"40",x"0F",x"30",x"17",x"3A",x"0D",x"40", -- 0x1850 + x"0F",x"30",x"11",x"FD",x"7E",x"02",x"2F",x"C6", -- 0x1858 + x"FC",x"DD",x"77",x"02",x"FD",x"7E",x"00",x"2F", -- 0x1860 + x"DD",x"77",x"00",x"C9",x"FD",x"7E",x"02",x"3D", -- 0x1868 + x"DD",x"77",x"02",x"FD",x"7E",x"00",x"2F",x"DD", -- 0x1870 + x"77",x"00",x"C9",x"DD",x"21",x"A0",x"42",x"11", -- 0x1878 + x"20",x"00",x"06",x"08",x"D9",x"CD",x"1D",x"1D", -- 0x1880 + x"D9",x"DD",x"19",x"10",x"F7",x"C9",x"DD",x"21", -- 0x1888 + x"A0",x"42",x"FD",x"21",x"60",x"40",x"01",x"08", -- 0x1890 + x"08",x"DD",x"CB",x"00",x"46",x"28",x"27",x"DD", -- 0x1898 + x"7E",x"16",x"FD",x"77",x"02",x"DD",x"7E",x"03", -- 0x18A0 + x"91",x"FD",x"77",x"03",x"DD",x"7E",x"04",x"2F", -- 0x18A8 + x"91",x"FD",x"77",x"00",x"DD",x"7E",x"12",x"FD", -- 0x18B0 + x"77",x"01",x"11",x"20",x"00",x"DD",x"19",x"1E", -- 0x18B8 + x"04",x"FD",x"19",x"10",x"D4",x"C9",x"DD",x"CB", -- 0x18C0 + x"01",x"46",x"28",x"06",x"FD",x"36",x"02",x"07", -- 0x18C8 + x"18",x"CD",x"FD",x"36",x"03",x"F8",x"FD",x"36", -- 0x18D0 + x"00",x"F8",x"18",x"DE",x"3A",x"00",x"42",x"0F", -- 0x18D8 + x"D0",x"3A",x"7C",x"42",x"0F",x"D8",x"3A",x"0F", -- 0x18E0 + x"40",x"0F",x"30",x"06",x"3A",x"0D",x"40",x"0F", -- 0x18E8 + x"38",x"17",x"3A",x"13",x"40",x"2F",x"47",x"3A", -- 0x18F0 + x"10",x"40",x"A0",x"E6",x"10",x"C8",x"3E",x"01", -- 0x18F8 + x"32",x"7C",x"42",x"21",x"C0",x"58",x"CB",x"C6", -- 0x1900 + x"C9",x"3A",x"14",x"40",x"2F",x"47",x"3A",x"11", -- 0x1908 + x"40",x"18",x"E7",x"CD",x"89",x"19",x"CD",x"DC", -- 0x1910 + x"19",x"CD",x"FB",x"19",x"CD",x"3E",x"1A",x"C3", -- 0x1918 + x"22",x"19",x"06",x"08",x"21",x"60",x"42",x"CB", -- 0x1920 + x"46",x"20",x"07",x"2C",x"2C",x"2C",x"2C",x"10", -- 0x1928 + x"F6",x"C9",x"2C",x"2C",x"2C",x"7E",x"C6",x"20", -- 0x1930 + x"D6",x"10",x"30",x"F2",x"2D",x"2D",x"7E",x"C6", -- 0x1938 + x"E0",x"D6",x"20",x"30",x"05",x"11",x"20",x"41", -- 0x1940 + x"18",x"14",x"D6",x"30",x"D6",x"20",x"30",x"05", -- 0x1948 + x"11",x"30",x"41",x"18",x"09",x"D6",x"30",x"D6", -- 0x1950 + x"20",x"30",x"D1",x"11",x"40",x"41",x"C6",x"20", -- 0x1958 + x"E6",x"F8",x"1F",x"83",x"5F",x"2C",x"2C",x"7E", -- 0x1960 + x"D6",x"E0",x"E6",x"0C",x"1F",x"1F",x"83",x"5F", -- 0x1968 + x"1A",x"CB",x"4F",x"28",x"B9",x"4F",x"7D",x"FE", -- 0x1970 + x"7C",x"79",x"30",x"03",x"CB",x"D7",x"12",x"0E", -- 0x1978 + x"04",x"AF",x"77",x"2D",x"0D",x"20",x"FB",x"18", -- 0x1980 + x"A2",x"DD",x"21",x"60",x"42",x"11",x"04",x"00", -- 0x1988 + x"06",x"04",x"CD",x"9A",x"19",x"DD",x"19",x"10", -- 0x1990 + x"F9",x"C9",x"DD",x"CB",x"00",x"46",x"28",x"2B", -- 0x1998 + x"DD",x"CB",x"02",x"4E",x"28",x"18",x"DD",x"34", -- 0x19A0 + x"01",x"DD",x"CB",x"02",x"46",x"28",x"0F",x"DD", -- 0x19A8 + x"35",x"01",x"DD",x"35",x"01",x"DD",x"7E",x"01", -- 0x19B0 + x"C6",x"10",x"D6",x"21",x"38",x"0D",x"DD",x"7E", -- 0x19B8 + x"03",x"C6",x"02",x"DD",x"77",x"03",x"FE",x"DF", -- 0x19C0 + x"30",x"01",x"C9",x"DD",x"36",x"00",x"00",x"DD", -- 0x19C8 + x"36",x"01",x"00",x"DD",x"36",x"02",x"00",x"DD", -- 0x19D0 + x"36",x"03",x"00",x"C9",x"DD",x"21",x"68",x"42", -- 0x19D8 + x"DD",x"CB",x"00",x"46",x"28",x"E5",x"3A",x"10", -- 0x19E0 + x"41",x"FE",x"05",x"30",x"03",x"AF",x"18",x"02", -- 0x19E8 + x"3E",x"02",x"DD",x"86",x"03",x"DD",x"77",x"03", -- 0x19F0 + x"C3",x"C6",x"19",x"DD",x"21",x"60",x"42",x"11", -- 0x19F8 + x"04",x"00",x"06",x"03",x"CD",x"0C",x"1A",x"DD", -- 0x1A00 + x"19",x"10",x"F9",x"C9",x"DD",x"CB",x"00",x"46", -- 0x1A08 + x"C8",x"DD",x"7E",x"03",x"C6",x"37",x"D6",x"05", -- 0x1A10 + x"38",x"17",x"D6",x"09",x"D0",x"3A",x"02",x"42", -- 0x1A18 + x"DD",x"96",x"01",x"C6",x"06",x"D6",x"0D",x"D0", -- 0x1A20 + x"CD",x"CB",x"19",x"3E",x"01",x"32",x"04",x"42", -- 0x1A28 + x"C9",x"3A",x"02",x"42",x"DD",x"96",x"01",x"C6", -- 0x1A30 + x"02",x"D6",x"05",x"D0",x"18",x"EA",x"21",x"81", -- 0x1A38 + x"40",x"11",x"61",x"42",x"06",x"03",x"1A",x"2F", -- 0x1A40 + x"77",x"2C",x"2C",x"1C",x"1C",x"1A",x"77",x"3A", -- 0x1A48 + x"0F",x"40",x"0F",x"30",x"09",x"3A",x"0D",x"40", -- 0x1A50 + x"0F",x"30",x"03",x"7E",x"2F",x"77",x"2C",x"2C", -- 0x1A58 + x"1C",x"1C",x"10",x"E2",x"C9",x"3A",x"7C",x"42", -- 0x1A60 + x"0F",x"D0",x"DD",x"21",x"A0",x"42",x"11",x"20", -- 0x1A68 + x"00",x"06",x"08",x"D9",x"CD",x"7D",x"1A",x"D9", -- 0x1A70 + x"DD",x"19",x"10",x"F7",x"C9",x"DD",x"CB",x"00", -- 0x1A78 + x"46",x"C8",x"3A",x"7F",x"42",x"6F",x"3A",x"7D", -- 0x1A80 + x"42",x"67",x"DD",x"7E",x"03",x"95",x"C6",x"02", -- 0x1A88 + x"FE",x"06",x"D0",x"DD",x"7E",x"04",x"94",x"C6", -- 0x1A90 + x"05",x"FE",x"0C",x"D0",x"DD",x"36",x"00",x"00", -- 0x1A98 + x"DD",x"36",x"01",x"01",x"DD",x"36",x"02",x"00", -- 0x1AA0 + x"3A",x"06",x"40",x"0F",x"30",x"34",x"DD",x"CB", -- 0x1AA8 + x"19",x"46",x"28",x"07",x"21",x"B0",x"58",x"CB", -- 0x1AB0 + x"D6",x"18",x"05",x"21",x"B0",x"58",x"CB",x"DE", -- 0x1AB8 + x"16",x"03",x"DD",x"7E",x"16",x"FE",x"07",x"28", -- 0x1AC0 + x"06",x"FE",x"03",x"28",x"06",x"18",x"08",x"1E", -- 0x1AC8 + x"02",x"18",x"06",x"1E",x"04",x"18",x"02",x"1E", -- 0x1AD0 + x"09",x"DD",x"7E",x"19",x"0F",x"30",x"02",x"CB", -- 0x1AD8 + x"23",x"FF",x"AF",x"32",x"7C",x"42",x"21",x"11", -- 0x1AE0 + x"41",x"35",x"DD",x"7E",x"18",x"DD",x"36",x"18", -- 0x1AE8 + x"00",x"3D",x"28",x"04",x"3D",x"28",x"0C",x"C9", -- 0x1AF0 + x"DD",x"7E",x"17",x"C6",x"20",x"6F",x"26",x"41", -- 0x1AF8 + x"CB",x"BE",x"C9",x"DD",x"7E",x"17",x"C6",x"50", -- 0x1B00 + x"18",x"F3",x"21",x"04",x"42",x"CB",x"46",x"28", -- 0x1B08 + x"18",x"36",x"00",x"21",x"00",x"01",x"22",x"00", -- 0x1B10 + x"42",x"21",x"0A",x"04",x"22",x"05",x"42",x"11", -- 0x1B18 + x"03",x"02",x"FF",x"21",x"C0",x"58",x"CB",x"CE", -- 0x1B20 + x"C9",x"3A",x"01",x"42",x"0F",x"D0",x"21",x"05", -- 0x1B28 + x"42",x"35",x"C0",x"36",x"0A",x"23",x"16",x"02", -- 0x1B30 + x"5E",x"FF",x"35",x"C0",x"AF",x"32",x"01",x"42", -- 0x1B38 + x"C9",x"3A",x"12",x"41",x"FE",x"2E",x"C8",x"3A", -- 0x1B40 + x"00",x"42",x"0F",x"D0",x"3A",x"16",x"41",x"A7", -- 0x1B48 + x"C8",x"3A",x"5F",x"42",x"E6",x"07",x"C0",x"3A", -- 0x1B50 + x"5F",x"42",x"A7",x"20",x"0E",x"2A",x"07",x"42", -- 0x1B58 + x"23",x"7E",x"3C",x"20",x"03",x"21",x"89",x"1B", -- 0x1B60 + x"22",x"07",x"42",x"2A",x"07",x"42",x"46",x"21", -- 0x1B68 + x"A0",x"42",x"11",x"1F",x"00",x"7E",x"23",x"B6", -- 0x1B70 + x"0F",x"30",x"04",x"19",x"10",x"F7",x"C9",x"23", -- 0x1B78 + x"36",x"00",x"2B",x"36",x"00",x"2B",x"36",x"01", -- 0x1B80 + x"C9",x"08",x"08",x"04",x"04",x"04",x"05",x"05", -- 0x1B88 + x"05",x"06",x"06",x"06",x"07",x"07",x"07",x"08", -- 0x1B90 + x"08",x"08",x"08",x"08",x"08",x"04",x"04",x"04", -- 0x1B98 + x"04",x"FF",x"3A",x"10",x"41",x"FE",x"04",x"D8", -- 0x1BA0 + x"3A",x"11",x"41",x"FE",x"0F",x"D8",x"3A",x"00", -- 0x1BA8 + x"42",x"0F",x"D0",x"21",x"B8",x"42",x"11",x"20", -- 0x1BB0 + x"00",x"06",x"08",x"CB",x"46",x"20",x"04",x"19", -- 0x1BB8 + x"10",x"F9",x"C9",x"7D",x"D6",x"15",x"6F",x"3A", -- 0x1BC0 + x"60",x"42",x"0F",x"D8",x"7E",x"2C",x"46",x"FE", -- 0x1BC8 + x"B0",x"D0",x"FE",x"60",x"D8",x"21",x"60",x"42", -- 0x1BD0 + x"36",x"01",x"2C",x"70",x"2C",x"2C",x"77",x"C9", -- 0x1BD8 + x"3A",x"00",x"42",x"0F",x"D0",x"3A",x"10",x"41", -- 0x1BE0 + x"A7",x"C8",x"3A",x"11",x"41",x"FE",x"0F",x"D8", -- 0x1BE8 + x"3A",x"02",x"42",x"4F",x"26",x"FF",x"2E",x"00", -- 0x1BF0 + x"DD",x"21",x"A0",x"42",x"11",x"20",x"00",x"06", -- 0x1BF8 + x"08",x"DD",x"CB",x"00",x"46",x"28",x"12",x"DD", -- 0x1C00 + x"7E",x"04",x"B9",x"30",x"06",x"79",x"DD",x"96", -- 0x1C08 + x"04",x"18",x"01",x"91",x"BC",x"30",x"02",x"67", -- 0x1C10 + x"68",x"DD",x"19",x"10",x"E4",x"7D",x"A7",x"C8", -- 0x1C18 + x"3E",x"08",x"95",x"21",x"A0",x"42",x"A7",x"28", -- 0x1C20 + x"04",x"3D",x"19",x"18",x"F9",x"2C",x"2C",x"2C", -- 0x1C28 + x"DD",x"21",x"64",x"42",x"DD",x"CB",x"00",x"46", -- 0x1C30 + x"C0",x"7E",x"FE",x"60",x"D8",x"47",x"3A",x"10", -- 0x1C38 + x"41",x"0E",x"A8",x"A7",x"28",x"07",x"0E",x"B0", -- 0x1C40 + x"3D",x"28",x"02",x"0E",x"B8",x"78",x"B9",x"D0", -- 0x1C48 + x"DD",x"36",x"00",x"01",x"7E",x"DD",x"77",x"03", -- 0x1C50 + x"2C",x"7E",x"DD",x"77",x"01",x"C9",x"3A",x"00", -- 0x1C58 + x"42",x"0F",x"D0",x"3A",x"11",x"41",x"FE",x"0F", -- 0x1C60 + x"D8",x"3A",x"00",x"41",x"0F",x"D0",x"3A",x"10", -- 0x1C68 + x"41",x"FE",x"02",x"D8",x"21",x"68",x"42",x"CB", -- 0x1C70 + x"46",x"C0",x"34",x"2C",x"3A",x"01",x"41",x"77", -- 0x1C78 + x"2C",x"2C",x"36",x"38",x"C9",x"21",x"DF",x"41", -- 0x1C80 + x"1E",x"06",x"0E",x"06",x"06",x"18",x"CB",x"4E", -- 0x1C88 + x"20",x"0C",x"7D",x"93",x"6F",x"10",x"F7",x"7D", -- 0x1C90 + x"C6",x"8F",x"6F",x"0D",x"20",x"EE",x"3E",x"40", -- 0x1C98 + x"41",x"0E",x"04",x"04",x"81",x"10",x"FD",x"32", -- 0x1CA0 + x"1B",x"41",x"C9",x"3A",x"00",x"41",x"A7",x"C8", -- 0x1CA8 + x"3A",x"5F",x"42",x"E6",x"01",x"C8",x"21",x"02", -- 0x1CB0 + x"41",x"7E",x"2D",x"0F",x"38",x"12",x"7E",x"FE", -- 0x1CB8 + x"27",x"38",x"15",x"3D",x"77",x"2F",x"C6",x"80", -- 0x1CC0 + x"21",x"2A",x"40",x"77",x"2C",x"2C",x"77",x"C9", -- 0x1CC8 + x"7E",x"FE",x"D9",x"30",x"07",x"3C",x"18",x"EC", -- 0x1CD0 + x"2C",x"36",x"01",x"C9",x"2C",x"36",x"00",x"C9", -- 0x1CD8 + x"3A",x"58",x"40",x"A7",x"20",x"0E",x"3E",x"30", -- 0x1CE0 + x"32",x"58",x"40",x"32",x"5A",x"40",x"21",x"20", -- 0x1CE8 + x"41",x"C3",x"14",x"1D",x"21",x"58",x"40",x"34", -- 0x1CF0 + x"23",x"23",x"34",x"7E",x"FE",x"80",x"21",x"30", -- 0x1CF8 + x"41",x"CA",x"14",x"1D",x"FE",x"D0",x"21",x"40", -- 0x1D00 + x"41",x"CA",x"14",x"1D",x"A7",x"C0",x"21",x"16", -- 0x1D08 + x"41",x"36",x"30",x"C9",x"06",x"10",x"3E",x"02", -- 0x1D10 + x"77",x"23",x"10",x"FC",x"C9",x"DD",x"CB",x"01", -- 0x1D18 + x"46",x"C2",x"61",x"1D",x"DD",x"CB",x"00",x"46", -- 0x1D20 + x"C8",x"DD",x"7E",x"02",x"EF",x"BD",x"1F",x"76", -- 0x1D28 + x"21",x"A5",x"21",x"B7",x"21",x"C1",x"21",x"EE", -- 0x1D30 + x"21",x"12",x"22",x"1C",x"22",x"2B",x"22",x"A9", -- 0x1D38 + x"23",x"B3",x"23",x"C1",x"23",x"CB",x"23",x"FA", -- 0x1D40 + x"23",x"04",x"24",x"0E",x"24",x"18",x"24",x"25", -- 0x1D48 + x"24",x"28",x"24",x"32",x"24",x"41",x"24",x"F2", -- 0x1D50 + x"25",x"FC",x"25",x"0A",x"26",x"14",x"26",x"43", -- 0x1D58 + x"26",x"DD",x"7E",x"02",x"EF",x"69",x"1D",x"79", -- 0x1D60 + x"1D",x"DD",x"36",x"10",x"04",x"DD",x"36",x"11", -- 0x1D68 + x"04",x"DD",x"36",x"12",x"1C",x"DD",x"34",x"02", -- 0x1D70 + x"C9",x"DD",x"35",x"10",x"C0",x"DD",x"36",x"10", -- 0x1D78 + x"04",x"DD",x"34",x"12",x"DD",x"35",x"11",x"C0", -- 0x1D80 + x"DD",x"36",x"01",x"00",x"C9",x"DD",x"7E",x"16", -- 0x1D88 + x"FE",x"01",x"F5",x"CC",x"AC",x"1D",x"F1",x"28", -- 0x1D90 + x"13",x"DD",x"CB",x"19",x"46",x"20",x"0D",x"DD", -- 0x1D98 + x"7E",x"16",x"FE",x"03",x"28",x"06",x"3A",x"5F", -- 0x1DA0 + x"42",x"0F",x"3F",x"D0",x"DD",x"7E",x"04",x"DD", -- 0x1DA8 + x"BE",x"06",x"28",x"4A",x"DD",x"7E",x"03",x"DD", -- 0x1DB0 + x"BE",x"05",x"28",x"58",x"DD",x"CB",x"09",x"46", -- 0x1DB8 + x"28",x"1E",x"DD",x"7E",x"07",x"DD",x"86",x"03", -- 0x1DC0 + x"DD",x"77",x"03",x"DD",x"7E",x"0B",x"DD",x"86", -- 0x1DC8 + x"0A",x"DD",x"77",x"0A",x"D0",x"DD",x"7E",x"08", -- 0x1DD0 + x"DD",x"86",x"04",x"DD",x"77",x"04",x"A7",x"C9", -- 0x1DD8 + x"DD",x"7E",x"08",x"DD",x"86",x"04",x"DD",x"77", -- 0x1DE0 + x"04",x"DD",x"7E",x"0B",x"DD",x"86",x"0A",x"DD", -- 0x1DE8 + x"77",x"0A",x"D0",x"DD",x"7E",x"07",x"DD",x"86", -- 0x1DF0 + x"03",x"DD",x"77",x"03",x"A7",x"C9",x"DD",x"7E", -- 0x1DF8 + x"03",x"DD",x"BE",x"05",x"28",x"0C",x"30",x"05", -- 0x1E00 + x"DD",x"34",x"03",x"A7",x"C9",x"DD",x"35",x"03", -- 0x1E08 + x"A7",x"C9",x"37",x"C9",x"DD",x"7E",x"04",x"DD", -- 0x1E10 + x"BE",x"06",x"30",x"05",x"DD",x"34",x"04",x"A7", -- 0x1E18 + x"C9",x"DD",x"35",x"04",x"A7",x"C9",x"DD",x"35", -- 0x1E20 + x"0E",x"C0",x"DD",x"6E",x"0C",x"DD",x"66",x"0D", -- 0x1E28 + x"7E",x"FE",x"FF",x"20",x"06",x"23",x"5E",x"23", -- 0x1E30 + x"56",x"EB",x"7E",x"DD",x"77",x"12",x"23",x"7E", -- 0x1E38 + x"DD",x"77",x"0E",x"23",x"DD",x"75",x"0C",x"DD", -- 0x1E40 + x"74",x"0D",x"C9",x"8E",x"0A",x"8F",x"0A",x"90", -- 0x1E48 + x"0A",x"91",x"0A",x"92",x"0A",x"F1",x"05",x"F0", -- 0x1E50 + x"05",x"EF",x"05",x"EE",x"05",x"ED",x"05",x"FF", -- 0x1E58 + x"79",x"1E",x"0E",x"0A",x"0F",x"0A",x"10",x"0A", -- 0x1E60 + x"11",x"0A",x"12",x"0A",x"71",x"05",x"70",x"05", -- 0x1E68 + x"6F",x"05",x"6E",x"05",x"6D",x"05",x"FF",x"79", -- 0x1E70 + x"1E",x"E9",x"05",x"EA",x"05",x"EB",x"05",x"EC", -- 0x1E78 + x"05",x"FF",x"79",x"1E",x"6E",x"05",x"6F",x"05", -- 0x1E80 + x"6E",x"05",x"6D",x"05",x"E9",x"05",x"EA",x"05", -- 0x1E88 + x"EB",x"05",x"EC",x"05",x"ED",x"05",x"EE",x"05", -- 0x1E90 + x"EF",x"05",x"EE",x"05",x"ED",x"05",x"FF",x"79", -- 0x1E98 + x"1E",x"E4",x"03",x"E5",x"03",x"E6",x"03",x"E7", -- 0x1EA0 + x"03",x"E8",x"03",x"A7",x"03",x"A6",x"03",x"A5", -- 0x1EA8 + x"03",x"A4",x"03",x"FF",x"B6",x"1E",x"20",x"05", -- 0x1EB0 + x"21",x"05",x"22",x"05",x"23",x"05",x"FF",x"B6", -- 0x1EB8 + x"1E",x"25",x"05",x"26",x"05",x"25",x"05",x"24", -- 0x1EC0 + x"05",x"20",x"05",x"21",x"05",x"22",x"05",x"23", -- 0x1EC8 + x"05",x"A4",x"05",x"A5",x"05",x"A6",x"05",x"A5", -- 0x1ED0 + x"05",x"A4",x"05",x"FF",x"B6",x"1E",x"2D",x"03", -- 0x1ED8 + x"2E",x"03",x"2F",x"03",x"30",x"03",x"31",x"03", -- 0x1EE0 + x"70",x"03",x"6F",x"03",x"6E",x"03",x"6D",x"03", -- 0x1EE8 + x"FF",x"79",x"1E",x"DD",x"E5",x"E1",x"3E",x"07", -- 0x1EF0 + x"85",x"6F",x"DD",x"36",x"0A",x"00",x"DD",x"7E", -- 0x1EF8 + x"05",x"DD",x"BE",x"03",x"28",x"04",x"38",x"1E", -- 0x1F00 + x"18",x"56",x"DD",x"7E",x"06",x"DD",x"BE",x"04", -- 0x1F08 + x"28",x"0E",x"38",x"06",x"36",x"00",x"2C",x"36", -- 0x1F10 + x"01",x"C9",x"36",x"00",x"2C",x"36",x"FF",x"C9", -- 0x1F18 + x"36",x"00",x"2C",x"36",x"00",x"C9",x"DD",x"7E", -- 0x1F20 + x"06",x"DD",x"BE",x"04",x"28",x"2C",x"38",x"15", -- 0x1F28 + x"36",x"FF",x"2C",x"36",x"01",x"DD",x"7E",x"03", -- 0x1F30 + x"DD",x"96",x"05",x"47",x"DD",x"7E",x"06",x"DD", -- 0x1F38 + x"96",x"04",x"4F",x"18",x"55",x"36",x"FF",x"2C", -- 0x1F40 + x"36",x"FF",x"DD",x"7E",x"03",x"DD",x"96",x"05", -- 0x1F48 + x"47",x"DD",x"7E",x"04",x"DD",x"96",x"06",x"4F", -- 0x1F50 + x"18",x"40",x"36",x"FF",x"2C",x"36",x"00",x"C9", -- 0x1F58 + x"DD",x"7E",x"06",x"DD",x"BE",x"04",x"28",x"2C", -- 0x1F60 + x"38",x"15",x"36",x"01",x"2C",x"36",x"01",x"DD", -- 0x1F68 + x"7E",x"05",x"DD",x"96",x"03",x"47",x"DD",x"7E", -- 0x1F70 + x"06",x"DD",x"96",x"04",x"4F",x"18",x"1B",x"36", -- 0x1F78 + x"01",x"2C",x"36",x"FF",x"DD",x"7E",x"05",x"DD", -- 0x1F80 + x"96",x"03",x"47",x"DD",x"7E",x"04",x"DD",x"96", -- 0x1F88 + x"06",x"4F",x"18",x"06",x"36",x"01",x"2C",x"36", -- 0x1F90 + x"00",x"C9",x"79",x"B8",x"28",x"16",x"38",x"0B", -- 0x1F98 + x"DD",x"36",x"09",x"00",x"CD",x"4F",x"26",x"DD", -- 0x1FA0 + x"77",x"0B",x"C9",x"DD",x"36",x"09",x"01",x"78", -- 0x1FA8 + x"41",x"4F",x"18",x"F0",x"DD",x"36",x"09",x"01", -- 0x1FB0 + x"DD",x"36",x"0B",x"FF",x"C9",x"DD",x"36",x"18", -- 0x1FB8 + x"00",x"DD",x"36",x"19",x"00",x"21",x"0E",x"21", -- 0x1FC0 + x"DD",x"75",x"13",x"DD",x"74",x"14",x"DD",x"36", -- 0x1FC8 + x"10",x"30",x"DD",x"36",x"0E",x"01",x"21",x"12", -- 0x1FD0 + x"41",x"7E",x"34",x"47",x"87",x"87",x"80",x"5F", -- 0x1FD8 + x"16",x"00",x"21",x"28",x"20",x"19",x"3E",x"30", -- 0x1FE0 + x"86",x"DD",x"77",x"03",x"23",x"3A",x"01",x"41", -- 0x1FE8 + x"86",x"DD",x"77",x"04",x"23",x"5E",x"23",x"46", -- 0x1FF0 + x"23",x"7E",x"DD",x"77",x"16",x"21",x"04",x"41", -- 0x1FF8 + x"19",x"70",x"DD",x"36",x"12",x"0B",x"3A",x"01", -- 0x2000 + x"41",x"FE",x"80",x"30",x"11",x"DD",x"36",x"15", -- 0x2008 + x"00",x"21",x"4B",x"1E",x"DD",x"75",x"0C",x"DD", -- 0x2010 + x"74",x"0D",x"DD",x"34",x"02",x"C9",x"DD",x"36", -- 0x2018 + x"15",x"01",x"21",x"62",x"1E",x"C3",x"14",x"20", -- 0x2020 + x"F1",x"EF",x"00",x"66",x"07",x"F1",x"12",x"05", -- 0x2028 + x"66",x"07",x"F3",x"EB",x"00",x"6D",x"07",x"F3", -- 0x2030 + x"16",x"05",x"67",x"07",x"F3",x"EE",x"00",x"68", -- 0x2038 + x"07",x"F3",x"13",x"05",x"68",x"07",x"F5",x"EA", -- 0x2040 + x"00",x"6E",x"07",x"F5",x"17",x"05",x"69",x"07", -- 0x2048 + x"F5",x"EF",x"00",x"6A",x"07",x"F5",x"12",x"05", -- 0x2050 + x"6A",x"07",x"F7",x"EB",x"00",x"6F",x"07",x"F7", -- 0x2058 + x"16",x"05",x"6B",x"03",x"F7",x"EE",x"00",x"10", -- 0x2060 + x"03",x"F7",x"13",x"05",x"10",x"03",x"F1",x"F2", -- 0x2068 + x"01",x"6C",x"03",x"F1",x"0F",x"04",x"65",x"03", -- 0x2070 + x"F1",x"F7",x"01",x"66",x"03",x"F1",x"0A",x"04", -- 0x2078 + x"66",x"03",x"F3",x"F3",x"01",x"6D",x"03",x"F3", -- 0x2080 + x"0E",x"04",x"67",x"03",x"F3",x"F6",x"01",x"68", -- 0x2088 + x"03",x"F3",x"0B",x"04",x"68",x"03",x"F5",x"F2", -- 0x2090 + x"01",x"6E",x"03",x"F5",x"0F",x"04",x"69",x"03", -- 0x2098 + x"F5",x"F7",x"01",x"6A",x"03",x"F5",x"0A",x"04", -- 0x20A0 + x"6A",x"03",x"F7",x"F3",x"01",x"6F",x"03",x"F7", -- 0x20A8 + x"0E",x"04",x"6B",x"03",x"F7",x"F6",x"01",x"10", -- 0x20B0 + x"03",x"F7",x"0B",x"04",x"10",x"03",x"F1",x"FA", -- 0x20B8 + x"02",x"6C",x"03",x"F1",x"07",x"03",x"65",x"03", -- 0x20C0 + x"F1",x"FF",x"02",x"66",x"03",x"F1",x"02",x"03", -- 0x20C8 + x"66",x"03",x"F3",x"FB",x"02",x"6D",x"03",x"F3", -- 0x20D0 + x"06",x"03",x"67",x"03",x"F3",x"FE",x"02",x"68", -- 0x20D8 + x"03",x"F3",x"03",x"03",x"68",x"01",x"F5",x"FA", -- 0x20E0 + x"02",x"6E",x"01",x"F5",x"07",x"03",x"69",x"01", -- 0x20E8 + x"F5",x"FF",x"02",x"6A",x"01",x"F5",x"02",x"03", -- 0x20F0 + x"6A",x"01",x"F7",x"FB",x"02",x"6F",x"01",x"F7", -- 0x20F8 + x"06",x"03",x"6B",x"01",x"F7",x"FE",x"02",x"10", -- 0x2100 + x"01",x"F7",x"03",x"03",x"10",x"01",x"FF",x"00", -- 0x2108 + x"FF",x"00",x"FF",x"00",x"FF",x"01",x"FF",x"00", -- 0x2110 + x"FF",x"00",x"FF",x"01",x"FF",x"00",x"FF",x"01", -- 0x2118 + x"FF",x"00",x"00",x"01",x"FF",x"00",x"FF",x"01", -- 0x2120 + x"00",x"01",x"FF",x"00",x"00",x"01",x"FF",x"01", -- 0x2128 + x"00",x"01",x"FF",x"01",x"00",x"01",x"00",x"01", -- 0x2130 + x"FF",x"01",x"00",x"01",x"00",x"01",x"00",x"01", -- 0x2138 + x"00",x"01",x"00",x"01",x"00",x"01",x"01",x"01", -- 0x2140 + x"00",x"01",x"00",x"01",x"01",x"01",x"00",x"01", -- 0x2148 + x"01",x"01",x"00",x"01",x"01",x"00",x"00",x"01", -- 0x2150 + x"01",x"01",x"01",x"00",x"00",x"01",x"01",x"00", -- 0x2158 + x"01",x"01",x"01",x"00",x"01",x"01",x"01",x"00", -- 0x2160 + x"01",x"00",x"01",x"01",x"01",x"00",x"01",x"00", -- 0x2168 + x"01",x"00",x"01",x"00",x"01",x"00",x"DD",x"35", -- 0x2170 + x"10",x"28",x"27",x"DD",x"6E",x"13",x"DD",x"66", -- 0x2178 + x"14",x"DD",x"7E",x"03",x"86",x"DD",x"77",x"03", -- 0x2180 + x"23",x"7E",x"23",x"DD",x"75",x"13",x"DD",x"74", -- 0x2188 + x"14",x"DD",x"CB",x"15",x"46",x"28",x"02",x"ED", -- 0x2190 + x"44",x"DD",x"86",x"04",x"DD",x"77",x"04",x"C3", -- 0x2198 + x"26",x"1E",x"DD",x"34",x"02",x"3A",x"1B",x"41", -- 0x21A0 + x"DD",x"77",x"05",x"DD",x"7E",x"04",x"DD",x"77", -- 0x21A8 + x"06",x"CD",x"F3",x"1E",x"DD",x"34",x"02",x"CD", -- 0x21B0 + x"26",x"1E",x"CD",x"8D",x"1D",x"D0",x"DD",x"34", -- 0x21B8 + x"02",x"3A",x"1C",x"41",x"0F",x"3E",x"01",x"30", -- 0x21C0 + x"1F",x"3E",x"03",x"18",x"1B",x"3A",x"04",x"40", -- 0x21C8 + x"47",x"3A",x"10",x"41",x"A7",x"28",x"07",x"3D", -- 0x21D0 + x"28",x"0A",x"3E",x"01",x"18",x"0A",x"3E",x"03", -- 0x21D8 + x"A0",x"3C",x"18",x"04",x"3E",x"01",x"A0",x"3C", -- 0x21E0 + x"DD",x"77",x"10",x"DD",x"34",x"02",x"3A",x"04", -- 0x21E8 + x"40",x"47",x"E6",x"70",x"FE",x"60",x"38",x"02", -- 0x21F0 + x"D6",x"20",x"C6",x"58",x"DD",x"77",x"05",x"78", -- 0x21F8 + x"FE",x"D0",x"38",x"02",x"D6",x"80",x"C6",x"18", -- 0x2200 + x"DD",x"77",x"06",x"CD",x"F3",x"1E",x"DD",x"34", -- 0x2208 + x"02",x"C9",x"CD",x"26",x"1E",x"CD",x"8D",x"1D", -- 0x2210 + x"D0",x"DD",x"34",x"02",x"DD",x"35",x"10",x"28", -- 0x2218 + x"07",x"DD",x"35",x"02",x"DD",x"35",x"02",x"C9", -- 0x2220 + x"DD",x"34",x"02",x"DD",x"36",x"02",x"04",x"3A", -- 0x2228 + x"00",x"42",x"0F",x"D0",x"3A",x"16",x"41",x"A7", -- 0x2230 + x"C8",x"ED",x"5F",x"E6",x"03",x"28",x"13",x"3D", -- 0x2238 + x"28",x"44",x"3D",x"28",x"72",x"3A",x"02",x"42", -- 0x2240 + x"FE",x"58",x"38",x"6B",x"FE",x"A8",x"38",x"02", -- 0x2248 + x"18",x"34",x"21",x"20",x"41",x"CD",x"11",x"23", -- 0x2250 + x"DA",x"E8",x"22",x"21",x"2C",x"41",x"CD",x"2D", -- 0x2258 + x"23",x"DA",x"E8",x"22",x"21",x"30",x"41",x"CD", -- 0x2260 + x"11",x"23",x"DA",x"E8",x"22",x"21",x"3C",x"41", -- 0x2268 + x"CD",x"2D",x"23",x"38",x"73",x"21",x"40",x"41", -- 0x2270 + x"CD",x"11",x"23",x"38",x"6B",x"21",x"4C",x"41", -- 0x2278 + x"CD",x"2D",x"23",x"38",x"63",x"C9",x"21",x"3C", -- 0x2280 + x"41",x"CD",x"2D",x"23",x"38",x"5A",x"21",x"30", -- 0x2288 + x"41",x"CD",x"11",x"23",x"38",x"52",x"21",x"4C", -- 0x2290 + x"41",x"CD",x"2D",x"23",x"38",x"4A",x"21",x"40", -- 0x2298 + x"41",x"CD",x"11",x"23",x"38",x"42",x"21",x"20", -- 0x22A0 + x"41",x"CD",x"11",x"23",x"38",x"3A",x"21",x"2C", -- 0x22A8 + x"41",x"CD",x"2D",x"23",x"38",x"32",x"C9",x"21", -- 0x22B0 + x"40",x"41",x"CD",x"11",x"23",x"38",x"29",x"21", -- 0x22B8 + x"4C",x"41",x"CD",x"2D",x"23",x"38",x"21",x"21", -- 0x22C0 + x"20",x"41",x"CD",x"11",x"23",x"38",x"19",x"21", -- 0x22C8 + x"2C",x"41",x"CD",x"2D",x"23",x"38",x"11",x"21", -- 0x22D0 + x"30",x"41",x"CD",x"11",x"23",x"38",x"09",x"21", -- 0x22D8 + x"3C",x"41",x"CD",x"2D",x"23",x"38",x"01",x"C9", -- 0x22E0 + x"CB",x"FE",x"7D",x"D6",x"20",x"DD",x"77",x"17", -- 0x22E8 + x"DD",x"36",x"18",x"01",x"87",x"5F",x"16",x"00", -- 0x22F0 + x"21",x"49",x"23",x"19",x"7E",x"D6",x"10",x"DD", -- 0x22F8 + x"77",x"05",x"23",x"7E",x"DD",x"77",x"06",x"CD", -- 0x2300 + x"F3",x"1E",x"DD",x"36",x"02",x"09",x"C3",x"A9", -- 0x2308 + x"23",x"11",x"0F",x"04",x"4A",x"42",x"CB",x"4E", -- 0x2310 + x"20",x"0D",x"7D",x"82",x"6F",x"10",x"F7",x"7D", -- 0x2318 + x"93",x"6F",x"0D",x"20",x"F0",x"A7",x"C9",x"A7", -- 0x2320 + x"CB",x"7E",x"C0",x"37",x"C9",x"11",x"11",x"04", -- 0x2328 + x"4A",x"42",x"CB",x"4E",x"20",x"0D",x"7D",x"92", -- 0x2330 + x"6F",x"10",x"F7",x"7D",x"83",x"6F",x"0D",x"20", -- 0x2338 + x"F0",x"A7",x"C9",x"A7",x"CB",x"7E",x"C0",x"37", -- 0x2340 + x"C9",x"E0",x"24",x"E4",x"24",x"E8",x"24",x"EC", -- 0x2348 + x"24",x"E0",x"2C",x"E4",x"2C",x"E8",x"2C",x"EC", -- 0x2350 + x"2C",x"E0",x"34",x"E4",x"34",x"E8",x"34",x"EC", -- 0x2358 + x"34",x"E0",x"3C",x"E4",x"3C",x"E8",x"3C",x"EC", -- 0x2360 + x"3C",x"E0",x"74",x"E4",x"74",x"E8",x"74",x"EC", -- 0x2368 + x"74",x"E0",x"7C",x"E4",x"7C",x"E8",x"7C",x"EC", -- 0x2370 + x"7C",x"E0",x"84",x"E4",x"84",x"E8",x"84",x"EC", -- 0x2378 + x"84",x"E0",x"8C",x"E4",x"8C",x"E8",x"8C",x"EC", -- 0x2380 + x"8C",x"E0",x"C4",x"E4",x"C4",x"E8",x"C4",x"EC", -- 0x2388 + x"C4",x"E0",x"CC",x"E4",x"CC",x"E8",x"CC",x"EC", -- 0x2390 + x"CC",x"E0",x"D4",x"E4",x"D4",x"E8",x"D4",x"EC", -- 0x2398 + x"D4",x"E0",x"DC",x"E4",x"DC",x"E8",x"DC",x"EC", -- 0x23A0 + x"DC",x"CD",x"26",x"1E",x"CD",x"8D",x"1D",x"D0", -- 0x23A8 + x"DD",x"34",x"02",x"DD",x"7E",x"05",x"C6",x"10", -- 0x23B0 + x"DD",x"77",x"05",x"CD",x"F3",x"1E",x"DD",x"34", -- 0x23B8 + x"02",x"CD",x"26",x"1E",x"CD",x"8D",x"1D",x"D0", -- 0x23C0 + x"DD",x"34",x"02",x"21",x"B0",x"58",x"CB",x"CE", -- 0x23C8 + x"21",x"A1",x"1E",x"DD",x"75",x"0C",x"DD",x"74", -- 0x23D0 + x"0D",x"DD",x"36",x"0E",x"01",x"DD",x"36",x"10", -- 0x23D8 + x"0F",x"DD",x"36",x"18",x"00",x"DD",x"36",x"19", -- 0x23E0 + x"01",x"DD",x"7E",x"17",x"C6",x"20",x"6F",x"26", -- 0x23E8 + x"41",x"36",x"00",x"21",x"16",x"41",x"35",x"DD", -- 0x23F0 + x"34",x"02",x"CD",x"26",x"1E",x"DD",x"35",x"10", -- 0x23F8 + x"C0",x"DD",x"34",x"02",x"DD",x"36",x"05",x"B8", -- 0x2400 + x"CD",x"F3",x"1E",x"DD",x"34",x"02",x"CD",x"26", -- 0x2408 + x"1E",x"CD",x"8D",x"1D",x"D0",x"DD",x"34",x"02", -- 0x2410 + x"3A",x"04",x"40",x"E6",x"03",x"3E",x"01",x"DD", -- 0x2418 + x"77",x"10",x"DD",x"34",x"02",x"CD",x"EE",x"21", -- 0x2420 + x"CD",x"26",x"1E",x"CD",x"8D",x"1D",x"D0",x"DD", -- 0x2428 + x"34",x"02",x"DD",x"35",x"10",x"28",x"07",x"DD", -- 0x2430 + x"35",x"02",x"DD",x"35",x"02",x"C9",x"DD",x"34", -- 0x2438 + x"02",x"3A",x"04",x"40",x"E6",x"03",x"21",x"50", -- 0x2440 + x"41",x"3D",x"28",x"09",x"21",x"80",x"41",x"3D", -- 0x2448 + x"28",x"03",x"21",x"B0",x"41",x"CD",x"7D",x"24", -- 0x2450 + x"DD",x"36",x"02",x"10",x"D0",x"DD",x"6E",x"17", -- 0x2458 + x"26",x"00",x"29",x"EB",x"21",x"D2",x"24",x"19", -- 0x2460 + x"7E",x"C6",x"10",x"DD",x"77",x"05",x"23",x"7E", -- 0x2468 + x"DD",x"77",x"06",x"CD",x"F3",x"1E",x"DD",x"36", -- 0x2470 + x"02",x"15",x"C3",x"F2",x"25",x"08",x"3E",x"01", -- 0x2478 + x"08",x"16",x"06",x"ED",x"5F",x"E6",x"07",x"4F", -- 0x2480 + x"87",x"47",x"87",x"80",x"85",x"6F",x"1E",x"08", -- 0x2488 + x"7B",x"91",x"47",x"7E",x"CB",x"46",x"20",x"24", -- 0x2490 + x"7D",x"C6",x"06",x"6F",x"1D",x"10",x"F4",x"7B", -- 0x2498 + x"A7",x"28",x"0A",x"7D",x"D6",x"30",x"6F",x"43", -- 0x24A0 + x"08",x"AF",x"08",x"18",x"E6",x"08",x"A7",x"28", -- 0x24A8 + x"04",x"7D",x"D6",x"30",x"6F",x"08",x"2C",x"15", -- 0x24B0 + x"20",x"D4",x"A7",x"C9",x"CB",x"4E",x"20",x"D8", -- 0x24B8 + x"A7",x"CB",x"7E",x"C0",x"CB",x"FE",x"7D",x"D6", -- 0x24C0 + x"50",x"DD",x"77",x"17",x"DD",x"36",x"18",x"02", -- 0x24C8 + x"37",x"C9",x"44",x"1C",x"48",x"1C",x"4C",x"1C", -- 0x24D0 + x"50",x"1C",x"54",x"1C",x"58",x"1C",x"44",x"24", -- 0x24D8 + x"48",x"24",x"4C",x"24",x"50",x"24",x"54",x"24", -- 0x24E0 + x"58",x"24",x"44",x"2C",x"48",x"2C",x"4C",x"2C", -- 0x24E8 + x"50",x"2C",x"54",x"2C",x"58",x"2C",x"44",x"34", -- 0x24F0 + x"48",x"34",x"4C",x"34",x"50",x"34",x"54",x"34", -- 0x24F8 + x"58",x"34",x"44",x"3C",x"48",x"3C",x"4C",x"3C", -- 0x2500 + x"50",x"3C",x"54",x"3C",x"58",x"3C",x"44",x"44", -- 0x2508 + x"48",x"44",x"4C",x"44",x"50",x"44",x"54",x"44", -- 0x2510 + x"58",x"44",x"44",x"4C",x"48",x"4C",x"4C",x"4C", -- 0x2518 + x"50",x"4C",x"54",x"4C",x"58",x"4C",x"44",x"54", -- 0x2520 + x"48",x"54",x"4C",x"54",x"50",x"54",x"54",x"54", -- 0x2528 + x"58",x"54",x"44",x"64",x"48",x"64",x"4C",x"64", -- 0x2530 + x"50",x"64",x"54",x"64",x"58",x"64",x"44",x"6C", -- 0x2538 + x"48",x"6C",x"4C",x"6C",x"50",x"6C",x"54",x"6C", -- 0x2540 + x"58",x"6C",x"44",x"74",x"48",x"74",x"4C",x"74", -- 0x2548 + x"50",x"74",x"54",x"74",x"58",x"74",x"44",x"7C", -- 0x2550 + x"48",x"7C",x"4C",x"7C",x"50",x"7C",x"54",x"7C", -- 0x2558 + x"58",x"7C",x"44",x"84",x"48",x"84",x"4C",x"84", -- 0x2560 + x"50",x"84",x"54",x"84",x"58",x"84",x"44",x"8C", -- 0x2568 + x"48",x"8C",x"4C",x"8C",x"50",x"8C",x"54",x"8C", -- 0x2570 + x"58",x"8C",x"44",x"94",x"48",x"94",x"4C",x"94", -- 0x2578 + x"50",x"94",x"54",x"94",x"58",x"94",x"44",x"9C", -- 0x2580 + x"48",x"9C",x"4C",x"9C",x"50",x"9C",x"54",x"9C", -- 0x2588 + x"58",x"9C",x"44",x"AC",x"48",x"AC",x"4C",x"AC", -- 0x2590 + x"50",x"AC",x"54",x"AC",x"58",x"AC",x"44",x"B4", -- 0x2598 + x"48",x"B4",x"4C",x"B4",x"50",x"B4",x"54",x"B4", -- 0x25A0 + x"58",x"B4",x"44",x"BC",x"48",x"BC",x"4C",x"BC", -- 0x25A8 + x"50",x"BC",x"54",x"BC",x"58",x"BC",x"44",x"C4", -- 0x25B0 + x"48",x"C4",x"4C",x"C4",x"50",x"C4",x"54",x"C4", -- 0x25B8 + x"58",x"C4",x"44",x"CC",x"48",x"CC",x"4C",x"CC", -- 0x25C0 + x"50",x"CC",x"54",x"CC",x"58",x"CC",x"44",x"D4", -- 0x25C8 + x"48",x"D4",x"4C",x"D4",x"50",x"D4",x"54",x"D4", -- 0x25D0 + x"58",x"D4",x"44",x"DC",x"48",x"DC",x"4C",x"DC", -- 0x25D8 + x"50",x"DC",x"54",x"DC",x"58",x"DC",x"44",x"E4", -- 0x25E0 + x"48",x"E4",x"4C",x"E4",x"50",x"E4",x"54",x"E4", -- 0x25E8 + x"58",x"E4",x"CD",x"26",x"1E",x"CD",x"8D",x"1D", -- 0x25F0 + x"D0",x"DD",x"34",x"02",x"DD",x"7E",x"05",x"D6", -- 0x25F8 + x"10",x"DD",x"77",x"05",x"CD",x"F3",x"1E",x"DD", -- 0x2600 + x"34",x"02",x"CD",x"26",x"1E",x"CD",x"8D",x"1D", -- 0x2608 + x"D0",x"DD",x"34",x"02",x"21",x"B0",x"58",x"CB", -- 0x2610 + x"C6",x"21",x"DE",x"1E",x"DD",x"75",x"0C",x"DD", -- 0x2618 + x"74",x"0D",x"DD",x"36",x"0E",x"01",x"DD",x"7E", -- 0x2620 + x"17",x"C6",x"50",x"6F",x"26",x"41",x"36",x"03", -- 0x2628 + x"DD",x"36",x"18",x"00",x"DD",x"36",x"19",x"00", -- 0x2630 + x"21",x"1A",x"41",x"35",x"DD",x"36",x"10",x"0F", -- 0x2638 + x"DD",x"34",x"02",x"CD",x"26",x"1E",x"DD",x"35", -- 0x2640 + x"10",x"C0",x"DD",x"36",x"02",x"02",x"C9",x"AF", -- 0x2648 + x"67",x"68",x"57",x"59",x"06",x"08",x"CB",x"FF", -- 0x2650 + x"07",x"29",x"A7",x"ED",x"52",x"38",x"03",x"10", -- 0x2658 + x"F5",x"C9",x"19",x"CB",x"87",x"10",x"EF",x"C9", -- 0x2660 + x"AF",x"32",x"B0",x"58",x"32",x"D0",x"58",x"32", -- 0x2668 + x"E0",x"58",x"21",x"B8",x"40",x"35",x"C0",x"2D", -- 0x2670 + x"3A",x"1C",x"41",x"47",x"0F",x"38",x"13",x"3A", -- 0x2678 + x"1A",x"41",x"FE",x"2C",x"30",x"34",x"78",x"A7", -- 0x2680 + x"20",x"30",x"3E",x"01",x"32",x"1C",x"41",x"36", -- 0x2688 + x"02",x"C9",x"AF",x"32",x"1C",x"41",x"11",x"88", -- 0x2690 + x"06",x"FF",x"36",x"07",x"26",x"40",x"2E",x"AE", -- 0x2698 + x"36",x"20",x"2E",x"BF",x"36",x"12",x"3A",x"09", -- 0x26A0 + x"42",x"3C",x"32",x"09",x"42",x"FE",x"7F",x"C0", -- 0x26A8 + x"AF",x"32",x"09",x"42",x"26",x"40",x"2E",x"A1", -- 0x26B0 + x"34",x"C9",x"34",x"C9",x"21",x"10",x"41",x"34", -- 0x26B8 + x"21",x"14",x"41",x"34",x"11",x"00",x"07",x"FF", -- 0x26C0 + x"21",x"96",x"10",x"11",x"04",x"41",x"01",x"0C", -- 0x26C8 + x"00",x"ED",x"B0",x"21",x"11",x"41",x"36",x"2E", -- 0x26D0 + x"23",x"36",x"00",x"21",x"89",x"1B",x"22",x"07", -- 0x26D8 + x"42",x"21",x"B7",x"40",x"36",x"15",x"3A",x"15", -- 0x26E0 + x"41",x"0F",x"D8",x"36",x"13",x"3A",x"13",x"41", -- 0x26E8 + x"0F",x"D0",x"3E",x"01",x"32",x"15",x"41",x"C9", -- 0x26F0 + x"21",x"B7",x"40",x"34",x"2C",x"36",x"01",x"23", -- 0x26F8 + x"36",x"01",x"C9",x"21",x"B9",x"40",x"35",x"C0", -- 0x2700 + x"36",x"01",x"21",x"B7",x"40",x"34",x"C9",x"21", -- 0x2708 + x"B9",x"40",x"35",x"C0",x"36",x"10",x"21",x"20", -- 0x2710 + x"41",x"3A",x"15",x"41",x"0F",x"3E",x"00",x"38", -- 0x2718 + x"02",x"3E",x"02",x"06",x"30",x"D7",x"21",x"B7", -- 0x2720 + x"40",x"34",x"C9",x"21",x"B9",x"40",x"35",x"C0", -- 0x2728 + x"2D",x"36",x"00",x"3E",x"30",x"32",x"16",x"41", -- 0x2730 + x"21",x"10",x"41",x"34",x"21",x"14",x"41",x"34", -- 0x2738 + x"11",x"00",x"07",x"FF",x"11",x"08",x"06",x"3A", -- 0x2740 + x"15",x"41",x"0F",x"D4",x"38",x"00",x"21",x"72", -- 0x2748 + x"27",x"11",x"04",x"41",x"01",x"06",x"00",x"ED", -- 0x2750 + x"B0",x"21",x"11",x"41",x"36",x"18",x"2C",x"36", -- 0x2758 + x"16",x"21",x"B7",x"40",x"36",x"15",x"3A",x"15", -- 0x2760 + x"41",x"0F",x"D8",x"36",x"13",x"C9",x"2D",x"36", -- 0x2768 + x"03",x"C9",x"10",x"68",x"64",x"64",x"68",x"10", -- 0x2770 + x"C9",x"21",x"00",x"41",x"36",x"00",x"2C",x"34", -- 0x2778 + x"7E",x"47",x"2F",x"C6",x"80",x"32",x"2A",x"40", -- 0x2780 + x"32",x"2C",x"40",x"78",x"FE",x"FF",x"C0",x"36", -- 0x2788 + x"80",x"21",x"B7",x"40",x"34",x"16",x"01",x"FF", -- 0x2790 + x"23",x"36",x"19",x"3A",x"09",x"42",x"3C",x"32", -- 0x2798 + x"09",x"42",x"FE",x"7F",x"C0",x"AF",x"32",x"09", -- 0x27A0 + x"42",x"3E",x"01",x"32",x"0A",x"40",x"C9",x"21", -- 0x27A8 + x"B8",x"40",x"35",x"C0",x"3E",x"F7",x"32",x"BB", -- 0x27B0 + x"40",x"2F",x"32",x"38",x"40",x"32",x"3A",x"40", -- 0x27B8 + x"21",x"B7",x"40",x"34",x"21",x"A0",x"58",x"CB", -- 0x27C0 + x"D6",x"11",x"09",x"06",x"FF",x"3A",x"09",x"42", -- 0x27C8 + x"3C",x"32",x"09",x"42",x"FE",x"7F",x"C0",x"AF", -- 0x27D0 + x"32",x"09",x"42",x"21",x"1A",x"41",x"34",x"C9", -- 0x27D8 + x"21",x"BA",x"40",x"36",x"01",x"2C",x"35",x"7E", -- 0x27E0 + x"47",x"2F",x"C6",x"80",x"32",x"38",x"40",x"32", -- 0x27E8 + x"3A",x"40",x"78",x"FE",x"80",x"C0",x"11",x"89", -- 0x27F0 + x"06",x"FF",x"E5",x"21",x"A0",x"58",x"CB",x"96", -- 0x27F8 + x"E1",x"16",x"40",x"23",x"1E",x"BF",x"36",x"00", -- 0x2800 + x"21",x"B7",x"40",x"34",x"C9",x"CD",x"C5",x"17", -- 0x2808 + x"CD",x"1F",x"18",x"CD",x"DC",x"18",x"21",x"BC", -- 0x2810 + x"40",x"7E",x"2D",x"0F",x"38",x"08",x"35",x"7E", -- 0x2818 + x"FE",x"27",x"38",x"13",x"18",x"06",x"34",x"7E", -- 0x2820 + x"FE",x"D9",x"30",x"0B",x"2F",x"C6",x"80",x"32", -- 0x2828 + x"38",x"40",x"32",x"3A",x"40",x"18",x"02",x"2C", -- 0x2830 + x"34",x"CD",x"6A",x"28",x"38",x"13",x"3A",x"BC", -- 0x2838 + x"40",x"FE",x"0A",x"C0",x"AF",x"32",x"9D",x"40", -- 0x2840 + x"11",x"89",x"06",x"FF",x"21",x"B7",x"40",x"34", -- 0x2848 + x"C9",x"21",x"E0",x"58",x"CB",x"C6",x"AF",x"32", -- 0x2850 + x"9D",x"40",x"11",x"89",x"06",x"FF",x"21",x"B7", -- 0x2858 + x"40",x"36",x"0D",x"2C",x"36",x"0A",x"2C",x"36", -- 0x2860 + x"06",x"C9",x"21",x"7C",x"42",x"7E",x"0F",x"D0", -- 0x2868 + x"23",x"3A",x"BB",x"40",x"C6",x"02",x"96",x"FE", -- 0x2870 + x"05",x"D0",x"2C",x"2C",x"7E",x"FE",x"6E",x"D0", -- 0x2878 + x"FE",x"69",x"3F",x"C9",x"AF",x"32",x"BA",x"40", -- 0x2880 + x"32",x"7C",x"42",x"21",x"BB",x"40",x"35",x"7E", -- 0x2888 + x"47",x"2F",x"C6",x"80",x"32",x"38",x"40",x"32", -- 0x2890 + x"3A",x"40",x"78",x"FE",x"08",x"C0",x"CD",x"62", -- 0x2898 + x"2A",x"21",x"B7",x"40",x"34",x"2C",x"36",x"64", -- 0x28A0 + x"C9",x"21",x"B8",x"40",x"35",x"C0",x"3E",x"01", -- 0x28A8 + x"32",x"00",x"41",x"32",x"B7",x"40",x"C9",x"21", -- 0x28B0 + x"B8",x"40",x"35",x"C0",x"E5",x"21",x"E0",x"58", -- 0x28B8 + x"CB",x"C6",x"E1",x"AF",x"32",x"BA",x"40",x"32", -- 0x28C0 + x"7C",x"42",x"36",x"0A",x"CD",x"62",x"2A",x"2D", -- 0x28C8 + x"34",x"C9",x"21",x"B8",x"40",x"35",x"C0",x"36", -- 0x28D0 + x"0A",x"CD",x"75",x"2A",x"2D",x"34",x"C9",x"21", -- 0x28D8 + x"B9",x"40",x"35",x"20",x"17",x"CD",x"62",x"2A", -- 0x28E0 + x"11",x"AB",x"40",x"AF",x"12",x"1C",x"12",x"1C", -- 0x28E8 + x"12",x"E5",x"CD",x"31",x"29",x"E1",x"36",x"64", -- 0x28F0 + x"2D",x"2D",x"34",x"C9",x"2D",x"2D",x"36",x"0D", -- 0x28F8 + x"C9",x"21",x"B9",x"40",x"35",x"C0",x"11",x"8A", -- 0x2900 + x"06",x"FF",x"36",x"0A",x"2D",x"2D",x"34",x"C9", -- 0x2908 + x"21",x"B9",x"40",x"35",x"C0",x"36",x"0A",x"CD", -- 0x2910 + x"9B",x"2A",x"38",x"0C",x"CD",x"31",x"29",x"CD", -- 0x2918 + x"AD",x"2A",x"21",x"E0",x"58",x"CB",x"CE",x"C9", -- 0x2920 + x"21",x"B7",x"40",x"34",x"2C",x"2C",x"36",x"46", -- 0x2928 + x"C9",x"3A",x"BC",x"40",x"47",x"3E",x"0A",x"90", -- 0x2930 + x"07",x"07",x"07",x"07",x"E6",x"F0",x"00",x"00", -- 0x2938 + x"21",x"AB",x"40",x"86",x"27",x"77",x"23",x"3E", -- 0x2940 + x"00",x"8E",x"27",x"77",x"2D",x"7E",x"E6",x"0F", -- 0x2948 + x"32",x"CD",x"51",x"7E",x"0F",x"0F",x"0F",x"0F", -- 0x2950 + x"E6",x"0F",x"32",x"ED",x"51",x"2C",x"7E",x"E6", -- 0x2958 + x"F0",x"28",x"0E",x"0F",x"0F",x"0F",x"0F",x"32", -- 0x2960 + x"2D",x"52",x"7E",x"E6",x"0F",x"32",x"0D",x"52", -- 0x2968 + x"C9",x"7E",x"E6",x"0F",x"C8",x"32",x"0D",x"52", -- 0x2970 + x"C9",x"21",x"B9",x"40",x"35",x"C0",x"11",x"8A", -- 0x2978 + x"06",x"FF",x"11",x"00",x"03",x"FF",x"2D",x"2D", -- 0x2980 + x"3E",x"01",x"77",x"32",x"00",x"41",x"AF",x"32", -- 0x2988 + x"16",x"41",x"C9",x"11",x"65",x"06",x"3A",x"13", -- 0x2990 + x"41",x"0F",x"38",x"11",x"3A",x"14",x"41",x"FE", -- 0x2998 + x"05",x"20",x"05",x"3E",x"04",x"32",x"14",x"41", -- 0x29A0 + x"C6",x"20",x"F6",x"40",x"5F",x"FF",x"21",x"B8", -- 0x29A8 + x"40",x"36",x"00",x"2D",x"34",x"C9",x"21",x"B8", -- 0x29B0 + x"40",x"35",x"C0",x"11",x"A5",x"06",x"FF",x"3E", -- 0x29B8 + x"05",x"32",x"0A",x"40",x"C9",x"21",x"B9",x"40", -- 0x29C0 + x"36",x"08",x"2D",x"36",x"32",x"2D",x"34",x"E5", -- 0x29C8 + x"21",x"A0",x"58",x"CB",x"DE",x"E1",x"11",x"26", -- 0x29D0 + x"06",x"FF",x"AF",x"32",x"3A",x"40",x"C9",x"21", -- 0x29D8 + x"B8",x"40",x"35",x"C0",x"36",x"0F",x"11",x"27", -- 0x29E0 + x"06",x"FF",x"11",x"26",x"06",x"FF",x"2D",x"34", -- 0x29E8 + x"C9",x"21",x"B8",x"40",x"35",x"C0",x"36",x"0F", -- 0x29F0 + x"E5",x"21",x"A0",x"58",x"CB",x"9E",x"E1",x"11", -- 0x29F8 + x"A7",x"06",x"FF",x"11",x"A6",x"06",x"FF",x"2D", -- 0x2A00 + x"34",x"C9",x"21",x"B9",x"40",x"35",x"28",x"05", -- 0x2A08 + x"2D",x"2D",x"36",x"16",x"C9",x"21",x"96",x"10", -- 0x2A10 + x"11",x"04",x"41",x"01",x"0C",x"00",x"ED",x"B0", -- 0x2A18 + x"21",x"B2",x"10",x"11",x"20",x"41",x"01",x"C0", -- 0x2A20 + x"00",x"ED",x"B0",x"11",x"60",x"06",x"FF",x"AF", -- 0x2A28 + x"21",x"13",x"41",x"77",x"2C",x"77",x"2C",x"77", -- 0x2A30 + x"32",x"12",x"41",x"32",x"1C",x"41",x"32",x"16", -- 0x2A38 + x"41",x"3E",x"2E",x"32",x"11",x"41",x"3E",x"60", -- 0x2A40 + x"32",x"1A",x"41",x"21",x"B7",x"40",x"34",x"2C", -- 0x2A48 + x"36",x"00",x"C9",x"21",x"B8",x"40",x"35",x"C0", -- 0x2A50 + x"11",x"A0",x"06",x"FF",x"3E",x"05",x"32",x"0A", -- 0x2A58 + x"40",x"C9",x"E5",x"06",x"06",x"21",x"AC",x"51", -- 0x2A60 + x"11",x"1F",x"00",x"36",x"10",x"23",x"36",x"10", -- 0x2A68 + x"19",x"10",x"F8",x"E1",x"C9",x"E5",x"06",x"06", -- 0x2A70 + x"21",x"AC",x"51",x"11",x"20",x"00",x"DD",x"21", -- 0x2A78 + x"D8",x"02",x"DD",x"7E",x"00",x"77",x"19",x"DD", -- 0x2A80 + x"23",x"10",x"F7",x"06",x"06",x"21",x"AD",x"51", -- 0x2A88 + x"DD",x"7E",x"00",x"77",x"19",x"DD",x"23",x"10", -- 0x2A90 + x"F7",x"E1",x"C9",x"06",x"30",x"21",x"20",x"41", -- 0x2A98 + x"CB",x"4E",x"20",x"05",x"23",x"10",x"F9",x"37", -- 0x2AA0 + x"C9",x"CB",x"8E",x"A7",x"C9",x"21",x"55",x"41", -- 0x2AA8 + x"11",x"06",x"00",x"4B",x"06",x"18",x"CB",x"4E", -- 0x2AB0 + x"20",x"0B",x"19",x"10",x"F9",x"7D",x"D6",x"91", -- 0x2AB8 + x"6F",x"0D",x"20",x"F0",x"C9",x"36",x"01",x"21", -- 0x2AC0 + x"1A",x"41",x"34",x"C9",x"3E",x"03",x"32",x"06", -- 0x2AC8 + x"68",x"0F",x"32",x"07",x"68",x"3A",x"F3",x"58", -- 0x2AD0 + x"32",x"05",x"68",x"0F",x"32",x"03",x"68",x"0F", -- 0x2AD8 + x"32",x"00",x"68",x"32",x"01",x"68",x"32",x"02", -- 0x2AE0 + x"68",x"21",x"A0",x"42",x"11",x"20",x"00",x"06", -- 0x2AE8 + x"08",x"AF",x"B6",x"19",x"10",x"FC",x"0F",x"38", -- 0x2AF0 + x"05",x"21",x"C0",x"58",x"CB",x"96",x"21",x"B1", -- 0x2AF8 + x"2D",x"DD",x"21",x"C0",x"58",x"FD",x"21",x"F3", -- 0x2B00 + x"58",x"CD",x"36",x"2D",x"21",x"E1",x"2D",x"DD", -- 0x2B08 + x"21",x"90",x"58",x"FD",x"21",x"F1",x"58",x"CD", -- 0x2B10 + x"1A",x"2C",x"21",x"F1",x"2D",x"DD",x"21",x"B0", -- 0x2B18 + x"58",x"FD",x"21",x"F0",x"58",x"CD",x"1A",x"2C", -- 0x2B20 + x"21",x"11",x"2E",x"DD",x"21",x"E0",x"58",x"FD", -- 0x2B28 + x"21",x"F5",x"58",x"CD",x"1A",x"2C",x"21",x"B2", -- 0x2B30 + x"2D",x"DD",x"21",x"A0",x"58",x"FD",x"21",x"F2", -- 0x2B38 + x"58",x"CD",x"92",x"2B",x"06",x"00",x"21",x"F5", -- 0x2B40 + x"58",x"CD",x"6D",x"2B",x"21",x"F6",x"58",x"CD", -- 0x2B48 + x"6D",x"2B",x"21",x"F0",x"58",x"CD",x"6D",x"2B", -- 0x2B50 + x"21",x"F2",x"58",x"CD",x"6D",x"2B",x"21",x"F1", -- 0x2B58 + x"58",x"CD",x"6D",x"2B",x"CB",x"40",x"C0",x"3E", -- 0x2B60 + x"FF",x"32",x"00",x"78",x"C9",x"7E",x"A7",x"C8", -- 0x2B68 + x"CB",x"C0",x"32",x"00",x"78",x"C9",x"85",x"6F", -- 0x2B70 + x"3E",x"00",x"8C",x"67",x"7E",x"C9",x"78",x"87", -- 0x2B78 + x"CD",x"76",x"2B",x"5F",x"23",x"56",x"EB",x"C9", -- 0x2B80 + x"E1",x"87",x"CD",x"76",x"2B",x"5F",x"23",x"56", -- 0x2B88 + x"EB",x"E9",x"DD",x"7E",x"00",x"A7",x"CA",x"20", -- 0x2B90 + x"2C",x"4F",x"06",x"08",x"1E",x"80",x"7B",x"A1", -- 0x2B98 + x"20",x"05",x"CB",x"3B",x"10",x"F8",x"C9",x"DD", -- 0x2BA0 + x"7E",x"02",x"A3",x"20",x"09",x"DD",x"73",x"02", -- 0x2BA8 + x"05",x"CD",x"7E",x"2B",x"18",x"0C",x"DD",x"35", -- 0x2BB0 + x"0C",x"C2",x"13",x"2C",x"DD",x"6E",x"06",x"DD", -- 0x2BB8 + x"66",x"07",x"7E",x"23",x"DD",x"75",x"06",x"DD", -- 0x2BC0 + x"74",x"07",x"FE",x"F0",x"38",x"2A",x"21",x"BC", -- 0x2BC8 + x"2B",x"E5",x"E6",x"0F",x"CD",x"88",x"2B",x"14", -- 0x2BD0 + x"2D",x"24",x"2D",x"F7",x"2B",x"F7",x"2B",x"F7", -- 0x2BD8 + x"2B",x"F7",x"2B",x"F7",x"2B",x"F7",x"2B",x"F7", -- 0x2BE0 + x"2B",x"F7",x"2B",x"F7",x"2B",x"F7",x"2B",x"F7", -- 0x2BE8 + x"2B",x"F7",x"2B",x"F7",x"2B",x"A0",x"2D",x"C9", -- 0x2BF0 + x"47",x"07",x"07",x"07",x"E6",x"07",x"21",x"BA", -- 0x2BF8 + x"2D",x"CD",x"76",x"2B",x"DD",x"77",x"0C",x"78", -- 0x2C00 + x"E6",x"1F",x"21",x"C2",x"2D",x"CD",x"76",x"2B", -- 0x2C08 + x"DD",x"77",x"0E",x"DD",x"7E",x"0E",x"FD",x"77", -- 0x2C10 + x"00",x"C9",x"DD",x"7E",x"00",x"A7",x"20",x"23", -- 0x2C18 + x"DD",x"7E",x"02",x"A7",x"3E",x"00",x"FD",x"77", -- 0x2C20 + x"00",x"C8",x"DD",x"36",x"00",x"00",x"DD",x"36", -- 0x2C28 + x"02",x"00",x"DD",x"36",x"0D",x"00",x"DD",x"36", -- 0x2C30 + x"0E",x"00",x"DD",x"36",x"0F",x"00",x"FD",x"36", -- 0x2C38 + x"00",x"00",x"C9",x"4F",x"06",x"08",x"1E",x"80", -- 0x2C40 + x"7B",x"A1",x"20",x"05",x"CB",x"3B",x"10",x"F8", -- 0x2C48 + x"C9",x"DD",x"7E",x"02",x"A3",x"20",x"3F",x"DD", -- 0x2C50 + x"73",x"02",x"05",x"78",x"07",x"07",x"07",x"4F", -- 0x2C58 + x"06",x"00",x"E5",x"09",x"DD",x"E5",x"D1",x"13", -- 0x2C60 + x"13",x"13",x"01",x"08",x"00",x"ED",x"B0",x"E1", -- 0x2C68 + x"DD",x"7E",x"06",x"E6",x"7F",x"DD",x"77",x"0C", -- 0x2C70 + x"DD",x"7E",x"04",x"DD",x"77",x"0E",x"DD",x"7E", -- 0x2C78 + x"09",x"47",x"0F",x"0F",x"0F",x"0F",x"E6",x"0F", -- 0x2C80 + x"DD",x"77",x"0B",x"E6",x"08",x"20",x"07",x"DD", -- 0x2C88 + x"70",x"0F",x"DD",x"36",x"0D",x"00",x"DD",x"35", -- 0x2C90 + x"0C",x"20",x"5A",x"DD",x"7E",x"08",x"A7",x"28", -- 0x2C98 + x"10",x"DD",x"35",x"08",x"20",x"0B",x"7B",x"2F", -- 0x2CA0 + x"DD",x"A6",x"00",x"DD",x"77",x"00",x"C3",x"1A", -- 0x2CA8 + x"2C",x"DD",x"7E",x"06",x"E6",x"7F",x"DD",x"77", -- 0x2CB0 + x"0C",x"DD",x"CB",x"06",x"7E",x"28",x"16",x"DD", -- 0x2CB8 + x"7E",x"05",x"ED",x"44",x"DD",x"77",x"05",x"DD", -- 0x2CC0 + x"CB",x"0D",x"46",x"DD",x"CB",x"0D",x"C6",x"28", -- 0x2CC8 + x"24",x"DD",x"CB",x"0D",x"86",x"DD",x"7E",x"04", -- 0x2CD0 + x"DD",x"86",x"07",x"DD",x"77",x"04",x"DD",x"77", -- 0x2CD8 + x"0E",x"DD",x"7E",x"09",x"DD",x"86",x"0A",x"DD", -- 0x2CE0 + x"77",x"09",x"47",x"DD",x"7E",x"0B",x"E6",x"08", -- 0x2CE8 + x"20",x"03",x"DD",x"70",x"0F",x"DD",x"7E",x"0E", -- 0x2CF0 + x"DD",x"86",x"05",x"DD",x"77",x"0E",x"6F",x"26", -- 0x2CF8 + x"00",x"DD",x"7E",x"03",x"E6",x"70",x"28",x"08", -- 0x2D00 + x"0F",x"0F",x"0F",x"0F",x"47",x"29",x"10",x"FD", -- 0x2D08 + x"FD",x"75",x"00",x"C9",x"DD",x"6E",x"06",x"DD", -- 0x2D10 + x"66",x"07",x"7E",x"DD",x"77",x"06",x"23",x"7E", -- 0x2D18 + x"DD",x"77",x"07",x"C9",x"DD",x"6E",x"06",x"DD", -- 0x2D20 + x"66",x"07",x"7E",x"23",x"DD",x"75",x"06",x"DD", -- 0x2D28 + x"74",x"07",x"32",x"F4",x"58",x"C9",x"CD",x"40", -- 0x2D30 + x"2D",x"CD",x"64",x"2D",x"CD",x"88",x"2D",x"C9", -- 0x2D38 + x"DD",x"7E",x"00",x"CB",x"47",x"28",x"0A",x"DD", -- 0x2D40 + x"CB",x"00",x"86",x"3E",x"08",x"DD",x"77",x"01", -- 0x2D48 + x"C9",x"DD",x"7E",x"01",x"A7",x"28",x"08",x"DD", -- 0x2D50 + x"35",x"01",x"FD",x"CB",x"00",x"C6",x"C9",x"FD", -- 0x2D58 + x"CB",x"00",x"86",x"C9",x"DD",x"7E",x"00",x"CB", -- 0x2D60 + x"4F",x"28",x"0A",x"DD",x"CB",x"00",x"8E",x"3E", -- 0x2D68 + x"1D",x"DD",x"77",x"02",x"C9",x"DD",x"7E",x"02", -- 0x2D70 + x"A7",x"28",x"08",x"DD",x"35",x"02",x"FD",x"CB", -- 0x2D78 + x"00",x"CE",x"C9",x"FD",x"CB",x"00",x"8E",x"C9", -- 0x2D80 + x"DD",x"7E",x"00",x"CB",x"57",x"28",x"0C",x"3A", -- 0x2D88 + x"A0",x"58",x"CB",x"47",x"20",x"05",x"FD",x"CB", -- 0x2D90 + x"00",x"D6",x"C9",x"FD",x"CB",x"00",x"96",x"C9", -- 0x2D98 + x"DD",x"7E",x"02",x"2F",x"DD",x"A6",x"00",x"AF", -- 0x2DA0 + x"FD",x"77",x"00",x"DD",x"77",x"00",x"C3",x"20", -- 0x2DA8 + x"2C",x"00",x"21",x"2E",x"40",x"2E",x"6F",x"2E", -- 0x2DB0 + x"85",x"2E",x"01",x"02",x"04",x"08",x"10",x"20", -- 0x2DB8 + x"40",x"00",x"FF",x"00",x"40",x"55",x"5F",x"68", -- 0x2DC0 + x"70",x"80",x"8E",x"9A",x"A0",x"AA",x"B4",x"B8", -- 0x2DC8 + x"C0",x"C7",x"CD",x"D0",x"D5",x"DA",x"DC",x"E0", -- 0x2DD0 + x"1C",x"35",x"87",x"A5",x"C4",x"D3",x"CA",x"E3", -- 0x2DD8 + x"E6",x"20",x"40",x"10",x"87",x"00",x"0A",x"FF", -- 0x2DE0 + x"FF",x"40",x"20",x"FF",x"90",x"00",x"01",x"FF", -- 0x2DE8 + x"FF",x"40",x"20",x"FB",x"87",x"00",x"01",x"FF", -- 0x2DF0 + x"FF",x"40",x"20",x"FB",x"87",x"00",x"01",x"FF", -- 0x2DF8 + x"FF",x"20",x"70",x"FB",x"87",x"00",x"02",x"FF", -- 0x2E00 + x"FF",x"20",x"70",x"FB",x"87",x"00",x"02",x"FF", -- 0x2E08 + x"FF",x"80",x"20",x"F4",x"87",x"FE",x"10",x"FF", -- 0x2E10 + x"FF",x"80",x"20",x"F4",x"87",x"04",x"01",x"FF", -- 0x2E18 + x"FF",x"68",x"00",x"68",x"6A",x"6C",x"8B",x"88", -- 0x2E20 + x"00",x"68",x"00",x"68",x"67",x"6A",x"88",x"88", -- 0x2E28 + x"00",x"68",x"00",x"68",x"6A",x"6C",x"8B",x"8F", -- 0x2E30 + x"6E",x"00",x"6E",x"6C",x"6A",x"8F",x"8F",x"FF", -- 0x2E38 + x"80",x"6C",x"6B",x"8C",x"6B",x"6A",x"8B",x"6A", -- 0x2E40 + x"69",x"8A",x"69",x"68",x"89",x"65",x"67",x"88", -- 0x2E48 + x"4A",x"00",x"4A",x"00",x"4A",x"88",x"6C",x"6B", -- 0x2E50 + x"8C",x"6B",x"6A",x"8B",x"6A",x"69",x"8A",x"69", -- 0x2E58 + x"68",x"89",x"65",x"67",x"88",x"4A",x"00",x"4A", -- 0x2E60 + x"00",x"4A",x"88",x"A0",x"A0",x"10",x"FF",x"80", -- 0x2E68 + x"60",x"69",x"00",x"69",x"00",x"69",x"87",x"87", -- 0x2E70 + x"87",x"68",x"00",x"68",x"00",x"68",x"86",x"86", -- 0x2E78 + x"86",x"A0",x"A0",x"10",x"FF",x"65",x"67",x"67", -- 0x2E80 + x"65",x"68",x"87",x"00",x"87",x"60",x"65",x"68", -- 0x2E88 + x"00",x"68",x"65",x"69",x"88",x"00",x"88",x"60", -- 0x2E90 + x"A0",x"A0",x"A0",x"A0",x"A0",x"10",x"FF",x"FF", -- 0x2E98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2ED0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2ED8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3000 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3008 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3010 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3018 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3020 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3028 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3030 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3038 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3040 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3048 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3050 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3058 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3060 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3068 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3070 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3080 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3088 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3090 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3098 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3100 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3108 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3110 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3118 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3120 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3128 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3130 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3138 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3140 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3148 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3150 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3190 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3200 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3208 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3210 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3218 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3220 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3228 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3230 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3238 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3240 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3248 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3250 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3270 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3290 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3298 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3300 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3308 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3310 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3318 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3320 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3328 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3330 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3338 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3340 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3348 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3350 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3358 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3360 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3368 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3378 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3380 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3388 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3390 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3398 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3400 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3408 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3410 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3418 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3420 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3428 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3430 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3438 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3440 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3448 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3450 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3458 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3460 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3468 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3470 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3478 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3480 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3488 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3490 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3498 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3500 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3510 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3518 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3520 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3530 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3538 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3540 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3550 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3558 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3560 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3570 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3580 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3588 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3590 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3608 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3610 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3620 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3628 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3630 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3638 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3640 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3648 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3650 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3658 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3660 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3668 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3670 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3678 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3688 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3690 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3698 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3700 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3708 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3710 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3718 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3720 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3728 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3730 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3738 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3740 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3748 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3750 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3758 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3760 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3768 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3770 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3778 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3780 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3788 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3790 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3798 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3800 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3808 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3810 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3818 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3820 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3828 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3830 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3838 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3840 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3848 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3850 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3858 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3860 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3868 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3870 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3878 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3880 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3888 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3890 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3898 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3900 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3908 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3910 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3918 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3920 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3928 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3930 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3938 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3940 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3948 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3950 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3958 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3960 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3968 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3970 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3978 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3980 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3988 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3990 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3998 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3ED0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3ED8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x3FF8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/build_id.tcl b/Arcade/Galaxian Hardware/Omega_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_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/Arcade/Galaxian Hardware/Omega_MiST/rtl/build_id.v b/Arcade/Galaxian Hardware/Omega_MiST/rtl/build_id.v new file mode 100644 index 00000000..af3dbbfc --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180108" +`define BUILD_TIME "213858" diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c07d2629 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1093 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..6bd576cf --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..ee217402 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2026 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..679730ab --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80as.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80as.vhd new file mode 100644 index 00000000..fe477f50 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/cpu/T80as.vhd @@ -0,0 +1,283 @@ +------------------------------------------------------------------------------ +-- t80as.vhd : The non-tristate signal edition of t80a.vhd +-- +-- 2003.2.7 non-tristate modification by Tatsuyuki Satoh +-- +-- 1.separate 'D' to 'DO' and 'DI'. +-- 2.added 'DOE' to 'DO' enable signal.(data direction) +-- 3.MREQ_n,IORQ_n,RD_n,WR_n,RFSH_n,A doesn't become the condition of 'Z'. +-- +-- There is a mark of "--AS" in all the change points. +-- +------------------------------------------------------------------------------ + +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80as is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); +--AS-- D : inout std_logic_vector(7 downto 0) +--AS>> + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + DOE : out std_logic +--< 'Z'); +--AS-- D <= DO when Write = '1' and BUSAK_n_i = '1' else (others => 'Z'); +--AS>> + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DOE <= Write when BUSAK_n_i = '1' else '0'; +--< Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, +-- DInst => D, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then +--AS-- DI_Reg <= to_x01(D); +--AS>> + DI_Reg <= to_x01(DI); +--< 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/dac.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/dac.vhd new file mode 100644 index 00000000..b1ecdcb7 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_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 := 11 + ); + 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/Arcade/Galaxian Hardware/Omega_MiST/rtl/dpram.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..dafe8385 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/galaxian.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/galaxian.vhd new file mode 100644 index 00000000..5f8a3a74 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/galaxian.vhd @@ -0,0 +1,446 @@ +------------------------------------------------------------------------------ +-- FPGA GALAXIAN +-- +-- Version downto 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important not +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +-- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--use work.pkg_galaxian.all; + +entity galaxian is + port( + W_CLK_18M : in std_logic; + W_CLK_12M : in std_logic; + W_CLK_6M : in std_logic; + + P1_CSJUDLR : in std_logic_vector(6 downto 0); + P2_CSJUDLR : in std_logic_vector(6 downto 0); + I_RESET : in std_logic; + + W_R : out std_logic_vector(2 downto 0); + W_G : out std_logic_vector(2 downto 0); + W_B : out std_logic_vector(2 downto 0); + HBLANK : out std_logic; + VBLANK : out std_logic; + W_H_SYNC : out std_logic; + W_V_SYNC : out std_logic; + W_SDAT_A : out std_logic_vector( 7 downto 0); + W_SDAT_B : out std_logic_vector( 7 downto 0); + O_CMPBL : out std_logic + ); +end; + +architecture RTL of galaxian is + -- CPU ADDRESS BUS + signal W_A : std_logic_vector(15 downto 0) := (others => '0'); + -- CPU IF + signal W_CPU_CLK : std_logic := '0'; + signal W_CPU_MREQn : std_logic := '0'; + signal W_CPU_NMIn : std_logic := '0'; + signal W_CPU_RDn : std_logic := '0'; + signal W_CPU_RFSHn : std_logic := '0'; + signal W_CPU_WAITn : std_logic := '0'; + signal W_CPU_WRn : std_logic := '0'; + signal W_CPU_WR : std_logic := '0'; + signal W_RESETn : std_logic := '0'; + -------- H and V COUNTER ------------------------- + signal W_C_BLn : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_C_BLXn : std_logic := '0'; + signal W_H_BL : std_logic := '0'; + signal W_H_SYNC_int : std_logic := '0'; + signal W_V_BLn : std_logic := '0'; + signal W_V_BL2n : std_logic := '0'; + signal W_V_SYNC_int : std_logic := '0'; + signal W_H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal W_V_CNT : std_logic_vector(7 downto 0) := (others => '0'); + -------- CPU RAM ---------------------------- + signal W_CPU_RAM_DO : std_logic_vector(7 downto 0) := (others => '0'); + -------- ADDRESS DECDER ---------------------- + signal W_BD_G : std_logic := '0'; + signal W_CPU_RAM_CS : std_logic := '0'; + signal W_CPU_RAM_RD : std_logic := '0'; +-- signal W_CPU_RAM_WR : std_logic := '0'; + signal W_CPU_ROM_CS : std_logic := '0'; + signal W_DIP_OE : std_logic := '0'; + signal W_H_FLIP : std_logic := '0'; + signal W_DRIVER_WE : std_logic := '0'; + signal W_OBJ_RAM_RD : std_logic := '0'; + signal W_OBJ_RAM_RQ : std_logic := '0'; + signal W_OBJ_RAM_WR : std_logic := '0'; + signal W_PITCH : std_logic := '0'; + signal W_SOUND_WE : std_logic := '0'; + signal W_STARS_ON : std_logic := '0'; + signal W_STARS_OFFn : std_logic := '0'; + signal W_SW0_OE : std_logic := '0'; + signal W_SW1_OE : std_logic := '0'; + signal W_V_FLIP : std_logic := '0'; + signal W_VID_RAM_RD : std_logic := '0'; + signal W_VID_RAM_WR : std_logic := '0'; + signal W_WDR_OE : std_logic := '0'; + --------- INPORT ----------------------------- + signal W_SW_DO : std_logic_vector( 7 downto 0) := (others => '0'); + --------- VIDEO ----------------------------- + signal W_VID_DO : std_logic_vector( 7 downto 0) := (others => '0'); + ----- DATA I/F ------------------------------------- + signal W_CPU_ROM_DO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_ROM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_RAM_CLK : std_logic := '0'; + signal W_VOL1 : std_logic := '0'; + signal W_VOL2 : std_logic := '0'; + signal W_FIRE : std_logic := '0'; + signal W_HIT : std_logic := '0'; + signal W_FS : std_logic_vector( 2 downto 0) := (others => '0'); + + signal blx_comb : std_logic := '0'; + signal W_1VF : std_logic := '0'; + signal W_256HnX : std_logic := '0'; + signal W_8HF : std_logic := '0'; + signal W_DAC_A : std_logic := '0'; + signal W_DAC_B : std_logic := '0'; + signal W_MISSILEn : std_logic := '0'; + signal W_SHELLn : std_logic := '0'; + signal W_MS_D : std_logic := '0'; + signal W_MS_R : std_logic := '0'; + signal W_MS_G : std_logic := '0'; + signal W_MS_B : std_logic := '0'; + + signal new_sw : std_logic_vector( 2 downto 0) := (others => '0'); + signal in_game : std_logic_vector( 1 downto 0) := (others => '0'); + signal ROM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal rst_count : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_STARS_B : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_G : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_R : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VIDEO_B : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_G : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_R : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_WAV_A0 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A1 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A2 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D2 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_DAC : std_logic_vector( 3 downto 0) := (others => '0'); + +begin + mc_vid : entity work.MC_VIDEO + port map( + I_CLK_18M => W_CLK_18M, + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT => W_H_CNT, + I_V_CNT => W_V_CNT, + I_H_FLIP => W_H_FLIP, + I_V_FLIP => W_V_FLIP, + I_V_BLn => W_V_BLn, + I_C_BLn => W_C_BLn, + I_A => W_A(9 downto 0), + I_OBJ_SUB_A => "000", + I_BD => W_BDI, + I_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + I_OBJ_RAM_RD => W_OBJ_RAM_RD, + I_OBJ_RAM_WR => W_OBJ_RAM_WR, + I_VID_RAM_RD => W_VID_RAM_RD, + I_VID_RAM_WR => W_VID_RAM_WR, + I_DRIVER_WR => W_DRIVER_WE, + O_C_BLnX => W_C_BLnX, + O_8HF => W_8HF, + O_256HnX => W_256HnX, + O_1VF => W_1VF, + O_MISSILEn => W_MISSILEn, + O_SHELLn => W_SHELLn, + O_BD => W_VID_DO, + O_VID => W_VID, + O_COL => W_COL + ); + + cpu : entity work.T80as + port map ( + RESET_n => W_RESETn, + CLK_n => W_CPU_CLK, + WAIT_n => W_CPU_WAITn, + INT_n => '1', + NMI_n => W_CPU_NMIn, + BUSRQ_n => '1', + MREQ_n => W_CPU_MREQn, + RD_n => W_CPU_RDn, + WR_n => W_CPU_WRn, + RFSH_n => W_CPU_RFSHn, + A => W_A, + DI => W_BDO, + DO => W_BDI, + M1_n => open, + IORQ_n => open, + HALT_n => open, + BUSAK_n => open, + DOE => open + ); + + mc_cpu_ram : entity work.MC_CPU_RAM + port map ( + I_CLK => W_CPU_RAM_CLK, + I_ADDR => W_A(9 downto 0), + I_D => W_BDI, + I_WE => W_CPU_WR, + I_OE => W_CPU_RAM_RD, + O_D => W_CPU_RAM_DO + ); + + mc_adec : entity work.MC_ADEC + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_CPU_CLK => W_CPU_CLK, + I_RSTn => W_RESETn, + + I_CPU_A => W_A, + I_CPU_D => W_BDI(0), + I_MREQn => W_CPU_MREQn, + I_RFSHn => W_CPU_RFSHn, + I_RDn => W_CPU_RDn, + I_WRn => W_CPU_WRn, + I_H_BL => W_H_BL, + I_V_BLn => W_V_BLn, + + O_WAITn => W_CPU_WAITn, + O_NMIn => W_CPU_NMIn, + O_CPU_ROM_CS => W_CPU_ROM_CS, + O_CPU_RAM_RD => W_CPU_RAM_RD, +-- O_CPU_RAM_WR => W_CPU_RAM_WR, + O_CPU_RAM_CS => W_CPU_RAM_CS, + O_OBJ_RAM_RD => W_OBJ_RAM_RD, + O_OBJ_RAM_WR => W_OBJ_RAM_WR, + O_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + O_VID_RAM_RD => W_VID_RAM_RD, + O_VID_RAM_WR => W_VID_RAM_WR, + O_SW0_OE => W_SW0_OE, + O_SW1_OE => W_SW1_OE, + O_DIP_OE => W_DIP_OE, + O_WDR_OE => W_WDR_OE, + O_DRIVER_WE => W_DRIVER_WE, + O_SOUND_WE => W_SOUND_WE, + O_PITCH => W_PITCH, + O_H_FLIP => W_H_FLIP, + O_V_FLIP => W_V_FLIP, + O_BD_G => W_BD_G, + O_STARS_ON => W_STARS_ON + ); + +-- active high buttons + mc_inport : entity work.MC_INPORT + port map ( + I_COIN1 => P1_CSJUDLR(6), + I_COIN2 => P2_CSJUDLR(6), + I_1P_START => P1_CSJUDLR(5), + I_2P_START => P2_CSJUDLR(5), + I_1P_SH => P1_CSJUDLR(4), + I_2P_SH => P2_CSJUDLR(4), + I_1P_LE => P1_CSJUDLR(1), + I_2P_LE => P2_CSJUDLR(3), + I_1P_RI => P1_CSJUDLR(0), + I_2P_RI => P2_CSJUDLR(2), + I_SW0_OE => W_SW0_OE, + I_SW1_OE => W_SW1_OE, + I_DIP_OE => W_DIP_OE, + O_D => W_SW_DO + ); + + mc_hv : entity work.MC_HV_COUNT + port map( + I_CLK => W_CLK_6M, + I_RSTn => W_RESETn, + O_H_CNT => W_H_CNT, + O_H_SYNC => W_H_SYNC_int, + O_H_BL => W_H_BL, + O_V_CNT => W_V_CNT, + O_V_SYNC => W_V_SYNC_int, + O_V_BL2n => W_V_BL2n, + O_V_BLn => W_V_BLn, + O_C_BLn => W_C_BLn + ); + + mc_col_pal : entity work.MC_COL_PAL + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_VID => W_VID, + I_COL => W_COL, + I_C_BLnX => W_C_BLnX, + O_C_BLXn => W_C_BLXn, + O_STARS_OFFn => W_STARS_OFFn, + O_R => W_VIDEO_R, + O_G => W_VIDEO_G, + O_B => W_VIDEO_B + ); + + mc_stars : entity work.MC_STARS + port map ( + I_CLK_18M => W_CLK_18M, + I_CLK_6M => W_CLK_6M, + I_H_FLIP => W_H_FLIP, + I_V_SYNC => W_V_SYNC_int, + I_8HF => W_8HF, + I_256HnX => W_256HnX, + I_1VF => W_1VF, + I_2V => W_V_CNT(1), + I_STARS_ON => W_STARS_ON, + I_STARS_OFFn => W_STARS_OFFn, + O_R => W_STARS_R, + O_G => W_STARS_G, + O_B => W_STARS_B, + O_NOISE => open + ); + + mc_sound_a : entity work.MC_SOUND_A + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT1 => W_H_CNT(1), + I_BD => W_BDI, + I_PITCH => W_PITCH, + I_VOL1 => W_VOL1, + I_VOL2 => W_VOL2, + O_SDAT => W_SDAT_A, + O_DO => open + ); + + vmc_sound_b : entity work.MC_SOUND_B + port map( + I_CLK1 => W_CLK_6M, + I_RSTn => rst_count(3), + I_SW => new_sw, + I_DAC => W_DAC, + I_FS => W_FS, + O_SDAT => W_SDAT_B + ); + +--------- ROM ------------------------------------------------------- + mc_roms : entity work.ROM_PGM_0 + port map ( + CLK => W_CLK_12M, + ADDR => W_A(13 downto 0), + DATA => W_CPU_ROM_DO + ); + +-------- VIDEO ----------------------------- + blx_comb <= not ( W_C_BLXn and W_V_BL2n ); + W_V_SYNC <= not W_V_SYNC_int; + W_H_SYNC <= not W_H_SYNC_int; + O_CMPBL <= W_C_BLnX; + + -- MISSILE => Yellow ; + -- SHELL => White ; + W_MS_D <= not (W_MISSILEn and W_SHELLn); + W_MS_R <= not blx_comb and W_MS_D; + W_MS_G <= not blx_comb and W_MS_D; + W_MS_B <= not blx_comb and W_MS_D and not W_SHELLn ; + + W_R <= W_VIDEO_R or (W_STARS_R & "0") or (W_MS_R & W_MS_R & "0"); + W_G <= W_VIDEO_G or (W_STARS_G & "0") or (W_MS_G & W_MS_G & "0"); + W_B <= W_VIDEO_B or (W_STARS_B & "0") or (W_MS_B & W_MS_B & "0"); + + process(W_CLK_6M) + begin + if rising_edge(W_CLK_6M) then + HBLANK <= not W_C_BLXn; + VBLANK <= not W_V_BL2n; + end if; + end process; + + +----- CPU I/F ------------------------------------- + + W_CPU_CLK <= W_H_CNT(0); + W_CPU_RAM_CLK <= W_CLK_12M and W_CPU_RAM_CS; + + W_CPU_ROM_DOB <= W_CPU_ROM_DO when W_CPU_ROM_CS = '1' else (others=>'0'); + + W_RESETn <= not I_RESET; + W_BDO <= W_SW_DO or W_VID_DO or W_CPU_RAM_DO or W_CPU_ROM_DOB ; + W_CPU_WR <= not W_CPU_WRn; + + new_sw <= (W_FS(2) or W_FS(1) or W_FS(0)) & W_HIT & W_FIRE; + + process(W_CPU_CLK, I_RESET) + begin + if (I_RESET = '1') then + rst_count <= (others => '0'); + elsif rising_edge( W_CPU_CLK) then + if ( rst_count /= x"f") then + rst_count <= rst_count + 1; + end if; + end if; + end process; + +----- Parts 9L --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_FS <= (others=>'0'); + W_HIT <= '0'; + W_FIRE <= '0'; + W_VOL1 <= '0'; + W_VOL2 <= '0'; + elsif rising_edge(W_CLK_12M) then + if (W_SOUND_WE = '1') then + case(W_A(2 downto 0)) is + when "000" => W_FS(0) <= W_BDI(0); + when "001" => W_FS(1) <= W_BDI(0); + when "010" => W_FS(2) <= W_BDI(0); + when "011" => W_HIT <= W_BDI(0); +-- when "100" => UNUSED <= W_BDI(0); + when "101" => W_FIRE <= W_BDI(0); + when "110" => W_VOL1 <= W_BDI(0); + when "111" => W_VOL2 <= W_BDI(0); + when others => null; + end case; + end if; + end if; + end process; + +----- Parts 9M --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_DAC <= (others=>'0'); + elsif rising_edge(W_CLK_12M) then + if (W_DRIVER_WE = '1') then + case(W_A(2 downto 0)) is + -- next 4 outputs go off board via ULN2075 buffer +-- when "000" => 1P START <= W_BDI(0); +-- when "001" => 2P START <= W_BDI(0); +-- when "010" => COIN LOCK <= W_BDI(0); +-- when "011" => COIN CTR <= W_BDI(0); + when "100" => W_DAC(0) <= W_BDI(0); -- 1M + when "101" => W_DAC(1) <= W_BDI(0); -- 470K + when "110" => W_DAC(2) <= W_BDI(0); -- 220K + when "111" => W_DAC(3) <= W_BDI(0); -- 100K + when others => null; + end case; + end if; + end if; + end process; + +------------------------------------------------------------------------------- +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/hq2x.sv b/Arcade/Galaxian Hardware/Omega_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_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/Arcade/Galaxian Hardware/Omega_MiST/rtl/keyboard.v b/Arcade/Galaxian Hardware/Omega_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_adec.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_adec.vhd new file mode 100644 index 00000000..7245ce8c --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_adec.vhd @@ -0,0 +1,251 @@ +--------------------------------------------------------------------- +-- FPGA GALAXIAN ADDRESS DECDER +-- +-- Version : 2.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +--------------------------------------------------------------------- +-- +--GALAXIAN Address Map +-- +-- Address Item(R..read-mode W..wight-mode) Parts +--0000 - 1FFF CPU-ROM..R ( 7H or 7K ) +--2000 - 3FFF CPU-ROM..R ( 7L ) +--4000 - 47FF CPU-RAM..RW ( 7N & 7P ) +--5000 - 57FF VID-RAM..RW +--5800 - 5FFF OBJ-RAM..RW +--6000 - SW0..R LAMP......W +--6800 - SW1..R SOUND.....W +--7000 - DIP..R +--7001 NMI_ON....W +--7004 STARS_ON..W +--7006 H_FLIP....W +--7007 V-FLIP....W +--7800 WDR..R PITCH.....W +-- +--W MODE +--6000 1P START +--6001 2P START +--6002 COIN LOCKOUT +--6003 COIN COUNTER +--6004 - 6007 SOUND CONTROL(OSC) +-- +--6800 SOUND CONTROL(FS1) +--6801 SOUND CONTROL(FS2) +--6802 SOUND CONTROL(FS3) +--6803 SOUND CONTROL(HIT) +--6805 SOUND CONTROL(SHOT) +--6806 SOUND CONTROL(VOL1) +--6807 SOUND CONTROL(VOL2) +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_ADEC is + port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_CPU_CLK : in std_logic; + I_RSTn : in std_logic; + + I_CPU_A : in std_logic_vector(15 downto 0); + I_CPU_D : in std_logic; + I_MREQn : in std_logic; + I_RFSHn : in std_logic; + I_RDn : in std_logic; + I_WRn : in std_logic; + I_H_BL : in std_logic; + I_V_BLn : in std_logic; + + O_WAITn : out std_logic; + O_NMIn : out std_logic; + O_CPU_ROM_CS : out std_logic; + O_CPU_RAM_RD : out std_logic; + O_CPU_RAM_WR : out std_logic; + O_CPU_RAM_CS : out std_logic; + O_OBJ_RAM_RD : out std_logic; + O_OBJ_RAM_WR : out std_logic; + O_OBJ_RAM_RQ : out std_logic; + O_VID_RAM_RD : out std_logic; + O_VID_RAM_WR : out std_logic; + O_SW0_OE : out std_logic; + O_SW1_OE : out std_logic; + O_DIP_OE : out std_logic; + O_WDR_OE : out std_logic; + O_DRIVER_WE : out std_logic; + O_SOUND_WE : out std_logic; + O_PITCH : out std_logic; + O_H_FLIP : out std_logic; + O_V_FLIP : out std_logic; + O_BD_G : out std_logic; + O_STARS_ON : out std_logic + ); +end; + +architecture RTL of MC_ADEC is + signal W_8E1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8E2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8P_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8M_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_9N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_NMI_ONn : std_logic := '0'; + -------- CPU WAITn ---------------------------------------------- +-- signal W_6S1_Q : std_logic := '0'; + signal W_6S1_Qn : std_logic := '0'; +-- signal W_6S2_Qn : std_logic := '0'; + + signal W_V_BL : std_logic := '0'; + +begin + W_NMI_ONn <= W_9N_Q(1); -- galaxian + +-- O_WAITn <= '1' ; -- No Wait + O_WAITn <= W_6S1_Qn; + + process(I_CPU_CLK, I_V_BLn) + begin + if (I_V_BLn = '0') then +-- W_6S1_Q <= '0'; + W_6S1_Qn <= '1'; + elsif rising_edge(I_CPU_CLK) then +-- W_6S1_Q <= not (I_H_BL or W_8P_Q(2)); + W_6S1_Qn <= I_H_BL or W_8P_Q(2); + end if; + end process; + +-- process(I_CPU_CLK) +-- begin +-- if falling_edge(I_CPU_CLK) then +-- W_6S2_Qn <= not W_6S1_Q; +-- end if; +-- end process; + +-------- CPU NMIn ----------------------------------------------- + W_V_BL <= not I_V_BLn; + process(W_V_BL, W_NMI_ONn) + begin + if (W_NMI_ONn = '0') then + O_NMIn <= '1'; + elsif rising_edge(W_V_BL) then + O_NMIn <= '0'; + end if; + end process; + + ------------------------------------------------------------------- + u_8e1 : entity work.LOGIC_74XX139 + port map ( + I_G => I_MREQn, + I_Sel(1) => I_CPU_A(15), + I_Sel(0) => I_CPU_A(14), + O_Q => W_8E1_Q + ); + + ---------- CPU_ROM CS 0000 - 3FFF --------------------------- + u_8e2 : entity work.LOGIC_74XX139 + port map ( + I_G => I_RDn, + I_Sel(1) => W_8E1_Q(0), + I_Sel(0) => I_CPU_A(13), + O_Q => W_8E2_Q + ); + + O_CPU_ROM_CS <= not (W_8E2_Q(0) and W_8E2_Q(1) ) ; -- 0000 - 3FFF + ------------------------------------------------------------------- + -- ADDRESS + -- W_8E1_Q[0] = 0000 - 3FFF ---- CPU_ROM_USE + -- W_8E1_Q[1] = 4000 - 7FFF ---- GALAXIAN USE *1 + -- W_8E1_Q[2] = 8000 - BFFF ---- MOONCREST USE + -- W_8E1_Q[3] = C000 - FFFF + + u_8p : entity work.LOGIC_74XX138 + port map ( + I_G1 => I_RFSHn, + I_G2a => W_8E1_Q(1), -- <= *1 + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8P_Q + ); + + u_8n : entity work.LOGIC_74XX138 + port map ( + I_G1 => '1', + I_G2a => I_RDn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8N_Q + ); + + u_8m : entity work.LOGIC_74XX138 + port map ( + -- I_G1 => W_6S2_Qn, + I_G1 => '1', -- No Wait + I_G2a => I_WRn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8M_Q + ); + + O_BD_G <= not (W_8E1_Q(0) and W_8P_Q(0)); + O_OBJ_RAM_RQ <= not W_8P_Q(3); + + O_CPU_RAM_CS <= not (W_8N_Q(0) and W_8M_Q(0)); + + O_WDR_OE <= not W_8N_Q(7); + O_DIP_OE <= not W_8N_Q(6); + O_SW1_OE <= not W_8N_Q(5); + O_SW0_OE <= not W_8N_Q(4); + O_OBJ_RAM_RD <= not W_8N_Q(3); + O_VID_RAM_RD <= not W_8N_Q(2); +-- UNUSED <= not W_8N_Q(1); + O_CPU_RAM_RD <= not W_8N_Q(0); + + O_PITCH <= not W_8M_Q(7); +-- STARS_ON_ENA <= not W_8M_Q(6); + O_SOUND_WE <= not W_8M_Q(5); + O_DRIVER_WE <= not W_8M_Q(4); + O_OBJ_RAM_WR <= not W_8M_Q(3); + O_VID_RAM_WR <= not W_8M_Q(2); +-- UNUSED <= not W_8M_Q(1); + O_CPU_RAM_WR <= not W_8M_Q(0); + + ----- Parts 9N --------- + + process(I_CLK_12M, I_RSTn) + begin + if (I_RSTn = '0') then + W_9N_Q <= (others => '0'); + elsif rising_edge(I_CLK_12M) then + if (W_8M_Q(6) = '0') then + case I_CPU_A(2 downto 0) is + when "000" => W_9N_Q(0) <= I_CPU_D; + when "001" => W_9N_Q(1) <= I_CPU_D; + when "010" => W_9N_Q(2) <= I_CPU_D; + when "011" => W_9N_Q(3) <= I_CPU_D; + when "100" => W_9N_Q(4) <= I_CPU_D; + when "101" => W_9N_Q(5) <= I_CPU_D; + when "110" => W_9N_Q(6) <= I_CPU_D; + when "111" => W_9N_Q(7) <= I_CPU_D; + when others => null; + end case; + end if; + end if; + end process; + + O_STARS_ON <= W_9N_Q(4); + O_H_FLIP <= W_9N_Q(6); + O_V_FLIP <= W_9N_Q(7); + +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_bram.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_bram.vhd new file mode 100644 index 00000000..a6df1ce1 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_bram.vhd @@ -0,0 +1,182 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA & GALAXIAN +-- FPGA BLOCK RAM I/F (XILINX SPARTAN) +-- +-- Version : 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- mc_col_rom(6L) added by k.Degawa +-- +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. K.Degawa +-- 2004- 9-18 added Xilinx Device K.Degawa +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_top.v use +entity MC_CPU_RAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(9 downto 0); + I_D : in std_logic_vector(7 downto 0); + I_WE : in std_logic; + I_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) + ); +end; +architecture RTL of MC_CPU_RAM is + + signal W_D : std_logic_vector(7 downto 0) := (others => '0'); +begin + O_D <= W_D when I_OE ='1' else (others=>'0'); + + ram_inst : work.spram generic map(10,8) + port map + ( + address => I_ADDR, + clock => I_CLK, + data => I_D, + wren => I_WE, + q => W_D + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_OBJ_RAM is + port( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(7 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(7 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); + end; + +architecture RTL of MC_OBJ_RAM is +begin + + ram_inst : work.dpram generic map(8,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_VID_RAM is + port ( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(9 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(9 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of MC_VID_RAM is +begin + ram_inst : work.dpram generic map(10,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_LRAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(7 downto 0); + I_D : in std_logic_vector(4 downto 0); + I_WE : in std_logic; + O_Dn : out std_logic_vector(4 downto 0) + ); +end; + +architecture RTL of MC_LRAM is + signal W_D : std_logic_vector(4 downto 0) := (others => '0'); +begin + + O_Dn <= not W_D; + + ram_inst : work.dpram generic map(8,5) + port map + ( + clock_a => I_CLK, + address_a => I_ADDR, + data_a => I_D, + wren_a => not I_WE, + + clock_b => not I_CLK, + address_b => I_ADDR, + data_b => (others => '0'), + q_b => W_D, + enable_b => '1', + wren_b => '0' + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_clocks.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_clocks.vhd new file mode 100644 index 00000000..5a4d0094 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_clocks.vhd @@ -0,0 +1,85 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA CLOCK GEN +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +----------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity CLOCKGEN is +port ( + CLKIN_IN : in std_logic; + RST_IN : in std_logic; + -- + O_CLK_24M : out std_logic; + O_CLK_18M : out std_logic; + O_CLK_12M : out std_logic; + O_CLK_06M : out std_logic +); +end; + +architecture RTL of CLOCKGEN is + signal state : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr1 : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr2 : std_logic_vector(2 downto 0) := (others => '0'); + signal CLKFB_IN : std_logic := '0'; + signal CLK0_BUF : std_logic := '0'; + signal CLKFX_BUF : std_logic := '0'; + signal CLK_72M : std_logic := '0'; + signal I_DCM_LOCKED : std_logic := '0'; + +begin + dcm_inst : DCM_SP + generic map ( + CLKFX_MULTIPLY => 9, + CLKFX_DIVIDE => 4, + CLKIN_PERIOD => 31.25 + ) + port map ( + CLKIN => CLKIN_IN, + CLKFB => CLKFB_IN, + RST => RST_IN, + CLK0 => CLK0_BUF, + CLKFX => CLKFX_BUF, + LOCKED => I_DCM_LOCKED + ); + + BUFG0 : BUFG port map (I=> CLK0_BUF, O => CLKFB_IN); + BUFG1 : BUFG port map (I=> CLKFX_BUF, O => CLK_72M); + O_CLK_06M <= ctr2(2); + O_CLK_12M <= ctr2(1); + O_CLK_24M <= ctr2(0); + O_CLK_18M <= ctr1(1); + + -- generate all clocks, 36Mhz, 18Mhz, 24Mhz, 12Mhz and 6Mhz + process(CLK_72M) + begin + if rising_edge(CLK_72M) then + if (I_DCM_LOCKED = '0') then + state <= "00"; + ctr1 <= (others=>'0'); + ctr2 <= (others=>'0'); + else + ctr1 <= ctr1 + 1; + case state is + when "00" => state <= "01"; ctr2 <= ctr2 + 1; + when "01" => state <= "10"; ctr2 <= ctr2 + 1; + when "10" => state <= "00"; + when "11" => state <= "00"; + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_col_pal.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_col_pal.vhd new file mode 100644 index 00000000..c4dc06ad --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_col_pal.vhd @@ -0,0 +1,78 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA COLOR-PALETTE +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-18 added Xilinx Device. K.Degawa +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; +-- use ieee.numeric_std.all; + +--library UNISIM; +-- use UNISIM.Vcomponents.all; + +entity MC_COL_PAL is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_VID : in std_logic_vector(1 downto 0); + I_COL : in std_logic_vector(2 downto 0); + I_C_BLnX : in std_logic; + + O_C_BLXn : out std_logic; + O_STARS_OFFn : out std_logic; + O_R : out std_logic_vector(2 downto 0); + O_G : out std_logic_vector(2 downto 0); + O_B : out std_logic_vector(2 downto 0) +); +end; + +architecture RTL of MC_COL_PAL is + --- Parts 6M -------------------------------------------------------- + signal W_COL_ROM_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6M_DI : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_DO : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_CLR : std_logic := '0'; + +begin + W_6M_DI <= I_COL(2 downto 0) & I_VID(1 downto 0) & not (I_VID(0) or I_VID(1)) & I_C_BLnX; + W_6M_CLR <= W_6M_DI(0) or W_6M_DO(0); + O_C_BLXn <= W_6M_DI(0) or W_6M_DO(0); + O_STARS_OFFn <= W_6M_DO(1); + +--always@(posedge I_CLK_6M or negedge W_6M_CLR) + process(I_CLK_6M, W_6M_CLR) + begin + if (W_6M_CLR = '0') then + W_6M_DO <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + W_6M_DO <= W_6M_DI; + end if; + end process; + + --- COL ROM -------------------------------------------------------- +--wire W_COL_ROM_OEn = W_6M_DO[1]; + + galaxian_6l : entity work.GALAXIAN_6L + port map ( + CLK => I_CLK_12M, + ADDR => W_6M_DO(6 downto 2), + DATA => W_COL_ROM_DO + ); + + --- VID OUT -------------------------------------------------------- + O_R <= W_COL_ROM_DO(2 downto 0); + O_G <= W_COL_ROM_DO(5 downto 3); + O_B <= W_COL_ROM_DO(7 downto 6) & "0"; + +end; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_hv_count.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_hv_count.vhd new file mode 100644 index 00000000..f310321b --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_hv_count.vhd @@ -0,0 +1,145 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA H & V COUNTER +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 +----------------------------------------------------------------------- +-- MoonCrest hv_count +-- H_CNT 0 - 255 , 384 - 511 Total 384 count +-- V_CNT 0 - 255 , 504 - 511 Total 264 count +------------------------------------------------------------------------------------------- +-- H_CNT[0], H_CNT[1], H_CNT[2], H_CNT[3], H_CNT[4], H_CNT[5], H_CNT[6], H_CNT[7], H_CNT[8], +-- 1 H 2 H 4 H 8 H 16 H 32 H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT[0], V_CNT[1], V_CNT[2], V_CNT[3], V_CNT[4], V_CNT[5], V_CNT[6], V_CNT[7] +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_HV_COUNT is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + O_H_CNT : out std_logic_vector(8 downto 0); + O_H_SYNC : out std_logic; + O_H_BL : out std_logic; + O_V_BL2n : out std_logic; + O_V_CNT : out std_logic_vector(7 downto 0); + O_V_SYNC : out std_logic; + O_V_BLn : out std_logic; + O_C_BLn : out std_logic + ); +end; + +architecture RTL of MC_HV_COUNT is + signal H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal V_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal H_SYNC : std_logic := '0'; + signal H_CLK : std_logic := '0'; + signal H_BL : std_logic := '0'; + signal V_BLn : std_logic := '0'; + signal V_BL2n : std_logic := '0'; + +begin +--------- H_COUNT ---------------------------------------- + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if (H_CNT = 255) then + H_CNT <= std_logic_vector(to_unsigned(384, H_CNT'length)); + else + H_CNT <= H_CNT + 1 ; + end if; + end if; + end process; + + O_H_CNT <= H_CNT; + +--------- H_SYNC ---------------------------------------- + H_CLK <= H_CNT(4); + process(H_CLK, H_CNT(8)) + begin + if (H_CNT(8) = '0') then + H_SYNC <= '0'; + elsif rising_edge(H_CLK) then + H_SYNC <= (not H_CNT(6) ) and H_CNT(5); + end if; + end process; + + O_H_SYNC <= H_SYNC; + +--------- H_BL ------------------------------------------ + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if H_CNT = 387 then + H_BL <= '1'; + elsif H_CNT = 503 then + H_BL <= '0'; + end if; + end if; + end process; + + O_H_BL <= H_BL; + +--------- V_COUNT ---------------------------------------- + process(H_SYNC, I_RSTn) + begin + if (I_RSTn = '0') then + V_CNT <= (others => '0'); + elsif rising_edge(H_SYNC) then + if (V_CNT = 255) then + V_CNT <= std_logic_vector(to_unsigned(504, V_CNT'length)); + else + V_CNT <= V_CNT + 1 ; + end if; + end if; + end process; + + O_V_CNT <= V_CNT(7 downto 0); + O_V_SYNC <= V_CNT(8); + +--------- V_BLn ------------------------------------------ + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BLn <= '0'; + elsif V_CNT(7 downto 0) = 15 then + V_BLn <= '1'; + end if; + end if; + end process; + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BL2n <= '0'; + elsif V_CNT(7 downto 0) = 16 then + V_BL2n <= '1'; + end if; + end if; + end process; + + O_V_BLn <= V_BLn; + O_V_BL2n <= V_BL2n; +------- C_BLn ------------------------------------------ + O_C_BLn <= V_BLn and (not H_CNT(8)); + +end; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_inport.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_inport.vhd new file mode 100644 index 00000000..550e610e --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_inport.vhd @@ -0,0 +1,74 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA INPORT +-- +-- Version : 1.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004-4-30 galaxian modify by K.DEGAWA +----------------------------------------------------------------------- + +-- DIP SW 0 1 2 3 4 5 +----------------------------------------------------------------- +-- COIN CHUTE +-- 1 COIN/1 PLAY 1'b0 1'b0 +-- 2 COIN/1 PLAY 1'b1 1'b0 +-- 1 COIN/2 PLAY 1'b0 1'b1 +-- FREE PLAY 1'b1 1'b1 +-- BOUNS +-- 1'b0 1'b0 +-- 1'b1 1'b0 +-- 1'b0 1'b1 +-- 1'b1 1'b1 +-- LIVES +-- 2 1'b0 +-- 3 1'b1 +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_INPORT is +port ( + I_COIN1 : in std_logic; -- active high + I_COIN2 : in std_logic; -- active high + I_1P_LE : in std_logic; -- active high + I_1P_RI : in std_logic; -- active high + I_1P_SH : in std_logic; -- active high + I_2P_LE : in std_logic; + I_2P_RI : in std_logic; + I_2P_SH : in std_logic; + I_1P_START : in std_logic; -- active high + I_2P_START : in std_logic; -- active high + I_SW0_OE : in std_logic; + I_SW1_OE : in std_logic; + I_DIP_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) +); + +end; + +architecture RTL of MC_INPORT is + + constant W_TABLE : std_logic := '0'; -- UP = 0; + constant W_TEST : std_logic := '0'; + constant W_SERVICE : std_logic := '0'; + + signal W_SW0_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SW1_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_DIP_DO : std_logic_vector(7 downto 0) := (others => '0'); + +begin + + W_SW0_DO <= x"00" when I_SW0_OE = '0' else W_SERVICE & W_TEST & W_TABLE & I_1P_SH & I_1P_RI & I_1P_LE & I_COIN2 & I_COIN1; + W_SW1_DO <= x"00" when I_SW1_OE = '0' else "010" & I_2P_SH & I_2P_RI & I_2P_LE & I_2P_START & I_1P_START; + W_DIP_DO <= x"00" when I_DIP_OE = '0' else "00000100"; + O_D <= W_SW0_DO or W_SW1_DO or W_DIP_DO ; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_ld_pls.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_ld_pls.vhd new file mode 100644 index 00000000..0945fe35 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_ld_pls.vhd @@ -0,0 +1,115 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA VIDEO-LD_PLS_GEN +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_LD_PLS is + port ( + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_3D_DI : in std_logic; + + O_LDn : out std_logic; + O_CNTRLDn : out std_logic; + O_CNTRCLRn : out std_logic; + O_COLLn : out std_logic; + O_VPLn : out std_logic; + O_OBJDATALn : out std_logic; + O_MLDn : out std_logic; + O_SLDn : out std_logic + ); +end; + +architecture RTL of MC_LD_PLS is + signal W_4C1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C1_Q3 : std_logic := '0'; + signal W_4C2_B : std_logic := '0'; + signal W_4D1_G : std_logic := '0'; + signal W_4D1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4D2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_5C_Q : std_logic := '0'; + signal W_HCNT : std_logic := '0'; +begin + O_LDn <= W_4D1_G; + O_CNTRLDn <= W_4D1_Q(2); + O_CNTRCLRn <= W_4D1_Q(0); + O_COLLn <= W_4D2_Q(2); + O_VPLn <= W_4D2_Q(0); + O_OBJDATALn <= W_4C1_Q(2); + O_MLDn <= W_4C2_Q(0); + O_SLDn <= W_4C2_Q(1); + W_4D1_G <= not (I_H_CNT(0) and I_H_CNT(1) and I_H_CNT(2)); + W_HCNT <= not (I_H_CNT(6) and I_H_CNT(5) and I_H_CNT(4) and I_H_CNT(3)); + -- Parts 4D + u_4d1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_G, + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q =>W_4D1_Q + ); + + u_4d2 : entity work.LOGIC_74XX139 + port map( + I_G => W_5C_Q, + I_Sel(1) => I_H_CNT(2), + I_Sel(0) => I_H_CNT(1), + O_Q => W_4D2_Q + ); + + -- Parts 4C + u_4c1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D2_Q(1), + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q => W_4C1_Q + ); + + u_4c2 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_Q(3), + I_Sel(1) => W_4C2_B, + I_Sel(0) => W_HCNT, + O_Q => W_4C2_Q + ); + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_5C_Q <= I_H_CNT(0); + end if; + end process; + + -- 2004-9-22 added + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + W_4C1_Q3 <= W_4C1_Q(3); + end if; + end process; + + process(W_4C1_Q3) + begin + if rising_edge(W_4C1_Q3) then + W_4C2_B <= I_3D_DI; + end if; + end process; + +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_logic.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_logic.vhd new file mode 100644 index 00000000..5dae8a87 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_logic.vhd @@ -0,0 +1,92 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA LOGIC IP MODULE +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx138 +-- 3-to-8 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX138 is + port ( + I_G1 : in std_logic; + I_G2a : in std_logic; + I_G2b : in std_logic; + I_Sel : in std_logic_vector(2 downto 0); + O_Q : out std_logic_vector(7 downto 0) + ); +end logic_74xx138; + +architecture RTL of LOGIC_74XX138 is + signal I_G : std_logic_vector(2 downto 0) := (others => '0'); + +begin + I_G <= I_G1 & I_G2a & I_G2b; + + xx138 : process(I_G, I_Sel) + begin + if(I_G = "100" ) then + case I_Sel is + when "000" => O_Q <= "11111110"; + when "001" => O_Q <= "11111101"; + when "010" => O_Q <= "11111011"; + when "011" => O_Q <= "11110111"; + when "100" => O_Q <= "11101111"; + when "101" => O_Q <= "11011111"; + when "110" => O_Q <= "10111111"; + when "111" => O_Q <= "01111111"; + when others => null; + end case; + else + O_Q <= (others => '1'); + end if; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx139 +-- 2-to-4 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX139 is + port ( + I_G : in std_logic; + I_Sel : in std_logic_vector(1 downto 0); + O_Q : out std_logic_vector(3 downto 0) + ); +end; + +architecture RTL of LOGIC_74XX139 is +begin + xx139 : process (I_G, I_Sel) + begin + if I_G = '0' then + case I_Sel is + when "00" => O_Q <= "1110"; + when "01" => O_Q <= "1101"; + when "10" => O_Q <= "1011"; + when "11" => O_Q <= "0111"; + when others => null; + end case; + else + O_Q <= "1111"; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_missile.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_missile.vhd new file mode 100644 index 00000000..e924e09e --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_missile.vhd @@ -0,0 +1,107 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA VIDEO-MISSILE +---- +---- Version : 2.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_MISSILE is + port( + I_CLK_6M : in std_logic; + I_CLK_18M : in std_logic; + I_C_BLn_X : in std_logic; + I_MLDn : in std_logic; + I_SLDn : in std_logic; + I_HPOS : in std_logic_vector (7 downto 0); + + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic + ); +end; + +architecture RTL of MC_MISSILE is + signal W_45R_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_45S_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_5P1_Q : std_logic := '0'; + signal W_5P2_Q : std_logic := '0'; + signal W_5P1_CLK : std_logic := '0'; + signal W_5P2_CLK : std_logic := '0'; +begin + + O_MISSILEn <= W_5P1_CLK; + O_SHELLn <= W_5P2_CLK; + + -- missile counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if (I_MLDn = '0') then + W_45R_Q <= I_HPOS; + else + if (I_C_BLn_X = '1') then + W_45R_Q <= W_45R_Q + 1; + if (W_45R_Q(7 downto 0) = "11111010") and W_5P1_Q = '1' then + W_5P1_CLK <= '0'; + else + W_5P1_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- shell counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if(I_SLDn = '0') then + W_45S_Q <= I_HPOS; + else + if(I_C_BLn_X = '1') then + W_45S_Q <= W_45S_Q + 1; + if (W_45S_Q(7 downto 0) = "11111010") and W_5P2_Q = '1' then + W_5P2_CLK <= '0'; + else + W_5P2_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_MLDn) and clock active on rising edge (W_5P1_CLK) + process(W_5P1_CLK, I_MLDn) + begin + if (I_MLDn = '0') then + W_5P1_Q <= '1'; + elsif rising_edge(W_5P1_CLK) then + W_5P1_Q <= '0'; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_SLDn) and clock active on rising edge (W_5P2_CLK) + process(W_5P2_CLK, I_SLDn) + begin + if (I_SLDn = '0') then + W_5P2_Q <= '1'; + elsif rising_edge(W_5P2_CLK) then + W_5P2_Q <= '0'; + end if; + end process; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_sound_a.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_sound_a.vhd new file mode 100644 index 00000000..ee0c66be --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_sound_a.vhd @@ -0,0 +1,117 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA SOUND I/F +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + use IEEE.std_logic_arith.all; + +entity MC_SOUND_A is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT1 : in std_logic; + I_BD : in std_logic_vector(7 downto 0); + I_PITCH : in std_logic; + I_VOL1 : in std_logic; + I_VOL2 : in std_logic; + + O_SDAT : out std_logic_vector(7 downto 0); + O_DO : out std_logic_vector(3 downto 0) +); +end; + +architecture RTL of MC_SOUND_A is + signal W_PITCH : std_logic := '0'; + signal W_89K_LDn : std_logic := '0'; + signal W_89K_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_89K_LDATA : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6T_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_SDAT0 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT2 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT3 : std_logic_vector(7 downto 0) := (others => '0'); + +begin + O_DO <= W_6T_Q; + + process (I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_PITCH <= I_PITCH; + if (W_89K_Q = x"ff") then + W_89K_LDn <= '0' ; + else + W_89K_LDn <= '1' ; + end if; + end if; + end process; + + -- Parts 9J + process (W_PITCH) + begin + if falling_edge(W_PITCH) then + W_89K_LDATA <= I_BD; + end if; + end process; + + process (I_H_CNT1) + begin + if rising_edge(I_H_CNT1) then + if (W_89K_LDn = '0') then + W_89K_Q <= W_89K_LDATA; + else + W_89K_Q <= W_89K_Q + 1; + end if; + end if; + end process; + + process (W_89K_LDn) + begin + if falling_edge(W_89K_LDn) then + W_6T_Q <= W_6T_Q + 1; + end if; + end process; + + process (I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + O_SDAT <= (x"14" + W_SDAT3) + (W_SDAT0 + W_SDAT2); + + if W_6T_Q(0)='1' then + W_SDAT0 <= x"2a"; + else + W_SDAT0 <= (others => '0'); + end if; + + if W_6T_Q(2)='1' then + if I_VOL1 = '1' then + W_SDAT2 <= x"69"; + else + W_SDAT2 <= x"39"; + end if; + else + W_SDAT2 <= (others => '0'); + end if; + + if (W_6T_Q(3)='1') and (I_VOL2 = '1') then + W_SDAT3 <= x"48" ; + else + W_SDAT3 <= (others => '0'); + end if; + + end if; + end process; + +end; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_sound_b.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_sound_b.vhd new file mode 100644 index 00000000..b74e4bb1 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_sound_b.vhd @@ -0,0 +1,253 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA WAVE SOUND +---- +---- Version : 1.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does no guarantee this program. +---- You can use this at your own risk. +---- +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--pragma translate_off +-- use ieee.std_logic_textio.all; +-- use std.textio.all; +--pragma translate_on + +entity MC_SOUND_B is + port( + I_CLK1 : in std_logic; -- 6MHz + I_RSTn : in std_logic; + I_SW : in std_logic_vector( 2 downto 0); + I_DAC : in std_logic_vector( 3 downto 0); + I_FS : in std_logic_vector( 2 downto 0); + O_SDAT : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_B is +constant sample_time : integer := 557; -- sample time : 557 = 11025Hz, 557/2 = 22050Hz +constant fire_cnt : std_logic_vector(15 downto 0) := x"2000"; +constant hit_cnt : std_logic_vector(15 downto 0) := x"2000"; + +signal sample : std_logic_vector(10 downto 0) := (others => '0'); +signal sample_pls : std_logic := '0'; +signal s0_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s0_trg : std_logic := '0'; +signal s1_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s1_trg : std_logic := '0'; +signal fire_addr : std_logic_vector(15 downto 0) := (others => '0'); +signal hit_addr : std_logic_vector(15 downto 0) := (others => '0'); + +signal WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); +signal WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + +signal W_VCO1_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO1_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal VCO_CTR : std_logic_vector(24 downto 0) := (others => '0'); + +signal SDAT : std_logic_vector(10 downto 0) := (others => '0'); + +begin + -- ideally we should divide by 5 because this is the sum of 5 channels + -- but in practice we divide by 4 and just clip sounds that are too loud. + O_SDAT <= SDAT(9 downto 2) when SDAT(10) = '0' else (others=>'1'); -- clip overrange sounds + + process(I_CLK1) + begin + if rising_edge(I_CLK1) then + SDAT <= ("000" & W_VCO3_OUT) + ( ( ("000" & W_VCO2_OUT) + ("000" & W_VCO1_OUT) ) + ( ("000" & WAV_D0) + ("000" & WAV_D1) ) ); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + sample <= (others => '0'); + sample_pls <= '0'; + elsif rising_edge(I_CLK1) then + if (sample = sample_time - 1) then + sample <= (others => '0'); + sample_pls <= '1'; + else + sample <= sample + 1; + sample_pls <= '0'; + end if; + end if; + end process; + +------------- FIRE SOUND ------------------------------------------ + mc_roms_fire : entity work.GAL_FIR + port map ( + CLK => I_CLK1, + ADDR => fire_addr(12 downto 0), + DATA => WAV_D0 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s0_trg_ff <= (others => '0'); + s0_trg <= '0'; + elsif rising_edge(I_CLK1) then + s0_trg_ff(0) <= I_SW(0); + s0_trg_ff(1) <= s0_trg_ff(0); + s0_trg <= not s0_trg_ff(1) and s0_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + fire_addr <= fire_cnt; + elsif rising_edge(I_CLK1) then + if (s0_trg = '1') then + fire_addr <= (others => '0'); + else + if(sample_pls = '1') then + if(fire_addr <= fire_cnt) then + fire_addr <= fire_addr + 1; + else + fire_addr <= fire_addr ; + end if; + end if; + end if; + end if; + end process; + +------------- HIT SOUND ------------------------------------------ + mc_roms_hit : entity work.GAL_HIT + port map ( + CLK => I_CLK1, + ADDR => hit_addr(12 downto 0), + DATA => WAV_D1 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s1_trg_ff <= (others => '0'); + s1_trg <= '0'; + elsif rising_edge(I_CLK1) then + s1_trg_ff(0) <= I_SW(1); + s1_trg_ff(1) <= s1_trg_ff(0); + s1_trg <= not s1_trg_ff(1) and s1_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + hit_addr <= hit_cnt; + elsif rising_edge(I_CLK1) then + if (s1_trg = '1') then + hit_addr <= (others => '0'); + else + if (sample_pls = '1') then + if (hit_addr <= hit_cnt) then + hit_addr <= hit_addr + 1 ; + else + hit_addr <= hit_addr ; + end if; + end if; + end if; + end if; + end process; + +--------------- EFFECT SOUND --------------------------------------- + +-- 9R modulator voltage generator based on DAC value + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + VCO_CTR <= (others=>'0'); + elsif rising_edge(I_CLK1) then + VCO_CTR <= VCO_CTR + (not I_DAC); + end if; + end process; + + -- modulator frequency lookup tables for the three VCOs + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + elsif rising_edge(I_CLK1) then + case VCO_CTR(23 downto 19) is + when "00000" => W_VCO1_STEP <= x"2A"; W_VCO2_STEP <= x"3A"; W_VCO3_STEP <= x"54"; + when "00001" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"39"; W_VCO3_STEP <= x"53"; + when "00010" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"38"; W_VCO3_STEP <= x"52"; + when "00011" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"50"; + when "00100" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"4F"; + when "00101" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"36"; W_VCO3_STEP <= x"4E"; + when "00110" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"35"; W_VCO3_STEP <= x"4D"; + when "00111" => W_VCO1_STEP <= x"26"; W_VCO2_STEP <= x"34"; W_VCO3_STEP <= x"4C"; + when "01000" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"4A"; + when "01001" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"49"; + when "01010" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"32"; W_VCO3_STEP <= x"48"; + when "01011" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"31"; W_VCO3_STEP <= x"47"; + when "01100" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"30"; W_VCO3_STEP <= x"46"; + when "01101" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"44"; + when "01110" => W_VCO1_STEP <= x"22"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"43"; + when "01111" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2E"; W_VCO3_STEP <= x"42"; + when "10000" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2D"; W_VCO3_STEP <= x"41"; + when "10001" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2C"; W_VCO3_STEP <= x"40"; + when "10010" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3F"; + when "10011" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3D"; + when "10100" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2A"; W_VCO3_STEP <= x"3C"; + when "10101" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"29"; W_VCO3_STEP <= x"3B"; + when "10110" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"3A"; + when "10111" => W_VCO1_STEP <= x"1D"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"39"; + when "11000" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"27"; W_VCO3_STEP <= x"37"; + when "11001" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"26"; W_VCO3_STEP <= x"36"; + when "11010" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"25"; W_VCO3_STEP <= x"35"; + when "11011" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"34"; + when "11100" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"33"; + when "11101" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"23"; W_VCO3_STEP <= x"32"; + when "11110" => W_VCO1_STEP <= x"19"; W_VCO2_STEP <= x"22"; W_VCO3_STEP <= x"30"; + when "11111" => W_VCO1_STEP <= x"18"; W_VCO2_STEP <= x"21"; W_VCO3_STEP <= x"2F"; + when others => null; + end case; + end if; + end process; + +-- 8R VCO 240Hz - 140Hz (8) + mc_vco1 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(0), + I_STEP => W_VCO1_STEP, + O_WAV => W_VCO1_OUT + ); + +-- 8S VCO 330Hz - 190Hz (11) + mc_vco2 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(1), + I_STEP => W_VCO2_STEP, + O_WAV => W_VCO2_OUT + ); + +-- 8T VCO 480Hz - 270Hz (16) + mc_vco3 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(2), + I_STEP => W_VCO3_STEP, + O_WAV => W_VCO3_OUT + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_sound_vco.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_sound_vco.vhd new file mode 100644 index 00000000..e2a63e85 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_sound_vco.vhd @@ -0,0 +1,49 @@ +-------------------------------------------------------------------------------- +---- FPGA VCO +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +use work.sine_package.all; + +-- O_CLK = (I_CLK / 2^20) * I_STEP +entity MC_SOUND_VCO is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + I_FS : in std_logic; + I_STEP : in std_logic_vector( 7 downto 0); + O_WAV : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_VCO is + signal VCO1_CTR : std_logic_vector(19 downto 0) := (others => '0'); + signal sine : std_logic_vector(14 downto 0) := (others => '0'); + +begin + O_WAV <= sine(14 downto 7); + process(I_CLK, I_RSTn) + begin + if (I_RSTn = '0') then + VCO1_CTR <= (others=>'0'); + elsif rising_edge(I_CLK) then + if I_FS = '1' then + VCO1_CTR <= VCO1_CTR + I_STEP; + case VCO1_CTR(19 downto 18) is + when "00" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "01" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when "10" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "11" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_stars.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_stars.vhd new file mode 100644 index 00000000..b91197b3 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_stars.vhd @@ -0,0 +1,90 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA STARS +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity MC_STARS is + port ( + I_CLK_18M : in std_logic; + I_CLK_6M : in std_logic; + I_H_FLIP : in std_logic; + I_V_SYNC : in std_logic; + I_8HF : in std_logic; + I_256HnX : in std_logic; + I_1VF : in std_logic; + I_2V : in std_logic; + I_STARS_ON : in std_logic; + I_STARS_OFFn : in std_logic; + + O_R : out std_logic_vector(1 downto 0); + O_G : out std_logic_vector(1 downto 0); + O_B : out std_logic_vector(1 downto 0); + O_NOISE : out std_logic + ); +end; + +architecture RTL of MC_STARS is + signal CLK_1C : std_logic := '0'; + signal W_2D_Qn : std_logic := '0'; + + signal W_3B : std_logic := '0'; + signal noise : std_logic := '0'; + signal W_2A : std_logic := '0'; + signal W_4P : std_logic := '0'; + signal CLK_1AB : std_logic := '0'; + signal W_1AB_Q : std_logic_vector(15 downto 0) := (others => '0'); + signal W_1C_Q : std_logic_vector( 1 downto 0) := (others => '0'); +begin + O_R <= (W_1AB_Q( 9) & W_1AB_Q (8) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_G <= (W_1AB_Q(11) & W_1AB_Q(10) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_B <= (W_1AB_Q(13) & W_1AB_Q(12) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + + CLK_1C <= not (I_CLK_18M and (not I_CLK_6M )and (not I_V_SYNC) and I_256HnX); + CLK_1AB <= not (CLK_1C or (not (I_H_FLIP or W_1C_Q(1)))); + W_3B <= W_2D_Qn xor W_1AB_Q(4); + + W_2A <= '0' when (W_1AB_Q(7 downto 0) = x"ff") else '1'; + W_4P <= not (( I_8HF xor I_1VF ) and W_2D_Qn and I_STARS_OFFn); + + O_NOISE <= noise ; + + process(I_2V) + begin + if rising_edge(I_2V) then + noise <= W_2D_Qn; + end if; + end process; + + process(CLK_1C, I_V_SYNC) + begin + if(I_V_SYNC = '1') then + W_1C_Q <= (others => '0'); + elsif rising_edge(CLK_1C) then + W_1C_Q <= W_1C_Q(0) & '1'; + end if; + end process; + + process(CLK_1AB, I_STARS_ON) + begin + if(I_STARS_ON = '0') then + W_1AB_Q <= (others => '0'); + W_2D_Qn <= '1'; + elsif rising_edge(CLK_1AB) then + W_1AB_Q <= W_1AB_Q(14 downto 0) & W_3B; + W_2D_Qn <= not W_1AB_Q(15); + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_video.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_video.vhd new file mode 100644 index 00000000..dbe0d0d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mc_video.vhd @@ -0,0 +1,433 @@ +-------------------------------------------------------------------------------- +---- FPGA GALAXIAN VIDEO +---- +---- Version : 2.50 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 4-30 galaxian modify by K.DEGAWA +---- 2004- 5- 6 first release. +---- 2004- 8-23 Improvement with T80-IP. +---- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +-------------------------------------------------------------------------------- + +------------------------------------------------------------------------------------------- +-- H_CNT(0), H_CNT(1), H_CNT(2), H_CNT(3), H_CNT(4), H_CNT(5), H_CNT(6), H_CNT(7), H_CNT(8), +-- 1 H 2 H 4 H 8 H 16 H 32H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT(0), V_CNT(1), V_CNT(2), V_CNT(3), V_CNT(4), V_CNT(5), V_CNT(6), V_CNT(7) +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_VIDEO is + port( + I_CLK_18M : in std_logic; + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_V_CNT : in std_logic_vector(7 downto 0); + I_H_FLIP : in std_logic; + I_V_FLIP : in std_logic; + I_V_BLn : in std_logic; + I_C_BLn : in std_logic; + + I_A : in std_logic_vector(9 downto 0); + I_BD : in std_logic_vector(7 downto 0); + I_OBJ_SUB_A : in std_logic_vector(2 downto 0); + I_OBJ_RAM_RQ : in std_logic; + I_OBJ_RAM_RD : in std_logic; + I_OBJ_RAM_WR : in std_logic; + I_VID_RAM_RD : in std_logic; + I_VID_RAM_WR : in std_logic; + I_DRIVER_WR : in std_logic; + + O_C_BLnX : out std_logic; + O_8HF : out std_logic; + O_256HnX : out std_logic; + O_1VF : out std_logic; + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic; + + O_BD : out std_logic_vector(7 downto 0); + O_VID : out std_logic_vector(1 downto 0); + O_COL : out std_logic_vector(2 downto 0) + ); +end; + +architecture RTL of MC_VIDEO is + + signal WB_LDn : std_logic := '0'; + signal WB_CNTRLDn : std_logic := '0'; + signal WB_CNTRCLRn : std_logic := '0'; + signal WB_COLLn : std_logic := '0'; + signal WB_VPLn : std_logic := '0'; + signal WB_OBJDATALn : std_logic := '0'; + signal WB_MLDn : std_logic := '0'; + signal WB_SLDn : std_logic := '0'; + signal W_3D : std_logic := '0'; + signal W_LDn : std_logic := '0'; + signal W_CNTRLDn : std_logic := '0'; + signal W_CNTRCLRn : std_logic := '0'; + signal W_COLLn : std_logic := '0'; + signal W_VPLn : std_logic := '0'; + signal W_OBJDATALn : std_logic := '0'; + signal W_MLDn : std_logic := '0'; + signal W_SLDn : std_logic := '0'; + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_H_POSI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_2M_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6K_Q : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_6P_Q : std_logic_vector( 6 downto 0) := (others => '0'); + signal W_45T_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2KL : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2HJ : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_RV : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_RC : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_O_OBJ_ROM_A : std_logic_vector(10 downto 0) := (others => '0'); + signal W_VID_RAM_A : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AA : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AB : std_logic_vector(11 downto 0) := (others => '0'); + signal C_2HJ : std_logic_vector( 1 downto 0) := (others => '0'); + signal C_2KL : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_CD : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_1M : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_A : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_B : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_Y : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_LRAM_DI : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_LRAM_DO : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_1H_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_1K_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_LRAM_A : std_logic_vector( 7 downto 0) := (others => '0'); +-- signal W_OBJ_RAM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_HF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_45N_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6J_Q : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DA : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DB : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_256HnX : std_logic := '0'; + signal W_2N : std_logic := '0'; + signal W_45T_CLR : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_H_FLIP1 : std_logic := '0'; + signal W_H_FLIP2 : std_logic := '0'; + signal W_H_FLIP1X : std_logic := '0'; + signal W_H_FLIP2X : std_logic := '0'; + signal W_LRAM_AND : std_logic := '0'; + signal W_RAW0 : std_logic := '0'; + signal W_RAW1 : std_logic := '0'; + signal W_RAW_OR : std_logic := '0'; + signal W_SRCLK : std_logic := '0'; + signal W_SRLD : std_logic := '0'; + signal W_VID_RAM_CS : std_logic := '0'; + signal W_CLK_6Mn : std_logic := '0'; + +begin + ld_pls : entity work.MC_LD_PLS + port map( + I_CLK_6M => I_CLK_6M, + I_H_CNT => I_H_CNT, + I_3D_DI => W_3D, + + O_LDn => WB_LDn, + O_CNTRLDn => WB_CNTRLDn, + O_CNTRCLRn => WB_CNTRCLRn, + O_COLLn => WB_COLLn, + O_VPLn => WB_VPLn, + O_OBJDATALn => WB_OBJDATALn, + O_MLDn => WB_MLDn, + O_SLDn => WB_SLDn + ); + + obj_ram : entity work.MC_OBJ_RAM + port map( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(7 downto 0), + I_WEA => I_OBJ_RAM_WR, + I_CEA => I_OBJ_RAM_RQ, + I_DA => I_BD, + O_DA => W_OBJ_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_OBJ_RAM_AB, + I_WEB => '0', + I_CEB => '1', + I_DB => x"00", + O_DB => W_OBJ_RAM_DOB + ); + + lram : entity work.MC_LRAM + port map( + I_CLK => I_CLK_18M, + I_ADDR => W_LRAM_A, + I_WE => W_CLK_6Mn, + I_D => W_LRAM_DI, + O_Dn => W_LRAM_DO + ); + + missile : entity work.MC_MISSILE + port map( + I_CLK_18M => I_CLK_18M, + I_CLK_6M => I_CLK_6M, + I_C_BLn_X => W_C_BLnX, + I_MLDn => W_MLDn, + I_SLDn => W_SLDn, + I_HPOS => W_H_POSI, + O_MISSILEn => O_MISSILEn, + O_SHELLn => O_SHELLn + ); + + vid_ram : entity work.MC_VID_RAM + port map ( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(9 downto 0), + I_DA => W_VID_RAM_DI, + I_WEA => I_VID_RAM_WR, + I_CEA => W_VID_RAM_CS, + O_DA => W_VID_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_VID_RAM_A(9 downto 0), + I_DB => x"00", + I_WEB => '0', + I_CEB => '1', + O_DB => W_VID_RAM_DOB + ); + + -- 1K VID-Rom + k_rom : entity work.GALAXIAN_1K + port map ( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1K_D + ); + + -- 1H VID-Rom + h_rom : entity work.GALAXIAN_1H + port map( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1H_D + ); + +----------------------------------------------------------------------------------- + + process(I_CLK_12M) + begin + if falling_edge(I_CLK_12M) then + W_LDn <= WB_LDn; + W_CNTRLDn <= WB_CNTRLDn; + W_CNTRCLRn <= WB_CNTRCLRn; + W_COLLn <= WB_COLLn; + W_VPLn <= WB_VPLn; + W_OBJDATALn <= WB_OBJDATALn; + W_MLDn <= WB_MLDn; + W_SLDn <= WB_SLDn; + end if; + end process; + + W_CLK_6Mn <= not I_CLK_6M; + + W_6J_DA <= I_H_FLIP & W_HF_CNT(7) & W_HF_CNT(3) & I_H_CNT(2); + W_6J_DB <= W_OBJ_D(6) & ( W_HF_CNT(3) and I_H_CNT(1) ) & I_H_CNT(2) & I_H_CNT(1); + W_6J_Q <= W_6J_DB when I_H_CNT(8) = '1' else W_6J_DA; + + W_H_FLIP1 <= (not I_H_CNT(8)) and I_H_FLIP; + + W_HF_CNT(7 downto 3) <= not I_H_CNT(7 downto 3) when W_H_FLIP1 = '1' else I_H_CNT(7 downto 3); + W_VF_CNT <= not I_V_CNT when I_V_FLIP = '1' else I_V_CNT; + + O_8HF <= W_HF_CNT(3); + O_1VF <= W_VF_CNT(0); + W_H_FLIP2 <= W_6J_Q(3); + +-- Parts 4F,5F + W_OBJ_RAM_AB <= "0" & I_H_CNT(8) & W_6J_Q(2) & W_HF_CNT(6 downto 4) & W_6J_Q(1 downto 0); +-- W_OBJ_RAM_A <= W_OBJ_RAM_AB when I_OBJ_RAM_RQ = '0' else I_A(7 downto 0) ; + + process(I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_H_POSI <= W_OBJ_RAM_DOB; + end if; + end process; + + W_OBJ_RAM_D <= W_OBJ_RAM_DOA when I_OBJ_RAM_RD = '1' else (others => '0'); + +-- Parts 4L + process(W_OBJDATALn) + begin + if rising_edge(W_OBJDATALn) then + W_OBJ_D <= W_H_POSI; + end if; + end process; + +-- Parts 4,5N + W_45N_Q <= W_VF_CNT + W_H_POSI; + W_3D <= '0' when W_45N_Q = x"FF" else '1'; + + process(W_VPLn, I_V_BLn) + begin + if (I_V_BLn = '0') then + W_2M_Q <= (others => '0'); + elsif rising_edge(W_VPLn) then + W_2M_Q <= W_45N_Q; + end if; + end process; + + W_2N <= I_H_CNT(8) and W_OBJ_D(7); + W_1M <= W_2M_Q(3 downto 0) xor (W_2N & W_2N & W_2N & W_2N); + W_VID_RAM_CS <= I_VID_RAM_RD or I_VID_RAM_WR; + W_VID_RAM_DI <= I_BD when I_VID_RAM_WR = '1' else (others => '0'); + W_VID_RAM_AA <= (not ( W_2M_Q(7) and W_2M_Q(6) and W_2M_Q(5) and W_2M_Q(4))) & (not W_VID_RAM_CS) & "0000000000"; -- I_A(9:0) + W_VID_RAM_AB <= "00" & W_2M_Q(7 downto 4) & W_1M(3) & W_HF_CNT(7 downto 3); + W_VID_RAM_A <= W_VID_RAM_AB when I_C_BLn = '1' else W_VID_RAM_AA; + W_VID_RAM_D <= W_VID_RAM_DOA when I_VID_RAM_RD = '1' else (others => '0'); + +---- VIDEO DATA OUTPUT -------------- + + O_BD <= W_OBJ_RAM_D or W_VID_RAM_D; + W_SRLD <= not (W_LDn or W_VID_RAM_A(11)); + W_OBJ_ROM_AB <= W_OBJ_D(5 downto 0) & W_1M(3) & (W_OBJ_D(6) xor I_H_CNT(3)); + W_OBJ_ROM_A <= W_OBJ_ROM_AB when I_H_CNT(8) = '1' else W_VID_RAM_DOB; + W_O_OBJ_ROM_A <= W_OBJ_ROM_A & W_1M(2 downto 0); + +----------------------------------------------------------------------------------- + + W_3L_A <= reg_2HJ(7) & reg_2KL(7) & "1" & W_SRLD; + W_3L_B <= reg_2HJ(0) & reg_2KL(0) & W_SRLD & "1"; + W_3L_Y <= W_3L_B when W_H_FLIP2X = '1' else W_3L_A; -- (3)=RAW1,(2)=RAW0 + C_2HJ <= W_3L_Y(1 downto 0); + C_2KL <= W_3L_Y(1 downto 0); + W_RAW0 <= W_3L_Y(2); + W_RAW1 <= W_3L_Y(3); + W_SRCLK <= I_CLK_6M; + +-------- PARTS 2KL ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2KL) is + when "00" => reg_2KL <= reg_2KL; + when "10" => reg_2KL <= reg_2KL(6 downto 0) & "0"; + when "01" => reg_2KL <= "0" & reg_2KL(7 downto 1); + when "11" => reg_2KL <= W_1K_D; + when others => null; + end case; + end if; + end process; + +-------- PARTS 2HJ ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2HJ) is + when "00" => reg_2HJ <= reg_2HJ; + when "10" => reg_2HJ <= reg_2HJ(6 downto 0) & "0"; + when "01" => reg_2HJ <= "0" & reg_2HJ(7 downto 1); + when "11" => reg_2HJ <= W_1H_D; + when others => null; + end case; + end if; + end process; + +------- SHT2 ----------------------------------------------------- + +-- Parts 6K + process(W_COLLn) + begin + if rising_edge(W_COLLn) then + W_6K_Q <= W_H_POSI(2 downto 0); + end if; + end process; + +-- Parts 6P + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + if (W_LDn = '0') then + W_6P_Q <= W_H_FLIP2 & W_H_FLIP1 & I_C_BLn & (not I_H_CNT(8)) & W_6K_Q(2 downto 0); + else + W_6P_Q <= W_6P_Q; + end if; + end if; + end process; + + W_H_FLIP2X <= W_6P_Q(6); + W_H_FLIP1X <= W_6P_Q(5); + W_C_BLnX <= W_6P_Q(4); + W_256HnX <= W_6P_Q(3); + W_CD <= W_6P_Q(2 downto 0); + O_256HnX <= W_256HnX; + O_C_BLnX <= W_C_BLnX; + W_45T_CLR <= W_CNTRCLRn or W_256HnX ; + + process(I_CLK_6M, W_45T_CLR) + begin + if (W_45T_CLR = '0') then + W_45T_Q <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + if (W_CNTRLDn = '0') then + W_45T_Q <= W_H_POSI; + else + W_45T_Q <= W_45T_Q + 1; + end if; + end if; + end process; + + W_LRAM_A <= (not W_45T_Q) when W_H_FLIP1X = '1' else W_45T_Q; + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_RV <= W_LRAM_DO(1 downto 0); + W_RC <= W_LRAM_DO(4 downto 2); + end if; + end process; + + W_LRAM_AND <= not (not ((W_LRAM_A(4) or W_LRAM_A(5)) or (W_LRAM_A(6) or W_LRAM_A(7))) or W_256HnX ); + W_RAW_OR <= W_RAW0 or W_RAW1 ; + + W_VID(0) <= not (not (W_RAW0 and W_RV(1)) and W_RV(0)); + W_VID(1) <= not (not (W_RAW1 and W_RV(0)) and W_RV(1)); + W_COL(0) <= not (not (W_RAW_OR and W_CD(0) and W_RC(1) and W_RC(2)) and W_RC(0)); + W_COL(1) <= not (not (W_RAW_OR and W_CD(1) and W_RC(2) and W_RC(0)) and W_RC(1)); + W_COL(2) <= not (not (W_RAW_OR and W_CD(2) and W_RC(0) and W_RC(1)) and W_RC(2)); + + O_VID <= W_VID; + O_COL <= W_COL; + + W_LRAM_DI(0) <= W_LRAM_AND and W_VID(0); + W_LRAM_DI(1) <= W_LRAM_AND and W_VID(1); + W_LRAM_DI(2) <= W_LRAM_AND and W_COL(0); + W_LRAM_DI(3) <= W_LRAM_AND and W_COL(1); + W_LRAM_DI(4) <= W_LRAM_AND and W_COL(2); + +end RTL; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/mist_io.v b/Arcade/Galaxian Hardware/Omega_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_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/Arcade/Galaxian Hardware/Omega_MiST/rtl/osd.v b/Arcade/Galaxian Hardware/Omega_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_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/Arcade/Galaxian Hardware/Omega_MiST/rtl/pll.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d76a5e1d --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/pll.vhd @@ -0,0 +1,451 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + c3 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + clk3_divide_by : NATURAL; + clk3_duty_cycle : NATURAL; + clk3_multiply_by : NATURAL; + clk3_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire2 <= sub_wire0(3); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c3 <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 3, + clk0_duty_cycle => 50, + clk0_multiply_by => 2, + clk0_phase_shift => "0", + clk1_divide_by => 9, + clk1_duty_cycle => 50, + clk1_multiply_by => 4, + clk1_phase_shift => "0", + clk2_divide_by => 9, + clk2_duty_cycle => 50, + clk2_multiply_by => 2, + clk2_phase_shift => "0", + clk3_divide_by => 6, + clk3_duty_cycle => 50, + clk3_multiply_by => 1, + clk3_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_USED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire6, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "3" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "6" +-- 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: DUTY_CYCLE3 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "18.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "12.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "6.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "4.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 "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "4" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "18.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "12.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "6.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "4.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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 "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "3" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "4" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "6" +-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK3_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_USED" +-- 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_USED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/scandoubler.v b/Arcade/Galaxian Hardware/Omega_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..36e71ed2 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_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/Arcade/Galaxian Hardware/Omega_MiST/rtl/sine_package.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/sine_package.vhd new file mode 100644 index 00000000..473caa04 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/sine_package.vhd @@ -0,0 +1,152 @@ +library ieee; +use ieee.std_logic_1164.all; + +package sine_package is + + subtype table_value_type is integer range 0 to 16383; + subtype table_index_type is std_logic_vector( 6 downto 0 ); + + function get_table_value (table_index: table_index_type) return table_value_type; + +end; + +package body sine_package is + + function get_table_value (table_index: table_index_type) return table_value_type is + variable table_value: table_value_type; + begin + case table_index is + when "0000000" => table_value := 101; + when "0000001" => table_value := 302; + when "0000010" => table_value := 503; + when "0000011" => table_value := 703; + when "0000100" => table_value := 904; + when "0000101" => table_value := 1105; + when "0000110" => table_value := 1305; + when "0000111" => table_value := 1506; + when "0001000" => table_value := 1706; + when "0001001" => table_value := 1906; + when "0001010" => table_value := 2105; + when "0001011" => table_value := 2304; + when "0001100" => table_value := 2503; + when "0001101" => table_value := 2702; + when "0001110" => table_value := 2900; + when "0001111" => table_value := 3098; + when "0010000" => table_value := 3295; + when "0010001" => table_value := 3491; + when "0010010" => table_value := 3688; + when "0010011" => table_value := 3883; + when "0010100" => table_value := 4078; + when "0010101" => table_value := 4273; + when "0010110" => table_value := 4466; + when "0010111" => table_value := 4659; + when "0011000" => table_value := 4852; + when "0011001" => table_value := 5044; + when "0011010" => table_value := 5234; + when "0011011" => table_value := 5425; + when "0011100" => table_value := 5614; + when "0011101" => table_value := 5802; + when "0011110" => table_value := 5990; + when "0011111" => table_value := 6177; + when "0100000" => table_value := 6362; + when "0100001" => table_value := 6547; + when "0100010" => table_value := 6731; + when "0100011" => table_value := 6914; + when "0100100" => table_value := 7095; + when "0100101" => table_value := 7276; + when "0100110" => table_value := 7456; + when "0100111" => table_value := 7634; + when "0101000" => table_value := 7811; + when "0101001" => table_value := 7988; + when "0101010" => table_value := 8162; + when "0101011" => table_value := 8336; + when "0101100" => table_value := 8509; + when "0101101" => table_value := 8680; + when "0101110" => table_value := 8850; + when "0101111" => table_value := 9018; + when "0110000" => table_value := 9185; + when "0110001" => table_value := 9351; + when "0110010" => table_value := 9515; + when "0110011" => table_value := 9678; + when "0110100" => table_value := 9840; + when "0110101" => table_value := 10000; + when "0110110" => table_value := 10158; + when "0110111" => table_value := 10315; + when "0111000" => table_value := 10471; + when "0111001" => table_value := 10625; + when "0111010" => table_value := 10777; + when "0111011" => table_value := 10927; + when "0111100" => table_value := 11076; + when "0111101" => table_value := 11224; + when "0111110" => table_value := 11369; + when "0111111" => table_value := 11513; + when "1000000" => table_value := 11655; + when "1000001" => table_value := 11796; + when "1000010" => table_value := 11934; + when "1000011" => table_value := 12071; + when "1000100" => table_value := 12206; + when "1000101" => table_value := 12339; + when "1000110" => table_value := 12471; + when "1000111" => table_value := 12600; + when "1001000" => table_value := 12728; + when "1001001" => table_value := 12853; + when "1001010" => table_value := 12977; + when "1001011" => table_value := 13099; + when "1001100" => table_value := 13219; + when "1001101" => table_value := 13336; + when "1001110" => table_value := 13452; + when "1001111" => table_value := 13566; + when "1010000" => table_value := 13678; + when "1010001" => table_value := 13787; + when "1010010" => table_value := 13895; + when "1010011" => table_value := 14000; + when "1010100" => table_value := 14104; + when "1010101" => table_value := 14205; + when "1010110" => table_value := 14304; + when "1010111" => table_value := 14401; + when "1011000" => table_value := 14496; + when "1011001" => table_value := 14588; + when "1011010" => table_value := 14679; + when "1011011" => table_value := 14767; + when "1011100" => table_value := 14853; + when "1011101" => table_value := 14936; + when "1011110" => table_value := 15018; + when "1011111" => table_value := 15097; + when "1100000" => table_value := 15174; + when "1100001" => table_value := 15249; + when "1100010" => table_value := 15321; + when "1100011" => table_value := 15391; + when "1100100" => table_value := 15459; + when "1100101" => table_value := 15524; + when "1100110" => table_value := 15587; + when "1100111" => table_value := 15648; + when "1101000" => table_value := 15706; + when "1101001" => table_value := 15762; + when "1101010" => table_value := 15816; + when "1101011" => table_value := 15867; + when "1101100" => table_value := 15916; + when "1101101" => table_value := 15963; + when "1101110" => table_value := 16007; + when "1101111" => table_value := 16048; + when "1110000" => table_value := 16088; + when "1110001" => table_value := 16124; + when "1110010" => table_value := 16159; + when "1110011" => table_value := 16191; + when "1110100" => table_value := 16220; + when "1110101" => table_value := 16247; + when "1110110" => table_value := 16272; + when "1110111" => table_value := 16294; + when "1111000" => table_value := 16314; + when "1111001" => table_value := 16331; + when "1111010" => table_value := 16346; + when "1111011" => table_value := 16358; + when "1111100" => table_value := 16368; + when "1111101" => table_value := 16375; + when "1111110" => table_value := 16380; + when "1111111" => table_value := 16383; + when others => null; + end case; + return table_value; + end; + +end; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/spram.vhd b/Arcade/Galaxian Hardware/Omega_MiST/rtl/spram.vhd new file mode 100644 index 00000000..ad6b58b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone V", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade/Galaxian Hardware/Omega_MiST/rtl/video_mixer.sv b/Arcade/Galaxian Hardware/Omega_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..b9f7e424 --- /dev/null +++ b/Arcade/Galaxian Hardware/Omega_MiST/rtl/video_mixer.sv @@ -0,0 +1,243 @@ +// +// +// 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; +reg [DWIDTH:0] Rd,Gd,Bd; +always @(posedge clk_sys) {Rd,Gd,Bd} <= {R,G,B}; +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(Rd), + .g_in(Gd), + .b_in(Bd), + + .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/Arcade/Galaxian Hardware/Orbitron_MiST/Orbitron.qpf b/Arcade/Galaxian Hardware/Orbitron_MiST/Orbitron.qpf new file mode 100644 index 00000000..258424fc --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/Orbitron.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:59:16 November 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "14:59:16 November 16, 2017" + +# Revisions + +PROJECT_REVISION = "Orbitron" \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/Orbitron.qsf b/Arcade/Galaxian Hardware/Orbitron_MiST/Orbitron.qsf new file mode 100644 index 00000000..ce29d38c --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/Orbitron.qsf @@ -0,0 +1,190 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 18:12:35 November 17, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Orbitron_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80as.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_6L.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1K.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1H.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_HIT.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_FIR.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/sine_package.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Orbitron.sv +set_global_assignment -name VHDL_FILE rtl/mc_video.vhd +set_global_assignment -name VHDL_FILE rtl/mc_stars.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_vco.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_b.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_a.vhd +set_global_assignment -name VHDL_FILE rtl/mc_missile.vhd +set_global_assignment -name VHDL_FILE rtl/mc_logic.vhd +set_global_assignment -name VHDL_FILE rtl/mc_ld_pls.vhd +set_global_assignment -name VHDL_FILE rtl/mc_inport.vhd +set_global_assignment -name VHDL_FILE rtl/mc_hv_count.vhd +set_global_assignment -name VHDL_FILE rtl/mc_col_pal.vhd +set_global_assignment -name VHDL_FILE rtl/mc_bram.vhd +set_global_assignment -name VHDL_FILE rtl/mc_adec.vhd +set_global_assignment -name VHDL_FILE rtl/galaxian.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Orbitron +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Galaxian) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Galaxian) +# -------------------- +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/Orbitron.srf b/Arcade/Galaxian Hardware/Orbitron_MiST/Orbitron.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/Orbitron.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/README.txt b/Arcade/Galaxian Hardware/Orbitron_MiST/README.txt new file mode 100644 index 00000000..3a2cf965 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/README.txt @@ -0,0 +1,25 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Orbitron port to MiST by Gehstock +-- 18 December 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Galaxian hardware +-- Copyright(c) 2004 Katsumi Degawa +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- F2 : Coin + Start 2 players +-- F1 : Coin + Start 1 player +-- SPACE : Fire +-- ARROW KEYS : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + +--Rotate and Fix Video \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/Release/Orbitron.rbf b/Arcade/Galaxian Hardware/Orbitron_MiST/Release/Orbitron.rbf new file mode 100644 index 00000000..1b93f88e Binary files /dev/null and b/Arcade/Galaxian Hardware/Orbitron_MiST/Release/Orbitron.rbf differ diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/clean.bat b/Arcade/Galaxian Hardware/Orbitron_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_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/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/Orbitron.sv b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/Orbitron.sv new file mode 100644 index 00000000..dd535dc3 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/Orbitron.sv @@ -0,0 +1,176 @@ +//============================================================================ +// Arcade: Orbitron +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Orbitron +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Orbitron;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_18, clk_12, clk_6, clk_4p5; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_18), + .c1(clk_12), + .c2(clk_6), + .c3(clk_4p5)//for now, needs a fix +); + +wire m_up = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +galaxian orbitron +( + .W_CLK_18M(clk_18), + .W_CLK_12M(clk_12), + .W_CLK_6M(clk_6), + .I_RESET(status[0] | status[6] | buttons[1]), + .P1_CSJUDLR({m_coin,m_start1,m_fire,2'b00,m_right,m_left}), + .P2_CSJUDLR({1'b0, m_start2,m_fire,2'b00,m_up ,m_down}), + .W_R(r), + .W_G(g), + .W_B(b), + .W_H_SYNC(hs), + .W_V_SYNC(vs), + .HBLANK(hblank), + .VBLANK(vblank), + .W_SDAT_A(audio_a), + .W_SDAT_B(audio_b) +); + +wire [7:0] audio_a, audio_b; +wire [10:0] audio = {1'b0, audio_b, 2'b0} + {3'b0, audio_a}; + +dac dac ( + .clk_i(clk_18), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [2:0] r, g, b; +wire hblank, vblank; +wire blankn = ~(hblank | vblank); +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_18), + .ce_pix(clk_4p5), + .ce_pix_actual(clk_4p5), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn?r:"000"), + .G(blankn?g:"000"), + .B(blankn?b:"000"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_18 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_18), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GALAXIAN_1H.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GALAXIAN_1H.vhd new file mode 100644 index 00000000..dacb0a04 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GALAXIAN_1H.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_1H is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_1H is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"7C",X"82",X"82",X"82",X"82",X"7C",X"00",X"00",X"02",X"02",X"FE",X"42",X"02",X"00",X"00", + X"00",X"62",X"92",X"8A",X"86",X"86",X"42",X"00",X"00",X"8C",X"D2",X"B2",X"92",X"82",X"84",X"00", + X"00",X"08",X"FE",X"48",X"28",X"18",X"08",X"00",X"00",X"1C",X"A2",X"A2",X"A2",X"A6",X"E4",X"00", + X"00",X"8C",X"92",X"92",X"92",X"52",X"3C",X"00",X"00",X"C0",X"A0",X"90",X"8E",X"80",X"80",X"00", + X"00",X"6C",X"92",X"92",X"92",X"92",X"6C",X"00",X"00",X"7C",X"92",X"92",X"92",X"92",X"60",X"00", + X"3F",X"7F",X"FF",X"3F",X"3F",X"0E",X"0E",X"0C",X"08",X"0C",X"3E",X"3E",X"0F",X"0F",X"3F",X"3F", + X"00",X"00",X"00",X"18",X"18",X"00",X"00",X"00",X"18",X"42",X"24",X"81",X"81",X"24",X"42",X"18", + X"40",X"20",X"10",X"08",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"30",X"30",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00", + X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00",X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00", + X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00",X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00", + X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00", + X"FC",X"FE",X"02",X"02",X"02",X"06",X"04",X"00",X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00", + X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00", + X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00", + X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00",X"7A",X"FC",X"8E",X"8A",X"82",X"FE",X"7C",X"00", + X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00",X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00", + X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00", + X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0",X"00",X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00", + X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00", + X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"00", + X"18",X"42",X"24",X"81",X"81",X"24",X"42",X"18",X"0D",X"53",X"31",X"19",X"08",X"04",X"F2",X"00", + X"3C",X"42",X"A5",X"A5",X"A5",X"99",X"42",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"42",X"00",X"02",X"80",X"00",X"00",X"02",X"00",X"58",X"94",X"84", + X"10",X"07",X"00",X"3C",X"50",X"97",X"50",X"3C",X"84",X"78",X"82",X"40",X"90",X"02",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"36",X"3F",X"3F",X"36",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00", + X"BE",X"E3",X"A1",X"CD",X"C2",X"F1",X"E7",X"FF",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"27",X"2F",X"3F",X"3E",X"3E",X"3F",X"2F",X"27",X"03",X"03",X"03",X"03",X"03",X"03",X"63",X"63", + X"3F",X"3E",X"FF",X"F7",X"F7",X"FF",X"3E",X"3F",X"63",X"63",X"03",X"03",X"03",X"03",X"03",X"03", + X"10",X"10",X"30",X"30",X"70",X"71",X"72",X"7C",X"08",X"10",X"20",X"40",X"80",X"00",X"00",X"00", + X"78",X"70",X"70",X"70",X"30",X"30",X"10",X"10",X"00",X"00",X"00",X"80",X"40",X"20",X"10",X"08", + X"10",X"10",X"30",X"30",X"70",X"70",X"70",X"78",X"08",X"08",X"08",X"08",X"08",X"14",X"14",X"1C", + X"7C",X"72",X"71",X"70",X"30",X"30",X"10",X"10",X"1C",X"14",X"14",X"08",X"08",X"08",X"08",X"08", + X"3C",X"34",X"3C",X"3E",X"3E",X"7F",X"57",X"5E",X"FF",X"FF",X"FF",X"F7",X"3F",X"3E",X"3F",X"37", + X"5E",X"57",X"7F",X"3E",X"3E",X"3C",X"34",X"3C",X"37",X"3F",X"3E",X"3F",X"F7",X"FF",X"FF",X"FF", + X"00",X"03",X"00",X"00",X"00",X"00",X"40",X"40",X"00",X"C0",X"00",X"00",X"00",X"00",X"02",X"02", + X"40",X"40",X"00",X"00",X"00",X"00",X"03",X"00",X"02",X"02",X"00",X"00",X"00",X"00",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0", + X"03",X"03",X"01",X"0E",X"1C",X"08",X"00",X"00",X"E0",X"D0",X"30",X"70",X"F0",X"F0",X"70",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"40",X"40", + X"00",X"01",X"03",X"07",X"07",X"00",X"00",X"00",X"40",X"40",X"40",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC", + X"01",X"03",X"01",X"01",X"01",X"01",X"00",X"00",X"FC",X"FC",X"F8",X"F0",X"F0",X"F8",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"07",X"06",X"07",X"01",X"01",X"C0",X"40",X"40",X"70",X"30",X"70",X"C0",X"C0", + X"01",X"21",X"3F",X"31",X"20",X"00",X"00",X"00",X"C0",X"C2",X"FE",X"C6",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44", + X"1F",X"13",X"01",X"01",X"00",X"00",X"00",X"00",X"7C",X"64",X"40",X"40",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"03",X"06",X"04",X"25",X"3D",X"40",X"40",X"40",X"40",X"00",X"00",X"20",X"B8", + X"3D",X"25",X"04",X"06",X"03",X"01",X"01",X"01",X"B8",X"20",X"00",X"00",X"40",X"40",X"40",X"40", + X"00",X"00",X"01",X"01",X"02",X"07",X"06",X"07",X"00",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"06",X"07",X"06",X"03",X"01",X"01",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"80",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"03",X"07",X"0F",X"0F",X"0F",X"03",X"01",X"0F",X"0F",X"1F",X"1F",X"0F",X"07",X"03",X"01", + X"7F",X"3F",X"3F",X"0F",X"0F",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"03",X"07",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"0F",X"07",X"0F",X"1F",X"1F",X"0F", + X"7F",X"3F",X"1F",X"0F",X"1F",X"1F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"03",X"03",X"0F",X"0F",X"1F",X"3F",X"FF",X"1F",X"1F",X"3F",X"7F",X"3F",X"7F",X"FF",X"FF", + X"FF",X"7F",X"7F",X"3F",X"7F",X"3F",X"7F",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"F8",X"FC",X"FE", + X"FE",X"FC",X"F8",X"F0",X"E0",X"C0",X"80",X"00",X"7F",X"3F",X"1F",X"0F",X"07",X"03",X"01",X"00", + X"00",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"30",X"70",X"20",X"00",X"20",X"30",X"70",X"60",X"60",X"60",X"60",X"00",X"60",X"60",X"60", + X"70",X"20",X"00",X"00",X"20",X"30",X"70",X"20",X"60",X"60",X"00",X"60",X"60",X"60",X"60",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"20",X"00",X"FB",X"F3",X"F5",X"F6",X"F7",X"F3",X"F3",X"71", + X"00",X"03",X"07",X"0F",X"1F",X"3F",X"30",X"20",X"39",X"38",X"1C",X"0C",X"0C",X"06",X"03",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"00",X"00",X"00",X"80",X"F8",X"FE",X"FF",X"FF", + X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"20",X"00",X"FF",X"FF",X"FF",X"FF",X"C0",X"CE",X"1D",X"7B", + X"EF",X"EF",X"DC",X"39",X"81",X"FF",X"FF",X"FF",X"C0",X"80",X"02",X"FE",X"FE",X"FE",X"FC",X"FC", + X"FF",X"FF",X"7F",X"3F",X"1F",X"00",X"00",X"00",X"F8",X"F8",X"F0",X"E0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"60",X"30",X"18",X"18",X"1C",X"8E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CE",X"CF",X"E7",X"E7",X"F7",X"37",X"D7",X"E7",X"00",X"82",X"C6",X"FE",X"FC",X"F8",X"F0",X"E0", + X"00",X"00",X"00",X"00",X"02",X"00",X"10",X"00",X"01",X"00",X"12",X"00",X"40",X"08",X"00",X"80", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"08",X"00",X"02",X"20",X"08",X"00",X"80", + X"00",X"00",X"08",X"20",X"00",X"00",X"10",X"80",X"01",X"00",X"02",X"18",X"80",X"44",X"00",X"90", + X"00",X"00",X"02",X"00",X"08",X"00",X"40",X"00",X"00",X"05",X"A0",X"00",X"04",X"80",X"00",X"10", + X"00",X"1E",X"3F",X"33",X"33",X"3F",X"1E",X"00",X"00",X"37",X"27",X"2D",X"29",X"3B",X"3B",X"00", + X"33",X"33",X"33",X"3F",X"1E",X"00",X"00",X"00",X"03",X"3F",X"38",X"1F",X"1F",X"38",X"3F",X"03", + X"00",X"30",X"30",X"3F",X"3F",X"30",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"30",X"34",X"34",X"3F",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"06",X"0F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"1F",X"0F",X"06",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"08",X"10",X"13",X"00",X"00",X"00",X"00",X"80",X"40",X"20",X"20", + X"13",X"10",X"08",X"07",X"00",X"00",X"00",X"00",X"20",X"20",X"40",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"04",X"08",X"10",X"10",X"12",X"00",X"00",X"F0",X"08",X"04",X"82",X"02",X"22", + X"12",X"10",X"10",X"08",X"04",X"03",X"00",X"00",X"22",X"A2",X"82",X"04",X"08",X"F0",X"00",X"00", + X"0F",X"10",X"20",X"40",X"C0",X"80",X"83",X"83",X"E0",X"10",X"08",X"46",X"03",X"01",X"01",X"C1", + X"83",X"83",X"83",X"C0",X"48",X"20",X"10",X"0F",X"69",X"A1",X"41",X"03",X"02",X"04",X"08",X"F0", + X"00",X"00",X"00",X"00",X"00",X"02",X"0A",X"07",X"00",X"00",X"00",X"00",X"00",X"40",X"80",X"00", + X"1F",X"07",X"0A",X"02",X"00",X"00",X"00",X"00",X"E0",X"00",X"80",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"09",X"05",X"07",X"27",X"00",X"00",X"00",X"20",X"40",X"00",X"80",X"C0", + X"17",X"03",X"05",X"09",X"00",X"00",X"00",X"00",X"D0",X"90",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"08",X"00",X"21",X"18",X"1A",X"00",X"10",X"20",X"40",X"00",X"00",X"C8",X"42", + X"04",X"00",X"02",X"00",X"08",X"11",X"21",X"00",X"5C",X"40",X"48",X"60",X"08",X"04",X"00",X"00", + X"08",X"08",X"08",X"04",X"14",X"23",X"11",X"12",X"00",X"80",X"84",X"98",X"A0",X"A0",X"00",X"44", + X"04",X"06",X"06",X"01",X"04",X"10",X"20",X"00",X"62",X"4C",X"70",X"88",X"40",X"44",X"40",X"40"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GALAXIAN_1K.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GALAXIAN_1K.vhd new file mode 100644 index 00000000..fd77d08e --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GALAXIAN_1K.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_1K is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_1K is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"7C",X"82",X"82",X"82",X"82",X"7C",X"00",X"00",X"02",X"02",X"FE",X"42",X"02",X"00",X"00", + X"00",X"62",X"92",X"8A",X"86",X"86",X"42",X"00",X"00",X"8C",X"D2",X"B2",X"92",X"82",X"84",X"00", + X"00",X"08",X"FE",X"48",X"28",X"18",X"08",X"00",X"00",X"1C",X"A2",X"A2",X"A2",X"A6",X"E4",X"00", + X"00",X"8C",X"92",X"92",X"92",X"52",X"3C",X"00",X"00",X"C0",X"A0",X"90",X"8E",X"80",X"80",X"00", + X"00",X"6C",X"92",X"92",X"92",X"92",X"6C",X"00",X"00",X"7C",X"92",X"92",X"92",X"92",X"60",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"0E",X"0C",X"08",X"0C",X"0E",X"0E",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"18",X"18",X"00",X"00",X"00",X"18",X"42",X"24",X"81",X"81",X"24",X"42",X"18", + X"40",X"20",X"10",X"08",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"30",X"30",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00", + X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00",X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00", + X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00",X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00", + X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00", + X"FC",X"FE",X"02",X"02",X"02",X"06",X"04",X"00",X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00", + X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00", + X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00", + X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00",X"7A",X"FC",X"8E",X"8A",X"82",X"FE",X"7C",X"00", + X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00",X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00", + X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00", + X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0",X"00",X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00", + X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00", + X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"00", + X"18",X"00",X"00",X"81",X"81",X"00",X"00",X"18",X"00",X"40",X"20",X"10",X"08",X"04",X"02",X"00", + X"3C",X"42",X"A5",X"A5",X"A5",X"99",X"42",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"3F",X"3F",X"00",X"00",X"00",X"00",X"00",X"30",X"38",X"1C",X"0E",X"07",X"02", + X"00",X"0C",X"0C",X"0C",X"06",X"06",X"06",X"00",X"00",X"06",X"06",X"06",X"06",X"06",X"06",X"00", + X"00",X"00",X"00",X"3F",X"3F",X"00",X"00",X"00",X"02",X"07",X"0E",X"1C",X"38",X"30",X"00",X"00", + X"00",X"06",X"06",X"06",X"0C",X"0C",X"0C",X"00",X"00",X"06",X"06",X"06",X"06",X"06",X"06",X"00", + X"00",X"00",X"06",X"0F",X"0F",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"BE",X"E3",X"A1",X"CD",X"C2",X"F1",X"E7",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"07",X"0F",X"1F",X"1F",X"0F",X"07",X"03",X"20",X"1D",X"01",X"01",X"01",X"01",X"01",X"01", + X"3E",X"3F",X"FE",X"FE",X"FE",X"FE",X"3F",X"3E",X"01",X"01",X"01",X"01",X"01",X"01",X"1D",X"20", + X"00",X"00",X"00",X"00",X"00",X"01",X"22",X"0C",X"08",X"10",X"20",X"40",X"80",X"00",X"00",X"00", + X"08",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"20",X"10",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"08",X"00",X"00",X"00",X"00",X"00",X"1C",X"1C",X"1C", + X"0C",X"22",X"01",X"00",X"00",X"00",X"00",X"00",X"1C",X"1C",X"1C",X"00",X"00",X"00",X"00",X"00", + X"1C",X"1C",X"1C",X"1E",X"1E",X"1E",X"3E",X"3F",X"3E",X"FE",X"FE",X"FE",X"3E",X"3F",X"3E",X"3E", + X"3F",X"3E",X"1E",X"1E",X"1E",X"1C",X"1C",X"1C",X"3E",X"3E",X"3F",X"3E",X"FE",X"FE",X"FE",X"3E", + X"00",X"03",X"00",X"10",X"08",X"04",X"40",X"40",X"00",X"C0",X"00",X"08",X"10",X"20",X"02",X"02", + X"40",X"40",X"04",X"08",X"10",X"00",X"03",X"00",X"02",X"02",X"20",X"10",X"08",X"00",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"CC", + X"03",X"03",X"01",X"01",X"03",X"06",X"0C",X"00",X"98",X"B0",X"F0",X"F0",X"F0",X"F0",X"70",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"40",X"40",X"40",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC", + X"03",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"FC",X"FC",X"F8",X"F8",X"EC",X"C4",X"80",X"00", + X"80",X"40",X"20",X"10",X"08",X"04",X"02",X"01",X"01",X"02",X"04",X"08",X"10",X"20",X"40",X"80", + X"01",X"02",X"04",X"08",X"10",X"20",X"40",X"80",X"80",X"40",X"20",X"10",X"08",X"04",X"02",X"01", + X"01",X"01",X"01",X"01",X"01",X"00",X"40",X"40",X"C0",X"C0",X"C0",X"C0",X"C0",X"80",X"01",X"01", + X"48",X"68",X"7E",X"70",X"60",X"40",X"40",X"40",X"09",X"0B",X"3F",X"07",X"03",X"01",X"01",X"01", + X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"11",X"F0",X"E0",X"C0",X"80",X"80",X"80",X"80",X"C4", + X"11",X"11",X"01",X"01",X"00",X"00",X"00",X"00",X"C4",X"C4",X"C0",X"C0",X"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"1F",X"80",X"80",X"80",X"80",X"C0",X"E0",X"E0",X"E0", + X"1F",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"E0",X"E0",X"C0",X"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"01",X"11",X"17",X"3F",X"00",X"00",X"00",X"00",X"80",X"80",X"A0",X"F0", + X"3F",X"17",X"11",X"00",X"00",X"00",X"00",X"00",X"F0",X"A0",X"80",X"80",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"03",X"07",X"0F",X"0F",X"0F",X"03",X"01",X"0F",X"0F",X"1F",X"1F",X"0F",X"07",X"03",X"01", + X"7F",X"3F",X"3F",X"0F",X"0F",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"03",X"07",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"0F",X"07",X"0F",X"1F",X"1F",X"0F", + X"7F",X"3F",X"1F",X"0F",X"1F",X"1F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"03",X"03",X"0F",X"0F",X"1F",X"3F",X"FF",X"1F",X"1F",X"3F",X"7F",X"3F",X"7F",X"FF",X"FF", + X"FF",X"7F",X"7F",X"3F",X"7F",X"3F",X"7F",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"F8",X"FC",X"FE", + X"FE",X"FC",X"F8",X"F0",X"E0",X"C0",X"80",X"00",X"7F",X"3F",X"1F",X"0F",X"07",X"03",X"01",X"00", + X"00",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"1F",X"7F",X"60",X"C0",X"00",X"00",X"00",X"00",X"F8",X"FE",X"06",X"03", + X"C0",X"C0",X"E0",X"FF",X"FF",X"7F",X"7F",X"1F",X"03",X"03",X"07",X"FF",X"FF",X"FE",X"FE",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"1E",X"7E",X"63",X"C1",X"00",X"00",X"00",X"00",X"7F",X"7F",X"C0",X"80", + X"C1",X"C1",X"E1",X"FF",X"FF",X"7F",X"7F",X"1F",X"80",X"80",X"80",X"FC",X"FE",X"FF",X"FE",X"FC", + X"00",X"00",X"00",X"00",X"78",X"7E",X"C6",X"83",X"00",X"00",X"00",X"FC",X"FE",X"FF",X"FE",X"FC", + X"83",X"83",X"87",X"FF",X"FF",X"FE",X"FE",X"F8",X"00",X"00",X"00",X"21",X"73",X"FB",X"73",X"21", + X"00",X"00",X"00",X"C0",X"C0",X"C0",X"E0",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC", + X"FF",X"FF",X"FF",X"FF",X"E0",X"C0",X"C0",X"C0",X"FE",X"FF",X"FE",X"FC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"FF",X"FF",X"01",X"03",X"07",X"00",X"00",X"00",X"F8",X"FE",X"FF",X"FF",X"FF", + X"0F",X"3F",X"7F",X"FF",X"FF",X"FF",X"7F",X"1F",X"FE",X"FC",X"F0",X"E0",X"C0",X"80",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"06",X"09",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"10",X"09",X"06",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"08",X"10",X"10",X"00",X"00",X"00",X"00",X"80",X"40",X"20",X"20", + X"10",X"10",X"08",X"07",X"00",X"00",X"00",X"00",X"20",X"20",X"40",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"04",X"08",X"10",X"10",X"10",X"00",X"00",X"F0",X"08",X"04",X"02",X"02",X"02", + X"10",X"10",X"10",X"08",X"04",X"03",X"00",X"00",X"02",X"02",X"02",X"04",X"08",X"F0",X"00",X"00", + X"0F",X"10",X"20",X"40",X"C0",X"80",X"82",X"82",X"E0",X"10",X"08",X"46",X"03",X"01",X"01",X"81", + X"80",X"81",X"82",X"C0",X"48",X"20",X"10",X"0F",X"09",X"81",X"01",X"03",X"02",X"04",X"08",X"F0", + X"00",X"00",X"20",X"19",X"08",X"00",X"20",X"03",X"00",X"00",X"00",X"60",X"00",X"10",X"00",X"20", + X"07",X"23",X"15",X"55",X"02",X"00",X"00",X"00",X"80",X"00",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"0B",X"07",X"03",X"27",X"00",X"00",X"00",X"20",X"40",X"00",X"80",X"C0", + X"17",X"03",X"01",X"01",X"00",X"00",X"00",X"00",X"D0",X"90",X"90",X"80",X"80",X"00",X"00",X"00", + X"00",X"00",X"10",X"08",X"04",X"25",X"17",X"15",X"00",X"10",X"20",X"40",X"60",X"E0",X"C8",X"C2", + X"07",X"03",X"01",X"00",X"08",X"11",X"21",X"00",X"DC",X"C0",X"C8",X"E0",X"C8",X"44",X"00",X"00", + X"08",X"08",X"08",X"04",X"14",X"03",X"01",X"03",X"00",X"80",X"84",X"98",X"A0",X"A0",X"80",X"C4", + X"07",X"07",X"07",X"01",X"04",X"10",X"20",X"00",X"E2",X"CC",X"F0",X"88",X"40",X"44",X"40",X"40"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GALAXIAN_6L.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GALAXIAN_6L.vhd new file mode 100644 index 00000000..9cf7380a --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GALAXIAN_6L.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GALAXIAN_6L is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GALAXIAN_6L is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"7A",X"36",X"07",X"00",X"F0",X"38",X"1F",X"00",X"C7",X"F0",X"3F",X"00",X"DB",X"C6",X"38", + X"00",X"36",X"07",X"F0",X"00",X"33",X"3F",X"DB",X"00",X"3F",X"57",X"C6",X"00",X"C6",X"3F",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GAL_FIR.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GAL_FIR.vhd new file mode 100644 index 00000000..5aff2022 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GAL_FIR.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_FIR 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 prom of GAL_FIR is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AC",X"68",X"72",X"C7",X"93",X"3F",X"80",X"C8",X"5C",X"A1",X"22",X"90",X"B9",X"8A",X"41",X"62", + X"C2",X"A1",X"40",X"6A",X"C9",X"7F",X"64",X"3C",X"BC",X"AD",X"5B",X"4C",X"D4",X"62",X"3D",X"D3", + X"7F",X"31",X"A3",X"BE",X"5D",X"49",X"C7",X"7D",X"28",X"C0",X"A1",X"7A",X"7D",X"2B",X"C9",X"91", + X"80",X"6B",X"39",X"95",X"BA",X"91",X"27",X"C1",X"91",X"7E",X"6D",X"31",X"C0",X"A4",X"7C",X"7B", + X"37",X"80",X"CB",X"7E",X"88",X"64",X"40",X"8F",X"C3",X"83",X"83",X"68",X"36",X"D0",X"8C",X"29", + X"B4",X"B1",X"52",X"4B",X"E9",X"3E",X"74",X"C4",X"73",X"81",X"2B",X"AD",X"B9",X"4E",X"4B",X"CB", + X"91",X"76",X"33",X"B6",X"A5",X"6E",X"4A",X"63",X"D7",X"7C",X"3E",X"7E",X"DE",X"45",X"67",X"C1", + X"84",X"2D",X"A8",X"A9",X"20",X"AC",X"B5",X"7E",X"47",X"5F",X"DD",X"6E",X"44",X"BD",X"97",X"22", + X"AE",X"A4",X"25",X"CB",X"93",X"77",X"3C",X"78",X"CB",X"83",X"29",X"B3",X"AB",X"7D",X"5D",X"44", + X"A4",X"BC",X"79",X"8C",X"3A",X"76",X"CF",X"78",X"44",X"6B",X"D9",X"6B",X"3B",X"9A",X"CC",X"26", + X"A4",X"A3",X"1D",X"BA",X"A9",X"83",X"71",X"3A",X"8B",X"CC",X"6A",X"3E",X"E5",X"28",X"A4",X"A3", + X"1E",X"C9",X"9C",X"78",X"32",X"94",X"C4",X"74",X"88",X"2A",X"A2",X"BC",X"1A",X"E2",X"4B",X"86", + X"B3",X"72",X"48",X"68",X"D2",X"83",X"32",X"A4",X"B2",X"73",X"4E",X"5A",X"C8",X"9C",X"2C",X"90", + X"C1",X"7B",X"5E",X"41",X"CC",X"99",X"6F",X"3A",X"8B",X"C9",X"7A",X"84",X"23",X"BC",X"9D",X"33", + X"CC",X"82",X"24",X"D7",X"6C",X"47",X"D1",X"87",X"5C",X"41",X"C5",X"9F",X"71",X"35",X"A8",X"B9", + X"67",X"4F",X"5F",X"CE",X"8A",X"43",X"C6",X"80",X"54",X"4A",X"B1",X"AE",X"87",X"50",X"4F",X"C6", + X"9F",X"55",X"45",X"BB",X"AC",X"5C",X"41",X"A9",X"BE",X"5C",X"4C",X"72",X"D4",X"71",X"42",X"DA", + X"20",X"CF",X"6C",X"3D",X"D5",X"8A",X"78",X"39",X"7B",X"BF",X"99",X"75",X"37",X"99",X"C7",X"28", + X"7B",X"C3",X"91",X"58",X"46",X"9D",X"BB",X"88",X"60",X"40",X"9A",X"BB",X"8C",X"3B",X"6A",X"BA", + X"AC",X"31",X"7F",X"C8",X"2F",X"78",X"DC",X"33",X"AE",X"80",X"34",X"EE",X"38",X"74",X"D5",X"1F", + X"98",X"BA",X"82",X"58",X"4A",X"D6",X"86",X"56",X"49",X"F0",X"34",X"73",X"BD",X"9A",X"43",X"67", + X"C3",X"8D",X"2E",X"8B",X"B9",X"40",X"C6",X"33",X"B7",X"A5",X"27",X"8A",X"BA",X"42",X"BF",X"8A", + X"3A",X"6F",X"D1",X"5C",X"41",X"DF",X"6A",X"42",X"C3",X"A4",X"33",X"80",X"CC",X"5C",X"43",X"89", + X"BE",X"96",X"53",X"4E",X"8D",X"D4",X"2E",X"BD",X"56",X"6C",X"DA",X"53",X"47",X"9C",X"C8",X"2A", + X"75",X"B3",X"B0",X"2F",X"80",X"CA",X"2B",X"81",X"CD",X"35",X"7E",X"CE",X"32",X"81",X"CD",X"74", + X"40",X"74",X"D8",X"4E",X"58",X"D3",X"85",X"4D",X"53",X"AE",X"B8",X"61",X"3D",X"9F",X"C3",X"30", + X"86",X"D0",X"5E",X"47",X"7D",X"C6",X"91",X"4E",X"4E",X"A9",X"B9",X"6D",X"34",X"9F",X"B7",X"3F", + X"C6",X"7A",X"37",X"81",X"C5",X"8C",X"33",X"88",X"D3",X"44",X"59",X"82",X"C8",X"88",X"42",X"61", + X"AF",X"A2",X"44",X"D9",X"48",X"52",X"89",X"BC",X"99",X"2E",X"7E",X"B4",X"38",X"B7",X"9E",X"20", + X"E4",X"56",X"63",X"D9",X"56",X"43",X"B1",X"B8",X"37",X"6B",X"D3",X"6D",X"31",X"C8",X"65",X"8D", + X"B9",X"0B",X"BA",X"86",X"4D",X"D7",X"4E",X"4B",X"E7",X"3C",X"95",X"AD",X"1D",X"D8",X"72",X"35", + X"B4",X"A5",X"2F",X"B3",X"B6",X"44",X"57",X"93",X"CB",X"67",X"3F",X"A1",X"C7",X"21",X"89",X"9C", + X"5A",X"D8",X"20",X"A3",X"BA",X"25",X"89",X"AD",X"37",X"D8",X"5D",X"53",X"DC",X"77",X"43",X"70", + X"E1",X"46",X"59",X"83",X"CC",X"6E",X"37",X"E7",X"56",X"4E",X"86",X"D3",X"27",X"9E",X"AA",X"44", + X"C0",X"19",X"E9",X"54",X"63",X"DB",X"51",X"4D",X"88",X"CF",X"30",X"91",X"C5",X"66",X"35",X"C1", + X"9C",X"33",X"79",X"A7",X"BA",X"53",X"41",X"DD",X"4B",X"73",X"D2",X"25",X"7F",X"BB",X"9D",X"37", + X"68",X"A9",X"BD",X"3B",X"5C",X"CF",X"61",X"47",X"C9",X"9E",X"47",X"55",X"AF",X"96",X"5D",X"D0", + X"28",X"7E",X"D3",X"48",X"51",X"C7",X"95",X"21",X"BB",X"A6",X"3A",X"67",X"C3",X"81",X"37",X"DE", + X"7D",X"3F",X"72",X"AA",X"B4",X"15",X"DC",X"6C",X"47",X"D2",X"71",X"28",X"EB",X"2E",X"9F",X"93", + X"6C",X"9C",X"37",X"DB",X"43",X"AC",X"37",X"D3",X"4F",X"AC",X"8D",X"1B",X"DF",X"7E",X"46",X"6B", + X"BA",X"A5",X"35",X"73",X"CB",X"41",X"7E",X"C8",X"1D",X"D3",X"60",X"5F",X"DB",X"44",X"57",X"C2", + X"A2",X"41",X"5B",X"AE",X"96",X"5E",X"CC",X"10",X"CF",X"83",X"31",X"DF",X"59",X"46",X"CC",X"87", + X"28",X"D7",X"84",X"3D",X"7A",X"DD",X"3A",X"7B",X"C8",X"36",X"66",X"C8",X"60",X"9A",X"8F",X"29", + X"A8",X"B3",X"83",X"1F",X"D6",X"81",X"33",X"C4",X"82",X"2A",X"D4",X"6B",X"70",X"CA",X"1B",X"A9", + X"AB",X"22",X"AE",X"9E",X"49",X"D3",X"45",X"5A",X"A1",X"BB",X"70",X"27",X"E9",X"49",X"72",X"CC", + X"38",X"67",X"B6",X"AD",X"41",X"57",X"B7",X"8C",X"39",X"E4",X"70",X"4B",X"63",X"C7",X"52",X"AE", + X"8A",X"36",X"8A",X"BB",X"8E",X"2F",X"87",X"AB",X"B2",X"2D",X"72",X"94",X"CD",X"39",X"67",X"D9", + X"2B",X"86",X"C8",X"50",X"4D",X"BC",X"A1",X"3F",X"6B",X"BC",X"7C",X"48",X"E0",X"20",X"BA",X"83", + X"43",X"D4",X"26",X"BD",X"A2",X"3E",X"6C",X"CA",X"8A",X"38",X"7B",X"AF",X"AE",X"23",X"91",X"C0", + X"37",X"76",X"A3",X"C2",X"39",X"63",X"D9",X"48",X"5A",X"93",X"C9",X"43",X"62",X"90",X"B1",X"37", + X"D1",X"53",X"74",X"B1",X"37",X"F6",X"23",X"82",X"C3",X"52",X"4A",X"BB",X"75",X"95",X"88",X"3D", + X"90",X"C3",X"76",X"3B",X"87",X"A9",X"70",X"A6",X"61",X"4F",X"AE",X"B6",X"50",X"4B",X"E2",X"4A", + X"63",X"DC",X"3E",X"63",X"92",X"CC",X"4F",X"4D",X"E3",X"4A",X"5B",X"89",X"D0",X"47",X"5E",X"90", + X"D0",X"49",X"5B",X"7E",X"C6",X"76",X"3E",X"8C",X"AA",X"A4",X"15",X"CD",X"89",X"43",X"80",X"BD", + X"65",X"A8",X"3D",X"8E",X"CF",X"0B",X"C0",X"8E",X"46",X"76",X"C9",X"7A",X"3E",X"88",X"AA",X"A8", + X"18",X"BF",X"9C",X"2E",X"C3",X"85",X"2B",X"DC",X"6C",X"45",X"DB",X"4B",X"5F",X"92",X"AD",X"3D", + X"C3",X"4F",X"86",X"A6",X"75",X"81",X"36",X"E7",X"37",X"A6",X"7D",X"A5",X"5A",X"58",X"D8",X"4E", + X"56",X"AB",X"8E",X"49",X"DD",X"68",X"40",X"8A",X"B0",X"53",X"C3",X"4F",X"60",X"92",X"C6",X"51", + X"54",X"9A",X"C5",X"55",X"4D",X"93",X"C2",X"70",X"2F",X"E3",X"50",X"5B",X"8D",X"AF",X"48",X"AA", + X"81",X"98",X"4C",X"65",X"C1",X"66",X"BB",X"23",X"B0",X"9B",X"39",X"83",X"A4",X"B3",X"1A",X"B0", + X"9D",X"31",X"C3",X"8E",X"2B",X"E2",X"54",X"5A",X"DC",X"32",X"86",X"CA",X"14",X"C9",X"83",X"43", + X"83",X"AD",X"A6",X"15",X"DA",X"6D",X"4C",X"87",X"AF",X"63",X"B9",X"3A",X"8C",X"C5",X"0D",X"CC", + X"79",X"58",X"74",X"C9",X"7D",X"42",X"7C",X"B7",X"5C",X"A9",X"7B",X"41",X"93",X"B6",X"81",X"32", + X"9D",X"92",X"6B",X"87",X"9D",X"94",X"4A",X"6C",X"B7",X"A4",X"1B",X"BD",X"88",X"4D",X"7D",X"BD", + X"4D",X"99",X"8A",X"51",X"CF",X"1B",X"F2",X"56",X"5A",X"72",X"C3",X"4B",X"BE",X"63",X"52",X"E1", + X"2F",X"77",X"91",X"93",X"52",X"C0",X"37",X"E1",X"53",X"5A",X"DA",X"35",X"77",X"85",X"D5",X"39", + X"6D",X"80",X"D3",X"50",X"58",X"D3",X"2D",X"9A",X"B2",X"23",X"BC",X"8C",X"52",X"71",X"C1",X"8D", + X"3E",X"76",X"B3",X"6F",X"6D",X"A1",X"49",X"C9",X"2E",X"D1",X"38",X"C6",X"55",X"8B",X"7C",X"86", + X"B2",X"33",X"7E",X"AD",X"99",X"3C",X"80",X"A3",X"6E",X"88",X"98",X"50",X"AA",X"79",X"99",X"27", + X"FB",X"1D",X"AE",X"63",X"8F",X"94",X"51",X"B0",X"4A",X"AD",X"86",X"8B",X"39",X"EA",X"1B",X"AB", + X"9A",X"4C",X"73",X"B8",X"9A",X"3A",X"76",X"AC",X"64",X"88",X"8B",X"6D",X"A6",X"71",X"97",X"40", + X"8C",X"B5",X"4A",X"A0",X"68",X"86",X"8C",X"98",X"69",X"59",X"DE",X"1F",X"AB",X"A0",X"36",X"A8", + X"A7",X"28",X"E0",X"58",X"59",X"CE",X"37",X"82",X"C8",X"2E",X"A4",X"5A",X"AF",X"62",X"8E",X"C2", + X"2D",X"79",X"91",X"C2",X"2A",X"96",X"77",X"8A",X"99",X"8E",X"3D",X"C7",X"61",X"57",X"9D",X"A3", + X"44",X"DE",X"34",X"88",X"B1",X"37",X"89",X"A3",X"B3",X"15",X"CB",X"73",X"43",X"BA",X"8D",X"47", + X"9D",X"6F",X"C9",X"15",X"D1",X"72",X"53",X"CA",X"48",X"6B",X"9B",X"89",X"6A",X"A0",X"57",X"BE", + X"45",X"9C",X"A5",X"5E",X"54",X"CA",X"63",X"52",X"E1",X"25",X"AE",X"93",X"35",X"E5",X"2A",X"A5", + X"97",X"40",X"8A",X"9A",X"73",X"81",X"8E",X"57",X"CC",X"68",X"67",X"5D",X"C5",X"94",X"43",X"6E", + X"AA",X"A8",X"30",X"9D",X"6E",X"B3",X"6B",X"4B",X"AB",X"79",X"90",X"93",X"50",X"89",X"81",X"8A", + X"A4",X"42",X"9B",X"7F",X"67",X"9F",X"A8",X"48",X"80",X"BA",X"23",X"C5",X"6A",X"5E",X"91",X"99", + X"62",X"9A",X"91",X"6A",X"5A",X"D9",X"3D",X"81",X"B2",X"34",X"C5",X"7A",X"3F",X"BB",X"90",X"3D", + X"D0",X"50",X"65",X"95",X"94",X"63",X"C6",X"2D",X"A6",X"91",X"3D",X"CA",X"5F",X"66",X"91",X"97", + X"A6",X"35",X"A6",X"97",X"2E",X"D9",X"41",X"8F",X"A4",X"3E",X"A2",X"B0",X"2E",X"B5",X"7A",X"55", + X"C9",X"3F",X"84",X"C3",X"42",X"8A",X"72",X"9F",X"65",X"95",X"72",X"84",X"8A",X"58",X"C6",X"73", + X"47",X"D9",X"35",X"90",X"9F",X"4D",X"80",X"A8",X"A1",X"30",X"8F",X"8B",X"C5",X"18",X"B5",X"70", + X"65",X"B0",X"5D",X"93",X"93",X"7B",X"48",X"CB",X"52",X"7D",X"B0",X"3D",X"98",X"BA",X"2E",X"AD", + X"86",X"4A",X"BD",X"6E",X"4C",X"DA",X"53",X"78",X"77",X"96",X"75",X"83",X"82",X"82",X"A5",X"3D", + X"86",X"A2",X"A7",X"31",X"8B",X"8E",X"C3",X"20",X"AA",X"92",X"3A",X"C0",X"87",X"51",X"77",X"AD", + X"62",X"B9",X"4F",X"7F",X"BC",X"1E",X"BF",X"7E",X"51",X"C3",X"50",X"72",X"C0",X"49",X"8A",X"81", + X"72",X"AA",X"7B",X"55",X"8C",X"83",X"CA",X"2B",X"97",X"9C",X"4B",X"86",X"9F",X"B0",X"14",X"EA", + X"3C",X"8A",X"9B",X"51",X"C2",X"25",X"C7",X"70",X"5F",X"AF",X"52",X"C6",X"29",X"B8",X"7F",X"5F", + X"A3",X"5C",X"CB",X"26",X"AE",X"8B",X"3C",X"D6",X"48",X"8A",X"74",X"A2",X"8D",X"3F",X"D3",X"2A", + X"B9",X"7B",X"4D",X"A6",X"69",X"B6",X"6E",X"56",X"8A",X"A1",X"64",X"C3",X"28",X"B2",X"7D",X"60", + X"A6",X"58",X"D4",X"11",X"D1",X"5C",X"7A",X"A8",X"42",X"96",X"C7",X"27",X"A9",X"90",X"44",X"89", + X"9F",X"69",X"90",X"A7",X"25",X"DB",X"46",X"7C",X"B7",X"42",X"9A",X"6E",X"99",X"8C",X"81",X"41", + X"C7",X"7A",X"58",X"8D",X"83",X"B2",X"29",X"C1",X"6E",X"52",X"DA",X"44",X"83",X"B6",X"2A",X"C4", + X"41",X"A6",X"7A",X"76",X"98",X"5B",X"B6",X"86",X"42",X"A2",X"8A",X"4B",X"95",X"97",X"65",X"B7", + X"56",X"6C",X"D2",X"1E",X"B6",X"94",X"36",X"DD",X"38",X"96",X"7B",X"70",X"9E",X"95",X"59",X"77", + X"82",X"8D",X"7C",X"78",X"DC",X"01",X"CD",X"70",X"5D",X"76",X"B4",X"91",X"35",X"BD",X"48",X"D3", + X"36",X"8E",X"B7",X"2C",X"BE",X"49",X"CA",X"4C",X"72",X"CB",X"29",X"B9",X"82",X"3B",X"CC",X"71", + X"4B",X"D1",X"4F",X"6A",X"8D",X"C9",X"46",X"6A",X"CA",X"28",X"99",X"A9",X"61",X"59",X"AA",X"78", + X"8F",X"98",X"35",X"CE",X"64",X"58",X"95",X"A7",X"49",X"AC",X"57",X"9B",X"7C",X"70",X"DE",X"14", + X"A9",X"A3",X"3F",X"7B",X"C9",X"57",X"5F",X"D6",X"17",X"C5",X"7D",X"58",X"9E",X"71",X"B8",X"3D", + X"72",X"A7",X"6C",X"A7",X"80",X"3A",X"E5",X"22",X"A5",X"61",X"B6",X"86",X"38",X"D9",X"56",X"57", + X"9A",X"8E",X"64",X"97",X"96",X"7D",X"45",X"CC",X"5D",X"5A",X"A8",X"AA",X"3C",X"7E",X"97",X"C1", + X"22",X"9B",X"A7",X"45",X"7F",X"A1",X"B4",X"1D",X"BB",X"51",X"B9",X"7A",X"45",X"91",X"A5",X"67", + X"B8",X"34",X"9E",X"A8",X"35",X"88",X"B0",X"54",X"A8",X"8C",X"31",X"E7",X"41",X"6A",X"C7",X"41", + X"85",X"BA",X"2D",X"B1",X"A0",X"35",X"90",X"9F",X"75",X"A0",X"5D",X"52",X"CA",X"59",X"84",X"9A", + X"52",X"B2",X"66",X"AF",X"43",X"6E",X"BC",X"59",X"89",X"95",X"8B",X"74",X"44",X"AE",X"85",X"96", + X"7B",X"4A",X"8B",X"BD",X"7E",X"2F",X"D2",X"68",X"4D",X"D9",X"41",X"6F",X"CA",X"4D",X"62",X"A0", + X"B7",X"3C",X"76",X"D1",X"2E",X"98",X"B1",X"2A",X"BB",X"8D",X"2F",X"E2",X"4A",X"6C",X"C4",X"49", + X"64",X"A5",X"88",X"80",X"9E",X"2A",X"DD",X"59",X"54",X"CE",X"60",X"54",X"9E",X"9D",X"42",X"BF", + X"92",X"34",X"98",X"B7",X"40",X"77",X"9F",X"BC",X"28",X"93",X"B8",X"44",X"67",X"A7",X"AC",X"41", + X"6F",X"9F",X"91",X"50",X"C4",X"37",X"B1",X"7A",X"5B",X"DD",X"4C",X"58",X"C6",X"5D",X"51",X"BA", + X"82",X"47",X"D6",X"6B",X"45",X"AC",X"60",X"C5",X"3D",X"7D",X"CA",X"33",X"8D",X"AE",X"42",X"88", + X"CB",X"4F",X"5D",X"84",X"C3",X"31",X"B4",X"6B",X"6C",X"AD",X"73",X"AB",X"23",X"D5",X"6B",X"43", + X"D1",X"6A",X"47",X"CB",X"4B",X"77",X"C4",X"2B",X"BC",X"94",X"35",X"C6",X"77",X"3E",X"9E",X"94", + X"77",X"A5",X"43",X"7C",X"99",X"BD",X"3A",X"79",X"C8",X"2B",X"B8",X"83",X"37",X"D2",X"77",X"4F", + X"78",X"BD",X"43",X"AC",X"80",X"66",X"C8",X"28",X"89",X"A3",X"AF",X"2A",X"92",X"B9",X"3D",X"80", + X"CC",X"27",X"9A",X"B0",X"48",X"66",X"AD",X"8D",X"44",X"D0",X"6A",X"44",X"AA",X"87",X"6B",X"C7", + X"25",X"A3",X"AB",X"41",X"70",X"AD",X"71",X"9C",X"74",X"45",X"C9",X"91",X"51",X"5D",X"D9",X"4E", + X"62",X"C7",X"61",X"4C",X"A4",X"97",X"78",X"95",X"3D",X"9E",X"A8",X"30",X"D4",X"4B",X"81",X"B2", + X"33",X"C5",X"65",X"A4",X"63",X"4E",X"A8",X"98",X"5F",X"C0",X"30",X"96",X"B5",X"3D",X"75",X"B2", + X"92",X"31",X"B1",X"A5",X"33",X"A4",X"AD",X"43",X"68",X"B4",X"7A",X"51",X"DB",X"45",X"74",X"C9", + X"2D",X"95",X"AD",X"3B",X"8E",X"A9",X"3D",X"C0",X"70",X"62",X"D5",X"27",X"A7",X"9E",X"3F",X"7C", + X"BC",X"50",X"A4",X"8E",X"34",X"A3",X"A1",X"4E",X"99",X"BC",X"35",X"7B",X"BD",X"67",X"45",X"AA", + X"94",X"62",X"C1",X"3E",X"74",X"CB",X"41",X"74",X"A3",X"50",X"B6",X"9F",X"47",X"68",X"A6",X"AF", + X"4A",X"62",X"94",X"AC",X"3F",X"AD",X"A9",X"3F",X"72",X"8A",X"C7",X"54",X"5E",X"7A",X"C0",X"80", + X"4D",X"6B",X"B7",X"71",X"86",X"9F",X"2C",X"DC",X"60",X"59",X"79",X"BB",X"7C",X"40",X"A8",X"AC", + X"63",X"48",X"D4",X"67",X"56",X"79",X"B8",X"8D",X"38",X"BE",X"7E",X"3C",X"B0",X"97",X"54",X"C2", + X"37",X"98",X"B4",X"32",X"90",X"B9",X"4F",X"5E",X"B2",X"A0",X"34",X"9F",X"A3",X"35",X"AD",X"9B", + X"38",X"BB",X"97",X"4E",X"64",X"A4",X"94",X"53",X"D0",X"45",X"6A",X"C2",X"6E",X"42",X"CC",X"77", + X"52",X"73",X"BB",X"61",X"89",X"B2",X"2D",X"9C",X"B4",X"43",X"77",X"C5",X"57",X"59",X"93",X"A6", + X"5B",X"B6",X"50",X"63",X"BE",X"8D",X"4D",X"6A",X"A2",X"AA",X"6F",X"3F",X"C2",X"86",X"4B",X"75", + X"BD",X"76",X"4B",X"D2",X"5A",X"5A",X"8A",X"BF",X"5B",X"56",X"B3",X"9F",X"4E",X"66",X"C4",X"5D", + X"51",X"C0",X"68",X"70",X"C1",X"3E",X"75",X"BB",X"50",X"A6",X"88",X"3A",X"AB",X"A4",X"79",X"3A", + X"BC",X"8E",X"4A",X"74",X"B7",X"82",X"42",X"D2",X"5F",X"5A",X"7F",X"B4",X"8D",X"41",X"86",X"C0", + X"55",X"5F",X"C0",X"44",X"96",X"B6",X"5A",X"5A",X"84",X"BD",X"78",X"52",X"6C",X"BA",X"82",X"41", + X"BD",X"83",X"3E",X"A9",X"91",X"56",X"CA",X"38",X"95",X"AA",X"39",X"8B",X"AE",X"4D",X"8C",X"AC", + X"35",X"BC",X"79",X"52",X"C1",X"5A",X"80",X"C2",X"41",X"73",X"A8",X"4C",X"B1",X"9C",X"63",X"4F", + X"BB",X"8B",X"4B",X"70",X"B2",X"7F",X"46",X"D3",X"48",X"A3",X"94",X"3D",X"94",X"B6",X"52",X"61", + X"BD",X"49",X"91",X"B9",X"58",X"61",X"77",X"BD",X"4D",X"A9",X"84",X"43",X"CF",X"6A",X"58",X"74", + X"C2",X"57",X"93",X"61",X"84",X"BB",X"2E",X"B6",X"86",X"4B",X"C7",X"71",X"54",X"76",X"AF",X"73", + X"5D",X"D2",X"40",X"85",X"B7",X"59",X"5A",X"94",X"AF",X"40",X"9D",X"A1",X"32",X"BD",X"71",X"72", + X"BC",X"51",X"60",X"97",X"AC",X"7F",X"47",X"8D",X"B7",X"57",X"5B",X"C1",X"7B",X"52",X"73",X"AB", + X"8B",X"44",X"C1",X"82",X"42",X"BD",X"75",X"4B",X"B0",X"9D",X"6A",X"50",X"8A",X"AD",X"8E",X"53", + X"65",X"9C",X"AE",X"65",X"51",X"AF",X"99",X"43",X"80",X"B4",X"7E",X"3D",X"B9",X"6B",X"66",X"C2", + X"45",X"B4",X"81",X"50",X"72",X"BC",X"6E",X"4E",X"BA",X"7A",X"4A",X"C1",X"6F",X"5A",X"BB",X"89", + X"5C",X"5E",X"9B",X"AF",X"5E",X"5C",X"CA",X"43",X"87",X"B0",X"41",X"85",X"BA",X"4D",X"77",X"BA", + X"76",X"4A",X"A7",X"9D",X"54",X"61",X"AA",X"9C",X"47",X"7B",X"B2",X"8B",X"51",X"6C",X"9A",X"A4", + X"42",X"A4",X"A6",X"3A",X"A5",X"97",X"3F",X"9E",X"A7",X"78",X"4E",X"7F",X"B1",X"8A",X"58",X"64", + X"B8",X"88",X"48",X"87",X"B5",X"6E",X"49",X"BE",X"59",X"93",X"A5",X"46",X"74",X"9E",X"A3",X"35", + X"C2",X"72",X"55",X"C2",X"5B",X"60",X"B9",X"79",X"48",X"C8",X"57",X"84",X"B1",X"4B",X"6C",X"97", + X"AC",X"3F",X"8C",X"AF",X"47",X"AF",X"89",X"4A",X"7D",X"A4",X"9E",X"4F",X"6A",X"B1",X"8E",X"45", + X"88",X"B2",X"70",X"4B",X"A7",X"9C",X"41",X"AD",X"96",X"49",X"7B",X"B6",X"77",X"4B",X"B4",X"8D", + X"56",X"67",X"A2",X"A0",X"3E",X"B2",X"84",X"45",X"AC",X"9A",X"78",X"44",X"B1",X"80",X"52",X"C9", + X"4B",X"7E",X"B7",X"3C",X"A1",X"99",X"40",X"9F",X"A3",X"7C",X"4C",X"8A",X"B0",X"76",X"4C",X"9D", + X"A6",X"3F",X"9C",X"A5",X"5E",X"5C",X"B7",X"85",X"4E",X"7E",X"B4",X"6A",X"56",X"CD",X"4B",X"99", + X"6F",X"69",X"C4",X"45",X"89",X"B2",X"60",X"60",X"7F",X"BB",X"57",X"6E",X"B4",X"84",X"66",X"59", + X"BD",X"4A",X"9F",X"A0",X"5B",X"5F",X"A1",X"A4",X"65",X"57",X"94",X"A3",X"8E",X"46",X"8A",X"9B", + X"58",X"B7",X"78",X"4C",X"9B",X"A1",X"40",X"AF",X"87",X"42",X"B4",X"80",X"5E",X"BB",X"4B",X"7D", + X"BB",X"42",X"95",X"A1",X"42",X"AA",X"98",X"59",X"64",X"A4",X"A0",X"5F",X"5D",X"9C",X"A7",X"66", + X"57",X"A0",X"A4",X"5E",X"61",X"8A",X"B4",X"4D",X"92",X"A5",X"55",X"68",X"8F",X"B1",X"55",X"6C", + X"BE",X"51",X"88",X"A6",X"36",X"C2",X"6C",X"60",X"B2",X"84",X"4D",X"84",X"A8",X"4A",X"A5",X"9E", + X"60",X"5D",X"AD",X"92",X"76",X"4E",X"94",X"A8",X"72",X"4C",X"B0",X"7A",X"57",X"B8",X"85",X"72", + X"51",X"C2",X"59",X"6C",X"B1",X"86",X"69",X"5A",X"92",X"A9",X"7B",X"50",X"8B",X"B3",X"41",X"AD", + X"6F",X"61",X"B7",X"82",X"6E",X"55",X"A0",X"9F",X"4B",X"87",X"B1",X"52",X"9B",X"96",X"59",X"68", + X"B7",X"55",X"85",X"B1",X"64",X"65",X"70",X"BB",X"6A",X"5F",X"B0",X"8A",X"76",X"55",X"82",X"AE", + X"82",X"5F",X"66",X"A1",X"9C",X"48",X"B7",X"67",X"60",X"B8",X"76",X"4D",X"B7",X"76",X"62",X"B1", + X"7C",X"55",X"84",X"AD",X"77",X"55",X"8B",X"AC",X"40",X"9A",X"A1",X"75",X"57",X"7D",X"A6",X"91", + X"75",X"5C",X"74",X"AE",X"7D",X"52",X"C1",X"58",X"74",X"B7",X"45",X"95",X"A1",X"70",X"57",X"89", + X"AA",X"81",X"5B",X"6D",X"9F",X"9E",X"6F",X"57",X"AB",X"8E",X"63",X"5E",X"B0",X"80",X"4E",X"B1", + X"88",X"4C",X"9E",X"9A",X"46",X"98",X"A4",X"6C",X"55",X"B0",X"84",X"56",X"B8",X"48",X"92",X"A3", + X"7D",X"69",X"5C",X"A6",X"98",X"51",X"83",X"B5",X"4C",X"8E",X"A3",X"69",X"5E",X"80",X"AF",X"6B", + X"5B",X"B3",X"7C",X"52",X"B1",X"88",X"81",X"50",X"88",X"A7",X"83",X"54",X"82",X"AB",X"46",X"9F", + X"9F",X"4B",X"94",X"9F",X"42",X"A8",X"92",X"84",X"59",X"77",X"B3",X"46",X"A5",X"8C",X"4A",X"AE", + X"8A",X"59",X"A9",X"82",X"67",X"60",X"99",X"9F",X"81",X"6A",X"5B",X"BF",X"4F",X"9C",X"82",X"54", + X"BA",X"75",X"55",X"A7",X"8A",X"4B",X"A4",X"96",X"82",X"61",X"67",X"9A",X"9E",X"4D",X"8A",X"A7", + X"7F",X"73",X"52",X"BB",X"60",X"73",X"AC",X"83",X"73",X"59",X"89",X"A4",X"88",X"50",X"95",X"A2", + X"67",X"63",X"7D",X"B0",X"72",X"59",X"A9",X"8F",X"50",X"87",X"AC",X"47",X"9C",X"97",X"7B",X"53", + X"92",X"A0",X"7B",X"5B",X"7F",X"B1",X"49",X"8D",X"A4",X"7B",X"66",X"62",X"B4",X"76",X"66",X"AA", + X"81",X"62",X"6D",X"AF",X"80",X"6D",X"5C",X"97",X"9C",X"86",X"69",X"60",X"AE",X"80",X"4E",X"B9", + X"66",X"6D",X"AA",X"83",X"64",X"69",X"AD",X"86",X"6B",X"60",X"8C",X"AA",X"65",X"66",X"AF",X"80", + X"51",X"9A",X"9B",X"7B",X"72",X"57",X"A5",X"92",X"87",X"67",X"66",X"86",X"B2",X"58",X"8E",X"8B", + X"5F",X"B0",X"71",X"6B",X"63",X"A7",X"8F",X"85",X"67",X"63",X"B2",X"61",X"6F",X"AE",X"81",X"7F", + X"4E",X"A4",X"8D",X"51",X"9F",X"99",X"73",X"62",X"75",X"B6",X"66",X"79",X"9F",X"50",X"B7",X"4C", + X"8E",X"9E",X"7D",X"5C",X"7F",X"AF",X"4B",X"8D",X"A1",X"7D",X"65",X"66",X"AE",X"7B",X"62",X"AD", + X"7B",X"6C",X"5F",X"A8",X"8D",X"84",X"66",X"65",X"A7",X"8D",X"75",X"58",X"9F",X"97",X"74",X"60", + X"79",X"A4",X"8E",X"6A",X"5F",X"A7",X"8D",X"53",X"A7",X"87",X"73",X"57",X"B1",X"74",X"68",X"AD", + X"48",X"A0",X"94",X"81",X"6D",X"5F",X"94",X"9C",X"85",X"6D",X"5F",X"97",X"9D",X"78",X"5B",X"87", + X"AA",X"5E",X"6C",X"A6",X"8A",X"7A",X"5D",X"7B",X"9E",X"96",X"59",X"7D",X"AB",X"4C",X"98",X"95", + X"4B",X"A5",X"8B",X"55",X"A5",X"8D",X"71",X"60",X"84",X"A4",X"84",X"7F",X"5A",X"82",X"AB",X"5B", + X"78",X"B2",X"5B",X"7F",X"A2",X"4D",X"94",X"A2",X"51",X"98",X"93",X"78",X"57",X"9B",X"95",X"7D", + X"57",X"90",X"9D",X"53",X"A2",X"8D",X"6C",X"65",X"81",X"AD",X"68",X"71",X"A9",X"53",X"A4",X"82", + X"7A",X"55",X"A4",X"88",X"53",X"A5",X"8D",X"7F",X"6A",X"63",X"A7",X"87",X"59",X"A5",X"8A",X"77", + X"61",X"7B",X"AD",X"73",X"6B",X"A1",X"7F",X"6F",X"60",X"B2",X"6C",X"66",X"AA",X"82",X"81",X"5E", + X"75",X"9D",X"92",X"7D",X"6C",X"63",X"B0",X"73",X"60",X"A8",X"86",X"80",X"62",X"71",X"99",X"9A", + X"50",X"97",X"92",X"51",X"9D",X"96",X"51",X"A5",X"79",X"5D",X"AA",X"85",X"80",X"64",X"6D",X"AB", + X"77",X"64",X"A9",X"82",X"77",X"5F",X"85",X"A1",X"85",X"7F",X"5B",X"88",X"A4",X"4E",X"95",X"98", + X"81",X"69",X"69",X"B1",X"55",X"90",X"99",X"4F",X"A7",X"7E",X"59",X"AA",X"7C",X"5B",X"9E",X"92", + X"7E",X"70",X"5F",X"A1",X"8F",X"85",X"5F",X"78",X"A6",X"7F",X"77",X"5A",X"A0",X"87",X"58",X"A0", + X"93",X"59",X"97",X"94",X"5B",X"76",X"9F",X"8E",X"63",X"72",X"AC",X"57",X"81",X"A6",X"66",X"68", + X"A7",X"83",X"5C",X"A7",X"80",X"7A",X"59",X"97",X"9A",X"5D",X"7A",X"AD",X"66",X"72",X"A1",X"80", + X"70",X"62",X"A7",X"85",X"7B",X"5F",X"7E",X"9D",X"8E",X"73",X"5F",X"93",X"9D",X"63",X"6D",X"AA", + X"7B",X"89",X"5B",X"7F",X"A0",X"84",X"64",X"78",X"A5",X"7A",X"75",X"5E",X"9C",X"93",X"7F",X"7C", + X"58",X"A0",X"8D",X"80",X"61",X"77",X"9D",X"91",X"65",X"71",X"A4",X"80",X"76",X"5E",X"A4",X"89", + X"7C",X"62",X"78",X"9D",X"8D",X"7D",X"6C",X"68",X"B0",X"69",X"78",X"A3",X"54",X"9F",X"8A",X"79", + X"63",X"7A",X"9E",X"8D",X"64",X"71",X"AD",X"6D",X"6D",X"9D",X"86",X"6F",X"68",X"82",X"A8",X"6A", + X"74",X"A2",X"7A",X"73",X"61",X"B1",X"66",X"73",X"A8",X"5C",X"7D",X"A7",X"6C",X"6C",X"AA",X"56", + X"97",X"89",X"55",X"A7",X"85",X"85",X"6E",X"66",X"A6",X"82",X"82",X"5F",X"81",X"A5",X"55",X"8A", + X"9C",X"7C",X"81",X"5B",X"8A",X"9F",X"5E",X"7E",X"A9",X"5D",X"79",X"9E",X"87",X"61",X"76",X"9E", + X"8C",X"65",X"72",X"A2",X"83",X"78",X"60",X"A2",X"86",X"7C",X"5E",X"9B",X"8C",X"56",X"AD",X"66", + X"71",X"A3",X"81",X"82",X"66",X"74",X"AE",X"5E",X"82",X"9B",X"58",X"8E",X"9E",X"63",X"72",X"A1", + X"84",X"72",X"62",X"9F",X"8B",X"81",X"73",X"65",X"89",X"9D",X"7F",X"84",X"5E",X"84",X"9E",X"7C", + X"7B",X"5E",X"8B",X"96",X"8C",X"56",X"96",X"90",X"80",X"66",X"74",X"9A",X"92",X"61",X"78",X"9E", + X"87",X"69",X"72",X"A2",X"7F",X"76",X"63",X"8B",X"9A",X"83",X"5B",X"8F",X"98",X"7B",X"7F",X"5B", + X"92",X"98",X"5A",X"9D",X"86",X"81",X"62",X"80",X"A0",X"7B",X"76",X"61",X"9A",X"91",X"80",X"7B", + X"5E",X"91",X"96",X"7F",X"6E",X"69",X"99",X"94",X"64",X"75",X"A6",X"74",X"64",X"8F",X"9D",X"65", + X"72",X"A1",X"83",X"74",X"62",X"9F",X"89",X"82",X"72",X"67",X"88",X"9D",X"7A",X"62",X"AC",X"5A", + X"8F",X"90",X"7F",X"6E",X"6B",X"8E",X"9D",X"61",X"86",X"9B",X"56",X"9D",X"88",X"7C",X"64",X"7B", + X"99",X"8E",X"5E",X"7F",X"9F",X"7F",X"83",X"63",X"7D",X"A5",X"6A",X"6C",X"99",X"8F",X"57",X"A1", + X"7C",X"68",X"9C",X"86",X"6B",X"72",X"A2",X"7B",X"81",X"5C",X"98",X"90",X"77",X"61",X"A5",X"71", + X"6B",X"A0",X"87",X"73",X"68",X"A2",X"80",X"80",X"63",X"7D",X"9E",X"81",X"60",X"A2",X"77",X"69", + X"A8",X"6B",X"6D",X"9D",X"83",X"7E",X"65",X"7C",X"9D",X"86",X"62",X"80",X"A1",X"6F",X"68",X"A0", + X"83",X"84",X"6C",X"6E",X"92",X"9A",X"5D",X"8C",X"8F",X"5F",X"A1",X"7F",X"7F",X"65",X"7B",X"98", + X"8C",X"61",X"7C",X"A1",X"78",X"66",X"A3",X"68",X"75",X"A3",X"7A",X"87",X"69",X"70",X"8E",X"97", + X"7C",X"62",X"93",X"90",X"79",X"6B",X"74",X"A0",X"83",X"63",X"87",X"9E",X"6D",X"70",X"A1",X"60", + X"8E",X"91",X"7A",X"73",X"68",X"97",X"8E",X"84",X"73",X"68",X"8D",X"9A",X"75",X"66",X"9E",X"7F", + X"60",X"9A",X"8E",X"61",X"8D",X"92",X"57",X"96",X"8E",X"81",X"79",X"65",X"9C",X"87",X"7A",X"67", + X"80",X"9E",X"7D",X"85",X"64",X"7B",X"9B",X"85",X"72",X"68",X"98",X"8F",X"74",X"66",X"9A",X"89", + X"5D",X"8D",X"96",X"7C",X"60",X"A1",X"7C",X"69",X"9D",X"81",X"78",X"65",X"A2",X"78",X"69",X"A8", + X"62",X"83",X"95",X"7E",X"76",X"67",X"8B",X"97",X"7B",X"61",X"A7",X"6B",X"76",X"9C",X"7F",X"77", + X"66",X"91",X"95",X"77",X"64",X"98",X"8E",X"64",X"7B",X"9D",X"7F",X"61",X"94",X"8F",X"7C",X"66", + X"82",X"9D",X"7A",X"87",X"66",X"7A",X"A0",X"6E",X"6D",X"A0",X"7F",X"84",X"71",X"6B",X"9E",X"83", + X"7E",X"62",X"90",X"92",X"7B",X"79",X"62",X"A4",X"79",X"70",X"99",X"84",X"62",X"8B",X"92",X"7F", + X"74",X"6B",X"8A",X"99",X"75",X"68",X"99",X"8C",X"68",X"77",X"9D",X"7D",X"83",X"6F",X"6D",X"91", + X"91",X"83",X"6F",X"6E",X"99",X"8C",X"69",X"76",X"9F",X"79",X"68",X"A1",X"70",X"6D",X"9B",X"86", + X"60",X"9C",X"7C",X"6A",X"9F",X"7B",X"84",X"65",X"81",X"A0",X"61",X"89",X"91",X"7D",X"7B",X"65", + X"8D",X"95",X"7E",X"83",X"70",X"6D",X"A3",X"73",X"70",X"A1",X"67",X"7F",X"9C",X"5A",X"98",X"7F", + X"6B",X"A0",X"78",X"87",X"60",X"8A",X"95",X"7C",X"81",X"61",X"94",X"8E",X"7F",X"7A",X"67",X"88", + X"93",X"88",X"6F",X"71",X"A0",X"67",X"78",X"98",X"88",X"6D",X"72",X"9E",X"7E",X"83",X"78",X"67", + X"8D",X"92",X"82",X"63",X"8F",X"8F",X"7D",X"7A",X"66",X"8F",X"93",X"7B",X"66",X"A3",X"6B",X"7B", + X"97",X"7E",X"74",X"6B",X"9B",X"86",X"7F",X"80",X"66",X"82",X"95",X"87",X"62",X"88",X"95",X"7D", + X"82",X"6B",X"77",X"99",X"86",X"66",X"91",X"8C",X"74",X"6C",X"98",X"85",X"7B",X"66",X"97",X"87", + X"80",X"74",X"6D",X"8C",X"96",X"73",X"70",X"A1",X"64",X"7A",X"93",X"8D",X"64",X"80",X"96",X"82", + X"6F",X"71",X"99",X"87",X"65",X"82",X"98",X"7F",X"82",X"71",X"6F",X"92",X"8D",X"83",X"6E",X"73", + X"95",X"8C",X"6E",X"74",X"9A",X"7E",X"82",X"69",X"7E",X"9F",X"62",X"88",X"91",X"64",X"8F",X"8F", + X"65",X"7E",X"96",X"83",X"63",X"8D",X"90",X"7F",X"7D",X"67",X"98",X"85",X"7E",X"66",X"92",X"8B", + X"7C",X"6C",X"7C",X"9B",X"7C",X"69",X"94",X"86",X"7F",X"72",X"6F",X"8F",X"91",X"78",X"68",X"97", + X"89",X"7B",X"67",X"97",X"86",X"80",X"74",X"6C",X"94",X"8C",X"7E",X"82",X"6B",X"7C",X"9F",X"67", + X"82",X"96",X"6A",X"77",X"9A",X"7E",X"83",X"78",X"69",X"98",X"86",X"81",X"74",X"6D",X"8C",X"91", + X"81",X"7A",X"69",X"99",X"80",X"65",X"90",X"8F",X"7D",X"66",X"96",X"87",X"7F",X"67",X"8D",X"8F", + X"61",X"98",X"7F",X"67",X"8E",X"90",X"7D",X"82",X"69",X"7D",X"96",X"86",X"6A",X"7D",X"9D",X"6F", + X"76",X"99",X"6E",X"71",X"99",X"83",X"83",X"71",X"71",X"8F",X"91",X"71",X"72",X"9A",X"7D",X"84", + X"6A",X"7A",X"8C",X"94",X"6B",X"7D",X"94",X"7F",X"6D",X"79",X"97",X"84",X"67",X"85",X"93",X"81", + X"73",X"74",X"9B",X"7A",X"84",X"68",X"80",X"97",X"7E",X"83",X"69",X"82",X"99",X"69",X"82",X"97", + X"65",X"87",X"91",X"63",X"93",X"86",X"7F",X"76",X"6C",X"94",X"89",X"82",X"6D",X"78",X"96",X"86", + X"69",X"80",X"97",X"79",X"6D",X"97",X"7D",X"6A",X"9A",X"76",X"6D",X"98",X"83",X"81",X"7D",X"6C", + X"80",X"93",X"87",X"65",X"96",X"83",X"81",X"78",X"6B",X"99",X"82",X"82",X"73",X"70",X"91",X"8D", + X"7C",X"84",X"69",X"80",X"97",X"7B",X"85",X"6C",X"79",X"92",X"8B",X"73",X"71",X"9B",X"75",X"6E", + X"91",X"8E",X"70",X"73",X"97",X"84",X"6B",X"80",X"98",X"77",X"70",X"95",X"7F",X"67",X"93",X"89", + X"7F",X"7E",X"6B",X"83",X"95",X"7F",X"82",X"78",X"6C",X"98",X"83",X"81",X"79",X"6B",X"96",X"84", + X"67",X"95",X"84",X"68",X"8E",X"8F",X"71",X"72",X"8F",X"8F",X"6B",X"80",X"93",X"7A",X"6B",X"91", + X"87",X"65",X"90",X"8D",X"74",X"6E",X"93",X"89",X"7D",X"82",X"6B",X"7E",X"93",X"87",X"6B",X"7F", + X"97",X"7A",X"86",X"6B",X"7E",X"95",X"7D",X"83",X"71",X"74",X"93",X"88",X"7F",X"7E",X"69",X"96", + X"83",X"81",X"79",X"6C",X"8B",X"90",X"7D",X"83",X"77",X"6E",X"8A",X"92",X"77",X"71",X"98",X"78", + X"6F",X"9B",X"6E",X"7D",X"94",X"7A",X"83",X"65",X"93",X"88",X"81",X"78",X"6F",X"86",X"96",X"71", + X"79",X"94",X"7D",X"80",X"6C",X"7E",X"91",X"87",X"7E",X"80",X"6B",X"80",X"8F",X"8B",X"6B",X"7D", + X"95",X"7D",X"83",X"72",X"73",X"92",X"88",X"80",X"6E",X"7C",X"95",X"80",X"6D",X"7F",X"95",X"7D", + X"83",X"77",X"6E",X"92",X"88",X"7F",X"6F",X"7A",X"96",X"7F",X"6E",X"80",X"99",X"6B",X"7F",X"90", + X"80",X"75",X"72",X"94",X"87",X"75",X"72",X"99",X"78",X"6F",X"8C",X"8F",X"6C",X"7C",X"92",X"80", + X"78",X"6E",X"90",X"8C",X"72",X"73",X"96",X"81",X"81",X"6D",X"7F",X"95",X"7D",X"83",X"7B",X"6E", + X"83",X"93",X"7E",X"83",X"6A",X"88",X"90",X"66",X"8C",X"8D",X"69",X"86",X"92",X"7B",X"85",X"70", + X"76",X"8D",X"8E",X"70",X"78",X"96",X"7C",X"85",X"6F",X"79",X"98",X"74",X"71",X"90",X"89",X"7C", + X"83",X"6B",X"83",X"91",X"80",X"80",X"70",X"79",X"90",X"88",X"7E",X"81",X"6E",X"7D",X"98",X"71", + X"7B",X"93",X"7A",X"85",X"6B",X"80",X"92",X"81",X"80",X"71",X"79",X"99",X"74",X"78",X"93",X"7C", + X"83",X"70",X"78",X"8D",X"8B",X"7E",X"80",X"6C",X"82",X"90",X"84",X"6A",X"8B",X"8C",X"7D",X"81", + X"6B",X"8B",X"8F",X"6D",X"82",X"92",X"6C",X"7F",X"94",X"72",X"74",X"91",X"86",X"6D",X"82",X"93", + X"69",X"82",X"91",X"80",X"6E",X"81",X"94",X"77",X"73",X"93",X"7C",X"6F",X"97",X"78",X"71",X"8B", + X"8F",X"6C",X"82",X"8E",X"7D",X"81",X"6F",X"7C",X"8F",X"87",X"7E",X"80",X"6E",X"7E",X"8E",X"8A", + X"70",X"78",X"95",X"7D",X"84",X"78",X"71",X"87",X"91",X"79",X"70",X"91",X"85",X"7C",X"6F",X"8B", + X"8C",X"67",X"90",X"82",X"6F",X"91",X"84",X"76",X"72",X"8D",X"8D",X"70",X"7D",X"93",X"6F",X"7D", + X"95",X"68",X"88",X"8B",X"80",X"78",X"73",X"96",X"7D",X"84",X"73",X"75",X"93",X"83",X"81",X"77", + X"72",X"8E",X"8A",X"7E",X"80",X"6D",X"8C",X"8C",X"6A",X"83",X"8F",X"81",X"6D",X"85",X"8F",X"7E", + X"6D",X"88",X"8D",X"7F",X"6F",X"82",X"91",X"7D",X"6F",X"85",X"8F",X"7D",X"7D",X"6D",X"90",X"88", + X"7C",X"6E",X"94",X"80",X"70",X"8E",X"87",X"76",X"74",X"92",X"81",X"7D",X"6D",X"8F",X"87",X"7F", + X"71",X"7C",X"92",X"81",X"73",X"7A",X"95",X"7C",X"84",X"7B",X"6F",X"8D",X"8A",X"7B",X"71",X"82", + X"92",X"79",X"73",X"91",X"7E",X"6D",X"8D",X"89",X"7D",X"83",X"6D",X"84",X"8F",X"7D",X"83",X"70", + X"7B",X"8B",X"8B",X"7B",X"85",X"71",X"7A",X"93",X"7E",X"82",X"75",X"75",X"89",X"8D",X"7D",X"6D", + X"90",X"85",X"81",X"79",X"71",X"8D",X"8A",X"79",X"72",X"91",X"83",X"7D",X"6F",X"86",X"8E",X"7D", + X"70",X"85",X"90",X"7A",X"86",X"74",X"76",X"91",X"82",X"81",X"79",X"72",X"87",X"8D",X"80",X"6D", + X"86",X"8E",X"7E",X"82",X"76",X"74",X"89",X"8B",X"82",X"72",X"7F",X"94",X"6F",X"80",X"8D",X"7E", + X"73",X"7B",X"92",X"7F",X"71",X"8A",X"89",X"6A",X"89",X"8B",X"81",X"71",X"7F",X"91",X"7C",X"84", + X"79",X"72",X"8D",X"89",X"6C",X"8C",X"86",X"7F",X"7C",X"71",X"83",X"8D",X"83",X"7E",X"81",X"6E", + X"83",X"8D",X"85",X"71",X"7C",X"91",X"7E",X"82",X"7D",X"70",X"88",X"8D",X"7D",X"83",X"6E",X"84", + X"8F",X"7C",X"83",X"70",X"7E",X"90",X"7F",X"82",X"76",X"76",X"93",X"7E",X"83",X"7A",X"72",X"8D", + X"89",X"76",X"75",X"92",X"7F",X"83",X"76",X"76",X"92",X"7F",X"6F",X"8A",X"8A",X"7D",X"72",X"83", + X"90",X"79",X"75",X"8A",X"87",X"6B",X"89",X"89",X"7F",X"7F",X"71",X"81",X"93",X"70",X"7E",X"8E", + X"80",X"79",X"73",X"8E",X"88",X"79",X"72",X"8E",X"86",X"7B",X"72",X"8E",X"85",X"6E",X"8E",X"84", + X"6F",X"85",X"8E",X"78",X"74",X"91",X"7C",X"71",X"94",X"7A",X"73",X"8A",X"8C",X"76",X"76",X"8F", + X"84",X"7D",X"83",X"6E",X"86",X"8B",X"81",X"71",X"83",X"8D",X"7E",X"78",X"75",X"92",X"81",X"81", + X"7D",X"72",X"82",X"8E",X"80",X"80",X"7E",X"70",X"85",X"8C",X"83",X"70",X"80",X"8E",X"7F",X"72", + X"81",X"90",X"7A",X"86",X"72",X"7D",X"90",X"77",X"74",X"8C",X"88",X"7D",X"83",X"75",X"78",X"8C", + X"88",X"7D",X"83",X"74",X"79",X"8F",X"83",X"6F",X"87",X"8C",X"79",X"73",X"8A",X"89",X"7D",X"83", + X"76",X"76",X"8C",X"87",X"7F",X"7D",X"70",X"8C",X"87",X"80",X"71",X"84",X"8D",X"7C",X"73",X"8C", + X"83",X"6E",X"89",X"8A",X"7C",X"73",X"90",X"7E",X"83",X"70",X"84",X"8C",X"7E",X"78",X"78",X"93", + X"7A",X"73",X"8A",X"89",X"7C",X"84",X"77",X"76",X"90",X"81",X"81",X"7A",X"73",X"8B",X"89",X"71", + X"7E",X"8F",X"7E",X"71",X"8B",X"86",X"7F",X"7E",X"70",X"8D",X"87",X"72",X"7D",X"8E",X"82",X"73", + X"7E",X"8F",X"7F",X"82",X"7D",X"72",X"88",X"8C",X"6F",X"86",X"89",X"7D",X"81",X"70",X"83",X"8C", + X"82",X"70",X"83",X"8C",X"81",X"72",X"80",X"8E",X"7D",X"83",X"7A",X"74",X"86",X"8C",X"7C",X"72", + X"87",X"8B",X"7D",X"83",X"78",X"76",X"8F",X"82",X"71",X"8D",X"82",X"80",X"7E",X"72",X"83",X"8D", + X"7E",X"83",X"74",X"7E",X"8F",X"7B",X"85",X"74",X"7B",X"8F",X"7F",X"81",X"7B",X"73",X"87",X"8A", + X"80",X"72",X"8B",X"84",X"7E",X"80",X"70",X"8B",X"87",X"7E",X"82",X"73",X"7D",X"8C",X"86",X"77", + X"79",X"91",X"79",X"77",X"90",X"7A",X"77",X"90",X"79",X"75",X"8B",X"87",X"77",X"79",X"91",X"74", + X"7D",X"8C",X"7F",X"72",X"85",X"8B",X"7D",X"72",X"87",X"89",X"7F",X"7B",X"74",X"8D",X"86",X"76", + X"7A",X"91",X"74",X"7A",X"8B",X"86",X"78",X"77",X"8E",X"82",X"7F",X"81",X"73",X"7E",X"8C",X"84", + X"76",X"7B",X"91",X"77",X"77",X"8A",X"87",X"76",X"79",X"8B",X"86",X"75",X"7B",X"8B",X"85",X"72", + X"83",X"89",X"7E",X"7E",X"73",X"8F",X"80",X"73",X"83",X"8D",X"7D",X"84",X"73",X"7E",X"8B",X"84", + X"74",X"7D",X"8C",X"82",X"74",X"7F",X"8D",X"80",X"7B",X"74",X"8D",X"84",X"79",X"76",X"8F",X"80", + X"82",X"72",X"85",X"8A",X"7C",X"82",X"71",X"85",X"8A",X"7F",X"81",X"76",X"7B",X"8F",X"7F",X"83", + X"75",X"7B",X"89",X"89",X"73",X"81",X"8B",X"7C",X"84",X"74",X"7D",X"8C",X"81",X"71",X"89",X"87", + X"80",X"72",X"88",X"87",X"7F",X"75",X"82",X"8C",X"7B",X"84",X"73",X"7F",X"8E",X"7A",X"76",X"8D", + X"81",X"7E",X"74",X"8C",X"84",X"71",X"85",X"8A",X"7E",X"74",X"86",X"8A",X"7B",X"75",X"8A",X"85", + X"71",X"8B",X"83",X"73",X"89",X"85",X"7B",X"75",X"87",X"8A",X"79",X"76",X"8C",X"83",X"7F",X"80", + X"73",X"81",X"89",X"86",X"73",X"7D",X"8B",X"84",X"7A",X"76",X"8C",X"83",X"7F",X"75",X"81",X"8D", + X"7D",X"84",X"77",X"7A",X"8E",X"7B",X"75",X"8D",X"80",X"81",X"7B",X"75",X"8C",X"84",X"7F",X"73", + X"87",X"88",X"7D",X"82",X"75",X"7D",X"8D",X"7F",X"74",X"8D",X"7E",X"75",X"8D",X"7E",X"74",X"88", + X"88",X"7A",X"78",X"8D",X"7C",X"75",X"87",X"89",X"7A",X"76",X"88",X"89",X"77",X"7A",X"8E",X"7C", + X"74",X"8A",X"85",X"7E",X"82",X"76",X"7B",X"89",X"87",X"72",X"88",X"85",X"7E",X"81",X"74",X"7F", + X"88",X"87",X"75",X"7E",X"8E",X"77",X"79",X"8A",X"85",X"77",X"7A",X"8B",X"83",X"76",X"7F",X"8C", + X"73",X"7E",X"8B",X"82",X"75",X"7E",X"8C",X"7F",X"77",X"7C",X"8D",X"80",X"75",X"86",X"87",X"73", + X"7F",X"8B",X"80",X"7F",X"74",X"89",X"85",X"72",X"89",X"85",X"73",X"88",X"85",X"7D",X"82",X"71", + X"8A",X"84",X"83",X"74",X"82",X"89",X"81",X"78",X"7D",X"8C",X"7F",X"7C",X"76",X"8A",X"86",X"7B", + X"77",X"8C",X"81",X"80",X"7E",X"74",X"86",X"88",X"82",X"7A",X"78",X"8B",X"83",X"7E",X"82",X"77", + X"7B",X"88",X"87",X"7A",X"77",X"86",X"89",X"78",X"7A",X"8C",X"7F",X"81",X"79",X"78",X"87",X"87", + X"81",X"76",X"80",X"8D",X"74",X"81",X"89",X"7D",X"83",X"76",X"7D",X"8B",X"81",X"73",X"87",X"88", + X"7D",X"76",X"8D",X"7D",X"77",X"8A",X"82",X"7A",X"78",X"89",X"86",X"76",X"7C",X"8B",X"81",X"7D", + X"75",X"8B",X"82",X"74",X"8A",X"82",X"74",X"8B",X"81",X"80",X"7E",X"75",X"85",X"8A",X"77",X"7B", + X"8A",X"83",X"77",X"7C",X"8B",X"81",X"77",X"7D",X"8D",X"7D",X"83",X"7A",X"78",X"89",X"86",X"7D", + X"83",X"79",X"79",X"8A",X"84",X"75",X"80",X"8A",X"80",X"7B",X"78",X"8E",X"7C",X"78",X"8B",X"7F", + X"81",X"7C",X"76",X"86",X"87",X"80",X"74",X"85",X"88",X"7B",X"76",X"8C",X"81",X"82",X"78",X"7C", + X"8A",X"80",X"7B",X"78",X"8C",X"80",X"7E",X"75",X"87",X"87",X"7D",X"76",X"86",X"88",X"7B",X"77", + X"87",X"87",X"79",X"7A",X"8C",X"7B",X"78",X"8C",X"80",X"81",X"7D",X"76",X"85",X"88",X"80",X"7E", + X"76",X"86",X"88",X"7D",X"76",X"84",X"89",X"7B",X"79",X"89",X"81",X"80",X"7B",X"77",X"89",X"84", + X"80",X"7F",X"75",X"88",X"84",X"7F",X"77",X"7F",X"8B",X"80",X"78",X"7E",X"8C",X"7B",X"79",X"88", + X"83",X"77",X"7F",X"8C",X"76",X"7F",X"89",X"7F",X"78",X"7C",X"8B",X"81",X"76",X"83",X"8A",X"74", + X"83",X"88",X"75",X"82",X"89",X"74",X"81",X"89",X"7D",X"83",X"77",X"7C",X"8C",X"7E",X"76",X"88", + X"86",X"7E",X"83",X"7A",X"79",X"83",X"89",X"7F",X"76",X"88",X"85",X"74",X"84",X"89",X"75",X"82", + X"88",X"7D",X"83",X"75",X"80",X"88",X"82",X"7A",X"7B",X"8B",X"7E",X"82",X"7B",X"78",X"88",X"86", + X"76",X"83",X"88",X"74",X"83",X"88",X"7E",X"76",X"85",X"87",X"7E",X"82",X"7C",X"78",X"83",X"87", + X"83",X"76",X"80",X"89",X"80",X"77",X"81",X"8A",X"7E",X"81",X"7E",X"77",X"81",X"89",X"81",X"78", + X"7C",X"8B",X"80",X"82",X"74",X"86",X"85",X"80",X"77",X"82",X"88",X"7F",X"7A",X"7B",X"8C",X"7E", + X"82",X"7B",X"78",X"87",X"86",X"7E",X"82",X"76",X"81",X"8A",X"7A",X"79",X"87",X"86",X"7A",X"79", + X"89",X"83",X"7F",X"81",X"76",X"83",X"89",X"78",X"7C",X"89",X"82",X"78",X"7C",X"8B",X"7F",X"81", + X"7C",X"77",X"87",X"85",X"7E",X"81",X"77",X"7E",X"8A",X"80",X"81",X"7F",X"77",X"81",X"89",X"80", + X"80",X"7F",X"76",X"84",X"88",X"7E",X"82",X"79",X"7B",X"87",X"86",X"7C",X"79",X"88",X"83",X"76", + X"81",X"88",X"80",X"77",X"81",X"89",X"7D",X"78",X"86",X"84",X"76",X"81",X"88",X"80",X"77",X"85", + X"86",X"76",X"7E",X"89",X"81",X"78",X"7F",X"8A",X"7E",X"78",X"89",X"81",X"80",X"7E",X"77",X"82", + X"87",X"82",X"7F",X"81",X"78",X"7D",X"88",X"83",X"7F",X"77",X"86",X"85",X"7E",X"82",X"76",X"80", + X"88",X"82",X"7E",X"77",X"86",X"85",X"7F",X"77",X"86",X"85",X"7F",X"78",X"81",X"8A",X"75",X"83", + X"87",X"77",X"7F",X"8A",X"79",X"7B",X"88",X"84",X"76",X"84",X"85",X"7E",X"78",X"82",X"88",X"7F", + X"78",X"84",X"87",X"76",X"7F",X"88",X"82",X"7E",X"82",X"77",X"7F",X"89",X"7E",X"82",X"7B",X"7A", + X"87",X"85",X"76",X"81",X"88",X"80",X"77",X"81",X"88",X"7E",X"82",X"7E",X"78",X"82",X"87",X"81", + X"77",X"80",X"88",X"7F",X"78",X"81",X"89",X"7E",X"82",X"7E",X"78",X"82",X"88",X"81",X"78",X"7F", + X"89",X"7E",X"82",X"7E",X"78",X"83",X"88",X"7A",X"7B",X"88",X"81",X"7E",X"77",X"87",X"84",X"7F", + X"78",X"82",X"89",X"75",X"84",X"85",X"7F",X"81",X"78",X"7E",X"8A",X"7E",X"79",X"89",X"80",X"81", + X"7D",X"78",X"85",X"86",X"81",X"76",X"86",X"84",X"80",X"79",X"7E",X"88",X"81",X"79",X"7D",X"8A", + X"7E",X"82",X"7E",X"7A",X"7D",X"88",X"82",X"81",X"79",X"7F",X"8A",X"79",X"7B",X"88",X"82",X"7F", + X"7F",X"77",X"85",X"86",X"7F",X"78",X"82",X"88",X"7F",X"82",X"7B",X"7A",X"86",X"85",X"7F",X"81", + X"77",X"82",X"87",X"80",X"78",X"83",X"86",X"7D",X"83",X"77",X"81",X"88",X"7F",X"82",X"7B",X"7A", + X"88",X"83",X"77",X"83",X"87",X"78",X"7E",X"88",X"80",X"80",X"7F",X"79",X"7D",X"87",X"83",X"80", + X"77",X"83",X"85",X"7F",X"7A",X"7C",X"89",X"81",X"7A",X"7D",X"8A",X"7A",X"7B",X"86",X"84",X"7A", + X"7C",X"89",X"7F",X"82",X"7C",X"7A",X"88",X"81",X"77",X"85",X"86",X"77",X"84",X"85",X"77",X"81", + X"88",X"78",X"7D",X"87",X"82",X"78",X"81",X"87",X"7A",X"7C",X"89",X"7D",X"79",X"87",X"83",X"7A", + X"7C",X"88",X"82",X"7A",X"7D",X"88",X"80",X"78",X"86",X"83",X"76",X"84",X"86",X"7E",X"78",X"86", + X"83",X"7E",X"81",X"77",X"81",X"86",X"83",X"79",X"7E",X"88",X"7F",X"81",X"7D",X"79",X"86",X"84", + X"7E",X"82",X"77",X"81",X"86",X"82",X"78",X"82",X"86",X"80",X"7D",X"7A",X"89",X"80",X"7F",X"78", + X"88",X"81",X"78",X"87",X"81",X"7F",X"81",X"78",X"82",X"88",X"79",X"7F",X"88",X"7B",X"7B",X"85", + X"85",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"79",X"84",X"85",X"80",X"80",X"78",X"86",X"84",X"77", + X"81",X"87",X"7E",X"82",X"7A",X"7D",X"89",X"7E",X"82",X"7D",X"7A",X"82",X"87",X"7F",X"81",X"7F", + X"79",X"83",X"87",X"7A",X"7C",X"87",X"81",X"7E",X"79",X"85",X"85",X"7E",X"79",X"84",X"86",X"79", + X"7E",X"88",X"7B",X"7B",X"86",X"83",X"7F",X"82",X"79",X"7E",X"87",X"81",X"7D",X"79",X"86",X"84", + X"7F",X"79",X"84",X"85",X"77",X"85",X"84",X"7F",X"81",X"7A",X"7D",X"86",X"83",X"7E",X"82",X"7B", + X"7C",X"87",X"81",X"78",X"81",X"86",X"7F",X"79",X"82",X"86",X"7E",X"79",X"81",X"87",X"7E",X"79", + X"87",X"82",X"7F",X"80",X"78",X"84",X"85",X"7C",X"7B",X"87",X"81",X"80",X"78",X"86",X"83",X"80", + X"7B",X"7C",X"88",X"81",X"7C",X"7C",X"89",X"7B",X"7B",X"85",X"84",X"7B",X"7B",X"85",X"84",X"7C", + X"7A",X"86",X"84",X"7C",X"7B",X"87",X"82",X"7F",X"79",X"85",X"84",X"78",X"84",X"84",X"7A",X"7E", + X"87",X"81",X"7A",X"81",X"86",X"7A",X"7C",X"87",X"81",X"7F",X"81",X"7A",X"7F",X"88",X"7E",X"7A", + X"85",X"83",X"7A",X"7E",X"88",X"7B",X"7D",X"88",X"7D",X"7B",X"87",X"80",X"79",X"84",X"84",X"7E", + X"82",X"79",X"7F",X"87",X"80",X"80",X"79",X"83",X"86",X"7F",X"79",X"83",X"85",X"78",X"80",X"87", + X"7F",X"81",X"7A",X"7F",X"88",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"7A",X"84",X"85",X"7F",X"79", + X"81",X"87",X"7E",X"82",X"7B",X"7E",X"87",X"7E",X"79",X"84",X"85",X"7E",X"82",X"7C",X"7B",X"84", + X"86",X"78",X"83",X"84",X"80",X"7A",X"7E",X"86",X"82",X"7A",X"7E",X"87",X"81",X"7A",X"7F",X"87", + X"80",X"7E",X"79",X"86",X"83",X"7F",X"81",X"79",X"81",X"86",X"7E",X"82",X"7B",X"7D",X"87",X"80", + X"81",X"7F",X"7A",X"81",X"87",X"7C",X"7B",X"86",X"82",X"7C",X"7B",X"86",X"83",X"7D",X"7A",X"88", + X"7E",X"7B",X"85",X"82",X"7B",X"7D",X"87",X"80",X"7E",X"7A",X"85",X"84",X"7E",X"7A",X"85",X"84", + X"7E",X"7A",X"84",X"84",X"7E",X"82",X"79",X"80",X"86",X"7E",X"7A",X"85",X"83",X"7F",X"80",X"79", + X"85",X"84",X"79",X"82",X"86",X"79",X"81",X"86",X"7B",X"7D",X"87",X"7F",X"79",X"86",X"81",X"79", + X"85",X"83",X"79",X"82",X"85",X"78",X"82",X"85",X"7F",X"81",X"7B",X"7D",X"87",X"80",X"80",X"7F", + X"7A",X"83",X"86",X"7B",X"7D",X"86",X"81",X"7B",X"7D",X"86",X"82",X"7C",X"7D",X"88",X"7D",X"7B", + X"83",X"85",X"7E",X"7A",X"83",X"85",X"7C",X"7C",X"86",X"80",X"7F",X"7A",X"85",X"83",X"79",X"85", + X"83",X"7A",X"81",X"86",X"79",X"80",X"85",X"81",X"7E",X"7B",X"87",X"80",X"81",X"7E",X"7B",X"83", + X"86",X"79",X"81",X"84",X"80",X"7B",X"80",X"86",X"7F",X"7D",X"7D",X"88",X"7E",X"82",X"7C",X"7C", + X"85",X"83",X"79",X"81",X"86",X"7F",X"7A",X"82",X"86",X"79",X"80",X"85",X"81",X"7A",X"7F",X"86", + X"81",X"7B",X"7E",X"87",X"7F",X"80",X"80",X"7B",X"80",X"87",X"7E",X"7A",X"85",X"83",X"7F",X"7A", + X"84",X"84",X"7F",X"7C",X"7E",X"87",X"7E",X"82",X"7D",X"7B",X"85",X"81",X"7F",X"7A",X"85",X"82", + X"7F",X"7B",X"80",X"86",X"80",X"7B",X"80",X"86",X"7F",X"80",X"80",X"7A",X"81",X"85",X"7F",X"7A", + X"82",X"85",X"80",X"7B",X"81",X"86",X"7C",X"7C",X"86",X"81",X"81",X"7C",X"7E",X"86",X"7F",X"80", + X"79",X"84",X"84",X"7F",X"80",X"7F",X"7A",X"83",X"84",X"7F",X"81",X"7B",X"7E",X"83",X"85",X"7D", + X"7C",X"86",X"81",X"7A",X"81",X"85",X"7F",X"7B",X"84",X"82",X"7F",X"81",X"7A",X"80",X"85",X"81", + X"7F",X"81",X"7D",X"7C",X"84",X"84",X"7F",X"7A",X"82",X"85",X"7F",X"81",X"7F",X"7A",X"84",X"83", + X"7F",X"80",X"7A",X"81",X"85",X"80",X"80",X"7D",X"7C",X"86",X"81",X"80",X"80",X"7A",X"85",X"82", + X"7F",X"81",X"7B",X"7E",X"85",X"82",X"7F",X"81",X"7B",X"7F",X"84",X"83",X"7C",X"7D",X"85",X"82", + X"7C",X"7E",X"86",X"7D",X"7C",X"85",X"82",X"7F",X"81",X"7E",X"7B",X"84",X"83",X"81",X"7C",X"7D", + X"87",X"7C",X"7E",X"86",X"7F",X"7B",X"86",X"80",X"81",X"7C",X"7E",X"86",X"7F",X"7B",X"83",X"84", + X"7F",X"80",X"7A",X"81",X"85",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"7E",X"7C",X"87",X"7E",X"7C", + X"85",X"80",X"7B",X"84",X"82",X"79",X"82",X"84",X"81",X"7A",X"81",X"85",X"80",X"7F",X"7B",X"86", + X"81",X"7A",X"83",X"84",X"7F",X"81",X"7F",X"7B",X"82",X"85",X"7B",X"7D",X"85",X"81",X"7F",X"81", + X"7D",X"7C",X"85",X"82",X"80",X"7A",X"83",X"83",X"80",X"7D",X"7D",X"86",X"80",X"7F",X"7B",X"84", + X"83",X"7F",X"81",X"7E",X"7C",X"83",X"84",X"7B",X"81",X"85",X"7C",X"7E",X"86",X"7C",X"7D",X"84", + X"84",X"7C",X"7E",X"85",X"80",X"7C",X"7D",X"85",X"81",X"7F",X"81",X"7C",X"7F",X"86",X"7F",X"81", + X"7F",X"7B",X"84",X"83",X"7C",X"7F",X"86",X"7B",X"7E",X"84",X"82",X"7D",X"7D",X"85",X"80",X"7F", + X"7B",X"86",X"80",X"80",X"7F",X"7B",X"82",X"85",X"7B",X"80",X"84",X"80",X"7D",X"7D",X"85",X"82", + X"7D",X"7D",X"85",X"81",X"7D",X"7D",X"84",X"82",X"7D",X"7E",X"86",X"7D",X"7C",X"84",X"82",X"7B", + X"80",X"85",X"7F",X"80",X"80",X"7B",X"81",X"85",X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"7B", + X"81",X"84",X"7F",X"7B",X"83",X"83",X"7F",X"81",X"7B",X"80",X"83",X"83",X"7D",X"7C",X"85",X"81", + X"7F",X"81",X"7D",X"7D",X"83",X"83",X"80",X"7B",X"83",X"83",X"80",X"7B",X"81",X"84",X"80",X"7C", + X"80",X"85",X"7B",X"7E",X"84",X"82",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"80",X"7B",X"83",X"84", + X"7A",X"83",X"82",X"80",X"7C",X"81",X"85",X"7B",X"7F",X"84",X"80",X"7F",X"81",X"7C",X"7F",X"85", + X"7E",X"7C",X"83",X"84",X"7F",X"81",X"7B",X"80",X"84",X"7F",X"81",X"7D",X"7C",X"83",X"83",X"80", + X"7B",X"80",X"84",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F",X"7C",X"81",X"85",X"7B",X"7F",X"85", + X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"80",X"80",X"7B",X"82",X"83",X"7F",X"81",X"7D",X"7D", + X"85",X"80",X"80",X"80",X"7C",X"80",X"85",X"80",X"80",X"7F",X"7C",X"85",X"81",X"7B",X"82",X"83", + X"7A",X"82",X"83",X"7F",X"81",X"7B",X"80",X"85",X"7F",X"7C",X"84",X"82",X"7B",X"80",X"84",X"81", + X"7C",X"7F",X"85",X"7F",X"82",X"7D",X"7E",X"85",X"80",X"7B",X"82",X"83",X"7F",X"80",X"7B",X"85", + X"81",X"7B",X"81",X"84",X"80",X"7C",X"83",X"82",X"7B",X"80",X"84",X"80",X"81",X"7C",X"81",X"85", + X"7B",X"7F",X"85",X"7D",X"7D",X"84",X"81",X"80",X"81",X"7E",X"7C",X"83",X"83",X"7F",X"7C",X"81", + X"84",X"7F",X"81",X"7C",X"7F",X"85",X"7F",X"7C",X"82",X"83",X"7E",X"7C",X"82",X"84",X"7F",X"81", + X"7F",X"7C",X"81",X"84",X"80",X"80",X"81",X"7C",X"80",X"85",X"7F",X"7C",X"84",X"80",X"81",X"7C", + X"7F",X"84",X"81",X"7E",X"7D",X"84",X"82",X"7D",X"7D",X"84",X"81",X"7E",X"7C",X"84",X"81",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"7C",X"82",X"83",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F", + X"7C",X"80",X"83",X"82",X"7D",X"7E",X"84",X"81",X"7F",X"81",X"7C",X"80",X"84",X"81",X"7D",X"7E", + X"84",X"80",X"7F",X"7C",X"83",X"83",X"7E",X"7D",X"84",X"81",X"7B",X"82",X"83",X"7F",X"7C",X"81", + X"83",X"80",X"7C",X"81",X"84",X"7F",X"80",X"80",X"7C",X"81",X"84",X"7D",X"7D",X"83",X"82",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"80",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"84",X"81", + X"7F",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"85",X"80",X"80",X"7F",X"7C",X"83",X"82",X"7C", + X"81",X"84",X"7C",X"80",X"84",X"7D",X"7E",X"85",X"7F",X"7C",X"83",X"82",X"7F",X"81",X"7C",X"81", + X"84",X"80",X"80",X"80",X"7D",X"7F",X"83",X"82",X"7C",X"81",X"83",X"7F",X"81",X"7C",X"7F",X"83", + X"81",X"7F",X"81",X"7D",X"7E",X"85",X"80",X"80",X"7F",X"7C",X"82",X"83",X"7D",X"7E",X"83",X"82", + X"7E",X"7D",X"84",X"81",X"80",X"80",X"7C",X"81",X"84",X"80",X"81",X"7E",X"7D",X"84",X"82",X"7C", + X"82",X"83",X"7C",X"7F",X"84",X"80",X"80",X"81",X"7D",X"7E",X"83",X"82",X"80",X"80",X"7C",X"82", + X"83",X"7C",X"80",X"84",X"7D",X"7D",X"84",X"80",X"81",X"7C",X"82",X"83",X"7F",X"7E",X"7E",X"84", + X"80",X"80",X"80",X"7D",X"7E",X"85",X"80",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7F",X"7C",X"82", + X"83",X"7B",X"80",X"83",X"80",X"7D",X"7E",X"84",X"80",X"80",X"80",X"7D",X"7F",X"84",X"7F",X"7C", + X"84",X"81",X"80",X"7C",X"83",X"82",X"7C",X"82",X"82",X"7C",X"80",X"84",X"7D",X"7E",X"84",X"80", + X"80",X"80",X"7C",X"83",X"82",X"80",X"7E",X"7E",X"85",X"7E",X"7D",X"82",X"83",X"7E",X"7D",X"83", + X"80",X"7C",X"83",X"81",X"7C",X"83",X"81",X"80",X"80",X"7C",X"7F",X"82",X"82",X"7E",X"7D",X"83", + X"82",X"7E",X"7D",X"83",X"82",X"7E",X"7E",X"84",X"7F",X"7C",X"84",X"80",X"7C",X"83",X"81",X"7F", + X"80",X"7C",X"81",X"83",X"80",X"7F",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7B",X"82",X"82",X"7F", + X"80",X"7C",X"82",X"82",X"80",X"7D",X"82",X"83",X"7B",X"82",X"82",X"80",X"7D",X"80",X"83",X"80", + X"7D",X"80",X"84",X"7F",X"81",X"7F",X"7D",X"82",X"83",X"80",X"7C",X"81",X"83",X"7F",X"7D",X"81", + X"84",X"7D",X"7F",X"84",X"7F",X"7D",X"84",X"80",X"81",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7E", + X"82",X"83",X"7F",X"81",X"7D",X"7F",X"83",X"81",X"7D",X"7F",X"84",X"80",X"7C",X"83",X"81",X"7C", + X"82",X"82",X"7C",X"80",X"83",X"80",X"80",X"80",X"7D",X"7E",X"83",X"81",X"80",X"80",X"7F",X"7D", + X"82",X"83",X"80",X"80",X"80",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7D",X"82",X"82",X"80",X"7E", + X"7D",X"84",X"81",X"80",X"80",X"7D",X"80",X"84",X"7E",X"7E",X"83",X"81",X"7F",X"7D",X"82",X"82", + X"7E",X"7E",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"7D",X"82",X"83",X"7F",X"7D",X"83",X"81",X"7C", + X"82",X"81",X"7F",X"81",X"7D",X"80",X"83",X"7F",X"7D",X"83",X"81",X"7F",X"81",X"7C",X"81",X"83", + X"7F",X"80",X"7F",X"7D",X"82",X"82",X"80",X"7D",X"80",X"83",X"80",X"7D",X"82",X"82",X"7F",X"81", + X"7D",X"7F",X"82",X"82",X"7D",X"81",X"83",X"7F",X"81",X"7D",X"7E",X"84",X"7F",X"7D",X"83",X"80", + X"7D",X"83",X"81",X"80",X"7E",X"7E",X"84",X"7E",X"7E",X"82",X"81",X"7D",X"80",X"83",X"81",X"7E", + X"7E",X"83",X"81",X"7D",X"80",X"83",X"7E",X"7E",X"83",X"81",X"80",X"80",X"7C",X"82",X"82",X"7E", + X"7E",X"83",X"81",X"7E",X"7E",X"83",X"80",X"80",X"7F",X"7D",X"83",X"80",X"80",X"7D",X"83",X"81", + X"80",X"7D",X"80",X"83",X"7F",X"81",X"7E",X"7F",X"83",X"7F",X"7D",X"83",X"80",X"7C",X"83",X"81", + X"7D",X"82",X"82",X"7C",X"81",X"82",X"80",X"7E",X"7F",X"83",X"81",X"7E",X"7F",X"83",X"80",X"80", + X"81",X"7D",X"7F",X"83",X"81",X"7D",X"80",X"83",X"80",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"7F", + X"83",X"80",X"7D",X"83",X"80",X"7F",X"7D",X"83",X"81",X"80",X"80",X"7D",X"81",X"83",X"80",X"7D", + X"83",X"81",X"80",X"80",X"7D",X"80",X"82",X"81",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81", + X"80",X"81",X"7E",X"7E",X"82",X"82",X"7F",X"7D",X"82",X"82",X"7C",X"81",X"82",X"81",X"7D",X"81", + X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"81",X"7E",X"7E", + X"83",X"81",X"7F",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82",X"82",X"7E",X"7E",X"83", + X"80",X"80",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"7F",X"7E",X"83",X"80",X"7D",X"81",X"83", + X"7F",X"80",X"80",X"7D",X"80",X"83",X"7D",X"7F",X"83",X"80",X"81",X"7E",X"7E",X"83",X"80",X"80", + X"80",X"7D",X"80",X"82",X"82",X"7D",X"80",X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"80",X"80",X"7D",X"80",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"81",X"7F",X"7E",X"82",X"81", + X"7D",X"81",X"82",X"7F",X"81",X"7D",X"80",X"82",X"81",X"7E",X"7F",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"7D",X"81",X"82",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"7F",X"7D",X"81",X"83",X"7F", + X"7E",X"82",X"81",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"81",X"82",X"7F",X"80",X"7E",X"7E",X"82", + X"82",X"80",X"80",X"7D",X"81",X"83",X"7E",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82", + X"82",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"80",X"82",X"80",X"7E",X"80",X"83",X"80", + X"7F",X"7E",X"83",X"81",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"83",X"7F", + X"7E",X"83",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"80",X"7D",X"80",X"82", + X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"82",X"80",X"7F",X"7E",X"83",X"7F",X"7E", + X"83",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"81",X"81",X"80",X"7E",X"7F",X"83",X"80", + X"7F",X"7E",X"83",X"80",X"80",X"80",X"7F",X"7E",X"82",X"82",X"80",X"80",X"80",X"7D",X"81",X"82", + X"7D",X"80",X"83",X"7F",X"7E",X"82",X"81",X"7D",X"80",X"82",X"80",X"7D",X"81",X"81",X"80",X"7D", + X"81",X"82",X"80",X"7E",X"7F",X"83",X"80",X"80",X"80",X"7E",X"7F",X"82",X"82",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"82",X"82",X"80",X"80",X"80",X"7E",X"80",X"82", + X"81",X"7E",X"81",X"82",X"7F",X"81",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"80",X"82",X"81", + X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E",X"80",X"82",X"80", + X"80",X"80",X"7D",X"82",X"81",X"80",X"80",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"82",X"81", + X"7F",X"81",X"7E",X"7F",X"82",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"7D", + X"81",X"82",X"7D",X"80",X"82",X"80",X"7E",X"81",X"82",X"7D",X"81",X"81",X"80",X"7D",X"81",X"82", + X"7F",X"80",X"7E",X"7F",X"82",X"81",X"7F",X"81",X"7D",X"81",X"82",X"7E",X"7F",X"82",X"81",X"7E", + X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E", + X"7F",X"82",X"81",X"7E",X"81",X"82",X"7E",X"7F",X"82",X"80",X"80",X"7E",X"81",X"82",X"7F",X"80", + X"7E",X"80",X"81",X"82",X"7F",X"7E",X"82",X"81",X"7F",X"81",X"7F",X"7E",X"82",X"81",X"7E",X"80", + X"82",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E", + X"82",X"81",X"80",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"82",X"80",X"7F",X"7F",X"83",X"7E",X"7F", + X"82",X"80",X"7F",X"7E",X"82",X"81",X"7F",X"7E",X"82",X"81",X"80",X"7E",X"81",X"81",X"80",X"7E", + X"80",X"82",X"80",X"7F",X"7E",X"83",X"80",X"80",X"80",X"7E",X"81",X"82",X"80",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7E",X"7F",X"82",X"81",X"7F",X"7F",X"83",X"7E",X"7F",X"82",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GAL_HIT.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GAL_HIT.vhd new file mode 100644 index 00000000..7d2fd29c --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/GAL_HIT.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_HIT 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 prom of GAL_HIT is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"65",X"75",X"88",X"90",X"93",X"9B",X"A3",X"A3",X"A3",X"A6",X"9E",X"9B",X"9B",X"A3",X"AB",X"B6", + X"B9",X"B9",X"BE",X"B9",X"AE",X"A6",X"9E",X"98",X"88",X"78",X"68",X"65",X"65",X"65",X"62",X"68", + X"68",X"65",X"5D",X"52",X"47",X"47",X"4A",X"4D",X"4D",X"4D",X"52",X"65",X"7D",X"88",X"90",X"9B", + X"A3",X"AE",X"AE",X"AB",X"AB",X"9E",X"98",X"88",X"70",X"52",X"37",X"1F",X"17",X"1F",X"27",X"3A", + X"5A",X"68",X"78",X"83",X"93",X"A3",X"AB",X"AE",X"A3",X"93",X"88",X"88",X"83",X"88",X"8B",X"88", + X"78",X"62",X"4A",X"42",X"3A",X"42",X"4D",X"55",X"65",X"78",X"83",X"8B",X"93",X"90",X"88",X"88", + X"98",X"A6",X"A6",X"AB",X"9E",X"8B",X"7D",X"68",X"70",X"88",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC", + X"FC",X"FC",X"DC",X"9B",X"4D",X"14",X"01",X"04",X"2F",X"52",X"5D",X"68",X"78",X"80",X"78",X"70", + X"5D",X"47",X"32",X"1F",X"14",X"09",X"11",X"1C",X"32",X"52",X"83",X"B9",X"D1",X"C9",X"AB",X"8B", + X"70",X"68",X"75",X"78",X"80",X"8B",X"8B",X"98",X"AB",X"BE",X"C1",X"AB",X"83",X"5D",X"3A",X"17", + X"11",X"17",X"27",X"3A",X"65",X"90",X"AE",X"B6",X"9B",X"78",X"55",X"4A",X"4D",X"5A",X"5D",X"52", + X"4A",X"4A",X"52",X"78",X"AB",X"D4",X"FC",X"FC",X"F7",X"E9",X"E1",X"D1",X"C9",X"BE",X"AB",X"90", + X"52",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"2F",X"4A",X"52",X"47",X"47",X"62",X"70",X"7D", + X"7D",X"78",X"7D",X"90",X"B3",X"CE",X"EC",X"FC",X"FC",X"FC",X"FC",X"F4",X"E9",X"F4",X"FC",X"FC", + X"FC",X"FC",X"CE",X"98",X"65",X"2C",X"01",X"01",X"01",X"01",X"01",X"32",X"6D",X"7D",X"68",X"4A", + X"27",X"11",X"1C",X"3A",X"4D",X"62",X"68",X"65",X"68",X"70",X"80",X"9B",X"D1",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"A3",X"75",X"55",X"62",X"80",X"A3",X"BE",X"CE",X"C1",X"90",X"4A",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"88",X"C9",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC", + X"B6",X"90",X"68",X"3F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1F",X"83",X"BE",X"D1",X"CE", + X"D4",X"F4",X"FC",X"FC",X"FC",X"F7",X"D1",X"CE",X"DC",X"F7",X"FC",X"FC",X"FC",X"FC",X"D1",X"8B", + X"68",X"68",X"88",X"A6",X"C1",X"D9",X"D4",X"BE",X"A3",X"88",X"75",X"68",X"62",X"5D",X"62",X"68", + X"6D",X"78",X"75",X"55",X"2C",X"11",X"11",X"2F",X"55",X"75",X"83",X"93",X"9E",X"B9",X"E9",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"68",X"32",X"11",X"17",X"32",X"52",X"7D", + X"AE",X"E1",X"F7",X"E1",X"A3",X"62",X"17",X"01",X"01",X"01",X"01",X"01",X"1C",X"4D",X"7D",X"90", + X"9B",X"A6",X"B6",X"BE",X"A6",X"70",X"37",X"14",X"14",X"1C",X"14",X"1C",X"2F",X"3A",X"3A",X"3A", + X"4A",X"52",X"4A",X"47",X"3A",X"24",X"11",X"14",X"27",X"3A",X"65",X"9E",X"D4",X"FC",X"FC",X"F7", + X"D4",X"AB",X"93",X"93",X"93",X"83",X"68",X"4D",X"37",X"37",X"5D",X"9B",X"EC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"CE",X"AB",X"93",X"7D",X"65",X"65",X"75",X"88",X"93",X"98",X"98",X"93", + X"93",X"90",X"93",X"8B",X"90",X"90",X"90",X"8B",X"8B",X"90",X"8B",X"90",X"90",X"90",X"90",X"8B", + X"8B",X"8B",X"8B",X"8B",X"88",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"83",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"78",X"75",X"78",X"75",X"78", + X"78",X"78",X"75",X"78",X"75",X"70",X"75",X"75",X"75",X"75",X"70",X"6D",X"68",X"6D",X"70",X"6D", + X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"70",X"70",X"70",X"75",X"75",X"75",X"75", + X"75",X"70",X"62",X"4D",X"4D",X"4D",X"47",X"4A",X"68",X"98",X"B6",X"B3",X"9B",X"78",X"5A",X"3F", + X"32",X"2F",X"32",X"3F",X"5A",X"90",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"E9",X"90",X"4D",X"3A", + X"47",X"5D",X"5D",X"4D",X"3A",X"27",X"1C",X"14",X"11",X"0C",X"01",X"01",X"01",X"01",X"01",X"01", + X"04",X"4A",X"9E",X"F7",X"FC",X"FC",X"FC",X"FC",X"EC",X"E4",X"E4",X"D1",X"AB",X"80",X"62",X"47", + X"37",X"2F",X"2C",X"24",X"04",X"01",X"24",X"52",X"70",X"70",X"62",X"4D",X"3F",X"37",X"37",X"3A", + X"4D",X"62",X"78",X"93",X"AE",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"B6",X"68", + X"2C",X"01",X"01",X"01",X"01",X"01",X"01",X"09",X"47",X"65",X"68",X"68",X"62",X"5A",X"52",X"4D", + X"52",X"4D",X"52",X"52",X"5A",X"5D",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"65",X"37",X"1C", + X"09",X"09",X"1C",X"32",X"4D",X"70",X"93",X"AB",X"C9",X"D9",X"E9",X"EF",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"F7",X"6D",X"0C",X"01",X"01",X"01",X"01",X"01",X"17",X"62",X"83",X"78", + X"5A",X"37",X"14",X"04",X"01",X"01",X"01",X"01",X"04",X"11",X"1C",X"1C",X"01",X"01",X"0C",X"3F", + X"6D",X"7D",X"78",X"68",X"65",X"83",X"B3",X"E1",X"F4",X"E4",X"C6",X"A3",X"8B",X"75",X"68",X"65", + X"5D",X"62",X"65",X"62",X"5A",X"3F",X"27",X"17",X"1F",X"5A",X"9E",X"CE",X"D4",X"C9",X"AE",X"A6", + X"AE",X"AB",X"9B",X"83",X"80",X"98",X"9B",X"9B",X"9B",X"B6",X"D9",X"E4",X"E1",X"DC",X"E1",X"D4", + X"B3",X"83",X"5A",X"3A",X"1F",X"11",X"0C",X"11",X"14",X"1C",X"1F",X"2C",X"2C",X"1F",X"27",X"32", + X"3F",X"5D",X"83",X"9B",X"93",X"93",X"88",X"7D",X"7D",X"75",X"70",X"70",X"6D",X"68",X"68",X"68", + X"5A",X"5A",X"75",X"88",X"93",X"93",X"90",X"90",X"88",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"80", + X"7D",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80",X"83",X"83",X"80",X"80", + X"80",X"7D",X"7D",X"70",X"70",X"6D",X"75",X"83",X"90",X"93",X"90",X"88",X"88",X"80",X"78",X"7D", + X"70",X"68",X"70",X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"75",X"70",X"68",X"4D",X"3A", + X"4A",X"70",X"93",X"A3",X"B6",X"B9",X"B3",X"A3",X"90",X"80",X"75",X"70",X"68",X"68",X"68",X"65", + X"68",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"75",X"78", + X"78",X"78",X"78",X"78",X"78",X"78",X"70",X"55",X"37",X"1F",X"24",X"47",X"68",X"7D",X"88",X"8B", + X"88",X"88",X"88",X"8B",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"C9",X"AB",X"80",X"5A", + X"4A",X"47",X"37",X"2C",X"32",X"4D",X"70",X"78",X"7D",X"8B",X"90",X"88",X"68",X"4A",X"2C",X"1C", + X"11",X"09",X"01",X"01",X"01",X"01",X"14",X"27",X"47",X"70",X"AE",X"E1",X"F4",X"E4",X"D1",X"AE", + X"93",X"80",X"70",X"68",X"62",X"62",X"65",X"68",X"6D",X"75",X"78",X"78",X"65",X"4A",X"4D",X"5A", + X"62",X"65",X"68",X"88",X"B9",X"EC",X"FC",X"F4",X"D1",X"B6",X"B3",X"AE",X"A3",X"98",X"A3",X"C6", + X"D9",X"D4",X"D4",X"E1",X"E1",X"C9",X"9E",X"78",X"62",X"3F",X"32",X"2C",X"27",X"2C",X"32",X"37", + X"3F",X"47",X"4A",X"52",X"55",X"5A",X"5D",X"5D",X"5A",X"3F",X"27",X"14",X"11",X"14",X"24",X"4A", + X"80",X"A6",X"BE",X"C6",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC",X"BE",X"AB",X"8B", + X"5D",X"2F",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"70",X"6D",X"5D",X"4D", + X"4D",X"68",X"9B",X"BE",X"C9",X"B9",X"B3",X"AB",X"9B",X"A3",X"B3",X"C6",X"D1",X"B6",X"8B",X"52", + X"1C",X"11",X"11",X"14",X"37",X"62",X"90",X"9E",X"9B",X"83",X"75",X"5D",X"47",X"32",X"2F",X"24", + X"17",X"11",X"11",X"17",X"27",X"5D",X"A3",X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"EF",X"CE", + X"9B",X"7D",X"68",X"62",X"62",X"7D",X"98",X"9E",X"93",X"7D",X"6D",X"5D",X"55",X"52",X"52",X"52", + X"55",X"55",X"5D",X"62",X"65",X"68",X"6D",X"70",X"75",X"7D",X"78",X"7D",X"80",X"83",X"78",X"62", + X"3A",X"27",X"14",X"17",X"27",X"3F",X"5A",X"78",X"98",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70",X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32", + X"04",X"01",X"01",X"01",X"01",X"01",X"11",X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78", + X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24",X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93", + X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90",X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E", + X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E",X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B", + X"88",X"75",X"52",X"37",X"1F",X"1C",X"27",X"37",X"4D",X"68",X"83",X"AE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D1",X"9B",X"65",X"42",X"3A",X"52",X"80",X"AE",X"D4",X"E9",X"E4",X"C6", + X"80",X"3A",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"32",X"88",X"C6",X"F7",X"FC", + X"E4",X"CE",X"B9",X"A3",X"80",X"62",X"47",X"37",X"2F",X"2C",X"2F",X"37",X"3F",X"3A",X"32",X"3A", + X"37",X"32",X"37",X"3A",X"52",X"7D",X"B3",X"DC",X"E4",X"E1",X"D1",X"D1",X"E1",X"FC",X"FC",X"FC", + X"FC",X"F4",X"CE",X"A3",X"83",X"75",X"7D",X"83",X"83",X"88",X"98",X"A6",X"A6",X"98",X"88",X"75", + X"68",X"5D",X"5A",X"5A",X"5A",X"62",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"7D",X"83",X"83", + X"80",X"75",X"68",X"70",X"80",X"8B",X"93",X"98",X"98",X"90",X"90",X"8B",X"90",X"98",X"A3",X"AE", + X"B6",X"C9",X"C9",X"C1",X"B3",X"A3",X"98",X"8B",X"78",X"75",X"70",X"6D",X"65",X"68",X"70",X"80", + X"83",X"83",X"88",X"8B",X"83",X"78",X"68",X"5D",X"52",X"42",X"2C",X"27",X"2C",X"3A",X"47",X"42", + X"42",X"52",X"70",X"8B",X"A6",X"AB",X"A3",X"9E",X"9E",X"B3",X"B9",X"B9",X"BE",X"BE",X"B9",X"A3", + X"88",X"68",X"5D",X"5A",X"5A",X"52",X"52",X"68",X"70",X"65",X"62",X"62",X"68",X"7D",X"8B",X"8B", + X"83",X"75",X"65",X"68",X"75",X"80",X"9B",X"C1",X"EC",X"FC",X"FC",X"F7",X"EF",X"E9",X"D1",X"A3", + X"78",X"5D",X"42",X"2C",X"14",X"0C",X"09",X"0C",X"0C",X"17",X"2C",X"47",X"62",X"75",X"75",X"68", + X"62",X"52",X"4A",X"4A",X"42",X"3F",X"4A",X"55",X"68",X"90",X"A3",X"B9",X"C6",X"CE",X"E4",X"FC", + X"FC",X"EC",X"E9",X"E9",X"DC",X"C1",X"B3",X"A6",X"98",X"75",X"52",X"3A",X"2C",X"1C",X"11",X"01", + X"0C",X"1F",X"37",X"52",X"70",X"78",X"78",X"68",X"62",X"62",X"75",X"98",X"B6",X"BE",X"B3",X"AB", + X"A6",X"9B",X"9E",X"AE",X"B9",X"C1",X"AE",X"90",X"5D",X"32",X"2C",X"27",X"2C",X"3F",X"62",X"83", + X"93",X"90",X"88",X"80",X"70",X"5D",X"52",X"47",X"3A",X"2F",X"24",X"1F",X"2C",X"3A",X"68",X"A3", + X"D4",X"F4",X"FC",X"FC",X"F4",X"E9",X"E9",X"DC",X"B9",X"90",X"78",X"68",X"5D",X"62",X"7D",X"93", + X"9B",X"90",X"7D",X"70",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5A",X"5D",X"65",X"68",X"68",X"70", + X"70",X"75",X"78",X"78",X"7D",X"80",X"80",X"78",X"65",X"3F",X"27",X"17",X"1C",X"2C",X"3F",X"5D", + X"78",X"93",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70", + X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32",X"04",X"01",X"01",X"01",X"01",X"01",X"11", + X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78",X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24", + X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93",X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90", + X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E", + X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B",X"88",X"75",X"52",X"37",X"1F",X"1C",X"24", + X"37",X"4D",X"68",X"88",X"AE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"9B",X"65", + X"3F",X"37",X"52",X"80",X"B3",X"D9",X"EC",X"EC",X"C9",X"7D",X"37",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"27",X"88",X"D1",X"FC",X"FC",X"EC",X"D1",X"BE",X"A3",X"7D",X"62",X"3A", + X"2C",X"1F",X"1F",X"24",X"2C",X"32",X"2C",X"27",X"2F",X"27",X"27",X"27",X"2C",X"47",X"7D",X"C1", + X"F7",X"FC",X"FC",X"E9",X"E1",X"EC",X"FC",X"FC",X"FC",X"FC",X"FC",X"E4",X"AE",X"88",X"78",X"83", + X"8B",X"8B",X"93",X"A3",X"B9",X"BE",X"A6",X"90",X"75",X"65",X"52",X"52",X"52",X"4D",X"55",X"5D", + X"62",X"68",X"70",X"70",X"70",X"75",X"80",X"8B",X"90",X"90",X"8B",X"83",X"90",X"98",X"9B",X"9E", + X"9E",X"9B",X"93",X"93",X"8B",X"90",X"8B",X"8B",X"8B",X"88",X"8B",X"8B",X"8B",X"8B",X"88",X"8B", + X"8B",X"8B",X"8B",X"8B",X"8B",X"88",X"8B",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"80",X"80", + X"80",X"7D",X"65",X"47",X"52",X"68",X"78",X"78",X"65",X"5A",X"5D",X"6D",X"75",X"78",X"70",X"68", + X"70",X"90",X"C9",X"EC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A6",X"68",X"42",X"3A",X"37",X"3A",X"5D", + X"7D",X"83",X"68",X"55",X"52",X"47",X"32",X"17",X"09",X"01",X"01",X"09",X"17",X"2C",X"52",X"9B", + X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"DC",X"A6",X"78",X"62",X"47",X"1F",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"3F",X"7D",X"A3",X"9B",X"80",X"5D",X"4A",X"5A",X"7D",X"90",X"9B",X"AB", + X"A6",X"AB",X"AB",X"9E",X"A6",X"BE",X"D4",X"E4",X"D4",X"A6",X"88",X"7D",X"88",X"88",X"83",X"90", + X"A3",X"AB",X"A6",X"9E",X"98",X"8B",X"83",X"80",X"80",X"80",X"83",X"83",X"88",X"8B",X"8B",X"90", + X"90",X"90",X"93",X"98",X"98",X"9B",X"93",X"98",X"93",X"93",X"93",X"93",X"93",X"93",X"90",X"90", + X"90",X"8B",X"8B",X"83",X"80",X"7D",X"68",X"52",X"52",X"62",X"68",X"88",X"AB",X"C6",X"C9",X"C9", + X"B6",X"A6",X"9E",X"8B",X"83",X"8B",X"A3",X"B3",X"AE",X"98",X"80",X"6D",X"5D",X"52",X"47",X"42", + X"47",X"3F",X"47",X"42",X"42",X"4D",X"62",X"65",X"68",X"68",X"68",X"68",X"68",X"68",X"68",X"68", + X"65",X"68",X"68",X"68",X"6D",X"70",X"6D",X"6D",X"70",X"75",X"70",X"75",X"78",X"75",X"78",X"75", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"7D",X"80",X"80",X"6D",X"65",X"70",X"80",X"80",X"68", + X"52",X"32",X"2C",X"37",X"68",X"9B",X"B6",X"B6",X"B6",X"C1",X"D4",X"D9",X"C6",X"A3",X"78",X"5A", + X"3F",X"32",X"32",X"3A",X"55",X"8B",X"CE",X"FC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A3",X"62",X"2F", + X"1C",X"09",X"01",X"01",X"1C",X"47",X"5D",X"68",X"80",X"93",X"90",X"80",X"70",X"5A",X"4D",X"52", + X"68",X"78",X"7D",X"70",X"5D",X"4A",X"3A",X"32",X"32",X"2F",X"27",X"27",X"1C",X"11",X"09",X"0C", + X"14",X"2C",X"42",X"75",X"AB",X"DC",X"F7",X"FC",X"FC",X"F7",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"BE",X"88",X"4D",X"11",X"01",X"01",X"0C",X"3F",X"75",X"9E",X"B6",X"B3", + X"93",X"70",X"52",X"3A",X"1F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"3F", + X"52",X"62",X"68",X"7D",X"9E",X"C1",X"E4",X"FC",X"FC",X"F7",X"E1",X"BE",X"A3",X"90",X"80",X"88", + X"AB",X"E1",X"FC",X"FC",X"FC",X"FC",X"F7",X"BE",X"7D",X"3F",X"0C",X"01",X"01",X"01",X"01",X"27", + X"70",X"B6",X"E9",X"FC",X"FC",X"E9",X"AE",X"83",X"62",X"4D",X"2F",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"3F",X"98",X"CE",X"D1",X"BE",X"B6",X"C1",X"D4",X"E9",X"FC",X"E9",X"C9",X"AB", + X"9B",X"88",X"5D",X"37",X"27",X"27",X"1F",X"1C",X"1C",X"1F",X"37",X"70",X"B6",X"FC",X"FC",X"FC", + X"FC",X"FC",X"F4",X"F4",X"E4",X"C6",X"98",X"70",X"5A",X"3A",X"37",X"47",X"6D",X"AE",X"F7",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"93",X"55",X"17",X"01",X"01",X"01",X"1C",X"4A",X"80",X"AB", + X"B3",X"A6",X"A3",X"A3",X"A3",X"A6",X"9B",X"78",X"42",X"11",X"04",X"11",X"1C",X"1F",X"37",X"55", + X"7D",X"8B",X"80",X"5D",X"47",X"4D",X"65",X"6D",X"5D",X"4A",X"3F",X"4D",X"7D",X"B6",X"EC",X"FC", + X"FC",X"FC",X"E4",X"C6",X"9E",X"98",X"9B",X"90",X"75",X"5D",X"62",X"7D",X"9B",X"C6",X"E1",X"E9", + X"D9",X"B3",X"93",X"83",X"70",X"68",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5D",X"65",X"65",X"68", + X"5A",X"37",X"2F",X"4A",X"65",X"6D",X"68",X"75",X"93",X"BE",X"E4",X"EC",X"D1",X"B3",X"9E",X"AB", + X"AB",X"9E",X"80",X"65",X"42",X"32",X"32",X"4A",X"75",X"90",X"A3",X"BE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"D1",X"93",X"5A",X"3A",X"3A",X"47",X"5A",X"7D",X"A6",X"CE",X"CE",X"B9",X"A6",X"9B",X"80", + X"52",X"1C",X"01",X"01",X"01",X"11",X"47",X"78",X"9E",X"AB",X"9B",X"78",X"5A",X"2C",X"14",X"1C", + X"27",X"1F",X"11",X"01",X"01",X"01",X"1C",X"3F",X"75",X"AB",X"C9",X"D4",X"DC",X"CE",X"C9",X"D1", + X"E1",X"F4",X"FC",X"FC",X"FC",X"E4",X"BE",X"90",X"70",X"4A",X"11",X"01",X"01",X"01",X"01",X"09", + X"17",X"4A",X"90",X"D4",X"FC",X"FC",X"FC",X"F4",X"E9",X"E9",X"FC",X"FC",X"E4",X"B3",X"80",X"52", + X"2F",X"1C",X"1F",X"32",X"68",X"AE",X"F4",X"FC",X"FC",X"FC",X"E4",X"C9",X"AB",X"80",X"5D",X"47", + X"37",X"42",X"75",X"AB",X"DC",X"FC",X"FC",X"FC",X"D9",X"93",X"55",X"37",X"2F",X"3A",X"52",X"62", + X"68",X"68",X"55",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1C",X"32",X"4D",X"68", + X"9B",X"CE",X"E4",X"F4",X"EC",X"E4",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9", + X"88",X"4A",X"17",X"04",X"11",X"42",X"75",X"88",X"9B",X"B6",X"BE",X"A6",X"7D",X"4D",X"1C",X"01", + X"01",X"17",X"27",X"32",X"4D",X"7D",X"A6",X"B3",X"B9",X"C6",X"D1",X"D9",X"D9",X"CE",X"BE",X"A6", + X"90",X"65",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"14",X"68",X"93",X"98",X"83",X"75",X"7D", + X"9E",X"BE",X"C9",X"BE",X"A6",X"9E",X"B6",X"D9",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9",X"C1", + X"B3",X"9B",X"75",X"5D",X"47",X"2F",X"2F",X"4A",X"68",X"7D",X"7D",X"78",X"83",X"90",X"9E",X"AE", + X"A3",X"83",X"75",X"52",X"3F",X"4A",X"5D",X"62",X"55",X"3F",X"2F",X"24",X"32",X"5A",X"7D",X"90", + X"AB",X"CE",X"E4",X"FC",X"FC",X"FC",X"E9",X"CE",X"B3",X"98",X"88",X"83",X"83",X"90",X"B3",X"EC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"75",X"42",X"27",X"14",X"01",X"01",X"1C",X"3F",X"52",X"5A", + X"68",X"78",X"68",X"47",X"17",X"01",X"01",X"09",X"27",X"37",X"4A",X"65",X"75",X"6D",X"65",X"68", + X"68",X"5D",X"4D",X"42",X"27",X"0C",X"0C",X"14",X"1C",X"1F",X"3A",X"68",X"9E",X"CE",X"E1",X"DC", + X"DC",X"DC",X"DC",X"CE",X"A6",X"75",X"5A",X"4A",X"3A",X"4A",X"70",X"98",X"BE",X"E1",X"E9",X"E4", + X"B9",X"9E",X"90",X"8B",X"88",X"75",X"52",X"2F",X"2F",X"4A",X"5D",X"68",X"78",X"80",X"70",X"70", + X"7D",X"8B",X"9E",X"B6",X"BE",X"B6",X"AE",X"9B",X"98",X"AE",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"B9",X"9E",X"88",X"65",X"4D",X"47",X"3F",X"2F",X"11",X"01",X"04", + X"1F",X"2F",X"2F",X"1F",X"11",X"01",X"0C",X"2C",X"4D",X"62",X"78",X"98",X"AB",X"BE",X"DC",X"F4", + X"F7",X"E4",X"E1",X"DC",X"C1",X"9E",X"88",X"62",X"3A",X"14",X"01",X"11",X"17",X"27",X"32",X"55", + X"88",X"B6",X"E4",X"F7",X"E4",X"C6",X"A3",X"75",X"5A",X"52",X"5A",X"68",X"78",X"80",X"80",X"5A", + X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"3F",X"70",X"A3",X"C9",X"E1",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"C6",X"B3",X"98",X"93",X"9B",X"AB",X"B9",X"AB",X"98",X"83",X"68",X"52", + X"4A",X"2F",X"17",X"04",X"01",X"0C",X"37",X"75",X"A3",X"B9",X"D1",X"CE",X"B3",X"A3",X"9B",X"93", + X"93",X"A6",X"BE",X"B9",X"9E",X"7D",X"55",X"37",X"27",X"27",X"4A",X"80",X"A6",X"B3",X"AE",X"AB", + X"B9",X"C6",X"B9",X"B3",X"A3",X"80",X"5D",X"4A",X"47",X"3A",X"32",X"3A",X"5A",X"7D",X"83",X"90", + X"8B",X"83",X"7D",X"70",X"65",X"6D",X"7D",X"78",X"65",X"47",X"1F",X"0C",X"01",X"01",X"09",X"2C", + X"68",X"AE",X"CE",X"D1",X"CE",X"D4",X"E4",X"E4",X"CE",X"A6",X"98",X"9B",X"AB",X"BE",X"CE",X"CE", + X"B9",X"90",X"52",X"14",X"01",X"01",X"01",X"01",X"09",X"3A",X"78",X"9E",X"AE",X"B9",X"CE",X"CE", + X"B9",X"A6",X"90",X"7D",X"7D",X"83",X"80",X"68",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75", + X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6",X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4", + X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A",X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC", + X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52",X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B", + X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9",X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01", + X"01",X"01",X"01",X"01",X"01",X"24",X"47",X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4", + X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3",X"9B",X"98",X"98",X"90",X"83",X"88",X"A6",X"C9",X"DC", + X"D9",X"BE",X"AB",X"7D",X"52",X"2F",X"27",X"1F",X"11",X"17",X"27",X"2F",X"2F",X"3F",X"52",X"5D", + X"5A",X"65",X"70",X"75",X"80",X"88",X"8B",X"9B",X"AB",X"BE",X"C6",X"AE",X"83",X"55",X"27",X"09", + X"09",X"27",X"52",X"83",X"93",X"98",X"93",X"88",X"83",X"80",X"70",X"55",X"3F",X"2C",X"27",X"32", + X"47",X"65",X"8B",X"AE",X"D4",X"E9",X"D9",X"B3",X"98",X"90",X"93",X"88",X"68",X"4D",X"4A",X"5A", + X"68",X"6D",X"7D",X"8B",X"90",X"8B",X"88",X"8B",X"98",X"9E",X"9B",X"83",X"62",X"2F",X"09",X"04", + X"1F",X"47",X"6D",X"98",X"AE",X"B6",X"B3",X"AB",X"9B",X"9B",X"A3",X"B6",X"C6",X"B9",X"9B",X"83", + X"78",X"6D",X"65",X"5A",X"5A",X"68",X"88",X"A6",X"B6",X"A3",X"8B",X"75",X"68",X"6D",X"6D",X"65", + X"5D",X"5D",X"68",X"80",X"A3",X"CE",X"DC",X"D4",X"CE",X"CE",X"C9",X"C6",X"CE",X"BE",X"AB",X"90", + X"80",X"80",X"8B",X"98",X"9E",X"B6",X"DC",X"E4",X"E4",X"E1",X"CE",X"C6",X"B6",X"98",X"80",X"7D", + X"75",X"70",X"68",X"68",X"62",X"3F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"11",X"47",X"68",X"90",X"B6",X"CE",X"D4",X"E1",X"E9",X"E9",X"E4",X"E4",X"E9",X"E4",X"D4",X"C6", + X"A6",X"78",X"42",X"14",X"01",X"01",X"01",X"01",X"14",X"42",X"78",X"AB",X"D1",X"E1",X"D9",X"C6", + X"9B",X"7D",X"75",X"78",X"88",X"93",X"8B",X"88",X"70",X"4D",X"2F",X"24",X"1C",X"24",X"27",X"24", + X"27",X"3A",X"62",X"88",X"B3",X"CE",X"DC",X"EC",X"EF",X"E1",X"CE",X"BE",X"A3",X"83",X"68",X"52", + X"4D",X"55",X"65",X"78",X"78",X"80",X"90",X"90",X"90",X"8B",X"75",X"5D",X"4D",X"52",X"62",X"80", + X"A3",X"B6",X"B6",X"B6",X"A6",X"90",X"83",X"88",X"93",X"9E",X"BE",X"D1",X"C9",X"AE",X"8B",X"62", + X"3F",X"27",X"1C",X"32",X"62",X"88",X"9B",X"A3",X"AB",X"C1",X"CE",X"C1",X"B6",X"A6",X"90",X"6D", + X"5D",X"55",X"3F",X"2F",X"2F",X"47",X"5D",X"65",X"6D",X"75",X"78",X"83",X"7D",X"75",X"7D",X"83", + X"80",X"68",X"4D",X"2F",X"14",X"04",X"04",X"17",X"37",X"70",X"A6",X"C1",X"C1",X"B9",X"BE",X"D1", + X"D4",X"C1",X"A3",X"98",X"9E",X"AE",X"C9",X"D4",X"D4",X"C6",X"98",X"5D",X"24",X"01",X"01",X"01", + X"01",X"17",X"4A",X"7D",X"A3",X"AE",X"B9",X"C9",X"C6",X"B6",X"A3",X"8B",X"7D",X"80",X"83",X"83", + X"6D",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75",X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6", + X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4",X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A", + X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC",X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52", + X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B",X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9", + X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"47", + X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4",X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3", + X"9B",X"98",X"98",X"8B",X"83",X"8B",X"A6",X"C9",X"E1",X"DC",X"C1",X"A6",X"7D",X"4D",X"2C",X"24", + X"17",X"0C",X"11",X"1F",X"2C",X"2C",X"3A",X"52",X"5D",X"5A",X"65",X"70",X"78",X"88",X"90",X"90", + X"9E",X"AB",X"C1",X"C6",X"A6",X"78",X"3F",X"11",X"01",X"01",X"14",X"47",X"80",X"93",X"98",X"93", + X"83",X"70",X"65",X"4D",X"2F",X"14",X"04",X"04",X"27",X"47",X"70",X"A3",X"D1",X"FC",X"FC",X"F7", + X"C9",X"A6",X"9B",X"9B",X"8B",X"70",X"5A",X"5D",X"75",X"7D",X"80",X"8B",X"9E",X"9B",X"93",X"8B", + X"98",X"A3",X"AE",X"AE",X"93",X"68",X"32",X"04",X"04",X"24",X"52",X"88",X"B6",X"C9",X"B9",X"AB", + X"98",X"80",X"80",X"90",X"A6",X"B9",X"BE",X"A6",X"93",X"8B",X"80",X"70",X"4D",X"37",X"3F",X"62", + X"88",X"9E",X"98",X"80",X"65",X"55",X"62",X"68",X"68",X"70",X"75",X"78",X"93",X"C6",X"FC",X"FC", + X"FC",X"FC",X"F7",X"E9",X"DC",X"D4",X"BE",X"A3",X"80",X"68",X"70",X"75",X"75",X"70",X"80",X"A3", + X"B3",X"B3",X"AE",X"98",X"83",X"75",X"5D",X"52",X"5A",X"68",X"78",X"83",X"83",X"78",X"4A",X"11", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"78",X"A6",X"D1",X"E9",X"E4", + X"E1",X"E1",X"DC",X"D9",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"B9",X"75",X"2F",X"01",X"01",X"01", + X"01",X"01",X"01",X"27",X"5D",X"9B",X"D4",X"F4",X"EC",X"CE",X"A6",X"93",X"9E",X"B6",X"B6",X"A3", + X"93",X"8B",X"83",X"70",X"68",X"78",X"93",X"A6",X"9E",X"90",X"83",X"98",X"AE",X"C9",X"D4",X"DC", + X"CE",X"A6",X"7D",X"65",X"52",X"2C",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"4D",X"9E", + X"E4",X"FC",X"FC",X"FC",X"EC",X"EC",X"FC",X"FC",X"FC",X"FC",X"E9",X"AE",X"78",X"4A",X"2F",X"2F", + X"52",X"8B",X"C6",X"F4",X"FC",X"F7",X"DC",X"B3",X"80",X"4D",X"17",X"01",X"01",X"01",X"1C",X"3F", + X"70",X"A6",X"D1",X"E9",X"E1",X"CE",X"B9",X"B3",X"AE",X"A6",X"88",X"5A",X"1F",X"01",X"01",X"01", + X"01",X"01",X"14",X"52",X"8B",X"B9",X"C6",X"B6",X"A6",X"9E",X"90",X"75",X"68",X"52",X"4A",X"52", + X"68",X"88",X"93",X"83",X"62",X"3F",X"1F",X"17",X"2F",X"4D",X"68",X"75",X"83",X"9E",X"D1",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D4",X"BE",X"B3",X"A3",X"A6",X"BE",X"D4",X"E1",X"CE",X"B3",X"A6",X"98", + X"75",X"4A",X"27",X"1C",X"2F",X"4D",X"68",X"7D",X"68",X"47",X"17",X"01",X"01",X"01",X"01",X"01", + X"04",X"0C",X"1F",X"32",X"4A",X"5D",X"80",X"B3",X"F7",X"FC",X"FC",X"FC",X"EC",X"D4",X"CE",X"BE", + X"C1",X"CE",X"D9",X"C9",X"A3",X"83",X"70",X"5A",X"3F",X"32",X"3F",X"5D",X"68",X"65",X"47",X"2C", + X"17",X"04",X"09",X"27",X"4A",X"68",X"90",X"9E",X"98",X"88",X"7D",X"83",X"9E",X"CE",X"E9",X"F7", + X"E4",X"BE",X"9E",X"68",X"37",X"09",X"01",X"01",X"01",X"04",X"14",X"37",X"55",X"65",X"70",X"88", + X"AE",X"DC",X"FC",X"F4",X"D1",X"AE",X"93",X"80",X"78",X"83",X"9B",X"B3",X"B3",X"98",X"70",X"47", + X"24",X"17",X"32",X"62",X"9B",X"C9",X"CE",X"B9",X"A3",X"9B",X"88",X"70",X"5D",X"55",X"68",X"93", + X"B6",X"BE",X"B3",X"AE",X"AE",X"A3",X"90",X"90",X"98",X"9B",X"AB",X"AB",X"AE",X"B3",X"AB",X"93", + X"78",X"65",X"68",X"78",X"75",X"70",X"68",X"78",X"8B",X"93",X"93",X"9E",X"B9",X"DC",X"FC",X"FC", + X"FC",X"D4",X"93",X"62",X"42",X"1C",X"01",X"01",X"04",X"0C",X"0C",X"1F",X"4A",X"78",X"AB",X"C9", + X"DC",X"E1",X"D9",X"C6",X"AB",X"90",X"70",X"47",X"09",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"1C",X"47",X"62",X"75",X"88",X"AB",X"D1",X"E9",X"EC",X"E9",X"E4",X"DC",X"F7",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"9E",X"80",X"75",X"7D",X"70",X"6D",X"75",X"80",X"8B",X"80",X"65", + X"4A",X"2C",X"04",X"01",X"01",X"01",X"04",X"2C",X"52",X"62",X"5A",X"4D",X"5A",X"78",X"9B",X"B3", + X"C1",X"AB",X"93",X"83",X"78",X"62",X"4D",X"4A",X"52",X"4A",X"3F",X"4D",X"5D",X"7D",X"90",X"9B", + X"9E",X"83",X"68",X"62",X"5D",X"68",X"78",X"88",X"88",X"8B",X"8B",X"80",X"62",X"47",X"3F",X"3A", + X"32",X"37",X"37",X"37",X"4D",X"70",X"88",X"8B",X"80",X"70",X"70",X"8B",X"B6",X"D4",X"D4",X"CE", + X"B9",X"B9",X"C9",X"C9",X"C6",X"B6",X"B9",X"D4",X"FC",X"FC",X"FC",X"FC",X"EC",X"B6",X"80",X"52", + X"37",X"2F",X"2C",X"37",X"62",X"98",X"D1",X"FC",X"FC",X"EC",X"D1",X"A3",X"68",X"4A",X"32",X"27", + X"27",X"3A",X"55",X"68",X"62",X"52",X"3F",X"1C",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"37", + X"5A",X"70",X"88",X"88",X"7D",X"65",X"52",X"47",X"52",X"68",X"83",X"9E",X"AE",X"B6",X"C1",X"B9", + X"B6",X"AE",X"98",X"78",X"5D",X"42",X"32",X"2C",X"2F",X"4D",X"7D",X"B9",X"F7",X"FC",X"FC",X"FC", + X"E1",X"AB",X"83",X"65",X"52",X"5A",X"68",X"65",X"52",X"3F",X"3F",X"3F",X"37",X"37",X"52",X"7D", + X"A6",X"C1",X"BE",X"9E",X"88",X"7D",X"68",X"5A",X"47",X"47",X"62",X"90",X"B3",X"C6",X"D9",X"EF", + X"FC",X"FC",X"E4",X"CE",X"B9",X"B3",X"B3",X"AE",X"AB",X"9B",X"75",X"55",X"37",X"11",X"01",X"01", + X"01",X"01",X"04",X"4D",X"88",X"AB",X"B3",X"AE",X"A3",X"9B",X"AE",X"C6",X"CE",X"C9",X"BE",X"B6", + X"B3",X"AB",X"AE",X"C6",X"EF",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"88",X"4A",X"14",X"01", + X"09",X"2C",X"52",X"78",X"93",X"93",X"78",X"47",X"0C",X"01",X"01",X"01",X"01",X"09",X"09",X"11", + X"27",X"4D",X"62",X"68",X"7D",X"90",X"9E",X"AE",X"AB",X"8B",X"70",X"62",X"52",X"3A",X"1C",X"04", + X"11",X"2F",X"5A",X"83",X"9E",X"B3",X"B9",X"B9",X"AB",X"80",X"62",X"4D",X"4D",X"5A",X"65",X"75", + X"7D",X"83",X"83",X"70",X"4D",X"1F",X"0C",X"14",X"32",X"5D",X"70",X"68",X"65",X"68",X"83",X"9E", + X"9E",X"93",X"88",X"83",X"9B",X"BE",X"D9",X"E1",X"D1",X"B6",X"A3",X"93",X"88",X"88",X"8B",X"98", + X"A3",X"C6",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"D4",X"B3",X"88",X"65",X"4A",X"32",X"3A",X"5D", + X"88",X"B3",X"D4",X"E4",X"E1",X"B9",X"78",X"37",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"14",X"37",X"42",X"4A",X"5A",X"68",X"78",X"90",X"AE",X"C9",X"E1",X"E1", + X"C9",X"93",X"65",X"4D",X"32",X"1F",X"17",X"27",X"37",X"3F",X"42",X"4D",X"68",X"88",X"98",X"A3", + X"B6",X"C9",X"D4",X"E4",X"E4",X"D4",X"BE",X"A6",X"AE",X"C6",X"E4",X"FC",X"FC",X"FC",X"E4",X"AB", + X"6D",X"3F",X"27",X"2F",X"52",X"83",X"AB",X"AB",X"AE",X"AE",X"AE",X"98",X"70",X"5A",X"5A",X"65", + X"7D",X"88",X"80",X"5D",X"3A",X"24",X"11",X"11",X"2F",X"52",X"75",X"83",X"93",X"A3",X"C9",X"EF", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"98",X"5A",X"1F",X"01",X"01",X"01",X"11",X"2F", + X"5D",X"90",X"BE",X"E4",X"FC",X"FC",X"D9",X"A3",X"78",X"65",X"68",X"75",X"70",X"65",X"5A",X"4A", + X"2C",X"14",X"04",X"11",X"37",X"68",X"9B",X"A6",X"9B",X"88",X"83",X"90",X"93",X"90",X"8B",X"83", + X"7D",X"83",X"93",X"A6",X"B6",X"BE",X"B9",X"9E",X"68",X"42",X"2C",X"2F",X"47",X"5D",X"78",X"88", + X"90",X"93",X"90",X"70",X"52",X"37",X"17",X"11",X"17",X"2C",X"37",X"3F",X"4D",X"4A",X"3F",X"32", + X"2F",X"37",X"5A",X"7D",X"9B",X"9E",X"A6",X"AE",X"B6",X"D4",X"FC",X"FC",X"FC",X"FC",X"FC",X"EC", + X"E1",X"B9",X"93",X"6D",X"5A",X"5A",X"5D",X"68",X"75",X"78",X"83",X"83",X"83",X"83",X"70",X"5D", + X"4A",X"4D",X"62",X"7D",X"90",X"98",X"88",X"62",X"2F",X"01",X"01",X"01",X"01",X"1C",X"37",X"52", + X"65",X"68",X"5A",X"52",X"5D",X"75",X"7D",X"75",X"5D",X"4A",X"4D",X"65",X"88",X"AB",X"C6",X"D9", + X"D4",X"B6",X"93",X"83",X"70",X"5A",X"47",X"47",X"4A",X"3F",X"3A",X"3F",X"32",X"27",X"17",X"1F", + X"3F",X"68",X"93",X"9E",X"9B",X"93",X"98",X"A6",X"AB",X"AB",X"A3",X"A6",X"BE",X"E1",X"F7",X"FC", + X"FC",X"EC",X"D1",X"AE",X"93",X"8B",X"9B",X"B3",X"B6",X"B6",X"C6",X"C6",X"B6",X"A6",X"9E",X"93", + X"7D",X"5D",X"37",X"1C",X"1F",X"27",X"2C",X"37",X"52",X"75",X"93",X"98",X"8B",X"7D",X"65",X"5D", + X"65",X"75",X"88",X"9B",X"9E",X"9B",X"8B",X"80",X"83",X"8B",X"8B",X"83",X"93",X"AB",X"C9",X"DC", + X"CE",X"B9",X"A6",X"83",X"5D",X"32",X"17",X"01",X"01",X"04",X"1C",X"4A",X"80",X"B6",X"DC",X"E1", + X"D4",X"BE",X"A6",X"98",X"90",X"88",X"6D",X"4D",X"2C",X"11",X"04",X"04",X"1C",X"4D",X"83",X"B6", + X"DC",X"E4",X"D1",X"C1",X"B3",X"9B",X"80",X"68",X"68",X"68",X"75",X"7D",X"7D",X"70",X"52",X"2C", + X"04",X"01",X"01",X"01",X"11",X"2F",X"47",X"5D",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC", + X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E",X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E", + X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52",X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01", + X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3",X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB", + X"93",X"78",X"65",X"62",X"68",X"70",X"80",X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70", + X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3",X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88", + X"7D",X"62",X"47",X"2F",X"11",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"78",X"93",X"9B", + X"9E",X"93",X"98",X"9B",X"98",X"A3",X"A6",X"AB",X"B3",X"C1",X"D1",X"CE",X"BE",X"AE",X"98",X"7D", + X"75",X"65",X"52",X"4A",X"3F",X"3A",X"3F",X"52",X"68",X"80",X"93",X"AB",X"B6",X"C9",X"E1",X"E4", + X"D4",X"CE",X"CE",X"C9",X"BE",X"9E",X"7D",X"5A",X"37",X"27",X"1C",X"1F",X"37",X"5A",X"75",X"80", + X"8B",X"93",X"90",X"8B",X"88",X"88",X"80",X"80",X"83",X"80",X"88",X"A3",X"C6",X"E1",X"FC",X"FC", + X"F4",X"CE",X"A3",X"80",X"65",X"4A",X"37",X"37",X"3F",X"47",X"52",X"62",X"70",X"7D",X"70",X"62", + X"52",X"55",X"68",X"78",X"80",X"75",X"65",X"65",X"5D",X"55",X"5A",X"5A",X"65",X"80",X"98",X"A3", + X"9B",X"8B",X"7D",X"80",X"88",X"90",X"98",X"9B",X"93",X"93",X"9E",X"AE",X"B9",X"B6",X"AE",X"AE", + X"A6",X"93",X"78",X"65",X"52",X"4D",X"4A",X"52",X"68",X"78",X"88",X"93",X"90",X"83",X"80",X"6D", + X"5D",X"5D",X"62",X"68",X"6D",X"6D",X"5D",X"4A",X"37",X"2F",X"32",X"52",X"75",X"93",X"A6",X"AE", + X"AB",X"AE",X"B6",X"C6",X"BE",X"C1",X"B9",X"A6",X"98",X"8B",X"70",X"52",X"3A",X"2C",X"37",X"42", + X"5A",X"68",X"70",X"78",X"7D",X"88",X"93",X"98",X"90",X"7D",X"7D",X"88",X"90",X"98",X"93",X"7D", + X"52",X"2C",X"09",X"01",X"01",X"09",X"32",X"52",X"70",X"88",X"9B",X"93",X"90",X"93",X"98",X"90", + X"83",X"70",X"65",X"62",X"78",X"93",X"AE",X"BE",X"C6",X"B9",X"9E",X"83",X"70",X"65",X"5D",X"5A", + X"5A",X"5D",X"5A",X"55",X"55",X"47",X"37",X"27",X"1F",X"37",X"5A",X"78",X"88",X"8B",X"8B",X"93", + X"A3",X"A6",X"AB",X"A6",X"AB",X"BE",X"D4",X"E4",X"EC",X"EC",X"E1",X"C9",X"A6",X"90",X"83",X"90", + X"98",X"9B",X"9E",X"AE",X"AB",X"A6",X"9E",X"9B",X"9B",X"90",X"78",X"5A",X"3F",X"37",X"37",X"37", + X"3F",X"52",X"68",X"88",X"83",X"78",X"68",X"5A",X"55",X"65",X"78",X"8B",X"9E",X"A3",X"9B",X"90", + X"83",X"88",X"8B",X"88",X"80",X"8B",X"9E",X"B9",X"C9",X"B9",X"A6",X"93",X"75",X"52",X"32",X"1C", + X"11",X"0C",X"14",X"2C",X"5A",X"8B",X"BE",X"DC",X"E1",X"D9",X"C6",X"AE",X"9E",X"98",X"8B",X"75", + X"55",X"32",X"1C",X"11",X"11",X"24",X"52",X"88",X"B6",X"D9",X"E4",X"CE",X"BE",X"AE",X"98",X"7D", + X"68",X"65",X"68",X"75",X"78",X"7D",X"70",X"52",X"2F",X"09",X"01",X"01",X"01",X"11",X"2F",X"47", + X"5A",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC",X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E", + X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E",X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52", + X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01",X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3", + X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB",X"93",X"78",X"65",X"62",X"68",X"70",X"80", + X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70",X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3", + X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88",X"7D",X"62",X"47",X"2C",X"0C",X"01",X"01", + X"01",X"01",X"01",X"14",X"3A",X"65",X"7D",X"98",X"A3",X"A3",X"98",X"9B",X"9E",X"9E",X"A6",X"AB", + X"AB",X"B6",X"C6",X"D4",X"CE",X"BE",X"AB",X"90",X"78",X"68",X"5A",X"47",X"32",X"27",X"1F",X"24", + X"3A",X"62",X"80",X"9E",X"B9",X"CE",X"D4",X"E9",X"EC",X"E1",X"D1",X"D1",X"CE",X"C6",X"A6",X"80", + X"55",X"2F",X"17",X"04",X"11",X"2F",X"62",X"83",X"9B",X"A6",X"AB",X"9B",X"90",X"8B",X"88",X"78", + X"70",X"65",X"5A",X"65",X"88",X"A6",X"CE",X"EF",X"FC",X"FC",X"E1",X"B6",X"9E",X"88",X"68",X"52", + X"4A",X"47",X"3F",X"37",X"3A",X"47",X"47",X"3A",X"2F",X"2F",X"4A",X"68",X"80",X"83",X"75",X"65", + X"65",X"65",X"68",X"75",X"7D",X"88",X"9E",X"AB",X"AB",X"98",X"80",X"78",X"7D",X"80",X"8B",X"9E", + X"9E",X"9B",X"9E",X"AE",X"BE",X"C1",X"B3",X"A6",X"A3",X"A6",X"AB",X"9B",X"83",X"68",X"52",X"42", + X"3F",X"52",X"68",X"80",X"93",X"A3",X"A6",X"B3",X"A6",X"93",X"88",X"88",X"93",X"90",X"83",X"68", + X"4D",X"37",X"2C",X"2F",X"47",X"68",X"90",X"AB",X"AE",X"A6",X"A6",X"9B",X"88",X"75",X"68",X"62", + X"52",X"42",X"32",X"27",X"11",X"01",X"01",X"11",X"27",X"3F",X"5A",X"65",X"68",X"78",X"8B",X"A6", + X"C1",X"C6",X"B9",X"B3",X"B3",X"AB",X"A3",X"8B",X"68",X"42",X"24",X"11",X"11",X"11",X"27",X"4D", + X"70",X"98",X"B9",X"DC",X"E9",X"E9",X"E1",X"CE",X"AB",X"98",X"90",X"83",X"83",X"93",X"A3",X"B6", + X"AE",X"A3",X"90",X"78",X"5D",X"4A",X"4D",X"62",X"78",X"83",X"80",X"80",X"83",X"7D",X"68",X"52", + X"37",X"1F",X"1F",X"2F",X"47",X"55",X"65",X"7D",X"90",X"93",X"98",X"A3",X"AE",X"B3",X"B9",X"B6", + X"B6",X"C1",X"C6",X"B9",X"A6",X"8B",X"80",X"70",X"65",X"52",X"4A",X"52",X"62",X"65",X"68",X"7D", + X"90",X"AB",X"C6",X"D1",X"CE",X"AE",X"88",X"68",X"65",X"62",X"52",X"52",X"4D",X"3F",X"2F",X"27", + X"27",X"3A",X"62",X"83",X"9E",X"B3",X"A6",X"9E",X"93",X"90",X"8B",X"7D",X"68",X"62",X"65",X"65", + X"65",X"55",X"3F",X"27",X"14",X"11",X"14",X"1C",X"2F",X"4A",X"62",X"78",X"98",X"B6",X"D1",X"E4", + X"E4",X"E1",X"E4",X"F7",X"FC",X"F7",X"E4",X"D1",X"BE",X"AB",X"98",X"83",X"8B",X"98",X"93",X"90", + X"93",X"90",X"83",X"78",X"70",X"6D",X"62",X"4A",X"2C",X"17",X"14",X"1C",X"27",X"3F",X"4D",X"5D", + X"68",X"68",X"68",X"68",X"75",X"8B",X"9E",X"A6",X"9E",X"9B",X"98",X"98",X"93",X"80",X"70",X"62", + X"52",X"4A",X"42",X"3A",X"2F",X"27",X"2C",X"2F",X"3F",X"5D",X"80",X"90",X"9B",X"A3",X"AE",X"C9", + X"E1",X"E4",X"DC",X"CE",X"C9",X"CE",X"C6",X"B3",X"98",X"8B",X"83",X"75",X"68",X"6D",X"7D",X"90", + X"A3",X"B3",X"B9",X"AE",X"98",X"7D",X"70",X"62",X"4A",X"2F",X"17",X"11",X"17",X"24",X"37",X"52", + X"62",X"75",X"80",X"80",X"80",X"88",X"8B",X"8B",X"98",X"9B",X"9E",X"AB",X"B6",X"AE",X"A3",X"90", + X"83",X"80",X"7D",X"83",X"90",X"90",X"88",X"75",X"62",X"52",X"47",X"42",X"4A",X"5D",X"75",X"8B", + X"A3",X"AB",X"AB",X"A3",X"93",X"98",X"9E",X"AE",X"BE",X"BE",X"AB",X"88",X"68",X"52",X"3A",X"37", + X"47",X"62",X"83",X"98",X"A3",X"9B",X"98",X"98",X"88",X"68",X"52",X"4D",X"52",X"62",X"65",X"62", + X"62",X"5D",X"4A",X"37",X"27",X"2C",X"3F",X"5D",X"6D",X"75",X"75",X"80",X"90",X"A3",X"B3",X"BE", + X"C6",X"C1",X"B9",X"AB",X"9E",X"83",X"68",X"52",X"3F",X"27",X"11",X"0C",X"11",X"1C",X"3F",X"68", + X"9B",X"B6",X"BE",X"B6",X"B3",X"B6",X"BE",X"C9",X"C6",X"AE",X"9B",X"8B",X"80",X"7D",X"83",X"93", + X"A3",X"AE",X"A3",X"9E",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"7D",X"68",X"62",X"5D",X"62",X"5D", + X"52",X"4D",X"5A",X"52",X"52",X"52",X"52",X"52",X"5A",X"5A",X"5A",X"62",X"68",X"78",X"88",X"90", + X"98",X"A6",X"B6",X"B9",X"B6",X"B3",X"B6",X"B9",X"B9",X"B6",X"AE",X"AB",X"93",X"78",X"65",X"4D", + X"32",X"24",X"24",X"32",X"52",X"70",X"83",X"88",X"83",X"7D",X"70",X"65",X"68",X"6D",X"6D",X"6D", + X"68",X"65",X"68",X"68",X"65",X"5D",X"55",X"5D",X"70",X"8B",X"90",X"93",X"8B",X"80",X"7D",X"7D", + X"8B",X"9E",X"A6",X"A3",X"9E",X"9E",X"A3",X"A3",X"98",X"88",X"80",X"75",X"68",X"62",X"55",X"4D", + X"4A",X"4D",X"5D",X"75",X"93",X"AE",X"B6",X"AB",X"93",X"78",X"65",X"52",X"5A",X"5D",X"65",X"78", + X"88",X"88",X"80",X"75",X"70",X"68",X"5D",X"5A",X"5D",X"62",X"68",X"70",X"75",X"78",X"7D",X"7D", + X"80",X"78",X"70",X"65",X"5D",X"52",X"5A",X"70",X"8B",X"A3",X"AE",X"AE",X"A6",X"9B",X"90",X"83", + X"75",X"68",X"55",X"4D",X"4A",X"4A",X"4D",X"5A",X"78",X"93",X"B9",X"D4",X"E4",X"E1",X"CE",X"BE", + X"AE",X"9B",X"88",X"78",X"78",X"78",X"78",X"68",X"62",X"55",X"4D",X"3A",X"32",X"3A",X"4D",X"68", + X"7D",X"80",X"7D",X"78",X"75",X"7D",X"88",X"98",X"A3",X"AE",X"AE",X"AB",X"AE",X"B6",X"C6",X"D1", + X"D4",X"D4",X"C6",X"AB",X"98",X"83",X"78",X"65",X"4D",X"3F",X"3F",X"3F",X"4A",X"5A",X"68",X"70", + X"68",X"68",X"70",X"80",X"8B",X"93",X"8B",X"7D",X"70",X"6D",X"68",X"70",X"75",X"75",X"78",X"78", + X"75",X"68",X"65",X"62",X"6D",X"83",X"98",X"AE",X"B6",X"A6",X"98",X"90",X"80",X"75",X"68",X"5D", + X"62",X"68",X"80",X"93",X"9B",X"93",X"90",X"80",X"6D",X"5A",X"4A",X"42",X"47",X"52",X"5D",X"6D", + X"83",X"90",X"90",X"83",X"80",X"80",X"75",X"75",X"70",X"68",X"65",X"5A",X"52",X"4D",X"52",X"65", + X"7D",X"98",X"A6",X"AB",X"AB",X"A6",X"9E",X"9B",X"90",X"80",X"75",X"6D",X"65",X"52",X"52",X"52", + X"52",X"4D",X"42",X"3F",X"47",X"4A",X"55",X"5D",X"62",X"62",X"62",X"62",X"68",X"7D",X"88",X"93", + X"A3",X"9E",X"A3",X"98",X"90",X"90",X"98",X"A3",X"B6",X"C1",X"BE",X"B6",X"B3",X"AB",X"9B",X"88", + X"75",X"70",X"68",X"65",X"70",X"78",X"7D",X"70",X"68",X"68",X"68",X"68",X"65",X"62",X"5D",X"68", + X"7D",X"90",X"9B",X"9B",X"98",X"98",X"98",X"93",X"98",X"9E",X"9B",X"98",X"93",X"93",X"90",X"83", + X"80",X"80",X"78",X"68",X"62",X"62",X"65",X"75",X"83",X"88",X"8B",X"90",X"8B",X"7D",X"70",X"68", + X"65",X"5D",X"55",X"52",X"4D",X"4A",X"4D",X"5A",X"5D",X"65",X"70",X"80",X"8B",X"93",X"9E",X"9E", + X"9B",X"9E",X"A3",X"9B",X"98",X"90",X"88",X"83",X"83",X"88",X"90",X"A6",X"B9",X"BE",X"C1",X"C6", + X"C6",X"C6",X"B6",X"9B",X"83",X"65",X"52",X"4A",X"4D",X"5D",X"6D",X"80",X"8B",X"93",X"8B",X"80", + X"65",X"5A",X"52",X"52",X"52",X"47",X"3F",X"3A",X"47",X"52",X"5D",X"6D",X"83",X"93",X"9B",X"9E", + X"98",X"8B",X"88",X"80",X"80",X"78",X"6D",X"68",X"68",X"70",X"70",X"68",X"68",X"62",X"5A",X"5A", + X"5D",X"5A",X"5D",X"65",X"70",X"75",X"8B",X"98",X"9B",X"9B",X"9B",X"93",X"88",X"88",X"83",X"88", + X"88",X"93",X"9B",X"98",X"8B",X"80",X"78",X"70",X"68",X"68",X"70",X"80",X"88",X"90",X"93",X"9B", + X"9E",X"98",X"98",X"98",X"98",X"90",X"83",X"78",X"78",X"6D",X"6D",X"78",X"88",X"98",X"A3",X"AB", + X"AB",X"A6",X"98",X"83",X"70",X"52",X"47",X"37",X"32",X"27",X"27",X"37",X"47",X"4D",X"65",X"75", + X"88",X"90",X"98",X"90",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"68",X"62",X"5D",X"4D",X"42", + X"3A",X"3A",X"3F",X"47",X"52",X"5A",X"68",X"78",X"83",X"90",X"A3",X"AE",X"B6",X"B9",X"B6",X"AE", + X"B3",X"B6",X"C1",X"C6",X"BE",X"B9",X"B9",X"AE",X"9B",X"88",X"80",X"75",X"68",X"65",X"65",X"70", + X"78",X"83",X"8B",X"90",X"88",X"7D",X"65",X"5A",X"55",X"5A",X"52",X"4D",X"47",X"42",X"3F",X"47", + X"4A",X"52",X"65",X"7D",X"93",X"9B",X"98",X"93",X"90",X"93",X"9B",X"A6",X"AE",X"AE",X"A6",X"98", + X"8B",X"78",X"68",X"5A",X"52",X"52",X"5A",X"65",X"68",X"75",X"75",X"70",X"70",X"7D",X"80",X"83", + X"83",X"80",X"80",X"80",X"8B",X"98",X"A3",X"A3",X"A6",X"A3",X"9B",X"93",X"90",X"8B",X"88",X"80", + X"78",X"70",X"62",X"5A",X"5A",X"52",X"52",X"55",X"5A",X"62",X"68",X"75",X"70",X"6D",X"65",X"65", + X"68",X"6D",X"70",X"70",X"70",X"75",X"75",X"7D",X"83",X"88",X"93",X"9B",X"A3",X"A3",X"A6",X"A6", + X"A3",X"9E",X"93",X"88",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"7D",X"70",X"68",X"62", + X"62",X"68",X"70",X"78",X"7D",X"7D",X"78",X"75",X"68",X"68",X"62",X"62",X"68",X"78",X"78",X"7D", + X"75",X"68",X"6D",X"6D",X"70",X"75",X"7D",X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"80",X"83", + X"88",X"8B",X"88",X"83",X"80",X"80",X"83",X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D", + X"75",X"6D",X"68",X"75",X"80",X"83",X"88",X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"75",X"68",X"5D",X"52",X"4A",X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B", + X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B",X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62", + X"65",X"70",X"78",X"7D",X"80",X"88",X"8B",X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90", + X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"7D",X"78",X"78",X"75",X"70",X"70",X"6D",X"68",X"6D",X"70",X"78",X"80", + X"80",X"80",X"83",X"88",X"90",X"8B",X"8B",X"8B",X"88",X"80",X"7D",X"78",X"70",X"68",X"68",X"68", + X"68",X"6D",X"6D",X"70",X"78",X"7D",X"83",X"8B",X"8B",X"90",X"8B",X"88",X"88",X"88",X"88",X"83", + X"80",X"80",X"83",X"80",X"80",X"7D",X"83",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"78",X"78", + X"75",X"70",X"70",X"70",X"75",X"78",X"78",X"78",X"75",X"75",X"70",X"70",X"75",X"78",X"75",X"75", + X"75",X"75",X"78",X"7D",X"80",X"7D",X"7D",X"7D",X"83",X"88",X"8B",X"88",X"88",X"88",X"88",X"88", + X"8B",X"90",X"90",X"88",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"7D",X"7D",X"80",X"7D",X"78", + X"75",X"70",X"70",X"78",X"80",X"88",X"88",X"88",X"88",X"83",X"7D",X"78",X"78",X"80",X"83",X"83", + X"83",X"80",X"78",X"75",X"75",X"75",X"78",X"80",X"80",X"83",X"83",X"80",X"7D",X"78",X"6D",X"68", + X"65",X"62",X"5D",X"5A",X"62",X"65",X"68",X"75",X"80",X"8B",X"90",X"93",X"90",X"88",X"83",X"80", + X"78",X"75",X"75",X"70",X"68",X"65",X"5D",X"5D",X"55",X"5A",X"5D",X"65",X"68",X"75",X"75",X"80", + X"83",X"8B",X"90",X"9B",X"A3",X"A6",X"A6",X"9E",X"9B",X"98",X"98",X"9E",X"9E",X"A3",X"A3",X"A6", + X"A3",X"9B",X"8B",X"88",X"7D",X"75",X"6D",X"68",X"6D",X"75",X"7D",X"7D",X"83",X"83",X"80",X"75", + X"6D",X"68",X"68",X"68",X"65",X"62",X"5D",X"5A",X"5A",X"5D",X"62",X"68",X"78",X"80",X"83",X"80", + X"7D",X"80",X"83",X"8B",X"98",X"9B",X"9B",X"98",X"90",X"8B",X"7D",X"70",X"68",X"62",X"65",X"68", + X"70",X"78",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"7D",X"7D",X"7D",X"83",X"90",X"98", + X"9B",X"9E",X"9B",X"98",X"90",X"8B",X"83",X"83",X"7D",X"75",X"70",X"65",X"5D",X"5D",X"5A",X"5D", + X"62",X"65",X"68",X"75",X"75",X"75",X"75",X"68",X"6D",X"6D",X"70",X"70",X"75",X"70",X"75",X"75", + X"78",X"7D",X"83",X"90",X"98",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"88",X"83",X"7D",X"7D", + X"7D",X"80",X"83",X"80",X"80",X"7D",X"75",X"68",X"65",X"65",X"68",X"75",X"78",X"7D",X"78",X"78", + X"78",X"6D",X"68",X"65",X"68",X"6D",X"78",X"7D",X"7D",X"75",X"6D",X"6D",X"70",X"75",X"78",X"80", + X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"83",X"83",X"88",X"8B",X"88",X"83",X"80",X"80",X"83", + X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D",X"75",X"6D",X"68",X"75",X"80",X"83",X"88", + X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D",X"80",X"80",X"75",X"68",X"5D",X"52",X"4A", + X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B",X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B", + X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62",X"65",X"70",X"78",X"7D",X"80",X"88",X"8B", + X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90",X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D", + X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"75", + X"75",X"70",X"75",X"6D",X"68",X"6D",X"70",X"78",X"80",X"83",X"80",X"83",X"88",X"90",X"8B",X"8B", + X"88",X"83",X"7D",X"78",X"75",X"6D",X"68",X"68",X"68",X"65",X"68",X"68",X"68",X"70",X"75",X"7D", + X"88",X"83",X"88",X"88",X"80",X"83",X"83",X"88",X"8B",X"88",X"88",X"88",X"83",X"80",X"7D",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"7D",X"75",X"75",X"75",X"75",X"70", + X"70",X"68",X"68",X"68",X"68",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"83",X"83",X"83",X"88", + X"88",X"90",X"98",X"98",X"93",X"90",X"90",X"8B",X"88",X"88",X"8B",X"88",X"80",X"78",X"78",X"75", + X"70",X"68",X"68",X"65",X"68",X"70",X"78",X"78",X"78",X"75",X"75",X"70",X"78",X"80",X"83",X"83", + X"80",X"7D",X"70",X"68",X"65",X"68",X"70",X"7D",X"83",X"83",X"83",X"80",X"75",X"70",X"68",X"65", + X"65",X"65",X"68",X"6D",X"70",X"78",X"7D",X"7D",X"7D",X"83",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"80",X"83",X"8B",X"90",X"93",X"93",X"8B",X"83",X"7D",X"78",X"70",X"6D",X"68",X"65",X"65",X"62", + X"65",X"68",X"70",X"7D",X"88",X"88",X"93",X"90",X"90",X"90",X"90",X"93",X"93",X"93",X"98",X"90", + X"88",X"80",X"78",X"78",X"75",X"78",X"80",X"88",X"90",X"90",X"93",X"8B",X"8B",X"88",X"7D",X"78", + X"6D",X"65",X"65",X"68",X"6D",X"75",X"80",X"83",X"88",X"88",X"88",X"83",X"83",X"83",X"83",X"80", + X"7D",X"80",X"7D",X"75",X"6D",X"68",X"5D",X"55",X"52",X"52",X"62",X"68",X"70",X"75",X"75",X"75", + X"78",X"7D",X"83",X"80",X"83",X"83",X"83",X"83",X"88",X"8B",X"90",X"98",X"98",X"9B",X"9B",X"93", + X"8B",X"83",X"7D",X"78",X"78",X"70",X"75",X"7D",X"80",X"80",X"83",X"80",X"80",X"75",X"70",X"68", + X"68",X"68",X"65",X"68",X"68",X"65",X"68",X"70",X"78",X"7D",X"88",X"88",X"88",X"83",X"83",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75", + X"75",X"7D",X"83",X"83",X"88",X"83",X"88",X"83",X"88",X"83",X"83",X"8B",X"88",X"8B",X"88",X"88", + X"80",X"7D",X"7D",X"75",X"6D",X"68",X"6D",X"70",X"7D",X"80",X"7D",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80", + X"83",X"83",X"80",X"80",X"7D",X"78",X"75",X"70",X"68",X"6D",X"75",X"78",X"7D",X"80",X"80",X"80", + X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"88",X"88",X"8B",X"8B",X"8B", + X"8B",X"88",X"83",X"83",X"80",X"78",X"75",X"75",X"70",X"70",X"75",X"75",X"80",X"83",X"80",X"83", + X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70", + X"75",X"75",X"78",X"7D",X"7D",X"80",X"80",X"83",X"83",X"83",X"83",X"88",X"83",X"83",X"83",X"88", + X"83",X"83",X"88",X"8B",X"88",X"88",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"80",X"80",X"80", + X"83",X"83",X"83",X"7D",X"7D",X"75",X"75",X"75",X"75",X"75",X"70",X"75",X"75",X"75",X"78",X"83", + X"80",X"83",X"80",X"7D",X"80",X"78",X"78",X"80",X"80",X"80",X"7D",X"80",X"80",X"80",X"7D",X"75", + X"70",X"68",X"68",X"68",X"68",X"68",X"70",X"75",X"7D",X"83",X"8B",X"90",X"90",X"8B",X"83",X"80", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70",X"75",X"75", + X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"7D",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"83",X"83", + X"8B",X"8B",X"8B",X"88",X"83",X"83",X"80",X"83",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"7D",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78", + X"78",X"78",X"78",X"78",X"7D",X"80",X"78",X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D", + X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"78",X"7D",X"78",X"7D",X"80",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80", + X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"78",X"80", + X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"75",X"75",X"83",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"88",X"83", + X"80",X"80",X"7D",X"78",X"75",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"75",X"75",X"78", + X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"78",X"78",X"78",X"75",X"75",X"75",X"70",X"75",X"75",X"7D",X"7D",X"80",X"80",X"80", + X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"78",X"78",X"7D", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"78", + X"78",X"78",X"78",X"78",X"78",X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83", + X"83",X"83",X"88",X"83",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"7D",X"78",X"78",X"78",X"75",X"75", + X"75",X"78",X"7D",X"78",X"83",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"78",X"78",X"78",X"78",X"75",X"75",X"75",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80", + X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"78", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"80",X"83",X"83",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"78",X"78",X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D",X"78",X"78",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"83",X"80",X"80",X"83",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"7D",X"80",X"80",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"7D",X"78",X"78",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..401c50ae --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,662 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 10239) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"31",X"00",X"44",X"C3",X"41",X"02",X"00",X"FF",X"FF",X"FF",X"FF",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"24",X"52",X"22",X"75",X"0D",X"01",X"69",X"02",X"21",X"B0",X"0D",X"36",X"00",X"11", + X"B1",X"0D",X"ED",X"B0",X"21",X"00",X"00",X"22",X"69",X"0D",X"22",X"6B",X"0D",X"22",X"61",X"0D", + X"22",X"63",X"0D",X"DD",X"36",X"F5",X"00",X"3A",X"C9",X"33",X"20",X"4C",X"45",X"56",X"45",X"4C", + X"20",X"4D",X"41",X"54",X"52",X"49",X"58",X"20",X"50",X"52",X"4F",X"54",X"45",X"43",X"54",X"49", + X"4F",X"4E",X"52",X"30",X"51",X"1A",X"FE",X"2F",X"20",X"F2",X"3E",X"0D",X"12",X"13",X"3E",X"01", + X"32",X"86",X"0D",X"1A",X"13",X"21",X"F5",X"E5",X"21",X"00",X"40",X"34",X"AF",X"32",X"01",X"70", + X"3C",X"32",X"01",X"70",X"3A",X"00",X"78",X"E1",X"F1",X"C9",X"03",X"F5",X"C5",X"D5",X"E5",X"DD", + X"E5",X"FD",X"E5",X"3A",X"00",X"78",X"CD",X"22",X"01",X"AF",X"32",X"01",X"70",X"3E",X"01",X"32", + X"01",X"70",X"21",X"00",X"40",X"7E",X"BE",X"28",X"FD",X"3A",X"00",X"70",X"CB",X"5F",X"3E",X"01", + X"28",X"04",X"3A",X"09",X"40",X"2F",X"32",X"06",X"70",X"32",X"07",X"70",X"21",X"4E",X"40",X"11", + X"00",X"58",X"01",X"80",X"00",X"ED",X"B0",X"DD",X"21",X"2C",X"40",X"3A",X"00",X"60",X"CD",X"71", + X"12",X"3A",X"00",X"68",X"CD",X"71",X"12",X"3A",X"00",X"70",X"CD",X"71",X"12",X"DD",X"21",X"C9", + X"1B",X"CD",X"81",X"12",X"11",X"E5",X"1B",X"28",X"08",X"CD",X"81",X"12",X"11",X"ED",X"1B",X"20", + X"29",X"3A",X"00",X"68",X"07",X"07",X"07",X"E6",X"06",X"6F",X"26",X"00",X"19",X"3A",X"14",X"40", + X"86",X"27",X"32",X"14",X"40",X"23",X"3A",X"15",X"40",X"8E",X"27",X"30",X"02",X"3E",X"99",X"32", + X"15",X"40",X"CD",X"8A",X"11",X"3E",X"14",X"32",X"0D",X"40",X"3E",X"01",X"21",X"0D",X"40",X"35", + X"F2",X"15",X"01",X"34",X"AF",X"32",X"03",X"60",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1", + X"C9",X"21",X"DD",X"21",X"20",X"42",X"3A",X"09",X"40",X"FE",X"02",X"CA",X"5F",X"01",X"DD",X"CB", + X"00",X"46",X"C2",X"64",X"01",X"DD",X"CB",X"00",X"4E",X"C4",X"9F",X"01",X"DD",X"CB",X"00",X"66", + X"C4",X"E3",X"01",X"DD",X"CB",X"00",X"6E",X"C4",X"00",X"02",X"DD",X"CB",X"00",X"76",X"C4",X"22", + X"02",X"DD",X"CB",X"00",X"56",X"C4",X"B3",X"01",X"DD",X"CB",X"00",X"5E",X"C4",X"C6",X"01",X"DD", + X"CB",X"01",X"46",X"C9",X"3A",X"47",X"01",X"2A",X"22",X"42",X"7E",X"32",X"00",X"78",X"FE",X"FF", + X"CA",X"99",X"01",X"3E",X"01",X"32",X"06",X"68",X"32",X"07",X"68",X"DD",X"7E",X"04",X"B7",X"28", + X"08",X"3A",X"35",X"01",X"DD",X"35",X"04",X"18",X"C8",X"23",X"7E",X"DD",X"77",X"04",X"3E",X"FF", + X"32",X"00",X"78",X"23",X"22",X"22",X"42",X"18",X"B8",X"DD",X"CB",X"00",X"86",X"18",X"B2",X"DD", + X"7E",X"05",X"FE",X"FF",X"32",X"00",X"78",X"28",X"04",X"DD",X"35",X"05",X"C9",X"DD",X"CB",X"00", + X"8E",X"C9",X"21",X"3E",X"01",X"32",X"03",X"68",X"DD",X"35",X"06",X"F0",X"AF",X"32",X"03",X"68", + X"DD",X"CB",X"00",X"96",X"C9",X"21",X"DD",X"7E",X"07",X"B7",X"28",X"0D",X"2F",X"E6",X"02",X"CD", + X"A8",X"12",X"32",X"05",X"68",X"DD",X"35",X"07",X"C9",X"DD",X"CB",X"00",X"9E",X"AF",X"32",X"05", + X"68",X"C9",X"21",X"DD",X"7E",X"08",X"B7",X"28",X"0D",X"2F",X"E6",X"07",X"87",X"87",X"87",X"32", + X"00",X"78",X"DD",X"35",X"08",X"C9",X"3E",X"FF",X"32",X"00",X"78",X"DD",X"CB",X"00",X"A6",X"C9", + X"DD",X"7E",X"09",X"FE",X"80",X"28",X"10",X"C6",X"04",X"DD",X"77",X"09",X"ED",X"44",X"C6",X"40", + X"CD",X"A3",X"12",X"32",X"00",X"78",X"C9",X"3E",X"FF",X"32",X"00",X"78",X"DD",X"CB",X"00",X"AE", + X"C9",X"21",X"DD",X"7E",X"0A",X"FE",X"FF",X"CA",X"35",X"02",X"DD",X"34",X"0A",X"E6",X"1F",X"87", + X"87",X"32",X"00",X"78",X"C9",X"3E",X"FF",X"32",X"00",X"78",X"DD",X"CB",X"00",X"B6",X"C9",X"21", + X"21",X"31",X"00",X"44",X"CD",X"AB",X"02",X"CD",X"F4",X"0F",X"DD",X"21",X"00",X"50",X"0E",X"10", + X"06",X"10",X"78",X"C6",X"02",X"E6",X"FC",X"FE",X"08",X"28",X"10",X"DD",X"36",X"00",X"68",X"DD", + X"36",X"01",X"69",X"DD",X"36",X"20",X"6A",X"DD",X"36",X"21",X"6B",X"DD",X"23",X"DD",X"23",X"10", + X"E1",X"11",X"20",X"00",X"DD",X"19",X"CD",X"7B",X"00",X"0D",X"20",X"D4",X"21",X"64",X"00",X"CD", + X"EE",X"02",X"DD",X"21",X"00",X"18",X"CD",X"CB",X"10",X"21",X"64",X"00",X"CD",X"EE",X"02",X"18", + X"01",X"21",X"31",X"00",X"44",X"AF",X"32",X"09",X"40",X"21",X"E7",X"18",X"AF",X"86",X"2C",X"20", + X"FC",X"08",X"CD",X"00",X"20",X"CD",X"CF",X"02",X"18",X"E8",X"21",X"21",X"00",X"40",X"11",X"01", + X"40",X"01",X"2F",X"02",X"36",X"00",X"ED",X"B0",X"21",X"32",X"40",X"22",X"26",X"40",X"CD",X"F4", + X"0F",X"C9",X"E5",X"51",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"24",X"FF",X"FF",X"21",X"3E", + X"02",X"32",X"09",X"40",X"21",X"87",X"1A",X"22",X"0E",X"40",X"21",X"A0",X"0F",X"22",X"2A",X"40", + X"21",X"42",X"40",X"22",X"26",X"40",X"CD",X"60",X"04",X"CD",X"18",X"04",X"C9",X"21",X"CD",X"7B", + X"00",X"3A",X"15",X"40",X"B7",X"C2",X"FF",X"02",X"2B",X"7C",X"B5",X"20",X"F1",X"C9",X"21",X"31", + X"00",X"44",X"CD",X"F4",X"0F",X"DD",X"21",X"28",X"18",X"CD",X"CB",X"10",X"CD",X"7B",X"00",X"3A", + X"15",X"40",X"FE",X"01",X"28",X"07",X"DD",X"21",X"53",X"18",X"CD",X"CB",X"10",X"DD",X"21",X"CD", + X"1B",X"CD",X"81",X"12",X"01",X"99",X"01",X"28",X"08",X"CD",X"81",X"12",X"01",X"98",X"02",X"20", + X"DB",X"3A",X"15",X"40",X"B8",X"38",X"D5",X"81",X"27",X"32",X"15",X"40",X"78",X"3D",X"32",X"0A", + X"40",X"C3",X"45",X"03",X"21",X"21",X"6D",X"1A",X"11",X"32",X"40",X"01",X"10",X"00",X"ED",X"B0", + X"3A",X"00",X"70",X"CB",X"57",X"28",X"08",X"3E",X"02",X"32",X"39",X"40",X"32",X"41",X"40",X"AF", + X"32",X"09",X"40",X"3A",X"09",X"40",X"B7",X"DD",X"21",X"32",X"40",X"28",X"04",X"DD",X"21",X"3A", + X"40",X"DD",X"22",X"26",X"40",X"DD",X"7E",X"07",X"B7",X"CA",X"D8",X"03",X"DD",X"6E",X"04",X"DD", + X"66",X"05",X"22",X"0E",X"40",X"DD",X"E5",X"CD",X"F4",X"0F",X"3A",X"09",X"40",X"DD",X"21",X"67", + X"19",X"B7",X"28",X"04",X"DD",X"21",X"76",X"19",X"CD",X"CB",X"10",X"DD",X"2A",X"26",X"40",X"CD", + X"F6",X"11",X"DD",X"E1",X"CD",X"60",X"04",X"AF",X"21",X"F5",X"1B",X"CD",X"45",X"10",X"CD",X"18", + X"04",X"CD",X"7B",X"00",X"3A",X"20",X"42",X"CB",X"47",X"20",X"F6",X"DD",X"2A",X"26",X"40",X"DD", + X"35",X"07",X"FA",X"D8",X"03",X"3A",X"0A",X"40",X"B7",X"CA",X"63",X"03",X"3A",X"09",X"40",X"EE", + X"01",X"32",X"09",X"40",X"C3",X"63",X"03",X"21",X"DD",X"21",X"08",X"04",X"CD",X"CB",X"10",X"06", + X"64",X"CD",X"7B",X"00",X"10",X"FB",X"DD",X"2A",X"26",X"40",X"DD",X"CB",X"07",X"7E",X"28",X"04", + X"DD",X"36",X"07",X"00",X"3A",X"0A",X"40",X"B7",X"3A",X"39",X"40",X"21",X"41",X"40",X"28",X"01", + X"B6",X"B7",X"CA",X"92",X"02",X"C3",X"C5",X"03",X"90",X"50",X"47",X"41",X"4D",X"45",X"20",X"4F", + X"56",X"45",X"52",X"5B",X"24",X"FF",X"FF",X"21",X"2A",X"1E",X"40",X"23",X"22",X"1E",X"40",X"3A", + X"09",X"40",X"FE",X"02",X"20",X"0A",X"2A",X"2A",X"40",X"2B",X"22",X"2A",X"40",X"CB",X"7C",X"C0", + X"CD",X"7B",X"00",X"CD",X"DC",X"08",X"CD",X"2F",X"05",X"CD",X"81",X"0A",X"CD",X"E5",X"0E",X"CD", + X"75",X"08",X"CD",X"5E",X"0B",X"CD",X"3F",X"0E",X"CD",X"8A",X"09",X"CD",X"8B",X"06",X"CD",X"73", + X"0F",X"20",X"C5",X"CD",X"A7",X"0F",X"3A",X"06",X"40",X"FE",X"FF",X"C2",X"18",X"04",X"C9",X"21", + X"21",X"46",X"1A",X"11",X"F6",X"41",X"01",X"20",X"00",X"ED",X"B0",X"CD",X"F4",X"0F",X"3E",X"01", + X"32",X"04",X"70",X"21",X"00",X"04",X"22",X"16",X"40",X"3E",X"80",X"32",X"01",X"40",X"CD",X"46", + X"09",X"21",X"D3",X"40",X"06",X"0A",X"11",X"08",X"00",X"36",X"FF",X"19",X"10",X"FB",X"21",X"67", + X"1A",X"11",X"CE",X"40",X"01",X"08",X"00",X"ED",X"B0",X"21",X"D3",X"41",X"06",X"06",X"11",X"06", + X"00",X"36",X"FF",X"19",X"10",X"FB",X"21",X"23",X"41",X"11",X"09",X"00",X"06",X"14",X"36",X"FF", + X"19",X"10",X"FB",X"DD",X"21",X"E0",X"53",X"06",X"20",X"11",X"E0",X"FF",X"DD",X"36",X"04",X"90", + X"DD",X"36",X"05",X"2B",X"0E",X"90",X"78",X"E6",X"07",X"20",X"02",X"0E",X"97",X"DD",X"71",X"1C", + X"DD",X"36",X"1D",X"90",X"DD",X"36",X"1E",X"90",X"DD",X"19",X"10",X"E0",X"DD",X"21",X"22",X"05", + X"CD",X"CB",X"10",X"3E",X"95",X"21",X"A1",X"53",X"11",X"41",X"50",X"06",X"03",X"77",X"12",X"23", + X"13",X"10",X"FA",X"3E",X"9A",X"32",X"04",X"52",X"3E",X"98",X"32",X"E4",X"51",X"AF",X"32",X"05", + X"40",X"32",X"06",X"40",X"32",X"08",X"40",X"32",X"0B",X"40",X"3E",X"B8",X"32",X"07",X"40",X"21", + X"00",X"00",X"22",X"12",X"40",X"06",X"20",X"C5",X"CD",X"31",X"06",X"C1",X"10",X"F9",X"CD",X"46", + X"09",X"C9",X"65",X"52",X"53",X"43",X"41",X"4E",X"4E",X"45",X"52",X"24",X"FF",X"FF",X"21",X"3A", + X"1E",X"40",X"2F",X"E6",X"03",X"CC",X"44",X"05",X"CD",X"E0",X"05",X"3A",X"1E",X"40",X"E6",X"01", + X"CC",X"31",X"06",X"C9",X"3A",X"06",X"40",X"B7",X"C0",X"CD",X"C6",X"05",X"21",X"23",X"52",X"06", + X"04",X"FD",X"21",X"20",X"1A",X"11",X"F6",X"41",X"0E",X"08",X"AF",X"EB",X"B6",X"23",X"0D",X"20", + X"FB",X"EB",X"B7",X"28",X"04",X"FD",X"7E",X"00",X"77",X"FD",X"23",X"D5",X"11",X"E0",X"FF",X"19", + X"D1",X"10",X"E5",X"DD",X"21",X"CE",X"40",X"06",X"0A",X"DD",X"7E",X"05",X"FE",X"FF",X"CA",X"BC", + X"05",X"DD",X"5E",X"00",X"DD",X"56",X"01",X"CB",X"3A",X"CB",X"1B",X"7B",X"E6",X"E0",X"5F",X"21", + X"E1",X"53",X"B7",X"ED",X"52",X"DD",X"7E",X"02",X"FE",X"8C",X"30",X"06",X"2C",X"FE",X"46",X"30", + X"01",X"2C",X"DD",X"7E",X"05",X"B7",X"0E",X"0D",X"28",X"02",X"0E",X"0C",X"FE",X"58",X"20",X"02", + X"0E",X"42",X"7E",X"FE",X"95",X"28",X"05",X"FE",X"10",X"38",X"01",X"71",X"11",X"08",X"00",X"DD", + X"19",X"05",X"C2",X"79",X"05",X"C9",X"DD",X"21",X"81",X"53",X"06",X"1A",X"11",X"E0",X"FF",X"DD", + X"36",X"00",X"90",X"DD",X"36",X"01",X"90",X"DD",X"36",X"02",X"90",X"DD",X"19",X"10",X"F0",X"C9", + X"21",X"8E",X"40",X"06",X"20",X"36",X"00",X"23",X"10",X"FB",X"FD",X"21",X"8E",X"40",X"0E",X"08", + X"06",X"0A",X"DD",X"21",X"CE",X"40",X"DD",X"7E",X"05",X"FE",X"FF",X"CA",X"27",X"06",X"CD",X"B7", + X"12",X"C2",X"27",X"06",X"7D",X"D6",X"08",X"FD",X"77",X"00",X"3E",X"F8",X"DD",X"96",X"02",X"FD", + X"77",X"03",X"DD",X"7E",X"04",X"FD",X"77",X"01",X"DD",X"7E",X"03",X"C6",X"05",X"FD",X"77",X"02", + X"11",X"04",X"00",X"FD",X"19",X"0D",X"C8",X"11",X"08",X"00",X"DD",X"19",X"05",X"C2",X"F6",X"05", + X"C9",X"2A",X"16",X"40",X"3A",X"07",X"40",X"C6",X"08",X"32",X"07",X"40",X"CD",X"9E",X"12",X"19", + X"CD",X"EB",X"12",X"3A",X"1E",X"40",X"E6",X"0F",X"CC",X"46",X"09",X"3A",X"09",X"40",X"FE",X"02", + X"28",X"19",X"B7",X"21",X"A0",X"53",X"28",X"03",X"21",X"40",X"51",X"3A",X"1E",X"40",X"CB",X"67", + X"3E",X"AC",X"28",X"03",X"3A",X"09",X"40",X"3C",X"77",X"18",X"10",X"21",X"00",X"00",X"22",X"42", + X"40",X"22",X"44",X"40",X"3A",X"15",X"40",X"B7",X"C2",X"FF",X"02",X"2A",X"12",X"40",X"7C",X"B5", + X"C8",X"CD",X"EB",X"12",X"21",X"00",X"00",X"22",X"12",X"40",X"C9",X"3A",X"06",X"40",X"CB",X"7F", + X"C0",X"3A",X"09",X"40",X"FE",X"02",X"CA",X"23",X"07",X"B7",X"DD",X"21",X"D1",X"1B",X"28",X"04", + X"DD",X"21",X"D9",X"1B",X"DD",X"E5",X"FD",X"21",X"D4",X"40",X"CD",X"ED",X"06",X"FD",X"23",X"DD", + X"E1",X"11",X"04",X"00",X"DD",X"19",X"CD",X"ED",X"06",X"CD",X"D1",X"06",X"3A",X"09",X"40",X"B7", + X"DD",X"21",X"E1",X"1B",X"28",X"04",X"DD",X"21",X"E3",X"1B",X"CD",X"81",X"12",X"CC",X"B5",X"07", + X"C9",X"3A",X"CF",X"40",X"B7",X"20",X"08",X"3A",X"D4",X"40",X"CB",X"7F",X"C8",X"18",X"09",X"FE", + X"07",X"C0",X"3A",X"D4",X"40",X"CB",X"7F",X"C0",X"AF",X"32",X"D4",X"40",X"C9",X"3A",X"1E",X"40", + X"E6",X"03",X"C0",X"CD",X"81",X"12",X"20",X"10",X"FD",X"7E",X"00",X"FE",X"08",X"C8",X"FD",X"CB", + X"00",X"7E",X"20",X"1A",X"FD",X"34",X"00",X"C9",X"CD",X"81",X"12",X"20",X"11",X"FD",X"7E",X"00", + X"FE",X"F8",X"C8",X"B7",X"28",X"04",X"CB",X"7F",X"28",X"04",X"FD",X"35",X"00",X"C9",X"AF",X"FD", + X"77",X"00",X"C9",X"CD",X"12",X"15",X"FE",X"32",X"0E",X"0A",X"D2",X"A3",X"07",X"DD",X"21",X"D6", + X"40",X"06",X"09",X"0E",X"FF",X"DD",X"7E",X"05",X"FE",X"FF",X"CA",X"8F",X"07",X"FE",X"58",X"CA", + X"8F",X"07",X"C5",X"DD",X"7E",X"06",X"CD",X"9E",X"12",X"EB",X"29",X"29",X"29",X"29",X"DD",X"5E", + X"00",X"DD",X"56",X"01",X"19",X"ED",X"5B",X"CE",X"40",X"CD",X"58",X"08",X"47",X"B7",X"20",X"01", + X"4F",X"59",X"D5",X"DD",X"7E",X"07",X"87",X"87",X"87",X"DD",X"86",X"02",X"6F",X"26",X"00",X"ED", + X"5B",X"D0",X"40",X"54",X"CD",X"58",X"08",X"B7",X"20",X"01",X"4F",X"D1",X"51",X"80",X"C1",X"B9", + X"30",X"0D",X"FE",X"0A",X"30",X"04",X"CB",X"2B",X"CB",X"2A",X"ED",X"53",X"D4",X"40",X"4F",X"11", + X"08",X"00",X"DD",X"19",X"05",X"C2",X"35",X"07",X"79",X"FE",X"FF",X"20",X"06",X"21",X"00",X"00", + X"22",X"D4",X"40",X"CD",X"12",X"15",X"FE",X"50",X"D2",X"B1",X"07",X"79",X"FE",X"08",X"DC",X"B5", + X"07",X"CD",X"D1",X"06",X"C9",X"DD",X"21",X"D2",X"41",X"06",X"06",X"11",X"06",X"00",X"DD",X"7E", + X"01",X"FE",X"FF",X"28",X"05",X"DD",X"19",X"10",X"F5",X"C9",X"3E",X"03",X"CD",X"45",X"10",X"DD", + X"E5",X"2A",X"16",X"40",X"11",X"00",X"04",X"19",X"CB",X"3C",X"CB",X"1D",X"CD",X"12",X"15",X"E6", + X"60",X"C6",X"10",X"5F",X"16",X"00",X"19",X"E5",X"11",X"1C",X"00",X"01",X"0C",X"02",X"D9",X"D1", + X"2A",X"CE",X"40",X"CD",X"58",X"08",X"69",X"ED",X"43",X"10",X"40",X"E5",X"DD",X"77",X"02",X"11", + X"1C",X"00",X"2A",X"D0",X"40",X"CD",X"58",X"08",X"E1",X"26",X"08",X"DD",X"77",X"04",X"DD",X"BE", + X"02",X"30",X"02",X"DD",X"7E",X"02",X"3C",X"DD",X"77",X"05",X"DD",X"36",X"03",X"00",X"D9",X"DD", + X"7E",X"04",X"DD",X"BE",X"02",X"38",X"10",X"DD",X"7E",X"04",X"CB",X"3F",X"DD",X"BE",X"02",X"0E", + X"34",X"30",X"02",X"0E",X"35",X"18",X"02",X"0E",X"36",X"3A",X"10",X"40",X"CB",X"7F",X"79",X"28", + X"02",X"C6",X"04",X"4F",X"CD",X"9B",X"14",X"2A",X"24",X"40",X"DD",X"E1",X"DD",X"75",X"00",X"DD", + X"74",X"01",X"C8",X"DD",X"36",X"01",X"FF",X"C9",X"B7",X"ED",X"52",X"4C",X"F2",X"64",X"08",X"19", + X"EB",X"B7",X"ED",X"52",X"29",X"29",X"29",X"29",X"29",X"00",X"CB",X"11",X"9F",X"87",X"3C",X"87", + X"87",X"87",X"4F",X"7C",X"C9",X"DD",X"21",X"CE",X"40",X"06",X"0A",X"AF",X"32",X"08",X"40",X"DD", + X"7E",X"05",X"FE",X"FF",X"CA",X"97",X"08",X"21",X"08",X"40",X"34",X"3A",X"1E",X"40",X"90",X"E6", + X"01",X"C2",X"97",X"08",X"CD",X"A1",X"08",X"11",X"08",X"00",X"DD",X"19",X"05",X"C2",X"7F",X"08", + X"C9",X"DD",X"7E",X"06",X"CD",X"9E",X"12",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"19",X"7C",X"E6", + X"07",X"67",X"DD",X"75",X"00",X"DD",X"74",X"01",X"DD",X"7E",X"07",X"CD",X"9E",X"12",X"DD",X"6E", + X"02",X"26",X"00",X"19",X"DD",X"7E",X"05",X"B7",X"20",X"09",X"7D",X"FE",X"C8",X"30",X"08",X"FE", + X"38",X"38",X"04",X"DD",X"75",X"02",X"C9",X"DD",X"36",X"07",X"00",X"C9",X"21",X"0B",X"40",X"7E", + X"B7",X"CA",X"E8",X"08",X"35",X"CD",X"46",X"09",X"3A",X"06",X"40",X"CB",X"7F",X"C0",X"2A",X"16", + X"40",X"11",X"00",X"FC",X"19",X"29",X"29",X"29",X"29",X"7C",X"32",X"56",X"40",X"2A",X"16",X"40", + X"CB",X"3C",X"CB",X"1D",X"7D",X"ED",X"44",X"32",X"0C",X"40",X"DD",X"21",X"CE",X"40",X"CD",X"B7", + X"12",X"11",X"3C",X"00",X"B7",X"ED",X"52",X"38",X"08",X"19",X"11",X"C4",X"00",X"B7",X"ED",X"52", + X"D8",X"ED",X"5B",X"16",X"40",X"4D",X"19",X"22",X"16",X"40",X"3A",X"01",X"40",X"91",X"32",X"01", + X"40",X"2A",X"16",X"40",X"11",X"70",X"00",X"CB",X"79",X"28",X"03",X"11",X"90",X"FF",X"19",X"CD", + X"EB",X"12",X"CD",X"46",X"09",X"C9",X"21",X"57",X"40",X"36",X"05",X"23",X"23",X"23",X"3A",X"0B", + X"40",X"E6",X"07",X"4F",X"DD",X"E5",X"DD",X"2A",X"26",X"40",X"DD",X"7E",X"06",X"32",X"51",X"40", + X"32",X"53",X"40",X"32",X"55",X"40",X"DD",X"E1",X"06",X"19",X"3A",X"01",X"40",X"81",X"77",X"23", + X"71",X"23",X"10",X"FA",X"3E",X"05",X"06",X"04",X"21",X"85",X"40",X"77",X"23",X"23",X"10",X"FB", + X"3A",X"0C",X"40",X"32",X"86",X"40",X"32",X"88",X"40",X"C9",X"3A",X"1E",X"40",X"E6",X"0F",X"C0", + X"DD",X"2A",X"0E",X"40",X"CD",X"9C",X"09",X"DD",X"22",X"0E",X"40",X"C9",X"DD",X"7E",X"00",X"FE", + X"01",X"CA",X"BB",X"09",X"FE",X"02",X"CA",X"CD",X"09",X"FE",X"03",X"CA",X"2D",X"0A",X"FE",X"04", + X"CA",X"3D",X"0A",X"FE",X"05",X"CA",X"75",X"0A",X"DD",X"23",X"C9",X"21",X"05",X"40",X"DD",X"7E", + X"01",X"BE",X"28",X"02",X"34",X"C9",X"DD",X"23",X"DD",X"23",X"36",X"00",X"C9",X"DD",X"7E",X"05", + X"B7",X"20",X"17",X"3A",X"CF",X"40",X"FE",X"04",X"3E",X"FF",X"38",X"02",X"3E",X"01",X"FD",X"2A", + X"26",X"40",X"DD",X"CB",X"06",X"46",X"28",X"02",X"ED",X"44",X"32",X"04",X"40",X"CB",X"7F",X"DD", + X"7E",X"06",X"28",X"02",X"ED",X"44",X"6F",X"26",X"00",X"29",X"29",X"29",X"DD",X"5E",X"07",X"DD", + X"4E",X"02",X"DD",X"46",X"01",X"D9",X"2A",X"04",X"40",X"FD",X"2A",X"26",X"40",X"FD",X"7E",X"06", + X"FE",X"03",X"38",X"02",X"3E",X"02",X"DD",X"86",X"03",X"47",X"04",X"05",X"28",X"03",X"29",X"18", + X"FA",X"26",X"00",X"D9",X"CD",X"87",X"14",X"11",X"08",X"00",X"DD",X"19",X"C9",X"2A",X"0E",X"40", + X"FD",X"2A",X"26",X"40",X"FD",X"75",X"04",X"FD",X"74",X"05",X"DD",X"23",X"C9",X"DD",X"21",X"87", + X"1A",X"FD",X"2A",X"26",X"40",X"FD",X"34",X"06",X"DD",X"E5",X"CD",X"F4",X"0F",X"DD",X"21",X"5D", + X"0A",X"CD",X"CB",X"10",X"CD",X"F6",X"11",X"CD",X"6B",X"04",X"DD",X"E1",X"C9",X"82",X"53",X"54", + X"45",X"4D",X"50",X"4F",X"52",X"41",X"52",X"59",X"20",X"43",X"45",X"41",X"53",X"45",X"46",X"49", + X"52",X"45",X"24",X"FF",X"FF",X"3A",X"08",X"40",X"DD",X"BE",X"01",X"D0",X"DD",X"23",X"DD",X"23", + X"C9",X"CD",X"88",X"0A",X"CD",X"B4",X"0A",X"C9",X"DD",X"21",X"1E",X"41",X"06",X"14",X"78",X"90", + X"CD",X"E9",X"0A",X"20",X"17",X"DD",X"7E",X"05",X"FE",X"FF",X"28",X"10",X"DD",X"7E",X"08",X"FE", + X"FF",X"28",X"09",X"CD",X"43",X"0B",X"20",X"04",X"DD",X"7E",X"08",X"77",X"11",X"09",X"00",X"DD", + X"19",X"10",X"DB",X"C9",X"DD",X"21",X"1E",X"41",X"06",X"14",X"78",X"CD",X"E9",X"0A",X"20",X"21", + X"DD",X"7E",X"05",X"FE",X"FF",X"28",X"1A",X"CD",X"F9",X"0A",X"DD",X"7E",X"05",X"3C",X"28",X"11", + X"CD",X"43",X"0B",X"20",X"0C",X"7E",X"DD",X"77",X"08",X"DD",X"7E",X"04",X"FE",X"FF",X"28",X"01", + X"77",X"11",X"09",X"00",X"DD",X"19",X"10",X"D2",X"C9",X"4F",X"DD",X"7E",X"05",X"E6",X"7E",X"FE", + X"02",X"C8",X"3A",X"1E",X"40",X"91",X"E6",X"03",X"C9",X"DD",X"7E",X"05",X"E6",X"7F",X"FE",X"02", + X"28",X"0F",X"FE",X"03",X"C8",X"FE",X"04",X"28",X"10",X"FE",X"05",X"28",X"11",X"CD",X"A1",X"08", + X"C9",X"CD",X"A1",X"08",X"DD",X"36",X"05",X"03",X"C9",X"DD",X"36",X"05",X"FF",X"C9",X"DD",X"36", + X"06",X"00",X"DD",X"36",X"07",X"00",X"DD",X"7E",X"03",X"FE",X"10",X"28",X"0E",X"DD",X"34",X"03", + X"E6",X"0C",X"C6",X"E0",X"DD",X"77",X"04",X"CD",X"AE",X"13",X"C9",X"DD",X"36",X"05",X"04",X"CD", + X"CC",X"13",X"C9",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"CD",X"FE",X"14",X"C0",X"DD",X"7E",X"02", + X"ED",X"44",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"5F",X"16",X"50",X"19",X"AF",X"C9",X"DD",X"21", + X"CE",X"40",X"06",X"0A",X"DD",X"7E",X"05",X"C5",X"CD",X"74",X"0B",X"C1",X"11",X"08",X"00",X"DD", + X"19",X"10",X"F1",X"C9",X"FE",X"FF",X"C8",X"B7",X"CA",X"9A",X"0B",X"FE",X"01",X"CA",X"9F",X"0B", + X"FE",X"02",X"CA",X"BA",X"0B",X"FE",X"03",X"CA",X"04",X"0C",X"FE",X"04",X"CA",X"23",X"0C",X"FE", + X"05",X"CA",X"81",X"0C",X"FE",X"58",X"CA",X"22",X"0D",X"C9",X"DD",X"36",X"03",X"00",X"C9",X"CD", + X"4A",X"0D",X"CD",X"12",X"15",X"FE",X"01",X"21",X"24",X"1C",X"3E",X"00",X"DC",X"45",X"10",X"CD", + X"12",X"15",X"FE",X"1E",X"DC",X"99",X"0D",X"C3",X"7E",X"0D",X"CD",X"12",X"15",X"FE",X"01",X"3E", + X"00",X"21",X"34",X"1C",X"DC",X"45",X"10",X"DD",X"36",X"03",X"02",X"CD",X"4A",X"0D",X"CD",X"12", + X"15",X"FE",X"02",X"30",X"14",X"DD",X"7E",X"06",X"CD",X"A3",X"12",X"4F",X"DD",X"7E",X"01",X"FE", + X"04",X"79",X"38",X"02",X"ED",X"44",X"DD",X"77",X"06",X"FD",X"2A",X"26",X"40",X"FD",X"7E",X"06", + X"0E",X"02",X"38",X"08",X"FE",X"02",X"0E",X"08",X"38",X"02",X"0E",X"14",X"CD",X"12",X"15",X"B9", + X"D0",X"C3",X"8A",X"0D",X"DD",X"36",X"03",X"02",X"CD",X"4A",X"0D",X"CD",X"12",X"15",X"FE",X"01", + X"21",X"44",X"1C",X"3E",X"00",X"DC",X"45",X"10",X"CD",X"12",X"15",X"FE",X"1E",X"DC",X"99",X"0D", + X"C3",X"8A",X"0D",X"3E",X"06",X"CD",X"45",X"10",X"CD",X"4A",X"0D",X"DD",X"6E",X"00",X"DD",X"66", + X"01",X"CD",X"CB",X"12",X"B7",X"28",X"04",X"DD",X"36",X"07",X"FC",X"C6",X"30",X"DD",X"BE",X"02", + X"D8",X"DD",X"36",X"06",X"00",X"DD",X"36",X"07",X"04",X"DD",X"36",X"05",X"58",X"DD",X"6E",X"00", + X"DD",X"66",X"01",X"11",X"C0",X"FF",X"19",X"06",X"10",X"C5",X"E5",X"CD",X"CB",X"12",X"7D",X"B4", + X"28",X"10",X"7E",X"CB",X"3F",X"D6",X"02",X"CB",X"7F",X"28",X"01",X"AF",X"77",X"E1",X"E5",X"CD", + X"EB",X"12",X"E1",X"11",X"08",X"00",X"19",X"C1",X"10",X"DF",X"C9",X"3E",X"15",X"32",X"15",X"40", + X"C9",X"3E",X"04",X"CD",X"45",X"10",X"CD",X"4A",X"0D",X"CD",X"12",X"15",X"E6",X"1F",X"20",X"2E", + X"FD",X"2A",X"26",X"40",X"FD",X"7E",X"06",X"FE",X"03",X"0E",X"02",X"30",X"01",X"4F",X"0C",X"0C", + X"0C",X"DD",X"7E",X"01",X"FE",X"04",X"30",X"0B",X"DD",X"7E",X"06",X"B9",X"28",X"10",X"DD",X"34", + X"06",X"18",X"0B",X"DD",X"7E",X"06",X"ED",X"44",X"B9",X"28",X"03",X"DD",X"35",X"06",X"CD",X"12", + X"15",X"E6",X"28",X"DC",X"99",X"0D",X"2A",X"12",X"40",X"7C",X"B5",X"C0",X"FD",X"2A",X"26",X"40", + X"FD",X"7E",X"06",X"FE",X"01",X"0E",X"28",X"38",X"08",X"0E",X"50",X"FE",X"02",X"38",X"02",X"0E", + X"78",X"CD",X"12",X"15",X"B9",X"D0",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"E5",X"CD",X"CB",X"12", + X"7D",X"B4",X"28",X"27",X"7E",X"B7",X"28",X"23",X"3D",X"30",X"02",X"3E",X"00",X"77",X"E1",X"22", + X"12",X"40",X"3E",X"0A",X"32",X"0B",X"40",X"CD",X"43",X"0B",X"C0",X"2C",X"7D",X"E6",X"1F",X"FE", + X"1A",X"D0",X"7E",X"FE",X"90",X"C0",X"36",X"95",X"23",X"18",X"F7",X"E1",X"C9",X"DD",X"36",X"05", + X"FF",X"C9",X"DD",X"36",X"07",X"FF",X"DD",X"7E",X"02",X"FE",X"1E",X"38",X"18",X"DD",X"7E",X"03", + X"FE",X"20",X"28",X"11",X"E6",X"03",X"C6",X"3C",X"DD",X"77",X"04",X"CD",X"12",X"15",X"E6",X"01", + X"C0",X"DD",X"34",X"03",X"C9",X"DD",X"36",X"05",X"FF",X"C9",X"3A",X"1E",X"40",X"3C",X"E6",X"07", + X"C0",X"DD",X"7E",X"05",X"FE",X"01",X"DD",X"7E",X"06",X"28",X"01",X"2F",X"E6",X"80",X"4F",X"DD", + X"7E",X"04",X"E6",X"7F",X"B1",X"DD",X"77",X"04",X"DD",X"7E",X"01",X"B7",X"20",X"08",X"DD",X"7E", + X"00",X"FE",X"3F",X"DA",X"7A",X"0D",X"CD",X"C8",X"0D",X"C9",X"E1",X"C3",X"1D",X"0D",X"DD",X"6E", + X"00",X"DD",X"66",X"01",X"CD",X"CB",X"12",X"FE",X"03",X"D8",X"DD",X"6E",X"00",X"DD",X"66",X"01", + X"CD",X"CB",X"12",X"B7",X"C8",X"CD",X"1D",X"0E",X"C9",X"2A",X"CE",X"40",X"DD",X"5E",X"00",X"DD", + X"56",X"01",X"CD",X"58",X"08",X"FE",X"08",X"D0",X"3A",X"D0",X"40",X"DD",X"BE",X"02",X"38",X"0C", + X"DD",X"7E",X"02",X"FE",X"3C",X"38",X"05",X"DD",X"36",X"07",X"FD",X"C9",X"DD",X"7E",X"02",X"FE", + X"BE",X"30",X"ED",X"DD",X"36",X"07",X"03",X"C9",X"DD",X"7E",X"01",X"FE",X"04",X"30",X"05",X"3E", + X"08",X"DD",X"96",X"01",X"FE",X"04",X"28",X"21",X"FE",X"05",X"28",X"30",X"DD",X"7E",X"05",X"FE", + X"01",X"28",X"11",X"FE",X"04",X"28",X"0D",X"3A",X"1E",X"40",X"CB",X"77",X"3E",X"01",X"28",X"02", + X"3E",X"FF",X"18",X"01",X"AF",X"DD",X"77",X"07",X"C9",X"DD",X"7E",X"02",X"FE",X"50",X"38",X"DC", + X"DD",X"7E",X"06",X"CD",X"A3",X"12",X"ED",X"44",X"DD",X"77",X"07",X"C9",X"CD",X"12",X"15",X"E6", + X"3F",X"C6",X"80",X"DD",X"BE",X"02",X"38",X"C4",X"DD",X"36",X"07",X"01",X"C9",X"DD",X"7E",X"02", + X"FE",X"C8",X"D0",X"3E",X"01",X"CD",X"45",X"10",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"DD",X"5E", + X"02",X"16",X"00",X"01",X"3C",X"01",X"D9",X"21",X"00",X"F8",X"D9",X"CD",X"A7",X"14",X"C9",X"DD", + X"21",X"D2",X"41",X"06",X"06",X"DD",X"7E",X"01",X"FE",X"FF",X"CA",X"96",X"0E",X"DD",X"6E",X"00", + X"DD",X"66",X"01",X"E5",X"FD",X"E1",X"FD",X"7E",X"05",X"FE",X"03",X"C2",X"96",X"0E",X"DD",X"35", + X"05",X"CA",X"83",X"0E",X"DD",X"7E",X"02",X"DD",X"BE",X"04",X"38",X"05",X"CD",X"9E",X"0E",X"18", + X"03",X"CD",X"BE",X"0E",X"0E",X"01",X"CD",X"B0",X"12",X"CD",X"0B",X"14",X"CD",X"B0",X"12",X"20", + X"02",X"18",X"13",X"FD",X"36",X"05",X"05",X"DD",X"36",X"01",X"FF",X"CD",X"B0",X"12",X"0E",X"03", + X"CD",X"0B",X"14",X"CD",X"B0",X"12",X"11",X"06",X"00",X"DD",X"19",X"10",X"A8",X"C9",X"FD",X"36", + X"07",X"00",X"FD",X"36",X"05",X"02",X"DD",X"7E",X"03",X"DD",X"86",X"04",X"DD",X"96",X"02",X"30", + X"07",X"DD",X"86",X"02",X"DD",X"77",X"03",X"C9",X"FD",X"36",X"07",X"08",X"18",X"F6",X"FD",X"36", + X"06",X"00",X"FD",X"36",X"05",X"02",X"DD",X"7E",X"03",X"DD",X"86",X"02",X"DD",X"96",X"04",X"30", + X"05",X"DD",X"86",X"04",X"18",X"DE",X"0E",X"08",X"FD",X"CB",X"04",X"56",X"20",X"02",X"0E",X"F8", + X"FD",X"71",X"06",X"18",X"CF",X"DD",X"21",X"1E",X"41",X"06",X"14",X"DD",X"7E",X"05",X"C5",X"DD", + X"E5",X"CD",X"FF",X"0E",X"DD",X"E1",X"C1",X"11",X"09",X"00",X"DD",X"19",X"10",X"ED",X"C9",X"FE", + X"FF",X"C8",X"FE",X"01",X"28",X"01",X"C9",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"CD",X"CB",X"12", + X"87",X"87",X"87",X"C6",X"40",X"DD",X"BE",X"02",X"D8",X"DD",X"36",X"05",X"FF",X"CD",X"43",X"0B", + X"20",X"02",X"36",X"AD",X"3E",X"1E",X"32",X"0B",X"40",X"3E",X"02",X"CD",X"45",X"10",X"DD",X"6E", + X"00",X"DD",X"66",X"01",X"11",X"F0",X"FF",X"19",X"0E",X"00",X"CD",X"51",X"0F",X"0E",X"01",X"CD", + X"51",X"0F",X"0E",X"02",X"CD",X"51",X"0F",X"0E",X"01",X"CD",X"51",X"0F",X"0E",X"00",X"CD",X"51", + X"0F",X"E5",X"22",X"1C",X"40",X"D5",X"C5",X"CD",X"CB",X"12",X"C1",X"7D",X"B4",X"28",X"07",X"7E", + X"91",X"30",X"02",X"3E",X"00",X"77",X"2A",X"1C",X"40",X"CD",X"EB",X"12",X"D1",X"E1",X"11",X"08", + X"00",X"19",X"C9",X"3A",X"06",X"40",X"B7",X"C2",X"A5",X"0F",X"CD",X"12",X"15",X"E6",X"0F",X"C0", + X"3A",X"1F",X"40",X"CB",X"47",X"21",X"F6",X"41",X"11",X"01",X"00",X"20",X"06",X"21",X"15",X"42", + X"11",X"FF",X"FF",X"01",X"00",X"20",X"7E",X"B7",X"20",X"05",X"19",X"10",X"F9",X"AF",X"C9",X"22", + X"28",X"40",X"F6",X"FF",X"C9",X"AF",X"C9",X"3E",X"FF",X"32",X"0B",X"40",X"21",X"06",X"40",X"34", + X"F2",X"E5",X"0F",X"3E",X"FF",X"32",X"D3",X"40",X"AF",X"32",X"0B",X"40",X"CD",X"46",X"09",X"2A", + X"16",X"40",X"7C",X"FE",X"04",X"20",X"04",X"7D",X"FE",X"08",X"D8",X"3E",X"80",X"32",X"06",X"40", + X"F5",X"3E",X"00",X"21",X"54",X"1C",X"CD",X"45",X"10",X"F1",X"21",X"FC",X"FF",X"30",X"03",X"21", + X"04",X"00",X"C3",X"21",X"09",X"7E",X"FE",X"01",X"C0",X"CD",X"C6",X"05",X"DD",X"21",X"85",X"19", + X"CD",X"CB",X"10",X"C9",X"CD",X"7B",X"00",X"06",X"04",X"21",X"00",X"50",X"36",X"AD",X"2C",X"20", + X"FB",X"24",X"10",X"F8",X"21",X"00",X"00",X"22",X"20",X"42",X"3E",X"FF",X"32",X"00",X"78",X"AF", + X"32",X"03",X"68",X"32",X"05",X"68",X"32",X"04",X"70",X"32",X"0C",X"40",X"21",X"4E",X"40",X"06", + X"80",X"36",X"00",X"23",X"10",X"FB",X"AF",X"32",X"01",X"40",X"3E",X"07",X"32",X"4F",X"40",X"32", + X"8D",X"40",X"DD",X"21",X"E7",X"18",X"CD",X"CB",X"10",X"CD",X"40",X"11",X"C9",X"3E",X"F2",X"C6", + X"23",X"FD",X"77",X"0C",X"C9",X"DD",X"E5",X"CD",X"4D",X"10",X"DD",X"E1",X"C9",X"DD",X"21",X"20", + X"42",X"FE",X"00",X"CA",X"75",X"10",X"FE",X"01",X"CA",X"86",X"10",X"FE",X"02",X"CA",X"94",X"10", + X"FE",X"03",X"CA",X"9D",X"10",X"FE",X"04",X"CA",X"A6",X"10",X"FE",X"05",X"CA",X"B4",X"10",X"FE", + X"06",X"CA",X"BD",X"10",X"C9",X"DD",X"CB",X"00",X"46",X"C0",X"22",X"22",X"42",X"DD",X"36",X"04", + X"14",X"DD",X"CB",X"00",X"C6",X"C9",X"DD",X"CB",X"00",X"4E",X"C0",X"DD",X"CB",X"00",X"CE",X"DD", + X"36",X"05",X"50",X"C9",X"DD",X"CB",X"00",X"D6",X"DD",X"36",X"06",X"78",X"C9",X"DD",X"CB",X"00", + X"DE",X"DD",X"36",X"07",X"14",X"C9",X"DD",X"CB",X"00",X"66",X"C0",X"DD",X"36",X"08",X"80",X"DD", + X"CB",X"00",X"E6",X"C9",X"DD",X"36",X"09",X"00",X"DD",X"CB",X"00",X"EE",X"C9",X"DD",X"CB",X"00", + X"76",X"C0",X"DD",X"36",X"0A",X"00",X"DD",X"CB",X"00",X"F6",X"C9",X"DD",X"6E",X"00",X"DD",X"66", + X"01",X"DD",X"23",X"DD",X"23",X"11",X"E0",X"FF",X"24",X"C8",X"25",X"DD",X"7E",X"00",X"FE",X"80", + X"D2",X"02",X"11",X"DD",X"23",X"FE",X"20",X"0E",X"AD",X"28",X"03",X"D6",X"30",X"4F",X"71",X"19", + X"7C",X"E6",X"03",X"C6",X"50",X"67",X"DD",X"7E",X"00",X"FE",X"24",X"20",X"DE",X"DD",X"23",X"C3", + X"CB",X"10",X"DD",X"23",X"D6",X"B0",X"87",X"87",X"4F",X"C6",X"02",X"77",X"23",X"3C",X"77",X"2B", + X"19",X"23",X"D6",X"02",X"77",X"2B",X"18",X"D6",X"7E",X"1F",X"1F",X"1F",X"1F",X"CD",X"28",X"11", + X"7E",X"CD",X"28",X"11",X"2B",X"10",X"F1",X"C9",X"11",X"E0",X"FF",X"FD",X"19",X"E6",X"0F",X"FE", + X"0A",X"38",X"02",X"C6",X"07",X"B7",X"20",X"02",X"0D",X"F0",X"0E",X"FF",X"FD",X"77",X"20",X"C9", + X"21",X"34",X"40",X"01",X"01",X"03",X"FD",X"21",X"40",X"53",X"CD",X"18",X"11",X"21",X"4C",X"40", + X"01",X"01",X"03",X"FD",X"21",X"20",X"52",X"CD",X"18",X"11",X"21",X"3C",X"40",X"01",X"01",X"03", + X"FD",X"21",X"E0",X"50",X"CD",X"18",X"11",X"DD",X"2A",X"26",X"40",X"21",X"DF",X"51",X"DD",X"7E", + X"07",X"3D",X"06",X"05",X"11",X"C0",X"FF",X"3D",X"FA",X"81",X"11",X"36",X"2C",X"05",X"19",X"18", + X"F6",X"05",X"FA",X"8A",X"11",X"36",X"AD",X"19",X"18",X"F7",X"21",X"15",X"40",X"01",X"FF",X"01", + X"FD",X"21",X"7F",X"52",X"CD",X"18",X"11",X"7E",X"FE",X"50",X"3E",X"AD",X"38",X"02",X"3E",X"2D", + X"FD",X"77",X"00",X"C9",X"DD",X"E5",X"FD",X"E5",X"E5",X"D5",X"C5",X"6F",X"26",X"00",X"29",X"11", + X"16",X"42",X"19",X"7E",X"23",X"4E",X"2A",X"26",X"40",X"86",X"27",X"77",X"23",X"79",X"8E",X"27", + X"77",X"23",X"06",X"02",X"3E",X"00",X"8E",X"27",X"77",X"23",X"10",X"F8",X"CD",X"DA",X"11",X"CD", + X"40",X"11",X"C1",X"D1",X"E1",X"FD",X"E1",X"DD",X"E1",X"C9",X"2A",X"26",X"40",X"23",X"23",X"23", + X"11",X"4D",X"40",X"06",X"04",X"1A",X"BE",X"20",X"05",X"2B",X"1B",X"10",X"F8",X"C9",X"D0",X"7E", + X"12",X"2B",X"1B",X"10",X"FA",X"C9",X"DD",X"E5",X"DD",X"21",X"0C",X"19",X"CD",X"CB",X"10",X"21", + X"7D",X"1A",X"11",X"16",X"42",X"01",X"0A",X"00",X"ED",X"B0",X"DD",X"2A",X"26",X"40",X"DD",X"4E", + X"06",X"06",X"05",X"FD",X"21",X"4A",X"51",X"DD",X"21",X"16",X"42",X"FD",X"E5",X"C5",X"DD",X"6E", + X"00",X"DD",X"66",X"01",X"41",X"05",X"FA",X"3B",X"12",X"7D",X"87",X"27",X"6F",X"7C",X"8F",X"27", + X"67",X"38",X"0E",X"DD",X"75",X"00",X"DD",X"74",X"01",X"18",X"EA",X"DD",X"75",X"00",X"DD",X"74", + X"01",X"DD",X"E5",X"E1",X"23",X"01",X"00",X"02",X"CD",X"18",X"11",X"C1",X"FD",X"E1",X"FD",X"23", + X"FD",X"23",X"FD",X"23",X"DD",X"23",X"DD",X"23",X"10",X"C1",X"06",X"C8",X"CD",X"7B",X"00",X"78", + X"CB",X"3F",X"CB",X"3F",X"E6",X"04",X"32",X"53",X"40",X"32",X"55",X"40",X"10",X"EE",X"DD",X"E1", + X"C9",X"2F",X"4F",X"2F",X"DD",X"A6",X"03",X"DD",X"71",X"03",X"2F",X"DD",X"77",X"00",X"DD",X"23", + X"C9",X"DD",X"CB",X"00",X"7E",X"21",X"2C",X"40",X"20",X"03",X"21",X"2F",X"40",X"DD",X"5E",X"00", + X"16",X"00",X"CB",X"BB",X"19",X"7E",X"DD",X"A6",X"01",X"DD",X"23",X"DD",X"23",X"C9",X"5F",X"17", + X"9F",X"57",X"C9",X"B7",X"F0",X"ED",X"44",X"C9",X"B7",X"C8",X"3E",X"01",X"F0",X"3E",X"FF",X"C9", + X"DD",X"E5",X"FD",X"E3",X"DD",X"E1",X"C9",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"ED",X"5B",X"16", + X"40",X"B7",X"ED",X"52",X"11",X"80",X"00",X"19",X"7C",X"B7",X"C9",X"11",X"80",X"FC",X"19",X"7C", + X"B7",X"20",X"14",X"CB",X"3C",X"CB",X"1D",X"CB",X"3C",X"CB",X"1D",X"CB",X"3C",X"CB",X"1D",X"11", + X"F6",X"41",X"19",X"F6",X"FF",X"7E",X"C9",X"AF",X"6F",X"67",X"C9",X"CD",X"FE",X"14",X"C0",X"11", + X"1A",X"50",X"19",X"22",X"1A",X"40",X"E5",X"06",X"15",X"36",X"90",X"2B",X"10",X"FB",X"2A",X"18", + X"40",X"11",X"F8",X"FF",X"19",X"CD",X"CB",X"12",X"4F",X"C5",X"2A",X"18",X"40",X"11",X"08",X"00", + X"19",X"CD",X"CB",X"12",X"C1",X"47",X"C5",X"2A",X"18",X"40",X"CD",X"CB",X"12",X"C1",X"E1",X"5F", + X"B7",X"28",X"08",X"E6",X"7F",X"36",X"7C",X"2B",X"3D",X"20",X"FA",X"7B",X"B1",X"B0",X"28",X"11", + X"79",X"93",X"CD",X"A5",X"13",X"87",X"87",X"57",X"78",X"93",X"CD",X"A5",X"13",X"B2",X"C6",X"80", + X"77",X"2A",X"1A",X"40",X"3A",X"18",X"40",X"E6",X"38",X"3E",X"97",X"28",X"02",X"3E",X"90",X"23", + X"77",X"23",X"23",X"23",X"36",X"90",X"2A",X"16",X"40",X"11",X"00",X"04",X"19",X"CB",X"3C",X"CB", + X"1D",X"EB",X"2A",X"18",X"40",X"B7",X"ED",X"52",X"5D",X"54",X"7C",X"B7",X"01",X"44",X"1A",X"20", + X"13",X"CB",X"7D",X"C2",X"84",X"13",X"7D",X"1F",X"1F",X"E6",X"1E",X"6F",X"26",X"00",X"01",X"24", + X"1A",X"09",X"44",X"4D",X"3A",X"18",X"40",X"2F",X"2A",X"16",X"40",X"CB",X"3C",X"CB",X"1D",X"85", + X"C6",X"80",X"E6",X"F8",X"6F",X"26",X"00",X"29",X"29",X"11",X"1C",X"50",X"19",X"EB",X"60",X"69", + X"ED",X"A0",X"ED",X"A0",X"C9",X"3E",X"01",X"C8",X"3E",X"02",X"D0",X"3E",X"00",X"C9",X"DD",X"E5", + X"4F",X"CD",X"C0",X"13",X"C2",X"03",X"14",X"CD",X"DD",X"13",X"20",X"01",X"71",X"0C",X"18",X"F7", + X"C5",X"CD",X"43",X"0B",X"C1",X"C0",X"DD",X"21",X"06",X"14",X"AF",X"C9",X"DD",X"E5",X"CD",X"C0", + X"13",X"20",X"30",X"CD",X"DD",X"13",X"20",X"02",X"36",X"90",X"0C",X"18",X"F6",X"DD",X"7E",X"00", + X"FE",X"80",X"28",X"1E",X"DD",X"23",X"D5",X"CD",X"9E",X"12",X"19",X"D1",X"7C",X"E6",X"03",X"C6", + X"50",X"67",X"7E",X"FE",X"90",X"C8",X"FE",X"34",X"D8",X"FE",X"3C",X"38",X"03",X"FE",X"E0",X"D8", + X"BF",X"C9",X"E1",X"DD",X"E1",X"C9",X"00",X"01",X"1F",X"01",X"80",X"FD",X"E5",X"C5",X"06",X"09", + X"FD",X"21",X"D6",X"40",X"1E",X"00",X"D5",X"FD",X"7E",X"05",X"FE",X"FF",X"CA",X"79",X"14",X"DD", + X"6E",X"00",X"DD",X"66",X"01",X"FD",X"5E",X"00",X"FD",X"56",X"01",X"C5",X"CD",X"58",X"08",X"C1", + X"B9",X"D2",X"79",X"14",X"DD",X"6E",X"02",X"26",X"00",X"FD",X"5E",X"02",X"54",X"C5",X"CD",X"58", + X"08",X"C1",X"B9",X"30",X"34",X"D1",X"1C",X"D5",X"FD",X"36",X"03",X"00",X"FD",X"7E",X"05",X"FD", + X"36",X"05",X"58",X"FE",X"01",X"1E",X"01",X"28",X"17",X"1D",X"FE",X"02",X"28",X"12",X"FE",X"03", + X"1E",X"02",X"28",X"0C",X"1C",X"FE",X"04",X"28",X"07",X"1C",X"FE",X"05",X"28",X"02",X"18",X"09", + X"7B",X"CD",X"A4",X"11",X"3E",X"05",X"CD",X"45",X"10",X"11",X"08",X"00",X"FD",X"19",X"D1",X"10", + X"95",X"7B",X"B7",X"C1",X"FD",X"E1",X"C9",X"DD",X"E5",X"D5",X"C5",X"DD",X"21",X"D6",X"40",X"06", + X"09",X"11",X"08",X"00",X"CD",X"C1",X"14",X"DD",X"E1",X"AF",X"C9",X"DD",X"E5",X"D5",X"C5",X"DD", + X"21",X"1E",X"41",X"06",X"0A",X"18",X"0A",X"DD",X"E5",X"D5",X"C5",X"DD",X"21",X"78",X"41",X"06", + X"0A",X"11",X"09",X"00",X"CD",X"C1",X"14",X"D9",X"DD",X"36",X"08",X"FF",X"D9",X"DD",X"E1",X"AF", + X"C9",X"E3",X"22",X"20",X"40",X"DD",X"7E",X"05",X"FE",X"FF",X"28",X"0C",X"DD",X"19",X"10",X"F5", + X"E1",X"C1",X"D1",X"DD",X"E1",X"F6",X"FF",X"C9",X"E1",X"C1",X"D1",X"DD",X"22",X"24",X"40",X"DD", + X"75",X"00",X"DD",X"74",X"01",X"DD",X"73",X"02",X"DD",X"36",X"03",X"00",X"DD",X"71",X"04",X"DD", + X"70",X"05",X"D9",X"DD",X"75",X"06",X"DD",X"74",X"07",X"D9",X"2A",X"20",X"40",X"E9",X"22",X"18", + X"40",X"CD",X"BD",X"12",X"C0",X"3A",X"18",X"40",X"2F",X"E6",X"F8",X"6F",X"26",X"00",X"29",X"29", + X"AF",X"C9",X"E5",X"ED",X"5F",X"2A",X"22",X"40",X"8C",X"CE",X"91",X"8E",X"67",X"8D",X"CE",X"BB", + X"0F",X"6F",X"22",X"22",X"40",X"E1",X"C9",X"23",X"AF",X"52",X"3C",X"75",X"12",X"4B",X"4D",X"74", + X"F5",X"EF",X"7B",X"DE",X"00",X"22",X"27",X"30",X"33",X"3A",X"41",X"46",X"4B",X"57",X"60",X"67", + X"73",X"76",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"81",X"82",X"85",X"86",X"87",X"88",X"89",X"8A", + X"8B",X"8C",X"8D",X"8E",X"91",X"92",X"93",X"96",X"97",X"98",X"9A",X"9B",X"9C",X"9E",X"A0",X"A1", + X"A3",X"A5",X"A6",X"A7",X"AE",X"B0",X"B2",X"B4",X"B6",X"B9",X"BC",X"BD",X"BE",X"BF",X"C0",X"C1", + X"C2",X"C3",X"C4",X"C6",X"C7",X"C8",X"C9",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"D0",X"D1",X"D2", + X"D3",X"D4",X"26",X"DD",X"27",X"5B",X"26",X"9D",X"1F",X"1B",X"21",X"FC",X"26",X"FC",X"16",X"BC", + X"1B",X"C7",X"1C",X"07",X"3E",X"87",X"11",X"EF",X"11",X"F0",X"41",X"FA",X"12",X"07",X"12",X"47", + X"11",X"C8",X"11",X"C9",X"36",X"8F",X"36",X"90",X"36",X"91",X"36",X"8A",X"26",X"9C",X"2E",X"8F", + X"2E",X"90",X"3E",X"91",X"2E",X"9C",X"2E",X"8A",X"53",X"FA",X"54",X"3A",X"44",X"7A",X"52",X"BA", + X"57",X"3A",X"14",X"4A",X"17",X"0A",X"BF",X"9A",X"C6",X"95",X"C6",X"98",X"C6",X"94",X"C6",X"81", + X"4F",X"9A",X"36",X"95",X"36",X"98",X"36",X"94",X"36",X"81",X"36",X"97",X"36",X"93",X"36",X"96", + X"36",X"92",X"3F",X"9D",X"6F",X"9A",X"6F",X"BC",X"2F",X"9D",X"6F",X"BC",X"1F",X"8F",X"1F",X"90", + X"1F",X"91",X"1F",X"8A",X"1F",X"9C",X"2F",X"9D",X"6F",X"BC",X"1F",X"8F",X"1F",X"90",X"1F",X"91", + X"1F",X"8A",X"1F",X"9C",X"1F",X"8F",X"1F",X"90",X"1F",X"91",X"1F",X"8D",X"1F",X"9C",X"1F",X"8F", + X"1F",X"90",X"1F",X"91",X"1F",X"8D",X"1F",X"9C",X"4F",X"9A",X"36",X"95",X"36",X"98",X"36",X"94", + X"36",X"81",X"36",X"97",X"36",X"93",X"36",X"96",X"36",X"92",X"1F",X"86",X"1F",X"AB",X"1F",X"AC", + X"1F",X"BE",X"1F",X"95",X"1F",X"98",X"1F",X"94",X"1F",X"81",X"1F",X"97",X"1F",X"93",X"1F",X"96", + X"1F",X"92",X"47",X"47",X"36",X"87",X"5F",X"07",X"13",X"D1",X"14",X"11",X"14",X"51",X"12",X"91", + X"47",X"47",X"36",X"87",X"5F",X"07",X"13",X"D1",X"14",X"11",X"14",X"51",X"12",X"91",X"13",X"DC", + X"14",X"1C",X"12",X"9C",X"12",X"CB",X"13",X"0C",X"3F",X"9D",X"6F",X"9A",X"6F",X"BC",X"57",X"5A", + X"4F",X"1A",X"1F",X"BE",X"1F",X"BE",X"1F",X"BE",X"1F",X"BE",X"BF",X"9A",X"14",X"50",X"13",X"8D", + X"14",X"6A",X"17",X"2A",X"9F",X"9A",X"3E",X"87",X"88",X"5B",X"18",X"59",X"1F",X"BE",X"1F",X"BE", + X"1F",X"BE",X"1F",X"BE",X"1F",X"BE",X"1F",X"BE",X"1F",X"BE",X"1F",X"BE",X"1F",X"BE",X"3F",X"9D", + X"6F",X"9A",X"6F",X"BC",X"1F",X"BE",X"1F",X"BE",X"61",X"FA",X"71",X"E1",X"76",X"E1",X"1F",X"BE", + X"1F",X"BE",X"57",X"5A",X"4F",X"1A",X"1F",X"BE",X"1F",X"BE",X"4F",X"9D",X"3F",X"BC",X"4F",X"9D", + X"3F",X"BC",X"1F",X"BE",X"4F",X"9D",X"3F",X"BC",X"4F",X"9D",X"3F",X"BC",X"1F",X"BE",X"6F",X"9A", + X"47",X"47",X"36",X"87",X"5F",X"07",X"13",X"D1",X"14",X"11",X"14",X"51",X"12",X"91",X"57",X"5A", + X"4F",X"1A",X"4F",X"9D",X"3F",X"BC",X"4F",X"9D",X"3F",X"BC",X"4F",X"9D",X"3F",X"BC",X"3F",X"9D", + X"6F",X"9A",X"6F",X"BC",X"3F",X"9D",X"6F",X"9A",X"6F",X"BC",X"07",X"DF",X"0F",X"9A",X"07",X"DF", + X"0F",X"9A",X"0F",X"BE",X"0F",X"9A",X"0F",X"9A",X"0F",X"9A",X"0F",X"BE",X"0F",X"9A",X"0F",X"BE", + X"07",X"DF",X"0F",X"9F",X"0F",X"9F",X"0F",X"9A",X"07",X"DF",X"07",X"DF",X"0F",X"BE",X"0F",X"9A", + X"0F",X"9A",X"07",X"DF",X"0F",X"9A",X"0F",X"BE",X"07",X"DF",X"0D",X"0D",X"3F",X"A4",X"A5",X"A5", + X"B0",X"0E",X"0F",X"8A",X"10",X"11",X"8B",X"50",X"51",X"52",X"53",X"8C",X"8D",X"8E",X"8F",X"B1", + X"B2",X"B3",X"90",X"B4",X"B5",X"B6",X"B7",X"91",X"B9",X"B8",X"12",X"54",X"40",X"41",X"42",X"43", + X"44",X"92",X"93",X"94",X"95",X"96",X"97",X"98",X"99",X"9A",X"13",X"45",X"A6",X"14",X"A7",X"15", + X"16",X"17",X"18",X"55",X"19",X"A8",X"1A",X"1B",X"1C",X"1D",X"56",X"1E",X"1F",X"20",X"21",X"57", + X"22",X"23",X"24",X"25",X"58",X"9B",X"9C",X"9D",X"9E",X"9F",X"A0",X"A1",X"A2",X"A3",X"26",X"59", + X"59",X"27",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"30",X"46",X"A9",X"5A",X"5B",X"5C", + X"5D",X"31",X"47",X"AA",X"32",X"33",X"34",X"35",X"5E",X"5F",X"60",X"61",X"61",X"36",X"48",X"AB", + X"62",X"BA",X"63",X"64",X"65",X"66",X"49",X"37",X"38",X"39",X"67",X"68",X"4A",X"69",X"6A",X"6B", + X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"3A",X"4B",X"AC",X"74",X"75",X"4C",X"76",X"76", + X"77",X"78",X"79",X"BB",X"7A",X"7B",X"7C",X"BC",X"7D",X"BD",X"7E",X"7F",X"BE",X"80",X"BF",X"81", + X"3B",X"3C",X"4D",X"AD",X"82",X"83",X"84",X"85",X"86",X"C0",X"87",X"C1",X"88",X"C2",X"89",X"C3", + X"3D",X"4E",X"AE",X"3E",X"4F",X"AF",X"3F",X"2F",X"27",X"F3",X"FB",X"D9",X"76",X"00",X"17",X"07", + X"1F",X"0F",X"37",X"40",X"0A",X"1A",X"02",X"12",X"F9",X"B8",X"04",X"03",X"13",X"23",X"33",X"05", + X"AF",X"52",X"5B",X"4F",X"52",X"42",X"49",X"54",X"52",X"4F",X"4E",X"5B",X"24",X"51",X"53",X"20", + X"20",X"20",X"20",X"53",X"49",X"47",X"4E",X"41",X"54",X"52",X"4F",X"4E",X"20",X"55",X"53",X"41", + X"20",X"20",X"20",X"20",X"20",X"24",X"FF",X"FF",X"08",X"53",X"50",X"52",X"45",X"53",X"53",X"20", + X"50",X"4C",X"41",X"59",X"20",X"42",X"55",X"54",X"54",X"4F",X"4E",X"5B",X"24",X"AC",X"52",X"4F", + X"4E",X"45",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"24",X"4E",X"52",X"4F",X"4E",X"4C",X"59", + X"24",X"FF",X"FF",X"0E",X"53",X"4F",X"52",X"20",X"54",X"57",X"4F",X"20",X"50",X"4C",X"41",X"59", + X"45",X"52",X"53",X"24",X"FF",X"FF",X"4E",X"53",X"44",X"45",X"46",X"45",X"4E",X"44",X"20",X"54", + X"48",X"45",X"20",X"50",X"4C",X"41",X"4E",X"45",X"54",X"20",X"46",X"52",X"4F",X"4D",X"24",X"D0", + X"52",X"54",X"48",X"45",X"20",X"41",X"54",X"54",X"41",X"43",X"4B",X"49",X"4E",X"47",X"24",X"D2", + X"52",X"45",X"4E",X"45",X"4D",X"59",X"20",X"41",X"49",X"52",X"46",X"4F",X"52",X"43",X"45",X"24", + X"35",X"53",X"43",X"4F",X"4D",X"50",X"55",X"54",X"45",X"52",X"20",X"53",X"4F",X"46",X"54",X"57", + X"41",X"52",X"45",X"20",X"4C",X"41",X"42",X"4F",X"52",X"41",X"54",X"4F",X"52",X"49",X"45",X"53", + X"20",X"4C",X"54",X"44",X"24",X"FF",X"FF",X"A2",X"B2",X"A8",X"B8",X"A0",X"B0",X"44",X"BB",X"B3", + X"41",X"AB",X"A3",X"80",X"4D",X"45",X"10",X"00",X"6F",X"18",X"08",X"67",X"42",X"52",X"62",X"72", + X"C0",X"20",X"28",X"38",X"14",X"6A",X"17",X"A0",X"53",X"31",X"5B",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"48",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"32",X"5B",X"24",X"7F", + X"53",X"43",X"52",X"45",X"44",X"49",X"54",X"53",X"5B",X"24",X"FF",X"FF",X"86",X"53",X"53",X"43", + X"4F",X"52",X"45",X"53",X"20",X"4E",X"4F",X"57",X"20",X"53",X"45",X"54",X"20",X"41",X"54",X"5B", + X"24",X"A8",X"52",X"45",X"4E",X"45",X"4D",X"59",X"20",X"20",X"20",X"20",X"20",X"20",X"56",X"41", + X"4C",X"55",X"45",X"24",X"8A",X"52",X"54",X"52",X"4F",X"4E",X"53",X"24",X"8D",X"52",X"44",X"49", + X"56",X"45",X"52",X"53",X"24",X"90",X"52",X"42",X"4F",X"4D",X"42",X"45",X"52",X"53",X"24",X"93", + X"52",X"4D",X"49",X"53",X"53",X"49",X"4C",X"45",X"53",X"24",X"96",X"52",X"53",X"4B",X"49",X"4D", + X"4D",X"45",X"52",X"53",X"24",X"FF",X"FF",X"42",X"52",X"50",X"4C",X"41",X"59",X"45",X"52",X"20", + X"4F",X"4E",X"45",X"24",X"FF",X"FF",X"43",X"52",X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"54", + X"57",X"4F",X"24",X"FF",X"FF",X"02",X"53",X"50",X"4C",X"41",X"4E",X"45",X"54",X"20",X"44",X"45", + X"53",X"54",X"52",X"4F",X"59",X"45",X"44",X"24",X"FF",X"FF",X"03",X"A6",X"03",X"A7",X"13",X"A8", + X"A6",X"03",X"A7",X"03",X"A8",X"13",X"88",X"0B",X"89",X"13",X"69",X"0B",X"6A",X"13",X"4A",X"0F", + X"49",X"07",X"29",X"0F",X"28",X"07",X"08",X"0F",X"07",X"03",X"06",X"03",X"05",X"03",X"04",X"03", + X"03",X"03",X"C7",X"02",X"C8",X"02",X"C9",X"02",X"CA",X"02",X"47",X"0A",X"67",X"02",X"87",X"06", + X"88",X"02",X"89",X"02",X"8A",X"12",X"6A",X"02",X"4A",X"0E",X"C7",X"01",X"E7",X"01",X"07",X"02", + X"E8",X"01",X"E9",X"01",X"EA",X"01",X"47",X"09",X"67",X"01",X"87",X"05",X"88",X"01",X"89",X"01", + X"8A",X"11",X"6A",X"01",X"4A",X"0D",X"49",X"01",X"48",X"01",X"C7",X"08",X"E7",X"00",X"07",X"01", + X"08",X"01",X"09",X"01",X"0A",X"01",X"E9",X"00",X"C8",X"00",X"EA",X"10",X"C9",X"0C",X"CA",X"08", + X"47",X"04",X"48",X"0C",X"68",X"00",X"69",X"00",X"6A",X"00",X"87",X"08",X"88",X"10",X"FF",X"FF", + X"82",X"8A",X"89",X"84",X"AD",X"AD",X"AD",X"AD",X"4E",X"AD",X"4C",X"4D",X"AD",X"53",X"AD",X"56", + X"4B",X"57",X"48",X"4A",X"49",X"55",X"AD",X"54",X"AD",X"51",X"52",X"4F",X"50",X"AD",X"AD",X"AD", + X"AD",X"AD",X"90",X"90",X"90",X"90",X"01",X"01",X"01",X"01",X"02",X"02",X"02",X"02",X"02",X"03", + X"03",X"03",X"03",X"03",X"04",X"04",X"04",X"04",X"03",X"03",X"03",X"03",X"03",X"02",X"02",X"02", + X"02",X"02",X"01",X"01",X"01",X"01",X"00",X"00",X"04",X"80",X"00",X"16",X"00",X"00",X"00",X"00", + X"00",X"87",X"1A",X"00",X"03",X"00",X"00",X"00",X"00",X"87",X"1A",X"00",X"03",X"23",X"05",X"54", + X"09",X"42",X"13",X"00",X"18",X"00",X"24",X"03",X"02",X"02",X"1B",X"01",X"00",X"FF",X"B4",X"6E", + X"02",X"02",X"1B",X"01",X"00",X"FF",X"AF",X"8C",X"02",X"02",X"1B",X"01",X"00",X"FF",X"AA",X"50", + X"05",X"03",X"02",X"02",X"1B",X"01",X"00",X"01",X"A0",X"6E",X"02",X"02",X"1B",X"01",X"00",X"01", + X"AF",X"8C",X"05",X"03",X"02",X"02",X"1B",X"01",X"00",X"01",X"B4",X"50",X"05",X"02",X"03",X"01", + X"05",X"02",X"01",X"18",X"02",X"00",X"00",X"0C",X"6E",X"02",X"01",X"18",X"02",X"00",X"00",X"0C", + X"B4",X"01",X"0A",X"02",X"01",X"18",X"01",X"00",X"00",X"14",X"80",X"02",X"01",X"18",X"01",X"00", + X"00",X"10",X"50",X"05",X"03",X"02",X"01",X"18",X"01",X"00",X"00",X"14",X"80",X"02",X"01",X"18", + X"01",X"00",X"00",X"12",X"C8",X"02",X"01",X"18",X"01",X"00",X"00",X"10",X"C8",X"02",X"01",X"18", + X"01",X"00",X"00",X"0E",X"80",X"05",X"02",X"03",X"02",X"03",X"1D",X"01",X"00",X"01",X"0C",X"50", + X"02",X"03",X"1D",X"01",X"00",X"01",X"12",X"5A",X"02",X"03",X"1D",X"01",X"00",X"01",X"0E",X"C8", + X"02",X"03",X"1D",X"02",X"00",X"01",X"16",X"C8",X"05",X"03",X"02",X"03",X"1D",X"01",X"00",X"01", + X"1E",X"64",X"02",X"03",X"1D",X"01",X"00",X"01",X"1A",X"64",X"05",X"02",X"03",X"02",X"04",X"1C", + X"01",X"00",X"01",X"0C",X"32",X"02",X"04",X"1C",X"01",X"00",X"01",X"0C",X"C8",X"05",X"02",X"02", + X"04",X"1C",X"01",X"00",X"FF",X"0C",X"80",X"02",X"04",X"1C",X"01",X"00",X"FF",X"0D",X"50",X"02", + X"04",X"1C",X"01",X"00",X"FF",X"0D",X"C8",X"05",X"02",X"02",X"04",X"1C",X"02",X"00",X"FF",X"0D", + X"32",X"05",X"02",X"02",X"04",X"1C",X"01",X"00",X"01",X"10",X"32",X"01",X"05",X"02",X"04",X"1C", + X"01",X"00",X"FF",X"10",X"C8",X"05",X"03",X"02",X"04",X"1C",X"02",X"00",X"01",X"10",X"80",X"05", + X"02",X"03",X"02",X"05",X"1E",X"01",X"00",X"FF",X"64",X"80",X"02",X"05",X"1E",X"01",X"00",X"FF", + X"96",X"B4",X"02",X"05",X"1E",X"01",X"00",X"FF",X"5A",X"B4",X"02",X"05",X"1E",X"01",X"00",X"FF", + X"10",X"80",X"05",X"03",X"02",X"05",X"1E",X"01",X"00",X"FF",X"20",X"80",X"02",X"05",X"1E",X"01", + X"00",X"01",X"20",X"80",X"01",X"14",X"05",X"02",X"04",X"80",X"01",X"80",X"02",X"81",X"01",X"81", + X"02",X"00",X"08",X"00",X"04",X"00",X"80",X"00",X"40",X"01",X"08",X"01",X"04",X"01",X"80",X"00", + X"20",X"80",X"10",X"81",X"10",X"50",X"00",X"00",X"01",X"50",X"00",X"00",X"01",X"00",X"03",X"00", + X"06",X"00",X"03",X"00",X"06",X"FE",X"0A",X"58",X"0A",X"20",X"0A",X"7C",X"0A",X"90",X"0A",X"58", + X"0A",X"20",X"0A",X"90",X"0A",X"7C",X"0A",X"58",X"14",X"90",X"14",X"3A",X"0A",X"7C",X"0A",X"3A", + X"0A",X"FE",X"0A",X"5A",X"0A",X"7C",X"0A",X"58",X"0A",X"7C",X"0A",X"90",X"0A",X"58",X"14",X"90", + X"FF",X"FF",X"FF",X"FF",X"FE",X"0A",X"58",X"0A",X"38",X"0A",X"80",X"08",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FE",X"0A",X"40",X"0A",X"20",X"0A",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FE",X"08",X"20",X"06",X"90",X"06",X"90",X"06",X"20",X"06",X"90",X"06", + X"20",X"08",X"FF",X"FF",X"FE",X"08",X"20",X"0A",X"90",X"0A",X"90",X"0A",X"7C",X"0A",X"80",X"0A", + X"90",X"1E",X"9C",X"1E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3E",X"1B",X"D1",X"B7",X"3E", + X"2D",X"CA",X"79",X"18",X"7E",X"B7",X"F2",X"79",X"18",X"2F",X"C3",X"79",X"18",X"F5",X"7E",X"B7", + X"FA",X"8B",X"1B",X"CD",X"79",X"18",X"3E",X"3D",X"C3",X"91",X"1B",X"2F",X"CD",X"79",X"18",X"3E", + X"27",X"CD",X"79",X"18",X"F1",X"C2",X"A8",X"1B",X"7E",X"B7",X"21",X"C1",X"21",X"FA",X"A3",X"1B", + X"21",X"F1",X"21",X"7E",X"CD",X"C1",X"18",X"C9",X"D5",X"CD",X"5B",X"1B",X"CD",X"23",X"19",X"D1", + X"C9",X"CD",X"D1",X"18",X"CD",X"77",X"18",X"06",X"00",X"C5",X"E5",X"CD",X"63",X"1B",X"E1",X"C1", + X"04",X"23",X"78",X"FE",X"0B",X"D0",X"FE",X"05",X"DA",X"B9",X"1B",X"CD",X"77",X"18",X"C3",X"B9", + X"1B",X"11",X"35",X"1D",X"21",X"2A",X"1D",X"CD",X"B1",X"1B",X"11",X"45",X"1D",X"21",X"3A",X"1D", + X"CD",X"B1",X"1B",X"CD",X"77",X"18",X"CD",X"20",X"1F",X"F5",X"D5",X"C5",X"CD",X"D6",X"13",X"D2", + X"19",X"1C",X"2A",X"F6",X"21",X"22",X"0C",X"00",X"21",X"10",X"00",X"36",X"FF",X"CD",X"06",X"00", + X"C3",X"63",X"1C",X"0E",X"00",X"FE",X"CB",X"CA",X"12",X"1C",X"FE",X"DD",X"D8",X"E6",X"CF",X"FE", + X"CD",X"C0",X"23",X"7E",X"4F",X"CD",X"C1",X"18",X"C9",X"2B",X"22",X"66",X"21",X"2A",X"F6",X"21", + X"7E",X"CD",X"C1",X"18",X"7E",X"CD",X"03",X"1C",X"23",X"CD",X"3A",X"19",X"DA",X"63",X"1C",X"F5", + X"CD",X"77",X"18",X"F1",X"B3",X"CA",X"4A",X"1C",X"5E",X"23",X"56",X"79",X"FE",X"36",X"C2",X"44", + X"1C",X"7A",X"53",X"5F",X"CD",X"EA",X"18",X"C3",X"63",X"1C",X"7E",X"CD",X"C1",X"18",X"2A",X"F6", + X"21",X"7E",X"E6",X"C7",X"FE",X"00",X"C2",X"63",X"1C",X"23",X"5E",X"16",X"00",X"2B",X"19",X"EB", + X"CD",X"EA",X"18",X"2A",X"F6",X"21",X"7E",X"47",X"E6",X"C0",X"FE",X"80",X"C2",X"7A",X"1C",X"78", + X"E6",X"07",X"FE",X"06",X"C2",X"26",X"1D",X"C3",X"A7",X"1C",X"FE",X"40",X"C2",X"97",X"1C",X"78", + X"FE",X"76",X"CA",X"26",X"1D",X"E6",X"07",X"FE",X"06",X"CA",X"B3",X"1C",X"78",X"E6",X"38",X"FE", + X"30",X"C2",X"26",X"1D",X"C3",X"B3",X"1C",X"78",X"FE",X"36",X"CA",X"B3",X"1C",X"FE",X"34",X"CA", + X"A7",X"1C",X"FE",X"35",X"C2",X"B9",X"1C",X"3E",X"3D",X"CD",X"79",X"18",X"2A",X"F4",X"21",X"7E", + X"CD",X"C1",X"18",X"2A",X"F4",X"21",X"C3",X"CC",X"1C",X"E6",X"E7",X"FE",X"02",X"C2",X"E0",X"1C", + X"78",X"E6",X"10",X"2A",X"EC",X"21",X"C2",X"CC",X"1C",X"2A",X"EE",X"21",X"3A",X"4A",X"21",X"B7", + X"C2",X"26",X"1D",X"EB",X"CD",X"F3",X"20",X"CA",X"26",X"1D",X"CD",X"F9",X"18",X"C3",X"26",X"1D", + X"78",X"FE",X"CB",X"C2",X"F4",X"1C",X"2A",X"AE",X"21",X"7E",X"E6",X"07",X"FE",X"06",X"C2",X"26", + X"1D",X"C3",X"B3",X"1C",X"E6",X"DD",X"FE",X"DD",X"C2",X"26",X"1D",X"2A",X"AE",X"21",X"7E",X"FE", + X"39",X"CA",X"26",X"1D",X"FE",X"34",X"DA",X"26",X"1D",X"FE",X"CC",X"CA",X"26",X"1D",X"23",X"5E", + X"16",X"00",X"78",X"FE",X"DD",X"CA",X"1F",X"1D",X"FD",X"E5",X"E1",X"19",X"C3",X"CC",X"1C",X"DD", + X"E5",X"E1",X"19",X"C3",X"CC",X"1C",X"C1",X"D1",X"F1",X"C9",X"43",X"5A",X"4D",X"45",X"49",X"41", + X"42",X"44",X"48",X"53",X"50",X"F6",X"F4",X"FC",X"FA",X"FE",X"BC",X"A5",X"B2",X"BA",X"B6",X"BE", + X"BD",X"BB",X"B7",X"58",X"59",X"C6",X"C4",X"C2",X"C0",X"BE",X"01",X"07",X"08",X"03",X"05",X"21", + X"00",X"00",X"22",X"54",X"21",X"AF",X"32",X"53",X"21",X"C9",X"F3",X"22",X"F4",X"21",X"E1",X"2B", + X"22",X"F6",X"21",X"F5",X"21",X"02",X"00",X"39",X"F1",X"31",X"F4",X"21",X"E5",X"F5",X"C5",X"D5", + X"21",X"00",X"00",X"39",X"31",X"C2",X"21",X"08",X"F5",X"08",X"D9",X"C5",X"D5",X"E5",X"D9",X"DD", + X"E5",X"FD",X"E5",X"F9",X"00",X"00",X"00",X"FB",X"2A",X"F6",X"21",X"7E",X"FE",X"FF",X"F5",X"E5", + X"3A",X"20",X"21",X"32",X"44",X"21",X"21",X"40",X"21",X"0E",X"08",X"E5",X"7E",X"B7",X"CA",X"A8", + X"1D",X"23",X"5E",X"23",X"56",X"23",X"7E",X"12",X"E1",X"11",X"FC",X"FF",X"19",X"0D",X"C2",X"9B", + X"1D",X"CD",X"FD",X"1E",X"21",X"56",X"21",X"7E",X"36",X"00",X"B7",X"CA",X"CB",X"1D",X"3D",X"47", + X"23",X"5E",X"23",X"56",X"23",X"7E",X"12",X"78",X"C3",X"BA",X"1D",X"E1",X"F1",X"CA",X"EF",X"1D", + X"23",X"22",X"F6",X"21",X"EB",X"21",X"B5",X"0E",X"4E",X"23",X"46",X"CD",X"17",X"11",X"DA",X"EF", + X"1D",X"CD",X"4F",X"1D",X"2A",X"51",X"21",X"EB",X"3E",X"82",X"B7",X"37",X"C3",X"55",X"11",X"3A", + X"23",X"21",X"B7",X"C2",X"94",X"1E",X"21",X"24",X"21",X"0E",X"08",X"E5",X"7E",X"B7",X"CA",X"51", + X"1E",X"23",X"7E",X"23",X"56",X"2A",X"F6",X"21",X"BD",X"C2",X"51",X"1E",X"7A",X"BC",X"C2",X"51", + X"1E",X"E1",X"7E",X"3D",X"C2",X"1F",X"1E",X"F5",X"3D",X"32",X"23",X"21",X"C3",X"36",X"1E",X"77", + X"F5",X"CD",X"CA",X"1E",X"FE",X"02",X"CA",X"36",X"1E",X"3A",X"4A",X"21",X"B7",X"CA",X"36",X"1E", + X"CD",X"20",X"1F",X"C3",X"55",X"11",X"CD",X"D1",X"18",X"F1",X"3C",X"CD",X"C1",X"18",X"21",X"C3", + X"1E",X"CD",X"86",X"18",X"2A",X"F6",X"21",X"EB",X"CD",X"EA",X"18",X"CD",X"D1",X"1B",X"C3",X"55", + X"11",X"E1",X"11",X"04",X"00",X"19",X"0D",X"C2",X"FB",X"1D",X"CD",X"DB",X"18",X"C2",X"94",X"1E", + X"CD",X"CA",X"1E",X"CA",X"7C",X"1E",X"3D",X"C2",X"70",X"1E",X"CD",X"20",X"1F",X"C3",X"55",X"11", + X"2A",X"F6",X"21",X"CD",X"0C",X"19",X"CD",X"D1",X"1B",X"C3",X"55",X"11",X"3A",X"44",X"21",X"B7", + X"CA",X"94",X"1E",X"2A",X"48",X"21",X"4D",X"44",X"2A",X"46",X"21",X"EB",X"3A",X"45",X"21",X"B7", + X"37",X"C3",X"55",X"11",X"CD",X"D1",X"18",X"CD",X"FD",X"1E",X"21",X"00",X"00",X"22",X"4F",X"21", + X"CD",X"4F",X"1D",X"32",X"23",X"21",X"3E",X"2A",X"CD",X"79",X"18",X"2A",X"F6",X"21",X"CD",X"D6", + X"13",X"D2",X"B7",X"1E",X"22",X"0C",X"00",X"CD",X"E9",X"18",X"2A",X"F4",X"21",X"22",X"64",X"21", + X"C3",X"16",X"0F",X"20",X"50",X"41",X"53",X"53",X"20",X"00",X"21",X"53",X"21",X"7E",X"B7",X"C8", + X"E5",X"2A",X"54",X"21",X"2B",X"22",X"54",X"21",X"7C",X"B5",X"E1",X"C2",X"E3",X"1E",X"77",X"3D", + X"32",X"23",X"21",X"7E",X"B7",X"C9",X"11",X"13",X"00",X"21",X"CD",X"20",X"7E",X"A0",X"23",X"BE", + X"23",X"CA",X"F9",X"1E",X"14",X"1D",X"C2",X"EC",X"1E",X"5A",X"16",X"00",X"C9",X"3A",X"20",X"21", + X"21",X"20",X"42",X"97",X"06",X"10",X"77",X"23",X"10",X"FC",X"CD",X"7B",X"00",X"21",X"40",X"58", + X"06",X"3F",X"AF",X"77",X"23",X"10",X"FB",X"21",X"4E",X"40",X"01",X"80",X"00",X"3E",X"00",X"77", + X"23",X"0B",X"78",X"B1",X"C2",X"1D",X"20",X"01",X"00",X"04",X"3E",X"AD",X"21",X"00",X"50",X"77", + X"23",X"0B",X"32",X"32",X"42",X"AF",X"B0",X"B1",X"3A",X"32",X"42",X"C2",X"2F",X"20",X"CD",X"7A", + X"23",X"3E",X"04",X"21",X"01",X"58",X"06",X"20",X"CD",X"16",X"21",X"3E",X"00",X"06",X"20",X"21", + X"00",X"58",X"CD",X"16",X"21",X"06",X"20",X"21",X"4E",X"40",X"3E",X"00",X"77",X"23",X"23",X"10", + X"F9",X"06",X"20",X"21",X"4F",X"40",X"3E",X"04",X"77",X"23",X"23",X"10",X"FB",X"CD",X"7A",X"23", + X"CD",X"1E",X"21",X"CD",X"40",X"22",X"CD",X"6F",X"22",X"CD",X"C7",X"22",X"CD",X"7A",X"23",X"21", + X"F8",X"52",X"DD",X"21",X"72",X"24",X"CD",X"CE",X"22",X"CD",X"7A",X"23",X"21",X"FA",X"52",X"DD", + X"21",X"83",X"24",X"CD",X"CE",X"22",X"CD",X"6F",X"22",X"CD",X"6F",X"22",X"CD",X"39",X"22",X"3E", + X"B0",X"32",X"38",X"42",X"AF",X"32",X"3A",X"42",X"32",X"42",X"42",X"CD",X"00",X"22",X"3A",X"38", + X"42",X"FE",X"B0",X"CA",X"BB",X"20",X"3E",X"B0",X"C3",X"C3",X"20",X"3E",X"AD",X"21",X"FF",X"8F", + X"CD",X"59",X"22",X"32",X"38",X"42",X"3A",X"3A",X"42",X"3C",X"32",X"3A",X"42",X"FE",X"28",X"F2", + X"E3",X"20",X"CD",X"00",X"22",X"3A",X"38",X"42",X"FE",X"AD",X"C2",X"AE",X"20",X"CD",X"E7",X"20", + X"C3",X"AE",X"20",X"CD",X"6F",X"22",X"C9",X"F5",X"C5",X"E5",X"21",X"FF",X"4F",X"CD",X"59",X"22", + X"3A",X"42",X"42",X"FE",X"00",X"C2",X"F9",X"20",X"3C",X"3C",X"32",X"42",X"42",X"21",X"21",X"58", + X"06",X"10",X"CD",X"16",X"21",X"3A",X"42",X"42",X"FE",X"07",X"C2",X"12",X"21",X"3E",X"01",X"32", + X"42",X"42",X"E1",X"C1",X"F1",X"C9",X"77",X"23",X"23",X"05",X"C2",X"16",X"21",X"C9",X"21",X"40", + X"50",X"22",X"3C",X"42",X"3E",X"04",X"32",X"36",X"42",X"3E",X"1B",X"32",X"40",X"42",X"3E",X"B1", + X"32",X"34",X"42",X"CD",X"88",X"21",X"2A",X"3C",X"42",X"11",X"21",X"00",X"19",X"22",X"3C",X"42", + X"21",X"40",X"42",X"35",X"35",X"CD",X"4A",X"22",X"3A",X"36",X"42",X"3D",X"32",X"36",X"42",X"C2", + X"2E",X"21",X"00",X"DD",X"21",X"C3",X"23",X"FD",X"21",X"F1",X"23",X"FD",X"7E",X"00",X"FE",X"FF", + X"C8",X"32",X"34",X"42",X"FE",X"AD",X"CC",X"4A",X"22",X"FD",X"7E",X"01",X"32",X"40",X"42",X"DD", + X"7E",X"00",X"6F",X"DD",X"7E",X"01",X"67",X"FD",X"23",X"FD",X"23",X"DD",X"23",X"DD",X"23",X"22", + X"3C",X"42",X"CD",X"88",X"21",X"C3",X"5B",X"21",X"2A",X"3C",X"42",X"22",X"3E",X"42",X"3E",X"01", + X"32",X"32",X"42",X"CD",X"EB",X"21",X"2A",X"3C",X"42",X"22",X"3E",X"42",X"3E",X"20",X"32",X"32", + X"42",X"CD",X"EB",X"21",X"01",X"00",X"00",X"3A",X"40",X"42",X"4F",X"16",X"05",X"CB",X"21",X"CB", + X"10",X"15",X"C2",X"AD",X"21",X"2A",X"3C",X"42",X"09",X"22",X"3E",X"42",X"3E",X"01",X"32",X"32", + X"42",X"21",X"40",X"42",X"34",X"CD",X"EB",X"21",X"21",X"40",X"42",X"35",X"2A",X"3C",X"42",X"3A", + X"40",X"42",X"11",X"00",X"00",X"5F",X"19",X"22",X"3E",X"42",X"3E",X"20",X"32",X"32",X"42",X"21", + X"40",X"42",X"34",X"CD",X"EB",X"21",X"21",X"40",X"42",X"35",X"C9",X"2A",X"3E",X"42",X"3A",X"40", + X"42",X"47",X"3A",X"34",X"42",X"77",X"16",X"00",X"3A",X"32",X"42",X"5F",X"19",X"10",X"F3",X"C9", + X"21",X"30",X"51",X"22",X"3C",X"42",X"3E",X"07",X"32",X"36",X"42",X"3E",X"0F",X"32",X"40",X"42", + X"3A",X"38",X"42",X"32",X"34",X"42",X"CD",X"88",X"21",X"2A",X"3C",X"42",X"11",X"21",X"00",X"19", + X"22",X"3C",X"42",X"21",X"40",X"42",X"35",X"35",X"21",X"02",X"00",X"CD",X"EE",X"02",X"3A",X"36", + X"42",X"3D",X"32",X"36",X"42",X"C2",X"10",X"22",X"C9",X"CD",X"E7",X"22",X"CD",X"23",X"23",X"C9", + X"11",X"AD",X"23",X"01",X"1F",X"24",X"CD",X"29",X"23",X"C9",X"F5",X"E5",X"21",X"FF",X"08",X"2B", + X"AF",X"B4",X"B5",X"C2",X"4F",X"22",X"E1",X"F1",X"C9",X"F5",X"2B",X"AF",X"B4",X"B5",X"C2",X"5A", + X"22",X"F1",X"C9",X"16",X"20",X"CD",X"7A",X"23",X"15",X"AF",X"B2",X"C8",X"C3",X"65",X"22",X"F5", + X"E5",X"21",X"30",X"00",X"CD",X"EE",X"02",X"E1",X"F1",X"C9",X"DD",X"6E",X"00",X"DD",X"66",X"01", + X"DD",X"23",X"DD",X"23",X"11",X"E0",X"FF",X"24",X"C8",X"25",X"DD",X"7E",X"00",X"FE",X"80",X"D2", + X"B1",X"22",X"DD",X"23",X"FE",X"20",X"0E",X"10",X"28",X"03",X"D6",X"30",X"4F",X"71",X"19",X"7C", + X"E6",X"03",X"C6",X"50",X"67",X"DD",X"7E",X"00",X"FE",X"24",X"20",X"DE",X"DD",X"23",X"C3",X"7A", + X"22",X"DD",X"23",X"D6",X"B0",X"87",X"87",X"4F",X"C6",X"02",X"77",X"23",X"3C",X"77",X"2B",X"19", + X"23",X"D6",X"02",X"77",X"2B",X"18",X"D6",X"21",X"F6",X"52",X"DD",X"21",X"60",X"24",X"DD",X"7E", + X"00",X"FE",X"FF",X"C8",X"FE",X"20",X"CA",X"DC",X"22",X"D6",X"30",X"77",X"11",X"20",X"00",X"B7", + X"ED",X"52",X"DD",X"23",X"C3",X"CE",X"22",X"00",X"3E",X"AD",X"0E",X"04",X"21",X"00",X"50",X"06", + X"FF",X"77",X"23",X"10",X"FC",X"0D",X"C2",X"EF",X"22",X"C9",X"00",X"C3",X"FA",X"22",X"2A",X"32", + X"42",X"3A",X"34",X"42",X"47",X"3A",X"36",X"42",X"77",X"23",X"05",X"C2",X"05",X"23",X"C9",X"2A", + X"32",X"42",X"3A",X"34",X"42",X"47",X"3A",X"36",X"42",X"77",X"C5",X"01",X"20",X"00",X"09",X"C1", + X"10",X"F7",X"C9",X"01",X"27",X"24",X"11",X"3D",X"24",X"1A",X"FE",X"FF",X"CA",X"4E",X"23",X"32", + X"32",X"42",X"0A",X"6F",X"03",X"0A",X"67",X"22",X"34",X"42",X"03",X"3A",X"32",X"42",X"77",X"13", + X"C5",X"01",X"20",X"00",X"B7",X"ED",X"42",X"C1",X"1A",X"FE",X"FF",X"C2",X"3E",X"23",X"13",X"1A", + X"FE",X"FF",X"CA",X"5F",X"23",X"2A",X"34",X"42",X"23",X"22",X"34",X"42",X"C3",X"3E",X"23",X"13", + X"1A",X"FE",X"FF",X"C8",X"C3",X"2F",X"23",X"0A",X"6F",X"03",X"0A",X"67",X"03",X"1A",X"13",X"FE", + X"24",X"C8",X"06",X"30",X"90",X"77",X"23",X"C3",X"6D",X"23",X"00",X"F5",X"C5",X"D5",X"E5",X"CD", + X"7B",X"00",X"06",X"20",X"21",X"00",X"58",X"CD",X"16",X"21",X"E1",X"D1",X"C1",X"F1",X"C9",X"2E", + X"FF",X"FF",X"FF",X"43",X"4F",X"4D",X"53",X"4F",X"46",X"54",X"20",X"47",X"41",X"4D",X"45",X"53", + X"20",X"47",X"52",X"4F",X"55",X"50",X"24",X"CE",X"51",X"63",X"53",X"65",X"53",X"AD",X"A2",X"A6", + X"A4",X"FF",X"A3",X"A1",X"A7",X"A5",X"FF",X"AA",X"A8",X"AE",X"AC",X"FF",X"AB",X"A9",X"AF",X"AD", + X"FF",X"FF",X"FF",X"C4",X"50",X"40",X"50",X"E5",X"50",X"61",X"50",X"06",X"51",X"82",X"50",X"27", + X"51",X"A3",X"50",X"48",X"51",X"C4",X"50",X"69",X"51",X"E5",X"50",X"8A",X"51",X"06",X"51",X"AB", + X"51",X"27",X"51",X"CC",X"51",X"48",X"51",X"69",X"51",X"8A",X"51",X"AB",X"51",X"CC",X"51",X"48", + X"51",X"B0",X"13",X"AD",X"1B",X"B6",X"11",X"AD",X"19",X"B6",X"0F",X"AD",X"17",X"B4",X"0D",X"AD", + X"15",X"B3",X"0B",X"AD",X"13",X"B1",X"09",X"AD",X"11",X"B7",X"07",X"AD",X"0F",X"B7",X"05",X"AD", + X"0D",X"B5",X"03",X"AD",X"0B",X"AD",X"09",X"AD",X"07",X"AD",X"05",X"FF",X"FF",X"FF",X"FF",X"2C", + X"52",X"4C",X"52",X"6C",X"52",X"8C",X"52",X"06",X"53",X"07",X"53",X"78",X"FE",X"01",X"38",X"16", + X"28",X"24",X"FE",X"03",X"38",X"14",X"28",X"16",X"FE",X"05",X"38",X"FF",X"FF",X"9E",X"9C",X"C2", + X"C0",X"C2",X"C0",X"C7",X"CA",X"C8",X"C2",X"C0",X"9E",X"9C",X"CE",X"CC",X"FF",X"9F",X"9D",X"C3", + X"C1",X"C6",X"C4",X"C5",X"CB",X"C9",X"C3",X"C1",X"9F",X"9D",X"CF",X"CD",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"92",X"49",X"24",X"92",X"4A",X"20", + X"09",X"24",X"11",X"24",X"82",X"49",X"04",X"01",X"08",X"08",X"01",X"04",X"90",X"90",X"92",X"12", + X"04",X"42",X"10",X"40",X"2A",X"AA",X"AA",X"AA",X"AA",X"AA",X"A8",X"00",X"10",X"09",X"04",X"49", + X"12",X"24",X"89",X"24",X"92",X"49",X"22",X"48",X"88",X"49",X"24",X"90",X"10",X"90",X"89",X"04", + X"24",X"92",X"09",X"12",X"40",X"09",X"24",X"92",X"12",X"21",X"01",X"12",X"24",X"88",X"90",X"49", + X"12",X"21",X"11",X"22",X"40",X"92",X"21",X"09",X"24",X"90",X"91",X"10",X"02",X"12",X"41",X"12", + X"49",X"12",X"24",X"08",X"81",X"24",X"12",X"21",X"20",X"20",X"22",X"42",X"10",X"81",X"20",X"00", + X"24",X"00",X"08",X"08",X"81",X"04",X"02",X"10",X"00",X"04",X"91",X"11",X"08",X"90",X"01",X"20", + X"00",X"84",X"84",X"20",X"00",X"22",X"08",X"12",X"04",X"48",X"08",X"84",X"08",X"08",X"90",X"82", + X"12",X"40",X"01",X"22",X"21",X"09",X"24",X"80",X"20",X"00",X"48",X"44",X"89",X"02",X"40",X"44", + X"48",X"00",X"08",X"04",X"22",X"10",X"12",X"00",X"84",X"24",X"92",X"01",X"10",X"92",X"40",X"80", + X"00",X"01",X"00",X"88",X"81",X"21",X"24",X"80",X"91",X"24",X"08",X"09",X"20",X"20",X"08",X"48", + X"20",X"04",X"89",X"01",X"20",X"08",X"04",X"90",X"12",X"21",X"11",X"20",X"40",X"12",X"41",X"12", + X"41",X"00",X"40",X"48",X"40",X"48",X"80",X"02",X"10",X"00",X"92",X"42",X"10",X"44",X"40",X"40", + X"42",X"49",X"04",X"88",X"92",X"40",X"12",X"01",X"00",X"24",X"91",X"01",X"10",X"00",X"80",X"09", + X"24",X"48",X"42",X"44",X"21",X"08",X"84",X"80",X"42",X"10",X"80",X"90",X"00",X"01",X"20",X"00", + X"04",X"48",X"80",X"92",X"49",X"24",X"90",X"24",X"00",X"00",X"00",X"08",X"92",X"24",X"22",X"04", + X"89",X"24",X"10",X"91",X"01",X"20",X"82",X"44",X"91",X"00",X"88",X"11",X"10",X"84",X"82",X"24", + X"82",X"08",X"92",X"22",X"48",X"01",X"08",X"49",X"10",X"88",X"48",X"42",X"49",X"24",X"92",X"10", + X"49",X"24",X"44",X"80",X"84",X"11",X"01",X"02",X"10",X"48",X"40",X"92",X"22",X"04",X"00",X"80", + X"04",X"04",X"04",X"41",X"01",X"09",X"09",X"24",X"00",X"40",X"11",X"20",X"01",X"02",X"21",X"02", + X"10",X"80",X"20",X"84",X"20",X"20",X"02",X"21",X"10",X"82",X"21",X"04",X"48",X"42",X"21",X"08", + X"44",X"00",X"00",X"00",X"00",X"02",X"00",X"48",X"08",X"11",X"04",X"88",X"49",X"10",X"49",X"20", + X"04",X"40",X"00",X"20",X"10",X"90",X"01",X"20",X"02",X"21",X"09",X"20",X"84",X"24",X"90",X"20", + X"01",X"02",X"20",X"42",X"10",X"09",X"20",X"80",X"40",X"41",X"08",X"89",X"08",X"90",X"20",X"88", + X"00",X"92",X"04",X"24",X"04",X"21",X"04",X"90",X"92",X"42",X"49",X"09",X"04",X"01",X"00",X"22", + X"40",X"88",X"80",X"00",X"84",X"00",X"88",X"10",X"88",X"24",X"22",X"11",X"09",X"22",X"12",X"12", + X"04",X"00",X"24",X"92",X"49",X"24",X"82",X"49",X"21",X"20",X"40",X"01",X"09",X"11",X"12",X"21", + X"00",X"82",X"44",X"80",X"80",X"24",X"02",X"02",X"42",X"08",X"10",X"12",X"08",X"42",X"12",X"24", + X"81",X"04",X"92",X"22",X"49",X"04",X"80",X"90",X"24",X"10",X"84",X"01",X"02",X"04",X"00",X"00", + X"00",X"00",X"00",X"08",X"84",X"20",X"10",X"02",X"00",X"00",X"20",X"24",X"80",X"80",X"00",X"92", + X"04",X"00",X"21",X"11",X"04",X"92",X"02",X"44",X"80",X"81",X"10",X"82",X"12",X"10",X"91",X"24", + X"84",X"92",X"24",X"80",X"49",X"24",X"49",X"24",X"92",X"24",X"22",X"12",X"41",X"24",X"24",X"92", + X"49",X"20",X"08",X"11",X"04",X"20",X"10",X"10",X"81",X"08",X"40",X"08",X"49",X"20",X"91",X"00", + X"AA",X"AA",X"AA",X"AA",X"AA",X"49",X"24",X"20",X"01",X"00",X"01",X"02",X"40",X"84",X"11",X"01", + X"22",X"48",X"02",X"09",X"00",X"40",X"12",X"12",X"01",X"00",X"84",X"20",X"40",X"40",X"42",X"48", + X"10",X"00",X"08",X"41",X"11",X"01",X"04",X"42",X"49",X"12",X"41",X"04",X"00",X"09",X"24",X"20", + X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"40",X"02",X"10",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0B",X"01",X"0E",X"00",X"BE",X"C2",X"16",X"08",X"21",X"2F",X"0C",X"C3",X"61",X"0A",X"23",X"0D", + X"C2",X"0C",X"08",X"0E",X"0C",X"BE",X"CA",X"05",X"0A",X"23",X"0D",X"C2",X"1D",X"08",X"FE",X"C3", + X"CA",X"B6",X"08",X"FE",X"CD",X"CA",X"AD",X"08",X"0E",X"04",X"BE",X"CA",X"C3",X"09",X"23",X"0D", + X"C2",X"32",X"08",X"E6",X"C0",X"FE",X"40",X"CA",X"6D",X"09",X"FE",X"80",X"CA",X"52",X"09",X"7A", + X"E6",X"C7",X"D6",X"04",X"CA",X"49",X"09",X"3D",X"CA",X"43",X"09",X"3D",X"CA",X"3A",X"09",X"7A", + X"E6",X"C0",X"CA",X"DB",X"08",X"7A",X"E6",X"07",X"CA",X"CF",X"08",X"D6",X"02",X"CA",X"B6",X"08", + X"D6",X"02",X"CA",X"AD",X"08",X"D6",X"03",X"CA",X"95",X"08",X"7A",X"E6",X"0A",X"C2",X"9F",X"0A", + X"7A",X"E6",X"07",X"4F",X"3D",X"21",X"E5",X"0C",X"09",X"CD",X"33",X"07",X"CD",X"55",X"07",X"FE"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/build_id.tcl b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_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/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/build_id.v b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/build_id.v new file mode 100644 index 00000000..55315735 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180103" +`define BUILD_TIME "164536" diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c07d2629 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1093 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..6bd576cf --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..ee217402 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2026 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..679730ab --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80as.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80as.vhd new file mode 100644 index 00000000..fe477f50 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/cpu/T80as.vhd @@ -0,0 +1,283 @@ +------------------------------------------------------------------------------ +-- t80as.vhd : The non-tristate signal edition of t80a.vhd +-- +-- 2003.2.7 non-tristate modification by Tatsuyuki Satoh +-- +-- 1.separate 'D' to 'DO' and 'DI'. +-- 2.added 'DOE' to 'DO' enable signal.(data direction) +-- 3.MREQ_n,IORQ_n,RD_n,WR_n,RFSH_n,A doesn't become the condition of 'Z'. +-- +-- There is a mark of "--AS" in all the change points. +-- +------------------------------------------------------------------------------ + +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80as is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); +--AS-- D : inout std_logic_vector(7 downto 0) +--AS>> + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + DOE : out std_logic +--< 'Z'); +--AS-- D <= DO when Write = '1' and BUSAK_n_i = '1' else (others => 'Z'); +--AS>> + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DOE <= Write when BUSAK_n_i = '1' else '0'; +--< Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, +-- DInst => D, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then +--AS-- DI_Reg <= to_x01(D); +--AS>> + DI_Reg <= to_x01(DI); +--< 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/dac.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/dac.vhd new file mode 100644 index 00000000..b1ecdcb7 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_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 := 11 + ); + 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/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/dpram.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..dafe8385 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/galaxian.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/galaxian.vhd new file mode 100644 index 00000000..b881e738 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/galaxian.vhd @@ -0,0 +1,446 @@ +------------------------------------------------------------------------------ +-- FPGA GALAXIAN +-- +-- Version downto 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important not +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +-- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--use work.pkg_galaxian.all; + +entity galaxian is + port( + W_CLK_18M : in std_logic; + W_CLK_12M : in std_logic; + W_CLK_6M : in std_logic; + + P1_CSJUDLR : in std_logic_vector(6 downto 0); + P2_CSJUDLR : in std_logic_vector(6 downto 0); + I_RESET : in std_logic; + + W_R : out std_logic_vector(2 downto 0); + W_G : out std_logic_vector(2 downto 0); + W_B : out std_logic_vector(2 downto 0); + HBLANK : out std_logic; + VBLANK : out std_logic; + W_H_SYNC : out std_logic; + W_V_SYNC : out std_logic; + W_SDAT_A : out std_logic_vector( 7 downto 0); + W_SDAT_B : out std_logic_vector( 7 downto 0); + O_CMPBL : out std_logic + ); +end; + +architecture RTL of galaxian is + -- CPU ADDRESS BUS + signal W_A : std_logic_vector(15 downto 0) := (others => '0'); + -- CPU IF + signal W_CPU_CLK : std_logic := '0'; + signal W_CPU_MREQn : std_logic := '0'; + signal W_CPU_NMIn : std_logic := '0'; + signal W_CPU_RDn : std_logic := '0'; + signal W_CPU_RFSHn : std_logic := '0'; + signal W_CPU_WAITn : std_logic := '0'; + signal W_CPU_WRn : std_logic := '0'; + signal W_CPU_WR : std_logic := '0'; + signal W_RESETn : std_logic := '0'; + -------- H and V COUNTER ------------------------- + signal W_C_BLn : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_C_BLXn : std_logic := '0'; + signal W_H_BL : std_logic := '0'; + signal W_H_SYNC_int : std_logic := '0'; + signal W_V_BLn : std_logic := '0'; + signal W_V_BL2n : std_logic := '0'; + signal W_V_SYNC_int : std_logic := '0'; + signal W_H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal W_V_CNT : std_logic_vector(7 downto 0) := (others => '0'); + -------- CPU RAM ---------------------------- + signal W_CPU_RAM_DO : std_logic_vector(7 downto 0) := (others => '0'); + -------- ADDRESS DECDER ---------------------- + signal W_BD_G : std_logic := '0'; + signal W_CPU_RAM_CS : std_logic := '0'; + signal W_CPU_RAM_RD : std_logic := '0'; +-- signal W_CPU_RAM_WR : std_logic := '0'; + signal W_CPU_ROM_CS : std_logic := '0'; + signal W_DIP_OE : std_logic := '0'; + signal W_H_FLIP : std_logic := '0'; + signal W_DRIVER_WE : std_logic := '0'; + signal W_OBJ_RAM_RD : std_logic := '0'; + signal W_OBJ_RAM_RQ : std_logic := '0'; + signal W_OBJ_RAM_WR : std_logic := '0'; + signal W_PITCH : std_logic := '0'; + signal W_SOUND_WE : std_logic := '0'; + signal W_STARS_ON : std_logic := '0'; + signal W_STARS_OFFn : std_logic := '0'; + signal W_SW0_OE : std_logic := '0'; + signal W_SW1_OE : std_logic := '0'; + signal W_V_FLIP : std_logic := '0'; + signal W_VID_RAM_RD : std_logic := '0'; + signal W_VID_RAM_WR : std_logic := '0'; + signal W_WDR_OE : std_logic := '0'; + --------- INPORT ----------------------------- + signal W_SW_DO : std_logic_vector( 7 downto 0) := (others => '0'); + --------- VIDEO ----------------------------- + signal W_VID_DO : std_logic_vector( 7 downto 0) := (others => '0'); + ----- DATA I/F ------------------------------------- + signal W_CPU_ROM_DO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_ROM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_RAM_CLK : std_logic := '0'; + signal W_VOL1 : std_logic := '0'; + signal W_VOL2 : std_logic := '0'; + signal W_FIRE : std_logic := '0'; + signal W_HIT : std_logic := '0'; + signal W_FS : std_logic_vector( 2 downto 0) := (others => '0'); + + signal blx_comb : std_logic := '0'; + signal W_1VF : std_logic := '0'; + signal W_256HnX : std_logic := '0'; + signal W_8HF : std_logic := '0'; + signal W_DAC_A : std_logic := '0'; + signal W_DAC_B : std_logic := '0'; + signal W_MISSILEn : std_logic := '0'; + signal W_SHELLn : std_logic := '0'; + signal W_MS_D : std_logic := '0'; + signal W_MS_R : std_logic := '0'; + signal W_MS_G : std_logic := '0'; + signal W_MS_B : std_logic := '0'; + + signal new_sw : std_logic_vector( 2 downto 0) := (others => '0'); + signal in_game : std_logic_vector( 1 downto 0) := (others => '0'); + signal ROM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal rst_count : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_STARS_B : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_G : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_R : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VIDEO_B : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_G : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_R : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_WAV_A0 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A1 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A2 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D2 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_DAC : std_logic_vector( 3 downto 0) := (others => '0'); + +begin + mc_vid : entity work.MC_VIDEO + port map( + I_CLK_18M => W_CLK_18M, + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT => W_H_CNT, + I_V_CNT => W_V_CNT, + I_H_FLIP => W_H_FLIP, + I_V_FLIP => W_V_FLIP, + I_V_BLn => W_V_BLn, + I_C_BLn => W_C_BLn, + I_A => W_A(9 downto 0), + I_OBJ_SUB_A => "000", + I_BD => W_BDI, + I_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + I_OBJ_RAM_RD => W_OBJ_RAM_RD, + I_OBJ_RAM_WR => W_OBJ_RAM_WR, + I_VID_RAM_RD => W_VID_RAM_RD, + I_VID_RAM_WR => W_VID_RAM_WR, + I_DRIVER_WR => W_DRIVER_WE, + O_C_BLnX => W_C_BLnX, + O_8HF => W_8HF, + O_256HnX => W_256HnX, + O_1VF => W_1VF, + O_MISSILEn => W_MISSILEn, + O_SHELLn => W_SHELLn, + O_BD => W_VID_DO, + O_VID => W_VID, + O_COL => W_COL + ); + + cpu : entity work.T80as + port map ( + RESET_n => W_RESETn, + CLK_n => W_CPU_CLK, + WAIT_n => W_CPU_WAITn, + INT_n => '1', + NMI_n => W_CPU_NMIn, + BUSRQ_n => '1', + MREQ_n => W_CPU_MREQn, + RD_n => W_CPU_RDn, + WR_n => W_CPU_WRn, + RFSH_n => W_CPU_RFSHn, + A => W_A, + DI => W_BDO, + DO => W_BDI, + M1_n => open, + IORQ_n => open, + HALT_n => open, + BUSAK_n => open, + DOE => open + ); + + mc_cpu_ram : entity work.MC_CPU_RAM + port map ( + I_CLK => W_CPU_RAM_CLK, + I_ADDR => W_A(9 downto 0), + I_D => W_BDI, + I_WE => W_CPU_WR, + I_OE => W_CPU_RAM_RD, + O_D => W_CPU_RAM_DO + ); + + mc_adec : entity work.MC_ADEC + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_CPU_CLK => W_CPU_CLK, + I_RSTn => W_RESETn, + + I_CPU_A => W_A, + I_CPU_D => W_BDI(0), + I_MREQn => W_CPU_MREQn, + I_RFSHn => W_CPU_RFSHn, + I_RDn => W_CPU_RDn, + I_WRn => W_CPU_WRn, + I_H_BL => W_H_BL, + I_V_BLn => W_V_BLn, + + O_WAITn => W_CPU_WAITn, + O_NMIn => W_CPU_NMIn, + O_CPU_ROM_CS => W_CPU_ROM_CS, + O_CPU_RAM_RD => W_CPU_RAM_RD, +-- O_CPU_RAM_WR => W_CPU_RAM_WR, + O_CPU_RAM_CS => W_CPU_RAM_CS, + O_OBJ_RAM_RD => W_OBJ_RAM_RD, + O_OBJ_RAM_WR => W_OBJ_RAM_WR, + O_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + O_VID_RAM_RD => W_VID_RAM_RD, + O_VID_RAM_WR => W_VID_RAM_WR, + O_SW0_OE => W_SW0_OE, + O_SW1_OE => W_SW1_OE, + O_DIP_OE => W_DIP_OE, + O_WDR_OE => W_WDR_OE, + O_DRIVER_WE => W_DRIVER_WE, + O_SOUND_WE => W_SOUND_WE, + O_PITCH => W_PITCH, + O_H_FLIP => W_H_FLIP, + O_V_FLIP => W_V_FLIP, + O_BD_G => W_BD_G, + O_STARS_ON => W_STARS_ON + ); + + -- active high buttons + mc_inport : entity work.MC_INPORT + port map ( + I_COIN1 => P1_CSJUDLR(6), + I_COIN2 => P2_CSJUDLR(6), + I_1P_START => P1_CSJUDLR(5), + I_2P_START => P2_CSJUDLR(5), + I_1P_SH => P1_CSJUDLR(4), + I_2P_SH => P2_CSJUDLR(4), + I_1P_LE => P1_CSJUDLR(1), + I_2P_LE => P2_CSJUDLR(1), + I_1P_RI => P1_CSJUDLR(0), + I_2P_RI => P2_CSJUDLR(0), + I_SW0_OE => W_SW0_OE, + I_SW1_OE => W_SW1_OE, + I_DIP_OE => W_DIP_OE, + O_D => W_SW_DO + ); + + mc_hv : entity work.MC_HV_COUNT + port map( + I_CLK => W_CLK_6M, + I_RSTn => W_RESETn, + O_H_CNT => W_H_CNT, + O_H_SYNC => W_H_SYNC_int, + O_H_BL => W_H_BL, + O_V_CNT => W_V_CNT, + O_V_SYNC => W_V_SYNC_int, + O_V_BL2n => W_V_BL2n, + O_V_BLn => W_V_BLn, + O_C_BLn => W_C_BLn + ); + + mc_col_pal : entity work.MC_COL_PAL + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_VID => W_VID, + I_COL => W_COL, + I_C_BLnX => W_C_BLnX, + O_C_BLXn => W_C_BLXn, + O_STARS_OFFn => W_STARS_OFFn, + O_R => W_VIDEO_R, + O_G => W_VIDEO_G, + O_B => W_VIDEO_B + ); + + mc_stars : entity work.MC_STARS + port map ( + I_CLK_18M => W_CLK_18M, + I_CLK_6M => W_CLK_6M, + I_H_FLIP => W_H_FLIP, + I_V_SYNC => W_V_SYNC_int, + I_8HF => W_8HF, + I_256HnX => W_256HnX, + I_1VF => W_1VF, + I_2V => W_V_CNT(1), + I_STARS_ON => W_STARS_ON, + I_STARS_OFFn => W_STARS_OFFn, + O_R => W_STARS_R, + O_G => W_STARS_G, + O_B => W_STARS_B, + O_NOISE => open + ); + + mc_sound_a : entity work.MC_SOUND_A + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT1 => W_H_CNT(1), + I_BD => W_BDI, + I_PITCH => W_PITCH, + I_VOL1 => W_VOL1, + I_VOL2 => W_VOL2, + O_SDAT => W_SDAT_A, + O_DO => open + ); + + vmc_sound_b : entity work.MC_SOUND_B + port map( + I_CLK1 => W_CLK_6M, + I_RSTn => rst_count(3), + I_SW => new_sw, + I_DAC => W_DAC, + I_FS => W_FS, + O_SDAT => W_SDAT_B + ); + +--------- ROM ------------------------------------------------------- + mc_roms : entity work.ROM_PGM_0 + port map ( + CLK => W_CLK_12M, + ADDR => W_A(13 downto 0), + DATA => W_CPU_ROM_DO + ); + +-------- VIDEO ----------------------------- + blx_comb <= not ( W_C_BLXn and W_V_BL2n ); + W_V_SYNC <= not W_V_SYNC_int; + W_H_SYNC <= not W_H_SYNC_int; + O_CMPBL <= W_C_BLnX; + + -- MISSILE => Yellow ; + -- SHELL => White ; + W_MS_D <= not (W_MISSILEn and W_SHELLn); + W_MS_R <= not blx_comb and W_MS_D; + W_MS_G <= not blx_comb and W_MS_D; + W_MS_B <= not blx_comb and W_MS_D and not W_SHELLn ; + + W_R <= W_VIDEO_R or (W_STARS_R & "0") or (W_MS_R & W_MS_R & "0"); + W_G <= W_VIDEO_G or (W_STARS_G & "0") or (W_MS_G & W_MS_G & "0"); + W_B <= W_VIDEO_B or (W_STARS_B & "0") or (W_MS_B & W_MS_B & "0"); + + process(W_CLK_6M) + begin + if rising_edge(W_CLK_6M) then + HBLANK <= not W_C_BLXn; + VBLANK <= not W_V_BL2n; + end if; + end process; + + +----- CPU I/F ------------------------------------- + + W_CPU_CLK <= W_H_CNT(0); + W_CPU_RAM_CLK <= W_CLK_12M and W_CPU_RAM_CS; + + W_CPU_ROM_DOB <= W_CPU_ROM_DO when W_CPU_ROM_CS = '1' else (others=>'0'); + + W_RESETn <= not I_RESET; + W_BDO <= W_SW_DO or W_VID_DO or W_CPU_RAM_DO or W_CPU_ROM_DOB ; + W_CPU_WR <= not W_CPU_WRn; + + new_sw <= (W_FS(2) or W_FS(1) or W_FS(0)) & W_HIT & W_FIRE; + + process(W_CPU_CLK, I_RESET) + begin + if (I_RESET = '1') then + rst_count <= (others => '0'); + elsif rising_edge( W_CPU_CLK) then + if ( rst_count /= x"f") then + rst_count <= rst_count + 1; + end if; + end if; + end process; + +----- Parts 9L --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_FS <= (others=>'0'); + W_HIT <= '0'; + W_FIRE <= '0'; + W_VOL1 <= '0'; + W_VOL2 <= '0'; + elsif rising_edge(W_CLK_12M) then + if (W_SOUND_WE = '1') then + case(W_A(2 downto 0)) is + when "000" => W_FS(0) <= W_BDI(0); + when "001" => W_FS(1) <= W_BDI(0); + when "010" => W_FS(2) <= W_BDI(0); + when "011" => W_HIT <= W_BDI(0); +-- when "100" => UNUSED <= W_BDI(0); + when "101" => W_FIRE <= W_BDI(0); + when "110" => W_VOL1 <= W_BDI(0); + when "111" => W_VOL2 <= W_BDI(0); + when others => null; + end case; + end if; + end if; + end process; + +----- Parts 9M --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_DAC <= (others=>'0'); + elsif rising_edge(W_CLK_12M) then + if (W_DRIVER_WE = '1') then + case(W_A(2 downto 0)) is + -- next 4 outputs go off board via ULN2075 buffer +-- when "000" => 1P START <= W_BDI(0); +-- when "001" => 2P START <= W_BDI(0); +-- when "010" => COIN LOCK <= W_BDI(0); +-- when "011" => COIN CTR <= W_BDI(0); + when "100" => W_DAC(0) <= W_BDI(0); -- 1M + when "101" => W_DAC(1) <= W_BDI(0); -- 470K + when "110" => W_DAC(2) <= W_BDI(0); -- 220K + when "111" => W_DAC(3) <= W_BDI(0); -- 100K + when others => null; + end case; + end if; + end if; + end process; + +------------------------------------------------------------------------------- +end RTL; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/hq2x.sv b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_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/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/keyboard.v b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_adec.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_adec.vhd new file mode 100644 index 00000000..7245ce8c --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_adec.vhd @@ -0,0 +1,251 @@ +--------------------------------------------------------------------- +-- FPGA GALAXIAN ADDRESS DECDER +-- +-- Version : 2.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +--------------------------------------------------------------------- +-- +--GALAXIAN Address Map +-- +-- Address Item(R..read-mode W..wight-mode) Parts +--0000 - 1FFF CPU-ROM..R ( 7H or 7K ) +--2000 - 3FFF CPU-ROM..R ( 7L ) +--4000 - 47FF CPU-RAM..RW ( 7N & 7P ) +--5000 - 57FF VID-RAM..RW +--5800 - 5FFF OBJ-RAM..RW +--6000 - SW0..R LAMP......W +--6800 - SW1..R SOUND.....W +--7000 - DIP..R +--7001 NMI_ON....W +--7004 STARS_ON..W +--7006 H_FLIP....W +--7007 V-FLIP....W +--7800 WDR..R PITCH.....W +-- +--W MODE +--6000 1P START +--6001 2P START +--6002 COIN LOCKOUT +--6003 COIN COUNTER +--6004 - 6007 SOUND CONTROL(OSC) +-- +--6800 SOUND CONTROL(FS1) +--6801 SOUND CONTROL(FS2) +--6802 SOUND CONTROL(FS3) +--6803 SOUND CONTROL(HIT) +--6805 SOUND CONTROL(SHOT) +--6806 SOUND CONTROL(VOL1) +--6807 SOUND CONTROL(VOL2) +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_ADEC is + port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_CPU_CLK : in std_logic; + I_RSTn : in std_logic; + + I_CPU_A : in std_logic_vector(15 downto 0); + I_CPU_D : in std_logic; + I_MREQn : in std_logic; + I_RFSHn : in std_logic; + I_RDn : in std_logic; + I_WRn : in std_logic; + I_H_BL : in std_logic; + I_V_BLn : in std_logic; + + O_WAITn : out std_logic; + O_NMIn : out std_logic; + O_CPU_ROM_CS : out std_logic; + O_CPU_RAM_RD : out std_logic; + O_CPU_RAM_WR : out std_logic; + O_CPU_RAM_CS : out std_logic; + O_OBJ_RAM_RD : out std_logic; + O_OBJ_RAM_WR : out std_logic; + O_OBJ_RAM_RQ : out std_logic; + O_VID_RAM_RD : out std_logic; + O_VID_RAM_WR : out std_logic; + O_SW0_OE : out std_logic; + O_SW1_OE : out std_logic; + O_DIP_OE : out std_logic; + O_WDR_OE : out std_logic; + O_DRIVER_WE : out std_logic; + O_SOUND_WE : out std_logic; + O_PITCH : out std_logic; + O_H_FLIP : out std_logic; + O_V_FLIP : out std_logic; + O_BD_G : out std_logic; + O_STARS_ON : out std_logic + ); +end; + +architecture RTL of MC_ADEC is + signal W_8E1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8E2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8P_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8M_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_9N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_NMI_ONn : std_logic := '0'; + -------- CPU WAITn ---------------------------------------------- +-- signal W_6S1_Q : std_logic := '0'; + signal W_6S1_Qn : std_logic := '0'; +-- signal W_6S2_Qn : std_logic := '0'; + + signal W_V_BL : std_logic := '0'; + +begin + W_NMI_ONn <= W_9N_Q(1); -- galaxian + +-- O_WAITn <= '1' ; -- No Wait + O_WAITn <= W_6S1_Qn; + + process(I_CPU_CLK, I_V_BLn) + begin + if (I_V_BLn = '0') then +-- W_6S1_Q <= '0'; + W_6S1_Qn <= '1'; + elsif rising_edge(I_CPU_CLK) then +-- W_6S1_Q <= not (I_H_BL or W_8P_Q(2)); + W_6S1_Qn <= I_H_BL or W_8P_Q(2); + end if; + end process; + +-- process(I_CPU_CLK) +-- begin +-- if falling_edge(I_CPU_CLK) then +-- W_6S2_Qn <= not W_6S1_Q; +-- end if; +-- end process; + +-------- CPU NMIn ----------------------------------------------- + W_V_BL <= not I_V_BLn; + process(W_V_BL, W_NMI_ONn) + begin + if (W_NMI_ONn = '0') then + O_NMIn <= '1'; + elsif rising_edge(W_V_BL) then + O_NMIn <= '0'; + end if; + end process; + + ------------------------------------------------------------------- + u_8e1 : entity work.LOGIC_74XX139 + port map ( + I_G => I_MREQn, + I_Sel(1) => I_CPU_A(15), + I_Sel(0) => I_CPU_A(14), + O_Q => W_8E1_Q + ); + + ---------- CPU_ROM CS 0000 - 3FFF --------------------------- + u_8e2 : entity work.LOGIC_74XX139 + port map ( + I_G => I_RDn, + I_Sel(1) => W_8E1_Q(0), + I_Sel(0) => I_CPU_A(13), + O_Q => W_8E2_Q + ); + + O_CPU_ROM_CS <= not (W_8E2_Q(0) and W_8E2_Q(1) ) ; -- 0000 - 3FFF + ------------------------------------------------------------------- + -- ADDRESS + -- W_8E1_Q[0] = 0000 - 3FFF ---- CPU_ROM_USE + -- W_8E1_Q[1] = 4000 - 7FFF ---- GALAXIAN USE *1 + -- W_8E1_Q[2] = 8000 - BFFF ---- MOONCREST USE + -- W_8E1_Q[3] = C000 - FFFF + + u_8p : entity work.LOGIC_74XX138 + port map ( + I_G1 => I_RFSHn, + I_G2a => W_8E1_Q(1), -- <= *1 + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8P_Q + ); + + u_8n : entity work.LOGIC_74XX138 + port map ( + I_G1 => '1', + I_G2a => I_RDn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8N_Q + ); + + u_8m : entity work.LOGIC_74XX138 + port map ( + -- I_G1 => W_6S2_Qn, + I_G1 => '1', -- No Wait + I_G2a => I_WRn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8M_Q + ); + + O_BD_G <= not (W_8E1_Q(0) and W_8P_Q(0)); + O_OBJ_RAM_RQ <= not W_8P_Q(3); + + O_CPU_RAM_CS <= not (W_8N_Q(0) and W_8M_Q(0)); + + O_WDR_OE <= not W_8N_Q(7); + O_DIP_OE <= not W_8N_Q(6); + O_SW1_OE <= not W_8N_Q(5); + O_SW0_OE <= not W_8N_Q(4); + O_OBJ_RAM_RD <= not W_8N_Q(3); + O_VID_RAM_RD <= not W_8N_Q(2); +-- UNUSED <= not W_8N_Q(1); + O_CPU_RAM_RD <= not W_8N_Q(0); + + O_PITCH <= not W_8M_Q(7); +-- STARS_ON_ENA <= not W_8M_Q(6); + O_SOUND_WE <= not W_8M_Q(5); + O_DRIVER_WE <= not W_8M_Q(4); + O_OBJ_RAM_WR <= not W_8M_Q(3); + O_VID_RAM_WR <= not W_8M_Q(2); +-- UNUSED <= not W_8M_Q(1); + O_CPU_RAM_WR <= not W_8M_Q(0); + + ----- Parts 9N --------- + + process(I_CLK_12M, I_RSTn) + begin + if (I_RSTn = '0') then + W_9N_Q <= (others => '0'); + elsif rising_edge(I_CLK_12M) then + if (W_8M_Q(6) = '0') then + case I_CPU_A(2 downto 0) is + when "000" => W_9N_Q(0) <= I_CPU_D; + when "001" => W_9N_Q(1) <= I_CPU_D; + when "010" => W_9N_Q(2) <= I_CPU_D; + when "011" => W_9N_Q(3) <= I_CPU_D; + when "100" => W_9N_Q(4) <= I_CPU_D; + when "101" => W_9N_Q(5) <= I_CPU_D; + when "110" => W_9N_Q(6) <= I_CPU_D; + when "111" => W_9N_Q(7) <= I_CPU_D; + when others => null; + end case; + end if; + end if; + end process; + + O_STARS_ON <= W_9N_Q(4); + O_H_FLIP <= W_9N_Q(6); + O_V_FLIP <= W_9N_Q(7); + +end RTL; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_bram.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_bram.vhd new file mode 100644 index 00000000..a6df1ce1 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_bram.vhd @@ -0,0 +1,182 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA & GALAXIAN +-- FPGA BLOCK RAM I/F (XILINX SPARTAN) +-- +-- Version : 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- mc_col_rom(6L) added by k.Degawa +-- +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. K.Degawa +-- 2004- 9-18 added Xilinx Device K.Degawa +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_top.v use +entity MC_CPU_RAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(9 downto 0); + I_D : in std_logic_vector(7 downto 0); + I_WE : in std_logic; + I_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) + ); +end; +architecture RTL of MC_CPU_RAM is + + signal W_D : std_logic_vector(7 downto 0) := (others => '0'); +begin + O_D <= W_D when I_OE ='1' else (others=>'0'); + + ram_inst : work.spram generic map(10,8) + port map + ( + address => I_ADDR, + clock => I_CLK, + data => I_D, + wren => I_WE, + q => W_D + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_OBJ_RAM is + port( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(7 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(7 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); + end; + +architecture RTL of MC_OBJ_RAM is +begin + + ram_inst : work.dpram generic map(8,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_VID_RAM is + port ( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(9 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(9 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of MC_VID_RAM is +begin + ram_inst : work.dpram generic map(10,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_LRAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(7 downto 0); + I_D : in std_logic_vector(4 downto 0); + I_WE : in std_logic; + O_Dn : out std_logic_vector(4 downto 0) + ); +end; + +architecture RTL of MC_LRAM is + signal W_D : std_logic_vector(4 downto 0) := (others => '0'); +begin + + O_Dn <= not W_D; + + ram_inst : work.dpram generic map(8,5) + port map + ( + clock_a => I_CLK, + address_a => I_ADDR, + data_a => I_D, + wren_a => not I_WE, + + clock_b => not I_CLK, + address_b => I_ADDR, + data_b => (others => '0'), + q_b => W_D, + enable_b => '1', + wren_b => '0' + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_clocks.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_clocks.vhd new file mode 100644 index 00000000..014e6f7a --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_clocks.vhd @@ -0,0 +1,88 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA CLOCK GEN +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +----------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library unisim; + use unisim.vcomponents.all; + +entity CLOCKGEN is +port ( + CLKIN_IN : in std_logic; + RST_IN : in std_logic; + -- + O_CLK_24M : out std_logic; + O_CLK_18M : out std_logic; + O_CLK_12M : out std_logic; + O_CLK_06M : out std_logic +); +end; + +architecture RTL of CLOCKGEN is + signal state : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr1 : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr2 : std_logic_vector(2 downto 0) := (others => '0'); + signal CLKFB_IN : std_logic := '0'; + signal CLK0_BUF : std_logic := '0'; + signal CLKFX_BUF : std_logic := '0'; + signal CLK_72M : std_logic := '0'; + signal I_DCM_LOCKED : std_logic := '0'; + +begin + dcm_inst : DCM_SP + generic map ( + CLKFX_MULTIPLY => 9, + CLKFX_DIVIDE => 4, + CLKIN_PERIOD => 31.25 + ) + port map ( + CLKIN => CLKIN_IN, + CLKFB => CLKFB_IN, + RST => RST_IN, + CLK0 => CLK0_BUF, + CLKFX => CLKFX_BUF, + LOCKED => I_DCM_LOCKED + ); + + BUFG0 : BUFG port map (I=> CLK0_BUF, O => CLKFB_IN); + BUFG1 : BUFG port map (I=> CLKFX_BUF, O => CLK_72M); + O_CLK_06M <= ctr2(2); + O_CLK_12M <= ctr2(1); + O_CLK_24M <= ctr2(0); + O_CLK_18M <= ctr1(1); + + -- generate all clocks, 36Mhz, 18Mhz, 24Mhz, 12Mhz and 6Mhz + process(CLK_72M) + begin + if rising_edge(CLK_72M) then + if (I_DCM_LOCKED = '0') then + state <= "00"; + ctr1 <= (others=>'0'); + ctr2 <= (others=>'0'); + else + ctr1 <= ctr1 + 1; + case state is + when "00" => state <= "01"; ctr2 <= ctr2 + 1; + when "01" => state <= "10"; ctr2 <= ctr2 + 1; + when "10" => state <= "00"; + when "11" => state <= "00"; + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_col_pal.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_col_pal.vhd new file mode 100644 index 00000000..c4dc06ad --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_col_pal.vhd @@ -0,0 +1,78 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA COLOR-PALETTE +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-18 added Xilinx Device. K.Degawa +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; +-- use ieee.numeric_std.all; + +--library UNISIM; +-- use UNISIM.Vcomponents.all; + +entity MC_COL_PAL is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_VID : in std_logic_vector(1 downto 0); + I_COL : in std_logic_vector(2 downto 0); + I_C_BLnX : in std_logic; + + O_C_BLXn : out std_logic; + O_STARS_OFFn : out std_logic; + O_R : out std_logic_vector(2 downto 0); + O_G : out std_logic_vector(2 downto 0); + O_B : out std_logic_vector(2 downto 0) +); +end; + +architecture RTL of MC_COL_PAL is + --- Parts 6M -------------------------------------------------------- + signal W_COL_ROM_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6M_DI : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_DO : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_CLR : std_logic := '0'; + +begin + W_6M_DI <= I_COL(2 downto 0) & I_VID(1 downto 0) & not (I_VID(0) or I_VID(1)) & I_C_BLnX; + W_6M_CLR <= W_6M_DI(0) or W_6M_DO(0); + O_C_BLXn <= W_6M_DI(0) or W_6M_DO(0); + O_STARS_OFFn <= W_6M_DO(1); + +--always@(posedge I_CLK_6M or negedge W_6M_CLR) + process(I_CLK_6M, W_6M_CLR) + begin + if (W_6M_CLR = '0') then + W_6M_DO <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + W_6M_DO <= W_6M_DI; + end if; + end process; + + --- COL ROM -------------------------------------------------------- +--wire W_COL_ROM_OEn = W_6M_DO[1]; + + galaxian_6l : entity work.GALAXIAN_6L + port map ( + CLK => I_CLK_12M, + ADDR => W_6M_DO(6 downto 2), + DATA => W_COL_ROM_DO + ); + + --- VID OUT -------------------------------------------------------- + O_R <= W_COL_ROM_DO(2 downto 0); + O_G <= W_COL_ROM_DO(5 downto 3); + O_B <= W_COL_ROM_DO(7 downto 6) & "0"; + +end; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_hv_count.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_hv_count.vhd new file mode 100644 index 00000000..f310321b --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_hv_count.vhd @@ -0,0 +1,145 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA H & V COUNTER +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 +----------------------------------------------------------------------- +-- MoonCrest hv_count +-- H_CNT 0 - 255 , 384 - 511 Total 384 count +-- V_CNT 0 - 255 , 504 - 511 Total 264 count +------------------------------------------------------------------------------------------- +-- H_CNT[0], H_CNT[1], H_CNT[2], H_CNT[3], H_CNT[4], H_CNT[5], H_CNT[6], H_CNT[7], H_CNT[8], +-- 1 H 2 H 4 H 8 H 16 H 32 H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT[0], V_CNT[1], V_CNT[2], V_CNT[3], V_CNT[4], V_CNT[5], V_CNT[6], V_CNT[7] +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_HV_COUNT is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + O_H_CNT : out std_logic_vector(8 downto 0); + O_H_SYNC : out std_logic; + O_H_BL : out std_logic; + O_V_BL2n : out std_logic; + O_V_CNT : out std_logic_vector(7 downto 0); + O_V_SYNC : out std_logic; + O_V_BLn : out std_logic; + O_C_BLn : out std_logic + ); +end; + +architecture RTL of MC_HV_COUNT is + signal H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal V_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal H_SYNC : std_logic := '0'; + signal H_CLK : std_logic := '0'; + signal H_BL : std_logic := '0'; + signal V_BLn : std_logic := '0'; + signal V_BL2n : std_logic := '0'; + +begin +--------- H_COUNT ---------------------------------------- + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if (H_CNT = 255) then + H_CNT <= std_logic_vector(to_unsigned(384, H_CNT'length)); + else + H_CNT <= H_CNT + 1 ; + end if; + end if; + end process; + + O_H_CNT <= H_CNT; + +--------- H_SYNC ---------------------------------------- + H_CLK <= H_CNT(4); + process(H_CLK, H_CNT(8)) + begin + if (H_CNT(8) = '0') then + H_SYNC <= '0'; + elsif rising_edge(H_CLK) then + H_SYNC <= (not H_CNT(6) ) and H_CNT(5); + end if; + end process; + + O_H_SYNC <= H_SYNC; + +--------- H_BL ------------------------------------------ + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if H_CNT = 387 then + H_BL <= '1'; + elsif H_CNT = 503 then + H_BL <= '0'; + end if; + end if; + end process; + + O_H_BL <= H_BL; + +--------- V_COUNT ---------------------------------------- + process(H_SYNC, I_RSTn) + begin + if (I_RSTn = '0') then + V_CNT <= (others => '0'); + elsif rising_edge(H_SYNC) then + if (V_CNT = 255) then + V_CNT <= std_logic_vector(to_unsigned(504, V_CNT'length)); + else + V_CNT <= V_CNT + 1 ; + end if; + end if; + end process; + + O_V_CNT <= V_CNT(7 downto 0); + O_V_SYNC <= V_CNT(8); + +--------- V_BLn ------------------------------------------ + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BLn <= '0'; + elsif V_CNT(7 downto 0) = 15 then + V_BLn <= '1'; + end if; + end if; + end process; + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BL2n <= '0'; + elsif V_CNT(7 downto 0) = 16 then + V_BL2n <= '1'; + end if; + end if; + end process; + + O_V_BLn <= V_BLn; + O_V_BL2n <= V_BL2n; +------- C_BLn ------------------------------------------ + O_C_BLn <= V_BLn and (not H_CNT(8)); + +end; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_inport.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_inport.vhd new file mode 100644 index 00000000..596db956 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_inport.vhd @@ -0,0 +1,74 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA INPORT +-- +-- Version : 1.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004-4-30 galaxian modify by K.DEGAWA +----------------------------------------------------------------------- + +-- DIP SW 0 1 2 3 4 5 +----------------------------------------------------------------- +-- COIN CHUTE +-- 1 COIN/1 PLAY 1'b0 1'b0 +-- 2 COIN/1 PLAY 1'b1 1'b0 +-- 1 COIN/2 PLAY 1'b0 1'b1 +-- FREE PLAY 1'b1 1'b1 +-- BOUNS +-- 1'b0 1'b0 +-- 1'b1 1'b0 +-- 1'b0 1'b1 +-- 1'b1 1'b1 +-- LIVES +-- 2 1'b0 +-- 3 1'b1 +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_INPORT is +port ( + I_COIN1 : in std_logic; -- active high + I_COIN2 : in std_logic; -- active high + I_1P_LE : in std_logic; -- active high + I_1P_RI : in std_logic; -- active high + I_1P_SH : in std_logic; -- active high + I_2P_LE : in std_logic; + I_2P_RI : in std_logic; + I_2P_SH : in std_logic; + I_1P_START : in std_logic; -- active high + I_2P_START : in std_logic; -- active high + I_SW0_OE : in std_logic; + I_SW1_OE : in std_logic; + I_DIP_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) +); + +end; + +architecture RTL of MC_INPORT is + + constant W_TABLE : std_logic := '1'; -- UP = 0; + constant W_TEST : std_logic := '0'; + constant W_SERVICE : std_logic := '0'; + + signal W_SW0_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SW1_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_DIP_DO : std_logic_vector(7 downto 0) := (others => '0'); + +begin + + W_SW0_DO <= x"00" when I_SW0_OE = '0' else I_2P_LE & I_2P_RI & I_2P_RI & I_1P_SH & I_1P_LE & I_1P_RI & I_COIN2 & I_COIN1; + W_SW1_DO <= x"00" when I_SW1_OE = '0' else I_2P_LE & "1" & "0" & I_1P_SH & I_1P_LE & I_1P_RI & I_2P_START & I_1P_START; + W_DIP_DO <= x"00" when I_DIP_OE = '0' else "0000" & W_TABLE & "000"; + O_D <= W_SW0_DO or W_SW1_DO or W_DIP_DO ; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_ld_pls.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_ld_pls.vhd new file mode 100644 index 00000000..0945fe35 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_ld_pls.vhd @@ -0,0 +1,115 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA VIDEO-LD_PLS_GEN +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_LD_PLS is + port ( + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_3D_DI : in std_logic; + + O_LDn : out std_logic; + O_CNTRLDn : out std_logic; + O_CNTRCLRn : out std_logic; + O_COLLn : out std_logic; + O_VPLn : out std_logic; + O_OBJDATALn : out std_logic; + O_MLDn : out std_logic; + O_SLDn : out std_logic + ); +end; + +architecture RTL of MC_LD_PLS is + signal W_4C1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C1_Q3 : std_logic := '0'; + signal W_4C2_B : std_logic := '0'; + signal W_4D1_G : std_logic := '0'; + signal W_4D1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4D2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_5C_Q : std_logic := '0'; + signal W_HCNT : std_logic := '0'; +begin + O_LDn <= W_4D1_G; + O_CNTRLDn <= W_4D1_Q(2); + O_CNTRCLRn <= W_4D1_Q(0); + O_COLLn <= W_4D2_Q(2); + O_VPLn <= W_4D2_Q(0); + O_OBJDATALn <= W_4C1_Q(2); + O_MLDn <= W_4C2_Q(0); + O_SLDn <= W_4C2_Q(1); + W_4D1_G <= not (I_H_CNT(0) and I_H_CNT(1) and I_H_CNT(2)); + W_HCNT <= not (I_H_CNT(6) and I_H_CNT(5) and I_H_CNT(4) and I_H_CNT(3)); + -- Parts 4D + u_4d1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_G, + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q =>W_4D1_Q + ); + + u_4d2 : entity work.LOGIC_74XX139 + port map( + I_G => W_5C_Q, + I_Sel(1) => I_H_CNT(2), + I_Sel(0) => I_H_CNT(1), + O_Q => W_4D2_Q + ); + + -- Parts 4C + u_4c1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D2_Q(1), + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q => W_4C1_Q + ); + + u_4c2 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_Q(3), + I_Sel(1) => W_4C2_B, + I_Sel(0) => W_HCNT, + O_Q => W_4C2_Q + ); + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_5C_Q <= I_H_CNT(0); + end if; + end process; + + -- 2004-9-22 added + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + W_4C1_Q3 <= W_4C1_Q(3); + end if; + end process; + + process(W_4C1_Q3) + begin + if rising_edge(W_4C1_Q3) then + W_4C2_B <= I_3D_DI; + end if; + end process; + +end RTL; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_logic.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_logic.vhd new file mode 100644 index 00000000..5dae8a87 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_logic.vhd @@ -0,0 +1,92 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA LOGIC IP MODULE +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx138 +-- 3-to-8 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX138 is + port ( + I_G1 : in std_logic; + I_G2a : in std_logic; + I_G2b : in std_logic; + I_Sel : in std_logic_vector(2 downto 0); + O_Q : out std_logic_vector(7 downto 0) + ); +end logic_74xx138; + +architecture RTL of LOGIC_74XX138 is + signal I_G : std_logic_vector(2 downto 0) := (others => '0'); + +begin + I_G <= I_G1 & I_G2a & I_G2b; + + xx138 : process(I_G, I_Sel) + begin + if(I_G = "100" ) then + case I_Sel is + when "000" => O_Q <= "11111110"; + when "001" => O_Q <= "11111101"; + when "010" => O_Q <= "11111011"; + when "011" => O_Q <= "11110111"; + when "100" => O_Q <= "11101111"; + when "101" => O_Q <= "11011111"; + when "110" => O_Q <= "10111111"; + when "111" => O_Q <= "01111111"; + when others => null; + end case; + else + O_Q <= (others => '1'); + end if; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx139 +-- 2-to-4 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX139 is + port ( + I_G : in std_logic; + I_Sel : in std_logic_vector(1 downto 0); + O_Q : out std_logic_vector(3 downto 0) + ); +end; + +architecture RTL of LOGIC_74XX139 is +begin + xx139 : process (I_G, I_Sel) + begin + if I_G = '0' then + case I_Sel is + when "00" => O_Q <= "1110"; + when "01" => O_Q <= "1101"; + when "10" => O_Q <= "1011"; + when "11" => O_Q <= "0111"; + when others => null; + end case; + else + O_Q <= "1111"; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_missile.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_missile.vhd new file mode 100644 index 00000000..c5aa6633 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_missile.vhd @@ -0,0 +1,107 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA VIDEO-MISSILE +---- +---- Version : 2.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_MISSILE is + port( + I_CLK_6M : in std_logic; + I_CLK_18M : in std_logic; + I_C_BLn_X : in std_logic; + I_MLDn : in std_logic; + I_SLDn : in std_logic; + I_HPOS : in std_logic_vector (7 downto 0); + + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic + ); +end; + +architecture RTL of MC_MISSILE is + signal W_45R_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_45S_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_5P1_Q : std_logic := '0'; + signal W_5P2_Q : std_logic := '0'; + signal W_5P1_CLK : std_logic := '0'; + signal W_5P2_CLK : std_logic := '0'; +begin + + O_MISSILEn <= W_5P1_CLK; + O_SHELLn <= W_5P2_CLK; + + -- missile counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if (I_MLDn = '0') then + W_45R_Q <= I_HPOS; + else + if (I_C_BLn_X = '1') then + W_45R_Q <= W_45R_Q + 1; + if (W_45R_Q(7 downto 2) = "111111") and W_5P1_Q = '1' then + W_5P1_CLK <= '0'; + else + W_5P1_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- shell counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if(I_SLDn = '0') then + W_45S_Q <= I_HPOS; + else + if(I_C_BLn_X = '1') then + W_45S_Q <= W_45S_Q + 1; + if (W_45S_Q(7 downto 2) = "111111") and W_5P2_Q = '1' then + W_5P2_CLK <= '0'; + else + W_5P2_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_MLDn) and clock active on rising edge (W_5P1_CLK) + process(W_5P1_CLK, I_MLDn) + begin + if (I_MLDn = '0') then + W_5P1_Q <= '1'; + elsif rising_edge(W_5P1_CLK) then + W_5P1_Q <= '0'; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_SLDn) and clock active on rising edge (W_5P2_CLK) + process(W_5P2_CLK, I_SLDn) + begin + if (I_SLDn = '0') then + W_5P2_Q <= '1'; + elsif rising_edge(W_5P2_CLK) then + W_5P2_Q <= '0'; + end if; + end process; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_sound_a.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_sound_a.vhd new file mode 100644 index 00000000..ee0c66be --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_sound_a.vhd @@ -0,0 +1,117 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA SOUND I/F +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + use IEEE.std_logic_arith.all; + +entity MC_SOUND_A is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT1 : in std_logic; + I_BD : in std_logic_vector(7 downto 0); + I_PITCH : in std_logic; + I_VOL1 : in std_logic; + I_VOL2 : in std_logic; + + O_SDAT : out std_logic_vector(7 downto 0); + O_DO : out std_logic_vector(3 downto 0) +); +end; + +architecture RTL of MC_SOUND_A is + signal W_PITCH : std_logic := '0'; + signal W_89K_LDn : std_logic := '0'; + signal W_89K_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_89K_LDATA : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6T_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_SDAT0 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT2 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT3 : std_logic_vector(7 downto 0) := (others => '0'); + +begin + O_DO <= W_6T_Q; + + process (I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_PITCH <= I_PITCH; + if (W_89K_Q = x"ff") then + W_89K_LDn <= '0' ; + else + W_89K_LDn <= '1' ; + end if; + end if; + end process; + + -- Parts 9J + process (W_PITCH) + begin + if falling_edge(W_PITCH) then + W_89K_LDATA <= I_BD; + end if; + end process; + + process (I_H_CNT1) + begin + if rising_edge(I_H_CNT1) then + if (W_89K_LDn = '0') then + W_89K_Q <= W_89K_LDATA; + else + W_89K_Q <= W_89K_Q + 1; + end if; + end if; + end process; + + process (W_89K_LDn) + begin + if falling_edge(W_89K_LDn) then + W_6T_Q <= W_6T_Q + 1; + end if; + end process; + + process (I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + O_SDAT <= (x"14" + W_SDAT3) + (W_SDAT0 + W_SDAT2); + + if W_6T_Q(0)='1' then + W_SDAT0 <= x"2a"; + else + W_SDAT0 <= (others => '0'); + end if; + + if W_6T_Q(2)='1' then + if I_VOL1 = '1' then + W_SDAT2 <= x"69"; + else + W_SDAT2 <= x"39"; + end if; + else + W_SDAT2 <= (others => '0'); + end if; + + if (W_6T_Q(3)='1') and (I_VOL2 = '1') then + W_SDAT3 <= x"48" ; + else + W_SDAT3 <= (others => '0'); + end if; + + end if; + end process; + +end; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_sound_b.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_sound_b.vhd new file mode 100644 index 00000000..b74e4bb1 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_sound_b.vhd @@ -0,0 +1,253 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA WAVE SOUND +---- +---- Version : 1.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does no guarantee this program. +---- You can use this at your own risk. +---- +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--pragma translate_off +-- use ieee.std_logic_textio.all; +-- use std.textio.all; +--pragma translate_on + +entity MC_SOUND_B is + port( + I_CLK1 : in std_logic; -- 6MHz + I_RSTn : in std_logic; + I_SW : in std_logic_vector( 2 downto 0); + I_DAC : in std_logic_vector( 3 downto 0); + I_FS : in std_logic_vector( 2 downto 0); + O_SDAT : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_B is +constant sample_time : integer := 557; -- sample time : 557 = 11025Hz, 557/2 = 22050Hz +constant fire_cnt : std_logic_vector(15 downto 0) := x"2000"; +constant hit_cnt : std_logic_vector(15 downto 0) := x"2000"; + +signal sample : std_logic_vector(10 downto 0) := (others => '0'); +signal sample_pls : std_logic := '0'; +signal s0_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s0_trg : std_logic := '0'; +signal s1_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s1_trg : std_logic := '0'; +signal fire_addr : std_logic_vector(15 downto 0) := (others => '0'); +signal hit_addr : std_logic_vector(15 downto 0) := (others => '0'); + +signal WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); +signal WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + +signal W_VCO1_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO1_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal VCO_CTR : std_logic_vector(24 downto 0) := (others => '0'); + +signal SDAT : std_logic_vector(10 downto 0) := (others => '0'); + +begin + -- ideally we should divide by 5 because this is the sum of 5 channels + -- but in practice we divide by 4 and just clip sounds that are too loud. + O_SDAT <= SDAT(9 downto 2) when SDAT(10) = '0' else (others=>'1'); -- clip overrange sounds + + process(I_CLK1) + begin + if rising_edge(I_CLK1) then + SDAT <= ("000" & W_VCO3_OUT) + ( ( ("000" & W_VCO2_OUT) + ("000" & W_VCO1_OUT) ) + ( ("000" & WAV_D0) + ("000" & WAV_D1) ) ); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + sample <= (others => '0'); + sample_pls <= '0'; + elsif rising_edge(I_CLK1) then + if (sample = sample_time - 1) then + sample <= (others => '0'); + sample_pls <= '1'; + else + sample <= sample + 1; + sample_pls <= '0'; + end if; + end if; + end process; + +------------- FIRE SOUND ------------------------------------------ + mc_roms_fire : entity work.GAL_FIR + port map ( + CLK => I_CLK1, + ADDR => fire_addr(12 downto 0), + DATA => WAV_D0 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s0_trg_ff <= (others => '0'); + s0_trg <= '0'; + elsif rising_edge(I_CLK1) then + s0_trg_ff(0) <= I_SW(0); + s0_trg_ff(1) <= s0_trg_ff(0); + s0_trg <= not s0_trg_ff(1) and s0_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + fire_addr <= fire_cnt; + elsif rising_edge(I_CLK1) then + if (s0_trg = '1') then + fire_addr <= (others => '0'); + else + if(sample_pls = '1') then + if(fire_addr <= fire_cnt) then + fire_addr <= fire_addr + 1; + else + fire_addr <= fire_addr ; + end if; + end if; + end if; + end if; + end process; + +------------- HIT SOUND ------------------------------------------ + mc_roms_hit : entity work.GAL_HIT + port map ( + CLK => I_CLK1, + ADDR => hit_addr(12 downto 0), + DATA => WAV_D1 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s1_trg_ff <= (others => '0'); + s1_trg <= '0'; + elsif rising_edge(I_CLK1) then + s1_trg_ff(0) <= I_SW(1); + s1_trg_ff(1) <= s1_trg_ff(0); + s1_trg <= not s1_trg_ff(1) and s1_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + hit_addr <= hit_cnt; + elsif rising_edge(I_CLK1) then + if (s1_trg = '1') then + hit_addr <= (others => '0'); + else + if (sample_pls = '1') then + if (hit_addr <= hit_cnt) then + hit_addr <= hit_addr + 1 ; + else + hit_addr <= hit_addr ; + end if; + end if; + end if; + end if; + end process; + +--------------- EFFECT SOUND --------------------------------------- + +-- 9R modulator voltage generator based on DAC value + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + VCO_CTR <= (others=>'0'); + elsif rising_edge(I_CLK1) then + VCO_CTR <= VCO_CTR + (not I_DAC); + end if; + end process; + + -- modulator frequency lookup tables for the three VCOs + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + elsif rising_edge(I_CLK1) then + case VCO_CTR(23 downto 19) is + when "00000" => W_VCO1_STEP <= x"2A"; W_VCO2_STEP <= x"3A"; W_VCO3_STEP <= x"54"; + when "00001" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"39"; W_VCO3_STEP <= x"53"; + when "00010" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"38"; W_VCO3_STEP <= x"52"; + when "00011" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"50"; + when "00100" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"4F"; + when "00101" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"36"; W_VCO3_STEP <= x"4E"; + when "00110" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"35"; W_VCO3_STEP <= x"4D"; + when "00111" => W_VCO1_STEP <= x"26"; W_VCO2_STEP <= x"34"; W_VCO3_STEP <= x"4C"; + when "01000" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"4A"; + when "01001" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"49"; + when "01010" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"32"; W_VCO3_STEP <= x"48"; + when "01011" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"31"; W_VCO3_STEP <= x"47"; + when "01100" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"30"; W_VCO3_STEP <= x"46"; + when "01101" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"44"; + when "01110" => W_VCO1_STEP <= x"22"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"43"; + when "01111" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2E"; W_VCO3_STEP <= x"42"; + when "10000" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2D"; W_VCO3_STEP <= x"41"; + when "10001" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2C"; W_VCO3_STEP <= x"40"; + when "10010" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3F"; + when "10011" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3D"; + when "10100" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2A"; W_VCO3_STEP <= x"3C"; + when "10101" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"29"; W_VCO3_STEP <= x"3B"; + when "10110" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"3A"; + when "10111" => W_VCO1_STEP <= x"1D"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"39"; + when "11000" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"27"; W_VCO3_STEP <= x"37"; + when "11001" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"26"; W_VCO3_STEP <= x"36"; + when "11010" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"25"; W_VCO3_STEP <= x"35"; + when "11011" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"34"; + when "11100" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"33"; + when "11101" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"23"; W_VCO3_STEP <= x"32"; + when "11110" => W_VCO1_STEP <= x"19"; W_VCO2_STEP <= x"22"; W_VCO3_STEP <= x"30"; + when "11111" => W_VCO1_STEP <= x"18"; W_VCO2_STEP <= x"21"; W_VCO3_STEP <= x"2F"; + when others => null; + end case; + end if; + end process; + +-- 8R VCO 240Hz - 140Hz (8) + mc_vco1 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(0), + I_STEP => W_VCO1_STEP, + O_WAV => W_VCO1_OUT + ); + +-- 8S VCO 330Hz - 190Hz (11) + mc_vco2 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(1), + I_STEP => W_VCO2_STEP, + O_WAV => W_VCO2_OUT + ); + +-- 8T VCO 480Hz - 270Hz (16) + mc_vco3 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(2), + I_STEP => W_VCO3_STEP, + O_WAV => W_VCO3_OUT + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_sound_vco.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_sound_vco.vhd new file mode 100644 index 00000000..e2a63e85 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_sound_vco.vhd @@ -0,0 +1,49 @@ +-------------------------------------------------------------------------------- +---- FPGA VCO +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +use work.sine_package.all; + +-- O_CLK = (I_CLK / 2^20) * I_STEP +entity MC_SOUND_VCO is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + I_FS : in std_logic; + I_STEP : in std_logic_vector( 7 downto 0); + O_WAV : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_VCO is + signal VCO1_CTR : std_logic_vector(19 downto 0) := (others => '0'); + signal sine : std_logic_vector(14 downto 0) := (others => '0'); + +begin + O_WAV <= sine(14 downto 7); + process(I_CLK, I_RSTn) + begin + if (I_RSTn = '0') then + VCO1_CTR <= (others=>'0'); + elsif rising_edge(I_CLK) then + if I_FS = '1' then + VCO1_CTR <= VCO1_CTR + I_STEP; + case VCO1_CTR(19 downto 18) is + when "00" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "01" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when "10" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "11" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_stars.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_stars.vhd new file mode 100644 index 00000000..b91197b3 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_stars.vhd @@ -0,0 +1,90 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA STARS +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity MC_STARS is + port ( + I_CLK_18M : in std_logic; + I_CLK_6M : in std_logic; + I_H_FLIP : in std_logic; + I_V_SYNC : in std_logic; + I_8HF : in std_logic; + I_256HnX : in std_logic; + I_1VF : in std_logic; + I_2V : in std_logic; + I_STARS_ON : in std_logic; + I_STARS_OFFn : in std_logic; + + O_R : out std_logic_vector(1 downto 0); + O_G : out std_logic_vector(1 downto 0); + O_B : out std_logic_vector(1 downto 0); + O_NOISE : out std_logic + ); +end; + +architecture RTL of MC_STARS is + signal CLK_1C : std_logic := '0'; + signal W_2D_Qn : std_logic := '0'; + + signal W_3B : std_logic := '0'; + signal noise : std_logic := '0'; + signal W_2A : std_logic := '0'; + signal W_4P : std_logic := '0'; + signal CLK_1AB : std_logic := '0'; + signal W_1AB_Q : std_logic_vector(15 downto 0) := (others => '0'); + signal W_1C_Q : std_logic_vector( 1 downto 0) := (others => '0'); +begin + O_R <= (W_1AB_Q( 9) & W_1AB_Q (8) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_G <= (W_1AB_Q(11) & W_1AB_Q(10) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_B <= (W_1AB_Q(13) & W_1AB_Q(12) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + + CLK_1C <= not (I_CLK_18M and (not I_CLK_6M )and (not I_V_SYNC) and I_256HnX); + CLK_1AB <= not (CLK_1C or (not (I_H_FLIP or W_1C_Q(1)))); + W_3B <= W_2D_Qn xor W_1AB_Q(4); + + W_2A <= '0' when (W_1AB_Q(7 downto 0) = x"ff") else '1'; + W_4P <= not (( I_8HF xor I_1VF ) and W_2D_Qn and I_STARS_OFFn); + + O_NOISE <= noise ; + + process(I_2V) + begin + if rising_edge(I_2V) then + noise <= W_2D_Qn; + end if; + end process; + + process(CLK_1C, I_V_SYNC) + begin + if(I_V_SYNC = '1') then + W_1C_Q <= (others => '0'); + elsif rising_edge(CLK_1C) then + W_1C_Q <= W_1C_Q(0) & '1'; + end if; + end process; + + process(CLK_1AB, I_STARS_ON) + begin + if(I_STARS_ON = '0') then + W_1AB_Q <= (others => '0'); + W_2D_Qn <= '1'; + elsif rising_edge(CLK_1AB) then + W_1AB_Q <= W_1AB_Q(14 downto 0) & W_3B; + W_2D_Qn <= not W_1AB_Q(15); + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_video.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_video.vhd new file mode 100644 index 00000000..dbe0d0d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mc_video.vhd @@ -0,0 +1,433 @@ +-------------------------------------------------------------------------------- +---- FPGA GALAXIAN VIDEO +---- +---- Version : 2.50 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 4-30 galaxian modify by K.DEGAWA +---- 2004- 5- 6 first release. +---- 2004- 8-23 Improvement with T80-IP. +---- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +-------------------------------------------------------------------------------- + +------------------------------------------------------------------------------------------- +-- H_CNT(0), H_CNT(1), H_CNT(2), H_CNT(3), H_CNT(4), H_CNT(5), H_CNT(6), H_CNT(7), H_CNT(8), +-- 1 H 2 H 4 H 8 H 16 H 32H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT(0), V_CNT(1), V_CNT(2), V_CNT(3), V_CNT(4), V_CNT(5), V_CNT(6), V_CNT(7) +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_VIDEO is + port( + I_CLK_18M : in std_logic; + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_V_CNT : in std_logic_vector(7 downto 0); + I_H_FLIP : in std_logic; + I_V_FLIP : in std_logic; + I_V_BLn : in std_logic; + I_C_BLn : in std_logic; + + I_A : in std_logic_vector(9 downto 0); + I_BD : in std_logic_vector(7 downto 0); + I_OBJ_SUB_A : in std_logic_vector(2 downto 0); + I_OBJ_RAM_RQ : in std_logic; + I_OBJ_RAM_RD : in std_logic; + I_OBJ_RAM_WR : in std_logic; + I_VID_RAM_RD : in std_logic; + I_VID_RAM_WR : in std_logic; + I_DRIVER_WR : in std_logic; + + O_C_BLnX : out std_logic; + O_8HF : out std_logic; + O_256HnX : out std_logic; + O_1VF : out std_logic; + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic; + + O_BD : out std_logic_vector(7 downto 0); + O_VID : out std_logic_vector(1 downto 0); + O_COL : out std_logic_vector(2 downto 0) + ); +end; + +architecture RTL of MC_VIDEO is + + signal WB_LDn : std_logic := '0'; + signal WB_CNTRLDn : std_logic := '0'; + signal WB_CNTRCLRn : std_logic := '0'; + signal WB_COLLn : std_logic := '0'; + signal WB_VPLn : std_logic := '0'; + signal WB_OBJDATALn : std_logic := '0'; + signal WB_MLDn : std_logic := '0'; + signal WB_SLDn : std_logic := '0'; + signal W_3D : std_logic := '0'; + signal W_LDn : std_logic := '0'; + signal W_CNTRLDn : std_logic := '0'; + signal W_CNTRCLRn : std_logic := '0'; + signal W_COLLn : std_logic := '0'; + signal W_VPLn : std_logic := '0'; + signal W_OBJDATALn : std_logic := '0'; + signal W_MLDn : std_logic := '0'; + signal W_SLDn : std_logic := '0'; + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_H_POSI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_2M_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6K_Q : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_6P_Q : std_logic_vector( 6 downto 0) := (others => '0'); + signal W_45T_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2KL : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2HJ : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_RV : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_RC : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_O_OBJ_ROM_A : std_logic_vector(10 downto 0) := (others => '0'); + signal W_VID_RAM_A : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AA : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AB : std_logic_vector(11 downto 0) := (others => '0'); + signal C_2HJ : std_logic_vector( 1 downto 0) := (others => '0'); + signal C_2KL : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_CD : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_1M : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_A : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_B : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_Y : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_LRAM_DI : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_LRAM_DO : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_1H_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_1K_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_LRAM_A : std_logic_vector( 7 downto 0) := (others => '0'); +-- signal W_OBJ_RAM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_HF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_45N_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6J_Q : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DA : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DB : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_256HnX : std_logic := '0'; + signal W_2N : std_logic := '0'; + signal W_45T_CLR : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_H_FLIP1 : std_logic := '0'; + signal W_H_FLIP2 : std_logic := '0'; + signal W_H_FLIP1X : std_logic := '0'; + signal W_H_FLIP2X : std_logic := '0'; + signal W_LRAM_AND : std_logic := '0'; + signal W_RAW0 : std_logic := '0'; + signal W_RAW1 : std_logic := '0'; + signal W_RAW_OR : std_logic := '0'; + signal W_SRCLK : std_logic := '0'; + signal W_SRLD : std_logic := '0'; + signal W_VID_RAM_CS : std_logic := '0'; + signal W_CLK_6Mn : std_logic := '0'; + +begin + ld_pls : entity work.MC_LD_PLS + port map( + I_CLK_6M => I_CLK_6M, + I_H_CNT => I_H_CNT, + I_3D_DI => W_3D, + + O_LDn => WB_LDn, + O_CNTRLDn => WB_CNTRLDn, + O_CNTRCLRn => WB_CNTRCLRn, + O_COLLn => WB_COLLn, + O_VPLn => WB_VPLn, + O_OBJDATALn => WB_OBJDATALn, + O_MLDn => WB_MLDn, + O_SLDn => WB_SLDn + ); + + obj_ram : entity work.MC_OBJ_RAM + port map( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(7 downto 0), + I_WEA => I_OBJ_RAM_WR, + I_CEA => I_OBJ_RAM_RQ, + I_DA => I_BD, + O_DA => W_OBJ_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_OBJ_RAM_AB, + I_WEB => '0', + I_CEB => '1', + I_DB => x"00", + O_DB => W_OBJ_RAM_DOB + ); + + lram : entity work.MC_LRAM + port map( + I_CLK => I_CLK_18M, + I_ADDR => W_LRAM_A, + I_WE => W_CLK_6Mn, + I_D => W_LRAM_DI, + O_Dn => W_LRAM_DO + ); + + missile : entity work.MC_MISSILE + port map( + I_CLK_18M => I_CLK_18M, + I_CLK_6M => I_CLK_6M, + I_C_BLn_X => W_C_BLnX, + I_MLDn => W_MLDn, + I_SLDn => W_SLDn, + I_HPOS => W_H_POSI, + O_MISSILEn => O_MISSILEn, + O_SHELLn => O_SHELLn + ); + + vid_ram : entity work.MC_VID_RAM + port map ( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(9 downto 0), + I_DA => W_VID_RAM_DI, + I_WEA => I_VID_RAM_WR, + I_CEA => W_VID_RAM_CS, + O_DA => W_VID_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_VID_RAM_A(9 downto 0), + I_DB => x"00", + I_WEB => '0', + I_CEB => '1', + O_DB => W_VID_RAM_DOB + ); + + -- 1K VID-Rom + k_rom : entity work.GALAXIAN_1K + port map ( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1K_D + ); + + -- 1H VID-Rom + h_rom : entity work.GALAXIAN_1H + port map( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1H_D + ); + +----------------------------------------------------------------------------------- + + process(I_CLK_12M) + begin + if falling_edge(I_CLK_12M) then + W_LDn <= WB_LDn; + W_CNTRLDn <= WB_CNTRLDn; + W_CNTRCLRn <= WB_CNTRCLRn; + W_COLLn <= WB_COLLn; + W_VPLn <= WB_VPLn; + W_OBJDATALn <= WB_OBJDATALn; + W_MLDn <= WB_MLDn; + W_SLDn <= WB_SLDn; + end if; + end process; + + W_CLK_6Mn <= not I_CLK_6M; + + W_6J_DA <= I_H_FLIP & W_HF_CNT(7) & W_HF_CNT(3) & I_H_CNT(2); + W_6J_DB <= W_OBJ_D(6) & ( W_HF_CNT(3) and I_H_CNT(1) ) & I_H_CNT(2) & I_H_CNT(1); + W_6J_Q <= W_6J_DB when I_H_CNT(8) = '1' else W_6J_DA; + + W_H_FLIP1 <= (not I_H_CNT(8)) and I_H_FLIP; + + W_HF_CNT(7 downto 3) <= not I_H_CNT(7 downto 3) when W_H_FLIP1 = '1' else I_H_CNT(7 downto 3); + W_VF_CNT <= not I_V_CNT when I_V_FLIP = '1' else I_V_CNT; + + O_8HF <= W_HF_CNT(3); + O_1VF <= W_VF_CNT(0); + W_H_FLIP2 <= W_6J_Q(3); + +-- Parts 4F,5F + W_OBJ_RAM_AB <= "0" & I_H_CNT(8) & W_6J_Q(2) & W_HF_CNT(6 downto 4) & W_6J_Q(1 downto 0); +-- W_OBJ_RAM_A <= W_OBJ_RAM_AB when I_OBJ_RAM_RQ = '0' else I_A(7 downto 0) ; + + process(I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_H_POSI <= W_OBJ_RAM_DOB; + end if; + end process; + + W_OBJ_RAM_D <= W_OBJ_RAM_DOA when I_OBJ_RAM_RD = '1' else (others => '0'); + +-- Parts 4L + process(W_OBJDATALn) + begin + if rising_edge(W_OBJDATALn) then + W_OBJ_D <= W_H_POSI; + end if; + end process; + +-- Parts 4,5N + W_45N_Q <= W_VF_CNT + W_H_POSI; + W_3D <= '0' when W_45N_Q = x"FF" else '1'; + + process(W_VPLn, I_V_BLn) + begin + if (I_V_BLn = '0') then + W_2M_Q <= (others => '0'); + elsif rising_edge(W_VPLn) then + W_2M_Q <= W_45N_Q; + end if; + end process; + + W_2N <= I_H_CNT(8) and W_OBJ_D(7); + W_1M <= W_2M_Q(3 downto 0) xor (W_2N & W_2N & W_2N & W_2N); + W_VID_RAM_CS <= I_VID_RAM_RD or I_VID_RAM_WR; + W_VID_RAM_DI <= I_BD when I_VID_RAM_WR = '1' else (others => '0'); + W_VID_RAM_AA <= (not ( W_2M_Q(7) and W_2M_Q(6) and W_2M_Q(5) and W_2M_Q(4))) & (not W_VID_RAM_CS) & "0000000000"; -- I_A(9:0) + W_VID_RAM_AB <= "00" & W_2M_Q(7 downto 4) & W_1M(3) & W_HF_CNT(7 downto 3); + W_VID_RAM_A <= W_VID_RAM_AB when I_C_BLn = '1' else W_VID_RAM_AA; + W_VID_RAM_D <= W_VID_RAM_DOA when I_VID_RAM_RD = '1' else (others => '0'); + +---- VIDEO DATA OUTPUT -------------- + + O_BD <= W_OBJ_RAM_D or W_VID_RAM_D; + W_SRLD <= not (W_LDn or W_VID_RAM_A(11)); + W_OBJ_ROM_AB <= W_OBJ_D(5 downto 0) & W_1M(3) & (W_OBJ_D(6) xor I_H_CNT(3)); + W_OBJ_ROM_A <= W_OBJ_ROM_AB when I_H_CNT(8) = '1' else W_VID_RAM_DOB; + W_O_OBJ_ROM_A <= W_OBJ_ROM_A & W_1M(2 downto 0); + +----------------------------------------------------------------------------------- + + W_3L_A <= reg_2HJ(7) & reg_2KL(7) & "1" & W_SRLD; + W_3L_B <= reg_2HJ(0) & reg_2KL(0) & W_SRLD & "1"; + W_3L_Y <= W_3L_B when W_H_FLIP2X = '1' else W_3L_A; -- (3)=RAW1,(2)=RAW0 + C_2HJ <= W_3L_Y(1 downto 0); + C_2KL <= W_3L_Y(1 downto 0); + W_RAW0 <= W_3L_Y(2); + W_RAW1 <= W_3L_Y(3); + W_SRCLK <= I_CLK_6M; + +-------- PARTS 2KL ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2KL) is + when "00" => reg_2KL <= reg_2KL; + when "10" => reg_2KL <= reg_2KL(6 downto 0) & "0"; + when "01" => reg_2KL <= "0" & reg_2KL(7 downto 1); + when "11" => reg_2KL <= W_1K_D; + when others => null; + end case; + end if; + end process; + +-------- PARTS 2HJ ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2HJ) is + when "00" => reg_2HJ <= reg_2HJ; + when "10" => reg_2HJ <= reg_2HJ(6 downto 0) & "0"; + when "01" => reg_2HJ <= "0" & reg_2HJ(7 downto 1); + when "11" => reg_2HJ <= W_1H_D; + when others => null; + end case; + end if; + end process; + +------- SHT2 ----------------------------------------------------- + +-- Parts 6K + process(W_COLLn) + begin + if rising_edge(W_COLLn) then + W_6K_Q <= W_H_POSI(2 downto 0); + end if; + end process; + +-- Parts 6P + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + if (W_LDn = '0') then + W_6P_Q <= W_H_FLIP2 & W_H_FLIP1 & I_C_BLn & (not I_H_CNT(8)) & W_6K_Q(2 downto 0); + else + W_6P_Q <= W_6P_Q; + end if; + end if; + end process; + + W_H_FLIP2X <= W_6P_Q(6); + W_H_FLIP1X <= W_6P_Q(5); + W_C_BLnX <= W_6P_Q(4); + W_256HnX <= W_6P_Q(3); + W_CD <= W_6P_Q(2 downto 0); + O_256HnX <= W_256HnX; + O_C_BLnX <= W_C_BLnX; + W_45T_CLR <= W_CNTRCLRn or W_256HnX ; + + process(I_CLK_6M, W_45T_CLR) + begin + if (W_45T_CLR = '0') then + W_45T_Q <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + if (W_CNTRLDn = '0') then + W_45T_Q <= W_H_POSI; + else + W_45T_Q <= W_45T_Q + 1; + end if; + end if; + end process; + + W_LRAM_A <= (not W_45T_Q) when W_H_FLIP1X = '1' else W_45T_Q; + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_RV <= W_LRAM_DO(1 downto 0); + W_RC <= W_LRAM_DO(4 downto 2); + end if; + end process; + + W_LRAM_AND <= not (not ((W_LRAM_A(4) or W_LRAM_A(5)) or (W_LRAM_A(6) or W_LRAM_A(7))) or W_256HnX ); + W_RAW_OR <= W_RAW0 or W_RAW1 ; + + W_VID(0) <= not (not (W_RAW0 and W_RV(1)) and W_RV(0)); + W_VID(1) <= not (not (W_RAW1 and W_RV(0)) and W_RV(1)); + W_COL(0) <= not (not (W_RAW_OR and W_CD(0) and W_RC(1) and W_RC(2)) and W_RC(0)); + W_COL(1) <= not (not (W_RAW_OR and W_CD(1) and W_RC(2) and W_RC(0)) and W_RC(1)); + W_COL(2) <= not (not (W_RAW_OR and W_CD(2) and W_RC(0) and W_RC(1)) and W_RC(2)); + + O_VID <= W_VID; + O_COL <= W_COL; + + W_LRAM_DI(0) <= W_LRAM_AND and W_VID(0); + W_LRAM_DI(1) <= W_LRAM_AND and W_VID(1); + W_LRAM_DI(2) <= W_LRAM_AND and W_COL(0); + W_LRAM_DI(3) <= W_LRAM_AND and W_COL(1); + W_LRAM_DI(4) <= W_LRAM_AND and W_COL(2); + +end RTL; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mist_io.v b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_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/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/osd.v b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_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/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/pll.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d76a5e1d --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/pll.vhd @@ -0,0 +1,451 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + c3 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + clk3_divide_by : NATURAL; + clk3_duty_cycle : NATURAL; + clk3_multiply_by : NATURAL; + clk3_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire2 <= sub_wire0(3); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c3 <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 3, + clk0_duty_cycle => 50, + clk0_multiply_by => 2, + clk0_phase_shift => "0", + clk1_divide_by => 9, + clk1_duty_cycle => 50, + clk1_multiply_by => 4, + clk1_phase_shift => "0", + clk2_divide_by => 9, + clk2_duty_cycle => 50, + clk2_multiply_by => 2, + clk2_phase_shift => "0", + clk3_divide_by => 6, + clk3_duty_cycle => 50, + clk3_multiply_by => 1, + clk3_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_USED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire6, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "3" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "6" +-- 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: DUTY_CYCLE3 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "18.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "12.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "6.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "4.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 "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "4" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "18.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "12.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "6.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "4.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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 "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "3" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "4" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "6" +-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK3_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_USED" +-- 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_USED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/scandoubler.v b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..2a921604 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/scandoubler.v @@ -0,0 +1,195 @@ +// +// 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/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/sine_package.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/sine_package.vhd new file mode 100644 index 00000000..473caa04 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/sine_package.vhd @@ -0,0 +1,152 @@ +library ieee; +use ieee.std_logic_1164.all; + +package sine_package is + + subtype table_value_type is integer range 0 to 16383; + subtype table_index_type is std_logic_vector( 6 downto 0 ); + + function get_table_value (table_index: table_index_type) return table_value_type; + +end; + +package body sine_package is + + function get_table_value (table_index: table_index_type) return table_value_type is + variable table_value: table_value_type; + begin + case table_index is + when "0000000" => table_value := 101; + when "0000001" => table_value := 302; + when "0000010" => table_value := 503; + when "0000011" => table_value := 703; + when "0000100" => table_value := 904; + when "0000101" => table_value := 1105; + when "0000110" => table_value := 1305; + when "0000111" => table_value := 1506; + when "0001000" => table_value := 1706; + when "0001001" => table_value := 1906; + when "0001010" => table_value := 2105; + when "0001011" => table_value := 2304; + when "0001100" => table_value := 2503; + when "0001101" => table_value := 2702; + when "0001110" => table_value := 2900; + when "0001111" => table_value := 3098; + when "0010000" => table_value := 3295; + when "0010001" => table_value := 3491; + when "0010010" => table_value := 3688; + when "0010011" => table_value := 3883; + when "0010100" => table_value := 4078; + when "0010101" => table_value := 4273; + when "0010110" => table_value := 4466; + when "0010111" => table_value := 4659; + when "0011000" => table_value := 4852; + when "0011001" => table_value := 5044; + when "0011010" => table_value := 5234; + when "0011011" => table_value := 5425; + when "0011100" => table_value := 5614; + when "0011101" => table_value := 5802; + when "0011110" => table_value := 5990; + when "0011111" => table_value := 6177; + when "0100000" => table_value := 6362; + when "0100001" => table_value := 6547; + when "0100010" => table_value := 6731; + when "0100011" => table_value := 6914; + when "0100100" => table_value := 7095; + when "0100101" => table_value := 7276; + when "0100110" => table_value := 7456; + when "0100111" => table_value := 7634; + when "0101000" => table_value := 7811; + when "0101001" => table_value := 7988; + when "0101010" => table_value := 8162; + when "0101011" => table_value := 8336; + when "0101100" => table_value := 8509; + when "0101101" => table_value := 8680; + when "0101110" => table_value := 8850; + when "0101111" => table_value := 9018; + when "0110000" => table_value := 9185; + when "0110001" => table_value := 9351; + when "0110010" => table_value := 9515; + when "0110011" => table_value := 9678; + when "0110100" => table_value := 9840; + when "0110101" => table_value := 10000; + when "0110110" => table_value := 10158; + when "0110111" => table_value := 10315; + when "0111000" => table_value := 10471; + when "0111001" => table_value := 10625; + when "0111010" => table_value := 10777; + when "0111011" => table_value := 10927; + when "0111100" => table_value := 11076; + when "0111101" => table_value := 11224; + when "0111110" => table_value := 11369; + when "0111111" => table_value := 11513; + when "1000000" => table_value := 11655; + when "1000001" => table_value := 11796; + when "1000010" => table_value := 11934; + when "1000011" => table_value := 12071; + when "1000100" => table_value := 12206; + when "1000101" => table_value := 12339; + when "1000110" => table_value := 12471; + when "1000111" => table_value := 12600; + when "1001000" => table_value := 12728; + when "1001001" => table_value := 12853; + when "1001010" => table_value := 12977; + when "1001011" => table_value := 13099; + when "1001100" => table_value := 13219; + when "1001101" => table_value := 13336; + when "1001110" => table_value := 13452; + when "1001111" => table_value := 13566; + when "1010000" => table_value := 13678; + when "1010001" => table_value := 13787; + when "1010010" => table_value := 13895; + when "1010011" => table_value := 14000; + when "1010100" => table_value := 14104; + when "1010101" => table_value := 14205; + when "1010110" => table_value := 14304; + when "1010111" => table_value := 14401; + when "1011000" => table_value := 14496; + when "1011001" => table_value := 14588; + when "1011010" => table_value := 14679; + when "1011011" => table_value := 14767; + when "1011100" => table_value := 14853; + when "1011101" => table_value := 14936; + when "1011110" => table_value := 15018; + when "1011111" => table_value := 15097; + when "1100000" => table_value := 15174; + when "1100001" => table_value := 15249; + when "1100010" => table_value := 15321; + when "1100011" => table_value := 15391; + when "1100100" => table_value := 15459; + when "1100101" => table_value := 15524; + when "1100110" => table_value := 15587; + when "1100111" => table_value := 15648; + when "1101000" => table_value := 15706; + when "1101001" => table_value := 15762; + when "1101010" => table_value := 15816; + when "1101011" => table_value := 15867; + when "1101100" => table_value := 15916; + when "1101101" => table_value := 15963; + when "1101110" => table_value := 16007; + when "1101111" => table_value := 16048; + when "1110000" => table_value := 16088; + when "1110001" => table_value := 16124; + when "1110010" => table_value := 16159; + when "1110011" => table_value := 16191; + when "1110100" => table_value := 16220; + when "1110101" => table_value := 16247; + when "1110110" => table_value := 16272; + when "1110111" => table_value := 16294; + when "1111000" => table_value := 16314; + when "1111001" => table_value := 16331; + when "1111010" => table_value := 16346; + when "1111011" => table_value := 16358; + when "1111100" => table_value := 16368; + when "1111101" => table_value := 16375; + when "1111110" => table_value := 16380; + when "1111111" => table_value := 16383; + when others => null; + end case; + return table_value; + end; + +end; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/spram.vhd b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/spram.vhd new file mode 100644 index 00000000..ad6b58b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone V", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/video_mixer.sv b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..b9f7e424 --- /dev/null +++ b/Arcade/Galaxian Hardware/Orbitron_MiST/rtl/video_mixer.sv @@ -0,0 +1,243 @@ +// +// +// 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; +reg [DWIDTH:0] Rd,Gd,Bd; +always @(posedge clk_sys) {Rd,Gd,Bd} <= {R,G,B}; +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(Rd), + .g_in(Gd), + .b_in(Bd), + + .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/Arcade/Galaxian Hardware/Pisces_MiST/Pisces.qpf b/Arcade/Galaxian Hardware/Pisces_MiST/Pisces.qpf new file mode 100644 index 00000000..02128464 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/Pisces.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 21:51:58 January 08, 2018 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:51:58 January 08, 2018" + +# Revisions + +PROJECT_REVISION = "Pisces" +PROJECT_REVISION = "Catacomb" diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/Pisces.qsf b/Arcade/Galaxian Hardware/Pisces_MiST/Pisces.qsf new file mode 100644 index 00000000..60e75623 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/Pisces.qsf @@ -0,0 +1,190 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 18:12:35 November 17, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Galaxian_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80as.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_6L.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1K.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1H.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_HIT.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_FIR.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/sine_package.vhd +set_global_assignment -name VHDL_FILE rtl/mc_stars.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_vco.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_b.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_a.vhd +set_global_assignment -name VHDL_FILE rtl/mc_missile.vhd +set_global_assignment -name VHDL_FILE rtl/mc_logic.vhd +set_global_assignment -name VHDL_FILE rtl/mc_ld_pls.vhd +set_global_assignment -name VHDL_FILE rtl/mc_inport.vhd +set_global_assignment -name VHDL_FILE rtl/mc_hv_count.vhd +set_global_assignment -name VHDL_FILE rtl/mc_col_pal.vhd +set_global_assignment -name VHDL_FILE rtl/mc_bram.vhd +set_global_assignment -name VHDL_FILE rtl/mc_adec.vhd +set_global_assignment -name VHDL_FILE rtl/galaxian.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Pisces +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Galaxian) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Galaxian) +# -------------------- +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name VHDL_FILE rtl/mc_video.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Pisces.sv +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_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/Pisces.srf b/Arcade/Galaxian Hardware/Pisces_MiST/Pisces.srf new file mode 100644 index 00000000..14cddd5e --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/Pisces.srf @@ -0,0 +1,54 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Clock multiplexers are found and protected" { } { } 0 19016 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169177 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169203 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/README.txt b/Arcade/Galaxian Hardware/Pisces_MiST/README.txt new file mode 100644 index 00000000..2a40daff --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Pisces port to MiST by Gehstock +-- 19 December 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Galaxian hardware +-- Copyright(c) 2004 Katsumi Degawa +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- F2 : Coin + Start 2 players +-- F1 : Coin + Start 1 player +-- SPACE : Fire +-- ARROW KEYS : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/Release/Pisces.rbf b/Arcade/Galaxian Hardware/Pisces_MiST/Release/Pisces.rbf new file mode 100644 index 00000000..6e71f3a8 Binary files /dev/null and b/Arcade/Galaxian Hardware/Pisces_MiST/Release/Pisces.rbf differ diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/clean.bat b/Arcade/Galaxian Hardware/Pisces_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_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/Arcade/Galaxian Hardware/Pisces_MiST/rtl/Pisces.sv b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/Pisces.sv new file mode 100644 index 00000000..64a3f2ec --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/Pisces.sv @@ -0,0 +1,176 @@ +//============================================================================ +// Arcade: Catacomb +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Pisces +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Pisces;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_18, clk_12, clk_6, clk_4p5; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_18), + .c1(clk_12), + .c2(clk_6), + .c3(clk_4p5)//for now, needs a fix +); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +galaxian catacomb +( + .W_CLK_18M(clk_18), + .W_CLK_12M(clk_12), + .W_CLK_6M(clk_6), + .I_RESET(status[0] | status[6] | buttons[1]), + .P1_CSJUDLR({m_coin,m_start1,m_fire,m_up,m_down,m_left,m_right}), + .P2_CSJUDLR({1'b0, m_start2,m_fire,m_up,m_down,m_left,m_right}), + .W_R(r), + .W_G(g), + .W_B(b), + .W_H_SYNC(hs), + .W_V_SYNC(vs), + .HBLANK(hblank), + .VBLANK(vblank), + .W_SDAT_A(audio_a), + .W_SDAT_B(audio_b) +); + +wire [7:0] audio_a, audio_b; +wire [10:0] audio = {1'b0, audio_b, 2'b0} + {3'b0, audio_a}; + +dac dac ( + .clk_i(clk_18), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [2:0] r, g, b; +wire hblank, vblank; + +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_18), + .ce_pix(clk_4p5), + .ce_pix_actual(clk_4p5), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_18 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_18), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GALAXIAN_1H.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GALAXIAN_1H.vhd new file mode 100644 index 00000000..787ca26f --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GALAXIAN_1H.vhd @@ -0,0 +1,541 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GALAXIAN_1H is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(11 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GALAXIAN_1H is + + + type ROM_ARRAY is array(0 to 4095) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"1C",x"02",x"3C",x"3D",x"14",x"10",x"00",x"00", -- 0x0050 + x"00",x"00",x"00",x"00",x"00",x"60",x"C0",x"00", -- 0x0058 + x"38",x"48",x"1E",x"3E",x"3E",x"1E",x"3C",x"30", -- 0x0060 + x"00",x"00",x"00",x"30",x"10",x"08",x"00",x"00", -- 0x0068 + x"02",x"06",x"04",x"00",x"00",x"00",x"00",x"00", -- 0x0070 + x"00",x"00",x"38",x"1C",x"70",x"30",x"34",x"18", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"00", -- 0x0158 + x"00",x"00",x"00",x"00",x"00",x"04",x"00",x"00", -- 0x0160 + x"00",x"00",x"00",x"00",x"00",x"40",x"00",x"00", -- 0x0168 + x"00",x"01",x"00",x"01",x"00",x"00",x"00",x"00", -- 0x0170 + x"80",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0178 + x"00",x"00",x"00",x"00",x"00",x"04",x"00",x"09", -- 0x0180 + x"00",x"00",x"00",x"00",x"00",x"40",x"00",x"00", -- 0x0188 + x"00",x"00",x"04",x"00",x"01",x"00",x"00",x"00", -- 0x0190 + x"10",x"80",x"40",x"00",x"00",x"00",x"00",x"00", -- 0x0198 + x"00",x"00",x"00",x"01",x"08",x"00",x"00",x"00", -- 0x01A0 + x"00",x"00",x"00",x"40",x"00",x"00",x"00",x"00", -- 0x01A8 + x"11",x"04",x"00",x"00",x"08",x"00",x"00",x"00", -- 0x01B0 + x"20",x"00",x"00",x"00",x"00",x"20",x"00",x"00", -- 0x01B8 + x"00",x"00",x"00",x"02",x"00",x"00",x"00",x"00", -- 0x01C0 + x"00",x"00",x"00",x"20",x"00",x"00",x"00",x"00", -- 0x01C8 + x"08",x"00",x"01",x"00",x"00",x"04",x"00",x"00", -- 0x01D0 + x"88",x"00",x"00",x"10",x"00",x"00",x"00",x"00", -- 0x01D8 + x"00",x"03",x"00",x"01",x"00",x"00",x"00",x"00", -- 0x01E0 + x"00",x"00",x"00",x"80",x"00",x"C0",x"00",x"60", -- 0x01E8 + x"00",x"00",x"00",x"00",x"00",x"01",x"00",x"03", -- 0x01F0 + x"00",x"60",x"00",x"C0",x"00",x"80",x"00",x"00", -- 0x01F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0200 + x"00",x"00",x"00",x"00",x"00",x"60",x"00",x"60", -- 0x0208 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0210 + x"00",x"60",x"00",x"60",x"00",x"00",x"00",x"00", -- 0x0218 + x"10",x"02",x"00",x"20",x"00",x"00",x"40",x"00", -- 0x0220 + x"00",x"10",x"02",x"40",x"00",x"00",x"04",x"00", -- 0x0228 + x"00",x"40",x"10",x"04",x"00",x"80",x"02",x"20", -- 0x0230 + x"00",x"08",x"80",x"00",x"01",x"00",x"20",x"00", -- 0x0238 + x"00",x"20",x"58",x"48",x"24",x"19",x"01",x"00", -- 0x0240 + x"00",x"04",x"08",x"10",x"12",x"0C",x"A0",x"38", -- 0x0248 + x"00",x"01",x"19",x"24",x"48",x"58",x"20",x"00", -- 0x0250 + x"38",x"A0",x"0C",x"12",x"10",x"08",x"04",x"00", -- 0x0258 + x"00",x"02",x"20",x"10",x"00",x"02",x"46",x"00", -- 0x0260 + x"00",x"40",x"04",x"08",x"00",x"60",x"62",x"80", -- 0x0268 + x"00",x"46",x"02",x"00",x"10",x"20",x"02",x"00", -- 0x0270 + x"80",x"62",x"60",x"00",x"08",x"04",x"40",x"00", -- 0x0278 + x"00",x"18",x"34",x"34",x"14",x"08",x"09",x"00", -- 0x0280 + x"00",x"00",x"00",x"0E",x"10",x"08",x"26",x"30", -- 0x0288 + x"00",x"09",x"08",x"14",x"34",x"34",x"18",x"00", -- 0x0290 + x"30",x"26",x"08",x"10",x"0E",x"00",x"00",x"00", -- 0x0298 + x"00",x"08",x"1C",x"1E",x"1E",x"0E",x"06",x"00", -- 0x02A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02A8 + x"00",x"06",x"0E",x"1E",x"1E",x"1C",x"08",x"00", -- 0x02B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02B8 + x"00",x"08",x"1C",x"1E",x"1E",x"0E",x"06",x"00", -- 0x02C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C8 + x"00",x"06",x"0E",x"1E",x"1E",x"1C",x"08",x"00", -- 0x02D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D8 + x"00",x"08",x"1C",x"1E",x"1E",x"0E",x"06",x"00", -- 0x02E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E8 + x"00",x"06",x"0E",x"1E",x"1E",x"1C",x"08",x"00", -- 0x02F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02F8 + x"00",x"00",x"00",x"01",x"03",x"1C",x"23",x"C0", -- 0x0300 + x"00",x"7E",x"FC",x"08",x"F1",x"13",x"FF",x"0F", -- 0x0308 + x"23",x"1C",x"03",x"01",x"00",x"00",x"00",x"00", -- 0x0310 + x"FF",x"13",x"F1",x"08",x"FC",x"7E",x"00",x"00", -- 0x0318 + x"1C",x"38",x"C2",x"06",x"C2",x"38",x"1C",x"00", -- 0x0320 + x"C3",x"C3",x"C3",x"C3",x"C3",x"C3",x"C3",x"C3", -- 0x0328 + x"C3",x"C3",x"C3",x"C3",x"C3",x"C3",x"FF",x"FF", -- 0x0330 + x"C3",x"C3",x"C3",x"C3",x"FF",x"FF",x"FF",x"FF", -- 0x0338 + x"C3",x"C3",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0340 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0348 + x"1F",x"C6",x"F2",x"1D",x"03",x"00",x"00",x"00", -- 0x0350 + x"CC",x"E0",x"80",x"40",x"98",x"F0",x"00",x"00", -- 0x0358 + x"03",x"06",x"0D",x"1E",x"F9",x"06",x"1C",x"FF", -- 0x0360 + x"60",x"FE",x"1F",x"61",x"70",x"F8",x"0C",x"E6", -- 0x0368 + x"06",x"D3",x"FC",x"3B",x"1D",x"0C",x"04",x"00", -- 0x0370 + x"0F",x"78",x"A0",x"18",x"C7",x"3E",x"0C",x"00", -- 0x0378 + x"00",x"01",x"03",x"07",x"03",x"07",x"0F",x"3F", -- 0x0380 + x"80",x"80",x"D8",x"F8",x"F8",x"F0",x"F0",x"F0", -- 0x0388 + x"1F",x"1F",x"1F",x"0F",x"03",x"07",x"07",x"01", -- 0x0390 + x"F8",x"F8",x"F0",x"E0",x"F8",x"FC",x"78",x"00", -- 0x0398 + x"00",x"00",x"00",x"00",x"00",x"04",x"01",x"03", -- 0x03A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"40",x"90", -- 0x03A8 + x"07",x"02",x"02",x"08",x"00",x"00",x"00",x"00", -- 0x03B0 + x"C0",x"80",x"A0",x"10",x"00",x"00",x"00",x"00", -- 0x03B8 + x"00",x"00",x"00",x"04",x"24",x"04",x"4E",x"27", -- 0x03C0 + x"00",x"00",x"20",x"40",x"11",x"80",x"A4",x"C8", -- 0x03C8 + x"07",x"03",x"25",x"00",x"08",x"00",x"00",x"00", -- 0x03D0 + x"C0",x"20",x"90",x"A0",x"20",x"50",x"00",x"00", -- 0x03D8 + x"00",x"00",x"42",x"20",x"04",x"0F",x"E7",x"3F", -- 0x03E0 + x"00",x"20",x"44",x"C8",x"80",x"80",x"D0",x"EC", -- 0x03E8 + x"07",x"07",x"0D",x"1D",x"29",x"42",x"01",x"00", -- 0x03F0 + x"C0",x"A0",x"B0",x"88",x"44",x"20",x"10",x"08", -- 0x03F8 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0400 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0408 + x"07",x"00",x"06",x"09",x"09",x"09",x"06",x"00", -- 0x0410 + x"C0",x"00",x"C0",x"20",x"20",x"20",x"C0",x"00", -- 0x0418 + x"00",x"07",x"08",x"08",x"07",x"00",x"07",x"08", -- 0x0420 + x"00",x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20", -- 0x0428 + x"08",x"07",x"00",x"00",x"0F",x"04",x"00",x"00", -- 0x0430 + x"20",x"C0",x"00",x"20",x"E0",x"20",x"00",x"00", -- 0x0438 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0440 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0448 + x"07",x"00",x"06",x"09",x"08",x"08",x"04",x"00", -- 0x0450 + x"C0",x"00",x"20",x"20",x"A0",x"60",x"20",x"00", -- 0x0458 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0460 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0468 + x"07",x"00",x"08",x"0D",x"0B",x"09",x"08",x"00", -- 0x0470 + x"C0",x"00",x"C0",x"20",x"20",x"20",x"20",x"00", -- 0x0478 + x"2F",x"2B",x"7D",x"7B",x"7E",x"FF",x"BF",x"4F", -- 0x0480 + x"E3",x"E3",x"E3",x"E3",x"E3",x"73",x"FB",x"FF", -- 0x0488 + x"7F",x"FF",x"FF",x"FF",x"7F",x"9F",x"5F",x"6F", -- 0x0490 + x"FF",x"FF",x"FF",x"FF",x"7F",x"3F",x"7B",x"77", -- 0x0498 + x"27",x"37",x"37",x"3B",x"3B",x"3D",x"7D",x"7F", -- 0x04A0 + x"FE",x"FC",x"DE",x"FF",x"FF",x"8F",x"EF",x"F7", -- 0x04A8 + x"7F",x"FF",x"FF",x"BE",x"BE",x"5F",x"5F",x"4F", -- 0x04B0 + x"EF",x"7F",x"7F",x"3F",x"37",x"77",x"7F",x"FE", -- 0x04B8 + x"FF",x"DF",x"DF",x"7F",x"7F",x"17",x"1B",x"1B", -- 0x04C0 + x"5F",x"8F",x"CF",x"E7",x"F7",x"FF",x"FF",x"DF", -- 0x04C8 + x"7E",x"3E",x"7E",x"37",x"37",x"3F",x"7F",x"FF", -- 0x04D0 + x"FF",x"FF",x"FD",x"FD",x"FB",x"FF",x"BF",x"DF", -- 0x04D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E0 + x"FF",x"FF",x"E7",x"07",x"07",x"06",x"FE",x"FE", -- 0x04E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F0 + x"66",x"06",x"06",x"64",x"3C",x"1C",x"08",x"00", -- 0x04F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0500 + x"00",x"08",x"1C",x"3C",x"64",x"06",x"06",x"66", -- 0x0508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0510 + x"FE",x"FE",x"E7",x"07",x"07",x"07",x"FF",x"FF", -- 0x0518 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0520 + x"FF",x"E7",x"07",x"07",x"07",x"FE",x"66",x"06", -- 0x0528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0530 + x"06",x"64",x"3C",x"1C",x"08",x"00",x"00",x"00", -- 0x0538 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0540 + x"00",x"00",x"00",x"08",x"1C",x"3C",x"64",x"06", -- 0x0548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0550 + x"06",x"66",x"FE",x"E7",x"07",x"07",x"07",x"FF", -- 0x0558 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0560 + x"07",x"07",x"FF",x"FF",x"FF",x"66",x"06",x"06", -- 0x0568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0570 + x"64",x"3C",x"1C",x"08",x"00",x"00",x"00",x"00", -- 0x0578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0580 + x"00",x"00",x"00",x"00",x"08",x"1C",x"3C",x"64", -- 0x0588 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0590 + x"06",x"06",x"66",x"FF",x"FF",x"FF",x"E7",x"07", -- 0x0598 + x"FF",x"F9",x"F1",x"61",x"61",x"63",x"37",x"3F", -- 0x05A0 + x"F9",x"F8",x"F8",x"FE",x"FF",x"FF",x"F8",x"F0", -- 0x05A8 + x"3F",x"0F",x"0E",x"00",x"00",x"00",x"00",x"00", -- 0x05B0 + x"F0",x"7B",x"3F",x"3E",x"00",x"00",x"00",x"00", -- 0x05B8 + x"00",x"00",x"00",x"00",x"01",x"0F",x"0F",x"3F", -- 0x05C0 + x"00",x"00",x"00",x"00",x"FE",x"FF",x"FF",x"FE", -- 0x05C8 + x"3F",x"37",x"63",x"61",x"61",x"F1",x"F9",x"FF", -- 0x05D0 + x"FC",x"C6",x"87",x"CF",x"FE",x"FC",x"FE",x"FF", -- 0x05D8 + x"00",x"00",x"03",x"0F",x"F2",x"CE",x"3E",x"FF", -- 0x05E0 + x"00",x"03",x"F8",x"C0",x"80",x"C0",x"30",x"08", -- 0x05E8 + x"1F",x"C6",x"F2",x"1D",x"03",x"00",x"00",x"00", -- 0x05F0 + x"CC",x"E0",x"80",x"40",x"98",x"F0",x"00",x"00", -- 0x05F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0608 + x"3F",x"3F",x"7F",x"0B",x"0B",x"07",x"03",x"02", -- 0x0610 + x"CE",x"FE",x"FE",x"EC",x"74",x"FC",x"FC",x"4C", -- 0x0618 + x"04",x"07",x"1F",x"1F",x"3D",x"7D",x"1F",x"2F", -- 0x0620 + x"04",x"04",x"F8",x"FC",x"F4",x"FC",x"FC",x"FE", -- 0x0628 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0630 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0638 + x"2E",x"1F",x"1F",x"1F",x"27",x"42",x"04",x"00", -- 0x0640 + x"7E",x"FE",x"FE",x"BE",x"BD",x"50",x"00",x"00", -- 0x0648 + x"F7",x"EB",x"DD",x"3D",x"FD",x"7F",x"F7",x"2D", -- 0x0650 + x"F7",x"EF",x"DB",x"B7",x"AF",x"BE",x"FE",x"EA", -- 0x0658 + x"7F",x"7F",x"FF",x"7E",x"BD",x"DB",x"FB",x"F7", -- 0x0660 + x"FF",x"FE",x"6F",x"AF",x"D7",x"DD",x"ED",x"F7", -- 0x0668 + x"00",x"00",x"87",x"5F",x"3B",x"7B",x"7F",x"FF", -- 0x0670 + x"00",x"02",x"FC",x"FC",x"D4",x"BE",x"4E",x"CD", -- 0x0678 + x"60",x"74",x"D8",x"CE",x"64",x"68",x"FF",x"10", -- 0x0680 + x"0B",x"37",x"7B",x"BB",x"32",x"F0",x"24",x"02", -- 0x0688 + x"FF",x"BF",x"1F",x"3F",x"2F",x"14",x"00",x"03", -- 0x0690 + x"6F",x"EF",x"F7",x"F7",x"36",x"2E",x"5E",x"85", -- 0x0698 + x"3C",x"23",x"8E",x"CF",x"4F",x"7B",x"3D",x"FE", -- 0x06A0 + x"9E",x"12",x"3B",x"7D",x"9D",x"ED",x"FB",x"F7", -- 0x06A8 + x"00",x"00",x"20",x"6C",x"F8",x"58",x"26",x"16", -- 0x06B0 + x"80",x"80",x"80",x"98",x"8C",x"16",x"1C",x"1E", -- 0x06B8 + x"1C",x"0C",x"00",x"21",x"41",x"08",x"08",x"00", -- 0x06C0 + x"40",x"20",x"60",x"C0",x"80",x"84",x"82",x"00", -- 0x06C8 + x"38",x"3C",x"18",x"00",x"01",x"03",x"08",x"1C", -- 0x06D0 + x"00",x"08",x"0C",x"0E",x"C6",x"C4",x"86",x"42", -- 0x06D8 + x"4E",x"06",x"01",x"01",x"03",x"03",x"01",x"00", -- 0x06E0 + x"20",x"00",x"06",x"0F",x"07",x"03",x"01",x"00", -- 0x06E8 + x"00",x"00",x"10",x"10",x"00",x"00",x"04",x"8E", -- 0x06F0 + x"00",x"00",x"00",x"02",x"24",x"A0",x"60",x"30", -- 0x06F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0700 + x"00",x"01",x"21",x"13",x"0F",x"0F",x"07",x"1F", -- 0x0708 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0710 + x"3F",x"5F",x"17",x"0F",x"07",x"09",x"08",x"00", -- 0x0718 + x"00",x"00",x"04",x"88",x"B0",x"F0",x"F8",x"FE", -- 0x0720 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0728 + x"C8",x"F0",x"B8",x"D8",x"E4",x"C0",x"00",x"00", -- 0x0730 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0738 + x"02",x"01",x"00",x"00",x"00",x"00",x"00",x"03", -- 0x0740 + x"00",x"07",x"8F",x"FF",x"3F",x"7C",x"7B",x"73", -- 0x0748 + x"3F",x"0E",x"00",x"00",x"01",x"02",x"00",x"00", -- 0x0750 + x"F7",x"77",x"7B",x"FD",x"1E",x"0F",x"07",x"05", -- 0x0758 + x"00",x"30",x"F8",x"FF",x"FF",x"EF",x"EF",x"F7", -- 0x0760 + x"00",x"00",x"40",x"80",x"00",x"80",x"C0",x"C0", -- 0x0768 + x"F3",x"F7",x"EF",x"FF",x"9C",x"F8",x"E4",x"80", -- 0x0770 + x"B8",x"84",x"00",x"00",x"C0",x"20",x"00",x"00", -- 0x0778 + x"10",x"08",x"00",x"00",x"11",x"1F",x"0F",x"1F", -- 0x0780 + x"0E",x"1E",x"3E",x"BF",x"DF",x"EE",x"FF",x"FF", -- 0x0788 + x"1F",x"07",x"03",x"31",x"00",x"01",x"03",x"00", -- 0x0790 + x"FF",x"CF",x"BF",x"7F",x"FE",x"BF",x"1F",x"07", -- 0x0798 + x"00",x"F8",x"FF",x"FF",x"FF",x"FF",x"F8",x"E7", -- 0x07A0 + x"00",x"10",x"30",x"F0",x"F8",x"FC",x"0C",x"FC", -- 0x07A8 + x"EF",x"FF",x"FF",x"FF",x"EF",x"1C",x"F8",x"80", -- 0x07B0 + x"FC",x"FC",x"F8",x"F0",x"80",x"46",x"22",x"00", -- 0x07B8 + x"00",x"00",x"39",x"31",x"69",x"00",x"00",x"00", -- 0x07C0 + x"00",x"00",x"8F",x"DF",x"C6",x"07",x"01",x"00", -- 0x07C8 + x"0C",x"38",x"00",x"0C",x"1E",x"0C",x"00",x"00", -- 0x07D0 + x"01",x"39",x"38",x"18",x"00",x"00",x"00",x"00", -- 0x07D8 + x"00",x"18",x"1A",x"1A",x"03",x"02",x"44",x"C0", -- 0x07E0 + x"00",x"00",x"00",x"00",x"70",x"60",x"00",x"00", -- 0x07E8 + x"C1",x"01",x"00",x"70",x"70",x"60",x"00",x"00", -- 0x07F0 + x"80",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F8 + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0800 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0808 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0810 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0818 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0820 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0828 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0830 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0838 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0840 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0848 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0850 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0858 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0860 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0868 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0870 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0878 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0880 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0888 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0890 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0898 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x08A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x08A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x08B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x08B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x08C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x08C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x08D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x08D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x08E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x08E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x08F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x08F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0900 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0908 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0910 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0918 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0920 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0928 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0930 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0938 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0940 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0948 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0950 + x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"00", -- 0x0958 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0960 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0968 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0970 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0978 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0980 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0988 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0990 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0998 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A18 + x"00",x"00",x"00",x"01",x"01",x"01",x"1D",x"0F", -- 0x0A20 + x"00",x"40",x"C0",x"C0",x"C0",x"C0",x"C0",x"40", -- 0x0A28 + x"0F",x"1F",x"01",x"01",x"01",x"00",x"00",x"00", -- 0x0A30 + x"40",x"C0",x"C0",x"C0",x"C0",x"C0",x"40",x"00", -- 0x0A38 + x"1D",x"74",x"1F",x"33",x"23",x"03",x"01",x"01", -- 0x0A40 + x"80",x"C0",x"80",x"E0",x"80",x"80",x"C0",x"C0", -- 0x0A48 + x"01",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A50 + x"C0",x"C0",x"C0",x"00",x"00",x"00",x"00",x"00", -- 0x0A58 + x"FB",x"4B",x"FD",x"47",x"47",x"67",x"03",x"03", -- 0x0A60 + x"80",x"00",x"80",x"C0",x"00",x"00",x"00",x"00", -- 0x0A68 + x"03",x"03",x"03",x"01",x"01",x"00",x"00",x"00", -- 0x0A70 + x"00",x"00",x"80",x"C0",x"C0",x"C0",x"C0",x"C0", -- 0x0A78 + x"10",x"AC",x"D6",x"98",x"6F",x"23",x"7B",x"03", -- 0x0A80 + x"C0",x"C0",x"C0",x"C0",x"C0",x"80",x"00",x"00", -- 0x0A88 + x"03",x"03",x"67",x"47",x"47",x"7D",x"CB",x"7B", -- 0x0A90 + x"00",x"00",x"00",x"00",x"C0",x"80",x"D0",x"80", -- 0x0A98 + x"EB",x"BD",x"8F",x"CF",x"1E",x"0E",x"0C",x"0C", -- 0x0AA0 + x"10",x"C0",x"20",x"80",x"40",x"00",x"00",x"00", -- 0x0AA8 + x"1C",x"1C",x"1C",x"1E",x"0E",x"0C",x"0C",x"04", -- 0x0AB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AC0 + x"00",x"0C",x"0C",x"1C",x"38",x"78",x"70",x"D0", -- 0x0AC8 + x"00",x"39",x"A3",x"B3",x"5F",x"5C",x"FD",x"5B", -- 0x0AD0 + x"C0",x"C0",x"C0",x"80",x"E0",x"D0",x"E0",x"90", -- 0x0AD8 + x"00",x"00",x"00",x"00",x"01",x"01",x"13",x"1F", -- 0x0AE0 + x"00",x"00",x"00",x"00",x"40",x"40",x"E4",x"FC", -- 0x0AE8 + x"03",x"01",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x0AF0 + x"E0",x"C0",x"C0",x"80",x"00",x"00",x"00",x"00", -- 0x0AF8 + x"00",x"00",x"00",x"01",x"03",x"1C",x"23",x"C0", -- 0x0B00 + x"00",x"7E",x"FC",x"08",x"F1",x"13",x"FF",x"0F", -- 0x0B08 + x"23",x"1C",x"03",x"01",x"00",x"00",x"00",x"00", -- 0x0B10 + x"FF",x"13",x"F1",x"08",x"FC",x"7E",x"00",x"00", -- 0x0B18 + x"1C",x"38",x"C2",x"06",x"C2",x"38",x"1C",x"00", -- 0x0B20 + x"00",x"00",x"00",x"18",x"08",x"1C",x"FE",x"F8", -- 0x0B28 + x"0C",x"06",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B30 + x"FE",x"1C",x"08",x"18",x"00",x"00",x"00",x"00", -- 0x0B38 + x"02",x"07",x"07",x"0F",x"0F",x"0F",x"1F",x"18", -- 0x0B40 + x"00",x"00",x"00",x"80",x"80",x"80",x"C0",x"C0", -- 0x0B48 + x"17",x"37",x"38",x"3F",x"70",x"7F",x"7F",x"00", -- 0x0B50 + x"40",x"60",x"E0",x"E0",x"70",x"F0",x"F0",x"00", -- 0x0B58 + x"02",x"02",x"07",x"07",x"0F",x"0F",x"1F",x"00", -- 0x0B60 + x"00",x"00",x"00",x"00",x"80",x"80",x"C0",x"00", -- 0x0B68 + x"7F",x"00",x"00",x"0F",x"7F",x"48",x"7F",x"00", -- 0x0B70 + x"00",x"03",x"03",x"00",x"00",x"7F",x"41",x"41", -- 0x0B78 + x"00",x"01",x"03",x"07",x"03",x"07",x"0F",x"3F", -- 0x0B80 + x"80",x"80",x"D8",x"F8",x"F8",x"F0",x"F0",x"F0", -- 0x0B88 + x"1F",x"1F",x"1F",x"0F",x"03",x"07",x"07",x"01", -- 0x0B90 + x"F8",x"F8",x"F0",x"E0",x"F8",x"FC",x"78",x"00", -- 0x0B98 + x"00",x"00",x"00",x"00",x"00",x"04",x"01",x"03", -- 0x0BA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"40",x"90", -- 0x0BA8 + x"07",x"02",x"02",x"08",x"00",x"00",x"00",x"00", -- 0x0BB0 + x"C0",x"80",x"A0",x"10",x"00",x"00",x"00",x"00", -- 0x0BB8 + x"00",x"00",x"00",x"04",x"24",x"04",x"4E",x"27", -- 0x0BC0 + x"00",x"00",x"20",x"40",x"11",x"80",x"A4",x"C8", -- 0x0BC8 + x"07",x"03",x"25",x"00",x"08",x"00",x"00",x"00", -- 0x0BD0 + x"C0",x"20",x"90",x"A0",x"20",x"50",x"00",x"00", -- 0x0BD8 + x"00",x"00",x"42",x"20",x"04",x"0F",x"E7",x"3F", -- 0x0BE0 + x"00",x"20",x"44",x"C8",x"80",x"80",x"D0",x"EC", -- 0x0BE8 + x"07",x"07",x"0D",x"1D",x"29",x"42",x"01",x"00", -- 0x0BF0 + x"C0",x"A0",x"B0",x"88",x"44",x"20",x"10",x"08", -- 0x0BF8 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0C00 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0C08 + x"07",x"00",x"06",x"09",x"09",x"09",x"06",x"00", -- 0x0C10 + x"C0",x"00",x"C0",x"20",x"20",x"20",x"C0",x"00", -- 0x0C18 + x"00",x"07",x"08",x"08",x"07",x"00",x"07",x"08", -- 0x0C20 + x"00",x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20", -- 0x0C28 + x"08",x"07",x"00",x"00",x"0F",x"04",x"00",x"00", -- 0x0C30 + x"20",x"C0",x"00",x"20",x"E0",x"20",x"00",x"00", -- 0x0C38 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0C40 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0C48 + x"07",x"00",x"06",x"09",x"08",x"08",x"04",x"00", -- 0x0C50 + x"C0",x"00",x"20",x"20",x"A0",x"60",x"20",x"00", -- 0x0C58 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0C60 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0C68 + x"07",x"00",x"08",x"0D",x"0B",x"09",x"08",x"00", -- 0x0C70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"23", -- 0x0DA0 + x"00",x"00",x"20",x"10",x"18",x"38",x"FC",x"78", -- 0x0DA8 + x"33",x"1F",x"1F",x"0F",x"01",x"00",x"00",x"00", -- 0x0DB0 + x"78",x"D8",x"48",x"20",x"B0",x"10",x"00",x"00", -- 0x0DB8 + x"00",x"00",x"00",x"00",x"00",x"20",x"31",x"1F", -- 0x0DC0 + x"00",x"00",x"00",x"08",x"08",x"1C",x"7C",x"7C", -- 0x0DC8 + x"1F",x"1F",x"06",x"02",x"00",x"00",x"00",x"00", -- 0x0DD0 + x"F8",x"B8",x"90",x"C0",x"40",x"40",x"00",x"00", -- 0x0DD8 + x"00",x"00",x"00",x"00",x"10",x"10",x"19",x"1F", -- 0x0DE0 + x"00",x"00",x"00",x"00",x"04",x"04",x"4C",x"7C", -- 0x0DE8 + x"1F",x"0E",x"06",x"02",x"00",x"00",x"00",x"00", -- 0x0DF0 + x"FC",x"B8",x"B0",x"A0",x"80",x"80",x"00",x"00", -- 0x0DF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E08 + x"3F",x"3F",x"7F",x"0B",x"0B",x"07",x"03",x"02", -- 0x0E10 + x"CE",x"FE",x"FE",x"EC",x"74",x"FC",x"FC",x"4C", -- 0x0E18 + x"04",x"07",x"1F",x"1F",x"3D",x"7D",x"1F",x"2F", -- 0x0E20 + x"04",x"04",x"F8",x"FC",x"F4",x"FC",x"FC",x"FE", -- 0x0E28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E38 + x"2E",x"1F",x"1F",x"1F",x"27",x"42",x"04",x"00", -- 0x0E40 + x"7E",x"FE",x"FE",x"BE",x"BD",x"50",x"00",x"00", -- 0x0E48 + x"F7",x"EB",x"DD",x"3D",x"FD",x"7F",x"F7",x"2D", -- 0x0E50 + x"F7",x"EF",x"DB",x"B7",x"AF",x"BE",x"FE",x"EA", -- 0x0E58 + x"7F",x"7F",x"FF",x"7E",x"BD",x"DB",x"FB",x"F7", -- 0x0E60 + x"FF",x"FE",x"6F",x"AF",x"D7",x"DD",x"ED",x"F7", -- 0x0E68 + x"00",x"00",x"87",x"5F",x"3B",x"7B",x"7F",x"FF", -- 0x0E70 + x"00",x"02",x"FC",x"FC",x"D4",x"BE",x"4E",x"CD", -- 0x0E78 + x"60",x"74",x"D8",x"CE",x"64",x"68",x"FF",x"10", -- 0x0E80 + x"0B",x"37",x"7B",x"BB",x"32",x"F0",x"24",x"02", -- 0x0E88 + x"FF",x"BF",x"1F",x"3F",x"2F",x"14",x"00",x"03", -- 0x0E90 + x"6F",x"EF",x"F7",x"F7",x"36",x"2E",x"5E",x"85", -- 0x0E98 + x"3C",x"23",x"8E",x"CF",x"4F",x"7B",x"3D",x"FE", -- 0x0EA0 + x"9E",x"12",x"3B",x"7D",x"9D",x"ED",x"FB",x"F7", -- 0x0EA8 + x"00",x"00",x"20",x"6C",x"F8",x"58",x"26",x"16", -- 0x0EB0 + x"80",x"80",x"80",x"98",x"8C",x"16",x"1C",x"1E", -- 0x0EB8 + x"1C",x"0C",x"00",x"21",x"41",x"08",x"08",x"00", -- 0x0EC0 + x"40",x"20",x"60",x"C0",x"80",x"84",x"82",x"00", -- 0x0EC8 + x"38",x"3C",x"18",x"00",x"01",x"03",x"08",x"1C", -- 0x0ED0 + x"00",x"08",x"0C",x"0E",x"C6",x"C4",x"86",x"42", -- 0x0ED8 + x"4E",x"06",x"01",x"01",x"03",x"03",x"01",x"00", -- 0x0EE0 + x"20",x"00",x"06",x"0F",x"07",x"03",x"01",x"00", -- 0x0EE8 + x"00",x"00",x"10",x"10",x"00",x"00",x"04",x"8E", -- 0x0EF0 + x"00",x"00",x"00",x"02",x"24",x"A0",x"60",x"30", -- 0x0EF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F00 + x"00",x"01",x"21",x"13",x"0F",x"0F",x"07",x"1F", -- 0x0F08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F10 + x"3F",x"5F",x"17",x"0F",x"07",x"09",x"08",x"00", -- 0x0F18 + x"00",x"00",x"04",x"88",x"B0",x"F0",x"F8",x"FE", -- 0x0F20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F28 + x"C8",x"F0",x"B8",x"D8",x"E4",x"C0",x"00",x"00", -- 0x0F30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F38 + x"02",x"01",x"00",x"00",x"00",x"00",x"00",x"03", -- 0x0F40 + x"00",x"07",x"8F",x"FF",x"3F",x"7C",x"7B",x"73", -- 0x0F48 + x"3F",x"0E",x"00",x"00",x"01",x"02",x"00",x"00", -- 0x0F50 + x"F7",x"77",x"7B",x"FD",x"1E",x"0F",x"07",x"05", -- 0x0F58 + x"00",x"30",x"F8",x"FF",x"FF",x"EF",x"EF",x"F7", -- 0x0F60 + x"00",x"00",x"40",x"80",x"00",x"80",x"C0",x"C0", -- 0x0F68 + x"F3",x"F7",x"EF",x"FF",x"9C",x"F8",x"E4",x"80", -- 0x0F70 + x"B8",x"84",x"00",x"00",x"C0",x"20",x"00",x"00", -- 0x0F78 + x"10",x"08",x"00",x"00",x"11",x"1F",x"0F",x"1F", -- 0x0F80 + x"0E",x"1E",x"3E",x"BF",x"DF",x"EE",x"FF",x"FF", -- 0x0F88 + x"1F",x"07",x"03",x"31",x"00",x"01",x"03",x"00", -- 0x0F90 + x"FF",x"CF",x"BF",x"7F",x"FE",x"BF",x"1F",x"07", -- 0x0F98 + x"00",x"F8",x"FF",x"FF",x"FF",x"FF",x"F8",x"E7", -- 0x0FA0 + x"00",x"10",x"30",x"F0",x"F8",x"FC",x"0C",x"FC", -- 0x0FA8 + x"EF",x"FF",x"FF",x"FF",x"EF",x"1C",x"F8",x"80", -- 0x0FB0 + x"FC",x"FC",x"F8",x"F0",x"80",x"46",x"22",x"00", -- 0x0FB8 + x"00",x"00",x"39",x"31",x"69",x"00",x"00",x"00", -- 0x0FC0 + x"00",x"00",x"8F",x"DF",x"C6",x"07",x"01",x"00", -- 0x0FC8 + x"0C",x"38",x"00",x"0C",x"1E",x"0C",x"00",x"00", -- 0x0FD0 + x"01",x"39",x"38",x"18",x"00",x"00",x"00",x"00", -- 0x0FD8 + x"00",x"18",x"1A",x"1A",x"03",x"02",x"44",x"C0", -- 0x0FE0 + x"00",x"00",x"00",x"00",x"70",x"60",x"00",x"00", -- 0x0FE8 + x"C1",x"01",x"00",x"70",x"70",x"60",x"00",x"00", -- 0x0FF0 + x"80",x"80",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x0FF8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GALAXIAN_1K.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GALAXIAN_1K.vhd new file mode 100644 index 00000000..693ba290 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GALAXIAN_1K.vhd @@ -0,0 +1,541 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GALAXIAN_1K is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(11 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GALAXIAN_1K is + + + type ROM_ARRAY is array(0 to 4095) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"02",x"3E",x"0F",x"1E",x"0E",x"0C",x"00",x"00", -- 0x0050 + x"00",x"00",x"00",x"00",x"60",x"E0",x"60",x"40", -- 0x0058 + x"0A",x"3F",x"EF",x"C6",x"D2",x"7B",x"7B",x"76", -- 0x0060 + x"00",x"00",x"10",x"28",x"28",x"10",x"00",x"00", -- 0x0068 + x"00",x"03",x"03",x"02",x"00",x"00",x"00",x"00", -- 0x0070 + x"00",x"00",x"40",x"E8",x"BC",x"6C",x"68",x"20", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"00", -- 0x0158 + x"00",x"00",x"00",x"00",x"00",x"01",x"00",x"08", -- 0x0160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"20", -- 0x0168 + x"02",x"00",x"04",x"01",x"00",x"00",x"00",x"00", -- 0x0170 + x"80",x"00",x"40",x"00",x"00",x"00",x"00",x"00", -- 0x0178 + x"00",x"00",x"00",x"00",x"00",x"04",x"00",x"00", -- 0x0180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0188 + x"00",x"02",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0190 + x"10",x"80",x"00",x"40",x"00",x"00",x"00",x"00", -- 0x0198 + x"00",x"00",x"00",x"00",x"08",x"20",x"02",x"00", -- 0x01A0 + x"00",x"00",x"00",x"00",x"00",x"40",x"08",x"00", -- 0x01A8 + x"01",x"00",x"10",x"00",x"01",x"00",x"00",x"00", -- 0x01B0 + x"00",x"00",x"A0",x"00",x"00",x"20",x"00",x"00", -- 0x01B8 + x"00",x"00",x"00",x"00",x"10",x"04",x"00",x"11", -- 0x01C0 + x"00",x"00",x"00",x"00",x"80",x"10",x"40",x"00", -- 0x01C8 + x"00",x"02",x"10",x"04",x"00",x"04",x"00",x"00", -- 0x01D0 + x"88",x"20",x"00",x"50",x"00",x"40",x"00",x"00", -- 0x01D8 + x"00",x"03",x"00",x"01",x"00",x"00",x"00",x"00", -- 0x01E0 + x"00",x"00",x"00",x"80",x"00",x"C0",x"00",x"60", -- 0x01E8 + x"00",x"00",x"00",x"00",x"00",x"01",x"00",x"03", -- 0x01F0 + x"00",x"60",x"00",x"C0",x"00",x"80",x"00",x"00", -- 0x01F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0200 + x"00",x"00",x"00",x"00",x"00",x"60",x"00",x"60", -- 0x0208 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0210 + x"00",x"60",x"00",x"60",x"00",x"00",x"00",x"00", -- 0x0218 + x"00",x"02",x"00",x"00",x"08",x"00",x"42",x"00", -- 0x0220 + x"00",x"00",x"00",x"40",x"10",x"01",x"40",x"00", -- 0x0228 + x"00",x"05",x"10",x"00",x"20",x"04",x"00",x"00", -- 0x0230 + x"01",x"00",x"22",x"00",x"08",x"40",x"22",x"00", -- 0x0238 + x"00",x"00",x"20",x"32",x"33",x"07",x"07",x"0F", -- 0x0240 + x"00",x"00",x"00",x"00",x"00",x"90",x"D0",x"C0", -- 0x0248 + x"0F",x"07",x"07",x"33",x"32",x"20",x"00",x"00", -- 0x0250 + x"C0",x"D0",x"90",x"00",x"00",x"00",x"00",x"00", -- 0x0258 + x"00",x"40",x"24",x"12",x"0A",x"25",x"1B",x"07", -- 0x0260 + x"00",x"02",x"24",x"48",x"50",x"A4",x"D8",x"E0", -- 0x0268 + x"07",x"1B",x"25",x"0A",x"12",x"24",x"40",x"00", -- 0x0270 + x"E0",x"D8",x"A4",x"50",x"48",x"24",x"02",x"00", -- 0x0278 + x"00",x"00",x"18",x"0A",x"0B",x"07",x"07",x"0F", -- 0x0280 + x"00",x"00",x"00",x"00",x"00",x"90",x"D0",x"F0", -- 0x0288 + x"0F",x"07",x"07",x"0B",x"0A",x"18",x"00",x"00", -- 0x0290 + x"F0",x"D0",x"90",x"00",x"00",x"00",x"00",x"00", -- 0x0298 + x"00",x"00",x"00",x"00",x"00",x"06",x"06",x"00", -- 0x02A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02A8 + x"00",x"00",x"00",x"06",x"06",x"00",x"00",x"00", -- 0x02B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02B8 + x"00",x"00",x"00",x"00",x"06",x"06",x"00",x"00", -- 0x02C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C8 + x"00",x"00",x"06",x"06",x"00",x"00",x"00",x"00", -- 0x02D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D8 + x"00",x"00",x"00",x"06",x"06",x"00",x"00",x"00", -- 0x02E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E8 + x"00",x"06",x"06",x"00",x"00",x"00",x"00",x"00", -- 0x02F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02F8 + x"00",x"00",x"00",x"00",x"00",x"03",x"1C",x"3F", -- 0x0300 + x"00",x"00",x"78",x"F0",x"E1",x"E1",x"05",x"F5", -- 0x0308 + x"1C",x"03",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0310 + x"05",x"E1",x"E1",x"F0",x"78",x"00",x"00",x"00", -- 0x0318 + x"00",x"18",x"3A",x"FE",x"3A",x"18",x"00",x"00", -- 0x0320 + x"3C",x"3C",x"3C",x"3C",x"3C",x"3C",x"3C",x"3C", -- 0x0328 + x"3C",x"3C",x"3C",x"3C",x"3C",x"3C",x"3C",x"3C", -- 0x0330 + x"3C",x"3C",x"3C",x"3C",x"3C",x"3C",x"3C",x"3C", -- 0x0338 + x"3C",x"3C",x"3C",x"3C",x"3C",x"3C",x"3C",x"3C", -- 0x0340 + x"3C",x"3C",x"3C",x"3C",x"3C",x"3C",x"3C",x"3C", -- 0x0348 + x"FF",x"3F",x"0F",x"03",x"00",x"00",x"00",x"00", -- 0x0350 + x"F0",x"00",x"00",x"80",x"60",x"00",x"00",x"00", -- 0x0358 + x"00",x"00",x"00",x"01",x"06",x"FF",x"FF",x"FF", -- 0x0360 + x"00",x"00",x"E0",x"80",x"80",x"00",x"F0",x"F8", -- 0x0368 + x"FF",x"1F",x"03",x"00",x"00",x"00",x"00",x"00", -- 0x0370 + x"F0",x"80",x"C0",x"E0",x"38",x"00",x"00",x"00", -- 0x0378 + x"00",x"00",x"00",x"02",x"05",x"00",x"03",x"0C", -- 0x0380 + x"00",x"00",x"00",x"10",x"50",x"68",x"88",x"C8", -- 0x0388 + x"03",x"0A",x"03",x"01",x"04",x"03",x"00",x"00", -- 0x0390 + x"F4",x"A0",x"C0",x"70",x"40",x"20",x"00",x"00", -- 0x0398 + x"00",x"00",x"00",x"00",x"02",x"0A",x"04",x"00", -- 0x03A0 + x"00",x"00",x"00",x"00",x"50",x"A0",x"00",x"20", -- 0x03A8 + x"00",x"09",x"01",x"02",x"00",x"00",x"00",x"00", -- 0x03B0 + x"38",x"10",x"00",x"40",x"20",x"00",x"00",x"00", -- 0x03B8 + x"00",x"02",x"01",x"01",x"01",x"40",x"13",x"01", -- 0x03C0 + x"00",x"00",x"00",x"04",x"0C",x"18",x"80",x"90", -- 0x03C8 + x"00",x"08",x"00",x"00",x"02",x"04",x"00",x"00", -- 0x03D0 + x"82",x"CC",x"00",x"10",x"98",x"84",x"00",x"00", -- 0x03D8 + x"08",x"04",x"00",x"02",x"8C",x"0E",x"07",x"0F", -- 0x03E0 + x"01",x"12",x"00",x"04",x"00",x"C0",x"C8",x"E0", -- 0x03E8 + x"07",x"03",x"21",x"00",x"80",x"21",x"48",x"81", -- 0x03F0 + x"C2",x"80",x"01",x"00",x"22",x"00",x"02",x"01", -- 0x03F8 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0400 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0408 + x"07",x"00",x"06",x"09",x"09",x"09",x"06",x"00", -- 0x0410 + x"C0",x"00",x"C0",x"20",x"20",x"20",x"C0",x"00", -- 0x0418 + x"00",x"07",x"08",x"08",x"07",x"00",x"07",x"08", -- 0x0420 + x"00",x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20", -- 0x0428 + x"08",x"07",x"00",x"00",x"0F",x"04",x"00",x"00", -- 0x0430 + x"20",x"C0",x"00",x"20",x"E0",x"20",x"00",x"00", -- 0x0438 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0440 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0448 + x"07",x"00",x"06",x"09",x"08",x"08",x"04",x"00", -- 0x0450 + x"C0",x"00",x"20",x"20",x"A0",x"60",x"20",x"00", -- 0x0458 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0460 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0468 + x"07",x"00",x"08",x"0D",x"0B",x"09",x"08",x"00", -- 0x0470 + x"C0",x"00",x"C0",x"20",x"20",x"20",x"20",x"00", -- 0x0478 + x"30",x"34",x"62",x"43",x"81",x"80",x"C0",x"70", -- 0x0480 + x"1E",x"1E",x"9E",x"1E",x"9E",x"8C",x"04",x"00", -- 0x0488 + x"40",x"80",x"00",x"00",x"80",x"E0",x"60",x"70", -- 0x0490 + x"00",x"00",x"00",x"00",x"80",x"C0",x"C4",x"8C", -- 0x0498 + x"38",x"38",x"38",x"34",x"24",x"22",x"42",x"40", -- 0x04A0 + x"03",x"03",x"23",x"01",x"01",x"70",x"18",x"0C", -- 0x04A8 + x"40",x"80",x"00",x"C1",x"C1",x"60",x"60",x"70", -- 0x04B0 + x"10",x"80",x"80",x"C0",x"C8",x"C8",x"C0",x"81", -- 0x04B8 + x"80",x"20",x"E0",x"40",x"60",x"30",x"38",x"28", -- 0x04C0 + x"A0",x"70",x"38",x"18",x"08",x"00",x"00",x"20", -- 0x04C8 + x"41",x"21",x"41",x"38",x"38",x"24",x"64",x"80", -- 0x04D0 + x"00",x"00",x"02",x"02",x"04",x"00",x"40",x"20", -- 0x04D8 + x"F8",x"F8",x"FF",x"FF",x"F8",x"F8",x"F8",x"F8", -- 0x04E0 + x"00",x"00",x"18",x"F8",x"F8",x"18",x"00",x"00", -- 0x04E8 + x"1F",x"07",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F0 + x"18",x"F8",x"F8",x"18",x"00",x"00",x"00",x"00", -- 0x04F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"07",x"1F", -- 0x0500 + x"00",x"00",x"00",x"00",x"18",x"F8",x"F8",x"18", -- 0x0508 + x"F8",x"F8",x"F8",x"F8",x"FF",x"FF",x"F8",x"F8", -- 0x0510 + x"00",x"00",x"18",x"F8",x"F8",x"18",x"00",x"00", -- 0x0518 + x"F8",x"F8",x"FF",x"FF",x"F8",x"F8",x"1F",x"07", -- 0x0520 + x"00",x"18",x"F8",x"F8",x"18",x"00",x"18",x"F8", -- 0x0528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0530 + x"F8",x"18",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0538 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0540 + x"00",x"00",x"00",x"00",x"00",x"00",x"18",x"F8", -- 0x0548 + x"07",x"1F",x"F8",x"F8",x"FF",x"FF",x"F8",x"F8", -- 0x0550 + x"F8",x"18",x"00",x"18",x"F8",x"F8",x"18",x"00", -- 0x0558 + x"FF",x"F8",x"F8",x"F8",x"F8",x"1F",x"07",x"00", -- 0x0560 + x"F8",x"18",x"00",x"00",x"00",x"18",x"F8",x"F8", -- 0x0568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0570 + x"18",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0580 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"18", -- 0x0588 + x"00",x"07",x"1F",x"F8",x"F8",x"F8",x"F8",x"FF", -- 0x0590 + x"F8",x"F8",x"18",x"00",x"00",x"00",x"18",x"F8", -- 0x0598 + x"F0",x"E0",x"C0",x"40",x"40",x"40",x"01",x"23", -- 0x05A0 + x"1F",x"1E",x"9C",x"FE",x"FF",x"FF",x"FE",x"FC", -- 0x05A8 + x"3F",x"0F",x"0F",x"01",x"00",x"00",x"00",x"00", -- 0x05B0 + x"FE",x"FF",x"FF",x"FE",x"00",x"00",x"00",x"00", -- 0x05B8 + x"00",x"00",x"00",x"00",x"01",x"0F",x"0F",x"3F", -- 0x05C0 + x"00",x"00",x"00",x"00",x"FE",x"FF",x"FF",x"FE", -- 0x05C8 + x"23",x"01",x"40",x"40",x"40",x"C0",x"E0",x"F0", -- 0x05D0 + x"FC",x"FE",x"FF",x"FF",x"FE",x"9C",x"1E",x"1F", -- 0x05D8 + x"00",x"00",x"00",x"03",x"0F",x"3F",x"FF",x"FF", -- 0x05E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"C0",x"F0", -- 0x05E8 + x"FF",x"3F",x"0F",x"03",x"00",x"00",x"00",x"00", -- 0x05F0 + x"F0",x"00",x"00",x"80",x"60",x"00",x"00",x"00", -- 0x05F8 + x"21",x"01",x"02",x"00",x"00",x"00",x"00",x"00", -- 0x0600 + x"12",x"10",x"10",x"00",x"00",x"00",x"00",x"00", -- 0x0608 + x"38",x"04",x"38",x"0B",x"07",x"06",x"09",x"11", -- 0x0610 + x"36",x"26",x"56",x"90",x"F8",x"AC",x"B4",x"20", -- 0x0618 + x"00",x"05",x"0D",x"17",x"3A",x"16",x"28",x"34", -- 0x0620 + x"40",x"88",x"D0",x"DE",x"5A",x"B0",x"24",x"0E", -- 0x0628 + x"00",x"00",x"00",x"00",x"00",x"00",x"10",x"08", -- 0x0630 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"22", -- 0x0638 + x"1D",x"2E",x"46",x"8D",x"05",x"00",x"08",x"18", -- 0x0640 + x"AD",x"76",x"FA",x"E8",x"DA",x"33",x"01",x"00", -- 0x0648 + x"78",x"7C",x"BE",x"DE",x"DF",x"A3",x"7B",x"3B", -- 0x0650 + x"0E",x"1D",x"3D",x"7B",x"F7",x"CE",x"DC",x"DC", -- 0x0658 + x"3B",x"57",x"6F",x"57",x"DA",x"BC",x"3C",x"78", -- 0x0660 + x"DD",x"ED",x"F7",x"77",x"39",x"3E",x"1E",x"0E", -- 0x0668 + x"00",x"00",x"06",x"1D",x"0F",x"5F",x"2F",x"74", -- 0x0670 + x"00",x"00",x"7A",x"B4",x"EC",x"CE",x"B6",x"3F", -- 0x0678 + x"20",x"5C",x"EF",x"F2",x"5C",x"17",x"78",x"10", -- 0x0680 + x"0F",x"BB",x"34",x"77",x"76",x"6C",x"18",x"04", -- 0x0688 + x"FF",x"F7",x"6D",x"5D",x"4D",x"64",x"2D",x"02", -- 0x0690 + x"B7",x"F7",x"FB",x"FB",x"FB",x"77",x"8F",x"07", -- 0x0698 + x"3C",x"E0",x"E2",x"CF",x"4F",x"1F",x"3E",x"FF", -- 0x06A0 + x"1A",x"0E",x"37",x"7B",x"FB",x"FB",x"FF",x"7F", -- 0x06A8 + x"00",x"20",x"30",x"71",x"61",x"25",x"19",x"2E", -- 0x06B0 + x"00",x"40",x"42",x"4C",x"54",x"DA",x"3E",x"1D", -- 0x06B8 + x"1C",x"0E",x"00",x"00",x"01",x"00",x"00",x"00", -- 0x06C0 + x"00",x"20",x"60",x"C0",x"80",x"80",x"80",x"00", -- 0x06C8 + x"18",x"3C",x"18",x"01",x"22",x"41",x"08",x"1C", -- 0x06D0 + x"20",x"18",x"98",x"0E",x"C6",x"C4",x"86",x"22", -- 0x06D8 + x"0E",x"04",x"00",x"01",x"03",x"03",x"01",x"00", -- 0x06E0 + x"00",x"04",x"0E",x"0F",x"87",x"81",x"01",x"00", -- 0x06E8 + x"00",x"00",x"00",x"00",x"00",x"10",x"0C",x"0E", -- 0x06F0 + x"00",x"00",x"00",x"00",x"20",x"20",x"60",x"10", -- 0x06F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0700 + x"00",x"00",x"00",x"02",x"06",x"6F",x"1E",x"1C", -- 0x0708 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0710 + x"04",x"1E",x"1E",x"1D",x"03",x"01",x"00",x"00", -- 0x0718 + x"00",x"00",x"20",x"C0",x"E0",x"D0",x"78",x"30", -- 0x0720 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0728 + x"38",x"7C",x"E8",x"70",x"60",x"80",x"00",x"00", -- 0x0730 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0738 + x"00",x"00",x"10",x"10",x"10",x"0E",x"01",x"00", -- 0x0740 + x"00",x"06",x"0E",x"3F",x"17",x"7B",x"FC",x"FC", -- 0x0748 + x"00",x"01",x"06",x"08",x"10",x"00",x"00",x"00", -- 0x0750 + x"68",x"48",x"1C",x"3E",x"17",x"0B",x"03",x"01", -- 0x0758 + x"00",x"38",x"FF",x"7F",x"7E",x"19",x"13",x"0F", -- 0x0760 + x"00",x"00",x"00",x"04",x"08",x"98",x"C0",x"C0", -- 0x0768 + x"0F",x"0B",x"1D",x"0E",x"6C",x"B0",x"E0",x"80", -- 0x0770 + x"00",x"00",x"00",x"00",x"01",x"00",x"00",x"1F", -- 0x0778 + x"00",x"00",x"00",x"00",x"01",x"00",x"00",x"1F", -- 0x0780 + x"0F",x"1F",x"BF",x"FC",x"F8",x"FB",x"7F",x"FE", -- 0x0788 + x"1F",x"01",x"03",x"05",x"08",x"10",x"00",x"00", -- 0x0790 + x"FE",x"FB",x"CD",x"9E",x"3F",x"3B",x"17",x"07", -- 0x0798 + x"00",x"F8",x"FF",x"7F",x"7C",x"8F",x"CF",x"7F", -- 0x07A0 + x"00",x"00",x"00",x"90",x"78",x"FC",x"FC",x"FC", -- 0x07A8 + x"7F",x"FE",x"F5",x"26",x"1F",x"FC",x"F8",x"80", -- 0x07B0 + x"FC",x"3C",x"18",x"E0",x"40",x"00",x"00",x"00", -- 0x07B8 + x"00",x"00",x"38",x"30",x"78",x"38",x"00",x"00", -- 0x07C0 + x"00",x"00",x"00",x"CF",x"C6",x"07",x"00",x"00", -- 0x07C8 + x"00",x"00",x"00",x"0C",x"1E",x"1E",x"0C",x"00", -- 0x07D0 + x"00",x"38",x"78",x"38",x"10",x"00",x"00",x"00", -- 0x07D8 + x"00",x"18",x"18",x"18",x"00",x"00",x"00",x"80", -- 0x07E0 + x"00",x"00",x"00",x"00",x"78",x"70",x"20",x"00", -- 0x07E8 + x"C1",x"01",x"71",x"78",x"70",x"60",x"00",x"00", -- 0x07F0 + x"80",x"C0",x"80",x"00",x"30",x"20",x"10",x"00", -- 0x07F8 + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0800 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0808 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0810 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0818 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0820 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0828 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0830 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0838 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0840 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0848 + x"07",x"07",x"0E",x"1E",x"3C",x"F8",x"F0",x"E0", -- 0x0850 + x"06",x"07",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0858 + x"C0",x"E0",x"F0",x"F8",x"FC",x"3C",x"1E",x"0E", -- 0x0860 + x"07",x"C7",x"FF",x"FF",x"FE",x"7C",x"00",x"80", -- 0x0868 + x"FE",x"FF",x"FF",x"FF",x"0F",x"07",x"07",x"07", -- 0x0870 + x"FE",x"FE",x"FE",x"1F",x"00",x"00",x"04",x"06", -- 0x0878 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0880 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0888 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0890 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0898 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x08A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x08A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x08B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x08B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x08C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x08C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x08D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x08D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x08E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x08E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x08F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x08F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0900 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0908 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0910 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0918 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0920 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0928 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0930 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0938 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0940 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0948 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0950 + x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"00", -- 0x0958 + x"3C",x"0E",x"06",x"06",x"07",x"03",x"03",x"06", -- 0x0960 + x"F0",x"00",x"00",x"00",x"C0",x"E0",x"F0",x"F8", -- 0x0968 + x"03",x"03",x"03",x"03",x"07",x"FF",x"FE",x"FC", -- 0x0970 + x"07",x"03",x"33",x"38",x"1C",x"0C",x"06",x"03", -- 0x0978 + x"00",x"03",x"C3",x"FF",x"FF",x"FF",x"3F",x"07", -- 0x0980 + x"07",x"07",x"07",x"FE",x"FE",x"FC",x"F8",x"F0", -- 0x0988 + x"20",x"30",x"38",x"1C",x"0C",x"06",x"06",x"07", -- 0x0990 + x"03",x"FF",x"FF",x"FE",x"FC",x"F8",x"00",x"00", -- 0x0998 + x"30",x"38",x"0C",x"06",x"07",x"03",x"03",x"03", -- 0x09A0 + x"83",x"FF",x"FF",x"FF",x"7E",x"00",x"00",x"00", -- 0x09A8 + x"FF",x"1F",x"07",x"03",x"01",x"00",x"02",x"03", -- 0x09B0 + x"00",x"00",x"00",x"01",x"83",x"FF",x"FF",x"FF", -- 0x09B8 + x"03",x"07",x"FF",x"FF",x"FE",x"FC",x"F8",x"00", -- 0x09C0 + x"F8",x"FC",x"7E",x"0E",x"07",x"07",x"03",x"03", -- 0x09C8 + x"00",x"00",x"00",x"00",x"00",x"80",x"C0",x"F0", -- 0x09D0 + x"7C",x"7C",x"7C",x"7C",x"7F",x"3F",x"1F",x"0F", -- 0x09D8 + x"80",x"00",x"00",x"00",x"00",x"3C",x"3C",x"7C", -- 0x09E0 + x"7F",x"FF",x"FF",x"FF",x"FF",x"F0",x"E0",x"C0", -- 0x09E8 + x"F8",x"FF",x"FF",x"FF",x"77",x"40",x"00",x"0E", -- 0x09F0 + x"FF",x"FF",x"FF",x"61",x"40",x"00",x"00",x"00", -- 0x09F8 + x"FF",x"1F",x"01",x"00",x"00",x"80",x"F8",x"FF", -- 0x0A00 + x"80",x"80",x"80",x"80",x"C0",x"E0",x"FC",x"FF", -- 0x0A08 + x"01",x"00",x"3C",x"7F",x"FF",x"FF",x"FF",x"80", -- 0x0A10 + x"9C",x"9C",x"FC",x"FC",x"FF",x"3F",x"1F",x"07", -- 0x0A18 + x"00",x"00",x"00",x"00",x"00",x"00",x"1E",x"08", -- 0x0A20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"80", -- 0x0A28 + x"08",x"11",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A30 + x"80",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A38 + x"02",x"6B",x"00",x"30",x"20",x"00",x"00",x"00", -- 0x0A40 + x"00",x"40",x"00",x"60",x"80",x"80",x"40",x"40", -- 0x0A48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A58 + x"C4",x"34",x"C2",x"40",x"40",x"60",x"00",x"00", -- 0x0A60 + x"00",x"DE",x"00",x"C0",x"00",x"00",x"00",x"00", -- 0x0A68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A78 + x"00",x"10",x"18",x"7E",x"1E",x"1C",x"00",x"00", -- 0x0A80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A88 + x"00",x"00",x"60",x"40",x"40",x"42",x"B4",x"44", -- 0x0A90 + x"00",x"00",x"00",x"00",x"C0",x"00",x"E0",x"00", -- 0x0A98 + x"94",x"82",x"80",x"C0",x"00",x"00",x"00",x"00", -- 0x0AA0 + x"80",x"40",x"20",x"80",x"40",x"00",x"00",x"00", -- 0x0AA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AC8 + x"00",x"38",x"A0",x"A0",x"60",x"13",x"C2",x"24", -- 0x0AD0 + x"00",x"00",x"00",x"00",x"60",x"50",x"20",x"10", -- 0x0AD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x0AE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"40", -- 0x0AE8 + x"00",x"0E",x"1C",x"18",x"00",x"00",x"00",x"00", -- 0x0AF0 + x"00",x"38",x"1C",x"0C",x"00",x"00",x"00",x"00", -- 0x0AF8 + x"00",x"00",x"00",x"00",x"00",x"03",x"1C",x"3F", -- 0x0B00 + x"00",x"00",x"78",x"F0",x"E1",x"E1",x"05",x"F5", -- 0x0B08 + x"1C",x"03",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B10 + x"05",x"E1",x"E1",x"F0",x"78",x"00",x"00",x"00", -- 0x0B18 + x"00",x"18",x"3A",x"FE",x"3A",x"18",x"00",x"00", -- 0x0B20 + x"00",x"00",x"7E",x"3C",x"08",x"1C",x"FE",x"00", -- 0x0B28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B30 + x"FE",x"1C",x"08",x"3C",x"7E",x"00",x"00",x"00", -- 0x0B38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"07", -- 0x0B40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B48 + x"08",x"08",x"07",x"00",x"0F",x"00",x"00",x"7F", -- 0x0B50 + x"80",x"80",x"00",x"00",x"80",x"00",x"00",x"FF", -- 0x0B58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"1F", -- 0x0B60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"FF", -- 0x0B68 + x"7F",x"00",x"00",x"0F",x"7F",x"48",x"7F",x"00", -- 0x0B70 + x"00",x"03",x"03",x"00",x"00",x"7F",x"41",x"41", -- 0x0B78 + x"00",x"00",x"00",x"02",x"05",x"00",x"03",x"0C", -- 0x0B80 + x"00",x"00",x"00",x"10",x"50",x"68",x"88",x"C8", -- 0x0B88 + x"03",x"0A",x"03",x"01",x"04",x"03",x"00",x"00", -- 0x0B90 + x"F4",x"A0",x"C0",x"70",x"40",x"20",x"00",x"00", -- 0x0B98 + x"00",x"00",x"00",x"00",x"02",x"0A",x"04",x"00", -- 0x0BA0 + x"00",x"00",x"00",x"00",x"50",x"A0",x"00",x"20", -- 0x0BA8 + x"00",x"09",x"01",x"02",x"00",x"00",x"00",x"00", -- 0x0BB0 + x"38",x"10",x"00",x"40",x"20",x"00",x"00",x"00", -- 0x0BB8 + x"00",x"02",x"01",x"01",x"01",x"40",x"13",x"01", -- 0x0BC0 + x"00",x"00",x"00",x"04",x"0C",x"18",x"80",x"90", -- 0x0BC8 + x"00",x"08",x"00",x"00",x"02",x"04",x"00",x"00", -- 0x0BD0 + x"82",x"CC",x"00",x"10",x"98",x"84",x"00",x"00", -- 0x0BD8 + x"08",x"04",x"00",x"02",x"8C",x"0E",x"07",x"0F", -- 0x0BE0 + x"01",x"12",x"00",x"04",x"00",x"C0",x"C8",x"E0", -- 0x0BE8 + x"07",x"03",x"21",x"00",x"80",x"21",x"48",x"81", -- 0x0BF0 + x"C2",x"80",x"01",x"00",x"22",x"00",x"02",x"01", -- 0x0BF8 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0C00 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0C08 + x"07",x"00",x"06",x"09",x"09",x"09",x"06",x"00", -- 0x0C10 + x"C0",x"00",x"C0",x"20",x"20",x"20",x"C0",x"00", -- 0x0C18 + x"00",x"07",x"08",x"08",x"07",x"00",x"07",x"08", -- 0x0C20 + x"00",x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20", -- 0x0C28 + x"08",x"07",x"00",x"00",x"0F",x"04",x"00",x"00", -- 0x0C30 + x"20",x"C0",x"00",x"20",x"E0",x"20",x"00",x"00", -- 0x0C38 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0C40 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0C48 + x"07",x"00",x"06",x"09",x"08",x"08",x"04",x"00", -- 0x0C50 + x"C0",x"00",x"20",x"20",x"A0",x"60",x"20",x"00", -- 0x0C58 + x"07",x"08",x"08",x"07",x"00",x"07",x"08",x"08", -- 0x0C60 + x"C0",x"20",x"20",x"C0",x"00",x"C0",x"20",x"20", -- 0x0C68 + x"07",x"00",x"08",x"0D",x"0B",x"09",x"08",x"00", -- 0x0C70 + x"1C",x"7C",x"FC",x"FC",x"FC",x"DC",x"9C",x"9C", -- 0x0C78 + x"C0",x"FC",x"FF",x"FF",x"3F",x"03",x"00",x"00", -- 0x0C80 + x"FC",x"FC",x"7F",x"3F",x"1F",x"0F",x"03",x"00", -- 0x0C88 + x"FC",x"FC",x"FC",x"FC",x"9C",x"9C",x"9C",x"9C", -- 0x0C90 + x"F8",x"7F",x"3F",x"1F",x"07",x"01",x"3C",x"7C", -- 0x0C98 + x"F0",x"F0",x"F0",x"80",x"80",x"80",x"80",x"C0", -- 0x0CA0 + x"FF",x"FF",x"FF",x"87",x"00",x"00",x"00",x"E0", -- 0x0CA8 + x"C3",x"40",x"00",x"80",x"80",x"80",x"C0",x"F8", -- 0x0CB0 + x"80",x"C0",x"E0",x"F8",x"FF",x"FF",x"FF",x"FF", -- 0x0CB8 + x"E0",x"F8",x"FF",x"7F",x"3F",x"0F",x"03",x"00", -- 0x0CC0 + x"FF",x"FF",x"C0",x"80",x"80",x"80",x"80",x"C0", -- 0x0CC8 + x"00",x"00",x"00",x"00",x"00",x"3F",x"7F",x"FF", -- 0x0CD0 + x"E0",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CD8 + x"0F",x"1F",x"3E",x"FE",x"FC",x"F8",x"F8",x"F0", -- 0x0CE0 + x"00",x"00",x"00",x"01",x"01",x"03",x"03",x"07", -- 0x0CE8 + x"01",x"00",x"00",x"00",x"00",x"00",x"80",x"80", -- 0x0CF0 + x"41",x"40",x"00",x"00",x"00",x"01",x"01",x"01", -- 0x0CF8 + x"01",x"01",x"01",x"C1",x"F9",x"FF",x"FF",x"FF", -- 0x0D00 + x"00",x"00",x"00",x"00",x"00",x"01",x"01",x"01", -- 0x0D08 + x"01",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D10 + x"00",x"00",x"00",x"01",x"01",x"01",x"01",x"01", -- 0x0D18 + x"FF",x"FF",x"FF",x"C3",x"C0",x"00",x"00",x"00", -- 0x0D20 + x"01",x"00",x"00",x"00",x"00",x"00",x"C0",x"FC", -- 0x0D28 + x"00",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x0D30 + x"01",x"01",x"01",x"01",x"01",x"01",x"01",x"00", -- 0x0D38 + x"07",x"03",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x0D40 + x"00",x"00",x"00",x"01",x"01",x"61",x"7F",x"1F", -- 0x0D48 + x"01",x"00",x"00",x"03",x"01",x"01",x"00",x"00", -- 0x0D50 + x"39",x"38",x"18",x"18",x"0C",x"0C",x"06",x"03", -- 0x0D58 + x"01",x"01",x"01",x"01",x"01",x"19",x"39",x"39", -- 0x0D60 + x"1F",x"07",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D68 + x"E0",x"E0",x"E0",x"F0",x"7F",x"7F",x"3F",x"3F", -- 0x0D70 + x"7F",x"7E",x"7C",x"F8",x"F0",x"E0",x"E0",x"E0", -- 0x0D78 + x"00",x"00",x"00",x"00",x"00",x"00",x"07",x"3F", -- 0x0D80 + x"00",x"00",x"03",x"03",x"01",x"01",x"01",x"00", -- 0x0D88 + x"03",x"03",x"01",x"01",x"00",x"00",x"00",x"00", -- 0x0D90 + x"00",x"00",x"00",x"00",x"00",x"00",x"07",x"03", -- 0x0D98 + x"00",x"00",x"00",x"00",x"03",x"03",x"07",x"07", -- 0x0DA0 + x"00",x"00",x"00",x"00",x"00",x"F0",x"F0",x"F0", -- 0x0DA8 + x"07",x"0F",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0DB0 + x"F0",x"D0",x"40",x"20",x"30",x"10",x"00",x"00", -- 0x0DB8 + x"00",x"00",x"00",x"01",x"03",x"03",x"07",x"0F", -- 0x0DC0 + x"00",x"00",x"00",x"00",x"C0",x"F0",x"F8",x"F0", -- 0x0DC8 + x"0F",x"03",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DD0 + x"F0",x"B0",x"90",x"C0",x"40",x"40",x"00",x"00", -- 0x0DD8 + x"00",x"00",x"00",x"00",x"01",x"03",x"0F",x"0F", -- 0x0DE0 + x"00",x"00",x"00",x"80",x"C0",x"E0",x"F8",x"F8", -- 0x0DE8 + x"07",x"02",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DF0 + x"F0",x"A0",x"80",x"80",x"80",x"80",x"00",x"00", -- 0x0DF8 + x"21",x"01",x"02",x"00",x"00",x"00",x"00",x"00", -- 0x0E00 + x"12",x"10",x"10",x"00",x"00",x"00",x"00",x"00", -- 0x0E08 + x"38",x"04",x"38",x"0B",x"07",x"06",x"09",x"11", -- 0x0E10 + x"36",x"26",x"56",x"90",x"F8",x"AC",x"B4",x"20", -- 0x0E18 + x"00",x"05",x"0D",x"17",x"3A",x"16",x"28",x"34", -- 0x0E20 + x"40",x"88",x"D0",x"DE",x"5A",x"B0",x"24",x"0E", -- 0x0E28 + x"00",x"00",x"00",x"00",x"00",x"00",x"10",x"08", -- 0x0E30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"22", -- 0x0E38 + x"1D",x"2E",x"46",x"8D",x"05",x"00",x"08",x"18", -- 0x0E40 + x"AD",x"76",x"FA",x"E8",x"DA",x"33",x"01",x"00", -- 0x0E48 + x"78",x"7C",x"BE",x"DE",x"DF",x"A3",x"7B",x"3B", -- 0x0E50 + x"0E",x"1D",x"3D",x"7B",x"F7",x"CE",x"DC",x"DC", -- 0x0E58 + x"3B",x"57",x"6F",x"57",x"DA",x"BC",x"3C",x"78", -- 0x0E60 + x"DD",x"ED",x"F7",x"77",x"39",x"3E",x"1E",x"0E", -- 0x0E68 + x"00",x"00",x"06",x"1D",x"0F",x"5F",x"2F",x"74", -- 0x0E70 + x"00",x"00",x"7A",x"B4",x"EC",x"CE",x"B6",x"3F", -- 0x0E78 + x"20",x"5C",x"EF",x"F2",x"5C",x"17",x"78",x"10", -- 0x0E80 + x"0F",x"BB",x"34",x"77",x"76",x"6C",x"18",x"04", -- 0x0E88 + x"FF",x"F7",x"6D",x"5D",x"4D",x"64",x"2D",x"02", -- 0x0E90 + x"B7",x"F7",x"FB",x"FB",x"FB",x"77",x"8F",x"07", -- 0x0E98 + x"3C",x"E0",x"E2",x"CF",x"4F",x"1F",x"3E",x"FF", -- 0x0EA0 + x"1A",x"0E",x"37",x"7B",x"FB",x"FB",x"FF",x"7F", -- 0x0EA8 + x"00",x"20",x"30",x"71",x"61",x"25",x"19",x"2E", -- 0x0EB0 + x"00",x"40",x"42",x"4C",x"54",x"DA",x"3E",x"1D", -- 0x0EB8 + x"1C",x"0E",x"00",x"00",x"01",x"00",x"00",x"00", -- 0x0EC0 + x"00",x"20",x"60",x"C0",x"80",x"80",x"80",x"00", -- 0x0EC8 + x"18",x"3C",x"18",x"01",x"22",x"41",x"08",x"1C", -- 0x0ED0 + x"20",x"18",x"98",x"0E",x"C6",x"C4",x"86",x"22", -- 0x0ED8 + x"0E",x"04",x"00",x"01",x"03",x"03",x"01",x"00", -- 0x0EE0 + x"00",x"04",x"0E",x"0F",x"87",x"81",x"01",x"00", -- 0x0EE8 + x"00",x"00",x"00",x"00",x"00",x"10",x"0C",x"0E", -- 0x0EF0 + x"00",x"00",x"00",x"00",x"20",x"20",x"60",x"10", -- 0x0EF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F00 + x"00",x"00",x"00",x"02",x"06",x"6F",x"1E",x"1C", -- 0x0F08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F10 + x"04",x"1E",x"1E",x"1D",x"03",x"01",x"00",x"00", -- 0x0F18 + x"00",x"00",x"20",x"C0",x"E0",x"D0",x"78",x"30", -- 0x0F20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F28 + x"38",x"7C",x"E8",x"70",x"60",x"80",x"00",x"00", -- 0x0F30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F38 + x"00",x"00",x"10",x"10",x"10",x"0E",x"01",x"00", -- 0x0F40 + x"00",x"06",x"0E",x"3F",x"17",x"7B",x"FC",x"FC", -- 0x0F48 + x"00",x"01",x"06",x"08",x"10",x"00",x"00",x"00", -- 0x0F50 + x"68",x"48",x"1C",x"3E",x"17",x"0B",x"03",x"01", -- 0x0F58 + x"00",x"38",x"FF",x"7F",x"7E",x"19",x"13",x"0F", -- 0x0F60 + x"00",x"00",x"00",x"04",x"08",x"98",x"C0",x"C0", -- 0x0F68 + x"0F",x"0B",x"1D",x"0E",x"6C",x"B0",x"E0",x"80", -- 0x0F70 + x"00",x"00",x"00",x"00",x"01",x"00",x"00",x"1F", -- 0x0F78 + x"00",x"00",x"00",x"00",x"01",x"00",x"00",x"1F", -- 0x0F80 + x"0F",x"1F",x"BF",x"FC",x"F8",x"FB",x"7F",x"FE", -- 0x0F88 + x"1F",x"01",x"03",x"05",x"08",x"10",x"00",x"00", -- 0x0F90 + x"FE",x"FB",x"CD",x"9E",x"3F",x"3B",x"17",x"07", -- 0x0F98 + x"00",x"F8",x"FF",x"7F",x"7C",x"8F",x"CF",x"7F", -- 0x0FA0 + x"00",x"00",x"00",x"90",x"78",x"FC",x"FC",x"FC", -- 0x0FA8 + x"7F",x"FE",x"F5",x"26",x"1F",x"FC",x"F8",x"80", -- 0x0FB0 + x"FC",x"3C",x"18",x"E0",x"40",x"00",x"00",x"00", -- 0x0FB8 + x"00",x"00",x"38",x"30",x"78",x"38",x"00",x"00", -- 0x0FC0 + x"00",x"00",x"00",x"CF",x"C6",x"07",x"00",x"00", -- 0x0FC8 + x"00",x"00",x"00",x"0C",x"1E",x"1E",x"0C",x"00", -- 0x0FD0 + x"00",x"38",x"78",x"38",x"10",x"00",x"00",x"00", -- 0x0FD8 + x"00",x"18",x"18",x"18",x"00",x"00",x"00",x"80", -- 0x0FE0 + x"00",x"00",x"00",x"00",x"78",x"70",x"20",x"00", -- 0x0FE8 + x"C1",x"01",x"71",x"78",x"70",x"60",x"00",x"00", -- 0x0FF0 + x"80",x"C0",x"80",x"00",x"30",x"20",x"10",x"00" -- 0x0FF8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GALAXIAN_6L.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GALAXIAN_6L.vhd new file mode 100644 index 00000000..222709ac --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GALAXIAN_6L.vhd @@ -0,0 +1,33 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GALAXIAN_6L is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(4 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GALAXIAN_6L is + + + type ROM_ARRAY is array(0 to 31) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"33",x"C3",x"F6",x"00",x"17",x"C0",x"3F", -- 0x0000 + x"00",x"D8",x"07",x"3F",x"00",x"C0",x"C4",x"07", -- 0x0008 + x"00",x"C0",x"B0",x"1F",x"00",x"1E",x"71",x"07", -- 0x0010 + x"00",x"F6",x"07",x"F0",x"00",x"76",x"07",x"C6" -- 0x0018 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GAL_FIR.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GAL_FIR.vhd new file mode 100644 index 00000000..5aff2022 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GAL_FIR.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_FIR 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 prom of GAL_FIR is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AC",X"68",X"72",X"C7",X"93",X"3F",X"80",X"C8",X"5C",X"A1",X"22",X"90",X"B9",X"8A",X"41",X"62", + X"C2",X"A1",X"40",X"6A",X"C9",X"7F",X"64",X"3C",X"BC",X"AD",X"5B",X"4C",X"D4",X"62",X"3D",X"D3", + X"7F",X"31",X"A3",X"BE",X"5D",X"49",X"C7",X"7D",X"28",X"C0",X"A1",X"7A",X"7D",X"2B",X"C9",X"91", + X"80",X"6B",X"39",X"95",X"BA",X"91",X"27",X"C1",X"91",X"7E",X"6D",X"31",X"C0",X"A4",X"7C",X"7B", + X"37",X"80",X"CB",X"7E",X"88",X"64",X"40",X"8F",X"C3",X"83",X"83",X"68",X"36",X"D0",X"8C",X"29", + X"B4",X"B1",X"52",X"4B",X"E9",X"3E",X"74",X"C4",X"73",X"81",X"2B",X"AD",X"B9",X"4E",X"4B",X"CB", + X"91",X"76",X"33",X"B6",X"A5",X"6E",X"4A",X"63",X"D7",X"7C",X"3E",X"7E",X"DE",X"45",X"67",X"C1", + X"84",X"2D",X"A8",X"A9",X"20",X"AC",X"B5",X"7E",X"47",X"5F",X"DD",X"6E",X"44",X"BD",X"97",X"22", + X"AE",X"A4",X"25",X"CB",X"93",X"77",X"3C",X"78",X"CB",X"83",X"29",X"B3",X"AB",X"7D",X"5D",X"44", + X"A4",X"BC",X"79",X"8C",X"3A",X"76",X"CF",X"78",X"44",X"6B",X"D9",X"6B",X"3B",X"9A",X"CC",X"26", + X"A4",X"A3",X"1D",X"BA",X"A9",X"83",X"71",X"3A",X"8B",X"CC",X"6A",X"3E",X"E5",X"28",X"A4",X"A3", + X"1E",X"C9",X"9C",X"78",X"32",X"94",X"C4",X"74",X"88",X"2A",X"A2",X"BC",X"1A",X"E2",X"4B",X"86", + X"B3",X"72",X"48",X"68",X"D2",X"83",X"32",X"A4",X"B2",X"73",X"4E",X"5A",X"C8",X"9C",X"2C",X"90", + X"C1",X"7B",X"5E",X"41",X"CC",X"99",X"6F",X"3A",X"8B",X"C9",X"7A",X"84",X"23",X"BC",X"9D",X"33", + X"CC",X"82",X"24",X"D7",X"6C",X"47",X"D1",X"87",X"5C",X"41",X"C5",X"9F",X"71",X"35",X"A8",X"B9", + X"67",X"4F",X"5F",X"CE",X"8A",X"43",X"C6",X"80",X"54",X"4A",X"B1",X"AE",X"87",X"50",X"4F",X"C6", + X"9F",X"55",X"45",X"BB",X"AC",X"5C",X"41",X"A9",X"BE",X"5C",X"4C",X"72",X"D4",X"71",X"42",X"DA", + X"20",X"CF",X"6C",X"3D",X"D5",X"8A",X"78",X"39",X"7B",X"BF",X"99",X"75",X"37",X"99",X"C7",X"28", + X"7B",X"C3",X"91",X"58",X"46",X"9D",X"BB",X"88",X"60",X"40",X"9A",X"BB",X"8C",X"3B",X"6A",X"BA", + X"AC",X"31",X"7F",X"C8",X"2F",X"78",X"DC",X"33",X"AE",X"80",X"34",X"EE",X"38",X"74",X"D5",X"1F", + X"98",X"BA",X"82",X"58",X"4A",X"D6",X"86",X"56",X"49",X"F0",X"34",X"73",X"BD",X"9A",X"43",X"67", + X"C3",X"8D",X"2E",X"8B",X"B9",X"40",X"C6",X"33",X"B7",X"A5",X"27",X"8A",X"BA",X"42",X"BF",X"8A", + X"3A",X"6F",X"D1",X"5C",X"41",X"DF",X"6A",X"42",X"C3",X"A4",X"33",X"80",X"CC",X"5C",X"43",X"89", + X"BE",X"96",X"53",X"4E",X"8D",X"D4",X"2E",X"BD",X"56",X"6C",X"DA",X"53",X"47",X"9C",X"C8",X"2A", + X"75",X"B3",X"B0",X"2F",X"80",X"CA",X"2B",X"81",X"CD",X"35",X"7E",X"CE",X"32",X"81",X"CD",X"74", + X"40",X"74",X"D8",X"4E",X"58",X"D3",X"85",X"4D",X"53",X"AE",X"B8",X"61",X"3D",X"9F",X"C3",X"30", + X"86",X"D0",X"5E",X"47",X"7D",X"C6",X"91",X"4E",X"4E",X"A9",X"B9",X"6D",X"34",X"9F",X"B7",X"3F", + X"C6",X"7A",X"37",X"81",X"C5",X"8C",X"33",X"88",X"D3",X"44",X"59",X"82",X"C8",X"88",X"42",X"61", + X"AF",X"A2",X"44",X"D9",X"48",X"52",X"89",X"BC",X"99",X"2E",X"7E",X"B4",X"38",X"B7",X"9E",X"20", + X"E4",X"56",X"63",X"D9",X"56",X"43",X"B1",X"B8",X"37",X"6B",X"D3",X"6D",X"31",X"C8",X"65",X"8D", + X"B9",X"0B",X"BA",X"86",X"4D",X"D7",X"4E",X"4B",X"E7",X"3C",X"95",X"AD",X"1D",X"D8",X"72",X"35", + X"B4",X"A5",X"2F",X"B3",X"B6",X"44",X"57",X"93",X"CB",X"67",X"3F",X"A1",X"C7",X"21",X"89",X"9C", + X"5A",X"D8",X"20",X"A3",X"BA",X"25",X"89",X"AD",X"37",X"D8",X"5D",X"53",X"DC",X"77",X"43",X"70", + X"E1",X"46",X"59",X"83",X"CC",X"6E",X"37",X"E7",X"56",X"4E",X"86",X"D3",X"27",X"9E",X"AA",X"44", + X"C0",X"19",X"E9",X"54",X"63",X"DB",X"51",X"4D",X"88",X"CF",X"30",X"91",X"C5",X"66",X"35",X"C1", + X"9C",X"33",X"79",X"A7",X"BA",X"53",X"41",X"DD",X"4B",X"73",X"D2",X"25",X"7F",X"BB",X"9D",X"37", + X"68",X"A9",X"BD",X"3B",X"5C",X"CF",X"61",X"47",X"C9",X"9E",X"47",X"55",X"AF",X"96",X"5D",X"D0", + X"28",X"7E",X"D3",X"48",X"51",X"C7",X"95",X"21",X"BB",X"A6",X"3A",X"67",X"C3",X"81",X"37",X"DE", + X"7D",X"3F",X"72",X"AA",X"B4",X"15",X"DC",X"6C",X"47",X"D2",X"71",X"28",X"EB",X"2E",X"9F",X"93", + X"6C",X"9C",X"37",X"DB",X"43",X"AC",X"37",X"D3",X"4F",X"AC",X"8D",X"1B",X"DF",X"7E",X"46",X"6B", + X"BA",X"A5",X"35",X"73",X"CB",X"41",X"7E",X"C8",X"1D",X"D3",X"60",X"5F",X"DB",X"44",X"57",X"C2", + X"A2",X"41",X"5B",X"AE",X"96",X"5E",X"CC",X"10",X"CF",X"83",X"31",X"DF",X"59",X"46",X"CC",X"87", + X"28",X"D7",X"84",X"3D",X"7A",X"DD",X"3A",X"7B",X"C8",X"36",X"66",X"C8",X"60",X"9A",X"8F",X"29", + X"A8",X"B3",X"83",X"1F",X"D6",X"81",X"33",X"C4",X"82",X"2A",X"D4",X"6B",X"70",X"CA",X"1B",X"A9", + X"AB",X"22",X"AE",X"9E",X"49",X"D3",X"45",X"5A",X"A1",X"BB",X"70",X"27",X"E9",X"49",X"72",X"CC", + X"38",X"67",X"B6",X"AD",X"41",X"57",X"B7",X"8C",X"39",X"E4",X"70",X"4B",X"63",X"C7",X"52",X"AE", + X"8A",X"36",X"8A",X"BB",X"8E",X"2F",X"87",X"AB",X"B2",X"2D",X"72",X"94",X"CD",X"39",X"67",X"D9", + X"2B",X"86",X"C8",X"50",X"4D",X"BC",X"A1",X"3F",X"6B",X"BC",X"7C",X"48",X"E0",X"20",X"BA",X"83", + X"43",X"D4",X"26",X"BD",X"A2",X"3E",X"6C",X"CA",X"8A",X"38",X"7B",X"AF",X"AE",X"23",X"91",X"C0", + X"37",X"76",X"A3",X"C2",X"39",X"63",X"D9",X"48",X"5A",X"93",X"C9",X"43",X"62",X"90",X"B1",X"37", + X"D1",X"53",X"74",X"B1",X"37",X"F6",X"23",X"82",X"C3",X"52",X"4A",X"BB",X"75",X"95",X"88",X"3D", + X"90",X"C3",X"76",X"3B",X"87",X"A9",X"70",X"A6",X"61",X"4F",X"AE",X"B6",X"50",X"4B",X"E2",X"4A", + X"63",X"DC",X"3E",X"63",X"92",X"CC",X"4F",X"4D",X"E3",X"4A",X"5B",X"89",X"D0",X"47",X"5E",X"90", + X"D0",X"49",X"5B",X"7E",X"C6",X"76",X"3E",X"8C",X"AA",X"A4",X"15",X"CD",X"89",X"43",X"80",X"BD", + X"65",X"A8",X"3D",X"8E",X"CF",X"0B",X"C0",X"8E",X"46",X"76",X"C9",X"7A",X"3E",X"88",X"AA",X"A8", + X"18",X"BF",X"9C",X"2E",X"C3",X"85",X"2B",X"DC",X"6C",X"45",X"DB",X"4B",X"5F",X"92",X"AD",X"3D", + X"C3",X"4F",X"86",X"A6",X"75",X"81",X"36",X"E7",X"37",X"A6",X"7D",X"A5",X"5A",X"58",X"D8",X"4E", + X"56",X"AB",X"8E",X"49",X"DD",X"68",X"40",X"8A",X"B0",X"53",X"C3",X"4F",X"60",X"92",X"C6",X"51", + X"54",X"9A",X"C5",X"55",X"4D",X"93",X"C2",X"70",X"2F",X"E3",X"50",X"5B",X"8D",X"AF",X"48",X"AA", + X"81",X"98",X"4C",X"65",X"C1",X"66",X"BB",X"23",X"B0",X"9B",X"39",X"83",X"A4",X"B3",X"1A",X"B0", + X"9D",X"31",X"C3",X"8E",X"2B",X"E2",X"54",X"5A",X"DC",X"32",X"86",X"CA",X"14",X"C9",X"83",X"43", + X"83",X"AD",X"A6",X"15",X"DA",X"6D",X"4C",X"87",X"AF",X"63",X"B9",X"3A",X"8C",X"C5",X"0D",X"CC", + X"79",X"58",X"74",X"C9",X"7D",X"42",X"7C",X"B7",X"5C",X"A9",X"7B",X"41",X"93",X"B6",X"81",X"32", + X"9D",X"92",X"6B",X"87",X"9D",X"94",X"4A",X"6C",X"B7",X"A4",X"1B",X"BD",X"88",X"4D",X"7D",X"BD", + X"4D",X"99",X"8A",X"51",X"CF",X"1B",X"F2",X"56",X"5A",X"72",X"C3",X"4B",X"BE",X"63",X"52",X"E1", + X"2F",X"77",X"91",X"93",X"52",X"C0",X"37",X"E1",X"53",X"5A",X"DA",X"35",X"77",X"85",X"D5",X"39", + X"6D",X"80",X"D3",X"50",X"58",X"D3",X"2D",X"9A",X"B2",X"23",X"BC",X"8C",X"52",X"71",X"C1",X"8D", + X"3E",X"76",X"B3",X"6F",X"6D",X"A1",X"49",X"C9",X"2E",X"D1",X"38",X"C6",X"55",X"8B",X"7C",X"86", + X"B2",X"33",X"7E",X"AD",X"99",X"3C",X"80",X"A3",X"6E",X"88",X"98",X"50",X"AA",X"79",X"99",X"27", + X"FB",X"1D",X"AE",X"63",X"8F",X"94",X"51",X"B0",X"4A",X"AD",X"86",X"8B",X"39",X"EA",X"1B",X"AB", + X"9A",X"4C",X"73",X"B8",X"9A",X"3A",X"76",X"AC",X"64",X"88",X"8B",X"6D",X"A6",X"71",X"97",X"40", + X"8C",X"B5",X"4A",X"A0",X"68",X"86",X"8C",X"98",X"69",X"59",X"DE",X"1F",X"AB",X"A0",X"36",X"A8", + X"A7",X"28",X"E0",X"58",X"59",X"CE",X"37",X"82",X"C8",X"2E",X"A4",X"5A",X"AF",X"62",X"8E",X"C2", + X"2D",X"79",X"91",X"C2",X"2A",X"96",X"77",X"8A",X"99",X"8E",X"3D",X"C7",X"61",X"57",X"9D",X"A3", + X"44",X"DE",X"34",X"88",X"B1",X"37",X"89",X"A3",X"B3",X"15",X"CB",X"73",X"43",X"BA",X"8D",X"47", + X"9D",X"6F",X"C9",X"15",X"D1",X"72",X"53",X"CA",X"48",X"6B",X"9B",X"89",X"6A",X"A0",X"57",X"BE", + X"45",X"9C",X"A5",X"5E",X"54",X"CA",X"63",X"52",X"E1",X"25",X"AE",X"93",X"35",X"E5",X"2A",X"A5", + X"97",X"40",X"8A",X"9A",X"73",X"81",X"8E",X"57",X"CC",X"68",X"67",X"5D",X"C5",X"94",X"43",X"6E", + X"AA",X"A8",X"30",X"9D",X"6E",X"B3",X"6B",X"4B",X"AB",X"79",X"90",X"93",X"50",X"89",X"81",X"8A", + X"A4",X"42",X"9B",X"7F",X"67",X"9F",X"A8",X"48",X"80",X"BA",X"23",X"C5",X"6A",X"5E",X"91",X"99", + X"62",X"9A",X"91",X"6A",X"5A",X"D9",X"3D",X"81",X"B2",X"34",X"C5",X"7A",X"3F",X"BB",X"90",X"3D", + X"D0",X"50",X"65",X"95",X"94",X"63",X"C6",X"2D",X"A6",X"91",X"3D",X"CA",X"5F",X"66",X"91",X"97", + X"A6",X"35",X"A6",X"97",X"2E",X"D9",X"41",X"8F",X"A4",X"3E",X"A2",X"B0",X"2E",X"B5",X"7A",X"55", + X"C9",X"3F",X"84",X"C3",X"42",X"8A",X"72",X"9F",X"65",X"95",X"72",X"84",X"8A",X"58",X"C6",X"73", + X"47",X"D9",X"35",X"90",X"9F",X"4D",X"80",X"A8",X"A1",X"30",X"8F",X"8B",X"C5",X"18",X"B5",X"70", + X"65",X"B0",X"5D",X"93",X"93",X"7B",X"48",X"CB",X"52",X"7D",X"B0",X"3D",X"98",X"BA",X"2E",X"AD", + X"86",X"4A",X"BD",X"6E",X"4C",X"DA",X"53",X"78",X"77",X"96",X"75",X"83",X"82",X"82",X"A5",X"3D", + X"86",X"A2",X"A7",X"31",X"8B",X"8E",X"C3",X"20",X"AA",X"92",X"3A",X"C0",X"87",X"51",X"77",X"AD", + X"62",X"B9",X"4F",X"7F",X"BC",X"1E",X"BF",X"7E",X"51",X"C3",X"50",X"72",X"C0",X"49",X"8A",X"81", + X"72",X"AA",X"7B",X"55",X"8C",X"83",X"CA",X"2B",X"97",X"9C",X"4B",X"86",X"9F",X"B0",X"14",X"EA", + X"3C",X"8A",X"9B",X"51",X"C2",X"25",X"C7",X"70",X"5F",X"AF",X"52",X"C6",X"29",X"B8",X"7F",X"5F", + X"A3",X"5C",X"CB",X"26",X"AE",X"8B",X"3C",X"D6",X"48",X"8A",X"74",X"A2",X"8D",X"3F",X"D3",X"2A", + X"B9",X"7B",X"4D",X"A6",X"69",X"B6",X"6E",X"56",X"8A",X"A1",X"64",X"C3",X"28",X"B2",X"7D",X"60", + X"A6",X"58",X"D4",X"11",X"D1",X"5C",X"7A",X"A8",X"42",X"96",X"C7",X"27",X"A9",X"90",X"44",X"89", + X"9F",X"69",X"90",X"A7",X"25",X"DB",X"46",X"7C",X"B7",X"42",X"9A",X"6E",X"99",X"8C",X"81",X"41", + X"C7",X"7A",X"58",X"8D",X"83",X"B2",X"29",X"C1",X"6E",X"52",X"DA",X"44",X"83",X"B6",X"2A",X"C4", + X"41",X"A6",X"7A",X"76",X"98",X"5B",X"B6",X"86",X"42",X"A2",X"8A",X"4B",X"95",X"97",X"65",X"B7", + X"56",X"6C",X"D2",X"1E",X"B6",X"94",X"36",X"DD",X"38",X"96",X"7B",X"70",X"9E",X"95",X"59",X"77", + X"82",X"8D",X"7C",X"78",X"DC",X"01",X"CD",X"70",X"5D",X"76",X"B4",X"91",X"35",X"BD",X"48",X"D3", + X"36",X"8E",X"B7",X"2C",X"BE",X"49",X"CA",X"4C",X"72",X"CB",X"29",X"B9",X"82",X"3B",X"CC",X"71", + X"4B",X"D1",X"4F",X"6A",X"8D",X"C9",X"46",X"6A",X"CA",X"28",X"99",X"A9",X"61",X"59",X"AA",X"78", + X"8F",X"98",X"35",X"CE",X"64",X"58",X"95",X"A7",X"49",X"AC",X"57",X"9B",X"7C",X"70",X"DE",X"14", + X"A9",X"A3",X"3F",X"7B",X"C9",X"57",X"5F",X"D6",X"17",X"C5",X"7D",X"58",X"9E",X"71",X"B8",X"3D", + X"72",X"A7",X"6C",X"A7",X"80",X"3A",X"E5",X"22",X"A5",X"61",X"B6",X"86",X"38",X"D9",X"56",X"57", + X"9A",X"8E",X"64",X"97",X"96",X"7D",X"45",X"CC",X"5D",X"5A",X"A8",X"AA",X"3C",X"7E",X"97",X"C1", + X"22",X"9B",X"A7",X"45",X"7F",X"A1",X"B4",X"1D",X"BB",X"51",X"B9",X"7A",X"45",X"91",X"A5",X"67", + X"B8",X"34",X"9E",X"A8",X"35",X"88",X"B0",X"54",X"A8",X"8C",X"31",X"E7",X"41",X"6A",X"C7",X"41", + X"85",X"BA",X"2D",X"B1",X"A0",X"35",X"90",X"9F",X"75",X"A0",X"5D",X"52",X"CA",X"59",X"84",X"9A", + X"52",X"B2",X"66",X"AF",X"43",X"6E",X"BC",X"59",X"89",X"95",X"8B",X"74",X"44",X"AE",X"85",X"96", + X"7B",X"4A",X"8B",X"BD",X"7E",X"2F",X"D2",X"68",X"4D",X"D9",X"41",X"6F",X"CA",X"4D",X"62",X"A0", + X"B7",X"3C",X"76",X"D1",X"2E",X"98",X"B1",X"2A",X"BB",X"8D",X"2F",X"E2",X"4A",X"6C",X"C4",X"49", + X"64",X"A5",X"88",X"80",X"9E",X"2A",X"DD",X"59",X"54",X"CE",X"60",X"54",X"9E",X"9D",X"42",X"BF", + X"92",X"34",X"98",X"B7",X"40",X"77",X"9F",X"BC",X"28",X"93",X"B8",X"44",X"67",X"A7",X"AC",X"41", + X"6F",X"9F",X"91",X"50",X"C4",X"37",X"B1",X"7A",X"5B",X"DD",X"4C",X"58",X"C6",X"5D",X"51",X"BA", + X"82",X"47",X"D6",X"6B",X"45",X"AC",X"60",X"C5",X"3D",X"7D",X"CA",X"33",X"8D",X"AE",X"42",X"88", + X"CB",X"4F",X"5D",X"84",X"C3",X"31",X"B4",X"6B",X"6C",X"AD",X"73",X"AB",X"23",X"D5",X"6B",X"43", + X"D1",X"6A",X"47",X"CB",X"4B",X"77",X"C4",X"2B",X"BC",X"94",X"35",X"C6",X"77",X"3E",X"9E",X"94", + X"77",X"A5",X"43",X"7C",X"99",X"BD",X"3A",X"79",X"C8",X"2B",X"B8",X"83",X"37",X"D2",X"77",X"4F", + X"78",X"BD",X"43",X"AC",X"80",X"66",X"C8",X"28",X"89",X"A3",X"AF",X"2A",X"92",X"B9",X"3D",X"80", + X"CC",X"27",X"9A",X"B0",X"48",X"66",X"AD",X"8D",X"44",X"D0",X"6A",X"44",X"AA",X"87",X"6B",X"C7", + X"25",X"A3",X"AB",X"41",X"70",X"AD",X"71",X"9C",X"74",X"45",X"C9",X"91",X"51",X"5D",X"D9",X"4E", + X"62",X"C7",X"61",X"4C",X"A4",X"97",X"78",X"95",X"3D",X"9E",X"A8",X"30",X"D4",X"4B",X"81",X"B2", + X"33",X"C5",X"65",X"A4",X"63",X"4E",X"A8",X"98",X"5F",X"C0",X"30",X"96",X"B5",X"3D",X"75",X"B2", + X"92",X"31",X"B1",X"A5",X"33",X"A4",X"AD",X"43",X"68",X"B4",X"7A",X"51",X"DB",X"45",X"74",X"C9", + X"2D",X"95",X"AD",X"3B",X"8E",X"A9",X"3D",X"C0",X"70",X"62",X"D5",X"27",X"A7",X"9E",X"3F",X"7C", + X"BC",X"50",X"A4",X"8E",X"34",X"A3",X"A1",X"4E",X"99",X"BC",X"35",X"7B",X"BD",X"67",X"45",X"AA", + X"94",X"62",X"C1",X"3E",X"74",X"CB",X"41",X"74",X"A3",X"50",X"B6",X"9F",X"47",X"68",X"A6",X"AF", + X"4A",X"62",X"94",X"AC",X"3F",X"AD",X"A9",X"3F",X"72",X"8A",X"C7",X"54",X"5E",X"7A",X"C0",X"80", + X"4D",X"6B",X"B7",X"71",X"86",X"9F",X"2C",X"DC",X"60",X"59",X"79",X"BB",X"7C",X"40",X"A8",X"AC", + X"63",X"48",X"D4",X"67",X"56",X"79",X"B8",X"8D",X"38",X"BE",X"7E",X"3C",X"B0",X"97",X"54",X"C2", + X"37",X"98",X"B4",X"32",X"90",X"B9",X"4F",X"5E",X"B2",X"A0",X"34",X"9F",X"A3",X"35",X"AD",X"9B", + X"38",X"BB",X"97",X"4E",X"64",X"A4",X"94",X"53",X"D0",X"45",X"6A",X"C2",X"6E",X"42",X"CC",X"77", + X"52",X"73",X"BB",X"61",X"89",X"B2",X"2D",X"9C",X"B4",X"43",X"77",X"C5",X"57",X"59",X"93",X"A6", + X"5B",X"B6",X"50",X"63",X"BE",X"8D",X"4D",X"6A",X"A2",X"AA",X"6F",X"3F",X"C2",X"86",X"4B",X"75", + X"BD",X"76",X"4B",X"D2",X"5A",X"5A",X"8A",X"BF",X"5B",X"56",X"B3",X"9F",X"4E",X"66",X"C4",X"5D", + X"51",X"C0",X"68",X"70",X"C1",X"3E",X"75",X"BB",X"50",X"A6",X"88",X"3A",X"AB",X"A4",X"79",X"3A", + X"BC",X"8E",X"4A",X"74",X"B7",X"82",X"42",X"D2",X"5F",X"5A",X"7F",X"B4",X"8D",X"41",X"86",X"C0", + X"55",X"5F",X"C0",X"44",X"96",X"B6",X"5A",X"5A",X"84",X"BD",X"78",X"52",X"6C",X"BA",X"82",X"41", + X"BD",X"83",X"3E",X"A9",X"91",X"56",X"CA",X"38",X"95",X"AA",X"39",X"8B",X"AE",X"4D",X"8C",X"AC", + X"35",X"BC",X"79",X"52",X"C1",X"5A",X"80",X"C2",X"41",X"73",X"A8",X"4C",X"B1",X"9C",X"63",X"4F", + X"BB",X"8B",X"4B",X"70",X"B2",X"7F",X"46",X"D3",X"48",X"A3",X"94",X"3D",X"94",X"B6",X"52",X"61", + X"BD",X"49",X"91",X"B9",X"58",X"61",X"77",X"BD",X"4D",X"A9",X"84",X"43",X"CF",X"6A",X"58",X"74", + X"C2",X"57",X"93",X"61",X"84",X"BB",X"2E",X"B6",X"86",X"4B",X"C7",X"71",X"54",X"76",X"AF",X"73", + X"5D",X"D2",X"40",X"85",X"B7",X"59",X"5A",X"94",X"AF",X"40",X"9D",X"A1",X"32",X"BD",X"71",X"72", + X"BC",X"51",X"60",X"97",X"AC",X"7F",X"47",X"8D",X"B7",X"57",X"5B",X"C1",X"7B",X"52",X"73",X"AB", + X"8B",X"44",X"C1",X"82",X"42",X"BD",X"75",X"4B",X"B0",X"9D",X"6A",X"50",X"8A",X"AD",X"8E",X"53", + X"65",X"9C",X"AE",X"65",X"51",X"AF",X"99",X"43",X"80",X"B4",X"7E",X"3D",X"B9",X"6B",X"66",X"C2", + X"45",X"B4",X"81",X"50",X"72",X"BC",X"6E",X"4E",X"BA",X"7A",X"4A",X"C1",X"6F",X"5A",X"BB",X"89", + X"5C",X"5E",X"9B",X"AF",X"5E",X"5C",X"CA",X"43",X"87",X"B0",X"41",X"85",X"BA",X"4D",X"77",X"BA", + X"76",X"4A",X"A7",X"9D",X"54",X"61",X"AA",X"9C",X"47",X"7B",X"B2",X"8B",X"51",X"6C",X"9A",X"A4", + X"42",X"A4",X"A6",X"3A",X"A5",X"97",X"3F",X"9E",X"A7",X"78",X"4E",X"7F",X"B1",X"8A",X"58",X"64", + X"B8",X"88",X"48",X"87",X"B5",X"6E",X"49",X"BE",X"59",X"93",X"A5",X"46",X"74",X"9E",X"A3",X"35", + X"C2",X"72",X"55",X"C2",X"5B",X"60",X"B9",X"79",X"48",X"C8",X"57",X"84",X"B1",X"4B",X"6C",X"97", + X"AC",X"3F",X"8C",X"AF",X"47",X"AF",X"89",X"4A",X"7D",X"A4",X"9E",X"4F",X"6A",X"B1",X"8E",X"45", + X"88",X"B2",X"70",X"4B",X"A7",X"9C",X"41",X"AD",X"96",X"49",X"7B",X"B6",X"77",X"4B",X"B4",X"8D", + X"56",X"67",X"A2",X"A0",X"3E",X"B2",X"84",X"45",X"AC",X"9A",X"78",X"44",X"B1",X"80",X"52",X"C9", + X"4B",X"7E",X"B7",X"3C",X"A1",X"99",X"40",X"9F",X"A3",X"7C",X"4C",X"8A",X"B0",X"76",X"4C",X"9D", + X"A6",X"3F",X"9C",X"A5",X"5E",X"5C",X"B7",X"85",X"4E",X"7E",X"B4",X"6A",X"56",X"CD",X"4B",X"99", + X"6F",X"69",X"C4",X"45",X"89",X"B2",X"60",X"60",X"7F",X"BB",X"57",X"6E",X"B4",X"84",X"66",X"59", + X"BD",X"4A",X"9F",X"A0",X"5B",X"5F",X"A1",X"A4",X"65",X"57",X"94",X"A3",X"8E",X"46",X"8A",X"9B", + X"58",X"B7",X"78",X"4C",X"9B",X"A1",X"40",X"AF",X"87",X"42",X"B4",X"80",X"5E",X"BB",X"4B",X"7D", + X"BB",X"42",X"95",X"A1",X"42",X"AA",X"98",X"59",X"64",X"A4",X"A0",X"5F",X"5D",X"9C",X"A7",X"66", + X"57",X"A0",X"A4",X"5E",X"61",X"8A",X"B4",X"4D",X"92",X"A5",X"55",X"68",X"8F",X"B1",X"55",X"6C", + X"BE",X"51",X"88",X"A6",X"36",X"C2",X"6C",X"60",X"B2",X"84",X"4D",X"84",X"A8",X"4A",X"A5",X"9E", + X"60",X"5D",X"AD",X"92",X"76",X"4E",X"94",X"A8",X"72",X"4C",X"B0",X"7A",X"57",X"B8",X"85",X"72", + X"51",X"C2",X"59",X"6C",X"B1",X"86",X"69",X"5A",X"92",X"A9",X"7B",X"50",X"8B",X"B3",X"41",X"AD", + X"6F",X"61",X"B7",X"82",X"6E",X"55",X"A0",X"9F",X"4B",X"87",X"B1",X"52",X"9B",X"96",X"59",X"68", + X"B7",X"55",X"85",X"B1",X"64",X"65",X"70",X"BB",X"6A",X"5F",X"B0",X"8A",X"76",X"55",X"82",X"AE", + X"82",X"5F",X"66",X"A1",X"9C",X"48",X"B7",X"67",X"60",X"B8",X"76",X"4D",X"B7",X"76",X"62",X"B1", + X"7C",X"55",X"84",X"AD",X"77",X"55",X"8B",X"AC",X"40",X"9A",X"A1",X"75",X"57",X"7D",X"A6",X"91", + X"75",X"5C",X"74",X"AE",X"7D",X"52",X"C1",X"58",X"74",X"B7",X"45",X"95",X"A1",X"70",X"57",X"89", + X"AA",X"81",X"5B",X"6D",X"9F",X"9E",X"6F",X"57",X"AB",X"8E",X"63",X"5E",X"B0",X"80",X"4E",X"B1", + X"88",X"4C",X"9E",X"9A",X"46",X"98",X"A4",X"6C",X"55",X"B0",X"84",X"56",X"B8",X"48",X"92",X"A3", + X"7D",X"69",X"5C",X"A6",X"98",X"51",X"83",X"B5",X"4C",X"8E",X"A3",X"69",X"5E",X"80",X"AF",X"6B", + X"5B",X"B3",X"7C",X"52",X"B1",X"88",X"81",X"50",X"88",X"A7",X"83",X"54",X"82",X"AB",X"46",X"9F", + X"9F",X"4B",X"94",X"9F",X"42",X"A8",X"92",X"84",X"59",X"77",X"B3",X"46",X"A5",X"8C",X"4A",X"AE", + X"8A",X"59",X"A9",X"82",X"67",X"60",X"99",X"9F",X"81",X"6A",X"5B",X"BF",X"4F",X"9C",X"82",X"54", + X"BA",X"75",X"55",X"A7",X"8A",X"4B",X"A4",X"96",X"82",X"61",X"67",X"9A",X"9E",X"4D",X"8A",X"A7", + X"7F",X"73",X"52",X"BB",X"60",X"73",X"AC",X"83",X"73",X"59",X"89",X"A4",X"88",X"50",X"95",X"A2", + X"67",X"63",X"7D",X"B0",X"72",X"59",X"A9",X"8F",X"50",X"87",X"AC",X"47",X"9C",X"97",X"7B",X"53", + X"92",X"A0",X"7B",X"5B",X"7F",X"B1",X"49",X"8D",X"A4",X"7B",X"66",X"62",X"B4",X"76",X"66",X"AA", + X"81",X"62",X"6D",X"AF",X"80",X"6D",X"5C",X"97",X"9C",X"86",X"69",X"60",X"AE",X"80",X"4E",X"B9", + X"66",X"6D",X"AA",X"83",X"64",X"69",X"AD",X"86",X"6B",X"60",X"8C",X"AA",X"65",X"66",X"AF",X"80", + X"51",X"9A",X"9B",X"7B",X"72",X"57",X"A5",X"92",X"87",X"67",X"66",X"86",X"B2",X"58",X"8E",X"8B", + X"5F",X"B0",X"71",X"6B",X"63",X"A7",X"8F",X"85",X"67",X"63",X"B2",X"61",X"6F",X"AE",X"81",X"7F", + X"4E",X"A4",X"8D",X"51",X"9F",X"99",X"73",X"62",X"75",X"B6",X"66",X"79",X"9F",X"50",X"B7",X"4C", + X"8E",X"9E",X"7D",X"5C",X"7F",X"AF",X"4B",X"8D",X"A1",X"7D",X"65",X"66",X"AE",X"7B",X"62",X"AD", + X"7B",X"6C",X"5F",X"A8",X"8D",X"84",X"66",X"65",X"A7",X"8D",X"75",X"58",X"9F",X"97",X"74",X"60", + X"79",X"A4",X"8E",X"6A",X"5F",X"A7",X"8D",X"53",X"A7",X"87",X"73",X"57",X"B1",X"74",X"68",X"AD", + X"48",X"A0",X"94",X"81",X"6D",X"5F",X"94",X"9C",X"85",X"6D",X"5F",X"97",X"9D",X"78",X"5B",X"87", + X"AA",X"5E",X"6C",X"A6",X"8A",X"7A",X"5D",X"7B",X"9E",X"96",X"59",X"7D",X"AB",X"4C",X"98",X"95", + X"4B",X"A5",X"8B",X"55",X"A5",X"8D",X"71",X"60",X"84",X"A4",X"84",X"7F",X"5A",X"82",X"AB",X"5B", + X"78",X"B2",X"5B",X"7F",X"A2",X"4D",X"94",X"A2",X"51",X"98",X"93",X"78",X"57",X"9B",X"95",X"7D", + X"57",X"90",X"9D",X"53",X"A2",X"8D",X"6C",X"65",X"81",X"AD",X"68",X"71",X"A9",X"53",X"A4",X"82", + X"7A",X"55",X"A4",X"88",X"53",X"A5",X"8D",X"7F",X"6A",X"63",X"A7",X"87",X"59",X"A5",X"8A",X"77", + X"61",X"7B",X"AD",X"73",X"6B",X"A1",X"7F",X"6F",X"60",X"B2",X"6C",X"66",X"AA",X"82",X"81",X"5E", + X"75",X"9D",X"92",X"7D",X"6C",X"63",X"B0",X"73",X"60",X"A8",X"86",X"80",X"62",X"71",X"99",X"9A", + X"50",X"97",X"92",X"51",X"9D",X"96",X"51",X"A5",X"79",X"5D",X"AA",X"85",X"80",X"64",X"6D",X"AB", + X"77",X"64",X"A9",X"82",X"77",X"5F",X"85",X"A1",X"85",X"7F",X"5B",X"88",X"A4",X"4E",X"95",X"98", + X"81",X"69",X"69",X"B1",X"55",X"90",X"99",X"4F",X"A7",X"7E",X"59",X"AA",X"7C",X"5B",X"9E",X"92", + X"7E",X"70",X"5F",X"A1",X"8F",X"85",X"5F",X"78",X"A6",X"7F",X"77",X"5A",X"A0",X"87",X"58",X"A0", + X"93",X"59",X"97",X"94",X"5B",X"76",X"9F",X"8E",X"63",X"72",X"AC",X"57",X"81",X"A6",X"66",X"68", + X"A7",X"83",X"5C",X"A7",X"80",X"7A",X"59",X"97",X"9A",X"5D",X"7A",X"AD",X"66",X"72",X"A1",X"80", + X"70",X"62",X"A7",X"85",X"7B",X"5F",X"7E",X"9D",X"8E",X"73",X"5F",X"93",X"9D",X"63",X"6D",X"AA", + X"7B",X"89",X"5B",X"7F",X"A0",X"84",X"64",X"78",X"A5",X"7A",X"75",X"5E",X"9C",X"93",X"7F",X"7C", + X"58",X"A0",X"8D",X"80",X"61",X"77",X"9D",X"91",X"65",X"71",X"A4",X"80",X"76",X"5E",X"A4",X"89", + X"7C",X"62",X"78",X"9D",X"8D",X"7D",X"6C",X"68",X"B0",X"69",X"78",X"A3",X"54",X"9F",X"8A",X"79", + X"63",X"7A",X"9E",X"8D",X"64",X"71",X"AD",X"6D",X"6D",X"9D",X"86",X"6F",X"68",X"82",X"A8",X"6A", + X"74",X"A2",X"7A",X"73",X"61",X"B1",X"66",X"73",X"A8",X"5C",X"7D",X"A7",X"6C",X"6C",X"AA",X"56", + X"97",X"89",X"55",X"A7",X"85",X"85",X"6E",X"66",X"A6",X"82",X"82",X"5F",X"81",X"A5",X"55",X"8A", + X"9C",X"7C",X"81",X"5B",X"8A",X"9F",X"5E",X"7E",X"A9",X"5D",X"79",X"9E",X"87",X"61",X"76",X"9E", + X"8C",X"65",X"72",X"A2",X"83",X"78",X"60",X"A2",X"86",X"7C",X"5E",X"9B",X"8C",X"56",X"AD",X"66", + X"71",X"A3",X"81",X"82",X"66",X"74",X"AE",X"5E",X"82",X"9B",X"58",X"8E",X"9E",X"63",X"72",X"A1", + X"84",X"72",X"62",X"9F",X"8B",X"81",X"73",X"65",X"89",X"9D",X"7F",X"84",X"5E",X"84",X"9E",X"7C", + X"7B",X"5E",X"8B",X"96",X"8C",X"56",X"96",X"90",X"80",X"66",X"74",X"9A",X"92",X"61",X"78",X"9E", + X"87",X"69",X"72",X"A2",X"7F",X"76",X"63",X"8B",X"9A",X"83",X"5B",X"8F",X"98",X"7B",X"7F",X"5B", + X"92",X"98",X"5A",X"9D",X"86",X"81",X"62",X"80",X"A0",X"7B",X"76",X"61",X"9A",X"91",X"80",X"7B", + X"5E",X"91",X"96",X"7F",X"6E",X"69",X"99",X"94",X"64",X"75",X"A6",X"74",X"64",X"8F",X"9D",X"65", + X"72",X"A1",X"83",X"74",X"62",X"9F",X"89",X"82",X"72",X"67",X"88",X"9D",X"7A",X"62",X"AC",X"5A", + X"8F",X"90",X"7F",X"6E",X"6B",X"8E",X"9D",X"61",X"86",X"9B",X"56",X"9D",X"88",X"7C",X"64",X"7B", + X"99",X"8E",X"5E",X"7F",X"9F",X"7F",X"83",X"63",X"7D",X"A5",X"6A",X"6C",X"99",X"8F",X"57",X"A1", + X"7C",X"68",X"9C",X"86",X"6B",X"72",X"A2",X"7B",X"81",X"5C",X"98",X"90",X"77",X"61",X"A5",X"71", + X"6B",X"A0",X"87",X"73",X"68",X"A2",X"80",X"80",X"63",X"7D",X"9E",X"81",X"60",X"A2",X"77",X"69", + X"A8",X"6B",X"6D",X"9D",X"83",X"7E",X"65",X"7C",X"9D",X"86",X"62",X"80",X"A1",X"6F",X"68",X"A0", + X"83",X"84",X"6C",X"6E",X"92",X"9A",X"5D",X"8C",X"8F",X"5F",X"A1",X"7F",X"7F",X"65",X"7B",X"98", + X"8C",X"61",X"7C",X"A1",X"78",X"66",X"A3",X"68",X"75",X"A3",X"7A",X"87",X"69",X"70",X"8E",X"97", + X"7C",X"62",X"93",X"90",X"79",X"6B",X"74",X"A0",X"83",X"63",X"87",X"9E",X"6D",X"70",X"A1",X"60", + X"8E",X"91",X"7A",X"73",X"68",X"97",X"8E",X"84",X"73",X"68",X"8D",X"9A",X"75",X"66",X"9E",X"7F", + X"60",X"9A",X"8E",X"61",X"8D",X"92",X"57",X"96",X"8E",X"81",X"79",X"65",X"9C",X"87",X"7A",X"67", + X"80",X"9E",X"7D",X"85",X"64",X"7B",X"9B",X"85",X"72",X"68",X"98",X"8F",X"74",X"66",X"9A",X"89", + X"5D",X"8D",X"96",X"7C",X"60",X"A1",X"7C",X"69",X"9D",X"81",X"78",X"65",X"A2",X"78",X"69",X"A8", + X"62",X"83",X"95",X"7E",X"76",X"67",X"8B",X"97",X"7B",X"61",X"A7",X"6B",X"76",X"9C",X"7F",X"77", + X"66",X"91",X"95",X"77",X"64",X"98",X"8E",X"64",X"7B",X"9D",X"7F",X"61",X"94",X"8F",X"7C",X"66", + X"82",X"9D",X"7A",X"87",X"66",X"7A",X"A0",X"6E",X"6D",X"A0",X"7F",X"84",X"71",X"6B",X"9E",X"83", + X"7E",X"62",X"90",X"92",X"7B",X"79",X"62",X"A4",X"79",X"70",X"99",X"84",X"62",X"8B",X"92",X"7F", + X"74",X"6B",X"8A",X"99",X"75",X"68",X"99",X"8C",X"68",X"77",X"9D",X"7D",X"83",X"6F",X"6D",X"91", + X"91",X"83",X"6F",X"6E",X"99",X"8C",X"69",X"76",X"9F",X"79",X"68",X"A1",X"70",X"6D",X"9B",X"86", + X"60",X"9C",X"7C",X"6A",X"9F",X"7B",X"84",X"65",X"81",X"A0",X"61",X"89",X"91",X"7D",X"7B",X"65", + X"8D",X"95",X"7E",X"83",X"70",X"6D",X"A3",X"73",X"70",X"A1",X"67",X"7F",X"9C",X"5A",X"98",X"7F", + X"6B",X"A0",X"78",X"87",X"60",X"8A",X"95",X"7C",X"81",X"61",X"94",X"8E",X"7F",X"7A",X"67",X"88", + X"93",X"88",X"6F",X"71",X"A0",X"67",X"78",X"98",X"88",X"6D",X"72",X"9E",X"7E",X"83",X"78",X"67", + X"8D",X"92",X"82",X"63",X"8F",X"8F",X"7D",X"7A",X"66",X"8F",X"93",X"7B",X"66",X"A3",X"6B",X"7B", + X"97",X"7E",X"74",X"6B",X"9B",X"86",X"7F",X"80",X"66",X"82",X"95",X"87",X"62",X"88",X"95",X"7D", + X"82",X"6B",X"77",X"99",X"86",X"66",X"91",X"8C",X"74",X"6C",X"98",X"85",X"7B",X"66",X"97",X"87", + X"80",X"74",X"6D",X"8C",X"96",X"73",X"70",X"A1",X"64",X"7A",X"93",X"8D",X"64",X"80",X"96",X"82", + X"6F",X"71",X"99",X"87",X"65",X"82",X"98",X"7F",X"82",X"71",X"6F",X"92",X"8D",X"83",X"6E",X"73", + X"95",X"8C",X"6E",X"74",X"9A",X"7E",X"82",X"69",X"7E",X"9F",X"62",X"88",X"91",X"64",X"8F",X"8F", + X"65",X"7E",X"96",X"83",X"63",X"8D",X"90",X"7F",X"7D",X"67",X"98",X"85",X"7E",X"66",X"92",X"8B", + X"7C",X"6C",X"7C",X"9B",X"7C",X"69",X"94",X"86",X"7F",X"72",X"6F",X"8F",X"91",X"78",X"68",X"97", + X"89",X"7B",X"67",X"97",X"86",X"80",X"74",X"6C",X"94",X"8C",X"7E",X"82",X"6B",X"7C",X"9F",X"67", + X"82",X"96",X"6A",X"77",X"9A",X"7E",X"83",X"78",X"69",X"98",X"86",X"81",X"74",X"6D",X"8C",X"91", + X"81",X"7A",X"69",X"99",X"80",X"65",X"90",X"8F",X"7D",X"66",X"96",X"87",X"7F",X"67",X"8D",X"8F", + X"61",X"98",X"7F",X"67",X"8E",X"90",X"7D",X"82",X"69",X"7D",X"96",X"86",X"6A",X"7D",X"9D",X"6F", + X"76",X"99",X"6E",X"71",X"99",X"83",X"83",X"71",X"71",X"8F",X"91",X"71",X"72",X"9A",X"7D",X"84", + X"6A",X"7A",X"8C",X"94",X"6B",X"7D",X"94",X"7F",X"6D",X"79",X"97",X"84",X"67",X"85",X"93",X"81", + X"73",X"74",X"9B",X"7A",X"84",X"68",X"80",X"97",X"7E",X"83",X"69",X"82",X"99",X"69",X"82",X"97", + X"65",X"87",X"91",X"63",X"93",X"86",X"7F",X"76",X"6C",X"94",X"89",X"82",X"6D",X"78",X"96",X"86", + X"69",X"80",X"97",X"79",X"6D",X"97",X"7D",X"6A",X"9A",X"76",X"6D",X"98",X"83",X"81",X"7D",X"6C", + X"80",X"93",X"87",X"65",X"96",X"83",X"81",X"78",X"6B",X"99",X"82",X"82",X"73",X"70",X"91",X"8D", + X"7C",X"84",X"69",X"80",X"97",X"7B",X"85",X"6C",X"79",X"92",X"8B",X"73",X"71",X"9B",X"75",X"6E", + X"91",X"8E",X"70",X"73",X"97",X"84",X"6B",X"80",X"98",X"77",X"70",X"95",X"7F",X"67",X"93",X"89", + X"7F",X"7E",X"6B",X"83",X"95",X"7F",X"82",X"78",X"6C",X"98",X"83",X"81",X"79",X"6B",X"96",X"84", + X"67",X"95",X"84",X"68",X"8E",X"8F",X"71",X"72",X"8F",X"8F",X"6B",X"80",X"93",X"7A",X"6B",X"91", + X"87",X"65",X"90",X"8D",X"74",X"6E",X"93",X"89",X"7D",X"82",X"6B",X"7E",X"93",X"87",X"6B",X"7F", + X"97",X"7A",X"86",X"6B",X"7E",X"95",X"7D",X"83",X"71",X"74",X"93",X"88",X"7F",X"7E",X"69",X"96", + X"83",X"81",X"79",X"6C",X"8B",X"90",X"7D",X"83",X"77",X"6E",X"8A",X"92",X"77",X"71",X"98",X"78", + X"6F",X"9B",X"6E",X"7D",X"94",X"7A",X"83",X"65",X"93",X"88",X"81",X"78",X"6F",X"86",X"96",X"71", + X"79",X"94",X"7D",X"80",X"6C",X"7E",X"91",X"87",X"7E",X"80",X"6B",X"80",X"8F",X"8B",X"6B",X"7D", + X"95",X"7D",X"83",X"72",X"73",X"92",X"88",X"80",X"6E",X"7C",X"95",X"80",X"6D",X"7F",X"95",X"7D", + X"83",X"77",X"6E",X"92",X"88",X"7F",X"6F",X"7A",X"96",X"7F",X"6E",X"80",X"99",X"6B",X"7F",X"90", + X"80",X"75",X"72",X"94",X"87",X"75",X"72",X"99",X"78",X"6F",X"8C",X"8F",X"6C",X"7C",X"92",X"80", + X"78",X"6E",X"90",X"8C",X"72",X"73",X"96",X"81",X"81",X"6D",X"7F",X"95",X"7D",X"83",X"7B",X"6E", + X"83",X"93",X"7E",X"83",X"6A",X"88",X"90",X"66",X"8C",X"8D",X"69",X"86",X"92",X"7B",X"85",X"70", + X"76",X"8D",X"8E",X"70",X"78",X"96",X"7C",X"85",X"6F",X"79",X"98",X"74",X"71",X"90",X"89",X"7C", + X"83",X"6B",X"83",X"91",X"80",X"80",X"70",X"79",X"90",X"88",X"7E",X"81",X"6E",X"7D",X"98",X"71", + X"7B",X"93",X"7A",X"85",X"6B",X"80",X"92",X"81",X"80",X"71",X"79",X"99",X"74",X"78",X"93",X"7C", + X"83",X"70",X"78",X"8D",X"8B",X"7E",X"80",X"6C",X"82",X"90",X"84",X"6A",X"8B",X"8C",X"7D",X"81", + X"6B",X"8B",X"8F",X"6D",X"82",X"92",X"6C",X"7F",X"94",X"72",X"74",X"91",X"86",X"6D",X"82",X"93", + X"69",X"82",X"91",X"80",X"6E",X"81",X"94",X"77",X"73",X"93",X"7C",X"6F",X"97",X"78",X"71",X"8B", + X"8F",X"6C",X"82",X"8E",X"7D",X"81",X"6F",X"7C",X"8F",X"87",X"7E",X"80",X"6E",X"7E",X"8E",X"8A", + X"70",X"78",X"95",X"7D",X"84",X"78",X"71",X"87",X"91",X"79",X"70",X"91",X"85",X"7C",X"6F",X"8B", + X"8C",X"67",X"90",X"82",X"6F",X"91",X"84",X"76",X"72",X"8D",X"8D",X"70",X"7D",X"93",X"6F",X"7D", + X"95",X"68",X"88",X"8B",X"80",X"78",X"73",X"96",X"7D",X"84",X"73",X"75",X"93",X"83",X"81",X"77", + X"72",X"8E",X"8A",X"7E",X"80",X"6D",X"8C",X"8C",X"6A",X"83",X"8F",X"81",X"6D",X"85",X"8F",X"7E", + X"6D",X"88",X"8D",X"7F",X"6F",X"82",X"91",X"7D",X"6F",X"85",X"8F",X"7D",X"7D",X"6D",X"90",X"88", + X"7C",X"6E",X"94",X"80",X"70",X"8E",X"87",X"76",X"74",X"92",X"81",X"7D",X"6D",X"8F",X"87",X"7F", + X"71",X"7C",X"92",X"81",X"73",X"7A",X"95",X"7C",X"84",X"7B",X"6F",X"8D",X"8A",X"7B",X"71",X"82", + X"92",X"79",X"73",X"91",X"7E",X"6D",X"8D",X"89",X"7D",X"83",X"6D",X"84",X"8F",X"7D",X"83",X"70", + X"7B",X"8B",X"8B",X"7B",X"85",X"71",X"7A",X"93",X"7E",X"82",X"75",X"75",X"89",X"8D",X"7D",X"6D", + X"90",X"85",X"81",X"79",X"71",X"8D",X"8A",X"79",X"72",X"91",X"83",X"7D",X"6F",X"86",X"8E",X"7D", + X"70",X"85",X"90",X"7A",X"86",X"74",X"76",X"91",X"82",X"81",X"79",X"72",X"87",X"8D",X"80",X"6D", + X"86",X"8E",X"7E",X"82",X"76",X"74",X"89",X"8B",X"82",X"72",X"7F",X"94",X"6F",X"80",X"8D",X"7E", + X"73",X"7B",X"92",X"7F",X"71",X"8A",X"89",X"6A",X"89",X"8B",X"81",X"71",X"7F",X"91",X"7C",X"84", + X"79",X"72",X"8D",X"89",X"6C",X"8C",X"86",X"7F",X"7C",X"71",X"83",X"8D",X"83",X"7E",X"81",X"6E", + X"83",X"8D",X"85",X"71",X"7C",X"91",X"7E",X"82",X"7D",X"70",X"88",X"8D",X"7D",X"83",X"6E",X"84", + X"8F",X"7C",X"83",X"70",X"7E",X"90",X"7F",X"82",X"76",X"76",X"93",X"7E",X"83",X"7A",X"72",X"8D", + X"89",X"76",X"75",X"92",X"7F",X"83",X"76",X"76",X"92",X"7F",X"6F",X"8A",X"8A",X"7D",X"72",X"83", + X"90",X"79",X"75",X"8A",X"87",X"6B",X"89",X"89",X"7F",X"7F",X"71",X"81",X"93",X"70",X"7E",X"8E", + X"80",X"79",X"73",X"8E",X"88",X"79",X"72",X"8E",X"86",X"7B",X"72",X"8E",X"85",X"6E",X"8E",X"84", + X"6F",X"85",X"8E",X"78",X"74",X"91",X"7C",X"71",X"94",X"7A",X"73",X"8A",X"8C",X"76",X"76",X"8F", + X"84",X"7D",X"83",X"6E",X"86",X"8B",X"81",X"71",X"83",X"8D",X"7E",X"78",X"75",X"92",X"81",X"81", + X"7D",X"72",X"82",X"8E",X"80",X"80",X"7E",X"70",X"85",X"8C",X"83",X"70",X"80",X"8E",X"7F",X"72", + X"81",X"90",X"7A",X"86",X"72",X"7D",X"90",X"77",X"74",X"8C",X"88",X"7D",X"83",X"75",X"78",X"8C", + X"88",X"7D",X"83",X"74",X"79",X"8F",X"83",X"6F",X"87",X"8C",X"79",X"73",X"8A",X"89",X"7D",X"83", + X"76",X"76",X"8C",X"87",X"7F",X"7D",X"70",X"8C",X"87",X"80",X"71",X"84",X"8D",X"7C",X"73",X"8C", + X"83",X"6E",X"89",X"8A",X"7C",X"73",X"90",X"7E",X"83",X"70",X"84",X"8C",X"7E",X"78",X"78",X"93", + X"7A",X"73",X"8A",X"89",X"7C",X"84",X"77",X"76",X"90",X"81",X"81",X"7A",X"73",X"8B",X"89",X"71", + X"7E",X"8F",X"7E",X"71",X"8B",X"86",X"7F",X"7E",X"70",X"8D",X"87",X"72",X"7D",X"8E",X"82",X"73", + X"7E",X"8F",X"7F",X"82",X"7D",X"72",X"88",X"8C",X"6F",X"86",X"89",X"7D",X"81",X"70",X"83",X"8C", + X"82",X"70",X"83",X"8C",X"81",X"72",X"80",X"8E",X"7D",X"83",X"7A",X"74",X"86",X"8C",X"7C",X"72", + X"87",X"8B",X"7D",X"83",X"78",X"76",X"8F",X"82",X"71",X"8D",X"82",X"80",X"7E",X"72",X"83",X"8D", + X"7E",X"83",X"74",X"7E",X"8F",X"7B",X"85",X"74",X"7B",X"8F",X"7F",X"81",X"7B",X"73",X"87",X"8A", + X"80",X"72",X"8B",X"84",X"7E",X"80",X"70",X"8B",X"87",X"7E",X"82",X"73",X"7D",X"8C",X"86",X"77", + X"79",X"91",X"79",X"77",X"90",X"7A",X"77",X"90",X"79",X"75",X"8B",X"87",X"77",X"79",X"91",X"74", + X"7D",X"8C",X"7F",X"72",X"85",X"8B",X"7D",X"72",X"87",X"89",X"7F",X"7B",X"74",X"8D",X"86",X"76", + X"7A",X"91",X"74",X"7A",X"8B",X"86",X"78",X"77",X"8E",X"82",X"7F",X"81",X"73",X"7E",X"8C",X"84", + X"76",X"7B",X"91",X"77",X"77",X"8A",X"87",X"76",X"79",X"8B",X"86",X"75",X"7B",X"8B",X"85",X"72", + X"83",X"89",X"7E",X"7E",X"73",X"8F",X"80",X"73",X"83",X"8D",X"7D",X"84",X"73",X"7E",X"8B",X"84", + X"74",X"7D",X"8C",X"82",X"74",X"7F",X"8D",X"80",X"7B",X"74",X"8D",X"84",X"79",X"76",X"8F",X"80", + X"82",X"72",X"85",X"8A",X"7C",X"82",X"71",X"85",X"8A",X"7F",X"81",X"76",X"7B",X"8F",X"7F",X"83", + X"75",X"7B",X"89",X"89",X"73",X"81",X"8B",X"7C",X"84",X"74",X"7D",X"8C",X"81",X"71",X"89",X"87", + X"80",X"72",X"88",X"87",X"7F",X"75",X"82",X"8C",X"7B",X"84",X"73",X"7F",X"8E",X"7A",X"76",X"8D", + X"81",X"7E",X"74",X"8C",X"84",X"71",X"85",X"8A",X"7E",X"74",X"86",X"8A",X"7B",X"75",X"8A",X"85", + X"71",X"8B",X"83",X"73",X"89",X"85",X"7B",X"75",X"87",X"8A",X"79",X"76",X"8C",X"83",X"7F",X"80", + X"73",X"81",X"89",X"86",X"73",X"7D",X"8B",X"84",X"7A",X"76",X"8C",X"83",X"7F",X"75",X"81",X"8D", + X"7D",X"84",X"77",X"7A",X"8E",X"7B",X"75",X"8D",X"80",X"81",X"7B",X"75",X"8C",X"84",X"7F",X"73", + X"87",X"88",X"7D",X"82",X"75",X"7D",X"8D",X"7F",X"74",X"8D",X"7E",X"75",X"8D",X"7E",X"74",X"88", + X"88",X"7A",X"78",X"8D",X"7C",X"75",X"87",X"89",X"7A",X"76",X"88",X"89",X"77",X"7A",X"8E",X"7C", + X"74",X"8A",X"85",X"7E",X"82",X"76",X"7B",X"89",X"87",X"72",X"88",X"85",X"7E",X"81",X"74",X"7F", + X"88",X"87",X"75",X"7E",X"8E",X"77",X"79",X"8A",X"85",X"77",X"7A",X"8B",X"83",X"76",X"7F",X"8C", + X"73",X"7E",X"8B",X"82",X"75",X"7E",X"8C",X"7F",X"77",X"7C",X"8D",X"80",X"75",X"86",X"87",X"73", + X"7F",X"8B",X"80",X"7F",X"74",X"89",X"85",X"72",X"89",X"85",X"73",X"88",X"85",X"7D",X"82",X"71", + X"8A",X"84",X"83",X"74",X"82",X"89",X"81",X"78",X"7D",X"8C",X"7F",X"7C",X"76",X"8A",X"86",X"7B", + X"77",X"8C",X"81",X"80",X"7E",X"74",X"86",X"88",X"82",X"7A",X"78",X"8B",X"83",X"7E",X"82",X"77", + X"7B",X"88",X"87",X"7A",X"77",X"86",X"89",X"78",X"7A",X"8C",X"7F",X"81",X"79",X"78",X"87",X"87", + X"81",X"76",X"80",X"8D",X"74",X"81",X"89",X"7D",X"83",X"76",X"7D",X"8B",X"81",X"73",X"87",X"88", + X"7D",X"76",X"8D",X"7D",X"77",X"8A",X"82",X"7A",X"78",X"89",X"86",X"76",X"7C",X"8B",X"81",X"7D", + X"75",X"8B",X"82",X"74",X"8A",X"82",X"74",X"8B",X"81",X"80",X"7E",X"75",X"85",X"8A",X"77",X"7B", + X"8A",X"83",X"77",X"7C",X"8B",X"81",X"77",X"7D",X"8D",X"7D",X"83",X"7A",X"78",X"89",X"86",X"7D", + X"83",X"79",X"79",X"8A",X"84",X"75",X"80",X"8A",X"80",X"7B",X"78",X"8E",X"7C",X"78",X"8B",X"7F", + X"81",X"7C",X"76",X"86",X"87",X"80",X"74",X"85",X"88",X"7B",X"76",X"8C",X"81",X"82",X"78",X"7C", + X"8A",X"80",X"7B",X"78",X"8C",X"80",X"7E",X"75",X"87",X"87",X"7D",X"76",X"86",X"88",X"7B",X"77", + X"87",X"87",X"79",X"7A",X"8C",X"7B",X"78",X"8C",X"80",X"81",X"7D",X"76",X"85",X"88",X"80",X"7E", + X"76",X"86",X"88",X"7D",X"76",X"84",X"89",X"7B",X"79",X"89",X"81",X"80",X"7B",X"77",X"89",X"84", + X"80",X"7F",X"75",X"88",X"84",X"7F",X"77",X"7F",X"8B",X"80",X"78",X"7E",X"8C",X"7B",X"79",X"88", + X"83",X"77",X"7F",X"8C",X"76",X"7F",X"89",X"7F",X"78",X"7C",X"8B",X"81",X"76",X"83",X"8A",X"74", + X"83",X"88",X"75",X"82",X"89",X"74",X"81",X"89",X"7D",X"83",X"77",X"7C",X"8C",X"7E",X"76",X"88", + X"86",X"7E",X"83",X"7A",X"79",X"83",X"89",X"7F",X"76",X"88",X"85",X"74",X"84",X"89",X"75",X"82", + X"88",X"7D",X"83",X"75",X"80",X"88",X"82",X"7A",X"7B",X"8B",X"7E",X"82",X"7B",X"78",X"88",X"86", + X"76",X"83",X"88",X"74",X"83",X"88",X"7E",X"76",X"85",X"87",X"7E",X"82",X"7C",X"78",X"83",X"87", + X"83",X"76",X"80",X"89",X"80",X"77",X"81",X"8A",X"7E",X"81",X"7E",X"77",X"81",X"89",X"81",X"78", + X"7C",X"8B",X"80",X"82",X"74",X"86",X"85",X"80",X"77",X"82",X"88",X"7F",X"7A",X"7B",X"8C",X"7E", + X"82",X"7B",X"78",X"87",X"86",X"7E",X"82",X"76",X"81",X"8A",X"7A",X"79",X"87",X"86",X"7A",X"79", + X"89",X"83",X"7F",X"81",X"76",X"83",X"89",X"78",X"7C",X"89",X"82",X"78",X"7C",X"8B",X"7F",X"81", + X"7C",X"77",X"87",X"85",X"7E",X"81",X"77",X"7E",X"8A",X"80",X"81",X"7F",X"77",X"81",X"89",X"80", + X"80",X"7F",X"76",X"84",X"88",X"7E",X"82",X"79",X"7B",X"87",X"86",X"7C",X"79",X"88",X"83",X"76", + X"81",X"88",X"80",X"77",X"81",X"89",X"7D",X"78",X"86",X"84",X"76",X"81",X"88",X"80",X"77",X"85", + X"86",X"76",X"7E",X"89",X"81",X"78",X"7F",X"8A",X"7E",X"78",X"89",X"81",X"80",X"7E",X"77",X"82", + X"87",X"82",X"7F",X"81",X"78",X"7D",X"88",X"83",X"7F",X"77",X"86",X"85",X"7E",X"82",X"76",X"80", + X"88",X"82",X"7E",X"77",X"86",X"85",X"7F",X"77",X"86",X"85",X"7F",X"78",X"81",X"8A",X"75",X"83", + X"87",X"77",X"7F",X"8A",X"79",X"7B",X"88",X"84",X"76",X"84",X"85",X"7E",X"78",X"82",X"88",X"7F", + X"78",X"84",X"87",X"76",X"7F",X"88",X"82",X"7E",X"82",X"77",X"7F",X"89",X"7E",X"82",X"7B",X"7A", + X"87",X"85",X"76",X"81",X"88",X"80",X"77",X"81",X"88",X"7E",X"82",X"7E",X"78",X"82",X"87",X"81", + X"77",X"80",X"88",X"7F",X"78",X"81",X"89",X"7E",X"82",X"7E",X"78",X"82",X"88",X"81",X"78",X"7F", + X"89",X"7E",X"82",X"7E",X"78",X"83",X"88",X"7A",X"7B",X"88",X"81",X"7E",X"77",X"87",X"84",X"7F", + X"78",X"82",X"89",X"75",X"84",X"85",X"7F",X"81",X"78",X"7E",X"8A",X"7E",X"79",X"89",X"80",X"81", + X"7D",X"78",X"85",X"86",X"81",X"76",X"86",X"84",X"80",X"79",X"7E",X"88",X"81",X"79",X"7D",X"8A", + X"7E",X"82",X"7E",X"7A",X"7D",X"88",X"82",X"81",X"79",X"7F",X"8A",X"79",X"7B",X"88",X"82",X"7F", + X"7F",X"77",X"85",X"86",X"7F",X"78",X"82",X"88",X"7F",X"82",X"7B",X"7A",X"86",X"85",X"7F",X"81", + X"77",X"82",X"87",X"80",X"78",X"83",X"86",X"7D",X"83",X"77",X"81",X"88",X"7F",X"82",X"7B",X"7A", + X"88",X"83",X"77",X"83",X"87",X"78",X"7E",X"88",X"80",X"80",X"7F",X"79",X"7D",X"87",X"83",X"80", + X"77",X"83",X"85",X"7F",X"7A",X"7C",X"89",X"81",X"7A",X"7D",X"8A",X"7A",X"7B",X"86",X"84",X"7A", + X"7C",X"89",X"7F",X"82",X"7C",X"7A",X"88",X"81",X"77",X"85",X"86",X"77",X"84",X"85",X"77",X"81", + X"88",X"78",X"7D",X"87",X"82",X"78",X"81",X"87",X"7A",X"7C",X"89",X"7D",X"79",X"87",X"83",X"7A", + X"7C",X"88",X"82",X"7A",X"7D",X"88",X"80",X"78",X"86",X"83",X"76",X"84",X"86",X"7E",X"78",X"86", + X"83",X"7E",X"81",X"77",X"81",X"86",X"83",X"79",X"7E",X"88",X"7F",X"81",X"7D",X"79",X"86",X"84", + X"7E",X"82",X"77",X"81",X"86",X"82",X"78",X"82",X"86",X"80",X"7D",X"7A",X"89",X"80",X"7F",X"78", + X"88",X"81",X"78",X"87",X"81",X"7F",X"81",X"78",X"82",X"88",X"79",X"7F",X"88",X"7B",X"7B",X"85", + X"85",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"79",X"84",X"85",X"80",X"80",X"78",X"86",X"84",X"77", + X"81",X"87",X"7E",X"82",X"7A",X"7D",X"89",X"7E",X"82",X"7D",X"7A",X"82",X"87",X"7F",X"81",X"7F", + X"79",X"83",X"87",X"7A",X"7C",X"87",X"81",X"7E",X"79",X"85",X"85",X"7E",X"79",X"84",X"86",X"79", + X"7E",X"88",X"7B",X"7B",X"86",X"83",X"7F",X"82",X"79",X"7E",X"87",X"81",X"7D",X"79",X"86",X"84", + X"7F",X"79",X"84",X"85",X"77",X"85",X"84",X"7F",X"81",X"7A",X"7D",X"86",X"83",X"7E",X"82",X"7B", + X"7C",X"87",X"81",X"78",X"81",X"86",X"7F",X"79",X"82",X"86",X"7E",X"79",X"81",X"87",X"7E",X"79", + X"87",X"82",X"7F",X"80",X"78",X"84",X"85",X"7C",X"7B",X"87",X"81",X"80",X"78",X"86",X"83",X"80", + X"7B",X"7C",X"88",X"81",X"7C",X"7C",X"89",X"7B",X"7B",X"85",X"84",X"7B",X"7B",X"85",X"84",X"7C", + X"7A",X"86",X"84",X"7C",X"7B",X"87",X"82",X"7F",X"79",X"85",X"84",X"78",X"84",X"84",X"7A",X"7E", + X"87",X"81",X"7A",X"81",X"86",X"7A",X"7C",X"87",X"81",X"7F",X"81",X"7A",X"7F",X"88",X"7E",X"7A", + X"85",X"83",X"7A",X"7E",X"88",X"7B",X"7D",X"88",X"7D",X"7B",X"87",X"80",X"79",X"84",X"84",X"7E", + X"82",X"79",X"7F",X"87",X"80",X"80",X"79",X"83",X"86",X"7F",X"79",X"83",X"85",X"78",X"80",X"87", + X"7F",X"81",X"7A",X"7F",X"88",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"7A",X"84",X"85",X"7F",X"79", + X"81",X"87",X"7E",X"82",X"7B",X"7E",X"87",X"7E",X"79",X"84",X"85",X"7E",X"82",X"7C",X"7B",X"84", + X"86",X"78",X"83",X"84",X"80",X"7A",X"7E",X"86",X"82",X"7A",X"7E",X"87",X"81",X"7A",X"7F",X"87", + X"80",X"7E",X"79",X"86",X"83",X"7F",X"81",X"79",X"81",X"86",X"7E",X"82",X"7B",X"7D",X"87",X"80", + X"81",X"7F",X"7A",X"81",X"87",X"7C",X"7B",X"86",X"82",X"7C",X"7B",X"86",X"83",X"7D",X"7A",X"88", + X"7E",X"7B",X"85",X"82",X"7B",X"7D",X"87",X"80",X"7E",X"7A",X"85",X"84",X"7E",X"7A",X"85",X"84", + X"7E",X"7A",X"84",X"84",X"7E",X"82",X"79",X"80",X"86",X"7E",X"7A",X"85",X"83",X"7F",X"80",X"79", + X"85",X"84",X"79",X"82",X"86",X"79",X"81",X"86",X"7B",X"7D",X"87",X"7F",X"79",X"86",X"81",X"79", + X"85",X"83",X"79",X"82",X"85",X"78",X"82",X"85",X"7F",X"81",X"7B",X"7D",X"87",X"80",X"80",X"7F", + X"7A",X"83",X"86",X"7B",X"7D",X"86",X"81",X"7B",X"7D",X"86",X"82",X"7C",X"7D",X"88",X"7D",X"7B", + X"83",X"85",X"7E",X"7A",X"83",X"85",X"7C",X"7C",X"86",X"80",X"7F",X"7A",X"85",X"83",X"79",X"85", + X"83",X"7A",X"81",X"86",X"79",X"80",X"85",X"81",X"7E",X"7B",X"87",X"80",X"81",X"7E",X"7B",X"83", + X"86",X"79",X"81",X"84",X"80",X"7B",X"80",X"86",X"7F",X"7D",X"7D",X"88",X"7E",X"82",X"7C",X"7C", + X"85",X"83",X"79",X"81",X"86",X"7F",X"7A",X"82",X"86",X"79",X"80",X"85",X"81",X"7A",X"7F",X"86", + X"81",X"7B",X"7E",X"87",X"7F",X"80",X"80",X"7B",X"80",X"87",X"7E",X"7A",X"85",X"83",X"7F",X"7A", + X"84",X"84",X"7F",X"7C",X"7E",X"87",X"7E",X"82",X"7D",X"7B",X"85",X"81",X"7F",X"7A",X"85",X"82", + X"7F",X"7B",X"80",X"86",X"80",X"7B",X"80",X"86",X"7F",X"80",X"80",X"7A",X"81",X"85",X"7F",X"7A", + X"82",X"85",X"80",X"7B",X"81",X"86",X"7C",X"7C",X"86",X"81",X"81",X"7C",X"7E",X"86",X"7F",X"80", + X"79",X"84",X"84",X"7F",X"80",X"7F",X"7A",X"83",X"84",X"7F",X"81",X"7B",X"7E",X"83",X"85",X"7D", + X"7C",X"86",X"81",X"7A",X"81",X"85",X"7F",X"7B",X"84",X"82",X"7F",X"81",X"7A",X"80",X"85",X"81", + X"7F",X"81",X"7D",X"7C",X"84",X"84",X"7F",X"7A",X"82",X"85",X"7F",X"81",X"7F",X"7A",X"84",X"83", + X"7F",X"80",X"7A",X"81",X"85",X"80",X"80",X"7D",X"7C",X"86",X"81",X"80",X"80",X"7A",X"85",X"82", + X"7F",X"81",X"7B",X"7E",X"85",X"82",X"7F",X"81",X"7B",X"7F",X"84",X"83",X"7C",X"7D",X"85",X"82", + X"7C",X"7E",X"86",X"7D",X"7C",X"85",X"82",X"7F",X"81",X"7E",X"7B",X"84",X"83",X"81",X"7C",X"7D", + X"87",X"7C",X"7E",X"86",X"7F",X"7B",X"86",X"80",X"81",X"7C",X"7E",X"86",X"7F",X"7B",X"83",X"84", + X"7F",X"80",X"7A",X"81",X"85",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"7E",X"7C",X"87",X"7E",X"7C", + X"85",X"80",X"7B",X"84",X"82",X"79",X"82",X"84",X"81",X"7A",X"81",X"85",X"80",X"7F",X"7B",X"86", + X"81",X"7A",X"83",X"84",X"7F",X"81",X"7F",X"7B",X"82",X"85",X"7B",X"7D",X"85",X"81",X"7F",X"81", + X"7D",X"7C",X"85",X"82",X"80",X"7A",X"83",X"83",X"80",X"7D",X"7D",X"86",X"80",X"7F",X"7B",X"84", + X"83",X"7F",X"81",X"7E",X"7C",X"83",X"84",X"7B",X"81",X"85",X"7C",X"7E",X"86",X"7C",X"7D",X"84", + X"84",X"7C",X"7E",X"85",X"80",X"7C",X"7D",X"85",X"81",X"7F",X"81",X"7C",X"7F",X"86",X"7F",X"81", + X"7F",X"7B",X"84",X"83",X"7C",X"7F",X"86",X"7B",X"7E",X"84",X"82",X"7D",X"7D",X"85",X"80",X"7F", + X"7B",X"86",X"80",X"80",X"7F",X"7B",X"82",X"85",X"7B",X"80",X"84",X"80",X"7D",X"7D",X"85",X"82", + X"7D",X"7D",X"85",X"81",X"7D",X"7D",X"84",X"82",X"7D",X"7E",X"86",X"7D",X"7C",X"84",X"82",X"7B", + X"80",X"85",X"7F",X"80",X"80",X"7B",X"81",X"85",X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"7B", + X"81",X"84",X"7F",X"7B",X"83",X"83",X"7F",X"81",X"7B",X"80",X"83",X"83",X"7D",X"7C",X"85",X"81", + X"7F",X"81",X"7D",X"7D",X"83",X"83",X"80",X"7B",X"83",X"83",X"80",X"7B",X"81",X"84",X"80",X"7C", + X"80",X"85",X"7B",X"7E",X"84",X"82",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"80",X"7B",X"83",X"84", + X"7A",X"83",X"82",X"80",X"7C",X"81",X"85",X"7B",X"7F",X"84",X"80",X"7F",X"81",X"7C",X"7F",X"85", + X"7E",X"7C",X"83",X"84",X"7F",X"81",X"7B",X"80",X"84",X"7F",X"81",X"7D",X"7C",X"83",X"83",X"80", + X"7B",X"80",X"84",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F",X"7C",X"81",X"85",X"7B",X"7F",X"85", + X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"80",X"80",X"7B",X"82",X"83",X"7F",X"81",X"7D",X"7D", + X"85",X"80",X"80",X"80",X"7C",X"80",X"85",X"80",X"80",X"7F",X"7C",X"85",X"81",X"7B",X"82",X"83", + X"7A",X"82",X"83",X"7F",X"81",X"7B",X"80",X"85",X"7F",X"7C",X"84",X"82",X"7B",X"80",X"84",X"81", + X"7C",X"7F",X"85",X"7F",X"82",X"7D",X"7E",X"85",X"80",X"7B",X"82",X"83",X"7F",X"80",X"7B",X"85", + X"81",X"7B",X"81",X"84",X"80",X"7C",X"83",X"82",X"7B",X"80",X"84",X"80",X"81",X"7C",X"81",X"85", + X"7B",X"7F",X"85",X"7D",X"7D",X"84",X"81",X"80",X"81",X"7E",X"7C",X"83",X"83",X"7F",X"7C",X"81", + X"84",X"7F",X"81",X"7C",X"7F",X"85",X"7F",X"7C",X"82",X"83",X"7E",X"7C",X"82",X"84",X"7F",X"81", + X"7F",X"7C",X"81",X"84",X"80",X"80",X"81",X"7C",X"80",X"85",X"7F",X"7C",X"84",X"80",X"81",X"7C", + X"7F",X"84",X"81",X"7E",X"7D",X"84",X"82",X"7D",X"7D",X"84",X"81",X"7E",X"7C",X"84",X"81",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"7C",X"82",X"83",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F", + X"7C",X"80",X"83",X"82",X"7D",X"7E",X"84",X"81",X"7F",X"81",X"7C",X"80",X"84",X"81",X"7D",X"7E", + X"84",X"80",X"7F",X"7C",X"83",X"83",X"7E",X"7D",X"84",X"81",X"7B",X"82",X"83",X"7F",X"7C",X"81", + X"83",X"80",X"7C",X"81",X"84",X"7F",X"80",X"80",X"7C",X"81",X"84",X"7D",X"7D",X"83",X"82",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"80",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"84",X"81", + X"7F",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"85",X"80",X"80",X"7F",X"7C",X"83",X"82",X"7C", + X"81",X"84",X"7C",X"80",X"84",X"7D",X"7E",X"85",X"7F",X"7C",X"83",X"82",X"7F",X"81",X"7C",X"81", + X"84",X"80",X"80",X"80",X"7D",X"7F",X"83",X"82",X"7C",X"81",X"83",X"7F",X"81",X"7C",X"7F",X"83", + X"81",X"7F",X"81",X"7D",X"7E",X"85",X"80",X"80",X"7F",X"7C",X"82",X"83",X"7D",X"7E",X"83",X"82", + X"7E",X"7D",X"84",X"81",X"80",X"80",X"7C",X"81",X"84",X"80",X"81",X"7E",X"7D",X"84",X"82",X"7C", + X"82",X"83",X"7C",X"7F",X"84",X"80",X"80",X"81",X"7D",X"7E",X"83",X"82",X"80",X"80",X"7C",X"82", + X"83",X"7C",X"80",X"84",X"7D",X"7D",X"84",X"80",X"81",X"7C",X"82",X"83",X"7F",X"7E",X"7E",X"84", + X"80",X"80",X"80",X"7D",X"7E",X"85",X"80",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7F",X"7C",X"82", + X"83",X"7B",X"80",X"83",X"80",X"7D",X"7E",X"84",X"80",X"80",X"80",X"7D",X"7F",X"84",X"7F",X"7C", + X"84",X"81",X"80",X"7C",X"83",X"82",X"7C",X"82",X"82",X"7C",X"80",X"84",X"7D",X"7E",X"84",X"80", + X"80",X"80",X"7C",X"83",X"82",X"80",X"7E",X"7E",X"85",X"7E",X"7D",X"82",X"83",X"7E",X"7D",X"83", + X"80",X"7C",X"83",X"81",X"7C",X"83",X"81",X"80",X"80",X"7C",X"7F",X"82",X"82",X"7E",X"7D",X"83", + X"82",X"7E",X"7D",X"83",X"82",X"7E",X"7E",X"84",X"7F",X"7C",X"84",X"80",X"7C",X"83",X"81",X"7F", + X"80",X"7C",X"81",X"83",X"80",X"7F",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7B",X"82",X"82",X"7F", + X"80",X"7C",X"82",X"82",X"80",X"7D",X"82",X"83",X"7B",X"82",X"82",X"80",X"7D",X"80",X"83",X"80", + X"7D",X"80",X"84",X"7F",X"81",X"7F",X"7D",X"82",X"83",X"80",X"7C",X"81",X"83",X"7F",X"7D",X"81", + X"84",X"7D",X"7F",X"84",X"7F",X"7D",X"84",X"80",X"81",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7E", + X"82",X"83",X"7F",X"81",X"7D",X"7F",X"83",X"81",X"7D",X"7F",X"84",X"80",X"7C",X"83",X"81",X"7C", + X"82",X"82",X"7C",X"80",X"83",X"80",X"80",X"80",X"7D",X"7E",X"83",X"81",X"80",X"80",X"7F",X"7D", + X"82",X"83",X"80",X"80",X"80",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7D",X"82",X"82",X"80",X"7E", + X"7D",X"84",X"81",X"80",X"80",X"7D",X"80",X"84",X"7E",X"7E",X"83",X"81",X"7F",X"7D",X"82",X"82", + X"7E",X"7E",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"7D",X"82",X"83",X"7F",X"7D",X"83",X"81",X"7C", + X"82",X"81",X"7F",X"81",X"7D",X"80",X"83",X"7F",X"7D",X"83",X"81",X"7F",X"81",X"7C",X"81",X"83", + X"7F",X"80",X"7F",X"7D",X"82",X"82",X"80",X"7D",X"80",X"83",X"80",X"7D",X"82",X"82",X"7F",X"81", + X"7D",X"7F",X"82",X"82",X"7D",X"81",X"83",X"7F",X"81",X"7D",X"7E",X"84",X"7F",X"7D",X"83",X"80", + X"7D",X"83",X"81",X"80",X"7E",X"7E",X"84",X"7E",X"7E",X"82",X"81",X"7D",X"80",X"83",X"81",X"7E", + X"7E",X"83",X"81",X"7D",X"80",X"83",X"7E",X"7E",X"83",X"81",X"80",X"80",X"7C",X"82",X"82",X"7E", + X"7E",X"83",X"81",X"7E",X"7E",X"83",X"80",X"80",X"7F",X"7D",X"83",X"80",X"80",X"7D",X"83",X"81", + X"80",X"7D",X"80",X"83",X"7F",X"81",X"7E",X"7F",X"83",X"7F",X"7D",X"83",X"80",X"7C",X"83",X"81", + X"7D",X"82",X"82",X"7C",X"81",X"82",X"80",X"7E",X"7F",X"83",X"81",X"7E",X"7F",X"83",X"80",X"80", + X"81",X"7D",X"7F",X"83",X"81",X"7D",X"80",X"83",X"80",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"7F", + X"83",X"80",X"7D",X"83",X"80",X"7F",X"7D",X"83",X"81",X"80",X"80",X"7D",X"81",X"83",X"80",X"7D", + X"83",X"81",X"80",X"80",X"7D",X"80",X"82",X"81",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81", + X"80",X"81",X"7E",X"7E",X"82",X"82",X"7F",X"7D",X"82",X"82",X"7C",X"81",X"82",X"81",X"7D",X"81", + X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"81",X"7E",X"7E", + X"83",X"81",X"7F",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82",X"82",X"7E",X"7E",X"83", + X"80",X"80",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"7F",X"7E",X"83",X"80",X"7D",X"81",X"83", + X"7F",X"80",X"80",X"7D",X"80",X"83",X"7D",X"7F",X"83",X"80",X"81",X"7E",X"7E",X"83",X"80",X"80", + X"80",X"7D",X"80",X"82",X"82",X"7D",X"80",X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"80",X"80",X"7D",X"80",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"81",X"7F",X"7E",X"82",X"81", + X"7D",X"81",X"82",X"7F",X"81",X"7D",X"80",X"82",X"81",X"7E",X"7F",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"7D",X"81",X"82",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"7F",X"7D",X"81",X"83",X"7F", + X"7E",X"82",X"81",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"81",X"82",X"7F",X"80",X"7E",X"7E",X"82", + X"82",X"80",X"80",X"7D",X"81",X"83",X"7E",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82", + X"82",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"80",X"82",X"80",X"7E",X"80",X"83",X"80", + X"7F",X"7E",X"83",X"81",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"83",X"7F", + X"7E",X"83",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"80",X"7D",X"80",X"82", + X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"82",X"80",X"7F",X"7E",X"83",X"7F",X"7E", + X"83",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"81",X"81",X"80",X"7E",X"7F",X"83",X"80", + X"7F",X"7E",X"83",X"80",X"80",X"80",X"7F",X"7E",X"82",X"82",X"80",X"80",X"80",X"7D",X"81",X"82", + X"7D",X"80",X"83",X"7F",X"7E",X"82",X"81",X"7D",X"80",X"82",X"80",X"7D",X"81",X"81",X"80",X"7D", + X"81",X"82",X"80",X"7E",X"7F",X"83",X"80",X"80",X"80",X"7E",X"7F",X"82",X"82",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"82",X"82",X"80",X"80",X"80",X"7E",X"80",X"82", + X"81",X"7E",X"81",X"82",X"7F",X"81",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"80",X"82",X"81", + X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E",X"80",X"82",X"80", + X"80",X"80",X"7D",X"82",X"81",X"80",X"80",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"82",X"81", + X"7F",X"81",X"7E",X"7F",X"82",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"7D", + X"81",X"82",X"7D",X"80",X"82",X"80",X"7E",X"81",X"82",X"7D",X"81",X"81",X"80",X"7D",X"81",X"82", + X"7F",X"80",X"7E",X"7F",X"82",X"81",X"7F",X"81",X"7D",X"81",X"82",X"7E",X"7F",X"82",X"81",X"7E", + X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E", + X"7F",X"82",X"81",X"7E",X"81",X"82",X"7E",X"7F",X"82",X"80",X"80",X"7E",X"81",X"82",X"7F",X"80", + X"7E",X"80",X"81",X"82",X"7F",X"7E",X"82",X"81",X"7F",X"81",X"7F",X"7E",X"82",X"81",X"7E",X"80", + X"82",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E", + X"82",X"81",X"80",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"82",X"80",X"7F",X"7F",X"83",X"7E",X"7F", + X"82",X"80",X"7F",X"7E",X"82",X"81",X"7F",X"7E",X"82",X"81",X"80",X"7E",X"81",X"81",X"80",X"7E", + X"80",X"82",X"80",X"7F",X"7E",X"83",X"80",X"80",X"80",X"7E",X"81",X"82",X"80",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7E",X"7F",X"82",X"81",X"7F",X"7F",X"83",X"7E",X"7F",X"82",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GAL_HIT.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GAL_HIT.vhd new file mode 100644 index 00000000..7d2fd29c --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/GAL_HIT.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_HIT 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 prom of GAL_HIT is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"65",X"75",X"88",X"90",X"93",X"9B",X"A3",X"A3",X"A3",X"A6",X"9E",X"9B",X"9B",X"A3",X"AB",X"B6", + X"B9",X"B9",X"BE",X"B9",X"AE",X"A6",X"9E",X"98",X"88",X"78",X"68",X"65",X"65",X"65",X"62",X"68", + X"68",X"65",X"5D",X"52",X"47",X"47",X"4A",X"4D",X"4D",X"4D",X"52",X"65",X"7D",X"88",X"90",X"9B", + X"A3",X"AE",X"AE",X"AB",X"AB",X"9E",X"98",X"88",X"70",X"52",X"37",X"1F",X"17",X"1F",X"27",X"3A", + X"5A",X"68",X"78",X"83",X"93",X"A3",X"AB",X"AE",X"A3",X"93",X"88",X"88",X"83",X"88",X"8B",X"88", + X"78",X"62",X"4A",X"42",X"3A",X"42",X"4D",X"55",X"65",X"78",X"83",X"8B",X"93",X"90",X"88",X"88", + X"98",X"A6",X"A6",X"AB",X"9E",X"8B",X"7D",X"68",X"70",X"88",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC", + X"FC",X"FC",X"DC",X"9B",X"4D",X"14",X"01",X"04",X"2F",X"52",X"5D",X"68",X"78",X"80",X"78",X"70", + X"5D",X"47",X"32",X"1F",X"14",X"09",X"11",X"1C",X"32",X"52",X"83",X"B9",X"D1",X"C9",X"AB",X"8B", + X"70",X"68",X"75",X"78",X"80",X"8B",X"8B",X"98",X"AB",X"BE",X"C1",X"AB",X"83",X"5D",X"3A",X"17", + X"11",X"17",X"27",X"3A",X"65",X"90",X"AE",X"B6",X"9B",X"78",X"55",X"4A",X"4D",X"5A",X"5D",X"52", + X"4A",X"4A",X"52",X"78",X"AB",X"D4",X"FC",X"FC",X"F7",X"E9",X"E1",X"D1",X"C9",X"BE",X"AB",X"90", + X"52",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"2F",X"4A",X"52",X"47",X"47",X"62",X"70",X"7D", + X"7D",X"78",X"7D",X"90",X"B3",X"CE",X"EC",X"FC",X"FC",X"FC",X"FC",X"F4",X"E9",X"F4",X"FC",X"FC", + X"FC",X"FC",X"CE",X"98",X"65",X"2C",X"01",X"01",X"01",X"01",X"01",X"32",X"6D",X"7D",X"68",X"4A", + X"27",X"11",X"1C",X"3A",X"4D",X"62",X"68",X"65",X"68",X"70",X"80",X"9B",X"D1",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"A3",X"75",X"55",X"62",X"80",X"A3",X"BE",X"CE",X"C1",X"90",X"4A",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"88",X"C9",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC", + X"B6",X"90",X"68",X"3F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1F",X"83",X"BE",X"D1",X"CE", + X"D4",X"F4",X"FC",X"FC",X"FC",X"F7",X"D1",X"CE",X"DC",X"F7",X"FC",X"FC",X"FC",X"FC",X"D1",X"8B", + X"68",X"68",X"88",X"A6",X"C1",X"D9",X"D4",X"BE",X"A3",X"88",X"75",X"68",X"62",X"5D",X"62",X"68", + X"6D",X"78",X"75",X"55",X"2C",X"11",X"11",X"2F",X"55",X"75",X"83",X"93",X"9E",X"B9",X"E9",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"68",X"32",X"11",X"17",X"32",X"52",X"7D", + X"AE",X"E1",X"F7",X"E1",X"A3",X"62",X"17",X"01",X"01",X"01",X"01",X"01",X"1C",X"4D",X"7D",X"90", + X"9B",X"A6",X"B6",X"BE",X"A6",X"70",X"37",X"14",X"14",X"1C",X"14",X"1C",X"2F",X"3A",X"3A",X"3A", + X"4A",X"52",X"4A",X"47",X"3A",X"24",X"11",X"14",X"27",X"3A",X"65",X"9E",X"D4",X"FC",X"FC",X"F7", + X"D4",X"AB",X"93",X"93",X"93",X"83",X"68",X"4D",X"37",X"37",X"5D",X"9B",X"EC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"CE",X"AB",X"93",X"7D",X"65",X"65",X"75",X"88",X"93",X"98",X"98",X"93", + X"93",X"90",X"93",X"8B",X"90",X"90",X"90",X"8B",X"8B",X"90",X"8B",X"90",X"90",X"90",X"90",X"8B", + X"8B",X"8B",X"8B",X"8B",X"88",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"83",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"78",X"75",X"78",X"75",X"78", + X"78",X"78",X"75",X"78",X"75",X"70",X"75",X"75",X"75",X"75",X"70",X"6D",X"68",X"6D",X"70",X"6D", + X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"70",X"70",X"70",X"75",X"75",X"75",X"75", + X"75",X"70",X"62",X"4D",X"4D",X"4D",X"47",X"4A",X"68",X"98",X"B6",X"B3",X"9B",X"78",X"5A",X"3F", + X"32",X"2F",X"32",X"3F",X"5A",X"90",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"E9",X"90",X"4D",X"3A", + X"47",X"5D",X"5D",X"4D",X"3A",X"27",X"1C",X"14",X"11",X"0C",X"01",X"01",X"01",X"01",X"01",X"01", + X"04",X"4A",X"9E",X"F7",X"FC",X"FC",X"FC",X"FC",X"EC",X"E4",X"E4",X"D1",X"AB",X"80",X"62",X"47", + X"37",X"2F",X"2C",X"24",X"04",X"01",X"24",X"52",X"70",X"70",X"62",X"4D",X"3F",X"37",X"37",X"3A", + X"4D",X"62",X"78",X"93",X"AE",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"B6",X"68", + X"2C",X"01",X"01",X"01",X"01",X"01",X"01",X"09",X"47",X"65",X"68",X"68",X"62",X"5A",X"52",X"4D", + X"52",X"4D",X"52",X"52",X"5A",X"5D",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"65",X"37",X"1C", + X"09",X"09",X"1C",X"32",X"4D",X"70",X"93",X"AB",X"C9",X"D9",X"E9",X"EF",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"F7",X"6D",X"0C",X"01",X"01",X"01",X"01",X"01",X"17",X"62",X"83",X"78", + X"5A",X"37",X"14",X"04",X"01",X"01",X"01",X"01",X"04",X"11",X"1C",X"1C",X"01",X"01",X"0C",X"3F", + X"6D",X"7D",X"78",X"68",X"65",X"83",X"B3",X"E1",X"F4",X"E4",X"C6",X"A3",X"8B",X"75",X"68",X"65", + X"5D",X"62",X"65",X"62",X"5A",X"3F",X"27",X"17",X"1F",X"5A",X"9E",X"CE",X"D4",X"C9",X"AE",X"A6", + X"AE",X"AB",X"9B",X"83",X"80",X"98",X"9B",X"9B",X"9B",X"B6",X"D9",X"E4",X"E1",X"DC",X"E1",X"D4", + X"B3",X"83",X"5A",X"3A",X"1F",X"11",X"0C",X"11",X"14",X"1C",X"1F",X"2C",X"2C",X"1F",X"27",X"32", + X"3F",X"5D",X"83",X"9B",X"93",X"93",X"88",X"7D",X"7D",X"75",X"70",X"70",X"6D",X"68",X"68",X"68", + X"5A",X"5A",X"75",X"88",X"93",X"93",X"90",X"90",X"88",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"80", + X"7D",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80",X"83",X"83",X"80",X"80", + X"80",X"7D",X"7D",X"70",X"70",X"6D",X"75",X"83",X"90",X"93",X"90",X"88",X"88",X"80",X"78",X"7D", + X"70",X"68",X"70",X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"75",X"70",X"68",X"4D",X"3A", + X"4A",X"70",X"93",X"A3",X"B6",X"B9",X"B3",X"A3",X"90",X"80",X"75",X"70",X"68",X"68",X"68",X"65", + X"68",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"75",X"78", + X"78",X"78",X"78",X"78",X"78",X"78",X"70",X"55",X"37",X"1F",X"24",X"47",X"68",X"7D",X"88",X"8B", + X"88",X"88",X"88",X"8B",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"C9",X"AB",X"80",X"5A", + X"4A",X"47",X"37",X"2C",X"32",X"4D",X"70",X"78",X"7D",X"8B",X"90",X"88",X"68",X"4A",X"2C",X"1C", + X"11",X"09",X"01",X"01",X"01",X"01",X"14",X"27",X"47",X"70",X"AE",X"E1",X"F4",X"E4",X"D1",X"AE", + X"93",X"80",X"70",X"68",X"62",X"62",X"65",X"68",X"6D",X"75",X"78",X"78",X"65",X"4A",X"4D",X"5A", + X"62",X"65",X"68",X"88",X"B9",X"EC",X"FC",X"F4",X"D1",X"B6",X"B3",X"AE",X"A3",X"98",X"A3",X"C6", + X"D9",X"D4",X"D4",X"E1",X"E1",X"C9",X"9E",X"78",X"62",X"3F",X"32",X"2C",X"27",X"2C",X"32",X"37", + X"3F",X"47",X"4A",X"52",X"55",X"5A",X"5D",X"5D",X"5A",X"3F",X"27",X"14",X"11",X"14",X"24",X"4A", + X"80",X"A6",X"BE",X"C6",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC",X"BE",X"AB",X"8B", + X"5D",X"2F",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"70",X"6D",X"5D",X"4D", + X"4D",X"68",X"9B",X"BE",X"C9",X"B9",X"B3",X"AB",X"9B",X"A3",X"B3",X"C6",X"D1",X"B6",X"8B",X"52", + X"1C",X"11",X"11",X"14",X"37",X"62",X"90",X"9E",X"9B",X"83",X"75",X"5D",X"47",X"32",X"2F",X"24", + X"17",X"11",X"11",X"17",X"27",X"5D",X"A3",X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"EF",X"CE", + X"9B",X"7D",X"68",X"62",X"62",X"7D",X"98",X"9E",X"93",X"7D",X"6D",X"5D",X"55",X"52",X"52",X"52", + X"55",X"55",X"5D",X"62",X"65",X"68",X"6D",X"70",X"75",X"7D",X"78",X"7D",X"80",X"83",X"78",X"62", + X"3A",X"27",X"14",X"17",X"27",X"3F",X"5A",X"78",X"98",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70",X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32", + X"04",X"01",X"01",X"01",X"01",X"01",X"11",X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78", + X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24",X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93", + X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90",X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E", + X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E",X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B", + X"88",X"75",X"52",X"37",X"1F",X"1C",X"27",X"37",X"4D",X"68",X"83",X"AE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D1",X"9B",X"65",X"42",X"3A",X"52",X"80",X"AE",X"D4",X"E9",X"E4",X"C6", + X"80",X"3A",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"32",X"88",X"C6",X"F7",X"FC", + X"E4",X"CE",X"B9",X"A3",X"80",X"62",X"47",X"37",X"2F",X"2C",X"2F",X"37",X"3F",X"3A",X"32",X"3A", + X"37",X"32",X"37",X"3A",X"52",X"7D",X"B3",X"DC",X"E4",X"E1",X"D1",X"D1",X"E1",X"FC",X"FC",X"FC", + X"FC",X"F4",X"CE",X"A3",X"83",X"75",X"7D",X"83",X"83",X"88",X"98",X"A6",X"A6",X"98",X"88",X"75", + X"68",X"5D",X"5A",X"5A",X"5A",X"62",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"7D",X"83",X"83", + X"80",X"75",X"68",X"70",X"80",X"8B",X"93",X"98",X"98",X"90",X"90",X"8B",X"90",X"98",X"A3",X"AE", + X"B6",X"C9",X"C9",X"C1",X"B3",X"A3",X"98",X"8B",X"78",X"75",X"70",X"6D",X"65",X"68",X"70",X"80", + X"83",X"83",X"88",X"8B",X"83",X"78",X"68",X"5D",X"52",X"42",X"2C",X"27",X"2C",X"3A",X"47",X"42", + X"42",X"52",X"70",X"8B",X"A6",X"AB",X"A3",X"9E",X"9E",X"B3",X"B9",X"B9",X"BE",X"BE",X"B9",X"A3", + X"88",X"68",X"5D",X"5A",X"5A",X"52",X"52",X"68",X"70",X"65",X"62",X"62",X"68",X"7D",X"8B",X"8B", + X"83",X"75",X"65",X"68",X"75",X"80",X"9B",X"C1",X"EC",X"FC",X"FC",X"F7",X"EF",X"E9",X"D1",X"A3", + X"78",X"5D",X"42",X"2C",X"14",X"0C",X"09",X"0C",X"0C",X"17",X"2C",X"47",X"62",X"75",X"75",X"68", + X"62",X"52",X"4A",X"4A",X"42",X"3F",X"4A",X"55",X"68",X"90",X"A3",X"B9",X"C6",X"CE",X"E4",X"FC", + X"FC",X"EC",X"E9",X"E9",X"DC",X"C1",X"B3",X"A6",X"98",X"75",X"52",X"3A",X"2C",X"1C",X"11",X"01", + X"0C",X"1F",X"37",X"52",X"70",X"78",X"78",X"68",X"62",X"62",X"75",X"98",X"B6",X"BE",X"B3",X"AB", + X"A6",X"9B",X"9E",X"AE",X"B9",X"C1",X"AE",X"90",X"5D",X"32",X"2C",X"27",X"2C",X"3F",X"62",X"83", + X"93",X"90",X"88",X"80",X"70",X"5D",X"52",X"47",X"3A",X"2F",X"24",X"1F",X"2C",X"3A",X"68",X"A3", + X"D4",X"F4",X"FC",X"FC",X"F4",X"E9",X"E9",X"DC",X"B9",X"90",X"78",X"68",X"5D",X"62",X"7D",X"93", + X"9B",X"90",X"7D",X"70",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5A",X"5D",X"65",X"68",X"68",X"70", + X"70",X"75",X"78",X"78",X"7D",X"80",X"80",X"78",X"65",X"3F",X"27",X"17",X"1C",X"2C",X"3F",X"5D", + X"78",X"93",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70", + X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32",X"04",X"01",X"01",X"01",X"01",X"01",X"11", + X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78",X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24", + X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93",X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90", + X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E", + X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B",X"88",X"75",X"52",X"37",X"1F",X"1C",X"24", + X"37",X"4D",X"68",X"88",X"AE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"9B",X"65", + X"3F",X"37",X"52",X"80",X"B3",X"D9",X"EC",X"EC",X"C9",X"7D",X"37",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"27",X"88",X"D1",X"FC",X"FC",X"EC",X"D1",X"BE",X"A3",X"7D",X"62",X"3A", + X"2C",X"1F",X"1F",X"24",X"2C",X"32",X"2C",X"27",X"2F",X"27",X"27",X"27",X"2C",X"47",X"7D",X"C1", + X"F7",X"FC",X"FC",X"E9",X"E1",X"EC",X"FC",X"FC",X"FC",X"FC",X"FC",X"E4",X"AE",X"88",X"78",X"83", + X"8B",X"8B",X"93",X"A3",X"B9",X"BE",X"A6",X"90",X"75",X"65",X"52",X"52",X"52",X"4D",X"55",X"5D", + X"62",X"68",X"70",X"70",X"70",X"75",X"80",X"8B",X"90",X"90",X"8B",X"83",X"90",X"98",X"9B",X"9E", + X"9E",X"9B",X"93",X"93",X"8B",X"90",X"8B",X"8B",X"8B",X"88",X"8B",X"8B",X"8B",X"8B",X"88",X"8B", + X"8B",X"8B",X"8B",X"8B",X"8B",X"88",X"8B",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"80",X"80", + X"80",X"7D",X"65",X"47",X"52",X"68",X"78",X"78",X"65",X"5A",X"5D",X"6D",X"75",X"78",X"70",X"68", + X"70",X"90",X"C9",X"EC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A6",X"68",X"42",X"3A",X"37",X"3A",X"5D", + X"7D",X"83",X"68",X"55",X"52",X"47",X"32",X"17",X"09",X"01",X"01",X"09",X"17",X"2C",X"52",X"9B", + X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"DC",X"A6",X"78",X"62",X"47",X"1F",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"3F",X"7D",X"A3",X"9B",X"80",X"5D",X"4A",X"5A",X"7D",X"90",X"9B",X"AB", + X"A6",X"AB",X"AB",X"9E",X"A6",X"BE",X"D4",X"E4",X"D4",X"A6",X"88",X"7D",X"88",X"88",X"83",X"90", + X"A3",X"AB",X"A6",X"9E",X"98",X"8B",X"83",X"80",X"80",X"80",X"83",X"83",X"88",X"8B",X"8B",X"90", + X"90",X"90",X"93",X"98",X"98",X"9B",X"93",X"98",X"93",X"93",X"93",X"93",X"93",X"93",X"90",X"90", + X"90",X"8B",X"8B",X"83",X"80",X"7D",X"68",X"52",X"52",X"62",X"68",X"88",X"AB",X"C6",X"C9",X"C9", + X"B6",X"A6",X"9E",X"8B",X"83",X"8B",X"A3",X"B3",X"AE",X"98",X"80",X"6D",X"5D",X"52",X"47",X"42", + X"47",X"3F",X"47",X"42",X"42",X"4D",X"62",X"65",X"68",X"68",X"68",X"68",X"68",X"68",X"68",X"68", + X"65",X"68",X"68",X"68",X"6D",X"70",X"6D",X"6D",X"70",X"75",X"70",X"75",X"78",X"75",X"78",X"75", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"7D",X"80",X"80",X"6D",X"65",X"70",X"80",X"80",X"68", + X"52",X"32",X"2C",X"37",X"68",X"9B",X"B6",X"B6",X"B6",X"C1",X"D4",X"D9",X"C6",X"A3",X"78",X"5A", + X"3F",X"32",X"32",X"3A",X"55",X"8B",X"CE",X"FC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A3",X"62",X"2F", + X"1C",X"09",X"01",X"01",X"1C",X"47",X"5D",X"68",X"80",X"93",X"90",X"80",X"70",X"5A",X"4D",X"52", + X"68",X"78",X"7D",X"70",X"5D",X"4A",X"3A",X"32",X"32",X"2F",X"27",X"27",X"1C",X"11",X"09",X"0C", + X"14",X"2C",X"42",X"75",X"AB",X"DC",X"F7",X"FC",X"FC",X"F7",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"BE",X"88",X"4D",X"11",X"01",X"01",X"0C",X"3F",X"75",X"9E",X"B6",X"B3", + X"93",X"70",X"52",X"3A",X"1F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"3F", + X"52",X"62",X"68",X"7D",X"9E",X"C1",X"E4",X"FC",X"FC",X"F7",X"E1",X"BE",X"A3",X"90",X"80",X"88", + X"AB",X"E1",X"FC",X"FC",X"FC",X"FC",X"F7",X"BE",X"7D",X"3F",X"0C",X"01",X"01",X"01",X"01",X"27", + X"70",X"B6",X"E9",X"FC",X"FC",X"E9",X"AE",X"83",X"62",X"4D",X"2F",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"3F",X"98",X"CE",X"D1",X"BE",X"B6",X"C1",X"D4",X"E9",X"FC",X"E9",X"C9",X"AB", + X"9B",X"88",X"5D",X"37",X"27",X"27",X"1F",X"1C",X"1C",X"1F",X"37",X"70",X"B6",X"FC",X"FC",X"FC", + X"FC",X"FC",X"F4",X"F4",X"E4",X"C6",X"98",X"70",X"5A",X"3A",X"37",X"47",X"6D",X"AE",X"F7",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"93",X"55",X"17",X"01",X"01",X"01",X"1C",X"4A",X"80",X"AB", + X"B3",X"A6",X"A3",X"A3",X"A3",X"A6",X"9B",X"78",X"42",X"11",X"04",X"11",X"1C",X"1F",X"37",X"55", + X"7D",X"8B",X"80",X"5D",X"47",X"4D",X"65",X"6D",X"5D",X"4A",X"3F",X"4D",X"7D",X"B6",X"EC",X"FC", + X"FC",X"FC",X"E4",X"C6",X"9E",X"98",X"9B",X"90",X"75",X"5D",X"62",X"7D",X"9B",X"C6",X"E1",X"E9", + X"D9",X"B3",X"93",X"83",X"70",X"68",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5D",X"65",X"65",X"68", + X"5A",X"37",X"2F",X"4A",X"65",X"6D",X"68",X"75",X"93",X"BE",X"E4",X"EC",X"D1",X"B3",X"9E",X"AB", + X"AB",X"9E",X"80",X"65",X"42",X"32",X"32",X"4A",X"75",X"90",X"A3",X"BE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"D1",X"93",X"5A",X"3A",X"3A",X"47",X"5A",X"7D",X"A6",X"CE",X"CE",X"B9",X"A6",X"9B",X"80", + X"52",X"1C",X"01",X"01",X"01",X"11",X"47",X"78",X"9E",X"AB",X"9B",X"78",X"5A",X"2C",X"14",X"1C", + X"27",X"1F",X"11",X"01",X"01",X"01",X"1C",X"3F",X"75",X"AB",X"C9",X"D4",X"DC",X"CE",X"C9",X"D1", + X"E1",X"F4",X"FC",X"FC",X"FC",X"E4",X"BE",X"90",X"70",X"4A",X"11",X"01",X"01",X"01",X"01",X"09", + X"17",X"4A",X"90",X"D4",X"FC",X"FC",X"FC",X"F4",X"E9",X"E9",X"FC",X"FC",X"E4",X"B3",X"80",X"52", + X"2F",X"1C",X"1F",X"32",X"68",X"AE",X"F4",X"FC",X"FC",X"FC",X"E4",X"C9",X"AB",X"80",X"5D",X"47", + X"37",X"42",X"75",X"AB",X"DC",X"FC",X"FC",X"FC",X"D9",X"93",X"55",X"37",X"2F",X"3A",X"52",X"62", + X"68",X"68",X"55",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1C",X"32",X"4D",X"68", + X"9B",X"CE",X"E4",X"F4",X"EC",X"E4",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9", + X"88",X"4A",X"17",X"04",X"11",X"42",X"75",X"88",X"9B",X"B6",X"BE",X"A6",X"7D",X"4D",X"1C",X"01", + X"01",X"17",X"27",X"32",X"4D",X"7D",X"A6",X"B3",X"B9",X"C6",X"D1",X"D9",X"D9",X"CE",X"BE",X"A6", + X"90",X"65",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"14",X"68",X"93",X"98",X"83",X"75",X"7D", + X"9E",X"BE",X"C9",X"BE",X"A6",X"9E",X"B6",X"D9",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9",X"C1", + X"B3",X"9B",X"75",X"5D",X"47",X"2F",X"2F",X"4A",X"68",X"7D",X"7D",X"78",X"83",X"90",X"9E",X"AE", + X"A3",X"83",X"75",X"52",X"3F",X"4A",X"5D",X"62",X"55",X"3F",X"2F",X"24",X"32",X"5A",X"7D",X"90", + X"AB",X"CE",X"E4",X"FC",X"FC",X"FC",X"E9",X"CE",X"B3",X"98",X"88",X"83",X"83",X"90",X"B3",X"EC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"75",X"42",X"27",X"14",X"01",X"01",X"1C",X"3F",X"52",X"5A", + X"68",X"78",X"68",X"47",X"17",X"01",X"01",X"09",X"27",X"37",X"4A",X"65",X"75",X"6D",X"65",X"68", + X"68",X"5D",X"4D",X"42",X"27",X"0C",X"0C",X"14",X"1C",X"1F",X"3A",X"68",X"9E",X"CE",X"E1",X"DC", + X"DC",X"DC",X"DC",X"CE",X"A6",X"75",X"5A",X"4A",X"3A",X"4A",X"70",X"98",X"BE",X"E1",X"E9",X"E4", + X"B9",X"9E",X"90",X"8B",X"88",X"75",X"52",X"2F",X"2F",X"4A",X"5D",X"68",X"78",X"80",X"70",X"70", + X"7D",X"8B",X"9E",X"B6",X"BE",X"B6",X"AE",X"9B",X"98",X"AE",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"B9",X"9E",X"88",X"65",X"4D",X"47",X"3F",X"2F",X"11",X"01",X"04", + X"1F",X"2F",X"2F",X"1F",X"11",X"01",X"0C",X"2C",X"4D",X"62",X"78",X"98",X"AB",X"BE",X"DC",X"F4", + X"F7",X"E4",X"E1",X"DC",X"C1",X"9E",X"88",X"62",X"3A",X"14",X"01",X"11",X"17",X"27",X"32",X"55", + X"88",X"B6",X"E4",X"F7",X"E4",X"C6",X"A3",X"75",X"5A",X"52",X"5A",X"68",X"78",X"80",X"80",X"5A", + X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"3F",X"70",X"A3",X"C9",X"E1",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"C6",X"B3",X"98",X"93",X"9B",X"AB",X"B9",X"AB",X"98",X"83",X"68",X"52", + X"4A",X"2F",X"17",X"04",X"01",X"0C",X"37",X"75",X"A3",X"B9",X"D1",X"CE",X"B3",X"A3",X"9B",X"93", + X"93",X"A6",X"BE",X"B9",X"9E",X"7D",X"55",X"37",X"27",X"27",X"4A",X"80",X"A6",X"B3",X"AE",X"AB", + X"B9",X"C6",X"B9",X"B3",X"A3",X"80",X"5D",X"4A",X"47",X"3A",X"32",X"3A",X"5A",X"7D",X"83",X"90", + X"8B",X"83",X"7D",X"70",X"65",X"6D",X"7D",X"78",X"65",X"47",X"1F",X"0C",X"01",X"01",X"09",X"2C", + X"68",X"AE",X"CE",X"D1",X"CE",X"D4",X"E4",X"E4",X"CE",X"A6",X"98",X"9B",X"AB",X"BE",X"CE",X"CE", + X"B9",X"90",X"52",X"14",X"01",X"01",X"01",X"01",X"09",X"3A",X"78",X"9E",X"AE",X"B9",X"CE",X"CE", + X"B9",X"A6",X"90",X"7D",X"7D",X"83",X"80",X"68",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75", + X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6",X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4", + X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A",X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC", + X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52",X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B", + X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9",X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01", + X"01",X"01",X"01",X"01",X"01",X"24",X"47",X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4", + X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3",X"9B",X"98",X"98",X"90",X"83",X"88",X"A6",X"C9",X"DC", + X"D9",X"BE",X"AB",X"7D",X"52",X"2F",X"27",X"1F",X"11",X"17",X"27",X"2F",X"2F",X"3F",X"52",X"5D", + X"5A",X"65",X"70",X"75",X"80",X"88",X"8B",X"9B",X"AB",X"BE",X"C6",X"AE",X"83",X"55",X"27",X"09", + X"09",X"27",X"52",X"83",X"93",X"98",X"93",X"88",X"83",X"80",X"70",X"55",X"3F",X"2C",X"27",X"32", + X"47",X"65",X"8B",X"AE",X"D4",X"E9",X"D9",X"B3",X"98",X"90",X"93",X"88",X"68",X"4D",X"4A",X"5A", + X"68",X"6D",X"7D",X"8B",X"90",X"8B",X"88",X"8B",X"98",X"9E",X"9B",X"83",X"62",X"2F",X"09",X"04", + X"1F",X"47",X"6D",X"98",X"AE",X"B6",X"B3",X"AB",X"9B",X"9B",X"A3",X"B6",X"C6",X"B9",X"9B",X"83", + X"78",X"6D",X"65",X"5A",X"5A",X"68",X"88",X"A6",X"B6",X"A3",X"8B",X"75",X"68",X"6D",X"6D",X"65", + X"5D",X"5D",X"68",X"80",X"A3",X"CE",X"DC",X"D4",X"CE",X"CE",X"C9",X"C6",X"CE",X"BE",X"AB",X"90", + X"80",X"80",X"8B",X"98",X"9E",X"B6",X"DC",X"E4",X"E4",X"E1",X"CE",X"C6",X"B6",X"98",X"80",X"7D", + X"75",X"70",X"68",X"68",X"62",X"3F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"11",X"47",X"68",X"90",X"B6",X"CE",X"D4",X"E1",X"E9",X"E9",X"E4",X"E4",X"E9",X"E4",X"D4",X"C6", + X"A6",X"78",X"42",X"14",X"01",X"01",X"01",X"01",X"14",X"42",X"78",X"AB",X"D1",X"E1",X"D9",X"C6", + X"9B",X"7D",X"75",X"78",X"88",X"93",X"8B",X"88",X"70",X"4D",X"2F",X"24",X"1C",X"24",X"27",X"24", + X"27",X"3A",X"62",X"88",X"B3",X"CE",X"DC",X"EC",X"EF",X"E1",X"CE",X"BE",X"A3",X"83",X"68",X"52", + X"4D",X"55",X"65",X"78",X"78",X"80",X"90",X"90",X"90",X"8B",X"75",X"5D",X"4D",X"52",X"62",X"80", + X"A3",X"B6",X"B6",X"B6",X"A6",X"90",X"83",X"88",X"93",X"9E",X"BE",X"D1",X"C9",X"AE",X"8B",X"62", + X"3F",X"27",X"1C",X"32",X"62",X"88",X"9B",X"A3",X"AB",X"C1",X"CE",X"C1",X"B6",X"A6",X"90",X"6D", + X"5D",X"55",X"3F",X"2F",X"2F",X"47",X"5D",X"65",X"6D",X"75",X"78",X"83",X"7D",X"75",X"7D",X"83", + X"80",X"68",X"4D",X"2F",X"14",X"04",X"04",X"17",X"37",X"70",X"A6",X"C1",X"C1",X"B9",X"BE",X"D1", + X"D4",X"C1",X"A3",X"98",X"9E",X"AE",X"C9",X"D4",X"D4",X"C6",X"98",X"5D",X"24",X"01",X"01",X"01", + X"01",X"17",X"4A",X"7D",X"A3",X"AE",X"B9",X"C9",X"C6",X"B6",X"A3",X"8B",X"7D",X"80",X"83",X"83", + X"6D",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75",X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6", + X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4",X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A", + X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC",X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52", + X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B",X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9", + X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"47", + X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4",X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3", + X"9B",X"98",X"98",X"8B",X"83",X"8B",X"A6",X"C9",X"E1",X"DC",X"C1",X"A6",X"7D",X"4D",X"2C",X"24", + X"17",X"0C",X"11",X"1F",X"2C",X"2C",X"3A",X"52",X"5D",X"5A",X"65",X"70",X"78",X"88",X"90",X"90", + X"9E",X"AB",X"C1",X"C6",X"A6",X"78",X"3F",X"11",X"01",X"01",X"14",X"47",X"80",X"93",X"98",X"93", + X"83",X"70",X"65",X"4D",X"2F",X"14",X"04",X"04",X"27",X"47",X"70",X"A3",X"D1",X"FC",X"FC",X"F7", + X"C9",X"A6",X"9B",X"9B",X"8B",X"70",X"5A",X"5D",X"75",X"7D",X"80",X"8B",X"9E",X"9B",X"93",X"8B", + X"98",X"A3",X"AE",X"AE",X"93",X"68",X"32",X"04",X"04",X"24",X"52",X"88",X"B6",X"C9",X"B9",X"AB", + X"98",X"80",X"80",X"90",X"A6",X"B9",X"BE",X"A6",X"93",X"8B",X"80",X"70",X"4D",X"37",X"3F",X"62", + X"88",X"9E",X"98",X"80",X"65",X"55",X"62",X"68",X"68",X"70",X"75",X"78",X"93",X"C6",X"FC",X"FC", + X"FC",X"FC",X"F7",X"E9",X"DC",X"D4",X"BE",X"A3",X"80",X"68",X"70",X"75",X"75",X"70",X"80",X"A3", + X"B3",X"B3",X"AE",X"98",X"83",X"75",X"5D",X"52",X"5A",X"68",X"78",X"83",X"83",X"78",X"4A",X"11", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"78",X"A6",X"D1",X"E9",X"E4", + X"E1",X"E1",X"DC",X"D9",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"B9",X"75",X"2F",X"01",X"01",X"01", + X"01",X"01",X"01",X"27",X"5D",X"9B",X"D4",X"F4",X"EC",X"CE",X"A6",X"93",X"9E",X"B6",X"B6",X"A3", + X"93",X"8B",X"83",X"70",X"68",X"78",X"93",X"A6",X"9E",X"90",X"83",X"98",X"AE",X"C9",X"D4",X"DC", + X"CE",X"A6",X"7D",X"65",X"52",X"2C",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"4D",X"9E", + X"E4",X"FC",X"FC",X"FC",X"EC",X"EC",X"FC",X"FC",X"FC",X"FC",X"E9",X"AE",X"78",X"4A",X"2F",X"2F", + X"52",X"8B",X"C6",X"F4",X"FC",X"F7",X"DC",X"B3",X"80",X"4D",X"17",X"01",X"01",X"01",X"1C",X"3F", + X"70",X"A6",X"D1",X"E9",X"E1",X"CE",X"B9",X"B3",X"AE",X"A6",X"88",X"5A",X"1F",X"01",X"01",X"01", + X"01",X"01",X"14",X"52",X"8B",X"B9",X"C6",X"B6",X"A6",X"9E",X"90",X"75",X"68",X"52",X"4A",X"52", + X"68",X"88",X"93",X"83",X"62",X"3F",X"1F",X"17",X"2F",X"4D",X"68",X"75",X"83",X"9E",X"D1",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D4",X"BE",X"B3",X"A3",X"A6",X"BE",X"D4",X"E1",X"CE",X"B3",X"A6",X"98", + X"75",X"4A",X"27",X"1C",X"2F",X"4D",X"68",X"7D",X"68",X"47",X"17",X"01",X"01",X"01",X"01",X"01", + X"04",X"0C",X"1F",X"32",X"4A",X"5D",X"80",X"B3",X"F7",X"FC",X"FC",X"FC",X"EC",X"D4",X"CE",X"BE", + X"C1",X"CE",X"D9",X"C9",X"A3",X"83",X"70",X"5A",X"3F",X"32",X"3F",X"5D",X"68",X"65",X"47",X"2C", + X"17",X"04",X"09",X"27",X"4A",X"68",X"90",X"9E",X"98",X"88",X"7D",X"83",X"9E",X"CE",X"E9",X"F7", + X"E4",X"BE",X"9E",X"68",X"37",X"09",X"01",X"01",X"01",X"04",X"14",X"37",X"55",X"65",X"70",X"88", + X"AE",X"DC",X"FC",X"F4",X"D1",X"AE",X"93",X"80",X"78",X"83",X"9B",X"B3",X"B3",X"98",X"70",X"47", + X"24",X"17",X"32",X"62",X"9B",X"C9",X"CE",X"B9",X"A3",X"9B",X"88",X"70",X"5D",X"55",X"68",X"93", + X"B6",X"BE",X"B3",X"AE",X"AE",X"A3",X"90",X"90",X"98",X"9B",X"AB",X"AB",X"AE",X"B3",X"AB",X"93", + X"78",X"65",X"68",X"78",X"75",X"70",X"68",X"78",X"8B",X"93",X"93",X"9E",X"B9",X"DC",X"FC",X"FC", + X"FC",X"D4",X"93",X"62",X"42",X"1C",X"01",X"01",X"04",X"0C",X"0C",X"1F",X"4A",X"78",X"AB",X"C9", + X"DC",X"E1",X"D9",X"C6",X"AB",X"90",X"70",X"47",X"09",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"1C",X"47",X"62",X"75",X"88",X"AB",X"D1",X"E9",X"EC",X"E9",X"E4",X"DC",X"F7",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"9E",X"80",X"75",X"7D",X"70",X"6D",X"75",X"80",X"8B",X"80",X"65", + X"4A",X"2C",X"04",X"01",X"01",X"01",X"04",X"2C",X"52",X"62",X"5A",X"4D",X"5A",X"78",X"9B",X"B3", + X"C1",X"AB",X"93",X"83",X"78",X"62",X"4D",X"4A",X"52",X"4A",X"3F",X"4D",X"5D",X"7D",X"90",X"9B", + X"9E",X"83",X"68",X"62",X"5D",X"68",X"78",X"88",X"88",X"8B",X"8B",X"80",X"62",X"47",X"3F",X"3A", + X"32",X"37",X"37",X"37",X"4D",X"70",X"88",X"8B",X"80",X"70",X"70",X"8B",X"B6",X"D4",X"D4",X"CE", + X"B9",X"B9",X"C9",X"C9",X"C6",X"B6",X"B9",X"D4",X"FC",X"FC",X"FC",X"FC",X"EC",X"B6",X"80",X"52", + X"37",X"2F",X"2C",X"37",X"62",X"98",X"D1",X"FC",X"FC",X"EC",X"D1",X"A3",X"68",X"4A",X"32",X"27", + X"27",X"3A",X"55",X"68",X"62",X"52",X"3F",X"1C",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"37", + X"5A",X"70",X"88",X"88",X"7D",X"65",X"52",X"47",X"52",X"68",X"83",X"9E",X"AE",X"B6",X"C1",X"B9", + X"B6",X"AE",X"98",X"78",X"5D",X"42",X"32",X"2C",X"2F",X"4D",X"7D",X"B9",X"F7",X"FC",X"FC",X"FC", + X"E1",X"AB",X"83",X"65",X"52",X"5A",X"68",X"65",X"52",X"3F",X"3F",X"3F",X"37",X"37",X"52",X"7D", + X"A6",X"C1",X"BE",X"9E",X"88",X"7D",X"68",X"5A",X"47",X"47",X"62",X"90",X"B3",X"C6",X"D9",X"EF", + X"FC",X"FC",X"E4",X"CE",X"B9",X"B3",X"B3",X"AE",X"AB",X"9B",X"75",X"55",X"37",X"11",X"01",X"01", + X"01",X"01",X"04",X"4D",X"88",X"AB",X"B3",X"AE",X"A3",X"9B",X"AE",X"C6",X"CE",X"C9",X"BE",X"B6", + X"B3",X"AB",X"AE",X"C6",X"EF",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"88",X"4A",X"14",X"01", + X"09",X"2C",X"52",X"78",X"93",X"93",X"78",X"47",X"0C",X"01",X"01",X"01",X"01",X"09",X"09",X"11", + X"27",X"4D",X"62",X"68",X"7D",X"90",X"9E",X"AE",X"AB",X"8B",X"70",X"62",X"52",X"3A",X"1C",X"04", + X"11",X"2F",X"5A",X"83",X"9E",X"B3",X"B9",X"B9",X"AB",X"80",X"62",X"4D",X"4D",X"5A",X"65",X"75", + X"7D",X"83",X"83",X"70",X"4D",X"1F",X"0C",X"14",X"32",X"5D",X"70",X"68",X"65",X"68",X"83",X"9E", + X"9E",X"93",X"88",X"83",X"9B",X"BE",X"D9",X"E1",X"D1",X"B6",X"A3",X"93",X"88",X"88",X"8B",X"98", + X"A3",X"C6",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"D4",X"B3",X"88",X"65",X"4A",X"32",X"3A",X"5D", + X"88",X"B3",X"D4",X"E4",X"E1",X"B9",X"78",X"37",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"14",X"37",X"42",X"4A",X"5A",X"68",X"78",X"90",X"AE",X"C9",X"E1",X"E1", + X"C9",X"93",X"65",X"4D",X"32",X"1F",X"17",X"27",X"37",X"3F",X"42",X"4D",X"68",X"88",X"98",X"A3", + X"B6",X"C9",X"D4",X"E4",X"E4",X"D4",X"BE",X"A6",X"AE",X"C6",X"E4",X"FC",X"FC",X"FC",X"E4",X"AB", + X"6D",X"3F",X"27",X"2F",X"52",X"83",X"AB",X"AB",X"AE",X"AE",X"AE",X"98",X"70",X"5A",X"5A",X"65", + X"7D",X"88",X"80",X"5D",X"3A",X"24",X"11",X"11",X"2F",X"52",X"75",X"83",X"93",X"A3",X"C9",X"EF", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"98",X"5A",X"1F",X"01",X"01",X"01",X"11",X"2F", + X"5D",X"90",X"BE",X"E4",X"FC",X"FC",X"D9",X"A3",X"78",X"65",X"68",X"75",X"70",X"65",X"5A",X"4A", + X"2C",X"14",X"04",X"11",X"37",X"68",X"9B",X"A6",X"9B",X"88",X"83",X"90",X"93",X"90",X"8B",X"83", + X"7D",X"83",X"93",X"A6",X"B6",X"BE",X"B9",X"9E",X"68",X"42",X"2C",X"2F",X"47",X"5D",X"78",X"88", + X"90",X"93",X"90",X"70",X"52",X"37",X"17",X"11",X"17",X"2C",X"37",X"3F",X"4D",X"4A",X"3F",X"32", + X"2F",X"37",X"5A",X"7D",X"9B",X"9E",X"A6",X"AE",X"B6",X"D4",X"FC",X"FC",X"FC",X"FC",X"FC",X"EC", + X"E1",X"B9",X"93",X"6D",X"5A",X"5A",X"5D",X"68",X"75",X"78",X"83",X"83",X"83",X"83",X"70",X"5D", + X"4A",X"4D",X"62",X"7D",X"90",X"98",X"88",X"62",X"2F",X"01",X"01",X"01",X"01",X"1C",X"37",X"52", + X"65",X"68",X"5A",X"52",X"5D",X"75",X"7D",X"75",X"5D",X"4A",X"4D",X"65",X"88",X"AB",X"C6",X"D9", + X"D4",X"B6",X"93",X"83",X"70",X"5A",X"47",X"47",X"4A",X"3F",X"3A",X"3F",X"32",X"27",X"17",X"1F", + X"3F",X"68",X"93",X"9E",X"9B",X"93",X"98",X"A6",X"AB",X"AB",X"A3",X"A6",X"BE",X"E1",X"F7",X"FC", + X"FC",X"EC",X"D1",X"AE",X"93",X"8B",X"9B",X"B3",X"B6",X"B6",X"C6",X"C6",X"B6",X"A6",X"9E",X"93", + X"7D",X"5D",X"37",X"1C",X"1F",X"27",X"2C",X"37",X"52",X"75",X"93",X"98",X"8B",X"7D",X"65",X"5D", + X"65",X"75",X"88",X"9B",X"9E",X"9B",X"8B",X"80",X"83",X"8B",X"8B",X"83",X"93",X"AB",X"C9",X"DC", + X"CE",X"B9",X"A6",X"83",X"5D",X"32",X"17",X"01",X"01",X"04",X"1C",X"4A",X"80",X"B6",X"DC",X"E1", + X"D4",X"BE",X"A6",X"98",X"90",X"88",X"6D",X"4D",X"2C",X"11",X"04",X"04",X"1C",X"4D",X"83",X"B6", + X"DC",X"E4",X"D1",X"C1",X"B3",X"9B",X"80",X"68",X"68",X"68",X"75",X"7D",X"7D",X"70",X"52",X"2C", + X"04",X"01",X"01",X"01",X"11",X"2F",X"47",X"5D",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC", + X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E",X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E", + X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52",X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01", + X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3",X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB", + X"93",X"78",X"65",X"62",X"68",X"70",X"80",X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70", + X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3",X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88", + X"7D",X"62",X"47",X"2F",X"11",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"78",X"93",X"9B", + X"9E",X"93",X"98",X"9B",X"98",X"A3",X"A6",X"AB",X"B3",X"C1",X"D1",X"CE",X"BE",X"AE",X"98",X"7D", + X"75",X"65",X"52",X"4A",X"3F",X"3A",X"3F",X"52",X"68",X"80",X"93",X"AB",X"B6",X"C9",X"E1",X"E4", + X"D4",X"CE",X"CE",X"C9",X"BE",X"9E",X"7D",X"5A",X"37",X"27",X"1C",X"1F",X"37",X"5A",X"75",X"80", + X"8B",X"93",X"90",X"8B",X"88",X"88",X"80",X"80",X"83",X"80",X"88",X"A3",X"C6",X"E1",X"FC",X"FC", + X"F4",X"CE",X"A3",X"80",X"65",X"4A",X"37",X"37",X"3F",X"47",X"52",X"62",X"70",X"7D",X"70",X"62", + X"52",X"55",X"68",X"78",X"80",X"75",X"65",X"65",X"5D",X"55",X"5A",X"5A",X"65",X"80",X"98",X"A3", + X"9B",X"8B",X"7D",X"80",X"88",X"90",X"98",X"9B",X"93",X"93",X"9E",X"AE",X"B9",X"B6",X"AE",X"AE", + X"A6",X"93",X"78",X"65",X"52",X"4D",X"4A",X"52",X"68",X"78",X"88",X"93",X"90",X"83",X"80",X"6D", + X"5D",X"5D",X"62",X"68",X"6D",X"6D",X"5D",X"4A",X"37",X"2F",X"32",X"52",X"75",X"93",X"A6",X"AE", + X"AB",X"AE",X"B6",X"C6",X"BE",X"C1",X"B9",X"A6",X"98",X"8B",X"70",X"52",X"3A",X"2C",X"37",X"42", + X"5A",X"68",X"70",X"78",X"7D",X"88",X"93",X"98",X"90",X"7D",X"7D",X"88",X"90",X"98",X"93",X"7D", + X"52",X"2C",X"09",X"01",X"01",X"09",X"32",X"52",X"70",X"88",X"9B",X"93",X"90",X"93",X"98",X"90", + X"83",X"70",X"65",X"62",X"78",X"93",X"AE",X"BE",X"C6",X"B9",X"9E",X"83",X"70",X"65",X"5D",X"5A", + X"5A",X"5D",X"5A",X"55",X"55",X"47",X"37",X"27",X"1F",X"37",X"5A",X"78",X"88",X"8B",X"8B",X"93", + X"A3",X"A6",X"AB",X"A6",X"AB",X"BE",X"D4",X"E4",X"EC",X"EC",X"E1",X"C9",X"A6",X"90",X"83",X"90", + X"98",X"9B",X"9E",X"AE",X"AB",X"A6",X"9E",X"9B",X"9B",X"90",X"78",X"5A",X"3F",X"37",X"37",X"37", + X"3F",X"52",X"68",X"88",X"83",X"78",X"68",X"5A",X"55",X"65",X"78",X"8B",X"9E",X"A3",X"9B",X"90", + X"83",X"88",X"8B",X"88",X"80",X"8B",X"9E",X"B9",X"C9",X"B9",X"A6",X"93",X"75",X"52",X"32",X"1C", + X"11",X"0C",X"14",X"2C",X"5A",X"8B",X"BE",X"DC",X"E1",X"D9",X"C6",X"AE",X"9E",X"98",X"8B",X"75", + X"55",X"32",X"1C",X"11",X"11",X"24",X"52",X"88",X"B6",X"D9",X"E4",X"CE",X"BE",X"AE",X"98",X"7D", + X"68",X"65",X"68",X"75",X"78",X"7D",X"70",X"52",X"2F",X"09",X"01",X"01",X"01",X"11",X"2F",X"47", + X"5A",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC",X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E", + X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E",X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52", + X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01",X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3", + X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB",X"93",X"78",X"65",X"62",X"68",X"70",X"80", + X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70",X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3", + X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88",X"7D",X"62",X"47",X"2C",X"0C",X"01",X"01", + X"01",X"01",X"01",X"14",X"3A",X"65",X"7D",X"98",X"A3",X"A3",X"98",X"9B",X"9E",X"9E",X"A6",X"AB", + X"AB",X"B6",X"C6",X"D4",X"CE",X"BE",X"AB",X"90",X"78",X"68",X"5A",X"47",X"32",X"27",X"1F",X"24", + X"3A",X"62",X"80",X"9E",X"B9",X"CE",X"D4",X"E9",X"EC",X"E1",X"D1",X"D1",X"CE",X"C6",X"A6",X"80", + X"55",X"2F",X"17",X"04",X"11",X"2F",X"62",X"83",X"9B",X"A6",X"AB",X"9B",X"90",X"8B",X"88",X"78", + X"70",X"65",X"5A",X"65",X"88",X"A6",X"CE",X"EF",X"FC",X"FC",X"E1",X"B6",X"9E",X"88",X"68",X"52", + X"4A",X"47",X"3F",X"37",X"3A",X"47",X"47",X"3A",X"2F",X"2F",X"4A",X"68",X"80",X"83",X"75",X"65", + X"65",X"65",X"68",X"75",X"7D",X"88",X"9E",X"AB",X"AB",X"98",X"80",X"78",X"7D",X"80",X"8B",X"9E", + X"9E",X"9B",X"9E",X"AE",X"BE",X"C1",X"B3",X"A6",X"A3",X"A6",X"AB",X"9B",X"83",X"68",X"52",X"42", + X"3F",X"52",X"68",X"80",X"93",X"A3",X"A6",X"B3",X"A6",X"93",X"88",X"88",X"93",X"90",X"83",X"68", + X"4D",X"37",X"2C",X"2F",X"47",X"68",X"90",X"AB",X"AE",X"A6",X"A6",X"9B",X"88",X"75",X"68",X"62", + X"52",X"42",X"32",X"27",X"11",X"01",X"01",X"11",X"27",X"3F",X"5A",X"65",X"68",X"78",X"8B",X"A6", + X"C1",X"C6",X"B9",X"B3",X"B3",X"AB",X"A3",X"8B",X"68",X"42",X"24",X"11",X"11",X"11",X"27",X"4D", + X"70",X"98",X"B9",X"DC",X"E9",X"E9",X"E1",X"CE",X"AB",X"98",X"90",X"83",X"83",X"93",X"A3",X"B6", + X"AE",X"A3",X"90",X"78",X"5D",X"4A",X"4D",X"62",X"78",X"83",X"80",X"80",X"83",X"7D",X"68",X"52", + X"37",X"1F",X"1F",X"2F",X"47",X"55",X"65",X"7D",X"90",X"93",X"98",X"A3",X"AE",X"B3",X"B9",X"B6", + X"B6",X"C1",X"C6",X"B9",X"A6",X"8B",X"80",X"70",X"65",X"52",X"4A",X"52",X"62",X"65",X"68",X"7D", + X"90",X"AB",X"C6",X"D1",X"CE",X"AE",X"88",X"68",X"65",X"62",X"52",X"52",X"4D",X"3F",X"2F",X"27", + X"27",X"3A",X"62",X"83",X"9E",X"B3",X"A6",X"9E",X"93",X"90",X"8B",X"7D",X"68",X"62",X"65",X"65", + X"65",X"55",X"3F",X"27",X"14",X"11",X"14",X"1C",X"2F",X"4A",X"62",X"78",X"98",X"B6",X"D1",X"E4", + X"E4",X"E1",X"E4",X"F7",X"FC",X"F7",X"E4",X"D1",X"BE",X"AB",X"98",X"83",X"8B",X"98",X"93",X"90", + X"93",X"90",X"83",X"78",X"70",X"6D",X"62",X"4A",X"2C",X"17",X"14",X"1C",X"27",X"3F",X"4D",X"5D", + X"68",X"68",X"68",X"68",X"75",X"8B",X"9E",X"A6",X"9E",X"9B",X"98",X"98",X"93",X"80",X"70",X"62", + X"52",X"4A",X"42",X"3A",X"2F",X"27",X"2C",X"2F",X"3F",X"5D",X"80",X"90",X"9B",X"A3",X"AE",X"C9", + X"E1",X"E4",X"DC",X"CE",X"C9",X"CE",X"C6",X"B3",X"98",X"8B",X"83",X"75",X"68",X"6D",X"7D",X"90", + X"A3",X"B3",X"B9",X"AE",X"98",X"7D",X"70",X"62",X"4A",X"2F",X"17",X"11",X"17",X"24",X"37",X"52", + X"62",X"75",X"80",X"80",X"80",X"88",X"8B",X"8B",X"98",X"9B",X"9E",X"AB",X"B6",X"AE",X"A3",X"90", + X"83",X"80",X"7D",X"83",X"90",X"90",X"88",X"75",X"62",X"52",X"47",X"42",X"4A",X"5D",X"75",X"8B", + X"A3",X"AB",X"AB",X"A3",X"93",X"98",X"9E",X"AE",X"BE",X"BE",X"AB",X"88",X"68",X"52",X"3A",X"37", + X"47",X"62",X"83",X"98",X"A3",X"9B",X"98",X"98",X"88",X"68",X"52",X"4D",X"52",X"62",X"65",X"62", + X"62",X"5D",X"4A",X"37",X"27",X"2C",X"3F",X"5D",X"6D",X"75",X"75",X"80",X"90",X"A3",X"B3",X"BE", + X"C6",X"C1",X"B9",X"AB",X"9E",X"83",X"68",X"52",X"3F",X"27",X"11",X"0C",X"11",X"1C",X"3F",X"68", + X"9B",X"B6",X"BE",X"B6",X"B3",X"B6",X"BE",X"C9",X"C6",X"AE",X"9B",X"8B",X"80",X"7D",X"83",X"93", + X"A3",X"AE",X"A3",X"9E",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"7D",X"68",X"62",X"5D",X"62",X"5D", + X"52",X"4D",X"5A",X"52",X"52",X"52",X"52",X"52",X"5A",X"5A",X"5A",X"62",X"68",X"78",X"88",X"90", + X"98",X"A6",X"B6",X"B9",X"B6",X"B3",X"B6",X"B9",X"B9",X"B6",X"AE",X"AB",X"93",X"78",X"65",X"4D", + X"32",X"24",X"24",X"32",X"52",X"70",X"83",X"88",X"83",X"7D",X"70",X"65",X"68",X"6D",X"6D",X"6D", + X"68",X"65",X"68",X"68",X"65",X"5D",X"55",X"5D",X"70",X"8B",X"90",X"93",X"8B",X"80",X"7D",X"7D", + X"8B",X"9E",X"A6",X"A3",X"9E",X"9E",X"A3",X"A3",X"98",X"88",X"80",X"75",X"68",X"62",X"55",X"4D", + X"4A",X"4D",X"5D",X"75",X"93",X"AE",X"B6",X"AB",X"93",X"78",X"65",X"52",X"5A",X"5D",X"65",X"78", + X"88",X"88",X"80",X"75",X"70",X"68",X"5D",X"5A",X"5D",X"62",X"68",X"70",X"75",X"78",X"7D",X"7D", + X"80",X"78",X"70",X"65",X"5D",X"52",X"5A",X"70",X"8B",X"A3",X"AE",X"AE",X"A6",X"9B",X"90",X"83", + X"75",X"68",X"55",X"4D",X"4A",X"4A",X"4D",X"5A",X"78",X"93",X"B9",X"D4",X"E4",X"E1",X"CE",X"BE", + X"AE",X"9B",X"88",X"78",X"78",X"78",X"78",X"68",X"62",X"55",X"4D",X"3A",X"32",X"3A",X"4D",X"68", + X"7D",X"80",X"7D",X"78",X"75",X"7D",X"88",X"98",X"A3",X"AE",X"AE",X"AB",X"AE",X"B6",X"C6",X"D1", + X"D4",X"D4",X"C6",X"AB",X"98",X"83",X"78",X"65",X"4D",X"3F",X"3F",X"3F",X"4A",X"5A",X"68",X"70", + X"68",X"68",X"70",X"80",X"8B",X"93",X"8B",X"7D",X"70",X"6D",X"68",X"70",X"75",X"75",X"78",X"78", + X"75",X"68",X"65",X"62",X"6D",X"83",X"98",X"AE",X"B6",X"A6",X"98",X"90",X"80",X"75",X"68",X"5D", + X"62",X"68",X"80",X"93",X"9B",X"93",X"90",X"80",X"6D",X"5A",X"4A",X"42",X"47",X"52",X"5D",X"6D", + X"83",X"90",X"90",X"83",X"80",X"80",X"75",X"75",X"70",X"68",X"65",X"5A",X"52",X"4D",X"52",X"65", + X"7D",X"98",X"A6",X"AB",X"AB",X"A6",X"9E",X"9B",X"90",X"80",X"75",X"6D",X"65",X"52",X"52",X"52", + X"52",X"4D",X"42",X"3F",X"47",X"4A",X"55",X"5D",X"62",X"62",X"62",X"62",X"68",X"7D",X"88",X"93", + X"A3",X"9E",X"A3",X"98",X"90",X"90",X"98",X"A3",X"B6",X"C1",X"BE",X"B6",X"B3",X"AB",X"9B",X"88", + X"75",X"70",X"68",X"65",X"70",X"78",X"7D",X"70",X"68",X"68",X"68",X"68",X"65",X"62",X"5D",X"68", + X"7D",X"90",X"9B",X"9B",X"98",X"98",X"98",X"93",X"98",X"9E",X"9B",X"98",X"93",X"93",X"90",X"83", + X"80",X"80",X"78",X"68",X"62",X"62",X"65",X"75",X"83",X"88",X"8B",X"90",X"8B",X"7D",X"70",X"68", + X"65",X"5D",X"55",X"52",X"4D",X"4A",X"4D",X"5A",X"5D",X"65",X"70",X"80",X"8B",X"93",X"9E",X"9E", + X"9B",X"9E",X"A3",X"9B",X"98",X"90",X"88",X"83",X"83",X"88",X"90",X"A6",X"B9",X"BE",X"C1",X"C6", + X"C6",X"C6",X"B6",X"9B",X"83",X"65",X"52",X"4A",X"4D",X"5D",X"6D",X"80",X"8B",X"93",X"8B",X"80", + X"65",X"5A",X"52",X"52",X"52",X"47",X"3F",X"3A",X"47",X"52",X"5D",X"6D",X"83",X"93",X"9B",X"9E", + X"98",X"8B",X"88",X"80",X"80",X"78",X"6D",X"68",X"68",X"70",X"70",X"68",X"68",X"62",X"5A",X"5A", + X"5D",X"5A",X"5D",X"65",X"70",X"75",X"8B",X"98",X"9B",X"9B",X"9B",X"93",X"88",X"88",X"83",X"88", + X"88",X"93",X"9B",X"98",X"8B",X"80",X"78",X"70",X"68",X"68",X"70",X"80",X"88",X"90",X"93",X"9B", + X"9E",X"98",X"98",X"98",X"98",X"90",X"83",X"78",X"78",X"6D",X"6D",X"78",X"88",X"98",X"A3",X"AB", + X"AB",X"A6",X"98",X"83",X"70",X"52",X"47",X"37",X"32",X"27",X"27",X"37",X"47",X"4D",X"65",X"75", + X"88",X"90",X"98",X"90",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"68",X"62",X"5D",X"4D",X"42", + X"3A",X"3A",X"3F",X"47",X"52",X"5A",X"68",X"78",X"83",X"90",X"A3",X"AE",X"B6",X"B9",X"B6",X"AE", + X"B3",X"B6",X"C1",X"C6",X"BE",X"B9",X"B9",X"AE",X"9B",X"88",X"80",X"75",X"68",X"65",X"65",X"70", + X"78",X"83",X"8B",X"90",X"88",X"7D",X"65",X"5A",X"55",X"5A",X"52",X"4D",X"47",X"42",X"3F",X"47", + X"4A",X"52",X"65",X"7D",X"93",X"9B",X"98",X"93",X"90",X"93",X"9B",X"A6",X"AE",X"AE",X"A6",X"98", + X"8B",X"78",X"68",X"5A",X"52",X"52",X"5A",X"65",X"68",X"75",X"75",X"70",X"70",X"7D",X"80",X"83", + X"83",X"80",X"80",X"80",X"8B",X"98",X"A3",X"A3",X"A6",X"A3",X"9B",X"93",X"90",X"8B",X"88",X"80", + X"78",X"70",X"62",X"5A",X"5A",X"52",X"52",X"55",X"5A",X"62",X"68",X"75",X"70",X"6D",X"65",X"65", + X"68",X"6D",X"70",X"70",X"70",X"75",X"75",X"7D",X"83",X"88",X"93",X"9B",X"A3",X"A3",X"A6",X"A6", + X"A3",X"9E",X"93",X"88",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"7D",X"70",X"68",X"62", + X"62",X"68",X"70",X"78",X"7D",X"7D",X"78",X"75",X"68",X"68",X"62",X"62",X"68",X"78",X"78",X"7D", + X"75",X"68",X"6D",X"6D",X"70",X"75",X"7D",X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"80",X"83", + X"88",X"8B",X"88",X"83",X"80",X"80",X"83",X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D", + X"75",X"6D",X"68",X"75",X"80",X"83",X"88",X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"75",X"68",X"5D",X"52",X"4A",X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B", + X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B",X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62", + X"65",X"70",X"78",X"7D",X"80",X"88",X"8B",X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90", + X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"7D",X"78",X"78",X"75",X"70",X"70",X"6D",X"68",X"6D",X"70",X"78",X"80", + X"80",X"80",X"83",X"88",X"90",X"8B",X"8B",X"8B",X"88",X"80",X"7D",X"78",X"70",X"68",X"68",X"68", + X"68",X"6D",X"6D",X"70",X"78",X"7D",X"83",X"8B",X"8B",X"90",X"8B",X"88",X"88",X"88",X"88",X"83", + X"80",X"80",X"83",X"80",X"80",X"7D",X"83",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"78",X"78", + X"75",X"70",X"70",X"70",X"75",X"78",X"78",X"78",X"75",X"75",X"70",X"70",X"75",X"78",X"75",X"75", + X"75",X"75",X"78",X"7D",X"80",X"7D",X"7D",X"7D",X"83",X"88",X"8B",X"88",X"88",X"88",X"88",X"88", + X"8B",X"90",X"90",X"88",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"7D",X"7D",X"80",X"7D",X"78", + X"75",X"70",X"70",X"78",X"80",X"88",X"88",X"88",X"88",X"83",X"7D",X"78",X"78",X"80",X"83",X"83", + X"83",X"80",X"78",X"75",X"75",X"75",X"78",X"80",X"80",X"83",X"83",X"80",X"7D",X"78",X"6D",X"68", + X"65",X"62",X"5D",X"5A",X"62",X"65",X"68",X"75",X"80",X"8B",X"90",X"93",X"90",X"88",X"83",X"80", + X"78",X"75",X"75",X"70",X"68",X"65",X"5D",X"5D",X"55",X"5A",X"5D",X"65",X"68",X"75",X"75",X"80", + X"83",X"8B",X"90",X"9B",X"A3",X"A6",X"A6",X"9E",X"9B",X"98",X"98",X"9E",X"9E",X"A3",X"A3",X"A6", + X"A3",X"9B",X"8B",X"88",X"7D",X"75",X"6D",X"68",X"6D",X"75",X"7D",X"7D",X"83",X"83",X"80",X"75", + X"6D",X"68",X"68",X"68",X"65",X"62",X"5D",X"5A",X"5A",X"5D",X"62",X"68",X"78",X"80",X"83",X"80", + X"7D",X"80",X"83",X"8B",X"98",X"9B",X"9B",X"98",X"90",X"8B",X"7D",X"70",X"68",X"62",X"65",X"68", + X"70",X"78",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"7D",X"7D",X"7D",X"83",X"90",X"98", + X"9B",X"9E",X"9B",X"98",X"90",X"8B",X"83",X"83",X"7D",X"75",X"70",X"65",X"5D",X"5D",X"5A",X"5D", + X"62",X"65",X"68",X"75",X"75",X"75",X"75",X"68",X"6D",X"6D",X"70",X"70",X"75",X"70",X"75",X"75", + X"78",X"7D",X"83",X"90",X"98",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"88",X"83",X"7D",X"7D", + X"7D",X"80",X"83",X"80",X"80",X"7D",X"75",X"68",X"65",X"65",X"68",X"75",X"78",X"7D",X"78",X"78", + X"78",X"6D",X"68",X"65",X"68",X"6D",X"78",X"7D",X"7D",X"75",X"6D",X"6D",X"70",X"75",X"78",X"80", + X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"83",X"83",X"88",X"8B",X"88",X"83",X"80",X"80",X"83", + X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D",X"75",X"6D",X"68",X"75",X"80",X"83",X"88", + X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D",X"80",X"80",X"75",X"68",X"5D",X"52",X"4A", + X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B",X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B", + X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62",X"65",X"70",X"78",X"7D",X"80",X"88",X"8B", + X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90",X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D", + X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"75", + X"75",X"70",X"75",X"6D",X"68",X"6D",X"70",X"78",X"80",X"83",X"80",X"83",X"88",X"90",X"8B",X"8B", + X"88",X"83",X"7D",X"78",X"75",X"6D",X"68",X"68",X"68",X"65",X"68",X"68",X"68",X"70",X"75",X"7D", + X"88",X"83",X"88",X"88",X"80",X"83",X"83",X"88",X"8B",X"88",X"88",X"88",X"83",X"80",X"7D",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"7D",X"75",X"75",X"75",X"75",X"70", + X"70",X"68",X"68",X"68",X"68",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"83",X"83",X"83",X"88", + X"88",X"90",X"98",X"98",X"93",X"90",X"90",X"8B",X"88",X"88",X"8B",X"88",X"80",X"78",X"78",X"75", + X"70",X"68",X"68",X"65",X"68",X"70",X"78",X"78",X"78",X"75",X"75",X"70",X"78",X"80",X"83",X"83", + X"80",X"7D",X"70",X"68",X"65",X"68",X"70",X"7D",X"83",X"83",X"83",X"80",X"75",X"70",X"68",X"65", + X"65",X"65",X"68",X"6D",X"70",X"78",X"7D",X"7D",X"7D",X"83",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"80",X"83",X"8B",X"90",X"93",X"93",X"8B",X"83",X"7D",X"78",X"70",X"6D",X"68",X"65",X"65",X"62", + X"65",X"68",X"70",X"7D",X"88",X"88",X"93",X"90",X"90",X"90",X"90",X"93",X"93",X"93",X"98",X"90", + X"88",X"80",X"78",X"78",X"75",X"78",X"80",X"88",X"90",X"90",X"93",X"8B",X"8B",X"88",X"7D",X"78", + X"6D",X"65",X"65",X"68",X"6D",X"75",X"80",X"83",X"88",X"88",X"88",X"83",X"83",X"83",X"83",X"80", + X"7D",X"80",X"7D",X"75",X"6D",X"68",X"5D",X"55",X"52",X"52",X"62",X"68",X"70",X"75",X"75",X"75", + X"78",X"7D",X"83",X"80",X"83",X"83",X"83",X"83",X"88",X"8B",X"90",X"98",X"98",X"9B",X"9B",X"93", + X"8B",X"83",X"7D",X"78",X"78",X"70",X"75",X"7D",X"80",X"80",X"83",X"80",X"80",X"75",X"70",X"68", + X"68",X"68",X"65",X"68",X"68",X"65",X"68",X"70",X"78",X"7D",X"88",X"88",X"88",X"83",X"83",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75", + X"75",X"7D",X"83",X"83",X"88",X"83",X"88",X"83",X"88",X"83",X"83",X"8B",X"88",X"8B",X"88",X"88", + X"80",X"7D",X"7D",X"75",X"6D",X"68",X"6D",X"70",X"7D",X"80",X"7D",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80", + X"83",X"83",X"80",X"80",X"7D",X"78",X"75",X"70",X"68",X"6D",X"75",X"78",X"7D",X"80",X"80",X"80", + X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"88",X"88",X"8B",X"8B",X"8B", + X"8B",X"88",X"83",X"83",X"80",X"78",X"75",X"75",X"70",X"70",X"75",X"75",X"80",X"83",X"80",X"83", + X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70", + X"75",X"75",X"78",X"7D",X"7D",X"80",X"80",X"83",X"83",X"83",X"83",X"88",X"83",X"83",X"83",X"88", + X"83",X"83",X"88",X"8B",X"88",X"88",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"80",X"80",X"80", + X"83",X"83",X"83",X"7D",X"7D",X"75",X"75",X"75",X"75",X"75",X"70",X"75",X"75",X"75",X"78",X"83", + X"80",X"83",X"80",X"7D",X"80",X"78",X"78",X"80",X"80",X"80",X"7D",X"80",X"80",X"80",X"7D",X"75", + X"70",X"68",X"68",X"68",X"68",X"68",X"70",X"75",X"7D",X"83",X"8B",X"90",X"90",X"8B",X"83",X"80", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70",X"75",X"75", + X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"7D",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"83",X"83", + X"8B",X"8B",X"8B",X"88",X"83",X"83",X"80",X"83",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"7D",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78", + X"78",X"78",X"78",X"78",X"7D",X"80",X"78",X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D", + X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"78",X"7D",X"78",X"7D",X"80",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80", + X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"78",X"80", + X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"75",X"75",X"83",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"88",X"83", + X"80",X"80",X"7D",X"78",X"75",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"75",X"75",X"78", + X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"78",X"78",X"78",X"75",X"75",X"75",X"70",X"75",X"75",X"7D",X"7D",X"80",X"80",X"80", + X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"78",X"78",X"7D", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"78", + X"78",X"78",X"78",X"78",X"78",X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83", + X"83",X"83",X"88",X"83",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"7D",X"78",X"78",X"78",X"75",X"75", + X"75",X"78",X"7D",X"78",X"83",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"78",X"78",X"78",X"78",X"75",X"75",X"75",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80", + X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"78", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"80",X"83",X"83",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"78",X"78",X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D",X"78",X"78",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"83",X"80",X"80",X"83",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"7D",X"80",X"80",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"7D",X"78",X"78",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..f49d198b --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,2077 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity ROM_PGM_0 is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(13 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of ROM_PGM_0 is + + + type ROM_ARRAY is array(0 to 16383) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"AF",x"32",x"01",x"70",x"31",x"FF",x"43",x"C3", -- 0x0000 + x"72",x"02",x"F5",x"DD",x"E5",x"FD",x"E5",x"C5", -- 0x0008 + x"D5",x"E5",x"AF",x"32",x"01",x"70",x"3A",x"00", -- 0x0010 + x"78",x"21",x"6A",x"41",x"11",x"00",x"58",x"01", -- 0x0018 + x"80",x"00",x"ED",x"B0",x"2A",x"14",x"41",x"2B", -- 0x0020 + x"22",x"14",x"41",x"2A",x"32",x"41",x"2B",x"C2", -- 0x0028 + x"9B",x"00",x"3A",x"31",x"41",x"2F",x"21",x"FF", -- 0x0030 + x"FF",x"0F",x"CB",x"1C",x"0F",x"CB",x"1C",x"22", -- 0x0038 + x"32",x"41",x"CD",x"03",x"01",x"CD",x"58",x"01", -- 0x0040 + x"CD",x"C1",x"01",x"3A",x"00",x"40",x"FE",x"06", -- 0x0048 + x"D2",x"DB",x"00",x"3A",x"08",x"40",x"A7",x"CA", -- 0x0050 + x"DB",x"00",x"CD",x"00",x"00",x"CD",x"00",x"00", -- 0x0058 + x"AF",x"32",x"06",x"70",x"32",x"07",x"F5",x"DD", -- 0x0060 + x"E5",x"FD",x"E5",x"C5",x"D5",x"E5",x"AF",x"32", -- 0x0068 + x"01",x"70",x"3A",x"00",x"78",x"21",x"6A",x"41", -- 0x0070 + x"11",x"00",x"58",x"01",x"80",x"00",x"ED",x"B0", -- 0x0078 + x"2A",x"14",x"41",x"2B",x"22",x"14",x"41",x"2A", -- 0x0080 + x"32",x"41",x"2B",x"C2",x"9B",x"00",x"3A",x"31", -- 0x0088 + x"41",x"2F",x"21",x"FF",x"FF",x"0F",x"CB",x"1C", -- 0x0090 + x"0F",x"CB",x"1C",x"22",x"32",x"41",x"CD",x"03", -- 0x0098 + x"01",x"CD",x"58",x"01",x"CD",x"C1",x"01",x"3A", -- 0x00A0 + x"00",x"40",x"FE",x"06",x"D2",x"DB",x"00",x"3A", -- 0x00A8 + x"08",x"40",x"A7",x"CA",x"DB",x"00",x"CD",x"FC", -- 0x00B0 + x"26",x"CD",x"B1",x"26",x"AF",x"32",x"06",x"70", -- 0x00B8 + x"32",x"07",x"70",x"21",x"EF",x"52",x"11",x"5F", -- 0x00C0 + x"02",x"CD",x"E7",x"26",x"3E",x"04",x"32",x"A9", -- 0x00C8 + x"41",x"3E",x"01",x"32",x"8E",x"40",x"3E",x"06", -- 0x00D0 + x"32",x"00",x"40",x"21",x"F5",x"00",x"E5",x"21", -- 0x00D8 + x"85",x"28",x"ED",x"4B",x"06",x"41",x"09",x"5E", -- 0x00E0 + x"23",x"56",x"EB",x"ED",x"4B",x"00",x"40",x"09", -- 0x00E8 + x"5E",x"23",x"56",x"EB",x"E9",x"E1",x"D1",x"C1", -- 0x00F0 + x"FD",x"E1",x"DD",x"E1",x"3E",x"01",x"32",x"01", -- 0x00F8 + x"70",x"F1",x"C9",x"3A",x"00",x"68",x"4F",x"32", -- 0x0100 + x"04",x"40",x"3A",x"00",x"60",x"47",x"32",x"06", -- 0x0108 + x"40",x"3A",x"00",x"40",x"FE",x"04",x"C2",x"43", -- 0x0110 + x"01",x"3A",x"05",x"40",x"47",x"21",x"9B",x"40", -- 0x0118 + x"35",x"C2",x"39",x"01",x"CD",x"09",x"28",x"E6", -- 0x0120 + x"1F",x"3C",x"32",x"9B",x"40",x"CD",x"09",x"28", -- 0x0128 + x"E6",x"01",x"06",x"04",x"CA",x"39",x"01",x"06", -- 0x0130 + x"08",x"CD",x"09",x"28",x"E6",x"10",x"B0",x"32", -- 0x0138 + x"05",x"40",x"C9",x"3A",x"00",x"68",x"CB",x"7F", -- 0x0140 + x"CA",x"53",x"01",x"3A",x"00",x"40",x"FE",x"18", -- 0x0148 + x"79",x"28",x"01",x"78",x"32",x"05",x"40",x"C9", -- 0x0150 + x"21",x"07",x"40",x"D9",x"11",x"09",x"40",x"21", -- 0x0158 + x"06",x"40",x"CB",x"4E",x"EB",x"CA",x"6C",x"01", -- 0x0160 + x"34",x"C3",x"7D",x"01",x"7E",x"36",x"00",x"FE", -- 0x0168 + x"02",x"DA",x"7D",x"01",x"D9",x"3E",x"01",x"86", -- 0x0170 + x"77",x"D9",x"CD",x"B6",x"01",x"23",x"EB",x"CB", -- 0x0178 + x"46",x"EB",x"CA",x"89",x"01",x"34",x"C3",x"99", -- 0x0180 + x"01",x"7E",x"36",x"00",x"FE",x"02",x"DA",x"99", -- 0x0188 + x"01",x"D9",x"3E",x"06",x"86",x"77",x"CD",x"B6", -- 0x0190 + x"01",x"11",x"08",x"40",x"1A",x"FE",x"99",x"C8", -- 0x0198 + x"21",x"07",x"40",x"3A",x"0B",x"40",x"BE",x"D0", -- 0x01A0 + x"2F",x"86",x"77",x"EB",x"3E",x"01",x"86",x"27", -- 0x01A8 + x"D8",x"77",x"EB",x"C3",x"A3",x"01",x"D5",x"E5", -- 0x01B0 + x"11",x"03",x"2A",x"CD",x"1F",x"27",x"E1",x"D1", -- 0x01B8 + x"C9",x"21",x"02",x"40",x"35",x"C0",x"2A",x"0C", -- 0x01C0 + x"40",x"7C",x"B5",x"C8",x"3A",x"00",x"40",x"FE", -- 0x01C8 + x"04",x"CA",x"07",x"02",x"7E",x"E6",x"3F",x"3C", -- 0x01D0 + x"32",x"02",x"40",x"7E",x"07",x"32",x"06",x"68", -- 0x01D8 + x"07",x"32",x"07",x"68",x"23",x"7E",x"FE",x"FE", -- 0x01E0 + x"CA",x"07",x"02",x"FE",x"FD",x"CA",x"17",x"02", -- 0x01E8 + x"FE",x"FC",x"CA",x"26",x"02",x"FE",x"FB",x"CA", -- 0x01F0 + x"3B",x"02",x"FE",x"FA",x"CA",x"4A",x"02",x"32", -- 0x01F8 + x"00",x"78",x"23",x"22",x"0C",x"40",x"C9",x"CD", -- 0x0200 + x"12",x"27",x"2A",x"0E",x"40",x"22",x"0C",x"40", -- 0x0208 + x"21",x"00",x"00",x"22",x"0E",x"40",x"C9",x"23", -- 0x0210 + x"7E",x"32",x"1B",x"40",x"23",x"7E",x"32",x"1C", -- 0x0218 + x"40",x"23",x"22",x"0C",x"40",x"C9",x"23",x"3A", -- 0x0220 + x"1B",x"40",x"86",x"32",x"00",x"78",x"32",x"1B", -- 0x0228 + x"40",x"23",x"BE",x"C2",x"50",x"02",x"23",x"22", -- 0x0230 + x"0C",x"40",x"C9",x"23",x"7E",x"32",x"1C",x"40", -- 0x0238 + x"23",x"7E",x"32",x"1B",x"40",x"23",x"22",x"0C", -- 0x0240 + x"40",x"C9",x"3A",x"1B",x"40",x"32",x"00",x"78", -- 0x0248 + x"3A",x"1B",x"40",x"47",x"3A",x"1C",x"40",x"32", -- 0x0250 + x"1B",x"40",x"78",x"32",x"1C",x"40",x"C9",x"50", -- 0x0258 + x"55",x"53",x"48",x"20",x"53",x"54",x"41",x"52", -- 0x0260 + x"54",x"20",x"42",x"55",x"54",x"54",x"4F",x"4E", -- 0x0268 + x"FF",x"25",x"21",x"00",x"40",x"55",x"72",x"23", -- 0x0270 + x"7C",x"FE",x"44",x"20",x"F9",x"21",x"00",x"50", -- 0x0278 + x"06",x"04",x"0E",x"10",x"71",x"2C",x"20",x"FC", -- 0x0280 + x"24",x"3A",x"00",x"78",x"10",x"F6",x"CD",x"B1", -- 0x0288 + x"26",x"21",x"00",x"60",x"06",x"04",x"AF",x"77", -- 0x0290 + x"23",x"10",x"FC",x"3C",x"06",x"04",x"77",x"23", -- 0x0298 + x"10",x"FC",x"3E",x"03",x"32",x"6D",x"41",x"3D", -- 0x02A0 + x"32",x"A9",x"41",x"32",x"79",x"41",x"32",x"9D", -- 0x02A8 + x"41",x"07",x"32",x"9B",x"41",x"3E",x"07",x"32", -- 0x02B0 + x"A3",x"41",x"32",x"A5",x"41",x"32",x"6B",x"41", -- 0x02B8 + x"3E",x"04",x"32",x"A7",x"41",x"32",x"A9",x"41", -- 0x02C0 + x"AF",x"06",x"08",x"21",x"00",x"68",x"77",x"23", -- 0x02C8 + x"10",x"FC",x"32",x"06",x"70",x"32",x"07",x"70", -- 0x02D0 + x"3D",x"32",x"00",x"78",x"3A",x"00",x"68",x"CB", -- 0x02D8 + x"77",x"3E",x"03",x"CA",x"E8",x"02",x"3E",x"04", -- 0x02E0 + x"32",x"69",x"40",x"3A",x"00",x"68",x"CB",x"7F", -- 0x02E8 + x"3E",x"01",x"C2",x"F6",x"02",x"AF",x"32",x"8F", -- 0x02F0 + x"40",x"3A",x"00",x"70",x"CB",x"47",x"3E",x"10", -- 0x02F8 + x"CA",x"05",x"03",x"3E",x"20",x"32",x"68",x"40", -- 0x0300 + x"3A",x"00",x"70",x"CB",x"4F",x"3E",x"00",x"CA", -- 0x0308 + x"14",x"03",x"3E",x"01",x"32",x"0B",x"40",x"3A", -- 0x0310 + x"00",x"78",x"11",x"EB",x"03",x"21",x"40",x"53", -- 0x0318 + x"CD",x"E7",x"26",x"11",x"F5",x"03",x"21",x"80", -- 0x0320 + x"52",x"CD",x"E7",x"26",x"11",x"F0",x"03",x"21", -- 0x0328 + x"00",x"51",x"CD",x"E7",x"26",x"AF",x"32",x"01", -- 0x0330 + x"53",x"32",x"41",x"50",x"32",x"61",x"50",x"32", -- 0x0338 + x"A1",x"51",x"32",x"C1",x"51",x"3E",x"01",x"32", -- 0x0340 + x"04",x"70",x"32",x"01",x"70",x"DD",x"21",x"A1", -- 0x0348 + x"53",x"21",x"02",x"41",x"01",x"E0",x"FF",x"CD", -- 0x0350 + x"BA",x"03",x"DD",x"21",x"E1",x"50",x"21",x"05", -- 0x0358 + x"41",x"CD",x"BA",x"03",x"DD",x"21",x"41",x"52", -- 0x0360 + x"21",x"23",x"40",x"CD",x"BA",x"03",x"21",x"5F", -- 0x0368 + x"51",x"3A",x"8E",x"40",x"A7",x"C2",x"8B",x"03", -- 0x0370 + x"11",x"E0",x"FF",x"06",x"09",x"7E",x"FE",x"2C", -- 0x0378 + x"D2",x"85",x"03",x"36",x"10",x"19",x"10",x"F5", -- 0x0380 + x"C3",x"AB",x"03",x"11",x"00",x"04",x"CD",x"E7", -- 0x0388 + x"26",x"21",x"08",x"40",x"7E",x"0F",x"0F",x"0F", -- 0x0390 + x"0F",x"E6",x"0F",x"C2",x"A0",x"03",x"3E",x"10", -- 0x0398 + x"11",x"7F",x"50",x"12",x"7E",x"E6",x"0F",x"11", -- 0x03A0 + x"5F",x"50",x"12",x"21",x"67",x"40",x"ED",x"5F", -- 0x03A8 + x"E6",x"0F",x"86",x"77",x"CD",x"09",x"28",x"C3", -- 0x03B0 + x"4D",x"03",x"11",x"10",x"00",x"7E",x"CD",x"DE", -- 0x03B8 + x"03",x"2B",x"7E",x"0F",x"0F",x"0F",x"0F",x"CD", -- 0x03C0 + x"DE",x"03",x"7E",x"CD",x"DE",x"03",x"2B",x"7E", -- 0x03C8 + x"0F",x"0F",x"0F",x"0F",x"CD",x"DE",x"03",x"7E", -- 0x03D0 + x"E6",x"0F",x"DD",x"77",x"00",x"C9",x"E6",x"0F", -- 0x03D8 + x"CA",x"E4",x"03",x"5A",x"B3",x"DD",x"77",x"00", -- 0x03E0 + x"DD",x"09",x"C9",x"31",x"20",x"55",x"50",x"FF", -- 0x03E8 + x"32",x"20",x"55",x"50",x"FF",x"48",x"49",x"47", -- 0x03F0 + x"48",x"40",x"53",x"43",x"4F",x"52",x"45",x"FF", -- 0x03F8 + x"43",x"52",x"45",x"44",x"49",x"54",x"40",x"FF", -- 0x0400 + x"3A",x"08",x"41",x"FE",x"08",x"CA",x"1F",x"05", -- 0x0408 + x"FE",x"0C",x"CA",x"A8",x"04",x"FE",x"0A",x"CA", -- 0x0410 + x"CC",x"04",x"FE",x"10",x"CA",x"0F",x"05",x"FE", -- 0x0418 + x"06",x"CA",x"25",x"04",x"C9",x"3A",x"05",x"40", -- 0x0420 + x"E6",x"0C",x"CA",x"50",x"04",x"FE",x"0C",x"CA", -- 0x0428 + x"50",x"04",x"CB",x"57",x"21",x"A2",x"41",x"7E", -- 0x0430 + x"C2",x"47",x"04",x"FE",x"68",x"CA",x"50",x"04", -- 0x0438 + x"34",x"23",x"23",x"34",x"C3",x"50",x"04",x"FE", -- 0x0440 + x"96",x"CA",x"50",x"04",x"35",x"23",x"23",x"35", -- 0x0448 + x"3A",x"65",x"40",x"3C",x"E6",x"03",x"32",x"65", -- 0x0450 + x"40",x"CA",x"25",x"04",x"DD",x"21",x"EA",x"41", -- 0x0458 + x"FD",x"21",x"AA",x"41",x"3A",x"29",x"41",x"47", -- 0x0460 + x"DD",x"7E",x"00",x"FE",x"0E",x"D2",x"7D",x"04", -- 0x0468 + x"11",x"24",x"00",x"DD",x"19",x"11",x"04",x"00", -- 0x0470 + x"FD",x"19",x"10",x"EC",x"C9",x"FD",x"7E",x"03", -- 0x0478 + x"D6",x"D9",x"FE",x"13",x"D2",x"70",x"04",x"3A", -- 0x0480 + x"A2",x"41",x"4F",x"FD",x"7E",x"00",x"DD",x"86", -- 0x0488 + x"1A",x"C6",x"7F",x"91",x"D2",x"99",x"04",x"ED", -- 0x0490 + x"44",x"DD",x"BE",x"1D",x"D2",x"70",x"04",x"CD", -- 0x0498 + x"40",x"07",x"3E",x"0C",x"32",x"08",x"41",x"C9", -- 0x04A0 + x"3E",x"07",x"32",x"A7",x"41",x"32",x"A9",x"41", -- 0x04A8 + x"3A",x"00",x"40",x"FE",x"04",x"CA",x"BD",x"04", -- 0x04B0 + x"3E",x"01",x"32",x"03",x"68",x"21",x"3C",x"52", -- 0x04B8 + x"36",x"B8",x"3E",x"0A",x"32",x"08",x"41",x"21", -- 0x04C0 + x"03",x"40",x"36",x"01",x"21",x"03",x"40",x"35", -- 0x04C8 + x"C0",x"36",x"0A",x"21",x"3C",x"52",x"7E",x"C6", -- 0x04D0 + x"08",x"FE",x"E0",x"CA",x"EC",x"04",x"FE",x"D0", -- 0x04D8 + x"C2",x"E8",x"04",x"21",x"03",x"68",x"36",x"00", -- 0x04E0 + x"CD",x"FD",x"06",x"C9",x"3E",x"04",x"32",x"A7", -- 0x04E8 + x"41",x"32",x"A9",x"41",x"21",x"3C",x"52",x"11", -- 0x04F0 + x"DF",x"FF",x"3E",x"10",x"06",x"04",x"77",x"23", -- 0x04F8 + x"77",x"19",x"10",x"FA",x"3E",x"80",x"32",x"0A", -- 0x0500 + x"41",x"3E",x"10",x"32",x"08",x"41",x"C9",x"21", -- 0x0508 + x"0A",x"41",x"35",x"C0",x"3E",x"80",x"32",x"0A", -- 0x0510 + x"41",x"3E",x"0E",x"32",x"08",x"41",x"C9",x"21", -- 0x0518 + x"0A",x"41",x"35",x"C0",x"36",x"80",x"3E",x"FF", -- 0x0520 + x"32",x"A2",x"41",x"32",x"A4",x"41",x"3E",x"07", -- 0x0528 + x"32",x"A3",x"41",x"32",x"A5",x"41",x"3E",x"60", -- 0x0530 + x"32",x"FC",x"51",x"3C",x"32",x"FD",x"51",x"3C", -- 0x0538 + x"32",x"1C",x"52",x"3C",x"32",x"1D",x"52",x"3E", -- 0x0540 + x"06",x"32",x"08",x"41",x"C9",x"3A",x"0D",x"41", -- 0x0548 + x"21",x"13",x"41",x"BE",x"D2",x"DC",x"05",x"3A", -- 0x0550 + x"08",x"41",x"FE",x"06",x"C2",x"DC",x"05",x"3A", -- 0x0558 + x"05",x"40",x"CB",x"67",x"C2",x"6E",x"05",x"AF", -- 0x0560 + x"32",x"7B",x"40",x"C3",x"DC",x"05",x"3A",x"7B", -- 0x0568 + x"40",x"A7",x"C2",x"DC",x"05",x"3A",x"00",x"40", -- 0x0570 + x"FE",x"04",x"3E",x"01",x"CA",x"82",x"05",x"32", -- 0x0578 + x"05",x"68",x"32",x"7B",x"40",x"21",x"0D",x"41", -- 0x0580 + x"34",x"21",x"C7",x"41",x"11",x"04",x"00",x"3A", -- 0x0588 + x"A2",x"41",x"C6",x"7F",x"06",x"07",x"0E",x"07", -- 0x0590 + x"19",x"BE",x"C2",x"9F",x"05",x"CB",x"89",x"3C", -- 0x0598 + x"BE",x"C2",x"A6",x"05",x"CB",x"81",x"3C",x"BE", -- 0x05A0 + x"C2",x"AD",x"05",x"CB",x"91",x"D6",x"02",x"10", -- 0x05A8 + x"E7",x"3C",x"CB",x"41",x"C2",x"C5",x"05",x"3D", -- 0x05B0 + x"CB",x"49",x"C2",x"C5",x"05",x"C6",x"02",x"CB", -- 0x05B8 + x"51",x"C2",x"C5",x"05",x"3D",x"47",x"21",x"EA", -- 0x05C0 + x"41",x"11",x"FC",x"FF",x"AF",x"19",x"BE",x"C2", -- 0x05C8 + x"CD",x"05",x"36",x"FF",x"23",x"70",x"23",x"23", -- 0x05D0 + x"3A",x"20",x"41",x"77",x"DD",x"21",x"E6",x"41", -- 0x05D8 + x"3E",x"03",x"08",x"DD",x"22",x"6C",x"40",x"DD", -- 0x05E0 + x"CB",x"00",x"7E",x"CA",x"EE",x"06",x"DD",x"7E", -- 0x05E8 + x"03",x"21",x"1B",x"41",x"AE",x"C6",x"06",x"AE", -- 0x05F0 + x"DD",x"77",x"03",x"AE",x"FE",x"08",x"DA",x"C3", -- 0x05F8 + x"06",x"DD",x"35",x"00",x"DD",x"7E",x"00",x"FE", -- 0x0600 + x"FC",x"C2",x"11",x"06",x"21",x"05",x"68",x"36", -- 0x0608 + x"00",x"FE",x"DD",x"CA",x"C3",x"06",x"DD",x"56", -- 0x0610 + x"01",x"3A",x"1B",x"41",x"DD",x"AE",x"03",x"5F", -- 0x0618 + x"DD",x"21",x"EA",x"41",x"FD",x"21",x"AA",x"41", -- 0x0620 + x"3A",x"29",x"41",x"47",x"DD",x"7E",x"00",x"FE", -- 0x0628 + x"0E",x"DA",x"DE",x"06",x"7B",x"FD",x"86",x"03", -- 0x0630 + x"C6",x"14",x"FE",x"0F",x"D2",x"DE",x"06",x"FD", -- 0x0638 + x"7E",x"00",x"DD",x"86",x"1A",x"92",x"D2",x"4B", -- 0x0640 + x"06",x"ED",x"44",x"DD",x"BE",x"1B",x"D2",x"DE", -- 0x0648 + x"06",x"DD",x"BE",x"1C",x"DA",x"C0",x"06",x"3E", -- 0x0650 + x"02",x"CD",x"2B",x"28",x"4A",x"11",x"0D",x"2A", -- 0x0658 + x"CD",x"1F",x"27",x"CD",x"4A",x"28",x"DD",x"7E", -- 0x0660 + x"00",x"FE",x"18",x"CA",x"C3",x"06",x"CD",x"09", -- 0x0668 + x"28",x"E6",x"0F",x"C6",x"08",x"DD",x"77",x"21", -- 0x0670 + x"FD",x"7E",x"00",x"DD",x"86",x"1A",x"91",x"DA", -- 0x0678 + x"A0",x"06",x"DD",x"36",x"1F",x"80",x"FD",x"36", -- 0x0680 + x"01",x"94",x"DD",x"6E",x"18",x"DD",x"66",x"19", -- 0x0688 + x"23",x"3E",x"14",x"BE",x"CA",x"C3",x"06",x"36", -- 0x0690 + x"93",x"DD",x"36",x"00",x"1C",x"C3",x"C3",x"06", -- 0x0698 + x"DD",x"36",x"20",x"80",x"3E",x"94",x"FD",x"BE", -- 0x06A0 + x"01",x"CA",x"B0",x"06",x"FD",x"36",x"01",x"13", -- 0x06A8 + x"DD",x"6E",x"18",x"DD",x"66",x"19",x"23",x"36", -- 0x06B0 + x"14",x"DD",x"36",x"00",x"1C",x"C3",x"C3",x"06", -- 0x06B8 + x"CD",x"0E",x"07",x"AF",x"32",x"05",x"68",x"DD", -- 0x06C0 + x"2A",x"6C",x"40",x"DD",x"36",x"00",x"00",x"DD", -- 0x06C8 + x"36",x"01",x"00",x"DD",x"36",x"03",x"00",x"21", -- 0x06D0 + x"0D",x"41",x"35",x"C3",x"EE",x"06",x"D5",x"11", -- 0x06D8 + x"24",x"00",x"DD",x"19",x"11",x"04",x"00",x"FD", -- 0x06E0 + x"19",x"D1",x"05",x"C2",x"2C",x"06",x"DD",x"2A", -- 0x06E8 + x"6C",x"40",x"11",x"FC",x"FF",x"DD",x"19",x"08", -- 0x06F0 + x"3D",x"C2",x"E2",x"05",x"C9",x"11",x"DF",x"FF", -- 0x06F8 + x"21",x"3C",x"52",x"06",x"04",x"77",x"23",x"3C", -- 0x0700 + x"77",x"3C",x"19",x"10",x"F8",x"C9",x"DD",x"7E", -- 0x0708 + x"00",x"FE",x"14",x"C2",x"40",x"07",x"DD",x"36", -- 0x0710 + x"00",x"20",x"FD",x"36",x"02",x"05",x"DD",x"7E", -- 0x0718 + x"0D",x"CD",x"2B",x"28",x"3A",x"0B",x"41",x"FE", -- 0x0720 + x"03",x"3E",x"80",x"DA",x"3A",x"07",x"3A",x"67", -- 0x0728 + x"40",x"E6",x"30",x"C2",x"38",x"07",x"3E",x"10", -- 0x0730 + x"F6",x"80",x"DD",x"77",x"0D",x"C3",x"68",x"07", -- 0x0738 + x"FD",x"36",x"01",x"1C",x"DD",x"36",x"0A",x"07", -- 0x0740 + x"FD",x"36",x"02",x"07",x"DD",x"7E",x"00",x"DD", -- 0x0748 + x"36",x"00",x"0C",x"FE",x"12",x"DA",x"6B",x"07", -- 0x0750 + x"FE",x"16",x"DA",x"68",x"07",x"CA",x"6B",x"07", -- 0x0758 + x"FE",x"1E",x"DC",x"C2",x"0B",x"C3",x"6B",x"07", -- 0x0760 + x"CD",x"24",x"0D",x"11",x"EF",x"29",x"CD",x"1F", -- 0x0768 + x"27",x"CD",x"4A",x"28",x"C9",x"B1",x"07",x"B1", -- 0x0770 + x"07",x"B1",x"07",x"B9",x"07",x"44",x"09",x"C6", -- 0x0778 + x"07",x"FA",x"08",x"B1",x"07",x"B1",x"07",x"B4", -- 0x0780 + x"09",x"B4",x"09",x"9C",x"09",x"9C",x"09",x"9C", -- 0x0788 + x"09",x"43",x"08",x"DC",x"08",x"8C",x"09",x"DD", -- 0x0790 + x"21",x"EA",x"41",x"FD",x"21",x"AA",x"41",x"3A", -- 0x0798 + x"29",x"41",x"47",x"21",x"75",x"07",x"DD",x"5E", -- 0x07A0 + x"00",x"16",x"00",x"19",x"5E",x"23",x"56",x"EB", -- 0x07A8 + x"E9",x"DD",x"22",x"72",x"40",x"FD",x"22",x"74", -- 0x07B0 + x"40",x"11",x"24",x"00",x"DD",x"19",x"11",x"04", -- 0x07B8 + x"00",x"FD",x"19",x"10",x"DE",x"C9",x"DD",x"35", -- 0x07C0 + x"11",x"C2",x"B9",x"07",x"FD",x"7E",x"02",x"FE", -- 0x07C8 + x"07",x"3E",x"12",x"CA",x"D8",x"07",x"3E",x"14", -- 0x07D0 + x"DD",x"77",x"00",x"FD",x"36",x"01",x"12",x"FD", -- 0x07D8 + x"36",x"00",x"00",x"DD",x"6E",x"0F",x"DD",x"66", -- 0x07E0 + x"10",x"11",x"06",x"00",x"19",x"7E",x"FD",x"77", -- 0x07E8 + x"03",x"23",x"7E",x"DD",x"77",x"0C",x"DD",x"36", -- 0x07F0 + x"12",x"01",x"21",x"99",x"29",x"22",x"0C",x"40", -- 0x07F8 + x"21",x"00",x"00",x"22",x"0E",x"40",x"3E",x"01", -- 0x0800 + x"32",x"02",x"40",x"DD",x"7E",x"0E",x"E6",x"03", -- 0x0808 + x"C2",x"EB",x"0B",x"C5",x"DD",x"7E",x"0F",x"21", -- 0x0810 + x"D5",x"41",x"11",x"A9",x"41",x"01",x"24",x"00", -- 0x0818 + x"09",x"EB",x"01",x"04",x"00",x"09",x"EB",x"BE", -- 0x0820 + x"C2",x"1D",x"08",x"1A",x"FD",x"77",x"03",x"01", -- 0x0828 + x"F2",x"FF",x"09",x"DD",x"E5",x"D1",x"13",x"06", -- 0x0830 + x"0B",x"7E",x"12",x"23",x"13",x"10",x"FA",x"C1", -- 0x0838 + x"C3",x"B9",x"07",x"DD",x"7E",x"1F",x"A7",x"CA", -- 0x0840 + x"70",x"08",x"DD",x"35",x"1F",x"C2",x"69",x"08", -- 0x0848 + x"DD",x"36",x"21",x"00",x"21",x"30",x"41",x"3A", -- 0x0850 + x"0B",x"41",x"BE",x"DA",x"B6",x"08",x"FD",x"36", -- 0x0858 + x"01",x"13",x"DD",x"7E",x"20",x"A7",x"CA",x"94", -- 0x0860 + x"08",x"DD",x"7E",x"20",x"A7",x"CA",x"9F",x"08", -- 0x0868 + x"DD",x"35",x"20",x"C2",x"9F",x"08",x"DD",x"36", -- 0x0870 + x"21",x"00",x"21",x"30",x"41",x"3A",x"0B",x"41", -- 0x0878 + x"BE",x"DA",x"B6",x"08",x"DD",x"6E",x"18",x"DD", -- 0x0880 + x"66",x"19",x"23",x"36",x"93",x"DD",x"7E",x"1F", -- 0x0888 + x"A7",x"C2",x"9F",x"08",x"DD",x"36",x"00",x"1A", -- 0x0890 + x"DD",x"36",x"21",x"00",x"C3",x"B9",x"07",x"3A", -- 0x0898 + x"0B",x"41",x"21",x"30",x"41",x"BE",x"D2",x"D0", -- 0x08A0 + x"08",x"DD",x"7E",x"21",x"A7",x"CA",x"B6",x"08", -- 0x08A8 + x"DD",x"35",x"21",x"C2",x"D0",x"08",x"FD",x"7E", -- 0x08B0 + x"03",x"C6",x"06",x"FE",x"08",x"DA",x"91",x"0B", -- 0x08B8 + x"FD",x"77",x"03",x"DD",x"6E",x"18",x"DD",x"66", -- 0x08C0 + x"19",x"23",x"23",x"23",x"77",x"C3",x"B9",x"07", -- 0x08C8 + x"ED",x"5F",x"E6",x"02",x"3D",x"DD",x"36",x"12", -- 0x08D0 + x"01",x"C3",x"12",x"0A",x"DD",x"35",x"0A",x"C2", -- 0x08D8 + x"B9",x"07",x"DD",x"36",x"0A",x"06",x"FD",x"7E", -- 0x08E0 + x"02",x"EE",x"01",x"FD",x"77",x"02",x"DD",x"35", -- 0x08E8 + x"0C",x"C2",x"B9",x"07",x"CD",x"40",x"07",x"C3", -- 0x08F0 + x"B9",x"07",x"DD",x"35",x"0A",x"C2",x"B9",x"07", -- 0x08F8 + x"DD",x"36",x"0A",x"07",x"FD",x"34",x"01",x"FD", -- 0x0900 + x"7E",x"01",x"FE",x"20",x"C2",x"B9",x"07",x"DD", -- 0x0908 + x"7E",x"0D",x"E6",x"7F",x"C2",x"19",x"09",x"F6", -- 0x0910 + x"80",x"CD",x"2B",x"28",x"CD",x"4A",x"28",x"DD", -- 0x0918 + x"CB",x"0D",x"7E",x"CA",x"4A",x"09",x"DD",x"7E", -- 0x0920 + x"0D",x"0F",x"0F",x"0F",x"0F",x"E6",x"03",x"0E", -- 0x0928 + x"20",x"81",x"FD",x"77",x"01",x"FD",x"36",x"02", -- 0x0930 + x"05",x"DD",x"36",x"0A",x"20",x"DD",x"36",x"00", -- 0x0938 + x"08",x"C3",x"B9",x"07",x"DD",x"35",x"0A",x"C2", -- 0x0940 + x"B9",x"07",x"FD",x"36",x"01",x"00",x"FD",x"36", -- 0x0948 + x"00",x"00",x"FD",x"36",x"03",x"00",x"DD",x"36", -- 0x0950 + x"00",x"00",x"21",x"0C",x"41",x"35",x"2B",x"35", -- 0x0958 + x"20",x"0D",x"3A",x"00",x"40",x"FE",x"04",x"C2", -- 0x0960 + x"B9",x"07",x"36",x"08",x"C3",x"B9",x"07",x"7E", -- 0x0968 + x"21",x"30",x"41",x"BE",x"D2",x"B9",x"07",x"3A", -- 0x0970 + x"06",x"41",x"FE",x"04",x"C2",x"B9",x"07",x"CD", -- 0x0978 + x"09",x"28",x"E6",x"0F",x"C6",x"08",x"DD",x"77", -- 0x0980 + x"21",x"C3",x"B9",x"07",x"FD",x"7E",x"03",x"C6", -- 0x0988 + x"06",x"FD",x"77",x"03",x"FE",x"08",x"DA",x"80", -- 0x0990 + x"0B",x"C3",x"B9",x"07",x"FD",x"7E",x"00",x"CB", -- 0x0998 + x"7F",x"CA",x"A5",x"09",x"2F",x"07",x"07",x"07", -- 0x09A0 + x"E6",x"03",x"C2",x"AE",x"09",x"3C",x"DD",x"77", -- 0x09A8 + x"12",x"C3",x"C6",x"09",x"DD",x"35",x"23",x"C2", -- 0x09B0 + x"C6",x"09",x"DD",x"36",x"23",x"07",x"FD",x"7E", -- 0x09B8 + x"01",x"EE",x"06",x"FD",x"77",x"01",x"AF",x"57", -- 0x09C0 + x"5F",x"DD",x"BE",x"05",x"CA",x"D3",x"09",x"DD", -- 0x09C8 + x"35",x"05",x"1D",x"DD",x"BE",x"06",x"CA",x"DD", -- 0x09D0 + x"09",x"DD",x"35",x"06",x"15",x"B2",x"B3",x"C2", -- 0x09D8 + x"F1",x"09",x"DD",x"7E",x"03",x"DD",x"77",x"05", -- 0x09E0 + x"DD",x"7E",x"04",x"DD",x"77",x"06",x"C3",x"C6", -- 0x09E8 + x"09",x"DD",x"7E",x"09",x"07",x"E6",x"02",x"3D", -- 0x09F0 + x"A3",x"FD",x"86",x"00",x"DD",x"BE",x"14",x"CA", -- 0x09F8 + x"62",x"0B",x"DD",x"BE",x"15",x"CA",x"62",x"0B", -- 0x0A00 + x"FD",x"77",x"00",x"DD",x"7E",x"09",x"E6",x"02", -- 0x0A08 + x"3D",x"A2",x"FD",x"86",x"03",x"CA",x"91",x"0B", -- 0x0A10 + x"FE",x"10",x"D2",x"30",x"0A",x"DD",x"7E",x"0C", -- 0x0A18 + x"EE",x"AA",x"DD",x"77",x"0C",x"DD",x"7E",x"09", -- 0x0A20 + x"EE",x"AA",x"DD",x"77",x"09",x"C3",x"6B",x"0A", -- 0x0A28 + x"FD",x"77",x"03",x"FE",x"E0",x"C2",x"6B",x"0A", -- 0x0A30 + x"DD",x"7E",x"00",x"FE",x"14",x"C2",x"6B",x"0A", -- 0x0A38 + x"FD",x"7E",x"00",x"FE",x"40",x"DA",x"6B",x"0A", -- 0x0A40 + x"FE",x"C0",x"D2",x"6B",x"0A",x"21",x"66",x"40", -- 0x0A48 + x"BE",x"CA",x"6B",x"0A",x"77",x"ED",x"5F",x"E6", -- 0x0A50 + x"FE",x"3C",x"DD",x"77",x"0C",x"DD",x"36",x"0A", -- 0x0A58 + x"06",x"DD",x"36",x"00",x"1E",x"CD",x"24",x"0D", -- 0x0A60 + x"C3",x"B9",x"07",x"DD",x"7E",x"00",x"FE",x"18", -- 0x0A68 + x"DA",x"86",x"0A",x"DD",x"6E",x"18",x"DD",x"66", -- 0x0A70 + x"19",x"FD",x"7E",x"00",x"C6",x"0F",x"77",x"23", -- 0x0A78 + x"23",x"23",x"FD",x"7E",x"03",x"77",x"DD",x"35", -- 0x0A80 + x"12",x"C2",x"C6",x"09",x"21",x"30",x"41",x"3A", -- 0x0A88 + x"0B",x"41",x"BE",x"3E",x"01",x"D2",x"99",x"0A", -- 0x0A90 + x"3C",x"DD",x"77",x"12",x"DD",x"35",x"0B",x"C2", -- 0x0A98 + x"8C",x"0C",x"DD",x"7E",x"00",x"FE",x"16",x"DA", -- 0x0AA0 + x"B3",x"0A",x"ED",x"5F",x"E6",x"1F",x"C6",x"08", -- 0x0AA8 + x"C3",x"BB",x"0A",x"DD",x"6E",x"0F",x"DD",x"66", -- 0x0AB0 + x"10",x"23",x"7E",x"DD",x"77",x"0B",x"DD",x"6E", -- 0x0AB8 + x"01",x"DD",x"66",x"02",x"23",x"DD",x"75",x"01", -- 0x0AC0 + x"DD",x"74",x"02",x"7E",x"A7",x"CA",x"DA",x"0B", -- 0x0AC8 + x"0F",x"0F",x"0F",x"0F",x"E6",x"0F",x"DD",x"77", -- 0x0AD0 + x"03",x"DD",x"77",x"05",x"7E",x"E6",x"0F",x"DD", -- 0x0AD8 + x"77",x"04",x"DD",x"77",x"06",x"DD",x"CB",x"09", -- 0x0AE0 + x"0E",x"DD",x"CB",x"09",x"0E",x"DD",x"35",x"0A", -- 0x0AE8 + x"C2",x"0B",x"0B",x"DD",x"36",x"0A",x"04",x"DD", -- 0x0AF0 + x"6E",x"07",x"DD",x"66",x"08",x"23",x"DD",x"75", -- 0x0AF8 + x"07",x"DD",x"74",x"08",x"7E",x"DD",x"AE",x"0C", -- 0x0B00 + x"DD",x"77",x"09",x"CD",x"11",x"0B",x"C3",x"B9", -- 0x0B08 + x"07",x"DD",x"7E",x"00",x"FE",x"1A",x"C0",x"DD", -- 0x0B10 + x"7E",x"03",x"A7",x"CA",x"54",x"0B",x"DD",x"96", -- 0x0B18 + x"04",x"D2",x"26",x"0B",x"ED",x"44",x"DD",x"BE", -- 0x0B20 + x"03",x"CA",x"54",x"0B",x"FE",x"03",x"DA",x"54", -- 0x0B28 + x"0B",x"DD",x"CB",x"09",x"46",x"C2",x"46",x"0B", -- 0x0B30 + x"FD",x"36",x"01",x"96",x"DD",x"6E",x"18",x"DD", -- 0x0B38 + x"66",x"19",x"23",x"36",x"95",x"C9",x"FD",x"36", -- 0x0B40 + x"01",x"15",x"DD",x"6E",x"18",x"DD",x"66",x"19", -- 0x0B48 + x"23",x"36",x"16",x"C9",x"FD",x"36",x"01",x"13", -- 0x0B50 + x"DD",x"6E",x"18",x"DD",x"66",x"19",x"23",x"36", -- 0x0B58 + x"93",x"C9",x"DD",x"7E",x"00",x"FE",x"16",x"DA", -- 0x0B60 + x"91",x"0B",x"3E",x"55",x"DD",x"AE",x"0C",x"DD", -- 0x0B68 + x"77",x"0C",x"3E",x"55",x"DD",x"AE",x"09",x"DD", -- 0x0B70 + x"77",x"09",x"CD",x"11",x"0B",x"C3",x"6B",x"0A", -- 0x0B78 + x"21",x"0B",x"41",x"35",x"C2",x"91",x"0B",x"3A", -- 0x0B80 + x"00",x"40",x"FE",x"04",x"C2",x"91",x"0B",x"36", -- 0x0B88 + x"10",x"FD",x"36",x"01",x"00",x"FD",x"36",x"00", -- 0x0B90 + x"00",x"FD",x"36",x"03",x"00",x"FD",x"36",x"02", -- 0x0B98 + x"00",x"DD",x"7E",x"00",x"FE",x"16",x"DA",x"B4", -- 0x0BA0 + x"0B",x"CA",x"B7",x"0B",x"FE",x"1E",x"DC",x"C2", -- 0x0BA8 + x"0B",x"C3",x"B7",x"0B",x"CD",x"24",x"0D",x"DD", -- 0x0BB0 + x"36",x"00",x"00",x"21",x"0C",x"41",x"35",x"C3", -- 0x0BB8 + x"B9",x"07",x"DD",x"6E",x"16",x"DD",x"66",x"17", -- 0x0BC0 + x"36",x"00",x"DD",x"6E",x"18",x"DD",x"66",x"19", -- 0x0BC8 + x"0E",x"04",x"36",x"00",x"23",x"0D",x"C2",x"D2", -- 0x0BD0 + x"0B",x"C9",x"DD",x"7E",x"00",x"FE",x"16",x"DA", -- 0x0BD8 + x"EB",x"0B",x"CD",x"7D",x"27",x"CD",x"11",x"0B", -- 0x0BE0 + x"C3",x"B9",x"07",x"DD",x"5E",x"0F",x"DD",x"56", -- 0x0BE8 + x"10",x"13",x"DD",x"CB",x"0E",x"46",x"C2",x"32", -- 0x0BF0 + x"0C",x"EB",x"7E",x"DD",x"77",x"0B",x"23",x"5E", -- 0x0BF8 + x"DD",x"73",x"07",x"23",x"56",x"DD",x"72",x"08", -- 0x0C00 + x"1A",x"DD",x"AE",x"0C",x"DD",x"77",x"09",x"23", -- 0x0C08 + x"5E",x"DD",x"73",x"01",x"23",x"56",x"DD",x"72", -- 0x0C10 + x"02",x"1A",x"0F",x"0F",x"0F",x"0F",x"E6",x"0F", -- 0x0C18 + x"DD",x"77",x"03",x"DD",x"77",x"05",x"1A",x"E6", -- 0x0C20 + x"0F",x"DD",x"77",x"04",x"DD",x"77",x"06",x"C3", -- 0x0C28 + x"B9",x"07",x"C5",x"ED",x"5F",x"E6",x"0F",x"C6", -- 0x0C30 + x"08",x"DD",x"77",x"0B",x"12",x"13",x"ED",x"5F", -- 0x0C38 + x"E6",x"0C",x"4F",x"06",x"00",x"21",x"68",x"2B", -- 0x0C40 + x"09",x"7E",x"23",x"12",x"13",x"4F",x"DD",x"77", -- 0x0C48 + x"07",x"7E",x"23",x"47",x"12",x"13",x"DD",x"77", -- 0x0C50 + x"08",x"0A",x"DD",x"AE",x"0C",x"DD",x"77",x"09", -- 0x0C58 + x"DD",x"36",x"0A",x"04",x"7E",x"23",x"4F",x"12", -- 0x0C60 + x"13",x"DD",x"77",x"01",x"7E",x"47",x"12",x"DD", -- 0x0C68 + x"77",x"02",x"0A",x"0F",x"0F",x"0F",x"0F",x"E6", -- 0x0C70 + x"0F",x"DD",x"77",x"03",x"DD",x"77",x"05",x"0A", -- 0x0C78 + x"E6",x"0F",x"DD",x"77",x"04",x"DD",x"77",x"06", -- 0x0C80 + x"C1",x"C3",x"B9",x"07",x"DD",x"35",x"13",x"C2", -- 0x0C88 + x"B9",x"07",x"DD",x"36",x"13",x"50",x"DD",x"7E", -- 0x0C90 + x"00",x"FE",x"18",x"CA",x"02",x"0D",x"FE",x"16", -- 0x0C98 + x"C2",x"B9",x"07",x"2A",x"72",x"40",x"7C",x"B5", -- 0x0CA0 + x"CA",x"B9",x"07",x"11",x"00",x"00",x"ED",x"53", -- 0x0CA8 + x"72",x"40",x"ED",x"5B",x"74",x"40",x"36",x"06", -- 0x0CB0 + x"DD",x"75",x"16",x"DD",x"74",x"17",x"DD",x"73", -- 0x0CB8 + x"18",x"DD",x"72",x"19",x"DD",x"36",x"14",x"08", -- 0x0CC0 + x"DD",x"36",x"15",x"F0",x"FD",x"7E",x"00",x"D6", -- 0x0CC8 + x"08",x"FD",x"77",x"00",x"C6",x"0F",x"12",x"13", -- 0x0CD0 + x"FD",x"34",x"01",x"FD",x"7E",x"01",x"F6",x"80", -- 0x0CD8 + x"12",x"13",x"FD",x"7E",x"02",x"12",x"13",x"FD", -- 0x0CE0 + x"7E",x"03",x"12",x"DD",x"36",x"1A",x"0F",x"DD", -- 0x0CE8 + x"36",x"1B",x"0B",x"DD",x"36",x"1C",x"05",x"DD", -- 0x0CF0 + x"36",x"1D",x"11",x"DD",x"36",x"00",x"18",x"C3", -- 0x0CF8 + x"B9",x"07",x"FD",x"34",x"01",x"DD",x"6E",x"18", -- 0x0D00 + x"DD",x"66",x"19",x"23",x"34",x"DD",x"36",x"1A", -- 0x0D08 + x"0F",x"DD",x"36",x"1B",x"10",x"DD",x"36",x"1C", -- 0x0D10 + x"05",x"DD",x"36",x"1D",x"16",x"DD",x"36",x"00", -- 0x0D18 + x"1A",x"C3",x"B9",x"07",x"DD",x"6E",x"0F",x"DD", -- 0x0D20 + x"66",x"10",x"DD",x"36",x"0F",x"00",x"35",x"C8", -- 0x0D28 + x"DD",x"CB",x"0E",x"46",x"C8",x"7D",x"11",x"24", -- 0x0D30 + x"00",x"21",x"D5",x"41",x"19",x"BE",x"C2",x"3C", -- 0x0D38 + x"0D",x"2B",x"CB",x"C6",x"C9",x"DD",x"21",x"AA", -- 0x0D40 + x"41",x"3A",x"05",x"40",x"E6",x"0C",x"CA",x"7C", -- 0x0D48 + x"0D",x"FE",x"0C",x"CA",x"7C",x"0D",x"CB",x"57", -- 0x0D50 + x"21",x"A2",x"41",x"DD",x"7E",x"00",x"C2",x"70", -- 0x0D58 + x"0D",x"FE",x"E1",x"CA",x"7C",x"0D",x"DD",x"34", -- 0x0D60 + x"00",x"34",x"DD",x"34",x"04",x"C3",x"7C",x"0D", -- 0x0D68 + x"FE",x"0F",x"CA",x"7C",x"0D",x"DD",x"35",x"00", -- 0x0D70 + x"35",x"DD",x"35",x"04",x"3A",x"65",x"40",x"3C", -- 0x0D78 + x"E6",x"03",x"32",x"65",x"40",x"CA",x"49",x"0D", -- 0x0D80 + x"21",x"76",x"40",x"35",x"C2",x"A5",x"0D",x"3A", -- 0x0D88 + x"78",x"40",x"77",x"DD",x"35",x"03",x"DD",x"35", -- 0x0D90 + x"07",x"EB",x"21",x"20",x"41",x"3A",x"1B",x"41", -- 0x0D98 + x"37",x"17",x"86",x"77",x"EB",x"23",x"35",x"C2", -- 0x0DA0 + x"B5",x"0D",x"36",x"0F",x"23",x"35",x"7E",x"FE", -- 0x0DA8 + x"02",x"D2",x"B5",x"0D",x"34",x"21",x"6E",x"40", -- 0x0DB0 + x"35",x"C2",x"C6",x"0D",x"36",x"03",x"DD",x"7E", -- 0x0DB8 + x"05",x"EE",x"34",x"DD",x"77",x"05",x"3A",x"10", -- 0x0DC0 + x"40",x"DD",x"46",x"03",x"FE",x"00",x"CA",x"E0", -- 0x0DC8 + x"0D",x"FE",x"01",x"CA",x"E6",x"0D",x"FE",x"02", -- 0x0DD0 + x"C0",x"78",x"FE",x"E0",x"C0",x"C3",x"E6",x"0D", -- 0x0DD8 + x"78",x"A7",x"CA",x"E6",x"0D",x"C9",x"21",x"10", -- 0x0DE0 + x"40",x"34",x"C9",x"21",x"1D",x"40",x"35",x"C0", -- 0x0DE8 + x"36",x"08",x"3A",x"08",x"41",x"FE",x"06",x"C0", -- 0x0DF0 + x"3A",x"1E",x"40",x"21",x"27",x"41",x"BE",x"C8", -- 0x0DF8 + x"3A",x"0C",x"41",x"A7",x"C8",x"47",x"DD",x"21", -- 0x0E00 + x"C6",x"41",x"FD",x"21",x"A6",x"41",x"11",x"24", -- 0x0E08 + x"00",x"DD",x"19",x"11",x"04",x"00",x"FD",x"19", -- 0x0E10 + x"DD",x"7E",x"00",x"1E",x"00",x"FE",x"12",x"CA", -- 0x0E18 + x"2D",x"0E",x"1D",x"FE",x"1A",x"CA",x"2D",x"0E", -- 0x0E20 + x"FE",x"1C",x"C2",x"93",x"0E",x"FD",x"7E",x"00", -- 0x0E28 + x"FE",x"0A",x"DA",x"93",x"0E",x"FE",x"E7",x"D2", -- 0x0E30 + x"93",x"0E",x"FD",x"7E",x"03",x"FE",x"A0",x"D2", -- 0x0E38 + x"93",x"0E",x"3A",x"A2",x"41",x"FD",x"96",x"00", -- 0x0E40 + x"C6",x"89",x"FE",x"21",x"D2",x"93",x"0E",x"FD", -- 0x0E48 + x"7E",x"00",x"DD",x"86",x"1E",x"4F",x"ED",x"5F", -- 0x0E50 + x"E6",x"07",x"D6",x"04",x"A3",x"81",x"21",x"C7", -- 0x0E58 + x"41",x"11",x"04",x"00",x"0E",x"07",x"19",x"BE", -- 0x0E60 + x"CA",x"93",x"0E",x"0D",x"C2",x"66",x"0E",x"DD", -- 0x0E68 + x"21",x"C6",x"41",x"47",x"DD",x"19",x"DD",x"7E", -- 0x0E70 + x"01",x"DD",x"B6",x"03",x"C2",x"74",x"0E",x"DD", -- 0x0E78 + x"70",x"01",x"3E",x"F5",x"FD",x"96",x"03",x"21", -- 0x0E80 + x"1B",x"41",x"AE",x"DD",x"77",x"03",x"21",x"1E", -- 0x0E88 + x"40",x"34",x"C9",x"DD",x"7E",x"00",x"FE",x"08", -- 0x0E90 + x"DA",x"0E",x"0E",x"05",x"C2",x"0E",x"0E",x"C9", -- 0x0E98 + x"3A",x"1E",x"40",x"A7",x"C8",x"47",x"DD",x"21", -- 0x0EA0 + x"C6",x"41",x"11",x"04",x"00",x"DD",x"19",x"DD", -- 0x0EA8 + x"7E",x"03",x"A7",x"CA",x"AD",x"0E",x"21",x"1B", -- 0x0EB0 + x"41",x"AE",x"D6",x"03",x"AE",x"DD",x"77",x"03", -- 0x0EB8 + x"AE",x"FE",x"1B",x"D2",x"05",x"0F",x"3A",x"08", -- 0x0EC0 + x"41",x"FE",x"06",x"C2",x"ED",x"0E",x"3A",x"A2", -- 0x0EC8 + x"41",x"C6",x"87",x"DD",x"96",x"01",x"FE",x"0D", -- 0x0ED0 + x"D2",x"ED",x"0E",x"DD",x"36",x"01",x"00",x"DD", -- 0x0ED8 + x"36",x"03",x"00",x"21",x"1E",x"40",x"35",x"3E", -- 0x0EE0 + x"0C",x"32",x"08",x"41",x"C9",x"DD",x"7E",x"03", -- 0x0EE8 + x"21",x"1B",x"41",x"AE",x"FE",x"0F",x"D2",x"05", -- 0x0EF0 + x"0F",x"DD",x"36",x"03",x"00",x"DD",x"36",x"01", -- 0x0EF8 + x"00",x"21",x"1E",x"40",x"35",x"10",x"A6",x"C9", -- 0x0F00 + x"3A",x"08",x"41",x"FE",x"06",x"C0",x"3A",x"0C", -- 0x0F08 + x"41",x"21",x"29",x"41",x"BE",x"C8",x"47",x"3A", -- 0x0F10 + x"0B",x"41",x"90",x"C8",x"4F",x"CD",x"09",x"28", -- 0x0F18 + x"47",x"3A",x"0B",x"41",x"21",x"34",x"41",x"BE", -- 0x0F20 + x"78",x"D2",x"32",x"0F",x"E6",x"01",x"3C",x"C3", -- 0x0F28 + x"35",x"0F",x"E6",x"03",x"86",x"47",x"79",x"90", -- 0x0F30 + x"D8",x"3A",x"0C",x"41",x"80",x"21",x"29",x"41", -- 0x0F38 + x"3D",x"BE",x"D0",x"3C",x"32",x"0C",x"41",x"21", -- 0x0F40 + x"1C",x"40",x"11",x"08",x"00",x"AF",x"19",x"BE", -- 0x0F48 + x"C2",x"4E",x"0F",x"70",x"CD",x"09",x"28",x"4F", -- 0x0F50 + x"CB",x"3F",x"A1",x"2F",x"F6",x"01",x"E6",x"03", -- 0x0F58 + x"4F",x"DD",x"21",x"C6",x"41",x"FD",x"21",x"A6", -- 0x0F60 + x"41",x"11",x"24",x"00",x"DD",x"19",x"11",x"04", -- 0x0F68 + x"00",x"FD",x"19",x"DD",x"7E",x"00",x"FE",x"00", -- 0x0F70 + x"C2",x"69",x"0F",x"ED",x"5F",x"E6",x"03",x"80", -- 0x0F78 + x"DD",x"36",x"0D",x"08",x"16",x"07",x"FE",x"03", -- 0x0F80 + x"D2",x"91",x"0F",x"16",x"04",x"DD",x"36",x"0D", -- 0x0F88 + x"05",x"FD",x"72",x"02",x"DD",x"71",x"0E",x"DD", -- 0x0F90 + x"71",x"11",x"DD",x"75",x"0F",x"DD",x"74",x"10", -- 0x0F98 + x"DD",x"36",x"0A",x"04",x"DD",x"36",x"00",x"0A", -- 0x0FA0 + x"DD",x"36",x"14",x"00",x"DD",x"36",x"15",x"00", -- 0x0FA8 + x"DD",x"36",x"1A",x"07",x"DD",x"36",x"1B",x"08", -- 0x0FB0 + x"DD",x"36",x"1C",x"08",x"DD",x"36",x"1D",x"0E", -- 0x0FB8 + x"DD",x"36",x"1E",x"08",x"DD",x"36",x"22",x"FF", -- 0x0FC0 + x"DD",x"36",x"23",x"07",x"3E",x"28",x"81",x"E6", -- 0x0FC8 + x"FE",x"4F",x"10",x"95",x"11",x"06",x"00",x"19", -- 0x0FD0 + x"ED",x"5F",x"E6",x"7F",x"4F",x"ED",x"5F",x"E6", -- 0x0FD8 + x"3F",x"81",x"C6",x"1C",x"77",x"FE",x"60",x"DA", -- 0x0FE0 + x"EC",x"0F",x"CB",x"C8",x"ED",x"5F",x"E6",x"01", -- 0x0FE8 + x"B0",x"47",x"07",x"07",x"B0",x"47",x"07",x"07", -- 0x0FF0 + x"07",x"07",x"B0",x"23",x"77",x"C9",x"3A",x"08", -- 0x0FF8 + x"41",x"FE",x"06",x"C0",x"21",x"0C",x"41",x"3A", -- 0x1000 + x"29",x"41",x"BE",x"C8",x"3A",x"0B",x"41",x"BE", -- 0x1008 + x"C8",x"34",x"21",x"00",x"00",x"22",x"72",x"40", -- 0x1010 + x"DD",x"21",x"C6",x"41",x"FD",x"21",x"A6",x"41", -- 0x1018 + x"01",x"24",x"00",x"11",x"04",x"00",x"DD",x"09", -- 0x1020 + x"FD",x"19",x"DD",x"7E",x"00",x"FE",x"00",x"C2", -- 0x1028 + x"26",x"10",x"FD",x"36",x"01",x"11",x"ED",x"5F", -- 0x1030 + x"E6",x"3F",x"C6",x"10",x"FD",x"77",x"03",x"ED", -- 0x1038 + x"5F",x"E6",x"7F",x"C6",x"40",x"FD",x"77",x"00", -- 0x1040 + x"DD",x"36",x"0D",x"10",x"21",x"30",x"41",x"3A", -- 0x1048 + x"0B",x"41",x"BE",x"3E",x"07",x"D2",x"69",x"10", -- 0x1050 + x"DD",x"36",x"0D",x"15",x"FE",x"01",x"3E",x"04", -- 0x1058 + x"C2",x"69",x"10",x"3E",x"02",x"DD",x"36",x"0D", -- 0x1060 + x"20",x"FD",x"77",x"02",x"DD",x"CB",x"0E",x"C6", -- 0x1068 + x"DD",x"36",x"1E",x"10",x"DD",x"36",x"13",x"50", -- 0x1070 + x"DD",x"36",x"14",x"12",x"DD",x"36",x"15",x"E8", -- 0x1078 + x"DD",x"36",x"1A",x"07",x"DD",x"36",x"1B",x"08", -- 0x1080 + x"DD",x"36",x"1C",x"08",x"DD",x"36",x"1D",x"0E", -- 0x1088 + x"CD",x"09",x"28",x"E6",x"01",x"5F",x"3A",x"31", -- 0x1090 + x"41",x"3C",x"07",x"2F",x"E6",x"07",x"C2",x"A2", -- 0x1098 + x"10",x"3C",x"83",x"DD",x"77",x"11",x"DD",x"36", -- 0x10A0 + x"22",x"FF",x"CD",x"7D",x"27",x"DD",x"36",x"00", -- 0x10A8 + x"16",x"C9",x"CD",x"FC",x"26",x"CD",x"B1",x"26", -- 0x10B0 + x"AF",x"32",x"06",x"70",x"32",x"07",x"70",x"3E", -- 0x10B8 + x"01",x"32",x"02",x"60",x"21",x"47",x"52",x"11", -- 0x10C0 + x"C2",x"18",x"CD",x"E7",x"26",x"21",x"39",x"53", -- 0x10C8 + x"11",x"FB",x"18",x"CD",x"E7",x"26",x"21",x"38", -- 0x10D0 + x"53",x"11",x"11",x"19",x"CD",x"E7",x"26",x"21", -- 0x10D8 + x"37",x"53",x"11",x"27",x"19",x"CD",x"E7",x"26", -- 0x10E0 + x"21",x"36",x"53",x"11",x"3C",x"19",x"CD",x"E7", -- 0x10E8 + x"26",x"3E",x"02",x"32",x"00",x"40",x"C9",x"21", -- 0x10F0 + x"1F",x"40",x"35",x"C0",x"3E",x"04",x"32",x"00", -- 0x10F8 + x"40",x"CD",x"FC",x"26",x"3E",x"00",x"32",x"02", -- 0x1100 + x"60",x"CD",x"41",x"27",x"CD",x"BF",x"12",x"CD", -- 0x1108 + x"09",x"28",x"E6",x"1F",x"3C",x"32",x"9B",x"40", -- 0x1110 + x"3A",x"9C",x"40",x"EE",x"04",x"32",x"9C",x"40", -- 0x1118 + x"EE",x"04",x"32",x"06",x"41",x"A7",x"CA",x"2D", -- 0x1120 + x"11",x"CD",x"6F",x"15",x"C9",x"CD",x"2D",x"18", -- 0x1128 + x"C9",x"3A",x"04",x"40",x"CB",x"4F",x"C2",x"4D", -- 0x1130 + x"11",x"CB",x"47",x"C8",x"3A",x"08",x"40",x"C6", -- 0x1138 + x"99",x"27",x"32",x"08",x"40",x"CD",x"FC",x"26", -- 0x1140 + x"3E",x"08",x"C3",x"65",x"11",x"3A",x"08",x"40", -- 0x1148 + x"C6",x"98",x"27",x"D0",x"32",x"08",x"40",x"CD", -- 0x1150 + x"FC",x"26",x"21",x"8F",x"52",x"11",x"C9",x"18", -- 0x1158 + x"CD",x"E7",x"26",x"3E",x"0A",x"32",x"00",x"40", -- 0x1160 + x"AF",x"32",x"8E",x"40",x"3E",x"80",x"32",x"11", -- 0x1168 + x"41",x"C9",x"CD",x"08",x"04",x"CD",x"84",x"28", -- 0x1170 + x"3A",x"08",x"41",x"FE",x"0E",x"CA",x"AD",x"11", -- 0x1178 + x"CD",x"4D",x"05",x"CD",x"08",x"0F",x"CD",x"97", -- 0x1180 + x"07",x"CD",x"EB",x"0D",x"CD",x"A0",x"0E",x"3A", -- 0x1188 + x"0B",x"41",x"A7",x"C0",x"3A",x"1E",x"40",x"A7", -- 0x1190 + x"C0",x"3A",x"08",x"41",x"FE",x"06",x"C0",x"3A", -- 0x1198 + x"00",x"40",x"C6",x"FA",x"32",x"00",x"40",x"21", -- 0x11A0 + x"06",x"41",x"34",x"34",x"C9",x"3A",x"00",x"40", -- 0x11A8 + x"FE",x"04",x"CA",x"9A",x"14",x"21",x"97",x"29", -- 0x11B0 + x"22",x"0C",x"40",x"21",x"00",x"00",x"22",x"0E", -- 0x11B8 + x"40",x"21",x"60",x"50",x"FE",x"18",x"CA",x"CC", -- 0x11C0 + x"11",x"21",x"A0",x"53",x"35",x"CD",x"B1",x"26", -- 0x11C8 + x"21",x"10",x"41",x"35",x"C2",x"04",x"12",x"CD", -- 0x11D0 + x"FC",x"26",x"21",x"8D",x"52",x"11",x"DF",x"18", -- 0x11D8 + x"CD",x"E7",x"26",x"3A",x"00",x"40",x"FE",x"14", -- 0x11E0 + x"CA",x"FF",x"11",x"21",x"8F",x"52",x"11",x"C9", -- 0x11E8 + x"18",x"FE",x"16",x"CA",x"F9",x"11",x"11",x"D4", -- 0x11F0 + x"18",x"CD",x"E7",x"26",x"3A",x"00",x"40",x"C6", -- 0x11F8 + x"12",x"C3",x"42",x"12",x"3A",x"00",x"40",x"FE", -- 0x1200 + x"14",x"CA",x"3D",x"12",x"CD",x"FC",x"26",x"21", -- 0x1208 + x"8F",x"52",x"11",x"D4",x"18",x"3A",x"00",x"40", -- 0x1210 + x"FE",x"16",x"3A",x"8F",x"40",x"CA",x"24",x"12", -- 0x1218 + x"AF",x"11",x"C9",x"18",x"32",x"06",x"70",x"32", -- 0x1220 + x"07",x"70",x"CD",x"E7",x"26",x"3A",x"20",x"40", -- 0x1228 + x"A7",x"C2",x"3D",x"12",x"21",x"8D",x"52",x"11", -- 0x1230 + x"DF",x"18",x"CD",x"E7",x"26",x"3A",x"00",x"40", -- 0x1238 + x"C6",x"06",x"32",x"00",x"40",x"3E",x"80",x"32", -- 0x1240 + x"11",x"41",x"C9",x"21",x"11",x"41",x"35",x"C0", -- 0x1248 + x"3A",x"00",x"40",x"FE",x"08",x"CA",x"63",x"12", -- 0x1250 + x"3A",x"69",x"40",x"32",x"60",x"50",x"3E",x"64", -- 0x1258 + x"32",x"40",x"50",x"3A",x"69",x"40",x"32",x"A0", -- 0x1260 + x"53",x"3E",x"64",x"32",x"80",x"53",x"11",x"6B", -- 0x1268 + x"29",x"CD",x"1F",x"27",x"CD",x"FC",x"26",x"3E", -- 0x1270 + x"00",x"32",x"02",x"60",x"CD",x"2D",x"18",x"3A", -- 0x1278 + x"00",x"40",x"C6",x"0C",x"32",x"00",x"40",x"CD", -- 0x1280 + x"41",x"27",x"3A",x"8F",x"40",x"3D",x"2F",x"32", -- 0x1288 + x"1B",x"41",x"21",x"03",x"41",x"22",x"0E",x"41", -- 0x1290 + x"3E",x"18",x"32",x"12",x"41",x"3A",x"69",x"40", -- 0x1298 + x"32",x"10",x"41",x"CD",x"BF",x"12",x"CD",x"5F", -- 0x12A0 + x"27",x"AF",x"32",x"1B",x"41",x"21",x"00",x"41", -- 0x12A8 + x"22",x"0E",x"41",x"3A",x"00",x"40",x"32",x"12", -- 0x12B0 + x"41",x"3A",x"69",x"40",x"32",x"10",x"41",x"3E", -- 0x12B8 + x"10",x"32",x"0B",x"41",x"3E",x"03",x"32",x"30", -- 0x12C0 + x"41",x"3E",x"03",x"32",x"34",x"41",x"3E",x"05", -- 0x12C8 + x"32",x"29",x"41",x"3E",x"18",x"21",x"1B",x"41", -- 0x12D0 + x"AE",x"32",x"20",x"41",x"3E",x"03",x"32",x"13", -- 0x12D8 + x"41",x"3E",x"02",x"32",x"27",x"41",x"3E",x"22", -- 0x12E0 + x"32",x"18",x"41",x"3E",x"04",x"32",x"19",x"41", -- 0x12E8 + x"3E",x"03",x"32",x"1A",x"41",x"3E",x"08",x"32", -- 0x12F0 + x"1E",x"41",x"3E",x"0F",x"32",x"1F",x"41",x"3E", -- 0x12F8 + x"05",x"32",x"35",x"41",x"3E",x"25",x"32",x"36", -- 0x1300 + x"41",x"3E",x"05",x"32",x"37",x"41",x"3E",x"08", -- 0x1308 + x"32",x"24",x"41",x"3E",x"20",x"32",x"28",x"41", -- 0x1310 + x"3E",x"50",x"32",x"2B",x"41",x"3E",x"C0",x"32", -- 0x1318 + x"2F",x"41",x"3E",x"1F",x"32",x"2A",x"41",x"3E", -- 0x1320 + x"40",x"32",x"2D",x"41",x"3E",x"02",x"32",x"2E", -- 0x1328 + x"41",x"3E",x"08",x"32",x"08",x"41",x"3E",x"80", -- 0x1330 + x"32",x"0A",x"41",x"3E",x"01",x"32",x"21",x"41", -- 0x1338 + x"3A",x"00",x"70",x"CB",x"57",x"3E",x"01",x"C2", -- 0x1340 + x"4B",x"13",x"AF",x"32",x"31",x"41",x"C9",x"21", -- 0x1348 + x"31",x"41",x"34",x"3E",x"10",x"32",x"0B",x"41", -- 0x1350 + x"3E",x"08",x"32",x"29",x"41",x"3E",x"00",x"32", -- 0x1358 + x"02",x"60",x"3E",x"03",x"32",x"13",x"41",x"CD", -- 0x1360 + x"93",x"18",x"21",x"31",x"41",x"3E",x"03",x"96", -- 0x1368 + x"FE",x"01",x"D2",x"77",x"13",x"3E",x"01",x"32", -- 0x1370 + x"34",x"41",x"3A",x"00",x"40",x"C6",x"06",x"32", -- 0x1378 + x"00",x"40",x"C9",x"21",x"11",x"41",x"35",x"C0", -- 0x1380 + x"3A",x"00",x"40",x"FE",x"1A",x"3E",x"20",x"CA", -- 0x1388 + x"AB",x"13",x"CD",x"FC",x"26",x"3A",x"20",x"40", -- 0x1390 + x"A7",x"CA",x"AF",x"13",x"CD",x"5F",x"27",x"3A", -- 0x1398 + x"00",x"40",x"FE",x"1C",x"3E",x"24",x"CA",x"AB", -- 0x13A0 + x"13",x"3E",x"22",x"32",x"00",x"40",x"C9",x"CD", -- 0x13A8 + x"5F",x"27",x"21",x"8F",x"52",x"11",x"C9",x"18", -- 0x13B0 + x"3A",x"00",x"40",x"FE",x"1C",x"3E",x"1E",x"CA", -- 0x13B8 + x"C7",x"13",x"3E",x"1C",x"11",x"D4",x"18",x"32", -- 0x13C0 + x"00",x"40",x"3A",x"4D",x"41",x"E6",x"01",x"C3", -- 0x13C8 + x"33",x"14",x"C9",x"CD",x"2D",x"18",x"3E",x"00", -- 0x13D0 + x"32",x"02",x"60",x"C3",x"F4",x"13",x"3E",x"01", -- 0x13D8 + x"32",x"00",x"68",x"32",x"01",x"68",x"32",x"02", -- 0x13E0 + x"68",x"3E",x"01",x"32",x"02",x"60",x"21",x"00", -- 0x13E8 + x"00",x"22",x"14",x"41",x"3E",x"08",x"32",x"08", -- 0x13F0 + x"41",x"3A",x"00",x"40",x"C6",x"F4",x"32",x"00", -- 0x13F8 + x"40",x"C9",x"21",x"11",x"41",x"35",x"C0",x"CD", -- 0x1400 + x"FC",x"26",x"3A",x"00",x"40",x"FE",x"26",x"CA", -- 0x1408 + x"42",x"14",x"3A",x"20",x"40",x"A7",x"CA",x"42", -- 0x1410 + x"14",x"3A",x"00",x"40",x"C6",x"F4",x"32",x"00", -- 0x1418 + x"40",x"21",x"8F",x"52",x"11",x"D4",x"18",x"FE", -- 0x1420 + x"1C",x"3A",x"8F",x"40",x"CA",x"33",x"14",x"AF", -- 0x1428 + x"11",x"C9",x"18",x"32",x"06",x"70",x"32",x"07", -- 0x1430 + x"70",x"CD",x"E7",x"26",x"3E",x"80",x"32",x"11", -- 0x1438 + x"41",x"C9",x"A7",x"2A",x"22",x"40",x"ED",x"5B", -- 0x1440 + x"01",x"41",x"ED",x"52",x"DA",x"5D",x"14",x"C2", -- 0x1448 + x"68",x"14",x"3A",x"00",x"41",x"47",x"3A",x"21", -- 0x1450 + x"40",x"90",x"D2",x"68",x"14",x"ED",x"53",x"22", -- 0x1458 + x"40",x"3A",x"00",x"41",x"32",x"21",x"40",x"3F", -- 0x1460 + x"2A",x"22",x"40",x"ED",x"5B",x"04",x"41",x"ED", -- 0x1468 + x"52",x"DA",x"82",x"14",x"C2",x"8C",x"14",x"3A", -- 0x1470 + x"03",x"41",x"47",x"3A",x"21",x"40",x"90",x"D2", -- 0x1478 + x"8C",x"14",x"ED",x"53",x"22",x"40",x"3A",x"03", -- 0x1480 + x"41",x"32",x"21",x"40",x"3E",x"10",x"32",x"A0", -- 0x1488 + x"53",x"32",x"80",x"53",x"32",x"60",x"50",x"32", -- 0x1490 + x"40",x"50",x"AF",x"32",x"A6",x"41",x"32",x"A8", -- 0x1498 + x"41",x"32",x"74",x"41",x"32",x"76",x"41",x"32", -- 0x14A0 + x"78",x"41",x"32",x"7A",x"41",x"3E",x"00",x"32", -- 0x14A8 + x"00",x"40",x"C9",x"DD",x"21",x"AA",x"41",x"3A", -- 0x14B0 + x"1B",x"41",x"E6",x"FE",x"C6",x"79",x"47",x"3A", -- 0x14B8 + x"A2",x"41",x"80",x"47",x"DD",x"77",x"00",x"DD", -- 0x14C0 + x"36",x"03",x"E0",x"DD",x"36",x"01",x"18",x"DD", -- 0x14C8 + x"36",x"02",x"07",x"3E",x"10",x"32",x"FC",x"51", -- 0x14D0 + x"32",x"FD",x"51",x"32",x"1C",x"52",x"32",x"1D", -- 0x14D8 + x"52",x"DD",x"70",x"04",x"DD",x"36",x"07",x"EE", -- 0x14E0 + x"DD",x"36",x"05",x"1B",x"DD",x"36",x"06",x"07", -- 0x14E8 + x"3E",x"0A",x"32",x"78",x"40",x"C6",x"60",x"32", -- 0x14F0 + x"76",x"40",x"3E",x"10",x"32",x"77",x"40",x"3E", -- 0x14F8 + x"03",x"32",x"6E",x"40",x"3E",x"01",x"32",x"03", -- 0x1500 + x"68",x"21",x"37",x"2A",x"22",x"0C",x"40",x"21", -- 0x1508 + x"00",x"00",x"22",x"0E",x"40",x"3E",x"01",x"32", -- 0x1510 + x"02",x"40",x"3E",x"00",x"32",x"10",x"40",x"3A", -- 0x1518 + x"00",x"40",x"C6",x"06",x"32",x"00",x"40",x"CD", -- 0x1520 + x"45",x"0D",x"CD",x"4D",x"05",x"3A",x"10",x"40", -- 0x1528 + x"FE",x"01",x"C2",x"39",x"15",x"CD",x"FC",x"26", -- 0x1530 + x"C9",x"FE",x"03",x"C0",x"AF",x"32",x"03",x"68", -- 0x1538 + x"06",x"08",x"21",x"AA",x"41",x"36",x"00",x"23", -- 0x1540 + x"10",x"FB",x"3A",x"A2",x"41",x"32",x"A4",x"41", -- 0x1548 + x"3E",x"60",x"32",x"FC",x"51",x"3C",x"32",x"FD", -- 0x1550 + x"51",x"3C",x"32",x"1C",x"52",x"3C",x"32",x"1D", -- 0x1558 + x"52",x"21",x"06",x"41",x"34",x"34",x"3A",x"00", -- 0x1560 + x"40",x"C6",x"FA",x"32",x"00",x"40",x"C9",x"3E", -- 0x1568 + x"08",x"32",x"0B",x"41",x"32",x"29",x"41",x"21", -- 0x1570 + x"00",x"00",x"22",x"72",x"40",x"3E",x"01",x"32", -- 0x1578 + x"02",x"60",x"3E",x"01",x"32",x"13",x"41",x"CD", -- 0x1580 + x"93",x"18",x"3A",x"00",x"40",x"FE",x"04",x"C8", -- 0x1588 + x"3E",x"01",x"32",x"00",x"68",x"32",x"01",x"68", -- 0x1590 + x"32",x"02",x"68",x"3A",x"00",x"40",x"C6",x"06", -- 0x1598 + x"32",x"00",x"40",x"C9",x"3E",x"10",x"32",x"0B", -- 0x15A0 + x"41",x"3A",x"31",x"41",x"CB",x"27",x"C6",x"03", -- 0x15A8 + x"FE",x"07",x"DA",x"B7",x"15",x"3E",x"06",x"32", -- 0x15B0 + x"29",x"41",x"3E",x"20",x"32",x"28",x"41",x"3E", -- 0x15B8 + x"01",x"32",x"92",x"40",x"3E",x"60",x"32",x"93", -- 0x15C0 + x"40",x"CD",x"93",x"18",x"3A",x"31",x"41",x"3C", -- 0x15C8 + x"3C",x"FE",x"06",x"DA",x"D8",x"15",x"3E",x"05", -- 0x15D0 + x"32",x"27",x"41",x"3A",x"31",x"41",x"A7",x"CA", -- 0x15D8 + x"E6",x"15",x"AF",x"32",x"2F",x"41",x"3E",x"00", -- 0x15E0 + x"32",x"9D",x"40",x"3E",x"01",x"32",x"00",x"68", -- 0x15E8 + x"32",x"01",x"68",x"32",x"02",x"68",x"3A",x"00", -- 0x15F0 + x"40",x"C6",x"06",x"32",x"00",x"40",x"C9",x"3E", -- 0x15F8 + x"08",x"32",x"08",x"41",x"3E",x"01",x"32",x"92", -- 0x1600 + x"40",x"3E",x"60",x"32",x"93",x"40",x"CD",x"2D", -- 0x1608 + x"18",x"3E",x"00",x"32",x"9D",x"40",x"3E",x"01", -- 0x1610 + x"32",x"00",x"68",x"32",x"01",x"68",x"32",x"02", -- 0x1618 + x"68",x"3E",x"00",x"32",x"02",x"60",x"3A",x"00", -- 0x1620 + x"40",x"C6",x"F4",x"32",x"00",x"40",x"C9",x"CD", -- 0x1628 + x"08",x"04",x"CD",x"84",x"28",x"CD",x"4D",x"05", -- 0x1630 + x"CD",x"91",x"20",x"CD",x"28",x"22",x"CD",x"A0", -- 0x1638 + x"0E",x"CD",x"99",x"22",x"CD",x"48",x"23",x"CD", -- 0x1640 + x"FA",x"24",x"3A",x"08",x"41",x"FE",x"0E",x"CA", -- 0x1648 + x"AD",x"11",x"3A",x"0B",x"41",x"A7",x"C0",x"3A", -- 0x1650 + x"1E",x"40",x"A7",x"C0",x"3A",x"9D",x"40",x"FE", -- 0x1658 + x"04",x"C0",x"CD",x"B1",x"26",x"3A",x"00",x"40", -- 0x1660 + x"C6",x"FA",x"32",x"00",x"40",x"3E",x"00",x"32", -- 0x1668 + x"06",x"41",x"C9",x"3A",x"00",x"40",x"C6",x"FA", -- 0x1670 + x"32",x"00",x"40",x"3E",x"00",x"32",x"06",x"41", -- 0x1678 + x"C9",x"DD",x"21",x"AA",x"41",x"3A",x"1B",x"41", -- 0x1680 + x"E6",x"FE",x"C6",x"79",x"47",x"3A",x"A2",x"41", -- 0x1688 + x"80",x"DD",x"77",x"00",x"DD",x"36",x"03",x"E0", -- 0x1690 + x"DD",x"36",x"02",x"07",x"DD",x"36",x"01",x"18", -- 0x1698 + x"3E",x"10",x"32",x"FC",x"51",x"32",x"FD",x"51", -- 0x16A0 + x"32",x"1C",x"52",x"32",x"1D",x"52",x"3E",x"11", -- 0x16A8 + x"32",x"78",x"40",x"32",x"76",x"40",x"3E",x"10", -- 0x16B0 + x"32",x"77",x"40",x"AF",x"32",x"7E",x"40",x"32", -- 0x16B8 + x"7B",x"40",x"32",x"80",x"40",x"3E",x"0A",x"32", -- 0x16C0 + x"7C",x"40",x"32",x"7D",x"40",x"3E",x"10",x"32", -- 0x16C8 + x"7F",x"40",x"3E",x"00",x"32",x"02",x"60",x"3E", -- 0x16D0 + x"02",x"32",x"08",x"41",x"3E",x"00",x"32",x"91", -- 0x16D8 + x"40",x"3E",x"00",x"32",x"17",x"41",x"AF",x"32", -- 0x16E0 + x"A6",x"41",x"32",x"A8",x"41",x"3E",x"00",x"32", -- 0x16E8 + x"1C",x"41",x"CD",x"79",x"18",x"21",x"31",x"41", -- 0x16F0 + x"3E",x"22",x"96",x"FE",x"1E",x"D2",x"02",x"17", -- 0x16F8 + x"3E",x"1E",x"32",x"18",x"41",x"21",x"19",x"41", -- 0x1700 + x"3A",x"31",x"41",x"C6",x"02",x"E6",x"03",x"CA", -- 0x1708 + x"13",x"17",x"34",x"21",x"1A",x"41",x"3A",x"31", -- 0x1710 + x"41",x"C6",x"02",x"E6",x"04",x"CA",x"2C",x"17", -- 0x1718 + x"7E",x"3D",x"FE",x"01",x"DA",x"2C",x"17",x"35", -- 0x1720 + x"21",x"19",x"41",x"35",x"3A",x"31",x"41",x"CB", -- 0x1728 + x"27",x"47",x"3E",x"08",x"90",x"DA",x"42",x"17", -- 0x1730 + x"FE",x"04",x"D2",x"3F",x"17",x"3E",x"04",x"32", -- 0x1738 + x"1E",x"41",x"3A",x"00",x"40",x"C6",x"06",x"32", -- 0x1740 + x"00",x"40",x"C9",x"3E",x"08",x"32",x"08",x"41", -- 0x1748 + x"CD",x"2D",x"18",x"3E",x"01",x"32",x"91",x"40", -- 0x1750 + x"3E",x"20",x"32",x"90",x"40",x"3E",x"02",x"32", -- 0x1758 + x"17",x"41",x"3E",x"00",x"32",x"02",x"60",x"CD", -- 0x1760 + x"79",x"18",x"3A",x"00",x"40",x"C6",x"F4",x"32", -- 0x1768 + x"00",x"40",x"C9",x"CD",x"08",x"04",x"CD",x"84", -- 0x1770 + x"28",x"CD",x"4D",x"05",x"3A",x"08",x"41",x"FE", -- 0x1778 + x"0E",x"CA",x"AD",x"11",x"CD",x"FE",x"0F",x"CD", -- 0x1780 + x"97",x"07",x"CD",x"EB",x"0D",x"CD",x"A0",x"0E", -- 0x1788 + x"3A",x"08",x"41",x"FE",x"06",x"C0",x"3A",x"0B", -- 0x1790 + x"41",x"A7",x"C0",x"3A",x"1E",x"40",x"A7",x"C0", -- 0x1798 + x"3E",x"01",x"32",x"7B",x"40",x"3A",x"0D",x"41", -- 0x17A0 + x"A7",x"C0",x"AF",x"32",x"00",x"68",x"32",x"01", -- 0x17A8 + x"68",x"32",x"02",x"68",x"3E",x"06",x"32",x"06", -- 0x17B0 + x"41",x"3A",x"00",x"40",x"C6",x"FA",x"32",x"00", -- 0x17B8 + x"40",x"C9",x"CD",x"26",x"1C",x"CD",x"49",x"19", -- 0x17C0 + x"CD",x"99",x"1F",x"CD",x"8C",x"1D",x"CD",x"62", -- 0x17C8 + x"1E",x"CD",x"AF",x"1D",x"3A",x"08",x"41",x"FE", -- 0x17D0 + x"0E",x"C2",x"E8",x"17",x"CD",x"FC",x"26",x"CD", -- 0x17D8 + x"2D",x"18",x"CD",x"54",x"18",x"C3",x"AD",x"11", -- 0x17E0 + x"FE",x"12",x"C0",x"CD",x"FC",x"26",x"CD",x"2D", -- 0x17E8 + x"18",x"3A",x"1B",x"41",x"E6",x"FE",x"C6",x"79", -- 0x17F0 + x"47",x"3A",x"AA",x"41",x"90",x"32",x"A2",x"41", -- 0x17F8 + x"32",x"A4",x"41",x"CD",x"B1",x"26",x"3E",x"60", -- 0x1800 + x"32",x"FC",x"51",x"3C",x"32",x"FD",x"51",x"3C", -- 0x1808 + x"32",x"1C",x"52",x"3C",x"32",x"1D",x"52",x"3E", -- 0x1810 + x"06",x"32",x"08",x"41",x"CD",x"54",x"18",x"3A", -- 0x1818 + x"00",x"40",x"C6",x"FA",x"32",x"00",x"40",x"3E", -- 0x1820 + x"08",x"32",x"06",x"41",x"C9",x"3E",x"04",x"32", -- 0x1828 + x"A7",x"41",x"32",x"A9",x"41",x"3E",x"02",x"32", -- 0x1830 + x"79",x"41",x"21",x"FE",x"53",x"11",x"DF",x"FF", -- 0x1838 + x"06",x"20",x"3E",x"90",x"77",x"23",x"3C",x"77", -- 0x1840 + x"3C",x"FE",x"9A",x"C2",x"50",x"18",x"3E",x"90", -- 0x1848 + x"19",x"10",x"F1",x"C9",x"AF",x"21",x"6E",x"41", -- 0x1850 + x"06",x"34",x"77",x"23",x"10",x"FC",x"3E",x"02", -- 0x1858 + x"32",x"79",x"41",x"32",x"9D",x"41",x"07",x"32", -- 0x1860 + x"9B",x"41",x"3E",x"05",x"32",x"A1",x"41",x"21", -- 0x1868 + x"80",x"52",x"11",x"F5",x"03",x"CD",x"E7",x"26", -- 0x1870 + x"C9",x"21",x"80",x"52",x"11",x"F0",x"18",x"CD", -- 0x1878 + x"E7",x"26",x"21",x"60",x"51",x"22",x"97",x"40", -- 0x1880 + x"3E",x"05",x"32",x"95",x"40",x"3E",x"35",x"32", -- 0x1888 + x"96",x"40",x"C9",x"3A",x"31",x"41",x"C6",x"03", -- 0x1890 + x"FE",x"06",x"DA",x"9F",x"18",x"3E",x"05",x"32", -- 0x1898 + x"27",x"41",x"3A",x"31",x"41",x"3C",x"CB",x"27", -- 0x18A0 + x"32",x"30",x"41",x"3A",x"31",x"41",x"2F",x"21", -- 0x18A8 + x"FF",x"FF",x"0F",x"CB",x"1C",x"0F",x"CB",x"1C", -- 0x18B0 + x"22",x"32",x"41",x"C9",x"C9",x"C9",x"C9",x"C9", -- 0x18B8 + x"C9",x"C9",x"50",x"49",x"53",x"43",x"45",x"53", -- 0x18C0 + x"FF",x"50",x"4C",x"41",x"59",x"45",x"52",x"20", -- 0x18C8 + x"4F",x"4E",x"45",x"FF",x"50",x"4C",x"41",x"59", -- 0x18D0 + x"45",x"52",x"20",x"54",x"57",x"4F",x"FF",x"47", -- 0x18D8 + x"41",x"4D",x"45",x"20",x"20",x"4F",x"56",x"45", -- 0x18E0 + x"52",x"FF",x"20",x"20",x"20",x"20",x"30",x"FF", -- 0x18E8 + x"46",x"55",x"45",x"4C",x"40",x"99",x"99",x"99", -- 0x18F0 + x"99",x"99",x"FF",x"3A",x"3B",x"3C",x"3D",x"3E", -- 0x18F8 + x"3F",x"5C",x"5D",x"5E",x"5F",x"60",x"61",x"62", -- 0x1900 + x"63",x"64",x"65",x"66",x"67",x"68",x"69",x"6A", -- 0x1908 + x"FF",x"6B",x"6C",x"6D",x"6E",x"6F",x"70",x"71", -- 0x1910 + x"72",x"73",x"BF",x"C0",x"C1",x"C2",x"C3",x"C4", -- 0x1918 + x"C5",x"C6",x"C7",x"C8",x"C9",x"CA",x"FF",x"CB", -- 0x1920 + x"CC",x"CD",x"CE",x"20",x"CF",x"D0",x"D1",x"D2", -- 0x1928 + x"D3",x"D4",x"D5",x"D6",x"20",x"D7",x"D8",x"D9", -- 0x1930 + x"DA",x"DB",x"DC",x"FF",x"DD",x"DE",x"DF",x"E0", -- 0x1938 + x"20",x"20",x"E1",x"20",x"20",x"20",x"E2",x"E3", -- 0x1940 + x"FF",x"DD",x"21",x"AA",x"41",x"3A",x"08",x"41", -- 0x1948 + x"FE",x"00",x"CA",x"47",x"1A",x"FE",x"02",x"CA", -- 0x1950 + x"1B",x"1A",x"FE",x"04",x"CA",x"1B",x"1B",x"FE", -- 0x1958 + x"08",x"CA",x"74",x"19",x"FE",x"0C",x"CA",x"9C", -- 0x1960 + x"19",x"FE",x"0A",x"CA",x"D8",x"19",x"FE",x"10", -- 0x1968 + x"CA",x"0E",x"1A",x"C9",x"21",x"0A",x"41",x"35", -- 0x1970 + x"C0",x"DD",x"36",x"00",x"80",x"DD",x"36",x"03", -- 0x1978 + x"10",x"DD",x"36",x"01",x"18",x"DD",x"36",x"02", -- 0x1980 + x"07",x"3E",x"11",x"32",x"76",x"40",x"32",x"78", -- 0x1988 + x"40",x"3E",x"10",x"32",x"77",x"40",x"3E",x"00", -- 0x1990 + x"32",x"08",x"41",x"C9",x"AF",x"32",x"03",x"68", -- 0x1998 + x"11",x"1D",x"2A",x"CD",x"1F",x"27",x"CD",x"86", -- 0x19A0 + x"20",x"DD",x"7E",x"00",x"DD",x"77",x"04",x"DD", -- 0x19A8 + x"7E",x"03",x"C6",x"08",x"DD",x"77",x"07",x"D6", -- 0x19B0 + x"10",x"DD",x"77",x"03",x"3E",x"38",x"DD",x"77", -- 0x19B8 + x"01",x"3C",x"DD",x"77",x"05",x"DD",x"36",x"02", -- 0x19C0 + x"07",x"DD",x"36",x"06",x"07",x"3E",x"0A",x"32", -- 0x19C8 + x"79",x"40",x"3E",x"0A",x"32",x"08",x"41",x"C9", -- 0x19D0 + x"21",x"79",x"40",x"35",x"C0",x"36",x"0A",x"DD", -- 0x19D8 + x"7E",x"01",x"C6",x"02",x"FE",x"40",x"CA",x"F1", -- 0x19E0 + x"19",x"DD",x"77",x"01",x"3C",x"DD",x"77",x"05", -- 0x19E8 + x"C9",x"21",x"AA",x"41",x"06",x"08",x"AF",x"77", -- 0x19F0 + x"23",x"10",x"FC",x"3E",x"04",x"32",x"A7",x"41", -- 0x19F8 + x"32",x"A9",x"41",x"3E",x"80",x"32",x"0A",x"41", -- 0x1A00 + x"3E",x"10",x"32",x"08",x"41",x"C9",x"21",x"0A", -- 0x1A08 + x"41",x"35",x"C0",x"36",x"80",x"3E",x"0E",x"32", -- 0x1A10 + x"08",x"41",x"C9",x"DD",x"7E",x"03",x"A7",x"C2", -- 0x1A18 + x"29",x"1B",x"CD",x"2D",x"18",x"3E",x"01",x"32", -- 0x1A20 + x"91",x"40",x"3E",x"20",x"32",x"90",x"40",x"3E", -- 0x1A28 + x"02",x"32",x"1C",x"41",x"3A",x"1E",x"41",x"32", -- 0x1A30 + x"1D",x"41",x"3E",x"02",x"32",x"17",x"41",x"3E", -- 0x1A38 + x"00",x"32",x"08",x"41",x"C3",x"29",x"1B",x"DD", -- 0x1A40 + x"7E",x"03",x"FE",x"E0",x"C2",x"29",x"1B",x"DD", -- 0x1A48 + x"46",x"10",x"DD",x"7E",x"11",x"FE",x"27",x"CA", -- 0x1A50 + x"6D",x"1A",x"FE",x"29",x"CA",x"7B",x"1A",x"DD", -- 0x1A58 + x"7E",x"00",x"90",x"D6",x"05",x"FE",x"0C",x"DA", -- 0x1A60 + x"94",x"1A",x"C3",x"86",x"1A",x"DD",x"7E",x"00", -- 0x1A68 + x"90",x"D6",x"02",x"FE",x"0F",x"DA",x"94",x"1A", -- 0x1A70 + x"C3",x"86",x"1A",x"DD",x"7E",x"00",x"90",x"D6", -- 0x1A78 + x"04",x"FE",x"0D",x"DA",x"94",x"1A",x"3E",x"0C", -- 0x1A80 + x"32",x"08",x"41",x"3E",x"07",x"32",x"A7",x"41", -- 0x1A88 + x"32",x"A9",x"41",x"C9",x"3E",x"00",x"32",x"81", -- 0x1A90 + x"40",x"3E",x"04",x"32",x"08",x"41",x"3E",x"00", -- 0x1A98 + x"32",x"1C",x"41",x"21",x"9A",x"40",x"0E",x"00", -- 0x1AA0 + x"71",x"2B",x"71",x"ED",x"5B",x"97",x"40",x"1A", -- 0x1AA8 + x"D6",x"64",x"DA",x"C7",x"1A",x"E6",x"07",x"5F", -- 0x1AB0 + x"3A",x"95",x"40",x"CB",x"27",x"CB",x"27",x"83", -- 0x1AB8 + x"3C",x"11",x"35",x"41",x"CD",x"F2",x"1A",x"DD", -- 0x1AC0 + x"7E",x"15",x"D6",x"26",x"11",x"36",x"41",x"CD", -- 0x1AC8 + x"F2",x"1A",x"3A",x"1E",x"41",x"2F",x"0F",x"0F", -- 0x1AD0 + x"E6",x"07",x"C6",x"04",x"11",x"37",x"41",x"CD", -- 0x1AD8 + x"F2",x"1A",x"CD",x"4A",x"28",x"3E",x"03",x"32", -- 0x1AE0 + x"91",x"40",x"3E",x"04",x"32",x"90",x"40",x"C3", -- 0x1AE8 + x"E9",x"1F",x"01",x"00",x"00",x"08",x"08",x"3D", -- 0x1AF0 + x"CA",x"08",x"1B",x"08",x"1A",x"81",x"27",x"4F", -- 0x1AF8 + x"78",x"CE",x"00",x"27",x"47",x"C3",x"F6",x"1A", -- 0x1B00 + x"79",x"CD",x"2B",x"28",x"78",x"CD",x"18",x"28", -- 0x1B08 + x"79",x"86",x"27",x"77",x"23",x"78",x"8E",x"27", -- 0x1B10 + x"77",x"2B",x"C9",x"21",x"81",x"40",x"35",x"C0", -- 0x1B18 + x"CD",x"86",x"20",x"3E",x"12",x"32",x"08",x"41", -- 0x1B20 + x"C9",x"3A",x"05",x"40",x"E6",x"0C",x"CA",x"85", -- 0x1B28 + x"1B",x"FE",x"0C",x"CA",x"85",x"1B",x"CB",x"57", -- 0x1B30 + x"21",x"7B",x"40",x"C2",x"53",x"1B",x"34",x"7E", -- 0x1B38 + x"FE",x"08",x"DA",x"89",x"1B",x"36",x"00",x"23", -- 0x1B40 + x"3A",x"7E",x"40",x"FE",x"01",x"CA",x"67",x"1B", -- 0x1B48 + x"C3",x"7A",x"1B",x"35",x"7E",x"ED",x"44",x"FE", -- 0x1B50 + x"08",x"DA",x"89",x"1B",x"36",x"00",x"23",x"3A", -- 0x1B58 + x"7E",x"40",x"FE",x"01",x"CA",x"7A",x"1B",x"34", -- 0x1B60 + x"7E",x"FE",x"0B",x"DA",x"89",x"1B",x"35",x"3A", -- 0x1B68 + x"7E",x"40",x"EE",x"01",x"32",x"7E",x"40",x"C3", -- 0x1B70 + x"89",x"1B",x"35",x"7E",x"FE",x"01",x"D2",x"89", -- 0x1B78 + x"1B",x"34",x"C3",x"89",x"1B",x"AF",x"32",x"7B", -- 0x1B80 + x"40",x"21",x"7D",x"40",x"35",x"C2",x"C4",x"1B", -- 0x1B88 + x"3A",x"7E",x"40",x"FE",x"01",x"DD",x"7E",x"00", -- 0x1B90 + x"CA",x"A6",x"1B",x"FE",x"E1",x"CA",x"AB",x"1B", -- 0x1B98 + x"DD",x"34",x"00",x"C3",x"BE",x"1B",x"FE",x"0F", -- 0x1BA0 + x"C2",x"BB",x"1B",x"3E",x"0A",x"32",x"7C",x"40", -- 0x1BA8 + x"3A",x"7E",x"40",x"EE",x"01",x"32",x"7E",x"40", -- 0x1BB0 + x"C3",x"BE",x"1B",x"DD",x"35",x"00",x"3A",x"7C", -- 0x1BB8 + x"40",x"32",x"7D",x"40",x"21",x"7F",x"40",x"35", -- 0x1BC0 + x"C2",x"D9",x"1B",x"36",x"10",x"3A",x"7C",x"40", -- 0x1BC8 + x"FE",x"0A",x"CA",x"D9",x"1B",x"3C",x"32",x"7C", -- 0x1BD0 + x"40",x"21",x"76",x"40",x"35",x"C2",x"FD",x"1B", -- 0x1BD8 + x"3A",x"78",x"40",x"77",x"3A",x"80",x"40",x"FE", -- 0x1BE0 + x"01",x"CA",x"FA",x"1B",x"DD",x"7E",x"03",x"FE", -- 0x1BE8 + x"10",x"CA",x"FD",x"1B",x"DD",x"35",x"03",x"C3", -- 0x1BF0 + x"FD",x"1B",x"DD",x"34",x"03",x"23",x"35",x"C0", -- 0x1BF8 + x"36",x"0F",x"3A",x"80",x"40",x"FE",x"01",x"CA", -- 0x1C00 + x"1C",x"1C",x"23",x"34",x"34",x"7E",x"FE",x"12", -- 0x1C08 + x"D8",x"35",x"35",x"3A",x"80",x"40",x"EE",x"01", -- 0x1C10 + x"32",x"80",x"40",x"C9",x"23",x"35",x"35",x"7E", -- 0x1C18 + x"FE",x"02",x"D0",x"34",x"34",x"C9",x"3A",x"08", -- 0x1C20 + x"41",x"FE",x"03",x"D0",x"DD",x"21",x"AA",x"41", -- 0x1C28 + x"DD",x"7E",x"03",x"CB",x"3F",x"CB",x"3F",x"E6", -- 0x1C30 + x"3E",x"5F",x"CB",x"3F",x"16",x"00",x"FD",x"21", -- 0x1C38 + x"6A",x"41",x"FD",x"19",x"5F",x"16",x"50",x"ED", -- 0x1C40 + x"53",x"85",x"40",x"DD",x"7E",x"03",x"E6",x"07", -- 0x1C48 + x"3C",x"32",x"82",x"40",x"3E",x"03",x"32",x"87", -- 0x1C50 + x"40",x"DD",x"7E",x"00",x"C6",x"02",x"FD",x"96", -- 0x1C58 + x"00",x"06",x"00",x"CB",x"27",x"CB",x"10",x"CB", -- 0x1C60 + x"27",x"CB",x"10",x"E6",x"E0",x"4F",x"21",x"E0", -- 0x1C68 + x"03",x"ED",x"42",x"7C",x"FE",x"04",x"DA",x"7E", -- 0x1C70 + x"1C",x"01",x"0E",x"03",x"ED",x"42",x"ED",x"5B", -- 0x1C78 + x"85",x"40",x"19",x"22",x"89",x"40",x"DD",x"7E", -- 0x1C80 + x"00",x"FD",x"96",x"00",x"ED",x"44",x"C6",x"05", -- 0x1C88 + x"E6",x"07",x"CB",x"27",x"4F",x"06",x"00",x"21", -- 0x1C90 + x"DA",x"2B",x"09",x"22",x"83",x"40",x"3E",x"03", -- 0x1C98 + x"32",x"88",x"40",x"2A",x"89",x"40",x"7E",x"D6", -- 0x1CA0 + x"0A",x"FE",x"06",x"D2",x"42",x"1D",x"CB",x"27", -- 0x1CA8 + x"4F",x"06",x"00",x"21",x"18",x"2C",x"09",x"5E", -- 0x1CB0 + x"23",x"56",x"2A",x"83",x"40",x"3E",x"08",x"47", -- 0x1CB8 + x"32",x"8B",x"40",x"3A",x"87",x"40",x"FE",x"03", -- 0x1CC0 + x"CA",x"FC",x"1C",x"FE",x"02",x"CA",x"1B",x"1D", -- 0x1CC8 + x"23",x"3A",x"82",x"40",x"4F",x"7E",x"06",x"00", -- 0x1CD0 + x"0D",x"CA",x"E3",x"1C",x"CB",x"3F",x"CB",x"18", -- 0x1CD8 + x"C3",x"D8",x"1C",x"EB",x"78",x"AE",x"A0",x"B8", -- 0x1CE0 + x"C2",x"81",x"1D",x"EB",x"23",x"23",x"13",x"3A", -- 0x1CE8 + x"8B",x"40",x"3D",x"32",x"8B",x"40",x"C2",x"D1", -- 0x1CF0 + x"1C",x"C3",x"42",x"1D",x"3A",x"82",x"40",x"4F", -- 0x1CF8 + x"7E",x"0D",x"CA",x"0A",x"1D",x"CB",x"3F",x"C3", -- 0x1D00 + x"01",x"1D",x"EB",x"4F",x"AE",x"A1",x"B9",x"C2", -- 0x1D08 + x"81",x"1D",x"EB",x"23",x"23",x"13",x"10",x"E4", -- 0x1D10 + x"C3",x"42",x"1D",x"3A",x"82",x"40",x"4F",x"7E", -- 0x1D18 + x"23",x"46",x"0D",x"CA",x"2D",x"1D",x"CB",x"3F", -- 0x1D20 + x"CB",x"18",x"C3",x"22",x"1D",x"EB",x"78",x"AE", -- 0x1D28 + x"A0",x"B8",x"C2",x"81",x"1D",x"EB",x"23",x"13", -- 0x1D30 + x"3A",x"8B",x"40",x"3D",x"32",x"8B",x"40",x"C2", -- 0x1D38 + x"1B",x"1D",x"21",x"88",x"40",x"35",x"CA",x"71", -- 0x1D40 + x"1D",x"2A",x"83",x"40",x"01",x"10",x"00",x"09", -- 0x1D48 + x"22",x"83",x"40",x"2A",x"89",x"40",x"7D",x"E6", -- 0x1D50 + x"E0",x"6F",x"7C",x"E6",x"0F",x"B5",x"2A",x"89", -- 0x1D58 + x"40",x"01",x"E0",x"FF",x"C2",x"6A",x"1D",x"01", -- 0x1D60 + x"E0",x"03",x"09",x"22",x"89",x"40",x"C3",x"A6", -- 0x1D68 + x"1C",x"21",x"87",x"40",x"35",x"C8",x"21",x"85", -- 0x1D70 + x"40",x"34",x"FD",x"23",x"FD",x"23",x"C3",x"59", -- 0x1D78 + x"1C",x"2A",x"89",x"40",x"36",x"10",x"3E",x"0C", -- 0x1D80 + x"32",x"08",x"41",x"C9",x"3A",x"1C",x"41",x"FE", -- 0x1D88 + x"02",x"C0",x"21",x"1D",x"41",x"35",x"C0",x"3A", -- 0x1D90 + x"1E",x"41",x"77",x"21",x"A6",x"41",x"34",x"23", -- 0x1D98 + x"23",x"34",x"3A",x"91",x"40",x"FE",x"02",x"C0", -- 0x1DA0 + x"DD",x"34",x"10",x"DD",x"34",x"14",x"C9",x"DD", -- 0x1DA8 + x"21",x"AA",x"41",x"3A",x"91",x"40",x"FE",x"01", -- 0x1DB0 + x"CA",x"21",x"1E",x"FE",x"02",x"CA",x"15",x"1E", -- 0x1DB8 + x"FE",x"03",x"CA",x"FA",x"1D",x"FE",x"04",x"C0", -- 0x1DC0 + x"21",x"90",x"40",x"35",x"C0",x"36",x"04",x"21", -- 0x1DC8 + x"20",x"52",x"11",x"9A",x"40",x"01",x"E0",x"FF", -- 0x1DD0 + x"1A",x"E6",x"0F",x"CA",x"DF",x"1D",x"77",x"09", -- 0x1DD8 + x"1B",x"1A",x"0F",x"0F",x"0F",x"0F",x"E6",x"0F", -- 0x1DE0 + x"00",x"00",x"00",x"77",x"09",x"1A",x"E6",x"0F", -- 0x1DE8 + x"77",x"09",x"36",x"00",x"3E",x"03",x"32",x"91", -- 0x1DF0 + x"40",x"C9",x"21",x"90",x"40",x"35",x"C0",x"36", -- 0x1DF8 + x"04",x"21",x"80",x"52",x"11",x"E0",x"FF",x"06", -- 0x1E00 + x"0A",x"3E",x"10",x"77",x"19",x"10",x"FC",x"3E", -- 0x1E08 + x"04",x"32",x"91",x"40",x"C9",x"DD",x"7E",x"10", -- 0x1E10 + x"FE",x"FF",x"C0",x"3E",x"01",x"32",x"91",x"40", -- 0x1E18 + x"C9",x"21",x"90",x"40",x"35",x"C0",x"CD",x"09", -- 0x1E20 + x"28",x"47",x"3A",x"1F",x"41",x"A0",x"3C",x"77", -- 0x1E28 + x"AF",x"DD",x"77",x"10",x"3E",x"10",x"DD",x"77", -- 0x1E30 + x"14",x"DD",x"36",x"12",x"06",x"DD",x"36",x"16", -- 0x1E38 + x"06",x"DD",x"36",x"13",x"F0",x"DD",x"36",x"17", -- 0x1E40 + x"F0",x"CD",x"09",x"28",x"E6",x"06",x"C2",x"53", -- 0x1E48 + x"1E",x"3C",x"3C",x"C6",x"25",x"DD",x"77",x"11", -- 0x1E50 + x"3C",x"DD",x"77",x"15",x"3E",x"02",x"32",x"91", -- 0x1E58 + x"40",x"C9",x"3A",x"17",x"41",x"FE",x"02",x"CA", -- 0x1E60 + x"70",x"1E",x"FE",x"04",x"CA",x"0E",x"1F",x"C9", -- 0x1E68 + x"DD",x"21",x"EA",x"41",x"FD",x"21",x"A0",x"41", -- 0x1E70 + x"D9",x"11",x"1B",x"50",x"D9",x"06",x"1A",x"3A", -- 0x1E78 + x"1A",x"41",x"4F",x"CD",x"09",x"28",x"E6",x"01", -- 0x1E80 + x"DD",x"77",x"00",x"3A",x"18",x"41",x"90",x"CB", -- 0x1E88 + x"3F",x"DD",x"77",x"02",x"DD",x"77",x"03",x"CD", -- 0x1E90 + x"09",x"28",x"E6",x"07",x"3C",x"3C",x"DD",x"77", -- 0x1E98 + x"05",x"DD",x"36",x"01",x"00",x"DD",x"36",x"04", -- 0x1EA0 + x"00",x"0D",x"C2",x"EE",x"1E",x"CD",x"09",x"28", -- 0x1EA8 + x"E6",x"01",x"4F",x"3A",x"19",x"41",x"81",x"DD", -- 0x1EB0 + x"77",x"04",x"3A",x"1A",x"41",x"4F",x"78",x"FE", -- 0x1EB8 + x"05",x"DA",x"EE",x"1E",x"D9",x"DD",x"46",x"04", -- 0x1EC0 + x"DD",x"70",x"01",x"26",x"00",x"CD",x"09",x"28", -- 0x1EC8 + x"CB",x"27",x"CB",x"14",x"CB",x"27",x"CB",x"14", -- 0x1ED0 + x"E6",x"E0",x"6F",x"19",x"CD",x"09",x"28",x"E6", -- 0x1ED8 + x"07",x"C6",x"0A",x"FE",x"10",x"DA",x"EA",x"1E", -- 0x1EE0 + x"D6",x"02",x"77",x"10",x"DE",x"D9",x"CD",x"09", -- 0x1EE8 + x"28",x"FD",x"77",x"00",x"FD",x"36",x"01",x"06", -- 0x1EF0 + x"FD",x"2B",x"FD",x"2B",x"11",x"06",x"00",x"DD", -- 0x1EF8 + x"19",x"D9",x"1B",x"D9",x"05",x"C2",x"83",x"1E", -- 0x1F00 + x"3E",x"04",x"32",x"17",x"41",x"C9",x"DD",x"21", -- 0x1F08 + x"EA",x"41",x"FD",x"21",x"A0",x"41",x"11",x"1B", -- 0x1F10 + x"50",x"62",x"6B",x"DD",x"35",x"03",x"C2",x"88", -- 0x1F18 + x"1F",x"DD",x"7E",x"02",x"DD",x"77",x"03",x"FD", -- 0x1F20 + x"34",x"00",x"DD",x"CB",x"00",x"46",x"CA",x"37", -- 0x1F28 + x"1F",x"FD",x"35",x"00",x"FD",x"35",x"00",x"FD", -- 0x1F30 + x"7E",x"00",x"E6",x"07",x"C2",x"88",x"1F",x"06", -- 0x1F38 + x"00",x"FD",x"7E",x"00",x"CB",x"27",x"CB",x"10", -- 0x1F40 + x"CB",x"27",x"CB",x"10",x"E6",x"E0",x"4F",x"09", -- 0x1F48 + x"7E",x"36",x"10",x"FE",x"10",x"CA",x"5B",x"1F", -- 0x1F50 + x"DD",x"35",x"01",x"DD",x"7E",x"01",x"DD",x"BE", -- 0x1F58 + x"04",x"D2",x"88",x"1F",x"DD",x"35",x"05",x"C2", -- 0x1F60 + x"88",x"1F",x"CD",x"09",x"28",x"E6",x"07",x"3C", -- 0x1F68 + x"DD",x"77",x"05",x"CD",x"09",x"28",x"0F",x"0F", -- 0x1F70 + x"0F",x"E6",x"07",x"C6",x"0A",x"FE",x"10",x"DA", -- 0x1F78 + x"84",x"1F",x"D6",x"02",x"77",x"DD",x"34",x"01", -- 0x1F80 + x"FD",x"2B",x"FD",x"2B",x"01",x"06",x"00",x"DD", -- 0x1F88 + x"09",x"1B",x"7B",x"FE",x"01",x"C2",x"19",x"1F", -- 0x1F90 + x"C9",x"3A",x"08",x"41",x"FE",x"00",x"C0",x"DD", -- 0x1F98 + x"21",x"AA",x"41",x"DD",x"7E",x"03",x"FE",x"10", -- 0x1FA0 + x"D8",x"DD",x"7E",x"05",x"A7",x"C2",x"E1",x"1F", -- 0x1FA8 + x"3A",x"95",x"40",x"A7",x"C8",x"3A",x"05",x"40", -- 0x1FB0 + x"CB",x"67",x"C8",x"3E",x"05",x"32",x"7A",x"40", -- 0x1FB8 + x"DD",x"36",x"05",x"1B",x"DD",x"36",x"06",x"07", -- 0x1FC0 + x"3E",x"03",x"32",x"6E",x"40",x"DD",x"7E",x"00", -- 0x1FC8 + x"DD",x"77",x"04",x"DD",x"7E",x"03",x"C6",x"0E", -- 0x1FD0 + x"DD",x"77",x"07",x"3E",x"01",x"32",x"03",x"68", -- 0x1FD8 + x"C9",x"3A",x"05",x"40",x"CB",x"67",x"C2",x"F7", -- 0x1FE0 + x"1F",x"21",x"AE",x"41",x"06",x"04",x"AF",x"77", -- 0x1FE8 + x"23",x"10",x"FC",x"32",x"03",x"68",x"C9",x"21", -- 0x1FF0 + x"96",x"40",x"35",x"C2",x"36",x"20",x"36",x"35", -- 0x1FF8 + x"2A",x"97",x"40",x"7E",x"3D",x"FE",x"64",x"C2", -- 0x2000 + x"35",x"20",x"21",x"95",x"40",x"35",x"C2",x"1D", -- 0x2008 + x"20",x"21",x"97",x"29",x"22",x"0C",x"40",x"22", -- 0x2010 + x"0E",x"40",x"C3",x"E9",x"1F",x"7E",x"FE",x"02", -- 0x2018 + x"C2",x"29",x"20",x"11",x"31",x"2A",x"CD",x"1F", -- 0x2020 + x"27",x"2A",x"97",x"40",x"01",x"20",x"00",x"09", -- 0x2028 + x"22",x"97",x"40",x"3E",x"68",x"77",x"DD",x"7E", -- 0x2030 + x"00",x"DD",x"77",x"04",x"DD",x"7E",x"03",x"C6", -- 0x2038 + x"0E",x"DD",x"77",x"07",x"21",x"6E",x"40",x"35", -- 0x2040 + x"C2",x"55",x"20",x"36",x"03",x"DD",x"7E",x"05", -- 0x2048 + x"EE",x"34",x"DD",x"77",x"05",x"21",x"7A",x"40", -- 0x2050 + x"35",x"C0",x"36",x"05",x"3A",x"80",x"40",x"FE", -- 0x2058 + x"01",x"CA",x"6F",x"20",x"3A",x"78",x"40",x"3D", -- 0x2060 + x"3D",x"FE",x"02",x"D8",x"C3",x"82",x"20",x"3A", -- 0x2068 + x"78",x"40",x"3C",x"3C",x"FE",x"12",x"DA",x"82", -- 0x2070 + x"20",x"3A",x"80",x"40",x"EE",x"01",x"32",x"80", -- 0x2078 + x"40",x"C9",x"32",x"78",x"40",x"C9",x"21",x"BA", -- 0x2080 + x"41",x"AF",x"06",x"08",x"77",x"23",x"10",x"FC", -- 0x2088 + x"C9",x"3A",x"92",x"40",x"FE",x"01",x"CA",x"B2", -- 0x2090 + x"21",x"FE",x"03",x"CA",x"B2",x"20",x"FE",x"02", -- 0x2098 + x"C0",x"3A",x"08",x"41",x"FE",x"10",x"C2",x"B2", -- 0x20A0 + x"20",x"AF",x"32",x"94",x"40",x"3E",x"03",x"32", -- 0x20A8 + x"92",x"40",x"DD",x"21",x"C2",x"42",x"FD",x"21", -- 0x20B0 + x"94",x"40",x"21",x"65",x"52",x"06",x"20",x"DD", -- 0x20B8 + x"7E",x"00",x"A7",x"CA",x"EA",x"20",x"DD",x"35", -- 0x20C0 + x"00",x"C2",x"EA",x"20",x"CD",x"09",x"28",x"E6", -- 0x20C8 + x"0E",x"3C",x"DD",x"77",x"00",x"CD",x"09",x"28", -- 0x20D0 + x"DD",x"A6",x"01",x"DD",x"86",x"02",x"FD",x"A6", -- 0x20D8 + x"00",x"C2",x"E9",x"20",x"DD",x"77",x"00",x"3E", -- 0x20E0 + x"10",x"77",x"23",x"78",x"E6",x"03",x"FE",x"01", -- 0x20E8 + x"C2",x"F7",x"20",x"11",x"DC",x"FF",x"19",x"11", -- 0x20F0 + x"03",x"00",x"DD",x"19",x"10",x"C1",x"DD",x"21", -- 0x20F8 + x"AA",x"41",x"21",x"22",x"41",x"35",x"C2",x"22", -- 0x2100 + x"21",x"CD",x"09",x"28",x"E6",x"0F",x"3C",x"77", -- 0x2108 + x"CD",x"09",x"28",x"E6",x"03",x"3C",x"32",x"75", -- 0x2110 + x"41",x"32",x"77",x"41",x"32",x"79",x"41",x"32", -- 0x2118 + x"7B",x"41",x"21",x"23",x"41",x"35",x"C2",x"5C", -- 0x2120 + x"21",x"3A",x"24",x"41",x"77",x"3A",x"9D",x"40", -- 0x2128 + x"FE",x"00",x"C2",x"5C",x"21",x"3A",x"25",x"41", -- 0x2130 + x"A7",x"3A",x"74",x"41",x"CA",x"49",x"21",x"3C", -- 0x2138 + x"DD",x"34",x"18",x"DD",x"34",x"1C",x"C3",x"50", -- 0x2140 + x"21",x"3D",x"DD",x"35",x"18",x"DD",x"35",x"1C", -- 0x2148 + x"32",x"74",x"41",x"32",x"76",x"41",x"32",x"78", -- 0x2150 + x"41",x"32",x"7A",x"41",x"21",x"26",x"41",x"35", -- 0x2158 + x"C2",x"7C",x"21",x"3E",x"30",x"32",x"26",x"41", -- 0x2160 + x"3A",x"A2",x"41",x"D6",x"84",x"47",x"DD",x"7E", -- 0x2168 + x"18",x"90",x"06",x"00",x"D2",x"78",x"21",x"04", -- 0x2170 + x"78",x"32",x"25",x"41",x"3A",x"A2",x"41",x"D6", -- 0x2178 + x"84",x"47",x"DD",x"7E",x"18",x"90",x"06",x"03", -- 0x2180 + x"D2",x"8F",x"21",x"06",x"01",x"ED",x"44",x"FE", -- 0x2188 + x"23",x"D2",x"96",x"21",x"06",x"00",x"3E",x"16", -- 0x2190 + x"A8",x"DD",x"77",x"19",x"3A",x"9D",x"40",x"FE", -- 0x2198 + x"00",x"C0",x"3A",x"08",x"41",x"FE",x"06",x"3E", -- 0x21A0 + x"10",x"CA",x"AE",x"21",x"3E",x"0F",x"DD",x"77", -- 0x21A8 + x"1D",x"C9",x"21",x"93",x"40",x"35",x"C0",x"3E", -- 0x21B0 + x"02",x"32",x"75",x"41",x"32",x"77",x"41",x"32", -- 0x21B8 + x"79",x"41",x"32",x"7B",x"41",x"AF",x"32",x"74", -- 0x21C0 + x"41",x"32",x"76",x"41",x"32",x"78",x"41",x"32", -- 0x21C8 + x"7A",x"41",x"21",x"C2",x"42",x"11",x"54",x"2C", -- 0x21D0 + x"06",x"60",x"1A",x"77",x"23",x"13",x"10",x"FA", -- 0x21D8 + x"DD",x"21",x"AA",x"41",x"DD",x"36",x"18",x"7A", -- 0x21E0 + x"DD",x"36",x"19",x"16",x"DD",x"36",x"1A",x"07", -- 0x21E8 + x"DD",x"36",x"1B",x"30",x"DD",x"36",x"1C",x"7A", -- 0x21F0 + x"DD",x"36",x"1D",x"10",x"DD",x"36",x"1E",x"07", -- 0x21F8 + x"DD",x"36",x"1F",x"34",x"3E",x"10",x"32",x"22", -- 0x2200 + x"41",x"3A",x"24",x"41",x"32",x"23",x"41",x"CD", -- 0x2208 + x"09",x"28",x"E6",x"01",x"32",x"25",x"41",x"3A", -- 0x2210 + x"30",x"00",x"32",x"26",x"41",x"3E",x"FF",x"32", -- 0x2218 + x"94",x"40",x"3E",x"02",x"32",x"92",x"40",x"C9", -- 0x2220 + x"3A",x"08",x"41",x"FE",x"06",x"C0",x"3A",x"92", -- 0x2228 + x"40",x"FE",x"02",x"C0",x"21",x"1D",x"40",x"35", -- 0x2230 + x"C0",x"3A",x"74",x"41",x"47",x"3A",x"A2",x"41", -- 0x2238 + x"90",x"D2",x"46",x"22",x"ED",x"44",x"CB",x"3F", -- 0x2240 + x"CB",x"3F",x"CB",x"3F",x"47",x"CD",x"09",x"28", -- 0x2248 + x"E6",x"0F",x"80",x"3C",x"77",x"3A",x"1E",x"40", -- 0x2250 + x"21",x"27",x"41",x"BE",x"C8",x"3A",x"74",x"41", -- 0x2258 + x"C6",x"6B",x"47",x"CD",x"09",x"28",x"E6",x"2F", -- 0x2260 + x"80",x"21",x"C7",x"41",x"11",x"04",x"00",x"06", -- 0x2268 + x"06",x"19",x"BE",x"CA",x"5D",x"22",x"10",x"F9", -- 0x2270 + x"DD",x"21",x"C6",x"41",x"47",x"DD",x"19",x"DD", -- 0x2278 + x"7E",x"01",x"DD",x"B6",x"03",x"C2",x"7D",x"22", -- 0x2280 + x"DD",x"70",x"01",x"3E",x"B9",x"21",x"1B",x"41", -- 0x2288 + x"AE",x"DD",x"77",x"03",x"21",x"1E",x"40",x"34", -- 0x2290 + x"C9",x"21",x"2C",x"41",x"35",x"C0",x"3A",x"2D", -- 0x2298 + x"41",x"77",x"3A",x"08",x"41",x"FE",x"06",x"C0", -- 0x22A0 + x"3A",x"92",x"40",x"FE",x"02",x"C0",x"21",x"0B", -- 0x22A8 + x"41",x"3A",x"0C",x"41",x"BE",x"D0",x"21",x"29", -- 0x22B0 + x"41",x"BE",x"C8",x"DD",x"21",x"C6",x"41",x"FD", -- 0x22B8 + x"21",x"A6",x"41",x"01",x"24",x"00",x"11",x"04", -- 0x22C0 + x"00",x"DD",x"09",x"FD",x"19",x"DD",x"7E",x"00", -- 0x22C8 + x"FE",x"00",x"C2",x"C9",x"22",x"DD",x"36",x"00", -- 0x22D0 + x"02",x"CD",x"09",x"28",x"E6",x"01",x"DD",x"77", -- 0x22D8 + x"05",x"3A",x"28",x"41",x"DD",x"77",x"06",x"3A", -- 0x22E0 + x"2B",x"41",x"DD",x"77",x"04",x"3A",x"2F",x"41", -- 0x22E8 + x"DD",x"77",x"08",x"CD",x"09",x"28",x"21",x"2A", -- 0x22F0 + x"41",x"A6",x"3C",x"DD",x"77",x"03",x"DD",x"36", -- 0x22F8 + x"01",x"02",x"DD",x"36",x"02",x"01",x"3A",x"2E", -- 0x2300 + x"41",x"DD",x"77",x"07",x"DD",x"36",x"1A",x"07", -- 0x2308 + x"DD",x"36",x"1B",x"08",x"DD",x"36",x"1C",x"08", -- 0x2310 + x"DD",x"36",x"1D",x"0E",x"3A",x"74",x"41",x"C6", -- 0x2318 + x"7A",x"FD",x"77",x"00",x"FD",x"36",x"03",x"38", -- 0x2320 + x"FD",x"36",x"01",x"0B",x"3A",x"75",x"41",x"FD", -- 0x2328 + x"77",x"02",x"21",x"0C",x"41",x"34",x"21",x"CF", -- 0x2330 + x"29",x"22",x"0C",x"40",x"3E",x"01",x"32",x"02", -- 0x2338 + x"40",x"21",x"00",x"00",x"22",x"0E",x"40",x"C9", -- 0x2340 + x"3A",x"0C",x"41",x"A7",x"C8",x"47",x"DD",x"21", -- 0x2348 + x"C6",x"41",x"FD",x"21",x"A6",x"41",x"11",x"24", -- 0x2350 + x"00",x"DD",x"19",x"11",x"04",x"00",x"FD",x"19", -- 0x2358 + x"DD",x"7E",x"00",x"FE",x"00",x"CA",x"56",x"23", -- 0x2360 + x"FE",x"0C",x"C2",x"B5",x"23",x"DD",x"35",x"0A", -- 0x2368 + x"C2",x"F5",x"24",x"DD",x"36",x"0A",x"07",x"FD", -- 0x2370 + x"34",x"01",x"FD",x"7E",x"01",x"FE",x"20",x"C2", -- 0x2378 + x"F5",x"24",x"DD",x"36",x"00",x"00",x"FD",x"36", -- 0x2380 + x"01",x"00",x"FD",x"36",x"00",x"00",x"FD",x"36", -- 0x2388 + x"03",x"00",x"DD",x"7E",x"0D",x"0F",x"0F",x"0F", -- 0x2390 + x"0F",x"E6",x"70",x"CD",x"2B",x"28",x"CD",x"4A", -- 0x2398 + x"28",x"21",x"0C",x"41",x"35",x"2B",x"35",x"7E", -- 0x23A0 + x"FE",x"01",x"C2",x"F5",x"24",x"3E",x"08",x"32", -- 0x23A8 + x"28",x"41",x"C3",x"F5",x"24",x"DD",x"35",x"07", -- 0x23B0 + x"CA",x"C8",x"23",x"21",x"30",x"41",x"3A",x"0B", -- 0x23B8 + x"41",x"BE",x"DA",x"9D",x"24",x"C3",x"F5",x"24", -- 0x23C0 + x"3A",x"2E",x"41",x"DD",x"77",x"07",x"DD",x"7E", -- 0x23C8 + x"00",x"FE",x"05",x"D2",x"FE",x"23",x"DD",x"35", -- 0x23D0 + x"01",x"C2",x"FE",x"23",x"DD",x"36",x"01",x"02", -- 0x23D8 + x"FD",x"7E",x"01",x"DD",x"86",x"02",x"FE",x"0F", -- 0x23E0 + x"D2",x"F0",x"23",x"FE",x"0B",x"D2",x"FB",x"23", -- 0x23E8 + x"DD",x"7E",x"02",x"ED",x"44",x"DD",x"77",x"02", -- 0x23F0 + x"C3",x"E0",x"23",x"FD",x"77",x"01",x"DD",x"35", -- 0x23F8 + x"03",x"C2",x"1F",x"24",x"CD",x"09",x"28",x"21", -- 0x2400 + x"2A",x"41",x"A6",x"3C",x"DD",x"77",x"03",x"FD", -- 0x2408 + x"7E",x"02",x"3C",x"E6",x"03",x"C2",x"19",x"24", -- 0x2410 + x"3C",x"FD",x"77",x"02",x"DD",x"77",x"0D",x"DD", -- 0x2418 + x"7E",x"00",x"FE",x"02",x"C2",x"39",x"24",x"FD", -- 0x2420 + x"35",x"03",x"FD",x"7E",x"03",x"FE",x"10",x"C2", -- 0x2428 + x"9D",x"24",x"DD",x"36",x"00",x"04",x"C3",x"9D", -- 0x2430 + x"24",x"FD",x"34",x"03",x"FD",x"7E",x"03",x"DD", -- 0x2438 + x"BE",x"08",x"DA",x"49",x"24",x"FD",x"34",x"03", -- 0x2440 + x"3C",x"3D",x"FE",x"FE",x"DA",x"5E",x"24",x"3A", -- 0x2448 + x"74",x"41",x"C6",x"7A",x"FD",x"77",x"00",x"DD", -- 0x2450 + x"36",x"00",x"0E",x"C3",x"F5",x"24",x"DD",x"7E", -- 0x2458 + x"00",x"FE",x"04",x"C2",x"7A",x"24",x"FD",x"7E", -- 0x2460 + x"03",x"DD",x"BE",x"04",x"C2",x"7A",x"24",x"FD", -- 0x2468 + x"36",x"01",x"13",x"DD",x"36",x"00",x"10",x"C3", -- 0x2470 + x"9D",x"24",x"DD",x"7E",x"00",x"FE",x"0E",x"C2", -- 0x2478 + x"9D",x"24",x"FD",x"7E",x"03",x"FE",x"38",x"C2", -- 0x2480 + x"F5",x"24",x"DD",x"36",x"00",x"00",x"FD",x"36", -- 0x2488 + x"00",x"00",x"FD",x"36",x"03",x"00",x"21",x"0C", -- 0x2490 + x"41",x"35",x"C3",x"F5",x"24",x"DD",x"7E",x"00", -- 0x2498 + x"FE",x"0E",x"CA",x"F5",x"24",x"3A",x"A2",x"41", -- 0x24A0 + x"C6",x"89",x"4F",x"FD",x"7E",x"00",x"91",x"D2", -- 0x24A8 + x"B4",x"24",x"ED",x"44",x"0F",x"0F",x"0F",x"0F", -- 0x24B0 + x"2F",x"E6",x"03",x"3C",x"DD",x"CB",x"05",x"46", -- 0x24B8 + x"C2",x"C5",x"24",x"ED",x"44",x"FD",x"86",x"00", -- 0x24C0 + x"5F",x"C6",x"1C",x"FE",x"20",x"CB",x"17",x"57", -- 0x24C8 + x"DD",x"AE",x"05",x"DD",x"77",x"05",x"CB",x"42", -- 0x24D0 + x"C2",x"AB",x"24",x"FD",x"73",x"00",x"DD",x"35", -- 0x24D8 + x"06",x"C2",x"F5",x"24",x"3A",x"28",x"41",x"DD", -- 0x24E0 + x"77",x"06",x"FD",x"7E",x"00",x"91",x"CB",x"17", -- 0x24E8 + x"E6",x"01",x"DD",x"77",x"05",x"05",x"C2",x"56", -- 0x24F0 + x"23",x"C9",x"DD",x"21",x"AA",x"41",x"FD",x"21", -- 0x24F8 + x"E6",x"41",x"3A",x"9D",x"40",x"FE",x"01",x"CA", -- 0x2500 + x"16",x"26",x"FE",x"03",x"CA",x"5F",x"26",x"FE", -- 0x2508 + x"02",x"CA",x"36",x"25",x"FE",x"00",x"C0",x"3A", -- 0x2510 + x"0B",x"41",x"A7",x"C0",x"3A",x"08",x"41",x"FE", -- 0x2518 + x"06",x"C0",x"3E",x"20",x"32",x"9E",x"40",x"3E", -- 0x2520 + x"01",x"32",x"9D",x"40",x"AF",x"32",x"94",x"40", -- 0x2528 + x"3E",x"03",x"32",x"92",x"40",x"C9",x"DD",x"7E", -- 0x2530 + x"03",x"FE",x"D8",x"DA",x"53",x"25",x"3A",x"A2", -- 0x2538 + x"41",x"C6",x"83",x"DD",x"96",x"00",x"FE",x"23", -- 0x2540 + x"D2",x"53",x"25",x"3E",x"0C",x"32",x"08",x"41", -- 0x2548 + x"C3",x"7B",x"25",x"DD",x"7E",x"00",x"C6",x"19", -- 0x2550 + x"FD",x"96",x"01",x"FE",x"17",x"D2",x"86",x"25", -- 0x2558 + x"21",x"1B",x"41",x"FD",x"7E",x"03",x"AE",x"DD", -- 0x2560 + x"86",x"03",x"C6",x"10",x"FE",x"08",x"D2",x"86", -- 0x2568 + x"25",x"AF",x"32",x"0D",x"41",x"FD",x"77",x"01", -- 0x2570 + x"FD",x"77",x"03",x"3E",x"20",x"CD",x"2B",x"28", -- 0x2578 + x"CD",x"4A",x"28",x"C3",x"8E",x"25",x"DD",x"7E", -- 0x2580 + x"03",x"FE",x"E0",x"C2",x"B2",x"25",x"3E",x"01", -- 0x2588 + x"32",x"87",x"40",x"32",x"88",x"40",x"3E",x"80", -- 0x2590 + x"32",x"9F",x"40",x"21",x"EF",x"29",x"22",x"0C", -- 0x2598 + x"40",x"21",x"00",x"00",x"22",x"0E",x"40",x"3E", -- 0x25A0 + x"01",x"32",x"02",x"40",x"3E",x"03",x"32",x"9D", -- 0x25A8 + x"40",x"C9",x"DD",x"34",x"03",x"DD",x"34",x"07", -- 0x25B0 + x"DD",x"34",x"1B",x"3A",x"A2",x"41",x"C6",x"70", -- 0x25B8 + x"4F",x"DD",x"7E",x"00",x"91",x"D2",x"CA",x"25", -- 0x25C0 + x"ED",x"44",x"0F",x"0F",x"0F",x"0F",x"E6",x"03", -- 0x25C8 + x"3C",x"3C",x"21",x"72",x"40",x"CB",x"46",x"C2", -- 0x25D0 + x"DC",x"25",x"ED",x"44",x"DD",x"86",x"00",x"5F", -- 0x25D8 + x"C6",x"40",x"FE",x"40",x"CB",x"17",x"47",x"AE", -- 0x25E0 + x"77",x"CB",x"40",x"C2",x"C1",x"25",x"DD",x"73", -- 0x25E8 + x"00",x"3E",x"0F",x"83",x"DD",x"77",x"04",x"3E", -- 0x25F0 + x"07",x"83",x"DD",x"77",x"18",x"21",x"73",x"40", -- 0x25F8 + x"35",x"C0",x"CD",x"09",x"28",x"E6",x"1F",x"C6", -- 0x2600 + x"20",x"77",x"DD",x"7E",x"00",x"91",x"CB",x"17", -- 0x2608 + x"E6",x"01",x"32",x"72",x"40",x"C9",x"21",x"9E", -- 0x2610 + x"40",x"35",x"C0",x"DD",x"7E",x"18",x"D6",x"0F", -- 0x2618 + x"DD",x"77",x"00",x"C6",x"07",x"DD",x"77",x"04", -- 0x2620 + x"DD",x"36",x"03",x"30",x"DD",x"36",x"07",x"30", -- 0x2628 + x"DD",x"36",x"01",x"2D",x"DD",x"36",x"05",x"2E", -- 0x2630 + x"DD",x"36",x"02",x"07",x"DD",x"36",x"06",x"07", -- 0x2638 + x"DD",x"36",x"1C",x"00",x"DD",x"36",x"1F",x"00", -- 0x2640 + x"21",x"A9",x"2A",x"22",x"0C",x"40",x"21",x"00", -- 0x2648 + x"00",x"22",x"0E",x"40",x"3E",x"01",x"32",x"02", -- 0x2650 + x"40",x"3E",x"02",x"32",x"9D",x"40",x"C9",x"21", -- 0x2658 + x"9F",x"40",x"35",x"CA",x"93",x"26",x"21",x"87", -- 0x2660 + x"40",x"35",x"C2",x"7E",x"26",x"CD",x"09",x"28", -- 0x2668 + x"E6",x"0F",x"3C",x"77",x"CD",x"09",x"28",x"E6", -- 0x2670 + x"03",x"C6",x"0B",x"DD",x"77",x"01",x"23",x"35", -- 0x2678 + x"C0",x"CD",x"09",x"28",x"E6",x"0F",x"3C",x"77", -- 0x2680 + x"CD",x"09",x"28",x"E6",x"03",x"C6",x"0B",x"DD", -- 0x2688 + x"77",x"05",x"C9",x"DD",x"36",x"00",x"00",x"DD", -- 0x2690 + x"36",x"04",x"00",x"DD",x"36",x"03",x"00",x"DD", -- 0x2698 + x"36",x"07",x"00",x"DD",x"36",x"18",x"00",x"DD", -- 0x26A0 + x"36",x"1B",x"00",x"3E",x"04",x"32",x"9D",x"40", -- 0x26A8 + x"C9",x"21",x"AA",x"41",x"AF",x"06",x"40",x"77", -- 0x26B0 + x"23",x"10",x"FC",x"32",x"0C",x"41",x"32",x"0D", -- 0x26B8 + x"41",x"32",x"1E",x"40",x"32",x"00",x"68",x"32", -- 0x26C0 + x"01",x"68",x"32",x"02",x"68",x"21",x"EA",x"41", -- 0x26C8 + x"01",x"20",x"01",x"36",x"00",x"23",x"0B",x"78", -- 0x26D0 + x"B1",x"C2",x"D3",x"26",x"21",x"24",x"40",x"06", -- 0x26D8 + x"40",x"36",x"00",x"23",x"10",x"FB",x"C9",x"01", -- 0x26E0 + x"20",x"00",x"1A",x"FE",x"FF",x"C8",x"FE",x"20", -- 0x26E8 + x"CA",x"F6",x"26",x"D6",x"30",x"77",x"ED",x"42", -- 0x26F0 + x"13",x"C3",x"EA",x"26",x"21",x"02",x"50",x"06", -- 0x26F8 + x"20",x"36",x"10",x"23",x"7D",x"E6",x"1F",x"C2", -- 0x2700 + x"01",x"27",x"23",x"23",x"3A",x"00",x"78",x"10", -- 0x2708 + x"F0",x"C9",x"3E",x"FF",x"32",x"00",x"78",x"AF", -- 0x2710 + x"32",x"06",x"68",x"32",x"07",x"68",x"C9",x"C5", -- 0x2718 + x"2A",x"0C",x"40",x"01",x"EF",x"29",x"ED",x"42", -- 0x2720 + x"C1",x"DA",x"31",x"27",x"ED",x"53",x"0C",x"40", -- 0x2728 + x"C9",x"2A",x"0C",x"40",x"22",x"0E",x"40",x"ED", -- 0x2730 + x"53",x"0C",x"40",x"3E",x"01",x"32",x"02",x"40", -- 0x2738 + x"C9",x"21",x"00",x"41",x"01",x"6A",x"00",x"3A", -- 0x2740 + x"00",x"40",x"FE",x"04",x"C2",x"55",x"27",x"21", -- 0x2748 + x"06",x"41",x"01",x"64",x"00",x"36",x"00",x"23", -- 0x2750 + x"0B",x"78",x"B1",x"C2",x"55",x"27",x"C9",x"3A", -- 0x2758 + x"10",x"41",x"32",x"20",x"40",x"21",x"06",x"41", -- 0x2760 + x"11",x"38",x"41",x"01",x"32",x"00",x"7E",x"08", -- 0x2768 + x"1A",x"77",x"08",x"12",x"23",x"13",x"0B",x"78", -- 0x2770 + x"B1",x"C2",x"6E",x"27",x"C9",x"FD",x"7E",x"00", -- 0x2778 + x"FE",x"80",x"1E",x"55",x"D2",x"89",x"27",x"1E", -- 0x2780 + x"00",x"ED",x"5F",x"E6",x"01",x"7B",x"CA",x"93", -- 0x2788 + x"27",x"F6",x"AA",x"DD",x"A6",x"22",x"DD",x"77", -- 0x2790 + x"0C",x"21",x"BA",x"2B",x"DD",x"7E",x"22",x"FE", -- 0x2798 + x"FF",x"C2",x"AA",x"27",x"DD",x"35",x"11",x"C2", -- 0x27A0 + x"C3",x"27",x"21",x"CA",x"2B",x"DD",x"7E",x"0C", -- 0x27A8 + x"E6",x"55",x"DD",x"77",x"0C",x"DD",x"36",x"22", -- 0x27B0 + x"55",x"DD",x"7E",x"11",x"0F",x"DA",x"C3",x"27", -- 0x27B8 + x"DD",x"77",x"11",x"ED",x"5F",x"E6",x"0C",x"5F", -- 0x27C0 + x"16",x"00",x"19",x"5E",x"23",x"56",x"23",x"1A", -- 0x27C8 + x"DD",x"AE",x"0C",x"DD",x"73",x"07",x"DD",x"72", -- 0x27D0 + x"08",x"DD",x"77",x"09",x"5E",x"23",x"56",x"DD", -- 0x27D8 + x"73",x"01",x"DD",x"72",x"02",x"1A",x"0F",x"0F", -- 0x27E0 + x"0F",x"0F",x"E6",x"0F",x"DD",x"77",x"03",x"DD", -- 0x27E8 + x"77",x"05",x"1A",x"E6",x"0F",x"DD",x"77",x"04", -- 0x27F0 + x"DD",x"77",x"06",x"DD",x"36",x"0A",x"04",x"ED", -- 0x27F8 + x"5F",x"E6",x"1F",x"C6",x"08",x"DD",x"77",x"0B", -- 0x2800 + x"C9",x"E5",x"2A",x"8C",x"40",x"23",x"7C",x"E6", -- 0x2808 + x"1F",x"67",x"22",x"8C",x"40",x"7E",x"E1",x"C9", -- 0x2810 + x"D9",x"4F",x"3A",x"00",x"40",x"FE",x"04",x"CA", -- 0x2818 + x"48",x"28",x"79",x"2A",x"0E",x"41",x"23",x"86", -- 0x2820 + x"C3",x"40",x"28",x"D9",x"4F",x"3A",x"00",x"40", -- 0x2828 + x"FE",x"04",x"79",x"CA",x"48",x"28",x"2A",x"0E", -- 0x2830 + x"41",x"86",x"27",x"77",x"23",x"7E",x"CE",x"00", -- 0x2838 + x"27",x"77",x"23",x"7E",x"CE",x"00",x"27",x"77", -- 0x2840 + x"D9",x"C9",x"3A",x"21",x"41",x"A7",x"C8",x"3A", -- 0x2848 + x"00",x"40",x"FE",x"04",x"C8",x"2A",x"0E",x"41", -- 0x2850 + x"23",x"23",x"7E",x"A7",x"C2",x"66",x"28",x"2B", -- 0x2858 + x"7E",x"21",x"68",x"40",x"BE",x"D8",x"3A",x"00", -- 0x2860 + x"40",x"FE",x"18",x"21",x"60",x"50",x"CA",x"74", -- 0x2868 + x"28",x"21",x"A0",x"53",x"34",x"21",x"10",x"41", -- 0x2870 + x"34",x"AF",x"32",x"21",x"41",x"11",x"CB",x"2A", -- 0x2878 + x"CD",x"1F",x"27",x"C9",x"C9",x"8F",x"28",x"BB", -- 0x2880 + x"28",x"E7",x"28",x"13",x"29",x"3F",x"29",x"B2", -- 0x2888 + x"10",x"F7",x"10",x"72",x"11",x"31",x"11",x"4B", -- 0x2890 + x"12",x"4B",x"12",x"4B",x"12",x"4F",x"13",x"4F", -- 0x2898 + x"13",x"4F",x"13",x"72",x"11",x"72",x"11",x"72", -- 0x28A0 + x"11",x"83",x"13",x"83",x"13",x"83",x"13",x"D3", -- 0x28A8 + x"13",x"D3",x"13",x"D3",x"13",x"02",x"14",x"02", -- 0x28B0 + x"14",x"02",x"14",x"00",x"00",x"00",x"00",x"00", -- 0x28B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28C0 + x"00",x"B3",x"14",x"B3",x"14",x"B3",x"14",x"27", -- 0x28C8 + x"15",x"27",x"15",x"27",x"15",x"83",x"13",x"83", -- 0x28D0 + x"13",x"83",x"13",x"00",x"00",x"00",x"00",x"00", -- 0x28D8 + x"00",x"02",x"14",x"02",x"14",x"02",x"14",x"B2", -- 0x28E0 + x"10",x"F7",x"10",x"73",x"17",x"31",x"11",x"4B", -- 0x28E8 + x"12",x"4B",x"12",x"4B",x"12",x"6F",x"15",x"6F", -- 0x28F0 + x"15",x"6F",x"15",x"73",x"17",x"73",x"17",x"73", -- 0x28F8 + x"17",x"83",x"13",x"83",x"13",x"83",x"13",x"DE", -- 0x2900 + x"13",x"DE",x"13",x"DE",x"13",x"02",x"14",x"02", -- 0x2908 + x"14",x"02",x"14",x"B2",x"10",x"F7",x"10",x"72", -- 0x2910 + x"11",x"31",x"11",x"4B",x"12",x"4B",x"12",x"4B", -- 0x2918 + x"12",x"81",x"16",x"81",x"16",x"81",x"16",x"C2", -- 0x2920 + x"17",x"C2",x"17",x"C2",x"17",x"83",x"13",x"83", -- 0x2928 + x"13",x"83",x"13",x"4B",x"17",x"4B",x"17",x"4B", -- 0x2930 + x"17",x"02",x"14",x"02",x"14",x"02",x"14",x"B2", -- 0x2938 + x"10",x"F7",x"10",x"72",x"11",x"31",x"11",x"4B", -- 0x2940 + x"12",x"4B",x"12",x"4B",x"12",x"A4",x"15",x"A4", -- 0x2948 + x"15",x"A4",x"15",x"2F",x"16",x"2F",x"16",x"2F", -- 0x2950 + x"16",x"83",x"13",x"83",x"13",x"83",x"13",x"FF", -- 0x2958 + x"15",x"FF",x"15",x"FF",x"15",x"02",x"14",x"02", -- 0x2960 + x"14",x"02",x"14",x"5E",x"4D",x"7C",x"88",x"5E", -- 0x2968 + x"88",x"4A",x"7A",x"4A",x"72",x"4A",x"60",x"7C", -- 0x2970 + x"A6",x"5E",x"88",x"4A",x"7A",x"4A",x"72",x"4A", -- 0x2978 + x"60",x"7C",x"A6",x"5E",x"88",x"4A",x"7A",x"4A", -- 0x2980 + x"72",x"4A",x"7A",x"7C",x"60",x"4F",x"11",x"47", -- 0x2988 + x"FF",x"47",x"11",x"7C",x"4D",x"7C",x"4D",x"00", -- 0x2990 + x"FE",x"41",x"8F",x"41",x"A1",x"41",x"8F",x"41", -- 0x2998 + x"A1",x"41",x"8F",x"41",x"A1",x"05",x"FF",x"41", -- 0x29A0 + x"8F",x"41",x"A1",x"41",x"8F",x"41",x"A1",x"41", -- 0x29A8 + x"8F",x"41",x"A1",x"05",x"FF",x"41",x"8F",x"41", -- 0x29B0 + x"A1",x"41",x"8F",x"41",x"A1",x"41",x"8F",x"41", -- 0x29B8 + x"A1",x"41",x"FD",x"8F",x"A1",x"41",x"FC",x"01", -- 0x29C0 + x"A6",x"41",x"FC",x"FF",x"00",x"00",x"FE",x"C4", -- 0x29C8 + x"E5",x"C2",x"FF",x"C4",x"E5",x"C2",x"FF",x"C4", -- 0x29D0 + x"E5",x"C2",x"FF",x"C4",x"E5",x"C2",x"FF",x"C4", -- 0x29D8 + x"E5",x"C2",x"FF",x"C4",x"E5",x"C1",x"FD",x"E5", -- 0x29E0 + x"D8",x"C1",x"FC",x"FF",x"30",x"00",x"FE",x"C2", -- 0x29E8 + x"1E",x"C2",x"57",x"C2",x"81",x"C2",x"2B",x"C2", -- 0x29F0 + x"60",x"C2",x"88",x"C2",x"37",x"C2",x"69",x"C2", -- 0x29F8 + x"8F",x"00",x"FE",x"C4",x"DC",x"C3",x"D6",x"C2", -- 0x2A00 + x"E5",x"C1",x"E1",x"00",x"FE",x"C2",x"A6",x"C4", -- 0x2A08 + x"B9",x"C2",x"A6",x"C4",x"1E",x"C2",x"A6",x"C4", -- 0x2A10 + x"B9",x"C2",x"A6",x"00",x"FE",x"43",x"11",x"42", -- 0x2A18 + x"1E",x"42",x"11",x"C3",x"4D",x"41",x"37",x"42", -- 0x2A20 + x"81",x"42",x"11",x"C2",x"60",x"43",x"1E",x"00", -- 0x2A28 + x"FE",x"44",x"FB",x"1E",x"11",x"44",x"FA",x"42", -- 0x2A30 + x"4D",x"42",x"7A",x"6C",x"95",x"56",x"95",x"42", -- 0x2A38 + x"69",x"42",x"7A",x"56",x"95",x"42",x"60",x"42", -- 0x2A40 + x"7A",x"56",x"9B",x"42",x"60",x"42",x"7A",x"6C", -- 0x2A48 + x"9B",x"42",x"4D",x"42",x"7A",x"56",x"95",x"42", -- 0x2A50 + x"60",x"42",x"7A",x"61",x"9B",x"42",x"7A",x"4B", -- 0x2A58 + x"95",x"42",x"72",x"56",x"88",x"42",x"60",x"56", -- 0x2A60 + x"7A",x"42",x"4D",x"6C",x"72",x"56",x"72",x"42", -- 0x2A68 + x"72",x"56",x"88",x"42",x"7A",x"42",x"95",x"6C", -- 0x2A70 + x"A6",x"42",x"4D",x"42",x"72",x"6C",x"9B",x"42", -- 0x2A78 + x"7A",x"4B",x"95",x"4B",x"7A",x"42",x"72",x"4B", -- 0x2A80 + x"9B",x"4B",x"88",x"42",x"7A",x"42",x"95",x"56", -- 0x2A88 + x"A6",x"42",x"60",x"42",x"7A",x"56",x"9B",x"42", -- 0x2A90 + x"4D",x"42",x"7A",x"6C",x"95",x"42",x"4D",x"42", -- 0x2A98 + x"72",x"6C",x"88",x"6C",x"7A",x"6C",x"7A",x"00", -- 0x2AA0 + x"FE",x"41",x"FD",x"69",x"72",x"41",x"FC",x"FF", -- 0x2AA8 + x"57",x"41",x"FD",x"42",x"57",x"41",x"FC",x"01", -- 0x2AB0 + x"88",x"41",x"FD",x"95",x"88",x"41",x"FC",x"FF", -- 0x2AB8 + x"1E",x"41",x"FD",x"1E",x"11",x"41",x"FC",x"01", -- 0x2AC0 + x"E5",x"00",x"FE",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x2AC8 + x"1E",x"C2",x"FF",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x2AD0 + x"1E",x"C2",x"FF",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x2AD8 + x"1E",x"C2",x"FF",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x2AE0 + x"1E",x"C2",x"FF",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x2AE8 + x"1E",x"C2",x"FF",x"C4",x"1E",x"00",x"FE",x"F0", -- 0x2AF0 + x"41",x"41",x"53",x"53",x"FF",x"53",x"31",x"F0", -- 0x2AF8 + x"43",x"35",x"0F",x"12",x"12",x"12",x"54",x"52", -- 0x2B00 + x"51",x"F0",x"41",x"35",x"0F",x"15",x"35",x"FF", -- 0x2B08 + x"53",x"53",x"52",x"F0",x"52",x"53",x"41",x"00", -- 0x2B10 + x"FF",x"FF",x"57",x"00",x"80",x"FA",x"FF",x"57", -- 0x2B18 + x"32",x"32",x"32",x"32",x"32",x"32",x"F0",x"21", -- 0x2B20 + x"FF",x"12",x"0F",x"12",x"FF",x"21",x"F0",x"21", -- 0x2B28 + x"FF",x"12",x"0F",x"12",x"FF",x"21",x"F0",x"32", -- 0x2B30 + x"32",x"32",x"32",x"32",x"32",x"00",x"FF",x"7F", -- 0x2B38 + x"15",x"80",x"EA",x"7F",x"55",x"01",x"FF",x"FF", -- 0x2B40 + x"FF",x"21",x"21",x"F0",x"F0",x"21",x"0F",x"21", -- 0x2B48 + x"0F",x"FF",x"FF",x"00",x"FF",x"FF",x"EB",x"03", -- 0x2B50 + x"53",x"73",x"F0",x"52",x"FF",x"27",x"0F",x"0F", -- 0x2B58 + x"0F",x"0F",x"37",x"45",x"00",x"5F",x"D5",x"FF", -- 0x2B60 + x"18",x"2B",x"F7",x"2A",x"54",x"2B",x"46",x"2B", -- 0x2B68 + x"3E",x"2B",x"20",x"2B",x"65",x"2B",x"58",x"2B", -- 0x2B70 + x"52",x"31",x"51",x"61",x"F0",x"F0",x"61",x"51", -- 0x2B78 + x"31",x"52",x"00",x"FF",x"5F",x"05",x"53",x"21", -- 0x2B80 + x"52",x"F0",x"52",x"21",x"53",x"F0",x"52",x"21", -- 0x2B88 + x"53",x"00",x"FF",x"55",x"15",x"12",x"23",x"FF", -- 0x2B90 + x"21",x"41",x"F0",x"F0",x"41",x"21",x"FF",x"23", -- 0x2B98 + x"12",x"25",x"13",x"FF",x"FF",x"FF",x"00",x"FF", -- 0x2BA0 + x"FF",x"FF",x"FF",x"0F",x"FF",x"FF",x"12",x"12", -- 0x2BA8 + x"FF",x"21",x"F0",x"FF",x"FF",x"FF",x"00",x"FF", -- 0x2BB0 + x"FF",x"0F",x"83",x"2B",x"78",x"2B",x"92",x"2B", -- 0x2BB8 + x"86",x"2B",x"83",x"2B",x"78",x"2B",x"92",x"2B", -- 0x2BC0 + x"86",x"2B",x"A7",x"2B",x"95",x"2B",x"B7",x"2B", -- 0x2BC8 + x"AC",x"2B",x"A7",x"2B",x"95",x"2B",x"B7",x"2B", -- 0x2BD0 + x"AC",x"2B",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BE0 + x"00",x"7E",x"00",x"FC",x"01",x"F8",x"03",x"F1", -- 0x2BE8 + x"1F",x"F3",x"3F",x"FF",x"FF",x"FF",x"3F",x"FF", -- 0x2BF0 + x"1F",x"F3",x"03",x"F1",x"01",x"F8",x"00",x"FC", -- 0x2BF8 + x"00",x"7E",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C10 + x"2C",x"2C",x"3C",x"2C",x"24",x"2C",x"44",x"2C", -- 0x2C18 + x"4C",x"2C",x"34",x"2C",x"76",x"7F",x"7F",x"FE", -- 0x2C20 + x"FE",x"FF",x"7F",x"3A",x"00",x"00",x"1C",x"1E", -- 0x2C28 + x"3F",x"3F",x"3E",x"1E",x"38",x"7C",x"7C",x"FC", -- 0x2C30 + x"FC",x"78",x"00",x"00",x"40",x"E0",x"E0",x"60", -- 0x2C38 + x"00",x"00",x"00",x"00",x"00",x"00",x"18",x"38", -- 0x2C40 + x"38",x"10",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C48 + x"02",x"07",x"07",x"02",x"00",x"00",x"00",x"2E", -- 0x2C50 + x"0C",x"2E",x"40",x"0C",x"2F",x"00",x"00",x"00", -- 0x2C58 + x"18",x"0C",x"2E",x"26",x"03",x"44",x"10",x"03", -- 0x2C60 + x"44",x"2A",x"0C",x"2F",x"22",x"03",x"44",x"10", -- 0x2C68 + x"03",x"44",x"2E",x"03",x"44",x"14",x"03",x"44", -- 0x2C70 + x"0C",x"03",x"44",x"02",x"03",x"44",x"04",x"03", -- 0x2C78 + x"44",x"0E",x"03",x"44",x"18",x"03",x"44",x"06", -- 0x2C80 + x"03",x"44",x"08",x"03",x"44",x"12",x"03",x"44", -- 0x2C88 + x"30",x"03",x"44",x"16",x"03",x"44",x"24",x"03", -- 0x2C90 + x"44",x"26",x"03",x"44",x"2C",x"0C",x"2C",x"0E", -- 0x2C98 + x"03",x"44",x"2C",x"03",x"44",x"40",x"0C",x"2D", -- 0x2CA0 + x"00",x"00",x"00",x"32",x"0C",x"2C",x"30",x"0C", -- 0x2CA8 + x"2D",x"00",x"00",x"00",x"38",x"7C",x"7C",x"FC", -- 0x2CB0 + x"FC",x"78",x"00",x"00",x"40",x"E0",x"E0",x"60", -- 0x2CB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"18",x"38", -- 0x2CC0 + x"38",x"10",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CC8 + x"02",x"07",x"07",x"02",x"00",x"00",x"00",x"2E", -- 0x2CD0 + x"0C",x"2E",x"40",x"0C",x"2F",x"00",x"00",x"00", -- 0x2CD8 + x"18",x"0C",x"2E",x"26",x"03",x"44",x"10",x"03", -- 0x2CE0 + x"44",x"2A",x"0C",x"2F",x"22",x"03",x"44",x"10", -- 0x2CE8 + x"03",x"44",x"2E",x"03",x"44",x"14",x"03",x"44", -- 0x2CF0 + x"0C",x"03",x"44",x"02",x"03",x"44",x"04",x"03", -- 0x2CF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2ED0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2ED8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FF8 + x"5F",x"E6",x"1F",x"C6",x"08",x"DD",x"77",x"0B", -- 0x3000 + x"C9",x"E5",x"2A",x"8C",x"40",x"23",x"7C",x"E6", -- 0x3008 + x"1F",x"67",x"22",x"8C",x"40",x"7E",x"E1",x"C9", -- 0x3010 + x"D9",x"4F",x"3A",x"00",x"40",x"FE",x"04",x"CA", -- 0x3018 + x"48",x"28",x"79",x"2A",x"0E",x"41",x"23",x"86", -- 0x3020 + x"C3",x"40",x"28",x"D9",x"4F",x"3A",x"00",x"40", -- 0x3028 + x"FE",x"04",x"79",x"CA",x"48",x"28",x"2A",x"0E", -- 0x3030 + x"41",x"86",x"27",x"77",x"23",x"7E",x"CE",x"00", -- 0x3038 + x"27",x"77",x"23",x"7E",x"CE",x"00",x"27",x"77", -- 0x3040 + x"D9",x"C9",x"3A",x"21",x"41",x"A7",x"C8",x"3A", -- 0x3048 + x"00",x"40",x"FE",x"04",x"C8",x"2A",x"0E",x"41", -- 0x3050 + x"23",x"23",x"7E",x"A7",x"C2",x"66",x"28",x"2B", -- 0x3058 + x"7E",x"21",x"68",x"40",x"BE",x"D8",x"3A",x"00", -- 0x3060 + x"40",x"FE",x"18",x"21",x"60",x"50",x"CA",x"74", -- 0x3068 + x"28",x"21",x"A0",x"53",x"34",x"21",x"10",x"41", -- 0x3070 + x"34",x"AF",x"32",x"21",x"41",x"11",x"CB",x"2A", -- 0x3078 + x"CD",x"1F",x"27",x"C9",x"C9",x"8F",x"28",x"BB", -- 0x3080 + x"28",x"E7",x"28",x"13",x"29",x"3F",x"29",x"B2", -- 0x3088 + x"10",x"F7",x"10",x"72",x"11",x"31",x"11",x"4B", -- 0x3090 + x"12",x"4B",x"12",x"4B",x"12",x"4F",x"13",x"4F", -- 0x3098 + x"13",x"4F",x"13",x"72",x"11",x"72",x"11",x"72", -- 0x30A0 + x"11",x"83",x"13",x"83",x"13",x"83",x"13",x"D3", -- 0x30A8 + x"13",x"D3",x"13",x"D3",x"13",x"02",x"14",x"02", -- 0x30B0 + x"14",x"02",x"14",x"00",x"00",x"00",x"00",x"00", -- 0x30B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30C0 + x"00",x"B3",x"14",x"B3",x"14",x"B3",x"14",x"27", -- 0x30C8 + x"15",x"27",x"15",x"27",x"15",x"83",x"13",x"83", -- 0x30D0 + x"13",x"83",x"13",x"00",x"00",x"00",x"00",x"00", -- 0x30D8 + x"00",x"02",x"14",x"02",x"14",x"02",x"14",x"B2", -- 0x30E0 + x"10",x"F7",x"10",x"73",x"17",x"31",x"11",x"4B", -- 0x30E8 + x"12",x"4B",x"12",x"4B",x"12",x"6F",x"15",x"6F", -- 0x30F0 + x"15",x"6F",x"15",x"73",x"17",x"73",x"17",x"73", -- 0x30F8 + x"17",x"83",x"13",x"83",x"13",x"83",x"13",x"DE", -- 0x3100 + x"13",x"DE",x"13",x"DE",x"13",x"02",x"14",x"02", -- 0x3108 + x"14",x"02",x"14",x"B2",x"10",x"F7",x"10",x"72", -- 0x3110 + x"11",x"31",x"11",x"4B",x"12",x"4B",x"12",x"4B", -- 0x3118 + x"12",x"81",x"16",x"81",x"16",x"81",x"16",x"C2", -- 0x3120 + x"17",x"C2",x"17",x"C2",x"17",x"83",x"13",x"83", -- 0x3128 + x"13",x"83",x"13",x"4B",x"17",x"4B",x"17",x"4B", -- 0x3130 + x"17",x"02",x"14",x"02",x"14",x"02",x"14",x"B2", -- 0x3138 + x"10",x"F7",x"10",x"72",x"11",x"31",x"11",x"4B", -- 0x3140 + x"12",x"4B",x"12",x"4B",x"12",x"A4",x"15",x"A4", -- 0x3148 + x"15",x"A4",x"15",x"2F",x"16",x"2F",x"16",x"2F", -- 0x3150 + x"16",x"83",x"13",x"83",x"13",x"83",x"13",x"FF", -- 0x3158 + x"15",x"FF",x"15",x"FF",x"15",x"02",x"14",x"02", -- 0x3160 + x"14",x"02",x"14",x"5E",x"4D",x"7C",x"88",x"5E", -- 0x3168 + x"88",x"4A",x"7A",x"4A",x"72",x"4A",x"60",x"7C", -- 0x3170 + x"A6",x"5E",x"88",x"4A",x"7A",x"4A",x"72",x"4A", -- 0x3178 + x"60",x"7C",x"A6",x"5E",x"88",x"4A",x"7A",x"4A", -- 0x3180 + x"72",x"4A",x"7A",x"7C",x"60",x"4F",x"11",x"47", -- 0x3188 + x"FF",x"47",x"11",x"7C",x"4D",x"7C",x"4D",x"00", -- 0x3190 + x"FE",x"41",x"8F",x"41",x"A1",x"41",x"8F",x"41", -- 0x3198 + x"A1",x"41",x"8F",x"41",x"A1",x"05",x"FF",x"41", -- 0x31A0 + x"8F",x"41",x"A1",x"41",x"8F",x"41",x"A1",x"41", -- 0x31A8 + x"8F",x"41",x"A1",x"05",x"FF",x"41",x"8F",x"41", -- 0x31B0 + x"A1",x"41",x"8F",x"41",x"A1",x"41",x"8F",x"41", -- 0x31B8 + x"A1",x"41",x"FD",x"8F",x"A1",x"41",x"FC",x"01", -- 0x31C0 + x"A6",x"41",x"FC",x"FF",x"00",x"00",x"FE",x"C4", -- 0x31C8 + x"E5",x"C2",x"FF",x"C4",x"E5",x"C2",x"FF",x"C4", -- 0x31D0 + x"E5",x"C2",x"FF",x"C4",x"E5",x"C2",x"FF",x"C4", -- 0x31D8 + x"E5",x"C2",x"FF",x"C4",x"E5",x"C1",x"FD",x"E5", -- 0x31E0 + x"D8",x"C1",x"FC",x"FF",x"30",x"00",x"FE",x"C2", -- 0x31E8 + x"1E",x"C2",x"57",x"C2",x"81",x"C2",x"2B",x"C2", -- 0x31F0 + x"60",x"C2",x"88",x"C2",x"37",x"C2",x"69",x"C2", -- 0x31F8 + x"8F",x"00",x"FE",x"C4",x"DC",x"C3",x"D6",x"C2", -- 0x3200 + x"E5",x"C1",x"E1",x"00",x"FE",x"C2",x"A6",x"C4", -- 0x3208 + x"B9",x"C2",x"A6",x"C4",x"1E",x"C2",x"A6",x"C4", -- 0x3210 + x"B9",x"C2",x"A6",x"00",x"FE",x"43",x"11",x"42", -- 0x3218 + x"1E",x"42",x"11",x"C3",x"4D",x"41",x"37",x"42", -- 0x3220 + x"81",x"42",x"11",x"C2",x"60",x"43",x"1E",x"00", -- 0x3228 + x"FE",x"44",x"FB",x"1E",x"11",x"44",x"FA",x"42", -- 0x3230 + x"4D",x"42",x"7A",x"6C",x"95",x"56",x"95",x"42", -- 0x3238 + x"69",x"42",x"7A",x"56",x"95",x"42",x"60",x"42", -- 0x3240 + x"7A",x"56",x"9B",x"42",x"60",x"42",x"7A",x"6C", -- 0x3248 + x"9B",x"42",x"4D",x"42",x"7A",x"56",x"95",x"42", -- 0x3250 + x"60",x"42",x"7A",x"61",x"9B",x"42",x"7A",x"4B", -- 0x3258 + x"95",x"42",x"72",x"56",x"88",x"42",x"60",x"56", -- 0x3260 + x"7A",x"42",x"4D",x"6C",x"72",x"56",x"72",x"42", -- 0x3268 + x"72",x"56",x"88",x"42",x"7A",x"42",x"95",x"6C", -- 0x3270 + x"A6",x"42",x"4D",x"42",x"72",x"6C",x"9B",x"42", -- 0x3278 + x"7A",x"4B",x"95",x"4B",x"7A",x"42",x"72",x"4B", -- 0x3280 + x"9B",x"4B",x"88",x"42",x"7A",x"42",x"95",x"56", -- 0x3288 + x"A6",x"42",x"60",x"42",x"7A",x"56",x"9B",x"42", -- 0x3290 + x"4D",x"42",x"7A",x"6C",x"95",x"42",x"4D",x"42", -- 0x3298 + x"72",x"6C",x"88",x"6C",x"7A",x"6C",x"7A",x"00", -- 0x32A0 + x"FE",x"41",x"FD",x"69",x"72",x"41",x"FC",x"FF", -- 0x32A8 + x"57",x"41",x"FD",x"42",x"57",x"41",x"FC",x"01", -- 0x32B0 + x"88",x"41",x"FD",x"95",x"88",x"41",x"FC",x"FF", -- 0x32B8 + x"1E",x"41",x"FD",x"1E",x"11",x"41",x"FC",x"01", -- 0x32C0 + x"E5",x"00",x"FE",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x32C8 + x"1E",x"C2",x"FF",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x32D0 + x"1E",x"C2",x"FF",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x32D8 + x"1E",x"C2",x"FF",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x32E0 + x"1E",x"C2",x"FF",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x32E8 + x"1E",x"C2",x"FF",x"C4",x"1E",x"00",x"FE",x"F0", -- 0x32F0 + x"41",x"41",x"53",x"53",x"FF",x"53",x"31",x"F0", -- 0x32F8 + x"43",x"35",x"0F",x"12",x"12",x"12",x"54",x"52", -- 0x3300 + x"51",x"F0",x"41",x"35",x"0F",x"15",x"35",x"FF", -- 0x3308 + x"53",x"53",x"52",x"F0",x"52",x"53",x"41",x"00", -- 0x3310 + x"FF",x"FF",x"57",x"00",x"80",x"FA",x"FF",x"57", -- 0x3318 + x"32",x"32",x"32",x"32",x"32",x"32",x"F0",x"21", -- 0x3320 + x"FF",x"12",x"0F",x"12",x"FF",x"21",x"F0",x"21", -- 0x3328 + x"FF",x"12",x"0F",x"12",x"FF",x"21",x"F0",x"32", -- 0x3330 + x"32",x"32",x"32",x"32",x"32",x"00",x"FF",x"7F", -- 0x3338 + x"15",x"80",x"EA",x"7F",x"55",x"01",x"FF",x"FF", -- 0x3340 + x"FF",x"21",x"21",x"F0",x"F0",x"21",x"0F",x"21", -- 0x3348 + x"0F",x"FF",x"FF",x"00",x"FF",x"FF",x"EB",x"03", -- 0x3350 + x"53",x"73",x"F0",x"52",x"FF",x"27",x"0F",x"0F", -- 0x3358 + x"0F",x"0F",x"37",x"45",x"00",x"5F",x"D5",x"FF", -- 0x3360 + x"18",x"2B",x"F7",x"2A",x"54",x"2B",x"46",x"2B", -- 0x3368 + x"3E",x"2B",x"20",x"2B",x"65",x"2B",x"58",x"2B", -- 0x3370 + x"52",x"31",x"51",x"61",x"F0",x"F0",x"61",x"51", -- 0x3378 + x"31",x"52",x"00",x"FF",x"5F",x"05",x"53",x"21", -- 0x3380 + x"52",x"F0",x"52",x"21",x"53",x"F0",x"52",x"21", -- 0x3388 + x"53",x"00",x"FF",x"55",x"15",x"12",x"23",x"FF", -- 0x3390 + x"21",x"41",x"F0",x"F0",x"41",x"21",x"FF",x"23", -- 0x3398 + x"12",x"25",x"13",x"FF",x"FF",x"FF",x"00",x"FF", -- 0x33A0 + x"FF",x"FF",x"FF",x"0F",x"FF",x"FF",x"12",x"12", -- 0x33A8 + x"FF",x"21",x"F0",x"FF",x"FF",x"FF",x"00",x"FF", -- 0x33B0 + x"FF",x"0F",x"83",x"2B",x"78",x"2B",x"92",x"2B", -- 0x33B8 + x"86",x"2B",x"83",x"2B",x"78",x"2B",x"92",x"2B", -- 0x33C0 + x"86",x"2B",x"A7",x"2B",x"95",x"2B",x"B7",x"2B", -- 0x33C8 + x"AC",x"2B",x"A7",x"2B",x"95",x"2B",x"B7",x"2B", -- 0x33D0 + x"AC",x"2B",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33E0 + x"00",x"7E",x"00",x"FC",x"01",x"F8",x"03",x"F1", -- 0x33E8 + x"1F",x"F3",x"3F",x"FF",x"FF",x"FF",x"3F",x"FF", -- 0x33F0 + x"1F",x"F3",x"03",x"F1",x"01",x"F8",x"00",x"FC", -- 0x33F8 + x"00",x"7E",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3400 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3408 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3410 + x"2C",x"2C",x"3C",x"2C",x"24",x"2C",x"44",x"2C", -- 0x3418 + x"4C",x"2C",x"34",x"2C",x"76",x"7F",x"7F",x"FE", -- 0x3420 + x"FE",x"FF",x"7F",x"3A",x"00",x"00",x"1C",x"1E", -- 0x3428 + x"3F",x"3F",x"3E",x"1E",x"38",x"7C",x"7C",x"FC", -- 0x3430 + x"FC",x"78",x"00",x"00",x"40",x"E0",x"E0",x"60", -- 0x3438 + x"00",x"00",x"00",x"00",x"00",x"00",x"18",x"38", -- 0x3440 + x"38",x"10",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3448 + x"02",x"07",x"07",x"02",x"00",x"00",x"00",x"2E", -- 0x3450 + x"0C",x"2E",x"40",x"0C",x"2F",x"00",x"00",x"00", -- 0x3458 + x"18",x"0C",x"2E",x"26",x"03",x"44",x"10",x"03", -- 0x3460 + x"44",x"2A",x"0C",x"2F",x"22",x"03",x"44",x"10", -- 0x3468 + x"03",x"44",x"2E",x"03",x"44",x"14",x"03",x"44", -- 0x3470 + x"0C",x"03",x"44",x"02",x"03",x"44",x"04",x"03", -- 0x3478 + x"44",x"0E",x"03",x"44",x"18",x"03",x"44",x"06", -- 0x3480 + x"03",x"44",x"08",x"03",x"44",x"12",x"03",x"44", -- 0x3488 + x"30",x"03",x"44",x"16",x"03",x"44",x"24",x"03", -- 0x3490 + x"44",x"26",x"03",x"44",x"2C",x"0C",x"2C",x"0E", -- 0x3498 + x"03",x"44",x"2C",x"03",x"44",x"40",x"0C",x"2D", -- 0x34A0 + x"00",x"00",x"00",x"32",x"0C",x"2C",x"30",x"0C", -- 0x34A8 + x"2D",x"00",x"00",x"00",x"38",x"7C",x"7C",x"FC", -- 0x34B0 + x"FC",x"78",x"00",x"00",x"40",x"E0",x"E0",x"60", -- 0x34B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"18",x"38", -- 0x34C0 + x"38",x"10",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34C8 + x"02",x"07",x"07",x"02",x"00",x"00",x"00",x"2E", -- 0x34D0 + x"0C",x"2E",x"40",x"0C",x"2F",x"00",x"00",x"00", -- 0x34D8 + x"18",x"0C",x"2E",x"26",x"03",x"44",x"10",x"03", -- 0x34E0 + x"44",x"2A",x"0C",x"2F",x"22",x"03",x"44",x"10", -- 0x34E8 + x"03",x"44",x"2E",x"03",x"44",x"14",x"03",x"44", -- 0x34F0 + x"0C",x"03",x"44",x"02",x"03",x"44",x"04",x"03", -- 0x34F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3500 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3508 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3510 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3518 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3520 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3528 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3530 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3538 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3540 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3548 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3550 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3558 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3560 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3568 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3570 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3578 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3580 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3588 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3590 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3598 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x35F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3600 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3608 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3610 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3618 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3620 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3628 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3630 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3638 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3640 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3648 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3650 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3658 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3660 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3668 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3670 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3678 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3680 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3688 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3690 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3698 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x36F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3700 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3708 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3710 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3718 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3720 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3728 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3730 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3738 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3740 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3748 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3750 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3758 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3760 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3768 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3770 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3778 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3780 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3788 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3790 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3798 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x37F8 + x"5F",x"E6",x"1F",x"C6",x"08",x"DD",x"77",x"0B", -- 0x3800 + x"C9",x"E5",x"2A",x"8C",x"40",x"23",x"7C",x"E6", -- 0x3808 + x"1F",x"67",x"22",x"8C",x"40",x"7E",x"E1",x"C9", -- 0x3810 + x"D9",x"4F",x"3A",x"00",x"40",x"FE",x"04",x"CA", -- 0x3818 + x"48",x"28",x"79",x"2A",x"0E",x"41",x"23",x"86", -- 0x3820 + x"C3",x"40",x"28",x"D9",x"4F",x"3A",x"00",x"40", -- 0x3828 + x"FE",x"04",x"79",x"CA",x"48",x"28",x"2A",x"0E", -- 0x3830 + x"41",x"86",x"27",x"77",x"23",x"7E",x"CE",x"00", -- 0x3838 + x"27",x"77",x"23",x"7E",x"CE",x"00",x"27",x"77", -- 0x3840 + x"D9",x"C9",x"3A",x"21",x"41",x"A7",x"C8",x"3A", -- 0x3848 + x"00",x"40",x"FE",x"04",x"C8",x"2A",x"0E",x"41", -- 0x3850 + x"23",x"23",x"7E",x"A7",x"C2",x"66",x"28",x"2B", -- 0x3858 + x"7E",x"21",x"68",x"40",x"BE",x"D8",x"3A",x"00", -- 0x3860 + x"40",x"FE",x"18",x"21",x"60",x"50",x"CA",x"74", -- 0x3868 + x"28",x"21",x"A0",x"53",x"34",x"21",x"10",x"41", -- 0x3870 + x"34",x"AF",x"32",x"21",x"41",x"11",x"CB",x"2A", -- 0x3878 + x"CD",x"1F",x"27",x"C9",x"C9",x"8F",x"28",x"BB", -- 0x3880 + x"28",x"E7",x"28",x"13",x"29",x"3F",x"29",x"B2", -- 0x3888 + x"10",x"F7",x"10",x"72",x"11",x"31",x"11",x"4B", -- 0x3890 + x"12",x"4B",x"12",x"4B",x"12",x"4F",x"13",x"4F", -- 0x3898 + x"13",x"4F",x"13",x"72",x"11",x"72",x"11",x"72", -- 0x38A0 + x"11",x"83",x"13",x"83",x"13",x"83",x"13",x"D3", -- 0x38A8 + x"13",x"D3",x"13",x"D3",x"13",x"02",x"14",x"02", -- 0x38B0 + x"14",x"02",x"14",x"00",x"00",x"00",x"00",x"00", -- 0x38B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38C0 + x"00",x"B3",x"14",x"B3",x"14",x"B3",x"14",x"27", -- 0x38C8 + x"15",x"27",x"15",x"27",x"15",x"83",x"13",x"83", -- 0x38D0 + x"13",x"83",x"13",x"00",x"00",x"00",x"00",x"00", -- 0x38D8 + x"00",x"02",x"14",x"02",x"14",x"02",x"14",x"B2", -- 0x38E0 + x"10",x"F7",x"10",x"73",x"17",x"31",x"11",x"4B", -- 0x38E8 + x"12",x"4B",x"12",x"4B",x"12",x"6F",x"15",x"6F", -- 0x38F0 + x"15",x"6F",x"15",x"73",x"17",x"73",x"17",x"73", -- 0x38F8 + x"17",x"83",x"13",x"83",x"13",x"83",x"13",x"DE", -- 0x3900 + x"13",x"DE",x"13",x"DE",x"13",x"02",x"14",x"02", -- 0x3908 + x"14",x"02",x"14",x"B2",x"10",x"F7",x"10",x"72", -- 0x3910 + x"11",x"31",x"11",x"4B",x"12",x"4B",x"12",x"4B", -- 0x3918 + x"12",x"81",x"16",x"81",x"16",x"81",x"16",x"C2", -- 0x3920 + x"17",x"C2",x"17",x"C2",x"17",x"83",x"13",x"83", -- 0x3928 + x"13",x"83",x"13",x"4B",x"17",x"4B",x"17",x"4B", -- 0x3930 + x"17",x"02",x"14",x"02",x"14",x"02",x"14",x"B2", -- 0x3938 + x"10",x"F7",x"10",x"72",x"11",x"31",x"11",x"4B", -- 0x3940 + x"12",x"4B",x"12",x"4B",x"12",x"A4",x"15",x"A4", -- 0x3948 + x"15",x"A4",x"15",x"2F",x"16",x"2F",x"16",x"2F", -- 0x3950 + x"16",x"83",x"13",x"83",x"13",x"83",x"13",x"FF", -- 0x3958 + x"15",x"FF",x"15",x"FF",x"15",x"02",x"14",x"02", -- 0x3960 + x"14",x"02",x"14",x"5E",x"4D",x"7C",x"88",x"5E", -- 0x3968 + x"88",x"4A",x"7A",x"4A",x"72",x"4A",x"60",x"7C", -- 0x3970 + x"A6",x"5E",x"88",x"4A",x"7A",x"4A",x"72",x"4A", -- 0x3978 + x"60",x"7C",x"A6",x"5E",x"88",x"4A",x"7A",x"4A", -- 0x3980 + x"72",x"4A",x"7A",x"7C",x"60",x"4F",x"11",x"47", -- 0x3988 + x"FF",x"47",x"11",x"7C",x"4D",x"7C",x"4D",x"00", -- 0x3990 + x"FE",x"41",x"8F",x"41",x"A1",x"41",x"8F",x"41", -- 0x3998 + x"A1",x"41",x"8F",x"41",x"A1",x"05",x"FF",x"41", -- 0x39A0 + x"8F",x"41",x"A1",x"41",x"8F",x"41",x"A1",x"41", -- 0x39A8 + x"8F",x"41",x"A1",x"05",x"FF",x"41",x"8F",x"41", -- 0x39B0 + x"A1",x"41",x"8F",x"41",x"A1",x"41",x"8F",x"41", -- 0x39B8 + x"A1",x"41",x"FD",x"8F",x"A1",x"41",x"FC",x"01", -- 0x39C0 + x"A6",x"41",x"FC",x"FF",x"00",x"00",x"FE",x"C4", -- 0x39C8 + x"E5",x"C2",x"FF",x"C4",x"E5",x"C2",x"FF",x"C4", -- 0x39D0 + x"E5",x"C2",x"FF",x"C4",x"E5",x"C2",x"FF",x"C4", -- 0x39D8 + x"E5",x"C2",x"FF",x"C4",x"E5",x"C1",x"FD",x"E5", -- 0x39E0 + x"D8",x"C1",x"FC",x"FF",x"30",x"00",x"FE",x"C2", -- 0x39E8 + x"1E",x"C2",x"57",x"C2",x"81",x"C2",x"2B",x"C2", -- 0x39F0 + x"60",x"C2",x"88",x"C2",x"37",x"C2",x"69",x"C2", -- 0x39F8 + x"8F",x"00",x"FE",x"C4",x"DC",x"C3",x"D6",x"C2", -- 0x3A00 + x"E5",x"C1",x"E1",x"00",x"FE",x"C2",x"A6",x"C4", -- 0x3A08 + x"B9",x"C2",x"A6",x"C4",x"1E",x"C2",x"A6",x"C4", -- 0x3A10 + x"B9",x"C2",x"A6",x"00",x"FE",x"43",x"11",x"42", -- 0x3A18 + x"1E",x"42",x"11",x"C3",x"4D",x"41",x"37",x"42", -- 0x3A20 + x"81",x"42",x"11",x"C2",x"60",x"43",x"1E",x"00", -- 0x3A28 + x"FE",x"44",x"FB",x"1E",x"11",x"44",x"FA",x"42", -- 0x3A30 + x"4D",x"42",x"7A",x"6C",x"95",x"56",x"95",x"42", -- 0x3A38 + x"69",x"42",x"7A",x"56",x"95",x"42",x"60",x"42", -- 0x3A40 + x"7A",x"56",x"9B",x"42",x"60",x"42",x"7A",x"6C", -- 0x3A48 + x"9B",x"42",x"4D",x"42",x"7A",x"56",x"95",x"42", -- 0x3A50 + x"60",x"42",x"7A",x"61",x"9B",x"42",x"7A",x"4B", -- 0x3A58 + x"95",x"42",x"72",x"56",x"88",x"42",x"60",x"56", -- 0x3A60 + x"7A",x"42",x"4D",x"6C",x"72",x"56",x"72",x"42", -- 0x3A68 + x"72",x"56",x"88",x"42",x"7A",x"42",x"95",x"6C", -- 0x3A70 + x"A6",x"42",x"4D",x"42",x"72",x"6C",x"9B",x"42", -- 0x3A78 + x"7A",x"4B",x"95",x"4B",x"7A",x"42",x"72",x"4B", -- 0x3A80 + x"9B",x"4B",x"88",x"42",x"7A",x"42",x"95",x"56", -- 0x3A88 + x"A6",x"42",x"60",x"42",x"7A",x"56",x"9B",x"42", -- 0x3A90 + x"4D",x"42",x"7A",x"6C",x"95",x"42",x"4D",x"42", -- 0x3A98 + x"72",x"6C",x"88",x"6C",x"7A",x"6C",x"7A",x"00", -- 0x3AA0 + x"FE",x"41",x"FD",x"69",x"72",x"41",x"FC",x"FF", -- 0x3AA8 + x"57",x"41",x"FD",x"42",x"57",x"41",x"FC",x"01", -- 0x3AB0 + x"88",x"41",x"FD",x"95",x"88",x"41",x"FC",x"FF", -- 0x3AB8 + x"1E",x"41",x"FD",x"1E",x"11",x"41",x"FC",x"01", -- 0x3AC0 + x"E5",x"00",x"FE",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x3AC8 + x"1E",x"C2",x"FF",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x3AD0 + x"1E",x"C2",x"FF",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x3AD8 + x"1E",x"C2",x"FF",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x3AE0 + x"1E",x"C2",x"FF",x"C4",x"1E",x"C2",x"FF",x"C4", -- 0x3AE8 + x"1E",x"C2",x"FF",x"C4",x"1E",x"00",x"FE",x"F0", -- 0x3AF0 + x"41",x"41",x"53",x"53",x"FF",x"53",x"31",x"F0", -- 0x3AF8 + x"43",x"35",x"0F",x"12",x"12",x"12",x"54",x"52", -- 0x3B00 + x"51",x"F0",x"41",x"35",x"0F",x"15",x"35",x"FF", -- 0x3B08 + x"53",x"53",x"52",x"F0",x"52",x"53",x"41",x"00", -- 0x3B10 + x"FF",x"FF",x"57",x"00",x"80",x"FA",x"FF",x"57", -- 0x3B18 + x"32",x"32",x"32",x"32",x"32",x"32",x"F0",x"21", -- 0x3B20 + x"FF",x"12",x"0F",x"12",x"FF",x"21",x"F0",x"21", -- 0x3B28 + x"FF",x"12",x"0F",x"12",x"FF",x"21",x"F0",x"32", -- 0x3B30 + x"32",x"32",x"32",x"32",x"32",x"00",x"FF",x"7F", -- 0x3B38 + x"15",x"80",x"EA",x"7F",x"55",x"01",x"FF",x"FF", -- 0x3B40 + x"FF",x"21",x"21",x"F0",x"F0",x"21",x"0F",x"21", -- 0x3B48 + x"0F",x"FF",x"FF",x"00",x"FF",x"FF",x"EB",x"03", -- 0x3B50 + x"53",x"73",x"F0",x"52",x"FF",x"27",x"0F",x"0F", -- 0x3B58 + x"0F",x"0F",x"37",x"45",x"00",x"5F",x"D5",x"FF", -- 0x3B60 + x"18",x"2B",x"F7",x"2A",x"54",x"2B",x"46",x"2B", -- 0x3B68 + x"3E",x"2B",x"20",x"2B",x"65",x"2B",x"58",x"2B", -- 0x3B70 + x"52",x"31",x"51",x"61",x"F0",x"F0",x"61",x"51", -- 0x3B78 + x"31",x"52",x"00",x"FF",x"5F",x"05",x"53",x"21", -- 0x3B80 + x"52",x"F0",x"52",x"21",x"53",x"F0",x"52",x"21", -- 0x3B88 + x"53",x"00",x"FF",x"55",x"15",x"12",x"23",x"FF", -- 0x3B90 + x"21",x"41",x"F0",x"F0",x"41",x"21",x"FF",x"23", -- 0x3B98 + x"12",x"25",x"13",x"FF",x"FF",x"FF",x"00",x"FF", -- 0x3BA0 + x"FF",x"FF",x"FF",x"0F",x"FF",x"FF",x"12",x"12", -- 0x3BA8 + x"FF",x"21",x"F0",x"FF",x"FF",x"FF",x"00",x"FF", -- 0x3BB0 + x"FF",x"0F",x"83",x"2B",x"78",x"2B",x"92",x"2B", -- 0x3BB8 + x"86",x"2B",x"83",x"2B",x"78",x"2B",x"92",x"2B", -- 0x3BC0 + x"86",x"2B",x"A7",x"2B",x"95",x"2B",x"B7",x"2B", -- 0x3BC8 + x"AC",x"2B",x"A7",x"2B",x"95",x"2B",x"B7",x"2B", -- 0x3BD0 + x"AC",x"2B",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BE0 + x"00",x"7E",x"00",x"FC",x"01",x"F8",x"03",x"F1", -- 0x3BE8 + x"1F",x"F3",x"3F",x"FF",x"FF",x"FF",x"3F",x"FF", -- 0x3BF0 + x"1F",x"F3",x"03",x"F1",x"01",x"F8",x"00",x"FC", -- 0x3BF8 + x"00",x"7E",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C10 + x"2C",x"2C",x"3C",x"2C",x"24",x"2C",x"44",x"2C", -- 0x3C18 + x"4C",x"2C",x"34",x"2C",x"76",x"7F",x"7F",x"FE", -- 0x3C20 + x"FE",x"FF",x"7F",x"3A",x"00",x"00",x"1C",x"1E", -- 0x3C28 + x"3F",x"3F",x"3E",x"1E",x"38",x"7C",x"7C",x"FC", -- 0x3C30 + x"FC",x"78",x"00",x"00",x"40",x"E0",x"E0",x"60", -- 0x3C38 + x"00",x"00",x"00",x"00",x"00",x"00",x"18",x"38", -- 0x3C40 + x"38",x"10",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C48 + x"02",x"07",x"07",x"02",x"00",x"00",x"00",x"2E", -- 0x3C50 + x"0C",x"2E",x"40",x"0C",x"2F",x"00",x"00",x"00", -- 0x3C58 + x"18",x"0C",x"2E",x"26",x"03",x"44",x"10",x"03", -- 0x3C60 + x"44",x"2A",x"0C",x"2F",x"22",x"03",x"44",x"10", -- 0x3C68 + x"03",x"44",x"2E",x"03",x"44",x"14",x"03",x"44", -- 0x3C70 + x"0C",x"03",x"44",x"02",x"03",x"44",x"04",x"03", -- 0x3C78 + x"44",x"0E",x"03",x"44",x"18",x"03",x"44",x"06", -- 0x3C80 + x"03",x"44",x"08",x"03",x"44",x"12",x"03",x"44", -- 0x3C88 + x"30",x"03",x"44",x"16",x"03",x"44",x"24",x"03", -- 0x3C90 + x"44",x"26",x"03",x"44",x"2C",x"0C",x"2C",x"0E", -- 0x3C98 + x"03",x"44",x"2C",x"03",x"44",x"40",x"0C",x"2D", -- 0x3CA0 + x"00",x"00",x"00",x"32",x"0C",x"2C",x"30",x"0C", -- 0x3CA8 + x"2D",x"00",x"00",x"00",x"38",x"7C",x"7C",x"FC", -- 0x3CB0 + x"FC",x"78",x"00",x"00",x"40",x"E0",x"E0",x"60", -- 0x3CB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"18",x"38", -- 0x3CC0 + x"38",x"10",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CC8 + x"02",x"07",x"07",x"02",x"00",x"00",x"00",x"2E", -- 0x3CD0 + x"0C",x"2E",x"40",x"0C",x"2F",x"00",x"00",x"00", -- 0x3CD8 + x"18",x"0C",x"2E",x"26",x"03",x"44",x"10",x"03", -- 0x3CE0 + x"44",x"2A",x"0C",x"2F",x"22",x"03",x"44",x"10", -- 0x3CE8 + x"03",x"44",x"2E",x"03",x"44",x"14",x"03",x"44", -- 0x3CF0 + x"0C",x"03",x"44",x"02",x"03",x"44",x"04",x"03", -- 0x3CF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3D98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3DF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3E98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3ED0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3ED8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3EF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3F98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x3FF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF" -- 0x3FF8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/build_id.tcl b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_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/Arcade/Galaxian Hardware/Pisces_MiST/rtl/build_id.v b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/build_id.v new file mode 100644 index 00000000..0841f27d --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180108" +`define BUILD_TIME "220955" diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c07d2629 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1093 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..6bd576cf --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..ee217402 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2026 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..679730ab --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80as.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80as.vhd new file mode 100644 index 00000000..fe477f50 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/cpu/T80as.vhd @@ -0,0 +1,283 @@ +------------------------------------------------------------------------------ +-- t80as.vhd : The non-tristate signal edition of t80a.vhd +-- +-- 2003.2.7 non-tristate modification by Tatsuyuki Satoh +-- +-- 1.separate 'D' to 'DO' and 'DI'. +-- 2.added 'DOE' to 'DO' enable signal.(data direction) +-- 3.MREQ_n,IORQ_n,RD_n,WR_n,RFSH_n,A doesn't become the condition of 'Z'. +-- +-- There is a mark of "--AS" in all the change points. +-- +------------------------------------------------------------------------------ + +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80as is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); +--AS-- D : inout std_logic_vector(7 downto 0) +--AS>> + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + DOE : out std_logic +--< 'Z'); +--AS-- D <= DO when Write = '1' and BUSAK_n_i = '1' else (others => 'Z'); +--AS>> + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DOE <= Write when BUSAK_n_i = '1' else '0'; +--< Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, +-- DInst => D, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then +--AS-- DI_Reg <= to_x01(D); +--AS>> + DI_Reg <= to_x01(DI); +--< 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/dac.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/dac.vhd new file mode 100644 index 00000000..b1ecdcb7 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_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 := 11 + ); + 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/Arcade/Galaxian Hardware/Pisces_MiST/rtl/dpram.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..dafe8385 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/galaxian.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/galaxian.vhd new file mode 100644 index 00000000..138d85cb --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/galaxian.vhd @@ -0,0 +1,448 @@ +------------------------------------------------------------------------------ +-- FPGA GALAXIAN +-- +-- Version downto 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important not +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +-- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--use work.pkg_galaxian.all; + +entity galaxian is + port( + W_CLK_18M : in std_logic; + W_CLK_12M : in std_logic; + W_CLK_6M : in std_logic; + + P1_CSJUDLR : in std_logic_vector(6 downto 0); + P2_CSJUDLR : in std_logic_vector(6 downto 0); + I_RESET : in std_logic; + + W_R : out std_logic_vector(2 downto 0); + W_G : out std_logic_vector(2 downto 0); + W_B : out std_logic_vector(2 downto 0); + HBLANK : out std_logic; + VBLANK : out std_logic; + W_H_SYNC : out std_logic; + W_V_SYNC : out std_logic; + W_SDAT_A : out std_logic_vector( 7 downto 0); + W_SDAT_B : out std_logic_vector( 7 downto 0); + O_CMPBL : out std_logic + ); +end; + +architecture RTL of galaxian is + -- CPU ADDRESS BUS + signal W_A : std_logic_vector(15 downto 0) := (others => '0'); + -- CPU IF + signal W_CPU_CLK : std_logic := '0'; + signal W_CPU_MREQn : std_logic := '0'; + signal W_CPU_NMIn : std_logic := '0'; + signal W_CPU_RDn : std_logic := '0'; + signal W_CPU_RFSHn : std_logic := '0'; + signal W_CPU_WAITn : std_logic := '0'; + signal W_CPU_WRn : std_logic := '0'; + signal W_CPU_WR : std_logic := '0'; + signal W_RESETn : std_logic := '0'; + -------- H and V COUNTER ------------------------- + signal W_C_BLn : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_C_BLXn : std_logic := '0'; + signal W_H_BL : std_logic := '0'; + signal W_H_SYNC_int : std_logic := '0'; + signal W_V_BLn : std_logic := '0'; + signal W_V_BL2n : std_logic := '0'; + signal W_V_SYNC_int : std_logic := '0'; + signal W_H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal W_V_CNT : std_logic_vector(7 downto 0) := (others => '0'); + -------- CPU RAM ---------------------------- + signal W_CPU_RAM_DO : std_logic_vector(7 downto 0) := (others => '0'); + -------- ADDRESS DECDER ---------------------- + signal W_BD_G : std_logic := '0'; + signal W_CPU_RAM_CS : std_logic := '0'; + signal W_CPU_RAM_RD : std_logic := '0'; +-- signal W_CPU_RAM_WR : std_logic := '0'; + signal W_CPU_ROM_CS : std_logic := '0'; + signal W_DIP_OE : std_logic := '0'; + signal W_H_FLIP : std_logic := '0'; + signal W_DRIVER_WE : std_logic := '0'; + signal W_OBJ_RAM_RD : std_logic := '0'; + signal W_OBJ_RAM_RQ : std_logic := '0'; + signal W_OBJ_RAM_WR : std_logic := '0'; + signal W_PITCH : std_logic := '0'; + signal W_SOUND_WE : std_logic := '0'; + signal W_STARS_ON : std_logic := '0'; + signal W_STARS_OFFn : std_logic := '0'; + signal W_SW0_OE : std_logic := '0'; + signal W_SW1_OE : std_logic := '0'; + signal W_V_FLIP : std_logic := '0'; + signal W_VID_RAM_RD : std_logic := '0'; + signal W_VID_RAM_WR : std_logic := '0'; + signal W_WDR_OE : std_logic := '0'; + --------- INPORT ----------------------------- + signal W_SW_DO : std_logic_vector( 7 downto 0) := (others => '0'); + --------- VIDEO ----------------------------- + signal W_VID_DO : std_logic_vector( 7 downto 0) := (others => '0'); + ----- DATA I/F ------------------------------------- + signal W_CPU_ROM_DO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_ROM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_RAM_CLK : std_logic := '0'; + signal W_VOL1 : std_logic := '0'; + signal W_VOL2 : std_logic := '0'; + signal W_FIRE : std_logic := '0'; + signal W_HIT : std_logic := '0'; + signal W_FS : std_logic_vector( 2 downto 0) := (others => '0'); + + signal blx_comb : std_logic := '0'; + signal W_1VF : std_logic := '0'; + signal W_256HnX : std_logic := '0'; + signal W_8HF : std_logic := '0'; + signal W_DAC_A : std_logic := '0'; + signal W_DAC_B : std_logic := '0'; + signal W_MISSILEn : std_logic := '0'; + signal W_SHELLn : std_logic := '0'; + signal W_MS_D : std_logic := '0'; + signal W_MS_R : std_logic := '0'; + signal W_MS_G : std_logic := '0'; + signal W_MS_B : std_logic := '0'; + + signal new_sw : std_logic_vector( 2 downto 0) := (others => '0'); + signal in_game : std_logic_vector( 1 downto 0) := (others => '0'); + signal ROM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal rst_count : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_STARS_B : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_G : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_R : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VIDEO_B : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_G : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_R : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_WAV_A0 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A1 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A2 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D2 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_DAC : std_logic_vector( 3 downto 0) := (others => '0'); + signal gfx_bank : std_logic; + +begin + mc_vid : entity work.MC_VIDEO + port map( + I_CLK_18M => W_CLK_18M, + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT => W_H_CNT, + I_V_CNT => W_V_CNT, + I_H_FLIP => W_H_FLIP, + I_V_FLIP => W_V_FLIP, + I_V_BLn => W_V_BLn, + I_C_BLn => W_C_BLn, + I_A => W_A(9 downto 0), + I_OBJ_SUB_A => "000", + I_BD => W_BDI, + I_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + I_OBJ_RAM_RD => W_OBJ_RAM_RD, + I_OBJ_RAM_WR => W_OBJ_RAM_WR, + I_VID_RAM_RD => W_VID_RAM_RD, + I_VID_RAM_WR => W_VID_RAM_WR, + I_DRIVER_WR => W_DRIVER_WE, + I_BANK => gfx_bank, + O_C_BLnX => W_C_BLnX, + O_8HF => W_8HF, + O_256HnX => W_256HnX, + O_1VF => W_1VF, + O_MISSILEn => W_MISSILEn, + O_SHELLn => W_SHELLn, + O_BD => W_VID_DO, + O_VID => W_VID, + O_COL => W_COL + ); + + cpu : entity work.T80as + port map ( + RESET_n => W_RESETn, + CLK_n => W_CPU_CLK, + WAIT_n => W_CPU_WAITn, + INT_n => '1', + NMI_n => W_CPU_NMIn, + BUSRQ_n => '1', + MREQ_n => W_CPU_MREQn, + RD_n => W_CPU_RDn, + WR_n => W_CPU_WRn, + RFSH_n => W_CPU_RFSHn, + A => W_A, + DI => W_BDO, + DO => W_BDI, + M1_n => open, + IORQ_n => open, + HALT_n => open, + BUSAK_n => open, + DOE => open + ); + + mc_cpu_ram : entity work.MC_CPU_RAM + port map ( + I_CLK => W_CPU_RAM_CLK, + I_ADDR => W_A(9 downto 0), + I_D => W_BDI, + I_WE => W_CPU_WR, + I_OE => W_CPU_RAM_RD, + O_D => W_CPU_RAM_DO + ); + + mc_adec : entity work.MC_ADEC + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_CPU_CLK => W_CPU_CLK, + I_RSTn => W_RESETn, + + I_CPU_A => W_A, + I_CPU_D => W_BDI(0), + I_MREQn => W_CPU_MREQn, + I_RFSHn => W_CPU_RFSHn, + I_RDn => W_CPU_RDn, + I_WRn => W_CPU_WRn, + I_H_BL => W_H_BL, + I_V_BLn => W_V_BLn, + + O_WAITn => W_CPU_WAITn, + O_NMIn => W_CPU_NMIn, + O_CPU_ROM_CS => W_CPU_ROM_CS, + O_CPU_RAM_RD => W_CPU_RAM_RD, +-- O_CPU_RAM_WR => W_CPU_RAM_WR, + O_CPU_RAM_CS => W_CPU_RAM_CS, + O_OBJ_RAM_RD => W_OBJ_RAM_RD, + O_OBJ_RAM_WR => W_OBJ_RAM_WR, + O_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + O_VID_RAM_RD => W_VID_RAM_RD, + O_VID_RAM_WR => W_VID_RAM_WR, + O_SW0_OE => W_SW0_OE, + O_SW1_OE => W_SW1_OE, + O_DIP_OE => W_DIP_OE, + O_WDR_OE => W_WDR_OE, + O_DRIVER_WE => W_DRIVER_WE, + O_SOUND_WE => W_SOUND_WE, + O_PITCH => W_PITCH, + O_H_FLIP => W_H_FLIP, + O_V_FLIP => W_V_FLIP, + O_BD_G => W_BD_G, + O_STARS_ON => W_STARS_ON + ); + +-- active high buttons + mc_inport : entity work.MC_INPORT + port map ( + I_COIN1 => P1_CSJUDLR(6), + I_COIN2 => P2_CSJUDLR(6), + I_1P_START => P1_CSJUDLR(5), + I_2P_START => P2_CSJUDLR(5), + I_1P_SH => P1_CSJUDLR(4), + I_2P_SH => P2_CSJUDLR(4), + I_1P_LE => P1_CSJUDLR(1), + I_2P_LE => P2_CSJUDLR(1), + I_1P_RI => P1_CSJUDLR(0), + I_2P_RI => P2_CSJUDLR(0), + I_SW0_OE => W_SW0_OE, + I_SW1_OE => W_SW1_OE, + I_DIP_OE => W_DIP_OE, + O_D => W_SW_DO + ); + + mc_hv : entity work.MC_HV_COUNT + port map( + I_CLK => W_CLK_6M, + I_RSTn => W_RESETn, + O_H_CNT => W_H_CNT, + O_H_SYNC => W_H_SYNC_int, + O_H_BL => W_H_BL, + O_V_CNT => W_V_CNT, + O_V_SYNC => W_V_SYNC_int, + O_V_BL2n => W_V_BL2n, + O_V_BLn => W_V_BLn, + O_C_BLn => W_C_BLn + ); + + mc_col_pal : entity work.MC_COL_PAL + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_VID => W_VID, + I_COL => W_COL, + I_C_BLnX => W_C_BLnX, + O_C_BLXn => W_C_BLXn, + O_STARS_OFFn => W_STARS_OFFn, + O_R => W_VIDEO_R, + O_G => W_VIDEO_G, + O_B => W_VIDEO_B + ); + + mc_stars : entity work.MC_STARS + port map ( + I_CLK_18M => W_CLK_18M, + I_CLK_6M => W_CLK_6M, + I_H_FLIP => W_H_FLIP, + I_V_SYNC => W_V_SYNC_int, + I_8HF => W_8HF, + I_256HnX => W_256HnX, + I_1VF => W_1VF, + I_2V => W_V_CNT(1), + I_STARS_ON => W_STARS_ON, + I_STARS_OFFn => W_STARS_OFFn, + O_R => W_STARS_R, + O_G => W_STARS_G, + O_B => W_STARS_B, + O_NOISE => open + ); + + mc_sound_a : entity work.MC_SOUND_A + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT1 => W_H_CNT(1), + I_BD => W_BDI, + I_PITCH => W_PITCH, + I_VOL1 => W_VOL1, + I_VOL2 => W_VOL2, + O_SDAT => W_SDAT_A, + O_DO => open + ); + + vmc_sound_b : entity work.MC_SOUND_B + port map( + I_CLK1 => W_CLK_6M, + I_RSTn => rst_count(3), + I_SW => new_sw, + I_DAC => W_DAC, + I_FS => W_FS, + O_SDAT => W_SDAT_B + ); + +--------- ROM ------------------------------------------------------- + mc_roms : entity work.ROM_PGM_0 + port map ( + CLK => W_CLK_12M, + ADDR => W_A(13 downto 0), + DATA => W_CPU_ROM_DO + ); + +-------- VIDEO ----------------------------- + blx_comb <= not ( W_C_BLXn and W_V_BL2n ); + W_V_SYNC <= not W_V_SYNC_int; + W_H_SYNC <= not W_H_SYNC_int; + O_CMPBL <= W_C_BLnX; + + -- MISSILE => Yellow ; + -- SHELL => White ; + W_MS_D <= not (W_MISSILEn and W_SHELLn); + W_MS_R <= not blx_comb and W_MS_D; + W_MS_G <= not blx_comb and W_MS_D; + W_MS_B <= not blx_comb and W_MS_D and not W_SHELLn ; + + W_R <= W_VIDEO_R or (W_STARS_R & "0") or (W_MS_R & W_MS_R & "0"); + W_G <= W_VIDEO_G or (W_STARS_G & "0") or (W_MS_G & W_MS_G & "0"); + W_B <= W_VIDEO_B or (W_STARS_B & "0") or (W_MS_B & W_MS_B & "0"); + + process(W_CLK_6M) + begin + if rising_edge(W_CLK_6M) then + HBLANK <= not W_C_BLXn; + VBLANK <= not W_V_BL2n; + end if; + end process; + + +----- CPU I/F ------------------------------------- + + W_CPU_CLK <= W_H_CNT(0); + W_CPU_RAM_CLK <= W_CLK_12M and W_CPU_RAM_CS; + + W_CPU_ROM_DOB <= W_CPU_ROM_DO when W_CPU_ROM_CS = '1' else (others=>'0'); + + W_RESETn <= not I_RESET; + W_BDO <= W_SW_DO or W_VID_DO or W_CPU_RAM_DO or W_CPU_ROM_DOB ; + W_CPU_WR <= not W_CPU_WRn; + + new_sw <= (W_FS(2) or W_FS(1) or W_FS(0)) & W_HIT & W_FIRE; + + process(W_CPU_CLK, I_RESET) + begin + if (I_RESET = '1') then + rst_count <= (others => '0'); + elsif rising_edge( W_CPU_CLK) then + if ( rst_count /= x"f") then + rst_count <= rst_count + 1; + end if; + end if; + end process; + +----- Parts 9L --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_FS <= (others=>'0'); + W_HIT <= '0'; + W_FIRE <= '0'; + W_VOL1 <= '0'; + W_VOL2 <= '0'; + elsif rising_edge(W_CLK_12M) then + if (W_SOUND_WE = '1') then + case(W_A(2 downto 0)) is + when "000" => W_FS(0) <= W_BDI(0); + when "001" => W_FS(1) <= W_BDI(0); + when "010" => W_FS(2) <= W_BDI(0); + when "011" => W_HIT <= W_BDI(0); +-- when "100" => UNUSED <= W_BDI(0); + when "101" => W_FIRE <= W_BDI(0); + when "110" => W_VOL1 <= W_BDI(0); + when "111" => W_VOL2 <= W_BDI(0); + when others => null; + end case; + end if; + end if; + end process; + +----- Parts 9M --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_DAC <= (others=>'0'); + elsif rising_edge(W_CLK_12M) then + if (W_DRIVER_WE = '1') then + case(W_A(2 downto 0)) is + -- next 4 outputs go off board via ULN2075 buffer +-- when "000" => 1P START <= W_BDI(0); +-- when "001" => 2P START <= W_BDI(0); + when "010" => gfx_bank <= W_BDI(0); +-- when "011" => COIN CTR <= W_BDI(0); + when "100" => W_DAC(0) <= W_BDI(0); -- 1M + when "101" => W_DAC(1) <= W_BDI(0); -- 470K + when "110" => W_DAC(2) <= W_BDI(0); -- 220K + when "111" => W_DAC(3) <= W_BDI(0); -- 100K + when others => null; + end case; + end if; + end if; + end process; + +------------------------------------------------------------------------------- +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/hq2x.sv b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_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/Arcade/Galaxian Hardware/Pisces_MiST/rtl/keyboard.v b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_adec.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_adec.vhd new file mode 100644 index 00000000..7245ce8c --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_adec.vhd @@ -0,0 +1,251 @@ +--------------------------------------------------------------------- +-- FPGA GALAXIAN ADDRESS DECDER +-- +-- Version : 2.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +--------------------------------------------------------------------- +-- +--GALAXIAN Address Map +-- +-- Address Item(R..read-mode W..wight-mode) Parts +--0000 - 1FFF CPU-ROM..R ( 7H or 7K ) +--2000 - 3FFF CPU-ROM..R ( 7L ) +--4000 - 47FF CPU-RAM..RW ( 7N & 7P ) +--5000 - 57FF VID-RAM..RW +--5800 - 5FFF OBJ-RAM..RW +--6000 - SW0..R LAMP......W +--6800 - SW1..R SOUND.....W +--7000 - DIP..R +--7001 NMI_ON....W +--7004 STARS_ON..W +--7006 H_FLIP....W +--7007 V-FLIP....W +--7800 WDR..R PITCH.....W +-- +--W MODE +--6000 1P START +--6001 2P START +--6002 COIN LOCKOUT +--6003 COIN COUNTER +--6004 - 6007 SOUND CONTROL(OSC) +-- +--6800 SOUND CONTROL(FS1) +--6801 SOUND CONTROL(FS2) +--6802 SOUND CONTROL(FS3) +--6803 SOUND CONTROL(HIT) +--6805 SOUND CONTROL(SHOT) +--6806 SOUND CONTROL(VOL1) +--6807 SOUND CONTROL(VOL2) +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_ADEC is + port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_CPU_CLK : in std_logic; + I_RSTn : in std_logic; + + I_CPU_A : in std_logic_vector(15 downto 0); + I_CPU_D : in std_logic; + I_MREQn : in std_logic; + I_RFSHn : in std_logic; + I_RDn : in std_logic; + I_WRn : in std_logic; + I_H_BL : in std_logic; + I_V_BLn : in std_logic; + + O_WAITn : out std_logic; + O_NMIn : out std_logic; + O_CPU_ROM_CS : out std_logic; + O_CPU_RAM_RD : out std_logic; + O_CPU_RAM_WR : out std_logic; + O_CPU_RAM_CS : out std_logic; + O_OBJ_RAM_RD : out std_logic; + O_OBJ_RAM_WR : out std_logic; + O_OBJ_RAM_RQ : out std_logic; + O_VID_RAM_RD : out std_logic; + O_VID_RAM_WR : out std_logic; + O_SW0_OE : out std_logic; + O_SW1_OE : out std_logic; + O_DIP_OE : out std_logic; + O_WDR_OE : out std_logic; + O_DRIVER_WE : out std_logic; + O_SOUND_WE : out std_logic; + O_PITCH : out std_logic; + O_H_FLIP : out std_logic; + O_V_FLIP : out std_logic; + O_BD_G : out std_logic; + O_STARS_ON : out std_logic + ); +end; + +architecture RTL of MC_ADEC is + signal W_8E1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8E2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8P_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8M_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_9N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_NMI_ONn : std_logic := '0'; + -------- CPU WAITn ---------------------------------------------- +-- signal W_6S1_Q : std_logic := '0'; + signal W_6S1_Qn : std_logic := '0'; +-- signal W_6S2_Qn : std_logic := '0'; + + signal W_V_BL : std_logic := '0'; + +begin + W_NMI_ONn <= W_9N_Q(1); -- galaxian + +-- O_WAITn <= '1' ; -- No Wait + O_WAITn <= W_6S1_Qn; + + process(I_CPU_CLK, I_V_BLn) + begin + if (I_V_BLn = '0') then +-- W_6S1_Q <= '0'; + W_6S1_Qn <= '1'; + elsif rising_edge(I_CPU_CLK) then +-- W_6S1_Q <= not (I_H_BL or W_8P_Q(2)); + W_6S1_Qn <= I_H_BL or W_8P_Q(2); + end if; + end process; + +-- process(I_CPU_CLK) +-- begin +-- if falling_edge(I_CPU_CLK) then +-- W_6S2_Qn <= not W_6S1_Q; +-- end if; +-- end process; + +-------- CPU NMIn ----------------------------------------------- + W_V_BL <= not I_V_BLn; + process(W_V_BL, W_NMI_ONn) + begin + if (W_NMI_ONn = '0') then + O_NMIn <= '1'; + elsif rising_edge(W_V_BL) then + O_NMIn <= '0'; + end if; + end process; + + ------------------------------------------------------------------- + u_8e1 : entity work.LOGIC_74XX139 + port map ( + I_G => I_MREQn, + I_Sel(1) => I_CPU_A(15), + I_Sel(0) => I_CPU_A(14), + O_Q => W_8E1_Q + ); + + ---------- CPU_ROM CS 0000 - 3FFF --------------------------- + u_8e2 : entity work.LOGIC_74XX139 + port map ( + I_G => I_RDn, + I_Sel(1) => W_8E1_Q(0), + I_Sel(0) => I_CPU_A(13), + O_Q => W_8E2_Q + ); + + O_CPU_ROM_CS <= not (W_8E2_Q(0) and W_8E2_Q(1) ) ; -- 0000 - 3FFF + ------------------------------------------------------------------- + -- ADDRESS + -- W_8E1_Q[0] = 0000 - 3FFF ---- CPU_ROM_USE + -- W_8E1_Q[1] = 4000 - 7FFF ---- GALAXIAN USE *1 + -- W_8E1_Q[2] = 8000 - BFFF ---- MOONCREST USE + -- W_8E1_Q[3] = C000 - FFFF + + u_8p : entity work.LOGIC_74XX138 + port map ( + I_G1 => I_RFSHn, + I_G2a => W_8E1_Q(1), -- <= *1 + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8P_Q + ); + + u_8n : entity work.LOGIC_74XX138 + port map ( + I_G1 => '1', + I_G2a => I_RDn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8N_Q + ); + + u_8m : entity work.LOGIC_74XX138 + port map ( + -- I_G1 => W_6S2_Qn, + I_G1 => '1', -- No Wait + I_G2a => I_WRn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8M_Q + ); + + O_BD_G <= not (W_8E1_Q(0) and W_8P_Q(0)); + O_OBJ_RAM_RQ <= not W_8P_Q(3); + + O_CPU_RAM_CS <= not (W_8N_Q(0) and W_8M_Q(0)); + + O_WDR_OE <= not W_8N_Q(7); + O_DIP_OE <= not W_8N_Q(6); + O_SW1_OE <= not W_8N_Q(5); + O_SW0_OE <= not W_8N_Q(4); + O_OBJ_RAM_RD <= not W_8N_Q(3); + O_VID_RAM_RD <= not W_8N_Q(2); +-- UNUSED <= not W_8N_Q(1); + O_CPU_RAM_RD <= not W_8N_Q(0); + + O_PITCH <= not W_8M_Q(7); +-- STARS_ON_ENA <= not W_8M_Q(6); + O_SOUND_WE <= not W_8M_Q(5); + O_DRIVER_WE <= not W_8M_Q(4); + O_OBJ_RAM_WR <= not W_8M_Q(3); + O_VID_RAM_WR <= not W_8M_Q(2); +-- UNUSED <= not W_8M_Q(1); + O_CPU_RAM_WR <= not W_8M_Q(0); + + ----- Parts 9N --------- + + process(I_CLK_12M, I_RSTn) + begin + if (I_RSTn = '0') then + W_9N_Q <= (others => '0'); + elsif rising_edge(I_CLK_12M) then + if (W_8M_Q(6) = '0') then + case I_CPU_A(2 downto 0) is + when "000" => W_9N_Q(0) <= I_CPU_D; + when "001" => W_9N_Q(1) <= I_CPU_D; + when "010" => W_9N_Q(2) <= I_CPU_D; + when "011" => W_9N_Q(3) <= I_CPU_D; + when "100" => W_9N_Q(4) <= I_CPU_D; + when "101" => W_9N_Q(5) <= I_CPU_D; + when "110" => W_9N_Q(6) <= I_CPU_D; + when "111" => W_9N_Q(7) <= I_CPU_D; + when others => null; + end case; + end if; + end if; + end process; + + O_STARS_ON <= W_9N_Q(4); + O_H_FLIP <= W_9N_Q(6); + O_V_FLIP <= W_9N_Q(7); + +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_bram.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_bram.vhd new file mode 100644 index 00000000..a6df1ce1 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_bram.vhd @@ -0,0 +1,182 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA & GALAXIAN +-- FPGA BLOCK RAM I/F (XILINX SPARTAN) +-- +-- Version : 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- mc_col_rom(6L) added by k.Degawa +-- +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. K.Degawa +-- 2004- 9-18 added Xilinx Device K.Degawa +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_top.v use +entity MC_CPU_RAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(9 downto 0); + I_D : in std_logic_vector(7 downto 0); + I_WE : in std_logic; + I_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) + ); +end; +architecture RTL of MC_CPU_RAM is + + signal W_D : std_logic_vector(7 downto 0) := (others => '0'); +begin + O_D <= W_D when I_OE ='1' else (others=>'0'); + + ram_inst : work.spram generic map(10,8) + port map + ( + address => I_ADDR, + clock => I_CLK, + data => I_D, + wren => I_WE, + q => W_D + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_OBJ_RAM is + port( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(7 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(7 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); + end; + +architecture RTL of MC_OBJ_RAM is +begin + + ram_inst : work.dpram generic map(8,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_VID_RAM is + port ( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(9 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(9 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of MC_VID_RAM is +begin + ram_inst : work.dpram generic map(10,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_LRAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(7 downto 0); + I_D : in std_logic_vector(4 downto 0); + I_WE : in std_logic; + O_Dn : out std_logic_vector(4 downto 0) + ); +end; + +architecture RTL of MC_LRAM is + signal W_D : std_logic_vector(4 downto 0) := (others => '0'); +begin + + O_Dn <= not W_D; + + ram_inst : work.dpram generic map(8,5) + port map + ( + clock_a => I_CLK, + address_a => I_ADDR, + data_a => I_D, + wren_a => not I_WE, + + clock_b => not I_CLK, + address_b => I_ADDR, + data_b => (others => '0'), + q_b => W_D, + enable_b => '1', + wren_b => '0' + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_clocks.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_clocks.vhd new file mode 100644 index 00000000..5a4d0094 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_clocks.vhd @@ -0,0 +1,85 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA CLOCK GEN +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +----------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity CLOCKGEN is +port ( + CLKIN_IN : in std_logic; + RST_IN : in std_logic; + -- + O_CLK_24M : out std_logic; + O_CLK_18M : out std_logic; + O_CLK_12M : out std_logic; + O_CLK_06M : out std_logic +); +end; + +architecture RTL of CLOCKGEN is + signal state : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr1 : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr2 : std_logic_vector(2 downto 0) := (others => '0'); + signal CLKFB_IN : std_logic := '0'; + signal CLK0_BUF : std_logic := '0'; + signal CLKFX_BUF : std_logic := '0'; + signal CLK_72M : std_logic := '0'; + signal I_DCM_LOCKED : std_logic := '0'; + +begin + dcm_inst : DCM_SP + generic map ( + CLKFX_MULTIPLY => 9, + CLKFX_DIVIDE => 4, + CLKIN_PERIOD => 31.25 + ) + port map ( + CLKIN => CLKIN_IN, + CLKFB => CLKFB_IN, + RST => RST_IN, + CLK0 => CLK0_BUF, + CLKFX => CLKFX_BUF, + LOCKED => I_DCM_LOCKED + ); + + BUFG0 : BUFG port map (I=> CLK0_BUF, O => CLKFB_IN); + BUFG1 : BUFG port map (I=> CLKFX_BUF, O => CLK_72M); + O_CLK_06M <= ctr2(2); + O_CLK_12M <= ctr2(1); + O_CLK_24M <= ctr2(0); + O_CLK_18M <= ctr1(1); + + -- generate all clocks, 36Mhz, 18Mhz, 24Mhz, 12Mhz and 6Mhz + process(CLK_72M) + begin + if rising_edge(CLK_72M) then + if (I_DCM_LOCKED = '0') then + state <= "00"; + ctr1 <= (others=>'0'); + ctr2 <= (others=>'0'); + else + ctr1 <= ctr1 + 1; + case state is + when "00" => state <= "01"; ctr2 <= ctr2 + 1; + when "01" => state <= "10"; ctr2 <= ctr2 + 1; + when "10" => state <= "00"; + when "11" => state <= "00"; + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_col_pal.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_col_pal.vhd new file mode 100644 index 00000000..c4dc06ad --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_col_pal.vhd @@ -0,0 +1,78 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA COLOR-PALETTE +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-18 added Xilinx Device. K.Degawa +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; +-- use ieee.numeric_std.all; + +--library UNISIM; +-- use UNISIM.Vcomponents.all; + +entity MC_COL_PAL is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_VID : in std_logic_vector(1 downto 0); + I_COL : in std_logic_vector(2 downto 0); + I_C_BLnX : in std_logic; + + O_C_BLXn : out std_logic; + O_STARS_OFFn : out std_logic; + O_R : out std_logic_vector(2 downto 0); + O_G : out std_logic_vector(2 downto 0); + O_B : out std_logic_vector(2 downto 0) +); +end; + +architecture RTL of MC_COL_PAL is + --- Parts 6M -------------------------------------------------------- + signal W_COL_ROM_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6M_DI : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_DO : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_CLR : std_logic := '0'; + +begin + W_6M_DI <= I_COL(2 downto 0) & I_VID(1 downto 0) & not (I_VID(0) or I_VID(1)) & I_C_BLnX; + W_6M_CLR <= W_6M_DI(0) or W_6M_DO(0); + O_C_BLXn <= W_6M_DI(0) or W_6M_DO(0); + O_STARS_OFFn <= W_6M_DO(1); + +--always@(posedge I_CLK_6M or negedge W_6M_CLR) + process(I_CLK_6M, W_6M_CLR) + begin + if (W_6M_CLR = '0') then + W_6M_DO <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + W_6M_DO <= W_6M_DI; + end if; + end process; + + --- COL ROM -------------------------------------------------------- +--wire W_COL_ROM_OEn = W_6M_DO[1]; + + galaxian_6l : entity work.GALAXIAN_6L + port map ( + CLK => I_CLK_12M, + ADDR => W_6M_DO(6 downto 2), + DATA => W_COL_ROM_DO + ); + + --- VID OUT -------------------------------------------------------- + O_R <= W_COL_ROM_DO(2 downto 0); + O_G <= W_COL_ROM_DO(5 downto 3); + O_B <= W_COL_ROM_DO(7 downto 6) & "0"; + +end; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_hv_count.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_hv_count.vhd new file mode 100644 index 00000000..f310321b --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_hv_count.vhd @@ -0,0 +1,145 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA H & V COUNTER +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 +----------------------------------------------------------------------- +-- MoonCrest hv_count +-- H_CNT 0 - 255 , 384 - 511 Total 384 count +-- V_CNT 0 - 255 , 504 - 511 Total 264 count +------------------------------------------------------------------------------------------- +-- H_CNT[0], H_CNT[1], H_CNT[2], H_CNT[3], H_CNT[4], H_CNT[5], H_CNT[6], H_CNT[7], H_CNT[8], +-- 1 H 2 H 4 H 8 H 16 H 32 H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT[0], V_CNT[1], V_CNT[2], V_CNT[3], V_CNT[4], V_CNT[5], V_CNT[6], V_CNT[7] +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_HV_COUNT is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + O_H_CNT : out std_logic_vector(8 downto 0); + O_H_SYNC : out std_logic; + O_H_BL : out std_logic; + O_V_BL2n : out std_logic; + O_V_CNT : out std_logic_vector(7 downto 0); + O_V_SYNC : out std_logic; + O_V_BLn : out std_logic; + O_C_BLn : out std_logic + ); +end; + +architecture RTL of MC_HV_COUNT is + signal H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal V_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal H_SYNC : std_logic := '0'; + signal H_CLK : std_logic := '0'; + signal H_BL : std_logic := '0'; + signal V_BLn : std_logic := '0'; + signal V_BL2n : std_logic := '0'; + +begin +--------- H_COUNT ---------------------------------------- + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if (H_CNT = 255) then + H_CNT <= std_logic_vector(to_unsigned(384, H_CNT'length)); + else + H_CNT <= H_CNT + 1 ; + end if; + end if; + end process; + + O_H_CNT <= H_CNT; + +--------- H_SYNC ---------------------------------------- + H_CLK <= H_CNT(4); + process(H_CLK, H_CNT(8)) + begin + if (H_CNT(8) = '0') then + H_SYNC <= '0'; + elsif rising_edge(H_CLK) then + H_SYNC <= (not H_CNT(6) ) and H_CNT(5); + end if; + end process; + + O_H_SYNC <= H_SYNC; + +--------- H_BL ------------------------------------------ + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if H_CNT = 387 then + H_BL <= '1'; + elsif H_CNT = 503 then + H_BL <= '0'; + end if; + end if; + end process; + + O_H_BL <= H_BL; + +--------- V_COUNT ---------------------------------------- + process(H_SYNC, I_RSTn) + begin + if (I_RSTn = '0') then + V_CNT <= (others => '0'); + elsif rising_edge(H_SYNC) then + if (V_CNT = 255) then + V_CNT <= std_logic_vector(to_unsigned(504, V_CNT'length)); + else + V_CNT <= V_CNT + 1 ; + end if; + end if; + end process; + + O_V_CNT <= V_CNT(7 downto 0); + O_V_SYNC <= V_CNT(8); + +--------- V_BLn ------------------------------------------ + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BLn <= '0'; + elsif V_CNT(7 downto 0) = 15 then + V_BLn <= '1'; + end if; + end if; + end process; + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BL2n <= '0'; + elsif V_CNT(7 downto 0) = 16 then + V_BL2n <= '1'; + end if; + end if; + end process; + + O_V_BLn <= V_BLn; + O_V_BL2n <= V_BL2n; +------- C_BLn ------------------------------------------ + O_C_BLn <= V_BLn and (not H_CNT(8)); + +end; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_inport.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_inport.vhd new file mode 100644 index 00000000..01cee00a --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_inport.vhd @@ -0,0 +1,74 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA INPORT +-- +-- Version : 1.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004-4-30 galaxian modify by K.DEGAWA +----------------------------------------------------------------------- + +-- DIP SW 0 1 2 3 4 5 +----------------------------------------------------------------- +-- COIN CHUTE +-- 1 COIN/1 PLAY 1'b0 1'b0 +-- 2 COIN/1 PLAY 1'b1 1'b0 +-- 1 COIN/2 PLAY 1'b0 1'b1 +-- FREE PLAY 1'b1 1'b1 +-- BOUNS +-- 1'b0 1'b0 +-- 1'b1 1'b0 +-- 1'b0 1'b1 +-- 1'b1 1'b1 +-- LIVES +-- 2 1'b0 +-- 3 1'b1 +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_INPORT is +port ( + I_COIN1 : in std_logic; -- active high + I_COIN2 : in std_logic; -- active high + I_1P_LE : in std_logic; -- active high + I_1P_RI : in std_logic; -- active high + I_1P_SH : in std_logic; -- active high + I_2P_LE : in std_logic; + I_2P_RI : in std_logic; + I_2P_SH : in std_logic; + I_1P_START : in std_logic; -- active high + I_2P_START : in std_logic; -- active high + I_SW0_OE : in std_logic; + I_SW1_OE : in std_logic; + I_DIP_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) +); + +end; + +architecture RTL of MC_INPORT is + + constant W_TABLE : std_logic := '0'; -- UP = 0; + constant W_TEST : std_logic := '0'; + constant W_SERVICE : std_logic := '0'; + + signal W_SW0_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SW1_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_DIP_DO : std_logic_vector(7 downto 0) := (others => '0'); + +begin + + W_SW0_DO <= x"00" when I_SW0_OE = '0' else W_SERVICE & W_TEST & W_TABLE & I_1P_SH & I_1P_RI & I_1P_LE & I_COIN1 & I_COIN2; + W_SW1_DO <= x"00" when I_SW1_OE = '0' else "010" & I_2P_SH & I_2P_RI & I_2P_LE & I_2P_START & I_1P_START; + W_DIP_DO <= x"00" when I_DIP_OE = '0' else "00000000"; + O_D <= W_SW0_DO or W_SW1_DO or W_DIP_DO ; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_ld_pls.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_ld_pls.vhd new file mode 100644 index 00000000..0945fe35 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_ld_pls.vhd @@ -0,0 +1,115 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA VIDEO-LD_PLS_GEN +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_LD_PLS is + port ( + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_3D_DI : in std_logic; + + O_LDn : out std_logic; + O_CNTRLDn : out std_logic; + O_CNTRCLRn : out std_logic; + O_COLLn : out std_logic; + O_VPLn : out std_logic; + O_OBJDATALn : out std_logic; + O_MLDn : out std_logic; + O_SLDn : out std_logic + ); +end; + +architecture RTL of MC_LD_PLS is + signal W_4C1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C1_Q3 : std_logic := '0'; + signal W_4C2_B : std_logic := '0'; + signal W_4D1_G : std_logic := '0'; + signal W_4D1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4D2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_5C_Q : std_logic := '0'; + signal W_HCNT : std_logic := '0'; +begin + O_LDn <= W_4D1_G; + O_CNTRLDn <= W_4D1_Q(2); + O_CNTRCLRn <= W_4D1_Q(0); + O_COLLn <= W_4D2_Q(2); + O_VPLn <= W_4D2_Q(0); + O_OBJDATALn <= W_4C1_Q(2); + O_MLDn <= W_4C2_Q(0); + O_SLDn <= W_4C2_Q(1); + W_4D1_G <= not (I_H_CNT(0) and I_H_CNT(1) and I_H_CNT(2)); + W_HCNT <= not (I_H_CNT(6) and I_H_CNT(5) and I_H_CNT(4) and I_H_CNT(3)); + -- Parts 4D + u_4d1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_G, + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q =>W_4D1_Q + ); + + u_4d2 : entity work.LOGIC_74XX139 + port map( + I_G => W_5C_Q, + I_Sel(1) => I_H_CNT(2), + I_Sel(0) => I_H_CNT(1), + O_Q => W_4D2_Q + ); + + -- Parts 4C + u_4c1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D2_Q(1), + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q => W_4C1_Q + ); + + u_4c2 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_Q(3), + I_Sel(1) => W_4C2_B, + I_Sel(0) => W_HCNT, + O_Q => W_4C2_Q + ); + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_5C_Q <= I_H_CNT(0); + end if; + end process; + + -- 2004-9-22 added + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + W_4C1_Q3 <= W_4C1_Q(3); + end if; + end process; + + process(W_4C1_Q3) + begin + if rising_edge(W_4C1_Q3) then + W_4C2_B <= I_3D_DI; + end if; + end process; + +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_logic.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_logic.vhd new file mode 100644 index 00000000..5dae8a87 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_logic.vhd @@ -0,0 +1,92 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA LOGIC IP MODULE +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx138 +-- 3-to-8 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX138 is + port ( + I_G1 : in std_logic; + I_G2a : in std_logic; + I_G2b : in std_logic; + I_Sel : in std_logic_vector(2 downto 0); + O_Q : out std_logic_vector(7 downto 0) + ); +end logic_74xx138; + +architecture RTL of LOGIC_74XX138 is + signal I_G : std_logic_vector(2 downto 0) := (others => '0'); + +begin + I_G <= I_G1 & I_G2a & I_G2b; + + xx138 : process(I_G, I_Sel) + begin + if(I_G = "100" ) then + case I_Sel is + when "000" => O_Q <= "11111110"; + when "001" => O_Q <= "11111101"; + when "010" => O_Q <= "11111011"; + when "011" => O_Q <= "11110111"; + when "100" => O_Q <= "11101111"; + when "101" => O_Q <= "11011111"; + when "110" => O_Q <= "10111111"; + when "111" => O_Q <= "01111111"; + when others => null; + end case; + else + O_Q <= (others => '1'); + end if; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx139 +-- 2-to-4 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX139 is + port ( + I_G : in std_logic; + I_Sel : in std_logic_vector(1 downto 0); + O_Q : out std_logic_vector(3 downto 0) + ); +end; + +architecture RTL of LOGIC_74XX139 is +begin + xx139 : process (I_G, I_Sel) + begin + if I_G = '0' then + case I_Sel is + when "00" => O_Q <= "1110"; + when "01" => O_Q <= "1101"; + when "10" => O_Q <= "1011"; + when "11" => O_Q <= "0111"; + when others => null; + end case; + else + O_Q <= "1111"; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_missile.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_missile.vhd new file mode 100644 index 00000000..c5aa6633 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_missile.vhd @@ -0,0 +1,107 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA VIDEO-MISSILE +---- +---- Version : 2.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_MISSILE is + port( + I_CLK_6M : in std_logic; + I_CLK_18M : in std_logic; + I_C_BLn_X : in std_logic; + I_MLDn : in std_logic; + I_SLDn : in std_logic; + I_HPOS : in std_logic_vector (7 downto 0); + + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic + ); +end; + +architecture RTL of MC_MISSILE is + signal W_45R_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_45S_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_5P1_Q : std_logic := '0'; + signal W_5P2_Q : std_logic := '0'; + signal W_5P1_CLK : std_logic := '0'; + signal W_5P2_CLK : std_logic := '0'; +begin + + O_MISSILEn <= W_5P1_CLK; + O_SHELLn <= W_5P2_CLK; + + -- missile counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if (I_MLDn = '0') then + W_45R_Q <= I_HPOS; + else + if (I_C_BLn_X = '1') then + W_45R_Q <= W_45R_Q + 1; + if (W_45R_Q(7 downto 2) = "111111") and W_5P1_Q = '1' then + W_5P1_CLK <= '0'; + else + W_5P1_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- shell counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if(I_SLDn = '0') then + W_45S_Q <= I_HPOS; + else + if(I_C_BLn_X = '1') then + W_45S_Q <= W_45S_Q + 1; + if (W_45S_Q(7 downto 2) = "111111") and W_5P2_Q = '1' then + W_5P2_CLK <= '0'; + else + W_5P2_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_MLDn) and clock active on rising edge (W_5P1_CLK) + process(W_5P1_CLK, I_MLDn) + begin + if (I_MLDn = '0') then + W_5P1_Q <= '1'; + elsif rising_edge(W_5P1_CLK) then + W_5P1_Q <= '0'; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_SLDn) and clock active on rising edge (W_5P2_CLK) + process(W_5P2_CLK, I_SLDn) + begin + if (I_SLDn = '0') then + W_5P2_Q <= '1'; + elsif rising_edge(W_5P2_CLK) then + W_5P2_Q <= '0'; + end if; + end process; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_sound_a.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_sound_a.vhd new file mode 100644 index 00000000..ee0c66be --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_sound_a.vhd @@ -0,0 +1,117 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA SOUND I/F +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + use IEEE.std_logic_arith.all; + +entity MC_SOUND_A is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT1 : in std_logic; + I_BD : in std_logic_vector(7 downto 0); + I_PITCH : in std_logic; + I_VOL1 : in std_logic; + I_VOL2 : in std_logic; + + O_SDAT : out std_logic_vector(7 downto 0); + O_DO : out std_logic_vector(3 downto 0) +); +end; + +architecture RTL of MC_SOUND_A is + signal W_PITCH : std_logic := '0'; + signal W_89K_LDn : std_logic := '0'; + signal W_89K_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_89K_LDATA : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6T_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_SDAT0 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT2 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT3 : std_logic_vector(7 downto 0) := (others => '0'); + +begin + O_DO <= W_6T_Q; + + process (I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_PITCH <= I_PITCH; + if (W_89K_Q = x"ff") then + W_89K_LDn <= '0' ; + else + W_89K_LDn <= '1' ; + end if; + end if; + end process; + + -- Parts 9J + process (W_PITCH) + begin + if falling_edge(W_PITCH) then + W_89K_LDATA <= I_BD; + end if; + end process; + + process (I_H_CNT1) + begin + if rising_edge(I_H_CNT1) then + if (W_89K_LDn = '0') then + W_89K_Q <= W_89K_LDATA; + else + W_89K_Q <= W_89K_Q + 1; + end if; + end if; + end process; + + process (W_89K_LDn) + begin + if falling_edge(W_89K_LDn) then + W_6T_Q <= W_6T_Q + 1; + end if; + end process; + + process (I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + O_SDAT <= (x"14" + W_SDAT3) + (W_SDAT0 + W_SDAT2); + + if W_6T_Q(0)='1' then + W_SDAT0 <= x"2a"; + else + W_SDAT0 <= (others => '0'); + end if; + + if W_6T_Q(2)='1' then + if I_VOL1 = '1' then + W_SDAT2 <= x"69"; + else + W_SDAT2 <= x"39"; + end if; + else + W_SDAT2 <= (others => '0'); + end if; + + if (W_6T_Q(3)='1') and (I_VOL2 = '1') then + W_SDAT3 <= x"48" ; + else + W_SDAT3 <= (others => '0'); + end if; + + end if; + end process; + +end; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_sound_b.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_sound_b.vhd new file mode 100644 index 00000000..b74e4bb1 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_sound_b.vhd @@ -0,0 +1,253 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA WAVE SOUND +---- +---- Version : 1.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does no guarantee this program. +---- You can use this at your own risk. +---- +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--pragma translate_off +-- use ieee.std_logic_textio.all; +-- use std.textio.all; +--pragma translate_on + +entity MC_SOUND_B is + port( + I_CLK1 : in std_logic; -- 6MHz + I_RSTn : in std_logic; + I_SW : in std_logic_vector( 2 downto 0); + I_DAC : in std_logic_vector( 3 downto 0); + I_FS : in std_logic_vector( 2 downto 0); + O_SDAT : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_B is +constant sample_time : integer := 557; -- sample time : 557 = 11025Hz, 557/2 = 22050Hz +constant fire_cnt : std_logic_vector(15 downto 0) := x"2000"; +constant hit_cnt : std_logic_vector(15 downto 0) := x"2000"; + +signal sample : std_logic_vector(10 downto 0) := (others => '0'); +signal sample_pls : std_logic := '0'; +signal s0_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s0_trg : std_logic := '0'; +signal s1_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s1_trg : std_logic := '0'; +signal fire_addr : std_logic_vector(15 downto 0) := (others => '0'); +signal hit_addr : std_logic_vector(15 downto 0) := (others => '0'); + +signal WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); +signal WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + +signal W_VCO1_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO1_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal VCO_CTR : std_logic_vector(24 downto 0) := (others => '0'); + +signal SDAT : std_logic_vector(10 downto 0) := (others => '0'); + +begin + -- ideally we should divide by 5 because this is the sum of 5 channels + -- but in practice we divide by 4 and just clip sounds that are too loud. + O_SDAT <= SDAT(9 downto 2) when SDAT(10) = '0' else (others=>'1'); -- clip overrange sounds + + process(I_CLK1) + begin + if rising_edge(I_CLK1) then + SDAT <= ("000" & W_VCO3_OUT) + ( ( ("000" & W_VCO2_OUT) + ("000" & W_VCO1_OUT) ) + ( ("000" & WAV_D0) + ("000" & WAV_D1) ) ); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + sample <= (others => '0'); + sample_pls <= '0'; + elsif rising_edge(I_CLK1) then + if (sample = sample_time - 1) then + sample <= (others => '0'); + sample_pls <= '1'; + else + sample <= sample + 1; + sample_pls <= '0'; + end if; + end if; + end process; + +------------- FIRE SOUND ------------------------------------------ + mc_roms_fire : entity work.GAL_FIR + port map ( + CLK => I_CLK1, + ADDR => fire_addr(12 downto 0), + DATA => WAV_D0 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s0_trg_ff <= (others => '0'); + s0_trg <= '0'; + elsif rising_edge(I_CLK1) then + s0_trg_ff(0) <= I_SW(0); + s0_trg_ff(1) <= s0_trg_ff(0); + s0_trg <= not s0_trg_ff(1) and s0_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + fire_addr <= fire_cnt; + elsif rising_edge(I_CLK1) then + if (s0_trg = '1') then + fire_addr <= (others => '0'); + else + if(sample_pls = '1') then + if(fire_addr <= fire_cnt) then + fire_addr <= fire_addr + 1; + else + fire_addr <= fire_addr ; + end if; + end if; + end if; + end if; + end process; + +------------- HIT SOUND ------------------------------------------ + mc_roms_hit : entity work.GAL_HIT + port map ( + CLK => I_CLK1, + ADDR => hit_addr(12 downto 0), + DATA => WAV_D1 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s1_trg_ff <= (others => '0'); + s1_trg <= '0'; + elsif rising_edge(I_CLK1) then + s1_trg_ff(0) <= I_SW(1); + s1_trg_ff(1) <= s1_trg_ff(0); + s1_trg <= not s1_trg_ff(1) and s1_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + hit_addr <= hit_cnt; + elsif rising_edge(I_CLK1) then + if (s1_trg = '1') then + hit_addr <= (others => '0'); + else + if (sample_pls = '1') then + if (hit_addr <= hit_cnt) then + hit_addr <= hit_addr + 1 ; + else + hit_addr <= hit_addr ; + end if; + end if; + end if; + end if; + end process; + +--------------- EFFECT SOUND --------------------------------------- + +-- 9R modulator voltage generator based on DAC value + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + VCO_CTR <= (others=>'0'); + elsif rising_edge(I_CLK1) then + VCO_CTR <= VCO_CTR + (not I_DAC); + end if; + end process; + + -- modulator frequency lookup tables for the three VCOs + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + elsif rising_edge(I_CLK1) then + case VCO_CTR(23 downto 19) is + when "00000" => W_VCO1_STEP <= x"2A"; W_VCO2_STEP <= x"3A"; W_VCO3_STEP <= x"54"; + when "00001" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"39"; W_VCO3_STEP <= x"53"; + when "00010" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"38"; W_VCO3_STEP <= x"52"; + when "00011" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"50"; + when "00100" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"4F"; + when "00101" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"36"; W_VCO3_STEP <= x"4E"; + when "00110" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"35"; W_VCO3_STEP <= x"4D"; + when "00111" => W_VCO1_STEP <= x"26"; W_VCO2_STEP <= x"34"; W_VCO3_STEP <= x"4C"; + when "01000" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"4A"; + when "01001" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"49"; + when "01010" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"32"; W_VCO3_STEP <= x"48"; + when "01011" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"31"; W_VCO3_STEP <= x"47"; + when "01100" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"30"; W_VCO3_STEP <= x"46"; + when "01101" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"44"; + when "01110" => W_VCO1_STEP <= x"22"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"43"; + when "01111" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2E"; W_VCO3_STEP <= x"42"; + when "10000" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2D"; W_VCO3_STEP <= x"41"; + when "10001" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2C"; W_VCO3_STEP <= x"40"; + when "10010" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3F"; + when "10011" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3D"; + when "10100" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2A"; W_VCO3_STEP <= x"3C"; + when "10101" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"29"; W_VCO3_STEP <= x"3B"; + when "10110" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"3A"; + when "10111" => W_VCO1_STEP <= x"1D"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"39"; + when "11000" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"27"; W_VCO3_STEP <= x"37"; + when "11001" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"26"; W_VCO3_STEP <= x"36"; + when "11010" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"25"; W_VCO3_STEP <= x"35"; + when "11011" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"34"; + when "11100" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"33"; + when "11101" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"23"; W_VCO3_STEP <= x"32"; + when "11110" => W_VCO1_STEP <= x"19"; W_VCO2_STEP <= x"22"; W_VCO3_STEP <= x"30"; + when "11111" => W_VCO1_STEP <= x"18"; W_VCO2_STEP <= x"21"; W_VCO3_STEP <= x"2F"; + when others => null; + end case; + end if; + end process; + +-- 8R VCO 240Hz - 140Hz (8) + mc_vco1 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(0), + I_STEP => W_VCO1_STEP, + O_WAV => W_VCO1_OUT + ); + +-- 8S VCO 330Hz - 190Hz (11) + mc_vco2 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(1), + I_STEP => W_VCO2_STEP, + O_WAV => W_VCO2_OUT + ); + +-- 8T VCO 480Hz - 270Hz (16) + mc_vco3 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(2), + I_STEP => W_VCO3_STEP, + O_WAV => W_VCO3_OUT + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_sound_vco.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_sound_vco.vhd new file mode 100644 index 00000000..e2a63e85 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_sound_vco.vhd @@ -0,0 +1,49 @@ +-------------------------------------------------------------------------------- +---- FPGA VCO +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +use work.sine_package.all; + +-- O_CLK = (I_CLK / 2^20) * I_STEP +entity MC_SOUND_VCO is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + I_FS : in std_logic; + I_STEP : in std_logic_vector( 7 downto 0); + O_WAV : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_VCO is + signal VCO1_CTR : std_logic_vector(19 downto 0) := (others => '0'); + signal sine : std_logic_vector(14 downto 0) := (others => '0'); + +begin + O_WAV <= sine(14 downto 7); + process(I_CLK, I_RSTn) + begin + if (I_RSTn = '0') then + VCO1_CTR <= (others=>'0'); + elsif rising_edge(I_CLK) then + if I_FS = '1' then + VCO1_CTR <= VCO1_CTR + I_STEP; + case VCO1_CTR(19 downto 18) is + when "00" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "01" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when "10" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "11" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_stars.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_stars.vhd new file mode 100644 index 00000000..b91197b3 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_stars.vhd @@ -0,0 +1,90 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA STARS +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity MC_STARS is + port ( + I_CLK_18M : in std_logic; + I_CLK_6M : in std_logic; + I_H_FLIP : in std_logic; + I_V_SYNC : in std_logic; + I_8HF : in std_logic; + I_256HnX : in std_logic; + I_1VF : in std_logic; + I_2V : in std_logic; + I_STARS_ON : in std_logic; + I_STARS_OFFn : in std_logic; + + O_R : out std_logic_vector(1 downto 0); + O_G : out std_logic_vector(1 downto 0); + O_B : out std_logic_vector(1 downto 0); + O_NOISE : out std_logic + ); +end; + +architecture RTL of MC_STARS is + signal CLK_1C : std_logic := '0'; + signal W_2D_Qn : std_logic := '0'; + + signal W_3B : std_logic := '0'; + signal noise : std_logic := '0'; + signal W_2A : std_logic := '0'; + signal W_4P : std_logic := '0'; + signal CLK_1AB : std_logic := '0'; + signal W_1AB_Q : std_logic_vector(15 downto 0) := (others => '0'); + signal W_1C_Q : std_logic_vector( 1 downto 0) := (others => '0'); +begin + O_R <= (W_1AB_Q( 9) & W_1AB_Q (8) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_G <= (W_1AB_Q(11) & W_1AB_Q(10) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_B <= (W_1AB_Q(13) & W_1AB_Q(12) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + + CLK_1C <= not (I_CLK_18M and (not I_CLK_6M )and (not I_V_SYNC) and I_256HnX); + CLK_1AB <= not (CLK_1C or (not (I_H_FLIP or W_1C_Q(1)))); + W_3B <= W_2D_Qn xor W_1AB_Q(4); + + W_2A <= '0' when (W_1AB_Q(7 downto 0) = x"ff") else '1'; + W_4P <= not (( I_8HF xor I_1VF ) and W_2D_Qn and I_STARS_OFFn); + + O_NOISE <= noise ; + + process(I_2V) + begin + if rising_edge(I_2V) then + noise <= W_2D_Qn; + end if; + end process; + + process(CLK_1C, I_V_SYNC) + begin + if(I_V_SYNC = '1') then + W_1C_Q <= (others => '0'); + elsif rising_edge(CLK_1C) then + W_1C_Q <= W_1C_Q(0) & '1'; + end if; + end process; + + process(CLK_1AB, I_STARS_ON) + begin + if(I_STARS_ON = '0') then + W_1AB_Q <= (others => '0'); + W_2D_Qn <= '1'; + elsif rising_edge(CLK_1AB) then + W_1AB_Q <= W_1AB_Q(14 downto 0) & W_3B; + W_2D_Qn <= not W_1AB_Q(15); + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_video.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_video.vhd new file mode 100644 index 00000000..ec46308a --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mc_video.vhd @@ -0,0 +1,433 @@ +-------------------------------------------------------------------------------- +---- FPGA GALAXIAN VIDEO +---- +---- Version : 2.50 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 4-30 galaxian modify by K.DEGAWA +---- 2004- 5- 6 first release. +---- 2004- 8-23 Improvement with T80-IP. +---- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +-------------------------------------------------------------------------------- + +------------------------------------------------------------------------------------------- +-- H_CNT(0), H_CNT(1), H_CNT(2), H_CNT(3), H_CNT(4), H_CNT(5), H_CNT(6), H_CNT(7), H_CNT(8), +-- 1 H 2 H 4 H 8 H 16 H 32H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT(0), V_CNT(1), V_CNT(2), V_CNT(3), V_CNT(4), V_CNT(5), V_CNT(6), V_CNT(7) +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_VIDEO is + port( + I_CLK_18M : in std_logic; + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_V_CNT : in std_logic_vector(7 downto 0); + I_H_FLIP : in std_logic; + I_V_FLIP : in std_logic; + I_V_BLn : in std_logic; + I_C_BLn : in std_logic; + + I_A : in std_logic_vector(9 downto 0); + I_BD : in std_logic_vector(7 downto 0); + I_OBJ_SUB_A : in std_logic_vector(2 downto 0); + I_OBJ_RAM_RQ : in std_logic; + I_OBJ_RAM_RD : in std_logic; + I_OBJ_RAM_WR : in std_logic; + I_VID_RAM_RD : in std_logic; + I_VID_RAM_WR : in std_logic; + I_DRIVER_WR : in std_logic; + I_BANK : in std_logic; + + O_C_BLnX : out std_logic; + O_8HF : out std_logic; + O_256HnX : out std_logic; + O_1VF : out std_logic; + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic; + + O_BD : out std_logic_vector(7 downto 0); + O_VID : out std_logic_vector(1 downto 0); + O_COL : out std_logic_vector(2 downto 0) + ); +end; + +architecture RTL of MC_VIDEO is + + signal WB_LDn : std_logic := '0'; + signal WB_CNTRLDn : std_logic := '0'; + signal WB_CNTRCLRn : std_logic := '0'; + signal WB_COLLn : std_logic := '0'; + signal WB_VPLn : std_logic := '0'; + signal WB_OBJDATALn : std_logic := '0'; + signal WB_MLDn : std_logic := '0'; + signal WB_SLDn : std_logic := '0'; + signal W_3D : std_logic := '0'; + signal W_LDn : std_logic := '0'; + signal W_CNTRLDn : std_logic := '0'; + signal W_CNTRCLRn : std_logic := '0'; + signal W_COLLn : std_logic := '0'; + signal W_VPLn : std_logic := '0'; + signal W_OBJDATALn : std_logic := '0'; + signal W_MLDn : std_logic := '0'; + signal W_SLDn : std_logic := '0'; + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_H_POSI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_2M_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6K_Q : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_6P_Q : std_logic_vector( 6 downto 0) := (others => '0'); + signal W_45T_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2KL : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2HJ : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_RV : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_RC : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_O_OBJ_ROM_A : std_logic_vector(10 downto 0) := (others => '0'); + signal W_VID_RAM_A : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AA : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AB : std_logic_vector(11 downto 0) := (others => '0'); + signal C_2HJ : std_logic_vector( 1 downto 0) := (others => '0'); + signal C_2KL : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_CD : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_1M : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_A : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_B : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_Y : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_LRAM_DI : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_LRAM_DO : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_1H_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_1K_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_LRAM_A : std_logic_vector( 7 downto 0) := (others => '0'); +-- signal W_OBJ_RAM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_HF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_45N_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6J_Q : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DA : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DB : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_256HnX : std_logic := '0'; + signal W_2N : std_logic := '0'; + signal W_45T_CLR : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_H_FLIP1 : std_logic := '0'; + signal W_H_FLIP2 : std_logic := '0'; + signal W_H_FLIP1X : std_logic := '0'; + signal W_H_FLIP2X : std_logic := '0'; + signal W_LRAM_AND : std_logic := '0'; + signal W_RAW0 : std_logic := '0'; + signal W_RAW1 : std_logic := '0'; + signal W_RAW_OR : std_logic := '0'; + signal W_SRCLK : std_logic := '0'; + signal W_SRLD : std_logic := '0'; + signal W_VID_RAM_CS : std_logic := '0'; + signal W_CLK_6Mn : std_logic := '0'; + +begin + ld_pls : entity work.MC_LD_PLS + port map( + I_CLK_6M => I_CLK_6M, + I_H_CNT => I_H_CNT, + I_3D_DI => W_3D, + + O_LDn => WB_LDn, + O_CNTRLDn => WB_CNTRLDn, + O_CNTRCLRn => WB_CNTRCLRn, + O_COLLn => WB_COLLn, + O_VPLn => WB_VPLn, + O_OBJDATALn => WB_OBJDATALn, + O_MLDn => WB_MLDn, + O_SLDn => WB_SLDn + ); + + obj_ram : entity work.MC_OBJ_RAM + port map( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(7 downto 0), + I_WEA => I_OBJ_RAM_WR, + I_CEA => I_OBJ_RAM_RQ, + I_DA => I_BD, + O_DA => W_OBJ_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_OBJ_RAM_AB, + I_WEB => '0', + I_CEB => '1', + I_DB => x"00", + O_DB => W_OBJ_RAM_DOB + ); + + lram : entity work.MC_LRAM + port map( + I_CLK => I_CLK_18M, + I_ADDR => W_LRAM_A, + I_WE => W_CLK_6Mn, + I_D => W_LRAM_DI, + O_Dn => W_LRAM_DO + ); + + missile : entity work.MC_MISSILE + port map( + I_CLK_18M => I_CLK_18M, + I_CLK_6M => I_CLK_6M, + I_C_BLn_X => W_C_BLnX, + I_MLDn => W_MLDn, + I_SLDn => W_SLDn, + I_HPOS => W_H_POSI, + O_MISSILEn => O_MISSILEn, + O_SHELLn => O_SHELLn + ); + + vid_ram : entity work.MC_VID_RAM + port map ( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(9 downto 0), + I_DA => W_VID_RAM_DI, + I_WEA => I_VID_RAM_WR, + I_CEA => W_VID_RAM_CS, + O_DA => W_VID_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_VID_RAM_A(9 downto 0), + I_DB => x"00", + I_WEB => '0', + I_CEB => '1', + O_DB => W_VID_RAM_DOB + ); + + -- 1H VID-Rom + k_rom : entity work.GALAXIAN_1H + port map ( + CLK => I_CLK_12M, + ADDR => I_BANK & W_O_OBJ_ROM_A, + DATA => W_1H_D + ); + + -- 1K VID-Rom + h_rom : entity work.GALAXIAN_1K + port map( + CLK => I_CLK_12M, + ADDR => I_BANK & W_O_OBJ_ROM_A, + DATA => W_1K_D + ); + +----------------------------------------------------------------------------------- + + process(I_CLK_12M) + begin + if falling_edge(I_CLK_12M) then + W_LDn <= WB_LDn; + W_CNTRLDn <= WB_CNTRLDn; + W_CNTRCLRn <= WB_CNTRCLRn; + W_COLLn <= WB_COLLn; + W_VPLn <= WB_VPLn; + W_OBJDATALn <= WB_OBJDATALn; + W_MLDn <= WB_MLDn; + W_SLDn <= WB_SLDn; + end if; + end process; + + W_CLK_6Mn <= not I_CLK_6M; + + W_6J_DA <= I_H_FLIP & W_HF_CNT(7) & W_HF_CNT(3) & I_H_CNT(2); + W_6J_DB <= W_OBJ_D(6) & ( W_HF_CNT(3) and I_H_CNT(1) ) & I_H_CNT(2) & I_H_CNT(1); + W_6J_Q <= W_6J_DB when I_H_CNT(8) = '1' else W_6J_DA; + + W_H_FLIP1 <= (not I_H_CNT(8)) and I_H_FLIP; + + W_HF_CNT(7 downto 3) <= not I_H_CNT(7 downto 3) when W_H_FLIP1 = '1' else I_H_CNT(7 downto 3); + W_VF_CNT <= not I_V_CNT when I_V_FLIP = '1' else I_V_CNT; + + O_8HF <= W_HF_CNT(3); + O_1VF <= W_VF_CNT(0); + W_H_FLIP2 <= W_6J_Q(3); + +-- Parts 4F,5F + W_OBJ_RAM_AB <= "0" & I_H_CNT(8) & W_6J_Q(2) & W_HF_CNT(6 downto 4) & W_6J_Q(1 downto 0); +-- W_OBJ_RAM_A <= W_OBJ_RAM_AB when I_OBJ_RAM_RQ = '0' else I_A(7 downto 0) ; + + process(I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_H_POSI <= W_OBJ_RAM_DOB; + end if; + end process; + + W_OBJ_RAM_D <= W_OBJ_RAM_DOA when I_OBJ_RAM_RD = '1' else (others => '0'); + +-- Parts 4L + process(W_OBJDATALn) + begin + if rising_edge(W_OBJDATALn) then + W_OBJ_D <= W_H_POSI; + end if; + end process; + +-- Parts 4,5N + W_45N_Q <= W_VF_CNT + W_H_POSI; + W_3D <= '0' when W_45N_Q = x"FF" else '1'; + + process(W_VPLn, I_V_BLn) + begin + if (I_V_BLn = '0') then + W_2M_Q <= (others => '0'); + elsif rising_edge(W_VPLn) then + W_2M_Q <= W_45N_Q; + end if; + end process; + + W_2N <= I_H_CNT(8) and W_OBJ_D(7); + W_1M <= W_2M_Q(3 downto 0) xor (W_2N & W_2N & W_2N & W_2N); + W_VID_RAM_CS <= I_VID_RAM_RD or I_VID_RAM_WR; + W_VID_RAM_DI <= I_BD when I_VID_RAM_WR = '1' else (others => '0'); + W_VID_RAM_AA <= (not ( W_2M_Q(7) and W_2M_Q(6) and W_2M_Q(5) and W_2M_Q(4))) & (not W_VID_RAM_CS) & "0000000000"; -- I_A(9:0) + W_VID_RAM_AB <= "00" & W_2M_Q(7 downto 4) & W_1M(3) & W_HF_CNT(7 downto 3); + W_VID_RAM_A <= W_VID_RAM_AB when I_C_BLn = '1' else W_VID_RAM_AA; + W_VID_RAM_D <= W_VID_RAM_DOA when I_VID_RAM_RD = '1' else (others => '0'); + +---- VIDEO DATA OUTPUT -------------- + + O_BD <= W_OBJ_RAM_D or W_VID_RAM_D; + W_SRLD <= not (W_LDn or W_VID_RAM_A(11)); + W_OBJ_ROM_AB <= W_OBJ_D(5 downto 0) & W_1M(3) & (W_OBJ_D(6) xor I_H_CNT(3)); + W_OBJ_ROM_A <= W_OBJ_ROM_AB when I_H_CNT(8) = '1' else W_VID_RAM_DOB; + W_O_OBJ_ROM_A <= W_OBJ_ROM_A & W_1M(2 downto 0); + ----------------------------------------------------------------------------------- + + W_3L_A <= reg_2HJ(7) & reg_2KL(7) & "1" & W_SRLD; + W_3L_B <= reg_2HJ(0) & reg_2KL(0) & W_SRLD & "1"; + W_3L_Y <= W_3L_B when W_H_FLIP2X = '1' else W_3L_A; -- (3)=RAW1,(2)=RAW0 + C_2HJ <= W_3L_Y(1 downto 0); + C_2KL <= W_3L_Y(1 downto 0); + W_RAW0 <= W_3L_Y(2); + W_RAW1 <= W_3L_Y(3); + W_SRCLK <= I_CLK_6M; + +-------- PARTS 2KL ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2KL) is + when "00" => reg_2KL <= reg_2KL; + when "10" => reg_2KL <= reg_2KL(6 downto 0) & "0"; + when "01" => reg_2KL <= "0" & reg_2KL(7 downto 1); + when "11" => reg_2KL <= W_1K_D; + when others => null; + end case; + end if; + end process; + +-------- PARTS 2HJ ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2HJ) is + when "00" => reg_2HJ <= reg_2HJ; + when "10" => reg_2HJ <= reg_2HJ(6 downto 0) & "0"; + when "01" => reg_2HJ <= "0" & reg_2HJ(7 downto 1); + when "11" => reg_2HJ <= W_1H_D; + when others => null; + end case; + end if; + end process; + +------- SHT2 ----------------------------------------------------- + +-- Parts 6K + process(W_COLLn) + begin + if rising_edge(W_COLLn) then + W_6K_Q <= W_H_POSI(2 downto 0); + end if; + end process; + +-- Parts 6P + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + if (W_LDn = '0') then + W_6P_Q <= W_H_FLIP2 & W_H_FLIP1 & I_C_BLn & (not I_H_CNT(8)) & W_6K_Q(2 downto 0); + else + W_6P_Q <= W_6P_Q; + end if; + end if; + end process; + + W_H_FLIP2X <= W_6P_Q(6); + W_H_FLIP1X <= W_6P_Q(5); + W_C_BLnX <= W_6P_Q(4); + W_256HnX <= W_6P_Q(3); + W_CD <= W_6P_Q(2 downto 0); + O_256HnX <= W_256HnX; + O_C_BLnX <= W_C_BLnX; + W_45T_CLR <= W_CNTRCLRn or W_256HnX ; + + process(I_CLK_6M, W_45T_CLR) + begin + if (W_45T_CLR = '0') then + W_45T_Q <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + if (W_CNTRLDn = '0') then + W_45T_Q <= W_H_POSI; + else + W_45T_Q <= W_45T_Q + 1; + end if; + end if; + end process; + + W_LRAM_A <= (not W_45T_Q) when W_H_FLIP1X = '1' else W_45T_Q; + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_RV <= W_LRAM_DO(1 downto 0); + W_RC <= W_LRAM_DO(4 downto 2); + end if; + end process; + + W_LRAM_AND <= not (not ((W_LRAM_A(4) or W_LRAM_A(5)) or (W_LRAM_A(6) or W_LRAM_A(7))) or W_256HnX ); + W_RAW_OR <= W_RAW0 or W_RAW1 ; + + W_VID(0) <= not (not (W_RAW0 and W_RV(1)) and W_RV(0)); + W_VID(1) <= not (not (W_RAW1 and W_RV(0)) and W_RV(1)); + W_COL(0) <= not (not (W_RAW_OR and W_CD(0) and W_RC(1) and W_RC(2)) and W_RC(0)); + W_COL(1) <= not (not (W_RAW_OR and W_CD(1) and W_RC(2) and W_RC(0)) and W_RC(1)); + W_COL(2) <= not (not (W_RAW_OR and W_CD(2) and W_RC(0) and W_RC(1)) and W_RC(2)); + + O_VID <= W_VID; + O_COL <= W_COL; + + W_LRAM_DI(0) <= W_LRAM_AND and W_VID(0); + W_LRAM_DI(1) <= W_LRAM_AND and W_VID(1); + W_LRAM_DI(2) <= W_LRAM_AND and W_COL(0); + W_LRAM_DI(3) <= W_LRAM_AND and W_COL(1); + W_LRAM_DI(4) <= W_LRAM_AND and W_COL(2); + +end RTL; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mist_io.v b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_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/Arcade/Galaxian Hardware/Pisces_MiST/rtl/osd.v b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_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/Arcade/Galaxian Hardware/Pisces_MiST/rtl/pll.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d76a5e1d --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/pll.vhd @@ -0,0 +1,451 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + c3 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + clk3_divide_by : NATURAL; + clk3_duty_cycle : NATURAL; + clk3_multiply_by : NATURAL; + clk3_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire2 <= sub_wire0(3); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c3 <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 3, + clk0_duty_cycle => 50, + clk0_multiply_by => 2, + clk0_phase_shift => "0", + clk1_divide_by => 9, + clk1_duty_cycle => 50, + clk1_multiply_by => 4, + clk1_phase_shift => "0", + clk2_divide_by => 9, + clk2_duty_cycle => 50, + clk2_multiply_by => 2, + clk2_phase_shift => "0", + clk3_divide_by => 6, + clk3_duty_cycle => 50, + clk3_multiply_by => 1, + clk3_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_USED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire6, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "3" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "6" +-- 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: DUTY_CYCLE3 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "18.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "12.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "6.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "4.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 "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "4" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "18.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "12.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "6.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "4.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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 "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "3" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "4" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "6" +-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK3_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_USED" +-- 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_USED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/scandoubler.v b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..36e71ed2 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_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/Arcade/Galaxian Hardware/Pisces_MiST/rtl/sine_package.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/sine_package.vhd new file mode 100644 index 00000000..473caa04 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/sine_package.vhd @@ -0,0 +1,152 @@ +library ieee; +use ieee.std_logic_1164.all; + +package sine_package is + + subtype table_value_type is integer range 0 to 16383; + subtype table_index_type is std_logic_vector( 6 downto 0 ); + + function get_table_value (table_index: table_index_type) return table_value_type; + +end; + +package body sine_package is + + function get_table_value (table_index: table_index_type) return table_value_type is + variable table_value: table_value_type; + begin + case table_index is + when "0000000" => table_value := 101; + when "0000001" => table_value := 302; + when "0000010" => table_value := 503; + when "0000011" => table_value := 703; + when "0000100" => table_value := 904; + when "0000101" => table_value := 1105; + when "0000110" => table_value := 1305; + when "0000111" => table_value := 1506; + when "0001000" => table_value := 1706; + when "0001001" => table_value := 1906; + when "0001010" => table_value := 2105; + when "0001011" => table_value := 2304; + when "0001100" => table_value := 2503; + when "0001101" => table_value := 2702; + when "0001110" => table_value := 2900; + when "0001111" => table_value := 3098; + when "0010000" => table_value := 3295; + when "0010001" => table_value := 3491; + when "0010010" => table_value := 3688; + when "0010011" => table_value := 3883; + when "0010100" => table_value := 4078; + when "0010101" => table_value := 4273; + when "0010110" => table_value := 4466; + when "0010111" => table_value := 4659; + when "0011000" => table_value := 4852; + when "0011001" => table_value := 5044; + when "0011010" => table_value := 5234; + when "0011011" => table_value := 5425; + when "0011100" => table_value := 5614; + when "0011101" => table_value := 5802; + when "0011110" => table_value := 5990; + when "0011111" => table_value := 6177; + when "0100000" => table_value := 6362; + when "0100001" => table_value := 6547; + when "0100010" => table_value := 6731; + when "0100011" => table_value := 6914; + when "0100100" => table_value := 7095; + when "0100101" => table_value := 7276; + when "0100110" => table_value := 7456; + when "0100111" => table_value := 7634; + when "0101000" => table_value := 7811; + when "0101001" => table_value := 7988; + when "0101010" => table_value := 8162; + when "0101011" => table_value := 8336; + when "0101100" => table_value := 8509; + when "0101101" => table_value := 8680; + when "0101110" => table_value := 8850; + when "0101111" => table_value := 9018; + when "0110000" => table_value := 9185; + when "0110001" => table_value := 9351; + when "0110010" => table_value := 9515; + when "0110011" => table_value := 9678; + when "0110100" => table_value := 9840; + when "0110101" => table_value := 10000; + when "0110110" => table_value := 10158; + when "0110111" => table_value := 10315; + when "0111000" => table_value := 10471; + when "0111001" => table_value := 10625; + when "0111010" => table_value := 10777; + when "0111011" => table_value := 10927; + when "0111100" => table_value := 11076; + when "0111101" => table_value := 11224; + when "0111110" => table_value := 11369; + when "0111111" => table_value := 11513; + when "1000000" => table_value := 11655; + when "1000001" => table_value := 11796; + when "1000010" => table_value := 11934; + when "1000011" => table_value := 12071; + when "1000100" => table_value := 12206; + when "1000101" => table_value := 12339; + when "1000110" => table_value := 12471; + when "1000111" => table_value := 12600; + when "1001000" => table_value := 12728; + when "1001001" => table_value := 12853; + when "1001010" => table_value := 12977; + when "1001011" => table_value := 13099; + when "1001100" => table_value := 13219; + when "1001101" => table_value := 13336; + when "1001110" => table_value := 13452; + when "1001111" => table_value := 13566; + when "1010000" => table_value := 13678; + when "1010001" => table_value := 13787; + when "1010010" => table_value := 13895; + when "1010011" => table_value := 14000; + when "1010100" => table_value := 14104; + when "1010101" => table_value := 14205; + when "1010110" => table_value := 14304; + when "1010111" => table_value := 14401; + when "1011000" => table_value := 14496; + when "1011001" => table_value := 14588; + when "1011010" => table_value := 14679; + when "1011011" => table_value := 14767; + when "1011100" => table_value := 14853; + when "1011101" => table_value := 14936; + when "1011110" => table_value := 15018; + when "1011111" => table_value := 15097; + when "1100000" => table_value := 15174; + when "1100001" => table_value := 15249; + when "1100010" => table_value := 15321; + when "1100011" => table_value := 15391; + when "1100100" => table_value := 15459; + when "1100101" => table_value := 15524; + when "1100110" => table_value := 15587; + when "1100111" => table_value := 15648; + when "1101000" => table_value := 15706; + when "1101001" => table_value := 15762; + when "1101010" => table_value := 15816; + when "1101011" => table_value := 15867; + when "1101100" => table_value := 15916; + when "1101101" => table_value := 15963; + when "1101110" => table_value := 16007; + when "1101111" => table_value := 16048; + when "1110000" => table_value := 16088; + when "1110001" => table_value := 16124; + when "1110010" => table_value := 16159; + when "1110011" => table_value := 16191; + when "1110100" => table_value := 16220; + when "1110101" => table_value := 16247; + when "1110110" => table_value := 16272; + when "1110111" => table_value := 16294; + when "1111000" => table_value := 16314; + when "1111001" => table_value := 16331; + when "1111010" => table_value := 16346; + when "1111011" => table_value := 16358; + when "1111100" => table_value := 16368; + when "1111101" => table_value := 16375; + when "1111110" => table_value := 16380; + when "1111111" => table_value := 16383; + when others => null; + end case; + return table_value; + end; + +end; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/spram.vhd b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/spram.vhd new file mode 100644 index 00000000..ad6b58b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone V", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade/Galaxian Hardware/Pisces_MiST/rtl/video_mixer.sv b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..b9f7e424 --- /dev/null +++ b/Arcade/Galaxian Hardware/Pisces_MiST/rtl/video_mixer.sv @@ -0,0 +1,243 @@ +// +// +// 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; +reg [DWIDTH:0] Rd,Gd,Bd; +always @(posedge clk_sys) {Rd,Gd,Bd} <= {R,G,B}; +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(Rd), + .g_in(Gd), + .b_in(Bd), + + .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/Arcade/Galaxian Hardware/WarOfBugs_MiST/README.txt b/Arcade/Galaxian Hardware/WarOfBugs_MiST/README.txt new file mode 100644 index 00000000..870c99c7 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: War of the Bugs port to MiST by Gehstock +-- 3 Januar 2018 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Galaxian hardware +-- Copyright(c) 2004 Katsumi Degawa +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- F2 : Coin + Start 2 players +-- F1 : Coin + Start 1 player +-- SPACE : Fire +-- ARROW KEYS : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/Release/WarOfTheBugs.rbf b/Arcade/Galaxian Hardware/WarOfBugs_MiST/Release/WarOfTheBugs.rbf new file mode 100644 index 00000000..e38389f4 Binary files /dev/null and b/Arcade/Galaxian Hardware/WarOfBugs_MiST/Release/WarOfTheBugs.rbf differ diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/WarOfTheBugs.qpf b/Arcade/Galaxian Hardware/WarOfBugs_MiST/WarOfTheBugs.qpf new file mode 100644 index 00000000..323e0052 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/WarOfTheBugs.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:59:16 November 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "14:59:16 November 16, 2017" + +# Revisions + +PROJECT_REVISION = "WarOfTheBugs" \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/WarOfTheBugs.qsf b/Arcade/Galaxian Hardware/WarOfBugs_MiST/WarOfTheBugs.qsf new file mode 100644 index 00000000..9213f729 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/WarOfTheBugs.qsf @@ -0,0 +1,190 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 18:12:35 November 17, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Galaxian_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80as.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_6L.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1K.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GALAXIAN_1H.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_HIT.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GAL_FIR.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/sine_package.vhd +set_global_assignment -name VHDL_FILE rtl/mc_stars.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_vco.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_b.vhd +set_global_assignment -name VHDL_FILE rtl/mc_sound_a.vhd +set_global_assignment -name VHDL_FILE rtl/mc_missile.vhd +set_global_assignment -name VHDL_FILE rtl/mc_logic.vhd +set_global_assignment -name VHDL_FILE rtl/mc_ld_pls.vhd +set_global_assignment -name VHDL_FILE rtl/mc_inport.vhd +set_global_assignment -name VHDL_FILE rtl/mc_hv_count.vhd +set_global_assignment -name VHDL_FILE rtl/mc_col_pal.vhd +set_global_assignment -name VHDL_FILE rtl/mc_bram.vhd +set_global_assignment -name VHDL_FILE rtl/mc_adec.vhd +set_global_assignment -name VHDL_FILE rtl/galaxian.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY WarOfTheBugs +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Galaxian) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Galaxian) +# -------------------- +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name VHDL_FILE rtl/mc_video.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/WarOfTheBugs.sv +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_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/WarOfTheBugs.srf b/Arcade/Galaxian Hardware/WarOfBugs_MiST/WarOfTheBugs.srf new file mode 100644 index 00000000..14cddd5e --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/WarOfTheBugs.srf @@ -0,0 +1,54 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "Clock multiplexers are found and protected" { } { } 0 19016 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169177 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169203 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Quartus II" 0 -1 0 ""} diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/clean.bat b/Arcade/Galaxian Hardware/WarOfBugs_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_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/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/GALAXIAN_1H.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/GALAXIAN_1H.vhd new file mode 100644 index 00000000..a6558456 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/GALAXIAN_1H.vhd @@ -0,0 +1,285 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GALAXIAN_1H is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GALAXIAN_1H is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0050 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0058 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0060 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x0068 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x0070 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"3C",x"42",x"81",x"A5",x"A5",x"99",x"42",x"3C", -- 0x0158 + x"38",x"78",x"F8",x"F8",x"F8",x"F8",x"78",x"38", -- 0x0160 + x"00",x"10",x"00",x"2F",x"87",x"20",x"00",x"10", -- 0x0168 + x"38",x"68",x"F8",x"D7",x"7F",x"D8",x"78",x"28", -- 0x0170 + x"38",x"78",x"F8",x"F8",x"F8",x"F8",x"78",x"38", -- 0x0178 + x"38",x"78",x"F8",x"F8",x"F8",x"F8",x"78",x"38", -- 0x0180 + x"00",x"10",x"00",x"2F",x"87",x"20",x"00",x"10", -- 0x0188 + x"38",x"68",x"F8",x"D7",x"7F",x"D8",x"78",x"28", -- 0x0190 + x"38",x"78",x"F8",x"F8",x"F8",x"F8",x"78",x"38", -- 0x0198 + x"00",x"00",x"00",x"03",x"0F",x"1F",x"41",x"00", -- 0x01A0 + x"08",x"3C",x"FE",x"E7",x"8F",x"FE",x"FC",x"00", -- 0x01A8 + x"00",x"41",x"1F",x"0F",x"03",x"00",x"00",x"00", -- 0x01B0 + x"00",x"FC",x"FE",x"8F",x"E7",x"FE",x"3C",x"08", -- 0x01B8 + x"06",x"08",x"03",x"24",x"40",x"10",x"20",x"40", -- 0x01C0 + x"60",x"10",x"00",x"30",x"0A",x"21",x"10",x"00", -- 0x01C8 + x"88",x"A8",x"24",x"08",x"40",x"26",x"10",x"03", -- 0x01D0 + x"15",x"15",x"24",x"80",x"12",x"60",x"04",x"90", -- 0x01D8 + x"00",x"00",x"00",x"00",x"04",x"00",x"08",x"09", -- 0x01E0 + x"00",x"00",x"00",x"00",x"80",x"20",x"80",x"50", -- 0x01E8 + x"00",x"02",x"08",x"04",x"00",x"00",x"00",x"00", -- 0x01F0 + x"90",x"00",x"20",x"40",x"00",x"00",x"00",x"00", -- 0x01F8 + x"00",x"00",x"08",x"08",x"E5",x"15",x"15",x"3A", -- 0x0200 + x"00",x"00",x"80",x"90",x"20",x"4E",x"5F",x"BB", -- 0x0208 + x"3A",x"15",x"15",x"E5",x"08",x"08",x"00",x"00", -- 0x0210 + x"A3",x"5B",x"4E",x"20",x"90",x"80",x"00",x"00", -- 0x0218 + x"00",x"00",x"01",x"22",x"14",x"15",x"15",x"3A", -- 0x0220 + x"00",x"00",x"20",x"48",x"90",x"2E",x"5F",x"BB", -- 0x0228 + x"3A",x"15",x"15",x"14",x"22",x"01",x"00",x"00", -- 0x0230 + x"A3",x"5B",x"2E",x"90",x"48",x"20",x"00",x"00", -- 0x0238 + x"10",x"48",x"2C",x"1C",x"06",x"02",x"00",x"00", -- 0x0240 + x"00",x"02",x"04",x"05",x"8E",x"2C",x"98",x"20", -- 0x0248 + x"00",x"40",x"00",x"00",x"00",x"01",x"00",x"00", -- 0x0250 + x"00",x"40",x"33",x"8C",x"60",x"1E",x"C0",x"38", -- 0x0258 + x"11",x"0A",x"0E",x"04",x"06",x"02",x"00",x"00", -- 0x0260 + x"10",x"14",x"14",x"1C",x"8C",x"28",x"98",x"20", -- 0x0268 + x"00",x"40",x"00",x"00",x"00",x"01",x"00",x"00", -- 0x0270 + x"01",x"42",x"3C",x"81",x"7E",x"00",x"84",x"78", -- 0x0278 + x"00",x"00",x"01",x"01",x"00",x"06",x"06",x"00", -- 0x0280 + x"50",x"90",x"24",x"44",x"18",x"00",x"80",x"40", -- 0x0288 + x"00",x"06",x"06",x"00",x"01",x"01",x"00",x"00", -- 0x0290 + x"40",x"80",x"00",x"18",x"44",x"24",x"90",x"50", -- 0x0298 + x"00",x"06",x"01",x"01",x"00",x"06",x"06",x"00", -- 0x02A0 + x"00",x"00",x"3C",x"40",x"1F",x"00",x"80",x"C0", -- 0x02A8 + x"00",x"06",x"06",x"00",x"01",x"01",x"06",x"00", -- 0x02B0 + x"C0",x"80",x"00",x"1F",x"40",x"38",x"00",x"00", -- 0x02B8 + x"00",x"FF",x"00",x"9F",x"CF",x"9F",x"00",x"FF", -- 0x02C0 + x"FF",x"FF",x"FF",x"C1",x"BE",x"BE",x"80",x"FF", -- 0x02C8 + x"88",x"77",x"00",x"FF",x"80",x"77",x"80",x"FF", -- 0x02D0 + x"BF",x"80",x"BF",x"FF",x"FE",x"FE",x"80",x"FF", -- 0x02D8 + x"FF",x"80",x"77",x"80",x"FF",x"7E",x"00",x"7E", -- 0x02E0 + x"FE",x"80",x"DE",x"FF",x"C9",x"B6",x"B6",x"C9", -- 0x02E8 + x"FF",x"00",x"CF",x"9F",x"00",x"FF",x"7E",x"76", -- 0x02F0 + x"FF",x"C1",x"B6",x"B6",x"CF",x"FE",x"80",x"DE", -- 0x02F8 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"3C", -- 0x0300 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0308 + x"7E",x"FF",x"EF",x"E7",x"7D",x"3C",x"1C",x"08", -- 0x0310 + x"00",x"00",x"00",x"00",x"00",x"80",x"80",x"80", -- 0x0318 + x"7C",x"FE",x"FE",x"C8",x"C0",x"FE",x"7E",x"3C", -- 0x0320 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0328 + x"7E",x"FF",x"9F",x"DD",x"65",x"35",x"1C",x"08", -- 0x0330 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0338 + x"7C",x"FE",x"FE",x"E2",x"C0",x"EE",x"7E",x"3C", -- 0x0340 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0348 + x"7E",x"FF",x"EF",x"ED",x"79",x"38",x"38",x"10", -- 0x0350 + x"00",x"00",x"00",x"00",x"00",x"80",x"40",x"00", -- 0x0358 + x"7C",x"FE",x"FC",x"F0",x"E6",x"CE",x"7E",x"3C", -- 0x0360 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0368 + x"7E",x"FF",x"9F",x"DF",x"65",x"35",x"1C",x"08", -- 0x0370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0378 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"3C", -- 0x0380 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0388 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"3C", -- 0x0390 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0398 + x"7C",x"FE",x"FE",x"C8",x"C2",x"FE",x"7E",x"3C", -- 0x03A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A8 + x"7C",x"FE",x"FE",x"C8",x"C2",x"FE",x"7E",x"3C", -- 0x03B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B8 + x"7C",x"FE",x"FE",x"E0",x"C2",x"EE",x"7E",x"3C", -- 0x03C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C8 + x"7C",x"FE",x"FE",x"E0",x"C2",x"EE",x"7E",x"3C", -- 0x03D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D8 + x"7C",x"FE",x"FE",x"F0",x"E6",x"CE",x"7E",x"3C", -- 0x03E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E8 + x"7C",x"FE",x"FE",x"F0",x"E6",x"CE",x"7E",x"3C", -- 0x03F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F8 + x"00",x"80",x"40",x"60",x"30",x"38",x"3C",x"3C", -- 0x0400 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0408 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"3C", -- 0x0410 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0418 + x"20",x"30",x"18",x"1C",x"3C",x"3C",x"7C",x"7C", -- 0x0420 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0428 + x"7C",x"FE",x"FE",x"C8",x"C2",x"FE",x"7E",x"3C", -- 0x0430 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0438 + x"00",x"0C",x"1C",x"3C",x"38",x"38",x"78",x"7C", -- 0x0440 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0448 + x"7C",x"FE",x"FE",x"E0",x"C2",x"EE",x"7E",x"3C", -- 0x0450 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0458 + x"00",x"03",x"07",x"0E",x"1E",x"3C",x"3C",x"78", -- 0x0460 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0468 + x"7C",x"FE",x"FE",x"F0",x"E6",x"CE",x"7E",x"3C", -- 0x0470 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0478 + x"00",x"80",x"40",x"60",x"30",x"38",x"3C",x"3C", -- 0x0480 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0488 + x"7E",x"FF",x"EF",x"E5",x"7D",x"3D",x"1C",x"08", -- 0x0490 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0498 + x"20",x"30",x"18",x"1C",x"3C",x"3C",x"7C",x"7C", -- 0x04A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04A8 + x"7E",x"FF",x"9F",x"DD",x"65",x"34",x"1C",x"08", -- 0x04B0 + x"00",x"00",x"00",x"00",x"00",x"80",x"40",x"00", -- 0x04B8 + x"00",x"0C",x"1C",x"3C",x"38",x"38",x"78",x"7C", -- 0x04C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04C8 + x"7E",x"FF",x"EF",x"E5",x"7C",x"3C",x"1C",x"08", -- 0x04D0 + x"00",x"00",x"00",x"00",x"80",x"40",x"40",x"00", -- 0x04D8 + x"00",x"03",x"07",x"0E",x"1E",x"3C",x"3C",x"78", -- 0x04E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E8 + x"7E",x"FF",x"9F",x"DF",x"65",x"35",x"1D",x"08", -- 0x04F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F8 + x"7E",x"FF",x"EF",x"E7",x"7D",x"3D",x"1C",x"08", -- 0x0500 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0510 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0518 + x"7E",x"FF",x"EF",x"E7",x"7D",x"3D",x"1C",x"08", -- 0x0520 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0530 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0538 + x"7E",x"FF",x"EF",x"E7",x"7D",x"3D",x"1C",x"08", -- 0x0540 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0550 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0558 + x"7E",x"FF",x"EF",x"E7",x"7D",x"3D",x"1C",x"08", -- 0x0560 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0570 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0580 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0588 + x"00",x"80",x"40",x"60",x"30",x"38",x"3C",x"3C", -- 0x0590 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A8 + x"20",x"30",x"18",x"1C",x"3C",x"3C",x"7C",x"7C", -- 0x05B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C8 + x"00",x"0C",x"1C",x"3C",x"38",x"38",x"78",x"7C", -- 0x05D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E8 + x"00",x"03",x"07",x"0E",x"1E",x"3C",x"3C",x"78", -- 0x05F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05F8 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"7C", -- 0x0600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0608 + x"7F",x"3F",x"3F",x"1E",x"1C",x"0F",x"0F",x"07", -- 0x0610 + x"C0",x"00",x"E0",x"F0",x"E0",x"C0",x"80",x"00", -- 0x0618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0620 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0628 + x"3C",x"78",x"71",x"73",x"3F",x"1F",x"0E",x"00", -- 0x0630 + x"7C",x"F0",x"FE",x"EF",x"CE",x"FC",x"F8",x"70", -- 0x0638 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0640 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0648 + x"1C",x"18",x"18",x"1B",x"1F",x"0F",x"03",x"00", -- 0x0650 + x"18",x"7D",x"FD",x"CD",x"DE",x"DC",x"F8",x"70", -- 0x0658 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0660 + x"08",x"1C",x"3D",x"7D",x"E7",x"EF",x"FF",x"7E", -- 0x0668 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0670 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"7C", -- 0x0678 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"3C", -- 0x0680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0688 + x"3C",x"3E",x"1E",x"1F",x"0F",x"0F",x"07",x"01", -- 0x0690 + x"E0",x"70",x"78",x"F8",x"F8",x"F0",x"E0",x"C0", -- 0x0698 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A8 + x"3C",x"78",x"71",x"73",x"3F",x"1F",x"0E",x"00", -- 0x06B0 + x"18",x"CC",x"CE",x"DE",x"FE",x"FC",x"F8",x"70", -- 0x06B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"1C",x"3E", -- 0x06C8 + x"00",x"00",x"03",x"07",x"07",x"07",x"07",x"03", -- 0x06D0 + x"7F",x"FF",x"FF",x"FF",x"FE",x"FC",x"38",x"80", -- 0x06D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06E0 + x"00",x"1C",x"3F",x"7F",x"EF",x"E7",x"F3",x"78", -- 0x06E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F0 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"7C", -- 0x06F8 + x"40",x"26",x"19",x"C6",x"39",x"06",x"39",x"C6", -- 0x0700 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0708 + x"00",x"09",x"19",x"00",x"00",x"00",x"00",x"00", -- 0x0710 + x"00",x"00",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0718 + x"40",x"26",x"19",x"C6",x"39",x"06",x"39",x"C6", -- 0x0720 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0728 + x"00",x"09",x"19",x"00",x"00",x"00",x"00",x"00", -- 0x0730 + x"00",x"00",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0738 + x"46",x"2F",x"1F",x"CF",x"3F",x"0F",x"3F",x"C6", -- 0x0740 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0748 + x"00",x"09",x"19",x"00",x"00",x"00",x"00",x"00", -- 0x0750 + x"00",x"00",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0758 + x"40",x"26",x"19",x"C6",x"39",x"06",x"39",x"C6", -- 0x0760 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0768 + x"00",x"09",x"19",x"00",x"00",x"00",x"00",x"00", -- 0x0770 + x"00",x"00",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0778 + x"09",x"17",x"3C",x"1B",x"3F",x"EF",x"DF",x"BF", -- 0x0780 + x"80",x"E0",x"F8",x"CC",x"F4",x"DE",x"EF",x"FF", -- 0x0788 + x"77",x"57",x"DB",x"77",x"3F",x"19",x"0F",x"04", -- 0x0790 + x"EA",x"EA",x"DB",x"7E",x"EC",x"9C",x"F8",x"40", -- 0x0798 + x"03",x"07",x"1F",x"1F",x"3B",x"3F",x"37",x"36", -- 0x07A0 + x"C0",x"E0",x"F0",x"F8",x"7C",x"DC",x"7C",x"AC", -- 0x07A8 + x"3F",x"3D",x"37",x"1B",x"1F",x"1F",x"0F",x"07", -- 0x07B0 + x"6C",x"FC",x"DC",x"BC",x"F8",x"F8",x"F0",x"E0", -- 0x07B8 + x"24",x"94",x"4C",x"FF",x"FF",x"4C",x"94",x"24", -- 0x07C0 + x"24",x"94",x"4C",x"FF",x"FF",x"4C",x"94",x"24", -- 0x07C8 + x"24",x"94",x"4C",x"FF",x"FF",x"4C",x"94",x"24", -- 0x07D0 + x"24",x"94",x"4C",x"FF",x"FF",x"4C",x"94",x"24", -- 0x07D8 + x"1E",x"3F",x"7E",x"00",x"00",x"7E",x"3F",x"1E", -- 0x07E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/GALAXIAN_1K.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/GALAXIAN_1K.vhd new file mode 100644 index 00000000..25f4acf1 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/GALAXIAN_1K.vhd @@ -0,0 +1,285 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GALAXIAN_1K is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GALAXIAN_1K is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0050 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0058 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0060 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x0068 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x0070 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"3C",x"42",x"81",x"A5",x"A5",x"99",x"42",x"3C", -- 0x0158 + x"38",x"68",x"F8",x"D7",x"7F",x"D8",x"78",x"28", -- 0x0160 + x"38",x"68",x"F8",x"D7",x"7F",x"D8",x"78",x"28", -- 0x0168 + x"38",x"78",x"F8",x"F8",x"F8",x"F8",x"78",x"38", -- 0x0170 + x"00",x"10",x"00",x"2F",x"87",x"20",x"00",x"10", -- 0x0178 + x"38",x"68",x"F8",x"D7",x"7F",x"D8",x"78",x"28", -- 0x0180 + x"38",x"68",x"F8",x"D7",x"7F",x"D8",x"78",x"28", -- 0x0188 + x"38",x"78",x"F8",x"F8",x"F8",x"F8",x"78",x"38", -- 0x0190 + x"00",x"10",x"00",x"2F",x"87",x"20",x"00",x"10", -- 0x0198 + x"00",x"00",x"00",x"00",x"01",x"00",x"5E",x"FF", -- 0x01A0 + x"00",x"00",x"18",x"7C",x"F4",x"78",x"00",x"F8", -- 0x01A8 + x"FF",x"5E",x"00",x"01",x"00",x"00",x"00",x"00", -- 0x01B0 + x"F8",x"00",x"78",x"F4",x"7C",x"18",x"00",x"00", -- 0x01B8 + x"00",x"00",x"03",x"04",x"01",x"12",x"22",x"00", -- 0x01C0 + x"00",x"00",x"00",x"30",x"08",x"00",x"00",x"C0", -- 0x01C8 + x"02",x"21",x"20",x"10",x"00",x"06",x"00",x"00", -- 0x01D0 + x"44",x"04",x"04",x"00",x"10",x"60",x"00",x"00", -- 0x01D8 + x"02",x"00",x"00",x"10",x"10",x"20",x"00",x"01", -- 0x01E0 + x"C0",x"00",x"10",x"08",x"00",x"00",x"84",x"40", -- 0x01E8 + x"20",x"22",x"00",x"00",x"10",x"00",x"00",x"06", -- 0x01F0 + x"80",x"04",x"04",x"00",x"00",x"10",x"00",x"40", -- 0x01F8 + x"00",x"00",x"08",x"08",x"E5",x"15",x"42",x"2F", -- 0x0200 + x"00",x"00",x"80",x"90",x"20",x"40",x"84",x"DE", -- 0x0208 + x"05",x"42",x"15",x"E5",x"08",x"08",x"00",x"00", -- 0x0210 + x"5E",x"84",x"40",x"20",x"90",x"80",x"00",x"00", -- 0x0218 + x"00",x"00",x"01",x"22",x"14",x"15",x"42",x"2F", -- 0x0220 + x"00",x"00",x"20",x"48",x"90",x"20",x"84",x"DE", -- 0x0228 + x"05",x"42",x"15",x"14",x"22",x"01",x"00",x"00", -- 0x0230 + x"5E",x"84",x"20",x"90",x"48",x"20",x"00",x"00", -- 0x0238 + x"10",x"48",x"2C",x"1C",x"06",x"03",x"01",x"03", -- 0x0240 + x"00",x"02",x"04",x"05",x"4E",x"CC",x"78",x"E0", -- 0x0248 + x"03",x"03",x"83",x"C7",x"7F",x"3F",x"1E",x"00", -- 0x0250 + x"E0",x"E0",x"F3",x"CC",x"E0",x"9E",x"C0",x"38", -- 0x0258 + x"11",x"0A",x"0E",x"04",x"06",x"03",x"01",x"03", -- 0x0260 + x"10",x"14",x"14",x"1C",x"4C",x"C8",x"78",x"E0", -- 0x0268 + x"03",x"03",x"83",x"C7",x"7F",x"3F",x"1E",x"00", -- 0x0270 + x"E1",x"E2",x"FC",x"C1",x"FE",x"80",x"84",x"78", -- 0x0278 + x"00",x"00",x"01",x"01",x"03",x"01",x"0B",x"0F", -- 0x0280 + x"50",x"90",x"24",x"C4",x"D8",x"E0",x"60",x"B0", -- 0x0288 + x"0F",x"0B",x"01",x"03",x"01",x"01",x"00",x"00", -- 0x0290 + x"B0",x"60",x"E0",x"D8",x"C4",x"24",x"90",x"50", -- 0x0298 + x"00",x"06",x"01",x"01",x"03",x"07",x"0D",x"0F", -- 0x02A0 + x"00",x"00",x"3C",x"C0",x"DF",x"E0",x"60",x"30", -- 0x02A8 + x"0F",x"0D",x"07",x"03",x"01",x"01",x"06",x"00", -- 0x02B0 + x"30",x"60",x"E0",x"DF",x"C0",x"38",x"00",x"00", -- 0x02B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x02C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x02C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x02D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x02D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x02E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x02E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x02F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x02F8 + x"70",x"F8",x"FC",x"BE",x"9F",x"CC",x"78",x"30", -- 0x0300 + x"00",x"00",x"00",x"00",x"00",x"80",x"40",x"00", -- 0x0308 + x"78",x"FC",x"9E",x"DE",x"66",x"35",x"1D",x"09", -- 0x0310 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0318 + x"70",x"F8",x"FC",x"BF",x"BF",x"CC",x"78",x"30", -- 0x0320 + x"00",x"00",x"00",x"00",x"C0",x"00",x"00",x"00", -- 0x0328 + x"78",x"FC",x"EE",x"E6",x"7E",x"3E",x"1D",x"08", -- 0x0330 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"80", -- 0x0338 + x"70",x"F8",x"CC",x"9C",x"BF",x"DC",x"78",x"30", -- 0x0340 + x"00",x"00",x"40",x"80",x"00",x"00",x"00",x"00", -- 0x0348 + x"78",x"FC",x"9E",x"DE",x"6A",x"39",x"39",x"12", -- 0x0350 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0358 + x"70",x"F9",x"CE",x"8E",x"9C",x"FC",x"78",x"30", -- 0x0360 + x"C0",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0368 + x"78",x"FC",x"EE",x"E6",x"7E",x"3E",x"1D",x"09", -- 0x0370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0378 + x"70",x"F8",x"FC",x"BE",x"9F",x"CD",x"78",x"30", -- 0x0380 + x"00",x"00",x"00",x"00",x"00",x"00",x"C0",x"00", -- 0x0388 + x"70",x"F8",x"FC",x"BE",x"9E",x"CD",x"78",x"30", -- 0x0390 + x"00",x"00",x"00",x"00",x"00",x"00",x"C0",x"00", -- 0x0398 + x"70",x"F8",x"FC",x"BF",x"BC",x"CC",x"78",x"30", -- 0x03A0 + x"00",x"00",x"00",x"00",x"80",x"40",x"00",x"00", -- 0x03A8 + x"70",x"F8",x"FC",x"BF",x"BC",x"CC",x"78",x"30", -- 0x03B0 + x"00",x"00",x"00",x"00",x"80",x"40",x"00",x"00", -- 0x03B8 + x"70",x"F8",x"CC",x"9F",x"BC",x"DC",x"78",x"30", -- 0x03C0 + x"00",x"00",x"00",x"80",x"00",x"00",x"00",x"00", -- 0x03C8 + x"70",x"F8",x"CC",x"9F",x"BC",x"DC",x"78",x"30", -- 0x03D0 + x"00",x"00",x"00",x"80",x"00",x"00",x"00",x"00", -- 0x03D8 + x"70",x"F8",x"CD",x"8F",x"9C",x"FC",x"78",x"30", -- 0x03E0 + x"00",x"40",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x03E8 + x"70",x"F8",x"CD",x"8F",x"9C",x"FC",x"78",x"30", -- 0x03F0 + x"00",x"40",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x03F8 + x"00",x"80",x"40",x"60",x"20",x"20",x"30",x"38", -- 0x0400 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0408 + x"78",x"F8",x"FC",x"BE",x"9F",x"CD",x"78",x"30", -- 0x0410 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0418 + x"20",x"30",x"10",x"10",x"38",x"38",x"78",x"78", -- 0x0420 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0428 + x"70",x"F8",x"FC",x"BF",x"BC",x"CC",x"78",x"30", -- 0x0430 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0438 + x"00",x"08",x"18",x"30",x"30",x"20",x"70",x"70", -- 0x0440 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0448 + x"78",x"F8",x"CC",x"9F",x"BC",x"DC",x"78",x"30", -- 0x0450 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0458 + x"00",x"02",x"04",x"0C",x"18",x"38",x"30",x"70", -- 0x0460 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0468 + x"70",x"F8",x"CD",x"8F",x"9C",x"FC",x"78",x"30", -- 0x0470 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0478 + x"00",x"80",x"40",x"60",x"20",x"20",x"30",x"38", -- 0x0480 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0488 + x"78",x"FC",x"9E",x"DE",x"66",x"36",x"1E",x"0A", -- 0x0490 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0498 + x"20",x"30",x"10",x"10",x"38",x"38",x"78",x"78", -- 0x04A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04A8 + x"78",x"FC",x"EE",x"E6",x"7E",x"3D",x"1C",x"08", -- 0x04B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"80", -- 0x04B8 + x"00",x"08",x"18",x"30",x"30",x"20",x"70",x"70", -- 0x04C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04C8 + x"78",x"FC",x"9E",x"DE",x"66",x"35",x"1C",x"09", -- 0x04D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"80", -- 0x04D8 + x"00",x"02",x"04",x"0C",x"18",x"38",x"30",x"70", -- 0x04E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E8 + x"78",x"FC",x"EE",x"E6",x"7E",x"3E",x"1E",x"09", -- 0x04F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F8 + x"78",x"FC",x"9E",x"DE",x"64",x"34",x"1C",x"08", -- 0x0500 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0510 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0518 + x"78",x"FC",x"9E",x"DE",x"64",x"34",x"1C",x"08", -- 0x0520 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0530 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0538 + x"78",x"FC",x"9E",x"DE",x"64",x"34",x"1C",x"08", -- 0x0540 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0550 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0558 + x"78",x"FC",x"9E",x"DE",x"64",x"34",x"1C",x"08", -- 0x0560 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0570 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0580 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0588 + x"00",x"80",x"40",x"60",x"20",x"20",x"30",x"38", -- 0x0590 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A8 + x"20",x"30",x"10",x"10",x"38",x"38",x"78",x"78", -- 0x05B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C8 + x"00",x"08",x"18",x"30",x"30",x"20",x"70",x"70", -- 0x05D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E8 + x"00",x"02",x"04",x"0C",x"18",x"38",x"30",x"70", -- 0x05F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05F8 + x"70",x"F8",x"FC",x"BE",x"9F",x"CD",x"78",x"70", -- 0x0600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0608 + x"78",x"37",x"3F",x"1F",x"1F",x"0C",x"0D",x"07", -- 0x0610 + x"00",x"00",x"E0",x"30",x"60",x"C0",x"80",x"00", -- 0x0618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0620 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0628 + x"39",x"7E",x"7E",x"6F",x"33",x"1F",x"0E",x"00", -- 0x0630 + x"00",x"30",x"7E",x"F3",x"F6",x"CC",x"D8",x"70", -- 0x0638 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0640 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0648 + x"19",x"1F",x"1E",x"1D",x"1F",x"0F",x"07",x"06", -- 0x0650 + x"18",x"7C",x"FC",x"FC",x"B8",x"B0",x"D0",x"60", -- 0x0658 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0660 + x"08",x"1C",x"34",x"64",x"DE",x"9E",x"FC",x"78", -- 0x0668 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0670 + x"70",x"F8",x"FC",x"BE",x"9F",x"CD",x"78",x"00", -- 0x0678 + x"70",x"F8",x"FC",x"BE",x"9F",x"CD",x"78",x"32", -- 0x0680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0688 + x"3F",x"3D",x"1D",x"1F",x"0F",x"0F",x"07",x"01", -- 0x0690 + x"00",x"C0",x"E0",x"30",x"F8",x"F0",x"E0",x"C0", -- 0x0698 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A8 + x"39",x"7E",x"7E",x"6F",x"33",x"1F",x"0E",x"00", -- 0x06B0 + x"60",x"30",x"7E",x"EE",x"CE",x"FC",x"F8",x"70", -- 0x06B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x06C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"9C",x"3E", -- 0x06C8 + x"01",x"03",x"03",x"07",x"07",x"07",x"07",x"03", -- 0x06D0 + x"FE",x"FE",x"FE",x"FC",x"F8",x"F0",x"E0",x"FC", -- 0x06D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06E0 + x"00",x"1C",x"3C",x"7E",x"FE",x"DE",x"CC",x"7F", -- 0x06E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F0 + x"71",x"F8",x"FC",x"BE",x"9F",x"CD",x"78",x"00", -- 0x06F8 + x"46",x"2D",x"16",x"CD",x"36",x"0D",x"36",x"C4", -- 0x0700 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0708 + x"1F",x"36",x"6F",x"FF",x"CF",x"C6",x"40",x"40", -- 0x0710 + x"80",x"C0",x"60",x"F0",x"30",x"30",x"20",x"20", -- 0x0718 + x"46",x"2D",x"16",x"CD",x"36",x"0D",x"36",x"C4", -- 0x0720 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0728 + x"1F",x"36",x"6F",x"FF",x"CF",x"66",x"20",x"20", -- 0x0730 + x"80",x"C0",x"60",x"F0",x"30",x"60",x"40",x"40", -- 0x0738 + x"44",x"2C",x"1C",x"CC",x"3C",x"0C",x"3C",x"C4", -- 0x0740 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0748 + x"1F",x"36",x"6F",x"FF",x"CF",x"66",x"30",x"10", -- 0x0750 + x"80",x"C0",x"60",x"F0",x"30",x"60",x"C0",x"80", -- 0x0758 + x"46",x"2D",x"16",x"CD",x"36",x"0D",x"36",x"C4", -- 0x0760 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0768 + x"1F",x"36",x"6F",x"FF",x"FF",x"76",x"19",x"06", -- 0x0770 + x"80",x"C0",x"60",x"F0",x"F0",x"E0",x"80",x"00", -- 0x0778 + x"0F",x"1F",x"3C",x"3B",x"7E",x"ED",x"DD",x"FF", -- 0x0780 + x"E0",x"F0",x"F8",x"CC",x"F6",x"FF",x"FF",x"3F", -- 0x0788 + x"FD",x"DE",x"DF",x"6F",x"7F",x"39",x"1F",x"07", -- 0x0790 + x"BB",x"FB",x"FB",x"FE",x"EE",x"9C",x"F8",x"C0", -- 0x0798 + x"01",x"07",x"1F",x"0F",x"2F",x"1F",x"3F",x"3E", -- 0x07A0 + x"00",x"E0",x"E0",x"F0",x"FC",x"FC",x"78",x"BC", -- 0x07A8 + x"1F",x"1D",x"3F",x"1F",x"0F",x"1F",x"0F",x"01", -- 0x07B0 + x"7C",x"F8",x"F8",x"FC",x"F8",x"E8",x"F0",x"A0", -- 0x07B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07C0 + x"24",x"14",x"0C",x"3F",x"3F",x"0C",x"14",x"24", -- 0x07C8 + x"20",x"90",x"40",x"F0",x"F0",x"40",x"90",x"20", -- 0x07D0 + x"24",x"94",x"4C",x"FF",x"FF",x"4C",x"94",x"24", -- 0x07D8 + x"00",x"0C",x"14",x"FE",x"FE",x"14",x"0C",x"00", -- 0x07E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/GAL_FIR.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/GAL_FIR.vhd new file mode 100644 index 00000000..5aff2022 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/GAL_FIR.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_FIR 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 prom of GAL_FIR is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AC",X"68",X"72",X"C7",X"93",X"3F",X"80",X"C8",X"5C",X"A1",X"22",X"90",X"B9",X"8A",X"41",X"62", + X"C2",X"A1",X"40",X"6A",X"C9",X"7F",X"64",X"3C",X"BC",X"AD",X"5B",X"4C",X"D4",X"62",X"3D",X"D3", + X"7F",X"31",X"A3",X"BE",X"5D",X"49",X"C7",X"7D",X"28",X"C0",X"A1",X"7A",X"7D",X"2B",X"C9",X"91", + X"80",X"6B",X"39",X"95",X"BA",X"91",X"27",X"C1",X"91",X"7E",X"6D",X"31",X"C0",X"A4",X"7C",X"7B", + X"37",X"80",X"CB",X"7E",X"88",X"64",X"40",X"8F",X"C3",X"83",X"83",X"68",X"36",X"D0",X"8C",X"29", + X"B4",X"B1",X"52",X"4B",X"E9",X"3E",X"74",X"C4",X"73",X"81",X"2B",X"AD",X"B9",X"4E",X"4B",X"CB", + X"91",X"76",X"33",X"B6",X"A5",X"6E",X"4A",X"63",X"D7",X"7C",X"3E",X"7E",X"DE",X"45",X"67",X"C1", + X"84",X"2D",X"A8",X"A9",X"20",X"AC",X"B5",X"7E",X"47",X"5F",X"DD",X"6E",X"44",X"BD",X"97",X"22", + X"AE",X"A4",X"25",X"CB",X"93",X"77",X"3C",X"78",X"CB",X"83",X"29",X"B3",X"AB",X"7D",X"5D",X"44", + X"A4",X"BC",X"79",X"8C",X"3A",X"76",X"CF",X"78",X"44",X"6B",X"D9",X"6B",X"3B",X"9A",X"CC",X"26", + X"A4",X"A3",X"1D",X"BA",X"A9",X"83",X"71",X"3A",X"8B",X"CC",X"6A",X"3E",X"E5",X"28",X"A4",X"A3", + X"1E",X"C9",X"9C",X"78",X"32",X"94",X"C4",X"74",X"88",X"2A",X"A2",X"BC",X"1A",X"E2",X"4B",X"86", + X"B3",X"72",X"48",X"68",X"D2",X"83",X"32",X"A4",X"B2",X"73",X"4E",X"5A",X"C8",X"9C",X"2C",X"90", + X"C1",X"7B",X"5E",X"41",X"CC",X"99",X"6F",X"3A",X"8B",X"C9",X"7A",X"84",X"23",X"BC",X"9D",X"33", + X"CC",X"82",X"24",X"D7",X"6C",X"47",X"D1",X"87",X"5C",X"41",X"C5",X"9F",X"71",X"35",X"A8",X"B9", + X"67",X"4F",X"5F",X"CE",X"8A",X"43",X"C6",X"80",X"54",X"4A",X"B1",X"AE",X"87",X"50",X"4F",X"C6", + X"9F",X"55",X"45",X"BB",X"AC",X"5C",X"41",X"A9",X"BE",X"5C",X"4C",X"72",X"D4",X"71",X"42",X"DA", + X"20",X"CF",X"6C",X"3D",X"D5",X"8A",X"78",X"39",X"7B",X"BF",X"99",X"75",X"37",X"99",X"C7",X"28", + X"7B",X"C3",X"91",X"58",X"46",X"9D",X"BB",X"88",X"60",X"40",X"9A",X"BB",X"8C",X"3B",X"6A",X"BA", + X"AC",X"31",X"7F",X"C8",X"2F",X"78",X"DC",X"33",X"AE",X"80",X"34",X"EE",X"38",X"74",X"D5",X"1F", + X"98",X"BA",X"82",X"58",X"4A",X"D6",X"86",X"56",X"49",X"F0",X"34",X"73",X"BD",X"9A",X"43",X"67", + X"C3",X"8D",X"2E",X"8B",X"B9",X"40",X"C6",X"33",X"B7",X"A5",X"27",X"8A",X"BA",X"42",X"BF",X"8A", + X"3A",X"6F",X"D1",X"5C",X"41",X"DF",X"6A",X"42",X"C3",X"A4",X"33",X"80",X"CC",X"5C",X"43",X"89", + X"BE",X"96",X"53",X"4E",X"8D",X"D4",X"2E",X"BD",X"56",X"6C",X"DA",X"53",X"47",X"9C",X"C8",X"2A", + X"75",X"B3",X"B0",X"2F",X"80",X"CA",X"2B",X"81",X"CD",X"35",X"7E",X"CE",X"32",X"81",X"CD",X"74", + X"40",X"74",X"D8",X"4E",X"58",X"D3",X"85",X"4D",X"53",X"AE",X"B8",X"61",X"3D",X"9F",X"C3",X"30", + X"86",X"D0",X"5E",X"47",X"7D",X"C6",X"91",X"4E",X"4E",X"A9",X"B9",X"6D",X"34",X"9F",X"B7",X"3F", + X"C6",X"7A",X"37",X"81",X"C5",X"8C",X"33",X"88",X"D3",X"44",X"59",X"82",X"C8",X"88",X"42",X"61", + X"AF",X"A2",X"44",X"D9",X"48",X"52",X"89",X"BC",X"99",X"2E",X"7E",X"B4",X"38",X"B7",X"9E",X"20", + X"E4",X"56",X"63",X"D9",X"56",X"43",X"B1",X"B8",X"37",X"6B",X"D3",X"6D",X"31",X"C8",X"65",X"8D", + X"B9",X"0B",X"BA",X"86",X"4D",X"D7",X"4E",X"4B",X"E7",X"3C",X"95",X"AD",X"1D",X"D8",X"72",X"35", + X"B4",X"A5",X"2F",X"B3",X"B6",X"44",X"57",X"93",X"CB",X"67",X"3F",X"A1",X"C7",X"21",X"89",X"9C", + X"5A",X"D8",X"20",X"A3",X"BA",X"25",X"89",X"AD",X"37",X"D8",X"5D",X"53",X"DC",X"77",X"43",X"70", + X"E1",X"46",X"59",X"83",X"CC",X"6E",X"37",X"E7",X"56",X"4E",X"86",X"D3",X"27",X"9E",X"AA",X"44", + X"C0",X"19",X"E9",X"54",X"63",X"DB",X"51",X"4D",X"88",X"CF",X"30",X"91",X"C5",X"66",X"35",X"C1", + X"9C",X"33",X"79",X"A7",X"BA",X"53",X"41",X"DD",X"4B",X"73",X"D2",X"25",X"7F",X"BB",X"9D",X"37", + X"68",X"A9",X"BD",X"3B",X"5C",X"CF",X"61",X"47",X"C9",X"9E",X"47",X"55",X"AF",X"96",X"5D",X"D0", + X"28",X"7E",X"D3",X"48",X"51",X"C7",X"95",X"21",X"BB",X"A6",X"3A",X"67",X"C3",X"81",X"37",X"DE", + X"7D",X"3F",X"72",X"AA",X"B4",X"15",X"DC",X"6C",X"47",X"D2",X"71",X"28",X"EB",X"2E",X"9F",X"93", + X"6C",X"9C",X"37",X"DB",X"43",X"AC",X"37",X"D3",X"4F",X"AC",X"8D",X"1B",X"DF",X"7E",X"46",X"6B", + X"BA",X"A5",X"35",X"73",X"CB",X"41",X"7E",X"C8",X"1D",X"D3",X"60",X"5F",X"DB",X"44",X"57",X"C2", + X"A2",X"41",X"5B",X"AE",X"96",X"5E",X"CC",X"10",X"CF",X"83",X"31",X"DF",X"59",X"46",X"CC",X"87", + X"28",X"D7",X"84",X"3D",X"7A",X"DD",X"3A",X"7B",X"C8",X"36",X"66",X"C8",X"60",X"9A",X"8F",X"29", + X"A8",X"B3",X"83",X"1F",X"D6",X"81",X"33",X"C4",X"82",X"2A",X"D4",X"6B",X"70",X"CA",X"1B",X"A9", + X"AB",X"22",X"AE",X"9E",X"49",X"D3",X"45",X"5A",X"A1",X"BB",X"70",X"27",X"E9",X"49",X"72",X"CC", + X"38",X"67",X"B6",X"AD",X"41",X"57",X"B7",X"8C",X"39",X"E4",X"70",X"4B",X"63",X"C7",X"52",X"AE", + X"8A",X"36",X"8A",X"BB",X"8E",X"2F",X"87",X"AB",X"B2",X"2D",X"72",X"94",X"CD",X"39",X"67",X"D9", + X"2B",X"86",X"C8",X"50",X"4D",X"BC",X"A1",X"3F",X"6B",X"BC",X"7C",X"48",X"E0",X"20",X"BA",X"83", + X"43",X"D4",X"26",X"BD",X"A2",X"3E",X"6C",X"CA",X"8A",X"38",X"7B",X"AF",X"AE",X"23",X"91",X"C0", + X"37",X"76",X"A3",X"C2",X"39",X"63",X"D9",X"48",X"5A",X"93",X"C9",X"43",X"62",X"90",X"B1",X"37", + X"D1",X"53",X"74",X"B1",X"37",X"F6",X"23",X"82",X"C3",X"52",X"4A",X"BB",X"75",X"95",X"88",X"3D", + X"90",X"C3",X"76",X"3B",X"87",X"A9",X"70",X"A6",X"61",X"4F",X"AE",X"B6",X"50",X"4B",X"E2",X"4A", + X"63",X"DC",X"3E",X"63",X"92",X"CC",X"4F",X"4D",X"E3",X"4A",X"5B",X"89",X"D0",X"47",X"5E",X"90", + X"D0",X"49",X"5B",X"7E",X"C6",X"76",X"3E",X"8C",X"AA",X"A4",X"15",X"CD",X"89",X"43",X"80",X"BD", + X"65",X"A8",X"3D",X"8E",X"CF",X"0B",X"C0",X"8E",X"46",X"76",X"C9",X"7A",X"3E",X"88",X"AA",X"A8", + X"18",X"BF",X"9C",X"2E",X"C3",X"85",X"2B",X"DC",X"6C",X"45",X"DB",X"4B",X"5F",X"92",X"AD",X"3D", + X"C3",X"4F",X"86",X"A6",X"75",X"81",X"36",X"E7",X"37",X"A6",X"7D",X"A5",X"5A",X"58",X"D8",X"4E", + X"56",X"AB",X"8E",X"49",X"DD",X"68",X"40",X"8A",X"B0",X"53",X"C3",X"4F",X"60",X"92",X"C6",X"51", + X"54",X"9A",X"C5",X"55",X"4D",X"93",X"C2",X"70",X"2F",X"E3",X"50",X"5B",X"8D",X"AF",X"48",X"AA", + X"81",X"98",X"4C",X"65",X"C1",X"66",X"BB",X"23",X"B0",X"9B",X"39",X"83",X"A4",X"B3",X"1A",X"B0", + X"9D",X"31",X"C3",X"8E",X"2B",X"E2",X"54",X"5A",X"DC",X"32",X"86",X"CA",X"14",X"C9",X"83",X"43", + X"83",X"AD",X"A6",X"15",X"DA",X"6D",X"4C",X"87",X"AF",X"63",X"B9",X"3A",X"8C",X"C5",X"0D",X"CC", + X"79",X"58",X"74",X"C9",X"7D",X"42",X"7C",X"B7",X"5C",X"A9",X"7B",X"41",X"93",X"B6",X"81",X"32", + X"9D",X"92",X"6B",X"87",X"9D",X"94",X"4A",X"6C",X"B7",X"A4",X"1B",X"BD",X"88",X"4D",X"7D",X"BD", + X"4D",X"99",X"8A",X"51",X"CF",X"1B",X"F2",X"56",X"5A",X"72",X"C3",X"4B",X"BE",X"63",X"52",X"E1", + X"2F",X"77",X"91",X"93",X"52",X"C0",X"37",X"E1",X"53",X"5A",X"DA",X"35",X"77",X"85",X"D5",X"39", + X"6D",X"80",X"D3",X"50",X"58",X"D3",X"2D",X"9A",X"B2",X"23",X"BC",X"8C",X"52",X"71",X"C1",X"8D", + X"3E",X"76",X"B3",X"6F",X"6D",X"A1",X"49",X"C9",X"2E",X"D1",X"38",X"C6",X"55",X"8B",X"7C",X"86", + X"B2",X"33",X"7E",X"AD",X"99",X"3C",X"80",X"A3",X"6E",X"88",X"98",X"50",X"AA",X"79",X"99",X"27", + X"FB",X"1D",X"AE",X"63",X"8F",X"94",X"51",X"B0",X"4A",X"AD",X"86",X"8B",X"39",X"EA",X"1B",X"AB", + X"9A",X"4C",X"73",X"B8",X"9A",X"3A",X"76",X"AC",X"64",X"88",X"8B",X"6D",X"A6",X"71",X"97",X"40", + X"8C",X"B5",X"4A",X"A0",X"68",X"86",X"8C",X"98",X"69",X"59",X"DE",X"1F",X"AB",X"A0",X"36",X"A8", + X"A7",X"28",X"E0",X"58",X"59",X"CE",X"37",X"82",X"C8",X"2E",X"A4",X"5A",X"AF",X"62",X"8E",X"C2", + X"2D",X"79",X"91",X"C2",X"2A",X"96",X"77",X"8A",X"99",X"8E",X"3D",X"C7",X"61",X"57",X"9D",X"A3", + X"44",X"DE",X"34",X"88",X"B1",X"37",X"89",X"A3",X"B3",X"15",X"CB",X"73",X"43",X"BA",X"8D",X"47", + X"9D",X"6F",X"C9",X"15",X"D1",X"72",X"53",X"CA",X"48",X"6B",X"9B",X"89",X"6A",X"A0",X"57",X"BE", + X"45",X"9C",X"A5",X"5E",X"54",X"CA",X"63",X"52",X"E1",X"25",X"AE",X"93",X"35",X"E5",X"2A",X"A5", + X"97",X"40",X"8A",X"9A",X"73",X"81",X"8E",X"57",X"CC",X"68",X"67",X"5D",X"C5",X"94",X"43",X"6E", + X"AA",X"A8",X"30",X"9D",X"6E",X"B3",X"6B",X"4B",X"AB",X"79",X"90",X"93",X"50",X"89",X"81",X"8A", + X"A4",X"42",X"9B",X"7F",X"67",X"9F",X"A8",X"48",X"80",X"BA",X"23",X"C5",X"6A",X"5E",X"91",X"99", + X"62",X"9A",X"91",X"6A",X"5A",X"D9",X"3D",X"81",X"B2",X"34",X"C5",X"7A",X"3F",X"BB",X"90",X"3D", + X"D0",X"50",X"65",X"95",X"94",X"63",X"C6",X"2D",X"A6",X"91",X"3D",X"CA",X"5F",X"66",X"91",X"97", + X"A6",X"35",X"A6",X"97",X"2E",X"D9",X"41",X"8F",X"A4",X"3E",X"A2",X"B0",X"2E",X"B5",X"7A",X"55", + X"C9",X"3F",X"84",X"C3",X"42",X"8A",X"72",X"9F",X"65",X"95",X"72",X"84",X"8A",X"58",X"C6",X"73", + X"47",X"D9",X"35",X"90",X"9F",X"4D",X"80",X"A8",X"A1",X"30",X"8F",X"8B",X"C5",X"18",X"B5",X"70", + X"65",X"B0",X"5D",X"93",X"93",X"7B",X"48",X"CB",X"52",X"7D",X"B0",X"3D",X"98",X"BA",X"2E",X"AD", + X"86",X"4A",X"BD",X"6E",X"4C",X"DA",X"53",X"78",X"77",X"96",X"75",X"83",X"82",X"82",X"A5",X"3D", + X"86",X"A2",X"A7",X"31",X"8B",X"8E",X"C3",X"20",X"AA",X"92",X"3A",X"C0",X"87",X"51",X"77",X"AD", + X"62",X"B9",X"4F",X"7F",X"BC",X"1E",X"BF",X"7E",X"51",X"C3",X"50",X"72",X"C0",X"49",X"8A",X"81", + X"72",X"AA",X"7B",X"55",X"8C",X"83",X"CA",X"2B",X"97",X"9C",X"4B",X"86",X"9F",X"B0",X"14",X"EA", + X"3C",X"8A",X"9B",X"51",X"C2",X"25",X"C7",X"70",X"5F",X"AF",X"52",X"C6",X"29",X"B8",X"7F",X"5F", + X"A3",X"5C",X"CB",X"26",X"AE",X"8B",X"3C",X"D6",X"48",X"8A",X"74",X"A2",X"8D",X"3F",X"D3",X"2A", + X"B9",X"7B",X"4D",X"A6",X"69",X"B6",X"6E",X"56",X"8A",X"A1",X"64",X"C3",X"28",X"B2",X"7D",X"60", + X"A6",X"58",X"D4",X"11",X"D1",X"5C",X"7A",X"A8",X"42",X"96",X"C7",X"27",X"A9",X"90",X"44",X"89", + X"9F",X"69",X"90",X"A7",X"25",X"DB",X"46",X"7C",X"B7",X"42",X"9A",X"6E",X"99",X"8C",X"81",X"41", + X"C7",X"7A",X"58",X"8D",X"83",X"B2",X"29",X"C1",X"6E",X"52",X"DA",X"44",X"83",X"B6",X"2A",X"C4", + X"41",X"A6",X"7A",X"76",X"98",X"5B",X"B6",X"86",X"42",X"A2",X"8A",X"4B",X"95",X"97",X"65",X"B7", + X"56",X"6C",X"D2",X"1E",X"B6",X"94",X"36",X"DD",X"38",X"96",X"7B",X"70",X"9E",X"95",X"59",X"77", + X"82",X"8D",X"7C",X"78",X"DC",X"01",X"CD",X"70",X"5D",X"76",X"B4",X"91",X"35",X"BD",X"48",X"D3", + X"36",X"8E",X"B7",X"2C",X"BE",X"49",X"CA",X"4C",X"72",X"CB",X"29",X"B9",X"82",X"3B",X"CC",X"71", + X"4B",X"D1",X"4F",X"6A",X"8D",X"C9",X"46",X"6A",X"CA",X"28",X"99",X"A9",X"61",X"59",X"AA",X"78", + X"8F",X"98",X"35",X"CE",X"64",X"58",X"95",X"A7",X"49",X"AC",X"57",X"9B",X"7C",X"70",X"DE",X"14", + X"A9",X"A3",X"3F",X"7B",X"C9",X"57",X"5F",X"D6",X"17",X"C5",X"7D",X"58",X"9E",X"71",X"B8",X"3D", + X"72",X"A7",X"6C",X"A7",X"80",X"3A",X"E5",X"22",X"A5",X"61",X"B6",X"86",X"38",X"D9",X"56",X"57", + X"9A",X"8E",X"64",X"97",X"96",X"7D",X"45",X"CC",X"5D",X"5A",X"A8",X"AA",X"3C",X"7E",X"97",X"C1", + X"22",X"9B",X"A7",X"45",X"7F",X"A1",X"B4",X"1D",X"BB",X"51",X"B9",X"7A",X"45",X"91",X"A5",X"67", + X"B8",X"34",X"9E",X"A8",X"35",X"88",X"B0",X"54",X"A8",X"8C",X"31",X"E7",X"41",X"6A",X"C7",X"41", + X"85",X"BA",X"2D",X"B1",X"A0",X"35",X"90",X"9F",X"75",X"A0",X"5D",X"52",X"CA",X"59",X"84",X"9A", + X"52",X"B2",X"66",X"AF",X"43",X"6E",X"BC",X"59",X"89",X"95",X"8B",X"74",X"44",X"AE",X"85",X"96", + X"7B",X"4A",X"8B",X"BD",X"7E",X"2F",X"D2",X"68",X"4D",X"D9",X"41",X"6F",X"CA",X"4D",X"62",X"A0", + X"B7",X"3C",X"76",X"D1",X"2E",X"98",X"B1",X"2A",X"BB",X"8D",X"2F",X"E2",X"4A",X"6C",X"C4",X"49", + X"64",X"A5",X"88",X"80",X"9E",X"2A",X"DD",X"59",X"54",X"CE",X"60",X"54",X"9E",X"9D",X"42",X"BF", + X"92",X"34",X"98",X"B7",X"40",X"77",X"9F",X"BC",X"28",X"93",X"B8",X"44",X"67",X"A7",X"AC",X"41", + X"6F",X"9F",X"91",X"50",X"C4",X"37",X"B1",X"7A",X"5B",X"DD",X"4C",X"58",X"C6",X"5D",X"51",X"BA", + X"82",X"47",X"D6",X"6B",X"45",X"AC",X"60",X"C5",X"3D",X"7D",X"CA",X"33",X"8D",X"AE",X"42",X"88", + X"CB",X"4F",X"5D",X"84",X"C3",X"31",X"B4",X"6B",X"6C",X"AD",X"73",X"AB",X"23",X"D5",X"6B",X"43", + X"D1",X"6A",X"47",X"CB",X"4B",X"77",X"C4",X"2B",X"BC",X"94",X"35",X"C6",X"77",X"3E",X"9E",X"94", + X"77",X"A5",X"43",X"7C",X"99",X"BD",X"3A",X"79",X"C8",X"2B",X"B8",X"83",X"37",X"D2",X"77",X"4F", + X"78",X"BD",X"43",X"AC",X"80",X"66",X"C8",X"28",X"89",X"A3",X"AF",X"2A",X"92",X"B9",X"3D",X"80", + X"CC",X"27",X"9A",X"B0",X"48",X"66",X"AD",X"8D",X"44",X"D0",X"6A",X"44",X"AA",X"87",X"6B",X"C7", + X"25",X"A3",X"AB",X"41",X"70",X"AD",X"71",X"9C",X"74",X"45",X"C9",X"91",X"51",X"5D",X"D9",X"4E", + X"62",X"C7",X"61",X"4C",X"A4",X"97",X"78",X"95",X"3D",X"9E",X"A8",X"30",X"D4",X"4B",X"81",X"B2", + X"33",X"C5",X"65",X"A4",X"63",X"4E",X"A8",X"98",X"5F",X"C0",X"30",X"96",X"B5",X"3D",X"75",X"B2", + X"92",X"31",X"B1",X"A5",X"33",X"A4",X"AD",X"43",X"68",X"B4",X"7A",X"51",X"DB",X"45",X"74",X"C9", + X"2D",X"95",X"AD",X"3B",X"8E",X"A9",X"3D",X"C0",X"70",X"62",X"D5",X"27",X"A7",X"9E",X"3F",X"7C", + X"BC",X"50",X"A4",X"8E",X"34",X"A3",X"A1",X"4E",X"99",X"BC",X"35",X"7B",X"BD",X"67",X"45",X"AA", + X"94",X"62",X"C1",X"3E",X"74",X"CB",X"41",X"74",X"A3",X"50",X"B6",X"9F",X"47",X"68",X"A6",X"AF", + X"4A",X"62",X"94",X"AC",X"3F",X"AD",X"A9",X"3F",X"72",X"8A",X"C7",X"54",X"5E",X"7A",X"C0",X"80", + X"4D",X"6B",X"B7",X"71",X"86",X"9F",X"2C",X"DC",X"60",X"59",X"79",X"BB",X"7C",X"40",X"A8",X"AC", + X"63",X"48",X"D4",X"67",X"56",X"79",X"B8",X"8D",X"38",X"BE",X"7E",X"3C",X"B0",X"97",X"54",X"C2", + X"37",X"98",X"B4",X"32",X"90",X"B9",X"4F",X"5E",X"B2",X"A0",X"34",X"9F",X"A3",X"35",X"AD",X"9B", + X"38",X"BB",X"97",X"4E",X"64",X"A4",X"94",X"53",X"D0",X"45",X"6A",X"C2",X"6E",X"42",X"CC",X"77", + X"52",X"73",X"BB",X"61",X"89",X"B2",X"2D",X"9C",X"B4",X"43",X"77",X"C5",X"57",X"59",X"93",X"A6", + X"5B",X"B6",X"50",X"63",X"BE",X"8D",X"4D",X"6A",X"A2",X"AA",X"6F",X"3F",X"C2",X"86",X"4B",X"75", + X"BD",X"76",X"4B",X"D2",X"5A",X"5A",X"8A",X"BF",X"5B",X"56",X"B3",X"9F",X"4E",X"66",X"C4",X"5D", + X"51",X"C0",X"68",X"70",X"C1",X"3E",X"75",X"BB",X"50",X"A6",X"88",X"3A",X"AB",X"A4",X"79",X"3A", + X"BC",X"8E",X"4A",X"74",X"B7",X"82",X"42",X"D2",X"5F",X"5A",X"7F",X"B4",X"8D",X"41",X"86",X"C0", + X"55",X"5F",X"C0",X"44",X"96",X"B6",X"5A",X"5A",X"84",X"BD",X"78",X"52",X"6C",X"BA",X"82",X"41", + X"BD",X"83",X"3E",X"A9",X"91",X"56",X"CA",X"38",X"95",X"AA",X"39",X"8B",X"AE",X"4D",X"8C",X"AC", + X"35",X"BC",X"79",X"52",X"C1",X"5A",X"80",X"C2",X"41",X"73",X"A8",X"4C",X"B1",X"9C",X"63",X"4F", + X"BB",X"8B",X"4B",X"70",X"B2",X"7F",X"46",X"D3",X"48",X"A3",X"94",X"3D",X"94",X"B6",X"52",X"61", + X"BD",X"49",X"91",X"B9",X"58",X"61",X"77",X"BD",X"4D",X"A9",X"84",X"43",X"CF",X"6A",X"58",X"74", + X"C2",X"57",X"93",X"61",X"84",X"BB",X"2E",X"B6",X"86",X"4B",X"C7",X"71",X"54",X"76",X"AF",X"73", + X"5D",X"D2",X"40",X"85",X"B7",X"59",X"5A",X"94",X"AF",X"40",X"9D",X"A1",X"32",X"BD",X"71",X"72", + X"BC",X"51",X"60",X"97",X"AC",X"7F",X"47",X"8D",X"B7",X"57",X"5B",X"C1",X"7B",X"52",X"73",X"AB", + X"8B",X"44",X"C1",X"82",X"42",X"BD",X"75",X"4B",X"B0",X"9D",X"6A",X"50",X"8A",X"AD",X"8E",X"53", + X"65",X"9C",X"AE",X"65",X"51",X"AF",X"99",X"43",X"80",X"B4",X"7E",X"3D",X"B9",X"6B",X"66",X"C2", + X"45",X"B4",X"81",X"50",X"72",X"BC",X"6E",X"4E",X"BA",X"7A",X"4A",X"C1",X"6F",X"5A",X"BB",X"89", + X"5C",X"5E",X"9B",X"AF",X"5E",X"5C",X"CA",X"43",X"87",X"B0",X"41",X"85",X"BA",X"4D",X"77",X"BA", + X"76",X"4A",X"A7",X"9D",X"54",X"61",X"AA",X"9C",X"47",X"7B",X"B2",X"8B",X"51",X"6C",X"9A",X"A4", + X"42",X"A4",X"A6",X"3A",X"A5",X"97",X"3F",X"9E",X"A7",X"78",X"4E",X"7F",X"B1",X"8A",X"58",X"64", + X"B8",X"88",X"48",X"87",X"B5",X"6E",X"49",X"BE",X"59",X"93",X"A5",X"46",X"74",X"9E",X"A3",X"35", + X"C2",X"72",X"55",X"C2",X"5B",X"60",X"B9",X"79",X"48",X"C8",X"57",X"84",X"B1",X"4B",X"6C",X"97", + X"AC",X"3F",X"8C",X"AF",X"47",X"AF",X"89",X"4A",X"7D",X"A4",X"9E",X"4F",X"6A",X"B1",X"8E",X"45", + X"88",X"B2",X"70",X"4B",X"A7",X"9C",X"41",X"AD",X"96",X"49",X"7B",X"B6",X"77",X"4B",X"B4",X"8D", + X"56",X"67",X"A2",X"A0",X"3E",X"B2",X"84",X"45",X"AC",X"9A",X"78",X"44",X"B1",X"80",X"52",X"C9", + X"4B",X"7E",X"B7",X"3C",X"A1",X"99",X"40",X"9F",X"A3",X"7C",X"4C",X"8A",X"B0",X"76",X"4C",X"9D", + X"A6",X"3F",X"9C",X"A5",X"5E",X"5C",X"B7",X"85",X"4E",X"7E",X"B4",X"6A",X"56",X"CD",X"4B",X"99", + X"6F",X"69",X"C4",X"45",X"89",X"B2",X"60",X"60",X"7F",X"BB",X"57",X"6E",X"B4",X"84",X"66",X"59", + X"BD",X"4A",X"9F",X"A0",X"5B",X"5F",X"A1",X"A4",X"65",X"57",X"94",X"A3",X"8E",X"46",X"8A",X"9B", + X"58",X"B7",X"78",X"4C",X"9B",X"A1",X"40",X"AF",X"87",X"42",X"B4",X"80",X"5E",X"BB",X"4B",X"7D", + X"BB",X"42",X"95",X"A1",X"42",X"AA",X"98",X"59",X"64",X"A4",X"A0",X"5F",X"5D",X"9C",X"A7",X"66", + X"57",X"A0",X"A4",X"5E",X"61",X"8A",X"B4",X"4D",X"92",X"A5",X"55",X"68",X"8F",X"B1",X"55",X"6C", + X"BE",X"51",X"88",X"A6",X"36",X"C2",X"6C",X"60",X"B2",X"84",X"4D",X"84",X"A8",X"4A",X"A5",X"9E", + X"60",X"5D",X"AD",X"92",X"76",X"4E",X"94",X"A8",X"72",X"4C",X"B0",X"7A",X"57",X"B8",X"85",X"72", + X"51",X"C2",X"59",X"6C",X"B1",X"86",X"69",X"5A",X"92",X"A9",X"7B",X"50",X"8B",X"B3",X"41",X"AD", + X"6F",X"61",X"B7",X"82",X"6E",X"55",X"A0",X"9F",X"4B",X"87",X"B1",X"52",X"9B",X"96",X"59",X"68", + X"B7",X"55",X"85",X"B1",X"64",X"65",X"70",X"BB",X"6A",X"5F",X"B0",X"8A",X"76",X"55",X"82",X"AE", + X"82",X"5F",X"66",X"A1",X"9C",X"48",X"B7",X"67",X"60",X"B8",X"76",X"4D",X"B7",X"76",X"62",X"B1", + X"7C",X"55",X"84",X"AD",X"77",X"55",X"8B",X"AC",X"40",X"9A",X"A1",X"75",X"57",X"7D",X"A6",X"91", + X"75",X"5C",X"74",X"AE",X"7D",X"52",X"C1",X"58",X"74",X"B7",X"45",X"95",X"A1",X"70",X"57",X"89", + X"AA",X"81",X"5B",X"6D",X"9F",X"9E",X"6F",X"57",X"AB",X"8E",X"63",X"5E",X"B0",X"80",X"4E",X"B1", + X"88",X"4C",X"9E",X"9A",X"46",X"98",X"A4",X"6C",X"55",X"B0",X"84",X"56",X"B8",X"48",X"92",X"A3", + X"7D",X"69",X"5C",X"A6",X"98",X"51",X"83",X"B5",X"4C",X"8E",X"A3",X"69",X"5E",X"80",X"AF",X"6B", + X"5B",X"B3",X"7C",X"52",X"B1",X"88",X"81",X"50",X"88",X"A7",X"83",X"54",X"82",X"AB",X"46",X"9F", + X"9F",X"4B",X"94",X"9F",X"42",X"A8",X"92",X"84",X"59",X"77",X"B3",X"46",X"A5",X"8C",X"4A",X"AE", + X"8A",X"59",X"A9",X"82",X"67",X"60",X"99",X"9F",X"81",X"6A",X"5B",X"BF",X"4F",X"9C",X"82",X"54", + X"BA",X"75",X"55",X"A7",X"8A",X"4B",X"A4",X"96",X"82",X"61",X"67",X"9A",X"9E",X"4D",X"8A",X"A7", + X"7F",X"73",X"52",X"BB",X"60",X"73",X"AC",X"83",X"73",X"59",X"89",X"A4",X"88",X"50",X"95",X"A2", + X"67",X"63",X"7D",X"B0",X"72",X"59",X"A9",X"8F",X"50",X"87",X"AC",X"47",X"9C",X"97",X"7B",X"53", + X"92",X"A0",X"7B",X"5B",X"7F",X"B1",X"49",X"8D",X"A4",X"7B",X"66",X"62",X"B4",X"76",X"66",X"AA", + X"81",X"62",X"6D",X"AF",X"80",X"6D",X"5C",X"97",X"9C",X"86",X"69",X"60",X"AE",X"80",X"4E",X"B9", + X"66",X"6D",X"AA",X"83",X"64",X"69",X"AD",X"86",X"6B",X"60",X"8C",X"AA",X"65",X"66",X"AF",X"80", + X"51",X"9A",X"9B",X"7B",X"72",X"57",X"A5",X"92",X"87",X"67",X"66",X"86",X"B2",X"58",X"8E",X"8B", + X"5F",X"B0",X"71",X"6B",X"63",X"A7",X"8F",X"85",X"67",X"63",X"B2",X"61",X"6F",X"AE",X"81",X"7F", + X"4E",X"A4",X"8D",X"51",X"9F",X"99",X"73",X"62",X"75",X"B6",X"66",X"79",X"9F",X"50",X"B7",X"4C", + X"8E",X"9E",X"7D",X"5C",X"7F",X"AF",X"4B",X"8D",X"A1",X"7D",X"65",X"66",X"AE",X"7B",X"62",X"AD", + X"7B",X"6C",X"5F",X"A8",X"8D",X"84",X"66",X"65",X"A7",X"8D",X"75",X"58",X"9F",X"97",X"74",X"60", + X"79",X"A4",X"8E",X"6A",X"5F",X"A7",X"8D",X"53",X"A7",X"87",X"73",X"57",X"B1",X"74",X"68",X"AD", + X"48",X"A0",X"94",X"81",X"6D",X"5F",X"94",X"9C",X"85",X"6D",X"5F",X"97",X"9D",X"78",X"5B",X"87", + X"AA",X"5E",X"6C",X"A6",X"8A",X"7A",X"5D",X"7B",X"9E",X"96",X"59",X"7D",X"AB",X"4C",X"98",X"95", + X"4B",X"A5",X"8B",X"55",X"A5",X"8D",X"71",X"60",X"84",X"A4",X"84",X"7F",X"5A",X"82",X"AB",X"5B", + X"78",X"B2",X"5B",X"7F",X"A2",X"4D",X"94",X"A2",X"51",X"98",X"93",X"78",X"57",X"9B",X"95",X"7D", + X"57",X"90",X"9D",X"53",X"A2",X"8D",X"6C",X"65",X"81",X"AD",X"68",X"71",X"A9",X"53",X"A4",X"82", + X"7A",X"55",X"A4",X"88",X"53",X"A5",X"8D",X"7F",X"6A",X"63",X"A7",X"87",X"59",X"A5",X"8A",X"77", + X"61",X"7B",X"AD",X"73",X"6B",X"A1",X"7F",X"6F",X"60",X"B2",X"6C",X"66",X"AA",X"82",X"81",X"5E", + X"75",X"9D",X"92",X"7D",X"6C",X"63",X"B0",X"73",X"60",X"A8",X"86",X"80",X"62",X"71",X"99",X"9A", + X"50",X"97",X"92",X"51",X"9D",X"96",X"51",X"A5",X"79",X"5D",X"AA",X"85",X"80",X"64",X"6D",X"AB", + X"77",X"64",X"A9",X"82",X"77",X"5F",X"85",X"A1",X"85",X"7F",X"5B",X"88",X"A4",X"4E",X"95",X"98", + X"81",X"69",X"69",X"B1",X"55",X"90",X"99",X"4F",X"A7",X"7E",X"59",X"AA",X"7C",X"5B",X"9E",X"92", + X"7E",X"70",X"5F",X"A1",X"8F",X"85",X"5F",X"78",X"A6",X"7F",X"77",X"5A",X"A0",X"87",X"58",X"A0", + X"93",X"59",X"97",X"94",X"5B",X"76",X"9F",X"8E",X"63",X"72",X"AC",X"57",X"81",X"A6",X"66",X"68", + X"A7",X"83",X"5C",X"A7",X"80",X"7A",X"59",X"97",X"9A",X"5D",X"7A",X"AD",X"66",X"72",X"A1",X"80", + X"70",X"62",X"A7",X"85",X"7B",X"5F",X"7E",X"9D",X"8E",X"73",X"5F",X"93",X"9D",X"63",X"6D",X"AA", + X"7B",X"89",X"5B",X"7F",X"A0",X"84",X"64",X"78",X"A5",X"7A",X"75",X"5E",X"9C",X"93",X"7F",X"7C", + X"58",X"A0",X"8D",X"80",X"61",X"77",X"9D",X"91",X"65",X"71",X"A4",X"80",X"76",X"5E",X"A4",X"89", + X"7C",X"62",X"78",X"9D",X"8D",X"7D",X"6C",X"68",X"B0",X"69",X"78",X"A3",X"54",X"9F",X"8A",X"79", + X"63",X"7A",X"9E",X"8D",X"64",X"71",X"AD",X"6D",X"6D",X"9D",X"86",X"6F",X"68",X"82",X"A8",X"6A", + X"74",X"A2",X"7A",X"73",X"61",X"B1",X"66",X"73",X"A8",X"5C",X"7D",X"A7",X"6C",X"6C",X"AA",X"56", + X"97",X"89",X"55",X"A7",X"85",X"85",X"6E",X"66",X"A6",X"82",X"82",X"5F",X"81",X"A5",X"55",X"8A", + X"9C",X"7C",X"81",X"5B",X"8A",X"9F",X"5E",X"7E",X"A9",X"5D",X"79",X"9E",X"87",X"61",X"76",X"9E", + X"8C",X"65",X"72",X"A2",X"83",X"78",X"60",X"A2",X"86",X"7C",X"5E",X"9B",X"8C",X"56",X"AD",X"66", + X"71",X"A3",X"81",X"82",X"66",X"74",X"AE",X"5E",X"82",X"9B",X"58",X"8E",X"9E",X"63",X"72",X"A1", + X"84",X"72",X"62",X"9F",X"8B",X"81",X"73",X"65",X"89",X"9D",X"7F",X"84",X"5E",X"84",X"9E",X"7C", + X"7B",X"5E",X"8B",X"96",X"8C",X"56",X"96",X"90",X"80",X"66",X"74",X"9A",X"92",X"61",X"78",X"9E", + X"87",X"69",X"72",X"A2",X"7F",X"76",X"63",X"8B",X"9A",X"83",X"5B",X"8F",X"98",X"7B",X"7F",X"5B", + X"92",X"98",X"5A",X"9D",X"86",X"81",X"62",X"80",X"A0",X"7B",X"76",X"61",X"9A",X"91",X"80",X"7B", + X"5E",X"91",X"96",X"7F",X"6E",X"69",X"99",X"94",X"64",X"75",X"A6",X"74",X"64",X"8F",X"9D",X"65", + X"72",X"A1",X"83",X"74",X"62",X"9F",X"89",X"82",X"72",X"67",X"88",X"9D",X"7A",X"62",X"AC",X"5A", + X"8F",X"90",X"7F",X"6E",X"6B",X"8E",X"9D",X"61",X"86",X"9B",X"56",X"9D",X"88",X"7C",X"64",X"7B", + X"99",X"8E",X"5E",X"7F",X"9F",X"7F",X"83",X"63",X"7D",X"A5",X"6A",X"6C",X"99",X"8F",X"57",X"A1", + X"7C",X"68",X"9C",X"86",X"6B",X"72",X"A2",X"7B",X"81",X"5C",X"98",X"90",X"77",X"61",X"A5",X"71", + X"6B",X"A0",X"87",X"73",X"68",X"A2",X"80",X"80",X"63",X"7D",X"9E",X"81",X"60",X"A2",X"77",X"69", + X"A8",X"6B",X"6D",X"9D",X"83",X"7E",X"65",X"7C",X"9D",X"86",X"62",X"80",X"A1",X"6F",X"68",X"A0", + X"83",X"84",X"6C",X"6E",X"92",X"9A",X"5D",X"8C",X"8F",X"5F",X"A1",X"7F",X"7F",X"65",X"7B",X"98", + X"8C",X"61",X"7C",X"A1",X"78",X"66",X"A3",X"68",X"75",X"A3",X"7A",X"87",X"69",X"70",X"8E",X"97", + X"7C",X"62",X"93",X"90",X"79",X"6B",X"74",X"A0",X"83",X"63",X"87",X"9E",X"6D",X"70",X"A1",X"60", + X"8E",X"91",X"7A",X"73",X"68",X"97",X"8E",X"84",X"73",X"68",X"8D",X"9A",X"75",X"66",X"9E",X"7F", + X"60",X"9A",X"8E",X"61",X"8D",X"92",X"57",X"96",X"8E",X"81",X"79",X"65",X"9C",X"87",X"7A",X"67", + X"80",X"9E",X"7D",X"85",X"64",X"7B",X"9B",X"85",X"72",X"68",X"98",X"8F",X"74",X"66",X"9A",X"89", + X"5D",X"8D",X"96",X"7C",X"60",X"A1",X"7C",X"69",X"9D",X"81",X"78",X"65",X"A2",X"78",X"69",X"A8", + X"62",X"83",X"95",X"7E",X"76",X"67",X"8B",X"97",X"7B",X"61",X"A7",X"6B",X"76",X"9C",X"7F",X"77", + X"66",X"91",X"95",X"77",X"64",X"98",X"8E",X"64",X"7B",X"9D",X"7F",X"61",X"94",X"8F",X"7C",X"66", + X"82",X"9D",X"7A",X"87",X"66",X"7A",X"A0",X"6E",X"6D",X"A0",X"7F",X"84",X"71",X"6B",X"9E",X"83", + X"7E",X"62",X"90",X"92",X"7B",X"79",X"62",X"A4",X"79",X"70",X"99",X"84",X"62",X"8B",X"92",X"7F", + X"74",X"6B",X"8A",X"99",X"75",X"68",X"99",X"8C",X"68",X"77",X"9D",X"7D",X"83",X"6F",X"6D",X"91", + X"91",X"83",X"6F",X"6E",X"99",X"8C",X"69",X"76",X"9F",X"79",X"68",X"A1",X"70",X"6D",X"9B",X"86", + X"60",X"9C",X"7C",X"6A",X"9F",X"7B",X"84",X"65",X"81",X"A0",X"61",X"89",X"91",X"7D",X"7B",X"65", + X"8D",X"95",X"7E",X"83",X"70",X"6D",X"A3",X"73",X"70",X"A1",X"67",X"7F",X"9C",X"5A",X"98",X"7F", + X"6B",X"A0",X"78",X"87",X"60",X"8A",X"95",X"7C",X"81",X"61",X"94",X"8E",X"7F",X"7A",X"67",X"88", + X"93",X"88",X"6F",X"71",X"A0",X"67",X"78",X"98",X"88",X"6D",X"72",X"9E",X"7E",X"83",X"78",X"67", + X"8D",X"92",X"82",X"63",X"8F",X"8F",X"7D",X"7A",X"66",X"8F",X"93",X"7B",X"66",X"A3",X"6B",X"7B", + X"97",X"7E",X"74",X"6B",X"9B",X"86",X"7F",X"80",X"66",X"82",X"95",X"87",X"62",X"88",X"95",X"7D", + X"82",X"6B",X"77",X"99",X"86",X"66",X"91",X"8C",X"74",X"6C",X"98",X"85",X"7B",X"66",X"97",X"87", + X"80",X"74",X"6D",X"8C",X"96",X"73",X"70",X"A1",X"64",X"7A",X"93",X"8D",X"64",X"80",X"96",X"82", + X"6F",X"71",X"99",X"87",X"65",X"82",X"98",X"7F",X"82",X"71",X"6F",X"92",X"8D",X"83",X"6E",X"73", + X"95",X"8C",X"6E",X"74",X"9A",X"7E",X"82",X"69",X"7E",X"9F",X"62",X"88",X"91",X"64",X"8F",X"8F", + X"65",X"7E",X"96",X"83",X"63",X"8D",X"90",X"7F",X"7D",X"67",X"98",X"85",X"7E",X"66",X"92",X"8B", + X"7C",X"6C",X"7C",X"9B",X"7C",X"69",X"94",X"86",X"7F",X"72",X"6F",X"8F",X"91",X"78",X"68",X"97", + X"89",X"7B",X"67",X"97",X"86",X"80",X"74",X"6C",X"94",X"8C",X"7E",X"82",X"6B",X"7C",X"9F",X"67", + X"82",X"96",X"6A",X"77",X"9A",X"7E",X"83",X"78",X"69",X"98",X"86",X"81",X"74",X"6D",X"8C",X"91", + X"81",X"7A",X"69",X"99",X"80",X"65",X"90",X"8F",X"7D",X"66",X"96",X"87",X"7F",X"67",X"8D",X"8F", + X"61",X"98",X"7F",X"67",X"8E",X"90",X"7D",X"82",X"69",X"7D",X"96",X"86",X"6A",X"7D",X"9D",X"6F", + X"76",X"99",X"6E",X"71",X"99",X"83",X"83",X"71",X"71",X"8F",X"91",X"71",X"72",X"9A",X"7D",X"84", + X"6A",X"7A",X"8C",X"94",X"6B",X"7D",X"94",X"7F",X"6D",X"79",X"97",X"84",X"67",X"85",X"93",X"81", + X"73",X"74",X"9B",X"7A",X"84",X"68",X"80",X"97",X"7E",X"83",X"69",X"82",X"99",X"69",X"82",X"97", + X"65",X"87",X"91",X"63",X"93",X"86",X"7F",X"76",X"6C",X"94",X"89",X"82",X"6D",X"78",X"96",X"86", + X"69",X"80",X"97",X"79",X"6D",X"97",X"7D",X"6A",X"9A",X"76",X"6D",X"98",X"83",X"81",X"7D",X"6C", + X"80",X"93",X"87",X"65",X"96",X"83",X"81",X"78",X"6B",X"99",X"82",X"82",X"73",X"70",X"91",X"8D", + X"7C",X"84",X"69",X"80",X"97",X"7B",X"85",X"6C",X"79",X"92",X"8B",X"73",X"71",X"9B",X"75",X"6E", + X"91",X"8E",X"70",X"73",X"97",X"84",X"6B",X"80",X"98",X"77",X"70",X"95",X"7F",X"67",X"93",X"89", + X"7F",X"7E",X"6B",X"83",X"95",X"7F",X"82",X"78",X"6C",X"98",X"83",X"81",X"79",X"6B",X"96",X"84", + X"67",X"95",X"84",X"68",X"8E",X"8F",X"71",X"72",X"8F",X"8F",X"6B",X"80",X"93",X"7A",X"6B",X"91", + X"87",X"65",X"90",X"8D",X"74",X"6E",X"93",X"89",X"7D",X"82",X"6B",X"7E",X"93",X"87",X"6B",X"7F", + X"97",X"7A",X"86",X"6B",X"7E",X"95",X"7D",X"83",X"71",X"74",X"93",X"88",X"7F",X"7E",X"69",X"96", + X"83",X"81",X"79",X"6C",X"8B",X"90",X"7D",X"83",X"77",X"6E",X"8A",X"92",X"77",X"71",X"98",X"78", + X"6F",X"9B",X"6E",X"7D",X"94",X"7A",X"83",X"65",X"93",X"88",X"81",X"78",X"6F",X"86",X"96",X"71", + X"79",X"94",X"7D",X"80",X"6C",X"7E",X"91",X"87",X"7E",X"80",X"6B",X"80",X"8F",X"8B",X"6B",X"7D", + X"95",X"7D",X"83",X"72",X"73",X"92",X"88",X"80",X"6E",X"7C",X"95",X"80",X"6D",X"7F",X"95",X"7D", + X"83",X"77",X"6E",X"92",X"88",X"7F",X"6F",X"7A",X"96",X"7F",X"6E",X"80",X"99",X"6B",X"7F",X"90", + X"80",X"75",X"72",X"94",X"87",X"75",X"72",X"99",X"78",X"6F",X"8C",X"8F",X"6C",X"7C",X"92",X"80", + X"78",X"6E",X"90",X"8C",X"72",X"73",X"96",X"81",X"81",X"6D",X"7F",X"95",X"7D",X"83",X"7B",X"6E", + X"83",X"93",X"7E",X"83",X"6A",X"88",X"90",X"66",X"8C",X"8D",X"69",X"86",X"92",X"7B",X"85",X"70", + X"76",X"8D",X"8E",X"70",X"78",X"96",X"7C",X"85",X"6F",X"79",X"98",X"74",X"71",X"90",X"89",X"7C", + X"83",X"6B",X"83",X"91",X"80",X"80",X"70",X"79",X"90",X"88",X"7E",X"81",X"6E",X"7D",X"98",X"71", + X"7B",X"93",X"7A",X"85",X"6B",X"80",X"92",X"81",X"80",X"71",X"79",X"99",X"74",X"78",X"93",X"7C", + X"83",X"70",X"78",X"8D",X"8B",X"7E",X"80",X"6C",X"82",X"90",X"84",X"6A",X"8B",X"8C",X"7D",X"81", + X"6B",X"8B",X"8F",X"6D",X"82",X"92",X"6C",X"7F",X"94",X"72",X"74",X"91",X"86",X"6D",X"82",X"93", + X"69",X"82",X"91",X"80",X"6E",X"81",X"94",X"77",X"73",X"93",X"7C",X"6F",X"97",X"78",X"71",X"8B", + X"8F",X"6C",X"82",X"8E",X"7D",X"81",X"6F",X"7C",X"8F",X"87",X"7E",X"80",X"6E",X"7E",X"8E",X"8A", + X"70",X"78",X"95",X"7D",X"84",X"78",X"71",X"87",X"91",X"79",X"70",X"91",X"85",X"7C",X"6F",X"8B", + X"8C",X"67",X"90",X"82",X"6F",X"91",X"84",X"76",X"72",X"8D",X"8D",X"70",X"7D",X"93",X"6F",X"7D", + X"95",X"68",X"88",X"8B",X"80",X"78",X"73",X"96",X"7D",X"84",X"73",X"75",X"93",X"83",X"81",X"77", + X"72",X"8E",X"8A",X"7E",X"80",X"6D",X"8C",X"8C",X"6A",X"83",X"8F",X"81",X"6D",X"85",X"8F",X"7E", + X"6D",X"88",X"8D",X"7F",X"6F",X"82",X"91",X"7D",X"6F",X"85",X"8F",X"7D",X"7D",X"6D",X"90",X"88", + X"7C",X"6E",X"94",X"80",X"70",X"8E",X"87",X"76",X"74",X"92",X"81",X"7D",X"6D",X"8F",X"87",X"7F", + X"71",X"7C",X"92",X"81",X"73",X"7A",X"95",X"7C",X"84",X"7B",X"6F",X"8D",X"8A",X"7B",X"71",X"82", + X"92",X"79",X"73",X"91",X"7E",X"6D",X"8D",X"89",X"7D",X"83",X"6D",X"84",X"8F",X"7D",X"83",X"70", + X"7B",X"8B",X"8B",X"7B",X"85",X"71",X"7A",X"93",X"7E",X"82",X"75",X"75",X"89",X"8D",X"7D",X"6D", + X"90",X"85",X"81",X"79",X"71",X"8D",X"8A",X"79",X"72",X"91",X"83",X"7D",X"6F",X"86",X"8E",X"7D", + X"70",X"85",X"90",X"7A",X"86",X"74",X"76",X"91",X"82",X"81",X"79",X"72",X"87",X"8D",X"80",X"6D", + X"86",X"8E",X"7E",X"82",X"76",X"74",X"89",X"8B",X"82",X"72",X"7F",X"94",X"6F",X"80",X"8D",X"7E", + X"73",X"7B",X"92",X"7F",X"71",X"8A",X"89",X"6A",X"89",X"8B",X"81",X"71",X"7F",X"91",X"7C",X"84", + X"79",X"72",X"8D",X"89",X"6C",X"8C",X"86",X"7F",X"7C",X"71",X"83",X"8D",X"83",X"7E",X"81",X"6E", + X"83",X"8D",X"85",X"71",X"7C",X"91",X"7E",X"82",X"7D",X"70",X"88",X"8D",X"7D",X"83",X"6E",X"84", + X"8F",X"7C",X"83",X"70",X"7E",X"90",X"7F",X"82",X"76",X"76",X"93",X"7E",X"83",X"7A",X"72",X"8D", + X"89",X"76",X"75",X"92",X"7F",X"83",X"76",X"76",X"92",X"7F",X"6F",X"8A",X"8A",X"7D",X"72",X"83", + X"90",X"79",X"75",X"8A",X"87",X"6B",X"89",X"89",X"7F",X"7F",X"71",X"81",X"93",X"70",X"7E",X"8E", + X"80",X"79",X"73",X"8E",X"88",X"79",X"72",X"8E",X"86",X"7B",X"72",X"8E",X"85",X"6E",X"8E",X"84", + X"6F",X"85",X"8E",X"78",X"74",X"91",X"7C",X"71",X"94",X"7A",X"73",X"8A",X"8C",X"76",X"76",X"8F", + X"84",X"7D",X"83",X"6E",X"86",X"8B",X"81",X"71",X"83",X"8D",X"7E",X"78",X"75",X"92",X"81",X"81", + X"7D",X"72",X"82",X"8E",X"80",X"80",X"7E",X"70",X"85",X"8C",X"83",X"70",X"80",X"8E",X"7F",X"72", + X"81",X"90",X"7A",X"86",X"72",X"7D",X"90",X"77",X"74",X"8C",X"88",X"7D",X"83",X"75",X"78",X"8C", + X"88",X"7D",X"83",X"74",X"79",X"8F",X"83",X"6F",X"87",X"8C",X"79",X"73",X"8A",X"89",X"7D",X"83", + X"76",X"76",X"8C",X"87",X"7F",X"7D",X"70",X"8C",X"87",X"80",X"71",X"84",X"8D",X"7C",X"73",X"8C", + X"83",X"6E",X"89",X"8A",X"7C",X"73",X"90",X"7E",X"83",X"70",X"84",X"8C",X"7E",X"78",X"78",X"93", + X"7A",X"73",X"8A",X"89",X"7C",X"84",X"77",X"76",X"90",X"81",X"81",X"7A",X"73",X"8B",X"89",X"71", + X"7E",X"8F",X"7E",X"71",X"8B",X"86",X"7F",X"7E",X"70",X"8D",X"87",X"72",X"7D",X"8E",X"82",X"73", + X"7E",X"8F",X"7F",X"82",X"7D",X"72",X"88",X"8C",X"6F",X"86",X"89",X"7D",X"81",X"70",X"83",X"8C", + X"82",X"70",X"83",X"8C",X"81",X"72",X"80",X"8E",X"7D",X"83",X"7A",X"74",X"86",X"8C",X"7C",X"72", + X"87",X"8B",X"7D",X"83",X"78",X"76",X"8F",X"82",X"71",X"8D",X"82",X"80",X"7E",X"72",X"83",X"8D", + X"7E",X"83",X"74",X"7E",X"8F",X"7B",X"85",X"74",X"7B",X"8F",X"7F",X"81",X"7B",X"73",X"87",X"8A", + X"80",X"72",X"8B",X"84",X"7E",X"80",X"70",X"8B",X"87",X"7E",X"82",X"73",X"7D",X"8C",X"86",X"77", + X"79",X"91",X"79",X"77",X"90",X"7A",X"77",X"90",X"79",X"75",X"8B",X"87",X"77",X"79",X"91",X"74", + X"7D",X"8C",X"7F",X"72",X"85",X"8B",X"7D",X"72",X"87",X"89",X"7F",X"7B",X"74",X"8D",X"86",X"76", + X"7A",X"91",X"74",X"7A",X"8B",X"86",X"78",X"77",X"8E",X"82",X"7F",X"81",X"73",X"7E",X"8C",X"84", + X"76",X"7B",X"91",X"77",X"77",X"8A",X"87",X"76",X"79",X"8B",X"86",X"75",X"7B",X"8B",X"85",X"72", + X"83",X"89",X"7E",X"7E",X"73",X"8F",X"80",X"73",X"83",X"8D",X"7D",X"84",X"73",X"7E",X"8B",X"84", + X"74",X"7D",X"8C",X"82",X"74",X"7F",X"8D",X"80",X"7B",X"74",X"8D",X"84",X"79",X"76",X"8F",X"80", + X"82",X"72",X"85",X"8A",X"7C",X"82",X"71",X"85",X"8A",X"7F",X"81",X"76",X"7B",X"8F",X"7F",X"83", + X"75",X"7B",X"89",X"89",X"73",X"81",X"8B",X"7C",X"84",X"74",X"7D",X"8C",X"81",X"71",X"89",X"87", + X"80",X"72",X"88",X"87",X"7F",X"75",X"82",X"8C",X"7B",X"84",X"73",X"7F",X"8E",X"7A",X"76",X"8D", + X"81",X"7E",X"74",X"8C",X"84",X"71",X"85",X"8A",X"7E",X"74",X"86",X"8A",X"7B",X"75",X"8A",X"85", + X"71",X"8B",X"83",X"73",X"89",X"85",X"7B",X"75",X"87",X"8A",X"79",X"76",X"8C",X"83",X"7F",X"80", + X"73",X"81",X"89",X"86",X"73",X"7D",X"8B",X"84",X"7A",X"76",X"8C",X"83",X"7F",X"75",X"81",X"8D", + X"7D",X"84",X"77",X"7A",X"8E",X"7B",X"75",X"8D",X"80",X"81",X"7B",X"75",X"8C",X"84",X"7F",X"73", + X"87",X"88",X"7D",X"82",X"75",X"7D",X"8D",X"7F",X"74",X"8D",X"7E",X"75",X"8D",X"7E",X"74",X"88", + X"88",X"7A",X"78",X"8D",X"7C",X"75",X"87",X"89",X"7A",X"76",X"88",X"89",X"77",X"7A",X"8E",X"7C", + X"74",X"8A",X"85",X"7E",X"82",X"76",X"7B",X"89",X"87",X"72",X"88",X"85",X"7E",X"81",X"74",X"7F", + X"88",X"87",X"75",X"7E",X"8E",X"77",X"79",X"8A",X"85",X"77",X"7A",X"8B",X"83",X"76",X"7F",X"8C", + X"73",X"7E",X"8B",X"82",X"75",X"7E",X"8C",X"7F",X"77",X"7C",X"8D",X"80",X"75",X"86",X"87",X"73", + X"7F",X"8B",X"80",X"7F",X"74",X"89",X"85",X"72",X"89",X"85",X"73",X"88",X"85",X"7D",X"82",X"71", + X"8A",X"84",X"83",X"74",X"82",X"89",X"81",X"78",X"7D",X"8C",X"7F",X"7C",X"76",X"8A",X"86",X"7B", + X"77",X"8C",X"81",X"80",X"7E",X"74",X"86",X"88",X"82",X"7A",X"78",X"8B",X"83",X"7E",X"82",X"77", + X"7B",X"88",X"87",X"7A",X"77",X"86",X"89",X"78",X"7A",X"8C",X"7F",X"81",X"79",X"78",X"87",X"87", + X"81",X"76",X"80",X"8D",X"74",X"81",X"89",X"7D",X"83",X"76",X"7D",X"8B",X"81",X"73",X"87",X"88", + X"7D",X"76",X"8D",X"7D",X"77",X"8A",X"82",X"7A",X"78",X"89",X"86",X"76",X"7C",X"8B",X"81",X"7D", + X"75",X"8B",X"82",X"74",X"8A",X"82",X"74",X"8B",X"81",X"80",X"7E",X"75",X"85",X"8A",X"77",X"7B", + X"8A",X"83",X"77",X"7C",X"8B",X"81",X"77",X"7D",X"8D",X"7D",X"83",X"7A",X"78",X"89",X"86",X"7D", + X"83",X"79",X"79",X"8A",X"84",X"75",X"80",X"8A",X"80",X"7B",X"78",X"8E",X"7C",X"78",X"8B",X"7F", + X"81",X"7C",X"76",X"86",X"87",X"80",X"74",X"85",X"88",X"7B",X"76",X"8C",X"81",X"82",X"78",X"7C", + X"8A",X"80",X"7B",X"78",X"8C",X"80",X"7E",X"75",X"87",X"87",X"7D",X"76",X"86",X"88",X"7B",X"77", + X"87",X"87",X"79",X"7A",X"8C",X"7B",X"78",X"8C",X"80",X"81",X"7D",X"76",X"85",X"88",X"80",X"7E", + X"76",X"86",X"88",X"7D",X"76",X"84",X"89",X"7B",X"79",X"89",X"81",X"80",X"7B",X"77",X"89",X"84", + X"80",X"7F",X"75",X"88",X"84",X"7F",X"77",X"7F",X"8B",X"80",X"78",X"7E",X"8C",X"7B",X"79",X"88", + X"83",X"77",X"7F",X"8C",X"76",X"7F",X"89",X"7F",X"78",X"7C",X"8B",X"81",X"76",X"83",X"8A",X"74", + X"83",X"88",X"75",X"82",X"89",X"74",X"81",X"89",X"7D",X"83",X"77",X"7C",X"8C",X"7E",X"76",X"88", + X"86",X"7E",X"83",X"7A",X"79",X"83",X"89",X"7F",X"76",X"88",X"85",X"74",X"84",X"89",X"75",X"82", + X"88",X"7D",X"83",X"75",X"80",X"88",X"82",X"7A",X"7B",X"8B",X"7E",X"82",X"7B",X"78",X"88",X"86", + X"76",X"83",X"88",X"74",X"83",X"88",X"7E",X"76",X"85",X"87",X"7E",X"82",X"7C",X"78",X"83",X"87", + X"83",X"76",X"80",X"89",X"80",X"77",X"81",X"8A",X"7E",X"81",X"7E",X"77",X"81",X"89",X"81",X"78", + X"7C",X"8B",X"80",X"82",X"74",X"86",X"85",X"80",X"77",X"82",X"88",X"7F",X"7A",X"7B",X"8C",X"7E", + X"82",X"7B",X"78",X"87",X"86",X"7E",X"82",X"76",X"81",X"8A",X"7A",X"79",X"87",X"86",X"7A",X"79", + X"89",X"83",X"7F",X"81",X"76",X"83",X"89",X"78",X"7C",X"89",X"82",X"78",X"7C",X"8B",X"7F",X"81", + X"7C",X"77",X"87",X"85",X"7E",X"81",X"77",X"7E",X"8A",X"80",X"81",X"7F",X"77",X"81",X"89",X"80", + X"80",X"7F",X"76",X"84",X"88",X"7E",X"82",X"79",X"7B",X"87",X"86",X"7C",X"79",X"88",X"83",X"76", + X"81",X"88",X"80",X"77",X"81",X"89",X"7D",X"78",X"86",X"84",X"76",X"81",X"88",X"80",X"77",X"85", + X"86",X"76",X"7E",X"89",X"81",X"78",X"7F",X"8A",X"7E",X"78",X"89",X"81",X"80",X"7E",X"77",X"82", + X"87",X"82",X"7F",X"81",X"78",X"7D",X"88",X"83",X"7F",X"77",X"86",X"85",X"7E",X"82",X"76",X"80", + X"88",X"82",X"7E",X"77",X"86",X"85",X"7F",X"77",X"86",X"85",X"7F",X"78",X"81",X"8A",X"75",X"83", + X"87",X"77",X"7F",X"8A",X"79",X"7B",X"88",X"84",X"76",X"84",X"85",X"7E",X"78",X"82",X"88",X"7F", + X"78",X"84",X"87",X"76",X"7F",X"88",X"82",X"7E",X"82",X"77",X"7F",X"89",X"7E",X"82",X"7B",X"7A", + X"87",X"85",X"76",X"81",X"88",X"80",X"77",X"81",X"88",X"7E",X"82",X"7E",X"78",X"82",X"87",X"81", + X"77",X"80",X"88",X"7F",X"78",X"81",X"89",X"7E",X"82",X"7E",X"78",X"82",X"88",X"81",X"78",X"7F", + X"89",X"7E",X"82",X"7E",X"78",X"83",X"88",X"7A",X"7B",X"88",X"81",X"7E",X"77",X"87",X"84",X"7F", + X"78",X"82",X"89",X"75",X"84",X"85",X"7F",X"81",X"78",X"7E",X"8A",X"7E",X"79",X"89",X"80",X"81", + X"7D",X"78",X"85",X"86",X"81",X"76",X"86",X"84",X"80",X"79",X"7E",X"88",X"81",X"79",X"7D",X"8A", + X"7E",X"82",X"7E",X"7A",X"7D",X"88",X"82",X"81",X"79",X"7F",X"8A",X"79",X"7B",X"88",X"82",X"7F", + X"7F",X"77",X"85",X"86",X"7F",X"78",X"82",X"88",X"7F",X"82",X"7B",X"7A",X"86",X"85",X"7F",X"81", + X"77",X"82",X"87",X"80",X"78",X"83",X"86",X"7D",X"83",X"77",X"81",X"88",X"7F",X"82",X"7B",X"7A", + X"88",X"83",X"77",X"83",X"87",X"78",X"7E",X"88",X"80",X"80",X"7F",X"79",X"7D",X"87",X"83",X"80", + X"77",X"83",X"85",X"7F",X"7A",X"7C",X"89",X"81",X"7A",X"7D",X"8A",X"7A",X"7B",X"86",X"84",X"7A", + X"7C",X"89",X"7F",X"82",X"7C",X"7A",X"88",X"81",X"77",X"85",X"86",X"77",X"84",X"85",X"77",X"81", + X"88",X"78",X"7D",X"87",X"82",X"78",X"81",X"87",X"7A",X"7C",X"89",X"7D",X"79",X"87",X"83",X"7A", + X"7C",X"88",X"82",X"7A",X"7D",X"88",X"80",X"78",X"86",X"83",X"76",X"84",X"86",X"7E",X"78",X"86", + X"83",X"7E",X"81",X"77",X"81",X"86",X"83",X"79",X"7E",X"88",X"7F",X"81",X"7D",X"79",X"86",X"84", + X"7E",X"82",X"77",X"81",X"86",X"82",X"78",X"82",X"86",X"80",X"7D",X"7A",X"89",X"80",X"7F",X"78", + X"88",X"81",X"78",X"87",X"81",X"7F",X"81",X"78",X"82",X"88",X"79",X"7F",X"88",X"7B",X"7B",X"85", + X"85",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"79",X"84",X"85",X"80",X"80",X"78",X"86",X"84",X"77", + X"81",X"87",X"7E",X"82",X"7A",X"7D",X"89",X"7E",X"82",X"7D",X"7A",X"82",X"87",X"7F",X"81",X"7F", + X"79",X"83",X"87",X"7A",X"7C",X"87",X"81",X"7E",X"79",X"85",X"85",X"7E",X"79",X"84",X"86",X"79", + X"7E",X"88",X"7B",X"7B",X"86",X"83",X"7F",X"82",X"79",X"7E",X"87",X"81",X"7D",X"79",X"86",X"84", + X"7F",X"79",X"84",X"85",X"77",X"85",X"84",X"7F",X"81",X"7A",X"7D",X"86",X"83",X"7E",X"82",X"7B", + X"7C",X"87",X"81",X"78",X"81",X"86",X"7F",X"79",X"82",X"86",X"7E",X"79",X"81",X"87",X"7E",X"79", + X"87",X"82",X"7F",X"80",X"78",X"84",X"85",X"7C",X"7B",X"87",X"81",X"80",X"78",X"86",X"83",X"80", + X"7B",X"7C",X"88",X"81",X"7C",X"7C",X"89",X"7B",X"7B",X"85",X"84",X"7B",X"7B",X"85",X"84",X"7C", + X"7A",X"86",X"84",X"7C",X"7B",X"87",X"82",X"7F",X"79",X"85",X"84",X"78",X"84",X"84",X"7A",X"7E", + X"87",X"81",X"7A",X"81",X"86",X"7A",X"7C",X"87",X"81",X"7F",X"81",X"7A",X"7F",X"88",X"7E",X"7A", + X"85",X"83",X"7A",X"7E",X"88",X"7B",X"7D",X"88",X"7D",X"7B",X"87",X"80",X"79",X"84",X"84",X"7E", + X"82",X"79",X"7F",X"87",X"80",X"80",X"79",X"83",X"86",X"7F",X"79",X"83",X"85",X"78",X"80",X"87", + X"7F",X"81",X"7A",X"7F",X"88",X"7A",X"7E",X"87",X"7F",X"81",X"7D",X"7A",X"84",X"85",X"7F",X"79", + X"81",X"87",X"7E",X"82",X"7B",X"7E",X"87",X"7E",X"79",X"84",X"85",X"7E",X"82",X"7C",X"7B",X"84", + X"86",X"78",X"83",X"84",X"80",X"7A",X"7E",X"86",X"82",X"7A",X"7E",X"87",X"81",X"7A",X"7F",X"87", + X"80",X"7E",X"79",X"86",X"83",X"7F",X"81",X"79",X"81",X"86",X"7E",X"82",X"7B",X"7D",X"87",X"80", + X"81",X"7F",X"7A",X"81",X"87",X"7C",X"7B",X"86",X"82",X"7C",X"7B",X"86",X"83",X"7D",X"7A",X"88", + X"7E",X"7B",X"85",X"82",X"7B",X"7D",X"87",X"80",X"7E",X"7A",X"85",X"84",X"7E",X"7A",X"85",X"84", + X"7E",X"7A",X"84",X"84",X"7E",X"82",X"79",X"80",X"86",X"7E",X"7A",X"85",X"83",X"7F",X"80",X"79", + X"85",X"84",X"79",X"82",X"86",X"79",X"81",X"86",X"7B",X"7D",X"87",X"7F",X"79",X"86",X"81",X"79", + X"85",X"83",X"79",X"82",X"85",X"78",X"82",X"85",X"7F",X"81",X"7B",X"7D",X"87",X"80",X"80",X"7F", + X"7A",X"83",X"86",X"7B",X"7D",X"86",X"81",X"7B",X"7D",X"86",X"82",X"7C",X"7D",X"88",X"7D",X"7B", + X"83",X"85",X"7E",X"7A",X"83",X"85",X"7C",X"7C",X"86",X"80",X"7F",X"7A",X"85",X"83",X"79",X"85", + X"83",X"7A",X"81",X"86",X"79",X"80",X"85",X"81",X"7E",X"7B",X"87",X"80",X"81",X"7E",X"7B",X"83", + X"86",X"79",X"81",X"84",X"80",X"7B",X"80",X"86",X"7F",X"7D",X"7D",X"88",X"7E",X"82",X"7C",X"7C", + X"85",X"83",X"79",X"81",X"86",X"7F",X"7A",X"82",X"86",X"79",X"80",X"85",X"81",X"7A",X"7F",X"86", + X"81",X"7B",X"7E",X"87",X"7F",X"80",X"80",X"7B",X"80",X"87",X"7E",X"7A",X"85",X"83",X"7F",X"7A", + X"84",X"84",X"7F",X"7C",X"7E",X"87",X"7E",X"82",X"7D",X"7B",X"85",X"81",X"7F",X"7A",X"85",X"82", + X"7F",X"7B",X"80",X"86",X"80",X"7B",X"80",X"86",X"7F",X"80",X"80",X"7A",X"81",X"85",X"7F",X"7A", + X"82",X"85",X"80",X"7B",X"81",X"86",X"7C",X"7C",X"86",X"81",X"81",X"7C",X"7E",X"86",X"7F",X"80", + X"79",X"84",X"84",X"7F",X"80",X"7F",X"7A",X"83",X"84",X"7F",X"81",X"7B",X"7E",X"83",X"85",X"7D", + X"7C",X"86",X"81",X"7A",X"81",X"85",X"7F",X"7B",X"84",X"82",X"7F",X"81",X"7A",X"80",X"85",X"81", + X"7F",X"81",X"7D",X"7C",X"84",X"84",X"7F",X"7A",X"82",X"85",X"7F",X"81",X"7F",X"7A",X"84",X"83", + X"7F",X"80",X"7A",X"81",X"85",X"80",X"80",X"7D",X"7C",X"86",X"81",X"80",X"80",X"7A",X"85",X"82", + X"7F",X"81",X"7B",X"7E",X"85",X"82",X"7F",X"81",X"7B",X"7F",X"84",X"83",X"7C",X"7D",X"85",X"82", + X"7C",X"7E",X"86",X"7D",X"7C",X"85",X"82",X"7F",X"81",X"7E",X"7B",X"84",X"83",X"81",X"7C",X"7D", + X"87",X"7C",X"7E",X"86",X"7F",X"7B",X"86",X"80",X"81",X"7C",X"7E",X"86",X"7F",X"7B",X"83",X"84", + X"7F",X"80",X"7A",X"81",X"85",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"7E",X"7C",X"87",X"7E",X"7C", + X"85",X"80",X"7B",X"84",X"82",X"79",X"82",X"84",X"81",X"7A",X"81",X"85",X"80",X"7F",X"7B",X"86", + X"81",X"7A",X"83",X"84",X"7F",X"81",X"7F",X"7B",X"82",X"85",X"7B",X"7D",X"85",X"81",X"7F",X"81", + X"7D",X"7C",X"85",X"82",X"80",X"7A",X"83",X"83",X"80",X"7D",X"7D",X"86",X"80",X"7F",X"7B",X"84", + X"83",X"7F",X"81",X"7E",X"7C",X"83",X"84",X"7B",X"81",X"85",X"7C",X"7E",X"86",X"7C",X"7D",X"84", + X"84",X"7C",X"7E",X"85",X"80",X"7C",X"7D",X"85",X"81",X"7F",X"81",X"7C",X"7F",X"86",X"7F",X"81", + X"7F",X"7B",X"84",X"83",X"7C",X"7F",X"86",X"7B",X"7E",X"84",X"82",X"7D",X"7D",X"85",X"80",X"7F", + X"7B",X"86",X"80",X"80",X"7F",X"7B",X"82",X"85",X"7B",X"80",X"84",X"80",X"7D",X"7D",X"85",X"82", + X"7D",X"7D",X"85",X"81",X"7D",X"7D",X"84",X"82",X"7D",X"7E",X"86",X"7D",X"7C",X"84",X"82",X"7B", + X"80",X"85",X"7F",X"80",X"80",X"7B",X"81",X"85",X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"7B", + X"81",X"84",X"7F",X"7B",X"83",X"83",X"7F",X"81",X"7B",X"80",X"83",X"83",X"7D",X"7C",X"85",X"81", + X"7F",X"81",X"7D",X"7D",X"83",X"83",X"80",X"7B",X"83",X"83",X"80",X"7B",X"81",X"84",X"80",X"7C", + X"80",X"85",X"7B",X"7E",X"84",X"82",X"7F",X"82",X"7C",X"7E",X"85",X"80",X"80",X"7B",X"83",X"84", + X"7A",X"83",X"82",X"80",X"7C",X"81",X"85",X"7B",X"7F",X"84",X"80",X"7F",X"81",X"7C",X"7F",X"85", + X"7E",X"7C",X"83",X"84",X"7F",X"81",X"7B",X"80",X"84",X"7F",X"81",X"7D",X"7C",X"83",X"83",X"80", + X"7B",X"80",X"84",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F",X"7C",X"81",X"85",X"7B",X"7F",X"85", + X"7F",X"81",X"7D",X"7D",X"82",X"84",X"80",X"80",X"80",X"7B",X"82",X"83",X"7F",X"81",X"7D",X"7D", + X"85",X"80",X"80",X"80",X"7C",X"80",X"85",X"80",X"80",X"7F",X"7C",X"85",X"81",X"7B",X"82",X"83", + X"7A",X"82",X"83",X"7F",X"81",X"7B",X"80",X"85",X"7F",X"7C",X"84",X"82",X"7B",X"80",X"84",X"81", + X"7C",X"7F",X"85",X"7F",X"82",X"7D",X"7E",X"85",X"80",X"7B",X"82",X"83",X"7F",X"80",X"7B",X"85", + X"81",X"7B",X"81",X"84",X"80",X"7C",X"83",X"82",X"7B",X"80",X"84",X"80",X"81",X"7C",X"81",X"85", + X"7B",X"7F",X"85",X"7D",X"7D",X"84",X"81",X"80",X"81",X"7E",X"7C",X"83",X"83",X"7F",X"7C",X"81", + X"84",X"7F",X"81",X"7C",X"7F",X"85",X"7F",X"7C",X"82",X"83",X"7E",X"7C",X"82",X"84",X"7F",X"81", + X"7F",X"7C",X"81",X"84",X"80",X"80",X"81",X"7C",X"80",X"85",X"7F",X"7C",X"84",X"80",X"81",X"7C", + X"7F",X"84",X"81",X"7E",X"7D",X"84",X"82",X"7D",X"7D",X"84",X"81",X"7E",X"7C",X"84",X"81",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"7C",X"82",X"83",X"7F",X"7C",X"81",X"84",X"7F",X"81",X"7F", + X"7C",X"80",X"83",X"82",X"7D",X"7E",X"84",X"81",X"7F",X"81",X"7C",X"80",X"84",X"81",X"7D",X"7E", + X"84",X"80",X"7F",X"7C",X"83",X"83",X"7E",X"7D",X"84",X"81",X"7B",X"82",X"83",X"7F",X"7C",X"81", + X"83",X"80",X"7C",X"81",X"84",X"7F",X"80",X"80",X"7C",X"81",X"84",X"7D",X"7D",X"83",X"82",X"7F", + X"81",X"7D",X"7D",X"82",X"83",X"80",X"80",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"84",X"81", + X"7F",X"80",X"7B",X"82",X"83",X"80",X"7E",X"7D",X"85",X"80",X"80",X"7F",X"7C",X"83",X"82",X"7C", + X"81",X"84",X"7C",X"80",X"84",X"7D",X"7E",X"85",X"7F",X"7C",X"83",X"82",X"7F",X"81",X"7C",X"81", + X"84",X"80",X"80",X"80",X"7D",X"7F",X"83",X"82",X"7C",X"81",X"83",X"7F",X"81",X"7C",X"7F",X"83", + X"81",X"7F",X"81",X"7D",X"7E",X"85",X"80",X"80",X"7F",X"7C",X"82",X"83",X"7D",X"7E",X"83",X"82", + X"7E",X"7D",X"84",X"81",X"80",X"80",X"7C",X"81",X"84",X"80",X"81",X"7E",X"7D",X"84",X"82",X"7C", + X"82",X"83",X"7C",X"7F",X"84",X"80",X"80",X"81",X"7D",X"7E",X"83",X"82",X"80",X"80",X"7C",X"82", + X"83",X"7C",X"80",X"84",X"7D",X"7D",X"84",X"80",X"81",X"7C",X"82",X"83",X"7F",X"7E",X"7E",X"84", + X"80",X"80",X"80",X"7D",X"7E",X"85",X"80",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7F",X"7C",X"82", + X"83",X"7B",X"80",X"83",X"80",X"7D",X"7E",X"84",X"80",X"80",X"80",X"7D",X"7F",X"84",X"7F",X"7C", + X"84",X"81",X"80",X"7C",X"83",X"82",X"7C",X"82",X"82",X"7C",X"80",X"84",X"7D",X"7E",X"84",X"80", + X"80",X"80",X"7C",X"83",X"82",X"80",X"7E",X"7E",X"85",X"7E",X"7D",X"82",X"83",X"7E",X"7D",X"83", + X"80",X"7C",X"83",X"81",X"7C",X"83",X"81",X"80",X"80",X"7C",X"7F",X"82",X"82",X"7E",X"7D",X"83", + X"82",X"7E",X"7D",X"83",X"82",X"7E",X"7E",X"84",X"7F",X"7C",X"84",X"80",X"7C",X"83",X"81",X"7F", + X"80",X"7C",X"81",X"83",X"80",X"7F",X"7D",X"83",X"81",X"7C",X"81",X"83",X"7B",X"82",X"82",X"7F", + X"80",X"7C",X"82",X"82",X"80",X"7D",X"82",X"83",X"7B",X"82",X"82",X"80",X"7D",X"80",X"83",X"80", + X"7D",X"80",X"84",X"7F",X"81",X"7F",X"7D",X"82",X"83",X"80",X"7C",X"81",X"83",X"7F",X"7D",X"81", + X"84",X"7D",X"7F",X"84",X"7F",X"7D",X"84",X"80",X"81",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7E", + X"82",X"83",X"7F",X"81",X"7D",X"7F",X"83",X"81",X"7D",X"7F",X"84",X"80",X"7C",X"83",X"81",X"7C", + X"82",X"82",X"7C",X"80",X"83",X"80",X"80",X"80",X"7D",X"7E",X"83",X"81",X"80",X"80",X"7F",X"7D", + X"82",X"83",X"80",X"80",X"80",X"7C",X"81",X"83",X"7F",X"81",X"7E",X"7D",X"82",X"82",X"80",X"7E", + X"7D",X"84",X"81",X"80",X"80",X"7D",X"80",X"84",X"7E",X"7E",X"83",X"81",X"7F",X"7D",X"82",X"82", + X"7E",X"7E",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"7D",X"82",X"83",X"7F",X"7D",X"83",X"81",X"7C", + X"82",X"81",X"7F",X"81",X"7D",X"80",X"83",X"7F",X"7D",X"83",X"81",X"7F",X"81",X"7C",X"81",X"83", + X"7F",X"80",X"7F",X"7D",X"82",X"82",X"80",X"7D",X"80",X"83",X"80",X"7D",X"82",X"82",X"7F",X"81", + X"7D",X"7F",X"82",X"82",X"7D",X"81",X"83",X"7F",X"81",X"7D",X"7E",X"84",X"7F",X"7D",X"83",X"80", + X"7D",X"83",X"81",X"80",X"7E",X"7E",X"84",X"7E",X"7E",X"82",X"81",X"7D",X"80",X"83",X"81",X"7E", + X"7E",X"83",X"81",X"7D",X"80",X"83",X"7E",X"7E",X"83",X"81",X"80",X"80",X"7C",X"82",X"82",X"7E", + X"7E",X"83",X"81",X"7E",X"7E",X"83",X"80",X"80",X"7F",X"7D",X"83",X"80",X"80",X"7D",X"83",X"81", + X"80",X"7D",X"80",X"83",X"7F",X"81",X"7E",X"7F",X"83",X"7F",X"7D",X"83",X"80",X"7C",X"83",X"81", + X"7D",X"82",X"82",X"7C",X"81",X"82",X"80",X"7E",X"7F",X"83",X"81",X"7E",X"7F",X"83",X"80",X"80", + X"81",X"7D",X"7F",X"83",X"81",X"7D",X"80",X"83",X"80",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"7F", + X"83",X"80",X"7D",X"83",X"80",X"7F",X"7D",X"83",X"81",X"80",X"80",X"7D",X"81",X"83",X"80",X"7D", + X"83",X"81",X"80",X"80",X"7D",X"80",X"82",X"81",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81", + X"80",X"81",X"7E",X"7E",X"82",X"82",X"7F",X"7D",X"82",X"82",X"7C",X"81",X"82",X"81",X"7D",X"81", + X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"81",X"7E",X"7E", + X"83",X"81",X"7F",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82",X"82",X"7E",X"7E",X"83", + X"80",X"80",X"7E",X"7E",X"83",X"81",X"7F",X"7E",X"83",X"7F",X"7E",X"83",X"80",X"7D",X"81",X"83", + X"7F",X"80",X"80",X"7D",X"80",X"83",X"7D",X"7F",X"83",X"80",X"81",X"7E",X"7E",X"83",X"80",X"80", + X"80",X"7D",X"80",X"82",X"82",X"7D",X"80",X"82",X"80",X"7E",X"7E",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"80",X"80",X"7D",X"80",X"83",X"7F",X"7D",X"82",X"82",X"7F",X"81",X"7F",X"7E",X"82",X"81", + X"7D",X"81",X"82",X"7F",X"81",X"7D",X"80",X"82",X"81",X"7E",X"7F",X"83",X"81",X"7E",X"7E",X"83", + X"80",X"7D",X"81",X"82",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"7F",X"7D",X"81",X"83",X"7F", + X"7E",X"82",X"81",X"7D",X"81",X"82",X"7F",X"81",X"7D",X"81",X"82",X"7F",X"80",X"7E",X"7E",X"82", + X"82",X"80",X"80",X"7D",X"81",X"83",X"7E",X"7E",X"82",X"82",X"7E",X"7F",X"83",X"7F",X"7D",X"82", + X"82",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"80",X"82",X"80",X"7E",X"80",X"83",X"80", + X"7F",X"7E",X"83",X"81",X"80",X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"83",X"7F", + X"7E",X"83",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"80",X"7D",X"80",X"82", + X"80",X"7D",X"81",X"82",X"80",X"80",X"80",X"7D",X"80",X"82",X"80",X"7F",X"7E",X"83",X"7F",X"7E", + X"83",X"80",X"80",X"80",X"7D",X"81",X"82",X"81",X"7D",X"81",X"81",X"80",X"7E",X"7F",X"83",X"80", + X"7F",X"7E",X"83",X"80",X"80",X"80",X"7F",X"7E",X"82",X"82",X"80",X"80",X"80",X"7D",X"81",X"82", + X"7D",X"80",X"83",X"7F",X"7E",X"82",X"81",X"7D",X"80",X"82",X"80",X"7D",X"81",X"81",X"80",X"7D", + X"81",X"82",X"80",X"7E",X"7F",X"83",X"80",X"80",X"80",X"7E",X"7F",X"82",X"82",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"82",X"82",X"80",X"80",X"80",X"7E",X"80",X"82", + X"81",X"7E",X"81",X"82",X"7F",X"81",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"80",X"82",X"81", + X"7E",X"80",X"82",X"7F",X"81",X"7E",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E",X"80",X"82",X"80", + X"80",X"80",X"7D",X"82",X"81",X"80",X"80",X"7E",X"7F",X"82",X"81",X"80",X"80",X"7D",X"82",X"81", + X"7F",X"81",X"7E",X"7F",X"82",X"80",X"7D",X"81",X"82",X"80",X"7D",X"81",X"82",X"7F",X"80",X"7D", + X"81",X"82",X"7D",X"80",X"82",X"80",X"7E",X"81",X"82",X"7D",X"81",X"81",X"80",X"7D",X"81",X"82", + X"7F",X"80",X"7E",X"7F",X"82",X"81",X"7F",X"81",X"7D",X"81",X"82",X"7E",X"7F",X"82",X"81",X"7E", + X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E",X"81",X"82",X"80",X"80",X"80",X"7E", + X"7F",X"82",X"81",X"7E",X"81",X"82",X"7E",X"7F",X"82",X"80",X"80",X"7E",X"81",X"82",X"7F",X"80", + X"7E",X"80",X"81",X"82",X"7F",X"7E",X"82",X"81",X"7F",X"81",X"7F",X"7E",X"82",X"81",X"7E",X"80", + X"82",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"83",X"7F",X"7E",X"82",X"81",X"80",X"80",X"7F",X"7E", + X"82",X"81",X"80",X"7E",X"7F",X"82",X"81",X"7E",X"7F",X"82",X"80",X"7F",X"7F",X"83",X"7E",X"7F", + X"82",X"80",X"7F",X"7E",X"82",X"81",X"7F",X"7E",X"82",X"81",X"80",X"7E",X"81",X"81",X"80",X"7E", + X"80",X"82",X"80",X"7F",X"7E",X"83",X"80",X"80",X"80",X"7E",X"81",X"82",X"80",X"7E",X"7F",X"82", + X"80",X"7E",X"80",X"82",X"7E",X"7F",X"82",X"81",X"7F",X"7F",X"83",X"7E",X"7F",X"82",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/GAL_HIT.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/GAL_HIT.vhd new file mode 100644 index 00000000..7d2fd29c --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/GAL_HIT.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GAL_HIT 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 prom of GAL_HIT is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"65",X"75",X"88",X"90",X"93",X"9B",X"A3",X"A3",X"A3",X"A6",X"9E",X"9B",X"9B",X"A3",X"AB",X"B6", + X"B9",X"B9",X"BE",X"B9",X"AE",X"A6",X"9E",X"98",X"88",X"78",X"68",X"65",X"65",X"65",X"62",X"68", + X"68",X"65",X"5D",X"52",X"47",X"47",X"4A",X"4D",X"4D",X"4D",X"52",X"65",X"7D",X"88",X"90",X"9B", + X"A3",X"AE",X"AE",X"AB",X"AB",X"9E",X"98",X"88",X"70",X"52",X"37",X"1F",X"17",X"1F",X"27",X"3A", + X"5A",X"68",X"78",X"83",X"93",X"A3",X"AB",X"AE",X"A3",X"93",X"88",X"88",X"83",X"88",X"8B",X"88", + X"78",X"62",X"4A",X"42",X"3A",X"42",X"4D",X"55",X"65",X"78",X"83",X"8B",X"93",X"90",X"88",X"88", + X"98",X"A6",X"A6",X"AB",X"9E",X"8B",X"7D",X"68",X"70",X"88",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC", + X"FC",X"FC",X"DC",X"9B",X"4D",X"14",X"01",X"04",X"2F",X"52",X"5D",X"68",X"78",X"80",X"78",X"70", + X"5D",X"47",X"32",X"1F",X"14",X"09",X"11",X"1C",X"32",X"52",X"83",X"B9",X"D1",X"C9",X"AB",X"8B", + X"70",X"68",X"75",X"78",X"80",X"8B",X"8B",X"98",X"AB",X"BE",X"C1",X"AB",X"83",X"5D",X"3A",X"17", + X"11",X"17",X"27",X"3A",X"65",X"90",X"AE",X"B6",X"9B",X"78",X"55",X"4A",X"4D",X"5A",X"5D",X"52", + X"4A",X"4A",X"52",X"78",X"AB",X"D4",X"FC",X"FC",X"F7",X"E9",X"E1",X"D1",X"C9",X"BE",X"AB",X"90", + X"52",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"2F",X"4A",X"52",X"47",X"47",X"62",X"70",X"7D", + X"7D",X"78",X"7D",X"90",X"B3",X"CE",X"EC",X"FC",X"FC",X"FC",X"FC",X"F4",X"E9",X"F4",X"FC",X"FC", + X"FC",X"FC",X"CE",X"98",X"65",X"2C",X"01",X"01",X"01",X"01",X"01",X"32",X"6D",X"7D",X"68",X"4A", + X"27",X"11",X"1C",X"3A",X"4D",X"62",X"68",X"65",X"68",X"70",X"80",X"9B",X"D1",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"A3",X"75",X"55",X"62",X"80",X"A3",X"BE",X"CE",X"C1",X"90",X"4A",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"88",X"C9",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC", + X"B6",X"90",X"68",X"3F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1F",X"83",X"BE",X"D1",X"CE", + X"D4",X"F4",X"FC",X"FC",X"FC",X"F7",X"D1",X"CE",X"DC",X"F7",X"FC",X"FC",X"FC",X"FC",X"D1",X"8B", + X"68",X"68",X"88",X"A6",X"C1",X"D9",X"D4",X"BE",X"A3",X"88",X"75",X"68",X"62",X"5D",X"62",X"68", + X"6D",X"78",X"75",X"55",X"2C",X"11",X"11",X"2F",X"55",X"75",X"83",X"93",X"9E",X"B9",X"E9",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"BE",X"68",X"32",X"11",X"17",X"32",X"52",X"7D", + X"AE",X"E1",X"F7",X"E1",X"A3",X"62",X"17",X"01",X"01",X"01",X"01",X"01",X"1C",X"4D",X"7D",X"90", + X"9B",X"A6",X"B6",X"BE",X"A6",X"70",X"37",X"14",X"14",X"1C",X"14",X"1C",X"2F",X"3A",X"3A",X"3A", + X"4A",X"52",X"4A",X"47",X"3A",X"24",X"11",X"14",X"27",X"3A",X"65",X"9E",X"D4",X"FC",X"FC",X"F7", + X"D4",X"AB",X"93",X"93",X"93",X"83",X"68",X"4D",X"37",X"37",X"5D",X"9B",X"EC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"CE",X"AB",X"93",X"7D",X"65",X"65",X"75",X"88",X"93",X"98",X"98",X"93", + X"93",X"90",X"93",X"8B",X"90",X"90",X"90",X"8B",X"8B",X"90",X"8B",X"90",X"90",X"90",X"90",X"8B", + X"8B",X"8B",X"8B",X"8B",X"88",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"83",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"78",X"75",X"78",X"75",X"78", + X"78",X"78",X"75",X"78",X"75",X"70",X"75",X"75",X"75",X"75",X"70",X"6D",X"68",X"6D",X"70",X"6D", + X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"70",X"70",X"70",X"75",X"75",X"75",X"75", + X"75",X"70",X"62",X"4D",X"4D",X"4D",X"47",X"4A",X"68",X"98",X"B6",X"B3",X"9B",X"78",X"5A",X"3F", + X"32",X"2F",X"32",X"3F",X"5A",X"90",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"E9",X"90",X"4D",X"3A", + X"47",X"5D",X"5D",X"4D",X"3A",X"27",X"1C",X"14",X"11",X"0C",X"01",X"01",X"01",X"01",X"01",X"01", + X"04",X"4A",X"9E",X"F7",X"FC",X"FC",X"FC",X"FC",X"EC",X"E4",X"E4",X"D1",X"AB",X"80",X"62",X"47", + X"37",X"2F",X"2C",X"24",X"04",X"01",X"24",X"52",X"70",X"70",X"62",X"4D",X"3F",X"37",X"37",X"3A", + X"4D",X"62",X"78",X"93",X"AE",X"D1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"B6",X"68", + X"2C",X"01",X"01",X"01",X"01",X"01",X"01",X"09",X"47",X"65",X"68",X"68",X"62",X"5A",X"52",X"4D", + X"52",X"4D",X"52",X"52",X"5A",X"5D",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"65",X"37",X"1C", + X"09",X"09",X"1C",X"32",X"4D",X"70",X"93",X"AB",X"C9",X"D9",X"E9",X"EF",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"F7",X"6D",X"0C",X"01",X"01",X"01",X"01",X"01",X"17",X"62",X"83",X"78", + X"5A",X"37",X"14",X"04",X"01",X"01",X"01",X"01",X"04",X"11",X"1C",X"1C",X"01",X"01",X"0C",X"3F", + X"6D",X"7D",X"78",X"68",X"65",X"83",X"B3",X"E1",X"F4",X"E4",X"C6",X"A3",X"8B",X"75",X"68",X"65", + X"5D",X"62",X"65",X"62",X"5A",X"3F",X"27",X"17",X"1F",X"5A",X"9E",X"CE",X"D4",X"C9",X"AE",X"A6", + X"AE",X"AB",X"9B",X"83",X"80",X"98",X"9B",X"9B",X"9B",X"B6",X"D9",X"E4",X"E1",X"DC",X"E1",X"D4", + X"B3",X"83",X"5A",X"3A",X"1F",X"11",X"0C",X"11",X"14",X"1C",X"1F",X"2C",X"2C",X"1F",X"27",X"32", + X"3F",X"5D",X"83",X"9B",X"93",X"93",X"88",X"7D",X"7D",X"75",X"70",X"70",X"6D",X"68",X"68",X"68", + X"5A",X"5A",X"75",X"88",X"93",X"93",X"90",X"90",X"88",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"80", + X"7D",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80",X"83",X"83",X"80",X"80", + X"80",X"7D",X"7D",X"70",X"70",X"6D",X"75",X"83",X"90",X"93",X"90",X"88",X"88",X"80",X"78",X"7D", + X"70",X"68",X"70",X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"75",X"70",X"68",X"4D",X"3A", + X"4A",X"70",X"93",X"A3",X"B6",X"B9",X"B3",X"A3",X"90",X"80",X"75",X"70",X"68",X"68",X"68",X"65", + X"68",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"75",X"78", + X"78",X"78",X"78",X"78",X"78",X"78",X"70",X"55",X"37",X"1F",X"24",X"47",X"68",X"7D",X"88",X"8B", + X"88",X"88",X"88",X"8B",X"AB",X"CE",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"C9",X"AB",X"80",X"5A", + X"4A",X"47",X"37",X"2C",X"32",X"4D",X"70",X"78",X"7D",X"8B",X"90",X"88",X"68",X"4A",X"2C",X"1C", + X"11",X"09",X"01",X"01",X"01",X"01",X"14",X"27",X"47",X"70",X"AE",X"E1",X"F4",X"E4",X"D1",X"AE", + X"93",X"80",X"70",X"68",X"62",X"62",X"65",X"68",X"6D",X"75",X"78",X"78",X"65",X"4A",X"4D",X"5A", + X"62",X"65",X"68",X"88",X"B9",X"EC",X"FC",X"F4",X"D1",X"B6",X"B3",X"AE",X"A3",X"98",X"A3",X"C6", + X"D9",X"D4",X"D4",X"E1",X"E1",X"C9",X"9E",X"78",X"62",X"3F",X"32",X"2C",X"27",X"2C",X"32",X"37", + X"3F",X"47",X"4A",X"52",X"55",X"5A",X"5D",X"5D",X"5A",X"3F",X"27",X"14",X"11",X"14",X"24",X"4A", + X"80",X"A6",X"BE",X"C6",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"DC",X"BE",X"AB",X"8B", + X"5D",X"2F",X"14",X"01",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"70",X"6D",X"5D",X"4D", + X"4D",X"68",X"9B",X"BE",X"C9",X"B9",X"B3",X"AB",X"9B",X"A3",X"B3",X"C6",X"D1",X"B6",X"8B",X"52", + X"1C",X"11",X"11",X"14",X"37",X"62",X"90",X"9E",X"9B",X"83",X"75",X"5D",X"47",X"32",X"2F",X"24", + X"17",X"11",X"11",X"17",X"27",X"5D",X"A3",X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"EF",X"CE", + X"9B",X"7D",X"68",X"62",X"62",X"7D",X"98",X"9E",X"93",X"7D",X"6D",X"5D",X"55",X"52",X"52",X"52", + X"55",X"55",X"5D",X"62",X"65",X"68",X"6D",X"70",X"75",X"7D",X"78",X"7D",X"80",X"83",X"78",X"62", + X"3A",X"27",X"14",X"17",X"27",X"3F",X"5A",X"78",X"98",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70",X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32", + X"04",X"01",X"01",X"01",X"01",X"01",X"11",X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78", + X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24",X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93", + X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90",X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E", + X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E",X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B", + X"88",X"75",X"52",X"37",X"1F",X"1C",X"27",X"37",X"4D",X"68",X"83",X"AE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D1",X"9B",X"65",X"42",X"3A",X"52",X"80",X"AE",X"D4",X"E9",X"E4",X"C6", + X"80",X"3A",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"32",X"88",X"C6",X"F7",X"FC", + X"E4",X"CE",X"B9",X"A3",X"80",X"62",X"47",X"37",X"2F",X"2C",X"2F",X"37",X"3F",X"3A",X"32",X"3A", + X"37",X"32",X"37",X"3A",X"52",X"7D",X"B3",X"DC",X"E4",X"E1",X"D1",X"D1",X"E1",X"FC",X"FC",X"FC", + X"FC",X"F4",X"CE",X"A3",X"83",X"75",X"7D",X"83",X"83",X"88",X"98",X"A6",X"A6",X"98",X"88",X"75", + X"68",X"5D",X"5A",X"5A",X"5A",X"62",X"65",X"68",X"6D",X"70",X"75",X"75",X"75",X"7D",X"83",X"83", + X"80",X"75",X"68",X"70",X"80",X"8B",X"93",X"98",X"98",X"90",X"90",X"8B",X"90",X"98",X"A3",X"AE", + X"B6",X"C9",X"C9",X"C1",X"B3",X"A3",X"98",X"8B",X"78",X"75",X"70",X"6D",X"65",X"68",X"70",X"80", + X"83",X"83",X"88",X"8B",X"83",X"78",X"68",X"5D",X"52",X"42",X"2C",X"27",X"2C",X"3A",X"47",X"42", + X"42",X"52",X"70",X"8B",X"A6",X"AB",X"A3",X"9E",X"9E",X"B3",X"B9",X"B9",X"BE",X"BE",X"B9",X"A3", + X"88",X"68",X"5D",X"5A",X"5A",X"52",X"52",X"68",X"70",X"65",X"62",X"62",X"68",X"7D",X"8B",X"8B", + X"83",X"75",X"65",X"68",X"75",X"80",X"9B",X"C1",X"EC",X"FC",X"FC",X"F7",X"EF",X"E9",X"D1",X"A3", + X"78",X"5D",X"42",X"2C",X"14",X"0C",X"09",X"0C",X"0C",X"17",X"2C",X"47",X"62",X"75",X"75",X"68", + X"62",X"52",X"4A",X"4A",X"42",X"3F",X"4A",X"55",X"68",X"90",X"A3",X"B9",X"C6",X"CE",X"E4",X"FC", + X"FC",X"EC",X"E9",X"E9",X"DC",X"C1",X"B3",X"A6",X"98",X"75",X"52",X"3A",X"2C",X"1C",X"11",X"01", + X"0C",X"1F",X"37",X"52",X"70",X"78",X"78",X"68",X"62",X"62",X"75",X"98",X"B6",X"BE",X"B3",X"AB", + X"A6",X"9B",X"9E",X"AE",X"B9",X"C1",X"AE",X"90",X"5D",X"32",X"2C",X"27",X"2C",X"3F",X"62",X"83", + X"93",X"90",X"88",X"80",X"70",X"5D",X"52",X"47",X"3A",X"2F",X"24",X"1F",X"2C",X"3A",X"68",X"A3", + X"D4",X"F4",X"FC",X"FC",X"F4",X"E9",X"E9",X"DC",X"B9",X"90",X"78",X"68",X"5D",X"62",X"7D",X"93", + X"9B",X"90",X"7D",X"70",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5A",X"5D",X"65",X"68",X"68",X"70", + X"70",X"75",X"78",X"78",X"7D",X"80",X"80",X"78",X"65",X"3F",X"27",X"17",X"1C",X"2C",X"3F",X"5D", + X"78",X"93",X"AE",X"C6",X"DC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"F7",X"A6",X"80",X"70", + X"62",X"65",X"7D",X"98",X"A6",X"9B",X"80",X"62",X"32",X"04",X"01",X"01",X"01",X"01",X"01",X"11", + X"3A",X"5D",X"83",X"98",X"93",X"88",X"83",X"88",X"78",X"5D",X"4A",X"37",X"2C",X"24",X"27",X"24", + X"17",X"14",X"32",X"5D",X"80",X"90",X"90",X"93",X"93",X"93",X"90",X"8B",X"8B",X"8B",X"8B",X"90", + X"93",X"93",X"98",X"98",X"9B",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9B",X"9E", + X"9B",X"98",X"98",X"98",X"93",X"93",X"90",X"93",X"8B",X"88",X"75",X"52",X"37",X"1F",X"1C",X"24", + X"37",X"4D",X"68",X"88",X"AE",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"9B",X"65", + X"3F",X"37",X"52",X"80",X"B3",X"D9",X"EC",X"EC",X"C9",X"7D",X"37",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"27",X"88",X"D1",X"FC",X"FC",X"EC",X"D1",X"BE",X"A3",X"7D",X"62",X"3A", + X"2C",X"1F",X"1F",X"24",X"2C",X"32",X"2C",X"27",X"2F",X"27",X"27",X"27",X"2C",X"47",X"7D",X"C1", + X"F7",X"FC",X"FC",X"E9",X"E1",X"EC",X"FC",X"FC",X"FC",X"FC",X"FC",X"E4",X"AE",X"88",X"78",X"83", + X"8B",X"8B",X"93",X"A3",X"B9",X"BE",X"A6",X"90",X"75",X"65",X"52",X"52",X"52",X"4D",X"55",X"5D", + X"62",X"68",X"70",X"70",X"70",X"75",X"80",X"8B",X"90",X"90",X"8B",X"83",X"90",X"98",X"9B",X"9E", + X"9E",X"9B",X"93",X"93",X"8B",X"90",X"8B",X"8B",X"8B",X"88",X"8B",X"8B",X"8B",X"8B",X"88",X"8B", + X"8B",X"8B",X"8B",X"8B",X"8B",X"88",X"8B",X"88",X"88",X"88",X"88",X"83",X"83",X"80",X"80",X"80", + X"80",X"7D",X"65",X"47",X"52",X"68",X"78",X"78",X"65",X"5A",X"5D",X"6D",X"75",X"78",X"70",X"68", + X"70",X"90",X"C9",X"EC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A6",X"68",X"42",X"3A",X"37",X"3A",X"5D", + X"7D",X"83",X"68",X"55",X"52",X"47",X"32",X"17",X"09",X"01",X"01",X"09",X"17",X"2C",X"52",X"9B", + X"E1",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"DC",X"A6",X"78",X"62",X"47",X"1F",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"3F",X"7D",X"A3",X"9B",X"80",X"5D",X"4A",X"5A",X"7D",X"90",X"9B",X"AB", + X"A6",X"AB",X"AB",X"9E",X"A6",X"BE",X"D4",X"E4",X"D4",X"A6",X"88",X"7D",X"88",X"88",X"83",X"90", + X"A3",X"AB",X"A6",X"9E",X"98",X"8B",X"83",X"80",X"80",X"80",X"83",X"83",X"88",X"8B",X"8B",X"90", + X"90",X"90",X"93",X"98",X"98",X"9B",X"93",X"98",X"93",X"93",X"93",X"93",X"93",X"93",X"90",X"90", + X"90",X"8B",X"8B",X"83",X"80",X"7D",X"68",X"52",X"52",X"62",X"68",X"88",X"AB",X"C6",X"C9",X"C9", + X"B6",X"A6",X"9E",X"8B",X"83",X"8B",X"A3",X"B3",X"AE",X"98",X"80",X"6D",X"5D",X"52",X"47",X"42", + X"47",X"3F",X"47",X"42",X"42",X"4D",X"62",X"65",X"68",X"68",X"68",X"68",X"68",X"68",X"68",X"68", + X"65",X"68",X"68",X"68",X"6D",X"70",X"6D",X"6D",X"70",X"75",X"70",X"75",X"78",X"75",X"78",X"75", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"7D",X"80",X"80",X"6D",X"65",X"70",X"80",X"80",X"68", + X"52",X"32",X"2C",X"37",X"68",X"9B",X"B6",X"B6",X"B6",X"C1",X"D4",X"D9",X"C6",X"A3",X"78",X"5A", + X"3F",X"32",X"32",X"3A",X"55",X"8B",X"CE",X"FC",X"FC",X"FC",X"FC",X"FC",X"E1",X"A3",X"62",X"2F", + X"1C",X"09",X"01",X"01",X"1C",X"47",X"5D",X"68",X"80",X"93",X"90",X"80",X"70",X"5A",X"4D",X"52", + X"68",X"78",X"7D",X"70",X"5D",X"4A",X"3A",X"32",X"32",X"2F",X"27",X"27",X"1C",X"11",X"09",X"0C", + X"14",X"2C",X"42",X"75",X"AB",X"DC",X"F7",X"FC",X"FC",X"F7",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"BE",X"88",X"4D",X"11",X"01",X"01",X"0C",X"3F",X"75",X"9E",X"B6",X"B3", + X"93",X"70",X"52",X"3A",X"1F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"3F", + X"52",X"62",X"68",X"7D",X"9E",X"C1",X"E4",X"FC",X"FC",X"F7",X"E1",X"BE",X"A3",X"90",X"80",X"88", + X"AB",X"E1",X"FC",X"FC",X"FC",X"FC",X"F7",X"BE",X"7D",X"3F",X"0C",X"01",X"01",X"01",X"01",X"27", + X"70",X"B6",X"E9",X"FC",X"FC",X"E9",X"AE",X"83",X"62",X"4D",X"2F",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"3F",X"98",X"CE",X"D1",X"BE",X"B6",X"C1",X"D4",X"E9",X"FC",X"E9",X"C9",X"AB", + X"9B",X"88",X"5D",X"37",X"27",X"27",X"1F",X"1C",X"1C",X"1F",X"37",X"70",X"B6",X"FC",X"FC",X"FC", + X"FC",X"FC",X"F4",X"F4",X"E4",X"C6",X"98",X"70",X"5A",X"3A",X"37",X"47",X"6D",X"AE",X"F7",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"93",X"55",X"17",X"01",X"01",X"01",X"1C",X"4A",X"80",X"AB", + X"B3",X"A6",X"A3",X"A3",X"A3",X"A6",X"9B",X"78",X"42",X"11",X"04",X"11",X"1C",X"1F",X"37",X"55", + X"7D",X"8B",X"80",X"5D",X"47",X"4D",X"65",X"6D",X"5D",X"4A",X"3F",X"4D",X"7D",X"B6",X"EC",X"FC", + X"FC",X"FC",X"E4",X"C6",X"9E",X"98",X"9B",X"90",X"75",X"5D",X"62",X"7D",X"9B",X"C6",X"E1",X"E9", + X"D9",X"B3",X"93",X"83",X"70",X"68",X"5D",X"5A",X"52",X"52",X"52",X"55",X"5D",X"65",X"65",X"68", + X"5A",X"37",X"2F",X"4A",X"65",X"6D",X"68",X"75",X"93",X"BE",X"E4",X"EC",X"D1",X"B3",X"9E",X"AB", + X"AB",X"9E",X"80",X"65",X"42",X"32",X"32",X"4A",X"75",X"90",X"A3",X"BE",X"E4",X"FC",X"FC",X"FC", + X"FC",X"D1",X"93",X"5A",X"3A",X"3A",X"47",X"5A",X"7D",X"A6",X"CE",X"CE",X"B9",X"A6",X"9B",X"80", + X"52",X"1C",X"01",X"01",X"01",X"11",X"47",X"78",X"9E",X"AB",X"9B",X"78",X"5A",X"2C",X"14",X"1C", + X"27",X"1F",X"11",X"01",X"01",X"01",X"1C",X"3F",X"75",X"AB",X"C9",X"D4",X"DC",X"CE",X"C9",X"D1", + X"E1",X"F4",X"FC",X"FC",X"FC",X"E4",X"BE",X"90",X"70",X"4A",X"11",X"01",X"01",X"01",X"01",X"09", + X"17",X"4A",X"90",X"D4",X"FC",X"FC",X"FC",X"F4",X"E9",X"E9",X"FC",X"FC",X"E4",X"B3",X"80",X"52", + X"2F",X"1C",X"1F",X"32",X"68",X"AE",X"F4",X"FC",X"FC",X"FC",X"E4",X"C9",X"AB",X"80",X"5D",X"47", + X"37",X"42",X"75",X"AB",X"DC",X"FC",X"FC",X"FC",X"D9",X"93",X"55",X"37",X"2F",X"3A",X"52",X"62", + X"68",X"68",X"55",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"1C",X"32",X"4D",X"68", + X"9B",X"CE",X"E4",X"F4",X"EC",X"E4",X"E4",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9", + X"88",X"4A",X"17",X"04",X"11",X"42",X"75",X"88",X"9B",X"B6",X"BE",X"A6",X"7D",X"4D",X"1C",X"01", + X"01",X"17",X"27",X"32",X"4D",X"7D",X"A6",X"B3",X"B9",X"C6",X"D1",X"D9",X"D9",X"CE",X"BE",X"A6", + X"90",X"65",X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"14",X"68",X"93",X"98",X"83",X"75",X"7D", + X"9E",X"BE",X"C9",X"BE",X"A6",X"9E",X"B6",X"D9",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D9",X"C1", + X"B3",X"9B",X"75",X"5D",X"47",X"2F",X"2F",X"4A",X"68",X"7D",X"7D",X"78",X"83",X"90",X"9E",X"AE", + X"A3",X"83",X"75",X"52",X"3F",X"4A",X"5D",X"62",X"55",X"3F",X"2F",X"24",X"32",X"5A",X"7D",X"90", + X"AB",X"CE",X"E4",X"FC",X"FC",X"FC",X"E9",X"CE",X"B3",X"98",X"88",X"83",X"83",X"90",X"B3",X"EC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"75",X"42",X"27",X"14",X"01",X"01",X"1C",X"3F",X"52",X"5A", + X"68",X"78",X"68",X"47",X"17",X"01",X"01",X"09",X"27",X"37",X"4A",X"65",X"75",X"6D",X"65",X"68", + X"68",X"5D",X"4D",X"42",X"27",X"0C",X"0C",X"14",X"1C",X"1F",X"3A",X"68",X"9E",X"CE",X"E1",X"DC", + X"DC",X"DC",X"DC",X"CE",X"A6",X"75",X"5A",X"4A",X"3A",X"4A",X"70",X"98",X"BE",X"E1",X"E9",X"E4", + X"B9",X"9E",X"90",X"8B",X"88",X"75",X"52",X"2F",X"2F",X"4A",X"5D",X"68",X"78",X"80",X"70",X"70", + X"7D",X"8B",X"9E",X"B6",X"BE",X"B6",X"AE",X"9B",X"98",X"AE",X"CE",X"E4",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"B9",X"9E",X"88",X"65",X"4D",X"47",X"3F",X"2F",X"11",X"01",X"04", + X"1F",X"2F",X"2F",X"1F",X"11",X"01",X"0C",X"2C",X"4D",X"62",X"78",X"98",X"AB",X"BE",X"DC",X"F4", + X"F7",X"E4",X"E1",X"DC",X"C1",X"9E",X"88",X"62",X"3A",X"14",X"01",X"11",X"17",X"27",X"32",X"55", + X"88",X"B6",X"E4",X"F7",X"E4",X"C6",X"A3",X"75",X"5A",X"52",X"5A",X"68",X"78",X"80",X"80",X"5A", + X"27",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"3F",X"70",X"A3",X"C9",X"E1",X"FC",X"FC", + X"FC",X"FC",X"FC",X"DC",X"C6",X"B3",X"98",X"93",X"9B",X"AB",X"B9",X"AB",X"98",X"83",X"68",X"52", + X"4A",X"2F",X"17",X"04",X"01",X"0C",X"37",X"75",X"A3",X"B9",X"D1",X"CE",X"B3",X"A3",X"9B",X"93", + X"93",X"A6",X"BE",X"B9",X"9E",X"7D",X"55",X"37",X"27",X"27",X"4A",X"80",X"A6",X"B3",X"AE",X"AB", + X"B9",X"C6",X"B9",X"B3",X"A3",X"80",X"5D",X"4A",X"47",X"3A",X"32",X"3A",X"5A",X"7D",X"83",X"90", + X"8B",X"83",X"7D",X"70",X"65",X"6D",X"7D",X"78",X"65",X"47",X"1F",X"0C",X"01",X"01",X"09",X"2C", + X"68",X"AE",X"CE",X"D1",X"CE",X"D4",X"E4",X"E4",X"CE",X"A6",X"98",X"9B",X"AB",X"BE",X"CE",X"CE", + X"B9",X"90",X"52",X"14",X"01",X"01",X"01",X"01",X"09",X"3A",X"78",X"9E",X"AE",X"B9",X"CE",X"CE", + X"B9",X"A6",X"90",X"7D",X"7D",X"83",X"80",X"68",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75", + X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6",X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4", + X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A",X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC", + X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52",X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B", + X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9",X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01", + X"01",X"01",X"01",X"01",X"01",X"24",X"47",X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4", + X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3",X"9B",X"98",X"98",X"90",X"83",X"88",X"A6",X"C9",X"DC", + X"D9",X"BE",X"AB",X"7D",X"52",X"2F",X"27",X"1F",X"11",X"17",X"27",X"2F",X"2F",X"3F",X"52",X"5D", + X"5A",X"65",X"70",X"75",X"80",X"88",X"8B",X"9B",X"AB",X"BE",X"C6",X"AE",X"83",X"55",X"27",X"09", + X"09",X"27",X"52",X"83",X"93",X"98",X"93",X"88",X"83",X"80",X"70",X"55",X"3F",X"2C",X"27",X"32", + X"47",X"65",X"8B",X"AE",X"D4",X"E9",X"D9",X"B3",X"98",X"90",X"93",X"88",X"68",X"4D",X"4A",X"5A", + X"68",X"6D",X"7D",X"8B",X"90",X"8B",X"88",X"8B",X"98",X"9E",X"9B",X"83",X"62",X"2F",X"09",X"04", + X"1F",X"47",X"6D",X"98",X"AE",X"B6",X"B3",X"AB",X"9B",X"9B",X"A3",X"B6",X"C6",X"B9",X"9B",X"83", + X"78",X"6D",X"65",X"5A",X"5A",X"68",X"88",X"A6",X"B6",X"A3",X"8B",X"75",X"68",X"6D",X"6D",X"65", + X"5D",X"5D",X"68",X"80",X"A3",X"CE",X"DC",X"D4",X"CE",X"CE",X"C9",X"C6",X"CE",X"BE",X"AB",X"90", + X"80",X"80",X"8B",X"98",X"9E",X"B6",X"DC",X"E4",X"E4",X"E1",X"CE",X"C6",X"B6",X"98",X"80",X"7D", + X"75",X"70",X"68",X"68",X"62",X"3F",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"11",X"47",X"68",X"90",X"B6",X"CE",X"D4",X"E1",X"E9",X"E9",X"E4",X"E4",X"E9",X"E4",X"D4",X"C6", + X"A6",X"78",X"42",X"14",X"01",X"01",X"01",X"01",X"14",X"42",X"78",X"AB",X"D1",X"E1",X"D9",X"C6", + X"9B",X"7D",X"75",X"78",X"88",X"93",X"8B",X"88",X"70",X"4D",X"2F",X"24",X"1C",X"24",X"27",X"24", + X"27",X"3A",X"62",X"88",X"B3",X"CE",X"DC",X"EC",X"EF",X"E1",X"CE",X"BE",X"A3",X"83",X"68",X"52", + X"4D",X"55",X"65",X"78",X"78",X"80",X"90",X"90",X"90",X"8B",X"75",X"5D",X"4D",X"52",X"62",X"80", + X"A3",X"B6",X"B6",X"B6",X"A6",X"90",X"83",X"88",X"93",X"9E",X"BE",X"D1",X"C9",X"AE",X"8B",X"62", + X"3F",X"27",X"1C",X"32",X"62",X"88",X"9B",X"A3",X"AB",X"C1",X"CE",X"C1",X"B6",X"A6",X"90",X"6D", + X"5D",X"55",X"3F",X"2F",X"2F",X"47",X"5D",X"65",X"6D",X"75",X"78",X"83",X"7D",X"75",X"7D",X"83", + X"80",X"68",X"4D",X"2F",X"14",X"04",X"04",X"17",X"37",X"70",X"A6",X"C1",X"C1",X"B9",X"BE",X"D1", + X"D4",X"C1",X"A3",X"98",X"9E",X"AE",X"C9",X"D4",X"D4",X"C6",X"98",X"5D",X"24",X"01",X"01",X"01", + X"01",X"17",X"4A",X"7D",X"A3",X"AE",X"B9",X"C9",X"C6",X"B6",X"A3",X"8B",X"7D",X"80",X"83",X"83", + X"6D",X"55",X"52",X"4A",X"42",X"37",X"32",X"47",X"75",X"A6",X"C1",X"D1",X"D9",X"CE",X"C9",X"B6", + X"9B",X"7D",X"62",X"4D",X"4D",X"6D",X"9E",X"D4",X"F4",X"EC",X"E4",X"CE",X"A3",X"78",X"65",X"5A", + X"4A",X"37",X"2C",X"37",X"5D",X"93",X"C6",X"E9",X"FC",X"FC",X"D4",X"A6",X"88",X"75",X"68",X"52", + X"27",X"01",X"01",X"01",X"01",X"01",X"11",X"5D",X"9B",X"C9",X"D1",X"C9",X"BE",X"B9",X"B9",X"B9", + X"B6",X"AE",X"A3",X"98",X"83",X"70",X"4D",X"17",X"01",X"01",X"01",X"01",X"01",X"01",X"24",X"47", + X"68",X"9B",X"DC",X"FC",X"FC",X"FC",X"FC",X"E9",X"F4",X"FC",X"FC",X"FC",X"E4",X"D4",X"C9",X"B3", + X"9B",X"98",X"98",X"8B",X"83",X"8B",X"A6",X"C9",X"E1",X"DC",X"C1",X"A6",X"7D",X"4D",X"2C",X"24", + X"17",X"0C",X"11",X"1F",X"2C",X"2C",X"3A",X"52",X"5D",X"5A",X"65",X"70",X"78",X"88",X"90",X"90", + X"9E",X"AB",X"C1",X"C6",X"A6",X"78",X"3F",X"11",X"01",X"01",X"14",X"47",X"80",X"93",X"98",X"93", + X"83",X"70",X"65",X"4D",X"2F",X"14",X"04",X"04",X"27",X"47",X"70",X"A3",X"D1",X"FC",X"FC",X"F7", + X"C9",X"A6",X"9B",X"9B",X"8B",X"70",X"5A",X"5D",X"75",X"7D",X"80",X"8B",X"9E",X"9B",X"93",X"8B", + X"98",X"A3",X"AE",X"AE",X"93",X"68",X"32",X"04",X"04",X"24",X"52",X"88",X"B6",X"C9",X"B9",X"AB", + X"98",X"80",X"80",X"90",X"A6",X"B9",X"BE",X"A6",X"93",X"8B",X"80",X"70",X"4D",X"37",X"3F",X"62", + X"88",X"9E",X"98",X"80",X"65",X"55",X"62",X"68",X"68",X"70",X"75",X"78",X"93",X"C6",X"FC",X"FC", + X"FC",X"FC",X"F7",X"E9",X"DC",X"D4",X"BE",X"A3",X"80",X"68",X"70",X"75",X"75",X"70",X"80",X"A3", + X"B3",X"B3",X"AE",X"98",X"83",X"75",X"5D",X"52",X"5A",X"68",X"78",X"83",X"83",X"78",X"4A",X"11", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"37",X"78",X"A6",X"D1",X"E9",X"E4", + X"E1",X"E1",X"DC",X"D9",X"E9",X"FC",X"FC",X"FC",X"FC",X"EF",X"B9",X"75",X"2F",X"01",X"01",X"01", + X"01",X"01",X"01",X"27",X"5D",X"9B",X"D4",X"F4",X"EC",X"CE",X"A6",X"93",X"9E",X"B6",X"B6",X"A3", + X"93",X"8B",X"83",X"70",X"68",X"78",X"93",X"A6",X"9E",X"90",X"83",X"98",X"AE",X"C9",X"D4",X"DC", + X"CE",X"A6",X"7D",X"65",X"52",X"2C",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"11",X"4D",X"9E", + X"E4",X"FC",X"FC",X"FC",X"EC",X"EC",X"FC",X"FC",X"FC",X"FC",X"E9",X"AE",X"78",X"4A",X"2F",X"2F", + X"52",X"8B",X"C6",X"F4",X"FC",X"F7",X"DC",X"B3",X"80",X"4D",X"17",X"01",X"01",X"01",X"1C",X"3F", + X"70",X"A6",X"D1",X"E9",X"E1",X"CE",X"B9",X"B3",X"AE",X"A6",X"88",X"5A",X"1F",X"01",X"01",X"01", + X"01",X"01",X"14",X"52",X"8B",X"B9",X"C6",X"B6",X"A6",X"9E",X"90",X"75",X"68",X"52",X"4A",X"52", + X"68",X"88",X"93",X"83",X"62",X"3F",X"1F",X"17",X"2F",X"4D",X"68",X"75",X"83",X"9E",X"D1",X"FC", + X"FC",X"FC",X"FC",X"FC",X"D4",X"BE",X"B3",X"A3",X"A6",X"BE",X"D4",X"E1",X"CE",X"B3",X"A6",X"98", + X"75",X"4A",X"27",X"1C",X"2F",X"4D",X"68",X"7D",X"68",X"47",X"17",X"01",X"01",X"01",X"01",X"01", + X"04",X"0C",X"1F",X"32",X"4A",X"5D",X"80",X"B3",X"F7",X"FC",X"FC",X"FC",X"EC",X"D4",X"CE",X"BE", + X"C1",X"CE",X"D9",X"C9",X"A3",X"83",X"70",X"5A",X"3F",X"32",X"3F",X"5D",X"68",X"65",X"47",X"2C", + X"17",X"04",X"09",X"27",X"4A",X"68",X"90",X"9E",X"98",X"88",X"7D",X"83",X"9E",X"CE",X"E9",X"F7", + X"E4",X"BE",X"9E",X"68",X"37",X"09",X"01",X"01",X"01",X"04",X"14",X"37",X"55",X"65",X"70",X"88", + X"AE",X"DC",X"FC",X"F4",X"D1",X"AE",X"93",X"80",X"78",X"83",X"9B",X"B3",X"B3",X"98",X"70",X"47", + X"24",X"17",X"32",X"62",X"9B",X"C9",X"CE",X"B9",X"A3",X"9B",X"88",X"70",X"5D",X"55",X"68",X"93", + X"B6",X"BE",X"B3",X"AE",X"AE",X"A3",X"90",X"90",X"98",X"9B",X"AB",X"AB",X"AE",X"B3",X"AB",X"93", + X"78",X"65",X"68",X"78",X"75",X"70",X"68",X"78",X"8B",X"93",X"93",X"9E",X"B9",X"DC",X"FC",X"FC", + X"FC",X"D4",X"93",X"62",X"42",X"1C",X"01",X"01",X"04",X"0C",X"0C",X"1F",X"4A",X"78",X"AB",X"C9", + X"DC",X"E1",X"D9",X"C6",X"AB",X"90",X"70",X"47",X"09",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"1C",X"47",X"62",X"75",X"88",X"AB",X"D1",X"E9",X"EC",X"E9",X"E4",X"DC",X"F7",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"E4",X"9E",X"80",X"75",X"7D",X"70",X"6D",X"75",X"80",X"8B",X"80",X"65", + X"4A",X"2C",X"04",X"01",X"01",X"01",X"04",X"2C",X"52",X"62",X"5A",X"4D",X"5A",X"78",X"9B",X"B3", + X"C1",X"AB",X"93",X"83",X"78",X"62",X"4D",X"4A",X"52",X"4A",X"3F",X"4D",X"5D",X"7D",X"90",X"9B", + X"9E",X"83",X"68",X"62",X"5D",X"68",X"78",X"88",X"88",X"8B",X"8B",X"80",X"62",X"47",X"3F",X"3A", + X"32",X"37",X"37",X"37",X"4D",X"70",X"88",X"8B",X"80",X"70",X"70",X"8B",X"B6",X"D4",X"D4",X"CE", + X"B9",X"B9",X"C9",X"C9",X"C6",X"B6",X"B9",X"D4",X"FC",X"FC",X"FC",X"FC",X"EC",X"B6",X"80",X"52", + X"37",X"2F",X"2C",X"37",X"62",X"98",X"D1",X"FC",X"FC",X"EC",X"D1",X"A3",X"68",X"4A",X"32",X"27", + X"27",X"3A",X"55",X"68",X"62",X"52",X"3F",X"1C",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"37", + X"5A",X"70",X"88",X"88",X"7D",X"65",X"52",X"47",X"52",X"68",X"83",X"9E",X"AE",X"B6",X"C1",X"B9", + X"B6",X"AE",X"98",X"78",X"5D",X"42",X"32",X"2C",X"2F",X"4D",X"7D",X"B9",X"F7",X"FC",X"FC",X"FC", + X"E1",X"AB",X"83",X"65",X"52",X"5A",X"68",X"65",X"52",X"3F",X"3F",X"3F",X"37",X"37",X"52",X"7D", + X"A6",X"C1",X"BE",X"9E",X"88",X"7D",X"68",X"5A",X"47",X"47",X"62",X"90",X"B3",X"C6",X"D9",X"EF", + X"FC",X"FC",X"E4",X"CE",X"B9",X"B3",X"B3",X"AE",X"AB",X"9B",X"75",X"55",X"37",X"11",X"01",X"01", + X"01",X"01",X"04",X"4D",X"88",X"AB",X"B3",X"AE",X"A3",X"9B",X"AE",X"C6",X"CE",X"C9",X"BE",X"B6", + X"B3",X"AB",X"AE",X"C6",X"EF",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"CE",X"88",X"4A",X"14",X"01", + X"09",X"2C",X"52",X"78",X"93",X"93",X"78",X"47",X"0C",X"01",X"01",X"01",X"01",X"09",X"09",X"11", + X"27",X"4D",X"62",X"68",X"7D",X"90",X"9E",X"AE",X"AB",X"8B",X"70",X"62",X"52",X"3A",X"1C",X"04", + X"11",X"2F",X"5A",X"83",X"9E",X"B3",X"B9",X"B9",X"AB",X"80",X"62",X"4D",X"4D",X"5A",X"65",X"75", + X"7D",X"83",X"83",X"70",X"4D",X"1F",X"0C",X"14",X"32",X"5D",X"70",X"68",X"65",X"68",X"83",X"9E", + X"9E",X"93",X"88",X"83",X"9B",X"BE",X"D9",X"E1",X"D1",X"B6",X"A3",X"93",X"88",X"88",X"8B",X"98", + X"A3",X"C6",X"FC",X"FC",X"FC",X"FC",X"FC",X"F4",X"D4",X"B3",X"88",X"65",X"4A",X"32",X"3A",X"5D", + X"88",X"B3",X"D4",X"E4",X"E1",X"B9",X"78",X"37",X"11",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"14",X"37",X"42",X"4A",X"5A",X"68",X"78",X"90",X"AE",X"C9",X"E1",X"E1", + X"C9",X"93",X"65",X"4D",X"32",X"1F",X"17",X"27",X"37",X"3F",X"42",X"4D",X"68",X"88",X"98",X"A3", + X"B6",X"C9",X"D4",X"E4",X"E4",X"D4",X"BE",X"A6",X"AE",X"C6",X"E4",X"FC",X"FC",X"FC",X"E4",X"AB", + X"6D",X"3F",X"27",X"2F",X"52",X"83",X"AB",X"AB",X"AE",X"AE",X"AE",X"98",X"70",X"5A",X"5A",X"65", + X"7D",X"88",X"80",X"5D",X"3A",X"24",X"11",X"11",X"2F",X"52",X"75",X"83",X"93",X"A3",X"C9",X"EF", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"D4",X"98",X"5A",X"1F",X"01",X"01",X"01",X"11",X"2F", + X"5D",X"90",X"BE",X"E4",X"FC",X"FC",X"D9",X"A3",X"78",X"65",X"68",X"75",X"70",X"65",X"5A",X"4A", + X"2C",X"14",X"04",X"11",X"37",X"68",X"9B",X"A6",X"9B",X"88",X"83",X"90",X"93",X"90",X"8B",X"83", + X"7D",X"83",X"93",X"A6",X"B6",X"BE",X"B9",X"9E",X"68",X"42",X"2C",X"2F",X"47",X"5D",X"78",X"88", + X"90",X"93",X"90",X"70",X"52",X"37",X"17",X"11",X"17",X"2C",X"37",X"3F",X"4D",X"4A",X"3F",X"32", + X"2F",X"37",X"5A",X"7D",X"9B",X"9E",X"A6",X"AE",X"B6",X"D4",X"FC",X"FC",X"FC",X"FC",X"FC",X"EC", + X"E1",X"B9",X"93",X"6D",X"5A",X"5A",X"5D",X"68",X"75",X"78",X"83",X"83",X"83",X"83",X"70",X"5D", + X"4A",X"4D",X"62",X"7D",X"90",X"98",X"88",X"62",X"2F",X"01",X"01",X"01",X"01",X"1C",X"37",X"52", + X"65",X"68",X"5A",X"52",X"5D",X"75",X"7D",X"75",X"5D",X"4A",X"4D",X"65",X"88",X"AB",X"C6",X"D9", + X"D4",X"B6",X"93",X"83",X"70",X"5A",X"47",X"47",X"4A",X"3F",X"3A",X"3F",X"32",X"27",X"17",X"1F", + X"3F",X"68",X"93",X"9E",X"9B",X"93",X"98",X"A6",X"AB",X"AB",X"A3",X"A6",X"BE",X"E1",X"F7",X"FC", + X"FC",X"EC",X"D1",X"AE",X"93",X"8B",X"9B",X"B3",X"B6",X"B6",X"C6",X"C6",X"B6",X"A6",X"9E",X"93", + X"7D",X"5D",X"37",X"1C",X"1F",X"27",X"2C",X"37",X"52",X"75",X"93",X"98",X"8B",X"7D",X"65",X"5D", + X"65",X"75",X"88",X"9B",X"9E",X"9B",X"8B",X"80",X"83",X"8B",X"8B",X"83",X"93",X"AB",X"C9",X"DC", + X"CE",X"B9",X"A6",X"83",X"5D",X"32",X"17",X"01",X"01",X"04",X"1C",X"4A",X"80",X"B6",X"DC",X"E1", + X"D4",X"BE",X"A6",X"98",X"90",X"88",X"6D",X"4D",X"2C",X"11",X"04",X"04",X"1C",X"4D",X"83",X"B6", + X"DC",X"E4",X"D1",X"C1",X"B3",X"9B",X"80",X"68",X"68",X"68",X"75",X"7D",X"7D",X"70",X"52",X"2C", + X"04",X"01",X"01",X"01",X"11",X"2F",X"47",X"5D",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC", + X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E",X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E", + X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52",X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01", + X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3",X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB", + X"93",X"78",X"65",X"62",X"68",X"70",X"80",X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70", + X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3",X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88", + X"7D",X"62",X"47",X"2F",X"11",X"01",X"01",X"01",X"01",X"01",X"17",X"3F",X"65",X"78",X"93",X"9B", + X"9E",X"93",X"98",X"9B",X"98",X"A3",X"A6",X"AB",X"B3",X"C1",X"D1",X"CE",X"BE",X"AE",X"98",X"7D", + X"75",X"65",X"52",X"4A",X"3F",X"3A",X"3F",X"52",X"68",X"80",X"93",X"AB",X"B6",X"C9",X"E1",X"E4", + X"D4",X"CE",X"CE",X"C9",X"BE",X"9E",X"7D",X"5A",X"37",X"27",X"1C",X"1F",X"37",X"5A",X"75",X"80", + X"8B",X"93",X"90",X"8B",X"88",X"88",X"80",X"80",X"83",X"80",X"88",X"A3",X"C6",X"E1",X"FC",X"FC", + X"F4",X"CE",X"A3",X"80",X"65",X"4A",X"37",X"37",X"3F",X"47",X"52",X"62",X"70",X"7D",X"70",X"62", + X"52",X"55",X"68",X"78",X"80",X"75",X"65",X"65",X"5D",X"55",X"5A",X"5A",X"65",X"80",X"98",X"A3", + X"9B",X"8B",X"7D",X"80",X"88",X"90",X"98",X"9B",X"93",X"93",X"9E",X"AE",X"B9",X"B6",X"AE",X"AE", + X"A6",X"93",X"78",X"65",X"52",X"4D",X"4A",X"52",X"68",X"78",X"88",X"93",X"90",X"83",X"80",X"6D", + X"5D",X"5D",X"62",X"68",X"6D",X"6D",X"5D",X"4A",X"37",X"2F",X"32",X"52",X"75",X"93",X"A6",X"AE", + X"AB",X"AE",X"B6",X"C6",X"BE",X"C1",X"B9",X"A6",X"98",X"8B",X"70",X"52",X"3A",X"2C",X"37",X"42", + X"5A",X"68",X"70",X"78",X"7D",X"88",X"93",X"98",X"90",X"7D",X"7D",X"88",X"90",X"98",X"93",X"7D", + X"52",X"2C",X"09",X"01",X"01",X"09",X"32",X"52",X"70",X"88",X"9B",X"93",X"90",X"93",X"98",X"90", + X"83",X"70",X"65",X"62",X"78",X"93",X"AE",X"BE",X"C6",X"B9",X"9E",X"83",X"70",X"65",X"5D",X"5A", + X"5A",X"5D",X"5A",X"55",X"55",X"47",X"37",X"27",X"1F",X"37",X"5A",X"78",X"88",X"8B",X"8B",X"93", + X"A3",X"A6",X"AB",X"A6",X"AB",X"BE",X"D4",X"E4",X"EC",X"EC",X"E1",X"C9",X"A6",X"90",X"83",X"90", + X"98",X"9B",X"9E",X"AE",X"AB",X"A6",X"9E",X"9B",X"9B",X"90",X"78",X"5A",X"3F",X"37",X"37",X"37", + X"3F",X"52",X"68",X"88",X"83",X"78",X"68",X"5A",X"55",X"65",X"78",X"8B",X"9E",X"A3",X"9B",X"90", + X"83",X"88",X"8B",X"88",X"80",X"8B",X"9E",X"B9",X"C9",X"B9",X"A6",X"93",X"75",X"52",X"32",X"1C", + X"11",X"0C",X"14",X"2C",X"5A",X"8B",X"BE",X"DC",X"E1",X"D9",X"C6",X"AE",X"9E",X"98",X"8B",X"75", + X"55",X"32",X"1C",X"11",X"11",X"24",X"52",X"88",X"B6",X"D9",X"E4",X"CE",X"BE",X"AE",X"98",X"7D", + X"68",X"65",X"68",X"75",X"78",X"7D",X"70",X"52",X"2F",X"09",X"01",X"01",X"01",X"11",X"2F",X"47", + X"5A",X"78",X"A3",X"D4",X"EC",X"FC",X"FC",X"F7",X"EC",X"EF",X"EC",X"D4",X"C9",X"C6",X"B9",X"9E", + X"80",X"65",X"68",X"70",X"78",X"7D",X"80",X"93",X"9E",X"AB",X"AE",X"AE",X"A3",X"8B",X"68",X"52", + X"42",X"32",X"27",X"1C",X"14",X"09",X"01",X"01",X"01",X"14",X"3F",X"78",X"A3",X"AE",X"AE",X"A3", + X"A6",X"BE",X"D4",X"D9",X"D9",X"D9",X"C6",X"B9",X"AB",X"93",X"78",X"65",X"62",X"68",X"70",X"80", + X"8B",X"88",X"7D",X"70",X"6D",X"78",X"7D",X"78",X"70",X"6D",X"83",X"9E",X"C1",X"CE",X"C1",X"B3", + X"98",X"75",X"52",X"3F",X"47",X"5A",X"68",X"7D",X"88",X"7D",X"62",X"47",X"2C",X"0C",X"01",X"01", + X"01",X"01",X"01",X"14",X"3A",X"65",X"7D",X"98",X"A3",X"A3",X"98",X"9B",X"9E",X"9E",X"A6",X"AB", + X"AB",X"B6",X"C6",X"D4",X"CE",X"BE",X"AB",X"90",X"78",X"68",X"5A",X"47",X"32",X"27",X"1F",X"24", + X"3A",X"62",X"80",X"9E",X"B9",X"CE",X"D4",X"E9",X"EC",X"E1",X"D1",X"D1",X"CE",X"C6",X"A6",X"80", + X"55",X"2F",X"17",X"04",X"11",X"2F",X"62",X"83",X"9B",X"A6",X"AB",X"9B",X"90",X"8B",X"88",X"78", + X"70",X"65",X"5A",X"65",X"88",X"A6",X"CE",X"EF",X"FC",X"FC",X"E1",X"B6",X"9E",X"88",X"68",X"52", + X"4A",X"47",X"3F",X"37",X"3A",X"47",X"47",X"3A",X"2F",X"2F",X"4A",X"68",X"80",X"83",X"75",X"65", + X"65",X"65",X"68",X"75",X"7D",X"88",X"9E",X"AB",X"AB",X"98",X"80",X"78",X"7D",X"80",X"8B",X"9E", + X"9E",X"9B",X"9E",X"AE",X"BE",X"C1",X"B3",X"A6",X"A3",X"A6",X"AB",X"9B",X"83",X"68",X"52",X"42", + X"3F",X"52",X"68",X"80",X"93",X"A3",X"A6",X"B3",X"A6",X"93",X"88",X"88",X"93",X"90",X"83",X"68", + X"4D",X"37",X"2C",X"2F",X"47",X"68",X"90",X"AB",X"AE",X"A6",X"A6",X"9B",X"88",X"75",X"68",X"62", + X"52",X"42",X"32",X"27",X"11",X"01",X"01",X"11",X"27",X"3F",X"5A",X"65",X"68",X"78",X"8B",X"A6", + X"C1",X"C6",X"B9",X"B3",X"B3",X"AB",X"A3",X"8B",X"68",X"42",X"24",X"11",X"11",X"11",X"27",X"4D", + X"70",X"98",X"B9",X"DC",X"E9",X"E9",X"E1",X"CE",X"AB",X"98",X"90",X"83",X"83",X"93",X"A3",X"B6", + X"AE",X"A3",X"90",X"78",X"5D",X"4A",X"4D",X"62",X"78",X"83",X"80",X"80",X"83",X"7D",X"68",X"52", + X"37",X"1F",X"1F",X"2F",X"47",X"55",X"65",X"7D",X"90",X"93",X"98",X"A3",X"AE",X"B3",X"B9",X"B6", + X"B6",X"C1",X"C6",X"B9",X"A6",X"8B",X"80",X"70",X"65",X"52",X"4A",X"52",X"62",X"65",X"68",X"7D", + X"90",X"AB",X"C6",X"D1",X"CE",X"AE",X"88",X"68",X"65",X"62",X"52",X"52",X"4D",X"3F",X"2F",X"27", + X"27",X"3A",X"62",X"83",X"9E",X"B3",X"A6",X"9E",X"93",X"90",X"8B",X"7D",X"68",X"62",X"65",X"65", + X"65",X"55",X"3F",X"27",X"14",X"11",X"14",X"1C",X"2F",X"4A",X"62",X"78",X"98",X"B6",X"D1",X"E4", + X"E4",X"E1",X"E4",X"F7",X"FC",X"F7",X"E4",X"D1",X"BE",X"AB",X"98",X"83",X"8B",X"98",X"93",X"90", + X"93",X"90",X"83",X"78",X"70",X"6D",X"62",X"4A",X"2C",X"17",X"14",X"1C",X"27",X"3F",X"4D",X"5D", + X"68",X"68",X"68",X"68",X"75",X"8B",X"9E",X"A6",X"9E",X"9B",X"98",X"98",X"93",X"80",X"70",X"62", + X"52",X"4A",X"42",X"3A",X"2F",X"27",X"2C",X"2F",X"3F",X"5D",X"80",X"90",X"9B",X"A3",X"AE",X"C9", + X"E1",X"E4",X"DC",X"CE",X"C9",X"CE",X"C6",X"B3",X"98",X"8B",X"83",X"75",X"68",X"6D",X"7D",X"90", + X"A3",X"B3",X"B9",X"AE",X"98",X"7D",X"70",X"62",X"4A",X"2F",X"17",X"11",X"17",X"24",X"37",X"52", + X"62",X"75",X"80",X"80",X"80",X"88",X"8B",X"8B",X"98",X"9B",X"9E",X"AB",X"B6",X"AE",X"A3",X"90", + X"83",X"80",X"7D",X"83",X"90",X"90",X"88",X"75",X"62",X"52",X"47",X"42",X"4A",X"5D",X"75",X"8B", + X"A3",X"AB",X"AB",X"A3",X"93",X"98",X"9E",X"AE",X"BE",X"BE",X"AB",X"88",X"68",X"52",X"3A",X"37", + X"47",X"62",X"83",X"98",X"A3",X"9B",X"98",X"98",X"88",X"68",X"52",X"4D",X"52",X"62",X"65",X"62", + X"62",X"5D",X"4A",X"37",X"27",X"2C",X"3F",X"5D",X"6D",X"75",X"75",X"80",X"90",X"A3",X"B3",X"BE", + X"C6",X"C1",X"B9",X"AB",X"9E",X"83",X"68",X"52",X"3F",X"27",X"11",X"0C",X"11",X"1C",X"3F",X"68", + X"9B",X"B6",X"BE",X"B6",X"B3",X"B6",X"BE",X"C9",X"C6",X"AE",X"9B",X"8B",X"80",X"7D",X"83",X"93", + X"A3",X"AE",X"A3",X"9E",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"7D",X"68",X"62",X"5D",X"62",X"5D", + X"52",X"4D",X"5A",X"52",X"52",X"52",X"52",X"52",X"5A",X"5A",X"5A",X"62",X"68",X"78",X"88",X"90", + X"98",X"A6",X"B6",X"B9",X"B6",X"B3",X"B6",X"B9",X"B9",X"B6",X"AE",X"AB",X"93",X"78",X"65",X"4D", + X"32",X"24",X"24",X"32",X"52",X"70",X"83",X"88",X"83",X"7D",X"70",X"65",X"68",X"6D",X"6D",X"6D", + X"68",X"65",X"68",X"68",X"65",X"5D",X"55",X"5D",X"70",X"8B",X"90",X"93",X"8B",X"80",X"7D",X"7D", + X"8B",X"9E",X"A6",X"A3",X"9E",X"9E",X"A3",X"A3",X"98",X"88",X"80",X"75",X"68",X"62",X"55",X"4D", + X"4A",X"4D",X"5D",X"75",X"93",X"AE",X"B6",X"AB",X"93",X"78",X"65",X"52",X"5A",X"5D",X"65",X"78", + X"88",X"88",X"80",X"75",X"70",X"68",X"5D",X"5A",X"5D",X"62",X"68",X"70",X"75",X"78",X"7D",X"7D", + X"80",X"78",X"70",X"65",X"5D",X"52",X"5A",X"70",X"8B",X"A3",X"AE",X"AE",X"A6",X"9B",X"90",X"83", + X"75",X"68",X"55",X"4D",X"4A",X"4A",X"4D",X"5A",X"78",X"93",X"B9",X"D4",X"E4",X"E1",X"CE",X"BE", + X"AE",X"9B",X"88",X"78",X"78",X"78",X"78",X"68",X"62",X"55",X"4D",X"3A",X"32",X"3A",X"4D",X"68", + X"7D",X"80",X"7D",X"78",X"75",X"7D",X"88",X"98",X"A3",X"AE",X"AE",X"AB",X"AE",X"B6",X"C6",X"D1", + X"D4",X"D4",X"C6",X"AB",X"98",X"83",X"78",X"65",X"4D",X"3F",X"3F",X"3F",X"4A",X"5A",X"68",X"70", + X"68",X"68",X"70",X"80",X"8B",X"93",X"8B",X"7D",X"70",X"6D",X"68",X"70",X"75",X"75",X"78",X"78", + X"75",X"68",X"65",X"62",X"6D",X"83",X"98",X"AE",X"B6",X"A6",X"98",X"90",X"80",X"75",X"68",X"5D", + X"62",X"68",X"80",X"93",X"9B",X"93",X"90",X"80",X"6D",X"5A",X"4A",X"42",X"47",X"52",X"5D",X"6D", + X"83",X"90",X"90",X"83",X"80",X"80",X"75",X"75",X"70",X"68",X"65",X"5A",X"52",X"4D",X"52",X"65", + X"7D",X"98",X"A6",X"AB",X"AB",X"A6",X"9E",X"9B",X"90",X"80",X"75",X"6D",X"65",X"52",X"52",X"52", + X"52",X"4D",X"42",X"3F",X"47",X"4A",X"55",X"5D",X"62",X"62",X"62",X"62",X"68",X"7D",X"88",X"93", + X"A3",X"9E",X"A3",X"98",X"90",X"90",X"98",X"A3",X"B6",X"C1",X"BE",X"B6",X"B3",X"AB",X"9B",X"88", + X"75",X"70",X"68",X"65",X"70",X"78",X"7D",X"70",X"68",X"68",X"68",X"68",X"65",X"62",X"5D",X"68", + X"7D",X"90",X"9B",X"9B",X"98",X"98",X"98",X"93",X"98",X"9E",X"9B",X"98",X"93",X"93",X"90",X"83", + X"80",X"80",X"78",X"68",X"62",X"62",X"65",X"75",X"83",X"88",X"8B",X"90",X"8B",X"7D",X"70",X"68", + X"65",X"5D",X"55",X"52",X"4D",X"4A",X"4D",X"5A",X"5D",X"65",X"70",X"80",X"8B",X"93",X"9E",X"9E", + X"9B",X"9E",X"A3",X"9B",X"98",X"90",X"88",X"83",X"83",X"88",X"90",X"A6",X"B9",X"BE",X"C1",X"C6", + X"C6",X"C6",X"B6",X"9B",X"83",X"65",X"52",X"4A",X"4D",X"5D",X"6D",X"80",X"8B",X"93",X"8B",X"80", + X"65",X"5A",X"52",X"52",X"52",X"47",X"3F",X"3A",X"47",X"52",X"5D",X"6D",X"83",X"93",X"9B",X"9E", + X"98",X"8B",X"88",X"80",X"80",X"78",X"6D",X"68",X"68",X"70",X"70",X"68",X"68",X"62",X"5A",X"5A", + X"5D",X"5A",X"5D",X"65",X"70",X"75",X"8B",X"98",X"9B",X"9B",X"9B",X"93",X"88",X"88",X"83",X"88", + X"88",X"93",X"9B",X"98",X"8B",X"80",X"78",X"70",X"68",X"68",X"70",X"80",X"88",X"90",X"93",X"9B", + X"9E",X"98",X"98",X"98",X"98",X"90",X"83",X"78",X"78",X"6D",X"6D",X"78",X"88",X"98",X"A3",X"AB", + X"AB",X"A6",X"98",X"83",X"70",X"52",X"47",X"37",X"32",X"27",X"27",X"37",X"47",X"4D",X"65",X"75", + X"88",X"90",X"98",X"90",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"68",X"62",X"5D",X"4D",X"42", + X"3A",X"3A",X"3F",X"47",X"52",X"5A",X"68",X"78",X"83",X"90",X"A3",X"AE",X"B6",X"B9",X"B6",X"AE", + X"B3",X"B6",X"C1",X"C6",X"BE",X"B9",X"B9",X"AE",X"9B",X"88",X"80",X"75",X"68",X"65",X"65",X"70", + X"78",X"83",X"8B",X"90",X"88",X"7D",X"65",X"5A",X"55",X"5A",X"52",X"4D",X"47",X"42",X"3F",X"47", + X"4A",X"52",X"65",X"7D",X"93",X"9B",X"98",X"93",X"90",X"93",X"9B",X"A6",X"AE",X"AE",X"A6",X"98", + X"8B",X"78",X"68",X"5A",X"52",X"52",X"5A",X"65",X"68",X"75",X"75",X"70",X"70",X"7D",X"80",X"83", + X"83",X"80",X"80",X"80",X"8B",X"98",X"A3",X"A3",X"A6",X"A3",X"9B",X"93",X"90",X"8B",X"88",X"80", + X"78",X"70",X"62",X"5A",X"5A",X"52",X"52",X"55",X"5A",X"62",X"68",X"75",X"70",X"6D",X"65",X"65", + X"68",X"6D",X"70",X"70",X"70",X"75",X"75",X"7D",X"83",X"88",X"93",X"9B",X"A3",X"A3",X"A6",X"A6", + X"A3",X"9E",X"93",X"88",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"7D",X"70",X"68",X"62", + X"62",X"68",X"70",X"78",X"7D",X"7D",X"78",X"75",X"68",X"68",X"62",X"62",X"68",X"78",X"78",X"7D", + X"75",X"68",X"6D",X"6D",X"70",X"75",X"7D",X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"80",X"83", + X"88",X"8B",X"88",X"83",X"80",X"80",X"83",X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D", + X"75",X"6D",X"68",X"75",X"80",X"83",X"88",X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"75",X"68",X"5D",X"52",X"4A",X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B", + X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B",X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62", + X"65",X"70",X"78",X"7D",X"80",X"88",X"8B",X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90", + X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"7D",X"78",X"78",X"75",X"70",X"70",X"6D",X"68",X"6D",X"70",X"78",X"80", + X"80",X"80",X"83",X"88",X"90",X"8B",X"8B",X"8B",X"88",X"80",X"7D",X"78",X"70",X"68",X"68",X"68", + X"68",X"6D",X"6D",X"70",X"78",X"7D",X"83",X"8B",X"8B",X"90",X"8B",X"88",X"88",X"88",X"88",X"83", + X"80",X"80",X"83",X"80",X"80",X"7D",X"83",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"78",X"78", + X"75",X"70",X"70",X"70",X"75",X"78",X"78",X"78",X"75",X"75",X"70",X"70",X"75",X"78",X"75",X"75", + X"75",X"75",X"78",X"7D",X"80",X"7D",X"7D",X"7D",X"83",X"88",X"8B",X"88",X"88",X"88",X"88",X"88", + X"8B",X"90",X"90",X"88",X"83",X"7D",X"7D",X"78",X"75",X"75",X"75",X"7D",X"7D",X"80",X"7D",X"78", + X"75",X"70",X"70",X"78",X"80",X"88",X"88",X"88",X"88",X"83",X"7D",X"78",X"78",X"80",X"83",X"83", + X"83",X"80",X"78",X"75",X"75",X"75",X"78",X"80",X"80",X"83",X"83",X"80",X"7D",X"78",X"6D",X"68", + X"65",X"62",X"5D",X"5A",X"62",X"65",X"68",X"75",X"80",X"8B",X"90",X"93",X"90",X"88",X"83",X"80", + X"78",X"75",X"75",X"70",X"68",X"65",X"5D",X"5D",X"55",X"5A",X"5D",X"65",X"68",X"75",X"75",X"80", + X"83",X"8B",X"90",X"9B",X"A3",X"A6",X"A6",X"9E",X"9B",X"98",X"98",X"9E",X"9E",X"A3",X"A3",X"A6", + X"A3",X"9B",X"8B",X"88",X"7D",X"75",X"6D",X"68",X"6D",X"75",X"7D",X"7D",X"83",X"83",X"80",X"75", + X"6D",X"68",X"68",X"68",X"65",X"62",X"5D",X"5A",X"5A",X"5D",X"62",X"68",X"78",X"80",X"83",X"80", + X"7D",X"80",X"83",X"8B",X"98",X"9B",X"9B",X"98",X"90",X"8B",X"7D",X"70",X"68",X"62",X"65",X"68", + X"70",X"78",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"7D",X"7D",X"7D",X"83",X"90",X"98", + X"9B",X"9E",X"9B",X"98",X"90",X"8B",X"83",X"83",X"7D",X"75",X"70",X"65",X"5D",X"5D",X"5A",X"5D", + X"62",X"65",X"68",X"75",X"75",X"75",X"75",X"68",X"6D",X"6D",X"70",X"70",X"75",X"70",X"75",X"75", + X"78",X"7D",X"83",X"90",X"98",X"9B",X"9B",X"9E",X"9E",X"9E",X"9E",X"93",X"88",X"83",X"7D",X"7D", + X"7D",X"80",X"83",X"80",X"80",X"7D",X"75",X"68",X"65",X"65",X"68",X"75",X"78",X"7D",X"78",X"78", + X"78",X"6D",X"68",X"65",X"68",X"6D",X"78",X"7D",X"7D",X"75",X"6D",X"6D",X"70",X"75",X"78",X"80", + X"83",X"80",X"80",X"80",X"83",X"83",X"80",X"83",X"83",X"88",X"8B",X"88",X"83",X"80",X"80",X"83", + X"8B",X"98",X"9E",X"9E",X"9E",X"9B",X"90",X"83",X"7D",X"75",X"6D",X"68",X"75",X"80",X"83",X"88", + X"8B",X"90",X"8B",X"83",X"7D",X"75",X"75",X"78",X"7D",X"80",X"80",X"75",X"68",X"5D",X"52",X"4A", + X"4D",X"52",X"5D",X"68",X"6D",X"78",X"80",X"88",X"8B",X"98",X"9B",X"A3",X"A3",X"9B",X"93",X"8B", + X"88",X"7D",X"70",X"68",X"65",X"65",X"62",X"62",X"62",X"65",X"70",X"78",X"7D",X"80",X"88",X"8B", + X"93",X"93",X"90",X"8B",X"88",X"80",X"83",X"88",X"90",X"9E",X"9E",X"9B",X"9B",X"93",X"88",X"7D", + X"7D",X"7D",X"78",X"7D",X"78",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"78",X"78",X"75", + X"75",X"70",X"75",X"6D",X"68",X"6D",X"70",X"78",X"80",X"83",X"80",X"83",X"88",X"90",X"8B",X"8B", + X"88",X"83",X"7D",X"78",X"75",X"6D",X"68",X"68",X"68",X"65",X"68",X"68",X"68",X"70",X"75",X"7D", + X"88",X"83",X"88",X"88",X"80",X"83",X"83",X"88",X"8B",X"88",X"88",X"88",X"83",X"80",X"7D",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"7D",X"75",X"75",X"75",X"75",X"70", + X"70",X"68",X"68",X"68",X"68",X"70",X"70",X"75",X"75",X"75",X"75",X"78",X"83",X"83",X"83",X"88", + X"88",X"90",X"98",X"98",X"93",X"90",X"90",X"8B",X"88",X"88",X"8B",X"88",X"80",X"78",X"78",X"75", + X"70",X"68",X"68",X"65",X"68",X"70",X"78",X"78",X"78",X"75",X"75",X"70",X"78",X"80",X"83",X"83", + X"80",X"7D",X"70",X"68",X"65",X"68",X"70",X"7D",X"83",X"83",X"83",X"80",X"75",X"70",X"68",X"65", + X"65",X"65",X"68",X"6D",X"70",X"78",X"7D",X"7D",X"7D",X"83",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"80",X"83",X"8B",X"90",X"93",X"93",X"8B",X"83",X"7D",X"78",X"70",X"6D",X"68",X"65",X"65",X"62", + X"65",X"68",X"70",X"7D",X"88",X"88",X"93",X"90",X"90",X"90",X"90",X"93",X"93",X"93",X"98",X"90", + X"88",X"80",X"78",X"78",X"75",X"78",X"80",X"88",X"90",X"90",X"93",X"8B",X"8B",X"88",X"7D",X"78", + X"6D",X"65",X"65",X"68",X"6D",X"75",X"80",X"83",X"88",X"88",X"88",X"83",X"83",X"83",X"83",X"80", + X"7D",X"80",X"7D",X"75",X"6D",X"68",X"5D",X"55",X"52",X"52",X"62",X"68",X"70",X"75",X"75",X"75", + X"78",X"7D",X"83",X"80",X"83",X"83",X"83",X"83",X"88",X"8B",X"90",X"98",X"98",X"9B",X"9B",X"93", + X"8B",X"83",X"7D",X"78",X"78",X"70",X"75",X"7D",X"80",X"80",X"83",X"80",X"80",X"75",X"70",X"68", + X"68",X"68",X"65",X"68",X"68",X"65",X"68",X"70",X"78",X"7D",X"88",X"88",X"88",X"83",X"83",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"68",X"68",X"68",X"68",X"6D",X"6D",X"70",X"70",X"75", + X"75",X"7D",X"83",X"83",X"88",X"83",X"88",X"83",X"88",X"83",X"83",X"8B",X"88",X"8B",X"88",X"88", + X"80",X"7D",X"7D",X"75",X"6D",X"68",X"6D",X"70",X"7D",X"80",X"7D",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"80",X"7D",X"7D",X"80",X"80", + X"83",X"83",X"80",X"80",X"7D",X"78",X"75",X"70",X"68",X"6D",X"75",X"78",X"7D",X"80",X"80",X"80", + X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"88",X"88",X"8B",X"8B",X"8B", + X"8B",X"88",X"83",X"83",X"80",X"78",X"75",X"75",X"70",X"70",X"75",X"75",X"80",X"83",X"80",X"83", + X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70", + X"75",X"75",X"78",X"7D",X"7D",X"80",X"80",X"83",X"83",X"83",X"83",X"88",X"83",X"83",X"83",X"88", + X"83",X"83",X"88",X"8B",X"88",X"88",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"80",X"80",X"80", + X"83",X"83",X"83",X"7D",X"7D",X"75",X"75",X"75",X"75",X"75",X"70",X"75",X"75",X"75",X"78",X"83", + X"80",X"83",X"80",X"7D",X"80",X"78",X"78",X"80",X"80",X"80",X"7D",X"80",X"80",X"80",X"7D",X"75", + X"70",X"68",X"68",X"68",X"68",X"68",X"70",X"75",X"7D",X"83",X"8B",X"90",X"90",X"8B",X"83",X"80", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"75",X"75",X"75",X"70",X"70",X"75",X"75", + X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"7D",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"83",X"83", + X"8B",X"8B",X"8B",X"88",X"83",X"83",X"80",X"83",X"7D",X"7D",X"7D",X"7D",X"75",X"75",X"78",X"7D", + X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"7D",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"78",X"78", + X"78",X"78",X"78",X"78",X"7D",X"80",X"78",X"80",X"80",X"78",X"78",X"78",X"78",X"7D",X"78",X"7D", + X"78",X"78",X"7D",X"78",X"78",X"78",X"75",X"78",X"78",X"7D",X"78",X"7D",X"80",X"78",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"78",X"78",X"7D",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80", + X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"78",X"80", + X"80",X"80",X"80",X"80",X"80",X"75",X"75",X"75",X"75",X"83",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"88",X"83", + X"80",X"80",X"7D",X"78",X"75",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"75",X"75",X"75",X"78",X"83",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"75",X"78",X"75",X"75",X"78", + X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D", + X"7D",X"7D",X"7D",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"78",X"78",X"78",X"75",X"75",X"75",X"70",X"75",X"75",X"7D",X"7D",X"80",X"80",X"80", + X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"80",X"78",X"78",X"7D", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"78",X"78",X"78", + X"78",X"78",X"78",X"78",X"78",X"75",X"78",X"78",X"80",X"80",X"80",X"80",X"80",X"80",X"83",X"83", + X"83",X"83",X"88",X"83",X"83",X"83",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"7D",X"78",X"78",X"78",X"75",X"75", + X"75",X"78",X"7D",X"78",X"83",X"80",X"80",X"80",X"80",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"78",X"78",X"78",X"78",X"75",X"75",X"75",X"75",X"78",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80", + X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"78", + X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"80",X"83",X"83",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"83",X"80",X"83",X"80",X"7D",X"7D",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"78", + X"78",X"78",X"7D",X"78",X"7D",X"7D",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D",X"78",X"78",X"7D", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"80",X"83",X"80",X"80",X"83",X"80",X"80",X"83",X"7D",X"7D",X"7D", + X"7D",X"78",X"78",X"78",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"7D",X"80",X"80",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"7D",X"7D",X"7D",X"78",X"7D",X"78",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"78",X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"7D", + X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78",X"78",X"78",X"7D",X"78",X"78",X"7D", + X"7D",X"80",X"80",X"80",X"80",X"83",X"83",X"83",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"7D", + X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"78", + X"78",X"7D",X"80",X"80",X"80",X"80",X"80",X"80",X"7D",X"7D",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"80",X"7D",X"7D",X"7D",X"7D",X"7D",X"7D",X"78", + X"7D",X"78",X"7D",X"80",X"80",X"80",X"80",X"7D",X"80",X"83",X"80",X"80",X"80",X"80",X"80",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/build_roms_galaxian.bat b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/build_roms_galaxian.bat new file mode 100644 index 00000000..8d35a90e --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/build_roms_galaxian.bat @@ -0,0 +1,20 @@ +@echo off + + +copy /b/y warofbug.1j + warofbug.1k gfx1.bin > NUL +copy /b/y warofbug.u + warofbug.v + warofbug.w + warofbug.y + warofbug.z main.bin > NUL + + + +romgen warofbug.cla GALAXIAN_6L 5 a r e > GALAXIAN_6L.vhd + + +romgen gfx1.bin GFX1 12 a r e > GFX1.vhd +romgen main.bin ROM_PGM_0 14 a r e > ROM_PGM_0.vhd + +romgen warofbug.1j GALAXIAN_1H 11 a r e > GALAXIAN_1H.vhd +romgen warofbug.1k GALAXIAN_1K 11 a r e > GALAXIAN_1K.vhd + + +echo done +pause diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/gfx1.bin b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/gfx1.bin new file mode 100644 index 00000000..3593689f Binary files /dev/null and b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/gfx1.bin differ diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/main.bin b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/main.bin new file mode 100644 index 00000000..c5f46697 Binary files /dev/null and b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/main.bin differ diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/romgen.exe b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/romgen.exe new file mode 100644 index 00000000..ab2427f2 Binary files /dev/null and b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/romgen.exe differ diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.1j b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.1j new file mode 100644 index 00000000..d8c1edde Binary files /dev/null and b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.1j differ diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.1k b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.1k new file mode 100644 index 00000000..92d611b2 Binary files /dev/null and b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.1k differ diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.cla b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.cla new file mode 100644 index 00000000..298d9068 Binary files /dev/null and b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.cla differ diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.u b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.u new file mode 100644 index 00000000..8f554dec Binary files /dev/null and b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.u differ diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.v b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.v new file mode 100644 index 00000000..ce7f3ea7 Binary files /dev/null and b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.v differ diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.w b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.w new file mode 100644 index 00000000..cfe60857 Binary files /dev/null and b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.w differ diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.y b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.y new file mode 100644 index 00000000..03c2e3bf Binary files /dev/null and b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.y differ diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.z b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.z new file mode 100644 index 00000000..d1ed656c Binary files /dev/null and b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/Neuer/warofbug.z differ diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..c5c2e037 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1290 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity ROM_PGM_0 is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(13 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of ROM_PGM_0 is + + + type ROM_ARRAY is array(0 to 10087) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"31",x"00",x"44",x"AF",x"C3",x"00",x"03",x"C3", -- 0x0000 + x"46",x"0B",x"55",x"50",x"4F",x"00",x"84",x"54", -- 0x0008 + x"77",x"23",x"10",x"FC",x"C9",x"06",x"C2",x"4C", -- 0x0010 + x"41",x"43",x"4B",x"4F",x"49",x"00",x"85",x"43", -- 0x0018 + x"C3",x"B4",x"04",x"45",x"00",x"10",x"00",x"05", -- 0x0020 + x"C3",x"0B",x"05",x"56",x"45",x"00",x"10",x"00", -- 0x0028 + x"85",x"42",x"49",x"4E",x"49",x"54",x"61",x"00", -- 0x0030 + x"C3",x"00",x"00",x"05",x"49",x"54",x"5E",x"00", -- 0x0038 + x"C3",x"00",x"10",x"41",x"4C",x"4F",x"C3",x"6A", -- 0x0040 + x"14",x"C3",x"7A",x"06",x"C3",x"EF",x"05",x"C3", -- 0x0048 + x"5C",x"03",x"C3",x"70",x"0C",x"C9",x"7B",x"15", -- 0x0050 + x"C3",x"BE",x"15",x"C3",x"46",x"0B",x"C3",x"F8", -- 0x0058 + x"0A",x"C3",x"6E",x"07",x"45",x"70",x"F5",x"AF", -- 0x0060 + x"32",x"01",x"70",x"08",x"3A",x"00",x"78",x"08", -- 0x0068 + x"C5",x"D5",x"E5",x"DD",x"E5",x"FD",x"E5",x"21", -- 0x0070 + x"00",x"43",x"11",x"00",x"58",x"01",x"80",x"00", -- 0x0078 + x"ED",x"B0",x"CD",x"FC",x"00",x"CD",x"CB",x"0C", -- 0x0080 + x"21",x"02",x"40",x"34",x"23",x"CD",x"77",x"05", -- 0x0088 + x"CD",x"D5",x"05",x"CD",x"46",x"00",x"CD",x"DD", -- 0x0090 + x"0A",x"CD",x"40",x"00",x"CD",x"85",x"06",x"3A", -- 0x0098 + x"10",x"40",x"F5",x"CB",x"47",x"28",x"05",x"CD", -- 0x00A0 + x"7D",x"05",x"18",x"0C",x"21",x"40",x"50",x"22", -- 0x00A8 + x"18",x"40",x"CD",x"92",x"07",x"CD",x"70",x"0B", -- 0x00B0 + x"F1",x"FD",x"E1",x"DD",x"E1",x"E1",x"D1",x"C1", -- 0x00B8 + x"3E",x"01",x"32",x"01",x"70",x"F1",x"C9",x"01", -- 0x00C0 + x"70",x"F1",x"C9",x"C1",x"3E",x"01",x"32",x"01", -- 0x00C8 + x"70",x"F1",x"C9",x"00",x"00",x"00",x"00",x"00", -- 0x00D0 + x"C3",x"3E",x"03",x"00",x"00",x"C3",x"FD",x"14", -- 0x00D8 + x"C3",x"C1",x"0B",x"C3",x"12",x"01",x"C3",x"53", -- 0x00E0 + x"01",x"C3",x"8E",x"01",x"C3",x"B1",x"01",x"00", -- 0x00E8 + x"C3",x"00",x"0D",x"C9",x"00",x"1A",x"C3",x"08", -- 0x00F0 + x"0A",x"C3",x"59",x"21",x"C3",x"E1",x"21",x"00", -- 0x00F8 + x"02",x"10",x"06",x"52",x"45",x"41",x"44",x"59", -- 0x0100 + x"40",x"50",x"4C",x"41",x"59",x"45",x"52",x"40", -- 0x0108 + x"31",x"FF",x"11",x"00",x"00",x"3A",x"14",x"40", -- 0x0110 + x"CB",x"5F",x"28",x"06",x"DD",x"21",x"00",x"41", -- 0x0118 + x"18",x"04",x"DD",x"21",x"00",x"42",x"DD",x"7E", -- 0x0120 + x"08",x"B7",x"28",x"18",x"21",x"4B",x"01",x"5F", -- 0x0128 + x"19",x"7E",x"07",x"07",x"07",x"4F",x"21",x"05", -- 0x0130 + x"43",x"71",x"23",x"23",x"7D",x"FE",x"3F",x"38", -- 0x0138 + x"F8",x"DD",x"7E",x"08",x"3C",x"E6",x"07",x"DD", -- 0x0140 + x"77",x"08",x"C9",x"00",x"20",x"40",x"60",x"80", -- 0x0148 + x"A0",x"C0",x"E0",x"3A",x"14",x"40",x"01",x"00", -- 0x0150 + x"00",x"11",x"40",x"50",x"CB",x"5F",x"28",x"05", -- 0x0158 + x"21",x"10",x"41",x"18",x"03",x"21",x"10",x"42", -- 0x0160 + x"7D",x"FE",x"FD",x"30",x"1E",x"7A",x"FE",x"54", -- 0x0168 + x"28",x"19",x"78",x"FE",x"FF",x"0E",x"10",x"28", -- 0x0170 + x"08",x"1A",x"4F",x"E6",x"FC",x"FE",x"30",x"20", -- 0x0178 + x"06",x"70",x"23",x"71",x"23",x"06",x"00",x"13", -- 0x0180 + x"04",x"18",x"DD",x"36",x"00",x"C9",x"3A",x"14", -- 0x0188 + x"40",x"11",x"40",x"50",x"CB",x"5F",x"28",x"05", -- 0x0190 + x"21",x"10",x"41",x"18",x"03",x"21",x"10",x"42", -- 0x0198 + x"7A",x"FE",x"54",x"C8",x"7E",x"47",x"B7",x"C8", -- 0x01A0 + x"13",x"10",x"FD",x"23",x"7E",x"12",x"23",x"18", -- 0x01A8 + x"EF",x"0E",x"00",x"21",x"01",x"43",x"CD",x"36", -- 0x01B0 + x"01",x"3A",x"01",x"40",x"E6",x"F0",x"32",x"01", -- 0x01B8 + x"40",x"AF",x"21",x"00",x"60",x"06",x"00",x"D7", -- 0x01C0 + x"21",x"00",x"68",x"D7",x"3E",x"FF",x"32",x"00", -- 0x01C8 + x"78",x"3A",x"14",x"40",x"CB",x"5F",x"28",x"0A", -- 0x01D0 + x"DD",x"21",x"00",x"41",x"FD",x"21",x"00",x"42", -- 0x01D8 + x"18",x"08",x"DD",x"21",x"00",x"42",x"FD",x"21", -- 0x01E0 + x"00",x"41",x"CB",x"7F",x"20",x"73",x"DD",x"7E", -- 0x01E8 + x"09",x"3D",x"B7",x"28",x"2E",x"DD",x"77",x"09", -- 0x01F0 + x"DD",x"7E",x"0A",x"FE",x"0F",x"28",x"01",x"3C", -- 0x01F8 + x"DD",x"77",x"0A",x"F5",x"DD",x"7E",x"05",x"FE", -- 0x0200 + x"1A",x"30",x"08",x"DD",x"34",x"05",x"21",x"00", -- 0x0208 + x"23",x"7E",x"47",x"F1",x"B8",x"DA",x"CC",x"02", -- 0x0210 + x"DD",x"7E",x"06",x"CB",x"A7",x"DD",x"77",x"06", -- 0x0218 + x"C3",x"CC",x"02",x"AF",x"32",x"10",x"40",x"CD", -- 0x0220 + x"49",x"00",x"3E",x"C0",x"CD",x"4C",x"00",x"11", -- 0x0228 + x"D0",x"02",x"E7",x"3E",x"80",x"CD",x"4C",x"00", -- 0x0230 + x"31",x"00",x"44",x"21",x"03",x"41",x"06",x"F8", -- 0x0238 + x"AF",x"D7",x"21",x"03",x"42",x"06",x"F8",x"D7", -- 0x0240 + x"21",x"00",x"43",x"06",x"80",x"D7",x"21",x"1C", -- 0x0248 + x"1F",x"22",x"05",x"41",x"22",x"05",x"42",x"CD", -- 0x0250 + x"49",x"00",x"AF",x"32",x"2F",x"40",x"C3",x"D8", -- 0x0258 + x"00",x"DD",x"7E",x"09",x"3D",x"B7",x"28",x"3B", -- 0x0260 + x"DD",x"77",x"09",x"DD",x"7E",x"0A",x"3C",x"DD", -- 0x0268 + x"77",x"0A",x"3A",x"14",x"40",x"EE",x"18",x"32", -- 0x0270 + x"14",x"40",x"CD",x"49",x"00",x"CD",x"00",x"25", -- 0x0278 + x"3E",x"E0",x"CD",x"4C",x"00",x"11",x"DD",x"02", -- 0x0280 + x"E7",x"3A",x"14",x"40",x"CB",x"5F",x"28",x"0E", -- 0x0288 + x"11",x"E6",x"02",x"E7",x"3E",x"C0",x"CD",x"4C", -- 0x0290 + x"00",x"CD",x"49",x"00",x"18",x"2E",x"11",x"F3", -- 0x0298 + x"02",x"18",x"F0",x"11",x"D0",x"02",x"E7",x"3E", -- 0x02A0 + x"C0",x"CD",x"4C",x"00",x"3A",x"14",x"40",x"CB", -- 0x02A8 + x"5F",x"28",x"06",x"11",x"E6",x"02",x"E7",x"18", -- 0x02B0 + x"03",x"11",x"F3",x"02",x"E7",x"3E",x"C0",x"CD", -- 0x02B8 + x"4C",x"00",x"CD",x"49",x"00",x"3A",x"14",x"40", -- 0x02C0 + x"CB",x"BF",x"18",x"A9",x"CD",x"12",x"01",x"C9", -- 0x02C8 + x"04",x"0C",x"08",x"47",x"41",x"4D",x"45",x"40", -- 0x02D0 + x"4F",x"56",x"45",x"52",x"FF",x"05",x"0C",x"0C", -- 0x02D8 + x"52",x"45",x"41",x"44",x"59",x"FF",x"05",x"0E", -- 0x02E0 + x"0A",x"50",x"4C",x"41",x"59",x"45",x"52",x"40", -- 0x02E8 + x"40",x"31",x"FF",x"05",x"0E",x"0A",x"50",x"4C", -- 0x02F0 + x"41",x"59",x"45",x"52",x"40",x"40",x"32",x"FF", -- 0x02F8 + x"08",x"3A",x"00",x"78",x"08",x"AF",x"32",x"01", -- 0x0300 + x"70",x"21",x"00",x"50",x"3E",x"10",x"06",x"00", -- 0x0308 + x"D7",x"D7",x"D7",x"D7",x"08",x"3A",x"00",x"78", -- 0x0310 + x"08",x"21",x"00",x"58",x"AF",x"D7",x"08",x"3A", -- 0x0318 + x"00",x"78",x"08",x"21",x"00",x"68",x"D7",x"21", -- 0x0320 + x"00",x"60",x"D7",x"08",x"3A",x"00",x"78",x"08", -- 0x0328 + x"21",x"00",x"70",x"D7",x"21",x"00",x"40",x"AF", -- 0x0330 + x"D7",x"D7",x"D7",x"06",x"F8",x"D7",x"3E",x"FF", -- 0x0338 + x"32",x"00",x"78",x"08",x"3A",x"00",x"78",x"08", -- 0x0340 + x"21",x"FF",x"FF",x"22",x"C0",x"40",x"3E",x"01", -- 0x0348 + x"32",x"01",x"70",x"11",x"00",x"04",x"E7",x"CD", -- 0x0350 + x"84",x"07",x"18",x"23",x"21",x"00",x"50",x"22", -- 0x0358 + x"18",x"40",x"21",x"50",x"40",x"06",x"30",x"D7", -- 0x0360 + x"3E",x"08",x"32",x"11",x"40",x"CD",x"6E",x"07", -- 0x0368 + x"3E",x"01",x"32",x"01",x"70",x"3E",x"E0",x"CD", -- 0x0370 + x"EF",x"05",x"C9",x"AF",x"32",x"0C",x"40",x"3A", -- 0x0378 + x"10",x"40",x"CB",x"D7",x"CB",x"C7",x"32",x"10", -- 0x0380 + x"40",x"CD",x"C1",x"0B",x"C3",x"00",x"1E",x"00", -- 0x0388 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0390 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0398 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F8 + x"06",x"00",x"00",x"53",x"43",x"4F",x"52",x"45", -- 0x0400 + x"31",x"40",x"40",x"40",x"40",x"48",x"49",x"40", -- 0x0408 + x"53",x"43",x"4F",x"52",x"45",x"40",x"40",x"40", -- 0x0410 + x"40",x"53",x"43",x"4F",x"52",x"45",x"32",x"FF", -- 0x0418 + x"05",x"01",x"00",x"00",x"41",x"06",x"05",x"01", -- 0x0420 + x"0B",x"34",x"40",x"06",x"05",x"01",x"16",x"00", -- 0x0428 + x"42",x"06",x"03",x"14",x"0D",x"06",x"40",x"02", -- 0x0430 + x"06",x"10",x"0B",x"43",x"52",x"45",x"44",x"49", -- 0x0438 + x"54",x"FF",x"05",x"08",x"04",x"50",x"52",x"45", -- 0x0440 + x"53",x"53",x"40",x"31",x"40",x"50",x"4C",x"41", -- 0x0448 + x"59",x"45",x"52",x"40",x"42",x"55",x"54",x"54", -- 0x0450 + x"4F",x"4E",x"FF",x"05",x"08",x"02",x"50",x"55", -- 0x0458 + x"53",x"48",x"40",x"31",x"40",x"4F",x"52",x"40", -- 0x0460 + x"32",x"40",x"50",x"4C",x"41",x"59",x"45",x"52", -- 0x0468 + x"40",x"42",x"55",x"54",x"54",x"4F",x"4E",x"FF", -- 0x0470 + x"05",x"0C",x"04",x"49",x"4E",x"53",x"45",x"52", -- 0x0478 + x"54",x"40",x"41",x"4E",x"4F",x"54",x"48",x"45", -- 0x0480 + x"52",x"40",x"43",x"4F",x"49",x"4E",x"FF",x"03", -- 0x0488 + x"14",x"0A",x"46",x"52",x"45",x"45",x"40",x"50", -- 0x0490 + x"4C",x"41",x"59",x"FF",x"02",x"1E",x"04",x"40", -- 0x0498 + x"40",x"41",x"52",x"4D",x"40",x"40",x"40",x"40", -- 0x04A0 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"31", -- 0x04A8 + x"39",x"38",x"31",x"FF",x"F5",x"C5",x"D5",x"E5", -- 0x04B0 + x"D5",x"DD",x"E1",x"DD",x"7E",x"01",x"87",x"06", -- 0x04B8 + x"00",x"4F",x"FD",x"21",x"00",x"43",x"FD",x"09", -- 0x04C0 + x"FD",x"36",x"00",x"00",x"DD",x"7E",x"00",x"FD", -- 0x04C8 + x"77",x"01",x"DD",x"46",x"02",x"3E",x"1B",x"90", -- 0x04D0 + x"B7",x"CA",x"E7",x"04",x"21",x"40",x"50",x"01", -- 0x04D8 + x"20",x"00",x"09",x"3D",x"C2",x"E2",x"04",x"DD", -- 0x04E0 + x"4E",x"01",x"06",x"00",x"09",x"01",x"E0",x"FF", -- 0x04E8 + x"DD",x"23",x"DD",x"23",x"DD",x"23",x"DD",x"7E", -- 0x04F0 + x"00",x"FE",x"FF",x"28",x"09",x"D6",x"30",x"77", -- 0x04F8 + x"09",x"DD",x"23",x"C3",x"F6",x"04",x"E1",x"D1", -- 0x0500 + x"C1",x"F1",x"C9",x"F5",x"C5",x"D5",x"E5",x"D5", -- 0x0508 + x"DD",x"E1",x"DD",x"7E",x"01",x"87",x"06",x"00", -- 0x0510 + x"4F",x"FD",x"21",x"00",x"43",x"FD",x"09",x"FD", -- 0x0518 + x"36",x"00",x"00",x"DD",x"7E",x"00",x"FD",x"77", -- 0x0520 + x"01",x"DD",x"46",x"02",x"3E",x"1B",x"90",x"B7", -- 0x0528 + x"CA",x"40",x"05",x"FD",x"21",x"40",x"50",x"01", -- 0x0530 + x"20",x"00",x"FD",x"09",x"3D",x"C2",x"3A",x"05", -- 0x0538 + x"DD",x"4E",x"01",x"06",x"00",x"FD",x"09",x"01", -- 0x0540 + x"E0",x"FF",x"DD",x"56",x"05",x"DD",x"66",x"04", -- 0x0548 + x"DD",x"6E",x"03",x"CB",x"42",x"CA",x"62",x"05", -- 0x0550 + x"7E",x"E6",x"0F",x"FD",x"77",x"00",x"23",x"C3", -- 0x0558 + x"6C",x"05",x"7E",x"0F",x"0F",x"0F",x"0F",x"E6", -- 0x0560 + x"0F",x"FD",x"77",x"00",x"FD",x"09",x"15",x"C2", -- 0x0568 + x"53",x"05",x"E1",x"D1",x"C1",x"F1",x"C9",x"7E", -- 0x0570 + x"B7",x"C8",x"3C",x"77",x"C9",x"CD",x"70",x"0C", -- 0x0578 + x"3E",x"1C",x"32",x"0B",x"40",x"2A",x"18",x"40", -- 0x0580 + x"3A",x"05",x"40",x"47",x"CB",x"43",x"20",x"20", -- 0x0588 + x"E6",x"1F",x"11",x"00",x"00",x"5F",x"19",x"3A", -- 0x0590 + x"0B",x"40",x"47",x"7D",x"E6",x"1F",x"FE",x"03", -- 0x0598 + x"38",x"29",x"B8",x"30",x"26",x"7C",x"FE",x"53", -- 0x05A0 + x"30",x"13",x"36",x"32",x"22",x"18",x"40",x"C9", -- 0x05A8 + x"DD",x"A6",x"06",x"F5",x"DD",x"7E",x"05",x"32", -- 0x05B0 + x"0B",x"40",x"F1",x"18",x"D5",x"7D",x"FE",x"BF", -- 0x05B8 + x"38",x"E8",x"3A",x"10",x"40",x"CB",x"87",x"32", -- 0x05C0 + x"10",x"40",x"C9",x"11",x"16",x"00",x"7D",x"E6", -- 0x05C8 + x"F0",x"6F",x"19",x"18",x"D0",x"3A",x"00",x"40", -- 0x05D0 + x"5F",x"3A",x"01",x"40",x"57",x"0F",x"AB",x"5F", -- 0x05D8 + x"ED",x"57",x"83",x"AA",x"07",x"07",x"07",x"AA", -- 0x05E0 + x"83",x"32",x"05",x"40",x"C9",x"3E",x"80",x"32", -- 0x05E8 + x"03",x"40",x"3A",x"03",x"40",x"B7",x"C8",x"18", -- 0x05F0 + x"F9",x"21",x"02",x"50",x"3E",x"10",x"06",x"1E", -- 0x05F8 + x"D7",x"11",x"02",x"00",x"19",x"7C",x"FE",x"54", -- 0x0600 + x"20",x"F2",x"AF",x"21",x"02",x"43",x"06",x"7D", -- 0x0608 + x"D7",x"C9",x"AF",x"21",x"40",x"40",x"06",x"A0", -- 0x0610 + x"D7",x"21",x"02",x"43",x"06",x"7C",x"D7",x"08", -- 0x0618 + x"3A",x"00",x"78",x"08",x"21",x"02",x"58",x"06", -- 0x0620 + x"7C",x"D7",x"21",x"00",x"60",x"06",x"07",x"D7", -- 0x0628 + x"21",x"00",x"68",x"06",x"07",x"D7",x"3E",x"FF", -- 0x0630 + x"32",x"00",x"78",x"C9",x"3A",x"00",x"60",x"CB", -- 0x0638 + x"47",x"28",x"06",x"3E",x"01",x"32",x"08",x"40", -- 0x0640 + x"C9",x"3A",x"08",x"40",x"B7",x"C8",x"3A",x"07", -- 0x0648 + x"40",x"3C",x"32",x"07",x"40",x"AF",x"32",x"08", -- 0x0650 + x"40",x"3A",x"10",x"40",x"E6",x"18",x"B7",x"C0", -- 0x0658 + x"CD",x"7A",x"06",x"3A",x"10",x"40",x"CB",x"57", -- 0x0660 + x"C0",x"AF",x"32",x"0C",x"40",x"3E",x"04",x"32", -- 0x0668 + x"10",x"40",x"AF",x"32",x"03",x"40",x"CD",x"EC", -- 0x0670 + x"0B",x"C9",x"CD",x"F9",x"05",x"CD",x"12",x"06", -- 0x0678 + x"11",x"66",x"0C",x"E7",x"C9",x"CD",x"3C",x"06", -- 0x0680 + x"3A",x"10",x"40",x"47",x"E6",x"18",x"5F",x"3A", -- 0x0688 + x"06",x"40",x"4F",x"3A",x"07",x"40",x"81",x"B7", -- 0x0690 + x"C8",x"3A",x"0F",x"00",x"B7",x"20",x"08",x"3A", -- 0x0698 + x"06",x"40",x"B7",x"20",x"02",x"18",x"0C",x"3A", -- 0x06A0 + x"00",x"68",x"E6",x"C0",x"FE",x"C0",x"28",x"7C", -- 0x06A8 + x"B7",x"28",x"70",x"7B",x"B7",x"3A",x"07",x"40", -- 0x06B0 + x"20",x"05",x"FE",x"01",x"CC",x"33",x"07",x"FE", -- 0x06B8 + x"02",x"20",x"0A",x"79",x"3C",x"27",x"32",x"06", -- 0x06C0 + x"40",x"AF",x"32",x"07",x"40",x"3A",x"2F",x"40", -- 0x06C8 + x"B7",x"C0",x"3A",x"06",x"40",x"FE",x"01",x"28", -- 0x06D0 + x"68",x"FE",x"02",x"D4",x"59",x"07",x"21",x"40", -- 0x06D8 + x"40",x"AF",x"06",x"14",x"D7",x"11",x"38",x"04", -- 0x06E0 + x"E7",x"11",x"9C",x"04",x"E7",x"3E",x"2B",x"32", -- 0x06E8 + x"9E",x"53",x"11",x"32",x"04",x"EF",x"3A",x"00", -- 0x06F0 + x"40",x"CB",x"5F",x"28",x"18",x"21",x"0F",x"43", -- 0x06F8 + x"06",x"10",x"34",x"23",x"23",x"10",x"FB",x"CD", -- 0x0700 + x"EC",x"0B",x"CD",x"84",x"07",x"3A",x"00",x"60", -- 0x0708 + x"CB",x"67",x"C2",x"15",x"07",x"3E",x"01",x"31", -- 0x0710 + x"00",x"44",x"32",x"01",x"70",x"AF",x"32",x"04", -- 0x0718 + x"70",x"18",x"FE",x"3A",x"07",x"40",x"FE",x"01", -- 0x0720 + x"28",x"99",x"18",x"A1",x"3E",x"04",x"32",x"06", -- 0x0728 + x"40",x"18",x"9A",x"CB",x"48",x"C0",x"3A",x"2F", -- 0x0730 + x"40",x"B7",x"20",x"18",x"11",x"78",x"04",x"18", -- 0x0738 + x"12",x"11",x"42",x"04",x"3A",x"00",x"68",x"CB", -- 0x0740 + x"47",x"28",x"05",x"3E",x"40",x"32",x"13",x"40", -- 0x0748 + x"E7",x"18",x"8B",x"E7",x"AF",x"32",x"04",x"70", -- 0x0750 + x"C9",x"11",x"5B",x"04",x"3A",x"00",x"68",x"CB", -- 0x0758 + x"47",x"20",x"E8",x"CB",x"4F",x"28",x"EC",x"3E", -- 0x0760 + x"C0",x"32",x"13",x"40",x"18",x"E5",x"FD",x"21", -- 0x0768 + x"50",x"40",x"FD",x"36",x"00",x"10",x"FD",x"36", -- 0x0770 + x"01",x"E0",x"FD",x"36",x"05",x"0D",x"3E",x"26", -- 0x0778 + x"32",x"44",x"40",x"C9",x"3A",x"00",x"70",x"E6", -- 0x0780 + x"03",x"C6",x"01",x"32",x"09",x"41",x"32",x"09", -- 0x0788 + x"42",x"C9",x"CD",x"E2",x"07",x"3A",x"43",x"40", -- 0x0790 + x"32",x"7D",x"43",x"32",x"79",x"43",x"3A",x"44", -- 0x0798 + x"40",x"4F",x"3A",x"0F",x"40",x"B7",x"28",x"03", -- 0x07A0 + x"79",x"2F",x"4F",x"79",x"32",x"7F",x"43",x"D6", -- 0x07A8 + x"05",x"32",x"7B",x"43",x"CD",x"00",x"0D",x"C9", -- 0x07B0 + x"3A",x"10",x"40",x"E6",x"18",x"C8",x"CB",x"5F", -- 0x07B8 + x"28",x"05",x"21",x"09",x"41",x"18",x"03",x"21", -- 0x07C0 + x"09",x"42",x"7E",x"3D",x"B7",x"C8",x"47",x"21", -- 0x07C8 + x"DF",x"50",x"11",x"E0",x"FF",x"36",x"FC",x"19", -- 0x07D0 + x"10",x"FB",x"C9",x"21",x"00",x"00",x"22",x"43", -- 0x07D8 + x"40",x"C9",x"FD",x"21",x"43",x"40",x"CD",x"A6", -- 0x07E0 + x"08",x"3A",x"42",x"40",x"FE",x"FA",x"20",x"06", -- 0x07E8 + x"F5",x"AF",x"32",x"05",x"68",x"F1",x"B7",x"28", -- 0x07F0 + x"04",x"3C",x"32",x"42",x"40",x"3A",x"10",x"40", -- 0x07F8 + x"CB",x"4F",x"20",x"D7",x"CD",x"0D",x"09",x"3A", -- 0x0800 + x"50",x"40",x"B7",x"C8",x"3A",x"41",x"40",x"B7", -- 0x0808 + x"20",x"4E",x"3A",x"10",x"40",x"5F",x"3A",x"0F", -- 0x0810 + x"40",x"57",x"CB",x"53",x"C2",x"9F",x"08",x"3A", -- 0x0818 + x"42",x"40",x"B7",x"20",x"14",x"7A",x"B7",x"20", -- 0x0820 + x"05",x"3A",x"00",x"60",x"18",x"07",x"CB",x"63", -- 0x0828 + x"28",x"F7",x"3A",x"00",x"68",x"CB",x"67",x"20", -- 0x0830 + x"16",x"3A",x"50",x"40",x"C6",x"07",x"32",x"43", -- 0x0838 + x"40",x"3A",x"51",x"40",x"2F",x"D6",x"06",x"32", -- 0x0840 + x"44",x"40",x"AF",x"32",x"05",x"68",x"C9",x"3E", -- 0x0848 + x"01",x"32",x"41",x"40",x"32",x"05",x"68",x"CD", -- 0x0850 + x"75",x"08",x"3E",x"F8",x"32",x"42",x"40",x"C9", -- 0x0858 + x"3A",x"50",x"40",x"C6",x"07",x"32",x"43",x"40", -- 0x0860 + x"3A",x"44",x"40",x"FE",x"D8",x"30",x"2A",x"C6", -- 0x0868 + x"08",x"32",x"44",x"40",x"C9",x"3A",x"10",x"40", -- 0x0870 + x"CB",x"5F",x"28",x"06",x"FD",x"21",x"00",x"41", -- 0x0878 + x"18",x"04",x"FD",x"21",x"00",x"42",x"FD",x"34", -- 0x0880 + x"04",x"11",x"B7",x"0C",x"1A",x"FD",x"BE",x"04", -- 0x0888 + x"C0",x"FD",x"36",x"04",x"00",x"FD",x"34",x"0A", -- 0x0890 + x"C9",x"AF",x"32",x"41",x"40",x"18",x"9A",x"3E", -- 0x0898 + x"01",x"32",x"41",x"40",x"18",x"93",x"E5",x"D5", -- 0x08A0 + x"FD",x"7E",x"00",x"2F",x"CB",x"3F",x"CB",x"3F", -- 0x08A8 + x"CB",x"3F",x"FD",x"77",x"02",x"FD",x"7E",x"01", -- 0x08B0 + x"2F",x"CB",x"3F",x"CB",x"3F",x"CB",x"3F",x"FD", -- 0x08B8 + x"77",x"03",x"21",x"00",x"00",x"11",x"20",x"00", -- 0x08C0 + x"FD",x"7E",x"02",x"B7",x"28",x"04",x"19",x"3D", -- 0x08C8 + x"18",x"F9",x"11",x"00",x"50",x"FD",x"7E",x"03", -- 0x08D0 + x"5F",x"19",x"11",x"01",x"00",x"B7",x"ED",x"52", -- 0x08D8 + x"FD",x"75",x"04",x"FD",x"74",x"05",x"7E",x"FD", -- 0x08E0 + x"77",x"06",x"B7",x"D1",x"E1",x"C9",x"3A",x"00", -- 0x08E8 + x"40",x"4F",x"DD",x"7E",x"05",x"E6",x"3E",x"57", -- 0x08F0 + x"DD",x"36",x"05",x"0E",x"CD",x"11",x"0A",x"DD", -- 0x08F8 + x"36",x"04",x"00",x"C3",x"83",x"09",x"3E",x"01", -- 0x0900 + x"32",x"1D",x"40",x"18",x"35",x"CD",x"70",x"0B", -- 0x0908 + x"CD",x"91",x"0A",x"3A",x"41",x"40",x"B7",x"C8", -- 0x0910 + x"FD",x"21",x"43",x"40",x"CD",x"A6",x"08",x"DD", -- 0x0918 + x"21",x"56",x"40",x"06",x"07",x"C5",x"DD",x"66", -- 0x0920 + x"03",x"DD",x"6E",x"02",x"DD",x"7E",x"05",x"E6", -- 0x0928 + x"3E",x"FE",x"10",x"38",x"58",x"FE",x"16",x"38", -- 0x0930 + x"CD",x"DD",x"7E",x"04",x"E6",x"3F",x"FE",x"18", -- 0x0938 + x"38",x"4B",x"DD",x"7E",x"01",x"4F",x"3A",x"0F", -- 0x0940 + x"40",x"B7",x"FD",x"7E",x"01",x"20",x"01",x"2F", -- 0x0948 + x"C6",x"04",x"91",x"FE",x"18",x"30",x"36",x"DD", -- 0x0950 + x"4E",x"00",x"3A",x"50",x"40",x"D6",x"08",x"91", -- 0x0958 + x"C6",x"06",x"FE",x"0C",x"30",x"27",x"CD",x"99", -- 0x0960 + x"08",x"CD",x"A6",x"08",x"3A",x"1D",x"40",x"B7", -- 0x0968 + x"C2",x"EE",x"08",x"DD",x"7E",x"05",x"E6",x"80", -- 0x0970 + x"4F",x"CD",x"58",x"00",x"E5",x"16",x"50",x"CD", -- 0x0978 + x"11",x"0A",x"E1",x"3E",x"01",x"32",x"1C",x"40", -- 0x0980 + x"3E",x"F0",x"32",x"03",x"40",x"AF",x"32",x"1D", -- 0x0988 + x"40",x"C1",x"11",x"06",x"00",x"DD",x"19",x"10", -- 0x0990 + x"8C",x"2A",x"47",x"40",x"7E",x"FE",x"10",x"20", -- 0x0998 + x"05",x"2B",x"7E",x"FE",x"10",x"C8",x"57",x"D5", -- 0x09A0 + x"FE",x"30",x"28",x"3F",x"FE",x"2C",x"28",x"3B", -- 0x09A8 + x"FE",x"F8",x"28",x"37",x"3D",x"77",x"3E",x"01", -- 0x09B0 + x"32",x"1C",x"40",x"3E",x"FC",x"32",x"03",x"40", -- 0x09B8 + x"FD",x"7E",x"00",x"D6",x"08",x"67",x"3A",x"0F", -- 0x09C0 + x"40",x"B7",x"FD",x"7E",x"01",x"20",x"01",x"2F", -- 0x09C8 + x"D6",x"18",x"6F",x"0E",x"0E",x"CD",x"46",x"0B", -- 0x09D0 + x"CD",x"99",x"08",x"D1",x"7A",x"E6",x"FC",x"FE", -- 0x09D8 + x"F8",x"28",x"04",x"CD",x"15",x"0A",x"C9",x"CD", -- 0x09E0 + x"11",x"0A",x"C9",x"36",x"10",x"18",x"C7",x"DD", -- 0x09E8 + x"E5",x"DD",x"21",x"87",x"0C",x"DD",x"7E",x"00", -- 0x09F0 + x"BA",x"20",x"07",x"DD",x"7E",x"01",x"DD",x"E1", -- 0x09F8 + x"C9",x"C9",x"DD",x"23",x"DD",x"23",x"18",x"ED", -- 0x0A00 + x"3A",x"14",x"40",x"0E",x"00",x"FD",x"E5",x"18", -- 0x0A08 + x"0B",x"0E",x"01",x"18",x"02",x"0E",x"00",x"FD", -- 0x0A10 + x"E5",x"3A",x"10",x"40",x"E6",x"18",x"B7",x"28", -- 0x0A18 + x"4B",x"CB",x"5F",x"20",x"66",x"FD",x"21",x"00", -- 0x0A20 + x"42",x"CD",x"EF",x"09",x"CB",x"41",x"20",x"0D", -- 0x0A28 + x"32",x"A8",x"40",x"32",x"39",x"40",x"5F",x"AF", -- 0x0A30 + x"32",x"38",x"40",x"18",x"0D",x"32",x"38",x"40", -- 0x0A38 + x"32",x"A9",x"40",x"5F",x"AF",x"32",x"39",x"40", -- 0x0A40 + x"18",x"34",x"FD",x"7E",x"02",x"B7",x"83",x"27", -- 0x0A48 + x"FD",x"77",x"02",x"30",x"17",x"FD",x"7E",x"01", -- 0x0A50 + x"B7",x"3C",x"27",x"FD",x"77",x"01",x"30",x"0C", -- 0x0A58 + x"FD",x"7E",x"00",x"3C",x"B7",x"27",x"FD",x"77", -- 0x0A60 + x"00",x"FD",x"34",x"0A",x"FD",x"E1",x"3A",x"10", -- 0x0A68 + x"40",x"E6",x"18",x"B7",x"C8",x"11",x"BE",x"0C", -- 0x0A70 + x"E7",x"11",x"B8",x"0C",x"EF",x"C9",x"FD",x"7E", -- 0x0A78 + x"01",x"B7",x"83",x"27",x"FD",x"77",x"01",x"30", -- 0x0A80 + x"E3",x"18",x"D5",x"FD",x"21",x"00",x"41",x"18", -- 0x0A88 + x"98",x"E5",x"D5",x"C5",x"FD",x"7E",x"05",x"DD", -- 0x0A90 + x"77",x"01",x"FD",x"7E",x"00",x"DD",x"77",x"00", -- 0x0A98 + x"C6",x"10",x"2F",x"CB",x"3F",x"CB",x"3F",x"CB", -- 0x0AA0 + x"3F",x"4F",x"FD",x"7E",x"01",x"DD",x"77",x"03", -- 0x0AA8 + x"C6",x"08",x"CB",x"3F",x"CB",x"3F",x"CB",x"3F", -- 0x0AB0 + x"47",x"21",x"00",x"00",x"11",x"20",x"00",x"79", -- 0x0AB8 + x"B7",x"28",x"04",x"19",x"3D",x"18",x"F9",x"11", -- 0x0AC0 + x"00",x"50",x"78",x"5F",x"19",x"11",x"01",x"00", -- 0x0AC8 + x"B7",x"ED",x"52",x"FD",x"75",x"02",x"FD",x"74", -- 0x0AD0 + x"03",x"C1",x"D1",x"E1",x"C9",x"DD",x"21",x"40", -- 0x0AD8 + x"43",x"11",x"04",x"00",x"FD",x"21",x"50",x"40", -- 0x0AE0 + x"06",x"08",x"CD",x"91",x"0A",x"FD",x"19",x"DD", -- 0x0AE8 + x"19",x"FD",x"23",x"FD",x"23",x"10",x"F3",x"C9", -- 0x0AF0 + x"DD",x"E5",x"FD",x"E5",x"E5",x"C5",x"F5",x"21", -- 0x0AF8 + x"56",x"40",x"06",x"23",x"AF",x"D7",x"3A",x"05", -- 0x0B00 + x"40",x"FE",x"30",x"38",x"04",x"FE",x"D0",x"38", -- 0x0B08 + x"02",x"3E",x"80",x"67",x"2E",x"00",x"DD",x"21", -- 0x0B10 + x"40",x"0B",x"DD",x"4E",x"00",x"06",x"06",x"CD", -- 0x0B18 + x"46",x"0B",x"DD",x"7E",x"00",x"FD",x"77",x"04", -- 0x0B20 + x"FD",x"77",x"05",x"DD",x"23",x"7C",x"C6",x"10", -- 0x0B28 + x"67",x"10",x"EC",x"3A",x"10",x"40",x"CB",x"C7", -- 0x0B30 + x"F1",x"C1",x"E1",x"FD",x"E1",x"DD",x"E1",x"C9", -- 0x0B38 + x"18",x"1C",x"1C",x"1C",x"1C",x"20",x"C5",x"06", -- 0x0B40 + x"07",x"FD",x"21",x"56",x"40",x"11",x"06",x"00", -- 0x0B48 + x"FD",x"7E",x"00",x"B7",x"20",x"13",x"FD",x"7E", -- 0x0B50 + x"05",x"B7",x"20",x"0D",x"FD",x"74",x"00",x"FD", -- 0x0B58 + x"75",x"01",x"FD",x"71",x"05",x"C1",x"3E",x"01", -- 0x0B60 + x"C9",x"FD",x"19",x"10",x"E3",x"AF",x"C1",x"C9", -- 0x0B68 + x"FD",x"21",x"50",x"40",x"06",x"08",x"11",x"06", -- 0x0B70 + x"00",x"FD",x"7E",x"00",x"B7",x"28",x"30",x"FD", -- 0x0B78 + x"7E",x"05",x"E6",x"FE",x"FE",x"0E",x"20",x"27", -- 0x0B80 + x"FE",x"3C",x"28",x"28",x"3A",x"03",x"40",x"B7", -- 0x0B88 + x"20",x"0F",x"AF",x"FD",x"77",x"00",x"FD",x"77", -- 0x0B90 + x"01",x"FD",x"77",x"05",x"32",x"1C",x"40",x"18", -- 0x0B98 + x"0E",x"FE",x"FC",x"30",x"06",x"FD",x"36",x"05", -- 0x0BA0 + x"0E",x"18",x"04",x"FD",x"36",x"05",x"0F",x"FD", -- 0x0BA8 + x"19",x"10",x"C6",x"C9",x"3A",x"03",x"40",x"FE", -- 0x0BB0 + x"E8",x"20",x"F4",x"FD",x"36",x"05",x"3D",x"18", -- 0x0BB8 + x"EE",x"3A",x"00",x"40",x"4F",x"3A",x"14",x"40", -- 0x0BC0 + x"E6",x"1C",x"B7",x"C8",x"CB",x"57",x"20",x"1C", -- 0x0BC8 + x"CB",x"5F",x"20",x"25",x"21",x"02",x"42",x"79", -- 0x0BD0 + x"CB",x"61",x"20",x"10",x"11",x"5C",x"0C",x"E7", -- 0x0BD8 + x"11",x"66",x"0C",x"E7",x"CD",x"0F",x"0C",x"CD", -- 0x0BE0 + x"B8",x"07",x"C9",x"C9",x"11",x"20",x"04",x"EF", -- 0x0BE8 + x"11",x"26",x"04",x"EF",x"11",x"2C",x"04",x"EF", -- 0x0BF0 + x"C9",x"21",x"02",x"41",x"CB",x"61",x"20",x"EC", -- 0x0BF8 + x"11",x"52",x"0C",x"E7",x"11",x"66",x"0C",x"E7", -- 0x0C00 + x"CD",x"0F",x"0C",x"CD",x"B8",x"07",x"C9",x"3A", -- 0x0C08 + x"10",x"40",x"CB",x"5F",x"28",x"06",x"DD",x"21", -- 0x0C10 + x"00",x"41",x"18",x"04",x"DD",x"21",x"00",x"42", -- 0x0C18 + x"3A",x"34",x"40",x"06",x"03",x"DD",x"BE",x"00", -- 0x0C20 + x"38",x"16",x"05",x"3A",x"35",x"40",x"DD",x"BE", -- 0x0C28 + x"01",x"38",x"0D",x"05",x"3A",x"36",x"40",x"DD", -- 0x0C30 + x"BE",x"02",x"38",x"04",x"CD",x"F9",x"00",x"C9", -- 0x0C38 + x"DD",x"E5",x"E1",x"23",x"23",x"11",x"36",x"40", -- 0x0C40 + x"7E",x"12",x"2B",x"1B",x"10",x"FA",x"CD",x"F9", -- 0x0C48 + x"00",x"C9",x"05",x"01",x"00",x"40",x"40",x"40", -- 0x0C50 + x"40",x"40",x"40",x"FF",x"05",x"01",x"16",x"40", -- 0x0C58 + x"40",x"40",x"40",x"40",x"40",x"FF",x"07",x"1F", -- 0x0C60 + x"16",x"40",x"40",x"40",x"40",x"40",x"40",x"FF", -- 0x0C68 + x"AB",x"3A",x"14",x"40",x"E6",x"18",x"C8",x"1E", -- 0x0C70 + x"01",x"CB",x"5F",x"28",x"05",x"DD",x"21",x"00", -- 0x0C78 + x"41",x"C9",x"DD",x"21",x"00",x"42",x"C9",x"32", -- 0x0C80 + x"40",x"31",x"30",x"30",x"20",x"2F",x"40",x"2E", -- 0x0C88 + x"80",x"2D",x"60",x"2C",x"40",x"F8",x"09",x"F9", -- 0x0C90 + x"09",x"FA",x"09",x"FB",x"09",x"00",x"00",x"00", -- 0x0C98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CA0 + x"00",x"50",x"01",x"10",x"02",x"11",x"04",x"12", -- 0x0CA8 + x"06",x"13",x"06",x"14",x"50",x"15",x"50",x"60", -- 0x0CB0 + x"07",x"1F",x"0C",x"38",x"40",x"04",x"07",x"1F", -- 0x0CB8 + x"02",x"48",x"49",x"54",x"40",x"56",x"41",x"4C", -- 0x0CC0 + x"55",x"45",x"FF",x"2A",x"00",x"40",x"23",x"22", -- 0x0CC8 + x"00",x"40",x"3A",x"10",x"40",x"B7",x"CC",x"EC", -- 0x0CD0 + x"0B",x"C9",x"04",x"32",x"01",x"40",x"C9",x"CB", -- 0x0CD8 + x"BF",x"18",x"F8",x"00",x"00",x"00",x"00",x"00", -- 0x0CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF8 + x"FD",x"21",x"50",x"40",x"0E",x"FF",x"3A",x"10", -- 0x0D00 + x"40",x"47",x"E6",x"1C",x"B7",x"C8",x"CB",x"50", -- 0x0D08 + x"C2",x"CE",x"0D",x"0E",x"00",x"CB",x"58",x"28", -- 0x0D10 + x"05",x"CD",x"80",x"0D",x"18",x"0E",x"3A",x"0F", -- 0x0D18 + x"40",x"B7",x"20",x"05",x"CD",x"80",x"0D",x"18", -- 0x0D20 + x"03",x"CD",x"A6",x"0D",x"79",x"CD",x"43",x"0D", -- 0x0D28 + x"CD",x"46",x"0E",x"CD",x"62",x"0D",x"3A",x"32", -- 0x0D30 + x"40",x"B7",x"20",x"03",x"CD",x"62",x"0D",x"FD", -- 0x0D38 + x"71",x"04",x"C9",x"FD",x"7E",x"00",x"FE",x"14", -- 0x0D40 + x"30",x"02",x"CB",x"A1",x"FE",x"E2",x"38",x"02", -- 0x0D48 + x"CB",x"99",x"FD",x"7E",x"01",x"FE",x"A0",x"30", -- 0x0D50 + x"02",x"CB",x"B1",x"FE",x"E6",x"38",x"02",x"CB", -- 0x0D58 + x"A9",x"C9",x"CB",x"59",x"28",x"05",x"FD",x"34", -- 0x0D60 + x"00",x"18",x"07",x"CB",x"61",x"28",x"03",x"FD", -- 0x0D68 + x"35",x"00",x"CB",x"69",x"28",x"03",x"FD",x"34", -- 0x0D70 + x"01",x"CB",x"71",x"C8",x"FD",x"35",x"01",x"C9", -- 0x0D78 + x"3A",x"00",x"60",x"CB",x"57",x"28",x"02",x"CB", -- 0x0D80 + x"E1",x"CB",x"5F",x"28",x"02",x"CB",x"D9",x"CB", -- 0x0D88 + x"77",x"28",x"02",x"CB",x"E9",x"CB",x"7F",x"28", -- 0x0D90 + x"02",x"CB",x"F1",x"79",x"B7",x"28",x"04",x"06", -- 0x0D98 + x"01",x"79",x"C9",x"06",x"00",x"C9",x"3A",x"00", -- 0x0DA0 + x"68",x"CB",x"57",x"28",x"02",x"CB",x"E1",x"CB", -- 0x0DA8 + x"5F",x"28",x"02",x"CB",x"D9",x"CB",x"6F",x"28", -- 0x0DB0 + x"02",x"CB",x"E9",x"3A",x"00",x"60",x"CB",x"4F", -- 0x0DB8 + x"28",x"02",x"CB",x"F1",x"79",x"B7",x"28",x"03", -- 0x0DC0 + x"06",x"01",x"C9",x"06",x"00",x"C9",x"FD",x"4E", -- 0x0DC8 + x"04",x"FD",x"7E",x"00",x"FE",x"0C",x"30",x"02", -- 0x0DD0 + x"CB",x"F1",x"FE",x"E0",x"38",x"02",x"CB",x"B1", -- 0x0DD8 + x"FD",x"7E",x"01",x"FE",x"80",x"30",x"02",x"CB", -- 0x0DE0 + x"E9",x"FE",x"E0",x"38",x"02",x"CB",x"A9",x"3A", -- 0x0DE8 + x"00",x"40",x"CB",x"77",x"28",x"12",x"CB",x"71", -- 0x0DF0 + x"28",x"08",x"FD",x"34",x"00",x"FD",x"34",x"00", -- 0x0DF8 + x"18",x"06",x"FD",x"35",x"00",x"FD",x"35",x"00", -- 0x0E00 + x"CB",x"69",x"28",x"05",x"FD",x"34",x"01",x"18", -- 0x0E08 + x"03",x"FD",x"35",x"01",x"FD",x"71",x"04",x"C9", -- 0x0E10 + x"C5",x"7D",x"E6",x"1F",x"47",x"AF",x"C6",x"08", -- 0x0E18 + x"10",x"FC",x"57",x"7D",x"E6",x"E0",x"CB",x"3F", -- 0x0E20 + x"CB",x"3F",x"CB",x"3F",x"CB",x"3F",x"CB",x"3F", -- 0x0E28 + x"4F",x"7C",x"E6",x"03",x"CB",x"27",x"CB",x"27", -- 0x0E30 + x"CB",x"27",x"B1",x"47",x"AF",x"D6",x"08",x"10", -- 0x0E38 + x"FC",x"D6",x"1C",x"5F",x"C1",x"C9",x"FD",x"66", -- 0x0E40 + x"03",x"FD",x"6E",x"02",x"E5",x"23",x"11",x"20", -- 0x0E48 + x"00",x"7E",x"FE",x"10",x"28",x"09",x"CD",x"DA", -- 0x0E50 + x"0E",x"C6",x"10",x"FE",x"08",x"38",x"11",x"23", -- 0x0E58 + x"7E",x"2B",x"FE",x"10",x"28",x"0C",x"23",x"CD", -- 0x0E60 + x"DA",x"0E",x"C6",x"10",x"FE",x"08",x"30",x"02", -- 0x0E68 + x"CB",x"99",x"11",x"40",x"00",x"19",x"7E",x"FE", -- 0x0E70 + x"10",x"28",x"07",x"CD",x"DA",x"0E",x"FE",x"E8", -- 0x0E78 + x"30",x"0F",x"23",x"7E",x"2B",x"FE",x"10",x"28", -- 0x0E80 + x"0A",x"23",x"CD",x"DA",x"0E",x"FE",x"E8",x"38", -- 0x0E88 + x"02",x"CB",x"A1",x"2B",x"7E",x"FE",x"10",x"28", -- 0x0E90 + x"09",x"CD",x"E2",x"0E",x"FE",x"FE",x"38",x"02", -- 0x0E98 + x"CB",x"B1",x"11",x"E0",x"FF",x"19",x"7E",x"FE", -- 0x0EA0 + x"10",x"28",x"09",x"CD",x"E2",x"0E",x"FE",x"FE", -- 0x0EA8 + x"38",x"02",x"CB",x"B1",x"E1",x"11",x"20",x"00", -- 0x0EB0 + x"19",x"23",x"23",x"7E",x"FE",x"10",x"28",x"09", -- 0x0EB8 + x"CD",x"E2",x"0E",x"FE",x"0C",x"30",x"02",x"CB", -- 0x0EC0 + x"A9",x"11",x"20",x"00",x"19",x"7E",x"FE",x"10", -- 0x0EC8 + x"C8",x"CD",x"E2",x"0E",x"FE",x"0C",x"D0",x"CB", -- 0x0ED0 + x"A9",x"C9",x"CD",x"18",x"0E",x"7B",x"FD",x"96", -- 0x0ED8 + x"00",x"C9",x"CD",x"18",x"0E",x"7A",x"FD",x"96", -- 0x0EE0 + x"01",x"ED",x"53",x"90",x"40",x"32",x"92",x"40", -- 0x0EE8 + x"C9",x"B1",x"E1",x"11",x"20",x"00",x"19",x"23", -- 0x0EF0 + x"23",x"7E",x"FE",x"10",x"28",x"09",x"CD",x"20", -- 0x0EF8 + x"0F",x"FE",x"0C",x"30",x"02",x"CB",x"A9",x"11", -- 0x0F00 + x"20",x"00",x"19",x"7E",x"FE",x"10",x"C8",x"CD", -- 0x0F08 + x"20",x"0F",x"FE",x"0C",x"D0",x"CB",x"A9",x"C9", -- 0x0F10 + x"CD",x"56",x"0E",x"7B",x"FD",x"96",x"00",x"C9", -- 0x0F18 + x"CD",x"56",x"0E",x"7A",x"FD",x"96",x"01",x"ED", -- 0x0F20 + x"53",x"90",x"40",x"32",x"92",x"40",x"C9",x"00", -- 0x0F28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F38 + x"0F",x"FE",x"0C",x"30",x"02",x"CB",x"A9",x"11", -- 0x0F40 + x"20",x"00",x"19",x"7E",x"FE",x"10",x"C8",x"CD", -- 0x0F48 + x"20",x"0F",x"FE",x"0C",x"D0",x"CB",x"A9",x"C9", -- 0x0F50 + x"CD",x"56",x"0E",x"7B",x"FD",x"96",x"00",x"C9", -- 0x0F58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FF8 + x"CD",x"45",x"15",x"CD",x"98",x"13",x"AF",x"21", -- 0x1000 + x"A0",x"40",x"06",x"04",x"D7",x"32",x"0C",x"40", -- 0x1008 + x"3A",x"10",x"40",x"E6",x"1C",x"C8",x"FD",x"21", -- 0x1010 + x"56",x"40",x"06",x"07",x"FD",x"7E",x"05",x"4F", -- 0x1018 + x"E6",x"3E",x"FE",x"10",x"CA",x"00",x"26",x"FE", -- 0x1020 + x"14",x"CA",x"8E",x"26",x"FE",x"12",x"CA",x"0C", -- 0x1028 + x"27",x"79",x"E6",x"3F",x"FE",x"18",x"38",x"09", -- 0x1030 + x"FE",x"30",x"38",x"10",x"FE",x"38",x"DA",x"BF", -- 0x1038 + x"11",x"11",x"06",x"00",x"FD",x"19",x"10",x"D4", -- 0x1040 + x"CD",x"7F",x"15",x"C9",x"3A",x"0C",x"40",x"3C", -- 0x1048 + x"32",x"0C",x"40",x"FD",x"7E",x"04",x"E6",x"3F", -- 0x1050 + x"FE",x"18",x"CA",x"19",x"14",x"FE",x"24",x"CA", -- 0x1058 + x"19",x"14",x"FE",x"28",x"CA",x"19",x"14",x"FD", -- 0x1060 + x"7E",x"FF",x"E6",x"3F",x"FE",x"18",x"38",x"1E", -- 0x1068 + x"FE",x"30",x"30",x"1A",x"FD",x"7E",x"05",x"E6", -- 0x1070 + x"80",x"B7",x"FD",x"7E",x"FB",x"FD",x"77",x"01", -- 0x1078 + x"FD",x"7E",x"FA",x"20",x"04",x"C6",x"10",x"18", -- 0x1080 + x"02",x"D6",x"10",x"FD",x"77",x"00",x"FD",x"7E", -- 0x1088 + x"01",x"FE",x"A0",x"30",x"08",x"FD",x"7E",x"04", -- 0x1090 + x"CB",x"BF",x"FD",x"77",x"04",x"FD",x"7E",x"01", -- 0x1098 + x"FE",x"E8",x"38",x"0D",x"FD",x"7E",x"04",x"CB", -- 0x10A0 + x"FF",x"FD",x"77",x"04",x"3E",x"01",x"32",x"13", -- 0x10A8 + x"40",x"79",x"E6",x"80",x"B7",x"FD",x"7E",x"00", -- 0x10B0 + x"C2",x"6F",x"11",x"5F",x"FD",x"7E",x"04",x"E6", -- 0x10B8 + x"3F",x"FE",x"18",x"28",x"1E",x"FE",x"24",x"28", -- 0x10C0 + x"1A",x"FE",x"28",x"28",x"16",x"3A",x"16",x"40", -- 0x10C8 + x"B7",x"20",x"49",x"FD",x"7E",x"FB",x"FD",x"77", -- 0x10D0 + x"01",x"FD",x"7E",x"FA",x"C6",x"10",x"FD",x"77", -- 0x10D8 + x"00",x"18",x"21",x"3A",x"12",x"40",x"B7",x"C4", -- 0x10E0 + x"31",x"11",x"FD",x"7E",x"00",x"FE",x"18",x"DC", -- 0x10E8 + x"31",x"11",x"FD",x"66",x"03",x"FD",x"6E",x"02", -- 0x10F0 + x"11",x"40",x"00",x"19",x"7E",x"FE",x"10",x"C4", -- 0x10F8 + x"31",x"11",x"18",x"18",x"FD",x"7E",x"05",x"E6", -- 0x1100 + x"FC",x"4F",x"3A",x"00",x"40",x"E6",x"18",x"CB", -- 0x1108 + x"3F",x"CB",x"3F",x"CB",x"3F",x"B1",x"FD",x"77", -- 0x1110 + x"05",x"C3",x"36",x"13",x"FD",x"35",x"00",x"FD", -- 0x1118 + x"35",x"00",x"18",x"E0",x"3E",x"01",x"32",x"16", -- 0x1120 + x"40",x"18",x"1C",x"AF",x"32",x"16",x"40",x"18", -- 0x1128 + x"16",x"FD",x"7E",x"04",x"5F",x"E6",x"3C",x"FE", -- 0x1130 + x"18",x"28",x"E9",x"FE",x"28",x"28",x"E5",x"FE", -- 0x1138 + x"20",x"28",x"E8",x"FE",x"2C",x"28",x"E4",x"7B", -- 0x1140 + x"E6",x"80",x"57",x"FD",x"7E",x"05",x"E6",x"80", -- 0x1148 + x"4F",x"7B",x"E6",x"7F",x"CB",x"7A",x"20",x"08", -- 0x1150 + x"CD",x"1C",x"12",x"B1",x"FD",x"77",x"05",x"C9", -- 0x1158 + x"CD",x"16",x"12",x"F5",x"FD",x"7E",x"01",x"D6", -- 0x1160 + x"08",x"FD",x"77",x"01",x"F1",x"18",x"EC",x"5F", -- 0x1168 + x"FD",x"7E",x"04",x"E6",x"3F",x"FE",x"18",x"28", -- 0x1170 + x"1F",x"FE",x"24",x"28",x"1B",x"FE",x"28",x"28", -- 0x1178 + x"17",x"3A",x"16",x"40",x"B7",x"20",x"2C",x"FD", -- 0x1180 + x"7E",x"FB",x"FD",x"77",x"01",x"FD",x"7E",x"FA", -- 0x1188 + x"D6",x"10",x"FD",x"77",x"00",x"C3",x"04",x"11", -- 0x1190 + x"3A",x"12",x"40",x"B7",x"C4",x"31",x"11",x"FD", -- 0x1198 + x"7E",x"00",x"FE",x"D8",x"D4",x"31",x"11",x"FD", -- 0x11A0 + x"66",x"03",x"FD",x"6E",x"02",x"7E",x"FE",x"10", -- 0x11A8 + x"C4",x"31",x"11",x"FD",x"34",x"00",x"FD",x"34", -- 0x11B0 + x"00",x"FD",x"7E",x"00",x"C3",x"04",x"11",x"3A", -- 0x11B8 + x"0C",x"40",x"3C",x"32",x"0C",x"40",x"3A",x"00", -- 0x11C0 + x"40",x"E6",x"02",x"6F",x"FD",x"7E",x"04",x"E6", -- 0x11C8 + x"80",x"B7",x"20",x"21",x"FD",x"7E",x"05",x"4F", -- 0x11D0 + x"E6",x"80",x"5F",x"79",x"E6",x"3F",x"FE",x"33", -- 0x11D8 + x"CA",x"64",x"12",x"FE",x"37",x"D2",x"64",x"12", -- 0x11E0 + x"CB",x"4D",x"CA",x"41",x"10",x"3C",x"B3",x"FD", -- 0x11E8 + x"77",x"05",x"C3",x"41",x"10",x"FD",x"7E",x"05", -- 0x11F0 + x"4F",x"E6",x"C0",x"5F",x"79",x"E6",x"3F",x"FE", -- 0x11F8 + x"30",x"CA",x"64",x"12",x"FE",x"34",x"CA",x"64", -- 0x1200 + x"12",x"CB",x"4D",x"CA",x"41",x"10",x"3D",x"B3", -- 0x1208 + x"FD",x"77",x"05",x"C3",x"41",x"10",x"DD",x"21", -- 0x1210 + x"44",x"12",x"18",x"04",x"DD",x"21",x"36",x"12", -- 0x1218 + x"C5",x"06",x"07",x"E6",x"FC",x"DD",x"BE",x"00", -- 0x1220 + x"28",x"07",x"DD",x"23",x"DD",x"23",x"10",x"F5", -- 0x1228 + x"C9",x"DD",x"7E",x"01",x"C1",x"C9",x"18",x"30", -- 0x1230 + x"1C",x"34",x"20",x"34",x"24",x"30",x"28",x"30", -- 0x1238 + x"2C",x"30",x"00",x"00",x"18",x"73",x"1C",x"77", -- 0x1240 + x"20",x"77",x"24",x"73",x"28",x"77",x"2C",x"77", -- 0x1248 + x"00",x"00",x"FD",x"7E",x"04",x"CB",x"FF",x"FD", -- 0x1250 + x"77",x"04",x"C9",x"FD",x"7E",x"04",x"CB",x"BF", -- 0x1258 + x"FD",x"77",x"04",x"C9",x"FD",x"7E",x"05",x"E6", -- 0x1260 + x"3F",x"FE",x"18",x"CC",x"52",x"12",x"FE",x"24", -- 0x1268 + x"CC",x"52",x"12",x"FE",x"28",x"CC",x"52",x"12", -- 0x1270 + x"FE",x"37",x"CC",x"5B",x"12",x"FE",x"33",x"CC", -- 0x1278 + x"5B",x"12",x"FD",x"7E",x"0A",x"E6",x"3F",x"FE", -- 0x1280 + x"19",x"38",x"18",x"FE",x"24",x"28",x"14",x"FE", -- 0x1288 + x"28",x"28",x"10",x"FE",x"38",x"30",x"0C",x"FD", -- 0x1290 + x"7E",x"00",x"FD",x"77",x"06",x"FD",x"7E",x"01", -- 0x1298 + x"FD",x"77",x"07",x"FD",x"7E",x"04",x"5F",x"E6", -- 0x12A0 + x"80",x"57",x"FD",x"7E",x"05",x"E6",x"80",x"4F", -- 0x12A8 + x"FD",x"7E",x"04",x"E6",x"3F",x"FE",x"18",x"28", -- 0x12B0 + x"0A",x"FE",x"24",x"28",x"06",x"FE",x"28",x"28", -- 0x12B8 + x"02",x"18",x"0C",x"FD",x"7E",x"00",x"32",x"1E", -- 0x12C0 + x"40",x"FD",x"7E",x"01",x"32",x"1F",x"40",x"FD", -- 0x12C8 + x"7E",x"0A",x"E6",x"3F",x"FE",x"19",x"38",x"2D", -- 0x12D0 + x"FE",x"24",x"28",x"29",x"FE",x"28",x"28",x"25", -- 0x12D8 + x"FE",x"38",x"30",x"21",x"3A",x"1E",x"40",x"FD", -- 0x12E0 + x"77",x"06",x"3A",x"1F",x"40",x"FD",x"77",x"07", -- 0x12E8 + x"FD",x"7E",x"0A",x"E6",x"3F",x"CB",x"7A",x"28", -- 0x12F0 + x"05",x"CD",x"16",x"12",x"18",x"03",x"CD",x"1C", -- 0x12F8 + x"12",x"B1",x"FD",x"77",x"0B",x"3A",x"12",x"40", -- 0x1300 + x"B7",x"20",x"1A",x"FD",x"7E",x"04",x"E6",x"3F", -- 0x1308 + x"B1",x"EE",x"80",x"FD",x"77",x"05",x"3A",x"1F", -- 0x1310 + x"40",x"CB",x"7A",x"20",x"02",x"C6",x"08",x"FD", -- 0x1318 + x"77",x"01",x"C3",x"41",x"10",x"FD",x"7E",x"05", -- 0x1320 + x"E6",x"3F",x"CB",x"7A",x"20",x"05",x"CD",x"1C", -- 0x1328 + x"12",x"18",x"DD",x"CD",x"16",x"12",x"FD",x"7E", -- 0x1330 + x"05",x"E6",x"3F",x"FE",x"18",x"CA",x"4B",x"13", -- 0x1338 + x"FE",x"24",x"28",x"07",x"FE",x"28",x"28",x"03", -- 0x1340 + x"C3",x"41",x"10",x"D9",x"DD",x"21",x"50",x"40", -- 0x1348 + x"06",x"08",x"DD",x"7E",x"05",x"E6",x"3C",x"FE", -- 0x1350 + x"18",x"28",x"0A",x"FE",x"24",x"28",x"06",x"FE", -- 0x1358 + x"28",x"28",x"02",x"18",x"28",x"DD",x"E5",x"E1", -- 0x1360 + x"FD",x"E5",x"D1",x"B7",x"ED",x"52",x"28",x"1D", -- 0x1368 + x"FD",x"66",x"01",x"FD",x"6E",x"00",x"DD",x"56", -- 0x1370 + x"01",x"DD",x"5E",x"00",x"B7",x"ED",x"52",x"20", -- 0x1378 + x"0C",x"FD",x"7E",x"05",x"E6",x"80",x"4F",x"3E", -- 0x1380 + x"30",x"A9",x"FD",x"77",x"05",x"11",x"08",x"00", -- 0x1388 + x"DD",x"19",x"10",x"BE",x"D9",x"C3",x"41",x"10", -- 0x1390 + x"3A",x"10",x"40",x"E6",x"1C",x"C8",x"CB",x"4F", -- 0x1398 + x"C0",x"FD",x"21",x"50",x"40",x"FD",x"7E",x"00", -- 0x13A0 + x"FE",x"10",x"D8",x"DD",x"21",x"56",x"40",x"11", -- 0x13A8 + x"06",x"00",x"06",x"07",x"DD",x"7E",x"05",x"E6", -- 0x13B0 + x"3F",x"FE",x"10",x"38",x"27",x"FE",x"16",x"38", -- 0x13B8 + x"0D",x"DD",x"7E",x"04",x"E6",x"3F",x"FE",x"18", -- 0x13C0 + x"38",x"1A",x"FE",x"3C",x"30",x"16",x"DD",x"7E", -- 0x13C8 + x"00",x"B7",x"28",x"10",x"FD",x"7E",x"00",x"D6", -- 0x13D0 + x"04",x"4F",x"DD",x"7E",x"00",x"91",x"C6",x"08", -- 0x13D8 + x"FE",x"10",x"38",x"08",x"11",x"06",x"00",x"DD", -- 0x13E0 + x"19",x"10",x"C9",x"C9",x"DD",x"7E",x"01",x"4F", -- 0x13E8 + x"FD",x"7E",x"01",x"C6",x"04",x"91",x"C6",x"08", -- 0x13F0 + x"FE",x"10",x"30",x"E8",x"3A",x"10",x"40",x"32", -- 0x13F8 + x"14",x"40",x"3E",x"01",x"32",x"1C",x"40",x"3E", -- 0x1400 + x"02",x"32",x"10",x"40",x"3E",x"E0",x"32",x"03", -- 0x1408 + x"40",x"3E",x"3D",x"FD",x"77",x"05",x"C3",x"B5", -- 0x1410 + x"17",x"FD",x"E5",x"DD",x"E5",x"D9",x"FD",x"E5", -- 0x1418 + x"DD",x"E1",x"3E",x"01",x"32",x"09",x"40",x"11", -- 0x1420 + x"06",x"00",x"DD",x"19",x"DD",x"7E",x"05",x"E6", -- 0x1428 + x"3F",x"FE",x"18",x"38",x"15",x"FE",x"30",x"30", -- 0x1430 + x"11",x"FD",x"6E",x"02",x"FD",x"66",x"03",x"DD", -- 0x1438 + x"5E",x"02",x"DD",x"56",x"03",x"B7",x"ED",x"52", -- 0x1440 + x"28",x"12",x"DD",x"E5",x"D1",x"21",x"7F",x"40", -- 0x1448 + x"ED",x"52",x"30",x"D3",x"D9",x"DD",x"E1",x"FD", -- 0x1450 + x"E1",x"C3",x"8E",x"10",x"FD",x"7E",x"05",x"E6", -- 0x1458 + x"80",x"EE",x"80",x"C6",x"30",x"FD",x"77",x"05", -- 0x1460 + x"18",x"E0",x"3A",x"13",x"40",x"CB",x"77",x"C8", -- 0x1468 + x"CB",x"B7",x"32",x"13",x"40",x"AF",x"32",x"10", -- 0x1470 + x"40",x"3E",x"01",x"32",x"2F",x"40",x"32",x"01", -- 0x1478 + x"70",x"31",x"00",x"44",x"AF",x"21",x"00",x"60", -- 0x1480 + x"06",x"00",x"D7",x"21",x"00",x"68",x"D7",x"21", -- 0x1488 + x"00",x"00",x"22",x"06",x"70",x"21",x"16",x"1F", -- 0x1490 + x"22",x"05",x"41",x"22",x"05",x"42",x"3E",x"01", -- 0x1498 + x"32",x"08",x"41",x"CD",x"49",x"00",x"3A",x"13", -- 0x14A0 + x"40",x"CB",x"7F",x"3A",x"06",x"40",x"20",x"0C", -- 0x14A8 + x"3D",x"27",x"32",x"06",x"40",x"3E",x"08",x"32", -- 0x14B0 + x"14",x"40",x"18",x"0B",x"3D",x"3D",x"27",x"32", -- 0x14B8 + x"06",x"40",x"3E",x"88",x"32",x"14",x"40",x"3A", -- 0x14C0 + x"13",x"40",x"3E",x"C0",x"CD",x"4C",x"00",x"11", -- 0x14C8 + x"00",x"01",x"E7",x"3E",x"80",x"CD",x"4C",x"00", -- 0x14D0 + x"CD",x"49",x"00",x"21",x"50",x"40",x"06",x"30", -- 0x14D8 + x"AF",x"D7",x"21",x"00",x"41",x"CD",x"61",x"27", -- 0x14E0 + x"21",x"00",x"42",x"CD",x"61",x"27",x"AF",x"32", -- 0x14E8 + x"0A",x"41",x"32",x"0A",x"42",x"3A",x"10",x"40", -- 0x14F0 + x"CB",x"C7",x"32",x"10",x"40",x"3E",x"80",x"CD", -- 0x14F8 + x"4C",x"00",x"CD",x"4F",x"00",x"3A",x"14",x"40", -- 0x1500 + x"32",x"10",x"40",x"3E",x"01",x"32",x"04",x"70", -- 0x1508 + x"3A",x"10",x"40",x"CB",x"47",x"20",x"23",x"21", -- 0x1510 + x"40",x"50",x"11",x"00",x"00",x"7E",x"E6",x"FC", -- 0x1518 + x"FE",x"30",x"20",x"01",x"1C",x"23",x"7C",x"FE", -- 0x1520 + x"54",x"20",x"F2",x"7B",x"32",x"0A",x"40",x"B7", -- 0x1528 + x"20",x"08",x"3A",x"10",x"40",x"CB",x"C7",x"32", -- 0x1530 + x"10",x"40",x"CD",x"F3",x"00",x"CD",x"98",x"13", -- 0x1538 + x"CD",x"E0",x"00",x"18",x"CB",x"3A",x"0C",x"40", -- 0x1540 + x"B7",x"C0",x"3A",x"10",x"40",x"E6",x"1C",x"B7", -- 0x1548 + x"C8",x"21",x"A0",x"40",x"7E",x"4F",x"23",x"7E", -- 0x1550 + x"81",x"4F",x"23",x"7E",x"81",x"B7",x"C0",x"3E", -- 0x1558 + x"FF",x"32",x"00",x"78",x"CD",x"5E",x"00",x"CD", -- 0x1560 + x"57",x"18",x"3E",x"06",x"32",x"0C",x"40",x"FD", -- 0x1568 + x"21",x"7A",x"40",x"FD",x"7E",x"04",x"FE",x"18", -- 0x1570 + x"D8",x"FE",x"2F",x"D0",x"C3",x"26",x"17",x"FD", -- 0x1578 + x"21",x"56",x"40",x"21",x"00",x"00",x"06",x"07", -- 0x1580 + x"FD",x"7E",x"04",x"E6",x"3F",x"FE",x"1C",x"28", -- 0x1588 + x"25",x"FE",x"20",x"28",x"21",x"FE",x"2C",x"28", -- 0x1590 + x"1D",x"FE",x"18",x"28",x"1D",x"FE",x"28",x"28", -- 0x1598 + x"19",x"11",x"06",x"00",x"FD",x"19",x"10",x"E0", -- 0x15A0 + x"7C",x"B7",x"C8",x"7D",x"B7",x"C0",x"21",x"56", -- 0x15A8 + x"40",x"06",x"2C",x"AF",x"D7",x"C9",x"26",x"01", -- 0x15B0 + x"18",x"E7",x"2E",x"01",x"18",x"E3",x"36",x"2E", -- 0x15B8 + x"D9",x"DD",x"66",x"00",x"DD",x"6E",x"01",x"0E", -- 0x15C0 + x"0E",x"CD",x"5B",x"00",x"DD",x"7E",x"04",x"E6", -- 0x15C8 + x"3F",x"32",x"24",x"40",x"DD",x"7E",x"FE",x"E6", -- 0x15D0 + x"3F",x"32",x"25",x"40",x"DD",x"7E",x"0A",x"E6", -- 0x15D8 + x"3F",x"32",x"26",x"40",x"21",x"24",x"40",x"7E", -- 0x15E0 + x"FE",x"20",x"28",x"1C",x"FE",x"2C",x"28",x"0E", -- 0x15E8 + x"FE",x"24",x"28",x"14",x"23",x"36",x"FF",x"23", -- 0x15F0 + x"CD",x"10",x"16",x"77",x"18",x"2A",x"23",x"CD", -- 0x15F8 + x"10",x"16",x"77",x"23",x"36",x"FF",x"18",x"20", -- 0x1600 + x"23",x"36",x"FF",x"23",x"36",x"FF",x"18",x"18", -- 0x1608 + x"7E",x"06",x"06",x"FD",x"21",x"22",x"16",x"FD", -- 0x1610 + x"BE",x"00",x"C8",x"FD",x"23",x"10",x"F8",x"3E", -- 0x1618 + x"FF",x"C9",x"18",x"1C",x"20",x"24",x"28",x"2C", -- 0x1620 + x"DD",x"E5",x"FD",x"E5",x"DD",x"21",x"61",x"17", -- 0x1628 + x"FD",x"21",x"8B",x"17",x"06",x"00",x"3A",x"24", -- 0x1630 + x"40",x"DD",x"BE",x"00",x"C2",x"3F",x"17",x"3A", -- 0x1638 + x"25",x"40",x"DD",x"BE",x"01",x"C2",x"3F",x"17", -- 0x1640 + x"3A",x"26",x"40",x"DD",x"BE",x"02",x"C2",x"3F", -- 0x1648 + x"17",x"FD",x"7E",x"00",x"32",x"21",x"40",x"FD", -- 0x1650 + x"7E",x"01",x"32",x"22",x"40",x"FD",x"7E",x"02", -- 0x1658 + x"32",x"23",x"40",x"FD",x"E1",x"DD",x"E1",x"DD", -- 0x1660 + x"7E",x"04",x"E6",x"80",x"5F",x"3A",x"21",x"40", -- 0x1668 + x"B7",x"CA",x"FE",x"16",x"FE",x"FF",x"28",x"34", -- 0x1670 + x"B3",x"DD",x"77",x"04",x"DD",x"7E",x"05",x"E6", -- 0x1678 + x"80",x"5F",x"3A",x"21",x"40",x"B3",x"DD",x"77", -- 0x1680 + x"05",x"CD",x"8E",x"16",x"18",x"1E",x"DD",x"7E", -- 0x1688 + x"04",x"E6",x"3F",x"FE",x"18",x"28",x"09",x"FE", -- 0x1690 + x"24",x"28",x"05",x"FE",x"28",x"28",x"01",x"C9", -- 0x1698 + x"DD",x"E5",x"DD",x"E5",x"FD",x"E1",x"CD",x"31", -- 0x16A0 + x"11",x"DD",x"E1",x"C9",x"3A",x"22",x"40",x"B7", -- 0x16A8 + x"28",x"55",x"57",x"FE",x"FF",x"28",x"16",x"DD", -- 0x16B0 + x"7E",x"FE",x"E6",x"80",x"5F",x"7A",x"B3",x"DD", -- 0x16B8 + x"77",x"FE",x"DD",x"7E",x"FF",x"E6",x"80",x"5F", -- 0x16C0 + x"7A",x"B3",x"DD",x"77",x"FF",x"3A",x"23",x"40", -- 0x16C8 + x"B7",x"28",x"42",x"FE",x"FF",x"28",x"25",x"57", -- 0x16D0 + x"DD",x"7E",x"0A",x"E6",x"80",x"5F",x"7A",x"B3", -- 0x16D8 + x"DD",x"77",x"0A",x"DD",x"7E",x"0B",x"E6",x"80", -- 0x16E0 + x"5F",x"7A",x"B3",x"DD",x"77",x"0B",x"DD",x"E5", -- 0x16E8 + x"D5",x"11",x"06",x"00",x"DD",x"19",x"CD",x"8E", -- 0x16F0 + x"16",x"D1",x"DD",x"E1",x"D9",x"C9",x"DD",x"E5", -- 0x16F8 + x"FD",x"E1",x"CD",x"26",x"17",x"18",x"A5",x"DD", -- 0x1700 + x"E5",x"FD",x"E1",x"11",x"FA",x"FF",x"FD",x"19", -- 0x1708 + x"CD",x"26",x"17",x"18",x"B8",x"DD",x"E5",x"FD", -- 0x1710 + x"E1",x"11",x"06",x"00",x"FD",x"19",x"CD",x"26", -- 0x1718 + x"17",x"C3",x"FC",x"16",x"FD",x"E1",x"FD",x"36", -- 0x1720 + x"00",x"00",x"FD",x"36",x"01",x"00",x"FD",x"36", -- 0x1728 + x"02",x"00",x"FD",x"36",x"03",x"00",x"FD",x"36", -- 0x1730 + x"04",x"00",x"FD",x"36",x"05",x"00",x"C9",x"04", -- 0x1738 + x"78",x"FE",x"10",x"20",x"0D",x"AF",x"21",x"56", -- 0x1740 + x"40",x"06",x"2C",x"D7",x"FD",x"E1",x"DD",x"E1", -- 0x1748 + x"D9",x"C9",x"DD",x"23",x"DD",x"23",x"DD",x"23", -- 0x1750 + x"FD",x"23",x"FD",x"23",x"FD",x"23",x"C3",x"36", -- 0x1758 + x"16",x"18",x"FF",x"1C",x"18",x"FF",x"20",x"18", -- 0x1760 + x"FF",x"2C",x"1C",x"FF",x"1C",x"1C",x"FF",x"20", -- 0x1768 + x"1C",x"FF",x"2C",x"20",x"FF",x"FF",x"24",x"FF", -- 0x1770 + x"FF",x"28",x"FF",x"1C",x"28",x"FF",x"20",x"28", -- 0x1778 + x"FF",x"2C",x"2C",x"18",x"FF",x"2C",x"1C",x"FF", -- 0x1780 + x"2C",x"28",x"FF",x"28",x"FF",x"FF",x"28",x"FF", -- 0x1788 + x"FF",x"24",x"FF",x"00",x"20",x"FF",x"18",x"20", -- 0x1790 + x"FF",x"24",x"20",x"FF",x"24",x"2C",x"FF",x"FF", -- 0x1798 + x"00",x"FF",x"FF",x"00",x"FF",x"18",x"00",x"FF", -- 0x17A0 + x"24",x"00",x"FF",x"00",x"00",x"24",x"FF",x"00", -- 0x17A8 + x"20",x"FF",x"00",x"00",x"FF",x"3A",x"10",x"40", -- 0x17B0 + x"E6",x"E3",x"32",x"10",x"40",x"31",x"00",x"44", -- 0x17B8 + x"3A",x"14",x"40",x"4F",x"3E",x"01",x"32",x"01", -- 0x17C0 + x"70",x"CB",x"51",x"20",x"03",x"32",x"03",x"68", -- 0x17C8 + x"3A",x"03",x"40",x"FE",x"E8",x"20",x"F9",x"3E", -- 0x17D0 + x"3D",x"32",x"55",x"40",x"3A",x"03",x"40",x"FE", -- 0x17D8 + x"F0",x"20",x"F9",x"3E",x"0E",x"32",x"55",x"40", -- 0x17E0 + x"AF",x"32",x"03",x"68",x"3A",x"0A",x"40",x"FE", -- 0x17E8 + x"28",x"30",x"08",x"3A",x"10",x"40",x"CB",x"CF", -- 0x17F0 + x"32",x"10",x"40",x"3E",x"80",x"32",x"02",x"40", -- 0x17F8 + x"3A",x"02",x"40",x"B7",x"20",x"FA",x"CD",x"82", -- 0x1800 + x"18",x"AF",x"32",x"04",x"70",x"3E",x"C0",x"CD", -- 0x1808 + x"4C",x"00",x"21",x"50",x"40",x"AF",x"06",x"2F", -- 0x1810 + x"D7",x"CD",x"E6",x"00",x"CD",x"49",x"00",x"CD", -- 0x1818 + x"EC",x"00",x"3E",x"C0",x"CD",x"4C",x"00",x"CD", -- 0x1820 + x"E9",x"00",x"3E",x"C0",x"CD",x"4C",x"00",x"3A", -- 0x1828 + x"0A",x"40",x"FE",x"28",x"30",x"08",x"3A",x"14", -- 0x1830 + x"40",x"CB",x"C7",x"32",x"14",x"40",x"CD",x"61", -- 0x1838 + x"00",x"CD",x"57",x"18",x"3E",x"C0",x"CD",x"4C", -- 0x1840 + x"00",x"3E",x"01",x"32",x"04",x"70",x"3A",x"14", -- 0x1848 + x"40",x"32",x"10",x"40",x"C3",x"10",x"15",x"3A", -- 0x1850 + x"14",x"40",x"CB",x"5F",x"28",x"06",x"DD",x"21", -- 0x1858 + x"00",x"41",x"18",x"04",x"DD",x"21",x"00",x"42", -- 0x1860 + x"21",x"46",x"43",x"DD",x"7E",x"0C",x"3C",x"E6", -- 0x1868 + x"07",x"DD",x"77",x"0C",x"7D",x"FE",x"60",x"D0", -- 0x1870 + x"DD",x"7E",x"0C",x"77",x"23",x"23",x"23",x"23", -- 0x1878 + x"18",x"F2",x"21",x"C0",x"53",x"7C",x"FE",x"4F", -- 0x1880 + x"C8",x"7E",x"E6",x"3C",x"FE",x"2C",x"E5",x"CC", -- 0x1888 + x"96",x"18",x"E1",x"2B",x"18",x"EF",x"56",x"E5", -- 0x1890 + x"DD",x"E5",x"CD",x"F6",x"00",x"CD",x"E0",x"00", -- 0x1898 + x"DD",x"E1",x"E1",x"36",x"FA",x"3A",x"14",x"40", -- 0x18A0 + x"CB",x"57",x"20",x"05",x"3E",x"01",x"32",x"03", -- 0x18A8 + x"68",x"3E",x"FC",x"CD",x"4C",x"00",x"36",x"FB", -- 0x18B0 + x"AF",x"32",x"03",x"68",x"3E",x"FC",x"CD",x"4C", -- 0x18B8 + x"00",x"36",x"10",x"C9",x"10",x"C9",x"FE",x"E8", -- 0x18C0 + x"38",x"13",x"3A",x"0C",x"40",x"B7",x"20",x"0B", -- 0x18C8 + x"CD",x"F6",x"16",x"3E",x"FF",x"32",x"00",x"78", -- 0x18D0 + x"C3",x"3E",x"10",x"CB",x"D1",x"3A",x"00",x"40", -- 0x18D8 + x"CB",x"77",x"20",x"0E",x"CB",x"61",x"FD",x"7E", -- 0x18E0 + x"00",x"20",x"03",x"93",x"18",x"01",x"83",x"FD", -- 0x18E8 + x"77",x"00",x"CB",x"51",x"FD",x"7E",x"01",x"28", -- 0x18F0 + x"03",x"93",x"18",x"01",x"83",x"FD",x"77",x"01", -- 0x18F8 + x"CB",x"51",x"FD",x"7E",x"05",x"28",x"0B",x"CB", -- 0x1900 + x"B7",x"FD",x"77",x"05",x"FD",x"71",x"04",x"C3", -- 0x1908 + x"3E",x"10",x"CB",x"F7",x"18",x"F3",x"3A",x"A2", -- 0x1910 + x"40",x"3C",x"32",x"A2",x"40",x"FD",x"7E",x"05", -- 0x1918 + x"E6",x"3F",x"FE",x"15",x"28",x"64",x"FD",x"7E", -- 0x1920 + x"04",x"E6",x"03",x"B7",x"20",x"02",x"3E",x"03", -- 0x1928 + x"4F",x"FD",x"7E",x"01",x"5F",x"FD",x"BE",x"0F", -- 0x1930 + x"38",x"38",x"3A",x"05",x"40",x"E6",x"0F",x"FE", -- 0x1938 + x"03",x"20",x"2F",x"FD",x"66",x"03",x"FD",x"6E", -- 0x1940 + x"02",x"11",x"20",x"00",x"19",x"7D",x"E6",x"1F", -- 0x1948 + x"FE",x"1C",x"30",x"0C",x"36",x"32",x"3E",x"FC", -- 0x1950 + x"32",x"00",x"40",x"3E",x"15",x"FD",x"77",x"05", -- 0x1958 + x"3A",x"10",x"40",x"CB",x"57",x"CA",x"3E",x"10", -- 0x1960 + x"FD",x"7E",x"01",x"2F",x"32",x"00",x"78",x"C3", -- 0x1968 + x"3E",x"10",x"F5",x"3A",x"10",x"40",x"CB",x"57", -- 0x1970 + x"F1",x"28",x"04",x"2F",x"32",x"00",x"78",x"7B", -- 0x1978 + x"81",x"FE",x"F0",x"30",x"12",x"FD",x"77",x"01", -- 0x1980 + x"18",x"E5",x"3A",x"00",x"40",x"B7",x"20",x"DF", -- 0x1988 + x"3E",x"14",x"FD",x"77",x"05",x"18",x"D8",x"CD", -- 0x1990 + x"F6",x"16",x"3E",x"FF",x"32",x"00",x"78",x"18", -- 0x1998 + x"CE",x"3A",x"A1",x"40",x"3C",x"32",x"A1",x"40", -- 0x19A0 + x"3A",x"00",x"40",x"5F",x"FD",x"7E",x"04",x"4F", -- 0x19A8 + x"E6",x"03",x"B7",x"20",x"02",x"3E",x"03",x"57", -- 0x19B0 + x"FD",x"7E",x"00",x"CB",x"61",x"20",x"03",x"82", -- 0x19B8 + x"18",x"01",x"92",x"FD",x"77",x"00",x"FE",x"08", -- 0x19C0 + x"38",x"CD",x"FE",x"F8",x"30",x"C9",x"CB",x"53", -- 0x19C8 + x"20",x"04",x"3E",x"12",x"18",x"02",x"3E",x"13", -- 0x19D0 + x"CB",x"61",x"28",x"02",x"CB",x"FF",x"FD",x"77", -- 0x19D8 + x"05",x"FD",x"66",x"03",x"FD",x"6E",x"02",x"23", -- 0x19E0 + x"11",x"20",x"00",x"19",x"7E",x"FE",x"10",x"28", -- 0x19E8 + x"02",x"36",x"FA",x"C3",x"3E",x"10",x"00",x"00", -- 0x19F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x19F8 + x"FD",x"E5",x"DD",x"E5",x"CD",x"0C",x"1A",x"DD", -- 0x1A00 + x"E1",x"FD",x"E1",x"C9",x"FD",x"21",x"00",x"40", -- 0x1A08 + x"FD",x"7E",x"0C",x"B7",x"C8",x"FD",x"7E",x"00", -- 0x1A10 + x"4F",x"3A",x"10",x"40",x"FE",x"04",x"28",x"6C", -- 0x1A18 + x"FD",x"7E",x"10",x"CB",x"5F",x"28",x"06",x"DD", -- 0x1A20 + x"21",x"00",x"41",x"18",x"04",x"DD",x"21",x"00", -- 0x1A28 + x"42",x"DD",x"7E",x"04",x"FE",x"04",x"D8",x"DD", -- 0x1A30 + x"7E",x"0A",x"FE",x"10",x"38",x"05",x"3E",x"0E", -- 0x1A38 + x"DD",x"77",x"0A",x"47",x"DD",x"7E",x"01",x"5F", -- 0x1A40 + x"E6",x"0F",x"57",x"78",x"FE",x"0F",x"20",x"0C", -- 0x1A48 + x"CB",x"79",x"20",x"08",x"FD",x"34",x"01",x"CB", -- 0x1A50 + x"B9",x"FD",x"71",x"00",x"7A",x"B7",x"CA",x"52", -- 0x1A58 + x"1B",x"FE",x"02",x"28",x"17",x"FE",x"04",x"28", -- 0x1A60 + x"53",x"FE",x"08",x"28",x"0F",x"FE",x"A0",x"CA", -- 0x1A68 + x"7F",x"1B",x"FE",x"C0",x"CA",x"03",x"1B",x"FE", -- 0x1A70 + x"E0",x"28",x"41",x"C9",x"FD",x"34",x"01",x"CB", -- 0x1A78 + x"61",x"C8",x"3A",x"10",x"40",x"CB",x"57",x"20", -- 0x1A80 + x"0F",x"DD",x"7E",x"0A",x"21",x"00",x"21",x"CD", -- 0x1A88 + x"B6",x"1B",x"3A",x"A0",x"40",x"BA",x"C8",x"D0", -- 0x1A90 + x"3E",x"F0",x"C5",x"D5",x"67",x"2E",x"F0",x"0E", -- 0x1A98 + x"10",x"CD",x"5B",x"00",x"D1",x"C1",x"B7",x"C8", -- 0x1AA0 + x"7B",x"FE",x"01",x"28",x"05",x"CB",x"51",x"20", -- 0x1AA8 + x"01",x"1D",x"7B",x"C6",x"04",x"FD",x"77",x"04", -- 0x1AB0 + x"DD",x"34",x"04",x"C9",x"FD",x"34",x"01",x"CB", -- 0x1AB8 + x"41",x"C8",x"3A",x"05",x"40",x"FE",x"20",x"38", -- 0x1AC0 + x"04",x"FE",x"D0",x"38",x"02",x"C6",x"80",x"F5", -- 0x1AC8 + x"DD",x"7E",x"0A",x"21",x"1F",x"21",x"CD",x"B6", -- 0x1AD0 + x"1B",x"3A",x"A2",x"40",x"BA",x"28",x"22",x"30", -- 0x1AD8 + x"20",x"F1",x"C5",x"D5",x"67",x"2E",x"08",x"0E", -- 0x1AE0 + x"14",x"CD",x"5B",x"00",x"D1",x"E1",x"B7",x"C8", -- 0x1AE8 + x"7B",x"FE",x"01",x"28",x"05",x"CB",x"49",x"20", -- 0x1AF0 + x"01",x"1D",x"FD",x"73",x"04",x"DD",x"34",x"04", -- 0x1AF8 + x"C9",x"F1",x"C9",x"FD",x"34",x"01",x"CB",x"41", -- 0x1B00 + x"C8",x"FD",x"34",x"01",x"DD",x"7E",x"0A",x"21", -- 0x1B08 + x"3D",x"21",x"CD",x"B6",x"1B",x"3A",x"A1",x"40", -- 0x1B10 + x"BA",x"D0",x"3A",x"05",x"40",x"FE",x"20",x"38", -- 0x1B18 + x"04",x"FE",x"E0",x"38",x"02",x"C6",x"80",x"6F", -- 0x1B20 + x"C5",x"D5",x"CB",x"49",x"28",x"04",x"26",x"10", -- 0x1B28 + x"18",x"02",x"26",x"F0",x"0E",x"12",x"CD",x"5B", -- 0x1B30 + x"00",x"B7",x"D1",x"C1",x"C8",x"CB",x"49",x"20", -- 0x1B38 + x"07",x"FD",x"73",x"04",x"FD",x"34",x"04",x"C9", -- 0x1B40 + x"7B",x"C6",x"10",x"FD",x"73",x"04",x"FD",x"34", -- 0x1B48 + x"04",x"C9",x"FD",x"34",x"01",x"3A",x"A1",x"40", -- 0x1B50 + x"B7",x"C0",x"3A",x"51",x"40",x"FE",x"C0",x"D0", -- 0x1B58 + x"6F",x"3A",x"50",x"40",x"FE",x"80",x"30",x"06", -- 0x1B60 + x"26",x"10",x"0E",x"02",x"18",x"04",x"26",x"F0", -- 0x1B68 + x"0E",x"12",x"C5",x"0E",x"12",x"CD",x"5B",x"00", -- 0x1B70 + x"C1",x"B7",x"C8",x"FD",x"71",x"04",x"C9",x"FD", -- 0x1B78 + x"34",x"01",x"3A",x"0C",x"40",x"FE",x"02",x"D8", -- 0x1B80 + x"DD",x"7E",x"0A",x"FE",x"06",x"D8",x"3A",x"01", -- 0x1B88 + x"40",x"3C",x"32",x"01",x"40",x"3A",x"05",x"40", -- 0x1B90 + x"E6",x"7F",x"67",x"2E",x"08",x"0E",x"24",x"CD", -- 0x1B98 + x"5B",x"00",x"FD",x"36",x"04",x"24",x"DD",x"7E", -- 0x1BA0 + x"04",x"67",x"2E",x"08",x"0E",x"24",x"CD",x"5B", -- 0x1BA8 + x"00",x"FD",x"36",x"04",x"24",x"C9",x"47",x"7E", -- 0x1BB0 + x"B8",x"30",x"02",x"18",x"05",x"23",x"5E",x"23", -- 0x1BB8 + x"56",x"C9",x"23",x"23",x"23",x"18",x"F0",x"56", -- 0x1BC0 + x"C9",x"23",x"23",x"23",x"18",x"F0",x"C9",x"23", -- 0x1BC8 + x"23",x"23",x"18",x"F0",x"23",x"18",x"F0",x"18", -- 0x1BD0 + x"04",x"DD",x"21",x"00",x"41",x"DD",x"7E",x"0D", -- 0x1BD8 + x"B7",x"C0",x"3A",x"00",x"70",x"CB",x"5F",x"28", -- 0x1BE0 + x"05",x"3A",x"4E",x"1C",x"18",x"03",x"3A",x"4F", -- 0x1BE8 + x"1C",x"DD",x"BE",x"00",x"C0",x"DD",x"36",x"0D", -- 0x1BF0 + x"01",x"DD",x"36",x"0E",x"01",x"DD",x"34",x"09", -- 0x1BF8 + x"11",x"38",x"1C",x"E7",x"11",x"2A",x"1C",x"E7", -- 0x1C00 + x"3A",x"10",x"40",x"F5",x"AF",x"32",x"10",x"40", -- 0x1C08 + x"21",x"00",x"1D",x"22",x"C0",x"40",x"AF",x"32", -- 0x1C10 + x"00",x"40",x"3A",x"00",x"40",x"FE",x"80",x"20", -- 0x1C18 + x"F9",x"11",x"38",x"1C",x"E7",x"F1",x"32",x"10", -- 0x1C20 + x"40",x"C9",x"01",x"1F",x"04",x"42",x"4F",x"4E", -- 0x1C28 + x"55",x"53",x"40",x"42",x"41",x"53",x"45",x"FF", -- 0x1C30 + x"05",x"1F",x"00",x"40",x"40",x"40",x"40",x"40", -- 0x1C38 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x1C40 + x"40",x"40",x"40",x"40",x"40",x"FF",x"50",x"75", -- 0x1C48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CF8 + x"00",x"20",x"20",x"30",x"30",x"40",x"40",x"50", -- 0x1D00 + x"50",x"80",x"80",x"70",x"70",x"50",x"50",x"FF", -- 0x1D08 + x"44",x"77",x"99",x"AA",x"D0",x"80",x"60",x"40", -- 0x1D10 + x"50",x"80",x"80",x"80",x"FF",x"00",x"00",x"00", -- 0x1D18 + x"AA",x"BB",x"CC",x"DD",x"AA",x"90",x"80",x"FF", -- 0x1D20 + x"40",x"FF",x"C0",x"B0",x"A0",x"90",x"80",x"FF", -- 0x1D28 + x"12",x"34",x"56",x"78",x"9A",x"BC",x"DE",x"F1", -- 0x1D30 + x"23",x"45",x"67",x"FF",x"AB",x"CD",x"FF",x"00", -- 0x1D38 + x"F0",x"DC",x"BA",x"98",x"76",x"54",x"32",x"12", -- 0x1D40 + x"34",x"FF",x"78",x"9A",x"FF",x"00",x"00",x"00", -- 0x1D48 + x"C3",x"10",x"43",x"3E",x"1A",x"01",x"22",x"45", -- 0x1D50 + x"C9",x"01",x"FF",x"10",x"22",x"83",x"FF",x"00", -- 0x1D58 + x"10",x"10",x"20",x"20",x"30",x"30",x"40",x"40", -- 0x1D60 + x"30",x"30",x"20",x"20",x"10",x"10",x"FF",x"00", -- 0x1D68 + x"50",x"60",x"70",x"80",x"90",x"A0",x"B0",x"A0", -- 0x1D70 + x"90",x"80",x"70",x"FF",x"50",x"FF",x"00",x"00", -- 0x1D78 + x"F0",x"E0",x"C0",x"D0",x"E0",x"F0",x"D0",x"C0", -- 0x1D80 + x"A0",x"D0",x"FF",x"E0",x"F0",x"FF",x"00",x"00", -- 0x1D88 + x"18",x"68",x"74",x"98",x"A0",x"98",x"74",x"68", -- 0x1D90 + x"36",x"38",x"FF",x"3C",x"3E",x"FF",x"00",x"00", -- 0x1D98 + x"10",x"80",x"20",x"A0",x"30",x"E0",x"40",x"80", -- 0x1DA0 + x"80",x"FF",x"70",x"68",x"60",x"20",x"20",x"FF", -- 0x1DA8 + x"22",x"33",x"45",x"67",x"65",x"55",x"F0",x"E0", -- 0x1DB0 + x"20",x"30",x"20",x"30",x"20",x"FF",x"00",x"00", -- 0x1DB8 + x"82",x"84",x"86",x"88",x"8A",x"8C",x"8E",x"90", -- 0x1DC0 + x"92",x"94",x"96",x"98",x"9A",x"9C",x"9E",x"FF", -- 0x1DC8 + x"F0",x"E8",x"E0",x"D8",x"D0",x"C8",x"C0",x"B8", -- 0x1DD0 + x"B0",x"A8",x"A0",x"E0",x"F0",x"F0",x"F0",x"FF", -- 0x1DD8 + x"30",x"50",x"70",x"80",x"70",x"60",x"50",x"40", -- 0x1DE0 + x"30",x"20",x"10",x"FF",x"00",x"00",x"00",x"00", -- 0x1DE8 + x"80",x"80",x"F0",x"D9",x"68",x"65",x"D6",x"D7", -- 0x1DF0 + x"D9",x"22",x"33",x"44",x"55",x"66",x"77",x"FF", -- 0x1DF8 + x"AF",x"32",x"10",x"40",x"3E",x"C0",x"CD",x"4C", -- 0x1E00 + x"00",x"21",x"00",x"70",x"AF",x"06",x"20",x"D7", -- 0x1E08 + x"3E",x"01",x"32",x"01",x"70",x"21",x"00",x"43", -- 0x1E10 + x"06",x"40",x"D7",x"3A",x"00",x"68",x"E6",x"C0", -- 0x1E18 + x"FE",x"C0",x"20",x"05",x"3E",x"02",x"32",x"06", -- 0x1E20 + x"40",x"11",x"7D",x"1F",x"E7",x"3E",x"C0",x"CD", -- 0x1E28 + x"4C",x"00",x"11",x"92",x"1F",x"E7",x"3E",x"C0", -- 0x1E30 + x"CD",x"4C",x"00",x"11",x"9E",x"1F",x"E7",x"3E", -- 0x1E38 + x"80",x"CD",x"4C",x"00",x"11",x"C2",x"1F",x"E7", -- 0x1E40 + x"3E",x"80",x"CD",x"4C",x"00",x"11",x"C8",x"1F", -- 0x1E48 + x"E7",x"11",x"B1",x"1F",x"E7",x"3E",x"80",x"CD", -- 0x1E50 + x"4C",x"00",x"11",x"E5",x"1F",x"E7",x"3E",x"2B", -- 0x1E58 + x"32",x"98",x"53",x"3E",x"80",x"CD",x"4C",x"00", -- 0x1E60 + x"11",x"F9",x"1F",x"E7",x"11",x"19",x"20",x"E7", -- 0x1E68 + x"11",x"35",x"20",x"E7",x"3E",x"C0",x"CD",x"4C", -- 0x1E70 + x"00",x"CD",x"49",x"00",x"3E",x"C0",x"CD",x"4C", -- 0x1E78 + x"00",x"11",x"43",x"20",x"E7",x"3E",x"C0",x"CD", -- 0x1E80 + x"4C",x"00",x"DD",x"21",x"5A",x"20",x"FD",x"21", -- 0x1E88 + x"50",x"40",x"06",x"04",x"DD",x"7E",x"00",x"FD", -- 0x1E90 + x"77",x"00",x"DD",x"7E",x"01",x"FD",x"77",x"01", -- 0x1E98 + x"DD",x"7E",x"02",x"FD",x"77",x"05",x"11",x"06", -- 0x1EA0 + x"00",x"FD",x"19",x"11",x"03",x"00",x"DD",x"19", -- 0x1EA8 + x"10",x"E2",x"FD",x"E5",x"11",x"66",x"20",x"E7", -- 0x1EB0 + x"FD",x"E1",x"FD",x"36",x"00",x"40",x"FD",x"36", -- 0x1EB8 + x"01",x"E0",x"FD",x"36",x"05",x"10",x"FD",x"E5", -- 0x1EC0 + x"11",x"72",x"20",x"E7",x"FD",x"E1",x"FD",x"36", -- 0x1EC8 + x"06",x"40",x"FD",x"36",x"07",x"C0",x"FD",x"36", -- 0x1ED0 + x"0B",x"12",x"FD",x"E5",x"11",x"79",x"20",x"E7", -- 0x1ED8 + x"FD",x"E1",x"FD",x"36",x"0C",x"40",x"FD",x"36", -- 0x1EE0 + x"0D",x"A0",x"FD",x"36",x"11",x"14",x"11",x"80", -- 0x1EE8 + x"20",x"E7",x"3E",x"32",x"32",x"E7",x"52",x"11", -- 0x1EF0 + x"87",x"20",x"E7",x"3E",x"F8",x"32",x"EB",x"52", -- 0x1EF8 + x"11",x"8F",x"20",x"E7",x"3E",x"10",x"CD",x"4C", -- 0x1F00 + x"00",x"CD",x"49",x"00",x"3E",x"C0",x"CD",x"4C", -- 0x1F08 + x"00",x"11",x"9A",x"20",x"E7",x"3E",x"C0",x"CD", -- 0x1F10 + x"4C",x"00",x"11",x"B0",x"20",x"E7",x"3E",x"C0", -- 0x1F18 + x"CD",x"4C",x"00",x"3A",x"0F",x"00",x"B7",x"CA", -- 0x1F20 + x"1C",x"25",x"3A",x"00",x"68",x"07",x"07",x"B7", -- 0x1F28 + x"28",x"06",x"11",x"D0",x"20",x"E7",x"18",x"04", -- 0x1F30 + x"11",x"C0",x"20",x"E7",x"3E",x"80",x"CD",x"4C", -- 0x1F38 + x"00",x"CD",x"49",x"00",x"3E",x"C0",x"CD",x"4C", -- 0x1F40 + x"00",x"CD",x"4F",x"00",x"3A",x"10",x"40",x"CB", -- 0x1F48 + x"C7",x"32",x"10",x"40",x"3A",x"10",x"40",x"CB", -- 0x1F50 + x"47",x"20",x"F9",x"3E",x"01",x"32",x"04",x"70", -- 0x1F58 + x"3E",x"04",x"32",x"10",x"40",x"32",x"14",x"40", -- 0x1F60 + x"3E",x"01",x"32",x"09",x"41",x"32",x"09",x"42", -- 0x1F68 + x"3E",x"08",x"32",x"0A",x"42",x"32",x"0A",x"41", -- 0x1F70 + x"CD",x"E0",x"00",x"18",x"FE",x"02",x"04",x"05", -- 0x1F78 + x"46",x"4F",x"4F",x"44",x"40",x"41",x"4E",x"44", -- 0x1F80 + x"40",x"46",x"55",x"4E",x"40",x"43",x"4F",x"52", -- 0x1F88 + x"50",x"FF",x"03",x"08",x"0A",x"50",x"52",x"45", -- 0x1F90 + x"53",x"45",x"4E",x"54",x"53",x"FF",x"04",x"0C", -- 0x1F98 + x"06",x"57",x"41",x"52",x"40",x"4F",x"46",x"40", -- 0x1FA0 + x"54",x"48",x"45",x"40",x"42",x"55",x"47",x"53", -- 0x1FA8 + x"FF",x"06",x"13",x"08",x"4D",x"55",x"53",x"48", -- 0x1FB0 + x"52",x"4F",x"4F",x"4D",x"40",x"4D",x"41",x"5A", -- 0x1FB8 + x"45",x"FF",x"05",x"0E",x"0C",x"4F",x"52",x"FF", -- 0x1FC0 + x"06",x"11",x"02",x"4D",x"4F",x"4E",x"53",x"54", -- 0x1FC8 + x"45",x"52",x"4F",x"55",x"53",x"40",x"4D",x"41", -- 0x1FD0 + x"4E",x"4F",x"55",x"56",x"45",x"52",x"53",x"40", -- 0x1FD8 + x"49",x"4E",x"40",x"41",x"FF",x"00",x"18",x"06", -- 0x1FE0 + x"41",x"52",x"4D",x"45",x"4E",x"49",x"41",x"40", -- 0x1FE8 + x"4C",x"54",x"44",x"40",x"31",x"39",x"38",x"31", -- 0x1FF0 + x"FF",x"07",x"1D",x"00",x"50",x"52",x"4F",x"47", -- 0x1FF8 + x"FF",x"41",x"4D",x"4D",x"49",x"4E",x"47",x"40", -- 0x2000 + x"54",x"4F",x"54",x"41",x"4C",x"4C",x"59",x"40", -- 0x2008 + x"4F",x"52",x"49",x"47",x"49",x"4E",x"41",x"4C", -- 0x2010 + x"FF",x"07",x"1E",x"02",x"55",x"4E",x"41",x"55", -- 0x2018 + x"54",x"48",x"4F",x"52",x"49",x"53",x"45",x"44", -- 0x2020 + x"40",x"44",x"55",x"50",x"4C",x"49",x"43",x"41", -- 0x2028 + x"54",x"49",x"4F",x"4E",x"FF",x"07",x"1F",x"09", -- 0x2030 + x"50",x"52",x"4F",x"48",x"49",x"42",x"49",x"54", -- 0x2038 + x"45",x"44",x"FF",x"07",x"03",x"04",x"53",x"43", -- 0x2040 + x"4F",x"52",x"45",x"40",x"41",x"44",x"56",x"41", -- 0x2048 + x"4E",x"43",x"45",x"40",x"54",x"41",x"42",x"4C", -- 0x2050 + x"45",x"FF",x"40",x"80",x"18",x"50",x"80",x"1C", -- 0x2058 + x"60",x"80",x"1C",x"70",x"80",x"20",x"00",x"07", -- 0x2060 + x"10",x"32",x"30",x"40",x"33",x"30",x"40",x"34", -- 0x2068 + x"30",x"FF",x"01",x"0B",x"15",x"39",x"30",x"30", -- 0x2070 + x"FF",x"00",x"10",x"15",x"31",x"30",x"30",x"FF", -- 0x2078 + x"00",x"14",x"15",x"36",x"30",x"30",x"FF",x"00", -- 0x2080 + x"19",x"15",x"35",x"30",x"30",x"30",x"FF",x"00", -- 0x2088 + x"1D",x"13",x"4D",x"59",x"53",x"54",x"45",x"52", -- 0x2090 + x"59",x"FF",x"03",x"06",x"04",x"4F",x"4E",x"45", -- 0x2098 + x"40",x"4F",x"52",x"40",x"54",x"57",x"4F",x"40", -- 0x20A0 + x"50",x"4C",x"41",x"59",x"45",x"52",x"53",x"FF", -- 0x20A8 + x"04",x"0A",x"07",x"49",x"4E",x"53",x"45",x"52", -- 0x20B0 + x"54",x"40",x"43",x"4F",x"49",x"4E",x"53",x"FF", -- 0x20B8 + x"05",x"18",x"07",x"4F",x"4E",x"45",x"40",x"50", -- 0x20C0 + x"4C",x"41",x"59",x"40",x"32",x"30",x"43",x"FF", -- 0x20C8 + x"05",x"18",x"07",x"4F",x"4E",x"45",x"40",x"50", -- 0x20D0 + x"4C",x"41",x"59",x"40",x"32",x"30",x"43",x"FF", -- 0x20D8 + x"3E",x"02",x"32",x"06",x"40",x"18",x"FE",x"00", -- 0x20E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20F8 + x"00",x"01",x"01",x"01",x"01",x"01",x"03",x"02", -- 0x2100 + x"01",x"06",x"03",x"01",x"08",x"03",x"01",x"0C", -- 0x2108 + x"03",x"02",x"00",x"00",x"00",x"00",x"10",x"03", -- 0x2110 + x"02",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2118 + x"02",x"01",x"02",x"03",x"01",x"04",x"02",x"02", -- 0x2120 + x"08",x"03",x"03",x"0A",x"03",x"03",x"00",x"00", -- 0x2128 + x"00",x"00",x"00",x"00",x"10",x"03",x"04",x"00", -- 0x2130 + x"00",x"00",x"00",x"00",x"00",x"01",x"01",x"01", -- 0x2138 + x"04",x"00",x"02",x"01",x"0F",x"03",x"03",x"06", -- 0x2140 + x"01",x"03",x"10",x"01",x"03",x"00",x"00",x"00", -- 0x2148 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2150 + x"00",x"3A",x"10",x"40",x"E6",x"18",x"B7",x"C8", -- 0x2158 + x"CB",x"5F",x"20",x"06",x"DD",x"21",x"00",x"42", -- 0x2160 + x"18",x"04",x"DD",x"21",x"00",x"41",x"DD",x"7E", -- 0x2168 + x"0D",x"B7",x"C0",x"3A",x"00",x"70",x"CB",x"5F", -- 0x2170 + x"28",x"05",x"3A",x"DF",x"21",x"18",x"03",x"3A", -- 0x2178 + x"E0",x"21",x"DD",x"BE",x"00",x"C0",x"DD",x"36", -- 0x2180 + x"0D",x"01",x"DD",x"36",x"0E",x"01",x"DD",x"34", -- 0x2188 + x"09",x"11",x"C9",x"21",x"E7",x"11",x"BB",x"21", -- 0x2190 + x"E7",x"3A",x"10",x"40",x"F5",x"AF",x"32",x"10", -- 0x2198 + x"40",x"21",x"00",x"1D",x"22",x"C0",x"40",x"AF", -- 0x21A0 + x"32",x"00",x"40",x"3A",x"00",x"40",x"FE",x"80", -- 0x21A8 + x"20",x"F9",x"11",x"C9",x"21",x"E7",x"F1",x"32", -- 0x21B0 + x"10",x"40",x"C9",x"01",x"1F",x"04",x"42",x"4F", -- 0x21B8 + x"4E",x"55",x"53",x"40",x"42",x"41",x"53",x"45", -- 0x21C0 + x"FF",x"05",x"1F",x"00",x"40",x"40",x"40",x"40", -- 0x21C8 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x21D0 + x"40",x"40",x"40",x"40",x"40",x"40",x"FF",x"50", -- 0x21D8 + x"75",x"CD",x"00",x"1A",x"2A",x"C0",x"40",x"7C", -- 0x21E0 + x"FE",x"18",x"30",x"07",x"3E",x"FF",x"32",x"00", -- 0x21E8 + x"78",x"18",x"29",x"3A",x"C2",x"40",x"3C",x"32", -- 0x21F0 + x"C2",x"40",x"2A",x"C0",x"40",x"7E",x"FE",x"01", -- 0x21F8 + x"C8",x"32",x"00",x"78",x"FE",x"FF",x"28",x"14", -- 0x2200 + x"3A",x"C2",x"40",x"CB",x"57",x"C8",x"CB",x"97", -- 0x2208 + x"32",x"C2",x"40",x"7E",x"32",x"00",x"78",x"23", -- 0x2210 + x"22",x"C0",x"40",x"C9",x"2A",x"D0",x"22",x"22", -- 0x2218 + x"C0",x"40",x"3A",x"10",x"40",x"E6",x"18",x"20", -- 0x2220 + x"08",x"21",x"00",x"68",x"AF",x"06",x"00",x"D7", -- 0x2228 + x"C9",x"3A",x"A0",x"40",x"B7",x"20",x"3C",x"CD", -- 0x2230 + x"4C",x"22",x"3A",x"0C",x"40",x"DD",x"21",x"D1", -- 0x2238 + x"22",x"DD",x"BE",x"00",x"28",x"1B",x"DD",x"23", -- 0x2240 + x"DD",x"23",x"18",x"F5",x"3A",x"A2",x"40",x"B7", -- 0x2248 + x"C8",x"3A",x"C8",x"40",x"2F",x"FE",x"20",x"28", -- 0x2250 + x"04",x"32",x"00",x"78",x"C9",x"3E",x"FF",x"18", -- 0x2258 + x"F8",x"DD",x"7E",x"00",x"DD",x"21",x"00",x"68", -- 0x2260 + x"06",x"07",x"DD",x"77",x"00",x"CB",x"3F",x"DD", -- 0x2268 + x"23",x"10",x"F7",x"3A",x"A1",x"40",x"B7",x"28", -- 0x2270 + x"0C",x"3A",x"00",x"40",x"07",x"07",x"07",x"07", -- 0x2278 + x"32",x"00",x"78",x"18",x"16",x"3A",x"A0",x"40", -- 0x2280 + x"B7",x"28",x"10",x"3A",x"00",x"40",x"CB",x"5F", -- 0x2288 + x"28",x"04",x"3E",x"20",x"18",x"02",x"3E",x"40", -- 0x2290 + x"32",x"00",x"78",x"3A",x"A9",x"40",x"B7",x"28", -- 0x2298 + x"1E",x"DD",x"21",x"DF",x"22",x"DD",x"BE",x"00", -- 0x22A0 + x"28",x"08",x"DD",x"23",x"DD",x"23",x"DD",x"23", -- 0x22A8 + x"18",x"F3",x"DD",x"66",x"02",x"DD",x"6E",x"01", -- 0x22B0 + x"22",x"C0",x"40",x"AF",x"32",x"A9",x"40",x"3A", -- 0x22B8 + x"A8",x"40",x"FE",x"50",x"C0",x"AF",x"32",x"A8", -- 0x22C0 + x"40",x"21",x"A0",x"1D",x"22",x"C0",x"40",x"C9", -- 0x22C8 + x"01",x"01",x"01",x"02",x"02",x"03",x"03",x"04", -- 0x22D0 + x"13",x"05",x"33",x"06",x"FF",x"00",x"00",x"01", -- 0x22D8 + x"20",x"1D",x"02",x"40",x"1D",x"03",x"40",x"1D", -- 0x22E0 + x"04",x"50",x"1D",x"05",x"60",x"1D",x"06",x"70", -- 0x22E8 + x"1D",x"07",x"80",x"1D",x"08",x"90",x"1D",x"09", -- 0x22F0 + x"A0",x"1D",x"09",x"B0",x"1D",x"50",x"C0",x"1D", -- 0x22F8 + x"0F",x"A0",x"40",x"3C",x"32",x"A0",x"40",x"FD", -- 0x2300 + x"7E",x"04",x"4F",x"E6",x"03",x"B7",x"20",x"02", -- 0x2308 + x"3E",x"01",x"00",x"00",x"5F",x"FD",x"7E",x"05", -- 0x2310 + x"E6",x"3E",x"57",x"3A",x"00",x"40",x"CB",x"3F", -- 0x2318 + x"CB",x"3F",x"E6",x"01",x"B2",x"FD",x"77",x"05", -- 0x2320 + x"FD",x"7E",x"00",x"FE",x"20",x"30",x"04",x"CB", -- 0x2328 + x"E1",x"18",x"06",x"FE",x"E8",x"38",x"02",x"CB", -- 0x2330 + x"A1",x"FD",x"7E",x"01",x"FE",x"80",x"30",x"04", -- 0x2338 + x"CB",x"91",x"18",x"17",x"FE",x"E8",x"38",x"13", -- 0x2340 + x"3A",x"0C",x"40",x"B7",x"20",x"0B",x"CD",x"0A", -- 0x2348 + x"17",x"3E",x"FF",x"32",x"00",x"78",x"C3",x"3E", -- 0x2350 + x"10",x"CB",x"D1",x"3A",x"00",x"40",x"CB",x"77", -- 0x2358 + x"20",x"0E",x"CB",x"61",x"FD",x"7E",x"00",x"20", -- 0x2360 + x"03",x"93",x"18",x"01",x"83",x"FD",x"77",x"00", -- 0x2368 + x"CB",x"51",x"FD",x"7E",x"01",x"28",x"03",x"93", -- 0x2370 + x"18",x"01",x"83",x"FD",x"77",x"01",x"CB",x"51", -- 0x2378 + x"FD",x"7E",x"05",x"28",x"0B",x"CB",x"B7",x"FD", -- 0x2380 + x"77",x"05",x"FD",x"71",x"04",x"C3",x"3E",x"10", -- 0x2388 + x"CB",x"F7",x"18",x"F3",x"3A",x"A2",x"40",x"3C", -- 0x2390 + x"32",x"A2",x"40",x"FD",x"7E",x"01",x"32",x"00", -- 0x2398 + x"78",x"FD",x"7E",x"05",x"E6",x"3F",x"FE",x"15", -- 0x23A0 + x"28",x"50",x"FD",x"7E",x"04",x"E6",x"03",x"B7", -- 0x23A8 + x"20",x"02",x"3E",x"03",x"4F",x"FD",x"7E",x"01", -- 0x23B0 + x"5F",x"3A",x"05",x"40",x"E6",x"1F",x"FE",x"05", -- 0x23B8 + x"20",x"28",x"FD",x"7E",x"01",x"FE",x"30",x"38", -- 0x23C0 + x"21",x"FD",x"66",x"03",x"FD",x"6E",x"02",x"11", -- 0x23C8 + x"20",x"00",x"19",x"7D",x"E6",x"1F",x"FE",x"1D", -- 0x23D0 + x"D2",x"3E",x"10",x"36",x"32",x"3E",x"FC",x"32", -- 0x23D8 + x"00",x"40",x"3E",x"15",x"FD",x"77",x"05",x"C3", -- 0x23E0 + x"3E",x"10",x"7B",x"81",x"FE",x"80",x"38",x"01", -- 0x23E8 + x"3C",x"FE",x"F8",x"30",x"12",x"FD",x"77",x"01", -- 0x23F0 + x"18",x"ED",x"3A",x"00",x"40",x"B7",x"20",x"E7", -- 0x23F8 + x"3E",x"14",x"FD",x"77",x"05",x"18",x"E0",x"CD", -- 0x2400 + x"0A",x"17",x"3E",x"FF",x"32",x"00",x"78",x"18", -- 0x2408 + x"D6",x"3A",x"A1",x"40",x"3C",x"32",x"A1",x"40", -- 0x2410 + x"3A",x"00",x"40",x"5F",x"FD",x"7E",x"04",x"4F", -- 0x2418 + x"E6",x"03",x"B7",x"20",x"02",x"3E",x"03",x"57", -- 0x2420 + x"FD",x"7E",x"00",x"CB",x"61",x"20",x"03",x"82", -- 0x2428 + x"18",x"01",x"92",x"FD",x"77",x"00",x"FE",x"08", -- 0x2430 + x"38",x"CD",x"FE",x"F8",x"30",x"C9",x"CB",x"53", -- 0x2438 + x"20",x"04",x"3E",x"12",x"18",x"02",x"3E",x"13", -- 0x2440 + x"CB",x"61",x"28",x"02",x"CB",x"FF",x"FD",x"77", -- 0x2448 + x"05",x"FD",x"66",x"03",x"FD",x"6E",x"02",x"23", -- 0x2450 + x"11",x"20",x"00",x"19",x"7E",x"FE",x"10",x"28", -- 0x2458 + x"02",x"36",x"FA",x"C3",x"3E",x"10",x"03",x"03", -- 0x2460 + x"00",x"56",x"40",x"20",x"02",x"02",x"00",x"0C", -- 0x2468 + x"40",x"04",x"6F",x"3A",x"14",x"40",x"CB",x"67", -- 0x2470 + x"C8",x"3E",x"01",x"32",x"06",x"70",x"32",x"07", -- 0x2478 + x"70",x"C9",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2480 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2488 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2490 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2498 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24F8 + x"3A",x"00",x"60",x"CB",x"6F",x"C8",x"3A",x"14", -- 0x2500 + x"40",x"CB",x"67",x"20",x"0B",x"AF",x"32",x"0F", -- 0x2508 + x"40",x"32",x"06",x"70",x"32",x"07",x"70",x"C9", -- 0x2510 + x"3E",x"01",x"18",x"F2",x"3E",x"C0",x"CD",x"4C", -- 0x2518 + x"00",x"11",x"36",x"25",x"E7",x"3E",x"C0",x"CD", -- 0x2520 + x"4C",x"00",x"11",x"4A",x"25",x"E7",x"3E",x"80", -- 0x2528 + x"CD",x"4C",x"00",x"C3",x"3C",x"1F",x"04",x"14", -- 0x2530 + x"04",x"46",x"49",x"52",x"53",x"54",x"40",x"43", -- 0x2538 + x"52",x"45",x"44",x"49",x"54",x"40",x"34",x"30", -- 0x2540 + x"43",x"FF",x"05",x"18",x"04",x"46",x"55",x"52", -- 0x2548 + x"54",x"48",x"45",x"52",x"40",x"43",x"52",x"45", -- 0x2550 + x"44",x"49",x"54",x"53",x"40",x"32",x"30",x"43", -- 0x2558 + x"FF",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2560 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2570 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2580 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2588 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2590 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25F8 + x"3A",x"A0",x"40",x"3C",x"32",x"A0",x"40",x"FD", -- 0x2600 + x"7E",x"04",x"4F",x"E6",x"03",x"B7",x"20",x"02", -- 0x2608 + x"3E",x"02",x"5F",x"FD",x"7E",x"05",x"E6",x"FE", -- 0x2610 + x"57",x"3A",x"00",x"40",x"CB",x"3F",x"CB",x"3F", -- 0x2618 + x"E6",x"01",x"B2",x"FD",x"77",x"05",x"FD",x"7E", -- 0x2620 + x"00",x"FE",x"20",x"30",x"02",x"CB",x"E1",x"FE", -- 0x2628 + x"E8",x"38",x"02",x"CB",x"A1",x"FD",x"7E",x"01", -- 0x2630 + x"FE",x"80",x"30",x"02",x"CB",x"91",x"FE",x"E8", -- 0x2638 + x"38",x"13",x"3A",x"0C",x"40",x"B7",x"20",x"0B", -- 0x2640 + x"CD",x"26",x"17",x"3E",x"FF",x"32",x"00",x"78", -- 0x2648 + x"C3",x"41",x"10",x"CB",x"D1",x"3A",x"00",x"40", -- 0x2650 + x"CB",x"77",x"20",x"0E",x"CB",x"61",x"FD",x"7E", -- 0x2658 + x"00",x"20",x"03",x"93",x"18",x"01",x"83",x"FD", -- 0x2660 + x"77",x"00",x"CB",x"51",x"FD",x"7E",x"01",x"28", -- 0x2668 + x"03",x"93",x"18",x"01",x"83",x"FD",x"77",x"01", -- 0x2670 + x"CB",x"51",x"FD",x"7E",x"05",x"28",x"0B",x"CB", -- 0x2678 + x"B7",x"FD",x"77",x"05",x"FD",x"71",x"04",x"C3", -- 0x2680 + x"41",x"10",x"CB",x"F7",x"18",x"F3",x"3A",x"A2", -- 0x2688 + x"40",x"3C",x"32",x"A2",x"40",x"FD",x"7E",x"01", -- 0x2690 + x"2F",x"32",x"00",x"78",x"FD",x"7E",x"05",x"E6", -- 0x2698 + x"3F",x"FE",x"15",x"28",x"50",x"FD",x"7E",x"04", -- 0x26A0 + x"E6",x"03",x"B7",x"20",x"02",x"3E",x"02",x"4F", -- 0x26A8 + x"FD",x"7E",x"01",x"FE",x"80",x"38",x"01",x"3C", -- 0x26B0 + x"5F",x"3A",x"05",x"40",x"E6",x"1F",x"FE",x"04", -- 0x26B8 + x"20",x"27",x"FD",x"66",x"03",x"FD",x"6E",x"02", -- 0x26C0 + x"11",x"20",x"00",x"19",x"7D",x"E6",x"1F",x"FE", -- 0x26C8 + x"1B",x"30",x"10",x"FE",x"04",x"38",x"0C",x"36", -- 0x26D0 + x"32",x"3E",x"FC",x"32",x"00",x"40",x"3E",x"15", -- 0x26D8 + x"FD",x"77",x"05",x"FD",x"7E",x"01",x"C3",x"41", -- 0x26E0 + x"10",x"2F",x"7B",x"81",x"FE",x"F0",x"30",x"12", -- 0x26E8 + x"FD",x"77",x"01",x"18",x"F1",x"3A",x"00",x"40", -- 0x26F0 + x"B7",x"20",x"EB",x"3E",x"14",x"FD",x"77",x"05", -- 0x26F8 + x"18",x"E4",x"CD",x"26",x"17",x"3E",x"FF",x"32", -- 0x2700 + x"00",x"78",x"18",x"DA",x"3A",x"A1",x"40",x"3C", -- 0x2708 + x"32",x"A1",x"40",x"3A",x"00",x"40",x"5F",x"FD", -- 0x2710 + x"7E",x"04",x"4F",x"E6",x"03",x"B7",x"20",x"02", -- 0x2718 + x"3E",x"03",x"57",x"FD",x"7E",x"00",x"CB",x"61", -- 0x2720 + x"20",x"03",x"82",x"18",x"01",x"92",x"FD",x"77", -- 0x2728 + x"00",x"FE",x"08",x"38",x"CD",x"FE",x"F8",x"30", -- 0x2730 + x"C9",x"CB",x"53",x"20",x"04",x"3E",x"12",x"18", -- 0x2738 + x"02",x"3E",x"13",x"CB",x"61",x"28",x"02",x"CB", -- 0x2740 + x"FF",x"FD",x"77",x"05",x"FD",x"66",x"03",x"FD", -- 0x2748 + x"6E",x"02",x"23",x"11",x"20",x"00",x"19",x"7E", -- 0x2750 + x"FE",x"10",x"28",x"02",x"36",x"FA",x"C3",x"41", -- 0x2758 + x"10",x"AF",x"06",x"04",x"D7",x"C9",x"00",x"00" + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/galaxian_6l.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/galaxian_6l.vhd new file mode 100644 index 00000000..7eb01da4 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/galaxian_6l.vhd @@ -0,0 +1,33 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GALAXIAN_6L is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(4 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GALAXIAN_6L is + + + type ROM_ARRAY is array(0 to 31) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"FF",x"07",x"C0",x"00",x"07",x"C0",x"3F", -- 0x0000 + x"00",x"38",x"07",x"C0",x"00",x"07",x"C0",x"38", -- 0x0008 + x"00",x"3F",x"38",x"07",x"00",x"C0",x"3F",x"07", -- 0x0010 + x"00",x"F8",x"07",x"38",x"00",x"C0",x"38",x"C7" -- 0x0018 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/gfx1.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/gfx1.vhd new file mode 100644 index 00000000..1b3ce2c4 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/ROM/gfx1.vhd @@ -0,0 +1,547 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + use UNISIM.Vcomponents.all; + +entity GFX1 is + port ( + CLK : in std_logic; + ENA : in std_logic; + ADDR : in std_logic_vector(11 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GFX1 is + + + type ROM_ARRAY is array(0 to 4095) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0050 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0058 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0060 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x0068 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x0070 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"3C",x"42",x"81",x"A5",x"A5",x"99",x"42",x"3C", -- 0x0158 + x"38",x"78",x"F8",x"F8",x"F8",x"F8",x"78",x"38", -- 0x0160 + x"00",x"10",x"00",x"2F",x"87",x"20",x"00",x"10", -- 0x0168 + x"38",x"68",x"F8",x"D7",x"7F",x"D8",x"78",x"28", -- 0x0170 + x"38",x"78",x"F8",x"F8",x"F8",x"F8",x"78",x"38", -- 0x0178 + x"38",x"78",x"F8",x"F8",x"F8",x"F8",x"78",x"38", -- 0x0180 + x"00",x"10",x"00",x"2F",x"87",x"20",x"00",x"10", -- 0x0188 + x"38",x"68",x"F8",x"D7",x"7F",x"D8",x"78",x"28", -- 0x0190 + x"38",x"78",x"F8",x"F8",x"F8",x"F8",x"78",x"38", -- 0x0198 + x"00",x"00",x"00",x"03",x"0F",x"1F",x"41",x"00", -- 0x01A0 + x"08",x"3C",x"FE",x"E7",x"8F",x"FE",x"FC",x"00", -- 0x01A8 + x"00",x"41",x"1F",x"0F",x"03",x"00",x"00",x"00", -- 0x01B0 + x"00",x"FC",x"FE",x"8F",x"E7",x"FE",x"3C",x"08", -- 0x01B8 + x"06",x"08",x"03",x"24",x"40",x"10",x"20",x"40", -- 0x01C0 + x"60",x"10",x"00",x"30",x"0A",x"21",x"10",x"00", -- 0x01C8 + x"88",x"A8",x"24",x"08",x"40",x"26",x"10",x"03", -- 0x01D0 + x"15",x"15",x"24",x"80",x"12",x"60",x"04",x"90", -- 0x01D8 + x"00",x"00",x"00",x"00",x"04",x"00",x"08",x"09", -- 0x01E0 + x"00",x"00",x"00",x"00",x"80",x"20",x"80",x"50", -- 0x01E8 + x"00",x"02",x"08",x"04",x"00",x"00",x"00",x"00", -- 0x01F0 + x"90",x"00",x"20",x"40",x"00",x"00",x"00",x"00", -- 0x01F8 + x"00",x"00",x"08",x"08",x"E5",x"15",x"15",x"3A", -- 0x0200 + x"00",x"00",x"80",x"90",x"20",x"4E",x"5F",x"BB", -- 0x0208 + x"3A",x"15",x"15",x"E5",x"08",x"08",x"00",x"00", -- 0x0210 + x"A3",x"5B",x"4E",x"20",x"90",x"80",x"00",x"00", -- 0x0218 + x"00",x"00",x"01",x"22",x"14",x"15",x"15",x"3A", -- 0x0220 + x"00",x"00",x"20",x"48",x"90",x"2E",x"5F",x"BB", -- 0x0228 + x"3A",x"15",x"15",x"14",x"22",x"01",x"00",x"00", -- 0x0230 + x"A3",x"5B",x"2E",x"90",x"48",x"20",x"00",x"00", -- 0x0238 + x"10",x"48",x"2C",x"1C",x"06",x"02",x"00",x"00", -- 0x0240 + x"00",x"02",x"04",x"05",x"8E",x"2C",x"98",x"20", -- 0x0248 + x"00",x"40",x"00",x"00",x"00",x"01",x"00",x"00", -- 0x0250 + x"00",x"40",x"33",x"8C",x"60",x"1E",x"C0",x"38", -- 0x0258 + x"11",x"0A",x"0E",x"04",x"06",x"02",x"00",x"00", -- 0x0260 + x"10",x"14",x"14",x"1C",x"8C",x"28",x"98",x"20", -- 0x0268 + x"00",x"40",x"00",x"00",x"00",x"01",x"00",x"00", -- 0x0270 + x"01",x"42",x"3C",x"81",x"7E",x"00",x"84",x"78", -- 0x0278 + x"00",x"00",x"01",x"01",x"00",x"06",x"06",x"00", -- 0x0280 + x"50",x"90",x"24",x"44",x"18",x"00",x"80",x"40", -- 0x0288 + x"00",x"06",x"06",x"00",x"01",x"01",x"00",x"00", -- 0x0290 + x"40",x"80",x"00",x"18",x"44",x"24",x"90",x"50", -- 0x0298 + x"00",x"06",x"01",x"01",x"00",x"06",x"06",x"00", -- 0x02A0 + x"00",x"00",x"3C",x"40",x"1F",x"00",x"80",x"C0", -- 0x02A8 + x"00",x"06",x"06",x"00",x"01",x"01",x"06",x"00", -- 0x02B0 + x"C0",x"80",x"00",x"1F",x"40",x"38",x"00",x"00", -- 0x02B8 + x"00",x"FF",x"00",x"9F",x"CF",x"9F",x"00",x"FF", -- 0x02C0 + x"FF",x"FF",x"FF",x"C1",x"BE",x"BE",x"80",x"FF", -- 0x02C8 + x"88",x"77",x"00",x"FF",x"80",x"77",x"80",x"FF", -- 0x02D0 + x"BF",x"80",x"BF",x"FF",x"FE",x"FE",x"80",x"FF", -- 0x02D8 + x"FF",x"80",x"77",x"80",x"FF",x"7E",x"00",x"7E", -- 0x02E0 + x"FE",x"80",x"DE",x"FF",x"C9",x"B6",x"B6",x"C9", -- 0x02E8 + x"FF",x"00",x"CF",x"9F",x"00",x"FF",x"7E",x"76", -- 0x02F0 + x"FF",x"C1",x"B6",x"B6",x"CF",x"FE",x"80",x"DE", -- 0x02F8 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"3C", -- 0x0300 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0308 + x"7E",x"FF",x"EF",x"E7",x"7D",x"3C",x"1C",x"08", -- 0x0310 + x"00",x"00",x"00",x"00",x"00",x"80",x"80",x"80", -- 0x0318 + x"7C",x"FE",x"FE",x"C8",x"C0",x"FE",x"7E",x"3C", -- 0x0320 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0328 + x"7E",x"FF",x"9F",x"DD",x"65",x"35",x"1C",x"08", -- 0x0330 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0338 + x"7C",x"FE",x"FE",x"E2",x"C0",x"EE",x"7E",x"3C", -- 0x0340 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0348 + x"7E",x"FF",x"EF",x"ED",x"79",x"38",x"38",x"10", -- 0x0350 + x"00",x"00",x"00",x"00",x"00",x"80",x"40",x"00", -- 0x0358 + x"7C",x"FE",x"FC",x"F0",x"E6",x"CE",x"7E",x"3C", -- 0x0360 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0368 + x"7E",x"FF",x"9F",x"DF",x"65",x"35",x"1C",x"08", -- 0x0370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0378 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"3C", -- 0x0380 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0388 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"3C", -- 0x0390 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0398 + x"7C",x"FE",x"FE",x"C8",x"C2",x"FE",x"7E",x"3C", -- 0x03A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A8 + x"7C",x"FE",x"FE",x"C8",x"C2",x"FE",x"7E",x"3C", -- 0x03B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B8 + x"7C",x"FE",x"FE",x"E0",x"C2",x"EE",x"7E",x"3C", -- 0x03C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C8 + x"7C",x"FE",x"FE",x"E0",x"C2",x"EE",x"7E",x"3C", -- 0x03D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D8 + x"7C",x"FE",x"FE",x"F0",x"E6",x"CE",x"7E",x"3C", -- 0x03E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E8 + x"7C",x"FE",x"FE",x"F0",x"E6",x"CE",x"7E",x"3C", -- 0x03F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F8 + x"00",x"80",x"40",x"60",x"30",x"38",x"3C",x"3C", -- 0x0400 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0408 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"3C", -- 0x0410 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0418 + x"20",x"30",x"18",x"1C",x"3C",x"3C",x"7C",x"7C", -- 0x0420 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0428 + x"7C",x"FE",x"FE",x"C8",x"C2",x"FE",x"7E",x"3C", -- 0x0430 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0438 + x"00",x"0C",x"1C",x"3C",x"38",x"38",x"78",x"7C", -- 0x0440 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0448 + x"7C",x"FE",x"FE",x"E0",x"C2",x"EE",x"7E",x"3C", -- 0x0450 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0458 + x"00",x"03",x"07",x"0E",x"1E",x"3C",x"3C",x"78", -- 0x0460 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0468 + x"7C",x"FE",x"FE",x"F0",x"E6",x"CE",x"7E",x"3C", -- 0x0470 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0478 + x"00",x"80",x"40",x"60",x"30",x"38",x"3C",x"3C", -- 0x0480 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0488 + x"7E",x"FF",x"EF",x"E5",x"7D",x"3D",x"1C",x"08", -- 0x0490 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0498 + x"20",x"30",x"18",x"1C",x"3C",x"3C",x"7C",x"7C", -- 0x04A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04A8 + x"7E",x"FF",x"9F",x"DD",x"65",x"34",x"1C",x"08", -- 0x04B0 + x"00",x"00",x"00",x"00",x"00",x"80",x"40",x"00", -- 0x04B8 + x"00",x"0C",x"1C",x"3C",x"38",x"38",x"78",x"7C", -- 0x04C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04C8 + x"7E",x"FF",x"EF",x"E5",x"7C",x"3C",x"1C",x"08", -- 0x04D0 + x"00",x"00",x"00",x"00",x"80",x"40",x"40",x"00", -- 0x04D8 + x"00",x"03",x"07",x"0E",x"1E",x"3C",x"3C",x"78", -- 0x04E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E8 + x"7E",x"FF",x"9F",x"DF",x"65",x"35",x"1D",x"08", -- 0x04F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F8 + x"7E",x"FF",x"EF",x"E7",x"7D",x"3D",x"1C",x"08", -- 0x0500 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0510 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0518 + x"7E",x"FF",x"EF",x"E7",x"7D",x"3D",x"1C",x"08", -- 0x0520 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0530 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0538 + x"7E",x"FF",x"EF",x"E7",x"7D",x"3D",x"1C",x"08", -- 0x0540 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0550 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0558 + x"7E",x"FF",x"EF",x"E7",x"7D",x"3D",x"1C",x"08", -- 0x0560 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0570 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0580 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0588 + x"00",x"80",x"40",x"60",x"30",x"38",x"3C",x"3C", -- 0x0590 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A8 + x"20",x"30",x"18",x"1C",x"3C",x"3C",x"7C",x"7C", -- 0x05B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C8 + x"00",x"0C",x"1C",x"3C",x"38",x"38",x"78",x"7C", -- 0x05D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E8 + x"00",x"03",x"07",x"0E",x"1E",x"3C",x"3C",x"78", -- 0x05F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05F8 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"7C", -- 0x0600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0608 + x"7F",x"3F",x"3F",x"1E",x"1C",x"0F",x"0F",x"07", -- 0x0610 + x"C0",x"00",x"E0",x"F0",x"E0",x"C0",x"80",x"00", -- 0x0618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0620 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0628 + x"3C",x"78",x"71",x"73",x"3F",x"1F",x"0E",x"00", -- 0x0630 + x"7C",x"F0",x"FE",x"EF",x"CE",x"FC",x"F8",x"70", -- 0x0638 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0640 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0648 + x"1C",x"18",x"18",x"1B",x"1F",x"0F",x"03",x"00", -- 0x0650 + x"18",x"7D",x"FD",x"CD",x"DE",x"DC",x"F8",x"70", -- 0x0658 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0660 + x"08",x"1C",x"3D",x"7D",x"E7",x"EF",x"FF",x"7E", -- 0x0668 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0670 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"7C", -- 0x0678 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"3C", -- 0x0680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0688 + x"3C",x"3E",x"1E",x"1F",x"0F",x"0F",x"07",x"01", -- 0x0690 + x"E0",x"70",x"78",x"F8",x"F8",x"F0",x"E0",x"C0", -- 0x0698 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A8 + x"3C",x"78",x"71",x"73",x"3F",x"1F",x"0E",x"00", -- 0x06B0 + x"18",x"CC",x"CE",x"DE",x"FE",x"FC",x"F8",x"70", -- 0x06B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"1C",x"3E", -- 0x06C8 + x"00",x"00",x"03",x"07",x"07",x"07",x"07",x"03", -- 0x06D0 + x"7F",x"FF",x"FF",x"FF",x"FE",x"FC",x"38",x"80", -- 0x06D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06E0 + x"00",x"1C",x"3F",x"7F",x"EF",x"E7",x"F3",x"78", -- 0x06E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F0 + x"7C",x"FE",x"CE",x"C0",x"E0",x"FE",x"7E",x"7C", -- 0x06F8 + x"40",x"26",x"19",x"C6",x"39",x"06",x"39",x"C6", -- 0x0700 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0708 + x"00",x"09",x"19",x"00",x"00",x"00",x"00",x"00", -- 0x0710 + x"00",x"00",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0718 + x"40",x"26",x"19",x"C6",x"39",x"06",x"39",x"C6", -- 0x0720 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0728 + x"00",x"09",x"19",x"00",x"00",x"00",x"00",x"00", -- 0x0730 + x"00",x"00",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0738 + x"46",x"2F",x"1F",x"CF",x"3F",x"0F",x"3F",x"C6", -- 0x0740 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0748 + x"00",x"09",x"19",x"00",x"00",x"00",x"00",x"00", -- 0x0750 + x"00",x"00",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0758 + x"40",x"26",x"19",x"C6",x"39",x"06",x"39",x"C6", -- 0x0760 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0768 + x"00",x"09",x"19",x"00",x"00",x"00",x"00",x"00", -- 0x0770 + x"00",x"00",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0778 + x"09",x"17",x"3C",x"1B",x"3F",x"EF",x"DF",x"BF", -- 0x0780 + x"80",x"E0",x"F8",x"CC",x"F4",x"DE",x"EF",x"FF", -- 0x0788 + x"77",x"57",x"DB",x"77",x"3F",x"19",x"0F",x"04", -- 0x0790 + x"EA",x"EA",x"DB",x"7E",x"EC",x"9C",x"F8",x"40", -- 0x0798 + x"03",x"07",x"1F",x"1F",x"3B",x"3F",x"37",x"36", -- 0x07A0 + x"C0",x"E0",x"F0",x"F8",x"7C",x"DC",x"7C",x"AC", -- 0x07A8 + x"3F",x"3D",x"37",x"1B",x"1F",x"1F",x"0F",x"07", -- 0x07B0 + x"6C",x"FC",x"DC",x"BC",x"F8",x"F8",x"F0",x"E0", -- 0x07B8 + x"24",x"94",x"4C",x"FF",x"FF",x"4C",x"94",x"24", -- 0x07C0 + x"24",x"94",x"4C",x"FF",x"FF",x"4C",x"94",x"24", -- 0x07C8 + x"24",x"94",x"4C",x"FF",x"FF",x"4C",x"94",x"24", -- 0x07D0 + x"24",x"94",x"4C",x"FF",x"FF",x"4C",x"94",x"24", -- 0x07D8 + x"1E",x"3F",x"7E",x"00",x"00",x"7E",x"3F",x"1E", -- 0x07E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F8 + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0800 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0808 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0810 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0818 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0820 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0828 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0830 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0838 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0840 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0848 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0850 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0858 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0860 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x0868 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x0870 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x0878 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0880 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0888 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0890 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0898 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x08A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x08A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x08B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x08B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x08C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x08C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x08D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x08D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x08E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x08E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x08F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x08F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0900 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0908 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0910 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0918 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0920 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0928 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0930 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0938 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0940 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0948 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0950 + x"3C",x"42",x"81",x"A5",x"A5",x"99",x"42",x"3C", -- 0x0958 + x"38",x"68",x"F8",x"D7",x"7F",x"D8",x"78",x"28", -- 0x0960 + x"38",x"68",x"F8",x"D7",x"7F",x"D8",x"78",x"28", -- 0x0968 + x"38",x"78",x"F8",x"F8",x"F8",x"F8",x"78",x"38", -- 0x0970 + x"00",x"10",x"00",x"2F",x"87",x"20",x"00",x"10", -- 0x0978 + x"38",x"68",x"F8",x"D7",x"7F",x"D8",x"78",x"28", -- 0x0980 + x"38",x"68",x"F8",x"D7",x"7F",x"D8",x"78",x"28", -- 0x0988 + x"38",x"78",x"F8",x"F8",x"F8",x"F8",x"78",x"38", -- 0x0990 + x"00",x"10",x"00",x"2F",x"87",x"20",x"00",x"10", -- 0x0998 + x"00",x"00",x"00",x"00",x"01",x"00",x"5E",x"FF", -- 0x09A0 + x"00",x"00",x"18",x"7C",x"F4",x"78",x"00",x"F8", -- 0x09A8 + x"FF",x"5E",x"00",x"01",x"00",x"00",x"00",x"00", -- 0x09B0 + x"F8",x"00",x"78",x"F4",x"7C",x"18",x"00",x"00", -- 0x09B8 + x"00",x"00",x"03",x"04",x"01",x"12",x"22",x"00", -- 0x09C0 + x"00",x"00",x"00",x"30",x"08",x"00",x"00",x"C0", -- 0x09C8 + x"02",x"21",x"20",x"10",x"00",x"06",x"00",x"00", -- 0x09D0 + x"44",x"04",x"04",x"00",x"10",x"60",x"00",x"00", -- 0x09D8 + x"02",x"00",x"00",x"10",x"10",x"20",x"00",x"01", -- 0x09E0 + x"C0",x"00",x"10",x"08",x"00",x"00",x"84",x"40", -- 0x09E8 + x"20",x"22",x"00",x"00",x"10",x"00",x"00",x"06", -- 0x09F0 + x"80",x"04",x"04",x"00",x"00",x"10",x"00",x"40", -- 0x09F8 + x"00",x"00",x"08",x"08",x"E5",x"15",x"42",x"2F", -- 0x0A00 + x"00",x"00",x"80",x"90",x"20",x"40",x"84",x"DE", -- 0x0A08 + x"05",x"42",x"15",x"E5",x"08",x"08",x"00",x"00", -- 0x0A10 + x"5E",x"84",x"40",x"20",x"90",x"80",x"00",x"00", -- 0x0A18 + x"00",x"00",x"01",x"22",x"14",x"15",x"42",x"2F", -- 0x0A20 + x"00",x"00",x"20",x"48",x"90",x"20",x"84",x"DE", -- 0x0A28 + x"05",x"42",x"15",x"14",x"22",x"01",x"00",x"00", -- 0x0A30 + x"5E",x"84",x"20",x"90",x"48",x"20",x"00",x"00", -- 0x0A38 + x"10",x"48",x"2C",x"1C",x"06",x"03",x"01",x"03", -- 0x0A40 + x"00",x"02",x"04",x"05",x"4E",x"CC",x"78",x"E0", -- 0x0A48 + x"03",x"03",x"83",x"C7",x"7F",x"3F",x"1E",x"00", -- 0x0A50 + x"E0",x"E0",x"F3",x"CC",x"E0",x"9E",x"C0",x"38", -- 0x0A58 + x"11",x"0A",x"0E",x"04",x"06",x"03",x"01",x"03", -- 0x0A60 + x"10",x"14",x"14",x"1C",x"4C",x"C8",x"78",x"E0", -- 0x0A68 + x"03",x"03",x"83",x"C7",x"7F",x"3F",x"1E",x"00", -- 0x0A70 + x"E1",x"E2",x"FC",x"C1",x"FE",x"80",x"84",x"78", -- 0x0A78 + x"00",x"00",x"01",x"01",x"03",x"01",x"0B",x"0F", -- 0x0A80 + x"50",x"90",x"24",x"C4",x"D8",x"E0",x"60",x"B0", -- 0x0A88 + x"0F",x"0B",x"01",x"03",x"01",x"01",x"00",x"00", -- 0x0A90 + x"B0",x"60",x"E0",x"D8",x"C4",x"24",x"90",x"50", -- 0x0A98 + x"00",x"06",x"01",x"01",x"03",x"07",x"0D",x"0F", -- 0x0AA0 + x"00",x"00",x"3C",x"C0",x"DF",x"E0",x"60",x"30", -- 0x0AA8 + x"0F",x"0D",x"07",x"03",x"01",x"01",x"06",x"00", -- 0x0AB0 + x"30",x"60",x"E0",x"DF",x"C0",x"38",x"00",x"00", -- 0x0AB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0AC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0AC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0AD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0AD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0AE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0AE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0AF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0AF8 + x"70",x"F8",x"FC",x"BE",x"9F",x"CC",x"78",x"30", -- 0x0B00 + x"00",x"00",x"00",x"00",x"00",x"80",x"40",x"00", -- 0x0B08 + x"78",x"FC",x"9E",x"DE",x"66",x"35",x"1D",x"09", -- 0x0B10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B18 + x"70",x"F8",x"FC",x"BF",x"BF",x"CC",x"78",x"30", -- 0x0B20 + x"00",x"00",x"00",x"00",x"C0",x"00",x"00",x"00", -- 0x0B28 + x"78",x"FC",x"EE",x"E6",x"7E",x"3E",x"1D",x"08", -- 0x0B30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"80", -- 0x0B38 + x"70",x"F8",x"CC",x"9C",x"BF",x"DC",x"78",x"30", -- 0x0B40 + x"00",x"00",x"40",x"80",x"00",x"00",x"00",x"00", -- 0x0B48 + x"78",x"FC",x"9E",x"DE",x"6A",x"39",x"39",x"12", -- 0x0B50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B58 + x"70",x"F9",x"CE",x"8E",x"9C",x"FC",x"78",x"30", -- 0x0B60 + x"C0",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B68 + x"78",x"FC",x"EE",x"E6",x"7E",x"3E",x"1D",x"09", -- 0x0B70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B78 + x"70",x"F8",x"FC",x"BE",x"9F",x"CD",x"78",x"30", -- 0x0B80 + x"00",x"00",x"00",x"00",x"00",x"00",x"C0",x"00", -- 0x0B88 + x"70",x"F8",x"FC",x"BE",x"9E",x"CD",x"78",x"30", -- 0x0B90 + x"00",x"00",x"00",x"00",x"00",x"00",x"C0",x"00", -- 0x0B98 + x"70",x"F8",x"FC",x"BF",x"BC",x"CC",x"78",x"30", -- 0x0BA0 + x"00",x"00",x"00",x"00",x"80",x"40",x"00",x"00", -- 0x0BA8 + x"70",x"F8",x"FC",x"BF",x"BC",x"CC",x"78",x"30", -- 0x0BB0 + x"00",x"00",x"00",x"00",x"80",x"40",x"00",x"00", -- 0x0BB8 + x"70",x"F8",x"CC",x"9F",x"BC",x"DC",x"78",x"30", -- 0x0BC0 + x"00",x"00",x"00",x"80",x"00",x"00",x"00",x"00", -- 0x0BC8 + x"70",x"F8",x"CC",x"9F",x"BC",x"DC",x"78",x"30", -- 0x0BD0 + x"00",x"00",x"00",x"80",x"00",x"00",x"00",x"00", -- 0x0BD8 + x"70",x"F8",x"CD",x"8F",x"9C",x"FC",x"78",x"30", -- 0x0BE0 + x"00",x"40",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0BE8 + x"70",x"F8",x"CD",x"8F",x"9C",x"FC",x"78",x"30", -- 0x0BF0 + x"00",x"40",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0BF8 + x"00",x"80",x"40",x"60",x"20",x"20",x"30",x"38", -- 0x0C00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C08 + x"78",x"F8",x"FC",x"BE",x"9F",x"CD",x"78",x"30", -- 0x0C10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C18 + x"20",x"30",x"10",x"10",x"38",x"38",x"78",x"78", -- 0x0C20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C28 + x"70",x"F8",x"FC",x"BF",x"BC",x"CC",x"78",x"30", -- 0x0C30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C38 + x"00",x"08",x"18",x"30",x"30",x"20",x"70",x"70", -- 0x0C40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C48 + x"78",x"F8",x"CC",x"9F",x"BC",x"DC",x"78",x"30", -- 0x0C50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C58 + x"00",x"02",x"04",x"0C",x"18",x"38",x"30",x"70", -- 0x0C60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C68 + x"70",x"F8",x"CD",x"8F",x"9C",x"FC",x"78",x"30", -- 0x0C70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C78 + x"00",x"80",x"40",x"60",x"20",x"20",x"30",x"38", -- 0x0C80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C88 + x"78",x"FC",x"9E",x"DE",x"66",x"36",x"1E",x"0A", -- 0x0C90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C98 + x"20",x"30",x"10",x"10",x"38",x"38",x"78",x"78", -- 0x0CA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CA8 + x"78",x"FC",x"EE",x"E6",x"7E",x"3D",x"1C",x"08", -- 0x0CB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"80", -- 0x0CB8 + x"00",x"08",x"18",x"30",x"30",x"20",x"70",x"70", -- 0x0CC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CC8 + x"78",x"FC",x"9E",x"DE",x"66",x"35",x"1C",x"09", -- 0x0CD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"80", -- 0x0CD8 + x"00",x"02",x"04",x"0C",x"18",x"38",x"30",x"70", -- 0x0CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CE8 + x"78",x"FC",x"EE",x"E6",x"7E",x"3E",x"1E",x"09", -- 0x0CF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF8 + x"78",x"FC",x"9E",x"DE",x"64",x"34",x"1C",x"08", -- 0x0D00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D18 + x"78",x"FC",x"9E",x"DE",x"64",x"34",x"1C",x"08", -- 0x0D20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D38 + x"78",x"FC",x"9E",x"DE",x"64",x"34",x"1C",x"08", -- 0x0D40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D58 + x"78",x"FC",x"9E",x"DE",x"64",x"34",x"1C",x"08", -- 0x0D60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D88 + x"00",x"80",x"40",x"60",x"20",x"20",x"30",x"38", -- 0x0D90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DA8 + x"20",x"30",x"10",x"10",x"38",x"38",x"78",x"78", -- 0x0DB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DC8 + x"00",x"08",x"18",x"30",x"30",x"20",x"70",x"70", -- 0x0DD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DE8 + x"00",x"02",x"04",x"0C",x"18",x"38",x"30",x"70", -- 0x0DF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DF8 + x"70",x"F8",x"FC",x"BE",x"9F",x"CD",x"78",x"70", -- 0x0E00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E08 + x"78",x"37",x"3F",x"1F",x"1F",x"0C",x"0D",x"07", -- 0x0E10 + x"00",x"00",x"E0",x"30",x"60",x"C0",x"80",x"00", -- 0x0E18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E28 + x"39",x"7E",x"7E",x"6F",x"33",x"1F",x"0E",x"00", -- 0x0E30 + x"00",x"30",x"7E",x"F3",x"F6",x"CC",x"D8",x"70", -- 0x0E38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E48 + x"19",x"1F",x"1E",x"1D",x"1F",x"0F",x"07",x"06", -- 0x0E50 + x"18",x"7C",x"FC",x"FC",x"B8",x"B0",x"D0",x"60", -- 0x0E58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E60 + x"08",x"1C",x"34",x"64",x"DE",x"9E",x"FC",x"78", -- 0x0E68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E70 + x"70",x"F8",x"FC",x"BE",x"9F",x"CD",x"78",x"00", -- 0x0E78 + x"70",x"F8",x"FC",x"BE",x"9F",x"CD",x"78",x"32", -- 0x0E80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E88 + x"3F",x"3D",x"1D",x"1F",x"0F",x"0F",x"07",x"01", -- 0x0E90 + x"00",x"C0",x"E0",x"30",x"F8",x"F0",x"E0",x"C0", -- 0x0E98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EA8 + x"39",x"7E",x"7E",x"6F",x"33",x"1F",x"0E",x"00", -- 0x0EB0 + x"60",x"30",x"7E",x"EE",x"CE",x"FC",x"F8",x"70", -- 0x0EB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x0EC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"9C",x"3E", -- 0x0EC8 + x"01",x"03",x"03",x"07",x"07",x"07",x"07",x"03", -- 0x0ED0 + x"FE",x"FE",x"FE",x"FC",x"F8",x"F0",x"E0",x"FC", -- 0x0ED8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EE0 + x"00",x"1C",x"3C",x"7E",x"FE",x"DE",x"CC",x"7F", -- 0x0EE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EF0 + x"71",x"F8",x"FC",x"BE",x"9F",x"CD",x"78",x"00", -- 0x0EF8 + x"46",x"2D",x"16",x"CD",x"36",x"0D",x"36",x"C4", -- 0x0F00 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0F08 + x"1F",x"36",x"6F",x"FF",x"CF",x"C6",x"40",x"40", -- 0x0F10 + x"80",x"C0",x"60",x"F0",x"30",x"30",x"20",x"20", -- 0x0F18 + x"46",x"2D",x"16",x"CD",x"36",x"0D",x"36",x"C4", -- 0x0F20 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0F28 + x"1F",x"36",x"6F",x"FF",x"CF",x"66",x"20",x"20", -- 0x0F30 + x"80",x"C0",x"60",x"F0",x"30",x"60",x"40",x"40", -- 0x0F38 + x"44",x"2C",x"1C",x"CC",x"3C",x"0C",x"3C",x"C4", -- 0x0F40 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0F48 + x"1F",x"36",x"6F",x"FF",x"CF",x"66",x"30",x"10", -- 0x0F50 + x"80",x"C0",x"60",x"F0",x"30",x"60",x"C0",x"80", -- 0x0F58 + x"46",x"2D",x"16",x"CD",x"36",x"0D",x"36",x"C4", -- 0x0F60 + x"20",x"40",x"80",x"30",x"C0",x"00",x"C0",x"30", -- 0x0F68 + x"1F",x"36",x"6F",x"FF",x"FF",x"76",x"19",x"06", -- 0x0F70 + x"80",x"C0",x"60",x"F0",x"F0",x"E0",x"80",x"00", -- 0x0F78 + x"0F",x"1F",x"3C",x"3B",x"7E",x"ED",x"DD",x"FF", -- 0x0F80 + x"E0",x"F0",x"F8",x"CC",x"F6",x"FF",x"FF",x"3F", -- 0x0F88 + x"FD",x"DE",x"DF",x"6F",x"7F",x"39",x"1F",x"07", -- 0x0F90 + x"BB",x"FB",x"FB",x"FE",x"EE",x"9C",x"F8",x"C0", -- 0x0F98 + x"01",x"07",x"1F",x"0F",x"2F",x"1F",x"3F",x"3E", -- 0x0FA0 + x"00",x"E0",x"E0",x"F0",x"FC",x"FC",x"78",x"BC", -- 0x0FA8 + x"1F",x"1D",x"3F",x"1F",x"0F",x"1F",x"0F",x"01", -- 0x0FB0 + x"7C",x"F8",x"F8",x"FC",x"F8",x"E8",x"F0",x"A0", -- 0x0FB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FC0 + x"24",x"14",x"0C",x"3F",x"3F",x"0C",x"14",x"24", -- 0x0FC8 + x"20",x"90",x"40",x"F0",x"F0",x"40",x"90",x"20", -- 0x0FD0 + x"24",x"94",x"4C",x"FF",x"FF",x"4C",x"94",x"24", -- 0x0FD8 + x"00",x"0C",x"14",x"FE",x"FE",x"14",x"0C",x"00", -- 0x0FE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x0FF8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + DATA <= ROM(to_integer(unsigned(ADDR))); + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/WarOfTheBugs.sv b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/WarOfTheBugs.sv new file mode 100644 index 00000000..63673276 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/WarOfTheBugs.sv @@ -0,0 +1,176 @@ +//============================================================================ +// Arcade: WarOfTheBugs +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module WarOfTheBugs +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "WarOfTheBugs;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_18, clk_12, clk_6, clk_4p5; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_18), + .c1(clk_12), + .c2(clk_6), + .c3(clk_4p5)//for now, needs a fix +); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +galaxian warofbugs +( + .W_CLK_18M(clk_18), + .W_CLK_12M(clk_12), + .W_CLK_6M(clk_6), + .I_RESET(status[0] | status[6] | buttons[1]), + .P1_CSJUDLR({m_coin,m_start1,m_fire,m_up,m_down,m_left,m_right}), + .P2_CSJUDLR({1'b0, m_start2,m_fire,m_up,m_down,m_left,m_right}), + .W_R(r), + .W_G(g), + .W_B(b), + .W_H_SYNC(hs), + .W_V_SYNC(vs), + .HBLANK(hblank), + .VBLANK(vblank), + .W_SDAT_A(audio_a), + .W_SDAT_B(audio_b) +); + +wire [7:0] audio_a, audio_b; +wire [10:0] audio = {1'b0, audio_b, 2'b0} + {3'b0, audio_a}; + +dac dac ( + .clk_i(clk_18), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [2:0] r, g, b; +wire hblank, vblank; +wire blankn = ~(hblank | vblank); +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_18), + .ce_pix(clk_4p5), + .ce_pix_actual(clk_4p5), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn?r:"000"), + .G(blankn?g:"000"), + .B(blankn?b:"000"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_18 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_18), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/build_id.tcl b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_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/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/build_id.v b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/build_id.v new file mode 100644 index 00000000..a0609192 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180103" +`define BUILD_TIME "163543" diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c07d2629 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1093 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..6bd576cf --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..ee217402 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2026 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..679730ab --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80as.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80as.vhd new file mode 100644 index 00000000..fe477f50 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/cpu/T80as.vhd @@ -0,0 +1,283 @@ +------------------------------------------------------------------------------ +-- t80as.vhd : The non-tristate signal edition of t80a.vhd +-- +-- 2003.2.7 non-tristate modification by Tatsuyuki Satoh +-- +-- 1.separate 'D' to 'DO' and 'DI'. +-- 2.added 'DOE' to 'DO' enable signal.(data direction) +-- 3.MREQ_n,IORQ_n,RD_n,WR_n,RFSH_n,A doesn't become the condition of 'Z'. +-- +-- There is a mark of "--AS" in all the change points. +-- +------------------------------------------------------------------------------ + +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80as is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); +--AS-- D : inout std_logic_vector(7 downto 0) +--AS>> + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + DOE : out std_logic +--< 'Z'); +--AS-- D <= DO when Write = '1' and BUSAK_n_i = '1' else (others => 'Z'); +--AS>> + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DOE <= Write when BUSAK_n_i = '1' else '0'; +--< Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, +-- DInst => D, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then +--AS-- DI_Reg <= to_x01(D); +--AS>> + DI_Reg <= to_x01(DI); +--< 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/dac.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/dac.vhd new file mode 100644 index 00000000..b1ecdcb7 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_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 := 11 + ); + 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/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/dpram.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..dafe8385 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/galaxian.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/galaxian.vhd new file mode 100644 index 00000000..a2c66505 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/galaxian.vhd @@ -0,0 +1,450 @@ +------------------------------------------------------------------------------ +-- FPGA GALAXIAN +-- +-- Version downto 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important not +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +-- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--use work.pkg_galaxian.all; + +entity galaxian is + port( + W_CLK_18M : in std_logic; + W_CLK_12M : in std_logic; + W_CLK_6M : in std_logic; + + P1_CSJUDLR : in std_logic_vector(6 downto 0); + P2_CSJUDLR : in std_logic_vector(6 downto 0); + I_RESET : in std_logic; + + W_R : out std_logic_vector(2 downto 0); + W_G : out std_logic_vector(2 downto 0); + W_B : out std_logic_vector(2 downto 0); + HBLANK : out std_logic; + VBLANK : out std_logic; + W_H_SYNC : out std_logic; + W_V_SYNC : out std_logic; + W_SDAT_A : out std_logic_vector( 7 downto 0); + W_SDAT_B : out std_logic_vector( 7 downto 0); + O_CMPBL : out std_logic + ); +end; + +architecture RTL of galaxian is + -- CPU ADDRESS BUS + signal W_A : std_logic_vector(15 downto 0) := (others => '0'); + -- CPU IF + signal W_CPU_CLK : std_logic := '0'; + signal W_CPU_MREQn : std_logic := '0'; + signal W_CPU_NMIn : std_logic := '0'; + signal W_CPU_RDn : std_logic := '0'; + signal W_CPU_RFSHn : std_logic := '0'; + signal W_CPU_WAITn : std_logic := '0'; + signal W_CPU_WRn : std_logic := '0'; + signal W_CPU_WR : std_logic := '0'; + signal W_RESETn : std_logic := '0'; + -------- H and V COUNTER ------------------------- + signal W_C_BLn : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_C_BLXn : std_logic := '0'; + signal W_H_BL : std_logic := '0'; + signal W_H_SYNC_int : std_logic := '0'; + signal W_V_BLn : std_logic := '0'; + signal W_V_BL2n : std_logic := '0'; + signal W_V_SYNC_int : std_logic := '0'; + signal W_H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal W_V_CNT : std_logic_vector(7 downto 0) := (others => '0'); + -------- CPU RAM ---------------------------- + signal W_CPU_RAM_DO : std_logic_vector(7 downto 0) := (others => '0'); + -------- ADDRESS DECDER ---------------------- + signal W_BD_G : std_logic := '0'; + signal W_CPU_RAM_CS : std_logic := '0'; + signal W_CPU_RAM_RD : std_logic := '0'; +-- signal W_CPU_RAM_WR : std_logic := '0'; + signal W_CPU_ROM_CS : std_logic := '0'; + signal W_DIP_OE : std_logic := '0'; + signal W_H_FLIP : std_logic := '0'; + signal W_DRIVER_WE : std_logic := '0'; + signal W_OBJ_RAM_RD : std_logic := '0'; + signal W_OBJ_RAM_RQ : std_logic := '0'; + signal W_OBJ_RAM_WR : std_logic := '0'; + signal W_PITCH : std_logic := '0'; + signal W_SOUND_WE : std_logic := '0'; + signal W_STARS_ON : std_logic := '0'; + signal W_STARS_OFFn : std_logic := '0'; + signal W_SW0_OE : std_logic := '0'; + signal W_SW1_OE : std_logic := '0'; + signal W_V_FLIP : std_logic := '0'; + signal W_VID_RAM_RD : std_logic := '0'; + signal W_VID_RAM_WR : std_logic := '0'; + signal W_WDR_OE : std_logic := '0'; + --------- INPORT ----------------------------- + signal W_SW_DO : std_logic_vector( 7 downto 0) := (others => '0'); + --------- VIDEO ----------------------------- + signal W_VID_DO : std_logic_vector( 7 downto 0) := (others => '0'); + ----- DATA I/F ------------------------------------- + signal W_CPU_ROM_DO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_ROM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDO : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_BDI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_CPU_RAM_CLK : std_logic := '0'; + signal W_VOL1 : std_logic := '0'; + signal W_VOL2 : std_logic := '0'; + signal W_FIRE : std_logic := '0'; + signal W_HIT : std_logic := '0'; + signal W_FS : std_logic_vector( 2 downto 0) := (others => '0'); + + signal blx_comb : std_logic := '0'; + signal W_1VF : std_logic := '0'; + signal W_256HnX : std_logic := '0'; + signal W_8HF : std_logic := '0'; + signal W_DAC_A : std_logic := '0'; + signal W_DAC_B : std_logic := '0'; + signal W_MISSILEn : std_logic := '0'; + signal W_SHELLn : std_logic := '0'; + signal W_MS_D : std_logic := '0'; + signal W_MS_R : std_logic := '0'; + signal W_MS_G : std_logic := '0'; + signal W_MS_B : std_logic := '0'; + + signal new_sw : std_logic_vector( 2 downto 0) := (others => '0'); + signal in_game : std_logic_vector( 1 downto 0) := (others => '0'); + signal ROM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal rst_count : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_STARS_B : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_G : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_STARS_R : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_VIDEO_B : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_G : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_VIDEO_R : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_WAV_A0 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A1 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_A2 : std_logic_vector(18 downto 0) := (others => '0'); + signal W_WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_WAV_D2 : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_DAC : std_logic_vector( 3 downto 0) := (others => '0'); + +begin + mc_vid : entity work.MC_VIDEO + port map( + I_CLK_18M => W_CLK_18M, + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT => W_H_CNT, + I_V_CNT => W_V_CNT, + I_H_FLIP => W_H_FLIP, + I_V_FLIP => W_V_FLIP, + I_V_BLn => W_V_BLn, + I_C_BLn => W_C_BLn, + I_A => W_A(9 downto 0), + I_OBJ_SUB_A => "000", + I_BD => W_BDI, + I_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + I_OBJ_RAM_RD => W_OBJ_RAM_RD, + I_OBJ_RAM_WR => W_OBJ_RAM_WR, + I_VID_RAM_RD => W_VID_RAM_RD, + I_VID_RAM_WR => W_VID_RAM_WR, + I_DRIVER_WR => W_DRIVER_WE, + O_C_BLnX => W_C_BLnX, + O_8HF => W_8HF, + O_256HnX => W_256HnX, + O_1VF => W_1VF, + O_MISSILEn => W_MISSILEn, + O_SHELLn => W_SHELLn, + O_BD => W_VID_DO, + O_VID => W_VID, + O_COL => W_COL + ); + + cpu : entity work.T80as + port map ( + RESET_n => W_RESETn, + CLK_n => W_CPU_CLK, + WAIT_n => W_CPU_WAITn, + INT_n => '1', + NMI_n => W_CPU_NMIn, + BUSRQ_n => '1', + MREQ_n => W_CPU_MREQn, + RD_n => W_CPU_RDn, + WR_n => W_CPU_WRn, + RFSH_n => W_CPU_RFSHn, + A => W_A, + DI => W_BDO, + DO => W_BDI, + M1_n => open, + IORQ_n => open, + HALT_n => open, + BUSAK_n => open, + DOE => open + ); + + mc_cpu_ram : entity work.MC_CPU_RAM + port map ( + I_CLK => W_CPU_RAM_CLK, + I_ADDR => W_A(9 downto 0), + I_D => W_BDI, + I_WE => W_CPU_WR, + I_OE => W_CPU_RAM_RD, + O_D => W_CPU_RAM_DO + ); + + mc_adec : entity work.MC_ADEC + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_CPU_CLK => W_CPU_CLK, + I_RSTn => W_RESETn, + + I_CPU_A => W_A, + I_CPU_D => W_BDI(0), + I_MREQn => W_CPU_MREQn, + I_RFSHn => W_CPU_RFSHn, + I_RDn => W_CPU_RDn, + I_WRn => W_CPU_WRn, + I_H_BL => W_H_BL, + I_V_BLn => W_V_BLn, + + O_WAITn => W_CPU_WAITn, + O_NMIn => W_CPU_NMIn, + O_CPU_ROM_CS => W_CPU_ROM_CS, + O_CPU_RAM_RD => W_CPU_RAM_RD, +-- O_CPU_RAM_WR => W_CPU_RAM_WR, + O_CPU_RAM_CS => W_CPU_RAM_CS, + O_OBJ_RAM_RD => W_OBJ_RAM_RD, + O_OBJ_RAM_WR => W_OBJ_RAM_WR, + O_OBJ_RAM_RQ => W_OBJ_RAM_RQ, + O_VID_RAM_RD => W_VID_RAM_RD, + O_VID_RAM_WR => W_VID_RAM_WR, + O_SW0_OE => W_SW0_OE, + O_SW1_OE => W_SW1_OE, + O_DIP_OE => W_DIP_OE, + O_WDR_OE => W_WDR_OE, + O_DRIVER_WE => W_DRIVER_WE, + O_SOUND_WE => W_SOUND_WE, + O_PITCH => W_PITCH, + O_H_FLIP => W_H_FLIP, + O_V_FLIP => W_V_FLIP, + O_BD_G => W_BD_G, + O_STARS_ON => W_STARS_ON + ); + + -- active high buttons + mc_inport : entity work.MC_INPORT + port map ( + I_COIN1 => P1_CSJUDLR(6), + I_COIN2 => P2_CSJUDLR(6), + I_1P_START => P1_CSJUDLR(5), + I_2P_START => P2_CSJUDLR(5), + I_1P_SH => P1_CSJUDLR(4), + I_2P_SH => P2_CSJUDLR(4), + I_1P_UP => P1_CSJUDLR(3), + I_2P_UP => P2_CSJUDLR(3), + I_1P_DW => P1_CSJUDLR(2), + I_2P_DW => P2_CSJUDLR(2), + I_1P_LE => P1_CSJUDLR(1), + I_2P_LE => P2_CSJUDLR(1), + I_1P_RI => P1_CSJUDLR(0), + I_2P_RI => P2_CSJUDLR(0), + I_SW0_OE => W_SW0_OE, + I_SW1_OE => W_SW1_OE, + I_DIP_OE => W_DIP_OE, + O_D => W_SW_DO + ); + + mc_hv : entity work.MC_HV_COUNT + port map( + I_CLK => W_CLK_6M, + I_RSTn => W_RESETn, + O_H_CNT => W_H_CNT, + O_H_SYNC => W_H_SYNC_int, + O_H_BL => W_H_BL, + O_V_CNT => W_V_CNT, + O_V_SYNC => W_V_SYNC_int, + O_V_BL2n => W_V_BL2n, + O_V_BLn => W_V_BLn, + O_C_BLn => W_C_BLn + ); + + mc_col_pal : entity work.MC_COL_PAL + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_VID => W_VID, + I_COL => W_COL, + I_C_BLnX => W_C_BLnX, + O_C_BLXn => W_C_BLXn, + O_STARS_OFFn => W_STARS_OFFn, + O_R => W_VIDEO_R, + O_G => W_VIDEO_G, + O_B => W_VIDEO_B + ); + + mc_stars : entity work.MC_STARS + port map ( + I_CLK_18M => W_CLK_18M, + I_CLK_6M => W_CLK_6M, + I_H_FLIP => W_H_FLIP, + I_V_SYNC => W_V_SYNC_int, + I_8HF => W_8HF, + I_256HnX => W_256HnX, + I_1VF => W_1VF, + I_2V => W_V_CNT(1), + I_STARS_ON => W_STARS_ON, + I_STARS_OFFn => W_STARS_OFFn, + O_R => W_STARS_R, + O_G => W_STARS_G, + O_B => W_STARS_B, + O_NOISE => open + ); + + mc_sound_a : entity work.MC_SOUND_A + port map( + I_CLK_12M => W_CLK_12M, + I_CLK_6M => W_CLK_6M, + I_H_CNT1 => W_H_CNT(1), + I_BD => W_BDI, + I_PITCH => W_PITCH, + I_VOL1 => W_VOL1, + I_VOL2 => W_VOL2, + O_SDAT => W_SDAT_A, + O_DO => open + ); + + vmc_sound_b : entity work.MC_SOUND_B + port map( + I_CLK1 => W_CLK_6M, + I_RSTn => rst_count(3), + I_SW => new_sw, + I_DAC => W_DAC, + I_FS => W_FS, + O_SDAT => W_SDAT_B + ); + +--------- ROM ------------------------------------------------------- + mc_roms : entity work.ROM_PGM_0 + port map ( + CLK => W_CLK_12M, + ADDR => W_A(13 downto 0), + DATA => W_CPU_ROM_DO + ); + +-------- VIDEO ----------------------------- + blx_comb <= not ( W_C_BLXn and W_V_BL2n ); + W_V_SYNC <= not W_V_SYNC_int; + W_H_SYNC <= not W_H_SYNC_int; + O_CMPBL <= W_C_BLnX; + + -- MISSILE => Yellow ; + -- SHELL => White ; + W_MS_D <= not (W_MISSILEn and W_SHELLn); + W_MS_R <= not blx_comb and W_MS_D; + W_MS_G <= not blx_comb and W_MS_D; + W_MS_B <= not blx_comb and W_MS_D and not W_SHELLn ; + + W_R <= W_VIDEO_R or (W_STARS_R & "0") or (W_MS_R & W_MS_R & "0"); + W_G <= W_VIDEO_G or (W_STARS_G & "0") or (W_MS_G & W_MS_G & "0"); + W_B <= W_VIDEO_B or (W_STARS_B & "0") or (W_MS_B & W_MS_B & "0"); + + process(W_CLK_6M) + begin + if rising_edge(W_CLK_6M) then + HBLANK <= not W_C_BLXn; + VBLANK <= not W_V_BL2n; + end if; + end process; + + +----- CPU I/F ------------------------------------- + + W_CPU_CLK <= W_H_CNT(0); + W_CPU_RAM_CLK <= W_CLK_12M and W_CPU_RAM_CS; + + W_CPU_ROM_DOB <= W_CPU_ROM_DO when W_CPU_ROM_CS = '1' else (others=>'0'); + + W_RESETn <= not I_RESET; + W_BDO <= W_SW_DO or W_VID_DO or W_CPU_RAM_DO or W_CPU_ROM_DOB ; + W_CPU_WR <= not W_CPU_WRn; + + new_sw <= (W_FS(2) or W_FS(1) or W_FS(0)) & W_HIT & W_FIRE; + + process(W_CPU_CLK, I_RESET) + begin + if (I_RESET = '1') then + rst_count <= (others => '0'); + elsif rising_edge( W_CPU_CLK) then + if ( rst_count /= x"f") then + rst_count <= rst_count + 1; + end if; + end if; + end process; + +----- Parts 9L --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_FS <= (others=>'0'); + W_HIT <= '0'; + W_FIRE <= '0'; + W_VOL1 <= '0'; + W_VOL2 <= '0'; + elsif rising_edge(W_CLK_12M) then + if (W_SOUND_WE = '1') then + case(W_A(2 downto 0)) is + when "000" => W_FS(0) <= W_BDI(0); + when "001" => W_FS(1) <= W_BDI(0); + when "010" => W_FS(2) <= W_BDI(0); + when "011" => W_HIT <= W_BDI(0); +-- when "100" => UNUSED <= W_BDI(0); + when "101" => W_FIRE <= W_BDI(0); + when "110" => W_VOL1 <= W_BDI(0); + when "111" => W_VOL2 <= W_BDI(0); + when others => null; + end case; + end if; + end if; + end process; + +----- Parts 9M --------- + process(W_CLK_12M, I_RESET) + begin + if (I_RESET = '1') then + W_DAC <= (others=>'0'); + elsif rising_edge(W_CLK_12M) then + if (W_DRIVER_WE = '1') then + case(W_A(2 downto 0)) is + -- next 4 outputs go off board via ULN2075 buffer +-- when "000" => 1P START <= W_BDI(0); +-- when "001" => 2P START <= W_BDI(0); +-- when "010" => COIN LOCK <= W_BDI(0); +-- when "011" => COIN CTR <= W_BDI(0); + when "100" => W_DAC(0) <= W_BDI(0); -- 1M + when "101" => W_DAC(1) <= W_BDI(0); -- 470K + when "110" => W_DAC(2) <= W_BDI(0); -- 220K + when "111" => W_DAC(3) <= W_BDI(0); -- 100K + when others => null; + end case; + end if; + end if; + end process; + +------------------------------------------------------------------------------- +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/hq2x.sv b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_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/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/keyboard.v b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_adec.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_adec.vhd new file mode 100644 index 00000000..7245ce8c --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_adec.vhd @@ -0,0 +1,251 @@ +--------------------------------------------------------------------- +-- FPGA GALAXIAN ADDRESS DECDER +-- +-- Version : 2.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 4-30 galaxian modify by K.DEGAWA +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. +--------------------------------------------------------------------- +-- +--GALAXIAN Address Map +-- +-- Address Item(R..read-mode W..wight-mode) Parts +--0000 - 1FFF CPU-ROM..R ( 7H or 7K ) +--2000 - 3FFF CPU-ROM..R ( 7L ) +--4000 - 47FF CPU-RAM..RW ( 7N & 7P ) +--5000 - 57FF VID-RAM..RW +--5800 - 5FFF OBJ-RAM..RW +--6000 - SW0..R LAMP......W +--6800 - SW1..R SOUND.....W +--7000 - DIP..R +--7001 NMI_ON....W +--7004 STARS_ON..W +--7006 H_FLIP....W +--7007 V-FLIP....W +--7800 WDR..R PITCH.....W +-- +--W MODE +--6000 1P START +--6001 2P START +--6002 COIN LOCKOUT +--6003 COIN COUNTER +--6004 - 6007 SOUND CONTROL(OSC) +-- +--6800 SOUND CONTROL(FS1) +--6801 SOUND CONTROL(FS2) +--6802 SOUND CONTROL(FS3) +--6803 SOUND CONTROL(HIT) +--6805 SOUND CONTROL(SHOT) +--6806 SOUND CONTROL(VOL1) +--6807 SOUND CONTROL(VOL2) +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_ADEC is + port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_CPU_CLK : in std_logic; + I_RSTn : in std_logic; + + I_CPU_A : in std_logic_vector(15 downto 0); + I_CPU_D : in std_logic; + I_MREQn : in std_logic; + I_RFSHn : in std_logic; + I_RDn : in std_logic; + I_WRn : in std_logic; + I_H_BL : in std_logic; + I_V_BLn : in std_logic; + + O_WAITn : out std_logic; + O_NMIn : out std_logic; + O_CPU_ROM_CS : out std_logic; + O_CPU_RAM_RD : out std_logic; + O_CPU_RAM_WR : out std_logic; + O_CPU_RAM_CS : out std_logic; + O_OBJ_RAM_RD : out std_logic; + O_OBJ_RAM_WR : out std_logic; + O_OBJ_RAM_RQ : out std_logic; + O_VID_RAM_RD : out std_logic; + O_VID_RAM_WR : out std_logic; + O_SW0_OE : out std_logic; + O_SW1_OE : out std_logic; + O_DIP_OE : out std_logic; + O_WDR_OE : out std_logic; + O_DRIVER_WE : out std_logic; + O_SOUND_WE : out std_logic; + O_PITCH : out std_logic; + O_H_FLIP : out std_logic; + O_V_FLIP : out std_logic; + O_BD_G : out std_logic; + O_STARS_ON : out std_logic + ); +end; + +architecture RTL of MC_ADEC is + signal W_8E1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8E2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_8P_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_8M_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_9N_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_NMI_ONn : std_logic := '0'; + -------- CPU WAITn ---------------------------------------------- +-- signal W_6S1_Q : std_logic := '0'; + signal W_6S1_Qn : std_logic := '0'; +-- signal W_6S2_Qn : std_logic := '0'; + + signal W_V_BL : std_logic := '0'; + +begin + W_NMI_ONn <= W_9N_Q(1); -- galaxian + +-- O_WAITn <= '1' ; -- No Wait + O_WAITn <= W_6S1_Qn; + + process(I_CPU_CLK, I_V_BLn) + begin + if (I_V_BLn = '0') then +-- W_6S1_Q <= '0'; + W_6S1_Qn <= '1'; + elsif rising_edge(I_CPU_CLK) then +-- W_6S1_Q <= not (I_H_BL or W_8P_Q(2)); + W_6S1_Qn <= I_H_BL or W_8P_Q(2); + end if; + end process; + +-- process(I_CPU_CLK) +-- begin +-- if falling_edge(I_CPU_CLK) then +-- W_6S2_Qn <= not W_6S1_Q; +-- end if; +-- end process; + +-------- CPU NMIn ----------------------------------------------- + W_V_BL <= not I_V_BLn; + process(W_V_BL, W_NMI_ONn) + begin + if (W_NMI_ONn = '0') then + O_NMIn <= '1'; + elsif rising_edge(W_V_BL) then + O_NMIn <= '0'; + end if; + end process; + + ------------------------------------------------------------------- + u_8e1 : entity work.LOGIC_74XX139 + port map ( + I_G => I_MREQn, + I_Sel(1) => I_CPU_A(15), + I_Sel(0) => I_CPU_A(14), + O_Q => W_8E1_Q + ); + + ---------- CPU_ROM CS 0000 - 3FFF --------------------------- + u_8e2 : entity work.LOGIC_74XX139 + port map ( + I_G => I_RDn, + I_Sel(1) => W_8E1_Q(0), + I_Sel(0) => I_CPU_A(13), + O_Q => W_8E2_Q + ); + + O_CPU_ROM_CS <= not (W_8E2_Q(0) and W_8E2_Q(1) ) ; -- 0000 - 3FFF + ------------------------------------------------------------------- + -- ADDRESS + -- W_8E1_Q[0] = 0000 - 3FFF ---- CPU_ROM_USE + -- W_8E1_Q[1] = 4000 - 7FFF ---- GALAXIAN USE *1 + -- W_8E1_Q[2] = 8000 - BFFF ---- MOONCREST USE + -- W_8E1_Q[3] = C000 - FFFF + + u_8p : entity work.LOGIC_74XX138 + port map ( + I_G1 => I_RFSHn, + I_G2a => W_8E1_Q(1), -- <= *1 + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8P_Q + ); + + u_8n : entity work.LOGIC_74XX138 + port map ( + I_G1 => '1', + I_G2a => I_RDn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8N_Q + ); + + u_8m : entity work.LOGIC_74XX138 + port map ( + -- I_G1 => W_6S2_Qn, + I_G1 => '1', -- No Wait + I_G2a => I_WRn, + I_G2b => W_8E1_Q(1), -- <= *1 + I_Sel => I_CPU_A(13 downto 11), + O_Q => W_8M_Q + ); + + O_BD_G <= not (W_8E1_Q(0) and W_8P_Q(0)); + O_OBJ_RAM_RQ <= not W_8P_Q(3); + + O_CPU_RAM_CS <= not (W_8N_Q(0) and W_8M_Q(0)); + + O_WDR_OE <= not W_8N_Q(7); + O_DIP_OE <= not W_8N_Q(6); + O_SW1_OE <= not W_8N_Q(5); + O_SW0_OE <= not W_8N_Q(4); + O_OBJ_RAM_RD <= not W_8N_Q(3); + O_VID_RAM_RD <= not W_8N_Q(2); +-- UNUSED <= not W_8N_Q(1); + O_CPU_RAM_RD <= not W_8N_Q(0); + + O_PITCH <= not W_8M_Q(7); +-- STARS_ON_ENA <= not W_8M_Q(6); + O_SOUND_WE <= not W_8M_Q(5); + O_DRIVER_WE <= not W_8M_Q(4); + O_OBJ_RAM_WR <= not W_8M_Q(3); + O_VID_RAM_WR <= not W_8M_Q(2); +-- UNUSED <= not W_8M_Q(1); + O_CPU_RAM_WR <= not W_8M_Q(0); + + ----- Parts 9N --------- + + process(I_CLK_12M, I_RSTn) + begin + if (I_RSTn = '0') then + W_9N_Q <= (others => '0'); + elsif rising_edge(I_CLK_12M) then + if (W_8M_Q(6) = '0') then + case I_CPU_A(2 downto 0) is + when "000" => W_9N_Q(0) <= I_CPU_D; + when "001" => W_9N_Q(1) <= I_CPU_D; + when "010" => W_9N_Q(2) <= I_CPU_D; + when "011" => W_9N_Q(3) <= I_CPU_D; + when "100" => W_9N_Q(4) <= I_CPU_D; + when "101" => W_9N_Q(5) <= I_CPU_D; + when "110" => W_9N_Q(6) <= I_CPU_D; + when "111" => W_9N_Q(7) <= I_CPU_D; + when others => null; + end case; + end if; + end if; + end process; + + O_STARS_ON <= W_9N_Q(4); + O_H_FLIP <= W_9N_Q(6); + O_V_FLIP <= W_9N_Q(7); + +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_bram.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_bram.vhd new file mode 100644 index 00000000..a6df1ce1 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_bram.vhd @@ -0,0 +1,182 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA & GALAXIAN +-- FPGA BLOCK RAM I/F (XILINX SPARTAN) +-- +-- Version : 2.50 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- mc_col_rom(6L) added by k.Degawa +-- +-- 2004- 5- 6 first release. +-- 2004- 8-23 Improvement with T80-IP. K.Degawa +-- 2004- 9-18 added Xilinx Device K.Degawa +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_top.v use +entity MC_CPU_RAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(9 downto 0); + I_D : in std_logic_vector(7 downto 0); + I_WE : in std_logic; + I_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) + ); +end; +architecture RTL of MC_CPU_RAM is + + signal W_D : std_logic_vector(7 downto 0) := (others => '0'); +begin + O_D <= W_D when I_OE ='1' else (others=>'0'); + + ram_inst : work.spram generic map(10,8) + port map + ( + address => I_ADDR, + clock => I_CLK, + data => I_D, + wren => I_WE, + q => W_D + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_OBJ_RAM is + port( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(7 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(7 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); + end; + +architecture RTL of MC_OBJ_RAM is +begin + + ram_inst : work.dpram generic map(8,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_VID_RAM is + port ( + I_CLKA : in std_logic := '0'; + I_WEA : in std_logic := '0'; + I_CEA : in std_logic := '0'; + I_ADDRA : in std_logic_vector(9 downto 0); + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + + I_CLKB : in std_logic := '0'; + I_WEB : in std_logic := '0'; + I_CEB : in std_logic := '0'; + I_ADDRB : in std_logic_vector(9 downto 0); + I_DB : in std_logic_vector(7 downto 0); + O_DB : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of MC_VID_RAM is +begin + ram_inst : work.dpram generic map(10,8) + port map + ( + clock_a => I_CLKA, + address_a => I_ADDRA, + data_a => I_DA, + q_a => O_DA, + enable_a => I_CEA, + wren_a => I_WEA, + + clock_b => I_CLKB, + address_b => I_ADDRB, + data_b => I_DB, + q_b => O_DB, + enable_b => I_CEB, + wren_b => I_WEB + ); +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +-- mc_video.v use +entity MC_LRAM is + port ( + I_CLK : in std_logic; + I_ADDR : in std_logic_vector(7 downto 0); + I_D : in std_logic_vector(4 downto 0); + I_WE : in std_logic; + O_Dn : out std_logic_vector(4 downto 0) + ); +end; + +architecture RTL of MC_LRAM is + signal W_D : std_logic_vector(4 downto 0) := (others => '0'); +begin + + O_Dn <= not W_D; + + ram_inst : work.dpram generic map(8,5) + port map + ( + clock_a => I_CLK, + address_a => I_ADDR, + data_a => I_D, + wren_a => not I_WE, + + clock_b => not I_CLK, + address_b => I_ADDR, + data_b => (others => '0'), + q_b => W_D, + enable_b => '1', + wren_b => '0' + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_clocks.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_clocks.vhd new file mode 100644 index 00000000..5a4d0094 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_clocks.vhd @@ -0,0 +1,85 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA CLOCK GEN +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +----------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity CLOCKGEN is +port ( + CLKIN_IN : in std_logic; + RST_IN : in std_logic; + -- + O_CLK_24M : out std_logic; + O_CLK_18M : out std_logic; + O_CLK_12M : out std_logic; + O_CLK_06M : out std_logic +); +end; + +architecture RTL of CLOCKGEN is + signal state : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr1 : std_logic_vector(1 downto 0) := (others => '0'); + signal ctr2 : std_logic_vector(2 downto 0) := (others => '0'); + signal CLKFB_IN : std_logic := '0'; + signal CLK0_BUF : std_logic := '0'; + signal CLKFX_BUF : std_logic := '0'; + signal CLK_72M : std_logic := '0'; + signal I_DCM_LOCKED : std_logic := '0'; + +begin + dcm_inst : DCM_SP + generic map ( + CLKFX_MULTIPLY => 9, + CLKFX_DIVIDE => 4, + CLKIN_PERIOD => 31.25 + ) + port map ( + CLKIN => CLKIN_IN, + CLKFB => CLKFB_IN, + RST => RST_IN, + CLK0 => CLK0_BUF, + CLKFX => CLKFX_BUF, + LOCKED => I_DCM_LOCKED + ); + + BUFG0 : BUFG port map (I=> CLK0_BUF, O => CLKFB_IN); + BUFG1 : BUFG port map (I=> CLKFX_BUF, O => CLK_72M); + O_CLK_06M <= ctr2(2); + O_CLK_12M <= ctr2(1); + O_CLK_24M <= ctr2(0); + O_CLK_18M <= ctr1(1); + + -- generate all clocks, 36Mhz, 18Mhz, 24Mhz, 12Mhz and 6Mhz + process(CLK_72M) + begin + if rising_edge(CLK_72M) then + if (I_DCM_LOCKED = '0') then + state <= "00"; + ctr1 <= (others=>'0'); + ctr2 <= (others=>'0'); + else + ctr1 <= ctr1 + 1; + case state is + when "00" => state <= "01"; ctr2 <= ctr2 + 1; + when "01" => state <= "10"; ctr2 <= ctr2 + 1; + when "10" => state <= "00"; + when "11" => state <= "00"; + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_col_pal.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_col_pal.vhd new file mode 100644 index 00000000..c4dc06ad --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_col_pal.vhd @@ -0,0 +1,78 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA COLOR-PALETTE +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-18 added Xilinx Device. K.Degawa +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; +-- use ieee.numeric_std.all; + +--library UNISIM; +-- use UNISIM.Vcomponents.all; + +entity MC_COL_PAL is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_VID : in std_logic_vector(1 downto 0); + I_COL : in std_logic_vector(2 downto 0); + I_C_BLnX : in std_logic; + + O_C_BLXn : out std_logic; + O_STARS_OFFn : out std_logic; + O_R : out std_logic_vector(2 downto 0); + O_G : out std_logic_vector(2 downto 0); + O_B : out std_logic_vector(2 downto 0) +); +end; + +architecture RTL of MC_COL_PAL is + --- Parts 6M -------------------------------------------------------- + signal W_COL_ROM_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6M_DI : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_DO : std_logic_vector(6 downto 0) := (others => '0'); + signal W_6M_CLR : std_logic := '0'; + +begin + W_6M_DI <= I_COL(2 downto 0) & I_VID(1 downto 0) & not (I_VID(0) or I_VID(1)) & I_C_BLnX; + W_6M_CLR <= W_6M_DI(0) or W_6M_DO(0); + O_C_BLXn <= W_6M_DI(0) or W_6M_DO(0); + O_STARS_OFFn <= W_6M_DO(1); + +--always@(posedge I_CLK_6M or negedge W_6M_CLR) + process(I_CLK_6M, W_6M_CLR) + begin + if (W_6M_CLR = '0') then + W_6M_DO <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + W_6M_DO <= W_6M_DI; + end if; + end process; + + --- COL ROM -------------------------------------------------------- +--wire W_COL_ROM_OEn = W_6M_DO[1]; + + galaxian_6l : entity work.GALAXIAN_6L + port map ( + CLK => I_CLK_12M, + ADDR => W_6M_DO(6 downto 2), + DATA => W_COL_ROM_DO + ); + + --- VID OUT -------------------------------------------------------- + O_R <= W_COL_ROM_DO(2 downto 0); + O_G <= W_COL_ROM_DO(5 downto 3); + O_B <= W_COL_ROM_DO(7 downto 6) & "0"; + +end; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_hv_count.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_hv_count.vhd new file mode 100644 index 00000000..f310321b --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_hv_count.vhd @@ -0,0 +1,145 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA H & V COUNTER +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 +----------------------------------------------------------------------- +-- MoonCrest hv_count +-- H_CNT 0 - 255 , 384 - 511 Total 384 count +-- V_CNT 0 - 255 , 504 - 511 Total 264 count +------------------------------------------------------------------------------------------- +-- H_CNT[0], H_CNT[1], H_CNT[2], H_CNT[3], H_CNT[4], H_CNT[5], H_CNT[6], H_CNT[7], H_CNT[8], +-- 1 H 2 H 4 H 8 H 16 H 32 H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT[0], V_CNT[1], V_CNT[2], V_CNT[3], V_CNT[4], V_CNT[5], V_CNT[6], V_CNT[7] +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_HV_COUNT is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + O_H_CNT : out std_logic_vector(8 downto 0); + O_H_SYNC : out std_logic; + O_H_BL : out std_logic; + O_V_BL2n : out std_logic; + O_V_CNT : out std_logic_vector(7 downto 0); + O_V_SYNC : out std_logic; + O_V_BLn : out std_logic; + O_C_BLn : out std_logic + ); +end; + +architecture RTL of MC_HV_COUNT is + signal H_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal V_CNT : std_logic_vector(8 downto 0) := (others => '0'); + signal H_SYNC : std_logic := '0'; + signal H_CLK : std_logic := '0'; + signal H_BL : std_logic := '0'; + signal V_BLn : std_logic := '0'; + signal V_BL2n : std_logic := '0'; + +begin +--------- H_COUNT ---------------------------------------- + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if (H_CNT = 255) then + H_CNT <= std_logic_vector(to_unsigned(384, H_CNT'length)); + else + H_CNT <= H_CNT + 1 ; + end if; + end if; + end process; + + O_H_CNT <= H_CNT; + +--------- H_SYNC ---------------------------------------- + H_CLK <= H_CNT(4); + process(H_CLK, H_CNT(8)) + begin + if (H_CNT(8) = '0') then + H_SYNC <= '0'; + elsif rising_edge(H_CLK) then + H_SYNC <= (not H_CNT(6) ) and H_CNT(5); + end if; + end process; + + O_H_SYNC <= H_SYNC; + +--------- H_BL ------------------------------------------ + + process(I_CLK) + begin + if rising_edge(I_CLK) then + if H_CNT = 387 then + H_BL <= '1'; + elsif H_CNT = 503 then + H_BL <= '0'; + end if; + end if; + end process; + + O_H_BL <= H_BL; + +--------- V_COUNT ---------------------------------------- + process(H_SYNC, I_RSTn) + begin + if (I_RSTn = '0') then + V_CNT <= (others => '0'); + elsif rising_edge(H_SYNC) then + if (V_CNT = 255) then + V_CNT <= std_logic_vector(to_unsigned(504, V_CNT'length)); + else + V_CNT <= V_CNT + 1 ; + end if; + end if; + end process; + + O_V_CNT <= V_CNT(7 downto 0); + O_V_SYNC <= V_CNT(8); + +--------- V_BLn ------------------------------------------ + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BLn <= '0'; + elsif V_CNT(7 downto 0) = 15 then + V_BLn <= '1'; + end if; + end if; + end process; + + process(H_SYNC) + begin + if rising_edge(H_SYNC) then + if V_CNT(7 downto 0) = 239 then + V_BL2n <= '0'; + elsif V_CNT(7 downto 0) = 16 then + V_BL2n <= '1'; + end if; + end if; + end process; + + O_V_BLn <= V_BLn; + O_V_BL2n <= V_BL2n; +------- C_BLn ------------------------------------------ + O_C_BLn <= V_BLn and (not H_CNT(8)); + +end; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_inport.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_inport.vhd new file mode 100644 index 00000000..25250c11 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_inport.vhd @@ -0,0 +1,85 @@ +----------------------------------------------------------------------- +-- FPGA MOONCRESTA INPORT +-- +-- Version : 1.01 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004-4-30 galaxian modify by K.DEGAWA +----------------------------------------------------------------------- + +-- DIP SW 0 1 2 3 4 5 +----------------------------------------------------------------- +-- COIN CHUTE +-- 1 COIN/1 PLAY 1'b0 1'b0 +-- 2 COIN/1 PLAY 1'b1 1'b0 +-- 1 COIN/2 PLAY 1'b0 1'b1 +-- FREE PLAY 1'b1 1'b1 +-- BOUNS +-- 1'b0 1'b0 +-- 1'b1 1'b0 +-- 1'b0 1'b1 +-- 1'b1 1'b1 +-- LIVES +-- 2 1'b0 +-- 3 1'b1 +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_INPORT is +port ( + I_COIN1 : in std_logic; -- active high + I_COIN2 : in std_logic; -- active high + I_1P_LE : in std_logic; -- active high + I_1P_RI : in std_logic; -- active high + I_1P_SH : in std_logic; -- active high + I_1P_UP : in std_logic; -- active high + I_1P_DW : in std_logic; -- active high + + I_2P_LE : in std_logic; + I_2P_RI : in std_logic; + I_2P_SH : in std_logic; + I_2P_UP : in std_logic; -- active high + I_2P_DW : in std_logic; -- active high + I_1P_START : in std_logic; -- active high + I_2P_START : in std_logic; -- active high + I_SW0_OE : in std_logic; + I_SW1_OE : in std_logic; + I_DIP_OE : in std_logic; + O_D : out std_logic_vector(7 downto 0) +); + +end; + +architecture RTL of MC_INPORT is + + constant W_TABLE : std_logic := '0'; -- UP = 0; + constant W_TEST : std_logic := '0'; + constant W_SERVICE : std_logic := '0'; + + signal W_SW0_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SW1_DO : std_logic_vector(7 downto 0) := (others => '0'); + signal W_DIP_DO : std_logic_vector(7 downto 0) := (others => '0'); + +begin + + W_SW0_DO <= x"00" when I_SW0_OE = '0' else I_1P_UP & I_1P_DW & W_TABLE & I_1P_SH & I_1P_RI & I_1P_LE & I_1P_UP & I_COIN1; + W_SW1_DO <= x"00" when I_SW1_OE = '0' else "01" & I_2P_DW & I_2P_SH & I_2P_RI & I_2P_LE & I_2P_START & I_1P_START; + W_DIP_DO <= x"00" when I_DIP_OE = '0' else "00001010"; + O_D <= W_SW0_DO or W_SW1_DO or W_DIP_DO ; + +-- W_SW0_DO <= x"00" when I_SW0_OE = '0' else W_SERVICE & W_TEST & W_TABLE & I_1P_SH & I_1P_RI & I_1P_LE & I_COIN2 & I_COIN1; +-- W_SW1_DO <= x"00" when I_SW1_OE = '0' else "010" & I_2P_SH & I_2P_RI & I_2P_LE & I_2P_START & I_1P_START; +-- W_DIP_DO <= x"00" when I_DIP_OE = '0' else "00001010"; +-- O_D <= W_SW0_DO or W_SW1_DO or W_DIP_DO ; + + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_ld_pls.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_ld_pls.vhd new file mode 100644 index 00000000..0945fe35 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_ld_pls.vhd @@ -0,0 +1,115 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA VIDEO-LD_PLS_GEN +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +-- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_LD_PLS is + port ( + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_3D_DI : in std_logic; + + O_LDn : out std_logic; + O_CNTRLDn : out std_logic; + O_CNTRCLRn : out std_logic; + O_COLLn : out std_logic; + O_VPLn : out std_logic; + O_OBJDATALn : out std_logic; + O_MLDn : out std_logic; + O_SLDn : out std_logic + ); +end; + +architecture RTL of MC_LD_PLS is + signal W_4C1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4C1_Q3 : std_logic := '0'; + signal W_4C2_B : std_logic := '0'; + signal W_4D1_G : std_logic := '0'; + signal W_4D1_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_4D2_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_5C_Q : std_logic := '0'; + signal W_HCNT : std_logic := '0'; +begin + O_LDn <= W_4D1_G; + O_CNTRLDn <= W_4D1_Q(2); + O_CNTRCLRn <= W_4D1_Q(0); + O_COLLn <= W_4D2_Q(2); + O_VPLn <= W_4D2_Q(0); + O_OBJDATALn <= W_4C1_Q(2); + O_MLDn <= W_4C2_Q(0); + O_SLDn <= W_4C2_Q(1); + W_4D1_G <= not (I_H_CNT(0) and I_H_CNT(1) and I_H_CNT(2)); + W_HCNT <= not (I_H_CNT(6) and I_H_CNT(5) and I_H_CNT(4) and I_H_CNT(3)); + -- Parts 4D + u_4d1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_G, + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q =>W_4D1_Q + ); + + u_4d2 : entity work.LOGIC_74XX139 + port map( + I_G => W_5C_Q, + I_Sel(1) => I_H_CNT(2), + I_Sel(0) => I_H_CNT(1), + O_Q => W_4D2_Q + ); + + -- Parts 4C + u_4c1 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D2_Q(1), + I_Sel(1) => I_H_CNT(8), + I_Sel(0) => I_H_CNT(3), + O_Q => W_4C1_Q + ); + + u_4c2 : entity work.LOGIC_74XX139 + port map( + I_G => W_4D1_Q(3), + I_Sel(1) => W_4C2_B, + I_Sel(0) => W_HCNT, + O_Q => W_4C2_Q + ); + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_5C_Q <= I_H_CNT(0); + end if; + end process; + + -- 2004-9-22 added + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + W_4C1_Q3 <= W_4C1_Q(3); + end if; + end process; + + process(W_4C1_Q3) + begin + if rising_edge(W_4C1_Q3) then + W_4C2_B <= I_3D_DI; + end if; + end process; + +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_logic.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_logic.vhd new file mode 100644 index 00000000..5dae8a87 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_logic.vhd @@ -0,0 +1,92 @@ +------------------------------------------------------------------------------- +-- FPGA MOONCRESTA LOGIC IP MODULE +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx138 +-- 3-to-8 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX138 is + port ( + I_G1 : in std_logic; + I_G2a : in std_logic; + I_G2b : in std_logic; + I_Sel : in std_logic_vector(2 downto 0); + O_Q : out std_logic_vector(7 downto 0) + ); +end logic_74xx138; + +architecture RTL of LOGIC_74XX138 is + signal I_G : std_logic_vector(2 downto 0) := (others => '0'); + +begin + I_G <= I_G1 & I_G2a & I_G2b; + + xx138 : process(I_G, I_Sel) + begin + if(I_G = "100" ) then + case I_Sel is + when "000" => O_Q <= "11111110"; + when "001" => O_Q <= "11111101"; + when "010" => O_Q <= "11111011"; + when "011" => O_Q <= "11110111"; + when "100" => O_Q <= "11101111"; + when "101" => O_Q <= "11011111"; + when "110" => O_Q <= "10111111"; + when "111" => O_Q <= "01111111"; + when others => null; + end case; + else + O_Q <= (others => '1'); + end if; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +------------------------------------------------------------------------------- +-- 74xx139 +-- 2-to-4 line decoder +------------------------------------------------------------------------------- +entity LOGIC_74XX139 is + port ( + I_G : in std_logic; + I_Sel : in std_logic_vector(1 downto 0); + O_Q : out std_logic_vector(3 downto 0) + ); +end; + +architecture RTL of LOGIC_74XX139 is +begin + xx139 : process (I_G, I_Sel) + begin + if I_G = '0' then + case I_Sel is + when "00" => O_Q <= "1110"; + when "01" => O_Q <= "1101"; + when "10" => O_Q <= "1011"; + when "11" => O_Q <= "0111"; + when others => null; + end case; + else + O_Q <= "1111"; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_missile.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_missile.vhd new file mode 100644 index 00000000..c5aa6633 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_missile.vhd @@ -0,0 +1,107 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA VIDEO-MISSILE +---- +---- Version : 2.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 9-22 The problem which missile didn't sometimes come out from was improved. +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_MISSILE is + port( + I_CLK_6M : in std_logic; + I_CLK_18M : in std_logic; + I_C_BLn_X : in std_logic; + I_MLDn : in std_logic; + I_SLDn : in std_logic; + I_HPOS : in std_logic_vector (7 downto 0); + + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic + ); +end; + +architecture RTL of MC_MISSILE is + signal W_45R_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_45S_Q : std_logic_vector (7 downto 0) := (others => '0'); + signal W_5P1_Q : std_logic := '0'; + signal W_5P2_Q : std_logic := '0'; + signal W_5P1_CLK : std_logic := '0'; + signal W_5P2_CLK : std_logic := '0'; +begin + + O_MISSILEn <= W_5P1_CLK; + O_SHELLn <= W_5P2_CLK; + + -- missile counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if (I_MLDn = '0') then + W_45R_Q <= I_HPOS; + else + if (I_C_BLn_X = '1') then + W_45R_Q <= W_45R_Q + 1; + if (W_45R_Q(7 downto 2) = "111111") and W_5P1_Q = '1' then + W_5P1_CLK <= '0'; + else + W_5P1_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- shell counter + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + if(I_SLDn = '0') then + W_45S_Q <= I_HPOS; + else + if(I_C_BLn_X = '1') then + W_45S_Q <= W_45S_Q + 1; + if (W_45S_Q(7 downto 2) = "111111") and W_5P2_Q = '1' then + W_5P2_CLK <= '0'; + else + W_5P2_CLK <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_MLDn) and clock active on rising edge (W_5P1_CLK) + process(W_5P1_CLK, I_MLDn) + begin + if (I_MLDn = '0') then + W_5P1_Q <= '1'; + elsif rising_edge(W_5P1_CLK) then + W_5P1_Q <= '0'; + end if; + end process; + + -- Standard D-type flip-flop with D input tied low, async active + -- low preset (I_SLDn) and clock active on rising edge (W_5P2_CLK) + process(W_5P2_CLK, I_SLDn) + begin + if (I_SLDn = '0') then + W_5P2_Q <= '1'; + elsif rising_edge(W_5P2_CLK) then + W_5P2_Q <= '0'; + end if; + end process; + +end RTL; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_sound_a.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_sound_a.vhd new file mode 100644 index 00000000..ee0c66be --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_sound_a.vhd @@ -0,0 +1,117 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA SOUND I/F +-- +-- Version : 1.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + use IEEE.std_logic_arith.all; + +entity MC_SOUND_A is +port ( + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT1 : in std_logic; + I_BD : in std_logic_vector(7 downto 0); + I_PITCH : in std_logic; + I_VOL1 : in std_logic; + I_VOL2 : in std_logic; + + O_SDAT : out std_logic_vector(7 downto 0); + O_DO : out std_logic_vector(3 downto 0) +); +end; + +architecture RTL of MC_SOUND_A is + signal W_PITCH : std_logic := '0'; + signal W_89K_LDn : std_logic := '0'; + signal W_89K_Q : std_logic_vector(7 downto 0) := (others => '0'); + signal W_89K_LDATA : std_logic_vector(7 downto 0) := (others => '0'); + signal W_6T_Q : std_logic_vector(3 downto 0) := (others => '0'); + signal W_SDAT0 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT2 : std_logic_vector(7 downto 0) := (others => '0'); + signal W_SDAT3 : std_logic_vector(7 downto 0) := (others => '0'); + +begin + O_DO <= W_6T_Q; + + process (I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_PITCH <= I_PITCH; + if (W_89K_Q = x"ff") then + W_89K_LDn <= '0' ; + else + W_89K_LDn <= '1' ; + end if; + end if; + end process; + + -- Parts 9J + process (W_PITCH) + begin + if falling_edge(W_PITCH) then + W_89K_LDATA <= I_BD; + end if; + end process; + + process (I_H_CNT1) + begin + if rising_edge(I_H_CNT1) then + if (W_89K_LDn = '0') then + W_89K_Q <= W_89K_LDATA; + else + W_89K_Q <= W_89K_Q + 1; + end if; + end if; + end process; + + process (W_89K_LDn) + begin + if falling_edge(W_89K_LDn) then + W_6T_Q <= W_6T_Q + 1; + end if; + end process; + + process (I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + O_SDAT <= (x"14" + W_SDAT3) + (W_SDAT0 + W_SDAT2); + + if W_6T_Q(0)='1' then + W_SDAT0 <= x"2a"; + else + W_SDAT0 <= (others => '0'); + end if; + + if W_6T_Q(2)='1' then + if I_VOL1 = '1' then + W_SDAT2 <= x"69"; + else + W_SDAT2 <= x"39"; + end if; + else + W_SDAT2 <= (others => '0'); + end if; + + if (W_6T_Q(3)='1') and (I_VOL2 = '1') then + W_SDAT3 <= x"48" ; + else + W_SDAT3 <= (others => '0'); + end if; + + end if; + end process; + +end; \ No newline at end of file diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_sound_b.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_sound_b.vhd new file mode 100644 index 00000000..b74e4bb1 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_sound_b.vhd @@ -0,0 +1,253 @@ +-------------------------------------------------------------------------------- +---- FPGA MOONCRESTA WAVE SOUND +---- +---- Version : 1.00 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does no guarantee this program. +---- You can use this at your own risk. +---- +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +--pragma translate_off +-- use ieee.std_logic_textio.all; +-- use std.textio.all; +--pragma translate_on + +entity MC_SOUND_B is + port( + I_CLK1 : in std_logic; -- 6MHz + I_RSTn : in std_logic; + I_SW : in std_logic_vector( 2 downto 0); + I_DAC : in std_logic_vector( 3 downto 0); + I_FS : in std_logic_vector( 2 downto 0); + O_SDAT : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_B is +constant sample_time : integer := 557; -- sample time : 557 = 11025Hz, 557/2 = 22050Hz +constant fire_cnt : std_logic_vector(15 downto 0) := x"2000"; +constant hit_cnt : std_logic_vector(15 downto 0) := x"2000"; + +signal sample : std_logic_vector(10 downto 0) := (others => '0'); +signal sample_pls : std_logic := '0'; +signal s0_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s0_trg : std_logic := '0'; +signal s1_trg_ff : std_logic_vector( 1 downto 0) := (others => '0'); +signal s1_trg : std_logic := '0'; +signal fire_addr : std_logic_vector(15 downto 0) := (others => '0'); +signal hit_addr : std_logic_vector(15 downto 0) := (others => '0'); + +signal WAV_D0 : std_logic_vector( 7 downto 0) := (others => '0'); +signal WAV_D1 : std_logic_vector( 7 downto 0) := (others => '0'); + +signal W_VCO1_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_STEP: std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO1_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO2_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal W_VCO3_OUT : std_logic_vector( 7 downto 0) := (others => '0'); +signal VCO_CTR : std_logic_vector(24 downto 0) := (others => '0'); + +signal SDAT : std_logic_vector(10 downto 0) := (others => '0'); + +begin + -- ideally we should divide by 5 because this is the sum of 5 channels + -- but in practice we divide by 4 and just clip sounds that are too loud. + O_SDAT <= SDAT(9 downto 2) when SDAT(10) = '0' else (others=>'1'); -- clip overrange sounds + + process(I_CLK1) + begin + if rising_edge(I_CLK1) then + SDAT <= ("000" & W_VCO3_OUT) + ( ( ("000" & W_VCO2_OUT) + ("000" & W_VCO1_OUT) ) + ( ("000" & WAV_D0) + ("000" & WAV_D1) ) ); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + sample <= (others => '0'); + sample_pls <= '0'; + elsif rising_edge(I_CLK1) then + if (sample = sample_time - 1) then + sample <= (others => '0'); + sample_pls <= '1'; + else + sample <= sample + 1; + sample_pls <= '0'; + end if; + end if; + end process; + +------------- FIRE SOUND ------------------------------------------ + mc_roms_fire : entity work.GAL_FIR + port map ( + CLK => I_CLK1, + ADDR => fire_addr(12 downto 0), + DATA => WAV_D0 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s0_trg_ff <= (others => '0'); + s0_trg <= '0'; + elsif rising_edge(I_CLK1) then + s0_trg_ff(0) <= I_SW(0); + s0_trg_ff(1) <= s0_trg_ff(0); + s0_trg <= not s0_trg_ff(1) and s0_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + fire_addr <= fire_cnt; + elsif rising_edge(I_CLK1) then + if (s0_trg = '1') then + fire_addr <= (others => '0'); + else + if(sample_pls = '1') then + if(fire_addr <= fire_cnt) then + fire_addr <= fire_addr + 1; + else + fire_addr <= fire_addr ; + end if; + end if; + end if; + end if; + end process; + +------------- HIT SOUND ------------------------------------------ + mc_roms_hit : entity work.GAL_HIT + port map ( + CLK => I_CLK1, + ADDR => hit_addr(12 downto 0), + DATA => WAV_D1 + ); + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + s1_trg_ff <= (others => '0'); + s1_trg <= '0'; + elsif rising_edge(I_CLK1) then + s1_trg_ff(0) <= I_SW(1); + s1_trg_ff(1) <= s1_trg_ff(0); + s1_trg <= not s1_trg_ff(1) and s1_trg_ff(0); + end if; + end process; + + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + hit_addr <= hit_cnt; + elsif rising_edge(I_CLK1) then + if (s1_trg = '1') then + hit_addr <= (others => '0'); + else + if (sample_pls = '1') then + if (hit_addr <= hit_cnt) then + hit_addr <= hit_addr + 1 ; + else + hit_addr <= hit_addr ; + end if; + end if; + end if; + end if; + end process; + +--------------- EFFECT SOUND --------------------------------------- + +-- 9R modulator voltage generator based on DAC value + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + VCO_CTR <= (others=>'0'); + elsif rising_edge(I_CLK1) then + VCO_CTR <= VCO_CTR + (not I_DAC); + end if; + end process; + + -- modulator frequency lookup tables for the three VCOs + process(I_CLK1, I_RSTn) + begin + if (I_RSTn = '0') then + elsif rising_edge(I_CLK1) then + case VCO_CTR(23 downto 19) is + when "00000" => W_VCO1_STEP <= x"2A"; W_VCO2_STEP <= x"3A"; W_VCO3_STEP <= x"54"; + when "00001" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"39"; W_VCO3_STEP <= x"53"; + when "00010" => W_VCO1_STEP <= x"29"; W_VCO2_STEP <= x"38"; W_VCO3_STEP <= x"52"; + when "00011" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"50"; + when "00100" => W_VCO1_STEP <= x"28"; W_VCO2_STEP <= x"37"; W_VCO3_STEP <= x"4F"; + when "00101" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"36"; W_VCO3_STEP <= x"4E"; + when "00110" => W_VCO1_STEP <= x"27"; W_VCO2_STEP <= x"35"; W_VCO3_STEP <= x"4D"; + when "00111" => W_VCO1_STEP <= x"26"; W_VCO2_STEP <= x"34"; W_VCO3_STEP <= x"4C"; + when "01000" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"4A"; + when "01001" => W_VCO1_STEP <= x"25"; W_VCO2_STEP <= x"33"; W_VCO3_STEP <= x"49"; + when "01010" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"32"; W_VCO3_STEP <= x"48"; + when "01011" => W_VCO1_STEP <= x"24"; W_VCO2_STEP <= x"31"; W_VCO3_STEP <= x"47"; + when "01100" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"30"; W_VCO3_STEP <= x"46"; + when "01101" => W_VCO1_STEP <= x"23"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"44"; + when "01110" => W_VCO1_STEP <= x"22"; W_VCO2_STEP <= x"2F"; W_VCO3_STEP <= x"43"; + when "01111" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2E"; W_VCO3_STEP <= x"42"; + when "10000" => W_VCO1_STEP <= x"21"; W_VCO2_STEP <= x"2D"; W_VCO3_STEP <= x"41"; + when "10001" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2C"; W_VCO3_STEP <= x"40"; + when "10010" => W_VCO1_STEP <= x"20"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3F"; + when "10011" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2B"; W_VCO3_STEP <= x"3D"; + when "10100" => W_VCO1_STEP <= x"1F"; W_VCO2_STEP <= x"2A"; W_VCO3_STEP <= x"3C"; + when "10101" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"29"; W_VCO3_STEP <= x"3B"; + when "10110" => W_VCO1_STEP <= x"1E"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"3A"; + when "10111" => W_VCO1_STEP <= x"1D"; W_VCO2_STEP <= x"28"; W_VCO3_STEP <= x"39"; + when "11000" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"27"; W_VCO3_STEP <= x"37"; + when "11001" => W_VCO1_STEP <= x"1C"; W_VCO2_STEP <= x"26"; W_VCO3_STEP <= x"36"; + when "11010" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"25"; W_VCO3_STEP <= x"35"; + when "11011" => W_VCO1_STEP <= x"1B"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"34"; + when "11100" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"24"; W_VCO3_STEP <= x"33"; + when "11101" => W_VCO1_STEP <= x"1A"; W_VCO2_STEP <= x"23"; W_VCO3_STEP <= x"32"; + when "11110" => W_VCO1_STEP <= x"19"; W_VCO2_STEP <= x"22"; W_VCO3_STEP <= x"30"; + when "11111" => W_VCO1_STEP <= x"18"; W_VCO2_STEP <= x"21"; W_VCO3_STEP <= x"2F"; + when others => null; + end case; + end if; + end process; + +-- 8R VCO 240Hz - 140Hz (8) + mc_vco1 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(0), + I_STEP => W_VCO1_STEP, + O_WAV => W_VCO1_OUT + ); + +-- 8S VCO 330Hz - 190Hz (11) + mc_vco2 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(1), + I_STEP => W_VCO2_STEP, + O_WAV => W_VCO2_OUT + ); + +-- 8T VCO 480Hz - 270Hz (16) + mc_vco3 : entity work.MC_SOUND_VCO + port map ( + I_CLK => I_CLK1, + I_RSTn => I_RSTn, + I_FS => I_FS(2), + I_STEP => W_VCO3_STEP, + O_WAV => W_VCO3_OUT + ); +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_sound_vco.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_sound_vco.vhd new file mode 100644 index 00000000..e2a63e85 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_sound_vco.vhd @@ -0,0 +1,49 @@ +-------------------------------------------------------------------------------- +---- FPGA VCO +-------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +use work.sine_package.all; + +-- O_CLK = (I_CLK / 2^20) * I_STEP +entity MC_SOUND_VCO is + port( + I_CLK : in std_logic; + I_RSTn : in std_logic; + I_FS : in std_logic; + I_STEP : in std_logic_vector( 7 downto 0); + O_WAV : out std_logic_vector( 7 downto 0) + ); +end; + +architecture RTL of MC_SOUND_VCO is + signal VCO1_CTR : std_logic_vector(19 downto 0) := (others => '0'); + signal sine : std_logic_vector(14 downto 0) := (others => '0'); + +begin + O_WAV <= sine(14 downto 7); + process(I_CLK, I_RSTn) + begin + if (I_RSTn = '0') then + VCO1_CTR <= (others=>'0'); + elsif rising_edge(I_CLK) then + if I_FS = '1' then + VCO1_CTR <= VCO1_CTR + I_STEP; + case VCO1_CTR(19 downto 18) is + when "00" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "01" => + sine <= "100000000000000" + std_logic_vector( to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when "10" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( VCO1_CTR(17 downto 11)), 15)); + when "11" => + sine <= "100000000000000" + std_logic_vector(-to_signed(get_table_value( not VCO1_CTR(17 downto 11)), 15)); + when others => null; + end case; + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_stars.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_stars.vhd new file mode 100644 index 00000000..b91197b3 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_stars.vhd @@ -0,0 +1,90 @@ +------------------------------------------------------------------------------ +-- FPGA MOONCRESTA STARS +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity MC_STARS is + port ( + I_CLK_18M : in std_logic; + I_CLK_6M : in std_logic; + I_H_FLIP : in std_logic; + I_V_SYNC : in std_logic; + I_8HF : in std_logic; + I_256HnX : in std_logic; + I_1VF : in std_logic; + I_2V : in std_logic; + I_STARS_ON : in std_logic; + I_STARS_OFFn : in std_logic; + + O_R : out std_logic_vector(1 downto 0); + O_G : out std_logic_vector(1 downto 0); + O_B : out std_logic_vector(1 downto 0); + O_NOISE : out std_logic + ); +end; + +architecture RTL of MC_STARS is + signal CLK_1C : std_logic := '0'; + signal W_2D_Qn : std_logic := '0'; + + signal W_3B : std_logic := '0'; + signal noise : std_logic := '0'; + signal W_2A : std_logic := '0'; + signal W_4P : std_logic := '0'; + signal CLK_1AB : std_logic := '0'; + signal W_1AB_Q : std_logic_vector(15 downto 0) := (others => '0'); + signal W_1C_Q : std_logic_vector( 1 downto 0) := (others => '0'); +begin + O_R <= (W_1AB_Q( 9) & W_1AB_Q (8) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_G <= (W_1AB_Q(11) & W_1AB_Q(10) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + O_B <= (W_1AB_Q(13) & W_1AB_Q(12) ) when (W_2A = '0' and W_4P = '0') else (others => '0'); + + CLK_1C <= not (I_CLK_18M and (not I_CLK_6M )and (not I_V_SYNC) and I_256HnX); + CLK_1AB <= not (CLK_1C or (not (I_H_FLIP or W_1C_Q(1)))); + W_3B <= W_2D_Qn xor W_1AB_Q(4); + + W_2A <= '0' when (W_1AB_Q(7 downto 0) = x"ff") else '1'; + W_4P <= not (( I_8HF xor I_1VF ) and W_2D_Qn and I_STARS_OFFn); + + O_NOISE <= noise ; + + process(I_2V) + begin + if rising_edge(I_2V) then + noise <= W_2D_Qn; + end if; + end process; + + process(CLK_1C, I_V_SYNC) + begin + if(I_V_SYNC = '1') then + W_1C_Q <= (others => '0'); + elsif rising_edge(CLK_1C) then + W_1C_Q <= W_1C_Q(0) & '1'; + end if; + end process; + + process(CLK_1AB, I_STARS_ON) + begin + if(I_STARS_ON = '0') then + W_1AB_Q <= (others => '0'); + W_2D_Qn <= '1'; + elsif rising_edge(CLK_1AB) then + W_1AB_Q <= W_1AB_Q(14 downto 0) & W_3B; + W_2D_Qn <= not W_1AB_Q(15); + end if; + end process; +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_video.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_video.vhd new file mode 100644 index 00000000..9642043d --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mc_video.vhd @@ -0,0 +1,436 @@ +-------------------------------------------------------------------------------- +---- FPGA GALAXIAN VIDEO +---- +---- Version : 2.50 +---- +---- Copyright(c) 2004 Katsumi Degawa , All rights reserved +---- +---- Important ! +---- +---- This program is freeware for non-commercial use. +---- The author does not guarantee this program. +---- You can use this at your own risk. +---- +---- 2004- 4-30 galaxian modify by K.DEGAWA +---- 2004- 5- 6 first release. +---- 2004- 8-23 Improvement with T80-IP. +---- 2004- 9-22 The problem where missile sometimes didn't come out was fixed. +-------------------------------------------------------------------------------- + +------------------------------------------------------------------------------------------- +-- H_CNT(0), H_CNT(1), H_CNT(2), H_CNT(3), H_CNT(4), H_CNT(5), H_CNT(6), H_CNT(7), H_CNT(8), +-- 1 H 2 H 4 H 8 H 16 H 32H 64 H 128 H 256 H +------------------------------------------------------------------------------------------- +-- V_CNT(0), V_CNT(1), V_CNT(2), V_CNT(3), V_CNT(4), V_CNT(5), V_CNT(6), V_CNT(7) +-- 1 V 2 V 4 V 8 V 16 V 32 V 64 V 128 V +------------------------------------------------------------------------------------------- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity MC_VIDEO is + port( + I_CLK_18M : in std_logic; + I_CLK_12M : in std_logic; + I_CLK_6M : in std_logic; + I_H_CNT : in std_logic_vector(8 downto 0); + I_V_CNT : in std_logic_vector(7 downto 0); + I_H_FLIP : in std_logic; + I_V_FLIP : in std_logic; + I_V_BLn : in std_logic; + I_C_BLn : in std_logic; + + I_A : in std_logic_vector(9 downto 0); + I_BD : in std_logic_vector(7 downto 0); + I_OBJ_SUB_A : in std_logic_vector(2 downto 0); + I_OBJ_RAM_RQ : in std_logic; + I_OBJ_RAM_RD : in std_logic; + I_OBJ_RAM_WR : in std_logic; + I_VID_RAM_RD : in std_logic; + I_VID_RAM_WR : in std_logic; + I_DRIVER_WR : in std_logic; + + + O_C_BLnX : out std_logic; + O_8HF : out std_logic; + O_256HnX : out std_logic; + O_1VF : out std_logic; + O_MISSILEn : out std_logic; + O_SHELLn : out std_logic; + + O_BD : out std_logic_vector(7 downto 0); + O_VID : out std_logic_vector(1 downto 0); + O_COL : out std_logic_vector(2 downto 0) + ); +end; + +architecture RTL of MC_VIDEO is + + signal WB_LDn : std_logic := '0'; + signal WB_CNTRLDn : std_logic := '0'; + signal WB_CNTRCLRn : std_logic := '0'; + signal WB_COLLn : std_logic := '0'; + signal WB_VPLn : std_logic := '0'; + signal WB_OBJDATALn : std_logic := '0'; + signal WB_MLDn : std_logic := '0'; + signal WB_SLDn : std_logic := '0'; + signal W_3D : std_logic := '0'; + signal W_LDn : std_logic := '0'; + signal W_CNTRLDn : std_logic := '0'; + signal W_CNTRCLRn : std_logic := '0'; + signal W_COLLn : std_logic := '0'; + signal W_VPLn : std_logic := '0'; + signal W_OBJDATALn : std_logic := '0'; + signal W_MLDn : std_logic := '0'; + signal W_SLDn : std_logic := '0'; + signal W_VID : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_COL : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_H_POSI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_2M_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6K_Q : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_6P_Q : std_logic_vector( 6 downto 0) := (others => '0'); + signal W_45T_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2KL : std_logic_vector( 7 downto 0) := (others => '0'); + signal reg_2HJ : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_RV : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_RC : std_logic_vector( 2 downto 0) := (others => '0'); + + signal W_O_OBJ_ROM_A : std_logic_vector(10 downto 0) := (others => '0'); + signal W_VID_RAM_A : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AA : std_logic_vector(11 downto 0) := (others => '0'); + signal W_VID_RAM_AB : std_logic_vector(11 downto 0) := (others => '0'); + signal C_2HJ : std_logic_vector( 1 downto 0) := (others => '0'); + signal C_2KL : std_logic_vector( 1 downto 0) := (others => '0'); + signal W_CD : std_logic_vector( 2 downto 0) := (others => '0'); + signal W_1M : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_A : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_B : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_3L_Y : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_LRAM_DI : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_LRAM_DO : std_logic_vector( 4 downto 0) := (others => '0'); + signal W_1H_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_1K_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_LRAM_A : std_logic_vector( 7 downto 0) := (others => '0'); +-- signal W_OBJ_RAM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_A : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_OBJ_ROM_AB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_D : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DI : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOA : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_VID_RAM_DOB : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_HF_CNT : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_45N_Q : std_logic_vector( 7 downto 0) := (others => '0'); + signal W_6J_Q : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DA : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_6J_DB : std_logic_vector( 3 downto 0) := (others => '0'); + signal W_256HnX : std_logic := '0'; + signal W_2N : std_logic := '0'; + signal W_45T_CLR : std_logic := '0'; + signal W_C_BLnX : std_logic := '0'; + signal W_H_FLIP1 : std_logic := '0'; + signal W_H_FLIP2 : std_logic := '0'; + signal W_H_FLIP1X : std_logic := '0'; + signal W_H_FLIP2X : std_logic := '0'; + signal W_LRAM_AND : std_logic := '0'; + signal W_RAW0 : std_logic := '0'; + signal W_RAW1 : std_logic := '0'; + signal W_RAW_OR : std_logic := '0'; + signal W_SRCLK : std_logic := '0'; + signal W_SRLD : std_logic := '0'; + signal W_VID_RAM_CS : std_logic := '0'; + signal W_CLK_6Mn : std_logic := '0'; + +begin + + ld_pls : entity work.MC_LD_PLS + port map( + I_CLK_6M => I_CLK_6M, + I_H_CNT => I_H_CNT, + I_3D_DI => W_3D, + + O_LDn => WB_LDn, + O_CNTRLDn => WB_CNTRLDn, + O_CNTRCLRn => WB_CNTRCLRn, + O_COLLn => WB_COLLn, + O_VPLn => WB_VPLn, + O_OBJDATALn => WB_OBJDATALn, + O_MLDn => WB_MLDn, + O_SLDn => WB_SLDn + ); + + obj_ram : entity work.MC_OBJ_RAM + port map( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(7 downto 0), + I_WEA => I_OBJ_RAM_WR, + I_CEA => I_OBJ_RAM_RQ, + I_DA => I_BD, + O_DA => W_OBJ_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_OBJ_RAM_AB, + I_WEB => '0', + I_CEB => '1', + I_DB => x"00", + O_DB => W_OBJ_RAM_DOB + ); + + lram : entity work.MC_LRAM + port map( + I_CLK => I_CLK_18M, + I_ADDR => W_LRAM_A, + I_WE => W_CLK_6Mn, + I_D => W_LRAM_DI, + O_Dn => W_LRAM_DO + ); + + missile : entity work.MC_MISSILE + port map( + I_CLK_18M => I_CLK_18M, + I_CLK_6M => I_CLK_6M, + I_C_BLn_X => W_C_BLnX, + I_MLDn => W_MLDn, + I_SLDn => W_SLDn, + I_HPOS => W_H_POSI, + O_MISSILEn => O_MISSILEn, + O_SHELLn => O_SHELLn + ); + + vid_ram : entity work.MC_VID_RAM + port map ( + I_CLKA => I_CLK_12M, + I_ADDRA => I_A(9 downto 0), + I_DA => W_VID_RAM_DI, + I_WEA => I_VID_RAM_WR, + I_CEA => W_VID_RAM_CS, + O_DA => W_VID_RAM_DOA, + + I_CLKB => I_CLK_12M, + I_ADDRB => W_VID_RAM_A(9 downto 0), + I_DB => x"00", + I_WEB => '0', + I_CEB => '1', + O_DB => W_VID_RAM_DOB + ); + + -- 1H VID-Rom + k_rom : entity work.GALAXIAN_1H + port map ( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1H_D + ); + + -- 1K VID-Rom + h_rom : entity work.GALAXIAN_1K + port map( + CLK => I_CLK_12M, + ADDR => W_O_OBJ_ROM_A, + DATA => W_1K_D + ); + + +----------------------------------------------------------------------------------- + + process(I_CLK_12M) + begin + if falling_edge(I_CLK_12M) then + W_LDn <= WB_LDn; + W_CNTRLDn <= WB_CNTRLDn; + W_CNTRCLRn <= WB_CNTRCLRn; + W_COLLn <= WB_COLLn; + W_VPLn <= WB_VPLn; + W_OBJDATALn <= WB_OBJDATALn; + W_MLDn <= WB_MLDn; + W_SLDn <= WB_SLDn; + end if; + end process; + + W_CLK_6Mn <= not I_CLK_6M; + + W_6J_DA <= I_H_FLIP & W_HF_CNT(7) & W_HF_CNT(3) & I_H_CNT(2); + W_6J_DB <= W_OBJ_D(6) & ( W_HF_CNT(3) and I_H_CNT(1) ) & I_H_CNT(2) & I_H_CNT(1); + W_6J_Q <= W_6J_DB when I_H_CNT(8) = '1' else W_6J_DA; + + W_H_FLIP1 <= (not I_H_CNT(8)) and I_H_FLIP; + + W_HF_CNT(7 downto 3) <= not I_H_CNT(7 downto 3) when W_H_FLIP1 = '1' else I_H_CNT(7 downto 3); + W_VF_CNT <= not I_V_CNT when I_V_FLIP = '1' else I_V_CNT; + + O_8HF <= W_HF_CNT(3); + O_1VF <= W_VF_CNT(0); + W_H_FLIP2 <= W_6J_Q(3); + +-- Parts 4F,5F + W_OBJ_RAM_AB <= "0" & I_H_CNT(8) & W_6J_Q(2) & W_HF_CNT(6 downto 4) & W_6J_Q(1 downto 0); +-- W_OBJ_RAM_A <= W_OBJ_RAM_AB when I_OBJ_RAM_RQ = '0' else I_A(7 downto 0) ; + + process(I_CLK_12M) + begin + if rising_edge(I_CLK_12M) then + W_H_POSI <= W_OBJ_RAM_DOB; + end if; + end process; + + W_OBJ_RAM_D <= W_OBJ_RAM_DOA when I_OBJ_RAM_RD = '1' else (others => '0'); + +-- Parts 4L + process(W_OBJDATALn) + begin + if rising_edge(W_OBJDATALn) then + W_OBJ_D <= W_H_POSI; + end if; + end process; + +-- Parts 4,5N + W_45N_Q <= W_VF_CNT + W_H_POSI; + W_3D <= '0' when W_45N_Q = x"FF" else '1'; + + process(W_VPLn, I_V_BLn) + begin + if (I_V_BLn = '0') then + W_2M_Q <= (others => '0'); + elsif rising_edge(W_VPLn) then + W_2M_Q <= W_45N_Q; + end if; + end process; + + W_2N <= I_H_CNT(8) and W_OBJ_D(7); + W_1M <= W_2M_Q(3 downto 0) xor (W_2N & W_2N & W_2N & W_2N); + W_VID_RAM_CS <= I_VID_RAM_RD or I_VID_RAM_WR; + W_VID_RAM_DI <= I_BD when I_VID_RAM_WR = '1' else (others => '0'); + W_VID_RAM_AA <= (not ( W_2M_Q(7) and W_2M_Q(6) and W_2M_Q(5) and W_2M_Q(4))) & (not W_VID_RAM_CS) & "0000000000"; -- I_A(9:0) + W_VID_RAM_AB <= "00" & W_2M_Q(7 downto 4) & W_1M(3) & W_HF_CNT(7 downto 3); + W_VID_RAM_A <= W_VID_RAM_AB when I_C_BLn = '1' else W_VID_RAM_AA; + W_VID_RAM_D <= W_VID_RAM_DOA when I_VID_RAM_RD = '1' else (others => '0'); + +---- VIDEO DATA OUTPUT -------------- + + O_BD <= W_OBJ_RAM_D or W_VID_RAM_D; + W_SRLD <= not (W_LDn or W_VID_RAM_A(11)); + W_OBJ_ROM_AB <= W_OBJ_D(5 downto 0) & W_1M(3) & (W_OBJ_D(6) xor I_H_CNT(3)); + W_OBJ_ROM_A <= W_OBJ_ROM_AB when I_H_CNT(8) = '1' else W_VID_RAM_DOB; + W_O_OBJ_ROM_A <= W_OBJ_ROM_A & W_1M(2 downto 0); + +----------------------------------------------------------------------------------- + + W_3L_A <= reg_2HJ(7) & reg_2KL(7) & "1" & W_SRLD; + W_3L_B <= reg_2HJ(0) & reg_2KL(0) & W_SRLD & "1"; + W_3L_Y <= W_3L_B when W_H_FLIP2X = '1' else W_3L_A; -- (3)=RAW1,(2)=RAW0 + C_2HJ <= W_3L_Y(1 downto 0); + C_2KL <= W_3L_Y(1 downto 0); + W_RAW0 <= W_3L_Y(2); + W_RAW1 <= W_3L_Y(3); + W_SRCLK <= I_CLK_6M; + +-------- PARTS 2KL ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2KL) is + when "00" => reg_2KL <= reg_2KL; + when "10" => reg_2KL <= reg_2KL(6 downto 0) & "0"; + when "01" => reg_2KL <= "0" & reg_2KL(7 downto 1); + when "11" => reg_2KL <= W_1K_D; + when others => null; + end case; + end if; + end process; + +-------- PARTS 2HJ ---------------------------------------------- + + process(W_SRCLK) + begin + if rising_edge(W_SRCLK) then + case(C_2HJ) is + when "00" => reg_2HJ <= reg_2HJ; + when "10" => reg_2HJ <= reg_2HJ(6 downto 0) & "0"; + when "01" => reg_2HJ <= "0" & reg_2HJ(7 downto 1); + when "11" => reg_2HJ <= W_1H_D; + when others => null; + end case; + end if; + end process; + +------- SHT2 ----------------------------------------------------- + +-- Parts 6K + process(W_COLLn) + begin + if rising_edge(W_COLLn) then + W_6K_Q <= W_H_POSI(2 downto 0); + end if; + end process; + +-- Parts 6P + process(I_CLK_6M) + begin + if rising_edge(I_CLK_6M) then + if (W_LDn = '0') then + W_6P_Q <= W_H_FLIP2 & W_H_FLIP1 & I_C_BLn & (not I_H_CNT(8)) & W_6K_Q(2 downto 0); + else + W_6P_Q <= W_6P_Q; + end if; + end if; + end process; + + W_H_FLIP2X <= W_6P_Q(6); + W_H_FLIP1X <= W_6P_Q(5); + W_C_BLnX <= W_6P_Q(4); + W_256HnX <= W_6P_Q(3); + W_CD <= W_6P_Q(2 downto 0); + O_256HnX <= W_256HnX; + O_C_BLnX <= W_C_BLnX; + W_45T_CLR <= W_CNTRCLRn or W_256HnX ; + + process(I_CLK_6M, W_45T_CLR) + begin + if (W_45T_CLR = '0') then + W_45T_Q <= (others => '0'); + elsif rising_edge(I_CLK_6M) then + if (W_CNTRLDn = '0') then + W_45T_Q <= W_H_POSI; + else + W_45T_Q <= W_45T_Q + 1; + end if; + end if; + end process; + + W_LRAM_A <= (not W_45T_Q) when W_H_FLIP1X = '1' else W_45T_Q; + + process(I_CLK_6M) + begin + if falling_edge(I_CLK_6M) then + W_RV <= W_LRAM_DO(1 downto 0); + W_RC <= W_LRAM_DO(4 downto 2); + end if; + end process; + + W_LRAM_AND <= not (not ((W_LRAM_A(4) or W_LRAM_A(5)) or (W_LRAM_A(6) or W_LRAM_A(7))) or W_256HnX ); + W_RAW_OR <= W_RAW0 or W_RAW1 ; + + W_VID(0) <= not (not (W_RAW0 and W_RV(1)) and W_RV(0)); + W_VID(1) <= not (not (W_RAW1 and W_RV(0)) and W_RV(1)); + W_COL(0) <= not (not (W_RAW_OR and W_CD(0) and W_RC(1) and W_RC(2)) and W_RC(0)); + W_COL(1) <= not (not (W_RAW_OR and W_CD(1) and W_RC(2) and W_RC(0)) and W_RC(1)); + W_COL(2) <= not (not (W_RAW_OR and W_CD(2) and W_RC(0) and W_RC(1)) and W_RC(2)); + + O_VID <= W_VID; + O_COL <= W_COL; + + W_LRAM_DI(0) <= W_LRAM_AND and W_VID(0); + W_LRAM_DI(1) <= W_LRAM_AND and W_VID(1); + W_LRAM_DI(2) <= W_LRAM_AND and W_COL(0); + W_LRAM_DI(3) <= W_LRAM_AND and W_COL(1); + W_LRAM_DI(4) <= W_LRAM_AND and W_COL(2); + +end RTL; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mist_io.v b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_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/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/osd.v b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_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/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/pll.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/pll.vhd new file mode 100644 index 00000000..d76a5e1d --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/pll.vhd @@ -0,0 +1,451 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + c3 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + clk3_divide_by : NATURAL; + clk3_duty_cycle : NATURAL; + clk3_multiply_by : NATURAL; + clk3_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire2 <= sub_wire0(3); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c3 <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 3, + clk0_duty_cycle => 50, + clk0_multiply_by => 2, + clk0_phase_shift => "0", + clk1_divide_by => 9, + clk1_duty_cycle => 50, + clk1_multiply_by => 4, + clk1_phase_shift => "0", + clk2_divide_by => 9, + clk2_duty_cycle => 50, + clk2_multiply_by => 2, + clk2_phase_shift => "0", + clk3_divide_by => 6, + clk3_duty_cycle => 50, + clk3_multiply_by => 1, + clk3_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_USED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire6, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "3" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "6" +-- 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: DUTY_CYCLE3 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "18.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "12.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "6.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "4.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 "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "4" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "2" +-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "18.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "12.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "6.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "4.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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 "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "3" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "4" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "6" +-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK3_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_USED" +-- 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_USED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/scandoubler.v b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..36e71ed2 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_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/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/sine_package.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/sine_package.vhd new file mode 100644 index 00000000..473caa04 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/sine_package.vhd @@ -0,0 +1,152 @@ +library ieee; +use ieee.std_logic_1164.all; + +package sine_package is + + subtype table_value_type is integer range 0 to 16383; + subtype table_index_type is std_logic_vector( 6 downto 0 ); + + function get_table_value (table_index: table_index_type) return table_value_type; + +end; + +package body sine_package is + + function get_table_value (table_index: table_index_type) return table_value_type is + variable table_value: table_value_type; + begin + case table_index is + when "0000000" => table_value := 101; + when "0000001" => table_value := 302; + when "0000010" => table_value := 503; + when "0000011" => table_value := 703; + when "0000100" => table_value := 904; + when "0000101" => table_value := 1105; + when "0000110" => table_value := 1305; + when "0000111" => table_value := 1506; + when "0001000" => table_value := 1706; + when "0001001" => table_value := 1906; + when "0001010" => table_value := 2105; + when "0001011" => table_value := 2304; + when "0001100" => table_value := 2503; + when "0001101" => table_value := 2702; + when "0001110" => table_value := 2900; + when "0001111" => table_value := 3098; + when "0010000" => table_value := 3295; + when "0010001" => table_value := 3491; + when "0010010" => table_value := 3688; + when "0010011" => table_value := 3883; + when "0010100" => table_value := 4078; + when "0010101" => table_value := 4273; + when "0010110" => table_value := 4466; + when "0010111" => table_value := 4659; + when "0011000" => table_value := 4852; + when "0011001" => table_value := 5044; + when "0011010" => table_value := 5234; + when "0011011" => table_value := 5425; + when "0011100" => table_value := 5614; + when "0011101" => table_value := 5802; + when "0011110" => table_value := 5990; + when "0011111" => table_value := 6177; + when "0100000" => table_value := 6362; + when "0100001" => table_value := 6547; + when "0100010" => table_value := 6731; + when "0100011" => table_value := 6914; + when "0100100" => table_value := 7095; + when "0100101" => table_value := 7276; + when "0100110" => table_value := 7456; + when "0100111" => table_value := 7634; + when "0101000" => table_value := 7811; + when "0101001" => table_value := 7988; + when "0101010" => table_value := 8162; + when "0101011" => table_value := 8336; + when "0101100" => table_value := 8509; + when "0101101" => table_value := 8680; + when "0101110" => table_value := 8850; + when "0101111" => table_value := 9018; + when "0110000" => table_value := 9185; + when "0110001" => table_value := 9351; + when "0110010" => table_value := 9515; + when "0110011" => table_value := 9678; + when "0110100" => table_value := 9840; + when "0110101" => table_value := 10000; + when "0110110" => table_value := 10158; + when "0110111" => table_value := 10315; + when "0111000" => table_value := 10471; + when "0111001" => table_value := 10625; + when "0111010" => table_value := 10777; + when "0111011" => table_value := 10927; + when "0111100" => table_value := 11076; + when "0111101" => table_value := 11224; + when "0111110" => table_value := 11369; + when "0111111" => table_value := 11513; + when "1000000" => table_value := 11655; + when "1000001" => table_value := 11796; + when "1000010" => table_value := 11934; + when "1000011" => table_value := 12071; + when "1000100" => table_value := 12206; + when "1000101" => table_value := 12339; + when "1000110" => table_value := 12471; + when "1000111" => table_value := 12600; + when "1001000" => table_value := 12728; + when "1001001" => table_value := 12853; + when "1001010" => table_value := 12977; + when "1001011" => table_value := 13099; + when "1001100" => table_value := 13219; + when "1001101" => table_value := 13336; + when "1001110" => table_value := 13452; + when "1001111" => table_value := 13566; + when "1010000" => table_value := 13678; + when "1010001" => table_value := 13787; + when "1010010" => table_value := 13895; + when "1010011" => table_value := 14000; + when "1010100" => table_value := 14104; + when "1010101" => table_value := 14205; + when "1010110" => table_value := 14304; + when "1010111" => table_value := 14401; + when "1011000" => table_value := 14496; + when "1011001" => table_value := 14588; + when "1011010" => table_value := 14679; + when "1011011" => table_value := 14767; + when "1011100" => table_value := 14853; + when "1011101" => table_value := 14936; + when "1011110" => table_value := 15018; + when "1011111" => table_value := 15097; + when "1100000" => table_value := 15174; + when "1100001" => table_value := 15249; + when "1100010" => table_value := 15321; + when "1100011" => table_value := 15391; + when "1100100" => table_value := 15459; + when "1100101" => table_value := 15524; + when "1100110" => table_value := 15587; + when "1100111" => table_value := 15648; + when "1101000" => table_value := 15706; + when "1101001" => table_value := 15762; + when "1101010" => table_value := 15816; + when "1101011" => table_value := 15867; + when "1101100" => table_value := 15916; + when "1101101" => table_value := 15963; + when "1101110" => table_value := 16007; + when "1101111" => table_value := 16048; + when "1110000" => table_value := 16088; + when "1110001" => table_value := 16124; + when "1110010" => table_value := 16159; + when "1110011" => table_value := 16191; + when "1110100" => table_value := 16220; + when "1110101" => table_value := 16247; + when "1110110" => table_value := 16272; + when "1110111" => table_value := 16294; + when "1111000" => table_value := 16314; + when "1111001" => table_value := 16331; + when "1111010" => table_value := 16346; + when "1111011" => table_value := 16358; + when "1111100" => table_value := 16368; + when "1111101" => table_value := 16375; + when "1111110" => table_value := 16380; + when "1111111" => table_value := 16383; + when others => null; + end case; + return table_value; + end; + +end; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/spram.vhd b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/spram.vhd new file mode 100644 index 00000000..ad6b58b5 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/spram.vhd @@ -0,0 +1,55 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY spram IS + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clken : IN STD_LOGIC := '1'; + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone V", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + width_a => data_width_g, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + clocken0 => clken, + data_a => data, + wren_a => wren, + q_a => q + ); + + + +END SYN; diff --git a/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/video_mixer.sv b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..b9f7e424 --- /dev/null +++ b/Arcade/Galaxian Hardware/WarOfBugs_MiST/rtl/video_mixer.sv @@ -0,0 +1,243 @@ +// +// +// 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; +reg [DWIDTH:0] Rd,Gd,Bd; +always @(posedge clk_sys) {Rd,Gd,Bd} <= {R,G,B}; +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(Rd), + .g_in(Gd), + .b_in(Bd), + + .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/Arcade/IremM52 Hardware/MoonPatrol_MIST/ReadMe.txt b/Arcade/IremM52 Hardware/MoonPatrol_MIST/ReadMe.txt new file mode 100644 index 00000000..ee68fd00 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/ReadMe.txt @@ -0,0 +1,27 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Moon Patrol port to MiST by Gehstock +-- 19 December 2017 +-- +--------------------------------------------------------------------------------- +-- Uses PACE framework by http://pacedev.net/ +--------------------------------------------------------------------------------- +-- Moon patrol sound board by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- cpu68 - Version 9th Jan 2004 0.8 +-- 6800/01 compatible CPU core +-- GNU public license - December 2002 : John E. Kent +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin + Start +-- SPACE : Fire +-- CTRL,UP : Jump +-- LEFT,RIGHT : Increase/Decrease the speed +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- \ No newline at end of file diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/Release/mpatrol.rbf b/Arcade/IremM52 Hardware/MoonPatrol_MIST/Release/mpatrol.rbf new file mode 100644 index 00000000..77989ab8 Binary files /dev/null and b/Arcade/IremM52 Hardware/MoonPatrol_MIST/Release/mpatrol.rbf differ diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/clean.bat b/Arcade/IremM52 Hardware/MoonPatrol_MIST/clean.bat new file mode 100644 index 00000000..c9a2cb06 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/mpatrol.qpf b/Arcade/IremM52 Hardware/MoonPatrol_MIST/mpatrol.qpf new file mode 100644 index 00000000..0ead7d61 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/mpatrol.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2012 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 12.1 Build 243 01/31/2013 Service Pack 1 SJ Full Version +# Date created = 08:25:10 February 28, 2013 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "12.1" +DATE = "08:25:10 February 28, 2013" + +# Revisions + +PROJECT_REVISION = "mpatrol" diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/mpatrol.qsf b/Arcade/IremM52 Hardware/MoonPatrol_MIST/mpatrol.qsf new file mode 100644 index 00000000..0c3d59fb --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/mpatrol.qsf @@ -0,0 +1,241 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 13:17:08 December 19, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# mpatrol_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 "12.1 SP1" +set_global_assignment -name PROJECT_CREATION_TIME_DATE "09:07:52 FEBRUARY 01, 2013" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY Output +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:src/build_id.tcl" +set_global_assignment -name VHDL_FILE src/t80/Z80.vhd +set_global_assignment -name VHDL_FILE src/t80/T80se.vhd +set_global_assignment -name VHDL_FILE src/t80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE src/t80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE src/t80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE src/t80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE src/t80/T80.vhd +set_global_assignment -name VHDL_FILE src/YM2149_linmix_sep.vhd +set_global_assignment -name VHDL_FILE src/video_controller_pkg.vhd +set_global_assignment -name VHDL_FILE src/video_controller.vhd +set_global_assignment -name VHDL_FILE src/tilemapctl.vhd +set_global_assignment -name VHDL_FILE src/sprom.vhd +set_global_assignment -name VHDL_FILE src/spritereg.vhd +set_global_assignment -name VHDL_FILE src/spritectl.vhd +set_global_assignment -name VHDL_FILE src/sprite_pkg_body.vhd +set_global_assignment -name VHDL_FILE src/sprite_pkg.vhd +set_global_assignment -name VHDL_FILE src/spram.vhd +set_global_assignment -name VHDL_FILE src/platform_variant_pkg.vhd +set_global_assignment -name VHDL_FILE src/platform.vhd +set_global_assignment -name VHDL_FILE src/pace_pkg.vhd +set_global_assignment -name VHDL_FILE src/pace.vhd +set_global_assignment -name VHDL_FILE src/Inputs.VHD +set_global_assignment -name VHDL_FILE src/input_mapper.vhd +set_global_assignment -name VHDL_FILE src/Graphics.VHD +set_global_assignment -name VHDL_FILE src/dprom_2r.vhd +set_global_assignment -name VHDL_FILE src/dpram.vhd +set_global_assignment -name VHDL_FILE src/clk_div.vhd +set_global_assignment -name VHDL_FILE src/bitmap3_ctl.vhd +set_global_assignment -name VHDL_FILE src/bitmap2_ctl.vhd +set_global_assignment -name VHDL_FILE src/bitmap1_ctl.vhd +set_global_assignment -name VHDL_FILE src/i82c55.vhd +set_global_assignment -name VERILOG_FILE src/keyboard.v +set_global_assignment -name VHDL_FILE src/moon_patrol_sound_board.vhd +set_global_assignment -name VHDL_FILE src/cpu68.vhd +set_global_assignment -name VHDL_FILE src/moon_patrol_sound_prog.vhd +set_global_assignment -name VHDL_FILE src/dac.vhd +set_global_assignment -name VHDL_FILE src/video_controller_pkg_body.vhd +set_global_assignment -name VHDL_FILE src/video_mixer.vhd +set_global_assignment -name VHDL_FILE src/mpatrol.vhd +set_global_assignment -name SYSTEMVERILOG_FILE src/hq2x.sv +set_global_assignment -name VERILOG_FILE src/scandoubler.v +set_global_assignment -name SYSTEMVERILOG_FILE src/video_mist.sv +set_global_assignment -name VERILOG_FILE src/osd.v +set_global_assignment -name VERILOG_FILE src/mist_io.v +set_global_assignment -name VHDL_FILE src/sprite_array.vhd +set_global_assignment -name VHDL_FILE src/Clock.vhd + +# 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_46 -to UART_TX +set_location_assignment PIN_31 -to UART_RX +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_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 +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 + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name VHDL_INPUT_VERSION VHDL_2008 +set_global_assignment -name VHDL_SHOW_LMF_MAPPING_MESSAGES OFF +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name SEARCH_PATH device/cycloneiii/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/component/cpu/t80/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/component/ps2/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/component/sound/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/pace/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/pace/stubs/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/pace/video/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/platform/m52/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/platform/m52/mpatrol/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/platform/m52/mpatrol/roms/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/target/mist/ -tag from_archive +set_global_assignment -name TOP_LEVEL_ENTITY mpatrol +set_global_assignment -name VERILOG_INPUT_VERSION SYSTEMVERILOG_2005 +set_global_assignment -name VERILOG_SHOW_LMF_MAPPING_MESSAGES OFF + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +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" +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "2.5 V" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# SignalTap II Assignments +# ======================== +set_global_assignment -name ENABLE_SIGNALTAP ON +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp + +# 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 ENTITY(mpatrol) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(mpatrol) +# ------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/mpatrol.srf b/Arcade/IremM52 Hardware/MoonPatrol_MIST/mpatrol.srf new file mode 100644 index 00000000..7be837d6 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/mpatrol.srf @@ -0,0 +1,4 @@ +{ "" "" "" "*" { } { } 0 10873 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 10230 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 10296 "" 0 0 "Quartus II" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 19016 "" 0 0 "Quartus II" 0 -1 0 ""} diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/Clock.qip b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/Clock.qip new file mode 100644 index 00000000..3a7624fb --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/Clock.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 VHDL_FILE [file join $::quartus(qip_path) "Clock.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "Clock.ppf"] diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/Clock.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/Clock.vhd new file mode 100644 index 00000000..4b337d8f --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/Clock.vhd @@ -0,0 +1,446 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: Clock.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY Clock IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + c3 : OUT STD_LOGIC + ); +END Clock; + + +ARCHITECTURE SYN OF clock IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + clk3_divide_by : NATURAL; + clk3_duty_cycle : NATURAL; + clk3_multiply_by : NATURAL; + clk3_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire2 <= sub_wire0(3); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c3 <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 603, + clk0_duty_cycle => 50, + clk0_multiply_by => 80, + clk0_phase_shift => "0", + clk1_divide_by => 18, + clk1_duty_cycle => 50, + clk1_multiply_by => 5, + clk1_phase_shift => "0", + clk2_divide_by => 9, + clk2_duty_cycle => 50, + clk2_multiply_by => 10, + clk2_phase_shift => "0", + clk3_divide_by => 27, + clk3_duty_cycle => 50, + clk3_multiply_by => 40, + clk3_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=Clock", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_USED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire6, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "603" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "18" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "9" +-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "27" +-- 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: DUTY_CYCLE3 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "3.582090" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "7.500000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "30.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "40.000000" +-- 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 "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 STRING "deg" +-- 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: MIRROR_CLK3 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "80" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "5" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "40" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "3.58000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "7.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "30.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "40.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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: PHASE_SHIFT_UNIT3 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 "Clock.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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "603" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "80" +-- 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 "5" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "10" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "40" +-- Retrieval info: CONSTANT: CLK3_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_USED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +-- 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +-- Retrieval info: GEN_FILE: TYPE_NORMAL Clock.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL Clock.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL Clock.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL Clock.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL Clock.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL Clock_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/Graphics.VHD b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/Graphics.VHD new file mode 100644 index 00000000..9c24ca4e --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/Graphics.VHD @@ -0,0 +1,183 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.std_logic_arith.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.sprite_pkg.all; + +entity Graphics is + port + ( + bitmap_ctl_i : in to_BITMAP_CTL_a(1 to 3); + bitmap_ctl_o : out from_BITMAP_CTL_a(1 to 3); + tilemap_ctl_i : in to_TILEMAP_CTL_a(1 to 1); + tilemap_ctl_o : out from_TILEMAP_CTL_a(1 to 1); + sprite_reg_i : in to_SPRITE_REG_t; + sprite_ctl_i : in to_SPRITE_CTL_t; + sprite_ctl_o : out from_SPRITE_CTL_t; + spr0_hit : out std_logic; + graphics_i : in to_GRAPHICS_t; + graphics_o : out from_GRAPHICS_t; + video_i : in from_VIDEO_t; + video_o : out to_VIDEO_t + ); + +end Graphics; + +architecture SYN of Graphics is + + alias clk : std_logic is video_i.clk; + signal from_video_ctl : from_VIDEO_CTL_t; + signal bitmap_ctl_o_s : from_BITMAP_CTL_a(1 to 3); + signal tilemap_ctl_o_s : from_TILEMAP_CTL_a(1 to 1); + signal sprite_ctl_o_s : from_SPRITE_CTL_t; + signal sprite_pri : std_logic; + signal rgb_data : RGB_t; + signal video_o_s : to_VIDEO_t; + +begin + + video_o.clk <= video_o_s.clk; + video_o.rgb.r <= video_o_s.rgb.r; + video_o.rgb.g <= video_o_s.rgb.g; + video_o.rgb.b <= video_o_s.rgb.b; + video_o.hsync <= video_o_s.hsync; + video_o.vsync <= video_o_s.vsync; + video_o.hblank <= video_o_s.hblank; + video_o.vblank <= video_o_s.vblank; + graphics_o.y <= from_video_ctl.y; + graphics_o.hblank <= video_o_s.hblank; + graphics_o.vblank <= video_o_s.vblank; + + pace_video_controller_inst : entity work.pace_video_controller + generic map + ( + CONFIG => PACE_VIDEO_VGA_800x600_60Hz, + DELAY => 7, + H_SIZE => 256, + V_SIZE => 256, + L_CROP => 0,--8 + R_CROP => 0,--8 + H_SCALE => 2,--2 + V_SCALE => 2,--2 + H_SYNC_POL => '1',--1 + V_SYNC_POL => '1',--1 + BORDER_RGB => RGB_BLACK + ) + port map + ( + video_i => video_i, + reg_i.h_scale => "000", + reg_i.v_scale => "000", + rgb_i => rgb_data, + video_ctl_o => from_video_ctl, + video_o => video_o_s + ); + + + pace_video_mixer_inst : entity work.pace_video_mixer + port map + ( + bitmap_ctl_o => bitmap_ctl_o_s, + tilemap_ctl_o => tilemap_ctl_o_s, + sprite_rgb => sprite_ctl_o_s.rgb, + sprite_set => sprite_ctl_o_s.set, + sprite_pri => sprite_pri, + + video_ctl_i => from_video_ctl, + graphics_i => graphics_i, + rgb_o => rgb_data + ); + + + forground_bitmapctl_inst1 : entity work.BITMAP_1 + generic map + ( + DELAY => 7 + ) + port map + ( + reset => video_i.reset, + video_ctl => from_video_ctl, + ctl_i => bitmap_ctl_i(1), + ctl_o => bitmap_ctl_o_s(1), + graphics_i => graphics_i + ); + + forground_bitmapctl_inst2 : entity work.BITMAP_2 + generic map + ( + DELAY => 7 + ) + port map + ( + reset => video_i.reset, + video_ctl => from_video_ctl, + ctl_i => bitmap_ctl_i(2), + ctl_o => bitmap_ctl_o_s(2), + graphics_i => graphics_i + ); + + + forground_bitmapctl_inst3 : entity work.BITMAP_3 + generic map + ( + DELAY => 7 + ) + port map + ( + reset => video_i.reset, + video_ctl => from_video_ctl, + ctl_i => bitmap_ctl_i(3), + ctl_o => bitmap_ctl_o_s(3), + graphics_i => graphics_i + ); + + + bitmap_ctl_o <= bitmap_ctl_o_s; + + + foreground_mapctl_inst : entity work.TILEMAP_1 + generic map + ( + DELAY => 7 + ) + port map + ( + reset => video_i.reset, + video_ctl => from_video_ctl, + ctl_i => tilemap_ctl_i(1), + ctl_o => tilemap_ctl_o_s(1), + graphics_i => graphics_i + ); + + tilemap_ctl_o <= tilemap_ctl_o_s; + + sprites_inst : sprite_array + generic map + ( + N_SPRITES => 64, + DELAY => 7 + ) + port map + ( + reset => video_i.reset, + reg_i => sprite_reg_i, + video_ctl => from_video_ctl, + graphics_i => graphics_i, + row_a => sprite_ctl_o_s.a, + row_d => sprite_ctl_i.d, + rgb => sprite_ctl_o_s.rgb, + set => sprite_ctl_o_s.set, + pri => sprite_pri, + spr0_set => spr0_hit + ); + + + sprite_ctl_o <= sprite_ctl_o_s; + + +end SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/Inputs.VHD b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/Inputs.VHD new file mode 100644 index 00000000..ef42f7bd --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/Inputs.VHD @@ -0,0 +1,85 @@ +Library IEEE; +Use IEEE.std_logic_1164.all; + +library work; +use work.pace_pkg.all; + + +entity inputs is + generic + ( + NUM_DIPS : integer := 8; + NUM_INPUTS : integer := 2; + CLK_1US_DIV : natural := 30 + ); + port + ( + clk : in std_logic; + reset : in std_logic; + ps2clk : in std_logic; + ps2data : in std_logic; + jamma : in from_JAMMA_t; + + dips : in std_logic_vector(NUM_DIPS-1 downto 0); + inputs : out from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1) + ); +end entity inputs; + +architecture SYN of inputs is + + + + signal reset_n : std_logic; + signal tick_1us : std_logic; + signal ps2_reset : std_logic; + signal ps2_press : std_logic; + signal ps2_release : std_logic; + signal ps2_scancode : std_logic_vector(7 downto 0); + +begin + + reset_n <= not reset; + +-- ps2clk <= 'Z'; +-- ps2data <= 'Z'; + + + + inputmapper_inst : entity work.inputmapper + generic map + ( + NUM_DIPS => NUM_DIPS, + NUM_INPUTS => NUM_INPUTS + ) + port map + ( + clk => clk, + rst_n => reset_n, + + reset => ps2_reset, + key_down => ps2_press, + key_up => ps2_release, + data => ps2_scancode, + jamma => jamma, + + dips => dips, + inputs => inputs + ); + + process (clk, reset) + variable count : integer range 0 to CLK_1US_DIV := 0; + begin + if reset = '1' then + count := 0; + tick_1us <= '0'; + elsif rising_edge(clk) then + tick_1us <= '0'; + count := count + 1; + if count = CLK_1US_DIV then + count := 0; + tick_1us <= '1'; + end if; + end if; + end process; + +end architecture SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/YM2149_linmix_sep.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/YM2149_linmix_sep.vhd new file mode 100644 index 00000000..6ed2498a --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/YM2149_linmix_sep.vhd @@ -0,0 +1,574 @@ +-- changes for seperate audio outputs and enable now enables cpu access as well +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + O_CHAN : out std_logic_vector(1 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal cnt_div_t1 : std_logic_vector(3 downto 0); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8; + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process(RESET_L, CLK) + begin + -- looks like registers are latches in real chip, but the address is caught at the end of the address state. + if (RESET_L = '0') then + addr <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA = '1') then + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end if; + end process; + + p_wdata : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + elsif rising_edge(CLK) then + if (ENA = '1') then + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, reg, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + -- envelope shapes + -- C AtAlH + -- 0 0 x x \___ + -- + -- 0 1 x x /___ + -- + -- 1 0 0 0 \\\\ + -- + -- 1 0 0 1 \___ + -- + -- 1 0 1 0 \/\/ + -- ___ + -- 1 0 1 1 \ + -- + -- 1 1 0 0 //// + -- ___ + -- 1 1 0 1 / + -- + -- 1 1 1 0 /\/\ + -- + -- 1 1 1 1 /___ + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + cnt_div_t1 <= cnt_div; + end if; + end process; + + p_audio_output : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_AUDIO <= (others => '0'); + O_CHAN <= (others => '0'); + elsif rising_edge(CLK) then + + if (ENA = '1') then + O_AUDIO <= dac_amp(7 downto 0); + O_CHAN <= cnt_div_t1(1 downto 0); + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then -- resync + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end if; + end process; +end architecture RTL; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/bitmap1_ctl.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/bitmap1_ctl.vhd new file mode 100644 index 00000000..d2ba927b --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/bitmap1_ctl.vhd @@ -0,0 +1,111 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.platform_variant_pkg.all; +use work.video_controller_pkg.all; + +entity BITMAP_1 is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- bitmap controller signals + ctl_i : in to_BITMAP_CTL_t; + ctl_o : out from_BITMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); +end entity BITMAP_1; + +architecture bit1 of BITMAP_1 is + + alias clk : std_logic is video_ctl.clk; + alias clk_en : std_logic is video_ctl.clk_ena; + alias stb : std_logic is video_ctl.stb; + alias hblank : std_logic is video_ctl.hblank; + alias vblank : std_logic is video_ctl.vblank; + alias x : std_logic_vector(video_ctl.x'range) is video_ctl.x; + alias y : std_logic_vector(video_ctl.y'range) is video_ctl.y; + alias rgb : RGB_t is ctl_o.rgb; + alias m52_bg1xpos : std_logic_vector(7 downto 0) is graphics_i.bit16(0)(15 downto 8); + alias m52_bg1ypos : std_logic_vector(7 downto 0) is graphics_i.bit16(0)(7 downto 0); + alias m52_bgcontrol : std_logic_vector(7 downto 0) is graphics_i.bit16(2)(7 downto 0); + +begin + + process (clk, reset) + variable y_r : std_logic_vector(y'range); + variable bgy : unsigned(7 downto 0); + variable bgx : unsigned(7 downto 0); + variable bitmap_d_r : std_logic_vector(7 downto 0); + variable pel : std_logic_vector(1 downto 0); + variable pal_i : std_logic_vector(4 downto 0); + variable pal_rgb : pal_rgb_t; + begin + if reset = '1' then + y_r := (others => '0'); + elsif rising_edge (clk) then + -- default + ctl_o.set <= '0'; + -- same for a whole line + ctl_o.a(11 downto 6) <= std_logic_vector(bgy(5 downto 0)); + if clk_en = '1' then + -- handle line changes + if vblank = '1' then + bgy := (others => '1'); + elsif y /= y_r then + if y(7 downto 0) = m52_bg1ypos then + bgy := (others => '0'); + else + -- need to invert to scroll in the right direction + bgx := not unsigned(m52_bg1xpos); + if bgy < 63 then + bgy := bgy + 1; + end if; + end if; + end if; + -- bit 5 is background enable, bit 2 is layer enable + if m52_bgcontrol(5) = '0' and m52_bgcontrol(2) = '0' and graphics_i.bit8(0)(0) = '1' then + if bgy < 64 then + ctl_o.a(5 downto 0) <= std_logic_vector(bgx(7 downto 2)); + if hblank = '0' then + if bgx(1 downto 0) = "01" then + bitmap_d_r := ctl_i.d(7 downto 0); + else + bitmap_d_r := bitmap_d_r(6 downto 0) & '0'; + end if; + bgx := bgx + 1; + --/* the colors to pick is as follows: */ + --/* 1xxbb: city */ + pel := bitmap_d_r(3) & bitmap_d_r(7); + pal_i := "100" & pel; + pal_rgb := bg_pal(to_integer(unsigned(pal_i))); + ctl_o.rgb.r <= pal_rgb(0) & "00"; + ctl_o.rgb.g <= pal_rgb(1) & "00"; + ctl_o.rgb.b <= pal_rgb(2) & "00"; + if pel /= "00" then + ctl_o.set <= '1'; + end if; + end if; -- hblank='0' + end if; -- bgy<64 + end if; -- m52_bgcontrol + y_r := y; + end if; -- clk_en='1' + end if; -- rising_edge(clk) + end process; + + -- unused + ctl_o.a(ctl_o.a'left downto 12) <= (others => '0'); + +end architecture bit1; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/bitmap2_ctl.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/bitmap2_ctl.vhd new file mode 100644 index 00000000..baf468eb --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/bitmap2_ctl.vhd @@ -0,0 +1,111 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.platform_variant_pkg.all; +use work.video_controller_pkg.all; + +entity BITMAP_2 is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- bitmap controller signals + ctl_i : in to_BITMAP_CTL_t; + ctl_o : out from_BITMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); +end entity BITMAP_2; + +architecture bit2 of BITMAP_2 is + + alias clk : std_logic is video_ctl.clk; + alias clk_en : std_logic is video_ctl.clk_ena; + alias stb : std_logic is video_ctl.stb; + alias hblank : std_logic is video_ctl.hblank; + alias vblank : std_logic is video_ctl.vblank; + alias x : std_logic_vector(video_ctl.x'range) is video_ctl.x; + alias y : std_logic_vector(video_ctl.y'range) is video_ctl.y; + alias rgb : RGB_t is ctl_o.rgb; + alias m52_bg1xpos : std_logic_vector(7 downto 0) is graphics_i.bit16(0)(15 downto 8); + alias m52_bg1ypos : std_logic_vector(7 downto 0) is graphics_i.bit16(0)(7 downto 0); + alias m52_bgcontrol : std_logic_vector(7 downto 0) is graphics_i.bit16(2)(7 downto 0); + +begin + + process (clk, reset) + variable y_r : std_logic_vector(y'range); + variable bgy : unsigned(7 downto 0); + variable bgx : unsigned(7 downto 0); + variable bitmap_d_r : std_logic_vector(7 downto 0); + variable pel : std_logic_vector(1 downto 0); + variable pal_i : std_logic_vector(4 downto 0); + variable pal_rgb : pal_rgb_t; + begin + if reset = '1' then + y_r := (others => '0'); + elsif rising_edge (clk) then + -- default + ctl_o.set <= '0'; + -- same for a whole line + ctl_o.a(11 downto 6) <= std_logic_vector(bgy(5 downto 0)); + if clk_en = '1' then + -- handle line changes + if vblank = '1' then + bgy := (others => '1'); + elsif y /= y_r then + if y(7 downto 0) = m52_bg1ypos then + bgy := (others => '0'); + else + -- need to invert to scroll in the right direction + bgx := not unsigned(m52_bg1xpos); + if bgy < 63 then + bgy := bgy + 1; + end if; + end if; + end if; + -- bit 5 is background enable, bit 1 is layer enable + if m52_bgcontrol(5) = '0' and m52_bgcontrol(1) = '0' and graphics_i.bit8(0)(1) = '1' then + if bgy < 64 then + ctl_o.a(5 downto 0) <= std_logic_vector(bgx(7 downto 2)); + if hblank = '0' then + if bgx(1 downto 0) = "01" then + bitmap_d_r := ctl_i.d(7 downto 0); + else + bitmap_d_r := bitmap_d_r(6 downto 0) & '0'; + end if; + bgx := bgx + 1; + --/* the colors to pick is as follows: */ + --/* 0xxbb: hills */ + pel := bitmap_d_r(3) & bitmap_d_r(7); + pal_i := "000" & pel; + pal_rgb := bg_pal(to_integer(unsigned(pal_i))); + ctl_o.rgb.r <= pal_rgb(0) & "00"; + ctl_o.rgb.g <= pal_rgb(1) & "00"; + ctl_o.rgb.b <= pal_rgb(2) & "00"; + if pel /= "00" then + ctl_o.set <= '1'; + end if; + end if; -- hblank='0' + end if; -- bgy<64 + end if; -- m52_bgcontrol + y_r := y; + end if; -- clk_en='1' + end if; -- rising_edge(clk) + end process; + + -- unused + ctl_o.a(ctl_o.a'left downto 12) <= (others => '0'); + +end architecture bit2; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/bitmap3_ctl.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/bitmap3_ctl.vhd new file mode 100644 index 00000000..e27ec7b6 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/bitmap3_ctl.vhd @@ -0,0 +1,111 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.platform_variant_pkg.all; +use work.video_controller_pkg.all; + +entity BITMAP_3 is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- bitmap controller signals + ctl_i : in to_BITMAP_CTL_t; + ctl_o : out from_BITMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); +end entity BITMAP_3; + +architecture bit3 of BITMAP_3 is + + alias clk : std_logic is video_ctl.clk; + alias clk_en : std_logic is video_ctl.clk_ena; + alias stb : std_logic is video_ctl.stb; + alias hblank : std_logic is video_ctl.hblank; + alias vblank : std_logic is video_ctl.vblank; + alias x : std_logic_vector(video_ctl.x'range) is video_ctl.x; + alias y : std_logic_vector(video_ctl.y'range) is video_ctl.y; + alias rgb : RGB_t is ctl_o.rgb; + alias m52_bg2xpos : std_logic_vector(7 downto 0) is graphics_i.bit16(1)(15 downto 8); + alias m52_bg2ypos : std_logic_vector(7 downto 0) is graphics_i.bit16(1)(7 downto 0); + alias m52_bgcontrol : std_logic_vector(7 downto 0) is graphics_i.bit16(2)(7 downto 0); + +begin + + process (clk, reset) + variable y_r : std_logic_vector(y'range); + variable bgy : unsigned(7 downto 0); + variable bgx : unsigned(7 downto 0); + variable bitmap_d_r : std_logic_vector(7 downto 0); + variable pel : std_logic_vector(1 downto 0); + variable pal_i : std_logic_vector(4 downto 0); + variable pal_rgb : pal_rgb_t; + begin + if reset = '1' then + y_r := (others => '0'); + elsif rising_edge (clk) then + -- default + ctl_o.set <= '0'; + -- same for a whole line + ctl_o.a(11 downto 6) <= std_logic_vector(bgy(5 downto 0)); + if clk_en = '1' then + -- handle line changes + if vblank = '1' then + bgy := (others => '1'); + elsif y /= y_r then + if y(7 downto 0) = m52_bg2ypos then + bgy := (others => '0'); + else + -- need to invert to scroll in the right direction + bgx := not unsigned(m52_bg2xpos); + if bgy < 63 then + bgy := bgy + 1; + end if; + end if; + end if; + -- bit 5 is background enable, bit 4 is layer enable + if m52_bgcontrol(5) = '0' and m52_bgcontrol(4) = '0' and graphics_i.bit8(0)(2) = '1' then + if bgy < 64 then + ctl_o.a(5 downto 0) <= std_logic_vector(bgx(7 downto 2)); + if hblank = '0' then + if bgx(1 downto 0) = "01" then + bitmap_d_r := ctl_i.d(7 downto 0); + else + bitmap_d_r := bitmap_d_r(6 downto 0) & '0'; + end if; + bgx := bgx + 1; + --/* the colors to pick is as follows: */ + --/* xbb00: mountains */ + pel := bitmap_d_r(3) & bitmap_d_r(7); + pal_i := '0' & pel & "00"; + pal_rgb := bg_pal(to_integer(unsigned(pal_i))); + ctl_o.rgb.r <= pal_rgb(0) & "00"; + ctl_o.rgb.g <= pal_rgb(1) & "00"; + ctl_o.rgb.b <= pal_rgb(2) & "00"; + if pel /= "00" then + ctl_o.set <= '1'; + end if; + end if; -- hblank='0' + end if; -- bgy<64 + end if; -- m52_bgcontrol + y_r := y; + end if; -- clk_en='1' + end if; -- rising_edge(clk) + end process; + + -- unused + ctl_o.a(ctl_o.a'left downto 12) <= (others => '0'); + +end architecture bit3; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/bitmapctl_e.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/bitmapctl_e.vhd new file mode 100644 index 00000000..1f6a995c --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/bitmapctl_e.vhd @@ -0,0 +1,29 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; + + +entity bitmapCtl is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- bitmap controller signals + ctl_i : in to_BITMAP_CTL_t; + ctl_o : out from_BITMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); +end entity bitmapCtl; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/build_id.tcl b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/build_id.tcl new file mode 100644 index 00000000..c8c7096c --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/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 "src/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/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/build_id.v b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/build_id.v new file mode 100644 index 00000000..47feaad4 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171219" +`define BUILD_TIME "161924" diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/clk_div.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/clk_div.vhd new file mode 100644 index 00000000..020d6ae6 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/clk_div.vhd @@ -0,0 +1,39 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity clk_div is + generic + ( + DIVISOR : natural + ); + port + ( + clk : in std_logic; + reset : in std_logic; + + clk_en : out std_logic + ); +end clk_div; + +architecture SYN of clk_div is + +begin + + process (clk, reset) + variable count : integer range 0 to DIVISOR-1; + begin + if reset = '1' then + count := 0; + clk_en <= '0'; + elsif rising_edge(clk) then + clk_en <= '0'; + if count = DIVISOR-1 then + clk_en <= '1'; + count := 0; + else + count := count + 1; + end if; + end if; + end process; + +end SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/cpu68.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/cpu68.vhd new file mode 100644 index 00000000..016bd9a9 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/cpu68.vhd @@ -0,0 +1,3963 @@ +--===========================================================================-- +-- +-- S Y N T H E Z I A B L E CPU68 C O R E +-- +-- www.OpenCores.Org - December 2002 +-- This core adheres to the GNU public license +-- +-- File name : cpu68.vhd +-- +-- Purpose : Implements a 6800 compatible CPU core with some +-- additional instructions found in the 6801 +-- +-- Dependencies : ieee.Std_Logic_1164 +-- ieee.std_logic_unsigned +-- +-- Author : John E. Kent +-- +--===========================================================================---- +-- +-- Revision History: +-- +-- Date: Revision Author +-- 22 Sep 2002 0.1 John Kent +-- +-- 30 Oct 2002 0.2 John Kent +-- made NMI edge triggered +-- +-- 30 Oct 2002 0.3 John Kent +-- more corrections to NMI +-- added wai_wait_state to prevent stack overflow on wai. +-- +-- 1 Nov 2002 0.4 John Kent +-- removed WAI states and integrated WAI with the interrupt service routine +-- replace Data out (do) and Data in (di) register with a single Memory Data (md) reg. +-- Added Multiply instruction states. +-- run ALU and CC out of CPU module for timing measurements. +-- +-- 3 Nov 2002 0.5 John Kent +-- Memory Data Register was not loaded on Store instructions +-- SEV and CLV were not defined in the ALU +-- Overflow Flag on NEG was incorrect +-- +-- 16th Feb 2003 0.6 John Kent +-- Rearranged the execution cycle for dual operand instructions +-- so that occurs during the following fetch cycle. +-- This allows the reduction of one clock cycle from dual operand +-- instruction. Note that this also necessitated re-arranging the +-- program counter so that it is no longer incremented in the ALU. +-- The effective address has also been re-arranged to include a +-- separate added. The STD (store accd) now sets the condition codes. +-- +-- 28th Jun 2003 0.7 John Kent +-- Added Hold and Halt signals. Hold is used to steal cycles from the +-- CPU or add wait states. Halt puts the CPU in the inactive state +-- and is only honoured in the fetch cycle. Both signals are active high. +-- +-- 9th Jan 2004 0.8 John Kent +-- Clear instruction did an alu_ld8 rather than an alu_clr, so +-- the carry bit was not cleared correctly. +-- This error was picked up by Michael Hassenfratz. +-- + +library ieee; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +entity cpu68 is + port ( + clk: in std_logic; + rst: in std_logic; + rw: out std_logic; + vma: out std_logic; + address: out std_logic_vector(15 downto 0); + data_in: in std_logic_vector(7 downto 0); + data_out: out std_logic_vector(7 downto 0); + hold: in std_logic; + halt: in std_logic; + irq: in std_logic; + nmi: in std_logic; + test_alu: out std_logic_vector(15 downto 0); + test_cc: out std_logic_vector(7 downto 0) + ); +end; + +architecture CPU_ARCH of cpu68 is + + constant SBIT : integer := 7; + constant XBIT : integer := 6; + constant HBIT : integer := 5; + constant IBIT : integer := 4; + constant NBIT : integer := 3; + constant ZBIT : integer := 2; + constant VBIT : integer := 1; + constant CBIT : integer := 0; + + type state_type is (reset_state, fetch_state, decode_state, + extended_state, indexed_state, read8_state, read16_state, immediate16_state, + write8_state, write16_state, + execute_state, halt_state, error_state, + mul_state, mulea_state, muld_state, + mul0_state, mul1_state, mul2_state, mul3_state, + mul4_state, mul5_state, mul6_state, mul7_state, + jmp_state, jsr_state, jsr1_state, + branch_state, bsr_state, bsr1_state, + rts_hi_state, rts_lo_state, + int_pcl_state, int_pch_state, + int_ixl_state, int_ixh_state, + int_cc_state, int_acca_state, int_accb_state, + int_wai_state, int_mask_state, + rti_state, rti_cc_state, rti_acca_state, rti_accb_state, + rti_ixl_state, rti_ixh_state, + rti_pcl_state, rti_pch_state, + pula_state, psha_state, pulb_state, pshb_state, + pulx_lo_state, pulx_hi_state, pshx_lo_state, pshx_hi_state, + vect_lo_state, vect_hi_state ); + type addr_type is (idle_ad, fetch_ad, read_ad, write_ad, push_ad, pull_ad, int_hi_ad, int_lo_ad ); + type dout_type is (md_lo_dout, md_hi_dout, acca_dout, accb_dout, ix_lo_dout, ix_hi_dout, cc_dout, pc_lo_dout, pc_hi_dout ); + type op_type is (reset_op, fetch_op, latch_op ); + type acca_type is (reset_acca, load_acca, load_hi_acca, pull_acca, latch_acca ); + type accb_type is (reset_accb, load_accb, pull_accb, latch_accb ); + type cc_type is (reset_cc, load_cc, pull_cc, latch_cc ); + type ix_type is (reset_ix, load_ix, pull_lo_ix, pull_hi_ix, latch_ix ); + type sp_type is (reset_sp, latch_sp, load_sp ); + type pc_type is (reset_pc, latch_pc, load_ea_pc, add_ea_pc, pull_lo_pc, pull_hi_pc, inc_pc ); + type md_type is (reset_md, latch_md, load_md, fetch_first_md, fetch_next_md, shiftl_md ); + type ea_type is (reset_ea, latch_ea, add_ix_ea, load_accb_ea, inc_ea, fetch_first_ea, fetch_next_ea ); + type iv_type is (reset_iv, latch_iv, swi_iv, nmi_iv, irq_iv ); + type nmi_type is (reset_nmi, set_nmi, latch_nmi ); + type left_type is (acca_left, accb_left, accd_left, md_left, ix_left, sp_left ); + type right_type is (md_right, zero_right, plus_one_right, accb_right ); + type alu_type is (alu_add8, alu_sub8, alu_add16, alu_sub16, alu_adc, alu_sbc, + alu_and, alu_ora, alu_eor, + alu_tst, alu_inc, alu_dec, alu_clr, alu_neg, alu_com, + alu_inx, alu_dex, alu_cpx, + alu_lsr16, alu_lsl16, + alu_ror8, alu_rol8, + alu_asr8, alu_asl8, alu_lsr8, + alu_sei, alu_cli, alu_sec, alu_clc, alu_sev, alu_clv, alu_tpa, alu_tap, + alu_ld8, alu_st8, alu_ld16, alu_st16, alu_nop, alu_daa ); + + signal op_code: std_logic_vector(7 downto 0); + signal acca: std_logic_vector(7 downto 0); + signal accb: std_logic_vector(7 downto 0); + signal cc: std_logic_vector(7 downto 0); + signal cc_out: std_logic_vector(7 downto 0); + signal xreg: std_logic_vector(15 downto 0); + signal sp: std_logic_vector(15 downto 0); + signal ea: std_logic_vector(15 downto 0); + signal pc: std_logic_vector(15 downto 0); + signal md: std_logic_vector(15 downto 0); + signal left: std_logic_vector(15 downto 0); + signal right: std_logic_vector(15 downto 0); + signal out_alu: std_logic_vector(15 downto 0); + signal iv: std_logic_vector(1 downto 0); + signal nmi_req: std_logic; + signal nmi_ack: std_logic; + + signal state: state_type; + signal next_state: state_type; + signal pc_ctrl: pc_type; + signal ea_ctrl: ea_type; + signal op_ctrl: op_type; + signal md_ctrl: md_type; + signal acca_ctrl: acca_type; + signal accb_ctrl: accb_type; + signal ix_ctrl: ix_type; + signal cc_ctrl: cc_type; + signal sp_ctrl: sp_type; + signal iv_ctrl: iv_type; + signal left_ctrl: left_type; + signal right_ctrl: right_type; + signal alu_ctrl: alu_type; + signal addr_ctrl: addr_type; + signal dout_ctrl: dout_type; + signal nmi_ctrl: nmi_type; + + +begin + +---------------------------------- +-- +-- Address bus multiplexer +-- +---------------------------------- + +addr_mux: process( clk, addr_ctrl, pc, ea, sp, iv ) +begin + case addr_ctrl is + when idle_ad => + address <= "1111111111111111"; + vma <= '0'; + rw <= '1'; + when fetch_ad => + address <= pc; + vma <= '1'; + rw <= '1'; + when read_ad => + address <= ea; + vma <= '1'; + rw <= '1'; + when write_ad => + address <= ea; + vma <= '1'; + rw <= '0'; + when push_ad => + address <= sp; + vma <= '1'; + rw <= '0'; + when pull_ad => + address <= sp; + vma <= '1'; + rw <= '1'; + when int_hi_ad => + address <= "1111111111111" & iv & "0"; + vma <= '1'; + rw <= '1'; + when int_lo_ad => + address <= "1111111111111" & iv & "1"; + vma <= '1'; + rw <= '1'; + when others => + address <= "1111111111111111"; + vma <= '0'; + rw <= '1'; + end case; +end process; + +-------------------------------- +-- +-- Data Bus output +-- +-------------------------------- +dout_mux : process( clk, dout_ctrl, md, acca, accb, xreg, pc, cc ) +begin + case dout_ctrl is + when md_hi_dout => -- alu output + data_out <= md(15 downto 8); + when md_lo_dout => + data_out <= md(7 downto 0); + when acca_dout => -- accumulator a + data_out <= acca; + when accb_dout => -- accumulator b + data_out <= accb; + when ix_lo_dout => -- index reg + data_out <= xreg(7 downto 0); + when ix_hi_dout => -- index reg + data_out <= xreg(15 downto 8); + when cc_dout => -- condition codes + data_out <= cc; + when pc_lo_dout => -- low order pc + data_out <= pc(7 downto 0); + when pc_hi_dout => -- high order pc + data_out <= pc(15 downto 8); + when others => + data_out <= "00000000"; + end case; +end process; + + +---------------------------------- +-- +-- Program Counter Control +-- +---------------------------------- + +pc_mux: process( clk, pc_ctrl, pc, out_alu, data_in, ea, hold ) +variable tempof : std_logic_vector(15 downto 0); +variable temppc : std_logic_vector(15 downto 0); +begin + case pc_ctrl is + when add_ea_pc => + if ea(7) = '0' then + tempof := "00000000" & ea(7 downto 0); + else + tempof := "11111111" & ea(7 downto 0); + end if; + when inc_pc => + tempof := "0000000000000001"; + when others => + tempof := "0000000000000000"; + end case; + + case pc_ctrl is + when reset_pc => + temppc := "1111111111111110"; + when load_ea_pc => + temppc := ea; + when pull_lo_pc => + temppc(7 downto 0) := data_in; + temppc(15 downto 8) := pc(15 downto 8); + when pull_hi_pc => + temppc(7 downto 0) := pc(7 downto 0); + temppc(15 downto 8) := data_in; + when others => + temppc := pc; + end case; + + if clk'event and clk = '0' then + if hold = '1' then + pc <= pc; + else + pc <= temppc + tempof; + end if; + end if; +end process; + +---------------------------------- +-- +-- Effective Address Control +-- +---------------------------------- + +ea_mux: process( clk, ea_ctrl, ea, out_alu, data_in, accb, xreg, hold ) +variable tempind : std_logic_vector(15 downto 0); +variable tempea : std_logic_vector(15 downto 0); +begin + case ea_ctrl is + when add_ix_ea => + tempind := "00000000" & ea(7 downto 0); + when inc_ea => + tempind := "0000000000000001"; + when others => + tempind := "0000000000000000"; + end case; + + case ea_ctrl is + when reset_ea => + tempea := "0000000000000000"; + when load_accb_ea => + tempea := "00000000" & accb(7 downto 0); + when add_ix_ea => + tempea := xreg; + when fetch_first_ea => + tempea(7 downto 0) := data_in; + tempea(15 downto 8) := "00000000"; + when fetch_next_ea => + tempea(7 downto 0) := data_in; + tempea(15 downto 8) := ea(7 downto 0); + when others => + tempea := ea; + end case; + + if clk'event and clk = '0' then + if hold = '1' then + ea <= ea; + else + ea <= tempea + tempind; + end if; + end if; +end process; + +-------------------------------- +-- +-- Accumulator A +-- +-------------------------------- +acca_mux : process( clk, acca_ctrl, out_alu, acca, data_in, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + acca <= acca; + else + case acca_ctrl is + when reset_acca => + acca <= "00000000"; + when load_acca => + acca <= out_alu(7 downto 0); + when load_hi_acca => + acca <= out_alu(15 downto 8); + when pull_acca => + acca <= data_in; + when others => +-- when latch_acca => + acca <= acca; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- Accumulator B +-- +-------------------------------- +accb_mux : process( clk, accb_ctrl, out_alu, accb, data_in, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + accb <= accb; + else + case accb_ctrl is + when reset_accb => + accb <= "00000000"; + when load_accb => + accb <= out_alu(7 downto 0); + when pull_accb => + accb <= data_in; + when others => +-- when latch_accb => + accb <= accb; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- X Index register +-- +-------------------------------- +ix_mux : process( clk, ix_ctrl, out_alu, xreg, data_in, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + xreg <= xreg; + else + case ix_ctrl is + when reset_ix => + xreg <= "0000000000000000"; + when load_ix => + xreg <= out_alu(15 downto 0); + when pull_hi_ix => + xreg(15 downto 8) <= data_in; + when pull_lo_ix => + xreg(7 downto 0) <= data_in; + when others => +-- when latch_ix => + xreg <= xreg; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- stack pointer +-- +-------------------------------- +sp_mux : process( clk, sp_ctrl, out_alu, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + sp <= sp; + else + case sp_ctrl is + when reset_sp => + sp <= "0000000000000000"; + when load_sp => + sp <= out_alu(15 downto 0); + when others => +-- when latch_sp => + sp <= sp; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- Memory Data +-- +-------------------------------- +md_mux : process( clk, md_ctrl, out_alu, data_in, md, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + md <= md; + else + case md_ctrl is + when reset_md => + md <= "0000000000000000"; + when load_md => + md <= out_alu(15 downto 0); + when fetch_first_md => + md(15 downto 8) <= "00000000"; + md(7 downto 0) <= data_in; + when fetch_next_md => + md(15 downto 8) <= md(7 downto 0); + md(7 downto 0) <= data_in; + when shiftl_md => + md(15 downto 1) <= md(14 downto 0); + md(0) <= '0'; + when others => +-- when latch_md => + md <= md; + end case; + end if; + end if; +end process; + + +---------------------------------- +-- +-- Condition Codes +-- +---------------------------------- + +cc_mux: process( clk, cc_ctrl, cc_out, cc, data_in, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + cc <= cc; + else + case cc_ctrl is + when reset_cc => + cc <= "11000000"; + when load_cc => + cc <= cc_out; + when pull_cc => + cc <= data_in; + when others => +-- when latch_cc => + cc <= cc; + end case; + end if; + end if; +end process; + +---------------------------------- +-- +-- interrupt vector +-- +---------------------------------- + +iv_mux: process( clk, iv_ctrl, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + iv <= iv; + else + case iv_ctrl is + when reset_iv => + iv <= "11"; + when nmi_iv => + iv <= "10"; + when swi_iv => + iv <= "01"; + when irq_iv => + iv <= "00"; + when others => + iv <= iv; + end case; + end if; + end if; +end process; + +---------------------------------- +-- +-- op code fetch +-- +---------------------------------- + +op_fetch: process( clk, data_in, op_ctrl, op_code, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + op_code <= op_code; + else + case op_ctrl is + when reset_op => + op_code <= "00000001"; -- nop + when fetch_op => + op_code <= data_in; + when others => +-- when latch_op => + op_code <= op_code; + end case; + end if; + end if; +end process; + +---------------------------------- +-- +-- Left Mux +-- +---------------------------------- + +left_mux: process( left_ctrl, acca, accb, xreg, sp, pc, ea, md ) +begin + case left_ctrl is + when acca_left => + left(15 downto 8) <= "00000000"; + left(7 downto 0) <= acca; + when accb_left => + left(15 downto 8) <= "00000000"; + left(7 downto 0) <= accb; + when accd_left => + left(15 downto 8) <= acca; + left(7 downto 0) <= accb; + when ix_left => + left <= xreg; + when sp_left => + left <= sp; + when others => +-- when md_left => + left <= md; + end case; +end process; +---------------------------------- +-- +-- Right Mux +-- +---------------------------------- + +right_mux: process( right_ctrl, data_in, md, accb, ea ) +begin + case right_ctrl is + when zero_right => + right <= "0000000000000000"; + when plus_one_right => + right <= "0000000000000001"; + when accb_right => + right <= "00000000" & accb; + when others => +-- when md_right => + right <= md; + end case; +end process; + +---------------------------------- +-- +-- Arithmetic Logic Unit +-- +---------------------------------- + +mux_alu: process( alu_ctrl, cc, left, right, out_alu, cc_out ) +variable valid_lo, valid_hi : boolean; +variable carry_in : std_logic; +variable daa_reg : std_logic_vector(7 downto 0); +begin + + case alu_ctrl is + when alu_adc | alu_sbc | + alu_rol8 | alu_ror8 => + carry_in := cc(CBIT); + when others => + carry_in := '0'; + end case; + + valid_lo := left(3 downto 0) <= 9; + valid_hi := left(7 downto 4) <= 9; + + if (cc(CBIT) = '0') then + if( cc(HBIT) = '1' ) then + if valid_hi then + daa_reg := "00000110"; + else + daa_reg := "01100110"; + end if; + else + if valid_lo then + if valid_hi then + daa_reg := "00000000"; + else + daa_reg := "01100000"; + end if; + else + if( left(7 downto 4) <= 8 ) then + daa_reg := "00000110"; + else + daa_reg := "01100110"; + end if; + end if; + end if; + else + if ( cc(HBIT) = '1' )then + daa_reg := "01100110"; + else + if valid_lo then + daa_reg := "01100000"; + else + daa_reg := "01100110"; + end if; + end if; + end if; + + case alu_ctrl is + when alu_add8 | alu_inc | + alu_add16 | alu_inx | + alu_adc => + out_alu <= left + right + ("000000000000000" & carry_in); + when alu_sub8 | alu_dec | + alu_sub16 | alu_dex | + alu_sbc | alu_cpx => + out_alu <= left - right - ("000000000000000" & carry_in); + when alu_and => + out_alu <= left and right; -- and/bit + when alu_ora => + out_alu <= left or right; -- or + when alu_eor => + out_alu <= left xor right; -- eor/xor + when alu_lsl16 | alu_asl8 | alu_rol8 => + out_alu <= left(14 downto 0) & carry_in; -- rol8/asl8/lsl16 + when alu_lsr16 | alu_lsr8 => + out_alu <= carry_in & left(15 downto 1); -- lsr + when alu_ror8 => + out_alu <= "00000000" & carry_in & left(7 downto 1); -- ror + when alu_asr8 => + out_alu <= "00000000" & left(7) & left(7 downto 1); -- asr + when alu_neg => + out_alu <= right - left; -- neg (right=0) + when alu_com => + out_alu <= not left; + when alu_clr | alu_ld8 | alu_ld16 => + out_alu <= right; -- clr, ld + when alu_st8 | alu_st16 => + out_alu <= left; + when alu_daa => + out_alu <= left + ("00000000" & daa_reg); + when alu_tpa => + out_alu <= "00000000" & cc; + when others => + out_alu <= left; -- nop + end case; + + -- + -- carry bit + -- + case alu_ctrl is + when alu_add8 | alu_adc => + cc_out(CBIT) <= (left(7) and right(7)) or + (left(7) and not out_alu(7)) or + (right(7) and not out_alu(7)); + when alu_sub8 | alu_sbc => + cc_out(CBIT) <= ((not left(7)) and right(7)) or + ((not left(7)) and out_alu(7)) or + (right(7) and out_alu(7)); + when alu_add16 => + cc_out(CBIT) <= (left(15) and right(15)) or + (left(15) and not out_alu(15)) or + (right(15) and not out_alu(15)); + when alu_sub16 => + cc_out(CBIT) <= ((not left(15)) and right(15)) or + ((not left(15)) and out_alu(15)) or + (right(15) and out_alu(15)); + when alu_ror8 | alu_lsr16 | alu_lsr8 | alu_asr8 => + cc_out(CBIT) <= left(0); + when alu_rol8 | alu_asl8 => + cc_out(CBIT) <= left(7); + when alu_lsl16 => + cc_out(CBIT) <= left(15); + when alu_com => + cc_out(CBIT) <= '1'; + when alu_neg | alu_clr => + cc_out(CBIT) <= out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or + out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0); + when alu_daa => + if ( daa_reg(7 downto 4) = "0110" ) then + cc_out(CBIT) <= '1'; + else + cc_out(CBIT) <= '0'; + end if; + when alu_sec => + cc_out(CBIT) <= '1'; + when alu_clc => + cc_out(CBIT) <= '0'; + when alu_tap => + cc_out(CBIT) <= left(CBIT); + when others => -- carry is not affected by cpx + cc_out(CBIT) <= cc(CBIT); + end case; + -- + -- Zero flag + -- + case alu_ctrl is + when alu_add8 | alu_sub8 | + alu_adc | alu_sbc | + alu_and | alu_ora | alu_eor | + alu_inc | alu_dec | + alu_neg | alu_com | alu_clr | + alu_rol8 | alu_ror8 | alu_asr8 | alu_asl8 | alu_lsr8 | + alu_ld8 | alu_st8 => + cc_out(ZBIT) <= not( out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or + out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0) ); + when alu_add16 | alu_sub16 | + alu_lsl16 | alu_lsr16 | + alu_inx | alu_dex | + alu_ld16 | alu_st16 | alu_cpx => + cc_out(ZBIT) <= not( out_alu(15) or out_alu(14) or out_alu(13) or out_alu(12) or + out_alu(11) or out_alu(10) or out_alu(9) or out_alu(8) or + out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or + out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0) ); + when alu_tap => + cc_out(ZBIT) <= left(ZBIT); + when others => + cc_out(ZBIT) <= cc(ZBIT); + end case; + + -- + -- negative flag + -- + case alu_ctrl is + when alu_add8 | alu_sub8 | + alu_adc | alu_sbc | + alu_and | alu_ora | alu_eor | + alu_rol8 | alu_ror8 | alu_asr8 | alu_asl8 | alu_lsr8 | + alu_inc | alu_dec | alu_neg | alu_com | alu_clr | + alu_ld8 | alu_st8 => + cc_out(NBIT) <= out_alu(7); + when alu_add16 | alu_sub16 | + alu_lsl16 | alu_lsr16 | + alu_ld16 | alu_st16 | alu_cpx => + cc_out(NBIT) <= out_alu(15); + when alu_tap => + cc_out(NBIT) <= left(NBIT); + when others => + cc_out(NBIT) <= cc(NBIT); + end case; + + -- + -- Interrupt mask flag + -- + case alu_ctrl is + when alu_sei => + cc_out(IBIT) <= '1'; -- set interrupt mask + when alu_cli => + cc_out(IBIT) <= '0'; -- clear interrupt mask + when alu_tap => + cc_out(IBIT) <= left(IBIT); + when others => + cc_out(IBIT) <= cc(IBIT); -- interrupt mask + end case; + + -- + -- Half Carry flag + -- + case alu_ctrl is + when alu_add8 | alu_adc => + cc_out(HBIT) <= (left(3) and right(3)) or + (right(3) and not out_alu(3)) or + (left(3) and not out_alu(3)); + when alu_tap => + cc_out(HBIT) <= left(HBIT); + when others => + cc_out(HBIT) <= cc(HBIT); + end case; + + -- + -- Overflow flag + -- + case alu_ctrl is + when alu_add8 | alu_adc => + cc_out(VBIT) <= (left(7) and right(7) and (not out_alu(7))) or + ((not left(7)) and (not right(7)) and out_alu(7)); + when alu_sub8 | alu_sbc => + cc_out(VBIT) <= (left(7) and (not right(7)) and (not out_alu(7))) or + ((not left(7)) and right(7) and out_alu(7)); + when alu_add16 => + cc_out(VBIT) <= (left(15) and right(15) and (not out_alu(15))) or + ((not left(15)) and (not right(15)) and out_alu(15)); + when alu_sub16 | alu_cpx => + cc_out(VBIT) <= (left(15) and (not right(15)) and (not out_alu(15))) or + ((not left(15)) and right(15) and out_alu(15)); + when alu_inc => + cc_out(VBIT) <= ((not left(7)) and left(6) and left(5) and left(4) and + left(3) and left(2) and left(1) and left(0)); + when alu_dec | alu_neg => + cc_out(VBIT) <= (left(7) and (not left(6)) and (not left(5)) and (not left(4)) and + (not left(3)) and (not left(2)) and (not left(1)) and (not left(0))); + when alu_asr8 => + cc_out(VBIT) <= left(0) xor left(7); + when alu_lsr8 | alu_lsr16 => + cc_out(VBIT) <= left(0); + when alu_ror8 => + cc_out(VBIT) <= left(0) xor cc(CBIT); + when alu_lsl16 => + cc_out(VBIT) <= left(15) xor left(14); + when alu_rol8 | alu_asl8 => + cc_out(VBIT) <= left(7) xor left(6); + when alu_tap => + cc_out(VBIT) <= left(VBIT); + when alu_and | alu_ora | alu_eor | alu_com | + alu_st8 | alu_st16 | alu_ld8 | alu_ld16 | + alu_clv => + cc_out(VBIT) <= '0'; + when alu_sev => + cc_out(VBIT) <= '1'; + when others => + cc_out(VBIT) <= cc(VBIT); + end case; + + case alu_ctrl is + when alu_tap => + cc_out(XBIT) <= cc(XBIT) and left(XBIT); + cc_out(SBIT) <= left(SBIT); + when others => + cc_out(XBIT) <= cc(XBIT) and left(XBIT); + cc_out(SBIT) <= cc(SBIT); + end case; + + test_alu <= out_alu; + test_cc <= cc_out; +end process; + +------------------------------------ +-- +-- Detect Edge of NMI interrupt +-- +------------------------------------ + +nmi_handler : process( clk, rst, nmi, nmi_ack ) +begin + if clk'event and clk='0' then + if hold = '1' then + nmi_req <= nmi_req; + else + if rst='1' then + nmi_req <= '0'; + else + if (nmi='1') and (nmi_ack='0') then + nmi_req <= '1'; + else + if (nmi='0') and (nmi_ack='1') then + nmi_req <= '0'; + else + nmi_req <= nmi_req; + end if; + end if; + end if; + end if; + end if; +end process; + +------------------------------------ +-- +-- Nmi mux +-- +------------------------------------ + +nmi_mux: process( clk, nmi_ctrl, nmi_ack, hold ) +begin + if clk'event and clk='0' then + if hold = '1' then + nmi_ack <= nmi_ack; + else + case nmi_ctrl is + when set_nmi => + nmi_ack <= '1'; + when reset_nmi => + nmi_ack <= '0'; + when others => +-- when latch_nmi => + nmi_ack <= nmi_ack; + end case; + end if; + end if; +end process; + +------------------------------------ +-- +-- state sequencer +-- +------------------------------------ +process( state, op_code, cc, ea, irq, nmi_req, nmi_ack, hold, halt ) + begin + case state is + when reset_state => -- released from reset + -- reset the registers + op_ctrl <= reset_op; + acca_ctrl <= reset_acca; + accb_ctrl <= reset_accb; + ix_ctrl <= reset_ix; + sp_ctrl <= reset_sp; + pc_ctrl <= reset_pc; + ea_ctrl <= reset_ea; + md_ctrl <= reset_md; + iv_ctrl <= reset_iv; + nmi_ctrl <= reset_nmi; + -- idle the ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= reset_cc; + -- idle the bus + dout_ctrl <= md_lo_dout; + addr_ctrl <= idle_ad; + next_state <= vect_hi_state; + + -- + -- Jump via interrupt vector + -- iv holds interrupt type + -- fetch PC hi from vector location + -- + when vect_hi_state => + -- default the registers + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + md_ctrl <= latch_md; + ea_ctrl <= latch_ea; + iv_ctrl <= latch_iv; + -- idle the ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- fetch pc low interrupt vector + pc_ctrl <= pull_hi_pc; + addr_ctrl <= int_hi_ad; + dout_ctrl <= pc_hi_dout; + next_state <= vect_lo_state; + -- + -- jump via interrupt vector + -- iv holds vector type + -- fetch PC lo from vector location + -- + when vect_lo_state => + -- default the registers + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + md_ctrl <= latch_md; + ea_ctrl <= latch_ea; + iv_ctrl <= latch_iv; + -- idle the ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- fetch the vector low byte + pc_ctrl <= pull_lo_pc; + addr_ctrl <= int_lo_ad; + dout_ctrl <= pc_lo_dout; + next_state <= fetch_state; + + -- + -- Here to fetch an instruction + -- PC points to opcode + -- Should service interrupt requests at this point + -- either from the timer + -- or from the external input. + -- + when fetch_state => + case op_code(7 downto 4) is + when "0000" | + "0001" | + "0010" | -- branch conditional + "0011" | + "0100" | -- acca single op + "0101" | -- accb single op + "0110" | -- indexed single op + "0111" => -- extended single op + -- idle ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + + when "1000" | -- acca immediate + "1001" | -- acca direct + "1010" | -- acca indexed + "1011" => -- acca extended + case op_code(3 downto 0) is + when "0000" => -- suba + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0001" => -- cmpa + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0010" => -- sbca + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sbc; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0011" => -- subd + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0100" => -- anda + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_and; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0101" => -- bita + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_and; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0110" => -- ldaa + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0111" => -- staa + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1000" => -- eora + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_eor; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1001" => -- adca + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_adc; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1010" => -- oraa + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ora; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1011" => -- adda + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1100" => -- cpx + left_ctrl <= ix_left; + right_ctrl <= md_right; + alu_ctrl <= alu_cpx; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1101" => -- bsr / jsr + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1110" => -- lds + left_ctrl <= sp_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + when "1111" => -- sts + left_ctrl <= sp_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st16; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when others => + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + end case; + when "1100" | -- accb immediate + "1101" | -- accb direct + "1110" | -- accb indexed + "1111" => -- accb extended + case op_code(3 downto 0) is + when "0000" => -- subb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0001" => -- cmpb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0010" => -- sbcb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sbc; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0011" => -- addd + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0100" => -- andb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_and; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0101" => -- bitb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_and; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0110" => -- ldab + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0111" => -- stab + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1000" => -- eorb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_eor; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1001" => -- adcb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_adc; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1010" => -- orab + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ora; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1011" => -- addb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1100" => -- ldd + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1101" => -- std + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st16; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1110" => -- ldx + left_ctrl <= ix_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= load_ix; + sp_ctrl <= latch_sp; + when "1111" => -- stx + left_ctrl <= ix_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st16; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when others => + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + end case; + when others => + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + end case; + md_ctrl <= latch_md; + -- fetch the op code + op_ctrl <= fetch_op; + ea_ctrl <= reset_ea; + addr_ctrl <= fetch_ad; + dout_ctrl <= md_lo_dout; + iv_ctrl <= latch_iv; + if halt = '1' then + pc_ctrl <= latch_pc; + nmi_ctrl <= latch_nmi; + next_state <= halt_state; + -- service non maskable interrupts + elsif (nmi_req = '1') and (nmi_ack = '0') then + pc_ctrl <= latch_pc; + nmi_ctrl <= set_nmi; + next_state <= int_pcl_state; + -- service maskable interrupts + else + -- + -- nmi request is not cleared until nmi input goes low + -- + if(nmi_req = '0') and (nmi_ack='1') then + nmi_ctrl <= reset_nmi; + else + nmi_ctrl <= latch_nmi; + end if; + -- + -- IRQ is level sensitive + -- + if (irq = '1') and (cc(IBIT) = '0') then + pc_ctrl <= latch_pc; + next_state <= int_pcl_state; + else + -- Advance the PC to fetch next instruction byte + pc_ctrl <= inc_pc; + next_state <= decode_state; + end if; + end if; + -- + -- Here to decode instruction + -- and fetch next byte of intruction + -- whether it be necessary or not + -- + when decode_state => + -- fetch first byte of address or immediate data + ea_ctrl <= fetch_first_ea; + addr_ctrl <= fetch_ad; + dout_ctrl <= md_lo_dout; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + iv_ctrl <= latch_iv; + case op_code(7 downto 4) is + when "0000" => + md_ctrl <= fetch_first_md; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + case op_code(3 downto 0) is + when "0001" => -- nop + left_ctrl <= accd_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "0100" => -- lsrd + left_ctrl <= accd_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_lsr16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + when "0101" => -- lsld + left_ctrl <= accd_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_lsl16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + when "0110" => -- tap + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_tap; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "0111" => -- tpa + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_tpa; + cc_ctrl <= latch_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "1000" => -- inx + left_ctrl <= ix_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_inx; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= load_ix; + when "1001" => -- dex + left_ctrl <= ix_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_dex; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= load_ix; + when "1010" => -- clv + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_clv; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "1011" => -- sev + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_sev; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "1100" => -- clc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_clc; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "1101" => -- sec + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_sec; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "1110" => -- cli + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_cli; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "1111" => -- sei + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_sei; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + end case; + next_state <= fetch_state; + -- acca / accb inherent instructions + when "0001" => + md_ctrl <= fetch_first_md; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + left_ctrl <= acca_left; + right_ctrl <= accb_right; + case op_code(3 downto 0) is + when "0000" => -- sba + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + when "0001" => -- cba + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + when "0110" => -- tab + alu_ctrl <= alu_st8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + when "0111" => -- tba + alu_ctrl <= alu_ld8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + when "1001" => -- daa + alu_ctrl <= alu_daa; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + when "1011" => -- aba + alu_ctrl <= alu_add8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + when others => + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end case; + next_state <= fetch_state; + when "0010" => -- branch conditional + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- increment the pc + pc_ctrl <= inc_pc; + case op_code(3 downto 0) is + when "0000" => -- bra + next_state <= branch_state; + when "0001" => -- brn + next_state <= fetch_state; + when "0010" => -- bhi + if (cc(CBIT) or cc(ZBIT)) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "0011" => -- bls + if (cc(CBIT) or cc(ZBIT)) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "0100" => -- bcc/bhs + if cc(CBIT) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "0101" => -- bcs/blo + if cc(CBIT) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "0110" => -- bne + if cc(ZBIT) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "0111" => -- beq + if cc(ZBIT) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1000" => -- bvc + if cc(VBIT) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1001" => -- bvs + if cc(VBIT) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1010" => -- bpl + if cc(NBIT) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1011" => -- bmi + if cc(NBIT) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1100" => -- bge + if (cc(NBIT) xor cc(VBIT)) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1101" => -- blt + if (cc(NBIT) xor cc(VBIT)) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1110" => -- bgt + if (cc(ZBIT) or (cc(NBIT) xor cc(VBIT))) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1111" => -- ble + if (cc(ZBIT) or (cc(NBIT) xor cc(VBIT))) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when others => + next_state <= fetch_state; + end case; + -- + -- Single byte stack operators + -- Do not advance PC + -- + when "0011" => + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + pc_ctrl <= latch_pc; + case op_code(3 downto 0) is + when "0000" => -- tsx + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= load_ix; + sp_ctrl <= latch_sp; + next_state <= fetch_state; + when "0001" => -- ins + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= fetch_state; + when "0010" => -- pula + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= pula_state; + when "0011" => -- pulb + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= pulb_state; + when "0100" => -- des + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= fetch_state; + when "0101" => -- txs + left_ctrl <= ix_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= fetch_state; + when "0110" => -- psha + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= psha_state; + when "0111" => -- pshb + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= pshb_state; + when "1000" => -- pulx + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= pulx_hi_state; + when "1001" => -- rts + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= rts_hi_state; + when "1010" => -- abx + left_ctrl <= ix_left; + right_ctrl <= accb_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= load_ix; + sp_ctrl <= latch_sp; + next_state <= fetch_state; + when "1011" => -- rti + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= rti_cc_state; + when "1100" => -- pshx + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= pshx_lo_state; + when "1101" => -- mul + left_ctrl <= acca_left; + right_ctrl <= accb_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= mul_state; + when "1110" => -- wai + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= int_pcl_state; + when "1111" => -- swi + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= int_pcl_state; + when others => + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= fetch_state; + end case; + -- + -- Accumulator A Single operand + -- source = Acc A dest = Acc A + -- Do not advance PC + -- + when "0100" => -- acca single op + md_ctrl <= fetch_first_md; + accb_ctrl <= latch_accb; + pc_ctrl <= latch_pc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + left_ctrl <= acca_left; + case op_code(3 downto 0) is + when "0000" => -- neg + right_ctrl <= zero_right; + alu_ctrl <= alu_neg; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "0011" => -- com + right_ctrl <= zero_right; + alu_ctrl <= alu_com; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "0100" => -- lsr + right_ctrl <= zero_right; + alu_ctrl <= alu_lsr8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "0110" => -- ror + right_ctrl <= zero_right; + alu_ctrl <= alu_ror8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "0111" => -- asr + right_ctrl <= zero_right; + alu_ctrl <= alu_asr8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "1000" => -- asl + right_ctrl <= zero_right; + alu_ctrl <= alu_asl8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "1001" => -- rol + right_ctrl <= zero_right; + alu_ctrl <= alu_rol8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "1010" => -- dec + right_ctrl <= plus_one_right; + alu_ctrl <= alu_dec; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "1011" => -- undefined + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + acca_ctrl <= latch_acca; + cc_ctrl <= latch_cc; + when "1100" => -- inc + right_ctrl <= plus_one_right; + alu_ctrl <= alu_inc; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "1101" => -- tst + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + acca_ctrl <= latch_acca; + cc_ctrl <= load_cc; + when "1110" => -- jmp + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + acca_ctrl <= latch_acca; + cc_ctrl <= latch_cc; + when "1111" => -- clr + right_ctrl <= zero_right; + alu_ctrl <= alu_clr; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when others => + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + acca_ctrl <= latch_acca; + cc_ctrl <= latch_cc; + end case; + next_state <= fetch_state; + -- + -- single operand acc b + -- Do not advance PC + -- + when "0101" => + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + pc_ctrl <= latch_pc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + left_ctrl <= accb_left; + case op_code(3 downto 0) is + when "0000" => -- neg + right_ctrl <= zero_right; + alu_ctrl <= alu_neg; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "0011" => -- com + right_ctrl <= zero_right; + alu_ctrl <= alu_com; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "0100" => -- lsr + right_ctrl <= zero_right; + alu_ctrl <= alu_lsr8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "0110" => -- ror + right_ctrl <= zero_right; + alu_ctrl <= alu_ror8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "0111" => -- asr + right_ctrl <= zero_right; + alu_ctrl <= alu_asr8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "1000" => -- asl + right_ctrl <= zero_right; + alu_ctrl <= alu_asl8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "1001" => -- rol + right_ctrl <= zero_right; + alu_ctrl <= alu_rol8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "1010" => -- dec + right_ctrl <= plus_one_right; + alu_ctrl <= alu_dec; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "1011" => -- undefined + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + accb_ctrl <= latch_accb; + cc_ctrl <= latch_cc; + when "1100" => -- inc + right_ctrl <= plus_one_right; + alu_ctrl <= alu_inc; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "1101" => -- tst + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + accb_ctrl <= latch_accb; + cc_ctrl <= load_cc; + when "1110" => -- jmp + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + accb_ctrl <= latch_accb; + cc_ctrl <= latch_cc; + when "1111" => -- clr + right_ctrl <= zero_right; + alu_ctrl <= alu_clr; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when others => + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + accb_ctrl <= latch_accb; + cc_ctrl <= latch_cc; + end case; + next_state <= fetch_state; + -- + -- Single operand indexed + -- Two byte instruction so advance PC + -- EA should hold index offset + -- + when "0110" => -- indexed single op + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + next_state <= indexed_state; + -- + -- Single operand extended addressing + -- three byte instruction so advance the PC + -- Low order EA holds high order address + -- + when "0111" => -- extended single op + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + next_state <= extended_state; + + when "1000" => -- acca immediate + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + case op_code(3 downto 0) is + when "0011" | -- subdd # + "1100" | -- cpx # + "1110" => -- lds # + next_state <= immediate16_state; + when "1101" => -- bsr + next_state <= bsr_state; + when others => + next_state <= fetch_state; + end case; + + when "1001" => -- acca direct + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + pc_ctrl <= inc_pc; + case op_code(3 downto 0) is + when "0111" => -- staa direct + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1111" => -- sts direct + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when "1101" => -- jsr direct + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + next_state <= jsr_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + next_state <= read8_state; + end case; + + when "1010" => -- acca indexed + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + next_state <= indexed_state; + + when "1011" => -- acca extended + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + next_state <= extended_state; + + when "1100" => -- accb immediate + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + case op_code(3 downto 0) is + when "0011" | -- addd # + "1100" | -- ldd # + "1110" => -- ldx # + next_state <= immediate16_state; + when others => + next_state <= fetch_state; + end case; + + when "1101" => -- accb direct + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + pc_ctrl <= inc_pc; + case op_code(3 downto 0) is + when "0111" => -- stab direct + left_ctrl <= accb_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1101" => -- std direct + left_ctrl <= accd_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when "1111" => -- stx direct + left_ctrl <= ix_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + next_state <= read8_state; + end case; + + when "1110" => -- accb indexed + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + next_state <= indexed_state; + + when "1111" => -- accb extended + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + next_state <= extended_state; + + when others => + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- idle the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= latch_pc; + next_state <= fetch_state; + end case; + + when immediate16_state => + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + op_ctrl <= latch_op; + iv_ctrl <= latch_iv; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + -- fetch next immediate byte + md_ctrl <= fetch_next_md; + addr_ctrl <= fetch_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + -- + -- ea holds 8 bit index offet + -- calculate the effective memory address + -- using the alu + -- + when indexed_state => + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + -- calculate effective address from index reg + -- index offest is not sign extended + ea_ctrl <= add_ix_ea; + -- idle the bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + -- work out next state + case op_code(7 downto 4) is + when "0110" => -- single op indexed + md_ctrl <= latch_md; + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + case op_code(3 downto 0) is + when "1011" => -- undefined + next_state <= fetch_state; + when "1110" => -- jmp + next_state <= jmp_state; + when others => + next_state <= read8_state; + end case; + when "1010" => -- acca indexed + case op_code(3 downto 0) is + when "0111" => -- staa + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1101" => -- jsr + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= jsr_state; + when "1111" => -- sts + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= read8_state; + end case; + when "1110" => -- accb indexed + case op_code(3 downto 0) is + when "0111" => -- stab direct + left_ctrl <= accb_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1101" => -- std direct + left_ctrl <= accd_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when "1111" => -- stx direct + left_ctrl <= ix_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= read8_state; + end case; + when others => + md_ctrl <= latch_md; + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + next_state <= fetch_state; + end case; + -- + -- ea holds the low byte of the absolute address + -- Move ea low byte into ea high byte + -- load new ea low byte to for absolute 16 bit address + -- advance the program counter + -- + when extended_state => -- fetch ea low byte + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + -- increment pc + pc_ctrl <= inc_pc; + -- fetch next effective address bytes + ea_ctrl <= fetch_next_ea; + addr_ctrl <= fetch_ad; + dout_ctrl <= md_lo_dout; + -- work out the next state + case op_code(7 downto 4) is + when "0111" => -- single op extended + md_ctrl <= latch_md; + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + case op_code(3 downto 0) is + when "1011" => -- undefined + next_state <= fetch_state; + when "1110" => -- jmp + next_state <= jmp_state; + when others => + next_state <= read8_state; + end case; + when "1011" => -- acca extended + case op_code(3 downto 0) is + when "0111" => -- staa + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1101" => -- jsr + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= jsr_state; + when "1111" => -- sts + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= read8_state; + end case; + when "1111" => -- accb extended + case op_code(3 downto 0) is + when "0111" => -- stab + left_ctrl <= accb_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1101" => -- std + left_ctrl <= accd_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when "1111" => -- stx + left_ctrl <= ix_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= read8_state; + end case; + when others => + md_ctrl <= latch_md; + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + next_state <= fetch_state; + end case; + -- + -- here if ea holds low byte (direct page) + -- can enter here from extended addressing + -- read memory location + -- note that reads may be 8 or 16 bits + -- + when read8_state => -- read data + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + -- + addr_ctrl <= read_ad; + dout_ctrl <= md_lo_dout; + case op_code(7 downto 4) is + when "0110" | "0111" => -- single operand + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + ea_ctrl <= latch_ea; + next_state <= execute_state; + + when "1001" | "1010" | "1011" => -- acca + case op_code(3 downto 0) is + when "0011" | -- subd + "1110" | -- lds + "1100" => -- cpx + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + -- increment the effective address in case of 16 bit load + ea_ctrl <= inc_ea; + next_state <= read16_state; +-- when "0111" => -- staa +-- left_ctrl <= acca_left; +-- right_ctrl <= zero_right; +-- alu_ctrl <= alu_st8; +-- cc_ctrl <= latch_cc; +-- md_ctrl <= load_md; +-- ea_ctrl <= latch_ea; +-- next_state <= write8_state; +-- when "1101" => -- jsr +-- left_ctrl <= acca_left; +-- right_ctrl <= zero_right; +-- alu_ctrl <= alu_nop; +-- cc_ctrl <= latch_cc; +-- md_ctrl <= latch_md; +-- ea_ctrl <= latch_ea; +-- next_state <= jsr_state; +-- when "1111" => -- sts +-- left_ctrl <= sp_left; +-- right_ctrl <= zero_right; +-- alu_ctrl <= alu_st16; +-- cc_ctrl <= latch_cc; +-- md_ctrl <= load_md; +-- ea_ctrl <= latch_ea; +-- next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + ea_ctrl <= latch_ea; + next_state <= fetch_state; + end case; + + when "1101" | "1110" | "1111" => -- accb + case op_code(3 downto 0) is + when "0011" | -- addd + "1100" | -- ldd + "1110" => -- ldx + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + -- increment the effective address in case of 16 bit load + ea_ctrl <= inc_ea; + next_state <= read16_state; +-- when "0111" => -- stab +-- left_ctrl <= accb_left; +-- right_ctrl <= zero_right; +-- alu_ctrl <= alu_st8; +-- cc_ctrl <= latch_cc; +-- md_ctrl <= load_md; +-- ea_ctrl <= latch_ea; +-- next_state <= write8_state; +-- when "1101" => -- std +-- left_ctrl <= accd_left; +-- right_ctrl <= zero_right; +-- alu_ctrl <= alu_st16; +-- cc_ctrl <= latch_cc; +-- md_ctrl <= load_md; +-- ea_ctrl <= latch_ea; +-- next_state <= write16_state; +-- when "1111" => -- stx +-- left_ctrl <= ix_left; +-- right_ctrl <= zero_right; +-- alu_ctrl <= alu_st16; +-- cc_ctrl <= latch_cc; +-- md_ctrl <= load_md; +-- ea_ctrl <= latch_ea; +-- next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + ea_ctrl <= latch_ea; + next_state <= execute_state; + end case; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + ea_ctrl <= latch_ea; + next_state <= fetch_state; + end case; + + when read16_state => -- read second data byte from ea + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- idle the effective address + ea_ctrl <= latch_ea; + -- read the low byte of the 16 bit data + md_ctrl <= fetch_next_md; + addr_ctrl <= read_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + -- + -- 16 bit Write state + -- write high byte of ALU output. + -- EA hold address of memory to write to + -- Advance the effective address in ALU + -- + when write16_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + -- increment the effective address + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ea_ctrl <= inc_ea; + -- write the ALU hi byte to ea + addr_ctrl <= write_ad; + dout_ctrl <= md_hi_dout; + next_state <= write8_state; + -- + -- 8 bit write + -- Write low 8 bits of ALU output + -- + when write8_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- idle the ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- write ALU low byte output + addr_ctrl <= write_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + + when jmp_state => + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- load PC with effective address + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= load_ea_pc; + -- idle the bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + + when jsr_state => -- JSR + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write pc low + addr_ctrl <= push_ad; + dout_ctrl <= pc_lo_dout; + next_state <= jsr1_state; + + when jsr1_state => -- JSR + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write pc hi + addr_ctrl <= push_ad; + dout_ctrl <= pc_hi_dout; + next_state <= jmp_state; + + when branch_state => -- Bcc + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- calculate signed branch + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= add_ea_pc; + -- idle the bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + + when bsr_state => -- BSR + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write pc low + addr_ctrl <= push_ad; + dout_ctrl <= pc_lo_dout; + next_state <= bsr1_state; + + when bsr1_state => -- BSR + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write pc hi + addr_ctrl <= push_ad; + dout_ctrl <= pc_hi_dout; + next_state <= branch_state; + + when rts_hi_state => -- RTS + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment the sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- read pc hi + pc_ctrl <= pull_hi_pc; + addr_ctrl <= pull_ad; + dout_ctrl <= pc_hi_dout; + next_state <= rts_lo_state; + + when rts_lo_state => -- RTS1 + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- idle the ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- read pc low + pc_ctrl <= pull_lo_pc; + addr_ctrl <= pull_ad; + dout_ctrl <= pc_lo_dout; + next_state <= fetch_state; + + when mul_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- move acca to md + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mulea_state; + + when mulea_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + md_ctrl <= latch_md; + -- idle ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- move accb to ea + ea_ctrl <= load_accb_ea; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= muld_state; + + when muld_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + md_ctrl <= latch_md; + -- clear accd + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_ld8; + cc_ctrl <= latch_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul0_state; + + when mul0_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 0 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(0) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul1_state; + + when mul1_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 1 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(1) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul2_state; + + when mul2_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 2 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(2) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul3_state; + + when mul3_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 3 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(3) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul4_state; + + when mul4_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 4 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(4) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul5_state; + + when mul5_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 5 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(5) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul6_state; + + when mul6_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 6 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(6) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul7_state; + + when mul7_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 7 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(7) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + + when execute_state => -- execute single operand instruction + -- default + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + case op_code(7 downto 4) is + when "0110" | -- indexed single op + "0111" => -- extended single op + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + ea_ctrl <= latch_ea; + -- idle the bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + left_ctrl <= md_left; + case op_code(3 downto 0) is + when "0000" => -- neg + right_ctrl <= zero_right; + alu_ctrl <= alu_neg; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "0011" => -- com + right_ctrl <= zero_right; + alu_ctrl <= alu_com; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "0100" => -- lsr + right_ctrl <= zero_right; + alu_ctrl <= alu_lsr8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "0110" => -- ror + right_ctrl <= zero_right; + alu_ctrl <= alu_ror8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "0111" => -- asr + right_ctrl <= zero_right; + alu_ctrl <= alu_asr8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1000" => -- asl + right_ctrl <= zero_right; + alu_ctrl <= alu_asl8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1001" => -- rol + right_ctrl <= zero_right; + alu_ctrl <= alu_rol8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1010" => -- dec + right_ctrl <= plus_one_right; + alu_ctrl <= alu_dec; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1011" => -- undefined + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= fetch_state; + when "1100" => -- inc + right_ctrl <= plus_one_right; + alu_ctrl <= alu_inc; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1101" => -- tst + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= load_cc; + md_ctrl <= latch_md; + next_state <= fetch_state; + when "1110" => -- jmp + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= fetch_state; + when "1111" => -- clr + right_ctrl <= zero_right; + alu_ctrl <= alu_clr; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when others => + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= fetch_state; + end case; + + when others => + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + ea_ctrl <= latch_ea; + -- idle the bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + end case; + + when psha_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write acca + addr_ctrl <= push_ad; + dout_ctrl <= acca_dout; + next_state <= fetch_state; + + when pula_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- idle sp + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + sp_ctrl <= latch_sp; + -- read acca + acca_ctrl <= pull_acca; + addr_ctrl <= pull_ad; + dout_ctrl <= acca_dout; + next_state <= fetch_state; + + when pshb_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write accb + addr_ctrl <= push_ad; + dout_ctrl <= accb_dout; + next_state <= fetch_state; + + when pulb_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- idle sp + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + sp_ctrl <= latch_sp; + -- read accb + accb_ctrl <= pull_accb; + addr_ctrl <= pull_ad; + dout_ctrl <= accb_dout; + next_state <= fetch_state; + + when pshx_lo_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write ix low + addr_ctrl <= push_ad; + dout_ctrl <= ix_lo_dout; + next_state <= pshx_hi_state; + + when pshx_hi_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write ix hi + addr_ctrl <= push_ad; + dout_ctrl <= ix_hi_dout; + next_state <= fetch_state; + + when pulx_hi_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- pull ix hi + ix_ctrl <= pull_hi_ix; + addr_ctrl <= pull_ad; + dout_ctrl <= ix_hi_dout; + next_state <= pulx_lo_state; + + when pulx_lo_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- idle sp + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + sp_ctrl <= latch_sp; + -- read ix low + ix_ctrl <= pull_lo_ix; + addr_ctrl <= pull_ad; + dout_ctrl <= ix_lo_dout; + next_state <= fetch_state; + + -- + -- return from interrupt + -- enter here from bogus interrupts + -- + when rti_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- idle address bus + cc_ctrl <= latch_cc; + addr_ctrl <= idle_ad; + dout_ctrl <= cc_dout; + next_state <= rti_cc_state; + + when rti_cc_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read cc + cc_ctrl <= pull_cc; + addr_ctrl <= pull_ad; + dout_ctrl <= cc_dout; + next_state <= rti_accb_state; + + when rti_accb_state => + -- default registers + acca_ctrl <= latch_acca; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- read accb + accb_ctrl <= pull_accb; + addr_ctrl <= pull_ad; + dout_ctrl <= accb_dout; + next_state <= rti_acca_state; + + when rti_acca_state => + -- default registers + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- read acca + acca_ctrl <= pull_acca; + addr_ctrl <= pull_ad; + dout_ctrl <= acca_dout; + next_state <= rti_ixh_state; + + when rti_ixh_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- read ix hi + ix_ctrl <= pull_hi_ix; + addr_ctrl <= pull_ad; + dout_ctrl <= ix_hi_dout; + next_state <= rti_ixl_state; + + when rti_ixl_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- read ix low + ix_ctrl <= pull_lo_ix; + addr_ctrl <= pull_ad; + dout_ctrl <= ix_lo_dout; + next_state <= rti_pch_state; + + when rti_pch_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- pull pc hi + pc_ctrl <= pull_hi_pc; + addr_ctrl <= pull_ad; + dout_ctrl <= pc_hi_dout; + next_state <= rti_pcl_state; + + when rti_pcl_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- idle sp + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + sp_ctrl <= latch_sp; + -- pull pc low + pc_ctrl <= pull_lo_pc; + addr_ctrl <= pull_ad; + dout_ctrl <= pc_lo_dout; + next_state <= fetch_state; + + -- + -- here on interrupt + -- iv register hold interrupt type + -- + when int_pcl_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write pc low + addr_ctrl <= push_ad; + dout_ctrl <= pc_lo_dout; + next_state <= int_pch_state; + + when int_pch_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write pc hi + addr_ctrl <= push_ad; + dout_ctrl <= pc_hi_dout; + next_state <= int_ixl_state; + + when int_ixl_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write ix low + addr_ctrl <= push_ad; + dout_ctrl <= ix_lo_dout; + next_state <= int_ixh_state; + + when int_ixh_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write ix hi + addr_ctrl <= push_ad; + dout_ctrl <= ix_hi_dout; + next_state <= int_acca_state; + + when int_acca_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write acca + addr_ctrl <= push_ad; + dout_ctrl <= acca_dout; + next_state <= int_accb_state; + + + when int_accb_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write accb + addr_ctrl <= push_ad; + dout_ctrl <= accb_dout; + next_state <= int_cc_state; + + when int_cc_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write cc + addr_ctrl <= push_ad; + dout_ctrl <= cc_dout; + nmi_ctrl <= latch_nmi; + -- + -- nmi is edge triggered + -- nmi_req is cleared when nmi goes low. + -- + if nmi_req = '1' then + iv_ctrl <= nmi_iv; + next_state <= vect_hi_state; + else + -- + -- IRQ is level sensitive + -- + if (irq = '1') and (cc(IBIT) = '0') then + iv_ctrl <= irq_iv; + next_state <= int_mask_state; + else + case op_code is + when "00111110" => -- WAI (wait for interrupt) + iv_ctrl <= latch_iv; + next_state <= int_wai_state; + when "00111111" => -- SWI (Software interrupt) + iv_ctrl <= swi_iv; + next_state <= vect_hi_state; + when others => -- bogus interrupt (return) + iv_ctrl <= latch_iv; + next_state <= rti_state; + end case; + end if; + end if; + + when int_wai_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + op_ctrl <= latch_op; + ea_ctrl <= latch_ea; + -- enable interrupts + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_cli; + cc_ctrl <= load_cc; + sp_ctrl <= latch_sp; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= cc_dout; + if (nmi_req = '1') and (nmi_ack='0') then + iv_ctrl <= nmi_iv; + nmi_ctrl <= set_nmi; + next_state <= vect_hi_state; + else + -- + -- nmi request is not cleared until nmi input goes low + -- + if (nmi_req = '0') and (nmi_ack='1') then + nmi_ctrl <= reset_nmi; + else + nmi_ctrl <= latch_nmi; + end if; + -- + -- IRQ is level sensitive + -- + if (irq = '1') and (cc(IBIT) = '0') then + iv_ctrl <= irq_iv; + next_state <= int_mask_state; + else + iv_ctrl <= latch_iv; + next_state <= int_wai_state; + end if; + end if; + + when int_mask_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- Mask IRQ + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_sei; + cc_ctrl <= load_cc; + sp_ctrl <= latch_sp; + -- idle bus cycle + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= vect_hi_state; + + when halt_state => -- halt CPU. + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- do nothing in ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- idle bus cycle + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + if halt = '1' then + next_state <= halt_state; + else + next_state <= fetch_state; + end if; + + when others => -- error state halt on undefine states + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- do nothing in ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- idle bus cycle + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= error_state; + end case; +end process; + +-------------------------------- +-- +-- state machine +-- +-------------------------------- + +change_state: process( clk, rst, state, hold ) +begin + if clk'event and clk = '0' then + if rst = '1' then + state <= reset_state; + elsif hold = '1' then + state <= state; + else + state <= next_state; + end if; + end if; +end process; + -- output + +end CPU_ARCH; + diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/dac.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/dac.vhd new file mode 100644 index 00000000..9685a6cc --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 12 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/dpram.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/dpram.vhd new file mode 100644 index 00000000..672d33d3 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/dpram.vhd @@ -0,0 +1,131 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY dpram IS + GENERIC + ( + init_file : string := ""; + --numwords_a : natural; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED"; + outdata_reg_b : string := "UNREGISTERED" + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock_a : IN STD_LOGIC ; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + wren_a : IN STD_LOGIC := '1'; + wren_b : IN STD_LOGIC := '1'; + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_reg_b : STRING; + clock_enable_input_a : STRING; + clock_enable_input_b : STRING; + clock_enable_output_a : STRING; + clock_enable_output_b : STRING; + indata_reg_b : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + numwords_b : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_aclr_b : STRING; + outdata_reg_a : STRING; + outdata_reg_b : STRING; + power_up_uninitialized : STRING; + read_during_write_mode_port_a : STRING; + read_during_write_mode_port_b : STRING; + widthad_a : NATURAL; + widthad_b : NATURAL; + width_a : NATURAL; + width_b : NATURAL; + width_byteena_a : NATURAL; + width_byteena_b : NATURAL; + wrcontrol_wraddress_reg_b : STRING + ); + PORT ( + wren_a : IN STD_LOGIC ; + clock0 : IN STD_LOGIC ; + wren_b : IN STD_LOGIC ; + clock1 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q_a <= sub_wire0(width_a-1 DOWNTO 0); + q_b <= sub_wire1(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "BYPASS", + clock_enable_input_b => "BYPASS", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + numwords_b => 2**widthad_a, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => outdata_reg_a, + outdata_reg_b => outdata_reg_a, + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => widthad_a, + widthad_b => widthad_a, + width_a => width_a, + width_b => width_a, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + wren_a => wren_a, + clock0 => clock_a, + wren_b => wren_b, + clock1 => clock_b, + address_a => address_a, + address_b => address_b, + data_a => data_a, + data_b => data_b, + q_a => sub_wire0, + q_b => sub_wire1 + ); + + + +END SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/dprom_2r.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/dprom_2r.vhd new file mode 100644 index 00000000..a17e0e58 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/dprom_2r.vhd @@ -0,0 +1,135 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY dprom_2r IS + GENERIC + ( + INIT_FILE : string := ""; + --NUMWORDS_A : natural; + WIDTHAD_A : natural; + WIDTH_A : natural := 8; + --NUMWORDS_B : natural; + WIDTHAD_B : natural; + WIDTH_B : natural := 8; + outdata_reg_a : string := "UNREGISTERED"; + outdata_reg_b : string := "UNREGISTERED" + ); + PORT + ( + address_a : in std_logic_vector (WIDTHAD_A-1 downto 0); + address_b : in std_logic_vector (WIDTHAD_B-1 downto 0); + clock : in std_logic ; + q_a : out std_logic_vector (WIDTH_A-1 downto 0); + q_b : out std_logic_vector (WIDTH_B-1 downto 0) + ); +END dprom_2r; + + +ARCHITECTURE SYN OF dprom_2r IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (WIDTH_A-1 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (WIDTH_B-1 DOWNTO 0); + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3_bv : BIT_VECTOR (WIDTH_A-1 DOWNTO 0); + SIGNAL sub_wire3 : STD_LOGIC_VECTOR (WIDTH_A-1 DOWNTO 0); + SIGNAL sub_wire4_bv : BIT_VECTOR (WIDTH_B-1 DOWNTO 0); + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (WIDTH_B-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_reg_b : STRING; + clock_enable_input_a : STRING; + clock_enable_input_b : STRING; + clock_enable_output_a : STRING; + clock_enable_output_b : STRING; + indata_reg_b : STRING; + init_file : STRING; + init_file_layout : STRING; + intended_device_family : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + numwords_b : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_aclr_b : STRING; + outdata_reg_a : STRING; + outdata_reg_b : STRING; + power_up_uninitialized : STRING; + ram_block_type : STRING; + widthad_a : NATURAL; + widthad_b : NATURAL; + width_a : NATURAL; + width_b : NATURAL; + width_byteena_a : NATURAL; + width_byteena_b : NATURAL; + wrcontrol_wraddress_reg_b : STRING + ); + PORT ( + wren_a : IN STD_LOGIC ; + wren_b : IN STD_LOGIC ; + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (WIDTHAD_A-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (WIDTHAD_B-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (WIDTH_A-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (WIDTH_B-1 DOWNTO 0); + data_a : IN STD_LOGIC_VECTOR (WIDTH_A-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (WIDTH_B-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire2 <= '0'; + sub_wire3_bv(WIDTH_A-1 DOWNTO 0) <= (others => '0'); + sub_wire3 <= To_stdlogicvector(sub_wire3_bv); + sub_wire4_bv(WIDTH_B-1 DOWNTO 0) <= (others => '0'); + sub_wire4 <= To_stdlogicvector(sub_wire4_bv); + q_a <= sub_wire0(WIDTH_A-1 DOWNTO 0); + q_b <= sub_wire1(WIDTH_B-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK0", + clock_enable_input_a => "BYPASS", + clock_enable_input_b => "BYPASS", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK0", + init_file => INIT_FILE, + init_file_layout => "PORT_A", + intended_device_family => "Cyclone III", + lpm_type => "altsyncram", + numwords_a => 2**WIDTHAD_A, + numwords_b => 2**WIDTHAD_B, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => outdata_reg_a, + outdata_reg_b => outdata_reg_b, + power_up_uninitialized => "FALSE", + ram_block_type => "M9K", + widthad_a => WIDTHAD_A, + widthad_b => WIDTHAD_B, + width_a => WIDTH_A, + width_b => WIDTH_B, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK0" + ) + PORT MAP ( + wren_a => sub_wire2, + wren_b => sub_wire2, + clock0 => clock, + address_a => address_a, + address_b => address_b, + data_a => sub_wire3, + data_b => sub_wire4, + q_a => sub_wire0, + q_b => sub_wire1 + ); + +END SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/gen_ram.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/gen_ram.vhd new file mode 100644 index 00000000..f1a95608 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/gen_ram.vhd @@ -0,0 +1,84 @@ +-- ----------------------------------------------------------------------- +-- +-- Syntiac's generic VHDL support files. +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- +-- Modified April 2016 by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +-- Remove address register when writing +-- +-- ----------------------------------------------------------------------- +-- +-- gen_rwram.vhd +-- +-- ----------------------------------------------------------------------- +-- +-- generic ram. +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity gen_ram is + generic ( + dWidth : integer := 8; + aWidth : integer := 10 + ); + port ( + clk : in std_logic; + we : in std_logic; + addr : in std_logic_vector((aWidth-1) downto 0); + d : in std_logic_vector((dWidth-1) downto 0); + q : out std_logic_vector((dWidth-1) downto 0) + ); +end entity; + +-- ----------------------------------------------------------------------- + +architecture rtl of gen_ram is + subtype addressRange is integer range 0 to ((2**aWidth)-1); + type ramDef is array(addressRange) of std_logic_vector((dWidth-1) downto 0); + signal ram: ramDef; + + signal rAddrReg : std_logic_vector((aWidth-1) downto 0); + signal qReg : std_logic_vector((dWidth-1) downto 0); +begin +-- ----------------------------------------------------------------------- +-- Signals to entity interface +-- ----------------------------------------------------------------------- +-- q <= qReg; + +-- ----------------------------------------------------------------------- +-- Memory write +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if we = '1' then + ram(to_integer(unsigned(addr))) <= d; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Memory read +-- ----------------------------------------------------------------------- +process(clk) + begin + if rising_edge(clk) then +-- qReg <= ram(to_integer(unsigned(rAddrReg))); +-- rAddrReg <= addr; +---- qReg <= ram(to_integer(unsigned(addr))); + q <= ram(to_integer(unsigned(addr))); + end if; + end process; +--q <= ram(to_integer(unsigned(addr))); +end architecture; + diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/hq2x.sv b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/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/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/i82c55.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/i82c55.vhd new file mode 100644 index 00000000..3cce30d1 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/i82c55.vhd @@ -0,0 +1,686 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- + +library ieee ; + use ieee.std_logic_1164.all ; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity I82C55 is + port ( + + I_ADDR : in std_logic_vector(1 downto 0); -- A1-A0 + I_DATA : in std_logic_vector(7 downto 0); -- D7-D0 + O_DATA : out std_logic_vector(7 downto 0); + O_DATA_OE_L : out std_logic; + + I_CS_L : in std_logic; + I_RD_L : in std_logic; + I_WR_L : in std_logic; + + I_PA : in std_logic_vector(7 downto 0); + O_PA : out std_logic_vector(7 downto 0); + O_PA_OE_L : out std_logic_vector(7 downto 0); + + I_PB : in std_logic_vector(7 downto 0); + O_PB : out std_logic_vector(7 downto 0); + O_PB_OE_L : out std_logic_vector(7 downto 0); + + I_PC : in std_logic_vector(7 downto 0); + O_PC : out std_logic_vector(7 downto 0); + O_PC_OE_L : out std_logic_vector(7 downto 0); + + RESET : in std_logic; + ENA : in std_logic; -- (CPU) clk enable + CLK : in std_logic + ); +end; + +architecture RTL of I82C55 is + + -- registers + signal bit_mask : std_logic_vector(7 downto 0); + signal r_porta : std_logic_vector(7 downto 0); + signal r_portb : std_logic_vector(7 downto 0); + signal r_portc : std_logic_vector(7 downto 0); + signal r_control : std_logic_vector(7 downto 0); + -- + signal porta_we : std_logic; + signal portb_we : std_logic; + signal porta_re : std_logic; + signal portb_re : std_logic; + -- + signal porta_we_t1 : std_logic; + signal portb_we_t1 : std_logic; + signal porta_re_t1 : std_logic; + signal portb_re_t1 : std_logic; + -- + signal porta_we_rising : boolean; + signal portb_we_rising : boolean; + signal porta_re_rising : boolean; + signal portb_re_rising : boolean; + -- + signal groupa_mode : std_logic_vector(1 downto 0); -- port a/c upper + signal groupb_mode : std_logic; -- port b/c lower + -- + signal porta_read : std_logic_vector(7 downto 0); + signal portb_read : std_logic_vector(7 downto 0); + signal portc_read : std_logic_vector(7 downto 0); + signal control_read : std_logic_vector(7 downto 0); + signal mode_clear : std_logic; + -- + signal a_inte1 : std_logic; + signal a_inte2 : std_logic; + signal b_inte : std_logic; + -- + signal a_intr : std_logic; + signal a_obf_l : std_logic; + signal a_ibf : std_logic; + signal a_ack_l : std_logic; + signal a_stb_l : std_logic; + signal a_ack_l_t1 : std_logic; + signal a_stb_l_t1 : std_logic; + -- + signal b_intr : std_logic; + signal b_obf_l : std_logic; + signal b_ibf : std_logic; + signal b_ack_l : std_logic; + signal b_stb_l : std_logic; + signal b_ack_l_t1 : std_logic; + signal b_stb_l_t1 : std_logic; + -- + signal a_ack_l_rising : boolean; + signal a_stb_l_rising : boolean; + signal b_ack_l_rising : boolean; + signal b_stb_l_rising : boolean; + -- + signal porta_ipreg : std_logic_vector(7 downto 0); + signal portb_ipreg : std_logic_vector(7 downto 0); +begin + -- + -- mode 0 - basic input/output + -- mode 1 - strobed input/output + -- mode 2/3 - bi-directional bus + -- + -- control word (write) + -- + -- D7 mode set flag 1 = active + -- D6..5 GROUPA mode selection (mode 0,1,2) + -- D4 GROUPA porta 1 = input, 0 = output + -- D3 GROUPA portc upper 1 = input, 0 = output + -- D2 GROUPB mode selection (mode 0 ,1) + -- D1 GROUPB portb 1 = input, 0 = output + -- D0 GROUPB portc lower 1 = input, 0 = output + -- + -- D7 bit set/reset 0 = active + -- D6..4 x + -- D3..1 bit select + -- d0 1 = set, 0 - reset + -- + -- all output registers including status are reset when mode is changed + --1. Port A: + --All Modes: Output data is cleared, input data is not cleared. + + --2. Port B: + --Mode 0: Output data is cleared, input data is not cleared. + --Mode 1 and 2: Both output and input data are cleared. + + --3. Port C: + --Mode 0:Output data is cleared, input data is not cleared. + --Mode 1 and 2: IBF and INTR are cleared and OBF# is set. + --Outputs in Port C which are not used for handshaking or interrupt signals are cleared. + --Inputs such as STB#, ACK#, or "spare" inputs are not affected. The interrupts for Ports A and B are disabled. + + p_bit_mask : process(I_DATA) + begin + bit_mask <= x"01"; + case I_DATA(3 downto 1) is + when "000" => bit_mask <= x"01"; + when "001" => bit_mask <= x"02"; + when "010" => bit_mask <= x"04"; + when "011" => bit_mask <= x"08"; + when "100" => bit_mask <= x"10"; + when "101" => bit_mask <= x"20"; + when "110" => bit_mask <= x"40"; + when "111" => bit_mask <= x"80"; + when others => null; + end case; + end process; + + p_write_reg_reset : process(RESET, CLK) + variable r_portc_masked : std_logic_vector(7 downto 0); + variable r_portc_setclr : std_logic_vector(7 downto 0); + begin + if (RESET = '1') then + r_porta <= x"00"; + r_portb <= x"00"; + r_portc <= x"00"; + r_control <= x"9B"; -- 10011011 + mode_clear <= '1'; + elsif rising_edge(CLK) then + + r_portc_masked := (not bit_mask) and r_portc; + for i in 0 to 7 loop + r_portc_setclr(i) := bit_mask(i) and I_DATA(0); + end loop; + + if (ENA = '1') then + mode_clear <= '0'; + if (I_CS_L = '0') and (I_WR_L = '0') then + case I_ADDR is + when "00" => r_porta <= I_DATA; + when "01" => r_portb <= I_DATA; + when "10" => r_portc <= I_DATA; + + when "11" => if (I_DATA(7) = '0') then -- set/clr + r_portc <= r_portc_masked or r_portc_setclr; + else + --mode_clear <= '1'; + --r_porta <= x"00"; + --r_portb <= x"00"; -- clear port b input reg + --r_portc <= x"00"; -- clear control sigs + r_control <= I_DATA; -- load new mode + end if; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_decode_control : process(r_control) + begin + groupa_mode <= r_control(6 downto 5); + groupb_mode <= r_control(2); + end process; + + p_oe : process(I_CS_L, I_RD_L) + begin + O_DATA_OE_L <= '1'; + if (I_CS_L = '0') and (I_RD_L = '0') then + O_DATA_OE_L <= '0'; + end if; + end process; + + p_read : process(I_ADDR, porta_read, portb_read, portc_read, control_read) + begin + O_DATA <= x"00"; -- default + --if (I_CS_L = '0') and (I_RD_L = '0') then -- not required + case I_ADDR is + when "00" => O_DATA <= porta_read; + when "01" => O_DATA <= portb_read; + when "10" => O_DATA <= portc_read; + when "11" => O_DATA <= control_read; + when others => null; + end case; + --end if; + end process; + control_read(7) <= '1'; -- always 1 + control_read(6 downto 0) <= r_control(6 downto 0); + + p_rw_control : process(I_CS_L, I_RD_L, I_WR_L, I_ADDR) + begin + porta_we <= '0'; + portb_we <= '0'; + porta_re <= '0'; + portb_re <= '0'; + + if (I_CS_L = '0') and (I_ADDR = "00") then + porta_we <= not I_WR_L; + porta_re <= not I_RD_L; + end if; + + if (I_CS_L = '0') and (I_ADDR = "01") then + portb_we <= not I_WR_L; + portb_re <= not I_RD_L; + end if; + end process; + + p_rw_control_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + porta_we_t1 <= porta_we; + portb_we_t1 <= portb_we; + porta_re_t1 <= porta_re; + portb_re_t1 <= portb_re; + + a_stb_l_t1 <= a_stb_l; + a_ack_l_t1 <= a_ack_l; + b_stb_l_t1 <= b_stb_l; + b_ack_l_t1 <= b_ack_l; + end if; + end process; + + porta_we_rising <= (porta_we = '0') and (porta_we_t1 = '1'); -- falling as inverted + portb_we_rising <= (portb_we = '0') and (portb_we_t1 = '1'); -- " + porta_re_rising <= (porta_re = '0') and (porta_re_t1 = '1'); -- falling as inverted + portb_re_rising <= (portb_re = '0') and (portb_re_t1 = '1'); -- " + -- + a_stb_l_rising <= (a_stb_l = '1') and (a_stb_l_t1 = '0'); + a_ack_l_rising <= (a_ack_l = '1') and (a_ack_l_t1 = '0'); + b_stb_l_rising <= (b_stb_l = '1') and (b_stb_l_t1 = '0'); + b_ack_l_rising <= (b_ack_l = '1') and (b_ack_l_t1 = '0'); + -- + -- GROUP A + -- in mode 1 + -- + -- d4=1 (porta = input) + -- pc7,6 io (d3=1 input, d3=0 output) + -- pc5 output a_ibf + -- pc4 input a_stb_l + -- pc3 output a_intr + -- + -- d4=0 (porta = output) + -- pc7 output a_obf_l + -- pc6 input a_ack_l + -- pc5,4 io (d3=1 input, d3=0 output) + -- pc3 output a_intr + -- + -- GROUP B + -- in mode 1 + -- d1=1 (portb = input) + -- pc2 input b_stb_l + -- pc1 output b_ibf + -- pc0 output b_intr + -- + -- d1=0 (portb = output) + -- pc2 input b_ack_l + -- pc1 output b_obf_l + -- pc0 output b_intr + + + -- WHEN AN INPUT + -- + -- stb_l a low on this input latches input data + -- ibf a high on this output indicates data latched. set by stb_l and reset by rising edge of RD_L + -- intr a high on this output indicates interrupt. set by stb_l high, ibf high and inte high. reset by falling edge of RD_L + -- inte A controlled by bit/set PC4 + -- inte B controlled by bit/set PC2 + + -- WHEN AN OUTPUT + -- + -- obf_l output will go low when cpu has written data + -- ack_l input - a low on this clears obf_l + -- intr output set when ack_l is high, obf_l is high and inte is one. reset by falling edge of WR_L + -- inte A controlled by bit/set PC6 + -- inte B controlled by bit/set PC2 + + -- GROUP A + -- in mode 2 + -- + -- porta = IO + -- + -- control bits 2..0 still control groupb/c lower 2..0 + -- + -- + -- PC7 output a_obf + -- PC6 input a_ack_l + -- PC5 output a_ibf + -- PC4 input a_stb_l + -- PC3 is still interrupt out + p_control_flags : process(RESET, CLK) + variable we : boolean; + variable set1 : boolean; + variable set2 : boolean; + begin + if (RESET = '1') then + a_obf_l <= '1'; + a_inte1 <= '0'; + a_ibf <= '0'; + a_inte2 <= '0'; + a_intr <= '0'; + -- + b_inte <= '0'; + b_obf_l <= '1'; + b_ibf <= '0'; + b_intr <= '0'; + elsif rising_edge(CLK) then + we := (I_CS_L = '0') and (I_WR_L = '0') and (I_ADDR = "11") and (I_DATA(7) = '0'); + + if (ENA = '1') then + if (mode_clear = '1') then + a_obf_l <= '1'; + a_inte1 <= '0'; + a_ibf <= '0'; + a_inte2 <= '0'; + a_intr <= '0'; + -- + b_inte <= '0'; + b_obf_l <= '1'; + b_ibf <= '0'; + b_intr <= '0'; + else + if (bit_mask(7) = '1') and we then + a_obf_l <= I_DATA(0); + else + if porta_we_rising then + a_obf_l <= '0'; + elsif (a_ack_l = '0') then + a_obf_l <= '1'; + end if; + end if; + -- + if (bit_mask(6) = '1') and we then a_inte1 <= I_DATA(0); end if; -- bus set when mode1 & input? + -- + if (bit_mask(5) = '1') and we then + a_ibf <= I_DATA(0); + else + if porta_re_rising then + a_ibf <= '0'; + elsif (a_stb_l = '0') then + a_ibf <= '1'; + end if; + end if; + -- + if (bit_mask(4) = '1') and we then a_inte2 <= I_DATA(0); end if; -- bus set when mode1 & output? + -- + set1 := a_ack_l_rising and (a_obf_l = '1') and (a_inte1 = '1'); + set2 := a_stb_l_rising and (a_ibf = '1') and (a_inte2 = '1'); + -- + if (bit_mask(3) = '1') and we then + a_intr <= I_DATA(0); + else + if (groupa_mode(1) = '1') then + if (porta_we = '1') or (porta_re = '1') then + a_intr <= '0'; + elsif set1 or set2 then + a_intr <= '1'; + end if; + else + if (r_control(4) = '0') then -- output + if (porta_we = '1') then -- falling ? + a_intr <= '0'; + elsif set1 then + a_intr <= '1'; + end if; + elsif (r_control(4) = '1') then -- input + if (porta_re = '1') then -- falling ? + a_intr <= '0'; + elsif set2 then + a_intr <= '1'; + end if; + end if; + end if; + end if; + -- + if (bit_mask(2) = '1') and we then b_inte <= I_DATA(0); end if; -- bus set? + + if (bit_mask(1) = '1') and we then + b_obf_l <= I_DATA(0); + else + if (r_control(1) = '0') then -- output + if portb_we_rising then + b_obf_l <= '0'; + elsif (b_ack_l = '0') then + b_obf_l <= '1'; + end if; + else + if portb_re_rising then + b_ibf <= '0'; + elsif (b_stb_l = '0') then + b_ibf <= '1'; + end if; + end if; + end if; + + if (bit_mask(0) = '1') and we then + b_intr <= I_DATA(0); + else + if (r_control(1) = '0') then -- output + if (portb_we = '1') then -- falling ? + b_intr <= '0'; + elsif b_ack_l_rising and (b_obf_l = '1') and (b_inte = '1') then + b_intr <= '1'; + end if; + else + if (portb_re = '1') then -- falling ? + b_intr <= '0'; + elsif b_stb_l_rising and (b_ibf = '1') and (b_inte = '1') then + b_intr <= '1'; + end if; + end if; + end if; + + end if; + end if; + end if; + end process; + + p_porta : process(r_porta, r_control, groupa_mode, r_porta, I_PA, porta_ipreg, a_ack_l) + begin + -- D4 GROUPA porta 1 = input, 0 = output + O_PA <= x"FF"; -- if not driven, float high + O_PA_OE_L <= x"FF"; + porta_read <= x"00"; + + if (groupa_mode = "00") then -- simple io + if (r_control(4) = '0') then -- output + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= I_PA; + elsif (groupa_mode = "01") then -- strobed + if (r_control(4) = '0') then -- output + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= porta_ipreg; + else -- if (groupa_mode(1) = '1') then -- bi dir + if (a_ack_l = '0') then -- output enable + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= porta_ipreg; -- latched data + end if; + + end process; + + p_portb : process(r_portb, r_control, groupb_mode, r_portb, I_PB, portb_ipreg) + begin + O_PB <= x"FF"; -- if not driven, float high + O_PB_OE_L <= x"FF"; + portb_read <= x"00"; + + if (groupb_mode = '0') then -- simple io + if (r_control(1) = '0') then -- output + O_PB <= r_portb; + O_PB_OE_L <= x"00"; + end if; + portb_read <= I_PB; + else -- strobed mode + if (r_control(1) = '0') then -- output + O_PB <= r_portb; + O_PB_OE_L <= x"00"; + end if; + portb_read <= portb_ipreg; + end if; + end process; + + p_portc_out : process(r_portc, r_control, groupa_mode, groupb_mode, + a_obf_l, a_ibf, a_intr,b_obf_l, b_ibf, b_intr) + begin + O_PC <= x"FF"; -- if not driven, float high + O_PC_OE_L <= x"FF"; + + -- bits 7..4 + if (groupa_mode = "00") then -- simple io + if (r_control(3) = '0') then -- output + O_PC (7 downto 4) <= r_portc(7 downto 4); + O_PC_OE_L(7 downto 4) <= x"0"; + end if; + elsif (groupa_mode = "01") then -- mode1 + + if (r_control(4) = '0') then -- port a output + O_PC (7) <= a_obf_l; + O_PC_OE_L(7) <= '0'; + -- 6 is ack_l input + if (r_control(3) = '0') then -- port c output + O_PC (5 downto 4) <= r_portc(5 downto 4); + O_PC_OE_L(5 downto 4) <= "00"; + end if; + else -- port a input + if (r_control(3) = '0') then -- port c output + O_PC (7 downto 6) <= r_portc(7 downto 6); + O_PC_OE_L(7 downto 6) <= "00"; + end if; + O_PC (5) <= a_ibf; + O_PC_OE_L(5) <= '0'; + -- 4 is stb_l input + end if; + + else -- if (groupa_mode(1) = '1') then -- mode2 + O_PC (7) <= a_obf_l; + O_PC_OE_L(7) <= '0'; + -- 6 is ack_l input + O_PC (5) <= a_ibf; + O_PC_OE_L(5) <= '0'; + -- 4 is stb_l input + end if; + + -- bit 3 (controlled by group a) + if (groupa_mode = "00") then -- group a steals this bit + --if (groupb_mode = '0') then -- we will let bit 3 be driven, data sheet is a bit confused about this + if (r_control(0) = '0') then -- ouput (note, groupb control bit) + O_PC (3) <= r_portc(3); + O_PC_OE_L(3) <= '0'; + end if; + -- + else -- stolen + O_PC (3) <= a_intr; + O_PC_OE_L(3) <= '0'; + end if; + + -- bits 2..0 + if (groupb_mode = '0') then -- simple io + if (r_control(0) = '0') then -- output + O_PC (2 downto 0) <= r_portc(2 downto 0); + O_PC_OE_L(2 downto 0) <= "000"; + end if; + else + -- mode 1 + -- 2 is input + if (r_control(1) = '0') then -- output + O_PC (1) <= b_obf_l; + O_PC_OE_L(1) <= '0'; + else -- input + O_PC (1) <= b_ibf; + O_PC_OE_L(1) <= '0'; + end if; + O_PC (0) <= b_intr; + O_PC_OE_L(0) <= '0'; + end if; + end process; + + p_portc_in : process(r_portc, I_PC, r_control, groupa_mode, groupb_mode, a_ibf, b_obf_l, + a_obf_l, a_inte1, a_inte2, a_intr, b_inte, b_ibf, b_intr) + begin + portc_read <= x"00"; + + a_stb_l <= '1'; + a_ack_l <= '1'; + b_stb_l <= '1'; + b_ack_l <= '1'; + + if (groupa_mode = "01") then -- mode1 or 2 + if (r_control(4) = '0') then -- port a output + a_ack_l <= I_PC(6); + else -- port a input + a_stb_l <= I_PC(4); + end if; + elsif (groupa_mode(1) = '1') then -- mode 2 + a_ack_l <= I_PC(6); + a_stb_l <= I_PC(4); + end if; + + if (groupb_mode = '1') then + if (r_control(1) = '0') then -- output + b_ack_l <= I_PC(2); + else -- input + b_stb_l <= I_PC(2); + end if; + end if; + + if (groupa_mode = "00") then -- simple io + portc_read(7 downto 3) <= I_PC(7 downto 3); + elsif (groupa_mode = "01") then + if (r_control(4) = '0') then -- port a output + portc_read(7 downto 3) <= a_obf_l & a_inte1 & I_PC(5 downto 4) & a_intr; + else -- input + portc_read(7 downto 3) <= I_PC(7 downto 6) & a_ibf & a_inte2 & a_intr; + end if; + else -- mode 2 + portc_read(7 downto 3) <= a_obf_l & a_inte1 & a_ibf & a_inte2 & a_intr; + end if; + + if (groupb_mode = '0') then -- simple io + portc_read(2 downto 0) <= I_PC(2 downto 0); + else + if (r_control(1) = '0') then -- output + portc_read(2 downto 0) <= b_inte & b_obf_l & b_intr; + else -- input + portc_read(2 downto 0) <= b_inte & b_ibf & b_intr; + end if; + end if; + end process; + + p_ipreg : process + begin + wait until rising_edge(CLK); + -- pc4 input a_stb_l + -- pc2 input b_stb_l + + if (ENA = '1') then + if (a_stb_l = '0') then + porta_ipreg <= I_PA; + end if; + + if (mode_clear = '1') then + portb_ipreg <= (others => '0'); + elsif (b_stb_l = '0') then + portb_ipreg <= I_PB; + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/input_mapper.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/input_mapper.vhd new file mode 100644 index 00000000..bd898ba2 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/input_mapper.vhd @@ -0,0 +1,90 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.all; + +library work; +use work.pace_pkg.all; + +entity inputmapper is + generic + ( + NUM_DIPS : integer := 8; + NUM_INPUTS : integer := 2 + ); + port + ( + clk : in std_logic; + rst_n : in std_logic; + + -- inputs from keyboard controller + reset : in std_logic; + key_down : in std_logic; + key_up : in std_logic; + data : in std_logic_vector(7 downto 0); + -- inputs from jamma connector + jamma : in from_JAMMA_t; + + -- user outputs + dips : in std_logic_vector(NUM_DIPS-1 downto 0); + inputs : out from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1) + ); +end inputmapper; + +architecture SYN of inputmapper is + +begin + + process (clk, rst_n) + variable jamma_v : from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1); + variable keybd_v : from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1); + begin + + -- note: all inputs are active LOW + + if rst_n = '0' then + for i in 0 to NUM_INPUTS-1 loop + jamma_v(i).d := (others =>'1'); + keybd_v(i).d := (others =>'0'); + end loop; + + elsif rising_edge (clk) then + + -- handle JAMMA inputs + jamma_v(0).d(0) := jamma.p(1).start; + jamma_v(0).d(1) := jamma.p(2).start; + jamma_v(0).d(2) := jamma.service; + jamma_v(0).d(3) := jamma.coin(1) and jamma.p(1).button(3); + jamma_v(1).d(0) := jamma.p(1).right; + jamma_v(1).d(1) := jamma.p(1).left; + jamma_v(1).d(2) := jamma.p(1).down; + jamma_v(1).d(3) := jamma.p(1).up; + jamma_v(1).d(5) := jamma.p(1).button(2); + jamma_v(1).d(7) := jamma.p(1).button(1); + jamma_v(2).d(4) := jamma.coin(2); + + + -- this is PS/2 reset only + if (reset = '1') then + for i in 0 to NUM_INPUTS-2 loop + keybd_v(i).d := (others =>'1'); + end loop; + keybd_v(NUM_INPUTS-1).d := (others =>'0'); + end if; + end if; -- rising_edge (clk) + + -- assign outputs + inputs(0).d <= jamma_v(0).d and not keybd_v(0).d; + inputs(1).d <= jamma_v(1).d and not keybd_v(1).d; + inputs(2).d <= jamma_v(2).d and not keybd_v(2).d; + inputs(3).d <= "11111111"; -- 1C/1C, 10/30/50K, 3 lives + + inputs(4).d <= "11111100"; + -- activate service which is only checked on startup + -- inputs(4).d <= "01111100"; + inputs(NUM_INPUTS-1).d <= keybd_v(NUM_INPUTS-1).d; + + end process; + +end architecture SYN; + + diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/keyboard.v b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/keyboard.v new file mode 100644 index 00000000..d2e154b9 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/keyboard.v @@ -0,0 +1,80 @@ +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/mist_io.v b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/mist_io.v new file mode 100644 index 00000000..4e20d2a1 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/mist_io.v @@ -0,0 +1,504 @@ +// +// 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 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 scan_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 +); + +`include "src\build_id.v" + +localparam conf_str = { + "Moon Patr.;;", +// "O2,HQ2x,On,Off;",no effect + "O34,Scandoubler Fx,None,CRT 25%,CRT 50%,CRT 75%;", + "T5,Reset;", + "V,v1.11.",`BUILD_DATE +}; + +localparam STRLEN = ($size(conf_str)>>3); + + +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 scan_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/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/moon_patrol_sound_board.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/moon_patrol_sound_board.vhd new file mode 100644 index 00000000..11f5b5d7 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/moon_patrol_sound_board.vhd @@ -0,0 +1,419 @@ +--------------------------------------------------------------------------------- +-- Moon patrol sound board by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- gen_ram.vhd +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- cpu68 - Version 9th Jan 2004 0.8 +-- 6800/01 compatible CPU core +-- GNU public license - December 2002 : John E. Kent +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- Version 0.0 -- 24/11/2017 -- +-- initial version +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity moon_patrol_sound_board is +port( + clock_3p58 : in std_logic; + reset : in std_logic; + + select_sound : in std_logic_vector(7 downto 0); + audio_out : out std_logic_vector(11 downto 0); + + dbg_cpu_addr : out std_logic_vector(15 downto 0) +); +end moon_patrol_sound_board; + +architecture struct of moon_patrol_sound_board is + + signal reset_n : std_logic; + signal clock_div : std_logic_vector(3 downto 0); + + signal cpu_clock : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_rw : std_logic; + signal cpu_irq : std_logic; + signal cpu_nmi : std_logic; + + signal irqraz_cs : std_logic; + signal irqraz_we : std_logic; + + signal wram_cs : std_logic; + signal wram_we : std_logic; + signal wram_do : std_logic_vector( 7 downto 0); + + signal rom_cs : std_logic; + signal rom_do : std_logic_vector( 7 downto 0); + + signal ay1_do : std_logic_vector(7 downto 0); + signal ay1_audio : std_logic_vector(7 downto 0); + signal ay1_port_b_do : std_logic_vector(7 downto 0); + + signal ay2_do : std_logic_vector(7 downto 0); + signal ay2_audio : std_logic_vector(7 downto 0); + + signal ports_cs : std_logic; + signal ports_we : std_logic; + + signal port1_bus : std_logic_vector(7 downto 0); + signal port1_data : std_logic_vector(7 downto 0); + signal port1_ddr : std_logic_vector(7 downto 0); + signal port1_in : std_logic_vector(7 downto 0); + + signal port2_bus : std_logic_vector(7 downto 0); + signal port2_data : std_logic_vector(7 downto 0); + signal port2_ddr : std_logic_vector(7 downto 0); + signal port2_in : std_logic_vector(7 downto 0); + + signal adpcm_cs : std_logic; + signal adpcm_we : std_logic; + signal adpcm_0_di : std_logic_vector(3 downto 0); + + signal select_sound_7r : std_logic; + + signal audio : std_logic_vector(12 downto 0); + + type t_step_size is array(0 to 48) of integer range 0 to 1552; + constant step_size : t_step_size := ( + 16, 17, 19, 21, 23, 25, 28, 31, + 34, 37, 41, 45, 50, 55, 60, 66, + 73, 80, 88, 97, 107, 118, 130, 143, + 157, 173, 190, 209, 230, 253, 279, 307, + 337, 371, 408, 449, 494, 544, 598, 658, + 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552); + + type t_delta_step is array(0 to 7) of integer range -1 to 8; + constant delta_step : t_delta_step := (-1,-1,-1,-1,2,4,6,8); + + signal adpcm_vclk : std_logic := '0'; + signal adpcm_signal : integer range -16384 to 16383 := 0; + +-- adpcm algorithm (4bits) [no pcm here] +-- +-- val : input value 3bits (0 - 7 : b2b1b0) +-- sign : input value sign (4th bit : 0=>sign=1 ,1=>sign=-1) +-- +-- step : internal data, init = 0 +-- signal : output value, init = 0; +-- +-- for each new val (and sign) : +-- | +-- | step_size = 16*1.1^(step) +-- | delta = sign * (step_size/8 + step_size/4*b0 + step_size/2*b1 + step_size*b2) +-- | signal = signal + delta +-- | step = step + delta_step(val) +-- | +-- | signal is then limited between -2048..2047 +-- | step is then limited between 0..48 + +begin + +reset_n <= not reset; + +dbg_cpu_addr <= cpu_addr; + +-- clock divider +process (reset, clock_3p58) +begin + if reset='1' then + clock_div <= (others => '0'); + else + if rising_edge(clock_3p58) then + clock_div <= clock_div + '1'; + end if; + end if; +end process; + +-- cpu_clock is 3.58/4 +cpu_clock <= clock_div(1); + +-- cs +wram_cs <= '1' when cpu_addr(15 downto 7) = X"00"&'1' else '0'; -- 0080-00FF +ports_cs <= '1' when cpu_addr(15 downto 4) = X"000" else '0'; -- 0000-000F +adpcm_cs <= '1' when cpu_addr(14 downto 11) = "0001" else '0'; -- 0800-0FFF / 8800-8FFF +irqraz_cs <= '1' when cpu_addr(14 downto 12) = "001" else '0'; -- 1000-1FFF / 9000-9FFF +rom_cs <= '1' when cpu_addr(14 downto 12) = "111" else '0'; -- 7000-7FFF / F000-FFFF + +-- write enables +wram_we <= '1' when cpu_rw = '0' and cpu_clock = '1' and wram_cs = '1' else '0'; +ports_we <= '1' when cpu_rw = '0' and cpu_clock = '1' and ports_cs = '1' else '0'; +adpcm_we <= '1' when cpu_rw = '0' and cpu_clock = '1' and adpcm_cs = '1' else '0'; +irqraz_we <= '1' when cpu_rw = '0' and cpu_clock = '1' and irqraz_cs = '1' else '0'; + +-- mux cpu in data between roms/io/wram +cpu_di <= + wram_do when wram_cs = '1' else + port1_ddr when ports_cs = '1' and cpu_addr(3 downto 0) = X"0" else + port2_ddr when ports_cs = '1' and cpu_addr(3 downto 0) = X"1" else + port1_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"2" else + port2_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"3" else + rom_do when rom_cs = '1' else X"55"; + +-- irq to cpu +process (reset, clock_div(0)) + variable select_sound_7r : std_logic; +begin + if reset='1' then + cpu_irq <= '0'; + select_sound_7r := '0'; + else + if rising_edge(clock_div(0)) then + if select_sound_7r = '0' and select_sound(7) = '1' then + cpu_irq <= '1'; + end if; + if irqraz_we = '1' then + cpu_irq <= '0'; + end if; + select_sound_7r := select_sound(7); + end if; + end if; +end process; + +-- cpu nmi +cpu_nmi <= adpcm_vclk; + +-- 6803 ports 1 and 2 (only) +process (reset, clock_div(0)) +begin + if reset='1' then + port1_ddr <= (others=>'0'); -- port1 set as input + port1_data <= (others=>'0'); -- port1 data set to 0 + port2_ddr <= ("11100000"); -- port2 bit 7 to 5 should always remain output to simulate mode data + port2_data <= ("01000000"); -- port2 data bit 7 to 5 set to 2 (for mode 2 at start up) + else + if rising_edge(clock_div(0)) then + if ports_cs = '1' and ports_we = '1' then + if cpu_addr(3 downto 0) = X"0" then port1_ddr <= cpu_do; end if; + if cpu_addr(3 downto 0) = X"1" then port2_ddr <= cpu_do and "11100000"; end if; + if cpu_addr(3 downto 0) = X"2" then port1_data <= cpu_do; end if; + if cpu_addr(3 downto 0) = X"3" then port2_data <= cpu_do; end if; + end if; + end if; + end if; +end process; + +port1_in <= (port1_bus and not(port1_ddr)) or (port1_data and port1_ddr); +port2_in <= (port2_bus and not(port2_ddr)) or (port2_data and port2_ddr); + +-- port1 bus mux +port1_bus <= ay1_do when port2_data(4) = '0' else + ay2_do when port2_data(3) = '0' else X"FF"; + +-- port2 bus +port2_bus <= X"FF"; + + +-- latch adpcm (msm5205) data in +process (reset, clock_div(0)) +begin + if reset='1' then + adpcm_0_di <= (others=>'0'); + else + if rising_edge(clock_div(0)) then + if adpcm_cs = '1' and adpcm_we = '1' then + if cpu_addr(1) = '0' then adpcm_0_di <= cpu_do(3 downto 0); end if; + end if; + end if; + end if; +end process; + +-- adcpm clocks and computation -- make 24kHz and vclk 8/6/4kHz +adpcm_clocks : process(clock_3p58, ay1_port_b_do) + variable clock_div_a : integer range 0 to 148 := 0; + variable clock_div_b : integer range 0 to 5 := 0; + variable step : integer range 0 to 48; + variable step_n : integer range -1 to 48+8; + variable sz : integer range 0 to 1552; + variable dn : integer range -32768 to 32767; + variable adpcm_signal_n : integer range -32768 to 32767; +begin + if rising_edge(clock_3p58) then + if clock_div_a = 148 then -- 24kHz + clock_div_a := 0; + + case ay1_port_b_do(3 downto 2) is + when "00" => if clock_div_b = 5 then clock_div_b := 0; else clock_div_b := clock_div_b +1; end if; -- 4kHz + when "01" => if clock_div_b = 2 then clock_div_b := 0; else clock_div_b := clock_div_b +1; end if; -- 8kHz + when "10" => if clock_div_b = 3 then clock_div_b := 0; else clock_div_b := clock_div_b +1; end if; -- 6kHz + when others => null; + end case; + + if clock_div_b = 0 then adpcm_vclk <= '1'; else adpcm_vclk <= '0'; end if; + else + clock_div_a := clock_div_a + 1; + end if; + + if ay1_port_b_do(0) = '1' then + step := 0; + adpcm_signal <= 0; + else + + if clock_div_b = 0 then + case clock_div_a is + + when 0 => -- it's time to get new nibble (adpcm_0_di) + + sz := step_size(step); + dn := sz/8; + if adpcm_0_di(0) = '1' then dn := dn + sz/4; end if; + if adpcm_0_di(1) = '1' then dn := dn + sz/2; end if; + if adpcm_0_di(2) = '1' then dn := dn + sz ; end if; + + if adpcm_0_di(3) = '1' then + dn := -dn; + end if; + + step_n := step + delta_step(to_integer(unsigned(adpcm_0_di(2 downto 0)))); + + when 4 => + + adpcm_signal_n := adpcm_signal + dn; + + if step_n > 48 then step := 48; else step := step_n; end if; + if step_n < 0 then step := 0; else step := step_n; end if; + + when 8 => + + if adpcm_signal_n > 2040 then adpcm_signal <= 2040; else adpcm_signal <= adpcm_signal_n; end if; + if adpcm_signal_n < -2040 then adpcm_signal <= -2040; else adpcm_signal <= adpcm_signal_n; end if; + + when others => null; + + end case; + end if; + + end if; + end if; +end process; + +-- audio mux +audio <= ("00000"&ay1_audio) + ("00000"&ay2_audio) + ('0'&std_logic_vector(to_unsigned((adpcm_signal)+2048,12))); +audio_out <= audio(12 downto 1); + +-- microprocessor 6800/01/03 +main_cpu : entity work.cpu68 +port map( + clk => cpu_clock,-- E clock input (falling edge) + rst => reset, -- reset input (active high) + rw => cpu_rw, -- read not write output + vma => open, -- valid memory address (active high) + address => cpu_addr, -- address bus output + data_in => cpu_di, -- data bus input + data_out => cpu_do, -- data bus output + hold => '0', -- hold input (active high) extend bus cycle + halt => '0', -- halt input (active high) grants DMA + irq => cpu_irq, -- interrupt request input (active high) + nmi => cpu_nmi, -- non maskable interrupt request input (active high) + test_alu => open, + test_cc => open +); + +-- cpu program rom +cpu_prog_rom : entity work.moon_patrol_sound_prog +port map( + clk => clock_div(0), -- 3p58/2 + addr => cpu_addr(11 downto 0), + data => rom_do +); + +cpu_ram : entity work.spram +generic map( widthad_a => 7) +port map( + clock => clock_div(0), -- 3p58/2 + address => cpu_addr(6 downto 0), + data => cpu_do, + wren => wram_we, + q => wram_do +); + +-- cpu wram +--cpu_ram : entity work.gen_ram +--generic map( width_a => 8, aWidth => 7) +--port map( +-- clk => clock_div(0), -- 3p58/2 +-- we => wram_we, +-- addr => cpu_addr(6 downto 0), +-- d => cpu_do, +-- q => wram_do +--); + +-- AY-3-8910 #1 +ay_3_8910_1 : entity work.YM2149 +port map( + -- data bus + I_DA => port1_data,-- in std_logic_vector(7 downto 0); + O_DA => ay1_do, -- out std_logic_vector(7 downto 0); + O_DA_OE_L => open, -- out std_logic; + -- control + I_A9_L => port2_data(4), -- in std_logic; + I_A8 => '1', -- in std_logic; + I_BDIR => port2_data(0), -- in std_logic; + I_BC2 => '1', -- in std_logic; + I_BC1 => port2_data(2), -- in std_logic; + I_SEL_L => '1', -- in std_logic; + + O_AUDIO => ay1_audio, -- out std_logic_vector(7 downto 0); +-- O_CHAN => ay1_audio_chan, -- out std_logic_vector(1 downto 0); + + -- port a + I_IOA => select_sound, -- in std_logic_vector(7 downto 0); + O_IOA => open, -- out std_logic_vector(7 downto 0); + O_IOA_OE_L => open, -- out std_logic; + -- port b + I_IOB => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOB => ay1_port_b_do, -- out std_logic_vector(7 downto 0); + O_IOB_OE_L => open, -- out std_logic; + + ENA => '1', --cpu_ena, -- in std_logic; -- clock enable for higher speed operation + RESET_L => reset_n, -- in std_logic; + CLK => cpu_clock -- in std_logic -- note 6 Mhz +); + +-- AY-3-8910 #2 +ay_3_8910_2 : entity work.YM2149 +port map( + -- data bus + I_DA => port1_data,-- in std_logic_vector(7 downto 0); + O_DA => ay2_do, -- out std_logic_vector(7 downto 0); + O_DA_OE_L => open, -- out std_logic; + -- control + I_A9_L => port2_data(3), -- in std_logic; + I_A8 => '1', -- in std_logic; + I_BDIR => port2_data(0), -- in std_logic; + I_BC2 => '1', -- in std_logic; + I_BC1 => port2_data(2), -- in std_logic; + I_SEL_L => '1', -- in std_logic; + + O_AUDIO => ay2_audio, -- out std_logic_vector(7 downto 0); +-- O_CHAN => ay2_audio_chan, -- out std_logic_vector(1 downto 0); + + -- port a + I_IOA => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOA => open, -- out std_logic_vector(7 downto 0); + O_IOA_OE_L => open, -- out std_logic; + -- port b + I_IOB => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOB => open, -- out std_logic_vector(7 downto 0); + O_IOB_OE_L => open, -- out std_logic; + + ENA => '1', --cpu_ena, -- in std_logic; -- clock enable for higher speed operation + RESET_L => reset_n, -- in std_logic; + CLK => cpu_clock -- in std_logic -- note 6 Mhz +); + + +end struct; \ No newline at end of file diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/moon_patrol_sound_prog.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/moon_patrol_sound_prog.vhd new file mode 100644 index 00000000..a9ee3564 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/moon_patrol_sound_prog.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity moon_patrol_sound_prog is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of moon_patrol_sound_prog is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"88",X"08",X"14",X"3F",X"8D",X"51",X"0C",X"24",X"E0",X"91",X"00",X"F9",X"3A",X"1A",X"80",X"C2", + X"F1",X"35",X"00",X"D1",X"59",X"88",X"89",X"D4",X"2B",X"B0",X"52",X"8D",X"84",X"A1",X"2B",X"84", + X"A9",X"03",X"F0",X"88",X"21",X"30",X"BF",X"02",X"B9",X"B3",X"40",X"42",X"1D",X"98",X"B2",X"0C", + X"8A",X"02",X"80",X"09",X"7F",X"91",X"12",X"88",X"23",X"23",X"98",X"D9",X"C3",X"42",X"3B",X"8E", + X"C2",X"00",X"0A",X"A1",X"9C",X"33",X"38",X"89",X"C7",X"8A",X"10",X"02",X"F9",X"12",X"81",X"22", + X"2A",X"9B",X"E9",X"B2",X"0F",X"19",X"B9",X"63",X"9A",X"20",X"A0",X"08",X"9A",X"88",X"2F",X"A4", + X"35",X"20",X"A8",X"83",X"40",X"AA",X"C9",X"89",X"8B",X"90",X"BD",X"92",X"35",X"18",X"C9",X"52", + X"33",X"29",X"03",X"38",X"9B",X"FD",X"82",X"AA",X"18",X"11",X"0B",X"F9",X"13",X"19",X"92",X"62", + X"3A",X"CB",X"D8",X"32",X"1A",X"AB",X"83",X"49",X"B4",X"39",X"B9",X"AD",X"CC",X"A2",X"72",X"89", + X"11",X"09",X"82",X"28",X"88",X"99",X"0E",X"05",X"21",X"89",X"BC",X"CA",X"02",X"99",X"80",X"2A", + X"EB",X"13",X"33",X"25",X"42",X"43",X"10",X"36",X"09",X"B9",X"CE",X"90",X"14",X"31",X"10",X"9D", + X"D9",X"80",X"99",X"B8",X"8A",X"AB",X"A8",X"9B",X"B2",X"76",X"34",X"22",X"18",X"09",X"BB",X"98", + X"33",X"1B",X"DA",X"89",X"92",X"0A",X"BA",X"BD",X"47",X"20",X"9B",X"E9",X"01",X"18",X"88",X"25", + X"41",X"32",X"33",X"52",X"CD",X"98",X"08",X"09",X"82",X"31",X"AF",X"99",X"90",X"89",X"9C",X"CB", + X"CA",X"00",X"A0",X"11",X"10",X"B8",X"44",X"64",X"23",X"10",X"9C",X"99",X"C9",X"01",X"20",X"05", + X"28",X"26",X"22",X"00",X"38",X"DB",X"B0",X"8A",X"A0",X"43",X"53",X"18",X"CD",X"D8",X"03",X"19", + X"AA",X"9A",X"A9",X"AC",X"B2",X"76",X"22",X"AA",X"99",X"9A",X"90",X"0C",X"CA",X"AB",X"99",X"37", + X"61",X"00",X"89",X"02",X"09",X"22",X"81",X"BD",X"CB",X"C9",X"05",X"54",X"20",X"08",X"99",X"A9", + X"22",X"18",X"01",X"18",X"AE",X"B9",X"04",X"48",X"BC",X"88",X"8A",X"EC",X"80",X"11",X"9A",X"99", + X"93",X"75",X"08",X"98",X"88",X"91",X"89",X"12",X"02",X"9A",X"DB",X"04",X"33",X"82",X"39",X"FA", + X"24",X"10",X"9A",X"DD",X"91",X"35",X"33",X"10",X"19",X"A1",X"99",X"AB",X"C3",X"77",X"1A",X"AB", + X"CC",X"90",X"08",X"AC",X"A0",X"23",X"33",X"22",X"05",X"31",X"31",X"13",X"09",X"BA",X"91",X"24", + X"10",X"2C",X"FC",X"DC",X"A8",X"99",X"99",X"88",X"BE",X"92",X"43",X"14",X"31",X"12",X"34",X"35", + X"31",X"13",X"42",X"AA",X"CC",X"BD",X"CA",X"BA",X"01",X"00",X"99",X"9B",X"A0",X"82",X"34",X"63", + X"20",X"81",X"17",X"52",X"00",X"8A",X"9A",X"03",X"32",X"8C",X"CB",X"CD",X"BC",X"AB",X"DA",X"8A", + X"04",X"53",X"21",X"8A",X"81",X"45",X"42",X"28",X"AD",X"BB",X"A9",X"82",X"62",X"21",X"21",X"88", + X"88",X"02",X"00",X"AD",X"AA",X"92",X"70",X"8A",X"CC",X"CB",X"BA",X"A8",X"37",X"42",X"00",X"8A", + X"99",X"AA",X"B8",X"02",X"11",X"0A",X"CA",X"13",X"23",X"75",X"41",X"08",X"99",X"82",X"54",X"32", + X"98",X"A9",X"9A",X"A9",X"9A",X"82",X"54",X"1D",X"EB",X"CB",X"99",X"03",X"53",X"10",X"99",X"89", + X"BC",X"92",X"10",X"33",X"65",X"20",X"99",X"AA",X"A1",X"00",X"32",X"1B",X"EE",X"BA",X"01",X"44", + X"32",X"80",X"13",X"36",X"89",X"A9",X"ED",X"B9",X"88",X"09",X"A0",X"31",X"18",X"07",X"31",X"14", + X"08",X"80",X"31",X"20",X"09",X"DB",X"98",X"89",X"DD",X"90",X"03",X"82",X"50",X"9C",X"A9",X"12", + X"9C",X"D8",X"88",X"34",X"83",X"63",X"32",X"12",X"08",X"32",X"AF",X"BB",X"FC",X"9A",X"CC",X"A0", + X"13",X"42",X"08",X"81",X"11",X"35",X"32",X"42",X"22",X"0C",X"CD",X"98",X"98",X"02",X"08",X"22", + X"2A",X"DA",X"8A",X"11",X"89",X"DC",X"99",X"B0",X"34",X"9D",X"C8",X"12",X"1A",X"EA",X"99",X"01", + X"00",X"9A",X"37",X"42",X"36",X"23",X"21",X"98",X"10",X"9A",X"CB",X"AB",X"B3",X"73",X"53",X"10", + X"AA",X"FA",X"01",X"28",X"AA",X"88",X"90",X"9E",X"DA",X"A0",X"98",X"AC",X"E9",X"82",X"11",X"10", + X"22",X"81",X"47",X"53",X"22",X"09",X"90",X"89",X"12",X"8C",X"FB",X"AA",X"98",X"9A",X"AB",X"90", + X"32",X"1B",X"D9",X"45",X"22",X"62",X"22",X"42",X"9C",X"BB",X"BB",X"99",X"02",X"45",X"34",X"23", + X"9B",X"B9",X"9C",X"BB",X"C8",X"02",X"63",X"39",X"91",X"44",X"30",X"01",X"48",X"BB",X"FC",X"BA", + X"CC",X"A8",X"10",X"11",X"11",X"89",X"11",X"9D",X"B8",X"03",X"74",X"34",X"20",X"88",X"01",X"23", + X"20",X"88",X"BF",X"B9",X"9A",X"01",X"08",X"AD",X"05",X"38",X"9B",X"DA",X"93",X"48",X"AB",X"AB", + X"8B",X"DB",X"99",X"82",X"37",X"29",X"CB",X"A0",X"41",X"53",X"23",X"48",X"12",X"22",X"DD",X"C9", + X"81",X"34",X"32",X"28",X"9A",X"98",X"39",X"D9",X"8B",X"83",X"53",X"0F",X"A9",X"9E",X"B9",X"8A", + X"88",X"88",X"25",X"12",X"32",X"BA",X"09",X"27",X"3A",X"9A",X"14",X"53",X"01",X"41",X"10",X"89", + X"DC",X"BB",X"83",X"52",X"9B",X"DC",X"90",X"10",X"10",X"13",X"12",X"11",X"25",X"40",X"00",X"C8", + X"8A",X"B1",X"18",X"BC",X"B4",X"34",X"09",X"9D",X"CC",X"BA",X"AC",X"82",X"26",X"32",X"89",X"BC", + X"DA",X"98",X"21",X"32",X"37",X"31",X"00",X"11",X"A9",X"01",X"8F",X"98",X"00",X"23",X"1A",X"A9", + X"34",X"03",X"53",X"43",X"32",X"AD",X"DB",X"CB",X"A9",X"BC",X"98",X"0B",X"00",X"61",X"24",X"20", + X"88",X"35",X"23",X"50",X"08",X"CD",X"B9",X"82",X"64",X"20",X"9A",X"BB",X"B9",X"9D",X"DB",X"90", + X"10",X"24",X"31",X"31",X"18",X"03",X"38",X"10",X"1A",X"1B",X"FD",X"CA",X"80",X"12",X"33",X"64", + X"20",X"9A",X"88",X"88",X"98",X"03",X"30",X"BE",X"90",X"09",X"98",X"40",X"0A",X"A4",X"53",X"19", + X"13",X"9C",X"FD",X"AA",X"A8",X"80",X"19",X"82",X"24",X"22",X"AD",X"90",X"56",X"20",X"99",X"20", + X"8B",X"BB",X"12",X"1B",X"85",X"30",X"EE",X"B9",X"02",X"42",X"12",X"15",X"22",X"20",X"88",X"11", + X"88",X"90",X"09",X"BF",X"BC",X"EA",X"A8",X"88",X"9A",X"90",X"09",X"00",X"11",X"32",X"36",X"08", + X"00",X"05",X"08",X"12",X"33",X"95",X"33",X"13",X"10",X"BC",X"EC",X"99",X"21",X"11",X"33",X"63", + X"31",X"00",X"AA",X"FC",X"AA",X"80",X"00",X"23",X"40",X"AC",X"B9",X"90",X"92",X"53",X"89",X"FA", + X"A0",X"02",X"8A",X"91",X"2B",X"DE",X"99",X"81",X"23",X"62",X"30",X"21",X"23",X"28",X"DC",X"BC", + X"81",X"10",X"99",X"08",X"14",X"72",X"20",X"9A",X"A9",X"99",X"BE",X"B9",X"24",X"18",X"AC",X"03", + X"10",X"AB",X"A9",X"02",X"34",X"35",X"42",X"00",X"08",X"88",X"29",X"9D",X"A0",X"53",X"2A",X"FB", + X"BB",X"01",X"00",X"8A",X"A8",X"01",X"90",X"00",X"A1",X"36",X"32",X"02",X"3A",X"AB",X"9C",X"BB", + X"89",X"8A",X"CC",X"AA",X"32",X"32",X"28",X"32",X"21",X"00",X"25",X"52",X"18",X"8A",X"AA",X"11", + X"28",X"08",X"20",X"32",X"AD",X"EB",X"A9",X"81",X"42",X"89",X"08",X"99",X"01",X"99",X"99",X"88", + X"80",X"0A",X"08",X"33",X"52",X"37",X"10",X"AB",X"D9",X"00",X"98",X"01",X"08",X"A8",X"03",X"42", + X"00",X"00",X"00",X"01",X"F0",X"00",X"04",X"00",X"F0",X"04",X"00",X"E0",X"F0",X"04",X"03",X"FC", + X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"01",X"F7",X"E1",X"F7",X"B9",X"F7",X"AB",X"F7",X"F1",X"F8",X"03",X"F4",X"F2", + X"F4",X"F5",X"F5",X"16",X"F5",X"6C",X"F4",X"A7",X"F4",X"A7",X"F4",X"64",X"F8",X"4D",X"F4",X"A8", + X"F8",X"EC",X"F9",X"5F",X"66",X"F8",X"48",X"10",X"49",X"10",X"4A",X"10",X"4B",X"00",X"4C",X"10", + X"20",X"EE",X"00",X"28",X"20",X"BD",X"00",X"28",X"20",X"9F",X"00",X"28",X"20",X"86",X"00",X"28", + X"27",X"07",X"28",X"66",X"F8",X"20",X"86",X"00",X"28",X"20",X"8E",X"00",X"28",X"20",X"9F",X"00", + X"28",X"20",X"0C",X"01",X"28",X"20",X"86",X"00",X"28",X"20",X"FD",X"00",X"28",X"20",X"7E",X"00", + X"28",X"20",X"EE",X"00",X"A0",X"67",X"07",X"FF",X"66",X"F8",X"48",X"10",X"49",X"10",X"4A",X"10", + X"4B",X"00",X"4C",X"10",X"FE",X"F4",X"CD",X"20",X"77",X"00",X"24",X"20",X"7E",X"00",X"24",X"20", + X"9F",X"00",X"24",X"FE",X"F4",X"CD",X"20",X"EE",X"00",X"60",X"67",X"07",X"FF",X"20",X"EE",X"00", + X"24",X"20",X"9F",X"00",X"24",X"20",X"77",X"00",X"24",X"20",X"B3",X"00",X"24",X"20",X"8E",X"00", + X"24",X"20",X"77",X"00",X"24",X"20",X"9F",X"00",X"24",X"20",X"7E",X"00",X"24",X"20",X"6A",X"00", + X"24",X"FD",X"67",X"01",X"FF",X"66",X"FE",X"48",X"0F",X"41",X"02",X"00",X"CE",X"24",X"00",X"A7", + X"24",X"00",X"7D",X"24",X"00",X"A7",X"24",X"00",X"58",X"24",X"00",X"A7",X"24",X"00",X"7D",X"24", + X"00",X"A7",X"24",X"FE",X"F4",X"FB",X"66",X"FE",X"41",X"00",X"48",X"0D",X"C0",X"10",X"30",X"01", + X"06",X"48",X"0D",X"C0",X"18",X"40",X"01",X"04",X"C0",X"14",X"58",X"FF",X"04",X"48",X"0C",X"C0", + X"18",X"44",X"01",X"04",X"C0",X"14",X"5C",X"FF",X"04",X"48",X"0B",X"C0",X"18",X"48",X"01",X"04", + X"C0",X"14",X"60",X"FF",X"04",X"48",X"0A",X"C0",X"14",X"4C",X"01",X"04",X"C0",X"18",X"60",X"FF", + X"04",X"48",X"0B",X"C0",X"14",X"48",X"01",X"04",X"C0",X"18",X"5C",X"FF",X"04",X"48",X"0C",X"C0", + X"14",X"44",X"01",X"04",X"C0",X"18",X"58",X"FF",X"04",X"FE",X"F5",X"21",X"6D",X"10",X"46",X"00", + X"4B",X"00",X"4C",X"02",X"4A",X"10",X"66",X"DD",X"FE",X"F5",X"9F",X"FE",X"F5",X"F4",X"FE",X"F5", + X"9F",X"FE",X"F5",X"F4",X"FE",X"F6",X"A2",X"FE",X"F6",X"F9",X"FE",X"F5",X"9F",X"FE",X"F5",X"F4", + X"FE",X"F7",X"54",X"FE",X"F6",X"A2",X"FE",X"F5",X"9F",X"FE",X"F6",X"4B",X"FE",X"F5",X"6C",X"42", + X"A7",X"43",X"02",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09",X"20", + X"0D",X"09",X"20",X"42",X"51",X"43",X"01",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"69", + X"0E",X"0D",X"09",X"20",X"42",X"7A",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"69",X"0E", + X"0D",X"09",X"20",X"42",X"C1",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"42",X"7A",X"69", + X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"42",X"51",X"43",X"01",X"69",X"0E",X"0D",X"09",X"20", + X"0D",X"09",X"20",X"FD",X"42",X"A7",X"43",X"02",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20", + X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"42",X"51",X"43",X"01",X"69",X"0E",X"0D",X"09", + X"20",X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"42",X"7A",X"69",X"0E",X"0D",X"09",X"20", + X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"42",X"C1",X"69",X"0E",X"0D",X"09",X"20",X"0D", + X"09",X"20",X"42",X"FC",X"69",X"0E",X"0D",X"09",X"20",X"42",X"DD",X"69",X"0E",X"0D",X"09",X"20", + X"42",X"C1",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"FD",X"42",X"A7",X"43",X"02",X"69", + X"0E",X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09", + X"20",X"42",X"16",X"69",X"0E",X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20", + X"69",X"0E",X"0D",X"09",X"20",X"42",X"FC",X"43",X"01",X"69",X"0E",X"0D",X"09",X"20",X"69",X"0E", + X"0D",X"09",X"20",X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"42",X"DD",X"69",X"0E",X"0D", + X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"42",X"C1",X"69",X"0E",X"0D",X"09", + X"20",X"FD",X"42",X"FC",X"43",X"01",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"69",X"0E", + X"0D",X"09",X"20",X"0D",X"09",X"20",X"42",X"FD",X"43",X"00",X"69",X"0E",X"0D",X"09",X"20",X"0D", + X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"42",X"1C",X"43",X"01",X"69",X"0E",X"0D",X"09",X"20", + X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"42",X"51",X"69",X"0E",X"0D",X"09",X"20",X"0D", + X"09",X"20",X"42",X"1C",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"42",X"FD",X"43",X"00", + X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"FD",X"42",X"FC",X"43",X"01",X"69",X"0E",X"0D", + X"09",X"20",X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"42",X"FD",X"43", + X"00",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"42",X"1C", + X"43",X"01",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"42", + X"51",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"42",X"7A",X"43",X"01",X"69",X"0E",X"0D", + X"09",X"20",X"42",X"65",X"69",X"0E",X"0D",X"09",X"20",X"42",X"51",X"69",X"0E",X"0D",X"09",X"20", + X"0D",X"09",X"20",X"FD",X"42",X"C1",X"43",X"01",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20", + X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"42",X"E1",X"43",X"00",X"69",X"0E",X"0D",X"09", + X"20",X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"42",X"FD",X"69",X"0E",X"0D",X"09",X"20", + X"0D",X"09",X"20",X"69",X"0E",X"0D",X"09",X"20",X"42",X"2C",X"43",X"01",X"69",X"0E",X"0D",X"09", + X"20",X"0D",X"09",X"20",X"42",X"FD",X"43",X"00",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20", + X"42",X"E1",X"69",X"0E",X"0D",X"09",X"20",X"0D",X"09",X"20",X"FD",X"76",X"FE",X"51",X"00",X"58", + X"0D",X"D0",X"0B",X"20",X"FF",X"04",X"77",X"01",X"FF",X"76",X"FE",X"58",X"10",X"51",X"00",X"5C", + X"18",X"5D",X"09",X"90",X"18",X"0E",X"60",X"50",X"60",X"72",X"60",X"50",X"60",X"72",X"60",X"50", + X"60",X"72",X"60",X"50",X"60",X"72",X"60",X"50",X"60",X"72",X"60",X"50",X"60",X"72",X"77",X"01", + X"FF",X"76",X"FE",X"58",X"10",X"50",X"4C",X"51",X"00",X"5C",X"14",X"1D",X"09",X"E0",X"77",X"01", + X"FF",X"50",X"70",X"51",X"00",X"76",X"FE",X"58",X"10",X"5B",X"00",X"5C",X"10",X"1D",X"09",X"E0", + X"77",X"01",X"FF",X"52",X"00",X"53",X"05",X"55",X"00",X"76",X"F9",X"59",X"0F",X"5A",X"0F",X"D4", + X"08",X"60",X"01",X"04",X"59",X"0E",X"5A",X"0E",X"D4",X"08",X"68",X"01",X"04",X"59",X"0D",X"5A", + X"0D",X"D4",X"08",X"70",X"01",X"04",X"59",X"0C",X"5A",X"0C",X"D4",X"08",X"78",X"01",X"04",X"59", + X"0B",X"5A",X"0B",X"D4",X"08",X"80",X"01",X"04",X"59",X"0A",X"5A",X"0A",X"D4",X"08",X"88",X"01", + X"04",X"59",X"09",X"5A",X"09",X"D4",X"08",X"90",X"01",X"04",X"77",X"06",X"FF",X"6C",X"14",X"6D", + X"14",X"6E",X"0A",X"42",X"DD",X"43",X"01",X"4A",X"10",X"46",X"00",X"4B",X"00",X"4C",X"04",X"47", + X"9C",X"FE",X"F8",X"79",X"FE",X"F8",X"79",X"47",X"B8",X"40",X"EE",X"44",X"77",X"45",X"00",X"68", + X"0F",X"69",X"0F",X"2A",X"0F",X"40",X"47",X"BF",X"FF",X"40",X"EE",X"41",X"00",X"68",X"0F",X"49", + X"00",X"0D",X"09",X"20",X"0D",X"09",X"20",X"68",X"0F",X"0D",X"09",X"20",X"0D",X"09",X"20",X"40", + X"86",X"68",X"0F",X"69",X"0F",X"0D",X"09",X"20",X"68",X"0F",X"0D",X"09",X"20",X"48",X"00",X"49", + X"00",X"0D",X"09",X"20",X"40",X"9F",X"69",X"0F",X"68",X"0F",X"0D",X"09",X"20",X"48",X"00",X"0D", + X"09",X"20",X"49",X"00",X"0D",X"09",X"20",X"40",X"1C",X"41",X"01",X"68",X"0F",X"0D",X"09",X"20", + X"40",X"86",X"41",X"00",X"0D",X"09",X"20",X"40",X"0C",X"41",X"01",X"68",X"0F",X"69",X"0F",X"0D", + X"09",X"20",X"40",X"86",X"41",X"00",X"68",X"0F",X"0D",X"09",X"20",X"40",X"FD",X"68",X"0F",X"49", + X"00",X"0D",X"09",X"20",X"40",X"7E",X"68",X"0F",X"0D",X"09",X"20",X"FD",X"66",X"F8",X"48",X"10", + X"49",X"10",X"4A",X"10",X"4B",X"00",X"4C",X"10",X"FE",X"F9",X"2D",X"FE",X"F9",X"46",X"FE",X"F9", + X"2D",X"20",X"77",X"00",X"28",X"20",X"7E",X"00",X"28",X"20",X"8E",X"00",X"28",X"20",X"9F",X"00", + X"78",X"FE",X"F9",X"2D",X"FE",X"F9",X"46",X"FE",X"F9",X"2D",X"20",X"3E",X"01",X"28",X"20",X"1C", + X"01",X"28",X"20",X"FD",X"00",X"28",X"20",X"EE",X"00",X"78",X"67",X"07",X"FF",X"20",X"EE",X"00", + X"28",X"20",X"9F",X"00",X"28",X"20",X"77",X"00",X"28",X"20",X"5E",X"00",X"28",X"20",X"77",X"00", + X"28",X"20",X"9F",X"00",X"28",X"FD",X"20",X"59",X"00",X"28",X"20",X"77",X"00",X"28",X"20",X"9F", + X"00",X"28",X"20",X"4F",X"00",X"28",X"20",X"6A",X"00",X"28",X"20",X"9F",X"00",X"28",X"FD",X"46", + X"10",X"66",X"C7",X"48",X"10",X"49",X"10",X"4A",X"10",X"4B",X"00",X"4C",X"0A",X"0D",X"09",X"20", + X"0D",X"09",X"20",X"0D",X"09",X"20",X"4C",X"20",X"0D",X"09",X"FE",X"00",X"00",X"00",X"00",X"00", + X"FE",X"00",X"00",X"FE",X"67",X"38",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"8E",X"00",X"FF",X"BD",X"FC",X"98",X"86",X"BF",X"C6",X"07",X"BD",X"FC",X"D8",X"86",X"13", + X"C6",X"0F",X"BD",X"FC",X"D8",X"BD",X"FC",X"AD",X"7F",X"90",X"00",X"0F",X"BD",X"FC",X"48",X"96", + X"BC",X"2B",X"07",X"BD",X"FE",X"E1",X"86",X"FF",X"97",X"BC",X"0E",X"CE",X"00",X"00",X"DF",X"D1", + X"96",X"80",X"26",X"0B",X"DE",X"84",X"D6",X"8C",X"BD",X"FD",X"DC",X"DF",X"84",X"97",X"80",X"7C", + X"00",X"D2",X"96",X"81",X"26",X"0B",X"DE",X"86",X"D6",X"8D",X"BD",X"FD",X"DC",X"DF",X"86",X"97", + X"81",X"7C",X"00",X"D2",X"96",X"82",X"26",X"0B",X"DE",X"88",X"D6",X"8E",X"BD",X"FD",X"DC",X"DF", + X"88",X"97",X"82",X"7C",X"00",X"D2",X"96",X"83",X"26",X"0B",X"DE",X"8A",X"D6",X"8F",X"BD",X"FD", + X"DC",X"DF",X"8A",X"97",X"83",X"96",X"A8",X"27",X"08",X"7F",X"00",X"A8",X"C6",X"08",X"BD",X"FD", + X"3A",X"96",X"A9",X"27",X"08",X"7F",X"00",X"A9",X"C6",X"09",X"BD",X"FD",X"3A",X"96",X"AA",X"27", + X"08",X"7F",X"00",X"AA",X"C6",X"0A",X"BD",X"FD",X"3A",X"96",X"AB",X"27",X"08",X"7F",X"00",X"AB", + X"C6",X"18",X"BD",X"FD",X"53",X"96",X"AC",X"27",X"08",X"7F",X"00",X"AC",X"C6",X"19",X"BD",X"FD", + X"53",X"96",X"AD",X"27",X"08",X"7F",X"00",X"AD",X"C6",X"1A",X"BD",X"FD",X"53",X"96",X"BE",X"16", + X"9A",X"D8",X"0F",X"97",X"D8",X"54",X"24",X"09",X"D6",X"CB",X"C1",X"02",X"26",X"03",X"5C",X"D7", + X"BC",X"C6",X"0F",X"BD",X"FC",X"DE",X"7E",X"FB",X"1B",X"96",X"C1",X"B7",X"08",X"01",X"96",X"C2", + X"B7",X"08",X"02",X"7C",X"00",X"BD",X"96",X"BF",X"4C",X"97",X"BF",X"44",X"24",X"32",X"DE",X"C3", + X"09",X"27",X"1E",X"DF",X"C3",X"DE",X"C7",X"A6",X"00",X"44",X"44",X"44",X"44",X"97",X"C1",X"DE", + X"C5",X"09",X"27",X"15",X"DF",X"C5",X"DE",X"C9",X"A6",X"00",X"44",X"44",X"44",X"44",X"97",X"C2", + X"3B",X"86",X"01",X"9A",X"BE",X"97",X"BE",X"20",X"E6",X"86",X"02",X"9A",X"BE",X"97",X"BE",X"3B", + X"96",X"C7",X"81",X"A0",X"25",X"09",X"DE",X"C7",X"A6",X"00",X"97",X"C1",X"08",X"DF",X"C7",X"96", + X"C9",X"81",X"A0",X"25",X"09",X"DE",X"C9",X"A6",X"00",X"97",X"C2",X"08",X"DF",X"C9",X"96",X"BF", + X"84",X"0E",X"26",X"CC",X"7C",X"00",X"C0",X"3B",X"96",X"C0",X"27",X"3E",X"7A",X"00",X"C0",X"96", + X"80",X"27",X"06",X"4C",X"27",X"03",X"7A",X"00",X"80",X"96",X"81",X"27",X"06",X"4C",X"27",X"03", + X"7A",X"00",X"81",X"96",X"82",X"27",X"06",X"4C",X"27",X"03",X"7A",X"00",X"82",X"96",X"83",X"27", + X"06",X"4C",X"27",X"03",X"7A",X"00",X"83",X"CE",X"00",X"06",X"A6",X"AD",X"27",X"09",X"4A",X"26", + X"04",X"6C",X"A7",X"A6",X"B3",X"A7",X"AD",X"09",X"26",X"F0",X"39",X"B7",X"90",X"00",X"C6",X"0E", + X"BD",X"FD",X"20",X"84",X"1F",X"97",X"BC",X"3B",X"CE",X"FF",X"FF",X"DF",X"00",X"C6",X"4F",X"08", + X"86",X"00",X"A7",X"80",X"08",X"5A",X"26",X"FA",X"86",X"13",X"97",X"D8",X"39",X"BD",X"FC",X"C3", + X"86",X"BF",X"97",X"BB",X"C6",X"FF",X"D7",X"82",X"D7",X"B1",X"D7",X"B2",X"D7",X"B3",X"C6",X"17", + X"7E",X"FC",X"DE",X"86",X"BF",X"97",X"BA",X"C6",X"FF",X"D7",X"80",X"D7",X"81",X"D7",X"AE",X"D7", + X"AF",X"D7",X"B0",X"C6",X"07",X"7E",X"FC",X"DE",X"7C",X"00",X"BD",X"20",X"04",X"0F",X"7F",X"00", + X"BD",X"37",X"36",X"C1",X"10",X"2A",X"19",X"86",X"0D",X"97",X"03",X"D7",X"02",X"C6",X"08",X"D7", + X"03",X"5C",X"32",X"97",X"02",X"96",X"BD",X"27",X"FC",X"D7",X"03",X"5A",X"D7",X"03",X"33",X"39", + X"86",X"15",X"97",X"03",X"C4",X"0F",X"D7",X"02",X"C6",X"10",X"20",X"E3",X"37",X"20",X"E4",X"37", + X"86",X"15",X"97",X"03",X"C4",X"0F",X"D7",X"02",X"C6",X"14",X"20",X"0D",X"C1",X"10",X"2A",X"EF", + X"37",X"86",X"0D",X"97",X"03",X"D7",X"02",X"C6",X"0C",X"4F",X"97",X"03",X"97",X"00",X"D7",X"03", + X"96",X"02",X"5F",X"D7",X"03",X"5A",X"D7",X"00",X"33",X"39",X"0F",X"BD",X"FD",X"20",X"C6",X"09", + X"7F",X"00",X"BD",X"84",X"1F",X"81",X"10",X"2A",X"08",X"4A",X"81",X"07",X"2B",X"03",X"BD",X"FD", + X"0C",X"0E",X"39",X"0F",X"BD",X"FD",X"0F",X"C6",X"11",X"20",X"E5",X"17",X"84",X"0F",X"81",X"08", + X"2A",X"08",X"A6",X"94",X"AB",X"98",X"A7",X"94",X"20",X"67",X"CB",X"38",X"DE",X"CD",X"A6",X"05", + X"36",X"DE",X"D1",X"AB",X"94",X"A7",X"94",X"32",X"2B",X"0C",X"24",X"02",X"6C",X"98",X"BD",X"FC", + X"DD",X"5C",X"A6",X"94",X"20",X"4B",X"25",X"F6",X"6A",X"98",X"20",X"F2",X"6F",X"8C",X"DE",X"CD", + X"C1",X"A0",X"2B",X"02",X"08",X"08",X"08",X"08",X"08",X"C1",X"C0",X"2B",X"08",X"17",X"84",X"0F", + X"81",X"08",X"2B",X"01",X"08",X"86",X"01",X"39",X"DF",X"CD",X"DE",X"D1",X"6A",X"90",X"27",X"DC", + X"C1",X"A0",X"2A",X"10",X"C4",X"1F",X"A6",X"94",X"36",X"DE",X"CD",X"A6",X"03",X"BD",X"FC",X"DD", + X"0E",X"32",X"08",X"39",X"C1",X"C0",X"2A",X"93",X"A6",X"90",X"44",X"A6",X"94",X"25",X"02",X"A6", + X"98",X"C4",X"1F",X"BD",X"FC",X"DD",X"0E",X"DE",X"CD",X"A6",X"04",X"39",X"26",X"CA",X"DF",X"CD", + X"E6",X"00",X"2A",X"03",X"7E",X"FE",X"93",X"C4",X"3F",X"C1",X"20",X"2A",X"11",X"A6",X"01",X"BD", + X"FC",X"DD",X"0E",X"E6",X"00",X"08",X"08",X"58",X"2B",X"E4",X"A6",X"00",X"08",X"39",X"C4",X"1F", + X"17",X"84",X"0F",X"26",X"31",X"A6",X"01",X"97",X"CE",X"A6",X"02",X"97",X"CD",X"BD",X"FE",X"D4", + X"DC",X"CD",X"04",X"DD",X"CD",X"E6",X"00",X"C4",X"1F",X"5C",X"5C",X"BD",X"FE",X"D4",X"7C",X"00", + X"CE",X"26",X"03",X"7C",X"00",X"CD",X"BD",X"FE",X"D4",X"CB",X"07",X"86",X"09",X"BD",X"FC",X"DE", + X"0E",X"E6",X"00",X"08",X"20",X"BF",X"80",X"08",X"2B",X"29",X"DD",X"CF",X"84",X"03",X"C1",X"30", + X"2B",X"02",X"8B",X"03",X"16",X"A6",X"01",X"CE",X"00",X"00",X"3A",X"D6",X"CF",X"C1",X"04",X"2A", + X"0B",X"A6",X"B4",X"A7",X"AE",X"DE",X"CD",X"D6",X"D0",X"7E",X"FD",X"ED",X"A7",X"B4",X"DE",X"CD", + X"7E",X"FD",X"F3",X"4C",X"27",X"17",X"5C",X"C1",X"10",X"2A",X"09",X"96",X"BA",X"A4",X"01",X"97", + X"BA",X"7E",X"FD",X"EF",X"96",X"BB",X"A4",X"01",X"97",X"BB",X"7E",X"FD",X"EF",X"C1",X"10",X"2A", + X"09",X"96",X"BA",X"AA",X"01",X"97",X"BA",X"7E",X"FD",X"EF",X"96",X"BB",X"AA",X"01",X"97",X"BB", + X"7E",X"FD",X"EF",X"C1",X"F0",X"2A",X"17",X"A6",X"01",X"EE",X"02",X"3C",X"DE",X"D1",X"E7",X"8C", + X"4C",X"A7",X"90",X"32",X"A7",X"94",X"32",X"A7",X"98",X"DE",X"CD",X"86",X"01",X"39",X"5C",X"27", + X"12",X"DE",X"D1",X"5C",X"26",X"10",X"DC",X"CD",X"A7",X"9C",X"E7",X"A0",X"DE",X"CD",X"EE",X"01", + X"86",X"01",X"39",X"86",X"FF",X"39",X"A6",X"9C",X"E6",X"A0",X"DD",X"CD",X"DE",X"CD",X"08",X"08", + X"08",X"86",X"01",X"39",X"96",X"CE",X"BD",X"FC",X"DD",X"5C",X"96",X"CD",X"BD",X"FC",X"DE",X"5C", + X"39",X"26",X"06",X"BD",X"FC",X"98",X"7E",X"FC",X"AD",X"81",X"10",X"2B",X"03",X"7E",X"FF",X"25", + X"97",X"CB",X"96",X"D8",X"8A",X"01",X"16",X"C4",X"FE",X"D7",X"D8",X"C6",X"0F",X"BD",X"FC",X"DE", + X"86",X"05",X"7F",X"00",X"BD",X"D6",X"BD",X"27",X"FC",X"4A",X"26",X"F6",X"D6",X"CB",X"58",X"58", + X"CE",X"F4",X"00",X"3A",X"3C",X"EE",X"00",X"DF",X"C7",X"38",X"EE",X"02",X"DF",X"C3",X"96",X"BE", + X"84",X"02",X"97",X"BE",X"39",X"16",X"58",X"CE",X"F4",X"24",X"3A",X"EE",X"00",X"81",X"14",X"2A", + X"1C",X"D6",X"82",X"5C",X"27",X"06",X"91",X"A6",X"27",X"02",X"2A",X"10",X"97",X"A6",X"DF",X"88", + X"7F",X"00",X"82",X"7F",X"00",X"8E",X"C6",X"89",X"DA",X"BB",X"D7",X"BB",X"39",X"26",X"11",X"DF", + X"8A",X"97",X"A7",X"7F",X"00",X"83",X"7F",X"00",X"8F",X"86",X"B6",X"9A",X"BB",X"97",X"BB",X"39", + X"81",X"18",X"2A",X"0B",X"DF",X"86",X"97",X"A5",X"7F",X"00",X"81",X"7F",X"00",X"8D",X"39",X"3C", + X"36",X"BD",X"FC",X"98",X"BD",X"FC",X"AD",X"32",X"38",X"DF",X"84",X"97",X"A4",X"7F",X"00",X"80", + X"7F",X"00",X"8C",X"86",X"BE",X"9A",X"BA",X"97",X"BA",X"39",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FB",X"00",X"FB",X"00",X"FB",X"00",X"FB",X"00",X"FC",X"8B",X"FB",X"00",X"FB",X"D9",X"FB",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/mpatrol.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/mpatrol.vhd new file mode 100644 index 00000000..95c23a95 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/mpatrol.vhd @@ -0,0 +1,293 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; + +entity mpatrol is + port + ( + CLOCK_27 : in std_logic; + SPI_SCK : in std_logic; + SPI_DI : in std_logic; + SPI_SS2 : in std_logic; + SPI_SS3 : in std_logic; + SPI_SS4 : in std_logic; + SPI_DO : out std_logic; + LED : out std_logic; + CONF_DATA0 : in std_logic; + AUDIO_L : out std_logic; + AUDIO_R : out std_logic; + VGA_VS : out std_logic; + VGA_HS : out std_logic; + VGA_R : out std_logic_vector(5 downto 0); + VGA_G : out std_logic_vector(5 downto 0); + VGA_B : out std_logic_vector(5 downto 0) + ); + +end mpatrol; + +architecture SYN of mpatrol is + + signal init : std_logic := '1'; + signal clk_sys : std_logic; + signal clk_vid : std_logic; + signal clk_osd : std_logic; + signal clkrst_i : from_CLKRST_t; + signal buttons_i : from_BUTTONS_t; + signal switches_i : from_SWITCHES_t; + signal leds_o : to_LEDS_t; + signal inputs_i : from_INPUTS_t; + signal video_i : from_VIDEO_t; + signal video_o : to_VIDEO_t; + --MIST + signal audio : std_logic; + signal status : std_logic_vector(31 downto 0); + signal joystick1 : std_logic_vector(7 downto 0); + signal joystick2 : std_logic_vector(7 downto 0); + signal kbd_joy : std_logic_vector(9 downto 0); + signal switches : std_logic_vector(1 downto 0); + signal buttons : std_logic_vector(1 downto 0); + signal ps2_kbd_clk : std_logic; + signal ps2_kbd_data : std_logic; + signal scan_disable : std_logic; + signal ypbpr : std_logic; + signal r : std_logic_vector(5 downto 0); + signal g : std_logic_vector(5 downto 0); + signal b : std_logic_vector(5 downto 0); + signal hs : std_logic; + signal vs : std_logic; + signal reset : std_logic; + signal clock_3p58 : std_logic; + signal audio_out : std_logic_vector(11 downto 0); + signal sound_data : std_logic_vector(7 downto 0); + +component keyboard + port ( + clk :in STD_LOGIC; + reset :in STD_LOGIC; + ps2_kbd_clk :in STD_LOGIC; + ps2_kbd_data :in STD_LOGIC; + joystick :out STD_LOGIC_VECTOR(9 downto 0)); +end component; + +component mist_io + port ( + clk_sys :in STD_LOGIC; + SPI_SCK :in STD_LOGIC; + CONF_DATA0 :in STD_LOGIC; + SPI_DI :in STD_LOGIC; + SPI_DO :out STD_LOGIC; + SPI_SS2 :in STD_LOGIC; + switches :out STD_LOGIC_VECTOR(1 downto 0); + buttons :out STD_LOGIC_VECTOR(1 downto 0); + scan_disable :out STD_LOGIC; + ypbpr :out STD_LOGIC; + joystick_1 :out STD_LOGIC_VECTOR(7 downto 0); + joystick_0 :out STD_LOGIC_VECTOR(7 downto 0); + status :out STD_LOGIC_VECTOR(31 downto 0); + ps2_kbd_clk :out STD_LOGIC; + ps2_kbd_data :out STD_LOGIC); +end component; + +component video_mist + port ( + clk_sys :in STD_LOGIC; + ce_pix :in STD_LOGIC; + ce_pix_actual :in STD_LOGIC; + SPI_SCK :in STD_LOGIC; + SPI_SS3 :in STD_LOGIC; + SPI_DI :in STD_LOGIC; + R :in STD_LOGIC_VECTOR(5 downto 0); + G :in STD_LOGIC_VECTOR(5 downto 0); + B :in STD_LOGIC_VECTOR(5 downto 0); + HSync :in STD_LOGIC; + VSync :in STD_LOGIC; + VGA_R :out STD_LOGIC_VECTOR(5 downto 0); + VGA_G :out STD_LOGIC_VECTOR(5 downto 0); + VGA_B :out STD_LOGIC_VECTOR(5 downto 0); + VGA_HS :out STD_LOGIC; + VGA_VS :out STD_LOGIC; + scan_disable :in STD_LOGIC; + scanlines :in STD_LOGIC_VECTOR(1 downto 0); + hq2x :in STD_LOGIC; + ypbpr_full :in STD_LOGIC; + line_start :in STD_LOGIC; + mono :in STD_LOGIC); +end component; + + +begin +--CLOCK +Clock_inst : entity work.Clock + port map ( + inclk0 => CLOCK_27, + c0 => clock_3p58,--3.58 + c1 => clk_osd,--10 + c2 => clk_sys,--30 + c3 => clk_vid--40 + ); + + clkrst_i.clk_ref <= CLOCK_27; + clkrst_i.clk(0) <= clk_sys; + clkrst_i.clk(1) <= clk_vid; + +--RESET + process (clk_sys) + variable count : std_logic_vector (11 downto 0) := (others => '0'); + begin + if rising_edge(clk_sys) then + if count = X"FFF" then + init <= '0'; + else + count := count + 1; + init <= '1'; + end if; + end if; + end process; + + clkrst_i.arst <= init or status(5) or buttons(1); + clkrst_i.arst_n <= not clkrst_i.arst; + + GEN_RESETS : for i in 0 to 3 generate + + process (clkrst_i) + variable rst_r : std_logic_vector(2 downto 0) := (others => '0'); + begin + if clkrst_i.arst = '1' then + rst_r := (others => '1'); + elsif rising_edge(clkrst_i.clk(i)) then + rst_r := rst_r(rst_r'left-1 downto 0) & '0'; + end if; + clkrst_i.rst(i) <= rst_r(rst_r'left); + end process; + + end generate GEN_RESETS; + +mist_io_inst : mist_io + port map ( + clk_sys => clk_sys, + SPI_SCK => SPI_SCK, + CONF_DATA0 => CONF_DATA0, + SPI_DI => SPI_DI, + SPI_DO => SPI_DO, + SPI_SS2 => SPI_SS2, + switches => switches, + buttons => buttons, + scan_disable => scan_disable, + ypbpr => ypbpr, + joystick_1 => joystick2, + joystick_0 => joystick1, + status => status, + ps2_kbd_clk => ps2_kbd_clk, + ps2_kbd_data => ps2_kbd_data + ); + +video_mist_inst : video_mist + port map ( + clk_sys => clk_sys, + ce_pix => clk_osd, + ce_pix_actual => clk_osd, + SPI_SCK => SPI_SCK, + SPI_SS3 => SPI_SS3, + SPI_DI => SPI_DI, + R => video_o.rgb.r(9 downto 4), + G => video_o.rgb.g(9 downto 4), + B => video_o.rgb.b(9 downto 4), + HSync => video_o.hsync, + VSync => video_o.vsync, + VGA_R => VGA_R, + VGA_G => VGA_G, + VGA_B => VGA_B, + VGA_HS => VGA_HS, + VGA_VS => VGA_VS, + --ToDo + scan_disable => '1',--scan_disable, + scanlines => status(4 downto 3), + hq2x => status(2), + ypbpr_full => '1', + line_start => '0', + mono => '0' + ); + + video_i.clk <= clk_vid; + video_i.clk_ena <= '1'; + video_i.reset <= clkrst_i.rst(1); + + +u_keyboard : keyboard + port map( + clk => clk_sys, + reset => '0', + ps2_kbd_clk => ps2_kbd_clk, + ps2_kbd_data => ps2_kbd_data, + joystick => kbd_joy +); + + inputs_i.jamma_n.coin(1) <= kbd_joy(3) or status(1);--ESC + inputs_i.jamma_n.p(1).start <= kbd_joy(1) or kbd_joy(2) or status(2);--KB 1+2 + inputs_i.jamma_n.p(1).up <= not (joystick1(3) or joystick2(3) or kbd_joy(4)); + inputs_i.jamma_n.p(1).down <= not (joystick1(2) or joystick2(2) or kbd_joy(5)); + inputs_i.jamma_n.p(1).left <= not (joystick1(1) or joystick2(1) or kbd_joy(6)); + inputs_i.jamma_n.p(1).right <= not (joystick1(0) or joystick2(0) or kbd_joy(7)); + inputs_i.jamma_n.p(1).button(1) <= not (joystick1(4) or joystick2(4) or kbd_joy(0));--Fire + inputs_i.jamma_n.p(1).button(2) <= not (joystick1(5) or joystick2(5) or kbd_joy(8) or joystick1(3) or joystick2(3) or kbd_joy(4));--Jump + inputs_i.jamma_n.p(1).button(3) <= '1'; + inputs_i.jamma_n.p(1).button(4) <= '1'; + inputs_i.jamma_n.p(1).button(5) <= '1'; + inputs_i.jamma_n.p(2).up <= not (joystick1(3) or joystick2(3) or kbd_joy(4)); + inputs_i.jamma_n.p(2).down <= not (joystick1(2) or joystick2(2) or kbd_joy(5)); + inputs_i.jamma_n.p(2).left <= not (joystick1(1) or joystick2(1) or kbd_joy(6)); + inputs_i.jamma_n.p(2).right <= not (joystick1(0) or joystick2(0) or kbd_joy(7)); + inputs_i.jamma_n.p(2).button(1) <= not (joystick1(4) or joystick2(4) or kbd_joy(0));--Fire + inputs_i.jamma_n.p(2).button(2) <= not (joystick1(5) or joystick2(5) or kbd_joy(8) or joystick1(3) or joystick2(3) or kbd_joy(4)); --Jump + inputs_i.jamma_n.p(2).button(3) <= '1'; + inputs_i.jamma_n.p(2).button(4) <= '1'; + inputs_i.jamma_n.p(2).button(5) <= '1'; + -- not currently wired to any inputs + inputs_i.jamma_n.coin_cnt <= (others => '1'); + inputs_i.jamma_n.coin(2) <= '1'; + inputs_i.jamma_n.service <= '1'; + inputs_i.jamma_n.tilt <= '1'; + inputs_i.jamma_n.test <= '1'; + + LED <= '1'; + +moon_patrol_sound_board : entity work.moon_patrol_sound_board + port map( + clock_3p58 => clock_3p58, + reset => clkrst_i.arst, + select_sound => sound_data, + audio_out => audio_out, + dbg_cpu_addr => open + ); + +dac : entity work.dac + port map ( + clk_i => clk_sys, + res_n_i => '1', + dac_i => audio_out, + dac_o => audio + ); + + AUDIO_R <= audio; + AUDIO_L <= audio; + + + + pace_inst : entity work.pace + port map + ( + clkrst_i => clkrst_i, + buttons_i => buttons_i, + switches_i => switches_i, + leds_o => open, + inputs_i => inputs_i, + video_i => video_i, + video_o => video_o, + sound_data_o => sound_data + ); +end SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/osd.v b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/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/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/pace.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/pace.vhd new file mode 100644 index 00000000..48d2dcd0 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/pace.vhd @@ -0,0 +1,140 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.sprite_pkg.all; +--use work.platform_pkg.all; +--use work.project_pkg.all; + +entity PACE is + port + ( + -- clocks and resets + clkrst_i : in from_CLKRST_t; + + -- misc I/O + buttons_i : in from_BUTTONS_t; + switches_i : in from_SWITCHES_t; + leds_o : out to_LEDS_t; + + -- controller inputs + inputs_i : in from_INPUTS_t; + + -- video + video_i : in from_VIDEO_t; + video_o : out to_VIDEO_t; + + sound_data_o : out std_logic_vector(7 downto 0) + + -- custom i/o + -- project_i : in from_PROJECT_IO_t; + -- project_o : out to_PROJECT_IO_t; + -- platform_i : in from_PLATFORM_IO_t; + -- platform_o : out to_PLATFORM_IO_t + ); +end entity PACE; + +architecture SYN of PACE is + + constant CLK_1US_COUNTS : integer := + integer(27 * 50 / 20); + + signal mapped_inputs : from_MAPPED_INPUTS_t(0 to 6-1); + + signal to_tilemap_ctl : to_TILEMAP_CTL_a(1 to 1); + signal from_tilemap_ctl : from_TILEMAP_CTL_a(1 to 1); + + signal to_bitmap_ctl : to_BITMAP_CTL_a(1 to 3); + signal from_bitmap_ctl : from_BITMAP_CTL_a(1 to 3); + + signal to_sprite_reg : to_SPRITE_REG_t; + signal to_sprite_ctl : to_SPRITE_CTL_t; + signal from_sprite_ctl : from_SPRITE_CTL_t; + signal spr0_hit : std_logic; + + signal to_graphics : to_GRAPHICS_t; + signal from_graphics : from_GRAPHICS_t; + +begin + + inputs_inst : entity work.inputs + generic map + ( + NUM_DIPS => PACE_NUM_SWITCHES, + NUM_INPUTS => 6, + CLK_1US_DIV => CLK_1US_COUNTS + ) + port map + ( + clk => clkrst_i.clk(0), + reset => clkrst_i.rst(0), + ps2clk => inputs_i.ps2_kclk, + ps2data => inputs_i.ps2_kdat, + jamma => inputs_i.jamma_n, + + dips => switches_i, + inputs => mapped_inputs + ); + + platform_inst : entity work.platform + generic map + ( + NUM_INPUT_BYTES => 6 + ) + port map + ( + -- clocking and reset + clkrst_i => clkrst_i, + + -- misc inputs and outputs + buttons_i => buttons_i, + switches_i => switches_i, + leds_o => leds_o, + + -- controller inputs + inputs_i => mapped_inputs, + + -- graphics + bitmap_i => from_bitmap_ctl, + bitmap_o => to_bitmap_ctl, + + tilemap_i => from_tilemap_ctl, + tilemap_o => to_tilemap_ctl, + + sprite_reg_o => to_sprite_reg, + sprite_i => from_sprite_ctl, + sprite_o => to_sprite_ctl, + spr0_hit => spr0_hit, + + graphics_i => from_graphics, + graphics_o => to_graphics, + + sound_data_o => sound_data_o + ); + + graphics_inst : entity work.Graphics + Port Map + ( + bitmap_ctl_i => to_bitmap_ctl, + bitmap_ctl_o => from_bitmap_ctl, + + tilemap_ctl_i => to_tilemap_ctl, + tilemap_ctl_o => from_tilemap_ctl, + + sprite_reg_i => to_sprite_reg, + sprite_ctl_i => to_sprite_ctl, + sprite_ctl_o => from_sprite_ctl, + spr0_hit => spr0_hit, + + graphics_i => to_graphics, + graphics_o => from_graphics, + + -- video (incl. clk) + video_i => video_i, + video_o => video_o + ); + +end SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/pace_pkg.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/pace_pkg.vhd new file mode 100644 index 00000000..ec1b95e2 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/pace_pkg.vhd @@ -0,0 +1,155 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; + +package pace_pkg is + + -- + -- PACE constants which *MUST* be defined + -- + + type PACETargetType is + ( + PACE_TARGET_NANOBOARD_NB1, + PACE_TARGET_DE0, + PACE_TARGET_DE0_CV, -- 5CEBA4 + PACE_TARGET_DE0_NANO, -- EP4CE22 + PACE_TARGET_DE1, + PACE_TARGET_DE2, + PACE_TARGET_DE2_70, -- EP2C70 + PACE_TARGET_DE2_115, -- EP4CE115 + PACE_TARGET_P2, -- A02 build + PACE_TARGET_P2A, -- A04/A build (SRAM byte selects) + PACE_TARGET_P3M, + PACE_TARGET_S3A_700, -- Spartan 3A/N Starter Kit + PACE_TARGET_RC10, + PACE_TARGET_NX2_12, + PACE_TARGET_NEXYS_3, -- Digilent S6 board + PACE_TARGET_CYC3DEV, + PACE_TARGET_CYC5GXDEV, + PACE_TARGET_COCO3PLUS, + PACE_TARGET_S5A, + PACE_TARGET_CARTEBLANCHE_250, + PACE_TARGET_CARTEBLANCHE_500, + PACE_TARGET_BEMICRO, + PACE_TARGET_OPENEP3C16, + PACE_TARGET_MIST, + PACE_TARGET_CHAMELEON64, + PACE_TARGET_RETRORAMBLINGS_CYC3, -- Generic EP3C25 board with custom io boards + PACE_TARGET_S5A_R2_EP4C, + PACE_TARGET_S5A_R2_EP3SL, + PACE_TARGET_S5A_R2B0_EP4C, + PACE_TARGET_S5A_R2B0_EP3SL, + PACE_TARGET_S5A_R2C0_EP4C, + PACE_TARGET_S5A_R2C0_EP3SL, + PACE_TARGET_S5L_A0_EP4C, + PACE_TARGET_S5L_A0_EP3SL, + PACE_TARGET_NAVICO_ROCKY, + PACE_TARGET_NGPACE, + PACE_TARGET_S6M_A0 + ); + + type PACEFpgaVendor_t is + ( + PACE_FPGA_VENDOR_ALTERA, + PACE_FPGA_VENDOR_XILINX, + PACE_FPGA_VENDOR_LATTICE + ); + + type PACEFpgaFamily_t is + ( + PACE_FPGA_FAMILY_CYCLONE1, + PACE_FPGA_FAMILY_CYCLONE2, + PACE_FPGA_FAMILY_CYCLONE3, + PACE_FPGA_FAMILY_CYCLONE4, + PACE_FPGA_FAMILY_CYCLONE5, + PACE_FPGA_FAMILY_CYCLONE6, + PACE_FPGA_FAMILY_STRATIX_III, + PACE_FPGA_FAMILY_SPARTAN3, + PACE_FPGA_FAMILY_SPARTAN3A, + PACE_FPGA_FAMILY_SPARTAN3E + ); + + type PACEJamma_t is + ( + PACE_JAMMA_NONE, + PACE_JAMMA_MAPLE, + PACE_JAMMA_NGC, + PACE_JAMMA_PS2 + ); + + -- Types + + type ByteArrayType is array (natural range <>) of std_logic_vector(7 downto 0); + + type from_CLKRST_t is record + arst : std_logic; + arst_n : std_logic; + rst : std_logic_vector(0 to 3); + clk_ref : std_logic; --reference clock + clk : std_logic_vector(0 to 3); + end record; + + -- maximums from the DE2 target + + constant PACE_NUM_SWITCHES : natural := 18; + subtype from_SWITCHES_t is std_logic_vector(PACE_NUM_SWITCHES-1 downto 0); + + constant PACE_NUM_BUTTONS : natural := 4; + subtype from_BUTTONS_t is std_logic_vector(PACE_NUM_BUTTONS-1 downto 0); + + constant PACE_NUM_LEDS : natural := 18; + subtype to_LEDS_t is std_logic_vector(PACE_NUM_LEDS-1 downto 0); + + -- + -- JAMMA interface data structures + -- - note: all signals are active LOW + -- + + type from_JAMMA_player_t is record + start : std_logic; + up : std_logic; + down : std_logic; + left : std_logic; + right : std_logic; + button : std_logic_vector(1 to 5); + end record; + + type from_JAMMA_player_a is array (natural range <>) of from_JAMMA_player_t; + + type from_JAMMA_t is record + coin_cnt : std_logic_vector(1 to 2); + service : std_logic; + tilt : std_logic; + test : std_logic; + coin : std_logic_vector(1 to 2); + p : from_JAMMA_player_a(1 to 2); + end record; + + -- + -- INPUTS + -- + subtype analogue_in_t is std_logic_vector(9 downto 0); + type analogue_in_a is array (natural range <>) of analogue_in_t; + + type from_INPUTS_t is record + ps2_kclk : std_logic; + ps2_kdat : std_logic; + ps2_mclk : std_logic; + ps2_mdat : std_logic; + jamma_n : from_JAMMA_t; + -- up to 4 10-bit analgue inputs + analogue : analogue_in_a(1 to 4); + end record; + + type in8_t is record + d : std_logic_vector(7 downto 0); + end record; + + type from_MAPPED_INPUTS_t is array (natural range <>) of in8_t; + + + +end; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/pace_pkg_body.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/pace_pkg_body.vhd new file mode 100644 index 00000000..e1cedf87 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/pace_pkg_body.vhd @@ -0,0 +1,50 @@ +library work; + +package body pace_pkg is + + function NULL_TO_FLASH return to_FLASH_t is + begin + return ((others => '0'), (others => '0'), '0', '0', '0'); + end NULL_TO_FLASH; + + function NULL_TO_SRAM return to_SRAM_t is + begin + return ((others => '0'), (others => '0'), (others => '0'), '0', '0', '0'); + end NULL_TO_SRAM; + + function NULL_TO_AUDIO return to_AUDIO_t is + begin + return ('0', (others => '0'), (others => '0')); + end NULL_TO_AUDIO; + + function NULL_TO_SPI return to_SPI_t is + begin + return (others => '0'); + end NULL_TO_SPI; + + function NULL_TO_SERIAL return to_SERIAL_t is + begin + return (others => '0'); + end NULL_TO_SERIAL; + + function NULL_TO_SOUND return to_SOUND_t is + begin + return ((others => '0'), (others => '0'), '0', '0'); + end NULL_TO_SOUND; + + function NULL_FROM_OSD return from_OSD_t is + begin + return (others => (others => '0')); + end NULL_FROM_OSD; + + function NULL_TO_OSD return to_OSD_t is + begin + return ('0', (others => '0'), (others => '0'), '0'); + end NULL_TO_OSD; + + function NULL_TO_GP return to_GP_t is + begin + return ((others => '0'), (others => '0')); + end NULL_TO_GP; + +end package body pace_pkg; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/platform.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/platform.vhd new file mode 100644 index 00000000..571e0ce2 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/platform.vhd @@ -0,0 +1,523 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.sprite_pkg.all; +use work.platform_variant_pkg.all; + +entity platform is + generic + ( + NUM_INPUT_BYTES : integer + ); + port + ( + -- clocking and reset + clkrst_i : in from_CLKRST_t; + + -- misc I/O + buttons_i : in from_BUTTONS_t; + switches_i : in from_SWITCHES_t; + leds_o : out to_LEDS_t; + + -- controller inputs + inputs_i : in from_MAPPED_INPUTS_t(0 to NUM_INPUT_BYTES-1); + -- graphics + + bitmap_i : in from_BITMAP_CTL_a(1 to 3); + bitmap_o : out to_BITMAP_CTL_a(1 to 3); + + tilemap_i : in from_TILEMAP_CTL_a(1 to 1); + tilemap_o : out to_TILEMAP_CTL_a(1 to 1); + + sprite_reg_o : out to_SPRITE_REG_t; + sprite_i : in from_SPRITE_CTL_t; + sprite_o : out to_SPRITE_CTL_t; + spr0_hit : in std_logic; + + -- various graphics information + graphics_i : in from_GRAPHICS_t; + graphics_o : out to_GRAPHICS_t; + + sound_data_o : out std_logic_vector(7 downto 0) + ); + +end platform; + +architecture SYN of platform is + + alias clk_sys : std_logic is clkrst_i.clk(0); + alias rst_sys : std_logic is clkrst_i.rst(0); + alias clk_video : std_logic is clkrst_i.clk(1); + + -- cpu signals + signal clk_3M072_en : std_logic; + signal cpu_clk_en : std_logic; + signal cpu_a : std_logic_vector(15 downto 0); + signal cpu_d_i : std_logic_vector(7 downto 0); + signal cpu_d_o : std_logic_vector(7 downto 0); + signal cpu_mem_wr : std_logic; + signal cpu_io_wr : std_logic; + signal cpu_irq : std_logic; + + -- ROM signals + signal rom_cs : std_logic; + signal rom_d_o : std_logic_vector(7 downto 0); + + -- keyboard signals + + -- VRAM signals + signal vram_cs : std_logic; + signal vram_wr : std_logic; + signal vram_d_o : std_logic_vector(7 downto 0); + + signal snd_cs : std_logic; + + -- RAM signals + signal wram_cs : std_logic; + signal wram_wr : std_logic; + signal wram_d_o : std_logic_vector(7 downto 0); + + -- CRAM/SPRITE signals + signal cram_cs : std_logic; + signal cram_wr : std_logic; + signal cram_d_o : std_logic_vector(7 downto 0); + signal sprite_cs : std_logic; + + -- misc signals + signal in_cs : std_logic; + signal in_d_o : std_logic_vector(7 downto 0); + signal prot_cs : std_logic; + signal prot_d_o : std_logic_vector(7 downto 0); + + -- other signals + signal rst_platform : std_logic; + signal pause : std_logic; + signal rot_en : std_logic; + +begin + + -- handle special keys + process (clk_sys, rst_sys) + variable spec_keys_r : std_logic_vector(7 downto 0); + alias spec_keys : std_logic_vector(7 downto 0) is inputs_i(6-1).d; + variable layer_en : std_logic_vector(4 downto 0); + begin + if rst_sys = '1' then + rst_platform <= '0'; + pause <= '0'; + rot_en <= '0'; -- to default later + spec_keys_r := (others => '0'); + layer_en := "11111"; + elsif rising_edge(clk_sys) then + rst_platform <= spec_keys(0); + if spec_keys_r(1) = '0' and spec_keys(1) = '1' then + pause <= not pause; + end if; + if spec_keys_r(2) = '0' and spec_keys(2) = '1' then + rot_en <= not rot_en; + if layer_en = "11111" then + layer_en := "00001"; + elsif layer_en = "10000" then + layer_en := "11111"; + else + layer_en := layer_en(3 downto 0) & layer_en(4); + end if; + end if; + spec_keys_r := spec_keys; + end if; + graphics_o.bit8(0)(4 downto 0) <= layer_en; + end process; + + --graphics_o.bit8(0)(0) <= rot_en; + + -- chip select logic + -- ROM $0000-$3FFF + rom_cs <= '1' when STD_MATCH(cpu_a, "00--------------") else '0'; + -- VRAM $8000-$83FF + vram_cs <= '1' when STD_MATCH(cpu_a, X"8"&"00----------") else '0'; + -- CRAM $8400-$87FF + cram_cs <= '1' when STD_MATCH(cpu_a, X"8"&"01----------") else '0'; + -- PROTECTION $8800-$8FFF + prot_cs <= '1' when STD_MATCH(cpu_a, X"8"&"1-----------") else '0'; + -- SPRITE $C800-$CBFF + sprite_cs <= '1' when STD_MATCH(cpu_a, X"C"&"10----------") else '0'; + -- INPUTS $D000-$D004 (-$D7FF) + in_cs <= '1' when STD_MATCH(cpu_a, X"D"&"0-----------") else '0'; + -- RAM $E000-$E7FF + wram_cs <= '1' when STD_MATCH(cpu_a, X"E"&"0-----------") else '0'; + + -- OUTPUT $DXX0 + snd_cs <= '1' when STD_MATCH(cpu_a, X"D"&"0---------00") else '0'; + + process (clk_sys, rst_sys) begin + if rst_sys = '1' then + sound_data_o <= X"00"; + elsif rising_edge(clk_sys) then + if cpu_clk_en = '1' and cpu_mem_wr = '1' and snd_cs = '1' then + sound_data_o <= cpu_d_o; + end if; + end if; + end process; + + -- memory read mux + cpu_d_i <= rom_d_o when rom_cs = '1' else + vram_d_o when vram_cs = '1' else + cram_d_o when cram_cs = '1' else + prot_d_o when prot_cs = '1' else + in_d_o when in_cs = '1' else + wram_d_o when wram_cs = '1' else + (others => '1'); + + BLK_BGCONTROL : block + + signal m52_scroll : std_logic_vector(7 downto 0); + signal m52_bg1xpos : std_logic_vector(7 downto 0); + signal m52_bg1ypos : std_logic_vector(7 downto 0); + signal m52_bg2xpos : std_logic_vector(7 downto 0); + signal m52_bg2ypos : std_logic_vector(7 downto 0); + signal m52_bgcontrol : std_logic_vector(7 downto 0); + + signal prot_recalc : std_logic; + + begin + -- handle I/O (writes only) + process (clk_sys, rst_sys) + begin + if rst_sys = '1' then + m52_scroll <= (others => '0'); + m52_bg1xpos <= (others => '0'); + m52_bg1ypos <= (others => '0'); + m52_bg2xpos <= (others => '0'); + m52_bg2ypos <= (others => '0'); + m52_bgcontrol <= (others => '0'); + prot_recalc <= '0'; + elsif rising_edge(clk_sys) then + prot_recalc <= '0'; -- default + if cpu_clk_en = '1' and cpu_io_wr = '1' then + case cpu_a(7 downto 5) is + when "000" => + m52_scroll <= cpu_d_o; + when "010" => + m52_bg1xpos <= cpu_d_o; + prot_recalc <= '1'; + when "011" => + m52_bg1ypos <= cpu_d_o; + when "100" => + m52_bg2xpos <= cpu_d_o; + when "101" => + m52_bg2ypos <= cpu_d_o; + when "110" => + m52_bgcontrol <= cpu_d_o; + when others => + null; + end case; + end if; + end if; + end process; + + graphics_o.bit8(1) <= m52_scroll; + graphics_o.bit16(0) <= m52_bg1xpos & m52_bg1ypos; + graphics_o.bit16(1) <= m52_bg2xpos & m52_bg2ypos; + graphics_o.bit16(2) <= X"00" & m52_bgcontrol; + + process (clk_sys, rst_sys) + variable popcount : unsigned(2 downto 0); + begin + if rst_sys = '1' then + prot_d_o <= (others => '0'); + elsif rising_edge(clk_sys) then + if prot_recalc = '1' then + popcount := (others => '0'); + for i in 6 downto 0 loop + if m52_bg1xpos(i) /= '0' then + popcount := popcount + 1; + end if; + end loop; + popcount(0) := popcount(0) xor m52_bg1xpos(7); + end if; -- prot_recalc='1' + end if; -- rising_edge(clk_sys) + prot_d_o <= "00000" & std_logic_vector(popcount); + end process; + + end block BLK_BGCONTROL; + + -- memory block write signals + vram_wr <= vram_cs and cpu_mem_wr; + cram_wr <= cram_cs and cpu_mem_wr; + wram_wr <= wram_cs and cpu_mem_wr; + + -- sprite registers + sprite_reg_o.clk <= clk_sys; + sprite_reg_o.clk_ena <= clk_3M072_en; + sprite_reg_o.a <= cpu_a(7 downto 0); + sprite_reg_o.d <= cpu_d_o; + sprite_reg_o.wr <= sprite_cs and cpu_mem_wr; + + + + BLK_CPU : block + signal cpu_rst : std_logic; + begin + -- generate CPU enable clock (3MHz from 27/30MHz) + clk_en_inst : entity work.clk_div + generic map + ( + DIVISOR => 16 + ) + port map + ( + clk => clk_sys, + reset => rst_sys, + clk_en => clk_3M072_en + ); + + -- gated CPU signals + cpu_clk_en <= clk_3M072_en and not pause; + cpu_rst <= rst_sys or rst_platform; + + cpu_inst : entity work.Z80 + port map + ( + clk => clk_sys, + clk_en => cpu_clk_en, + reset => cpu_rst, + + addr => cpu_a, + datai => cpu_d_i, + datao => cpu_d_o, + + mem_rd => open, + mem_wr => cpu_mem_wr, + io_rd => open, + io_wr => cpu_io_wr, + + intreq => cpu_irq, + intvec => cpu_d_i, + intack => open, + nmi => '0' + ); + end block BLK_CPU; + + BLK_INTERRUPTS : block + + signal vblank_int : std_logic; + + begin + + process (clk_sys, rst_sys) + variable vblank_r : std_logic_vector(3 downto 0); + alias vblank_prev : std_logic is vblank_r(vblank_r'left); + alias vblank_um : std_logic is vblank_r(vblank_r'left-1); + -- 1us duty for VBLANK_INT + variable count : integer range 0 to 49 * 100; + begin + if rst_sys = '1' then + vblank_int <= '0'; + vblank_r := (others => '0'); + count := count'high; + elsif rising_edge(clk_sys) then + -- rising edge vblank only + if vblank_prev = '0' and vblank_um = '1' then + count := 0; + end if; + if count /= count'high then + vblank_int <= '1'; + count := count + 1; + else + vblank_int <= '0'; + end if; + vblank_r := vblank_r(vblank_r'left-1 downto 0) & graphics_i.vblank; + end if; -- rising_edge(clk_sys) + end process; + + -- generate INT + cpu_irq <= vblank_int; + + end block BLK_INTERRUPTS; + + BLK_INPUTS : block + begin + + in_d_o <= inputs_i(0).d when cpu_a(2 downto 0) = "000" else + inputs_i(1).d when cpu_a(2 downto 0) = "001" else + inputs_i(2).d when cpu_a(2 downto 0) = "010" else + inputs_i(3).d when cpu_a(2 downto 0) = "011" else + inputs_i(4).d when cpu_a(2 downto 0) = "100" else + X"FF"; + + end block BLK_INPUTS; + + BLK_CPU_ROMS : block + + type rom_d_a is array(0 to 4) of std_logic_vector(7 downto 0); + signal rom_d : rom_d_a; + + begin + + rom_d_o <= rom_d(0) when cpu_a(M52_ROM_WIDTHAD+1 downto M52_ROM_WIDTHAD) = "00" else + rom_d(1) when cpu_a(M52_ROM_WIDTHAD+1 downto M52_ROM_WIDTHAD) = "01" else + rom_d(2) when cpu_a(M52_ROM_WIDTHAD+1 downto M52_ROM_WIDTHAD) = "10" else + rom_d(3); + + GEN_CPU_ROMS : for i in M52_ROM'range generate + rom_inst : entity work.sprom + generic map + ( + init_file => PLATFORM_VARIANT_SRC_DIR & "roms/" & + M52_ROM(i) & ".hex", + widthad_a => M52_ROM_WIDTHAD + ) + port map + ( + clock => clk_sys, + address => cpu_a(M52_ROM_WIDTHAD-1 downto 0), + q => rom_d(i) + ); + end generate GEN_CPU_ROMS; + + end block BLK_CPU_ROMS; + + BLK_GFX_ROMS : block + + type gfx_rom_d_a is array(0 to 1) of std_logic_vector(7 downto 0); + signal chr_rom_d : gfx_rom_d_a; + signal spr_rom_left : gfx_rom_d_a; + signal spr_rom_right : gfx_rom_d_a; + + begin + + GEN_CHAR_ROMS : for i in M52_CHAR_ROM'range generate + char_rom_inst : entity work.sprom + generic map + ( + init_file => PLATFORM_VARIANT_SRC_DIR & "roms/" & + M52_CHAR_ROM(i) & ".hex", + widthad_a => 12 + ) + port map + ( + clock => clk_video, + address => tilemap_i(1).tile_a(11 downto 0), + q => chr_rom_d(i) + ); + end generate GEN_CHAR_ROMS; + + tilemap_o(1).tile_d(15 downto 0) <= chr_rom_d(0) & chr_rom_d(1); + + GEN_SPRITE_ROMS : for i in M52_SPRITE_ROM'range generate + sprite_rom_inst : entity work.dprom_2r + generic map + ( + init_file => PLATFORM_VARIANT_SRC_DIR & "roms/" & + M52_SPRITE_ROM(i) & ".hex", + widthad_a => 12, + widthad_b => 12 + ) + port map + ( + clock => clk_video, + address_a(11 downto 5) => sprite_i.a(11 downto 5), + address_a(4) => '0', + address_a(3 downto 0) => sprite_i.a(3 downto 0), + q_a => spr_rom_left(i), + address_b(11 downto 5) => sprite_i.a(11 downto 5), + address_b(4) => '1', + address_b(3 downto 0) => sprite_i.a(3 downto 0), + q_b => spr_rom_right(i) + ); + end generate GEN_SPRITE_ROMS; + + sprite_o.d(sprite_o.d'left downto 32) <= (others => '0'); + sprite_o.d(31 downto 0) <= spr_rom_left(0) & spr_rom_right(0) & + spr_rom_left(1) & spr_rom_right(1); + + GEN_BG_ROMS : for i in M52_BG_ROM'range generate + bg_rom_inst : entity work.sprom + generic map + ( + init_file => PLATFORM_VARIANT_SRC_DIR & "roms/" & + M52_BG_ROM(i) & ".hex", + widthad_a => 12 + ) + port map + ( + clock => clk_video, + address => bitmap_i(1+i).a(11 downto 0), + q => bitmap_o(1+i).d(7 downto 0) + ); + bitmap_o(1+i).d(15 downto 8) <= (others => '0'); + end generate GEN_BG_ROMS; + + end block BLK_GFX_ROMS; + + -- wren_a *MUST* be GND for CYCLONEII_SAFE_WRITE=VERIFIED_SAFE + vram_inst : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 10 + ) + port map + ( + clock_b => clk_sys, + address_b => cpu_a(9 downto 0), + wren_b => vram_wr, + data_b => cpu_d_o, + q_b => vram_d_o, + + clock_a => clk_video, + address_a => tilemap_i(1).map_a(9 downto 0), + wren_a => '0', + data_a => (others => 'X'), + q_a => tilemap_o(1).map_d(7 downto 0) + ); + tilemap_o(1).map_d(15 downto 8) <= (others => '0'); + + -- wren_a *MUST* be GND for CYCLONEII_SAFE_WRITE=VERIFIED_SAFE + cram_inst : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 10 + ) + port map + ( + clock_b => clk_sys, + address_b => cpu_a(9 downto 0), + wren_b => cram_wr, + data_b => cpu_d_o, + q_b => cram_d_o, + + clock_a => clk_video, + address_a => tilemap_i(1).attr_a(9 downto 0), + wren_a => '0', + data_a => (others => 'X'), + q_a => tilemap_o(1).attr_d(7 downto 0) + ); + + tilemap_o(1).attr_d(15 downto 8) <= (others => '0'); + + wram_inst : entity work.spram + generic map + ( + widthad_a => 11 + ) + port map + ( + clock => clk_sys, + address => cpu_a(10 downto 0), + data => cpu_d_o, + wren => wram_wr, + q => wram_d_o + ); + + + sprite_o.ld <= '0'; + leds_o <= (others => '0'); + +end SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/platform_variant_pkg.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/platform_variant_pkg.vhd new file mode 100644 index 00000000..7b852809 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/platform_variant_pkg.vhd @@ -0,0 +1,209 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +library work; +--use work.target_pkg.all; +--use work.project_pkg.all; +--use work.platform_pkg.all; + +package platform_variant_pkg is + + -- + -- PACE constants which *MUST* be defined + -- + + -- + -- Platform-specific constants (optional) + -- + + constant PLATFORM_VARIANT : string := "mpatrol"; + constant PLATFORM_VARIANT_SRC_DIR : string := ""; + type pal_rgb_t is array (0 to 2) of std_logic_vector(7 downto 0); + type pal_a is array (natural range <>) of pal_rgb_t; + type rom_a is array (natural range <>) of string; + constant M52_ROM : rom_a(0 to 3) := + ( + 0 => "mpa-1.3m", + 1 => "mpa-2.3l", + 2 => "mpa-3.3k", + 3 => "mpa-4.3j" + ); + constant M52_ROM_WIDTHAD : natural := 12; + + constant M52_CHAR_ROM : rom_a(0 to 1) := + ( + 0 => "mpe-5.3e", + 1 => "mpe-4.3f" + ); + + constant M52_SPRITE_ROM : rom_a(0 to 1) := + ( + 0 => "mpb-2.3m", + 1 => "mpb-1.3n" + ); + + constant M52_BG_ROM : rom_a(0 to 2) := + ( + 2 => "mpe-1.3l", -- mountains + 1 => "mpe-2.3k", -- hills + 0 => "mpe-3.3h" -- cityscape + ); + + constant tile_pal : pal_a(0 to 127) := + ( + 1 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 2 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), + 3 => (0=>"11111111", 1=>"00100001", 2=>"00000000"), + 4 => (0=>"00000000", 1=>"00100001", 2=>"11111111"), + 5 => (0=>"11111111", 1=>"00100001", 2=>"00000000"), + 6 => (0=>"11111111", 1=>"11111111", 2=>"00000000"), + 7 => (0=>"00000000", 1=>"00100001", 2=>"11111111"), + 8 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 9 => (0=>"00100001", 1=>"00000000", 2=>"00000000"), + 10 => (0=>"11111111", 1=>"00100001", 2=>"00000000"), + 11 => (0=>"00000000", 1=>"00100001", 2=>"11111111"), + 12 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 13 => (0=>"00000000", 1=>"10111000", 2=>"00000000"), + 14 => (0=>"11111111", 1=>"00000000", 2=>"10101110"), + 17 => (0=>"11111111", 1=>"10010111", 2=>"01010001"), + 19 => (0=>"10010111", 1=>"01101000", 2=>"01010001"), + 20 => (0=>"11111111", 1=>"10010111", 2=>"01010001"), + 21 => (0=>"00100001", 1=>"00000000", 2=>"00000000"), + 24 => (0=>"00000000", 1=>"00100001", 2=>"11111111"), + 25 => (0=>"11111111", 1=>"00000000", 2=>"10101110"), + 26 => (0=>"00100001", 1=>"00000000", 2=>"00000000"), + 27 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 28 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 29 => (0=>"11111111", 1=>"00000000", 2=>"10101110"), + 33 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), + 36 => (0=>"00000000", 1=>"00100001", 2=>"11111111"), + 37 => (0=>"00100001", 1=>"00000000", 2=>"00000000"), + 38 => (0=>"11111111", 1=>"00100001", 2=>"00000000"), + 40 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 41 => (0=>"11111111", 1=>"00000000", 2=>"10101110"), + 44 => (0=>"10111000", 1=>"01101000", 2=>"10101110"), + 45 => (0=>"11111111", 1=>"00000000", 2=>"10101110"), + 46 => (0=>"00100001", 1=>"01000111", 2=>"10101110"), + 47 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 48 => (0=>"10111000", 1=>"01101000", 2=>"10101110"), + 49 => (0=>"11111111", 1=>"00100001", 2=>"00000000"), + 50 => (0=>"11111111", 1=>"11111111", 2=>"00000000"), + 51 => (0=>"10111000", 1=>"01101000", 2=>"10101110"), + 52 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 53 => (0=>"00100001", 1=>"00000000", 2=>"00000000"), + 54 => (0=>"11111111", 1=>"00100001", 2=>"00000000"), + 55 => (0=>"10111000", 1=>"01101000", 2=>"10101110"), + 56 => (0=>"10111000", 1=>"01101000", 2=>"10101110"), + 57 => (0=>"00100001", 1=>"00000000", 2=>"00000000"), + 58 => (0=>"11111111", 1=>"00100001", 2=>"00000000"), + 61 => (0=>"00100001", 1=>"00000000", 2=>"00000000"), + 62 => (0=>"10111000", 1=>"11111111", 2=>"10101110"), + 63 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 65 => (0=>"11111111", 1=>"10010111", 2=>"01010001"), + 66 => (0=>"10111000", 1=>"11111111", 2=>"10101110"), + 67 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 69 => (0=>"11111111", 1=>"00000000", 2=>"00000000"), + 70 => (0=>"10111000", 1=>"11111111", 2=>"10101110"), + 71 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 73 => (0=>"11111111", 1=>"10010111", 2=>"01010001"), + 74 => (0=>"10111000", 1=>"11111111", 2=>"10101110"), + 75 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 77 => (0=>"11111111", 1=>"10010111", 2=>"01010001"), + 78 => (0=>"10111000", 1=>"11111111", 2=>"10101110"), + 79 => (0=>"00100001", 1=>"00000000", 2=>"00000000"), + 81 => (0=>"11111111", 1=>"10010111", 2=>"01010001"), + 82 => (0=>"00000000", 1=>"10111000", 2=>"11111111"), + 83 => (0=>"00100001", 1=>"00000000", 2=>"00000000"), + others => (others => (others => '0')) + ); + + constant bg_pal : pal_a(0 to 31) := + ( + 1 => (0=>"00000000", 1=>"10010111", 2=>"00000000"), + 3 => (0=>"00000000", 1=>"11011110", 2=>"01010001"), + 4 => (0=>"00000000", 1=>"00000000", 2=>"11111111"), + 5 => (0=>"00000000", 1=>"10010111", 2=>"00000000"), + 7 => (0=>"00000000", 1=>"11011110", 2=>"01010001"), + 9 => (0=>"00000000", 1=>"10010111", 2=>"00000000"), + 11 => (0=>"00000000", 1=>"11011110", 2=>"01010001"), + 12 => (0=>"00000000", 1=>"10010111", 2=>"10101110"), + 13 => (0=>"00000000", 1=>"10010111", 2=>"00000000"), + 15 => (0=>"00000000", 1=>"11011110", 2=>"01010001"), + 18 => (0=>"11111111", 1=>"11011110", 2=>"01010001"), + 19 => (0=>"00000000", 1=>"11011110", 2=>"01010001"), + 20 => (0=>"00000000", 1=>"00000000", 2=>"11111111"), + 22 => (0=>"11111111", 1=>"11011110", 2=>"01010001"), + 23 => (0=>"00000000", 1=>"11011110", 2=>"01010001"), + 26 => (0=>"11111111", 1=>"11011110", 2=>"01010001"), + 27 => (0=>"00000000", 1=>"11011110", 2=>"01010001"), + 28 => (0=>"00000000", 1=>"10010111", 2=>"10101110"), + 30 => (0=>"11111111", 1=>"11011110", 2=>"01010001"), + 31 => (0=>"00000000", 1=>"11011110", 2=>"01010001"), + others => (others => (others => '0')) + ); + + constant sprite_pal : pal_a(0 to 15) := + ( + 1 => (0=>"00000000", 1=>"00000000", 2=>"00011010"), + 2 => (0=>"11000001", 1=>"00000000", 2=>"10101110"), + 3 => (0=>"00000000", 1=>"10101110", 2=>"11001000"), + 4 => (0=>"10000100", 1=>"11001000", 2=>"00000000"), + 5 => (0=>"11000001", 1=>"00000000", 2=>"00000000"), + 6 => (0=>"00000000", 1=>"11001000", 2=>"00000000"), + 7 => (0=>"10000100", 1=>"00000000", 2=>"00000000"), + 8 => (0=>"11000001", 1=>"11001000", 2=>"11001000"), + 9 => (0=>"11000001", 1=>"11001000", 2=>"00000000"), + 10 => (0=>"10000100", 1=>"01010001", 2=>"00000000"), + 11 => (0=>"00111110", 1=>"00110111", 2=>"00000000"), + 12 => (0=>"00111110", 1=>"00000000", 2=>"11001000"), + 13 => (0=>"11000001", 1=>"10010000", 2=>"00000000"), + 14 => (0=>"00111110", 1=>"10010000", 2=>"11001000"), + 15 => (0=>"00000000", 1=>"01010001", 2=>"00000000"), + others => (others => (others => '0')) + ); + + type table_a is array (natural range <>) of integer range 0 to 15; + constant sprite_table : table_a(0 to 63) := + ( + 1 => 1, + 2 => 2, + 3 => 3, + 5 => 4, + 6 => 2, + 7 => 5, + 9 => 5, + 10 => 6, + 11 => 7, + 13 => 7, + 14 => 8, + 15 => 9, + 17 => 10, + 19 => 11, + 29 => 9, + 30 => 14, + 31 => 5, + 33 => 5, + 34 => 3, + 35 => 15, + 37 => 9, + 38 => 1, + 39 => 5, + 41 => 1, + 42 => 8, + 45 => 1, + 46 => 5, + 49 => 1, + 50 => 5, + 51 => 3, + 53 => 4, + 54 => 13, + 55 => 5, + 57 => 5, + 59 => 5, + 62 => 5, + 63 => 5, + others => 0 + ); + +end package platform_variant_pkg; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpa-1.3m.hex b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpa-1.3m.hex new file mode 100644 index 00000000..d0c47e2b --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpa-1.3m.hex @@ -0,0 +1,257 @@ +:10000000F33100E8ED563A04D0A7F20033CDF40501 +:10001000CDF206CD290DC3680000000000000000ED +:100020000000000000000000875F1600195E2356E4 +:10003000EBE900000000000008D9CD6D05214EE07D +:10004000347E23E60F200134233523353A04D0A72C +:10005000FA9300214EE034010300214EE03510FEFA +:100060000D20FBD908FBFBC9FBCD8A0B3E01324DAD +:10007000E0320FE53C3208E5C3B70B0600AF324D66 +:10008000E02146E070FBCD4507CD8A0BC3B70B06D8 +:100090000418EACDCB053A00D02F3253E0CB4F28DD +:1000A000153A04D0CB67200E2146E0CB4E20073A0C +:1000B00000D0E60120F93A04D0CB5F200621F3E01E +:1000C00034CB46FDE5DDE5CD0E043A41E0A7200541 +:1000D0003E023248E02146E046CB782015CB48204E +:1000E0001B3A48E0A7201DCB5020113A47E0A7C299 +:1000F0008F00CB402806CD7A04CDEC01DDE1FDE197 +:10010000D908FBC936023100E8FBCD290DCD3305F6 +:1001100028FBCD380BC3B70B3100E82146E035FB97 +:10012000F26800CD960BAF32A6E12115E535281B0C +:10013000CDD5062146E0CB66CAB70BCD03063A15EE +:10014000E5A7C2B70BCD0306C3B70B3E1BCD750D9C +:100150002146E0CB66281F21ED2ACD4E033A46E02A +:100160001F1F1FE6013CCDBD03CD0306CDE4053ABC +:1001700015E5A7C2B70B21022BCD4E03CD1C0628D7 +:1001800003CD0306CDE805CD290D212A2ACD000394 +:100190003E11A7283D3D273254E01133820E02CD97 +:1001A000AE033E403250E03A50E0A73A54E028E235 +:1001B0003A48E0A7200B21572CCD7403CD27051812 +:1001C000E6CD330528E1CDDA01CDDA01CDBF0CC390 +:1001D000B70BF3AF3246E0C368003A40E03215E5B2 +:1001E0002100002200E52202E5C30306DD2100E331 +:1001F0003E2032E8E0DD7E003DFA0002210C02EFF5 +:10020000111000DD1921E8E03520EAC9111331137E +:1002100070138813BC13C213EB1321140918E015D3 +:10022000FA152D162D1649165D168F163D195719FC +:100230005E19D1192F1A441A921AB91AF01A011B11 +:10024000271B3314E018AA1E281FAC20C420AA1EA6 +:10025000281F00201A20A41E281F4D209C20231D8B +:10026000F31D511E9B1E9B1CBC1C141E291ECDDCA5 +:100270000DCD0D21CD3A1BCDC71BCDA712CDE71259 +:10028000CDDC0D3ACFE121D0E1BE28E25F16E6DDFC +:10029000210000DD19DD4E00CB21201121CFE1BE70 +:1002A0002003C60477DDE5C179C60418D90600DD50 +:1002B0007000DD7E0121A502E521D302094E2366EF +:1002C00069E921D0E16E26E6712377237323722C2E +:1002D0007D32D0E1C92206FA02ED0222032F036724 +:1002E0000361033703A60D0112181200003A4EE015 +:1002F000DD8601DD7701DD360004DD6E02DD66039B +:10030000CDDB037E0612FE2628060630FE27200DD2 +:1003100023783250E03A50E0A720FA18E6CDC9031E +:1003200018E13A4EE0DDBE012805DD360004C9DDE6 +:100330006E02DD660318443A50E0A7200CCD2F036F +:10034000DD3501C83E043250E0DD360007C9CDDBA3 +:1003500003CDC9033E033250E03A50E0A720FA181B +:10036000F03A50E0A720083E043250E0CDFA02DD1A +:10037000360008C93A4EE0CB672085CDDB037E23EB +:10038000FE21C8FE232809FE2228F0AF121318EE22 +:100390002318EB7E13E60F28041BCDA6032B7E1F2C +:1003A0001F1F1FCDA7037EE60FC6301213C9FD2104 +:1003B0000004FD19F51F1F1F1FCDBD03F1E60FC679 +:1003C0003012FD710013FD23C97E23FE212833FE68 +:1003D000232812FE25282DFE2220E65E235623FD2B +:1003E000210004FD194E233AF9E0A7C879A7C8FEF9 +:1003F00003380BFE062803FE09C0C6054FC9C60B0D +:100400004FC9E1C946237E23CDC10310FBC9213E5C +:10041000E01141E03A00D0010200CD3404213FE078 +:10042000133A02D01FF6040E20CD34043A4CE0B04B +:100430003201D0C91F1F1FCB161FCB167EE655FEFB +:1004400054280E7EE6AAC021EDE0347EE60FC018E7 +:100450001978B1473E13CD7D0D1AFE012811FE0813 +:10046000300B2147E034BEC0AF773C1802D60821DC +:1004700048E0862730023E9977C93A46E007305B6C +:100480001101D0CB6728073A43E03D280113214AE8 +:10049000E07E23772B1A2F772BE60377C93A0BE5FB +:1004A0002AF7E0BE2013237E545D2322F7E0A7281D +:1004B00004FEFF20D932E0E1C9214AE03AE0E1A799 +:1004C00028133A4EE00747E6013C3249E078E61E41 +:1004D00020033620C97E36FF2377C9214DE03A4EEE +:1004E000E0477EA728B7FE50281DCB183805CB184B +:1004F0003801340E022149E0FE1838010D7123360F +:1005000000FEB0D8C37B002100E37EFE04200C3A3D +:1005100009E317D836080E0AC3C202FE08C8214AEA +:10052000E03620233600C921E22ACD00033A48E014 +:10053000C3AE0321D12ACD7403CD270521862A3AE3 +:1005400048E03D280321972ACD00033A53E0E60313 +:10055000C81F3A48E006803806D60127C80690D65C +:100560000127F33248E0783246E03CFBC92100E144 +:100570001140C8014000EDB01E200E20EDB01EC09D +:100580000E40EDB011A0C80E20EDB00E1C7E06048A +:10059000ED790C10FB233AC3E1A7282B7EE67F01FF +:1005A0004000CB3F30010420F97E07E601A85FED53 +:1005B000A33A0088E607BBC2C3000E80EDA30E601D +:1005C000EDA30EA0EDA37E2FD3C0C92ADDE17DBC33 +:1005D000C826E07E3200D0CBFF3200D07D3CE6075B +:1005E00032DDE1C93E4018023EC03250E03A50E0F0 +:1005F000A720FAC92100E00100073600230B78B1DB +:1006000020F8C92146E07EEE08772100E51118E5C3 +:1006100006181A4F7E1271231310F7C93A46E0CB21 +:100620005FC94F81814F0600210C2A093A46E0A795 +:10063000F01100E50603A71A8E2712132310F8CD38 +:10064000AF0606031100E52108E0A71A9E23131048 +:10065000FA38152A00E52208E03A02E5320AE03AC3 +:100660000EE5320BE0CD8506118480CD1C062803F3 +:1006700011A4802102E50E01CDE70306037ECDAE75 +:10068000032B10F9C9210BE07E0E09FE1B3804D69E +:100690001A0E06C640324A803AF9E01F793002C687 +:1006A00005324A841143800E09CDE7032B18CC2A6A +:1006B00001E53A45E03DF83D280124CB2C253C7C62 +:1006C0002005A728023EFE2103E5BEC07EFE03C82A +:1006D000342115E5343A15E53D28034F3E01217CD0 +:1006E00080CDEC06CDEC06280379C6307723A7C869 +:1006F0003CC92140E03A03D0473CE60320023E05D6 +:100700007723780F0F47E6033245E03A04D0CB5702 +:1007100078281F1F1FED44E60FCB5F28013C77238D +:10072000773A04D02F1F47E6012377781FE601238D +:1007300077C91F1F2F473CE60377781F1FE603FE8C +:1007400002DEF518DACD290D21972CCD0003CD2737 +:100750000521572CCD4E031154E00120003A44E00E +:10076000A72034CD9F07CDE8077EFE3220203E53E0 +:10077000325FE03268E02162E07E87D630FE3A38B0 +:1007800006D60A772B3E31772154E0CD4E033A4707 +:10079000E0A720FAC3E805CDD307CDDD0718E9218E +:1007A000672CEDB02157E03A41E0110800FE08380F +:1007B00012C6287719365323232336311106001920 +:1007C0003600C93DC8110B0019C631771106001952 +:1007D0003653C9217D2CEDB0215BE018CACDE80766 +:1007E000215BE03A42E018C22154E0CD4E032A5486 +:1007F000E0114000192254E02157E034C92177E28A +:1008000006077EA7280B2B10F9C92161E2061218F2 +:10081000F1347DD6508787DD7701C9DD7E07E6F8A4 +:100820006F26202929DD7E031F571F1FE61F856FB6 +:10083000C93A00E3FE06307A3AE2E1DD960FED4474 +:10084000DD7703FEE0386DDD4E0B0D206BFEE830EA +:1008500067E1DD360000DD7E0D3717D83717211828 +:100860002E3001245F16001946DD5E0116E178176F +:10087000301006011738277BFE60380662D65E6F9F +:100880003600FD210000FD197B1F1FE63FC6506F9B +:1008900026E2110400FD7202FD1910F972C9CD8221 +:1008A000082174E1010018712310FC21D1E17023AB +:1008B00070C9E1C9DD360B01DD7E0D07D81721189F +:1008C0002E3001245F160019DD5E0116E1FD2100C6 +:1008D00000FD1956235E234E060021F508094E231C +:1008E0006669DD4E03DD7E07CDED08AFE92F473A9F +:1008F0003CE08047C969095A09CF09CD09F50A4387 +:1009000009E20A900A560AB70A520A9F0AC909253B +:100910000B76099709BA091E0A440A340925091DEC +:100920000BB0098309DD340ADD7E0AE61FFE0B38B1 +:10093000381C18353A4EE0E603280114CD69091633 +:100940003B181BFD21A4E1FD770AFD770EFD771210 +:10095000FD7716CD950A3EF88047CD6909143E1003 +:10096000814F210400EBFD19EBDD7E0BA7792035CB +:10097000C608FE203835FD7000FD7301FD7202FDD2 +:100980007103C9DD7E081E07CB3FCB13C67A5778AB +:10099000FE80D2250B18DF3E088047FD2174E179E7 +:1009A000FEF8D018D1C608FEF038CBFD360200C9DB +:1009B0003A4EE0CB5728BF1418BC3E0E8060472E3D +:1009C00001CDE40911087618113E0A18023E05808F +:1009D00060472E01CDE40911087144210800EBFDA8 +:1009E00019EB2E00CD6909FD70042D20293E40AB86 +:1009F000FD77053E08FD720681FD7707C608FEF803 +:100A0000300AFE20D0DD7E0BA72806C9DD7E0BA7AD +:100A1000C8FD360600C914FD73053E1018D7C5D5AC +:100A200021020809444D79C608FED03011CD830952 +:100A3000110400FD19D1C12E00FD750A18A6FD365E +:100A4000020018EC32A6E132AAE132AEE1CD950AFD +:100A500018103E1818023E0DFD2174E180473EF843 +:100A6000814FAFCD6F0AEB110800FD19EB3E1081ED +:100A70006FFD7703FD7707FD70003EF080FD770482 +:100A8000FD7301FD7305FD72021414FD720615C994 +:100A9000CD950A18CD3AF9E01FD07BF60C5FC9FD61 +:100AA0002174E1FD360A00FD360E003E188047AF86 +:100AB000CD6F0AFD7206C93E188047FD2174E13EE4 +:100AC000F8CDCD0A210C00EBFD19EB3E08CD6F0AE5 +:100AD000FD750BD610FD7708FD77097AC603FD7703 +:100AE0000AC9FD21A4E1FD7706CD950A2108F80980 +:100AF000444DC37609FD21A4E1FD361A00CD950AC7 +:100B00003EF8CD130B3E08CD0C0B3E18EB11080040 +:100B1000FD19EBCD6F0A7AC602FD7706C93A4EE0A1 +:100B2000CB4F28011CCD7609DD7E01FE60D8EB118C +:100B3000A0FFFD19EBC37609CD8E0CCDBF0C3A0496 +:100B4000D0CB6FC021A92ACD00033EFF3251E02156 +:100B500053E07E4EA9A11F38083A51E0477910F3BF +:100B6000C9210EE57E3CFE3430E0772A16E54623A7 +:100B70007EE67F23FE0620F678320BE52216E5326C +:100B800023E5222EE5CD120D18C0CDB10C219426FF +:100B90002216E5C3BF0C2A16E52B7E2BE67FFE0648 +:100BA00020F711DCE1EB7E3600EBA720EC7E320B68 +:100BB000E523232216E5C92100E1010004CDFA0551 +:100BC000DD2100E3DD360001DD361009DD3601B040 +:100BD000DD3621A0DD2170E33E600609111000DD45 +:100BE0007701DD19C60410F7CD960B2B463E042184 +:100BF00000C005F2FA0B3E0726A83214E52206E3F0 +:100C00003E023208E5CD8D0D3A13E53DFE05CE00DE +:100C100006FB1F3801047832C5E1CD8129A7205F8A +:100C2000210FE5CB462058343A10E5A72858215F1C +:100C30002ACD00033A10E5FE0438023E03C63032E6 +:100C400056813E1CCD6F0D3E40320AE30E6821B640 +:100C50003046CB782014235E237E23EB2683712637 +:100C600087700C2CBD20F5EB18E73ED321D830114E +:100C700010E246CB782008121310FC3C2318F32115 +:100C800046E034C36E0221472ACD000318B4AF32C8 +:100C90004DE0CD950CCD03062100E5011600CDFAFF +:100CA00005320FE53A40E03215E52162212216E5D2 +:100CB000C921DE2622F7E02103E501110018DFCD6E +:100CC000290D2121840E063A0EE5FE1A3E00380158 +:100CD0003C32F9E0C50E01CDE70379C1061E77234A +:100CE00010FC23230D20F5210F2BCD0003CD68062A +:100CF000CD85063A46E0CB67280FCD0306CD6806C2 +:100D0000CD030621722BCD0003CDD506CD2C21CDF0 +:100D10008A293A0EE50E02FE1A3804D61A0E07C6C4 +:100D20004032528079325284C9210080010008CDBE +:100D3000FA052100E101C600CDFA053A43E03D285D +:100D4000092146E0AFCB5E28013C324CE02104D0C3 +:100D5000AE213CE036EF16FF1F30031436F123724C +:100D6000010040AFED790C10FBF3CD7D0DFBC9F315 +:100D7000CD750DFBC9E52146E0CB7EE1F0E52ADE2D +:100D8000E126E0777D3CE60732DEE1E1C9CD482986 +:100D9000CDC20C0620C5CD061121E2E17EC6087742 +:100DA000C110F2C33B0DDD5E02DD5603014A308106 +:100DB0004F0A4FEB1120007EA720031918F9225487 +:100DC000E00A033DC8F2CD0D3C771918F43A54E01F +:100DD0003C6FE61F20E87DD6206F18E2CD5B123A0B +:100DE000E2E12109E547AEE6F8C878E6F877CD06F6 +:100DF000113A4DE0A7C0210BE5347E5FA72807E636 +:100E00001F2003CDD6297B2A16E5BE200B237EE6C4 +:100E10007F32D7E1232216E521D7E17E3DF8360067 +:100E2000FE18D2450FFE172826D606FA8A0ED607D8 +:100E3000FAF00E8787875F1600FD210010FD19CD9F +:100E4000930EFD7E06A72803CDFD07DD7100C93E88 +:100E5000193270E3C93E0132DCE12AE4E07DE61F8D +:100E6000F6C06F360A0120005D09360B7B3DE61F98 +:100E7000F6C06FCD8129C6417722DAE10936F20149 +:100E8000E003093AF9E0C60577C93C28C8C605322F +:100E900008E5C9FD7E00FE02281BFE07381C16006F +:100EA000FD5E05DD2170E3FD4604DD7E00A728130D +:100EB000DD1910F6C921D7E1361111F0FFDD21F05F +:100EC000E418E4FD7E00DD770CFD7E01DD770D3A50 +:100ED00009E5D602DD770FCD3D15FD8603DD7707E9 +:100EE000DD360B00DD360300DD360E00FD4E02C997 +:100EF0003CCA400FF5FD214E10CDBA0EF1C686DD7D +:100F0000770DDD7100214A3085C6806F6EFD2AE4C1 +:100F1000E01120007E233DF2220F3CFD7700FD19F9 +:100F200018F2C822E6E03D2811FD215510CD9E0E95 +:100F3000DD360A00DD340EDD71003E0D32D7E1C929 +:100F40002AE6E018C8D61FFAB70F21C5E10EFF2325 +:100F50000CD608F24F0FC6082810772323237723D7 +:100F60002323770DF821D6E134C977FD2170E311F1 +:100F7000100006190DFAA50FFD7E00D622FE0630E0 +:100F8000196FCB4D201461FD7E0DFE2A2001242512 +:100F90002008CB552009FD360024FD1910DAC9FDC3 +:100FA000360F0118F5FD7E00D61EFE023004FD3618 +:100FB0000024FD1910EFC9C608FE043008210BE516 +:100FC00046237023773AD5E1A7C85F1600FD21FFBD +:100FD000E3FD192170E31E10013A057EA7CA5D10DA +:100FE0001910F8C900000000000000000000000017 +:100FF000000000000000000000000000000000A54C +:00000001FF diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpa-2.3l.hex b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpa-2.3l.hex new file mode 100644 index 00000000..2e75750c --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpa-2.3l.hex @@ -0,0 +1,257 @@ +:10000000000E12F010000100010F12F010000100AC +:10001000021012F010000100031112F01000010094 +:100020000D2512FD061000000A211DF0051000002C +:10003000041216F418100100051616F2181001002B +:10004000061B16F0181001000B2317F0012000000A +:100050001300100000004A140003400000EBDD21F3 +:100060000000DD19DD710DDD360900DD360800FD0B +:100070005607DD7207FD7E00D61EFE0AD0CB4FC0AC +:10008000FD7E03D610FEE0D079FE3A2836CD9220D0 +:10009000ED5FE67F473A03E380D62F4FDD9603C638 +:1000A00008FE11793003EE104FFDBE0317DD770C0B +:1000B00079CD3815921F1F1FE61FC60241CB380E9F +:1000C0002E180F012A8FCB3ACB3ACB3A3A14E5EEF1 +:1000D0001F92210031856F56FD7E03DD7703CB3FF4 +:1000E000903002ED441EFF1C9230FC82DD73050649 +:1000F00008CB27BACB13CB4320019210F47B2FDD22 +:100100007704DD7100C921D9E17EA7C29A113A08AE +:10011000E5FE033079470521B42C3AE2E11F1F1FA9 +:10012000E61F851002C6206F4E3AE2E11F1F1FE650 +:100130001F5F1683FD210004FD19EB112000060747 +:100140003A14E5B82807360019FD1910F622E4E044 +:1001500071FD36000419FD1936F3FD36000410F563 +:100160003AE2E11F1FE63EC6006F26E23A14E5EED2 +:100170001F57FD21242CFD09FD7E005FE67007B2AC +:1001800007070777E6F8577BE607B22377C987C6E4 +:100190007A778728023E0A32D8E14ECB19D8CB199C +:1001A00021D8E135F2B611360B3A14E5383CFE079A +:1001B000283E3E0B18277E2114E5301CA720013570 +:1001C000C6F3FEFC3802D60C4FC603FAC911C22989 +:1001D0001179D6104FC32911FE092001342FC6F220 +:1001E000FEF03002C60C4FC32911FE043E0B20D096 +:1001F00021D9E1342AE1E122F1E021000022EFE0FF +:10020000C921442DED53EBE022E9E03A4EE0C6036C +:10021000DD7701DD36000BC93A4EE0DDBE0120F38B +:100220002AEBE02322EBE02BEBFD210004FD192A51 +:10023000E9E00120007E233DFE03380D3C12FD362F +:100240000080EB09EBFD0918EC3DFA551228B95E68 +:1002500023562318AF21972CC300033A0DE53DF830 +:1002600021AB2C3A4EE0E63F281BE61FC0CD7B03B6 +:10027000CD88123602EB3612210BE57E2396FE4026 +:10028000D8233600C9CD00033A0DE521558001027F +:10029000131120003D2808190C053D28020419708F +:1002A000110004EB1971C92170E31110000102194A +:1002B0007EFE14282AFE1E381BFE203808FE223837 +:1002C00013FE2A300F3ADFE11F1FD87932DFE1C673 +:1002D00015C36F0D1910D93ADFE1A7C8AF18ED3A71 +:1002E000DFE11F0D30E5C93ADCE1A7C83A4EE0E690 +:1002F0000F2804E607C03C3C4F2ADAE17ED65A2894 +:100300000A3C0604C605280310FAC9110004197135 +:10031000C92100402202E33A4EE0E6032048DD35E1 +:100320000AF26613215F2ACD7B033E18CD750D18A6 +:1003300029CD48150707302B2A1AE31179FF197CBC +:10034000A720057DFED138023ED15FCB3B832F6FC6 +:100350003EFFDE00672B672208E3DD3400CD761513 +:10036000C3B808CD8A14CD3315D61C3207E318ED77 +:10037000DD34003E14CD750DCD48152A0EE3CDA415 +:1003800014CD3315D61E18E3CD48152A0EE3CDA49F +:10039000142A06E3ED5B08E3192206E3210C001999 +:1003A0002208E3CB14380FCD3315D61D473A07E3A7 +:1003B000B83803DD3400CDAC15C3B808DD36000213 +:1003C00018B62A02E3ED5B04E3192202E32A06E3EE +:1003D000ED5B08E3192206E3CDB808DD350AC0DD80 +:1003E0003400DD360D033E1FC3750DAF32A2E1DDD3 +:1003F000350AF0DD7E0DFE09D21801FE05380BCD61 +:10040000B808DD340DDD360A0EC9DDCB0A4EC0EE6C +:1004100007DD770DDD7E0AFEC0D2B808DD360D059A +:10042000C9DD350ADD7E0AFE50D0214DE034DD36CF +:100430000004C9CDDB2022D6E07CD608FEF0D252E3 +:10044000082AD8E023CB7C20022B2B22D8E02ADA02 +:10045000E0ED5BDCE0194C22DAE02124001922DC1B +:10046000E0CB14381FC60BCD3815D608B93015EDC2 +:100470005BDCE0210000ED52CB3ACB1BCB3ACB1B2F +:100480001922DCE0CDB808C3EF203A49E0872128E3 +:1004900030856F5E23662E00220EE3AFCB13175715 +:1004A000ED531CE3ED5B02E3AFED524F7C3003ED07 +:1004B000440CFE1838023E18213030856F5E16005D +:1004C0002A04E37CA7F2D4140D20112F677D2F6F2F +:1004D00023EB18030D2857A7ED5230521102003AB2 +:1004E0004EE01F2A04E3ED5A2204E3ED5B02E31918 +:1004F0002202E35421DCE17E3DC03A0BE587878789 +:10050000C60882D03600210EE5347E0609FE192881 +:100510000F38013DD605CAC02710F9FE06CAC0270C +:100520003E10CD750DAF0E01CDC202C3120D11FDEF +:10053000FF18AC3A03E3C620473AE2E180C606CB97 +:100540003FCB3F6F26E27EC92A4AE07CADA507D0AB +:100550004F3A20E3A720053E0A3220E32130E3068C +:10056000041110007EA728051910F979C9360E3E2E +:1005700012CD750D79C93A03E34FC604CD3815D6AF +:1005800009CDC9157AEE03573E09CD92152C1414E6 +:100590003E0D814F2C2C7DE63F6F7ED609CDED08B8 +:1005A00047FD23FD23FD23FD23C376093A03E34FD3 +:1005B0003A07E3C611CDC9157AEE03573E09CDC5FA +:1005C0001514143E0D814F18D80CCDED08471100BD +:1005D000053AE2E1CB67200114FD21A4E1C37609CD +:1005E000DD360A0C3A07E3C60A3227E32A02E31192 +:1005F000001C192222E3DD3400C9DD350A28192A3E +:1006000022E3115D04192222E3DD7E0A1F3E093830 +:10061000013CDD770DC3B808DD3400DD360A03DDAB +:10062000360D0B3AE2E1DD8603DD770FC9CD3108E7 +:10063000DD350AF0DD7E0DFE0DCA5208FE29CA52D4 +:1006400008DD340DDD360A03C93A03E3C60ADD7757 +:10065000033A07E3C602DD7707DD3400C93A00E359 +:10066000FE06302BDD7E07D603FE3A3822DD770703 +:10067000CD1B08DD7E071F1F1F7A17E607F6607780 +:100680001100041936001FD01120FC193600C9CD05 +:100690001B083600DD360000C9DD4E03DD7E0C8709 +:1006A0008787211C31856F3A20E31104F8D60B2887 +:1006B000063D2017110AF03A23E38291FEE8380B39 +:1006C0003A27E3DD96078683F24E17DD7E0CA7F806 +:1006D000233A03E39186234623B83805963001AFC9 +:1006E0008023BED2C417234623866F243A07E386AD +:1006F000DD96073D80F83A04D0CB77C8E13E07325B +:1007000000E33E03320DE3AF320AE332B0E332726C +:10071000E1CD520806033A07E3C6144F3A03E3213A +:10072000D3E13421C0E3FD21DF30361C23232377BE +:10073000C610CDF81771CDF8172323FD5E0073FDA9 +:100740002323232310E4CDA1083E1FC3750D3AE2F5 +:10075000E1DD8603322FE33E0D3220E33E26322DCB +:10076000E33E03322AE33E01CD750D110700197EE9 +:10077000E60F0E01FE0E3007CDC202E1C352082083 +:1007800013CDF017C605DD7708CDC202DD3400DDDC +:10079000360A00C9CD5608CDF0172110FBC606DD7C +:1007A0007708E5CDC202E1DD7E0784DD7707DD7ED7 +:1007B0000385DD7703DD360D54DD360021DD360A95 +:1007C0003BC3560847DD7E0CC6804FFE8B281BFEC0 +:1007D0008E28177896FE04D0DD710C2323237E1F0C +:1007E0001F1F1FE60F0E01C3C20278FEFC30E9C9CD +:1007F000ED5FE603C03E02C923FD5E007323FD5E8C +:1008000001732323FD23FD23C93A00E3FE06D0FE36 +:1008100001260028762A1CE3ED5B1AE37AA7FA2367 +:1008200018ED52210300300321FEFF3A4EE01F383D +:10083000011D19221AE3ED5B04E3A7ED522214E334 +:10084000EB2AE1E11922E1E13AD9E11F303D2AEF3B +:10085000E0197CC606FE0C3817D61267E5213FE288 +:100860001142E2014000EDB82142E20E03EDB8E191 +:1008700022EFE0ED5BF1E0193A08E5FE03300C3AB7 +:10088000E2E194FEF43804AF32D9E17C2F213DE05F +:100890008632C0E12A14E3545DCB3CCB1D19CB3C1E +:1008A000CB1DCB3CCB1DEB2A04E5192204E57C2FA4 +:1008B00032C1E1CB3ACB1B2A06E5192206E57C2F93 +:1008C00032C2E1CD3315FEC430023EC4C628300129 +:1008D000AF47C69432C3E1CB2878C67232C4E1C9AF +:1008E000CD3108CD9916DD350AF0DD340ADD7E0301 +:1008F000FEE0D0DD7E0C17D83AC0E3A7C0FD217022 +:10090000E31110000605FD7E00FE1D200DFD7E0C8E +:10091000173807DD7E03FD9603D8FD1910E8DD7E4C +:1009200007FD7707DD7E0FD604FD770FFD3600113A +:10093000FD360D22FD360C0CDD360A43C93A00E3C4 +:10094000FE06D0DD7E04C6DDDD77043003DD350F25 +:10095000CD3808CD9916C9CD3108CD9916C9CD31FC +:1009600008DD7E0CA7C0DD7E0D0707E61C21002EEA +:10097000856F3A03E3DD96038623BE3045473A0090 +:10098000E3FE04C83A04D0CB77C878460E02CB38D1 +:1009900050CB38BA38047882470DDD7E0380D61CF0 +:1009A0003203E379320DE33D3D3205E33E8032040C +:1009B000E3237E320AE32100022208E33E063200EE +:1009C000E3C996FE04D0DD340C23237E0E01C3C29E +:1009D00002DD350AF20D1ADD7E0E473C0E07FE06DB +:1009E000380B3A4EE0E63020023E304FAFDD770E56 +:1009F000DD710A78FE043804EE073D47C606DD4681 +:100A00000C04FA081ADD770CC645DD770D3A20E3B1 +:100A1000FE0F380EC03A03E3DD9603C610FE30DA4F +:100A2000FD16CD3808DD7E0CFE06C8CD9916C9CD61 +:100A30003108DD350AF0DD7E0DFE4AC8DD350DDDFD +:100A4000360A07C93A00E3FE06D0DD350EF2661A13 +:100A5000DD360E06DD7E0D3D010300218E1AEDB15F +:100A600020017EDD770DDD7E04C6C0DD7704300316 +:100A7000DD350FCD3808DD7E0CD604CB27C60C4FF4 +:100A8000DD7E03CD381591DD7707CD9916C9111597 +:100A90001A20DD360B013A00E3FE06D02A72E37C11 +:100AA000FE082809117000192272E3182CDD360A9D +:100AB00000DD3400DD360E80C93A4EE01FD83A0022 +:100AC000E3FE06D03A4EE047E603200DDD3403CBCB +:100AD000682806DD3503DD35033A4EE0E607200DD4 +:100AE000DD7E03C618CD3815D610DD7707C3B808EC +:100AF000DD350E20CFDD360A58DD3400DD360D52EF +:100B0000C9DD350A28152A72E3118001192272E322 +:100B10007CFEF0D25208CD991618BEDD3400DD36C9 +:100B20000A6EDD360D23C9CD9916DD350A2095DD17 +:100B30003500DD350BDD360D52C921EEE03A4EE0D1 +:100B400096F8010010ED5FE6F026E451596F7ED66D +:100B50001EFE0A300ACB4F2006FE0438630C5D7D72 +:100B6000C61010E9ED53D4E10DF83A10E5E603FEA6 +:100B700001894FFE09DA7A1B0E0821FF2F094E0664 +:100B8000052170E31100007EA72839D62F2001141B +:100B90007DC6106F10F17AB9D01C1DC8ED5FE60F4D +:100BA000C619214EE08632EEE01600DD2100E3DDBD +:100BB0001921D4E15EFD2100E4FD190E3BC3641050 +:100BC0005514189B5D18C93A4EE02152E0AEE61F5D +:100BD000C0ED5F7721C6E106037EA720042310F94C +:100BE000C9DD2100E40478480610FE04280F3AD637 +:100BF000E13DFAFD1B0D0DDD2170E306051110002E +:100C0000DD7E00A72805DD1910F6C93579FE023012 +:100C100043ED5FE61FC620DD770F21D6E135ED5F9E +:100C2000E61E5F1600FE0E3E823804ED5FE680DDB4 +:100C3000770C210830197EDD7707237EDD770306E8 +:100C40000021591C09097EDD770DDD360E00237E5B +:100C5000DD7700C9CD0A0818C52B262A262B222AA3 +:100C600022311EDD7E0DFE2BD8DDCB0E7E2018DD61 +:100C7000350EF0DD340DFE2F281CFE342004DD3649 +:100C80000D31DD360E08C9DD340EF8DD350DFE2CD4 +:100C900028F0FE3228ECDD360EF8C9DD6E04DD6684 +:100CA00005CB3CCB1DDDCB0C462807EB210000A774 +:100CB000ED52DD7504DD7405DD3400C90E3DDD7EC9 +:100CC00009A720130E3BDD4605CB1030020E50DD88 +:100CD0007E08FE6038010CDD710DCDFB207CFE0628 +:100CE000DA520801050022D6E07C2ADCE00922DC89 +:100CF000E0ED5BDAE01922DAE054CD3815D608BA17 +:100D0000CDEF203035DD7707DD3400DD360B00DD3B +:100D10007E00FE2A3E032005DD3600303DCD750DF8 +:100D2000C35608CDDB20ED5B14E3CB2ACB1BED5281 +:100D3000118E00ED5201100018AC3A00E3FE06D20D +:100D4000B808210506DD7E00FE2A3003210B02FDD6 +:100D50002130E31110000604FD7E00FE0F2014FD7B +:100D60007E07DD9607FE0A300AFD7E03DD960394BA +:100D7000BD382BFD1910E13A07E3DD9607FEF0DAE6 +:100D8000B808573A03E3DD9603D604FEEADAB8085A +:100D90003A04D0CB77CAB808CD5208C3FD16FD344B +:100DA00000DD7E0DFE373811DD360C00DD36002DFE +:100DB000DD360A0ADD360D4FC921C9E1010105FE04 +:100DC0003130072305FE2A2801233E11CD750D354C +:100DD00020082323237EFE033011DD360020DD367C +:100DE0000A06DD360D3778CDC202C92100FCD602D5 +:100DF000C39D17DD360D3ECD2316D603E6F8C60695 +:100E0000DD770F21D1E17EA72813233601237EA7AA +:100E1000C8C35208DD360D43CD231618E634DD3441 +:100E200000DD360A04CD3108C921D2E17E23B6A700 +:100E3000C25208DD7E03FEF8D25208DD350A20E5F5 +:100E4000DD7E0DFE49CA5208DD340DDD360A051877 +:100E5000D43AD3E1A7C25208DD350A20C8DD7E0DA1 +:100E6000FE42301FDD340DFE3F2012DD7E0F1F1FBE +:100E70001FE61F5F16830E093E01CDC202DD360A52 +:100E80000218A2DD7E07C608DD7707CD5608DD36DD +:100E90000C00DD360D81DD360013C9DD350ACA527E +:100EA00008C3B808DD350FCA4D20DD3400DD7E0CE7 +:100EB000CB27283D3F1FE680DD770C4FED5FE63FF7 +:100EC0005F1600212601190CF2D21EEBA7210000AB +:100ED000ED52DD7405DD7504EE3FD62087DD770821 +:100EE0003E00DE00DD7709ED5FE67FC620DD770A94 +:100EF000C90601DD7E07FE44380C0603FE583006A5 +:100F0000ED5FE6023C4778DD860CDD770CED5FE6B1 +:100F10000FC624DD770B216601DD7504DD7405DD68 +:100F2000360800DD360900C9CD631CCDDB20DD7E2F +:100F30000CCB272052DD350A28492AD6E0ED5BD8B4 +:100F4000E0197AED5B04E3ED5222D6E017382FDD8D +:100F50007E0D06A0D62A28080680D607380206D0BD +:100F60007CB8301F2ADAE0ED5BDCE01922DAE07CA5 +:100F7000FE38380FFE70300BCDEF20C34C1D7CFEC9 +:100F80001630E1DD3500C92AD8E0DD5E0B1600A77A +:100F9000ED5222D8E03016DD7E03D630FE403E0012 +:100FA0003004ED5FE680DD860C3CDD770CEB2AD665 +:100FB000E0ED52DD7E0C0738021919ED5B04E3ED1C +:100FC0005222D6E02ADCE0DD5E0B16000F3D0F302A +:100FD0001AA7ED5238AD22DCE0EB2ADAE0A7ED5299 +:100FE0000F3802191922DAE0C3781F1918E8000037 +:100FF00000000000000000000000000000000000F1 +:00000001FF diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpa-3.3k.hex b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpa-3.3k.hex new file mode 100644 index 00000000..91b7d40f --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpa-3.3k.hex @@ -0,0 +1,257 @@ +:10000000DD3400DD7E0CE67FC8CD281FDD7E00FEDE +:1000100025CA831FFE24CAAA1EC9CD631CCDDB20BE +:1000200022D6E07CD608FEF0D25208ED5BDCE02A56 +:10003000DAE01922DAE07CFE30DA52087AA7FA78A0 +:100040001F210000A7ED5222DCE0C3781F3A03E332 +:100050001600C610DD96033003ED44151F1F1FE682 +:100060001E4F060021242D09FE123801047ECB7A92 +:1000700028062F5F782F477BDD7704DD7005235E30 +:10008000160079FE0A300114DD7209DD7308DD36D1 +:1000900000292A1AE3DD750BDD740FC9CD631CCD71 +:1000A000FB2022D6E07C2ADCE0C3F11CDD350AC24D +:1000B000B808DD360A06DD7E0DFE39D25208DD3481 +:1000C0000DC3B808DD350AC2B808DD7E07FE80D250 +:1000D00052080680DD360000C36908DDE5E111D471 +:1000E000E0010A00EDB0ED5BD6E02AD8E019C9DDE9 +:1000F000E5D121D4E0010A00EDB0C9CDDB20EBDD74 +:100100006E0BDD660FED4B1AE3ED4219C92151E08C +:100110003A00E33D28117EA7F02111E53E01862734 +:1001200077237ECE0027773E373251E0119080FD55 +:100130002190840E02CDE7033A12E5CDBD033A11BA +:10014000E5C3AE0300000000000000000000000056 +:10015000000000000000000000000000000000009F +:100160000006010334074908630F73078019920FD3 +:10017000A006A103A22AE032FF280F0F3F3040065D +:100180004103422A4C0F920F9F28A507B80FCD0FAD +:10019000E006E10300190108140720334F0F7F30F8 +:1001A0008006810382229C1CB61CC02AD91CDF2039 +:1001B000030F08281607200621033C22521C603238 +:1001C0006E1C7F20A608B70FBF30C006C103C4084D +:1001D000D30AE60EF60F0C101C0F2D0E39074A0F2E +:1001E0005B0F600661036E196F09820F8F09A02BE8 +:1001F000A20FB10FFF28000601030222141C281CC5 +:10020000402A541C5F209F28A006A103A223A61CFD +:10021000D31CE90FF70AFF200710170E2910350A23 +:1002200040064102421A60036F127812881292123D +:10023000A312A412B112C212CD12CE12D912E0062C +:10024000E103EB12FA1206120712141223122C12F7 +:10025000371242125612571265126E127A12800627 +:1002600081038512861291129212A312A412AE1269 +:10027000B812B912CA12CB12D712E312F312001934 +:1002800020062103222C60339F28BF30C006C10303 +:10029000C224D51CEA1C0033051C181C311C3F204D +:1002A0004830600661037B24871C991CA02BAE1C80 +:1002B000C51CD71CDF20E0280006010413141E16FD +:1002C0002D162F163A154C164E1658166616681629 +:1002D000720273147E168019A086A103A234C70F80 +:1002E000EC100F0A1F302A1040864102421960327A +:1002F0006105802ABF30C002DF28E006E103E22B5F +:10030000002301032A1C3F28451C571C6C1C6D2030 +:1003100080068102A003A810B40AC507DC0FE30918 +:10032000F2070A100D091C08200621032C0F2F0FBD +:10033000320A451354136613770A8A139813A713C6 +:10034000B413C006C103C509D40AE002E70AF509DF +:1003500000041C162A152C1535163D1440024814AD +:100360004A146086610262198003812CA033DF2861 +:10037000FF3000860103022C4023571C5F286C1CB1 +:10038000831C9A1CA086A103A223AE1CC51CD51CED +:10039000E033E81CF50FFF200A091C0A2830321050 +:1003A000400642025B2B600380339F28D030E0067A +:1003B000E103E21B2017601880068103C613D20FE9 +:1003C000DD0FEE0EFC0A01130D0920062103221396 +:1003D0002B13391349134C0A5C0F6A0F79138413DA +:1003E000860A950FA413B313B509C006C102C2193A +:1003F000E003E12CEA07F909070A190F2A0F390966 +:100400004828540F600661037B23841C921CA023A0 +:10041000A31CB31CC31CDC1CEF1CFF200006010343 +:1004200007100A0A1A0F2C09320F41074F085C0FF8 +:10043000630970077D0E8019A006A103A224AF1CDA +:10044000BC1CC02CCA1CD91CE81CF61CFF28050AC1 +:10045000101C1120250C320F350C400641034219A7 +:100460006033802B830A9207BF30C60FC90AD909AF +:10047000DF28E006E103E224EA1C040A140F1C1C36 +:1004800024203409450F490F4B0C580C670C750C90 +:100490007A0F800681029004AD16B715BE14C516FA +:1004A000C716D414DB15E614E814E916F014F11697 +:1004B000F214021504150E160F0210141316171459 +:1004C0001914208621032219402C41334203BE28EF +:1004D000BF30C086C103C21AE812F212F412FD1234 +:1004E00008121312221223122E12361242124E1228 +:1004F0005712608661036512671272127A128312B4 +:100500008F129712A212AB12B712C212D012D812C7 +:10051000E4120086010320252509331C402C4810D5 +:10052000541C650F6F1C7F2080028828A086A105BF +:10053000BB35C02CDF02FF300A10190A1F28200328 +:10054000290F2C0A320F3A0F40064102470F4A0A80 +:10055000500F60036507790880178A0AA018C80938 +:10056000E006E103EF10F40FF70A060F111014096B +:100570001A1A3A12421244124E12571259126312A8 +:100580006B12800681028F13920AA003A510A807A0 +:10059000B20FB50FC513D409E40FE60CF40C041028 +:1005A000060C130C200621032210231928102A0AF6 +:1005B0003B10402541334A1C551C651C741C820F9E +:1005C000881C950FA51CA830B11CB220BE0FC00618 +:1005D000C102C21BCA10E003E60AF0170308121892 +:1005E0001309401A4A0A60066103741285128712C1 +:1005F00092129412A912AA12B410BD12C312CC0FF7 +:10060000D512D712E512E712F412000601020225F4 +:10061000032C0A1C171C20032710371C481C591CCC +:100620006A0A791C80288D0F901C9120A006A103D6 +:10063000AD0CB20FBB0CCB0CD80FE50FE710F10FD0 +:10064000F90F080C0D0F160C2019250F280936106C +:100650004006410242254A1C5A0F6003612C651076 +:10066000791C881C941CA21CAE1CBB1CBF20CA0F8A +:10067000D028DC10E006E103E80FEA10EC0AF90FDD +:1006800008130A07170F1A0A2A0C37103C0C4302EA +:100690008006000620032810340A470C550C5A0F18 +:1006A0006309720785139413A006A104B314BF163F +:1006B000CD16DA15EC16EE16F816F903002B2023EA +:1006C00040864A1C5028651C771C7E057F2080339D +:1006D000C803CF30E006001720186A0A730701022A +:1006E000200134C03AC2482054C2592064C269E291 +:1006F0006DC27622822090C096C09CC0A2C0BEC1AE +:10070000CBC0D820E6C2F42200C205FF4D004E0245 +:100710005E2277228A228BFFD800E002452255C252 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0002146E035FB783213E5FE05CAD227A7C2E1 +:1007D0005E28CDFA293E1ECD750D210FE53600238A +:1007E00034CD4829CDE80521242CCD0003CDBA28ED +:1007F000210C2CCD00033A13E5171717172600E636 +:10080000F06F2001242298E0CD71292A96E0562B22 +:100810005E2A11E5A7ED52300E19EB2A96E0722BF5 +:100820007321392CCD4E032A94E0ED5B11E57DD682 +:1008300001276F3001252294E0A7ED523850CD6892 +:10084000292A98E07DC601276F3001242298E0CD47 +:1008500071293E10CD750D3E0CCDEA0518C93E1D1F +:10086000CD750DCDD629CD120DCD48293E30CDEA1E +:1008700005CDBA28380D21E42BCD4E033AF9E03CE2 +:10088000C3F92721F92BCD4E03CDE805180ECDE88D +:10089000051101E52198E00602CD3606210000226F +:1008A00011E52113E57EA7C2B70B360521A223224D +:1008B00016E53E1A320EE5C3B70BCDE805CD5A2931 +:1008C0003A10E5D60228073E0AFACE283E055F3ADE +:1008D00013E5018000FE083009010001FE0330022B +:1008E0000E20ED4394E083875FFE0A20093A10E56D +:1008F000FE0328021E141600210CE0197E23229606 +:10090000E0B62003702B7121792BCD4E03CD8129C8 +:10091000A720023E1AC6401B1B1221942BCD4E036A +:100920002112E513CD9A0321B02BCD4E03CD6829BA +:1009300021CC2BCD4E032A96E013CD9A032A94E0C6 +:10094000ED5B11E5A7ED52C92100E101A400CDFA4C +:100950000501200221E080C3FA052100E101C60063 +:10096000CDFA0501200318EC11D9812195E0C39A35 +:10097000032199E0119782CD9303EB363023363073 +:10098000C93A0EE5FE1AD8D61AC921CC8011CC84FA +:10099000010210CDE70379362112231310F921CC7F +:1009A0008006053423232310FA361BCD812921CC60 +:1009B000800605FE05380C16033629231520FAD6C5 +:1009C0000510F0578787825FFE08381028013D36F2 +:1009D0002923D60818F22AF4E03AF6E03C57C6215B +:1009E000CB662807D606FE2020013D777AFE083820 +:1009F00002AF2C32F6E022F4E0C921CC80060F369B +:100A0000292310FB361F3E5A325280C900000020B5 +:100A10000000500000800000000100000200000300 +:100A200000000500000800001000088108544F2055 +:100A3000434F554E54494E55452047414D45222D73 +:100A4000820854494D4521468108424547494E4E4A +:100A5000455220434F5552534520474F205B214676 +:100A600081004348414D50494F4E20434F5552530A +:100A700045203120474F205B214C8200465245459E +:100A800020504C415921EA81004F4E4C59203120D1 +:100A9000504C4159455221EA810031204F522032B9 +:100AA00020504C415945525321068200504943542D +:100AB000555245204E554D42455220534554224AE9 +:100AC00082004E45585420315020425554544F4EC8 +:100AD000216A8100205055534820425554544F4EAE +:100AE0002021D48300435245444954202188810069 +:100AF00047414D45204F56455220504C4159455293 +:100B000020210C820047414D45204F564552212B54 +:100B1000800204250F1405224180010C0D250600DA +:100B2000224980093F224B800206504F494E5425EE +:100B300004001225050007226B8002062509001219 +:100B400025050007228B8002060E0F1011250500D7 +:100B5000122505000722AB8002081615151715157A +:100B60001815151915151A1515092281800131500E +:100B70003F21A1800132503F2125810154494D453B +:100B800020544F20524541434820504F494E542055 +:100B90005E005E21848100594F55522054494D45D5 +:100BA00020202020202020202020229781015D214C +:100BB000C481005448452041564552414745205480 +:100BC000494D4520202022D781015D210482015416 +:100BD0004F50205245434F524420202020202020B7 +:100BE00020205D21858200474F4F4420424F4E55C3 +:100BF0005320504F494E545321678200534F525255 +:100C000059204E4F20424F4E55535B216582015370 +:100C100050454349414C20424F4E555320504F4977 +:100C20004E545321258100434F4E47524154554C59 +:100C30004154494F4E53205B21E58201594F5520C5 +:100C4000484156452042524F4B454E204120524587 +:100C5000434F5244205B216A8100494E5345525410 +:100C600020434F494E2021C781003120504C41592B +:100C700045522020203120434F494E2021C581007C +:100C800041205F203120504C4159455220202031D5 +:100C900020434F494E2021C882005C313938322030 +:100CA0004952454D20434F52502F217680023A3B06 +:100CB0003C3D3E21F0F0EDF0F0FBFBFBF0E8F0F006 +:100CC000F0EEF0F0F0F0E0F0F0FBFBFBF0F0F0F213 +:100CD000F2F0F0F0E9F2EFE3D2FCFDFEE0D4D3EB6A +:100CE000FFD5F1E5E2D0D6E6D7F0E1D8F9FBF0F296 +:100CF000D9ECFCD1343232433423321123010000C9 +:100D00000000000012121224772110562110342105 +:100D1000232321312221110077776665554443331F +:100D200043332131009A51988D5FB630D206E3E308 +:100D3000EFC7F7B0FC9E008E03820677076E086649 +:100D4000095F0A59034881B0B1B2B3B402B5B6B76E +:100D5000B802B9BABBBCBD02BEBFC0C1C202C3C4E7 +:100D6000C5C6BD02036D81C7C8C9CA02CBBFCC02CC +:100D7000CDBCCECF02D0D1D2CA02D3D4D5C202D6F6 +:100D8000D7BCBD02D8C0C1C202D9BCC5DA02DBC122 +:100D9000DC02030682B0B1B2B3B402DDDEDFB8021A +:100DA000E0E1E202E3E4E50200E6B2E7E80200E99E +:100DB000EAEBEC0200EDEEEFB40200F0F1F202F328 +:100DC000F4F5BF02F7F8F9B0FA0200B2B3FBFC0287 +:100DD00000FDB80200FEBCCECF0200D0D1D2CA02C4 +:100DE00000D3D4D5C20200D6D7BCBD02C5BFC0FF58 +:100DF000EC02C30100000000000000000000000041 +:100E0000192F0802182F080215380D0415380D0483 +:100E1000154210041533100001000E0409002404CB +:100E20000D00240411010806170108061D0108061B +:100E300023010A0225010A0227010C0128011C01D5 +:100E400029011C012A011C012B011C012C011C0180 +:100E50002D0400012E0400012F04000130040001C4 +:100E6000310400013184000131C40001314400012A +:100E700032040001330400013404000133C40001D2 +:100E800034C4000136040001368400013704000137 +:100E900036C400013644000137C40001380900019E +:100EA000390000013A09020205002C013D0A28011F +:100EB0003E0100013F01000140010001410100012C +:100EC00042071A8045071A8046071A8047071A808A +:100ED00047471A8046471A8045471A8043071A0138 +:100EE00044071A0143871A0144471A010000000011 +:100EF0000000000048011A8049011A804A011A8046 +:100F0000350A2A804B011A804C011A804D011A8043 +:100F10004E0100C04F0110C0530110C0570110C056 +:100F20005B0112C061031EC062031EC063031EC0CA +:100F3000640314C0680314C06C0316C06E0316C0AB +:100F40007808220270020404730206047402180472 +:100F5000750220047A011A804B411A804C411A8094 +:100F60007B09260207002C017D0E2E0100000000E7 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF000000000000000000000000000000000A34E +:00000001FF diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpa-4.3j.hex b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpa-4.3j.hex new file mode 100644 index 00000000..f5703f2d --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpa-4.3j.hex @@ -0,0 +1,257 @@ +:100000000102020303040405600158015001480184 +:100010004001380139103920393039483960397098 +:100020003980399839B039D0B438FF588E28B4386F +:100030000019242C33393E43484C5054585B5F62BE +:1000400065686B6E717477797C7E505E6B8787A272 +:10005000A2A30200A4A50200A6A702A8A901AA02C1 +:10006000ABACAD0200AEAF02B0B101B2B3B40200AE +:10007000B5B6B702000000B8B902000000BA02002D +:10008000BBBCBD02BEBF01C0C10200C2C3C40200EE +:100090000000C5C602000000C7C80200C9CACB02E2 +:1000A000CC01DADBDC020000F0030000F00200000B +:1000B000F002DDDEDF010F04050F24270F43481196 +:1000C000484E124E5310636813686C0F6C6D146DBC +:1000D0006E126E7410898EFF0C0303030201FF3B46 +:1000E000FF70FC24B9FF10FC243B01A0FC5300006E +:1000F0000000000000000000000000000000000000 +:10010000070A0D0F1113151618191A1B1D1E1F2093 +:10011000212223242526272828282828FF1F011CE0 +:10012000040C0024021D0520080C043405210607D8 +:10013000070C0C14051E081E0F0C1234021B031AA8 +:1001400006102142021D041D080F2742052006202B +:100150000B0C2F4209160222061C3A4E0E190326DA +:10016000071C404E121D052A0A1C474E0520052675 +:10017000080C51450519051F110C587F081E041E57 +:10018000090C6900001B161C171A722000000000E1 +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000002040301010304060708070502040608A7 +:10021000090B0103040607090A0C0D0C0A0807055F +:100220000301020405040201030506080705030291 +:100230000406080A0B0D0B0907050102030202015F +:1002400004060708060401020406080A0C0B0A0546 +:10025000020307090A0C0B0903030709090B0A0A21 +:100260000A0908080706060404020405070807052A +:1002700003000202020202F8F8F8F8F8F8F80202A5 +:10028000020202F8F8F8F8F802000000000000008E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:100300003EFFD3C032C5E12100E13600545D130148 +:10031000CF00EDB03E01570100082100E07A775E82 +:10032000BBC2BB34230B79B020F37A0730E81655F3 +:100330007A0100082100E077233C5F0B79B028099F +:100340007BFEAB20F23E5518EE7A0100082100E05A +:10035000BE2019233C5F0B79B028097BFEAB20F04F +:100360003E5518EC147AFEAB20C618095E57AFC391 +:10037000BB347A18DE3100E83E0157010008210045 +:10038000807A775EBB2808CD3B35CB4FCAF5332347 +:100390000B79B020EC7A0730E116557A010008217C +:1003A000008077233C5F0B79B028097BFEAB20F2FD +:1003B0003E5518EE7A010008210080BE2019233C2A +:1003C0005F0B79B028097BFEAB20F03E5518EC148A +:1003D0007AFEAB20C6180D5E57CD3735CB4FCAF528 +:1003E000337A18DADD21EB33C3B13521663ADD21EA +:1003F000F533C365342100E13600545D1301CF00AD +:10040000EDB0210000AF3200E706000E10AFAE23C2 +:1004100010FC0D20F9E5CD3534E13A00E73CFE044F +:1004200020E4AFD31CFB3A00D0CB4F20F93E03327F +:1004300001E7C3CD35F5FEFF28020E0821863A09F3 +:10044000EB3A00E70F0F4F21C48009E5EB0E08EDF2 +:10045000B01313D5FDE1DDE1F1CD9A343A00E7C6E2 +:1004600030DD7703C97E23FE00280B5E2356234F21 +:100470000600EDB018EFDDE90F0F0F0FE60FC630E5 +:10048000FE3A3802C607FD7700DDE9E60FC630FE0A +:100490003A3802C607FD7701DDE9F50F0F0F0FE6C9 +:1004A0000FC630FE3A3802C607FD7700F1E60FC6E8 +:1004B00030FE3A3802C607FD7701C908D9DD21C4EC +:1004C00034C3B13521723ADD21CE34C36534D9FD50 +:1004D000218F80DD21DB347CC37834DD21E3347C63 +:1004E000C38B34FD23FD23DD21EF347DC37834DD60 +:1004F00021F7347DC38B34FD219580DD2103357ACE +:10050000C37834DD210B357AC38B34FD219980DD2E +:100510002117357BC378347BDD211F35C38B343AFB +:1005200000D0CB47CA2F35CB4F20F408C3F5330892 +:10053000B7CA7233C32433E5D91809E5D9DD21449C +:1005400035C3B1352100801100E001A004EDB021D8 +:1005500000803600545D13019F04EDB021723ADD36 +:10056000216635C36534D9FD218F807CCD9A34FD59 +:1005700023FD237DCD9A34FD2195807ACD9A34FDDB +:100580002199807BCD9A34E13A00D0CB472806CB25 +:100590004F281018F3D92100E011008001A004EDCC +:1005A000B0D9C921A0843600545D13015F03EDB0BA +:1005B000C921008401FF033600545D13EDB0210012 +:1005C0008001FF033600545D13EDB0DDE9CDAD3899 +:1005D00021BF3ECD08393A01E70602CD1C393A0069 +:1005E000D0CB4720143A01E7074F0600DD21963AA9 +:1005F000DD09DD6E00DD6601E9DD2102E7CDDD38D4 +:1006000047E655FE55280978E6AAFEAA281318CE13 +:10061000DD360055DD360108DD360201CD323618F3 +:10062000BDDD3600AADD360103DD3602FFCD3236F0 +:1006300018ACDD56001E02CDC838280ECD4E36DD72 +:1006400056001E01CDC83820F3C9CD4E36C93A0137 +:10065000E7DDBE01C80600CD1C39DD86023201E7A8 +:100660000602CD1C39C9CDAD3821103BCD08393A31 +:1006700003D021CB80CDB2363A04D0210B81CDB24C +:1006800036DD21AC3AFD21A83A3A03D0EEFF06024E +:10069000CDC636DD21F83AFD21F43A3A04D0EEFF1A +:1006A0000601CDC536CDEC363A00D0CB4F20C0C3C5 +:1006B000CD35EEFF06080F380436301802363123E8 +:1006C0002310F3C90F0F4FC5DDA600DD8601DD2322 +:1006D000DD234F0600FD6E00FD6601094EFD6E0232 +:1006E000FD660309CD1139C17910D9C93A04D0CBBF +:1006F00057CA063721773BCD0839DD21993BFD21CB +:100700009B3B06011810217F3CCD0839DD21923C2E +:10071000FD21963C06023A03D0EEFF0F0FCDC43602 +:10072000C9AF320FE7676F220DE7CDAD3821223D0B +:10073000CD08393A00D021CB80CDB2363A01D02154 +:100740000B81CDB2363A02D0214B81CDB236CD8C61 +:10075000373A0DE7218C81CD7A37233A0EE7CD7AEF +:10076000373A00D0CB4F20CB3A01D0CB4F20C4CD6D +:10077000AD383E01CD3C39C3CD35F50F0F0F0FE637 +:100780000FC6307723F1E60FC63077C9210FE73A5D +:100790004EE0E6C0BEC8320FE73A0EE7C601273288 +:1007A0000EE7D03A0DE7C60127320DE7C92A533DBF +:1007B0002206E721683DFD21573DCDC037C3CD3529 +:1007C000FD220BE7E5CDAD38E1CD0839DD2108E7A5 +:1007D0003E013205E70602CD23393E010E40CD3EF3 +:1007E00039CD7238CD7D383EFF3211E73A00D0CB9B +:1007F0004F284ACDF238E6AAFE2A2813CDDD384725 +:10080000E655FE55281178E6AAFEAA281D18DDCD6A +:100810007238CD7D3818D5DD3600553A06E7DD77DC +:1008200001DD360201CD4F3818C2DD3600AA3A0785 +:10083000E7DD7701DD3602FFCD4F3818AFCD7238D6 +:100840003E010E20CD3E393A00D0CB4F209EC9CD7F +:100850007238DD56001E02CDC838280FCD9538DD20 +:1008600056001E01CDC83820F31803CD9538CD7D34 +:1008700038C93E003200D0CBFF3200D0C93A05E77C +:100880004F0600FD2A0BE7FD09FD7E003200D0CBAC +:10089000FF3200D0C93A05E7DDBE01C80600CD230E +:1008A00039DD86023205E70602CD2339C9210080F1 +:1008B00001FF033600545D13EDB021008401FF03F6 +:1008C0003600545D13EDB0C90E00060CCDE238A21F +:1008D000C810F90D20F41D20EF3EFFA2C9CDE2386B +:1008E000181F2110E73A01D01FCB161FCB167EEE42 +:1008F000FFC92111E73A00D01FCB161FCB167EEEA1 +:10090000FFF5AF3D20FDF1C97EFE00C8CD113918BD +:10091000F74E0600235E235623EDB0C94FD60307DA +:100920003C18014FC50E640600600707076F2929B0 +:1009300009EB21008419C170237079C90E000600EB +:1009400010FE0D20F93D20F4C9C50E00060010FE72 +:10095000F53A00D0CB4F2809F10D20F03D20EBC136 +:10096000C9F1C10601C9CDAD381100E1216D3E01CB +:100970001000EDB01160E1217D3E011000EDB03AB4 +:1009800000D0CB4F20F92100E13600545D1301BFA8 +:1009900000EDB0C3CD353E013212E7AF3211E7189A +:1009A0002A3A00D0CB4FCACD35CDF238E6AAFE2A7E +:1009B00020EF3A12E73C3212E7FE01280EFE02CA8F +:1009C000E839FE03CA133AD60318EBCDAD38211C23 +:1009D00081061A3E5A772B3D10FB210C82060A3EF7 +:1009E00039772B3D10FB18B9CDBA3821208036F36A +:1009F000545D1301BF03EDB0218D3E060AC55E2391 +:100A0000562346234E237E23EBCD233AEBC110ED34 +:100A1000C3A139212084360C545D1301BF03EDB00E +:100A2000C3A139C5E5772310FCE10E2009C10D20D3 +:100A3000F2C9CDAD382120800E1E060FC506003646 +:100A400094545D23369323EBEDB0EB0E1E36965493 +:100A50005D23369523EBEDB0EBC110E03A00D0CB2F +:100A60004F20F9C3CD3508848052414D0000004F1E +:100A70004B0010848052414D0000004E4700005D45 +:100A8000000000005D00524F4D0000004F4B524FE0 +:100A90004D0000004E470000000000006636213780 +:100AA000AD3766399639323AB03AB83A03000304A2 +:100AB0000004080C101B263101738135017381334A +:100AC000017381320173813108ED8131300033309F +:100AD00000353008ED81323000343000363008ED1A +:100AE00081000000000000313008ED8100000000AE +:100AF00000004E4FFA3AFC3A0100000A07B1825456 +:100B000041424C45000007B1825550524947485474 +:100B1000168480444950005357003100320033009E +:100B200034003500360037003803C6805357310390 +:100B300006815357320B6481504154524F4C00434D +:100B40004152530DA481455854454E4400504F49DD +:100B50004E545308F68154484F5553414E4409248E +:100B600082434F494E004D4F444509A482424F44B1 +:100B700059005459504500012E82001A6482000029 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000F009F3BAF3B0082 +:100BA00010203040506060708090A0B06060C00D38 +:100BB000318231434F494E000031504C4159000DB4 +:100BC000318232434F494E530031504C4159000D50 +:100BD000318233434F494E530031504C4159000D3F +:100BE000318234434F494E530031504C4159000D2E +:100BF000318235434F494E530031504C4159000D1D +:100C0000318236434F494E530031504C4159000D0B +:100C10003182000000000000000000000000000D14 +:100C2000318231434F494E000032504C4159530DEF +:100C3000318231434F494E000033504C4159530DDE +:100C4000318231434F494E000034504C4159530DCD +:100C5000318231434F494E000035504C4159530DBC +:100C6000318231434F494E000036504C4159530DAB +:100C7000318200465245450000000000000000019E +:100C80002E82410B6482434F494E004D4F44450034 +:100C90004200030003049A3CA23C00102030405064 +:100CA00060700D318231434F494E000031504C414C +:100CB00059000D318232434F494E530031504C415F +:100CC00059000D318233434F494E530031504C414E +:100CD00059000D31820046524545000000000000D9 +:100CE00000000D718231434F494E000032504C419B +:100CF00059530D718231434F494E000033504C41DE +:100D000059530D718231434F494E000035504C41CB +:100D100059530D718231434F494E000036504C41BA +:100D200059530F8B803100320033003400350036C8 +:100D30000037003804C4804B4559300404814B45CA +:100D400059310444814B45593206848154494D49F7 +:100D50004E47000E01000000011011121314161767 +:100D6000181B1C1D1E1F00000B278053004F005531 +:100D7000004E004400530E4481303700535041432D +:100D80004500504C414E540D648130380055464F5B +:100D900000464C59494E470C84803031004558502C +:100DA0004C4F53494F4E0EE48030340043415200C3 +:100DB0004D495353494C4510C48030330055464F7C +:100DC000004558504C4F53494F4E10A480303200CC +:100DD000504F494E540050415353414745070481F9 +:100DE000303500434F494E0B248130360043415289 +:100DF000004A554D501484813039004241434B0024 +:100E000047524F554E44004D555349430FA481312D +:100E10003000454E44494E47004D5553494310C498 +:100E2000813131004F50454E494E47004D55534991 +:100E3000430FE48131320053544550005041535325 +:100E4000414745110482313300434F4E47524154CC +:100E5000554C4154494F4E10248231340043415285 +:100E6000004558504C4F53494F4E000000A80138E0 +:100E700060A84138989081386090C13898680138EE +:100E800060684138985081386050C138982084207B +:100E90000700008720070800852008020086050853 +:100EA00005058604080C09860508060E8604080454 +:100EB000128605080317860408001B860508080E1D +:100EC000848030310000444950005357495443480E +:100ED0000CC48030320000493F4F00504F52540A3A +:100EE000048130330000534F554E44530D4481303C +:100EF00034000043484152414354455209848130F3 +:100F0000350000434F4C4F520FC481303600004231 +:100F100045414D0041444A55535400000000000033 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000003EE +:00000001FF diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpb-1.3n.hex b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpb-1.3n.hex new file mode 100644 index 00000000..bee982ff --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpb-1.3n.hex @@ -0,0 +1,257 @@ +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000301CC +:100030000000000000000000A0A0A000A0A0B8F0F8 +:1000400000000000000000000000001F7FFFF80318 +:1000500000000000000000000000000080C000FE62 +:100060000000000000000000000000000000000090 +:100070004000000000000000000000000000000040 +:10008000030000000000000000000000000000006D +:10009000F21E000000000000000000000000000050 +:1000A000187E7EFFFFFF7E7E18000000000000002B +:1000B0000000000000000000000000000000000040 +:1000C000187E7EFFFFFF7E7E18000000000000000B +:1000D0000000000000000000000000000000000020 +:1000E00000307878FCFC78783000000000000000D8 +:1000F0000000000000000000000000000000000000 +:1001000000307878FCFC78783000000000000000B7 +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000104000301C6 +:1001300000000000000000010103030000000000B7 +:100140000000000C3E78F3E7ECC800010103030156 +:100150000000002070F8E040400080C0E0F0F0E0D7 +:100160000306000000010307070707030100000062 +:10017000C3870F0F0FCFE7E3F0F0E0E0C00000000F +:1001800081C0C0E0E0C0C0800000000000000000AE +:10019000E0C00000000000000000000000000000BF +:1001A000000000000000000000000E1F3F3F3F3F26 +:1001B000000000080012B0E8381C040000808E1F08 +:1001C00000000000000000000000081E1F0F0300D8 +:1001D0000000000000000000000000008080E0E05F +:1001E0001F0E0000000000000000000000000000E2 +:1001F0003F3F3F3F1F0E00000000000000000000D6 +:100200000283800000000207070F0F0707030000AA +:100210002080E0707830100080C0C0808000000036 +:100220000000000006010100000000006019070343 +:100230000201211110080DCFE77F7FFFFCF0C08085 +:100240000000101089890B1F1FBE1C080000000051 +:10025000404482828EDFFFFF81000000000000002A +:1002600000080810103060E1F3FF7F3F0F0000002E +:100270000000000000404080008080C6F8E08080E0 +:1002800003010103071D61010003030408000000CE +:1002900000000000008080C0C0F37F3830102020B4 +:1002A00000000000000040E0E0F9FF7F12100808A5 +:1002B0000000000000003C7E7EFFBD3910102020B1 +:1002C0000303030307070E1C1C3EF6F360202010F7 +:1002D000C0800080C06020180000000080804000C6 +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000C1F1F3F3F36 +:10030000000000000000000000307CFDFFFFFFFF48 +:10031000000000000000000000C7FFFFFFFFFFFF1C +:1003200000000000000000000080C0F0F8FCFCFEAF +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:100350001F3F3F3F1F0F070100000000000000008B +:10036000FFFFFFFFFFFFFFB10000000000000000E3 +:10037000FFFFFFFFFFFFFCF0E000000000000000B7 +:10038000FEFCFCF8F0F8F83000000000000000006F +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000101004B +:1003B0000000000000000001010333FFFFFFFFFF0A +:1003C00000000000000000C0E6EFFFFFFFFFFFFF9E +:1003D000000000000000183C7DFFFFFFFFFFFFFF53 +:1003E00000000000000000C0E0ECFEFEFCFCF8FC99 +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:100410007F3F7FFFFF7D38300000000000000000BC +:10042000FFFFFFFFFFFFFFFF7C78300000000000B0 +:10043000FFFFFFFFFFFFF7F3E06000000000000098 +:10044000FEFEFEFCD8C0C0800000000000000000DE +:10045000000000000000000000000000000000009C +:100460000000000001030F1F1F1F0F0F06000000F8 +:10047000000000008EFFFFFFFFFFFFFF30000000C5 +:1004800000000030FFFFFFFFFFFFFFFFC60000007E +:100490000000000000C0F0F8F8F8F0F030000000B4 +:1004A0000000000001070F1F1F1F0F0301010000C4 +:1004B000000000009CFFFFFFFFFFFFFFF3C00000F4 +:1004C00000000070FCFFFFFFFFFFFFFFFB6000006C +:1004D00000000000C0E0F0F0F0F0E0E040000000BC +:1004E00000000000000C3F7F7F3F0C000000000078 +:1004F0000000000000F0FCFEFEF4C0000000000060 +:10050000000000000000022C0000000000000000BD +:1005100000000000002070F06000000000000000FB +:100520000000000000000432000000000000000095 +:10053000000000000060F0702000000000000000DB +:1005400000000000000001010000000000000000A9 +:100550000000000060F0F8F8F8F060000000000013 +:10056000000000010303030103010100000000007B +:100570000000D0F8FCF8FCFCFCFCF8D00000000007 +:10058000000307070F0F070F0F0F070303010000FA +:10059000F0FCFEFEFFFFFFFFFEFFFFFEFCB80000C9 +:1005A000000000000000000000183878787CFEFE93 +:1005B000000000000000000000000000000000003B +:1005C000000000000E1F1F1F7F7F7FFFFFFFFFFF48 +:1005D000000000000060E0E0E0E0F0F0F0F8FCFC7B +:1005E00000030307070F0F3F3F7F7FFFFFFFFFFF62 +:1005F00000C0E0E0F0E0E0F0F0F0E0F0F0F8FCFE49 +:1006000007070F1F1F3F3F3F3F7F7F7F7FFFFFFF9A +:10061000000080808080E0F0F0F0F0F8F8F8F8F862 +:1006200000000000010307070707030100000000A6 +:100630000000000080C0E0E0E0E0C08000000000BA +:10064000000000030F0F1F1F1F1F1F0F0F030000CD +:1006500000000080E0E0F0F0F0F0F0E0E08000006A +:10066000000000030F0F1F1F1F1F1F0F0F030000AD +:1006700000000080E0E0F0F0F0F0F0E0E08000004A +:10068000000000030F0F1F1F1F1F1F0F0F0300008D +:1006900000000080E0E0F0F0F0F0F0E0E08000002A +:1006A0000000000000000000010000000000000049 +:1006B00000000000000080000000000000000000BA +:1006C000030F0F1F1F3F3F3F3F3F3F1F1F0F0F03F2 +:1006D000C0F0F0F8F8FCFCFCFCFCFCF8F8F0F0C012 +:1006E000030F0F1F1F3F3F3F3F3F3F1F1F0F0F03D2 +:1006F000C0F0F0F8F8FCFCFCFCFCFCF8F8F0F0C0F2 +:100700000307FFFF0F0F0003377BCE8484CE7B31BE +:10071000E0F0F0F8F8F800C0E6DE73212173DE8C1B +:1007200000003C000000000000000000000000008D +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:10075000000000787E3F1E0C003C3C0007000000BB +:10076000000000000C1F1F3F0000010003000000FC +:10077000000000000080C08000F8F800C000000009 +:10078000000000000000000000E0E00000000000A9 +:100790000000000000000000000000000000000059 +:1007A0008484FC0000000000000000000000000045 +:1007B0000000000000000000000000000000000039 +:1007C00000000000010307070F0F070100000000F1 +:1007D0000000000080E0E0F0F0F0E0C00000000069 +:1007E000000002070F1F3F3F1F1F1F0F03010000E4 +:1007F0000000C0C0E0F0E0F0F0F0E0E080000000B9 +:1008000000000001070F0F1F1F1F0F1F0600000031 +:1008100000000080E0F0F8F8F8F0F8F04000000088 +:100820000000000D0F3F3F3F7F3F1F1F0F030000E1 +:10083000000060F0F8FCFCFCF8F8FCF8F820000080 +:1008400000000000000002003C7FFC3800000000B7 +:10085000000000000000800078FC7E3800000000EE +:100860000000000000000004000010010000000073 +:100870000000000000800020000000A00000000038 +:10088000000000000001080000000201000000005C +:1008900000000000100000101000000040000000E8 +:1008A00000000000030F3FFFFF3F070000000000B3 +:1008B00000000000C0F0FCFFFFFCE00000000000B2 +:1008C00000000000030F3FFFFF3F07000000000093 +:1008D00000000000C0F0FCFFFFFCE0000000000092 +:1008E00000000000030F3FFFFF3F07000000000073 +:1008F00000000000C0F0FCFFFFFCE0000000000072 +:1009000000000000000103070301030204000000CF +:10091000000000001060C0C0E08080404020000067 +:1009200000080400000603072F0F1B2349210200C3 +:100930000000000000E080C0E080800080400000F7 +:1009400002814432090D0703074D0000000000003A +:10095000022088B0E1F4F8F0A6108C02000000003C +:100960000000000000000003000000000000000084 +:1009700000000000000000E0000000000000000097 +:100980000000000000040201000000000000000060 +:100990000000000000000000804000000000000097 +:1009A0000000000000010101010101000000000041 +:1009B0000000000000000000000000000000000037 +:1009C00000140F5C30E62FDF0F070301000000006A +:1009D00000A0C0E4388DE6F7E080000000000000D1 +:1009E0000000000000000000000000000000010105 +:1009F000000000000000000000020F2F39F0C0824C +:100A0000000000000000000000C0F4FE9F0F034142 +:100A10000000000000000000000000000000C0C056 +:100A2000030707060E0000000000000000000000A1 +:100A30000F1F3F3C783C0E07020000000000000042 +:100A4000E0F8FCFC3E78E0C0800000000000000000 +:100A5000E060703818000000000000000000000096 +:100A60000000000000000000000000000307070372 +:100A70000000000000000002273F3FFFF9F0E0C542 +:100A8000000000000000002060FBFF7F1F0B82A021 +:100A90000000000000000000000000C0C0C0E0E056 +:100AA0000F0E1E1E3C0000000000000000000000B1 +:100AB000871F3F3F7F7F1F0F0702000000000000DD +:100AC000F0F8F8FCFEFCF8F0E0E0C0800000000068 +:100AD000F07CFC3C1E000000000000000000000054 +:100AE00000000000000000090507070F0F1F1F7D11 +:100AF00008040D8F5FFFFFFFFFEFF7F2E0E0C0009B +:100B00002040E0F8FCFEFFFFDFBF3F1D0B070301A5 +:100B10000000000000408090E0E0E0F4F8F8F8BC4D +:100B20003E3E3E1C7000000000000000000000007F +:100B3000000108050F1F070204000000000000006C +:100B4000000090A0F0E0C0C0A00000000000000085 +:100B5000783C3C1A0E00000000000000000000007D +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000010074 +:100B80000000000000000000000000000000200045 +:100B90000000000000000000000000000000000055 +:100BA000000000000100000101030B07070F0F1FE9 +:100BB00001271F3F3FFFFFFFFFFFFFFFFFFEFCF886 +:100BC00020E4F8FEFFFFFFFFFFFFFFFFFFFF3F0FE7 +:100BD0000000000000808080D0E0E0F0F0F8F8F83D +:100BE0001F1F1F0F0703030100000000000000008B +:100BF000C0E0F0F4FCFEFFFF7F3F3F0F0301010068 +:100C0000030F1F3F7FFFFFFFFEFCF8F8F0C08000DE +:100C1000F8F0E0E0C000000000000000000000006C +:100C200000000201211414422214983804800000AC +:100C30000000005000A4284042442C01020C000097 +:100C400000001010090D861048080804000000007C +:100C50008000808004A848111012240000000000C9 +:100C6000012510090945472E3280100000080000B8 +:100C7000001094A0E2F4341D0E04080000080000E7 +:100C80000000000000000000000000000000000064 +:100C9000000000000000000000000010000482526C +:100CA000000000000000000000008080404182CA77 +:100CB0000000000000000000000000000000000034 +:100CC00000000000080701001228060400000000D0 +:100CD0005129BB5F3FBEFC980804000000000000E3 +:100CE000D4DCFEFC991A0E0C12000000000000007B +:100CF00000008000000080000020D0808000000004 +:100D000000000000000000000000000000000000E3 +:100D100004010101080804241495554F2FBF7F7F5B +:100D2000000000008088C242C4CCCCD8F8F9FEFC98 +:100D300000000000000000000000000000000000B3 +:100D40000008260323100808F70000000000000038 +:100D50007FFF7F3CB8380C8808040000100020009A +:100D6000FEFCFF7F262010000000000000100000A5 +:100D70000040800020400000100000000000000043 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E0000000000183F7FEF8D181101020000000064 +:100E10000020102000F0F0E0E0C0800000000000A2 +:100E200000000000000002000000000001000000BF +:100E30000000000008180000001838309181000000 +:100E400000000000000040000000000080000000E2 +:100E50000000000000000000000000000000000092 +:100E6000000403030100187CFF8F3F3C6101030273 +:100E7000804040606020000080F0F0F0E0C00000A2 +:100E80000108040C030100187CFF8F3F3C61010343 +:100E90000080C040606020000080E0F0F0E0C00012 +:100EA0000108040602070100187C7FCF9F1C312136 +:100EB0000080C0C060606020000080E0F0F0E0C012 +:100EC000000003020000000000000000010000001C +:100ED0000000000000000000000000000100000011 +:100EE0000000C04040000000000000008000000042 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F20000000000000000000000000008000000041 +:100F300000000000000000000000000000000000B1 +:100F4000000000000204010802000402000000008A +:100F50000000000080002000A00040800000000091 +:100F600000000000000000000C3EFF1E0C0000000E +:100F7000000000787E3F1E0C003C3C000700000093 +:100F80000000000000000000000E3F06000000000E +:100F9000000000787E3F1E0C003C3C000700000073 +:100FA00000000000000000000018250509052518B4 +:100FB000000000000000000000C62929292929C6D8 +:100FC0000000000000000000001825251925251844 +:100FD000000000000000000000C62929292929C6B8 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:00000001FF diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpb-2.3m.hex b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpb-2.3m.hex new file mode 100644 index 00000000..180ca65c --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpb-2.3m.hex @@ -0,0 +1,257 @@ +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:100020000000000000000000000000000000000EC2 +:10003000000000000040404040404041434F470F17 +:10004000000000000000000000007EFFFFFFFFFF37 +:1000500000000000000000000000000080C0F0016F +:100060003F7FFFFFFFFFFF7F000000000000000058 +:10007000FFFFFFFFFFFFFFFF000000000000000088 +:10008000FCFFFFFFFFFFFFFF00000000000000007B +:100090000DE1FCFCFCFCF8F8000000000000000092 +:1000A0000840021898190024000000000000000019 +:1000B0000000000000000000000000000000000040 +:1000C00010024018199800420800000000000000CB +:1000D0000000000000000000000000000000000020 +:1000E0000000480030B4004800000000000000009C +:1000F0000000000000000000000000000000000000 +:1001000000200000B43000001000000000000000DB +:1001100000000000000000000000000000000000DF +:1001200000000000000000000004040202010000C2 +:10013000000000000003030F0F0F0F1F3F1F9FBFA2 +:100140000000007CFFFFFCF8F3F7FFFEFEFCFEFE64 +:1001500000001098880010B8F8F8F0301000100077 +:1001600000010F1F1F3E3C3C38181C00000000001F +:100170003C7CF0F0F8B0100290000000400000005D +:10018000FC302020000040000000000000000000C3 +:1001900000800000000000000000000000000000DF +:1001A0000000000000000F1F3F3F1500200C0C2036 +:1001B0000000000204040810C0E3FBFFFFFFF3F09F +:1001C0000000000000000000307CFFFFFFFFFFFF89 +:1001D0000000000000000000000000C0C0C0E0E01F +:1001E000000200000000000000000000000000000D +:1001F000200C2C000108000000000000000000009E +:10020000FDFC7FFFFF7F3F1800030B000002000092 +:10021000C070108084CCE8F0602040000000000036 +:1002200000000000000000000000000000000000CE +:10023000000000000000000000000000030F3F7FEE +:10024000000000202020E0E0E041E3EFFFFFFFFF9F +:1002500000000000000000007FFFFFFFFFFFFFFF26 +:100260000000000000000000000080C0F0FFFFFF61 +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000FFFFFFFFFF7F7F3F3F0C000000000000DB +:1002A000FFFFFFFFFFFFBF1F1F0600000000000051 +:1002B000FFFFFFFFFFFFC38181000000000000007F +:1002C000FCFCFCFCF8F8F0E0E0C0000000000000DE +:1002D000000000000000000000000000000000001E +:1002E0000000000000000003000000000000031DEB +:1002F000000102121109CD67377F7F3360E0C0C76C +:10030000040808101038B8FDFFCF8302000060F920 +:10031000028444444266F7FFFFC80000187DFFFFD7 +:1003200000000404081870E1FB7F3E0F07C3E3E1FF +:100330000000000000106080000060980080C0F0A5 +:100340000000000101030608000000000000010099 +:10035000E74F4FC7E3B0183E3F3763414182020089 +:10036000FFFFFFCF8700004EFFFF3B101020202033 +:10037000FFFFFFBB0000030F1FFFEFCBC94444206A +:10038000F1F3E3470F0607CFFD7C381C040201019F +:10039000880080C0E0601080C0C0202010000000F5 +:1003A00000000000000000000002070F070E1E1FE3 +:1003B0000000010B1F1F3F7EFEFCCC000001030765 +:1003C0000000C1F3FFFFFF3F1910000060F9FFFFBD +:1003D0000080C0F3FFFFE7C382000000E3CFFFFF10 +:1003E000000000B0F8FCFE3E1F13010183C3C78369 +:1003F00000000000000000008080C0E0F0F0E0F0AD +:100400001F0F1F0F0707030100000000000000007E +:1004100087C380000082C7CFFF7F7F3F330000008B +:10042000FF7F3F0D000000008387CFFFFFF3200018 +:10043000FFFFFDD80000080C1F9FFFFEFC600000BE +:10044000E1C18103273F3F7FFEFCF0E06000000038 +:10045000F0E0E0C0C080800000000000000000006C +:10046000030707777E7CF0E0E1E17070393F1F0DF4 +:1004700000CEFFFF710068FFFF990000CFFFF380FF +:1004800039FFFFCF0000CFFFFFCF000039FFEFC3E0 +:1004900080C0F0FCFE3E0F87C6060C0ECEFCF0308E +:1004A0000000000001070F1F1F1F0F0301010000C4 +:1004B000000000009CFFE7800091FFFFF3C00000F8 +:1004C00000000070FCFF9301008193FFFB600000BF +:1004D00000000000C0E0F0F0F0F0E0E040000000BC +:1004E00000000000000C3F70733F0C000000000093 +:1004F0000000000000F0BC0E1EF4C0000000000070 +:1005000000000000000000200000000000000000CB +:1005100000000000002070F06000000000000000FB +:1005200000000000000004000000000000000000C7 +:10053000000000000060F0702000000000000000DB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:1005700000000000000060F0F060000000000000DB +:10058000000000010303010303010100000000005B +:100590000000B0F8FCFCFEFCFCFCF8980000000039 +:1005A00000000000000000000008081828000226D3 +:1005B000000000000000000000000000000000003B +:1005C0000000000002000800010306801021000066 +:1005D000000000000060E0E0E0203070D0183C1C1B +:1005E0000003000004080800000004080082C08026 +:1005F00000C0E060702060501030203030783C7EC9 +:1006000007070307090102020400000408000000B4 +:10061000000080808080E0303050102848000000CA +:1006200000000000000000000201000000000000C7 +:1006300000000000000000000000000000000000BA +:100640000000000000000000080804020000000094 +:10065000000000000000000000000000000000009A +:10066000000000000000040808080000000000006E +:10067000000000000000000000000000000000007A +:100680000000000000030000000000000000000067 +:10069000000000000080400000000000000000009A +:1006A0000000000000000103010000000000000045 +:1006B00000000000000080C080000000000000007A +:1006C00000000000000008080808080402000000FC +:1006D000000000000000000000000000000000001A +:1006E00000000003040800000000000000000000FB +:1006F000000000C00000000000000000000000003A +:100700000000FEFF000003000104317B7B3100008C +:10071000000000000000C00080208CDEDE8C0000A5 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:10075000000000787E3F1F0F1F0F0F1F07000000D3 +:100760000000000030E0E0C0FFFFFFFF03000000DA +:100770000000000000000070FCF0F0F0C00000007D +:10078000000000000000000000E0E00000000000A9 +:100790000000000000000000000000000000000059 +:1007A0007878000000000000000000000000000059 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000101010000000000000026 +:1007D00000000000000080C0C08000000000000099 +:1007E00000000000000103070703010000000000F3 +:1007F00000000000008080C0C0C080000000000039 +:1008000000030F1E3871732767637060391F06007D +:1008100000C0F07C1C8EC6E4E4CE860CBCF8C000A0 +:10082000060F3F327046CFCF87CF66E0703C1F0780 +:10083000C0F09C0C46E2F3E2F7F7C30606DCF8B022 +:100840000000000001070F0F030000380000000047 +:100850000000000000C0E0E0800000380000000060 +:100860000001030707070305183C7E7F7E3C180044 +:100870000080C0E0E0E0C0A0183C7EFE7E3C180096 +:1008800000000000183D7E7E7E3C1A010000000042 +:100890003078FCFCFC783010103078FCFCFC7830B0 +:1008A00000000000000000001C0300000000000029 +:1008B0000000000000000000000000000000000038 +:1008C00000000000000000000C0300000000000019 +:1008D0000000000000000000008000000000000098 +:1008E0000000000000000000040300000000000001 +:1008F000000000000000000000C000000000000038 +:100900000000000904020020C018230204000000B7 +:10091000000080001060C040001000504020000027 +:100920000000002011092400200A1A2349110200A6 +:10093000000040808C1060000840A01040200000A3 +:10094000028124320800B86C0002071D2040891083 +:10095000022088B0E174381040E07CD28884001016 +:100960000000000000000103010000000000000082 +:1009700000000000000080E0800000000000000097 +:10098000000000000004030303000000000000005A +:100990000000000000008080804000000000000097 +:1009A0000000000000050303030101000000000037 +:1009B0000000000000408080800000000000000077 +:1009C00000140F5C30E040C0000000000000000098 +:1009D00000A0C0E4380D0607000000000000000081 +:1009E0000000000000000000000000000100010500 +:1009F000000000000000000004024F2F39F0C0800A +:100A0000000000000000000020C0F4FE9F0F030162 +:100A10000000000000000000000000800000C0D0C6 +:100A2000030707060E0000000000000000000000A1 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A5000E060703818000000000000000000000096 +:100A600000000000000402020100201403070753E5 +:100A70000404404222200402573F3FFFF9F0E0C047 +:100A8000100020220204442060FBFF7F1F0B0200A5 +:100A90000000000000001020800020C4C8C0E0EA70 +:100AA0000F0E1E1E3C0000000000000000000000B1 +:100AB00080000000000000000000000000000000B6 +:100AC0000000000000000000000000000000000026 +:100AD000F07CFC3C1E000000000000000000000054 +:100AE00000000000000000090507070F0F1F1F7F0F +:100AF00008040D8F5FFFFFFFFFFFFFFFFFFFFFFFFA +:100B00002040E0F8FCFEFFFFFFFFFFFFFFFFFFFFBD +:100B10000000000000408090E0E0E0F4F8F8F8FC0D +:100B20003F3F3F1F7F030100000000000000000066 +:100B3000FFFEF7FAF0E0F8FDFB7F5F1F0F030101F6 +:100B4000FFFF6F5F0F1F3F3E5EF4F0E0C08080004C +:100B5000F8FCFCFEFEC0C0800000000000000000A9 +:100B6000000000000000000000040303010343270D +:100B700000000001000121131B1F1FBFFFFFFFFF2B +:100B80000000000000040898D8FEFEFFFFFFFFFFF2 +:100B9000000000000000000000102060E0C0E0F253 +:100BA0003F1F1F1F1F1FBF7F7F3F7F7F7F7FFFFC78 +:100BB000FFFFFFFFFFFFFFFFFFFEFCF0D0C0800044 +:100BC000FFFFFFFFFFFFFFFFFFFF9F0F0100000080 +:100BD000F4FCF8F8FDFEFCFCFDFEFEFEFE7F3F0F80 +:100BE0007020000000000000000000000000000075 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100004000000000000000000000000000000D0 +:100C2000000000002010104021131F3F1F3F3F1DF8 +:100C30000000005000202040C0C0F0F9FAFCF8DCB1 +:100C400000000000010181034767F7FB7F7F3F7BC6 +:100C500080008080008080C8E0E2C4ECDEFEFECC34 +:100C600000040000004040213D9F7FFFFFFF7B39D3 +:100C7000000004000000C0E1F0F8FEFFFFFFFF46A7 +:100C80000000000000000000000000000000000064 +:100C9000000000000000000000000010000402122C +:100CA000000000000000000000000000000000083C +:100CB0000000000000000000000000000000000034 +:100CC00000000000080701001029070703030100C6 +:100CD00011098B4F2FBFFFFFFFFFFFFFF7FBFB71DA +:100CE0001010B2F4F9FAFEFCFEFEFEFFF7EFCF9E05 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D10000000000000000020101010080889454560 +:100D20000000000000000000404080808811226424 +:100D300000000000000000000000000000000000B3 +:100D400000080603030307070F0F0707030301004B +:100D50006737371FBFBFBFFFFFFFFFFFFFFBBB7141 +:100D6000E6F8F9FFFEFEFFFFFFFFFFFFFFFFDF8E4C +:100D70000040800020408080D0C080808000000043 +:100D80000000000000000000000000010303030257 +:100D900000000000000000000000E060F8F8F4FE31 +:100DA000010100182E7E7E3D7F6F3600000000009E +:100DB000FEFCD8300002070D0F0666B0F878600020 +:100DC000000000000000000000000000000103051A +:100DD00000000000000000000000000000C0A0E0D3 +:100DE0000F0F07020100081C1A2E3E180000000019 +:100DF000D0F0F0E0C0183E3E5D7F7F360E0400006C +:100E0000010F1F07000000000000000000000000AC +:100E1000B0F0F0F0F0000000000000000000000062 +:100E2000000000000000000000000001071F3F79E3 +:100E3000007E7E7E7E7E7E3C7E7EFFFFFFFFE7C3E0 +:100E4000000000000000000000000080E0F8FC9EB0 +:100E50000000000000000000000000000000000092 +:100E600000040303070F0703000000000000000058 +:100E70008040406060E0F0F0700000000000000082 +:100E80000108040603070F0703000000000000002C +:100E90000080C0406060E0F0F070100000000000D2 +:100EA000010804060207070F070300000000000006 +:100EB0000080C0C0606060E0F0F0701000000000D2 +:100EC000000000000000000000000001071F3F7943 +:100ED0007E7E7E7E7E3C3C7E7E7EFFFFFFFFE7C304 +:100EE000000000000000000000000080E0F8FC9E10 +:100EF00000000000000000000000000000000000F2 +:100F0000000000000000000000000001071F3F7902 +:100F1000000020647E3C3C7E7E7EFFFFFFFFE7C337 +:100F2000000000000000000000000080E0F8FC9ECF +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F6000000000000000000000060F060000000066 +:100F7000000000787E3F1F0F1F0F0F1F07000000AB +:100F8000000000000000000000060F060000000046 +:100F9000000000787E3F1F0F1F0F0F1F070000008B +:100FA0000000000000000000003C21213905053848 +:100FB000000000000000000000C62929292929C6D8 +:100FC00000000000000000000098A5A5A5A5A598B8 +:100FD000000000000000000000C62929292929C6B8 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:00000001FF diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-1.3l.hex b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-1.3l.hex new file mode 100644 index 00000000..2c6736ca --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-1.3l.hex @@ -0,0 +1,257 @@ +:1000000000000000400000000000000000000000B0 +:10001000000000000000000000000000000000CC14 +:1000200000000000000000000000000000000000D0 +:10003000000000000000000000000000760000004A +:100040000000000060000000000000000000000050 +:10005000000000000000000000000000000000CCD4 +:100060000000000000000000000000000000000090 +:1000700000000000000000000000000076600000AA +:100080000000000060000000000000000000000010 +:10009000000000000000000000000000000011EE61 +:1000A0000000000000000000000000000000000050 +:1000B000000000000000000000000000FEF0000052 +:1000C00000000000701100000000000000000000AF +:1000D000000000000000000000000000000011EE21 +:1000E0000000000000000000000000000000000010 +:1000F000000000000000000000000000FFF0000011 +:1001000000000000703388000000000000000000C4 +:10011000000000000000000000000000000010FFD0 +:10012000800000000000000000000000000000004F +:10013000000000000000000000000011F7F10000C6 +:1001400000000000F133CC000000000000000000BF +:10015000000000000000000000000000000010FF90 +:100160008088000000000000000000000000000087 +:10017000000000000000000000000011F6F3000085 +:1001800000000000F177CC0000000000000000003B +:10019000000000000000000000000000000010F659 +:1001A000C088000000000000000000000000000007 +:1001B000000000000000000000000011FFF7000038 +:1001C00000000000F1FFE600000000000000000059 +:1001D000000000000000000000000000000010F718 +:1001E000D1880000000000000000000000000000B6 +:1001F000000000000000000000000011FFFF0000F0 +:1002000000000010F1FFEE00000000000000000000 +:10021000000000000000000000000000000010FFCF +:10022000F388000000000000000000000000000053 +:10023000000000000000000000000030FFFE000091 +:1002400000000010F3FBEE000000000000000000C2 +:10025000000000000000000000000000000310FF8C +:10026000F188000000000000000000000000000015 +:10027000000000000000000000000031FFFC000052 +:1002800000000030F3F9FE00000000110000000043 +:10029000000000000000000033000000000F10FE0E +:1002A000F3CC00000000000000000000000000008F +:1002B000000000000000000000000070FFF80000D7 +:1002C000000000F0F3FDFA0000000011988000002B +:1002D000000000000000000033000000080F30FEA6 +:1002E000F7CC00000000000000000000000000004B +:1002F00000000000000000000000CC71FFF8C0000A +:10030000000000F0F1FFF00000000033B8800000B2 +:10031000000000000000000033880000080930FFE2 +:10032000F3CC00000000000000000000000000000E +:1003300000000000000000000000CCF8FFFCC0003E +:10034000000000F0F1FFF00000000033E8C0000002 +:10035000000000000000000033A80000090C30FF7E +:10036000F3CC000000000000000000770000000057 +:1003700000000000000000000000FFF8FFFEC000C9 +:10038000000010F0F3FFF00000000077F8C000005C +:10039000000000000000000075EC0000090871FF7B +:1003A000FBCC00000000000000000077000000000F +:1003B00000000000000000000000F7FCF7FCE00077 +:1003C000000030F0F1FFF80000000077F0C00000FE +:1003D000000000000000000075FC0000090871FF2B +:1003E000FBCC0000000000000000007700000000CF +:1003F00000000000000000000000F7FCF7F8E0003B +:10040000001030F0F1FFF88000000077F0E000000D +:10041000003300000000000077FC80000B0870FE35 +:10042000FFCC000000000000000000776600000024 +:1004300000000000000000000000F7FEFFF8E000F0 +:100440000030B0F0F3FFF880000000FFF8E000009B +:100450000033880000000000F7F880000B0C70FEED +:10046000FFC400000000000000000077EE00000064 +:1004700000000000000000000000F7FEFFFCE000AC +:100480000030F0FDFBFFFC80000000FFF8E0000002 +:100490000033880000000000F3F88000060C71FEB5 +:1004A000F7C400000000000000000077EECC000060 +:1004B00000000000000000000000F7FCFFFCE0006E +:1004C00000F0F0FFFDFFFCC4001111FFF8E0000098 +:1004D0000077C00000000000F7FCC080000471FF3E +:1004E000F6D5000000000000000000FFF7C4000087 +:1004F00000000000000000000000F3FEFFF8E00034 +:1005000000F0F0F7FEFFFCC40033BBFBF0E000009E +:1005100000FFC000000000D0F3FDD080000270FF9B +:10052000F6D5000000000000000000FFF7C4000046 +:1005300000000000000000000000F3FFFFF0E000FA +:1005400030F0F0FBFFFFFFE00033FFF7F0F40000B6 +:1005500000FFC800000010F0F3FDF880000070FFFD +:10056000F6DDCC0000000000000000FFFFCC000022 +:1005700000000000000000000022F7FFFFF0F00084 +:1005800070F0F3FDFFFFFFE80077FFFFF8FC0000CD +:1005900011FEC000000010F4F7FFFC80000078FF9F +:1005A000FEFFCC0000000000000000FFFBCC0000BC +:1005B00000000000000000000033F7F7FEF0F080BC +:1005C00071F8F7FFFFFFFFF033FFFFFDF0F80000C9 +:1005D00011FCE0C0000010FCFFFFFCC00000F3FEB7 +:1005E000FEFFEE0000000000000000FFFBCC00005A +:1005F00000000000000000000033F7F7FEF0F0E01C +:10060000FFFAF7FFFFFFFFF1FFFDFFFCF1F0C00075 +:1006100033F8E0C0000011FEFFFFFDC40000F3FE50 +:10062000FFFFEE0000006600000033FFFFCC00007B +:1006300000000000000000000033F7F7FFF0F1F1C8 +:10064000FFF2FFFFFFFFFEF3FFF0FFFEF0F0C00040 +:1006500033F8E0E0000033FFF7FFFFF80033F3FE6C +:10066000FFFFFF8800007766000033FFFFCC00002B +:10067000000000000000000000FFFFFBFFF3F3FD9F +:10068000FFF3FFFFFFFFFCF7FEF0FFFFF0F0E000DD +:10069000BBFEE0E0000033FFFFFFFFF800FFF7FFC5 +:1006A000FFFFFF88000077EC000033FFFFCC000065 +:1006B0000011CC000000000011FDFFFBFEF7F7FB6E +:1006C000FEF7FFFFFFFFFFFCF8F0F7FEF0F0E01190 +:1006D000FFFCF0E00000FFFFFFFFFFFC88FFF7FFDB +:1006E000FFFCFF880011FFEC000033FFFDCC000091 +:1006F0000011CC000000000011FCFFFFFDFEFFF721 +:10070000FDFFFFFFFFFFFFFBFCF8FFF8F0F1F0112A +:10071000FFFCFCF10000FFFFFDFFFFF288FFF7FF89 +:10072000FFF8F3880011FFEA000077FFFFEC0000FC +:100730000011FE000000000011FCFFFFFFFFFFFFA3 +:10074000FBFFFFFFFFFFF7FFFDF9FFFEF6F3F811D8 +:10075000FFF9F9F98011FFF7FDFFFEF599FFFBFFA7 +:10076000FFF0F3880030FFEE000077FBFFE80000A9 +:100770000011FEC00000000011FDFFFFFFFFFFFFA2 +:10078000FFFFFFFFFFFFFFFFFFFDFFFDFFF3FC3358 +:10079000FFF7F9FB8011FFF1FFF8FEF599FFFFFF6E +:1007A000FEF0F0EE0031FFEE000077FBFFEA000004 +:1007B0000011FEC00000000011F9FFFFF7FFFFFF6E +:1007C000FFFFFFFCFFFFFFFFFFFEFFF9FFF7FEB398 +:1007D000FEFFFFFB8011FEF0F3FFFEFF99FFFFFF1E +:1007E000FFF1F5EE0031FFFE0000FFFEF7E600002E +:1007F00010F3FDF00000000017FDFFFFFBFFFFFFFF +:10080000FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF708 +:10081000FFFFFFF3C073FEF0F3FFFCFFBBFFFCF72D +:10082000FFF1FFEE00F1FFFC0000FFFEFFFF000004 +:1008300010F3FBF000000011F9FFFFFDFCF3FFFFD8 +:10084000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C4 +:10085000FFFFFEFFC073FCF4FBFFFBFFBBFFFFF7D6 +:10086000FFFBFFFF88F3FFFC0010FFFEFFFFC0004F +:1008700010F7FFF480000032F8FFFFF9FEF1FFFFF0 +:10088000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7A +:10089000FFFFFFFFC8F7FCF4FFFFFFFFFFFFFFFBB9 +:1008A000FFFBFFFF98FDFFF00030FFFEF7FFC000E9 +:1008B00070FFFFFC80000074F9F7FFFFFFF0FFFFFF +:1008C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE39 +:1008D000FFFFFDFFE8F7F8FEFFFFFFFFFFFFFFFD53 +:1008E000FFFBFFFFF8FEFEFCE030FFF7FFFFC0005C +:1008F00070FFF7FC800000F8FBF7FFFFFFFAFFFF37 +:10090000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10091000FFFFFDFFFCF7F2FEFFFFFFFFFFFFFFFF02 +:10092000FFFFFFFFF9FFFDFEE030FFF7FFFEC40011 +:1009300071F7F7FD8010CCF2FBF7FFFFFFFFFFFF21 +:10094000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10095000FFF9FBFFFCF7FFFFF7FFFFFFFFFFFFFFC4 +:10096000FFFDFFFFFDFFFFFFF074FFF3FFFEF70049 +:10097000F1F3FBFB8010FFFFF3FBFFFFFFFFFFFF27 +:10098000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10099000FFFFFBFFFCFFFFFFFBFFFFFFFFFFFFFF72 +:1009A000FFFEFFFFFFFFFFF6F0F8FFF7FFFCF7CCBD +:1009B000F3F7FFFBC030FFFFF3FDFFFFFFFFFFFF7B +:1009C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:1009D000FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF28 +:1009E000FFFFFFFFFFFFFEFEF0F0FFF7FFFBFFFF43 +:1009F000FBFBFFF7FBF9FFFFFBFFFFFFFFFFFFFF25 +:100A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:100A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:100A2000FFFFFFFFFFFFFFFCF0F0FCF3FFFFFFFF06 +:100A3000FFFFFFF7FFFFF7FFFDFFFFFFFFFFFFFFD8 +:100A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:100A5000FFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFAE +:100A6000FFFFFFFFFFFFFFF9F4F5FCF7FFFFFFFEBD +:100A7000FFFFFFFFFFF7FFFFFEFFFFFFFFFFFFFF8F +:100A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:100A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:100AA000FFFFFFFFFFFFFFF7F6F7FCFFFFFFFFFD74 +:100AB000FFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFF4E +:100AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:100AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:100AE000FFFFFFFFFFFFFFFFFEFFFCF7FFFFFFFB26 +:100AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:100B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:100B1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:100B2000FFFFFFFFFFFFFFFFFCFFF8F7FFFFFFFFE7 +:100B3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:100B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:100B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:100B6000FFFFFFFFFFFFFFFFFBFFF8F7FFFFFFFFA8 +:100B7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:100B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:100B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:100BA000FFFFFFFFFFFFFFFFFFFFF8F1FFFFFFFF6A +:100BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:100BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:100BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:100BE000FFFFFFFFFFFFFFFFFFFFF0F0FFFFFFFF33 +:100BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:100C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:100C1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:100C2000FFFFFFFFFFFFFFFFFFFFF0F3FFFFFFFFEF +:100C3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:100C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:100C5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:100C6000FFFFFFFFFFFFFFFFFFFFF0F7FFFFFFFFAB +:100C7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:100C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:100C9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:100CA000FFFFFFFFFFFFFFFFFFFFF0F1FFFFFFFF71 +:100CB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:100CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:100CD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:100CE000FFFFFFFFFFFFFFFFFFFFF0F0FFFFFFFF32 +:100CF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:100D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:100D1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:100D2000FFFFFFFFFFFFFFFFFFFFF0F3FFFFFFFFEE +:100D3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:100D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:100D5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:100D6000FFFFFFFFFFFFFFFFFFFFF4FFFFFFFFFF9E +:100D7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:100D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:100D9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:100DA000FFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFF5B +:100DB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:100DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:100DD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:100DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:100DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:100E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:100E1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:100E2000FFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFD6 +:100E3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:100E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:100E5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:100E6000FFFFFFFFFFFFFFFFFFFFFFF1FFFFFFFFA0 +:100E7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:100E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:100E9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:100EA000FFFFFFFFFFFFFFFFFFFFFEF0FFFFFFFF62 +:100EB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:100EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:100ED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:100EE000FFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFF1E +:100EF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:100F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:100F1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:100F2000FFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFD5 +:100F3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:100F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:100F5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:100F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:100F7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:100F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:100F9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:100FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:100FB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:100FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:100FD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:100FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:100FF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:00000001FF diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-2.3k.hex b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-2.3k.hex new file mode 100644 index 00000000..d3867b31 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-2.3k.hex @@ -0,0 +1,257 @@ +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:10008000000000000000000000000000000000C0B0 +:100090000000E00000000000000000000000000080 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C000000000000000000000000000000011EC33 +:1000D0000030F00000000000000000000000000000 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:10010000000000000000000000000000000077FF79 +:10011000C0F0FFC000000000000000000000000070 +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:100140000000000000000000000000000000FFFFB1 +:10015000FCF3FFC8000000000000000000000000E9 +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:100180000000000000000000000000000033FFFF3E +:10019000FCF3FFF800000000000000000000000079 +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C00000000000000000000000000000FFFFFF32 +:1001D000F0FFFFF000000000000000000000000041 +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000033FFFFFCC1 +:10021000FFFFFFF0C0000000000000000000000031 +:1002200000000000000000000000000000000000CE +:100230000000000000000000000000C000000000FE +:10024000000000000000000000000000FFFFFFF3BE +:10025000FFFFFFF0F00000000000000000000000C1 +:10026000000000000000000000000000000000008E +:100270000000000000000000003310F0000000004B +:10028000000000000000000000000011FFFFFFFF61 +:10029000FFFEF0F0F0000000000000000000000091 +:1002A000000000000000000000000000000000004E +:1002B0000000000000000000003398F480000000FF +:1002C0000000000000000000000000FFFFFFFCFF36 +:1002D000FFFFFEF0F0C00000000000000000000082 +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000077FCFEC0000000CD +:100300000000000000000000000033FFFFFFF3FFCB +:10031000FFFFFFFCF0F00000000000000000000004 +:1003200000000000000000000000000000000000CD +:10033000000000000000000000FFFFFFC000000000 +:1003400000000000000000000000FFFFFFFFFFFFB3 +:10035000FFFFFFFCF0F08000000000000000000044 +:10036000000000000000000000000000000000008D +:10037000000000000000000000FFFFFFE800000098 +:1003800000000000000000000077FFFFFFFCFFFFFF +:10039000FFFFFFF0F0F0E0000000000000000000B0 +:1003A000000000000000000000000000000000004D +:1003B000000000000000000011FDFFFFF0800000C1 +:1003C000000000000000000011FFFFFFFFFFFFFF23 +:1003D000FFFFFEF0F0F0F0800000000000000000E1 +:1003E000000000000000000000000000000000000D +:1003F000000000000000000033F9FFFEF280000062 +:100400000000000000000000FFFFFFFFFFFFFFFFF4 +:10041000FFFFFCF0F0F0F0F000000000000010C062 +:1004200000C000000000000000000000000000000C +:10043000000000000000000077FBFFF9FEC0000094 +:100440000000000000000077FFFFFFFFFFFFFFFF3D +:10045000FFFFF0F0F0F0F0F080000000000010E08E +:1004600070E000000000000000000000000000003C +:100470000000000000000000FFFFFFF7FFF0000099 +:1004800000000000000033FFFFFFFFFFFFFFFFFF42 +:10049000FFFCF0F0F0F7F0F0F0000000000033F89F +:1004A000F0F8000000000000000000000000000064 +:1004B0000000000000000011FEFFFFFFFFF0000041 +:1004C000000000000033FFFFFFFFFFFFFFFFFFFF03 +:1004D000FFF8F0F0F1FFFCF0F0C000000000FFFEBC +:1004E000F1FCC0000000000000000000000000005F +:1004F0000000000000000033FDFFFFFFFEF0800061 +:100500000000000000FFFFF8FFFFFFFFFFFFFFFFFD +:10051000FCF0F0F0F7FFF8F0F0F000000000FFFF53 +:10052000F3FFE000000000000000000000000000F9 +:100530000000000000000077F9FFFFFFFCF0C000A2 +:1005400000000000FFFFF1FFFFFFFFFFFFFFFFFFC5 +:10055000F0F0F0F1FFFFF0F0F0F0C0000033FFFF2B +:10056000F7FFF8000000000000000000000000009D +:1005700000000000000000FFF3FFFFFFF3F0F000B9 +:100580000000FFFFFFF8FFFFFFFFFFFFFFFFFFFC83 +:10059000F3FEF6F7FFFEF0F0F0F7F00000FFFFFFCC +:1005A000FFFFFCC00000000000000000000033005E +:1005B000E0000000000011FCFFFFFCFFFFFCF0C0AA +:1005C00000FFFFFFFCF1FFFFFFFFFFFFFFFFFFF357 +:1005D000FFFFFFFFFFF8F3F6F1FEF0E033FFFFFF50 +:1005E000FFFFF8F00000000000000000000033CC26 +:1005F000F0000000000033F9FFFFFFFFFFF0F0E024 +:10060000FFFFFFFCF1FFFFFFFFFFFFF9FFFFFFFF11 +:10061000FFFFFFFFFEF0FFFFF7FCF0F0FFFFFFFF23 +:10062000F3FFF0F080000000000000000000FFFE7B +:10063000F48000000000FFFFFFFFFFFFFEF0F0FF6F +:10064000FFFFFFFFFFFFFFFFFFFFF8F7FFFFFFFFC9 +:10065000FFFFFFFFF9FFFFFFFFFFF8F3FFFFFFFCC6 +:10066000FFFCF1FCE0000000000000000000FFFFC4 +:10067000FEE000000033FFFFFFFFFFFFFCF5FFFF80 +:10068000FFFEF3FFFFFFFFFFFFFFFFFFFFFFFFFF87 +:10069000FFFFFFFFFFFFFFFFFFFEF0F7FFFFFFFF82 +:1006A000FFFCF7FEF0800000000000000011FFFFDB +:1006B000FCF080000077FFFFFFFFFFFFF0FFFFFF70 +:1006C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:1006D000FFFFFFFFFFFFFFFFFFFEF3FFFFFFFFFF37 +:1006E000FFF0FFFCF0E00000000000000077FFFFDB +:1006F000F8F0C00000FFFFFFFFFFFCF3FFFFFFFF6C +:10070000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:10071000FFFFFFFFFFFFFFFFFFF8FFFFFFFFF3FFFC +:10072000FCF3FFF0F0F080000000000000FFFFFF8E +:10073000F0F3F00033FCFFFFFFFFF3FFFFFFFFFFCD +:10074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10075000FFFFFFFFFFFFFFFFFEF1FFFFFFFCFFFFBB +:10076000FFFFFEF0F0F0E0000000000033FFFFFFAD +:10077000F1F7FEC077F3FFFFFFFFFFFFFFFFFFFF73 +:10078000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10079000FFFFFFFFFFFFFFFFF1FFFFFFFFFFFFFF77 +:1007A000FFFFFCF0F0F0F0000000000033FFFFF06E +:1007B000F3FFFCF3FFFFFFFFFFFFFFFFFFFFFFFF64 +:1007C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:1007D000FFFFFFFFFFFFFFFCFFFFFCFFFEF7FFFF38 +:1007E000FFFFF8F0F0F0F08000000011FFFFFFFCC9 +:1007F000FFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFF15 +:10080000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:10081000FFFFFFFFFFFFFFFFFFFFF0F3FFFFFFFF03 +:10082000FFFFF0F0F0F0F0E0000011FFFFFFFFFF2E +:10083000FFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:10084000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:10085000FFFFFFFFFFFFFFFFFFFFF8F7FFFFFFFFB7 +:10086000FFFCF0F0F0F0F0F0C000FFFFFFFFFFFF33 +:10087000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:10088000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10089000FFFFFFFFFFFFFFFFFFFFFCFEF3FFFFFF78 +:1008A000FFF0F0F0F6F0F0F0F0F3FFFFFFFFFFFFD6 +:1008B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:1008C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:1008D000FFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFF34 +:1008E000FCF0F0FCFFFBF2F0F0F0FFFFFFFFFFFF7A +:1008F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10090000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10091000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10092000F8F0F1FFFFFFFFF8F0F0F3FFFFFFFFFF2C +:10093000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10094000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10095000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA8 +:10096000F1FEF7FFFFFFFFFFF0F0F0FFFFFFFFFFDB +:10097000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:10098000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10099000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86E +:1009A000FFFFFFFFFFFFFFFFFCF2F0F0FFFFFFFF85 +:1009B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:1009C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:1009D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF730 +:1009E000FFFFFFFFFFFFFFFFF0FFFCFFF3FFFFFF35 +:1009F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:100A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:100A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:100A2000FFFFFFFFFFFFFFFCF3FFFFFFFCFFFFFFE8 +:100A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:100A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:100A5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:100A6000FFFFFFFFFFFFFEF1FFFFFFFFFFFFFFFFA5 +:100A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:100A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:100A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:100AA000FFFFFFFFFFFFF9FFFFFFFFFFFFFFFFFF5C +:100AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:100AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:100AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:100AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:100AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:100B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:100B1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:100B2000FFFFFFFFFFFCFFFFFFFFFFFFFFFFFFFFD8 +:100B3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:100B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:100B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:100B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:100B7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:100B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:100B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:100BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:100BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:100BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:100BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:100BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:100BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:100C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:100C1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:100C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:100C3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:100C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:100C5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:100C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:100C7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:100C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:100C9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:100CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:100CB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:100CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:100CD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:100CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:100CF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:100D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:100D1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:100D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:100D3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:100D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:100D5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:100D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:100D7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:100D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:100D9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:100DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:100DB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:100DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:100DD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:100DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:100DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:100E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:100E1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:100E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:100E3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:100E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:100E5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:100E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:100E7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:100E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:100E9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:100EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:100EB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:100EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:100ED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:100EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:100EF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:100F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:100F1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:100F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:100F3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:100F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:100F5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:100F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:100F7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:100F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:100F9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:100FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:100FB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:100FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:100FD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:100FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:100FF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:00000001FF diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-3.3h.hex b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-3.3h.hex new file mode 100644 index 00000000..bbd11c77 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-3.3h.hex @@ -0,0 +1,257 @@ +:1000000000000011000000000000000000000000DF +:10001000000000000000000000004400000000009C +:10002000000044020000000000000000000000008A +:1000300000000000000000000000000000000000C0 +:10004000000000110000010000000000000000009E +:10005000000000000000000000004402000000005A +:10006000000044020000000000000000000000004A +:100070000000000000000000000000000000000080 +:1000800000000011118F01000000000000000000BE +:10009000000000000000000000004402000000001A +:1000A000000044020000000000000000000000000A +:1000B0000000000000000000000000000000000040 +:1000C0000000001177EF0D000000000000000000AC +:1000D00000000000000000000000440200000000DA +:1000E00000004402000000000000000000000000CA +:1000F0000000000000000000000000000000000000 +:1001000000000000FFFF0F000000000000000000E2 +:100110000000000000000000000044020000000099 +:100120000011FF8F08000000000000000000000028 +:1001300000000000000000000000000000000000BF +:1001400000000011FDFB870000000000000000001F +:100150000000000000000000000044020400000055 +:100160000033FFCF0C000000000000000000000082 +:10017000000000000000000000000000000000007F +:1001800000000011FFFF8F000000000000000000D1 +:1001900000000000000000000022440204000000F3 +:1001A00000FFFFFF0F000000000000000000000043 +:1001B000000000000000000000000000000000003F +:1001C00000000011F3F3C300000000000000000075 +:1001D00000000000000000000022440204000000B3 +:1001E00011FFFFEF0F0800000000000000000000FA +:1001F00000000000000000000000000000000000FF +:1002000000000033FFFF8F08000000000000000026 +:1002100000000000000000010022330C0400001167 +:10022000FFFFFF8F0F0F080000000000000000001C +:1002300000000000000000000000000000000000BE +:1002400000000033FFFFCF080000000000000000A6 +:1002500000000000000000010022FF8F04000033B6 +:10026000FFFFFFFF8F0F0C000000000001000000E7 +:10027000000000000000000000000000000000007E +:1002800000000033FFFFCF08000000000000000066 +:1002900000000000000000010011FFEF0800003323 +:1002A000FFFFFFFFFF0F0C00000000000100000037 +:1002B000000000000000000000000000000000003E +:1002C00000004432FCFDE9080000000000000000CE +:1002D00000000000000000010011FFFF08000033D3 +:1002E000F5F5F5FAFA5A0C000000000001000000D4 +:1002F000000000000000000000330C0000000000BF +:1003000000004433FFFFCF08000000008811000008 +:1003100000000000000022010033F5FA0C0000117B +:10032000F5F5F5FAFA5A0800000000000100000097 +:10033000000000000000000011FF8F080000000016 +:1003400000004433FFFFCF080000000088110000C8 +:1003500000000000000022010077FFFF0E000033C4 +:10036000FFFFFFFFFF8F0C000000000005000000F2 +:10037000000000000000000033FFEF0C0000000050 +:1003800000004411F1F1E1000000000044220000EF +:1003900000000000000022010077FFEF0E00007750 +:1003A000F8FCF3FCF3E10E00000000000500000083 +:1003B000000000000000000077FFFF0E00000000BA +:1003C00000004411F1F1E1000000000044220000AF +:1003D00000000000000022010077FFCF0E00007730 +:1003E000FFFFFFFFFFEF0E00000000000500000010 +:1003F000000000000000000077FFFF0E000000007A +:1004000000004432FFFFCF0800000000224400003B +:1004100000000000000022110033FFFF0C0011FF5C +:10042000FFFFFFFFFFFF0F080000000005000000B6 +:100430000000000000000000FFFFFF8F0000000030 +:1004400000004411FFFFCF0800000000224400001C +:10045000000000000000220600327DB6840011F08A +:10046000FCF0FCF3F0F3F0080000000005000000D1 +:100470000000000000000000FFFFFF0F0000000070 +:10048000000055FFFFFFEF080000000022440000BD +:1004900000000000000011FF0833FFFF0C0011FFF7 +:1004A000FFFFFFFFFFFF8F0800000000EF080000C4 +:1004B0000000000000000000FFFFEF0F0800000038 +:1004C000000033FFFFFFEF0800000000118800006C +:1004D00000000000000033EF0C33FFFF0C0033FF7F +:1004E000FFFFFFFFFFFF8F0C00000011FF0C00005B +:1004F0000200000000000000F5F5FA5A08000000B4 +:10050000000077FFFFFFEF08000000331188CC00E8 +:1005100000000000000077F60E77FFFF8E0077FFE7 +:10052000EDEDFFFFB7B7CF0E00000033FF8E0000E8 +:100530000200000000000000FFFFCF0F08000000D5 +:10054000000077FFFFFFCF08000000779999EE00C9 +:1005500000000000000077FF0E77FFFF8E0077FF9E +:10056000EDEDFFFFB7B78F0E00000077FF8F0000A3 +:100570000200000000000000000000000000000079 +:100580000000FEFDF6F7CF08000000779999EE0015 +:1005900000000000000032760477FFFF8E0033FF7A +:1005A000FFFFFFFFFFEF0F0C00000074FDEF0000E6 +:1005B0000200000000000000FFFFFF0F0800000025 +:1005C0000000FFFFFFFF8F08000000331188CC0000 +:1005D00000000000000077FF0E75FAF5CA0033FF37 +:1005E000FFFFFFFFFFEF0F0C00000077FFFF00028F +:1005F0000200000000000000FFFFFF8F0800000065 +:100600000000FFFFFFFFEF0E0000001133CC880059 +:10061000000000000000FFFF8F77FFFFCF0000FF0A +:10062000FFFFFFFFFFCF0F00000000FFFFCF08021A +:100630000200000000000000FCF4F2C30000000013 +:100640000000FFF6FDFFEF0F000011FFFFFFCF08D6 +:100650000000000000FFFFFFEFFFFFFFCF080011C9 +:10066000FFFFFFFFFF0F0800000000FAF82F08024D +:100670000200000000000000FFFFFF8F00000000EC +:100680000000FFFFFFFFFF0F000033FBFDFBFD0C31 +:100690000000000011FFFFFFEFFFFFFFEF0E000063 +:1006A00077B7B66DFC0E0000000000FFFFCF080218 +:1006B000020000000000000077FFFF0E00000000B5 +:1006C0000000FFFFFFFFF7A50000FFFFFFFFFF8F08 +:1006D0000000000011FC7DF47FFFFFFFFF0E000013 +:1006E00033FFFFFFFF0C0000000000FFFFCF0802F8 +:1006F0000E0000000000000077FFFF0E0000000069 +:100700000000FEFFF6FFFF8F0011EDEDFCB7F3C315 +:100710000800000011F87DF43FFFFFFFFF0E00000E +:1007200033FFFFFFEF0C0000000011FFFFEF0C1183 +:100730008F0000000000000033FFCF0C000000001D +:100740000000FFFFFFFFFD8F0033FFFFFFFFFFCF24 +:100750000C00000011FFFFFFFFBFBFFAFD8F00007C +:1007600033FFFFFF8F0C0000000033FFFF8F0C33BF +:10077000CF0800000000000011FF8F0800000000FB +:100780000000FFFFFFFFFF8F0033FFFFFFFFFFFFB2 +:100790000C00000011FFFFFFFFD3D3FFFF8F00000D +:1007A00033FFF78F0F0C0000000077FFFFEF0C778F +:1007B000EF0800000000000000330C000000000003 +:1007C0000000FFFFFFFFFF8F0077FFFFFFFFFFFF2E +:1007D0000E00000011FFFFFFFFFBFBFFFF8F00007B +:1007E00033FFFFEF0F080000000077FFFFEF0E77E9 +:1007F000EF0C0000000000000074C20000000000C8 +:100800000000FFFFEFFFFF0F0077FFFFFFFFFFCFAD +:100810000E00000011FFFFFFFFFFFFFFFF8F000032 +:1008200011FFFFFF8F0800000000FFFFFFFFDEFF4A +:10083000E90C00000000000000778E0000000000BE +:100840000000FFFFEF7FF64B0077D3DBDBDBDBF84D +:100850000E00000011B66DFBB7FFFFF6F68F00002B +:1008600033FFFFFFCF0C00000000FCFDF9FBFFFC95 +:10087000F90C00000000000000770E0000000000EE +:100880000000FFFFEFFFFF8F0077DBDBDBDBDBE947 +:100890000E00000011FFFFFFFFFFFFFFFF0F000032 +:1008A00033FFFFFFCF0C00000000FFFFFFFFFFFC46 +:1008B000FF0C00000000000000778E000000000028 +:1008C0000000FFFFEFFFFF0F0033FFFFFFFFFFEF11 +:1008D0000C00000011FFFFFFFFFFFFFFFF0E0000F5 +:1008E00033FFFFFFCF0C00000000FFFFFFFFFFFF03 +:1008F000FF0C00000000000000778E0000000000E8 +:10090000000077FFCFFFFF0E0033FFFFFFFFFFEF79 +:100910000C00000011FFFFFFFFBFFFFFCF0E000024 +:1009200077FFFFFFEF0E00000000FEFAFAFADFFF8C +:10093000FB0C0000000000000077CE00000000006B +:10094000000077FF3FFFEF0E0011FFFFFFFFFFCF1B +:100950000800000011FFFFFFFFBFFFFFCF0E0000E8 +:1009600077FFFFFFCF0E00000000FFFFFFFFBFF982 +:10097000FF0C00000000000000778E000000000067 +:10098000000011FFFFFFCF080011FFFFFFFFFF0F67 +:100990000800000011FFFFFFFF1FFFFFCF0800004E +:1009A00077FFFFFF8F0E00000000FFFFFFFFBFFF7C +:1009B000EF0C00000000000000778E000000000037 +:1009C000000000FCFCFCE908000033FFEF2F0F0CD7 +:1009D0000000000000FFFFFFEF0FFFFFCF0000004F +:1009E00077FFFFFF0F0E0000000077FFFFFF7FFF84 +:1009F000EF0C00000000000000778E0000000000F7 +:100A0000000000FFFFFFCF08000011FFFFFFEF080D +:100A1000000000000000FFF90F0F7FFF8E000000B4 +:100A200077FFFFFFCF0E0000000077FF0F0F7FF56D +:100A3000C7080000000000000077CE0000000000A2 +:100A4000000011FFFFFFCF00000000FFFFFFCF00FD +:100A5000000000000000FFFFCF3FFFCF0E000000AE +:100A6000FFFFFFFFEF0F0000000011FFFFFF3FFF40 +:100A7000CF0000000000000000FF8F000000000019 +:100A8000000011FFFFFF8F0000000077FFFF8E00C6 +:100A900000000000000077FFEFFFFFCF0E00000016 +:100AA000FFFFFFFFCF0F0000000011FFFFEF7FFFF0 +:100AB000CF0000000000000011FF8F0800000000C0 +:100AC000000033FFFFFF8F0000000077FFEF0E00F4 +:100AD00000000000000077FFEFFFFFCF0E000000D6 +:100AE000FFFFFFFF0F0F0000000000FFFFCF7FEFB1 +:100AF0008F0000000000000000778E000000000062 +:100B0000000077FFFFFF8E00000000FFFFFF8F0057 +:100B100000000000000077FFFFFFFF8F00000000D3 +:100B2000FFFFFFCF0F0F0000000000FF7F0FFFEF60 +:100B30008F00000000000033FF338C0F0C0000001A +:100B40000000FFFFFFFF0E00000000FFFFFFCF00CF +:100B500000000000000077FFFFFFEF0F0000000023 +:100B6000FFFFFFFF8F0F000000000077FFCFFFEFB8 +:100B70000E00000000000033FFAA1DCF0C00000093 +:100B80000000FFFFFFFF0E00000000FDFAF5CF00A0 +:100B9000000000000000FEF7F8E70F0F0000000063 +:100BA000FFFFFFFFFF0F000000000077FFEF0F0FB8 +:100BB0000C000000000000FFFF8811FF0F00000084 +:100BC0000000F8F1F8F80F00000000FFFFFF8F00B1 +:100BD000000000000000FFFFFFFF0F0E00000000FC +:100BE000FFFFFFFFEF0F0000000000FFFFEF0F0F00 +:100BF00008000000000077FFFFFFFFFF0F0E00005E +:100C00000033FFFFFFFF0F0C000011FFFFCF0F08A5 +:100C10000000000077FFFFFFFFFFFF0E0000000055 +:100C2000FFFFFFFFCF0F0000000000FFFFFFFFCF1F +:100C300008000000000077FFFFFFFFFF8F0F00009C +:100C40000077FFFFFFFF0F0E000033FFFFFF0F0CC9 +:100C5000000000FFFFFFFFFFFFFFFFCF0F000000BE +:100C6000FFFFFFFF8F0F0000000000FFF7FDFFCF29 +:100C700008000000000076F6F6F4F2F69686000012 +:100C800000FFFFFFFFFF0F0F000077FFFFFFCF0EFA +:100C9000000000FFFFFFFFFFFFFFFFEF0F08000056 +:100CA000FFFFFFFFEF0F00000000FFFFF7FD0F0F3A +:100CB0000F0800000011FFFFFFFFFFFFCF0F08002C +:100CC00000FFF1F8FEF3F80F000077FFFFFFEF0ED3 +:100CD000000011FFFFFFFFFFFFFFFFFFCF08000035 +:100CE000FFFFFFFFFF0F00000077FFFFFFFFFF8FF9 +:100CF0000F0E00000011FAFAFAFAF5F5E5A5080062 +:100D000000FFFFFFFFFFCF0F0000FFFFFFFFCF0F30 +:100D1000000011FFFFFFFFFFFFFFFFFFEF0C0000D0 +:100D2000FFFFFFFFEF0F000000FFFFFFFFFFFFEFE0 +:100D30000F0F0C000011FFFFFFFFFFFFAFAF080018 +:100D40000077FFFFFFFFCF0E0000FFFFFFFFEF0F59 +:100D5000000033FFFFFFFFFFFFFFFFFFFF0C00005E +:100D6000FFFFFFFFCF0F000000FFFFFFFFFFFFFFB0 +:100D70008F0F0C000077FFFFFFFFFFFF8F0F0E00AC +:100D80000077FFFFFFFF8F0E0000FFFFFFFFCF0F79 +:100D9000000033FFFFFFFFFFFFFFFFFFFF0F00001B +:100DA000FFFFFFFF8F0F000000FFFFFFFFFFFFFFB0 +:100DB000FF8F0C000077FFF9FCF0F0CF0F0F0E0053 +:100DC0000077FFFFF0F30F0E0000FFFFFFFF8F0F14 +:100DD000000077FFFFFFFFFFFFFFFFFFFF0F000097 +:100DE000FFFFFFFF0F0F00000077FFFFFFFFFFFF78 +:100DF000FFCF0C000077FFFFFFFFFFFFFF8F0E000C +:100E000000FFFFFFFFFF0F0F0000FFFFFFFFEF0FCF +:100E10000000FFFFFFFFFFFFFFFFFFFFFF0F0000CE +:100E2000FFFFFFFF8F0F00000011FDF90F0F0F0FE5 +:100E30000F0F0C0000FFFFFFFFFFFFFFFFCF0F00B2 +:100E400000FFFFFFFFFF0F0F0000FFFFFFFFCF0FAF +:100E50000000FFFFFFFFFFFFFFFFFFFFFF0F00008E +:100E6000FFFFFFFFCF0F000077FFFFFFFFFFFFFF38 +:100E7000FF8F0F0800FFFFFFFFFFFFFFFFCF0F00F7 +:100E800000FFFFFFFFFFFF0F0000FFFFFFFFCF0F7F +:100E90000000FFFFFFFFFFFFFFFFFFFFFF0F00004E +:100EA000FFFFFFFFCF0F000077FFFFFFFFFFCF0F18 +:100EB0003FEF0F0800FFFFFFFFFFFFFFFFEF0F00F7 +:100EC00000FFFFFFFFFFEF0F0000FFFFFFFFEF0F2F +:100ED0000000FFFFFFFFFFFFFFFFFFFFFF0F00000E +:100EE000FFFFFFFF8F0F0000FFFFFFFFFFFFFFFF70 +:100EF000FFEF0F0C00FFFFFFFFFFFFFFFFEF0F00F3 +:100F000000FFFFFFFFFFCF0F0000FFFFFFFFCF0F2E +:100F10000000FFFFFFFFFFFFFFFFFFFFFF0F0000CD +:100F2000FFFFFFFF8F0F0000FFFFFFFFFFFFFFFF2F +:100F3000FFFF0F0C00FFFFFFFFFFFFFFFFCF0F00C2 +:100F400000FFFFFFFFFFCF0F0000FFFFFFFFEF0FCE +:100F50000000FFFFFFFFFFFFFFFFFFFFFF8F00000D +:100F6000FFFFFFFF0F0F0000FFFFFFFFFFFFFFFF6F +:100F7000FFFF0F0C00FFFFFFFFFFFFFFFFCF0F0082 +:100F800000FFFFFFFFFF8F0F0000FFFFFFFFCF0FEE +:100F90000000FFFFFFFFFFFFFFFFFFFFFFCF00008D +:100FA000FFFFFFEF0F0F0000FFFFFFFFFFFFFFFF3F +:100FB000FFFF0F0C00FFFFFFFFFFFFFFFF8F0F0082 +:100FC00000FFFFFFFFFF0F0F0000FFFFFFFF8F0F6E +:100FD0000000FFFFFFFFFFFFFFFFFFFFFFCF00004D +:100FE000FFFFFFCF0F0F0000FFFFFFFFFFFFFFFF1F +:100FF000FFEF0F0C00FFFFFFFFFFFFFFFF0F0F00D2 +:00000001FF diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-4.3f.hex b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-4.3f.hex new file mode 100644 index 00000000..197f16d3 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-4.3f.hex @@ -0,0 +1,257 @@ +:1000000000000000000000000010117FFF9C0800AD +:1000100000E0F8FCFCC84000000000000000000008 +:10002000FFFFFFFFFFFFF0F0FFFFFFFFFFFF0F0FDE +:10003000F0F0F0F0F0F0F0F00F0F0F0F0F0F0F0FC8 +:10004000F0F0FFFFFFFFFFFF0F0FFFF1FDFBF7F1E8 +:100050007F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFF30 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:10009000003078FCFCFC783000000000000000001C +:1000A000FFFFFFFFFFFF00000000FFFFFFFFFFFF5C +:1000B0000000FFDFEF07EFDF0000FF1F7F3F7F1F24 +:1000C0000000FF1FBFBFBF7F0000FF1F5F5F5F1FFC +:1000D0000000FF1FBFBFBFBFFF07070707FFFFFFEE +:1000E000FF07070707FFFFFFFF07070707FFFFFFE0 +:1000F000FF07070707FFFFFFFF07070707FFFFFFD0 +:100100000000000000000000FF00000000FFFFFFF3 +:10011000FF00000000FFFFFFFF00000000FFFFFFE7 +:10012000FF00000000FFFFFFFF00000000FFFFFFD7 +:10013000FF00000000FFFFFFFF00000000FFFFFFC7 +:10014000FF00000000FFFFFFFF00000000FFFFFFB7 +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:100170000000000000000000000000000000030379 +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F000000000000000000000000000003C0000C3 +:100200000000000000000000001C3663637F636391 +:10021000007E63637E63637E001E33606060331E16 +:10022000007C66636363667C007E60607C60607FE8 +:10023000007F60607E606060001F30606763331F16 +:10024000006363637F636363007E18181818187E69 +:10025000000303030303633C0063666C787C6E67F2 +:10026000006060606060607F0063777F7F6B6363C6 +:100270000063737B7F6F6763003E63636363633E0A +:10028000007E6363637E6060003E6363636B673D13 +:10029000007E6363677C6E67003C66603E03633E7E +:1002A000007E181818181818006363636363633EB0 +:1002B00000636363773E1C080063636B7F7F776333 +:1002C0000063773E1C3E7763006666663C1818182C +:1002D000007E7E0C18307E7E0307060C08006060EE +:1002E0003C4299A1A599423C00000000000000009A +:1002F00000000000000000000000000055000000A9 +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:10034000404040404040404050505050505040404D +:1003500000000000070301000000000000E0F8FCBE +:100360000000000000000001000000000000550037 +:1003700000337373000000007E7F7F3F1F0F1F0F4D +:1003800000008080C0C1E1E300000000FF00000029 +:1003900000000000FF00000000000000FF0000005F +:1003A00000000000FF00000000000000FF1F01032C +:1003B00000000000FFFFFFFF00000000008080C081 +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E00000070FFFFFFFFFFF0080E0F8FFFFFFFFA8 +:1003F00000000F3FFFFFFFFF0F0707C7FFFFFFFFD3 +:10040000F0F0F8FFFFFFFFFF660000C0E0F0F0F83B +:1004100066000000000000006600000000000070A0 +:1004200066000000000000006703010303000103F1 +:1004300066000003071F3F3FC0C0E1FFFFFFFFFF53 +:100440000007FFFFFFFFFFFF00C3FFFFFFFFFFFFEE +:1004500000C0FCFFFFFFFFFF000000F8FFFFFFFFF1 +:1004600000030F3FFFFFFFFFC0F1FFFFFFFFFFFF94 +:10047000FCFFFFFFFFFFFFFF0001C7FFFFFFFFFFC4 +:10048000C7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10049000C0C0C0C080FFFFFF0000000000000000DF +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000FFFFFF00007EFEC3 +:1004C000FCFCFCFCF8F8F8F8FCFCFCFCF8F8F8F88C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:100500003F3F3F3F7E7E7E7EF0F0F0F0E0E0E0E0B7 +:100510000000C0F0F8F8FCFCFFFFFFFFFFFFFFFF4B +:100520008080C0C0E0F0F8F8FEFFFFFFFFFFFFFF94 +:100530000000000001010F1F7FFFFFFFFFFFFFFF13 +:1005400000000303070F0F0F0F1FBFFFFFFFFFFF89 +:100550000000C0F0FCFEFFFF0000000000008080F3 +:10056000C0F0F0F0F0F8F8FCFEFFFFFFFFFFFFFF28 +:100570000000010103070F0F0F9FFFFFFFFFFFFFA9 +:10058000000003070F0F1F3F7FFFFFFFFFFFFFFF6D +:100590000000F0F0F0F8FCFCFEFEFFFFFFFFFFFFA5 +:1005A000FFFFFFFFFFFFFFFF0000000000808080D3 +:1005B00080E0F0F0F0F0F0F0F8FFFFFFFFFFFFFF4A +:1005C0000000808181C3E7FFFFFFFFFFFFFFFFFF08 +:1005D000010FFFFFFFFFFFFF000000000101030309 +:1005E00007070F1F3F3FFFFFFFFFFFFFFFFFFFFF5B +:1005F00000001F1F3F3F7F7F7FFFFFFFFFFFFFFFC9 +:100600000000F0F0F0FCFCFEFEFFFFFFFFFFFFFF2D +:100610000000000000808098FCFCFCFCFCFCFCFC62 +:10062000FEFEFFFFFFFFFFFF0000008080C0C0F064 +:10063000FFFFFFFFFFFFFFFF00030307070F1FFF81 +:10064000FFFFFFFFFFFFFFFF00010F0F1F1F1F1F17 +:100650001F1F3F3F3F3F3F7F7FFFFFFFFFFFFFFF2A +:1006600000001F3F7FFFFFFFFFFFFFF7FFFFFFFFC0 +:10067000FFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFF0A +:10068000000000F8FFFFFFFF00000FFFFFFFFFFF6C +:1006900000000F3FFFFFFFFF0000031FFFFFFFFFF2 +:1006A0000000C0FCFFFFFFFF0000E1FFFFFFFFFFB6 +:1006B0000000073FFFFFFFFF80FFFFFFFFFFFFFF7F +:1006C0000000E0FFFFFFFFFFF0FFFFFFFFFFFFFF66 +:1006D0000000F8FCFCFCFCFCFCFCFEFEFEFEFEFE4A +:1006E000FFFFFFFFFFFFFFFF1F3F3F3F3F3F3F3F3A +:1006F0003F3F7F7F7F7F7FFFFFFFFFFFFFFFFFFF0A +:1007000000FCFFFFFFFFFFFF00F0FFFFFFFFFFFF09 +:1007100000E0FCFFFFFFFFFF0080E0F8FFFFFFFFAE +:1007200000000000000000F000C3FFFFFFFFFFFF1C +:100730000FFFFFFFFFFFFFFF0000000000F0FFFFC3 +:10074000003FFFFFFFFFFFFF1F7FFFFFFFFFFFFFD8 +:10075000000000F0FFFFFFFF003EFFFFFFFFFFFF75 +:100760000000FCFFFFFFFFFF0000E0FFFFFFFFFFB7 +:10077000000003FFFFFFFFFF00030FFFFFFFFFFF6E +:100780000000FFFFFFFFFFFF000FFFFFFFFFFFFF66 +:1007900000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:1007A000000000000000000F00000000000000FF3B +:1007B000000000000000FFFF00000000000FFFFF2E +:1007C0000000000000FFFFFF00000000FFFFFFFF30 +:1007D0000000000FFFFFFFFF000000FFFFFFFFFF13 +:1007E000000000C3FFFFFFFF000000C7FFFFFFFF87 +:1007F00000003FFFFFFFFFFF00030FFFFFFFFFFFB2 +:100800000000000000000000FFFFFFFFFFFFFFFFF0 +:10081000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:10082000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:10083000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:10084000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:10085000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:10086000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:10087000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:10088000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10089000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:1008A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:1008B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:1008C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:1008D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:1008E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:1008F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10090000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10091000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10092000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:10093000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10094000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10095000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:10096000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:10097000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:10098000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10099000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:1009A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:1009B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:1009C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:1009D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:1009E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:1009F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:100A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:100A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:100A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:100A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:100A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:100A5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:100A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:100A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:100A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:100A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:100AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:100AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:100AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:100AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:100AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:100AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:100B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:100B1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:100B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:100B3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:100B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:100B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:100B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:100B7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:100B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:100B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:100BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:100BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:100BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:100BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:100BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:100BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:100C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:100C1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:100C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:100C3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:100C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:100C5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:100C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:100C7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:100C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:100C9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:100CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:100CB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:100CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:100CD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:100CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:100CF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:100D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:100D1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:100D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:100D3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:100D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:100D5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:100D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:100D7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:100D80000101010103030303070707070F0F0F0FFB +:100D90001F1F1F1F3F3F3F3F7E7E7E7EFCFCFCFCF3 +:100DA0000000000000000000F8F8FCFCFEFEFFFF61 +:100DB000FFFFFFFFCFCFC7C7838380800000000005 +:100DC00000000000000000000000000003030F0FFF +:100DD000BFBFFFFFFDFDF1F1C3C303030707070713 +:100DE0000F0F0F0F1F1F1F1F00000000000000004B +:100DF0003F3FFFFFFEFEFEFEFCFCFCFCF8F8F8F8AF +:100E0000F0F0F0F0E0E0E0E0C0C0C0C080808080A2 +:100E100000000000000000000000000000000000D2 +:100E20000003070F1F1F1F1F3F3F3F3F7E7E7E7E39 +:100E3000FFFFFF7F7F7F3F1FFFFFFFFFFFFFFFE100 +:100E400080000000010101030FFFFFFFFFFFFFFE15 +:100E50000000000000000000F0F8FCFCFEFEFEFEBA +:100E6000F0F0F0F0E0C08000000001030707070782 +:100E70003F3F3F1F1F1F0F07000000000000000042 +:100E80003FFFFFFFFFFFFFF8E0C0C0C08080808011 +:100E9000C3FFFFFFFFFFFFFFFCFEFFFFFFFFFF7F22 +:100EA0003F3F3F3F7E7E7EFEFCFCFCFCF8F0E08096 +:100EB0000000000081818181030303030707070706 +:100EC000FCFCFDFFFFFFFCF83CFFFFFFFF0F0707E7 +:100ED0000000000000000000000080C0E0E0E0E052 +:100EE0000000000000000000FFFFFFFFFFFFFFF019 +:100EF000E0E0E0E0C0FFFFFFFFFFFFFF00000000B9 +:100F0000FFFFFFFFFFFFFF010000000103FFFFFFE6 +:100F1000FFFFFFFF00000000C0F0FCFEFEFEFEFE33 +:100F2000FEFEFEFEFCFCFCFCF8F8E0000000000009 +:100F3000000103070F0F0F0F7F7F7F3F3F3F1F070A +:100F400000000000000000007FFFFFFFFFFFFFF038 +:100F5000C08080800000000187FFFFFFFFFFFEFCD4 +:100F60000000000000000000E7F7FFFFFFFFFFFFA9 +:100F70007F7F7F7FFFFFFFFFFEFEFEFEFCFCFCFC91 +:100F8000E0E0E0E0C0C0C0C08080808000000000E1 +:100F90000000000001010101000000000707070731 +:100FA0007F7F7F7FFFFFFFFF3F3F3F3F7E7E7E7E55 +:100FB000000000000000000000000000E0E0E0E0B1 +:100FC000F8F8F8F8F0F0F0F0000000000000000081 +:100FD0000000000000000000F8F8F8F8F0F0F0F071 +:100FE0000000000000000000879FBFFFFFFFC0005F +:100FF0008080810307070707FEFEFEFEFCFCFCFC69 +:00000001FF diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-5.3e.hex b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-5.3e.hex new file mode 100644 index 00000000..92a2e6cf --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/roms/mpe-5.3e.hex @@ -0,0 +1,257 @@ +:100000000000000000000000001010100063F76303 +:10001000000070000030B030000000000000000060 +:10002000FFFFFFFFFFFFF0F0FFFFFFFFFFFF0F0FDE +:10003000F0F0F0F0F0F0F0F00F0F0F0F0F0F0F0FC8 +:10004000F0F0FFFFFFFFFFFF0F0FFFFFFFFFFFFFBE +:1000500000000000000000000000000000000000A0 +:10006000000121131B1F0F0D00000890B0F0E0608D +:1000700000FC30303030303000FC3030303030FC7C +:1000800000C6EEFEFED6C6C600FCC0C0F8C0C0FE6C +:100090000000000000000000003078FCFCFC78301C +:1000A000FFFFFFFFFFFF00000000FFFFFFFFFFFF5C +:1000B0000000FFFFFFFFFFFF0000FFFFFFFFFFFF4C +:1000C0000000FFFFFFFFFFFF0000FFFFFFFFFFFF3C +:1000D0000000FFFFFFFFFFFFFF0F0F0F0FFFFFFFEE +:1000E000FF8F8F8F8FFFFFFFFFCFCFCFCFFFFFFFA0 +:1000F000FFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFF50 +:100100000000000000000000FF00000000FFFFFFF3 +:10011000FF80808080FFFFFFFFC0C0C0C0FFFFFFE7 +:10012000FFE0E0E0E0FFFFFFFFF0F0F0F0FFFFFF97 +:10013000FFF8F8F8F8FFFFFFFFFCFCFCFCFFFFFFF7 +:10014000FFFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFC3 +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000001C26636363321C001838181818187E88 +:10019000003E63471E3C707F003F060C1E03633E1B +:1001A000000E1E36667F0606007C607C0606663CF6 +:1001B000001E30607E63633E007F63060C181818D3 +:1001C000003C62723C4F433E003E63633F03063C8B +:1001D00000386D61616D390000E6B6B6F6B6B30061 +:1001E00000DECCCCCCCC8C0000F36C6C6C6CF300DF +:1001F0000093DBDFDFDB990000000000000000005F +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000003C7E7E7E7E3C0000001000000010007E +:1002F00000001414140000000000000000000000C2 +:1003000080808080000000000000000080808080ED +:1003100020202020000000000000000020202020DD +:10032000080808080000000000000000080808088D +:1003300002020202000000000000000002020202AD +:1003400000000000000000000000000000071F3F48 +:1003500000000000FFFFFFFF0000000000E0F8FCCD +:1003600000000101030306077FFFFFFFFFFFAFFF50 +:10037000FFCC8C8CFFFFFFFFFECFC7C3FFFFFFFF4B +:1003800000008080C0C0E0E00000000000FFFFFF30 +:100390000000000000FFFFFF0000000000FFFFFF63 +:1003A0000000000000FFFFFF0000000000FFFFFF53 +:1003B0000000000000FFFFFF0000000000FFFFFF43 +:1003C0000000000000F0FFFF000000000000FFFF41 +:1003D00000000000000000FF00000000000000F02E +:1003E0000F08100000000000FF7F1F070000000042 +:1003F000FFFFF0C000000000FFFFFF3C0000000016 +:10040000F3F3FB3800000000FFFFFF3F1F0F0F0753 +:10041000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F5C +:10042000FFFFFFFFFFFFFFFF99FFFFFFFFFFFFFF42 +:10043000FFFFFFFCF8E0C0C0FFFF1E00000000004F +:10044000FFF8000000000000FF3C0000000000007A +:10045000FF3F030000000000FFFFFF070000000057 +:10046000FCFCF0C0000000003F0E00000000000097 +:100470000300000000000000FFFE38000000000044 +:100480003F0E00000000000080000000000000009F +:100490000000000000000000FF80808080808080DD +:1004A000FF0101010101010180808080808080FFC7 +:1004B00001010101010101FF000000000000000036 +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:100510000000C07018182400010600000000000050 +:10052000808040408010182006010000000000007C +:100530000000000001010E106080000000000000BB +:1005400000000202040A08080818A4C090008000F5 +:10055000000040300C06050800000000000080008C +:1005600040300010000808040801000000000000EE +:10057000000001000205080808000000000000005B +:10058000000003040808142060C0200000000000E0 +:1005900000003010102804040202050100000000D1 +:1005A00000010000000000000000000000808080CA +:1005B00080603030101010100003010100010000B5 +:1005C000000080818102261C100000000000000055 +:1005D000010EF0080000000000000000010102020E +:1005E000050408183020C0C0A00000000000000072 +:1005F000000018103020404040A0808000008000A3 +:1006000000003010000C040A02010101010000008A +:10061000000000000080801838440404040000003A +:100620000202010200000000000000800040409033 +:100630000F0400000000000000030206040810E0A0 +:10064000100000000000000000010C08181000104D +:100650001010282020202060408040000000000072 +:10066000000010306040C08000000000000000006A +:1006700000000000000000000000008000000000FA +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D0000000183C0C140404000002020400000195 +:1006E00002000000000000000000183C302030280C +:1006F00020204040200040C0A0000000000000007A +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000010101010302020246 +:100DA0007E000000000000000006020301010000B8 +:100DB000000000003020202060404040C080808043 +:100DC000000000000000000000000000008080C063 +:100DD0004040000002020E083820E0000000000041 +:100DE00000000000000000000F00000000000000F4 +:100DF00000000000010101010302020206040404D4 +:100E00000C080808181010103020202060404040C6 +:100E1000C000000000000000008080808000000012 +:100E200000000000000000000000000001010101BE +:100E30000000000000000000000000000000001E94 +:100E400070C0808080000080F00000000000000181 +:100E5000FF00000000000000000602030101010184 +:100E60000C080808183060C00000000000000000F6 +:100E7000000000000000000003000000000000006F +:100E800000000000000000071C302020604040608F +:100E90003C00000000000000000100000000008095 +:100EA000000000000101010103020202060C18709B +:100EB000008080C040404040C080808080000000B2 +:100EC00000000000000003060000000000F08000A9 +:100ED0003F0000000000000000C060301010101043 +:100EE000C080808080000000000000000000000F33 +:100EF000181010103000000000000000FF808080FB +:100F000000000000000000FE0000000000000000E3 +:100F100000000000FF0000000000000001010101CE +:100F2000010101010302020206041CF0800000001E +:100F300000000000000000000000000000000000B1 +:100F40000700000000000000000000000000000F8B +:100F500038604040C08080C078000000000001037D +:100F6000FE00000000000000000000000000000083 +:100F70000000000000000000010101010302020264 +:100F8000001010103020202060404040C080808041 +:100F900080000000000000000000000000000000D1 +:100FA00000000000000000004000000001010101FD +:100FB000FC00000000000000000000000010101005 +:100FC000000404040C080808F880808080000000F9 +:100FD0000100000000000000060404040C080808DA +:100FE000F8000000000000000000000000003FE0EA +:100FF000004040C080808000000101010302020225 +:00000001FF diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/scandoubler.v b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/spram.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/spram.vhd new file mode 100644 index 00000000..d86010fc --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/spram.vhd @@ -0,0 +1,91 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY spram IS + GENERIC + ( + init_file : string := ""; + --numwords_a : natural; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + data : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + power_up_uninitialized : STRING; + read_during_write_mode_port_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + wren_a : IN STD_LOGIC ; + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + wren_a => wren, + clock0 => clock, + address_a => address, + data_a => data, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/sprite_array.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/sprite_array.vhd new file mode 100644 index 00000000..2addead5 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/sprite_array.vhd @@ -0,0 +1,164 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use ieee.numeric_std.all; +--use ieee.std_logic_arith.all; +--use IEEE.std_logic_unsigned.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.sprite_pkg.all; +--use work.platform_pkg.all; + +entity sprite_array is + generic + ( + N_SPRITES : integer; + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- register interface + reg_i : in to_SPRITE_REG_t; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- extra data + graphics_i : in to_GRAPHICS_t; + + -- sprite data + row_a : out SPRITE_ROW_A_t; + row_d : in SPRITE_ROW_D_t; + + -- video data + rgb : out RGB_t; + set : out std_logic; + pri : out std_logic; + spr0_set : out std_logic + ); +end entity sprite_array; + +architecture SYN of sprite_array is + + type reg_a_t is array (natural range <>) of from_SPRITE_REG_t; + type ctl_i_a_t is array (natural range <>) of to_SPRITE_CTL_t; + type ctl_o_a_t is array (natural range <>) of from_SPRITE_CTL_t; + + alias clk : std_logic is video_ctl.clk; + alias clk_ena : std_logic is video_ctl.clk_ena; + + signal reg_o : reg_a_t(0 to N_SPRITES-1); + signal ctl_i : ctl_i_a_t(0 to N_SPRITES-1); + signal ctl_o : ctl_o_a_t(0 to N_SPRITES-1); + + signal ld_r : std_logic_vector(N_SPRITES-1 downto 0); + +begin + + -- Sprite Data Load Arbiter + -- - enables each sprite controller during hblank + -- to allow loading of sprite row data into row buffer + process (clk, clk_ena, reset) + variable i : integer range 0 to N_SPRITES-1; + begin + if reset = '1' then + -- enable must be 1 clock behind address to latch data after fetch + --ld_r <= (N_SPRITES-1 => '1', others => '0'); + -- make ISE 9.2.03i happy... + ld_r(ld_r'left) <= '1'; + ld_r(ld_r'left-1 downto 0) <= (others => '0'); + i := 0; + elsif rising_edge(clk) and clk_ena = '1' then + ld_r <= ld_r(ld_r'left-1 downto 0) & ld_r(ld_r'left); + if i = N_SPRITES-1 then + i := 0; + else + i := i + 1; + end if; + row_a <= ctl_o(i).a; + end if; + end process; + + -- sprite row data fan-out + GEN_ROW_D : for i in 0 to N_SPRITES-1 generate + ctl_i(i).ld <= ld_r(i); + ctl_i(i).d <= row_d; + end generate GEN_ROW_D; + + -- Sprite Priority Encoder + -- - determines which sprite pixel (if any) is to be displayed + -- We can use a clocked process here because the tilemap + -- output is 1 clock behind at this point + process (clk, clk_ena) + variable spr_on_v : std_logic := '0'; + variable spr_pri_v : std_logic := '0'; + begin + if rising_edge(clk) and clk_ena = '1' then + spr_on_v := '0'; + spr_pri_v := '0'; + for i in 0 to N_SPRITES-1 loop + -- if highest priority = 0 and pixel on + if spr_pri_v = '0' and ctl_o(i).set = '1' then + -- if no sprite on or this priority = 1 + if spr_on_v = '0' or reg_o(i).pri = '1' then + rgb <= ctl_o(i).rgb; + spr_on_v := '1'; -- flag as sprite on + spr_pri_v := reg_o(i).pri; -- store priority + end if; + end if; + end loop; + end if; + set <= spr_on_v; + pri <= spr_pri_v; + end process; + + -- for NES, and perhaps others + -- it's actually more complicated than this + -- but it'll do for now... + spr0_set <= ctl_o(0).set; + + -- + -- Component Instantiation + -- + + GEN_REGS : for i in 0 to N_SPRITES-1 generate + + sptReg_inst : entity work.sptReg + generic map + ( + INDEX => i + ) + port map + ( + reg_i => reg_i, + reg_o => reg_o(i) + ); + + sptCtl_inst : entity work.spritectl + generic map + ( + INDEX => i, + DELAY => DELAY + ) + port map + ( + -- sprite registers + reg_i => reg_o(i), + + -- video control signals + video_ctl => video_ctl, + + -- sprite control signals + ctl_i => ctl_i(i), + ctl_o => ctl_o(i), + + graphics_i => graphics_i + ); + + end generate GEN_REGS; + +end SYN; + diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/sprite_pkg.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/sprite_pkg.vhd new file mode 100644 index 00000000..ee5cf179 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/sprite_pkg.vhd @@ -0,0 +1,97 @@ +library IEEE; +use IEEE.std_logic_1164.all; +--use IEEE.numeric_std.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +library work; +use work.video_controller_pkg.all; + +package sprite_pkg is + + subtype SPRITE_N_t is std_logic_vector(11 downto 0); + subtype SPRITE_A_t is std_logic_vector(7 downto 0); + subtype SPRITE_D_t is std_logic_vector(7 downto 0); + + type from_SPRITE_REG_t is record + n : SPRITE_N_t; + x : std_logic_vector(10 downto 0); + y : std_logic_vector(10 downto 0); + xflip : std_logic; + yflip : std_logic; + colour : std_logic_vector(7 downto 0); + pri : std_logic; + end record; + + type to_SPRITE_REG_t is record + clk : std_logic; + clk_ena : std_logic; + wr : std_logic; + a : SPRITE_A_t; + d : SPRITE_D_t; + end record; + + function NULL_TO_SPRITE_REG return to_SPRITE_REG_t; + + subtype SPRITE_ROW_D_t is std_logic_vector(63 downto 0); + subtype SPRITE_ROW_A_t is std_logic_vector(15 downto 0); + + type to_SPRITE_CTL_t is record + ld : std_logic; + d : SPRITE_ROW_D_t; + end record; + + type from_SPRITE_CTL_t is record + a : SPRITE_ROW_A_t; + rgb : RGB_t; + set : std_logic; + end record; + + function NULL_TO_SPRITE_CTL return to_SPRITE_CTL_t; + + component sprite_array is + generic + ( + N_SPRITES : integer; + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- register interface + reg_i : in to_SPRITE_REG_t; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- extra data + graphics_i : in to_GRAPHICS_t; + + -- sprite data + row_a : out SPRITE_ROW_A_t; + row_d : in SPRITE_ROW_D_t; + + -- video data + rgb : out RGB_t; + set : out std_logic; + pri : out std_logic; + spr0_set : out std_logic + ); + end component sprite_array; + + function flip_row + ( + row_in : std_logic_vector; + flip : std_logic + ) + return SPRITE_ROW_D_t; + + function flip_1 + ( + d_i : std_logic_vector; + flip : std_logic + ) + return std_logic_vector; + +end package sprite_pkg; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/sprite_pkg_body.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/sprite_pkg_body.vhd new file mode 100644 index 00000000..551261b2 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/sprite_pkg_body.vhd @@ -0,0 +1,62 @@ +library work; +use work.pace_pkg.all; +--use work.sprite_pkg.all; + +package body sprite_pkg is + + function NULL_TO_SPRITE_REG return to_SPRITE_REG_t is + begin + return ('0', '0', '0', (others => '0'), (others => '0')); + end function NULL_TO_SPRITE_REG; + + function NULL_TO_SPRITE_CTL return to_SPRITE_CTL_t is + begin + return ('0', (others => '0')); + end function NULL_TO_SPRITE_CTL; + + function flip_row + ( + row_in : std_logic_vector; + flip : std_logic + ) + return std_logic_vector is + + constant HALF : natural := (row_in'length / 2) - 1; + + alias row_in_0 : std_logic_vector(row_in'length-1 downto 0) + is row_in; + variable row_out : std_logic_vector(row_in_0'range); + + begin + + if flip = '0' then + return row_in; + else + for i in 0 to HALF loop + row_out ((HALF-i)*2+1 downto (HALF-i)*2) := row_in_0(i*2+1 downto i*2); + end loop; + return row_out; + end if; + + end flip_row; + + function flip_1 + ( + d_i : std_logic_vector; + flip : std_logic + ) + return std_logic_vector is + alias d_i_0 : std_logic_vector(d_i'length-1 downto 0) is d_i; + variable d_o : std_logic_vector(d_i_0'range); + begin + if flip = '0' then + return d_i; + else + for i in d_i_0'range loop + d_o(i) := d_i_0(d_i_0'high-i); + end loop; + return d_o; + end if; + end function flip_1; + +end package body sprite_pkg; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/spritectl.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/spritectl.vhd new file mode 100644 index 00000000..900bd5fa --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/spritectl.vhd @@ -0,0 +1,154 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.sprite_pkg.all; +use work.platform_variant_pkg.all; + +entity spritectl is + generic + ( + INDEX : natural; + DELAY : integer + ); + port + ( + -- sprite registers + reg_i : in from_SPRITE_REG_t; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- sprite control signals + ctl_i : in to_SPRITE_CTL_t; + ctl_o : out from_SPRITE_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); +end entity spritectl; + +architecture SYN of spritectl is + + alias clk : std_logic is video_ctl.clk; + alias clk_ena : std_logic is video_ctl.clk_ena; + + signal flipData : std_logic_vector(31 downto 0); -- flipped row data + + alias rgb : RGB_t is ctl_o.rgb; + +begin + + flipData(31 downto 16) <= flip_1 (ctl_i.d(31 downto 16), reg_i.xflip); + flipData(15 downto 0) <= flip_1 (ctl_i.d(15 downto 0), reg_i.xflip); + + process (clk, clk_ena, reg_i) + + variable rowStore : std_logic_vector(31 downto 0); -- saved row of spt to show during visibile period + variable pel : std_logic_vector(1 downto 0); + variable x : unsigned(video_ctl.x'range); + variable y : unsigned(video_ctl.y'range); + variable yMat : boolean; -- raster is between first and last line of sprite + variable xMat : boolean; -- raster in between left edge and end of line + + -- the width of rowCount determines the scanline multipler + -- - eg. (4 downto 0) is 1:1 + -- (5 downto 0) is 2:1 (scan-doubling) + variable rowCount : unsigned(3+2 downto 0); + alias row : unsigned(4 downto 0) is + rowCount(rowCount'left downto rowCount'left-4); + + variable tbl_i : std_logic_vector(5 downto 0); -- 64 table entries + variable pal_i : integer range 0 to 15; + variable pal_rgb : pal_rgb_t; + + begin + + if rising_edge(clk) then + if clk_ena = '1' then + + x := unsigned(reg_i.x) + 7 - 3; + y := 254 - unsigned(reg_i.y) - 16; + + if video_ctl.hblank = '1' then + + xMat := false; + -- stop sprites wrapping from bottom of screen + if y = 0 then + yMat := false; + end if; + + if y = unsigned(video_ctl.y) then + -- start counting sprite row + rowCount := (others => '0'); + yMat := true; + elsif row = "10000" then + yMat := false; + end if; + + -- sprites not visible before row 16 + if ctl_i.ld = '1' then + if yMat then + rowStore := flipData; -- load sprite data + else + rowStore := (others => '0'); + end if; + end if; + + end if; + + if video_ctl.stb = '1' then + + if x = unsigned(video_ctl.x) then + -- count up at left edge of sprite + rowCount := rowCount + 1; + -- start of sprite + --if unsigned(x) /= 0 and unsigned(x) < 240 then + xMat := true; + --end if; + end if; + + if xMat then + -- shift in next pixel + pel := rowStore(rowStore'left) & rowStore(rowStore'left-16); + rowStore(31 downto 16) := rowStore(30 downto 16) & '0'; + rowStore(15 downto 0) := rowStore(14 downto 0) & '0'; + end if; + + end if; + + -- the sprite table is pre-calculated and + -- contains 64 entries for palette look-up + -- the palette itself contains just 16 entries + tbl_i := reg_i.colour(3 downto 0) & pel; + pal_i := sprite_table(to_integer(unsigned(tbl_i))); + pal_rgb := sprite_pal(pal_i); + rgb.r <= pal_rgb(0) & "00"; + rgb.g <= pal_rgb(1) & "00"; + rgb.b <= pal_rgb(2) & "00"; + + -- set pixel transparency based on match + ctl_o.set <= '0'; + if xMat and pel /= "00" then + if graphics_i.bit8(0)(4) = '1' then + ctl_o.set <= '1'; + end if; + end if; + + end if; -- clk_ena='1' + end if; -- rising_edge(clk) + + -- generate sprite data address + ctl_o.a(11 downto 5) <= reg_i.n(6 downto 0); + ctl_o.a(4) <= '0'; -- dual-port RAM + if reg_i.yflip = '0' then + ctl_o.a(3 downto 0) <= std_logic_vector(row(3 downto 0)); + else + ctl_o.a(3 downto 0) <= not std_logic_vector(row(3 downto 0)); + end if; + + end process; + +end architecture SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/spritereg.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/spritereg.vhd new file mode 100644 index 00000000..d7c3714b --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/spritereg.vhd @@ -0,0 +1,60 @@ +Library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.sprite_pkg.all; + +entity sptReg is + + generic + ( + INDEX : natural + ); + port + ( + reg_i : in to_SPRITE_REG_t; + reg_o : out from_SPRITE_REG_t + ); + +end sptReg; + +architecture SYN of sptReg is + + alias clk : std_logic is reg_i.clk; + alias clk_ena : std_logic is reg_i.clk_ena; + +begin + + process (clk, clk_ena) + begin + if rising_edge(clk) and clk_ena = '1' then + if reg_i.a(7 downto 2) = std_logic_vector(to_unsigned(INDEX, 6)) then + if reg_i.wr = '1' then + case reg_i.a(1 downto 0) is + when "00" => + reg_o.y(7 downto 0) <= reg_i.d; + when "01" => + -- actually only 32 colours, but encoded as 64??? + reg_o.colour(5 downto 0) <= reg_i.d(5 downto 0); + reg_o.xflip <= reg_i.d(6); + reg_o.yflip <= reg_i.d(7); + when "10" => + -- 128 sprite tiles + reg_o.n(6 downto 0) <= reg_i.d(6 downto 0); + when others => + reg_o.x(7 downto 0) <= reg_i.d; + end case; + end if; -- reg_i.wr='1' + end if; -- reg_i.a()=INDEX + end if; + end process; + + reg_o.x(reg_o.x'left downto 8) <= (others => '0'); + reg_o.y(reg_o.y'left downto 8) <= (others => '0'); + reg_o.n(reg_o.n'left downto 7) <= (others => '0'); + reg_o.colour(reg_o.colour'left downto 6) <= (others => '0'); + reg_o.pri <= '1'; + +end SYN; + diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/sprom.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/sprom.vhd new file mode 100644 index 00000000..292a214f --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/sprom.vhd @@ -0,0 +1,83 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + --numwords_a : natural; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80.vhd new file mode 100644 index 00000000..1ea66542 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80.vhd @@ -0,0 +1,1088 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if Mode = 3 then + IStatus <= "10"; + elsif IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusA <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80_ALU.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80_MCode.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80_MCode.vhd new file mode 100644 index 00000000..198dac66 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80_MCode.vhd @@ -0,0 +1,2024 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + --I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + if mode = 3 then + MCycles <= "011"; + else + MCycles <= "101"; + end if; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80_Pack.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80_Pack.vhd new file mode 100644 index 00000000..907db408 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80_Pack.vhd @@ -0,0 +1,228 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80_Reg.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80se.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80se.vhd new file mode 100644 index 00000000..1b0cb9b5 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/T80se.vhd @@ -0,0 +1,192 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0240 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80se is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0; -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + IOWait : integer := 1 -- 0 => Single cycle I/O, 1 => Std I/O cycle + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80se; + +architecture rtl of T80se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => Mode, + IOWait => IOWait) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/Z80.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/Z80.vhd new file mode 100644 index 00000000..db1ad947 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/t80/Z80.vhd @@ -0,0 +1,135 @@ +library IEEE; +use IEEE.std_logic_1164.all; +library work; +use work.T80_Pack.all; + +entity Z80 is port + ( + clk : in std_logic; + clk_en : in std_logic; + reset : in std_logic; + + addr : out std_logic_vector(15 downto 0); + datai : in std_logic_vector(7 downto 0); + datao : out std_logic_vector(7 downto 0); + + m1 : out std_logic; + mem_rd : out std_logic; + mem_wr : out std_logic; + io_rd : out std_logic; + io_wr : out std_logic; + + wait_n : in std_logic := '1'; + busrq_n : in std_logic := '1'; + intreq : in std_logic := '0'; + intvec : in std_logic_vector(7 downto 0); + intack : out std_logic; + nmi : in std_logic := '0' + ); +end Z80; + +architecture SYN of Z80 is + + component T80se is + generic + ( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 1 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port + ( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); + end component T80se; + + -- Signal Declarations + + signal reset_n : std_logic; + signal int_n : std_logic; + signal nmi_n : std_logic; + + signal z80_m1 : std_logic; + signal z80_memreq : std_logic; + signal z80_ioreq : std_logic; + signal z80_rd : std_logic; + signal z80_wr : std_logic; + signal z80_datai : std_logic_vector(7 downto 0); + + -- derived signals (outputs we need to read) + signal z80_memrd : std_logic; + signal z80_iord : std_logic; + signal fetch : std_logic; + + begin + + -- simple inversions + reset_n <= not reset; + int_n <= not intreq; + nmi_n <= not nmi; + + -- direct-connect (outputs we need to read) + m1 <= z80_m1; + mem_rd <= z80_memrd; + io_rd <= z80_iord; + + -- memory signals + z80_memrd <= z80_memreq nor z80_rd; + mem_wr <= z80_memreq nor z80_wr; + + -- io signals + z80_iord <= z80_ioreq nor z80_rd; + io_wr <= z80_ioreq nor z80_wr; + + -- other signals + fetch <= z80_m1 nor z80_memreq; + intack <= z80_m1 nor z80_ioreq; + + -- data in mux + z80_datai <= intvec when ((z80_memrd or z80_iord) = '0') else + datai; + + Z80_uP : T80se + generic map + ( + Mode => 0 -- Z80 + ) + port map + ( + RESET_n => reset_n, + CLK_n => clk, + CLKEN => clk_en, + WAIT_n => wait_n, + INT_n => int_n, + NMI_n => nmi_n, + BUSRQ_n => busrq_n, + M1_n => z80_m1, + MREQ_n => z80_memreq, + IORQ_n => z80_ioreq, + RD_n => z80_rd, + WR_n => z80_wr, + RFSH_n => open, + HALT_n => open, + BUSAK_n => open, + A => addr, + DI => z80_datai, + DO => datao + ); + +end architecture SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/target_pkg.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/target_pkg.vhd new file mode 100644 index 00000000..0ff511e1 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/target_pkg.vhd @@ -0,0 +1,31 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +library work; +use work.pace_pkg.all; + +package target_pkg is + + -- + -- PACE constants which *MUST* be defined + -- +constant PACE_TARGET : PACETargetType := PACE_TARGET_MIST; +constant PACE_FPGA_VENDOR : PACEFpgaVendor_t := PACE_FPGA_VENDOR_ALTERA; +constant PACE_FPGA_FAMILY : PACEFpgaFamily_t := PACE_FPGA_FAMILY_CYCLONE3; + +constant PACE_CLKIN0 : natural := 27; +constant PACE_HAS_SPI : boolean := false; + + -- + -- DE1-specific constants + -- + type from_TARGET_IO_t is record + not_used : std_logic; + end record; + + type to_TARGET_IO_t is record + not_used : std_logic; + end record; + + end; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/tilemapctl.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/tilemapctl.vhd new file mode 100644 index 00000000..42e2c180 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/tilemapctl.vhd @@ -0,0 +1,131 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.platform_variant_pkg.all; +use work.video_controller_pkg.all; + +-- +-- Galaxian Tilemap Controller +-- +-- Tile data is 2 BPP. +-- + +entity TILEMAP_1 is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- tilemap controller signals + ctl_i : in to_TILEMAP_CTL_t; + ctl_o : out from_TILEMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); +end entity TILEMAP_1; + +architecture tile1 of TILEMAP_1 is + + alias clk : std_logic is video_ctl.clk; + alias clk_ena : std_logic is video_ctl.clk_ena; + alias stb : std_logic is video_ctl.stb; + alias hblank : std_logic is video_ctl.hblank; + alias vblank : std_logic is video_ctl.vblank; + + signal x : std_logic_vector(video_ctl.x'range); + signal y : std_logic_vector(video_ctl.y'range); + + alias rot_en : std_logic is graphics_i.bit8(0)(0); + alias scroll : std_logic_vector(7 downto 0) is graphics_i.bit8(1); + +begin + + -- not used + ctl_o.map_a(ctl_o.map_a'left downto 10) <= (others => '0'); + ctl_o.attr_a(ctl_o.attr_a'left downto 10) <= (others => '0'); + ctl_o.tile_a(ctl_o.tile_a'left downto 12) <= (others => '0'); + + -- screen rotation + x <= video_ctl.x when unsigned(y) < 192 else + std_logic_vector(unsigned(video_ctl.x) + not unsigned(scroll)); + -- when rot_en = '0' else not video_ctl.y; + --y <= not video_ctl.y when rot_en = '0' else 32 + video_ctl.x; + y <= video_ctl.y; -- when rot_en = '0' else video_ctl.x; + + -- generate pixel + process (clk, clk_ena) + + variable tile_d_r : std_logic_vector(15 downto 0); + variable attr_d_r : std_logic_vector(7 downto 0); + variable pel : std_logic_vector(1 downto 0); + variable pal_i : std_logic_vector(6 downto 0); + variable pal_rgb : pal_rgb_t; + + begin + + if rising_edge(clk) then + if clk_ena = '1' then + + -- 1st stage of pipeline + -- - set tilemap, attribute address + ctl_o.map_a(9 downto 5) <= y(7 downto 3); + ctl_o.map_a(4 downto 0) <= x(7 downto 3); + ctl_o.attr_a(9 downto 5) <= y(7 downto 3); + ctl_o.attr_a(4 downto 0) <= x(7 downto 3); + + -- 2nd stage of pipeline + -- - set tile address + if x(2 downto 0) = "010" then + ctl_o.tile_a(11) <= ctl_i.attr_d(7); + ctl_o.tile_a(10 downto 3) <= ctl_i.map_d(7 downto 0); + ctl_o.tile_a(2 downto 0) <= y(2 downto 0); + + end if; + + -- 3rd stage of pipeline + -- - read tile, attribute data from ROM + if x(2 downto 0) = "100" then + tile_d_r := ctl_i.tile_d(tile_d_r'range); + attr_d_r := ctl_i.attr_d(7 downto 0); + elsif stb = '1' then + tile_d_r := tile_d_r(tile_d_r'left-1 downto 0) & '0'; + end if; + + -- extract R,G,B from colour palette + -- MAME says there are 512 palette entries + -- although the code uses 6 bits of colour only + -- the highest colour in the PROM is 83 + -- so we're going with 128 (5+2 bits) + pel := tile_d_r(tile_d_r'left) & tile_d_r(tile_d_r'left-8); + pal_i := attr_d_r(4 downto 0) & pel; + pal_rgb := tile_pal(to_integer(unsigned(pal_i))); + ctl_o.rgb.r <= pal_rgb(0) & "00"; + ctl_o.rgb.g <= pal_rgb(1) & "00"; + ctl_o.rgb.b <= pal_rgb(2) & "00"; + ctl_o.set <= '0'; -- default + -- lines 0-6 are opaque apparently + if unsigned(y) < 7*8 or + pel /= "00" then +-- pal_rgb(0)(7 downto 5) /= "000" or +-- pal_rgb(1)(7 downto 5) /= "000" or +-- pal_rgb(2)(7 downto 5) /= "000" then + if graphics_i.bit8(0)(3) = '1' then + ctl_o.set <= '1'; + end if; + end if; + + end if; -- clk_ena + end if; -- rising_edge_clk + + end process; + +end architecture tile1; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_controller.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_controller.vhd new file mode 100644 index 00000000..155afc5a --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_controller.vhd @@ -0,0 +1,456 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + + +library work; +use work.video_controller_pkg.all; + +entity pace_video_controller is + generic + ( + CONFIG : PACEVideoController_t := PACE_VIDEO_NONE; + DELAY : integer := 1; + H_SIZE : integer; + V_SIZE : integer; + L_CROP : integer range 0 to 255; + R_CROP : integer range 0 to 255; + H_SCALE : integer; + V_SCALE : integer; + H_SYNC_POL : std_logic := '1'; + V_SYNC_POL : std_logic := '1'; + BORDER_RGB : RGB_t := RGB_BLACK + ); + port + ( + -- clocking etc + video_i : in from_VIDEO_t; + + -- register interface + reg_i : in VIDEO_REG_t; + + -- video input data + rgb_i : in RGB_t; + + -- control signals (out) + video_ctl_o : out from_VIDEO_CTL_t; + + -- video output control & data + video_o : out to_VIDEO_t + ); +end pace_video_controller; + +architecture SYN of pace_video_controller is + + constant SIM_DELAY : time := 2 ns; + + constant VIDEO_H_SIZE : integer := H_SIZE * H_SCALE; + constant VIDEO_V_SIZE : integer := V_SIZE * V_SCALE; + + subtype reg_t is integer range 0 to 2047; + + alias clk : std_logic is video_i.clk; + alias clk_ena : std_logic is video_i.clk_ena; + alias reset : std_logic is video_i.reset; + + -- registers + signal h_front_porch_r : reg_t := 0; + signal h_sync_r : reg_t := 0; + signal h_back_porch_r : reg_t := 0; + signal h_border_r : reg_t := 0; + signal h_video_r : reg_t := 0; + signal v_front_porch_r : reg_t := 0; + signal v_sync_r : reg_t := 0; + signal v_back_porch_r : reg_t := 0; + signal v_border_r : reg_t := 0; + signal v_video_r : reg_t := 0; + + signal border_rgb_r : RGB_t := ((others=>'0'), (others=>'0'), (others=>'0')); + + -- derived values + signal h_sync_start : reg_t := 0; + signal h_back_porch_start : reg_t := 0; + signal h_left_border_start : reg_t := 0; + signal h_video_start : reg_t := 0; + signal h_right_border_start : reg_t := 0; + signal h_line_end : reg_t := 0; + signal v_sync_start : reg_t := 0; + signal v_back_porch_start : reg_t := 0; + signal v_top_border_start : reg_t := 0; + signal v_video_start : reg_t := 0; + signal v_bottom_border_start : reg_t := 0; + signal v_screen_end : reg_t := 0; + + signal hsync_s : std_logic := '0'; + signal vsync_s : std_logic := '0'; + signal hactive_s : std_logic := '0'; + signal vactive_s : std_logic := '0'; + signal hblank_s : std_logic := '0'; + signal vblank_s : std_logic := '0'; + + subtype count_t is integer range 0 to 2047; + signal x_count : count_t := 0; + signal y_count : count_t := 0; + + signal x_s : unsigned(10 downto 0) := (others => '0'); + signal y_s : unsigned(10 downto 0) := (others => '0'); + + --signal extended_reset : std_logic := '1'; + alias extended_reset : std_logic is video_i.reset; + +begin + + -- registers + reg_proc: process (reset, clk) + + begin + --if reset = '1' then + case CONFIG is + + when PACE_VIDEO_VGA_240x320_60Hz => + -- P3M, clk=11.136MHz, clk_ena=5.568MHz + h_front_porch_r <= 272-240; + h_sync_r <= 5; + h_back_porch_r <= 22; + h_border_r <= (240-VIDEO_H_SIZE)/2; + v_front_porch_r <= 326-320; + v_sync_r <= 1; + v_back_porch_r <= 5; + v_border_r <= (320-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_320x480_60Hz => + -- VGA, clk=12.588MHz + --# 320x240 @ 60 Hz, 31.5 kHz hsync, 4:3 aspect ratio + --Modeline "320x240" 12.588 320 336 384 400 240 245 246 262 Doublescan + h_front_porch_r <= 16; + h_sync_r <= 48; + h_back_porch_r <= 16; + h_border_r <= (320-VIDEO_H_SIZE)/2; + v_front_porch_r <= (5*2); + v_sync_r <= (1*2); + v_back_porch_r <= (16*2); + v_border_r <= (480-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_640x480_60Hz => + -- VGA, clk=25.175MHz + h_front_porch_r <= 16; + h_sync_r <= 96; + h_back_porch_r <= 48; + h_border_r <= (640-VIDEO_H_SIZE)/2; + v_front_porch_r <= 10; + v_sync_r <= 2; + v_back_porch_r <= 33; + v_border_r <= (480-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_800x600_60Hz => + -- SVGA, clk=40MHz + h_front_porch_r <= 40; + h_sync_r <= 128; + h_back_porch_r <= 88; + h_border_r <= (800-VIDEO_H_SIZE)/2; + v_front_porch_r <= 1; + v_sync_r <= 4; + v_back_porch_r <= 23; + v_border_r <= (600-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_1024x768_60Hz => + -- XVGA, clk=65MHz + h_front_porch_r <= 24; + h_sync_r <= 136; + h_back_porch_r <= 160; + h_border_r <= (1024-VIDEO_H_SIZE)/2; + v_front_porch_r <= 3; + v_sync_r <= 6; + v_back_porch_r <= 29; + v_border_r <= (768-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_1366x768_60Hz => + -- XVGA(NAVICO ROCKY), clk=72MHz + h_front_porch_r <= 88; --64; + h_sync_r <= 44; --112; + h_back_porch_r <= 148; --248; + h_border_r <= (1366-VIDEO_H_SIZE)/2; + v_front_porch_r <= 4; --3; + v_sync_r <= 5; --6; + v_back_porch_r <= 36; --18; + v_border_r <= (768-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_1280x800_60Hz => + -- Sentinel Mode 36, clk=103.2MHz + h_front_porch_r <= 64; + h_sync_r <= 32; + h_back_porch_r <= 362-32-64; + h_border_r <= (1280-VIDEO_H_SIZE)/2; + v_front_porch_r <= 3; + v_sync_r <= 4; + v_back_porch_r <= 38-4-3; + v_border_r <= (800-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_1280x1024_60Hz => + -- SXGA, clk=108MHz + h_front_porch_r <= 48; + h_sync_r <= 112; + h_back_porch_r <= 248; + h_border_r <= (1280-VIDEO_H_SIZE)/2; + v_front_porch_r <= 1; + v_sync_r <= 3; + v_back_porch_r <= 38; + v_border_r <= (1024-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_1680x1050_60Hz => + -- WSXGA+, clk=147.14MHz + h_front_porch_r <= 104; + h_sync_r <= 184; + h_back_porch_r <= 288; + v_front_porch_r <= 1; + v_sync_r <= 3; + v_back_porch_r <= 33; + -- WSXGA+, clk=118MHz + --h_front_porch_r <= 48; + --h_sync_r <= 32; + --h_back_porch_r <= 80; + --v_front_porch_r <= 3; + --v_sync_r <= 6; + --v_back_porch_r <= 21; + h_border_r <= (1680-VIDEO_H_SIZE)/2; + v_border_r <= (1050-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_ARCADE_STD_336x240_60Hz => + -- arcade standard resolution, clk=7.16MHz + h_front_porch_r <= 34; + h_sync_r <= 34; + h_back_porch_r <= 51; + h_border_r <= (336-VIDEO_H_SIZE)/2; + v_front_porch_r <= 3; + v_sync_r <= 3; + v_back_porch_r <= 16; + v_border_r <= (240-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_ARCADE_STD_336x240_60Hz_28M64 => + -- arcade standard resolution, clk=28.64MHz + h_front_porch_r <= 4*34; + h_sync_r <= 4*34; + h_back_porch_r <= 4*51; + h_border_r <= 4*(336-VIDEO_H_SIZE)/2; + v_front_porch_r <= 3; + v_sync_r <= 3; + v_back_porch_r <= 16; + v_border_r <= (240-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_CVBS_720x288p_50Hz => + -- generic composite, clk=13.5MHz + h_front_porch_r <= (8+12); + h_sync_r <= 64; + h_back_porch_r <= (144-64-(8+12)); + h_border_r <= (720-VIDEO_H_SIZE)/2; + v_front_porch_r <= 1; + v_sync_r <= 3; + v_back_porch_r <= 20; + v_border_r <= (288-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_LCM_320x240_60Hz => + -- DE1/2, clk=18MHz + h_front_porch_r <= 59; + h_sync_r <= 1; + h_back_porch_r <= 151; + h_border_r <= (320-VIDEO_H_SIZE)*3/2; + v_front_porch_r <= 8; + v_sync_r <= 1; + v_back_porch_r <= 13; + v_border_r <= (240-VIDEO_V_SIZE)/2; + + when others => + null; + end case; + + h_video_r <= VIDEO_H_SIZE; + v_video_r <= VIDEO_V_SIZE; + border_rgb_r <= BORDER_RGB; + + --end if; + end process reg_proc; + + -- register some arithmetic + init_proc: process (reset, clk, clk_ena) + begin + if reset = '1' then + null; + elsif rising_edge(clk) then + h_sync_start <= h_front_porch_r - 1; + h_back_porch_start <= h_sync_start + h_sync_r; + h_left_border_start <= h_back_porch_start + h_back_porch_r; + h_video_start <= h_left_border_start + h_border_r; + h_right_border_start <= h_video_start + h_video_r; + h_line_end <= h_right_border_start + h_border_r; + v_sync_start <= v_front_porch_r - 1; + v_back_porch_start <= v_sync_start + v_sync_r; + v_top_border_start <= v_back_porch_start + v_back_porch_r; + v_video_start <= v_top_border_start + v_border_r; + v_bottom_border_start <= v_video_start + v_video_r; + v_screen_end <= v_bottom_border_start + v_border_r; + end if; + end process init_proc; + + reset_proc: process (reset, clk) + variable count_v : integer; + begin + if reset = '1' then + --extended_reset <= '1'; + count_v := 7; + elsif rising_edge(clk) then + if count_v = 0 then + --extended_reset <= '0'; + else + count_v := count_v - 1; + end if; + end if; + end process reset_proc; + + -- video control outputs + timer_proc: process (extended_reset, clk, clk_ena) + begin + if extended_reset = '1' then + hblank_s <= '1'; + vblank_s <= '1'; + hactive_s <= '0'; + vactive_s <= '0'; + hsync_s <= not H_SYNC_POL; + x_count <= 0; + y_count <= 0; + elsif rising_edge(clk) and clk_ena = '1' then + if x_count = h_line_end then + hblank_s <= '1'; + hactive_s <= '0'; -- for 0 borders + if y_count = v_screen_end then + vblank_s <= '1'; + vactive_s <= '0'; -- for 0 borders + y_count <= 0; + else + y_s <= y_s + 1; + if y_count = v_sync_start then + vsync_s <= V_SYNC_POL; + elsif y_count = v_back_porch_start then + vsync_s <= not V_SYNC_POL; + elsif y_count = v_video_start then + vblank_s <= '0'; -- for 0 borders + vactive_s <= '1'; + y_s <= (others => '0'); + -- check the borders last in case they're 0 + elsif y_count = v_top_border_start then + vblank_s <= '0'; + elsif y_count = v_bottom_border_start then + vactive_s <= '0'; + end if; + y_count <= y_count + 1; + end if; + x_count <= 0; + else + x_s <= x_s + 1; + if x_count = h_sync_start then + hsync_s <= H_SYNC_POL; + elsif x_count = h_back_porch_start then + hsync_s <= not H_SYNC_POL; + elsif x_count = h_video_start then + hblank_s <= '0'; -- for 0 borders + hactive_s <= '1'; + x_s <= (others => '0'); + -- check the borders last in case they're 0 + elsif x_count = h_left_border_start then + hblank_s <= '0'; + elsif x_count = h_right_border_start then + hactive_s <= '0'; + end if; + x_count <= x_count + 1; + end if; + end if; -- rising_edge(clk) and clk_ena = '1' + end process timer_proc; + + -- pass-through for tile/bitmap & sprite controllers + video_ctl_o.clk <= clk; + video_ctl_o.clk_ena <= clk_ena; + + -- for video DACs and TFT output + video_o.clk <= clk; + + BLK_VIDEO_O : block + + constant PIPELINE_DELAY : natural := DELAY+1; + + -- won't synthesize correctly under ISE if these are variables + signal hactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + signal vactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + + begin + + video_o_proc: process (extended_reset, clk, clk_ena) + variable hsync_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + variable vsync_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + --variable hactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + --variable vactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + variable hblank_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + variable vblank_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + alias hsync_v : std_logic is hsync_v_r(hsync_v_r'left); + alias vsync_v : std_logic is vsync_v_r(vsync_v_r'left); + alias hactive_v : std_logic is hactive_v_r(hactive_v_r'left); + alias vactive_v : std_logic is vactive_v_r(vactive_v_r'left); + alias hblank_v : std_logic is hblank_v_r(hblank_v_r'left); + alias vblank_v : std_logic is vblank_v_r(vblank_v_r'left); + variable stb_cnt_v : unsigned(3 downto 0); -- up to 16x scaling + begin + if extended_reset = '1' then + hsync_v_r := (others => not H_SYNC_POL); + vsync_v_r := (others => not V_SYNC_POL); + hactive_v_r <= (others => '0'); + vactive_v_r <= (others => '0'); + hblank_v_r := (others => '0'); + vblank_v_r := (others => '0'); + stb_cnt_v := (others => '1'); + elsif rising_edge(clk) and clk_ena = '1' then + + -- register control signals and handle scaling + video_ctl_o.hblank <= not hactive_s after SIM_DELAY; -- used only by the bitmap/tilemap/sprite controllers + video_ctl_o.vblank <= not vactive_s after SIM_DELAY; -- used only by the bitmap/tilemap/sprite controllers + -- handle scaling + video_ctl_o.stb <= stb_cnt_v(H_SCALE-1) after SIM_DELAY; + if hactive_s = '1' and vactive_s = '1' then + stb_cnt_v := stb_cnt_v + 2; + elsif hblank_s = '0' and vblank_s = '0' then + stb_cnt_v := (others => '1'); + end if; + video_ctl_o.x <= std_logic_vector(resize(x_s(x_s'left downto H_SCALE-1), video_ctl_o.x'length)) after SIM_DELAY; + video_ctl_o.y <= std_logic_vector(resize(y_s(y_s'left downto V_SCALE-1), video_ctl_o.y'length)) after SIM_DELAY; + + -- register video outputs + if hactive_v = '1' and vactive_v = '1' then + -- active video + if x_s(x_s'left downto H_SCALE-1) < (L_CROP + PIPELINE_DELAY) or + x_s(x_s'left downto H_SCALE-1) >= (H_SIZE - R_CROP + PIPELINE_DELAY) then + video_o.rgb <= RGB_BLACK after SIM_DELAY; + else + video_o.rgb <= rgb_i after SIM_DELAY; + end if; + elsif hblank_v = '0' and vblank_v = '0' then + -- border + video_o.rgb <= border_rgb_r after SIM_DELAY; + else + video_o.rgb.r <= (others => '0') after SIM_DELAY; + video_o.rgb.g <= (others => '0') after SIM_DELAY; + video_o.rgb.b <= (others => '0') after SIM_DELAY; + end if; + video_o.hsync <= hsync_v after SIM_DELAY; + video_o.vsync <= vsync_v after SIM_DELAY; + video_o.hblank <= hblank_v after SIM_DELAY; + video_o.vblank <= vblank_v after SIM_DELAY; + -- pipelined signals + hsync_v_r := hsync_v_r(hsync_v_r'left-1 downto 0) & hsync_s; + vsync_v_r := vsync_v_r(vsync_v_r'left-1 downto 0) & vsync_s; + hactive_v_r <= hactive_v_r(hactive_v_r'left-1 downto 0) & hactive_s; + vactive_v_r <= vactive_v_r(vactive_v_r'left-1 downto 0) & vactive_s; + hblank_v_r := hblank_v_r(hblank_v_r'left-1 downto 0) & hblank_s; + vblank_v_r := vblank_v_r(vblank_v_r'left-1 downto 0) & vblank_s; + end if; + end process video_o_proc; + + end block BLK_VIDEO_O; + +end SYN; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_controller_pkg.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_controller_pkg.vhd new file mode 100644 index 00000000..183bfe23 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_controller_pkg.vhd @@ -0,0 +1,229 @@ +library IEEE; +use IEEE.std_logic_1164.all; +--use IEEE.numeric_std.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +package video_controller_pkg is + + type PACEVideoController_t is + ( + PACE_VIDEO_NONE, -- PACE video controller not used + PACE_VIDEO_VGA_240x320_60Hz, -- P3M video + PACE_VIDEO_VGA_320x480_60Hz, -- for 320x200 (12.588MHz) + PACE_VIDEO_VGA_640x480_60Hz, -- generic VGA (25.175MHz) + PACE_VIDEO_VGA_800x600_60Hz, -- generic VGA (40MHz) + PACE_VIDEO_VGA_1024x768_60Hz, -- XVGA (65MHz) + PACE_VIDEO_VGA_1366x768_60Hz, -- (NAVICO ROCKY) (72MHz) + PACE_VIDEO_VGA_1280x800_60Hz, -- Sentinel Mode 36 + PACE_VIDEO_VGA_1280x1024_60Hz, -- SXGA (108MHz) + PACE_VIDEO_VGA_1680x1050_60Hz, -- WSXGA+ (147MHz) + PACE_VIDEO_ARCADE_STD_336x240_60Hz, -- arcade std resolution (7.16MHz) + PACE_VIDEO_ARCADE_STD_336x240_60Hz_28M64, -- arcade std resolution (28.64MHz) + PACE_VIDEO_CVBS_720x288p_50Hz, -- generic composite + PACE_VIDEO_LCM_320x240_60Hz -- DE2 LCD + ); + + type PACEVideoDisplay_t is + ( + PACE_DISPLAY_NONE, + PACE_DISPLAY_VGA, + PACE_DISPLAY_CVBS, + PACE_DISPLAY_TFT + ); + + type RGB_t is record + r : std_logic_vector(9 downto 0); + g : std_logic_vector(9 downto 0); + b : std_logic_vector(9 downto 0); + end record; + + type RGB_a is array (natural range <>) of RGB_t; + + function NULL_RGB return RGB_t; + + constant RGB_BLACK : RGB_t := ((others=>'0'),(others=>'0'),(others=>'0')); + constant RGB_RED : RGB_t := ((others=>'1'),(others=>'0'),(others=>'0')); + constant RGB_GREEN : RGB_t := ((others=>'0'),(others=>'1'),(others=>'0')); + constant RGB_YELLOW : RGB_t := ((others=>'1'),(others=>'1'),(others=>'0')); + constant RGB_BLUE : RGB_t := ((others=>'0'),(others=>'0'),(others=>'1')); + constant RGB_MAGENTA : RGB_t := ((others=>'1'),(others=>'0'),(others=>'1')); + constant RGB_CYAN : RGB_t := ((others=>'0'),(others=>'1'),(others=>'1')); + constant RGB_WHITE : RGB_t := ((others=>'1'),(others=>'1'),(others=>'1')); + + type VIDEO_REG_t is record + h_scale : std_logic_vector(2 downto 0); + v_scale : std_logic_vector(2 downto 0); + end record; + + type from_VIDEO_t is record + clk : std_logic; + clk_ena : std_logic; + reset : std_logic; + end record; + + type to_VIDEO_t is record + clk : std_logic; + rgb : rgb_t; + hsync : std_logic; + vsync : std_logic; + hblank : std_logic; + vblank : std_logic; + de : std_logic; + end record; + + type from_VIDEO_CTL_t is record + clk : std_logic; + clk_ena : std_logic; + stb : std_logic; + hblank : std_logic; + vblank : std_logic; + x : std_logic_vector(10 downto 0); + y : std_logic_vector(10 downto 0); + end record; + + subtype BITMAP_D_t is std_logic_vector(23 downto 0); + subtype BITMAP_A_t is std_logic_vector(15 downto 0); + + type to_BITMAP_CTL_t is record + d : BITMAP_D_t; + end record; + + type to_BITMAP_CTL_a is array (natural range <>) of to_BITMAP_CTL_t; + + function NULL_TO_BITMAP_CTL return to_BITMAP_CTL_t; + + type from_BITMAP_CTL_t is record + a : BITMAP_A_t; + rgb : RGB_t; + set : std_logic; + end record; + + type from_BITMAP_CTL_a is array (natural range <>) of from_BITMAP_CTL_t; + + subtype TILEMAP_D_t is std_logic_vector(15 downto 0); + subtype TILEMAP_A_t is std_logic_vector(15 downto 0); + subtype TILE_A_t is std_logic_vector(16 downto 0); + subtype TILE_D_t is std_logic_vector(23 downto 0); + subtype ATTR_A_t is std_logic_vector(15 downto 0); + subtype ATTR_D_t is std_logic_vector(15 downto 0); + + type to_TILEMAP_CTL_t is record + map_d : TILEMAP_D_t; + tile_d : TILE_D_t; + attr_d : ATTR_D_t; + end record; + + type to_TILEMAP_CTL_a is array (natural range <>) of to_TILEMAP_CTL_t; + + function NULL_TO_TILEMAP_CTL return to_TILEMAP_CTL_t; + + type from_TILEMAP_CTL_t is record + map_a : TILEMAP_A_t; + tile_a : TILE_A_t; + attr_a : ATTR_A_t; + rgb : RGB_t; + set : std_logic; + end record; + + type from_TILEMAP_CTL_a is array (natural range <>) of from_TILEMAP_CTL_t; + + subtype PAL_ENTRY_t is std_logic_vector(15 downto 0); + type PAL_A_t is array (natural range <>) of PAL_ENTRY_t; + + subtype BYTE_t is std_logic_vector(7 downto 0); + type BYTE_A_t is array (natural range <>) of BYTE_t; + + subtype WORD_t is std_logic_vector(15 downto 0); + type WORD_A_t is array (natural range <>) of WORD_t; + + type to_GRAPHICS_t is record + pal : PAL_A_t(0 to 15); + -- for various uses + bit8 : BYTE_A_t(0 to 7); + bit16 : WORD_A_t(0 to 3); + -- 'native' graphics stream + hsync : std_logic; + vsync : std_logic; + rgb : RGB_t; + end record; + + function NULL_TO_GRAPHICS return to_GRAPHICS_t; + + type from_GRAPHICS_t is record + y : std_logic_vector(10 downto 0); + hblank : std_logic; + vblank : std_logic; + end record; + + component pace_video_controller is + generic + ( + CONFIG : PACEVideoController_t := PACE_VIDEO_NONE; + DELAY : integer := 1; + H_SIZE : integer; + V_SIZE : integer; + --H_SCALE : integer; + --V_SCALE : integer; + BORDER_RGB : RGB_t := RGB_BLACK + ); + port + ( + -- clocking etc + video_i : in from_VIDEO_t; + + -- register interface + reg_i : in VIDEO_REG_t; + + -- video input data + rgb_i : in RGB_t; + + -- control signals (out) + video_ctl_o : from_VIDEO_CTL_t; + + -- Outputs to video + video_o : out to_VIDEO_t + ); + end component pace_video_controller; + + component tilemapCtl is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- tilemap controller signals + ctl_i : in to_TILEMAP_CTL_t; + ctl_o : out from_TILEMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); + end component tilemapCtl; + + component bitmapCtl is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- bitmap controller signals + ctl_i : in to_BITMAP_CTL_t; + ctl_o : out from_BITMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); + end component bitmapCtl; + +end package video_controller_pkg; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_controller_pkg_body.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_controller_pkg_body.vhd new file mode 100644 index 00000000..996e5867 --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_controller_pkg_body.vhd @@ -0,0 +1,29 @@ +library work; +--use work.pace_pkg.all; + +package body video_controller_pkg is + + function NULL_RGB return RGB_t is + begin + return (others => (others => '0')); + end NULL_RGB; + + function NULL_TO_BITMAP_CTL return to_BITMAP_CTL_t is + begin + return (others => (others => '0')); + end NULL_TO_BITMAP_CTL; + + function NULL_TO_TILEMAP_CTL return to_TILEMAP_CTL_t is + begin + return ((others => '0'), (others => '0'), (others => '0')); + end NULL_TO_TILEMAP_CTL; + + function NULL_TO_GRAPHICS return to_GRAPHICS_t is + begin + return ((others => (others => '0')), + (others => (others => '0')), + (others => (others => '0')), + '0', '0', NULL_RGB); + end NULL_TO_GRAPHICS; + +end package body video_controller_pkg; diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_mist.sv b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_mist.sv new file mode 100644 index 00000000..fb9e499a --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_mist.sv @@ -0,0 +1,233 @@ +// +// +// 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_mist +/*#( + parameter LINE_LENGTH = 256, + 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 scan_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 [5:0] R, + input [5:0] G, + input [5: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 +); + +wire [5:0] R_sd; +wire [5:0] G_sd; +wire [5:0] B_sd; +wire hs_sd, vs_sd; + +scandoubler #(.LENGTH(800), .HALF_DEPTH(0)) 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 [5:0] rt = (scan_disable ? R : R_sd); +wire [5:0] gt = (scan_disable ? G : G_sd); +wire [5:0] bt = (scan_disable ? B : B_sd); + + wire [5:0] r = rt; + wire [5:0] g = gt; + wire [5:0] b = bt; + + +wire hs = (scan_disable ? HSync : hs_sd); +wire vs = (scan_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 #(10'd0, 10'd0, 3'd4) 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 = (scan_disable | ypbpr) ? 1'b1 : ~vs_sd; +assign VGA_HS = scan_disable ? ~(HSync ^ VSync) : ypbpr ? ~(hs_sd ^ vs_sd) : ~hs_sd; + +endmodule diff --git a/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_mixer.vhd b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_mixer.vhd new file mode 100644 index 00000000..ab2cccaf --- /dev/null +++ b/Arcade/IremM52 Hardware/MoonPatrol_MIST/src/video_mixer.vhd @@ -0,0 +1,44 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.sprite_pkg.all; +--use work.platform_pkg.all; + +entity pace_video_mixer is + port + ( + --bitmap_rgb : in RGB_t; + --bitmap_set : in std_logic; + bitmap_ctl_o : in from_BITMAP_CTL_a(1 to 3); + tilemap_ctl_o : in from_TILEMAP_CTL_a(1 to 1); + sprite_rgb : in RGB_t; + sprite_set : in std_logic; + sprite_pri : in std_logic; + + video_ctl_i : in from_VIDEO_CTL_t; + graphics_i : in to_GRAPHICS_t; + rgb_o : out RGB_t + ); +end entity pace_video_mixer; + +architecture SYN of pace_video_mixer is + signal bg_rgb : RGB_t; +begin + + bg_rgb <= bitmap_ctl_o(1).rgb when bitmap_ctl_o(1).set = '1' else + bitmap_ctl_o(2).rgb when bitmap_ctl_o(2).set = '1' else + bitmap_ctl_o(3).rgb when bitmap_ctl_o(3).set = '1' else + (others => (others => '0')); + + + rgb_o <= sprite_rgb when sprite_set = '1' and sprite_pri = '1' else + tilemap_ctl_o(1).rgb when tilemap_ctl_o(1).set = '1' else + sprite_rgb when sprite_set = '1' else + bg_rgb; + +end architecture SYN; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/clean.bat b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/pooyan_mist.qpf b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/pooyan_mist.qpf new file mode 100644 index 00000000..f6253900 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/pooyan_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 = 11:17:10 October 25, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "16.1" +DATE = "11:17:10 October 25, 2017" + +# Revisions + +PROJECT_REVISION = "pooyan_mist" diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/pooyan_mist.qsf b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/pooyan_mist.qsf new file mode 100644 index 00000000..c0acdee6 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/pooyan_mist.qsf @@ -0,0 +1,162 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:18:08 November 05, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# pooyan_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 TOP_LEVEL_ENTITY pooyan_mist + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_DO_CCPP_REMOVAL ON + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" + +# Fitter Assignments +# ================== +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ENABLE_CONFIGURATION_PINS OFF +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +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 "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# SignalTap II Assignments +# ======================== +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE output_files/stp1.stp + +# 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)" + + + +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_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 + + + +set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF +set_global_assignment -name ENABLE_NCE_PIN OFF +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +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 VHDL_FILE rtl/pooyan_mist.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_sprite_grphx2.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_sprite_grphx1.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_sprite_color_lut.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_sound_prog.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_prog.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_palette.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_char_grphx2.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_char_grphx1.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_char_color_lut.vhd +set_global_assignment -name VHDL_FILE rtl/YM2149_linmix_sep.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VHDL_FILE rtl/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80se.vhd +set_global_assignment -name VHDL_FILE rtl/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name QIP_FILE rtl/mist_pll_12M_14M.qip +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +set_global_assignment -name VERILOG_FILE rtl/keyboard.v +set_global_assignment -name VHDL_FILE rtl/gen_video.vhd +set_global_assignment -name VHDL_FILE rtl/gen_ram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name VHDL_FILE rtl/pooyan_sound_board.vhd +set_global_assignment -name VHDL_FILE rtl/pooyan.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/DebugSystem.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/DebugSystem.vhd new file mode 100644 index 00000000..27f115c9 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/DebugSystem.vhd @@ -0,0 +1,197 @@ +-- Z80, Monitor ROM, 4k RAM and two 16450 UARTs +-- that can be synthesized and used with +-- the NoICE debugger that can be found at +-- http://www.noicedebugger.com/ + +library IEEE; +use IEEE.std_logic_1164.all; + +entity DebugSystem is + port( + Reset_n : in std_logic; + Clk : in std_logic; + NMI_n : in std_logic; + RXD0 : in std_logic; + CTS0 : in std_logic; + DSR0 : in std_logic; + RI0 : in std_logic; + DCD0 : in std_logic; + RXD1 : in std_logic; + CTS1 : in std_logic; + DSR1 : in std_logic; + RI1 : in std_logic; + DCD1 : in std_logic; + TXD0 : out std_logic; + RTS0 : out std_logic; + DTR0 : out std_logic; + TXD1 : out std_logic; + RTS1 : out std_logic; + DTR1 : out std_logic; +As : out std_logic_vector(15 downto 0); +Ds : out std_logic_vector(7 downto 0); +ROM_Ds : out std_logic_vector(7 downto 0) + ); +end DebugSystem; + +architecture struct of DebugSystem is + + signal M1_n : std_logic; + signal MREQ_n : std_logic; + signal IORQ_n : std_logic; + signal RD_n : std_logic; + signal WR_n : std_logic; + signal RFSH_n : std_logic; + signal HALT_n : std_logic; + signal WAIT_n : std_logic; + signal INT_n : std_logic; + signal RESET_s : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal A : std_logic_vector(15 downto 0); + signal D : std_logic_vector(7 downto 0); + signal ROM_D : std_logic_vector(7 downto 0); + signal SRAM_D : std_logic_vector(7 downto 0); + signal UART0_D : std_logic_vector(7 downto 0); + signal UART1_D : std_logic_vector(7 downto 0); + signal CPU_D : std_logic_vector(7 downto 0); + + signal Mirror : std_logic; + + signal IOWR_n : std_logic; + signal RAMCS_n : std_logic; + signal UART0CS_n : std_logic; + signal UART1CS_n : std_logic; + + signal BaudOut0 : std_logic; + signal BaudOut1 : std_logic; + +begin + As <= A; + Ds <= D; + ROM_Ds <= ROM_D; + + Wait_n <= '1'; + BusRq_n <= '1'; + INT_n <= '1'; + + process (Reset_n, Clk) + begin + if Reset_n = '0' then + Reset_s <= '0'; + Mirror <= '0'; + elsif Clk'event and Clk = '1' then + Reset_s <= '1'; + if IORQ_n = '0' and A(7 downto 4) = "1111" then + Mirror <= D(0); + end if; + end if; + end process; + + IOWR_n <= WR_n or IORQ_n; + RAMCS_n <= (not Mirror and not A(15)) or MREQ_n; + UART0CS_n <= '0' when IORQ_n = '0' and A(7 downto 3) = "00000" else '1'; + UART1CS_n <= '0' when IORQ_n = '0' and A(7 downto 3) = "10000" else '1'; + +-- CPU_D <= +-- SRAM_D when RAMCS_n = '0' else +-- UART0_D when UART0CS_n = '0' else +-- UART1_D when UART1CS_n = '0' else +-- ROM_D; + + CPU_D <= + ROM_D; + + u0 : entity work.T80s + generic map(Mode => 0, T2Write => 1, IOWait => 0) +-- generic map(Mode => 1, T2Write => 1, IOWait => 0) + port map( + RESET_n => RESET_s, + CLK_n => Clk, + WAIT_n => WAIT_n, + INT_n => INT_n, + NMI_n => NMI_n, + BUSRQ_n => BUSRQ_n, + M1_n => M1_n, + MREQ_n => MREQ_n, + IORQ_n => IORQ_n, + RD_n => RD_n, + WR_n => WR_n, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + BUSAK_n => BUSAK_n, + A => A, + DI => CPU_D, + DO => D); + + -- u1 : entity work.MonZ80 + -- port map( + -- Clk => Clk, + -- A => A(10 downto 0), + -- D => ROM_D); + + u1 : entity work.bagmanrom + port map( + clock => not Clk, + address => A(14 downto 0), + q => ROM_D); + + u2 : entity work.SSRAM + generic map( + AddrWidth => 12) + port map( + Clk => Clk, + CE_n => RAMCS_n, + WE_n => WR_n, + A => A(11 downto 0), + DIn => D, + DOut => SRAM_D); + + u3 : entity work.T16450 + port map( + MR_n => Reset_s, + XIn => Clk, + RClk => BaudOut0, + CS_n => UART0CS_n, + Rd_n => RD_n, + Wr_n => IOWR_n, + A => A(2 downto 0), + D_In => D, + D_Out => UART0_D, + SIn => RXD0, + CTS_n => CTS0, + DSR_n => DSR0, + RI_n => RI0, + DCD_n => DCD0, + SOut => TXD0, + RTS_n => RTS0, + DTR_n => DTR0, + OUT1_n => open, + OUT2_n => open, + BaudOut => BaudOut0, + Intr => open); + + u4 : entity work.T16450 + port map( + MR_n => Reset_s, + XIn => Clk, + RClk => BaudOut1, + CS_n => UART1CS_n, + Rd_n => RD_n, + Wr_n => IOWR_n, + A => A(2 downto 0), + D_In => D, + D_Out => UART1_D, + SIn => RXD1, + CTS_n => CTS1, + DSR_n => DSR1, + RI_n => RI1, + DCD_n => DCD1, + SOut => TXD1, + RTS_n => RTS1, + DTR_n => DTR1, + OUT1_n => open, + OUT2_n => open, + BaudOut => BaudOut1, + Intr => open); + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/DebugSystemXR.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/DebugSystemXR.vhd new file mode 100644 index 00000000..ca8fa877 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/DebugSystemXR.vhd @@ -0,0 +1,185 @@ +-- Z80, Monitor ROM, external SRAM interface and two 16450 UARTs +-- that can be synthesized and used with +-- the NoICE debugger that can be found at +-- http://www.noicedebugger.com/ + +library IEEE; +use IEEE.std_logic_1164.all; + +entity DebugSystemXR is + port( + Reset_n : in std_logic; + Clk : in std_logic; + NMI_n : in std_logic; + OE_n : out std_logic; + WE_n : out std_logic; + RAMCS_n : out std_logic; + ROMCS_n : out std_logic; + PGM_n : out std_logic; + A : out std_logic_vector(16 downto 0); + D : inout std_logic_vector(7 downto 0); + RXD0 : in std_logic; + CTS0 : in std_logic; + DSR0 : in std_logic; + RI0 : in std_logic; + DCD0 : in std_logic; + RXD1 : in std_logic; + CTS1 : in std_logic; + DSR1 : in std_logic; + RI1 : in std_logic; + DCD1 : in std_logic; + TXD0 : out std_logic; + RTS0 : out std_logic; + DTR0 : out std_logic; + TXD1 : out std_logic; + RTS1 : out std_logic; + DTR1 : out std_logic + ); +end entity DebugSystemXR; + +architecture struct of DebugSystemXR is + + signal M1_n : std_logic; + signal MREQ_n : std_logic; + signal IORQ_n : std_logic; + signal RD_n : std_logic; + signal WR_n : std_logic; + signal RFSH_n : std_logic; + signal HALT_n : std_logic; + signal WAIT_n : std_logic; + signal INT_n : std_logic; + signal RESET_s : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal A_i : std_logic_vector(15 downto 0); + signal D_i : std_logic_vector(7 downto 0); + signal ROM_D : std_logic_vector(7 downto 0); + signal UART0_D : std_logic_vector(7 downto 0); + signal UART1_D : std_logic_vector(7 downto 0); + signal CPU_D : std_logic_vector(7 downto 0); + + signal Mirror : std_logic; + + signal IOWR_n : std_logic; + signal RAMCS_n_i : std_logic; + signal UART0CS_n : std_logic; + signal UART1CS_n : std_logic; + + signal BaudOut0 : std_logic; + signal BaudOut1 : std_logic; + +begin + + Wait_n <= '1'; + BusRq_n <= '1'; + INT_n <= '1'; + + OE_n <= RD_n; + WE_n <= WR_n; + RAMCS_n <= RAMCS_n_i; + ROMCS_n <= '1'; + PGM_n <= '1'; + A(14 downto 0) <= A_i(14 downto 0); + A(16 downto 15) <= "00"; + D <= D_i when WR_n = '0' else "ZZZZZZZZ"; + + process (Reset_n, Clk) + begin + if Reset_n = '0' then + Reset_s <= '0'; + Mirror <= '0'; + elsif Clk'event and Clk = '1' then + Reset_s <= '1'; + if IORQ_n = '0' and A_i(7 downto 4) = "1111" then + Mirror <= D_i(0); + end if; + end if; + end process; + + IOWR_n <= WR_n or IORQ_n; + RAMCS_n_i <= (not Mirror and not A_i(15)) or MREQ_n; + UART0CS_n <= '0' when IORQ_n = '0' and A_i(7 downto 3) = "00000" else '1'; + UART1CS_n <= '0' when IORQ_n = '0' and A_i(7 downto 3) = "10000" else '1'; + + CPU_D <= + D when RAMCS_n_i = '0' else + UART0_D when UART0CS_n = '0' else + UART1_D when UART1CS_n = '0' else + ROM_D; + + u0 : entity work.T80s + generic map(Mode => 1, T2Write => 1, IOWait => 0) + port map( + RESET_n => RESET_s, + CLK_n => Clk, + WAIT_n => WAIT_n, + INT_n => INT_n, + NMI_n => NMI_n, + BUSRQ_n => BUSRQ_n, + M1_n => M1_n, + MREQ_n => MREQ_n, + IORQ_n => IORQ_n, + RD_n => RD_n, + WR_n => WR_n, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + BUSAK_n => BUSAK_n, + A => A_i, + DI => CPU_D, + DO => D_i); + + u1 : entity work.MonZ80 + port map( + Clk => Clk, + A => A_i(10 downto 0), + D => ROM_D); + + u3 : entity work.T16450 + port map( + MR_n => Reset_s, + XIn => Clk, + RClk => BaudOut0, + CS_n => UART0CS_n, + Rd_n => RD_n, + Wr_n => IOWR_n, + A => A_i(2 downto 0), + D_In => D_i, + D_Out => UART0_D, + SIn => RXD0, + CTS_n => CTS0, + DSR_n => DSR0, + RI_n => RI0, + DCD_n => DCD0, + SOut => TXD0, + RTS_n => RTS0, + DTR_n => DTR0, + OUT1_n => open, + OUT2_n => open, + BaudOut => BaudOut0, + Intr => open); + + u4 : entity work.T16450 + port map( + MR_n => Reset_s, + XIn => Clk, + RClk => BaudOut1, + CS_n => UART1CS_n, + Rd_n => RD_n, + Wr_n => IOWR_n, + A => A_i(2 downto 0), + D_In => D_i, + D_Out => UART1_D, + SIn => RXD1, + CTS_n => CTS1, + DSR_n => DSR1, + RI_n => RI1, + DCD_n => DCD1, + SOut => TXD1, + RTS_n => RTS1, + DTR_n => DTR1, + OUT1_n => open, + OUT2_n => open, + BaudOut => BaudOut1, + Intr => open); + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80.vhd new file mode 100644 index 00000000..398fa0df --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80.vhd @@ -0,0 +1,1073 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 and Auto_Wait_t1 = '0' then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if T_Res = '1' then + Auto_Wait_t1 <= '0'; + else + Auto_Wait_t1 <= Auto_Wait or IORQ_i; + end if; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if (Auto_Wait = '1' and Auto_Wait_t2 = '0') nor + (IOWait = 1 and IORQ_i = '1' and Auto_Wait_t1 = '0') then + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T8080se.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T8080se.vhd new file mode 100644 index 00000000..2b6d28f8 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T8080se.vhd @@ -0,0 +1,185 @@ +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- 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/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80_ALU.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80_ALU.vhd new file mode 100644 index 00000000..86fddce7 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80_ALU.vhd @@ -0,0 +1,351 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80_MCode.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80_MCode.vhd new file mode 100644 index 00000000..4cc30f35 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80_MCode.vhd @@ -0,0 +1,1934 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; +-- constant aNone : std_logic_vector(2 downto 0) := "000"; +-- constant aXY : std_logic_vector(2 downto 0) := "001"; +-- constant aIOA : std_logic_vector(2 downto 0) := "010"; +-- constant aSP : std_logic_vector(2 downto 0) := "011"; +-- constant aBC : std_logic_vector(2 downto 0) := "100"; +-- constant aDE : std_logic_vector(2 downto 0) := "101"; +-- constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0010"; + else + IncDec_16 <= "1010"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0010"; + else + IncDec_16 <= "1010"; + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80_Pack.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80_Pack.vhd new file mode 100644 index 00000000..ac7d34da --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80_Pack.vhd @@ -0,0 +1,208 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80_Reg.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80se.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80se.vhd new file mode 100644 index 00000000..ac8886a8 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/T80se.vhd @@ -0,0 +1,184 @@ +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80se is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0; -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + IOWait : integer := 1 -- 0 => Single cycle I/O, 1 => Std I/O cycle + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80se; + +architecture rtl of T80se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => Mode, + IOWait => IOWait) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/YM2149_linmix_sep.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/YM2149_linmix_sep.vhd new file mode 100644 index 00000000..27f26749 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/YM2149_linmix_sep.vhd @@ -0,0 +1,553 @@ +-- changes for seperate audio outputs and enable now enables cpu access as well +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + O_CHAN : out std_logic_vector(1 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal cnt_div_t1 : std_logic_vector(3 downto 0); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8; + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process(RESET_L, CLK) + begin + -- looks like registers are latches in real chip, but the address is caught at the end of the address state. + if (RESET_L = '0') then + addr <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA = '1') then + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end if; + end process; + + p_wdata : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + elsif rising_edge(CLK) then + if (ENA = '1') then + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, reg, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + cnt_div_t1 <= cnt_div; + end if; + end process; + + p_audio_output : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_AUDIO <= (others => '0'); + O_CHAN <= (others => '0'); + elsif rising_edge(CLK) then + + if (ENA = '1') then + O_AUDIO <= dac_amp(7 downto 0); + O_CHAN <= cnt_div_t1(1 downto 0); + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then -- resync + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end if; + end process; +end architecture RTL; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/dac.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/dac.vhd new file mode 100644 index 00000000..9f696b0b --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 11 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/gen_ram.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/gen_ram.vhd new file mode 100644 index 00000000..f1a95608 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/gen_ram.vhd @@ -0,0 +1,84 @@ +-- ----------------------------------------------------------------------- +-- +-- Syntiac's generic VHDL support files. +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- +-- Modified April 2016 by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +-- Remove address register when writing +-- +-- ----------------------------------------------------------------------- +-- +-- gen_rwram.vhd +-- +-- ----------------------------------------------------------------------- +-- +-- generic ram. +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity gen_ram is + generic ( + dWidth : integer := 8; + aWidth : integer := 10 + ); + port ( + clk : in std_logic; + we : in std_logic; + addr : in std_logic_vector((aWidth-1) downto 0); + d : in std_logic_vector((dWidth-1) downto 0); + q : out std_logic_vector((dWidth-1) downto 0) + ); +end entity; + +-- ----------------------------------------------------------------------- + +architecture rtl of gen_ram is + subtype addressRange is integer range 0 to ((2**aWidth)-1); + type ramDef is array(addressRange) of std_logic_vector((dWidth-1) downto 0); + signal ram: ramDef; + + signal rAddrReg : std_logic_vector((aWidth-1) downto 0); + signal qReg : std_logic_vector((dWidth-1) downto 0); +begin +-- ----------------------------------------------------------------------- +-- Signals to entity interface +-- ----------------------------------------------------------------------- +-- q <= qReg; + +-- ----------------------------------------------------------------------- +-- Memory write +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if we = '1' then + ram(to_integer(unsigned(addr))) <= d; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Memory read +-- ----------------------------------------------------------------------- +process(clk) + begin + if rising_edge(clk) then +-- qReg <= ram(to_integer(unsigned(rAddrReg))); +-- rAddrReg <= addr; +---- qReg <= ram(to_integer(unsigned(addr))); + q <= ram(to_integer(unsigned(addr))); + end if; + end process; +--q <= ram(to_integer(unsigned(addr))); +end architecture; + diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/gen_video.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/gen_video.vhd new file mode 100644 index 00000000..da8d77d4 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/gen_video.vhd @@ -0,0 +1,70 @@ +--------------------------------------------------------------------------------- +-- Galaga video horizontal/vertical and sync generator by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.ALL; + +entity gen_video is +port( + clk : in std_logic; + enable : in std_logic; + hcnt : out std_logic_vector(5 downto 0); + vcnt : out std_logic_vector(5 downto 0); + hsync : out std_logic; + vsync : out std_logic; + blankn : out std_logic +); +end gen_video; + +architecture struct of gen_video is + signal hblank : std_logic; + signal vblank : std_logic; + signal hcntReg : unsigned (5 DOWNTO 0) := to_unsigned(000,9); + signal vcntReg : unsigned (5 DOWNTO 0) := to_unsigned(015,9); +begin + +hcnt <= std_logic_vector(hcntReg); +vcnt <= std_logic_vector(vcntReg); + + +process(clk) begin + + if enable = '1' then + + if hcntReg = 511 then + hcntReg <= to_unsigned (128,9); + else + hcntReg <= hcntReg + 1; + end if; + + if hcntReg = 191 then + if vcntReg = 261 then + vcntReg <= to_unsigned(0,9); + else + vcntReg <= vcntReg + 1; + end if; + end if; + + if hcntReg = (175+ 0-8+8) then hsync <= '1'; -- 1 + elsif hcntReg = (175+29-8+8) then hsync <= '0'; + end if; + + if vcntReg = 252 then vsync <= '1'; + elsif vcntReg = 260 then vsync <= '0'; + end if; + + if hcntReg = (127+16+8) then hblank <= '1'; + elsif hcntReg = (255-17+8+1) then hblank <= '0'; + end if; + + if vcntReg = (240+1-1) then vblank <= '1'; + elsif vcntReg = (015+1) then vblank <= '0'; + end if; + + blankn <= not (hblank or vblank); + end if; + +end process; + +end architecture; \ No newline at end of file diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/hq2x.sv b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/hq2x.sv new file mode 100644 index 00000000..3e406318 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/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'bxx; + 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/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/keyboard.v b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/mist_io.v b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/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/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/mist_pll_12M_14M.qip b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/mist_pll_12M_14M.qip new file mode 100644 index 00000000..02816126 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/mist_pll_12M_14M.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 VHDL_FILE [file join $::quartus(qip_path) "mist_pll_12M_14M.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "mist_pll_12M_14M.ppf"] diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/mist_pll_12M_14M.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/mist_pll_12M_14M.vhd new file mode 100644 index 00000000..4865e696 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/mist_pll_12M_14M.vhd @@ -0,0 +1,424 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: mist_pll_12M_14M.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY mist_pll_12M_14M IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END mist_pll_12M_14M; + + +ARCHITECTURE SYN OF mist_pll_12m_14m IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + locked <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 420, + clk0_duty_cycle => 50, + clk0_multiply_by => 191, + clk0_phase_shift => "0", + clk1_divide_by => 360, + clk1_duty_cycle => 50, + clk1_multiply_by => 191, + clk1_phase_shift => "0", + clk2_divide_by => 105, + clk2_duty_cycle => 50, + clk2_multiply_by => 191, + clk2_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=mist_pll_12M_14M", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire6, + clk => sub_wire0, + locked => sub_wire2 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "420" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "360" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "105" +-- 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 "12.278571" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "14.325000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "49.114285" +-- 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 "1" +-- 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 "191" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "191" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "191" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "12.28800000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "14.31800000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "49.15200000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- 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 "ps" +-- 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 "mist_pll_12M_14M.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 "420" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "191" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "360" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "191" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "105" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "191" +-- 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_USED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..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: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- 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: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/osd.v b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/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/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/pooyan.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/pooyan.vhd new file mode 100644 index 00000000..e95413af --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/pooyan.vhd @@ -0,0 +1,821 @@ +--------------------------------------------------------------------------------- +-- Time pilot by Dar (darfpga@aol.fr) (29/10/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T80/T80se - Version : 0247 +----------------------------- +-- Z80 compatible microprocessor core +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- + +-- Features : +-- TV 15KHz mode only (atm) +-- Coctail mode ok +-- Sound ok + +-- Use with MAME roms from pooyan.zip +-- +-- Use make_pooyan_proms.bat to build vhd file from binaries +-- +-- Pooyan Hardware caracteristics : +-- +-- VIDEO : 1xZ80@3MHz CPU accessing its program rom, working ram, +-- sprite data ram, I/O, sound board register and trigger. +-- 32Kx8bits program rom +-- +-- One char tile map 32x28 +-- 8Kx16bits graphics rom 4bits/pixel +-- 16colors/16sets among 16 colors +-- +-- 24 sprites with priorities and flip H/V +-- 16Kx16bits graphics rom 4bits/pixel +-- 15 colors/16sets among 16 colors (different of char colors). +-- +-- Char/sprites color palette 2x16 colors among 256 colors +-- 3red 3green 2blue +-- +-- Working ram : 4Kx8bits +-- Sprites data ram : 256x16bits +-- Sprites line buffer rams : 1 scan line delay flip/flop 2x256x4bits + +-- SOUND : 1xZ80@1.79MHz CPU accessing its program rom, working ram, 2x-AY3-8910 +-- 16Kx8bits program rom +-- +-- 1xAY-3-8910 +-- I/O noise input and command/trigger from video board. +-- 3 sound channels +-- +-- 1xAY-3-8910 +-- 3 sound channels +-- +-- 6 RC filters with 4 states : transparent or cut 600Hz, 700Hz, 3.4KHz +-- +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity pooyan is +port( + clock_12 : in std_logic; + clock_14 : in std_logic; + reset : in std_logic; + video_r : out std_logic_vector(2 downto 0); + video_g : out std_logic_vector(2 downto 0); + video_b : out std_logic_vector(2 downto 0); + video_clk : out std_logic; + video_vblank : out std_logic; + video_hblank : out std_logic; + video_hs : out std_logic; + video_vs : out std_logic; + audio_out : out std_logic_vector(10 downto 0); + + dip_switch_1 : in std_logic_vector(7 downto 0); -- Coinage_B / Coinage_A + dip_switch_2 : in std_logic_vector(7 downto 0); -- Sound(8)/Difficulty(7-5)/Bonus(4)/Cocktail(3)/lives(2-1) + + start2 : in std_logic; + start1 : in std_logic; + coin1 : in std_logic; + + fire1 : in std_logic; + right1 : in std_logic; + left1 : in std_logic; + down1 : in std_logic; + up1 : in std_logic; + + fire2 : in std_logic; + right2 : in std_logic; + left2 : in std_logic; + down2 : in std_logic; + up2 : in std_logic; + + sw : in std_logic_vector(9 downto 0); + dbg_cpu_addr : out std_logic_vector(15 downto 0) + ); +end pooyan; + +architecture struct of pooyan is + + signal reset_n: std_logic; + signal clock_12n : std_logic; + signal clock_6 : std_logic := '0'; + signal clock_6n : std_logic; + signal clock_div : std_logic_vector(1 downto 0) := "00"; + + signal hcnt : std_logic_vector(5 downto 0); -- horizontal counter + signal vcnt : std_logic_vector(8 downto 0); -- vertical counter + signal pxcnt : std_logic_vector(2 downto 0); -- pixel counter + signal spcnt : std_logic_vector(4 downto 0); -- sprite counter + + signal csync : std_logic; + signal hsync0 : std_logic; + signal hsync1 : std_logic; + signal hsync2 : std_logic; + + signal hblank : std_logic; + signal vblank : std_logic; + + signal cpu_ena : std_logic; + + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_wr_n : std_logic; + signal cpu_mreq_n : std_logic; + signal cpu_nmi_n : std_logic; + + signal cpu_rom_do : std_logic_vector( 7 downto 0); + + signal wram_addr : std_logic_vector(11 downto 0); + signal wram_we : std_logic; + signal wram_do : std_logic_vector( 7 downto 0); + + signal ch_graphx_addr_f: std_logic_vector(11 downto 0); + signal ch_graphx_addr : std_logic_vector(11 downto 0); + signal ch_graphx1_do : std_logic_vector( 7 downto 0); + signal ch_graphx2_do : std_logic_vector( 7 downto 0); + signal ch_pixels : std_logic_vector(15 downto 0); + signal ch_data1 : std_logic_vector( 7 downto 0); + signal ch_color_set : std_logic_vector(3 downto 0); + signal ch_palette_addr : std_logic_vector(7 downto 0); + signal ch_palette_do : std_logic_vector(7 downto 0); + + signal spram_addr : std_logic_vector(7 downto 0); + signal spram1_we : std_logic; + signal spram1_do : std_logic_vector(7 downto 0); + signal spram2_we : std_logic; + signal spram2_do : std_logic_vector(7 downto 0); + + signal sp_graphx_addr : std_logic_vector(11 downto 0); + signal sp_graphx1_do : std_logic_vector(7 downto 0); + signal sp_graphx2_do : std_logic_vector(7 downto 0); + signal vcnt_r : std_logic_vector(8 downto 0); + signal sp_line : std_logic_vector(7 downto 0); + signal sp_on_line : std_logic; + signal sp_attr : std_logic_vector(7 downto 0); + signal sp_posh : std_logic_vector(7 downto 0); + signal sp_pixels : std_logic_vector(15 downto 0); + signal sp_color_set : std_logic_vector(3 downto 0); + signal sp_palette_addr : std_logic_vector(7 downto 0); + signal sp_palette_do : std_logic_vector(7 downto 0); + signal sp_read_out : std_logic_vector(3 downto 0); + signal sp_blank : std_logic; + + signal rgb_palette_addr : std_logic_vector(4 downto 0); + signal rgb_palette_do : std_logic_vector(7 downto 0); + + signal sp_buffer_write_addr : std_logic_vector(7 downto 0); + signal sp_buffer_write_we : std_logic; + signal sp_buffer_read_addr : std_logic_vector(7 downto 0); + + signal sp_buffer_ram1_addr : std_logic_vector(7 downto 0); + signal sp_buffer_ram1_we : std_logic; + signal sp_buffer_ram1_di : std_logic_vector(3 downto 0); + signal sp_buffer_ram1_do : std_logic_vector(3 downto 0); + + signal sp_buffer_ram2_addr : std_logic_vector(7 downto 0); + signal sp_buffer_ram2_we : std_logic; + signal sp_buffer_ram2_di : std_logic_vector(3 downto 0); + signal sp_buffer_ram2_do : std_logic_vector(3 downto 0); + + signal sp_buffer_sel : std_logic; + + signal itt_n : std_logic; + signal flip : std_logic; + signal A10x_we : std_logic; + signal A18x_we : std_logic; + signal sound_cmd : std_logic_vector(7 downto 0); + signal sound_trig : std_logic; + + signal input_0 : std_logic_vector(7 downto 0); + signal input_1 : std_logic_vector(7 downto 0); + signal input_2 : std_logic_vector(7 downto 0); + +begin +video_clk <= clock_6n; +clock_12n <= not clock_12; +clock_6n <= not clock_6; +reset_n <= not reset; + +-- debug +process (reset, clock_12) +begin + if rising_edge(clock_12) and cpu_ena ='1' and cpu_mreq_n ='0' then + dbg_cpu_addr <= cpu_addr; + end if; +end process; + +-- make 6MHz clock from 12MHz +process (clock_12) +begin + if reset='1' then + clock_6 <= '0'; + else + if rising_edge(clock_12) then + clock_6 <= not clock_6; + end if; + end if; +end process; + + +-------------------------- +-- Video/sprite scanner -- +-------------------------- + +-- make hcnt and vcnt video scanner from pixel clocks and counts +-- +-- pxcnt |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7| +-- hcnt | N | N+1 | +-- cpu_adr/do | | + +-- +-- hcnt [0..47] => 48 x 8 = 384 pixels, 384/6.144Mhz => 1 line is 62.5us (16.000KHz) +-- vcnt [252..255,256..511] => 260 lines, 1 frame is 260 x 62.5us = 16.250ms (61.54Hz) + +process (reset, clock_6) +begin + if reset='1' then + pxcnt <= "000"; + hcnt <= "000000"; + vcnt <= '0'&X"FC"; + spcnt <= "00000"; + else + if rising_edge(clock_6) then + pxcnt <= pxcnt + '1'; + if pxcnt = "111" then + hcnt <= hcnt + '1'; + + if hcnt = "101111" then -- char from #0 to #47 (one line) + hcnt <= "000000"; + if vcnt = '1'&X"FF" then + vcnt <= '0'&X"FC"; + else + vcnt <= vcnt + '1'; + end if; + end if; + + -- sprite down counter + if hcnt(0) = '1' then -- every is 16 bits (2 char) + if hcnt = "101111" then + spcnt <= "01000"; -- start with sprite #8 + else + spcnt <= spcnt + '1'; -- upto sprite #31 + end if; + end if; + + end if; + end if; + end if; +end process; + +cpu_ena <= not pxcnt(0); + +-- inputs +input_0 <= "111" & not start2 & not start1 & '1' & '1' & not coin1; -- ?/ ?/ ?/ 2S/ 1S/SVC/ C2/ C1 +input_1 <= "111" & not fire1 & not down1 & not up1 & not right1 & not left1; -- ?/1FL/1SR/1SL/1DW/1UP/1RI/1LE +input_2 <= "111" & not fire2 & not down2 & not up2 & not right2 & not left2; -- ?/2FL/2SR/2SL/2DW/2UP/2RI/2LE + +-- cpu input address decoding (mirror mostly from Mame) +cpu_di <= cpu_rom_do when cpu_addr(15 downto 12) < X"8" else -- 0000-7FFF + wram_do when cpu_addr(15 downto 12) = X"8" else -- 8000-8FFF + + spram1_do when cpu_addr(15 downto 12) = X"9" and + cpu_addr(10) = '0' else -- 9000-93FF + + spram2_do when cpu_addr(15 downto 12) = X"9" and + cpu_addr(10) = '1' else -- 9400-97FF + + dip_switch_2 when cpu_addr(15 downto 12) = X"A" and + cpu_addr( 7 downto 5) = "000" else -- A000-A000 + + input_0 when cpu_addr(15 downto 12) = X"A" and + cpu_addr( 7 downto 5) = "100" else -- A080-A080 + + input_1 when cpu_addr(15 downto 12) = X"A" and + cpu_addr( 7 downto 5) = "101" else -- A0A0-A0A0 + + input_2 when cpu_addr(15 downto 12) = X"A" and + cpu_addr( 7 downto 5) = "110" else -- A0C0-A0C0 + + dip_switch_1 when cpu_addr(15 downto 12) = X"A" and + cpu_addr( 7 downto 5) = "111" else -- A0E0-A0E0 + + X"FF"; + +-- working ram address multiplexer cpu/video scanner +wram_addr <= cpu_addr(11 downto 0) when cpu_ena = '1' else + '0' & pxcnt(1) & vcnt(7 downto 3) & hcnt(4 downto 0) when flip = '0' else + '0' & pxcnt(1) & not vcnt(7 downto 3) & not hcnt(4 downto 0); + +-- sprite data ram address multiplexer cpu/sprite scanner +spram_addr <= cpu_addr(7 downto 0) when cpu_ena = '1' else "00" & spcnt & pxcnt(1); + +-- write enable to working ram, sprite data ram and misc registers +wram_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"8" else '0'; +spram1_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"9" and cpu_addr(10) = '0' else '0'; +spram2_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"9" and cpu_addr(10) = '1' else '0'; +A10x_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"A" and cpu_addr(8 downto 7) = "10" else '0'; +A18x_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"A" and cpu_addr(8 downto 7) = "11" else '0'; + +-- Misc registers : interrupt enable/clear, cocktail flip, sound trigger +process (clock_6) +begin + if rising_edge(clock_6) then + if A10x_we = '1' then + sound_cmd <= cpu_do; + end if; + + if A18x_we = '1' then + if cpu_addr(2 downto 0) = "000" then itt_n <= cpu_do(0); end if; + if cpu_addr(2 downto 0) = "111" then flip <= not cpu_do(0); end if; + if cpu_addr(2 downto 0) = "001" then sound_trig <= cpu_do(0); end if; + end if; + + if itt_n = '0' then + cpu_nmi_n <= '1'; + else -- lauch nmi and end of frame + if (vcnt = 493) and (hcnt = "000000") and (pxcnt = "000") then + cpu_nmi_n <= '0'; + end if; + end if; + end if; +end process; + + +---------------------- +--- sprite machine --- +---------------------- +-- sprite data rams are scanned from sprites addresse 31 to 8 at each line + +-- latch current sprite data with respect to pixel and hcnt in relation +-- with sprite data ram addressing +process (clock_6) +begin + if rising_edge(clock_6) then + + if (hcnt(0) = '0') and (pxcnt = "001") then + sp_posh <= spram1_do ; -- a.k.a. X + sp_attr <= spram2_do ; -- color and flip x/y + vcnt_r <= vcnt; + end if; + + -- sprite is on current line if sp_line is below 16 + -- and if sprite vertical position (a.k.a. Y) is below xF0 + if (hcnt(0) = '0') and (pxcnt = "011") then + if sp_line(7 downto 4) = "0000" and spram2_do < X"F0" then + sp_on_line <= '1'; + else + sp_on_line <= '0'; + end if; + end if; + + -- delay sp_color_set + if (hcnt(0) = '0') and (pxcnt = "100") then + sp_color_set <= sp_attr(3 downto 0); + end if; + + end if; +end process; + +-- sp_line (valid only when pxcnt = "011") +sp_line <= not(vcnt_r(7 downto 0)) - spram2_do; + +-- address sprite graphics rom with sprite code and tile number and sprite line counter +-- with respect to sprite flip x/y controls +with sp_attr(7 downto 6) select + sp_graphx_addr <= spram1_do(5 downto 0) & sp_line(3) & hcnt(0) & pxcnt(2) & sp_line(2 downto 0) when "11", + spram1_do(5 downto 0) & sp_line(3) & not hcnt(0) & not pxcnt(2) & sp_line(2 downto 0) when "10", + spram1_do(5 downto 0) & not sp_line(3) & hcnt(0) & pxcnt(2) & not sp_line(2 downto 0) when "01", + spram1_do(5 downto 0) & not sp_line(3) & not hcnt(0) & not pxcnt(2) & not sp_line(2 downto 0) when others; + +-- latch and shift sprite graphics data with respect to flipx control +-- 16bits => 4x4bits = 4pixels / 16colors (15colors + transparent) +process (clock_6) +begin + if rising_edge(clock_6) then + + if pxcnt(1 downto 0) = "00" then + if sp_on_line = '1' then + if sp_attr(6) = '1' then + sp_pixels <= sp_graphx1_do & sp_graphx2_do; + else + sp_pixels( 3 downto 0) <= sp_graphx2_do(0) & sp_graphx2_do(1) & sp_graphx2_do(2) & sp_graphx2_do(3); + sp_pixels( 7 downto 4) <= sp_graphx2_do(4) & sp_graphx2_do(5) & sp_graphx2_do(6) & sp_graphx2_do(7); + sp_pixels(11 downto 8) <= sp_graphx1_do(0) & sp_graphx1_do(1) & sp_graphx1_do(2) & sp_graphx1_do(3); + sp_pixels(15 downto 12) <= sp_graphx1_do(4) & sp_graphx1_do(5) & sp_graphx1_do(6) & sp_graphx1_do(7); + end if; + else + sp_pixels <= (others => '0'); + end if; + else + sp_pixels( 3 downto 0) <= sp_pixels( 2 downto 0) & '0'; + sp_pixels( 7 downto 4) <= sp_pixels( 6 downto 4) & '0'; + sp_pixels(11 downto 8) <= sp_pixels(10 downto 8) & '0'; + sp_pixels(15 downto 12) <= sp_pixels(14 downto 12) & '0'; + end if; + + end if; + +end process; + +-- address sprite color palette 16colors/pixel, 16 sets => 16 colors +sp_palette_addr <= sp_color_set & sp_pixels(3) & sp_pixels(7) & sp_pixels(11) & sp_pixels(15); + +-- write sprite to line buffer at posh position +process (clock_6) +begin + if rising_edge(clock_6) then + if hcnt(0) = '0' and pxcnt = "101" then + sp_buffer_write_addr <= sp_posh; + else + sp_buffer_write_addr <= sp_buffer_write_addr + '1'; + end if; + end if; +end process; + +-- write colors to buffer when not transparent +sp_buffer_write_we <= '0' when sp_palette_do(3 downto 0) = "0000" else '1'; + +-- read sprite line buffer and erase after read +process (clock_12) +begin + if rising_edge(clock_12) then + if hcnt = "101111" and pxcnt = "111" then + sp_buffer_read_addr <= "11111010"; -- tune horizontal position of sprites + else + if clock_6 = '0' then + sp_buffer_read_addr <= sp_buffer_read_addr + '1'; + else + if vcnt(0) = '0' then + sp_read_out <= sp_buffer_ram1_do; + else + sp_read_out <= sp_buffer_ram2_do; + end if; + end if; + end if; + end if; +end process; + +-- toggle read/write sprite line buffer every other line + +-- wait pxcnt = "101" to allow last sprite (#31) to be written to line buffer +process (clock_6) +begin + if rising_edge(clock_6) then + if pxcnt = "101" then sp_buffer_sel <= vcnt(0); end if; + end if; +end process; + +sp_buffer_ram1_addr <= sp_buffer_read_addr when sp_buffer_sel = '0' else sp_buffer_write_addr; +sp_buffer_ram2_addr <= sp_buffer_read_addr when sp_buffer_sel = '1' else sp_buffer_write_addr; + +sp_buffer_ram1_di <= "0000" when sp_buffer_sel = '0' else sp_palette_do(3 downto 0); +sp_buffer_ram2_di <= "0000" when sp_buffer_sel = '1' else sp_palette_do(3 downto 0); + +sp_buffer_ram1_we <= not clock_6 when sp_buffer_sel = '0' else sp_buffer_write_we; +sp_buffer_ram2_we <= not clock_6 when sp_buffer_sel = '1' else sp_buffer_write_we; + +-------------------- +--- char machine --- +-------------------- + +-- latch current char data with respect to vcnt and hcnt in relation +-- with wram ram addressing +process (clock_6) +begin + if rising_edge(clock_6) and pxcnt = "001" then + ch_data1 <= wram_do ; + end if; + + if rising_edge(clock_6) and pxcnt = "100" then + ch_color_set <= ch_data1(3 downto 0) ; + end if; + +end process; + +-- address char graphics rom with char code, pixel count and vertical line counter +-- with respect to char flip x/y controls +with ch_data1(7 downto 6) select +ch_graphx_addr_f <= wram_do & pxcnt(2) & vcnt(2 downto 0) when "00", + wram_do & not pxcnt(2) & vcnt(2 downto 0) when "01", + wram_do & pxcnt(2) & not(vcnt(2 downto 0)) when "10", + wram_do & not pxcnt(2) & not(vcnt(2 downto 0)) when others; + +-- in cocktail flip mode negate h/v counters +ch_graphx_addr <= ch_graphx_addr_f when flip ='0' else ch_graphx_addr_f xor "000000001111"; + +-- latch and shift char graphics data with respect to flipx control and cocktail flip control +-- 16bits => 4x4bits = 4pixels / 16colors +process (clock_6) +begin + if rising_edge(clock_6) then + if pxcnt(1 downto 0) = "00" then + if (ch_data1(6) xor flip) = '0' then + ch_pixels <= ch_graphx1_do & ch_graphx2_do; + else + ch_pixels( 3 downto 0) <= ch_graphx2_do(0) & ch_graphx2_do(1) &ch_graphx2_do(2) &ch_graphx2_do(3); + ch_pixels( 7 downto 4) <= ch_graphx2_do(4) & ch_graphx2_do(5) &ch_graphx2_do(6) &ch_graphx2_do(7); + ch_pixels(11 downto 8) <= ch_graphx1_do(0) & ch_graphx1_do(1) &ch_graphx1_do(2) &ch_graphx1_do(3); + ch_pixels(15 downto 12) <= ch_graphx1_do(4) & ch_graphx1_do(5) &ch_graphx1_do(6) &ch_graphx1_do(7); + end if; + else + ch_pixels( 3 downto 0) <= ch_pixels( 2 downto 0) & '0'; + ch_pixels( 7 downto 4) <= ch_pixels( 6 downto 4) & '0'; + ch_pixels(11 downto 8) <= ch_pixels(10 downto 8) & '0'; + ch_pixels(15 downto 12) <= ch_pixels(14 downto 12) & '0'; + end if; + end if; + +end process; + +-- address char color palette 4 colors, 64 sets => 16 colors +with sw(4 downto 0) select +ch_palette_addr <= +ch_color_set & ch_pixels(3) & ch_pixels( 7) & ch_pixels(11) & ch_pixels(15) when '0'&X"0", +ch_color_set & ch_pixels(3) & ch_pixels( 7) & ch_pixels(15) & ch_pixels(11) when '0'&X"1", +ch_color_set & ch_pixels(3) & ch_pixels(11) & ch_pixels( 7) & ch_pixels(15) when '0'&X"2", +ch_color_set & ch_pixels(3) & ch_pixels(11) & ch_pixels(15) & ch_pixels( 7) when '0'&X"3", +ch_color_set & ch_pixels(3) & ch_pixels(15) & ch_pixels( 7) & ch_pixels(11) when '0'&X"4", +ch_color_set & ch_pixels(3) & ch_pixels(15) & ch_pixels(11) & ch_pixels( 7) when '0'&X"5", + +ch_color_set & ch_pixels(7) & ch_pixels( 3) & ch_pixels(11) & ch_pixels(15) when '0'&X"6", +ch_color_set & ch_pixels(7) & ch_pixels( 3) & ch_pixels(15) & ch_pixels(11) when '0'&X"7", +ch_color_set & ch_pixels(7) & ch_pixels(11) & ch_pixels( 3) & ch_pixels(15) when '0'&X"8", +ch_color_set & ch_pixels(7) & ch_pixels(11) & ch_pixels(15) & ch_pixels( 3) when '0'&X"9", +ch_color_set & ch_pixels(7) & ch_pixels(15) & ch_pixels( 3) & ch_pixels(11) when '0'&X"A", +ch_color_set & ch_pixels(7) & ch_pixels(15) & ch_pixels(11) & ch_pixels( 3) when '0'&X"B", + +ch_color_set & ch_pixels(11) & ch_pixels( 3) & ch_pixels( 7) & ch_pixels(15) when '0'&X"C", +ch_color_set & ch_pixels(11) & ch_pixels( 3) & ch_pixels(15) & ch_pixels( 7) when '0'&X"D", +ch_color_set & ch_pixels(11) & ch_pixels( 7) & ch_pixels( 3) & ch_pixels(15) when '0'&X"E", +ch_color_set & ch_pixels(11) & ch_pixels( 7) & ch_pixels(15) & ch_pixels( 3) when '0'&X"F", +ch_color_set & ch_pixels(11) & ch_pixels(15) & ch_pixels( 3) & ch_pixels( 7) when '1'&X"0", +ch_color_set & ch_pixels(11) & ch_pixels(15) & ch_pixels( 7) & ch_pixels( 3) when '1'&X"1", + +ch_color_set & ch_pixels(15) & ch_pixels( 3) & ch_pixels( 7) & ch_pixels(11) when '1'&X"2", +ch_color_set & ch_pixels(15) & ch_pixels( 3) & ch_pixels(11) & ch_pixels( 7) when '1'&X"3", +ch_color_set & ch_pixels(15) & ch_pixels( 7) & ch_pixels( 3) & ch_pixels(11) when '1'&X"4", +ch_color_set & ch_pixels(15) & ch_pixels( 7) & ch_pixels(11) & ch_pixels( 3) when '1'&X"5", +ch_color_set & ch_pixels(15) & ch_pixels(11) & ch_pixels( 3) & ch_pixels( 7) when '1'&X"6", +ch_color_set & ch_pixels(15) & ch_pixels(11) & ch_pixels( 7) & ch_pixels( 3) when others; + +--------------------- +-- mux char/sprite -- +--------------------- + +-- char data controls sprite display/hide +--process (clock_6) +--begin +-- if rising_edge(clock_6) then +-- sp_blank <= ch_color_set(4); +-- end if; +--end process; + +-- select rbg color and bank with respect to char/sprite selection +rgb_palette_addr <= +-- '1' & ch_palette_do(3 downto 0) when (sp_read_out = "0000" or sp_blank = '1') else + '1' & ch_palette_do(3 downto 0) when (sp_read_out = "0000" ) else + '0' & sp_read_out; + + + + +-- register and assign rbg palette output +process (clock_6) +begin + if rising_edge(clock_6) then + if hblank = '1' or vblank = '1' then + video_r <= "000"; + video_g <= "000"; + video_b <= "000"; + else + video_r <= rgb_palette_do(2 downto 0); + video_g <= rgb_palette_do(5 downto 3); + video_b <= rgb_palette_do(7 downto 6) & '0'; + end if; + end if; +end process; + +video_hblank <= hblank; +video_vblank <= vblank; + +---------------------------- +-- video syncs and blanks -- +---------------------------- + +process(clock_6) + constant hcnt_base : integer := 36; + variable vsync_cnt : std_logic_vector(3 downto 0); +begin + if rising_edge(clock_6) and pxcnt = "110" then + + if hcnt = hcnt_base+0 then hsync0 <= '0'; + elsif hcnt = hcnt_base+3 then hsync0 <= '1'; + end if; + + if hcnt = hcnt_base then + if vcnt = 500 then + vsync_cnt := X"0"; + else + if vsync_cnt < X"F" then vsync_cnt := vsync_cnt + '1'; end if; + end if; + end if; + + if hcnt = hcnt_base-4 then + hblank <= '1'; + if vcnt = 496 then + vblank <= '1'; -- 492 ok + elsif vcnt = 262 then + vblank <= '0'; -- 262 ok + end if; + elsif hcnt = 0 then + hblank <= '0'; + end if; + + video_hs <= hsync0; + + if vsync_cnt = 0 then video_vs <= '0'; + elsif vsync_cnt = 8 then video_vs <= '1'; + end if; + + end if; +end process; + +------------------------------ +-- components & sound board -- +------------------------------ + +-- microprocessor Z80 +cpu : entity work.T80se +generic map(Mode => 0, T2Write => 1, IOWait => 1) +port map( + RESET_n => reset_n, + CLK_n => clock_6, + CLKEN => cpu_ena, + WAIT_n => '1', + INT_n => '1', --cpu_irq_n, + NMI_n => cpu_nmi_n, + BUSRQ_n => '1', + M1_n => open, + MREQ_n => cpu_mreq_n, + IORQ_n => open, + RD_n => open, + WR_n => cpu_wr_n, + RFSH_n => open, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_di, + DO => cpu_do +); + +-- cpu1 program ROM +rom_cpu1 : entity work.pooyan_prog +port map( + clk => clock_6n, + addr => cpu_addr(14 downto 0), + data => cpu_rom_do +); + +-- working/char RAM 0x8000-0x8FFF +wram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 12) +port map( + clk => clock_6n, + we => wram_we, + addr => wram_addr, + d => cpu_do, + q => wram_do +); + +-- sprite RAM1 0x9000-0x90FF +spram1 : entity work.gen_ram +generic map( dWidth => 8, aWidth => 8) +port map( + clk => clock_6n, + we => spram1_we, + addr => spram_addr, + d => cpu_do, + q => spram1_do +); + +-- sprite RAM2 0x9400-0x94FF +spram2 : entity work.gen_ram +generic map( dWidth => 8, aWidth => 8) +port map( + clk => clock_6n, + we => spram2_we, + addr => spram_addr, + d => cpu_do, + q => spram2_do +); + +-- sprite line buffer 1 +splinebuf1 : entity work.gen_ram +generic map( dWidth => 4, aWidth => 8) +port map( + clk => clock_12n, + we => sp_buffer_ram1_we, + addr => sp_buffer_ram1_addr, + d => sp_buffer_ram1_di, + q => sp_buffer_ram1_do +); + +-- sprite line buffer 2 +splinebuf2 : entity work.gen_ram +generic map( dWidth => 4, aWidth => 8) +port map( + clk => clock_12n, + we => sp_buffer_ram2_we, + addr => sp_buffer_ram2_addr, + d => sp_buffer_ram2_di, + q => sp_buffer_ram2_do +); + +-- char graphics ROM G10 +char_graphics_1 : entity work.pooyan_char_grphx1 +port map( + clk => clock_6, + addr => ch_graphx_addr, + data => ch_graphx1_do +); + +-- char graphics ROM G9 +char_graphics_2 : entity work.pooyan_char_grphx2 +port map( + clk => clock_6, + addr => ch_graphx_addr, + data => ch_graphx2_do +); + +-- char palette ROM +ch_palette : entity work.pooyan_char_color_lut +port map( + clk => clock_6, + addr => ch_palette_addr, + data => ch_palette_do +); + +-- sprite graphics ROM A9 +sp_graphics_1 : entity work.pooyan_sprite_grphx1 +port map( + clk => clock_6, + addr => sp_graphx_addr, + data => sp_graphx1_do +); + +-- sprite graphics ROM A8 +sp_graphics_2 : entity work.pooyan_sprite_grphx2 +port map( + clk => clock_6, + addr => sp_graphx_addr, + data => sp_graphx2_do +); + +-- sprite palette ROM +sp_palette : entity work.pooyan_sprite_color_lut +port map( + clk => clock_6, + addr => sp_palette_addr, + data => sp_palette_do +); + +-- rgb palette ROM +rgb_palette_gb : entity work.pooyan_palette +port map( + clk => clock_6, + addr => rgb_palette_addr, + data => rgb_palette_do +); + + +-- sound board +pooyan_sound_board : entity work.pooyan_sound_board +port map( + clock_14 => clock_14, + reset => reset, + + sound_trig => sound_trig, + sound_cmd => sound_cmd, + + audio_out => audio_out, + + dbg_cpu_addr => open + ); + +end struct; \ No newline at end of file diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/pooyan_mist.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/pooyan_mist.vhd new file mode 100644 index 00000000..bb5088a5 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/pooyan_mist.vhd @@ -0,0 +1,279 @@ +--------------------------------------------------------------------------------- +-- Mist Top level for Time pilot by Dar (darfpga@aol.fr) (29/10/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- Use time_pilot_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- +-- Uses 1 pll for 12MHz and 14MHz generation from 27MHz +-- +-- Mist key : +-- Right Button : reset game +-- +-- Keyboard players inputs : +-- +-- ESC : Add coin +-- 2 : Start 2 players +-- 1 : Start 1 player +-- SPACE : Fire +-- RIGHT arrow : rotate right +-- LEFT arrow : rotate left +-- UP arrow : rotate up +-- DOWN arrow : rotate down +-- +-- Other details : see time_pilot.vhd + +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; + +entity pooyan_mist is +port( + CLOCK_27 : in std_logic; + AUDIO_L : out std_logic; + AUDIO_R : out std_logic; + VGA_R : out std_logic_vector(5 downto 0); + VGA_G : out std_logic_vector(5 downto 0); + VGA_B : out std_logic_vector(5 downto 0); + VGA_VS : out std_logic; + VGA_HS : out std_logic; + LED : out std_logic; + SPI_SCK : in std_logic; + SPI_DI : in std_logic; + SPI_DO : out std_logic; + SPI_SS3 : in std_logic; + CONF_DATA0 : in std_logic +); +end pooyan_mist; + +architecture struct of pooyan_mist is + + signal clock_48 : std_logic; + signal clock_12 : std_logic; + signal clock_14 : std_logic; + signal reset : std_logic; + signal pll_locked: std_logic; + + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic; + signal audio : std_logic_vector(10 downto 0); + signal audio_pwm : std_logic; + + signal reset_n : std_logic; + signal ps2_clk : std_logic; + signal ps2_dat : std_logic; + signal joy_u : std_logic; + signal joy_l : std_logic; + signal joy_r : std_logic; + signal joy_d : std_logic; + signal kbd_intr : std_logic; + signal kbd_scancode : std_logic_vector(7 downto 0); + + + -- User IO + signal buttons : std_logic_vector(1 downto 0); + signal joy0 : std_logic_vector(7 downto 0); + signal joy1 : std_logic_vector(7 downto 0); + signal status : std_logic_vector(31 downto 0); + signal pix_ce : std_logic; + signal kbd_joy0 : std_logic_vector(7 downto 0); + signal kbd_joy1 : std_logic_vector(7 downto 0); + signal ps2Clk : std_logic; + signal ps2Data : std_logic; + signal ps2_scancode : std_logic_vector(7 downto 0); + + signal VGA_R_O : std_logic_vector(2 downto 0); + signal VGA_G_O : std_logic_vector(2 downto 0); + signal VGA_B_O : std_logic_vector(2 downto 0); + signal R : std_logic_vector(5 downto 0); + signal G : std_logic_vector(5 downto 0); + signal B : std_logic_vector(5 downto 0); + + constant CONF_STR : string := + "POOYAN;;O4,Joystick Control,Upright,Normal;T5,Reset;"; + + + function to_slv(s: string) return std_logic_vector is + constant ss: string(1 to s'length) := s; + variable rval: std_logic_vector(1 to 8 * s'length); + variable p: integer; + variable c: integer; + begin + for i in ss'range loop + p := 8 * i; + c := character'pos(ss(i)); + rval(p - 7 to p) := std_logic_vector(to_unsigned(c,8)); + end loop; + return rval; + end function; + + component mist_io + generic ( STRLEN : integer := 0 ); + port ( + clk_sys :in std_logic; + SPI_SCK, CONF_DATA0, SPI_DI :in std_logic; + SPI_DO : out std_logic; + conf_str : in std_logic_vector(8*STRLEN-1 downto 0); + buttons : out std_logic_vector(1 downto 0); + joystick_0 : out std_logic_vector(7 downto 0); + joystick_1 : out std_logic_vector(7 downto 0); + status : out std_logic_vector(31 downto 0); + ps2_kbd_clk : out std_logic; + ps2_kbd_data : out std_logic + ); + end component mist_io; + + component video_mixer + generic ( LINE_LENGTH : integer := 384; HALF_DEPTH : integer := 1 ); + port ( + clk_sys, ce_pix, ce_pix_actual : in std_logic; + SPI_SCK, SPI_SS3, SPI_DI : in std_logic; + R, G, B : in std_logic_vector(2 downto 0); + HSync, VSync, line_start: in std_logic; + VGA_R,VGA_G, VGA_B : out std_logic_vector(5 downto 0); + VGA_VS, VGA_HS : out std_logic + ); + end component video_mixer; + + component keyboard + PORT( + clk : in std_logic; + reset : in std_logic; + ps2_kbd_clk : in std_logic; + ps2_kbd_data : in std_logic; + joystick : out std_logic_vector (7 downto 0) + ); + end component; + +begin + +reset <= status(0) or status(5) or buttons(1) or not pll_locked; + +clocks : entity work.mist_pll_12M_14M + port map( + inclk0 => CLOCK_27, + c0 => clock_12,--12.28800000 + c1 => clock_14,--14.31800000 + c2 => clock_48,--49.15200000 + locked => pll_locked +); + + +vmixer : video_mixer + port map ( + clk_sys => clock_48, + ce_pix => pix_ce, + ce_pix_actual => pix_ce, + SPI_SCK => SPI_SCK, + SPI_SS3 => SPI_SS3, + SPI_DI => SPI_DI, + R => VGA_R_O, + G => VGA_G_O, + B => VGA_B_O, + HSync => hsync, + VSync => vsync, + line_start => '0', + VGA_R => VGA_R, + VGA_G => VGA_G, + VGA_B => VGA_B, + VGA_VS => VGA_VS, + VGA_HS => VGA_HS +); + +mist_io_inst : mist_io + generic map (STRLEN => CONF_STR'length) + port map ( + clk_sys => clock_48, + SPI_SCK => SPI_SCK, + CONF_DATA0 => CONF_DATA0, + SPI_DI => SPI_DI, + SPI_DO => SPI_DO, + conf_str => to_slv(CONF_STR), + buttons => buttons, + joystick_1 => joy1, + joystick_0 => joy0, + status => status, + ps2_kbd_clk => ps2Clk, + ps2_kbd_data => ps2Data +); + +Joy_r <= joy0(0) or joy1(0) or kbd_joy0(7) when status(4) = '0' + else joy0(3) or joy1(3) or kbd_joy0(4);--normal +Joy_l <= joy0(1) or joy1(1) or kbd_joy0(6) when status(4) = '0' + else joy0(2) or joy1(2) or kbd_joy0(5); +Joy_u <= joy0(3) or joy1(3) or kbd_joy0(4) when status(4) = '0' + else joy0(1) or joy1(1) or kbd_joy0(6); +Joy_d <= joy0(2) or joy1(2) or kbd_joy0(5) when status(4) = '0' + else joy0(0) or joy1(0) or kbd_joy0(7); + + +pooyan : entity work.pooyan + port map( + clock_12 => clock_12, + clock_14 => clock_14, + reset => reset, + video_r => VGA_R_O, + video_g => VGA_G_O, + video_b => VGA_B_O, + video_hblank => hblank, + video_vblank => vblank, + video_clk => pix_ce, + video_hs => hsync, + video_vs => vsync, + audio_out => audio, + dip_switch_1 => X"FF", -- Coinage_B / Coinage_A + dip_switch_2 => X"FB", -- Sound(8)/Difficulty(7-5)/Bonus(4)/Cocktail(3)/lives(2-1) + start2 => kbd_joy0(2) or status(3), + start1 => kbd_joy0(1) or status(2), + coin1 => kbd_joy0(3) or status(1), + fire1 => joy0(4) or joy1(4) or kbd_joy0(0), + right1 => Joy_r, + left1 => Joy_l, + down1 => Joy_d, + up1 => Joy_u, + fire2 => joy0(4) or joy1(4) or kbd_joy0(0), + right2 => Joy_r, + left2 => Joy_l, + down2 => Joy_d, + up2 => Joy_u, + sw => "0000000000", + dbg_cpu_addr => open +); + + +u_keyboard : keyboard + port map( + clk => clock_48, + reset => reset, + ps2_kbd_clk => ps2Clk, + ps2_kbd_data => ps2Data, + joystick => kbd_joy0 +); + +u_dac : entity work.dac + port map( + clk_i => clock_48, + res_n_i => not reset, + dac_i => audio, + dac_o => audio_pwm +); + +AUDIO_L <= audio_pwm; +AUDIO_R <= audio_pwm; + + LED <= '1'; +end struct; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/pooyan_sound_board.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/pooyan_sound_board.vhd new file mode 100644 index 00000000..a4b38c7d --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/pooyan_sound_board.vhd @@ -0,0 +1,426 @@ +--------------------------------------------------------------------------------- +-- Pooyan sound board by Dar (darfpga@aol.fr) (08/11/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- gen_ram.vhd +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T80/T80se - Version : 0247 +----------------------------- +-- Z80 compatible microprocessor core +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity pooyan_sound_board is +port( + clock_14 : in std_logic; + reset : in std_logic; + + sound_cmd : in std_logic_vector(7 downto 0); + sound_trig : in std_logic; + + audio_out : out std_logic_vector(10 downto 0); + + dbg_cpu_addr : out std_logic_vector(15 downto 0) + ); +end pooyan_sound_board; + +architecture struct of pooyan_sound_board is + + signal reset_n: std_logic; + signal clock_14n : std_logic; + + signal clock_div1 : std_logic_vector(11 downto 0) := (others => '0'); + signal biquinary_div : std_logic_vector(3 downto 0) := (others => '0'); + + signal cpu_clock : std_logic; + signal ayx_clock : std_logic; + + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_wr_n : std_logic; + signal cpu_mreq_n : std_logic; + signal cpu_irq_n : std_logic; + signal cpu_iorq_n : std_logic; + signal cpu_m1_n : std_logic; + + signal cpu_rom_do : std_logic_vector( 7 downto 0); + signal wram_do : std_logic_vector( 7 downto 0); + signal wram_we : std_logic; + + signal clr_irq_n : std_logic; + signal sen1_n : std_logic; + signal sen2_n : std_logic; + signal sen3_n : std_logic; + signal sen4_n : std_logic; + + signal sound_trig_r : std_logic; + + signal ay1_do : std_logic_vector(7 downto 0); + signal ay1_cs_n : std_logic; + signal ay1_bdir : std_logic; + signal ay1_bc1 : std_logic; + signal ay1_audio_muxed : std_logic_vector(7 downto 0); + signal ay1_audio_chan : std_logic_vector(1 downto 0); + signal ay1_port_b_di : std_logic_vector(7 downto 0); + + signal ay2_do : std_logic_vector(7 downto 0); + signal ay2_cs_n : std_logic; + signal ay2_bdir : std_logic; + signal ay2_bc1 : std_logic; + signal ay2_audio_muxed : std_logic_vector(7 downto 0); + signal ay2_audio_chan : std_logic_vector(1 downto 0); + + signal ay1_chan_a : std_logic_vector(7 downto 0); + signal ay1_chan_b : std_logic_vector(7 downto 0); + signal ay1_chan_c : std_logic_vector(7 downto 0); + signal ay2_chan_a : std_logic_vector(7 downto 0); + signal ay2_chan_b : std_logic_vector(7 downto 0); + signal ay2_chan_c : std_logic_vector(7 downto 0); + + signal filter_cmd_we : std_logic; + signal filter_cmd : std_logic_vector(11 downto 0); + signal mult_cmd : std_logic_vector(1 downto 0); + signal mult_value : integer range 0 to 779; + + signal Vc_1a : integer range -256*1024 to 256*1024-1; + signal Vc_1b : integer range -256*1024 to 256*1024-1; + signal Vc_1c : integer range -256*1024 to 256*1024-1; + signal Vc_2a : integer range -256*1024 to 256*1024-1; + signal Vc_2b : integer range -256*1024 to 256*1024-1; + signal Vc_2c : integer range -256*1024 to 256*1024-1; + signal Vc : integer range -256*1024 to 256*1024-1; + signal Vin : integer range -256 to 255; + signal dV : integer range -512 to 511; + signal Vcn_a : integer range -1024*1024 to 1024*1024-1; + signal Vcn_b : integer range -1024*1024 to 1024*1024-1; + signal Vcn_c : integer range -256*1024 to 256*1024-1; + +begin + +clock_14n <= not clock_14; +reset_n <= not reset; + +-- debug +process (reset, clock_14) +begin + if rising_edge(clock_14) and cpu_mreq_n ='0' then + dbg_cpu_addr <= cpu_addr; + end if; +end process; + +-------------------------------------------------------- +-- RC filters equation +-- +-- Vc : capacitor voltage = output voltage +-- fs : sample frequency +-- Vin : voltage at resistor input +-- +-- Vc(k+1) = Vc(k) + (Vin-Vc(k))/(fs.R.C) +-- +-- Vcn * 1024 <= Vcn * 1024 + (Vin-Vc) * 1024/(fs.R.C) +-- With Vcn = 1024 * Vc +-------------------------------------------------------- +-- Filters will be run at 14.318MHz/512 = 27.96KHz +-------------------------------------------------------- +-- 6 filters have to be implemented +-- RC equation is time multiplexed to save multiplier +-- for small FPGA +-------------------------------------------------------- + +-- mux Vc +with clock_div1(3 downto 0) select +Vc <= Vc_1a when X"0", -- Vc_xy : [0..255*1024] + Vc_1b when X"1", -- => Vc : [-256*1024..255*1024] + Vc_1c when X"2", + Vc_2a when X"3", + Vc_2b when X"4", + Vc_2c when others; + +-- mux Vin +with clock_div1(3 downto 0) select +Vin <= to_integer(unsigned(ay1_chan_a)) when X"0", -- ayx_chan_y : [0..255] + to_integer(unsigned(ay1_chan_b)) when X"1", -- => Vin : [-256:255] + to_integer(unsigned(ay1_chan_c)) when X"2", + to_integer(unsigned(ay2_chan_a)) when X"3", + to_integer(unsigned(ay2_chan_b)) when X"4", + to_integer(unsigned(ay2_chan_c)) when others; + +-- compute dV +dV <= Vin-Vc/1024; -- Vc/1024 : [0..255], dv : [-255..511] => [-512..511] + +-- mux filter cmd +with clock_div1(3 downto 0) select +mult_cmd <= filter_cmd( 7 downto 6) when X"0", + filter_cmd( 9 downto 8) when X"1", + filter_cmd(11 downto 10) when X"2", + filter_cmd( 1 downto 0) when X"3", + filter_cmd( 3 downto 2) when X"4", + filter_cmd( 5 downto 4) when others; + +-- mux multiplier value +with mult_cmd select +mult_value <= 779 when "10", -- 0.047uF/1KOhm => (1024/fs.R.C = 779, cut fcy 3386Hz) + 166 when "01", -- 0.220uF/1KOhm => (1024/fs.R.C = 166, cut fcy 723Hz) + 137 when "11", -- 0.267uF/1KOhm => (1024/fs.R.C = 137, cut fcy 596Hz) + 779 when others; -- Not use + +-- compute Vcn +Vcn_a <= Vin*1024 when mult_cmd = "00" else Vc + dv*mult_value; -- => Vcn_a : [-1024*1024..1023*1024] + +-- limit to > 0 +Vcn_b <= 0 when Vcn_a < 0 else Vcn_a; + +-- limit to < 255*1024 +Vcn_c <= 255*1024 when Vcn_b > 255*1024 else Vcn_b; + +-- demux/store result and mix channels +process (clock_14) +begin + if rising_edge(clock_14) then -- 14.318MHz/512 => fs = 27.96KHz + + -- demux & down sample + if clock_div1(8 downto 0) = '0'&X"00" then Vc_1a <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"01" then Vc_1b <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"02" then Vc_1c <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"03" then Vc_2a <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"04" then Vc_2b <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"05" then Vc_2c <= Vcn_c; end if; + + -- rescale and mix channels with down sample + if clock_div1(8 downto 0) = '0'&X"06" then + audio_out <= std_logic_vector(to_unsigned(Vc_1a/1024,11)) + + std_logic_vector(to_unsigned(Vc_1b/1024,11)) + + std_logic_vector(to_unsigned(Vc_1c/1024,11)) + + std_logic_vector(to_unsigned(Vc_2a/1024,11)) + + std_logic_vector(to_unsigned(Vc_2b/1024,11)) + + std_logic_vector(to_unsigned(Vc_2c/1024,11)); + end if; + end if; +end process; + + +-- divide clocks +-- random generator ? +process (clock_14) +begin + if reset='1' then + clock_div1 <= (others =>'0'); + biquinary_div <= (others =>'0'); + else + if rising_edge(clock_14) then + clock_div1 <= clock_div1 + '1'; + + if clock_div1 = X"800" then + if biquinary_div(3 downto 1) = "100" then + biquinary_div(3 downto 1) <= "000"; + biquinary_div(0) <= not biquinary_div(0); + else + biquinary_div(3 downto 1) <= biquinary_div(3 downto 1) + '1'; + end if; + end if; + + end if; + end if; +end process; + +-- make clocks for cpu and sound generators +cpu_clock <= clock_div1(2); +ayx_clock <= not clock_div1(2); + +-- mux rom/ram/devices data ouput to cpu data input w.r.t cpu address +cpu_di <= cpu_rom_do when cpu_addr(15 downto 12) = "0000" else -- 0000-0FFF + wram_do when cpu_addr(15 downto 12) = "0011" else -- 3000-3FFF + ay1_do when cpu_addr(15 downto 13) = "010" else -- 4000-5FFF + ay2_do when cpu_addr(15 downto 13) = "011" else -- 6000-7FFF + X"FF"; + +-- write enable to working ram and filter command register +wram_we <= '1' when cpu_wr_n = '0' and cpu_addr(15 downto 12) = "0011" else '0'; +filter_cmd_we <= '1' when cpu_wr_n = '0' and cpu_addr(15) = '1' else '0'; + +-- chip select with r/w direction to AY chips +sen1_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"4" else '1'; +sen2_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"5" else '1'; +sen3_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"6" else '1'; +sen4_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"7" else '1'; + +-- finalise AY r/w & address controls +ay1_bc1 <= not sen2_n or ( cpu_wr_n and not sen1_n); +ay1_bdir <= not sen2_n or (not cpu_wr_n and not sen1_n); +ay1_cs_n <= sen1_n and sen2_n; + +ay2_bc1 <= not sen4_n or ( cpu_wr_n and not sen3_n); +ay2_bdir <= not sen4_n or (not cpu_wr_n and not sen3_n); +ay2_cs_n <= sen3_n and sen4_n; + +-- input random (?) to AY1 chip +ay1_port_b_di <= biquinary_div(0)&biquinary_div(3)&biquinary_div(2)&clock_div1(11)&"0000"; + +-- clear irq when reset and irq acknowledge +clr_irq_n <= reset_n and (cpu_m1_n or cpu_iorq_n); + +-- regsiter filters commands (11 bits data are cpu address) +process (cpu_clock) +begin + if rising_edge(cpu_clock) then + if filter_cmd_we = '1' then filter_cmd <= cpu_addr(11 downto 0); end if; + end if; +end process; + +-- latch sound trigger rising edge to set cpu_irq, and manage clear +process (clock_14) +begin + if rising_edge(clock_14) then + + sound_trig_r <= sound_trig; + + if clr_irq_n = '0' then + cpu_irq_n <= '1'; + else + if sound_trig ='1' and sound_trig_r = '0' then + cpu_irq_n <= '0'; + end if; + end if; + + end if; +end process; + +-- demux AY chips output +process (ayx_clock) +begin + if rising_edge(ayx_clock) then + if ay1_audio_chan = "00" then ay1_chan_a <= ay1_audio_muxed; end if; + if ay1_audio_chan = "01" then ay1_chan_b <= ay1_audio_muxed; end if; + if ay1_audio_chan = "10" then ay1_chan_c <= ay1_audio_muxed; end if; + if ay2_audio_chan = "00" then ay2_chan_a <= ay2_audio_muxed; end if; + if ay2_audio_chan = "01" then ay2_chan_b <= ay2_audio_muxed; end if; + if ay2_audio_chan = "10" then ay2_chan_c <= ay2_audio_muxed; end if; + end if; +end process; + +-- microprocessor Z80 +cpu : entity work.T80se +generic map(Mode => 0, T2Write => 1, IOWait => 1) +port map( + RESET_n => reset_n, + CLK_n => cpu_clock, + CLKEN => '1', + WAIT_n => '1', + INT_n => cpu_irq_n, + NMI_n => '1', + BUSRQ_n => '1', + M1_n => cpu_m1_n, + MREQ_n => cpu_mreq_n, + IORQ_n => cpu_iorq_n, + RD_n => open, + WR_n => cpu_wr_n, + RFSH_n => open, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_di, + DO => cpu_do +); + +-- cpu1 program ROM +rom_cpu1 : entity work.pooyan_sound_prog +port map( + clk => clock_14n, + addr => cpu_addr(12 downto 0), + data => cpu_rom_do +); + +-- working RAM +wram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 10) +port map( + clk => clock_14n, + we => wram_we, + addr => cpu_addr(9 downto 0), + d => cpu_do, + q => wram_do +); + +-- AY-3-8910 #1 +ay_3_8910_1 : entity work.YM2149 +port map( + -- data bus + I_DA => cpu_do, -- in std_logic_vector(7 downto 0); + O_DA => ay1_do, -- out std_logic_vector(7 downto 0); + O_DA_OE_L => open, -- out std_logic; + -- control + I_A9_L => ay1_cs_n, -- in std_logic; + I_A8 => '1', -- in std_logic; + I_BDIR => ay1_bdir, -- in std_logic; + I_BC2 => '1', -- in std_logic; + I_BC1 => ay1_bc1, -- in std_logic; + I_SEL_L => '1', -- in std_logic; + + O_AUDIO => ay1_audio_muxed, -- out std_logic_vector(7 downto 0); + O_CHAN => ay1_audio_chan, -- out std_logic_vector(1 downto 0); + + -- port a + I_IOA => sound_cmd, -- in std_logic_vector(7 downto 0); + O_IOA => open, -- out std_logic_vector(7 downto 0); + O_IOA_OE_L => open, -- out std_logic; + -- port b + I_IOB => ay1_port_b_di, -- in std_logic_vector(7 downto 0); + O_IOB => open, -- out std_logic_vector(7 downto 0); + O_IOB_OE_L => open, -- out std_logic; + + ENA => '1', --cpu_ena, -- in std_logic; -- clock enable for higher speed operation + RESET_L => reset_n, -- in std_logic; + CLK => ayx_clock -- in std_logic -- note 6 Mhz +); + +-- AY-3-8910 #2 +ay_3_8910_2 : entity work.YM2149 +port map( + -- data bus + I_DA => cpu_do, -- in std_logic_vector(7 downto 0); + O_DA => ay2_do, -- out std_logic_vector(7 downto 0); + O_DA_OE_L => open, -- out std_logic; + -- control + I_A9_L => ay2_cs_n, -- in std_logic; + I_A8 => '1', -- in std_logic; + I_BDIR => ay2_bdir, -- in std_logic; + I_BC2 => '1', -- in std_logic; + I_BC1 => ay2_bc1, -- in std_logic; + I_SEL_L => '1', -- in std_logic; + + O_AUDIO => ay2_audio_muxed, -- out std_logic_vector(7 downto 0); + O_CHAN => ay2_audio_chan, -- out std_logic_vector(1 downto 0); + + -- port a + I_IOA => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOA => open, -- out std_logic_vector(7 downto 0); + O_IOA_OE_L => open, -- out std_logic; + -- port b + I_IOB => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOB => open, -- out std_logic_vector(7 downto 0); + O_IOB_OE_L => open, -- out std_logic; + + ENA => '1', --cpu_ena, -- in std_logic; -- clock enable for higher speed operation + RESET_L => reset_n, -- in std_logic; + CLK => ayx_clock -- in std_logic -- note 6 Mhz +); + + +end struct; \ No newline at end of file diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_char_color_lut.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_char_color_lut.vhd new file mode 100644 index 00000000..d8739c6b --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_char_color_lut.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_char_color_lut is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_char_color_lut is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"03",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"03",X"01",X"03",X"03",X"04",X"04",X"07",X"08",X"09",X"0F",X"0B",X"0C",X"0D",X"0E",X"0F",X"03", + X"03",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"03",X"04",X"05",X"06",X"0F",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"01",X"02",X"03", + X"03",X"05",X"06",X"07",X"0F",X"09",X"07",X"08",X"06",X"0D",X"0E",X"0F",X"01",X"02",X"03",X"04", + X"03",X"02",X"07",X"08",X"04",X"0A",X"08",X"06",X"07",X"0E",X"0F",X"01",X"02",X"03",X"04",X"05", + X"03",X"07",X"08",X"09",X"0A",X"0B",X"07",X"06",X"08",X"0F",X"01",X"02",X"03",X"04",X"05",X"06", + X"03",X"08",X"09",X"0A",X"05",X"0C",X"06",X"08",X"07",X"01",X"02",X"03",X"04",X"05",X"06",X"07", + X"03",X"09",X"0A",X"0B",X"0C",X"0D",X"08",X"06",X"06",X"02",X"03",X"04",X"05",X"06",X"07",X"08", + X"03",X"03",X"0B",X"0C",X"04",X"0E",X"07",X"07",X"08",X"03",X"04",X"05",X"06",X"07",X"08",X"09", + X"03",X"0B",X"0C",X"0D",X"0E",X"0F",X"07",X"06",X"08",X"04",X"05",X"06",X"07",X"08",X"09",X"0A", + X"03",X"0C",X"0D",X"0E",X"0F",X"01",X"08",X"07",X"06",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B", + X"03",X"0D",X"0E",X"0F",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C", + X"03",X"0E",X"0F",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D", + X"03",X"0F",X"01",X"02",X"04",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E", + X"03",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_char_grphx1.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_char_grphx1.vhd new file mode 100644 index 00000000..9e545ca5 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_char_grphx1.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_char_grphx1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_char_grphx1 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"30",X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"F0",X"F0",X"30",X"00", + X"00",X"10",X"30",X"00",X"F0",X"F0",X"F0",X"00",X"C0",X"80",X"00",X"00",X"C0",X"E0",X"C0",X"00", + X"00",X"00",X"00",X"00",X"30",X"30",X"10",X"00",X"00",X"10",X"10",X"70",X"F0",X"E0",X"C0",X"00", + X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"33",X"33",X"CC",X"19", + X"00",X"88",X"44",X"00",X"00",X"55",X"22",X"00",X"30",X"33",X"30",X"30",X"33",X"30",X"20",X"00", + X"13",X"13",X"13",X"03",X"00",X"00",X"00",X"00",X"0F",X"0F",X"09",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F0",X"F0",X"FF",X"F0",X"F0",X"FF",X"F0",X"CC",X"C0",X"C0",X"CC",X"C0",X"C0",X"CC",X"C0", + X"FF",X"EE",X"BB",X"22",X"22",X"55",X"30",X"70",X"88",X"11",X"00",X"40",X"C0",X"CC",X"C0",X"C0", + X"F0",X"FF",X"E0",X"C0",X"88",X"44",X"EE",X"00",X"80",X"44",X"44",X"00",X"00",X"00",X"00",X"00", + X"00",X"88",X"F9",X"FF",X"F9",X"F9",X"F9",X"88",X"30",X"33",X"E2",X"E2",X"E2",X"EE",X"E2",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"0C",X"0C",X"0C",X"0F",X"0F",X"0F",X"00",X"00",X"02",X"06",X"0C",X"0C",X"08",X"00",X"00", + X"0C",X"0C",X"04",X"0C",X"0C",X"04",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"51",X"31",X"50",X"75",X"00",X"00",X"33",X"FF",X"FF",X"FF",X"FF",X"FE", + X"00",X"10",X"60",X"30",X"00",X"00",X"00",X"00",X"F0",X"F7",X"77",X"F0",X"F1",X"00",X"00",X"00", + X"00",X"01",X"01",X"70",X"F0",X"D0",X"00",X"00",X"0C",X"08",X"68",X"24",X"E0",X"60",X"08",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"00",X"00",X"88",X"88",X"88",X"88",X"00",X"00",X"00",X"11",X"23",X"11",X"00",X"00",X"00", + X"77",X"77",X"77",X"33",X"51",X"00",X"00",X"00",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"33",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"11",X"00",X"22",X"00",X"00",X"00",X"88",X"EE",X"FF", + X"00",X"0F",X"01",X"CC",X"FF",X"00",X"11",X"CC",X"17",X"3F",X"3F",X"37",X"FF",X"00",X"EE",X"FF", + X"00",X"00",X"00",X"70",X"F0",X"D0",X"00",X"00",X"06",X"0E",X"2C",X"24",X"E0",X"60",X"0C",X"06", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"76",X"33",X"03",X"01",X"13",X"BB",X"EE",X"99",X"DD",X"9B",X"07",X"CF",X"DF",X"FF",X"11", + X"00",X"77",X"11",X"00",X"00",X"08",X"08",X"04",X"00",X"00",X"88",X"44",X"22",X"00",X"00",X"04", + X"11",X"22",X"CC",X"33",X"00",X"0C",X"0F",X"07",X"88",X"44",X"00",X"00",X"00",X"07",X"0F",X"08", + X"00",X"11",X"66",X"88",X"00",X"13",X"67",X"88",X"66",X"99",X"00",X"00",X"00",X"08",X"00",X"00", + X"33",X"22",X"CC",X"00",X"00",X"11",X"EE",X"00",X"88",X"00",X"00",X"33",X"44",X"88",X"00",X"00", + X"00",X"00",X"00",X"FF",X"FF",X"88",X"00",X"00",X"00",X"00",X"FF",X"FF",X"88",X"00",X"00",X"00", + X"00",X"AA",X"22",X"11",X"00",X"00",X"88",X"00",X"00",X"00",X"CC",X"66",X"11",X"EE",X"66",X"11", + X"66",X"26",X"33",X"00",X"00",X"00",X"00",X"00",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"33",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"22",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"99",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"BF",X"FE",X"A8",X"60",X"C0",X"80",X"00",X"C0",X"C0",X"51",X"31",X"11",X"00",X"00",X"00", + X"00",X"11",X"33",X"47",X"8C",X"01",X"33",X"00",X"33",X"FF",X"CC",X"00",X"00",X"0E",X"FF",X"33", + X"33",X"46",X"8C",X"00",X"00",X"11",X"33",X"33",X"00",X"00",X"00",X"00",X"33",X"FF",X"EE",X"88", + X"3F",X"37",X"3F",X"13",X"13",X"3F",X"37",X"3F",X"8C",X"CE",X"CF",X"8F",X"8E",X"CE",X"CC",X"8C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"26",X"17",X"13",X"13",X"13",X"01",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"EE",X"EE", + X"CC",X"CC",X"6E",X"3F",X"DF",X"7F",X"7F",X"0F",X"00",X"00",X"00",X"88",X"88",X"CC",X"EE",X"6E", + X"66",X"66",X"33",X"11",X"00",X"11",X"33",X"67",X"11",X"22",X"99",X"EE",X"3B",X"2A",X"7F",X"99", + X"00",X"00",X"00",X"11",X"B3",X"73",X"B1",X"73",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FE",X"EC", + X"00",X"11",X"33",X"37",X"13",X"13",X"00",X"00",X"88",X"88",X"00",X"00",X"88",X"0C",X"8C",X"00", + X"00",X"00",X"00",X"23",X"23",X"11",X"00",X"00",X"00",X"00",X"02",X"00",X"08",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"03",X"66",X"CC",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00", + X"33",X"33",X"01",X"01",X"01",X"00",X"00",X"00",X"6E",X"6E",X"6E",X"FF",X"6E",X"2E",X"2E",X"3F", + X"DF",X"57",X"57",X"57",X"47",X"47",X"23",X"33",X"CC",X"CC",X"CC",X"EE",X"CC",X"CC",X"4C",X"4C", + X"00",X"13",X"22",X"22",X"02",X"01",X"01",X"00",X"66",X"66",X"CC",X"CC",X"CC",X"66",X"66",X"66", + X"CC",X"00",X"00",X"22",X"CC",X"11",X"00",X"11",X"04",X"00",X"DD",X"DD",X"BB",X"33",X"66",X"CC", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"BF",X"9F",X"07",X"03",X"06",X"08",X"00",X"13",X"9F",X"CE",X"CC",X"6E",X"66",X"33",X"00", + X"04",X"04",X"08",X"09",X"09",X"1D",X"03",X"00",X"17",X"1F",X"3F",X"7F",X"EE",X"89",X"02",X"0C", + X"00",X"00",X"00",X"00",X"88",X"CC",X"EF",X"3F",X"37",X"17",X"88",X"88",X"00",X"00",X"33",X"CF", + X"00",X"00",X"00",X"88",X"CC",X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"FF",X"BB", + X"CC",X"89",X"13",X"1B",X"26",X"00",X"9B",X"45",X"19",X"2A",X"AA",X"AB",X"AB",X"CE",X"8C",X"08", + X"EF",X"EF",X"4D",X"11",X"33",X"66",X"88",X"CC",X"89",X"CD",X"CD",X"BB",X"BB",X"33",X"11",X"11", + X"44",X"44",X"44",X"44",X"88",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"CC",X"EE",X"33", + X"44",X"23",X"0B",X"00",X"04",X"01",X"01",X"03",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"00", + X"70",X"30",X"11",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"CC",X"C0",X"40",X"00",X"00",X"00", + X"8B",X"01",X"44",X"47",X"03",X"03",X"02",X"01",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"07",X"8B",X"03",X"11",X"01",X"02",X"01",X"00",X"0F",X"00",X"00",X"00",X"0F",X"88",X"CC", + X"00",X"00",X"20",X"50",X"20",X"50",X"20",X"00",X"00",X"44",X"33",X"11",X"FF",X"33",X"66",X"44", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"CC", + X"00",X"99",X"66",X"00",X"00",X"00",X"00",X"00",X"EE",X"00",X"EE",X"22",X"11",X"00",X"00",X"00", + X"21",X"31",X"D1",X"70",X"10",X"00",X"22",X"76",X"0F",X"8F",X"F7",X"F2",X"F0",X"00",X"10",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"03",X"03",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"1F",X"0F",X"1F",X"FF",X"4F",X"EF",X"8F",X"BF",X"EF",X"8F",X"CF",X"8F",X"8F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"EF",X"CF",X"FF",X"AF",X"1F",X"6F",X"5F",X"9F",X"FF",X"BF",X"FF",X"BF",X"7F", + X"0F",X"6F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"4F",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"BF",X"0F",X"0F",X"0F",X"0F",X"EF",X"CF",X"8F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"06",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"1F",X"0F",X"0F",X"0F",X"1F",X"3F",X"BF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"01",X"FF",X"33",X"77",X"22",X"08",X"0D",X"0F",X"0F", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"07",X"07",X"0F",X"0F",X"07", + X"00",X"00",X"88",X"CC",X"CC",X"EE",X"E2",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"2F",X"3F",X"1F",X"1F",X"3F",X"6F",X"3F", + X"00",X"00",X"00",X"01",X"07",X"8F",X"CF",X"CF",X"00",X"60",X"F0",X"3C",X"0F",X"0F",X"0F",X"0F", + X"00",X"B0",X"F0",X"F0",X"E1",X"0F",X"0F",X"0F",X"CF",X"78",X"E1",X"6D",X"ED",X"EF",X"6F",X"0F", + X"0F",X"0F",X"07",X"03",X"07",X"0F",X"0F",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0", + X"EE",X"7F",X"5F",X"9F",X"3F",X"6F",X"0F",X"1F",X"00",X"00",X"CC",X"CC",X"88",X"CC",X"EE",X"EE", + X"88",X"CC",X"4C",X"88",X"EE",X"FF",X"7F",X"6E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"F0",X"F0",X"C0",X"00",X"00",X"01",X"00",X"00",X"C0",X"F0",X"70",X"16",X"0F",X"7E", + X"00",X"10",X"10",X"70",X"F0",X"C3",X"C3",X"87",X"C3",X"C3",X"87",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"21",X"61",X"43",X"43", + X"88",X"CC",X"CC",X"EE",X"BF",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"66",X"AE",X"1F", + X"2F",X"6F",X"FF",X"7F",X"6E",X"FF",X"2F",X"0F",X"7F",X"EE",X"DD",X"44",X"00",X"88",X"EE",X"DF", + X"0F",X"1F",X"0F",X"2F",X"3F",X"FF",X"FF",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3F",X"FF",X"FF",X"FF",X"FF",X"BF",X"0F",X"0F",X"BF",X"FF",X"FF",X"FF",X"7F",X"2F",X"0F",X"0F", + X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"6E",X"BF",X"1F",X"3F",X"DD",X"88",X"33",X"FF",X"00",X"00",X"88",X"88",X"88",X"77",X"FF",X"FF", + X"00",X"00",X"80",X"F0",X"F0",X"1E",X"0F",X"0F",X"00",X"00",X"F0",X"F0",X"F0",X"87",X"0F",X"0F", + X"FF",X"FF",X"7F",X"FF",X"1F",X"7F",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"06",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"08",X"00",X"00",X"00",X"00", + X"00",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"88",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"F0",X"F0",X"E1",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"08",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"33",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"07",X"03",X"00",X"01",X"0F",X"0F",X"EF",X"6F",X"7F",X"7F",X"6E",X"CC", + X"00",X"01",X"C1",X"F0",X"E1",X"0F",X"0E",X"19",X"0E",X"0F",X"0F",X"3F",X"1F",X"3F",X"6F",X"CF", + X"0F",X"1F",X"2F",X"0F",X"0F",X"1F",X"0F",X"0F",X"6E",X"FF",X"7F",X"FF",X"EE",X"FF",X"7F",X"EE", + X"8F",X"CF",X"67",X"33",X"67",X"67",X"CF",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"7F",X"9F",X"3F",X"1F",X"7F",X"3F",X"0F", + X"F0",X"F0",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F",X"F0",X"E1",X"E1",X"C3",X"0F",X"0F",X"0F",X"0F", + X"CF",X"EF",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"07",X"00",X"00",X"00",X"88",X"FF", + X"00",X"00",X"C0",X"C0",X"80",X"80",X"00",X"00",X"20",X"20",X"00",X"00",X"40",X"80",X"00",X"00", + X"52",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1E",X"1E",X"02",X"01",X"00",X"20",X"01",X"00", + X"1E",X"2C",X"48",X"48",X"0C",X"08",X"00",X"00",X"86",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"0F", + X"00",X"30",X"70",X"70",X"30",X"10",X"00",X"00",X"70",X"C0",X"00",X"80",X"F0",X"F0",X"70",X"00", + X"00",X"00",X"00",X"10",X"F0",X"F0",X"E0",X"00",X"00",X"20",X"60",X"E0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"00",X"00",X"22",X"10",X"10",X"20",X"F0",X"F0", + X"00",X"00",X"30",X"20",X"A0",X"B0",X"F0",X"F0",X"88",X"88",X"AA",X"22",X"44",X"88",X"11",X"71", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"20",X"40",X"73",X"40",X"20",X"10", + X"10",X"C0",X"A8",X"98",X"F6",X"98",X"A8",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"20",X"31",X"20",X"10",X"00",X"60",X"E0",X"54",X"44",X"FB",X"44",X"54", + X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"20",X"51",X"40",X"51",X"20",X"10", + X"10",X"D0",X"20",X"54",X"90",X"54",X"20",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"20",X"20",X"20",X"10",X"10",X"20",X"E0",X"10",X"AA",X"40",X"AA",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"B3",X"F7",X"76",X"76",X"76",X"F7",X"B3",X"00",X"88",X"C4",X"40",X"C0",X"40",X"C4",X"88", + X"00",X"22",X"11",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"40",X"98",X"11",X"98",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"C0",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"30",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0", + X"00",X"00",X"80",X"E0",X"F0",X"C0",X"00",X"00",X"00",X"00",X"10",X"70",X"F0",X"30",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"C0",X"C0",X"C0",X"C0",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00", + X"00",X"C0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"30",X"F0",X"F0",X"F0",X"F0",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"00", + X"FF",X"FF",X"FF",X"77",X"B3",X"11",X"00",X"00",X"FC",X"EC",X"FE",X"FF",X"FF",X"FF",X"77",X"00", + X"0F",X"0A",X"0F",X"0A",X"0A",X"0F",X"0A",X"0F",X"0F",X"0A",X"0F",X"0A",X"0A",X"0F",X"0A",X"0F", + X"E2",X"22",X"E2",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E4",X"64",X"E4",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"CC",X"E4",X"64",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"C0",X"F0",X"F0",X"F0",X"F0",X"E0",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0C",X"78", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"07",X"01", + X"00",X"00",X"08",X"08",X"0C",X"0C",X"0F",X"0F",X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"00",X"00",X"00",X"00",X"00", + X"E1",X"F0",X"F0",X"F0",X"30",X"00",X"00",X"00",X"1E",X"F0",X"F0",X"96",X"C3",X"F0",X"30",X"00", + X"88",X"88",X"88",X"22",X"00",X"11",X"00",X"00",X"AA",X"54",X"30",X"33",X"30",X"30",X"33",X"30", + X"F0",X"F0",X"F0",X"F0",X"30",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"60",X"00", + X"C0",X"F0",X"F2",X"FC",X"EC",X"98",X"00",X"00",X"C4",X"C0",X"D1",X"31",X"11",X"C4",X"44",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0C",X"78",X"34", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"0F",X"07",X"07",X"70",X"F0", + X"00",X"00",X"08",X"08",X"0C",X"0C",X"86",X"E1",X"30",X"30",X"30",X"10",X"00",X"00",X"00",X"68", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"C3",X"21",X"10",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"C3",X"5A",X"F0",X"30",X"00", + X"00",X"00",X"0B",X"40",X"80",X"20",X"F0",X"F0",X"00",X"00",X"08",X"0C",X"06",X"02",X"02",X"83", + X"F0",X"F0",X"F0",X"70",X"10",X"00",X"00",X"00",X"81",X"E1",X"F0",X"F0",X"F0",X"F0",X"60",X"20", + X"00",X"0F",X"00",X"00",X"51",X"0F",X"50",X"75",X"00",X"0F",X"33",X"FF",X"FF",X"0F",X"FF",X"FE", + X"00",X"0F",X"88",X"CC",X"CC",X"0F",X"F2",X"32",X"00",X"0F",X"00",X"60",X"F1",X"0F",X"F1",X"E0", + X"77",X"0F",X"77",X"33",X"51",X"0F",X"00",X"00",X"FE",X"0F",X"FF",X"FF",X"FF",X"0F",X"33",X"00", + X"F2",X"0F",X"F2",X"EE",X"CC",X"0F",X"88",X"00",X"E0",X"0F",X"F1",X"F1",X"F1",X"0F",X"00",X"00", + X"00",X"0F",X"00",X"11",X"B3",X"0F",X"B1",X"FB",X"00",X"0F",X"77",X"FF",X"FF",X"0F",X"FC",X"C8", + X"00",X"0F",X"00",X"88",X"98",X"0F",X"FC",X"FC",X"00",X"0F",X"22",X"E2",X"E2",X"0F",X"C0",X"C0", + X"FF",X"0F",X"FF",X"77",X"B3",X"0F",X"00",X"00",X"F8",X"0F",X"FC",X"FF",X"FF",X"0F",X"77",X"00", + X"FC",X"0F",X"FC",X"DC",X"98",X"0F",X"00",X"00",X"C0",X"0F",X"C0",X"C0",X"E2",X"0F",X"22",X"00", + X"00",X"31",X"20",X"71",X"E0",X"71",X"70",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00", + X"00",X"00",X"CC",X"66",X"EE",X"44",X"EE",X"DC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"31",X"31",X"F0",X"73",X"30",X"00",X"00",X"F3",X"FF",X"FE",X"F0",X"F0",X"F0",X"F0",X"30", + X"EE",X"FE",X"FC",X"F1",X"F0",X"F0",X"80",X"00",X"80",X"91",X"DD",X"F9",X"D1",X"80",X"00",X"00", + X"00",X"00",X"31",X"20",X"31",X"70",X"70",X"70",X"00",X"00",X"44",X"FF",X"77",X"66",X"AA",X"77", + X"CC",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"30",X"71",X"31",X"70",X"F0",X"00",X"00",X"B3",X"F3",X"FF",X"FE",X"F0",X"F0",X"B0",X"00", + X"73",X"FB",X"F8",X"F8",X"F0",X"80",X"00",X"00",X"88",X"CC",X"CC",X"D1",X"B1",X"C0",X"71",X"77", + X"C0",X"60",X"FC",X"F2",X"F0",X"F0",X"F0",X"F0",X"00",X"11",X"71",X"51",X"C0",X"C0",X"C0",X"F3", + X"00",X"00",X"30",X"A8",X"A0",X"F0",X"F0",X"F0",X"00",X"88",X"88",X"11",X"31",X"D1",X"80",X"80", + X"F0",X"F0",X"F0",X"E0",X"E2",X"CC",X"00",X"00",X"E0",X"E0",X"F0",X"80",X"80",X"E2",X"22",X"00", + X"F0",X"F0",X"F0",X"F0",X"D8",X"D0",X"80",X"00",X"EE",X"33",X"11",X"22",X"44",X"C4",X"44",X"00", + X"00",X"00",X"00",X"11",X"F3",X"73",X"FF",X"FF",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"FF", + X"10",X"10",X"00",X"00",X"00",X"88",X"88",X"8A",X"00",X"00",X"00",X"00",X"23",X"23",X"00",X"23", + X"FF",X"FF",X"77",X"77",X"33",X"11",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"E0",X"00", + X"8B",X"89",X"CD",X"CC",X"98",X"10",X"00",X"00",X"23",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"91",X"F3",X"73",X"FF",X"FF",X"FF",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"10",X"10",X"00",X"00",X"00",X"88",X"8A",X"8F",X"00",X"00",X"00",X"00",X"00",X"23",X"23",X"00", + X"FF",X"77",X"77",X"33",X"11",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"70",X"00",X"00", + X"89",X"CC",X"C4",X"89",X"10",X"10",X"00",X"00",X"23",X"23",X"01",X"00",X"00",X"00",X"00",X"00", + X"11",X"F3",X"73",X"FF",X"FF",X"FF",X"FF",X"77",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"10",X"10",X"88",X"88",X"8A",X"CF",X"CD",X"CC",X"00",X"00",X"00",X"00",X"00",X"22",X"23",X"01", + X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"70",X"00",X"00",X"00",X"00", + X"C8",X"80",X"88",X"01",X"10",X"10",X"00",X"00",X"44",X"67",X"23",X"01",X"00",X"00",X"00",X"00", + X"1E",X"2C",X"48",X"48",X"0C",X"08",X"00",X"00",X"86",X"D1",X"33",X"11",X"30",X"70",X"70",X"70", + X"52",X"88",X"CC",X"88",X"C0",X"E0",X"E0",X"E0",X"1E",X"1E",X"02",X"01",X"00",X"20",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"70",X"70",X"30",X"11",X"33",X"11", + X"C0",X"E0",X"E0",X"E0",X"C0",X"88",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"70",X"F0",X"30",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"F0",X"70",X"10",X"00",X"11",X"33", + X"00",X"00",X"00",X"00",X"10",X"30",X"00",X"00",X"FC",X"44",X"00",X"70",X"F0",X"F0",X"F0",X"70", + X"00",X"00",X"00",X"10",X"70",X"F0",X"30",X"10",X"00",X"00",X"33",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"30",X"10",X"00",X"00",X"00",X"00",X"70",X"F0",X"F0",X"F0",X"70",X"00",X"00",X"00", + X"10",X"30",X"F0",X"70",X"10",X"00",X"11",X"33",X"F0",X"F0",X"F0",X"F0",X"F0",X"33",X"10",X"F0", + X"74",X"CC",X"00",X"70",X"F0",X"F0",X"F0",X"70",X"C0",X"60",X"FC",X"F2",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"33",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"30",X"A8",X"E0",X"F0",X"F0",X"F0", + X"70",X"F0",X"F0",X"F0",X"70",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"E0",X"E2",X"CC",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"33",X"30",X"E0",X"F0",X"F0",X"F0",X"F0",X"D8",X"D0",X"80",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_char_grphx2.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_char_grphx2.vhd new file mode 100644 index 00000000..34c88aeb --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_char_grphx2.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_char_grphx2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_char_grphx2 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"30",X"70",X"C0",X"80",X"80",X"70",X"30",X"00",X"80",X"C0",X"20",X"20",X"60",X"C0",X"80",X"00", + X"00",X"00",X"F0",X"F0",X"40",X"00",X"00",X"00",X"20",X"20",X"E0",X"E0",X"20",X"20",X"00",X"00", + X"60",X"F0",X"B0",X"90",X"90",X"C0",X"40",X"00",X"20",X"20",X"A0",X"A0",X"E0",X"E0",X"60",X"00", + X"80",X"D0",X"F0",X"B0",X"90",X"80",X"00",X"00",X"C0",X"E0",X"20",X"20",X"20",X"60",X"40",X"00", + X"00",X"F0",X"F0",X"C0",X"60",X"30",X"10",X"00",X"80",X"E0",X"E0",X"80",X"80",X"80",X"80",X"00", + X"10",X"B0",X"A0",X"A0",X"A0",X"E0",X"E0",X"00",X"C0",X"E0",X"20",X"20",X"20",X"60",X"40",X"00", + X"00",X"90",X"90",X"90",X"D0",X"70",X"30",X"00",X"C0",X"E0",X"20",X"20",X"20",X"E0",X"C0",X"00", + X"C0",X"E0",X"B0",X"90",X"80",X"C0",X"C0",X"00",X"00",X"00",X"00",X"E0",X"E0",X"00",X"00",X"00", + X"00",X"60",X"90",X"90",X"B0",X"F0",X"60",X"00",X"C0",X"E0",X"A0",X"20",X"20",X"20",X"C0",X"00", + X"70",X"F0",X"90",X"90",X"90",X"F0",X"60",X"00",X"80",X"C0",X"60",X"20",X"20",X"20",X"00",X"00", + X"30",X"40",X"80",X"A0",X"A0",X"90",X"40",X"30",X"C0",X"20",X"10",X"50",X"50",X"90",X"20",X"C0", + X"00",X"00",X"C0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"B0",X"30",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"30",X"10",X"00",X"00",X"10",X"10",X"70",X"F0",X"E0",X"C0",X"00", + X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"70",X"C0",X"80",X"C0",X"70",X"30",X"00",X"E0",X"E0",X"80",X"80",X"80",X"E0",X"E0",X"00", + X"60",X"F0",X"90",X"90",X"90",X"F0",X"F0",X"00",X"C0",X"E0",X"20",X"20",X"20",X"E0",X"E0",X"00", + X"40",X"C0",X"80",X"80",X"C0",X"70",X"30",X"00",X"40",X"60",X"20",X"20",X"60",X"C0",X"80",X"00", + X"30",X"70",X"C0",X"80",X"80",X"F0",X"F0",X"00",X"80",X"C0",X"60",X"20",X"20",X"E0",X"E0",X"00", + X"80",X"90",X"90",X"90",X"F0",X"F0",X"00",X"00",X"20",X"20",X"20",X"20",X"E0",X"E0",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"00", + X"90",X"90",X"90",X"90",X"C0",X"70",X"30",X"00",X"E0",X"E0",X"20",X"20",X"60",X"C0",X"80",X"00", + X"F0",X"F0",X"10",X"10",X"10",X"F0",X"F0",X"00",X"E0",X"E0",X"00",X"00",X"00",X"E0",X"E0",X"00", + X"80",X"80",X"F0",X"F0",X"80",X"80",X"00",X"00",X"20",X"20",X"E0",X"E0",X"20",X"20",X"00",X"00", + X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"20",X"20",X"20",X"60",X"40",X"00", + X"80",X"C0",X"60",X"30",X"10",X"F0",X"F0",X"00",X"20",X"60",X"E0",X"C0",X"80",X"E0",X"E0",X"00", + X"00",X"00",X"00",X"00",X"F0",X"F0",X"00",X"00",X"20",X"20",X"20",X"20",X"E0",X"E0",X"00",X"00", + X"F0",X"F0",X"70",X"30",X"70",X"F0",X"F0",X"00",X"E0",X"E0",X"00",X"80",X"00",X"E0",X"E0",X"00", + X"F0",X"F0",X"10",X"30",X"70",X"F0",X"F0",X"00",X"E0",X"E0",X"C0",X"80",X"00",X"E0",X"E0",X"00", + X"70",X"F0",X"80",X"80",X"80",X"F0",X"70",X"00",X"C0",X"E0",X"20",X"20",X"20",X"E0",X"C0",X"00", + X"70",X"F0",X"80",X"80",X"80",X"F0",X"F0",X"00",X"00",X"80",X"80",X"80",X"80",X"E0",X"E0",X"00", + X"70",X"F0",X"80",X"80",X"80",X"F0",X"70",X"00",X"A0",X"C0",X"E0",X"A0",X"60",X"E0",X"C0",X"00", + X"70",X"F0",X"90",X"80",X"80",X"F0",X"F0",X"00",X"20",X"60",X"E0",X"C0",X"80",X"E0",X"E0",X"00", + X"00",X"50",X"D0",X"90",X"90",X"F0",X"60",X"00",X"C0",X"E0",X"20",X"20",X"20",X"60",X"40",X"00", + X"80",X"80",X"F0",X"F0",X"80",X"80",X"00",X"00",X"00",X"00",X"E0",X"E0",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"00",X"00",X"00",X"F0",X"F0",X"00",X"C0",X"E0",X"20",X"20",X"20",X"E0",X"C0",X"00", + X"F0",X"F0",X"10",X"00",X"10",X"F0",X"F0",X"00",X"00",X"80",X"C0",X"E0",X"C0",X"80",X"00",X"00", + X"F0",X"F0",X"10",X"30",X"10",X"F0",X"F0",X"00",X"E0",X"E0",X"C0",X"80",X"C0",X"E0",X"E0",X"00", + X"C0",X"E0",X"70",X"30",X"70",X"E0",X"C0",X"00",X"60",X"E0",X"C0",X"80",X"C0",X"E0",X"60",X"00", + X"E0",X"F0",X"10",X"10",X"F0",X"E0",X"00",X"00",X"00",X"00",X"E0",X"E0",X"00",X"00",X"00",X"00", + X"C0",X"E0",X"F0",X"B0",X"90",X"80",X"80",X"00",X"20",X"20",X"20",X"A0",X"E0",X"E0",X"60",X"00", + X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"30",X"34",X"C3",X"96", + X"07",X"87",X"4A",X"06",X"06",X"5A",X"2D",X"07",X"00",X"33",X"00",X"00",X"33",X"00",X"00",X"11", + X"12",X"12",X"12",X"03",X"00",X"00",X"00",X"00",X"0F",X"0F",X"09",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"FF",X"00",X"00",X"FF",X"00",X"FF",X"33",X"33",X"FF",X"33",X"33",X"FF",X"33", + X"F0",X"E1",X"B4",X"2D",X"2C",X"59",X"08",X"00",X"87",X"1E",X"0E",X"00",X"00",X"CC",X"33",X"33", + X"00",X"FF",X"00",X"10",X"BA",X"33",X"11",X"FF",X"33",X"33",X"BB",X"FF",X"F7",X"F3",X"FB",X"FF", + X"00",X"88",X"F9",X"FF",X"F9",X"F9",X"F9",X"88",X"00",X"33",X"E2",X"E2",X"E2",X"EE",X"E2",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"F0",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"F0",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"F0",X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"51",X"11",X"20",X"55",X"00",X"00",X"33",X"FF",X"FF",X"FF",X"FB",X"FE", + X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"74",X"F7",X"00",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"50",X"00",X"00",X"00",X"10",X"00",X"10",X"00",X"00", + X"00",X"60",X"F0",X"F0",X"70",X"F0",X"F0",X"60",X"00",X"00",X"00",X"80",X"C0",X"80",X"00",X"00", + X"C3",X"0F",X"0F",X"87",X"87",X"87",X"87",X"0F",X"0F",X"0F",X"1E",X"3C",X"1E",X"0F",X"0F",X"0F", + X"77",X"77",X"77",X"33",X"51",X"00",X"00",X"00",X"FE",X"FE",X"FB",X"FF",X"FF",X"FF",X"33",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"D0",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"5A",X"1E",X"0F",X"2D",X"0F",X"0F",X"0F",X"87",X"E1",X"F0", + X"0F",X"F0",X"1E",X"C3",X"F0",X"0F",X"1E",X"C3",X"78",X"F0",X"F0",X"78",X"F0",X"0F",X"E1",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"20",X"00",X"00",X"00",X"10",X"00",X"10",X"00",X"00", + X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"00", + X"33",X"66",X"33",X"00",X"00",X"10",X"B0",X"E1",X"98",X"DC",X"98",X"00",X"C0",X"D0",X"F0",X"1E", + X"0E",X"78",X"1E",X"0F",X"0F",X"87",X"87",X"4B",X"00",X"08",X"80",X"4A",X"2C",X"0F",X"0F",X"4B", + X"1E",X"2D",X"C3",X"3C",X"0F",X"C3",X"F0",X"78",X"87",X"4B",X"0F",X"0F",X"0F",X"78",X"F0",X"87", + X"0F",X"1E",X"69",X"87",X"0F",X"3C",X"78",X"87",X"69",X"96",X"0F",X"0F",X"0F",X"87",X"0F",X"0F", + X"3C",X"2D",X"C3",X"0F",X"0F",X"1E",X"E1",X"0F",X"87",X"0F",X"0F",X"3C",X"4B",X"87",X"0F",X"0F", + X"0F",X"0F",X"0F",X"F0",X"F0",X"87",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"87",X"0F",X"0F",X"0F", + X"00",X"A5",X"2D",X"1E",X"0F",X"0F",X"87",X"0F",X"00",X"00",X"C0",X"68",X"1E",X"E1",X"69",X"1E", + X"69",X"69",X"3C",X"03",X"00",X"00",X"FB",X"FB",X"C3",X"0F",X"03",X"00",X"00",X"00",X"FB",X"FB", + X"00",X"00",X"00",X"00",X"30",X"C3",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"C0",X"2C",X"1E", + X"00",X"00",X"00",X"00",X"E0",X"D0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"96",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"87", + X"00",X"10",X"10",X"70",X"70",X"10",X"10",X"00",X"00",X"80",X"80",X"E0",X"E0",X"80",X"80",X"00", + X"F1",X"FB",X"EE",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"00",X"00",X"00", + X"0F",X"1E",X"3C",X"78",X"C3",X"1E",X"3C",X"0F",X"3C",X"F0",X"C3",X"0F",X"0F",X"E1",X"F0",X"3C", + X"3C",X"69",X"C3",X"0F",X"0F",X"1E",X"3C",X"3C",X"0F",X"0F",X"0F",X"0F",X"3C",X"F0",X"E1",X"87", + X"30",X"30",X"30",X"10",X"10",X"30",X"30",X"30",X"C3",X"E1",X"F0",X"F0",X"E1",X"E1",X"C3",X"C3", + X"FB",X"FB",X"00",X"00",X"00",X"00",X"00",X"00",X"FB",X"FB",X"00",X"00",X"00",X"00",X"00",X"00", + X"C3",X"69",X"78",X"3C",X"3C",X"3C",X"1E",X"0F",X"00",X"08",X"84",X"86",X"C2",X"C3",X"E1",X"E1", + X"C0",X"C0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"80",X"80",X"C0",X"E0",X"E0", + X"69",X"69",X"3C",X"1E",X"0F",X"1E",X"3C",X"78",X"1E",X"2D",X"96",X"E1",X"B4",X"A5",X"F0",X"96", + X"00",X"00",X"00",X"11",X"B3",X"32",X"51",X"33",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FE",X"FD", + X"0F",X"1E",X"3C",X"78",X"3C",X"3C",X"0F",X"0F",X"87",X"87",X"0F",X"0F",X"87",X"C3",X"C3",X"0F", + X"0F",X"0F",X"0F",X"3C",X"3C",X"1E",X"0F",X"0F",X"0F",X"0F",X"2D",X"0F",X"87",X"C3",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"1E",X"3C",X"69",X"C3",X"0F",X"0F",X"0F",X"0F",X"87",X"0F",X"0F",X"0F", + X"3C",X"3C",X"1E",X"1E",X"1E",X"0F",X"0F",X"0F",X"E0",X"E0",X"E0",X"F0",X"E0",X"E0",X"E0",X"F0", + X"F0",X"78",X"78",X"78",X"78",X"78",X"3C",X"3C",X"C0",X"C0",X"C0",X"E0",X"C0",X"C0",X"C0",X"C0", + X"0F",X"3C",X"2D",X"2D",X"2D",X"1E",X"1E",X"0F",X"68",X"68",X"C0",X"C0",X"C0",X"68",X"68",X"68", + X"C3",X"0F",X"0F",X"2D",X"C3",X"1E",X"0F",X"1E",X"4B",X"0F",X"D2",X"D2",X"B4",X"3C",X"69",X"C3", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"78",X"3C",X"68",X"80",X"00",X"3C",X"F0",X"E1",X"C3",X"E1",X"61",X"30",X"00", + X"43",X"43",X"87",X"96",X"96",X"D2",X"30",X"00",X"78",X"F0",X"F0",X"F0",X"E1",X"96",X"2C",X"C0", + X"0F",X"0F",X"0F",X"0F",X"87",X"C3",X"F0",X"F0",X"78",X"78",X"87",X"87",X"0F",X"0F",X"3C",X"F0", + X"0F",X"0F",X"0F",X"87",X"C3",X"78",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"4B",X"F0",X"B4", + X"C3",X"96",X"3C",X"B4",X"69",X"0F",X"B4",X"50",X"96",X"A4",X"A4",X"B4",X"B4",X"E0",X"C0",X"80", + X"F0",X"F0",X"D2",X"1E",X"3C",X"69",X"87",X"C3",X"96",X"D2",X"D2",X"B4",X"B4",X"3C",X"1E",X"1E", + X"4B",X"4B",X"4B",X"4B",X"87",X"0F",X"0F",X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"C3",X"E1",X"3C", + X"48",X"3C",X"B4",X"0E",X"4A",X"1F",X"1E",X"3C",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00", + X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"CC",X"00",X"00",X"00",X"00",X"00", + X"B4",X"0E",X"4A",X"78",X"3C",X"3C",X"2C",X"1E",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00", + X"10",X"30",X"70",X"90",X"10",X"10",X"10",X"10",X"80",X"C0",X"E0",X"90",X"80",X"80",X"80",X"80", + X"E0",X"7B",X"B4",X"3C",X"1E",X"1E",X"2D",X"1E",X"00",X"FF",X"00",X"00",X"00",X"F7",X"80",X"C0", + X"00",X"00",X"22",X"55",X"20",X"55",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"3C",X"C3", + X"0F",X"96",X"60",X"00",X"00",X"00",X"00",X"00",X"E1",X"0F",X"E1",X"21",X"10",X"00",X"00",X"00", + X"50",X"11",X"31",X"00",X"00",X"00",X"22",X"66",X"F0",X"F8",X"77",X"22",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"F0",X"3C",X"3C",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"69",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"87", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"03",X"03",X"03",X"03",X"03",X"03",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"11",X"11",X"99",X"DD",X"DD",X"FF",X"F3",X"FF",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"07",X"0F",X"1E",X"78",X"F0",X"F0",X"F0",X"00",X"0E",X"0F",X"C3",X"F0",X"F0",X"F0",X"F0", + X"70",X"00",X"00",X"08",X"0F",X"E1",X"F0",X"F0",X"CF",X"09",X"01",X"5C",X"CD",X"FE",X"6F",X"96", + X"0F",X"0F",X"07",X"03",X"07",X"0F",X"0F",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"08",X"0E",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C", + X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0C",X"0C",X"08",X"0C",X"0E",X"0E", + X"08",X"0C",X"0C",X"08",X"0E",X"0F",X"0F",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"01",X"21",X"00",X"00",X"0C",X"0F",X"0F",X"0F",X"0F",X"6F", + X"00",X"01",X"01",X"07",X"0F",X"3C",X"3C",X"78",X"3C",X"3C",X"78",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"03",X"12",X"16",X"34",X"34", + X"08",X"0C",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"06",X"0E",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0D",X"04",X"00",X"08",X"0E",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"3C",X"F0",X"00",X"0C",X"0F",X"0F",X"0F",X"78",X"F0",X"F0", + X"00",X"00",X"08",X"0F",X"0F",X"E1",X"F0",X"F0",X"00",X"00",X"0F",X"0F",X"0F",X"78",X"F0",X"F0", + X"3C",X"1E",X"0F",X"0F",X"1E",X"0F",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"F0", + X"F0",X"F0",X"F0",X"F0",X"69",X"0F",X"0F",X"0F",X"F0",X"F0",X"F0",X"87",X"0F",X"0F",X"0F",X"0F", + X"0F",X"C3",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"87",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"0F",X"0F",X"1E",X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"C3",X"F0",X"F0",X"F0",X"0F",X"0F",X"0F",X"3C",X"F0",X"F0",X"F0",X"F0", + X"E1",X"C3",X"87",X"87",X"0F",X"0F",X"0F",X"1E",X"78",X"3C",X"F0",X"78",X"78",X"F0",X"E1",X"C3", + X"00",X"01",X"0D",X"0F",X"0F",X"E1",X"E1",X"96",X"0E",X"0F",X"0F",X"3C",X"1E",X"3C",X"78",X"F0", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"0F",X"0F",X"0F",X"0E",X"0F",X"0F",X"0E", + X"0F",X"0F",X"07",X"03",X"07",X"07",X"0F",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"C3",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"1E",X"1E",X"3C",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"0F",X"0F",X"0F",X"87",X"F0", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"0E",X"0E",X"0E",X"0E",X"0C",X"08",X"00",X"00", + X"25",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"E1",X"E1",X"2D",X"16",X"03",X"07",X"12",X"01", + X"61",X"43",X"06",X"06",X"02",X"04",X"08",X"08",X"68",X"0C",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"20",X"20",X"20",X"20",X"20",X"F0",X"00",X"20",X"20",X"22",X"20",X"20",X"00",X"00",X"00", + X"20",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"A8",X"A8",X"AA",X"22",X"64",X"A8",X"F1",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"D0",X"00", + X"10",X"10",X"98",X"88",X"66",X"EE",X"D8",X"00",X"00",X"00",X"00",X"00",X"00",X"99",X"F7",X"55", + X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"10",X"60",X"00",X"44",X"77",X"BB",X"44",X"44", + X"80",X"11",X"22",X"CC",X"00",X"00",X"00",X"00",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"11",X"00",X"11",X"D0",X"00", + X"10",X"10",X"10",X"44",X"00",X"66",X"D0",X"00",X"00",X"00",X"00",X"00",X"00",X"99",X"F7",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"60",X"00",X"00",X"BB",X"00",X"AA",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"33",X"77",X"54",X"76",X"54",X"77",X"33",X"00",X"88",X"C4",X"C8",X"C0",X"C8",X"C4",X"88", + X"00",X"72",X"31",X"10",X"10",X"10",X"31",X"72",X"00",X"80",X"80",X"60",X"E0",X"60",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"22",X"75",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00", + X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00", + X"FF",X"FF",X"FF",X"76",X"B3",X"11",X"00",X"00",X"FC",X"FD",X"FE",X"FF",X"FF",X"FF",X"77",X"00", + X"FF",X"AA",X"FF",X"AA",X"AA",X"FF",X"AA",X"FF",X"FF",X"AA",X"FF",X"AA",X"AA",X"FF",X"AA",X"FF", + X"F3",X"FF",X"F3",X"FF",X"DD",X"DD",X"99",X"11",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB", + X"F5",X"FD",X"F5",X"DD",X"99",X"B9",X"51",X"11",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB", + X"11",X"11",X"51",X"B9",X"99",X"DD",X"F5",X"FD",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"00", + X"00",X"00",X"00",X"00",X"01",X"12",X"16",X"16",X"00",X"00",X"00",X"07",X"F0",X"F0",X"C3",X"87", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"30",X"70",X"78",X"78",X"1E", + X"03",X"07",X"87",X"87",X"C3",X"C3",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"E1", + X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"07",X"00",X"00",X"00", + X"1E",X"0F",X"0F",X"0F",X"0F",X"0F",X"03",X"00",X"E1",X"0F",X"0F",X"69",X"3C",X"0F",X"0F",X"03", + X"87",X"87",X"87",X"2D",X"0F",X"1E",X"0F",X"0F",X"A4",X"48",X"08",X"3B",X"08",X"08",X"33",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"30",X"00",X"22",X"CC",X"CC",X"88",X"00",X"00",X"44",X"00",X"11",X"11",X"11",X"44",X"44",X"00", + X"00",X"00",X"00",X"03",X"16",X"16",X"12",X"07",X"00",X"00",X"0B",X"F0",X"F0",X"C3",X"87",X"4B", + X"00",X"01",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"16",X"78",X"F0",X"F0",X"78",X"78",X"0F",X"0F", + X"0F",X"0F",X"87",X"87",X"C3",X"C3",X"69",X"1E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"87", + X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"07",X"01",X"00",X"00",X"00", + X"0F",X"0F",X"3C",X"1E",X"0F",X"07",X"03",X"00",X"0F",X"0F",X"0F",X"3C",X"A5",X"0F",X"0F",X"07", + X"00",X"0B",X"B4",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"08",X"84",X"C2",X"68",X"2C",X"2C",X"3C", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1E",X"1E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0E", + X"00",X"FF",X"00",X"00",X"51",X"FF",X"20",X"55",X"00",X"FF",X"33",X"FF",X"FF",X"FF",X"FB",X"FE", + X"00",X"FF",X"98",X"DC",X"CC",X"FF",X"F2",X"FE",X"00",X"FF",X"00",X"60",X"F1",X"FF",X"F1",X"E0", + X"77",X"FF",X"77",X"33",X"51",X"FF",X"00",X"00",X"FE",X"FF",X"FB",X"FF",X"FF",X"FF",X"33",X"00", + X"F2",X"FF",X"F2",X"EE",X"CC",X"FF",X"98",X"00",X"E0",X"FF",X"F1",X"F1",X"F1",X"FF",X"00",X"00", + X"00",X"FF",X"00",X"11",X"B3",X"FF",X"50",X"BB",X"00",X"FF",X"77",X"FF",X"FF",X"FF",X"FC",X"FB", + X"00",X"FF",X"40",X"A8",X"98",X"FF",X"FC",X"FC",X"00",X"FF",X"22",X"E2",X"E2",X"FF",X"C0",X"C0", + X"FF",X"FF",X"FF",X"76",X"B3",X"FF",X"00",X"00",X"F8",X"FF",X"FC",X"FF",X"FF",X"FF",X"77",X"00", + X"FC",X"FF",X"FC",X"DC",X"98",X"FF",X"40",X"00",X"C0",X"FF",X"C0",X"C0",X"E2",X"FF",X"22",X"00", + X"00",X"D1",X"C0",X"91",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00", + X"00",X"00",X"CC",X"66",X"EE",X"44",X"EE",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"00",X"33",X"00",X"00",X"00",X"33",X"F3",X"EE",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"CC",X"11",X"00",X"00",X"00",X"00",X"00",X"11",X"DD",X"99",X"11",X"40",X"60",X"C0", + X"00",X"00",X"51",X"C0",X"D1",X"00",X"00",X"00",X"00",X"00",X"44",X"FF",X"77",X"66",X"AA",X"77", + X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"33",X"33",X"F3",X"EE",X"00",X"00",X"00",X"00", + X"33",X"BB",X"88",X"88",X"00",X"10",X"30",X"60",X"88",X"CC",X"CC",X"11",X"11",X"00",X"11",X"77", + X"00",X"90",X"CC",X"22",X"00",X"00",X"00",X"00",X"00",X"F1",X"11",X"31",X"20",X"20",X"20",X"33", + X"00",X"F0",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"F8",X"A8",X"31",X"11",X"31",X"20",X"20", + X"00",X"00",X"00",X"00",X"22",X"EC",X"F0",X"00",X"00",X"00",X"00",X"20",X"20",X"22",X"F2",X"00", + X"00",X"00",X"00",X"00",X"88",X"20",X"70",X"00",X"EE",X"33",X"31",X"22",X"64",X"64",X"F4",X"00", + X"00",X"00",X"00",X"11",X"33",X"33",X"FF",X"FF",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"FF", + X"10",X"10",X"10",X"11",X"33",X"BB",X"FF",X"FF",X"00",X"00",X"00",X"88",X"EF",X"EF",X"CC",X"EF", + X"FF",X"FF",X"77",X"76",X"33",X"11",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"EE",X"FF",X"E0",X"00", + X"FF",X"FF",X"FF",X"FE",X"98",X"10",X"10",X"10",X"EF",X"CD",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"33",X"33",X"FF",X"FF",X"FF",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"10",X"10",X"10",X"11",X"33",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"88",X"CC",X"EF",X"EF",X"CC", + X"FF",X"76",X"77",X"33",X"11",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"70",X"00",X"00", + X"FF",X"FE",X"77",X"89",X"10",X"10",X"10",X"10",X"EF",X"EF",X"CD",X"88",X"00",X"00",X"00",X"00", + X"11",X"33",X"33",X"FF",X"FF",X"FF",X"FF",X"77",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"10",X"10",X"BB",X"FF",X"FF",X"FF",X"FF",X"FE",X"00",X"00",X"00",X"88",X"CC",X"EE",X"EF",X"CD", + X"76",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"70",X"00",X"00",X"00",X"00", + X"BB",X"33",X"99",X"01",X"10",X"10",X"10",X"10",X"CC",X"EF",X"AB",X"01",X"00",X"00",X"00",X"00", + X"61",X"43",X"06",X"06",X"02",X"04",X"08",X"08",X"68",X"1D",X"3B",X"11",X"00",X"00",X"00",X"00", + X"25",X"89",X"CC",X"88",X"00",X"00",X"00",X"00",X"E1",X"E1",X"2D",X"16",X"03",X"07",X"12",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F0",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"F0",X"20",X"20",X"20",X"00",X"20",X"20", + X"00",X"F0",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"F0",X"20",X"20",X"00",X"00",X"00",X"00", + X"20",X"20",X"20",X"20",X"20",X"20",X"F0",X"00",X"20",X"20",X"00",X"20",X"20",X"20",X"F0",X"00", + X"20",X"20",X"20",X"20",X"20",X"20",X"F0",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"F1",X"33", + X"00",X"F0",X"20",X"20",X"20",X"00",X"20",X"20",X"CC",X"74",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"F0",X"20",X"20",X"00",X"00",X"00",X"20",X"00",X"F0",X"33",X"00",X"00",X"00",X"00",X"00", + X"20",X"20",X"00",X"20",X"20",X"20",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"F0",X"00", + X"20",X"00",X"00",X"00",X"20",X"20",X"F1",X"33",X"00",X"00",X"00",X"00",X"00",X"33",X"E0",X"00", + X"44",X"FC",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"90",X"CC",X"22",X"00",X"00",X"00",X"00", + X"00",X"F0",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"F0",X"00",X"00",X"00",X"00",X"00",X"22",X"EC",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"33",X"C0",X"00",X"00",X"00",X"00",X"00",X"A8",X"20",X"70",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_palette.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_palette.vhd new file mode 100644 index 00000000..522f4290 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_palette.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_palette is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_palette is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"38",X"C0",X"3F",X"C7",X"26",X"03",X"0D",X"2F",X"D1",X"C3",X"F0",X"B8",X"D8",X"FE", + X"00",X"07",X"38",X"80",X"3F",X"C7",X"26",X"03",X"0D",X"2F",X"34",X"20",X"F0",X"B8",X"D8",X"FE"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_prog.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_prog.vhd new file mode 100644 index 00000000..aca0bf96 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_prog.vhd @@ -0,0 +1,2070 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_prog is +port ( + clk : in std_logic; + addr : in std_logic_vector(14 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_prog is + type rom is array(0 to 32767) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AF",X"32",X"80",X"A1",X"C3",X"92",X"00",X"FF",X"77",X"3C",X"23",X"77",X"3C",X"19",X"C9",X"FF", + X"77",X"23",X"10",X"FC",X"C9",X"FF",X"FF",X"FF",X"77",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"C9", + X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"C9",X"87",X"E1",X"5F",X"16",X"00",X"19",X"5E",X"23", + X"56",X"EB",X"E9",X"FF",X"FF",X"FF",X"FF",X"FF",X"E5",X"26",X"88",X"3A",X"A0",X"88",X"6F",X"CB", + X"7E",X"28",X"0E",X"72",X"2C",X"73",X"2C",X"7D",X"FE",X"C0",X"30",X"02",X"3E",X"C0",X"32",X"A0", + X"88",X"E1",X"C9",X"0F",X"33",X"31",X"24",X"22",X"21",X"15",X"13",X"11",X"07",X"06",X"05",X"04", + X"03",X"02",X"01",X"FF",X"FF",X"FF",X"C3",X"6D",X"06",X"00",X"11",X"22",X"04",X"31",X"06",X"15", + X"02",X"33",X"07",X"21",X"03",X"24",X"05",X"13",X"01",X"00",X"33",X"05",X"61",X"BE",X"05",X"66", + X"07",X"06",X"DD",X"A8",X"05",X"60",X"BC",X"04",X"A6",X"51",X"05",X"38",X"8A",X"06",X"AD",X"BA", + X"05",X"CA",X"32",X"00",X"A0",X"31",X"00",X"90",X"32",X"00",X"88",X"06",X"08",X"C5",X"21",X"00", + X"00",X"DD",X"21",X"79",X"00",X"11",X"00",X"00",X"4A",X"7B",X"86",X"5F",X"30",X"04",X"14",X"20", + X"01",X"0C",X"2C",X"20",X"F4",X"24",X"7C",X"E6",X"0F",X"20",X"EE",X"32",X"00",X"A0",X"7B",X"DD", + X"BE",X"00",X"20",X"0C",X"7A",X"DD",X"BE",X"01",X"20",X"06",X"79",X"DD",X"BE",X"02",X"28",X"02", + X"18",X"06",X"E5",X"21",X"FF",X"8F",X"34",X"E1",X"DD",X"23",X"DD",X"23",X"DD",X"23",X"10",X"C5", + X"3A",X"E0",X"A0",X"E6",X"0F",X"21",X"69",X"00",X"E7",X"7E",X"B7",X"18",X"16",X"57",X"E6",X"0F", + X"5F",X"AA",X"0F",X"0F",X"0F",X"0F",X"CD",X"FA",X"00",X"7B",X"FE",X"0A",X"38",X"02",X"C6",X"07", + X"77",X"09",X"C9",X"32",X"00",X"A0",X"21",X"00",X"88",X"11",X"01",X"88",X"01",X"FD",X"07",X"36", + X"00",X"ED",X"B0",X"3E",X"08",X"32",X"42",X"8A",X"21",X"C0",X"88",X"06",X"40",X"3E",X"FF",X"D7", + X"21",X"43",X"8A",X"06",X"1C",X"D7",X"21",X"43",X"43",X"22",X"40",X"8A",X"32",X"00",X"A0",X"3E", + X"01",X"32",X"87",X"A1",X"32",X"1F",X"88",X"21",X"C0",X"C0",X"22",X"A0",X"88",X"21",X"00",X"80", + X"11",X"01",X"80",X"36",X"10",X"01",X"00",X"04",X"ED",X"B0",X"CD",X"E6",X"02",X"32",X"00",X"A0", + X"3A",X"00",X"A0",X"2F",X"0F",X"0F",X"47",X"E6",X"01",X"32",X"0F",X"88",X"78",X"0F",X"47",X"E6", + X"01",X"32",X"00",X"88",X"78",X"0F",X"47",X"E6",X"07",X"32",X"20",X"88",X"78",X"0F",X"0F",X"0F", + X"47",X"E6",X"01",X"32",X"21",X"88",X"3A",X"00",X"A0",X"2F",X"E6",X"03",X"FE",X"03",X"28",X"04", + X"C6",X"03",X"18",X"02",X"3E",X"FF",X"32",X"07",X"88",X"3A",X"E0",X"A0",X"47",X"E6",X"F0",X"0F", + X"0F",X"0F",X"0F",X"21",X"53",X"00",X"E7",X"32",X"2F",X"88",X"78",X"E6",X"0F",X"21",X"53",X"00", + X"E7",X"32",X"2C",X"88",X"32",X"00",X"A0",X"CD",X"EA",X"01",X"AF",X"CD",X"8F",X"0E",X"3E",X"01", + X"32",X"80",X"A1",X"21",X"00",X"8A",X"06",X"0A",X"36",X"00",X"2C",X"36",X"00",X"2C",X"36",X"01", + X"2C",X"10",X"F5",X"21",X"AA",X"88",X"36",X"01",X"32",X"00",X"A0",X"21",X"C0",X"89",X"AF",X"06", + X"1E",X"D7",X"C3",X"0F",X"02",X"32",X"00",X"A0",X"18",X"FB",X"0B",X"32",X"00",X"A0",X"3A",X"80", + X"A0",X"CB",X"5F",X"C0",X"78",X"B1",X"20",X"F2",X"37",X"C9",X"21",X"10",X"94",X"06",X"30",X"D7", + X"21",X"10",X"90",X"06",X"30",X"D7",X"21",X"40",X"84",X"11",X"41",X"84",X"01",X"BF",X"03",X"36", + X"1E",X"ED",X"B0",X"00",X"00",X"00",X"10",X"FB",X"32",X"00",X"A0",X"0D",X"20",X"F5",X"C9",X"26", + X"88",X"3A",X"A1",X"88",X"6F",X"7E",X"87",X"30",X"05",X"CD",X"54",X"02",X"18",X"F1",X"E6",X"1F", + X"4F",X"06",X"00",X"36",X"FF",X"23",X"5E",X"36",X"FF",X"2C",X"7D",X"FE",X"C0",X"30",X"02",X"3E", + X"C0",X"32",X"A1",X"88",X"7B",X"21",X"42",X"02",X"09",X"5E",X"23",X"56",X"21",X"0F",X"02",X"E5", + X"EB",X"E9",X"9B",X"03",X"C2",X"03",X"E9",X"03",X"96",X"04",X"52",X"05",X"6B",X"05",X"B2",X"05", + X"EE",X"05",X"44",X"06",X"3A",X"3F",X"88",X"47",X"E6",X"0F",X"CA",X"61",X"02",X"CD",X"8C",X"20", + X"C9",X"3A",X"06",X"88",X"A7",X"C8",X"11",X"E0",X"FF",X"21",X"E0",X"84",X"3A",X"0E",X"88",X"A7", + X"28",X"22",X"36",X"02",X"CD",X"AA",X"02",X"21",X"40",X"87",X"CD",X"A8",X"02",X"3A",X"0D",X"88", + X"A7",X"21",X"40",X"87",X"28",X"03",X"21",X"E0",X"84",X"CB",X"60",X"C8",X"3A",X"06",X"88",X"0F", + X"D0",X"C3",X"B1",X"02",X"21",X"E0",X"84",X"CD",X"B1",X"02",X"21",X"21",X"85",X"CD",X"B1",X"02", + X"CD",X"B1",X"02",X"CD",X"B1",X"02",X"18",X"CF",X"36",X"01",X"19",X"36",X"25",X"19",X"36",X"20", + X"C9",X"3E",X"10",X"77",X"19",X"77",X"19",X"77",X"C9",X"21",X"40",X"88",X"06",X"60",X"AF",X"D7", + X"21",X"80",X"8A",X"D7",X"D7",X"06",X"37",X"D7",X"C9",X"CD",X"B9",X"02",X"06",X"1D",X"3E",X"20", + X"90",X"5F",X"16",X"00",X"2A",X"0B",X"88",X"3E",X"10",X"D7",X"19",X"22",X"0B",X"88",X"21",X"09", + X"88",X"35",X"C9",X"21",X"02",X"84",X"22",X"0B",X"88",X"3E",X"20",X"32",X"09",X"88",X"C9",X"21", + X"40",X"88",X"DD",X"21",X"80",X"8A",X"11",X"18",X"00",X"06",X"02",X"CD",X"2A",X"03",X"DD",X"21", + X"90",X"8C",X"06",X"02",X"CD",X"2A",X"03",X"DD",X"21",X"E0",X"8A",X"06",X"12",X"CD",X"43",X"03", + X"DD",X"21",X"B0",X"8A",X"06",X"02",X"CD",X"2A",X"03",X"21",X"98",X"88",X"35",X"21",X"9C",X"88", + X"35",X"3A",X"1F",X"88",X"A7",X"C0",X"CD",X"78",X"03",X"C9",X"DD",X"7E",X"06",X"77",X"2C",X"DD", + X"7E",X"10",X"77",X"2C",X"DD",X"7E",X"04",X"77",X"2C",X"DD",X"7E",X"0F",X"77",X"2C",X"DD",X"19", + X"10",X"E8",X"C9",X"DD",X"4E",X"05",X"DD",X"7E",X"06",X"CB",X"01",X"17",X"CB",X"01",X"17",X"CB", + X"01",X"17",X"D6",X"08",X"77",X"2C",X"DD",X"7E",X"10",X"77",X"2C",X"DD",X"7E",X"04",X"DD",X"4E", + X"03",X"CB",X"01",X"17",X"CB",X"01",X"17",X"CB",X"01",X"17",X"D6",X"08",X"77",X"2C",X"DD",X"7E", + X"0F",X"77",X"2C",X"DD",X"19",X"10",X"CC",X"C9",X"11",X"40",X"88",X"06",X"18",X"1A",X"ED",X"44", + X"D6",X"10",X"12",X"1C",X"1A",X"E6",X"C0",X"EE",X"C0",X"4F",X"1A",X"E6",X"0F",X"B1",X"12",X"1C", + X"1A",X"ED",X"44",X"D6",X"10",X"12",X"1C",X"1C",X"10",X"E3",X"C9",X"3A",X"06",X"88",X"A7",X"C8", + X"21",X"82",X"84",X"11",X"20",X"00",X"3A",X"80",X"8A",X"3C",X"FE",X"08",X"38",X"02",X"3E",X"08", + X"4F",X"47",X"36",X"0C",X"19",X"10",X"FB",X"3E",X"08",X"91",X"C8",X"47",X"36",X"10",X"19",X"10", + X"FB",X"C9",X"21",X"3F",X"86",X"11",X"E0",X"FF",X"3A",X"08",X"89",X"A7",X"C8",X"3D",X"4F",X"28", + X"0D",X"FE",X"05",X"38",X"02",X"3E",X"05",X"4F",X"47",X"36",X"B0",X"19",X"10",X"FB",X"3E",X"05", + X"91",X"C8",X"47",X"36",X"10",X"19",X"10",X"FB",X"C9",X"3E",X"1A",X"06",X"0B",X"F5",X"C5",X"CD", + X"B2",X"05",X"C1",X"F1",X"3C",X"10",X"F6",X"21",X"C7",X"85",X"11",X"20",X"00",X"06",X"0A",X"DD", + X"21",X"00",X"8A",X"CD",X"29",X"04",X"77",X"19",X"DD",X"23",X"CD",X"29",X"04",X"77",X"19",X"DD", + X"23",X"CD",X"29",X"04",X"28",X"01",X"77",X"11",X"62",X"FF",X"19",X"11",X"20",X"00",X"DD",X"23", + X"10",X"E1",X"CD",X"39",X"04",X"CD",X"60",X"04",X"C9",X"DD",X"7E",X"00",X"4F",X"E6",X"0F",X"77", + X"19",X"79",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"C9",X"DD",X"21",X"C0",X"89",X"21",X"67",X"84", + X"06",X"0A",X"11",X"20",X"00",X"DD",X"23",X"CD",X"29",X"04",X"77",X"19",X"36",X"51",X"19",X"DD", + X"23",X"CD",X"29",X"04",X"28",X"01",X"77",X"DD",X"23",X"11",X"82",X"FF",X"19",X"10",X"E3",X"C9", + X"DD",X"21",X"00",X"8E",X"21",X"67",X"85",X"06",X"0A",X"11",X"E0",X"FF",X"DD",X"7E",X"00",X"A7", + X"20",X"02",X"3E",X"40",X"77",X"19",X"DD",X"23",X"DD",X"7E",X"00",X"A7",X"20",X"02",X"3E",X"40", + X"77",X"19",X"DD",X"23",X"DD",X"7E",X"00",X"A7",X"20",X"02",X"3E",X"40",X"77",X"DD",X"23",X"11", + X"42",X"00",X"19",X"10",X"D4",X"C9",X"4F",X"3A",X"06",X"88",X"0F",X"D0",X"79",X"A7",X"28",X"47", + X"CD",X"F2",X"04",X"87",X"81",X"4F",X"06",X"00",X"21",X"01",X"05",X"09",X"A7",X"06",X"03",X"1A", + X"8E",X"27",X"12",X"13",X"23",X"10",X"F8",X"D5",X"3A",X"0D",X"88",X"0F",X"30",X"02",X"3E",X"01", + X"CD",X"6B",X"05",X"D1",X"1B",X"21",X"AA",X"88",X"06",X"03",X"1A",X"BE",X"D8",X"20",X"05",X"1B", + X"2B",X"10",X"F7",X"C9",X"CD",X"F2",X"04",X"21",X"A8",X"88",X"06",X"03",X"1A",X"77",X"13",X"23", + X"10",X"FA",X"3E",X"02",X"C3",X"6B",X"05",X"CD",X"F2",X"04",X"21",X"AB",X"88",X"A7",X"06",X"03", + X"18",X"BD",X"F5",X"3A",X"0D",X"88",X"11",X"A2",X"88",X"0F",X"30",X"03",X"11",X"A5",X"88",X"F1", + X"C9",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"07",X"00",X"00",X"05",X"00",X"50",X"04",X"00", + X"00",X"04",X"00",X"80",X"03",X"00",X"50",X"03",X"00",X"30",X"03",X"00",X"00",X"03",X"00",X"80", + X"02",X"00",X"50",X"02",X"00",X"30",X"02",X"00",X"00",X"02",X"00",X"80",X"01",X"00",X"50",X"01", + X"00",X"30",X"01",X"00",X"00",X"01",X"00",X"50",X"00",X"00",X"00",X"01",X"00",X"00",X"01",X"00", + X"00",X"02",X"00",X"00",X"04",X"00",X"00",X"08",X"00",X"00",X"16",X"00",X"00",X"32",X"00",X"00", + X"50",X"00",X"F5",X"21",X"A2",X"88",X"A7",X"28",X"09",X"21",X"A5",X"88",X"3D",X"28",X"03",X"21", + X"A8",X"88",X"36",X"00",X"23",X"36",X"00",X"23",X"36",X"00",X"F1",X"21",X"A4",X"88",X"DD",X"21", + X"81",X"87",X"A7",X"28",X"11",X"21",X"A7",X"88",X"DD",X"21",X"21",X"85",X"3D",X"28",X"07",X"21", + X"AA",X"88",X"DD",X"21",X"41",X"86",X"11",X"E0",X"FF",X"06",X"03",X"0E",X"04",X"7E",X"0F",X"0F", + X"0F",X"0F",X"CD",X"9D",X"05",X"7E",X"CD",X"9D",X"05",X"2B",X"10",X"F1",X"C9",X"E6",X"0F",X"28", + X"08",X"0E",X"00",X"DD",X"77",X"00",X"DD",X"19",X"C9",X"79",X"A7",X"28",X"F6",X"3E",X"10",X"0D", + X"18",X"F1",X"87",X"F5",X"21",X"0D",X"7A",X"E6",X"7F",X"5F",X"16",X"00",X"19",X"F1",X"5E",X"23", + X"56",X"EB",X"5E",X"23",X"56",X"23",X"EB",X"01",X"E0",X"FF",X"38",X"14",X"1A",X"FE",X"2E",X"28", + X"0B",X"FE",X"3F",X"C8",X"D6",X"30",X"77",X"13",X"09",X"18",X"F1",X"37",X"EB",X"23",X"18",X"E2", + X"1A",X"FE",X"2E",X"28",X"F6",X"FE",X"3F",X"C8",X"36",X"10",X"13",X"09",X"18",X"F2",X"3E",X"05", + X"CD",X"B2",X"05",X"3A",X"02",X"88",X"FE",X"63",X"38",X"02",X"3E",X"63",X"CD",X"2A",X"06",X"47", + X"E6",X"F0",X"28",X"07",X"0F",X"0F",X"0F",X"0F",X"32",X"BF",X"86",X"78",X"E6",X"0F",X"32",X"9F", + X"86",X"FE",X"02",X"C0",X"11",X"C8",X"64",X"01",X"1F",X"00",X"1A",X"1B",X"80",X"47",X"0D",X"20", + X"F9",X"FE",X"8C",X"C8",X"21",X"1E",X"45",X"29",X"34",X"C9",X"47",X"E6",X"0F",X"C6",X"00",X"27", + X"4F",X"78",X"E6",X"F0",X"28",X"0B",X"0F",X"0F",X"0F",X"0F",X"47",X"AF",X"C6",X"16",X"27",X"10", + X"FB",X"81",X"27",X"C9",X"DD",X"21",X"8A",X"77",X"16",X"00",X"DD",X"7E",X"00",X"FE",X"C8",X"20", + X"16",X"DD",X"86",X"01",X"30",X"01",X"14",X"DD",X"86",X"02",X"30",X"01",X"14",X"DD",X"86",X"03", + X"30",X"01",X"14",X"92",X"FE",X"59",X"C8",X"3E",X"01",X"32",X"F8",X"8D",X"C9",X"F5",X"C5",X"D5", + X"E5",X"08",X"D9",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"AF",X"32",X"80",X"A1",X"21", + X"40",X"88",X"DD",X"21",X"10",X"94",X"11",X"10",X"90",X"06",X"04",X"3A",X"0A",X"88",X"FE",X"04", + X"28",X"04",X"06",X"18",X"18",X"18",X"CD",X"14",X"07",X"21",X"7C",X"88",X"06",X"03",X"CD",X"14", + X"07",X"21",X"50",X"88",X"06",X"0B",X"CD",X"14",X"07",X"21",X"88",X"88",X"06",X"06",X"CD",X"14", + X"07",X"32",X"00",X"A0",X"3A",X"15",X"88",X"32",X"16",X"88",X"3A",X"13",X"88",X"32",X"15",X"88", + X"2A",X"10",X"88",X"22",X"13",X"88",X"21",X"12",X"88",X"3A",X"C0",X"A0",X"2F",X"77",X"2B",X"3A", + X"A0",X"A0",X"2F",X"77",X"2B",X"3A",X"80",X"A0",X"2F",X"77",X"21",X"3F",X"88",X"35",X"21",X"5F", + X"8A",X"35",X"CD",X"E8",X"59",X"CD",X"64",X"0E",X"21",X"FA",X"06",X"E5",X"3A",X"05",X"88",X"EF", + X"2D",X"07",X"99",X"08",X"4E",X"0C",X"9B",X"15",X"53",X"0E",X"3A",X"1F",X"88",X"32",X"87",X"A1", + X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"D9",X"08",X"E1",X"D1",X"C1",X"3E",X"01",X"32", + X"80",X"A1",X"F1",X"C9",X"7E",X"DD",X"77",X"01",X"2C",X"7E",X"DD",X"77",X"00",X"2C",X"7E",X"12", + X"13",X"2C",X"7E",X"12",X"13",X"2C",X"DD",X"23",X"DD",X"23",X"10",X"E8",X"C9",X"06",X"20",X"CD", + X"CE",X"02",X"C0",X"3A",X"FF",X"8F",X"FE",X"10",X"C2",X"0F",X"02",X"21",X"06",X"88",X"36",X"00", + X"2B",X"36",X"01",X"AF",X"32",X"0A",X"88",X"01",X"79",X"07",X"CD",X"5D",X"07",X"11",X"04",X"06", + X"FF",X"11",X"00",X"05",X"FF",X"1E",X"02",X"FF",X"AF",X"32",X"51",X"8E",X"C9",X"21",X"40",X"80", + X"11",X"20",X"00",X"0A",X"77",X"19",X"7C",X"FE",X"84",X"38",X"F8",X"26",X"80",X"CB",X"F5",X"03", + X"2C",X"7D",X"E6",X"1F",X"FE",X"1F",X"38",X"EB",X"C9",X"1D",X"03",X"10",X"10",X"17",X"17",X"16", + X"17",X"17",X"17",X"17",X"17",X"00",X"18",X"18",X"18",X"10",X"10",X"10",X"1B",X"1B",X"1B",X"1B", + X"1B",X"1B",X"1B",X"1B",X"1B",X"19",X"16",X"16",X"11",X"0D",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A", + X"0A",X"0A",X"0A",X"0A",X"0A",X"00",X"00",X"04",X"00",X"0D",X"03",X"0F",X"0F",X"0F",X"0F",X"0F", + X"07",X"07",X"00",X"08",X"08",X"08",X"0C",X"0C",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"07",X"07", + X"07",X"17",X"17",X"17",X"14",X"0E",X"16",X"14",X"00",X"0D",X"03",X"00",X"00",X"0D",X"00",X"00", + X"07",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"08",X"0B",X"0B",X"0B",X"0B", + X"0C",X"0C",X"0C",X"0C",X"00",X"11",X"00",X"04",X"00",X"1D",X"03",X"14",X"11",X"1C",X"1C",X"1C", + X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C", + X"1C",X"1C",X"1C",X"1C",X"1C",X"1F",X"16",X"14",X"11",X"1D",X"03",X"14",X"14",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"1B",X"00",X"0C",X"00",X"08",X"00",X"0C", + X"00",X"19",X"00",X"0E",X"11",X"1F",X"1F",X"10",X"07",X"1D",X"03",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"11",X"0D",X"03",X"00",X"00",X"07",X"07",X"07", + X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0B",X"0B",X"0B",X"0B",X"07",X"00",X"04",X"00",X"1D",X"03",X"12",X"12",X"12",X"12",X"12", + X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12", + X"12",X"12",X"12",X"12",X"12",X"12",X"10",X"10",X"11",X"21",X"B5",X"0B",X"E5",X"3A",X"51",X"8E", + X"EF",X"B3",X"08",X"E9",X"08",X"2C",X"09",X"86",X"09",X"9C",X"09",X"C8",X"0A",X"32",X"0B",X"42", + X"74",X"EA",X"76",X"AF",X"32",X"28",X"A0",X"32",X"19",X"88",X"CD",X"E3",X"02",X"21",X"51",X"8E", + X"34",X"01",X"D5",X"64",X"2E",X"00",X"65",X"0A",X"FE",X"96",X"28",X"08",X"84",X"30",X"01",X"2C", + X"67",X"0B",X"18",X"F3",X"95",X"FE",X"8F",X"28",X"05",X"3E",X"01",X"32",X"FB",X"89",X"AF",X"32", + X"06",X"88",X"CD",X"B9",X"02",X"CD",X"0D",X"1D",X"C9",X"06",X"1D",X"CD",X"CE",X"02",X"C0",X"CD", + X"E3",X"02",X"21",X"59",X"08",X"06",X"1F",X"7E",X"23",X"86",X"10",X"FC",X"FE",X"63",X"20",X"F2", + X"01",X"59",X"08",X"CD",X"5D",X"07",X"21",X"31",X"08",X"06",X"08",X"7E",X"23",X"86",X"10",X"FC", + X"FE",X"AA",X"20",X"DE",X"CD",X"54",X"0E",X"11",X"11",X"06",X"FF",X"1E",X"0B",X"FF",X"21",X"51", + X"8E",X"36",X"07",X"C9",X"58",X"40",X"38",X"06",X"88",X"40",X"38",X"0B",X"06",X"19",X"CD",X"CE", + X"02",X"C0",X"CD",X"E3",X"02",X"21",X"51",X"8E",X"34",X"CD",X"B9",X"02",X"21",X"F5",X"07",X"3E", + X"11",X"BE",X"20",X"FD",X"DD",X"21",X"38",X"08",X"06",X"07",X"21",X"76",X"09",X"78",X"CD",X"45", + X"0C",X"3E",X"1C",X"83",X"5F",X"30",X"01",X"14",X"1A",X"4F",X"DD",X"7E",X"00",X"B9",X"20",X"16", + X"DD",X"2B",X"10",X"E6",X"01",X"D9",X"07",X"CD",X"5D",X"07",X"11",X"8B",X"06",X"FF",X"1E",X"8E", + X"FF",X"11",X"00",X"02",X"FF",X"C9",X"79",X"07",X"99",X"07",X"B9",X"07",X"D9",X"07",X"F9",X"07", + X"19",X"08",X"39",X"08",X"59",X"08",X"21",X"50",X"8E",X"35",X"C0",X"CD",X"B9",X"02",X"CD",X"E3", + X"02",X"21",X"51",X"8E",X"34",X"21",X"26",X"0B",X"22",X"48",X"8F",X"C9",X"06",X"19",X"CD",X"CE", + X"02",X"C0",X"16",X"0D",X"21",X"65",X"0A",X"01",X"C9",X"07",X"0A",X"96",X"20",X"FC",X"03",X"23", + X"15",X"20",X"F7",X"01",X"B9",X"07",X"CD",X"5D",X"07",X"11",X"0D",X"06",X"FF",X"21",X"70",X"8B", + X"AF",X"47",X"D7",X"21",X"76",X"0A",X"11",X"7E",X"0A",X"DD",X"21",X"70",X"8B",X"CD",X"0C",X"0A", + X"01",X"18",X"00",X"DD",X"09",X"1A",X"3C",X"20",X"F4",X"CD",X"52",X"0A",X"CD",X"25",X"0A",X"21", + X"87",X"0A",X"22",X"54",X"8E",X"21",X"48",X"86",X"22",X"56",X"8E",X"21",X"50",X"8E",X"36",X"32", + X"2C",X"34",X"2C",X"36",X"0D",X"2C",X"36",X"05",X"DD",X"21",X"70",X"8B",X"06",X"04",X"11",X"18", + X"00",X"CD",X"06",X"40",X"DD",X"19",X"10",X"F9",X"CD",X"EF",X"02",X"C9",X"1A",X"DD",X"77",X"06", + X"13",X"1A",X"13",X"DD",X"77",X"04",X"7E",X"DD",X"77",X"0C",X"23",X"7E",X"DD",X"77",X"0D",X"DD", + X"36",X"0E",X"00",X"23",X"C9",X"21",X"41",X"8D",X"36",X"0A",X"2D",X"7E",X"34",X"E6",X"03",X"21", + X"F6",X"26",X"CD",X"45",X"0C",X"D5",X"21",X"6A",X"86",X"CD",X"40",X"0A",X"D1",X"21",X"AA",X"86", + X"01",X"20",X"00",X"1A",X"77",X"2C",X"13",X"1A",X"77",X"09",X"13",X"1A",X"77",X"2D",X"13",X"1A", + X"77",X"C9",X"21",X"AA",X"82",X"11",X"72",X"0A",X"CD",X"40",X"0A",X"21",X"6A",X"82",X"11",X"72", + X"0A",X"CD",X"40",X"0A",X"C9",X"0C",X"0C",X"0E",X"0E",X"0E",X"07",X"07",X"07",X"17",X"17",X"17", + X"14",X"0E",X"00",X"00",X"00",X"00",X"5D",X"2D",X"EF",X"68",X"38",X"38",X"12",X"42",X"0A",X"08", + X"0A",X"0E",X"0A",X"13",X"0A",X"16",X"FF",X"10",X"40",X"40",X"40",X"10",X"10",X"20",X"1F",X"1F", + X"29",X"11",X"1E",X"10",X"10",X"40",X"40",X"40",X"10",X"10",X"12",X"25",X"25",X"29",X"11",X"1E", + X"10",X"10",X"40",X"40",X"40",X"10",X"10",X"1D",X"11",X"1D",X"11",X"10",X"10",X"10",X"10",X"40", + X"40",X"40",X"10",X"10",X"27",X"1F",X"1C",X"16",X"10",X"10",X"10",X"10",X"40",X"40",X"40",X"10", + X"10",X"12",X"1F",X"23",X"23",X"10",X"10",X"10",X"21",X"41",X"8D",X"35",X"20",X"03",X"CD",X"28", + X"0A",X"CD",X"F8",X"09",X"21",X"50",X"8E",X"35",X"C0",X"36",X"02",X"2A",X"54",X"8E",X"7E",X"23", + X"22",X"54",X"8E",X"2A",X"56",X"8E",X"77",X"11",X"E0",X"FF",X"19",X"22",X"56",X"8E",X"21",X"52", + X"8E",X"35",X"C0",X"36",X"0D",X"21",X"50",X"8E",X"36",X"14",X"2C",X"34",X"2A",X"56",X"8E",X"11", + X"00",X"00",X"06",X"0E",X"7E",X"83",X"5F",X"30",X"01",X"14",X"3E",X"20",X"85",X"6F",X"30",X"01", + X"24",X"10",X"F1",X"2A",X"48",X"8F",X"7E",X"BB",X"C2",X"42",X"74",X"23",X"7E",X"BA",X"C2",X"EA", + X"76",X"23",X"22",X"48",X"8F",X"C9",X"C6",X"01",X"C4",X"01",X"8C",X"01",X"A8",X"01",X"A7",X"01", + X"BC",X"1C",X"21",X"BC",X"82",X"11",X"E0",X"FF",X"06",X"0A",X"7E",X"19",X"BE",X"C2",X"B3",X"08", + X"10",X"F8",X"21",X"41",X"8D",X"35",X"20",X"03",X"CD",X"28",X"0A",X"CD",X"F8",X"09",X"21",X"50", + X"8E",X"35",X"C0",X"36",X"01",X"2C",X"35",X"3A",X"53",X"8E",X"3D",X"21",X"AB",X"0B",X"CD",X"45", + X"0C",X"ED",X"53",X"56",X"8E",X"21",X"53",X"8E",X"35",X"C0",X"21",X"50",X"8E",X"36",X"96",X"2C", + X"AF",X"77",X"21",X"62",X"84",X"57",X"5F",X"0E",X"0E",X"06",X"1D",X"7B",X"86",X"30",X"01",X"14", + X"5F",X"23",X"10",X"F7",X"7D",X"C6",X"03",X"6F",X"30",X"01",X"24",X"0D",X"20",X"EB",X"2A",X"48", + X"8F",X"7B",X"BE",X"C2",X"B3",X"08",X"23",X"7E",X"BA",X"C2",X"E9",X"08",X"AF",X"32",X"48",X"8F", + X"32",X"49",X"8F",X"3E",X"03",X"32",X"05",X"88",X"C3",X"00",X"0E",X"59",X"86",X"56",X"86",X"53", + X"86",X"4E",X"86",X"4B",X"86",X"3A",X"06",X"88",X"A7",X"20",X"41",X"3A",X"05",X"88",X"3D",X"20", + X"3B",X"3A",X"51",X"8E",X"FE",X"03",X"28",X"08",X"FE",X"05",X"28",X"04",X"FE",X"08",X"20",X"2C", + X"11",X"E0",X"FF",X"21",X"FE",X"8E",X"34",X"21",X"BC",X"86",X"01",X"C2",X"20",X"0A",X"96",X"20", + X"16",X"19",X"03",X"0A",X"3C",X"20",X"F6",X"11",X"C0",X"FB",X"19",X"EB",X"21",X"CB",X"20",X"3A", + X"51",X"8E",X"E7",X"EB",X"BE",X"28",X"05",X"3E",X"01",X"32",X"E5",X"89",X"3A",X"2C",X"88",X"FE", + X"0F",X"20",X"19",X"3A",X"10",X"88",X"CB",X"5F",X"28",X"09",X"CD",X"CF",X"0E",X"21",X"00",X"00", + X"C3",X"AB",X"0D",X"CB",X"67",X"C8",X"CD",X"CF",X"0E",X"C3",X"A8",X"0D",X"3A",X"02",X"88",X"A7", + X"C8",X"21",X"05",X"88",X"34",X"AF",X"32",X"0A",X"88",X"C9",X"3A",X"80",X"A0",X"CB",X"5F",X"C0", + X"3E",X"09",X"32",X"51",X"8E",X"21",X"00",X"84",X"1E",X"10",X"01",X"FF",X"03",X"73",X"23",X"0B", + X"78",X"B1",X"20",X"F9",X"C9",X"87",X"16",X"00",X"5F",X"19",X"5E",X"23",X"56",X"C9",X"21",X"78", + X"0D",X"E5",X"3A",X"0A",X"88",X"EF",X"5C",X"0C",X"77",X"0C",X"61",X"0D",X"AF",X"32",X"19",X"88", + X"32",X"28",X"A0",X"32",X"06",X"88",X"21",X"42",X"84",X"22",X"0B",X"88",X"21",X"09",X"88",X"36", + X"0F",X"23",X"34",X"CD",X"B9",X"02",X"C9",X"2A",X"0B",X"88",X"06",X"1D",X"3E",X"10",X"D7",X"11", + X"03",X"00",X"19",X"06",X"1D",X"D7",X"19",X"22",X"0B",X"88",X"21",X"09",X"88",X"35",X"C0",X"2C", + X"34",X"21",X"79",X"07",X"01",X"00",X"00",X"7E",X"23",X"86",X"30",X"01",X"0C",X"10",X"F9",X"FE", + X"C1",X"20",X"F5",X"79",X"FE",X"0C",X"20",X"F0",X"01",X"79",X"07",X"CD",X"5D",X"07",X"32",X"0D", + X"88",X"CD",X"54",X"0E",X"CD",X"F8",X"0C",X"11",X"01",X"06",X"FF",X"1E",X"11",X"FF",X"1E",X"16", + X"FF",X"1C",X"3A",X"00",X"88",X"E6",X"01",X"28",X"02",X"1E",X"28",X"FF",X"1E",X"2A",X"3A",X"00", + X"88",X"E6",X"01",X"28",X"01",X"1D",X"FF",X"CD",X"4E",X"0F",X"21",X"26",X"0B",X"11",X"00",X"00", + X"06",X"20",X"7E",X"83",X"5F",X"30",X"01",X"14",X"23",X"10",X"F7",X"7B",X"FE",X"D3",X"00",X"00", + X"00",X"3E",X"0B",X"BA",X"00",X"00",X"00",X"C9",X"21",X"2F",X"0D",X"DD",X"21",X"A7",X"86",X"11", + X"E0",X"FF",X"06",X"0C",X"7E",X"DD",X"77",X"00",X"23",X"DD",X"19",X"10",X"F7",X"7E",X"FE",X"FF", + X"28",X"0F",X"FE",X"EE",X"C8",X"11",X"81",X"01",X"DD",X"19",X"11",X"E0",X"FF",X"06",X"0C",X"18", + X"E3",X"21",X"48",X"0D",X"DD",X"21",X"A7",X"82",X"11",X"E0",X"FF",X"06",X"0C",X"18",X"D5",X"0C", + X"0C",X"0C",X"0C",X"0C",X"0C",X"0E",X"0E",X"0C",X"0C",X"A4",X"A5",X"0D",X"0C",X"0C",X"0C",X"0C", + X"0C",X"0F",X"0F",X"3B",X"3B",X"A5",X"A4",X"FF",X"00",X"80",X"03",X"83",X"0D",X"8D",X"00",X"80", + X"05",X"85",X"00",X"C0",X"00",X"C0",X"43",X"C3",X"4D",X"CD",X"00",X"80",X"02",X"82",X"00",X"C0", + X"EE",X"3A",X"02",X"88",X"A7",X"C8",X"3D",X"11",X"18",X"06",X"28",X"01",X"1C",X"FF",X"11",X"00", + X"03",X"FF",X"3E",X"02",X"32",X"05",X"88",X"C9",X"3A",X"10",X"88",X"CB",X"5F",X"C2",X"E4",X"0D", + X"CB",X"67",X"C8",X"3A",X"02",X"88",X"FE",X"02",X"D8",X"D6",X"02",X"32",X"02",X"88",X"21",X"6B", + X"77",X"06",X"14",X"58",X"53",X"7E",X"83",X"5F",X"30",X"01",X"14",X"23",X"10",X"F7",X"7B",X"82", + X"E6",X"AB",X"28",X"04",X"21",X"EA",X"89",X"34",X"21",X"00",X"01",X"22",X"0D",X"88",X"CD",X"54", + X"0E",X"AF",X"32",X"0A",X"88",X"3E",X"03",X"32",X"05",X"88",X"3E",X"01",X"32",X"06",X"88",X"32", + X"1F",X"88",X"11",X"04",X"06",X"FF",X"CD",X"00",X"0E",X"21",X"21",X"8D",X"36",X"00",X"2C",X"36", + X"20",X"11",X"00",X"04",X"FF",X"3A",X"0E",X"88",X"0F",X"D0",X"1C",X"FF",X"AF",X"21",X"1F",X"8E", + X"06",X"0C",X"D7",X"C9",X"3A",X"02",X"88",X"A7",X"28",X"0A",X"3D",X"32",X"02",X"88",X"21",X"00", + X"00",X"C3",X"AB",X"0D",X"3A",X"0A",X"88",X"FE",X"0E",X"C8",X"3E",X"01",X"32",X"05",X"88",X"C9", + X"21",X"00",X"89",X"AF",X"32",X"0A",X"88",X"32",X"E1",X"89",X"32",X"E2",X"89",X"32",X"E3",X"89", + X"32",X"5B",X"8F",X"06",X"BF",X"D7",X"3A",X"07",X"88",X"32",X"48",X"89",X"32",X"88",X"89",X"3E", + X"20",X"32",X"41",X"89",X"32",X"81",X"89",X"3A",X"20",X"88",X"32",X"40",X"89",X"32",X"80",X"89", + X"CD",X"E3",X"02",X"3A",X"06",X"88",X"A7",X"C8",X"AF",X"32",X"3F",X"8F",X"32",X"30",X"8F",X"32", + X"0E",X"8F",X"32",X"0F",X"8F",X"C9",X"11",X"04",X"00",X"06",X"06",X"3E",X"FB",X"A6",X"77",X"19", + X"10",X"F9",X"C9",X"C9",X"11",X"01",X"07",X"FF",X"3A",X"2C",X"88",X"FE",X"0F",X"20",X"04",X"11", + X"06",X"06",X"FF",X"C9",X"11",X"41",X"8A",X"1A",X"6F",X"26",X"8A",X"7E",X"FE",X"FF",X"C8",X"47", + X"3A",X"21",X"88",X"E6",X"01",X"20",X"06",X"3A",X"06",X"88",X"A7",X"28",X"04",X"78",X"CD",X"8F", + X"0E",X"36",X"FF",X"7D",X"FE",X"5E",X"28",X"03",X"3C",X"12",X"C9",X"3E",X"43",X"12",X"C9",X"32", + X"00",X"A1",X"3E",X"01",X"32",X"81",X"A1",X"00",X"00",X"00",X"00",X"00",X"00",X"3D",X"32",X"81", + X"A1",X"C9",X"32",X"20",X"8D",X"3A",X"06",X"88",X"A7",X"20",X"05",X"3A",X"50",X"8F",X"A7",X"C8", + X"3A",X"20",X"8D",X"C5",X"D5",X"E5",X"47",X"11",X"40",X"8A",X"1A",X"6F",X"26",X"8A",X"70",X"7D", + X"FE",X"5E",X"28",X"04",X"3C",X"12",X"18",X"03",X"3E",X"43",X"12",X"E1",X"D1",X"C1",X"C9",X"AF", + X"18",X"E1",X"3E",X"01",X"18",X"CC",X"3E",X"02",X"18",X"D9",X"3E",X"82",X"CD",X"B3",X"0E",X"3E", + X"03",X"18",X"D0",X"3A",X"24",X"8F",X"A7",X"C0",X"3A",X"32",X"8D",X"A7",X"C0",X"3E",X"04",X"18", + X"B1",X"3E",X"05",X"18",X"BE",X"3E",X"06",X"18",X"A9",X"3E",X"07",X"18",X"A5",X"3E",X"08",X"18", + X"A1",X"3E",X"09",X"18",X"AE",X"3E",X"0A",X"18",X"99",X"3E",X"0B",X"18",X"82",X"3E",X"0B",X"18", + X"91",X"3E",X"0C",X"18",X"8D",X"3E",X"0D",X"18",X"89",X"3E",X"0E",X"18",X"85",X"3E",X"0F",X"18", + X"81",X"3E",X"95",X"CD",X"A2",X"0E",X"3E",X"10",X"C3",X"A2",X"0E",X"3E",X"11",X"C3",X"A2",X"0E", + X"3E",X"95",X"CD",X"A2",X"0E",X"3E",X"03",X"CD",X"A2",X"0E",X"3E",X"11",X"C3",X"A2",X"0E",X"3E", + X"12",X"C3",X"A2",X"0E",X"3E",X"13",X"C3",X"A2",X"0E",X"3E",X"14",X"C3",X"A2",X"0E",X"3E",X"82", + X"CD",X"B3",X"0E",X"3E",X"95",X"C3",X"B3",X"0E",X"3E",X"96",X"CD",X"A2",X"0E",X"3E",X"97",X"CD", + X"A2",X"0E",X"3E",X"18",X"CD",X"B3",X"0E",X"3E",X"15",X"C3",X"B3",X"0E",X"3E",X"19",X"CD",X"B3", + X"0E",X"3E",X"15",X"C3",X"B3",X"0E",X"3A",X"68",X"8D",X"B7",X"C0",X"3A",X"07",X"89",X"E6",X"01", + X"C6",X"1A",X"CD",X"A2",X"0E",X"C3",X"C3",X"0F",X"3E",X"82",X"CD",X"A2",X"0E",X"3E",X"1C",X"C3", + X"C3",X"0F",X"3E",X"1D",X"C3",X"C3",X"0F",X"3A",X"07",X"89",X"0F",X"E6",X"03",X"C6",X"1E",X"C3", + X"C3",X"0F",X"3A",X"07",X"89",X"0F",X"E6",X"03",X"C6",X"22",X"C3",X"C3",X"0F",X"3E",X"26",X"C3", + X"C3",X"0F",X"3E",X"27",X"CD",X"B3",X"0E",X"3E",X"15",X"C3",X"B3",X"0E",X"3E",X"28",X"C3",X"C3", + X"0F",X"3E",X"29",X"CD",X"A2",X"0E",X"3E",X"15",X"CD",X"A2",X"0E",X"3E",X"16",X"CD",X"A2",X"0E", + X"3E",X"17",X"C3",X"A2",X"0E",X"3A",X"5C",X"8F",X"E6",X"07",X"FE",X"02",X"38",X"04",X"21",X"35", + X"10",X"E5",X"EF",X"EF",X"0F",X"16",X"10",X"90",X"10",X"A2",X"10",X"3C",X"11",X"4F",X"11",X"3E", + X"0F",X"21",X"01",X"89",X"77",X"2E",X"07",X"CB",X"56",X"28",X"03",X"CD",X"F1",X"50",X"3E",X"01", + X"32",X"61",X"8F",X"32",X"3F",X"8F",X"32",X"5C",X"8F",X"CD",X"BC",X"0F",X"21",X"38",X"8A",X"7E", + X"23",X"B7",X"C8",X"32",X"5C",X"8F",X"CD",X"83",X"15",X"CD",X"42",X"10",X"CD",X"7D",X"10",X"CD", + X"D4",X"20",X"CD",X"1B",X"51",X"CD",X"19",X"12",X"CD",X"BD",X"40",X"CD",X"EF",X"02",X"CD",X"E4", + X"5A",X"CD",X"64",X"0E",X"C9",X"CD",X"57",X"21",X"CD",X"19",X"12",X"CD",X"BD",X"40",X"CD",X"EF", + X"02",X"C9",X"3E",X"01",X"32",X"3F",X"8F",X"DD",X"21",X"80",X"8A",X"FD",X"21",X"90",X"8C",X"DD", + X"7E",X"02",X"A7",X"20",X"23",X"3A",X"24",X"8F",X"21",X"57",X"8F",X"B6",X"20",X"1A",X"3A",X"1F", + X"88",X"A7",X"3A",X"A0",X"A0",X"20",X"03",X"3A",X"C0",X"A0",X"2F",X"DD",X"77",X"07",X"DD",X"7E", + X"1E",X"A7",X"C0",X"DD",X"CB",X"07",X"A6",X"C9",X"DD",X"36",X"07",X"00",X"C9",X"3A",X"01",X"89", + X"A7",X"C0",X"21",X"5C",X"8F",X"34",X"11",X"35",X"06",X"FF",X"3E",X"40",X"32",X"62",X"8F",X"C9", + X"21",X"62",X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"21",X"5C",X"8F",X"34",X"11",X"34",X"06", + X"FF",X"C9",X"3A",X"5D",X"8F",X"FE",X"0A",X"38",X"04",X"47",X"CD",X"31",X"11",X"21",X"50",X"86", + X"CD",X"19",X"11",X"3A",X"5D",X"8F",X"A7",X"28",X"26",X"FE",X"0C",X"30",X"22",X"D6",X"07",X"06", + X"05",X"28",X"0D",X"30",X"06",X"04",X"3C",X"20",X"FC",X"18",X"05",X"05",X"3D",X"20",X"FC",X"78", + X"78",X"32",X"62",X"8F",X"CB",X"20",X"CD",X"31",X"11",X"21",X"D0",X"85",X"CD",X"19",X"11",X"3A", + X"5E",X"8F",X"FE",X"0A",X"38",X"04",X"47",X"CD",X"31",X"11",X"21",X"52",X"86",X"CD",X"19",X"11", + X"21",X"60",X"8F",X"7E",X"A7",X"28",X"1A",X"47",X"2E",X"62",X"86",X"77",X"CB",X"20",X"CD",X"31", + X"11",X"5F",X"79",X"A7",X"28",X"04",X"79",X"32",X"F2",X"85",X"21",X"D2",X"85",X"7B",X"CD",X"19", + X"11",X"21",X"5C",X"8F",X"34",X"CD",X"44",X"0F",X"C9",X"01",X"E0",X"FF",X"5F",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"A7",X"20",X"02",X"3E",X"10",X"77",X"09",X"7B",X"E6",X"0F",X"77", + X"C9",X"AF",X"4F",X"C6",X"01",X"27",X"30",X"01",X"0C",X"10",X"F8",X"C9",X"21",X"62",X"8F",X"7E", + X"A7",X"28",X"06",X"35",X"11",X"15",X"03",X"FF",X"C9",X"36",X"80",X"2E",X"5C",X"34",X"C9",X"21", + X"62",X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"AF",X"2E",X"5B",X"06",X"09",X"D7",X"CD",X"CF", + X"0E",X"3E",X"06",X"32",X"0A",X"88",X"21",X"3C",X"8A",X"3A",X"2B",X"88",X"86",X"A7",X"C8",X"18", + X"1C",X"21",X"07",X"8D",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"3A",X"01",X"89",X"2E",X"40",X"96", + X"C8",X"D8",X"4F",X"7E",X"FE",X"06",X"D0",X"DD",X"21",X"E0",X"8A",X"06",X"06",X"1E",X"1D",X"CD", + X"9A",X"11",X"11",X"18",X"00",X"DD",X"19",X"10",X"F4",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01", + X"0F",X"D8",X"41",X"DD",X"36",X"00",X"01",X"DD",X"36",X"02",X"03",X"DD",X"73",X"04",X"AF",X"DD", + X"77",X"03",X"DD",X"77",X"05",X"DD",X"77",X"06",X"DD",X"77",X"08",X"DD",X"36",X"07",X"01",X"DD", + X"77",X"0B",X"21",X"09",X"12",X"3A",X"07",X"89",X"E6",X"3F",X"CB",X"3F",X"CB",X"3F",X"FE",X"10", + X"E7",X"DD",X"77",X"09",X"ED",X"44",X"DD",X"77",X"0A",X"11",X"29",X"38",X"CD",X"1E",X"38",X"21", + X"F9",X"11",X"3A",X"07",X"89",X"E6",X"3F",X"CB",X"2F",X"CB",X"2F",X"E7",X"32",X"07",X"8D",X"21", + X"5F",X"8F",X"34",X"21",X"40",X"8D",X"34",X"F1",X"C9",X"50",X"4C",X"48",X"44",X"40",X"3C",X"38", + X"30",X"2E",X"2C",X"2A",X"28",X"26",X"24",X"24",X"22",X"14",X"14",X"16",X"16",X"18",X"18",X"1A", + X"1A",X"1B",X"1B",X"1C",X"1C",X"1D",X"1D",X"1E",X"1E",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00", + X"06",X"0E",X"D9",X"CD",X"2C",X"12",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD", + X"B6",X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"E6",X"1F",X"FE",X"11",X"D0",X"EF",X"5F",X"12",X"70", + X"12",X"36",X"35",X"AF",X"12",X"65",X"38",X"96",X"14",X"E3",X"3B",X"92",X"3C",X"DC",X"14",X"18", + X"15",X"4D",X"15",X"69",X"3E",X"9C",X"3E",X"5C",X"3F",X"72",X"3F",X"7C",X"3F",X"E9",X"3F",X"DD", + X"35",X"11",X"C0",X"DD",X"34",X"02",X"11",X"38",X"38",X"DD",X"36",X"08",X"01",X"C3",X"1E",X"38", + X"CD",X"06",X"40",X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"05",X"B8",X"30",X"03",X"DD", + X"35",X"06",X"DD",X"86",X"0A",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"A7",X"C0",X"CD",X"53",X"35", + X"21",X"40",X"8D",X"35",X"21",X"01",X"89",X"7E",X"4F",X"A7",X"28",X"01",X"35",X"3A",X"0A",X"88", + X"FE",X"04",X"20",X"02",X"2C",X"34",X"79",X"3D",X"FE",X"0A",X"D0",X"32",X"43",X"87",X"C9",X"CD", + X"06",X"40",X"DD",X"7E",X"08",X"A7",X"C2",X"FE",X"13",X"DD",X"7E",X"05",X"DD",X"86",X"09",X"30", + X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"47",X"3A",X"01",X"89",X"FE",X"03",X"DA",X"99",X"13", + X"21",X"FB",X"12",X"3A",X"07",X"89",X"E6",X"1F",X"CB",X"3F",X"CB",X"3F",X"CD",X"45",X"0C",X"EB", + X"3A",X"41",X"8D",X"E6",X"0F",X"E7",X"4F",X"DD",X"7E",X"06",X"B9",X"CA",X"83",X"13",X"FE",X"14", + X"D8",X"DD",X"36",X"08",X"01",X"11",X"38",X"38",X"C3",X"1E",X"38",X"0B",X"13",X"1A",X"13",X"29", + X"13",X"38",X"13",X"47",X"13",X"56",X"13",X"65",X"13",X"74",X"13",X"11",X"0D",X"09",X"0D",X"09", + X"12",X"0E",X"0B",X"09",X"0D",X"09",X"09",X"11",X"0D",X"09",X"0D",X"09",X"11",X"0D",X"09",X"09", + X"12",X"10",X"09",X"0D",X"09",X"11",X"0D",X"09",X"09",X"11",X"0D",X"11",X"0D",X"09",X"11",X"0F", + X"0D",X"09",X"12",X"0D",X"10",X"09",X"0D",X"09",X"09",X"09",X"09",X"11",X"0C",X"08",X"0D",X"09", + X"11",X"0E",X"0B",X"08",X"11",X"0D",X"09",X"11",X"0D",X"09",X"0D",X"11",X"0D",X"09",X"0D",X"11", + X"0D",X"09",X"0D",X"11",X"0D",X"09",X"11",X"0D",X"09",X"09",X"11",X"0D",X"0D",X"09",X"12",X"11", + X"0D",X"09",X"11",X"0D",X"09",X"0D",X"09",X"0B",X"08",X"11",X"12",X"0D",X"11",X"0D",X"10",X"09", + X"10",X"11",X"0D",X"09",X"11",X"0D",X"0B",X"09",X"12",X"10",X"0D",X"0C",X"09",X"0B",X"10",X"0C", + X"11",X"0D",X"18",X"78",X"FE",X"20",X"D0",X"18",X"33",X"DD",X"CB",X"08",X"46",X"C8",X"C3",X"1C", + X"14",X"DD",X"CB",X"08",X"46",X"C0",X"C3",X"D0",X"12",X"DD",X"7E",X"06",X"FE",X"07",X"38",X"E9", + X"FE",X"14",X"30",X"ED",X"21",X"6B",X"8D",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"78",X"FE",X"80", + X"D0",X"EB",X"21",X"D3",X"13",X"3A",X"07",X"89",X"E6",X"07",X"E7",X"12",X"FD",X"21",X"70",X"8B", + X"11",X"18",X"00",X"06",X"05",X"FD",X"7E",X"00",X"FD",X"B6",X"01",X"0F",X"30",X"0D",X"FD",X"19", + X"10",X"F3",X"C9",X"28",X"28",X"20",X"20",X"18",X"18",X"10",X"10",X"21",X"41",X"8D",X"34",X"20", + X"01",X"34",X"4E",X"DD",X"71",X"14",X"21",X"88",X"39",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD", + X"36",X"0E",X"00",X"DD",X"36",X"11",X"28",X"DD",X"36",X"02",X"04",X"C3",X"2C",X"14",X"DD",X"7E", + X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"05",X"B8",X"30",X"03",X"DD",X"35",X"06",X"DD",X"86",X"0A", + X"DD",X"77",X"05",X"47",X"3A",X"01",X"89",X"FE",X"03",X"DA",X"99",X"13",X"DD",X"7E",X"06",X"FE", + X"02",X"D0",X"DD",X"36",X"08",X"00",X"11",X"29",X"38",X"C3",X"1E",X"38",X"FD",X"36",X"00",X"01", + X"FD",X"36",X"02",X"04",X"FD",X"71",X"14",X"AF",X"FD",X"77",X"07",X"FD",X"77",X"0E",X"DD",X"7E", + X"05",X"C6",X"80",X"FD",X"77",X"05",X"DD",X"7E",X"03",X"C6",X"80",X"FD",X"77",X"03",X"DD",X"7E", + X"04",X"D6",X"01",X"FD",X"77",X"04",X"DD",X"7E",X"06",X"C6",X"01",X"FD",X"77",X"06",X"3A",X"00", + X"89",X"FE",X"08",X"38",X"02",X"3E",X"07",X"21",X"8E",X"14",X"E7",X"3A",X"07",X"89",X"E6",X"01", + X"7E",X"28",X"02",X"ED",X"44",X"FD",X"77",X"0A",X"DD",X"77",X"0A",X"11",X"CB",X"38",X"FD",X"77", + X"0B",X"FD",X"73",X"0C",X"FD",X"72",X"0D",X"FD",X"36",X"11",X"28",X"C3",X"E3",X"0E",X"10",X"11", + X"12",X"13",X"14",X"15",X"16",X"17",X"CD",X"06",X"40",X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD", + X"7E",X"03",X"B8",X"30",X"03",X"DD",X"35",X"04",X"DD",X"86",X"0A",X"DD",X"77",X"03",X"DD",X"46", + X"04",X"DD",X"7E",X"07",X"A7",X"28",X"12",X"78",X"FE",X"04",X"38",X"04",X"DD",X"7E",X"06",X"C9", + X"DD",X"36",X"02",X"00",X"DD",X"36",X"11",X"20",X"C9",X"78",X"FE",X"02",X"D0",X"11",X"D1",X"3B", + X"CD",X"1E",X"38",X"DD",X"36",X"02",X"02",X"DD",X"36",X"11",X"28",X"C9",X"06",X"01",X"DD",X"4E", + X"17",X"3A",X"45",X"8D",X"A7",X"28",X"21",X"DD",X"4E",X"12",X"0C",X"28",X"1B",X"FE",X"05",X"38", + X"02",X"3E",X"04",X"47",X"05",X"48",X"28",X"06",X"3E",X"01",X"CB",X"27",X"10",X"FC",X"21",X"60", + X"8F",X"86",X"77",X"2E",X"5E",X"34",X"06",X"38",X"DD",X"70",X"11",X"79",X"21",X"57",X"15",X"CD", + X"45",X"0C",X"CD",X"1E",X"38",X"DD",X"34",X"02",X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"3A", + X"60",X"8F",X"CB",X"27",X"47",X"A7",X"28",X"12",X"CD",X"31",X"11",X"5F",X"79",X"A7",X"28",X"03", + X"32",X"E9",X"85",X"21",X"C9",X"85",X"7B",X"CD",X"19",X"11",X"DD",X"7E",X"16",X"FE",X"07",X"CA", + X"99",X"3D",X"3C",X"DD",X"77",X"13",X"DD",X"36",X"11",X"01",X"DD",X"34",X"02",X"CD",X"06",X"40", + X"DD",X"35",X"11",X"C0",X"C3",X"53",X"35",X"5F",X"15",X"68",X"15",X"71",X"15",X"7A",X"15",X"80", + X"01",X"05",X"40",X"1D",X"05",X"42",X"37",X"28",X"80",X"01",X"05",X"40",X"1D",X"05",X"43",X"39", + X"28",X"80",X"01",X"04",X"40",X"1D",X"04",X"42",X"39",X"28",X"80",X"01",X"03",X"40",X"1D",X"03", + X"4F",X"3A",X"38",X"21",X"4D",X"8F",X"34",X"7E",X"47",X"E6",X"0F",X"C0",X"CB",X"60",X"11",X"35", + X"06",X"28",X"02",X"1E",X"B5",X"FF",X"3A",X"EF",X"89",X"A7",X"C8",X"CD",X"12",X"79",X"21",X"D1", + X"15",X"E5",X"3A",X"0A",X"88",X"E6",X"1F",X"EF",X"01",X"16",X"B7",X"16",X"5D",X"17",X"C1",X"17", + X"AF",X"18",X"EE",X"19",X"01",X"1A",X"64",X"1A",X"43",X"1B",X"8C",X"1B",X"AB",X"1B",X"CC",X"1B", + X"03",X"1C",X"53",X"1C",X"66",X"1C",X"9C",X"1D",X"6E",X"1D",X"B2",X"6B",X"B9",X"71",X"FF",X"FF", + X"FF",X"3A",X"06",X"88",X"A7",X"C0",X"3A",X"2C",X"88",X"FE",X"0F",X"CA",X"B5",X"0B",X"3A",X"02", + X"88",X"A7",X"C8",X"21",X"05",X"88",X"36",X"02",X"2E",X"0A",X"36",X"00",X"CD",X"27",X"25",X"CD", + X"B9",X"02",X"21",X"5F",X"85",X"11",X"E0",X"FF",X"06",X"08",X"3E",X"10",X"77",X"19",X"10",X"FA", + X"C9",X"CD",X"C9",X"02",X"C0",X"CD",X"E3",X"02",X"CD",X"BC",X"19",X"AF",X"32",X"21",X"8D",X"21", + X"23",X"8D",X"06",X"C0",X"D7",X"21",X"21",X"8E",X"06",X"0C",X"D7",X"32",X"16",X"8F",X"32",X"17", + X"8F",X"3A",X"0E",X"88",X"A7",X"3E",X"02",X"28",X"2A",X"3A",X"E3",X"89",X"A7",X"20",X"24",X"3C", + X"32",X"E3",X"89",X"3A",X"0F",X"88",X"A7",X"3A",X"0D",X"88",X"20",X"06",X"3D",X"32",X"1F",X"88", + X"18",X"01",X"3D",X"11",X"02",X"06",X"A7",X"20",X"01",X"1C",X"FF",X"01",X"79",X"07",X"CD",X"5D", + X"07",X"3E",X"80",X"32",X"08",X"88",X"21",X"0A",X"88",X"34",X"3A",X"0D",X"88",X"21",X"40",X"89", + X"11",X"00",X"89",X"01",X"3F",X"00",X"A7",X"28",X"03",X"21",X"80",X"89",X"ED",X"B0",X"3A",X"03", + X"89",X"A7",X"28",X"05",X"D6",X"02",X"32",X"31",X"89",X"3A",X"06",X"89",X"A7",X"C0",X"32",X"05", + X"89",X"32",X"0A",X"89",X"11",X"AE",X"16",X"21",X"F0",X"89",X"1A",X"FE",X"FF",X"C8",X"77",X"13", + X"23",X"18",X"F7",X"C9",X"11",X"AE",X"16",X"21",X"F0",X"89",X"1A",X"FE",X"FF",X"28",X"07",X"BE", + X"20",X"15",X"13",X"23",X"18",X"F4",X"21",X"F0",X"89",X"AF",X"06",X"07",X"D7",X"C9",X"0A",X"10", + X"1B",X"1F",X"1E",X"11",X"1D",X"19",X"FF",X"21",X"08",X"88",X"35",X"C0",X"CD",X"E3",X"02",X"CD", + X"D3",X"1D",X"3A",X"50",X"8F",X"E6",X"01",X"28",X"06",X"3E",X"10",X"32",X"0A",X"88",X"C9",X"AF", + X"32",X"B7",X"88",X"CD",X"C2",X"03",X"3A",X"50",X"8F",X"A7",X"28",X"17",X"3A",X"07",X"89",X"CB", + X"4F",X"20",X"08",X"21",X"81",X"4E",X"11",X"39",X"50",X"18",X"3D",X"21",X"92",X"4C",X"11",X"CE", + X"4D",X"18",X"35",X"3A",X"04",X"89",X"A7",X"20",X"1C",X"3A",X"06",X"88",X"A7",X"28",X"16",X"3A", + X"07",X"89",X"CB",X"47",X"21",X"2C",X"46",X"11",X"30",X"4B",X"20",X"1C",X"A7",X"21",X"A9",X"44", + X"11",X"55",X"4B",X"28",X"13",X"3A",X"07",X"89",X"CB",X"47",X"21",X"D6",X"46",X"11",X"50",X"4A", + X"28",X"06",X"21",X"72",X"48",X"11",X"F6",X"4B",X"ED",X"53",X"45",X"8F",X"22",X"BA",X"88",X"21", + X"42",X"84",X"22",X"B8",X"88",X"21",X"42",X"80",X"22",X"43",X"8F",X"3E",X"20",X"32",X"07",X"8D", + X"21",X"0A",X"88",X"34",X"11",X"83",X"06",X"FF",X"CD",X"94",X"16",X"C9",X"FF",X"FF",X"E0",X"B0", + X"80",X"40",X"20",X"00",X"04",X"08",X"8D",X"8F",X"0F",X"88",X"8E",X"8C",X"5A",X"CD",X"81",X"43", + X"21",X"B7",X"88",X"34",X"7E",X"FE",X"1C",X"C0",X"36",X"00",X"21",X"20",X"89",X"7E",X"34",X"A7", + X"C8",X"AF",X"77",X"3A",X"50",X"8F",X"A7",X"20",X"42",X"3A",X"04",X"89",X"A7",X"20",X"22",X"3A", + X"06",X"88",X"A7",X"28",X"13",X"3A",X"07",X"89",X"CB",X"47",X"20",X"06",X"3A",X"07",X"89",X"A7", + X"20",X"06",X"3E",X"0D",X"32",X"0A",X"88",X"C9",X"3E",X"01",X"32",X"04",X"89",X"3C",X"32",X"03", + X"89",X"CD",X"AD",X"1E",X"CD",X"65",X"20",X"CD",X"0B",X"4A",X"3E",X"10",X"32",X"91",X"8A",X"32", + X"06",X"8F",X"32",X"09",X"8F",X"CD",X"0D",X"54",X"CD",X"EF",X"02",X"21",X"0A",X"88",X"36",X"03", + X"C9",X"DD",X"21",X"80",X"8A",X"3A",X"50",X"8F",X"A7",X"11",X"F6",X"84",X"20",X"0A",X"3A",X"07", + X"89",X"CB",X"47",X"21",X"2C",X"1E",X"20",X"05",X"21",X"34",X"1E",X"1E",X"E9",X"ED",X"53",X"BE", + X"88",X"11",X"18",X"00",X"06",X"04",X"DD",X"36",X"00",X"01",X"7E",X"DD",X"77",X"04",X"23",X"7E", + X"DD",X"77",X"06",X"23",X"DD",X"19",X"10",X"EE",X"DD",X"21",X"80",X"8A",X"3A",X"1F",X"88",X"A7", + X"20",X"06",X"DD",X"35",X"06",X"DD",X"35",X"06",X"21",X"C9",X"26",X"22",X"00",X"8F",X"CD",X"B1", + X"22",X"3A",X"50",X"8F",X"A7",X"20",X"31",X"3A",X"06",X"88",X"A7",X"20",X"0C",X"3A",X"3F",X"8F", + X"A7",X"28",X"06",X"21",X"0A",X"88",X"36",X"12",X"C9",X"21",X"0A",X"88",X"34",X"11",X"3F",X"18", + X"21",X"F0",X"89",X"1A",X"FE",X"43",X"C8",X"D6",X"88",X"77",X"13",X"23",X"18",X"F5",X"C9",X"92", + X"98",X"A3",X"A7",X"A6",X"99",X"A5",X"A1",X"43",X"3A",X"07",X"89",X"CB",X"4F",X"28",X"5A",X"3A", + X"07",X"89",X"CB",X"3F",X"FE",X"07",X"38",X"06",X"3E",X"08",X"06",X"03",X"18",X"07",X"CB",X"3F", + X"E6",X"03",X"47",X"C6",X"05",X"32",X"47",X"8F",X"78",X"21",X"EB",X"70",X"CD",X"45",X"0C",X"EB", + X"DD",X"21",X"E0",X"8A",X"3A",X"47",X"8F",X"47",X"0E",X"00",X"DD",X"36",X"05",X"80",X"DD",X"36", + X"00",X"01",X"DD",X"36",X"06",X"04",X"DD",X"74",X"04",X"7D",X"E6",X"0F",X"84",X"67",X"7D",X"E6", + X"F0",X"81",X"4F",X"DD",X"77",X"03",X"30",X"04",X"DD",X"34",X"04",X"24",X"11",X"29",X"38",X"CD", + X"1E",X"38",X"11",X"18",X"00",X"DD",X"19",X"10",X"D1",X"21",X"0A",X"88",X"36",X"0F",X"C9",X"CD", + X"55",X"1E",X"CD",X"AB",X"6C",X"CD",X"D4",X"20",X"CD",X"1B",X"51",X"CD",X"77",X"33",X"CD",X"BD", + X"40",X"CD",X"EF",X"02",X"CD",X"DA",X"18",X"CD",X"1C",X"19",X"CD",X"E4",X"5A",X"CD",X"6E",X"19", + X"CD",X"2F",X"1F",X"CD",X"3B",X"6B",X"CD",X"CA",X"19",X"C9",X"3A",X"09",X"89",X"A7",X"28",X"2E", + X"4F",X"3A",X"0D",X"88",X"21",X"A4",X"88",X"A7",X"28",X"03",X"21",X"A7",X"88",X"7E",X"B9",X"C0", + X"21",X"08",X"89",X"7E",X"FE",X"FF",X"30",X"01",X"34",X"3A",X"00",X"88",X"A7",X"3E",X"08",X"28", + X"01",X"3D",X"81",X"27",X"32",X"09",X"89",X"CD",X"C2",X"03",X"CD",X"0D",X"0F",X"C9",X"3A",X"00", + X"88",X"A7",X"3E",X"05",X"28",X"02",X"3E",X"03",X"32",X"09",X"89",X"C9",X"3A",X"01",X"89",X"A7", + X"C0",X"3A",X"82",X"8A",X"A7",X"C0",X"21",X"E2",X"8A",X"11",X"18",X"00",X"06",X"06",X"3E",X"03", + X"BE",X"C8",X"19",X"10",X"FB",X"21",X"0A",X"88",X"34",X"3A",X"07",X"89",X"CB",X"47",X"20",X"15", + X"CB",X"3F",X"47",X"3A",X"20",X"88",X"80",X"47",X"3A",X"03",X"89",X"80",X"47",X"FE",X"20",X"38", + X"02",X"3E",X"1F",X"18",X"0B",X"47",X"3A",X"20",X"88",X"80",X"FE",X"20",X"38",X"02",X"3E",X"1F", + X"32",X"00",X"89",X"AF",X"32",X"87",X"8A",X"32",X"05",X"89",X"32",X"06",X"89",X"C9",X"3A",X"55", + X"8D",X"A7",X"C0",X"3A",X"02",X"89",X"FE",X"05",X"38",X"26",X"28",X"0E",X"32",X"55",X"8D",X"3A", + X"32",X"8D",X"A7",X"20",X"03",X"CD",X"6C",X"0F",X"18",X"16",X"3A",X"32",X"8D",X"A7",X"20",X"03", + X"21",X"68",X"8D",X"7E",X"A7",X"20",X"09",X"36",X"01",X"2C",X"2C",X"36",X"01",X"CD",X"58",X"0F", + X"3A",X"21",X"8D",X"A7",X"C0",X"3A",X"24",X"8F",X"A7",X"C0",X"21",X"22",X"8D",X"7E",X"A7",X"28", + X"02",X"35",X"C9",X"36",X"20",X"2D",X"36",X"01",X"CD",X"76",X"0F",X"C9",X"21",X"80",X"8A",X"11", + X"81",X"8A",X"01",X"FF",X"01",X"36",X"00",X"ED",X"B0",X"C9",X"3A",X"06",X"88",X"A7",X"C0",X"3A", + X"68",X"8D",X"A7",X"C8",X"21",X"6A",X"8D",X"35",X"C0",X"36",X"18",X"2D",X"CB",X"46",X"20",X"07", + X"36",X"01",X"11",X"0F",X"06",X"FF",X"C9",X"36",X"00",X"11",X"8F",X"06",X"FF",X"C9",X"CD",X"8B", + X"30",X"CD",X"A6",X"25",X"CD",X"77",X"33",X"CD",X"BD",X"40",X"CD",X"C6",X"28",X"CD",X"EF",X"02", + X"C9",X"CD",X"27",X"25",X"32",X"02",X"89",X"32",X"34",X"89",X"0E",X"30",X"3A",X"07",X"89",X"FE", + X"02",X"30",X"02",X"0E",X"28",X"21",X"01",X"89",X"71",X"2E",X"07",X"34",X"7E",X"E6",X"01",X"20", + X"26",X"3A",X"06",X"88",X"A7",X"CA",X"3C",X"1D",X"3A",X"50",X"8F",X"A7",X"20",X"10",X"35",X"3E", + X"01",X"32",X"50",X"8F",X"32",X"01",X"89",X"3E",X"40",X"32",X"4A",X"8F",X"18",X"09",X"AF",X"21", + X"45",X"8F",X"06",X"10",X"D7",X"26",X"81",X"2E",X"04",X"36",X"00",X"11",X"40",X"89",X"21",X"00", + X"89",X"01",X"3F",X"00",X"3A",X"0D",X"88",X"A7",X"28",X"03",X"11",X"80",X"89",X"ED",X"B0",X"AF", + X"32",X"0A",X"88",X"C9",X"3A",X"50",X"8F",X"A7",X"20",X"97",X"CD",X"4E",X"0F",X"CD",X"27",X"25", + X"AF",X"32",X"E3",X"89",X"3A",X"06",X"88",X"A7",X"CA",X"3C",X"1D",X"21",X"08",X"89",X"7E",X"A7", + X"28",X"14",X"35",X"28",X"11",X"CD",X"C2",X"03",X"0E",X"0A",X"3A",X"0D",X"88",X"A7",X"28",X"01", + X"0C",X"79",X"32",X"0A",X"88",X"C9",X"CD",X"92",X"0F",X"21",X"0A",X"88",X"3A",X"0D",X"88",X"A7", + X"28",X"01",X"34",X"34",X"AF",X"32",X"FC",X"89",X"32",X"31",X"89",X"32",X"32",X"89",X"CD",X"B2", + X"1A",X"C9",X"01",X"1E",X"00",X"68",X"11",X"03",X"00",X"DD",X"21",X"A2",X"88",X"3A",X"0D",X"88", + X"0F",X"30",X"02",X"DD",X"19",X"FD",X"21",X"00",X"8A",X"DD",X"7E",X"02",X"FD",X"BE",X"02",X"20", + X"0E",X"DD",X"7E",X"01",X"FD",X"BE",X"01",X"20",X"06",X"DD",X"7E",X"00",X"FD",X"BE",X"00",X"30", + X"09",X"FD",X"19",X"2C",X"0D",X"0D",X"0D",X"C8",X"18",X"DF",X"7D",X"3C",X"32",X"FC",X"89",X"3D", + X"C5",X"21",X"1D",X"8A",X"11",X"20",X"8A",X"ED",X"B8",X"6F",X"DD",X"7E",X"00",X"FD",X"77",X"00", + X"DD",X"7E",X"01",X"FD",X"77",X"01",X"DD",X"7E",X"02",X"FD",X"77",X"02",X"C1",X"C5",X"DD",X"21", + X"30",X"8A",X"21",X"E1",X"89",X"3A",X"0D",X"88",X"A7",X"28",X"05",X"DD",X"21",X"33",X"8A",X"23", + X"36",X"01",X"2E",X"DD",X"11",X"E0",X"89",X"ED",X"B8",X"DD",X"7E",X"02",X"12",X"1B",X"DD",X"7E", + X"01",X"12",X"C1",X"21",X"1C",X"8E",X"11",X"1F",X"8E",X"ED",X"B8",X"EB",X"2B",X"3E",X"10",X"06", + X"03",X"D7",X"C9",X"CD",X"C9",X"02",X"C0",X"CD",X"E3",X"02",X"01",X"19",X"08",X"CD",X"5D",X"07", + X"11",X"00",X"06",X"FF",X"1E",X"02",X"FF",X"CD",X"60",X"79",X"3E",X"0C",X"32",X"0A",X"88",X"AF", + X"32",X"08",X"88",X"11",X"93",X"55",X"01",X"00",X"22",X"1A",X"E6",X"37",X"0F",X"89",X"4F",X"13", + X"10",X"F7",X"FE",X"7C",X"28",X"04",X"21",X"1E",X"88",X"34",X"11",X"F2",X"1F",X"21",X"F0",X"89", + X"1A",X"FE",X"A0",X"C8",X"C6",X"08",X"77",X"13",X"23",X"18",X"F5",X"C9",X"CD",X"C9",X"02",X"C0", + X"01",X"19",X"08",X"CD",X"5D",X"07",X"11",X"00",X"06",X"FF",X"1E",X"03",X"FF",X"CD",X"60",X"79", + X"3E",X"0C",X"32",X"0A",X"88",X"3E",X"60",X"32",X"08",X"88",X"C9",X"3A",X"0E",X"88",X"A7",X"28", + X"0B",X"3A",X"88",X"89",X"A7",X"28",X"05",X"3E",X"01",X"32",X"0D",X"88",X"11",X"40",X"89",X"21", + X"00",X"89",X"01",X"3F",X"00",X"ED",X"B0",X"AF",X"32",X"0A",X"88",X"C9",X"3A",X"48",X"89",X"A7", + X"28",X"04",X"AF",X"32",X"0D",X"88",X"11",X"80",X"89",X"21",X"00",X"89",X"01",X"3F",X"00",X"ED", + X"B0",X"AF",X"32",X"0A",X"88",X"21",X"28",X"53",X"06",X"0E",X"7E",X"E6",X"1F",X"83",X"5F",X"30", + X"01",X"14",X"23",X"10",X"F5",X"3E",X"60",X"BB",X"20",X"04",X"3E",X"8A",X"92",X"C8",X"21",X"38", + X"8A",X"34",X"C9",X"21",X"08",X"88",X"35",X"C0",X"3E",X"82",X"CD",X"B2",X"05",X"3E",X"80",X"CD", + X"B2",X"05",X"3E",X"89",X"CD",X"B2",X"05",X"01",X"D9",X"07",X"CD",X"5D",X"07",X"CD",X"E9",X"03", + X"11",X"11",X"06",X"FF",X"21",X"0A",X"88",X"36",X"0E",X"3A",X"FC",X"89",X"A7",X"C8",X"21",X"45", + X"80",X"47",X"2C",X"2C",X"10",X"FC",X"22",X"FD",X"89",X"CD",X"C1",X"0F",X"21",X"FF",X"89",X"36", + X"07",X"11",X"54",X"17",X"21",X"F0",X"89",X"1A",X"FE",X"5A",X"C8",X"CB",X"17",X"77",X"13",X"23", + X"18",X"F5",X"C9",X"3A",X"07",X"89",X"E6",X"01",X"20",X"05",X"CD",X"E2",X"64",X"18",X"03",X"CD", + X"F8",X"68",X"CD",X"EF",X"02",X"C9",X"21",X"08",X"88",X"35",X"3A",X"2A",X"8E",X"A7",X"28",X"04", + X"7E",X"A7",X"28",X"28",X"CD",X"94",X"7E",X"3A",X"FC",X"89",X"A7",X"C8",X"3A",X"08",X"88",X"E6", + X"07",X"C0",X"3A",X"FF",X"89",X"2A",X"FD",X"89",X"11",X"20",X"00",X"06",X"1C",X"77",X"19",X"10", + X"FC",X"3C",X"FE",X"10",X"38",X"02",X"3E",X"06",X"32",X"FF",X"89",X"C9",X"21",X"5F",X"85",X"11", + X"E0",X"FF",X"06",X"08",X"3E",X"10",X"77",X"19",X"10",X"FA",X"21",X"BC",X"82",X"11",X"E0",X"FF", + X"01",X"00",X"0A",X"7E",X"81",X"4F",X"19",X"10",X"FA",X"79",X"FE",X"AA",X"C0",X"AF",X"32",X"2A", + X"8E",X"3A",X"0E",X"88",X"A7",X"28",X"4E",X"3A",X"0D",X"88",X"A7",X"28",X"29",X"3A",X"48",X"89", + X"A7",X"28",X"42",X"AF",X"32",X"0D",X"88",X"32",X"0A",X"88",X"21",X"80",X"89",X"06",X"3F",X"D7", + X"3C",X"32",X"1F",X"88",X"CD",X"E3",X"02",X"21",X"E0",X"84",X"36",X"02",X"11",X"E0",X"FF",X"19", + X"36",X"25",X"19",X"36",X"20",X"C9",X"3A",X"88",X"89",X"A7",X"28",X"19",X"AF",X"32",X"0A",X"88", + X"21",X"40",X"89",X"06",X"3F",X"D7",X"3C",X"32",X"0D",X"88",X"CD",X"E3",X"02",X"21",X"40",X"87", + X"36",X"01",X"18",X"D8",X"C9",X"AF",X"21",X"00",X"89",X"06",X"BF",X"D7",X"3A",X"0E",X"88",X"A7", + X"CC",X"0D",X"1D",X"C4",X"E7",X"1C",X"3A",X"02",X"88",X"A7",X"28",X"10",X"AF",X"32",X"06",X"88", + X"32",X"0A",X"88",X"3C",X"32",X"1F",X"88",X"3C",X"32",X"05",X"88",X"C9",X"AF",X"32",X"06",X"88", + X"32",X"0A",X"88",X"32",X"0D",X"88",X"32",X"0E",X"88",X"32",X"51",X"8E",X"3C",X"32",X"05",X"88", + X"32",X"1F",X"88",X"32",X"3F",X"8F",X"CD",X"B9",X"02",X"CD",X"CF",X"0E",X"11",X"4C",X"1E",X"21", + X"F0",X"89",X"1A",X"FE",X"7F",X"C8",X"CB",X"3F",X"77",X"13",X"23",X"18",X"F5",X"C9",X"21",X"4A", + X"8F",X"7E",X"35",X"FE",X"40",X"20",X"0B",X"CD",X"E9",X"79",X"11",X"26",X"06",X"FF",X"CD",X"44", + X"0F",X"C9",X"A7",X"C0",X"32",X"0A",X"88",X"2E",X"50",X"36",X"02",X"21",X"07",X"8D",X"36",X"40", + X"3A",X"07",X"89",X"CB",X"4F",X"C0",X"3E",X"01",X"32",X"61",X"8F",X"C9",X"3A",X"07",X"89",X"CB", + X"4F",X"20",X"04",X"CD",X"D5",X"0F",X"C9",X"CD",X"A6",X"6D",X"21",X"4C",X"58",X"7D",X"D6",X"24", + X"6F",X"24",X"24",X"01",X"20",X"20",X"AF",X"CB",X"46",X"28",X"01",X"3C",X"CB",X"5E",X"20",X"01", + X"3C",X"10",X"F4",X"B9",X"C8",X"3E",X"01",X"32",X"E7",X"89",X"C9",X"10",X"12",X"14",X"18",X"1A", + X"1C",X"1E",X"20",X"3A",X"04",X"89",X"A7",X"21",X"07",X"89",X"20",X"0F",X"3A",X"06",X"88",X"A7", + X"28",X"09",X"7E",X"CB",X"47",X"20",X"2A",X"7E",X"A7",X"28",X"26",X"7E",X"E6",X"01",X"01",X"39", + X"08",X"20",X"03",X"01",X"79",X"08",X"CD",X"5D",X"07",X"3E",X"0F",X"21",X"45",X"80",X"11",X"20", + X"00",X"06",X"04",X"77",X"19",X"10",X"FC",X"21",X"46",X"80",X"06",X"04",X"77",X"19",X"10",X"FC", + X"C9",X"3A",X"50",X"8F",X"A7",X"20",X"D4",X"01",X"59",X"08",X"CD",X"5D",X"07",X"21",X"1C",X"81", + X"11",X"20",X"00",X"06",X"10",X"3E",X"09",X"77",X"19",X"10",X"FC",X"C9",X"C0",X"B0",X"BA",X"00", + X"B0",X"C0",X"C0",X"C0",X"58",X"B0",X"52",X"00",X"48",X"C0",X"58",X"C0",X"05",X"04",X"03",X"03", + X"02",X"01",X"01",X"00",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"14",X"30",X"36",X"3E", + X"3C",X"22",X"3A",X"32",X"7F",X"21",X"E5",X"89",X"46",X"7D",X"C6",X"16",X"6F",X"78",X"B6",X"A7", + X"DD",X"21",X"80",X"8A",X"20",X"3C",X"3A",X"06",X"88",X"A7",X"C8",X"FD",X"21",X"90",X"8C",X"DD", + X"7E",X"02",X"A7",X"20",X"2D",X"3A",X"24",X"8F",X"21",X"57",X"8F",X"B6",X"20",X"24",X"3A",X"1F", + X"88",X"A7",X"3A",X"A0",X"A0",X"20",X"03",X"3A",X"C0",X"A0",X"2F",X"DD",X"77",X"07",X"17",X"17", + X"17",X"21",X"03",X"8F",X"17",X"CB",X"16",X"7E",X"E6",X"07",X"FE",X"01",X"C8",X"DD",X"CB",X"07", + X"A6",X"C9",X"DD",X"36",X"07",X"00",X"C9",X"22",X"1F",X"25",X"1E",X"14",X"10",X"3A",X"1E",X"88", + X"A7",X"20",X"5E",X"21",X"5F",X"85",X"01",X"A7",X"1E",X"11",X"E0",X"FF",X"0A",X"77",X"03",X"19", + X"FE",X"10",X"20",X"F8",X"3A",X"07",X"89",X"3C",X"47",X"AF",X"C6",X"01",X"27",X"10",X"FB",X"F5", + X"F5",X"F5",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"21",X"9F",X"84",X"A7",X"20",X"02", + X"3E",X"10",X"77",X"F1",X"E6",X"0F",X"21",X"7F",X"84",X"77",X"F1",X"CB",X"3F",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"E6",X"01",X"21",X"0D",X"20",X"CD",X"45",X"0C",X"21",X"62",X"84",X"CD",X"07", + X"33",X"21",X"22",X"87",X"CD",X"8C",X"1F",X"F1",X"47",X"E6",X"0F",X"32",X"83",X"84",X"CD",X"FB", + X"1F",X"CD",X"18",X"1F",X"CD",X"C9",X"34",X"C9",X"21",X"E7",X"89",X"06",X"07",X"7E",X"23",X"B6", + X"C0",X"10",X"FA",X"0E",X"00",X"2E",X"01",X"7E",X"D6",X"0A",X"38",X"22",X"0C",X"18",X"F9",X"3A", + X"56",X"8D",X"A7",X"C0",X"4F",X"3A",X"01",X"89",X"FE",X"0A",X"38",X"0D",X"21",X"87",X"1F",X"06", + X"05",X"BE",X"28",X"0A",X"0C",X"23",X"10",X"F9",X"C9",X"3E",X"01",X"32",X"56",X"8D",X"79",X"A7", + X"20",X"28",X"3A",X"07",X"89",X"C6",X"01",X"47",X"AF",X"C6",X"01",X"27",X"10",X"FB",X"11",X"E6", + X"1F",X"CB",X"67",X"20",X"03",X"11",X"DA",X"1F",X"21",X"22",X"87",X"CD",X"8C",X"1F",X"3E",X"10", + X"06",X"03",X"D7",X"3A",X"01",X"89",X"32",X"43",X"87",X"AF",X"21",X"A3",X"1F",X"CD",X"45",X"0C", + X"21",X"22",X"83",X"CD",X"8C",X"1F",X"C9",X"09",X"14",X"1E",X"28",X"30",X"3E",X"04",X"ED",X"47", + X"06",X"03",X"1A",X"77",X"2C",X"13",X"10",X"FA",X"0E",X"1D",X"09",X"ED",X"57",X"3D",X"C8",X"ED", + X"47",X"18",X"ED",X"AD",X"1F",X"B6",X"1F",X"C2",X"1F",X"CE",X"1F",X"44",X"20",X"8E",X"8E",X"8E", + X"8E",X"00",X"CE",X"8E",X"8E",X"CE",X"8F",X"8F",X"8F",X"8F",X"00",X"CF",X"8F",X"00",X"CF",X"0F", + X"0F",X"0F",X"85",X"85",X"85",X"85",X"00",X"C5",X"85",X"00",X"C5",X"05",X"05",X"05",X"8B",X"8B", + X"8B",X"8B",X"00",X"CB",X"8B",X"00",X"CB",X"0B",X"0B",X"0B",X"B7",X"B8",X"B9",X"B6",X"09",X"B6", + X"B2",X"B3",X"B2",X"10",X"10",X"10",X"B7",X"B8",X"B9",X"B6",X"09",X"B6",X"B4",X"B5",X"B4",X"10", + X"10",X"10",X"02",X"08",X"13",X"17",X"16",X"09",X"15",X"11",X"A0",X"78",X"CB",X"6F",X"11",X"3B", + X"20",X"28",X"03",X"11",X"50",X"20",X"21",X"62",X"80",X"CD",X"07",X"33",X"C9",X"11",X"20",X"26", + X"20",X"B2",X"B3",X"B2",X"B6",X"10",X"B6",X"B7",X"B8",X"B9",X"B7",X"B8",X"B9",X"B6",X"B1",X"B6", + X"B6",X"10",X"B6",X"B7",X"B8",X"B9",X"B4",X"B5",X"B4",X"B6",X"10",X"B6",X"B7",X"B8",X"B9",X"B7", + X"B8",X"B9",X"B6",X"B1",X"B6",X"B6",X"10",X"B6",X"B7",X"B8",X"B9",X"00",X"00",X"40",X"00",X"00", + X"40",X"00",X"00",X"00",X"83",X"83",X"83",X"83",X"00",X"C3",X"83",X"00",X"C3",X"03",X"03",X"03", + X"0B",X"0B",X"4B",X"0B",X"00",X"4B",X"0B",X"0B",X"0B",X"83",X"83",X"83",X"83",X"00",X"C3",X"83", + X"00",X"C3",X"03",X"03",X"03",X"21",X"3F",X"86",X"11",X"E0",X"FF",X"3A",X"08",X"89",X"A7",X"C8", + X"3D",X"4F",X"28",X"0D",X"FE",X"05",X"38",X"02",X"3E",X"05",X"4F",X"47",X"36",X"B0",X"19",X"10", + X"FB",X"3E",X"05",X"91",X"C8",X"47",X"36",X"10",X"19",X"10",X"FB",X"C9",X"21",X"6D",X"06",X"06", + X"10",X"11",X"AA",X"20",X"1A",X"BE",X"20",X"0C",X"13",X"00",X"3E",X"08",X"85",X"30",X"01",X"24", + X"6F",X"10",X"F1",X"C9",X"3E",X"01",X"32",X"F0",X"8E",X"C9",X"F5",X"D5",X"80",X"94",X"88",X"18", + X"03",X"0B",X"06",X"15",X"32",X"88",X"77",X"3A",X"35",X"CD",X"05",X"0C",X"32",X"D1",X"3E",X"DD", + X"2C",X"2C",X"0A",X"10",X"1B",X"1F",X"1E",X"11",X"1D",X"19",X"FF",X"00",X"00",X"00",X"11",X"00", + X"0E",X"00",X"00",X"07",X"21",X"32",X"8D",X"3A",X"50",X"8F",X"A7",X"28",X"0B",X"36",X"00",X"45", + X"2E",X"F8",X"7E",X"23",X"A6",X"20",X"03",X"68",X"7E",X"A7",X"C2",X"1E",X"24",X"DD",X"21",X"80", + X"8A",X"CD",X"29",X"23",X"CD",X"01",X"21",X"CD",X"63",X"25",X"CD",X"A6",X"25",X"CD",X"8B",X"30", + X"C9",X"CD",X"78",X"27",X"CD",X"0B",X"21",X"CD",X"57",X"21",X"C9",X"DD",X"21",X"80",X"8A",X"DD", + X"CB",X"07",X"66",X"DD",X"36",X"07",X"00",X"C8",X"21",X"02",X"8F",X"7E",X"A7",X"C0",X"34",X"FD", + X"21",X"90",X"8C",X"3A",X"30",X"8F",X"FE",X"02",X"38",X"15",X"FD",X"7E",X"18",X"FE",X"02",X"20", + X"0E",X"FD",X"7E",X"00",X"A7",X"20",X"08",X"FD",X"36",X"18",X"00",X"FD",X"CB",X"00",X"CE",X"11", + X"18",X"00",X"06",X"02",X"FD",X"CB",X"00",X"46",X"28",X"3A",X"FD",X"19",X"10",X"F6",X"DD",X"54", + X"1E",X"3C",X"1A",X"A7",X"20",X"01",X"C9",X"FD",X"21",X"90",X"8C",X"3E",X"02",X"32",X"15",X"8F", + X"FD",X"CB",X"00",X"46",X"C4",X"CF",X"21",X"11",X"18",X"00",X"FD",X"19",X"3A",X"15",X"8F",X"D6", + X"01",X"20",X"EA",X"3A",X"00",X"8F",X"11",X"C9",X"26",X"D6",X"0C",X"93",X"C2",X"B1",X"22",X"AF", + X"32",X"02",X"8F",X"C9",X"FD",X"CB",X"00",X"C6",X"DD",X"7E",X"04",X"D6",X"03",X"FD",X"77",X"04", + X"DD",X"7E",X"06",X"C6",X"04",X"FD",X"77",X"06",X"FD",X"CB",X"00",X"4E",X"20",X"0A",X"FD",X"36", + X"0F",X"14",X"FD",X"36",X"10",X"40",X"18",X"14",X"FD",X"36",X"0F",X"10",X"FD",X"36",X"10",X"40", + X"3E",X"01",X"32",X"77",X"8D",X"AF",X"21",X"98",X"8A",X"06",X"18",X"D7",X"21",X"19",X"8D",X"FD", + X"E5",X"D1",X"AF",X"CB",X"5B",X"28",X"01",X"23",X"77",X"23",X"23",X"77",X"C3",X"B1",X"22",X"FD", + X"CB",X"07",X"46",X"20",X"2F",X"FD",X"7E",X"12",X"A7",X"20",X"06",X"FD",X"34",X"12",X"CD",X"D2", + X"0E",X"FD",X"CB",X"00",X"4E",X"20",X"3F",X"FD",X"7D",X"CB",X"5F",X"21",X"1B",X"8D",X"28",X"01", + X"23",X"7E",X"A7",X"28",X"04",X"36",X"00",X"18",X"25",X"FD",X"7E",X"06",X"D6",X"04",X"38",X"1E", + X"FD",X"77",X"06",X"C9",X"FD",X"7E",X"01",X"FE",X"01",X"D8",X"20",X"07",X"FD",X"36",X"0F",X"1B", + X"FD",X"34",X"01",X"FD",X"7E",X"04",X"C6",X"04",X"FD",X"77",X"04",X"FE",X"E8",X"D8",X"FD",X"E5", + X"E1",X"06",X"18",X"AF",X"D7",X"C9",X"3A",X"0E",X"8F",X"A7",X"CC",X"82",X"22",X"ED",X"5B",X"10", + X"8F",X"FD",X"7D",X"CB",X"5F",X"FD",X"6E",X"05",X"FD",X"66",X"06",X"01",X"19",X"8D",X"28",X"01", + X"03",X"0A",X"CB",X"47",X"28",X"03",X"19",X"18",X"02",X"ED",X"52",X"FD",X"75",X"05",X"FD",X"74", + X"06",X"ED",X"5B",X"12",X"8F",X"FD",X"6E",X"03",X"FD",X"66",X"04",X"19",X"7C",X"FE",X"E8",X"30", + X"0B",X"FD",X"75",X"03",X"FD",X"74",X"04",X"21",X"0E",X"8F",X"35",X"C9",X"AF",X"32",X"0E",X"8F", + X"32",X"0F",X"8F",X"32",X"30",X"8F",X"32",X"45",X"8D",X"32",X"77",X"8D",X"32",X"3F",X"8F",X"18", + X"9D",X"C9",X"3A",X"0F",X"8F",X"21",X"12",X"27",X"E7",X"32",X"0E",X"8F",X"3A",X"0F",X"8F",X"21", + X"1C",X"27",X"CD",X"45",X"0C",X"ED",X"53",X"10",X"8F",X"3A",X"0F",X"8F",X"21",X"30",X"27",X"CD", + X"45",X"0C",X"ED",X"53",X"12",X"8F",X"21",X"0F",X"8F",X"34",X"7E",X"FE",X"09",X"C0",X"36",X"08", + X"C9",X"3A",X"32",X"8D",X"A7",X"C0",X"DD",X"21",X"80",X"8A",X"CD",X"E6",X"22",X"11",X"18",X"00", + X"DD",X"19",X"CD",X"E6",X"22",X"DD",X"19",X"CD",X"E6",X"22",X"DD",X"19",X"CD",X"E6",X"22",X"C9", + X"FD",X"21",X"90",X"8C",X"11",X"18",X"00",X"06",X"02",X"AF",X"FD",X"CB",X"00",X"46",X"28",X"01", + X"07",X"FD",X"19",X"10",X"F5",X"C9",X"DD",X"7E",X"0E",X"A7",X"28",X"04",X"DD",X"35",X"0E",X"C9", + X"2A",X"00",X"8F",X"7E",X"FE",X"FF",X"28",X"12",X"DD",X"77",X"10",X"23",X"7E",X"DD",X"77",X"0F", + X"23",X"7E",X"DD",X"77",X"0E",X"23",X"22",X"00",X"8F",X"C9",X"CD",X"D0",X"22",X"FE",X"03",X"20", + X"08",X"21",X"E7",X"26",X"22",X"00",X"8F",X"18",X"D7",X"23",X"7E",X"32",X"00",X"8F",X"23",X"7E", + X"32",X"01",X"8F",X"18",X"CB",X"10",X"10",X"37",X"37",X"DD",X"CB",X"07",X"56",X"28",X"3B",X"DD", + X"35",X"04",X"DD",X"7E",X"04",X"FE",X"41",X"30",X"04",X"DD",X"36",X"04",X"41",X"CD",X"D7",X"23", + X"2A",X"BE",X"88",X"7D",X"FE",X"E6",X"20",X"11",X"7E",X"FE",X"35",X"30",X"0C",X"26",X"89",X"06", + X"07",X"23",X"7E",X"B7",X"20",X"03",X"10",X"F9",X"C9",X"CD",X"EC",X"23",X"21",X"BD",X"88",X"34", + X"7E",X"E6",X"07",X"77",X"A7",X"C0",X"2B",X"34",X"18",X"43",X"DD",X"CB",X"07",X"5E",X"C8",X"DD", + X"34",X"04",X"DD",X"7E",X"04",X"FE",X"C0",X"38",X"04",X"DD",X"36",X"04",X"C0",X"CD",X"D7",X"23", + X"3A",X"BE",X"88",X"FE",X"F6",X"20",X"17",X"21",X"38",X"8A",X"06",X"03",X"7E",X"A7",X"20",X"0E", + X"23",X"10",X"F9",X"21",X"83",X"80",X"3A",X"43",X"83",X"86",X"E6",X"0F",X"A7",X"C8",X"CD",X"05", + X"24",X"21",X"BD",X"88",X"35",X"7E",X"E6",X"07",X"77",X"A7",X"C0",X"2B",X"35",X"7E",X"E6",X"03", + X"77",X"21",X"F6",X"26",X"CD",X"45",X"0C",X"D5",X"21",X"25",X"84",X"CD",X"25",X"33",X"D1",X"2E", + X"65",X"CD",X"25",X"33",X"2E",X"A5",X"11",X"0A",X"27",X"3A",X"BC",X"88",X"E6",X"01",X"20",X"03", + X"11",X"0E",X"27",X"CD",X"25",X"33",X"C9",X"DD",X"21",X"80",X"8A",X"DD",X"7E",X"04",X"DD",X"77", + X"4C",X"D6",X"10",X"DD",X"77",X"34",X"C6",X"0A",X"DD",X"77",X"1C",X"C9",X"21",X"37",X"8F",X"34", + X"CB",X"46",X"C0",X"2A",X"BE",X"88",X"7E",X"FE",X"34",X"28",X"03",X"35",X"18",X"03",X"36",X"10", + X"2B",X"22",X"BE",X"88",X"C9",X"21",X"37",X"8F",X"34",X"CB",X"46",X"C8",X"2A",X"BE",X"88",X"7E", + X"FE",X"37",X"30",X"03",X"34",X"18",X"03",X"23",X"36",X"34",X"22",X"BE",X"88",X"C9",X"CD",X"01", + X"21",X"CD",X"A6",X"25",X"CD",X"8B",X"30",X"3A",X"1E",X"88",X"A7",X"C0",X"DD",X"21",X"80",X"8A", + X"DD",X"7E",X"02",X"E6",X"07",X"EF",X"42",X"24",X"73",X"24",X"97",X"24",X"B9",X"24",X"DB",X"24", + X"FB",X"24",X"21",X"E8",X"89",X"7E",X"2E",X"EF",X"B6",X"C0",X"DD",X"36",X"11",X"10",X"DD",X"34", + X"02",X"21",X"80",X"8A",X"11",X"98",X"8A",X"01",X"18",X"00",X"ED",X"B0",X"DD",X"7E",X"04",X"D6", + X"10",X"DD",X"77",X"04",X"21",X"BD",X"26",X"CD",X"0F",X"25",X"3A",X"24",X"8F",X"A7",X"C0",X"CD", + X"AD",X"0F",X"C9",X"DD",X"35",X"11",X"C0",X"3A",X"39",X"8A",X"A7",X"20",X"06",X"DD",X"36",X"11", + X"10",X"DD",X"34",X"02",X"DD",X"7E",X"04",X"C6",X"10",X"DD",X"77",X"04",X"AF",X"DD",X"77",X"1E", + X"21",X"C1",X"26",X"CD",X"0F",X"25",X"C9",X"DD",X"35",X"11",X"C0",X"DD",X"34",X"02",X"21",X"C5", + X"26",X"CD",X"0F",X"25",X"DD",X"21",X"80",X"8A",X"DD",X"7E",X"04",X"C6",X"04",X"DD",X"77",X"04", + X"DD",X"7E",X"06",X"D6",X"06",X"DD",X"77",X"06",X"C9",X"DD",X"34",X"05",X"DD",X"CB",X"05",X"46", + X"20",X"03",X"DD",X"35",X"06",X"DD",X"7E",X"04",X"C6",X"02",X"DD",X"77",X"04",X"FE",X"DC",X"D8", + X"CD",X"21",X"0F",X"DD",X"36",X"11",X"02",X"DD",X"34",X"02",X"C9",X"DD",X"35",X"11",X"C0",X"DD", + X"7E",X"04",X"C6",X"04",X"DD",X"77",X"04",X"DD",X"7E",X"06",X"D6",X"08",X"DD",X"77",X"06",X"DD", + X"36",X"0F",X"1A",X"DD",X"36",X"11",X"30",X"DD",X"34",X"02",X"C9",X"DD",X"35",X"11",X"C0",X"21", + X"2B",X"88",X"7E",X"A7",X"20",X"02",X"2E",X"0A",X"36",X"07",X"3A",X"3C",X"8A",X"A7",X"C8",X"11", + X"18",X"00",X"06",X"04",X"7E",X"DD",X"77",X"0F",X"23",X"DD",X"19",X"10",X"F7",X"21",X"E5",X"89", + X"3A",X"F9",X"8D",X"B6",X"20",X"01",X"C9",X"16",X"08",X"FF",X"21",X"02",X"89",X"7E",X"FE",X"07", + X"3E",X"00",X"38",X"0D",X"3A",X"FB",X"89",X"36",X"04",X"2E",X"34",X"36",X"04",X"06",X"20",X"68", + X"D7",X"21",X"00",X"8F",X"06",X"4F",X"D7",X"2E",X"57",X"06",X"04",X"D7",X"21",X"30",X"8D",X"06", + X"03",X"D7",X"32",X"82",X"8A",X"32",X"90",X"8C",X"32",X"A8",X"8C",X"32",X"52",X"8F",X"32",X"63", + X"8F",X"C9",X"76",X"3A",X"50",X"8F",X"A7",X"C0",X"21",X"06",X"8F",X"7E",X"A7",X"28",X"02",X"35", + X"C9",X"36",X"0C",X"23",X"34",X"EB",X"3A",X"07",X"89",X"CB",X"47",X"21",X"BB",X"87",X"1A",X"20", + X"0E",X"26",X"84",X"11",X"44",X"27",X"E6",X"01",X"28",X"0F",X"11",X"48",X"27",X"18",X"0A",X"11", + X"4C",X"27",X"E6",X"01",X"28",X"03",X"11",X"50",X"27",X"D5",X"CD",X"25",X"33",X"11",X"A0",X"FF", + X"19",X"D1",X"CD",X"25",X"33",X"C9",X"3A",X"07",X"89",X"CB",X"47",X"CA",X"66",X"2D",X"21",X"09", + X"8F",X"35",X"C0",X"36",X"10",X"3A",X"02",X"89",X"A7",X"C8",X"4F",X"3A",X"20",X"89",X"A7",X"20", + X"74",X"79",X"11",X"05",X"8F",X"21",X"34",X"89",X"BE",X"28",X"10",X"1A",X"A7",X"20",X"0C",X"34", + X"3C",X"12",X"11",X"E3",X"86",X"ED",X"53",X"32",X"89",X"18",X"10",X"1A",X"A7",X"28",X"0C",X"3A", + X"32",X"89",X"FE",X"A3",X"20",X"05",X"AF",X"12",X"32",X"63",X"8F",X"7E",X"FE",X"07",X"38",X"0E", + X"3A",X"32",X"89",X"FE",X"C3",X"20",X"05",X"3E",X"01",X"32",X"04",X"8F",X"3E",X"07",X"47",X"11", + X"C0",X"FF",X"3A",X"05",X"8F",X"A7",X"28",X"63",X"21",X"09",X"8F",X"36",X"1C",X"11",X"E0",X"FF", + X"DD",X"2A",X"32",X"89",X"DD",X"19",X"DD",X"22",X"32",X"89",X"23",X"CB",X"46",X"21",X"6C",X"27", + X"20",X"03",X"21",X"68",X"27",X"DD",X"36",X"40",X"10",X"DD",X"36",X"41",X"10",X"CD",X"19",X"0F", + X"CD",X"11",X"0F",X"18",X"43",X"3A",X"0A",X"8F",X"CB",X"47",X"21",X"70",X"27",X"28",X"03",X"21", + X"74",X"27",X"FD",X"2A",X"32",X"89",X"FD",X"7C",X"D6",X"04",X"FD",X"67",X"FD",X"7E",X"00",X"FE", + X"80",X"06",X"07",X"28",X"23",X"3E",X"80",X"11",X"C0",X"FF",X"FD",X"77",X"00",X"FD",X"77",X"01", + X"FD",X"19",X"10",X"F6",X"CD",X"49",X"0F",X"06",X"07",X"18",X"0D",X"3A",X"0A",X"8F",X"CB",X"47", + X"21",X"68",X"27",X"28",X"03",X"21",X"6C",X"27",X"DD",X"2A",X"32",X"89",X"11",X"C0",X"FF",X"E5", + X"7E",X"DD",X"77",X"00",X"23",X"7E",X"DD",X"77",X"01",X"23",X"7E",X"DD",X"77",X"20",X"23",X"7E", + X"DD",X"77",X"21",X"DD",X"19",X"E1",X"10",X"E7",X"3A",X"20",X"89",X"A7",X"20",X"1A",X"11",X"DF", + X"FF",X"DD",X"19",X"DD",X"E5",X"E1",X"3A",X"0A",X"8F",X"CB",X"47",X"11",X"54",X"27",X"28",X"03", + X"11",X"5E",X"27",X"CD",X"07",X"33",X"36",X"10",X"21",X"0A",X"8F",X"34",X"C9",X"05",X"08",X"0A", + X"07",X"0C",X"10",X"0A",X"0F",X"0E",X"10",X"0A",X"0F",X"40",X"13",X"00",X"40",X"10",X"00",X"40", + X"11",X"00",X"40",X"12",X"00",X"FF",X"D8",X"26",X"40",X"17",X"08",X"40",X"10",X"08",X"40",X"25", + X"08",X"40",X"16",X"08",X"FF",X"E7",X"26",X"40",X"18",X"08",X"40",X"10",X"08",X"40",X"25",X"08", + X"40",X"16",X"08",X"FF",X"C9",X"26",X"FE",X"26",X"02",X"27",X"FE",X"26",X"06",X"27",X"E8",X"E9", + X"EB",X"EA",X"E4",X"E5",X"E7",X"E6",X"EC",X"ED",X"EF",X"EE",X"A8",X"A9",X"AB",X"AA",X"AC",X"AD", + X"AB",X"AE",X"0B",X"04",X"08",X"08",X"0A",X"0A",X"08",X"08",X"08",X"18",X"00",X"03",X"C0",X"02", + X"80",X"02",X"00",X"02",X"80",X"01",X"00",X"01",X"C0",X"00",X"80",X"00",X"40",X"00",X"00",X"00", + X"00",X"00",X"40",X"00",X"80",X"00",X"C0",X"00",X"00",X"01",X"80",X"01",X"00",X"02",X"80",X"02", + X"C0",X"02",X"00",X"03",X"3D",X"81",X"BD",X"42",X"5C",X"BF",X"BE",X"BB",X"D0",X"D1",X"D3",X"D2", + X"D4",X"D5",X"D7",X"D6",X"10",X"C1",X"CE",X"C2",X"C3",X"C7",X"C4",X"C5",X"C0",X"FF",X"10",X"C9", + X"CE",X"CA",X"CB",X"CF",X"CC",X"CD",X"A0",X"FF",X"D8",X"D9",X"DA",X"DB",X"DC",X"DD",X"DE",X"DF", + X"3E",X"C8",X"3E",X"C8",X"74",X"54",X"74",X"54",X"3A",X"30",X"8F",X"E6",X"07",X"EF",X"8F",X"27", + X"F3",X"27",X"56",X"28",X"AD",X"28",X"C5",X"28",X"26",X"80",X"77",X"D7",X"0D",X"20",X"FA",X"3A", + X"3F",X"8F",X"A7",X"20",X"1D",X"3A",X"75",X"8D",X"A7",X"28",X"0A",X"21",X"20",X"8F",X"7E",X"A7", + X"20",X"03",X"34",X"18",X"08",X"3A",X"01",X"89",X"A7",X"C8",X"E6",X"07",X"C0",X"3E",X"01",X"32", + X"3F",X"8F",X"3A",X"B4",X"8A",X"FE",X"3C",X"D8",X"3A",X"90",X"8C",X"CB",X"4F",X"C0",X"3A",X"A8", + X"8C",X"CB",X"4F",X"C0",X"21",X"30",X"8F",X"34",X"3E",X"08",X"32",X"2F",X"89",X"3A",X"06",X"88", + X"A7",X"20",X"0E",X"3A",X"50",X"8F",X"21",X"3F",X"8F",X"B6",X"28",X"05",X"3E",X"6F",X"32",X"08", + X"85",X"3A",X"7A",X"8D",X"A7",X"28",X"03",X"32",X"20",X"8F",X"21",X"A7",X"84",X"11",X"51",X"2D", + X"C3",X"25",X"33",X"3A",X"B4",X"8A",X"FE",X"34",X"38",X"19",X"21",X"2F",X"89",X"35",X"C0",X"36", + X"10",X"2B",X"34",X"CB",X"46",X"21",X"A7",X"84",X"11",X"51",X"2D",X"20",X"03",X"11",X"55",X"2D", + X"C3",X"25",X"33",X"21",X"90",X"8C",X"11",X"18",X"00",X"06",X"02",X"7E",X"A7",X"28",X"04",X"19", + X"10",X"F9",X"C9",X"3E",X"02",X"32",X"30",X"8F",X"77",X"CD",X"05",X"0F",X"21",X"A7",X"84",X"11", + X"55",X"2D",X"CD",X"25",X"33",X"3A",X"50",X"8F",X"21",X"3F",X"8F",X"B6",X"28",X"03",X"3E",X"10", + X"32",X"08",X"85",X"3E",X"01",X"32",X"99",X"8A",X"3A",X"86",X"8A",X"C6",X"0C",X"32",X"9E",X"8A", + X"3E",X"10",X"32",X"A7",X"8A",X"C9",X"3A",X"50",X"8F",X"A7",X"20",X"3A",X"DD",X"21",X"78",X"8C", + X"11",X"E8",X"FF",X"06",X"06",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"28",X"05",X"DD",X"19",X"10", + X"F4",X"C9",X"DD",X"36",X"01",X"05",X"DD",X"36",X"02",X"10",X"DD",X"36",X"03",X"00",X"DD",X"36", + X"04",X"08",X"DD",X"36",X"05",X"00",X"DD",X"36",X"06",X"1A",X"DD",X"36",X"0F",X"37",X"DD",X"36", + X"10",X"42",X"DD",X"22",X"32",X"8F",X"21",X"30",X"8F",X"34",X"3A",X"61",X"8F",X"A7",X"28",X"04", + X"2E",X"5D",X"34",X"C9",X"2E",X"34",X"36",X"20",X"11",X"15",X"03",X"FF",X"C9",X"21",X"34",X"8F", + X"7E",X"A7",X"28",X"02",X"35",X"C9",X"2E",X"30",X"34",X"3A",X"50",X"8F",X"A7",X"C0",X"AF",X"2A", + X"32",X"8F",X"06",X"18",X"D7",X"C9",X"CD",X"01",X"21",X"3A",X"07",X"89",X"CB",X"47",X"21",X"0A", + X"88",X"20",X"03",X"36",X"06",X"C9",X"3A",X"08",X"8F",X"A7",X"28",X"03",X"36",X"04",X"C9",X"DD", + X"21",X"80",X"8A",X"21",X"8D",X"2B",X"E5",X"DD",X"35",X"11",X"C0",X"DD",X"7E",X"02",X"E6",X"07", + X"EF",X"01",X"29",X"A0",X"29",X"01",X"2A",X"32",X"2A",X"79",X"2A",X"96",X"2A",X"B3",X"2A",X"E8", + X"2A",X"DD",X"36",X"11",X"01",X"DD",X"34",X"04",X"DD",X"7E",X"04",X"FE",X"DC",X"30",X"0F",X"CD", + X"D7",X"23",X"3A",X"BE",X"88",X"FE",X"F9",X"C8",X"CD",X"05",X"24",X"C3",X"A1",X"23",X"21",X"59", + X"2D",X"CD",X"0F",X"25",X"21",X"91",X"8A",X"36",X"0C",X"2E",X"82",X"34",X"23",X"23",X"7E",X"D6", + X"03",X"77",X"AF",X"32",X"9C",X"8A",X"32",X"9E",X"8A",X"21",X"59",X"08",X"01",X"00",X"20",X"7E", + X"81",X"4F",X"23",X"10",X"FA",X"FE",X"63",X"C2",X"E8",X"2A",X"06",X"20",X"11",X"80",X"29",X"1B", + X"1A",X"BE",X"C2",X"9A",X"2B",X"23",X"10",X"F7",X"CD",X"A2",X"0F",X"C9",X"D2",X"24",X"30",X"14", + X"11",X"10",X"10",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12", + X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"03",X"1D", + X"0D",X"03",X"00",X"00",X"07",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0B",X"0B",X"0B",X"0B",X"07",X"00",X"04",X"00", + X"DD",X"36",X"11",X"03",X"DD",X"34",X"0B",X"DD",X"7E",X"0B",X"E6",X"03",X"20",X"0E",X"DD",X"7E", + X"0F",X"FE",X"15",X"3E",X"15",X"20",X"02",X"3E",X"1E",X"DD",X"77",X"0F",X"DD",X"7E",X"06",X"D6", + X"02",X"DD",X"77",X"06",X"FE",X"2C",X"D0",X"3A",X"43",X"83",X"A7",X"C2",X"23",X"2B",X"C6",X"30", + X"32",X"30",X"8D",X"DD",X"36",X"11",X"18",X"DD",X"34",X"02",X"21",X"79",X"08",X"01",X"00",X"20", + X"7E",X"81",X"4F",X"23",X"10",X"FA",X"FE",X"37",X"C2",X"B3",X"2A",X"21",X"59",X"08",X"06",X"20", + X"11",X"80",X"29",X"1A",X"BE",X"C2",X"01",X"29",X"23",X"13",X"10",X"F7",X"11",X"14",X"06",X"FF", + X"C9",X"DD",X"36",X"11",X"08",X"DD",X"CB",X"10",X"FE",X"21",X"5A",X"87",X"3E",X"BC",X"77",X"23", + X"77",X"23",X"77",X"DD",X"34",X"02",X"AF",X"21",X"39",X"08",X"06",X"20",X"86",X"23",X"10",X"FC", + X"3D",X"C2",X"58",X"2C",X"11",X"15",X"06",X"FF",X"21",X"03",X"89",X"7E",X"FE",X"09",X"D8",X"36", + X"08",X"C9",X"DD",X"36",X"11",X"03",X"DD",X"34",X"0B",X"DD",X"7E",X"0B",X"E6",X"03",X"20",X"0E", + X"DD",X"7E",X"0F",X"FE",X"15",X"3E",X"15",X"20",X"02",X"3E",X"1E",X"DD",X"77",X"0F",X"3E",X"80", + X"DD",X"86",X"05",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"30",X"01",X"3C",X"3C",X"DD",X"77",X"06", + X"FE",X"52",X"20",X"05",X"11",X"94",X"06",X"FF",X"C9",X"FE",X"64",X"20",X"05",X"11",X"95",X"06", + X"FF",X"C9",X"FE",X"AC",X"D8",X"DD",X"34",X"02",X"C9",X"21",X"66",X"1C",X"11",X"23",X"2B",X"06", + X"68",X"1A",X"96",X"C2",X"A0",X"29",X"23",X"13",X"10",X"F7",X"DD",X"36",X"11",X"30",X"DD",X"CB", + X"10",X"BE",X"DD",X"34",X"02",X"C9",X"21",X"DF",X"67",X"11",X"23",X"2B",X"06",X"20",X"1A",X"96", + X"C2",X"01",X"2A",X"23",X"1B",X"10",X"F7",X"DD",X"36",X"11",X"18",X"DD",X"CB",X"10",X"FE",X"DD", + X"34",X"02",X"C9",X"DD",X"36",X"11",X"02",X"DD",X"34",X"0B",X"DD",X"7E",X"0B",X"E6",X"03",X"20", + X"0E",X"DD",X"7E",X"0F",X"FE",X"15",X"3E",X"15",X"20",X"02",X"3E",X"1E",X"DD",X"77",X"0F",X"DD", + X"34",X"06",X"DD",X"7E",X"06",X"FE",X"C0",X"D8",X"DD",X"7E",X"04",X"D6",X"03",X"DD",X"77",X"04", + X"DD",X"34",X"02",X"DD",X"36",X"11",X"40",X"C9",X"AF",X"21",X"80",X"8A",X"77",X"11",X"81",X"8A", + X"01",X"40",X"02",X"ED",X"B0",X"32",X"02",X"89",X"32",X"03",X"89",X"32",X"31",X"89",X"3E",X"06", + X"32",X"0A",X"88",X"C9",X"AF",X"88",X"0A",X"32",X"88",X"08",X"32",X"89",X"04",X"32",X"01",X"3E", + X"AD",X"20",X"B9",X"5A",X"3E",X"FA",X"10",X"19",X"4F",X"81",X"7E",X"0A",X"00",X"01",X"FF",X"E0", + X"11",X"82",X"BC",X"21",X"08",X"88",X"35",X"3A",X"2A",X"8E",X"A7",X"28",X"04",X"7E",X"A7",X"28", + X"28",X"CD",X"94",X"7E",X"3A",X"FC",X"89",X"A7",X"C8",X"3A",X"08",X"88",X"E6",X"07",X"C0",X"3A", + X"FF",X"89",X"2A",X"FD",X"89",X"11",X"20",X"00",X"06",X"1C",X"77",X"19",X"10",X"FC",X"3C",X"FE", + X"10",X"38",X"02",X"3E",X"06",X"32",X"FF",X"89",X"C9",X"21",X"5F",X"85",X"11",X"E0",X"FF",X"06", + X"08",X"3E",X"10",X"77",X"19",X"10",X"FA",X"21",X"BC",X"82",X"11",X"E0",X"FF",X"01",X"00",X"0A", + X"7E",X"81",X"4F",X"19",X"10",X"FA",X"79",X"FE",X"AA",X"C0",X"AF",X"32",X"2A",X"8E",X"3A",X"0E", + X"88",X"A7",X"28",X"4E",X"3A",X"0D",X"88",X"A7",X"28",X"29",X"3A",X"48",X"89",X"3A",X"82",X"8A", + X"FE",X"03",X"D8",X"CD",X"9A",X"2B",X"CD",X"2C",X"2C",X"C9",X"21",X"03",X"89",X"7E",X"FE",X"02", + X"DC",X"BF",X"2B",X"21",X"30",X"8D",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"DD",X"21",X"60",X"8C", + X"11",X"E8",X"FF",X"06",X"11",X"D9",X"CD",X"E5",X"2B",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"FE", + X"01",X"21",X"7B",X"87",X"28",X"0D",X"7E",X"FE",X"BA",X"20",X"02",X"F1",X"C9",X"11",X"E1",X"2B", + X"CD",X"25",X"33",X"21",X"BB",X"87",X"7E",X"FE",X"BA",X"C8",X"11",X"E1",X"2B",X"CD",X"25",X"33", + X"C9",X"BA",X"BA",X"BA",X"BA",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D8",X"DD",X"36",X"00", + X"01",X"AF",X"DD",X"36",X"02",X"11",X"DD",X"77",X"03",X"DD",X"77",X"05",X"DD",X"36",X"04",X"1C", + X"DD",X"36",X"06",X"03",X"21",X"03",X"89",X"35",X"CB",X"46",X"28",X"01",X"3C",X"DD",X"77",X"07", + X"11",X"5D",X"2D",X"CD",X"1E",X"38",X"3A",X"03",X"89",X"FE",X"0A",X"38",X"02",X"3E",X"0A",X"47", + X"3E",X"20",X"90",X"32",X"30",X"8D",X"DD",X"36",X"09",X"10",X"F1",X"C9",X"DD",X"21",X"E0",X"8A", + X"11",X"18",X"00",X"06",X"11",X"D9",X"CD",X"3F",X"2C",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD", + X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"E6",X"1F",X"D6",X"11",X"D8",X"EF", + X"58",X"2C",X"B3",X"2C",X"24",X"2D",X"4A",X"2D",X"CD",X"06",X"40",X"DD",X"7E",X"05",X"DD",X"86", + X"09",X"30",X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"47",X"DD",X"7E",X"06",X"FE",X"12",X"D8", + X"DD",X"21",X"E0",X"8A",X"06",X"11",X"CD",X"85",X"2C",X"11",X"18",X"00",X"DD",X"19",X"10",X"F6", + X"CD",X"3F",X"0F",X"F1",X"C9",X"DD",X"7E",X"02",X"FE",X"11",X"C0",X"DD",X"36",X"02",X"12",X"11", + X"A7",X"2C",X"CD",X"1E",X"38",X"21",X"00",X"2D",X"DD",X"75",X"16",X"DD",X"74",X"17",X"DD",X"36", + X"15",X"00",X"C9",X"A7",X"2C",X"AD",X"2C",X"4F",X"04",X"F0",X"FF",X"A7",X"2C",X"0F",X"04",X"F0", + X"FF",X"AD",X"2C",X"CD",X"06",X"40",X"DD",X"6E",X"16",X"DD",X"66",X"17",X"7E",X"FE",X"FF",X"20", + X"06",X"DD",X"77",X"15",X"23",X"18",X"F5",X"FE",X"88",X"20",X"0E",X"DD",X"34",X"02",X"11",X"5D", + X"2D",X"CD",X"1E",X"38",X"DD",X"36",X"11",X"20",X"C9",X"23",X"DD",X"75",X"16",X"DD",X"74",X"17", + X"DD",X"CB",X"15",X"46",X"20",X"0E",X"47",X"DD",X"7E",X"03",X"90",X"30",X"03",X"DD",X"35",X"04", + X"DD",X"77",X"03",X"C9",X"DD",X"86",X"03",X"30",X"03",X"DD",X"34",X"04",X"DD",X"77",X"03",X"C9", + X"C0",X"80",X"60",X"40",X"40",X"20",X"20",X"20",X"00",X"20",X"00",X"20",X"00",X"00",X"20",X"00", + X"00",X"FF",X"00",X"00",X"20",X"00",X"00",X"20",X"00",X"20",X"00",X"20",X"20",X"20",X"40",X"40", + X"60",X"80",X"C0",X"88",X"CD",X"06",X"40",X"DD",X"7E",X"05",X"DD",X"86",X"09",X"30",X"03",X"DD", + X"34",X"06",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"FE",X"19",X"D8",X"DD",X"34",X"02",X"AF",X"DD", + X"77",X"05",X"DD",X"77",X"06",X"DD",X"77",X"16",X"F1",X"C9",X"3E",X"00",X"32",X"36",X"8F",X"F1", + X"C9",X"F0",X"F1",X"F3",X"F2",X"A2",X"A1",X"10",X"10",X"15",X"00",X"0A",X"0F",X"40",X"03",X"07", + X"40",X"09",X"07",X"FF",X"5D",X"2D",X"3A",X"32",X"8D",X"A7",X"C0",X"3A",X"03",X"89",X"D6",X"02", + X"C8",X"CD",X"78",X"2D",X"CD",X"22",X"2E",X"C9",X"3A",X"14",X"8F",X"EF",X"80",X"2D",X"BC",X"2D", + X"3A",X"03",X"89",X"D6",X"02",X"21",X"31",X"89",X"BE",X"C8",X"34",X"21",X"18",X"8F",X"7E",X"FE", + X"04",X"38",X"05",X"3A",X"EF",X"89",X"A7",X"C8",X"34",X"21",X"B8",X"2D",X"E7",X"6F",X"26",X"84", + X"22",X"19",X"8F",X"3A",X"18",X"8F",X"47",X"21",X"26",X"8F",X"23",X"23",X"10",X"FC",X"36",X"10", + X"2E",X"14",X"34",X"2E",X"16",X"36",X"10",X"C9",X"97",X"93",X"8F",X"8A",X"21",X"16",X"8F",X"7E", + X"A7",X"28",X"02",X"35",X"C9",X"36",X"08",X"2E",X"1B",X"7E",X"FE",X"08",X"20",X"0F",X"AF",X"77", + X"2E",X"14",X"77",X"3A",X"18",X"8F",X"2E",X"1B",X"85",X"6F",X"36",X"01",X"C9",X"21",X"EE",X"2D", + X"CD",X"45",X"0C",X"2A",X"19",X"8F",X"CD",X"25",X"33",X"21",X"1B",X"8F",X"34",X"C9",X"FE",X"2D", + X"02",X"2E",X"06",X"2E",X"0A",X"2E",X"0E",X"2E",X"12",X"2E",X"16",X"2E",X"1A",X"2E",X"39",X"39", + X"3A",X"3A",X"39",X"F4",X"F6",X"3A",X"39",X"F5",X"F7",X"3A",X"39",X"F8",X"FA",X"3A",X"F4",X"FC", + X"FE",X"F6",X"F5",X"FD",X"FF",X"F7",X"F8",X"E0",X"E2",X"FA",X"F9",X"E1",X"E3",X"FB",X"39",X"39", + X"A7",X"A6",X"3A",X"18",X"8F",X"A7",X"C8",X"DD",X"21",X"1C",X"8F",X"47",X"D9",X"CD",X"36",X"2E", + X"D9",X"DD",X"23",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"D6",X"01",X"D8",X"EF",X"5E",X"2E",X"CB", + X"2E",X"01",X"2F",X"2F",X"2F",X"DD",X"7D",X"4F",X"E6",X"03",X"87",X"C6",X"28",X"6F",X"26",X"8F", + X"35",X"C9",X"DD",X"7D",X"E6",X"03",X"21",X"B8",X"2D",X"E7",X"6F",X"26",X"84",X"C9",X"3A",X"5F", + X"8A",X"E6",X"03",X"C0",X"CD",X"45",X"2E",X"C0",X"36",X"01",X"FD",X"21",X"48",X"8C",X"11",X"18", + X"00",X"06",X"03",X"FD",X"7E",X"00",X"FD",X"B6",X"01",X"0F",X"30",X"05",X"FD",X"19",X"10",X"F3", + X"C9",X"3A",X"07",X"89",X"FE",X"10",X"38",X"02",X"3E",X"10",X"D6",X"28",X"2F",X"77",X"23",X"78", + X"2F",X"E6",X"03",X"77",X"DD",X"7D",X"E6",X"03",X"21",X"C7",X"2E",X"E7",X"FD",X"36",X"00",X"07", + X"FD",X"36",X"02",X"10",X"FD",X"77",X"04",X"FD",X"36",X"05",X"40",X"FD",X"36",X"06",X"1A",X"FD", + X"36",X"0F",X"2E",X"FD",X"36",X"10",X"40",X"DD",X"34",X"00",X"CD",X"52",X"2E",X"11",X"FE",X"2D", + X"CD",X"25",X"33",X"CD",X"11",X"0F",X"C9",X"18",X"14",X"10",X"0B",X"CD",X"45",X"2E",X"C0",X"3A", + X"07",X"89",X"FE",X"10",X"38",X"02",X"3E",X"10",X"07",X"C6",X"18",X"77",X"FD",X"21",X"30",X"8C", + X"11",X"18",X"00",X"23",X"46",X"04",X"FD",X"19",X"10",X"FC",X"FD",X"34",X"0F",X"FD",X"36",X"05", + X"00",X"FD",X"35",X"06",X"DD",X"34",X"00",X"CD",X"52",X"2E",X"11",X"1E",X"2E",X"CD",X"25",X"33", + X"C9",X"CD",X"5F",X"30",X"CD",X"45",X"2E",X"C0",X"36",X"0C",X"FD",X"21",X"30",X"8C",X"11",X"18", + X"00",X"23",X"46",X"04",X"FD",X"19",X"10",X"FC",X"FD",X"35",X"0F",X"FD",X"36",X"05",X"C0",X"FD", + X"34",X"06",X"DD",X"34",X"00",X"CD",X"52",X"2E",X"11",X"FE",X"2D",X"CD",X"25",X"33",X"C9",X"CD", + X"45",X"2E",X"C0",X"3A",X"31",X"89",X"A7",X"C8",X"E5",X"3A",X"07",X"89",X"CB",X"3F",X"CB",X"3F", + X"FE",X"04",X"38",X"02",X"3E",X"03",X"47",X"3A",X"20",X"88",X"E6",X"04",X"0F",X"80",X"21",X"93", + X"2F",X"CD",X"45",X"0C",X"EB",X"3A",X"31",X"89",X"3D",X"FE",X"20",X"38",X"02",X"3E",X"1F",X"E7", + X"E1",X"5F",X"7D",X"FE",X"28",X"28",X"0C",X"D6",X"02",X"6F",X"7E",X"E6",X"1C",X"83",X"5F",X"7D", + X"C6",X"02",X"6F",X"7B",X"77",X"11",X"18",X"00",X"23",X"46",X"21",X"30",X"8C",X"04",X"19",X"10", + X"FD",X"AF",X"06",X"18",X"D7",X"3C",X"DD",X"77",X"00",X"CD",X"52",X"2E",X"11",X"1A",X"2E",X"CD", + X"25",X"33",X"C9",X"9F",X"2F",X"BF",X"2F",X"DF",X"2F",X"FF",X"2F",X"1F",X"30",X"3F",X"30",X"64", + X"64",X"60",X"60",X"60",X"5C",X"5C",X"58",X"58",X"58",X"4C",X"4C",X"48",X"48",X"48",X"40",X"40", + X"40",X"3C",X"3C",X"3C",X"38",X"38",X"30",X"30",X"30",X"2C",X"2C",X"20",X"20",X"18",X"10",X"58", + X"58",X"58",X"54",X"54",X"50",X"50",X"4C",X"4C",X"48",X"48",X"40",X"40",X"40",X"3C",X"3C",X"38", + X"38",X"34",X"34",X"30",X"30",X"2C",X"2C",X"28",X"28",X"24",X"24",X"18",X"18",X"10",X"08",X"48", + X"48",X"48",X"44",X"3C",X"3C",X"34",X"34",X"30",X"30",X"28",X"28",X"24",X"24",X"20",X"20",X"1C", + X"1C",X"18",X"18",X"14",X"14",X"10",X"10",X"0C",X"0C",X"08",X"08",X"04",X"04",X"03",X"02",X"38", + X"38",X"34",X"34",X"2C",X"2C",X"28",X"28",X"24",X"24",X"20",X"20",X"1C",X"1C",X"18",X"18",X"14", + X"14",X"10",X"10",X"0C",X"0C",X"08",X"08",X"04",X"04",X"04",X"04",X"02",X"02",X"02",X"01",X"20", + X"20",X"20",X"1C",X"1C",X"18",X"18",X"14",X"14",X"10",X"10",X"10",X"0C",X"0C",X"0C",X"08",X"08", + X"08",X"04",X"04",X"04",X"02",X"02",X"02",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"18", + X"18",X"18",X"18",X"14",X"14",X"14",X"10",X"10",X"10",X"0C",X"0C",X"0C",X"08",X"08",X"04",X"04", + X"04",X"02",X"02",X"02",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"DD", + X"7D",X"E6",X"03",X"21",X"87",X"30",X"E7",X"47",X"3A",X"84",X"8A",X"D6",X"07",X"4F",X"C6",X"0E", + X"B8",X"D8",X"79",X"B8",X"D0",X"21",X"24",X"8F",X"3A",X"08",X"8F",X"B6",X"C0",X"3E",X"01",X"32", + X"32",X"8D",X"CD",X"15",X"0F",X"F1",X"C9",X"C0",X"A0",X"80",X"58",X"3A",X"04",X"8F",X"A7",X"C8", + X"3A",X"08",X"8F",X"A7",X"20",X"4A",X"DD",X"21",X"E0",X"8A",X"FD",X"21",X"20",X"89",X"11",X"18", + X"00",X"06",X"11",X"DD",X"7E",X"00",X"A7",X"28",X"0D",X"FE",X"05",X"28",X"09",X"DD",X"19",X"10", + X"F2",X"AF",X"32",X"20",X"89",X"C9",X"DD",X"7E",X"01",X"A7",X"20",X"F1",X"DD",X"E5",X"E1",X"FD", + X"75",X"00",X"FD",X"74",X"01",X"DD",X"36",X"00",X"05",X"DD",X"36",X"02",X"10",X"FD",X"23",X"FD", + X"23",X"FD",X"7D",X"FE",X"28",X"20",X"D6",X"21",X"08",X"8F",X"36",X"01",X"23",X"36",X"20",X"C9", + X"21",X"BD",X"32",X"E5",X"3A",X"08",X"8F",X"E6",X"03",X"3D",X"EF",X"F1",X"30",X"6E",X"31",X"66", + X"32",X"DD",X"21",X"20",X"89",X"21",X"37",X"33",X"06",X"04",X"DD",X"5E",X"00",X"DD",X"56",X"01", + X"FD",X"6B",X"FD",X"62",X"7E",X"FD",X"77",X"04",X"23",X"7E",X"FD",X"77",X"06",X"23",X"7E",X"FD", + X"77",X"0F",X"23",X"7E",X"FD",X"77",X"10",X"FD",X"36",X"09",X"30",X"DD",X"23",X"DD",X"23",X"23", + X"10",X"D8",X"3E",X"0C",X"32",X"28",X"89",X"21",X"08",X"8F",X"34",X"3E",X"10",X"11",X"1D",X"00", + X"21",X"C2",X"84",X"0E",X"03",X"06",X"03",X"D7",X"19",X"0D",X"20",X"F9",X"21",X"70",X"33",X"22", + X"4B",X"8F",X"CD",X"19",X"0F",X"CD",X"3E",X"32",X"11",X"AC",X"68",X"21",X"78",X"32",X"06",X"40", + X"7B",X"BE",X"20",X"0F",X"7A",X"23",X"BE",X"20",X"0A",X"23",X"1A",X"BE",X"20",X"05",X"13",X"23", + X"10",X"F8",X"C9",X"AF",X"21",X"00",X"88",X"11",X"01",X"88",X"77",X"ED",X"B0",X"C9",X"21",X"28", + X"89",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"2E",X"20",X"5E",X"23",X"56",X"D5",X"FD",X"E1",X"2A", + X"4B",X"8F",X"7E",X"A7",X"28",X"13",X"FD",X"86",X"05",X"30",X"03",X"FD",X"34",X"06",X"FD",X"77", + X"05",X"23",X"7E",X"23",X"22",X"4B",X"8F",X"18",X"0B",X"FD",X"34",X"09",X"20",X"03",X"FD",X"34", + X"04",X"FD",X"7E",X"09",X"FD",X"86",X"03",X"30",X"03",X"FD",X"34",X"04",X"FD",X"77",X"03",X"3A", + X"4A",X"8F",X"A7",X"FD",X"7E",X"04",X"20",X"1F",X"07",X"07",X"07",X"C6",X"18",X"4F",X"3A",X"84", + X"8A",X"B9",X"30",X"21",X"3E",X"01",X"32",X"24",X"8F",X"32",X"4A",X"8F",X"21",X"48",X"33",X"22", + X"4B",X"8F",X"CD",X"1D",X"0F",X"18",X"0E",X"FE",X"1B",X"38",X"0A",X"32",X"28",X"89",X"21",X"08", + X"8F",X"34",X"CD",X"1D",X"0F",X"FD",X"4E",X"04",X"FD",X"46",X"06",X"DD",X"21",X"20",X"89",X"11", + X"03",X"00",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"19",X"FD",X"7E",X"03",X"77",X"23",X"79",X"77", + X"23",X"FD",X"7E",X"05",X"77",X"23",X"78",X"C6",X"02",X"77",X"DD",X"6E",X"04",X"DD",X"66",X"05", + X"19",X"FD",X"7E",X"03",X"77",X"23",X"79",X"C6",X"02",X"77",X"23",X"FD",X"7E",X"05",X"77",X"23", + X"78",X"77",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"19",X"FD",X"7E",X"03",X"77",X"23",X"79",X"C6", + X"02",X"77",X"23",X"FD",X"7E",X"05",X"77",X"23",X"78",X"C6",X"02",X"77",X"06",X"04",X"DD",X"7E", + X"01",X"FE",X"8C",X"CC",X"4D",X"32",X"DD",X"23",X"DD",X"23",X"10",X"F2",X"C9",X"DD",X"7E",X"00", + X"FE",X"40",X"D8",X"26",X"8C",X"C6",X"05",X"6F",X"7E",X"D6",X"40",X"77",X"D0",X"23",X"35",X"3A", + X"E5",X"89",X"A7",X"20",X"13",X"C9",X"21",X"99",X"07",X"01",X"00",X"20",X"7E",X"81",X"4F",X"23", + X"10",X"FA",X"FE",X"DC",X"C2",X"99",X"07",X"C9",X"AC",X"68",X"21",X"55",X"8F",X"7E",X"A7",X"C0", + X"34",X"21",X"02",X"84",X"11",X"00",X"00",X"7E",X"83",X"5F",X"30",X"01",X"14",X"2C",X"7D",X"E6", + X"1F",X"FE",X"1F",X"20",X"F2",X"7D",X"C6",X"03",X"6F",X"30",X"EC",X"24",X"7C",X"FE",X"88",X"38", + X"E6",X"21",X"EB",X"68",X"06",X"04",X"7B",X"BE",X"28",X"06",X"23",X"10",X"FA",X"C3",X"D4",X"76", + X"7A",X"23",X"BE",X"C8",X"10",X"FA",X"C3",X"29",X"38",X"43",X"95",X"89",X"87",X"3A",X"24",X"8F", + X"A7",X"C8",X"FE",X"02",X"28",X"22",X"D0",X"AF",X"21",X"21",X"8D",X"77",X"23",X"36",X"20",X"CD", + X"AD",X"0F",X"21",X"24",X"8F",X"34",X"21",X"79",X"07",X"01",X"00",X"20",X"7E",X"81",X"4F",X"23", + X"10",X"FA",X"E6",X"47",X"C2",X"40",X"1F",X"C9",X"21",X"84",X"8A",X"34",X"34",X"7E",X"FE",X"DB", + X"30",X"04",X"CD",X"D7",X"23",X"C9",X"CD",X"30",X"0F",X"3A",X"83",X"80",X"A7",X"C0",X"3C",X"32", + X"32",X"8D",X"21",X"24",X"8F",X"34",X"C9",X"01",X"1D",X"00",X"C5",X"06",X"03",X"1A",X"77",X"13", + X"23",X"10",X"FA",X"C1",X"09",X"3A",X"0B",X"8F",X"3C",X"32",X"0B",X"8F",X"FE",X"03",X"20",X"E7", + X"AF",X"32",X"0B",X"8F",X"C9",X"01",X"20",X"00",X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"09", + X"1A",X"77",X"13",X"2B",X"1A",X"77",X"C9",X"02",X"17",X"30",X"40",X"02",X"19",X"35",X"40",X"04", + X"17",X"38",X"40",X"04",X"19",X"3F",X"40",X"FF",X"20",X"00",X"20",X"00",X"20",X"00",X"20",X"00", + X"20",X"10",X"20",X"10",X"20",X"10",X"20",X"10",X"20",X"18",X"20",X"18",X"20",X"18",X"20",X"18", + X"18",X"20",X"18",X"20",X"18",X"20",X"18",X"20",X"10",X"28",X"10",X"28",X"10",X"28",X"10",X"28", + X"10",X"30",X"10",X"30",X"10",X"30",X"00",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"06",X"0E", + X"D9",X"CD",X"8A",X"33",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01", + X"0F",X"D0",X"DD",X"7E",X"02",X"E6",X"1F",X"FE",X"11",X"D0",X"EF",X"BD",X"33",X"23",X"34",X"36", + X"35",X"5B",X"35",X"65",X"38",X"AF",X"39",X"E3",X"3B",X"92",X"3C",X"18",X"3D",X"5C",X"3D",X"8F", + X"3D",X"69",X"3E",X"9C",X"3E",X"5C",X"3F",X"72",X"3F",X"7C",X"3F",X"E9",X"3F",X"DD",X"35",X"11", + X"C0",X"DD",X"34",X"02",X"DD",X"CB",X"0B",X"46",X"20",X"2D",X"3A",X"43",X"8D",X"E6",X"0F",X"21", + X"18",X"34",X"E7",X"32",X"4B",X"8D",X"DD",X"BE",X"06",X"28",X"11",X"3E",X"00",X"11",X"29",X"38", + X"30",X"04",X"3C",X"11",X"38",X"38",X"DD",X"77",X"08",X"C3",X"1E",X"38",X"DD",X"7E",X"09",X"DD", + X"BE",X"05",X"38",X"EF",X"C3",X"73",X"34",X"21",X"4C",X"8D",X"34",X"3E",X"06",X"32",X"01",X"89", + X"AF",X"32",X"4A",X"8D",X"DD",X"77",X"0B",X"CD",X"CA",X"33",X"11",X"47",X"38",X"DD",X"CB",X"08", + X"46",X"28",X"D6",X"11",X"56",X"38",X"18",X"D1",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"00", + X"00",X"00",X"00",X"CD",X"06",X"40",X"DD",X"CB",X"01",X"46",X"28",X"0B",X"3A",X"63",X"8F",X"A7", + X"C0",X"DD",X"36",X"01",X"00",X"18",X"3C",X"DD",X"7E",X"08",X"A7",X"C2",X"F2",X"34",X"DD",X"7E", + X"05",X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"47",X"3A",X"4B",X"8D", + X"4F",X"DD",X"7E",X"06",X"E6",X"1F",X"B9",X"D8",X"28",X"0A",X"DD",X"36",X"08",X"01",X"11",X"38", + X"38",X"C3",X"1E",X"38",X"A7",X"CA",X"B0",X"34",X"3A",X"0A",X"88",X"FE",X"04",X"C0",X"DD",X"7E", + X"09",X"B8",X"D8",X"3A",X"63",X"8F",X"A7",X"CA",X"7F",X"34",X"DD",X"36",X"01",X"01",X"C9",X"DD", + X"36",X"01",X"00",X"21",X"43",X"8D",X"7E",X"FE",X"07",X"30",X"25",X"FE",X"0A",X"30",X"01",X"34", + X"7E",X"21",X"18",X"34",X"E7",X"32",X"4B",X"8D",X"21",X"E3",X"86",X"11",X"40",X"00",X"36",X"D8", + X"23",X"36",X"D9",X"1E",X"1F",X"19",X"36",X"DA",X"23",X"36",X"DB",X"3E",X"01",X"32",X"63",X"8F", + X"CD",X"53",X"35",X"21",X"40",X"8D",X"35",X"21",X"01",X"89",X"7E",X"4F",X"A7",X"28",X"01",X"35", + X"3A",X"0A",X"88",X"FE",X"04",X"20",X"02",X"2C",X"34",X"3A",X"01",X"89",X"47",X"21",X"43",X"87", + X"11",X"20",X"00",X"FE",X"0A",X"38",X"0C",X"3A",X"50",X"8F",X"A7",X"C0",X"AF",X"C6",X"01",X"27", + X"10",X"FB",X"47",X"E6",X"0F",X"77",X"19",X"78",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"A7",X"C8", + X"77",X"C9",X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"05",X"B8",X"30",X"03",X"DD",X"35", + X"06",X"DD",X"86",X"0A",X"DD",X"77",X"05",X"47",X"3A",X"4B",X"8D",X"4F",X"DD",X"7E",X"06",X"E6", + X"1F",X"B9",X"28",X"10",X"D0",X"A7",X"CA",X"B0",X"34",X"3A",X"0A",X"88",X"FE",X"04",X"C0",X"DD", + X"36",X"08",X"00",X"C9",X"A7",X"CA",X"B0",X"34",X"3A",X"0A",X"88",X"FE",X"04",X"C0",X"DD",X"7E", + X"09",X"B8",X"D8",X"C3",X"73",X"34",X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"DD",X"7E",X"07", + X"E6",X"F0",X"28",X"0F",X"21",X"76",X"8D",X"34",X"7E",X"FE",X"03",X"38",X"06",X"2D",X"AF",X"77", + X"32",X"20",X"8F",X"AF",X"DD",X"E5",X"E1",X"06",X"17",X"D7",X"C9",X"CD",X"06",X"40",X"DD",X"7E", + X"08",X"A7",X"C2",X"57",X"37",X"DD",X"7E",X"05",X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"06", + X"DD",X"77",X"05",X"47",X"3A",X"01",X"89",X"FE",X"03",X"DA",X"2D",X"36",X"3A",X"79",X"8D",X"A7", + X"20",X"32",X"21",X"C7",X"35",X"3A",X"07",X"89",X"E6",X"0F",X"CB",X"3F",X"CD",X"45",X"0C",X"EB", + X"3A",X"41",X"8D",X"E6",X"07",X"E7",X"4F",X"DD",X"7E",X"06",X"B9",X"CA",X"17",X"36",X"FE",X"14", + X"D8",X"DD",X"36",X"08",X"01",X"11",X"38",X"38",X"DD",X"CB",X"07",X"4E",X"28",X"03",X"11",X"56", + X"38",X"C3",X"1E",X"38",X"DD",X"CB",X"07",X"56",X"28",X"08",X"2A",X"6F",X"8D",X"3A",X"7B",X"8D", + X"18",X"D3",X"DD",X"7E",X"06",X"18",X"D7",X"D7",X"35",X"DF",X"35",X"E7",X"35",X"EF",X"35",X"F7", + X"35",X"FF",X"35",X"07",X"36",X"0F",X"36",X"09",X"0D",X"11",X"09",X"0D",X"11",X"09",X"0D",X"09", + X"11",X"0D",X"11",X"0D",X"09",X"0D",X"09",X"11",X"0D",X"09",X"11",X"0D",X"09",X"11",X"0D",X"08", + X"0B",X"0F",X"12",X"08",X"12",X"0B",X"0F",X"12",X"0F",X"0B",X"08",X"0F",X"12",X"08",X"0B",X"08", + X"0B",X"0E",X"11",X"0B",X"08",X"11",X"0E",X"11",X"0E",X"0B",X"08",X"0E",X"11",X"0B",X"08",X"08", + X"0B",X"0F",X"12",X"0A",X"11",X"09",X"0D",X"78",X"FE",X"20",X"D0",X"18",X"40",X"DD",X"CB",X"08", + X"46",X"C8",X"C3",X"75",X"37",X"DD",X"CB",X"08",X"46",X"C0",X"C3",X"7C",X"35",X"DD",X"7E",X"06", + X"FE",X"07",X"38",X"E9",X"FE",X"14",X"30",X"ED",X"3A",X"7D",X"8D",X"FE",X"0E",X"38",X"06",X"DD", + X"7E",X"06",X"FE",X"13",X"D8",X"21",X"6B",X"8D",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"78",X"FE", + X"80",X"D0",X"EB",X"21",X"8E",X"36",X"3A",X"07",X"89",X"E6",X"07",X"E7",X"12",X"DD",X"CB",X"0B", + X"46",X"28",X"14",X"21",X"E2",X"8A",X"11",X"18",X"00",X"4A",X"06",X"06",X"7E",X"FE",X"03",X"20", + X"01",X"0C",X"19",X"10",X"F7",X"0D",X"C0",X"FD",X"21",X"70",X"8B",X"11",X"18",X"00",X"06",X"05", + X"FD",X"7E",X"00",X"FD",X"B6",X"01",X"0F",X"30",X"0D",X"FD",X"19",X"10",X"F3",X"C9",X"28",X"28", + X"20",X"20",X"18",X"18",X"10",X"10",X"DD",X"CB",X"07",X"56",X"28",X"13",X"21",X"7B",X"8D",X"34", + X"21",X"79",X"8D",X"7E",X"A7",X"28",X"08",X"35",X"21",X"75",X"8D",X"77",X"2C",X"36",X"00",X"21", + X"41",X"8D",X"34",X"20",X"01",X"34",X"4E",X"DD",X"71",X"14",X"21",X"88",X"39",X"DD",X"CB",X"07", + X"4E",X"28",X"03",X"21",X"94",X"39",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00", + X"DD",X"36",X"11",X"28",X"DD",X"36",X"02",X"04",X"CD",X"DE",X"36",X"C3",X"9D",X"37",X"3A",X"07", + X"89",X"FE",X"10",X"38",X"02",X"3E",X"0E",X"47",X"3A",X"20",X"88",X"87",X"80",X"21",X"37",X"37", + X"E7",X"DD",X"CB",X"16",X"46",X"28",X"0C",X"3D",X"28",X"16",X"DD",X"CB",X"13",X"46",X"28",X"03", + X"3D",X"28",X"0D",X"47",X"DD",X"7E",X"06",X"FE",X"09",X"78",X"30",X"04",X"3D",X"28",X"01",X"3D", + X"47",X"3A",X"01",X"89",X"FE",X"04",X"78",X"30",X"03",X"3E",X"03",X"80",X"21",X"27",X"37",X"E7", + X"DD",X"B6",X"08",X"DD",X"77",X"08",X"C9",X"00",X"10",X"20",X"30",X"40",X"50",X"60",X"70",X"80", + X"90",X"A0",X"B0",X"C0",X"D0",X"E0",X"F0",X"01",X"01",X"02",X"02",X"03",X"02",X"04",X"02",X"05", + X"03",X"05",X"03",X"06",X"03",X"06",X"03",X"07",X"03",X"07",X"03",X"07",X"04",X"07",X"04",X"07", + X"04",X"07",X"04",X"07",X"04",X"07",X"04",X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"05", + X"B8",X"30",X"03",X"DD",X"35",X"06",X"DD",X"86",X"0A",X"DD",X"77",X"05",X"47",X"3A",X"01",X"89", + X"FE",X"03",X"DA",X"2D",X"36",X"3A",X"0A",X"88",X"FE",X"05",X"28",X"19",X"DD",X"7E",X"06",X"FE", + X"02",X"D0",X"DD",X"36",X"08",X"00",X"11",X"29",X"38",X"DD",X"CB",X"07",X"4E",X"28",X"03",X"11", + X"47",X"38",X"C3",X"1E",X"38",X"DD",X"7E",X"06",X"A7",X"C0",X"C3",X"53",X"35",X"FD",X"36",X"00", + X"01",X"FD",X"36",X"02",X"04",X"FD",X"71",X"14",X"AF",X"FD",X"77",X"07",X"FD",X"77",X"0E",X"DD", + X"7E",X"05",X"C6",X"80",X"FD",X"77",X"05",X"DD",X"7E",X"03",X"C6",X"80",X"FD",X"77",X"03",X"DD", + X"7E",X"04",X"D6",X"01",X"FD",X"77",X"04",X"DD",X"7E",X"06",X"C6",X"01",X"FD",X"77",X"06",X"21", + X"A5",X"38",X"3A",X"20",X"88",X"FE",X"07",X"20",X"03",X"21",X"AD",X"38",X"3A",X"00",X"89",X"FE", + X"08",X"38",X"02",X"3E",X"07",X"E7",X"3A",X"07",X"89",X"E6",X"01",X"7E",X"28",X"02",X"ED",X"44", + X"FD",X"77",X"0A",X"DD",X"77",X"0A",X"21",X"B5",X"38",X"DD",X"7E",X"07",X"E6",X"F0",X"0F",X"0F", + X"0F",X"0F",X"CD",X"45",X"0C",X"DD",X"7E",X"0B",X"A7",X"28",X"03",X"11",X"52",X"39",X"FD",X"77", + X"0B",X"FD",X"73",X"0C",X"FD",X"72",X"0D",X"FD",X"36",X"11",X"28",X"C3",X"E3",X"0E",X"DD",X"73", + X"0C",X"DD",X"72",X"0D",X"DD",X"36",X"0E",X"00",X"C9",X"40",X"26",X"07",X"40",X"27",X"07",X"40", + X"28",X"07",X"40",X"27",X"07",X"FF",X"29",X"38",X"C0",X"26",X"07",X"C0",X"27",X"07",X"C0",X"28", + X"07",X"C0",X"27",X"07",X"FF",X"38",X"38",X"44",X"26",X"07",X"44",X"27",X"07",X"44",X"28",X"07", + X"44",X"27",X"07",X"FF",X"47",X"38",X"C4",X"26",X"07",X"C4",X"27",X"07",X"C4",X"28",X"07",X"C4", + X"27",X"07",X"FF",X"56",X"38",X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"DD",X"34",X"02",X"DD", + X"CB",X"08",X"86",X"DD",X"E5",X"E1",X"7C",X"FE",X"8B",X"D8",X"7D",X"FE",X"70",X"D8",X"DD",X"35", + X"04",X"DD",X"35",X"06",X"3A",X"5F",X"8A",X"A7",X"C0",X"21",X"82",X"42",X"0E",X"00",X"59",X"7E", + X"2B",X"81",X"4F",X"30",X"01",X"1C",X"3E",X"1A",X"BE",X"20",X"F4",X"7B",X"81",X"E6",X"9E",X"C8", + X"21",X"F0",X"8E",X"34",X"C9",X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17",X"13",X"14",X"15", + X"16",X"17",X"17",X"17",X"17",X"CB",X"38",X"DA",X"38",X"E9",X"38",X"F8",X"38",X"07",X"39",X"16", + X"39",X"25",X"39",X"25",X"39",X"25",X"39",X"34",X"39",X"43",X"39",X"40",X"2D",X"12",X"40",X"02", + X"0C",X"40",X"3B",X"06",X"40",X"A1",X"E0",X"FF",X"D4",X"38",X"41",X"2D",X"12",X"41",X"02",X"0C", + X"41",X"3B",X"06",X"41",X"A1",X"E0",X"FF",X"E3",X"38",X"44",X"2D",X"12",X"44",X"02",X"0C",X"44", + X"3B",X"06",X"44",X"A1",X"E0",X"FF",X"F2",X"38",X"49",X"2D",X"12",X"49",X"02",X"0C",X"49",X"3B", + X"06",X"49",X"A1",X"E0",X"FF",X"01",X"39",X"4A",X"2D",X"12",X"4A",X"02",X"0C",X"4A",X"3B",X"06", + X"4A",X"A1",X"E0",X"FF",X"10",X"39",X"41",X"2D",X"12",X"41",X"02",X"0C",X"41",X"3B",X"06",X"41", + X"A1",X"E0",X"FF",X"1F",X"39",X"44",X"2D",X"12",X"44",X"02",X"0C",X"44",X"3B",X"06",X"44",X"A1", + X"E0",X"FF",X"2E",X"39",X"4E",X"2D",X"12",X"4E",X"02",X"0C",X"4E",X"3B",X"06",X"4E",X"A1",X"E0", + X"FF",X"3D",X"39",X"4F",X"2D",X"12",X"4F",X"02",X"0C",X"4F",X"3B",X"06",X"4F",X"A1",X"E0",X"FF", + X"4C",X"39",X"44",X"2D",X"12",X"44",X"02",X"0C",X"44",X"3B",X"06",X"44",X"A1",X"08",X"4B",X"A1", + X"08",X"4C",X"A1",X"08",X"4F",X"A1",X"08",X"FF",X"5B",X"39",X"40",X"2A",X"12",X"40",X"2B",X"18", + X"40",X"29",X"20",X"40",X"1F",X"10",X"FF",X"70",X"39",X"44",X"2A",X"12",X"44",X"2B",X"18",X"44", + X"29",X"20",X"44",X"1F",X"10",X"FF",X"7F",X"39",X"40",X"26",X"28",X"40",X"29",X"20",X"40",X"1F", + X"10",X"FF",X"8B",X"39",X"44",X"26",X"28",X"44",X"29",X"20",X"44",X"1F",X"10",X"FF",X"97",X"39", + X"40",X"2A",X"12",X"40",X"2B",X"18",X"40",X"06",X"10",X"40",X"0B",X"10",X"FF",X"A6",X"39",X"CD", + X"06",X"40",X"3A",X"07",X"89",X"E6",X"01",X"CA",X"87",X"3B",X"DD",X"7E",X"0A",X"ED",X"44",X"47", + X"DD",X"7E",X"03",X"B8",X"30",X"03",X"DD",X"35",X"04",X"DD",X"86",X"0A",X"DD",X"77",X"03",X"DD", + X"46",X"04",X"DD",X"7E",X"07",X"A7",X"28",X"79",X"78",X"FE",X"04",X"38",X"6B",X"FE",X"10",X"D8", + X"21",X"7D",X"8D",X"7E",X"FE",X"0E",X"30",X"20",X"3A",X"07",X"89",X"FE",X"06",X"30",X"0C",X"3A", + X"08",X"89",X"FE",X"03",X"38",X"05",X"7E",X"FE",X"08",X"30",X"0D",X"3A",X"20",X"88",X"FE",X"07", + X"28",X"06",X"DD",X"7E",X"06",X"FE",X"10",X"D0",X"3A",X"75",X"8D",X"A7",X"C0",X"DD",X"7E",X"08", + X"E6",X"F0",X"C8",X"DD",X"7E",X"15",X"A7",X"28",X"04",X"DD",X"35",X"15",X"C9",X"3A",X"42",X"88", + X"4F",X"3A",X"1F",X"88",X"47",X"A7",X"79",X"20",X"02",X"ED",X"44",X"0F",X"0F",X"0F",X"E6",X"1F", + X"4F",X"78",X"A7",X"20",X"02",X"0D",X"0D",X"3A",X"07",X"89",X"47",X"CB",X"47",X"79",X"28",X"02", + X"C6",X"04",X"DD",X"BE",X"04",X"28",X"25",X"C9",X"DD",X"36",X"02",X"00",X"DD",X"36",X"11",X"20", + X"C9",X"78",X"FE",X"02",X"D0",X"11",X"D1",X"3B",X"CD",X"1E",X"38",X"DD",X"36",X"02",X"02",X"DD", + X"36",X"11",X"28",X"C9",X"10",X"15",X"0D",X"1B",X"0F",X"11",X"13",X"1C",X"21",X"42",X"8D",X"34", + X"FD",X"21",X"E8",X"8B",X"06",X"03",X"11",X"18",X"00",X"FD",X"7E",X"00",X"FD",X"B6",X"01",X"0F", + X"30",X"05",X"FD",X"19",X"10",X"F3",X"C9",X"DD",X"7E",X"06",X"D6",X"06",X"CB",X"3F",X"E6",X"07", + X"4F",X"21",X"57",X"3B",X"3A",X"07",X"89",X"CB",X"47",X"28",X"03",X"21",X"47",X"3B",X"79",X"CD", + X"45",X"0C",X"1A",X"FD",X"77",X"12",X"13",X"1A",X"FD",X"77",X"13",X"FD",X"CB",X"08",X"C6",X"11", + X"6A",X"39",X"DD",X"CB",X"07",X"4E",X"28",X"03",X"11",X"79",X"39",X"DD",X"7E",X"16",X"E6",X"30", + X"FE",X"30",X"20",X"03",X"11",X"A0",X"39",X"CD",X"1E",X"38",X"DD",X"7E",X"08",X"D6",X"10",X"DD", + X"77",X"08",X"FD",X"36",X"00",X"01",X"FD",X"36",X"02",X"0B",X"FD",X"36",X"07",X"01",X"3A",X"50", + X"8F",X"A7",X"11",X"DD",X"3B",X"28",X"0D",X"11",X"3B",X"43",X"3A",X"07",X"89",X"CB",X"57",X"28", + X"03",X"11",X"41",X"43",X"FD",X"73",X"0C",X"FD",X"72",X"0D",X"FD",X"36",X"0E",X"00",X"FD",X"36", + X"16",X"00",X"FD",X"36",X"11",X"13",X"DD",X"E5",X"E1",X"FD",X"75",X"14",X"FD",X"74",X"15",X"21", + X"6C",X"8D",X"34",X"7E",X"E6",X"07",X"57",X"21",X"37",X"3B",X"3A",X"07",X"89",X"CB",X"47",X"28", + X"03",X"21",X"3F",X"3B",X"7A",X"E7",X"DD",X"77",X"15",X"C9",X"00",X"01",X"01",X"04",X"04",X"04", + X"07",X"0A",X"0D",X"0D",X"0D",X"0D",X"0D",X"20",X"1C",X"18",X"20",X"28",X"30",X"18",X"30",X"20", + X"22",X"24",X"26",X"28",X"30",X"28",X"30",X"67",X"3B",X"69",X"3B",X"6B",X"3B",X"6D",X"3B",X"6F", + X"3B",X"71",X"3B",X"73",X"3B",X"75",X"3B",X"77",X"3B",X"79",X"3B",X"7B",X"3B",X"7D",X"3B",X"7F", + X"3B",X"81",X"3B",X"83",X"3B",X"85",X"3B",X"40",X"48",X"40",X"48",X"40",X"40",X"40",X"44",X"40", + X"48",X"40",X"50",X"40",X"58",X"40",X"30",X"40",X"20",X"40",X"20",X"40",X"1C",X"40",X"1C",X"40", + X"1C",X"40",X"18",X"40",X"18",X"40",X"38",X"DD",X"CB",X"08",X"46",X"C2",X"BA",X"39",X"DD",X"7E", + X"03",X"DD",X"86",X"0A",X"30",X"03",X"DD",X"34",X"04",X"DD",X"77",X"03",X"DD",X"46",X"04",X"DD", + X"7E",X"07",X"A7",X"CA",X"CA",X"3B",X"78",X"FE",X"1D",X"30",X"03",X"C3",X"E0",X"39",X"DD",X"34", + X"02",X"AF",X"DD",X"77",X"00",X"DD",X"36",X"01",X"01",X"DD",X"CB",X"08",X"86",X"DD",X"36",X"09", + X"20",X"DD",X"77",X"14",X"11",X"29",X"38",X"C3",X"1E",X"38",X"78",X"FE",X"1B",X"D4",X"53",X"35", + X"C9",X"40",X"34",X"07",X"40",X"33",X"08",X"40",X"32",X"09",X"40",X"31",X"20",X"40",X"00",X"F0", + X"FF",X"DD",X"3B",X"CD",X"06",X"40",X"DD",X"CB",X"08",X"46",X"20",X"24",X"DD",X"7E",X"05",X"DD", + X"86",X"09",X"30",X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"47",X"DD",X"7E",X"06",X"FE",X"1F", + X"D8",X"18",X"38",X"DD",X"34",X"02",X"DD",X"36",X"11",X"20",X"3E",X"28",X"32",X"5E",X"8D",X"C9", + X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"05",X"B8",X"30",X"03",X"DD",X"35",X"06",X"DD", + X"86",X"0A",X"DD",X"77",X"05",X"47",X"DD",X"6E",X"14",X"DD",X"66",X"15",X"E5",X"FD",X"E1",X"FD", + X"77",X"05",X"DD",X"7E",X"06",X"FD",X"77",X"06",X"E6",X"1F",X"C0",X"21",X"03",X"89",X"34",X"21", + X"40",X"8D",X"35",X"2E",X"7D",X"34",X"DD",X"7E",X"07",X"E6",X"F0",X"CA",X"53",X"35",X"CD",X"53", + X"35",X"3A",X"7E",X"8D",X"A7",X"C0",X"21",X"76",X"8D",X"34",X"7E",X"FE",X"02",X"D8",X"2D",X"AF", + X"77",X"32",X"20",X"8F",X"32",X"6D",X"8D",X"32",X"6E",X"8D",X"3E",X"02",X"32",X"07",X"8D",X"32", + X"7E",X"8D",X"3A",X"1F",X"88",X"A7",X"C0",X"3A",X"01",X"89",X"FE",X"10",X"D0",X"11",X"D5",X"01", + X"01",X"12",X"00",X"1A",X"1B",X"80",X"47",X"0D",X"20",X"F9",X"FE",X"55",X"C8",X"21",X"ED",X"89", + X"34",X"C9",X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"FD",X"21",X"30",X"8C",X"11",X"18",X"00", + X"06",X"04",X"CD",X"AE",X"3C",X"FD",X"19",X"10",X"F9",X"DD",X"36",X"11",X"10",X"C9",X"FD",X"7E", + X"00",X"FD",X"B6",X"01",X"0F",X"C0",X"FD",X"36",X"01",X"01",X"AF",X"FD",X"36",X"02",X"10",X"21", + X"0F",X"3D",X"FD",X"75",X"0C",X"FD",X"74",X"0D",X"FD",X"77",X"0E",X"DD",X"36",X"02",X"06",X"DD", + X"36",X"08",X"01",X"DD",X"36",X"0A",X"E8",X"11",X"38",X"38",X"CD",X"1E",X"38",X"DD",X"7E",X"04", + X"D6",X"01",X"FD",X"77",X"04",X"DD",X"7E",X"03",X"FD",X"77",X"03",X"DD",X"7E",X"06",X"C6",X"01", + X"FD",X"77",X"06",X"DD",X"7E",X"05",X"FD",X"77",X"05",X"FD",X"36",X"08",X"01",X"FD",X"36",X"0A", + X"E8",X"CD",X"3C",X"40",X"FD",X"E5",X"E1",X"DD",X"75",X"14",X"DD",X"74",X"15",X"F1",X"C9",X"40", + X"83",X"10",X"40",X"89",X"10",X"FF",X"0F",X"3D",X"06",X"20",X"DD",X"4E",X"17",X"3A",X"45",X"8D", + X"A7",X"28",X"18",X"DD",X"4E",X"12",X"0C",X"28",X"12",X"FE",X"04",X"38",X"02",X"3E",X"03",X"47", + X"C6",X"06",X"4F",X"11",X"0F",X"03",X"83",X"5F",X"FF",X"06",X"38",X"DD",X"70",X"11",X"79",X"DD", + X"CB",X"07",X"4E",X"28",X"0B",X"0C",X"3A",X"45",X"8D",X"A7",X"79",X"28",X"03",X"3E",X"03",X"81", + X"21",X"D3",X"3D",X"CD",X"45",X"0C",X"CD",X"1E",X"38",X"DD",X"34",X"02",X"CD",X"06",X"40",X"DD", + X"35",X"11",X"C0",X"DD",X"7E",X"16",X"FE",X"07",X"CA",X"99",X"3D",X"4F",X"A7",X"28",X"01",X"3D", + X"11",X"12",X"03",X"83",X"5F",X"FF",X"21",X"49",X"3E",X"79",X"FE",X"04",X"20",X"0A",X"CD",X"45", + X"0C",X"CD",X"1E",X"38",X"DD",X"36",X"11",X"30",X"0C",X"DD",X"71",X"13",X"DD",X"34",X"02",X"CD", + X"06",X"40",X"DD",X"35",X"11",X"C0",X"C3",X"53",X"35",X"21",X"76",X"40",X"DD",X"7E",X"07",X"E6", + X"03",X"3D",X"CD",X"45",X"0C",X"CD",X"1E",X"38",X"DD",X"36",X"09",X"40",X"DD",X"36",X"02",X"0F", + X"C3",X"D6",X"0E",X"BB",X"3D",X"C1",X"3D",X"C7",X"3D",X"CD",X"3D",X"42",X"30",X"F0",X"FF",X"BB", + X"3D",X"41",X"30",X"F0",X"FF",X"C1",X"3D",X"49",X"30",X"F0",X"FF",X"C7",X"3D",X"40",X"30",X"F0", + X"FF",X"CD",X"3D",X"EF",X"3D",X"EF",X"3D",X"EF",X"3D",X"FB",X"3D",X"07",X"3E",X"7A",X"40",X"8F", + X"40",X"13",X"3E",X"1C",X"3E",X"25",X"3E",X"25",X"3E",X"2E",X"3E",X"37",X"3E",X"40",X"3E",X"44", + X"34",X"05",X"44",X"33",X"06",X"44",X"32",X"07",X"44",X"31",X"12",X"40",X"34",X"05",X"40",X"33", + X"06",X"40",X"32",X"07",X"40",X"31",X"12",X"40",X"34",X"05",X"40",X"33",X"06",X"40",X"32",X"07", + X"40",X"31",X"12",X"80",X"01",X"05",X"40",X"1D",X"05",X"43",X"39",X"28",X"80",X"01",X"04",X"40", + X"1D",X"04",X"42",X"39",X"28",X"80",X"01",X"03",X"40",X"1D",X"03",X"4F",X"3A",X"38",X"84",X"01", + X"05",X"44",X"1D",X"05",X"43",X"39",X"28",X"84",X"01",X"04",X"44",X"1D",X"04",X"42",X"39",X"28", + X"84",X"01",X"03",X"44",X"1D",X"03",X"4F",X"3A",X"38",X"5D",X"3E",X"5D",X"3E",X"5D",X"3E",X"5D", + X"3E",X"5D",X"3E",X"63",X"3E",X"66",X"3E",X"66",X"3E",X"66",X"3E",X"66",X"3E",X"42",X"37",X"40", + X"43",X"39",X"40",X"42",X"39",X"40",X"4F",X"3B",X"48",X"DD",X"35",X"11",X"C0",X"DD",X"6E",X"14", + X"DD",X"66",X"15",X"2C",X"2C",X"7E",X"FE",X"05",X"DA",X"53",X"35",X"FE",X"07",X"D2",X"53",X"35", + X"2C",X"7E",X"DD",X"77",X"03",X"2C",X"7E",X"3D",X"DD",X"77",X"04",X"2C",X"7E",X"DD",X"77",X"05", + X"2C",X"7E",X"DD",X"77",X"06",X"DD",X"36",X"15",X"00",X"DD",X"34",X"02",X"CD",X"06",X"40",X"DD", + X"CB",X"01",X"46",X"C2",X"1D",X"3F",X"DD",X"6E",X"12",X"DD",X"66",X"13",X"DD",X"7E",X"05",X"85", + X"DD",X"77",X"05",X"30",X"03",X"DD",X"34",X"06",X"DD",X"CB",X"08",X"46",X"28",X"43",X"7C",X"D6", + X"02",X"38",X"35",X"67",X"DD",X"7E",X"03",X"94",X"DD",X"77",X"03",X"30",X"03",X"DD",X"35",X"04", + X"DD",X"74",X"13",X"DD",X"7E",X"06",X"E6",X"1F",X"FE",X"1A",X"D8",X"DD",X"7E",X"05",X"FE",X"A0", + X"D0",X"11",X"B4",X"40",X"CD",X"1E",X"38",X"DD",X"36",X"11",X"0A",X"DD",X"36",X"02",X"02",X"DD", + X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"C9",X"DD",X"CB",X"08",X"86",X"AF",X"DD",X"77",X"13", + X"C9",X"DD",X"34",X"16",X"DD",X"7E",X"16",X"E6",X"03",X"C8",X"7C",X"C6",X"01",X"DD",X"77",X"13", + X"DD",X"86",X"03",X"DD",X"77",X"03",X"30",X"03",X"DD",X"34",X"04",X"18",X"B6",X"DD",X"6E",X"12", + X"DD",X"66",X"13",X"7E",X"4F",X"FE",X"EE",X"20",X"01",X"23",X"46",X"DD",X"7E",X"05",X"90",X"DD", + X"77",X"05",X"30",X"03",X"DD",X"35",X"06",X"23",X"7E",X"DD",X"86",X"03",X"DD",X"77",X"03",X"30", + X"03",X"DD",X"34",X"04",X"23",X"79",X"FE",X"EE",X"20",X"03",X"2B",X"2B",X"2B",X"DD",X"75",X"12", + X"DD",X"74",X"13",X"DD",X"7E",X"04",X"FE",X"1E",X"D8",X"C3",X"E1",X"3E",X"21",X"72",X"40",X"DD", + X"7E",X"07",X"E6",X"03",X"3D",X"CD",X"45",X"0C",X"CD",X"1E",X"38",X"DD",X"36",X"09",X"40",X"DD", + X"34",X"02",X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"DD",X"34",X"02",X"CD",X"06",X"40",X"CD", + X"D5",X"3F",X"D8",X"21",X"A4",X"40",X"DD",X"7E",X"07",X"E6",X"03",X"3D",X"CD",X"45",X"0C",X"CD", + X"1E",X"38",X"DD",X"36",X"02",X"02",X"DD",X"36",X"11",X"20",X"CD",X"DA",X"0E",X"21",X"40",X"8D", + X"35",X"21",X"01",X"89",X"DD",X"CB",X"0B",X"46",X"20",X"07",X"7E",X"A7",X"C8",X"35",X"C3",X"C9", + X"34",X"36",X"00",X"3E",X"01",X"CD",X"C9",X"34",X"01",X"8B",X"42",X"2E",X"00",X"65",X"0A",X"FE", + X"C8",X"28",X"08",X"84",X"30",X"01",X"2C",X"67",X"0B",X"18",X"F3",X"95",X"FE",X"C0",X"C8",X"3E", + X"01",X"32",X"EB",X"89",X"C9",X"DD",X"7E",X"03",X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"04", + X"DD",X"77",X"03",X"DD",X"7E",X"04",X"FE",X"1E",X"C9",X"11",X"80",X"77",X"01",X"10",X"00",X"1A", + X"1B",X"80",X"47",X"0D",X"20",X"F9",X"CB",X"40",X"20",X"07",X"CB",X"68",X"28",X"03",X"CB",X"78", + X"C0",X"21",X"39",X"8A",X"34",X"C9",X"DD",X"7E",X"0E",X"A7",X"28",X"04",X"DD",X"35",X"0E",X"C9", + X"DD",X"6E",X"0C",X"DD",X"66",X"0D",X"7E",X"FE",X"FF",X"28",X"15",X"DD",X"77",X"10",X"23",X"7E", + X"DD",X"77",X"0F",X"23",X"7E",X"DD",X"77",X"0E",X"23",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"C9", + X"23",X"7E",X"DD",X"77",X"0C",X"23",X"7E",X"DD",X"77",X"0D",X"18",X"D4",X"FD",X"7E",X"0E",X"A7", + X"28",X"04",X"FD",X"35",X"0E",X"C9",X"FD",X"6E",X"0C",X"FD",X"66",X"0D",X"7E",X"FE",X"FF",X"28", + X"15",X"FD",X"77",X"10",X"23",X"7E",X"FD",X"77",X"0F",X"23",X"7E",X"FD",X"77",X"0E",X"23",X"FD", + X"75",X"0C",X"FD",X"74",X"0D",X"C9",X"23",X"7E",X"FD",X"77",X"0C",X"23",X"7E",X"FD",X"77",X"0D", + X"18",X"D4",X"7A",X"40",X"8F",X"40",X"86",X"40",X"9B",X"40",X"80",X"01",X"08",X"40",X"1D",X"08", + X"80",X"01",X"08",X"40",X"1D",X"08",X"40",X"01",X"08",X"80",X"1D",X"08",X"FF",X"86",X"40",X"84", + X"01",X"08",X"44",X"1D",X"08",X"84",X"01",X"08",X"44",X"1D",X"08",X"44",X"01",X"08",X"84",X"1D", + X"08",X"FF",X"9B",X"40",X"A8",X"40",X"AE",X"40",X"40",X"19",X"28",X"40",X"19",X"38",X"44",X"19", + X"28",X"44",X"19",X"30",X"45",X"34",X"05",X"45",X"33",X"05",X"FF",X"B4",X"40",X"DD",X"21",X"30", + X"8C",X"11",X"18",X"00",X"06",X"04",X"D9",X"CD",X"D0",X"40",X"D9",X"DD",X"19",X"10",X"F7",X"C9", + X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"E6",X"1F",X"FE",X"11",X"D0", + X"EF",X"03",X"41",X"37",X"41",X"6F",X"41",X"79",X"41",X"79",X"41",X"79",X"41",X"79",X"41",X"79", + X"41",X"7A",X"41",X"8D",X"41",X"79",X"41",X"21",X"42",X"50",X"43",X"64",X"43",X"78",X"43",X"78", + X"43",X"78",X"43",X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"DD",X"34",X"02",X"DD",X"36",X"13", + X"00",X"3A",X"5F",X"8A",X"A7",X"C0",X"21",X"7F",X"55",X"06",X"38",X"AF",X"57",X"5A",X"7E",X"E6", + X"0F",X"83",X"5F",X"30",X"01",X"14",X"23",X"10",X"F5",X"3E",X"67",X"BB",X"20",X"04",X"3E",X"01", + X"92",X"C8",X"21",X"38",X"8A",X"34",X"C9",X"CD",X"06",X"40",X"DD",X"7E",X"0A",X"ED",X"44",X"47", + X"DD",X"7E",X"03",X"B8",X"30",X"03",X"DD",X"35",X"04",X"DD",X"86",X"0A",X"DD",X"77",X"03",X"47", + X"DD",X"7E",X"04",X"FE",X"03",X"D0",X"DD",X"7E",X"17",X"3C",X"32",X"1D",X"8D",X"3D",X"DD",X"36", + X"02",X"02",X"DD",X"36",X"11",X"18",X"21",X"B1",X"41",X"CD",X"45",X"0C",X"C3",X"1E",X"38",X"CD", + X"06",X"40",X"DD",X"35",X"11",X"C0",X"C3",X"53",X"35",X"C9",X"DD",X"7E",X"17",X"21",X"B1",X"41", + X"CD",X"45",X"0C",X"CD",X"1E",X"38",X"DD",X"36",X"11",X"30",X"DD",X"34",X"02",X"CD",X"06",X"40", + X"DD",X"35",X"11",X"C0",X"DD",X"7E",X"16",X"4F",X"A7",X"28",X"01",X"3D",X"11",X"12",X"03",X"83", + X"5F",X"FF",X"DD",X"36",X"11",X"01",X"0C",X"DD",X"71",X"13",X"DD",X"36",X"02",X"02",X"C3",X"6F", + X"41",X"BB",X"41",X"CA",X"41",X"D9",X"41",X"E8",X"41",X"F7",X"41",X"44",X"34",X"05",X"44",X"33", + X"06",X"44",X"32",X"07",X"44",X"31",X"08",X"43",X"37",X"38",X"41",X"34",X"05",X"41",X"33",X"06", + X"41",X"32",X"07",X"41",X"31",X"08",X"43",X"37",X"38",X"49",X"34",X"05",X"49",X"33",X"06",X"49", + X"32",X"07",X"49",X"31",X"08",X"43",X"37",X"38",X"40",X"34",X"05",X"40",X"33",X"06",X"40",X"32", + X"07",X"40",X"31",X"08",X"48",X"37",X"38",X"47",X"34",X"05",X"47",X"33",X"06",X"47",X"32",X"07", + X"47",X"31",X"12",X"44",X"26",X"09",X"44",X"27",X"09",X"44",X"28",X"09",X"44",X"27",X"09",X"FF", + X"03",X"42",X"C4",X"26",X"09",X"C4",X"27",X"09",X"C4",X"28",X"09",X"C4",X"27",X"09",X"FF",X"12", + X"42",X"CD",X"06",X"40",X"DD",X"CB",X"08",X"46",X"20",X"1A",X"CD",X"3E",X"34",X"DD",X"7E",X"06", + X"E6",X"1F",X"FE",X"14",X"38",X"5A",X"DD",X"36",X"08",X"01",X"11",X"12",X"42",X"AF",X"32",X"4B", + X"8D",X"C3",X"1E",X"38",X"CD",X"F2",X"34",X"DD",X"7E",X"06",X"E6",X"1F",X"FE",X"0A",X"30",X"40", + X"47",X"3A",X"01",X"89",X"FE",X"02",X"38",X"0E",X"DD",X"36",X"08",X"00",X"11",X"03",X"42",X"3E", + X"FF",X"32",X"4B",X"8D",X"18",X"DB",X"78",X"FE",X"02",X"D0",X"CD",X"53",X"35",X"11",X"B9",X"0B", + X"21",X"83",X"42",X"1A",X"86",X"20",X"07",X"1B",X"23",X"7E",X"3C",X"C8",X"18",X"F5",X"21",X"3A", + X"8A",X"34",X"C9",X"E0",X"59",X"78",X"FA",X"C6",X"7A",X"B5",X"7A",X"B2",X"7A",X"AD",X"7A",X"FF", + X"FE",X"05",X"D8",X"21",X"5B",X"8D",X"7E",X"A7",X"20",X"2F",X"2B",X"7E",X"A7",X"28",X"02",X"35", + X"C9",X"3A",X"01",X"89",X"FE",X"08",X"11",X"18",X"00",X"38",X"15",X"FD",X"21",X"E0",X"8A",X"3A", + X"5C",X"8D",X"47",X"4F",X"FD",X"7E",X"04",X"FE",X"07",X"28",X"05",X"FD",X"19",X"10",X"F5",X"C9", + X"3A",X"5D",X"8D",X"32",X"5A",X"8D",X"32",X"5B",X"8D",X"FD",X"21",X"48",X"8C",X"06",X"03",X"CD", + X"DA",X"42",X"11",X"18",X"00",X"FD",X"19",X"10",X"F6",X"C9",X"FD",X"7E",X"00",X"FD",X"B6",X"01", + X"0F",X"D8",X"FD",X"36",X"00",X"01",X"FD",X"36",X"02",X"0D",X"DD",X"E5",X"E1",X"FD",X"E5",X"D1", + X"2C",X"2C",X"2C",X"1C",X"1C",X"1C",X"01",X"04",X"00",X"ED",X"B0",X"3E",X"2A",X"FD",X"77",X"09", + X"ED",X"44",X"FD",X"77",X"0A",X"21",X"2D",X"43",X"3A",X"07",X"89",X"CB",X"3F",X"3D",X"E6",X"03", + X"CD",X"45",X"0C",X"CD",X"75",X"5C",X"AF",X"32",X"5B",X"8D",X"11",X"47",X"43",X"CD",X"1E",X"38", + X"DD",X"36",X"11",X"30",X"FD",X"36",X"11",X"04",X"DD",X"34",X"02",X"F1",X"C9",X"35",X"43",X"41", + X"43",X"3B",X"43",X"41",X"43",X"46",X"1C",X"F0",X"FF",X"35",X"43",X"46",X"1C",X"F0",X"FF",X"3B", + X"43",X"47",X"1C",X"F0",X"FF",X"41",X"43",X"44",X"2C",X"30",X"44",X"20",X"F0",X"FF",X"4A",X"43", + X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"DD",X"35",X"02",X"DD",X"CB",X"08",X"46",X"CA",X"5C", + X"42",X"C3",X"3A",X"42",X"DD",X"7E",X"11",X"A7",X"28",X"04",X"DD",X"35",X"11",X"C9",X"CD",X"06", + X"40",X"CD",X"D5",X"3F",X"D8",X"C3",X"53",X"35",X"C9",X"10",X"11",X"12",X"13",X"14",X"15",X"16", + X"17",X"06",X"1D",X"3A",X"20",X"89",X"2A",X"43",X"8F",X"ED",X"5B",X"45",X"8F",X"A7",X"28",X"07", + X"2A",X"B8",X"88",X"ED",X"5B",X"BA",X"88",X"1A",X"FE",X"10",X"28",X"22",X"FE",X"FF",X"28",X"2E", + X"77",X"13",X"23",X"10",X"F2",X"23",X"23",X"23",X"3A",X"20",X"89",X"A7",X"20",X"08",X"22",X"43", + X"8F",X"ED",X"53",X"45",X"8F",X"C9",X"22",X"B8",X"88",X"ED",X"53",X"BA",X"88",X"C9",X"13",X"1A", + X"4F",X"85",X"30",X"01",X"24",X"6F",X"13",X"78",X"91",X"47",X"20",X"CB",X"18",X"D7",X"13",X"1A", + X"6F",X"13",X"1A",X"67",X"13",X"1A",X"4F",X"3A",X"B7",X"88",X"81",X"32",X"B7",X"88",X"13",X"18", + X"C7",X"10",X"10",X"63",X"31",X"4F",X"4F",X"3C",X"75",X"10",X"07",X"10",X"0F",X"46",X"C6",X"30", + X"3D",X"81",X"3C",X"75",X"10",X"07",X"10",X"10",X"2E",X"32",X"42",X"BD",X"3C",X"75",X"10",X"07", + X"10",X"0F",X"46",X"2E",X"32",X"3D",X"81",X"3C",X"75",X"10",X"07",X"10",X"10",X"33",X"30",X"42", + X"BD",X"3C",X"75",X"10",X"07",X"10",X"11",X"6D",X"58",X"58",X"3C",X"75",X"10",X"07",X"10",X"13", + X"71",X"3C",X"75",X"10",X"07",X"10",X"13",X"71",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75", + X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14", + X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07", + X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75", + X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"13", + X"71",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10", + X"07",X"10",X"13",X"71",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14", + X"3C",X"75",X"10",X"07",X"10",X"13",X"71",X"3C",X"75",X"10",X"07",X"10",X"13",X"71",X"3C",X"75", + X"10",X"07",X"10",X"13",X"71",X"3C",X"75",X"10",X"07",X"10",X"07",X"57",X"67",X"4C",X"55",X"67", + X"72",X"55",X"67",X"4C",X"4C",X"31",X"4F",X"4F",X"3C",X"75",X"10",X"07",X"10",X"06",X"71",X"57", + X"6B",X"73",X"68",X"6B",X"73",X"68",X"6B",X"73",X"C6",X"30",X"3D",X"81",X"3C",X"75",X"10",X"07", + X"10",X"07",X"57",X"6A",X"39",X"67",X"6A",X"39",X"67",X"6A",X"39",X"2E",X"32",X"42",X"BD",X"3C", + X"75",X"10",X"07",X"10",X"07",X"66",X"69",X"3A",X"66",X"69",X"3A",X"66",X"69",X"3A",X"2E",X"32", + X"3D",X"81",X"3C",X"75",X"10",X"07",X"10",X"10",X"33",X"30",X"42",X"BD",X"3C",X"75",X"10",X"07", + X"10",X"11",X"6D",X"58",X"58",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10", + X"13",X"71",X"3C",X"75",X"10",X"07",X"10",X"01",X"A5",X"A4",X"10",X"11",X"3C",X"75",X"10",X"07", + X"10",X"01",X"A4",X"A5",X"10",X"11",X"3C",X"75",X"10",X"07",X"10",X"01",X"0C",X"3B",X"10",X"10", + X"71",X"3C",X"75",X"10",X"07",X"10",X"01",X"0C",X"3B",X"10",X"11",X"3C",X"75",X"10",X"07",X"10", + X"01",X"0E",X"0F",X"10",X"11",X"3C",X"75",X"10",X"07",X"10",X"01",X"0E",X"0F",X"10",X"04",X"87", + X"87",X"10",X"0B",X"3C",X"75",X"10",X"07",X"10",X"01",X"0C",X"0C",X"10",X"04",X"9B",X"9D",X"88", + X"10",X"0A",X"3C",X"75",X"10",X"07",X"10",X"01",X"0C",X"0C",X"10",X"04",X"9C",X"82",X"88",X"10", + X"0A",X"3C",X"75",X"10",X"07",X"10",X"01",X"0C",X"0C",X"10",X"04",X"79",X"79",X"88",X"10",X"0A", + X"3C",X"75",X"10",X"07",X"10",X"01",X"0C",X"0C",X"10",X"04",X"9C",X"82",X"87",X"10",X"0A",X"3C", + X"75",X"10",X"07",X"10",X"01",X"0C",X"0C",X"10",X"04",X"85",X"76",X"87",X"10",X"0A",X"3C",X"75", + X"10",X"07",X"10",X"01",X"0C",X"0D",X"10",X"04",X"9C",X"79",X"87",X"10",X"0A",X"3C",X"75",X"10", + X"07",X"10",X"07",X"9C",X"76",X"9B",X"10",X"0A",X"3C",X"75",X"10",X"07",X"10",X"07",X"85",X"76", + X"9B",X"10",X"0A",X"3C",X"75",X"10",X"07",X"10",X"07",X"85",X"76",X"9D",X"88",X"10",X"09",X"3C", + X"75",X"10",X"07",X"10",X"07",X"7E",X"7B",X"8F",X"8C",X"10",X"08",X"8B",X"3C",X"75",X"10",X"07", + X"10",X"07",X"7F",X"7B",X"7C",X"76",X"87",X"10",X"02",X"89",X"86",X"10",X"02",X"86",X"8A",X"3C", + X"75",X"10",X"07",X"10",X"07",X"85",X"7E",X"7B",X"7C",X"76",X"91",X"83",X"84",X"9E",X"92",X"96", + X"9E",X"38",X"3C",X"75",X"10",X"07",X"10",X"07",X"9C",X"8E",X"7A",X"78",X"76",X"93",X"9F",X"94", + X"97",X"94",X"99",X"97",X"97",X"3C",X"75",X"10",X"07",X"10",X"07",X"7E",X"7A",X"7A",X"8E",X"76", + X"93",X"64",X"98",X"98",X"95",X"95",X"98",X"95",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75", + X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14", + X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07", + X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"13",X"71",X"3C", + X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10", + X"14",X"3C",X"75",X"10",X"07",X"10",X"13",X"71",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75", + X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14", + X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07", + X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75", + X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14", + X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07", + X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"03",X"E6",X"E7",X"57",X"72",X"67",X"72",X"4C",X"55", + X"55",X"67",X"72",X"4C",X"55",X"67",X"72",X"4C",X"55",X"67",X"72",X"4C",X"63",X"31",X"4F",X"4F", + X"3C",X"75",X"10",X"03",X"E4",X"E5",X"57",X"72",X"6B",X"73",X"73",X"68",X"68",X"6B",X"73",X"73", + X"68",X"6B",X"73",X"73",X"68",X"6B",X"73",X"73",X"2E",X"30",X"3D",X"81",X"3C",X"75",X"10",X"03", + X"E6",X"E7",X"57",X"67",X"6A",X"39",X"39",X"67",X"67",X"6A",X"39",X"39",X"67",X"6A",X"39",X"39", + X"67",X"6A",X"39",X"39",X"2E",X"32",X"42",X"BD",X"3C",X"75",X"10",X"03",X"A8",X"A9",X"A2",X"A1", + X"69",X"3A",X"3A",X"66",X"65",X"69",X"3A",X"3A",X"66",X"69",X"3A",X"3A",X"66",X"69",X"3A",X"3A", + X"2E",X"32",X"3D",X"81",X"3C",X"75",X"10",X"03",X"AA",X"AB",X"10",X"12",X"33",X"30",X"42",X"BD", + X"3C",X"75",X"10",X"03",X"AF",X"37",X"37",X"37",X"34",X"10",X"10",X"6D",X"58",X"58",X"3C",X"75", + X"10",X"03",X"87",X"87",X"10",X"16",X"3C",X"75",X"10",X"03",X"9B",X"9D",X"88",X"10",X"15",X"3C", + X"75",X"10",X"03",X"9C",X"82",X"88",X"10",X"15",X"3C",X"75",X"10",X"03",X"79",X"79",X"88",X"10", + X"15",X"3C",X"75",X"10",X"03",X"9C",X"82",X"87",X"10",X"14",X"71",X"3C",X"75",X"10",X"03",X"85", + X"76",X"87",X"10",X"15",X"3C",X"75",X"10",X"03",X"9C",X"76",X"87",X"10",X"15",X"3C",X"75",X"10", + X"03",X"9C",X"79",X"9B",X"10",X"15",X"3C",X"75",X"10",X"03",X"79",X"76",X"87",X"10",X"14",X"71", + X"3C",X"75",X"10",X"03",X"80",X"8D",X"10",X"16",X"3C",X"75",X"10",X"03",X"80",X"76",X"87",X"10", + X"15",X"3C",X"75",X"10",X"03",X"85",X"76",X"9B",X"10",X"15",X"3C",X"75",X"10",X"03",X"85",X"82", + X"9B",X"10",X"15",X"3C",X"75",X"10",X"03",X"9C",X"79",X"9B",X"10",X"15",X"3C",X"75",X"10",X"03", + X"9C",X"79",X"9D",X"88",X"10",X"14",X"3C",X"75",X"10",X"03",X"85",X"76",X"76",X"87",X"10",X"14", + X"3C",X"75",X"10",X"03",X"7E",X"7B",X"90",X"8F",X"8C",X"10",X"13",X"3C",X"75",X"10",X"03",X"7F", + X"7B",X"7C",X"76",X"76",X"87",X"10",X"11",X"8B",X"3C",X"75",X"10",X"03",X"85",X"79",X"76",X"76", + X"79",X"9D",X"88",X"10",X"05",X"89",X"86",X"10",X"08",X"86",X"8A",X"3C",X"75",X"10",X"03",X"85", + X"7E",X"90",X"7B",X"7C",X"76",X"91",X"83",X"92",X"9A",X"92",X"96",X"84",X"9E",X"92",X"96",X"96", + X"92",X"9A",X"92",X"96",X"96",X"9E",X"38",X"3C",X"75",X"10",X"03",X"9C",X"8E",X"7A",X"78",X"78", + X"7E",X"93",X"9F",X"99",X"94",X"94",X"97",X"94",X"97",X"94",X"99",X"97",X"94",X"97",X"94",X"94", + X"94",X"97",X"97",X"3C",X"75",X"10",X"02",X"88",X"7E",X"7A",X"78",X"7A",X"7A",X"8E",X"93",X"64", + X"95",X"95",X"95",X"95",X"98",X"98",X"95",X"98",X"95",X"95",X"98",X"95",X"98",X"98",X"98",X"95", + X"3C",X"75",X"10",X"03",X"E6",X"E7",X"57",X"72",X"67",X"72",X"4C",X"55",X"55",X"67",X"72",X"4C", + X"55",X"67",X"72",X"4C",X"55",X"67",X"72",X"4C",X"4C",X"55",X"5F",X"62",X"3C",X"75",X"10",X"03", + X"E4",X"E5",X"57",X"72",X"6B",X"73",X"73",X"68",X"68",X"6B",X"73",X"73",X"68",X"6B",X"73",X"73", + X"68",X"6B",X"73",X"73",X"68",X"68",X"5D",X"5D",X"3C",X"75",X"10",X"03",X"E6",X"E7",X"57",X"67", + X"6A",X"39",X"39",X"67",X"67",X"6A",X"39",X"39",X"67",X"6A",X"39",X"39",X"67",X"6A",X"39",X"39", + X"67",X"67",X"41",X"65",X"3C",X"75",X"10",X"03",X"A8",X"A9",X"A2",X"A1",X"69",X"3A",X"3A",X"66", + X"65",X"69",X"3A",X"3A",X"66",X"69",X"3A",X"3A",X"66",X"69",X"3A",X"3A",X"66",X"65",X"69",X"69", + X"3C",X"75",X"10",X"03",X"AA",X"AB",X"10",X"16",X"3C",X"75",X"10",X"03",X"AF",X"37",X"37",X"37", + X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"35",X"10",X"06", + X"3C",X"75",X"10",X"03",X"C4",X"C2",X"10",X"16",X"3C",X"75",X"10",X"03",X"57",X"61",X"10",X"16", + X"3C",X"75",X"10",X"03",X"57",X"60",X"10",X"16",X"3C",X"75",X"10",X"03",X"57",X"60",X"10",X"16", + X"3C",X"75",X"10",X"03",X"57",X"41",X"C2",X"10",X"14",X"2F",X"3C",X"75",X"10",X"03",X"57",X"5E", + X"61",X"10",X"14",X"2F",X"3C",X"75",X"10",X"03",X"57",X"5E",X"62",X"10",X"15",X"3C",X"75",X"10", + X"03",X"57",X"5D",X"62",X"10",X"15",X"3C",X"75",X"10",X"03",X"57",X"5F",X"62",X"10",X"14",X"2F", + X"3C",X"75",X"10",X"03",X"57",X"5D",X"61",X"10",X"14",X"2F",X"3C",X"75",X"10",X"03",X"57",X"5E", + X"60",X"10",X"15",X"3C",X"75",X"10",X"03",X"57",X"5F",X"60",X"10",X"15",X"3C",X"75",X"10",X"03", + X"57",X"5F",X"61",X"10",X"14",X"2F",X"3C",X"75",X"10",X"03",X"57",X"5E",X"61",X"10",X"14",X"2F", + X"3C",X"75",X"10",X"03",X"57",X"5D",X"60",X"10",X"15",X"3C",X"75",X"10",X"03",X"57",X"41",X"41", + X"5A",X"10",X"14",X"3C",X"75",X"10",X"03",X"57",X"5B",X"41",X"61",X"10",X"14",X"3C",X"75",X"10", + X"03",X"57",X"5B",X"5B",X"41",X"10",X"14",X"3C",X"75",X"10",X"03",X"57",X"41",X"4B",X"4A",X"59", + X"10",X"10",X"A3",X"A3",X"A3",X"3C",X"75",X"10",X"03",X"57",X"41",X"4B",X"4A",X"41",X"50",X"52", + X"10",X"02",X"50",X"50",X"50",X"4E",X"4E",X"50",X"50",X"50",X"10",X"02",X"52",X"50",X"6C",X"D0", + X"D1",X"3C",X"75",X"10",X"03",X"57",X"41",X"56",X"56",X"41",X"59",X"56",X"49",X"48",X"4A",X"4B", + X"4C",X"4D",X"4D",X"4C",X"4B",X"4A",X"49",X"48",X"56",X"59",X"6E",X"D2",X"D3",X"3C",X"75",X"10", + X"03",X"57",X"67",X"67",X"41",X"56",X"67",X"67",X"41",X"49",X"44",X"44",X"45",X"56",X"56",X"45", + X"44",X"44",X"49",X"41",X"67",X"67",X"70",X"D0",X"D1",X"3C",X"75",X"3A",X"07",X"89",X"CB",X"47", + X"C8",X"3A",X"02",X"89",X"32",X"43",X"8D",X"32",X"34",X"89",X"A7",X"20",X"0F",X"21",X"E3",X"86", + X"22",X"32",X"89",X"2E",X"82",X"11",X"54",X"27",X"CD",X"07",X"33",X"C9",X"47",X"21",X"A3",X"86", + X"22",X"32",X"89",X"2E",X"C3",X"11",X"DF",X"FF",X"36",X"DA",X"23",X"36",X"DB",X"19",X"36",X"D8", + X"23",X"36",X"D9",X"19",X"10",X"F2",X"1E",X"BF",X"19",X"11",X"54",X"27",X"CD",X"07",X"33",X"C9", + X"10",X"1D",X"10",X"08",X"40",X"10",X"04",X"40",X"10",X"03",X"40",X"10",X"03",X"40",X"00",X"80", + X"10",X"05",X"10",X"1D",X"10",X"17",X"80",X"80",X"10",X"04",X"10",X"18",X"80",X"10",X"04",X"10", + X"1D",X"10",X"03",X"40",X"10",X"19",X"10",X"03",X"40",X"10",X"19",X"10",X"1D",X"10",X"04",X"80", + X"80",X"10",X"17",X"10",X"1A",X"07",X"10",X"02",X"10",X"05",X"80",X"10",X"17",X"10",X"1D",X"10", + X"1D",X"10",X"05",X"80",X"10",X"14",X"0E",X"10",X"02",X"10",X"1D",X"10",X"03",X"80",X"10",X"19", + X"FF",X"C2",X"82",X"02",X"10",X"04",X"40",X"10",X"18",X"10",X"1D",X"10",X"1D",X"10",X"04",X"80", + X"10",X"18",X"10",X"04",X"80",X"10",X"02",X"80",X"10",X"11",X"40",X"10",X"03",X"10",X"07",X"80", + X"10",X"0B",X"40",X"10",X"05",X"40",X"00",X"10",X"02",X"10",X"08",X"40",X"10",X"04",X"40",X"02", + X"40",X"10",X"06",X"40",X"10",X"06",X"10",X"02",X"C0",X"10",X"04",X"80",X"40",X"80",X"00",X"00", + X"00",X"40",X"10",X"02",X"40",X"10",X"02",X"40",X"10",X"02",X"40",X"10",X"03",X"40",X"10",X"02", + X"FF",X"A2",X"80",X"02",X"10",X"10",X"80",X"80",X"10",X"0B",X"10",X"11",X"80",X"10",X"0B",X"10", + X"1D",X"10",X"13",X"07",X"10",X"09",X"10",X"13",X"07",X"10",X"09",X"FF",X"A2",X"82",X"0A",X"10", + X"13",X"0E",X"10",X"09",X"10",X"1D",X"10",X"1D",X"10",X"13",X"0E",X"10",X"09",X"10",X"1D",X"10", + X"1D",X"10",X"13",X"07",X"10",X"09",X"10",X"13",X"07",X"10",X"09",X"10",X"13",X"0E",X"10",X"09", + X"FF",X"A2",X"80",X"02",X"10",X"10",X"80",X"80",X"10",X"0B",X"10",X"11",X"80",X"10",X"0B",X"FF", + X"42",X"81",X"02",X"10",X"13",X"07",X"10",X"09",X"FF",X"C2",X"81",X"02",X"10",X"13",X"0E",X"10", + X"09",X"FF",X"C2",X"83",X"0E",X"10",X"1D",X"10",X"06",X"07",X"10",X"05",X"40",X"10",X"10",X"10", + X"1D",X"10",X"10",X"80",X"80",X"10",X"0B",X"10",X"11",X"80",X"10",X"0B",X"10",X"1D",X"10",X"1D", + X"10",X"13",X"0E",X"10",X"09",X"10",X"01",X"C0",X"C0",X"10",X"1A",X"10",X"01",X"00",X"00",X"10", + X"1A",X"10",X"01",X"85",X"82",X"10",X"10",X"0E",X"10",X"09",X"10",X"01",X"05",X"02",X"10",X"1A", + X"10",X"01",X"80",X"80",X"10",X"1A",X"10",X"01",X"00",X"00",X"10",X"04",X"40",X"10",X"15",X"10", + X"01",X"8D",X"CD",X"10",X"04",X"40",X"10",X"15",X"10",X"01",X"0D",X"4D",X"10",X"1A",X"10",X"01", + X"83",X"C3",X"10",X"05",X"80",X"80",X"10",X"13",X"10",X"01",X"03",X"43",X"10",X"1A",X"10",X"01", + X"80",X"C0",X"10",X"06",X"80",X"10",X"13",X"10",X"01",X"00",X"00",X"10",X"05",X"80",X"10",X"14", + X"FF",X"42",X"83",X"03",X"10",X"08",X"80",X"10",X"09",X"40",X"10",X"0A",X"10",X"0A",X"80",X"10", + X"07",X"40",X"00",X"10",X"09",X"10",X"1D",X"10",X"09",X"80",X"40",X"00",X"82",X"00",X"40",X"00", + X"40",X"00",X"00",X"40",X"10",X"09",X"10",X"1D",X"10",X"08",X"40",X"10",X"04",X"40",X"10",X"03", + X"40",X"10",X"03",X"04",X"10",X"07",X"10",X"1D",X"10",X"05",X"10",X"18",X"10",X"1D",X"10",X"1D", + X"10",X"03",X"80",X"40",X"10",X"18",X"FF",X"82",X"81",X"02",X"10",X"05",X"40",X"10",X"14",X"8A", + X"10",X"02",X"10",X"04",X"10",X"16",X"0A",X"10",X"02",X"10",X"1D",X"10",X"05",X"10",X"18",X"10", + X"04",X"40",X"10",X"15",X"85",X"10",X"02",X"10",X"1A",X"05",X"10",X"02",X"10",X"04",X"80",X"10", + X"18",X"10",X"04",X"80",X"80",X"10",X"17",X"10",X"05",X"80",X"10",X"14",X"86",X"10",X"02",X"10", + X"1A",X"06",X"10",X"02",X"10",X"1D",X"10",X"1D",X"10",X"04",X"80",X"80",X"10",X"17",X"10",X"06", + X"80",X"10",X"16",X"10",X"05",X"80",X"80",X"10",X"16",X"10",X"08",X"40",X"40",X"10",X"02",X"40", + X"40",X"40",X"40",X"10",X"0D",X"10",X"06",X"40",X"00",X"40",X"40",X"10",X"02",X"40",X"40",X"40", + X"40",X"10",X"0D",X"10",X"04",X"40",X"10",X"03",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"10",X"0D",X"10",X"03",X"E6",X"E7",X"8E",X"7A",X"7E",X"93",X"64",X"95",X"95",X"98",X"95",X"95", + X"98",X"98",X"95",X"98",X"95",X"95",X"98",X"95",X"98",X"98",X"98",X"95",X"3C",X"75",X"10",X"03", + X"E4",X"E5",X"7E",X"7B",X"79",X"93",X"9F",X"99",X"99",X"94",X"94",X"97",X"94",X"97",X"94",X"99", + X"97",X"94",X"97",X"94",X"94",X"94",X"97",X"97",X"3C",X"75",X"10",X"03",X"E6",X"E7",X"9C",X"79", + X"79",X"91",X"83",X"92",X"92",X"9A",X"92",X"96",X"84",X"9E",X"92",X"96",X"96",X"92",X"9A",X"92", + X"96",X"96",X"9E",X"38",X"3C",X"75",X"10",X"03",X"A8",X"A9",X"9B",X"7E",X"88",X"10",X"07",X"89", + X"86",X"10",X"08",X"86",X"8A",X"3C",X"75",X"10",X"03",X"AA",X"AB",X"87",X"8C",X"10",X"13",X"8B", + X"3C",X"75",X"10",X"03",X"AF",X"37",X"37",X"37",X"34",X"10",X"13",X"3C",X"75",X"10",X"1B",X"3C", + X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C", + X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C", + X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C", + X"75",X"87",X"87",X"10",X"19",X"3C",X"75",X"9C",X"7E",X"87",X"10",X"18",X"3C",X"75",X"85",X"76", + X"76",X"87",X"10",X"17",X"3C",X"75",X"7E",X"7B",X"90",X"8F",X"8C",X"10",X"16",X"3C",X"75",X"7F", + X"7B",X"7C",X"76",X"76",X"87",X"10",X"14",X"8B",X"3C",X"75",X"85",X"79",X"76",X"76",X"79",X"76", + X"88",X"10",X"12",X"86",X"8A",X"3C",X"75",X"85",X"7E",X"90",X"7B",X"7C",X"76",X"91",X"83",X"39", + X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39", + X"9E",X"38",X"3C",X"75",X"85",X"8E",X"7A",X"78",X"78",X"7E",X"93",X"9F",X"3A",X"3A",X"3A",X"3A", + X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"97",X"94",X"3C", + X"75",X"7E",X"7A",X"78",X"7A",X"7A",X"8E",X"93",X"64",X"95",X"98",X"95",X"95",X"98",X"98",X"95", + X"98",X"98",X"95",X"98",X"95",X"95",X"98",X"95",X"98",X"98",X"98",X"95",X"3C",X"75",X"10",X"05", + X"80",X"80",X"C0",X"00",X"00",X"80",X"80",X"C0",X"C0",X"80",X"80",X"C0",X"80",X"80",X"C0",X"80", + X"80",X"C0",X"80",X"80",X"80",X"C0",X"00",X"00",X"10",X"05",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"C0",X"82",X"C0",X"80",X"80",X"80",X"80",X"80",X"80",X"C0",X"80",X"80",X"80",X"80", + X"00",X"00",X"10",X"05",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"C0",X"80",X"80",X"80",X"80",X"80",X"C0",X"00",X"10",X"02",X"10",X"05",X"40",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"C0",X"80",X"00",X"00",X"10",X"05",X"C0",X"80",X"10",X"13",X"80",X"00",X"00",X"FF", + X"A2",X"82",X"0D",X"40",X"10",X"1C",X"10",X"01",X"80",X"10",X"1B",X"10",X"1D",X"10",X"1D",X"00", + X"80",X"10",X"1B",X"00",X"80",X"10",X"02",X"80",X"10",X"14",X"40",X"10",X"03",X"10",X"04",X"80", + X"10",X"14",X"40",X"10",X"03",X"10",X"05",X"40",X"10",X"17",X"10",X"04",X"80",X"40",X"80",X"00", + X"00",X"40",X"40",X"10",X"02",X"40",X"10",X"02",X"40",X"10",X"02",X"40",X"10",X"03",X"40",X"10", + X"05",X"10",X"03",X"E6",X"E7",X"57",X"72",X"67",X"72",X"4C",X"55",X"55",X"67",X"72",X"4C",X"55", + X"67",X"72",X"4C",X"55",X"67",X"72",X"4C",X"63",X"31",X"4F",X"4F",X"3C",X"75",X"10",X"03",X"E4", + X"E5",X"57",X"72",X"6B",X"73",X"73",X"68",X"68",X"6B",X"73",X"73",X"68",X"6B",X"73",X"73",X"68", + X"6B",X"73",X"73",X"2E",X"30",X"3D",X"81",X"3C",X"75",X"10",X"03",X"E6",X"E7",X"57",X"67",X"6A", + X"39",X"39",X"67",X"67",X"6A",X"39",X"39",X"67",X"6A",X"39",X"39",X"67",X"6A",X"39",X"39",X"2E", + X"32",X"42",X"BD",X"3C",X"75",X"10",X"03",X"A8",X"A9",X"A2",X"A1",X"69",X"3A",X"3A",X"66",X"65", + X"69",X"3A",X"3A",X"66",X"69",X"3A",X"3A",X"66",X"69",X"3A",X"3A",X"2E",X"32",X"3D",X"81",X"3C", + X"75",X"10",X"03",X"AA",X"AB",X"10",X"12",X"33",X"30",X"42",X"BD",X"3C",X"75",X"10",X"03",X"AF", + X"37",X"37",X"37",X"34",X"10",X"10",X"6D",X"58",X"58",X"3C",X"75",X"10",X"03",X"87",X"87",X"10", + X"16",X"3C",X"75",X"10",X"03",X"9B",X"9D",X"88",X"10",X"15",X"3C",X"75",X"10",X"03",X"9C",X"82", + X"88",X"10",X"15",X"3C",X"75",X"10",X"03",X"79",X"79",X"88",X"10",X"01",X"00",X"10",X"13",X"3C", + X"75",X"10",X"03",X"9C",X"82",X"87",X"10",X"01",X"00",X"10",X"12",X"2F",X"3C",X"75",X"10",X"03", + X"85",X"76",X"87",X"10",X"14",X"2F",X"3C",X"75",X"10",X"03",X"9C",X"76",X"87",X"10",X"15",X"3C", + X"75",X"10",X"03",X"9C",X"79",X"9B",X"10",X"15",X"3C",X"75",X"10",X"03",X"79",X"76",X"87",X"10", + X"14",X"2F",X"3C",X"75",X"10",X"03",X"80",X"8D",X"10",X"02",X"24",X"10",X"12",X"2F",X"3C",X"75", + X"10",X"03",X"80",X"76",X"87",X"10",X"01",X"1E",X"10",X"13",X"3C",X"75",X"10",X"03",X"85",X"76", + X"9B",X"10",X"01",X"19",X"10",X"13",X"3C",X"75",X"10",X"03",X"85",X"82",X"9B",X"10",X"01",X"1F", + X"10",X"12",X"2F",X"3C",X"75",X"10",X"03",X"9C",X"79",X"9B",X"10",X"01",X"20",X"10",X"12",X"2F", + X"3C",X"75",X"10",X"03",X"9C",X"79",X"9D",X"88",X"10",X"14",X"3C",X"75",X"10",X"03",X"85",X"76", + X"76",X"87",X"10",X"14",X"3C",X"75",X"10",X"03",X"7E",X"7B",X"90",X"8F",X"8C",X"10",X"13",X"3C", + X"75",X"B7",X"B8",X"B9",X"7F",X"7B",X"7C",X"76",X"76",X"87",X"10",X"11",X"8B",X"3C",X"75",X"B6", + X"B1",X"B6",X"85",X"79",X"76",X"76",X"79",X"9D",X"88",X"10",X"05",X"89",X"86",X"10",X"08",X"86", + X"8A",X"3C",X"75",X"B4",X"B5",X"B4",X"85",X"7E",X"90",X"7B",X"7C",X"76",X"91",X"83",X"92",X"9A", + X"92",X"96",X"84",X"9E",X"92",X"96",X"96",X"92",X"9A",X"92",X"96",X"96",X"9E",X"38",X"3C",X"75", + X"10",X"03",X"9C",X"8E",X"7A",X"78",X"78",X"7E",X"93",X"9F",X"99",X"94",X"94",X"97",X"94",X"97", + X"94",X"99",X"97",X"94",X"97",X"94",X"94",X"94",X"97",X"97",X"3C",X"75",X"10",X"02",X"88",X"7E", + X"7A",X"78",X"7A",X"7A",X"8E",X"93",X"64",X"95",X"95",X"95",X"95",X"98",X"98",X"95",X"98",X"95", + X"95",X"98",X"95",X"98",X"98",X"98",X"95",X"3C",X"75",X"10",X"1D",X"10",X"08",X"40",X"10",X"04", + X"40",X"10",X"03",X"40",X"10",X"03",X"40",X"00",X"80",X"10",X"05",X"10",X"1D",X"10",X"17",X"80", + X"80",X"10",X"04",X"10",X"18",X"80",X"10",X"04",X"10",X"1D",X"10",X"03",X"40",X"10",X"19",X"10", + X"03",X"40",X"10",X"19",X"10",X"1D",X"10",X"04",X"80",X"80",X"10",X"17",X"10",X"1A",X"8A",X"10", + X"02",X"10",X"05",X"80",X"10",X"14",X"0A",X"10",X"02",X"10",X"1D",X"10",X"1D",X"10",X"05",X"80", + X"10",X"14",X"85",X"10",X"02",X"10",X"1A",X"05",X"10",X"02",X"10",X"03",X"80",X"10",X"19",X"10", + X"1D",X"10",X"1A",X"86",X"10",X"02",X"10",X"1A",X"06",X"10",X"02",X"10",X"04",X"40",X"10",X"18", + X"10",X"1D",X"10",X"1D",X"80",X"80",X"80",X"00",X"80",X"10",X"18",X"80",X"00",X"C0",X"00",X"80", + X"10",X"02",X"80",X"10",X"11",X"40",X"10",X"03",X"80",X"80",X"C0",X"10",X"04",X"80",X"10",X"0B", + X"40",X"10",X"05",X"40",X"00",X"10",X"02",X"10",X"02",X"C0",X"10",X"05",X"40",X"10",X"04",X"40", + X"02",X"40",X"10",X"06",X"40",X"10",X"06",X"10",X"02",X"C0",X"10",X"04",X"80",X"40",X"80",X"00", + X"00",X"00",X"40",X"10",X"02",X"40",X"10",X"02",X"40",X"10",X"02",X"40",X"10",X"03",X"40",X"10", + X"02",X"3A",X"FB",X"89",X"A7",X"20",X"22",X"21",X"C5",X"6A",X"11",X"00",X"00",X"7E",X"FE",X"C9", + X"28",X"08",X"83",X"5F",X"30",X"01",X"14",X"23",X"18",X"F3",X"21",X"19",X"51",X"7B",X"BE",X"C3", + X"C5",X"6A",X"7A",X"23",X"BE",X"C2",X"2C",X"46",X"C9",X"ED",X"1B",X"3A",X"07",X"89",X"CB",X"47", + X"28",X"1F",X"CD",X"C5",X"54",X"CD",X"19",X"55",X"CD",X"64",X"55",X"3A",X"61",X"8F",X"A7",X"28", + X"04",X"CD",X"71",X"11",X"C9",X"CD",X"46",X"51",X"3A",X"6D",X"8D",X"A7",X"C0",X"CD",X"E8",X"56", + X"C9",X"CD",X"B0",X"53",X"18",X"EF",X"CD",X"50",X"51",X"CD",X"F6",X"52",X"CD",X"34",X"53",X"C9", + X"3A",X"6D",X"8D",X"A7",X"C0",X"21",X"9A",X"51",X"3A",X"07",X"89",X"E6",X"0F",X"CD",X"45",X"0C", + X"EB",X"3A",X"01",X"89",X"FE",X"07",X"D8",X"BE",X"28",X"05",X"D0",X"23",X"23",X"18",X"F8",X"32", + X"6D",X"8D",X"23",X"7E",X"47",X"32",X"74",X"8D",X"21",X"64",X"52",X"CD",X"45",X"0C",X"1A",X"32", + X"73",X"8D",X"13",X"ED",X"53",X"71",X"8D",X"78",X"21",X"B0",X"52",X"CD",X"45",X"0C",X"ED",X"53", + X"6F",X"8D",X"AF",X"32",X"7B",X"8D",X"32",X"7E",X"8D",X"C9",X"BA",X"51",X"C2",X"51",X"CA",X"51", + X"D4",X"51",X"DE",X"51",X"E8",X"51",X"F4",X"51",X"00",X"52",X"0C",X"52",X"16",X"52",X"20",X"52", + X"2A",X"52",X"36",X"52",X"42",X"52",X"4E",X"52",X"5A",X"52",X"20",X"00",X"18",X"00",X"10",X"00", + X"05",X"02",X"20",X"04",X"18",X"02",X"10",X"05",X"05",X"02",X"28",X"05",X"20",X"00",X"18",X"05", + X"10",X"01",X"05",X"04",X"28",X"01",X"20",X"02",X"18",X"02",X"10",X"01",X"05",X"04",X"28",X"02", + X"20",X"01",X"18",X"03",X"10",X"04",X"05",X"04",X"30",X"00",X"28",X"06",X"20",X"05",X"18",X"03", + X"10",X"00",X"05",X"04",X"30",X"08",X"28",X"04",X"20",X"05",X"18",X"06",X"10",X"07",X"05",X"04", + X"30",X"06",X"28",X"07",X"20",X"00",X"18",X"05",X"10",X"02",X"05",X"04",X"28",X"09",X"20",X"00", + X"18",X"05",X"10",X"03",X"05",X"04",X"28",X"01",X"20",X"02",X"18",X"02",X"10",X"07",X"05",X"04", + X"28",X"02",X"20",X"01",X"18",X"03",X"10",X"08",X"05",X"04",X"30",X"04",X"28",X"07",X"20",X"02", + X"18",X"06",X"10",X"01",X"05",X"04",X"30",X"04",X"28",X"01",X"20",X"06",X"18",X"00",X"10",X"09", + X"05",X"04",X"30",X"07",X"28",X"06",X"20",X"00",X"18",X"05",X"10",X"02",X"05",X"04",X"2B",X"09", + X"24",X"08",X"1C",X"04",X"14",X"07",X"0D",X"02",X"05",X"02",X"28",X"00",X"20",X"02",X"18",X"06", + X"10",X"07",X"05",X"04",X"78",X"52",X"7F",X"52",X"86",X"52",X"8D",X"52",X"94",X"52",X"9B",X"52", + X"9B",X"52",X"9B",X"52",X"A2",X"52",X"A9",X"52",X"01",X"1E",X"18",X"14",X"10",X"10",X"FF",X"01", + X"30",X"30",X"34",X"30",X"30",X"FF",X"01",X"18",X"50",X"38",X"38",X"30",X"FF",X"01",X"38",X"38", + X"58",X"18",X"30",X"FF",X"01",X"38",X"38",X"38",X"38",X"38",X"FF",X"01",X"30",X"30",X"30",X"30", + X"30",X"FF",X"01",X"50",X"20",X"3E",X"60",X"40",X"FF",X"01",X"10",X"60",X"58",X"60",X"30",X"FF", + X"C4",X"52",X"C9",X"52",X"CE",X"52",X"D3",X"52",X"D8",X"52",X"DD",X"52",X"E2",X"52",X"E7",X"52", + X"EC",X"52",X"F1",X"52",X"08",X"0A",X"0D",X"10",X"12",X"13",X"10",X"0D",X"0A",X"07",X"0E",X"10", + X"0B",X"09",X"07",X"10",X"0E",X"0C",X"08",X"0A",X"10",X"0E",X"0C",X"0A",X"08",X"08",X"08",X"08", + X"08",X"08",X"0D",X"0D",X"0D",X"0D",X"0D",X"10",X"10",X"10",X"10",X"10",X"14",X"08",X"0E",X"14", + X"08",X"0E",X"14",X"07",X"14",X"07",X"3A",X"6D",X"8D",X"A7",X"C8",X"3A",X"6E",X"8D",X"A7",X"C0", + X"01",X"00",X"06",X"21",X"E0",X"8A",X"11",X"17",X"00",X"7E",X"2C",X"B6",X"20",X"01",X"0C",X"19", + X"10",X"F7",X"79",X"FE",X"04",X"D8",X"32",X"6E",X"8D",X"11",X"F3",X"0B",X"06",X"17",X"AF",X"6F", + X"67",X"1A",X"E7",X"1B",X"10",X"FB",X"3E",X"EB",X"85",X"20",X"04",X"7C",X"C6",X"F7",X"C8",X"21", + X"E8",X"89",X"34",X"C9",X"3A",X"6E",X"8D",X"A7",X"C8",X"ED",X"5B",X"71",X"8D",X"1A",X"3C",X"20", + X"14",X"3A",X"6D",X"8D",X"47",X"3A",X"01",X"89",X"B8",X"D0",X"AF",X"32",X"6D",X"8D",X"32",X"6E", + X"8D",X"32",X"07",X"8D",X"C9",X"21",X"73",X"8D",X"35",X"C0",X"3D",X"77",X"13",X"ED",X"53",X"71", + X"8D",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"06",X"06",X"D9",X"CD",X"74",X"53",X"D9",X"DD", + X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"C0",X"21",X"79",X"8D",X"34",X"DD", + X"36",X"00",X"01",X"3A",X"07",X"89",X"1E",X"1D",X"CB",X"47",X"20",X"02",X"1E",X"04",X"CD",X"A0", + X"53",X"21",X"A6",X"53",X"3A",X"74",X"8D",X"E7",X"DD",X"B6",X"07",X"DD",X"77",X"07",X"F1",X"C9", + X"0E",X"FF",X"CD",X"33",X"57",X"C9",X"14",X"24",X"34",X"44",X"54",X"64",X"74",X"84",X"94",X"A4", + X"A7",X"C8",X"3A",X"59",X"8D",X"A7",X"C0",X"3A",X"5F",X"8A",X"A7",X"C0",X"3C",X"32",X"59",X"8D", + X"DD",X"21",X"30",X"8C",X"21",X"02",X"59",X"E7",X"DD",X"77",X"09",X"ED",X"44",X"DD",X"77",X"0A", + X"DD",X"36",X"00",X"01",X"DD",X"36",X"02",X"0B",X"AF",X"DD",X"77",X"03",X"DD",X"36",X"04",X"04", + X"DD",X"77",X"05",X"DD",X"77",X"06",X"2F",X"32",X"4B",X"8D",X"11",X"03",X"42",X"CD",X"1E",X"38", + X"3A",X"07",X"89",X"CB",X"3F",X"3C",X"FE",X"07",X"38",X"02",X"3E",X"06",X"32",X"5C",X"8D",X"21", + X"07",X"54",X"E7",X"32",X"5D",X"8D",X"C9",X"FF",X"20",X"18",X"0C",X"0C",X"0B",X"3A",X"07",X"89", + X"E6",X"01",X"C8",X"AF",X"21",X"01",X"8D",X"06",X"06",X"D7",X"21",X"11",X"8D",X"06",X"06",X"D7", + X"DD",X"21",X"30",X"8C",X"11",X"18",X"00",X"06",X"03",X"D9",X"CD",X"33",X"54",X"D9",X"DD",X"19", + X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"C0",X"DD",X"36",X"00",X"01",X"AF",X"DD", + X"77",X"02",X"DD",X"77",X"05",X"DD",X"36",X"03",X"60",X"DD",X"36",X"04",X"1B",X"DD",X"77",X"0E", + X"21",X"D4",X"55",X"3A",X"01",X"8D",X"4F",X"E7",X"DD",X"77",X"06",X"21",X"D7",X"55",X"79",X"E7", + X"ED",X"44",X"DD",X"77",X"0A",X"21",X"1F",X"56",X"79",X"CD",X"45",X"0C",X"1A",X"DD",X"77",X"17", + X"21",X"57",X"56",X"CD",X"45",X"0C",X"DD",X"73",X"0C",X"DD",X"72",X"0D",X"DD",X"36",X"11",X"40", + X"CD",X"06",X"40",X"79",X"3C",X"32",X"01",X"8D",X"C9",X"DD",X"36",X"00",X"01",X"AF",X"DD",X"77", + X"02",X"DD",X"77",X"05",X"DD",X"36",X"03",X"60",X"DD",X"36",X"04",X"1B",X"DD",X"70",X"06",X"DD", + X"7E",X"17",X"4F",X"21",X"57",X"56",X"CD",X"45",X"0C",X"CD",X"1E",X"38",X"DD",X"36",X"11",X"40", + X"79",X"21",X"D7",X"55",X"E7",X"3A",X"07",X"89",X"E6",X"07",X"4F",X"87",X"81",X"E7",X"ED",X"44", + X"DD",X"77",X"0A",X"F1",X"C9",X"3A",X"07",X"89",X"FE",X"04",X"30",X"0F",X"FE",X"02",X"3A",X"20", + X"88",X"38",X"05",X"FE",X"02",X"D8",X"18",X"03",X"FE",X"03",X"D8",X"21",X"04",X"8D",X"35",X"C0", + X"21",X"EF",X"55",X"3A",X"12",X"8D",X"E6",X"0F",X"E7",X"32",X"04",X"8D",X"21",X"12",X"8D",X"34", + X"DD",X"21",X"30",X"8C",X"11",X"18",X"00",X"06",X"01",X"D9",X"DD",X"7E",X"00",X"DD",X"B6",X"01", + X"20",X"11",X"06",X"0B",X"21",X"37",X"56",X"3A",X"12",X"8D",X"E6",X"0F",X"E7",X"DD",X"77",X"17", + X"CD",X"89",X"54",X"D9",X"DD",X"19",X"10",X"E1",X"C9",X"3A",X"07",X"89",X"FE",X"02",X"30",X"06", + X"3A",X"20",X"88",X"FE",X"02",X"D8",X"21",X"05",X"8D",X"35",X"C0",X"21",X"FF",X"55",X"3A",X"13", + X"8D",X"E6",X"0F",X"E7",X"32",X"05",X"8D",X"21",X"13",X"8D",X"34",X"DD",X"21",X"48",X"8C",X"11", + X"18",X"00",X"06",X"01",X"D9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"20",X"11",X"06",X"0F",X"21", + X"47",X"56",X"3A",X"13",X"8D",X"E6",X"0F",X"E7",X"DD",X"77",X"17",X"CD",X"89",X"54",X"D9",X"DD", + X"19",X"10",X"E1",X"C9",X"21",X"06",X"8D",X"35",X"C0",X"21",X"0F",X"56",X"3A",X"14",X"8D",X"E6", + X"0F",X"E7",X"32",X"06",X"8D",X"21",X"14",X"8D",X"34",X"DD",X"21",X"60",X"8C",X"11",X"18",X"00", + X"3A",X"07",X"89",X"FE",X"04",X"30",X"0B",X"3A",X"20",X"88",X"A7",X"C8",X"FE",X"04",X"06",X"01", + X"38",X"02",X"06",X"02",X"D9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"20",X"31",X"11",X"AD",X"0B", + X"21",X"B5",X"55",X"06",X"08",X"1A",X"86",X"20",X"06",X"13",X"23",X"10",X"F8",X"18",X"0E",X"21", + X"1E",X"88",X"34",X"18",X"08",X"AA",X"7A",X"AD",X"7A",X"B2",X"7A",X"B5",X"7A",X"06",X"13",X"21", + X"27",X"56",X"3A",X"14",X"8D",X"E6",X"0F",X"E7",X"DD",X"77",X"17",X"CD",X"89",X"54",X"D9",X"DD", + X"19",X"10",X"C1",X"C9",X"0B",X"0F",X"13",X"10",X"18",X"20",X"20",X"18",X"10",X"28",X"18",X"20", + X"10",X"18",X"20",X"18",X"20",X"10",X"28",X"18",X"20",X"10",X"18",X"28",X"18",X"18",X"20",X"40", + X"50",X"60",X"70",X"80",X"90",X"A0",X"B0",X"C0",X"D0",X"E0",X"F0",X"10",X"20",X"30",X"40",X"F0", + X"E0",X"D0",X"C0",X"B0",X"A0",X"90",X"80",X"70",X"60",X"50",X"40",X"30",X"20",X"10",X"F0",X"20", + X"30",X"40",X"20",X"20",X"50",X"40",X"30",X"20",X"60",X"20",X"30",X"40",X"70",X"30",X"40",X"27", + X"56",X"37",X"56",X"47",X"56",X"47",X"56",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"01",X"01",X"01",X"01",X"01",X"00",X"03", + X"03",X"01",X"01",X"00",X"00",X"01",X"01",X"02",X"02",X"02",X"02",X"02",X"02",X"01",X"02",X"02", + X"00",X"02",X"03",X"02",X"03",X"03",X"02",X"61",X"56",X"7C",X"56",X"97",X"56",X"B2",X"56",X"CD", + X"56",X"44",X"3C",X"10",X"44",X"3D",X"10",X"44",X"3E",X"10",X"44",X"E1",X"10",X"44",X"E2",X"10", + X"44",X"E1",X"10",X"44",X"E2",X"10",X"44",X"E1",X"10",X"FF",X"6D",X"56",X"41",X"3C",X"10",X"41", + X"3D",X"10",X"41",X"3E",X"10",X"41",X"E1",X"10",X"41",X"E2",X"10",X"41",X"E1",X"10",X"41",X"E2", + X"10",X"41",X"E1",X"10",X"FF",X"88",X"56",X"49",X"3C",X"10",X"49",X"3D",X"10",X"49",X"3E",X"10", + X"49",X"E1",X"10",X"49",X"E2",X"10",X"49",X"E1",X"10",X"49",X"E2",X"10",X"49",X"E1",X"10",X"FF", + X"A3",X"56",X"4C",X"3C",X"10",X"4C",X"3D",X"10",X"4C",X"3E",X"10",X"4C",X"E1",X"10",X"4C",X"E2", + X"10",X"4C",X"E1",X"10",X"4C",X"E2",X"10",X"4C",X"E1",X"10",X"FF",X"BE",X"56",X"40",X"3C",X"10", + X"40",X"3D",X"10",X"40",X"3E",X"10",X"40",X"E1",X"10",X"40",X"E2",X"10",X"40",X"E1",X"10",X"40", + X"E2",X"10",X"40",X"E1",X"10",X"FF",X"D9",X"56",X"3A",X"07",X"8D",X"A7",X"28",X"05",X"3D",X"32", + X"07",X"8D",X"C9",X"3A",X"07",X"89",X"CB",X"47",X"CA",X"71",X"58",X"3A",X"01",X"89",X"21",X"40", + X"8D",X"96",X"C8",X"D8",X"4F",X"3A",X"00",X"89",X"FE",X"03",X"38",X"04",X"06",X"06",X"18",X"03", + X"C6",X"04",X"47",X"3A",X"40",X"8D",X"B8",X"D0",X"DD",X"21",X"E0",X"8A",X"06",X"06",X"1E",X"1D", + X"CD",X"2B",X"57",X"11",X"18",X"00",X"DD",X"19",X"10",X"F4",X"C9",X"DD",X"7E",X"00",X"DD",X"B6", + X"01",X"0F",X"D8",X"41",X"DD",X"36",X"00",X"01",X"DD",X"36",X"02",X"03",X"DD",X"73",X"04",X"AF", + X"DD",X"77",X"03",X"DD",X"77",X"05",X"DD",X"77",X"06",X"DD",X"77",X"08",X"DD",X"36",X"07",X"01", + X"DD",X"77",X"0B",X"21",X"E0",X"58",X"3A",X"07",X"89",X"E6",X"01",X"20",X"03",X"21",X"02",X"59", + X"3A",X"20",X"88",X"FE",X"03",X"38",X"02",X"3E",X"03",X"4F",X"3A",X"08",X"89",X"FE",X"04",X"38", + X"05",X"3A",X"4C",X"8D",X"81",X"4F",X"3A",X"07",X"89",X"CB",X"47",X"CC",X"B4",X"57",X"3A",X"07", + X"89",X"81",X"4F",X"FE",X"20",X"38",X"02",X"3E",X"1F",X"4F",X"E7",X"DD",X"77",X"09",X"ED",X"44", + X"DD",X"77",X"0A",X"11",X"29",X"38",X"CD",X"1E",X"38",X"21",X"9B",X"58",X"3A",X"07",X"89",X"E6", + X"01",X"20",X"03",X"21",X"C0",X"58",X"79",X"E7",X"32",X"07",X"8D",X"21",X"40",X"8D",X"34",X"CD", + X"C3",X"57",X"F1",X"C9",X"3A",X"01",X"89",X"FE",X"03",X"D0",X"3A",X"7D",X"8D",X"D6",X"0C",X"D8", + X"81",X"4F",X"C9",X"05",X"28",X"6F",X"21",X"46",X"8D",X"7E",X"A7",X"28",X"2D",X"FE",X"07",X"30", + X"29",X"34",X"2C",X"7E",X"A7",X"28",X"0A",X"35",X"DD",X"36",X"13",X"02",X"DD",X"36",X"16",X"01", + X"C9",X"2C",X"7E",X"A7",X"28",X"0A",X"35",X"DD",X"36",X"13",X"01",X"DD",X"36",X"16",X"C1",X"C9", + X"2C",X"7E",X"A7",X"C8",X"35",X"DD",X"36",X"16",X"41",X"C9",X"36",X"01",X"3A",X"07",X"89",X"CB", + X"47",X"28",X"25",X"3A",X"00",X"89",X"4F",X"3A",X"4C",X"8D",X"81",X"FE",X"20",X"38",X"02",X"3E", + X"1F",X"4F",X"EB",X"21",X"22",X"59",X"87",X"81",X"E7",X"13",X"12",X"23",X"13",X"7E",X"12",X"23", + X"13",X"7E",X"12",X"06",X"FF",X"C3",X"C3",X"57",X"FE",X"20",X"38",X"02",X"3E",X"1F",X"4F",X"EB", + X"21",X"85",X"59",X"18",X"E1",X"3A",X"4A",X"8D",X"A7",X"20",X"8B",X"3E",X"01",X"32",X"4A",X"8D", + X"DD",X"77",X"0B",X"DD",X"36",X"13",X"03",X"DD",X"77",X"16",X"DD",X"36",X"07",X"02",X"11",X"47", + X"38",X"CD",X"1E",X"38",X"21",X"B5",X"0B",X"06",X"52",X"AF",X"57",X"5E",X"83",X"30",X"01",X"14", + X"23",X"10",X"F8",X"D6",X"C1",X"20",X"04",X"3E",X"1D",X"BA",X"C8",X"3E",X"01",X"32",X"2B",X"88", + X"C9",X"32",X"00",X"89",X"3A",X"01",X"89",X"21",X"40",X"8D",X"96",X"C8",X"D8",X"3A",X"40",X"8D", + X"FE",X"06",X"D0",X"3E",X"01",X"32",X"4A",X"8D",X"DD",X"21",X"E0",X"8A",X"06",X"06",X"1E",X"04", + X"CD",X"2B",X"57",X"11",X"18",X"00",X"DD",X"19",X"10",X"F4",X"C9",X"80",X"80",X"78",X"74",X"70", + X"6C",X"68",X"60",X"50",X"48",X"40",X"38",X"30",X"2C",X"28",X"24",X"20",X"1E",X"1C",X"1A",X"18", + X"17",X"17",X"17",X"17",X"16",X"16",X"16",X"16",X"15",X"15",X"15",X"15",X"14",X"14",X"14",X"14", + X"80",X"70",X"60",X"50",X"48",X"40",X"38",X"30",X"2C",X"28",X"24",X"20",X"1E",X"1C",X"1A",X"18", + X"17",X"17",X"17",X"17",X"16",X"16",X"16",X"16",X"15",X"15",X"15",X"15",X"14",X"14",X"14",X"14", + X"10",X"10",X"10",X"10",X"11",X"11",X"12",X"12",X"13",X"13",X"13",X"13",X"14",X"14",X"15",X"15", + X"15",X"15",X"17",X"17",X"18",X"18",X"19",X"19",X"1A",X"1A",X"1A",X"1A",X"1B",X"1B",X"1B",X"1B", + X"1C",X"1C",X"10",X"10",X"12",X"12",X"14",X"14",X"15",X"15",X"16",X"16",X"17",X"17",X"18",X"18", + X"19",X"19",X"19",X"19",X"1A",X"1A",X"1B",X"1B",X"1B",X"1B",X"1C",X"1C",X"1C",X"1C",X"1D",X"1D", + X"1E",X"1E",X"00",X"00",X"01",X"00",X"00",X"02",X"00",X"00",X"03",X"00",X"00",X"04",X"00",X"00", + X"05",X"00",X"01",X"03",X"00",X"01",X"04",X"00",X"01",X"05",X"00",X"02",X"02",X"00",X"02",X"03", + X"00",X"02",X"04",X"00",X"03",X"01",X"00",X"03",X"02",X"00",X"03",X"03",X"00",X"04",X"01",X"00", + X"04",X"02",X"00",X"05",X"00",X"00",X"05",X"01",X"00",X"06",X"00",X"00",X"05",X"01",X"00",X"06", + X"00",X"00",X"05",X"01",X"00",X"06",X"00",X"00",X"04",X"02",X"00",X"06",X"00",X"00",X"06",X"00", + X"00",X"06",X"00",X"00",X"06",X"00",X"00",X"06",X"00",X"00",X"06",X"00",X"00",X"06",X"00",X"00", + X"06",X"00",X"00",X"06",X"00",X"00",X"00",X"01",X"00",X"00",X"03",X"00",X"00",X"06",X"00",X"01", + X"04",X"00",X"01",X"05",X"00",X"02",X"03",X"00",X"02",X"04",X"00",X"03",X"01",X"00",X"03",X"02", + X"00",X"03",X"03",X"00",X"04",X"02",X"00",X"05",X"00",X"00",X"05",X"01",X"01",X"02",X"01",X"01", + X"01",X"03",X"01",X"01",X"04",X"01",X"02",X"03",X"02",X"00",X"00",X"02",X"01",X"02",X"02",X"00", + X"01",X"02",X"02",X"01",X"03",X"01",X"01",X"03",X"00",X"01",X"03",X"02",X"00",X"03",X"00",X"02", + X"03",X"00",X"00",X"03",X"01",X"02",X"03",X"00",X"03",X"04",X"01",X"00",X"04",X"01",X"00",X"04", + X"00",X"02",X"04",X"00",X"00",X"06",X"00",X"00",X"3A",X"2C",X"88",X"FE",X"0F",X"C8",X"3A",X"2F", + X"88",X"FE",X"0F",X"C8",X"CD",X"06",X"5A",X"CD",X"56",X"5A",X"CD",X"1F",X"5A",X"CD",X"9C",X"5A", + X"CD",X"6D",X"7E",X"C3",X"C0",X"5A",X"3A",X"10",X"88",X"0F",X"0F",X"0F",X"21",X"29",X"88",X"CB", + X"16",X"7E",X"E6",X"07",X"FE",X"01",X"C0",X"CD",X"09",X"0F",X"3E",X"01",X"C3",X"8C",X"5A",X"3A", + X"10",X"88",X"21",X"2D",X"88",X"0F",X"0F",X"CB",X"16",X"7E",X"E6",X"07",X"FE",X"01",X"C0",X"EB", + X"CD",X"09",X"0F",X"21",X"26",X"88",X"34",X"EB",X"23",X"7E",X"C6",X"10",X"77",X"47",X"23",X"7E", + X"90",X"D0",X"7E",X"4F",X"E6",X"F0",X"C6",X"10",X"2B",X"ED",X"44",X"86",X"77",X"79",X"E6",X"0F", + X"FE",X"0F",X"20",X"38",X"18",X"34",X"3A",X"10",X"88",X"21",X"2A",X"88",X"0F",X"CB",X"16",X"7E", + X"E6",X"07",X"FE",X"01",X"C0",X"EB",X"CD",X"09",X"0F",X"21",X"24",X"88",X"34",X"EB",X"23",X"7E", + X"C6",X"10",X"77",X"47",X"23",X"7E",X"90",X"D0",X"7E",X"4F",X"E6",X"F0",X"C6",X"10",X"2B",X"ED", + X"44",X"86",X"77",X"79",X"E6",X"0F",X"FE",X"0F",X"20",X"02",X"3E",X"63",X"21",X"02",X"88",X"86", + X"77",X"FE",X"63",X"38",X"02",X"36",X"63",X"11",X"01",X"07",X"FF",X"C9",X"3A",X"24",X"88",X"A7", + X"C8",X"21",X"25",X"88",X"7E",X"A7",X"20",X"07",X"36",X"30",X"3C",X"32",X"83",X"A1",X"C9",X"35", + X"28",X"09",X"7E",X"FE",X"18",X"C0",X"AF",X"32",X"83",X"A1",X"C9",X"21",X"24",X"88",X"35",X"C9", + X"3A",X"26",X"88",X"A7",X"C8",X"21",X"27",X"88",X"7E",X"A7",X"20",X"07",X"36",X"30",X"3C",X"32", + X"84",X"A1",X"C9",X"35",X"28",X"09",X"7E",X"FE",X"18",X"C0",X"AF",X"32",X"84",X"A1",X"C9",X"21", + X"26",X"88",X"35",X"C9",X"CD",X"78",X"5E",X"CD",X"6A",X"5F",X"CD",X"2F",X"60",X"CD",X"68",X"63", + X"CD",X"F7",X"5D",X"CD",X"06",X"5B",X"CD",X"4D",X"5D",X"CD",X"86",X"5B",X"CD",X"04",X"64",X"CD", + X"0B",X"5D",X"CD",X"2C",X"5B",X"C9",X"3A",X"07",X"89",X"FE",X"05",X"C0",X"FD",X"21",X"15",X"53", + X"FD",X"55",X"FD",X"5C",X"AF",X"6F",X"67",X"06",X"06",X"1A",X"85",X"30",X"01",X"24",X"6F",X"13", + X"10",X"F7",X"84",X"C6",X"7F",X"C8",X"26",X"88",X"2E",X"1E",X"34",X"C9",X"3A",X"75",X"8D",X"A7", + X"C8",X"3A",X"79",X"8D",X"A7",X"C0",X"3A",X"77",X"8D",X"A7",X"20",X"1B",X"21",X"E4",X"8A",X"11", + X"18",X"00",X"06",X"06",X"0E",X"13",X"3A",X"07",X"89",X"CB",X"47",X"28",X"02",X"0E",X"0B",X"7E", + X"B9",X"28",X"04",X"19",X"10",X"F9",X"C9",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"06",X"06", + X"D9",X"CD",X"71",X"5B",X"D9",X"DD",X"19",X"10",X"F7",X"AF",X"32",X"75",X"8D",X"32",X"20",X"8F", + X"C9",X"DD",X"7E",X"02",X"FE",X"05",X"C0",X"DD",X"CB",X"07",X"56",X"C8",X"DD",X"7E",X"06",X"FE", + X"11",X"D0",X"CD",X"6C",X"3A",X"C9",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"06",X"06",X"D9", + X"CD",X"99",X"5B",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"CB",X"0B",X"46",X"20",X"06",X"3A", + X"07",X"89",X"CB",X"47",X"C0",X"DD",X"CB",X"00",X"46",X"C8",X"DD",X"CB",X"16",X"46",X"C8",X"DD", + X"7E",X"02",X"FE",X"05",X"C0",X"21",X"48",X"88",X"FD",X"21",X"90",X"8C",X"06",X"02",X"FD",X"CB", + X"00",X"46",X"CA",X"46",X"5C",X"FD",X"CB",X"00",X"4E",X"20",X"7B",X"1E",X"10",X"3A",X"1F",X"88", + X"A7",X"20",X"02",X"1E",X"08",X"DD",X"7E",X"06",X"DD",X"4E",X"05",X"CB",X"01",X"17",X"CB",X"01", + X"17",X"CB",X"01",X"17",X"83",X"FD",X"96",X"06",X"30",X"02",X"ED",X"44",X"FE",X"10",X"30",X"56", + X"2C",X"2C",X"1E",X"16",X"3A",X"07",X"89",X"CB",X"47",X"20",X"02",X"1E",X"12",X"DD",X"7E",X"04", + X"DD",X"4E",X"03",X"CB",X"01",X"17",X"CB",X"01",X"17",X"CB",X"01",X"17",X"93",X"FD",X"96",X"04", + X"30",X"02",X"ED",X"44",X"FE",X"09",X"30",X"30",X"11",X"80",X"5C",X"DD",X"CB",X"07",X"4E",X"28", + X"03",X"11",X"89",X"5C",X"CD",X"1E",X"38",X"DD",X"36",X"12",X"10",X"DD",X"36",X"16",X"02",X"FD", + X"21",X"70",X"8B",X"11",X"18",X"00",X"06",X"05",X"DD",X"7E",X"14",X"FD",X"BE",X"14",X"28",X"14", + X"FD",X"19",X"10",X"F4",X"F1",X"C9",X"2C",X"2C",X"2C",X"2C",X"11",X"18",X"00",X"FD",X"19",X"05", + X"C2",X"BE",X"5B",X"C9",X"21",X"92",X"5C",X"DD",X"7E",X"07",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F", + X"CD",X"45",X"0C",X"FD",X"CB",X"0B",X"46",X"28",X"03",X"11",X"F9",X"5C",X"FD",X"36",X"16",X"02", + X"CD",X"75",X"5C",X"F1",X"C9",X"FD",X"73",X"0C",X"FD",X"72",X"0D",X"FD",X"36",X"0E",X"00",X"C9", + X"80",X"01",X"10",X"40",X"29",X"F0",X"FF",X"83",X"5C",X"84",X"01",X"10",X"44",X"29",X"F0",X"FF", + X"8C",X"5C",X"A8",X"5C",X"B1",X"5C",X"BA",X"5C",X"C3",X"5C",X"CC",X"5C",X"D5",X"5C",X"DE",X"5C", + X"DE",X"5C",X"DE",X"5C",X"E7",X"5C",X"F0",X"5C",X"40",X"20",X"10",X"40",X"22",X"F0",X"FF",X"AB", + X"5C",X"41",X"20",X"10",X"41",X"22",X"F0",X"FF",X"B4",X"5C",X"44",X"20",X"10",X"44",X"22",X"F0", + X"FF",X"BD",X"5C",X"49",X"20",X"10",X"49",X"22",X"F0",X"FF",X"C6",X"5C",X"4A",X"20",X"10",X"4A", + X"22",X"F0",X"FF",X"CF",X"5C",X"41",X"20",X"10",X"41",X"22",X"F0",X"FF",X"D8",X"5C",X"44",X"20", + X"10",X"44",X"22",X"F0",X"FF",X"E1",X"5C",X"4E",X"20",X"10",X"4E",X"22",X"F0",X"FF",X"EA",X"5C", + X"4F",X"20",X"10",X"4F",X"22",X"F0",X"FF",X"F3",X"5C",X"44",X"20",X"10",X"44",X"A1",X"08",X"4B", + X"A1",X"08",X"4C",X"A1",X"08",X"4F",X"A1",X"08",X"FF",X"FC",X"5C",X"DD",X"21",X"E0",X"8A",X"11", + X"18",X"00",X"06",X"06",X"D9",X"CD",X"1E",X"5D",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"CB", + X"0B",X"46",X"20",X"06",X"3A",X"07",X"89",X"CB",X"47",X"C0",X"DD",X"CB",X"00",X"46",X"C8",X"DD", + X"CB",X"16",X"4E",X"C8",X"DD",X"35",X"12",X"C0",X"DD",X"7E",X"13",X"E6",X"03",X"28",X"09",X"3D", + X"DD",X"77",X"13",X"DD",X"36",X"16",X"01",X"C9",X"DD",X"36",X"16",X"00",X"C9",X"DD",X"21",X"9C", + X"88",X"FD",X"21",X"7C",X"88",X"21",X"E8",X"8B",X"06",X"03",X"CD",X"68",X"5D",X"11",X"04",X"00", + X"FD",X"19",X"1E",X"18",X"19",X"10",X"F3",X"C9",X"7E",X"A7",X"C8",X"FE",X"05",X"C8",X"1E",X"FC", + X"16",X"00",X"3A",X"1F",X"88",X"A7",X"20",X"04",X"1E",X"05",X"16",X"10",X"DD",X"7E",X"00",X"83", + X"5F",X"DD",X"7E",X"02",X"82",X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"04", + X"D0",X"FD",X"7E",X"02",X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"09",X"D8",X"FE",X"0F", + X"D0",X"E5",X"DD",X"E1",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"0C", + X"DD",X"36",X"07",X"01",X"21",X"C2",X"5D",X"DD",X"74",X"13",X"DD",X"75",X"12",X"CD",X"2B",X"0F", + X"F1",X"C9",X"60",X"20",X"60",X"20",X"40",X"20",X"40",X"40",X"40",X"40",X"40",X"40",X"20",X"40", + X"20",X"40",X"20",X"40",X"20",X"60",X"20",X"60",X"20",X"40",X"20",X"60",X"20",X"60",X"20",X"60", + X"20",X"60",X"20",X"60",X"20",X"60",X"20",X"60",X"20",X"60",X"20",X"60",X"10",X"60",X"10",X"60", + X"10",X"60",X"10",X"60",X"EE",X"0C",X"60",X"3A",X"32",X"8D",X"A7",X"C0",X"3A",X"08",X"8F",X"21", + X"24",X"8F",X"B6",X"C0",X"DD",X"21",X"40",X"88",X"FD",X"21",X"7C",X"88",X"21",X"E8",X"8B",X"06", + X"03",X"CD",X"1F",X"5E",X"11",X"04",X"00",X"FD",X"19",X"1E",X"18",X"19",X"10",X"F3",X"C9",X"7E", + X"A7",X"C8",X"FE",X"05",X"C8",X"1E",X"09",X"16",X"00",X"3A",X"1F",X"88",X"A7",X"20",X"04",X"1E", + X"F7",X"16",X"10",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E",X"02",X"82",X"57",X"FD",X"7E",X"00", + X"93",X"30",X"02",X"ED",X"44",X"FE",X"02",X"D0",X"FD",X"7E",X"02",X"C6",X"08",X"92",X"30",X"02", + X"ED",X"44",X"FE",X"09",X"D0",X"3E",X"01",X"32",X"32",X"8D",X"E5",X"DD",X"E1",X"11",X"B4",X"40", + X"CD",X"1E",X"38",X"DD",X"36",X"11",X"0A",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD", + X"36",X"02",X"02",X"CD",X"15",X"0F",X"F1",X"C9",X"3A",X"07",X"89",X"E6",X"01",X"C8",X"FD",X"21", + X"48",X"88",X"06",X"02",X"11",X"04",X"00",X"AF",X"ED",X"47",X"D9",X"CD",X"98",X"5E",X"D9",X"FD", + X"19",X"3E",X"01",X"ED",X"47",X"10",X"F3",X"C9",X"ED",X"57",X"DD",X"21",X"90",X"8C",X"A7",X"28", + X"04",X"DD",X"21",X"A8",X"8C",X"DD",X"CB",X"00",X"46",X"C8",X"DD",X"22",X"65",X"8D",X"DD",X"CB", + X"00",X"4E",X"DD",X"21",X"88",X"88",X"06",X"04",X"21",X"30",X"8C",X"20",X"54",X"7E",X"A7",X"28", + X"45",X"2C",X"2C",X"7E",X"2D",X"2D",X"FE",X"04",X"30",X"3C",X"CD",X"53",X"5F",X"30",X"37",X"57", + X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"0A",X"30",X"2A",X"FD",X"7E",X"02",X"C6", + X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"09",X"30",X"1C",X"AF",X"77",X"23",X"36",X"01",X"23", + X"36",X"08",X"DD",X"2A",X"65",X"8D",X"DD",X"CB",X"07",X"46",X"20",X"06",X"2A",X"65",X"8D",X"06", + X"17",X"D7",X"CD",X"F1",X"0E",X"C9",X"11",X"04",X"00",X"DD",X"19",X"1E",X"18",X"19",X"10",X"AD", + X"C9",X"7E",X"A7",X"28",X"32",X"FE",X"03",X"28",X"2E",X"CD",X"53",X"5F",X"30",X"29",X"57",X"FD", + X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"07",X"30",X"1C",X"FD",X"7E",X"02",X"C6",X"08", + X"92",X"30",X"02",X"ED",X"44",X"FE",X"06",X"30",X"0E",X"36",X"03",X"21",X"19",X"8D",X"ED",X"57", + X"28",X"01",X"2C",X"36",X"01",X"18",X"BB",X"11",X"04",X"00",X"DD",X"19",X"11",X"18",X"00",X"19", + X"10",X"BF",X"C9",X"1E",X"06",X"3A",X"1F",X"88",X"A7",X"20",X"02",X"1E",X"FE",X"DD",X"7E",X"00", + X"83",X"5F",X"DD",X"7E",X"02",X"C6",X"08",X"FE",X"E0",X"C9",X"FD",X"21",X"48",X"88",X"06",X"02", + X"11",X"04",X"00",X"AF",X"ED",X"47",X"D9",X"CD",X"83",X"5F",X"D9",X"FD",X"19",X"78",X"ED",X"47", + X"10",X"F4",X"C9",X"DD",X"21",X"90",X"8C",X"ED",X"57",X"A7",X"28",X"04",X"DD",X"21",X"A8",X"8C", + X"DD",X"7E",X"00",X"A7",X"C8",X"32",X"44",X"8D",X"4F",X"DD",X"21",X"50",X"88",X"06",X"06",X"21", + X"E0",X"8A",X"7E",X"A7",X"28",X"72",X"2C",X"2C",X"7E",X"2D",X"2D",X"FE",X"05",X"20",X"69",X"1E", + X"06",X"3A",X"1F",X"88",X"A7",X"20",X"02",X"1E",X"FB",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E", + X"02",X"C6",X"08",X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"5F",X"79",X"FE",X"03", + X"7B",X"20",X"06",X"FE",X"10",X"30",X"41",X"18",X"04",X"FE",X"08",X"30",X"3B",X"FD",X"7E",X"02", + X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"5F",X"79",X"FE",X"03",X"7B",X"20",X"06",X"FE",X"12", + X"30",X"26",X"18",X"04",X"FE",X"08",X"30",X"20",X"79",X"FE",X"03",X"28",X"28",X"FD",X"E5",X"E1", + X"7D",X"21",X"91",X"8C",X"FE",X"48",X"28",X"03",X"21",X"A9",X"8C",X"36",X"01",X"11",X"06",X"00", + X"19",X"36",X"01",X"CD",X"01",X"0F",X"F1",X"C9",X"11",X"04",X"00",X"DD",X"19",X"1E",X"18",X"19", + X"05",X"C2",X"A2",X"5F",X"C9",X"E5",X"FD",X"E1",X"21",X"45",X"8D",X"34",X"C3",X"3D",X"61",X"FD", + X"21",X"48",X"88",X"06",X"02",X"AF",X"ED",X"47",X"11",X"04",X"00",X"D9",X"CD",X"48",X"60",X"D9", + X"FD",X"19",X"78",X"ED",X"47",X"10",X"F4",X"C9",X"DD",X"21",X"90",X"8C",X"ED",X"57",X"A7",X"28", + X"04",X"DD",X"21",X"A8",X"8C",X"DD",X"7E",X"00",X"A7",X"C8",X"FE",X"03",X"C8",X"32",X"44",X"8D", + X"DD",X"21",X"68",X"88",X"06",X"05",X"21",X"70",X"8B",X"7E",X"A7",X"CA",X"F2",X"60",X"2C",X"2C", + X"7E",X"2D",X"2D",X"FE",X"05",X"C2",X"F2",X"60",X"3A",X"07",X"89",X"CB",X"47",X"C2",X"B4",X"61", + X"1E",X"06",X"3A",X"1F",X"88",X"A7",X"20",X"02",X"1E",X"FE",X"DD",X"7E",X"00",X"83",X"5F",X"DD", + X"7E",X"02",X"C6",X"08",X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"09",X"30", + X"51",X"FD",X"7E",X"02",X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"08",X"30",X"43",X"11", + X"14",X"00",X"19",X"FD",X"21",X"E0",X"8A",X"7E",X"0E",X"06",X"1E",X"18",X"FD",X"BE",X"14",X"28", + X"07",X"FD",X"19",X"0D",X"20",X"F6",X"18",X"0D",X"FD",X"CB",X"16",X"4E",X"28",X"07",X"3A",X"44", + X"8D",X"FE",X"03",X"20",X"2A",X"11",X"EC",X"FF",X"19",X"FD",X"21",X"1C",X"8D",X"ED",X"57",X"20", + X"02",X"FD",X"2B",X"FD",X"36",X"00",X"01",X"11",X"04",X"04",X"CD",X"9F",X"61",X"11",X"FD",X"FF", + X"18",X"2D",X"11",X"04",X"00",X"DD",X"19",X"1E",X"18",X"19",X"05",X"C2",X"69",X"60",X"C9",X"DD", + X"21",X"90",X"8C",X"ED",X"57",X"28",X"04",X"DD",X"21",X"A8",X"8C",X"DD",X"36",X"01",X"01",X"DD", + X"36",X"07",X"01",X"CD",X"01",X"0F",X"F1",X"C9",X"3A",X"45",X"8D",X"3C",X"32",X"45",X"8D",X"19", + X"7E",X"06",X"06",X"11",X"18",X"00",X"FD",X"21",X"E0",X"8A",X"FD",X"BE",X"14",X"28",X"0E",X"FD", + X"19",X"10",X"F7",X"3A",X"44",X"8D",X"FE",X"03",X"C8",X"CD",X"F1",X"0E",X"C9",X"FD",X"CB",X"00", + X"46",X"28",X"47",X"3A",X"07",X"89",X"E6",X"01",X"20",X"1C",X"3A",X"44",X"8D",X"FE",X"03",X"20", + X"15",X"FD",X"7E",X"14",X"DD",X"21",X"70",X"8B",X"11",X"18",X"00",X"06",X"06",X"DD",X"BE",X"14", + X"28",X"2E",X"DD",X"19",X"10",X"F7",X"AF",X"FD",X"77",X"00",X"FD",X"36",X"01",X"01",X"FD",X"36", + X"02",X"08",X"FD",X"36",X"16",X"07",X"FD",X"36",X"17",X"05",X"FD",X"77",X"14",X"FD",X"77",X"13", + X"3A",X"44",X"8D",X"FE",X"03",X"20",X"13",X"CD",X"FD",X"0E",X"AF",X"32",X"44",X"8D",X"F1",X"C9", + X"DD",X"36",X"08",X"01",X"DD",X"36",X"0A",X"D0",X"18",X"CC",X"CD",X"F1",X"0E",X"18",X"EB",X"36", + X"00",X"23",X"36",X"01",X"23",X"36",X"08",X"01",X"10",X"00",X"09",X"36",X"FF",X"0E",X"04",X"09", + X"73",X"23",X"72",X"C9",X"E5",X"FD",X"E5",X"C5",X"7D",X"C6",X"14",X"6F",X"7E",X"FD",X"21",X"E0", + X"8A",X"01",X"18",X"00",X"2E",X"05",X"FD",X"BE",X"14",X"28",X"0C",X"FD",X"09",X"2D",X"20",X"F6", + X"C1",X"FD",X"E1",X"E1",X"C3",X"80",X"60",X"FD",X"7E",X"0B",X"A7",X"20",X"F3",X"FD",X"7E",X"16", + X"C1",X"FD",X"E1",X"E1",X"E6",X"F0",X"CA",X"80",X"60",X"FE",X"40",X"28",X"0F",X"FE",X"50",X"CA", + X"87",X"62",X"FE",X"F0",X"CA",X"0F",X"63",X"FE",X"D0",X"CA",X"87",X"62",X"1E",X"06",X"3A",X"1F", + X"88",X"A7",X"20",X"02",X"1E",X"FE",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E",X"02",X"C6",X"08", + X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"09",X"D2",X"F2",X"60",X"FD",X"7E", + X"02",X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"08",X"D2",X"F2",X"60",X"E5",X"DD",X"E1", + X"11",X"43",X"63",X"CD",X"1E",X"38",X"21",X"58",X"63",X"3A",X"07",X"89",X"E6",X"07",X"1F",X"E7", + X"6F",X"DD",X"7E",X"0A",X"85",X"DD",X"77",X"0A",X"FD",X"21",X"E0",X"8A",X"DD",X"7E",X"14",X"0E", + X"06",X"11",X"18",X"00",X"FD",X"BE",X"14",X"28",X"05",X"FD",X"19",X"0D",X"20",X"F6",X"21",X"58", + X"63",X"3A",X"07",X"89",X"E6",X"07",X"1F",X"E7",X"6F",X"FD",X"7E",X"0A",X"85",X"FD",X"77",X"0A", + X"FD",X"CB",X"16",X"E6",X"21",X"90",X"8C",X"ED",X"57",X"28",X"03",X"21",X"A8",X"8C",X"06",X"18", + X"AF",X"D7",X"CD",X"F1",X"0E",X"F1",X"C9",X"4F",X"1E",X"06",X"3A",X"1F",X"88",X"A7",X"20",X"02", + X"1E",X"FE",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E",X"02",X"C6",X"08",X"57",X"FD",X"7E",X"00", + X"93",X"30",X"02",X"ED",X"44",X"FE",X"06",X"D2",X"F2",X"60",X"FD",X"7E",X"02",X"C6",X"08",X"92", + X"30",X"02",X"ED",X"44",X"FE",X"07",X"D2",X"F2",X"60",X"79",X"FE",X"50",X"CA",X"D9",X"60",X"E5", + X"DD",X"E1",X"11",X"49",X"63",X"CD",X"1E",X"38",X"21",X"60",X"63",X"3A",X"07",X"89",X"E6",X"07", + X"1F",X"E7",X"6F",X"DD",X"7E",X"0A",X"85",X"DD",X"77",X"0A",X"FD",X"21",X"E0",X"8A",X"DD",X"7E", + X"14",X"0E",X"06",X"11",X"18",X"00",X"FD",X"BE",X"14",X"28",X"05",X"FD",X"19",X"0D",X"20",X"F6", + X"21",X"60",X"63",X"3A",X"07",X"89",X"E6",X"07",X"1F",X"E7",X"6F",X"FD",X"7E",X"0A",X"85",X"FD", + X"77",X"0A",X"FD",X"CB",X"16",X"EE",X"11",X"4F",X"63",X"CD",X"75",X"5C",X"C3",X"74",X"62",X"1E", + X"06",X"3A",X"1F",X"88",X"A7",X"20",X"02",X"1E",X"FE",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E", + X"02",X"C6",X"08",X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"05",X"D2",X"F2", + X"60",X"FD",X"7E",X"02",X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"05",X"D2",X"F2",X"60", + X"C3",X"D9",X"60",X"41",X"23",X"F0",X"FF",X"43",X"63",X"4C",X"24",X"F0",X"FF",X"49",X"63",X"40", + X"0B",X"0D",X"40",X"06",X"0D",X"FF",X"4F",X"63",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0E", + X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0C",X"FD",X"21",X"48",X"88",X"06",X"02",X"11",X"04", + X"00",X"AF",X"ED",X"47",X"D9",X"CD",X"81",X"63",X"D9",X"FD",X"19",X"7B",X"ED",X"47",X"10",X"F4", + X"C9",X"DD",X"21",X"7C",X"88",X"06",X"03",X"21",X"E8",X"8B",X"7E",X"A7",X"28",X"61",X"1E",X"05", + X"3A",X"1F",X"88",X"A7",X"20",X"02",X"1E",X"FE",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E",X"02", + X"C6",X"08",X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"06",X"30",X"40",X"FD", + X"7E",X"02",X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"06",X"30",X"32",X"E5",X"DD",X"E1", + X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"02",X"DD",X"36",X"11",X"28", + X"11",X"0F",X"00",X"21",X"1B",X"8D",X"ED",X"57",X"A7",X"28",X"03",X"21",X"1C",X"8D",X"36",X"01", + X"11",X"FB",X"63",X"CD",X"1E",X"38",X"CD",X"F9",X"0E",X"11",X"15",X"03",X"FF",X"F1",X"C9",X"11", + X"04",X"00",X"DD",X"19",X"11",X"18",X"00",X"19",X"10",X"90",X"C9",X"4F",X"34",X"06",X"4F",X"33", + X"06",X"42",X"37",X"28",X"3A",X"50",X"8F",X"A7",X"20",X"06",X"3A",X"07",X"89",X"E6",X"01",X"C0", + X"FD",X"21",X"48",X"88",X"06",X"02",X"11",X"04",X"00",X"AF",X"ED",X"47",X"D9",X"CD",X"35",X"64", + X"D9",X"FD",X"19",X"7B",X"ED",X"47",X"10",X"F4",X"C9",X"11",X"04",X"00",X"DD",X"19",X"11",X"18", + X"00",X"19",X"10",X"17",X"C9",X"DD",X"21",X"8C",X"88",X"21",X"48",X"8C",X"3A",X"50",X"8F",X"A7", + X"28",X"07",X"DD",X"21",X"7C",X"88",X"21",X"E8",X"8B",X"06",X"03",X"7E",X"A7",X"28",X"DA",X"1E", + X"05",X"3A",X"1F",X"88",X"A7",X"20",X"02",X"1E",X"FE",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E", + X"02",X"C6",X"08",X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"07",X"30",X"B9", + X"FD",X"7E",X"02",X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"07",X"30",X"AB",X"E5",X"DD", + X"E1",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"02",X"DD",X"36",X"11", + X"20",X"11",X"0F",X"00",X"21",X"1B",X"8D",X"ED",X"57",X"A7",X"28",X"03",X"21",X"1C",X"8D",X"36", + X"01",X"11",X"DF",X"64",X"CD",X"1E",X"38",X"CD",X"F5",X"0E",X"3A",X"50",X"8F",X"A7",X"20",X"04", + X"11",X"15",X"03",X"FF",X"21",X"52",X"8F",X"34",X"11",X"C2",X"0B",X"21",X"D0",X"64",X"1A",X"96", + X"20",X"08",X"1B",X"23",X"7E",X"3D",X"28",X"06",X"18",X"F4",X"21",X"F9",X"8D",X"34",X"F1",X"C9", + X"51",X"3A",X"3B",X"20",X"3D",X"88",X"05",X"3A",X"41",X"20",X"A7",X"88",X"06",X"3A",X"01",X"42", + X"37",X"28",X"CD",X"13",X"6B",X"DD",X"21",X"78",X"8C",X"CD",X"FB",X"64",X"DD",X"21",X"E0",X"8A", + X"FD",X"21",X"78",X"8C",X"CD",X"C5",X"66",X"CD",X"22",X"68",X"C9",X"DD",X"7E",X"02",X"EF",X"05", + X"65",X"66",X"65",X"66",X"66",X"21",X"29",X"89",X"36",X"1C",X"11",X"E8",X"FF",X"06",X"03",X"2E", + X"2B",X"36",X"08",X"D9",X"CD",X"23",X"65",X"D9",X"DD",X"34",X"02",X"DD",X"19",X"10",X"F4",X"CD", + X"88",X"0F",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D8",X"3A",X"F0",X"8E",X"A7",X"C0", + X"DD",X"36",X"00",X"01",X"DD",X"77",X"03",X"DD",X"77",X"05",X"DD",X"36",X"04",X"15",X"3A",X"29", + X"89",X"DD",X"77",X"06",X"D6",X"02",X"32",X"29",X"89",X"DD",X"36",X"0F",X"03",X"DD",X"36",X"10", + X"C0",X"DD",X"36",X"08",X"30",X"DD",X"36",X"09",X"F0",X"11",X"11",X"06",X"FF",X"3A",X"07",X"89", + X"A7",X"C0",X"1E",X"07",X"FF",X"C9",X"21",X"2F",X"89",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"2E", + X"2C",X"34",X"CB",X"46",X"2E",X"2F",X"20",X"1E",X"36",X"06",X"DD",X"7E",X"03",X"DD",X"86",X"08", + X"30",X"09",X"DD",X"34",X"04",X"DD",X"34",X"EC",X"DD",X"34",X"D4",X"DD",X"77",X"03",X"DD",X"77", + X"EB",X"DD",X"77",X"D3",X"18",X"54",X"36",X"0C",X"DD",X"7E",X"03",X"DD",X"96",X"08",X"30",X"09", + X"DD",X"35",X"04",X"DD",X"35",X"EC",X"DD",X"35",X"D4",X"DD",X"77",X"03",X"DD",X"77",X"EB",X"DD", + X"77",X"D3",X"DD",X"7E",X"05",X"DD",X"96",X"09",X"DD",X"77",X"05",X"DD",X"77",X"ED",X"DD",X"77", + X"D5",X"30",X"12",X"DD",X"7E",X"06",X"D6",X"01",X"DD",X"77",X"06",X"D6",X"02",X"DD",X"77",X"EE", + X"D6",X"02",X"DD",X"77",X"D6",X"2E",X"2C",X"CB",X"46",X"21",X"BF",X"66",X"28",X"03",X"21",X"C2", + X"66",X"11",X"E8",X"FF",X"06",X"03",X"CD",X"14",X"25",X"C9",X"DD",X"21",X"78",X"8C",X"DD",X"7E", + X"06",X"FE",X"0C",X"D0",X"3E",X"40",X"DD",X"77",X"10",X"DD",X"77",X"F8",X"DD",X"77",X"E0",X"3E", + X"18",X"DD",X"77",X"09",X"DD",X"77",X"F1",X"DD",X"77",X"D9",X"3E",X"02",X"DD",X"77",X"02",X"DD", + X"77",X"EA",X"DD",X"77",X"D2",X"32",X"30",X"89",X"32",X"2E",X"89",X"FD",X"21",X"BC",X"82",X"11", + X"00",X"00",X"06",X"0A",X"FD",X"7E",X"00",X"FD",X"BE",X"E0",X"C2",X"84",X"52",X"83",X"5F",X"30", + X"01",X"14",X"FD",X"7D",X"D6",X"20",X"FD",X"6F",X"30",X"02",X"FD",X"25",X"10",X"E6",X"06",X"0A", + X"3E",X"04",X"FD",X"84",X"FD",X"67",X"EB",X"FD",X"5D",X"FD",X"54",X"EB",X"7E",X"83",X"30",X"01", + X"14",X"5F",X"7D",X"C6",X"20",X"30",X"01",X"24",X"6F",X"10",X"F1",X"7B",X"FE",X"2A",X"C2",X"14", + X"60",X"15",X"C2",X"05",X"20",X"C9",X"11",X"E8",X"FF",X"06",X"03",X"D9",X"CD",X"7C",X"66",X"D9", + X"DD",X"19",X"10",X"F7",X"DD",X"21",X"78",X"8C",X"CD",X"A1",X"66",X"C9",X"DD",X"7E",X"01",X"A7", + X"C0",X"DD",X"7E",X"05",X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"DD", + X"7E",X"06",X"FE",X"1D",X"D8",X"DD",X"36",X"01",X"02",X"AF",X"DD",X"77",X"04",X"DD",X"77",X"06", + X"C9",X"21",X"2B",X"89",X"35",X"7E",X"A7",X"C0",X"36",X"08",X"23",X"34",X"CB",X"46",X"21",X"BF", + X"66",X"28",X"03",X"21",X"C2",X"66",X"11",X"E8",X"FF",X"06",X"03",X"CD",X"14",X"25",X"C9",X"03", + X"03",X"03",X"09",X"09",X"09",X"11",X"18",X"00",X"06",X"03",X"D9",X"CD",X"F1",X"66",X"D9",X"DD", + X"19",X"10",X"F7",X"3A",X"E2",X"8A",X"A7",X"C8",X"21",X"2D",X"89",X"7E",X"A7",X"28",X"02",X"35", + X"C9",X"36",X"10",X"23",X"23",X"34",X"CB",X"46",X"11",X"12",X"06",X"20",X"02",X"1E",X"92",X"FF", + X"C9",X"DD",X"7E",X"02",X"EF",X"FD",X"66",X"2A",X"67",X"A0",X"67",X"DF",X"67",X"3A",X"30",X"89", + X"A7",X"C8",X"21",X"2E",X"89",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"36",X"12",X"DD",X"34",X"02", + X"AF",X"DD",X"77",X"03",X"DD",X"77",X"05",X"DD",X"36",X"04",X"15",X"DD",X"36",X"06",X"02",X"11", + X"29",X"38",X"CD",X"1E",X"38",X"DD",X"36",X"09",X"2C",X"C9",X"CD",X"06",X"40",X"DD",X"7E",X"05", + X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"FE",X"18", + X"30",X"50",X"FD",X"21",X"48",X"8C",X"11",X"18",X"00",X"06",X"03",X"FD",X"7E",X"01",X"A7",X"20", + X"08",X"DD",X"7E",X"06",X"FD",X"BE",X"06",X"28",X"05",X"FD",X"19",X"10",X"EE",X"C9",X"21",X"03", + X"89",X"34",X"FD",X"36",X"01",X"02",X"DD",X"7E",X"03",X"D6",X"80",X"30",X"03",X"FD",X"35",X"04", + X"FD",X"77",X"03",X"DD",X"7E",X"05",X"C6",X"40",X"30",X"03",X"FD",X"35",X"06",X"FD",X"77",X"05", + X"FD",X"36",X"0F",X"C0",X"FD",X"E5",X"E1",X"DD",X"75",X"07",X"DD",X"74",X"08",X"3E",X"20",X"32", + X"29",X"89",X"DD",X"34",X"02",X"DD",X"36",X"09",X"18",X"11",X"38",X"38",X"CD",X"1E",X"38",X"C9", + X"21",X"29",X"89",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"CD",X"06",X"40",X"DD",X"6E",X"07",X"DD", + X"66",X"08",X"7C",X"A7",X"28",X"11",X"E5",X"FD",X"E1",X"FD",X"7E",X"05",X"DD",X"96",X"09",X"30", + X"03",X"FD",X"35",X"06",X"FD",X"77",X"05",X"DD",X"7E",X"05",X"DD",X"96",X"09",X"30",X"03",X"DD", + X"35",X"06",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"FE",X"00",X"C0",X"DD",X"34",X"02",X"C9",X"21", + X"BC",X"82",X"11",X"E0",X"FF",X"01",X"00",X"0A",X"7E",X"81",X"4F",X"19",X"10",X"FA",X"3E",X"5A", + X"B9",X"20",X"AD",X"3E",X"01",X"32",X"04",X"89",X"32",X"08",X"88",X"32",X"0A",X"88",X"AF",X"21", + X"28",X"89",X"06",X"09",X"D7",X"21",X"80",X"8A",X"77",X"11",X"81",X"8A",X"01",X"40",X"02",X"ED", + X"B0",X"3E",X"10",X"21",X"42",X"84",X"0E",X"1D",X"06",X"1D",X"D7",X"23",X"23",X"23",X"0D",X"20", + X"F7",X"C9",X"3A",X"FA",X"8A",X"A7",X"C8",X"DD",X"21",X"E0",X"8A",X"11",X"48",X"00",X"DD",X"19", + X"DD",X"7E",X"02",X"EF",X"3A",X"68",X"57",X"68",X"AC",X"68",X"DD",X"34",X"02",X"AF",X"DD",X"77", + X"03",X"DD",X"77",X"05",X"DD",X"36",X"04",X"08",X"DD",X"36",X"06",X"1E",X"11",X"EF",X"68",X"CD", + X"1E",X"38",X"DD",X"36",X"09",X"18",X"C9",X"CD",X"06",X"40",X"DD",X"7E",X"05",X"DD",X"96",X"09", + X"30",X"03",X"DD",X"35",X"06",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"FE",X"1B",X"D0",X"DD",X"34", + X"02",X"21",X"BC",X"86",X"11",X"A3",X"68",X"01",X"00",X"08",X"1A",X"86",X"81",X"4F",X"13",X"7D", + X"D6",X"20",X"30",X"01",X"25",X"6F",X"10",X"F2",X"06",X"08",X"7C",X"D6",X"04",X"67",X"7E",X"81", + X"4F",X"7D",X"C6",X"20",X"30",X"01",X"24",X"10",X"F5",X"1A",X"81",X"C2",X"B3",X"08",X"11",X"13", + X"06",X"FF",X"C9",X"16",X"10",X"05",X"01",X"02",X"0F",X"03",X"07",X"B8",X"21",X"55",X"8F",X"7E", + X"A7",X"C0",X"34",X"21",X"02",X"84",X"11",X"00",X"00",X"7E",X"83",X"5F",X"30",X"01",X"14",X"2C", + X"7D",X"E6",X"1F",X"FE",X"1F",X"20",X"F2",X"7D",X"C6",X"03",X"6F",X"30",X"EC",X"24",X"7C",X"FE", + X"88",X"38",X"E6",X"21",X"EB",X"68",X"06",X"04",X"7B",X"BE",X"28",X"06",X"23",X"10",X"FA",X"C3", + X"D4",X"76",X"7A",X"23",X"BE",X"C8",X"10",X"FA",X"C3",X"29",X"38",X"43",X"95",X"89",X"87",X"40", + X"15",X"08",X"40",X"1E",X"08",X"FF",X"EF",X"68",X"CD",X"05",X"69",X"CD",X"AD",X"69",X"CD",X"0F", + X"6A",X"CD",X"7F",X"6A",X"C9",X"21",X"29",X"89",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"2E",X"2D", + X"7E",X"2E",X"03",X"BE",X"C8",X"FE",X"08",X"D0",X"DD",X"21",X"E0",X"8A",X"FD",X"21",X"A0",X"8B", + X"11",X"18",X"00",X"06",X"08",X"D9",X"CD",X"31",X"69",X"D9",X"DD",X"19",X"FD",X"19",X"10",X"F5", + X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D8",X"AF",X"DD",X"77",X"03",X"DD",X"77",X"05", + X"3C",X"DD",X"77",X"00",X"FD",X"77",X"00",X"DD",X"36",X"04",X"15",X"DD",X"36",X"06",X"1E",X"FD", + X"36",X"03",X"80",X"FD",X"36",X"05",X"A0",X"FD",X"36",X"04",X"14",X"FD",X"36",X"06",X"1E",X"FD", + X"36",X"0F",X"03",X"FD",X"36",X"10",X"40",X"DD",X"36",X"09",X"24",X"FD",X"36",X"09",X"24",X"11", + X"38",X"38",X"CD",X"1E",X"38",X"3E",X"10",X"32",X"29",X"89",X"3A",X"2D",X"89",X"A7",X"20",X"27", + X"11",X"25",X"06",X"FF",X"1E",X"0A",X"FF",X"21",X"3B",X"86",X"3A",X"03",X"89",X"47",X"AF",X"C6", + X"01",X"27",X"10",X"FB",X"5F",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"77",X"01",X"E0",X"FF",X"09", + X"7B",X"E6",X"0F",X"77",X"CD",X"97",X"0F",X"21",X"2D",X"89",X"34",X"F1",X"C9",X"DD",X"21",X"E0", + X"8A",X"FD",X"21",X"A0",X"8B",X"11",X"18",X"00",X"06",X"08",X"D9",X"CD",X"C6",X"69",X"D9",X"DD", + X"19",X"FD",X"19",X"10",X"F5",X"C9",X"DD",X"7E",X"00",X"A7",X"C8",X"DD",X"7E",X"02",X"A7",X"C0", + X"CD",X"06",X"40",X"FD",X"7E",X"05",X"FD",X"96",X"09",X"30",X"03",X"FD",X"35",X"06",X"FD",X"77", + X"05",X"DD",X"7E",X"05",X"DD",X"96",X"09",X"30",X"03",X"DD",X"35",X"06",X"DD",X"77",X"05",X"DD", + X"7E",X"06",X"FE",X"06",X"20",X"08",X"21",X"2B",X"89",X"7E",X"A7",X"C0",X"34",X"C9",X"FE",X"01", + X"D0",X"AF",X"DD",X"E5",X"E1",X"06",X"18",X"D7",X"FD",X"E5",X"E1",X"06",X"18",X"D7",X"C9",X"21", + X"2B",X"89",X"7E",X"A7",X"C8",X"23",X"7E",X"FE",X"06",X"C8",X"2E",X"2A",X"7E",X"A7",X"28",X"02", + X"35",X"C9",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"06",X"12",X"D9",X"CD",X"35",X"6A",X"D9", + X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D8",X"AF",X"DD",X"77", + X"03",X"DD",X"77",X"05",X"3C",X"DD",X"77",X"01",X"DD",X"77",X"02",X"DD",X"36",X"04",X"15",X"DD", + X"36",X"06",X"1E",X"DD",X"36",X"09",X"28",X"21",X"2A",X"89",X"36",X"10",X"2E",X"2C",X"7E",X"34", + X"FE",X"02",X"28",X"0E",X"30",X"11",X"A7",X"28",X"04",X"2E",X"2A",X"36",X"1C",X"11",X"D4",X"76", + X"18",X"08",X"11",X"EF",X"68",X"18",X"03",X"11",X"0A",X"6B",X"CD",X"1E",X"38",X"F1",X"C9",X"3A", + X"2B",X"89",X"A7",X"28",X"40",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"06",X"12",X"D9",X"CD", + X"98",X"6A",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"01",X"A7",X"C8",X"DD",X"7E",X"02", + X"3D",X"E6",X"03",X"EF",X"A8",X"6A",X"DF",X"67",X"CD",X"06",X"40",X"DD",X"7E",X"05",X"DD",X"96", + X"09",X"30",X"03",X"DD",X"35",X"06",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"A7",X"C0",X"32",X"56", + X"8F",X"DD",X"34",X"02",X"C9",X"3A",X"2D",X"89",X"FE",X"02",X"C0",X"3A",X"56",X"8F",X"A7",X"C0", + X"3C",X"32",X"56",X"8F",X"21",X"50",X"84",X"11",X"00",X"00",X"7B",X"86",X"5F",X"30",X"01",X"14", + X"2C",X"7D",X"E6",X"1F",X"FE",X"1B",X"20",X"03",X"2C",X"18",X"EF",X"FE",X"1F",X"20",X"EB",X"3E", + X"12",X"85",X"6F",X"30",X"E5",X"24",X"7C",X"FE",X"88",X"38",X"DF",X"7B",X"FE",X"B8",X"28",X"03", + X"C3",X"29",X"09",X"7A",X"FE",X"29",X"C2",X"29",X"38",X"C9",X"C0",X"03",X"08",X"C0",X"09",X"08", + X"FF",X"0A",X"6B",X"21",X"06",X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"36",X"0C",X"23",X"34", + X"7E",X"E6",X"01",X"11",X"44",X"27",X"21",X"B4",X"84",X"28",X"03",X"11",X"48",X"27",X"D5",X"CD", + X"25",X"33",X"11",X"A0",X"FF",X"19",X"D1",X"CD",X"25",X"33",X"C9",X"3A",X"06",X"88",X"A7",X"C0", + X"3A",X"5F",X"8D",X"A7",X"C0",X"3A",X"07",X"89",X"E6",X"01",X"C0",X"21",X"5E",X"8D",X"7E",X"A7", + X"C8",X"FE",X"01",X"28",X"02",X"35",X"C9",X"3E",X"11",X"32",X"0A",X"88",X"32",X"5F",X"8D",X"3E", + X"FF",X"32",X"5E",X"8D",X"11",X"18",X"00",X"DD",X"21",X"E0",X"8A",X"FD",X"21",X"80",X"8D",X"06", + X"0B",X"DD",X"7E",X"04",X"E6",X"1F",X"FE",X"06",X"38",X"1D",X"FE",X"1A",X"30",X"19",X"DD",X"E5", + X"E1",X"FD",X"75",X"00",X"FD",X"74",X"01",X"DD",X"7E",X"06",X"FD",X"77",X"02",X"DD",X"36",X"06", + X"00",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"DD",X"19",X"10",X"D6",X"11",X"2B",X"06",X"FF",X"11", + X"2C",X"06",X"FF",X"11",X"2D",X"06",X"FF",X"11",X"2E",X"06",X"FF",X"11",X"2F",X"06",X"FF",X"C3", + X"EF",X"02",X"21",X"5E",X"8D",X"35",X"C0",X"FD",X"21",X"80",X"8D",X"11",X"03",X"00",X"06",X"0B", + X"AF",X"FD",X"66",X"01",X"B4",X"28",X"09",X"FD",X"6E",X"00",X"FD",X"7E",X"02",X"19",X"19",X"77", + X"FD",X"19",X"10",X"EC",X"3E",X"04",X"32",X"0A",X"88",X"11",X"AB",X"06",X"FF",X"11",X"AC",X"06", + X"FF",X"11",X"AD",X"06",X"FF",X"11",X"AE",X"06",X"FF",X"11",X"AF",X"06",X"18",X"C0",X"3A",X"52", + X"8D",X"A7",X"28",X"20",X"21",X"87",X"8A",X"3D",X"28",X"0D",X"CB",X"DE",X"CB",X"96",X"21",X"53", + X"8D",X"35",X"C0",X"AF",X"2D",X"77",X"C9",X"CB",X"D6",X"CB",X"9E",X"21",X"53",X"8D",X"35",X"C0", + X"AF",X"2D",X"77",X"C9",X"CD",X"18",X"6C",X"C9",X"DD",X"21",X"40",X"88",X"FD",X"21",X"7C",X"88", + X"21",X"E8",X"8B",X"06",X"03",X"CD",X"3F",X"6C",X"11",X"04",X"00",X"FD",X"19",X"1E",X"18",X"19", + X"10",X"F3",X"21",X"87",X"8A",X"CB",X"96",X"CB",X"9E",X"21",X"54",X"8D",X"36",X"00",X"C9",X"CB", + X"46",X"C8",X"1E",X"10",X"16",X"00",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E",X"02",X"82",X"57", + X"FD",X"7E",X"00",X"C6",X"20",X"93",X"30",X"02",X"ED",X"44",X"FE",X"18",X"D0",X"0E",X"00",X"FD", + X"7E",X"02",X"C6",X"08",X"92",X"30",X"04",X"0E",X"FF",X"ED",X"44",X"FE",X"0E",X"D0",X"21",X"54", + X"8D",X"36",X"01",X"DD",X"7E",X"02",X"21",X"87",X"8A",X"0C",X"20",X"13",X"FE",X"B6",X"38",X"1B", + X"CB",X"D6",X"CB",X"9E",X"0E",X"01",X"21",X"52",X"8D",X"71",X"2C",X"36",X"18",X"F1",X"C9",X"FE", + X"51",X"30",X"12",X"CB",X"DE",X"CB",X"96",X"0E",X"02",X"18",X"EB",X"FE",X"51",X"38",X"F4",X"CB", + X"DE",X"CB",X"96",X"F1",X"C9",X"CB",X"D6",X"CB",X"9E",X"F1",X"C9",X"3A",X"06",X"88",X"A7",X"C0", + X"3A",X"32",X"8D",X"A7",X"C0",X"3A",X"24",X"8F",X"A7",X"21",X"87",X"8A",X"28",X"03",X"AF",X"77", + X"C9",X"CD",X"EE",X"6B",X"3A",X"54",X"8D",X"A7",X"C0",X"21",X"87",X"8A",X"3A",X"30",X"8F",X"FE", + X"01",X"28",X"3A",X"3A",X"41",X"8F",X"A7",X"C2",X"4D",X"6D",X"21",X"42",X"88",X"DD",X"21",X"E0", + X"8A",X"FD",X"21",X"52",X"88",X"06",X"06",X"DD",X"7E",X"00",X"A7",X"20",X"2A",X"11",X"18",X"00", + X"DD",X"19",X"11",X"04",X"00",X"FD",X"19",X"10",X"EE",X"3A",X"41",X"8F",X"A7",X"C8",X"3A",X"42", + X"88",X"4F",X"ED",X"5B",X"41",X"8F",X"21",X"87",X"8A",X"1A",X"B9",X"30",X"05",X"CB",X"D6",X"CB", + X"9E",X"C9",X"CB",X"DE",X"CB",X"96",X"C9",X"FD",X"7E",X"00",X"FE",X"40",X"38",X"CF",X"FE",X"C0", + X"30",X"CB",X"96",X"30",X"01",X"2F",X"4F",X"3A",X"40",X"8F",X"A7",X"28",X"04",X"B9",X"30",X"BD", + X"79",X"32",X"40",X"8F",X"FD",X"E5",X"D1",X"7B",X"32",X"41",X"8F",X"7A",X"32",X"42",X"8F",X"DD", + X"E5",X"D1",X"13",X"7B",X"32",X"43",X"8F",X"7A",X"32",X"44",X"8F",X"18",X"A0",X"2A",X"43",X"8F", + X"7E",X"A7",X"20",X"0C",X"2A",X"41",X"8F",X"7E",X"FE",X"40",X"38",X"04",X"FE",X"C0",X"38",X"08", + X"AF",X"21",X"40",X"8F",X"06",X"05",X"D7",X"C9",X"4F",X"3A",X"07",X"89",X"CB",X"47",X"3A",X"42", + X"88",X"20",X"04",X"D6",X"02",X"18",X"02",X"C6",X"14",X"21",X"87",X"8A",X"47",X"3A",X"03",X"8F", + X"3C",X"32",X"03",X"8F",X"E6",X"07",X"20",X"0D",X"78",X"C6",X"08",X"B9",X"38",X"07",X"D6",X"10", + X"B9",X"3E",X"10",X"38",X"01",X"AF",X"77",X"78",X"B9",X"28",X"06",X"DA",X"12",X"6D",X"C3",X"0D", + X"6D",X"CB",X"96",X"CB",X"9E",X"C9",X"3A",X"51",X"8F",X"EF",X"B8",X"6D",X"59",X"6E",X"42",X"6F", + X"5E",X"6F",X"9D",X"6F",X"32",X"70",X"5F",X"70",X"CD",X"BC",X"0F",X"3A",X"07",X"89",X"CB",X"3F", + X"CB",X"3F",X"FE",X"07",X"38",X"02",X"3E",X"07",X"E6",X"07",X"21",X"F3",X"70",X"CD",X"45",X"0C", + X"ED",X"53",X"4A",X"8F",X"3E",X"40",X"32",X"48",X"8F",X"21",X"51",X"8F",X"34",X"3A",X"07",X"89", + X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"D0",X"21",X"C8",X"0A",X"11",X"F9",X"6D",X"06",X"60",X"1A", + X"BE",X"C2",X"71",X"70",X"23",X"13",X"10",X"F7",X"C9",X"21",X"41",X"8D",X"35",X"20",X"03",X"CD", + X"28",X"0A",X"CD",X"F8",X"09",X"21",X"50",X"8E",X"35",X"C0",X"36",X"02",X"2A",X"54",X"8E",X"7E", + X"23",X"22",X"54",X"8E",X"2A",X"56",X"8E",X"77",X"11",X"E0",X"FF",X"19",X"22",X"56",X"8E",X"21", + X"52",X"8E",X"35",X"C0",X"36",X"0D",X"21",X"50",X"8E",X"36",X"14",X"2C",X"34",X"2A",X"56",X"8E", + X"11",X"00",X"00",X"06",X"0E",X"7E",X"83",X"5F",X"30",X"01",X"14",X"3E",X"20",X"85",X"6F",X"30", + X"01",X"24",X"10",X"F1",X"2A",X"48",X"8F",X"7E",X"BB",X"C2",X"42",X"74",X"23",X"7E",X"BA",X"C2", + X"EA",X"76",X"23",X"22",X"48",X"8F",X"C9",X"C6",X"01",X"CD",X"83",X"15",X"CD",X"75",X"6E",X"CD", + X"55",X"1E",X"CD",X"D4",X"20",X"CD",X"EF",X"02",X"CD",X"DA",X"18",X"CD",X"1C",X"19",X"CD",X"04", + X"64",X"CD",X"64",X"0E",X"C9",X"21",X"1E",X"88",X"3A",X"F0",X"8E",X"B6",X"C2",X"92",X"4C",X"CD", + X"86",X"6E",X"CD",X"DB",X"6E",X"C9",X"21",X"48",X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"3A", + X"49",X"8F",X"CB",X"4F",X"3E",X"20",X"28",X"02",X"3E",X"2C",X"77",X"2A",X"4A",X"8F",X"7E",X"FE", + X"FF",X"C8",X"23",X"22",X"4A",X"8F",X"47",X"DD",X"21",X"C8",X"8A",X"11",X"18",X"00",X"DD",X"19", + X"10",X"FC",X"21",X"EA",X"8B",X"11",X"18",X"00",X"06",X"03",X"7E",X"A7",X"28",X"0B",X"19",X"10", + X"F9",X"2A",X"4A",X"8F",X"2B",X"22",X"4A",X"8F",X"C9",X"DD",X"36",X"02",X"06",X"11",X"6A",X"39", + X"CD",X"1E",X"38",X"CD",X"6C",X"3A",X"21",X"49",X"8F",X"34",X"C9",X"DD",X"21",X"E0",X"8A",X"11", + X"18",X"00",X"06",X"0E",X"D9",X"CD",X"2D",X"6F",X"D9",X"DD",X"19",X"10",X"F7",X"2A",X"4A",X"8F", + X"7E",X"FE",X"FF",X"C0",X"21",X"EA",X"8B",X"11",X"18",X"00",X"06",X"03",X"7E",X"A7",X"C0",X"19", + X"10",X"FA",X"21",X"51",X"8F",X"34",X"23",X"11",X"35",X"06",X"FF",X"3A",X"47",X"8F",X"47",X"CB", + X"27",X"80",X"BE",X"11",X"08",X"06",X"20",X"07",X"3E",X"04",X"32",X"51",X"8F",X"1E",X"10",X"3E", + X"40",X"32",X"48",X"8F",X"FF",X"AF",X"21",X"90",X"8C",X"06",X"30",X"D7",X"C9",X"DD",X"7E",X"02", + X"FE",X"02",X"CA",X"36",X"35",X"D6",X"0B",X"30",X"04",X"CD",X"06",X"40",X"C9",X"EF",X"69",X"3E", + X"9C",X"3E",X"21",X"51",X"8F",X"34",X"23",X"7E",X"A7",X"28",X"04",X"47",X"CD",X"31",X"11",X"21", + X"34",X"86",X"CD",X"19",X"11",X"09",X"09",X"7B",X"87",X"27",X"CD",X"19",X"11",X"C9",X"21",X"48", + X"8F",X"7E",X"FE",X"20",X"20",X"13",X"2E",X"52",X"7E",X"A7",X"28",X"0B",X"11",X"15",X"03",X"FF", + X"3A",X"E5",X"89",X"A7",X"C0",X"35",X"C0",X"2E",X"48",X"35",X"C0",X"36",X"60",X"3A",X"07",X"89", + X"FE",X"03",X"C2",X"98",X"6F",X"21",X"32",X"0B",X"11",X"71",X"70",X"06",X"79",X"1A",X"BE",X"C2", + X"F9",X"6D",X"23",X"13",X"10",X"F7",X"26",X"8F",X"2E",X"51",X"36",X"06",X"C9",X"3A",X"47",X"8F", + X"21",X"34",X"86",X"77",X"47",X"AF",X"C6",X"05",X"10",X"FC",X"32",X"47",X"8F",X"11",X"E0",X"FF", + X"06",X"03",X"19",X"36",X"00",X"10",X"FB",X"21",X"51",X"8F",X"34",X"2E",X"48",X"36",X"80",X"DD", + X"21",X"C5",X"6A",X"21",X"ED",X"6F",X"06",X"44",X"DD",X"7E",X"00",X"BE",X"20",X"14",X"DD",X"2C", + X"DD",X"7D",X"A7",X"20",X"02",X"DD",X"24",X"23",X"10",X"EE",X"CD",X"44",X"0F",X"11",X"27",X"06", + X"FF",X"C9",X"AF",X"21",X"00",X"88",X"11",X"01",X"88",X"77",X"ED",X"B0",X"C9",X"3A",X"2D",X"89", + X"FE",X"02",X"C0",X"3A",X"56",X"8F",X"A7",X"C0",X"3C",X"32",X"56",X"8F",X"21",X"50",X"84",X"11", + X"00",X"00",X"7B",X"86",X"5F",X"30",X"01",X"14",X"2C",X"7D",X"E6",X"1F",X"FE",X"1B",X"20",X"03", + X"2C",X"18",X"EF",X"FE",X"1F",X"20",X"EB",X"3E",X"12",X"85",X"6F",X"30",X"E5",X"24",X"7C",X"FE", + X"88",X"38",X"DF",X"7B",X"FE",X"B8",X"28",X"03",X"C3",X"29",X"09",X"7A",X"FE",X"29",X"C2",X"29", + X"38",X"C9",X"21",X"47",X"8F",X"7E",X"A7",X"C4",X"59",X"70",X"23",X"7E",X"A7",X"28",X"14",X"35", + X"7E",X"E6",X"0F",X"A7",X"C0",X"2E",X"54",X"34",X"CB",X"46",X"11",X"A7",X"06",X"28",X"02",X"1E", + X"27",X"FF",X"C9",X"36",X"20",X"2E",X"51",X"34",X"C9",X"35",X"11",X"15",X"03",X"FF",X"C9",X"21", + X"48",X"8F",X"35",X"C0",X"CD",X"CF",X"0E",X"AF",X"32",X"52",X"8F",X"3E",X"06",X"32",X"0A",X"88", + X"C9",X"21",X"BC",X"82",X"11",X"E0",X"FF",X"06",X"0A",X"7E",X"19",X"BE",X"C2",X"B3",X"08",X"10", + X"F8",X"21",X"41",X"8D",X"35",X"20",X"03",X"CD",X"28",X"0A",X"CD",X"F8",X"09",X"21",X"50",X"8E", + X"35",X"C0",X"36",X"01",X"2C",X"35",X"3A",X"53",X"8E",X"3D",X"21",X"AB",X"0B",X"CD",X"45",X"0C", + X"ED",X"53",X"56",X"8E",X"21",X"53",X"8E",X"35",X"C0",X"21",X"50",X"8E",X"36",X"96",X"2C",X"AF", + X"77",X"21",X"62",X"84",X"57",X"5F",X"0E",X"0E",X"06",X"1D",X"7B",X"86",X"30",X"01",X"14",X"5F", + X"23",X"10",X"F7",X"7D",X"C6",X"03",X"6F",X"30",X"01",X"24",X"0D",X"20",X"EB",X"2A",X"48",X"8F", + X"7B",X"BE",X"C2",X"B3",X"08",X"23",X"7E",X"BA",X"C2",X"E9",X"08",X"AF",X"32",X"48",X"8F",X"32", + X"49",X"8F",X"3E",X"03",X"32",X"05",X"88",X"C3",X"00",X"0E",X"59",X"63",X"0C",X"C2",X"0B",X"62", + X"0B",X"22",X"0B",X"03",X"71",X"13",X"71",X"26",X"71",X"3C",X"71",X"55",X"71",X"6E",X"71",X"87", + X"71",X"A0",X"71",X"01",X"02",X"03",X"04",X"05",X"05",X"05",X"04",X"04",X"03",X"03",X"02",X"02", + X"01",X"01",X"FF",X"01",X"01",X"02",X"02",X"03",X"03",X"04",X"04",X"05",X"05",X"06",X"06",X"06", + X"05",X"04",X"03",X"02",X"01",X"FF",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"07",X"06",X"05", + X"04",X"03",X"02",X"03",X"04",X"02",X"03",X"04",X"05",X"06",X"07",X"FF",X"01",X"01",X"02",X"02", + X"03",X"03",X"04",X"04",X"05",X"05",X"06",X"06",X"07",X"07",X"08",X"08",X"08",X"07",X"06",X"05", + X"04",X"03",X"04",X"05",X"FF",X"01",X"02",X"03",X"02",X"04",X"05",X"03",X"02",X"04",X"04",X"05", + X"05",X"06",X"06",X"07",X"07",X"08",X"08",X"08",X"07",X"06",X"05",X"04",X"03",X"FF",X"01",X"02", + X"03",X"04",X"05",X"06",X"07",X"08",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"01",X"02", + X"03",X"04",X"05",X"06",X"07",X"08",X"FF",X"03",X"02",X"02",X"01",X"01",X"02",X"03",X"02",X"03", + X"04",X"05",X"06",X"06",X"05",X"04",X"04",X"05",X"06",X"07",X"08",X"08",X"07",X"07",X"08",X"FF", + X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"08",X"08",X"07",X"07",X"06",X"06",X"05",X"05", + X"04",X"04",X"03",X"03",X"02",X"02",X"01",X"01",X"FF",X"3A",X"38",X"8F",X"21",X"EF",X"02",X"E5", + X"EF",X"C7",X"71",X"A0",X"72",X"21",X"74",X"CD",X"CE",X"71",X"CD",X"D4",X"20",X"C9",X"21",X"36", + X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"21",X"99",X"8A",X"3A",X"90",X"8C",X"B6",X"21",X"87", + X"8A",X"20",X"1A",X"3A",X"5B",X"8F",X"A7",X"20",X"0F",X"3A",X"84",X"8A",X"FE",X"60",X"38",X"03", + X"32",X"5B",X"8F",X"CB",X"96",X"CB",X"DE",X"C9",X"CB",X"D6",X"CB",X"9E",X"C9",X"3A",X"84",X"8A", + X"FE",X"59",X"28",X"07",X"30",X"DD",X"CB",X"96",X"CB",X"DE",X"C9",X"3A",X"39",X"8F",X"A7",X"20", + X"0A",X"3E",X"01",X"32",X"39",X"8F",X"CB",X"96",X"CB",X"9E",X"C9",X"FE",X"02",X"28",X"0B",X"3E", + X"02",X"32",X"39",X"8F",X"3E",X"10",X"32",X"87",X"8A",X"C9",X"21",X"3E",X"8F",X"7E",X"A7",X"C2", + X"92",X"72",X"2E",X"3B",X"34",X"7E",X"E6",X"07",X"C2",X"87",X"72",X"3A",X"96",X"8C",X"CB",X"3F", + X"CB",X"3F",X"CB",X"3F",X"3C",X"47",X"21",X"E0",X"87",X"11",X"E0",X"FF",X"19",X"10",X"FD",X"CD", + X"87",X"72",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"3C",X"47",X"23",X"10",X"FD",X"36",X"2C",X"11", + X"00",X"FC",X"19",X"3A",X"96",X"8C",X"E6",X"06",X"FE",X"06",X"3A",X"94",X"8C",X"28",X"0C",X"E6", + X"06",X"FE",X"02",X"28",X"03",X"36",X"00",X"C9",X"36",X"40",X"C9",X"E6",X"06",X"FE",X"02",X"28", + X"03",X"36",X"80",X"C9",X"36",X"C0",X"C9",X"3A",X"94",X"8C",X"FE",X"D0",X"D8",X"3E",X"01",X"32", + X"3E",X"8F",X"AF",X"32",X"87",X"8A",X"32",X"5B",X"8F",X"21",X"38",X"8F",X"34",X"23",X"77",X"C9", + X"CD",X"D4",X"20",X"CD",X"A7",X"72",X"C9",X"21",X"3A",X"8F",X"7E",X"A7",X"20",X"04",X"CD",X"E1", + X"72",X"C9",X"3A",X"3C",X"8F",X"A7",X"CA",X"E3",X"73",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00", + X"3A",X"3D",X"8F",X"87",X"47",X"D9",X"CD",X"CF",X"72",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD", + X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"EF",X"3C",X"73",X"95",X"73",X"CE", + X"73",X"3A",X"90",X"8C",X"A7",X"C0",X"3C",X"32",X"3A",X"8F",X"21",X"3D",X"8F",X"34",X"7E",X"FE", + X"04",X"20",X"08",X"2E",X"38",X"34",X"2E",X"36",X"36",X"20",X"C9",X"87",X"32",X"3C",X"8F",X"47", + X"21",X"09",X"74",X"11",X"18",X"00",X"DD",X"21",X"E0",X"8A",X"DD",X"36",X"00",X"01",X"7E",X"DD", + X"77",X"06",X"23",X"7E",X"DD",X"77",X"10",X"23",X"7E",X"DD",X"77",X"04",X"23",X"7E",X"DD",X"77", + X"0F",X"23",X"DD",X"7D",X"CB",X"5F",X"28",X"04",X"DD",X"36",X"03",X"80",X"DD",X"36",X"05",X"80", + X"DD",X"19",X"10",X"D6",X"78",X"21",X"38",X"8F",X"77",X"23",X"77",X"C9",X"3A",X"96",X"8C",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"DD",X"BE",X"06",X"28",X"05",X"3C",X"DD",X"BE",X"06",X"C0",X"3A", + X"94",X"8C",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6",X"04",X"DD",X"BE",X"04",X"28",X"07",X"D8", + X"D6",X"05",X"DD",X"BE",X"04",X"D0",X"DD",X"34",X"02",X"DD",X"7D",X"CB",X"5F",X"20",X"1B",X"11", + X"86",X"40",X"CD",X"1E",X"38",X"DD",X"36",X"09",X"40",X"21",X"39",X"8F",X"34",X"3A",X"3D",X"8F", + X"BE",X"C0",X"7E",X"11",X"30",X"06",X"83",X"5F",X"FF",X"C9",X"11",X"03",X"74",X"CD",X"1E",X"38", + X"DD",X"36",X"09",X"38",X"C9",X"CD",X"06",X"40",X"DD",X"7D",X"CB",X"5F",X"20",X"18",X"DD",X"7E", + X"03",X"DD",X"86",X"09",X"DD",X"77",X"03",X"30",X"03",X"DD",X"34",X"04",X"DD",X"7E",X"04",X"FE", + X"1D",X"D8",X"DD",X"34",X"02",X"C9",X"DD",X"7E",X"03",X"DD",X"96",X"09",X"DD",X"77",X"03",X"30", + X"03",X"DD",X"35",X"04",X"DD",X"7E",X"04",X"FE",X"04",X"D0",X"DD",X"34",X"02",X"C9",X"DD",X"7D", + X"6F",X"DD",X"7C",X"67",X"AF",X"06",X"18",X"D7",X"21",X"3C",X"8F",X"35",X"C0",X"3E",X"30",X"32", + X"36",X"8F",X"C9",X"21",X"36",X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"3A",X"3D",X"8F",X"A7", + X"28",X"06",X"11",X"B0",X"06",X"83",X"5F",X"FF",X"3E",X"18",X"32",X"36",X"8F",X"AF",X"21",X"3A", + X"8F",X"77",X"C9",X"40",X"21",X"10",X"FF",X"03",X"74",X"0D",X"40",X"0D",X"29",X"0D",X"40",X"0B", + X"21",X"09",X"40",X"15",X"29",X"09",X"40",X"13",X"21",X"13",X"40",X"0C",X"29",X"13",X"40",X"0A", + X"21",X"21",X"36",X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"21",X"37",X"8F",X"06",X"09",X"D7", + X"21",X"E0",X"8A",X"06",X"48",X"D7",X"32",X"0A",X"88",X"32",X"5B",X"8F",X"3E",X"07",X"32",X"51", + X"8E",X"C9",X"3A",X"21",X"89",X"E6",X"03",X"EF",X"4E",X"74",X"17",X"75",X"5D",X"75",X"AF",X"32", + X"B7",X"88",X"11",X"F0",X"4A",X"21",X"E1",X"43",X"22",X"BA",X"88",X"ED",X"53",X"45",X"8F",X"21", + X"42",X"84",X"22",X"B8",X"88",X"21",X"42",X"80",X"22",X"43",X"8F",X"21",X"21",X"89",X"34",X"21", + X"9A",X"74",X"11",X"00",X"00",X"06",X"08",X"1A",X"BE",X"C2",X"86",X"74",X"23",X"13",X"10",X"F7", + X"DD",X"21",X"92",X"00",X"06",X"74",X"DD",X"7E",X"00",X"BE",X"C2",X"DF",X"67",X"23",X"DD",X"2C", + X"DD",X"7D",X"A7",X"20",X"02",X"DD",X"24",X"10",X"ED",X"C9",X"AF",X"32",X"80",X"A1",X"C3",X"92", + X"00",X"FF",X"32",X"00",X"A0",X"31",X"00",X"90",X"32",X"00",X"88",X"06",X"08",X"C5",X"21",X"00", + X"00",X"DD",X"21",X"79",X"00",X"11",X"00",X"00",X"4A",X"7B",X"86",X"5F",X"30",X"04",X"14",X"20", + X"01",X"0C",X"2C",X"20",X"F4",X"24",X"7C",X"E6",X"0F",X"20",X"EE",X"32",X"00",X"A0",X"7B",X"DD", + X"BE",X"00",X"20",X"0C",X"7A",X"DD",X"BE",X"01",X"20",X"06",X"79",X"DD",X"BE",X"02",X"28",X"02", + X"18",X"06",X"E5",X"21",X"FF",X"8F",X"34",X"E1",X"DD",X"23",X"DD",X"23",X"DD",X"23",X"10",X"C5", + X"3A",X"E0",X"A0",X"E6",X"0F",X"21",X"69",X"00",X"E7",X"7E",X"B7",X"18",X"16",X"57",X"E6",X"0F", + X"5F",X"AA",X"0F",X"0F",X"0F",X"0F",X"CD",X"FA",X"00",X"7B",X"FE",X"0A",X"38",X"02",X"C6",X"07", + X"77",X"09",X"C9",X"32",X"00",X"A0",X"CD",X"CD",X"81",X"43",X"21",X"B7",X"88",X"34",X"7E",X"FE", + X"1C",X"C0",X"21",X"20",X"89",X"7E",X"34",X"A7",X"32",X"B7",X"88",X"C8",X"21",X"BC",X"82",X"11", + X"00",X"00",X"0E",X"02",X"06",X"0E",X"7E",X"83",X"5F",X"30",X"01",X"14",X"7D",X"D6",X"20",X"6F", + X"30",X"01",X"25",X"10",X"F1",X"0D",X"21",X"BC",X"86",X"20",X"E9",X"7B",X"FE",X"4F",X"C2",X"E1", + X"43",X"15",X"C2",X"2C",X"46",X"21",X"21",X"89",X"34",X"CD",X"B2",X"0F",X"C9",X"CD",X"6D",X"75", + X"CD",X"21",X"76",X"CD",X"13",X"6B",X"CD",X"AF",X"76",X"CD",X"EF",X"02",X"C9",X"21",X"29",X"89", + X"7E",X"A7",X"28",X"02",X"35",X"C9",X"3A",X"2D",X"89",X"FE",X"08",X"C8",X"DD",X"21",X"E0",X"8A", + X"FD",X"21",X"70",X"8B",X"11",X"18",X"00",X"06",X"08",X"D9",X"CD",X"95",X"75",X"D9",X"DD",X"19", + X"FD",X"19",X"10",X"F5",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D8",X"DD",X"36",X"00", + X"01",X"AF",X"DD",X"77",X"03",X"DD",X"77",X"05",X"DD",X"36",X"04",X"15",X"DD",X"36",X"06",X"1E", + X"3A",X"2D",X"89",X"FE",X"02",X"38",X"31",X"AF",X"FD",X"77",X"03",X"FD",X"77",X"05",X"FD",X"36", + X"04",X"14",X"FD",X"36",X"06",X"1E",X"21",X"18",X"76",X"3A",X"22",X"89",X"E7",X"FD",X"77",X"17", + X"21",X"57",X"56",X"CD",X"45",X"0C",X"FD",X"73",X"0C",X"FD",X"72",X"0D",X"FD",X"36",X"09",X"18", + X"FD",X"36",X"00",X"01",X"21",X"22",X"89",X"34",X"DD",X"36",X"09",X"18",X"3A",X"2D",X"89",X"FE", + X"02",X"38",X"02",X"3E",X"02",X"21",X"1E",X"76",X"E7",X"32",X"29",X"89",X"21",X"2D",X"89",X"34", + X"7E",X"FE",X"03",X"11",X"DD",X"76",X"30",X"03",X"11",X"D4",X"76",X"CD",X"1E",X"38",X"3A",X"2D", + X"89",X"87",X"87",X"FD",X"77",X"11",X"F1",X"C9",X"03",X"04",X"02",X"00",X"01",X"03",X"16",X"28", + X"12",X"06",X"0E",X"18",X"02",X"06",X"08",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"D9",X"CD", + X"38",X"76",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"02",X"E6",X"03",X"EF",X"44",X"76", + X"75",X"76",X"A6",X"76",X"DD",X"7E",X"00",X"A7",X"C8",X"CD",X"06",X"40",X"DD",X"7E",X"05",X"DD", + X"96",X"09",X"30",X"03",X"DD",X"35",X"06",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"FE",X"06",X"D0", + X"3E",X"20",X"32",X"2E",X"89",X"11",X"18",X"00",X"06",X"0E",X"3E",X"01",X"DD",X"77",X"02",X"DD", + X"19",X"10",X"F9",X"F1",X"C9",X"CD",X"06",X"40",X"21",X"2E",X"89",X"7E",X"A7",X"28",X"02",X"35", + X"C9",X"3E",X"02",X"21",X"E2",X"8A",X"11",X"18",X"00",X"06",X"08",X"77",X"19",X"10",X"FC",X"AF", + X"21",X"A2",X"8B",X"11",X"18",X"00",X"06",X"06",X"77",X"19",X"10",X"FC",X"32",X"57",X"8D",X"3E", + X"08",X"32",X"51",X"8E",X"F1",X"C9",X"3A",X"58",X"8D",X"A7",X"C0",X"CD",X"06",X"40",X"C9",X"21", + X"2A",X"89",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"36",X"16",X"23",X"34",X"7E",X"E6",X"01",X"11", + X"E6",X"76",X"20",X"03",X"11",X"E8",X"76",X"21",X"71",X"84",X"01",X"40",X"00",X"1A",X"77",X"13", + X"09",X"1A",X"77",X"C9",X"45",X"0D",X"08",X"45",X"36",X"08",X"FF",X"D4",X"76",X"C0",X"03",X"08", + X"C0",X"09",X"08",X"FF",X"DD",X"76",X"3F",X"46",X"46",X"3F",X"CD",X"F4",X"76",X"CD",X"25",X"76", + X"CD",X"EF",X"02",X"C9",X"DD",X"21",X"A0",X"8B",X"11",X"18",X"00",X"06",X"06",X"D9",X"CD",X"07", + X"77",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D0",X"DD", + X"7E",X"02",X"E6",X"03",X"EF",X"1D",X"77",X"40",X"77",X"90",X"77",X"81",X"78",X"DD",X"35",X"11", + X"C0",X"21",X"57",X"8D",X"7E",X"4F",X"34",X"DD",X"77",X"13",X"79",X"21",X"69",X"78",X"87",X"E7", + X"DD",X"77",X"15",X"23",X"7E",X"DD",X"77",X"16",X"3E",X"EC",X"DD",X"77",X"0A",X"DD",X"34",X"02", + X"CD",X"06",X"40",X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"03",X"B8",X"30",X"03",X"DD", + X"35",X"04",X"DD",X"86",X"0A",X"DD",X"77",X"03",X"47",X"DD",X"7E",X"04",X"E6",X"1F",X"FE",X"09", + X"D0",X"DD",X"34",X"02",X"DD",X"36",X"11",X"18",X"CD",X"F1",X"0E",X"DD",X"7E",X"17",X"21",X"B1", + X"41",X"CD",X"45",X"0C",X"CD",X"1E",X"38",X"11",X"B3",X"0B",X"06",X"05",X"AF",X"6F",X"67",X"1A", + X"E6",X"1F",X"E7",X"13",X"10",X"F9",X"7D",X"84",X"C6",X"C7",X"C8",X"21",X"E9",X"89",X"34",X"C9", + X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"DD",X"7E",X"13",X"21",X"21",X"78",X"CD",X"45",X"0C", + X"DD",X"6E",X"15",X"DD",X"66",X"16",X"CD",X"0F",X"78",X"21",X"41",X"78",X"DD",X"7E",X"13",X"CD", + X"45",X"0C",X"DD",X"6E",X"15",X"DD",X"66",X"16",X"01",X"00",X"FC",X"09",X"CD",X"0F",X"78",X"21", + X"58",X"8D",X"7E",X"A7",X"20",X"02",X"36",X"01",X"AF",X"DD",X"77",X"00",X"DD",X"77",X"01",X"DD", + X"77",X"02",X"DD",X"77",X"03",X"DD",X"77",X"04",X"DD",X"77",X"05",X"DD",X"77",X"06",X"DD",X"77", + X"16",X"DD",X"7E",X"13",X"FE",X"05",X"D8",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"03",X"DD", + X"36",X"11",X"80",X"21",X"BC",X"82",X"11",X"E0",X"FF",X"01",X"00",X"0A",X"7E",X"19",X"BE",X"20", + X"74",X"81",X"4F",X"10",X"F7",X"C6",X"83",X"21",X"0E",X"78",X"BE",X"C2",X"34",X"23",X"C9",X"01", + X"E0",X"FF",X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"09",X"1A",X"77",X"2B",X"13",X"1A",X"77", + X"C9",X"2D",X"78",X"31",X"78",X"31",X"78",X"35",X"78",X"39",X"78",X"3D",X"78",X"0C",X"0D",X"0C", + X"0C",X"0C",X"0C",X"0C",X"0C",X"0E",X"0F",X"0F",X"0E",X"0C",X"3B",X"3B",X"0C",X"A4",X"A5",X"A4", + X"A5",X"4D",X"78",X"51",X"78",X"55",X"78",X"59",X"78",X"5D",X"78",X"61",X"78",X"00",X"00",X"C0", + X"80",X"03",X"43",X"C3",X"83",X"0D",X"4D",X"CD",X"8D",X"00",X"00",X"80",X"80",X"05",X"02",X"82", + X"85",X"00",X"00",X"C0",X"C0",X"07",X"0D",X"0E",X"0C",X"A8",X"86",X"68",X"86",X"28",X"86",X"E8", + X"85",X"A8",X"85",X"68",X"85",X"40",X"06",X"F0",X"FF",X"75",X"78",X"40",X"0B",X"F0",X"FF",X"75", + X"78",X"DD",X"35",X"11",X"C0",X"FD",X"21",X"00",X"79",X"21",X"79",X"07",X"11",X"00",X"00",X"0E", + X"09",X"06",X"20",X"7E",X"83",X"5F",X"30",X"01",X"14",X"23",X"10",X"F7",X"FD",X"7E",X"00",X"BB", + X"C2",X"0E",X"78",X"FD",X"7E",X"01",X"BA",X"C2",X"0E",X"78",X"FD",X"7D",X"C6",X"02",X"30",X"02", + X"FD",X"24",X"FD",X"6F",X"0D",X"20",X"DA",X"3E",X"02",X"32",X"51",X"8E",X"FD",X"21",X"48",X"85", + X"21",X"00",X"00",X"11",X"20",X"00",X"0E",X"04",X"06",X"0C",X"FD",X"7E",X"00",X"85",X"30",X"01", + X"24",X"6F",X"FD",X"19",X"10",X"F4",X"CB",X"41",X"20",X"08",X"11",X"E0",X"FF",X"FD",X"23",X"0D", + X"18",X"E6",X"0D",X"28",X"07",X"11",X"FF",X"FB",X"FD",X"19",X"18",X"F6",X"7D",X"84",X"C6",X"A6", + X"C2",X"20",X"03",X"21",X"E0",X"8A",X"AF",X"47",X"D7",X"06",X"37",X"D7",X"CD",X"C8",X"77",X"C9", + X"B8",X"02",X"94",X"03",X"21",X"05",X"EB",X"05",X"2A",X"09",X"40",X"0A",X"41",X"0C",X"A4",X"0C", + X"DB",X"0E",X"3A",X"06",X"88",X"A7",X"C8",X"3A",X"0D",X"88",X"A7",X"11",X"E1",X"89",X"21",X"30", + X"8A",X"28",X"04",X"2E",X"33",X"1E",X"E2",X"1A",X"A7",X"C0",X"23",X"7E",X"2B",X"CB",X"47",X"06", + X"3B",X"28",X"01",X"04",X"7E",X"B8",X"28",X"02",X"34",X"C9",X"36",X"00",X"23",X"34",X"7E",X"5F", + X"E6",X"0F",X"FE",X"0A",X"C0",X"7B",X"E6",X"F0",X"C6",X"10",X"FE",X"60",X"77",X"C0",X"36",X"00", + X"23",X"34",X"7E",X"5F",X"E6",X"0F",X"FE",X"0A",X"C0",X"7B",X"E6",X"F0",X"C6",X"10",X"77",X"C9", + X"11",X"09",X"06",X"FF",X"DD",X"21",X"01",X"29",X"21",X"00",X"00",X"5D",X"53",X"06",X"5B",X"DD", + X"7E",X"00",X"83",X"5F",X"30",X"01",X"14",X"4F",X"DD",X"7D",X"E6",X"01",X"20",X"06",X"79",X"85", + X"6F",X"30",X"01",X"24",X"DD",X"23",X"10",X"E7",X"7B",X"DD",X"BE",X"00",X"C2",X"0B",X"7A",X"7A", + X"DD",X"BE",X"01",X"C2",X"A0",X"0F",X"7D",X"DD",X"BE",X"02",X"C2",X"88",X"13",X"7C",X"DD",X"BE", + X"03",X"C2",X"70",X"17",X"3A",X"0D",X"88",X"A7",X"DD",X"21",X"32",X"8A",X"28",X"03",X"DD",X"2E", + X"35",X"21",X"2D",X"86",X"11",X"E0",X"FF",X"06",X"02",X"DD",X"7E",X"00",X"4F",X"E6",X"F0",X"0F", + X"0F",X"0F",X"0F",X"77",X"19",X"79",X"E6",X"0F",X"77",X"19",X"CB",X"40",X"20",X"04",X"36",X"51", + X"19",X"DD",X"2B",X"10",X"E4",X"DD",X"E5",X"E1",X"AF",X"06",X"03",X"D7",X"21",X"E7",X"89",X"06", + X"07",X"7E",X"A7",X"20",X"0A",X"23",X"10",X"F9",X"C9",X"21",X"AC",X"68",X"11",X"00",X"00",X"7E", + X"FE",X"C9",X"28",X"08",X"83",X"30",X"01",X"14",X"5F",X"23",X"18",X"F3",X"21",X"0B",X"7A",X"7B", + X"BE",X"C2",X"D0",X"07",X"7A",X"23",X"BE",X"C2",X"85",X"1A",X"C9",X"F8",X"24",X"8D",X"7A",X"9A", + X"7A",X"AE",X"7A",X"BB",X"7A",X"C8",X"7A",X"D5",X"7A",X"E2",X"7A",X"F2",X"7A",X"12",X"7B",X"2E", + X"7B",X"3F",X"7B",X"53",X"7B",X"5A",X"7B",X"69",X"7B",X"7B",X"7B",X"8B",X"7B",X"C8",X"7B",X"E7", + X"7B",X"F8",X"7B",X"08",X"7C",X"14",X"7C",X"1F",X"7C",X"2B",X"7C",X"3E",X"7C",X"4A",X"7C",X"5C", + X"7C",X"71",X"7C",X"85",X"7C",X"8B",X"7C",X"91",X"7C",X"97",X"7C",X"A8",X"7C",X"AE",X"7C",X"B4", + X"7C",X"BA",X"7C",X"C0",X"7C",X"C6",X"7C",X"CD",X"7C",X"DE",X"7C",X"EF",X"7C",X"FE",X"7C",X"0A", + X"7D",X"26",X"7D",X"42",X"7D",X"53",X"7D",X"68",X"7D",X"76",X"7D",X"82",X"7D",X"98",X"7D",X"AC", + X"7D",X"C4",X"7D",X"E2",X"7D",X"0D",X"7E",X"46",X"7E",X"56",X"7E",X"56",X"7E",X"56",X"7E",X"56", + X"7E",X"56",X"7E",X"56",X"7E",X"56",X"7E",X"56",X"7E",X"56",X"7E",X"5A",X"7E",X"96",X"86",X"47", + X"41",X"4D",X"45",X"40",X"40",X"4F",X"56",X"45",X"52",X"3F",X"EE",X"86",X"50",X"55",X"53",X"48", + X"40",X"53",X"54",X"41",X"52",X"54",X"40",X"42",X"55",X"54",X"54",X"4F",X"4E",X"3F",X"94",X"86", + X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"45",X"3F",X"94",X"86",X"50",X"4C",X"41", + X"59",X"45",X"52",X"40",X"54",X"57",X"4F",X"3F",X"80",X"86",X"48",X"49",X"47",X"48",X"40",X"53", + X"43",X"4F",X"52",X"45",X"3F",X"BF",X"87",X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"40", + X"40",X"3F",X"BF",X"87",X"40",X"46",X"52",X"45",X"45",X"40",X"50",X"4C",X"41",X"59",X"40",X"40", + X"40",X"3F",X"38",X"87",X"4F",X"4E",X"45",X"40",X"44",X"41",X"59",X"5C",X"5C",X"5C",X"2E",X"DA", + X"86",X"49",X"4E",X"40",X"54",X"48",X"45",X"40",X"46",X"4F",X"52",X"45",X"53",X"54",X"5C",X"5C", + X"5C",X"3F",X"D1",X"86",X"42",X"4F",X"4E",X"55",X"53",X"40",X"50",X"4F",X"49",X"4E",X"54",X"2E", + X"B4",X"86",X"32",X"30",X"30",X"58",X"40",X"40",X"77",X"40",X"40",X"30",X"30",X"3F",X"CA",X"86", + X"59",X"4F",X"55",X"52",X"40",X"50",X"4C",X"41",X"59",X"40",X"54",X"49",X"4D",X"45",X"3F",X"19", + X"87",X"4E",X"42",X"52",X"40",X"4F",X"46",X"40",X"50",X"49",X"47",X"53",X"40",X"54",X"41",X"4B", + X"45",X"4E",X"3F",X"24",X"86",X"50",X"4C",X"41",X"59",X"3F",X"A9",X"86",X"5B",X"40",X"40",X"50", + X"4F",X"4F",X"59",X"41",X"4E",X"40",X"40",X"5B",X"3F",X"C4",X"86",X"5B",X"40",X"40",X"43",X"48", + X"41",X"52",X"41",X"43",X"54",X"45",X"52",X"40",X"40",X"5B",X"3F",X"A3",X"86",X"5B",X"40",X"40", + X"50",X"4F",X"4F",X"40",X"59",X"41",X"4E",X"40",X"40",X"5B",X"3F",X"2B",X"87",X"57",X"48",X"45", + X"4E",X"40",X"37",X"40",X"57",X"4F",X"4C",X"56",X"45",X"53",X"40",X"4A",X"4F",X"49",X"4E",X"2E", + X"2D",X"87",X"4F",X"4E",X"40",X"54",X"48",X"45",X"40",X"43",X"4C",X"49",X"46",X"46",X"73",X"54", + X"48",X"45",X"59",X"2E",X"2F",X"87",X"44",X"52",X"4F",X"50",X"40",X"47",X"49",X"41",X"48",X"54", + X"40",X"52",X"4F",X"43",X"4B",X"3B",X"3B",X"3F",X"AF",X"86",X"40",X"4E",X"49",X"43",X"45",X"40", + X"40",X"53",X"48",X"4F",X"4F",X"54",X"2E",X"D2",X"86",X"40",X"42",X"4F",X"4E",X"55",X"53",X"40", + X"40",X"50",X"4F",X"49",X"4E",X"54",X"3F",X"BC",X"86",X"3A",X"40",X"4B",X"4F",X"4E",X"41",X"4D", + X"49",X"40",X"40",X"31",X"39",X"38",X"32",X"3F",X"AE",X"86",X"40",X"4D",X"41",X"4D",X"41",X"73", + X"40",X"48",X"45",X"4C",X"50",X"40",X"3B",X"3F",X"E6",X"85",X"4F",X"48",X"73",X"40",X"42",X"4F", + X"59",X"40",X"3B",X"3F",X"56",X"87",X"40",X"4D",X"41",X"4D",X"41",X"40",X"40",X"3B",X"3F",X"19", + X"87",X"40",X"4D",X"41",X"4D",X"41",X"40",X"40",X"3B",X"3B",X"3F",X"75",X"87",X"31",X"53",X"54", + X"40",X"42",X"4F",X"4E",X"55",X"53",X"40",X"41",X"46",X"54",X"45",X"52",X"40",X"3F",X"75",X"85", + X"35",X"30",X"30",X"30",X"30",X"40",X"50",X"54",X"53",X"3F",X"D1",X"86",X"4F",X"4E",X"45",X"40", + X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"4C",X"59",X"3F",X"F1",X"86",X"4F",X"4E", + X"45",X"40",X"4F",X"52",X"40",X"54",X"57",X"4F",X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"53", + X"3F",X"04",X"87",X"5B",X"40",X"53",X"43",X"4F",X"52",X"45",X"40",X"52",X"41",X"4E",X"4B",X"49", + X"4E",X"47",X"40",X"5B",X"3F",X"27",X"87",X"31",X"53",X"54",X"3F",X"29",X"87",X"32",X"4E",X"44", + X"3F",X"2B",X"87",X"33",X"52",X"44",X"3F",X"2D",X"87",X"34",X"54",X"48",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"3F",X"2F",X"87",X"35",X"54",X"48",X"3F",X"31",X"87", + X"36",X"54",X"48",X"3F",X"33",X"87",X"37",X"54",X"48",X"3F",X"35",X"87",X"38",X"54",X"48",X"3F", + X"37",X"87",X"39",X"54",X"48",X"3F",X"59",X"87",X"31",X"30",X"54",X"48",X"3F",X"BD",X"86",X"3A", + X"40",X"4B",X"4F",X"4E",X"41",X"4D",X"49",X"40",X"40",X"31",X"39",X"38",X"32",X"3F",X"D1",X"86", + X"40",X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"53",X"54",X"41",X"47",X"45",X"40",X"3F",X"AC", + X"86",X"40",X"40",X"50",X"45",X"52",X"46",X"45",X"43",X"54",X"40",X"40",X"40",X"3F",X"75",X"85", + X"33",X"30",X"30",X"30",X"30",X"40",X"50",X"54",X"53",X"3F",X"78",X"87",X"41",X"4E",X"44",X"40", + X"42",X"4F",X"4E",X"55",X"53",X"40",X"45",X"56",X"45",X"52",X"59",X"40",X"37",X"30",X"30",X"30", + X"30",X"40",X"50",X"54",X"53",X"3F",X"78",X"87",X"41",X"4E",X"44",X"40",X"42",X"4F",X"4E",X"55", + X"53",X"40",X"45",X"56",X"45",X"52",X"59",X"40",X"38",X"30",X"30",X"30",X"30",X"40",X"50",X"54", + X"53",X"3F",X"D0",X"86",X"32",X"4E",X"44",X"40",X"50",X"48",X"41",X"53",X"45",X"40",X"47",X"45", + X"54",X"53",X"3F",X"12",X"87",X"48",X"41",X"52",X"44",X"45",X"52",X"40",X"41",X"53",X"40",X"59", + X"4F",X"55",X"40",X"4C",X"4F",X"53",X"45",X"3F",X"94",X"86",X"4D",X"4F",X"52",X"45",X"40",X"50", + X"49",X"47",X"53",X"40",X"3B",X"3F",X"16",X"86",X"3F",X"44",X"49",X"46",X"46",X"49",X"43",X"55", + X"4C",X"54",X"38",X"87",X"3F",X"49",X"4E",X"40",X"54",X"48",X"45",X"40",X"53",X"45",X"43",X"4F", + X"4E",X"44",X"40",X"50",X"48",X"41",X"53",X"45",X"75",X"87",X"41",X"42",X"4F",X"55",X"54",X"40", + X"31",X"30",X"40",X"53",X"45",X"43",X"4F",X"4E",X"44",X"53",X"3B",X"3F",X"92",X"86",X"40",X"4F", + X"4E",X"45",X"40",X"57",X"4F",X"4C",X"46",X"2E",X"74",X"86",X"40",X"40",X"34",X"30",X"30",X"40", + X"50",X"54",X"53",X"3F",X"92",X"86",X"40",X"54",X"57",X"4F",X"40",X"57",X"4F",X"4C",X"56",X"45", + X"53",X"2E",X"74",X"86",X"40",X"40",X"34",X"30",X"30",X"83",X"38",X"30",X"30",X"40",X"50",X"54", + X"53",X"3F",X"92",X"86",X"40",X"53",X"4F",X"4D",X"45",X"40",X"57",X"4F",X"4C",X"56",X"45",X"53", + X"2E",X"74",X"86",X"40",X"40",X"34",X"30",X"30",X"83",X"38",X"30",X"30",X"40",X"2E",X"56",X"86", + X"40",X"40",X"40",X"83",X"31",X"36",X"30",X"30",X"40",X"50",X"54",X"53",X"3F",X"CD",X"86",X"42", + X"4F",X"4E",X"55",X"53",X"40",X"40",X"50",X"4F",X"49",X"4E",X"54",X"2E",X"10",X"87",X"4D",X"45", + X"41",X"54",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"30",X"30",X"40",X"50",X"54",X"53", + X"2E",X"12",X"87",X"57",X"4F",X"4C",X"46",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"30", + X"30",X"40",X"50",X"54",X"53",X"3F",X"A3",X"86",X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"53", + X"54",X"41",X"47",X"45",X"40",X"3F",X"00",X"84",X"40",X"3F",X"89",X"86",X"44",X"4F",X"55",X"42", + X"4C",X"45",X"2E",X"4D",X"86",X"50",X"45",X"52",X"46",X"45",X"43",X"54",X"3F",X"3A",X"88",X"89", + X"FE",X"04",X"D8",X"3A",X"5F",X"8A",X"A7",X"C0",X"21",X"BE",X"64",X"0E",X"00",X"59",X"7E",X"2B", + X"81",X"4F",X"30",X"01",X"1C",X"3E",X"34",X"BE",X"20",X"F4",X"7B",X"81",X"E6",X"B0",X"C8",X"21", + X"EF",X"89",X"34",X"C9",X"21",X"D6",X"7F",X"E5",X"3A",X"2A",X"8E",X"A7",X"C0",X"3A",X"FC",X"89", + X"A7",X"20",X"05",X"3C",X"32",X"2A",X"8E",X"C9",X"3A",X"26",X"8E",X"EF",X"B2",X"7E",X"0E",X"7F", + X"5D",X"7F",X"21",X"65",X"85",X"22",X"27",X"8E",X"3E",X"03",X"32",X"25",X"8E",X"3A",X"FC",X"89", + X"21",X"A0",X"03",X"22",X"2B",X"8E",X"DD",X"21",X"FD",X"8D",X"47",X"11",X"03",X"00",X"DD",X"19", + X"10",X"FC",X"DD",X"22",X"1F",X"8E",X"3A",X"0F",X"88",X"A7",X"20",X"06",X"3A",X"0D",X"88",X"A7", + X"20",X"05",X"21",X"11",X"88",X"18",X"03",X"21",X"12",X"88",X"22",X"21",X"8E",X"3A",X"FC",X"89", + X"47",X"ED",X"5B",X"27",X"8E",X"13",X"13",X"10",X"FC",X"ED",X"53",X"27",X"8E",X"3E",X"11",X"12", + X"32",X"23",X"8E",X"3E",X"01",X"32",X"26",X"8E",X"3E",X"0C",X"32",X"24",X"8E",X"C9",X"2A",X"2B", + X"8E",X"2B",X"22",X"2B",X"8E",X"7C",X"A7",X"20",X"07",X"7D",X"A7",X"20",X"03",X"C3",X"A8",X"7F", + X"2A",X"21",X"8E",X"CB",X"5E",X"20",X"1B",X"CB",X"56",X"28",X"32",X"21",X"24",X"8E",X"35",X"C0", + X"3E",X"0C",X"32",X"24",X"8E",X"21",X"23",X"8E",X"34",X"7E",X"FE",X"2D",X"38",X"19",X"36",X"10", + X"18",X"15",X"21",X"24",X"8E",X"35",X"C0",X"3E",X"0C",X"32",X"24",X"8E",X"21",X"23",X"8E",X"35", + X"7E",X"FE",X"10",X"30",X"02",X"36",X"2C",X"ED",X"4B",X"27",X"8E",X"7E",X"02",X"2A",X"21",X"8E", + X"7E",X"21",X"29",X"8E",X"07",X"07",X"07",X"07",X"CB",X"16",X"7E",X"E6",X"07",X"FE",X"01",X"C0", + X"21",X"A0",X"03",X"22",X"2B",X"8E",X"3A",X"23",X"8E",X"2A",X"1F",X"8E",X"77",X"23",X"22",X"1F", + X"8E",X"21",X"25",X"8E",X"35",X"7E",X"A7",X"32",X"25",X"8E",X"28",X"1C",X"3A",X"23",X"8E",X"2A", + X"27",X"8E",X"77",X"01",X"E0",X"FF",X"09",X"22",X"27",X"8E",X"3E",X"11",X"77",X"3E",X"01",X"32", + X"26",X"8E",X"3E",X"11",X"32",X"23",X"8E",X"C9",X"CD",X"CF",X"0E",X"3A",X"25",X"8E",X"A7",X"28", + X"16",X"47",X"3E",X"10",X"2A",X"27",X"8E",X"11",X"E0",X"FF",X"DD",X"2A",X"1F",X"8E",X"77",X"DD", + X"77",X"00",X"19",X"DD",X"23",X"10",X"F7",X"21",X"08",X"88",X"36",X"80",X"AF",X"32",X"26",X"8E", + X"3E",X"01",X"32",X"2A",X"8E",X"C9",X"3A",X"02",X"88",X"A7",X"C8",X"21",X"0E",X"88",X"7E",X"A7", + X"28",X"0D",X"2B",X"7E",X"A7",X"3A",X"08",X"89",X"21",X"48",X"89",X"20",X"02",X"2E",X"88",X"B6", + X"A7",X"C0",X"3A",X"10",X"88",X"E6",X"18",X"A7",X"C8",X"CD",X"CF",X"0E",X"C3",X"78",X"0D",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_sound_prog.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_sound_prog.vhd new file mode 100644 index 00000000..679526ce --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_sound_prog.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_sound_prog 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 prom of pooyan_sound_prog is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"21",X"00",X"30",X"06",X"00",X"C3",X"AC",X"00",X"32",X"00",X"50",X"3A",X"00",X"40",X"C9",X"FF", + X"32",X"00",X"70",X"3A",X"00",X"60",X"C9",X"FF",X"78",X"CF",X"79",X"32",X"00",X"40",X"C9",X"FF", + X"78",X"D7",X"79",X"32",X"00",X"60",X"C9",X"FF",X"87",X"85",X"6F",X"7C",X"CE",X"00",X"67",X"7E", + X"23",X"66",X"6F",X"E9",X"FF",X"FF",X"FF",X"FF",X"D9",X"08",X"CD",X"40",X"00",X"08",X"D9",X"C9", + X"3E",X"0E",X"CF",X"B7",X"28",X"40",X"57",X"E6",X"7F",X"FE",X"2B",X"D0",X"CB",X"7A",X"28",X"03", + X"C3",X"A3",X"00",X"57",X"CD",X"91",X"00",X"28",X"04",X"23",X"36",X"00",X"C9",X"AF",X"CD",X"91", + X"00",X"28",X"05",X"72",X"23",X"36",X"00",X"C9",X"21",X"00",X"30",X"1E",X"06",X"7E",X"1D",X"28", + X"08",X"2C",X"2C",X"BE",X"38",X"F8",X"C3",X"6D",X"00",X"5F",X"7A",X"BB",X"D8",X"7B",X"CD",X"91", + X"00",X"72",X"2C",X"36",X"00",X"C9",X"21",X"00",X"30",X"06",X"0C",X"AF",X"77",X"23",X"10",X"FC", + X"C9",X"21",X"00",X"30",X"06",X"06",X"0E",X"07",X"BE",X"28",X"05",X"23",X"23",X"10",X"F9",X"41", + X"79",X"90",X"C9",X"CD",X"91",X"00",X"C8",X"AF",X"77",X"23",X"77",X"C9",X"70",X"23",X"7C",X"FE", + X"34",X"20",X"F9",X"F9",X"ED",X"56",X"21",X"00",X"80",X"22",X"0C",X"30",X"77",X"16",X"06",X"7A", + X"CD",X"B0",X"01",X"15",X"20",X"F9",X"01",X"38",X"07",X"DF",X"E7",X"FB",X"3E",X"0F",X"CF",X"E6", + X"80",X"20",X"F9",X"3E",X"0F",X"CF",X"E6",X"80",X"28",X"F9",X"F3",X"3E",X"01",X"32",X"0E",X"30", + X"3A",X"01",X"30",X"B7",X"3A",X"00",X"30",X"CA",X"EF",X"00",X"CD",X"93",X"01",X"18",X"03",X"CD", + X"7D",X"01",X"FB",X"00",X"00",X"F3",X"3E",X"02",X"32",X"0E",X"30",X"3A",X"03",X"30",X"B7",X"3A", + X"02",X"30",X"CA",X"0A",X"01",X"CD",X"93",X"01",X"18",X"03",X"CD",X"7D",X"01",X"FB",X"00",X"00", + X"F3",X"3E",X"03",X"32",X"0E",X"30",X"3A",X"05",X"30",X"B7",X"3A",X"04",X"30",X"CA",X"25",X"01", + X"CD",X"93",X"01",X"18",X"03",X"CD",X"7D",X"01",X"FB",X"00",X"00",X"F3",X"3E",X"04",X"32",X"0E", + X"30",X"3A",X"07",X"30",X"B7",X"3A",X"06",X"30",X"CA",X"40",X"01",X"CD",X"93",X"01",X"18",X"03", + X"CD",X"7D",X"01",X"FB",X"00",X"00",X"F3",X"3E",X"05",X"32",X"0E",X"30",X"3A",X"09",X"30",X"B7", + X"3A",X"08",X"30",X"CA",X"5B",X"01",X"CD",X"93",X"01",X"18",X"03",X"CD",X"7D",X"01",X"FB",X"00", + X"00",X"F3",X"3E",X"06",X"32",X"0E",X"30",X"3A",X"0B",X"30",X"B7",X"3A",X"0A",X"30",X"CA",X"77", + X"01",X"CD",X"93",X"01",X"C3",X"CB",X"00",X"CD",X"7D",X"01",X"C3",X"CB",X"00",X"21",X"D3",X"09", + X"EF",X"B7",X"20",X"17",X"21",X"01",X"30",X"3A",X"0E",X"30",X"3D",X"87",X"5F",X"16",X"00",X"19", + X"36",X"01",X"C9",X"B7",X"C8",X"21",X"29",X"0A",X"EF",X"B7",X"C8",X"21",X"00",X"30",X"3A",X"0E", + X"30",X"3D",X"87",X"4F",X"06",X"00",X"09",X"70",X"23",X"70",X"C9",X"0E",X"00",X"3A",X"0E",X"30", + X"FE",X"04",X"30",X"06",X"C6",X"07",X"47",X"C3",X"18",X"00",X"C6",X"04",X"47",X"C3",X"20",X"00", + X"3A",X"0E",X"30",X"FE",X"04",X"30",X"0A",X"3D",X"87",X"47",X"4D",X"DF",X"4C",X"04",X"C3",X"18", + X"00",X"D6",X"04",X"87",X"47",X"4D",X"E7",X"4C",X"04",X"C3",X"20",X"00",X"01",X"FC",X"FF",X"21", + X"00",X"00",X"1F",X"CB",X"15",X"1F",X"CB",X"15",X"3A",X"0E",X"30",X"C6",X"02",X"FE",X"06",X"38", + X"04",X"D6",X"06",X"28",X"0A",X"87",X"29",X"37",X"CB",X"11",X"CB",X"10",X"3D",X"20",X"F7",X"EB", + X"2A",X"0C",X"30",X"7D",X"A1",X"B3",X"6F",X"7C",X"A0",X"B2",X"67",X"22",X"0C",X"30",X"77",X"C9", + X"DD",X"35",X"01",X"20",X"20",X"DD",X"7E",X"08",X"DD",X"77",X"01",X"DD",X"35",X"00",X"28",X"38", + X"DD",X"CB",X"00",X"46",X"C8",X"DD",X"7E",X"09",X"B7",X"C8",X"DD",X"86",X"07",X"F8",X"DD",X"77", + X"07",X"4F",X"C3",X"AD",X"01",X"DD",X"7E",X"0A",X"FE",X"01",X"D8",X"DD",X"6E",X"0B",X"DD",X"66", + X"0C",X"28",X"0B",X"DD",X"46",X"01",X"0E",X"9B",X"09",X"7C",X"AD",X"6F",X"26",X"01",X"23",X"DD", + X"75",X"0B",X"DD",X"74",X"0C",X"C3",X"C0",X"01",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"7E",X"57", + X"E6",X"1F",X"28",X"2A",X"FE",X"1F",X"28",X"3D",X"CD",X"8E",X"02",X"7A",X"E6",X"1F",X"3D",X"07", + X"4F",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"09",X"5E",X"23",X"56",X"EB",X"DD",X"75",X"0B",X"DD", + X"74",X"0C",X"CD",X"C0",X"01",X"DD",X"4E",X"06",X"DD",X"71",X"07",X"C3",X"AD",X"01",X"23",X"DD", + X"75",X"02",X"DD",X"74",X"03",X"7A",X"E6",X"E0",X"07",X"07",X"07",X"47",X"3E",X"80",X"07",X"10", + X"FD",X"DD",X"77",X"00",X"C9",X"7A",X"E6",X"E0",X"07",X"07",X"07",X"11",X"58",X"02",X"D5",X"23", + X"5D",X"54",X"23",X"DD",X"75",X"02",X"DD",X"74",X"03",X"21",X"BF",X"02",X"C3",X"28",X"00",X"CF", + X"02",X"E3",X"02",X"F3",X"02",X"F8",X"02",X"FD",X"02",X"02",X"03",X"0B",X"03",X"15",X"03",X"EB", + X"4E",X"CB",X"21",X"06",X"00",X"21",X"1A",X"03",X"09",X"5E",X"23",X"56",X"DD",X"73",X"04",X"DD", + X"72",X"05",X"C9",X"EB",X"4E",X"06",X"00",X"21",X"B2",X"03",X"09",X"7E",X"DD",X"77",X"08",X"DD", + X"77",X"01",X"C9",X"1A",X"DD",X"77",X"06",X"C9",X"1A",X"DD",X"77",X"09",X"C9",X"1A",X"DD",X"77", + X"0A",X"C9",X"1A",X"32",X"0A",X"30",X"AF",X"32",X"0B",X"30",X"C9",X"1A",X"DD",X"77",X"02",X"13", + X"1A",X"DD",X"77",X"03",X"C9",X"E1",X"E1",X"3E",X"FF",X"C9",X"3A",X"03",X"3E",X"03",X"42",X"03", + X"46",X"03",X"4A",X"03",X"4E",X"03",X"52",X"03",X"56",X"03",X"5A",X"03",X"5E",X"03",X"62",X"03", + X"66",X"03",X"6A",X"03",X"6E",X"03",X"72",X"03",X"76",X"03",X"6B",X"08",X"F2",X"07",X"80",X"07", + X"14",X"07",X"AE",X"06",X"4E",X"06",X"F3",X"05",X"9E",X"05",X"4E",X"05",X"01",X"05",X"B9",X"04", + X"76",X"04",X"36",X"04",X"F9",X"03",X"C0",X"03",X"8A",X"03",X"57",X"03",X"27",X"03",X"FA",X"02", + X"CF",X"02",X"A7",X"02",X"81",X"02",X"5D",X"02",X"3B",X"02",X"1B",X"02",X"FD",X"01",X"E0",X"01", + X"C5",X"01",X"AC",X"01",X"94",X"01",X"7D",X"01",X"68",X"01",X"53",X"01",X"40",X"01",X"2E",X"01", + X"1D",X"01",X"0D",X"01",X"FE",X"00",X"F0",X"00",X"E3",X"00",X"D6",X"00",X"CA",X"00",X"BE",X"00", + X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97",X"00",X"8F",X"00",X"87",X"00",X"7F",X"00",X"78",X"00", + X"71",X"00",X"6B",X"00",X"65",X"00",X"5F",X"00",X"5A",X"00",X"55",X"00",X"50",X"00",X"4C",X"00", + X"47",X"00",X"3C",X"38",X"34",X"30",X"2C",X"28",X"24",X"20",X"1E",X"1C",X"1A",X"18",X"16",X"14", + X"12",X"10",X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"21",X"FD", + X"03",X"11",X"0F",X"30",X"01",X"27",X"00",X"ED",X"B0",X"07",X"4F",X"07",X"81",X"4F",X"06",X"00", + X"21",X"DB",X"0A",X"09",X"11",X"11",X"30",X"CD",X"F3",X"03",X"11",X"1E",X"30",X"CD",X"F3",X"03", + X"11",X"2B",X"30",X"7E",X"12",X"CD",X"FA",X"03",X"7E",X"12",X"23",X"13",X"C9",X"01",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"3E",X"01",X"CD",X"DC",X"01",X"21",X"3B",X"30",X"36",X"00",X"2C",X"36", + X"03",X"2C",X"0E",X"06",X"71",X"CD",X"AD",X"01",X"21",X"18",X"00",X"22",X"39",X"30",X"CD",X"C0", + X"01",X"AF",X"C9",X"21",X"3B",X"30",X"35",X"7E",X"57",X"E6",X"0F",X"20",X"1F",X"2C",X"7E",X"2C", + X"86",X"FE",X"05",X"28",X"2D",X"77",X"FE",X"0F",X"20",X"0E",X"2D",X"36",X"FE",X"2A",X"39",X"30", + X"01",X"F4",X"FF",X"09",X"22",X"39",X"30",X"3D",X"4F",X"CD",X"AD",X"01",X"2A",X"39",X"30",X"CB", + X"62",X"01",X"02",X"00",X"20",X"03",X"01",X"FE",X"FF",X"09",X"22",X"39",X"30",X"CD",X"C0",X"01", + X"AF",X"C9",X"3E",X"FF",X"C9",X"AF",X"CD",X"DC",X"01",X"0E",X"06",X"CD",X"AD",X"01",X"21",X"90", + X"00",X"CD",X"C0",X"01",X"21",X"3E",X"30",X"36",X"00",X"2C",X"36",X"F4",X"2C",X"36",X"90",X"AF", + X"C9",X"21",X"3E",X"30",X"35",X"7E",X"E6",X"07",X"20",X"1A",X"0E",X"00",X"CB",X"5E",X"20",X"11", + X"2C",X"34",X"34",X"28",X"D4",X"7E",X"2C",X"86",X"77",X"6F",X"26",X"00",X"CD",X"C0",X"01",X"0E", + X"06",X"CD",X"AD",X"01",X"AF",X"C9",X"3E",X"01",X"CD",X"DC",X"01",X"21",X"41",X"30",X"0E",X"0D", + X"71",X"CD",X"AD",X"01",X"2C",X"36",X"80",X"2C",X"36",X"20",X"6E",X"26",X"03",X"CD",X"C0",X"01", + X"AF",X"C9",X"21",X"42",X"30",X"35",X"7E",X"28",X"1E",X"E6",X"0F",X"20",X"07",X"2D",X"35",X"4E", + X"CD",X"AD",X"01",X"2C",X"CB",X"5E",X"3E",X"08",X"20",X"02",X"ED",X"44",X"2C",X"86",X"77",X"6F", + X"26",X"03",X"CD",X"C0",X"01",X"AF",X"C9",X"3D",X"C9",X"3E",X"01",X"CD",X"DC",X"01",X"0E",X"0B", + X"CD",X"AD",X"01",X"21",X"B0",X"00",X"CD",X"C0",X"01",X"21",X"44",X"30",X"36",X"00",X"2C",X"36", + X"B0",X"2C",X"36",X"84",X"2C",X"36",X"B0",X"AF",X"C9",X"21",X"44",X"30",X"35",X"7E",X"E6",X"01", + X"20",X"0D",X"2C",X"35",X"7E",X"2C",X"BE",X"28",X"08",X"6F",X"26",X"00",X"CD",X"C0",X"01",X"AF", + X"C9",X"2C",X"86",X"1F",X"FE",X"40",X"38",X"15",X"77",X"32",X"45",X"30",X"6F",X"26",X"00",X"CD", + X"C0",X"01",X"7D",X"CB",X"3D",X"CB",X"3D",X"95",X"32",X"46",X"30",X"AF",X"C9",X"3E",X"FF",X"C9", + X"AF",X"CD",X"DC",X"01",X"21",X"18",X"00",X"CD",X"C0",X"01",X"21",X"48",X"30",X"36",X"1E",X"2C", + X"0E",X"0F",X"71",X"CD",X"AD",X"01",X"2C",X"36",X"53",X"2C",X"36",X"35",X"AF",X"C9",X"21",X"48", + X"30",X"35",X"7E",X"28",X"1E",X"2C",X"E6",X"01",X"20",X"05",X"35",X"4E",X"CD",X"AD",X"01",X"2C", + X"7E",X"C6",X"95",X"77",X"2C",X"AE",X"E6",X"7F",X"C6",X"30",X"77",X"6F",X"26",X"00",X"CD",X"C0", + X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"21",X"4C",X"30",X"36",X"40",X"2C",X"36", + X"A0",X"21",X"A0",X"00",X"CD",X"C0",X"01",X"0E",X"0B",X"CD",X"AD",X"01",X"AF",X"C9",X"21",X"4C", + X"30",X"35",X"7E",X"28",X"26",X"FE",X"20",X"28",X"E5",X"57",X"E6",X"03",X"20",X"1B",X"7A",X"E6", + X"07",X"20",X"0B",X"2C",X"7E",X"D6",X"20",X"77",X"6F",X"26",X"00",X"CD",X"C0",X"01",X"CB",X"52", + X"0E",X"07",X"20",X"02",X"0E",X"0B",X"CD",X"AD",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC", + X"01",X"0E",X"09",X"CD",X"AD",X"01",X"21",X"40",X"00",X"CD",X"C0",X"01",X"21",X"4E",X"30",X"36", + X"80",X"2C",X"36",X"40",X"AF",X"C9",X"21",X"4E",X"30",X"35",X"7E",X"28",X"11",X"E6",X"1F",X"20", + X"0B",X"2C",X"7E",X"D6",X"06",X"77",X"6F",X"26",X"00",X"CD",X"C0",X"01",X"AF",X"C9",X"3D",X"C9", + X"AF",X"CD",X"DC",X"01",X"21",X"50",X"30",X"36",X"B6",X"2C",X"0E",X"00",X"71",X"CD",X"AD",X"01", + X"2C",X"36",X"30",X"21",X"30",X"00",X"CD",X"C0",X"01",X"AF",X"C9",X"21",X"50",X"30",X"35",X"7E", + X"28",X"35",X"2C",X"FE",X"80",X"38",X"15",X"FE",X"83",X"38",X"07",X"FE",X"B2",X"3E",X"00",X"D8", + X"28",X"03",X"7E",X"C6",X"04",X"77",X"4F",X"CD",X"AD",X"01",X"AF",X"C9",X"57",X"E6",X"0F",X"20", + X"05",X"35",X"4E",X"CD",X"AD",X"01",X"2C",X"35",X"CB",X"5A",X"28",X"03",X"34",X"34",X"34",X"6E", + X"26",X"00",X"CD",X"C0",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"0E",X"0C",X"CD", + X"AD",X"01",X"21",X"0F",X"00",X"CD",X"C0",X"01",X"3E",X"10",X"32",X"53",X"30",X"AF",X"C9",X"21", + X"53",X"30",X"35",X"7E",X"28",X"0E",X"E6",X"01",X"21",X"0E",X"00",X"20",X"02",X"2E",X"0F",X"CD", + X"C0",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"0E",X"09",X"CD",X"AD",X"01",X"21", + X"40",X"00",X"CD",X"C0",X"01",X"21",X"54",X"30",X"36",X"80",X"2C",X"36",X"40",X"AF",X"C9",X"21", + X"54",X"30",X"35",X"7E",X"28",X"18",X"57",X"E6",X"1F",X"20",X"11",X"2C",X"7E",X"D6",X"0C",X"CB", + X"6A",X"20",X"02",X"C6",X"18",X"77",X"6F",X"26",X"00",X"CD",X"C0",X"01",X"AF",X"C9",X"3D",X"C9", + X"3E",X"01",X"CD",X"DC",X"01",X"0E",X"0E",X"CD",X"AD",X"01",X"21",X"56",X"30",X"36",X"00",X"2C", + X"36",X"60",X"6E",X"26",X"00",X"CD",X"C0",X"01",X"AF",X"C9",X"21",X"56",X"30",X"35",X"7E",X"28", + X"0D",X"FE",X"80",X"38",X"04",X"E6",X"1F",X"28",X"E6",X"2C",X"34",X"C3",X"F2",X"06",X"3D",X"C9", + X"3E",X"01",X"CD",X"DC",X"01",X"21",X"F8",X"00",X"22",X"58",X"30",X"CD",X"C0",X"01",X"0E",X"01", + X"CD",X"AD",X"01",X"21",X"5A",X"30",X"36",X"00",X"2C",X"36",X"A0",X"AF",X"C9",X"21",X"5A",X"30", + X"35",X"56",X"CB",X"46",X"20",X"2E",X"2C",X"35",X"7E",X"28",X"4B",X"2A",X"58",X"30",X"FE",X"0B", + X"38",X"33",X"FE",X"90",X"38",X"38",X"01",X"10",X"00",X"28",X"15",X"FE",X"9B",X"38",X"0C",X"5F", + X"C6",X"60",X"ED",X"44",X"87",X"3C",X"4F",X"CD",X"AD",X"01",X"7B",X"C6",X"60",X"4F",X"06",X"FF", + X"09",X"22",X"58",X"30",X"2A",X"58",X"30",X"7A",X"B7",X"EA",X"70",X"07",X"01",X"06",X"00",X"09", + X"CD",X"C0",X"01",X"AF",X"C9",X"4F",X"CD",X"AD",X"01",X"23",X"23",X"C3",X"61",X"07",X"E6",X"07", + X"20",X"E5",X"23",X"C3",X"61",X"07",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"21",X"40",X"00",X"CD", + X"C0",X"01",X"0E",X"00",X"CD",X"AD",X"01",X"21",X"5C",X"30",X"36",X"20",X"AF",X"2C",X"77",X"2C", + X"36",X"40",X"C9",X"21",X"5C",X"30",X"35",X"7E",X"28",X"18",X"E6",X"01",X"4F",X"28",X"0E",X"2C", + X"34",X"7E",X"2C",X"86",X"77",X"6F",X"26",X"00",X"CD",X"C0",X"01",X"0E",X"0A",X"CD",X"AD",X"01", + X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"0E",X"05",X"CD",X"AD",X"01",X"AF",X"21",X"5F", + X"30",X"36",X"80",X"2C",X"77",X"2C",X"77",X"C9",X"21",X"5F",X"30",X"35",X"7E",X"28",X"1A",X"57", + X"FE",X"08",X"38",X"23",X"FE",X"30",X"30",X"13",X"2C",X"7E",X"C6",X"C3",X"77",X"2C",X"AE",X"AA", + X"77",X"6F",X"26",X"02",X"CD",X"C0",X"01",X"AF",X"C9",X"3D",X"C9",X"E6",X"07",X"20",X"E9",X"7A", + X"0F",X"0F",X"0F",X"4F",X"3E",X"15",X"91",X"4F",X"CD",X"AD",X"01",X"AF",X"C9",X"3E",X"01",X"CD", + X"DC",X"01",X"21",X"62",X"30",X"36",X"80",X"2C",X"0E",X"0F",X"71",X"CD",X"AD",X"01",X"2C",X"36", + X"23",X"2C",X"36",X"D7",X"21",X"4C",X"01",X"CD",X"C0",X"01",X"AF",X"C9",X"21",X"62",X"30",X"35", + X"7E",X"28",X"30",X"2C",X"FE",X"78",X"28",X"23",X"FE",X"70",X"28",X"1F",X"FE",X"68",X"28",X"1B", + X"30",X"04",X"E6",X"07",X"20",X"05",X"35",X"4E",X"CD",X"AD",X"01",X"2C",X"7E",X"C6",X"5D",X"77", + X"2C",X"AE",X"77",X"6F",X"26",X"01",X"CD",X"C0",X"01",X"AF",X"C9",X"0E",X"0F",X"71",X"CD",X"AD", + X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"21",X"69",X"30",X"36",X"0C",X"4E",X"CD", + X"AD",X"01",X"2D",X"36",X"00",X"21",X"80",X"00",X"22",X"66",X"30",X"CD",X"C0",X"01",X"AF",X"C9", + X"21",X"68",X"30",X"34",X"7E",X"FE",X"59",X"28",X"0F",X"4F",X"06",X"00",X"2A",X"66",X"30",X"09", + X"22",X"66",X"30",X"CD",X"C0",X"01",X"AF",X"C9",X"2C",X"7E",X"D6",X"04",X"28",X"04",X"77",X"C3", + X"6E",X"08",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"21",X"20",X"04",X"CD",X"C0",X"01",X"21",X"6A", + X"30",X"36",X"00",X"2C",X"0E",X"0F",X"71",X"CD",X"AD",X"01",X"AF",X"C9",X"21",X"6A",X"30",X"35", + X"7E",X"57",X"E6",X"0F",X"20",X"10",X"2C",X"7E",X"3C",X"CB",X"62",X"28",X"04",X"D6",X"03",X"28", + X"07",X"77",X"4F",X"CD",X"AD",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"21",X"50", + X"00",X"CD",X"C0",X"01",X"21",X"6C",X"30",X"36",X"48",X"2C",X"0E",X"0F",X"71",X"CD",X"AD",X"01", + X"AF",X"C9",X"21",X"6C",X"30",X"35",X"7E",X"28",X"13",X"57",X"E6",X"03",X"20",X"0C",X"2C",X"CB", + X"52",X"0E",X"06",X"20",X"02",X"35",X"4E",X"CD",X"AD",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD", + X"DC",X"01",X"21",X"6E",X"30",X"36",X"09",X"2C",X"36",X"60",X"2C",X"0E",X"0C",X"71",X"CD",X"AD", + X"01",X"2C",X"36",X"40",X"6E",X"26",X"00",X"CD",X"C0",X"01",X"AF",X"C9",X"21",X"6F",X"30",X"35", + X"7E",X"28",X"24",X"FE",X"40",X"20",X"05",X"2D",X"35",X"20",X"DC",X"2C",X"57",X"E6",X"01",X"20", + X"E9",X"2C",X"7A",X"E6",X"07",X"20",X"05",X"35",X"4E",X"CD",X"AD",X"01",X"2C",X"34",X"CB",X"52", + X"20",X"D2",X"35",X"35",X"C3",X"24",X"09",X"3D",X"C9",X"3E",X"01",X"CD",X"DC",X"01",X"21",X"00", + X"01",X"22",X"72",X"30",X"CD",X"C0",X"01",X"0E",X"05",X"CD",X"AD",X"01",X"21",X"74",X"30",X"36", + X"00",X"2C",X"36",X"A0",X"AF",X"C9",X"21",X"74",X"30",X"35",X"7E",X"57",X"E6",X"03",X"20",X"2F", + X"2C",X"35",X"7E",X"28",X"4C",X"2A",X"72",X"30",X"FE",X"0F",X"38",X"34",X"FE",X"90",X"38",X"39", + X"01",X"10",X"00",X"28",X"16",X"FE",X"9B",X"38",X"0D",X"5F",X"C6",X"60",X"ED",X"44",X"87",X"C6", + X"05",X"4F",X"CD",X"AD",X"01",X"7B",X"C6",X"60",X"4F",X"06",X"FF",X"09",X"22",X"72",X"30",X"2A", + X"72",X"30",X"7A",X"B7",X"EA",X"BB",X"09",X"01",X"06",X"00",X"09",X"CD",X"C0",X"01",X"AF",X"C9", + X"4F",X"CD",X"AD",X"01",X"23",X"23",X"C3",X"AC",X"09",X"E6",X"07",X"20",X"E5",X"23",X"C3",X"AC", + X"09",X"3D",X"C9",X"AB",X"01",X"24",X"04",X"85",X"04",X"C6",X"04",X"09",X"05",X"60",X"05",X"A5", + X"05",X"ED",X"05",X"20",X"06",X"79",X"06",X"A6",X"06",X"E0",X"06",X"10",X"07",X"88",X"07",X"C4", + X"07",X"0D",X"08",X"65",X"08",X"A4",X"08",X"DA",X"08",X"0E",X"09",X"59",X"09",X"BA",X"0A",X"BA", + X"0A",X"BA",X"0A",X"59",X"0A",X"5D",X"0A",X"62",X"0A",X"67",X"0A",X"6C",X"0A",X"71",X"0A",X"76", + X"0A",X"7B",X"0A",X"80",X"0A",X"85",X"0A",X"8A",X"0A",X"8F",X"0A",X"94",X"0A",X"99",X"0A",X"9E", + X"0A",X"A3",X"0A",X"A8",X"0A",X"AD",X"0A",X"B2",X"0A",X"00",X"00",X"43",X"04",X"A1",X"04",X"E2", + X"04",X"29",X"05",X"7E",X"05",X"BE",X"05",X"06",X"06",X"3B",X"06",X"8F",X"06",X"BF",X"06",X"FA", + X"06",X"2D",X"07",X"A3",X"07",X"D8",X"07",X"2C",X"08",X"80",X"08",X"BC",X"08",X"F2",X"08",X"2C", + X"09",X"76",X"09",X"C0",X"0A",X"C9",X"0A",X"D2",X"0A",X"AF",X"C3",X"B4",X"0A",X"3E",X"01",X"C3", + X"B4",X"0A",X"3E",X"02",X"C3",X"B4",X"0A",X"3E",X"03",X"C3",X"B4",X"0A",X"3E",X"04",X"C3",X"B4", + X"0A",X"3E",X"05",X"C3",X"B4",X"0A",X"3E",X"06",X"C3",X"B4",X"0A",X"3E",X"07",X"C3",X"B4",X"0A", + X"3E",X"08",X"C3",X"B4",X"0A",X"3E",X"09",X"C3",X"B4",X"0A",X"3E",X"0A",X"C3",X"B4",X"0A",X"3E", + X"0B",X"C3",X"B4",X"0A",X"3E",X"0C",X"C3",X"B4",X"0A",X"3E",X"0D",X"C3",X"B4",X"0A",X"3E",X"0E", + X"C3",X"B4",X"0A",X"3E",X"0F",X"C3",X"B4",X"0A",X"3E",X"10",X"C3",X"B4",X"0A",X"3E",X"11",X"C3", + X"B4",X"0A",X"3E",X"12",X"CD",X"CE",X"03",X"3E",X"FF",X"C9",X"AF",X"CD",X"DC",X"01",X"AF",X"C9", + X"DD",X"21",X"0F",X"30",X"CD",X"10",X"02",X"AF",X"C9",X"DD",X"21",X"1C",X"30",X"CD",X"10",X"02", + X"AF",X"C9",X"DD",X"21",X"29",X"30",X"CD",X"10",X"02",X"AF",X"C9",X"4D",X"0B",X"5E",X"0B",X"5E", + X"0B",X"5F",X"0B",X"72",X"0B",X"72",X"0B",X"73",X"0B",X"CD",X"0B",X"13",X"0C",X"3F",X"0C",X"8D", + X"0C",X"C7",X"0C",X"01",X"0D",X"42",X"0D",X"6A",X"0D",X"91",X"0D",X"BB",X"0D",X"DD",X"0D",X"ED", + X"0D",X"27",X"0E",X"27",X"0E",X"28",X"0E",X"65",X"0E",X"65",X"0E",X"66",X"0E",X"9C",X"0E",X"9C", + X"0E",X"9D",X"0E",X"E6",X"0E",X"E6",X"0E",X"E7",X"0E",X"0C",X"0F",X"31",X"0F",X"75",X"0F",X"C2", + X"0F",X"03",X"10",X"44",X"10",X"6E",X"10",X"9F",X"10",X"EE",X"10",X"37",X"11",X"7E",X"11",X"C5", + X"11",X"F0",X"11",X"F0",X"11",X"F1",X"11",X"3A",X"12",X"3A",X"12",X"3B",X"12",X"79",X"12",X"B6", + X"12",X"F1",X"12",X"81",X"13",X"AF",X"14",X"B0",X"15",X"B0",X"15",X"B0",X"15",X"1F",X"0F",X"3F", + X"1B",X"5F",X"0A",X"9F",X"02",X"A1",X"81",X"81",X"A1",X"81",X"81",X"DF",X"55",X"0B",X"FF",X"1F", + X"0F",X"3F",X"1B",X"5F",X"0A",X"9F",X"02",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"DF", + X"67",X"0B",X"FF",X"1F",X"0C",X"3F",X"16",X"5F",X"06",X"8B",X"8D",X"8B",X"6D",X"6E",X"6F",X"92", + X"60",X"94",X"92",X"97",X"60",X"76",X"79",X"97",X"96",X"99",X"60",X"97",X"94",X"92",X"72",X"72", + X"74",X"92",X"97",X"60",X"76",X"77",X"74",X"72",X"8F",X"AD",X"60",X"71",X"74",X"77",X"76",X"77", + X"76",X"74",X"72",X"70",X"6F",X"6D",X"8B",X"8D",X"8B",X"6D",X"6E",X"6F",X"6F",X"92",X"94",X"92", + X"94",X"60",X"76",X"79",X"97",X"96",X"76",X"99",X"97",X"94",X"92",X"92",X"77",X"8B",X"AD",X"B2", + X"60",X"7F",X"00",X"CB",X"7F",X"FF",X"8B",X"8B",X"8D",X"8E",X"DF",X"79",X"0B",X"1F",X"0C",X"3F", + X"16",X"5F",X"06",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"88",X"88",X"88",X"88",X"88", + X"88",X"88",X"88",X"86",X"86",X"86",X"86",X"88",X"88",X"88",X"88",X"85",X"85",X"85",X"85",X"86", + X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"88",X"88",X"88",X"88",X"88", + X"88",X"88",X"88",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"C6", + X"DF",X"D3",X"0B",X"1F",X"06",X"3F",X"16",X"5F",X"06",X"AB",X"A6",X"AB",X"8D",X"8F",X"B0",X"AB", + X"B0",X"B0",X"AF",X"AF",X"A8",X"A8",X"AD",X"AD",X"A6",X"88",X"8A",X"AB",X"A6",X"AB",X"8D",X"8F", + X"B0",X"AB",X"B0",X"B0",X"AF",X"AF",X"A6",X"88",X"8A",X"AB",X"A6",X"CB",X"DF",X"19",X"0C",X"1F", + X"0F",X"3F",X"17",X"5F",X"07",X"8F",X"8B",X"8B",X"6D",X"6F",X"90",X"8D",X"8D",X"92",X"8F",X"8B", + X"8B",X"8B",X"6D",X"6B",X"6A",X"68",X"A6",X"8F",X"8B",X"8B",X"6D",X"6F",X"90",X"8D",X"8D",X"92", + X"8F",X"8B",X"8D",X"8A",X"8B",X"8B",X"AB",X"92",X"92",X"92",X"70",X"72",X"94",X"90",X"90",X"90", + X"94",X"94",X"94",X"72",X"70",X"94",X"94",X"94",X"72",X"70",X"8F",X"8B",X"8B",X"6D",X"6F",X"90", + X"8D",X"8D",X"92",X"8F",X"8B",X"8D",X"8A",X"8B",X"8B",X"AB",X"DF",X"45",X"0C",X"1F",X"05",X"3F", + X"17",X"5F",X"06",X"87",X"97",X"B7",X"82",X"95",X"B5",X"87",X"97",X"B7",X"82",X"95",X"95",X"95", + X"87",X"97",X"B7",X"82",X"95",X"B5",X"82",X"97",X"B8",X"97",X"97",X"B7",X"87",X"97",X"B7",X"8C", + X"98",X"B8",X"8C",X"98",X"B8",X"87",X"97",X"B7",X"87",X"97",X"B7",X"82",X"95",X"B5",X"82",X"97", + X"B8",X"97",X"97",X"B7",X"DF",X"93",X"0C",X"1F",X"05",X"3F",X"17",X"5F",X"06",X"87",X"8E",X"AE", + X"82",X"8E",X"AE",X"87",X"8E",X"AE",X"82",X"8E",X"8E",X"8E",X"87",X"8E",X"AE",X"82",X"8E",X"AE", + X"82",X"8E",X"AE",X"93",X"93",X"B3",X"87",X"8E",X"AE",X"8C",X"90",X"B0",X"8C",X"90",X"B0",X"87", + X"8E",X"AE",X"87",X"8E",X"AE",X"82",X"8E",X"AE",X"82",X"8E",X"AE",X"93",X"93",X"B3",X"DF",X"CD", + X"0C",X"1F",X"0E",X"3F",X"18",X"5F",X"09",X"88",X"87",X"88",X"85",X"94",X"93",X"94",X"91",X"85", + X"84",X"85",X"81",X"91",X"90",X"91",X"8D",X"85",X"83",X"81",X"83",X"91",X"8F",X"8D",X"8F",X"88", + X"8A",X"88",X"85",X"94",X"96",X"94",X"91",X"88",X"8A",X"8C",X"AD",X"A8",X"A5",X"A1",X"7F",X"00", + X"CA",X"7F",X"FF",X"8A",X"8A",X"8C",X"8A",X"A8",X"A6",X"A5",X"A3",X"7F",X"00",X"C1",X"7F",X"FF", + X"A1",X"FF",X"1F",X"0E",X"3F",X"18",X"5F",X"00",X"A1",X"A0",X"5F",X"09",X"A5",X"A5",X"80",X"A0", + X"85",X"A5",X"A5",X"80",X"85",X"A5",X"A6",X"A6",X"A6",X"A6",X"A5",X"85",X"A5",X"A6",X"80",X"A5", + X"C0",X"A5",X"A6",X"86",X"A6",X"C4",X"A8",X"A8",X"A8",X"FF",X"1F",X"08",X"3F",X"18",X"5F",X"00", + X"A1",X"80",X"5F",X"08",X"AD",X"A8",X"AD",X"C8",X"A8",X"80",X"8D",X"A8",X"A3",X"A8",X"A3",X"A8", + X"AD",X"C8",X"A8",X"AD",X"A8",X"AD",X"A5",X"A6",X"A1",X"A6",X"A7",X"A8",X"A8",X"AA",X"CC",X"C8", + X"FF",X"1F",X"0E",X"3F",X"16",X"5F",X"09",X"69",X"89",X"69",X"86",X"89",X"A7",X"24",X"24",X"25", + X"25",X"26",X"26",X"26",X"26",X"87",X"66",X"86",X"66",X"84",X"81",X"3F",X"10",X"22",X"23",X"24", + X"25",X"26",X"27",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"AE",X"FF",X"1F",X"0E",X"3F",X"16",X"5F", + X"09",X"66",X"86",X"66",X"82",X"86",X"A4",X"A0",X"62",X"82",X"62",X"81",X"80",X"3F",X"10",X"26", + X"27",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"30",X"31",X"B2",X"FF",X"1F",X"08",X"3F", + X"16",X"5F",X"08",X"A2",X"A0",X"A4",X"A0",X"A2",X"A1",X"3F",X"10",X"A2",X"FF",X"1F",X"0F",X"3F", + X"1A",X"5F",X"0C",X"9F",X"02",X"81",X"81",X"A1",X"81",X"81",X"A1",X"81",X"81",X"81",X"81",X"A1", + X"A1",X"81",X"81",X"A1",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"A1",X"A1",X"81",X"81", + X"A1",X"81",X"81",X"A1",X"81",X"81",X"81",X"81",X"A1",X"A1",X"81",X"81",X"81",X"81",X"81",X"81", + X"81",X"81",X"A1",X"81",X"81",X"A1",X"FF",X"FF",X"1F",X"0F",X"3F",X"1A",X"5F",X"0C",X"9F",X"02", + X"81",X"81",X"A1",X"81",X"81",X"A1",X"A1",X"A1",X"61",X"61",X"61",X"61",X"81",X"81",X"81",X"81", + X"A1",X"81",X"81",X"A1",X"A1",X"A1",X"61",X"61",X"61",X"61",X"81",X"81",X"81",X"81",X"A1",X"61", + X"61",X"61",X"61",X"81",X"81",X"81",X"81",X"A1",X"61",X"61",X"61",X"61",X"81",X"81",X"81",X"81", + X"81",X"81",X"A1",X"A1",X"A1",X"FF",X"1F",X"0F",X"3F",X"1A",X"5F",X"0C",X"9F",X"02",X"81",X"A1", + X"A1",X"A1",X"80",X"81",X"A1",X"A1",X"A1",X"80",X"81",X"A1",X"61",X"61",X"61",X"61",X"61",X"61", + X"81",X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"81",X"A1",X"A1",X"A1",X"80",X"81",X"A1",X"A1", + X"A1",X"80",X"81",X"A1",X"81",X"81",X"A1",X"A1",X"A1",X"81",X"81",X"A1",X"FF",X"1F",X"0F",X"3F", + X"1A",X"5F",X"0C",X"9F",X"02",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"A1", + X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"A1",X"A1",X"81",X"A1",X"81",X"A1",X"A1", + X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61",X"61", + X"61",X"61",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"A1",X"A1",X"81",X"A1", + X"81",X"81",X"81",X"81",X"81",X"A1",X"FF",X"1F",X"0E",X"3F",X"16",X"5F",X"09",X"95",X"97",X"99", + X"9A",X"95",X"95",X"B5",X"93",X"92",X"B3",X"92",X"90",X"B2",X"90",X"AE",X"8B",X"8D",X"8E",X"AD", + X"8E",X"B0",X"AE",X"E0",X"C0",X"A0",X"97",X"95",X"8B",X"8D",X"AE",X"FF",X"1F",X"0E",X"3F",X"16", + X"5F",X"09",X"92",X"93",X"95",X"95",X"92",X"92",X"B2",X"90",X"8E",X"B0",X"8E",X"8D",X"AE",X"8D", + X"AB",X"87",X"89",X"8B",X"A9",X"8B",X"AD",X"A9",X"E0",X"C0",X"A0",X"93",X"92",X"87",X"89",X"AB", + X"FF",X"1F",X"02",X"3F",X"16",X"5F",X"00",X"A1",X"80",X"5F",X"09",X"8E",X"95",X"92",X"95",X"8E", + X"90",X"92",X"B3",X"97",X"8E",X"B2",X"95",X"AE",X"93",X"97",X"8E",X"97",X"8D",X"95",X"90",X"5F", + X"0B",X"7F",X"FE",X"9F",X"02",X"61",X"61",X"81",X"81",X"81",X"61",X"61",X"81",X"81",X"81",X"61", + X"61",X"81",X"81",X"61",X"81",X"61",X"81",X"81",X"A1",X"5F",X"09",X"7F",X"FF",X"9F",X"00",X"97", + X"95",X"8B",X"8D",X"AE",X"FF",X"1F",X"0F",X"3F",X"18",X"5F",X"09",X"66",X"68",X"8A",X"8D",X"8D", + X"8F",X"8D",X"8A",X"86",X"66",X"68",X"8A",X"8A",X"88",X"86",X"A8",X"88",X"66",X"68",X"8A",X"8D", + X"8D",X"6D",X"6F",X"8D",X"8A",X"86",X"66",X"68",X"8A",X"8A",X"88",X"88",X"A6",X"86",X"66",X"68", + X"8A",X"8D",X"8D",X"6D",X"6F",X"8D",X"8A",X"86",X"66",X"68",X"8A",X"8A",X"88",X"86",X"A8",X"80", + X"66",X"68",X"8A",X"8D",X"8D",X"8F",X"8D",X"8A",X"86",X"66",X"68",X"8A",X"8A",X"88",X"68",X"68", + X"A6",X"FF",X"1F",X"0B",X"3F",X"18",X"5F",X"00",X"81",X"5F",X"08",X"82",X"92",X"92",X"92",X"82", + X"92",X"92",X"92",X"82",X"92",X"84",X"94",X"89",X"93",X"B3",X"82",X"92",X"92",X"92",X"82",X"92", + X"B4",X"82",X"92",X"89",X"93",X"82",X"92",X"B2",X"82",X"92",X"92",X"92",X"82",X"92",X"92",X"92", + X"82",X"92",X"84",X"94",X"89",X"93",X"B3",X"82",X"92",X"92",X"92",X"82",X"92",X"92",X"92",X"B2", + X"B3",X"B2",X"FF",X"1F",X"05",X"3F",X"18",X"5F",X"00",X"81",X"5F",X"09",X"82",X"8E",X"8E",X"8E", + X"82",X"8E",X"8E",X"8E",X"82",X"8E",X"84",X"90",X"89",X"90",X"B0",X"82",X"8E",X"8E",X"8E",X"82", + X"8E",X"B0",X"82",X"8E",X"89",X"90",X"82",X"8E",X"AE",X"82",X"8E",X"8E",X"8E",X"82",X"8E",X"8E", + X"8E",X"82",X"8E",X"84",X"90",X"89",X"90",X"B0",X"82",X"8E",X"8E",X"8E",X"92",X"8E",X"8E",X"8E", + X"AE",X"B0",X"CE",X"FF",X"1F",X"0E",X"3F",X"17",X"5F",X"09",X"92",X"93",X"B5",X"92",X"93",X"B5", + X"97",X"99",X"99",X"97",X"97",X"96",X"B7",X"90",X"92",X"B3",X"90",X"92",X"B3",X"99",X"97",X"95", + X"93",X"92",X"90",X"AE",X"E0",X"E0",X"A0",X"97",X"95",X"93",X"92",X"90",X"AE",X"FF",X"1F",X"08", + X"3F",X"17",X"5F",X"08",X"8B",X"8D",X"8E",X"95",X"92",X"95",X"8E",X"95",X"92",X"95",X"93",X"97", + X"8E",X"97",X"93",X"97",X"8E",X"97",X"8D",X"95",X"90",X"95",X"8D",X"95",X"90",X"95",X"8E",X"95", + X"92",X"95",X"AE",X"E0",X"E0",X"A0",X"1F",X"0E",X"93",X"92",X"90",X"8E",X"8D",X"B2",X"FF",X"1F", + X"08",X"3F",X"17",X"5F",X"00",X"A1",X"80",X"5F",X"09",X"9A",X"80",X"9A",X"80",X"9A",X"80",X"9A", + X"80",X"9A",X"80",X"9A",X"80",X"9A",X"80",X"9A",X"80",X"99",X"80",X"99",X"80",X"99",X"80",X"99", + X"80",X"9A",X"80",X"9A",X"B2",X"80",X"5F",X"0B",X"7F",X"FE",X"9F",X"02",X"61",X"61",X"81",X"81", + X"81",X"61",X"61",X"81",X"81",X"81",X"61",X"61",X"81",X"81",X"81",X"81",X"81",X"81",X"A1",X"5F", + X"09",X"7F",X"FF",X"9F",X"00",X"5F",X"08",X"97",X"95",X"93",X"92",X"90",X"AE",X"FF",X"1F",X"0F", + X"3F",X"18",X"5F",X"09",X"86",X"83",X"86",X"86",X"86",X"84",X"88",X"88",X"68",X"68",X"6A",X"6A", + X"8A",X"88",X"8A",X"8B",X"8D",X"AF",X"83",X"86",X"86",X"86",X"84",X"88",X"88",X"88",X"8A",X"6A", + X"6A",X"88",X"8A",X"8B",X"86",X"AB",X"86",X"86",X"86",X"66",X"66",X"88",X"88",X"A8",X"6A",X"6A", + X"8A",X"88",X"8A",X"8B",X"8D",X"AF",X"86",X"86",X"86",X"66",X"66",X"88",X"88",X"A8",X"6A",X"6A", + X"8A",X"88",X"8A",X"8B",X"86",X"AB",X"FF",X"1F",X"0A",X"3F",X"18",X"5F",X"00",X"81",X"5F",X"08", + X"89",X"99",X"8D",X"99",X"81",X"9A",X"89",X"9A",X"84",X"9A",X"88",X"9A",X"89",X"99",X"B9",X"89", + X"99",X"8D",X"99",X"82",X"9A",X"89",X"9A",X"84",X"9A",X"88",X"9A",X"89",X"99",X"B9",X"89",X"99", + X"8D",X"99",X"81",X"9A",X"89",X"9A",X"84",X"9A",X"88",X"9A",X"89",X"99",X"8D",X"99",X"89",X"99", + X"8D",X"99",X"82",X"9A",X"89",X"9A",X"84",X"9A",X"88",X"9A",X"89",X"99",X"B9",X"FF",X"1F",X"04", + X"3F",X"18",X"5F",X"00",X"81",X"5F",X"09",X"89",X"90",X"8D",X"90",X"81",X"92",X"89",X"92",X"84", + X"90",X"88",X"90",X"89",X"90",X"B0",X"89",X"90",X"8D",X"90",X"82",X"92",X"89",X"92",X"84",X"92", + X"88",X"92",X"89",X"90",X"B0",X"89",X"90",X"8D",X"90",X"81",X"92",X"89",X"92",X"84",X"92",X"88", + X"92",X"89",X"90",X"8D",X"90",X"89",X"90",X"8D",X"90",X"82",X"92",X"89",X"92",X"84",X"90",X"88", + X"90",X"89",X"90",X"B0",X"FF",X"3F",X"1A",X"5F",X"07",X"1F",X"0F",X"7E",X"7C",X"7A",X"78",X"77", + X"75",X"73",X"72",X"70",X"6E",X"6C",X"6B",X"69",X"67",X"66",X"64",X"62",X"1F",X"00",X"7E",X"7D", + X"7B",X"79",X"78",X"76",X"74",X"72",X"71",X"6F",X"6D",X"6C",X"6A",X"68",X"66",X"65",X"63",X"61", + X"FF",X"1F",X"0F",X"3F",X"1A",X"5F",X"0A",X"9F",X"02",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61", + X"61",X"61",X"61",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"A1",X"A1",X"81", + X"A1",X"81",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"A1",X"A1",X"61",X"61", + X"61",X"61",X"61",X"61",X"61",X"61",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61", + X"A1",X"A1",X"81",X"A1",X"81",X"81",X"81",X"81",X"81",X"C1",X"FF",X"1F",X"0D",X"3F",X"18",X"5F", + X"09",X"AD",X"AF",X"B2",X"8D",X"8F",X"92",X"8D",X"8F",X"92",X"8D",X"8F",X"92",X"8D",X"8F",X"B2", + X"80",X"8F",X"92",X"94",X"8F",X"92",X"94",X"8F",X"92",X"94",X"8F",X"92",X"B4",X"80",X"94",X"96", + X"99",X"94",X"96",X"99",X"94",X"96",X"99",X"94",X"96",X"B9",X"9B",X"B9",X"B7",X"92",X"B4",X"8F", + X"B2",X"8D",X"AF",X"88",X"AD",X"A6",X"DF",X"44",X"12",X"3F",X"18",X"5F",X"00",X"C1",X"A0",X"5F", + X"07",X"1F",X"0D",X"92",X"92",X"92",X"92",X"92",X"B2",X"B2",X"92",X"92",X"92",X"92",X"92",X"94", + X"94",X"94",X"94",X"94",X"B4",X"B4",X"94",X"94",X"94",X"94",X"94",X"99",X"99",X"99",X"99",X"99", + X"B9",X"B9",X"99",X"99",X"B9",X"80",X"A0",X"1F",X"07",X"B7",X"92",X"B4",X"8F",X"B2",X"8D",X"AF", + X"88",X"AD",X"A6",X"DF",X"81",X"12",X"3F",X"18",X"5F",X"00",X"C1",X"A0",X"5F",X"08",X"1F",X"07", + X"86",X"86",X"A3",X"81",X"A3",X"86",X"86",X"86",X"A3",X"86",X"85",X"88",X"88",X"A5",X"83",X"A5", + X"88",X"88",X"88",X"A5",X"88",X"86",X"8D",X"8D",X"AA",X"88",X"AA",X"8D",X"8D",X"8D",X"8A",X"AA", + X"80",X"A0",X"1F",X"01",X"B7",X"92",X"B4",X"8F",X"B2",X"8D",X"AF",X"88",X"AD",X"A6",X"DF",X"BE", + X"12",X"3F",X"16",X"5F",X"08",X"1F",X"02",X"7F",X"00",X"CD",X"7F",X"FF",X"CC",X"7F",X"00",X"CD", + X"7F",X"FF",X"CC",X"7F",X"00",X"CD",X"7F",X"FF",X"CC",X"7F",X"00",X"CD",X"7F",X"FF",X"CC",X"1F", + X"0E",X"80",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"8F", + X"7F",X"00",X"88",X"7F",X"FF",X"C8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8", + X"A8",X"A8",X"A8",X"8F",X"7F",X"00",X"88",X"7F",X"FF",X"A8",X"80",X"81",X"85",X"88",X"8D",X"86", + X"8A",X"8D",X"92",X"88",X"8C",X"91",X"94",X"94",X"91",X"8C",X"88",X"86",X"8A",X"8D",X"92",X"81", + X"85",X"88",X"8D",X"1F",X"08",X"8A",X"92",X"94",X"99",X"1F",X"0E",X"88",X"8C",X"8F",X"94",X"81", + X"85",X"88",X"8D",X"86",X"8A",X"8D",X"92",X"88",X"8C",X"91",X"94",X"94",X"91",X"8C",X"88",X"86", + X"8A",X"8D",X"92",X"81",X"85",X"88",X"8D",X"AD",X"B2",X"7F",X"00",X"88",X"7F",X"FF",X"A8",X"80", + X"FF",X"3F",X"16",X"1F",X"08",X"5F",X"09",X"7F",X"00",X"CD",X"7F",X"FF",X"8C",X"BF",X"14",X"80", + X"A0",X"7F",X"00",X"CD",X"7F",X"FF",X"CC",X"7F",X"00",X"CD",X"7F",X"FF",X"8C",X"BF",X"14",X"80", + X"A0",X"7F",X"00",X"CD",X"1F",X"0E",X"5F",X"0A",X"9F",X"01",X"71",X"71",X"71",X"71",X"B1",X"5F", + X"09",X"7F",X"FF",X"9F",X"00",X"88",X"88",X"86",X"86",X"85",X"85",X"83",X"83",X"A1",X"A3",X"7F", + X"00",X"BF",X"01",X"85",X"BF",X"01",X"85",X"7F",X"FF",X"BF",X"01",X"A5",X"88",X"88",X"86",X"86", + X"85",X"85",X"83",X"83",X"A1",X"A3",X"7F",X"00",X"BF",X"05",X"81",X"BF",X"05",X"81",X"7F",X"FF", + X"BF",X"05",X"A1",X"88",X"88",X"86",X"86",X"85",X"85",X"83",X"83",X"A1",X"A3",X"BF",X"04",X"7F", + X"00",X"85",X"7F",X"FF",X"A5",X"80",X"88",X"88",X"86",X"86",X"85",X"85",X"83",X"83",X"BF",X"04", + X"81",X"1F",X"08",X"8C",X"1F",X"0E",X"81",X"83",X"BF",X"04",X"7F",X"00",X"A1",X"7F",X"FF",X"A1", + X"7F",X"00",X"A8",X"7F",X"FF",X"A8",X"7F",X"00",X"AA",X"7F",X"FF",X"AA",X"BF",X"01",X"8C",X"BF", + X"01",X"8A",X"BF",X"01",X"88",X"BF",X"01",X"8A",X"BF",X"01",X"7F",X"00",X"AC",X"7F",X"FF",X"AC", + X"7F",X"00",X"B1",X"7F",X"FF",X"B1",X"7F",X"00",X"AC",X"7F",X"FF",X"AC",X"BF",X"09",X"8D",X"BF", + X"09",X"8C",X"BF",X"09",X"8A",X"BF",X"09",X"88",X"BF",X"05",X"7F",X"00",X"A6",X"7F",X"FF",X"BF", + X"03",X"A6",X"7F",X"00",X"A8",X"7F",X"FF",X"A8",X"7F",X"00",X"AA",X"7F",X"FF",X"AA",X"BF",X"0A", + X"8C",X"8A",X"88",X"8A",X"BF",X"01",X"7F",X"00",X"AC",X"7F",X"FF",X"AC",X"BF",X"08",X"7F",X"00", + X"B1",X"7F",X"FF",X"BF",X"03",X"B1",X"BF",X"08",X"7F",X"00",X"AD",X"7F",X"FF",X"BF",X"03",X"AD", + X"BF",X"08",X"8A",X"88",X"BF",X"08",X"86",X"83",X"BF",X"03",X"7F",X"00",X"A5",X"7F",X"FF",X"BF", + X"03",X"85",X"5F",X"0A",X"7F",X"FE",X"9F",X"02",X"61",X"61",X"81",X"81",X"81",X"61",X"61",X"81", + X"81",X"81",X"61",X"61",X"81",X"81",X"61",X"81",X"61",X"81",X"81",X"BF",X"12",X"A1",X"FF",X"3F", + X"16",X"1F",X"08",X"5F",X"09",X"7F",X"00",X"C7",X"7F",X"FF",X"C6",X"7F",X"00",X"C7",X"7F",X"FF", + X"C6",X"7F",X"00",X"C7",X"7F",X"FF",X"C6",X"7F",X"00",X"C7",X"7F",X"FF",X"C6",X"1F",X"02",X"5F", + X"08",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F", + X"2F",X"91",X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"94",X"88",X"8A",X"8C", + X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F", + X"91",X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"94",X"92",X"91",X"8F",X"8D", + X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91", + X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"94",X"88",X"8A",X"8C",X"8D",X"60", + X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74", + X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"8D",X"8C",X"AD",X"1F",X"0E",X"5F",X"09", + X"7F",X"00",X"A5",X"7F",X"FF",X"A5",X"7F",X"00",X"A6",X"7F",X"FF",X"A6",X"88",X"86",X"85",X"86", + X"7F",X"00",X"88",X"7F",X"FF",X"A8",X"80",X"7F",X"00",X"AD",X"7F",X"FF",X"AD",X"7F",X"00",X"A8", + X"7F",X"FF",X"A8",X"8A",X"88",X"86",X"85",X"7F",X"00",X"83",X"7F",X"FF",X"A3",X"80",X"7F",X"00", + X"A5",X"7F",X"FF",X"A5",X"7F",X"00",X"A6",X"7F",X"FF",X"A6",X"88",X"86",X"85",X"86",X"7F",X"00", + X"88",X"7F",X"FF",X"A8",X"80",X"7F",X"00",X"AD",X"7F",X"FF",X"AD",X"7F",X"00",X"A8",X"7F",X"FF", + X"A8",X"86",X"85",X"83",X"1F",X"08",X"8C",X"1F",X"0E",X"7F",X"00",X"AD",X"7F",X"FF",X"AD",X"FF", + X"FF",X"1F",X"0E",X"3F",X"15",X"5F",X"09",X"BA",X"D2",X"C6",X"D2",X"BF",X"C4",X"F3",X"F3",X"CC", + X"BE",X"C5",X"CF",X"D2",X"C6",X"F3",X"F3",X"CA",X"CF",X"CE",X"C4",X"C5",X"F3",X"F3",X"D2",X"C1", + X"D0",X"D2",X"CF",X"CA",X"D2",X"F3",X"F3",X"DA",X"DA",X"DA",X"F3",X"F3",X"D0",X"C4",X"C3",X"BA", + X"C1",X"CA",X"CC",X"CB",X"BF",X"F3",X"C8",X"C4",X"C5",X"D2",X"C6",X"CA",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_sprite_color_lut.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_sprite_color_lut.vhd new file mode 100644 index 00000000..79da34bd --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_sprite_color_lut.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_sprite_color_lut is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_sprite_color_lut is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"02",X"02",X"04",X"02",X"06",X"07",X"08",X"09",X"04",X"0B",X"0C",X"06",X"0E",X"0F",X"0F", + X"00",X"03",X"02",X"05",X"03",X"07",X"08",X"09",X"0A",X"0B",X"0F",X"0F",X"0F",X"0F",X"0F",X"00", + X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F", + X"00",X"05",X"02",X"0B",X"05",X"09",X"0A",X"0B",X"0C",X"04",X"0E",X"0F",X"01",X"02",X"03",X"04", + X"00",X"04",X"07",X"0D",X"04",X"05",X"0B",X"0C",X"0D",X"0E",X"0A",X"01",X"02",X"03",X"04",X"0F", + X"00",X"01",X"01",X"02",X"01",X"0F",X"02",X"02",X"0F",X"0F",X"01",X"0F",X"00",X"01",X"00",X"00", + X"00",X"01",X"01",X"02",X"01",X"0F",X"00",X"00",X"01",X"01",X"00",X"00",X"01",X"0F",X"00",X"00", + X"00",X"01",X"01",X"04",X"01",X"0F",X"01",X"00",X"01",X"0F",X"0F",X"0F",X"00",X"0F",X"0F",X"00", + X"00",X"0A",X"02",X"01",X"03",X"0E",X"0F",X"01",X"02",X"04",X"04",X"05",X"06",X"07",X"08",X"0F", + X"00",X"04",X"02",X"0D",X"01",X"0F",X"01",X"01",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0F", + X"00",X"04",X"04",X"0F",X"0F",X"04",X"04",X"04",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0D",X"0E",X"0F",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0F", + X"00",X"04",X"04",X"04",X"0F",X"0F",X"0F",X"00",X"04",X"0F",X"0F",X"0F",X"04",X"00",X"00",X"00", + X"00",X"0F",X"02",X"02",X"0F",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"04", + X"00",X"01",X"02",X"03",X"0C",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_sprite_grphx1.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_sprite_grphx1.vhd new file mode 100644 index 00000000..f45fdfb4 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_sprite_grphx1.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_sprite_grphx1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_sprite_grphx1 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"10",X"00",X"00",X"00",X"00", + X"E0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"E8",X"30",X"30",X"31",X"00",X"10",X"30",X"31",X"71",X"F2",X"F2",X"EE", + X"88",X"00",X"88",X"FC",X"F8",X"F7",X"F7",X"F0",X"00",X"00",X"00",X"80",X"E0",X"F0",X"C0",X"80", + X"31",X"30",X"30",X"E8",X"88",X"00",X"00",X"00",X"EE",X"F2",X"F2",X"71",X"31",X"30",X"10",X"00", + X"F3",X"F7",X"F7",X"FB",X"FC",X"88",X"00",X"88",X"80",X"C8",X"F8",X"E0",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"77",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"20",X"32",X"33",X"00",X"00",X"10",X"77",X"FF",X"F7",X"FF",X"FF", + X"00",X"00",X"80",X"CC",X"EE",X"FE",X"FE",X"FF",X"00",X"00",X"00",X"00",X"51",X"79",X"68",X"E0", + X"33",X"11",X"11",X"20",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00", + X"FF",X"FE",X"EE",X"CC",X"88",X"00",X"00",X"00",X"F1",X"F1",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"20",X"10",X"33",X"33",X"00",X"00",X"00",X"77",X"F7",X"FF",X"BF",X"FE", + X"00",X"00",X"02",X"89",X"CC",X"DC",X"FE",X"F6",X"00",X"00",X"00",X"22",X"F3",X"F3",X"E2",X"E0", + X"33",X"33",X"31",X"00",X"00",X"00",X"00",X"00",X"FE",X"BF",X"FF",X"FF",X"77",X"00",X"00",X"00", + X"F6",X"FE",X"DC",X"CC",X"89",X"02",X"00",X"00",X"E0",X"E2",X"F3",X"F3",X"22",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"66",X"00",X"00",X"FF",X"FF",X"FE",X"FD",X"FC",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E2",X"F3",X"33",X"33",X"11",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"EE",X"FF",X"FF",X"30",X"30", + X"00",X"10",X"FC",X"EC",X"10",X"70",X"F0",X"30",X"33",X"C0",X"F1",X"33",X"F1",X"F4",X"FE",X"FE", + X"91",X"40",X"B8",X"DC",X"FC",X"FC",X"F6",X"F7",X"88",X"80",X"00",X"80",X"C0",X"80",X"C0",X"80", + X"10",X"10",X"31",X"F1",X"70",X"10",X"00",X"00",X"F4",X"FC",X"FE",X"FE",X"FC",X"F1",X"33",X"11", + X"77",X"77",X"F7",X"E6",X"CC",X"CC",X"CC",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"B0",X"10",X"33",X"77",X"33",X"10",X"30",X"70",X"00",X"80",X"C0",X"C8",X"EC",X"EE",X"E2",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"BB",X"76",X"00",X"00",X"00",X"60",X"66",X"EE",X"F1",X"F1", + X"30",X"10",X"33",X"77",X"33",X"10",X"B0",X"C0",X"E2",X"EE",X"EC",X"C8",X"C0",X"80",X"00",X"00", + X"70",X"70",X"FC",X"FF",X"F3",X"F1",X"F1",X"F5",X"F2",X"F0",X"F0",X"F0",X"F1",X"E8",X"AA",X"99", + X"F6",X"F6",X"D4",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F3",X"FF",X"FF",X"77",X"FF",X"EE",X"88",X"00",X"99",X"99",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"20",X"32",X"33",X"00",X"00",X"10",X"77",X"FF",X"F7",X"FF",X"FF", + X"00",X"00",X"80",X"CC",X"EE",X"FE",X"FF",X"FF",X"00",X"00",X"00",X"00",X"C0",X"F1",X"F1",X"68", + X"33",X"11",X"11",X"20",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00", + X"FE",X"FE",X"EE",X"CC",X"88",X"00",X"00",X"00",X"68",X"B1",X"D1",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"10",X"31",X"33",X"76",X"BC",X"60",X"E0",X"E6",X"FF",X"EE",X"E8",X"E0",X"F0", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"76",X"33",X"31",X"10",X"10",X"00",X"00",X"00",X"E0",X"E8",X"EE",X"FF",X"E6",X"E0",X"60",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"FC",X"CC",X"10",X"70",X"F1",X"31",X"10",X"00",X"F0",X"73",X"F3",X"FD",X"FE",X"FE",X"FC", + X"00",X"00",X"80",X"C8",X"EC",X"F4",X"F6",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C8", + X"10",X"30",X"F0",X"70",X"10",X"00",X"00",X"00",X"F4",X"FE",X"FE",X"F5",X"F3",X"33",X"00",X"11", + X"77",X"F6",X"F4",X"FC",X"98",X"30",X"40",X"99",X"88",X"C0",X"C0",X"C0",X"80",X"00",X"80",X"88", + X"74",X"F8",X"F0",X"F1",X"B3",X"32",X"E1",X"71",X"C0",X"F1",X"F1",X"E8",X"BF",X"7E",X"FE",X"F7", + X"00",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"F2",X"00",X"00",X"00",X"00",X"00",X"50",X"F8",X"EC", + X"76",X"DD",X"DD",X"11",X"11",X"11",X"00",X"00",X"F8",X"F8",X"F2",X"F1",X"F4",X"F2",X"FC",X"33", + X"FD",X"F7",X"F3",X"F3",X"F3",X"F7",X"FF",X"EE",X"CC",X"CC",X"CC",X"CC",X"CC",X"E8",X"C0",X"00", + X"99",X"FF",X"77",X"FF",X"FF",X"FF",X"FF",X"67",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"33",X"FF",X"FF",X"FB",X"FD",X"F9",X"00",X"00",X"88",X"CC",X"CC",X"EF",X"EF",X"EF", + X"77",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"70",X"00",X"00",X"00",X"00", + X"F3",X"B3",X"80",X"00",X"11",X"11",X"33",X"33",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"88",X"00", + X"00",X"76",X"74",X"70",X"71",X"71",X"70",X"74",X"00",X"D0",X"90",X"E6",X"DF",X"BE",X"7F",X"FF", + X"00",X"00",X"88",X"88",X"F7",X"FC",X"F0",X"F2",X"00",X"00",X"00",X"00",X"CC",X"E2",X"EA",X"F5", + X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"FE",X"FE",X"FF",X"76",X"33",X"71",X"30", + X"F1",X"F8",X"FC",X"F7",X"FF",X"FF",X"FF",X"00",X"F1",X"F3",X"F7",X"FF",X"EE",X"EC",X"E8",X"40", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"B0",X"10",X"33",X"77",X"33",X"10",X"30",X"70",X"00",X"80",X"C0",X"C8",X"EC",X"EE",X"E2",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"10",X"33",X"77",X"33",X"10",X"30",X"00",X"E2",X"EE",X"EC",X"C8",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"30",X"70",X"70",X"70", + X"00",X"88",X"CC",X"88",X"C0",X"E0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"70",X"70",X"30",X"11",X"33",X"11", + X"C0",X"E0",X"E0",X"E0",X"C0",X"88",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"10",X"31",X"33",X"76",X"BC",X"60",X"E0",X"E6",X"EE",X"EE",X"E8",X"E0",X"E0", + X"F0",X"00",X"60",X"51",X"33",X"77",X"77",X"77",X"F0",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FD", + X"76",X"33",X"31",X"10",X"10",X"00",X"00",X"00",X"E0",X"E8",X"EE",X"EE",X"E6",X"E0",X"60",X"00", + X"77",X"77",X"77",X"33",X"33",X"00",X"00",X"00",X"FD",X"32",X"77",X"FF",X"FF",X"FE",X"30",X"00", + X"F0",X"00",X"CC",X"EE",X"FF",X"FF",X"FF",X"FF",X"F0",X"88",X"CC",X"FC",X"74",X"7C",X"18",X"B0", + X"B0",X"10",X"33",X"77",X"B3",X"90",X"B0",X"F0",X"00",X"80",X"C0",X"C8",X"EC",X"EE",X"E2",X"E0", + X"FD",X"FD",X"F3",X"FE",X"EC",X"C0",X"80",X"00",X"7C",X"7C",X"F4",X"7C",X"7C",X"74",X"44",X"44", + X"B0",X"90",X"B3",X"F7",X"B3",X"10",X"30",X"00",X"E2",X"EE",X"EC",X"C8",X"C0",X"80",X"00",X"00", + X"80",X"60",X"10",X"00",X"00",X"00",X"00",X"00",X"44",X"44",X"F4",X"44",X"E4",X"40",X"00",X"00", + X"20",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00", + X"88",X"88",X"88",X"88",X"88",X"88",X"C8",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"D1",X"F5",X"73",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7", + X"00",X"00",X"88",X"DD",X"DE",X"FE",X"DE",X"FC",X"00",X"00",X"00",X"D1",X"F1",X"F1",X"E0",X"E0", + X"FF",X"77",X"77",X"33",X"11",X"00",X"00",X"00",X"FB",X"FC",X"FF",X"FF",X"FF",X"F0",X"00",X"00", + X"DA",X"F5",X"DF",X"DD",X"BB",X"11",X"00",X"00",X"E0",X"E0",X"F9",X"F9",X"D9",X"00",X"00",X"00", + X"F0",X"00",X"00",X"CC",X"EE",X"FF",X"FF",X"FE",X"F0",X"00",X"88",X"CC",X"FC",X"BC",X"BC",X"F8", + X"B0",X"10",X"33",X"77",X"33",X"90",X"B0",X"F0",X"00",X"80",X"C0",X"C8",X"EC",X"EE",X"E2",X"E0", + X"FD",X"F3",X"77",X"33",X"33",X"11",X"00",X"00",X"BC",X"BC",X"F8",X"BC",X"BC",X"34",X"74",X"44", + X"B0",X"90",X"B3",X"F7",X"B3",X"90",X"30",X"00",X"E2",X"EE",X"EC",X"C8",X"C0",X"80",X"00",X"00", + X"C0",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"B0",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"60",X"10",X"00",X"00",X"00",X"00",X"22",X"00",X"30",X"C0",X"00",X"00",X"00",X"00", + X"00",X"30",X"C0",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"22",X"00",X"00",X"00",X"00",X"10",X"AA",X"FF",X"BB", + X"77",X"10",X"32",X"F3",X"F1",X"FC",X"FE",X"FE",X"00",X"22",X"22",X"B1",X"D1",X"C0",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"55",X"70",X"10",X"00",X"22",X"00",X"00",X"10",X"74",X"F0",X"E0",X"80", + X"FC",X"FE",X"F6",X"F6",X"F6",X"70",X"10",X"10",X"E0",X"F0",X"F0",X"E0",X"C8",X"C8",X"80",X"00", + X"00",X"33",X"10",X"10",X"11",X"22",X"11",X"33",X"70",X"F0",X"F0",X"F0",X"A5",X"FF",X"F8",X"F4", + X"E2",X"31",X"30",X"F0",X"B5",X"EE",X"FF",X"F7",X"00",X"88",X"00",X"00",X"00",X"88",X"00",X"88", + X"77",X"77",X"77",X"77",X"22",X"33",X"31",X"30",X"F1",X"F8",X"FC",X"FF",X"FF",X"FF",X"DD",X"77", + X"F3",X"F2",X"F5",X"FB",X"FB",X"FF",X"FF",X"DC",X"CC",X"C4",X"CC",X"CC",X"CC",X"88",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"2B",X"37",X"00",X"00",X"00",X"30",X"60",X"58",X"38",X"0C",X"FE", + X"00",X"00",X"00",X"E0",X"90",X"70",X"E1",X"E1",X"00",X"00",X"00",X"00",X"00",X"80",X"0C",X"8C", + X"11",X"23",X"22",X"00",X"00",X"00",X"00",X"00",X"0C",X"38",X"58",X"70",X"30",X"00",X"00",X"00", + X"F0",X"70",X"90",X"E0",X"80",X"00",X"00",X"00",X"0C",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"70",X"F0",X"30",X"10",X"00",X"11",X"33",X"F1",X"F0",X"FE",X"FE",X"F0", + X"33",X"A8",X"C8",X"C8",X"E4",X"F4",X"F7",X"77",X"00",X"00",X"11",X"31",X"51",X"C0",X"C0",X"C0", + X"10",X"31",X"F1",X"70",X"10",X"00",X"00",X"00",X"FC",X"FE",X"FE",X"FC",X"F1",X"33",X"11",X"00", + X"77",X"F7",X"F4",X"E4",X"C8",X"C8",X"A8",X"33",X"C0",X"C0",X"C0",X"51",X"31",X"11",X"00",X"00", + X"00",X"00",X"71",X"D9",X"77",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"88",X"CC",X"DE",X"FC",X"DF",X"FD",X"00",X"00",X"00",X"C0",X"20",X"A8",X"F9",X"F9", + X"FF",X"77",X"77",X"33",X"11",X"00",X"00",X"00",X"F7",X"FB",X"FC",X"FF",X"FF",X"F0",X"00",X"00", + X"DF",X"F8",X"D6",X"D8",X"80",X"00",X"00",X"00",X"F1",X"F1",X"E0",X"E0",X"40",X"00",X"00",X"00", + X"0F",X"00",X"00",X"00",X"00",X"10",X"F0",X"50",X"0E",X"01",X"00",X"00",X"11",X"F3",X"F1",X"FE", + X"00",X"0E",X"45",X"40",X"40",X"C8",X"E8",X"F4",X"00",X"00",X"0C",X"03",X"22",X"E2",X"A2",X"80", + X"30",X"10",X"10",X"30",X"50",X"F0",X"10",X"00",X"FE",X"F0",X"F0",X"FE",X"FE",X"F1",X"F3",X"11", + X"F0",X"90",X"90",X"F0",X"F4",X"E8",X"C8",X"71",X"80",X"88",X"88",X"80",X"80",X"A2",X"E2",X"22", + X"00",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0E",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"03",X"11",X"66", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"77",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD", + X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"EE",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22", + X"00",X"22",X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"99",X"BB",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"22",X"00",X"00",X"00",X"00", + X"00",X"00",X"44",X"88",X"00",X"00",X"00",X"00",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"DD", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"22",X"11",X"00",X"00",X"00",X"00",X"00", + X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"10",X"31",X"33",X"76",X"BC",X"60",X"E0",X"E6",X"EE",X"EE",X"E8",X"E0",X"E0", + X"F0",X"00",X"30",X"20",X"11",X"33",X"33",X"77",X"F0",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FD", + X"76",X"33",X"31",X"10",X"10",X"00",X"00",X"00",X"E0",X"E8",X"EE",X"EE",X"E6",X"E0",X"60",X"00", + X"77",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"FD",X"FE",X"33",X"BB",X"FF",X"FF",X"FC",X"60", + X"31",X"20",X"71",X"E0",X"71",X"70",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"11",X"80",X"F3", + X"00",X"CC",X"66",X"EE",X"44",X"CC",X"CC",X"EE",X"00",X"00",X"00",X"00",X"CC",X"66",X"40",X"40", + X"31",X"30",X"F0",X"73",X"30",X"00",X"00",X"00",X"FF",X"FC",X"F0",X"F0",X"F0",X"F0",X"30",X"00", + X"FF",X"FF",X"F7",X"F0",X"F0",X"A0",X"20",X"22",X"C8",X"C8",X"C0",X"C0",X"A0",X"20",X"31",X"33", + X"10",X"10",X"30",X"70",X"70",X"30",X"30",X"10",X"88",X"11",X"88",X"11",X"88",X"33",X"91",X"F3", + X"00",X"88",X"CC",X"CC",X"88",X"88",X"88",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"31",X"31",X"30",X"71",X"F0",X"00",X"00",X"00",X"FF",X"FE",X"F0",X"F0",X"F0",X"F0",X"30",X"00", + X"FF",X"CC",X"F0",X"C0",X"F0",X"80",X"00",X"00",X"99",X"55",X"F9",X"51",X"80",X"00",X"00",X"00", + X"00",X"00",X"10",X"30",X"30",X"30",X"10",X"10",X"C4",X"91",X"C4",X"90",X"D5",X"91",X"D1",X"F3", + X"00",X"88",X"CC",X"CC",X"88",X"AA",X"A8",X"EC",X"00",X"00",X"00",X"00",X"CC",X"66",X"40",X"40", + X"30",X"31",X"F0",X"73",X"30",X"00",X"00",X"00",X"FD",X"FE",X"F0",X"F0",X"F0",X"F0",X"30",X"00", + X"FD",X"FD",X"F0",X"F0",X"F0",X"80",X"00",X"00",X"88",X"CC",X"CC",X"E0",X"A0",X"20",X"31",X"33", + X"00",X"0F",X"00",X"00",X"00",X"10",X"70",X"F2",X"00",X"0E",X"01",X"00",X"11",X"F3",X"F1",X"FE", + X"00",X"00",X"0E",X"81",X"C0",X"E8",X"FC",X"F4",X"00",X"00",X"00",X"0C",X"03",X"71",X"51",X"C0", + X"30",X"10",X"10",X"30",X"F2",X"70",X"10",X"00",X"FE",X"F0",X"F0",X"FE",X"FE",X"F1",X"F3",X"11", + X"F0",X"90",X"90",X"F0",X"F4",X"EC",X"B8",X"00",X"C0",X"C4",X"C4",X"C0",X"C0",X"51",X"F9",X"11", + X"31",X"20",X"71",X"E0",X"71",X"70",X"30",X"10",X"00",X"0F",X"00",X"00",X"00",X"11",X"80",X"F3", + X"00",X"CC",X"67",X"EE",X"44",X"CC",X"CC",X"EE",X"00",X"00",X"08",X"07",X"CC",X"66",X"40",X"40", + X"31",X"30",X"F0",X"73",X"30",X"00",X"00",X"00",X"FD",X"FC",X"F0",X"F0",X"F0",X"F0",X"30",X"00", + X"FF",X"FF",X"F7",X"F0",X"F0",X"A0",X"20",X"22",X"C8",X"C8",X"C0",X"C0",X"A0",X"20",X"31",X"33", + X"18",X"10",X"30",X"70",X"70",X"30",X"30",X"10",X"88",X"15",X"8B",X"11",X"88",X"33",X"91",X"F3", + X"00",X"88",X"CC",X"CC",X"9E",X"A8",X"A8",X"EC",X"00",X"00",X"00",X"00",X"00",X"0C",X"03",X"00", + X"31",X"31",X"30",X"71",X"F0",X"00",X"00",X"00",X"FF",X"FE",X"FC",X"E0",X"D0",X"E2",X"30",X"00", + X"FF",X"FC",X"70",X"F0",X"70",X"80",X"00",X"00",X"99",X"D5",X"F1",X"D1",X"80",X"00",X"00",X"00", + X"00",X"00",X"11",X"33",X"72",X"F2",X"74",X"FC",X"00",X"00",X"CC",X"FF",X"F1",X"FC",X"FC",X"F0", + X"00",X"00",X"00",X"00",X"00",X"DC",X"F2",X"90",X"00",X"00",X"00",X"D1",X"31",X"D1",X"C0",X"C0", + X"FC",X"74",X"F2",X"72",X"33",X"11",X"00",X"00",X"F0",X"FC",X"FC",X"F1",X"FF",X"CC",X"00",X"00", + X"90",X"F2",X"DC",X"00",X"00",X"00",X"00",X"00",X"C0",X"D1",X"71",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"11",X"00",X"30",X"73",X"F0",X"31",X"31",X"F0",X"20",X"F0",X"F0",X"F0",X"F0",X"FE",X"FF", + X"80",X"C0",X"40",X"F0",X"F0",X"F0",X"F8",X"FC",X"00",X"22",X"E2",X"A2",X"80",X"80",X"11",X"B3", + X"10",X"10",X"30",X"30",X"30",X"10",X"10",X"00",X"C0",X"91",X"C4",X"00",X"88",X"00",X"88",X"00", + X"FC",X"FE",X"66",X"FF",X"33",X"66",X"00",X"00",X"EE",X"80",X"D1",X"31",X"11",X"00",X"00",X"00", + X"73",X"F0",X"30",X"10",X"00",X"00",X"00",X"00",X"F0",X"F0",X"FF",X"FF",X"F1",X"E0",X"F1",X"E0", + X"F0",X"F0",X"E6",X"EE",X"CC",X"CC",X"CC",X"66",X"D1",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"E2",X"51",X"62",X"00",X"00",X"00",X"00", + X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"40",X"20",X"30",X"90",X"40",X"30",X"03",X"00",X"40",X"20",X"20",X"2C",X"4B",X"7A",X"78", + X"40",X"90",X"E0",X"80",X"B0",X"E0",X"8F",X"C2",X"00",X"C0",X"40",X"80",X"20",X"40",X"80",X"00", + X"80",X"50",X"21",X"40",X"10",X"20",X"40",X"80",X"3F",X"1A",X"38",X"0B",X"10",X"20",X"40",X"00", + X"CB",X"E4",X"61",X"50",X"40",X"20",X"10",X"80",X"C0",X"20",X"90",X"08",X"C0",X"60",X"00",X"00", + X"00",X"60",X"F0",X"70",X"40",X"40",X"00",X"00",X"00",X"00",X"80",X"E0",X"80",X"20",X"A0",X"43", + X"00",X"10",X"30",X"40",X"00",X"40",X"80",X"08",X"00",X"00",X"00",X"80",X"40",X"E0",X"00",X"00", + X"00",X"00",X"40",X"D0",X"F0",X"70",X"10",X"00",X"43",X"A1",X"20",X"00",X"20",X"E0",X"E0",X"00", + X"48",X"20",X"00",X"20",X"30",X"00",X"00",X"00",X"00",X"20",X"60",X"E0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"20",X"70",X"F0",X"60",X"20",X"00",X"00", + X"00",X"00",X"80",X"00",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"20",X"00",X"00", + X"00",X"30",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"D0",X"F0",X"60",X"00", + X"00",X"00",X"00",X"90",X"80",X"00",X"00",X"00",X"00",X"60",X"20",X"E0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"60",X"60",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"E0",X"70",X"00",X"00",X"00", + X"10",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"0F",X"07",X"03",X"70",X"F0", + X"99",X"FF",X"77",X"FF",X"FF",X"FF",X"FF",X"67",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"33",X"FF",X"FF",X"FB",X"F8",X"FC",X"00",X"00",X"88",X"EF",X"EF",X"88",X"CC",X"EF", + X"77",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"70",X"00",X"00",X"00",X"00", + X"F4",X"B8",X"10",X"10",X"11",X"11",X"33",X"33",X"EF",X"01",X"CC",X"EE",X"EE",X"CC",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"40",X"40",X"30",X"00",X"77",X"04", + X"00",X"E0",X"10",X"10",X"E0",X"00",X"8E",X"89",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"47",X"00",X"00",X"34",X"20",X"00",X"00", + X"89",X"7F",X"00",X"01",X"69",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"C3",X"E1",X"30",X"10",X"00",X"00",X"00",X"F0",X"F0",X"C3",X"5A",X"F0",X"F0",X"30",X"00", + X"00",X"00",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08", + X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"07",X"00",X"00",X"6F",X"44",X"02",X"11", + X"02",X"0C",X"00",X"08",X"CE",X"88",X"08",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88",X"77",X"00",X"77",X"88",X"77",X"00", + X"CC",X"22",X"CC",X"00",X"CC",X"22",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"99",X"77",X"00",X"00",X"FF",X"44",X"00", + X"CC",X"22",X"CC",X"00",X"22",X"EE",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"77",X"33",X"00",X"00",X"00",X"00", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"33",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"BB",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0C",X"78",X"34", + X"00",X"00",X"00",X"0B",X"08",X"20",X"F0",X"F0",X"00",X"00",X"00",X"08",X"0C",X"06",X"02",X"83", + X"00",X"00",X"08",X"08",X"0C",X"0E",X"87",X"E1",X"30",X"30",X"30",X"10",X"00",X"00",X"08",X"68", + X"F0",X"F0",X"F0",X"F0",X"70",X"10",X"00",X"00",X"81",X"E1",X"F0",X"F0",X"E0",X"E0",X"E0",X"60"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_sprite_grphx2.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_sprite_grphx2.vhd new file mode 100644 index 00000000..51fd267b --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/proms/pooyan_sprite_grphx2.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_sprite_grphx2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_sprite_grphx2 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"12",X"34",X"69", + X"00",X"00",X"00",X"00",X"0C",X"C2",X"C2",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"4B",X"4B",X"0F",X"07",X"03",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0E",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"00",X"80",X"91",X"00",X"00",X"00",X"11",X"11",X"22",X"20",X"F0", + X"88",X"00",X"88",X"CC",X"88",X"77",X"74",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"51",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"F0",X"20",X"22",X"11",X"11",X"00",X"00",X"00", + X"33",X"77",X"77",X"BB",X"CC",X"88",X"00",X"88",X"00",X"80",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"00",X"00",X"00",X"70",X"F2",X"F7",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"C0",X"E8",X"EC",X"F4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"70",X"30",X"10",X"10", + X"F0",X"F4",X"F0",X"E0",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"22",X"33",X"00",X"00",X"10",X"77",X"FD",X"77",X"FF",X"FF", + X"00",X"00",X"80",X"CC",X"EE",X"FE",X"FE",X"FF",X"00",X"00",X"00",X"00",X"D1",X"F1",X"E0",X"E0", + X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00", + X"FF",X"FE",X"EE",X"CC",X"88",X"00",X"00",X"00",X"F1",X"F1",X"C0",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"00",X"33",X"33",X"00",X"00",X"00",X"77",X"77",X"FF",X"BF",X"FE", + X"00",X"40",X"20",X"98",X"CC",X"DC",X"FE",X"F6",X"00",X"00",X"00",X"22",X"F3",X"F3",X"E2",X"E0", + X"33",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"FE",X"BF",X"FF",X"FF",X"77",X"00",X"00",X"00", + X"F6",X"FE",X"DC",X"CC",X"98",X"20",X"40",X"00",X"E0",X"E2",X"F3",X"F3",X"22",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"76",X"00",X"00",X"FF",X"FF",X"FE",X"FC",X"F4",X"F6", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"32",X"33",X"33",X"33",X"11",X"00",X"00",X"00",X"F7",X"FF",X"FE",X"FE",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"33",X"00",X"11",X"33",X"11",X"44",X"EE",X"EA", + X"11",X"00",X"88",X"CC",X"CC",X"C8",X"64",X"70",X"88",X"00",X"00",X"00",X"00",X"60",X"30",X"10", + X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"44",X"C8",X"EE",X"EE",X"CC",X"11",X"33",X"11", + X"F0",X"F0",X"70",X"64",X"C8",X"CC",X"CC",X"88",X"A8",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"C0",X"BB",X"66",X"00",X"00",X"00",X"00",X"66",X"EE",X"11",X"11", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"CC",X"FF",X"F3",X"F1",X"F1",X"F1",X"22",X"00",X"00",X"00",X"11",X"88",X"AA",X"99", + X"66",X"66",X"44",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F3",X"FF",X"F5",X"F7",X"FF",X"EE",X"88",X"00",X"99",X"B9",X"98",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"22",X"33",X"00",X"00",X"10",X"77",X"FF",X"75",X"FF",X"FF", + X"00",X"00",X"80",X"CC",X"EE",X"FE",X"FF",X"FF",X"00",X"00",X"00",X"40",X"C0",X"F1",X"F1",X"E0", + X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00", + X"FE",X"FE",X"EE",X"CC",X"88",X"00",X"00",X"00",X"E0",X"F1",X"D1",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"8C",X"10",X"10",X"10",X"00",X"10",X"10",X"10",X"00", + X"00",X"80",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"10",X"10",X"10",X"00", + X"00",X"80",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"CC",X"CC",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"33",X"33",X"D9",X"EE",X"EE",X"CC", + X"00",X"00",X"00",X"88",X"CC",X"44",X"62",X"F0",X"00",X"00",X"00",X"00",X"00",X"20",X"10",X"B8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"EE",X"EE",X"51",X"33",X"33",X"00",X"11", + X"F0",X"62",X"44",X"CC",X"88",X"00",X"00",X"99",X"E8",X"00",X"00",X"00",X"00",X"00",X"00",X"88", + X"C4",X"88",X"00",X"11",X"73",X"E2",X"00",X"11",X"10",X"11",X"11",X"88",X"BB",X"76",X"FE",X"77", + X"00",X"80",X"00",X"00",X"EE",X"FF",X"FF",X"F2",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC", + X"66",X"DD",X"DD",X"D1",X"51",X"11",X"00",X"00",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0",X"FC",X"33", + X"FD",X"F7",X"F3",X"F2",X"F3",X"F7",X"FB",X"EE",X"CC",X"CC",X"CC",X"CC",X"CC",X"88",X"00",X"00", + X"19",X"3F",X"37",X"FF",X"FF",X"FF",X"FF",X"66",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"30",X"F8",X"F8",X"BC",X"DA",X"9E",X"00",X"00",X"80",X"C0",X"C0",X"E3",X"E3",X"E3", + X"77",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"70",X"00",X"00",X"00",X"00", + X"3C",X"B0",X"80",X"00",X"11",X"11",X"23",X"23",X"C0",X"80",X"AC",X"8E",X"0E",X"0C",X"08",X"00", + X"40",X"E6",X"C4",X"00",X"11",X"11",X"00",X"C4",X"00",X"20",X"60",X"66",X"DD",X"AA",X"77",X"FF", + X"00",X"C0",X"C8",X"88",X"77",X"FC",X"F0",X"F0",X"00",X"00",X"00",X"00",X"CC",X"E2",X"E2",X"F1", + X"C4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"FE",X"FE",X"FF",X"76",X"33",X"11",X"00", + X"F0",X"F8",X"FC",X"F7",X"FE",X"FF",X"FF",X"00",X"F1",X"F3",X"F5",X"FF",X"EE",X"CC",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"00",X"00",X"00",X"00", + X"00",X"88",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"8C",X"10",X"10",X"10",X"00",X"10",X"10",X"10",X"00", + X"00",X"80",X"00",X"11",X"33",X"F7",X"77",X"77",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FD", + X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"10",X"10",X"10",X"00", + X"77",X"F7",X"77",X"33",X"33",X"80",X"00",X"00",X"FD",X"F2",X"F3",X"FF",X"FF",X"FE",X"30",X"00", + X"00",X"00",X"CC",X"EE",X"FF",X"FF",X"FF",X"FF",X"00",X"88",X"CC",X"CC",X"44",X"44",X"60",X"40", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"FD",X"F3",X"EE",X"CC",X"C0",X"80",X"00",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"44",X"44",X"44",X"E4",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"11",X"11",X"00",X"00", + X"00",X"00",X"00",X"22",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00", + X"88",X"88",X"88",X"88",X"88",X"88",X"C8",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"55",X"33",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7", + X"00",X"00",X"98",X"DD",X"CC",X"EE",X"CC",X"CC",X"00",X"00",X"80",X"11",X"11",X"11",X"00",X"00", + X"FF",X"77",X"76",X"33",X"11",X"00",X"00",X"00",X"FB",X"FC",X"FF",X"FF",X"FF",X"F0",X"00",X"00", + X"C8",X"D5",X"DD",X"DD",X"BB",X"71",X"20",X"00",X"00",X"00",X"99",X"99",X"99",X"00",X"00",X"00", + X"00",X"10",X"30",X"CC",X"EE",X"FF",X"FF",X"FE",X"00",X"00",X"88",X"CC",X"CC",X"88",X"88",X"88", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"F3",X"77",X"33",X"33",X"11",X"00",X"00",X"88",X"88",X"88",X"88",X"88",X"00",X"44",X"44", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"22",X"00",X"00",X"00",X"00",X"00",X"AA",X"FF",X"BB", + X"77",X"00",X"22",X"33",X"11",X"CC",X"EE",X"EE",X"00",X"22",X"22",X"11",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"55",X"00",X"60",X"70",X"22",X"00",X"00",X"00",X"44",X"00",X"00",X"00", + X"CC",X"EE",X"64",X"64",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00", + X"60",X"73",X"00",X"00",X"51",X"E2",X"11",X"33",X"00",X"00",X"00",X"00",X"00",X"FF",X"F8",X"F0", + X"22",X"DD",X"CC",X"00",X"11",X"EE",X"FF",X"F7",X"00",X"C8",X"40",X"00",X"00",X"E8",X"40",X"88", + X"77",X"77",X"77",X"76",X"32",X"33",X"11",X"00",X"F0",X"F8",X"FC",X"FF",X"FF",X"FD",X"FD",X"77", + X"F3",X"F2",X"F5",X"FB",X"FB",X"FF",X"FF",X"CC",X"CC",X"C4",X"CC",X"CC",X"CC",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20", + X"00",X"11",X"22",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"98",X"44",X"00",X"00",X"00",X"00",X"05",X"A0",X"84",X"E1",X"00", + X"00",X"00",X"C4",X"00",X"24",X"81",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0C", + X"10",X"30",X"20",X"00",X"00",X"00",X"00",X"00",X"E1",X"84",X"A1",X"36",X"00",X"00",X"00",X"00", + X"04",X"81",X"24",X"00",X"44",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"00",X"EE",X"E8",X"00", + X"33",X"88",X"88",X"88",X"44",X"40",X"71",X"F1",X"00",X"00",X"11",X"11",X"11",X"00",X"10",X"10", + X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"CC",X"EC",X"EE",X"CC",X"11",X"33",X"11",X"00", + X"F1",X"71",X"40",X"44",X"88",X"88",X"88",X"33",X"20",X"00",X"00",X"11",X"11",X"11",X"00",X"00", + X"00",X"00",X"11",X"B9",X"77",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"88",X"CC",X"CC",X"CC",X"DD",X"DD",X"00",X"00",X"00",X"00",X"C0",X"C8",X"99",X"99", + X"FF",X"77",X"77",X"32",X"11",X"00",X"00",X"00",X"F7",X"FB",X"FC",X"FF",X"FF",X"F0",X"00",X"00", + X"DD",X"C8",X"C4",X"88",X"10",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"E2", + X"00",X"00",X"44",X"00",X"00",X"88",X"88",X"44",X"00",X"00",X"00",X"00",X"22",X"22",X"22",X"00", + X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"EE",X"00",X"00",X"E2",X"EE",X"11",X"33",X"11", + X"00",X"60",X"60",X"00",X"44",X"88",X"88",X"11",X"00",X"E8",X"B8",X"10",X"20",X"22",X"22",X"22", + X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"E0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"80",X"D1",X"E6", + X"70",X"70",X"70",X"70",X"30",X"30",X"10",X"00",X"F0",X"F0",X"F0",X"F0",X"FA",X"F7",X"F0",X"70", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"80",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"30",X"70",X"70",X"F0",X"F0",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"C0",X"E0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"DD", + X"F0",X"F0",X"F1",X"71",X"30",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"FC",X"FE",X"F0",X"00",X"00", + X"F0",X"F0",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"A2",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"30",X"70",X"F0",X"F0",X"F0",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"80",X"C0",X"E0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A2", + X"F0",X"F2",X"73",X"71",X"31",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F9",X"FB",X"F0",X"00",X"00", + X"F0",X"F0",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"DD",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30",X"00",X"00",X"30",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"80",X"E0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"DD", + X"30",X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"F0",X"F8",X"FC",X"F2",X"70",X"00",X"00",X"00", + X"F0",X"F0",X"F4",X"E8",X"C0",X"00",X"00",X"00",X"A2",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"E0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"80",X"A2",X"DD", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F2",X"72",X"71",X"10",X"00",X"00",X"00",X"00", + X"F0",X"F4",X"F0",X"C0",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"8C",X"10",X"10",X"10",X"00",X"10",X"10",X"10",X"00", + X"00",X"80",X"00",X"00",X"11",X"B3",X"33",X"77",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FD", + X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"10",X"10",X"10",X"00", + X"77",X"F7",X"77",X"77",X"33",X"B3",X"11",X"00",X"FD",X"FE",X"F3",X"F3",X"FF",X"FF",X"FC",X"60", + X"D1",X"C0",X"91",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"33", + X"00",X"CC",X"66",X"EE",X"44",X"CC",X"CC",X"EE",X"00",X"00",X"00",X"00",X"CC",X"66",X"00",X"00", + X"11",X"00",X"00",X"33",X"00",X"00",X"00",X"00",X"F3",X"CC",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"77",X"00",X"00",X"00",X"00",X"22",X"88",X"88",X"00",X"00",X"00",X"80",X"D1",X"B3", + X"60",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"88",X"11",X"88",X"11",X"88",X"33",X"11",X"33", + X"00",X"88",X"CC",X"CC",X"88",X"88",X"88",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"00",X"11",X"00",X"00",X"00",X"00",X"F3",X"EE",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"CC",X"00",X"00",X"00",X"00",X"10",X"10",X"99",X"55",X"99",X"11",X"00",X"80",X"80",X"00", + X"30",X"30",X"20",X"00",X"00",X"00",X"00",X"00",X"44",X"11",X"44",X"00",X"55",X"11",X"11",X"33", + X"00",X"88",X"CC",X"CC",X"88",X"AA",X"88",X"CC",X"00",X"00",X"00",X"00",X"CC",X"66",X"00",X"00", + X"00",X"11",X"00",X"33",X"00",X"00",X"00",X"00",X"DD",X"E2",X"00",X"00",X"00",X"00",X"00",X"00", + X"DD",X"DD",X"00",X"00",X"00",X"00",X"10",X"30",X"88",X"CC",X"CC",X"00",X"00",X"80",X"91",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"EE", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"44",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00", + X"00",X"00",X"00",X"00",X"22",X"00",X"00",X"00",X"E8",X"00",X"00",X"E8",X"EE",X"11",X"33",X"11", + X"00",X"60",X"60",X"00",X"44",X"CC",X"88",X"00",X"10",X"54",X"64",X"00",X"00",X"11",X"99",X"11", + X"D1",X"C0",X"91",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"33", + X"00",X"CC",X"66",X"EE",X"44",X"CC",X"CC",X"EE",X"00",X"00",X"00",X"00",X"CC",X"66",X"00",X"00", + X"11",X"00",X"00",X"33",X"00",X"00",X"00",X"00",X"D1",X"CC",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"77",X"00",X"00",X"00",X"00",X"22",X"88",X"88",X"00",X"00",X"00",X"80",X"D1",X"B3", + X"60",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"88",X"11",X"88",X"11",X"88",X"33",X"11",X"33", + X"00",X"88",X"CC",X"CC",X"88",X"88",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"00",X"11",X"00",X"00",X"00",X"00",X"F3",X"EE",X"CC",X"00",X"00",X"22",X"00",X"00", + X"FF",X"CC",X"00",X"00",X"00",X"00",X"10",X"10",X"99",X"55",X"11",X"11",X"00",X"80",X"80",X"00", + X"00",X"00",X"01",X"03",X"02",X"02",X"04",X"0C",X"00",X"00",X"0C",X"0F",X"01",X"CC",X"C8",X"00", + X"00",X"00",X"00",X"00",X"30",X"0C",X"02",X"60",X"00",X"00",X"00",X"D1",X"11",X"11",X"00",X"00", + X"0C",X"04",X"02",X"02",X"03",X"01",X"00",X"00",X"00",X"C8",X"CC",X"01",X"0F",X"0C",X"00",X"00", + X"60",X"02",X"0C",X"60",X"30",X"00",X"00",X"00",X"40",X"51",X"91",X"91",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"F0",X"F0",X"F0",X"70",X"30",X"10", + X"00",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"11",X"00",X"00",X"33",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"F3", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"22",X"22",X"22",X"00",X"00",X"11",X"33", + X"00",X"00",X"00",X"00",X"40",X"60",X"60",X"00",X"00",X"11",X"44",X"00",X"88",X"00",X"88",X"00", + X"CC",X"EE",X"66",X"FF",X"33",X"66",X"00",X"00",X"EE",X"00",X"11",X"11",X"11",X"00",X"00",X"00", + X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"F9",X"11",X"00",X"11",X"00", + X"00",X"00",X"66",X"EE",X"CC",X"CC",X"CC",X"66",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"11",X"22",X"91",X"A2",X"00",X"00",X"00",X"00", + X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"07",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"07", + X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"04",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"0A",X"04", + X"00",X"00",X"00",X"00",X"00",X"04",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"02",X"00",X"00",X"00",X"00",X"00", + X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"16",X"78",X"F0",X"F0",X"78",X"3C",X"0F",X"0F", + X"19",X"3F",X"37",X"FF",X"FF",X"FF",X"FF",X"66",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"30",X"F8",X"F8",X"BC",X"8F",X"CF",X"00",X"00",X"80",X"E3",X"E3",X"C4",X"C0",X"E3", + X"77",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"70",X"00",X"00",X"00",X"00", + X"47",X"8B",X"10",X"10",X"11",X"11",X"23",X"23",X"E3",X"01",X"AC",X"8E",X"0E",X"0C",X"08",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"44",X"44",X"33",X"00",X"47",X"44", + X"00",X"EE",X"11",X"11",X"EE",X"00",X"6E",X"99",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"77",X"00",X"33",X"07",X"46",X"22",X"00", + X"99",X"9F",X"00",X"01",X"0F",X"45",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"3C",X"1E",X"0F",X"0F",X"07",X"03",X"00",X"0F",X"0F",X"3C",X"A5",X"0F",X"0F",X"0F",X"07", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"08",X"0C",X"0C",X"0C",X"0C",X"08",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88",X"88",X"77",X"00",X"77",X"88", + X"00",X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"77",X"00",X"66",X"FF",X"DD",X"66",X"11", + X"22",X"CC",X"00",X"CC",X"EE",X"AA",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88",X"77",X"00",X"77",X"88",X"77",X"00", + X"CC",X"22",X"CC",X"00",X"CC",X"22",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"99",X"77",X"00",X"00",X"FF",X"44",X"00", + X"CC",X"22",X"CC",X"00",X"22",X"EE",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"30",X"30",X"70",X"70",X"70",X"71",X"70",X"F0",X"F7",X"F3",X"F0",X"F0",X"F0",X"F0", + X"00",X"80",X"E8",X"FC",X"FE",X"F6",X"F6",X"F0",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80", + X"71",X"70",X"30",X"10",X"00",X"00",X"00",X"00",X"F8",X"FC",X"F0",X"F0",X"70",X"30",X"10",X"10", + X"F2",X"F0",X"E0",X"E0",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"00",X"00",X"00",X"00",X"C0",X"E0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30", + X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"80",X"C0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"31",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"FC",X"F0",X"00",X"00",X"00",X"00",X"00",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"70",X"70",X"F0",X"F0",X"F0", + X"00",X"00",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F6",X"73",X"70",X"10",X"00",X"00",X"00",X"00", + X"F0",X"FB",X"F8",X"E0",X"00",X"00",X"00",X"00",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"16",X"16",X"12",X"07",X"00",X"00",X"0B",X"F0",X"F0",X"C3",X"87",X"4B", + X"00",X"00",X"0B",X"B4",X"87",X"0F",X"0F",X"0F",X"00",X"00",X"08",X"84",X"C2",X"68",X"2C",X"3C", + X"0F",X"0F",X"87",X"87",X"C3",X"E1",X"78",X"1E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"87",X"87", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1E",X"1E",X"0F",X"0F",X"0E",X"0E",X"0E",X"0E"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/scandoubler.v b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/scandoubler.v new file mode 100644 index 00000000..eba1d598 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/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/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/video_mixer.sv b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/video_mixer.sv new file mode 100644 index 00000000..4968eeda --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistRGB/rtl/video_mixer.sv @@ -0,0 +1,93 @@ +// +// +// Copyright (c) 2017 Sorgelig +// +// This program is GPL Licensed. See COPYING for the full license. +// +// +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +`timescale 1ns / 1ps + +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, + + // color + input [2:0] R, + input [2:0] G, + input [2:0] B, + + // 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 +); + +wire hs = HSync; +wire vs = VSync; + + +wire [5:0] red, green, blue; +osd #(OSD_X_OFFSET, OSD_Y_OFFSET, OSD_COLOR) osd +( + .*, + + .R_in({R,R}), + .G_in({G,G}), + .B_in({B,B}), + .HSync(hs), + .VSync(vs), + + .R_out(red), + .G_out(green), + .B_out(blue) +); + + +assign VGA_R = red; +assign VGA_G = green; +assign VGA_B = blue; +assign VGA_VS = 1'b1; +assign VGA_HS = ~(HSync ^ VSync); + +endmodule diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/clean.bat b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/pooyan_mist.qpf b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/pooyan_mist.qpf new file mode 100644 index 00000000..f6253900 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/pooyan_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 = 11:17:10 October 25, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "16.1" +DATE = "11:17:10 October 25, 2017" + +# Revisions + +PROJECT_REVISION = "pooyan_mist" diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/pooyan_mist.qsf b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/pooyan_mist.qsf new file mode 100644 index 00000000..eee0e35c --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/pooyan_mist.qsf @@ -0,0 +1,164 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:18:08 November 05, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# pooyan_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 TOP_LEVEL_ENTITY pooyan_mist + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_DO_CCPP_REMOVAL ON + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" + +# Fitter Assignments +# ================== +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ENABLE_CONFIGURATION_PINS OFF +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +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 "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# SignalTap II Assignments +# ======================== +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE output_files/stp1.stp + +# 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)" + + + +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_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 + + + +set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF +set_global_assignment -name ENABLE_NCE_PIN OFF +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +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 VHDL_FILE rtl/pooyan_mist.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_sprite_grphx2.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_sprite_grphx1.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_sprite_color_lut.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_sound_prog.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_prog.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_palette.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_char_grphx2.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_char_grphx1.vhd +set_global_assignment -name VHDL_FILE rtl/proms/pooyan_char_color_lut.vhd +set_global_assignment -name VHDL_FILE rtl/YM2149_linmix_sep.vhd +set_global_assignment -name VHDL_FILE rtl/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80se.vhd +set_global_assignment -name VHDL_FILE rtl/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80.vhd +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name QIP_FILE rtl/mist_pll_12M_14M.qip +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/gen_video.vhd +set_global_assignment -name VHDL_FILE rtl/gen_ram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name VHDL_FILE rtl/pooyan_sound_board.vhd +set_global_assignment -name VHDL_FILE rtl/pooyan.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/DebugSystem.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/DebugSystem.vhd new file mode 100644 index 00000000..27f115c9 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/DebugSystem.vhd @@ -0,0 +1,197 @@ +-- Z80, Monitor ROM, 4k RAM and two 16450 UARTs +-- that can be synthesized and used with +-- the NoICE debugger that can be found at +-- http://www.noicedebugger.com/ + +library IEEE; +use IEEE.std_logic_1164.all; + +entity DebugSystem is + port( + Reset_n : in std_logic; + Clk : in std_logic; + NMI_n : in std_logic; + RXD0 : in std_logic; + CTS0 : in std_logic; + DSR0 : in std_logic; + RI0 : in std_logic; + DCD0 : in std_logic; + RXD1 : in std_logic; + CTS1 : in std_logic; + DSR1 : in std_logic; + RI1 : in std_logic; + DCD1 : in std_logic; + TXD0 : out std_logic; + RTS0 : out std_logic; + DTR0 : out std_logic; + TXD1 : out std_logic; + RTS1 : out std_logic; + DTR1 : out std_logic; +As : out std_logic_vector(15 downto 0); +Ds : out std_logic_vector(7 downto 0); +ROM_Ds : out std_logic_vector(7 downto 0) + ); +end DebugSystem; + +architecture struct of DebugSystem is + + signal M1_n : std_logic; + signal MREQ_n : std_logic; + signal IORQ_n : std_logic; + signal RD_n : std_logic; + signal WR_n : std_logic; + signal RFSH_n : std_logic; + signal HALT_n : std_logic; + signal WAIT_n : std_logic; + signal INT_n : std_logic; + signal RESET_s : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal A : std_logic_vector(15 downto 0); + signal D : std_logic_vector(7 downto 0); + signal ROM_D : std_logic_vector(7 downto 0); + signal SRAM_D : std_logic_vector(7 downto 0); + signal UART0_D : std_logic_vector(7 downto 0); + signal UART1_D : std_logic_vector(7 downto 0); + signal CPU_D : std_logic_vector(7 downto 0); + + signal Mirror : std_logic; + + signal IOWR_n : std_logic; + signal RAMCS_n : std_logic; + signal UART0CS_n : std_logic; + signal UART1CS_n : std_logic; + + signal BaudOut0 : std_logic; + signal BaudOut1 : std_logic; + +begin + As <= A; + Ds <= D; + ROM_Ds <= ROM_D; + + Wait_n <= '1'; + BusRq_n <= '1'; + INT_n <= '1'; + + process (Reset_n, Clk) + begin + if Reset_n = '0' then + Reset_s <= '0'; + Mirror <= '0'; + elsif Clk'event and Clk = '1' then + Reset_s <= '1'; + if IORQ_n = '0' and A(7 downto 4) = "1111" then + Mirror <= D(0); + end if; + end if; + end process; + + IOWR_n <= WR_n or IORQ_n; + RAMCS_n <= (not Mirror and not A(15)) or MREQ_n; + UART0CS_n <= '0' when IORQ_n = '0' and A(7 downto 3) = "00000" else '1'; + UART1CS_n <= '0' when IORQ_n = '0' and A(7 downto 3) = "10000" else '1'; + +-- CPU_D <= +-- SRAM_D when RAMCS_n = '0' else +-- UART0_D when UART0CS_n = '0' else +-- UART1_D when UART1CS_n = '0' else +-- ROM_D; + + CPU_D <= + ROM_D; + + u0 : entity work.T80s + generic map(Mode => 0, T2Write => 1, IOWait => 0) +-- generic map(Mode => 1, T2Write => 1, IOWait => 0) + port map( + RESET_n => RESET_s, + CLK_n => Clk, + WAIT_n => WAIT_n, + INT_n => INT_n, + NMI_n => NMI_n, + BUSRQ_n => BUSRQ_n, + M1_n => M1_n, + MREQ_n => MREQ_n, + IORQ_n => IORQ_n, + RD_n => RD_n, + WR_n => WR_n, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + BUSAK_n => BUSAK_n, + A => A, + DI => CPU_D, + DO => D); + + -- u1 : entity work.MonZ80 + -- port map( + -- Clk => Clk, + -- A => A(10 downto 0), + -- D => ROM_D); + + u1 : entity work.bagmanrom + port map( + clock => not Clk, + address => A(14 downto 0), + q => ROM_D); + + u2 : entity work.SSRAM + generic map( + AddrWidth => 12) + port map( + Clk => Clk, + CE_n => RAMCS_n, + WE_n => WR_n, + A => A(11 downto 0), + DIn => D, + DOut => SRAM_D); + + u3 : entity work.T16450 + port map( + MR_n => Reset_s, + XIn => Clk, + RClk => BaudOut0, + CS_n => UART0CS_n, + Rd_n => RD_n, + Wr_n => IOWR_n, + A => A(2 downto 0), + D_In => D, + D_Out => UART0_D, + SIn => RXD0, + CTS_n => CTS0, + DSR_n => DSR0, + RI_n => RI0, + DCD_n => DCD0, + SOut => TXD0, + RTS_n => RTS0, + DTR_n => DTR0, + OUT1_n => open, + OUT2_n => open, + BaudOut => BaudOut0, + Intr => open); + + u4 : entity work.T16450 + port map( + MR_n => Reset_s, + XIn => Clk, + RClk => BaudOut1, + CS_n => UART1CS_n, + Rd_n => RD_n, + Wr_n => IOWR_n, + A => A(2 downto 0), + D_In => D, + D_Out => UART1_D, + SIn => RXD1, + CTS_n => CTS1, + DSR_n => DSR1, + RI_n => RI1, + DCD_n => DCD1, + SOut => TXD1, + RTS_n => RTS1, + DTR_n => DTR1, + OUT1_n => open, + OUT2_n => open, + BaudOut => BaudOut1, + Intr => open); + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/DebugSystemXR.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/DebugSystemXR.vhd new file mode 100644 index 00000000..ca8fa877 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/DebugSystemXR.vhd @@ -0,0 +1,185 @@ +-- Z80, Monitor ROM, external SRAM interface and two 16450 UARTs +-- that can be synthesized and used with +-- the NoICE debugger that can be found at +-- http://www.noicedebugger.com/ + +library IEEE; +use IEEE.std_logic_1164.all; + +entity DebugSystemXR is + port( + Reset_n : in std_logic; + Clk : in std_logic; + NMI_n : in std_logic; + OE_n : out std_logic; + WE_n : out std_logic; + RAMCS_n : out std_logic; + ROMCS_n : out std_logic; + PGM_n : out std_logic; + A : out std_logic_vector(16 downto 0); + D : inout std_logic_vector(7 downto 0); + RXD0 : in std_logic; + CTS0 : in std_logic; + DSR0 : in std_logic; + RI0 : in std_logic; + DCD0 : in std_logic; + RXD1 : in std_logic; + CTS1 : in std_logic; + DSR1 : in std_logic; + RI1 : in std_logic; + DCD1 : in std_logic; + TXD0 : out std_logic; + RTS0 : out std_logic; + DTR0 : out std_logic; + TXD1 : out std_logic; + RTS1 : out std_logic; + DTR1 : out std_logic + ); +end entity DebugSystemXR; + +architecture struct of DebugSystemXR is + + signal M1_n : std_logic; + signal MREQ_n : std_logic; + signal IORQ_n : std_logic; + signal RD_n : std_logic; + signal WR_n : std_logic; + signal RFSH_n : std_logic; + signal HALT_n : std_logic; + signal WAIT_n : std_logic; + signal INT_n : std_logic; + signal RESET_s : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal A_i : std_logic_vector(15 downto 0); + signal D_i : std_logic_vector(7 downto 0); + signal ROM_D : std_logic_vector(7 downto 0); + signal UART0_D : std_logic_vector(7 downto 0); + signal UART1_D : std_logic_vector(7 downto 0); + signal CPU_D : std_logic_vector(7 downto 0); + + signal Mirror : std_logic; + + signal IOWR_n : std_logic; + signal RAMCS_n_i : std_logic; + signal UART0CS_n : std_logic; + signal UART1CS_n : std_logic; + + signal BaudOut0 : std_logic; + signal BaudOut1 : std_logic; + +begin + + Wait_n <= '1'; + BusRq_n <= '1'; + INT_n <= '1'; + + OE_n <= RD_n; + WE_n <= WR_n; + RAMCS_n <= RAMCS_n_i; + ROMCS_n <= '1'; + PGM_n <= '1'; + A(14 downto 0) <= A_i(14 downto 0); + A(16 downto 15) <= "00"; + D <= D_i when WR_n = '0' else "ZZZZZZZZ"; + + process (Reset_n, Clk) + begin + if Reset_n = '0' then + Reset_s <= '0'; + Mirror <= '0'; + elsif Clk'event and Clk = '1' then + Reset_s <= '1'; + if IORQ_n = '0' and A_i(7 downto 4) = "1111" then + Mirror <= D_i(0); + end if; + end if; + end process; + + IOWR_n <= WR_n or IORQ_n; + RAMCS_n_i <= (not Mirror and not A_i(15)) or MREQ_n; + UART0CS_n <= '0' when IORQ_n = '0' and A_i(7 downto 3) = "00000" else '1'; + UART1CS_n <= '0' when IORQ_n = '0' and A_i(7 downto 3) = "10000" else '1'; + + CPU_D <= + D when RAMCS_n_i = '0' else + UART0_D when UART0CS_n = '0' else + UART1_D when UART1CS_n = '0' else + ROM_D; + + u0 : entity work.T80s + generic map(Mode => 1, T2Write => 1, IOWait => 0) + port map( + RESET_n => RESET_s, + CLK_n => Clk, + WAIT_n => WAIT_n, + INT_n => INT_n, + NMI_n => NMI_n, + BUSRQ_n => BUSRQ_n, + M1_n => M1_n, + MREQ_n => MREQ_n, + IORQ_n => IORQ_n, + RD_n => RD_n, + WR_n => WR_n, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + BUSAK_n => BUSAK_n, + A => A_i, + DI => CPU_D, + DO => D_i); + + u1 : entity work.MonZ80 + port map( + Clk => Clk, + A => A_i(10 downto 0), + D => ROM_D); + + u3 : entity work.T16450 + port map( + MR_n => Reset_s, + XIn => Clk, + RClk => BaudOut0, + CS_n => UART0CS_n, + Rd_n => RD_n, + Wr_n => IOWR_n, + A => A_i(2 downto 0), + D_In => D_i, + D_Out => UART0_D, + SIn => RXD0, + CTS_n => CTS0, + DSR_n => DSR0, + RI_n => RI0, + DCD_n => DCD0, + SOut => TXD0, + RTS_n => RTS0, + DTR_n => DTR0, + OUT1_n => open, + OUT2_n => open, + BaudOut => BaudOut0, + Intr => open); + + u4 : entity work.T16450 + port map( + MR_n => Reset_s, + XIn => Clk, + RClk => BaudOut1, + CS_n => UART1CS_n, + Rd_n => RD_n, + Wr_n => IOWR_n, + A => A_i(2 downto 0), + D_In => D_i, + D_Out => UART1_D, + SIn => RXD1, + CTS_n => CTS1, + DSR_n => DSR1, + RI_n => RI1, + DCD_n => DCD1, + SOut => TXD1, + RTS_n => RTS1, + DTR_n => DTR1, + OUT1_n => open, + OUT2_n => open, + BaudOut => BaudOut1, + Intr => open); + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80.vhd new file mode 100644 index 00000000..398fa0df --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80.vhd @@ -0,0 +1,1073 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 and Auto_Wait_t1 = '0' then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if T_Res = '1' then + Auto_Wait_t1 <= '0'; + else + Auto_Wait_t1 <= Auto_Wait or IORQ_i; + end if; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if (Auto_Wait = '1' and Auto_Wait_t2 = '0') nor + (IOWait = 1 and IORQ_i = '1' and Auto_Wait_t1 = '0') then + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T8080se.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T8080se.vhd new file mode 100644 index 00000000..2b6d28f8 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T8080se.vhd @@ -0,0 +1,185 @@ +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- 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/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80_ALU.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80_ALU.vhd new file mode 100644 index 00000000..86fddce7 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80_ALU.vhd @@ -0,0 +1,351 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80_MCode.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80_MCode.vhd new file mode 100644 index 00000000..4cc30f35 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80_MCode.vhd @@ -0,0 +1,1934 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; +-- constant aNone : std_logic_vector(2 downto 0) := "000"; +-- constant aXY : std_logic_vector(2 downto 0) := "001"; +-- constant aIOA : std_logic_vector(2 downto 0) := "010"; +-- constant aSP : std_logic_vector(2 downto 0) := "011"; +-- constant aBC : std_logic_vector(2 downto 0) := "100"; +-- constant aDE : std_logic_vector(2 downto 0) := "101"; +-- constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0010"; + else + IncDec_16 <= "1010"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0010"; + else + IncDec_16 <= "1010"; + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80_Pack.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80_Pack.vhd new file mode 100644 index 00000000..ac7d34da --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80_Pack.vhd @@ -0,0 +1,208 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80_Reg.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80se.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80se.vhd new file mode 100644 index 00000000..ac8886a8 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/T80se.vhd @@ -0,0 +1,184 @@ +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80se is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0; -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + IOWait : integer := 1 -- 0 => Single cycle I/O, 1 => Std I/O cycle + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80se; + +architecture rtl of T80se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => Mode, + IOWait => IOWait) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/YM2149_linmix_sep.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/YM2149_linmix_sep.vhd new file mode 100644 index 00000000..27f26749 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/YM2149_linmix_sep.vhd @@ -0,0 +1,553 @@ +-- changes for seperate audio outputs and enable now enables cpu access as well +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + O_CHAN : out std_logic_vector(1 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal cnt_div_t1 : std_logic_vector(3 downto 0); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8; + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process(RESET_L, CLK) + begin + -- looks like registers are latches in real chip, but the address is caught at the end of the address state. + if (RESET_L = '0') then + addr <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA = '1') then + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end if; + end process; + + p_wdata : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + elsif rising_edge(CLK) then + if (ENA = '1') then + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, reg, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + cnt_div_t1 <= cnt_div; + end if; + end process; + + p_audio_output : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_AUDIO <= (others => '0'); + O_CHAN <= (others => '0'); + elsif rising_edge(CLK) then + + if (ENA = '1') then + O_AUDIO <= dac_amp(7 downto 0); + O_CHAN <= cnt_div_t1(1 downto 0); + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then -- resync + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end if; + end process; +end architecture RTL; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/dac.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/dac.vhd new file mode 100644 index 00000000..9f696b0b --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 11 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/gen_ram.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/gen_ram.vhd new file mode 100644 index 00000000..f1a95608 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/gen_ram.vhd @@ -0,0 +1,84 @@ +-- ----------------------------------------------------------------------- +-- +-- Syntiac's generic VHDL support files. +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- +-- Modified April 2016 by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +-- Remove address register when writing +-- +-- ----------------------------------------------------------------------- +-- +-- gen_rwram.vhd +-- +-- ----------------------------------------------------------------------- +-- +-- generic ram. +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity gen_ram is + generic ( + dWidth : integer := 8; + aWidth : integer := 10 + ); + port ( + clk : in std_logic; + we : in std_logic; + addr : in std_logic_vector((aWidth-1) downto 0); + d : in std_logic_vector((dWidth-1) downto 0); + q : out std_logic_vector((dWidth-1) downto 0) + ); +end entity; + +-- ----------------------------------------------------------------------- + +architecture rtl of gen_ram is + subtype addressRange is integer range 0 to ((2**aWidth)-1); + type ramDef is array(addressRange) of std_logic_vector((dWidth-1) downto 0); + signal ram: ramDef; + + signal rAddrReg : std_logic_vector((aWidth-1) downto 0); + signal qReg : std_logic_vector((dWidth-1) downto 0); +begin +-- ----------------------------------------------------------------------- +-- Signals to entity interface +-- ----------------------------------------------------------------------- +-- q <= qReg; + +-- ----------------------------------------------------------------------- +-- Memory write +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if we = '1' then + ram(to_integer(unsigned(addr))) <= d; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Memory read +-- ----------------------------------------------------------------------- +process(clk) + begin + if rising_edge(clk) then +-- qReg <= ram(to_integer(unsigned(rAddrReg))); +-- rAddrReg <= addr; +---- qReg <= ram(to_integer(unsigned(addr))); + q <= ram(to_integer(unsigned(addr))); + end if; + end process; +--q <= ram(to_integer(unsigned(addr))); +end architecture; + diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/gen_video.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/gen_video.vhd new file mode 100644 index 00000000..da8d77d4 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/gen_video.vhd @@ -0,0 +1,70 @@ +--------------------------------------------------------------------------------- +-- Galaga video horizontal/vertical and sync generator by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.ALL; + +entity gen_video is +port( + clk : in std_logic; + enable : in std_logic; + hcnt : out std_logic_vector(5 downto 0); + vcnt : out std_logic_vector(5 downto 0); + hsync : out std_logic; + vsync : out std_logic; + blankn : out std_logic +); +end gen_video; + +architecture struct of gen_video is + signal hblank : std_logic; + signal vblank : std_logic; + signal hcntReg : unsigned (5 DOWNTO 0) := to_unsigned(000,9); + signal vcntReg : unsigned (5 DOWNTO 0) := to_unsigned(015,9); +begin + +hcnt <= std_logic_vector(hcntReg); +vcnt <= std_logic_vector(vcntReg); + + +process(clk) begin + + if enable = '1' then + + if hcntReg = 511 then + hcntReg <= to_unsigned (128,9); + else + hcntReg <= hcntReg + 1; + end if; + + if hcntReg = 191 then + if vcntReg = 261 then + vcntReg <= to_unsigned(0,9); + else + vcntReg <= vcntReg + 1; + end if; + end if; + + if hcntReg = (175+ 0-8+8) then hsync <= '1'; -- 1 + elsif hcntReg = (175+29-8+8) then hsync <= '0'; + end if; + + if vcntReg = 252 then vsync <= '1'; + elsif vcntReg = 260 then vsync <= '0'; + end if; + + if hcntReg = (127+16+8) then hblank <= '1'; + elsif hcntReg = (255-17+8+1) then hblank <= '0'; + end if; + + if vcntReg = (240+1-1) then vblank <= '1'; + elsif vcntReg = (015+1) then vblank <= '0'; + end if; + + blankn <= not (hblank or vblank); + end if; + +end process; + +end architecture; \ No newline at end of file diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/hq2x.sv b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/hq2x.sv new file mode 100644 index 00000000..3e406318 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/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'bxx; + 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/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/keyboard.v b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/keyboard.v new file mode 100644 index 00000000..70c8a56e --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/keyboard.v @@ -0,0 +1,83 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 +// 'h26: joystick[2] <= ~release_btn; +// 'h25: joystick[2] <= ~release_btn; + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/mist_io.v b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/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/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/mist_pll_12M_14M.qip b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/mist_pll_12M_14M.qip new file mode 100644 index 00000000..02816126 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/mist_pll_12M_14M.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 VHDL_FILE [file join $::quartus(qip_path) "mist_pll_12M_14M.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "mist_pll_12M_14M.ppf"] diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/mist_pll_12M_14M.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/mist_pll_12M_14M.vhd new file mode 100644 index 00000000..4865e696 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/mist_pll_12M_14M.vhd @@ -0,0 +1,424 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: mist_pll_12M_14M.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY mist_pll_12M_14M IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END mist_pll_12M_14M; + + +ARCHITECTURE SYN OF mist_pll_12m_14m IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + locked <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 420, + clk0_duty_cycle => 50, + clk0_multiply_by => 191, + clk0_phase_shift => "0", + clk1_divide_by => 360, + clk1_duty_cycle => 50, + clk1_multiply_by => 191, + clk1_phase_shift => "0", + clk2_divide_by => 105, + clk2_duty_cycle => 50, + clk2_multiply_by => 191, + clk2_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=mist_pll_12M_14M", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire6, + clk => sub_wire0, + locked => sub_wire2 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "420" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "360" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "105" +-- 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 "12.278571" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "14.325000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "49.114285" +-- 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 "1" +-- 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 "191" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "191" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "191" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "12.28800000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "14.31800000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "49.15200000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- 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 "ps" +-- 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 "mist_pll_12M_14M.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 "420" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "191" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "360" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "191" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "105" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "191" +-- 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_USED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..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: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- 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: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/osd.v b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/osd.v new file mode 100644 index 00000000..3e1815d1 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/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 +(* ramstyle = "no_rw_check" *) reg [7:0] osd_buffer[1023: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 [9: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/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/pooyan.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/pooyan.vhd new file mode 100644 index 00000000..431ca119 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/pooyan.vhd @@ -0,0 +1,818 @@ +--------------------------------------------------------------------------------- +-- Time pilot by Dar (darfpga@aol.fr) (29/10/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T80/T80se - Version : 0247 +----------------------------- +-- Z80 compatible microprocessor core +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- + +-- Features : +-- TV 15KHz mode only (atm) +-- Coctail mode ok +-- Sound ok + +-- Use with MAME roms from pooyan.zip +-- +-- Use make_pooyan_proms.bat to build vhd file from binaries +-- +-- Pooyan Hardware caracteristics : +-- +-- VIDEO : 1xZ80@3MHz CPU accessing its program rom, working ram, +-- sprite data ram, I/O, sound board register and trigger. +-- 32Kx8bits program rom +-- +-- One char tile map 32x28 +-- 8Kx16bits graphics rom 4bits/pixel +-- 16colors/16sets among 16 colors +-- +-- 24 sprites with priorities and flip H/V +-- 16Kx16bits graphics rom 4bits/pixel +-- 15 colors/16sets among 16 colors (different of char colors). +-- +-- Char/sprites color palette 2x16 colors among 256 colors +-- 3red 3green 2blue +-- +-- Working ram : 4Kx8bits +-- Sprites data ram : 256x16bits +-- Sprites line buffer rams : 1 scan line delay flip/flop 2x256x4bits + +-- SOUND : 1xZ80@1.79MHz CPU accessing its program rom, working ram, 2x-AY3-8910 +-- 16Kx8bits program rom +-- +-- 1xAY-3-8910 +-- I/O noise input and command/trigger from video board. +-- 3 sound channels +-- +-- 1xAY-3-8910 +-- 3 sound channels +-- +-- 6 RC filters with 4 states : transparent or cut 600Hz, 700Hz, 3.4KHz +-- +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity pooyan is +port( + clock_12 : in std_logic; + clock_14 : in std_logic; + reset : in std_logic; + video_r : out std_logic_vector(2 downto 0); + video_g : out std_logic_vector(2 downto 0); + video_b : out std_logic_vector(2 downto 0); + video_clk : out std_logic; + video_vblank : out std_logic; + video_hblank : out std_logic; + video_hs : out std_logic; + video_vs : out std_logic; + audio_out : out std_logic_vector(10 downto 0); + + dip_switch_1 : in std_logic_vector(7 downto 0); -- Coinage_B / Coinage_A + dip_switch_2 : in std_logic_vector(7 downto 0); -- Sound(8)/Difficulty(7-5)/Bonus(4)/Cocktail(3)/lives(2-1) + + start2 : in std_logic; + start1 : in std_logic; + coin1 : in std_logic; + + fire1 : in std_logic; + right1 : in std_logic; + left1 : in std_logic; + down1 : in std_logic; + up1 : in std_logic; + + fire2 : in std_logic; + right2 : in std_logic; + left2 : in std_logic; + down2 : in std_logic; + up2 : in std_logic; + + sw : in std_logic_vector(9 downto 0); + dbg_cpu_addr : out std_logic_vector(15 downto 0) + ); +end pooyan; + +architecture struct of pooyan is + + signal reset_n: std_logic; + signal clock_12n : std_logic; + signal clock_6 : std_logic := '0'; + signal clock_6n : std_logic; + signal clock_div : std_logic_vector(1 downto 0) := "00"; + + signal hcnt : std_logic_vector(5 downto 0); -- horizontal counter + signal vcnt : std_logic_vector(8 downto 0); -- vertical counter + signal pxcnt : std_logic_vector(2 downto 0); -- pixel counter + signal spcnt : std_logic_vector(4 downto 0); -- sprite counter + + signal csync : std_logic; + signal hsync0 : std_logic; + signal hsync1 : std_logic; + signal hsync2 : std_logic; + + signal hblank : std_logic; + signal vblank : std_logic; + + signal cpu_ena : std_logic; + + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_wr_n : std_logic; + signal cpu_mreq_n : std_logic; + signal cpu_nmi_n : std_logic; + + signal cpu_rom_do : std_logic_vector( 7 downto 0); + + signal wram_addr : std_logic_vector(11 downto 0); + signal wram_we : std_logic; + signal wram_do : std_logic_vector( 7 downto 0); + + signal ch_graphx_addr_f: std_logic_vector(11 downto 0); + signal ch_graphx_addr : std_logic_vector(11 downto 0); + signal ch_graphx1_do : std_logic_vector( 7 downto 0); + signal ch_graphx2_do : std_logic_vector( 7 downto 0); + signal ch_pixels : std_logic_vector(15 downto 0); + signal ch_data1 : std_logic_vector( 7 downto 0); + signal ch_color_set : std_logic_vector(3 downto 0); + signal ch_palette_addr : std_logic_vector(7 downto 0); + signal ch_palette_do : std_logic_vector(7 downto 0); + + signal spram_addr : std_logic_vector(7 downto 0); + signal spram1_we : std_logic; + signal spram1_do : std_logic_vector(7 downto 0); + signal spram2_we : std_logic; + signal spram2_do : std_logic_vector(7 downto 0); + + signal sp_graphx_addr : std_logic_vector(11 downto 0); + signal sp_graphx1_do : std_logic_vector(7 downto 0); + signal sp_graphx2_do : std_logic_vector(7 downto 0); + signal vcnt_r : std_logic_vector(8 downto 0); + signal sp_line : std_logic_vector(7 downto 0); + signal sp_on_line : std_logic; + signal sp_attr : std_logic_vector(7 downto 0); + signal sp_posh : std_logic_vector(7 downto 0); + signal sp_pixels : std_logic_vector(15 downto 0); + signal sp_color_set : std_logic_vector(3 downto 0); + signal sp_palette_addr : std_logic_vector(7 downto 0); + signal sp_palette_do : std_logic_vector(7 downto 0); + signal sp_read_out : std_logic_vector(3 downto 0); + signal sp_blank : std_logic; + + signal rgb_palette_addr : std_logic_vector(4 downto 0); + signal rgb_palette_do : std_logic_vector(7 downto 0); + + signal sp_buffer_write_addr : std_logic_vector(7 downto 0); + signal sp_buffer_write_we : std_logic; + signal sp_buffer_read_addr : std_logic_vector(7 downto 0); + + signal sp_buffer_ram1_addr : std_logic_vector(7 downto 0); + signal sp_buffer_ram1_we : std_logic; + signal sp_buffer_ram1_di : std_logic_vector(3 downto 0); + signal sp_buffer_ram1_do : std_logic_vector(3 downto 0); + + signal sp_buffer_ram2_addr : std_logic_vector(7 downto 0); + signal sp_buffer_ram2_we : std_logic; + signal sp_buffer_ram2_di : std_logic_vector(3 downto 0); + signal sp_buffer_ram2_do : std_logic_vector(3 downto 0); + + signal sp_buffer_sel : std_logic; + + signal itt_n : std_logic; + signal flip : std_logic; + signal A10x_we : std_logic; + signal A18x_we : std_logic; + signal sound_cmd : std_logic_vector(7 downto 0); + signal sound_trig : std_logic; + + signal input_0 : std_logic_vector(7 downto 0); + signal input_1 : std_logic_vector(7 downto 0); + signal input_2 : std_logic_vector(7 downto 0); + +begin +video_clk <= clock_6n; +clock_12n <= not clock_12; +clock_6n <= not clock_6; +reset_n <= not reset; + +-- debug +process (reset, clock_12) +begin + if rising_edge(clock_12) and cpu_ena ='1' and cpu_mreq_n ='0' then + dbg_cpu_addr <= cpu_addr; + end if; +end process; + +-- make 6MHz clock from 12MHz +process (clock_12) +begin + if reset='1' then + clock_6 <= '0'; + else + if rising_edge(clock_12) then + clock_6 <= not clock_6; + end if; + end if; +end process; + + +-------------------------- +-- Video/sprite scanner -- +-------------------------- + +-- make hcnt and vcnt video scanner from pixel clocks and counts +-- +-- pxcnt |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7| +-- hcnt | N | N+1 | +-- cpu_adr/do | | + +-- +-- hcnt [0..47] => 48 x 8 = 384 pixels, 384/6.144Mhz => 1 line is 62.5us (16.000KHz) +-- vcnt [252..255,256..511] => 260 lines, 1 frame is 260 x 62.5us = 16.250ms (61.54Hz) + +process (reset, clock_6) +begin + if reset='1' then + pxcnt <= "000"; + hcnt <= "000000"; + vcnt <= '0'&X"FC"; + spcnt <= "00000"; + else + if rising_edge(clock_6) then + pxcnt <= pxcnt + '1'; + if pxcnt = "111" then + hcnt <= hcnt + '1'; + + if hcnt = "101111" then -- char from #0 to #47 (one line) + hcnt <= "000000"; + if vcnt = '1'&X"FF" then + vcnt <= '0'&X"FC"; + else + vcnt <= vcnt + '1'; + end if; + end if; + + -- sprite down counter + if hcnt(0) = '1' then -- every is 16 bits (2 char) + if hcnt = "101111" then + spcnt <= "01000"; -- start with sprite #8 + else + spcnt <= spcnt + '1'; -- upto sprite #31 + end if; + end if; + + end if; + end if; + end if; +end process; + +cpu_ena <= not pxcnt(0); + +-- inputs +input_0 <= "111" & not start2 & not start1 & '1' & '1' & not coin1; -- ?/ ?/ ?/ 2S/ 1S/SVC/ C2/ C1 +input_1 <= "111" & not fire1 & not down1 & not up1 & not right1 & not left1; -- ?/1FL/1SR/1SL/1DW/1UP/1RI/1LE +input_2 <= "111" & not fire2 & not down2 & not up2 & not right2 & not left2; -- ?/2FL/2SR/2SL/2DW/2UP/2RI/2LE + +-- cpu input address decoding (mirror mostly from Mame) +cpu_di <= cpu_rom_do when cpu_addr(15 downto 12) < X"8" else -- 0000-7FFF + wram_do when cpu_addr(15 downto 12) = X"8" else -- 8000-8FFF + + spram1_do when cpu_addr(15 downto 12) = X"9" and + cpu_addr(10) = '0' else -- 9000-93FF + + spram2_do when cpu_addr(15 downto 12) = X"9" and + cpu_addr(10) = '1' else -- 9400-97FF + + dip_switch_2 when cpu_addr(15 downto 12) = X"A" and + cpu_addr( 7 downto 5) = "000" else -- A000-A000 + + input_0 when cpu_addr(15 downto 12) = X"A" and + cpu_addr( 7 downto 5) = "100" else -- A080-A080 + + input_1 when cpu_addr(15 downto 12) = X"A" and + cpu_addr( 7 downto 5) = "101" else -- A0A0-A0A0 + + input_2 when cpu_addr(15 downto 12) = X"A" and + cpu_addr( 7 downto 5) = "110" else -- A0C0-A0C0 + + dip_switch_1 when cpu_addr(15 downto 12) = X"A" and + cpu_addr( 7 downto 5) = "111" else -- A0E0-A0E0 + + X"FF"; + +-- working ram address multiplexer cpu/video scanner +wram_addr <= cpu_addr(11 downto 0) when cpu_ena = '1' else + '0' & pxcnt(1) & vcnt(7 downto 3) & hcnt(4 downto 0) when flip = '0' else + '0' & pxcnt(1) & not vcnt(7 downto 3) & not hcnt(4 downto 0); + +-- sprite data ram address multiplexer cpu/sprite scanner +spram_addr <= cpu_addr(7 downto 0) when cpu_ena = '1' else "00" & spcnt & pxcnt(1); + +-- write enable to working ram, sprite data ram and misc registers +wram_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"8" else '0'; +spram1_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"9" and cpu_addr(10) = '0' else '0'; +spram2_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"9" and cpu_addr(10) = '1' else '0'; +A10x_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"A" and cpu_addr(8 downto 7) = "10" else '0'; +A18x_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"A" and cpu_addr(8 downto 7) = "11" else '0'; + +-- Misc registers : interrupt enable/clear, cocktail flip, sound trigger +process (clock_6) +begin + if rising_edge(clock_6) then + if A10x_we = '1' then + sound_cmd <= cpu_do; + end if; + + if A18x_we = '1' then + if cpu_addr(2 downto 0) = "000" then itt_n <= cpu_do(0); end if; + if cpu_addr(2 downto 0) = "111" then flip <= not cpu_do(0); end if; + if cpu_addr(2 downto 0) = "001" then sound_trig <= cpu_do(0); end if; + end if; + + if itt_n = '0' then + cpu_nmi_n <= '1'; + else -- lauch nmi and end of frame + if (vcnt = 493) and (hcnt = "000000") and (pxcnt = "000") then + cpu_nmi_n <= '0'; + end if; + end if; + end if; +end process; + + +---------------------- +--- sprite machine --- +---------------------- +-- sprite data rams are scanned from sprites addresse 31 to 8 at each line + +-- latch current sprite data with respect to pixel and hcnt in relation +-- with sprite data ram addressing +process (clock_6) +begin + if rising_edge(clock_6) then + + if (hcnt(0) = '0') and (pxcnt = "001") then + sp_posh <= spram1_do ; -- a.k.a. X + sp_attr <= spram2_do ; -- color and flip x/y + vcnt_r <= vcnt; + end if; + + -- sprite is on current line if sp_line is below 16 + -- and if sprite vertical position (a.k.a. Y) is below xF0 + if (hcnt(0) = '0') and (pxcnt = "011") then + if sp_line(7 downto 4) = "0000" and spram2_do < X"F0" then + sp_on_line <= '1'; + else + sp_on_line <= '0'; + end if; + end if; + + -- delay sp_color_set + if (hcnt(0) = '0') and (pxcnt = "100") then + sp_color_set <= sp_attr(3 downto 0); + end if; + + end if; +end process; + +-- sp_line (valid only when pxcnt = "011") +sp_line <= not(vcnt_r(7 downto 0)) - spram2_do; + +-- address sprite graphics rom with sprite code and tile number and sprite line counter +-- with respect to sprite flip x/y controls +with sp_attr(7 downto 6) select + sp_graphx_addr <= spram1_do(5 downto 0) & sp_line(3) & hcnt(0) & pxcnt(2) & sp_line(2 downto 0) when "11", + spram1_do(5 downto 0) & sp_line(3) & not hcnt(0) & not pxcnt(2) & sp_line(2 downto 0) when "10", + spram1_do(5 downto 0) & not sp_line(3) & hcnt(0) & pxcnt(2) & not sp_line(2 downto 0) when "01", + spram1_do(5 downto 0) & not sp_line(3) & not hcnt(0) & not pxcnt(2) & not sp_line(2 downto 0) when others; + +-- latch and shift sprite graphics data with respect to flipx control +-- 16bits => 4x4bits = 4pixels / 16colors (15colors + transparent) +process (clock_6) +begin + if rising_edge(clock_6) then + + if pxcnt(1 downto 0) = "00" then + if sp_on_line = '1' then + if sp_attr(6) = '1' then + sp_pixels <= sp_graphx1_do & sp_graphx2_do; + else + sp_pixels( 3 downto 0) <= sp_graphx2_do(0) & sp_graphx2_do(1) & sp_graphx2_do(2) & sp_graphx2_do(3); + sp_pixels( 7 downto 4) <= sp_graphx2_do(4) & sp_graphx2_do(5) & sp_graphx2_do(6) & sp_graphx2_do(7); + sp_pixels(11 downto 8) <= sp_graphx1_do(0) & sp_graphx1_do(1) & sp_graphx1_do(2) & sp_graphx1_do(3); + sp_pixels(15 downto 12) <= sp_graphx1_do(4) & sp_graphx1_do(5) & sp_graphx1_do(6) & sp_graphx1_do(7); + end if; + else + sp_pixels <= (others => '0'); + end if; + else + sp_pixels( 3 downto 0) <= sp_pixels( 2 downto 0) & '0'; + sp_pixels( 7 downto 4) <= sp_pixels( 6 downto 4) & '0'; + sp_pixels(11 downto 8) <= sp_pixels(10 downto 8) & '0'; + sp_pixels(15 downto 12) <= sp_pixels(14 downto 12) & '0'; + end if; + + end if; + +end process; + +-- address sprite color palette 16colors/pixel, 16 sets => 16 colors +sp_palette_addr <= sp_color_set & sp_pixels(3) & sp_pixels(7) & sp_pixels(11) & sp_pixels(15); + +-- write sprite to line buffer at posh position +process (clock_6) +begin + if rising_edge(clock_6) then + if hcnt(0) = '0' and pxcnt = "101" then + sp_buffer_write_addr <= sp_posh; + else + sp_buffer_write_addr <= sp_buffer_write_addr + '1'; + end if; + end if; +end process; + +-- write colors to buffer when not transparent +sp_buffer_write_we <= '0' when sp_palette_do(3 downto 0) = "0000" else '1'; + +-- read sprite line buffer and erase after read +process (clock_12) +begin + if rising_edge(clock_12) then + if hcnt = "101111" and pxcnt = "111" then + sp_buffer_read_addr <= "11111010"; -- tune horizontal position of sprites + else + if clock_6 = '0' then + sp_buffer_read_addr <= sp_buffer_read_addr + '1'; + else + if vcnt(0) = '0' then + sp_read_out <= sp_buffer_ram1_do; + else + sp_read_out <= sp_buffer_ram2_do; + end if; + end if; + end if; + end if; +end process; + +-- toggle read/write sprite line buffer every other line + +-- wait pxcnt = "101" to allow last sprite (#31) to be written to line buffer +process (clock_6) +begin + if rising_edge(clock_6) then + if pxcnt = "101" then sp_buffer_sel <= vcnt(0); end if; + end if; +end process; + +sp_buffer_ram1_addr <= sp_buffer_read_addr when sp_buffer_sel = '0' else sp_buffer_write_addr; +sp_buffer_ram2_addr <= sp_buffer_read_addr when sp_buffer_sel = '1' else sp_buffer_write_addr; + +sp_buffer_ram1_di <= "0000" when sp_buffer_sel = '0' else sp_palette_do(3 downto 0); +sp_buffer_ram2_di <= "0000" when sp_buffer_sel = '1' else sp_palette_do(3 downto 0); + +sp_buffer_ram1_we <= not clock_6 when sp_buffer_sel = '0' else sp_buffer_write_we; +sp_buffer_ram2_we <= not clock_6 when sp_buffer_sel = '1' else sp_buffer_write_we; + +-------------------- +--- char machine --- +-------------------- + +-- latch current char data with respect to vcnt and hcnt in relation +-- with wram ram addressing +process (clock_6) +begin + if rising_edge(clock_6) and pxcnt = "001" then + ch_data1 <= wram_do ; + end if; + + if rising_edge(clock_6) and pxcnt = "100" then + ch_color_set <= ch_data1(3 downto 0) ; + end if; + +end process; + +-- address char graphics rom with char code, pixel count and vertical line counter +-- with respect to char flip x/y controls +with ch_data1(7 downto 6) select +ch_graphx_addr_f <= wram_do & pxcnt(2) & vcnt(2 downto 0) when "00", + wram_do & not pxcnt(2) & vcnt(2 downto 0) when "01", + wram_do & pxcnt(2) & not(vcnt(2 downto 0)) when "10", + wram_do & not pxcnt(2) & not(vcnt(2 downto 0)) when others; + +-- in cocktail flip mode negate h/v counters +ch_graphx_addr <= ch_graphx_addr_f when flip ='0' else ch_graphx_addr_f xor "000000001111"; + +-- latch and shift char graphics data with respect to flipx control and cocktail flip control +-- 16bits => 4x4bits = 4pixels / 16colors +process (clock_6) +begin + if rising_edge(clock_6) then + if pxcnt(1 downto 0) = "00" then + if (ch_data1(6) xor flip) = '0' then + ch_pixels <= ch_graphx1_do & ch_graphx2_do; + else + ch_pixels( 3 downto 0) <= ch_graphx2_do(0) & ch_graphx2_do(1) &ch_graphx2_do(2) &ch_graphx2_do(3); + ch_pixels( 7 downto 4) <= ch_graphx2_do(4) & ch_graphx2_do(5) &ch_graphx2_do(6) &ch_graphx2_do(7); + ch_pixels(11 downto 8) <= ch_graphx1_do(0) & ch_graphx1_do(1) &ch_graphx1_do(2) &ch_graphx1_do(3); + ch_pixels(15 downto 12) <= ch_graphx1_do(4) & ch_graphx1_do(5) &ch_graphx1_do(6) &ch_graphx1_do(7); + end if; + else + ch_pixels( 3 downto 0) <= ch_pixels( 2 downto 0) & '0'; + ch_pixels( 7 downto 4) <= ch_pixels( 6 downto 4) & '0'; + ch_pixels(11 downto 8) <= ch_pixels(10 downto 8) & '0'; + ch_pixels(15 downto 12) <= ch_pixels(14 downto 12) & '0'; + end if; + end if; + +end process; + +-- address char color palette 4 colors, 64 sets => 16 colors +with sw(4 downto 0) select +ch_palette_addr <= +ch_color_set & ch_pixels(3) & ch_pixels( 7) & ch_pixels(11) & ch_pixels(15) when '0'&X"0", +ch_color_set & ch_pixels(3) & ch_pixels( 7) & ch_pixels(15) & ch_pixels(11) when '0'&X"1", +ch_color_set & ch_pixels(3) & ch_pixels(11) & ch_pixels( 7) & ch_pixels(15) when '0'&X"2", +ch_color_set & ch_pixels(3) & ch_pixels(11) & ch_pixels(15) & ch_pixels( 7) when '0'&X"3", +ch_color_set & ch_pixels(3) & ch_pixels(15) & ch_pixels( 7) & ch_pixels(11) when '0'&X"4", +ch_color_set & ch_pixels(3) & ch_pixels(15) & ch_pixels(11) & ch_pixels( 7) when '0'&X"5", + +ch_color_set & ch_pixels(7) & ch_pixels( 3) & ch_pixels(11) & ch_pixels(15) when '0'&X"6", +ch_color_set & ch_pixels(7) & ch_pixels( 3) & ch_pixels(15) & ch_pixels(11) when '0'&X"7", +ch_color_set & ch_pixels(7) & ch_pixels(11) & ch_pixels( 3) & ch_pixels(15) when '0'&X"8", +ch_color_set & ch_pixels(7) & ch_pixels(11) & ch_pixels(15) & ch_pixels( 3) when '0'&X"9", +ch_color_set & ch_pixels(7) & ch_pixels(15) & ch_pixels( 3) & ch_pixels(11) when '0'&X"A", +ch_color_set & ch_pixels(7) & ch_pixels(15) & ch_pixels(11) & ch_pixels( 3) when '0'&X"B", + +ch_color_set & ch_pixels(11) & ch_pixels( 3) & ch_pixels( 7) & ch_pixels(15) when '0'&X"C", +ch_color_set & ch_pixels(11) & ch_pixels( 3) & ch_pixels(15) & ch_pixels( 7) when '0'&X"D", +ch_color_set & ch_pixels(11) & ch_pixels( 7) & ch_pixels( 3) & ch_pixels(15) when '0'&X"E", +ch_color_set & ch_pixels(11) & ch_pixels( 7) & ch_pixels(15) & ch_pixels( 3) when '0'&X"F", +ch_color_set & ch_pixels(11) & ch_pixels(15) & ch_pixels( 3) & ch_pixels( 7) when '1'&X"0", +ch_color_set & ch_pixels(11) & ch_pixels(15) & ch_pixels( 7) & ch_pixels( 3) when '1'&X"1", + +ch_color_set & ch_pixels(15) & ch_pixels( 3) & ch_pixels( 7) & ch_pixels(11) when '1'&X"2", +ch_color_set & ch_pixels(15) & ch_pixels( 3) & ch_pixels(11) & ch_pixels( 7) when '1'&X"3", +ch_color_set & ch_pixels(15) & ch_pixels( 7) & ch_pixels( 3) & ch_pixels(11) when '1'&X"4", +ch_color_set & ch_pixels(15) & ch_pixels( 7) & ch_pixels(11) & ch_pixels( 3) when '1'&X"5", +ch_color_set & ch_pixels(15) & ch_pixels(11) & ch_pixels( 3) & ch_pixels( 7) when '1'&X"6", +ch_color_set & ch_pixels(15) & ch_pixels(11) & ch_pixels( 7) & ch_pixels( 3) when others; + +--------------------- +-- mux char/sprite -- +--------------------- + +-- char data controls sprite display/hide +--process (clock_6) +--begin +-- if rising_edge(clock_6) then +-- sp_blank <= ch_color_set(4); +-- end if; +--end process; + +-- select rbg color and bank with respect to char/sprite selection +rgb_palette_addr <= +-- '1' & ch_palette_do(3 downto 0) when (sp_read_out = "0000" or sp_blank = '1') else + '1' & ch_palette_do(3 downto 0) when (sp_read_out = "0000" ) else + '0' & sp_read_out; + + + + +-- register and assign rbg palette output +process (clock_6) +begin + if rising_edge(clock_6) then + if hblank = '1' or vblank = '1' then + video_r <= "000"; + video_g <= "000"; + video_b <= "000"; + else + video_r <= rgb_palette_do(2 downto 0); + video_g <= rgb_palette_do(5 downto 3); + video_b <= rgb_palette_do(7 downto 6) & '0'; + end if; + end if; +end process; + +video_hblank <= hblank; +video_vblank <= vblank; + +---------------------------- +-- video syncs and blanks -- +---------------------------- + +process(clock_6) + constant hcnt_base : integer := 36; + variable vsync_cnt : std_logic_vector(3 downto 0); +begin + if rising_edge(clock_6) and pxcnt = "110" then + + if hcnt = hcnt_base+0 then hsync0 <= '0'; + elsif hcnt = hcnt_base+3 then hsync0 <= '1'; + end if; + + if hcnt = hcnt_base then + if vcnt = 500 then + vsync_cnt := X"0"; + else + if vsync_cnt < X"F" then vsync_cnt := vsync_cnt + '1'; end if; + end if; + end if; + + if hcnt = hcnt_base-4 then + hblank <= '1'; + if vcnt = 496 then + vblank <= '1'; -- 492 ok + elsif vcnt = 262 then + vblank <= '0'; -- 262 ok + end if; + elsif hcnt = 0 then + hblank <= '0'; + end if; + + video_hs <= hsync0; + + if vsync_cnt = 0 then video_vs <= '0'; + elsif vsync_cnt = 8 then video_vs <= '1'; + end if; + + end if; +end process; + +------------------------------ +-- components & sound board -- +------------------------------ + +-- microprocessor Z80 +cpu : entity work.T80se +generic map(Mode => 0, T2Write => 1, IOWait => 1) +port map( + RESET_n => reset_n, + CLK_n => clock_6, + CLKEN => cpu_ena, + WAIT_n => '1', + INT_n => '1', --cpu_irq_n, + NMI_n => cpu_nmi_n, + BUSRQ_n => '1', + M1_n => open, + MREQ_n => cpu_mreq_n, + IORQ_n => open, + RD_n => open, + WR_n => cpu_wr_n, + RFSH_n => open, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_di, + DO => cpu_do +); + +-- cpu1 program ROM +rom_cpu1 : entity work.pooyan_prog +port map( + clk => clock_6n, + addr => cpu_addr(14 downto 0), + data => cpu_rom_do +); + +-- working/char RAM 0x8000-0x8FFF +wram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 12) +port map( + clk => clock_6n, + we => wram_we, + addr => wram_addr, + d => cpu_do, + q => wram_do +); + +-- sprite RAM1 0x9000-0x90FF +spram1 : entity work.gen_ram +generic map( dWidth => 8, aWidth => 8) +port map( + clk => clock_6n, + we => spram1_we, + addr => spram_addr, + d => cpu_do, + q => spram1_do +); + +-- sprite RAM2 0x9400-0x94FF +spram2 : entity work.gen_ram +generic map( dWidth => 8, aWidth => 8) +port map( + clk => clock_6n, + we => spram2_we, + addr => spram_addr, + d => cpu_do, + q => spram2_do +); + +-- sprite line buffer 1 +splinebuf1 : entity work.gen_ram +generic map( dWidth => 4, aWidth => 8) +port map( + clk => clock_12n, + we => sp_buffer_ram1_we, + addr => sp_buffer_ram1_addr, + d => sp_buffer_ram1_di, + q => sp_buffer_ram1_do +); + +-- sprite line buffer 2 +splinebuf2 : entity work.gen_ram +generic map( dWidth => 4, aWidth => 8) +port map( + clk => clock_12n, + we => sp_buffer_ram2_we, + addr => sp_buffer_ram2_addr, + d => sp_buffer_ram2_di, + q => sp_buffer_ram2_do +); + +-- char graphics ROM G10 +char_graphics_1 : entity work.pooyan_char_grphx1 +port map( + clk => clock_6, + addr => ch_graphx_addr, + data => ch_graphx1_do +); + +-- char graphics ROM G9 +char_graphics_2 : entity work.pooyan_char_grphx2 +port map( + clk => clock_6, + addr => ch_graphx_addr, + data => ch_graphx2_do +); + +-- char palette ROM +ch_palette : entity work.pooyan_char_color_lut +port map( + clk => clock_6, + addr => ch_palette_addr, + data => ch_palette_do +); + +-- sprite graphics ROM A9 +sp_graphics_1 : entity work.pooyan_sprite_grphx1 +port map( + clk => clock_6, + addr => sp_graphx_addr, + data => sp_graphx1_do +); + +-- sprite graphics ROM A8 +sp_graphics_2 : entity work.pooyan_sprite_grphx2 +port map( + clk => clock_6, + addr => sp_graphx_addr, + data => sp_graphx2_do +); + +-- sprite palette ROM +sp_palette : entity work.pooyan_sprite_color_lut +port map( + clk => clock_6, + addr => sp_palette_addr, + data => sp_palette_do +); + +-- rgb palette ROM +rgb_palette_gb : entity work.pooyan_palette +port map( + clk => clock_6, + addr => rgb_palette_addr, + data => rgb_palette_do +); + + +-- sound board +pooyan_sound_board : entity work.pooyan_sound_board +port map( + clock_14 => clock_14, + reset => reset, + sound_trig => sound_trig, + sound_cmd => sound_cmd, + audio_out => audio_out, + dbg_cpu_addr => open + ); + +end struct; \ No newline at end of file diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/pooyan_mist.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/pooyan_mist.vhd new file mode 100644 index 00000000..c1df8803 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/pooyan_mist.vhd @@ -0,0 +1,303 @@ +--------------------------------------------------------------------------------- +-- Mist Top level for Time pilot by Dar (darfpga@aol.fr) (29/10/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- Use time_pilot_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- +-- Uses 1 pll for 12MHz and 14MHz generation from 27MHz +-- +-- Mist key : +-- Right Button : reset game +-- +-- Keyboard players inputs : +-- +-- ESC : Add coin +-- 2 : Start 2 players +-- 1 : Start 1 player +-- SPACE : Fire +-- RIGHT arrow : rotate right +-- LEFT arrow : rotate left +-- UP arrow : rotate up +-- DOWN arrow : rotate down +-- +-- Other details : see time_pilot.vhd + +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; + +entity pooyan_mist is +port( + CLOCK_27 : in std_logic; + AUDIO_L : out std_logic; + AUDIO_R : out std_logic; + VGA_R : out std_logic_vector(5 downto 0); + VGA_G : out std_logic_vector(5 downto 0); + VGA_B : out std_logic_vector(5 downto 0); + VGA_VS : out std_logic; + VGA_HS : out std_logic; + LED : out std_logic; + SPI_SCK : in std_logic; + SPI_DI : in std_logic; + SPI_DO : out std_logic; + SPI_SS3 : in std_logic; + CONF_DATA0 : in std_logic +); +end pooyan_mist; + +architecture struct of pooyan_mist is + + signal clock_48 : std_logic; + signal clock_12 : std_logic; + signal clock_14 : std_logic; + signal reset : std_logic; + signal pll_locked: std_logic; + + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic; + signal audio : std_logic_vector(10 downto 0); + signal audio_pwm : std_logic; + + signal reset_n : std_logic; + signal ps2_clk : std_logic; + signal ps2_dat : std_logic; + signal joy_u : std_logic; + signal joy_l : std_logic; + signal joy_r : std_logic; + signal joy_d : std_logic; + signal kbd_intr : std_logic; + signal kbd_scancode : std_logic_vector(7 downto 0); + + + signal scanlines : std_logic_vector(1 downto 0); + signal hq2x : std_logic; + + -- User IO + signal buttons : std_logic_vector(1 downto 0); + signal joy0 : std_logic_vector(7 downto 0); + signal joy1 : std_logic_vector(7 downto 0); + signal status : std_logic_vector(31 downto 0); + signal scandoubler_disable : std_logic; + signal ypbpr : std_logic; + signal pix_ce : std_logic; + signal kbd_joy0 : std_logic_vector(9 downto 0); + signal ps2Clk : std_logic; + signal ps2Data : std_logic; + signal ps2_scancode : std_logic_vector(7 downto 0); + + signal VGA_R_O : std_logic_vector(2 downto 0); + signal VGA_G_O : std_logic_vector(2 downto 0); + signal VGA_B_O : std_logic_vector(2 downto 0); + signal newState : std_logic_vector(2 downto 0); + signal upright : boolean; + constant CONF_STR : string := + "POOYAN;;O4,Joystick Control,Upright,Normal;O89,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;T5,Reset;"; + + + function to_slv(s: string) return std_logic_vector is + constant ss: string(1 to s'length) := s; + variable rval: std_logic_vector(1 to 8 * s'length); + variable p: integer; + variable c: integer; + begin + for i in ss'range loop + p := 8 * i; + c := character'pos(ss(i)); + rval(p - 7 to p) := std_logic_vector(to_unsigned(c,8)); + end loop; + return rval; + end function; + + component mist_io + generic ( STRLEN : integer := 0 ); + port ( + clk_sys :in std_logic; + SPI_SCK, CONF_DATA0, SPI_DI :in std_logic; + SPI_DO : out std_logic; + conf_str : in std_logic_vector(8*STRLEN-1 downto 0); + buttons : out std_logic_vector(1 downto 0); + joystick_0 : out std_logic_vector(7 downto 0); + joystick_1 : out std_logic_vector(7 downto 0); + status : out std_logic_vector(31 downto 0); + scandoubler_disable, ypbpr : out std_logic; + ps2_kbd_clk : out std_logic; + ps2_kbd_data : out std_logic + ); + end component mist_io; + + component video_mixer + generic ( LINE_LENGTH : integer := 384; HALF_DEPTH : integer := 1 ); + port ( + clk_sys, ce_pix, ce_pix_actual : in std_logic; + SPI_SCK, SPI_SS3, SPI_DI : in std_logic; + scanlines : in std_logic_vector(1 downto 0); + scandoubler_disable, hq2x, ypbpr, ypbpr_full : in std_logic; + R, G, B : in std_logic_vector(2 downto 0); + HSync, VSync, line_start, mono : in std_logic; + VGA_R,VGA_G, VGA_B : out std_logic_vector(5 downto 0); + VGA_VS, VGA_HS : out std_logic + ); + end component video_mixer; + + component keyboard + PORT( + clk : in std_logic; + reset : in std_logic; + ps2_kbd_clk : in std_logic; + ps2_kbd_data : in std_logic; + joystick : out std_logic_vector (9 downto 0) + ); + end component; + +begin + +reset <= status(0) or status(5) or buttons(1) or not pll_locked; + +clocks : entity work.mist_pll_12M_14M + port map( + inclk0 => CLOCK_27, + c0 => clock_12,--12.28800000 + c1 => clock_14,--14.31800000 + c2 => clock_48,--49.15200000 + locked => pll_locked +); + +scanlines(1) <= '1' when status(9 downto 8) = "11" and scandoubler_disable = '0' else '0'; +scanlines(0) <= '1' when status(9 downto 8) = "10" and scandoubler_disable = '0' else '0'; +hq2x <= '1' when status(9 downto 8) = "01" else '0'; + +vmixer : video_mixer + port map ( + clk_sys => clock_48, + ce_pix => pix_ce, + ce_pix_actual => pix_ce, + SPI_SCK => SPI_SCK, + SPI_SS3 => SPI_SS3, + SPI_DI => SPI_DI, + scanlines => scanlines, + scandoubler_disable => scandoubler_disable, + hq2x => hq2x, + ypbpr => ypbpr, + ypbpr_full => '1', + R => VGA_R_O, + G => VGA_G_O, + B => VGA_B_O, + HSync => hsync, + VSync => vsync, + line_start => '0', + mono => '0', + VGA_R => VGA_R, + VGA_G => VGA_G, + VGA_B => VGA_B, + VGA_VS => VGA_VS, + VGA_HS => VGA_HS +); + +mist_io_inst : mist_io + generic map (STRLEN => CONF_STR'length) + port map ( + clk_sys => clock_48, + SPI_SCK => SPI_SCK, + CONF_DATA0 => CONF_DATA0, + SPI_DI => SPI_DI, + SPI_DO => SPI_DO, + conf_str => to_slv(CONF_STR), + buttons => buttons, + scandoubler_disable => scandoubler_disable, + ypbpr => ypbpr, + joystick_1 => joy1, + joystick_0 => joy0, + status => status, + ps2_kbd_clk => ps2Clk, + ps2_kbd_data => ps2Data +); + +Joy_r <= joy0(0) or joy1(0) or kbd_joy0(7) when upright + else joy0(3) or joy1(3) or kbd_joy0(4); +Joy_l <= joy0(1) or joy1(1) or kbd_joy0(6) when upright + else joy0(2) or joy1(2) or kbd_joy0(5); +Joy_u <= joy0(3) or joy1(3) or kbd_joy0(4) when upright + else joy0(1) or joy1(1) or kbd_joy0(6); +Joy_d <= joy0(2) or joy1(2) or kbd_joy0(5) when upright + else joy0(0) or joy1(0) or kbd_joy0(7); + +process(kbd_joy0(9)) +begin + if kbd_joy0(9)= '1' then + upright <= not upright; + end if; +end process; + +--upright <= kbd_joy0(9);--Control Direction + +pooyan : entity work.pooyan + port map( + clock_12 => clock_12, + clock_14 => clock_14, + reset => reset, + video_r => VGA_R_O, + video_g => VGA_G_O, + video_b => VGA_B_O, + video_hblank => open, + video_vblank => open, + video_clk => pix_ce, + video_hs => hsync, + video_vs => vsync, + audio_out => audio, + dip_switch_1 => X"FF", -- Coinage_B / Coinage_A + dip_switch_2 => X"FB", -- Sound(8)/Difficulty(7-5)/Bonus(4)/Cocktail(3)/lives(2-1) + start2 => kbd_joy0(2) or status(3), + start1 => kbd_joy0(1) or status(2), + coin1 => kbd_joy0(3) or status(1), + fire1 => joy0(4) or joy1(4) or kbd_joy0(0), + right1 => Joy_r, + left1 => Joy_l, + down1 => Joy_d, + up1 => Joy_u, + fire2 => joy0(4) or joy1(4) or kbd_joy0(0), + right2 => Joy_r, + left2 => Joy_l, + down2 => Joy_d, + up2 => Joy_u, + sw => "0000000000", + dbg_cpu_addr => open +); + + +u_keyboard : keyboard + port map( + clk => clock_48, + reset => reset, + ps2_kbd_clk => ps2Clk, + ps2_kbd_data => ps2Data, + joystick => kbd_joy0 +); + +u_dac : entity work.dac + port map( + clk_i => clock_48, + res_n_i => not reset, + dac_i => audio, + dac_o => audio_pwm +); + +AUDIO_L <= audio_pwm; +AUDIO_R <= audio_pwm; + + LED <= '1'; +end struct; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/pooyan_sound_board.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/pooyan_sound_board.vhd new file mode 100644 index 00000000..a4b38c7d --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/pooyan_sound_board.vhd @@ -0,0 +1,426 @@ +--------------------------------------------------------------------------------- +-- Pooyan sound board by Dar (darfpga@aol.fr) (08/11/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- gen_ram.vhd +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T80/T80se - Version : 0247 +----------------------------- +-- Z80 compatible microprocessor core +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity pooyan_sound_board is +port( + clock_14 : in std_logic; + reset : in std_logic; + + sound_cmd : in std_logic_vector(7 downto 0); + sound_trig : in std_logic; + + audio_out : out std_logic_vector(10 downto 0); + + dbg_cpu_addr : out std_logic_vector(15 downto 0) + ); +end pooyan_sound_board; + +architecture struct of pooyan_sound_board is + + signal reset_n: std_logic; + signal clock_14n : std_logic; + + signal clock_div1 : std_logic_vector(11 downto 0) := (others => '0'); + signal biquinary_div : std_logic_vector(3 downto 0) := (others => '0'); + + signal cpu_clock : std_logic; + signal ayx_clock : std_logic; + + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_wr_n : std_logic; + signal cpu_mreq_n : std_logic; + signal cpu_irq_n : std_logic; + signal cpu_iorq_n : std_logic; + signal cpu_m1_n : std_logic; + + signal cpu_rom_do : std_logic_vector( 7 downto 0); + signal wram_do : std_logic_vector( 7 downto 0); + signal wram_we : std_logic; + + signal clr_irq_n : std_logic; + signal sen1_n : std_logic; + signal sen2_n : std_logic; + signal sen3_n : std_logic; + signal sen4_n : std_logic; + + signal sound_trig_r : std_logic; + + signal ay1_do : std_logic_vector(7 downto 0); + signal ay1_cs_n : std_logic; + signal ay1_bdir : std_logic; + signal ay1_bc1 : std_logic; + signal ay1_audio_muxed : std_logic_vector(7 downto 0); + signal ay1_audio_chan : std_logic_vector(1 downto 0); + signal ay1_port_b_di : std_logic_vector(7 downto 0); + + signal ay2_do : std_logic_vector(7 downto 0); + signal ay2_cs_n : std_logic; + signal ay2_bdir : std_logic; + signal ay2_bc1 : std_logic; + signal ay2_audio_muxed : std_logic_vector(7 downto 0); + signal ay2_audio_chan : std_logic_vector(1 downto 0); + + signal ay1_chan_a : std_logic_vector(7 downto 0); + signal ay1_chan_b : std_logic_vector(7 downto 0); + signal ay1_chan_c : std_logic_vector(7 downto 0); + signal ay2_chan_a : std_logic_vector(7 downto 0); + signal ay2_chan_b : std_logic_vector(7 downto 0); + signal ay2_chan_c : std_logic_vector(7 downto 0); + + signal filter_cmd_we : std_logic; + signal filter_cmd : std_logic_vector(11 downto 0); + signal mult_cmd : std_logic_vector(1 downto 0); + signal mult_value : integer range 0 to 779; + + signal Vc_1a : integer range -256*1024 to 256*1024-1; + signal Vc_1b : integer range -256*1024 to 256*1024-1; + signal Vc_1c : integer range -256*1024 to 256*1024-1; + signal Vc_2a : integer range -256*1024 to 256*1024-1; + signal Vc_2b : integer range -256*1024 to 256*1024-1; + signal Vc_2c : integer range -256*1024 to 256*1024-1; + signal Vc : integer range -256*1024 to 256*1024-1; + signal Vin : integer range -256 to 255; + signal dV : integer range -512 to 511; + signal Vcn_a : integer range -1024*1024 to 1024*1024-1; + signal Vcn_b : integer range -1024*1024 to 1024*1024-1; + signal Vcn_c : integer range -256*1024 to 256*1024-1; + +begin + +clock_14n <= not clock_14; +reset_n <= not reset; + +-- debug +process (reset, clock_14) +begin + if rising_edge(clock_14) and cpu_mreq_n ='0' then + dbg_cpu_addr <= cpu_addr; + end if; +end process; + +-------------------------------------------------------- +-- RC filters equation +-- +-- Vc : capacitor voltage = output voltage +-- fs : sample frequency +-- Vin : voltage at resistor input +-- +-- Vc(k+1) = Vc(k) + (Vin-Vc(k))/(fs.R.C) +-- +-- Vcn * 1024 <= Vcn * 1024 + (Vin-Vc) * 1024/(fs.R.C) +-- With Vcn = 1024 * Vc +-------------------------------------------------------- +-- Filters will be run at 14.318MHz/512 = 27.96KHz +-------------------------------------------------------- +-- 6 filters have to be implemented +-- RC equation is time multiplexed to save multiplier +-- for small FPGA +-------------------------------------------------------- + +-- mux Vc +with clock_div1(3 downto 0) select +Vc <= Vc_1a when X"0", -- Vc_xy : [0..255*1024] + Vc_1b when X"1", -- => Vc : [-256*1024..255*1024] + Vc_1c when X"2", + Vc_2a when X"3", + Vc_2b when X"4", + Vc_2c when others; + +-- mux Vin +with clock_div1(3 downto 0) select +Vin <= to_integer(unsigned(ay1_chan_a)) when X"0", -- ayx_chan_y : [0..255] + to_integer(unsigned(ay1_chan_b)) when X"1", -- => Vin : [-256:255] + to_integer(unsigned(ay1_chan_c)) when X"2", + to_integer(unsigned(ay2_chan_a)) when X"3", + to_integer(unsigned(ay2_chan_b)) when X"4", + to_integer(unsigned(ay2_chan_c)) when others; + +-- compute dV +dV <= Vin-Vc/1024; -- Vc/1024 : [0..255], dv : [-255..511] => [-512..511] + +-- mux filter cmd +with clock_div1(3 downto 0) select +mult_cmd <= filter_cmd( 7 downto 6) when X"0", + filter_cmd( 9 downto 8) when X"1", + filter_cmd(11 downto 10) when X"2", + filter_cmd( 1 downto 0) when X"3", + filter_cmd( 3 downto 2) when X"4", + filter_cmd( 5 downto 4) when others; + +-- mux multiplier value +with mult_cmd select +mult_value <= 779 when "10", -- 0.047uF/1KOhm => (1024/fs.R.C = 779, cut fcy 3386Hz) + 166 when "01", -- 0.220uF/1KOhm => (1024/fs.R.C = 166, cut fcy 723Hz) + 137 when "11", -- 0.267uF/1KOhm => (1024/fs.R.C = 137, cut fcy 596Hz) + 779 when others; -- Not use + +-- compute Vcn +Vcn_a <= Vin*1024 when mult_cmd = "00" else Vc + dv*mult_value; -- => Vcn_a : [-1024*1024..1023*1024] + +-- limit to > 0 +Vcn_b <= 0 when Vcn_a < 0 else Vcn_a; + +-- limit to < 255*1024 +Vcn_c <= 255*1024 when Vcn_b > 255*1024 else Vcn_b; + +-- demux/store result and mix channels +process (clock_14) +begin + if rising_edge(clock_14) then -- 14.318MHz/512 => fs = 27.96KHz + + -- demux & down sample + if clock_div1(8 downto 0) = '0'&X"00" then Vc_1a <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"01" then Vc_1b <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"02" then Vc_1c <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"03" then Vc_2a <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"04" then Vc_2b <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"05" then Vc_2c <= Vcn_c; end if; + + -- rescale and mix channels with down sample + if clock_div1(8 downto 0) = '0'&X"06" then + audio_out <= std_logic_vector(to_unsigned(Vc_1a/1024,11)) + + std_logic_vector(to_unsigned(Vc_1b/1024,11)) + + std_logic_vector(to_unsigned(Vc_1c/1024,11)) + + std_logic_vector(to_unsigned(Vc_2a/1024,11)) + + std_logic_vector(to_unsigned(Vc_2b/1024,11)) + + std_logic_vector(to_unsigned(Vc_2c/1024,11)); + end if; + end if; +end process; + + +-- divide clocks +-- random generator ? +process (clock_14) +begin + if reset='1' then + clock_div1 <= (others =>'0'); + biquinary_div <= (others =>'0'); + else + if rising_edge(clock_14) then + clock_div1 <= clock_div1 + '1'; + + if clock_div1 = X"800" then + if biquinary_div(3 downto 1) = "100" then + biquinary_div(3 downto 1) <= "000"; + biquinary_div(0) <= not biquinary_div(0); + else + biquinary_div(3 downto 1) <= biquinary_div(3 downto 1) + '1'; + end if; + end if; + + end if; + end if; +end process; + +-- make clocks for cpu and sound generators +cpu_clock <= clock_div1(2); +ayx_clock <= not clock_div1(2); + +-- mux rom/ram/devices data ouput to cpu data input w.r.t cpu address +cpu_di <= cpu_rom_do when cpu_addr(15 downto 12) = "0000" else -- 0000-0FFF + wram_do when cpu_addr(15 downto 12) = "0011" else -- 3000-3FFF + ay1_do when cpu_addr(15 downto 13) = "010" else -- 4000-5FFF + ay2_do when cpu_addr(15 downto 13) = "011" else -- 6000-7FFF + X"FF"; + +-- write enable to working ram and filter command register +wram_we <= '1' when cpu_wr_n = '0' and cpu_addr(15 downto 12) = "0011" else '0'; +filter_cmd_we <= '1' when cpu_wr_n = '0' and cpu_addr(15) = '1' else '0'; + +-- chip select with r/w direction to AY chips +sen1_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"4" else '1'; +sen2_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"5" else '1'; +sen3_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"6" else '1'; +sen4_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"7" else '1'; + +-- finalise AY r/w & address controls +ay1_bc1 <= not sen2_n or ( cpu_wr_n and not sen1_n); +ay1_bdir <= not sen2_n or (not cpu_wr_n and not sen1_n); +ay1_cs_n <= sen1_n and sen2_n; + +ay2_bc1 <= not sen4_n or ( cpu_wr_n and not sen3_n); +ay2_bdir <= not sen4_n or (not cpu_wr_n and not sen3_n); +ay2_cs_n <= sen3_n and sen4_n; + +-- input random (?) to AY1 chip +ay1_port_b_di <= biquinary_div(0)&biquinary_div(3)&biquinary_div(2)&clock_div1(11)&"0000"; + +-- clear irq when reset and irq acknowledge +clr_irq_n <= reset_n and (cpu_m1_n or cpu_iorq_n); + +-- regsiter filters commands (11 bits data are cpu address) +process (cpu_clock) +begin + if rising_edge(cpu_clock) then + if filter_cmd_we = '1' then filter_cmd <= cpu_addr(11 downto 0); end if; + end if; +end process; + +-- latch sound trigger rising edge to set cpu_irq, and manage clear +process (clock_14) +begin + if rising_edge(clock_14) then + + sound_trig_r <= sound_trig; + + if clr_irq_n = '0' then + cpu_irq_n <= '1'; + else + if sound_trig ='1' and sound_trig_r = '0' then + cpu_irq_n <= '0'; + end if; + end if; + + end if; +end process; + +-- demux AY chips output +process (ayx_clock) +begin + if rising_edge(ayx_clock) then + if ay1_audio_chan = "00" then ay1_chan_a <= ay1_audio_muxed; end if; + if ay1_audio_chan = "01" then ay1_chan_b <= ay1_audio_muxed; end if; + if ay1_audio_chan = "10" then ay1_chan_c <= ay1_audio_muxed; end if; + if ay2_audio_chan = "00" then ay2_chan_a <= ay2_audio_muxed; end if; + if ay2_audio_chan = "01" then ay2_chan_b <= ay2_audio_muxed; end if; + if ay2_audio_chan = "10" then ay2_chan_c <= ay2_audio_muxed; end if; + end if; +end process; + +-- microprocessor Z80 +cpu : entity work.T80se +generic map(Mode => 0, T2Write => 1, IOWait => 1) +port map( + RESET_n => reset_n, + CLK_n => cpu_clock, + CLKEN => '1', + WAIT_n => '1', + INT_n => cpu_irq_n, + NMI_n => '1', + BUSRQ_n => '1', + M1_n => cpu_m1_n, + MREQ_n => cpu_mreq_n, + IORQ_n => cpu_iorq_n, + RD_n => open, + WR_n => cpu_wr_n, + RFSH_n => open, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_di, + DO => cpu_do +); + +-- cpu1 program ROM +rom_cpu1 : entity work.pooyan_sound_prog +port map( + clk => clock_14n, + addr => cpu_addr(12 downto 0), + data => cpu_rom_do +); + +-- working RAM +wram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 10) +port map( + clk => clock_14n, + we => wram_we, + addr => cpu_addr(9 downto 0), + d => cpu_do, + q => wram_do +); + +-- AY-3-8910 #1 +ay_3_8910_1 : entity work.YM2149 +port map( + -- data bus + I_DA => cpu_do, -- in std_logic_vector(7 downto 0); + O_DA => ay1_do, -- out std_logic_vector(7 downto 0); + O_DA_OE_L => open, -- out std_logic; + -- control + I_A9_L => ay1_cs_n, -- in std_logic; + I_A8 => '1', -- in std_logic; + I_BDIR => ay1_bdir, -- in std_logic; + I_BC2 => '1', -- in std_logic; + I_BC1 => ay1_bc1, -- in std_logic; + I_SEL_L => '1', -- in std_logic; + + O_AUDIO => ay1_audio_muxed, -- out std_logic_vector(7 downto 0); + O_CHAN => ay1_audio_chan, -- out std_logic_vector(1 downto 0); + + -- port a + I_IOA => sound_cmd, -- in std_logic_vector(7 downto 0); + O_IOA => open, -- out std_logic_vector(7 downto 0); + O_IOA_OE_L => open, -- out std_logic; + -- port b + I_IOB => ay1_port_b_di, -- in std_logic_vector(7 downto 0); + O_IOB => open, -- out std_logic_vector(7 downto 0); + O_IOB_OE_L => open, -- out std_logic; + + ENA => '1', --cpu_ena, -- in std_logic; -- clock enable for higher speed operation + RESET_L => reset_n, -- in std_logic; + CLK => ayx_clock -- in std_logic -- note 6 Mhz +); + +-- AY-3-8910 #2 +ay_3_8910_2 : entity work.YM2149 +port map( + -- data bus + I_DA => cpu_do, -- in std_logic_vector(7 downto 0); + O_DA => ay2_do, -- out std_logic_vector(7 downto 0); + O_DA_OE_L => open, -- out std_logic; + -- control + I_A9_L => ay2_cs_n, -- in std_logic; + I_A8 => '1', -- in std_logic; + I_BDIR => ay2_bdir, -- in std_logic; + I_BC2 => '1', -- in std_logic; + I_BC1 => ay2_bc1, -- in std_logic; + I_SEL_L => '1', -- in std_logic; + + O_AUDIO => ay2_audio_muxed, -- out std_logic_vector(7 downto 0); + O_CHAN => ay2_audio_chan, -- out std_logic_vector(1 downto 0); + + -- port a + I_IOA => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOA => open, -- out std_logic_vector(7 downto 0); + O_IOA_OE_L => open, -- out std_logic; + -- port b + I_IOB => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOB => open, -- out std_logic_vector(7 downto 0); + O_IOB_OE_L => open, -- out std_logic; + + ENA => '1', --cpu_ena, -- in std_logic; -- clock enable for higher speed operation + RESET_L => reset_n, -- in std_logic; + CLK => ayx_clock -- in std_logic -- note 6 Mhz +); + + +end struct; \ No newline at end of file diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_char_color_lut.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_char_color_lut.vhd new file mode 100644 index 00000000..d8739c6b --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_char_color_lut.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_char_color_lut is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_char_color_lut is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"03",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"03",X"01",X"03",X"03",X"04",X"04",X"07",X"08",X"09",X"0F",X"0B",X"0C",X"0D",X"0E",X"0F",X"03", + X"03",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"03",X"04",X"05",X"06",X"0F",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"01",X"02",X"03", + X"03",X"05",X"06",X"07",X"0F",X"09",X"07",X"08",X"06",X"0D",X"0E",X"0F",X"01",X"02",X"03",X"04", + X"03",X"02",X"07",X"08",X"04",X"0A",X"08",X"06",X"07",X"0E",X"0F",X"01",X"02",X"03",X"04",X"05", + X"03",X"07",X"08",X"09",X"0A",X"0B",X"07",X"06",X"08",X"0F",X"01",X"02",X"03",X"04",X"05",X"06", + X"03",X"08",X"09",X"0A",X"05",X"0C",X"06",X"08",X"07",X"01",X"02",X"03",X"04",X"05",X"06",X"07", + X"03",X"09",X"0A",X"0B",X"0C",X"0D",X"08",X"06",X"06",X"02",X"03",X"04",X"05",X"06",X"07",X"08", + X"03",X"03",X"0B",X"0C",X"04",X"0E",X"07",X"07",X"08",X"03",X"04",X"05",X"06",X"07",X"08",X"09", + X"03",X"0B",X"0C",X"0D",X"0E",X"0F",X"07",X"06",X"08",X"04",X"05",X"06",X"07",X"08",X"09",X"0A", + X"03",X"0C",X"0D",X"0E",X"0F",X"01",X"08",X"07",X"06",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B", + X"03",X"0D",X"0E",X"0F",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C", + X"03",X"0E",X"0F",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D", + X"03",X"0F",X"01",X"02",X"04",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E", + X"03",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_char_grphx1.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_char_grphx1.vhd new file mode 100644 index 00000000..9e545ca5 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_char_grphx1.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_char_grphx1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_char_grphx1 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"30",X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"F0",X"F0",X"30",X"00", + X"00",X"10",X"30",X"00",X"F0",X"F0",X"F0",X"00",X"C0",X"80",X"00",X"00",X"C0",X"E0",X"C0",X"00", + X"00",X"00",X"00",X"00",X"30",X"30",X"10",X"00",X"00",X"10",X"10",X"70",X"F0",X"E0",X"C0",X"00", + X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"33",X"33",X"CC",X"19", + X"00",X"88",X"44",X"00",X"00",X"55",X"22",X"00",X"30",X"33",X"30",X"30",X"33",X"30",X"20",X"00", + X"13",X"13",X"13",X"03",X"00",X"00",X"00",X"00",X"0F",X"0F",X"09",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F0",X"F0",X"FF",X"F0",X"F0",X"FF",X"F0",X"CC",X"C0",X"C0",X"CC",X"C0",X"C0",X"CC",X"C0", + X"FF",X"EE",X"BB",X"22",X"22",X"55",X"30",X"70",X"88",X"11",X"00",X"40",X"C0",X"CC",X"C0",X"C0", + X"F0",X"FF",X"E0",X"C0",X"88",X"44",X"EE",X"00",X"80",X"44",X"44",X"00",X"00",X"00",X"00",X"00", + X"00",X"88",X"F9",X"FF",X"F9",X"F9",X"F9",X"88",X"30",X"33",X"E2",X"E2",X"E2",X"EE",X"E2",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"0C",X"0C",X"0C",X"0F",X"0F",X"0F",X"00",X"00",X"02",X"06",X"0C",X"0C",X"08",X"00",X"00", + X"0C",X"0C",X"04",X"0C",X"0C",X"04",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"51",X"31",X"50",X"75",X"00",X"00",X"33",X"FF",X"FF",X"FF",X"FF",X"FE", + X"00",X"10",X"60",X"30",X"00",X"00",X"00",X"00",X"F0",X"F7",X"77",X"F0",X"F1",X"00",X"00",X"00", + X"00",X"01",X"01",X"70",X"F0",X"D0",X"00",X"00",X"0C",X"08",X"68",X"24",X"E0",X"60",X"08",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"00",X"00",X"88",X"88",X"88",X"88",X"00",X"00",X"00",X"11",X"23",X"11",X"00",X"00",X"00", + X"77",X"77",X"77",X"33",X"51",X"00",X"00",X"00",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"33",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"11",X"00",X"22",X"00",X"00",X"00",X"88",X"EE",X"FF", + X"00",X"0F",X"01",X"CC",X"FF",X"00",X"11",X"CC",X"17",X"3F",X"3F",X"37",X"FF",X"00",X"EE",X"FF", + X"00",X"00",X"00",X"70",X"F0",X"D0",X"00",X"00",X"06",X"0E",X"2C",X"24",X"E0",X"60",X"0C",X"06", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"76",X"33",X"03",X"01",X"13",X"BB",X"EE",X"99",X"DD",X"9B",X"07",X"CF",X"DF",X"FF",X"11", + X"00",X"77",X"11",X"00",X"00",X"08",X"08",X"04",X"00",X"00",X"88",X"44",X"22",X"00",X"00",X"04", + X"11",X"22",X"CC",X"33",X"00",X"0C",X"0F",X"07",X"88",X"44",X"00",X"00",X"00",X"07",X"0F",X"08", + X"00",X"11",X"66",X"88",X"00",X"13",X"67",X"88",X"66",X"99",X"00",X"00",X"00",X"08",X"00",X"00", + X"33",X"22",X"CC",X"00",X"00",X"11",X"EE",X"00",X"88",X"00",X"00",X"33",X"44",X"88",X"00",X"00", + X"00",X"00",X"00",X"FF",X"FF",X"88",X"00",X"00",X"00",X"00",X"FF",X"FF",X"88",X"00",X"00",X"00", + X"00",X"AA",X"22",X"11",X"00",X"00",X"88",X"00",X"00",X"00",X"CC",X"66",X"11",X"EE",X"66",X"11", + X"66",X"26",X"33",X"00",X"00",X"00",X"00",X"00",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"33",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"22",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"99",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"BF",X"FE",X"A8",X"60",X"C0",X"80",X"00",X"C0",X"C0",X"51",X"31",X"11",X"00",X"00",X"00", + X"00",X"11",X"33",X"47",X"8C",X"01",X"33",X"00",X"33",X"FF",X"CC",X"00",X"00",X"0E",X"FF",X"33", + X"33",X"46",X"8C",X"00",X"00",X"11",X"33",X"33",X"00",X"00",X"00",X"00",X"33",X"FF",X"EE",X"88", + X"3F",X"37",X"3F",X"13",X"13",X"3F",X"37",X"3F",X"8C",X"CE",X"CF",X"8F",X"8E",X"CE",X"CC",X"8C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"26",X"17",X"13",X"13",X"13",X"01",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"EE",X"EE", + X"CC",X"CC",X"6E",X"3F",X"DF",X"7F",X"7F",X"0F",X"00",X"00",X"00",X"88",X"88",X"CC",X"EE",X"6E", + X"66",X"66",X"33",X"11",X"00",X"11",X"33",X"67",X"11",X"22",X"99",X"EE",X"3B",X"2A",X"7F",X"99", + X"00",X"00",X"00",X"11",X"B3",X"73",X"B1",X"73",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FE",X"EC", + X"00",X"11",X"33",X"37",X"13",X"13",X"00",X"00",X"88",X"88",X"00",X"00",X"88",X"0C",X"8C",X"00", + X"00",X"00",X"00",X"23",X"23",X"11",X"00",X"00",X"00",X"00",X"02",X"00",X"08",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"03",X"66",X"CC",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00", + X"33",X"33",X"01",X"01",X"01",X"00",X"00",X"00",X"6E",X"6E",X"6E",X"FF",X"6E",X"2E",X"2E",X"3F", + X"DF",X"57",X"57",X"57",X"47",X"47",X"23",X"33",X"CC",X"CC",X"CC",X"EE",X"CC",X"CC",X"4C",X"4C", + X"00",X"13",X"22",X"22",X"02",X"01",X"01",X"00",X"66",X"66",X"CC",X"CC",X"CC",X"66",X"66",X"66", + X"CC",X"00",X"00",X"22",X"CC",X"11",X"00",X"11",X"04",X"00",X"DD",X"DD",X"BB",X"33",X"66",X"CC", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"BF",X"9F",X"07",X"03",X"06",X"08",X"00",X"13",X"9F",X"CE",X"CC",X"6E",X"66",X"33",X"00", + X"04",X"04",X"08",X"09",X"09",X"1D",X"03",X"00",X"17",X"1F",X"3F",X"7F",X"EE",X"89",X"02",X"0C", + X"00",X"00",X"00",X"00",X"88",X"CC",X"EF",X"3F",X"37",X"17",X"88",X"88",X"00",X"00",X"33",X"CF", + X"00",X"00",X"00",X"88",X"CC",X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"FF",X"BB", + X"CC",X"89",X"13",X"1B",X"26",X"00",X"9B",X"45",X"19",X"2A",X"AA",X"AB",X"AB",X"CE",X"8C",X"08", + X"EF",X"EF",X"4D",X"11",X"33",X"66",X"88",X"CC",X"89",X"CD",X"CD",X"BB",X"BB",X"33",X"11",X"11", + X"44",X"44",X"44",X"44",X"88",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"CC",X"EE",X"33", + X"44",X"23",X"0B",X"00",X"04",X"01",X"01",X"03",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"00", + X"70",X"30",X"11",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"CC",X"C0",X"40",X"00",X"00",X"00", + X"8B",X"01",X"44",X"47",X"03",X"03",X"02",X"01",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"07",X"8B",X"03",X"11",X"01",X"02",X"01",X"00",X"0F",X"00",X"00",X"00",X"0F",X"88",X"CC", + X"00",X"00",X"20",X"50",X"20",X"50",X"20",X"00",X"00",X"44",X"33",X"11",X"FF",X"33",X"66",X"44", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"CC", + X"00",X"99",X"66",X"00",X"00",X"00",X"00",X"00",X"EE",X"00",X"EE",X"22",X"11",X"00",X"00",X"00", + X"21",X"31",X"D1",X"70",X"10",X"00",X"22",X"76",X"0F",X"8F",X"F7",X"F2",X"F0",X"00",X"10",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"03",X"03",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"1F",X"0F",X"1F",X"FF",X"4F",X"EF",X"8F",X"BF",X"EF",X"8F",X"CF",X"8F",X"8F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"EF",X"CF",X"FF",X"AF",X"1F",X"6F",X"5F",X"9F",X"FF",X"BF",X"FF",X"BF",X"7F", + X"0F",X"6F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"4F",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"BF",X"0F",X"0F",X"0F",X"0F",X"EF",X"CF",X"8F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"06",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"1F",X"0F",X"0F",X"0F",X"1F",X"3F",X"BF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"01",X"FF",X"33",X"77",X"22",X"08",X"0D",X"0F",X"0F", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"07",X"07",X"0F",X"0F",X"07", + X"00",X"00",X"88",X"CC",X"CC",X"EE",X"E2",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"2F",X"3F",X"1F",X"1F",X"3F",X"6F",X"3F", + X"00",X"00",X"00",X"01",X"07",X"8F",X"CF",X"CF",X"00",X"60",X"F0",X"3C",X"0F",X"0F",X"0F",X"0F", + X"00",X"B0",X"F0",X"F0",X"E1",X"0F",X"0F",X"0F",X"CF",X"78",X"E1",X"6D",X"ED",X"EF",X"6F",X"0F", + X"0F",X"0F",X"07",X"03",X"07",X"0F",X"0F",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0", + X"EE",X"7F",X"5F",X"9F",X"3F",X"6F",X"0F",X"1F",X"00",X"00",X"CC",X"CC",X"88",X"CC",X"EE",X"EE", + X"88",X"CC",X"4C",X"88",X"EE",X"FF",X"7F",X"6E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"F0",X"F0",X"C0",X"00",X"00",X"01",X"00",X"00",X"C0",X"F0",X"70",X"16",X"0F",X"7E", + X"00",X"10",X"10",X"70",X"F0",X"C3",X"C3",X"87",X"C3",X"C3",X"87",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"21",X"61",X"43",X"43", + X"88",X"CC",X"CC",X"EE",X"BF",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"66",X"AE",X"1F", + X"2F",X"6F",X"FF",X"7F",X"6E",X"FF",X"2F",X"0F",X"7F",X"EE",X"DD",X"44",X"00",X"88",X"EE",X"DF", + X"0F",X"1F",X"0F",X"2F",X"3F",X"FF",X"FF",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3F",X"FF",X"FF",X"FF",X"FF",X"BF",X"0F",X"0F",X"BF",X"FF",X"FF",X"FF",X"7F",X"2F",X"0F",X"0F", + X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"6E",X"BF",X"1F",X"3F",X"DD",X"88",X"33",X"FF",X"00",X"00",X"88",X"88",X"88",X"77",X"FF",X"FF", + X"00",X"00",X"80",X"F0",X"F0",X"1E",X"0F",X"0F",X"00",X"00",X"F0",X"F0",X"F0",X"87",X"0F",X"0F", + X"FF",X"FF",X"7F",X"FF",X"1F",X"7F",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"06",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"08",X"00",X"00",X"00",X"00", + X"00",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"88",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"F0",X"F0",X"E1",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"08",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"33",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"07",X"03",X"00",X"01",X"0F",X"0F",X"EF",X"6F",X"7F",X"7F",X"6E",X"CC", + X"00",X"01",X"C1",X"F0",X"E1",X"0F",X"0E",X"19",X"0E",X"0F",X"0F",X"3F",X"1F",X"3F",X"6F",X"CF", + X"0F",X"1F",X"2F",X"0F",X"0F",X"1F",X"0F",X"0F",X"6E",X"FF",X"7F",X"FF",X"EE",X"FF",X"7F",X"EE", + X"8F",X"CF",X"67",X"33",X"67",X"67",X"CF",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"7F",X"9F",X"3F",X"1F",X"7F",X"3F",X"0F", + X"F0",X"F0",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F",X"F0",X"E1",X"E1",X"C3",X"0F",X"0F",X"0F",X"0F", + X"CF",X"EF",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"07",X"00",X"00",X"00",X"88",X"FF", + X"00",X"00",X"C0",X"C0",X"80",X"80",X"00",X"00",X"20",X"20",X"00",X"00",X"40",X"80",X"00",X"00", + X"52",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1E",X"1E",X"02",X"01",X"00",X"20",X"01",X"00", + X"1E",X"2C",X"48",X"48",X"0C",X"08",X"00",X"00",X"86",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"0F", + X"00",X"30",X"70",X"70",X"30",X"10",X"00",X"00",X"70",X"C0",X"00",X"80",X"F0",X"F0",X"70",X"00", + X"00",X"00",X"00",X"10",X"F0",X"F0",X"E0",X"00",X"00",X"20",X"60",X"E0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"00",X"00",X"22",X"10",X"10",X"20",X"F0",X"F0", + X"00",X"00",X"30",X"20",X"A0",X"B0",X"F0",X"F0",X"88",X"88",X"AA",X"22",X"44",X"88",X"11",X"71", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"20",X"40",X"73",X"40",X"20",X"10", + X"10",X"C0",X"A8",X"98",X"F6",X"98",X"A8",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"20",X"31",X"20",X"10",X"00",X"60",X"E0",X"54",X"44",X"FB",X"44",X"54", + X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"20",X"51",X"40",X"51",X"20",X"10", + X"10",X"D0",X"20",X"54",X"90",X"54",X"20",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"20",X"20",X"20",X"10",X"10",X"20",X"E0",X"10",X"AA",X"40",X"AA",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"B3",X"F7",X"76",X"76",X"76",X"F7",X"B3",X"00",X"88",X"C4",X"40",X"C0",X"40",X"C4",X"88", + X"00",X"22",X"11",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"40",X"98",X"11",X"98",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"C0",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"30",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0", + X"00",X"00",X"80",X"E0",X"F0",X"C0",X"00",X"00",X"00",X"00",X"10",X"70",X"F0",X"30",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"C0",X"C0",X"C0",X"C0",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00", + X"00",X"C0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"30",X"F0",X"F0",X"F0",X"F0",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"00", + X"FF",X"FF",X"FF",X"77",X"B3",X"11",X"00",X"00",X"FC",X"EC",X"FE",X"FF",X"FF",X"FF",X"77",X"00", + X"0F",X"0A",X"0F",X"0A",X"0A",X"0F",X"0A",X"0F",X"0F",X"0A",X"0F",X"0A",X"0A",X"0F",X"0A",X"0F", + X"E2",X"22",X"E2",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E4",X"64",X"E4",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"CC",X"E4",X"64",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"C0",X"F0",X"F0",X"F0",X"F0",X"E0",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0C",X"78", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"07",X"01", + X"00",X"00",X"08",X"08",X"0C",X"0C",X"0F",X"0F",X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"00",X"00",X"00",X"00",X"00", + X"E1",X"F0",X"F0",X"F0",X"30",X"00",X"00",X"00",X"1E",X"F0",X"F0",X"96",X"C3",X"F0",X"30",X"00", + X"88",X"88",X"88",X"22",X"00",X"11",X"00",X"00",X"AA",X"54",X"30",X"33",X"30",X"30",X"33",X"30", + X"F0",X"F0",X"F0",X"F0",X"30",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"60",X"00", + X"C0",X"F0",X"F2",X"FC",X"EC",X"98",X"00",X"00",X"C4",X"C0",X"D1",X"31",X"11",X"C4",X"44",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0C",X"78",X"34", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"0F",X"07",X"07",X"70",X"F0", + X"00",X"00",X"08",X"08",X"0C",X"0C",X"86",X"E1",X"30",X"30",X"30",X"10",X"00",X"00",X"00",X"68", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"C3",X"21",X"10",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"C3",X"5A",X"F0",X"30",X"00", + X"00",X"00",X"0B",X"40",X"80",X"20",X"F0",X"F0",X"00",X"00",X"08",X"0C",X"06",X"02",X"02",X"83", + X"F0",X"F0",X"F0",X"70",X"10",X"00",X"00",X"00",X"81",X"E1",X"F0",X"F0",X"F0",X"F0",X"60",X"20", + X"00",X"0F",X"00",X"00",X"51",X"0F",X"50",X"75",X"00",X"0F",X"33",X"FF",X"FF",X"0F",X"FF",X"FE", + X"00",X"0F",X"88",X"CC",X"CC",X"0F",X"F2",X"32",X"00",X"0F",X"00",X"60",X"F1",X"0F",X"F1",X"E0", + X"77",X"0F",X"77",X"33",X"51",X"0F",X"00",X"00",X"FE",X"0F",X"FF",X"FF",X"FF",X"0F",X"33",X"00", + X"F2",X"0F",X"F2",X"EE",X"CC",X"0F",X"88",X"00",X"E0",X"0F",X"F1",X"F1",X"F1",X"0F",X"00",X"00", + X"00",X"0F",X"00",X"11",X"B3",X"0F",X"B1",X"FB",X"00",X"0F",X"77",X"FF",X"FF",X"0F",X"FC",X"C8", + X"00",X"0F",X"00",X"88",X"98",X"0F",X"FC",X"FC",X"00",X"0F",X"22",X"E2",X"E2",X"0F",X"C0",X"C0", + X"FF",X"0F",X"FF",X"77",X"B3",X"0F",X"00",X"00",X"F8",X"0F",X"FC",X"FF",X"FF",X"0F",X"77",X"00", + X"FC",X"0F",X"FC",X"DC",X"98",X"0F",X"00",X"00",X"C0",X"0F",X"C0",X"C0",X"E2",X"0F",X"22",X"00", + X"00",X"31",X"20",X"71",X"E0",X"71",X"70",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00", + X"00",X"00",X"CC",X"66",X"EE",X"44",X"EE",X"DC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"31",X"31",X"F0",X"73",X"30",X"00",X"00",X"F3",X"FF",X"FE",X"F0",X"F0",X"F0",X"F0",X"30", + X"EE",X"FE",X"FC",X"F1",X"F0",X"F0",X"80",X"00",X"80",X"91",X"DD",X"F9",X"D1",X"80",X"00",X"00", + X"00",X"00",X"31",X"20",X"31",X"70",X"70",X"70",X"00",X"00",X"44",X"FF",X"77",X"66",X"AA",X"77", + X"CC",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"30",X"71",X"31",X"70",X"F0",X"00",X"00",X"B3",X"F3",X"FF",X"FE",X"F0",X"F0",X"B0",X"00", + X"73",X"FB",X"F8",X"F8",X"F0",X"80",X"00",X"00",X"88",X"CC",X"CC",X"D1",X"B1",X"C0",X"71",X"77", + X"C0",X"60",X"FC",X"F2",X"F0",X"F0",X"F0",X"F0",X"00",X"11",X"71",X"51",X"C0",X"C0",X"C0",X"F3", + X"00",X"00",X"30",X"A8",X"A0",X"F0",X"F0",X"F0",X"00",X"88",X"88",X"11",X"31",X"D1",X"80",X"80", + X"F0",X"F0",X"F0",X"E0",X"E2",X"CC",X"00",X"00",X"E0",X"E0",X"F0",X"80",X"80",X"E2",X"22",X"00", + X"F0",X"F0",X"F0",X"F0",X"D8",X"D0",X"80",X"00",X"EE",X"33",X"11",X"22",X"44",X"C4",X"44",X"00", + X"00",X"00",X"00",X"11",X"F3",X"73",X"FF",X"FF",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"FF", + X"10",X"10",X"00",X"00",X"00",X"88",X"88",X"8A",X"00",X"00",X"00",X"00",X"23",X"23",X"00",X"23", + X"FF",X"FF",X"77",X"77",X"33",X"11",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"E0",X"00", + X"8B",X"89",X"CD",X"CC",X"98",X"10",X"00",X"00",X"23",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"91",X"F3",X"73",X"FF",X"FF",X"FF",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"10",X"10",X"00",X"00",X"00",X"88",X"8A",X"8F",X"00",X"00",X"00",X"00",X"00",X"23",X"23",X"00", + X"FF",X"77",X"77",X"33",X"11",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"70",X"00",X"00", + X"89",X"CC",X"C4",X"89",X"10",X"10",X"00",X"00",X"23",X"23",X"01",X"00",X"00",X"00",X"00",X"00", + X"11",X"F3",X"73",X"FF",X"FF",X"FF",X"FF",X"77",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"10",X"10",X"88",X"88",X"8A",X"CF",X"CD",X"CC",X"00",X"00",X"00",X"00",X"00",X"22",X"23",X"01", + X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"70",X"00",X"00",X"00",X"00", + X"C8",X"80",X"88",X"01",X"10",X"10",X"00",X"00",X"44",X"67",X"23",X"01",X"00",X"00",X"00",X"00", + X"1E",X"2C",X"48",X"48",X"0C",X"08",X"00",X"00",X"86",X"D1",X"33",X"11",X"30",X"70",X"70",X"70", + X"52",X"88",X"CC",X"88",X"C0",X"E0",X"E0",X"E0",X"1E",X"1E",X"02",X"01",X"00",X"20",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"70",X"70",X"30",X"11",X"33",X"11", + X"C0",X"E0",X"E0",X"E0",X"C0",X"88",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"70",X"F0",X"30",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"F0",X"70",X"10",X"00",X"11",X"33", + X"00",X"00",X"00",X"00",X"10",X"30",X"00",X"00",X"FC",X"44",X"00",X"70",X"F0",X"F0",X"F0",X"70", + X"00",X"00",X"00",X"10",X"70",X"F0",X"30",X"10",X"00",X"00",X"33",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"30",X"10",X"00",X"00",X"00",X"00",X"70",X"F0",X"F0",X"F0",X"70",X"00",X"00",X"00", + X"10",X"30",X"F0",X"70",X"10",X"00",X"11",X"33",X"F0",X"F0",X"F0",X"F0",X"F0",X"33",X"10",X"F0", + X"74",X"CC",X"00",X"70",X"F0",X"F0",X"F0",X"70",X"C0",X"60",X"FC",X"F2",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"33",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"30",X"A8",X"E0",X"F0",X"F0",X"F0", + X"70",X"F0",X"F0",X"F0",X"70",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"E0",X"E2",X"CC",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"33",X"30",X"E0",X"F0",X"F0",X"F0",X"F0",X"D8",X"D0",X"80",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_char_grphx2.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_char_grphx2.vhd new file mode 100644 index 00000000..34c88aeb --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_char_grphx2.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_char_grphx2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_char_grphx2 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"30",X"70",X"C0",X"80",X"80",X"70",X"30",X"00",X"80",X"C0",X"20",X"20",X"60",X"C0",X"80",X"00", + X"00",X"00",X"F0",X"F0",X"40",X"00",X"00",X"00",X"20",X"20",X"E0",X"E0",X"20",X"20",X"00",X"00", + X"60",X"F0",X"B0",X"90",X"90",X"C0",X"40",X"00",X"20",X"20",X"A0",X"A0",X"E0",X"E0",X"60",X"00", + X"80",X"D0",X"F0",X"B0",X"90",X"80",X"00",X"00",X"C0",X"E0",X"20",X"20",X"20",X"60",X"40",X"00", + X"00",X"F0",X"F0",X"C0",X"60",X"30",X"10",X"00",X"80",X"E0",X"E0",X"80",X"80",X"80",X"80",X"00", + X"10",X"B0",X"A0",X"A0",X"A0",X"E0",X"E0",X"00",X"C0",X"E0",X"20",X"20",X"20",X"60",X"40",X"00", + X"00",X"90",X"90",X"90",X"D0",X"70",X"30",X"00",X"C0",X"E0",X"20",X"20",X"20",X"E0",X"C0",X"00", + X"C0",X"E0",X"B0",X"90",X"80",X"C0",X"C0",X"00",X"00",X"00",X"00",X"E0",X"E0",X"00",X"00",X"00", + X"00",X"60",X"90",X"90",X"B0",X"F0",X"60",X"00",X"C0",X"E0",X"A0",X"20",X"20",X"20",X"C0",X"00", + X"70",X"F0",X"90",X"90",X"90",X"F0",X"60",X"00",X"80",X"C0",X"60",X"20",X"20",X"20",X"00",X"00", + X"30",X"40",X"80",X"A0",X"A0",X"90",X"40",X"30",X"C0",X"20",X"10",X"50",X"50",X"90",X"20",X"C0", + X"00",X"00",X"C0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"B0",X"30",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"30",X"10",X"00",X"00",X"10",X"10",X"70",X"F0",X"E0",X"C0",X"00", + X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"70",X"C0",X"80",X"C0",X"70",X"30",X"00",X"E0",X"E0",X"80",X"80",X"80",X"E0",X"E0",X"00", + X"60",X"F0",X"90",X"90",X"90",X"F0",X"F0",X"00",X"C0",X"E0",X"20",X"20",X"20",X"E0",X"E0",X"00", + X"40",X"C0",X"80",X"80",X"C0",X"70",X"30",X"00",X"40",X"60",X"20",X"20",X"60",X"C0",X"80",X"00", + X"30",X"70",X"C0",X"80",X"80",X"F0",X"F0",X"00",X"80",X"C0",X"60",X"20",X"20",X"E0",X"E0",X"00", + X"80",X"90",X"90",X"90",X"F0",X"F0",X"00",X"00",X"20",X"20",X"20",X"20",X"E0",X"E0",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"00", + X"90",X"90",X"90",X"90",X"C0",X"70",X"30",X"00",X"E0",X"E0",X"20",X"20",X"60",X"C0",X"80",X"00", + X"F0",X"F0",X"10",X"10",X"10",X"F0",X"F0",X"00",X"E0",X"E0",X"00",X"00",X"00",X"E0",X"E0",X"00", + X"80",X"80",X"F0",X"F0",X"80",X"80",X"00",X"00",X"20",X"20",X"E0",X"E0",X"20",X"20",X"00",X"00", + X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"20",X"20",X"20",X"60",X"40",X"00", + X"80",X"C0",X"60",X"30",X"10",X"F0",X"F0",X"00",X"20",X"60",X"E0",X"C0",X"80",X"E0",X"E0",X"00", + X"00",X"00",X"00",X"00",X"F0",X"F0",X"00",X"00",X"20",X"20",X"20",X"20",X"E0",X"E0",X"00",X"00", + X"F0",X"F0",X"70",X"30",X"70",X"F0",X"F0",X"00",X"E0",X"E0",X"00",X"80",X"00",X"E0",X"E0",X"00", + X"F0",X"F0",X"10",X"30",X"70",X"F0",X"F0",X"00",X"E0",X"E0",X"C0",X"80",X"00",X"E0",X"E0",X"00", + X"70",X"F0",X"80",X"80",X"80",X"F0",X"70",X"00",X"C0",X"E0",X"20",X"20",X"20",X"E0",X"C0",X"00", + X"70",X"F0",X"80",X"80",X"80",X"F0",X"F0",X"00",X"00",X"80",X"80",X"80",X"80",X"E0",X"E0",X"00", + X"70",X"F0",X"80",X"80",X"80",X"F0",X"70",X"00",X"A0",X"C0",X"E0",X"A0",X"60",X"E0",X"C0",X"00", + X"70",X"F0",X"90",X"80",X"80",X"F0",X"F0",X"00",X"20",X"60",X"E0",X"C0",X"80",X"E0",X"E0",X"00", + X"00",X"50",X"D0",X"90",X"90",X"F0",X"60",X"00",X"C0",X"E0",X"20",X"20",X"20",X"60",X"40",X"00", + X"80",X"80",X"F0",X"F0",X"80",X"80",X"00",X"00",X"00",X"00",X"E0",X"E0",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"00",X"00",X"00",X"F0",X"F0",X"00",X"C0",X"E0",X"20",X"20",X"20",X"E0",X"C0",X"00", + X"F0",X"F0",X"10",X"00",X"10",X"F0",X"F0",X"00",X"00",X"80",X"C0",X"E0",X"C0",X"80",X"00",X"00", + X"F0",X"F0",X"10",X"30",X"10",X"F0",X"F0",X"00",X"E0",X"E0",X"C0",X"80",X"C0",X"E0",X"E0",X"00", + X"C0",X"E0",X"70",X"30",X"70",X"E0",X"C0",X"00",X"60",X"E0",X"C0",X"80",X"C0",X"E0",X"60",X"00", + X"E0",X"F0",X"10",X"10",X"F0",X"E0",X"00",X"00",X"00",X"00",X"E0",X"E0",X"00",X"00",X"00",X"00", + X"C0",X"E0",X"F0",X"B0",X"90",X"80",X"80",X"00",X"20",X"20",X"20",X"A0",X"E0",X"E0",X"60",X"00", + X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"30",X"34",X"C3",X"96", + X"07",X"87",X"4A",X"06",X"06",X"5A",X"2D",X"07",X"00",X"33",X"00",X"00",X"33",X"00",X"00",X"11", + X"12",X"12",X"12",X"03",X"00",X"00",X"00",X"00",X"0F",X"0F",X"09",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"FF",X"00",X"00",X"FF",X"00",X"FF",X"33",X"33",X"FF",X"33",X"33",X"FF",X"33", + X"F0",X"E1",X"B4",X"2D",X"2C",X"59",X"08",X"00",X"87",X"1E",X"0E",X"00",X"00",X"CC",X"33",X"33", + X"00",X"FF",X"00",X"10",X"BA",X"33",X"11",X"FF",X"33",X"33",X"BB",X"FF",X"F7",X"F3",X"FB",X"FF", + X"00",X"88",X"F9",X"FF",X"F9",X"F9",X"F9",X"88",X"00",X"33",X"E2",X"E2",X"E2",X"EE",X"E2",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"F0",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"F0",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"F0",X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"51",X"11",X"20",X"55",X"00",X"00",X"33",X"FF",X"FF",X"FF",X"FB",X"FE", + X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"74",X"F7",X"00",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"50",X"00",X"00",X"00",X"10",X"00",X"10",X"00",X"00", + X"00",X"60",X"F0",X"F0",X"70",X"F0",X"F0",X"60",X"00",X"00",X"00",X"80",X"C0",X"80",X"00",X"00", + X"C3",X"0F",X"0F",X"87",X"87",X"87",X"87",X"0F",X"0F",X"0F",X"1E",X"3C",X"1E",X"0F",X"0F",X"0F", + X"77",X"77",X"77",X"33",X"51",X"00",X"00",X"00",X"FE",X"FE",X"FB",X"FF",X"FF",X"FF",X"33",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"D0",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"5A",X"1E",X"0F",X"2D",X"0F",X"0F",X"0F",X"87",X"E1",X"F0", + X"0F",X"F0",X"1E",X"C3",X"F0",X"0F",X"1E",X"C3",X"78",X"F0",X"F0",X"78",X"F0",X"0F",X"E1",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"20",X"00",X"00",X"00",X"10",X"00",X"10",X"00",X"00", + X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"00", + X"33",X"66",X"33",X"00",X"00",X"10",X"B0",X"E1",X"98",X"DC",X"98",X"00",X"C0",X"D0",X"F0",X"1E", + X"0E",X"78",X"1E",X"0F",X"0F",X"87",X"87",X"4B",X"00",X"08",X"80",X"4A",X"2C",X"0F",X"0F",X"4B", + X"1E",X"2D",X"C3",X"3C",X"0F",X"C3",X"F0",X"78",X"87",X"4B",X"0F",X"0F",X"0F",X"78",X"F0",X"87", + X"0F",X"1E",X"69",X"87",X"0F",X"3C",X"78",X"87",X"69",X"96",X"0F",X"0F",X"0F",X"87",X"0F",X"0F", + X"3C",X"2D",X"C3",X"0F",X"0F",X"1E",X"E1",X"0F",X"87",X"0F",X"0F",X"3C",X"4B",X"87",X"0F",X"0F", + X"0F",X"0F",X"0F",X"F0",X"F0",X"87",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"87",X"0F",X"0F",X"0F", + X"00",X"A5",X"2D",X"1E",X"0F",X"0F",X"87",X"0F",X"00",X"00",X"C0",X"68",X"1E",X"E1",X"69",X"1E", + X"69",X"69",X"3C",X"03",X"00",X"00",X"FB",X"FB",X"C3",X"0F",X"03",X"00",X"00",X"00",X"FB",X"FB", + X"00",X"00",X"00",X"00",X"30",X"C3",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"C0",X"2C",X"1E", + X"00",X"00",X"00",X"00",X"E0",X"D0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"96",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"87", + X"00",X"10",X"10",X"70",X"70",X"10",X"10",X"00",X"00",X"80",X"80",X"E0",X"E0",X"80",X"80",X"00", + X"F1",X"FB",X"EE",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"00",X"00",X"00", + X"0F",X"1E",X"3C",X"78",X"C3",X"1E",X"3C",X"0F",X"3C",X"F0",X"C3",X"0F",X"0F",X"E1",X"F0",X"3C", + X"3C",X"69",X"C3",X"0F",X"0F",X"1E",X"3C",X"3C",X"0F",X"0F",X"0F",X"0F",X"3C",X"F0",X"E1",X"87", + X"30",X"30",X"30",X"10",X"10",X"30",X"30",X"30",X"C3",X"E1",X"F0",X"F0",X"E1",X"E1",X"C3",X"C3", + X"FB",X"FB",X"00",X"00",X"00",X"00",X"00",X"00",X"FB",X"FB",X"00",X"00",X"00",X"00",X"00",X"00", + X"C3",X"69",X"78",X"3C",X"3C",X"3C",X"1E",X"0F",X"00",X"08",X"84",X"86",X"C2",X"C3",X"E1",X"E1", + X"C0",X"C0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"80",X"80",X"C0",X"E0",X"E0", + X"69",X"69",X"3C",X"1E",X"0F",X"1E",X"3C",X"78",X"1E",X"2D",X"96",X"E1",X"B4",X"A5",X"F0",X"96", + X"00",X"00",X"00",X"11",X"B3",X"32",X"51",X"33",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FE",X"FD", + X"0F",X"1E",X"3C",X"78",X"3C",X"3C",X"0F",X"0F",X"87",X"87",X"0F",X"0F",X"87",X"C3",X"C3",X"0F", + X"0F",X"0F",X"0F",X"3C",X"3C",X"1E",X"0F",X"0F",X"0F",X"0F",X"2D",X"0F",X"87",X"C3",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"1E",X"3C",X"69",X"C3",X"0F",X"0F",X"0F",X"0F",X"87",X"0F",X"0F",X"0F", + X"3C",X"3C",X"1E",X"1E",X"1E",X"0F",X"0F",X"0F",X"E0",X"E0",X"E0",X"F0",X"E0",X"E0",X"E0",X"F0", + X"F0",X"78",X"78",X"78",X"78",X"78",X"3C",X"3C",X"C0",X"C0",X"C0",X"E0",X"C0",X"C0",X"C0",X"C0", + X"0F",X"3C",X"2D",X"2D",X"2D",X"1E",X"1E",X"0F",X"68",X"68",X"C0",X"C0",X"C0",X"68",X"68",X"68", + X"C3",X"0F",X"0F",X"2D",X"C3",X"1E",X"0F",X"1E",X"4B",X"0F",X"D2",X"D2",X"B4",X"3C",X"69",X"C3", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"78",X"3C",X"68",X"80",X"00",X"3C",X"F0",X"E1",X"C3",X"E1",X"61",X"30",X"00", + X"43",X"43",X"87",X"96",X"96",X"D2",X"30",X"00",X"78",X"F0",X"F0",X"F0",X"E1",X"96",X"2C",X"C0", + X"0F",X"0F",X"0F",X"0F",X"87",X"C3",X"F0",X"F0",X"78",X"78",X"87",X"87",X"0F",X"0F",X"3C",X"F0", + X"0F",X"0F",X"0F",X"87",X"C3",X"78",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"4B",X"F0",X"B4", + X"C3",X"96",X"3C",X"B4",X"69",X"0F",X"B4",X"50",X"96",X"A4",X"A4",X"B4",X"B4",X"E0",X"C0",X"80", + X"F0",X"F0",X"D2",X"1E",X"3C",X"69",X"87",X"C3",X"96",X"D2",X"D2",X"B4",X"B4",X"3C",X"1E",X"1E", + X"4B",X"4B",X"4B",X"4B",X"87",X"0F",X"0F",X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"C3",X"E1",X"3C", + X"48",X"3C",X"B4",X"0E",X"4A",X"1F",X"1E",X"3C",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00", + X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"CC",X"00",X"00",X"00",X"00",X"00", + X"B4",X"0E",X"4A",X"78",X"3C",X"3C",X"2C",X"1E",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00", + X"10",X"30",X"70",X"90",X"10",X"10",X"10",X"10",X"80",X"C0",X"E0",X"90",X"80",X"80",X"80",X"80", + X"E0",X"7B",X"B4",X"3C",X"1E",X"1E",X"2D",X"1E",X"00",X"FF",X"00",X"00",X"00",X"F7",X"80",X"C0", + X"00",X"00",X"22",X"55",X"20",X"55",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"3C",X"C3", + X"0F",X"96",X"60",X"00",X"00",X"00",X"00",X"00",X"E1",X"0F",X"E1",X"21",X"10",X"00",X"00",X"00", + X"50",X"11",X"31",X"00",X"00",X"00",X"22",X"66",X"F0",X"F8",X"77",X"22",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"F0",X"3C",X"3C",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"69",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"87", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"03",X"03",X"03",X"03",X"03",X"03",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"11",X"11",X"99",X"DD",X"DD",X"FF",X"F3",X"FF",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"07",X"0F",X"1E",X"78",X"F0",X"F0",X"F0",X"00",X"0E",X"0F",X"C3",X"F0",X"F0",X"F0",X"F0", + X"70",X"00",X"00",X"08",X"0F",X"E1",X"F0",X"F0",X"CF",X"09",X"01",X"5C",X"CD",X"FE",X"6F",X"96", + X"0F",X"0F",X"07",X"03",X"07",X"0F",X"0F",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"08",X"0E",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C", + X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0C",X"0C",X"08",X"0C",X"0E",X"0E", + X"08",X"0C",X"0C",X"08",X"0E",X"0F",X"0F",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"01",X"21",X"00",X"00",X"0C",X"0F",X"0F",X"0F",X"0F",X"6F", + X"00",X"01",X"01",X"07",X"0F",X"3C",X"3C",X"78",X"3C",X"3C",X"78",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"03",X"12",X"16",X"34",X"34", + X"08",X"0C",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"06",X"0E",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0D",X"04",X"00",X"08",X"0E",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"3C",X"F0",X"00",X"0C",X"0F",X"0F",X"0F",X"78",X"F0",X"F0", + X"00",X"00",X"08",X"0F",X"0F",X"E1",X"F0",X"F0",X"00",X"00",X"0F",X"0F",X"0F",X"78",X"F0",X"F0", + X"3C",X"1E",X"0F",X"0F",X"1E",X"0F",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"F0", + X"F0",X"F0",X"F0",X"F0",X"69",X"0F",X"0F",X"0F",X"F0",X"F0",X"F0",X"87",X"0F",X"0F",X"0F",X"0F", + X"0F",X"C3",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"87",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"0F",X"0F",X"1E",X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"C3",X"F0",X"F0",X"F0",X"0F",X"0F",X"0F",X"3C",X"F0",X"F0",X"F0",X"F0", + X"E1",X"C3",X"87",X"87",X"0F",X"0F",X"0F",X"1E",X"78",X"3C",X"F0",X"78",X"78",X"F0",X"E1",X"C3", + X"00",X"01",X"0D",X"0F",X"0F",X"E1",X"E1",X"96",X"0E",X"0F",X"0F",X"3C",X"1E",X"3C",X"78",X"F0", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"0F",X"0F",X"0F",X"0E",X"0F",X"0F",X"0E", + X"0F",X"0F",X"07",X"03",X"07",X"07",X"0F",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"C3",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"1E",X"1E",X"3C",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"0F",X"0F",X"0F",X"87",X"F0", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"0E",X"0E",X"0E",X"0E",X"0C",X"08",X"00",X"00", + X"25",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"E1",X"E1",X"2D",X"16",X"03",X"07",X"12",X"01", + X"61",X"43",X"06",X"06",X"02",X"04",X"08",X"08",X"68",X"0C",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"20",X"20",X"20",X"20",X"20",X"F0",X"00",X"20",X"20",X"22",X"20",X"20",X"00",X"00",X"00", + X"20",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"A8",X"A8",X"AA",X"22",X"64",X"A8",X"F1",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"D0",X"00", + X"10",X"10",X"98",X"88",X"66",X"EE",X"D8",X"00",X"00",X"00",X"00",X"00",X"00",X"99",X"F7",X"55", + X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"10",X"60",X"00",X"44",X"77",X"BB",X"44",X"44", + X"80",X"11",X"22",X"CC",X"00",X"00",X"00",X"00",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"11",X"00",X"11",X"D0",X"00", + X"10",X"10",X"10",X"44",X"00",X"66",X"D0",X"00",X"00",X"00",X"00",X"00",X"00",X"99",X"F7",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"60",X"00",X"00",X"BB",X"00",X"AA",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"33",X"77",X"54",X"76",X"54",X"77",X"33",X"00",X"88",X"C4",X"C8",X"C0",X"C8",X"C4",X"88", + X"00",X"72",X"31",X"10",X"10",X"10",X"31",X"72",X"00",X"80",X"80",X"60",X"E0",X"60",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"22",X"75",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00", + X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00", + X"FF",X"FF",X"FF",X"76",X"B3",X"11",X"00",X"00",X"FC",X"FD",X"FE",X"FF",X"FF",X"FF",X"77",X"00", + X"FF",X"AA",X"FF",X"AA",X"AA",X"FF",X"AA",X"FF",X"FF",X"AA",X"FF",X"AA",X"AA",X"FF",X"AA",X"FF", + X"F3",X"FF",X"F3",X"FF",X"DD",X"DD",X"99",X"11",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB", + X"F5",X"FD",X"F5",X"DD",X"99",X"B9",X"51",X"11",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB", + X"11",X"11",X"51",X"B9",X"99",X"DD",X"F5",X"FD",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"00", + X"00",X"00",X"00",X"00",X"01",X"12",X"16",X"16",X"00",X"00",X"00",X"07",X"F0",X"F0",X"C3",X"87", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"30",X"70",X"78",X"78",X"1E", + X"03",X"07",X"87",X"87",X"C3",X"C3",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"E1", + X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"07",X"00",X"00",X"00", + X"1E",X"0F",X"0F",X"0F",X"0F",X"0F",X"03",X"00",X"E1",X"0F",X"0F",X"69",X"3C",X"0F",X"0F",X"03", + X"87",X"87",X"87",X"2D",X"0F",X"1E",X"0F",X"0F",X"A4",X"48",X"08",X"3B",X"08",X"08",X"33",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"30",X"00",X"22",X"CC",X"CC",X"88",X"00",X"00",X"44",X"00",X"11",X"11",X"11",X"44",X"44",X"00", + X"00",X"00",X"00",X"03",X"16",X"16",X"12",X"07",X"00",X"00",X"0B",X"F0",X"F0",X"C3",X"87",X"4B", + X"00",X"01",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"16",X"78",X"F0",X"F0",X"78",X"78",X"0F",X"0F", + X"0F",X"0F",X"87",X"87",X"C3",X"C3",X"69",X"1E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"87", + X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"07",X"01",X"00",X"00",X"00", + X"0F",X"0F",X"3C",X"1E",X"0F",X"07",X"03",X"00",X"0F",X"0F",X"0F",X"3C",X"A5",X"0F",X"0F",X"07", + X"00",X"0B",X"B4",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"08",X"84",X"C2",X"68",X"2C",X"2C",X"3C", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1E",X"1E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0E", + X"00",X"FF",X"00",X"00",X"51",X"FF",X"20",X"55",X"00",X"FF",X"33",X"FF",X"FF",X"FF",X"FB",X"FE", + X"00",X"FF",X"98",X"DC",X"CC",X"FF",X"F2",X"FE",X"00",X"FF",X"00",X"60",X"F1",X"FF",X"F1",X"E0", + X"77",X"FF",X"77",X"33",X"51",X"FF",X"00",X"00",X"FE",X"FF",X"FB",X"FF",X"FF",X"FF",X"33",X"00", + X"F2",X"FF",X"F2",X"EE",X"CC",X"FF",X"98",X"00",X"E0",X"FF",X"F1",X"F1",X"F1",X"FF",X"00",X"00", + X"00",X"FF",X"00",X"11",X"B3",X"FF",X"50",X"BB",X"00",X"FF",X"77",X"FF",X"FF",X"FF",X"FC",X"FB", + X"00",X"FF",X"40",X"A8",X"98",X"FF",X"FC",X"FC",X"00",X"FF",X"22",X"E2",X"E2",X"FF",X"C0",X"C0", + X"FF",X"FF",X"FF",X"76",X"B3",X"FF",X"00",X"00",X"F8",X"FF",X"FC",X"FF",X"FF",X"FF",X"77",X"00", + X"FC",X"FF",X"FC",X"DC",X"98",X"FF",X"40",X"00",X"C0",X"FF",X"C0",X"C0",X"E2",X"FF",X"22",X"00", + X"00",X"D1",X"C0",X"91",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00", + X"00",X"00",X"CC",X"66",X"EE",X"44",X"EE",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"00",X"33",X"00",X"00",X"00",X"33",X"F3",X"EE",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"CC",X"11",X"00",X"00",X"00",X"00",X"00",X"11",X"DD",X"99",X"11",X"40",X"60",X"C0", + X"00",X"00",X"51",X"C0",X"D1",X"00",X"00",X"00",X"00",X"00",X"44",X"FF",X"77",X"66",X"AA",X"77", + X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"33",X"33",X"F3",X"EE",X"00",X"00",X"00",X"00", + X"33",X"BB",X"88",X"88",X"00",X"10",X"30",X"60",X"88",X"CC",X"CC",X"11",X"11",X"00",X"11",X"77", + X"00",X"90",X"CC",X"22",X"00",X"00",X"00",X"00",X"00",X"F1",X"11",X"31",X"20",X"20",X"20",X"33", + X"00",X"F0",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"F8",X"A8",X"31",X"11",X"31",X"20",X"20", + X"00",X"00",X"00",X"00",X"22",X"EC",X"F0",X"00",X"00",X"00",X"00",X"20",X"20",X"22",X"F2",X"00", + X"00",X"00",X"00",X"00",X"88",X"20",X"70",X"00",X"EE",X"33",X"31",X"22",X"64",X"64",X"F4",X"00", + X"00",X"00",X"00",X"11",X"33",X"33",X"FF",X"FF",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"FF", + X"10",X"10",X"10",X"11",X"33",X"BB",X"FF",X"FF",X"00",X"00",X"00",X"88",X"EF",X"EF",X"CC",X"EF", + X"FF",X"FF",X"77",X"76",X"33",X"11",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"EE",X"FF",X"E0",X"00", + X"FF",X"FF",X"FF",X"FE",X"98",X"10",X"10",X"10",X"EF",X"CD",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"33",X"33",X"FF",X"FF",X"FF",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"10",X"10",X"10",X"11",X"33",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"88",X"CC",X"EF",X"EF",X"CC", + X"FF",X"76",X"77",X"33",X"11",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"70",X"00",X"00", + X"FF",X"FE",X"77",X"89",X"10",X"10",X"10",X"10",X"EF",X"EF",X"CD",X"88",X"00",X"00",X"00",X"00", + X"11",X"33",X"33",X"FF",X"FF",X"FF",X"FF",X"77",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"10",X"10",X"BB",X"FF",X"FF",X"FF",X"FF",X"FE",X"00",X"00",X"00",X"88",X"CC",X"EE",X"EF",X"CD", + X"76",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"70",X"00",X"00",X"00",X"00", + X"BB",X"33",X"99",X"01",X"10",X"10",X"10",X"10",X"CC",X"EF",X"AB",X"01",X"00",X"00",X"00",X"00", + X"61",X"43",X"06",X"06",X"02",X"04",X"08",X"08",X"68",X"1D",X"3B",X"11",X"00",X"00",X"00",X"00", + X"25",X"89",X"CC",X"88",X"00",X"00",X"00",X"00",X"E1",X"E1",X"2D",X"16",X"03",X"07",X"12",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F0",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"F0",X"20",X"20",X"20",X"00",X"20",X"20", + X"00",X"F0",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"F0",X"20",X"20",X"00",X"00",X"00",X"00", + X"20",X"20",X"20",X"20",X"20",X"20",X"F0",X"00",X"20",X"20",X"00",X"20",X"20",X"20",X"F0",X"00", + X"20",X"20",X"20",X"20",X"20",X"20",X"F0",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"F1",X"33", + X"00",X"F0",X"20",X"20",X"20",X"00",X"20",X"20",X"CC",X"74",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"F0",X"20",X"20",X"00",X"00",X"00",X"20",X"00",X"F0",X"33",X"00",X"00",X"00",X"00",X"00", + X"20",X"20",X"00",X"20",X"20",X"20",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"F0",X"00", + X"20",X"00",X"00",X"00",X"20",X"20",X"F1",X"33",X"00",X"00",X"00",X"00",X"00",X"33",X"E0",X"00", + X"44",X"FC",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"90",X"CC",X"22",X"00",X"00",X"00",X"00", + X"00",X"F0",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"F0",X"00",X"00",X"00",X"00",X"00",X"22",X"EC",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"33",X"C0",X"00",X"00",X"00",X"00",X"00",X"A8",X"20",X"70",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_palette.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_palette.vhd new file mode 100644 index 00000000..522f4290 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_palette.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_palette is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_palette is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"38",X"C0",X"3F",X"C7",X"26",X"03",X"0D",X"2F",X"D1",X"C3",X"F0",X"B8",X"D8",X"FE", + X"00",X"07",X"38",X"80",X"3F",X"C7",X"26",X"03",X"0D",X"2F",X"34",X"20",X"F0",X"B8",X"D8",X"FE"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_prog.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_prog.vhd new file mode 100644 index 00000000..aca0bf96 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_prog.vhd @@ -0,0 +1,2070 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_prog is +port ( + clk : in std_logic; + addr : in std_logic_vector(14 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_prog is + type rom is array(0 to 32767) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AF",X"32",X"80",X"A1",X"C3",X"92",X"00",X"FF",X"77",X"3C",X"23",X"77",X"3C",X"19",X"C9",X"FF", + X"77",X"23",X"10",X"FC",X"C9",X"FF",X"FF",X"FF",X"77",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"C9", + X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"C9",X"87",X"E1",X"5F",X"16",X"00",X"19",X"5E",X"23", + X"56",X"EB",X"E9",X"FF",X"FF",X"FF",X"FF",X"FF",X"E5",X"26",X"88",X"3A",X"A0",X"88",X"6F",X"CB", + X"7E",X"28",X"0E",X"72",X"2C",X"73",X"2C",X"7D",X"FE",X"C0",X"30",X"02",X"3E",X"C0",X"32",X"A0", + X"88",X"E1",X"C9",X"0F",X"33",X"31",X"24",X"22",X"21",X"15",X"13",X"11",X"07",X"06",X"05",X"04", + X"03",X"02",X"01",X"FF",X"FF",X"FF",X"C3",X"6D",X"06",X"00",X"11",X"22",X"04",X"31",X"06",X"15", + X"02",X"33",X"07",X"21",X"03",X"24",X"05",X"13",X"01",X"00",X"33",X"05",X"61",X"BE",X"05",X"66", + X"07",X"06",X"DD",X"A8",X"05",X"60",X"BC",X"04",X"A6",X"51",X"05",X"38",X"8A",X"06",X"AD",X"BA", + X"05",X"CA",X"32",X"00",X"A0",X"31",X"00",X"90",X"32",X"00",X"88",X"06",X"08",X"C5",X"21",X"00", + X"00",X"DD",X"21",X"79",X"00",X"11",X"00",X"00",X"4A",X"7B",X"86",X"5F",X"30",X"04",X"14",X"20", + X"01",X"0C",X"2C",X"20",X"F4",X"24",X"7C",X"E6",X"0F",X"20",X"EE",X"32",X"00",X"A0",X"7B",X"DD", + X"BE",X"00",X"20",X"0C",X"7A",X"DD",X"BE",X"01",X"20",X"06",X"79",X"DD",X"BE",X"02",X"28",X"02", + X"18",X"06",X"E5",X"21",X"FF",X"8F",X"34",X"E1",X"DD",X"23",X"DD",X"23",X"DD",X"23",X"10",X"C5", + X"3A",X"E0",X"A0",X"E6",X"0F",X"21",X"69",X"00",X"E7",X"7E",X"B7",X"18",X"16",X"57",X"E6",X"0F", + X"5F",X"AA",X"0F",X"0F",X"0F",X"0F",X"CD",X"FA",X"00",X"7B",X"FE",X"0A",X"38",X"02",X"C6",X"07", + X"77",X"09",X"C9",X"32",X"00",X"A0",X"21",X"00",X"88",X"11",X"01",X"88",X"01",X"FD",X"07",X"36", + X"00",X"ED",X"B0",X"3E",X"08",X"32",X"42",X"8A",X"21",X"C0",X"88",X"06",X"40",X"3E",X"FF",X"D7", + X"21",X"43",X"8A",X"06",X"1C",X"D7",X"21",X"43",X"43",X"22",X"40",X"8A",X"32",X"00",X"A0",X"3E", + X"01",X"32",X"87",X"A1",X"32",X"1F",X"88",X"21",X"C0",X"C0",X"22",X"A0",X"88",X"21",X"00",X"80", + X"11",X"01",X"80",X"36",X"10",X"01",X"00",X"04",X"ED",X"B0",X"CD",X"E6",X"02",X"32",X"00",X"A0", + X"3A",X"00",X"A0",X"2F",X"0F",X"0F",X"47",X"E6",X"01",X"32",X"0F",X"88",X"78",X"0F",X"47",X"E6", + X"01",X"32",X"00",X"88",X"78",X"0F",X"47",X"E6",X"07",X"32",X"20",X"88",X"78",X"0F",X"0F",X"0F", + X"47",X"E6",X"01",X"32",X"21",X"88",X"3A",X"00",X"A0",X"2F",X"E6",X"03",X"FE",X"03",X"28",X"04", + X"C6",X"03",X"18",X"02",X"3E",X"FF",X"32",X"07",X"88",X"3A",X"E0",X"A0",X"47",X"E6",X"F0",X"0F", + X"0F",X"0F",X"0F",X"21",X"53",X"00",X"E7",X"32",X"2F",X"88",X"78",X"E6",X"0F",X"21",X"53",X"00", + X"E7",X"32",X"2C",X"88",X"32",X"00",X"A0",X"CD",X"EA",X"01",X"AF",X"CD",X"8F",X"0E",X"3E",X"01", + X"32",X"80",X"A1",X"21",X"00",X"8A",X"06",X"0A",X"36",X"00",X"2C",X"36",X"00",X"2C",X"36",X"01", + X"2C",X"10",X"F5",X"21",X"AA",X"88",X"36",X"01",X"32",X"00",X"A0",X"21",X"C0",X"89",X"AF",X"06", + X"1E",X"D7",X"C3",X"0F",X"02",X"32",X"00",X"A0",X"18",X"FB",X"0B",X"32",X"00",X"A0",X"3A",X"80", + X"A0",X"CB",X"5F",X"C0",X"78",X"B1",X"20",X"F2",X"37",X"C9",X"21",X"10",X"94",X"06",X"30",X"D7", + X"21",X"10",X"90",X"06",X"30",X"D7",X"21",X"40",X"84",X"11",X"41",X"84",X"01",X"BF",X"03",X"36", + X"1E",X"ED",X"B0",X"00",X"00",X"00",X"10",X"FB",X"32",X"00",X"A0",X"0D",X"20",X"F5",X"C9",X"26", + X"88",X"3A",X"A1",X"88",X"6F",X"7E",X"87",X"30",X"05",X"CD",X"54",X"02",X"18",X"F1",X"E6",X"1F", + X"4F",X"06",X"00",X"36",X"FF",X"23",X"5E",X"36",X"FF",X"2C",X"7D",X"FE",X"C0",X"30",X"02",X"3E", + X"C0",X"32",X"A1",X"88",X"7B",X"21",X"42",X"02",X"09",X"5E",X"23",X"56",X"21",X"0F",X"02",X"E5", + X"EB",X"E9",X"9B",X"03",X"C2",X"03",X"E9",X"03",X"96",X"04",X"52",X"05",X"6B",X"05",X"B2",X"05", + X"EE",X"05",X"44",X"06",X"3A",X"3F",X"88",X"47",X"E6",X"0F",X"CA",X"61",X"02",X"CD",X"8C",X"20", + X"C9",X"3A",X"06",X"88",X"A7",X"C8",X"11",X"E0",X"FF",X"21",X"E0",X"84",X"3A",X"0E",X"88",X"A7", + X"28",X"22",X"36",X"02",X"CD",X"AA",X"02",X"21",X"40",X"87",X"CD",X"A8",X"02",X"3A",X"0D",X"88", + X"A7",X"21",X"40",X"87",X"28",X"03",X"21",X"E0",X"84",X"CB",X"60",X"C8",X"3A",X"06",X"88",X"0F", + X"D0",X"C3",X"B1",X"02",X"21",X"E0",X"84",X"CD",X"B1",X"02",X"21",X"21",X"85",X"CD",X"B1",X"02", + X"CD",X"B1",X"02",X"CD",X"B1",X"02",X"18",X"CF",X"36",X"01",X"19",X"36",X"25",X"19",X"36",X"20", + X"C9",X"3E",X"10",X"77",X"19",X"77",X"19",X"77",X"C9",X"21",X"40",X"88",X"06",X"60",X"AF",X"D7", + X"21",X"80",X"8A",X"D7",X"D7",X"06",X"37",X"D7",X"C9",X"CD",X"B9",X"02",X"06",X"1D",X"3E",X"20", + X"90",X"5F",X"16",X"00",X"2A",X"0B",X"88",X"3E",X"10",X"D7",X"19",X"22",X"0B",X"88",X"21",X"09", + X"88",X"35",X"C9",X"21",X"02",X"84",X"22",X"0B",X"88",X"3E",X"20",X"32",X"09",X"88",X"C9",X"21", + X"40",X"88",X"DD",X"21",X"80",X"8A",X"11",X"18",X"00",X"06",X"02",X"CD",X"2A",X"03",X"DD",X"21", + X"90",X"8C",X"06",X"02",X"CD",X"2A",X"03",X"DD",X"21",X"E0",X"8A",X"06",X"12",X"CD",X"43",X"03", + X"DD",X"21",X"B0",X"8A",X"06",X"02",X"CD",X"2A",X"03",X"21",X"98",X"88",X"35",X"21",X"9C",X"88", + X"35",X"3A",X"1F",X"88",X"A7",X"C0",X"CD",X"78",X"03",X"C9",X"DD",X"7E",X"06",X"77",X"2C",X"DD", + X"7E",X"10",X"77",X"2C",X"DD",X"7E",X"04",X"77",X"2C",X"DD",X"7E",X"0F",X"77",X"2C",X"DD",X"19", + X"10",X"E8",X"C9",X"DD",X"4E",X"05",X"DD",X"7E",X"06",X"CB",X"01",X"17",X"CB",X"01",X"17",X"CB", + X"01",X"17",X"D6",X"08",X"77",X"2C",X"DD",X"7E",X"10",X"77",X"2C",X"DD",X"7E",X"04",X"DD",X"4E", + X"03",X"CB",X"01",X"17",X"CB",X"01",X"17",X"CB",X"01",X"17",X"D6",X"08",X"77",X"2C",X"DD",X"7E", + X"0F",X"77",X"2C",X"DD",X"19",X"10",X"CC",X"C9",X"11",X"40",X"88",X"06",X"18",X"1A",X"ED",X"44", + X"D6",X"10",X"12",X"1C",X"1A",X"E6",X"C0",X"EE",X"C0",X"4F",X"1A",X"E6",X"0F",X"B1",X"12",X"1C", + X"1A",X"ED",X"44",X"D6",X"10",X"12",X"1C",X"1C",X"10",X"E3",X"C9",X"3A",X"06",X"88",X"A7",X"C8", + X"21",X"82",X"84",X"11",X"20",X"00",X"3A",X"80",X"8A",X"3C",X"FE",X"08",X"38",X"02",X"3E",X"08", + X"4F",X"47",X"36",X"0C",X"19",X"10",X"FB",X"3E",X"08",X"91",X"C8",X"47",X"36",X"10",X"19",X"10", + X"FB",X"C9",X"21",X"3F",X"86",X"11",X"E0",X"FF",X"3A",X"08",X"89",X"A7",X"C8",X"3D",X"4F",X"28", + X"0D",X"FE",X"05",X"38",X"02",X"3E",X"05",X"4F",X"47",X"36",X"B0",X"19",X"10",X"FB",X"3E",X"05", + X"91",X"C8",X"47",X"36",X"10",X"19",X"10",X"FB",X"C9",X"3E",X"1A",X"06",X"0B",X"F5",X"C5",X"CD", + X"B2",X"05",X"C1",X"F1",X"3C",X"10",X"F6",X"21",X"C7",X"85",X"11",X"20",X"00",X"06",X"0A",X"DD", + X"21",X"00",X"8A",X"CD",X"29",X"04",X"77",X"19",X"DD",X"23",X"CD",X"29",X"04",X"77",X"19",X"DD", + X"23",X"CD",X"29",X"04",X"28",X"01",X"77",X"11",X"62",X"FF",X"19",X"11",X"20",X"00",X"DD",X"23", + X"10",X"E1",X"CD",X"39",X"04",X"CD",X"60",X"04",X"C9",X"DD",X"7E",X"00",X"4F",X"E6",X"0F",X"77", + X"19",X"79",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"C9",X"DD",X"21",X"C0",X"89",X"21",X"67",X"84", + X"06",X"0A",X"11",X"20",X"00",X"DD",X"23",X"CD",X"29",X"04",X"77",X"19",X"36",X"51",X"19",X"DD", + X"23",X"CD",X"29",X"04",X"28",X"01",X"77",X"DD",X"23",X"11",X"82",X"FF",X"19",X"10",X"E3",X"C9", + X"DD",X"21",X"00",X"8E",X"21",X"67",X"85",X"06",X"0A",X"11",X"E0",X"FF",X"DD",X"7E",X"00",X"A7", + X"20",X"02",X"3E",X"40",X"77",X"19",X"DD",X"23",X"DD",X"7E",X"00",X"A7",X"20",X"02",X"3E",X"40", + X"77",X"19",X"DD",X"23",X"DD",X"7E",X"00",X"A7",X"20",X"02",X"3E",X"40",X"77",X"DD",X"23",X"11", + X"42",X"00",X"19",X"10",X"D4",X"C9",X"4F",X"3A",X"06",X"88",X"0F",X"D0",X"79",X"A7",X"28",X"47", + X"CD",X"F2",X"04",X"87",X"81",X"4F",X"06",X"00",X"21",X"01",X"05",X"09",X"A7",X"06",X"03",X"1A", + X"8E",X"27",X"12",X"13",X"23",X"10",X"F8",X"D5",X"3A",X"0D",X"88",X"0F",X"30",X"02",X"3E",X"01", + X"CD",X"6B",X"05",X"D1",X"1B",X"21",X"AA",X"88",X"06",X"03",X"1A",X"BE",X"D8",X"20",X"05",X"1B", + X"2B",X"10",X"F7",X"C9",X"CD",X"F2",X"04",X"21",X"A8",X"88",X"06",X"03",X"1A",X"77",X"13",X"23", + X"10",X"FA",X"3E",X"02",X"C3",X"6B",X"05",X"CD",X"F2",X"04",X"21",X"AB",X"88",X"A7",X"06",X"03", + X"18",X"BD",X"F5",X"3A",X"0D",X"88",X"11",X"A2",X"88",X"0F",X"30",X"03",X"11",X"A5",X"88",X"F1", + X"C9",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"07",X"00",X"00",X"05",X"00",X"50",X"04",X"00", + X"00",X"04",X"00",X"80",X"03",X"00",X"50",X"03",X"00",X"30",X"03",X"00",X"00",X"03",X"00",X"80", + X"02",X"00",X"50",X"02",X"00",X"30",X"02",X"00",X"00",X"02",X"00",X"80",X"01",X"00",X"50",X"01", + X"00",X"30",X"01",X"00",X"00",X"01",X"00",X"50",X"00",X"00",X"00",X"01",X"00",X"00",X"01",X"00", + X"00",X"02",X"00",X"00",X"04",X"00",X"00",X"08",X"00",X"00",X"16",X"00",X"00",X"32",X"00",X"00", + X"50",X"00",X"F5",X"21",X"A2",X"88",X"A7",X"28",X"09",X"21",X"A5",X"88",X"3D",X"28",X"03",X"21", + X"A8",X"88",X"36",X"00",X"23",X"36",X"00",X"23",X"36",X"00",X"F1",X"21",X"A4",X"88",X"DD",X"21", + X"81",X"87",X"A7",X"28",X"11",X"21",X"A7",X"88",X"DD",X"21",X"21",X"85",X"3D",X"28",X"07",X"21", + X"AA",X"88",X"DD",X"21",X"41",X"86",X"11",X"E0",X"FF",X"06",X"03",X"0E",X"04",X"7E",X"0F",X"0F", + X"0F",X"0F",X"CD",X"9D",X"05",X"7E",X"CD",X"9D",X"05",X"2B",X"10",X"F1",X"C9",X"E6",X"0F",X"28", + X"08",X"0E",X"00",X"DD",X"77",X"00",X"DD",X"19",X"C9",X"79",X"A7",X"28",X"F6",X"3E",X"10",X"0D", + X"18",X"F1",X"87",X"F5",X"21",X"0D",X"7A",X"E6",X"7F",X"5F",X"16",X"00",X"19",X"F1",X"5E",X"23", + X"56",X"EB",X"5E",X"23",X"56",X"23",X"EB",X"01",X"E0",X"FF",X"38",X"14",X"1A",X"FE",X"2E",X"28", + X"0B",X"FE",X"3F",X"C8",X"D6",X"30",X"77",X"13",X"09",X"18",X"F1",X"37",X"EB",X"23",X"18",X"E2", + X"1A",X"FE",X"2E",X"28",X"F6",X"FE",X"3F",X"C8",X"36",X"10",X"13",X"09",X"18",X"F2",X"3E",X"05", + X"CD",X"B2",X"05",X"3A",X"02",X"88",X"FE",X"63",X"38",X"02",X"3E",X"63",X"CD",X"2A",X"06",X"47", + X"E6",X"F0",X"28",X"07",X"0F",X"0F",X"0F",X"0F",X"32",X"BF",X"86",X"78",X"E6",X"0F",X"32",X"9F", + X"86",X"FE",X"02",X"C0",X"11",X"C8",X"64",X"01",X"1F",X"00",X"1A",X"1B",X"80",X"47",X"0D",X"20", + X"F9",X"FE",X"8C",X"C8",X"21",X"1E",X"45",X"29",X"34",X"C9",X"47",X"E6",X"0F",X"C6",X"00",X"27", + X"4F",X"78",X"E6",X"F0",X"28",X"0B",X"0F",X"0F",X"0F",X"0F",X"47",X"AF",X"C6",X"16",X"27",X"10", + X"FB",X"81",X"27",X"C9",X"DD",X"21",X"8A",X"77",X"16",X"00",X"DD",X"7E",X"00",X"FE",X"C8",X"20", + X"16",X"DD",X"86",X"01",X"30",X"01",X"14",X"DD",X"86",X"02",X"30",X"01",X"14",X"DD",X"86",X"03", + X"30",X"01",X"14",X"92",X"FE",X"59",X"C8",X"3E",X"01",X"32",X"F8",X"8D",X"C9",X"F5",X"C5",X"D5", + X"E5",X"08",X"D9",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"AF",X"32",X"80",X"A1",X"21", + X"40",X"88",X"DD",X"21",X"10",X"94",X"11",X"10",X"90",X"06",X"04",X"3A",X"0A",X"88",X"FE",X"04", + X"28",X"04",X"06",X"18",X"18",X"18",X"CD",X"14",X"07",X"21",X"7C",X"88",X"06",X"03",X"CD",X"14", + X"07",X"21",X"50",X"88",X"06",X"0B",X"CD",X"14",X"07",X"21",X"88",X"88",X"06",X"06",X"CD",X"14", + X"07",X"32",X"00",X"A0",X"3A",X"15",X"88",X"32",X"16",X"88",X"3A",X"13",X"88",X"32",X"15",X"88", + X"2A",X"10",X"88",X"22",X"13",X"88",X"21",X"12",X"88",X"3A",X"C0",X"A0",X"2F",X"77",X"2B",X"3A", + X"A0",X"A0",X"2F",X"77",X"2B",X"3A",X"80",X"A0",X"2F",X"77",X"21",X"3F",X"88",X"35",X"21",X"5F", + X"8A",X"35",X"CD",X"E8",X"59",X"CD",X"64",X"0E",X"21",X"FA",X"06",X"E5",X"3A",X"05",X"88",X"EF", + X"2D",X"07",X"99",X"08",X"4E",X"0C",X"9B",X"15",X"53",X"0E",X"3A",X"1F",X"88",X"32",X"87",X"A1", + X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"D9",X"08",X"E1",X"D1",X"C1",X"3E",X"01",X"32", + X"80",X"A1",X"F1",X"C9",X"7E",X"DD",X"77",X"01",X"2C",X"7E",X"DD",X"77",X"00",X"2C",X"7E",X"12", + X"13",X"2C",X"7E",X"12",X"13",X"2C",X"DD",X"23",X"DD",X"23",X"10",X"E8",X"C9",X"06",X"20",X"CD", + X"CE",X"02",X"C0",X"3A",X"FF",X"8F",X"FE",X"10",X"C2",X"0F",X"02",X"21",X"06",X"88",X"36",X"00", + X"2B",X"36",X"01",X"AF",X"32",X"0A",X"88",X"01",X"79",X"07",X"CD",X"5D",X"07",X"11",X"04",X"06", + X"FF",X"11",X"00",X"05",X"FF",X"1E",X"02",X"FF",X"AF",X"32",X"51",X"8E",X"C9",X"21",X"40",X"80", + X"11",X"20",X"00",X"0A",X"77",X"19",X"7C",X"FE",X"84",X"38",X"F8",X"26",X"80",X"CB",X"F5",X"03", + X"2C",X"7D",X"E6",X"1F",X"FE",X"1F",X"38",X"EB",X"C9",X"1D",X"03",X"10",X"10",X"17",X"17",X"16", + X"17",X"17",X"17",X"17",X"17",X"00",X"18",X"18",X"18",X"10",X"10",X"10",X"1B",X"1B",X"1B",X"1B", + X"1B",X"1B",X"1B",X"1B",X"1B",X"19",X"16",X"16",X"11",X"0D",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A", + X"0A",X"0A",X"0A",X"0A",X"0A",X"00",X"00",X"04",X"00",X"0D",X"03",X"0F",X"0F",X"0F",X"0F",X"0F", + X"07",X"07",X"00",X"08",X"08",X"08",X"0C",X"0C",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E",X"07",X"07", + X"07",X"17",X"17",X"17",X"14",X"0E",X"16",X"14",X"00",X"0D",X"03",X"00",X"00",X"0D",X"00",X"00", + X"07",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"08",X"0B",X"0B",X"0B",X"0B", + X"0C",X"0C",X"0C",X"0C",X"00",X"11",X"00",X"04",X"00",X"1D",X"03",X"14",X"11",X"1C",X"1C",X"1C", + X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"1C", + X"1C",X"1C",X"1C",X"1C",X"1C",X"1F",X"16",X"14",X"11",X"1D",X"03",X"14",X"14",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"1B",X"00",X"0C",X"00",X"08",X"00",X"0C", + X"00",X"19",X"00",X"0E",X"11",X"1F",X"1F",X"10",X"07",X"1D",X"03",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"11",X"0D",X"03",X"00",X"00",X"07",X"07",X"07", + X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0B",X"0B",X"0B",X"0B",X"07",X"00",X"04",X"00",X"1D",X"03",X"12",X"12",X"12",X"12",X"12", + X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12", + X"12",X"12",X"12",X"12",X"12",X"12",X"10",X"10",X"11",X"21",X"B5",X"0B",X"E5",X"3A",X"51",X"8E", + X"EF",X"B3",X"08",X"E9",X"08",X"2C",X"09",X"86",X"09",X"9C",X"09",X"C8",X"0A",X"32",X"0B",X"42", + X"74",X"EA",X"76",X"AF",X"32",X"28",X"A0",X"32",X"19",X"88",X"CD",X"E3",X"02",X"21",X"51",X"8E", + X"34",X"01",X"D5",X"64",X"2E",X"00",X"65",X"0A",X"FE",X"96",X"28",X"08",X"84",X"30",X"01",X"2C", + X"67",X"0B",X"18",X"F3",X"95",X"FE",X"8F",X"28",X"05",X"3E",X"01",X"32",X"FB",X"89",X"AF",X"32", + X"06",X"88",X"CD",X"B9",X"02",X"CD",X"0D",X"1D",X"C9",X"06",X"1D",X"CD",X"CE",X"02",X"C0",X"CD", + X"E3",X"02",X"21",X"59",X"08",X"06",X"1F",X"7E",X"23",X"86",X"10",X"FC",X"FE",X"63",X"20",X"F2", + X"01",X"59",X"08",X"CD",X"5D",X"07",X"21",X"31",X"08",X"06",X"08",X"7E",X"23",X"86",X"10",X"FC", + X"FE",X"AA",X"20",X"DE",X"CD",X"54",X"0E",X"11",X"11",X"06",X"FF",X"1E",X"0B",X"FF",X"21",X"51", + X"8E",X"36",X"07",X"C9",X"58",X"40",X"38",X"06",X"88",X"40",X"38",X"0B",X"06",X"19",X"CD",X"CE", + X"02",X"C0",X"CD",X"E3",X"02",X"21",X"51",X"8E",X"34",X"CD",X"B9",X"02",X"21",X"F5",X"07",X"3E", + X"11",X"BE",X"20",X"FD",X"DD",X"21",X"38",X"08",X"06",X"07",X"21",X"76",X"09",X"78",X"CD",X"45", + X"0C",X"3E",X"1C",X"83",X"5F",X"30",X"01",X"14",X"1A",X"4F",X"DD",X"7E",X"00",X"B9",X"20",X"16", + X"DD",X"2B",X"10",X"E6",X"01",X"D9",X"07",X"CD",X"5D",X"07",X"11",X"8B",X"06",X"FF",X"1E",X"8E", + X"FF",X"11",X"00",X"02",X"FF",X"C9",X"79",X"07",X"99",X"07",X"B9",X"07",X"D9",X"07",X"F9",X"07", + X"19",X"08",X"39",X"08",X"59",X"08",X"21",X"50",X"8E",X"35",X"C0",X"CD",X"B9",X"02",X"CD",X"E3", + X"02",X"21",X"51",X"8E",X"34",X"21",X"26",X"0B",X"22",X"48",X"8F",X"C9",X"06",X"19",X"CD",X"CE", + X"02",X"C0",X"16",X"0D",X"21",X"65",X"0A",X"01",X"C9",X"07",X"0A",X"96",X"20",X"FC",X"03",X"23", + X"15",X"20",X"F7",X"01",X"B9",X"07",X"CD",X"5D",X"07",X"11",X"0D",X"06",X"FF",X"21",X"70",X"8B", + X"AF",X"47",X"D7",X"21",X"76",X"0A",X"11",X"7E",X"0A",X"DD",X"21",X"70",X"8B",X"CD",X"0C",X"0A", + X"01",X"18",X"00",X"DD",X"09",X"1A",X"3C",X"20",X"F4",X"CD",X"52",X"0A",X"CD",X"25",X"0A",X"21", + X"87",X"0A",X"22",X"54",X"8E",X"21",X"48",X"86",X"22",X"56",X"8E",X"21",X"50",X"8E",X"36",X"32", + X"2C",X"34",X"2C",X"36",X"0D",X"2C",X"36",X"05",X"DD",X"21",X"70",X"8B",X"06",X"04",X"11",X"18", + X"00",X"CD",X"06",X"40",X"DD",X"19",X"10",X"F9",X"CD",X"EF",X"02",X"C9",X"1A",X"DD",X"77",X"06", + X"13",X"1A",X"13",X"DD",X"77",X"04",X"7E",X"DD",X"77",X"0C",X"23",X"7E",X"DD",X"77",X"0D",X"DD", + X"36",X"0E",X"00",X"23",X"C9",X"21",X"41",X"8D",X"36",X"0A",X"2D",X"7E",X"34",X"E6",X"03",X"21", + X"F6",X"26",X"CD",X"45",X"0C",X"D5",X"21",X"6A",X"86",X"CD",X"40",X"0A",X"D1",X"21",X"AA",X"86", + X"01",X"20",X"00",X"1A",X"77",X"2C",X"13",X"1A",X"77",X"09",X"13",X"1A",X"77",X"2D",X"13",X"1A", + X"77",X"C9",X"21",X"AA",X"82",X"11",X"72",X"0A",X"CD",X"40",X"0A",X"21",X"6A",X"82",X"11",X"72", + X"0A",X"CD",X"40",X"0A",X"C9",X"0C",X"0C",X"0E",X"0E",X"0E",X"07",X"07",X"07",X"17",X"17",X"17", + X"14",X"0E",X"00",X"00",X"00",X"00",X"5D",X"2D",X"EF",X"68",X"38",X"38",X"12",X"42",X"0A",X"08", + X"0A",X"0E",X"0A",X"13",X"0A",X"16",X"FF",X"10",X"40",X"40",X"40",X"10",X"10",X"20",X"1F",X"1F", + X"29",X"11",X"1E",X"10",X"10",X"40",X"40",X"40",X"10",X"10",X"12",X"25",X"25",X"29",X"11",X"1E", + X"10",X"10",X"40",X"40",X"40",X"10",X"10",X"1D",X"11",X"1D",X"11",X"10",X"10",X"10",X"10",X"40", + X"40",X"40",X"10",X"10",X"27",X"1F",X"1C",X"16",X"10",X"10",X"10",X"10",X"40",X"40",X"40",X"10", + X"10",X"12",X"1F",X"23",X"23",X"10",X"10",X"10",X"21",X"41",X"8D",X"35",X"20",X"03",X"CD",X"28", + X"0A",X"CD",X"F8",X"09",X"21",X"50",X"8E",X"35",X"C0",X"36",X"02",X"2A",X"54",X"8E",X"7E",X"23", + X"22",X"54",X"8E",X"2A",X"56",X"8E",X"77",X"11",X"E0",X"FF",X"19",X"22",X"56",X"8E",X"21",X"52", + X"8E",X"35",X"C0",X"36",X"0D",X"21",X"50",X"8E",X"36",X"14",X"2C",X"34",X"2A",X"56",X"8E",X"11", + X"00",X"00",X"06",X"0E",X"7E",X"83",X"5F",X"30",X"01",X"14",X"3E",X"20",X"85",X"6F",X"30",X"01", + X"24",X"10",X"F1",X"2A",X"48",X"8F",X"7E",X"BB",X"C2",X"42",X"74",X"23",X"7E",X"BA",X"C2",X"EA", + X"76",X"23",X"22",X"48",X"8F",X"C9",X"C6",X"01",X"C4",X"01",X"8C",X"01",X"A8",X"01",X"A7",X"01", + X"BC",X"1C",X"21",X"BC",X"82",X"11",X"E0",X"FF",X"06",X"0A",X"7E",X"19",X"BE",X"C2",X"B3",X"08", + X"10",X"F8",X"21",X"41",X"8D",X"35",X"20",X"03",X"CD",X"28",X"0A",X"CD",X"F8",X"09",X"21",X"50", + X"8E",X"35",X"C0",X"36",X"01",X"2C",X"35",X"3A",X"53",X"8E",X"3D",X"21",X"AB",X"0B",X"CD",X"45", + X"0C",X"ED",X"53",X"56",X"8E",X"21",X"53",X"8E",X"35",X"C0",X"21",X"50",X"8E",X"36",X"96",X"2C", + X"AF",X"77",X"21",X"62",X"84",X"57",X"5F",X"0E",X"0E",X"06",X"1D",X"7B",X"86",X"30",X"01",X"14", + X"5F",X"23",X"10",X"F7",X"7D",X"C6",X"03",X"6F",X"30",X"01",X"24",X"0D",X"20",X"EB",X"2A",X"48", + X"8F",X"7B",X"BE",X"C2",X"B3",X"08",X"23",X"7E",X"BA",X"C2",X"E9",X"08",X"AF",X"32",X"48",X"8F", + X"32",X"49",X"8F",X"3E",X"03",X"32",X"05",X"88",X"C3",X"00",X"0E",X"59",X"86",X"56",X"86",X"53", + X"86",X"4E",X"86",X"4B",X"86",X"3A",X"06",X"88",X"A7",X"20",X"41",X"3A",X"05",X"88",X"3D",X"20", + X"3B",X"3A",X"51",X"8E",X"FE",X"03",X"28",X"08",X"FE",X"05",X"28",X"04",X"FE",X"08",X"20",X"2C", + X"11",X"E0",X"FF",X"21",X"FE",X"8E",X"34",X"21",X"BC",X"86",X"01",X"C2",X"20",X"0A",X"96",X"20", + X"16",X"19",X"03",X"0A",X"3C",X"20",X"F6",X"11",X"C0",X"FB",X"19",X"EB",X"21",X"CB",X"20",X"3A", + X"51",X"8E",X"E7",X"EB",X"BE",X"28",X"05",X"3E",X"01",X"32",X"E5",X"89",X"3A",X"2C",X"88",X"FE", + X"0F",X"20",X"19",X"3A",X"10",X"88",X"CB",X"5F",X"28",X"09",X"CD",X"CF",X"0E",X"21",X"00",X"00", + X"C3",X"AB",X"0D",X"CB",X"67",X"C8",X"CD",X"CF",X"0E",X"C3",X"A8",X"0D",X"3A",X"02",X"88",X"A7", + X"C8",X"21",X"05",X"88",X"34",X"AF",X"32",X"0A",X"88",X"C9",X"3A",X"80",X"A0",X"CB",X"5F",X"C0", + X"3E",X"09",X"32",X"51",X"8E",X"21",X"00",X"84",X"1E",X"10",X"01",X"FF",X"03",X"73",X"23",X"0B", + X"78",X"B1",X"20",X"F9",X"C9",X"87",X"16",X"00",X"5F",X"19",X"5E",X"23",X"56",X"C9",X"21",X"78", + X"0D",X"E5",X"3A",X"0A",X"88",X"EF",X"5C",X"0C",X"77",X"0C",X"61",X"0D",X"AF",X"32",X"19",X"88", + X"32",X"28",X"A0",X"32",X"06",X"88",X"21",X"42",X"84",X"22",X"0B",X"88",X"21",X"09",X"88",X"36", + X"0F",X"23",X"34",X"CD",X"B9",X"02",X"C9",X"2A",X"0B",X"88",X"06",X"1D",X"3E",X"10",X"D7",X"11", + X"03",X"00",X"19",X"06",X"1D",X"D7",X"19",X"22",X"0B",X"88",X"21",X"09",X"88",X"35",X"C0",X"2C", + X"34",X"21",X"79",X"07",X"01",X"00",X"00",X"7E",X"23",X"86",X"30",X"01",X"0C",X"10",X"F9",X"FE", + X"C1",X"20",X"F5",X"79",X"FE",X"0C",X"20",X"F0",X"01",X"79",X"07",X"CD",X"5D",X"07",X"32",X"0D", + X"88",X"CD",X"54",X"0E",X"CD",X"F8",X"0C",X"11",X"01",X"06",X"FF",X"1E",X"11",X"FF",X"1E",X"16", + X"FF",X"1C",X"3A",X"00",X"88",X"E6",X"01",X"28",X"02",X"1E",X"28",X"FF",X"1E",X"2A",X"3A",X"00", + X"88",X"E6",X"01",X"28",X"01",X"1D",X"FF",X"CD",X"4E",X"0F",X"21",X"26",X"0B",X"11",X"00",X"00", + X"06",X"20",X"7E",X"83",X"5F",X"30",X"01",X"14",X"23",X"10",X"F7",X"7B",X"FE",X"D3",X"00",X"00", + X"00",X"3E",X"0B",X"BA",X"00",X"00",X"00",X"C9",X"21",X"2F",X"0D",X"DD",X"21",X"A7",X"86",X"11", + X"E0",X"FF",X"06",X"0C",X"7E",X"DD",X"77",X"00",X"23",X"DD",X"19",X"10",X"F7",X"7E",X"FE",X"FF", + X"28",X"0F",X"FE",X"EE",X"C8",X"11",X"81",X"01",X"DD",X"19",X"11",X"E0",X"FF",X"06",X"0C",X"18", + X"E3",X"21",X"48",X"0D",X"DD",X"21",X"A7",X"82",X"11",X"E0",X"FF",X"06",X"0C",X"18",X"D5",X"0C", + X"0C",X"0C",X"0C",X"0C",X"0C",X"0E",X"0E",X"0C",X"0C",X"A4",X"A5",X"0D",X"0C",X"0C",X"0C",X"0C", + X"0C",X"0F",X"0F",X"3B",X"3B",X"A5",X"A4",X"FF",X"00",X"80",X"03",X"83",X"0D",X"8D",X"00",X"80", + X"05",X"85",X"00",X"C0",X"00",X"C0",X"43",X"C3",X"4D",X"CD",X"00",X"80",X"02",X"82",X"00",X"C0", + X"EE",X"3A",X"02",X"88",X"A7",X"C8",X"3D",X"11",X"18",X"06",X"28",X"01",X"1C",X"FF",X"11",X"00", + X"03",X"FF",X"3E",X"02",X"32",X"05",X"88",X"C9",X"3A",X"10",X"88",X"CB",X"5F",X"C2",X"E4",X"0D", + X"CB",X"67",X"C8",X"3A",X"02",X"88",X"FE",X"02",X"D8",X"D6",X"02",X"32",X"02",X"88",X"21",X"6B", + X"77",X"06",X"14",X"58",X"53",X"7E",X"83",X"5F",X"30",X"01",X"14",X"23",X"10",X"F7",X"7B",X"82", + X"E6",X"AB",X"28",X"04",X"21",X"EA",X"89",X"34",X"21",X"00",X"01",X"22",X"0D",X"88",X"CD",X"54", + X"0E",X"AF",X"32",X"0A",X"88",X"3E",X"03",X"32",X"05",X"88",X"3E",X"01",X"32",X"06",X"88",X"32", + X"1F",X"88",X"11",X"04",X"06",X"FF",X"CD",X"00",X"0E",X"21",X"21",X"8D",X"36",X"00",X"2C",X"36", + X"20",X"11",X"00",X"04",X"FF",X"3A",X"0E",X"88",X"0F",X"D0",X"1C",X"FF",X"AF",X"21",X"1F",X"8E", + X"06",X"0C",X"D7",X"C9",X"3A",X"02",X"88",X"A7",X"28",X"0A",X"3D",X"32",X"02",X"88",X"21",X"00", + X"00",X"C3",X"AB",X"0D",X"3A",X"0A",X"88",X"FE",X"0E",X"C8",X"3E",X"01",X"32",X"05",X"88",X"C9", + X"21",X"00",X"89",X"AF",X"32",X"0A",X"88",X"32",X"E1",X"89",X"32",X"E2",X"89",X"32",X"E3",X"89", + X"32",X"5B",X"8F",X"06",X"BF",X"D7",X"3A",X"07",X"88",X"32",X"48",X"89",X"32",X"88",X"89",X"3E", + X"20",X"32",X"41",X"89",X"32",X"81",X"89",X"3A",X"20",X"88",X"32",X"40",X"89",X"32",X"80",X"89", + X"CD",X"E3",X"02",X"3A",X"06",X"88",X"A7",X"C8",X"AF",X"32",X"3F",X"8F",X"32",X"30",X"8F",X"32", + X"0E",X"8F",X"32",X"0F",X"8F",X"C9",X"11",X"04",X"00",X"06",X"06",X"3E",X"FB",X"A6",X"77",X"19", + X"10",X"F9",X"C9",X"C9",X"11",X"01",X"07",X"FF",X"3A",X"2C",X"88",X"FE",X"0F",X"20",X"04",X"11", + X"06",X"06",X"FF",X"C9",X"11",X"41",X"8A",X"1A",X"6F",X"26",X"8A",X"7E",X"FE",X"FF",X"C8",X"47", + X"3A",X"21",X"88",X"E6",X"01",X"20",X"06",X"3A",X"06",X"88",X"A7",X"28",X"04",X"78",X"CD",X"8F", + X"0E",X"36",X"FF",X"7D",X"FE",X"5E",X"28",X"03",X"3C",X"12",X"C9",X"3E",X"43",X"12",X"C9",X"32", + X"00",X"A1",X"3E",X"01",X"32",X"81",X"A1",X"00",X"00",X"00",X"00",X"00",X"00",X"3D",X"32",X"81", + X"A1",X"C9",X"32",X"20",X"8D",X"3A",X"06",X"88",X"A7",X"20",X"05",X"3A",X"50",X"8F",X"A7",X"C8", + X"3A",X"20",X"8D",X"C5",X"D5",X"E5",X"47",X"11",X"40",X"8A",X"1A",X"6F",X"26",X"8A",X"70",X"7D", + X"FE",X"5E",X"28",X"04",X"3C",X"12",X"18",X"03",X"3E",X"43",X"12",X"E1",X"D1",X"C1",X"C9",X"AF", + X"18",X"E1",X"3E",X"01",X"18",X"CC",X"3E",X"02",X"18",X"D9",X"3E",X"82",X"CD",X"B3",X"0E",X"3E", + X"03",X"18",X"D0",X"3A",X"24",X"8F",X"A7",X"C0",X"3A",X"32",X"8D",X"A7",X"C0",X"3E",X"04",X"18", + X"B1",X"3E",X"05",X"18",X"BE",X"3E",X"06",X"18",X"A9",X"3E",X"07",X"18",X"A5",X"3E",X"08",X"18", + X"A1",X"3E",X"09",X"18",X"AE",X"3E",X"0A",X"18",X"99",X"3E",X"0B",X"18",X"82",X"3E",X"0B",X"18", + X"91",X"3E",X"0C",X"18",X"8D",X"3E",X"0D",X"18",X"89",X"3E",X"0E",X"18",X"85",X"3E",X"0F",X"18", + X"81",X"3E",X"95",X"CD",X"A2",X"0E",X"3E",X"10",X"C3",X"A2",X"0E",X"3E",X"11",X"C3",X"A2",X"0E", + X"3E",X"95",X"CD",X"A2",X"0E",X"3E",X"03",X"CD",X"A2",X"0E",X"3E",X"11",X"C3",X"A2",X"0E",X"3E", + X"12",X"C3",X"A2",X"0E",X"3E",X"13",X"C3",X"A2",X"0E",X"3E",X"14",X"C3",X"A2",X"0E",X"3E",X"82", + X"CD",X"B3",X"0E",X"3E",X"95",X"C3",X"B3",X"0E",X"3E",X"96",X"CD",X"A2",X"0E",X"3E",X"97",X"CD", + X"A2",X"0E",X"3E",X"18",X"CD",X"B3",X"0E",X"3E",X"15",X"C3",X"B3",X"0E",X"3E",X"19",X"CD",X"B3", + X"0E",X"3E",X"15",X"C3",X"B3",X"0E",X"3A",X"68",X"8D",X"B7",X"C0",X"3A",X"07",X"89",X"E6",X"01", + X"C6",X"1A",X"CD",X"A2",X"0E",X"C3",X"C3",X"0F",X"3E",X"82",X"CD",X"A2",X"0E",X"3E",X"1C",X"C3", + X"C3",X"0F",X"3E",X"1D",X"C3",X"C3",X"0F",X"3A",X"07",X"89",X"0F",X"E6",X"03",X"C6",X"1E",X"C3", + X"C3",X"0F",X"3A",X"07",X"89",X"0F",X"E6",X"03",X"C6",X"22",X"C3",X"C3",X"0F",X"3E",X"26",X"C3", + X"C3",X"0F",X"3E",X"27",X"CD",X"B3",X"0E",X"3E",X"15",X"C3",X"B3",X"0E",X"3E",X"28",X"C3",X"C3", + X"0F",X"3E",X"29",X"CD",X"A2",X"0E",X"3E",X"15",X"CD",X"A2",X"0E",X"3E",X"16",X"CD",X"A2",X"0E", + X"3E",X"17",X"C3",X"A2",X"0E",X"3A",X"5C",X"8F",X"E6",X"07",X"FE",X"02",X"38",X"04",X"21",X"35", + X"10",X"E5",X"EF",X"EF",X"0F",X"16",X"10",X"90",X"10",X"A2",X"10",X"3C",X"11",X"4F",X"11",X"3E", + X"0F",X"21",X"01",X"89",X"77",X"2E",X"07",X"CB",X"56",X"28",X"03",X"CD",X"F1",X"50",X"3E",X"01", + X"32",X"61",X"8F",X"32",X"3F",X"8F",X"32",X"5C",X"8F",X"CD",X"BC",X"0F",X"21",X"38",X"8A",X"7E", + X"23",X"B7",X"C8",X"32",X"5C",X"8F",X"CD",X"83",X"15",X"CD",X"42",X"10",X"CD",X"7D",X"10",X"CD", + X"D4",X"20",X"CD",X"1B",X"51",X"CD",X"19",X"12",X"CD",X"BD",X"40",X"CD",X"EF",X"02",X"CD",X"E4", + X"5A",X"CD",X"64",X"0E",X"C9",X"CD",X"57",X"21",X"CD",X"19",X"12",X"CD",X"BD",X"40",X"CD",X"EF", + X"02",X"C9",X"3E",X"01",X"32",X"3F",X"8F",X"DD",X"21",X"80",X"8A",X"FD",X"21",X"90",X"8C",X"DD", + X"7E",X"02",X"A7",X"20",X"23",X"3A",X"24",X"8F",X"21",X"57",X"8F",X"B6",X"20",X"1A",X"3A",X"1F", + X"88",X"A7",X"3A",X"A0",X"A0",X"20",X"03",X"3A",X"C0",X"A0",X"2F",X"DD",X"77",X"07",X"DD",X"7E", + X"1E",X"A7",X"C0",X"DD",X"CB",X"07",X"A6",X"C9",X"DD",X"36",X"07",X"00",X"C9",X"3A",X"01",X"89", + X"A7",X"C0",X"21",X"5C",X"8F",X"34",X"11",X"35",X"06",X"FF",X"3E",X"40",X"32",X"62",X"8F",X"C9", + X"21",X"62",X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"21",X"5C",X"8F",X"34",X"11",X"34",X"06", + X"FF",X"C9",X"3A",X"5D",X"8F",X"FE",X"0A",X"38",X"04",X"47",X"CD",X"31",X"11",X"21",X"50",X"86", + X"CD",X"19",X"11",X"3A",X"5D",X"8F",X"A7",X"28",X"26",X"FE",X"0C",X"30",X"22",X"D6",X"07",X"06", + X"05",X"28",X"0D",X"30",X"06",X"04",X"3C",X"20",X"FC",X"18",X"05",X"05",X"3D",X"20",X"FC",X"78", + X"78",X"32",X"62",X"8F",X"CB",X"20",X"CD",X"31",X"11",X"21",X"D0",X"85",X"CD",X"19",X"11",X"3A", + X"5E",X"8F",X"FE",X"0A",X"38",X"04",X"47",X"CD",X"31",X"11",X"21",X"52",X"86",X"CD",X"19",X"11", + X"21",X"60",X"8F",X"7E",X"A7",X"28",X"1A",X"47",X"2E",X"62",X"86",X"77",X"CB",X"20",X"CD",X"31", + X"11",X"5F",X"79",X"A7",X"28",X"04",X"79",X"32",X"F2",X"85",X"21",X"D2",X"85",X"7B",X"CD",X"19", + X"11",X"21",X"5C",X"8F",X"34",X"CD",X"44",X"0F",X"C9",X"01",X"E0",X"FF",X"5F",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"A7",X"20",X"02",X"3E",X"10",X"77",X"09",X"7B",X"E6",X"0F",X"77", + X"C9",X"AF",X"4F",X"C6",X"01",X"27",X"30",X"01",X"0C",X"10",X"F8",X"C9",X"21",X"62",X"8F",X"7E", + X"A7",X"28",X"06",X"35",X"11",X"15",X"03",X"FF",X"C9",X"36",X"80",X"2E",X"5C",X"34",X"C9",X"21", + X"62",X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"AF",X"2E",X"5B",X"06",X"09",X"D7",X"CD",X"CF", + X"0E",X"3E",X"06",X"32",X"0A",X"88",X"21",X"3C",X"8A",X"3A",X"2B",X"88",X"86",X"A7",X"C8",X"18", + X"1C",X"21",X"07",X"8D",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"3A",X"01",X"89",X"2E",X"40",X"96", + X"C8",X"D8",X"4F",X"7E",X"FE",X"06",X"D0",X"DD",X"21",X"E0",X"8A",X"06",X"06",X"1E",X"1D",X"CD", + X"9A",X"11",X"11",X"18",X"00",X"DD",X"19",X"10",X"F4",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01", + X"0F",X"D8",X"41",X"DD",X"36",X"00",X"01",X"DD",X"36",X"02",X"03",X"DD",X"73",X"04",X"AF",X"DD", + X"77",X"03",X"DD",X"77",X"05",X"DD",X"77",X"06",X"DD",X"77",X"08",X"DD",X"36",X"07",X"01",X"DD", + X"77",X"0B",X"21",X"09",X"12",X"3A",X"07",X"89",X"E6",X"3F",X"CB",X"3F",X"CB",X"3F",X"FE",X"10", + X"E7",X"DD",X"77",X"09",X"ED",X"44",X"DD",X"77",X"0A",X"11",X"29",X"38",X"CD",X"1E",X"38",X"21", + X"F9",X"11",X"3A",X"07",X"89",X"E6",X"3F",X"CB",X"2F",X"CB",X"2F",X"E7",X"32",X"07",X"8D",X"21", + X"5F",X"8F",X"34",X"21",X"40",X"8D",X"34",X"F1",X"C9",X"50",X"4C",X"48",X"44",X"40",X"3C",X"38", + X"30",X"2E",X"2C",X"2A",X"28",X"26",X"24",X"24",X"22",X"14",X"14",X"16",X"16",X"18",X"18",X"1A", + X"1A",X"1B",X"1B",X"1C",X"1C",X"1D",X"1D",X"1E",X"1E",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00", + X"06",X"0E",X"D9",X"CD",X"2C",X"12",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD", + X"B6",X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"E6",X"1F",X"FE",X"11",X"D0",X"EF",X"5F",X"12",X"70", + X"12",X"36",X"35",X"AF",X"12",X"65",X"38",X"96",X"14",X"E3",X"3B",X"92",X"3C",X"DC",X"14",X"18", + X"15",X"4D",X"15",X"69",X"3E",X"9C",X"3E",X"5C",X"3F",X"72",X"3F",X"7C",X"3F",X"E9",X"3F",X"DD", + X"35",X"11",X"C0",X"DD",X"34",X"02",X"11",X"38",X"38",X"DD",X"36",X"08",X"01",X"C3",X"1E",X"38", + X"CD",X"06",X"40",X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"05",X"B8",X"30",X"03",X"DD", + X"35",X"06",X"DD",X"86",X"0A",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"A7",X"C0",X"CD",X"53",X"35", + X"21",X"40",X"8D",X"35",X"21",X"01",X"89",X"7E",X"4F",X"A7",X"28",X"01",X"35",X"3A",X"0A",X"88", + X"FE",X"04",X"20",X"02",X"2C",X"34",X"79",X"3D",X"FE",X"0A",X"D0",X"32",X"43",X"87",X"C9",X"CD", + X"06",X"40",X"DD",X"7E",X"08",X"A7",X"C2",X"FE",X"13",X"DD",X"7E",X"05",X"DD",X"86",X"09",X"30", + X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"47",X"3A",X"01",X"89",X"FE",X"03",X"DA",X"99",X"13", + X"21",X"FB",X"12",X"3A",X"07",X"89",X"E6",X"1F",X"CB",X"3F",X"CB",X"3F",X"CD",X"45",X"0C",X"EB", + X"3A",X"41",X"8D",X"E6",X"0F",X"E7",X"4F",X"DD",X"7E",X"06",X"B9",X"CA",X"83",X"13",X"FE",X"14", + X"D8",X"DD",X"36",X"08",X"01",X"11",X"38",X"38",X"C3",X"1E",X"38",X"0B",X"13",X"1A",X"13",X"29", + X"13",X"38",X"13",X"47",X"13",X"56",X"13",X"65",X"13",X"74",X"13",X"11",X"0D",X"09",X"0D",X"09", + X"12",X"0E",X"0B",X"09",X"0D",X"09",X"09",X"11",X"0D",X"09",X"0D",X"09",X"11",X"0D",X"09",X"09", + X"12",X"10",X"09",X"0D",X"09",X"11",X"0D",X"09",X"09",X"11",X"0D",X"11",X"0D",X"09",X"11",X"0F", + X"0D",X"09",X"12",X"0D",X"10",X"09",X"0D",X"09",X"09",X"09",X"09",X"11",X"0C",X"08",X"0D",X"09", + X"11",X"0E",X"0B",X"08",X"11",X"0D",X"09",X"11",X"0D",X"09",X"0D",X"11",X"0D",X"09",X"0D",X"11", + X"0D",X"09",X"0D",X"11",X"0D",X"09",X"11",X"0D",X"09",X"09",X"11",X"0D",X"0D",X"09",X"12",X"11", + X"0D",X"09",X"11",X"0D",X"09",X"0D",X"09",X"0B",X"08",X"11",X"12",X"0D",X"11",X"0D",X"10",X"09", + X"10",X"11",X"0D",X"09",X"11",X"0D",X"0B",X"09",X"12",X"10",X"0D",X"0C",X"09",X"0B",X"10",X"0C", + X"11",X"0D",X"18",X"78",X"FE",X"20",X"D0",X"18",X"33",X"DD",X"CB",X"08",X"46",X"C8",X"C3",X"1C", + X"14",X"DD",X"CB",X"08",X"46",X"C0",X"C3",X"D0",X"12",X"DD",X"7E",X"06",X"FE",X"07",X"38",X"E9", + X"FE",X"14",X"30",X"ED",X"21",X"6B",X"8D",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"78",X"FE",X"80", + X"D0",X"EB",X"21",X"D3",X"13",X"3A",X"07",X"89",X"E6",X"07",X"E7",X"12",X"FD",X"21",X"70",X"8B", + X"11",X"18",X"00",X"06",X"05",X"FD",X"7E",X"00",X"FD",X"B6",X"01",X"0F",X"30",X"0D",X"FD",X"19", + X"10",X"F3",X"C9",X"28",X"28",X"20",X"20",X"18",X"18",X"10",X"10",X"21",X"41",X"8D",X"34",X"20", + X"01",X"34",X"4E",X"DD",X"71",X"14",X"21",X"88",X"39",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD", + X"36",X"0E",X"00",X"DD",X"36",X"11",X"28",X"DD",X"36",X"02",X"04",X"C3",X"2C",X"14",X"DD",X"7E", + X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"05",X"B8",X"30",X"03",X"DD",X"35",X"06",X"DD",X"86",X"0A", + X"DD",X"77",X"05",X"47",X"3A",X"01",X"89",X"FE",X"03",X"DA",X"99",X"13",X"DD",X"7E",X"06",X"FE", + X"02",X"D0",X"DD",X"36",X"08",X"00",X"11",X"29",X"38",X"C3",X"1E",X"38",X"FD",X"36",X"00",X"01", + X"FD",X"36",X"02",X"04",X"FD",X"71",X"14",X"AF",X"FD",X"77",X"07",X"FD",X"77",X"0E",X"DD",X"7E", + X"05",X"C6",X"80",X"FD",X"77",X"05",X"DD",X"7E",X"03",X"C6",X"80",X"FD",X"77",X"03",X"DD",X"7E", + X"04",X"D6",X"01",X"FD",X"77",X"04",X"DD",X"7E",X"06",X"C6",X"01",X"FD",X"77",X"06",X"3A",X"00", + X"89",X"FE",X"08",X"38",X"02",X"3E",X"07",X"21",X"8E",X"14",X"E7",X"3A",X"07",X"89",X"E6",X"01", + X"7E",X"28",X"02",X"ED",X"44",X"FD",X"77",X"0A",X"DD",X"77",X"0A",X"11",X"CB",X"38",X"FD",X"77", + X"0B",X"FD",X"73",X"0C",X"FD",X"72",X"0D",X"FD",X"36",X"11",X"28",X"C3",X"E3",X"0E",X"10",X"11", + X"12",X"13",X"14",X"15",X"16",X"17",X"CD",X"06",X"40",X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD", + X"7E",X"03",X"B8",X"30",X"03",X"DD",X"35",X"04",X"DD",X"86",X"0A",X"DD",X"77",X"03",X"DD",X"46", + X"04",X"DD",X"7E",X"07",X"A7",X"28",X"12",X"78",X"FE",X"04",X"38",X"04",X"DD",X"7E",X"06",X"C9", + X"DD",X"36",X"02",X"00",X"DD",X"36",X"11",X"20",X"C9",X"78",X"FE",X"02",X"D0",X"11",X"D1",X"3B", + X"CD",X"1E",X"38",X"DD",X"36",X"02",X"02",X"DD",X"36",X"11",X"28",X"C9",X"06",X"01",X"DD",X"4E", + X"17",X"3A",X"45",X"8D",X"A7",X"28",X"21",X"DD",X"4E",X"12",X"0C",X"28",X"1B",X"FE",X"05",X"38", + X"02",X"3E",X"04",X"47",X"05",X"48",X"28",X"06",X"3E",X"01",X"CB",X"27",X"10",X"FC",X"21",X"60", + X"8F",X"86",X"77",X"2E",X"5E",X"34",X"06",X"38",X"DD",X"70",X"11",X"79",X"21",X"57",X"15",X"CD", + X"45",X"0C",X"CD",X"1E",X"38",X"DD",X"34",X"02",X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"3A", + X"60",X"8F",X"CB",X"27",X"47",X"A7",X"28",X"12",X"CD",X"31",X"11",X"5F",X"79",X"A7",X"28",X"03", + X"32",X"E9",X"85",X"21",X"C9",X"85",X"7B",X"CD",X"19",X"11",X"DD",X"7E",X"16",X"FE",X"07",X"CA", + X"99",X"3D",X"3C",X"DD",X"77",X"13",X"DD",X"36",X"11",X"01",X"DD",X"34",X"02",X"CD",X"06",X"40", + X"DD",X"35",X"11",X"C0",X"C3",X"53",X"35",X"5F",X"15",X"68",X"15",X"71",X"15",X"7A",X"15",X"80", + X"01",X"05",X"40",X"1D",X"05",X"42",X"37",X"28",X"80",X"01",X"05",X"40",X"1D",X"05",X"43",X"39", + X"28",X"80",X"01",X"04",X"40",X"1D",X"04",X"42",X"39",X"28",X"80",X"01",X"03",X"40",X"1D",X"03", + X"4F",X"3A",X"38",X"21",X"4D",X"8F",X"34",X"7E",X"47",X"E6",X"0F",X"C0",X"CB",X"60",X"11",X"35", + X"06",X"28",X"02",X"1E",X"B5",X"FF",X"3A",X"EF",X"89",X"A7",X"C8",X"CD",X"12",X"79",X"21",X"D1", + X"15",X"E5",X"3A",X"0A",X"88",X"E6",X"1F",X"EF",X"01",X"16",X"B7",X"16",X"5D",X"17",X"C1",X"17", + X"AF",X"18",X"EE",X"19",X"01",X"1A",X"64",X"1A",X"43",X"1B",X"8C",X"1B",X"AB",X"1B",X"CC",X"1B", + X"03",X"1C",X"53",X"1C",X"66",X"1C",X"9C",X"1D",X"6E",X"1D",X"B2",X"6B",X"B9",X"71",X"FF",X"FF", + X"FF",X"3A",X"06",X"88",X"A7",X"C0",X"3A",X"2C",X"88",X"FE",X"0F",X"CA",X"B5",X"0B",X"3A",X"02", + X"88",X"A7",X"C8",X"21",X"05",X"88",X"36",X"02",X"2E",X"0A",X"36",X"00",X"CD",X"27",X"25",X"CD", + X"B9",X"02",X"21",X"5F",X"85",X"11",X"E0",X"FF",X"06",X"08",X"3E",X"10",X"77",X"19",X"10",X"FA", + X"C9",X"CD",X"C9",X"02",X"C0",X"CD",X"E3",X"02",X"CD",X"BC",X"19",X"AF",X"32",X"21",X"8D",X"21", + X"23",X"8D",X"06",X"C0",X"D7",X"21",X"21",X"8E",X"06",X"0C",X"D7",X"32",X"16",X"8F",X"32",X"17", + X"8F",X"3A",X"0E",X"88",X"A7",X"3E",X"02",X"28",X"2A",X"3A",X"E3",X"89",X"A7",X"20",X"24",X"3C", + X"32",X"E3",X"89",X"3A",X"0F",X"88",X"A7",X"3A",X"0D",X"88",X"20",X"06",X"3D",X"32",X"1F",X"88", + X"18",X"01",X"3D",X"11",X"02",X"06",X"A7",X"20",X"01",X"1C",X"FF",X"01",X"79",X"07",X"CD",X"5D", + X"07",X"3E",X"80",X"32",X"08",X"88",X"21",X"0A",X"88",X"34",X"3A",X"0D",X"88",X"21",X"40",X"89", + X"11",X"00",X"89",X"01",X"3F",X"00",X"A7",X"28",X"03",X"21",X"80",X"89",X"ED",X"B0",X"3A",X"03", + X"89",X"A7",X"28",X"05",X"D6",X"02",X"32",X"31",X"89",X"3A",X"06",X"89",X"A7",X"C0",X"32",X"05", + X"89",X"32",X"0A",X"89",X"11",X"AE",X"16",X"21",X"F0",X"89",X"1A",X"FE",X"FF",X"C8",X"77",X"13", + X"23",X"18",X"F7",X"C9",X"11",X"AE",X"16",X"21",X"F0",X"89",X"1A",X"FE",X"FF",X"28",X"07",X"BE", + X"20",X"15",X"13",X"23",X"18",X"F4",X"21",X"F0",X"89",X"AF",X"06",X"07",X"D7",X"C9",X"0A",X"10", + X"1B",X"1F",X"1E",X"11",X"1D",X"19",X"FF",X"21",X"08",X"88",X"35",X"C0",X"CD",X"E3",X"02",X"CD", + X"D3",X"1D",X"3A",X"50",X"8F",X"E6",X"01",X"28",X"06",X"3E",X"10",X"32",X"0A",X"88",X"C9",X"AF", + X"32",X"B7",X"88",X"CD",X"C2",X"03",X"3A",X"50",X"8F",X"A7",X"28",X"17",X"3A",X"07",X"89",X"CB", + X"4F",X"20",X"08",X"21",X"81",X"4E",X"11",X"39",X"50",X"18",X"3D",X"21",X"92",X"4C",X"11",X"CE", + X"4D",X"18",X"35",X"3A",X"04",X"89",X"A7",X"20",X"1C",X"3A",X"06",X"88",X"A7",X"28",X"16",X"3A", + X"07",X"89",X"CB",X"47",X"21",X"2C",X"46",X"11",X"30",X"4B",X"20",X"1C",X"A7",X"21",X"A9",X"44", + X"11",X"55",X"4B",X"28",X"13",X"3A",X"07",X"89",X"CB",X"47",X"21",X"D6",X"46",X"11",X"50",X"4A", + X"28",X"06",X"21",X"72",X"48",X"11",X"F6",X"4B",X"ED",X"53",X"45",X"8F",X"22",X"BA",X"88",X"21", + X"42",X"84",X"22",X"B8",X"88",X"21",X"42",X"80",X"22",X"43",X"8F",X"3E",X"20",X"32",X"07",X"8D", + X"21",X"0A",X"88",X"34",X"11",X"83",X"06",X"FF",X"CD",X"94",X"16",X"C9",X"FF",X"FF",X"E0",X"B0", + X"80",X"40",X"20",X"00",X"04",X"08",X"8D",X"8F",X"0F",X"88",X"8E",X"8C",X"5A",X"CD",X"81",X"43", + X"21",X"B7",X"88",X"34",X"7E",X"FE",X"1C",X"C0",X"36",X"00",X"21",X"20",X"89",X"7E",X"34",X"A7", + X"C8",X"AF",X"77",X"3A",X"50",X"8F",X"A7",X"20",X"42",X"3A",X"04",X"89",X"A7",X"20",X"22",X"3A", + X"06",X"88",X"A7",X"28",X"13",X"3A",X"07",X"89",X"CB",X"47",X"20",X"06",X"3A",X"07",X"89",X"A7", + X"20",X"06",X"3E",X"0D",X"32",X"0A",X"88",X"C9",X"3E",X"01",X"32",X"04",X"89",X"3C",X"32",X"03", + X"89",X"CD",X"AD",X"1E",X"CD",X"65",X"20",X"CD",X"0B",X"4A",X"3E",X"10",X"32",X"91",X"8A",X"32", + X"06",X"8F",X"32",X"09",X"8F",X"CD",X"0D",X"54",X"CD",X"EF",X"02",X"21",X"0A",X"88",X"36",X"03", + X"C9",X"DD",X"21",X"80",X"8A",X"3A",X"50",X"8F",X"A7",X"11",X"F6",X"84",X"20",X"0A",X"3A",X"07", + X"89",X"CB",X"47",X"21",X"2C",X"1E",X"20",X"05",X"21",X"34",X"1E",X"1E",X"E9",X"ED",X"53",X"BE", + X"88",X"11",X"18",X"00",X"06",X"04",X"DD",X"36",X"00",X"01",X"7E",X"DD",X"77",X"04",X"23",X"7E", + X"DD",X"77",X"06",X"23",X"DD",X"19",X"10",X"EE",X"DD",X"21",X"80",X"8A",X"3A",X"1F",X"88",X"A7", + X"20",X"06",X"DD",X"35",X"06",X"DD",X"35",X"06",X"21",X"C9",X"26",X"22",X"00",X"8F",X"CD",X"B1", + X"22",X"3A",X"50",X"8F",X"A7",X"20",X"31",X"3A",X"06",X"88",X"A7",X"20",X"0C",X"3A",X"3F",X"8F", + X"A7",X"28",X"06",X"21",X"0A",X"88",X"36",X"12",X"C9",X"21",X"0A",X"88",X"34",X"11",X"3F",X"18", + X"21",X"F0",X"89",X"1A",X"FE",X"43",X"C8",X"D6",X"88",X"77",X"13",X"23",X"18",X"F5",X"C9",X"92", + X"98",X"A3",X"A7",X"A6",X"99",X"A5",X"A1",X"43",X"3A",X"07",X"89",X"CB",X"4F",X"28",X"5A",X"3A", + X"07",X"89",X"CB",X"3F",X"FE",X"07",X"38",X"06",X"3E",X"08",X"06",X"03",X"18",X"07",X"CB",X"3F", + X"E6",X"03",X"47",X"C6",X"05",X"32",X"47",X"8F",X"78",X"21",X"EB",X"70",X"CD",X"45",X"0C",X"EB", + X"DD",X"21",X"E0",X"8A",X"3A",X"47",X"8F",X"47",X"0E",X"00",X"DD",X"36",X"05",X"80",X"DD",X"36", + X"00",X"01",X"DD",X"36",X"06",X"04",X"DD",X"74",X"04",X"7D",X"E6",X"0F",X"84",X"67",X"7D",X"E6", + X"F0",X"81",X"4F",X"DD",X"77",X"03",X"30",X"04",X"DD",X"34",X"04",X"24",X"11",X"29",X"38",X"CD", + X"1E",X"38",X"11",X"18",X"00",X"DD",X"19",X"10",X"D1",X"21",X"0A",X"88",X"36",X"0F",X"C9",X"CD", + X"55",X"1E",X"CD",X"AB",X"6C",X"CD",X"D4",X"20",X"CD",X"1B",X"51",X"CD",X"77",X"33",X"CD",X"BD", + X"40",X"CD",X"EF",X"02",X"CD",X"DA",X"18",X"CD",X"1C",X"19",X"CD",X"E4",X"5A",X"CD",X"6E",X"19", + X"CD",X"2F",X"1F",X"CD",X"3B",X"6B",X"CD",X"CA",X"19",X"C9",X"3A",X"09",X"89",X"A7",X"28",X"2E", + X"4F",X"3A",X"0D",X"88",X"21",X"A4",X"88",X"A7",X"28",X"03",X"21",X"A7",X"88",X"7E",X"B9",X"C0", + X"21",X"08",X"89",X"7E",X"FE",X"FF",X"30",X"01",X"34",X"3A",X"00",X"88",X"A7",X"3E",X"08",X"28", + X"01",X"3D",X"81",X"27",X"32",X"09",X"89",X"CD",X"C2",X"03",X"CD",X"0D",X"0F",X"C9",X"3A",X"00", + X"88",X"A7",X"3E",X"05",X"28",X"02",X"3E",X"03",X"32",X"09",X"89",X"C9",X"3A",X"01",X"89",X"A7", + X"C0",X"3A",X"82",X"8A",X"A7",X"C0",X"21",X"E2",X"8A",X"11",X"18",X"00",X"06",X"06",X"3E",X"03", + X"BE",X"C8",X"19",X"10",X"FB",X"21",X"0A",X"88",X"34",X"3A",X"07",X"89",X"CB",X"47",X"20",X"15", + X"CB",X"3F",X"47",X"3A",X"20",X"88",X"80",X"47",X"3A",X"03",X"89",X"80",X"47",X"FE",X"20",X"38", + X"02",X"3E",X"1F",X"18",X"0B",X"47",X"3A",X"20",X"88",X"80",X"FE",X"20",X"38",X"02",X"3E",X"1F", + X"32",X"00",X"89",X"AF",X"32",X"87",X"8A",X"32",X"05",X"89",X"32",X"06",X"89",X"C9",X"3A",X"55", + X"8D",X"A7",X"C0",X"3A",X"02",X"89",X"FE",X"05",X"38",X"26",X"28",X"0E",X"32",X"55",X"8D",X"3A", + X"32",X"8D",X"A7",X"20",X"03",X"CD",X"6C",X"0F",X"18",X"16",X"3A",X"32",X"8D",X"A7",X"20",X"03", + X"21",X"68",X"8D",X"7E",X"A7",X"20",X"09",X"36",X"01",X"2C",X"2C",X"36",X"01",X"CD",X"58",X"0F", + X"3A",X"21",X"8D",X"A7",X"C0",X"3A",X"24",X"8F",X"A7",X"C0",X"21",X"22",X"8D",X"7E",X"A7",X"28", + X"02",X"35",X"C9",X"36",X"20",X"2D",X"36",X"01",X"CD",X"76",X"0F",X"C9",X"21",X"80",X"8A",X"11", + X"81",X"8A",X"01",X"FF",X"01",X"36",X"00",X"ED",X"B0",X"C9",X"3A",X"06",X"88",X"A7",X"C0",X"3A", + X"68",X"8D",X"A7",X"C8",X"21",X"6A",X"8D",X"35",X"C0",X"36",X"18",X"2D",X"CB",X"46",X"20",X"07", + X"36",X"01",X"11",X"0F",X"06",X"FF",X"C9",X"36",X"00",X"11",X"8F",X"06",X"FF",X"C9",X"CD",X"8B", + X"30",X"CD",X"A6",X"25",X"CD",X"77",X"33",X"CD",X"BD",X"40",X"CD",X"C6",X"28",X"CD",X"EF",X"02", + X"C9",X"CD",X"27",X"25",X"32",X"02",X"89",X"32",X"34",X"89",X"0E",X"30",X"3A",X"07",X"89",X"FE", + X"02",X"30",X"02",X"0E",X"28",X"21",X"01",X"89",X"71",X"2E",X"07",X"34",X"7E",X"E6",X"01",X"20", + X"26",X"3A",X"06",X"88",X"A7",X"CA",X"3C",X"1D",X"3A",X"50",X"8F",X"A7",X"20",X"10",X"35",X"3E", + X"01",X"32",X"50",X"8F",X"32",X"01",X"89",X"3E",X"40",X"32",X"4A",X"8F",X"18",X"09",X"AF",X"21", + X"45",X"8F",X"06",X"10",X"D7",X"26",X"81",X"2E",X"04",X"36",X"00",X"11",X"40",X"89",X"21",X"00", + X"89",X"01",X"3F",X"00",X"3A",X"0D",X"88",X"A7",X"28",X"03",X"11",X"80",X"89",X"ED",X"B0",X"AF", + X"32",X"0A",X"88",X"C9",X"3A",X"50",X"8F",X"A7",X"20",X"97",X"CD",X"4E",X"0F",X"CD",X"27",X"25", + X"AF",X"32",X"E3",X"89",X"3A",X"06",X"88",X"A7",X"CA",X"3C",X"1D",X"21",X"08",X"89",X"7E",X"A7", + X"28",X"14",X"35",X"28",X"11",X"CD",X"C2",X"03",X"0E",X"0A",X"3A",X"0D",X"88",X"A7",X"28",X"01", + X"0C",X"79",X"32",X"0A",X"88",X"C9",X"CD",X"92",X"0F",X"21",X"0A",X"88",X"3A",X"0D",X"88",X"A7", + X"28",X"01",X"34",X"34",X"AF",X"32",X"FC",X"89",X"32",X"31",X"89",X"32",X"32",X"89",X"CD",X"B2", + X"1A",X"C9",X"01",X"1E",X"00",X"68",X"11",X"03",X"00",X"DD",X"21",X"A2",X"88",X"3A",X"0D",X"88", + X"0F",X"30",X"02",X"DD",X"19",X"FD",X"21",X"00",X"8A",X"DD",X"7E",X"02",X"FD",X"BE",X"02",X"20", + X"0E",X"DD",X"7E",X"01",X"FD",X"BE",X"01",X"20",X"06",X"DD",X"7E",X"00",X"FD",X"BE",X"00",X"30", + X"09",X"FD",X"19",X"2C",X"0D",X"0D",X"0D",X"C8",X"18",X"DF",X"7D",X"3C",X"32",X"FC",X"89",X"3D", + X"C5",X"21",X"1D",X"8A",X"11",X"20",X"8A",X"ED",X"B8",X"6F",X"DD",X"7E",X"00",X"FD",X"77",X"00", + X"DD",X"7E",X"01",X"FD",X"77",X"01",X"DD",X"7E",X"02",X"FD",X"77",X"02",X"C1",X"C5",X"DD",X"21", + X"30",X"8A",X"21",X"E1",X"89",X"3A",X"0D",X"88",X"A7",X"28",X"05",X"DD",X"21",X"33",X"8A",X"23", + X"36",X"01",X"2E",X"DD",X"11",X"E0",X"89",X"ED",X"B8",X"DD",X"7E",X"02",X"12",X"1B",X"DD",X"7E", + X"01",X"12",X"C1",X"21",X"1C",X"8E",X"11",X"1F",X"8E",X"ED",X"B8",X"EB",X"2B",X"3E",X"10",X"06", + X"03",X"D7",X"C9",X"CD",X"C9",X"02",X"C0",X"CD",X"E3",X"02",X"01",X"19",X"08",X"CD",X"5D",X"07", + X"11",X"00",X"06",X"FF",X"1E",X"02",X"FF",X"CD",X"60",X"79",X"3E",X"0C",X"32",X"0A",X"88",X"AF", + X"32",X"08",X"88",X"11",X"93",X"55",X"01",X"00",X"22",X"1A",X"E6",X"37",X"0F",X"89",X"4F",X"13", + X"10",X"F7",X"FE",X"7C",X"28",X"04",X"21",X"1E",X"88",X"34",X"11",X"F2",X"1F",X"21",X"F0",X"89", + X"1A",X"FE",X"A0",X"C8",X"C6",X"08",X"77",X"13",X"23",X"18",X"F5",X"C9",X"CD",X"C9",X"02",X"C0", + X"01",X"19",X"08",X"CD",X"5D",X"07",X"11",X"00",X"06",X"FF",X"1E",X"03",X"FF",X"CD",X"60",X"79", + X"3E",X"0C",X"32",X"0A",X"88",X"3E",X"60",X"32",X"08",X"88",X"C9",X"3A",X"0E",X"88",X"A7",X"28", + X"0B",X"3A",X"88",X"89",X"A7",X"28",X"05",X"3E",X"01",X"32",X"0D",X"88",X"11",X"40",X"89",X"21", + X"00",X"89",X"01",X"3F",X"00",X"ED",X"B0",X"AF",X"32",X"0A",X"88",X"C9",X"3A",X"48",X"89",X"A7", + X"28",X"04",X"AF",X"32",X"0D",X"88",X"11",X"80",X"89",X"21",X"00",X"89",X"01",X"3F",X"00",X"ED", + X"B0",X"AF",X"32",X"0A",X"88",X"21",X"28",X"53",X"06",X"0E",X"7E",X"E6",X"1F",X"83",X"5F",X"30", + X"01",X"14",X"23",X"10",X"F5",X"3E",X"60",X"BB",X"20",X"04",X"3E",X"8A",X"92",X"C8",X"21",X"38", + X"8A",X"34",X"C9",X"21",X"08",X"88",X"35",X"C0",X"3E",X"82",X"CD",X"B2",X"05",X"3E",X"80",X"CD", + X"B2",X"05",X"3E",X"89",X"CD",X"B2",X"05",X"01",X"D9",X"07",X"CD",X"5D",X"07",X"CD",X"E9",X"03", + X"11",X"11",X"06",X"FF",X"21",X"0A",X"88",X"36",X"0E",X"3A",X"FC",X"89",X"A7",X"C8",X"21",X"45", + X"80",X"47",X"2C",X"2C",X"10",X"FC",X"22",X"FD",X"89",X"CD",X"C1",X"0F",X"21",X"FF",X"89",X"36", + X"07",X"11",X"54",X"17",X"21",X"F0",X"89",X"1A",X"FE",X"5A",X"C8",X"CB",X"17",X"77",X"13",X"23", + X"18",X"F5",X"C9",X"3A",X"07",X"89",X"E6",X"01",X"20",X"05",X"CD",X"E2",X"64",X"18",X"03",X"CD", + X"F8",X"68",X"CD",X"EF",X"02",X"C9",X"21",X"08",X"88",X"35",X"3A",X"2A",X"8E",X"A7",X"28",X"04", + X"7E",X"A7",X"28",X"28",X"CD",X"94",X"7E",X"3A",X"FC",X"89",X"A7",X"C8",X"3A",X"08",X"88",X"E6", + X"07",X"C0",X"3A",X"FF",X"89",X"2A",X"FD",X"89",X"11",X"20",X"00",X"06",X"1C",X"77",X"19",X"10", + X"FC",X"3C",X"FE",X"10",X"38",X"02",X"3E",X"06",X"32",X"FF",X"89",X"C9",X"21",X"5F",X"85",X"11", + X"E0",X"FF",X"06",X"08",X"3E",X"10",X"77",X"19",X"10",X"FA",X"21",X"BC",X"82",X"11",X"E0",X"FF", + X"01",X"00",X"0A",X"7E",X"81",X"4F",X"19",X"10",X"FA",X"79",X"FE",X"AA",X"C0",X"AF",X"32",X"2A", + X"8E",X"3A",X"0E",X"88",X"A7",X"28",X"4E",X"3A",X"0D",X"88",X"A7",X"28",X"29",X"3A",X"48",X"89", + X"A7",X"28",X"42",X"AF",X"32",X"0D",X"88",X"32",X"0A",X"88",X"21",X"80",X"89",X"06",X"3F",X"D7", + X"3C",X"32",X"1F",X"88",X"CD",X"E3",X"02",X"21",X"E0",X"84",X"36",X"02",X"11",X"E0",X"FF",X"19", + X"36",X"25",X"19",X"36",X"20",X"C9",X"3A",X"88",X"89",X"A7",X"28",X"19",X"AF",X"32",X"0A",X"88", + X"21",X"40",X"89",X"06",X"3F",X"D7",X"3C",X"32",X"0D",X"88",X"CD",X"E3",X"02",X"21",X"40",X"87", + X"36",X"01",X"18",X"D8",X"C9",X"AF",X"21",X"00",X"89",X"06",X"BF",X"D7",X"3A",X"0E",X"88",X"A7", + X"CC",X"0D",X"1D",X"C4",X"E7",X"1C",X"3A",X"02",X"88",X"A7",X"28",X"10",X"AF",X"32",X"06",X"88", + X"32",X"0A",X"88",X"3C",X"32",X"1F",X"88",X"3C",X"32",X"05",X"88",X"C9",X"AF",X"32",X"06",X"88", + X"32",X"0A",X"88",X"32",X"0D",X"88",X"32",X"0E",X"88",X"32",X"51",X"8E",X"3C",X"32",X"05",X"88", + X"32",X"1F",X"88",X"32",X"3F",X"8F",X"CD",X"B9",X"02",X"CD",X"CF",X"0E",X"11",X"4C",X"1E",X"21", + X"F0",X"89",X"1A",X"FE",X"7F",X"C8",X"CB",X"3F",X"77",X"13",X"23",X"18",X"F5",X"C9",X"21",X"4A", + X"8F",X"7E",X"35",X"FE",X"40",X"20",X"0B",X"CD",X"E9",X"79",X"11",X"26",X"06",X"FF",X"CD",X"44", + X"0F",X"C9",X"A7",X"C0",X"32",X"0A",X"88",X"2E",X"50",X"36",X"02",X"21",X"07",X"8D",X"36",X"40", + X"3A",X"07",X"89",X"CB",X"4F",X"C0",X"3E",X"01",X"32",X"61",X"8F",X"C9",X"3A",X"07",X"89",X"CB", + X"4F",X"20",X"04",X"CD",X"D5",X"0F",X"C9",X"CD",X"A6",X"6D",X"21",X"4C",X"58",X"7D",X"D6",X"24", + X"6F",X"24",X"24",X"01",X"20",X"20",X"AF",X"CB",X"46",X"28",X"01",X"3C",X"CB",X"5E",X"20",X"01", + X"3C",X"10",X"F4",X"B9",X"C8",X"3E",X"01",X"32",X"E7",X"89",X"C9",X"10",X"12",X"14",X"18",X"1A", + X"1C",X"1E",X"20",X"3A",X"04",X"89",X"A7",X"21",X"07",X"89",X"20",X"0F",X"3A",X"06",X"88",X"A7", + X"28",X"09",X"7E",X"CB",X"47",X"20",X"2A",X"7E",X"A7",X"28",X"26",X"7E",X"E6",X"01",X"01",X"39", + X"08",X"20",X"03",X"01",X"79",X"08",X"CD",X"5D",X"07",X"3E",X"0F",X"21",X"45",X"80",X"11",X"20", + X"00",X"06",X"04",X"77",X"19",X"10",X"FC",X"21",X"46",X"80",X"06",X"04",X"77",X"19",X"10",X"FC", + X"C9",X"3A",X"50",X"8F",X"A7",X"20",X"D4",X"01",X"59",X"08",X"CD",X"5D",X"07",X"21",X"1C",X"81", + X"11",X"20",X"00",X"06",X"10",X"3E",X"09",X"77",X"19",X"10",X"FC",X"C9",X"C0",X"B0",X"BA",X"00", + X"B0",X"C0",X"C0",X"C0",X"58",X"B0",X"52",X"00",X"48",X"C0",X"58",X"C0",X"05",X"04",X"03",X"03", + X"02",X"01",X"01",X"00",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"14",X"30",X"36",X"3E", + X"3C",X"22",X"3A",X"32",X"7F",X"21",X"E5",X"89",X"46",X"7D",X"C6",X"16",X"6F",X"78",X"B6",X"A7", + X"DD",X"21",X"80",X"8A",X"20",X"3C",X"3A",X"06",X"88",X"A7",X"C8",X"FD",X"21",X"90",X"8C",X"DD", + X"7E",X"02",X"A7",X"20",X"2D",X"3A",X"24",X"8F",X"21",X"57",X"8F",X"B6",X"20",X"24",X"3A",X"1F", + X"88",X"A7",X"3A",X"A0",X"A0",X"20",X"03",X"3A",X"C0",X"A0",X"2F",X"DD",X"77",X"07",X"17",X"17", + X"17",X"21",X"03",X"8F",X"17",X"CB",X"16",X"7E",X"E6",X"07",X"FE",X"01",X"C8",X"DD",X"CB",X"07", + X"A6",X"C9",X"DD",X"36",X"07",X"00",X"C9",X"22",X"1F",X"25",X"1E",X"14",X"10",X"3A",X"1E",X"88", + X"A7",X"20",X"5E",X"21",X"5F",X"85",X"01",X"A7",X"1E",X"11",X"E0",X"FF",X"0A",X"77",X"03",X"19", + X"FE",X"10",X"20",X"F8",X"3A",X"07",X"89",X"3C",X"47",X"AF",X"C6",X"01",X"27",X"10",X"FB",X"F5", + X"F5",X"F5",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"21",X"9F",X"84",X"A7",X"20",X"02", + X"3E",X"10",X"77",X"F1",X"E6",X"0F",X"21",X"7F",X"84",X"77",X"F1",X"CB",X"3F",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"E6",X"01",X"21",X"0D",X"20",X"CD",X"45",X"0C",X"21",X"62",X"84",X"CD",X"07", + X"33",X"21",X"22",X"87",X"CD",X"8C",X"1F",X"F1",X"47",X"E6",X"0F",X"32",X"83",X"84",X"CD",X"FB", + X"1F",X"CD",X"18",X"1F",X"CD",X"C9",X"34",X"C9",X"21",X"E7",X"89",X"06",X"07",X"7E",X"23",X"B6", + X"C0",X"10",X"FA",X"0E",X"00",X"2E",X"01",X"7E",X"D6",X"0A",X"38",X"22",X"0C",X"18",X"F9",X"3A", + X"56",X"8D",X"A7",X"C0",X"4F",X"3A",X"01",X"89",X"FE",X"0A",X"38",X"0D",X"21",X"87",X"1F",X"06", + X"05",X"BE",X"28",X"0A",X"0C",X"23",X"10",X"F9",X"C9",X"3E",X"01",X"32",X"56",X"8D",X"79",X"A7", + X"20",X"28",X"3A",X"07",X"89",X"C6",X"01",X"47",X"AF",X"C6",X"01",X"27",X"10",X"FB",X"11",X"E6", + X"1F",X"CB",X"67",X"20",X"03",X"11",X"DA",X"1F",X"21",X"22",X"87",X"CD",X"8C",X"1F",X"3E",X"10", + X"06",X"03",X"D7",X"3A",X"01",X"89",X"32",X"43",X"87",X"AF",X"21",X"A3",X"1F",X"CD",X"45",X"0C", + X"21",X"22",X"83",X"CD",X"8C",X"1F",X"C9",X"09",X"14",X"1E",X"28",X"30",X"3E",X"04",X"ED",X"47", + X"06",X"03",X"1A",X"77",X"2C",X"13",X"10",X"FA",X"0E",X"1D",X"09",X"ED",X"57",X"3D",X"C8",X"ED", + X"47",X"18",X"ED",X"AD",X"1F",X"B6",X"1F",X"C2",X"1F",X"CE",X"1F",X"44",X"20",X"8E",X"8E",X"8E", + X"8E",X"00",X"CE",X"8E",X"8E",X"CE",X"8F",X"8F",X"8F",X"8F",X"00",X"CF",X"8F",X"00",X"CF",X"0F", + X"0F",X"0F",X"85",X"85",X"85",X"85",X"00",X"C5",X"85",X"00",X"C5",X"05",X"05",X"05",X"8B",X"8B", + X"8B",X"8B",X"00",X"CB",X"8B",X"00",X"CB",X"0B",X"0B",X"0B",X"B7",X"B8",X"B9",X"B6",X"09",X"B6", + X"B2",X"B3",X"B2",X"10",X"10",X"10",X"B7",X"B8",X"B9",X"B6",X"09",X"B6",X"B4",X"B5",X"B4",X"10", + X"10",X"10",X"02",X"08",X"13",X"17",X"16",X"09",X"15",X"11",X"A0",X"78",X"CB",X"6F",X"11",X"3B", + X"20",X"28",X"03",X"11",X"50",X"20",X"21",X"62",X"80",X"CD",X"07",X"33",X"C9",X"11",X"20",X"26", + X"20",X"B2",X"B3",X"B2",X"B6",X"10",X"B6",X"B7",X"B8",X"B9",X"B7",X"B8",X"B9",X"B6",X"B1",X"B6", + X"B6",X"10",X"B6",X"B7",X"B8",X"B9",X"B4",X"B5",X"B4",X"B6",X"10",X"B6",X"B7",X"B8",X"B9",X"B7", + X"B8",X"B9",X"B6",X"B1",X"B6",X"B6",X"10",X"B6",X"B7",X"B8",X"B9",X"00",X"00",X"40",X"00",X"00", + X"40",X"00",X"00",X"00",X"83",X"83",X"83",X"83",X"00",X"C3",X"83",X"00",X"C3",X"03",X"03",X"03", + X"0B",X"0B",X"4B",X"0B",X"00",X"4B",X"0B",X"0B",X"0B",X"83",X"83",X"83",X"83",X"00",X"C3",X"83", + X"00",X"C3",X"03",X"03",X"03",X"21",X"3F",X"86",X"11",X"E0",X"FF",X"3A",X"08",X"89",X"A7",X"C8", + X"3D",X"4F",X"28",X"0D",X"FE",X"05",X"38",X"02",X"3E",X"05",X"4F",X"47",X"36",X"B0",X"19",X"10", + X"FB",X"3E",X"05",X"91",X"C8",X"47",X"36",X"10",X"19",X"10",X"FB",X"C9",X"21",X"6D",X"06",X"06", + X"10",X"11",X"AA",X"20",X"1A",X"BE",X"20",X"0C",X"13",X"00",X"3E",X"08",X"85",X"30",X"01",X"24", + X"6F",X"10",X"F1",X"C9",X"3E",X"01",X"32",X"F0",X"8E",X"C9",X"F5",X"D5",X"80",X"94",X"88",X"18", + X"03",X"0B",X"06",X"15",X"32",X"88",X"77",X"3A",X"35",X"CD",X"05",X"0C",X"32",X"D1",X"3E",X"DD", + X"2C",X"2C",X"0A",X"10",X"1B",X"1F",X"1E",X"11",X"1D",X"19",X"FF",X"00",X"00",X"00",X"11",X"00", + X"0E",X"00",X"00",X"07",X"21",X"32",X"8D",X"3A",X"50",X"8F",X"A7",X"28",X"0B",X"36",X"00",X"45", + X"2E",X"F8",X"7E",X"23",X"A6",X"20",X"03",X"68",X"7E",X"A7",X"C2",X"1E",X"24",X"DD",X"21",X"80", + X"8A",X"CD",X"29",X"23",X"CD",X"01",X"21",X"CD",X"63",X"25",X"CD",X"A6",X"25",X"CD",X"8B",X"30", + X"C9",X"CD",X"78",X"27",X"CD",X"0B",X"21",X"CD",X"57",X"21",X"C9",X"DD",X"21",X"80",X"8A",X"DD", + X"CB",X"07",X"66",X"DD",X"36",X"07",X"00",X"C8",X"21",X"02",X"8F",X"7E",X"A7",X"C0",X"34",X"FD", + X"21",X"90",X"8C",X"3A",X"30",X"8F",X"FE",X"02",X"38",X"15",X"FD",X"7E",X"18",X"FE",X"02",X"20", + X"0E",X"FD",X"7E",X"00",X"A7",X"20",X"08",X"FD",X"36",X"18",X"00",X"FD",X"CB",X"00",X"CE",X"11", + X"18",X"00",X"06",X"02",X"FD",X"CB",X"00",X"46",X"28",X"3A",X"FD",X"19",X"10",X"F6",X"DD",X"54", + X"1E",X"3C",X"1A",X"A7",X"20",X"01",X"C9",X"FD",X"21",X"90",X"8C",X"3E",X"02",X"32",X"15",X"8F", + X"FD",X"CB",X"00",X"46",X"C4",X"CF",X"21",X"11",X"18",X"00",X"FD",X"19",X"3A",X"15",X"8F",X"D6", + X"01",X"20",X"EA",X"3A",X"00",X"8F",X"11",X"C9",X"26",X"D6",X"0C",X"93",X"C2",X"B1",X"22",X"AF", + X"32",X"02",X"8F",X"C9",X"FD",X"CB",X"00",X"C6",X"DD",X"7E",X"04",X"D6",X"03",X"FD",X"77",X"04", + X"DD",X"7E",X"06",X"C6",X"04",X"FD",X"77",X"06",X"FD",X"CB",X"00",X"4E",X"20",X"0A",X"FD",X"36", + X"0F",X"14",X"FD",X"36",X"10",X"40",X"18",X"14",X"FD",X"36",X"0F",X"10",X"FD",X"36",X"10",X"40", + X"3E",X"01",X"32",X"77",X"8D",X"AF",X"21",X"98",X"8A",X"06",X"18",X"D7",X"21",X"19",X"8D",X"FD", + X"E5",X"D1",X"AF",X"CB",X"5B",X"28",X"01",X"23",X"77",X"23",X"23",X"77",X"C3",X"B1",X"22",X"FD", + X"CB",X"07",X"46",X"20",X"2F",X"FD",X"7E",X"12",X"A7",X"20",X"06",X"FD",X"34",X"12",X"CD",X"D2", + X"0E",X"FD",X"CB",X"00",X"4E",X"20",X"3F",X"FD",X"7D",X"CB",X"5F",X"21",X"1B",X"8D",X"28",X"01", + X"23",X"7E",X"A7",X"28",X"04",X"36",X"00",X"18",X"25",X"FD",X"7E",X"06",X"D6",X"04",X"38",X"1E", + X"FD",X"77",X"06",X"C9",X"FD",X"7E",X"01",X"FE",X"01",X"D8",X"20",X"07",X"FD",X"36",X"0F",X"1B", + X"FD",X"34",X"01",X"FD",X"7E",X"04",X"C6",X"04",X"FD",X"77",X"04",X"FE",X"E8",X"D8",X"FD",X"E5", + X"E1",X"06",X"18",X"AF",X"D7",X"C9",X"3A",X"0E",X"8F",X"A7",X"CC",X"82",X"22",X"ED",X"5B",X"10", + X"8F",X"FD",X"7D",X"CB",X"5F",X"FD",X"6E",X"05",X"FD",X"66",X"06",X"01",X"19",X"8D",X"28",X"01", + X"03",X"0A",X"CB",X"47",X"28",X"03",X"19",X"18",X"02",X"ED",X"52",X"FD",X"75",X"05",X"FD",X"74", + X"06",X"ED",X"5B",X"12",X"8F",X"FD",X"6E",X"03",X"FD",X"66",X"04",X"19",X"7C",X"FE",X"E8",X"30", + X"0B",X"FD",X"75",X"03",X"FD",X"74",X"04",X"21",X"0E",X"8F",X"35",X"C9",X"AF",X"32",X"0E",X"8F", + X"32",X"0F",X"8F",X"32",X"30",X"8F",X"32",X"45",X"8D",X"32",X"77",X"8D",X"32",X"3F",X"8F",X"18", + X"9D",X"C9",X"3A",X"0F",X"8F",X"21",X"12",X"27",X"E7",X"32",X"0E",X"8F",X"3A",X"0F",X"8F",X"21", + X"1C",X"27",X"CD",X"45",X"0C",X"ED",X"53",X"10",X"8F",X"3A",X"0F",X"8F",X"21",X"30",X"27",X"CD", + X"45",X"0C",X"ED",X"53",X"12",X"8F",X"21",X"0F",X"8F",X"34",X"7E",X"FE",X"09",X"C0",X"36",X"08", + X"C9",X"3A",X"32",X"8D",X"A7",X"C0",X"DD",X"21",X"80",X"8A",X"CD",X"E6",X"22",X"11",X"18",X"00", + X"DD",X"19",X"CD",X"E6",X"22",X"DD",X"19",X"CD",X"E6",X"22",X"DD",X"19",X"CD",X"E6",X"22",X"C9", + X"FD",X"21",X"90",X"8C",X"11",X"18",X"00",X"06",X"02",X"AF",X"FD",X"CB",X"00",X"46",X"28",X"01", + X"07",X"FD",X"19",X"10",X"F5",X"C9",X"DD",X"7E",X"0E",X"A7",X"28",X"04",X"DD",X"35",X"0E",X"C9", + X"2A",X"00",X"8F",X"7E",X"FE",X"FF",X"28",X"12",X"DD",X"77",X"10",X"23",X"7E",X"DD",X"77",X"0F", + X"23",X"7E",X"DD",X"77",X"0E",X"23",X"22",X"00",X"8F",X"C9",X"CD",X"D0",X"22",X"FE",X"03",X"20", + X"08",X"21",X"E7",X"26",X"22",X"00",X"8F",X"18",X"D7",X"23",X"7E",X"32",X"00",X"8F",X"23",X"7E", + X"32",X"01",X"8F",X"18",X"CB",X"10",X"10",X"37",X"37",X"DD",X"CB",X"07",X"56",X"28",X"3B",X"DD", + X"35",X"04",X"DD",X"7E",X"04",X"FE",X"41",X"30",X"04",X"DD",X"36",X"04",X"41",X"CD",X"D7",X"23", + X"2A",X"BE",X"88",X"7D",X"FE",X"E6",X"20",X"11",X"7E",X"FE",X"35",X"30",X"0C",X"26",X"89",X"06", + X"07",X"23",X"7E",X"B7",X"20",X"03",X"10",X"F9",X"C9",X"CD",X"EC",X"23",X"21",X"BD",X"88",X"34", + X"7E",X"E6",X"07",X"77",X"A7",X"C0",X"2B",X"34",X"18",X"43",X"DD",X"CB",X"07",X"5E",X"C8",X"DD", + X"34",X"04",X"DD",X"7E",X"04",X"FE",X"C0",X"38",X"04",X"DD",X"36",X"04",X"C0",X"CD",X"D7",X"23", + X"3A",X"BE",X"88",X"FE",X"F6",X"20",X"17",X"21",X"38",X"8A",X"06",X"03",X"7E",X"A7",X"20",X"0E", + X"23",X"10",X"F9",X"21",X"83",X"80",X"3A",X"43",X"83",X"86",X"E6",X"0F",X"A7",X"C8",X"CD",X"05", + X"24",X"21",X"BD",X"88",X"35",X"7E",X"E6",X"07",X"77",X"A7",X"C0",X"2B",X"35",X"7E",X"E6",X"03", + X"77",X"21",X"F6",X"26",X"CD",X"45",X"0C",X"D5",X"21",X"25",X"84",X"CD",X"25",X"33",X"D1",X"2E", + X"65",X"CD",X"25",X"33",X"2E",X"A5",X"11",X"0A",X"27",X"3A",X"BC",X"88",X"E6",X"01",X"20",X"03", + X"11",X"0E",X"27",X"CD",X"25",X"33",X"C9",X"DD",X"21",X"80",X"8A",X"DD",X"7E",X"04",X"DD",X"77", + X"4C",X"D6",X"10",X"DD",X"77",X"34",X"C6",X"0A",X"DD",X"77",X"1C",X"C9",X"21",X"37",X"8F",X"34", + X"CB",X"46",X"C0",X"2A",X"BE",X"88",X"7E",X"FE",X"34",X"28",X"03",X"35",X"18",X"03",X"36",X"10", + X"2B",X"22",X"BE",X"88",X"C9",X"21",X"37",X"8F",X"34",X"CB",X"46",X"C8",X"2A",X"BE",X"88",X"7E", + X"FE",X"37",X"30",X"03",X"34",X"18",X"03",X"23",X"36",X"34",X"22",X"BE",X"88",X"C9",X"CD",X"01", + X"21",X"CD",X"A6",X"25",X"CD",X"8B",X"30",X"3A",X"1E",X"88",X"A7",X"C0",X"DD",X"21",X"80",X"8A", + X"DD",X"7E",X"02",X"E6",X"07",X"EF",X"42",X"24",X"73",X"24",X"97",X"24",X"B9",X"24",X"DB",X"24", + X"FB",X"24",X"21",X"E8",X"89",X"7E",X"2E",X"EF",X"B6",X"C0",X"DD",X"36",X"11",X"10",X"DD",X"34", + X"02",X"21",X"80",X"8A",X"11",X"98",X"8A",X"01",X"18",X"00",X"ED",X"B0",X"DD",X"7E",X"04",X"D6", + X"10",X"DD",X"77",X"04",X"21",X"BD",X"26",X"CD",X"0F",X"25",X"3A",X"24",X"8F",X"A7",X"C0",X"CD", + X"AD",X"0F",X"C9",X"DD",X"35",X"11",X"C0",X"3A",X"39",X"8A",X"A7",X"20",X"06",X"DD",X"36",X"11", + X"10",X"DD",X"34",X"02",X"DD",X"7E",X"04",X"C6",X"10",X"DD",X"77",X"04",X"AF",X"DD",X"77",X"1E", + X"21",X"C1",X"26",X"CD",X"0F",X"25",X"C9",X"DD",X"35",X"11",X"C0",X"DD",X"34",X"02",X"21",X"C5", + X"26",X"CD",X"0F",X"25",X"DD",X"21",X"80",X"8A",X"DD",X"7E",X"04",X"C6",X"04",X"DD",X"77",X"04", + X"DD",X"7E",X"06",X"D6",X"06",X"DD",X"77",X"06",X"C9",X"DD",X"34",X"05",X"DD",X"CB",X"05",X"46", + X"20",X"03",X"DD",X"35",X"06",X"DD",X"7E",X"04",X"C6",X"02",X"DD",X"77",X"04",X"FE",X"DC",X"D8", + X"CD",X"21",X"0F",X"DD",X"36",X"11",X"02",X"DD",X"34",X"02",X"C9",X"DD",X"35",X"11",X"C0",X"DD", + X"7E",X"04",X"C6",X"04",X"DD",X"77",X"04",X"DD",X"7E",X"06",X"D6",X"08",X"DD",X"77",X"06",X"DD", + X"36",X"0F",X"1A",X"DD",X"36",X"11",X"30",X"DD",X"34",X"02",X"C9",X"DD",X"35",X"11",X"C0",X"21", + X"2B",X"88",X"7E",X"A7",X"20",X"02",X"2E",X"0A",X"36",X"07",X"3A",X"3C",X"8A",X"A7",X"C8",X"11", + X"18",X"00",X"06",X"04",X"7E",X"DD",X"77",X"0F",X"23",X"DD",X"19",X"10",X"F7",X"21",X"E5",X"89", + X"3A",X"F9",X"8D",X"B6",X"20",X"01",X"C9",X"16",X"08",X"FF",X"21",X"02",X"89",X"7E",X"FE",X"07", + X"3E",X"00",X"38",X"0D",X"3A",X"FB",X"89",X"36",X"04",X"2E",X"34",X"36",X"04",X"06",X"20",X"68", + X"D7",X"21",X"00",X"8F",X"06",X"4F",X"D7",X"2E",X"57",X"06",X"04",X"D7",X"21",X"30",X"8D",X"06", + X"03",X"D7",X"32",X"82",X"8A",X"32",X"90",X"8C",X"32",X"A8",X"8C",X"32",X"52",X"8F",X"32",X"63", + X"8F",X"C9",X"76",X"3A",X"50",X"8F",X"A7",X"C0",X"21",X"06",X"8F",X"7E",X"A7",X"28",X"02",X"35", + X"C9",X"36",X"0C",X"23",X"34",X"EB",X"3A",X"07",X"89",X"CB",X"47",X"21",X"BB",X"87",X"1A",X"20", + X"0E",X"26",X"84",X"11",X"44",X"27",X"E6",X"01",X"28",X"0F",X"11",X"48",X"27",X"18",X"0A",X"11", + X"4C",X"27",X"E6",X"01",X"28",X"03",X"11",X"50",X"27",X"D5",X"CD",X"25",X"33",X"11",X"A0",X"FF", + X"19",X"D1",X"CD",X"25",X"33",X"C9",X"3A",X"07",X"89",X"CB",X"47",X"CA",X"66",X"2D",X"21",X"09", + X"8F",X"35",X"C0",X"36",X"10",X"3A",X"02",X"89",X"A7",X"C8",X"4F",X"3A",X"20",X"89",X"A7",X"20", + X"74",X"79",X"11",X"05",X"8F",X"21",X"34",X"89",X"BE",X"28",X"10",X"1A",X"A7",X"20",X"0C",X"34", + X"3C",X"12",X"11",X"E3",X"86",X"ED",X"53",X"32",X"89",X"18",X"10",X"1A",X"A7",X"28",X"0C",X"3A", + X"32",X"89",X"FE",X"A3",X"20",X"05",X"AF",X"12",X"32",X"63",X"8F",X"7E",X"FE",X"07",X"38",X"0E", + X"3A",X"32",X"89",X"FE",X"C3",X"20",X"05",X"3E",X"01",X"32",X"04",X"8F",X"3E",X"07",X"47",X"11", + X"C0",X"FF",X"3A",X"05",X"8F",X"A7",X"28",X"63",X"21",X"09",X"8F",X"36",X"1C",X"11",X"E0",X"FF", + X"DD",X"2A",X"32",X"89",X"DD",X"19",X"DD",X"22",X"32",X"89",X"23",X"CB",X"46",X"21",X"6C",X"27", + X"20",X"03",X"21",X"68",X"27",X"DD",X"36",X"40",X"10",X"DD",X"36",X"41",X"10",X"CD",X"19",X"0F", + X"CD",X"11",X"0F",X"18",X"43",X"3A",X"0A",X"8F",X"CB",X"47",X"21",X"70",X"27",X"28",X"03",X"21", + X"74",X"27",X"FD",X"2A",X"32",X"89",X"FD",X"7C",X"D6",X"04",X"FD",X"67",X"FD",X"7E",X"00",X"FE", + X"80",X"06",X"07",X"28",X"23",X"3E",X"80",X"11",X"C0",X"FF",X"FD",X"77",X"00",X"FD",X"77",X"01", + X"FD",X"19",X"10",X"F6",X"CD",X"49",X"0F",X"06",X"07",X"18",X"0D",X"3A",X"0A",X"8F",X"CB",X"47", + X"21",X"68",X"27",X"28",X"03",X"21",X"6C",X"27",X"DD",X"2A",X"32",X"89",X"11",X"C0",X"FF",X"E5", + X"7E",X"DD",X"77",X"00",X"23",X"7E",X"DD",X"77",X"01",X"23",X"7E",X"DD",X"77",X"20",X"23",X"7E", + X"DD",X"77",X"21",X"DD",X"19",X"E1",X"10",X"E7",X"3A",X"20",X"89",X"A7",X"20",X"1A",X"11",X"DF", + X"FF",X"DD",X"19",X"DD",X"E5",X"E1",X"3A",X"0A",X"8F",X"CB",X"47",X"11",X"54",X"27",X"28",X"03", + X"11",X"5E",X"27",X"CD",X"07",X"33",X"36",X"10",X"21",X"0A",X"8F",X"34",X"C9",X"05",X"08",X"0A", + X"07",X"0C",X"10",X"0A",X"0F",X"0E",X"10",X"0A",X"0F",X"40",X"13",X"00",X"40",X"10",X"00",X"40", + X"11",X"00",X"40",X"12",X"00",X"FF",X"D8",X"26",X"40",X"17",X"08",X"40",X"10",X"08",X"40",X"25", + X"08",X"40",X"16",X"08",X"FF",X"E7",X"26",X"40",X"18",X"08",X"40",X"10",X"08",X"40",X"25",X"08", + X"40",X"16",X"08",X"FF",X"C9",X"26",X"FE",X"26",X"02",X"27",X"FE",X"26",X"06",X"27",X"E8",X"E9", + X"EB",X"EA",X"E4",X"E5",X"E7",X"E6",X"EC",X"ED",X"EF",X"EE",X"A8",X"A9",X"AB",X"AA",X"AC",X"AD", + X"AB",X"AE",X"0B",X"04",X"08",X"08",X"0A",X"0A",X"08",X"08",X"08",X"18",X"00",X"03",X"C0",X"02", + X"80",X"02",X"00",X"02",X"80",X"01",X"00",X"01",X"C0",X"00",X"80",X"00",X"40",X"00",X"00",X"00", + X"00",X"00",X"40",X"00",X"80",X"00",X"C0",X"00",X"00",X"01",X"80",X"01",X"00",X"02",X"80",X"02", + X"C0",X"02",X"00",X"03",X"3D",X"81",X"BD",X"42",X"5C",X"BF",X"BE",X"BB",X"D0",X"D1",X"D3",X"D2", + X"D4",X"D5",X"D7",X"D6",X"10",X"C1",X"CE",X"C2",X"C3",X"C7",X"C4",X"C5",X"C0",X"FF",X"10",X"C9", + X"CE",X"CA",X"CB",X"CF",X"CC",X"CD",X"A0",X"FF",X"D8",X"D9",X"DA",X"DB",X"DC",X"DD",X"DE",X"DF", + X"3E",X"C8",X"3E",X"C8",X"74",X"54",X"74",X"54",X"3A",X"30",X"8F",X"E6",X"07",X"EF",X"8F",X"27", + X"F3",X"27",X"56",X"28",X"AD",X"28",X"C5",X"28",X"26",X"80",X"77",X"D7",X"0D",X"20",X"FA",X"3A", + X"3F",X"8F",X"A7",X"20",X"1D",X"3A",X"75",X"8D",X"A7",X"28",X"0A",X"21",X"20",X"8F",X"7E",X"A7", + X"20",X"03",X"34",X"18",X"08",X"3A",X"01",X"89",X"A7",X"C8",X"E6",X"07",X"C0",X"3E",X"01",X"32", + X"3F",X"8F",X"3A",X"B4",X"8A",X"FE",X"3C",X"D8",X"3A",X"90",X"8C",X"CB",X"4F",X"C0",X"3A",X"A8", + X"8C",X"CB",X"4F",X"C0",X"21",X"30",X"8F",X"34",X"3E",X"08",X"32",X"2F",X"89",X"3A",X"06",X"88", + X"A7",X"20",X"0E",X"3A",X"50",X"8F",X"21",X"3F",X"8F",X"B6",X"28",X"05",X"3E",X"6F",X"32",X"08", + X"85",X"3A",X"7A",X"8D",X"A7",X"28",X"03",X"32",X"20",X"8F",X"21",X"A7",X"84",X"11",X"51",X"2D", + X"C3",X"25",X"33",X"3A",X"B4",X"8A",X"FE",X"34",X"38",X"19",X"21",X"2F",X"89",X"35",X"C0",X"36", + X"10",X"2B",X"34",X"CB",X"46",X"21",X"A7",X"84",X"11",X"51",X"2D",X"20",X"03",X"11",X"55",X"2D", + X"C3",X"25",X"33",X"21",X"90",X"8C",X"11",X"18",X"00",X"06",X"02",X"7E",X"A7",X"28",X"04",X"19", + X"10",X"F9",X"C9",X"3E",X"02",X"32",X"30",X"8F",X"77",X"CD",X"05",X"0F",X"21",X"A7",X"84",X"11", + X"55",X"2D",X"CD",X"25",X"33",X"3A",X"50",X"8F",X"21",X"3F",X"8F",X"B6",X"28",X"03",X"3E",X"10", + X"32",X"08",X"85",X"3E",X"01",X"32",X"99",X"8A",X"3A",X"86",X"8A",X"C6",X"0C",X"32",X"9E",X"8A", + X"3E",X"10",X"32",X"A7",X"8A",X"C9",X"3A",X"50",X"8F",X"A7",X"20",X"3A",X"DD",X"21",X"78",X"8C", + X"11",X"E8",X"FF",X"06",X"06",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"28",X"05",X"DD",X"19",X"10", + X"F4",X"C9",X"DD",X"36",X"01",X"05",X"DD",X"36",X"02",X"10",X"DD",X"36",X"03",X"00",X"DD",X"36", + X"04",X"08",X"DD",X"36",X"05",X"00",X"DD",X"36",X"06",X"1A",X"DD",X"36",X"0F",X"37",X"DD",X"36", + X"10",X"42",X"DD",X"22",X"32",X"8F",X"21",X"30",X"8F",X"34",X"3A",X"61",X"8F",X"A7",X"28",X"04", + X"2E",X"5D",X"34",X"C9",X"2E",X"34",X"36",X"20",X"11",X"15",X"03",X"FF",X"C9",X"21",X"34",X"8F", + X"7E",X"A7",X"28",X"02",X"35",X"C9",X"2E",X"30",X"34",X"3A",X"50",X"8F",X"A7",X"C0",X"AF",X"2A", + X"32",X"8F",X"06",X"18",X"D7",X"C9",X"CD",X"01",X"21",X"3A",X"07",X"89",X"CB",X"47",X"21",X"0A", + X"88",X"20",X"03",X"36",X"06",X"C9",X"3A",X"08",X"8F",X"A7",X"28",X"03",X"36",X"04",X"C9",X"DD", + X"21",X"80",X"8A",X"21",X"8D",X"2B",X"E5",X"DD",X"35",X"11",X"C0",X"DD",X"7E",X"02",X"E6",X"07", + X"EF",X"01",X"29",X"A0",X"29",X"01",X"2A",X"32",X"2A",X"79",X"2A",X"96",X"2A",X"B3",X"2A",X"E8", + X"2A",X"DD",X"36",X"11",X"01",X"DD",X"34",X"04",X"DD",X"7E",X"04",X"FE",X"DC",X"30",X"0F",X"CD", + X"D7",X"23",X"3A",X"BE",X"88",X"FE",X"F9",X"C8",X"CD",X"05",X"24",X"C3",X"A1",X"23",X"21",X"59", + X"2D",X"CD",X"0F",X"25",X"21",X"91",X"8A",X"36",X"0C",X"2E",X"82",X"34",X"23",X"23",X"7E",X"D6", + X"03",X"77",X"AF",X"32",X"9C",X"8A",X"32",X"9E",X"8A",X"21",X"59",X"08",X"01",X"00",X"20",X"7E", + X"81",X"4F",X"23",X"10",X"FA",X"FE",X"63",X"C2",X"E8",X"2A",X"06",X"20",X"11",X"80",X"29",X"1B", + X"1A",X"BE",X"C2",X"9A",X"2B",X"23",X"10",X"F7",X"CD",X"A2",X"0F",X"C9",X"D2",X"24",X"30",X"14", + X"11",X"10",X"10",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12", + X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"03",X"1D", + X"0D",X"03",X"00",X"00",X"07",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0B",X"0B",X"0B",X"0B",X"07",X"00",X"04",X"00", + X"DD",X"36",X"11",X"03",X"DD",X"34",X"0B",X"DD",X"7E",X"0B",X"E6",X"03",X"20",X"0E",X"DD",X"7E", + X"0F",X"FE",X"15",X"3E",X"15",X"20",X"02",X"3E",X"1E",X"DD",X"77",X"0F",X"DD",X"7E",X"06",X"D6", + X"02",X"DD",X"77",X"06",X"FE",X"2C",X"D0",X"3A",X"43",X"83",X"A7",X"C2",X"23",X"2B",X"C6",X"30", + X"32",X"30",X"8D",X"DD",X"36",X"11",X"18",X"DD",X"34",X"02",X"21",X"79",X"08",X"01",X"00",X"20", + X"7E",X"81",X"4F",X"23",X"10",X"FA",X"FE",X"37",X"C2",X"B3",X"2A",X"21",X"59",X"08",X"06",X"20", + X"11",X"80",X"29",X"1A",X"BE",X"C2",X"01",X"29",X"23",X"13",X"10",X"F7",X"11",X"14",X"06",X"FF", + X"C9",X"DD",X"36",X"11",X"08",X"DD",X"CB",X"10",X"FE",X"21",X"5A",X"87",X"3E",X"BC",X"77",X"23", + X"77",X"23",X"77",X"DD",X"34",X"02",X"AF",X"21",X"39",X"08",X"06",X"20",X"86",X"23",X"10",X"FC", + X"3D",X"C2",X"58",X"2C",X"11",X"15",X"06",X"FF",X"21",X"03",X"89",X"7E",X"FE",X"09",X"D8",X"36", + X"08",X"C9",X"DD",X"36",X"11",X"03",X"DD",X"34",X"0B",X"DD",X"7E",X"0B",X"E6",X"03",X"20",X"0E", + X"DD",X"7E",X"0F",X"FE",X"15",X"3E",X"15",X"20",X"02",X"3E",X"1E",X"DD",X"77",X"0F",X"3E",X"80", + X"DD",X"86",X"05",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"30",X"01",X"3C",X"3C",X"DD",X"77",X"06", + X"FE",X"52",X"20",X"05",X"11",X"94",X"06",X"FF",X"C9",X"FE",X"64",X"20",X"05",X"11",X"95",X"06", + X"FF",X"C9",X"FE",X"AC",X"D8",X"DD",X"34",X"02",X"C9",X"21",X"66",X"1C",X"11",X"23",X"2B",X"06", + X"68",X"1A",X"96",X"C2",X"A0",X"29",X"23",X"13",X"10",X"F7",X"DD",X"36",X"11",X"30",X"DD",X"CB", + X"10",X"BE",X"DD",X"34",X"02",X"C9",X"21",X"DF",X"67",X"11",X"23",X"2B",X"06",X"20",X"1A",X"96", + X"C2",X"01",X"2A",X"23",X"1B",X"10",X"F7",X"DD",X"36",X"11",X"18",X"DD",X"CB",X"10",X"FE",X"DD", + X"34",X"02",X"C9",X"DD",X"36",X"11",X"02",X"DD",X"34",X"0B",X"DD",X"7E",X"0B",X"E6",X"03",X"20", + X"0E",X"DD",X"7E",X"0F",X"FE",X"15",X"3E",X"15",X"20",X"02",X"3E",X"1E",X"DD",X"77",X"0F",X"DD", + X"34",X"06",X"DD",X"7E",X"06",X"FE",X"C0",X"D8",X"DD",X"7E",X"04",X"D6",X"03",X"DD",X"77",X"04", + X"DD",X"34",X"02",X"DD",X"36",X"11",X"40",X"C9",X"AF",X"21",X"80",X"8A",X"77",X"11",X"81",X"8A", + X"01",X"40",X"02",X"ED",X"B0",X"32",X"02",X"89",X"32",X"03",X"89",X"32",X"31",X"89",X"3E",X"06", + X"32",X"0A",X"88",X"C9",X"AF",X"88",X"0A",X"32",X"88",X"08",X"32",X"89",X"04",X"32",X"01",X"3E", + X"AD",X"20",X"B9",X"5A",X"3E",X"FA",X"10",X"19",X"4F",X"81",X"7E",X"0A",X"00",X"01",X"FF",X"E0", + X"11",X"82",X"BC",X"21",X"08",X"88",X"35",X"3A",X"2A",X"8E",X"A7",X"28",X"04",X"7E",X"A7",X"28", + X"28",X"CD",X"94",X"7E",X"3A",X"FC",X"89",X"A7",X"C8",X"3A",X"08",X"88",X"E6",X"07",X"C0",X"3A", + X"FF",X"89",X"2A",X"FD",X"89",X"11",X"20",X"00",X"06",X"1C",X"77",X"19",X"10",X"FC",X"3C",X"FE", + X"10",X"38",X"02",X"3E",X"06",X"32",X"FF",X"89",X"C9",X"21",X"5F",X"85",X"11",X"E0",X"FF",X"06", + X"08",X"3E",X"10",X"77",X"19",X"10",X"FA",X"21",X"BC",X"82",X"11",X"E0",X"FF",X"01",X"00",X"0A", + X"7E",X"81",X"4F",X"19",X"10",X"FA",X"79",X"FE",X"AA",X"C0",X"AF",X"32",X"2A",X"8E",X"3A",X"0E", + X"88",X"A7",X"28",X"4E",X"3A",X"0D",X"88",X"A7",X"28",X"29",X"3A",X"48",X"89",X"3A",X"82",X"8A", + X"FE",X"03",X"D8",X"CD",X"9A",X"2B",X"CD",X"2C",X"2C",X"C9",X"21",X"03",X"89",X"7E",X"FE",X"02", + X"DC",X"BF",X"2B",X"21",X"30",X"8D",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"DD",X"21",X"60",X"8C", + X"11",X"E8",X"FF",X"06",X"11",X"D9",X"CD",X"E5",X"2B",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"FE", + X"01",X"21",X"7B",X"87",X"28",X"0D",X"7E",X"FE",X"BA",X"20",X"02",X"F1",X"C9",X"11",X"E1",X"2B", + X"CD",X"25",X"33",X"21",X"BB",X"87",X"7E",X"FE",X"BA",X"C8",X"11",X"E1",X"2B",X"CD",X"25",X"33", + X"C9",X"BA",X"BA",X"BA",X"BA",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D8",X"DD",X"36",X"00", + X"01",X"AF",X"DD",X"36",X"02",X"11",X"DD",X"77",X"03",X"DD",X"77",X"05",X"DD",X"36",X"04",X"1C", + X"DD",X"36",X"06",X"03",X"21",X"03",X"89",X"35",X"CB",X"46",X"28",X"01",X"3C",X"DD",X"77",X"07", + X"11",X"5D",X"2D",X"CD",X"1E",X"38",X"3A",X"03",X"89",X"FE",X"0A",X"38",X"02",X"3E",X"0A",X"47", + X"3E",X"20",X"90",X"32",X"30",X"8D",X"DD",X"36",X"09",X"10",X"F1",X"C9",X"DD",X"21",X"E0",X"8A", + X"11",X"18",X"00",X"06",X"11",X"D9",X"CD",X"3F",X"2C",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD", + X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"E6",X"1F",X"D6",X"11",X"D8",X"EF", + X"58",X"2C",X"B3",X"2C",X"24",X"2D",X"4A",X"2D",X"CD",X"06",X"40",X"DD",X"7E",X"05",X"DD",X"86", + X"09",X"30",X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"47",X"DD",X"7E",X"06",X"FE",X"12",X"D8", + X"DD",X"21",X"E0",X"8A",X"06",X"11",X"CD",X"85",X"2C",X"11",X"18",X"00",X"DD",X"19",X"10",X"F6", + X"CD",X"3F",X"0F",X"F1",X"C9",X"DD",X"7E",X"02",X"FE",X"11",X"C0",X"DD",X"36",X"02",X"12",X"11", + X"A7",X"2C",X"CD",X"1E",X"38",X"21",X"00",X"2D",X"DD",X"75",X"16",X"DD",X"74",X"17",X"DD",X"36", + X"15",X"00",X"C9",X"A7",X"2C",X"AD",X"2C",X"4F",X"04",X"F0",X"FF",X"A7",X"2C",X"0F",X"04",X"F0", + X"FF",X"AD",X"2C",X"CD",X"06",X"40",X"DD",X"6E",X"16",X"DD",X"66",X"17",X"7E",X"FE",X"FF",X"20", + X"06",X"DD",X"77",X"15",X"23",X"18",X"F5",X"FE",X"88",X"20",X"0E",X"DD",X"34",X"02",X"11",X"5D", + X"2D",X"CD",X"1E",X"38",X"DD",X"36",X"11",X"20",X"C9",X"23",X"DD",X"75",X"16",X"DD",X"74",X"17", + X"DD",X"CB",X"15",X"46",X"20",X"0E",X"47",X"DD",X"7E",X"03",X"90",X"30",X"03",X"DD",X"35",X"04", + X"DD",X"77",X"03",X"C9",X"DD",X"86",X"03",X"30",X"03",X"DD",X"34",X"04",X"DD",X"77",X"03",X"C9", + X"C0",X"80",X"60",X"40",X"40",X"20",X"20",X"20",X"00",X"20",X"00",X"20",X"00",X"00",X"20",X"00", + X"00",X"FF",X"00",X"00",X"20",X"00",X"00",X"20",X"00",X"20",X"00",X"20",X"20",X"20",X"40",X"40", + X"60",X"80",X"C0",X"88",X"CD",X"06",X"40",X"DD",X"7E",X"05",X"DD",X"86",X"09",X"30",X"03",X"DD", + X"34",X"06",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"FE",X"19",X"D8",X"DD",X"34",X"02",X"AF",X"DD", + X"77",X"05",X"DD",X"77",X"06",X"DD",X"77",X"16",X"F1",X"C9",X"3E",X"00",X"32",X"36",X"8F",X"F1", + X"C9",X"F0",X"F1",X"F3",X"F2",X"A2",X"A1",X"10",X"10",X"15",X"00",X"0A",X"0F",X"40",X"03",X"07", + X"40",X"09",X"07",X"FF",X"5D",X"2D",X"3A",X"32",X"8D",X"A7",X"C0",X"3A",X"03",X"89",X"D6",X"02", + X"C8",X"CD",X"78",X"2D",X"CD",X"22",X"2E",X"C9",X"3A",X"14",X"8F",X"EF",X"80",X"2D",X"BC",X"2D", + X"3A",X"03",X"89",X"D6",X"02",X"21",X"31",X"89",X"BE",X"C8",X"34",X"21",X"18",X"8F",X"7E",X"FE", + X"04",X"38",X"05",X"3A",X"EF",X"89",X"A7",X"C8",X"34",X"21",X"B8",X"2D",X"E7",X"6F",X"26",X"84", + X"22",X"19",X"8F",X"3A",X"18",X"8F",X"47",X"21",X"26",X"8F",X"23",X"23",X"10",X"FC",X"36",X"10", + X"2E",X"14",X"34",X"2E",X"16",X"36",X"10",X"C9",X"97",X"93",X"8F",X"8A",X"21",X"16",X"8F",X"7E", + X"A7",X"28",X"02",X"35",X"C9",X"36",X"08",X"2E",X"1B",X"7E",X"FE",X"08",X"20",X"0F",X"AF",X"77", + X"2E",X"14",X"77",X"3A",X"18",X"8F",X"2E",X"1B",X"85",X"6F",X"36",X"01",X"C9",X"21",X"EE",X"2D", + X"CD",X"45",X"0C",X"2A",X"19",X"8F",X"CD",X"25",X"33",X"21",X"1B",X"8F",X"34",X"C9",X"FE",X"2D", + X"02",X"2E",X"06",X"2E",X"0A",X"2E",X"0E",X"2E",X"12",X"2E",X"16",X"2E",X"1A",X"2E",X"39",X"39", + X"3A",X"3A",X"39",X"F4",X"F6",X"3A",X"39",X"F5",X"F7",X"3A",X"39",X"F8",X"FA",X"3A",X"F4",X"FC", + X"FE",X"F6",X"F5",X"FD",X"FF",X"F7",X"F8",X"E0",X"E2",X"FA",X"F9",X"E1",X"E3",X"FB",X"39",X"39", + X"A7",X"A6",X"3A",X"18",X"8F",X"A7",X"C8",X"DD",X"21",X"1C",X"8F",X"47",X"D9",X"CD",X"36",X"2E", + X"D9",X"DD",X"23",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"D6",X"01",X"D8",X"EF",X"5E",X"2E",X"CB", + X"2E",X"01",X"2F",X"2F",X"2F",X"DD",X"7D",X"4F",X"E6",X"03",X"87",X"C6",X"28",X"6F",X"26",X"8F", + X"35",X"C9",X"DD",X"7D",X"E6",X"03",X"21",X"B8",X"2D",X"E7",X"6F",X"26",X"84",X"C9",X"3A",X"5F", + X"8A",X"E6",X"03",X"C0",X"CD",X"45",X"2E",X"C0",X"36",X"01",X"FD",X"21",X"48",X"8C",X"11",X"18", + X"00",X"06",X"03",X"FD",X"7E",X"00",X"FD",X"B6",X"01",X"0F",X"30",X"05",X"FD",X"19",X"10",X"F3", + X"C9",X"3A",X"07",X"89",X"FE",X"10",X"38",X"02",X"3E",X"10",X"D6",X"28",X"2F",X"77",X"23",X"78", + X"2F",X"E6",X"03",X"77",X"DD",X"7D",X"E6",X"03",X"21",X"C7",X"2E",X"E7",X"FD",X"36",X"00",X"07", + X"FD",X"36",X"02",X"10",X"FD",X"77",X"04",X"FD",X"36",X"05",X"40",X"FD",X"36",X"06",X"1A",X"FD", + X"36",X"0F",X"2E",X"FD",X"36",X"10",X"40",X"DD",X"34",X"00",X"CD",X"52",X"2E",X"11",X"FE",X"2D", + X"CD",X"25",X"33",X"CD",X"11",X"0F",X"C9",X"18",X"14",X"10",X"0B",X"CD",X"45",X"2E",X"C0",X"3A", + X"07",X"89",X"FE",X"10",X"38",X"02",X"3E",X"10",X"07",X"C6",X"18",X"77",X"FD",X"21",X"30",X"8C", + X"11",X"18",X"00",X"23",X"46",X"04",X"FD",X"19",X"10",X"FC",X"FD",X"34",X"0F",X"FD",X"36",X"05", + X"00",X"FD",X"35",X"06",X"DD",X"34",X"00",X"CD",X"52",X"2E",X"11",X"1E",X"2E",X"CD",X"25",X"33", + X"C9",X"CD",X"5F",X"30",X"CD",X"45",X"2E",X"C0",X"36",X"0C",X"FD",X"21",X"30",X"8C",X"11",X"18", + X"00",X"23",X"46",X"04",X"FD",X"19",X"10",X"FC",X"FD",X"35",X"0F",X"FD",X"36",X"05",X"C0",X"FD", + X"34",X"06",X"DD",X"34",X"00",X"CD",X"52",X"2E",X"11",X"FE",X"2D",X"CD",X"25",X"33",X"C9",X"CD", + X"45",X"2E",X"C0",X"3A",X"31",X"89",X"A7",X"C8",X"E5",X"3A",X"07",X"89",X"CB",X"3F",X"CB",X"3F", + X"FE",X"04",X"38",X"02",X"3E",X"03",X"47",X"3A",X"20",X"88",X"E6",X"04",X"0F",X"80",X"21",X"93", + X"2F",X"CD",X"45",X"0C",X"EB",X"3A",X"31",X"89",X"3D",X"FE",X"20",X"38",X"02",X"3E",X"1F",X"E7", + X"E1",X"5F",X"7D",X"FE",X"28",X"28",X"0C",X"D6",X"02",X"6F",X"7E",X"E6",X"1C",X"83",X"5F",X"7D", + X"C6",X"02",X"6F",X"7B",X"77",X"11",X"18",X"00",X"23",X"46",X"21",X"30",X"8C",X"04",X"19",X"10", + X"FD",X"AF",X"06",X"18",X"D7",X"3C",X"DD",X"77",X"00",X"CD",X"52",X"2E",X"11",X"1A",X"2E",X"CD", + X"25",X"33",X"C9",X"9F",X"2F",X"BF",X"2F",X"DF",X"2F",X"FF",X"2F",X"1F",X"30",X"3F",X"30",X"64", + X"64",X"60",X"60",X"60",X"5C",X"5C",X"58",X"58",X"58",X"4C",X"4C",X"48",X"48",X"48",X"40",X"40", + X"40",X"3C",X"3C",X"3C",X"38",X"38",X"30",X"30",X"30",X"2C",X"2C",X"20",X"20",X"18",X"10",X"58", + X"58",X"58",X"54",X"54",X"50",X"50",X"4C",X"4C",X"48",X"48",X"40",X"40",X"40",X"3C",X"3C",X"38", + X"38",X"34",X"34",X"30",X"30",X"2C",X"2C",X"28",X"28",X"24",X"24",X"18",X"18",X"10",X"08",X"48", + X"48",X"48",X"44",X"3C",X"3C",X"34",X"34",X"30",X"30",X"28",X"28",X"24",X"24",X"20",X"20",X"1C", + X"1C",X"18",X"18",X"14",X"14",X"10",X"10",X"0C",X"0C",X"08",X"08",X"04",X"04",X"03",X"02",X"38", + X"38",X"34",X"34",X"2C",X"2C",X"28",X"28",X"24",X"24",X"20",X"20",X"1C",X"1C",X"18",X"18",X"14", + X"14",X"10",X"10",X"0C",X"0C",X"08",X"08",X"04",X"04",X"04",X"04",X"02",X"02",X"02",X"01",X"20", + X"20",X"20",X"1C",X"1C",X"18",X"18",X"14",X"14",X"10",X"10",X"10",X"0C",X"0C",X"0C",X"08",X"08", + X"08",X"04",X"04",X"04",X"02",X"02",X"02",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"18", + X"18",X"18",X"18",X"14",X"14",X"14",X"10",X"10",X"10",X"0C",X"0C",X"0C",X"08",X"08",X"04",X"04", + X"04",X"02",X"02",X"02",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"DD", + X"7D",X"E6",X"03",X"21",X"87",X"30",X"E7",X"47",X"3A",X"84",X"8A",X"D6",X"07",X"4F",X"C6",X"0E", + X"B8",X"D8",X"79",X"B8",X"D0",X"21",X"24",X"8F",X"3A",X"08",X"8F",X"B6",X"C0",X"3E",X"01",X"32", + X"32",X"8D",X"CD",X"15",X"0F",X"F1",X"C9",X"C0",X"A0",X"80",X"58",X"3A",X"04",X"8F",X"A7",X"C8", + X"3A",X"08",X"8F",X"A7",X"20",X"4A",X"DD",X"21",X"E0",X"8A",X"FD",X"21",X"20",X"89",X"11",X"18", + X"00",X"06",X"11",X"DD",X"7E",X"00",X"A7",X"28",X"0D",X"FE",X"05",X"28",X"09",X"DD",X"19",X"10", + X"F2",X"AF",X"32",X"20",X"89",X"C9",X"DD",X"7E",X"01",X"A7",X"20",X"F1",X"DD",X"E5",X"E1",X"FD", + X"75",X"00",X"FD",X"74",X"01",X"DD",X"36",X"00",X"05",X"DD",X"36",X"02",X"10",X"FD",X"23",X"FD", + X"23",X"FD",X"7D",X"FE",X"28",X"20",X"D6",X"21",X"08",X"8F",X"36",X"01",X"23",X"36",X"20",X"C9", + X"21",X"BD",X"32",X"E5",X"3A",X"08",X"8F",X"E6",X"03",X"3D",X"EF",X"F1",X"30",X"6E",X"31",X"66", + X"32",X"DD",X"21",X"20",X"89",X"21",X"37",X"33",X"06",X"04",X"DD",X"5E",X"00",X"DD",X"56",X"01", + X"FD",X"6B",X"FD",X"62",X"7E",X"FD",X"77",X"04",X"23",X"7E",X"FD",X"77",X"06",X"23",X"7E",X"FD", + X"77",X"0F",X"23",X"7E",X"FD",X"77",X"10",X"FD",X"36",X"09",X"30",X"DD",X"23",X"DD",X"23",X"23", + X"10",X"D8",X"3E",X"0C",X"32",X"28",X"89",X"21",X"08",X"8F",X"34",X"3E",X"10",X"11",X"1D",X"00", + X"21",X"C2",X"84",X"0E",X"03",X"06",X"03",X"D7",X"19",X"0D",X"20",X"F9",X"21",X"70",X"33",X"22", + X"4B",X"8F",X"CD",X"19",X"0F",X"CD",X"3E",X"32",X"11",X"AC",X"68",X"21",X"78",X"32",X"06",X"40", + X"7B",X"BE",X"20",X"0F",X"7A",X"23",X"BE",X"20",X"0A",X"23",X"1A",X"BE",X"20",X"05",X"13",X"23", + X"10",X"F8",X"C9",X"AF",X"21",X"00",X"88",X"11",X"01",X"88",X"77",X"ED",X"B0",X"C9",X"21",X"28", + X"89",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"2E",X"20",X"5E",X"23",X"56",X"D5",X"FD",X"E1",X"2A", + X"4B",X"8F",X"7E",X"A7",X"28",X"13",X"FD",X"86",X"05",X"30",X"03",X"FD",X"34",X"06",X"FD",X"77", + X"05",X"23",X"7E",X"23",X"22",X"4B",X"8F",X"18",X"0B",X"FD",X"34",X"09",X"20",X"03",X"FD",X"34", + X"04",X"FD",X"7E",X"09",X"FD",X"86",X"03",X"30",X"03",X"FD",X"34",X"04",X"FD",X"77",X"03",X"3A", + X"4A",X"8F",X"A7",X"FD",X"7E",X"04",X"20",X"1F",X"07",X"07",X"07",X"C6",X"18",X"4F",X"3A",X"84", + X"8A",X"B9",X"30",X"21",X"3E",X"01",X"32",X"24",X"8F",X"32",X"4A",X"8F",X"21",X"48",X"33",X"22", + X"4B",X"8F",X"CD",X"1D",X"0F",X"18",X"0E",X"FE",X"1B",X"38",X"0A",X"32",X"28",X"89",X"21",X"08", + X"8F",X"34",X"CD",X"1D",X"0F",X"FD",X"4E",X"04",X"FD",X"46",X"06",X"DD",X"21",X"20",X"89",X"11", + X"03",X"00",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"19",X"FD",X"7E",X"03",X"77",X"23",X"79",X"77", + X"23",X"FD",X"7E",X"05",X"77",X"23",X"78",X"C6",X"02",X"77",X"DD",X"6E",X"04",X"DD",X"66",X"05", + X"19",X"FD",X"7E",X"03",X"77",X"23",X"79",X"C6",X"02",X"77",X"23",X"FD",X"7E",X"05",X"77",X"23", + X"78",X"77",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"19",X"FD",X"7E",X"03",X"77",X"23",X"79",X"C6", + X"02",X"77",X"23",X"FD",X"7E",X"05",X"77",X"23",X"78",X"C6",X"02",X"77",X"06",X"04",X"DD",X"7E", + X"01",X"FE",X"8C",X"CC",X"4D",X"32",X"DD",X"23",X"DD",X"23",X"10",X"F2",X"C9",X"DD",X"7E",X"00", + X"FE",X"40",X"D8",X"26",X"8C",X"C6",X"05",X"6F",X"7E",X"D6",X"40",X"77",X"D0",X"23",X"35",X"3A", + X"E5",X"89",X"A7",X"20",X"13",X"C9",X"21",X"99",X"07",X"01",X"00",X"20",X"7E",X"81",X"4F",X"23", + X"10",X"FA",X"FE",X"DC",X"C2",X"99",X"07",X"C9",X"AC",X"68",X"21",X"55",X"8F",X"7E",X"A7",X"C0", + X"34",X"21",X"02",X"84",X"11",X"00",X"00",X"7E",X"83",X"5F",X"30",X"01",X"14",X"2C",X"7D",X"E6", + X"1F",X"FE",X"1F",X"20",X"F2",X"7D",X"C6",X"03",X"6F",X"30",X"EC",X"24",X"7C",X"FE",X"88",X"38", + X"E6",X"21",X"EB",X"68",X"06",X"04",X"7B",X"BE",X"28",X"06",X"23",X"10",X"FA",X"C3",X"D4",X"76", + X"7A",X"23",X"BE",X"C8",X"10",X"FA",X"C3",X"29",X"38",X"43",X"95",X"89",X"87",X"3A",X"24",X"8F", + X"A7",X"C8",X"FE",X"02",X"28",X"22",X"D0",X"AF",X"21",X"21",X"8D",X"77",X"23",X"36",X"20",X"CD", + X"AD",X"0F",X"21",X"24",X"8F",X"34",X"21",X"79",X"07",X"01",X"00",X"20",X"7E",X"81",X"4F",X"23", + X"10",X"FA",X"E6",X"47",X"C2",X"40",X"1F",X"C9",X"21",X"84",X"8A",X"34",X"34",X"7E",X"FE",X"DB", + X"30",X"04",X"CD",X"D7",X"23",X"C9",X"CD",X"30",X"0F",X"3A",X"83",X"80",X"A7",X"C0",X"3C",X"32", + X"32",X"8D",X"21",X"24",X"8F",X"34",X"C9",X"01",X"1D",X"00",X"C5",X"06",X"03",X"1A",X"77",X"13", + X"23",X"10",X"FA",X"C1",X"09",X"3A",X"0B",X"8F",X"3C",X"32",X"0B",X"8F",X"FE",X"03",X"20",X"E7", + X"AF",X"32",X"0B",X"8F",X"C9",X"01",X"20",X"00",X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"09", + X"1A",X"77",X"13",X"2B",X"1A",X"77",X"C9",X"02",X"17",X"30",X"40",X"02",X"19",X"35",X"40",X"04", + X"17",X"38",X"40",X"04",X"19",X"3F",X"40",X"FF",X"20",X"00",X"20",X"00",X"20",X"00",X"20",X"00", + X"20",X"10",X"20",X"10",X"20",X"10",X"20",X"10",X"20",X"18",X"20",X"18",X"20",X"18",X"20",X"18", + X"18",X"20",X"18",X"20",X"18",X"20",X"18",X"20",X"10",X"28",X"10",X"28",X"10",X"28",X"10",X"28", + X"10",X"30",X"10",X"30",X"10",X"30",X"00",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"06",X"0E", + X"D9",X"CD",X"8A",X"33",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01", + X"0F",X"D0",X"DD",X"7E",X"02",X"E6",X"1F",X"FE",X"11",X"D0",X"EF",X"BD",X"33",X"23",X"34",X"36", + X"35",X"5B",X"35",X"65",X"38",X"AF",X"39",X"E3",X"3B",X"92",X"3C",X"18",X"3D",X"5C",X"3D",X"8F", + X"3D",X"69",X"3E",X"9C",X"3E",X"5C",X"3F",X"72",X"3F",X"7C",X"3F",X"E9",X"3F",X"DD",X"35",X"11", + X"C0",X"DD",X"34",X"02",X"DD",X"CB",X"0B",X"46",X"20",X"2D",X"3A",X"43",X"8D",X"E6",X"0F",X"21", + X"18",X"34",X"E7",X"32",X"4B",X"8D",X"DD",X"BE",X"06",X"28",X"11",X"3E",X"00",X"11",X"29",X"38", + X"30",X"04",X"3C",X"11",X"38",X"38",X"DD",X"77",X"08",X"C3",X"1E",X"38",X"DD",X"7E",X"09",X"DD", + X"BE",X"05",X"38",X"EF",X"C3",X"73",X"34",X"21",X"4C",X"8D",X"34",X"3E",X"06",X"32",X"01",X"89", + X"AF",X"32",X"4A",X"8D",X"DD",X"77",X"0B",X"CD",X"CA",X"33",X"11",X"47",X"38",X"DD",X"CB",X"08", + X"46",X"28",X"D6",X"11",X"56",X"38",X"18",X"D1",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"00", + X"00",X"00",X"00",X"CD",X"06",X"40",X"DD",X"CB",X"01",X"46",X"28",X"0B",X"3A",X"63",X"8F",X"A7", + X"C0",X"DD",X"36",X"01",X"00",X"18",X"3C",X"DD",X"7E",X"08",X"A7",X"C2",X"F2",X"34",X"DD",X"7E", + X"05",X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"47",X"3A",X"4B",X"8D", + X"4F",X"DD",X"7E",X"06",X"E6",X"1F",X"B9",X"D8",X"28",X"0A",X"DD",X"36",X"08",X"01",X"11",X"38", + X"38",X"C3",X"1E",X"38",X"A7",X"CA",X"B0",X"34",X"3A",X"0A",X"88",X"FE",X"04",X"C0",X"DD",X"7E", + X"09",X"B8",X"D8",X"3A",X"63",X"8F",X"A7",X"CA",X"7F",X"34",X"DD",X"36",X"01",X"01",X"C9",X"DD", + X"36",X"01",X"00",X"21",X"43",X"8D",X"7E",X"FE",X"07",X"30",X"25",X"FE",X"0A",X"30",X"01",X"34", + X"7E",X"21",X"18",X"34",X"E7",X"32",X"4B",X"8D",X"21",X"E3",X"86",X"11",X"40",X"00",X"36",X"D8", + X"23",X"36",X"D9",X"1E",X"1F",X"19",X"36",X"DA",X"23",X"36",X"DB",X"3E",X"01",X"32",X"63",X"8F", + X"CD",X"53",X"35",X"21",X"40",X"8D",X"35",X"21",X"01",X"89",X"7E",X"4F",X"A7",X"28",X"01",X"35", + X"3A",X"0A",X"88",X"FE",X"04",X"20",X"02",X"2C",X"34",X"3A",X"01",X"89",X"47",X"21",X"43",X"87", + X"11",X"20",X"00",X"FE",X"0A",X"38",X"0C",X"3A",X"50",X"8F",X"A7",X"C0",X"AF",X"C6",X"01",X"27", + X"10",X"FB",X"47",X"E6",X"0F",X"77",X"19",X"78",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"A7",X"C8", + X"77",X"C9",X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"05",X"B8",X"30",X"03",X"DD",X"35", + X"06",X"DD",X"86",X"0A",X"DD",X"77",X"05",X"47",X"3A",X"4B",X"8D",X"4F",X"DD",X"7E",X"06",X"E6", + X"1F",X"B9",X"28",X"10",X"D0",X"A7",X"CA",X"B0",X"34",X"3A",X"0A",X"88",X"FE",X"04",X"C0",X"DD", + X"36",X"08",X"00",X"C9",X"A7",X"CA",X"B0",X"34",X"3A",X"0A",X"88",X"FE",X"04",X"C0",X"DD",X"7E", + X"09",X"B8",X"D8",X"C3",X"73",X"34",X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"DD",X"7E",X"07", + X"E6",X"F0",X"28",X"0F",X"21",X"76",X"8D",X"34",X"7E",X"FE",X"03",X"38",X"06",X"2D",X"AF",X"77", + X"32",X"20",X"8F",X"AF",X"DD",X"E5",X"E1",X"06",X"17",X"D7",X"C9",X"CD",X"06",X"40",X"DD",X"7E", + X"08",X"A7",X"C2",X"57",X"37",X"DD",X"7E",X"05",X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"06", + X"DD",X"77",X"05",X"47",X"3A",X"01",X"89",X"FE",X"03",X"DA",X"2D",X"36",X"3A",X"79",X"8D",X"A7", + X"20",X"32",X"21",X"C7",X"35",X"3A",X"07",X"89",X"E6",X"0F",X"CB",X"3F",X"CD",X"45",X"0C",X"EB", + X"3A",X"41",X"8D",X"E6",X"07",X"E7",X"4F",X"DD",X"7E",X"06",X"B9",X"CA",X"17",X"36",X"FE",X"14", + X"D8",X"DD",X"36",X"08",X"01",X"11",X"38",X"38",X"DD",X"CB",X"07",X"4E",X"28",X"03",X"11",X"56", + X"38",X"C3",X"1E",X"38",X"DD",X"CB",X"07",X"56",X"28",X"08",X"2A",X"6F",X"8D",X"3A",X"7B",X"8D", + X"18",X"D3",X"DD",X"7E",X"06",X"18",X"D7",X"D7",X"35",X"DF",X"35",X"E7",X"35",X"EF",X"35",X"F7", + X"35",X"FF",X"35",X"07",X"36",X"0F",X"36",X"09",X"0D",X"11",X"09",X"0D",X"11",X"09",X"0D",X"09", + X"11",X"0D",X"11",X"0D",X"09",X"0D",X"09",X"11",X"0D",X"09",X"11",X"0D",X"09",X"11",X"0D",X"08", + X"0B",X"0F",X"12",X"08",X"12",X"0B",X"0F",X"12",X"0F",X"0B",X"08",X"0F",X"12",X"08",X"0B",X"08", + X"0B",X"0E",X"11",X"0B",X"08",X"11",X"0E",X"11",X"0E",X"0B",X"08",X"0E",X"11",X"0B",X"08",X"08", + X"0B",X"0F",X"12",X"0A",X"11",X"09",X"0D",X"78",X"FE",X"20",X"D0",X"18",X"40",X"DD",X"CB",X"08", + X"46",X"C8",X"C3",X"75",X"37",X"DD",X"CB",X"08",X"46",X"C0",X"C3",X"7C",X"35",X"DD",X"7E",X"06", + X"FE",X"07",X"38",X"E9",X"FE",X"14",X"30",X"ED",X"3A",X"7D",X"8D",X"FE",X"0E",X"38",X"06",X"DD", + X"7E",X"06",X"FE",X"13",X"D8",X"21",X"6B",X"8D",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"78",X"FE", + X"80",X"D0",X"EB",X"21",X"8E",X"36",X"3A",X"07",X"89",X"E6",X"07",X"E7",X"12",X"DD",X"CB",X"0B", + X"46",X"28",X"14",X"21",X"E2",X"8A",X"11",X"18",X"00",X"4A",X"06",X"06",X"7E",X"FE",X"03",X"20", + X"01",X"0C",X"19",X"10",X"F7",X"0D",X"C0",X"FD",X"21",X"70",X"8B",X"11",X"18",X"00",X"06",X"05", + X"FD",X"7E",X"00",X"FD",X"B6",X"01",X"0F",X"30",X"0D",X"FD",X"19",X"10",X"F3",X"C9",X"28",X"28", + X"20",X"20",X"18",X"18",X"10",X"10",X"DD",X"CB",X"07",X"56",X"28",X"13",X"21",X"7B",X"8D",X"34", + X"21",X"79",X"8D",X"7E",X"A7",X"28",X"08",X"35",X"21",X"75",X"8D",X"77",X"2C",X"36",X"00",X"21", + X"41",X"8D",X"34",X"20",X"01",X"34",X"4E",X"DD",X"71",X"14",X"21",X"88",X"39",X"DD",X"CB",X"07", + X"4E",X"28",X"03",X"21",X"94",X"39",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00", + X"DD",X"36",X"11",X"28",X"DD",X"36",X"02",X"04",X"CD",X"DE",X"36",X"C3",X"9D",X"37",X"3A",X"07", + X"89",X"FE",X"10",X"38",X"02",X"3E",X"0E",X"47",X"3A",X"20",X"88",X"87",X"80",X"21",X"37",X"37", + X"E7",X"DD",X"CB",X"16",X"46",X"28",X"0C",X"3D",X"28",X"16",X"DD",X"CB",X"13",X"46",X"28",X"03", + X"3D",X"28",X"0D",X"47",X"DD",X"7E",X"06",X"FE",X"09",X"78",X"30",X"04",X"3D",X"28",X"01",X"3D", + X"47",X"3A",X"01",X"89",X"FE",X"04",X"78",X"30",X"03",X"3E",X"03",X"80",X"21",X"27",X"37",X"E7", + X"DD",X"B6",X"08",X"DD",X"77",X"08",X"C9",X"00",X"10",X"20",X"30",X"40",X"50",X"60",X"70",X"80", + X"90",X"A0",X"B0",X"C0",X"D0",X"E0",X"F0",X"01",X"01",X"02",X"02",X"03",X"02",X"04",X"02",X"05", + X"03",X"05",X"03",X"06",X"03",X"06",X"03",X"07",X"03",X"07",X"03",X"07",X"04",X"07",X"04",X"07", + X"04",X"07",X"04",X"07",X"04",X"07",X"04",X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"05", + X"B8",X"30",X"03",X"DD",X"35",X"06",X"DD",X"86",X"0A",X"DD",X"77",X"05",X"47",X"3A",X"01",X"89", + X"FE",X"03",X"DA",X"2D",X"36",X"3A",X"0A",X"88",X"FE",X"05",X"28",X"19",X"DD",X"7E",X"06",X"FE", + X"02",X"D0",X"DD",X"36",X"08",X"00",X"11",X"29",X"38",X"DD",X"CB",X"07",X"4E",X"28",X"03",X"11", + X"47",X"38",X"C3",X"1E",X"38",X"DD",X"7E",X"06",X"A7",X"C0",X"C3",X"53",X"35",X"FD",X"36",X"00", + X"01",X"FD",X"36",X"02",X"04",X"FD",X"71",X"14",X"AF",X"FD",X"77",X"07",X"FD",X"77",X"0E",X"DD", + X"7E",X"05",X"C6",X"80",X"FD",X"77",X"05",X"DD",X"7E",X"03",X"C6",X"80",X"FD",X"77",X"03",X"DD", + X"7E",X"04",X"D6",X"01",X"FD",X"77",X"04",X"DD",X"7E",X"06",X"C6",X"01",X"FD",X"77",X"06",X"21", + X"A5",X"38",X"3A",X"20",X"88",X"FE",X"07",X"20",X"03",X"21",X"AD",X"38",X"3A",X"00",X"89",X"FE", + X"08",X"38",X"02",X"3E",X"07",X"E7",X"3A",X"07",X"89",X"E6",X"01",X"7E",X"28",X"02",X"ED",X"44", + X"FD",X"77",X"0A",X"DD",X"77",X"0A",X"21",X"B5",X"38",X"DD",X"7E",X"07",X"E6",X"F0",X"0F",X"0F", + X"0F",X"0F",X"CD",X"45",X"0C",X"DD",X"7E",X"0B",X"A7",X"28",X"03",X"11",X"52",X"39",X"FD",X"77", + X"0B",X"FD",X"73",X"0C",X"FD",X"72",X"0D",X"FD",X"36",X"11",X"28",X"C3",X"E3",X"0E",X"DD",X"73", + X"0C",X"DD",X"72",X"0D",X"DD",X"36",X"0E",X"00",X"C9",X"40",X"26",X"07",X"40",X"27",X"07",X"40", + X"28",X"07",X"40",X"27",X"07",X"FF",X"29",X"38",X"C0",X"26",X"07",X"C0",X"27",X"07",X"C0",X"28", + X"07",X"C0",X"27",X"07",X"FF",X"38",X"38",X"44",X"26",X"07",X"44",X"27",X"07",X"44",X"28",X"07", + X"44",X"27",X"07",X"FF",X"47",X"38",X"C4",X"26",X"07",X"C4",X"27",X"07",X"C4",X"28",X"07",X"C4", + X"27",X"07",X"FF",X"56",X"38",X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"DD",X"34",X"02",X"DD", + X"CB",X"08",X"86",X"DD",X"E5",X"E1",X"7C",X"FE",X"8B",X"D8",X"7D",X"FE",X"70",X"D8",X"DD",X"35", + X"04",X"DD",X"35",X"06",X"3A",X"5F",X"8A",X"A7",X"C0",X"21",X"82",X"42",X"0E",X"00",X"59",X"7E", + X"2B",X"81",X"4F",X"30",X"01",X"1C",X"3E",X"1A",X"BE",X"20",X"F4",X"7B",X"81",X"E6",X"9E",X"C8", + X"21",X"F0",X"8E",X"34",X"C9",X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17",X"13",X"14",X"15", + X"16",X"17",X"17",X"17",X"17",X"CB",X"38",X"DA",X"38",X"E9",X"38",X"F8",X"38",X"07",X"39",X"16", + X"39",X"25",X"39",X"25",X"39",X"25",X"39",X"34",X"39",X"43",X"39",X"40",X"2D",X"12",X"40",X"02", + X"0C",X"40",X"3B",X"06",X"40",X"A1",X"E0",X"FF",X"D4",X"38",X"41",X"2D",X"12",X"41",X"02",X"0C", + X"41",X"3B",X"06",X"41",X"A1",X"E0",X"FF",X"E3",X"38",X"44",X"2D",X"12",X"44",X"02",X"0C",X"44", + X"3B",X"06",X"44",X"A1",X"E0",X"FF",X"F2",X"38",X"49",X"2D",X"12",X"49",X"02",X"0C",X"49",X"3B", + X"06",X"49",X"A1",X"E0",X"FF",X"01",X"39",X"4A",X"2D",X"12",X"4A",X"02",X"0C",X"4A",X"3B",X"06", + X"4A",X"A1",X"E0",X"FF",X"10",X"39",X"41",X"2D",X"12",X"41",X"02",X"0C",X"41",X"3B",X"06",X"41", + X"A1",X"E0",X"FF",X"1F",X"39",X"44",X"2D",X"12",X"44",X"02",X"0C",X"44",X"3B",X"06",X"44",X"A1", + X"E0",X"FF",X"2E",X"39",X"4E",X"2D",X"12",X"4E",X"02",X"0C",X"4E",X"3B",X"06",X"4E",X"A1",X"E0", + X"FF",X"3D",X"39",X"4F",X"2D",X"12",X"4F",X"02",X"0C",X"4F",X"3B",X"06",X"4F",X"A1",X"E0",X"FF", + X"4C",X"39",X"44",X"2D",X"12",X"44",X"02",X"0C",X"44",X"3B",X"06",X"44",X"A1",X"08",X"4B",X"A1", + X"08",X"4C",X"A1",X"08",X"4F",X"A1",X"08",X"FF",X"5B",X"39",X"40",X"2A",X"12",X"40",X"2B",X"18", + X"40",X"29",X"20",X"40",X"1F",X"10",X"FF",X"70",X"39",X"44",X"2A",X"12",X"44",X"2B",X"18",X"44", + X"29",X"20",X"44",X"1F",X"10",X"FF",X"7F",X"39",X"40",X"26",X"28",X"40",X"29",X"20",X"40",X"1F", + X"10",X"FF",X"8B",X"39",X"44",X"26",X"28",X"44",X"29",X"20",X"44",X"1F",X"10",X"FF",X"97",X"39", + X"40",X"2A",X"12",X"40",X"2B",X"18",X"40",X"06",X"10",X"40",X"0B",X"10",X"FF",X"A6",X"39",X"CD", + X"06",X"40",X"3A",X"07",X"89",X"E6",X"01",X"CA",X"87",X"3B",X"DD",X"7E",X"0A",X"ED",X"44",X"47", + X"DD",X"7E",X"03",X"B8",X"30",X"03",X"DD",X"35",X"04",X"DD",X"86",X"0A",X"DD",X"77",X"03",X"DD", + X"46",X"04",X"DD",X"7E",X"07",X"A7",X"28",X"79",X"78",X"FE",X"04",X"38",X"6B",X"FE",X"10",X"D8", + X"21",X"7D",X"8D",X"7E",X"FE",X"0E",X"30",X"20",X"3A",X"07",X"89",X"FE",X"06",X"30",X"0C",X"3A", + X"08",X"89",X"FE",X"03",X"38",X"05",X"7E",X"FE",X"08",X"30",X"0D",X"3A",X"20",X"88",X"FE",X"07", + X"28",X"06",X"DD",X"7E",X"06",X"FE",X"10",X"D0",X"3A",X"75",X"8D",X"A7",X"C0",X"DD",X"7E",X"08", + X"E6",X"F0",X"C8",X"DD",X"7E",X"15",X"A7",X"28",X"04",X"DD",X"35",X"15",X"C9",X"3A",X"42",X"88", + X"4F",X"3A",X"1F",X"88",X"47",X"A7",X"79",X"20",X"02",X"ED",X"44",X"0F",X"0F",X"0F",X"E6",X"1F", + X"4F",X"78",X"A7",X"20",X"02",X"0D",X"0D",X"3A",X"07",X"89",X"47",X"CB",X"47",X"79",X"28",X"02", + X"C6",X"04",X"DD",X"BE",X"04",X"28",X"25",X"C9",X"DD",X"36",X"02",X"00",X"DD",X"36",X"11",X"20", + X"C9",X"78",X"FE",X"02",X"D0",X"11",X"D1",X"3B",X"CD",X"1E",X"38",X"DD",X"36",X"02",X"02",X"DD", + X"36",X"11",X"28",X"C9",X"10",X"15",X"0D",X"1B",X"0F",X"11",X"13",X"1C",X"21",X"42",X"8D",X"34", + X"FD",X"21",X"E8",X"8B",X"06",X"03",X"11",X"18",X"00",X"FD",X"7E",X"00",X"FD",X"B6",X"01",X"0F", + X"30",X"05",X"FD",X"19",X"10",X"F3",X"C9",X"DD",X"7E",X"06",X"D6",X"06",X"CB",X"3F",X"E6",X"07", + X"4F",X"21",X"57",X"3B",X"3A",X"07",X"89",X"CB",X"47",X"28",X"03",X"21",X"47",X"3B",X"79",X"CD", + X"45",X"0C",X"1A",X"FD",X"77",X"12",X"13",X"1A",X"FD",X"77",X"13",X"FD",X"CB",X"08",X"C6",X"11", + X"6A",X"39",X"DD",X"CB",X"07",X"4E",X"28",X"03",X"11",X"79",X"39",X"DD",X"7E",X"16",X"E6",X"30", + X"FE",X"30",X"20",X"03",X"11",X"A0",X"39",X"CD",X"1E",X"38",X"DD",X"7E",X"08",X"D6",X"10",X"DD", + X"77",X"08",X"FD",X"36",X"00",X"01",X"FD",X"36",X"02",X"0B",X"FD",X"36",X"07",X"01",X"3A",X"50", + X"8F",X"A7",X"11",X"DD",X"3B",X"28",X"0D",X"11",X"3B",X"43",X"3A",X"07",X"89",X"CB",X"57",X"28", + X"03",X"11",X"41",X"43",X"FD",X"73",X"0C",X"FD",X"72",X"0D",X"FD",X"36",X"0E",X"00",X"FD",X"36", + X"16",X"00",X"FD",X"36",X"11",X"13",X"DD",X"E5",X"E1",X"FD",X"75",X"14",X"FD",X"74",X"15",X"21", + X"6C",X"8D",X"34",X"7E",X"E6",X"07",X"57",X"21",X"37",X"3B",X"3A",X"07",X"89",X"CB",X"47",X"28", + X"03",X"21",X"3F",X"3B",X"7A",X"E7",X"DD",X"77",X"15",X"C9",X"00",X"01",X"01",X"04",X"04",X"04", + X"07",X"0A",X"0D",X"0D",X"0D",X"0D",X"0D",X"20",X"1C",X"18",X"20",X"28",X"30",X"18",X"30",X"20", + X"22",X"24",X"26",X"28",X"30",X"28",X"30",X"67",X"3B",X"69",X"3B",X"6B",X"3B",X"6D",X"3B",X"6F", + X"3B",X"71",X"3B",X"73",X"3B",X"75",X"3B",X"77",X"3B",X"79",X"3B",X"7B",X"3B",X"7D",X"3B",X"7F", + X"3B",X"81",X"3B",X"83",X"3B",X"85",X"3B",X"40",X"48",X"40",X"48",X"40",X"40",X"40",X"44",X"40", + X"48",X"40",X"50",X"40",X"58",X"40",X"30",X"40",X"20",X"40",X"20",X"40",X"1C",X"40",X"1C",X"40", + X"1C",X"40",X"18",X"40",X"18",X"40",X"38",X"DD",X"CB",X"08",X"46",X"C2",X"BA",X"39",X"DD",X"7E", + X"03",X"DD",X"86",X"0A",X"30",X"03",X"DD",X"34",X"04",X"DD",X"77",X"03",X"DD",X"46",X"04",X"DD", + X"7E",X"07",X"A7",X"CA",X"CA",X"3B",X"78",X"FE",X"1D",X"30",X"03",X"C3",X"E0",X"39",X"DD",X"34", + X"02",X"AF",X"DD",X"77",X"00",X"DD",X"36",X"01",X"01",X"DD",X"CB",X"08",X"86",X"DD",X"36",X"09", + X"20",X"DD",X"77",X"14",X"11",X"29",X"38",X"C3",X"1E",X"38",X"78",X"FE",X"1B",X"D4",X"53",X"35", + X"C9",X"40",X"34",X"07",X"40",X"33",X"08",X"40",X"32",X"09",X"40",X"31",X"20",X"40",X"00",X"F0", + X"FF",X"DD",X"3B",X"CD",X"06",X"40",X"DD",X"CB",X"08",X"46",X"20",X"24",X"DD",X"7E",X"05",X"DD", + X"86",X"09",X"30",X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"47",X"DD",X"7E",X"06",X"FE",X"1F", + X"D8",X"18",X"38",X"DD",X"34",X"02",X"DD",X"36",X"11",X"20",X"3E",X"28",X"32",X"5E",X"8D",X"C9", + X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"05",X"B8",X"30",X"03",X"DD",X"35",X"06",X"DD", + X"86",X"0A",X"DD",X"77",X"05",X"47",X"DD",X"6E",X"14",X"DD",X"66",X"15",X"E5",X"FD",X"E1",X"FD", + X"77",X"05",X"DD",X"7E",X"06",X"FD",X"77",X"06",X"E6",X"1F",X"C0",X"21",X"03",X"89",X"34",X"21", + X"40",X"8D",X"35",X"2E",X"7D",X"34",X"DD",X"7E",X"07",X"E6",X"F0",X"CA",X"53",X"35",X"CD",X"53", + X"35",X"3A",X"7E",X"8D",X"A7",X"C0",X"21",X"76",X"8D",X"34",X"7E",X"FE",X"02",X"D8",X"2D",X"AF", + X"77",X"32",X"20",X"8F",X"32",X"6D",X"8D",X"32",X"6E",X"8D",X"3E",X"02",X"32",X"07",X"8D",X"32", + X"7E",X"8D",X"3A",X"1F",X"88",X"A7",X"C0",X"3A",X"01",X"89",X"FE",X"10",X"D0",X"11",X"D5",X"01", + X"01",X"12",X"00",X"1A",X"1B",X"80",X"47",X"0D",X"20",X"F9",X"FE",X"55",X"C8",X"21",X"ED",X"89", + X"34",X"C9",X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"FD",X"21",X"30",X"8C",X"11",X"18",X"00", + X"06",X"04",X"CD",X"AE",X"3C",X"FD",X"19",X"10",X"F9",X"DD",X"36",X"11",X"10",X"C9",X"FD",X"7E", + X"00",X"FD",X"B6",X"01",X"0F",X"C0",X"FD",X"36",X"01",X"01",X"AF",X"FD",X"36",X"02",X"10",X"21", + X"0F",X"3D",X"FD",X"75",X"0C",X"FD",X"74",X"0D",X"FD",X"77",X"0E",X"DD",X"36",X"02",X"06",X"DD", + X"36",X"08",X"01",X"DD",X"36",X"0A",X"E8",X"11",X"38",X"38",X"CD",X"1E",X"38",X"DD",X"7E",X"04", + X"D6",X"01",X"FD",X"77",X"04",X"DD",X"7E",X"03",X"FD",X"77",X"03",X"DD",X"7E",X"06",X"C6",X"01", + X"FD",X"77",X"06",X"DD",X"7E",X"05",X"FD",X"77",X"05",X"FD",X"36",X"08",X"01",X"FD",X"36",X"0A", + X"E8",X"CD",X"3C",X"40",X"FD",X"E5",X"E1",X"DD",X"75",X"14",X"DD",X"74",X"15",X"F1",X"C9",X"40", + X"83",X"10",X"40",X"89",X"10",X"FF",X"0F",X"3D",X"06",X"20",X"DD",X"4E",X"17",X"3A",X"45",X"8D", + X"A7",X"28",X"18",X"DD",X"4E",X"12",X"0C",X"28",X"12",X"FE",X"04",X"38",X"02",X"3E",X"03",X"47", + X"C6",X"06",X"4F",X"11",X"0F",X"03",X"83",X"5F",X"FF",X"06",X"38",X"DD",X"70",X"11",X"79",X"DD", + X"CB",X"07",X"4E",X"28",X"0B",X"0C",X"3A",X"45",X"8D",X"A7",X"79",X"28",X"03",X"3E",X"03",X"81", + X"21",X"D3",X"3D",X"CD",X"45",X"0C",X"CD",X"1E",X"38",X"DD",X"34",X"02",X"CD",X"06",X"40",X"DD", + X"35",X"11",X"C0",X"DD",X"7E",X"16",X"FE",X"07",X"CA",X"99",X"3D",X"4F",X"A7",X"28",X"01",X"3D", + X"11",X"12",X"03",X"83",X"5F",X"FF",X"21",X"49",X"3E",X"79",X"FE",X"04",X"20",X"0A",X"CD",X"45", + X"0C",X"CD",X"1E",X"38",X"DD",X"36",X"11",X"30",X"0C",X"DD",X"71",X"13",X"DD",X"34",X"02",X"CD", + X"06",X"40",X"DD",X"35",X"11",X"C0",X"C3",X"53",X"35",X"21",X"76",X"40",X"DD",X"7E",X"07",X"E6", + X"03",X"3D",X"CD",X"45",X"0C",X"CD",X"1E",X"38",X"DD",X"36",X"09",X"40",X"DD",X"36",X"02",X"0F", + X"C3",X"D6",X"0E",X"BB",X"3D",X"C1",X"3D",X"C7",X"3D",X"CD",X"3D",X"42",X"30",X"F0",X"FF",X"BB", + X"3D",X"41",X"30",X"F0",X"FF",X"C1",X"3D",X"49",X"30",X"F0",X"FF",X"C7",X"3D",X"40",X"30",X"F0", + X"FF",X"CD",X"3D",X"EF",X"3D",X"EF",X"3D",X"EF",X"3D",X"FB",X"3D",X"07",X"3E",X"7A",X"40",X"8F", + X"40",X"13",X"3E",X"1C",X"3E",X"25",X"3E",X"25",X"3E",X"2E",X"3E",X"37",X"3E",X"40",X"3E",X"44", + X"34",X"05",X"44",X"33",X"06",X"44",X"32",X"07",X"44",X"31",X"12",X"40",X"34",X"05",X"40",X"33", + X"06",X"40",X"32",X"07",X"40",X"31",X"12",X"40",X"34",X"05",X"40",X"33",X"06",X"40",X"32",X"07", + X"40",X"31",X"12",X"80",X"01",X"05",X"40",X"1D",X"05",X"43",X"39",X"28",X"80",X"01",X"04",X"40", + X"1D",X"04",X"42",X"39",X"28",X"80",X"01",X"03",X"40",X"1D",X"03",X"4F",X"3A",X"38",X"84",X"01", + X"05",X"44",X"1D",X"05",X"43",X"39",X"28",X"84",X"01",X"04",X"44",X"1D",X"04",X"42",X"39",X"28", + X"84",X"01",X"03",X"44",X"1D",X"03",X"4F",X"3A",X"38",X"5D",X"3E",X"5D",X"3E",X"5D",X"3E",X"5D", + X"3E",X"5D",X"3E",X"63",X"3E",X"66",X"3E",X"66",X"3E",X"66",X"3E",X"66",X"3E",X"42",X"37",X"40", + X"43",X"39",X"40",X"42",X"39",X"40",X"4F",X"3B",X"48",X"DD",X"35",X"11",X"C0",X"DD",X"6E",X"14", + X"DD",X"66",X"15",X"2C",X"2C",X"7E",X"FE",X"05",X"DA",X"53",X"35",X"FE",X"07",X"D2",X"53",X"35", + X"2C",X"7E",X"DD",X"77",X"03",X"2C",X"7E",X"3D",X"DD",X"77",X"04",X"2C",X"7E",X"DD",X"77",X"05", + X"2C",X"7E",X"DD",X"77",X"06",X"DD",X"36",X"15",X"00",X"DD",X"34",X"02",X"CD",X"06",X"40",X"DD", + X"CB",X"01",X"46",X"C2",X"1D",X"3F",X"DD",X"6E",X"12",X"DD",X"66",X"13",X"DD",X"7E",X"05",X"85", + X"DD",X"77",X"05",X"30",X"03",X"DD",X"34",X"06",X"DD",X"CB",X"08",X"46",X"28",X"43",X"7C",X"D6", + X"02",X"38",X"35",X"67",X"DD",X"7E",X"03",X"94",X"DD",X"77",X"03",X"30",X"03",X"DD",X"35",X"04", + X"DD",X"74",X"13",X"DD",X"7E",X"06",X"E6",X"1F",X"FE",X"1A",X"D8",X"DD",X"7E",X"05",X"FE",X"A0", + X"D0",X"11",X"B4",X"40",X"CD",X"1E",X"38",X"DD",X"36",X"11",X"0A",X"DD",X"36",X"02",X"02",X"DD", + X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"C9",X"DD",X"CB",X"08",X"86",X"AF",X"DD",X"77",X"13", + X"C9",X"DD",X"34",X"16",X"DD",X"7E",X"16",X"E6",X"03",X"C8",X"7C",X"C6",X"01",X"DD",X"77",X"13", + X"DD",X"86",X"03",X"DD",X"77",X"03",X"30",X"03",X"DD",X"34",X"04",X"18",X"B6",X"DD",X"6E",X"12", + X"DD",X"66",X"13",X"7E",X"4F",X"FE",X"EE",X"20",X"01",X"23",X"46",X"DD",X"7E",X"05",X"90",X"DD", + X"77",X"05",X"30",X"03",X"DD",X"35",X"06",X"23",X"7E",X"DD",X"86",X"03",X"DD",X"77",X"03",X"30", + X"03",X"DD",X"34",X"04",X"23",X"79",X"FE",X"EE",X"20",X"03",X"2B",X"2B",X"2B",X"DD",X"75",X"12", + X"DD",X"74",X"13",X"DD",X"7E",X"04",X"FE",X"1E",X"D8",X"C3",X"E1",X"3E",X"21",X"72",X"40",X"DD", + X"7E",X"07",X"E6",X"03",X"3D",X"CD",X"45",X"0C",X"CD",X"1E",X"38",X"DD",X"36",X"09",X"40",X"DD", + X"34",X"02",X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"DD",X"34",X"02",X"CD",X"06",X"40",X"CD", + X"D5",X"3F",X"D8",X"21",X"A4",X"40",X"DD",X"7E",X"07",X"E6",X"03",X"3D",X"CD",X"45",X"0C",X"CD", + X"1E",X"38",X"DD",X"36",X"02",X"02",X"DD",X"36",X"11",X"20",X"CD",X"DA",X"0E",X"21",X"40",X"8D", + X"35",X"21",X"01",X"89",X"DD",X"CB",X"0B",X"46",X"20",X"07",X"7E",X"A7",X"C8",X"35",X"C3",X"C9", + X"34",X"36",X"00",X"3E",X"01",X"CD",X"C9",X"34",X"01",X"8B",X"42",X"2E",X"00",X"65",X"0A",X"FE", + X"C8",X"28",X"08",X"84",X"30",X"01",X"2C",X"67",X"0B",X"18",X"F3",X"95",X"FE",X"C0",X"C8",X"3E", + X"01",X"32",X"EB",X"89",X"C9",X"DD",X"7E",X"03",X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"04", + X"DD",X"77",X"03",X"DD",X"7E",X"04",X"FE",X"1E",X"C9",X"11",X"80",X"77",X"01",X"10",X"00",X"1A", + X"1B",X"80",X"47",X"0D",X"20",X"F9",X"CB",X"40",X"20",X"07",X"CB",X"68",X"28",X"03",X"CB",X"78", + X"C0",X"21",X"39",X"8A",X"34",X"C9",X"DD",X"7E",X"0E",X"A7",X"28",X"04",X"DD",X"35",X"0E",X"C9", + X"DD",X"6E",X"0C",X"DD",X"66",X"0D",X"7E",X"FE",X"FF",X"28",X"15",X"DD",X"77",X"10",X"23",X"7E", + X"DD",X"77",X"0F",X"23",X"7E",X"DD",X"77",X"0E",X"23",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"C9", + X"23",X"7E",X"DD",X"77",X"0C",X"23",X"7E",X"DD",X"77",X"0D",X"18",X"D4",X"FD",X"7E",X"0E",X"A7", + X"28",X"04",X"FD",X"35",X"0E",X"C9",X"FD",X"6E",X"0C",X"FD",X"66",X"0D",X"7E",X"FE",X"FF",X"28", + X"15",X"FD",X"77",X"10",X"23",X"7E",X"FD",X"77",X"0F",X"23",X"7E",X"FD",X"77",X"0E",X"23",X"FD", + X"75",X"0C",X"FD",X"74",X"0D",X"C9",X"23",X"7E",X"FD",X"77",X"0C",X"23",X"7E",X"FD",X"77",X"0D", + X"18",X"D4",X"7A",X"40",X"8F",X"40",X"86",X"40",X"9B",X"40",X"80",X"01",X"08",X"40",X"1D",X"08", + X"80",X"01",X"08",X"40",X"1D",X"08",X"40",X"01",X"08",X"80",X"1D",X"08",X"FF",X"86",X"40",X"84", + X"01",X"08",X"44",X"1D",X"08",X"84",X"01",X"08",X"44",X"1D",X"08",X"44",X"01",X"08",X"84",X"1D", + X"08",X"FF",X"9B",X"40",X"A8",X"40",X"AE",X"40",X"40",X"19",X"28",X"40",X"19",X"38",X"44",X"19", + X"28",X"44",X"19",X"30",X"45",X"34",X"05",X"45",X"33",X"05",X"FF",X"B4",X"40",X"DD",X"21",X"30", + X"8C",X"11",X"18",X"00",X"06",X"04",X"D9",X"CD",X"D0",X"40",X"D9",X"DD",X"19",X"10",X"F7",X"C9", + X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"E6",X"1F",X"FE",X"11",X"D0", + X"EF",X"03",X"41",X"37",X"41",X"6F",X"41",X"79",X"41",X"79",X"41",X"79",X"41",X"79",X"41",X"79", + X"41",X"7A",X"41",X"8D",X"41",X"79",X"41",X"21",X"42",X"50",X"43",X"64",X"43",X"78",X"43",X"78", + X"43",X"78",X"43",X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"DD",X"34",X"02",X"DD",X"36",X"13", + X"00",X"3A",X"5F",X"8A",X"A7",X"C0",X"21",X"7F",X"55",X"06",X"38",X"AF",X"57",X"5A",X"7E",X"E6", + X"0F",X"83",X"5F",X"30",X"01",X"14",X"23",X"10",X"F5",X"3E",X"67",X"BB",X"20",X"04",X"3E",X"01", + X"92",X"C8",X"21",X"38",X"8A",X"34",X"C9",X"CD",X"06",X"40",X"DD",X"7E",X"0A",X"ED",X"44",X"47", + X"DD",X"7E",X"03",X"B8",X"30",X"03",X"DD",X"35",X"04",X"DD",X"86",X"0A",X"DD",X"77",X"03",X"47", + X"DD",X"7E",X"04",X"FE",X"03",X"D0",X"DD",X"7E",X"17",X"3C",X"32",X"1D",X"8D",X"3D",X"DD",X"36", + X"02",X"02",X"DD",X"36",X"11",X"18",X"21",X"B1",X"41",X"CD",X"45",X"0C",X"C3",X"1E",X"38",X"CD", + X"06",X"40",X"DD",X"35",X"11",X"C0",X"C3",X"53",X"35",X"C9",X"DD",X"7E",X"17",X"21",X"B1",X"41", + X"CD",X"45",X"0C",X"CD",X"1E",X"38",X"DD",X"36",X"11",X"30",X"DD",X"34",X"02",X"CD",X"06",X"40", + X"DD",X"35",X"11",X"C0",X"DD",X"7E",X"16",X"4F",X"A7",X"28",X"01",X"3D",X"11",X"12",X"03",X"83", + X"5F",X"FF",X"DD",X"36",X"11",X"01",X"0C",X"DD",X"71",X"13",X"DD",X"36",X"02",X"02",X"C3",X"6F", + X"41",X"BB",X"41",X"CA",X"41",X"D9",X"41",X"E8",X"41",X"F7",X"41",X"44",X"34",X"05",X"44",X"33", + X"06",X"44",X"32",X"07",X"44",X"31",X"08",X"43",X"37",X"38",X"41",X"34",X"05",X"41",X"33",X"06", + X"41",X"32",X"07",X"41",X"31",X"08",X"43",X"37",X"38",X"49",X"34",X"05",X"49",X"33",X"06",X"49", + X"32",X"07",X"49",X"31",X"08",X"43",X"37",X"38",X"40",X"34",X"05",X"40",X"33",X"06",X"40",X"32", + X"07",X"40",X"31",X"08",X"48",X"37",X"38",X"47",X"34",X"05",X"47",X"33",X"06",X"47",X"32",X"07", + X"47",X"31",X"12",X"44",X"26",X"09",X"44",X"27",X"09",X"44",X"28",X"09",X"44",X"27",X"09",X"FF", + X"03",X"42",X"C4",X"26",X"09",X"C4",X"27",X"09",X"C4",X"28",X"09",X"C4",X"27",X"09",X"FF",X"12", + X"42",X"CD",X"06",X"40",X"DD",X"CB",X"08",X"46",X"20",X"1A",X"CD",X"3E",X"34",X"DD",X"7E",X"06", + X"E6",X"1F",X"FE",X"14",X"38",X"5A",X"DD",X"36",X"08",X"01",X"11",X"12",X"42",X"AF",X"32",X"4B", + X"8D",X"C3",X"1E",X"38",X"CD",X"F2",X"34",X"DD",X"7E",X"06",X"E6",X"1F",X"FE",X"0A",X"30",X"40", + X"47",X"3A",X"01",X"89",X"FE",X"02",X"38",X"0E",X"DD",X"36",X"08",X"00",X"11",X"03",X"42",X"3E", + X"FF",X"32",X"4B",X"8D",X"18",X"DB",X"78",X"FE",X"02",X"D0",X"CD",X"53",X"35",X"11",X"B9",X"0B", + X"21",X"83",X"42",X"1A",X"86",X"20",X"07",X"1B",X"23",X"7E",X"3C",X"C8",X"18",X"F5",X"21",X"3A", + X"8A",X"34",X"C9",X"E0",X"59",X"78",X"FA",X"C6",X"7A",X"B5",X"7A",X"B2",X"7A",X"AD",X"7A",X"FF", + X"FE",X"05",X"D8",X"21",X"5B",X"8D",X"7E",X"A7",X"20",X"2F",X"2B",X"7E",X"A7",X"28",X"02",X"35", + X"C9",X"3A",X"01",X"89",X"FE",X"08",X"11",X"18",X"00",X"38",X"15",X"FD",X"21",X"E0",X"8A",X"3A", + X"5C",X"8D",X"47",X"4F",X"FD",X"7E",X"04",X"FE",X"07",X"28",X"05",X"FD",X"19",X"10",X"F5",X"C9", + X"3A",X"5D",X"8D",X"32",X"5A",X"8D",X"32",X"5B",X"8D",X"FD",X"21",X"48",X"8C",X"06",X"03",X"CD", + X"DA",X"42",X"11",X"18",X"00",X"FD",X"19",X"10",X"F6",X"C9",X"FD",X"7E",X"00",X"FD",X"B6",X"01", + X"0F",X"D8",X"FD",X"36",X"00",X"01",X"FD",X"36",X"02",X"0D",X"DD",X"E5",X"E1",X"FD",X"E5",X"D1", + X"2C",X"2C",X"2C",X"1C",X"1C",X"1C",X"01",X"04",X"00",X"ED",X"B0",X"3E",X"2A",X"FD",X"77",X"09", + X"ED",X"44",X"FD",X"77",X"0A",X"21",X"2D",X"43",X"3A",X"07",X"89",X"CB",X"3F",X"3D",X"E6",X"03", + X"CD",X"45",X"0C",X"CD",X"75",X"5C",X"AF",X"32",X"5B",X"8D",X"11",X"47",X"43",X"CD",X"1E",X"38", + X"DD",X"36",X"11",X"30",X"FD",X"36",X"11",X"04",X"DD",X"34",X"02",X"F1",X"C9",X"35",X"43",X"41", + X"43",X"3B",X"43",X"41",X"43",X"46",X"1C",X"F0",X"FF",X"35",X"43",X"46",X"1C",X"F0",X"FF",X"3B", + X"43",X"47",X"1C",X"F0",X"FF",X"41",X"43",X"44",X"2C",X"30",X"44",X"20",X"F0",X"FF",X"4A",X"43", + X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"DD",X"35",X"02",X"DD",X"CB",X"08",X"46",X"CA",X"5C", + X"42",X"C3",X"3A",X"42",X"DD",X"7E",X"11",X"A7",X"28",X"04",X"DD",X"35",X"11",X"C9",X"CD",X"06", + X"40",X"CD",X"D5",X"3F",X"D8",X"C3",X"53",X"35",X"C9",X"10",X"11",X"12",X"13",X"14",X"15",X"16", + X"17",X"06",X"1D",X"3A",X"20",X"89",X"2A",X"43",X"8F",X"ED",X"5B",X"45",X"8F",X"A7",X"28",X"07", + X"2A",X"B8",X"88",X"ED",X"5B",X"BA",X"88",X"1A",X"FE",X"10",X"28",X"22",X"FE",X"FF",X"28",X"2E", + X"77",X"13",X"23",X"10",X"F2",X"23",X"23",X"23",X"3A",X"20",X"89",X"A7",X"20",X"08",X"22",X"43", + X"8F",X"ED",X"53",X"45",X"8F",X"C9",X"22",X"B8",X"88",X"ED",X"53",X"BA",X"88",X"C9",X"13",X"1A", + X"4F",X"85",X"30",X"01",X"24",X"6F",X"13",X"78",X"91",X"47",X"20",X"CB",X"18",X"D7",X"13",X"1A", + X"6F",X"13",X"1A",X"67",X"13",X"1A",X"4F",X"3A",X"B7",X"88",X"81",X"32",X"B7",X"88",X"13",X"18", + X"C7",X"10",X"10",X"63",X"31",X"4F",X"4F",X"3C",X"75",X"10",X"07",X"10",X"0F",X"46",X"C6",X"30", + X"3D",X"81",X"3C",X"75",X"10",X"07",X"10",X"10",X"2E",X"32",X"42",X"BD",X"3C",X"75",X"10",X"07", + X"10",X"0F",X"46",X"2E",X"32",X"3D",X"81",X"3C",X"75",X"10",X"07",X"10",X"10",X"33",X"30",X"42", + X"BD",X"3C",X"75",X"10",X"07",X"10",X"11",X"6D",X"58",X"58",X"3C",X"75",X"10",X"07",X"10",X"13", + X"71",X"3C",X"75",X"10",X"07",X"10",X"13",X"71",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75", + X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14", + X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07", + X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75", + X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"13", + X"71",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10", + X"07",X"10",X"13",X"71",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14", + X"3C",X"75",X"10",X"07",X"10",X"13",X"71",X"3C",X"75",X"10",X"07",X"10",X"13",X"71",X"3C",X"75", + X"10",X"07",X"10",X"13",X"71",X"3C",X"75",X"10",X"07",X"10",X"07",X"57",X"67",X"4C",X"55",X"67", + X"72",X"55",X"67",X"4C",X"4C",X"31",X"4F",X"4F",X"3C",X"75",X"10",X"07",X"10",X"06",X"71",X"57", + X"6B",X"73",X"68",X"6B",X"73",X"68",X"6B",X"73",X"C6",X"30",X"3D",X"81",X"3C",X"75",X"10",X"07", + X"10",X"07",X"57",X"6A",X"39",X"67",X"6A",X"39",X"67",X"6A",X"39",X"2E",X"32",X"42",X"BD",X"3C", + X"75",X"10",X"07",X"10",X"07",X"66",X"69",X"3A",X"66",X"69",X"3A",X"66",X"69",X"3A",X"2E",X"32", + X"3D",X"81",X"3C",X"75",X"10",X"07",X"10",X"10",X"33",X"30",X"42",X"BD",X"3C",X"75",X"10",X"07", + X"10",X"11",X"6D",X"58",X"58",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10", + X"13",X"71",X"3C",X"75",X"10",X"07",X"10",X"01",X"A5",X"A4",X"10",X"11",X"3C",X"75",X"10",X"07", + X"10",X"01",X"A4",X"A5",X"10",X"11",X"3C",X"75",X"10",X"07",X"10",X"01",X"0C",X"3B",X"10",X"10", + X"71",X"3C",X"75",X"10",X"07",X"10",X"01",X"0C",X"3B",X"10",X"11",X"3C",X"75",X"10",X"07",X"10", + X"01",X"0E",X"0F",X"10",X"11",X"3C",X"75",X"10",X"07",X"10",X"01",X"0E",X"0F",X"10",X"04",X"87", + X"87",X"10",X"0B",X"3C",X"75",X"10",X"07",X"10",X"01",X"0C",X"0C",X"10",X"04",X"9B",X"9D",X"88", + X"10",X"0A",X"3C",X"75",X"10",X"07",X"10",X"01",X"0C",X"0C",X"10",X"04",X"9C",X"82",X"88",X"10", + X"0A",X"3C",X"75",X"10",X"07",X"10",X"01",X"0C",X"0C",X"10",X"04",X"79",X"79",X"88",X"10",X"0A", + X"3C",X"75",X"10",X"07",X"10",X"01",X"0C",X"0C",X"10",X"04",X"9C",X"82",X"87",X"10",X"0A",X"3C", + X"75",X"10",X"07",X"10",X"01",X"0C",X"0C",X"10",X"04",X"85",X"76",X"87",X"10",X"0A",X"3C",X"75", + X"10",X"07",X"10",X"01",X"0C",X"0D",X"10",X"04",X"9C",X"79",X"87",X"10",X"0A",X"3C",X"75",X"10", + X"07",X"10",X"07",X"9C",X"76",X"9B",X"10",X"0A",X"3C",X"75",X"10",X"07",X"10",X"07",X"85",X"76", + X"9B",X"10",X"0A",X"3C",X"75",X"10",X"07",X"10",X"07",X"85",X"76",X"9D",X"88",X"10",X"09",X"3C", + X"75",X"10",X"07",X"10",X"07",X"7E",X"7B",X"8F",X"8C",X"10",X"08",X"8B",X"3C",X"75",X"10",X"07", + X"10",X"07",X"7F",X"7B",X"7C",X"76",X"87",X"10",X"02",X"89",X"86",X"10",X"02",X"86",X"8A",X"3C", + X"75",X"10",X"07",X"10",X"07",X"85",X"7E",X"7B",X"7C",X"76",X"91",X"83",X"84",X"9E",X"92",X"96", + X"9E",X"38",X"3C",X"75",X"10",X"07",X"10",X"07",X"9C",X"8E",X"7A",X"78",X"76",X"93",X"9F",X"94", + X"97",X"94",X"99",X"97",X"97",X"3C",X"75",X"10",X"07",X"10",X"07",X"7E",X"7A",X"7A",X"8E",X"76", + X"93",X"64",X"98",X"98",X"95",X"95",X"98",X"95",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75", + X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14", + X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07", + X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"13",X"71",X"3C", + X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10", + X"14",X"3C",X"75",X"10",X"07",X"10",X"13",X"71",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75", + X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14", + X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07", + X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75", + X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14", + X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"14",X"3C",X"75",X"10",X"07", + X"10",X"14",X"3C",X"75",X"10",X"07",X"10",X"03",X"E6",X"E7",X"57",X"72",X"67",X"72",X"4C",X"55", + X"55",X"67",X"72",X"4C",X"55",X"67",X"72",X"4C",X"55",X"67",X"72",X"4C",X"63",X"31",X"4F",X"4F", + X"3C",X"75",X"10",X"03",X"E4",X"E5",X"57",X"72",X"6B",X"73",X"73",X"68",X"68",X"6B",X"73",X"73", + X"68",X"6B",X"73",X"73",X"68",X"6B",X"73",X"73",X"2E",X"30",X"3D",X"81",X"3C",X"75",X"10",X"03", + X"E6",X"E7",X"57",X"67",X"6A",X"39",X"39",X"67",X"67",X"6A",X"39",X"39",X"67",X"6A",X"39",X"39", + X"67",X"6A",X"39",X"39",X"2E",X"32",X"42",X"BD",X"3C",X"75",X"10",X"03",X"A8",X"A9",X"A2",X"A1", + X"69",X"3A",X"3A",X"66",X"65",X"69",X"3A",X"3A",X"66",X"69",X"3A",X"3A",X"66",X"69",X"3A",X"3A", + X"2E",X"32",X"3D",X"81",X"3C",X"75",X"10",X"03",X"AA",X"AB",X"10",X"12",X"33",X"30",X"42",X"BD", + X"3C",X"75",X"10",X"03",X"AF",X"37",X"37",X"37",X"34",X"10",X"10",X"6D",X"58",X"58",X"3C",X"75", + X"10",X"03",X"87",X"87",X"10",X"16",X"3C",X"75",X"10",X"03",X"9B",X"9D",X"88",X"10",X"15",X"3C", + X"75",X"10",X"03",X"9C",X"82",X"88",X"10",X"15",X"3C",X"75",X"10",X"03",X"79",X"79",X"88",X"10", + X"15",X"3C",X"75",X"10",X"03",X"9C",X"82",X"87",X"10",X"14",X"71",X"3C",X"75",X"10",X"03",X"85", + X"76",X"87",X"10",X"15",X"3C",X"75",X"10",X"03",X"9C",X"76",X"87",X"10",X"15",X"3C",X"75",X"10", + X"03",X"9C",X"79",X"9B",X"10",X"15",X"3C",X"75",X"10",X"03",X"79",X"76",X"87",X"10",X"14",X"71", + X"3C",X"75",X"10",X"03",X"80",X"8D",X"10",X"16",X"3C",X"75",X"10",X"03",X"80",X"76",X"87",X"10", + X"15",X"3C",X"75",X"10",X"03",X"85",X"76",X"9B",X"10",X"15",X"3C",X"75",X"10",X"03",X"85",X"82", + X"9B",X"10",X"15",X"3C",X"75",X"10",X"03",X"9C",X"79",X"9B",X"10",X"15",X"3C",X"75",X"10",X"03", + X"9C",X"79",X"9D",X"88",X"10",X"14",X"3C",X"75",X"10",X"03",X"85",X"76",X"76",X"87",X"10",X"14", + X"3C",X"75",X"10",X"03",X"7E",X"7B",X"90",X"8F",X"8C",X"10",X"13",X"3C",X"75",X"10",X"03",X"7F", + X"7B",X"7C",X"76",X"76",X"87",X"10",X"11",X"8B",X"3C",X"75",X"10",X"03",X"85",X"79",X"76",X"76", + X"79",X"9D",X"88",X"10",X"05",X"89",X"86",X"10",X"08",X"86",X"8A",X"3C",X"75",X"10",X"03",X"85", + X"7E",X"90",X"7B",X"7C",X"76",X"91",X"83",X"92",X"9A",X"92",X"96",X"84",X"9E",X"92",X"96",X"96", + X"92",X"9A",X"92",X"96",X"96",X"9E",X"38",X"3C",X"75",X"10",X"03",X"9C",X"8E",X"7A",X"78",X"78", + X"7E",X"93",X"9F",X"99",X"94",X"94",X"97",X"94",X"97",X"94",X"99",X"97",X"94",X"97",X"94",X"94", + X"94",X"97",X"97",X"3C",X"75",X"10",X"02",X"88",X"7E",X"7A",X"78",X"7A",X"7A",X"8E",X"93",X"64", + X"95",X"95",X"95",X"95",X"98",X"98",X"95",X"98",X"95",X"95",X"98",X"95",X"98",X"98",X"98",X"95", + X"3C",X"75",X"10",X"03",X"E6",X"E7",X"57",X"72",X"67",X"72",X"4C",X"55",X"55",X"67",X"72",X"4C", + X"55",X"67",X"72",X"4C",X"55",X"67",X"72",X"4C",X"4C",X"55",X"5F",X"62",X"3C",X"75",X"10",X"03", + X"E4",X"E5",X"57",X"72",X"6B",X"73",X"73",X"68",X"68",X"6B",X"73",X"73",X"68",X"6B",X"73",X"73", + X"68",X"6B",X"73",X"73",X"68",X"68",X"5D",X"5D",X"3C",X"75",X"10",X"03",X"E6",X"E7",X"57",X"67", + X"6A",X"39",X"39",X"67",X"67",X"6A",X"39",X"39",X"67",X"6A",X"39",X"39",X"67",X"6A",X"39",X"39", + X"67",X"67",X"41",X"65",X"3C",X"75",X"10",X"03",X"A8",X"A9",X"A2",X"A1",X"69",X"3A",X"3A",X"66", + X"65",X"69",X"3A",X"3A",X"66",X"69",X"3A",X"3A",X"66",X"69",X"3A",X"3A",X"66",X"65",X"69",X"69", + X"3C",X"75",X"10",X"03",X"AA",X"AB",X"10",X"16",X"3C",X"75",X"10",X"03",X"AF",X"37",X"37",X"37", + X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"35",X"10",X"06", + X"3C",X"75",X"10",X"03",X"C4",X"C2",X"10",X"16",X"3C",X"75",X"10",X"03",X"57",X"61",X"10",X"16", + X"3C",X"75",X"10",X"03",X"57",X"60",X"10",X"16",X"3C",X"75",X"10",X"03",X"57",X"60",X"10",X"16", + X"3C",X"75",X"10",X"03",X"57",X"41",X"C2",X"10",X"14",X"2F",X"3C",X"75",X"10",X"03",X"57",X"5E", + X"61",X"10",X"14",X"2F",X"3C",X"75",X"10",X"03",X"57",X"5E",X"62",X"10",X"15",X"3C",X"75",X"10", + X"03",X"57",X"5D",X"62",X"10",X"15",X"3C",X"75",X"10",X"03",X"57",X"5F",X"62",X"10",X"14",X"2F", + X"3C",X"75",X"10",X"03",X"57",X"5D",X"61",X"10",X"14",X"2F",X"3C",X"75",X"10",X"03",X"57",X"5E", + X"60",X"10",X"15",X"3C",X"75",X"10",X"03",X"57",X"5F",X"60",X"10",X"15",X"3C",X"75",X"10",X"03", + X"57",X"5F",X"61",X"10",X"14",X"2F",X"3C",X"75",X"10",X"03",X"57",X"5E",X"61",X"10",X"14",X"2F", + X"3C",X"75",X"10",X"03",X"57",X"5D",X"60",X"10",X"15",X"3C",X"75",X"10",X"03",X"57",X"41",X"41", + X"5A",X"10",X"14",X"3C",X"75",X"10",X"03",X"57",X"5B",X"41",X"61",X"10",X"14",X"3C",X"75",X"10", + X"03",X"57",X"5B",X"5B",X"41",X"10",X"14",X"3C",X"75",X"10",X"03",X"57",X"41",X"4B",X"4A",X"59", + X"10",X"10",X"A3",X"A3",X"A3",X"3C",X"75",X"10",X"03",X"57",X"41",X"4B",X"4A",X"41",X"50",X"52", + X"10",X"02",X"50",X"50",X"50",X"4E",X"4E",X"50",X"50",X"50",X"10",X"02",X"52",X"50",X"6C",X"D0", + X"D1",X"3C",X"75",X"10",X"03",X"57",X"41",X"56",X"56",X"41",X"59",X"56",X"49",X"48",X"4A",X"4B", + X"4C",X"4D",X"4D",X"4C",X"4B",X"4A",X"49",X"48",X"56",X"59",X"6E",X"D2",X"D3",X"3C",X"75",X"10", + X"03",X"57",X"67",X"67",X"41",X"56",X"67",X"67",X"41",X"49",X"44",X"44",X"45",X"56",X"56",X"45", + X"44",X"44",X"49",X"41",X"67",X"67",X"70",X"D0",X"D1",X"3C",X"75",X"3A",X"07",X"89",X"CB",X"47", + X"C8",X"3A",X"02",X"89",X"32",X"43",X"8D",X"32",X"34",X"89",X"A7",X"20",X"0F",X"21",X"E3",X"86", + X"22",X"32",X"89",X"2E",X"82",X"11",X"54",X"27",X"CD",X"07",X"33",X"C9",X"47",X"21",X"A3",X"86", + X"22",X"32",X"89",X"2E",X"C3",X"11",X"DF",X"FF",X"36",X"DA",X"23",X"36",X"DB",X"19",X"36",X"D8", + X"23",X"36",X"D9",X"19",X"10",X"F2",X"1E",X"BF",X"19",X"11",X"54",X"27",X"CD",X"07",X"33",X"C9", + X"10",X"1D",X"10",X"08",X"40",X"10",X"04",X"40",X"10",X"03",X"40",X"10",X"03",X"40",X"00",X"80", + X"10",X"05",X"10",X"1D",X"10",X"17",X"80",X"80",X"10",X"04",X"10",X"18",X"80",X"10",X"04",X"10", + X"1D",X"10",X"03",X"40",X"10",X"19",X"10",X"03",X"40",X"10",X"19",X"10",X"1D",X"10",X"04",X"80", + X"80",X"10",X"17",X"10",X"1A",X"07",X"10",X"02",X"10",X"05",X"80",X"10",X"17",X"10",X"1D",X"10", + X"1D",X"10",X"05",X"80",X"10",X"14",X"0E",X"10",X"02",X"10",X"1D",X"10",X"03",X"80",X"10",X"19", + X"FF",X"C2",X"82",X"02",X"10",X"04",X"40",X"10",X"18",X"10",X"1D",X"10",X"1D",X"10",X"04",X"80", + X"10",X"18",X"10",X"04",X"80",X"10",X"02",X"80",X"10",X"11",X"40",X"10",X"03",X"10",X"07",X"80", + X"10",X"0B",X"40",X"10",X"05",X"40",X"00",X"10",X"02",X"10",X"08",X"40",X"10",X"04",X"40",X"02", + X"40",X"10",X"06",X"40",X"10",X"06",X"10",X"02",X"C0",X"10",X"04",X"80",X"40",X"80",X"00",X"00", + X"00",X"40",X"10",X"02",X"40",X"10",X"02",X"40",X"10",X"02",X"40",X"10",X"03",X"40",X"10",X"02", + X"FF",X"A2",X"80",X"02",X"10",X"10",X"80",X"80",X"10",X"0B",X"10",X"11",X"80",X"10",X"0B",X"10", + X"1D",X"10",X"13",X"07",X"10",X"09",X"10",X"13",X"07",X"10",X"09",X"FF",X"A2",X"82",X"0A",X"10", + X"13",X"0E",X"10",X"09",X"10",X"1D",X"10",X"1D",X"10",X"13",X"0E",X"10",X"09",X"10",X"1D",X"10", + X"1D",X"10",X"13",X"07",X"10",X"09",X"10",X"13",X"07",X"10",X"09",X"10",X"13",X"0E",X"10",X"09", + X"FF",X"A2",X"80",X"02",X"10",X"10",X"80",X"80",X"10",X"0B",X"10",X"11",X"80",X"10",X"0B",X"FF", + X"42",X"81",X"02",X"10",X"13",X"07",X"10",X"09",X"FF",X"C2",X"81",X"02",X"10",X"13",X"0E",X"10", + X"09",X"FF",X"C2",X"83",X"0E",X"10",X"1D",X"10",X"06",X"07",X"10",X"05",X"40",X"10",X"10",X"10", + X"1D",X"10",X"10",X"80",X"80",X"10",X"0B",X"10",X"11",X"80",X"10",X"0B",X"10",X"1D",X"10",X"1D", + X"10",X"13",X"0E",X"10",X"09",X"10",X"01",X"C0",X"C0",X"10",X"1A",X"10",X"01",X"00",X"00",X"10", + X"1A",X"10",X"01",X"85",X"82",X"10",X"10",X"0E",X"10",X"09",X"10",X"01",X"05",X"02",X"10",X"1A", + X"10",X"01",X"80",X"80",X"10",X"1A",X"10",X"01",X"00",X"00",X"10",X"04",X"40",X"10",X"15",X"10", + X"01",X"8D",X"CD",X"10",X"04",X"40",X"10",X"15",X"10",X"01",X"0D",X"4D",X"10",X"1A",X"10",X"01", + X"83",X"C3",X"10",X"05",X"80",X"80",X"10",X"13",X"10",X"01",X"03",X"43",X"10",X"1A",X"10",X"01", + X"80",X"C0",X"10",X"06",X"80",X"10",X"13",X"10",X"01",X"00",X"00",X"10",X"05",X"80",X"10",X"14", + X"FF",X"42",X"83",X"03",X"10",X"08",X"80",X"10",X"09",X"40",X"10",X"0A",X"10",X"0A",X"80",X"10", + X"07",X"40",X"00",X"10",X"09",X"10",X"1D",X"10",X"09",X"80",X"40",X"00",X"82",X"00",X"40",X"00", + X"40",X"00",X"00",X"40",X"10",X"09",X"10",X"1D",X"10",X"08",X"40",X"10",X"04",X"40",X"10",X"03", + X"40",X"10",X"03",X"04",X"10",X"07",X"10",X"1D",X"10",X"05",X"10",X"18",X"10",X"1D",X"10",X"1D", + X"10",X"03",X"80",X"40",X"10",X"18",X"FF",X"82",X"81",X"02",X"10",X"05",X"40",X"10",X"14",X"8A", + X"10",X"02",X"10",X"04",X"10",X"16",X"0A",X"10",X"02",X"10",X"1D",X"10",X"05",X"10",X"18",X"10", + X"04",X"40",X"10",X"15",X"85",X"10",X"02",X"10",X"1A",X"05",X"10",X"02",X"10",X"04",X"80",X"10", + X"18",X"10",X"04",X"80",X"80",X"10",X"17",X"10",X"05",X"80",X"10",X"14",X"86",X"10",X"02",X"10", + X"1A",X"06",X"10",X"02",X"10",X"1D",X"10",X"1D",X"10",X"04",X"80",X"80",X"10",X"17",X"10",X"06", + X"80",X"10",X"16",X"10",X"05",X"80",X"80",X"10",X"16",X"10",X"08",X"40",X"40",X"10",X"02",X"40", + X"40",X"40",X"40",X"10",X"0D",X"10",X"06",X"40",X"00",X"40",X"40",X"10",X"02",X"40",X"40",X"40", + X"40",X"10",X"0D",X"10",X"04",X"40",X"10",X"03",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"10",X"0D",X"10",X"03",X"E6",X"E7",X"8E",X"7A",X"7E",X"93",X"64",X"95",X"95",X"98",X"95",X"95", + X"98",X"98",X"95",X"98",X"95",X"95",X"98",X"95",X"98",X"98",X"98",X"95",X"3C",X"75",X"10",X"03", + X"E4",X"E5",X"7E",X"7B",X"79",X"93",X"9F",X"99",X"99",X"94",X"94",X"97",X"94",X"97",X"94",X"99", + X"97",X"94",X"97",X"94",X"94",X"94",X"97",X"97",X"3C",X"75",X"10",X"03",X"E6",X"E7",X"9C",X"79", + X"79",X"91",X"83",X"92",X"92",X"9A",X"92",X"96",X"84",X"9E",X"92",X"96",X"96",X"92",X"9A",X"92", + X"96",X"96",X"9E",X"38",X"3C",X"75",X"10",X"03",X"A8",X"A9",X"9B",X"7E",X"88",X"10",X"07",X"89", + X"86",X"10",X"08",X"86",X"8A",X"3C",X"75",X"10",X"03",X"AA",X"AB",X"87",X"8C",X"10",X"13",X"8B", + X"3C",X"75",X"10",X"03",X"AF",X"37",X"37",X"37",X"34",X"10",X"13",X"3C",X"75",X"10",X"1B",X"3C", + X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C", + X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C", + X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C",X"75",X"10",X"1B",X"3C", + X"75",X"87",X"87",X"10",X"19",X"3C",X"75",X"9C",X"7E",X"87",X"10",X"18",X"3C",X"75",X"85",X"76", + X"76",X"87",X"10",X"17",X"3C",X"75",X"7E",X"7B",X"90",X"8F",X"8C",X"10",X"16",X"3C",X"75",X"7F", + X"7B",X"7C",X"76",X"76",X"87",X"10",X"14",X"8B",X"3C",X"75",X"85",X"79",X"76",X"76",X"79",X"76", + X"88",X"10",X"12",X"86",X"8A",X"3C",X"75",X"85",X"7E",X"90",X"7B",X"7C",X"76",X"91",X"83",X"39", + X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39", + X"9E",X"38",X"3C",X"75",X"85",X"8E",X"7A",X"78",X"78",X"7E",X"93",X"9F",X"3A",X"3A",X"3A",X"3A", + X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"3A",X"97",X"94",X"3C", + X"75",X"7E",X"7A",X"78",X"7A",X"7A",X"8E",X"93",X"64",X"95",X"98",X"95",X"95",X"98",X"98",X"95", + X"98",X"98",X"95",X"98",X"95",X"95",X"98",X"95",X"98",X"98",X"98",X"95",X"3C",X"75",X"10",X"05", + X"80",X"80",X"C0",X"00",X"00",X"80",X"80",X"C0",X"C0",X"80",X"80",X"C0",X"80",X"80",X"C0",X"80", + X"80",X"C0",X"80",X"80",X"80",X"C0",X"00",X"00",X"10",X"05",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"C0",X"82",X"C0",X"80",X"80",X"80",X"80",X"80",X"80",X"C0",X"80",X"80",X"80",X"80", + X"00",X"00",X"10",X"05",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"C0",X"80",X"80",X"80",X"80",X"80",X"C0",X"00",X"10",X"02",X"10",X"05",X"40",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"C0",X"80",X"00",X"00",X"10",X"05",X"C0",X"80",X"10",X"13",X"80",X"00",X"00",X"FF", + X"A2",X"82",X"0D",X"40",X"10",X"1C",X"10",X"01",X"80",X"10",X"1B",X"10",X"1D",X"10",X"1D",X"00", + X"80",X"10",X"1B",X"00",X"80",X"10",X"02",X"80",X"10",X"14",X"40",X"10",X"03",X"10",X"04",X"80", + X"10",X"14",X"40",X"10",X"03",X"10",X"05",X"40",X"10",X"17",X"10",X"04",X"80",X"40",X"80",X"00", + X"00",X"40",X"40",X"10",X"02",X"40",X"10",X"02",X"40",X"10",X"02",X"40",X"10",X"03",X"40",X"10", + X"05",X"10",X"03",X"E6",X"E7",X"57",X"72",X"67",X"72",X"4C",X"55",X"55",X"67",X"72",X"4C",X"55", + X"67",X"72",X"4C",X"55",X"67",X"72",X"4C",X"63",X"31",X"4F",X"4F",X"3C",X"75",X"10",X"03",X"E4", + X"E5",X"57",X"72",X"6B",X"73",X"73",X"68",X"68",X"6B",X"73",X"73",X"68",X"6B",X"73",X"73",X"68", + X"6B",X"73",X"73",X"2E",X"30",X"3D",X"81",X"3C",X"75",X"10",X"03",X"E6",X"E7",X"57",X"67",X"6A", + X"39",X"39",X"67",X"67",X"6A",X"39",X"39",X"67",X"6A",X"39",X"39",X"67",X"6A",X"39",X"39",X"2E", + X"32",X"42",X"BD",X"3C",X"75",X"10",X"03",X"A8",X"A9",X"A2",X"A1",X"69",X"3A",X"3A",X"66",X"65", + X"69",X"3A",X"3A",X"66",X"69",X"3A",X"3A",X"66",X"69",X"3A",X"3A",X"2E",X"32",X"3D",X"81",X"3C", + X"75",X"10",X"03",X"AA",X"AB",X"10",X"12",X"33",X"30",X"42",X"BD",X"3C",X"75",X"10",X"03",X"AF", + X"37",X"37",X"37",X"34",X"10",X"10",X"6D",X"58",X"58",X"3C",X"75",X"10",X"03",X"87",X"87",X"10", + X"16",X"3C",X"75",X"10",X"03",X"9B",X"9D",X"88",X"10",X"15",X"3C",X"75",X"10",X"03",X"9C",X"82", + X"88",X"10",X"15",X"3C",X"75",X"10",X"03",X"79",X"79",X"88",X"10",X"01",X"00",X"10",X"13",X"3C", + X"75",X"10",X"03",X"9C",X"82",X"87",X"10",X"01",X"00",X"10",X"12",X"2F",X"3C",X"75",X"10",X"03", + X"85",X"76",X"87",X"10",X"14",X"2F",X"3C",X"75",X"10",X"03",X"9C",X"76",X"87",X"10",X"15",X"3C", + X"75",X"10",X"03",X"9C",X"79",X"9B",X"10",X"15",X"3C",X"75",X"10",X"03",X"79",X"76",X"87",X"10", + X"14",X"2F",X"3C",X"75",X"10",X"03",X"80",X"8D",X"10",X"02",X"24",X"10",X"12",X"2F",X"3C",X"75", + X"10",X"03",X"80",X"76",X"87",X"10",X"01",X"1E",X"10",X"13",X"3C",X"75",X"10",X"03",X"85",X"76", + X"9B",X"10",X"01",X"19",X"10",X"13",X"3C",X"75",X"10",X"03",X"85",X"82",X"9B",X"10",X"01",X"1F", + X"10",X"12",X"2F",X"3C",X"75",X"10",X"03",X"9C",X"79",X"9B",X"10",X"01",X"20",X"10",X"12",X"2F", + X"3C",X"75",X"10",X"03",X"9C",X"79",X"9D",X"88",X"10",X"14",X"3C",X"75",X"10",X"03",X"85",X"76", + X"76",X"87",X"10",X"14",X"3C",X"75",X"10",X"03",X"7E",X"7B",X"90",X"8F",X"8C",X"10",X"13",X"3C", + X"75",X"B7",X"B8",X"B9",X"7F",X"7B",X"7C",X"76",X"76",X"87",X"10",X"11",X"8B",X"3C",X"75",X"B6", + X"B1",X"B6",X"85",X"79",X"76",X"76",X"79",X"9D",X"88",X"10",X"05",X"89",X"86",X"10",X"08",X"86", + X"8A",X"3C",X"75",X"B4",X"B5",X"B4",X"85",X"7E",X"90",X"7B",X"7C",X"76",X"91",X"83",X"92",X"9A", + X"92",X"96",X"84",X"9E",X"92",X"96",X"96",X"92",X"9A",X"92",X"96",X"96",X"9E",X"38",X"3C",X"75", + X"10",X"03",X"9C",X"8E",X"7A",X"78",X"78",X"7E",X"93",X"9F",X"99",X"94",X"94",X"97",X"94",X"97", + X"94",X"99",X"97",X"94",X"97",X"94",X"94",X"94",X"97",X"97",X"3C",X"75",X"10",X"02",X"88",X"7E", + X"7A",X"78",X"7A",X"7A",X"8E",X"93",X"64",X"95",X"95",X"95",X"95",X"98",X"98",X"95",X"98",X"95", + X"95",X"98",X"95",X"98",X"98",X"98",X"95",X"3C",X"75",X"10",X"1D",X"10",X"08",X"40",X"10",X"04", + X"40",X"10",X"03",X"40",X"10",X"03",X"40",X"00",X"80",X"10",X"05",X"10",X"1D",X"10",X"17",X"80", + X"80",X"10",X"04",X"10",X"18",X"80",X"10",X"04",X"10",X"1D",X"10",X"03",X"40",X"10",X"19",X"10", + X"03",X"40",X"10",X"19",X"10",X"1D",X"10",X"04",X"80",X"80",X"10",X"17",X"10",X"1A",X"8A",X"10", + X"02",X"10",X"05",X"80",X"10",X"14",X"0A",X"10",X"02",X"10",X"1D",X"10",X"1D",X"10",X"05",X"80", + X"10",X"14",X"85",X"10",X"02",X"10",X"1A",X"05",X"10",X"02",X"10",X"03",X"80",X"10",X"19",X"10", + X"1D",X"10",X"1A",X"86",X"10",X"02",X"10",X"1A",X"06",X"10",X"02",X"10",X"04",X"40",X"10",X"18", + X"10",X"1D",X"10",X"1D",X"80",X"80",X"80",X"00",X"80",X"10",X"18",X"80",X"00",X"C0",X"00",X"80", + X"10",X"02",X"80",X"10",X"11",X"40",X"10",X"03",X"80",X"80",X"C0",X"10",X"04",X"80",X"10",X"0B", + X"40",X"10",X"05",X"40",X"00",X"10",X"02",X"10",X"02",X"C0",X"10",X"05",X"40",X"10",X"04",X"40", + X"02",X"40",X"10",X"06",X"40",X"10",X"06",X"10",X"02",X"C0",X"10",X"04",X"80",X"40",X"80",X"00", + X"00",X"00",X"40",X"10",X"02",X"40",X"10",X"02",X"40",X"10",X"02",X"40",X"10",X"03",X"40",X"10", + X"02",X"3A",X"FB",X"89",X"A7",X"20",X"22",X"21",X"C5",X"6A",X"11",X"00",X"00",X"7E",X"FE",X"C9", + X"28",X"08",X"83",X"5F",X"30",X"01",X"14",X"23",X"18",X"F3",X"21",X"19",X"51",X"7B",X"BE",X"C3", + X"C5",X"6A",X"7A",X"23",X"BE",X"C2",X"2C",X"46",X"C9",X"ED",X"1B",X"3A",X"07",X"89",X"CB",X"47", + X"28",X"1F",X"CD",X"C5",X"54",X"CD",X"19",X"55",X"CD",X"64",X"55",X"3A",X"61",X"8F",X"A7",X"28", + X"04",X"CD",X"71",X"11",X"C9",X"CD",X"46",X"51",X"3A",X"6D",X"8D",X"A7",X"C0",X"CD",X"E8",X"56", + X"C9",X"CD",X"B0",X"53",X"18",X"EF",X"CD",X"50",X"51",X"CD",X"F6",X"52",X"CD",X"34",X"53",X"C9", + X"3A",X"6D",X"8D",X"A7",X"C0",X"21",X"9A",X"51",X"3A",X"07",X"89",X"E6",X"0F",X"CD",X"45",X"0C", + X"EB",X"3A",X"01",X"89",X"FE",X"07",X"D8",X"BE",X"28",X"05",X"D0",X"23",X"23",X"18",X"F8",X"32", + X"6D",X"8D",X"23",X"7E",X"47",X"32",X"74",X"8D",X"21",X"64",X"52",X"CD",X"45",X"0C",X"1A",X"32", + X"73",X"8D",X"13",X"ED",X"53",X"71",X"8D",X"78",X"21",X"B0",X"52",X"CD",X"45",X"0C",X"ED",X"53", + X"6F",X"8D",X"AF",X"32",X"7B",X"8D",X"32",X"7E",X"8D",X"C9",X"BA",X"51",X"C2",X"51",X"CA",X"51", + X"D4",X"51",X"DE",X"51",X"E8",X"51",X"F4",X"51",X"00",X"52",X"0C",X"52",X"16",X"52",X"20",X"52", + X"2A",X"52",X"36",X"52",X"42",X"52",X"4E",X"52",X"5A",X"52",X"20",X"00",X"18",X"00",X"10",X"00", + X"05",X"02",X"20",X"04",X"18",X"02",X"10",X"05",X"05",X"02",X"28",X"05",X"20",X"00",X"18",X"05", + X"10",X"01",X"05",X"04",X"28",X"01",X"20",X"02",X"18",X"02",X"10",X"01",X"05",X"04",X"28",X"02", + X"20",X"01",X"18",X"03",X"10",X"04",X"05",X"04",X"30",X"00",X"28",X"06",X"20",X"05",X"18",X"03", + X"10",X"00",X"05",X"04",X"30",X"08",X"28",X"04",X"20",X"05",X"18",X"06",X"10",X"07",X"05",X"04", + X"30",X"06",X"28",X"07",X"20",X"00",X"18",X"05",X"10",X"02",X"05",X"04",X"28",X"09",X"20",X"00", + X"18",X"05",X"10",X"03",X"05",X"04",X"28",X"01",X"20",X"02",X"18",X"02",X"10",X"07",X"05",X"04", + X"28",X"02",X"20",X"01",X"18",X"03",X"10",X"08",X"05",X"04",X"30",X"04",X"28",X"07",X"20",X"02", + X"18",X"06",X"10",X"01",X"05",X"04",X"30",X"04",X"28",X"01",X"20",X"06",X"18",X"00",X"10",X"09", + X"05",X"04",X"30",X"07",X"28",X"06",X"20",X"00",X"18",X"05",X"10",X"02",X"05",X"04",X"2B",X"09", + X"24",X"08",X"1C",X"04",X"14",X"07",X"0D",X"02",X"05",X"02",X"28",X"00",X"20",X"02",X"18",X"06", + X"10",X"07",X"05",X"04",X"78",X"52",X"7F",X"52",X"86",X"52",X"8D",X"52",X"94",X"52",X"9B",X"52", + X"9B",X"52",X"9B",X"52",X"A2",X"52",X"A9",X"52",X"01",X"1E",X"18",X"14",X"10",X"10",X"FF",X"01", + X"30",X"30",X"34",X"30",X"30",X"FF",X"01",X"18",X"50",X"38",X"38",X"30",X"FF",X"01",X"38",X"38", + X"58",X"18",X"30",X"FF",X"01",X"38",X"38",X"38",X"38",X"38",X"FF",X"01",X"30",X"30",X"30",X"30", + X"30",X"FF",X"01",X"50",X"20",X"3E",X"60",X"40",X"FF",X"01",X"10",X"60",X"58",X"60",X"30",X"FF", + X"C4",X"52",X"C9",X"52",X"CE",X"52",X"D3",X"52",X"D8",X"52",X"DD",X"52",X"E2",X"52",X"E7",X"52", + X"EC",X"52",X"F1",X"52",X"08",X"0A",X"0D",X"10",X"12",X"13",X"10",X"0D",X"0A",X"07",X"0E",X"10", + X"0B",X"09",X"07",X"10",X"0E",X"0C",X"08",X"0A",X"10",X"0E",X"0C",X"0A",X"08",X"08",X"08",X"08", + X"08",X"08",X"0D",X"0D",X"0D",X"0D",X"0D",X"10",X"10",X"10",X"10",X"10",X"14",X"08",X"0E",X"14", + X"08",X"0E",X"14",X"07",X"14",X"07",X"3A",X"6D",X"8D",X"A7",X"C8",X"3A",X"6E",X"8D",X"A7",X"C0", + X"01",X"00",X"06",X"21",X"E0",X"8A",X"11",X"17",X"00",X"7E",X"2C",X"B6",X"20",X"01",X"0C",X"19", + X"10",X"F7",X"79",X"FE",X"04",X"D8",X"32",X"6E",X"8D",X"11",X"F3",X"0B",X"06",X"17",X"AF",X"6F", + X"67",X"1A",X"E7",X"1B",X"10",X"FB",X"3E",X"EB",X"85",X"20",X"04",X"7C",X"C6",X"F7",X"C8",X"21", + X"E8",X"89",X"34",X"C9",X"3A",X"6E",X"8D",X"A7",X"C8",X"ED",X"5B",X"71",X"8D",X"1A",X"3C",X"20", + X"14",X"3A",X"6D",X"8D",X"47",X"3A",X"01",X"89",X"B8",X"D0",X"AF",X"32",X"6D",X"8D",X"32",X"6E", + X"8D",X"32",X"07",X"8D",X"C9",X"21",X"73",X"8D",X"35",X"C0",X"3D",X"77",X"13",X"ED",X"53",X"71", + X"8D",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"06",X"06",X"D9",X"CD",X"74",X"53",X"D9",X"DD", + X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"C0",X"21",X"79",X"8D",X"34",X"DD", + X"36",X"00",X"01",X"3A",X"07",X"89",X"1E",X"1D",X"CB",X"47",X"20",X"02",X"1E",X"04",X"CD",X"A0", + X"53",X"21",X"A6",X"53",X"3A",X"74",X"8D",X"E7",X"DD",X"B6",X"07",X"DD",X"77",X"07",X"F1",X"C9", + X"0E",X"FF",X"CD",X"33",X"57",X"C9",X"14",X"24",X"34",X"44",X"54",X"64",X"74",X"84",X"94",X"A4", + X"A7",X"C8",X"3A",X"59",X"8D",X"A7",X"C0",X"3A",X"5F",X"8A",X"A7",X"C0",X"3C",X"32",X"59",X"8D", + X"DD",X"21",X"30",X"8C",X"21",X"02",X"59",X"E7",X"DD",X"77",X"09",X"ED",X"44",X"DD",X"77",X"0A", + X"DD",X"36",X"00",X"01",X"DD",X"36",X"02",X"0B",X"AF",X"DD",X"77",X"03",X"DD",X"36",X"04",X"04", + X"DD",X"77",X"05",X"DD",X"77",X"06",X"2F",X"32",X"4B",X"8D",X"11",X"03",X"42",X"CD",X"1E",X"38", + X"3A",X"07",X"89",X"CB",X"3F",X"3C",X"FE",X"07",X"38",X"02",X"3E",X"06",X"32",X"5C",X"8D",X"21", + X"07",X"54",X"E7",X"32",X"5D",X"8D",X"C9",X"FF",X"20",X"18",X"0C",X"0C",X"0B",X"3A",X"07",X"89", + X"E6",X"01",X"C8",X"AF",X"21",X"01",X"8D",X"06",X"06",X"D7",X"21",X"11",X"8D",X"06",X"06",X"D7", + X"DD",X"21",X"30",X"8C",X"11",X"18",X"00",X"06",X"03",X"D9",X"CD",X"33",X"54",X"D9",X"DD",X"19", + X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"C0",X"DD",X"36",X"00",X"01",X"AF",X"DD", + X"77",X"02",X"DD",X"77",X"05",X"DD",X"36",X"03",X"60",X"DD",X"36",X"04",X"1B",X"DD",X"77",X"0E", + X"21",X"D4",X"55",X"3A",X"01",X"8D",X"4F",X"E7",X"DD",X"77",X"06",X"21",X"D7",X"55",X"79",X"E7", + X"ED",X"44",X"DD",X"77",X"0A",X"21",X"1F",X"56",X"79",X"CD",X"45",X"0C",X"1A",X"DD",X"77",X"17", + X"21",X"57",X"56",X"CD",X"45",X"0C",X"DD",X"73",X"0C",X"DD",X"72",X"0D",X"DD",X"36",X"11",X"40", + X"CD",X"06",X"40",X"79",X"3C",X"32",X"01",X"8D",X"C9",X"DD",X"36",X"00",X"01",X"AF",X"DD",X"77", + X"02",X"DD",X"77",X"05",X"DD",X"36",X"03",X"60",X"DD",X"36",X"04",X"1B",X"DD",X"70",X"06",X"DD", + X"7E",X"17",X"4F",X"21",X"57",X"56",X"CD",X"45",X"0C",X"CD",X"1E",X"38",X"DD",X"36",X"11",X"40", + X"79",X"21",X"D7",X"55",X"E7",X"3A",X"07",X"89",X"E6",X"07",X"4F",X"87",X"81",X"E7",X"ED",X"44", + X"DD",X"77",X"0A",X"F1",X"C9",X"3A",X"07",X"89",X"FE",X"04",X"30",X"0F",X"FE",X"02",X"3A",X"20", + X"88",X"38",X"05",X"FE",X"02",X"D8",X"18",X"03",X"FE",X"03",X"D8",X"21",X"04",X"8D",X"35",X"C0", + X"21",X"EF",X"55",X"3A",X"12",X"8D",X"E6",X"0F",X"E7",X"32",X"04",X"8D",X"21",X"12",X"8D",X"34", + X"DD",X"21",X"30",X"8C",X"11",X"18",X"00",X"06",X"01",X"D9",X"DD",X"7E",X"00",X"DD",X"B6",X"01", + X"20",X"11",X"06",X"0B",X"21",X"37",X"56",X"3A",X"12",X"8D",X"E6",X"0F",X"E7",X"DD",X"77",X"17", + X"CD",X"89",X"54",X"D9",X"DD",X"19",X"10",X"E1",X"C9",X"3A",X"07",X"89",X"FE",X"02",X"30",X"06", + X"3A",X"20",X"88",X"FE",X"02",X"D8",X"21",X"05",X"8D",X"35",X"C0",X"21",X"FF",X"55",X"3A",X"13", + X"8D",X"E6",X"0F",X"E7",X"32",X"05",X"8D",X"21",X"13",X"8D",X"34",X"DD",X"21",X"48",X"8C",X"11", + X"18",X"00",X"06",X"01",X"D9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"20",X"11",X"06",X"0F",X"21", + X"47",X"56",X"3A",X"13",X"8D",X"E6",X"0F",X"E7",X"DD",X"77",X"17",X"CD",X"89",X"54",X"D9",X"DD", + X"19",X"10",X"E1",X"C9",X"21",X"06",X"8D",X"35",X"C0",X"21",X"0F",X"56",X"3A",X"14",X"8D",X"E6", + X"0F",X"E7",X"32",X"06",X"8D",X"21",X"14",X"8D",X"34",X"DD",X"21",X"60",X"8C",X"11",X"18",X"00", + X"3A",X"07",X"89",X"FE",X"04",X"30",X"0B",X"3A",X"20",X"88",X"A7",X"C8",X"FE",X"04",X"06",X"01", + X"38",X"02",X"06",X"02",X"D9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"20",X"31",X"11",X"AD",X"0B", + X"21",X"B5",X"55",X"06",X"08",X"1A",X"86",X"20",X"06",X"13",X"23",X"10",X"F8",X"18",X"0E",X"21", + X"1E",X"88",X"34",X"18",X"08",X"AA",X"7A",X"AD",X"7A",X"B2",X"7A",X"B5",X"7A",X"06",X"13",X"21", + X"27",X"56",X"3A",X"14",X"8D",X"E6",X"0F",X"E7",X"DD",X"77",X"17",X"CD",X"89",X"54",X"D9",X"DD", + X"19",X"10",X"C1",X"C9",X"0B",X"0F",X"13",X"10",X"18",X"20",X"20",X"18",X"10",X"28",X"18",X"20", + X"10",X"18",X"20",X"18",X"20",X"10",X"28",X"18",X"20",X"10",X"18",X"28",X"18",X"18",X"20",X"40", + X"50",X"60",X"70",X"80",X"90",X"A0",X"B0",X"C0",X"D0",X"E0",X"F0",X"10",X"20",X"30",X"40",X"F0", + X"E0",X"D0",X"C0",X"B0",X"A0",X"90",X"80",X"70",X"60",X"50",X"40",X"30",X"20",X"10",X"F0",X"20", + X"30",X"40",X"20",X"20",X"50",X"40",X"30",X"20",X"60",X"20",X"30",X"40",X"70",X"30",X"40",X"27", + X"56",X"37",X"56",X"47",X"56",X"47",X"56",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"01",X"01",X"01",X"01",X"01",X"00",X"03", + X"03",X"01",X"01",X"00",X"00",X"01",X"01",X"02",X"02",X"02",X"02",X"02",X"02",X"01",X"02",X"02", + X"00",X"02",X"03",X"02",X"03",X"03",X"02",X"61",X"56",X"7C",X"56",X"97",X"56",X"B2",X"56",X"CD", + X"56",X"44",X"3C",X"10",X"44",X"3D",X"10",X"44",X"3E",X"10",X"44",X"E1",X"10",X"44",X"E2",X"10", + X"44",X"E1",X"10",X"44",X"E2",X"10",X"44",X"E1",X"10",X"FF",X"6D",X"56",X"41",X"3C",X"10",X"41", + X"3D",X"10",X"41",X"3E",X"10",X"41",X"E1",X"10",X"41",X"E2",X"10",X"41",X"E1",X"10",X"41",X"E2", + X"10",X"41",X"E1",X"10",X"FF",X"88",X"56",X"49",X"3C",X"10",X"49",X"3D",X"10",X"49",X"3E",X"10", + X"49",X"E1",X"10",X"49",X"E2",X"10",X"49",X"E1",X"10",X"49",X"E2",X"10",X"49",X"E1",X"10",X"FF", + X"A3",X"56",X"4C",X"3C",X"10",X"4C",X"3D",X"10",X"4C",X"3E",X"10",X"4C",X"E1",X"10",X"4C",X"E2", + X"10",X"4C",X"E1",X"10",X"4C",X"E2",X"10",X"4C",X"E1",X"10",X"FF",X"BE",X"56",X"40",X"3C",X"10", + X"40",X"3D",X"10",X"40",X"3E",X"10",X"40",X"E1",X"10",X"40",X"E2",X"10",X"40",X"E1",X"10",X"40", + X"E2",X"10",X"40",X"E1",X"10",X"FF",X"D9",X"56",X"3A",X"07",X"8D",X"A7",X"28",X"05",X"3D",X"32", + X"07",X"8D",X"C9",X"3A",X"07",X"89",X"CB",X"47",X"CA",X"71",X"58",X"3A",X"01",X"89",X"21",X"40", + X"8D",X"96",X"C8",X"D8",X"4F",X"3A",X"00",X"89",X"FE",X"03",X"38",X"04",X"06",X"06",X"18",X"03", + X"C6",X"04",X"47",X"3A",X"40",X"8D",X"B8",X"D0",X"DD",X"21",X"E0",X"8A",X"06",X"06",X"1E",X"1D", + X"CD",X"2B",X"57",X"11",X"18",X"00",X"DD",X"19",X"10",X"F4",X"C9",X"DD",X"7E",X"00",X"DD",X"B6", + X"01",X"0F",X"D8",X"41",X"DD",X"36",X"00",X"01",X"DD",X"36",X"02",X"03",X"DD",X"73",X"04",X"AF", + X"DD",X"77",X"03",X"DD",X"77",X"05",X"DD",X"77",X"06",X"DD",X"77",X"08",X"DD",X"36",X"07",X"01", + X"DD",X"77",X"0B",X"21",X"E0",X"58",X"3A",X"07",X"89",X"E6",X"01",X"20",X"03",X"21",X"02",X"59", + X"3A",X"20",X"88",X"FE",X"03",X"38",X"02",X"3E",X"03",X"4F",X"3A",X"08",X"89",X"FE",X"04",X"38", + X"05",X"3A",X"4C",X"8D",X"81",X"4F",X"3A",X"07",X"89",X"CB",X"47",X"CC",X"B4",X"57",X"3A",X"07", + X"89",X"81",X"4F",X"FE",X"20",X"38",X"02",X"3E",X"1F",X"4F",X"E7",X"DD",X"77",X"09",X"ED",X"44", + X"DD",X"77",X"0A",X"11",X"29",X"38",X"CD",X"1E",X"38",X"21",X"9B",X"58",X"3A",X"07",X"89",X"E6", + X"01",X"20",X"03",X"21",X"C0",X"58",X"79",X"E7",X"32",X"07",X"8D",X"21",X"40",X"8D",X"34",X"CD", + X"C3",X"57",X"F1",X"C9",X"3A",X"01",X"89",X"FE",X"03",X"D0",X"3A",X"7D",X"8D",X"D6",X"0C",X"D8", + X"81",X"4F",X"C9",X"05",X"28",X"6F",X"21",X"46",X"8D",X"7E",X"A7",X"28",X"2D",X"FE",X"07",X"30", + X"29",X"34",X"2C",X"7E",X"A7",X"28",X"0A",X"35",X"DD",X"36",X"13",X"02",X"DD",X"36",X"16",X"01", + X"C9",X"2C",X"7E",X"A7",X"28",X"0A",X"35",X"DD",X"36",X"13",X"01",X"DD",X"36",X"16",X"C1",X"C9", + X"2C",X"7E",X"A7",X"C8",X"35",X"DD",X"36",X"16",X"41",X"C9",X"36",X"01",X"3A",X"07",X"89",X"CB", + X"47",X"28",X"25",X"3A",X"00",X"89",X"4F",X"3A",X"4C",X"8D",X"81",X"FE",X"20",X"38",X"02",X"3E", + X"1F",X"4F",X"EB",X"21",X"22",X"59",X"87",X"81",X"E7",X"13",X"12",X"23",X"13",X"7E",X"12",X"23", + X"13",X"7E",X"12",X"06",X"FF",X"C3",X"C3",X"57",X"FE",X"20",X"38",X"02",X"3E",X"1F",X"4F",X"EB", + X"21",X"85",X"59",X"18",X"E1",X"3A",X"4A",X"8D",X"A7",X"20",X"8B",X"3E",X"01",X"32",X"4A",X"8D", + X"DD",X"77",X"0B",X"DD",X"36",X"13",X"03",X"DD",X"77",X"16",X"DD",X"36",X"07",X"02",X"11",X"47", + X"38",X"CD",X"1E",X"38",X"21",X"B5",X"0B",X"06",X"52",X"AF",X"57",X"5E",X"83",X"30",X"01",X"14", + X"23",X"10",X"F8",X"D6",X"C1",X"20",X"04",X"3E",X"1D",X"BA",X"C8",X"3E",X"01",X"32",X"2B",X"88", + X"C9",X"32",X"00",X"89",X"3A",X"01",X"89",X"21",X"40",X"8D",X"96",X"C8",X"D8",X"3A",X"40",X"8D", + X"FE",X"06",X"D0",X"3E",X"01",X"32",X"4A",X"8D",X"DD",X"21",X"E0",X"8A",X"06",X"06",X"1E",X"04", + X"CD",X"2B",X"57",X"11",X"18",X"00",X"DD",X"19",X"10",X"F4",X"C9",X"80",X"80",X"78",X"74",X"70", + X"6C",X"68",X"60",X"50",X"48",X"40",X"38",X"30",X"2C",X"28",X"24",X"20",X"1E",X"1C",X"1A",X"18", + X"17",X"17",X"17",X"17",X"16",X"16",X"16",X"16",X"15",X"15",X"15",X"15",X"14",X"14",X"14",X"14", + X"80",X"70",X"60",X"50",X"48",X"40",X"38",X"30",X"2C",X"28",X"24",X"20",X"1E",X"1C",X"1A",X"18", + X"17",X"17",X"17",X"17",X"16",X"16",X"16",X"16",X"15",X"15",X"15",X"15",X"14",X"14",X"14",X"14", + X"10",X"10",X"10",X"10",X"11",X"11",X"12",X"12",X"13",X"13",X"13",X"13",X"14",X"14",X"15",X"15", + X"15",X"15",X"17",X"17",X"18",X"18",X"19",X"19",X"1A",X"1A",X"1A",X"1A",X"1B",X"1B",X"1B",X"1B", + X"1C",X"1C",X"10",X"10",X"12",X"12",X"14",X"14",X"15",X"15",X"16",X"16",X"17",X"17",X"18",X"18", + X"19",X"19",X"19",X"19",X"1A",X"1A",X"1B",X"1B",X"1B",X"1B",X"1C",X"1C",X"1C",X"1C",X"1D",X"1D", + X"1E",X"1E",X"00",X"00",X"01",X"00",X"00",X"02",X"00",X"00",X"03",X"00",X"00",X"04",X"00",X"00", + X"05",X"00",X"01",X"03",X"00",X"01",X"04",X"00",X"01",X"05",X"00",X"02",X"02",X"00",X"02",X"03", + X"00",X"02",X"04",X"00",X"03",X"01",X"00",X"03",X"02",X"00",X"03",X"03",X"00",X"04",X"01",X"00", + X"04",X"02",X"00",X"05",X"00",X"00",X"05",X"01",X"00",X"06",X"00",X"00",X"05",X"01",X"00",X"06", + X"00",X"00",X"05",X"01",X"00",X"06",X"00",X"00",X"04",X"02",X"00",X"06",X"00",X"00",X"06",X"00", + X"00",X"06",X"00",X"00",X"06",X"00",X"00",X"06",X"00",X"00",X"06",X"00",X"00",X"06",X"00",X"00", + X"06",X"00",X"00",X"06",X"00",X"00",X"00",X"01",X"00",X"00",X"03",X"00",X"00",X"06",X"00",X"01", + X"04",X"00",X"01",X"05",X"00",X"02",X"03",X"00",X"02",X"04",X"00",X"03",X"01",X"00",X"03",X"02", + X"00",X"03",X"03",X"00",X"04",X"02",X"00",X"05",X"00",X"00",X"05",X"01",X"01",X"02",X"01",X"01", + X"01",X"03",X"01",X"01",X"04",X"01",X"02",X"03",X"02",X"00",X"00",X"02",X"01",X"02",X"02",X"00", + X"01",X"02",X"02",X"01",X"03",X"01",X"01",X"03",X"00",X"01",X"03",X"02",X"00",X"03",X"00",X"02", + X"03",X"00",X"00",X"03",X"01",X"02",X"03",X"00",X"03",X"04",X"01",X"00",X"04",X"01",X"00",X"04", + X"00",X"02",X"04",X"00",X"00",X"06",X"00",X"00",X"3A",X"2C",X"88",X"FE",X"0F",X"C8",X"3A",X"2F", + X"88",X"FE",X"0F",X"C8",X"CD",X"06",X"5A",X"CD",X"56",X"5A",X"CD",X"1F",X"5A",X"CD",X"9C",X"5A", + X"CD",X"6D",X"7E",X"C3",X"C0",X"5A",X"3A",X"10",X"88",X"0F",X"0F",X"0F",X"21",X"29",X"88",X"CB", + X"16",X"7E",X"E6",X"07",X"FE",X"01",X"C0",X"CD",X"09",X"0F",X"3E",X"01",X"C3",X"8C",X"5A",X"3A", + X"10",X"88",X"21",X"2D",X"88",X"0F",X"0F",X"CB",X"16",X"7E",X"E6",X"07",X"FE",X"01",X"C0",X"EB", + X"CD",X"09",X"0F",X"21",X"26",X"88",X"34",X"EB",X"23",X"7E",X"C6",X"10",X"77",X"47",X"23",X"7E", + X"90",X"D0",X"7E",X"4F",X"E6",X"F0",X"C6",X"10",X"2B",X"ED",X"44",X"86",X"77",X"79",X"E6",X"0F", + X"FE",X"0F",X"20",X"38",X"18",X"34",X"3A",X"10",X"88",X"21",X"2A",X"88",X"0F",X"CB",X"16",X"7E", + X"E6",X"07",X"FE",X"01",X"C0",X"EB",X"CD",X"09",X"0F",X"21",X"24",X"88",X"34",X"EB",X"23",X"7E", + X"C6",X"10",X"77",X"47",X"23",X"7E",X"90",X"D0",X"7E",X"4F",X"E6",X"F0",X"C6",X"10",X"2B",X"ED", + X"44",X"86",X"77",X"79",X"E6",X"0F",X"FE",X"0F",X"20",X"02",X"3E",X"63",X"21",X"02",X"88",X"86", + X"77",X"FE",X"63",X"38",X"02",X"36",X"63",X"11",X"01",X"07",X"FF",X"C9",X"3A",X"24",X"88",X"A7", + X"C8",X"21",X"25",X"88",X"7E",X"A7",X"20",X"07",X"36",X"30",X"3C",X"32",X"83",X"A1",X"C9",X"35", + X"28",X"09",X"7E",X"FE",X"18",X"C0",X"AF",X"32",X"83",X"A1",X"C9",X"21",X"24",X"88",X"35",X"C9", + X"3A",X"26",X"88",X"A7",X"C8",X"21",X"27",X"88",X"7E",X"A7",X"20",X"07",X"36",X"30",X"3C",X"32", + X"84",X"A1",X"C9",X"35",X"28",X"09",X"7E",X"FE",X"18",X"C0",X"AF",X"32",X"84",X"A1",X"C9",X"21", + X"26",X"88",X"35",X"C9",X"CD",X"78",X"5E",X"CD",X"6A",X"5F",X"CD",X"2F",X"60",X"CD",X"68",X"63", + X"CD",X"F7",X"5D",X"CD",X"06",X"5B",X"CD",X"4D",X"5D",X"CD",X"86",X"5B",X"CD",X"04",X"64",X"CD", + X"0B",X"5D",X"CD",X"2C",X"5B",X"C9",X"3A",X"07",X"89",X"FE",X"05",X"C0",X"FD",X"21",X"15",X"53", + X"FD",X"55",X"FD",X"5C",X"AF",X"6F",X"67",X"06",X"06",X"1A",X"85",X"30",X"01",X"24",X"6F",X"13", + X"10",X"F7",X"84",X"C6",X"7F",X"C8",X"26",X"88",X"2E",X"1E",X"34",X"C9",X"3A",X"75",X"8D",X"A7", + X"C8",X"3A",X"79",X"8D",X"A7",X"C0",X"3A",X"77",X"8D",X"A7",X"20",X"1B",X"21",X"E4",X"8A",X"11", + X"18",X"00",X"06",X"06",X"0E",X"13",X"3A",X"07",X"89",X"CB",X"47",X"28",X"02",X"0E",X"0B",X"7E", + X"B9",X"28",X"04",X"19",X"10",X"F9",X"C9",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"06",X"06", + X"D9",X"CD",X"71",X"5B",X"D9",X"DD",X"19",X"10",X"F7",X"AF",X"32",X"75",X"8D",X"32",X"20",X"8F", + X"C9",X"DD",X"7E",X"02",X"FE",X"05",X"C0",X"DD",X"CB",X"07",X"56",X"C8",X"DD",X"7E",X"06",X"FE", + X"11",X"D0",X"CD",X"6C",X"3A",X"C9",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"06",X"06",X"D9", + X"CD",X"99",X"5B",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"CB",X"0B",X"46",X"20",X"06",X"3A", + X"07",X"89",X"CB",X"47",X"C0",X"DD",X"CB",X"00",X"46",X"C8",X"DD",X"CB",X"16",X"46",X"C8",X"DD", + X"7E",X"02",X"FE",X"05",X"C0",X"21",X"48",X"88",X"FD",X"21",X"90",X"8C",X"06",X"02",X"FD",X"CB", + X"00",X"46",X"CA",X"46",X"5C",X"FD",X"CB",X"00",X"4E",X"20",X"7B",X"1E",X"10",X"3A",X"1F",X"88", + X"A7",X"20",X"02",X"1E",X"08",X"DD",X"7E",X"06",X"DD",X"4E",X"05",X"CB",X"01",X"17",X"CB",X"01", + X"17",X"CB",X"01",X"17",X"83",X"FD",X"96",X"06",X"30",X"02",X"ED",X"44",X"FE",X"10",X"30",X"56", + X"2C",X"2C",X"1E",X"16",X"3A",X"07",X"89",X"CB",X"47",X"20",X"02",X"1E",X"12",X"DD",X"7E",X"04", + X"DD",X"4E",X"03",X"CB",X"01",X"17",X"CB",X"01",X"17",X"CB",X"01",X"17",X"93",X"FD",X"96",X"04", + X"30",X"02",X"ED",X"44",X"FE",X"09",X"30",X"30",X"11",X"80",X"5C",X"DD",X"CB",X"07",X"4E",X"28", + X"03",X"11",X"89",X"5C",X"CD",X"1E",X"38",X"DD",X"36",X"12",X"10",X"DD",X"36",X"16",X"02",X"FD", + X"21",X"70",X"8B",X"11",X"18",X"00",X"06",X"05",X"DD",X"7E",X"14",X"FD",X"BE",X"14",X"28",X"14", + X"FD",X"19",X"10",X"F4",X"F1",X"C9",X"2C",X"2C",X"2C",X"2C",X"11",X"18",X"00",X"FD",X"19",X"05", + X"C2",X"BE",X"5B",X"C9",X"21",X"92",X"5C",X"DD",X"7E",X"07",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F", + X"CD",X"45",X"0C",X"FD",X"CB",X"0B",X"46",X"28",X"03",X"11",X"F9",X"5C",X"FD",X"36",X"16",X"02", + X"CD",X"75",X"5C",X"F1",X"C9",X"FD",X"73",X"0C",X"FD",X"72",X"0D",X"FD",X"36",X"0E",X"00",X"C9", + X"80",X"01",X"10",X"40",X"29",X"F0",X"FF",X"83",X"5C",X"84",X"01",X"10",X"44",X"29",X"F0",X"FF", + X"8C",X"5C",X"A8",X"5C",X"B1",X"5C",X"BA",X"5C",X"C3",X"5C",X"CC",X"5C",X"D5",X"5C",X"DE",X"5C", + X"DE",X"5C",X"DE",X"5C",X"E7",X"5C",X"F0",X"5C",X"40",X"20",X"10",X"40",X"22",X"F0",X"FF",X"AB", + X"5C",X"41",X"20",X"10",X"41",X"22",X"F0",X"FF",X"B4",X"5C",X"44",X"20",X"10",X"44",X"22",X"F0", + X"FF",X"BD",X"5C",X"49",X"20",X"10",X"49",X"22",X"F0",X"FF",X"C6",X"5C",X"4A",X"20",X"10",X"4A", + X"22",X"F0",X"FF",X"CF",X"5C",X"41",X"20",X"10",X"41",X"22",X"F0",X"FF",X"D8",X"5C",X"44",X"20", + X"10",X"44",X"22",X"F0",X"FF",X"E1",X"5C",X"4E",X"20",X"10",X"4E",X"22",X"F0",X"FF",X"EA",X"5C", + X"4F",X"20",X"10",X"4F",X"22",X"F0",X"FF",X"F3",X"5C",X"44",X"20",X"10",X"44",X"A1",X"08",X"4B", + X"A1",X"08",X"4C",X"A1",X"08",X"4F",X"A1",X"08",X"FF",X"FC",X"5C",X"DD",X"21",X"E0",X"8A",X"11", + X"18",X"00",X"06",X"06",X"D9",X"CD",X"1E",X"5D",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"CB", + X"0B",X"46",X"20",X"06",X"3A",X"07",X"89",X"CB",X"47",X"C0",X"DD",X"CB",X"00",X"46",X"C8",X"DD", + X"CB",X"16",X"4E",X"C8",X"DD",X"35",X"12",X"C0",X"DD",X"7E",X"13",X"E6",X"03",X"28",X"09",X"3D", + X"DD",X"77",X"13",X"DD",X"36",X"16",X"01",X"C9",X"DD",X"36",X"16",X"00",X"C9",X"DD",X"21",X"9C", + X"88",X"FD",X"21",X"7C",X"88",X"21",X"E8",X"8B",X"06",X"03",X"CD",X"68",X"5D",X"11",X"04",X"00", + X"FD",X"19",X"1E",X"18",X"19",X"10",X"F3",X"C9",X"7E",X"A7",X"C8",X"FE",X"05",X"C8",X"1E",X"FC", + X"16",X"00",X"3A",X"1F",X"88",X"A7",X"20",X"04",X"1E",X"05",X"16",X"10",X"DD",X"7E",X"00",X"83", + X"5F",X"DD",X"7E",X"02",X"82",X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"04", + X"D0",X"FD",X"7E",X"02",X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"09",X"D8",X"FE",X"0F", + X"D0",X"E5",X"DD",X"E1",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"0C", + X"DD",X"36",X"07",X"01",X"21",X"C2",X"5D",X"DD",X"74",X"13",X"DD",X"75",X"12",X"CD",X"2B",X"0F", + X"F1",X"C9",X"60",X"20",X"60",X"20",X"40",X"20",X"40",X"40",X"40",X"40",X"40",X"40",X"20",X"40", + X"20",X"40",X"20",X"40",X"20",X"60",X"20",X"60",X"20",X"40",X"20",X"60",X"20",X"60",X"20",X"60", + X"20",X"60",X"20",X"60",X"20",X"60",X"20",X"60",X"20",X"60",X"20",X"60",X"10",X"60",X"10",X"60", + X"10",X"60",X"10",X"60",X"EE",X"0C",X"60",X"3A",X"32",X"8D",X"A7",X"C0",X"3A",X"08",X"8F",X"21", + X"24",X"8F",X"B6",X"C0",X"DD",X"21",X"40",X"88",X"FD",X"21",X"7C",X"88",X"21",X"E8",X"8B",X"06", + X"03",X"CD",X"1F",X"5E",X"11",X"04",X"00",X"FD",X"19",X"1E",X"18",X"19",X"10",X"F3",X"C9",X"7E", + X"A7",X"C8",X"FE",X"05",X"C8",X"1E",X"09",X"16",X"00",X"3A",X"1F",X"88",X"A7",X"20",X"04",X"1E", + X"F7",X"16",X"10",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E",X"02",X"82",X"57",X"FD",X"7E",X"00", + X"93",X"30",X"02",X"ED",X"44",X"FE",X"02",X"D0",X"FD",X"7E",X"02",X"C6",X"08",X"92",X"30",X"02", + X"ED",X"44",X"FE",X"09",X"D0",X"3E",X"01",X"32",X"32",X"8D",X"E5",X"DD",X"E1",X"11",X"B4",X"40", + X"CD",X"1E",X"38",X"DD",X"36",X"11",X"0A",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD", + X"36",X"02",X"02",X"CD",X"15",X"0F",X"F1",X"C9",X"3A",X"07",X"89",X"E6",X"01",X"C8",X"FD",X"21", + X"48",X"88",X"06",X"02",X"11",X"04",X"00",X"AF",X"ED",X"47",X"D9",X"CD",X"98",X"5E",X"D9",X"FD", + X"19",X"3E",X"01",X"ED",X"47",X"10",X"F3",X"C9",X"ED",X"57",X"DD",X"21",X"90",X"8C",X"A7",X"28", + X"04",X"DD",X"21",X"A8",X"8C",X"DD",X"CB",X"00",X"46",X"C8",X"DD",X"22",X"65",X"8D",X"DD",X"CB", + X"00",X"4E",X"DD",X"21",X"88",X"88",X"06",X"04",X"21",X"30",X"8C",X"20",X"54",X"7E",X"A7",X"28", + X"45",X"2C",X"2C",X"7E",X"2D",X"2D",X"FE",X"04",X"30",X"3C",X"CD",X"53",X"5F",X"30",X"37",X"57", + X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"0A",X"30",X"2A",X"FD",X"7E",X"02",X"C6", + X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"09",X"30",X"1C",X"AF",X"77",X"23",X"36",X"01",X"23", + X"36",X"08",X"DD",X"2A",X"65",X"8D",X"DD",X"CB",X"07",X"46",X"20",X"06",X"2A",X"65",X"8D",X"06", + X"17",X"D7",X"CD",X"F1",X"0E",X"C9",X"11",X"04",X"00",X"DD",X"19",X"1E",X"18",X"19",X"10",X"AD", + X"C9",X"7E",X"A7",X"28",X"32",X"FE",X"03",X"28",X"2E",X"CD",X"53",X"5F",X"30",X"29",X"57",X"FD", + X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"07",X"30",X"1C",X"FD",X"7E",X"02",X"C6",X"08", + X"92",X"30",X"02",X"ED",X"44",X"FE",X"06",X"30",X"0E",X"36",X"03",X"21",X"19",X"8D",X"ED",X"57", + X"28",X"01",X"2C",X"36",X"01",X"18",X"BB",X"11",X"04",X"00",X"DD",X"19",X"11",X"18",X"00",X"19", + X"10",X"BF",X"C9",X"1E",X"06",X"3A",X"1F",X"88",X"A7",X"20",X"02",X"1E",X"FE",X"DD",X"7E",X"00", + X"83",X"5F",X"DD",X"7E",X"02",X"C6",X"08",X"FE",X"E0",X"C9",X"FD",X"21",X"48",X"88",X"06",X"02", + X"11",X"04",X"00",X"AF",X"ED",X"47",X"D9",X"CD",X"83",X"5F",X"D9",X"FD",X"19",X"78",X"ED",X"47", + X"10",X"F4",X"C9",X"DD",X"21",X"90",X"8C",X"ED",X"57",X"A7",X"28",X"04",X"DD",X"21",X"A8",X"8C", + X"DD",X"7E",X"00",X"A7",X"C8",X"32",X"44",X"8D",X"4F",X"DD",X"21",X"50",X"88",X"06",X"06",X"21", + X"E0",X"8A",X"7E",X"A7",X"28",X"72",X"2C",X"2C",X"7E",X"2D",X"2D",X"FE",X"05",X"20",X"69",X"1E", + X"06",X"3A",X"1F",X"88",X"A7",X"20",X"02",X"1E",X"FB",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E", + X"02",X"C6",X"08",X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"5F",X"79",X"FE",X"03", + X"7B",X"20",X"06",X"FE",X"10",X"30",X"41",X"18",X"04",X"FE",X"08",X"30",X"3B",X"FD",X"7E",X"02", + X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"5F",X"79",X"FE",X"03",X"7B",X"20",X"06",X"FE",X"12", + X"30",X"26",X"18",X"04",X"FE",X"08",X"30",X"20",X"79",X"FE",X"03",X"28",X"28",X"FD",X"E5",X"E1", + X"7D",X"21",X"91",X"8C",X"FE",X"48",X"28",X"03",X"21",X"A9",X"8C",X"36",X"01",X"11",X"06",X"00", + X"19",X"36",X"01",X"CD",X"01",X"0F",X"F1",X"C9",X"11",X"04",X"00",X"DD",X"19",X"1E",X"18",X"19", + X"05",X"C2",X"A2",X"5F",X"C9",X"E5",X"FD",X"E1",X"21",X"45",X"8D",X"34",X"C3",X"3D",X"61",X"FD", + X"21",X"48",X"88",X"06",X"02",X"AF",X"ED",X"47",X"11",X"04",X"00",X"D9",X"CD",X"48",X"60",X"D9", + X"FD",X"19",X"78",X"ED",X"47",X"10",X"F4",X"C9",X"DD",X"21",X"90",X"8C",X"ED",X"57",X"A7",X"28", + X"04",X"DD",X"21",X"A8",X"8C",X"DD",X"7E",X"00",X"A7",X"C8",X"FE",X"03",X"C8",X"32",X"44",X"8D", + X"DD",X"21",X"68",X"88",X"06",X"05",X"21",X"70",X"8B",X"7E",X"A7",X"CA",X"F2",X"60",X"2C",X"2C", + X"7E",X"2D",X"2D",X"FE",X"05",X"C2",X"F2",X"60",X"3A",X"07",X"89",X"CB",X"47",X"C2",X"B4",X"61", + X"1E",X"06",X"3A",X"1F",X"88",X"A7",X"20",X"02",X"1E",X"FE",X"DD",X"7E",X"00",X"83",X"5F",X"DD", + X"7E",X"02",X"C6",X"08",X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"09",X"30", + X"51",X"FD",X"7E",X"02",X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"08",X"30",X"43",X"11", + X"14",X"00",X"19",X"FD",X"21",X"E0",X"8A",X"7E",X"0E",X"06",X"1E",X"18",X"FD",X"BE",X"14",X"28", + X"07",X"FD",X"19",X"0D",X"20",X"F6",X"18",X"0D",X"FD",X"CB",X"16",X"4E",X"28",X"07",X"3A",X"44", + X"8D",X"FE",X"03",X"20",X"2A",X"11",X"EC",X"FF",X"19",X"FD",X"21",X"1C",X"8D",X"ED",X"57",X"20", + X"02",X"FD",X"2B",X"FD",X"36",X"00",X"01",X"11",X"04",X"04",X"CD",X"9F",X"61",X"11",X"FD",X"FF", + X"18",X"2D",X"11",X"04",X"00",X"DD",X"19",X"1E",X"18",X"19",X"05",X"C2",X"69",X"60",X"C9",X"DD", + X"21",X"90",X"8C",X"ED",X"57",X"28",X"04",X"DD",X"21",X"A8",X"8C",X"DD",X"36",X"01",X"01",X"DD", + X"36",X"07",X"01",X"CD",X"01",X"0F",X"F1",X"C9",X"3A",X"45",X"8D",X"3C",X"32",X"45",X"8D",X"19", + X"7E",X"06",X"06",X"11",X"18",X"00",X"FD",X"21",X"E0",X"8A",X"FD",X"BE",X"14",X"28",X"0E",X"FD", + X"19",X"10",X"F7",X"3A",X"44",X"8D",X"FE",X"03",X"C8",X"CD",X"F1",X"0E",X"C9",X"FD",X"CB",X"00", + X"46",X"28",X"47",X"3A",X"07",X"89",X"E6",X"01",X"20",X"1C",X"3A",X"44",X"8D",X"FE",X"03",X"20", + X"15",X"FD",X"7E",X"14",X"DD",X"21",X"70",X"8B",X"11",X"18",X"00",X"06",X"06",X"DD",X"BE",X"14", + X"28",X"2E",X"DD",X"19",X"10",X"F7",X"AF",X"FD",X"77",X"00",X"FD",X"36",X"01",X"01",X"FD",X"36", + X"02",X"08",X"FD",X"36",X"16",X"07",X"FD",X"36",X"17",X"05",X"FD",X"77",X"14",X"FD",X"77",X"13", + X"3A",X"44",X"8D",X"FE",X"03",X"20",X"13",X"CD",X"FD",X"0E",X"AF",X"32",X"44",X"8D",X"F1",X"C9", + X"DD",X"36",X"08",X"01",X"DD",X"36",X"0A",X"D0",X"18",X"CC",X"CD",X"F1",X"0E",X"18",X"EB",X"36", + X"00",X"23",X"36",X"01",X"23",X"36",X"08",X"01",X"10",X"00",X"09",X"36",X"FF",X"0E",X"04",X"09", + X"73",X"23",X"72",X"C9",X"E5",X"FD",X"E5",X"C5",X"7D",X"C6",X"14",X"6F",X"7E",X"FD",X"21",X"E0", + X"8A",X"01",X"18",X"00",X"2E",X"05",X"FD",X"BE",X"14",X"28",X"0C",X"FD",X"09",X"2D",X"20",X"F6", + X"C1",X"FD",X"E1",X"E1",X"C3",X"80",X"60",X"FD",X"7E",X"0B",X"A7",X"20",X"F3",X"FD",X"7E",X"16", + X"C1",X"FD",X"E1",X"E1",X"E6",X"F0",X"CA",X"80",X"60",X"FE",X"40",X"28",X"0F",X"FE",X"50",X"CA", + X"87",X"62",X"FE",X"F0",X"CA",X"0F",X"63",X"FE",X"D0",X"CA",X"87",X"62",X"1E",X"06",X"3A",X"1F", + X"88",X"A7",X"20",X"02",X"1E",X"FE",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E",X"02",X"C6",X"08", + X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"09",X"D2",X"F2",X"60",X"FD",X"7E", + X"02",X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"08",X"D2",X"F2",X"60",X"E5",X"DD",X"E1", + X"11",X"43",X"63",X"CD",X"1E",X"38",X"21",X"58",X"63",X"3A",X"07",X"89",X"E6",X"07",X"1F",X"E7", + X"6F",X"DD",X"7E",X"0A",X"85",X"DD",X"77",X"0A",X"FD",X"21",X"E0",X"8A",X"DD",X"7E",X"14",X"0E", + X"06",X"11",X"18",X"00",X"FD",X"BE",X"14",X"28",X"05",X"FD",X"19",X"0D",X"20",X"F6",X"21",X"58", + X"63",X"3A",X"07",X"89",X"E6",X"07",X"1F",X"E7",X"6F",X"FD",X"7E",X"0A",X"85",X"FD",X"77",X"0A", + X"FD",X"CB",X"16",X"E6",X"21",X"90",X"8C",X"ED",X"57",X"28",X"03",X"21",X"A8",X"8C",X"06",X"18", + X"AF",X"D7",X"CD",X"F1",X"0E",X"F1",X"C9",X"4F",X"1E",X"06",X"3A",X"1F",X"88",X"A7",X"20",X"02", + X"1E",X"FE",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E",X"02",X"C6",X"08",X"57",X"FD",X"7E",X"00", + X"93",X"30",X"02",X"ED",X"44",X"FE",X"06",X"D2",X"F2",X"60",X"FD",X"7E",X"02",X"C6",X"08",X"92", + X"30",X"02",X"ED",X"44",X"FE",X"07",X"D2",X"F2",X"60",X"79",X"FE",X"50",X"CA",X"D9",X"60",X"E5", + X"DD",X"E1",X"11",X"49",X"63",X"CD",X"1E",X"38",X"21",X"60",X"63",X"3A",X"07",X"89",X"E6",X"07", + X"1F",X"E7",X"6F",X"DD",X"7E",X"0A",X"85",X"DD",X"77",X"0A",X"FD",X"21",X"E0",X"8A",X"DD",X"7E", + X"14",X"0E",X"06",X"11",X"18",X"00",X"FD",X"BE",X"14",X"28",X"05",X"FD",X"19",X"0D",X"20",X"F6", + X"21",X"60",X"63",X"3A",X"07",X"89",X"E6",X"07",X"1F",X"E7",X"6F",X"FD",X"7E",X"0A",X"85",X"FD", + X"77",X"0A",X"FD",X"CB",X"16",X"EE",X"11",X"4F",X"63",X"CD",X"75",X"5C",X"C3",X"74",X"62",X"1E", + X"06",X"3A",X"1F",X"88",X"A7",X"20",X"02",X"1E",X"FE",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E", + X"02",X"C6",X"08",X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"05",X"D2",X"F2", + X"60",X"FD",X"7E",X"02",X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"05",X"D2",X"F2",X"60", + X"C3",X"D9",X"60",X"41",X"23",X"F0",X"FF",X"43",X"63",X"4C",X"24",X"F0",X"FF",X"49",X"63",X"40", + X"0B",X"0D",X"40",X"06",X"0D",X"FF",X"4F",X"63",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0E", + X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0C",X"FD",X"21",X"48",X"88",X"06",X"02",X"11",X"04", + X"00",X"AF",X"ED",X"47",X"D9",X"CD",X"81",X"63",X"D9",X"FD",X"19",X"7B",X"ED",X"47",X"10",X"F4", + X"C9",X"DD",X"21",X"7C",X"88",X"06",X"03",X"21",X"E8",X"8B",X"7E",X"A7",X"28",X"61",X"1E",X"05", + X"3A",X"1F",X"88",X"A7",X"20",X"02",X"1E",X"FE",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E",X"02", + X"C6",X"08",X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"06",X"30",X"40",X"FD", + X"7E",X"02",X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"06",X"30",X"32",X"E5",X"DD",X"E1", + X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"02",X"DD",X"36",X"11",X"28", + X"11",X"0F",X"00",X"21",X"1B",X"8D",X"ED",X"57",X"A7",X"28",X"03",X"21",X"1C",X"8D",X"36",X"01", + X"11",X"FB",X"63",X"CD",X"1E",X"38",X"CD",X"F9",X"0E",X"11",X"15",X"03",X"FF",X"F1",X"C9",X"11", + X"04",X"00",X"DD",X"19",X"11",X"18",X"00",X"19",X"10",X"90",X"C9",X"4F",X"34",X"06",X"4F",X"33", + X"06",X"42",X"37",X"28",X"3A",X"50",X"8F",X"A7",X"20",X"06",X"3A",X"07",X"89",X"E6",X"01",X"C0", + X"FD",X"21",X"48",X"88",X"06",X"02",X"11",X"04",X"00",X"AF",X"ED",X"47",X"D9",X"CD",X"35",X"64", + X"D9",X"FD",X"19",X"7B",X"ED",X"47",X"10",X"F4",X"C9",X"11",X"04",X"00",X"DD",X"19",X"11",X"18", + X"00",X"19",X"10",X"17",X"C9",X"DD",X"21",X"8C",X"88",X"21",X"48",X"8C",X"3A",X"50",X"8F",X"A7", + X"28",X"07",X"DD",X"21",X"7C",X"88",X"21",X"E8",X"8B",X"06",X"03",X"7E",X"A7",X"28",X"DA",X"1E", + X"05",X"3A",X"1F",X"88",X"A7",X"20",X"02",X"1E",X"FE",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E", + X"02",X"C6",X"08",X"57",X"FD",X"7E",X"00",X"93",X"30",X"02",X"ED",X"44",X"FE",X"07",X"30",X"B9", + X"FD",X"7E",X"02",X"C6",X"08",X"92",X"30",X"02",X"ED",X"44",X"FE",X"07",X"30",X"AB",X"E5",X"DD", + X"E1",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"02",X"DD",X"36",X"11", + X"20",X"11",X"0F",X"00",X"21",X"1B",X"8D",X"ED",X"57",X"A7",X"28",X"03",X"21",X"1C",X"8D",X"36", + X"01",X"11",X"DF",X"64",X"CD",X"1E",X"38",X"CD",X"F5",X"0E",X"3A",X"50",X"8F",X"A7",X"20",X"04", + X"11",X"15",X"03",X"FF",X"21",X"52",X"8F",X"34",X"11",X"C2",X"0B",X"21",X"D0",X"64",X"1A",X"96", + X"20",X"08",X"1B",X"23",X"7E",X"3D",X"28",X"06",X"18",X"F4",X"21",X"F9",X"8D",X"34",X"F1",X"C9", + X"51",X"3A",X"3B",X"20",X"3D",X"88",X"05",X"3A",X"41",X"20",X"A7",X"88",X"06",X"3A",X"01",X"42", + X"37",X"28",X"CD",X"13",X"6B",X"DD",X"21",X"78",X"8C",X"CD",X"FB",X"64",X"DD",X"21",X"E0",X"8A", + X"FD",X"21",X"78",X"8C",X"CD",X"C5",X"66",X"CD",X"22",X"68",X"C9",X"DD",X"7E",X"02",X"EF",X"05", + X"65",X"66",X"65",X"66",X"66",X"21",X"29",X"89",X"36",X"1C",X"11",X"E8",X"FF",X"06",X"03",X"2E", + X"2B",X"36",X"08",X"D9",X"CD",X"23",X"65",X"D9",X"DD",X"34",X"02",X"DD",X"19",X"10",X"F4",X"CD", + X"88",X"0F",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D8",X"3A",X"F0",X"8E",X"A7",X"C0", + X"DD",X"36",X"00",X"01",X"DD",X"77",X"03",X"DD",X"77",X"05",X"DD",X"36",X"04",X"15",X"3A",X"29", + X"89",X"DD",X"77",X"06",X"D6",X"02",X"32",X"29",X"89",X"DD",X"36",X"0F",X"03",X"DD",X"36",X"10", + X"C0",X"DD",X"36",X"08",X"30",X"DD",X"36",X"09",X"F0",X"11",X"11",X"06",X"FF",X"3A",X"07",X"89", + X"A7",X"C0",X"1E",X"07",X"FF",X"C9",X"21",X"2F",X"89",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"2E", + X"2C",X"34",X"CB",X"46",X"2E",X"2F",X"20",X"1E",X"36",X"06",X"DD",X"7E",X"03",X"DD",X"86",X"08", + X"30",X"09",X"DD",X"34",X"04",X"DD",X"34",X"EC",X"DD",X"34",X"D4",X"DD",X"77",X"03",X"DD",X"77", + X"EB",X"DD",X"77",X"D3",X"18",X"54",X"36",X"0C",X"DD",X"7E",X"03",X"DD",X"96",X"08",X"30",X"09", + X"DD",X"35",X"04",X"DD",X"35",X"EC",X"DD",X"35",X"D4",X"DD",X"77",X"03",X"DD",X"77",X"EB",X"DD", + X"77",X"D3",X"DD",X"7E",X"05",X"DD",X"96",X"09",X"DD",X"77",X"05",X"DD",X"77",X"ED",X"DD",X"77", + X"D5",X"30",X"12",X"DD",X"7E",X"06",X"D6",X"01",X"DD",X"77",X"06",X"D6",X"02",X"DD",X"77",X"EE", + X"D6",X"02",X"DD",X"77",X"D6",X"2E",X"2C",X"CB",X"46",X"21",X"BF",X"66",X"28",X"03",X"21",X"C2", + X"66",X"11",X"E8",X"FF",X"06",X"03",X"CD",X"14",X"25",X"C9",X"DD",X"21",X"78",X"8C",X"DD",X"7E", + X"06",X"FE",X"0C",X"D0",X"3E",X"40",X"DD",X"77",X"10",X"DD",X"77",X"F8",X"DD",X"77",X"E0",X"3E", + X"18",X"DD",X"77",X"09",X"DD",X"77",X"F1",X"DD",X"77",X"D9",X"3E",X"02",X"DD",X"77",X"02",X"DD", + X"77",X"EA",X"DD",X"77",X"D2",X"32",X"30",X"89",X"32",X"2E",X"89",X"FD",X"21",X"BC",X"82",X"11", + X"00",X"00",X"06",X"0A",X"FD",X"7E",X"00",X"FD",X"BE",X"E0",X"C2",X"84",X"52",X"83",X"5F",X"30", + X"01",X"14",X"FD",X"7D",X"D6",X"20",X"FD",X"6F",X"30",X"02",X"FD",X"25",X"10",X"E6",X"06",X"0A", + X"3E",X"04",X"FD",X"84",X"FD",X"67",X"EB",X"FD",X"5D",X"FD",X"54",X"EB",X"7E",X"83",X"30",X"01", + X"14",X"5F",X"7D",X"C6",X"20",X"30",X"01",X"24",X"6F",X"10",X"F1",X"7B",X"FE",X"2A",X"C2",X"14", + X"60",X"15",X"C2",X"05",X"20",X"C9",X"11",X"E8",X"FF",X"06",X"03",X"D9",X"CD",X"7C",X"66",X"D9", + X"DD",X"19",X"10",X"F7",X"DD",X"21",X"78",X"8C",X"CD",X"A1",X"66",X"C9",X"DD",X"7E",X"01",X"A7", + X"C0",X"DD",X"7E",X"05",X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"DD", + X"7E",X"06",X"FE",X"1D",X"D8",X"DD",X"36",X"01",X"02",X"AF",X"DD",X"77",X"04",X"DD",X"77",X"06", + X"C9",X"21",X"2B",X"89",X"35",X"7E",X"A7",X"C0",X"36",X"08",X"23",X"34",X"CB",X"46",X"21",X"BF", + X"66",X"28",X"03",X"21",X"C2",X"66",X"11",X"E8",X"FF",X"06",X"03",X"CD",X"14",X"25",X"C9",X"03", + X"03",X"03",X"09",X"09",X"09",X"11",X"18",X"00",X"06",X"03",X"D9",X"CD",X"F1",X"66",X"D9",X"DD", + X"19",X"10",X"F7",X"3A",X"E2",X"8A",X"A7",X"C8",X"21",X"2D",X"89",X"7E",X"A7",X"28",X"02",X"35", + X"C9",X"36",X"10",X"23",X"23",X"34",X"CB",X"46",X"11",X"12",X"06",X"20",X"02",X"1E",X"92",X"FF", + X"C9",X"DD",X"7E",X"02",X"EF",X"FD",X"66",X"2A",X"67",X"A0",X"67",X"DF",X"67",X"3A",X"30",X"89", + X"A7",X"C8",X"21",X"2E",X"89",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"36",X"12",X"DD",X"34",X"02", + X"AF",X"DD",X"77",X"03",X"DD",X"77",X"05",X"DD",X"36",X"04",X"15",X"DD",X"36",X"06",X"02",X"11", + X"29",X"38",X"CD",X"1E",X"38",X"DD",X"36",X"09",X"2C",X"C9",X"CD",X"06",X"40",X"DD",X"7E",X"05", + X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"FE",X"18", + X"30",X"50",X"FD",X"21",X"48",X"8C",X"11",X"18",X"00",X"06",X"03",X"FD",X"7E",X"01",X"A7",X"20", + X"08",X"DD",X"7E",X"06",X"FD",X"BE",X"06",X"28",X"05",X"FD",X"19",X"10",X"EE",X"C9",X"21",X"03", + X"89",X"34",X"FD",X"36",X"01",X"02",X"DD",X"7E",X"03",X"D6",X"80",X"30",X"03",X"FD",X"35",X"04", + X"FD",X"77",X"03",X"DD",X"7E",X"05",X"C6",X"40",X"30",X"03",X"FD",X"35",X"06",X"FD",X"77",X"05", + X"FD",X"36",X"0F",X"C0",X"FD",X"E5",X"E1",X"DD",X"75",X"07",X"DD",X"74",X"08",X"3E",X"20",X"32", + X"29",X"89",X"DD",X"34",X"02",X"DD",X"36",X"09",X"18",X"11",X"38",X"38",X"CD",X"1E",X"38",X"C9", + X"21",X"29",X"89",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"CD",X"06",X"40",X"DD",X"6E",X"07",X"DD", + X"66",X"08",X"7C",X"A7",X"28",X"11",X"E5",X"FD",X"E1",X"FD",X"7E",X"05",X"DD",X"96",X"09",X"30", + X"03",X"FD",X"35",X"06",X"FD",X"77",X"05",X"DD",X"7E",X"05",X"DD",X"96",X"09",X"30",X"03",X"DD", + X"35",X"06",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"FE",X"00",X"C0",X"DD",X"34",X"02",X"C9",X"21", + X"BC",X"82",X"11",X"E0",X"FF",X"01",X"00",X"0A",X"7E",X"81",X"4F",X"19",X"10",X"FA",X"3E",X"5A", + X"B9",X"20",X"AD",X"3E",X"01",X"32",X"04",X"89",X"32",X"08",X"88",X"32",X"0A",X"88",X"AF",X"21", + X"28",X"89",X"06",X"09",X"D7",X"21",X"80",X"8A",X"77",X"11",X"81",X"8A",X"01",X"40",X"02",X"ED", + X"B0",X"3E",X"10",X"21",X"42",X"84",X"0E",X"1D",X"06",X"1D",X"D7",X"23",X"23",X"23",X"0D",X"20", + X"F7",X"C9",X"3A",X"FA",X"8A",X"A7",X"C8",X"DD",X"21",X"E0",X"8A",X"11",X"48",X"00",X"DD",X"19", + X"DD",X"7E",X"02",X"EF",X"3A",X"68",X"57",X"68",X"AC",X"68",X"DD",X"34",X"02",X"AF",X"DD",X"77", + X"03",X"DD",X"77",X"05",X"DD",X"36",X"04",X"08",X"DD",X"36",X"06",X"1E",X"11",X"EF",X"68",X"CD", + X"1E",X"38",X"DD",X"36",X"09",X"18",X"C9",X"CD",X"06",X"40",X"DD",X"7E",X"05",X"DD",X"96",X"09", + X"30",X"03",X"DD",X"35",X"06",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"FE",X"1B",X"D0",X"DD",X"34", + X"02",X"21",X"BC",X"86",X"11",X"A3",X"68",X"01",X"00",X"08",X"1A",X"86",X"81",X"4F",X"13",X"7D", + X"D6",X"20",X"30",X"01",X"25",X"6F",X"10",X"F2",X"06",X"08",X"7C",X"D6",X"04",X"67",X"7E",X"81", + X"4F",X"7D",X"C6",X"20",X"30",X"01",X"24",X"10",X"F5",X"1A",X"81",X"C2",X"B3",X"08",X"11",X"13", + X"06",X"FF",X"C9",X"16",X"10",X"05",X"01",X"02",X"0F",X"03",X"07",X"B8",X"21",X"55",X"8F",X"7E", + X"A7",X"C0",X"34",X"21",X"02",X"84",X"11",X"00",X"00",X"7E",X"83",X"5F",X"30",X"01",X"14",X"2C", + X"7D",X"E6",X"1F",X"FE",X"1F",X"20",X"F2",X"7D",X"C6",X"03",X"6F",X"30",X"EC",X"24",X"7C",X"FE", + X"88",X"38",X"E6",X"21",X"EB",X"68",X"06",X"04",X"7B",X"BE",X"28",X"06",X"23",X"10",X"FA",X"C3", + X"D4",X"76",X"7A",X"23",X"BE",X"C8",X"10",X"FA",X"C3",X"29",X"38",X"43",X"95",X"89",X"87",X"40", + X"15",X"08",X"40",X"1E",X"08",X"FF",X"EF",X"68",X"CD",X"05",X"69",X"CD",X"AD",X"69",X"CD",X"0F", + X"6A",X"CD",X"7F",X"6A",X"C9",X"21",X"29",X"89",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"2E",X"2D", + X"7E",X"2E",X"03",X"BE",X"C8",X"FE",X"08",X"D0",X"DD",X"21",X"E0",X"8A",X"FD",X"21",X"A0",X"8B", + X"11",X"18",X"00",X"06",X"08",X"D9",X"CD",X"31",X"69",X"D9",X"DD",X"19",X"FD",X"19",X"10",X"F5", + X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D8",X"AF",X"DD",X"77",X"03",X"DD",X"77",X"05", + X"3C",X"DD",X"77",X"00",X"FD",X"77",X"00",X"DD",X"36",X"04",X"15",X"DD",X"36",X"06",X"1E",X"FD", + X"36",X"03",X"80",X"FD",X"36",X"05",X"A0",X"FD",X"36",X"04",X"14",X"FD",X"36",X"06",X"1E",X"FD", + X"36",X"0F",X"03",X"FD",X"36",X"10",X"40",X"DD",X"36",X"09",X"24",X"FD",X"36",X"09",X"24",X"11", + X"38",X"38",X"CD",X"1E",X"38",X"3E",X"10",X"32",X"29",X"89",X"3A",X"2D",X"89",X"A7",X"20",X"27", + X"11",X"25",X"06",X"FF",X"1E",X"0A",X"FF",X"21",X"3B",X"86",X"3A",X"03",X"89",X"47",X"AF",X"C6", + X"01",X"27",X"10",X"FB",X"5F",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"77",X"01",X"E0",X"FF",X"09", + X"7B",X"E6",X"0F",X"77",X"CD",X"97",X"0F",X"21",X"2D",X"89",X"34",X"F1",X"C9",X"DD",X"21",X"E0", + X"8A",X"FD",X"21",X"A0",X"8B",X"11",X"18",X"00",X"06",X"08",X"D9",X"CD",X"C6",X"69",X"D9",X"DD", + X"19",X"FD",X"19",X"10",X"F5",X"C9",X"DD",X"7E",X"00",X"A7",X"C8",X"DD",X"7E",X"02",X"A7",X"C0", + X"CD",X"06",X"40",X"FD",X"7E",X"05",X"FD",X"96",X"09",X"30",X"03",X"FD",X"35",X"06",X"FD",X"77", + X"05",X"DD",X"7E",X"05",X"DD",X"96",X"09",X"30",X"03",X"DD",X"35",X"06",X"DD",X"77",X"05",X"DD", + X"7E",X"06",X"FE",X"06",X"20",X"08",X"21",X"2B",X"89",X"7E",X"A7",X"C0",X"34",X"C9",X"FE",X"01", + X"D0",X"AF",X"DD",X"E5",X"E1",X"06",X"18",X"D7",X"FD",X"E5",X"E1",X"06",X"18",X"D7",X"C9",X"21", + X"2B",X"89",X"7E",X"A7",X"C8",X"23",X"7E",X"FE",X"06",X"C8",X"2E",X"2A",X"7E",X"A7",X"28",X"02", + X"35",X"C9",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"06",X"12",X"D9",X"CD",X"35",X"6A",X"D9", + X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D8",X"AF",X"DD",X"77", + X"03",X"DD",X"77",X"05",X"3C",X"DD",X"77",X"01",X"DD",X"77",X"02",X"DD",X"36",X"04",X"15",X"DD", + X"36",X"06",X"1E",X"DD",X"36",X"09",X"28",X"21",X"2A",X"89",X"36",X"10",X"2E",X"2C",X"7E",X"34", + X"FE",X"02",X"28",X"0E",X"30",X"11",X"A7",X"28",X"04",X"2E",X"2A",X"36",X"1C",X"11",X"D4",X"76", + X"18",X"08",X"11",X"EF",X"68",X"18",X"03",X"11",X"0A",X"6B",X"CD",X"1E",X"38",X"F1",X"C9",X"3A", + X"2B",X"89",X"A7",X"28",X"40",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"06",X"12",X"D9",X"CD", + X"98",X"6A",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"01",X"A7",X"C8",X"DD",X"7E",X"02", + X"3D",X"E6",X"03",X"EF",X"A8",X"6A",X"DF",X"67",X"CD",X"06",X"40",X"DD",X"7E",X"05",X"DD",X"96", + X"09",X"30",X"03",X"DD",X"35",X"06",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"A7",X"C0",X"32",X"56", + X"8F",X"DD",X"34",X"02",X"C9",X"3A",X"2D",X"89",X"FE",X"02",X"C0",X"3A",X"56",X"8F",X"A7",X"C0", + X"3C",X"32",X"56",X"8F",X"21",X"50",X"84",X"11",X"00",X"00",X"7B",X"86",X"5F",X"30",X"01",X"14", + X"2C",X"7D",X"E6",X"1F",X"FE",X"1B",X"20",X"03",X"2C",X"18",X"EF",X"FE",X"1F",X"20",X"EB",X"3E", + X"12",X"85",X"6F",X"30",X"E5",X"24",X"7C",X"FE",X"88",X"38",X"DF",X"7B",X"FE",X"B8",X"28",X"03", + X"C3",X"29",X"09",X"7A",X"FE",X"29",X"C2",X"29",X"38",X"C9",X"C0",X"03",X"08",X"C0",X"09",X"08", + X"FF",X"0A",X"6B",X"21",X"06",X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"36",X"0C",X"23",X"34", + X"7E",X"E6",X"01",X"11",X"44",X"27",X"21",X"B4",X"84",X"28",X"03",X"11",X"48",X"27",X"D5",X"CD", + X"25",X"33",X"11",X"A0",X"FF",X"19",X"D1",X"CD",X"25",X"33",X"C9",X"3A",X"06",X"88",X"A7",X"C0", + X"3A",X"5F",X"8D",X"A7",X"C0",X"3A",X"07",X"89",X"E6",X"01",X"C0",X"21",X"5E",X"8D",X"7E",X"A7", + X"C8",X"FE",X"01",X"28",X"02",X"35",X"C9",X"3E",X"11",X"32",X"0A",X"88",X"32",X"5F",X"8D",X"3E", + X"FF",X"32",X"5E",X"8D",X"11",X"18",X"00",X"DD",X"21",X"E0",X"8A",X"FD",X"21",X"80",X"8D",X"06", + X"0B",X"DD",X"7E",X"04",X"E6",X"1F",X"FE",X"06",X"38",X"1D",X"FE",X"1A",X"30",X"19",X"DD",X"E5", + X"E1",X"FD",X"75",X"00",X"FD",X"74",X"01",X"DD",X"7E",X"06",X"FD",X"77",X"02",X"DD",X"36",X"06", + X"00",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"DD",X"19",X"10",X"D6",X"11",X"2B",X"06",X"FF",X"11", + X"2C",X"06",X"FF",X"11",X"2D",X"06",X"FF",X"11",X"2E",X"06",X"FF",X"11",X"2F",X"06",X"FF",X"C3", + X"EF",X"02",X"21",X"5E",X"8D",X"35",X"C0",X"FD",X"21",X"80",X"8D",X"11",X"03",X"00",X"06",X"0B", + X"AF",X"FD",X"66",X"01",X"B4",X"28",X"09",X"FD",X"6E",X"00",X"FD",X"7E",X"02",X"19",X"19",X"77", + X"FD",X"19",X"10",X"EC",X"3E",X"04",X"32",X"0A",X"88",X"11",X"AB",X"06",X"FF",X"11",X"AC",X"06", + X"FF",X"11",X"AD",X"06",X"FF",X"11",X"AE",X"06",X"FF",X"11",X"AF",X"06",X"18",X"C0",X"3A",X"52", + X"8D",X"A7",X"28",X"20",X"21",X"87",X"8A",X"3D",X"28",X"0D",X"CB",X"DE",X"CB",X"96",X"21",X"53", + X"8D",X"35",X"C0",X"AF",X"2D",X"77",X"C9",X"CB",X"D6",X"CB",X"9E",X"21",X"53",X"8D",X"35",X"C0", + X"AF",X"2D",X"77",X"C9",X"CD",X"18",X"6C",X"C9",X"DD",X"21",X"40",X"88",X"FD",X"21",X"7C",X"88", + X"21",X"E8",X"8B",X"06",X"03",X"CD",X"3F",X"6C",X"11",X"04",X"00",X"FD",X"19",X"1E",X"18",X"19", + X"10",X"F3",X"21",X"87",X"8A",X"CB",X"96",X"CB",X"9E",X"21",X"54",X"8D",X"36",X"00",X"C9",X"CB", + X"46",X"C8",X"1E",X"10",X"16",X"00",X"DD",X"7E",X"00",X"83",X"5F",X"DD",X"7E",X"02",X"82",X"57", + X"FD",X"7E",X"00",X"C6",X"20",X"93",X"30",X"02",X"ED",X"44",X"FE",X"18",X"D0",X"0E",X"00",X"FD", + X"7E",X"02",X"C6",X"08",X"92",X"30",X"04",X"0E",X"FF",X"ED",X"44",X"FE",X"0E",X"D0",X"21",X"54", + X"8D",X"36",X"01",X"DD",X"7E",X"02",X"21",X"87",X"8A",X"0C",X"20",X"13",X"FE",X"B6",X"38",X"1B", + X"CB",X"D6",X"CB",X"9E",X"0E",X"01",X"21",X"52",X"8D",X"71",X"2C",X"36",X"18",X"F1",X"C9",X"FE", + X"51",X"30",X"12",X"CB",X"DE",X"CB",X"96",X"0E",X"02",X"18",X"EB",X"FE",X"51",X"38",X"F4",X"CB", + X"DE",X"CB",X"96",X"F1",X"C9",X"CB",X"D6",X"CB",X"9E",X"F1",X"C9",X"3A",X"06",X"88",X"A7",X"C0", + X"3A",X"32",X"8D",X"A7",X"C0",X"3A",X"24",X"8F",X"A7",X"21",X"87",X"8A",X"28",X"03",X"AF",X"77", + X"C9",X"CD",X"EE",X"6B",X"3A",X"54",X"8D",X"A7",X"C0",X"21",X"87",X"8A",X"3A",X"30",X"8F",X"FE", + X"01",X"28",X"3A",X"3A",X"41",X"8F",X"A7",X"C2",X"4D",X"6D",X"21",X"42",X"88",X"DD",X"21",X"E0", + X"8A",X"FD",X"21",X"52",X"88",X"06",X"06",X"DD",X"7E",X"00",X"A7",X"20",X"2A",X"11",X"18",X"00", + X"DD",X"19",X"11",X"04",X"00",X"FD",X"19",X"10",X"EE",X"3A",X"41",X"8F",X"A7",X"C8",X"3A",X"42", + X"88",X"4F",X"ED",X"5B",X"41",X"8F",X"21",X"87",X"8A",X"1A",X"B9",X"30",X"05",X"CB",X"D6",X"CB", + X"9E",X"C9",X"CB",X"DE",X"CB",X"96",X"C9",X"FD",X"7E",X"00",X"FE",X"40",X"38",X"CF",X"FE",X"C0", + X"30",X"CB",X"96",X"30",X"01",X"2F",X"4F",X"3A",X"40",X"8F",X"A7",X"28",X"04",X"B9",X"30",X"BD", + X"79",X"32",X"40",X"8F",X"FD",X"E5",X"D1",X"7B",X"32",X"41",X"8F",X"7A",X"32",X"42",X"8F",X"DD", + X"E5",X"D1",X"13",X"7B",X"32",X"43",X"8F",X"7A",X"32",X"44",X"8F",X"18",X"A0",X"2A",X"43",X"8F", + X"7E",X"A7",X"20",X"0C",X"2A",X"41",X"8F",X"7E",X"FE",X"40",X"38",X"04",X"FE",X"C0",X"38",X"08", + X"AF",X"21",X"40",X"8F",X"06",X"05",X"D7",X"C9",X"4F",X"3A",X"07",X"89",X"CB",X"47",X"3A",X"42", + X"88",X"20",X"04",X"D6",X"02",X"18",X"02",X"C6",X"14",X"21",X"87",X"8A",X"47",X"3A",X"03",X"8F", + X"3C",X"32",X"03",X"8F",X"E6",X"07",X"20",X"0D",X"78",X"C6",X"08",X"B9",X"38",X"07",X"D6",X"10", + X"B9",X"3E",X"10",X"38",X"01",X"AF",X"77",X"78",X"B9",X"28",X"06",X"DA",X"12",X"6D",X"C3",X"0D", + X"6D",X"CB",X"96",X"CB",X"9E",X"C9",X"3A",X"51",X"8F",X"EF",X"B8",X"6D",X"59",X"6E",X"42",X"6F", + X"5E",X"6F",X"9D",X"6F",X"32",X"70",X"5F",X"70",X"CD",X"BC",X"0F",X"3A",X"07",X"89",X"CB",X"3F", + X"CB",X"3F",X"FE",X"07",X"38",X"02",X"3E",X"07",X"E6",X"07",X"21",X"F3",X"70",X"CD",X"45",X"0C", + X"ED",X"53",X"4A",X"8F",X"3E",X"40",X"32",X"48",X"8F",X"21",X"51",X"8F",X"34",X"3A",X"07",X"89", + X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"D0",X"21",X"C8",X"0A",X"11",X"F9",X"6D",X"06",X"60",X"1A", + X"BE",X"C2",X"71",X"70",X"23",X"13",X"10",X"F7",X"C9",X"21",X"41",X"8D",X"35",X"20",X"03",X"CD", + X"28",X"0A",X"CD",X"F8",X"09",X"21",X"50",X"8E",X"35",X"C0",X"36",X"02",X"2A",X"54",X"8E",X"7E", + X"23",X"22",X"54",X"8E",X"2A",X"56",X"8E",X"77",X"11",X"E0",X"FF",X"19",X"22",X"56",X"8E",X"21", + X"52",X"8E",X"35",X"C0",X"36",X"0D",X"21",X"50",X"8E",X"36",X"14",X"2C",X"34",X"2A",X"56",X"8E", + X"11",X"00",X"00",X"06",X"0E",X"7E",X"83",X"5F",X"30",X"01",X"14",X"3E",X"20",X"85",X"6F",X"30", + X"01",X"24",X"10",X"F1",X"2A",X"48",X"8F",X"7E",X"BB",X"C2",X"42",X"74",X"23",X"7E",X"BA",X"C2", + X"EA",X"76",X"23",X"22",X"48",X"8F",X"C9",X"C6",X"01",X"CD",X"83",X"15",X"CD",X"75",X"6E",X"CD", + X"55",X"1E",X"CD",X"D4",X"20",X"CD",X"EF",X"02",X"CD",X"DA",X"18",X"CD",X"1C",X"19",X"CD",X"04", + X"64",X"CD",X"64",X"0E",X"C9",X"21",X"1E",X"88",X"3A",X"F0",X"8E",X"B6",X"C2",X"92",X"4C",X"CD", + X"86",X"6E",X"CD",X"DB",X"6E",X"C9",X"21",X"48",X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"3A", + X"49",X"8F",X"CB",X"4F",X"3E",X"20",X"28",X"02",X"3E",X"2C",X"77",X"2A",X"4A",X"8F",X"7E",X"FE", + X"FF",X"C8",X"23",X"22",X"4A",X"8F",X"47",X"DD",X"21",X"C8",X"8A",X"11",X"18",X"00",X"DD",X"19", + X"10",X"FC",X"21",X"EA",X"8B",X"11",X"18",X"00",X"06",X"03",X"7E",X"A7",X"28",X"0B",X"19",X"10", + X"F9",X"2A",X"4A",X"8F",X"2B",X"22",X"4A",X"8F",X"C9",X"DD",X"36",X"02",X"06",X"11",X"6A",X"39", + X"CD",X"1E",X"38",X"CD",X"6C",X"3A",X"21",X"49",X"8F",X"34",X"C9",X"DD",X"21",X"E0",X"8A",X"11", + X"18",X"00",X"06",X"0E",X"D9",X"CD",X"2D",X"6F",X"D9",X"DD",X"19",X"10",X"F7",X"2A",X"4A",X"8F", + X"7E",X"FE",X"FF",X"C0",X"21",X"EA",X"8B",X"11",X"18",X"00",X"06",X"03",X"7E",X"A7",X"C0",X"19", + X"10",X"FA",X"21",X"51",X"8F",X"34",X"23",X"11",X"35",X"06",X"FF",X"3A",X"47",X"8F",X"47",X"CB", + X"27",X"80",X"BE",X"11",X"08",X"06",X"20",X"07",X"3E",X"04",X"32",X"51",X"8F",X"1E",X"10",X"3E", + X"40",X"32",X"48",X"8F",X"FF",X"AF",X"21",X"90",X"8C",X"06",X"30",X"D7",X"C9",X"DD",X"7E",X"02", + X"FE",X"02",X"CA",X"36",X"35",X"D6",X"0B",X"30",X"04",X"CD",X"06",X"40",X"C9",X"EF",X"69",X"3E", + X"9C",X"3E",X"21",X"51",X"8F",X"34",X"23",X"7E",X"A7",X"28",X"04",X"47",X"CD",X"31",X"11",X"21", + X"34",X"86",X"CD",X"19",X"11",X"09",X"09",X"7B",X"87",X"27",X"CD",X"19",X"11",X"C9",X"21",X"48", + X"8F",X"7E",X"FE",X"20",X"20",X"13",X"2E",X"52",X"7E",X"A7",X"28",X"0B",X"11",X"15",X"03",X"FF", + X"3A",X"E5",X"89",X"A7",X"C0",X"35",X"C0",X"2E",X"48",X"35",X"C0",X"36",X"60",X"3A",X"07",X"89", + X"FE",X"03",X"C2",X"98",X"6F",X"21",X"32",X"0B",X"11",X"71",X"70",X"06",X"79",X"1A",X"BE",X"C2", + X"F9",X"6D",X"23",X"13",X"10",X"F7",X"26",X"8F",X"2E",X"51",X"36",X"06",X"C9",X"3A",X"47",X"8F", + X"21",X"34",X"86",X"77",X"47",X"AF",X"C6",X"05",X"10",X"FC",X"32",X"47",X"8F",X"11",X"E0",X"FF", + X"06",X"03",X"19",X"36",X"00",X"10",X"FB",X"21",X"51",X"8F",X"34",X"2E",X"48",X"36",X"80",X"DD", + X"21",X"C5",X"6A",X"21",X"ED",X"6F",X"06",X"44",X"DD",X"7E",X"00",X"BE",X"20",X"14",X"DD",X"2C", + X"DD",X"7D",X"A7",X"20",X"02",X"DD",X"24",X"23",X"10",X"EE",X"CD",X"44",X"0F",X"11",X"27",X"06", + X"FF",X"C9",X"AF",X"21",X"00",X"88",X"11",X"01",X"88",X"77",X"ED",X"B0",X"C9",X"3A",X"2D",X"89", + X"FE",X"02",X"C0",X"3A",X"56",X"8F",X"A7",X"C0",X"3C",X"32",X"56",X"8F",X"21",X"50",X"84",X"11", + X"00",X"00",X"7B",X"86",X"5F",X"30",X"01",X"14",X"2C",X"7D",X"E6",X"1F",X"FE",X"1B",X"20",X"03", + X"2C",X"18",X"EF",X"FE",X"1F",X"20",X"EB",X"3E",X"12",X"85",X"6F",X"30",X"E5",X"24",X"7C",X"FE", + X"88",X"38",X"DF",X"7B",X"FE",X"B8",X"28",X"03",X"C3",X"29",X"09",X"7A",X"FE",X"29",X"C2",X"29", + X"38",X"C9",X"21",X"47",X"8F",X"7E",X"A7",X"C4",X"59",X"70",X"23",X"7E",X"A7",X"28",X"14",X"35", + X"7E",X"E6",X"0F",X"A7",X"C0",X"2E",X"54",X"34",X"CB",X"46",X"11",X"A7",X"06",X"28",X"02",X"1E", + X"27",X"FF",X"C9",X"36",X"20",X"2E",X"51",X"34",X"C9",X"35",X"11",X"15",X"03",X"FF",X"C9",X"21", + X"48",X"8F",X"35",X"C0",X"CD",X"CF",X"0E",X"AF",X"32",X"52",X"8F",X"3E",X"06",X"32",X"0A",X"88", + X"C9",X"21",X"BC",X"82",X"11",X"E0",X"FF",X"06",X"0A",X"7E",X"19",X"BE",X"C2",X"B3",X"08",X"10", + X"F8",X"21",X"41",X"8D",X"35",X"20",X"03",X"CD",X"28",X"0A",X"CD",X"F8",X"09",X"21",X"50",X"8E", + X"35",X"C0",X"36",X"01",X"2C",X"35",X"3A",X"53",X"8E",X"3D",X"21",X"AB",X"0B",X"CD",X"45",X"0C", + X"ED",X"53",X"56",X"8E",X"21",X"53",X"8E",X"35",X"C0",X"21",X"50",X"8E",X"36",X"96",X"2C",X"AF", + X"77",X"21",X"62",X"84",X"57",X"5F",X"0E",X"0E",X"06",X"1D",X"7B",X"86",X"30",X"01",X"14",X"5F", + X"23",X"10",X"F7",X"7D",X"C6",X"03",X"6F",X"30",X"01",X"24",X"0D",X"20",X"EB",X"2A",X"48",X"8F", + X"7B",X"BE",X"C2",X"B3",X"08",X"23",X"7E",X"BA",X"C2",X"E9",X"08",X"AF",X"32",X"48",X"8F",X"32", + X"49",X"8F",X"3E",X"03",X"32",X"05",X"88",X"C3",X"00",X"0E",X"59",X"63",X"0C",X"C2",X"0B",X"62", + X"0B",X"22",X"0B",X"03",X"71",X"13",X"71",X"26",X"71",X"3C",X"71",X"55",X"71",X"6E",X"71",X"87", + X"71",X"A0",X"71",X"01",X"02",X"03",X"04",X"05",X"05",X"05",X"04",X"04",X"03",X"03",X"02",X"02", + X"01",X"01",X"FF",X"01",X"01",X"02",X"02",X"03",X"03",X"04",X"04",X"05",X"05",X"06",X"06",X"06", + X"05",X"04",X"03",X"02",X"01",X"FF",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"07",X"06",X"05", + X"04",X"03",X"02",X"03",X"04",X"02",X"03",X"04",X"05",X"06",X"07",X"FF",X"01",X"01",X"02",X"02", + X"03",X"03",X"04",X"04",X"05",X"05",X"06",X"06",X"07",X"07",X"08",X"08",X"08",X"07",X"06",X"05", + X"04",X"03",X"04",X"05",X"FF",X"01",X"02",X"03",X"02",X"04",X"05",X"03",X"02",X"04",X"04",X"05", + X"05",X"06",X"06",X"07",X"07",X"08",X"08",X"08",X"07",X"06",X"05",X"04",X"03",X"FF",X"01",X"02", + X"03",X"04",X"05",X"06",X"07",X"08",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"01",X"02", + X"03",X"04",X"05",X"06",X"07",X"08",X"FF",X"03",X"02",X"02",X"01",X"01",X"02",X"03",X"02",X"03", + X"04",X"05",X"06",X"06",X"05",X"04",X"04",X"05",X"06",X"07",X"08",X"08",X"07",X"07",X"08",X"FF", + X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"08",X"08",X"07",X"07",X"06",X"06",X"05",X"05", + X"04",X"04",X"03",X"03",X"02",X"02",X"01",X"01",X"FF",X"3A",X"38",X"8F",X"21",X"EF",X"02",X"E5", + X"EF",X"C7",X"71",X"A0",X"72",X"21",X"74",X"CD",X"CE",X"71",X"CD",X"D4",X"20",X"C9",X"21",X"36", + X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"21",X"99",X"8A",X"3A",X"90",X"8C",X"B6",X"21",X"87", + X"8A",X"20",X"1A",X"3A",X"5B",X"8F",X"A7",X"20",X"0F",X"3A",X"84",X"8A",X"FE",X"60",X"38",X"03", + X"32",X"5B",X"8F",X"CB",X"96",X"CB",X"DE",X"C9",X"CB",X"D6",X"CB",X"9E",X"C9",X"3A",X"84",X"8A", + X"FE",X"59",X"28",X"07",X"30",X"DD",X"CB",X"96",X"CB",X"DE",X"C9",X"3A",X"39",X"8F",X"A7",X"20", + X"0A",X"3E",X"01",X"32",X"39",X"8F",X"CB",X"96",X"CB",X"9E",X"C9",X"FE",X"02",X"28",X"0B",X"3E", + X"02",X"32",X"39",X"8F",X"3E",X"10",X"32",X"87",X"8A",X"C9",X"21",X"3E",X"8F",X"7E",X"A7",X"C2", + X"92",X"72",X"2E",X"3B",X"34",X"7E",X"E6",X"07",X"C2",X"87",X"72",X"3A",X"96",X"8C",X"CB",X"3F", + X"CB",X"3F",X"CB",X"3F",X"3C",X"47",X"21",X"E0",X"87",X"11",X"E0",X"FF",X"19",X"10",X"FD",X"CD", + X"87",X"72",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"3C",X"47",X"23",X"10",X"FD",X"36",X"2C",X"11", + X"00",X"FC",X"19",X"3A",X"96",X"8C",X"E6",X"06",X"FE",X"06",X"3A",X"94",X"8C",X"28",X"0C",X"E6", + X"06",X"FE",X"02",X"28",X"03",X"36",X"00",X"C9",X"36",X"40",X"C9",X"E6",X"06",X"FE",X"02",X"28", + X"03",X"36",X"80",X"C9",X"36",X"C0",X"C9",X"3A",X"94",X"8C",X"FE",X"D0",X"D8",X"3E",X"01",X"32", + X"3E",X"8F",X"AF",X"32",X"87",X"8A",X"32",X"5B",X"8F",X"21",X"38",X"8F",X"34",X"23",X"77",X"C9", + X"CD",X"D4",X"20",X"CD",X"A7",X"72",X"C9",X"21",X"3A",X"8F",X"7E",X"A7",X"20",X"04",X"CD",X"E1", + X"72",X"C9",X"3A",X"3C",X"8F",X"A7",X"CA",X"E3",X"73",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00", + X"3A",X"3D",X"8F",X"87",X"47",X"D9",X"CD",X"CF",X"72",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD", + X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"EF",X"3C",X"73",X"95",X"73",X"CE", + X"73",X"3A",X"90",X"8C",X"A7",X"C0",X"3C",X"32",X"3A",X"8F",X"21",X"3D",X"8F",X"34",X"7E",X"FE", + X"04",X"20",X"08",X"2E",X"38",X"34",X"2E",X"36",X"36",X"20",X"C9",X"87",X"32",X"3C",X"8F",X"47", + X"21",X"09",X"74",X"11",X"18",X"00",X"DD",X"21",X"E0",X"8A",X"DD",X"36",X"00",X"01",X"7E",X"DD", + X"77",X"06",X"23",X"7E",X"DD",X"77",X"10",X"23",X"7E",X"DD",X"77",X"04",X"23",X"7E",X"DD",X"77", + X"0F",X"23",X"DD",X"7D",X"CB",X"5F",X"28",X"04",X"DD",X"36",X"03",X"80",X"DD",X"36",X"05",X"80", + X"DD",X"19",X"10",X"D6",X"78",X"21",X"38",X"8F",X"77",X"23",X"77",X"C9",X"3A",X"96",X"8C",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"DD",X"BE",X"06",X"28",X"05",X"3C",X"DD",X"BE",X"06",X"C0",X"3A", + X"94",X"8C",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6",X"04",X"DD",X"BE",X"04",X"28",X"07",X"D8", + X"D6",X"05",X"DD",X"BE",X"04",X"D0",X"DD",X"34",X"02",X"DD",X"7D",X"CB",X"5F",X"20",X"1B",X"11", + X"86",X"40",X"CD",X"1E",X"38",X"DD",X"36",X"09",X"40",X"21",X"39",X"8F",X"34",X"3A",X"3D",X"8F", + X"BE",X"C0",X"7E",X"11",X"30",X"06",X"83",X"5F",X"FF",X"C9",X"11",X"03",X"74",X"CD",X"1E",X"38", + X"DD",X"36",X"09",X"38",X"C9",X"CD",X"06",X"40",X"DD",X"7D",X"CB",X"5F",X"20",X"18",X"DD",X"7E", + X"03",X"DD",X"86",X"09",X"DD",X"77",X"03",X"30",X"03",X"DD",X"34",X"04",X"DD",X"7E",X"04",X"FE", + X"1D",X"D8",X"DD",X"34",X"02",X"C9",X"DD",X"7E",X"03",X"DD",X"96",X"09",X"DD",X"77",X"03",X"30", + X"03",X"DD",X"35",X"04",X"DD",X"7E",X"04",X"FE",X"04",X"D0",X"DD",X"34",X"02",X"C9",X"DD",X"7D", + X"6F",X"DD",X"7C",X"67",X"AF",X"06",X"18",X"D7",X"21",X"3C",X"8F",X"35",X"C0",X"3E",X"30",X"32", + X"36",X"8F",X"C9",X"21",X"36",X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"3A",X"3D",X"8F",X"A7", + X"28",X"06",X"11",X"B0",X"06",X"83",X"5F",X"FF",X"3E",X"18",X"32",X"36",X"8F",X"AF",X"21",X"3A", + X"8F",X"77",X"C9",X"40",X"21",X"10",X"FF",X"03",X"74",X"0D",X"40",X"0D",X"29",X"0D",X"40",X"0B", + X"21",X"09",X"40",X"15",X"29",X"09",X"40",X"13",X"21",X"13",X"40",X"0C",X"29",X"13",X"40",X"0A", + X"21",X"21",X"36",X"8F",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"21",X"37",X"8F",X"06",X"09",X"D7", + X"21",X"E0",X"8A",X"06",X"48",X"D7",X"32",X"0A",X"88",X"32",X"5B",X"8F",X"3E",X"07",X"32",X"51", + X"8E",X"C9",X"3A",X"21",X"89",X"E6",X"03",X"EF",X"4E",X"74",X"17",X"75",X"5D",X"75",X"AF",X"32", + X"B7",X"88",X"11",X"F0",X"4A",X"21",X"E1",X"43",X"22",X"BA",X"88",X"ED",X"53",X"45",X"8F",X"21", + X"42",X"84",X"22",X"B8",X"88",X"21",X"42",X"80",X"22",X"43",X"8F",X"21",X"21",X"89",X"34",X"21", + X"9A",X"74",X"11",X"00",X"00",X"06",X"08",X"1A",X"BE",X"C2",X"86",X"74",X"23",X"13",X"10",X"F7", + X"DD",X"21",X"92",X"00",X"06",X"74",X"DD",X"7E",X"00",X"BE",X"C2",X"DF",X"67",X"23",X"DD",X"2C", + X"DD",X"7D",X"A7",X"20",X"02",X"DD",X"24",X"10",X"ED",X"C9",X"AF",X"32",X"80",X"A1",X"C3",X"92", + X"00",X"FF",X"32",X"00",X"A0",X"31",X"00",X"90",X"32",X"00",X"88",X"06",X"08",X"C5",X"21",X"00", + X"00",X"DD",X"21",X"79",X"00",X"11",X"00",X"00",X"4A",X"7B",X"86",X"5F",X"30",X"04",X"14",X"20", + X"01",X"0C",X"2C",X"20",X"F4",X"24",X"7C",X"E6",X"0F",X"20",X"EE",X"32",X"00",X"A0",X"7B",X"DD", + X"BE",X"00",X"20",X"0C",X"7A",X"DD",X"BE",X"01",X"20",X"06",X"79",X"DD",X"BE",X"02",X"28",X"02", + X"18",X"06",X"E5",X"21",X"FF",X"8F",X"34",X"E1",X"DD",X"23",X"DD",X"23",X"DD",X"23",X"10",X"C5", + X"3A",X"E0",X"A0",X"E6",X"0F",X"21",X"69",X"00",X"E7",X"7E",X"B7",X"18",X"16",X"57",X"E6",X"0F", + X"5F",X"AA",X"0F",X"0F",X"0F",X"0F",X"CD",X"FA",X"00",X"7B",X"FE",X"0A",X"38",X"02",X"C6",X"07", + X"77",X"09",X"C9",X"32",X"00",X"A0",X"CD",X"CD",X"81",X"43",X"21",X"B7",X"88",X"34",X"7E",X"FE", + X"1C",X"C0",X"21",X"20",X"89",X"7E",X"34",X"A7",X"32",X"B7",X"88",X"C8",X"21",X"BC",X"82",X"11", + X"00",X"00",X"0E",X"02",X"06",X"0E",X"7E",X"83",X"5F",X"30",X"01",X"14",X"7D",X"D6",X"20",X"6F", + X"30",X"01",X"25",X"10",X"F1",X"0D",X"21",X"BC",X"86",X"20",X"E9",X"7B",X"FE",X"4F",X"C2",X"E1", + X"43",X"15",X"C2",X"2C",X"46",X"21",X"21",X"89",X"34",X"CD",X"B2",X"0F",X"C9",X"CD",X"6D",X"75", + X"CD",X"21",X"76",X"CD",X"13",X"6B",X"CD",X"AF",X"76",X"CD",X"EF",X"02",X"C9",X"21",X"29",X"89", + X"7E",X"A7",X"28",X"02",X"35",X"C9",X"3A",X"2D",X"89",X"FE",X"08",X"C8",X"DD",X"21",X"E0",X"8A", + X"FD",X"21",X"70",X"8B",X"11",X"18",X"00",X"06",X"08",X"D9",X"CD",X"95",X"75",X"D9",X"DD",X"19", + X"FD",X"19",X"10",X"F5",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D8",X"DD",X"36",X"00", + X"01",X"AF",X"DD",X"77",X"03",X"DD",X"77",X"05",X"DD",X"36",X"04",X"15",X"DD",X"36",X"06",X"1E", + X"3A",X"2D",X"89",X"FE",X"02",X"38",X"31",X"AF",X"FD",X"77",X"03",X"FD",X"77",X"05",X"FD",X"36", + X"04",X"14",X"FD",X"36",X"06",X"1E",X"21",X"18",X"76",X"3A",X"22",X"89",X"E7",X"FD",X"77",X"17", + X"21",X"57",X"56",X"CD",X"45",X"0C",X"FD",X"73",X"0C",X"FD",X"72",X"0D",X"FD",X"36",X"09",X"18", + X"FD",X"36",X"00",X"01",X"21",X"22",X"89",X"34",X"DD",X"36",X"09",X"18",X"3A",X"2D",X"89",X"FE", + X"02",X"38",X"02",X"3E",X"02",X"21",X"1E",X"76",X"E7",X"32",X"29",X"89",X"21",X"2D",X"89",X"34", + X"7E",X"FE",X"03",X"11",X"DD",X"76",X"30",X"03",X"11",X"D4",X"76",X"CD",X"1E",X"38",X"3A",X"2D", + X"89",X"87",X"87",X"FD",X"77",X"11",X"F1",X"C9",X"03",X"04",X"02",X"00",X"01",X"03",X"16",X"28", + X"12",X"06",X"0E",X"18",X"02",X"06",X"08",X"DD",X"21",X"E0",X"8A",X"11",X"18",X"00",X"D9",X"CD", + X"38",X"76",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"02",X"E6",X"03",X"EF",X"44",X"76", + X"75",X"76",X"A6",X"76",X"DD",X"7E",X"00",X"A7",X"C8",X"CD",X"06",X"40",X"DD",X"7E",X"05",X"DD", + X"96",X"09",X"30",X"03",X"DD",X"35",X"06",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"FE",X"06",X"D0", + X"3E",X"20",X"32",X"2E",X"89",X"11",X"18",X"00",X"06",X"0E",X"3E",X"01",X"DD",X"77",X"02",X"DD", + X"19",X"10",X"F9",X"F1",X"C9",X"CD",X"06",X"40",X"21",X"2E",X"89",X"7E",X"A7",X"28",X"02",X"35", + X"C9",X"3E",X"02",X"21",X"E2",X"8A",X"11",X"18",X"00",X"06",X"08",X"77",X"19",X"10",X"FC",X"AF", + X"21",X"A2",X"8B",X"11",X"18",X"00",X"06",X"06",X"77",X"19",X"10",X"FC",X"32",X"57",X"8D",X"3E", + X"08",X"32",X"51",X"8E",X"F1",X"C9",X"3A",X"58",X"8D",X"A7",X"C0",X"CD",X"06",X"40",X"C9",X"21", + X"2A",X"89",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"36",X"16",X"23",X"34",X"7E",X"E6",X"01",X"11", + X"E6",X"76",X"20",X"03",X"11",X"E8",X"76",X"21",X"71",X"84",X"01",X"40",X"00",X"1A",X"77",X"13", + X"09",X"1A",X"77",X"C9",X"45",X"0D",X"08",X"45",X"36",X"08",X"FF",X"D4",X"76",X"C0",X"03",X"08", + X"C0",X"09",X"08",X"FF",X"DD",X"76",X"3F",X"46",X"46",X"3F",X"CD",X"F4",X"76",X"CD",X"25",X"76", + X"CD",X"EF",X"02",X"C9",X"DD",X"21",X"A0",X"8B",X"11",X"18",X"00",X"06",X"06",X"D9",X"CD",X"07", + X"77",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D0",X"DD", + X"7E",X"02",X"E6",X"03",X"EF",X"1D",X"77",X"40",X"77",X"90",X"77",X"81",X"78",X"DD",X"35",X"11", + X"C0",X"21",X"57",X"8D",X"7E",X"4F",X"34",X"DD",X"77",X"13",X"79",X"21",X"69",X"78",X"87",X"E7", + X"DD",X"77",X"15",X"23",X"7E",X"DD",X"77",X"16",X"3E",X"EC",X"DD",X"77",X"0A",X"DD",X"34",X"02", + X"CD",X"06",X"40",X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"03",X"B8",X"30",X"03",X"DD", + X"35",X"04",X"DD",X"86",X"0A",X"DD",X"77",X"03",X"47",X"DD",X"7E",X"04",X"E6",X"1F",X"FE",X"09", + X"D0",X"DD",X"34",X"02",X"DD",X"36",X"11",X"18",X"CD",X"F1",X"0E",X"DD",X"7E",X"17",X"21",X"B1", + X"41",X"CD",X"45",X"0C",X"CD",X"1E",X"38",X"11",X"B3",X"0B",X"06",X"05",X"AF",X"6F",X"67",X"1A", + X"E6",X"1F",X"E7",X"13",X"10",X"F9",X"7D",X"84",X"C6",X"C7",X"C8",X"21",X"E9",X"89",X"34",X"C9", + X"CD",X"06",X"40",X"DD",X"35",X"11",X"C0",X"DD",X"7E",X"13",X"21",X"21",X"78",X"CD",X"45",X"0C", + X"DD",X"6E",X"15",X"DD",X"66",X"16",X"CD",X"0F",X"78",X"21",X"41",X"78",X"DD",X"7E",X"13",X"CD", + X"45",X"0C",X"DD",X"6E",X"15",X"DD",X"66",X"16",X"01",X"00",X"FC",X"09",X"CD",X"0F",X"78",X"21", + X"58",X"8D",X"7E",X"A7",X"20",X"02",X"36",X"01",X"AF",X"DD",X"77",X"00",X"DD",X"77",X"01",X"DD", + X"77",X"02",X"DD",X"77",X"03",X"DD",X"77",X"04",X"DD",X"77",X"05",X"DD",X"77",X"06",X"DD",X"77", + X"16",X"DD",X"7E",X"13",X"FE",X"05",X"D8",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"03",X"DD", + X"36",X"11",X"80",X"21",X"BC",X"82",X"11",X"E0",X"FF",X"01",X"00",X"0A",X"7E",X"19",X"BE",X"20", + X"74",X"81",X"4F",X"10",X"F7",X"C6",X"83",X"21",X"0E",X"78",X"BE",X"C2",X"34",X"23",X"C9",X"01", + X"E0",X"FF",X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"09",X"1A",X"77",X"2B",X"13",X"1A",X"77", + X"C9",X"2D",X"78",X"31",X"78",X"31",X"78",X"35",X"78",X"39",X"78",X"3D",X"78",X"0C",X"0D",X"0C", + X"0C",X"0C",X"0C",X"0C",X"0C",X"0E",X"0F",X"0F",X"0E",X"0C",X"3B",X"3B",X"0C",X"A4",X"A5",X"A4", + X"A5",X"4D",X"78",X"51",X"78",X"55",X"78",X"59",X"78",X"5D",X"78",X"61",X"78",X"00",X"00",X"C0", + X"80",X"03",X"43",X"C3",X"83",X"0D",X"4D",X"CD",X"8D",X"00",X"00",X"80",X"80",X"05",X"02",X"82", + X"85",X"00",X"00",X"C0",X"C0",X"07",X"0D",X"0E",X"0C",X"A8",X"86",X"68",X"86",X"28",X"86",X"E8", + X"85",X"A8",X"85",X"68",X"85",X"40",X"06",X"F0",X"FF",X"75",X"78",X"40",X"0B",X"F0",X"FF",X"75", + X"78",X"DD",X"35",X"11",X"C0",X"FD",X"21",X"00",X"79",X"21",X"79",X"07",X"11",X"00",X"00",X"0E", + X"09",X"06",X"20",X"7E",X"83",X"5F",X"30",X"01",X"14",X"23",X"10",X"F7",X"FD",X"7E",X"00",X"BB", + X"C2",X"0E",X"78",X"FD",X"7E",X"01",X"BA",X"C2",X"0E",X"78",X"FD",X"7D",X"C6",X"02",X"30",X"02", + X"FD",X"24",X"FD",X"6F",X"0D",X"20",X"DA",X"3E",X"02",X"32",X"51",X"8E",X"FD",X"21",X"48",X"85", + X"21",X"00",X"00",X"11",X"20",X"00",X"0E",X"04",X"06",X"0C",X"FD",X"7E",X"00",X"85",X"30",X"01", + X"24",X"6F",X"FD",X"19",X"10",X"F4",X"CB",X"41",X"20",X"08",X"11",X"E0",X"FF",X"FD",X"23",X"0D", + X"18",X"E6",X"0D",X"28",X"07",X"11",X"FF",X"FB",X"FD",X"19",X"18",X"F6",X"7D",X"84",X"C6",X"A6", + X"C2",X"20",X"03",X"21",X"E0",X"8A",X"AF",X"47",X"D7",X"06",X"37",X"D7",X"CD",X"C8",X"77",X"C9", + X"B8",X"02",X"94",X"03",X"21",X"05",X"EB",X"05",X"2A",X"09",X"40",X"0A",X"41",X"0C",X"A4",X"0C", + X"DB",X"0E",X"3A",X"06",X"88",X"A7",X"C8",X"3A",X"0D",X"88",X"A7",X"11",X"E1",X"89",X"21",X"30", + X"8A",X"28",X"04",X"2E",X"33",X"1E",X"E2",X"1A",X"A7",X"C0",X"23",X"7E",X"2B",X"CB",X"47",X"06", + X"3B",X"28",X"01",X"04",X"7E",X"B8",X"28",X"02",X"34",X"C9",X"36",X"00",X"23",X"34",X"7E",X"5F", + X"E6",X"0F",X"FE",X"0A",X"C0",X"7B",X"E6",X"F0",X"C6",X"10",X"FE",X"60",X"77",X"C0",X"36",X"00", + X"23",X"34",X"7E",X"5F",X"E6",X"0F",X"FE",X"0A",X"C0",X"7B",X"E6",X"F0",X"C6",X"10",X"77",X"C9", + X"11",X"09",X"06",X"FF",X"DD",X"21",X"01",X"29",X"21",X"00",X"00",X"5D",X"53",X"06",X"5B",X"DD", + X"7E",X"00",X"83",X"5F",X"30",X"01",X"14",X"4F",X"DD",X"7D",X"E6",X"01",X"20",X"06",X"79",X"85", + X"6F",X"30",X"01",X"24",X"DD",X"23",X"10",X"E7",X"7B",X"DD",X"BE",X"00",X"C2",X"0B",X"7A",X"7A", + X"DD",X"BE",X"01",X"C2",X"A0",X"0F",X"7D",X"DD",X"BE",X"02",X"C2",X"88",X"13",X"7C",X"DD",X"BE", + X"03",X"C2",X"70",X"17",X"3A",X"0D",X"88",X"A7",X"DD",X"21",X"32",X"8A",X"28",X"03",X"DD",X"2E", + X"35",X"21",X"2D",X"86",X"11",X"E0",X"FF",X"06",X"02",X"DD",X"7E",X"00",X"4F",X"E6",X"F0",X"0F", + X"0F",X"0F",X"0F",X"77",X"19",X"79",X"E6",X"0F",X"77",X"19",X"CB",X"40",X"20",X"04",X"36",X"51", + X"19",X"DD",X"2B",X"10",X"E4",X"DD",X"E5",X"E1",X"AF",X"06",X"03",X"D7",X"21",X"E7",X"89",X"06", + X"07",X"7E",X"A7",X"20",X"0A",X"23",X"10",X"F9",X"C9",X"21",X"AC",X"68",X"11",X"00",X"00",X"7E", + X"FE",X"C9",X"28",X"08",X"83",X"30",X"01",X"14",X"5F",X"23",X"18",X"F3",X"21",X"0B",X"7A",X"7B", + X"BE",X"C2",X"D0",X"07",X"7A",X"23",X"BE",X"C2",X"85",X"1A",X"C9",X"F8",X"24",X"8D",X"7A",X"9A", + X"7A",X"AE",X"7A",X"BB",X"7A",X"C8",X"7A",X"D5",X"7A",X"E2",X"7A",X"F2",X"7A",X"12",X"7B",X"2E", + X"7B",X"3F",X"7B",X"53",X"7B",X"5A",X"7B",X"69",X"7B",X"7B",X"7B",X"8B",X"7B",X"C8",X"7B",X"E7", + X"7B",X"F8",X"7B",X"08",X"7C",X"14",X"7C",X"1F",X"7C",X"2B",X"7C",X"3E",X"7C",X"4A",X"7C",X"5C", + X"7C",X"71",X"7C",X"85",X"7C",X"8B",X"7C",X"91",X"7C",X"97",X"7C",X"A8",X"7C",X"AE",X"7C",X"B4", + X"7C",X"BA",X"7C",X"C0",X"7C",X"C6",X"7C",X"CD",X"7C",X"DE",X"7C",X"EF",X"7C",X"FE",X"7C",X"0A", + X"7D",X"26",X"7D",X"42",X"7D",X"53",X"7D",X"68",X"7D",X"76",X"7D",X"82",X"7D",X"98",X"7D",X"AC", + X"7D",X"C4",X"7D",X"E2",X"7D",X"0D",X"7E",X"46",X"7E",X"56",X"7E",X"56",X"7E",X"56",X"7E",X"56", + X"7E",X"56",X"7E",X"56",X"7E",X"56",X"7E",X"56",X"7E",X"56",X"7E",X"5A",X"7E",X"96",X"86",X"47", + X"41",X"4D",X"45",X"40",X"40",X"4F",X"56",X"45",X"52",X"3F",X"EE",X"86",X"50",X"55",X"53",X"48", + X"40",X"53",X"54",X"41",X"52",X"54",X"40",X"42",X"55",X"54",X"54",X"4F",X"4E",X"3F",X"94",X"86", + X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"45",X"3F",X"94",X"86",X"50",X"4C",X"41", + X"59",X"45",X"52",X"40",X"54",X"57",X"4F",X"3F",X"80",X"86",X"48",X"49",X"47",X"48",X"40",X"53", + X"43",X"4F",X"52",X"45",X"3F",X"BF",X"87",X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"40", + X"40",X"3F",X"BF",X"87",X"40",X"46",X"52",X"45",X"45",X"40",X"50",X"4C",X"41",X"59",X"40",X"40", + X"40",X"3F",X"38",X"87",X"4F",X"4E",X"45",X"40",X"44",X"41",X"59",X"5C",X"5C",X"5C",X"2E",X"DA", + X"86",X"49",X"4E",X"40",X"54",X"48",X"45",X"40",X"46",X"4F",X"52",X"45",X"53",X"54",X"5C",X"5C", + X"5C",X"3F",X"D1",X"86",X"42",X"4F",X"4E",X"55",X"53",X"40",X"50",X"4F",X"49",X"4E",X"54",X"2E", + X"B4",X"86",X"32",X"30",X"30",X"58",X"40",X"40",X"77",X"40",X"40",X"30",X"30",X"3F",X"CA",X"86", + X"59",X"4F",X"55",X"52",X"40",X"50",X"4C",X"41",X"59",X"40",X"54",X"49",X"4D",X"45",X"3F",X"19", + X"87",X"4E",X"42",X"52",X"40",X"4F",X"46",X"40",X"50",X"49",X"47",X"53",X"40",X"54",X"41",X"4B", + X"45",X"4E",X"3F",X"24",X"86",X"50",X"4C",X"41",X"59",X"3F",X"A9",X"86",X"5B",X"40",X"40",X"50", + X"4F",X"4F",X"59",X"41",X"4E",X"40",X"40",X"5B",X"3F",X"C4",X"86",X"5B",X"40",X"40",X"43",X"48", + X"41",X"52",X"41",X"43",X"54",X"45",X"52",X"40",X"40",X"5B",X"3F",X"A3",X"86",X"5B",X"40",X"40", + X"50",X"4F",X"4F",X"40",X"59",X"41",X"4E",X"40",X"40",X"5B",X"3F",X"2B",X"87",X"57",X"48",X"45", + X"4E",X"40",X"37",X"40",X"57",X"4F",X"4C",X"56",X"45",X"53",X"40",X"4A",X"4F",X"49",X"4E",X"2E", + X"2D",X"87",X"4F",X"4E",X"40",X"54",X"48",X"45",X"40",X"43",X"4C",X"49",X"46",X"46",X"73",X"54", + X"48",X"45",X"59",X"2E",X"2F",X"87",X"44",X"52",X"4F",X"50",X"40",X"47",X"49",X"41",X"48",X"54", + X"40",X"52",X"4F",X"43",X"4B",X"3B",X"3B",X"3F",X"AF",X"86",X"40",X"4E",X"49",X"43",X"45",X"40", + X"40",X"53",X"48",X"4F",X"4F",X"54",X"2E",X"D2",X"86",X"40",X"42",X"4F",X"4E",X"55",X"53",X"40", + X"40",X"50",X"4F",X"49",X"4E",X"54",X"3F",X"BC",X"86",X"3A",X"40",X"4B",X"4F",X"4E",X"41",X"4D", + X"49",X"40",X"40",X"31",X"39",X"38",X"32",X"3F",X"AE",X"86",X"40",X"4D",X"41",X"4D",X"41",X"73", + X"40",X"48",X"45",X"4C",X"50",X"40",X"3B",X"3F",X"E6",X"85",X"4F",X"48",X"73",X"40",X"42",X"4F", + X"59",X"40",X"3B",X"3F",X"56",X"87",X"40",X"4D",X"41",X"4D",X"41",X"40",X"40",X"3B",X"3F",X"19", + X"87",X"40",X"4D",X"41",X"4D",X"41",X"40",X"40",X"3B",X"3B",X"3F",X"75",X"87",X"31",X"53",X"54", + X"40",X"42",X"4F",X"4E",X"55",X"53",X"40",X"41",X"46",X"54",X"45",X"52",X"40",X"3F",X"75",X"85", + X"35",X"30",X"30",X"30",X"30",X"40",X"50",X"54",X"53",X"3F",X"D1",X"86",X"4F",X"4E",X"45",X"40", + X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"4C",X"59",X"3F",X"F1",X"86",X"4F",X"4E", + X"45",X"40",X"4F",X"52",X"40",X"54",X"57",X"4F",X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"53", + X"3F",X"04",X"87",X"5B",X"40",X"53",X"43",X"4F",X"52",X"45",X"40",X"52",X"41",X"4E",X"4B",X"49", + X"4E",X"47",X"40",X"5B",X"3F",X"27",X"87",X"31",X"53",X"54",X"3F",X"29",X"87",X"32",X"4E",X"44", + X"3F",X"2B",X"87",X"33",X"52",X"44",X"3F",X"2D",X"87",X"34",X"54",X"48",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"3F",X"2F",X"87",X"35",X"54",X"48",X"3F",X"31",X"87", + X"36",X"54",X"48",X"3F",X"33",X"87",X"37",X"54",X"48",X"3F",X"35",X"87",X"38",X"54",X"48",X"3F", + X"37",X"87",X"39",X"54",X"48",X"3F",X"59",X"87",X"31",X"30",X"54",X"48",X"3F",X"BD",X"86",X"3A", + X"40",X"4B",X"4F",X"4E",X"41",X"4D",X"49",X"40",X"40",X"31",X"39",X"38",X"32",X"3F",X"D1",X"86", + X"40",X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"53",X"54",X"41",X"47",X"45",X"40",X"3F",X"AC", + X"86",X"40",X"40",X"50",X"45",X"52",X"46",X"45",X"43",X"54",X"40",X"40",X"40",X"3F",X"75",X"85", + X"33",X"30",X"30",X"30",X"30",X"40",X"50",X"54",X"53",X"3F",X"78",X"87",X"41",X"4E",X"44",X"40", + X"42",X"4F",X"4E",X"55",X"53",X"40",X"45",X"56",X"45",X"52",X"59",X"40",X"37",X"30",X"30",X"30", + X"30",X"40",X"50",X"54",X"53",X"3F",X"78",X"87",X"41",X"4E",X"44",X"40",X"42",X"4F",X"4E",X"55", + X"53",X"40",X"45",X"56",X"45",X"52",X"59",X"40",X"38",X"30",X"30",X"30",X"30",X"40",X"50",X"54", + X"53",X"3F",X"D0",X"86",X"32",X"4E",X"44",X"40",X"50",X"48",X"41",X"53",X"45",X"40",X"47",X"45", + X"54",X"53",X"3F",X"12",X"87",X"48",X"41",X"52",X"44",X"45",X"52",X"40",X"41",X"53",X"40",X"59", + X"4F",X"55",X"40",X"4C",X"4F",X"53",X"45",X"3F",X"94",X"86",X"4D",X"4F",X"52",X"45",X"40",X"50", + X"49",X"47",X"53",X"40",X"3B",X"3F",X"16",X"86",X"3F",X"44",X"49",X"46",X"46",X"49",X"43",X"55", + X"4C",X"54",X"38",X"87",X"3F",X"49",X"4E",X"40",X"54",X"48",X"45",X"40",X"53",X"45",X"43",X"4F", + X"4E",X"44",X"40",X"50",X"48",X"41",X"53",X"45",X"75",X"87",X"41",X"42",X"4F",X"55",X"54",X"40", + X"31",X"30",X"40",X"53",X"45",X"43",X"4F",X"4E",X"44",X"53",X"3B",X"3F",X"92",X"86",X"40",X"4F", + X"4E",X"45",X"40",X"57",X"4F",X"4C",X"46",X"2E",X"74",X"86",X"40",X"40",X"34",X"30",X"30",X"40", + X"50",X"54",X"53",X"3F",X"92",X"86",X"40",X"54",X"57",X"4F",X"40",X"57",X"4F",X"4C",X"56",X"45", + X"53",X"2E",X"74",X"86",X"40",X"40",X"34",X"30",X"30",X"83",X"38",X"30",X"30",X"40",X"50",X"54", + X"53",X"3F",X"92",X"86",X"40",X"53",X"4F",X"4D",X"45",X"40",X"57",X"4F",X"4C",X"56",X"45",X"53", + X"2E",X"74",X"86",X"40",X"40",X"34",X"30",X"30",X"83",X"38",X"30",X"30",X"40",X"2E",X"56",X"86", + X"40",X"40",X"40",X"83",X"31",X"36",X"30",X"30",X"40",X"50",X"54",X"53",X"3F",X"CD",X"86",X"42", + X"4F",X"4E",X"55",X"53",X"40",X"40",X"50",X"4F",X"49",X"4E",X"54",X"2E",X"10",X"87",X"4D",X"45", + X"41",X"54",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"30",X"30",X"40",X"50",X"54",X"53", + X"2E",X"12",X"87",X"57",X"4F",X"4C",X"46",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"30", + X"30",X"40",X"50",X"54",X"53",X"3F",X"A3",X"86",X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"53", + X"54",X"41",X"47",X"45",X"40",X"3F",X"00",X"84",X"40",X"3F",X"89",X"86",X"44",X"4F",X"55",X"42", + X"4C",X"45",X"2E",X"4D",X"86",X"50",X"45",X"52",X"46",X"45",X"43",X"54",X"3F",X"3A",X"88",X"89", + X"FE",X"04",X"D8",X"3A",X"5F",X"8A",X"A7",X"C0",X"21",X"BE",X"64",X"0E",X"00",X"59",X"7E",X"2B", + X"81",X"4F",X"30",X"01",X"1C",X"3E",X"34",X"BE",X"20",X"F4",X"7B",X"81",X"E6",X"B0",X"C8",X"21", + X"EF",X"89",X"34",X"C9",X"21",X"D6",X"7F",X"E5",X"3A",X"2A",X"8E",X"A7",X"C0",X"3A",X"FC",X"89", + X"A7",X"20",X"05",X"3C",X"32",X"2A",X"8E",X"C9",X"3A",X"26",X"8E",X"EF",X"B2",X"7E",X"0E",X"7F", + X"5D",X"7F",X"21",X"65",X"85",X"22",X"27",X"8E",X"3E",X"03",X"32",X"25",X"8E",X"3A",X"FC",X"89", + X"21",X"A0",X"03",X"22",X"2B",X"8E",X"DD",X"21",X"FD",X"8D",X"47",X"11",X"03",X"00",X"DD",X"19", + X"10",X"FC",X"DD",X"22",X"1F",X"8E",X"3A",X"0F",X"88",X"A7",X"20",X"06",X"3A",X"0D",X"88",X"A7", + X"20",X"05",X"21",X"11",X"88",X"18",X"03",X"21",X"12",X"88",X"22",X"21",X"8E",X"3A",X"FC",X"89", + X"47",X"ED",X"5B",X"27",X"8E",X"13",X"13",X"10",X"FC",X"ED",X"53",X"27",X"8E",X"3E",X"11",X"12", + X"32",X"23",X"8E",X"3E",X"01",X"32",X"26",X"8E",X"3E",X"0C",X"32",X"24",X"8E",X"C9",X"2A",X"2B", + X"8E",X"2B",X"22",X"2B",X"8E",X"7C",X"A7",X"20",X"07",X"7D",X"A7",X"20",X"03",X"C3",X"A8",X"7F", + X"2A",X"21",X"8E",X"CB",X"5E",X"20",X"1B",X"CB",X"56",X"28",X"32",X"21",X"24",X"8E",X"35",X"C0", + X"3E",X"0C",X"32",X"24",X"8E",X"21",X"23",X"8E",X"34",X"7E",X"FE",X"2D",X"38",X"19",X"36",X"10", + X"18",X"15",X"21",X"24",X"8E",X"35",X"C0",X"3E",X"0C",X"32",X"24",X"8E",X"21",X"23",X"8E",X"35", + X"7E",X"FE",X"10",X"30",X"02",X"36",X"2C",X"ED",X"4B",X"27",X"8E",X"7E",X"02",X"2A",X"21",X"8E", + X"7E",X"21",X"29",X"8E",X"07",X"07",X"07",X"07",X"CB",X"16",X"7E",X"E6",X"07",X"FE",X"01",X"C0", + X"21",X"A0",X"03",X"22",X"2B",X"8E",X"3A",X"23",X"8E",X"2A",X"1F",X"8E",X"77",X"23",X"22",X"1F", + X"8E",X"21",X"25",X"8E",X"35",X"7E",X"A7",X"32",X"25",X"8E",X"28",X"1C",X"3A",X"23",X"8E",X"2A", + X"27",X"8E",X"77",X"01",X"E0",X"FF",X"09",X"22",X"27",X"8E",X"3E",X"11",X"77",X"3E",X"01",X"32", + X"26",X"8E",X"3E",X"11",X"32",X"23",X"8E",X"C9",X"CD",X"CF",X"0E",X"3A",X"25",X"8E",X"A7",X"28", + X"16",X"47",X"3E",X"10",X"2A",X"27",X"8E",X"11",X"E0",X"FF",X"DD",X"2A",X"1F",X"8E",X"77",X"DD", + X"77",X"00",X"19",X"DD",X"23",X"10",X"F7",X"21",X"08",X"88",X"36",X"80",X"AF",X"32",X"26",X"8E", + X"3E",X"01",X"32",X"2A",X"8E",X"C9",X"3A",X"02",X"88",X"A7",X"C8",X"21",X"0E",X"88",X"7E",X"A7", + X"28",X"0D",X"2B",X"7E",X"A7",X"3A",X"08",X"89",X"21",X"48",X"89",X"20",X"02",X"2E",X"88",X"B6", + X"A7",X"C0",X"3A",X"10",X"88",X"E6",X"18",X"A7",X"C8",X"CD",X"CF",X"0E",X"C3",X"78",X"0D",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_sound_prog.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_sound_prog.vhd new file mode 100644 index 00000000..c9dee01e --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_sound_prog.vhd @@ -0,0 +1,373 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_sound_prog 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 prom of pooyan_sound_prog is + type rom is array(0 to 5615) of std_logic_vector(7 downto 0);--2576 + signal rom_data: rom := ( + X"21",X"00",X"30",X"06",X"00",X"C3",X"AC",X"00",X"32",X"00",X"50",X"3A",X"00",X"40",X"C9",X"FF", + X"32",X"00",X"70",X"3A",X"00",X"60",X"C9",X"FF",X"78",X"CF",X"79",X"32",X"00",X"40",X"C9",X"FF", + X"78",X"D7",X"79",X"32",X"00",X"60",X"C9",X"FF",X"87",X"85",X"6F",X"7C",X"CE",X"00",X"67",X"7E", + X"23",X"66",X"6F",X"E9",X"FF",X"FF",X"FF",X"FF",X"D9",X"08",X"CD",X"40",X"00",X"08",X"D9",X"C9", + X"3E",X"0E",X"CF",X"B7",X"28",X"40",X"57",X"E6",X"7F",X"FE",X"2B",X"D0",X"CB",X"7A",X"28",X"03", + X"C3",X"A3",X"00",X"57",X"CD",X"91",X"00",X"28",X"04",X"23",X"36",X"00",X"C9",X"AF",X"CD",X"91", + X"00",X"28",X"05",X"72",X"23",X"36",X"00",X"C9",X"21",X"00",X"30",X"1E",X"06",X"7E",X"1D",X"28", + X"08",X"2C",X"2C",X"BE",X"38",X"F8",X"C3",X"6D",X"00",X"5F",X"7A",X"BB",X"D8",X"7B",X"CD",X"91", + X"00",X"72",X"2C",X"36",X"00",X"C9",X"21",X"00",X"30",X"06",X"0C",X"AF",X"77",X"23",X"10",X"FC", + X"C9",X"21",X"00",X"30",X"06",X"06",X"0E",X"07",X"BE",X"28",X"05",X"23",X"23",X"10",X"F9",X"41", + X"79",X"90",X"C9",X"CD",X"91",X"00",X"C8",X"AF",X"77",X"23",X"77",X"C9",X"70",X"23",X"7C",X"FE", + X"34",X"20",X"F9",X"F9",X"ED",X"56",X"21",X"00",X"80",X"22",X"0C",X"30",X"77",X"16",X"06",X"7A", + X"CD",X"B0",X"01",X"15",X"20",X"F9",X"01",X"38",X"07",X"DF",X"E7",X"FB",X"3E",X"0F",X"CF",X"E6", + X"80",X"20",X"F9",X"3E",X"0F",X"CF",X"E6",X"80",X"28",X"F9",X"F3",X"3E",X"01",X"32",X"0E",X"30", + X"3A",X"01",X"30",X"B7",X"3A",X"00",X"30",X"CA",X"EF",X"00",X"CD",X"93",X"01",X"18",X"03",X"CD", + X"7D",X"01",X"FB",X"00",X"00",X"F3",X"3E",X"02",X"32",X"0E",X"30",X"3A",X"03",X"30",X"B7",X"3A", + X"02",X"30",X"CA",X"0A",X"01",X"CD",X"93",X"01",X"18",X"03",X"CD",X"7D",X"01",X"FB",X"00",X"00", + X"F3",X"3E",X"03",X"32",X"0E",X"30",X"3A",X"05",X"30",X"B7",X"3A",X"04",X"30",X"CA",X"25",X"01", + X"CD",X"93",X"01",X"18",X"03",X"CD",X"7D",X"01",X"FB",X"00",X"00",X"F3",X"3E",X"04",X"32",X"0E", + X"30",X"3A",X"07",X"30",X"B7",X"3A",X"06",X"30",X"CA",X"40",X"01",X"CD",X"93",X"01",X"18",X"03", + X"CD",X"7D",X"01",X"FB",X"00",X"00",X"F3",X"3E",X"05",X"32",X"0E",X"30",X"3A",X"09",X"30",X"B7", + X"3A",X"08",X"30",X"CA",X"5B",X"01",X"CD",X"93",X"01",X"18",X"03",X"CD",X"7D",X"01",X"FB",X"00", + X"00",X"F3",X"3E",X"06",X"32",X"0E",X"30",X"3A",X"0B",X"30",X"B7",X"3A",X"0A",X"30",X"CA",X"77", + X"01",X"CD",X"93",X"01",X"C3",X"CB",X"00",X"CD",X"7D",X"01",X"C3",X"CB",X"00",X"21",X"D3",X"09", + X"EF",X"B7",X"20",X"17",X"21",X"01",X"30",X"3A",X"0E",X"30",X"3D",X"87",X"5F",X"16",X"00",X"19", + X"36",X"01",X"C9",X"B7",X"C8",X"21",X"29",X"0A",X"EF",X"B7",X"C8",X"21",X"00",X"30",X"3A",X"0E", + X"30",X"3D",X"87",X"4F",X"06",X"00",X"09",X"70",X"23",X"70",X"C9",X"0E",X"00",X"3A",X"0E",X"30", + X"FE",X"04",X"30",X"06",X"C6",X"07",X"47",X"C3",X"18",X"00",X"C6",X"04",X"47",X"C3",X"20",X"00", + X"3A",X"0E",X"30",X"FE",X"04",X"30",X"0A",X"3D",X"87",X"47",X"4D",X"DF",X"4C",X"04",X"C3",X"18", + X"00",X"D6",X"04",X"87",X"47",X"4D",X"E7",X"4C",X"04",X"C3",X"20",X"00",X"01",X"FC",X"FF",X"21", + X"00",X"00",X"1F",X"CB",X"15",X"1F",X"CB",X"15",X"3A",X"0E",X"30",X"C6",X"02",X"FE",X"06",X"38", + X"04",X"D6",X"06",X"28",X"0A",X"87",X"29",X"37",X"CB",X"11",X"CB",X"10",X"3D",X"20",X"F7",X"EB", + X"2A",X"0C",X"30",X"7D",X"A1",X"B3",X"6F",X"7C",X"A0",X"B2",X"67",X"22",X"0C",X"30",X"77",X"C9", + X"DD",X"35",X"01",X"20",X"20",X"DD",X"7E",X"08",X"DD",X"77",X"01",X"DD",X"35",X"00",X"28",X"38", + X"DD",X"CB",X"00",X"46",X"C8",X"DD",X"7E",X"09",X"B7",X"C8",X"DD",X"86",X"07",X"F8",X"DD",X"77", + X"07",X"4F",X"C3",X"AD",X"01",X"DD",X"7E",X"0A",X"FE",X"01",X"D8",X"DD",X"6E",X"0B",X"DD",X"66", + X"0C",X"28",X"0B",X"DD",X"46",X"01",X"0E",X"9B",X"09",X"7C",X"AD",X"6F",X"26",X"01",X"23",X"DD", + X"75",X"0B",X"DD",X"74",X"0C",X"C3",X"C0",X"01",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"7E",X"57", + X"E6",X"1F",X"28",X"2A",X"FE",X"1F",X"28",X"3D",X"CD",X"8E",X"02",X"7A",X"E6",X"1F",X"3D",X"07", + X"4F",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"09",X"5E",X"23",X"56",X"EB",X"DD",X"75",X"0B",X"DD", + X"74",X"0C",X"CD",X"C0",X"01",X"DD",X"4E",X"06",X"DD",X"71",X"07",X"C3",X"AD",X"01",X"23",X"DD", + X"75",X"02",X"DD",X"74",X"03",X"7A",X"E6",X"E0",X"07",X"07",X"07",X"47",X"3E",X"80",X"07",X"10", + X"FD",X"DD",X"77",X"00",X"C9",X"7A",X"E6",X"E0",X"07",X"07",X"07",X"11",X"58",X"02",X"D5",X"23", + X"5D",X"54",X"23",X"DD",X"75",X"02",X"DD",X"74",X"03",X"21",X"BF",X"02",X"C3",X"28",X"00",X"CF", + X"02",X"E3",X"02",X"F3",X"02",X"F8",X"02",X"FD",X"02",X"02",X"03",X"0B",X"03",X"15",X"03",X"EB", + X"4E",X"CB",X"21",X"06",X"00",X"21",X"1A",X"03",X"09",X"5E",X"23",X"56",X"DD",X"73",X"04",X"DD", + X"72",X"05",X"C9",X"EB",X"4E",X"06",X"00",X"21",X"B2",X"03",X"09",X"7E",X"DD",X"77",X"08",X"DD", + X"77",X"01",X"C9",X"1A",X"DD",X"77",X"06",X"C9",X"1A",X"DD",X"77",X"09",X"C9",X"1A",X"DD",X"77", + X"0A",X"C9",X"1A",X"32",X"0A",X"30",X"AF",X"32",X"0B",X"30",X"C9",X"1A",X"DD",X"77",X"02",X"13", + X"1A",X"DD",X"77",X"03",X"C9",X"E1",X"E1",X"3E",X"FF",X"C9",X"3A",X"03",X"3E",X"03",X"42",X"03", + X"46",X"03",X"4A",X"03",X"4E",X"03",X"52",X"03",X"56",X"03",X"5A",X"03",X"5E",X"03",X"62",X"03", + X"66",X"03",X"6A",X"03",X"6E",X"03",X"72",X"03",X"76",X"03",X"6B",X"08",X"F2",X"07",X"80",X"07", + X"14",X"07",X"AE",X"06",X"4E",X"06",X"F3",X"05",X"9E",X"05",X"4E",X"05",X"01",X"05",X"B9",X"04", + X"76",X"04",X"36",X"04",X"F9",X"03",X"C0",X"03",X"8A",X"03",X"57",X"03",X"27",X"03",X"FA",X"02", + X"CF",X"02",X"A7",X"02",X"81",X"02",X"5D",X"02",X"3B",X"02",X"1B",X"02",X"FD",X"01",X"E0",X"01", + X"C5",X"01",X"AC",X"01",X"94",X"01",X"7D",X"01",X"68",X"01",X"53",X"01",X"40",X"01",X"2E",X"01", + X"1D",X"01",X"0D",X"01",X"FE",X"00",X"F0",X"00",X"E3",X"00",X"D6",X"00",X"CA",X"00",X"BE",X"00", + X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97",X"00",X"8F",X"00",X"87",X"00",X"7F",X"00",X"78",X"00", + X"71",X"00",X"6B",X"00",X"65",X"00",X"5F",X"00",X"5A",X"00",X"55",X"00",X"50",X"00",X"4C",X"00", + X"47",X"00",X"3C",X"38",X"34",X"30",X"2C",X"28",X"24",X"20",X"1E",X"1C",X"1A",X"18",X"16",X"14", + X"12",X"10",X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"21",X"FD", + X"03",X"11",X"0F",X"30",X"01",X"27",X"00",X"ED",X"B0",X"07",X"4F",X"07",X"81",X"4F",X"06",X"00", + X"21",X"DB",X"0A",X"09",X"11",X"11",X"30",X"CD",X"F3",X"03",X"11",X"1E",X"30",X"CD",X"F3",X"03", + X"11",X"2B",X"30",X"7E",X"12",X"CD",X"FA",X"03",X"7E",X"12",X"23",X"13",X"C9",X"01",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"3E",X"01",X"CD",X"DC",X"01",X"21",X"3B",X"30",X"36",X"00",X"2C",X"36", + X"03",X"2C",X"0E",X"06",X"71",X"CD",X"AD",X"01",X"21",X"18",X"00",X"22",X"39",X"30",X"CD",X"C0", + X"01",X"AF",X"C9",X"21",X"3B",X"30",X"35",X"7E",X"57",X"E6",X"0F",X"20",X"1F",X"2C",X"7E",X"2C", + X"86",X"FE",X"05",X"28",X"2D",X"77",X"FE",X"0F",X"20",X"0E",X"2D",X"36",X"FE",X"2A",X"39",X"30", + X"01",X"F4",X"FF",X"09",X"22",X"39",X"30",X"3D",X"4F",X"CD",X"AD",X"01",X"2A",X"39",X"30",X"CB", + X"62",X"01",X"02",X"00",X"20",X"03",X"01",X"FE",X"FF",X"09",X"22",X"39",X"30",X"CD",X"C0",X"01", + X"AF",X"C9",X"3E",X"FF",X"C9",X"AF",X"CD",X"DC",X"01",X"0E",X"06",X"CD",X"AD",X"01",X"21",X"90", + X"00",X"CD",X"C0",X"01",X"21",X"3E",X"30",X"36",X"00",X"2C",X"36",X"F4",X"2C",X"36",X"90",X"AF", + X"C9",X"21",X"3E",X"30",X"35",X"7E",X"E6",X"07",X"20",X"1A",X"0E",X"00",X"CB",X"5E",X"20",X"11", + X"2C",X"34",X"34",X"28",X"D4",X"7E",X"2C",X"86",X"77",X"6F",X"26",X"00",X"CD",X"C0",X"01",X"0E", + X"06",X"CD",X"AD",X"01",X"AF",X"C9",X"3E",X"01",X"CD",X"DC",X"01",X"21",X"41",X"30",X"0E",X"0D", + X"71",X"CD",X"AD",X"01",X"2C",X"36",X"80",X"2C",X"36",X"20",X"6E",X"26",X"03",X"CD",X"C0",X"01", + X"AF",X"C9",X"21",X"42",X"30",X"35",X"7E",X"28",X"1E",X"E6",X"0F",X"20",X"07",X"2D",X"35",X"4E", + X"CD",X"AD",X"01",X"2C",X"CB",X"5E",X"3E",X"08",X"20",X"02",X"ED",X"44",X"2C",X"86",X"77",X"6F", + X"26",X"03",X"CD",X"C0",X"01",X"AF",X"C9",X"3D",X"C9",X"3E",X"01",X"CD",X"DC",X"01",X"0E",X"0B", + X"CD",X"AD",X"01",X"21",X"B0",X"00",X"CD",X"C0",X"01",X"21",X"44",X"30",X"36",X"00",X"2C",X"36", + X"B0",X"2C",X"36",X"84",X"2C",X"36",X"B0",X"AF",X"C9",X"21",X"44",X"30",X"35",X"7E",X"E6",X"01", + X"20",X"0D",X"2C",X"35",X"7E",X"2C",X"BE",X"28",X"08",X"6F",X"26",X"00",X"CD",X"C0",X"01",X"AF", + X"C9",X"2C",X"86",X"1F",X"FE",X"40",X"38",X"15",X"77",X"32",X"45",X"30",X"6F",X"26",X"00",X"CD", + X"C0",X"01",X"7D",X"CB",X"3D",X"CB",X"3D",X"95",X"32",X"46",X"30",X"AF",X"C9",X"3E",X"FF",X"C9", + X"AF",X"CD",X"DC",X"01",X"21",X"18",X"00",X"CD",X"C0",X"01",X"21",X"48",X"30",X"36",X"1E",X"2C", + X"0E",X"0F",X"71",X"CD",X"AD",X"01",X"2C",X"36",X"53",X"2C",X"36",X"35",X"AF",X"C9",X"21",X"48", + X"30",X"35",X"7E",X"28",X"1E",X"2C",X"E6",X"01",X"20",X"05",X"35",X"4E",X"CD",X"AD",X"01",X"2C", + X"7E",X"C6",X"95",X"77",X"2C",X"AE",X"E6",X"7F",X"C6",X"30",X"77",X"6F",X"26",X"00",X"CD",X"C0", + X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"21",X"4C",X"30",X"36",X"40",X"2C",X"36", + X"A0",X"21",X"A0",X"00",X"CD",X"C0",X"01",X"0E",X"0B",X"CD",X"AD",X"01",X"AF",X"C9",X"21",X"4C", + X"30",X"35",X"7E",X"28",X"26",X"FE",X"20",X"28",X"E5",X"57",X"E6",X"03",X"20",X"1B",X"7A",X"E6", + X"07",X"20",X"0B",X"2C",X"7E",X"D6",X"20",X"77",X"6F",X"26",X"00",X"CD",X"C0",X"01",X"CB",X"52", + X"0E",X"07",X"20",X"02",X"0E",X"0B",X"CD",X"AD",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC", + X"01",X"0E",X"09",X"CD",X"AD",X"01",X"21",X"40",X"00",X"CD",X"C0",X"01",X"21",X"4E",X"30",X"36", + X"80",X"2C",X"36",X"40",X"AF",X"C9",X"21",X"4E",X"30",X"35",X"7E",X"28",X"11",X"E6",X"1F",X"20", + X"0B",X"2C",X"7E",X"D6",X"06",X"77",X"6F",X"26",X"00",X"CD",X"C0",X"01",X"AF",X"C9",X"3D",X"C9", + X"AF",X"CD",X"DC",X"01",X"21",X"50",X"30",X"36",X"B6",X"2C",X"0E",X"00",X"71",X"CD",X"AD",X"01", + X"2C",X"36",X"30",X"21",X"30",X"00",X"CD",X"C0",X"01",X"AF",X"C9",X"21",X"50",X"30",X"35",X"7E", + X"28",X"35",X"2C",X"FE",X"80",X"38",X"15",X"FE",X"83",X"38",X"07",X"FE",X"B2",X"3E",X"00",X"D8", + X"28",X"03",X"7E",X"C6",X"04",X"77",X"4F",X"CD",X"AD",X"01",X"AF",X"C9",X"57",X"E6",X"0F",X"20", + X"05",X"35",X"4E",X"CD",X"AD",X"01",X"2C",X"35",X"CB",X"5A",X"28",X"03",X"34",X"34",X"34",X"6E", + X"26",X"00",X"CD",X"C0",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"0E",X"0C",X"CD", + X"AD",X"01",X"21",X"0F",X"00",X"CD",X"C0",X"01",X"3E",X"10",X"32",X"53",X"30",X"AF",X"C9",X"21", + X"53",X"30",X"35",X"7E",X"28",X"0E",X"E6",X"01",X"21",X"0E",X"00",X"20",X"02",X"2E",X"0F",X"CD", + X"C0",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"0E",X"09",X"CD",X"AD",X"01",X"21", + X"40",X"00",X"CD",X"C0",X"01",X"21",X"54",X"30",X"36",X"80",X"2C",X"36",X"40",X"AF",X"C9",X"21", + X"54",X"30",X"35",X"7E",X"28",X"18",X"57",X"E6",X"1F",X"20",X"11",X"2C",X"7E",X"D6",X"0C",X"CB", + X"6A",X"20",X"02",X"C6",X"18",X"77",X"6F",X"26",X"00",X"CD",X"C0",X"01",X"AF",X"C9",X"3D",X"C9", + X"3E",X"01",X"CD",X"DC",X"01",X"0E",X"0E",X"CD",X"AD",X"01",X"21",X"56",X"30",X"36",X"00",X"2C", + X"36",X"60",X"6E",X"26",X"00",X"CD",X"C0",X"01",X"AF",X"C9",X"21",X"56",X"30",X"35",X"7E",X"28", + X"0D",X"FE",X"80",X"38",X"04",X"E6",X"1F",X"28",X"E6",X"2C",X"34",X"C3",X"F2",X"06",X"3D",X"C9", + X"3E",X"01",X"CD",X"DC",X"01",X"21",X"F8",X"00",X"22",X"58",X"30",X"CD",X"C0",X"01",X"0E",X"01", + X"CD",X"AD",X"01",X"21",X"5A",X"30",X"36",X"00",X"2C",X"36",X"A0",X"AF",X"C9",X"21",X"5A",X"30", + X"35",X"56",X"CB",X"46",X"20",X"2E",X"2C",X"35",X"7E",X"28",X"4B",X"2A",X"58",X"30",X"FE",X"0B", + X"38",X"33",X"FE",X"90",X"38",X"38",X"01",X"10",X"00",X"28",X"15",X"FE",X"9B",X"38",X"0C",X"5F", + X"C6",X"60",X"ED",X"44",X"87",X"3C",X"4F",X"CD",X"AD",X"01",X"7B",X"C6",X"60",X"4F",X"06",X"FF", + X"09",X"22",X"58",X"30",X"2A",X"58",X"30",X"7A",X"B7",X"EA",X"70",X"07",X"01",X"06",X"00",X"09", + X"CD",X"C0",X"01",X"AF",X"C9",X"4F",X"CD",X"AD",X"01",X"23",X"23",X"C3",X"61",X"07",X"E6",X"07", + X"20",X"E5",X"23",X"C3",X"61",X"07",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"21",X"40",X"00",X"CD", + X"C0",X"01",X"0E",X"00",X"CD",X"AD",X"01",X"21",X"5C",X"30",X"36",X"20",X"AF",X"2C",X"77",X"2C", + X"36",X"40",X"C9",X"21",X"5C",X"30",X"35",X"7E",X"28",X"18",X"E6",X"01",X"4F",X"28",X"0E",X"2C", + X"34",X"7E",X"2C",X"86",X"77",X"6F",X"26",X"00",X"CD",X"C0",X"01",X"0E",X"0A",X"CD",X"AD",X"01", + X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"0E",X"05",X"CD",X"AD",X"01",X"AF",X"21",X"5F", + X"30",X"36",X"80",X"2C",X"77",X"2C",X"77",X"C9",X"21",X"5F",X"30",X"35",X"7E",X"28",X"1A",X"57", + X"FE",X"08",X"38",X"23",X"FE",X"30",X"30",X"13",X"2C",X"7E",X"C6",X"C3",X"77",X"2C",X"AE",X"AA", + X"77",X"6F",X"26",X"02",X"CD",X"C0",X"01",X"AF",X"C9",X"3D",X"C9",X"E6",X"07",X"20",X"E9",X"7A", + X"0F",X"0F",X"0F",X"4F",X"3E",X"15",X"91",X"4F",X"CD",X"AD",X"01",X"AF",X"C9",X"3E",X"01",X"CD", + X"DC",X"01",X"21",X"62",X"30",X"36",X"80",X"2C",X"0E",X"0F",X"71",X"CD",X"AD",X"01",X"2C",X"36", + X"23",X"2C",X"36",X"D7",X"21",X"4C",X"01",X"CD",X"C0",X"01",X"AF",X"C9",X"21",X"62",X"30",X"35", + X"7E",X"28",X"30",X"2C",X"FE",X"78",X"28",X"23",X"FE",X"70",X"28",X"1F",X"FE",X"68",X"28",X"1B", + X"30",X"04",X"E6",X"07",X"20",X"05",X"35",X"4E",X"CD",X"AD",X"01",X"2C",X"7E",X"C6",X"5D",X"77", + X"2C",X"AE",X"77",X"6F",X"26",X"01",X"CD",X"C0",X"01",X"AF",X"C9",X"0E",X"0F",X"71",X"CD",X"AD", + X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"21",X"69",X"30",X"36",X"0C",X"4E",X"CD", + X"AD",X"01",X"2D",X"36",X"00",X"21",X"80",X"00",X"22",X"66",X"30",X"CD",X"C0",X"01",X"AF",X"C9", + X"21",X"68",X"30",X"34",X"7E",X"FE",X"59",X"28",X"0F",X"4F",X"06",X"00",X"2A",X"66",X"30",X"09", + X"22",X"66",X"30",X"CD",X"C0",X"01",X"AF",X"C9",X"2C",X"7E",X"D6",X"04",X"28",X"04",X"77",X"C3", + X"6E",X"08",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"21",X"20",X"04",X"CD",X"C0",X"01",X"21",X"6A", + X"30",X"36",X"00",X"2C",X"0E",X"0F",X"71",X"CD",X"AD",X"01",X"AF",X"C9",X"21",X"6A",X"30",X"35", + X"7E",X"57",X"E6",X"0F",X"20",X"10",X"2C",X"7E",X"3C",X"CB",X"62",X"28",X"04",X"D6",X"03",X"28", + X"07",X"77",X"4F",X"CD",X"AD",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"DC",X"01",X"21",X"50", + X"00",X"CD",X"C0",X"01",X"21",X"6C",X"30",X"36",X"48",X"2C",X"0E",X"0F",X"71",X"CD",X"AD",X"01", + X"AF",X"C9",X"21",X"6C",X"30",X"35",X"7E",X"28",X"13",X"57",X"E6",X"03",X"20",X"0C",X"2C",X"CB", + X"52",X"0E",X"06",X"20",X"02",X"35",X"4E",X"CD",X"AD",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD", + X"DC",X"01",X"21",X"6E",X"30",X"36",X"09",X"2C",X"36",X"60",X"2C",X"0E",X"0C",X"71",X"CD",X"AD", + X"01",X"2C",X"36",X"40",X"6E",X"26",X"00",X"CD",X"C0",X"01",X"AF",X"C9",X"21",X"6F",X"30",X"35", + X"7E",X"28",X"24",X"FE",X"40",X"20",X"05",X"2D",X"35",X"20",X"DC",X"2C",X"57",X"E6",X"01",X"20", + X"E9",X"2C",X"7A",X"E6",X"07",X"20",X"05",X"35",X"4E",X"CD",X"AD",X"01",X"2C",X"34",X"CB",X"52", + X"20",X"D2",X"35",X"35",X"C3",X"24",X"09",X"3D",X"C9",X"3E",X"01",X"CD",X"DC",X"01",X"21",X"00", + X"01",X"22",X"72",X"30",X"CD",X"C0",X"01",X"0E",X"05",X"CD",X"AD",X"01",X"21",X"74",X"30",X"36", + X"00",X"2C",X"36",X"A0",X"AF",X"C9",X"21",X"74",X"30",X"35",X"7E",X"57",X"E6",X"03",X"20",X"2F", + X"2C",X"35",X"7E",X"28",X"4C",X"2A",X"72",X"30",X"FE",X"0F",X"38",X"34",X"FE",X"90",X"38",X"39", + X"01",X"10",X"00",X"28",X"16",X"FE",X"9B",X"38",X"0D",X"5F",X"C6",X"60",X"ED",X"44",X"87",X"C6", + X"05",X"4F",X"CD",X"AD",X"01",X"7B",X"C6",X"60",X"4F",X"06",X"FF",X"09",X"22",X"72",X"30",X"2A", + X"72",X"30",X"7A",X"B7",X"EA",X"BB",X"09",X"01",X"06",X"00",X"09",X"CD",X"C0",X"01",X"AF",X"C9", + X"4F",X"CD",X"AD",X"01",X"23",X"23",X"C3",X"AC",X"09",X"E6",X"07",X"20",X"E5",X"23",X"C3",X"AC", + X"09",X"3D",X"C9",X"AB",X"01",X"24",X"04",X"85",X"04",X"C6",X"04",X"09",X"05",X"60",X"05",X"A5", + X"05",X"ED",X"05",X"20",X"06",X"79",X"06",X"A6",X"06",X"E0",X"06",X"10",X"07",X"88",X"07",X"C4", + X"07",X"0D",X"08",X"65",X"08",X"A4",X"08",X"DA",X"08",X"0E",X"09",X"59",X"09",X"BA",X"0A",X"BA", + X"0A",X"BA",X"0A",X"59",X"0A",X"5D",X"0A",X"62",X"0A",X"67",X"0A",X"6C",X"0A",X"71",X"0A",X"76", + X"0A",X"7B",X"0A",X"80",X"0A",X"85",X"0A",X"8A",X"0A",X"8F",X"0A",X"94",X"0A",X"99",X"0A",X"9E", + X"0A",X"A3",X"0A",X"A8",X"0A",X"AD",X"0A",X"B2",X"0A",X"00",X"00",X"43",X"04",X"A1",X"04",X"E2", + X"04",X"29",X"05",X"7E",X"05",X"BE",X"05",X"06",X"06",X"3B",X"06",X"8F",X"06",X"BF",X"06",X"FA", + X"06",X"2D",X"07",X"A3",X"07",X"D8",X"07",X"2C",X"08",X"80",X"08",X"BC",X"08",X"F2",X"08",X"2C", + X"09",X"76",X"09",X"C0",X"0A",X"C9",X"0A",X"D2",X"0A",X"AF",X"C3",X"B4",X"0A",X"3E",X"01",X"C3", + X"B4",X"0A",X"3E",X"02",X"C3",X"B4",X"0A",X"3E",X"03",X"C3",X"B4",X"0A",X"3E",X"04",X"C3",X"B4", + X"0A",X"3E",X"05",X"C3",X"B4",X"0A",X"3E",X"06",X"C3",X"B4",X"0A",X"3E",X"07",X"C3",X"B4",X"0A", + X"3E",X"08",X"C3",X"B4",X"0A",X"3E",X"09",X"C3",X"B4",X"0A",X"3E",X"0A",X"C3",X"B4",X"0A",X"3E", + X"0B",X"C3",X"B4",X"0A",X"3E",X"0C",X"C3",X"B4",X"0A",X"3E",X"0D",X"C3",X"B4",X"0A",X"3E",X"0E", + X"C3",X"B4",X"0A",X"3E",X"0F",X"C3",X"B4",X"0A",X"3E",X"10",X"C3",X"B4",X"0A",X"3E",X"11",X"C3", + X"B4",X"0A",X"3E",X"12",X"CD",X"CE",X"03",X"3E",X"FF",X"C9",X"AF",X"CD",X"DC",X"01",X"AF",X"C9", + X"DD",X"21",X"0F",X"30",X"CD",X"10",X"02",X"AF",X"C9",X"DD",X"21",X"1C",X"30",X"CD",X"10",X"02", + X"AF",X"C9",X"DD",X"21",X"29",X"30",X"CD",X"10",X"02",X"AF",X"C9",X"4D",X"0B",X"5E",X"0B",X"5E", + X"0B",X"5F",X"0B",X"72",X"0B",X"72",X"0B",X"73",X"0B",X"CD",X"0B",X"13",X"0C",X"3F",X"0C",X"8D", + X"0C",X"C7",X"0C",X"01",X"0D",X"42",X"0D",X"6A",X"0D",X"91",X"0D",X"BB",X"0D",X"DD",X"0D",X"ED", + X"0D",X"27",X"0E",X"27",X"0E",X"28",X"0E",X"65",X"0E",X"65",X"0E",X"66",X"0E",X"9C",X"0E",X"9C", + X"0E",X"9D",X"0E",X"E6",X"0E",X"E6",X"0E",X"E7",X"0E",X"0C",X"0F",X"31",X"0F",X"75",X"0F",X"C2", + X"0F",X"03",X"10",X"44",X"10",X"6E",X"10",X"9F",X"10",X"EE",X"10",X"37",X"11",X"7E",X"11",X"C5", + X"11",X"F0",X"11",X"F0",X"11",X"F1",X"11",X"3A",X"12",X"3A",X"12",X"3B",X"12",X"79",X"12",X"B6", + X"12",X"F1",X"12",X"81",X"13",X"AF",X"14",X"B0",X"15",X"B0",X"15",X"B0",X"15",X"1F",X"0F",X"3F", + X"1B",X"5F",X"0A",X"9F",X"02",X"A1",X"81",X"81",X"A1",X"81",X"81",X"DF",X"55",X"0B",X"FF",X"1F", + X"0F",X"3F",X"1B",X"5F",X"0A",X"9F",X"02",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"DF", + X"67",X"0B",X"FF",X"1F",X"0C",X"3F",X"16",X"5F",X"06",X"8B",X"8D",X"8B",X"6D",X"6E",X"6F",X"92", + X"60",X"94",X"92",X"97",X"60",X"76",X"79",X"97",X"96",X"99",X"60",X"97",X"94",X"92",X"72",X"72", + X"74",X"92",X"97",X"60",X"76",X"77",X"74",X"72",X"8F",X"AD",X"60",X"71",X"74",X"77",X"76",X"77", + X"76",X"74",X"72",X"70",X"6F",X"6D",X"8B",X"8D",X"8B",X"6D",X"6E",X"6F",X"6F",X"92",X"94",X"92", + X"94",X"60",X"76",X"79",X"97",X"96",X"76",X"99",X"97",X"94",X"92",X"92",X"77",X"8B",X"AD",X"B2", + X"60",X"7F",X"00",X"CB",X"7F",X"FF",X"8B",X"8B",X"8D",X"8E",X"DF",X"79",X"0B",X"1F",X"0C",X"3F", + X"16",X"5F",X"06",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"88",X"88",X"88",X"88",X"88", + X"88",X"88",X"88",X"86",X"86",X"86",X"86",X"88",X"88",X"88",X"88",X"85",X"85",X"85",X"85",X"86", + X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"88",X"88",X"88",X"88",X"88", + X"88",X"88",X"88",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"86",X"C6", + X"DF",X"D3",X"0B",X"1F",X"06",X"3F",X"16",X"5F",X"06",X"AB",X"A6",X"AB",X"8D",X"8F",X"B0",X"AB", + X"B0",X"B0",X"AF",X"AF",X"A8",X"A8",X"AD",X"AD",X"A6",X"88",X"8A",X"AB",X"A6",X"AB",X"8D",X"8F", + X"B0",X"AB",X"B0",X"B0",X"AF",X"AF",X"A6",X"88",X"8A",X"AB",X"A6",X"CB",X"DF",X"19",X"0C",X"1F", + X"0F",X"3F",X"17",X"5F",X"07",X"8F",X"8B",X"8B",X"6D",X"6F",X"90",X"8D",X"8D",X"92",X"8F",X"8B", + X"8B",X"8B",X"6D",X"6B",X"6A",X"68",X"A6",X"8F",X"8B",X"8B",X"6D",X"6F",X"90",X"8D",X"8D",X"92", + X"8F",X"8B",X"8D",X"8A",X"8B",X"8B",X"AB",X"92",X"92",X"92",X"70",X"72",X"94",X"90",X"90",X"90", + X"94",X"94",X"94",X"72",X"70",X"94",X"94",X"94",X"72",X"70",X"8F",X"8B",X"8B",X"6D",X"6F",X"90", + X"8D",X"8D",X"92",X"8F",X"8B",X"8D",X"8A",X"8B",X"8B",X"AB",X"DF",X"45",X"0C",X"1F",X"05",X"3F", + X"17",X"5F",X"06",X"87",X"97",X"B7",X"82",X"95",X"B5",X"87",X"97",X"B7",X"82",X"95",X"95",X"95", + X"87",X"97",X"B7",X"82",X"95",X"B5",X"82",X"97",X"B8",X"97",X"97",X"B7",X"87",X"97",X"B7",X"8C", + X"98",X"B8",X"8C",X"98",X"B8",X"87",X"97",X"B7",X"87",X"97",X"B7",X"82",X"95",X"B5",X"82",X"97", + X"B8",X"97",X"97",X"B7",X"DF",X"93",X"0C",X"1F",X"05",X"3F",X"17",X"5F",X"06",X"87",X"8E",X"AE", + X"82",X"8E",X"AE",X"87",X"8E",X"AE",X"82",X"8E",X"8E",X"8E",X"87",X"8E",X"AE",X"82",X"8E",X"AE", + X"82",X"8E",X"AE",X"93",X"93",X"B3",X"87",X"8E",X"AE",X"8C",X"90",X"B0",X"8C",X"90",X"B0",X"87", + X"8E",X"AE",X"87",X"8E",X"AE",X"82",X"8E",X"AE",X"82",X"8E",X"AE",X"93",X"93",X"B3",X"DF",X"CD", + X"0C",X"1F",X"0E",X"3F",X"18",X"5F",X"09",X"88",X"87",X"88",X"85",X"94",X"93",X"94",X"91",X"85", + X"84",X"85",X"81",X"91",X"90",X"91",X"8D",X"85",X"83",X"81",X"83",X"91",X"8F",X"8D",X"8F",X"88", + X"8A",X"88",X"85",X"94",X"96",X"94",X"91",X"88",X"8A",X"8C",X"AD",X"A8",X"A5",X"A1",X"7F",X"00", + X"CA",X"7F",X"FF",X"8A",X"8A",X"8C",X"8A",X"A8",X"A6",X"A5",X"A3",X"7F",X"00",X"C1",X"7F",X"FF", + X"A1",X"FF",X"1F",X"0E",X"3F",X"18",X"5F",X"00",X"A1",X"A0",X"5F",X"09",X"A5",X"A5",X"80",X"A0", + X"85",X"A5",X"A5",X"80",X"85",X"A5",X"A6",X"A6",X"A6",X"A6",X"A5",X"85",X"A5",X"A6",X"80",X"A5", + X"C0",X"A5",X"A6",X"86",X"A6",X"C4",X"A8",X"A8",X"A8",X"FF",X"1F",X"08",X"3F",X"18",X"5F",X"00", + X"A1",X"80",X"5F",X"08",X"AD",X"A8",X"AD",X"C8",X"A8",X"80",X"8D",X"A8",X"A3",X"A8",X"A3",X"A8", + X"AD",X"C8",X"A8",X"AD",X"A8",X"AD",X"A5",X"A6",X"A1",X"A6",X"A7",X"A8",X"A8",X"AA",X"CC",X"C8", + X"FF",X"1F",X"0E",X"3F",X"16",X"5F",X"09",X"69",X"89",X"69",X"86",X"89",X"A7",X"24",X"24",X"25", + X"25",X"26",X"26",X"26",X"26",X"87",X"66",X"86",X"66",X"84",X"81",X"3F",X"10",X"22",X"23",X"24", + X"25",X"26",X"27",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"AE",X"FF",X"1F",X"0E",X"3F",X"16",X"5F", + X"09",X"66",X"86",X"66",X"82",X"86",X"A4",X"A0",X"62",X"82",X"62",X"81",X"80",X"3F",X"10",X"26", + X"27",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"30",X"31",X"B2",X"FF",X"1F",X"08",X"3F", + X"16",X"5F",X"08",X"A2",X"A0",X"A4",X"A0",X"A2",X"A1",X"3F",X"10",X"A2",X"FF",X"1F",X"0F",X"3F", + X"1A",X"5F",X"0C",X"9F",X"02",X"81",X"81",X"A1",X"81",X"81",X"A1",X"81",X"81",X"81",X"81",X"A1", + X"A1",X"81",X"81",X"A1",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"A1",X"A1",X"81",X"81", + X"A1",X"81",X"81",X"A1",X"81",X"81",X"81",X"81",X"A1",X"A1",X"81",X"81",X"81",X"81",X"81",X"81", + X"81",X"81",X"A1",X"81",X"81",X"A1",X"FF",X"FF",X"1F",X"0F",X"3F",X"1A",X"5F",X"0C",X"9F",X"02", + X"81",X"81",X"A1",X"81",X"81",X"A1",X"A1",X"A1",X"61",X"61",X"61",X"61",X"81",X"81",X"81",X"81", + X"A1",X"81",X"81",X"A1",X"A1",X"A1",X"61",X"61",X"61",X"61",X"81",X"81",X"81",X"81",X"A1",X"61", + X"61",X"61",X"61",X"81",X"81",X"81",X"81",X"A1",X"61",X"61",X"61",X"61",X"81",X"81",X"81",X"81", + X"81",X"81",X"A1",X"A1",X"A1",X"FF",X"1F",X"0F",X"3F",X"1A",X"5F",X"0C",X"9F",X"02",X"81",X"A1", + X"A1",X"A1",X"80",X"81",X"A1",X"A1",X"A1",X"80",X"81",X"A1",X"61",X"61",X"61",X"61",X"61",X"61", + X"81",X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"81",X"A1",X"A1",X"A1",X"80",X"81",X"A1",X"A1", + X"A1",X"80",X"81",X"A1",X"81",X"81",X"A1",X"A1",X"A1",X"81",X"81",X"A1",X"FF",X"1F",X"0F",X"3F", + X"1A",X"5F",X"0C",X"9F",X"02",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"A1", + X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"A1",X"A1",X"81",X"A1",X"81",X"A1",X"A1", + X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61",X"61", + X"61",X"61",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"A1",X"A1",X"81",X"A1", + X"81",X"81",X"81",X"81",X"81",X"A1",X"FF",X"1F",X"0E",X"3F",X"16",X"5F",X"09",X"95",X"97",X"99", + X"9A",X"95",X"95",X"B5",X"93",X"92",X"B3",X"92",X"90",X"B2",X"90",X"AE",X"8B",X"8D",X"8E",X"AD", + X"8E",X"B0",X"AE",X"E0",X"C0",X"A0",X"97",X"95",X"8B",X"8D",X"AE",X"FF",X"1F",X"0E",X"3F",X"16", + X"5F",X"09",X"92",X"93",X"95",X"95",X"92",X"92",X"B2",X"90",X"8E",X"B0",X"8E",X"8D",X"AE",X"8D", + X"AB",X"87",X"89",X"8B",X"A9",X"8B",X"AD",X"A9",X"E0",X"C0",X"A0",X"93",X"92",X"87",X"89",X"AB", + X"FF",X"1F",X"02",X"3F",X"16",X"5F",X"00",X"A1",X"80",X"5F",X"09",X"8E",X"95",X"92",X"95",X"8E", + X"90",X"92",X"B3",X"97",X"8E",X"B2",X"95",X"AE",X"93",X"97",X"8E",X"97",X"8D",X"95",X"90",X"5F", + X"0B",X"7F",X"FE",X"9F",X"02",X"61",X"61",X"81",X"81",X"81",X"61",X"61",X"81",X"81",X"81",X"61", + X"61",X"81",X"81",X"61",X"81",X"61",X"81",X"81",X"A1",X"5F",X"09",X"7F",X"FF",X"9F",X"00",X"97", + X"95",X"8B",X"8D",X"AE",X"FF",X"1F",X"0F",X"3F",X"18",X"5F",X"09",X"66",X"68",X"8A",X"8D",X"8D", + X"8F",X"8D",X"8A",X"86",X"66",X"68",X"8A",X"8A",X"88",X"86",X"A8",X"88",X"66",X"68",X"8A",X"8D", + X"8D",X"6D",X"6F",X"8D",X"8A",X"86",X"66",X"68",X"8A",X"8A",X"88",X"88",X"A6",X"86",X"66",X"68", + X"8A",X"8D",X"8D",X"6D",X"6F",X"8D",X"8A",X"86",X"66",X"68",X"8A",X"8A",X"88",X"86",X"A8",X"80", + X"66",X"68",X"8A",X"8D",X"8D",X"8F",X"8D",X"8A",X"86",X"66",X"68",X"8A",X"8A",X"88",X"68",X"68", + X"A6",X"FF",X"1F",X"0B",X"3F",X"18",X"5F",X"00",X"81",X"5F",X"08",X"82",X"92",X"92",X"92",X"82", + X"92",X"92",X"92",X"82",X"92",X"84",X"94",X"89",X"93",X"B3",X"82",X"92",X"92",X"92",X"82",X"92", + X"B4",X"82",X"92",X"89",X"93",X"82",X"92",X"B2",X"82",X"92",X"92",X"92",X"82",X"92",X"92",X"92", + X"82",X"92",X"84",X"94",X"89",X"93",X"B3",X"82",X"92",X"92",X"92",X"82",X"92",X"92",X"92",X"B2", + X"B3",X"B2",X"FF",X"1F",X"05",X"3F",X"18",X"5F",X"00",X"81",X"5F",X"09",X"82",X"8E",X"8E",X"8E", + X"82",X"8E",X"8E",X"8E",X"82",X"8E",X"84",X"90",X"89",X"90",X"B0",X"82",X"8E",X"8E",X"8E",X"82", + X"8E",X"B0",X"82",X"8E",X"89",X"90",X"82",X"8E",X"AE",X"82",X"8E",X"8E",X"8E",X"82",X"8E",X"8E", + X"8E",X"82",X"8E",X"84",X"90",X"89",X"90",X"B0",X"82",X"8E",X"8E",X"8E",X"92",X"8E",X"8E",X"8E", + X"AE",X"B0",X"CE",X"FF",X"1F",X"0E",X"3F",X"17",X"5F",X"09",X"92",X"93",X"B5",X"92",X"93",X"B5", + X"97",X"99",X"99",X"97",X"97",X"96",X"B7",X"90",X"92",X"B3",X"90",X"92",X"B3",X"99",X"97",X"95", + X"93",X"92",X"90",X"AE",X"E0",X"E0",X"A0",X"97",X"95",X"93",X"92",X"90",X"AE",X"FF",X"1F",X"08", + X"3F",X"17",X"5F",X"08",X"8B",X"8D",X"8E",X"95",X"92",X"95",X"8E",X"95",X"92",X"95",X"93",X"97", + X"8E",X"97",X"93",X"97",X"8E",X"97",X"8D",X"95",X"90",X"95",X"8D",X"95",X"90",X"95",X"8E",X"95", + X"92",X"95",X"AE",X"E0",X"E0",X"A0",X"1F",X"0E",X"93",X"92",X"90",X"8E",X"8D",X"B2",X"FF",X"1F", + X"08",X"3F",X"17",X"5F",X"00",X"A1",X"80",X"5F",X"09",X"9A",X"80",X"9A",X"80",X"9A",X"80",X"9A", + X"80",X"9A",X"80",X"9A",X"80",X"9A",X"80",X"9A",X"80",X"99",X"80",X"99",X"80",X"99",X"80",X"99", + X"80",X"9A",X"80",X"9A",X"B2",X"80",X"5F",X"0B",X"7F",X"FE",X"9F",X"02",X"61",X"61",X"81",X"81", + X"81",X"61",X"61",X"81",X"81",X"81",X"61",X"61",X"81",X"81",X"81",X"81",X"81",X"81",X"A1",X"5F", + X"09",X"7F",X"FF",X"9F",X"00",X"5F",X"08",X"97",X"95",X"93",X"92",X"90",X"AE",X"FF",X"1F",X"0F", + X"3F",X"18",X"5F",X"09",X"86",X"83",X"86",X"86",X"86",X"84",X"88",X"88",X"68",X"68",X"6A",X"6A", + X"8A",X"88",X"8A",X"8B",X"8D",X"AF",X"83",X"86",X"86",X"86",X"84",X"88",X"88",X"88",X"8A",X"6A", + X"6A",X"88",X"8A",X"8B",X"86",X"AB",X"86",X"86",X"86",X"66",X"66",X"88",X"88",X"A8",X"6A",X"6A", + X"8A",X"88",X"8A",X"8B",X"8D",X"AF",X"86",X"86",X"86",X"66",X"66",X"88",X"88",X"A8",X"6A",X"6A", + X"8A",X"88",X"8A",X"8B",X"86",X"AB",X"FF",X"1F",X"0A",X"3F",X"18",X"5F",X"00",X"81",X"5F",X"08", + X"89",X"99",X"8D",X"99",X"81",X"9A",X"89",X"9A",X"84",X"9A",X"88",X"9A",X"89",X"99",X"B9",X"89", + X"99",X"8D",X"99",X"82",X"9A",X"89",X"9A",X"84",X"9A",X"88",X"9A",X"89",X"99",X"B9",X"89",X"99", + X"8D",X"99",X"81",X"9A",X"89",X"9A",X"84",X"9A",X"88",X"9A",X"89",X"99",X"8D",X"99",X"89",X"99", + X"8D",X"99",X"82",X"9A",X"89",X"9A",X"84",X"9A",X"88",X"9A",X"89",X"99",X"B9",X"FF",X"1F",X"04", + X"3F",X"18",X"5F",X"00",X"81",X"5F",X"09",X"89",X"90",X"8D",X"90",X"81",X"92",X"89",X"92",X"84", + X"90",X"88",X"90",X"89",X"90",X"B0",X"89",X"90",X"8D",X"90",X"82",X"92",X"89",X"92",X"84",X"92", + X"88",X"92",X"89",X"90",X"B0",X"89",X"90",X"8D",X"90",X"81",X"92",X"89",X"92",X"84",X"92",X"88", + X"92",X"89",X"90",X"8D",X"90",X"89",X"90",X"8D",X"90",X"82",X"92",X"89",X"92",X"84",X"90",X"88", + X"90",X"89",X"90",X"B0",X"FF",X"3F",X"1A",X"5F",X"07",X"1F",X"0F",X"7E",X"7C",X"7A",X"78",X"77", + X"75",X"73",X"72",X"70",X"6E",X"6C",X"6B",X"69",X"67",X"66",X"64",X"62",X"1F",X"00",X"7E",X"7D", + X"7B",X"79",X"78",X"76",X"74",X"72",X"71",X"6F",X"6D",X"6C",X"6A",X"68",X"66",X"65",X"63",X"61", + X"FF",X"1F",X"0F",X"3F",X"1A",X"5F",X"0A",X"9F",X"02",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61", + X"61",X"61",X"61",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"A1",X"A1",X"81", + X"A1",X"81",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"A1",X"A1",X"61",X"61", + X"61",X"61",X"61",X"61",X"61",X"61",X"A1",X"A1",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61", + X"A1",X"A1",X"81",X"A1",X"81",X"81",X"81",X"81",X"81",X"C1",X"FF",X"1F",X"0D",X"3F",X"18",X"5F", + X"09",X"AD",X"AF",X"B2",X"8D",X"8F",X"92",X"8D",X"8F",X"92",X"8D",X"8F",X"92",X"8D",X"8F",X"B2", + X"80",X"8F",X"92",X"94",X"8F",X"92",X"94",X"8F",X"92",X"94",X"8F",X"92",X"B4",X"80",X"94",X"96", + X"99",X"94",X"96",X"99",X"94",X"96",X"99",X"94",X"96",X"B9",X"9B",X"B9",X"B7",X"92",X"B4",X"8F", + X"B2",X"8D",X"AF",X"88",X"AD",X"A6",X"DF",X"44",X"12",X"3F",X"18",X"5F",X"00",X"C1",X"A0",X"5F", + X"07",X"1F",X"0D",X"92",X"92",X"92",X"92",X"92",X"B2",X"B2",X"92",X"92",X"92",X"92",X"92",X"94", + X"94",X"94",X"94",X"94",X"B4",X"B4",X"94",X"94",X"94",X"94",X"94",X"99",X"99",X"99",X"99",X"99", + X"B9",X"B9",X"99",X"99",X"B9",X"80",X"A0",X"1F",X"07",X"B7",X"92",X"B4",X"8F",X"B2",X"8D",X"AF", + X"88",X"AD",X"A6",X"DF",X"81",X"12",X"3F",X"18",X"5F",X"00",X"C1",X"A0",X"5F",X"08",X"1F",X"07", + X"86",X"86",X"A3",X"81",X"A3",X"86",X"86",X"86",X"A3",X"86",X"85",X"88",X"88",X"A5",X"83",X"A5", + X"88",X"88",X"88",X"A5",X"88",X"86",X"8D",X"8D",X"AA",X"88",X"AA",X"8D",X"8D",X"8D",X"8A",X"AA", + X"80",X"A0",X"1F",X"01",X"B7",X"92",X"B4",X"8F",X"B2",X"8D",X"AF",X"88",X"AD",X"A6",X"DF",X"BE", + X"12",X"3F",X"16",X"5F",X"08",X"1F",X"02",X"7F",X"00",X"CD",X"7F",X"FF",X"CC",X"7F",X"00",X"CD", + X"7F",X"FF",X"CC",X"7F",X"00",X"CD",X"7F",X"FF",X"CC",X"7F",X"00",X"CD",X"7F",X"FF",X"CC",X"1F", + X"0E",X"80",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"8F", + X"7F",X"00",X"88",X"7F",X"FF",X"C8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8",X"A8", + X"A8",X"A8",X"A8",X"8F",X"7F",X"00",X"88",X"7F",X"FF",X"A8",X"80",X"81",X"85",X"88",X"8D",X"86", + X"8A",X"8D",X"92",X"88",X"8C",X"91",X"94",X"94",X"91",X"8C",X"88",X"86",X"8A",X"8D",X"92",X"81", + X"85",X"88",X"8D",X"1F",X"08",X"8A",X"92",X"94",X"99",X"1F",X"0E",X"88",X"8C",X"8F",X"94",X"81", + X"85",X"88",X"8D",X"86",X"8A",X"8D",X"92",X"88",X"8C",X"91",X"94",X"94",X"91",X"8C",X"88",X"86", + X"8A",X"8D",X"92",X"81",X"85",X"88",X"8D",X"AD",X"B2",X"7F",X"00",X"88",X"7F",X"FF",X"A8",X"80", + X"FF",X"3F",X"16",X"1F",X"08",X"5F",X"09",X"7F",X"00",X"CD",X"7F",X"FF",X"8C",X"BF",X"14",X"80", + X"A0",X"7F",X"00",X"CD",X"7F",X"FF",X"CC",X"7F",X"00",X"CD",X"7F",X"FF",X"8C",X"BF",X"14",X"80", + X"A0",X"7F",X"00",X"CD",X"1F",X"0E",X"5F",X"0A",X"9F",X"01",X"71",X"71",X"71",X"71",X"B1",X"5F", + X"09",X"7F",X"FF",X"9F",X"00",X"88",X"88",X"86",X"86",X"85",X"85",X"83",X"83",X"A1",X"A3",X"7F", + X"00",X"BF",X"01",X"85",X"BF",X"01",X"85",X"7F",X"FF",X"BF",X"01",X"A5",X"88",X"88",X"86",X"86", + X"85",X"85",X"83",X"83",X"A1",X"A3",X"7F",X"00",X"BF",X"05",X"81",X"BF",X"05",X"81",X"7F",X"FF", + X"BF",X"05",X"A1",X"88",X"88",X"86",X"86",X"85",X"85",X"83",X"83",X"A1",X"A3",X"BF",X"04",X"7F", + X"00",X"85",X"7F",X"FF",X"A5",X"80",X"88",X"88",X"86",X"86",X"85",X"85",X"83",X"83",X"BF",X"04", + X"81",X"1F",X"08",X"8C",X"1F",X"0E",X"81",X"83",X"BF",X"04",X"7F",X"00",X"A1",X"7F",X"FF",X"A1", + X"7F",X"00",X"A8",X"7F",X"FF",X"A8",X"7F",X"00",X"AA",X"7F",X"FF",X"AA",X"BF",X"01",X"8C",X"BF", + X"01",X"8A",X"BF",X"01",X"88",X"BF",X"01",X"8A",X"BF",X"01",X"7F",X"00",X"AC",X"7F",X"FF",X"AC", + X"7F",X"00",X"B1",X"7F",X"FF",X"B1",X"7F",X"00",X"AC",X"7F",X"FF",X"AC",X"BF",X"09",X"8D",X"BF", + X"09",X"8C",X"BF",X"09",X"8A",X"BF",X"09",X"88",X"BF",X"05",X"7F",X"00",X"A6",X"7F",X"FF",X"BF", + X"03",X"A6",X"7F",X"00",X"A8",X"7F",X"FF",X"A8",X"7F",X"00",X"AA",X"7F",X"FF",X"AA",X"BF",X"0A", + X"8C",X"8A",X"88",X"8A",X"BF",X"01",X"7F",X"00",X"AC",X"7F",X"FF",X"AC",X"BF",X"08",X"7F",X"00", + X"B1",X"7F",X"FF",X"BF",X"03",X"B1",X"BF",X"08",X"7F",X"00",X"AD",X"7F",X"FF",X"BF",X"03",X"AD", + X"BF",X"08",X"8A",X"88",X"BF",X"08",X"86",X"83",X"BF",X"03",X"7F",X"00",X"A5",X"7F",X"FF",X"BF", + X"03",X"85",X"5F",X"0A",X"7F",X"FE",X"9F",X"02",X"61",X"61",X"81",X"81",X"81",X"61",X"61",X"81", + X"81",X"81",X"61",X"61",X"81",X"81",X"61",X"81",X"61",X"81",X"81",X"BF",X"12",X"A1",X"FF",X"3F", + X"16",X"1F",X"08",X"5F",X"09",X"7F",X"00",X"C7",X"7F",X"FF",X"C6",X"7F",X"00",X"C7",X"7F",X"FF", + X"C6",X"7F",X"00",X"C7",X"7F",X"FF",X"C6",X"7F",X"00",X"C7",X"7F",X"FF",X"C6",X"1F",X"02",X"5F", + X"08",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F", + X"2F",X"91",X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"94",X"88",X"8A",X"8C", + X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F", + X"91",X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"94",X"92",X"91",X"8F",X"8D", + X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91", + X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"94",X"88",X"8A",X"8C",X"8D",X"60", + X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74", + X"8D",X"60",X"6D",X"2F",X"2F",X"2F",X"2F",X"91",X"74",X"8D",X"8C",X"AD",X"1F",X"0E",X"5F",X"09", + X"7F",X"00",X"A5",X"7F",X"FF",X"A5",X"7F",X"00",X"A6",X"7F",X"FF",X"A6",X"88",X"86",X"85",X"86", + X"7F",X"00",X"88",X"7F",X"FF",X"A8",X"80",X"7F",X"00",X"AD",X"7F",X"FF",X"AD",X"7F",X"00",X"A8", + X"7F",X"FF",X"A8",X"8A",X"88",X"86",X"85",X"7F",X"00",X"83",X"7F",X"FF",X"A3",X"80",X"7F",X"00", + X"A5",X"7F",X"FF",X"A5",X"7F",X"00",X"A6",X"7F",X"FF",X"A6",X"88",X"86",X"85",X"86",X"7F",X"00", + X"88",X"7F",X"FF",X"A8",X"80",X"7F",X"00",X"AD",X"7F",X"FF",X"AD",X"7F",X"00",X"A8",X"7F",X"FF", + X"A8",X"86",X"85",X"83",X"1F",X"08",X"8C",X"1F",X"0E",X"7F",X"00",X"AD",X"7F",X"FF",X"AD",X"FF", + X"FF",X"1F",X"0E",X"3F",X"15",X"5F",X"09",X"BA",X"D2",X"C6",X"D2",X"BF",X"C4",X"F3",X"F3",X"CC", + X"BE",X"C5",X"CF",X"D2",X"C6",X"F3",X"F3",X"CA",X"CF",X"CE",X"C4",X"C5",X"F3",X"F3",X"D2",X"C1", + X"D0",X"D2",X"CF",X"CA",X"D2",X"F3",X"F3",X"DA",X"DA",X"DA",X"F3",X"F3",X"D0",X"C4",X"C3",X"BA", + X"C1",X"CA",X"CC",X"CB",X"BF",X"F3",X"C8",X"C4",X"C5",X"D2",X"C6",X"CA",X"FF",X"FF",X"FF",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_sprite_color_lut.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_sprite_color_lut.vhd new file mode 100644 index 00000000..79da34bd --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_sprite_color_lut.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_sprite_color_lut is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_sprite_color_lut is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"02",X"02",X"04",X"02",X"06",X"07",X"08",X"09",X"04",X"0B",X"0C",X"06",X"0E",X"0F",X"0F", + X"00",X"03",X"02",X"05",X"03",X"07",X"08",X"09",X"0A",X"0B",X"0F",X"0F",X"0F",X"0F",X"0F",X"00", + X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F", + X"00",X"05",X"02",X"0B",X"05",X"09",X"0A",X"0B",X"0C",X"04",X"0E",X"0F",X"01",X"02",X"03",X"04", + X"00",X"04",X"07",X"0D",X"04",X"05",X"0B",X"0C",X"0D",X"0E",X"0A",X"01",X"02",X"03",X"04",X"0F", + X"00",X"01",X"01",X"02",X"01",X"0F",X"02",X"02",X"0F",X"0F",X"01",X"0F",X"00",X"01",X"00",X"00", + X"00",X"01",X"01",X"02",X"01",X"0F",X"00",X"00",X"01",X"01",X"00",X"00",X"01",X"0F",X"00",X"00", + X"00",X"01",X"01",X"04",X"01",X"0F",X"01",X"00",X"01",X"0F",X"0F",X"0F",X"00",X"0F",X"0F",X"00", + X"00",X"0A",X"02",X"01",X"03",X"0E",X"0F",X"01",X"02",X"04",X"04",X"05",X"06",X"07",X"08",X"0F", + X"00",X"04",X"02",X"0D",X"01",X"0F",X"01",X"01",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0F", + X"00",X"04",X"04",X"0F",X"0F",X"04",X"04",X"04",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0D",X"0E",X"0F",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0F", + X"00",X"04",X"04",X"04",X"0F",X"0F",X"0F",X"00",X"04",X"0F",X"0F",X"0F",X"04",X"00",X"00",X"00", + X"00",X"0F",X"02",X"02",X"0F",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"04", + X"00",X"01",X"02",X"03",X"0C",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_sprite_grphx1.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_sprite_grphx1.vhd new file mode 100644 index 00000000..f45fdfb4 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_sprite_grphx1.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_sprite_grphx1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_sprite_grphx1 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"10",X"00",X"00",X"00",X"00", + X"E0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"E8",X"30",X"30",X"31",X"00",X"10",X"30",X"31",X"71",X"F2",X"F2",X"EE", + X"88",X"00",X"88",X"FC",X"F8",X"F7",X"F7",X"F0",X"00",X"00",X"00",X"80",X"E0",X"F0",X"C0",X"80", + X"31",X"30",X"30",X"E8",X"88",X"00",X"00",X"00",X"EE",X"F2",X"F2",X"71",X"31",X"30",X"10",X"00", + X"F3",X"F7",X"F7",X"FB",X"FC",X"88",X"00",X"88",X"80",X"C8",X"F8",X"E0",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"77",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"20",X"32",X"33",X"00",X"00",X"10",X"77",X"FF",X"F7",X"FF",X"FF", + X"00",X"00",X"80",X"CC",X"EE",X"FE",X"FE",X"FF",X"00",X"00",X"00",X"00",X"51",X"79",X"68",X"E0", + X"33",X"11",X"11",X"20",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00", + X"FF",X"FE",X"EE",X"CC",X"88",X"00",X"00",X"00",X"F1",X"F1",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"20",X"10",X"33",X"33",X"00",X"00",X"00",X"77",X"F7",X"FF",X"BF",X"FE", + X"00",X"00",X"02",X"89",X"CC",X"DC",X"FE",X"F6",X"00",X"00",X"00",X"22",X"F3",X"F3",X"E2",X"E0", + X"33",X"33",X"31",X"00",X"00",X"00",X"00",X"00",X"FE",X"BF",X"FF",X"FF",X"77",X"00",X"00",X"00", + X"F6",X"FE",X"DC",X"CC",X"89",X"02",X"00",X"00",X"E0",X"E2",X"F3",X"F3",X"22",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"66",X"00",X"00",X"FF",X"FF",X"FE",X"FD",X"FC",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E2",X"F3",X"33",X"33",X"11",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"EE",X"FF",X"FF",X"30",X"30", + X"00",X"10",X"FC",X"EC",X"10",X"70",X"F0",X"30",X"33",X"C0",X"F1",X"33",X"F1",X"F4",X"FE",X"FE", + X"91",X"40",X"B8",X"DC",X"FC",X"FC",X"F6",X"F7",X"88",X"80",X"00",X"80",X"C0",X"80",X"C0",X"80", + X"10",X"10",X"31",X"F1",X"70",X"10",X"00",X"00",X"F4",X"FC",X"FE",X"FE",X"FC",X"F1",X"33",X"11", + X"77",X"77",X"F7",X"E6",X"CC",X"CC",X"CC",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"B0",X"10",X"33",X"77",X"33",X"10",X"30",X"70",X"00",X"80",X"C0",X"C8",X"EC",X"EE",X"E2",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"BB",X"76",X"00",X"00",X"00",X"60",X"66",X"EE",X"F1",X"F1", + X"30",X"10",X"33",X"77",X"33",X"10",X"B0",X"C0",X"E2",X"EE",X"EC",X"C8",X"C0",X"80",X"00",X"00", + X"70",X"70",X"FC",X"FF",X"F3",X"F1",X"F1",X"F5",X"F2",X"F0",X"F0",X"F0",X"F1",X"E8",X"AA",X"99", + X"F6",X"F6",X"D4",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F3",X"FF",X"FF",X"77",X"FF",X"EE",X"88",X"00",X"99",X"99",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"20",X"32",X"33",X"00",X"00",X"10",X"77",X"FF",X"F7",X"FF",X"FF", + X"00",X"00",X"80",X"CC",X"EE",X"FE",X"FF",X"FF",X"00",X"00",X"00",X"00",X"C0",X"F1",X"F1",X"68", + X"33",X"11",X"11",X"20",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00", + X"FE",X"FE",X"EE",X"CC",X"88",X"00",X"00",X"00",X"68",X"B1",X"D1",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"10",X"31",X"33",X"76",X"BC",X"60",X"E0",X"E6",X"FF",X"EE",X"E8",X"E0",X"F0", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"76",X"33",X"31",X"10",X"10",X"00",X"00",X"00",X"E0",X"E8",X"EE",X"FF",X"E6",X"E0",X"60",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"FC",X"CC",X"10",X"70",X"F1",X"31",X"10",X"00",X"F0",X"73",X"F3",X"FD",X"FE",X"FE",X"FC", + X"00",X"00",X"80",X"C8",X"EC",X"F4",X"F6",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C8", + X"10",X"30",X"F0",X"70",X"10",X"00",X"00",X"00",X"F4",X"FE",X"FE",X"F5",X"F3",X"33",X"00",X"11", + X"77",X"F6",X"F4",X"FC",X"98",X"30",X"40",X"99",X"88",X"C0",X"C0",X"C0",X"80",X"00",X"80",X"88", + X"74",X"F8",X"F0",X"F1",X"B3",X"32",X"E1",X"71",X"C0",X"F1",X"F1",X"E8",X"BF",X"7E",X"FE",X"F7", + X"00",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"F2",X"00",X"00",X"00",X"00",X"00",X"50",X"F8",X"EC", + X"76",X"DD",X"DD",X"11",X"11",X"11",X"00",X"00",X"F8",X"F8",X"F2",X"F1",X"F4",X"F2",X"FC",X"33", + X"FD",X"F7",X"F3",X"F3",X"F3",X"F7",X"FF",X"EE",X"CC",X"CC",X"CC",X"CC",X"CC",X"E8",X"C0",X"00", + X"99",X"FF",X"77",X"FF",X"FF",X"FF",X"FF",X"67",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"33",X"FF",X"FF",X"FB",X"FD",X"F9",X"00",X"00",X"88",X"CC",X"CC",X"EF",X"EF",X"EF", + X"77",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"70",X"00",X"00",X"00",X"00", + X"F3",X"B3",X"80",X"00",X"11",X"11",X"33",X"33",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"88",X"00", + X"00",X"76",X"74",X"70",X"71",X"71",X"70",X"74",X"00",X"D0",X"90",X"E6",X"DF",X"BE",X"7F",X"FF", + X"00",X"00",X"88",X"88",X"F7",X"FC",X"F0",X"F2",X"00",X"00",X"00",X"00",X"CC",X"E2",X"EA",X"F5", + X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"FE",X"FE",X"FF",X"76",X"33",X"71",X"30", + X"F1",X"F8",X"FC",X"F7",X"FF",X"FF",X"FF",X"00",X"F1",X"F3",X"F7",X"FF",X"EE",X"EC",X"E8",X"40", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"B0",X"10",X"33",X"77",X"33",X"10",X"30",X"70",X"00",X"80",X"C0",X"C8",X"EC",X"EE",X"E2",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"10",X"33",X"77",X"33",X"10",X"30",X"00",X"E2",X"EE",X"EC",X"C8",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"30",X"70",X"70",X"70", + X"00",X"88",X"CC",X"88",X"C0",X"E0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"70",X"70",X"30",X"11",X"33",X"11", + X"C0",X"E0",X"E0",X"E0",X"C0",X"88",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"10",X"31",X"33",X"76",X"BC",X"60",X"E0",X"E6",X"EE",X"EE",X"E8",X"E0",X"E0", + X"F0",X"00",X"60",X"51",X"33",X"77",X"77",X"77",X"F0",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FD", + X"76",X"33",X"31",X"10",X"10",X"00",X"00",X"00",X"E0",X"E8",X"EE",X"EE",X"E6",X"E0",X"60",X"00", + X"77",X"77",X"77",X"33",X"33",X"00",X"00",X"00",X"FD",X"32",X"77",X"FF",X"FF",X"FE",X"30",X"00", + X"F0",X"00",X"CC",X"EE",X"FF",X"FF",X"FF",X"FF",X"F0",X"88",X"CC",X"FC",X"74",X"7C",X"18",X"B0", + X"B0",X"10",X"33",X"77",X"B3",X"90",X"B0",X"F0",X"00",X"80",X"C0",X"C8",X"EC",X"EE",X"E2",X"E0", + X"FD",X"FD",X"F3",X"FE",X"EC",X"C0",X"80",X"00",X"7C",X"7C",X"F4",X"7C",X"7C",X"74",X"44",X"44", + X"B0",X"90",X"B3",X"F7",X"B3",X"10",X"30",X"00",X"E2",X"EE",X"EC",X"C8",X"C0",X"80",X"00",X"00", + X"80",X"60",X"10",X"00",X"00",X"00",X"00",X"00",X"44",X"44",X"F4",X"44",X"E4",X"40",X"00",X"00", + X"20",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00", + X"88",X"88",X"88",X"88",X"88",X"88",X"C8",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"D1",X"F5",X"73",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7", + X"00",X"00",X"88",X"DD",X"DE",X"FE",X"DE",X"FC",X"00",X"00",X"00",X"D1",X"F1",X"F1",X"E0",X"E0", + X"FF",X"77",X"77",X"33",X"11",X"00",X"00",X"00",X"FB",X"FC",X"FF",X"FF",X"FF",X"F0",X"00",X"00", + X"DA",X"F5",X"DF",X"DD",X"BB",X"11",X"00",X"00",X"E0",X"E0",X"F9",X"F9",X"D9",X"00",X"00",X"00", + X"F0",X"00",X"00",X"CC",X"EE",X"FF",X"FF",X"FE",X"F0",X"00",X"88",X"CC",X"FC",X"BC",X"BC",X"F8", + X"B0",X"10",X"33",X"77",X"33",X"90",X"B0",X"F0",X"00",X"80",X"C0",X"C8",X"EC",X"EE",X"E2",X"E0", + X"FD",X"F3",X"77",X"33",X"33",X"11",X"00",X"00",X"BC",X"BC",X"F8",X"BC",X"BC",X"34",X"74",X"44", + X"B0",X"90",X"B3",X"F7",X"B3",X"90",X"30",X"00",X"E2",X"EE",X"EC",X"C8",X"C0",X"80",X"00",X"00", + X"C0",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"B0",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"60",X"10",X"00",X"00",X"00",X"00",X"22",X"00",X"30",X"C0",X"00",X"00",X"00",X"00", + X"00",X"30",X"C0",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"22",X"00",X"00",X"00",X"00",X"10",X"AA",X"FF",X"BB", + X"77",X"10",X"32",X"F3",X"F1",X"FC",X"FE",X"FE",X"00",X"22",X"22",X"B1",X"D1",X"C0",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"55",X"70",X"10",X"00",X"22",X"00",X"00",X"10",X"74",X"F0",X"E0",X"80", + X"FC",X"FE",X"F6",X"F6",X"F6",X"70",X"10",X"10",X"E0",X"F0",X"F0",X"E0",X"C8",X"C8",X"80",X"00", + X"00",X"33",X"10",X"10",X"11",X"22",X"11",X"33",X"70",X"F0",X"F0",X"F0",X"A5",X"FF",X"F8",X"F4", + X"E2",X"31",X"30",X"F0",X"B5",X"EE",X"FF",X"F7",X"00",X"88",X"00",X"00",X"00",X"88",X"00",X"88", + X"77",X"77",X"77",X"77",X"22",X"33",X"31",X"30",X"F1",X"F8",X"FC",X"FF",X"FF",X"FF",X"DD",X"77", + X"F3",X"F2",X"F5",X"FB",X"FB",X"FF",X"FF",X"DC",X"CC",X"C4",X"CC",X"CC",X"CC",X"88",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"2B",X"37",X"00",X"00",X"00",X"30",X"60",X"58",X"38",X"0C",X"FE", + X"00",X"00",X"00",X"E0",X"90",X"70",X"E1",X"E1",X"00",X"00",X"00",X"00",X"00",X"80",X"0C",X"8C", + X"11",X"23",X"22",X"00",X"00",X"00",X"00",X"00",X"0C",X"38",X"58",X"70",X"30",X"00",X"00",X"00", + X"F0",X"70",X"90",X"E0",X"80",X"00",X"00",X"00",X"0C",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"70",X"F0",X"30",X"10",X"00",X"11",X"33",X"F1",X"F0",X"FE",X"FE",X"F0", + X"33",X"A8",X"C8",X"C8",X"E4",X"F4",X"F7",X"77",X"00",X"00",X"11",X"31",X"51",X"C0",X"C0",X"C0", + X"10",X"31",X"F1",X"70",X"10",X"00",X"00",X"00",X"FC",X"FE",X"FE",X"FC",X"F1",X"33",X"11",X"00", + X"77",X"F7",X"F4",X"E4",X"C8",X"C8",X"A8",X"33",X"C0",X"C0",X"C0",X"51",X"31",X"11",X"00",X"00", + X"00",X"00",X"71",X"D9",X"77",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"88",X"CC",X"DE",X"FC",X"DF",X"FD",X"00",X"00",X"00",X"C0",X"20",X"A8",X"F9",X"F9", + X"FF",X"77",X"77",X"33",X"11",X"00",X"00",X"00",X"F7",X"FB",X"FC",X"FF",X"FF",X"F0",X"00",X"00", + X"DF",X"F8",X"D6",X"D8",X"80",X"00",X"00",X"00",X"F1",X"F1",X"E0",X"E0",X"40",X"00",X"00",X"00", + X"0F",X"00",X"00",X"00",X"00",X"10",X"F0",X"50",X"0E",X"01",X"00",X"00",X"11",X"F3",X"F1",X"FE", + X"00",X"0E",X"45",X"40",X"40",X"C8",X"E8",X"F4",X"00",X"00",X"0C",X"03",X"22",X"E2",X"A2",X"80", + X"30",X"10",X"10",X"30",X"50",X"F0",X"10",X"00",X"FE",X"F0",X"F0",X"FE",X"FE",X"F1",X"F3",X"11", + X"F0",X"90",X"90",X"F0",X"F4",X"E8",X"C8",X"71",X"80",X"88",X"88",X"80",X"80",X"A2",X"E2",X"22", + X"00",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0E",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"03",X"11",X"66", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"77",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD", + X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"EE",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22", + X"00",X"22",X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"99",X"BB",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"22",X"00",X"00",X"00",X"00", + X"00",X"00",X"44",X"88",X"00",X"00",X"00",X"00",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"DD", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"22",X"11",X"00",X"00",X"00",X"00",X"00", + X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"10",X"31",X"33",X"76",X"BC",X"60",X"E0",X"E6",X"EE",X"EE",X"E8",X"E0",X"E0", + X"F0",X"00",X"30",X"20",X"11",X"33",X"33",X"77",X"F0",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FD", + X"76",X"33",X"31",X"10",X"10",X"00",X"00",X"00",X"E0",X"E8",X"EE",X"EE",X"E6",X"E0",X"60",X"00", + X"77",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"FD",X"FE",X"33",X"BB",X"FF",X"FF",X"FC",X"60", + X"31",X"20",X"71",X"E0",X"71",X"70",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"11",X"80",X"F3", + X"00",X"CC",X"66",X"EE",X"44",X"CC",X"CC",X"EE",X"00",X"00",X"00",X"00",X"CC",X"66",X"40",X"40", + X"31",X"30",X"F0",X"73",X"30",X"00",X"00",X"00",X"FF",X"FC",X"F0",X"F0",X"F0",X"F0",X"30",X"00", + X"FF",X"FF",X"F7",X"F0",X"F0",X"A0",X"20",X"22",X"C8",X"C8",X"C0",X"C0",X"A0",X"20",X"31",X"33", + X"10",X"10",X"30",X"70",X"70",X"30",X"30",X"10",X"88",X"11",X"88",X"11",X"88",X"33",X"91",X"F3", + X"00",X"88",X"CC",X"CC",X"88",X"88",X"88",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"31",X"31",X"30",X"71",X"F0",X"00",X"00",X"00",X"FF",X"FE",X"F0",X"F0",X"F0",X"F0",X"30",X"00", + X"FF",X"CC",X"F0",X"C0",X"F0",X"80",X"00",X"00",X"99",X"55",X"F9",X"51",X"80",X"00",X"00",X"00", + X"00",X"00",X"10",X"30",X"30",X"30",X"10",X"10",X"C4",X"91",X"C4",X"90",X"D5",X"91",X"D1",X"F3", + X"00",X"88",X"CC",X"CC",X"88",X"AA",X"A8",X"EC",X"00",X"00",X"00",X"00",X"CC",X"66",X"40",X"40", + X"30",X"31",X"F0",X"73",X"30",X"00",X"00",X"00",X"FD",X"FE",X"F0",X"F0",X"F0",X"F0",X"30",X"00", + X"FD",X"FD",X"F0",X"F0",X"F0",X"80",X"00",X"00",X"88",X"CC",X"CC",X"E0",X"A0",X"20",X"31",X"33", + X"00",X"0F",X"00",X"00",X"00",X"10",X"70",X"F2",X"00",X"0E",X"01",X"00",X"11",X"F3",X"F1",X"FE", + X"00",X"00",X"0E",X"81",X"C0",X"E8",X"FC",X"F4",X"00",X"00",X"00",X"0C",X"03",X"71",X"51",X"C0", + X"30",X"10",X"10",X"30",X"F2",X"70",X"10",X"00",X"FE",X"F0",X"F0",X"FE",X"FE",X"F1",X"F3",X"11", + X"F0",X"90",X"90",X"F0",X"F4",X"EC",X"B8",X"00",X"C0",X"C4",X"C4",X"C0",X"C0",X"51",X"F9",X"11", + X"31",X"20",X"71",X"E0",X"71",X"70",X"30",X"10",X"00",X"0F",X"00",X"00",X"00",X"11",X"80",X"F3", + X"00",X"CC",X"67",X"EE",X"44",X"CC",X"CC",X"EE",X"00",X"00",X"08",X"07",X"CC",X"66",X"40",X"40", + X"31",X"30",X"F0",X"73",X"30",X"00",X"00",X"00",X"FD",X"FC",X"F0",X"F0",X"F0",X"F0",X"30",X"00", + X"FF",X"FF",X"F7",X"F0",X"F0",X"A0",X"20",X"22",X"C8",X"C8",X"C0",X"C0",X"A0",X"20",X"31",X"33", + X"18",X"10",X"30",X"70",X"70",X"30",X"30",X"10",X"88",X"15",X"8B",X"11",X"88",X"33",X"91",X"F3", + X"00",X"88",X"CC",X"CC",X"9E",X"A8",X"A8",X"EC",X"00",X"00",X"00",X"00",X"00",X"0C",X"03",X"00", + X"31",X"31",X"30",X"71",X"F0",X"00",X"00",X"00",X"FF",X"FE",X"FC",X"E0",X"D0",X"E2",X"30",X"00", + X"FF",X"FC",X"70",X"F0",X"70",X"80",X"00",X"00",X"99",X"D5",X"F1",X"D1",X"80",X"00",X"00",X"00", + X"00",X"00",X"11",X"33",X"72",X"F2",X"74",X"FC",X"00",X"00",X"CC",X"FF",X"F1",X"FC",X"FC",X"F0", + X"00",X"00",X"00",X"00",X"00",X"DC",X"F2",X"90",X"00",X"00",X"00",X"D1",X"31",X"D1",X"C0",X"C0", + X"FC",X"74",X"F2",X"72",X"33",X"11",X"00",X"00",X"F0",X"FC",X"FC",X"F1",X"FF",X"CC",X"00",X"00", + X"90",X"F2",X"DC",X"00",X"00",X"00",X"00",X"00",X"C0",X"D1",X"71",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"11",X"00",X"30",X"73",X"F0",X"31",X"31",X"F0",X"20",X"F0",X"F0",X"F0",X"F0",X"FE",X"FF", + X"80",X"C0",X"40",X"F0",X"F0",X"F0",X"F8",X"FC",X"00",X"22",X"E2",X"A2",X"80",X"80",X"11",X"B3", + X"10",X"10",X"30",X"30",X"30",X"10",X"10",X"00",X"C0",X"91",X"C4",X"00",X"88",X"00",X"88",X"00", + X"FC",X"FE",X"66",X"FF",X"33",X"66",X"00",X"00",X"EE",X"80",X"D1",X"31",X"11",X"00",X"00",X"00", + X"73",X"F0",X"30",X"10",X"00",X"00",X"00",X"00",X"F0",X"F0",X"FF",X"FF",X"F1",X"E0",X"F1",X"E0", + X"F0",X"F0",X"E6",X"EE",X"CC",X"CC",X"CC",X"66",X"D1",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"E2",X"51",X"62",X"00",X"00",X"00",X"00", + X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"40",X"20",X"30",X"90",X"40",X"30",X"03",X"00",X"40",X"20",X"20",X"2C",X"4B",X"7A",X"78", + X"40",X"90",X"E0",X"80",X"B0",X"E0",X"8F",X"C2",X"00",X"C0",X"40",X"80",X"20",X"40",X"80",X"00", + X"80",X"50",X"21",X"40",X"10",X"20",X"40",X"80",X"3F",X"1A",X"38",X"0B",X"10",X"20",X"40",X"00", + X"CB",X"E4",X"61",X"50",X"40",X"20",X"10",X"80",X"C0",X"20",X"90",X"08",X"C0",X"60",X"00",X"00", + X"00",X"60",X"F0",X"70",X"40",X"40",X"00",X"00",X"00",X"00",X"80",X"E0",X"80",X"20",X"A0",X"43", + X"00",X"10",X"30",X"40",X"00",X"40",X"80",X"08",X"00",X"00",X"00",X"80",X"40",X"E0",X"00",X"00", + X"00",X"00",X"40",X"D0",X"F0",X"70",X"10",X"00",X"43",X"A1",X"20",X"00",X"20",X"E0",X"E0",X"00", + X"48",X"20",X"00",X"20",X"30",X"00",X"00",X"00",X"00",X"20",X"60",X"E0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"20",X"70",X"F0",X"60",X"20",X"00",X"00", + X"00",X"00",X"80",X"00",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"20",X"00",X"00", + X"00",X"30",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"D0",X"F0",X"60",X"00", + X"00",X"00",X"00",X"90",X"80",X"00",X"00",X"00",X"00",X"60",X"20",X"E0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"60",X"60",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"E0",X"70",X"00",X"00",X"00", + X"10",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"0F",X"07",X"03",X"70",X"F0", + X"99",X"FF",X"77",X"FF",X"FF",X"FF",X"FF",X"67",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"33",X"FF",X"FF",X"FB",X"F8",X"FC",X"00",X"00",X"88",X"EF",X"EF",X"88",X"CC",X"EF", + X"77",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"70",X"00",X"00",X"00",X"00", + X"F4",X"B8",X"10",X"10",X"11",X"11",X"33",X"33",X"EF",X"01",X"CC",X"EE",X"EE",X"CC",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"40",X"40",X"30",X"00",X"77",X"04", + X"00",X"E0",X"10",X"10",X"E0",X"00",X"8E",X"89",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"47",X"00",X"00",X"34",X"20",X"00",X"00", + X"89",X"7F",X"00",X"01",X"69",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"C3",X"E1",X"30",X"10",X"00",X"00",X"00",X"F0",X"F0",X"C3",X"5A",X"F0",X"F0",X"30",X"00", + X"00",X"00",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08", + X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"07",X"00",X"00",X"6F",X"44",X"02",X"11", + X"02",X"0C",X"00",X"08",X"CE",X"88",X"08",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88",X"77",X"00",X"77",X"88",X"77",X"00", + X"CC",X"22",X"CC",X"00",X"CC",X"22",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"99",X"77",X"00",X"00",X"FF",X"44",X"00", + X"CC",X"22",X"CC",X"00",X"22",X"EE",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"77",X"33",X"00",X"00",X"00",X"00", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"33",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"BB",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0C",X"78",X"34", + X"00",X"00",X"00",X"0B",X"08",X"20",X"F0",X"F0",X"00",X"00",X"00",X"08",X"0C",X"06",X"02",X"83", + X"00",X"00",X"08",X"08",X"0C",X"0E",X"87",X"E1",X"30",X"30",X"30",X"10",X"00",X"00",X"08",X"68", + X"F0",X"F0",X"F0",X"F0",X"70",X"10",X"00",X"00",X"81",X"E1",X"F0",X"F0",X"E0",X"E0",X"E0",X"60"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_sprite_grphx2.vhd b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_sprite_grphx2.vhd new file mode 100644 index 00000000..51fd267b --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/proms/pooyan_sprite_grphx2.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity pooyan_sprite_grphx2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of pooyan_sprite_grphx2 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"12",X"34",X"69", + X"00",X"00",X"00",X"00",X"0C",X"C2",X"C2",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"4B",X"4B",X"0F",X"07",X"03",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0E",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"00",X"80",X"91",X"00",X"00",X"00",X"11",X"11",X"22",X"20",X"F0", + X"88",X"00",X"88",X"CC",X"88",X"77",X"74",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"51",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"F0",X"20",X"22",X"11",X"11",X"00",X"00",X"00", + X"33",X"77",X"77",X"BB",X"CC",X"88",X"00",X"88",X"00",X"80",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"00",X"00",X"00",X"70",X"F2",X"F7",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"C0",X"E8",X"EC",X"F4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"70",X"30",X"10",X"10", + X"F0",X"F4",X"F0",X"E0",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"22",X"33",X"00",X"00",X"10",X"77",X"FD",X"77",X"FF",X"FF", + X"00",X"00",X"80",X"CC",X"EE",X"FE",X"FE",X"FF",X"00",X"00",X"00",X"00",X"D1",X"F1",X"E0",X"E0", + X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00", + X"FF",X"FE",X"EE",X"CC",X"88",X"00",X"00",X"00",X"F1",X"F1",X"C0",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"00",X"33",X"33",X"00",X"00",X"00",X"77",X"77",X"FF",X"BF",X"FE", + X"00",X"40",X"20",X"98",X"CC",X"DC",X"FE",X"F6",X"00",X"00",X"00",X"22",X"F3",X"F3",X"E2",X"E0", + X"33",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"FE",X"BF",X"FF",X"FF",X"77",X"00",X"00",X"00", + X"F6",X"FE",X"DC",X"CC",X"98",X"20",X"40",X"00",X"E0",X"E2",X"F3",X"F3",X"22",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"76",X"00",X"00",X"FF",X"FF",X"FE",X"FC",X"F4",X"F6", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"32",X"33",X"33",X"33",X"11",X"00",X"00",X"00",X"F7",X"FF",X"FE",X"FE",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"33",X"00",X"11",X"33",X"11",X"44",X"EE",X"EA", + X"11",X"00",X"88",X"CC",X"CC",X"C8",X"64",X"70",X"88",X"00",X"00",X"00",X"00",X"60",X"30",X"10", + X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"44",X"C8",X"EE",X"EE",X"CC",X"11",X"33",X"11", + X"F0",X"F0",X"70",X"64",X"C8",X"CC",X"CC",X"88",X"A8",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"C0",X"BB",X"66",X"00",X"00",X"00",X"00",X"66",X"EE",X"11",X"11", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"CC",X"FF",X"F3",X"F1",X"F1",X"F1",X"22",X"00",X"00",X"00",X"11",X"88",X"AA",X"99", + X"66",X"66",X"44",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F3",X"FF",X"F5",X"F7",X"FF",X"EE",X"88",X"00",X"99",X"B9",X"98",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"22",X"33",X"00",X"00",X"10",X"77",X"FF",X"75",X"FF",X"FF", + X"00",X"00",X"80",X"CC",X"EE",X"FE",X"FF",X"FF",X"00",X"00",X"00",X"40",X"C0",X"F1",X"F1",X"E0", + X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00", + X"FE",X"FE",X"EE",X"CC",X"88",X"00",X"00",X"00",X"E0",X"F1",X"D1",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"8C",X"10",X"10",X"10",X"00",X"10",X"10",X"10",X"00", + X"00",X"80",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"10",X"10",X"10",X"00", + X"00",X"80",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"CC",X"CC",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"33",X"33",X"D9",X"EE",X"EE",X"CC", + X"00",X"00",X"00",X"88",X"CC",X"44",X"62",X"F0",X"00",X"00",X"00",X"00",X"00",X"20",X"10",X"B8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"EE",X"EE",X"51",X"33",X"33",X"00",X"11", + X"F0",X"62",X"44",X"CC",X"88",X"00",X"00",X"99",X"E8",X"00",X"00",X"00",X"00",X"00",X"00",X"88", + X"C4",X"88",X"00",X"11",X"73",X"E2",X"00",X"11",X"10",X"11",X"11",X"88",X"BB",X"76",X"FE",X"77", + X"00",X"80",X"00",X"00",X"EE",X"FF",X"FF",X"F2",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC", + X"66",X"DD",X"DD",X"D1",X"51",X"11",X"00",X"00",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0",X"FC",X"33", + X"FD",X"F7",X"F3",X"F2",X"F3",X"F7",X"FB",X"EE",X"CC",X"CC",X"CC",X"CC",X"CC",X"88",X"00",X"00", + X"19",X"3F",X"37",X"FF",X"FF",X"FF",X"FF",X"66",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"30",X"F8",X"F8",X"BC",X"DA",X"9E",X"00",X"00",X"80",X"C0",X"C0",X"E3",X"E3",X"E3", + X"77",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"70",X"00",X"00",X"00",X"00", + X"3C",X"B0",X"80",X"00",X"11",X"11",X"23",X"23",X"C0",X"80",X"AC",X"8E",X"0E",X"0C",X"08",X"00", + X"40",X"E6",X"C4",X"00",X"11",X"11",X"00",X"C4",X"00",X"20",X"60",X"66",X"DD",X"AA",X"77",X"FF", + X"00",X"C0",X"C8",X"88",X"77",X"FC",X"F0",X"F0",X"00",X"00",X"00",X"00",X"CC",X"E2",X"E2",X"F1", + X"C4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"FE",X"FE",X"FF",X"76",X"33",X"11",X"00", + X"F0",X"F8",X"FC",X"F7",X"FE",X"FF",X"FF",X"00",X"F1",X"F3",X"F5",X"FF",X"EE",X"CC",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"00",X"00",X"00",X"00", + X"00",X"88",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"8C",X"10",X"10",X"10",X"00",X"10",X"10",X"10",X"00", + X"00",X"80",X"00",X"11",X"33",X"F7",X"77",X"77",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FD", + X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"10",X"10",X"10",X"00", + X"77",X"F7",X"77",X"33",X"33",X"80",X"00",X"00",X"FD",X"F2",X"F3",X"FF",X"FF",X"FE",X"30",X"00", + X"00",X"00",X"CC",X"EE",X"FF",X"FF",X"FF",X"FF",X"00",X"88",X"CC",X"CC",X"44",X"44",X"60",X"40", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"FD",X"F3",X"EE",X"CC",X"C0",X"80",X"00",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"44",X"44",X"44",X"E4",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"11",X"11",X"00",X"00", + X"00",X"00",X"00",X"22",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00", + X"88",X"88",X"88",X"88",X"88",X"88",X"C8",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"55",X"33",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7", + X"00",X"00",X"98",X"DD",X"CC",X"EE",X"CC",X"CC",X"00",X"00",X"80",X"11",X"11",X"11",X"00",X"00", + X"FF",X"77",X"76",X"33",X"11",X"00",X"00",X"00",X"FB",X"FC",X"FF",X"FF",X"FF",X"F0",X"00",X"00", + X"C8",X"D5",X"DD",X"DD",X"BB",X"71",X"20",X"00",X"00",X"00",X"99",X"99",X"99",X"00",X"00",X"00", + X"00",X"10",X"30",X"CC",X"EE",X"FF",X"FF",X"FE",X"00",X"00",X"88",X"CC",X"CC",X"88",X"88",X"88", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"F3",X"77",X"33",X"33",X"11",X"00",X"00",X"88",X"88",X"88",X"88",X"88",X"00",X"44",X"44", + X"40",X"60",X"40",X"00",X"40",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"22",X"00",X"00",X"00",X"00",X"00",X"AA",X"FF",X"BB", + X"77",X"00",X"22",X"33",X"11",X"CC",X"EE",X"EE",X"00",X"22",X"22",X"11",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"55",X"00",X"60",X"70",X"22",X"00",X"00",X"00",X"44",X"00",X"00",X"00", + X"CC",X"EE",X"64",X"64",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00", + X"60",X"73",X"00",X"00",X"51",X"E2",X"11",X"33",X"00",X"00",X"00",X"00",X"00",X"FF",X"F8",X"F0", + X"22",X"DD",X"CC",X"00",X"11",X"EE",X"FF",X"F7",X"00",X"C8",X"40",X"00",X"00",X"E8",X"40",X"88", + X"77",X"77",X"77",X"76",X"32",X"33",X"11",X"00",X"F0",X"F8",X"FC",X"FF",X"FF",X"FD",X"FD",X"77", + X"F3",X"F2",X"F5",X"FB",X"FB",X"FF",X"FF",X"CC",X"CC",X"C4",X"CC",X"CC",X"CC",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20", + X"00",X"11",X"22",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"98",X"44",X"00",X"00",X"00",X"00",X"05",X"A0",X"84",X"E1",X"00", + X"00",X"00",X"C4",X"00",X"24",X"81",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0C", + X"10",X"30",X"20",X"00",X"00",X"00",X"00",X"00",X"E1",X"84",X"A1",X"36",X"00",X"00",X"00",X"00", + X"04",X"81",X"24",X"00",X"44",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"00",X"EE",X"E8",X"00", + X"33",X"88",X"88",X"88",X"44",X"40",X"71",X"F1",X"00",X"00",X"11",X"11",X"11",X"00",X"10",X"10", + X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"CC",X"EC",X"EE",X"CC",X"11",X"33",X"11",X"00", + X"F1",X"71",X"40",X"44",X"88",X"88",X"88",X"33",X"20",X"00",X"00",X"11",X"11",X"11",X"00",X"00", + X"00",X"00",X"11",X"B9",X"77",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"88",X"CC",X"CC",X"CC",X"DD",X"DD",X"00",X"00",X"00",X"00",X"C0",X"C8",X"99",X"99", + X"FF",X"77",X"77",X"32",X"11",X"00",X"00",X"00",X"F7",X"FB",X"FC",X"FF",X"FF",X"F0",X"00",X"00", + X"DD",X"C8",X"C4",X"88",X"10",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"E2", + X"00",X"00",X"44",X"00",X"00",X"88",X"88",X"44",X"00",X"00",X"00",X"00",X"22",X"22",X"22",X"00", + X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"EE",X"00",X"00",X"E2",X"EE",X"11",X"33",X"11", + X"00",X"60",X"60",X"00",X"44",X"88",X"88",X"11",X"00",X"E8",X"B8",X"10",X"20",X"22",X"22",X"22", + X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"E0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"80",X"D1",X"E6", + X"70",X"70",X"70",X"70",X"30",X"30",X"10",X"00",X"F0",X"F0",X"F0",X"F0",X"FA",X"F7",X"F0",X"70", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"80",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"30",X"70",X"70",X"F0",X"F0",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"C0",X"E0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"DD", + X"F0",X"F0",X"F1",X"71",X"30",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"FC",X"FE",X"F0",X"00",X"00", + X"F0",X"F0",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"A2",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"30",X"70",X"F0",X"F0",X"F0",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"80",X"C0",X"E0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A2", + X"F0",X"F2",X"73",X"71",X"31",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F9",X"FB",X"F0",X"00",X"00", + X"F0",X"F0",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"DD",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30",X"00",X"00",X"30",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"80",X"E0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"DD", + X"30",X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"F0",X"F8",X"FC",X"F2",X"70",X"00",X"00",X"00", + X"F0",X"F0",X"F4",X"E8",X"C0",X"00",X"00",X"00",X"A2",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"E0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"80",X"A2",X"DD", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F2",X"72",X"71",X"10",X"00",X"00",X"00",X"00", + X"F0",X"F4",X"F0",X"C0",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"8C",X"10",X"10",X"10",X"00",X"10",X"10",X"10",X"00", + X"00",X"80",X"00",X"00",X"11",X"B3",X"33",X"77",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FD", + X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"10",X"10",X"10",X"00", + X"77",X"F7",X"77",X"77",X"33",X"B3",X"11",X"00",X"FD",X"FE",X"F3",X"F3",X"FF",X"FF",X"FC",X"60", + X"D1",X"C0",X"91",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"33", + X"00",X"CC",X"66",X"EE",X"44",X"CC",X"CC",X"EE",X"00",X"00",X"00",X"00",X"CC",X"66",X"00",X"00", + X"11",X"00",X"00",X"33",X"00",X"00",X"00",X"00",X"F3",X"CC",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"77",X"00",X"00",X"00",X"00",X"22",X"88",X"88",X"00",X"00",X"00",X"80",X"D1",X"B3", + X"60",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"88",X"11",X"88",X"11",X"88",X"33",X"11",X"33", + X"00",X"88",X"CC",X"CC",X"88",X"88",X"88",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"00",X"11",X"00",X"00",X"00",X"00",X"F3",X"EE",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"CC",X"00",X"00",X"00",X"00",X"10",X"10",X"99",X"55",X"99",X"11",X"00",X"80",X"80",X"00", + X"30",X"30",X"20",X"00",X"00",X"00",X"00",X"00",X"44",X"11",X"44",X"00",X"55",X"11",X"11",X"33", + X"00",X"88",X"CC",X"CC",X"88",X"AA",X"88",X"CC",X"00",X"00",X"00",X"00",X"CC",X"66",X"00",X"00", + X"00",X"11",X"00",X"33",X"00",X"00",X"00",X"00",X"DD",X"E2",X"00",X"00",X"00",X"00",X"00",X"00", + X"DD",X"DD",X"00",X"00",X"00",X"00",X"10",X"30",X"88",X"CC",X"CC",X"00",X"00",X"80",X"91",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"EE", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"44",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00", + X"00",X"00",X"00",X"00",X"22",X"00",X"00",X"00",X"E8",X"00",X"00",X"E8",X"EE",X"11",X"33",X"11", + X"00",X"60",X"60",X"00",X"44",X"CC",X"88",X"00",X"10",X"54",X"64",X"00",X"00",X"11",X"99",X"11", + X"D1",X"C0",X"91",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"33", + X"00",X"CC",X"66",X"EE",X"44",X"CC",X"CC",X"EE",X"00",X"00",X"00",X"00",X"CC",X"66",X"00",X"00", + X"11",X"00",X"00",X"33",X"00",X"00",X"00",X"00",X"D1",X"CC",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"77",X"00",X"00",X"00",X"00",X"22",X"88",X"88",X"00",X"00",X"00",X"80",X"D1",X"B3", + X"60",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"88",X"11",X"88",X"11",X"88",X"33",X"11",X"33", + X"00",X"88",X"CC",X"CC",X"88",X"88",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"00",X"11",X"00",X"00",X"00",X"00",X"F3",X"EE",X"CC",X"00",X"00",X"22",X"00",X"00", + X"FF",X"CC",X"00",X"00",X"00",X"00",X"10",X"10",X"99",X"55",X"11",X"11",X"00",X"80",X"80",X"00", + X"00",X"00",X"01",X"03",X"02",X"02",X"04",X"0C",X"00",X"00",X"0C",X"0F",X"01",X"CC",X"C8",X"00", + X"00",X"00",X"00",X"00",X"30",X"0C",X"02",X"60",X"00",X"00",X"00",X"D1",X"11",X"11",X"00",X"00", + X"0C",X"04",X"02",X"02",X"03",X"01",X"00",X"00",X"00",X"C8",X"CC",X"01",X"0F",X"0C",X"00",X"00", + X"60",X"02",X"0C",X"60",X"30",X"00",X"00",X"00",X"40",X"51",X"91",X"91",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"F0",X"F0",X"F0",X"70",X"30",X"10", + X"00",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"11",X"00",X"00",X"33",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"F3", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"22",X"22",X"22",X"00",X"00",X"11",X"33", + X"00",X"00",X"00",X"00",X"40",X"60",X"60",X"00",X"00",X"11",X"44",X"00",X"88",X"00",X"88",X"00", + X"CC",X"EE",X"66",X"FF",X"33",X"66",X"00",X"00",X"EE",X"00",X"11",X"11",X"11",X"00",X"00",X"00", + X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"F9",X"11",X"00",X"11",X"00", + X"00",X"00",X"66",X"EE",X"CC",X"CC",X"CC",X"66",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"11",X"22",X"91",X"A2",X"00",X"00",X"00",X"00", + X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"07",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"07", + X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"04",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"0A",X"04", + X"00",X"00",X"00",X"00",X"00",X"04",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"02",X"00",X"00",X"00",X"00",X"00", + X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"16",X"78",X"F0",X"F0",X"78",X"3C",X"0F",X"0F", + X"19",X"3F",X"37",X"FF",X"FF",X"FF",X"FF",X"66",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"30",X"F8",X"F8",X"BC",X"8F",X"CF",X"00",X"00",X"80",X"E3",X"E3",X"C4",X"C0",X"E3", + X"77",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"70",X"00",X"00",X"00",X"00", + X"47",X"8B",X"10",X"10",X"11",X"11",X"23",X"23",X"E3",X"01",X"AC",X"8E",X"0E",X"0C",X"08",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"44",X"44",X"33",X"00",X"47",X"44", + X"00",X"EE",X"11",X"11",X"EE",X"00",X"6E",X"99",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"77",X"00",X"33",X"07",X"46",X"22",X"00", + X"99",X"9F",X"00",X"01",X"0F",X"45",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"3C",X"1E",X"0F",X"0F",X"07",X"03",X"00",X"0F",X"0F",X"3C",X"A5",X"0F",X"0F",X"0F",X"07", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"08",X"0C",X"0C",X"0C",X"0C",X"08",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88",X"88",X"77",X"00",X"77",X"88", + X"00",X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"77",X"00",X"66",X"FF",X"DD",X"66",X"11", + X"22",X"CC",X"00",X"CC",X"EE",X"AA",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88",X"77",X"00",X"77",X"88",X"77",X"00", + X"CC",X"22",X"CC",X"00",X"CC",X"22",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"99",X"77",X"00",X"00",X"FF",X"44",X"00", + X"CC",X"22",X"CC",X"00",X"22",X"EE",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"30",X"30",X"70",X"70",X"70",X"71",X"70",X"F0",X"F7",X"F3",X"F0",X"F0",X"F0",X"F0", + X"00",X"80",X"E8",X"FC",X"FE",X"F6",X"F6",X"F0",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80", + X"71",X"70",X"30",X"10",X"00",X"00",X"00",X"00",X"F8",X"FC",X"F0",X"F0",X"70",X"30",X"10",X"10", + X"F2",X"F0",X"E0",X"E0",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"00",X"00",X"00",X"00",X"C0",X"E0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30", + X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"80",X"C0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"31",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"FC",X"F0",X"00",X"00",X"00",X"00",X"00",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"70",X"70",X"F0",X"F0",X"F0", + X"00",X"00",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F6",X"73",X"70",X"10",X"00",X"00",X"00",X"00", + X"F0",X"FB",X"F8",X"E0",X"00",X"00",X"00",X"00",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"16",X"16",X"12",X"07",X"00",X"00",X"0B",X"F0",X"F0",X"C3",X"87",X"4B", + X"00",X"00",X"0B",X"B4",X"87",X"0F",X"0F",X"0F",X"00",X"00",X"08",X"84",X"C2",X"68",X"2C",X"3C", + X"0F",X"0F",X"87",X"87",X"C3",X"E1",X"78",X"1E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"87",X"87", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1E",X"1E",X"0F",X"0F",X"0E",X"0E",X"0E",X"0E"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/scandoubler.v b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/scandoubler.v new file mode 100644 index 00000000..eba1d598 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/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/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/video_mixer.sv b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/video_mixer.sv new file mode 100644 index 00000000..ee42674d --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/video_mixer.sv @@ -0,0 +1,228 @@ +// +// +// 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] 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 + ({r_out, 8'd0} + {r_out, 3'd0}) + ({g_out, 9'd0} + {g_out, 2'd0}) + ({b_out, 6'd0} + {b_out, 5'd0} + {b_out, 2'd0}); +wire [18:0] pb_8 = 19'd32768 - ({r_out, 7'd0} + {r_out, 4'd0} + {r_out, 3'd0}) - ({g_out, 8'd0} + {g_out, 5'd0} + {g_out, 3'd0}) + ({b_out, 8'd0} + {b_out, 7'd0} + {b_out, 6'd0}); +wire [18:0] pr_8 = 19'd32768 + ({r_out, 8'd0} + {r_out, 7'd0} + {r_out, 6'd0}) - ({g_out, 8'd0} + {g_out, 6'd0} + {g_out, 5'd0} + {g_out, 4'd0} + {g_out, 3'd0}) - ({b_out, 6'd0} + {b_out , 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]) : r_out; +assign VGA_G = ypbpr ? (ypbpr_full ? yuv_full[y -8'd16] : y[7:2]) : g_out; +assign VGA_B = ypbpr ? (ypbpr_full ? yuv_full[pb-8'd16] : pb[7:2]) : b_out; +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/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/video_mixer2.sv b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/video_mixer2.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/Pooyan_mistVGA/rtl/video_mixer2.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/Arcade/Konami Classic/Pooyan_MiST/README.txt b/Arcade/Konami Classic/Pooyan_MiST/README.txt new file mode 100644 index 00000000..2bc84c26 --- /dev/null +++ b/Arcade/Konami Classic/Pooyan_MiST/README.txt @@ -0,0 +1,208 @@ +--------------------------------------------------------------------------------- +-- POOYAN by Dar (darfpga@aol.fr) (29/10/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T80/T80se - Version : 0247 +----------------------------- +-- Z80 compatible microprocessor core +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- Features : +-- TV 15KHz mode only (atm) +-- Coctail mode ok +-- Sound ok +-- No external RAM/SDRAM required + +-- Use with MAME roms from timeplt.zip +-- +-- Use make_pooyan_proms.bat to build vhd file from binaries + +-- Time Pilot Hardware caracteristics : +-- +-- VIDEO : 1xZ80@3MHz CPU accessing its program rom, working ram, +-- sprite data ram, I/O, sound board register and trigger. +-- 24Kx8bits program rom +-- +-- One char tile map 32x28 +-- 8Kx8bits graphics rom 2bits/pixel +-- 4 colors/32sets among 16 colors +-- +-- 24 sprites with priorities and flip H/V +-- 16Kx8bits graphics rom 2bits/pixel +-- 3 colors/64sets among 16 colors (different of char colors). +-- +-- Char/sprites color palette 2x16 colors among 32768 colors +-- 15bits 5red/5green/5blue +-- +-- Working ram : 4Kx8bits +-- Sprites data ram : 256x16bits +-- Sprites line buffer rams : 1 scan line delay flip/flop 2x256x4bits + +-- SOUND : 1xZ80@1.79MHz CPU accessing its program rom, working ram, 2x-AY3-8910 +-- 8Kx8bits program rom +-- +-- 1xAY-3-8910 +-- I/O noise input and command/trigger from video board. +-- 3 sound channels +-- +-- 1xAY-3-8910 +-- 3 sound channels +-- +-- 6 RC filters with 4 states : transparent or cut 600Hz, 700Hz, 3.4KHz +-- +--------------------------------------------------------------------------------- +-- +-- Uses 1 pll for 12MHz and 14MHz generation from 50MHz +-- +-- Board key : +-- 0 : reset game +-- +-- Keyboard players inputs : +-- +-- F3 : Add coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE : Fire +-- RIGHT arrow : rotate right +-- LEFT arrow : rotate left +-- UP arrow : rotate up +-- DOWN arrow : rotate down +-- +-- Other details : see pooyan.vhd + +--------------------------------------------------------------------------------- +-- Use pooyan_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- + ++----------------------------------------------------------------------------------+ +; Fitter Summary ; ++------------------------------------+---------------------------------------------+ +; Fitter Status ; Successful - Sun Nov 05 10:17:02 2017 ; +; Quartus Prime Version ; 16.1.0 Build 196 10/24/2016 SJ Lite Edition ; +; Revision Name ; pooyan_de10_lite ; +; Top-level Entity Name ; pooyan_de10_lite ; +; Family ; MAX 10 ; +; Device ; 10M50DAF484C6GES ; +; Timing Models ; Preliminary ; +; Total logic elements ; 6,231 / 49,760 ( 13 % ) ; +; Total combinational functions ; 6,005 / 49,760 ( 12 % ) ; +; Dedicated logic registers ; 1,579 / 49,760 ( 3 % ) ; +; Total registers ; 1579 ; +; Total pins ; 105 / 360 ( 29 % ) ; +; Total virtual pins ; 0 ; +; Total memory bits ; 475,648 / 1,677,312 ( 28 % ) ; +; Embedded Multiplier 9-bit elements ; 2 / 288 ( < 1 % ) ; +; Total PLLs ; 1 / 4 ( 25 % ) ; +; UFM blocks ; 0 / 1 ( 0 % ) ; +; ADC blocks ; 0 / 2 ( 0 % ) ; ++------------------------------------+---------------------------------------------+ + +--------------- +VHDL File list +--------------- + +de_10/max10_pll_12M_14M.vhd Pll 12MHz and 14 MHz from 50MHz altera mf + +rtl_dar/pooyan_de10_lite.vhd Top level for de10_lite board +rtl_dar/pooyan.vhd Main video board logic +rtl_dar/pooyan_sound_board.vhd Main sound board logic + +rtl_mikej/YM2149_linmix_sep.vhd Copyright (c) MikeJ - Jan 2005 + +rtl_T80/T80se.vhdT80 Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +rtl_T80/T80_Reg.vhd +rtl_T80/T80_Pack.vhd +rtl_T80/T80_MCode.vhd +rtl_T80/T80_ALU.vhd +rtl_T80/T80.vhd + +rtl_dar/kbd_joystick.vhd Keyboard key to player/coin input +rtl_dar/io_ps2_keyboard.vhd Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +rtl_dar/gen_ram.vhd Generic RAM (Peter Wendrich + DAR Modification) +rtl_dar/decodeur_7_seg.vhd 7 segments display decoder + +rtl_dar/pooyan_prog.vhd Time pilot video board PROMs +rtl_dar/pooyan_char_grphx.vhd +rtl_dar/pooyan_char_color_lut.vhd +rtl_dar/pooyan_sprite_grphx.vhd +rtl_dar/pooyan_sprite_color_lut.vhd +rtl_dar/pooyan_palette_green_red.vhd +rtl_dar/pooyan_palette_blue_green.vhd + +rtl_dar/pooyan_sound_prog.vhd Time pilot sound board PROM + +---------------------- +Quartus project files +---------------------- +de10_lite/pooyan_de10_lite.sdc Timequest constraints file +de10_lite/pooyan_de10_lite.qsf de10_lite settings (files,pins...) +de10_lite/pooyan_de10_lite.qpf de10_lite project + +----------------------------- +Required ROMs (Not included) +----------------------------- +You need the following 11 ROMs binary files from timeplt.zip (MAME) + +tm1, tm2,tm3, tm4, tm5, tm6, tm7 +timeplt.b4 +timeplt.b5 +timeplt.e9 +timeplt.e12 + +------ +Tools +------ +You need to build vhdl files from the binary file : + - Unzip the roms file in the tools/pooyan_unzip directory + - Double click (execute) the script tools/make_pooyan_proms.bat to get the following files + +pooyan_prog.vhd : tm1, tm2,tm3 +pooyan_sprite_grphx.vhd : tm4, tm5 +pooyan_char_grphx.vhd : tm6 +pooyan_sound_prog.vhd : tm7 +pooyan_palette_blue_green.vhd : timeplt.b4 +pooyan_palette_green_red.vhd : timeplt.b5 +pooyan_sprite_color_lut.vhd : timeplt.e9 +pooyan_char_color_lut.vhd : timeplt.e12 + + +*DO NOT REDISTRIBUTE THESE FILES* + +VHDL files are needed to compile and include roms into the project + +The script make_pooyan_proms.bat uses make_vhdl_prom executables delivered both in linux and windows version. The script itself is delivered only in windows version (.bat) but should be easily ported to linux. + +Source code of make_vhdl_prom.c is also delivered. + +--------------------------------- +Compiling for de10_lite +--------------------------------- +You can build the project with ROM image embeded in the sof file. +*DO NOT REDISTRIBUTE THESE FILES* + +3 steps + + - put the VHDL ROM files (.vhd) into the rtl_dar directory + - build pooyan_de10_lite + - program pooyan_de10_lite.sof + +------------------------ +------------------------ +End of file +------------------------ diff --git a/Arcade/Konami Classic/Pooyan_MiST/pooyan_mist(RGB).rbf b/Arcade/Konami Classic/Pooyan_MiST/pooyan_mist(RGB).rbf new file mode 100644 index 00000000..3019a6a0 Binary files /dev/null and b/Arcade/Konami Classic/Pooyan_MiST/pooyan_mist(RGB).rbf differ diff --git a/Arcade/Konami Classic/Pooyan_MiST/pooyan_mist(wo OSD).rbf b/Arcade/Konami Classic/Pooyan_MiST/pooyan_mist(wo OSD).rbf new file mode 100644 index 00000000..ef990afc Binary files /dev/null and b/Arcade/Konami Classic/Pooyan_MiST/pooyan_mist(wo OSD).rbf differ diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/README.txt b/Arcade/Konami Classic/Time_Pilot_MiST/README.txt new file mode 100644 index 00000000..0340f2d6 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/README.txt @@ -0,0 +1,208 @@ +--------------------------------------------------------------------------------- +-- Time pilot by Dar (darfpga@aol.fr) (29/10/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T80/T80se - Version : 0247 +----------------------------- +-- Z80 compatible microprocessor core +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- Features : +-- TV 15KHz mode only (atm) +-- Coctail mode ok +-- Sound ok +-- No external RAM/SDRAM required + +-- Use with MAME roms from timeplt.zip +-- +-- Use make_time_pilot_proms.bat to build vhd file from binaries + +-- Time Pilot Hardware caracteristics : +-- +-- VIDEO : 1xZ80@3MHz CPU accessing its program rom, working ram, +-- sprite data ram, I/O, sound board register and trigger. +-- 24Kx8bits program rom +-- +-- One char tile map 32x28 +-- 8Kx8bits graphics rom 2bits/pixel +-- 4 colors/32sets among 16 colors +-- +-- 24 sprites with priorities and flip H/V +-- 16Kx8bits graphics rom 2bits/pixel +-- 3 colors/64sets among 16 colors (different of char colors). +-- +-- Char/sprites color palette 2x16 colors among 32768 colors +-- 15bits 5red/5green/5blue +-- +-- Working ram : 4Kx8bits +-- Sprites data ram : 256x16bits +-- Sprites line buffer rams : 1 scan line delay flip/flop 2x256x4bits + +-- SOUND : 1xZ80@1.79MHz CPU accessing its program rom, working ram, 2x-AY3-8910 +-- 8Kx8bits program rom +-- +-- 1xAY-3-8910 +-- I/O noise input and command/trigger from video board. +-- 3 sound channels +-- +-- 1xAY-3-8910 +-- 3 sound channels +-- +-- 6 RC filters with 4 states : transparent or cut 600Hz, 700Hz, 3.4KHz +-- +--------------------------------------------------------------------------------- +-- +-- Uses 1 pll for 12MHz and 14MHz generation from 50MHz +-- +-- Board key : +-- 0 : reset game +-- +-- Keyboard players inputs : +-- +-- F3 : Add coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE : Fire +-- RIGHT arrow : rotate right +-- LEFT arrow : rotate left +-- UP arrow : rotate up +-- DOWN arrow : rotate down +-- +-- Other details : see time_pilot.vhd + +--------------------------------------------------------------------------------- +-- Use time_pilot_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- + ++----------------------------------------------------------------------------------+ +; Fitter Summary ; ++------------------------------------+---------------------------------------------+ +; Fitter Status ; Successful - Sun Nov 05 10:17:02 2017 ; +; Quartus Prime Version ; 16.1.0 Build 196 10/24/2016 SJ Lite Edition ; +; Revision Name ; time_pilot_de10_lite ; +; Top-level Entity Name ; time_pilot_de10_lite ; +; Family ; MAX 10 ; +; Device ; 10M50DAF484C6GES ; +; Timing Models ; Preliminary ; +; Total logic elements ; 6,231 / 49,760 ( 13 % ) ; +; Total combinational functions ; 6,005 / 49,760 ( 12 % ) ; +; Dedicated logic registers ; 1,579 / 49,760 ( 3 % ) ; +; Total registers ; 1579 ; +; Total pins ; 105 / 360 ( 29 % ) ; +; Total virtual pins ; 0 ; +; Total memory bits ; 475,648 / 1,677,312 ( 28 % ) ; +; Embedded Multiplier 9-bit elements ; 2 / 288 ( < 1 % ) ; +; Total PLLs ; 1 / 4 ( 25 % ) ; +; UFM blocks ; 0 / 1 ( 0 % ) ; +; ADC blocks ; 0 / 2 ( 0 % ) ; ++------------------------------------+---------------------------------------------+ + +--------------- +VHDL File list +--------------- + +de_10/max10_pll_12M_14M.vhd Pll 12MHz and 14 MHz from 50MHz altera mf + +rtl_dar/time_pilot_de10_lite.vhd Top level for de10_lite board +rtl_dar/time_pilot.vhd Main video board logic +rtl_dar/time_pilot_sound_board.vhd Main sound board logic + +rtl_mikej/YM2149_linmix_sep.vhd Copyright (c) MikeJ - Jan 2005 + +rtl_T80/T80se.vhdT80 Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +rtl_T80/T80_Reg.vhd +rtl_T80/T80_Pack.vhd +rtl_T80/T80_MCode.vhd +rtl_T80/T80_ALU.vhd +rtl_T80/T80.vhd + +rtl_dar/kbd_joystick.vhd Keyboard key to player/coin input +rtl_dar/io_ps2_keyboard.vhd Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +rtl_dar/gen_ram.vhd Generic RAM (Peter Wendrich + DAR Modification) +rtl_dar/decodeur_7_seg.vhd 7 segments display decoder + +rtl_dar/time_pilot_prog.vhd Time pilot video board PROMs +rtl_dar/time_pilot_char_grphx.vhd +rtl_dar/time_pilot_char_color_lut.vhd +rtl_dar/time_pilot_sprite_grphx.vhd +rtl_dar/time_pilot_sprite_color_lut.vhd +rtl_dar/time_pilot_palette_green_red.vhd +rtl_dar/time_pilot_palette_blue_green.vhd + +rtl_dar/time_pilot_sound_prog.vhd Time pilot sound board PROM + +---------------------- +Quartus project files +---------------------- +de10_lite/time_pilot_de10_lite.sdc Timequest constraints file +de10_lite/time_pilot_de10_lite.qsf de10_lite settings (files,pins...) +de10_lite/time_pilot_de10_lite.qpf de10_lite project + +----------------------------- +Required ROMs (Not included) +----------------------------- +You need the following 11 ROMs binary files from timeplt.zip (MAME) + +tm1, tm2,tm3, tm4, tm5, tm6, tm7 +timeplt.b4 +timeplt.b5 +timeplt.e9 +timeplt.e12 + +------ +Tools +------ +You need to build vhdl files from the binary file : + - Unzip the roms file in the tools/time_pilot_unzip directory + - Double click (execute) the script tools/make_time_pilot_proms.bat to get the following files + +time_pilot_prog.vhd : tm1, tm2,tm3 +time_pilot_sprite_grphx.vhd : tm4, tm5 +time_pilot_char_grphx.vhd : tm6 +time_pilot_sound_prog.vhd : tm7 +time_pilot_palette_blue_green.vhd : timeplt.b4 +time_pilot_palette_green_red.vhd : timeplt.b5 +time_pilot_sprite_color_lut.vhd : timeplt.e9 +time_pilot_char_color_lut.vhd : timeplt.e12 + + +*DO NOT REDISTRIBUTE THESE FILES* + +VHDL files are needed to compile and include roms into the project + +The script make_time_pilot_proms.bat uses make_vhdl_prom executables delivered both in linux and windows version. The script itself is delivered only in windows version (.bat) but should be easily ported to linux. + +Source code of make_vhdl_prom.c is also delivered. + +--------------------------------- +Compiling for de10_lite +--------------------------------- +You can build the project with ROM image embeded in the sof file. +*DO NOT REDISTRIBUTE THESE FILES* + +3 steps + + - put the VHDL ROM files (.vhd) into the rtl_dar directory + - build time_pilot_de10_lite + - program time_pilot_de10_lite.sof + +------------------------ +------------------------ +End of file +------------------------ diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/Release/time_pilot_mist.rbf b/Arcade/Konami Classic/Time_Pilot_MiST/Release/time_pilot_mist.rbf new file mode 100644 index 00000000..e61d146f Binary files /dev/null and b/Arcade/Konami Classic/Time_Pilot_MiST/Release/time_pilot_mist.rbf differ diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/clean.bat b/Arcade/Konami Classic/Time_Pilot_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/DebugSystem.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/DebugSystem.vhd new file mode 100644 index 00000000..27f115c9 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/DebugSystem.vhd @@ -0,0 +1,197 @@ +-- Z80, Monitor ROM, 4k RAM and two 16450 UARTs +-- that can be synthesized and used with +-- the NoICE debugger that can be found at +-- http://www.noicedebugger.com/ + +library IEEE; +use IEEE.std_logic_1164.all; + +entity DebugSystem is + port( + Reset_n : in std_logic; + Clk : in std_logic; + NMI_n : in std_logic; + RXD0 : in std_logic; + CTS0 : in std_logic; + DSR0 : in std_logic; + RI0 : in std_logic; + DCD0 : in std_logic; + RXD1 : in std_logic; + CTS1 : in std_logic; + DSR1 : in std_logic; + RI1 : in std_logic; + DCD1 : in std_logic; + TXD0 : out std_logic; + RTS0 : out std_logic; + DTR0 : out std_logic; + TXD1 : out std_logic; + RTS1 : out std_logic; + DTR1 : out std_logic; +As : out std_logic_vector(15 downto 0); +Ds : out std_logic_vector(7 downto 0); +ROM_Ds : out std_logic_vector(7 downto 0) + ); +end DebugSystem; + +architecture struct of DebugSystem is + + signal M1_n : std_logic; + signal MREQ_n : std_logic; + signal IORQ_n : std_logic; + signal RD_n : std_logic; + signal WR_n : std_logic; + signal RFSH_n : std_logic; + signal HALT_n : std_logic; + signal WAIT_n : std_logic; + signal INT_n : std_logic; + signal RESET_s : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal A : std_logic_vector(15 downto 0); + signal D : std_logic_vector(7 downto 0); + signal ROM_D : std_logic_vector(7 downto 0); + signal SRAM_D : std_logic_vector(7 downto 0); + signal UART0_D : std_logic_vector(7 downto 0); + signal UART1_D : std_logic_vector(7 downto 0); + signal CPU_D : std_logic_vector(7 downto 0); + + signal Mirror : std_logic; + + signal IOWR_n : std_logic; + signal RAMCS_n : std_logic; + signal UART0CS_n : std_logic; + signal UART1CS_n : std_logic; + + signal BaudOut0 : std_logic; + signal BaudOut1 : std_logic; + +begin + As <= A; + Ds <= D; + ROM_Ds <= ROM_D; + + Wait_n <= '1'; + BusRq_n <= '1'; + INT_n <= '1'; + + process (Reset_n, Clk) + begin + if Reset_n = '0' then + Reset_s <= '0'; + Mirror <= '0'; + elsif Clk'event and Clk = '1' then + Reset_s <= '1'; + if IORQ_n = '0' and A(7 downto 4) = "1111" then + Mirror <= D(0); + end if; + end if; + end process; + + IOWR_n <= WR_n or IORQ_n; + RAMCS_n <= (not Mirror and not A(15)) or MREQ_n; + UART0CS_n <= '0' when IORQ_n = '0' and A(7 downto 3) = "00000" else '1'; + UART1CS_n <= '0' when IORQ_n = '0' and A(7 downto 3) = "10000" else '1'; + +-- CPU_D <= +-- SRAM_D when RAMCS_n = '0' else +-- UART0_D when UART0CS_n = '0' else +-- UART1_D when UART1CS_n = '0' else +-- ROM_D; + + CPU_D <= + ROM_D; + + u0 : entity work.T80s + generic map(Mode => 0, T2Write => 1, IOWait => 0) +-- generic map(Mode => 1, T2Write => 1, IOWait => 0) + port map( + RESET_n => RESET_s, + CLK_n => Clk, + WAIT_n => WAIT_n, + INT_n => INT_n, + NMI_n => NMI_n, + BUSRQ_n => BUSRQ_n, + M1_n => M1_n, + MREQ_n => MREQ_n, + IORQ_n => IORQ_n, + RD_n => RD_n, + WR_n => WR_n, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + BUSAK_n => BUSAK_n, + A => A, + DI => CPU_D, + DO => D); + + -- u1 : entity work.MonZ80 + -- port map( + -- Clk => Clk, + -- A => A(10 downto 0), + -- D => ROM_D); + + u1 : entity work.bagmanrom + port map( + clock => not Clk, + address => A(14 downto 0), + q => ROM_D); + + u2 : entity work.SSRAM + generic map( + AddrWidth => 12) + port map( + Clk => Clk, + CE_n => RAMCS_n, + WE_n => WR_n, + A => A(11 downto 0), + DIn => D, + DOut => SRAM_D); + + u3 : entity work.T16450 + port map( + MR_n => Reset_s, + XIn => Clk, + RClk => BaudOut0, + CS_n => UART0CS_n, + Rd_n => RD_n, + Wr_n => IOWR_n, + A => A(2 downto 0), + D_In => D, + D_Out => UART0_D, + SIn => RXD0, + CTS_n => CTS0, + DSR_n => DSR0, + RI_n => RI0, + DCD_n => DCD0, + SOut => TXD0, + RTS_n => RTS0, + DTR_n => DTR0, + OUT1_n => open, + OUT2_n => open, + BaudOut => BaudOut0, + Intr => open); + + u4 : entity work.T16450 + port map( + MR_n => Reset_s, + XIn => Clk, + RClk => BaudOut1, + CS_n => UART1CS_n, + Rd_n => RD_n, + Wr_n => IOWR_n, + A => A(2 downto 0), + D_In => D, + D_Out => UART1_D, + SIn => RXD1, + CTS_n => CTS1, + DSR_n => DSR1, + RI_n => RI1, + DCD_n => DCD1, + SOut => TXD1, + RTS_n => RTS1, + DTR_n => DTR1, + OUT1_n => open, + OUT2_n => open, + BaudOut => BaudOut1, + Intr => open); + +end; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/DebugSystemXR.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/DebugSystemXR.vhd new file mode 100644 index 00000000..ca8fa877 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/DebugSystemXR.vhd @@ -0,0 +1,185 @@ +-- Z80, Monitor ROM, external SRAM interface and two 16450 UARTs +-- that can be synthesized and used with +-- the NoICE debugger that can be found at +-- http://www.noicedebugger.com/ + +library IEEE; +use IEEE.std_logic_1164.all; + +entity DebugSystemXR is + port( + Reset_n : in std_logic; + Clk : in std_logic; + NMI_n : in std_logic; + OE_n : out std_logic; + WE_n : out std_logic; + RAMCS_n : out std_logic; + ROMCS_n : out std_logic; + PGM_n : out std_logic; + A : out std_logic_vector(16 downto 0); + D : inout std_logic_vector(7 downto 0); + RXD0 : in std_logic; + CTS0 : in std_logic; + DSR0 : in std_logic; + RI0 : in std_logic; + DCD0 : in std_logic; + RXD1 : in std_logic; + CTS1 : in std_logic; + DSR1 : in std_logic; + RI1 : in std_logic; + DCD1 : in std_logic; + TXD0 : out std_logic; + RTS0 : out std_logic; + DTR0 : out std_logic; + TXD1 : out std_logic; + RTS1 : out std_logic; + DTR1 : out std_logic + ); +end entity DebugSystemXR; + +architecture struct of DebugSystemXR is + + signal M1_n : std_logic; + signal MREQ_n : std_logic; + signal IORQ_n : std_logic; + signal RD_n : std_logic; + signal WR_n : std_logic; + signal RFSH_n : std_logic; + signal HALT_n : std_logic; + signal WAIT_n : std_logic; + signal INT_n : std_logic; + signal RESET_s : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal A_i : std_logic_vector(15 downto 0); + signal D_i : std_logic_vector(7 downto 0); + signal ROM_D : std_logic_vector(7 downto 0); + signal UART0_D : std_logic_vector(7 downto 0); + signal UART1_D : std_logic_vector(7 downto 0); + signal CPU_D : std_logic_vector(7 downto 0); + + signal Mirror : std_logic; + + signal IOWR_n : std_logic; + signal RAMCS_n_i : std_logic; + signal UART0CS_n : std_logic; + signal UART1CS_n : std_logic; + + signal BaudOut0 : std_logic; + signal BaudOut1 : std_logic; + +begin + + Wait_n <= '1'; + BusRq_n <= '1'; + INT_n <= '1'; + + OE_n <= RD_n; + WE_n <= WR_n; + RAMCS_n <= RAMCS_n_i; + ROMCS_n <= '1'; + PGM_n <= '1'; + A(14 downto 0) <= A_i(14 downto 0); + A(16 downto 15) <= "00"; + D <= D_i when WR_n = '0' else "ZZZZZZZZ"; + + process (Reset_n, Clk) + begin + if Reset_n = '0' then + Reset_s <= '0'; + Mirror <= '0'; + elsif Clk'event and Clk = '1' then + Reset_s <= '1'; + if IORQ_n = '0' and A_i(7 downto 4) = "1111" then + Mirror <= D_i(0); + end if; + end if; + end process; + + IOWR_n <= WR_n or IORQ_n; + RAMCS_n_i <= (not Mirror and not A_i(15)) or MREQ_n; + UART0CS_n <= '0' when IORQ_n = '0' and A_i(7 downto 3) = "00000" else '1'; + UART1CS_n <= '0' when IORQ_n = '0' and A_i(7 downto 3) = "10000" else '1'; + + CPU_D <= + D when RAMCS_n_i = '0' else + UART0_D when UART0CS_n = '0' else + UART1_D when UART1CS_n = '0' else + ROM_D; + + u0 : entity work.T80s + generic map(Mode => 1, T2Write => 1, IOWait => 0) + port map( + RESET_n => RESET_s, + CLK_n => Clk, + WAIT_n => WAIT_n, + INT_n => INT_n, + NMI_n => NMI_n, + BUSRQ_n => BUSRQ_n, + M1_n => M1_n, + MREQ_n => MREQ_n, + IORQ_n => IORQ_n, + RD_n => RD_n, + WR_n => WR_n, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + BUSAK_n => BUSAK_n, + A => A_i, + DI => CPU_D, + DO => D_i); + + u1 : entity work.MonZ80 + port map( + Clk => Clk, + A => A_i(10 downto 0), + D => ROM_D); + + u3 : entity work.T16450 + port map( + MR_n => Reset_s, + XIn => Clk, + RClk => BaudOut0, + CS_n => UART0CS_n, + Rd_n => RD_n, + Wr_n => IOWR_n, + A => A_i(2 downto 0), + D_In => D_i, + D_Out => UART0_D, + SIn => RXD0, + CTS_n => CTS0, + DSR_n => DSR0, + RI_n => RI0, + DCD_n => DCD0, + SOut => TXD0, + RTS_n => RTS0, + DTR_n => DTR0, + OUT1_n => open, + OUT2_n => open, + BaudOut => BaudOut0, + Intr => open); + + u4 : entity work.T16450 + port map( + MR_n => Reset_s, + XIn => Clk, + RClk => BaudOut1, + CS_n => UART1CS_n, + Rd_n => RD_n, + Wr_n => IOWR_n, + A => A_i(2 downto 0), + D_In => D_i, + D_Out => UART1_D, + SIn => RXD1, + CTS_n => CTS1, + DSR_n => DSR1, + RI_n => RI1, + DCD_n => DCD1, + SOut => TXD1, + RTS_n => RTS1, + DTR_n => DTR1, + OUT1_n => open, + OUT2_n => open, + BaudOut => BaudOut1, + Intr => open); + +end; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80.vhd new file mode 100644 index 00000000..398fa0df --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80.vhd @@ -0,0 +1,1073 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 and Auto_Wait_t1 = '0' then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if T_Res = '1' then + Auto_Wait_t1 <= '0'; + else + Auto_Wait_t1 <= Auto_Wait or IORQ_i; + end if; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if (Auto_Wait = '1' and Auto_Wait_t2 = '0') nor + (IOWait = 1 and IORQ_i = '1' and Auto_Wait_t1 = '0') then + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T8080se.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T8080se.vhd new file mode 100644 index 00000000..2b6d28f8 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T8080se.vhd @@ -0,0 +1,185 @@ +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- 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/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80_ALU.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80_ALU.vhd new file mode 100644 index 00000000..86fddce7 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80_ALU.vhd @@ -0,0 +1,351 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; + +end; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80_MCode.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80_MCode.vhd new file mode 100644 index 00000000..4cc30f35 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80_MCode.vhd @@ -0,0 +1,1934 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; +-- constant aNone : std_logic_vector(2 downto 0) := "000"; +-- constant aXY : std_logic_vector(2 downto 0) := "001"; +-- constant aIOA : std_logic_vector(2 downto 0) := "010"; +-- constant aSP : std_logic_vector(2 downto 0) := "011"; +-- constant aBC : std_logic_vector(2 downto 0) := "100"; +-- constant aDE : std_logic_vector(2 downto 0) := "101"; +-- constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0010"; + else + IncDec_16 <= "1010"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0010"; + else + IncDec_16 <= "1010"; + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80_Pack.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80_Pack.vhd new file mode 100644 index 00000000..ac7d34da --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80_Pack.vhd @@ -0,0 +1,208 @@ +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80_Reg.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80se.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80se.vhd new file mode 100644 index 00000000..ac8886a8 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/T80se.vhd @@ -0,0 +1,184 @@ +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80se is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0; -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + IOWait : integer := 1 -- 0 => Single cycle I/O, 1 => Std I/O cycle + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80se; + +architecture rtl of T80se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => Mode, + IOWait => IOWait) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/YM2149_linmix_sep.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/YM2149_linmix_sep.vhd new file mode 100644 index 00000000..27f26749 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/YM2149_linmix_sep.vhd @@ -0,0 +1,553 @@ +-- changes for seperate audio outputs and enable now enables cpu access as well +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + O_CHAN : out std_logic_vector(1 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal cnt_div_t1 : std_logic_vector(3 downto 0); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8; + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process(RESET_L, CLK) + begin + -- looks like registers are latches in real chip, but the address is caught at the end of the address state. + if (RESET_L = '0') then + addr <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA = '1') then + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end if; + end process; + + p_wdata : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + elsif rising_edge(CLK) then + if (ENA = '1') then + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, reg, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + cnt_div_t1 <= cnt_div; + end if; + end process; + + p_audio_output : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_AUDIO <= (others => '0'); + O_CHAN <= (others => '0'); + elsif rising_edge(CLK) then + + if (ENA = '1') then + O_AUDIO <= dac_amp(7 downto 0); + O_CHAN <= cnt_div_t1(1 downto 0); + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then -- resync + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end if; + end process; +end architecture RTL; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/build_id.tcl b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..5c0eba0c --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_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 "build_id.vhd" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "constant BUILD_DATE : String(1 to 6) := \"$buildDate\"" + puts $outputFile "constant BUILD_TIME : String(1 to 6) := \"$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/Arcade/Konami Classic/Time_Pilot_MiST/rtl/dac.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/dac.vhd new file mode 100644 index 00000000..9f696b0b --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 11 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/gen_ram.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/gen_ram.vhd new file mode 100644 index 00000000..f1a95608 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/gen_ram.vhd @@ -0,0 +1,84 @@ +-- ----------------------------------------------------------------------- +-- +-- Syntiac's generic VHDL support files. +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- +-- Modified April 2016 by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +-- Remove address register when writing +-- +-- ----------------------------------------------------------------------- +-- +-- gen_rwram.vhd +-- +-- ----------------------------------------------------------------------- +-- +-- generic ram. +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity gen_ram is + generic ( + dWidth : integer := 8; + aWidth : integer := 10 + ); + port ( + clk : in std_logic; + we : in std_logic; + addr : in std_logic_vector((aWidth-1) downto 0); + d : in std_logic_vector((dWidth-1) downto 0); + q : out std_logic_vector((dWidth-1) downto 0) + ); +end entity; + +-- ----------------------------------------------------------------------- + +architecture rtl of gen_ram is + subtype addressRange is integer range 0 to ((2**aWidth)-1); + type ramDef is array(addressRange) of std_logic_vector((dWidth-1) downto 0); + signal ram: ramDef; + + signal rAddrReg : std_logic_vector((aWidth-1) downto 0); + signal qReg : std_logic_vector((dWidth-1) downto 0); +begin +-- ----------------------------------------------------------------------- +-- Signals to entity interface +-- ----------------------------------------------------------------------- +-- q <= qReg; + +-- ----------------------------------------------------------------------- +-- Memory write +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if we = '1' then + ram(to_integer(unsigned(addr))) <= d; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Memory read +-- ----------------------------------------------------------------------- +process(clk) + begin + if rising_edge(clk) then +-- qReg <= ram(to_integer(unsigned(rAddrReg))); +-- rAddrReg <= addr; +---- qReg <= ram(to_integer(unsigned(addr))); + q <= ram(to_integer(unsigned(addr))); + end if; + end process; +--q <= ram(to_integer(unsigned(addr))); +end architecture; + diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/gen_video.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/gen_video.vhd new file mode 100644 index 00000000..da8d77d4 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/gen_video.vhd @@ -0,0 +1,70 @@ +--------------------------------------------------------------------------------- +-- Galaga video horizontal/vertical and sync generator by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.ALL; + +entity gen_video is +port( + clk : in std_logic; + enable : in std_logic; + hcnt : out std_logic_vector(5 downto 0); + vcnt : out std_logic_vector(5 downto 0); + hsync : out std_logic; + vsync : out std_logic; + blankn : out std_logic +); +end gen_video; + +architecture struct of gen_video is + signal hblank : std_logic; + signal vblank : std_logic; + signal hcntReg : unsigned (5 DOWNTO 0) := to_unsigned(000,9); + signal vcntReg : unsigned (5 DOWNTO 0) := to_unsigned(015,9); +begin + +hcnt <= std_logic_vector(hcntReg); +vcnt <= std_logic_vector(vcntReg); + + +process(clk) begin + + if enable = '1' then + + if hcntReg = 511 then + hcntReg <= to_unsigned (128,9); + else + hcntReg <= hcntReg + 1; + end if; + + if hcntReg = 191 then + if vcntReg = 261 then + vcntReg <= to_unsigned(0,9); + else + vcntReg <= vcntReg + 1; + end if; + end if; + + if hcntReg = (175+ 0-8+8) then hsync <= '1'; -- 1 + elsif hcntReg = (175+29-8+8) then hsync <= '0'; + end if; + + if vcntReg = 252 then vsync <= '1'; + elsif vcntReg = 260 then vsync <= '0'; + end if; + + if hcntReg = (127+16+8) then hblank <= '1'; + elsif hcntReg = (255-17+8+1) then hblank <= '0'; + end if; + + if vcntReg = (240+1-1) then vblank <= '1'; + elsif vcntReg = (015+1) then vblank <= '0'; + end if; + + blankn <= not (hblank or vblank); + end if; + +end process; + +end architecture; \ No newline at end of file diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/hq2x.sv b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..3e406318 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_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'bxx; + 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/Arcade/Konami Classic/Time_Pilot_MiST/rtl/keyboard.v b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Konami Classic/Time_Pilot_MiST/rtl/mist_io.v b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_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/Arcade/Konami Classic/Time_Pilot_MiST/rtl/mist_pll_12M_14M.qip b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/mist_pll_12M_14M.qip new file mode 100644 index 00000000..02816126 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/mist_pll_12M_14M.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 VHDL_FILE [file join $::quartus(qip_path) "mist_pll_12M_14M.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "mist_pll_12M_14M.ppf"] diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/mist_pll_12M_14M.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/mist_pll_12M_14M.vhd new file mode 100644 index 00000000..4865e696 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/mist_pll_12M_14M.vhd @@ -0,0 +1,424 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: mist_pll_12M_14M.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY mist_pll_12M_14M IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END mist_pll_12M_14M; + + +ARCHITECTURE SYN OF mist_pll_12m_14m IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + locked <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 420, + clk0_duty_cycle => 50, + clk0_multiply_by => 191, + clk0_phase_shift => "0", + clk1_divide_by => 360, + clk1_duty_cycle => 50, + clk1_multiply_by => 191, + clk1_phase_shift => "0", + clk2_divide_by => 105, + clk2_duty_cycle => 50, + clk2_multiply_by => 191, + clk2_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=mist_pll_12M_14M", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire6, + clk => sub_wire0, + locked => sub_wire2 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "420" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "360" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "105" +-- 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 "12.278571" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "14.325000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "49.114285" +-- 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 "1" +-- 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 "191" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "191" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "191" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "12.28800000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "14.31800000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "49.15200000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- 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 "ps" +-- 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 "mist_pll_12M_14M.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 "420" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "191" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "360" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "191" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "105" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "191" +-- 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_USED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..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: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- 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: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL mist_pll_12M_14M_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/osd.v b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_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/Arcade/Konami Classic/Time_Pilot_MiST/rtl/scandoubler.v b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..eba1d598 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_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/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot.vhd new file mode 100644 index 00000000..7ec1d6d4 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot.vhd @@ -0,0 +1,792 @@ +--------------------------------------------------------------------------------- +-- Time pilot by Dar (darfpga@aol.fr) (29/10/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T80/T80se - Version : 0247 +----------------------------- +-- Z80 compatible microprocessor core +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- + +-- Features : +-- TV 15KHz mode only (atm) +-- Coctail mode ok +-- Sound ok + +-- Use with MAME roms from timeplt.zip +-- +-- Use make_time_pilot_proms.bat to build vhd file from binaries + +-- time_pilot_prog.vhd : tm1, tm2,tm3 +-- time_pilot_sprite_grphx.vhd : tm4, tm5 +-- time_pilot_char_grphx.vhd : tm6 +-- time_pilot_sound_prog.vhd : tm7 +-- time_pilot_palette_blue_green.vhd : timeplt.b4 +-- time_pilot_palette_green_red.vhd : timeplt.b5 +-- time_pilot_sprite_color_lut.vhd : timeplt.e9 +-- time_pilot_char_color_lut.vhd : timeplt.e12 + +-- Time Pilot Hardware caracteristics : +-- +-- VIDEO : 1xZ80@3MHz CPU accessing its program rom, working ram, +-- sprite data ram, I/O, sound board register and trigger. +-- 24Kx8bits program rom +-- +-- One char tile map 32x28 +-- 8Kx8bits graphics rom 2bits/pixel +-- 4 colors/32sets among 16 colors +-- +-- 24 sprites with priorities and flip H/V +-- 16Kx8bits graphics rom 2bits/pixel +-- 3 colors/64sets among 16 colors (different of char colors). +-- +-- Char/sprites color palette 2x16 colors among 32768 colors +-- 15bits 5red/5green/5blue +-- +-- Working ram : 4Kx8bits +-- Sprites data ram : 256x16bits +-- Sprites line buffer rams : 1 scan line delay flip/flop 2x256x4bits + +-- SOUND : 1xZ80@1.79MHz CPU accessing its program rom, working ram, 2x-AY3-8910 +-- 8Kx8bits program rom +-- +-- 1xAY-3-8910 +-- I/O noise input and command/trigger from video board. +-- 3 sound channels +-- +-- 1xAY-3-8910 +-- 3 sound channels +-- +-- 6 RC filters with 4 states : transparent or cut 600Hz, 700Hz, 3.4KHz +-- +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity time_pilot is +port( + clock_12 : in std_logic; + clock_14 : in std_logic; + reset : in std_logic; + + -- tv15Khz_mode : in std_logic; + video_r : out std_logic_vector(4 downto 0); + video_g : out std_logic_vector(4 downto 0); + video_b : out std_logic_vector(4 downto 0); + video_clk : out std_logic; + video_hblank : out std_logic; + video_vblank : out std_logic; + video_hs : out std_logic; + video_vs : out std_logic; + audio_out : out std_logic_vector(10 downto 0); + + dip_switch_1 : in std_logic_vector(7 downto 0); -- Coinage_B / Coinage_A + dip_switch_2 : in std_logic_vector(7 downto 0); -- Sound(8)/Difficulty(7-5)/Bonus(4)/Cocktail(3)/lives(2-1) + + start2 : in std_logic; + start1 : in std_logic; + coin1 : in std_logic; + + fire1 : in std_logic; + right1 : in std_logic; + left1 : in std_logic; + down1 : in std_logic; + up1 : in std_logic; + + fire2 : in std_logic; + right2 : in std_logic; + left2 : in std_logic; + down2 : in std_logic; + up2 : in std_logic; + + dbg_cpu_addr : out std_logic_vector(15 downto 0) +); +end time_pilot; + +architecture struct of time_pilot is + + signal reset_n: std_logic; + signal clock_12n : std_logic; + signal clock_6 : std_logic := '0'; + signal clock_6n : std_logic; + signal clock_div : std_logic_vector(1 downto 0) := "00"; + + signal hcnt : std_logic_vector(5 downto 0); -- horizontal counter + signal vcnt : std_logic_vector(8 downto 0); -- vertical counter + signal pxcnt : std_logic_vector(2 downto 0); -- pixel counter + signal spcnt : std_logic_vector(4 downto 0); -- sprite counter + + signal hsync0 : std_logic; + + signal hblank : std_logic; + signal vblank : std_logic; + + signal cpu_ena : std_logic; + + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_wr_n : std_logic; + signal cpu_mreq_n : std_logic; + signal cpu_nmi_n : std_logic; + + signal cpu_rom_do : std_logic_vector( 7 downto 0); + + signal wram_addr : std_logic_vector(11 downto 0); + signal wram_we : std_logic; + signal wram_do : std_logic_vector( 7 downto 0); + + signal ch_graphx_addr_f: std_logic_vector(12 downto 0); + signal ch_graphx_addr : std_logic_vector(12 downto 0); + signal ch_graphx_do : std_logic_vector( 7 downto 0); + signal ch_pixels : std_logic_vector( 7 downto 0); + signal ch_data1 : std_logic_vector( 7 downto 0); + signal ch_pixel_bit1 : std_logic; + signal ch_pixel_bit2 : std_logic; + signal ch_color_set : std_logic_vector(4 downto 0); + signal ch_palette_addr : std_logic_vector(7 downto 0); + signal ch_palette_do : std_logic_vector(7 downto 0); + + signal spram_addr : std_logic_vector(7 downto 0); + signal spram1_we : std_logic; + signal spram1_do : std_logic_vector(7 downto 0); + signal spram2_we : std_logic; + signal spram2_do : std_logic_vector(7 downto 0); + + signal sp_graphx_addr : std_logic_vector(13 downto 0); + signal sp_graphx_do : std_logic_vector(7 downto 0); + signal vcnt_r : std_logic_vector(8 downto 0); + signal sp_line : std_logic_vector(7 downto 0); + signal sp_on_line : std_logic; + signal sp_attr : std_logic_vector(7 downto 0); + signal sp_posh : std_logic_vector(7 downto 0); + signal sp_pixels : std_logic_vector(7 downto 0); + signal sp_color_set : std_logic_vector(5 downto 0); + signal sp_palette_addr : std_logic_vector(7 downto 0); + signal sp_palette_do : std_logic_vector(7 downto 0); + signal sp_read_out : std_logic_vector(3 downto 0); + signal sp_blank : std_logic; + + signal rgb_palette_addr : std_logic_vector(4 downto 0); + signal rgb_palette_bg_do : std_logic_vector(7 downto 0); + signal rgb_palette_gr_do : std_logic_vector(7 downto 0); + + signal sp_buffer_write_addr : std_logic_vector(7 downto 0); + signal sp_buffer_write_we : std_logic; + signal sp_buffer_read_addr : std_logic_vector(7 downto 0); + + signal sp_buffer_ram1_addr : std_logic_vector(7 downto 0); + signal sp_buffer_ram1_we : std_logic; + signal sp_buffer_ram1_di : std_logic_vector(3 downto 0); + signal sp_buffer_ram1_do : std_logic_vector(3 downto 0); + + signal sp_buffer_ram2_addr : std_logic_vector(7 downto 0); + signal sp_buffer_ram2_we : std_logic; + signal sp_buffer_ram2_di : std_logic_vector(3 downto 0); + signal sp_buffer_ram2_do : std_logic_vector(3 downto 0); + + signal sp_buffer_sel : std_logic; + + signal itt_n : std_logic; + signal flip : std_logic; + signal C0xx_we : std_logic; + signal C3xx_we : std_logic; + signal sound_cmd : std_logic_vector(7 downto 0); + signal sound_trig : std_logic; + + signal input_0 : std_logic_vector(7 downto 0); + signal input_1 : std_logic_vector(7 downto 0); + signal input_2 : std_logic_vector(7 downto 0); + +begin + +video_clk <= clock_6n; +clock_12n <= not clock_12; +clock_6n <= not clock_6; +reset_n <= not reset; + +-- debug +process (reset, clock_12) +begin + if rising_edge(clock_12) and cpu_ena ='1' and cpu_mreq_n ='0' then + dbg_cpu_addr <= cpu_addr; + end if; +end process; + +-- make 6MHz clock from 12MHz +process (clock_12) +begin + if reset='1' then + clock_6 <= '0'; + else + if rising_edge(clock_12) then + clock_6 <= not clock_6; + end if; + end if; +end process; + + +-------------------------- +-- Video/sprite scanner -- +-------------------------- + +-- make hcnt and vcnt video scanner from pixel clocks and counts +-- +-- pxcnt |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7| +-- hcnt | N | N+1 | +-- cpu_adr/do | | + +-- +-- hcnt [0..47] => 48 x 8 = 384 pixels, 384/6.144Mhz => 1 line is 62.5us (16.000KHz) +-- vcnt [252..255,256..511] => 260 lines, 1 frame is 260 x 62.5us = 16.250ms (61.54Hz) + +process (reset, clock_6) +begin + if reset='1' then + pxcnt <= "000"; + hcnt <= "000000"; + vcnt <= '0'&X"FC"; + spcnt <= "00000"; + else + if rising_edge(clock_6) then + pxcnt <= pxcnt + '1'; + if pxcnt = "111" then + hcnt <= hcnt + '1'; + + if hcnt = "101111" then -- char from #0 to #47 (one line) + hcnt <= "000000"; + if vcnt = '1'&X"FF" then + vcnt <= '0'&X"FC"; + else + vcnt <= vcnt + '1'; + end if; + end if; + + -- sprite down counter + if hcnt(0) = '1' then -- every is 16 bits (2 char) + if hcnt = "101111" then + spcnt <= "11111"; -- start with sprite #31 + else + spcnt <= spcnt - '1'; -- downto sprite #8 + end if; + end if; + + end if; + end if; + end if; +end process; + +cpu_ena <= not pxcnt(0); + +-- inputs +input_0 <= "111" & not start2 & not start1 & '1' & '1' & not coin1; -- ?/ ?/ ?/ 2S/ 1S/SVC/ C2/ C1 +input_1 <= "111" & not fire1 & not down1 & not up1 & not right1 & not left1; -- ?/1FL/1SR/1SL/1DW/1UP/1RI/1LE +input_2 <= "111" & not fire2 & not down2 & not up2 & not right2 & not left2; -- ?/2FL/2SR/2SL/2DW/2UP/2RI/2LE + +-- cpu input address decoding (mirror mostly from Mame) +cpu_di <= cpu_rom_do when cpu_addr(15 downto 12) < X"6" else -- 0000-5FFF + X"FF" when cpu_addr(15 downto 12) < X"A" else -- 6000-9FFF + wram_do when cpu_addr(15 downto 12) = X"A" else -- A000-AFFF + + spram1_do when cpu_addr(15 downto 12) = X"B" and + cpu_addr(10) = '0' else -- B000-B3FF + + spram2_do when cpu_addr(15 downto 12) = X"B" and + cpu_addr(10) = '1' else -- B400-B7FF + + vcnt(7 downto 0) when cpu_addr(15 downto 12) = X"C" and + cpu_addr( 9 downto 8) = "00" else -- C000-C0FF + + X"FF" when cpu_addr(15 downto 12) = X"C" and + cpu_addr( 9 downto 8) = "01" else -- C100-C1FF + + dip_switch_2 when cpu_addr(15 downto 12) = X"C" and + cpu_addr( 9 downto 8) = "10" else -- C200-C2FF + + input_0 when cpu_addr(15 downto 12) = X"C" and + cpu_addr( 9 downto 8) = "11" and + cpu_addr( 6 downto 5) = "00" else -- C300-C31F + + input_1 when cpu_addr(15 downto 12) = X"C" and + cpu_addr( 9 downto 8) = "11" and + cpu_addr( 6 downto 5) = "01" else -- C320-C32F + + input_2 when cpu_addr(15 downto 12) = X"C" and + cpu_addr( 9 downto 8) = "11" and + cpu_addr( 6 downto 5) = "10" else -- C340-C34F + + dip_switch_1 when cpu_addr(15 downto 12) = X"C" and + cpu_addr( 9 downto 8) = "11" and + cpu_addr( 6 downto 5) = "11" else -- C360-C36F + + X"FF"; + +-- working ram address multiplexer cpu/video scanner +wram_addr <= cpu_addr(11 downto 0) when cpu_ena = '1' else + '0' & pxcnt(1) & vcnt(7 downto 3) & hcnt(4 downto 0) when flip = '0' else + '0' & pxcnt(1) & not vcnt(7 downto 3) & not hcnt(4 downto 0); + +-- sprite data ram address multiplexer cpu/sprite scanner +spram_addr <= cpu_addr(7 downto 0) when cpu_ena = '1' else "00" & spcnt & pxcnt(1); + +-- write enable to working ram, sprite data ram and misc registers +wram_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"A" else '0'; +spram1_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"B" and cpu_addr(10) = '0' else '0'; +spram2_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"B" and cpu_addr(10) = '1' else '0'; +C0xx_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"C" and cpu_addr(9 downto 8) = "00" else '0'; +C3xx_we <= '1' when cpu_wr_n = '0' and cpu_ena = '1' and cpu_addr(15 downto 12) = X"C" and cpu_addr(9 downto 8) = "11" else '0'; + +-- Misc registers : interrupt enable/clear, cocktail flip, sound trigger +process (clock_6) +begin + if rising_edge(clock_6) then + if C0xx_we = '1' then + sound_cmd <= cpu_do; + end if; + + if C3xx_we = '1' then + if cpu_addr(3 downto 1) = "000" then itt_n <= cpu_do(0); end if; + if cpu_addr(3 downto 1) = "001" then flip <= not cpu_do(0); end if; + if cpu_addr(3 downto 1) = "010" then sound_trig <= cpu_do(0); end if; + end if; + + if itt_n = '0' then + cpu_nmi_n <= '1'; + else -- lauch nmi and end of frame + if (vcnt = 493) and (hcnt = "000000") and (pxcnt = "000") then + cpu_nmi_n <= '0'; + end if; + end if; + end if; +end process; + + +---------------------- +--- sprite machine --- +---------------------- +-- sprite data rams are scanned from sprites addresse 31 to 8 at each line + +-- latch current sprite data with respect to pixel and hcnt in relation +-- with sprite data ram addressing +process (clock_6) +begin + if rising_edge(clock_6) then + + if (hcnt(0) = '0') and (pxcnt = "001") then + sp_posh <= spram1_do ; -- a.k.a. X + sp_attr <= spram2_do ; -- color and flip x/y + vcnt_r <= vcnt; + end if; + + -- sprite is on current line if sp_line is below 16 + -- and if sprite vertical position (a.k.a. Y) is below xF0 + if (hcnt(0) = '0') and (pxcnt = "011") then + if sp_line(7 downto 4) = "0000" and spram2_do < X"F0" then + sp_on_line <= '1'; + else + sp_on_line <= '0'; + end if; + end if; + + -- delay sp_color_set + if (hcnt(0) = '0') and (pxcnt = "100") then + sp_color_set <= sp_attr(5 downto 0); + end if; + + end if; +end process; + +-- sp_line (valid only when pxcnt = "011") +sp_line <= not(vcnt_r(7 downto 0)) - spram2_do; + +-- address sprite graphics rom with sprite code and tile number and sprite line counter +-- with respect to sprite flip x/y controls +with sp_attr(7 downto 6) select + sp_graphx_addr <= spram1_do & sp_line(3) & hcnt(0) & pxcnt(2) & sp_line(2 downto 0) when "11", + spram1_do & sp_line(3) & not hcnt(0) & not pxcnt(2) & sp_line(2 downto 0) when "10", + spram1_do & not sp_line(3) & hcnt(0) & pxcnt(2) & not sp_line(2 downto 0) when "01", + spram1_do & not sp_line(3) & not hcnt(0) & not pxcnt(2) & not sp_line(2 downto 0) when others; + +-- latch and shift sprite graphics data with respect to flipx control +-- 8bits => 4x2bits = 4pixels / 4colors (3colors + transparent) +process (clock_6) +begin + if rising_edge(clock_6) then + + if pxcnt(1 downto 0) = "00" then + if sp_on_line = '1' then + if sp_attr(6) = '1' then + sp_pixels <= sp_graphx_do; + else + sp_pixels(3 downto 0) <= sp_graphx_do(0) & sp_graphx_do(1) & sp_graphx_do(2) & sp_graphx_do(3); + sp_pixels(7 downto 4) <= sp_graphx_do(4) & sp_graphx_do(5) & sp_graphx_do(6) & sp_graphx_do(7); + end if; + else + sp_pixels <= (others => '0'); + end if; + else + sp_pixels(3 downto 0) <= sp_pixels(2 downto 0) & '0'; + sp_pixels(7 downto 4) <= sp_pixels(6 downto 4) & '0'; + end if; + + end if; + +end process; + +-- address sprite color palette 4 colors, 64 sets => 16 colors +sp_palette_addr <= sp_color_set & sp_pixels(3) & sp_pixels(7); + +-- write sprite to line buffer at posh position +process (clock_6) +begin + if rising_edge(clock_6) then + if hcnt(0) = '0' and pxcnt = "101" then + sp_buffer_write_addr <= sp_posh; + else + sp_buffer_write_addr <= sp_buffer_write_addr + '1'; + end if; + end if; +end process; + +-- write colors to buffer when not transparent +sp_buffer_write_we <= '0' when sp_palette_do = "0000" else '1'; + +-- read sprite line buffer and erase after read +process (clock_12) +begin + if rising_edge(clock_12) then + if hcnt = "101111" and pxcnt = "111" then + sp_buffer_read_addr <= "11111010"; -- tune horizontal position of sprites + else + if clock_6 = '0' then + sp_buffer_read_addr <= sp_buffer_read_addr + '1'; + else + if vcnt(0) = '0' then + sp_read_out <= sp_buffer_ram1_do; + else + sp_read_out <= sp_buffer_ram2_do; + end if; + end if; + end if; + end if; +end process; + +-- toggle read/write sprite line buffer every other line + +-- wait pxcnt = "101" to allow last sprite (#8) to be written to line buffer +process (clock_6) +begin + if rising_edge(clock_6) then + if pxcnt = "101" then sp_buffer_sel <= vcnt(0); end if; + end if; +end process; + +sp_buffer_ram1_addr <= sp_buffer_read_addr when sp_buffer_sel = '0' else sp_buffer_write_addr; +sp_buffer_ram2_addr <= sp_buffer_read_addr when sp_buffer_sel = '1' else sp_buffer_write_addr; + +sp_buffer_ram1_di <= "0000" when sp_buffer_sel = '0' else sp_palette_do(3 downto 0); +sp_buffer_ram2_di <= "0000" when sp_buffer_sel = '1' else sp_palette_do(3 downto 0); + +sp_buffer_ram1_we <= not clock_6 when sp_buffer_sel = '0' else sp_buffer_write_we; +sp_buffer_ram2_we <= not clock_6 when sp_buffer_sel = '1' else sp_buffer_write_we; + +-------------------- +--- char machine --- +-------------------- + +-- latch current char data with respect to vcnt and hcnt in relation +-- with wram ram addressing +process (clock_6) +begin + if rising_edge(clock_6) and pxcnt = "001" then + ch_data1 <= wram_do ; + end if; + + if rising_edge(clock_6) and pxcnt = "100" then + ch_color_set <= ch_data1(4 downto 0) ; + end if; + +end process; + +-- address char graphics rom with char code, pixel count and vertical line counter +-- with respect to char flip x/y controls +with ch_data1(7 downto 6) select + ch_graphx_addr_f <= ch_data1(5) & wram_do & pxcnt(2) & vcnt(2 downto 0) when "00", + ch_data1(5) & wram_do & not pxcnt(2) & vcnt(2 downto 0) when "01", + ch_data1(5) & wram_do & pxcnt(2) & not(vcnt(2 downto 0)) when "10", + ch_data1(5) & wram_do & not pxcnt(2) & not(vcnt(2 downto 0)) when others; + +-- in cocktail flip mode negate h/v counters +ch_graphx_addr <= ch_graphx_addr_f when flip ='0' else ch_graphx_addr_f xor "0000000001111"; + +-- latch and shift char graphics data with respect to flipx control and cocktail flip control +-- 8bits => 4x2bits = 4pixels / 4colors +process (clock_6) +begin + if rising_edge(clock_6) then + if pxcnt(1 downto 0) = "00" then + if (ch_data1(6) xor flip) = '0' then + ch_pixels <= ch_graphx_do; + else + ch_pixels(3 downto 0) <= ch_graphx_do(0) & ch_graphx_do(1) &ch_graphx_do(2) &ch_graphx_do(3); + ch_pixels(7 downto 4) <= ch_graphx_do(4) & ch_graphx_do(5) &ch_graphx_do(6) &ch_graphx_do(7); + end if; + else + ch_pixels(3 downto 0) <= ch_pixels(2 downto 0) & '0'; + ch_pixels(7 downto 4) <= ch_pixels(6 downto 4) & '0'; + end if; + end if; + +end process; + +-- address char color palette 4 colors, 64 sets => 16 colors +ch_palette_addr <= '0' & ch_color_set & ch_pixels(3) & ch_pixels(7); + +--------------------- +-- mux char/sprite -- +--------------------- + +-- char data controls sprite display/hide +process (clock_6) +begin + if rising_edge(clock_6) then + sp_blank <= ch_color_set(4); + end if; +end process; + +-- select rbg color and bank with respect to char/sprite selection +rgb_palette_addr <= + '1' & ch_palette_do(3 downto 0) when (sp_read_out = "0000" or sp_blank = '1') else + '0' & sp_read_out; + +-- register and assign rbg palette output +process (clock_6) +begin + if rising_edge(clock_6) then + if hblank = '1' or vblank = '1' then + video_r <= "00000"; + video_g <= "00000"; + video_b <= "00000"; + else + video_r <= rgb_palette_gr_do(5 downto 1); + video_g <= rgb_palette_bg_do(2 downto 0) & rgb_palette_gr_do(7 downto 6); + video_b <= rgb_palette_bg_do(7 downto 3); + end if; + end if; +end process; + +video_hblank <= hblank; +video_vblank <= vblank; + +---------------------------- +-- video syncs and blanks -- +---------------------------- + +process(clock_6) + constant hcnt_base : integer := 36; + variable vsync_cnt : std_logic_vector(3 downto 0); +begin + if rising_edge(clock_6) and pxcnt = "110" then + + if hcnt = hcnt_base+0 then hsync0 <= '0'; + elsif hcnt = hcnt_base+3 then hsync0 <= '1'; + end if; + + if hcnt = hcnt_base then + if vcnt = 500 then + vsync_cnt := X"0"; + else + if vsync_cnt < X"F" then vsync_cnt := vsync_cnt + '1'; end if; + end if; + end if; + + if hcnt = hcnt_base-4 then + hblank <= '1'; + if vcnt = 496 then + vblank <= '1'; -- 492 ok + elsif vcnt = 262 then + vblank <= '0'; -- 262 ok + end if; + elsif hcnt = 0 then + hblank <= '0'; + end if; + + video_hs <= hsync0; + + if vsync_cnt = 0 then video_vs <= '0'; + elsif vsync_cnt = 8 then video_vs <= '1'; + end if; + + end if; +end process; + +------------------------------ +-- components & sound board -- +------------------------------ + +-- microprocessor Z80 +cpu : entity work.T80se +generic map(Mode => 0, T2Write => 1, IOWait => 1) +port map( + RESET_n => reset_n, + CLK_n => clock_6, + CLKEN => cpu_ena, + WAIT_n => '1', + INT_n => '1', --cpu_irq_n, + NMI_n => cpu_nmi_n, + BUSRQ_n => '1', + M1_n => open, + MREQ_n => cpu_mreq_n, + IORQ_n => open, + RD_n => open, + WR_n => cpu_wr_n, + RFSH_n => open, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_di, + DO => cpu_do +); + +-- cpu1 program ROM +rom_cpu1 : entity work.time_pilot_prog +port map( + clk => clock_6n, + addr => cpu_addr(14 downto 0), + data => cpu_rom_do +); + +-- working/char RAM 0xA000-0xAFFF +wram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 12) +port map( + clk => clock_6n, + we => wram_we, + addr => wram_addr, + d => cpu_do, + q => wram_do +); + +-- sprite RAM1 0xB000-0xB0FF +spram1 : entity work.gen_ram +generic map( dWidth => 8, aWidth => 8) +port map( + clk => clock_6n, + we => spram1_we, + addr => spram_addr, + d => cpu_do, + q => spram1_do +); + +-- sprite RAM2 0xB400-0xB4FF +spram2 : entity work.gen_ram +generic map( dWidth => 8, aWidth => 8) +port map( + clk => clock_6n, + we => spram2_we, + addr => spram_addr, + d => cpu_do, + q => spram2_do +); + +-- sprite line buffer 1 +splinebuf1 : entity work.gen_ram +generic map( dWidth => 4, aWidth => 8) +port map( + clk => clock_12n, + we => sp_buffer_ram1_we, + addr => sp_buffer_ram1_addr, + d => sp_buffer_ram1_di, + q => sp_buffer_ram1_do +); + +-- sprite line buffer 2 +splinebuf2 : entity work.gen_ram +generic map( dWidth => 4, aWidth => 8) +port map( + clk => clock_12n, + we => sp_buffer_ram2_we, + addr => sp_buffer_ram2_addr, + d => sp_buffer_ram2_di, + q => sp_buffer_ram2_do +); + +-- char graphics ROM +char_graphics : entity work.time_pilot_char_grphx +port map( + clk => clock_6, + addr => ch_graphx_addr, + data => ch_graphx_do +); + +-- char palette ROM +ch_palette : entity work.time_pilot_char_color_lut +port map( + clk => clock_6, + addr => ch_palette_addr, + data => ch_palette_do +); + +-- sprite graphics ROM +sp_graphics : entity work.time_pilot_sprite_grphx +port map( + clk => clock_6, + addr => sp_graphx_addr, + data => sp_graphx_do +); + +-- sprite palette ROM +sp_palette : entity work.time_pilot_sprite_color_lut +port map( + clk => clock_6, + addr => sp_palette_addr, + data => sp_palette_do +); + +-- rgb palette ROM 1 +rgb_palette_gb : entity work.time_pilot_palette_blue_green +port map( + clk => clock_6, + addr => rgb_palette_addr, + data => rgb_palette_bg_do +); + +-- rgb palette ROM 2 +rgb_palette_br : entity work.time_pilot_palette_green_red +port map( + clk => clock_6, + addr => rgb_palette_addr, + data => rgb_palette_gr_do +); + +-- sound board +time_pilot_sound_board : entity work.time_pilot_sound_board +port map( + clock_14 => clock_14, + reset => reset, + + sound_trig => sound_trig, + sound_cmd => sound_cmd, + + audio_out => audio_out, + + dbg_cpu_addr => open + ); + +end struct; \ No newline at end of file diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_char_color_lut.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_char_color_lut.vhd new file mode 100644 index 00000000..19c3dff9 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_char_color_lut.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity time_pilot_char_color_lut is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of time_pilot_char_color_lut is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"0D",X"0F",X"0C",X"0A",X"04",X"01",X"0F",X"0B",X"04",X"01",X"0F",X"0C",X"04",X"01",X"0F", + X"0E",X"04",X"01",X"0F",X"00",X"04",X"01",X"0F",X"0A",X"04",X"05",X"01",X"0B",X"04",X"05",X"01", + X"0C",X"04",X"05",X"01",X"0E",X"04",X"05",X"01",X"00",X"04",X"05",X"01",X"0A",X"06",X"08",X"02", + X"0B",X"06",X"08",X"02",X"0C",X"06",X"08",X"02",X"0E",X"06",X"08",X"02",X"00",X"06",X"08",X"02", + X"00",X"01",X"04",X"0F",X"00",X"04",X"02",X"06",X"00",X"01",X"08",X"04",X"00",X"0D",X"01",X"05", + X"00",X"02",X"03",X"01",X"00",X"0C",X"0F",X"03",X"00",X"05",X"02",X"08",X"0A",X"01",X"04",X"03", + X"00",X"06",X"0F",X"02",X"00",X"0F",X"03",X"05",X"00",X"03",X"01",X"0F",X"0A",X"02",X"0D",X"05", + X"00",X"01",X"0F",X"08",X"0A",X"02",X"0D",X"05",X"0A",X"0B",X"09",X"0F",X"09",X"09",X"09",X"09", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_char_grphx.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_char_grphx.vhd new file mode 100644 index 00000000..3ca4ff51 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_char_grphx.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity time_pilot_char_grphx 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 prom of time_pilot_char_grphx is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00", + X"70",X"30",X"10",X"32",X"32",X"32",X"30",X"1E",X"00",X"80",X"C4",X"C4",X"C4",X"C4",X"80",X"0E", + X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"4C",X"4C",X"0C",X"04", + X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"62",X"40",X"C0",X"00", + X"00",X"00",X"67",X"23",X"03",X"03",X"01",X"77",X"00",X"00",X"68",X"68",X"68",X"2C",X"C0",X"F7", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"11",X"00",X"00",X"07",X"1F", + X"00",X"00",X"01",X"CF",X"16",X"96",X"3C",X"8F",X"00",X"00",X"80",X"C4",X"00",X"00",X"80",X"08", + X"0F",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"F1",X"70",X"00",X"00",X"11",X"00",X"00", + X"CF",X"F8",X"E1",X"87",X"43",X"ED",X"10",X"00",X"0C",X"80",X"80",X"00",X"00",X"C4",X"80",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00",X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00", + X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00",X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00", + X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00", + X"00",X"11",X"11",X"11",X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00",X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00", + X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00",X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00", + X"00",X"00",X"00",X"0F",X"FC",X"4B",X"FB",X"3C",X"00",X"00",X"00",X"0C",X"E6",X"4B",X"FB",X"87", + X"00",X"00",X"00",X"00",X"00",X"10",X"A9",X"5A",X"00",X"00",X"00",X"00",X"00",X"80",X"48",X"A4", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00", + X"33",X"23",X"01",X"91",X"91",X"81",X"81",X"93",X"00",X"88",X"88",X"08",X"08",X"0C",X"5D",X"5D", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00",X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"33",X"33",X"33",X"33",X"33",X"00",X"FF",X"FF",X"F8",X"F7",X"F7",X"F8",X"FF", + X"00",X"88",X"CC",X"E2",X"FD",X"FD",X"F3",X"FF",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"CC", + X"33",X"33",X"33",X"33",X"33",X"11",X"00",X"00",X"F9",X"F6",X"F6",X"F6",X"F6",X"FF",X"FF",X"00", + X"F3",X"FD",X"FD",X"FD",X"EC",X"CC",X"88",X"00",X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00",X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"88",X"88",X"FF",X"FF",X"00",X"00",X"00",X"66",X"22",X"22",X"EE",X"EE",X"00",X"66",X"66", + X"00",X"00",X"CC",X"CC",X"22",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00", + X"1E",X"0F",X"0F",X"07",X"16",X"3C",X"07",X"03",X"F7",X"F6",X"F4",X"E5",X"E5",X"E5",X"E5",X"F0", + X"F3",X"F3",X"79",X"79",X"79",X"3C",X"3C",X"16",X"E9",X"E9",X"C3",X"C3",X"C2",X"86",X"86",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00",X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00", + X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33",X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC", + X"00",X"00",X"00",X"00",X"03",X"03",X"01",X"77",X"00",X"00",X"00",X"00",X"68",X"2C",X"C0",X"F7", + X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"07",X"5A",X"5A",X"78",X"07",X"00", + X"00",X"11",X"0F",X"C3",X"5B",X"4B",X"0F",X"11",X"00",X"EE",X"0C",X"0C",X"EE",X"0C",X"0C",X"EE", + X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00",X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00", + X"67",X"67",X"67",X"23",X"03",X"03",X"01",X"77",X"68",X"68",X"68",X"68",X"68",X"2C",X"C0",X"F7", + X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00",X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00", + X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00",X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00",X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00", + X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33",X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"33",X"44",X"88",X"00",X"00",X"00",X"00",X"00",X"88",X"44",X"22",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"EE", + X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00",X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00", + X"11",X"11",X"11",X"FF",X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"EE",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00",X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00", + X"0F",X"84",X"08",X"08",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"08",X"08",X"08",X"08",X"08",X"08",X"0C",X"86", + X"00",X"00",X"01",X"91",X"91",X"81",X"81",X"93",X"00",X"00",X"88",X"08",X"08",X"0C",X"5D",X"5D", + X"03",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"84",X"0C",X"08",X"08",X"08",X"08",X"08",X"08", + X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00",X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00", + X"00",X"00",X"44",X"AA",X"99",X"AA",X"44",X"00",X"22",X"44",X"44",X"AA",X"22",X"AA",X"44",X"00", + X"00",X"00",X"74",X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"F3",X"62",X"62",X"40",X"C0",X"00", + X"00",X"89",X"8B",X"9B",X"EF",X"8B",X"03",X"FE",X"5A",X"5A",X"7E",X"DA",X"5A",X"78",X"C0",X"EE", + X"16",X"16",X"16",X"12",X"03",X"03",X"03",X"01",X"0C",X"0C",X"0C",X"08",X"08",X"08",X"08",X"00", + X"00",X"33",X"44",X"55",X"55",X"44",X"33",X"00",X"00",X"CC",X"22",X"AA",X"AA",X"22",X"CC",X"00", + X"00",X"00",X"16",X"16",X"03",X"01",X"01",X"01",X"00",X"88",X"88",X"C8",X"C0",X"2C",X"2C",X"3C", + X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00",X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00", + X"08",X"08",X"0C",X"86",X"E1",X"0F",X"0C",X"08",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00",X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00",X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"61",X"00",X"00",X"00",X"00",X"00",X"00",X"2C",X"2C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00",X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00", + X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00",X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00",X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00", + X"16",X"3C",X"3C",X"79",X"79",X"79",X"F3",X"F3",X"0C",X"86",X"86",X"C2",X"C3",X"C3",X"E9",X"E9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3C",X"3C",X"16",X"03",X"03",X"03",X"07",X"0F",X"CB",X"CA",X"C2",X"C2",X"C3",X"E1",X"87",X"87", + X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00",X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00", + X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00",X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00",X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00", + X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00",X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00", + X"3C",X"79",X"3C",X"1E",X"16",X"70",X"35",X"1E",X"F8",X"FC",X"ED",X"EF",X"E5",X"E9",X"F8",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"01",X"01",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"EF",X"8B",X"03",X"FE",X"00",X"00",X"00",X"00",X"5A",X"78",X"C0",X"EE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00",X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"16",X"03",X"03",X"61",X"00",X"00",X"00",X"00",X"48",X"48",X"2C",X"2C", + X"00",X"00",X"EE",X"00",X"00",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00",X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00", + X"00",X"FF",X"BF",X"17",X"13",X"03",X"21",X"30",X"00",X"00",X"BE",X"1F",X"1F",X"1F",X"3E",X"BE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00",X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00", + X"30",X"10",X"01",X"01",X"00",X"00",X"00",X"00",X"BE",X"8C",X"4C",X"4C",X"4C",X"4C",X"0C",X"04", + X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00",X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00", + X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00",X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00", + X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00",X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE", + X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00",X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00", + X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00",X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00", + X"0C",X"08",X"08",X"08",X"0C",X"0C",X"0C",X"C3",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0E",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF", + X"00",X"00",X"1E",X"1E",X"16",X"03",X"03",X"61",X"00",X"00",X"80",X"48",X"48",X"48",X"2C",X"2C", + X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00",X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00", + X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00",X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00", + X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00",X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00", + X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"01",X"00",X"00",X"00",X"01",X"07",X"1E",X"0F", + X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"00",X"00",X"00",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00",X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"2C",X"3C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"DA",X"29",X"10",X"00",X"00",X"00",X"00",X"00",X"A4",X"48",X"80",X"00",X"00",X"00",X"00",X"00", + X"01",X"03",X"0B",X"0F",X"2D",X"34",X"16",X"16",X"86",X"86",X"87",X"C3",X"C3",X"E1",X"8F",X"CB", + X"FC",X"74",X"74",X"30",X"10",X"10",X"00",X"00",X"73",X"73",X"F3",X"62",X"62",X"40",X"C0",X"00", + X"88",X"44",X"22",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"44",X"22",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00",X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"01",X"00",X"00",X"00",X"00",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"88",X"44",X"33",X"00",X"00",X"00",X"00",X"00",X"22",X"44",X"88",X"00",X"00",X"00", + X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00",X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"22",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00", + X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00",X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00", + X"00",X"00",X"00",X"00",X"91",X"81",X"81",X"93",X"00",X"00",X"00",X"00",X"08",X"0C",X"5D",X"5D", + X"01",X"01",X"03",X"07",X"1E",X"16",X"16",X"3C",X"87",X"87",X"87",X"C3",X"C3",X"CB",X"E9",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00",X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00", + X"00",X"00",X"8B",X"9B",X"EF",X"8B",X"03",X"FE",X"00",X"00",X"7E",X"DA",X"5A",X"78",X"C0",X"EE", + X"00",X"61",X"1E",X"1E",X"12",X"03",X"03",X"61",X"00",X"00",X"80",X"48",X"48",X"48",X"2C",X"2C", + X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00",X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00", + X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00",X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00", + X"08",X"00",X"00",X"08",X"0E",X"C3",X"E1",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"F7", + X"00",X"01",X"01",X"12",X"34",X"34",X"7C",X"FC",X"0C",X"04",X"86",X"42",X"63",X"63",X"F3",X"73", + X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00",X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00", + X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00",X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00", + X"00",X"55",X"55",X"FF",X"55",X"55",X"22",X"00",X"88",X"44",X"44",X"EE",X"44",X"44",X"00",X"00", + X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00",X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00", + X"01",X"03",X"03",X"03",X"12",X"16",X"16",X"16",X"00",X"08",X"08",X"08",X"08",X"0C",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"81",X"93",X"00",X"00",X"00",X"00",X"00",X"00",X"5D",X"5D", + X"3C",X"1E",X"1E",X"1E",X"3C",X"3C",X"F3",X"F1",X"E9",X"CB",X"CB",X"CB",X"E9",X"FE",X"F8",X"CB", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00",X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"BF",X"17",X"13",X"03",X"21",X"30",X"00",X"00",X"BE",X"1F",X"1F",X"1F",X"3E",X"BE", + X"08",X"00",X"00",X"00",X"08",X"0F",X"0E",X"84",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00",X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00", + X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00",X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00", + X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00", + X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"90",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"88", + X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"4C",X"4C",X"4C",X"4C",X"0C",X"04", + X"03",X"03",X"03",X"16",X"16",X"1E",X"3C",X"3C",X"08",X"08",X"08",X"0C",X"0C",X"0E",X"86",X"86", + X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00",X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00", + X"86",X"0C",X"08",X"08",X"08",X"0C",X"0C",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"44",X"22",X"11",X"77",X"11",X"22",X"44",X"00",X"44",X"88",X"00",X"CC",X"00",X"88",X"44",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"01",X"01",X"03",X"07",X"09",X"00",X"00",X"78",X"78",X"E1",X"C3",X"87",X"87",X"0C",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00",X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00", + X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00",X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"54",X"54", + X"00",X"00",X"70",X"10",X"70",X"F0",X"F0",X"F0",X"00",X"00",X"80",X"80",X"C4",X"A2",X"A2",X"E6", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"76",X"45",X"45",X"44",X"00",X"00",X"00",X"00", + X"F0",X"3C",X"1E",X"1E",X"16",X"10",X"00",X"00",X"A2",X"A2",X"E6",X"A2",X"A2",X"C4",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"34",X"34",X"7C",X"FC",X"00",X"00",X"00",X"00",X"63",X"63",X"F3",X"73", + X"00",X"00",X"01",X"12",X"34",X"34",X"7C",X"FC",X"00",X"00",X"86",X"42",X"63",X"63",X"F3",X"73", + X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00",X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00", + X"00",X"11",X"11",X"11",X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00",X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"93",X"57",X"93",X"A1",X"B0",X"90",X"90",X"80",X"FF",X"9D",X"1D",X"3F",X"1D",X"5D",X"CC",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00", + X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"BE", + X"FD",X"5A",X"FA",X"5A",X"0F",X"00",X"00",X"00",X"F7",X"4B",X"FB",X"4A",X"0C",X"00",X"00",X"00", + X"08",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"B0",X"90",X"90",X"80",X"00",X"00",X"00",X"00",X"1D",X"5D",X"CC",X"88", + X"00",X"00",X"00",X"00",X"03",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"C0",X"2C",X"2C",X"3C", + X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00",X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00", + X"88",X"44",X"22",X"11",X"44",X"AA",X"44",X"00",X"44",X"AA",X"44",X"00",X"88",X"44",X"22",X"00", + X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"03", + X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1E",X"3C",X"3C",X"3D",X"78",X"F2",X"F3",X"79",X"E9",X"E1",X"F4",X"FC",X"FE",X"FC",X"ED",X"E9", + X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"00",X"00",X"08",X"08",X"0C",X"0C",X"86",X"87", + X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00",X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00", + X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00",X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"7C",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"F3",X"73", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF", + X"3C",X"3C",X"1E",X"16",X"16",X"03",X"03",X"03",X"86",X"86",X"0E",X"0C",X"0C",X"08",X"08",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00",X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0F",X"01",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3C",X"07",X"03", + X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00",X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"77",X"00",X"00",X"00",X"66",X"66",X"00",X"88",X"CC", + X"00",X"00",X"00",X"00",X"13",X"03",X"21",X"30",X"00",X"00",X"00",X"00",X"1F",X"1F",X"3E",X"BE", + X"00",X"00",X"93",X"A1",X"B0",X"90",X"90",X"80",X"00",X"00",X"1D",X"3F",X"1D",X"5D",X"CC",X"88", + X"00",X"00",X"16",X"16",X"03",X"01",X"01",X"01",X"00",X"00",X"88",X"C8",X"C0",X"2C",X"2C",X"3C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00",X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"11",X"11",X"11",X"11",X"11",X"33",X"33",X"33",X"88",X"88",X"88",X"88",X"88",X"CC",X"CC",X"CC", + X"11",X"11",X"11",X"11",X"33",X"33",X"33",X"77",X"88",X"88",X"88",X"88",X"CC",X"CC",X"CC",X"EE", + X"11",X"11",X"33",X"33",X"33",X"77",X"77",X"77",X"88",X"88",X"CC",X"CC",X"CC",X"EE",X"EE",X"EE", + X"33",X"33",X"33",X"33",X"33",X"33",X"77",X"77",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"EE",X"EE", + X"33",X"33",X"33",X"33",X"33",X"77",X"77",X"FF",X"CC",X"CC",X"CC",X"CC",X"CC",X"EE",X"EE",X"FF", + X"33",X"33",X"33",X"33",X"77",X"77",X"FF",X"FF",X"CC",X"CC",X"CC",X"CC",X"EE",X"EE",X"FF",X"FF", + X"77",X"77",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"EE",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"33",X"33",X"77",X"77",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC", + X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"EF",X"FC",X"FC",X"FC",X"FC",X"FC",X"FF",X"FF",X"7F",X"33",X"33",X"33",X"33",X"33",X"FF", + X"00",X"00",X"33",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"11",X"33",X"FF",X"FF",X"FF",X"CF",X"0F",X"FC",X"FC",X"FC",X"DA",X"AD",X"0E",X"0E",X"6C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"ED",X"FC",X"FC",X"FE",X"FF",X"77",X"77",X"0F",X"86",X"80",X"00",X"33",X"FF",X"FF",X"EF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"33",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"D1",X"FF",X"00",X"00",X"00",X"00",X"00",X"FC",X"FC",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"0F",X"00",X"00",X"00",X"00",X"80",X"FC",X"FC",X"FC",X"96",X"43",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"33",X"11",X"00",X"00",X"00",X"0C",X"FC",X"FC",X"FC",X"FC",X"EC",X"EC",X"44",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"FF",X"FF",X"FC",X"1E",X"0F",X"0F",X"0C",X"00",X"FC",X"FC",X"BC",X"1E",X"96",X"02",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"07",X"FF",X"FF",X"FF",X"FF",X"FF",X"CF",X"3F",X"0F",X"FF",X"FF",X"FF",X"8F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"EF",X"FC",X"0F",X"33",X"77",X"FF",X"FF",X"EF",X"0F",X"80",X"00",X"FC",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00", + X"0E",X"0F",X"1E",X"DE",X"FF",X"FF",X"33",X"11",X"42",X"96",X"1E",X"BC",X"FC",X"FC",X"FC",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CF",X"FF",X"FF",X"FF",X"FF",X"0E",X"1E",X"FD",X"CF",X"1E",X"BC",X"FC",X"EC",X"1E",X"BC",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"01",X"00",X"00",X"00",X"00",X"44",X"EC",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"DF",X"CF",X"EF",X"77",X"11",X"00",X"8F",X"CF",X"FF",X"7F",X"7B",X"C0",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"77",X"FF",X"FF",X"FF",X"9F",X"0F",X"0E",X"00",X"00",X"88",X"CC",X"EC",X"EC",X"FC",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"EC",X"44",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EF",X"FF",X"FF",X"FF",X"FF",X"33",X"11",X"00",X"0F",X"CF",X"FF",X"FF",X"FF",X"CF",X"EF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"00",X"00",X"00",X"44",X"EC",X"EC",X"FC",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"FF",X"17",X"00",X"00",X"00",X"77",X"FF",X"EC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"EF",X"CF",X"DF",X"FF",X"FF",X"EF",X"ED",X"80",X"7B",X"7F",X"FF",X"CF",X"8F",X"0F",X"0F", + X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"33",X"11",X"0C",X"0F",X"1E",X"FC",X"FC",X"FC",X"FC",X"FC",X"ED",X"C7",X"1E",X"BC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"33",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FF",X"FF",X"EF",X"9F",X"3F",X"77",X"77",X"0C",X"80",X"D1",X"F7",X"FF",X"FF",X"EF",X"8F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CF",X"FF",X"FF",X"FC",X"FC",X"FC",X"FC",X"FC",X"0C",X"C0",X"C0",X"00",X"CF",X"FF",X"77",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"47",X"8F",X"EF",X"FF",X"FF",X"FC",X"ED",X"FF",X"3F",X"E0",X"E0",X"C0",X"80",X"0C",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"1F",X"00",X"00",X"00",X"00",X"00",X"FC",X"FC",X"FC",X"FC",X"0F",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"EF",X"FC",X"0F",X"00",X"00",X"00",X"FF",X"FF",X"0F",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"EF",X"FC",X"9E",X"07",X"EC",X"FF",X"FF",X"8F",X"0F",X"08",X"00",X"00",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"1E",X"BC",X"FF",X"FF",X"7F",X"1F",X"8F",X"07",X"1E",X"FC",X"FC",X"FC",X"FC",X"FC",X"EC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"FF",X"FF",X"FF",X"11",X"00",X"00",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"EC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"33",X"33",X"0F",X"FC",X"FC",X"E8",X"00",X"1E",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CF",X"FF",X"FF",X"FF",X"EC",X"07",X"9E",X"FC",X"3F",X"FF",X"FF",X"FF",X"11",X"00",X"00",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"8F",X"0F",X"08",X"00",X"00",X"11",X"FF",X"FC",X"FC",X"9E",X"03",X"EC",X"FC",X"FC",X"FC", + X"07",X"9E",X"FC",X"EF",X"EF",X"FF",X"FF",X"FF",X"33",X"80",X"0C",X"0F",X"0F",X"8F",X"EF",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_mist.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_mist.vhd new file mode 100644 index 00000000..9e263c43 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_mist.vhd @@ -0,0 +1,290 @@ +--------------------------------------------------------------------------------- +-- Mist Top level for Time pilot by Dar (darfpga@aol.fr) (29/10/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- Use time_pilot_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- +-- Uses 1 pll for 12MHz and 14MHz generation from 27MHz +-- +-- Mist key : +-- Right Button : reset game +-- +-- Keyboard players inputs : +-- +-- ESC : Add coin +-- 2 : Start 2 players +-- 1 : Start 1 player +-- SPACE : Fire +-- RIGHT arrow : rotate right +-- LEFT arrow : rotate left +-- UP arrow : rotate up +-- DOWN arrow : rotate down +-- +-- Other details : see time_pilot.vhd + +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; + +entity time_pilot_mist is +port( + CLOCK_27 : in std_logic; + AUDIO_L : out std_logic; + AUDIO_R : out std_logic; + VGA_R : out std_logic_vector(5 downto 0); + VGA_G : out std_logic_vector(5 downto 0); + VGA_B : out std_logic_vector(5 downto 0); + VGA_VS : out std_logic; + VGA_HS : out std_logic; + LED : out std_logic; + SPI_SCK : in std_logic; + SPI_DI : in std_logic; + SPI_DO : out std_logic; + SPI_SS3 : in std_logic; + CONF_DATA0 : in std_logic +); +end time_pilot_mist; + +architecture struct of time_pilot_mist is + + signal clock_48 : std_logic; + signal clock_12 : std_logic; + signal clock_14 : std_logic; + signal reset : std_logic; + signal pll_locked: std_logic; + + signal r : std_logic_vector(4 downto 0); + signal g : std_logic_vector(4 downto 0); + signal b : std_logic_vector(4 downto 0); + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic; + signal audio : std_logic_vector(10 downto 0); + signal audio_pwm : std_logic; + signal reset_n : std_logic; + signal ps2_clk : std_logic; + signal ps2_dat : std_logic; + signal joy_u : std_logic; + signal joy_l : std_logic; + signal joy_r : std_logic; + signal joy_d : std_logic; + signal scanlines : std_logic_vector(1 downto 0); + signal hq2x : std_logic; + signal buttons : std_logic_vector(1 downto 0); + signal joy0 : std_logic_vector(7 downto 0); + signal joy1 : std_logic_vector(7 downto 0); + signal status : std_logic_vector(31 downto 0); + signal scandoubler_disable : std_logic; + signal ypbpr : std_logic; + signal pix_ce : std_logic; + signal kbd_joy0 : std_logic_vector(7 downto 0); + signal ps2Clk : std_logic; + signal ps2Data : std_logic; + signal VGA_R_O : std_logic_vector(2 downto 0); + signal VGA_G_O : std_logic_vector(2 downto 0); + signal VGA_B_O : std_logic_vector(2 downto 0); + + + constant CONF_STR : string := + "Time Pilot;;O4,Joystick Control,Upright,Normal;O89,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;T5,Reset;V,v1.00"; + + function to_slv(s: string) return std_logic_vector is + constant ss: string(1 to s'length) := s; + variable rval: std_logic_vector(1 to 8 * s'length); + variable p: integer; + variable c: integer; + begin + for i in ss'range loop + p := 8 * i; + c := character'pos(ss(i)); + rval(p - 7 to p) := std_logic_vector(to_unsigned(c,8)); + end loop; + return rval; + end function; + + component mist_io + generic ( STRLEN : integer := 0 ); + port ( + clk_sys :in std_logic; + SPI_SCK, CONF_DATA0, SPI_DI :in std_logic; + SPI_DO : out std_logic; + conf_str : in std_logic_vector(8*STRLEN-1 downto 0); + buttons : out std_logic_vector(1 downto 0); + joystick_0 : out std_logic_vector(7 downto 0); + joystick_1 : out std_logic_vector(7 downto 0); + status : out std_logic_vector(31 downto 0); + scandoubler_disable, ypbpr : out std_logic; + ps2_kbd_clk : out std_logic; + ps2_kbd_data : out std_logic + ); + end component mist_io; + + component video_mixer + generic ( LINE_LENGTH : integer := 384; HALF_DEPTH : integer := 1 ); + port ( + clk_sys, ce_pix, ce_pix_actual : in std_logic; + SPI_SCK, SPI_SS3, SPI_DI : in std_logic; + scanlines : in std_logic_vector(1 downto 0); + scandoubler_disable, hq2x, ypbpr, ypbpr_full : in std_logic; + R, G, B : in std_logic_vector(2 downto 0); + HSync, VSync, line_start, mono : in std_logic; + VGA_R,VGA_G, VGA_B : out std_logic_vector(5 downto 0); + VGA_VS, VGA_HS : out std_logic + ); + end component video_mixer; + + component keyboard + PORT( + clk : in std_logic; + reset : in std_logic; + ps2_kbd_clk : in std_logic; + ps2_kbd_data : in std_logic; + joystick : out std_logic_vector (7 downto 0) + ); + end component; + +begin + +reset <= status(0) or status(5) or buttons(1) or not pll_locked; + +clocks : entity work.mist_pll_12M_14M + port map( + inclk0 => CLOCK_27, + c0 => clock_12,--12.28800000 + c1 => clock_14,--14.31800000 + c2 => clock_48, + locked => pll_locked +); + +scanlines(1) <= '1' when status(9 downto 8) = "11" and scandoubler_disable = '0' else '0'; +scanlines(0) <= '1' when status(9 downto 8) = "10" and scandoubler_disable = '0' else '0'; +hq2x <= '1' when status(9 downto 8) = "01" else '0'; + +vmixer : video_mixer + port map ( + clk_sys => clock_48, + ce_pix => pix_ce, + ce_pix_actual => pix_ce, + SPI_SCK => SPI_SCK, + SPI_SS3 => SPI_SS3, + SPI_DI => SPI_DI, + scanlines => scanlines, + scandoubler_disable => scandoubler_disable, + hq2x => hq2x, + ypbpr => ypbpr, + ypbpr_full => '1', + R => VGA_R_O, + G => VGA_G_O, + B => VGA_B_O, + HSync => hsync, + VSync => vsync, + line_start => '0', + mono => '0', + VGA_R => VGA_R, + VGA_G => VGA_G, + VGA_B => VGA_B, + VGA_VS => VGA_VS, + VGA_HS => VGA_HS +); + +mist_io_inst : mist_io + generic map (STRLEN => CONF_STR'length) + port map ( + clk_sys => clock_48, + SPI_SCK => SPI_SCK, + CONF_DATA0 => CONF_DATA0, + SPI_DI => SPI_DI, + SPI_DO => SPI_DO, + conf_str => to_slv(CONF_STR), + buttons => buttons, + scandoubler_disable => scandoubler_disable, + ypbpr => ypbpr, + joystick_1 => joy1, + joystick_0 => joy0, + status => status, + ps2_kbd_clk => ps2Clk, + ps2_kbd_data => ps2Data +); + +Joy_r <= joy0(0) or joy1(0) or kbd_joy0(7) when status(4) = '0' + else joy0(3) or joy1(3) or kbd_joy0(4); +Joy_l <= joy0(1) or joy1(1) or kbd_joy0(6) when status(4) = '0' + else joy0(2) or joy1(2) or kbd_joy0(5); +Joy_u <= joy0(3) or joy1(3) or kbd_joy0(4) when status(4) = '0' + else joy0(1) or joy1(1) or kbd_joy0(6); +Joy_d <= joy0(2) or joy1(2) or kbd_joy0(5) when status(4) = '0' + else joy0(0) or joy1(0) or kbd_joy0(7); + +time_pilot : entity work.time_pilot + port map( + clock_12 => clock_12, + clock_14 => clock_14, + reset => reset, + video_r => r, + video_g => g, + video_b => b, + video_hblank => open, + video_vblank => open, + video_clk => pix_ce, + video_hs => hsync, + video_vs => vsync, + audio_out => audio, + dip_switch_1 => X"FF", -- Coinage_B / Coinage_A + dip_switch_2 => X"4B", -- Sound(8)/Difficulty(7-5)/Bonus(4)/Cocktail(3)/lives(2-1) + start2 => kbd_joy0(2) or status(3), + start1 => kbd_joy0(1) or status(2), + coin1 => kbd_joy0(3) or status(1), + fire1 => joy0(4) or joy1(4) or kbd_joy0(0), + right1 => Joy_r, + left1 => Joy_l, + down1 => Joy_d, + up1 => Joy_u, + fire2 => joy0(4) or joy1(4) or kbd_joy0(0), + right2 => Joy_r, + left2 => Joy_l, + down2 => Joy_d, + up2 => Joy_u, + dbg_cpu_addr => open +); + + +VGA_R_O <= r(4 downto 2); +VGA_G_O <= g(4 downto 2); +VGA_B_O <= b(4 downto 2); + +u_keyboard : keyboard + port map( + clk => clock_48, + reset => reset, + ps2_kbd_clk => ps2Clk, + ps2_kbd_data => ps2Data, + joystick => kbd_joy0 +); + +u_dac : entity work.dac + port map( + clk_i => clock_48, + res_n_i => not reset, + dac_i => audio, + dac_o => audio_pwm +); + +AUDIO_L <= audio_pwm; +AUDIO_R <= audio_pwm; + + LED <= '1'; +end struct; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_palette_blue_green.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_palette_blue_green.vhd new file mode 100644 index 00000000..7e5dbed5 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_palette_blue_green.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity time_pilot_palette_blue_green is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of time_pilot_palette_blue_green is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"05",X"06",X"07",X"FC",X"05",X"BD",X"B5",X"FD",X"05",X"B0",X"A5",X"E0",X"00",X"F7", + X"00",X"00",X"F8",X"07",X"07",X"FD",X"F8",X"FA",X"05",X"DE",X"50",X"51",X"32",X"FD",X"30",X"F7"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_palette_green_red.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_palette_green_red.vhd new file mode 100644 index 00000000..868befaf --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_palette_green_red.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity time_pilot_palette_green_red is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of time_pilot_palette_green_red is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"3E",X"3E",X"80",X"FE",X"00",X"AC",X"EE",X"AC",X"C0",X"14",X"00",X"28",X"38",X"16",X"BC", + X"00",X"3E",X"00",X"C0",X"FE",X"C0",X"3E",X"80",X"3E",X"F6",X"00",X"80",X"80",X"00",X"0C",X"BC"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_prog.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_prog.vhd new file mode 100644 index 00000000..d310fd8c --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_prog.vhd @@ -0,0 +1,1558 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity time_pilot_prog is +port ( + clk : in std_logic; + addr : in std_logic_vector(14 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of time_pilot_prog is + type rom is array(0 to 24575) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"C3",X"B1",X"07",X"FF",X"FF",X"FF",X"33",X"4B",X"85",X"6F",X"30",X"01",X"24",X"7E",X"C9",X"4F", + X"87",X"DF",X"5E",X"23",X"56",X"23",X"C9",X"4E",X"85",X"6F",X"D0",X"24",X"C9",X"FF",X"FF",X"41", + X"7B",X"D6",X"20",X"5F",X"D0",X"15",X"C9",X"4D",X"7B",X"C6",X"20",X"5F",X"D0",X"14",X"C9",X"49", + X"E1",X"D7",X"EB",X"E9",X"FF",X"FF",X"FF",X"FF",X"E5",X"26",X"AC",X"3A",X"B2",X"A9",X"6F",X"CB", + X"7E",X"28",X"0A",X"72",X"2C",X"73",X"2C",X"7D",X"E6",X"3F",X"32",X"B2",X"A9",X"E1",X"C9",X"0F", + X"A7",X"11",X"ED",X"77",X"68",X"D7",X"34",X"F1",X"D7",X"A5",X"3B",X"7C",X"FD",X"3B",X"7D",X"F1", + X"DC",X"A5",X"8C",X"57",X"34",X"B9",X"C3",X"D8",X"00",X"32",X"00",X"C2",X"21",X"11",X"B4",X"06", + X"30",X"36",X"00",X"23",X"10",X"FB",X"32",X"00",X"C2",X"21",X"10",X"B4",X"06",X"30",X"36",X"00", + X"23",X"10",X"FB",X"32",X"00",X"C2",X"21",X"00",X"A8",X"11",X"01",X"A8",X"01",X"FF",X"07",X"36", + X"00",X"ED",X"B0",X"32",X"00",X"C2",X"06",X"00",X"21",X"D8",X"00",X"AF",X"86",X"23",X"10",X"FC", + X"D6",X"87",X"C4",X"D8",X"00",X"C3",X"66",X"58",X"32",X"00",X"C3",X"32",X"00",X"C2",X"C3",X"93", + X"0B",X"21",X"20",X"A4",X"0E",X"0E",X"11",X"20",X"00",X"19",X"06",X"10",X"CD",X"C7",X"00",X"23", + X"23",X"10",X"F9",X"0D",X"20",X"F0",X"C9",X"E5",X"36",X"56",X"23",X"36",X"83",X"11",X"1F",X"00", + X"19",X"36",X"C7",X"23",X"36",X"EF",X"E1",X"C9",X"F5",X"C5",X"D5",X"E5",X"08",X"D9",X"F5",X"C5", + X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"CD",X"65",X"03",X"CD",X"86",X"52",X"AF",X"32",X"00",X"C3", + X"32",X"00",X"C2",X"3C",X"32",X"87",X"A9",X"3A",X"32",X"AD",X"A7",X"28",X"09",X"3A",X"C2",X"A9", + X"A7",X"20",X"03",X"32",X"87",X"A9",X"3A",X"87",X"A9",X"32",X"02",X"C3",X"3A",X"00",X"C2",X"2F", + X"32",X"AD",X"A9",X"3A",X"00",X"C3",X"2F",X"32",X"AE",X"A9",X"3A",X"20",X"C3",X"2F",X"32",X"AF", + X"A9",X"3A",X"40",X"C3",X"2F",X"32",X"B0",X"A9",X"3A",X"60",X"C3",X"2F",X"32",X"B1",X"A9",X"21", + X"80",X"A9",X"34",X"21",X"CE",X"A9",X"7E",X"3C",X"27",X"77",X"21",X"17",X"A8",X"7E",X"A7",X"28", + X"01",X"35",X"21",X"12",X"A8",X"7E",X"A7",X"28",X"01",X"35",X"21",X"F4",X"A8",X"7E",X"A7",X"28", + X"01",X"35",X"CD",X"BE",X"48",X"21",X"74",X"01",X"E5",X"3A",X"AB",X"A9",X"E6",X"03",X"F7",X"C2", + X"15",X"51",X"16",X"FE",X"17",X"1F",X"0F",X"6F",X"A6",X"14",X"88",X"57",X"A5",X"BF",X"34",X"D7", + X"F1",X"96",X"F1",X"B9",X"CD",X"D4",X"55",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"D9", + X"08",X"E1",X"D1",X"C1",X"3A",X"00",X"16",X"32",X"00",X"C3",X"F1",X"C9",X"87",X"30",X"01",X"24", + X"85",X"6F",X"30",X"01",X"24",X"5E",X"23",X"56",X"23",X"C9",X"21",X"00",X"A4",X"22",X"89",X"A9", + X"3E",X"20",X"32",X"88",X"A9",X"06",X"F0",X"21",X"A5",X"4B",X"AF",X"86",X"23",X"10",X"FC",X"D6", + X"11",X"C4",X"67",X"01",X"C9",X"21",X"04",X"A4",X"22",X"89",X"A9",X"3A",X"CD",X"0C",X"32",X"88", + X"A9",X"C9",X"2A",X"89",X"A9",X"06",X"20",X"11",X"20",X"00",X"36",X"F1",X"CB",X"94",X"36",X"10", + X"CB",X"D4",X"19",X"10",X"F5",X"2A",X"89",X"A9",X"23",X"22",X"89",X"A9",X"21",X"88",X"A9",X"35", + X"C9",X"AF",X"32",X"E2",X"A9",X"2A",X"45",X"0D",X"22",X"E3",X"A9",X"2A",X"0C",X"28",X"22",X"E5", + X"A9",X"06",X"00",X"21",X"33",X"0E",X"AF",X"86",X"23",X"10",X"FC",X"D6",X"FD",X"C4",X"69",X"00", + X"C9",X"CD",X"6F",X"02",X"2A",X"F5",X"32",X"ED",X"4B",X"E3",X"A9",X"A7",X"ED",X"42",X"29",X"29", + X"29",X"29",X"3E",X"00",X"DE",X"00",X"6C",X"67",X"22",X"E7",X"A9",X"2A",X"45",X"0B",X"ED",X"4B", + X"E5",X"A9",X"A7",X"ED",X"42",X"29",X"29",X"29",X"29",X"3E",X"00",X"DE",X"00",X"6C",X"67",X"22", + X"E9",X"A9",X"2A",X"E3",X"A9",X"ED",X"4B",X"E7",X"A9",X"09",X"22",X"E3",X"A9",X"2A",X"E5",X"A9", + X"ED",X"4B",X"E9",X"A9",X"09",X"22",X"E5",X"A9",X"CD",X"6F",X"02",X"ED",X"5B",X"B2",X"14",X"A7", + X"ED",X"52",X"C2",X"32",X"02",X"21",X"E2",X"A9",X"34",X"7E",X"21",X"90",X"02",X"D7",X"21",X"E3", + X"A9",X"36",X"00",X"23",X"73",X"21",X"E5",X"A9",X"36",X"00",X"23",X"72",X"7B",X"A7",X"C9",X"3A", + X"E4",X"A9",X"87",X"87",X"87",X"6F",X"26",X"00",X"29",X"29",X"3A",X"E6",X"A9",X"85",X"6F",X"3E", + X"A4",X"84",X"67",X"3A",X"0B",X"AD",X"77",X"CB",X"94",X"3A",X"0C",X"AD",X"77",X"CB",X"D4",X"C9", + X"10",X"04",X"11",X"04",X"12",X"04",X"13",X"04",X"14",X"04",X"15",X"04",X"16",X"04",X"17",X"04", + X"18",X"04",X"19",X"04",X"1A",X"04",X"1B",X"04",X"1C",X"04",X"1D",X"04",X"1D",X"05",X"1D",X"06", + X"1D",X"07",X"1D",X"08",X"1D",X"09",X"1D",X"0A",X"1D",X"0B",X"1D",X"0C",X"1D",X"0D",X"1D",X"0E", + X"1D",X"0F",X"1D",X"10",X"1D",X"11",X"1D",X"12",X"1D",X"13",X"1D",X"14",X"1D",X"15",X"1D",X"16", + X"1D",X"17",X"1D",X"18",X"1D",X"19",X"1D",X"1A",X"1D",X"1B",X"1D",X"1C",X"1D",X"1D",X"1D",X"1E", + X"1C",X"1E",X"1B",X"1E",X"1A",X"1E",X"19",X"1E",X"18",X"1E",X"17",X"1E",X"16",X"1E",X"15",X"1E", + X"14",X"1E",X"13",X"1E",X"12",X"1E",X"11",X"1E",X"10",X"1E",X"0F",X"1E",X"0E",X"1E",X"0D",X"1E", + X"0C",X"1E",X"0B",X"1E",X"0A",X"1E",X"09",X"1E",X"08",X"1E",X"07",X"1E",X"06",X"1E",X"05",X"1E", + X"04",X"1E",X"03",X"1E",X"02",X"1E",X"02",X"1D",X"02",X"1C",X"02",X"1B",X"02",X"1A",X"02",X"19", + X"02",X"18",X"02",X"17",X"02",X"16",X"02",X"15",X"02",X"14",X"02",X"13",X"02",X"12",X"02",X"11", + X"02",X"10",X"02",X"0F",X"02",X"0E",X"02",X"0D",X"02",X"0C",X"02",X"0B",X"02",X"0A",X"02",X"09", + X"02",X"08",X"02",X"07",X"02",X"06",X"02",X"05",X"02",X"04",X"03",X"04",X"04",X"04",X"05",X"04", + X"06",X"04",X"07",X"04",X"08",X"04",X"09",X"04",X"0A",X"04",X"0B",X"04",X"0C",X"04",X"0D",X"04", + X"0E",X"04",X"0F",X"04",X"00",X"21",X"30",X"AA",X"11",X"10",X"B0",X"3A",X"87",X"A9",X"A7",X"CA", + X"56",X"05",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"21",X"10", + X"AA",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED", + X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED", + X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED", + X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED", + X"A0",X"21",X"36",X"AA",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0", + X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"21",X"60",X"AA",X"11",X"10",X"B4",X"ED",X"A0", + X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C", + X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"21",X"40",X"AA",X"ED",X"A0",X"7E",X"C6", + X"0E",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"ED",X"A0", + X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C", + X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12", + X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E", + X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E", + X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"ED", + X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C", + X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F", + X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"21",X"66",X"AA",X"ED", + X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C", + X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F", + X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0E",X"2F",X"12",X"2C",X"1C",X"3A",X"AB",X"A9",X"FE", + X"03",X"C0",X"3A",X"AC",X"A9",X"21",X"32",X"08",X"BE",X"D8",X"FE",X"08",X"D0",X"3A",X"11",X"B4", + X"C6",X"80",X"38",X"0A",X"32",X"11",X"B4",X"21",X"10",X"B0",X"7E",X"C6",X"80",X"77",X"3A",X"13", + X"B4",X"C6",X"80",X"38",X"0A",X"32",X"13",X"B4",X"21",X"12",X"B0",X"7E",X"C6",X"80",X"77",X"3A", + X"15",X"B4",X"C6",X"80",X"38",X"0A",X"32",X"15",X"B4",X"21",X"14",X"B0",X"7E",X"C6",X"80",X"77", + X"3A",X"37",X"B4",X"C6",X"80",X"38",X"0A",X"32",X"37",X"B4",X"21",X"36",X"B0",X"7E",X"C6",X"80", + X"77",X"3A",X"39",X"B4",X"C6",X"80",X"38",X"0A",X"32",X"39",X"B4",X"21",X"38",X"B0",X"7E",X"C6", + X"80",X"77",X"3A",X"3B",X"B4",X"C6",X"80",X"38",X"0A",X"32",X"3B",X"B4",X"21",X"3A",X"B0",X"7E", + X"C6",X"80",X"77",X"3A",X"3D",X"B4",X"C6",X"80",X"38",X"0A",X"32",X"3D",X"B4",X"21",X"3C",X"B0", + X"7E",X"C6",X"80",X"77",X"3A",X"3F",X"B4",X"C6",X"80",X"38",X"0A",X"32",X"3F",X"B4",X"21",X"3E", + X"B0",X"7E",X"C6",X"80",X"77",X"C9",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E", + X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED", + X"A0",X"21",X"10",X"AA",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0F", + X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E", + X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED", + X"A0",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12",X"2C", + X"1C",X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0F",X"2F", + X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6", + X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0", + X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C", + X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12", + X"2C",X"1C",X"ED",X"A0",X"21",X"36",X"AA",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0", + X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C", + X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12",X"2C",X"1C",X"ED",X"A0",X"7E",X"C6",X"0F",X"2F",X"12", + X"2C",X"1C",X"ED",X"A0",X"21",X"60",X"AA",X"11",X"10",X"B4",X"7E",X"EE",X"C0",X"12",X"2C",X"1C", + X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C", + X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"21",X"40",X"AA",X"7E",X"EE", + X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E", + X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"7E", + X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C", + X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C", + X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C", + X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C", + X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12", + X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12", + X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0", + X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C", + X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"21",X"66", + X"AA",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12", + X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12", + X"2C",X"1C",X"7E",X"EE",X"C0",X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"7E",X"EE",X"C0", + X"12",X"2C",X"1C",X"7E",X"3C",X"12",X"2C",X"1C",X"C3",X"BC",X"04",X"06",X"00",X"21",X"A0",X"4A", + X"AF",X"86",X"23",X"10",X"FC",X"D6",X"B8",X"C2",X"FA",X"08",X"3A",X"0C",X"AD",X"FE",X"05",X"F5", + X"3E",X"05",X"32",X"0C",X"AD",X"3E",X"F1",X"32",X"0B",X"AD",X"CD",X"E1",X"01",X"F1",X"CC",X"1A", + X"0F",X"C3",X"1A",X"0F",X"06",X"00",X"21",X"99",X"4C",X"97",X"AE",X"23",X"10",X"FC",X"C6",X"95", + X"C4",X"11",X"0F",X"3A",X"30",X"AD",X"A7",X"28",X"17",X"ED",X"5B",X"5B",X"12",X"3A",X"32",X"AD", + X"A7",X"28",X"01",X"1C",X"FF",X"3A",X"0E",X"AD",X"A7",X"28",X"05",X"16",X"07",X"FF",X"18",X"04", + X"11",X"02",X"02",X"FF",X"CD",X"09",X"08",X"CD",X"F0",X"19",X"C3",X"1A",X"0F",X"47",X"C3",X"03", + X"53",X"3A",X"00",X"60",X"FE",X"55",X"CA",X"00",X"60",X"31",X"00",X"B0",X"32",X"00",X"C2",X"21", + X"00",X"C3",X"06",X"08",X"36",X"00",X"23",X"10",X"FB",X"3A",X"4B",X"2D",X"32",X"08",X"C3",X"C3", + X"69",X"00",X"21",X"9F",X"A7",X"11",X"E0",X"FF",X"06",X"0E",X"36",X"F1",X"CB",X"94",X"36",X"16", + X"CB",X"D4",X"19",X"10",X"F5",X"C9",X"CD",X"06",X"0B",X"CD",X"39",X"0B",X"21",X"1C",X"A6",X"11", + X"FE",X"AB",X"CD",X"FC",X"1A",X"3A",X"AE",X"A9",X"CB",X"5F",X"C2",X"15",X"32",X"3A",X"86",X"A9", + X"3D",X"C8",X"11",X"19",X"01",X"FF",X"C3",X"1A",X"0F",X"3A",X"04",X"AD",X"87",X"47",X"87",X"87", + X"80",X"21",X"7C",X"08",X"DF",X"46",X"23",X"4E",X"23",X"3A",X"02",X"AD",X"5F",X"E6",X"07",X"CF", + X"08",X"7B",X"21",X"9F",X"A7",X"11",X"E0",X"FF",X"0F",X"0F",X"E6",X"1F",X"28",X"0A",X"70",X"19", + X"3D",X"28",X"05",X"71",X"19",X"3D",X"20",X"F6",X"08",X"77",X"19",X"36",X"F1",X"C9",X"CD",X"39", + X"0B",X"CD",X"06",X"0B",X"11",X"00",X"01",X"06",X"02",X"FF",X"1C",X"10",X"FC",X"1C",X"06",X"05", + X"FF",X"1C",X"10",X"FC",X"1E",X"14",X"FF",X"1C",X"FF",X"21",X"6A",X"17",X"06",X"18",X"AF",X"AE", + X"2C",X"10",X"FC",X"D6",X"C9",X"C2",X"FA",X"08",X"C3",X"1A",X"0F",X"BC",X"A6",X"10",X"30",X"F1", + X"7C",X"68",X"3B",X"A5",X"38",X"FD",X"F1",X"96",X"5D",X"17",X"9B",X"B9",X"4C",X"4F",X"F1",X"41", + X"72",X"A6",X"F1",X"8D",X"E2",X"FB",X"37",X"A7",X"F1",X"AB",X"31",X"07",X"F1",X"5A",X"75",X"85", + X"D9",X"1B",X"F1",X"C1",X"E1",X"FA",X"F1",X"B3",X"A0",X"47",X"7B",X"78",X"F1",X"04",X"05",X"C2", + X"F1",X"DE",X"F9",X"BB",X"93",X"AC",X"F1",X"36",X"06",X"4B",X"F1",X"EE",X"D3",X"D4",X"21",X"5E", + X"33",X"06",X"1E",X"C9",X"CD",X"01",X"02",X"C0",X"06",X"00",X"21",X"80",X"48",X"97",X"AE",X"23", + X"10",X"FC",X"C6",X"D0",X"C2",X"D9",X"00",X"11",X"13",X"01",X"FF",X"1E",X"00",X"FF",X"1E",X"14", + X"FF",X"1C",X"FF",X"1E",X"0C",X"FF",X"CD",X"DC",X"4B",X"21",X"95",X"A9",X"AF",X"06",X"05",X"77", + X"23",X"10",X"FC",X"36",X"03",X"ED",X"5B",X"93",X"A9",X"3A",X"99",X"A9",X"21",X"C7",X"12",X"CF", + X"12",X"CB",X"92",X"1A",X"32",X"90",X"A9",X"C3",X"1A",X"0F",X"4B",X"01",X"4A",X"01",X"49",X"01", + X"48",X"01",X"47",X"01",X"46",X"01",X"45",X"01",X"40",X"01",X"3E",X"01",X"3C",X"01",X"3A",X"01", + X"38",X"01",X"32",X"01",X"2F",X"01",X"2D",X"01",X"27",X"01",X"24",X"01",X"21",X"01",X"1E",X"01", + X"18",X"01",X"15",X"01",X"12",X"01",X"0C",X"01",X"09",X"01",X"06",X"01",X"00",X"01",X"FD",X"00", + X"FA",X"00",X"F7",X"00",X"F1",X"00",X"EE",X"00",X"EB",X"00",X"E5",X"00",X"E2",X"00",X"DE",X"00", + X"D8",X"00",X"D5",X"00",X"D1",X"00",X"CA",X"00",X"C6",X"00",X"C3",X"00",X"BC",X"00",X"B6",X"00", + X"AE",X"00",X"A9",X"00",X"9F",X"00",X"9C",X"00",X"93",X"00",X"8A",X"00",X"84",X"00",X"7B",X"00", + X"71",X"00",X"6B",X"00",X"61",X"00",X"57",X"00",X"50",X"00",X"45",X"00",X"3B",X"00",X"34",X"00", + X"29",X"00",X"1E",X"00",X"13",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"F8",X"FF",X"ED",X"FF", + X"00",X"00",X"D7",X"FF",X"CC",X"FF",X"C5",X"FF",X"BB",X"FF",X"B0",X"FF",X"A9",X"FF",X"9F",X"FF", + X"95",X"FF",X"8F",X"FF",X"85",X"FF",X"7C",X"FF",X"76",X"FF",X"6D",X"FF",X"64",X"FF",X"61",X"FF", + X"64",X"FF",X"52",X"FF",X"4A",X"FF",X"44",X"FF",X"3D",X"FF",X"3A",X"FF",X"36",X"FF",X"2F",X"FF", + X"2B",X"FF",X"28",X"FF",X"22",X"FF",X"1E",X"FF",X"1B",X"FF",X"15",X"FF",X"12",X"FF",X"0F",X"FF", + X"0F",X"FF",X"06",X"FF",X"03",X"FF",X"00",X"FF",X"FA",X"FE",X"F7",X"FE",X"F4",X"FE",X"EE",X"FE", + X"EB",X"FE",X"E8",X"FE",X"E2",X"FE",X"DF",X"FE",X"DC",X"FE",X"D9",X"FE",X"D3",X"FE",X"D1",X"FE", + X"CE",X"FE",X"C8",X"FE",X"C6",X"FE",X"C4",X"FE",X"C2",X"FE",X"C0",X"FE",X"BB",X"FE",X"BA",X"FE", + X"B9",X"FE",X"B8",X"FE",X"B7",X"FE",X"B6",X"FE",X"B5",X"FE",X"B5",X"FE",X"B6",X"FE",X"B7",X"FE", + X"B8",X"FE",X"B9",X"FE",X"BA",X"FE",X"BB",X"FE",X"C0",X"FE",X"C2",X"FE",X"C4",X"FE",X"C6",X"FE", + X"C8",X"FE",X"CE",X"FE",X"D1",X"FE",X"D3",X"FE",X"D9",X"FE",X"DC",X"FE",X"DF",X"FE",X"E2",X"FE", + X"E8",X"FE",X"EB",X"FE",X"EE",X"FE",X"F4",X"FE",X"F7",X"FE",X"FA",X"FE",X"00",X"FF",X"03",X"FF", + X"06",X"FF",X"09",X"FF",X"0F",X"FF",X"12",X"FF",X"15",X"FF",X"1B",X"FF",X"1E",X"FF",X"22",X"FF", + X"28",X"FF",X"2B",X"FF",X"2F",X"FF",X"36",X"FF",X"3A",X"FF",X"3D",X"FF",X"44",X"FF",X"4A",X"FF", + X"52",X"FF",X"57",X"FF",X"61",X"FF",X"64",X"FF",X"6D",X"FF",X"76",X"FF",X"7C",X"FF",X"85",X"FF", + X"8F",X"FF",X"95",X"FF",X"9F",X"FF",X"A9",X"FF",X"B0",X"FF",X"BB",X"FF",X"C5",X"FF",X"CC",X"FF", + X"D7",X"FF",X"E2",X"FF",X"ED",X"FF",X"F8",X"FF",X"00",X"00",X"00",X"00",X"08",X"00",X"13",X"00", + X"1E",X"00",X"29",X"00",X"34",X"00",X"3B",X"00",X"45",X"00",X"50",X"00",X"57",X"00",X"61",X"00", + X"6B",X"00",X"71",X"00",X"7B",X"00",X"84",X"00",X"8A",X"00",X"93",X"00",X"9C",X"00",X"9F",X"00", + X"9F",X"00",X"AE",X"00",X"B6",X"00",X"BC",X"00",X"C3",X"00",X"C6",X"00",X"CA",X"00",X"D1",X"00", + X"D5",X"00",X"D8",X"00",X"DE",X"00",X"E2",X"00",X"E5",X"00",X"EB",X"00",X"EE",X"00",X"F1",X"00", + X"EE",X"00",X"FA",X"00",X"FD",X"00",X"00",X"01",X"06",X"01",X"09",X"01",X"0C",X"01",X"12",X"01", + X"15",X"01",X"18",X"01",X"1E",X"01",X"21",X"01",X"24",X"01",X"27",X"01",X"2D",X"01",X"2F",X"01", + X"27",X"01",X"38",X"01",X"3A",X"01",X"3C",X"01",X"3E",X"01",X"40",X"01",X"45",X"01",X"46",X"01", + X"47",X"01",X"48",X"01",X"49",X"01",X"4A",X"01",X"4B",X"01",X"77",X"A6",X"13",X"ED",X"DC",X"A5", + X"7D",X"34",X"F1",X"F1",X"F1",X"B9",X"FD",X"21",X"10",X"AA",X"06",X"04",X"0E",X"04",X"16",X"A0", + X"1E",X"D8",X"FD",X"72",X"31",X"FD",X"73",X"00",X"FD",X"71",X"01",X"FD",X"36",X"30",X"6C",X"FD", + X"23",X"FD",X"23",X"0C",X"7A",X"D6",X"10",X"57",X"10",X"E8",X"C9",X"21",X"41",X"AA",X"11",X"02", + X"00",X"06",X"04",X"AF",X"77",X"19",X"10",X"FC",X"C9",X"3A",X"80",X"A9",X"CB",X"47",X"28",X"06", + X"11",X"00",X"01",X"C3",X"38",X"00",X"11",X"1F",X"01",X"C3",X"38",X"00",X"AF",X"86",X"23",X"10", + X"FC",X"B9",X"C8",X"C9",X"AF",X"AE",X"23",X"10",X"FC",X"B9",X"C8",X"C3",X"00",X"00",X"AF",X"86", + X"23",X"0D",X"28",X"02",X"18",X"F9",X"CB",X"47",X"C8",X"C3",X"00",X"00",X"21",X"06",X"0B",X"06", + X"24",X"0E",X"00",X"7E",X"91",X"23",X"10",X"FB",X"EB",X"BE",X"C9",X"0F",X"A7",X"13",X"88",X"0D", + X"ED",X"C4",X"F1",X"ED",X"DC",X"A5",X"D7",X"DC",X"F1",X"8C",X"0D",X"DC",X"DC",X"68",X"3B",X"B9", + X"C3",X"93",X"0B",X"26",X"AC",X"3A",X"B3",X"A9",X"6F",X"7E",X"07",X"DA",X"90",X"0B",X"4E",X"36", + X"FF",X"23",X"46",X"36",X"FF",X"23",X"7D",X"E6",X"3F",X"32",X"B3",X"A9",X"79",X"E6",X"0F",X"21", + X"BC",X"0B",X"CD",X"8C",X"01",X"78",X"21",X"90",X"0B",X"E5",X"EB",X"E9",X"DD",X"0B",X"F2",X"0B", + X"0F",X"0C",X"39",X"0C",X"90",X"0C",X"72",X"4D",X"D7",X"0D",X"AC",X"0E",X"DC",X"0B",X"DC",X"0B", + X"21",X"34",X"23",X"0C",X"DC",X"0B",X"DC",X"0B",X"DC",X"0B",X"DC",X"0B",X"C9",X"21",X"50",X"0C", + X"CD",X"8C",X"01",X"EB",X"5E",X"23",X"56",X"23",X"23",X"7E",X"FE",X"B9",X"C8",X"12",X"23",X"E7", + X"18",X"F7",X"21",X"50",X"0C",X"CD",X"8C",X"01",X"EB",X"5E",X"23",X"56",X"23",X"4E",X"23",X"7E", + X"FE",X"B9",X"C8",X"12",X"CB",X"92",X"79",X"12",X"CB",X"D2",X"23",X"E7",X"C3",X"FF",X"0B",X"21", + X"50",X"0C",X"CD",X"8C",X"01",X"EB",X"5E",X"23",X"56",X"23",X"23",X"3A",X"0C",X"AD",X"E6",X"0F", + X"4F",X"18",X"DC",X"21",X"50",X"0C",X"CD",X"8C",X"01",X"EB",X"5E",X"23",X"56",X"23",X"23",X"3A", + X"0C",X"AD",X"C6",X"0A",X"E6",X"0F",X"4F",X"18",X"C6",X"21",X"50",X"0C",X"CD",X"8C",X"01",X"EB", + X"5E",X"23",X"56",X"23",X"23",X"7E",X"FE",X"B9",X"C8",X"3E",X"F1",X"12",X"23",X"E7",X"18",X"F5", + X"6B",X"08",X"73",X"16",X"7F",X"30",X"1D",X"58",X"FA",X"49",X"D6",X"15",X"4C",X"58",X"09",X"25", + X"CA",X"15",X"67",X"01",X"42",X"4E",X"10",X"18",X"CE",X"48",X"A4",X"1B",X"FA",X"0A",X"31",X"24", + X"3B",X"12",X"9B",X"45",X"A4",X"2C",X"4F",X"00",X"9E",X"31",X"6E",X"29",X"7B",X"0B",X"5C",X"34", + X"D2",X"3E",X"48",X"33",X"49",X"0F",X"14",X"4C",X"54",X"59",X"ED",X"55",X"D8",X"23",X"00",X"49", + X"4F",X"06",X"00",X"3A",X"30",X"AD",X"A7",X"CA",X"E8",X"0C",X"79",X"A7",X"CA",X"E9",X"0C",X"21", + X"27",X"0D",X"09",X"09",X"09",X"11",X"33",X"AD",X"3A",X"32",X"AD",X"A7",X"28",X"03",X"11",X"36", + X"AD",X"1A",X"86",X"27",X"12",X"13",X"23",X"1A",X"8E",X"27",X"12",X"13",X"23",X"1A",X"8E",X"27", + X"12",X"21",X"8D",X"A9",X"01",X"03",X"00",X"1A",X"BE",X"38",X"0F",X"20",X"07",X"1B",X"2B",X"0D", + X"20",X"F5",X"18",X"06",X"EB",X"ED",X"B8",X"CD",X"6B",X"0D",X"3A",X"32",X"AD",X"A7",X"20",X"05", + X"CD",X"57",X"0D",X"18",X"03",X"CD",X"61",X"0D",X"C9",X"3A",X"31",X"AD",X"A7",X"20",X"1B",X"3A", + X"31",X"0B",X"CD",X"F2",X"0B",X"CD",X"57",X"0D",X"3A",X"C6",X"15",X"CD",X"39",X"0C",X"11",X"01", + X"A5",X"06",X"06",X"3E",X"F1",X"12",X"E7",X"10",X"FA",X"C9",X"3E",X"06",X"CD",X"F2",X"0B",X"CD", + X"57",X"0D",X"3E",X"07",X"CD",X"F2",X"0B",X"CD",X"61",X"0D",X"C9",X"3C",X"A2",X"C7",X"AC",X"7C", + X"A2",X"43",X"AB",X"FC",X"A1",X"BE",X"AC",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"02",X"00", + X"00",X"03",X"00",X"00",X"04",X"00",X"00",X"05",X"00",X"00",X"06",X"00",X"00",X"07",X"00",X"00", + X"08",X"00",X"00",X"09",X"00",X"00",X"10",X"00",X"00",X"15",X"00",X"00",X"20",X"00",X"00",X"30", + X"00",X"00",X"40",X"00",X"00",X"50",X"00",X"11",X"81",X"A7",X"21",X"35",X"AD",X"0E",X"10",X"18", + X"12",X"11",X"01",X"A5",X"21",X"38",X"AD",X"0E",X"10",X"18",X"08",X"11",X"41",X"A6",X"21",X"8D", + X"A9",X"0E",X"10",X"06",X"00",X"CD",X"A0",X"0D",X"2B",X"CD",X"A0",X"0D",X"2B",X"CD",X"81",X"0D", + X"C9",X"7E",X"0F",X"0F",X"0F",X"0F",X"CD",X"90",X"0D",X"E7",X"7E",X"CD",X"90",X"0D",X"E7",X"C9", + X"E6",X"0F",X"E5",X"21",X"CC",X"0D",X"CF",X"E1",X"12",X"CB",X"92",X"79",X"12",X"CB",X"D2",X"C9", + X"7E",X"0F",X"0F",X"0F",X"0F",X"CD",X"AF",X"0D",X"E7",X"7E",X"CD",X"AF",X"0D",X"E7",X"C9",X"E6", + X"0F",X"28",X"03",X"04",X"18",X"08",X"3A",X"46",X"32",X"04",X"05",X"28",X"01",X"AF",X"E5",X"21", + X"CC",X"0D",X"CF",X"E1",X"12",X"CB",X"92",X"79",X"12",X"CB",X"D2",X"C9",X"13",X"96",X"9B",X"CD", + X"F3",X"7F",X"65",X"02",X"17",X"5D",X"F1",X"11",X"63",X"A4",X"FE",X"64",X"38",X"02",X"3E",X"63", + X"D9",X"06",X"00",X"D6",X"1E",X"38",X"03",X"04",X"18",X"F9",X"C6",X"1E",X"0E",X"00",X"D6",X"0A", + X"38",X"03",X"0C",X"18",X"F9",X"C6",X"0A",X"16",X"00",X"D6",X"05",X"38",X"03",X"14",X"18",X"F9", + X"C6",X"05",X"5F",X"D9",X"D9",X"7B",X"D9",X"A7",X"28",X"0C",X"06",X"01",X"0E",X"13",X"08",X"CD", + X"8D",X"0E",X"08",X"3D",X"20",X"F8",X"D9",X"7A",X"D9",X"A7",X"28",X"0C",X"06",X"32",X"0E",X"11", + X"08",X"CD",X"9C",X"0E",X"08",X"3D",X"20",X"F8",X"D9",X"79",X"D9",X"A7",X"28",X"0C",X"06",X"CE", + X"0E",X"16",X"08",X"CD",X"70",X"0E",X"08",X"3D",X"20",X"F8",X"D9",X"78",X"D9",X"A7",X"28",X"0C", + X"06",X"23",X"0E",X"11",X"08",X"CD",X"70",X"0E",X"08",X"3D",X"20",X"F8",X"01",X"10",X"F1",X"21", + X"DD",X"59",X"19",X"38",X"05",X"CD",X"8D",X"0E",X"18",X"F5",X"AF",X"2A",X"A0",X"00",X"ED",X"5B", + X"A3",X"00",X"ED",X"4B",X"9D",X"00",X"19",X"09",X"85",X"84",X"D6",X"69",X"C2",X"00",X"00",X"C9", + X"78",X"3C",X"12",X"3D",X"1B",X"12",X"EF",X"78",X"C6",X"02",X"12",X"3C",X"13",X"12",X"21",X"00", + X"FC",X"19",X"EF",X"71",X"2B",X"71",X"EB",X"E7",X"EB",X"71",X"23",X"71",X"C9",X"EB",X"70",X"2B", + X"36",X"F1",X"CB",X"94",X"71",X"23",X"71",X"CB",X"D4",X"EB",X"EF",X"C9",X"EB",X"04",X"70",X"05", + X"2B",X"70",X"CB",X"94",X"71",X"23",X"71",X"CB",X"D4",X"EB",X"EF",X"C9",X"3A",X"01",X"AD",X"FE", + X"64",X"D0",X"3E",X"0E",X"CD",X"0F",X"0C",X"EF",X"EF",X"21",X"01",X"AD",X"06",X"01",X"3A",X"0C", + X"AD",X"4F",X"C5",X"0E",X"00",X"7E",X"D6",X"0A",X"38",X"03",X"0C",X"18",X"F9",X"C6",X"0A",X"08", + X"79",X"C1",X"CD",X"EB",X"0E",X"E7",X"08",X"CD",X"EB",X"0E",X"E7",X"11",X"48",X"17",X"01",X"8C", + X"10",X"1A",X"81",X"4F",X"13",X"10",X"FA",X"C2",X"09",X"25",X"C9",X"E6",X"0F",X"28",X"10",X"06", + X"00",X"E5",X"21",X"06",X"0F",X"CF",X"E1",X"12",X"CB",X"92",X"79",X"12",X"CB",X"D2",X"C9",X"78", + X"A7",X"28",X"EE",X"05",X"EF",X"C9",X"E3",X"49",X"A8",X"64",X"27",X"AE",X"42",X"B0",X"D5",X"86", + X"F1",X"21",X"AB",X"A9",X"34",X"AF",X"32",X"AC",X"A9",X"C9",X"21",X"AC",X"A9",X"34",X"C9",X"21", + X"54",X"0F",X"E5",X"3A",X"AC",X"A9",X"E6",X"0F",X"F7",X"B1",X"27",X"5E",X"33",X"D7",X"5B",X"75", + X"4C",X"74",X"07",X"AF",X"16",X"94",X"56",X"99",X"11",X"0B",X"33",X"B4",X"08",X"C3",X"18",X"E2", + X"12",X"FB",X"12",X"0F",X"4A",X"23",X"13",X"B5",X"15",X"73",X"A6",X"14",X"7E",X"29",X"F8",X"96", + X"5D",X"96",X"13",X"B9",X"3A",X"30",X"AD",X"A7",X"C0",X"3A",X"86",X"A9",X"A7",X"20",X"11",X"3A", + X"C0",X"A9",X"A7",X"C8",X"3A",X"AE",X"A9",X"E6",X"18",X"C8",X"CD",X"B6",X"15",X"C3",X"90",X"16", + X"AF",X"32",X"AC",X"A9",X"3A",X"36",X"17",X"32",X"AB",X"A9",X"C9",X"87",X"87",X"21",X"6A",X"18", + X"11",X"D3",X"A9",X"DF",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"C9",X"F1",X"01",X"F1", + X"02",X"F1",X"03",X"F1",X"04",X"F1",X"05",X"3A",X"11",X"B4",X"CB",X"7F",X"28",X"19",X"4F",X"3A", + X"00",X"C0",X"81",X"30",X"12",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"11",X"B4",X"3A", + X"10",X"B0",X"C6",X"80",X"32",X"10",X"B0",X"3A",X"13",X"B4",X"CB",X"7F",X"28",X"19",X"4F",X"3A", + X"00",X"C0",X"81",X"30",X"12",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"13",X"B4",X"3A", + X"12",X"B0",X"C6",X"80",X"32",X"12",X"B0",X"3A",X"15",X"B4",X"CB",X"7F",X"28",X"19",X"4F",X"3A", + X"00",X"C0",X"81",X"30",X"12",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"15",X"B4",X"3A", + X"14",X"B0",X"C6",X"80",X"32",X"14",X"B0",X"3A",X"37",X"B4",X"CB",X"7F",X"28",X"19",X"4F",X"3A", + X"00",X"C0",X"81",X"30",X"12",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"37",X"B4",X"3A", + X"36",X"B0",X"C6",X"80",X"32",X"36",X"B0",X"3A",X"39",X"B4",X"CB",X"7F",X"28",X"19",X"4F",X"3A", + X"00",X"C0",X"81",X"30",X"12",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"39",X"B4",X"3A", + X"38",X"B0",X"C6",X"80",X"32",X"38",X"B0",X"3A",X"3B",X"B4",X"CB",X"7F",X"28",X"19",X"4F",X"3A", + X"00",X"C0",X"81",X"30",X"12",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"3B",X"B4",X"3A", + X"3A",X"B0",X"C6",X"80",X"32",X"3A",X"B0",X"3A",X"3D",X"B4",X"CB",X"7F",X"28",X"19",X"4F",X"3A", + X"00",X"C0",X"81",X"30",X"12",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"3D",X"B4",X"3A", + X"3C",X"B0",X"C6",X"80",X"32",X"3C",X"B0",X"3A",X"3F",X"B4",X"CB",X"7F",X"28",X"19",X"4F",X"3A", + X"00",X"C0",X"81",X"30",X"12",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"3F",X"B4",X"3A", + X"3E",X"B0",X"C6",X"80",X"32",X"3E",X"B0",X"C9",X"3A",X"11",X"B4",X"CB",X"7F",X"28",X"19",X"4F", + X"3A",X"00",X"C0",X"81",X"30",X"F2",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"11",X"B4", + X"3A",X"10",X"B0",X"C6",X"80",X"32",X"10",X"B0",X"3A",X"13",X"B4",X"CB",X"7F",X"28",X"19",X"4F", + X"3A",X"00",X"C0",X"81",X"30",X"F2",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"13",X"B4", + X"3A",X"12",X"B0",X"C6",X"80",X"32",X"12",X"B0",X"3A",X"15",X"B4",X"CB",X"7F",X"28",X"19",X"4F", + X"3A",X"00",X"C0",X"81",X"30",X"F2",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"15",X"B4", + X"3A",X"14",X"B0",X"C6",X"80",X"32",X"14",X"B0",X"3A",X"37",X"B4",X"CB",X"7F",X"28",X"19",X"4F", + X"3A",X"00",X"C0",X"81",X"30",X"F2",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"37",X"B4", + X"3A",X"36",X"B0",X"C6",X"80",X"32",X"36",X"B0",X"3A",X"39",X"B4",X"CB",X"7F",X"28",X"19",X"4F", + X"3A",X"00",X"C0",X"81",X"30",X"F2",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"39",X"B4", + X"3A",X"38",X"B0",X"C6",X"80",X"32",X"38",X"B0",X"3A",X"3B",X"B4",X"CB",X"7F",X"28",X"19",X"4F", + X"3A",X"00",X"C0",X"81",X"30",X"F2",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"3B",X"B4", + X"3A",X"3A",X"B0",X"C6",X"80",X"32",X"3A",X"B0",X"3A",X"3D",X"B4",X"CB",X"7F",X"28",X"19",X"4F", + X"3A",X"00",X"C0",X"81",X"30",X"F2",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"3D",X"B4", + X"3A",X"3C",X"B0",X"C6",X"80",X"32",X"3C",X"B0",X"3A",X"3F",X"B4",X"CB",X"7F",X"28",X"19",X"4F", + X"3A",X"00",X"C0",X"81",X"30",X"F2",X"23",X"23",X"2B",X"2B",X"79",X"E6",X"7F",X"32",X"3F",X"B4", + X"3A",X"3E",X"B0",X"C6",X"80",X"32",X"3E",X"B0",X"C9",X"CD",X"B4",X"31",X"CD",X"DF",X"1E",X"CD", + X"E3",X"23",X"CD",X"AF",X"36",X"CD",X"97",X"0F",X"CD",X"B3",X"47",X"CD",X"B7",X"43",X"CD",X"A1", + X"28",X"CD",X"97",X"0F",X"CD",X"BC",X"2C",X"CD",X"D6",X"40",X"CD",X"97",X"0F",X"CD",X"5F",X"3B", + X"CD",X"DA",X"3D",X"CD",X"36",X"3E",X"CD",X"97",X"0F",X"CD",X"EA",X"3F",X"CD",X"4F",X"4E",X"CD", + X"B8",X"40",X"CD",X"97",X"0F",X"CD",X"DE",X"4D",X"CD",X"05",X"52",X"CD",X"3A",X"4D",X"CD",X"09", + X"08",X"CD",X"98",X"10",X"3A",X"00",X"A8",X"3C",X"CA",X"71",X"12",X"3D",X"C0",X"CD",X"B6",X"15", + X"3A",X"C6",X"AC",X"A7",X"C4",X"B8",X"2D",X"CD",X"34",X"56",X"21",X"00",X"AD",X"35",X"F5",X"3A", + X"32",X"AD",X"A7",X"11",X"10",X"AD",X"28",X"03",X"11",X"20",X"AD",X"21",X"00",X"AD",X"01",X"10", + X"00",X"ED",X"B0",X"F1",X"28",X"3D",X"3A",X"32",X"AD",X"A7",X"21",X"20",X"AD",X"28",X"03",X"21", + X"10",X"AD",X"7E",X"A7",X"28",X"09",X"3A",X"32",X"AD",X"3C",X"E6",X"01",X"32",X"32",X"AD",X"3E", + X"5A",X"32",X"EB",X"A9",X"3A",X"52",X"4B",X"32",X"AC",X"A9",X"C9",X"18",X"A7",X"13",X"A5",X"3B", + X"87",X"F1",X"34",X"0E",X"34",X"D7",X"BF",X"F1",X"7F",X"13",X"13",X"13",X"13",X"F1",X"88",X"DC", + X"ED",X"11",X"B9",X"3A",X"30",X"AD",X"A7",X"CA",X"FB",X"12",X"11",X"09",X"02",X"3A",X"32",X"AD", + X"A7",X"28",X"01",X"1C",X"FF",X"11",X"0B",X"0A",X"FF",X"3E",X"B4",X"32",X"EB",X"A9",X"C3",X"1A", + X"0F",X"3A",X"02",X"AD",X"A7",X"C0",X"3A",X"C6",X"AC",X"A7",X"C8",X"21",X"10",X"A8",X"11",X"10", + X"00",X"06",X"0F",X"7E",X"A7",X"C0",X"19",X"10",X"FA",X"CD",X"34",X"56",X"3A",X"30",X"AD",X"A7", + X"28",X"29",X"21",X"43",X"AA",X"06",X"17",X"AF",X"77",X"2C",X"2C",X"10",X"FB",X"CD",X"B8",X"2D", + X"3A",X"32",X"AD",X"A7",X"11",X"10",X"AD",X"28",X"03",X"11",X"20",X"AD",X"21",X"00",X"AD",X"01", + X"10",X"00",X"ED",X"B0",X"3A",X"35",X"4A",X"32",X"AC",X"A9",X"C9",X"3A",X"D1",X"07",X"32",X"C6", + X"AC",X"CD",X"B6",X"15",X"C3",X"FB",X"12",X"74",X"B1",X"CC",X"EC",X"5C",X"16",X"39",X"50",X"67", + X"21",X"7A",X"C5",X"F7",X"BE",X"54",X"80",X"2F",X"5F",X"9F",X"6D",X"44",X"B8",X"E7",X"BD",X"89", + X"59",X"1A",X"21",X"EB",X"A9",X"35",X"C0",X"3A",X"32",X"AD",X"A7",X"21",X"20",X"AD",X"28",X"03", + X"21",X"10",X"AD",X"7E",X"A7",X"C2",X"26",X"12",X"C3",X"1A",X"0F",X"AF",X"32",X"30",X"AD",X"32", + X"AC",X"A9",X"32",X"32",X"AD",X"3A",X"D3",X"16",X"32",X"AB",X"A9",X"3A",X"01",X"49",X"2A",X"02", + X"49",X"DF",X"AC",X"D6",X"9B",X"32",X"AC",X"A9",X"C9",X"11",X"E0",X"FF",X"06",X"0D",X"77",X"19", + X"10",X"FC",X"C9",X"3A",X"80",X"A9",X"E6",X"02",X"C0",X"3A",X"F0",X"A9",X"A7",X"20",X"04",X"CD", + X"67",X"13",X"C9",X"3D",X"20",X"07",X"CD",X"67",X"13",X"CD",X"2A",X"14",X"C9",X"3D",X"20",X"07", + X"CD",X"93",X"13",X"CD",X"C5",X"14",X"C9",X"3D",X"20",X"04",X"CD",X"C5",X"14",X"C9",X"3D",X"20", + X"04",X"CD",X"CC",X"13",X"C9",X"3E",X"5A",X"32",X"EB",X"A9",X"CD",X"B6",X"15",X"CD",X"75",X"4C", + X"3A",X"50",X"27",X"32",X"AC",X"A9",X"C9",X"3A",X"F1",X"A9",X"FE",X"08",X"20",X"08",X"3E",X"01", + X"32",X"F0",X"A9",X"CD",X"11",X"58",X"3A",X"F1",X"A9",X"E6",X"01",X"3E",X"3E",X"28",X"02",X"3E", + X"00",X"47",X"3A",X"40",X"AA",X"E6",X"C0",X"80",X"32",X"40",X"AA",X"3A",X"F1",X"A9",X"3C",X"32", + X"F1",X"A9",X"C9",X"3A",X"F3",X"A9",X"A7",X"20",X"09",X"3E",X"03",X"32",X"F0",X"A9",X"3E",X"3F", + X"18",X"18",X"E6",X"04",X"20",X"04",X"3E",X"3F",X"18",X"10",X"3D",X"20",X"04",X"3E",X"36",X"18", + X"09",X"3D",X"20",X"04",X"3E",X"3E",X"18",X"02",X"3E",X"37",X"47",X"3A",X"40",X"AA",X"E6",X"C0", + X"80",X"32",X"40",X"AA",X"3A",X"F3",X"A9",X"3D",X"32",X"F3",X"A9",X"C9",X"3E",X"05",X"32",X"F0", + X"A9",X"3A",X"32",X"AD",X"A7",X"3A",X"1C",X"AD",X"47",X"28",X"04",X"3A",X"2C",X"AD",X"47",X"3A", + X"87",X"A9",X"A7",X"78",X"28",X"22",X"21",X"44",X"A0",X"11",X"45",X"A0",X"D9",X"06",X"1C",X"D9", + X"01",X"1A",X"00",X"77",X"ED",X"B0",X"11",X"06",X"00",X"19",X"54",X"5D",X"13",X"D9",X"10",X"EF", + X"3A",X"F6",X"A9",X"3D",X"32",X"F6",X"A9",X"C9",X"21",X"BE",X"A3",X"11",X"BD",X"A3",X"D9",X"06", + X"1C",X"D9",X"01",X"1A",X"00",X"77",X"ED",X"B8",X"11",X"FA",X"FF",X"19",X"54",X"5D",X"1B",X"D9", + X"10",X"EF",X"3A",X"F6",X"A9",X"3D",X"32",X"F6",X"A9",X"C9",X"3A",X"F2",X"A9",X"CB",X"47",X"28", + X"6C",X"2A",X"F7",X"A9",X"7E",X"FE",X"FF",X"20",X"12",X"3E",X"00",X"32",X"F2",X"A9",X"3E",X"02", + X"32",X"F0",X"A9",X"2A",X"F7",X"A9",X"2B",X"22",X"F7",X"A9",X"C9",X"CD",X"63",X"15",X"2A",X"F7", + X"A9",X"7E",X"E6",X"01",X"23",X"22",X"F7",X"A9",X"28",X"0F",X"11",X"20",X"00",X"21",X"F0",X"A5", + X"34",X"19",X"34",X"21",X"F2",X"A5",X"34",X"19",X"34",X"2A",X"F7",X"A9",X"7E",X"E6",X"01",X"23", + X"22",X"F7",X"A9",X"28",X"09",X"11",X"20",X"00",X"21",X"F1",X"A5",X"34",X"19",X"34",X"0E",X"02", + X"11",X"D1",X"A5",X"CD",X"9D",X"4A",X"2A",X"F7",X"A9",X"11",X"F3",X"FF",X"19",X"22",X"F7",X"A9", + X"0E",X"00",X"11",X"31",X"A6",X"CD",X"9D",X"4A",X"CD",X"8C",X"15",X"18",X"20",X"3E",X"F1",X"21", + X"B1",X"A7",X"CD",X"19",X"13",X"21",X"D1",X"A5",X"CD",X"19",X"13",X"21",X"10",X"A6",X"77",X"19", + X"77",X"21",X"11",X"A6",X"77",X"19",X"77",X"21",X"12",X"A6",X"77",X"19",X"77",X"3A",X"F2",X"A9", + X"3D",X"32",X"F2",X"A9",X"C9",X"3A",X"F4",X"A9",X"CB",X"47",X"28",X"6F",X"2A",X"F7",X"A9",X"7E", + X"E6",X"FE",X"28",X"15",X"3E",X"00",X"32",X"F4",X"A9",X"3E",X"04",X"32",X"F0",X"A9",X"CD",X"E4", + X"56",X"2A",X"F7",X"A9",X"23",X"22",X"F7",X"A9",X"C9",X"CD",X"63",X"15",X"0E",X"01",X"11",X"51", + X"A4",X"CD",X"9D",X"4A",X"2A",X"F7",X"A9",X"11",X"0D",X"00",X"19",X"22",X"F7",X"A9",X"0E",X"03", + X"11",X"B1",X"A7",X"CD",X"9D",X"4A",X"2A",X"F7",X"A9",X"7E",X"E6",X"01",X"2B",X"22",X"F7",X"A9", + X"28",X"09",X"11",X"20",X"00",X"21",X"F1",X"A5",X"35",X"19",X"35",X"2A",X"F7",X"A9",X"7E",X"E6", + X"01",X"2B",X"22",X"F7",X"A9",X"28",X"0F",X"11",X"20",X"00",X"21",X"F0",X"A5",X"35",X"19",X"35", + X"21",X"F2",X"A5",X"35",X"19",X"35",X"CD",X"8C",X"15",X"18",X"20",X"3E",X"F1",X"21",X"B1",X"A7", + X"CD",X"19",X"13",X"21",X"D1",X"A5",X"CD",X"19",X"13",X"21",X"10",X"A6",X"77",X"19",X"77",X"21", + X"11",X"A6",X"77",X"19",X"77",X"21",X"12",X"A6",X"77",X"19",X"77",X"3A",X"F4",X"A9",X"3D",X"32", + X"F4",X"A9",X"C9",X"11",X"00",X"A4",X"21",X"51",X"A4",X"01",X"20",X"00",X"D9",X"06",X"1C",X"D9", + X"1A",X"77",X"13",X"09",X"D9",X"10",X"F8",X"D9",X"21",X"F0",X"A5",X"1A",X"77",X"09",X"13",X"1A", + X"77",X"13",X"21",X"F2",X"A5",X"1A",X"77",X"09",X"13",X"1A",X"77",X"C9",X"11",X"00",X"A4",X"21", + X"51",X"A4",X"01",X"20",X"00",X"D9",X"06",X"1C",X"D9",X"7E",X"12",X"13",X"09",X"D9",X"10",X"F8", + X"D9",X"21",X"F0",X"A5",X"7E",X"12",X"09",X"13",X"7E",X"12",X"13",X"21",X"F2",X"A5",X"7E",X"12", + X"09",X"13",X"7E",X"12",X"C9",X"C9",X"21",X"41",X"AA",X"06",X"18",X"AF",X"77",X"2C",X"2C",X"10", + X"FB",X"C9",X"3A",X"AC",X"A9",X"E6",X"07",X"F7",X"E2",X"15",X"5F",X"A5",X"13",X"77",X"D7",X"34", + X"87",X"FD",X"DC",X"B9",X"FE",X"15",X"60",X"A6",X"14",X"C4",X"FD",X"10",X"ED",X"77",X"68",X"D7", + X"34",X"B9",X"CD",X"9A",X"01",X"3A",X"49",X"17",X"32",X"AC",X"A9",X"0E",X"00",X"21",X"48",X"56", + X"3A",X"AB",X"A9",X"96",X"23",X"0D",X"20",X"FB",X"EE",X"4E",X"32",X"AB",X"A9",X"C9",X"CD",X"C2", + X"01",X"C0",X"11",X"05",X"01",X"FF",X"1C",X"FF",X"1C",X"FF",X"11",X"01",X"06",X"FF",X"3E",X"13", + X"32",X"01",X"A7",X"32",X"E1",X"A6",X"21",X"3F",X"16",X"06",X"06",X"5E",X"23",X"56",X"23",X"7E", + X"12",X"13",X"EB",X"36",X"05",X"EB",X"23",X"10",X"F2",X"CD",X"6B",X"0D",X"3E",X"01",X"32",X"AB", + X"A9",X"3C",X"32",X"AC",X"A9",X"3A",X"C0",X"A9",X"A7",X"C8",X"11",X"0D",X"01",X"FF",X"C9",X"FB", + X"AD",X"FD",X"39",X"AD",X"68",X"43",X"AB",X"7C",X"FE",X"AB",X"A5",X"BE",X"AC",X"38",X"C7",X"AC", + X"3B",X"21",X"7B",X"16",X"E5",X"3A",X"AC",X"A9",X"F7",X"4B",X"07",X"34",X"17",X"3F",X"2D",X"3E", + X"08",X"48",X"17",X"6A",X"17",X"8C",X"17",X"B9",X"17",X"52",X"32",X"E2",X"17",X"19",X"4B",X"FB", + X"17",X"30",X"27",X"26",X"A6",X"13",X"88",X"57",X"A5",X"BF",X"B9",X"3A",X"86",X"A9",X"A7",X"C2", + X"11",X"0F",X"3A",X"C0",X"A9",X"A7",X"C8",X"3A",X"AE",X"A9",X"E6",X"18",X"C8",X"CD",X"B6",X"15", + X"3A",X"AE",X"A9",X"CB",X"67",X"20",X"05",X"CB",X"5F",X"20",X"7E",X"C9",X"3E",X"FF",X"32",X"30", + X"AD",X"32",X"31",X"AD",X"3A",X"C1",X"A9",X"32",X"10",X"AD",X"32",X"20",X"AD",X"18",X"7B",X"06", + X"00",X"21",X"9F",X"4D",X"3A",X"AB",X"A9",X"96",X"23",X"10",X"FC",X"EE",X"A2",X"32",X"AB",X"A9", + X"CD",X"97",X"0F",X"CD",X"DF",X"1E",X"CD",X"97",X"0F",X"CD",X"BC",X"2C",X"CD",X"98",X"10",X"3A", + X"80",X"A9",X"E6",X"01",X"28",X"1C",X"21",X"EB",X"A9",X"35",X"20",X"16",X"11",X"09",X"03",X"FF", + X"1E",X"0E",X"FF",X"1E",X"1A",X"FF",X"AF",X"32",X"0E",X"AD",X"3E",X"2A",X"32",X"EB",X"A9",X"C3", + X"1A",X"0F",X"3A",X"0E",X"AD",X"A7",X"C8",X"3A",X"80",X"A9",X"E6",X"0F",X"28",X"09",X"FE",X"05", + X"28",X"09",X"FE",X"0A",X"28",X"09",X"C9",X"16",X"02",X"18",X"06",X"16",X"0A",X"18",X"02",X"16", + X"0B",X"3A",X"04",X"AD",X"C6",X"1A",X"5F",X"FF",X"C9",X"AF",X"32",X"31",X"AD",X"32",X"20",X"AD", + X"3D",X"32",X"30",X"AD",X"3A",X"C1",X"A9",X"32",X"10",X"AD",X"3E",X"03",X"32",X"AB",X"A9",X"AF", + X"32",X"AC",X"A9",X"C9",X"CD",X"01",X"02",X"C0",X"21",X"48",X"17",X"06",X"22",X"AF",X"96",X"23", + X"10",X"FC",X"32",X"17",X"A8",X"C3",X"1A",X"0F",X"CD",X"06",X"0B",X"CD",X"39",X"0B",X"21",X"EB", + X"A9",X"35",X"C0",X"21",X"3C",X"A6",X"11",X"C7",X"AC",X"7E",X"12",X"13",X"CB",X"94",X"7E",X"12", + X"11",X"03",X"03",X"FF",X"1C",X"FF",X"C3",X"1A",X"0F",X"31",X"CD",X"DA",X"19",X"3A",X"7C",X"A6", + X"FE",X"7C",X"C2",X"9B",X"45",X"11",X"13",X"01",X"FF",X"CD",X"DC",X"4B",X"21",X"DC",X"A5",X"11", + X"FB",X"AD",X"7E",X"12",X"13",X"CB",X"94",X"7E",X"12",X"C3",X"1A",X"0F",X"CD",X"06",X"0B",X"CD", + X"39",X"0B",X"21",X"EB",X"A9",X"35",X"C0",X"CD",X"DA",X"19",X"3A",X"B3",X"47",X"C6",X"02",X"6F", + X"C6",X"6A",X"67",X"7E",X"FE",X"3B",X"C2",X"CA",X"15",X"21",X"7C",X"A6",X"11",X"43",X"AB",X"7E", + X"12",X"13",X"CB",X"94",X"7E",X"12",X"C3",X"1A",X"0F",X"3A",X"0D",X"59",X"4F",X"3A",X"40",X"4A", + X"21",X"06",X"0B",X"06",X"33",X"86",X"23",X"10",X"FC",X"FE",X"EF",X"CA",X"1A",X"0F",X"3A",X"89", + X"4C",X"32",X"08",X"C3",X"21",X"5C",X"A6",X"11",X"39",X"AD",X"7E",X"12",X"13",X"CB",X"94",X"7E", + X"12",X"C9",X"3E",X"FF",X"32",X"3F",X"AA",X"11",X"B9",X"17",X"0E",X"08",X"CD",X"D9",X"4B",X"3A", + X"C0",X"27",X"CD",X"1E",X"29",X"32",X"6F",X"AA",X"C3",X"1A",X"0F",X"C3",X"1A",X"0F",X"21",X"1D", + X"18",X"E5",X"3A",X"AC",X"A9",X"F7",X"1E",X"18",X"DB",X"2C",X"30",X"18",X"E6",X"07",X"8A",X"18", + X"72",X"A6",X"14",X"7D",X"A5",X"38",X"34",X"F1",X"68",X"0E",X"34",X"D7",X"B9",X"C9",X"CD",X"B6", + X"15",X"21",X"FC",X"A5",X"11",X"BE",X"AC",X"CD",X"FC",X"1A",X"CD",X"B5",X"01",X"C3",X"1A",X"0F", + X"CD",X"06",X"0B",X"CD",X"39",X"0B",X"11",X"01",X"01",X"FF",X"1E",X"14",X"FF",X"1C",X"FF",X"1E", + X"0F",X"3A",X"C3",X"A9",X"A7",X"28",X"02",X"1C",X"1C",X"FF",X"1C",X"FF",X"1E",X"16",X"FF",X"1E", + X"00",X"FF",X"3A",X"86",X"A9",X"FE",X"02",X"30",X"07",X"11",X"17",X"01",X"FF",X"C3",X"1A",X"0F", + X"11",X"19",X"01",X"FF",X"CD",X"1A",X"0F",X"C3",X"1A",X"0F",X"00",X"02",X"06",X"0D",X"00",X"03", + X"07",X"0C",X"00",X"04",X"08",X"0B",X"02",X"06",X"0A",X"0A",X"04",X"08",X"0C",X"09",X"07",X"0A", + X"0D",X"07",X"0B",X"0D",X"0E",X"05",X"0F",X"0F",X"0F",X"05",X"CD",X"06",X"0B",X"CD",X"39",X"0B", + X"3A",X"AE",X"A9",X"CB",X"67",X"C2",X"9E",X"18",X"CB",X"5F",X"C2",X"15",X"32",X"C9",X"CD",X"2B", + X"0B",X"3E",X"FF",X"32",X"30",X"AD",X"32",X"31",X"AD",X"3A",X"C1",X"A9",X"32",X"10",X"AD",X"32", + X"20",X"AD",X"CD",X"0E",X"46",X"21",X"86",X"A9",X"7E",X"D6",X"02",X"27",X"77",X"CD",X"FB",X"4A", + X"C3",X"2A",X"17",X"3A",X"80",X"A9",X"E6",X"01",X"C2",X"84",X"19",X"CD",X"D1",X"1E",X"21",X"95", + X"A9",X"0F",X"CB",X"16",X"23",X"0F",X"CB",X"16",X"23",X"0F",X"0F",X"0F",X"CB",X"16",X"23",X"0F", + X"CB",X"16",X"7E",X"E6",X"07",X"3D",X"28",X"3B",X"2B",X"7E",X"E6",X"07",X"3D",X"28",X"34",X"2B", + X"7E",X"FE",X"FF",X"CC",X"80",X"19",X"E6",X"07",X"3D",X"28",X"1B",X"2B",X"7E",X"FE",X"7F",X"CC", + X"80",X"19",X"E6",X"07",X"3D",X"28",X"02",X"18",X"5A",X"21",X"99",X"A9",X"35",X"7E",X"FE",X"80", + X"38",X"3C",X"36",X"1A",X"18",X"38",X"21",X"99",X"A9",X"34",X"7E",X"FE",X"1B",X"38",X"2F",X"36", + X"00",X"18",X"2B",X"3A",X"99",X"A9",X"21",X"C7",X"12",X"CF",X"2A",X"91",X"A9",X"ED",X"5B",X"93", + X"A9",X"12",X"77",X"3A",X"90",X"A9",X"CB",X"92",X"12",X"CB",X"D2",X"E7",X"23",X"22",X"91",X"A9", + X"ED",X"53",X"93",X"A9",X"21",X"9A",X"A9",X"35",X"28",X"2B",X"AF",X"32",X"99",X"A9",X"ED",X"5B", + X"93",X"A9",X"3A",X"99",X"A9",X"21",X"C7",X"12",X"CF",X"12",X"CB",X"92",X"3E",X"10",X"12",X"AF", + X"32",X"9C",X"A9",X"3A",X"80",X"A9",X"E6",X"07",X"20",X"30",X"21",X"EB",X"A9",X"35",X"20",X"2A", + X"2A",X"93",X"A9",X"36",X"F1",X"3E",X"3C",X"32",X"EB",X"A9",X"CD",X"34",X"56",X"C3",X"1A",X"0F", + X"36",X"00",X"AF",X"C9",X"21",X"9C",X"A9",X"34",X"2A",X"93",X"A9",X"CB",X"94",X"3A",X"9C",X"A9", + X"CB",X"67",X"28",X"04",X"36",X"14",X"18",X"02",X"36",X"10",X"21",X"20",X"AD",X"3A",X"10",X"AD", + X"B6",X"C0",X"3A",X"C0",X"A9",X"A7",X"20",X"26",X"3A",X"86",X"A9",X"FE",X"01",X"D8",X"28",X"10", + X"3A",X"AE",X"A9",X"E6",X"18",X"C8",X"FE",X"08",X"28",X"0E",X"CD",X"B6",X"15",X"C3",X"9E",X"18", + X"3A",X"AE",X"A9",X"E6",X"18",X"FE",X"08",X"C0",X"CD",X"B6",X"15",X"C3",X"15",X"32",X"3A",X"AE", + X"A9",X"E6",X"18",X"C8",X"CD",X"B6",X"15",X"C3",X"90",X"16",X"21",X"BC",X"A2",X"06",X"0D",X"7E", + X"FE",X"10",X"28",X"05",X"FE",X"05",X"C2",X"FA",X"49",X"11",X"E0",X"FF",X"19",X"10",X"F0",X"C9", + X"21",X"00",X"00",X"22",X"08",X"A8",X"22",X"0A",X"A8",X"22",X"06",X"AD",X"AF",X"32",X"0D",X"AD", + X"32",X"F7",X"A8",X"32",X"05",X"AD",X"3A",X"D6",X"A9",X"32",X"D7",X"A9",X"3A",X"0A",X"AD",X"32", + X"C0",X"AC",X"AF",X"32",X"81",X"AA",X"32",X"C6",X"AC",X"3E",X"80",X"32",X"02",X"A8",X"AF",X"32", + X"01",X"A8",X"3E",X"FF",X"32",X"00",X"A8",X"3E",X"78",X"32",X"41",X"AA",X"3E",X"84",X"32",X"10", + X"AA",X"CD",X"AF",X"20",X"CD",X"55",X"27",X"DD",X"21",X"C0",X"A8",X"FD",X"21",X"28",X"AA",X"CD", + X"0D",X"3C",X"06",X"07",X"DD",X"21",X"50",X"A8",X"FD",X"21",X"1A",X"AA",X"DD",X"21",X"E0",X"A8", + X"FD",X"21",X"2C",X"AA",X"CD",X"FB",X"3D",X"DD",X"21",X"F0",X"A8",X"FD",X"21",X"2E",X"AA",X"CD", + X"AD",X"48",X"CD",X"DE",X"2B",X"11",X"10",X"00",X"DD",X"19",X"FD",X"23",X"FD",X"23",X"10",X"F2", + X"CD",X"E4",X"1A",X"FD",X"21",X"28",X"AA",X"FD",X"36",X"00",X"00",X"FD",X"36",X"02",X"00",X"FD", + X"36",X"04",X"00",X"FD",X"36",X"06",X"00",X"FD",X"36",X"31",X"00",X"FD",X"36",X"33",X"00",X"FD", + X"36",X"35",X"00",X"FD",X"36",X"37",X"00",X"CD",X"A5",X"30",X"3A",X"04",X"AD",X"07",X"07",X"07", + X"07",X"E6",X"F0",X"47",X"3A",X"C0",X"AC",X"80",X"21",X"04",X"1B",X"D7",X"1A",X"32",X"44",X"A8", + X"13",X"1A",X"32",X"37",X"A8",X"13",X"1A",X"32",X"27",X"A8",X"13",X"1A",X"32",X"17",X"A8",X"32", + X"14",X"A8",X"13",X"1A",X"32",X"C1",X"AC",X"13",X"1A",X"32",X"C4",X"AC",X"13",X"1A",X"32",X"C6", + X"A8",X"13",X"1A",X"32",X"D6",X"A8",X"13",X"1A",X"32",X"E6",X"A8",X"13",X"1A",X"32",X"F4",X"A8", + X"32",X"F6",X"A8",X"C9",X"DD",X"21",X"10",X"A8",X"3E",X"01",X"06",X"17",X"11",X"10",X"00",X"DD", + X"36",X"00",X"00",X"DD",X"77",X"0F",X"3C",X"DD",X"19",X"10",X"F4",X"C9",X"7E",X"12",X"13",X"CB", + X"94",X"7E",X"12",X"C9",X"B1",X"1B",X"BB",X"1B",X"C5",X"1B",X"CF",X"1B",X"D9",X"1B",X"E3",X"1B", + X"ED",X"1B",X"F7",X"1B",X"01",X"1C",X"0B",X"1C",X"15",X"1C",X"1F",X"1C",X"29",X"1C",X"33",X"1C", + X"3D",X"1C",X"47",X"1C",X"51",X"1C",X"5B",X"1C",X"65",X"1C",X"6F",X"1C",X"79",X"1C",X"83",X"1C", + X"8D",X"1C",X"97",X"1C",X"A1",X"1C",X"AB",X"1C",X"B5",X"1C",X"BF",X"1C",X"C9",X"1C",X"D3",X"1C", + X"DD",X"1C",X"E7",X"1C",X"F1",X"1C",X"FB",X"1C",X"05",X"1D",X"0F",X"1D",X"19",X"1D",X"23",X"1D", + X"2D",X"1D",X"37",X"1D",X"41",X"1D",X"4B",X"1D",X"55",X"1D",X"5F",X"1D",X"69",X"1D",X"73",X"1D", + X"7D",X"1D",X"87",X"1D",X"91",X"1D",X"9B",X"1D",X"A5",X"1D",X"AF",X"1D",X"B9",X"1D",X"C3",X"1D", + X"CD",X"1D",X"D7",X"1D",X"E1",X"1D",X"EB",X"1D",X"F5",X"1D",X"FF",X"1D",X"09",X"1E",X"13",X"1E", + X"1D",X"1E",X"27",X"1E",X"31",X"1E",X"3B",X"1E",X"45",X"1E",X"4F",X"1E",X"59",X"1E",X"63",X"1E", + X"6D",X"1E",X"77",X"1E",X"81",X"1E",X"8B",X"1E",X"95",X"1E",X"9F",X"1E",X"A9",X"1E",X"B3",X"1E", + X"BD",X"1E",X"C7",X"1E",X"5F",X"A5",X"13",X"00",X"D7",X"34",X"34",X"F1",X"88",X"57",X"A5",X"BF", + X"B9",X"00",X"20",X"50",X"3C",X"04",X"50",X"00",X"50",X"18",X"5A",X"01",X"20",X"4E",X"3C",X"04", + X"50",X"00",X"4E",X"18",X"54",X"01",X"28",X"4C",X"32",X"05",X"60",X"01",X"4C",X"1C",X"4E",X"02", + X"28",X"48",X"28",X"05",X"60",X"01",X"48",X"1C",X"48",X"02",X"30",X"46",X"1E",X"06",X"70",X"01", + X"46",X"1C",X"42",X"03",X"30",X"44",X"1E",X"06",X"70",X"02",X"44",X"20",X"3C",X"03",X"38",X"42", + X"1E",X"06",X"80",X"02",X"42",X"20",X"36",X"03",X"38",X"40",X"1E",X"06",X"80",X"02",X"40",X"20", + X"30",X"04",X"40",X"3F",X"1E",X"07",X"90",X"03",X"3F",X"24",X"2A",X"04",X"40",X"3E",X"1E",X"07", + X"90",X"03",X"3E",X"24",X"24",X"04",X"40",X"3D",X"1E",X"07",X"A0",X"03",X"3D",X"24",X"1E",X"04", + X"40",X"3C",X"1E",X"07",X"B0",X"03",X"3C",X"28",X"1E",X"04",X"48",X"3B",X"1E",X"07",X"C0",X"03", + X"3B",X"28",X"1E",X"04",X"48",X"3A",X"1E",X"07",X"D0",X"03",X"3A",X"2C",X"1E",X"04",X"48",X"39", + X"1E",X"07",X"E0",X"03",X"39",X"30",X"1E",X"04",X"48",X"38",X"19",X"07",X"F0",X"03",X"38",X"30", + X"19",X"01",X"28",X"48",X"32",X"05",X"50",X"01",X"5C",X"00",X"1E",X"01",X"28",X"48",X"28",X"05", + X"50",X"01",X"5A",X"00",X"1E",X"02",X"30",X"48",X"1E",X"05",X"60",X"01",X"58",X"00",X"1E",X"02", + X"30",X"48",X"1E",X"06",X"60",X"01",X"56",X"00",X"1E",X"02",X"30",X"48",X"1E",X"06",X"70",X"02", + X"54",X"00",X"1E",X"03",X"38",X"40",X"1E",X"06",X"70",X"02",X"52",X"00",X"1E",X"03",X"38",X"40", + X"1E",X"06",X"80",X"02",X"50",X"00",X"1E",X"03",X"38",X"40",X"1E",X"06",X"80",X"02",X"4C",X"00", + X"1E",X"04",X"40",X"40",X"1E",X"07",X"90",X"02",X"4C",X"00",X"1E",X"04",X"40",X"40",X"1E",X"07", + X"90",X"02",X"48",X"00",X"1E",X"04",X"48",X"38",X"1E",X"07",X"A0",X"02",X"48",X"00",X"1E",X"04", + X"48",X"38",X"1E",X"07",X"B0",X"02",X"48",X"00",X"1E",X"04",X"48",X"38",X"1E",X"07",X"C0",X"02", + X"48",X"00",X"1E",X"04",X"48",X"38",X"1E",X"07",X"D0",X"02",X"48",X"00",X"1E",X"04",X"50",X"38", + X"1E",X"07",X"E0",X"02",X"48",X"00",X"1E",X"04",X"58",X"30",X"19",X"07",X"F0",X"02",X"48",X"00", + X"19",X"01",X"20",X"50",X"32",X"03",X"50",X"01",X"50",X"08",X"1E",X"01",X"20",X"50",X"28",X"04", + X"50",X"01",X"50",X"08",X"1E",X"01",X"20",X"50",X"1E",X"04",X"60",X"01",X"50",X"0C",X"1E",X"01", + X"28",X"50",X"1E",X"04",X"60",X"02",X"50",X"0C",X"1E",X"01",X"28",X"48",X"1E",X"05",X"70",X"02", + X"48",X"10",X"1E",X"01",X"28",X"48",X"1E",X"05",X"80",X"02",X"48",X"10",X"1E",X"01",X"30",X"48", + X"1E",X"05",X"90",X"03",X"48",X"14",X"1E",X"01",X"30",X"48",X"1E",X"06",X"A0",X"03",X"48",X"14", + X"1E",X"02",X"30",X"40",X"1E",X"06",X"B0",X"03",X"40",X"18",X"1E",X"02",X"38",X"40",X"1E",X"06", + X"C0",X"03",X"40",X"18",X"1E",X"02",X"38",X"40",X"1E",X"06",X"D0",X"03",X"40",X"18",X"1E",X"02", + X"38",X"40",X"1E",X"06",X"D0",X"03",X"40",X"18",X"1E",X"02",X"40",X"38",X"1E",X"06",X"E0",X"03", + X"38",X"18",X"1E",X"02",X"48",X"38",X"1E",X"06",X"E0",X"03",X"38",X"18",X"1E",X"02",X"50",X"38", + X"1E",X"06",X"F0",X"03",X"38",X"18",X"1E",X"03",X"58",X"30",X"19",X"07",X"F0",X"03",X"30",X"18", + X"19",X"01",X"20",X"50",X"1E",X"04",X"60",X"01",X"50",X"00",X"1E",X"01",X"20",X"50",X"1E",X"04", + X"70",X"01",X"50",X"00",X"1E",X"01",X"28",X"50",X"1E",X"04",X"80",X"01",X"50",X"00",X"1E",X"01", + X"28",X"50",X"1E",X"05",X"90",X"02",X"50",X"00",X"1E",X"01",X"30",X"48",X"1E",X"05",X"A0",X"02", + X"48",X"00",X"1E",X"01",X"30",X"48",X"1E",X"05",X"B0",X"02",X"48",X"00",X"1E",X"01",X"38",X"48", + X"1E",X"05",X"C0",X"03",X"48",X"00",X"1E",X"01",X"38",X"48",X"1E",X"06",X"D0",X"03",X"48",X"00", + X"1E",X"01",X"40",X"40",X"1E",X"06",X"E0",X"03",X"40",X"00",X"1E",X"01",X"40",X"40",X"1E",X"06", + X"F0",X"03",X"40",X"00",X"1E",X"01",X"48",X"40",X"1E",X"06",X"F0",X"03",X"40",X"00",X"1E",X"01", + X"48",X"40",X"1E",X"06",X"F0",X"03",X"40",X"00",X"1E",X"01",X"50",X"38",X"1E",X"06",X"F0",X"03", + X"38",X"00",X"1E",X"01",X"50",X"38",X"1E",X"06",X"F0",X"03",X"38",X"00",X"1E",X"01",X"58",X"38", + X"1E",X"06",X"F0",X"03",X"38",X"00",X"1E",X"01",X"58",X"30",X"19",X"06",X"F0",X"03",X"30",X"00", + X"19",X"01",X"20",X"50",X"5A",X"03",X"00",X"01",X"58",X"3C",X"64",X"01",X"20",X"50",X"5A",X"03", + X"10",X"01",X"54",X"46",X"5A",X"01",X"28",X"50",X"50",X"04",X"20",X"01",X"52",X"50",X"50",X"01", + X"28",X"50",X"46",X"04",X"30",X"02",X"50",X"5A",X"46",X"01",X"30",X"48",X"46",X"04",X"40",X"02", + X"4E",X"64",X"46",X"01",X"30",X"48",X"3C",X"05",X"50",X"02",X"4B",X"6E",X"3C",X"01",X"38",X"48", + X"3C",X"05",X"60",X"03",X"48",X"78",X"3C",X"01",X"38",X"40",X"32",X"05",X"70",X"03",X"46",X"82", + X"3C",X"01",X"40",X"40",X"32",X"05",X"80",X"03",X"44",X"8C",X"32",X"01",X"40",X"40",X"28",X"05", + X"90",X"03",X"44",X"96",X"32",X"01",X"48",X"40",X"28",X"05",X"A0",X"03",X"42",X"A0",X"32",X"01", + X"48",X"3C",X"1E",X"05",X"B0",X"03",X"42",X"AA",X"28",X"01",X"50",X"3C",X"1E",X"05",X"C0",X"03", + X"40",X"B4",X"28",X"01",X"50",X"3C",X"1E",X"05",X"D0",X"03",X"3C",X"BE",X"28",X"01",X"58",X"38", + X"1E",X"05",X"E0",X"03",X"38",X"C8",X"1E",X"01",X"58",X"30",X"19",X"05",X"F0",X"03",X"34",X"D2", + X"19",X"3A",X"87",X"A9",X"A7",X"21",X"AF",X"A9",X"20",X"03",X"21",X"B0",X"A9",X"7E",X"C9",X"DD", + X"21",X"00",X"A8",X"FD",X"21",X"10",X"AA",X"3A",X"00",X"A8",X"A7",X"C8",X"3C",X"C2",X"10",X"20", + X"3A",X"30",X"AD",X"A7",X"CA",X"4B",X"21",X"CD",X"D1",X"1E",X"E6",X"0F",X"20",X"03",X"C3",X"42", + X"1F",X"21",X"2E",X"1F",X"CF",X"47",X"3A",X"02",X"A8",X"90",X"CA",X"42",X"1F",X"4F",X"3A",X"04", + X"AD",X"E6",X"0F",X"FE",X"03",X"30",X"04",X"16",X"03",X"18",X"02",X"16",X"04",X"79",X"C6",X"01", + X"FE",X"03",X"DA",X"3E",X"1F",X"79",X"FE",X"80",X"D2",X"6F",X"1F",X"C3",X"68",X"1F",X"00",X"00", + X"80",X"00",X"C0",X"E0",X"A0",X"00",X"40",X"20",X"60",X"00",X"00",X"00",X"00",X"00",X"78",X"32", + X"02",X"A8",X"21",X"55",X"1F",X"E5",X"3A",X"04",X"AD",X"A7",X"CA",X"4E",X"59",X"FE",X"03",X"DA", + X"65",X"59",X"C3",X"6B",X"59",X"AF",X"67",X"6F",X"ED",X"52",X"22",X"08",X"A8",X"AF",X"67",X"6F", + X"ED",X"42",X"22",X"0A",X"A8",X"C3",X"AF",X"20",X"92",X"80",X"32",X"02",X"A8",X"18",X"D3",X"82", + X"80",X"32",X"02",X"A8",X"18",X"CC",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"DD",X"F1",X"F1", + X"F1",X"F1",X"F0",X"F1",X"F1",X"F1",X"F1",X"C3",X"F1",X"F1",X"F1",X"F1",X"EA",X"F1",X"F1",X"F1", + X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"B7",X"F1",X"F1",X"F1",X"F1",X"4D",X"F1",X"F1",X"F1",X"E5", + X"2D",X"6E",X"F1",X"F1",X"5E",X"61",X"E6",X"F1",X"F1",X"F1",X"B2",X"F1",X"F1",X"F1",X"F1",X"53", + X"F1",X"F1",X"F1",X"F1",X"95",X"F1",X"F1",X"F1",X"45",X"CA",X"F1",X"F1",X"F1",X"C6",X"2C",X"97", + X"F1",X"F1",X"81",X"69",X"1E",X"F1",X"F1",X"BC",X"A1",X"60",X"F1",X"F1",X"F4",X"EB",X"F1",X"F1", + X"F1",X"F1",X"48",X"F1",X"F1",X"F1",X"E0",X"63",X"35",X"F1",X"F1",X"AA",X"B4",X"8A",X"F1",X"F1", + X"51",X"E9",X"F6",X"F1",X"F1",X"82",X"92",X"98",X"F1",X"F1",X"F1",X"46",X"F1",X"F1",X"F1",X"F1", + X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1", + X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"19",X"DF",X"78",X"C9", + X"DD",X"7E",X"00",X"FE",X"B4",X"38",X"29",X"DD",X"36",X"00",X"B4",X"FD",X"36",X"01",X"FF",X"3A", + X"04",X"AD",X"FE",X"02",X"D4",X"79",X"56",X"CD",X"D2",X"56",X"3A",X"FE",X"AB",X"FE",X"A5",X"C2", + X"63",X"20",X"11",X"FF",X"AB",X"1A",X"FE",X"05",X"CA",X"40",X"20",X"FE",X"10",X"C2",X"63",X"20", + X"DD",X"35",X"00",X"DD",X"7E",X"00",X"FE",X"B3",X"28",X"1C",X"FE",X"AB",X"28",X"1D",X"FE",X"A3", + X"28",X"1E",X"FE",X"9B",X"28",X"1F",X"FE",X"93",X"28",X"20",X"FE",X"8B",X"28",X"21",X"FE",X"83", + X"28",X"22",X"C9",X"C3",X"2E",X"1F",X"11",X"76",X"1F",X"18",X"1E",X"11",X"94",X"1F",X"18",X"19", + X"11",X"B2",X"1F",X"18",X"14",X"11",X"D0",X"1F",X"18",X"0F",X"11",X"D0",X"1F",X"18",X"0A",X"11", + X"B2",X"1F",X"18",X"05",X"11",X"EE",X"1F",X"18",X"00",X"21",X"AF",X"A5",X"06",X"C1",X"3A",X"04", + X"AD",X"80",X"4F",X"D9",X"3A",X"7A",X"33",X"47",X"D9",X"3A",X"02",X"49",X"47",X"1A",X"77",X"CB", + X"94",X"71",X"CB",X"D4",X"23",X"13",X"10",X"F5",X"3E",X"1B",X"DF",X"D9",X"10",X"EA",X"C9",X"DD", + X"21",X"00",X"A8",X"11",X"20",X"00",X"3A",X"02",X"A8",X"C6",X"04",X"0F",X"0F",X"0F",X"E6",X"1F", + X"21",X"CE",X"20",X"DF",X"7E",X"32",X"11",X"AA",X"19",X"7E",X"32",X"40",X"AA",X"C9",X"F0",X"F1", + X"F2",X"F3",X"F4",X"F5",X"F6",X"F7",X"E8",X"F7",X"F6",X"F5",X"F4",X"F3",X"F2",X"F1",X"F0",X"EF", + X"EE",X"ED",X"EC",X"EB",X"EA",X"E9",X"E8",X"E9",X"EA",X"EB",X"EC",X"ED",X"EE",X"EF",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"21",X"F3", + X"AD",X"EB",X"3A",X"14",X"AD",X"A7",X"28",X"28",X"FE",X"03",X"28",X"24",X"FE",X"01",X"28",X"25", + X"21",X"FA",X"22",X"7E",X"3C",X"32",X"F2",X"AD",X"EB",X"73",X"2C",X"72",X"21",X"FB",X"AD",X"7E", + X"FE",X"FD",X"C2",X"3D",X"21",X"23",X"7E",X"FE",X"10",X"C8",X"FE",X"05",X"C8",X"C3",X"51",X"22", + X"21",X"8C",X"21",X"18",X"DE",X"21",X"51",X"22",X"18",X"D9",X"C9",X"21",X"F2",X"AD",X"7E",X"47", + X"E6",X"3F",X"28",X"07",X"3D",X"28",X"04",X"05",X"70",X"18",X"0F",X"23",X"5E",X"23",X"56",X"13", + X"72",X"2B",X"73",X"EB",X"7E",X"1B",X"3C",X"12",X"18",X"E1",X"78",X"D9",X"07",X"07",X"E6",X"03", + X"CA",X"42",X"1F",X"3D",X"28",X"0B",X"3A",X"02",X"A8",X"C6",X"03",X"32",X"02",X"A8",X"C3",X"42", + X"1F",X"3A",X"02",X"A8",X"D6",X"03",X"32",X"02",X"A8",X"C3",X"42",X"1F",X"3C",X"3C",X"3C",X"3C", + X"0B",X"95",X"03",X"66",X"95",X"7C",X"59",X"8D",X"4B",X"8E",X"4A",X"02",X"8B",X"1A",X"55",X"0E", + X"8A",X"7C",X"4E",X"05",X"8A",X"0B",X"86",X"46",X"03",X"4A",X"0D",X"7C",X"5A",X"36",X"AB",X"08", + X"55",X"08",X"56",X"01",X"4A",X"05",X"56",X"03",X"7C",X"4D",X"BC",X"83",X"0A",X"4B",X"07",X"BC", + X"81",X"72",X"02",X"56",X"02",X"6A",X"01",X"95",X"3B",X"88",X"53",X"03",X"BC",X"95",X"46",X"0B", + X"95",X"04",X"A0",X"0C",X"4A",X"02",X"56",X"03",X"55",X"01",X"95",X"03",X"4A",X"04",X"8A",X"02", + X"4A",X"02",X"8A",X"29",X"8B",X"06",X"4B",X"16",X"4A",X"01",X"95",X"0D",X"88",X"53",X"01",X"6A", + X"0F",X"8A",X"08",X"8B",X"0D",X"4B",X"08",X"8B",X"07",X"55",X"02",X"69",X"89",X"03",X"4B",X"01", + X"7C",X"6F",X"05",X"8B",X"4B",X"0D",X"8B",X"01",X"4E",X"83",X"01",X"8B",X"0F",X"55",X"05",X"A2", + X"42",X"10",X"60",X"26",X"4B",X"02",X"8B",X"08",X"4B",X"05",X"8F",X"4F",X"01",X"95",X"17",X"4A", + X"0E",X"8A",X"04",X"A0",X"1B",X"8B",X"11",X"4B",X"0A",X"52",X"97",X"4D",X"8F",X"47",X"06",X"8B", + X"02",X"55",X"03",X"9D",X"67",X"8A",X"0A",X"56",X"05",X"8B",X"02",X"48",X"88",X"03",X"55",X"09", + X"60",X"03",X"76",X"13",X"8B",X"24",X"4B",X"2F",X"8B",X"05",X"8B",X"08",X"8A",X"15",X"96",X"3C", + X"3C",X"3C",X"3C",X"3C",X"3C",X"0A",X"95",X"60",X"04",X"9E",X"53",X"0D",X"8B",X"02",X"4B",X"0F", + X"93",X"53",X"07",X"A9",X"54",X"0A",X"96",X"03",X"60",X"0F",X"8A",X"23",X"48",X"B9",X"02",X"82", + X"59",X"9F",X"59",X"01",X"8B",X"22",X"AB",X"02",X"4B",X"02",X"8B",X"07",X"55",X"AC",X"42",X"01", + X"50",X"90",X"02",X"55",X"35",X"90",X"50",X"04",X"92",X"5B",X"89",X"1F",X"48",X"88",X"05",X"8C", + X"42",X"05",X"4A",X"3C",X"0C",X"46",X"86",X"3C",X"04",X"93",X"5E",X"06",X"4B",X"09",X"4A",X"0A", + X"7C",X"7C",X"6F",X"BC",X"01",X"8B",X"07",X"92",X"48",X"07",X"88",X"7C",X"7C",X"45",X"11",X"90", + X"50",X"01",X"8B",X"07",X"4B",X"0C",X"8B",X"0A",X"76",X"AB",X"12",X"87",X"47",X"18",X"8B",X"03", + X"8A",X"02",X"96",X"08",X"4B",X"02",X"8B",X"07",X"95",X"3C",X"3C",X"17",X"55",X"3C",X"05",X"56", + X"20",X"7C",X"44",X"06",X"67",X"BC",X"4D",X"8E",X"0C",X"56",X"02",X"4A",X"1A",X"4B",X"39",X"55", + X"25",X"56",X"20",X"55",X"0B",X"4B",X"03",X"60",X"06",X"4A",X"03",X"41",X"01",X"BC",X"9F",X"50", + X"04",X"96",X"0F",X"4B",X"07",X"8B",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"02",X"90", + X"45",X"02",X"4B",X"02",X"48",X"88",X"07",X"8A",X"55",X"01",X"4A",X"01",X"58",X"82",X"03",X"8A", + X"5F",X"01",X"60",X"07",X"B2",X"52",X"03",X"46",X"86",X"1E",X"49",X"89",X"08",X"4B",X"01",X"94", + X"49",X"05",X"8A",X"4A",X"3C",X"3C",X"0A",X"BC",X"84",X"11",X"53",X"88",X"01",X"4A",X"0B",X"6B", + X"06",X"4B",X"24",X"4A",X"11",X"56",X"08",X"4A",X"0E",X"4B",X"07",X"55",X"07",X"4B",X"07",X"7C", + X"72",X"8E",X"01",X"AF",X"44",X"02",X"56",X"8B",X"04",X"5A",X"85",X"02",X"8A",X"02",X"90",X"45", + X"09",X"8B",X"01",X"48",X"89",X"41",X"02",X"4B",X"05",X"B5",X"10",X"4D",X"83",X"03",X"B5",X"4B", + X"03",X"A0",X"07",X"72",X"88",X"08",X"4B",X"01",X"50",X"85",X"03",X"8B",X"02",X"55",X"05",X"95", + X"06",X"60",X"06",X"55",X"01",X"4B",X"09",X"48",X"8F",X"47",X"03",X"4B",X"01",X"96",X"07",X"8A", + X"05",X"6A",X"18",X"4B",X"0A",X"8B",X"06",X"8A",X"02",X"44",X"84",X"06",X"8B",X"08",X"8B",X"14", + X"BC",X"84",X"03",X"59",X"83",X"02",X"8B",X"03",X"60",X"08",X"8B",X"05",X"7C",X"5A",X"01",X"B6", + X"0A",X"48",X"95",X"4D",X"01",X"8A",X"09",X"51",X"BC",X"85",X"65",X"2D",X"6B",X"01",X"95",X"4D", + X"83",X"02",X"8A",X"4A",X"01",X"8B",X"02",X"72",X"85",X"53",X"01",X"95",X"02",X"8B",X"06",X"95", + X"03",X"8B",X"01",X"8A",X"01",X"4A",X"07",X"95",X"01",X"6B",X"03",X"97",X"41",X"05",X"4B",X"0B", + X"48",X"88",X"05",X"60",X"3C",X"3C",X"3C",X"3C",X"73",X"A6",X"14",X"7E",X"29",X"F8",X"9B",X"13", + X"13",X"96",X"B9",X"3A",X"00",X"A8",X"3C",X"C2",X"96",X"24",X"3A",X"C6",X"AC",X"A7",X"C2",X"96", + X"24",X"CD",X"D1",X"1E",X"07",X"07",X"07",X"07",X"21",X"8E",X"A9",X"CB",X"16",X"7E",X"E6",X"03", + X"FE",X"01",X"21",X"81",X"AA",X"20",X"02",X"36",X"03",X"3A",X"30",X"AD",X"A7",X"28",X"05",X"7E", + X"A7",X"CA",X"96",X"24",X"23",X"7E",X"A7",X"C2",X"96",X"24",X"DD",X"21",X"80",X"AA",X"06",X"06", + X"DD",X"7E",X"00",X"A7",X"28",X"23",X"ED",X"5B",X"46",X"0D",X"DD",X"19",X"10",X"F2",X"C3",X"96", + X"24",X"16",X"A7",X"13",X"96",X"ED",X"DC",X"F1",X"8C",X"68",X"3B",X"0D",X"ED",X"F1",X"96",X"13", + X"13",X"13",X"13",X"F1",X"88",X"DC",X"ED",X"11",X"B9",X"CD",X"7E",X"56",X"AF",X"67",X"6F",X"ED", + X"4B",X"08",X"A8",X"ED",X"42",X"29",X"29",X"DD",X"75",X"0A",X"DD",X"74",X"0B",X"AF",X"67",X"6F", + X"ED",X"4B",X"0A",X"A8",X"ED",X"42",X"29",X"29",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"3A",X"02", + X"A8",X"C6",X"04",X"0F",X"0F",X"0F",X"E6",X"1F",X"21",X"71",X"27",X"CD",X"8C",X"01",X"DD",X"35", + X"00",X"DD",X"36",X"03",X"00",X"DD",X"73",X"04",X"DD",X"36",X"05",X"00",X"DD",X"72",X"06",X"21", + X"81",X"AA",X"35",X"23",X"36",X"06",X"3A",X"82",X"AA",X"A7",X"28",X"04",X"3D",X"32",X"82",X"AA", + X"DD",X"21",X"80",X"AA",X"06",X"06",X"D9",X"DD",X"7E",X"00",X"A7",X"28",X"46",X"3C",X"20",X"4C", + X"DD",X"6E",X"0A",X"DD",X"66",X"0B",X"ED",X"5B",X"08",X"A8",X"19",X"DD",X"56",X"04",X"DD",X"5E", + X"03",X"19",X"7C",X"C6",X"10",X"FE",X"10",X"DA",X"FC",X"24",X"DD",X"74",X"04",X"DD",X"75",X"03", + X"DD",X"6E",X"0C",X"DD",X"66",X"0D",X"ED",X"5B",X"0A",X"A8",X"19",X"DD",X"56",X"06",X"DD",X"5E", + X"05",X"19",X"7C",X"C6",X"08",X"FE",X"18",X"DA",X"FC",X"24",X"DD",X"74",X"06",X"DD",X"75",X"05", + X"CD",X"37",X"53",X"11",X"10",X"00",X"DD",X"19",X"D9",X"10",X"AB",X"C9",X"AF",X"DD",X"77",X"00", + X"DD",X"77",X"04",X"DD",X"77",X"06",X"C3",X"F3",X"24",X"E0",X"A4",X"14",X"9B",X"10",X"0D",X"88", + X"B9",X"21",X"00",X"AC",X"06",X"40",X"36",X"FF",X"23",X"10",X"FB",X"CD",X"67",X"4B",X"32",X"00", + X"C2",X"CD",X"A5",X"4B",X"32",X"00",X"C2",X"CD",X"6A",X"52",X"32",X"00",X"C2",X"C3",X"AA",X"52", + X"19",X"01",X"18",X"01",X"17",X"01",X"16",X"01",X"15",X"01",X"14",X"01",X"13",X"01",X"10",X"01", + X"0E",X"01",X"0C",X"01",X"0A",X"01",X"08",X"01",X"04",X"01",X"01",X"01",X"FF",X"00",X"FB",X"00", + X"F8",X"00",X"F5",X"00",X"F2",X"00",X"EE",X"00",X"EB",X"00",X"E8",X"00",X"E4",X"00",X"E1",X"00", + X"DE",X"00",X"DA",X"00",X"D7",X"00",X"D4",X"00",X"D1",X"00",X"CD",X"00",X"CA",X"00",X"C7",X"00", + X"C3",X"00",X"C0",X"00",X"BC",X"00",X"B8",X"00",X"B5",X"00",X"B1",X"00",X"AC",X"00",X"A8",X"00", + X"A5",X"00",X"A0",X"00",X"9A",X"00",X"94",X"00",X"8F",X"00",X"87",X"00",X"84",X"00",X"7D",X"00", + X"76",X"00",X"70",X"00",X"69",X"00",X"61",X"00",X"5B",X"00",X"53",X"00",X"4B",X"00",X"44",X"00", + X"3B",X"00",X"33",X"00",X"2C",X"00",X"23",X"00",X"1A",X"00",X"11",X"00",X"08",X"00",X"00",X"00", + X"00",X"00",X"F8",X"FF",X"EF",X"FF",X"00",X"00",X"DD",X"FF",X"D4",X"FF",X"CD",X"FF",X"C5",X"FF", + X"BC",X"FF",X"B5",X"FF",X"AD",X"FF",X"A5",X"FF",X"9F",X"FF",X"97",X"FF",X"90",X"FF",X"8A",X"FF", + X"83",X"FF",X"7C",X"FF",X"79",X"FF",X"7C",X"FF",X"6C",X"FF",X"66",X"FF",X"60",X"FF",X"5B",X"FF", + X"58",X"FF",X"54",X"FF",X"4F",X"FF",X"4B",X"FF",X"48",X"FF",X"44",X"FF",X"40",X"FF",X"3D",X"FF", + X"39",X"FF",X"36",X"FF",X"33",X"FF",X"33",X"FF",X"2C",X"FF",X"29",X"FF",X"26",X"FF",X"22",X"FF", + X"1F",X"FF",X"1C",X"FF",X"18",X"FF",X"15",X"FF",X"12",X"FF",X"0E",X"FF",X"0B",X"FF",X"08",X"FF", + X"05",X"FF",X"01",X"FF",X"FF",X"FE",X"FC",X"FE",X"F8",X"FE",X"F6",X"FE",X"F4",X"FE",X"F2",X"FE", + X"F0",X"FE",X"ED",X"FE",X"EC",X"FE",X"EB",X"FE",X"EA",X"FE",X"E9",X"FE",X"E8",X"FE",X"E7",X"FE", + X"E7",X"FE",X"E8",X"FE",X"E9",X"FE",X"EA",X"FE",X"EB",X"FE",X"EC",X"FE",X"ED",X"FE",X"F0",X"FE", + X"F2",X"FE",X"F4",X"FE",X"F6",X"FE",X"F8",X"FE",X"FC",X"FE",X"FF",X"FE",X"01",X"FF",X"05",X"FF", + X"08",X"FF",X"0B",X"FF",X"0E",X"FF",X"12",X"FF",X"15",X"FF",X"18",X"FF",X"1C",X"FF",X"1F",X"FF", + X"22",X"FF",X"26",X"FF",X"29",X"FF",X"2C",X"FF",X"2F",X"FF",X"33",X"FF",X"36",X"FF",X"39",X"FF", + X"3D",X"FF",X"40",X"FF",X"44",X"FF",X"48",X"FF",X"4B",X"FF",X"4F",X"FF",X"54",X"FF",X"58",X"FF", + X"5B",X"FF",X"60",X"FF",X"66",X"FF",X"6C",X"FF",X"71",X"FF",X"79",X"FF",X"7C",X"FF",X"83",X"FF", + X"8A",X"FF",X"90",X"FF",X"97",X"FF",X"9F",X"FF",X"A5",X"FF",X"AD",X"FF",X"B5",X"FF",X"BC",X"FF", + X"C5",X"FF",X"CD",X"FF",X"D4",X"FF",X"DD",X"FF",X"E6",X"FF",X"EF",X"FF",X"F8",X"FF",X"00",X"00", + X"00",X"00",X"08",X"00",X"11",X"00",X"1A",X"00",X"23",X"00",X"2C",X"00",X"33",X"00",X"3B",X"00", + X"44",X"00",X"4B",X"00",X"53",X"00",X"5B",X"00",X"61",X"00",X"69",X"00",X"70",X"00",X"76",X"00", + X"7D",X"00",X"84",X"00",X"87",X"00",X"87",X"00",X"94",X"00",X"9A",X"00",X"A0",X"00",X"A5",X"00", + X"A8",X"00",X"AC",X"00",X"B1",X"00",X"B5",X"00",X"B8",X"00",X"BC",X"00",X"C0",X"00",X"C3",X"00", + X"C7",X"00",X"CA",X"00",X"CD",X"00",X"CA",X"00",X"D4",X"00",X"D7",X"00",X"DA",X"00",X"DE",X"00", + X"E1",X"00",X"E4",X"00",X"E8",X"00",X"EB",X"00",X"EE",X"00",X"F2",X"00",X"F5",X"00",X"F8",X"00", + X"FB",X"00",X"FF",X"00",X"01",X"01",X"FB",X"00",X"08",X"01",X"0A",X"01",X"0C",X"01",X"0E",X"01", + X"10",X"01",X"13",X"01",X"14",X"01",X"15",X"01",X"16",X"01",X"17",X"01",X"18",X"01",X"19",X"01", + X"3A",X"6F",X"AA",X"FE",X"76",X"C2",X"30",X"25",X"CD",X"2B",X"0B",X"CD",X"0E",X"21",X"AF",X"32", + X"31",X"AD",X"32",X"20",X"AD",X"32",X"30",X"AD",X"32",X"AC",X"A9",X"3C",X"32",X"10",X"AD",X"3E", + X"03",X"32",X"AB",X"A9",X"C9",X"DD",X"21",X"80",X"AA",X"21",X"6E",X"27",X"3A",X"61",X"08",X"5F", + X"3A",X"01",X"5C",X"57",X"06",X"06",X"DD",X"77",X"00",X"DD",X"77",X"04",X"DD",X"19",X"10",X"F6", + X"C9",X"7E",X"84",X"7E",X"85",X"7E",X"86",X"7D",X"87",X"7C",X"88",X"7B",X"89",X"7A",X"8A",X"79", + X"8A",X"78",X"8A",X"77",X"8A",X"76",X"8A",X"75",X"89",X"74",X"88",X"73",X"87",X"72",X"86",X"72", + X"85",X"72",X"84",X"72",X"83",X"72",X"82",X"73",X"81",X"74",X"80",X"75",X"7F",X"76",X"7E",X"77", + X"7E",X"78",X"7E",X"79",X"7E",X"7A",X"7E",X"7B",X"7F",X"7C",X"80",X"7D",X"81",X"7E",X"82",X"7E", + X"83",X"CD",X"34",X"58",X"3E",X"78",X"32",X"64",X"AC",X"3E",X"84",X"32",X"65",X"AC",X"21",X"00", + X"00",X"22",X"16",X"AD",X"22",X"26",X"AD",X"3A",X"CD",X"A9",X"32",X"12",X"AD",X"32",X"22",X"AD", + X"AF",X"32",X"14",X"AD",X"32",X"24",X"AD",X"32",X"32",X"AD",X"32",X"13",X"AD",X"32",X"23",X"AD", + X"32",X"1D",X"AD",X"32",X"2D",X"AD",X"32",X"0C",X"AD",X"3C",X"32",X"11",X"AD",X"32",X"21",X"AD", + X"32",X"1E",X"AD",X"32",X"2E",X"AD",X"3A",X"30",X"AD",X"A7",X"28",X"39",X"AF",X"67",X"6F",X"32", + X"33",X"AD",X"22",X"34",X"AD",X"32",X"36",X"AD",X"22",X"37",X"AD",X"11",X"00",X"04",X"FF",X"3A", + X"C4",X"A9",X"CD",X"7B",X"0F",X"06",X"00",X"21",X"50",X"15",X"97",X"AE",X"23",X"10",X"FC",X"C6", + X"01",X"32",X"08",X"C3",X"3A",X"D3",X"A9",X"32",X"1A",X"AD",X"32",X"2A",X"AD",X"3E",X"96",X"32", + X"EB",X"A9",X"C3",X"1A",X"0F",X"21",X"D0",X"A9",X"7E",X"3C",X"FE",X"04",X"38",X"02",X"3E",X"01", + X"77",X"32",X"14",X"AD",X"3C",X"32",X"11",X"AD",X"AF",X"32",X"80",X"A9",X"32",X"CE",X"A9",X"32", + X"CF",X"A9",X"CD",X"67",X"4B",X"21",X"80",X"AA",X"11",X"81",X"AA",X"36",X"00",X"01",X"5F",X"00", + X"ED",X"B0",X"21",X"00",X"A8",X"11",X"01",X"A8",X"36",X"00",X"01",X"7F",X"01",X"ED",X"B0",X"3E", + X"02",X"CD",X"7B",X"0F",X"3A",X"D3",X"A9",X"32",X"1A",X"AD",X"32",X"2A",X"AD",X"0E",X"00",X"21", + X"10",X"33",X"3A",X"AB",X"A9",X"96",X"23",X"0D",X"20",X"FB",X"EE",X"90",X"32",X"AB",X"A9",X"21", + X"74",X"AC",X"06",X"10",X"36",X"80",X"23",X"10",X"FB",X"3E",X"5A",X"32",X"EB",X"A9",X"C3",X"1A", + X"0F",X"CD",X"B7",X"28",X"CD",X"C2",X"28",X"CD",X"CD",X"28",X"CD",X"D8",X"28",X"CD",X"E3",X"28", + X"CD",X"EE",X"28",X"CD",X"FE",X"28",X"C9",X"DD",X"21",X"50",X"A8",X"FD",X"21",X"1A",X"AA",X"C3", + X"0E",X"29",X"DD",X"21",X"60",X"A8",X"FD",X"21",X"1C",X"AA",X"C3",X"0E",X"29",X"DD",X"21",X"70", + X"A8",X"FD",X"21",X"1E",X"AA",X"C3",X"0E",X"29",X"DD",X"21",X"80",X"A8",X"FD",X"21",X"20",X"AA", + X"C3",X"0E",X"29",X"DD",X"21",X"90",X"A8",X"FD",X"21",X"22",X"AA",X"C3",X"0E",X"29",X"3A",X"0D", + X"AD",X"A7",X"C0",X"DD",X"21",X"A0",X"A8",X"FD",X"21",X"24",X"AA",X"C3",X"0E",X"29",X"3A",X"0D", + X"AD",X"A7",X"C0",X"DD",X"21",X"B0",X"A8",X"FD",X"21",X"26",X"AA",X"C3",X"0E",X"29",X"3A",X"04", + X"AD",X"E6",X"07",X"F7",X"27",X"29",X"4C",X"29",X"84",X"29",X"B0",X"29",X"D5",X"29",X"86",X"EB", + X"4E",X"EB",X"23",X"13",X"10",X"F8",X"C9",X"DD",X"7E",X"00",X"A7",X"C8",X"3C",X"28",X"07",X"3C", + X"CA",X"52",X"2B",X"C3",X"93",X"2B",X"CD",X"EF",X"2B",X"CD",X"40",X"58",X"CD",X"83",X"2B",X"DA", + X"DE",X"2B",X"CD",X"D6",X"3E",X"CD",X"3C",X"2A",X"CD",X"43",X"42",X"C9",X"DD",X"7E",X"00",X"A7", + X"C8",X"3C",X"28",X"07",X"3C",X"CA",X"52",X"2B",X"C3",X"93",X"2B",X"CD",X"EF",X"2B",X"CD",X"54", + X"58",X"CD",X"83",X"2B",X"DA",X"DE",X"2B",X"CD",X"D6",X"3E",X"CD",X"47",X"2A",X"C9",X"09",X"A7", + X"32",X"82",X"6E",X"58",X"B5",X"77",X"E4",X"E8",X"EC",X"9D",X"CB",X"4F",X"55",X"FE",X"A3",X"31", + X"81",X"5B",X"9A",X"B9",X"DD",X"7E",X"00",X"A7",X"C8",X"3C",X"28",X"07",X"3C",X"CA",X"52",X"2B", + X"C3",X"93",X"2B",X"3A",X"80",X"A9",X"E6",X"03",X"FE",X"03",X"DC",X"EF",X"2B",X"CD",X"40",X"58", + X"CD",X"83",X"2B",X"DA",X"DE",X"2B",X"CD",X"D6",X"3E",X"CD",X"97",X"2A",X"CD",X"43",X"42",X"C9", + X"DD",X"7E",X"00",X"A7",X"C8",X"3C",X"28",X"07",X"3C",X"CA",X"52",X"2B",X"C3",X"93",X"2B",X"CD", + X"EF",X"2B",X"CD",X"A4",X"58",X"CD",X"83",X"2B",X"DA",X"DE",X"2B",X"CD",X"D6",X"3E",X"CD",X"FC", + X"2A",X"CD",X"43",X"42",X"C9",X"DD",X"7E",X"00",X"A7",X"C8",X"3C",X"28",X"07",X"3C",X"CA",X"52", + X"2B",X"C3",X"93",X"2B",X"CD",X"F7",X"29",X"CD",X"83",X"2B",X"DA",X"DE",X"2B",X"CD",X"38",X"2B", + X"CD",X"D6",X"3E",X"CD",X"43",X"42",X"C9",X"3E",X"78",X"FD",X"96",X"31",X"C6",X"48",X"FE",X"90", + X"38",X"1A",X"3E",X"84",X"FD",X"96",X"31",X"C6",X"48",X"FE",X"90",X"38",X"0F",X"CD",X"EF",X"2B", + X"3A",X"80",X"A9",X"0F",X"E6",X"01",X"CA",X"AA",X"58",X"C3",X"60",X"58",X"AF",X"32",X"04",X"AD", + X"CD",X"EF",X"2B",X"3E",X"04",X"32",X"04",X"AD",X"18",X"E6",X"DD",X"7E",X"04",X"3D",X"CA",X"93", + X"2B",X"DD",X"77",X"04",X"DD",X"36",X"00",X"FF",X"CD",X"BA",X"2B",X"C9",X"CD",X"57",X"2A",X"FD", + X"71",X"30",X"78",X"FD",X"77",X"01",X"C9",X"CD",X"57",X"2A",X"79",X"C6",X"35",X"FD",X"77",X"30", + X"78",X"C6",X"10",X"FD",X"77",X"01",X"C9",X"11",X"10",X"00",X"DD",X"7E",X"02",X"C6",X"08",X"0F", + X"0F",X"0F",X"0F",X"E6",X"0F",X"21",X"77",X"2A",X"DF",X"46",X"19",X"4E",X"3A",X"80",X"A9",X"CB", + X"4F",X"C8",X"78",X"C6",X"08",X"47",X"C9",X"0C",X"0D",X"0E",X"0F",X"08",X"0F",X"0E",X"0D",X"0C", + X"0B",X"0A",X"09",X"08",X"09",X"0A",X"0B",X"41",X"41",X"41",X"41",X"81",X"C1",X"C1",X"C1",X"C1", + X"C1",X"C1",X"C1",X"41",X"41",X"41",X"41",X"DD",X"7E",X"02",X"C6",X"04",X"E6",X"F8",X"0F",X"0F", + X"E6",X"3F",X"21",X"BC",X"2A",X"DF",X"46",X"3A",X"80",X"A9",X"E6",X"02",X"20",X"0A",X"80",X"FD", + X"77",X"01",X"23",X"7E",X"FD",X"77",X"30",X"C9",X"3E",X"08",X"18",X"F2",X"80",X"DC",X"80",X"DC", + X"80",X"DC",X"80",X"DC",X"81",X"DC",X"81",X"DC",X"82",X"DC",X"83",X"DC",X"84",X"5C",X"84",X"5C", + X"83",X"5C",X"82",X"5C",X"81",X"5C",X"81",X"5C",X"80",X"5C",X"80",X"5C",X"80",X"5C",X"80",X"5C", + X"80",X"5C",X"80",X"5C",X"81",X"5C",X"81",X"5C",X"82",X"5C",X"83",X"5C",X"84",X"DC",X"84",X"DC", + X"83",X"DC",X"82",X"DC",X"81",X"DC",X"81",X"DC",X"80",X"DC",X"80",X"DC",X"11",X"10",X"00",X"DD", + X"7E",X"02",X"C6",X"08",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"21",X"18",X"2B",X"DF",X"7E",X"FD", + X"77",X"01",X"19",X"7E",X"FD",X"77",X"30",X"C9",X"2C",X"2D",X"2E",X"2F",X"28",X"2F",X"2E",X"2D", + X"2C",X"2B",X"2A",X"29",X"28",X"29",X"2A",X"2B",X"5B",X"5B",X"5B",X"5B",X"9B",X"DB",X"DB",X"DB", + X"DB",X"DB",X"DB",X"DB",X"5B",X"5B",X"5B",X"5B",X"3A",X"80",X"A9",X"0F",X"0F",X"E6",X"03",X"C6", + X"D8",X"47",X"DD",X"7E",X"04",X"D6",X"01",X"87",X"87",X"80",X"FD",X"77",X"01",X"FD",X"36",X"30", + X"61",X"C9",X"DD",X"35",X"0E",X"28",X"01",X"C9",X"DD",X"34",X"00",X"DD",X"36",X"0E",X"80",X"C9", + X"FD",X"66",X"31",X"DD",X"6E",X"03",X"ED",X"5B",X"08",X"A8",X"19",X"FD",X"74",X"31",X"DD",X"75", + X"03",X"FD",X"66",X"00",X"DD",X"6E",X"05",X"ED",X"5B",X"0A",X"A8",X"19",X"FD",X"74",X"00",X"DD", + X"75",X"05",X"C9",X"FD",X"7E",X"31",X"C6",X"09",X"FE",X"03",X"D8",X"FD",X"7E",X"00",X"D6",X"03", + X"FE",X"03",X"C9",X"DD",X"7E",X"00",X"FE",X"F0",X"CA",X"AC",X"2B",X"FE",X"3C",X"CC",X"BA",X"2B", + X"D2",X"B4",X"2B",X"DD",X"35",X"00",X"28",X"36",X"CD",X"22",X"2C",X"C9",X"DD",X"36",X"00",X"3B", + X"CD",X"BA",X"2B",X"C9",X"DD",X"35",X"00",X"C3",X"40",X"58",X"CD",X"83",X"56",X"21",X"02",X"AD", + X"7E",X"A7",X"28",X"01",X"35",X"DD",X"7E",X"0E",X"CB",X"7F",X"C8",X"3A",X"12",X"A8",X"A7",X"C8", + X"21",X"11",X"A8",X"35",X"C0",X"DD",X"7E",X"0F",X"C6",X"80",X"32",X"21",X"A8",X"C9",X"AF",X"DD", + X"77",X"00",X"DD",X"77",X"03",X"DD",X"77",X"05",X"FD",X"77",X"00",X"FD",X"77",X"31",X"C9",X"DD", + X"7E",X"01",X"DD",X"96",X"02",X"4F",X"C6",X"02",X"FE",X"04",X"D8",X"DD",X"46",X"02",X"79",X"FE", + X"80",X"30",X"0C",X"21",X"1D",X"2C",X"3A",X"04",X"AD",X"CF",X"80",X"DD",X"77",X"02",X"C9",X"21", + X"1D",X"2C",X"3A",X"04",X"AD",X"CF",X"90",X"ED",X"44",X"DD",X"77",X"02",X"C9",X"01",X"01",X"02", + X"02",X"05",X"21",X"31",X"2C",X"E5",X"DD",X"7E",X"00",X"FE",X"20",X"D2",X"B4",X"2B",X"C3",X"60", + X"2B",X"DD",X"7E",X"00",X"FE",X"2A",X"D2",X"71",X"2C",X"FE",X"0A",X"30",X"45",X"3A",X"21",X"A8", + X"CB",X"7F",X"CA",X"DE",X"2B",X"3A",X"21",X"A8",X"CB",X"BF",X"DD",X"BE",X"0F",X"C2",X"DE",X"2B", + X"3A",X"80",X"A9",X"E6",X"07",X"28",X"03",X"DD",X"34",X"00",X"FD",X"36",X"01",X"FC",X"FD",X"36", + X"30",X"6C",X"DD",X"7E",X"00",X"FE",X"01",X"C0",X"11",X"0C",X"04",X"FF",X"AF",X"32",X"21",X"A8", + X"C9",X"FD",X"7E",X"30",X"4F",X"E6",X"C0",X"47",X"3A",X"80",X"A9",X"E6",X"0F",X"80",X"FD",X"77", + X"30",X"C9",X"D6",X"0A",X"0F",X"E6",X"0F",X"47",X"21",X"94",X"2C",X"CF",X"FD",X"77",X"01",X"FD", + X"36",X"30",X"3C",X"C9",X"FF",X"FF",X"7D",X"7D",X"7E",X"7E",X"7D",X"7D",X"5B",X"5B",X"5A",X"5A", + X"59",X"59",X"58",X"58",X"18",X"A7",X"13",X"A5",X"3B",X"87",X"F1",X"34",X"0E",X"34",X"D7",X"BF", + X"F1",X"65",X"13",X"13",X"13",X"13",X"F1",X"88",X"DC",X"ED",X"11",X"B9",X"DD",X"21",X"00",X"A9", + X"FD",X"21",X"30",X"AA",X"3A",X"04",X"AD",X"A7",X"28",X"2B",X"FE",X"04",X"28",X"34",X"CD",X"21", + X"2D",X"CD",X"36",X"2D",X"CD",X"36",X"2D",X"CD",X"68",X"2D",X"C9",X"CD",X"C2",X"01",X"C0",X"01", + X"04",X"00",X"21",X"80",X"49",X"97",X"AE",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"C6",X"BD",X"C2", + X"11",X"0F",X"C3",X"1A",X"0F",X"CD",X"15",X"2D",X"CD",X"36",X"2D",X"CD",X"36",X"2D",X"CD",X"68", + X"2D",X"C9",X"CD",X"2D",X"2D",X"CD",X"2D",X"2D",X"CD",X"62",X"2D",X"CD",X"62",X"2D",X"CD",X"68", + X"2D",X"CD",X"68",X"2D",X"C9",X"CD",X"6E",X"2D",X"CD",X"58",X"30",X"CD",X"58",X"30",X"C3",X"9B", + X"30",X"CD",X"6E",X"2D",X"CD",X"58",X"30",X"CD",X"8A",X"30",X"C3",X"9B",X"30",X"CD",X"6E",X"2D", + X"CD",X"58",X"30",X"C3",X"9B",X"30",X"CD",X"93",X"2D",X"CD",X"58",X"30",X"C3",X"9B",X"30",X"3A", + X"C0",X"A9",X"A7",X"C2",X"1A",X"0F",X"CD",X"FB",X"4A",X"11",X"08",X"01",X"FF",X"3A",X"17",X"A8", + X"A7",X"C2",X"3E",X"2E",X"CD",X"06",X"0B",X"CD",X"39",X"0B",X"21",X"6B",X"08",X"06",X"14",X"C3", + X"E8",X"43",X"CD",X"93",X"2D",X"C3",X"9B",X"30",X"CD",X"F4",X"2D",X"C3",X"9B",X"30",X"FD",X"56", + X"31",X"DD",X"5E",X"03",X"2A",X"08",X"A8",X"CD",X"31",X"2E",X"FD",X"74",X"31",X"DD",X"75",X"03", + X"FD",X"56",X"00",X"DD",X"5E",X"05",X"2A",X"0A",X"A8",X"CD",X"31",X"2E",X"FD",X"74",X"00",X"DD", + X"75",X"05",X"C9",X"FD",X"56",X"31",X"DD",X"5E",X"03",X"2A",X"08",X"A8",X"CD",X"3E",X"30",X"FD", + X"74",X"31",X"DD",X"75",X"03",X"FD",X"56",X"00",X"DD",X"5E",X"05",X"2A",X"0A",X"A8",X"CD",X"3E", + X"30",X"FD",X"74",X"00",X"DD",X"75",X"05",X"C9",X"21",X"01",X"AD",X"34",X"21",X"04",X"AD",X"7E", + X"3C",X"FE",X"05",X"38",X"01",X"AF",X"77",X"3A",X"01",X"AD",X"FE",X"06",X"38",X"09",X"FE",X"0B", + X"38",X"0A",X"3A",X"D5",X"A9",X"18",X"08",X"3A",X"D3",X"A9",X"18",X"03",X"3A",X"D4",X"A9",X"32", + X"0A",X"AD",X"3A",X"CD",X"A9",X"32",X"02",X"AD",X"AF",X"32",X"0D",X"AD",X"32",X"C6",X"AC",X"3D", + X"32",X"0E",X"AD",X"C9",X"FD",X"56",X"31",X"DD",X"5E",X"03",X"2A",X"08",X"A8",X"CD",X"4D",X"30", + X"FD",X"74",X"31",X"DD",X"75",X"03",X"FD",X"56",X"00",X"DD",X"5E",X"05",X"2A",X"0A",X"A8",X"CD", + X"4D",X"30",X"FD",X"74",X"00",X"DD",X"75",X"05",X"C9",X"32",X"C1",X"A9",X"79",X"0F",X"0F",X"4F", + X"E6",X"01",X"32",X"C2",X"A9",X"79",X"0F",X"4F",X"E6",X"01",X"32",X"C3",X"A9",X"79",X"C3",X"A8", + X"49",X"44",X"4D",X"CB",X"28",X"CB",X"19",X"CB",X"28",X"CB",X"19",X"09",X"19",X"C9",X"32",X"01", + X"31",X"01",X"30",X"01",X"2F",X"01",X"2E",X"01",X"2D",X"01",X"2C",X"01",X"28",X"01",X"26",X"01", + X"24",X"01",X"22",X"01",X"20",X"01",X"1B",X"01",X"18",X"01",X"16",X"01",X"11",X"01",X"0E",X"01", + X"0B",X"01",X"08",X"01",X"03",X"01",X"00",X"01",X"FD",X"00",X"F8",X"00",X"F5",X"00",X"F2",X"00", + X"ED",X"00",X"EA",X"00",X"E7",X"00",X"E4",X"00",X"DF",X"00",X"DC",X"00",X"D9",X"00",X"D4",X"00", + X"D1",X"00",X"CD",X"00",X"C8",X"00",X"C5",X"00",X"C1",X"00",X"BB",X"00",X"B7",X"00",X"B4",X"00", + X"AE",X"00",X"A8",X"00",X"A1",X"00",X"9C",X"00",X"93",X"00",X"90",X"00",X"88",X"00",X"80",X"00", + X"7A",X"00",X"72",X"00",X"69",X"00",X"63",X"00",X"5A",X"00",X"51",X"00",X"4A",X"00",X"40",X"00", + X"37",X"00",X"30",X"00",X"26",X"00",X"1C",X"00",X"12",X"00",X"08",X"00",X"00",X"00",X"00",X"00", + X"F8",X"FF",X"EE",X"FF",X"00",X"00",X"DA",X"FF",X"D0",X"FF",X"C9",X"FF",X"C0",X"FF",X"B6",X"FF", + X"AF",X"FF",X"A6",X"FF",X"9D",X"FF",X"97",X"FF",X"8E",X"FF",X"86",X"FF",X"80",X"FF",X"78",X"FF", + X"70",X"FF",X"6D",X"FF",X"70",X"FF",X"5F",X"FF",X"58",X"FF",X"52",X"FF",X"4C",X"FF",X"49",X"FF", + X"45",X"FF",X"3F",X"FF",X"3B",X"FF",X"38",X"FF",X"33",X"FF",X"2F",X"FF",X"2C",X"FF",X"27",X"FF", + X"24",X"FF",X"21",X"FF",X"21",X"FF",X"19",X"FF",X"16",X"FF",X"13",X"FF",X"0E",X"FF",X"0B",X"FF", + X"08",X"FF",X"03",X"FF",X"00",X"FF",X"FD",X"FE",X"F8",X"FE",X"F5",X"FE",X"F2",X"FE",X"EF",X"FE", + X"EA",X"FE",X"E8",X"FE",X"E5",X"FE",X"E0",X"FE",X"DE",X"FE",X"DC",X"FE",X"DA",X"FE",X"D8",X"FE", + X"D4",X"FE",X"D3",X"FE",X"D2",X"FE",X"D1",X"FE",X"D0",X"FE",X"CF",X"FE",X"CE",X"FE",X"CE",X"FE", + X"CF",X"FE",X"D0",X"FE",X"D1",X"FE",X"D2",X"FE",X"D3",X"FE",X"D4",X"FE",X"D8",X"FE",X"DA",X"FE", + X"DC",X"FE",X"DE",X"FE",X"E0",X"FE",X"E5",X"FE",X"E8",X"FE",X"EA",X"FE",X"EF",X"FE",X"F2",X"FE", + X"F5",X"FE",X"F8",X"FE",X"FD",X"FE",X"00",X"FF",X"03",X"FF",X"08",X"FF",X"0B",X"FF",X"0E",X"FF", + X"13",X"FF",X"16",X"FF",X"19",X"FF",X"1C",X"FF",X"21",X"FF",X"24",X"FF",X"27",X"FF",X"2C",X"FF", + X"2F",X"FF",X"33",X"FF",X"38",X"FF",X"3B",X"FF",X"3F",X"FF",X"45",X"FF",X"49",X"FF",X"4C",X"FF", + X"52",X"FF",X"58",X"FF",X"5F",X"FF",X"64",X"FF",X"6D",X"FF",X"70",X"FF",X"78",X"FF",X"80",X"FF", + X"86",X"FF",X"8E",X"FF",X"97",X"FF",X"9D",X"FF",X"A6",X"FF",X"AF",X"FF",X"B6",X"FF",X"C0",X"FF", + X"C9",X"FF",X"D0",X"FF",X"DA",X"FF",X"E4",X"FF",X"EE",X"FF",X"F8",X"FF",X"00",X"00",X"00",X"00", + X"08",X"00",X"12",X"00",X"1C",X"00",X"26",X"00",X"30",X"00",X"37",X"00",X"40",X"00",X"4A",X"00", + X"51",X"00",X"5A",X"00",X"63",X"00",X"69",X"00",X"72",X"00",X"7A",X"00",X"80",X"00",X"88",X"00", + X"90",X"00",X"93",X"00",X"93",X"00",X"A1",X"00",X"A8",X"00",X"AE",X"00",X"B4",X"00",X"B7",X"00", + X"BB",X"00",X"C1",X"00",X"C5",X"00",X"C8",X"00",X"CD",X"00",X"D1",X"00",X"D4",X"00",X"D9",X"00", + X"DC",X"00",X"DF",X"00",X"DC",X"00",X"E7",X"00",X"EA",X"00",X"ED",X"00",X"F2",X"00",X"F5",X"00", + X"F8",X"00",X"FD",X"00",X"00",X"01",X"03",X"01",X"08",X"01",X"0B",X"01",X"0E",X"01",X"11",X"01", + X"16",X"01",X"18",X"01",X"11",X"01",X"20",X"01",X"22",X"01",X"24",X"01",X"26",X"01",X"28",X"01", + X"2C",X"01",X"2D",X"01",X"2E",X"01",X"2F",X"01",X"30",X"01",X"31",X"01",X"32",X"01",X"44",X"4D", + X"CB",X"28",X"CB",X"19",X"CB",X"28",X"CB",X"19",X"A7",X"ED",X"42",X"19",X"C9",X"44",X"4D",X"CB", + X"28",X"CB",X"19",X"A7",X"ED",X"42",X"19",X"C9",X"FD",X"46",X"31",X"FD",X"4E",X"00",X"3E",X"10", + X"80",X"FD",X"77",X"33",X"FD",X"71",X"02",X"C3",X"9B",X"30",X"FD",X"46",X"31",X"FD",X"4E",X"00", + X"26",X"08",X"2E",X"6E",X"7E",X"81",X"FD",X"70",X"33",X"FD",X"77",X"02",X"C3",X"9B",X"30",X"73", + X"A6",X"10",X"F1",X"D7",X"34",X"A5",X"87",X"BF",X"F1",X"B9",X"FD",X"46",X"31",X"FD",X"4E",X"00", + X"26",X"F0",X"2E",X"10",X"09",X"FD",X"74",X"33",X"FD",X"75",X"02",X"11",X"10",X"00",X"DD",X"19", + X"FD",X"23",X"FD",X"23",X"C9",X"21",X"6B",X"08",X"0E",X"22",X"06",X"10",X"CD",X"4C",X"0B",X"3A", + X"04",X"AD",X"87",X"87",X"87",X"4F",X"21",X"76",X"31",X"DF",X"11",X"31",X"AA",X"06",X"08",X"7E", + X"12",X"23",X"13",X"13",X"10",X"F9",X"3A",X"04",X"AD",X"FE",X"04",X"4F",X"CA",X"56",X"31",X"3E", + X"CC",X"21",X"60",X"AA",X"11",X"02",X"00",X"06",X"08",X"77",X"19",X"10",X"FC",X"79",X"FE",X"04", + X"DA",X"17",X"31",X"21",X"C7",X"AC",X"7E",X"FE",X"3B",X"C2",X"5B",X"31",X"23",X"7E",X"FE",X"05", + X"CA",X"F8",X"30",X"FE",X"10",X"C2",X"5B",X"31",X"06",X"08",X"FD",X"21",X"30",X"AA",X"21",X"5E", + X"31",X"7E",X"FD",X"77",X"31",X"23",X"7E",X"FD",X"77",X"00",X"23",X"FD",X"23",X"FD",X"23",X"10", + X"F0",X"C3",X"BC",X"2C",X"C3",X"7F",X"30",X"21",X"39",X"AD",X"7E",X"FE",X"68",X"C2",X"14",X"31", + X"23",X"7E",X"FE",X"10",X"CA",X"2C",X"31",X"FE",X"05",X"C2",X"14",X"31",X"21",X"6E",X"31",X"06", + X"04",X"FD",X"21",X"30",X"AA",X"7E",X"FD",X"77",X"31",X"C6",X"10",X"FD",X"77",X"33",X"23",X"7E", + X"FD",X"77",X"00",X"FD",X"77",X"02",X"23",X"11",X"10",X"00",X"DD",X"19",X"11",X"04",X"00",X"FD", + X"19",X"10",X"E2",X"C3",X"BC",X"2C",X"3E",X"28",X"C3",X"D1",X"30",X"C3",X"76",X"31",X"40",X"68", + X"38",X"62",X"60",X"70",X"68",X"D8",X"88",X"58",X"99",X"B0",X"37",X"43",X"CF",X"78",X"20",X"D0", + X"50",X"60",X"A0",X"A0",X"D0",X"60",X"60",X"68",X"61",X"60",X"61",X"62",X"63",X"5C",X"74",X"75", + X"76",X"60",X"61",X"64",X"65",X"5D",X"77",X"78",X"79",X"66",X"67",X"64",X"65",X"5E",X"7A",X"7B", + X"7C",X"60",X"61",X"62",X"63",X"5F",X"31",X"30",X"33",X"32",X"85",X"86",X"87",X"85",X"08",X"A7", + X"32",X"CA",X"7E",X"C8",X"FF",X"5F",X"93",X"FB",X"C4",X"AF",X"D8",X"2A",X"6C",X"E1",X"7A",X"42", + X"BD",X"B0",X"5A",X"B9",X"3A",X"05",X"AD",X"4F",X"E6",X"F0",X"28",X"0D",X"FE",X"30",X"C2",X"6C", + X"32",X"3A",X"03",X"49",X"FE",X"30",X"C2",X"C9",X"31",X"79",X"E6",X"0F",X"FE",X"07",X"D0",X"DD", + X"21",X"50",X"A8",X"FD",X"21",X"1A",X"AA",X"87",X"4F",X"06",X"00",X"FD",X"09",X"87",X"87",X"87", + X"4F",X"DD",X"09",X"DD",X"7E",X"00",X"3C",X"C0",X"CD",X"3A",X"32",X"DD",X"7E",X"08",X"FE",X"10", + X"C8",X"FE",X"11",X"28",X"0C",X"87",X"21",X"65",X"AC",X"DF",X"CD",X"B8",X"33",X"DD",X"77",X"01", + X"C9",X"21",X"65",X"AC",X"CD",X"B8",X"33",X"C6",X"80",X"DD",X"77",X"01",X"DD",X"36",X"08",X"10", + X"DD",X"36",X"09",X"00",X"C9",X"CD",X"2B",X"0B",X"AF",X"32",X"31",X"AD",X"32",X"20",X"AD",X"3D", + X"32",X"30",X"AD",X"3A",X"C1",X"A9",X"32",X"10",X"AD",X"21",X"86",X"A9",X"7E",X"D6",X"01",X"27", + X"77",X"CD",X"FB",X"4A",X"CD",X"30",X"4B",X"C3",X"2A",X"17",X"DD",X"7E",X"09",X"A7",X"C8",X"3D", + X"DD",X"77",X"09",X"4F",X"DD",X"7E",X"0A",X"21",X"38",X"34",X"D7",X"EB",X"79",X"CF",X"DD",X"77", + X"08",X"C9",X"01",X"00",X"03",X"21",X"08",X"00",X"1E",X"00",X"7B",X"AE",X"23",X"0B",X"5F",X"79", + X"B0",X"20",X"F7",X"3E",X"52",X"83",X"C2",X"11",X"0F",X"C3",X"1A",X"0F",X"79",X"E6",X"0F",X"FE", + X"07",X"C0",X"DD",X"21",X"64",X"AC",X"3A",X"02",X"A8",X"C6",X"40",X"CD",X"D1",X"59",X"EB",X"29", + X"29",X"29",X"7C",X"C6",X"78",X"DD",X"77",X"10",X"7C",X"ED",X"44",X"C6",X"78",X"DD",X"77",X"14", + X"29",X"7C",X"C6",X"78",X"DD",X"77",X"12",X"7C",X"ED",X"44",X"C6",X"78",X"DD",X"77",X"16",X"60", + X"69",X"29",X"29",X"29",X"7C",X"C6",X"84",X"DD",X"77",X"11",X"7C",X"ED",X"44",X"C6",X"84",X"DD", + X"77",X"15",X"29",X"7C",X"C6",X"84",X"DD",X"77",X"13",X"7C",X"ED",X"44",X"C6",X"84",X"DD",X"77", + X"17",X"3A",X"02",X"A8",X"CD",X"D1",X"59",X"EB",X"29",X"29",X"29",X"7C",X"C6",X"78",X"DD",X"77", + X"18",X"29",X"7C",X"C6",X"78",X"DD",X"77",X"1A",X"60",X"69",X"29",X"29",X"29",X"7C",X"C6",X"84", + X"DD",X"77",X"19",X"29",X"7C",X"C6",X"84",X"DD",X"77",X"1B",X"C9",X"32",X"00",X"C2",X"21",X"EB", + X"A9",X"36",X"0C",X"01",X"00",X"00",X"10",X"FE",X"32",X"00",X"C2",X"0D",X"20",X"F8",X"35",X"20", + X"F2",X"AF",X"CD",X"F8",X"55",X"3A",X"87",X"4C",X"C3",X"A8",X"00",X"21",X"EB",X"A9",X"35",X"C0", + X"CD",X"C3",X"4C",X"D2",X"26",X"33",X"11",X"09",X"03",X"FF",X"1E",X"0B",X"FF",X"3A",X"43",X"08", + X"32",X"AC",X"A9",X"C3",X"E7",X"12",X"CD",X"3A",X"58",X"3E",X"00",X"32",X"0C",X"AD",X"3E",X"F1", + X"32",X"0B",X"AD",X"CD",X"E1",X"01",X"06",X"00",X"21",X"F1",X"01",X"AF",X"86",X"23",X"10",X"FC", + X"D6",X"19",X"C4",X"11",X"0F",X"C3",X"1A",X"0F",X"11",X"A7",X"13",X"68",X"3B",X"34",X"F1",X"68", + X"D7",X"F1",X"DC",X"0F",X"68",X"F1",X"88",X"57",X"A5",X"BF",X"34",X"D7",X"ED",X"B9",X"3A",X"AB", + X"A9",X"21",X"8C",X"17",X"06",X"1E",X"86",X"23",X"10",X"FC",X"C6",X"2C",X"32",X"AB",X"A9",X"3A", + X"32",X"AD",X"A7",X"11",X"1B",X"AD",X"3A",X"14",X"AD",X"28",X"06",X"11",X"2B",X"AD",X"3A",X"24", + X"AD",X"87",X"21",X"8D",X"0F",X"CF",X"12",X"32",X"0B",X"AD",X"23",X"13",X"7E",X"12",X"21",X"0C", + X"AD",X"BE",X"77",X"CC",X"1A",X"0F",X"CD",X"E1",X"01",X"C3",X"1A",X"0F",X"3A",X"32",X"AD",X"A7", + X"11",X"1B",X"AD",X"3A",X"14",X"AD",X"28",X"06",X"11",X"2B",X"AD",X"3A",X"24",X"AD",X"87",X"21", + X"8D",X"0F",X"DF",X"ED",X"A0",X"ED",X"A0",X"C9",X"0E",X"00",X"FD",X"46",X"31",X"5E",X"2D",X"7E", + X"90",X"30",X"04",X"ED",X"44",X"CB",X"C1",X"57",X"FD",X"46",X"00",X"7B",X"90",X"30",X"04",X"ED", + X"44",X"CB",X"C9",X"5F",X"08",X"7B",X"08",X"92",X"28",X"35",X"30",X"02",X"CB",X"D1",X"2E",X"00", + X"CB",X"51",X"20",X"03",X"62",X"18",X"02",X"63",X"5A",X"06",X"08",X"AF",X"ED",X"6A",X"7C",X"38", + X"03",X"BB",X"38",X"03",X"93",X"67",X"AF",X"3F",X"10",X"F2",X"45",X"79",X"21",X"15",X"34",X"DF", + X"78",X"0F",X"0F",X"E6",X"1F",X"CB",X"6E",X"28",X"04",X"47",X"3E",X"1F",X"90",X"86",X"C9",X"21", + X"1D",X"34",X"79",X"CF",X"C9",X"20",X"40",X"C0",X"A0",X"00",X"60",X"E0",X"80",X"20",X"60",X"E0", + X"A0",X"21",X"50",X"0C",X"CD",X"8C",X"01",X"EB",X"5E",X"23",X"56",X"23",X"23",X"3A",X"0C",X"AD", + X"C6",X"05",X"E6",X"0F",X"4F",X"C3",X"FF",X"0B",X"6F",X"34",X"8F",X"34",X"AF",X"34",X"CF",X"34", + X"EF",X"34",X"0F",X"35",X"2F",X"35",X"4F",X"35",X"6F",X"35",X"8F",X"35",X"AF",X"35",X"CF",X"35", + X"EF",X"35",X"0F",X"36",X"2F",X"36",X"4F",X"36",X"6F",X"36",X"8F",X"36",X"11",X"A7",X"13",X"68", + X"3B",X"34",X"F1",X"88",X"57",X"A5",X"BF",X"34",X"D7",X"F1",X"68",X"3B",X"57",X"BF",X"B9",X"11", + X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09", + X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"11", + X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"09", + X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A", + X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"11", + X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B", + X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"11", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"11", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"0D",X"11", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"0C",X"0D",X"11", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"0C",X"0D",X"0D",X"11", + X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09", + X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"10",X"10",X"10",X"11", + X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08", + X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"10",X"10",X"10",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"11", + X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A", + X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"10",X"10",X"10",X"11", + X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B", + X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"0B",X"10",X"10",X"10",X"11", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"11", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"0D",X"10",X"10",X"10",X"11", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"11", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"0D",X"10",X"10",X"10",X"3A", + X"C6",X"AC",X"A7",X"C0",X"3A",X"04",X"AD",X"FE",X"04",X"CA",X"6E",X"38",X"21",X"05",X"AD",X"3A", + X"06",X"AD",X"E6",X"0F",X"FE",X"07",X"CA",X"55",X"38",X"DA",X"BD",X"37",X"FE",X"09",X"DA",X"9F", + X"37",X"7E",X"A7",X"C0",X"CD",X"4B",X"4B",X"0F",X"3A",X"04",X"AD",X"8F",X"21",X"C2",X"AC",X"36", + X"FF",X"23",X"77",X"3A",X"02",X"A8",X"C6",X"08",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"21",X"D9", + X"38",X"DF",X"4E",X"3A",X"C3",X"AC",X"87",X"87",X"87",X"87",X"21",X"7B",X"39",X"DF",X"EB",X"3A", + X"C1",X"AC",X"47",X"3A",X"02",X"AD",X"A7",X"20",X"02",X"06",X"05",X"AF",X"32",X"11",X"A8",X"DD", + X"21",X"50",X"A8",X"FD",X"21",X"1A",X"AA",X"DD",X"7E",X"00",X"A7",X"C2",X"68",X"37",X"1A",X"81", + X"87",X"21",X"E9",X"38",X"CF",X"FD",X"77",X"31",X"23",X"7E",X"FD",X"77",X"00",X"3A",X"02",X"A8", + X"C6",X"80",X"DD",X"77",X"01",X"DD",X"77",X"02",X"CD",X"2D",X"38",X"C6",X"09",X"DD",X"77",X"0A", + X"13",X"1A",X"DD",X"77",X"0E",X"13",X"DD",X"36",X"03",X"00",X"DD",X"36",X"05",X"00",X"DD",X"36", + X"09",X"20",X"D9",X"CD",X"3A",X"32",X"D9",X"DD",X"36",X"00",X"FE",X"DD",X"7E",X"0E",X"A7",X"20", + X"03",X"DD",X"34",X"00",X"21",X"11",X"A8",X"34",X"EB",X"11",X"10",X"00",X"DD",X"19",X"FD",X"23", + X"FD",X"23",X"EB",X"10",X"A2",X"AF",X"32",X"C2",X"AC",X"3E",X"E4",X"32",X"12",X"A8",X"21",X"11", + X"A8",X"7E",X"FE",X"05",X"D2",X"17",X"58",X"21",X"C1",X"AC",X"BE",X"7E",X"32",X"11",X"A8",X"D2", + X"17",X"58",X"C9",X"06",X"05",X"DD",X"21",X"90",X"A8",X"FD",X"21",X"22",X"AA",X"18",X"37",X"7E", + X"A7",X"28",X"03",X"FE",X"30",X"C0",X"21",X"50",X"A8",X"11",X"10",X"00",X"01",X"00",X"07",X"7E", + X"A7",X"28",X"01",X"0C",X"19",X"10",X"F8",X"79",X"FE",X"02",X"D0",X"18",X"07",X"7E",X"A7",X"28", + X"03",X"FE",X"30",X"C0",X"3A",X"02",X"AD",X"A7",X"28",X"C9",X"3A",X"C1",X"AC",X"47",X"DD",X"21", + X"B0",X"A8",X"FD",X"21",X"26",X"AA",X"DD",X"7E",X"00",X"A7",X"C2",X"47",X"38",X"DD",X"35",X"00", + X"3A",X"02",X"A8",X"0F",X"0F",X"E6",X"3F",X"4F",X"CD",X"4B",X"4B",X"E6",X"0F",X"D6",X"08",X"81", + X"E6",X"3F",X"21",X"FB",X"39",X"CF",X"87",X"87",X"21",X"3B",X"3A",X"CF",X"FD",X"77",X"31",X"23", + X"7E",X"FD",X"77",X"00",X"3A",X"02",X"A8",X"C6",X"80",X"DD",X"77",X"01",X"DD",X"77",X"02",X"CD", + X"2D",X"38",X"DD",X"77",X"0A",X"AF",X"32",X"C5",X"AC",X"DD",X"36",X"03",X"00",X"DD",X"36",X"05", + X"00",X"DD",X"36",X"09",X"20",X"CD",X"3A",X"32",X"DD",X"36",X"0E",X"00",X"C9",X"CD",X"4B",X"4B", + X"21",X"C4",X"AC",X"BE",X"30",X"0C",X"21",X"CF",X"A9",X"7E",X"3C",X"FE",X"05",X"38",X"01",X"AF", + X"77",X"C9",X"E6",X"03",X"C6",X"05",X"C9",X"11",X"F0",X"FF",X"DD",X"19",X"FD",X"2B",X"FD",X"2B", + X"05",X"C2",X"D6",X"37",X"C9",X"7E",X"A7",X"C0",X"DD",X"21",X"50",X"A8",X"11",X"10",X"00",X"06", + X"05",X"DD",X"36",X"08",X"11",X"DD",X"36",X"09",X"00",X"DD",X"19",X"10",X"F4",X"C9",X"DD",X"21", + X"50",X"A8",X"FD",X"21",X"1A",X"AA",X"3A",X"C1",X"AC",X"47",X"3A",X"0D",X"AD",X"A7",X"28",X"02", + X"06",X"05",X"C5",X"DD",X"7E",X"00",X"A7",X"C2",X"C0",X"38",X"CD",X"4B",X"4B",X"E6",X"FC",X"21", + X"3B",X"3A",X"CF",X"FD",X"77",X"31",X"23",X"7E",X"FD",X"77",X"00",X"23",X"7E",X"DD",X"77",X"01", + X"DD",X"77",X"02",X"3A",X"C1",X"AC",X"90",X"21",X"D2",X"38",X"CF",X"DD",X"77",X"0A",X"DD",X"36", + X"09",X"20",X"CD",X"3A",X"32",X"DD",X"36",X"04",X"01",X"DD",X"36",X"0E",X"00",X"DD",X"35",X"00", + X"11",X"10",X"00",X"DD",X"19",X"FD",X"23",X"FD",X"23",X"C1",X"10",X"B6",X"3E",X"E4",X"32",X"12", + X"A8",X"C9",X"0A",X"0B",X"0D",X"0E",X"0F",X"09",X"0C",X"08",X"0C",X"0F",X"13",X"16",X"1A",X"1D", + X"21",X"24",X"28",X"2B",X"2F",X"33",X"37",X"3A",X"3D",X"F0",X"10",X"F0",X"20",X"F0",X"30",X"F0", + X"40",X"F0",X"50",X"F0",X"60",X"F0",X"70",X"F0",X"80",X"F0",X"90",X"F0",X"A0",X"F0",X"B0",X"F0", + X"C0",X"F0",X"D0",X"F0",X"E0",X"F0",X"F0",X"E0",X"F8",X"D0",X"F8",X"C0",X"F8",X"B0",X"F8",X"A0", + X"F8",X"90",X"F8",X"80",X"F8",X"70",X"F8",X"60",X"F8",X"50",X"F8",X"40",X"F8",X"30",X"F8",X"20", + X"F8",X"10",X"F8",X"00",X"F0",X"00",X"E0",X"00",X"D0",X"00",X"C0",X"00",X"B0",X"00",X"A0",X"00", + X"90",X"00",X"80",X"00",X"70",X"00",X"60",X"00",X"50",X"00",X"40",X"00",X"30",X"00",X"20",X"00", + X"10",X"10",X"10",X"20",X"10",X"30",X"10",X"40",X"10",X"50",X"10",X"60",X"10",X"70",X"10",X"80", + X"10",X"90",X"10",X"A0",X"10",X"B0",X"10",X"C0",X"10",X"D0",X"10",X"E0",X"10",X"F0",X"10",X"F0", + X"20",X"F0",X"30",X"F0",X"40",X"F0",X"50",X"F0",X"60",X"F0",X"70",X"F0",X"80",X"F0",X"90",X"F0", + X"A0",X"F0",X"B0",X"F0",X"C0",X"F0",X"D0",X"F0",X"E0",X"F0",X"F0",X"00",X"01",X"01",X"11",X"FF", + X"11",X"02",X"21",X"FE",X"21",X"03",X"31",X"FD",X"31",X"00",X"00",X"00",X"11",X"01",X"01",X"FF", + X"01",X"02",X"11",X"FE",X"11",X"03",X"21",X"FD",X"21",X"00",X"00",X"00",X"01",X"02",X"11",X"FE", + X"11",X"03",X"21",X"FD",X"21",X"04",X"31",X"FC",X"31",X"00",X"00",X"00",X"31",X"03",X"01",X"FD", + X"01",X"04",X"11",X"FC",X"11",X"03",X"11",X"FD",X"11",X"00",X"00",X"00",X"01",X"03",X"01",X"FD", + X"01",X"04",X"11",X"FC",X"11",X"05",X"21",X"FB",X"21",X"00",X"00",X"00",X"01",X"03",X"11",X"FD", + X"11",X"00",X"21",X"03",X"21",X"FD",X"21",X"00",X"31",X"00",X"00",X"03",X"01",X"FD",X"01",X"03", + X"11",X"FD",X"11",X"05",X"11",X"FB",X"11",X"00",X"29",X"00",X"00",X"00",X"01",X"03",X"11",X"FD", + X"11",X"05",X"21",X"FB",X"21",X"03",X"31",X"FD",X"31",X"00",X"00",X"08",X"09",X"0A",X"0B",X"0C", + X"0D",X"0D",X"0E",X"0F",X"10",X"11",X"12",X"13",X"14",X"14",X"15",X"16",X"17",X"18",X"19",X"1A", + X"1B",X"1B",X"1C",X"1D",X"1E",X"1F",X"20",X"21",X"22",X"22",X"23",X"24",X"25",X"26",X"27",X"28", + X"29",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"30",X"31",X"32",X"33",X"34",X"35",X"36",X"37", + X"38",X"38",X"39",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"F0",X"10",X"60",X"00",X"F0", + X"20",X"80",X"00",X"F0",X"30",X"80",X"00",X"F0",X"40",X"80",X"00",X"F0",X"50",X"80",X"00",X"F0", + X"60",X"80",X"00",X"F0",X"70",X"80",X"00",X"F0",X"80",X"80",X"00",X"F0",X"90",X"80",X"00",X"F0", + X"A0",X"80",X"00",X"F0",X"B0",X"80",X"00",X"F0",X"C0",X"80",X"00",X"F0",X"D0",X"80",X"00",X"F0", + X"E0",X"80",X"00",X"F0",X"F0",X"A0",X"00",X"E0",X"F8",X"C0",X"00",X"D0",X"F8",X"C0",X"00",X"C0", + X"F8",X"C0",X"00",X"B0",X"F8",X"C0",X"00",X"A0",X"F8",X"C0",X"00",X"90",X"F8",X"C0",X"00",X"80", + X"F8",X"C0",X"00",X"70",X"F8",X"C0",X"00",X"60",X"F8",X"C0",X"00",X"50",X"F8",X"C0",X"00",X"40", + X"F8",X"C0",X"00",X"30",X"F8",X"C0",X"00",X"20",X"F8",X"C0",X"00",X"10",X"F8",X"C0",X"00",X"00", + X"F0",X"E0",X"00",X"00",X"E0",X"00",X"00",X"00",X"D0",X"00",X"00",X"00",X"C0",X"00",X"00",X"00", + X"B0",X"00",X"00",X"00",X"A0",X"00",X"00",X"00",X"90",X"00",X"00",X"00",X"80",X"00",X"00",X"00", + X"70",X"00",X"00",X"00",X"60",X"00",X"00",X"00",X"50",X"00",X"00",X"00",X"40",X"00",X"00",X"00", + X"30",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"10",X"20",X"00",X"10",X"10",X"40",X"00",X"20", + X"10",X"40",X"00",X"30",X"10",X"40",X"00",X"40",X"10",X"40",X"00",X"50",X"10",X"40",X"00",X"60", + X"10",X"40",X"00",X"70",X"10",X"40",X"00",X"80",X"10",X"40",X"00",X"90",X"10",X"40",X"00",X"A0", + X"10",X"40",X"00",X"B0",X"10",X"40",X"00",X"C0",X"10",X"40",X"00",X"D0",X"10",X"40",X"00",X"E0", + X"10",X"40",X"00",X"F0",X"10",X"60",X"00",X"F0",X"20",X"80",X"00",X"F0",X"30",X"80",X"00",X"F0", + X"40",X"80",X"00",X"F0",X"50",X"80",X"00",X"F0",X"60",X"80",X"00",X"F0",X"70",X"80",X"00",X"F0", + X"80",X"80",X"00",X"F0",X"90",X"80",X"00",X"F0",X"A0",X"80",X"00",X"F0",X"B0",X"80",X"00",X"F0", + X"C0",X"80",X"00",X"F0",X"D0",X"80",X"00",X"F0",X"E0",X"80",X"00",X"F0",X"F0",X"A0",X"00",X"3A", + X"04",X"AD",X"3D",X"C0",X"DD",X"21",X"C0",X"A8",X"FD",X"21",X"28",X"AA",X"DD",X"7E",X"00",X"A7", + X"CA",X"25",X"3C",X"3C",X"C2",X"94",X"3B",X"CD",X"05",X"3E",X"FD",X"7E",X"31",X"C6",X"10",X"FD", + X"77",X"33",X"FD",X"7E",X"00",X"FD",X"77",X"02",X"CD",X"C4",X"3C",X"DA",X"0D",X"3C",X"CD",X"E9", + X"3C",X"C3",X"25",X"3D",X"3D",X"4F",X"21",X"DC",X"A8",X"7E",X"A7",X"CA",X"A9",X"3B",X"35",X"DD", + X"36",X"00",X"FF",X"CD",X"83",X"56",X"C3",X"77",X"3B",X"79",X"FE",X"61",X"38",X"0F",X"DD",X"36", + X"00",X"61",X"CD",X"83",X"56",X"FD",X"36",X"30",X"3D",X"FD",X"36",X"32",X"3D",X"DD",X"35",X"00", + X"28",X"4B",X"CD",X"60",X"2B",X"FD",X"7E",X"31",X"C6",X"10",X"FD",X"77",X"33",X"FD",X"7E",X"00", + X"FD",X"77",X"02",X"DD",X"7E",X"00",X"D6",X"40",X"CA",X"F1",X"3B",X"D8",X"4F",X"E6",X"07",X"C0", + X"79",X"0F",X"0F",X"0F",X"3D",X"21",X"09",X"3C",X"CF",X"FD",X"77",X"03",X"3C",X"FD",X"77",X"01", + X"C9",X"11",X"0B",X"04",X"FF",X"FD",X"36",X"03",X"FA",X"FD",X"36",X"01",X"FB",X"FD",X"36",X"30", + X"6C",X"FD",X"36",X"32",X"6C",X"DD",X"35",X"00",X"C9",X"96",X"94",X"92",X"90",X"AF",X"DD",X"77", + X"00",X"DD",X"77",X"10",X"FD",X"77",X"00",X"FD",X"77",X"31",X"32",X"5B",X"AA",X"32",X"2A",X"AA", + X"DD",X"36",X"0E",X"80",X"C9",X"3A",X"80",X"A9",X"E6",X"01",X"C0",X"DD",X"35",X"0E",X"CA",X"32", + X"3C",X"C9",X"3A",X"0D",X"AD",X"A7",X"C0",X"3A",X"02",X"A8",X"47",X"C6",X"08",X"E6",X"7F",X"FE", + X"10",X"38",X"32",X"78",X"0F",X"0F",X"E6",X"3E",X"21",X"84",X"3C",X"CF",X"FD",X"77",X"31",X"23", + X"7E",X"FD",X"77",X"00",X"78",X"C6",X"C0",X"E6",X"80",X"DD",X"77",X"02",X"CD",X"42",X"59",X"DD", + X"73",X"0A",X"DD",X"72",X"0B",X"DD",X"71",X"0C",X"DD",X"70",X"0D",X"3E",X"03",X"32",X"DC",X"A8", + X"DD",X"36",X"00",X"FF",X"C9",X"3A",X"80",X"A9",X"4F",X"3E",X"10",X"CB",X"59",X"20",X"02",X"ED", + X"44",X"80",X"18",X"C0",X"EC",X"80",X"EC",X"88",X"EC",X"90",X"EC",X"A0",X"EC",X"B0",X"EC",X"C0", + X"EC",X"D0",X"EC",X"E0",X"F0",X"EC",X"F0",X"EC",X"F0",X"E0",X"F0",X"D0",X"F0",X"C0",X"F0",X"B0", + X"F0",X"A0",X"F0",X"90",X"F0",X"80",X"F0",X"78",X"F0",X"70",X"F0",X"60",X"F0",X"50",X"F0",X"40", + X"F0",X"30",X"F0",X"28",X"F0",X"20",X"EC",X"20",X"EC",X"30",X"EC",X"40",X"EC",X"50",X"EC",X"60", + X"EC",X"70",X"EC",X"78",X"DD",X"7E",X"02",X"C6",X"40",X"CB",X"7F",X"C2",X"D9",X"3C",X"FD",X"7E", + X"31",X"C6",X"13",X"FE",X"03",X"D8",X"C3",X"E1",X"3C",X"FD",X"7E",X"31",X"C6",X"10",X"FE",X"03", + X"D8",X"FD",X"7E",X"00",X"C6",X"02",X"FE",X"04",X"C9",X"3A",X"80",X"A9",X"E6",X"02",X"47",X"3A", + X"DC",X"A8",X"4F",X"3E",X"03",X"91",X"87",X"87",X"C6",X"A0",X"80",X"4F",X"DD",X"7E",X"02",X"C6", + X"40",X"FE",X"80",X"38",X"10",X"FD",X"71",X"01",X"0C",X"FD",X"71",X"03",X"FD",X"36",X"30",X"ED", + X"FD",X"36",X"32",X"ED",X"C9",X"FD",X"71",X"03",X"0C",X"FD",X"71",X"01",X"FD",X"36",X"30",X"6D", + X"FD",X"36",X"32",X"6D",X"C9",X"DD",X"7E",X"00",X"3C",X"C0",X"3A",X"F4",X"A8",X"A7",X"C0",X"3A", + X"C6",X"A8",X"A7",X"C8",X"FE",X"01",X"CA",X"40",X"3D",X"3A",X"E0",X"A8",X"A7",X"CA",X"45",X"3D", + X"3A",X"40",X"A8",X"A7",X"C0",X"06",X"02",X"3A",X"D6",X"A8",X"57",X"87",X"5F",X"3E",X"84",X"FD", + X"96",X"00",X"82",X"BB",X"D2",X"6F",X"3D",X"3E",X"78",X"FD",X"96",X"31",X"82",X"BB",X"D2",X"6F", + X"3D",X"D9",X"11",X"10",X"00",X"DD",X"19",X"FD",X"23",X"FD",X"23",X"D9",X"10",X"DF",X"C9",X"CD", + X"5F",X"56",X"21",X"7F",X"AC",X"CD",X"B8",X"33",X"67",X"3E",X"18",X"EB",X"21",X"D4",X"A8",X"34", + X"46",X"CB",X"40",X"20",X"02",X"ED",X"44",X"EB",X"84",X"08",X"FD",X"46",X"31",X"FD",X"4E",X"00", + X"3A",X"C6",X"A8",X"FE",X"01",X"CA",X"9F",X"3D",X"3A",X"E0",X"A8",X"A7",X"CA",X"CF",X"3D",X"DD", + X"21",X"40",X"A8",X"FD",X"21",X"18",X"AA",X"FD",X"70",X"31",X"FD",X"71",X"00",X"08",X"CD",X"C5", + X"59",X"DD",X"73",X"0A",X"DD",X"72",X"0B",X"DD",X"71",X"0C",X"DD",X"70",X"0D",X"FD",X"36",X"01", + X"4D",X"FD",X"36",X"30",X"62",X"DD",X"35",X"00",X"3A",X"F6",X"A8",X"32",X"F4",X"A8",X"C9",X"DD", + X"21",X"E0",X"A8",X"FD",X"21",X"2C",X"AA",X"C3",X"A7",X"3D",X"3A",X"04",X"AD",X"3D",X"C0",X"DD", + X"21",X"E0",X"A8",X"FD",X"21",X"2C",X"AA",X"CD",X"EB",X"3D",X"C9",X"DD",X"7E",X"00",X"A7",X"C8", + X"3C",X"C2",X"FB",X"3D",X"CD",X"05",X"3E",X"CD",X"83",X"2B",X"D0",X"CD",X"AB",X"40",X"3A",X"F6", + X"A8",X"DD",X"77",X"0E",X"C9",X"DD",X"66",X"0B",X"DD",X"6E",X"0A",X"ED",X"5B",X"08",X"A8",X"19", + X"FD",X"56",X"31",X"DD",X"5E",X"03",X"19",X"FD",X"74",X"31",X"DD",X"75",X"03",X"DD",X"66",X"0D", + X"DD",X"6E",X"0C",X"ED",X"5B",X"0A",X"A8",X"19",X"FD",X"56",X"00",X"DD",X"5E",X"05",X"19",X"FD", + X"74",X"00",X"DD",X"75",X"05",X"C9",X"DD",X"21",X"10",X"A8",X"FD",X"21",X"12",X"AA",X"CD",X"63", + X"3E",X"DD",X"21",X"20",X"A8",X"FD",X"21",X"14",X"AA",X"CD",X"63",X"3E",X"DD",X"21",X"30",X"A8", + X"FD",X"21",X"16",X"AA",X"CD",X"63",X"3E",X"DD",X"21",X"40",X"A8",X"FD",X"21",X"18",X"AA",X"CD", + X"63",X"3E",X"C9",X"DD",X"7E",X"00",X"A7",X"C8",X"3C",X"C2",X"8E",X"3E",X"3A",X"04",X"AD",X"FE", + X"04",X"CC",X"7E",X"3E",X"CD",X"05",X"3E",X"CD",X"83",X"2B",X"D0",X"C3",X"AB",X"40",X"3A",X"80", + X"A9",X"0F",X"E6",X"07",X"C6",X"40",X"FD",X"77",X"01",X"FD",X"36",X"30",X"44",X"C9",X"3A",X"04", + X"AD",X"FE",X"04",X"28",X"03",X"C3",X"AB",X"40",X"DD",X"7E",X"00",X"FE",X"01",X"CA",X"AB",X"40", + X"DD",X"35",X"00",X"FE",X"3C",X"D4",X"CB",X"3E",X"CD",X"60",X"2B",X"DD",X"7E",X"00",X"FE",X"1C", + X"D8",X"D6",X"1C",X"0F",X"0F",X"E6",X"07",X"21",X"C3",X"3E",X"CF",X"FD",X"77",X"01",X"FD",X"36", + X"30",X"03",X"C9",X"FF",X"E6",X"E7",X"E7",X"E6",X"E6",X"E5",X"E4",X"DD",X"36",X"00",X"3B",X"C3", + X"83",X"56",X"92",X"A6",X"14",X"B9",X"3A",X"80",X"A9",X"E6",X"07",X"C6",X"05",X"DD",X"BE",X"0F", + X"C0",X"3A",X"17",X"A8",X"A7",X"C0",X"21",X"10",X"A8",X"11",X"12",X"AA",X"3A",X"44",X"A8",X"A7", + X"C8",X"47",X"7E",X"A7",X"28",X"09",X"7D",X"C6",X"10",X"6F",X"1C",X"1C",X"10",X"F4",X"C9",X"22", + X"91",X"A9",X"ED",X"53",X"93",X"A9",X"3A",X"27",X"A8",X"47",X"87",X"4F",X"3E",X"78",X"FD",X"96", + X"31",X"80",X"B9",X"30",X"08",X"3E",X"84",X"FD",X"96",X"00",X"80",X"B9",X"D8",X"3A",X"37",X"A8", + X"47",X"87",X"4F",X"3A",X"02",X"A8",X"DD",X"96",X"02",X"80",X"B9",X"D0",X"7A",X"FE",X"02",X"CA", + X"9E",X"3F",X"21",X"7F",X"AC",X"CD",X"B8",X"33",X"4F",X"DD",X"96",X"02",X"C6",X"10",X"FE",X"20", + X"D0",X"CD",X"93",X"3F",X"DD",X"E5",X"FD",X"E5",X"FD",X"56",X"31",X"FD",X"5E",X"00",X"DD",X"2A", + X"91",X"A9",X"FD",X"2A",X"93",X"A9",X"FD",X"72",X"31",X"FD",X"73",X"00",X"3A",X"04",X"AD",X"A7", + X"79",X"20",X"05",X"CD",X"CB",X"59",X"18",X"03",X"CD",X"D1",X"59",X"DD",X"73",X"0A",X"DD",X"72", + X"0B",X"DD",X"71",X"0C",X"DD",X"70",X"0D",X"FD",X"7E",X"31",X"FD",X"7E",X"00",X"FD",X"36",X"01", + X"4D",X"FD",X"36",X"30",X"62",X"3A",X"14",X"A8",X"32",X"17",X"A8",X"DD",X"35",X"00",X"FD",X"E1", + X"DD",X"E1",X"C9",X"3A",X"04",X"AD",X"FE",X"03",X"DA",X"5F",X"56",X"C3",X"69",X"56",X"3A",X"E6", + X"A8",X"47",X"87",X"4F",X"3E",X"84",X"FD",X"96",X"00",X"80",X"B9",X"D0",X"C3",X"32",X"3F",X"DD", + X"7E",X"02",X"C6",X"08",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"21",X"CA",X"3F",X"CF",X"FD",X"77", + X"01",X"11",X"10",X"00",X"19",X"7E",X"FD",X"77",X"30",X"C9",X"48",X"49",X"4A",X"4B",X"4C",X"4B", + X"4A",X"49",X"48",X"49",X"4A",X"4B",X"4C",X"4B",X"4A",X"49",X"F4",X"B4",X"B4",X"B4",X"B4",X"34", + X"34",X"34",X"34",X"74",X"74",X"74",X"74",X"F4",X"F4",X"F4",X"3A",X"04",X"AD",X"A7",X"C0",X"DD", + X"21",X"C0",X"A8",X"FD",X"21",X"28",X"AA",X"06",X"03",X"DD",X"7E",X"00",X"A7",X"CA",X"0B",X"40", + X"3C",X"20",X"05",X"CD",X"17",X"40",X"18",X"03",X"CD",X"6C",X"40",X"11",X"10",X"00",X"DD",X"19", + X"FD",X"23",X"FD",X"23",X"10",X"E3",X"C9",X"FD",X"56",X"31",X"DD",X"5E",X"03",X"DD",X"7E",X"01", + X"A7",X"28",X"05",X"21",X"80",X"FE",X"18",X"03",X"21",X"80",X"01",X"19",X"ED",X"5B",X"08",X"A8", + X"19",X"FD",X"74",X"31",X"DD",X"75",X"03",X"DD",X"6E",X"07",X"DD",X"66",X"08",X"11",X"09",X"00", + X"19",X"DD",X"75",X"07",X"DD",X"74",X"08",X"FD",X"56",X"00",X"DD",X"5E",X"05",X"19",X"ED",X"5B", + X"0A",X"A8",X"19",X"FD",X"74",X"00",X"DD",X"75",X"05",X"FD",X"7E",X"31",X"C6",X"10",X"FE",X"20", + X"DA",X"AB",X"40",X"FD",X"7E",X"00",X"FE",X"F8",X"D2",X"AB",X"40",X"C9",X"DD",X"7E",X"00",X"FE", + X"3C",X"D4",X"9D",X"40",X"DD",X"35",X"00",X"28",X"32",X"CD",X"60",X"2B",X"DD",X"7E",X"00",X"FE", + X"1C",X"D8",X"D6",X"1C",X"0F",X"0F",X"E6",X"0F",X"21",X"94",X"40",X"CF",X"FD",X"77",X"01",X"FD", + X"36",X"30",X"0E",X"C9",X"FF",X"9A",X"99",X"98",X"98",X"99",X"99",X"9A",X"9B",X"DD",X"36",X"00", + X"3B",X"3A",X"04",X"AD",X"A7",X"CA",X"8E",X"56",X"C3",X"8E",X"56",X"DD",X"36",X"00",X"00",X"FD", + X"36",X"00",X"00",X"FD",X"36",X"31",X"00",X"C9",X"3A",X"04",X"AD",X"FE",X"02",X"D8",X"3A",X"80", + X"A9",X"E6",X"1F",X"C0",X"3A",X"C0",X"A8",X"3C",X"C8",X"3A",X"D0",X"A8",X"3C",X"C8",X"3A",X"E0", + X"A8",X"3C",X"C8",X"C3",X"79",X"56",X"3A",X"04",X"AD",X"FE",X"02",X"D8",X"DD",X"21",X"C0",X"A8", + X"FD",X"21",X"28",X"AA",X"3A",X"C6",X"A8",X"A7",X"C8",X"47",X"DD",X"7E",X"00",X"A7",X"CA",X"0B", + X"41",X"3C",X"20",X"14",X"3A",X"04",X"AD",X"FE",X"04",X"CA",X"94",X"41",X"DD",X"7E",X"0E",X"A7", + X"C2",X"8B",X"41",X"CD",X"17",X"41",X"18",X"03",X"CD",X"3C",X"41",X"11",X"10",X"00",X"DD",X"19", + X"FD",X"23",X"FD",X"23",X"10",X"D4",X"C9",X"C5",X"3A",X"80",X"A9",X"E6",X"0F",X"DD",X"BE",X"0F", + X"20",X"09",X"21",X"7F",X"AC",X"CD",X"B8",X"33",X"DD",X"77",X"01",X"CD",X"01",X"42",X"CD",X"AA", + X"58",X"CD",X"AF",X"3F",X"C1",X"CD",X"83",X"2B",X"D0",X"C3",X"AB",X"40",X"DD",X"7E",X"00",X"FE", + X"3C",X"D4",X"9D",X"40",X"CD",X"60",X"2B",X"DD",X"35",X"00",X"CA",X"AB",X"40",X"DD",X"7E",X"00", + X"FE",X"1C",X"D8",X"D6",X"1C",X"0F",X"0F",X"E6",X"07",X"57",X"3A",X"04",X"AD",X"FE",X"04",X"30", + X"15",X"21",X"6E",X"41",X"7A",X"CF",X"FD",X"77",X"01",X"FD",X"36",X"30",X"0D",X"C9",X"FF",X"9E", + X"9F",X"9F",X"9E",X"9E",X"9D",X"9C",X"21",X"83",X"41",X"7A",X"CF",X"FD",X"77",X"01",X"FD",X"36", + X"30",X"02",X"C9",X"FF",X"E2",X"E3",X"E3",X"E2",X"E2",X"E1",X"E0",X"CD",X"6C",X"3E",X"DD",X"35", + X"0E",X"C3",X"0B",X"41",X"DD",X"7E",X"04",X"A7",X"CA",X"A4",X"41",X"DD",X"35",X"04",X"CD",X"B8", + X"41",X"C3",X"0B",X"41",X"C5",X"CD",X"B6",X"58",X"CD",X"F1",X"41",X"CD",X"83",X"2B",X"C1",X"D2", + X"0B",X"41",X"CD",X"AB",X"40",X"C3",X"0B",X"41",X"C5",X"3A",X"80",X"A9",X"E6",X"0F",X"20",X"1F", + X"21",X"75",X"AC",X"DD",X"CB",X"0F",X"46",X"20",X"03",X"21",X"79",X"AC",X"CD",X"B8",X"33",X"47", + X"7A",X"FE",X"10",X"30",X"07",X"08",X"FE",X"10",X"DC",X"EC",X"41",X"08",X"DD",X"70",X"01",X"CD", + X"1F",X"42",X"CD",X"B6",X"58",X"CD",X"F1",X"41",X"C1",X"C3",X"83",X"2B",X"DD",X"36",X"04",X"00", + X"C9",X"3A",X"80",X"A9",X"0F",X"E6",X"07",X"C6",X"50",X"FD",X"77",X"01",X"FD",X"36",X"30",X"0A", + X"C9",X"DD",X"7E",X"01",X"DD",X"96",X"02",X"C6",X"01",X"FE",X"02",X"D8",X"FE",X"80",X"DD",X"7E", + X"02",X"30",X"06",X"C6",X"01",X"DD",X"77",X"02",X"C9",X"D6",X"01",X"DD",X"77",X"02",X"C9",X"3A", + X"80",X"A9",X"E6",X"03",X"C8",X"DD",X"7E",X"01",X"DD",X"96",X"02",X"C6",X"01",X"FE",X"02",X"D8", + X"FE",X"80",X"DD",X"7E",X"02",X"30",X"06",X"C6",X"02",X"DD",X"77",X"02",X"C9",X"D6",X"02",X"DD", + X"77",X"02",X"C9",X"3A",X"80",X"A9",X"E6",X"07",X"C6",X"05",X"DD",X"BE",X"0F",X"C0",X"21",X"F4", + X"A8",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"21",X"C0",X"A8",X"11",X"28",X"AA",X"3A",X"C6",X"A8", + X"A7",X"C8",X"47",X"7E",X"A7",X"CA",X"71",X"42",X"7D",X"C6",X"10",X"6F",X"13",X"13",X"10",X"F3", + X"C9",X"22",X"91",X"A9",X"ED",X"53",X"93",X"A9",X"3A",X"D6",X"A8",X"57",X"87",X"4F",X"3E",X"78", + X"FD",X"96",X"31",X"82",X"B9",X"30",X"08",X"3E",X"84",X"FD",X"96",X"00",X"82",X"B9",X"D8",X"DD", + X"4E",X"02",X"3A",X"04",X"AD",X"A7",X"CA",X"9C",X"42",X"C3",X"B7",X"42",X"3A",X"E6",X"A8",X"57", + X"87",X"4F",X"3E",X"84",X"FD",X"96",X"00",X"82",X"B9",X"D0",X"3E",X"78",X"FD",X"96",X"31",X"38", + X"04",X"0E",X"00",X"18",X"02",X"0E",X"01",X"FD",X"56",X"31",X"DD",X"5E",X"03",X"FD",X"66",X"00", + X"DD",X"6E",X"05",X"D9",X"DD",X"E5",X"FD",X"E5",X"DD",X"2A",X"91",X"A9",X"FD",X"2A",X"93",X"A9", + X"D9",X"DD",X"73",X"03",X"FD",X"72",X"31",X"DD",X"75",X"05",X"FD",X"74",X"00",X"DD",X"71",X"01", + X"3A",X"04",X"AD",X"FE",X"04",X"CA",X"AE",X"43",X"A7",X"C2",X"13",X"43",X"FD",X"36",X"01",X"4F", + X"79",X"0F",X"CB",X"2F",X"E6",X"C0",X"C6",X"0B",X"FD",X"77",X"30",X"DD",X"36",X"07",X"00",X"DD", + X"36",X"08",X"FF",X"DD",X"35",X"00",X"3A",X"F6",X"A8",X"32",X"F4",X"A8",X"FD",X"E1",X"DD",X"E1", + X"C3",X"64",X"56",X"3A",X"04",X"AD",X"FE",X"03",X"CA",X"6F",X"43",X"D2",X"4C",X"43",X"21",X"7F", + X"AC",X"CD",X"B8",X"33",X"DD",X"77",X"01",X"DD",X"7E",X"0F",X"0F",X"E6",X"80",X"C6",X"40",X"DD", + X"86",X"01",X"DD",X"77",X"02",X"CD",X"AF",X"3F",X"DD",X"35",X"00",X"3A",X"F6",X"A8",X"32",X"F4", + X"A8",X"DD",X"36",X"0E",X"00",X"FD",X"E1",X"DD",X"E1",X"C3",X"6E",X"56",X"21",X"7F",X"AC",X"CD", + X"B8",X"33",X"DD",X"77",X"01",X"DD",X"77",X"02",X"CD",X"AF",X"3F",X"DD",X"35",X"00",X"3A",X"F6", + X"A8",X"32",X"F4",X"A8",X"DD",X"36",X"0E",X"00",X"FD",X"E1",X"DD",X"E1",X"C3",X"74",X"56",X"C5", + X"79",X"C6",X"40",X"E6",X"80",X"79",X"20",X"07",X"C6",X"1A",X"DD",X"77",X"02",X"18",X"05",X"D6", + X"1A",X"DD",X"77",X"02",X"CD",X"8E",X"59",X"DD",X"73",X"0A",X"DD",X"72",X"0B",X"DD",X"71",X"0C", + X"DD",X"70",X"0D",X"C1",X"DD",X"71",X"02",X"CD",X"AF",X"3F",X"DD",X"36",X"0E",X"20",X"DD",X"35", + X"00",X"3A",X"F6",X"A8",X"32",X"F4",X"A8",X"FD",X"E1",X"DD",X"E1",X"C3",X"6E",X"56",X"3A",X"E6", + X"A8",X"DD",X"77",X"04",X"C3",X"13",X"43",X"3A",X"C6",X"AC",X"3C",X"C8",X"3A",X"0D",X"AD",X"A7", + X"20",X"2E",X"3A",X"80",X"A9",X"E6",X"07",X"FE",X"05",X"C0",X"DD",X"21",X"A0",X"A8",X"FD",X"21", + X"24",X"AA",X"3A",X"02",X"AD",X"DD",X"B6",X"00",X"DD",X"B6",X"10",X"C0",X"3E",X"FF",X"32",X"0D", + X"AD",X"DD",X"36",X"04",X"07",X"C3",X"DB",X"46",X"AF",X"86",X"23",X"10",X"FC",X"C3",X"AD",X"07", + X"DD",X"21",X"A0",X"A8",X"FD",X"21",X"24",X"AA",X"DD",X"7E",X"00",X"A7",X"CA",X"35",X"45",X"3C", + X"C2",X"40",X"45",X"DD",X"66",X"0C",X"DD",X"6E",X"0D",X"ED",X"5B",X"08",X"A8",X"19",X"FD",X"56", + X"31",X"DD",X"5E",X"03",X"19",X"FD",X"74",X"31",X"DD",X"75",X"03",X"DD",X"66",X"1C",X"DD",X"6E", + X"1D",X"ED",X"5B",X"0A",X"A8",X"19",X"FD",X"56",X"00",X"DD",X"5E",X"05",X"19",X"FD",X"74",X"00", + X"DD",X"75",X"05",X"FD",X"7E",X"31",X"C6",X"10",X"FD",X"77",X"33",X"FD",X"7E",X"00",X"FD",X"77", + X"02",X"CD",X"47",X"44",X"C3",X"F0",X"46",X"CD",X"C4",X"3C",X"DA",X"DB",X"46",X"3A",X"04",X"AD", + X"57",X"FE",X"04",X"CA",X"A2",X"44",X"7A",X"87",X"87",X"87",X"87",X"47",X"3A",X"80",X"A9",X"E6", + X"02",X"80",X"47",X"3E",X"07",X"DD",X"96",X"04",X"0F",X"E6",X"03",X"5F",X"87",X"87",X"80",X"21", + X"F1",X"44",X"DF",X"46",X"23",X"4E",X"21",X"31",X"45",X"7A",X"DF",X"56",X"DD",X"7E",X"02",X"C6", + X"40",X"FE",X"80",X"38",X"10",X"FD",X"70",X"01",X"FD",X"71",X"03",X"7A",X"C6",X"80",X"FD",X"77", + X"30",X"FD",X"77",X"32",X"C9",X"FD",X"71",X"01",X"FD",X"70",X"03",X"FD",X"72",X"30",X"FD",X"72", + X"32",X"C9",X"DD",X"7E",X"04",X"5F",X"FE",X"07",X"CA",X"BF",X"44",X"DD",X"34",X"06",X"DD",X"4E", + X"06",X"CB",X"79",X"20",X"14",X"7B",X"C6",X"02",X"B9",X"30",X"04",X"DD",X"36",X"06",X"80",X"FD", + X"36",X"30",X"70",X"FD",X"36",X"32",X"70",X"18",X"13",X"79",X"E6",X"7F",X"FE",X"03",X"38",X"04", + X"DD",X"36",X"06",X"00",X"FD",X"36",X"30",X"51",X"FD",X"36",X"32",X"51",X"11",X"02",X"02",X"21", + X"D5",X"D4",X"3A",X"80",X"A9",X"CB",X"57",X"20",X"01",X"19",X"FD",X"75",X"01",X"FD",X"74",X"03", + X"C9",X"39",X"38",X"39",X"38",X"3B",X"3A",X"3D",X"3C",X"3B",X"3A",X"3D",X"3C",X"3D",X"3C",X"3F", + X"3E",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD",X"BE", + X"BF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"C6",X"C7",X"C8",X"C9",X"C8",X"C9",X"CA", + X"CB",X"CC",X"CD",X"CC",X"CD",X"CE",X"CF",X"D0",X"D1",X"CE",X"CF",X"D0",X"D1",X"D0",X"D1",X"D2", + X"D3",X"E9",X"58",X"6F",X"6E",X"DD",X"7E",X"0E",X"A7",X"CA",X"63",X"46",X"DD",X"35",X"0E",X"C9", + X"4F",X"DD",X"7E",X"04",X"A7",X"28",X"0D",X"DD",X"35",X"04",X"DD",X"36",X"00",X"FF",X"CD",X"83", + X"56",X"C3",X"03",X"44",X"79",X"FE",X"F0",X"C2",X"B3",X"45",X"AF",X"32",X"DC",X"A8",X"CD",X"34", + X"56",X"CD",X"D2",X"56",X"21",X"10",X"A8",X"11",X"10",X"00",X"06",X"0F",X"0E",X"14",X"7E",X"3C", + X"20",X"22",X"71",X"D9",X"11",X"02",X"04",X"FF",X"D9",X"19",X"79",X"C6",X"0A",X"4F",X"10",X"EE", + X"0E",X"3C",X"3E",X"FE",X"32",X"C6",X"AC",X"DD",X"36",X"00",X"E4",X"FD",X"36",X"30",X"3D",X"FD", + X"36",X"32",X"3D",X"C9",X"3C",X"20",X"E2",X"36",X"00",X"18",X"DE",X"16",X"A7",X"13",X"96",X"ED", + X"DC",X"F1",X"8C",X"68",X"3B",X"0D",X"ED",X"F1",X"9B",X"13",X"13",X"13",X"13",X"F1",X"88",X"DC", + X"ED",X"11",X"B9",X"CD",X"60",X"2B",X"FD",X"7E",X"31",X"47",X"C6",X"13",X"FE",X"03",X"38",X"15", + X"78",X"C6",X"10",X"FD",X"77",X"33",X"FD",X"7E",X"00",X"47",X"C6",X"08",X"FE",X"28",X"38",X"05", + X"FD",X"70",X"02",X"18",X"08",X"FD",X"36",X"01",X"FF",X"FD",X"36",X"03",X"FF",X"DD",X"7E",X"00", + X"FE",X"B4",X"28",X"3F",X"38",X"13",X"D6",X"B4",X"0F",X"0F",X"0F",X"3D",X"E6",X"07",X"21",X"1B", + X"46",X"CF",X"FD",X"77",X"03",X"3C",X"FD",X"77",X"01",X"DD",X"35",X"00",X"CA",X"46",X"46",X"DD", + X"7E",X"00",X"FE",X"5A",X"C0",X"FD",X"36",X"01",X"FF",X"FD",X"36",X"03",X"FF",X"C9",X"21",X"7C", + X"A6",X"7E",X"4F",X"3A",X"43",X"AB",X"91",X"C2",X"43",X"46",X"C9",X"94",X"96",X"96",X"94",X"92", + X"90",X"90",X"94",X"DD",X"35",X"00",X"FD",X"36",X"01",X"FE",X"FD",X"36",X"03",X"FD",X"FD",X"36", + X"30",X"6C",X"FD",X"36",X"32",X"6C",X"3A",X"00",X"A8",X"3C",X"CC",X"0B",X"58",X"11",X"0D",X"04", + X"C3",X"38",X"00",X"C3",X"1B",X"46",X"3E",X"FF",X"32",X"C6",X"AC",X"DD",X"36",X"00",X"00",X"21", + X"43",X"AB",X"7E",X"FE",X"7C",X"C2",X"60",X"46",X"23",X"7E",X"FE",X"10",X"C8",X"FE",X"05",X"C8", + X"C3",X"9B",X"45",X"3A",X"C6",X"AC",X"A7",X"C0",X"3A",X"02",X"A8",X"47",X"3A",X"80",X"A9",X"4F", + X"3E",X"10",X"CB",X"59",X"20",X"02",X"ED",X"44",X"80",X"0F",X"0F",X"E6",X"3E",X"21",X"84",X"3C", + X"CF",X"FD",X"77",X"31",X"23",X"7E",X"FD",X"77",X"00",X"78",X"C6",X"C0",X"E6",X"80",X"DD",X"77", + X"02",X"CD",X"BA",X"46",X"DD",X"7E",X"04",X"FE",X"06",X"30",X"04",X"DD",X"36",X"04",X"05",X"DD", + X"36",X"00",X"FF",X"C3",X"F7",X"57",X"3A",X"80",X"A9",X"4F",X"E6",X"1C",X"CB",X"41",X"20",X"02", + X"ED",X"44",X"80",X"0F",X"0F",X"E6",X"3E",X"C3",X"7D",X"46",X"21",X"CE",X"46",X"E5",X"3A",X"04", + X"AD",X"E6",X"07",X"F7",X"42",X"59",X"4E",X"59",X"4E",X"59",X"65",X"59",X"6B",X"59",X"DD",X"72", + X"0C",X"DD",X"73",X"0D",X"DD",X"70",X"1C",X"DD",X"71",X"1D",X"C9",X"AF",X"DD",X"77",X"00",X"FD", + X"77",X"00",X"FD",X"77",X"02",X"FD",X"77",X"31",X"FD",X"77",X"33",X"DD",X"36",X"0E",X"5F",X"C9", + X"DD",X"7E",X"00",X"3C",X"C0",X"3A",X"17",X"A8",X"A7",X"C0",X"06",X"02",X"3A",X"27",X"A8",X"57", + X"87",X"5F",X"FD",X"7E",X"00",X"C6",X"08",X"FE",X"28",X"38",X"1B",X"FD",X"7E",X"31",X"C6",X"10", + X"FE",X"20",X"38",X"12",X"3E",X"84",X"FD",X"96",X"00",X"82",X"BB",X"30",X"17",X"3E",X"78",X"FD", + X"96",X"31",X"82",X"BB",X"30",X"0E",X"D9",X"11",X"10",X"00",X"DD",X"19",X"FD",X"23",X"FD",X"23", + X"D9",X"10",X"CF",X"C9",X"21",X"30",X"A8",X"D9",X"21",X"16",X"AA",X"06",X"02",X"D9",X"7E",X"A7", + X"28",X"0A",X"11",X"10",X"00",X"19",X"D9",X"23",X"23",X"10",X"F2",X"C9",X"22",X"91",X"A9",X"D9", + X"22",X"93",X"A9",X"CD",X"5F",X"56",X"21",X"7F",X"AC",X"CD",X"B8",X"33",X"67",X"EB",X"21",X"B4", + X"A8",X"34",X"3E",X"18",X"CB",X"46",X"20",X"02",X"ED",X"44",X"EB",X"84",X"FD",X"46",X"31",X"FD", + X"4E",X"00",X"DD",X"2A",X"91",X"A9",X"FD",X"2A",X"93",X"A9",X"DD",X"77",X"02",X"FD",X"70",X"31", + X"FD",X"71",X"00",X"21",X"95",X"47",X"E5",X"3A",X"04",X"AD",X"F7",X"8E",X"59",X"8E",X"59",X"94", + X"59",X"94",X"59",X"94",X"59",X"DD",X"73",X"0A",X"DD",X"72",X"0B",X"DD",X"71",X"0C",X"DD",X"70", + X"0D",X"FD",X"36",X"01",X"4D",X"FD",X"36",X"30",X"62",X"DD",X"35",X"00",X"3A",X"14",X"A8",X"32", + X"17",X"A8",X"C9",X"3A",X"04",X"AD",X"FE",X"04",X"C8",X"DD",X"21",X"F0",X"A8",X"FD",X"21",X"2E", + X"AA",X"DD",X"7E",X"00",X"A7",X"CA",X"53",X"48",X"3C",X"C2",X"F2",X"47",X"CD",X"05",X"3E",X"CD", + X"83",X"2B",X"DA",X"AD",X"48",X"3A",X"80",X"A9",X"0F",X"0F",X"0F",X"0F",X"E6",X"07",X"21",X"EA", + X"47",X"CF",X"FD",X"77",X"01",X"FD",X"36",X"30",X"75",X"C9",X"00",X"01",X"02",X"03",X"03",X"02", + X"01",X"00",X"CD",X"60",X"2B",X"DD",X"7E",X"00",X"FE",X"10",X"CA",X"31",X"48",X"FE",X"3C",X"D2", + X"09",X"48",X"DD",X"35",X"00",X"C0",X"C3",X"AD",X"48",X"DD",X"36",X"00",X"3B",X"CD",X"FF",X"57", + X"DD",X"7E",X"07",X"FE",X"04",X"D2",X"24",X"48",X"21",X"2D",X"48",X"CF",X"FD",X"77",X"01",X"FD", + X"36",X"30",X"6C",X"C9",X"FD",X"36",X"01",X"8F",X"FD",X"36",X"30",X"6C",X"C9",X"F9",X"FC",X"8D", + X"8E",X"DD",X"35",X"00",X"DD",X"7E",X"07",X"DD",X"34",X"07",X"FE",X"04",X"D2",X"49",X"48",X"21", + X"4F",X"48",X"DF",X"5E",X"16",X"04",X"C3",X"38",X"00",X"11",X"0F",X"04",X"C3",X"38",X"00",X"0A", + X"0C",X"0D",X"0E",X"3A",X"0D",X"AD",X"A7",X"C0",X"3A",X"80",X"A9",X"E6",X"01",X"C8",X"DD",X"35", + X"0E",X"C0",X"3A",X"02",X"A8",X"C6",X"08",X"0F",X"0F",X"0F",X"E6",X"1E",X"21",X"8D",X"48",X"CF", + X"FD",X"77",X"31",X"23",X"7E",X"FD",X"77",X"00",X"DD",X"36",X"0A",X"00",X"DD",X"36",X"0B",X"00", + X"DD",X"36",X"0C",X"40",X"DD",X"36",X"0D",X"00",X"DD",X"36",X"00",X"FF",X"C9",X"F0",X"40",X"F0", + X"80",X"F0",X"F8",X"60",X"F8",X"80",X"F8",X"A0",X"F8",X"10",X"F8",X"00",X"80",X"00",X"90",X"10", + X"10",X"30",X"10",X"60",X"10",X"80",X"10",X"A0",X"10",X"C0",X"10",X"F0",X"28",X"DD",X"36",X"00", + X"00",X"FD",X"36",X"00",X"00",X"FD",X"36",X"31",X"00",X"DD",X"36",X"0E",X"F0",X"C9",X"CD",X"E7", + X"48",X"CD",X"41",X"49",X"CD",X"11",X"49",X"CD",X"84",X"49",X"CD",X"D6",X"49",X"C9",X"2C",X"A7", + X"13",X"FD",X"3B",X"88",X"0D",X"DC",X"F1",X"BF",X"68",X"0D",X"D7",X"F1",X"FD",X"3B",X"FD",X"DC", + X"FD",X"A5",X"57",X"ED",X"F1",X"52",X"B9",X"3A",X"AE",X"A9",X"0F",X"0F",X"0F",X"21",X"83",X"A9", + X"CB",X"16",X"7E",X"E6",X"07",X"FE",X"01",X"C0",X"CD",X"F1",X"57",X"0E",X"01",X"C3",X"6E",X"49", + X"BC",X"A6",X"05",X"30",X"F1",X"7C",X"68",X"3B",X"A5",X"38",X"FD",X"F1",X"96",X"5D",X"17",X"9B", + X"B9",X"3A",X"AE",X"A9",X"21",X"CA",X"A9",X"0F",X"0F",X"CB",X"16",X"7E",X"E6",X"07",X"FE",X"01", + X"C0",X"EB",X"CD",X"F1",X"57",X"21",X"82",X"A9",X"34",X"EB",X"23",X"7E",X"C6",X"10",X"77",X"47", + X"23",X"7E",X"90",X"D0",X"7E",X"4F",X"E6",X"F0",X"C6",X"10",X"2B",X"ED",X"44",X"86",X"77",X"18", + X"2D",X"3A",X"AE",X"A9",X"21",X"C7",X"A9",X"0F",X"CB",X"16",X"7E",X"E6",X"07",X"FE",X"01",X"C0", + X"EB",X"CD",X"F1",X"57",X"21",X"81",X"A9",X"34",X"EB",X"23",X"7E",X"C6",X"10",X"77",X"47",X"23", + X"7E",X"90",X"D0",X"7E",X"4F",X"E6",X"F0",X"C6",X"10",X"2B",X"ED",X"44",X"86",X"77",X"3A",X"C0", + X"A9",X"A7",X"20",X"10",X"79",X"E6",X"0F",X"21",X"86",X"A9",X"86",X"27",X"77",X"30",X"02",X"36", + X"99",X"CD",X"FB",X"4A",X"3A",X"81",X"A9",X"A7",X"C8",X"21",X"84",X"A9",X"7E",X"A7",X"20",X"07", + X"36",X"30",X"3C",X"32",X"0A",X"C3",X"C9",X"35",X"28",X"09",X"7E",X"FE",X"18",X"C0",X"AF",X"32", + X"0A",X"C3",X"C9",X"21",X"81",X"A9",X"35",X"C9",X"0F",X"4F",X"E6",X"07",X"32",X"C4",X"A9",X"79", + X"0F",X"0F",X"0F",X"E6",X"01",X"32",X"C6",X"A9",X"32",X"00",X"C2",X"3A",X"3E",X"0C",X"32",X"02", + X"C3",X"CD",X"B1",X"00",X"06",X"00",X"21",X"DE",X"27",X"AF",X"86",X"23",X"10",X"FC",X"D6",X"C5", + X"C4",X"D8",X"00",X"C3",X"EB",X"32",X"3A",X"82",X"A9",X"A7",X"C8",X"21",X"85",X"A9",X"7E",X"A7", + X"20",X"07",X"36",X"30",X"3C",X"32",X"0C",X"C3",X"C9",X"35",X"28",X"09",X"7E",X"FE",X"18",X"C0", + X"AF",X"32",X"0C",X"C3",X"C9",X"21",X"82",X"A9",X"35",X"C9",X"EE",X"A6",X"14",X"A5",X"3B",X"87", + X"F1",X"DC",X"D7",X"BF",X"F1",X"DC",X"C4",X"FD",X"ED",X"F1",X"7D",X"A5",X"38",X"34",X"B9",X"3A", + X"13",X"32",X"32",X"F0",X"A9",X"3E",X"00",X"32",X"F1",X"A9",X"3E",X"FF",X"32",X"F2",X"A9",X"3E", + X"04",X"32",X"F3",X"A9",X"3E",X"FF",X"32",X"F4",X"A9",X"3E",X"08",X"32",X"F6",X"A9",X"21",X"F1", + X"56",X"22",X"F7",X"A9",X"06",X"0D",X"21",X"00",X"A4",X"0E",X"14",X"71",X"23",X"10",X"FC",X"3E", + X"00",X"77",X"23",X"77",X"23",X"06",X"0D",X"71",X"23",X"10",X"FC",X"3E",X"0E",X"06",X"04",X"77", + X"23",X"10",X"FC",X"21",X"B1",X"A7",X"CB",X"94",X"3A",X"0C",X"AD",X"4F",X"3E",X"A0",X"81",X"CD", + X"19",X"13",X"21",X"D1",X"A5",X"CB",X"94",X"3E",X"20",X"81",X"CD",X"19",X"13",X"21",X"10",X"A6", + X"CB",X"94",X"3E",X"A0",X"81",X"77",X"19",X"3E",X"20",X"81",X"77",X"21",X"12",X"A6",X"CB",X"94", + X"3E",X"E0",X"81",X"77",X"19",X"3E",X"60",X"81",X"77",X"21",X"11",X"A6",X"CB",X"94",X"3E",X"A0", + X"81",X"77",X"19",X"3E",X"20",X"81",X"77",X"CD",X"9C",X"33",X"C3",X"1A",X"0F",X"06",X"0D",X"2A", + X"F7",X"A9",X"7E",X"A7",X"EB",X"28",X"09",X"7E",X"3C",X"CB",X"41",X"28",X"02",X"3D",X"3D",X"77", + X"CB",X"49",X"11",X"20",X"00",X"28",X"03",X"11",X"E0",X"FF",X"19",X"EB",X"2A",X"F7",X"A9",X"23", + X"CB",X"41",X"28",X"02",X"2B",X"2B",X"22",X"F7",X"A9",X"10",X"D7",X"C9",X"3A",X"B1",X"A9",X"E6", + X"0F",X"FE",X"0F",X"20",X"05",X"21",X"C0",X"A9",X"36",X"FF",X"21",X"95",X"4B",X"CF",X"32",X"C9", + X"A9",X"3A",X"B1",X"A9",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"FE",X"0F",X"20",X"05",X"21",X"C0", + X"A9",X"36",X"FF",X"21",X"95",X"4B",X"CF",X"32",X"CC",X"A9",X"C9",X"0E",X"10",X"11",X"7F",X"A4", + X"21",X"86",X"A9",X"CD",X"81",X"0D",X"C9",X"2A",X"41",X"AB",X"7D",X"AC",X"2F",X"87",X"87",X"ED", + X"6A",X"22",X"41",X"AB",X"ED",X"5F",X"85",X"AC",X"C9",X"11",X"CC",X"0B",X"01",X"89",X"00",X"3A", + X"50",X"1A",X"67",X"1A",X"81",X"4F",X"13",X"10",X"FA",X"94",X"C4",X"11",X"0F",X"C3",X"1A",X"0F", + X"21",X"1B",X"0D",X"06",X"03",X"5E",X"23",X"56",X"23",X"1A",X"08",X"3E",X"04",X"82",X"57",X"1A", + X"5E",X"23",X"56",X"23",X"12",X"1C",X"08",X"12",X"10",X"EB",X"C9",X"D9",X"21",X"3F",X"AB",X"11", + X"40",X"AB",X"01",X"10",X"00",X"ED",X"B8",X"21",X"40",X"AB",X"3A",X"37",X"AB",X"AE",X"32",X"30", + X"AB",X"21",X"80",X"A9",X"86",X"D9",X"C9",X"21",X"84",X"4B",X"11",X"30",X"AB",X"01",X"11",X"00", + X"ED",X"B0",X"DD",X"2A",X"6D",X"08",X"2A",X"70",X"08",X"DD",X"7D",X"DD",X"84",X"85",X"C6",X"44", + X"C2",X"00",X"60",X"C9",X"FF",X"05",X"F6",X"80",X"32",X"17",X"9C",X"C9",X"DD",X"21",X"74",X"98", + X"FD",X"BF",X"24",X"AE",X"46",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"11",X"13",X"15",X"21", + X"22",X"24",X"31",X"33",X"01",X"21",X"B1",X"4B",X"11",X"08",X"AB",X"01",X"28",X"00",X"ED",X"B0", + X"C9",X"00",X"00",X"00",X"01",X"7C",X"11",X"68",X"F1",X"01",X"00",X"88",X"00",X"3B",X"11",X"A5", + X"F1",X"02",X"60",X"84",X"00",X"38",X"11",X"FD",X"F1",X"03",X"20",X"65",X"00",X"68",X"11",X"68", + X"F1",X"04",X"00",X"43",X"00",X"BF",X"11",X"A5",X"F1",X"C3",X"AE",X"08",X"21",X"08",X"AB",X"11", + X"11",X"A7",X"0E",X"14",X"CD",X"1F",X"4C",X"21",X"10",X"AB",X"11",X"13",X"A7",X"0E",X"16",X"CD", + X"1F",X"4C",X"21",X"18",X"AB",X"11",X"15",X"A7",X"0E",X"12",X"CD",X"1F",X"4C",X"21",X"20",X"AB", + X"11",X"17",X"A7",X"0E",X"15",X"CD",X"1F",X"4C",X"21",X"28",X"AB",X"11",X"19",X"A7",X"0E",X"13", + X"CD",X"1F",X"4C",X"C9",X"73",X"A6",X"14",X"7E",X"29",X"F8",X"96",X"5D",X"F3",X"13",X"B9",X"E5", + X"7E",X"87",X"86",X"21",X"B4",X"4C",X"CF",X"12",X"CB",X"92",X"79",X"12",X"CB",X"D2",X"23",X"E7", + X"7E",X"12",X"CB",X"92",X"79",X"12",X"CB",X"D2",X"23",X"E7",X"7E",X"12",X"CB",X"92",X"79",X"12", + X"CB",X"D2",X"21",X"80",X"FF",X"19",X"EB",X"E1",X"23",X"23",X"23",X"CD",X"73",X"0D",X"E5",X"21", + X"A0",X"FF",X"19",X"EB",X"E1",X"23",X"23",X"23",X"7E",X"12",X"CB",X"92",X"79",X"12",X"CB",X"D2", + X"23",X"E7",X"7E",X"12",X"CB",X"92",X"79",X"12",X"CB",X"D2",X"23",X"E7",X"7E",X"12",X"CB",X"92", + X"79",X"12",X"CB",X"D2",X"C9",X"CD",X"D2",X"07",X"3A",X"32",X"AD",X"A7",X"21",X"10",X"AD",X"28", + X"03",X"21",X"20",X"AD",X"11",X"00",X"AD",X"01",X"10",X"00",X"ED",X"B0",X"3A",X"30",X"AD",X"A7", + X"CA",X"1A",X"0F",X"3A",X"01",X"AD",X"16",X"06",X"5F",X"FF",X"3A",X"00",X"AD",X"3D",X"16",X"05", + X"5F",X"FF",X"06",X"00",X"21",X"50",X"5B",X"97",X"AE",X"23",X"10",X"FC",X"C6",X"FF",X"32",X"08", + X"C3",X"C3",X"1A",X"0F",X"96",X"ED",X"DC",X"9B",X"3B",X"87",X"CD",X"D7",X"87",X"F3",X"DC",X"C4", + X"7F",X"DC",X"C4",X"21",X"0B",X"AB",X"06",X"05",X"3A",X"32",X"AD",X"A7",X"11",X"35",X"AD",X"28", + X"03",X"11",X"38",X"AD",X"E5",X"D5",X"CD",X"2B",X"4D",X"30",X"09",X"D1",X"E1",X"3E",X"08",X"CF", + X"10",X"F2",X"37",X"C9",X"05",X"28",X"3F",X"21",X"27",X"AB",X"11",X"2F",X"AB",X"78",X"87",X"87", + X"87",X"4F",X"06",X"00",X"ED",X"B8",X"EB",X"2B",X"36",X"F1",X"2B",X"36",X"F1",X"2B",X"36",X"F1", + X"22",X"91",X"A9",X"2B",X"D1",X"01",X"03",X"00",X"EB",X"ED",X"B8",X"1A",X"E1",X"21",X"31",X"A5", + X"87",X"CF",X"22",X"93",X"A9",X"21",X"08",X"AB",X"11",X"08",X"00",X"06",X"05",X"AF",X"77",X"19", + X"3C",X"10",X"FB",X"37",X"3F",X"C9",X"21",X"2F",X"AB",X"18",X"CC",X"0E",X"03",X"1A",X"BE",X"D8", + X"20",X"05",X"1B",X"2B",X"0D",X"20",X"F6",X"37",X"3F",X"C9",X"21",X"05",X"AD",X"CD",X"67",X"4D", + X"D8",X"2C",X"CD",X"67",X"4D",X"38",X"04",X"2C",X"CD",X"67",X"4D",X"21",X"D7",X"A9",X"7E",X"A7", + X"C8",X"35",X"C0",X"3A",X"D6",X"A9",X"77",X"3A",X"C0",X"AC",X"3C",X"FE",X"10",X"38",X"02",X"3E", + X"0F",X"32",X"C0",X"AC",X"C3",X"9A",X"1A",X"7E",X"C6",X"01",X"27",X"77",X"FE",X"60",X"D8",X"36", + X"00",X"C9",X"4F",X"3A",X"30",X"AD",X"A7",X"C8",X"11",X"83",X"A7",X"79",X"FE",X"07",X"38",X"02", + X"3E",X"06",X"A7",X"28",X"0C",X"06",X"09",X"0E",X"18",X"08",X"CD",X"AF",X"4D",X"08",X"3D",X"20", + X"F8",X"01",X"10",X"F1",X"21",X"DD",X"59",X"19",X"30",X"05",X"CD",X"CF",X"4D",X"18",X"F5",X"06", + X"00",X"21",X"11",X"07",X"97",X"AE",X"23",X"10",X"FC",X"C6",X"19",X"C2",X"B1",X"4B",X"C9",X"78", + X"C6",X"03",X"12",X"3D",X"1B",X"12",X"E7",X"78",X"12",X"3C",X"13",X"12",X"21",X"00",X"FC",X"19", + X"E7",X"71",X"2B",X"71",X"7D",X"C6",X"20",X"6F",X"30",X"01",X"24",X"71",X"23",X"71",X"C9",X"EB", + X"70",X"2B",X"36",X"F1",X"CB",X"94",X"71",X"23",X"71",X"CB",X"D4",X"EB",X"E7",X"C9",X"3A",X"30", + X"AD",X"A7",X"C8",X"3A",X"C3",X"A9",X"E6",X"01",X"21",X"1B",X"4E",X"28",X"03",X"21",X"30",X"4E", + X"4E",X"06",X"00",X"23",X"3A",X"32",X"AD",X"A7",X"3A",X"35",X"AD",X"28",X"03",X"3A",X"38",X"AD", + X"ED",X"B1",X"21",X"03",X"AD",X"20",X"11",X"CB",X"46",X"C0",X"CB",X"C6",X"21",X"00",X"AD",X"7E", + X"34",X"16",X"05",X"5F",X"FF",X"C3",X"05",X"58",X"CB",X"86",X"C9",X"14",X"01",X"06",X"11",X"16", + X"21",X"26",X"31",X"36",X"41",X"46",X"51",X"56",X"61",X"66",X"71",X"76",X"81",X"86",X"91",X"96", + X"11",X"02",X"08",X"14",X"20",X"26",X"32",X"38",X"44",X"50",X"56",X"62",X"68",X"74",X"80",X"86", + X"92",X"98",X"6F",X"A6",X"14",X"88",X"57",X"A5",X"BF",X"34",X"D7",X"F1",X"9B",X"F1",X"B9",X"3A", + X"04",X"AD",X"FE",X"04",X"CA",X"2A",X"4F",X"3D",X"CA",X"BC",X"4E",X"3A",X"80",X"A9",X"E6",X"01", + X"C2",X"35",X"4F",X"CD",X"5D",X"4F",X"06",X"04",X"11",X"10",X"A8",X"FD",X"21",X"12",X"AA",X"2E", + X"05",X"26",X"0B",X"CD",X"85",X"51",X"3A",X"0D",X"AD",X"A7",X"20",X"1B",X"06",X"07",X"2E",X"07", + X"26",X"0F",X"CD",X"52",X"51",X"06",X"03",X"2E",X"06",X"26",X"0D",X"CD",X"21",X"51",X"06",X"01", + X"2E",X"08",X"26",X"11",X"C3",X"B3",X"51",X"06",X"05",X"2E",X"07",X"26",X"0F",X"CD",X"52",X"51", + X"CD",X"B1",X"50",X"06",X"03",X"11",X"C0",X"A8",X"FD",X"21",X"28",X"AA",X"2E",X"06",X"26",X"0D", + X"CD",X"21",X"51",X"06",X"01",X"2E",X"08",X"26",X"11",X"C3",X"B3",X"51",X"3A",X"80",X"A9",X"E6", + X"01",X"C2",X"35",X"4F",X"CD",X"7E",X"4F",X"06",X"04",X"11",X"10",X"A8",X"FD",X"21",X"12",X"AA", + X"2E",X"05",X"26",X"0B",X"CD",X"85",X"51",X"3A",X"0D",X"AD",X"A7",X"20",X"25",X"06",X"07",X"2E", + X"07",X"26",X"0F",X"CD",X"52",X"51",X"CD",X"7E",X"50",X"06",X"01",X"11",X"E0",X"A8",X"FD",X"21", + X"2C",X"AA",X"2E",X"05",X"26",X"0B",X"CD",X"85",X"51",X"06",X"01",X"2E",X"08",X"26",X"11",X"C3", + X"B3",X"51",X"06",X"05",X"2E",X"07",X"26",X"0F",X"CD",X"52",X"51",X"CD",X"B1",X"50",X"CD",X"7E", + X"50",X"06",X"01",X"11",X"E0",X"A8",X"FD",X"21",X"2C",X"AA",X"2E",X"05",X"26",X"0B",X"CD",X"85", + X"51",X"06",X"01",X"2E",X"08",X"26",X"11",X"C3",X"B3",X"51",X"3A",X"80",X"A9",X"E6",X"01",X"CA", + X"63",X"4E",X"C3",X"32",X"50",X"3A",X"0D",X"AD",X"A7",X"C2",X"BF",X"4F",X"11",X"50",X"A8",X"FD", + X"21",X"1A",X"AA",X"DD",X"21",X"80",X"AA",X"08",X"3E",X"07",X"47",X"08",X"0E",X"06",X"ED",X"53", + X"93",X"A9",X"FD",X"22",X"91",X"A9",X"2E",X"07",X"26",X"0F",X"C3",X"11",X"52",X"11",X"C0",X"A8", + X"FD",X"21",X"28",X"AA",X"DD",X"21",X"80",X"AA",X"08",X"3E",X"03",X"47",X"08",X"0E",X"06",X"ED", + X"53",X"93",X"A9",X"FD",X"22",X"91",X"A9",X"2E",X"07",X"26",X"0F",X"C3",X"11",X"52",X"2E",X"06", + X"26",X"0D",X"1E",X"17",X"16",X"1F",X"FD",X"21",X"80",X"AA",X"06",X"06",X"3A",X"C0",X"A8",X"3C", + X"C0",X"FD",X"7E",X"00",X"3C",X"20",X"1F",X"3A",X"28",X"AA",X"FD",X"96",X"06",X"85",X"BC",X"30", + X"15",X"3A",X"59",X"AA",X"FD",X"96",X"04",X"83",X"BA",X"30",X"0B",X"3E",X"F0",X"32",X"C0",X"A8", + X"FD",X"77",X"00",X"CD",X"DE",X"51",X"FD",X"7D",X"C6",X"10",X"FD",X"6F",X"10",X"D3",X"C9",X"11", + X"50",X"A8",X"FD",X"21",X"1A",X"AA",X"DD",X"21",X"80",X"AA",X"08",X"3E",X"05",X"47",X"08",X"0E", + X"06",X"ED",X"53",X"93",X"A9",X"FD",X"22",X"91",X"A9",X"2E",X"07",X"26",X"0F",X"CD",X"11",X"52", + X"3A",X"04",X"AD",X"A7",X"28",X"45",X"FE",X"04",X"28",X"41",X"2E",X"06",X"26",X"0D",X"1E",X"17", + X"16",X"1F",X"FD",X"21",X"80",X"AA",X"06",X"06",X"3A",X"A0",X"A8",X"3C",X"C0",X"FD",X"7E",X"00", + X"3C",X"20",X"1F",X"3A",X"24",X"AA",X"FD",X"96",X"06",X"85",X"BC",X"30",X"15",X"3A",X"55",X"AA", + X"FD",X"96",X"04",X"83",X"BA",X"30",X"0B",X"3E",X"F0",X"32",X"A0",X"A8",X"FD",X"77",X"00",X"CD", + X"DE",X"51",X"FD",X"7D",X"C6",X"10",X"FD",X"6F",X"10",X"D3",X"C9",X"2E",X"08",X"26",X"11",X"C3", + X"EE",X"4F",X"3A",X"0D",X"AD",X"A7",X"C2",X"5A",X"50",X"11",X"10",X"A8",X"FD",X"21",X"12",X"AA", + X"DD",X"21",X"80",X"AA",X"08",X"3E",X"0B",X"47",X"08",X"0E",X"06",X"ED",X"53",X"93",X"A9",X"FD", + X"22",X"91",X"A9",X"2E",X"07",X"26",X"0F",X"C3",X"11",X"52",X"11",X"10",X"A8",X"FD",X"21",X"12", + X"AA",X"DD",X"21",X"80",X"AA",X"08",X"3E",X"09",X"47",X"08",X"0E",X"06",X"ED",X"53",X"93",X"A9", + X"FD",X"22",X"91",X"A9",X"2E",X"07",X"26",X"0F",X"CD",X"11",X"52",X"C3",X"E0",X"4F",X"DD",X"21", + X"10",X"AA",X"3A",X"00",X"A8",X"3C",X"C0",X"3A",X"C0",X"A8",X"3C",X"C0",X"3A",X"28",X"AA",X"DD", + X"96",X"00",X"C6",X"06",X"FE",X"0D",X"D0",X"3A",X"59",X"AA",X"DD",X"96",X"31",X"C6",X"18",X"FE", + X"21",X"D0",X"3E",X"F0",X"32",X"00",X"A8",X"32",X"C0",X"A8",X"AF",X"32",X"DC",X"A8",X"C3",X"DE", + X"51",X"3A",X"04",X"AD",X"A7",X"28",X"37",X"FE",X"04",X"28",X"33",X"DD",X"21",X"10",X"AA",X"3A", + X"00",X"A8",X"3C",X"C0",X"3A",X"A0",X"A8",X"3C",X"C0",X"3A",X"24",X"AA",X"DD",X"96",X"00",X"C6", + X"06",X"FE",X"0D",X"D0",X"3A",X"55",X"AA",X"DD",X"96",X"31",X"C6",X"19",X"FE",X"23",X"D0",X"3E", + X"F0",X"32",X"00",X"A8",X"32",X"A0",X"A8",X"AF",X"32",X"A4",X"A8",X"C3",X"DE",X"51",X"DD",X"21", + X"10",X"AA",X"3A",X"00",X"A8",X"3C",X"C0",X"3A",X"A0",X"A8",X"3C",X"C0",X"3A",X"24",X"AA",X"DD", + X"96",X"00",X"C6",X"08",X"FE",X"11",X"D0",X"3A",X"55",X"AA",X"DD",X"96",X"31",X"C6",X"19",X"FE", + X"23",X"D0",X"3E",X"F0",X"32",X"00",X"A8",X"32",X"A0",X"A8",X"AF",X"32",X"A4",X"A8",X"C3",X"DE", + X"51",X"3A",X"00",X"A8",X"3C",X"C0",X"1A",X"3C",X"20",X"1D",X"3A",X"10",X"AA",X"FD",X"96",X"00", + X"85",X"BC",X"30",X"13",X"3A",X"41",X"AA",X"FD",X"96",X"31",X"85",X"BC",X"30",X"09",X"3E",X"F0", + X"32",X"00",X"A8",X"12",X"CD",X"DE",X"51",X"7B",X"C6",X"10",X"5F",X"FD",X"23",X"FD",X"23",X"10", + X"D5",X"C9",X"3A",X"00",X"A8",X"3C",X"C0",X"1A",X"3C",X"20",X"1F",X"3A",X"10",X"AA",X"FD",X"96", + X"00",X"85",X"BC",X"30",X"15",X"3A",X"41",X"AA",X"FD",X"96",X"31",X"C6",X"08",X"FE",X"11",X"30", + X"09",X"3E",X"F0",X"32",X"00",X"A8",X"12",X"CD",X"DE",X"51",X"7B",X"C6",X"10",X"5F",X"FD",X"23", + X"FD",X"23",X"10",X"D3",X"C9",X"3A",X"00",X"A8",X"3C",X"C0",X"1A",X"3C",X"20",X"1A",X"3A",X"10", + X"AA",X"FD",X"96",X"00",X"85",X"BC",X"30",X"10",X"3A",X"41",X"AA",X"FD",X"96",X"31",X"85",X"BC", + X"30",X"06",X"3E",X"F0",X"32",X"00",X"A8",X"12",X"7B",X"C6",X"10",X"5F",X"FD",X"23",X"FD",X"23", + X"10",X"D8",X"C9",X"3A",X"00",X"A8",X"3C",X"C0",X"1A",X"3C",X"20",X"17",X"3A",X"10",X"AA",X"FD", + X"96",X"00",X"85",X"BC",X"30",X"0D",X"3A",X"41",X"AA",X"FD",X"96",X"31",X"85",X"BC",X"30",X"03", + X"3E",X"F0",X"12",X"7B",X"C6",X"10",X"5F",X"FD",X"23",X"FD",X"23",X"10",X"DB",X"C9",X"D5",X"3A", + X"9D",X"A9",X"A7",X"28",X"15",X"3A",X"9E",X"A9",X"3C",X"32",X"9E",X"A9",X"E6",X"07",X"3C",X"5F", + X"16",X"04",X"FF",X"D1",X"3E",X"1E",X"32",X"9D",X"A9",X"C9",X"11",X"01",X"04",X"FF",X"D1",X"3E", + X"1E",X"32",X"9D",X"A9",X"C9",X"21",X"9D",X"A9",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"2C",X"77", + X"C9",X"DD",X"7E",X"00",X"3C",X"20",X"3D",X"1A",X"3C",X"20",X"2F",X"FD",X"7E",X"00",X"C6",X"08", + X"FE",X"19",X"38",X"26",X"FD",X"7E",X"31",X"C6",X"10",X"FE",X"11",X"38",X"1D",X"DD",X"7E",X"06", + X"FD",X"96",X"00",X"85",X"BC",X"30",X"13",X"DD",X"7E",X"04",X"FD",X"96",X"31",X"85",X"BC",X"30", + X"09",X"3E",X"F0",X"DD",X"77",X"00",X"12",X"CD",X"DE",X"51",X"7B",X"C6",X"10",X"5F",X"FD",X"23", + X"FD",X"23",X"10",X"C3",X"FD",X"2A",X"91",X"A9",X"ED",X"5B",X"93",X"A9",X"08",X"47",X"08",X"DD", + X"7D",X"C6",X"10",X"DD",X"6F",X"0D",X"C2",X"11",X"52",X"C9",X"21",X"84",X"AE",X"22",X"80",X"AE", + X"21",X"04",X"AE",X"22",X"00",X"AE",X"C9",X"06",X"00",X"21",X"DE",X"27",X"AF",X"86",X"23",X"10", + X"FC",X"D6",X"C5",X"C4",X"D4",X"53",X"CD",X"0E",X"53",X"CD",X"D2",X"52",X"3A",X"00",X"AE",X"FE", + X"04",X"28",X"D7",X"4F",X"06",X"00",X"21",X"00",X"AE",X"11",X"80",X"AE",X"ED",X"B0",X"C6",X"80", + X"32",X"80",X"AE",X"21",X"04",X"AE",X"22",X"00",X"AE",X"C9",X"3A",X"C9",X"08",X"32",X"8D",X"A9", + X"3A",X"74",X"08",X"32",X"CD",X"A9",X"3A",X"60",X"C3",X"2F",X"32",X"B1",X"A9",X"CD",X"CC",X"4A", + X"3A",X"00",X"C2",X"2F",X"4F",X"E6",X"03",X"C6",X"03",X"FE",X"06",X"20",X"02",X"3E",X"FF",X"C3", + X"19",X"2E",X"3A",X"0C",X"AD",X"E6",X"0F",X"4F",X"2A",X"00",X"AE",X"7D",X"D6",X"04",X"C8",X"0F", + X"0F",X"E6",X"1F",X"47",X"21",X"04",X"AE",X"5E",X"2C",X"56",X"2C",X"1A",X"E6",X"10",X"20",X"0E", + X"7E",X"CB",X"D2",X"12",X"CB",X"92",X"2C",X"7E",X"2C",X"81",X"12",X"10",X"EA",X"C9",X"2C",X"2C", + X"10",X"E5",X"C9",X"CD",X"0C",X"20",X"FE",X"67",X"C2",X"8D",X"0F",X"C3",X"1A",X"0F",X"2A",X"80", + X"AE",X"7D",X"E6",X"7F",X"D6",X"04",X"C8",X"0F",X"0F",X"E6",X"1F",X"47",X"21",X"84",X"AE",X"5E", + X"2C",X"56",X"2C",X"1A",X"E6",X"10",X"20",X"0A",X"2C",X"2C",X"CB",X"D2",X"3E",X"20",X"12",X"10", + X"EE",X"C9",X"2C",X"2C",X"10",X"E9",X"C9",X"DD",X"7E",X"04",X"C6",X"07",X"47",X"16",X"28",X"07", + X"CB",X"12",X"07",X"CB",X"12",X"E6",X"E0",X"5F",X"DD",X"7E",X"06",X"C6",X"07",X"4F",X"0F",X"0F", + X"0F",X"E6",X"1F",X"83",X"5F",X"79",X"07",X"07",X"07",X"E6",X"38",X"4F",X"78",X"06",X"00",X"CB", + X"57",X"28",X"01",X"04",X"0F",X"0F",X"E6",X"C0",X"81",X"4F",X"21",X"D4",X"53",X"09",X"7E",X"23", + X"46",X"23",X"A7",X"28",X"10",X"E5",X"2A",X"00",X"AE",X"73",X"2C",X"72",X"2C",X"77",X"2C",X"70", + X"2C",X"22",X"00",X"AE",X"E1",X"13",X"7E",X"23",X"46",X"23",X"A7",X"28",X"10",X"E5",X"2A",X"00", + X"AE",X"73",X"2C",X"72",X"2C",X"77",X"2C",X"70",X"2C",X"22",X"00",X"AE",X"E1",X"7B",X"C6",X"1F", + X"5F",X"30",X"01",X"14",X"7E",X"23",X"46",X"23",X"A7",X"28",X"10",X"E5",X"2A",X"00",X"AE",X"73", + X"2C",X"72",X"2C",X"77",X"2C",X"70",X"2C",X"22",X"00",X"AE",X"E1",X"13",X"7E",X"23",X"46",X"23", + X"A7",X"28",X"10",X"E5",X"2A",X"00",X"AE",X"73",X"2C",X"72",X"2C",X"77",X"2C",X"70",X"2C",X"22", + X"00",X"AE",X"E1",X"C9",X"24",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"61",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"61",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"60",X"00",X"00", + X"00",X"00",X"00",X"00",X"24",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"39",X"20",X"39",X"60", + X"00",X"00",X"00",X"00",X"30",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"A1",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"B7",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"D0",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"B7",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"A1",X"60",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"6D",X"20",X"6D",X"60", + X"00",X"00",X"00",X"00",X"40",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"34",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"2B",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"B1",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"2B",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"34",X"60",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"8E",X"20",X"8E",X"60", + X"00",X"00",X"00",X"00",X"74",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"54",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"4C",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"2D",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"4C",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"54",X"60",X"00",X"00", + X"00",X"00",X"00",X"00",X"74",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"D5",X"20",X"D5",X"60", + X"00",X"00",X"00",X"00",X"40",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"34",X"A0",X"00",X"00", + X"00",X"00",X"00",X"00",X"2B",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"B1",X"A0",X"00",X"00", + X"00",X"00",X"00",X"00",X"2B",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"34",X"E0",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"8E",X"A0",X"8E",X"E0", + X"00",X"00",X"00",X"00",X"30",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"A1",X"A0",X"00",X"00", + X"00",X"00",X"00",X"00",X"B7",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"D0",X"A0",X"00",X"00", + X"00",X"00",X"00",X"00",X"B7",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"A1",X"E0",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"6D",X"A0",X"6D",X"E0", + X"00",X"00",X"00",X"00",X"24",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"A0",X"00",X"00", + X"00",X"00",X"00",X"00",X"61",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"A0",X"00",X"00", + X"00",X"00",X"00",X"00",X"61",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"E0",X"00",X"00", + X"00",X"00",X"00",X"00",X"24",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"39",X"A0",X"39",X"E0", + X"00",X"00",X"00",X"00",X"3A",X"20",X"00",X"00",X"3A",X"A0",X"00",X"00",X"8F",X"20",X"00",X"00", + X"8F",X"A0",X"00",X"00",X"70",X"20",X"00",X"00",X"70",X"A0",X"00",X"00",X"66",X"20",X"00",X"00", + X"66",X"A0",X"00",X"00",X"70",X"60",X"00",X"00",X"70",X"E0",X"00",X"00",X"8F",X"60",X"00",X"00", + X"8F",X"E0",X"00",X"00",X"3A",X"60",X"00",X"00",X"3A",X"E0",X"00",X"00",X"C7",X"20",X"C7",X"60", + X"C7",X"A0",X"C7",X"E0",X"21",X"43",X"AC",X"7E",X"A7",X"C8",X"35",X"F5",X"23",X"7E",X"CD",X"F8", + X"55",X"F1",X"C8",X"3D",X"06",X"00",X"4F",X"5D",X"54",X"23",X"ED",X"B0",X"C9",X"73",X"A6",X"14", + X"7E",X"29",X"F8",X"96",X"5D",X"17",X"9B",X"B9",X"32",X"00",X"C0",X"3E",X"01",X"32",X"04",X"C3", + X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"00",X"32",X"04",X"C3",X"C9",X"E5",X"F5",X"3A",X"30", + X"AD",X"A7",X"20",X"16",X"F1",X"E1",X"C9",X"E5",X"F5",X"3A",X"30",X"AD",X"A7",X"20",X"0B",X"3A", + X"C6",X"A9",X"A7",X"20",X"05",X"F1",X"E1",X"C9",X"E5",X"F5",X"21",X"43",X"AC",X"34",X"7E",X"CF", + X"F1",X"77",X"E1",X"C9",X"3A",X"7C",X"16",X"CD",X"28",X"56",X"3A",X"9C",X"0A",X"CD",X"28",X"56", + X"3A",X"84",X"14",X"CD",X"28",X"56",X"3A",X"78",X"0C",X"CD",X"28",X"56",X"3A",X"D3",X"07",X"CD", + X"28",X"56",X"3A",X"B4",X"33",X"CD",X"28",X"56",X"3A",X"04",X"AD",X"C6",X"8C",X"18",X"C9",X"3A", + X"A2",X"07",X"18",X"A8",X"3A",X"DE",X"16",X"18",X"A3",X"3A",X"9F",X"4C",X"18",X"9E",X"3A",X"D8", + X"07",X"CD",X"0C",X"56",X"3A",X"6B",X"27",X"18",X"93",X"3A",X"FE",X"07",X"18",X"8E",X"3A",X"70", + X"32",X"18",X"94",X"3A",X"A6",X"07",X"CD",X"17",X"56",X"3A",X"DA",X"4C",X"18",X"89",X"3A",X"87", + X"2D",X"C3",X"0C",X"56",X"0E",X"00",X"21",X"31",X"08",X"3A",X"AB",X"A9",X"96",X"23",X"0D",X"20", + X"FB",X"EE",X"C2",X"32",X"AB",X"A9",X"CD",X"97",X"0F",X"CD",X"DF",X"1E",X"CD",X"97",X"0F",X"CD", + X"BC",X"2C",X"CD",X"E3",X"23",X"CD",X"98",X"10",X"21",X"EB",X"A9",X"35",X"C0",X"0E",X"00",X"21", + X"A7",X"12",X"3A",X"AB",X"A9",X"96",X"23",X"0D",X"20",X"FB",X"EE",X"59",X"32",X"AB",X"A9",X"C3", + X"1A",X"0F",X"3A",X"5B",X"0C",X"CD",X"0C",X"56",X"3A",X"55",X"08",X"CD",X"0C",X"56",X"3A",X"75", + X"16",X"CD",X"0C",X"56",X"3A",X"CB",X"27",X"CD",X"17",X"56",X"3A",X"A0",X"33",X"C3",X"17",X"56", + X"FF",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00", + X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"01",X"01",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"3A",X"2E",X"32",X"C3",X"28",X"56",X"3A",X"04",X"AD",X"C6",X"0C",X"C3",X"0C",X"56",X"3A", + X"9B",X"07",X"C3",X"0C",X"56",X"3A",X"4E",X"2D",X"C3",X"0C",X"56",X"3A",X"EE",X"49",X"C3",X"0C", + X"56",X"3A",X"A9",X"07",X"C3",X"0C",X"56",X"3A",X"3A",X"27",X"C3",X"0C",X"56",X"0C",X"A7",X"13", + X"88",X"57",X"34",X"A5",X"ED",X"34",X"F1",X"87",X"34",X"88",X"68",X"ED",X"FD",X"DC",X"F1",X"77", + X"68",X"FD",X"3B",X"B9",X"3A",X"67",X"17",X"C3",X"0C",X"56",X"3A",X"FA",X"18",X"C3",X"0C",X"56", + X"21",X"D7",X"59",X"C3",X"BC",X"58",X"21",X"00",X"5C",X"C3",X"BC",X"58",X"60",X"A7",X"14",X"96", + X"10",X"0D",X"88",X"B9",X"21",X"00",X"5E",X"C3",X"BC",X"58",X"21",X"30",X"25",X"C3",X"BC",X"58", + X"21",X"3E",X"2E",X"C3",X"BC",X"58",X"2A",X"81",X"25",X"01",X"00",X"04",X"16",X"10",X"72",X"23", + X"0B",X"79",X"B0",X"20",X"F9",X"32",X"00",X"C2",X"2A",X"37",X"4A",X"01",X"00",X"04",X"16",X"F1", + X"72",X"23",X"0B",X"79",X"B0",X"20",X"F9",X"21",X"00",X"00",X"3A",X"00",X"00",X"86",X"23",X"08", + X"7C",X"FE",X"60",X"30",X"06",X"08",X"32",X"00",X"C2",X"18",X"F2",X"08",X"D6",X"AF",X"C2",X"D7", + X"59",X"C3",X"11",X"25",X"21",X"FA",X"08",X"C3",X"BC",X"58",X"21",X"D7",X"59",X"C3",X"FE",X"58", + X"21",X"00",X"5C",X"C3",X"FE",X"58",X"21",X"00",X"5E",X"C3",X"FE",X"58",X"DD",X"7E",X"02",X"4F", + X"87",X"30",X"01",X"24",X"85",X"6F",X"30",X"01",X"24",X"5E",X"23",X"56",X"79",X"C6",X"C0",X"01", + X"80",X"01",X"30",X"03",X"01",X"80",X"FF",X"09",X"46",X"2B",X"4E",X"2A",X"08",X"A8",X"19",X"DD", + X"5E",X"03",X"FD",X"56",X"31",X"19",X"DD",X"75",X"03",X"FD",X"74",X"31",X"2A",X"0A",X"A8",X"09", + X"DD",X"5E",X"05",X"FD",X"56",X"00",X"19",X"DD",X"75",X"05",X"FD",X"74",X"00",X"C9",X"DD",X"7E", + X"02",X"4F",X"87",X"30",X"01",X"24",X"85",X"6F",X"30",X"01",X"24",X"5E",X"23",X"56",X"79",X"C6", + X"C0",X"01",X"80",X"01",X"30",X"03",X"01",X"80",X"FF",X"09",X"46",X"2B",X"4E",X"2A",X"08",X"A8", + X"19",X"19",X"DD",X"5E",X"03",X"FD",X"56",X"31",X"19",X"DD",X"75",X"03",X"FD",X"74",X"31",X"2A", + X"0A",X"A8",X"09",X"09",X"DD",X"5E",X"05",X"FD",X"56",X"00",X"19",X"DD",X"75",X"05",X"FD",X"74", + X"00",X"C9",X"21",X"D7",X"59",X"C3",X"6E",X"59",X"21",X"00",X"5C",X"C3",X"6E",X"59",X"21",X"00", + X"5E",X"C3",X"6E",X"59",X"73",X"A6",X"14",X"7E",X"29",X"F8",X"96",X"5D",X"02",X"13",X"B9",X"21", + X"30",X"25",X"C3",X"6E",X"59",X"21",X"3E",X"2E",X"C3",X"6E",X"59",X"21",X"FA",X"08",X"DD",X"7E", + X"02",X"4F",X"87",X"30",X"01",X"24",X"85",X"6F",X"30",X"01",X"24",X"5E",X"23",X"56",X"79",X"C6", + X"C0",X"01",X"80",X"01",X"30",X"03",X"01",X"80",X"FF",X"09",X"46",X"2B",X"4E",X"C9",X"21",X"D7", + X"59",X"C3",X"9D",X"59",X"21",X"00",X"5C",X"C3",X"9D",X"59",X"21",X"00",X"5E",X"DD",X"7E",X"02", + X"4F",X"87",X"30",X"01",X"24",X"85",X"6F",X"30",X"01",X"24",X"5E",X"23",X"56",X"CB",X"23",X"CB", + X"12",X"79",X"C6",X"C0",X"01",X"80",X"01",X"30",X"03",X"01",X"80",X"FF",X"09",X"46",X"2B",X"4E", + X"CB",X"21",X"CB",X"10",X"C9",X"21",X"D7",X"59",X"C3",X"A0",X"59",X"21",X"00",X"5C",X"C3",X"A0", + X"59",X"21",X"00",X"5E",X"C3",X"A0",X"59",X"CE",X"00",X"CD",X"00",X"CC",X"00",X"CB",X"00",X"CA", + X"00",X"C9",X"00",X"C8",X"00",X"C8",X"00",X"C6",X"00",X"C4",X"00",X"C2",X"00",X"C0",X"00",X"BF", + X"00",X"BC",X"00",X"BA",X"00",X"B9",X"00",X"B6",X"00",X"B3",X"00",X"B0",X"00",X"AF",X"00",X"AC", + X"00",X"A9",X"00",X"A8",X"00",X"A5",X"00",X"A2",X"00",X"A1",X"00",X"9E",X"00",X"9B",X"00",X"98", + X"00",X"97",X"00",X"94",X"00",X"91",X"00",X"90",X"00",X"8D",X"00",X"89",X"00",X"88",X"00",X"85", + X"00",X"81",X"00",X"7F",X"00",X"7B",X"00",X"78",X"00",X"76",X"00",X"70",X"00",X"6D",X"00",X"68", + X"00",X"63",X"00",X"60",X"00",X"5C",X"00",X"58",X"00",X"52",X"00",X"4E",X"00",X"49",X"00",X"43", + X"00",X"3E",X"00",X"39",X"00",X"32",X"00",X"2C",X"00",X"27",X"00",X"20",X"00",X"1A",X"00",X"14", + X"00",X"0E",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"F8",X"FF",X"F2",X"FF",X"00",X"00",X"E6", + X"FF",X"E0",X"FF",X"D9",X"FF",X"D4",X"FF",X"CE",X"FF",X"C7",X"FF",X"C2",X"FF",X"BD",X"FF",X"B7", + X"FF",X"B2",X"FF",X"AE",X"FF",X"A8",X"FF",X"A4",X"FF",X"A0",X"FF",X"9D",X"FF",X"A0",X"FF",X"93", + X"FF",X"90",X"FF",X"8A",X"FF",X"88",X"FF",X"85",X"FF",X"81",X"FF",X"7F",X"FF",X"7B",X"FF",X"78", + X"FF",X"77",X"FF",X"73",X"FF",X"70",X"FF",X"6F",X"FF",X"6C",X"FF",X"69",X"FF",X"69",X"FF",X"65", + X"FF",X"62",X"FF",X"5F",X"FF",X"5E",X"FF",X"5B",X"FF",X"58",X"FF",X"57",X"FF",X"54",X"FF",X"51", + X"FF",X"50",X"FF",X"4D",X"FF",X"4A",X"FF",X"47",X"FF",X"46",X"FF",X"44",X"FF",X"41",X"FF",X"40", + X"FF",X"3E",X"FF",X"3C",X"FF",X"3A",X"FF",X"38",X"FF",X"38",X"FF",X"37",X"FF",X"36",X"FF",X"35", + X"FF",X"34",X"FF",X"33",X"FF",X"32",X"FF",X"32",X"FF",X"33",X"FF",X"34",X"FF",X"35",X"FF",X"36", + X"FF",X"37",X"FF",X"38",X"FF",X"38",X"FF",X"3A",X"FF",X"3C",X"FF",X"3E",X"FF",X"40",X"FF",X"41", + X"FF",X"44",X"FF",X"46",X"FF",X"47",X"FF",X"4A",X"FF",X"4D",X"FF",X"50",X"FF",X"51",X"FF",X"54", + X"FF",X"57",X"FF",X"58",X"FF",X"5B",X"FF",X"5E",X"FF",X"5F",X"FF",X"62",X"FF",X"65",X"FF",X"68", + X"FF",X"69",X"FF",X"6C",X"FF",X"6F",X"FF",X"70",X"FF",X"73",X"FF",X"77",X"FF",X"78",X"FF",X"7B", + X"FF",X"7F",X"FF",X"81",X"FF",X"85",X"FF",X"88",X"FF",X"8A",X"FF",X"90",X"FF",X"93",X"FF",X"98", + X"FF",X"9D",X"FF",X"A0",X"FF",X"A4",X"FF",X"A8",X"FF",X"AE",X"FF",X"B2",X"FF",X"B7",X"FF",X"BD", + X"FF",X"C2",X"FF",X"C7",X"FF",X"CE",X"FF",X"D4",X"FF",X"D9",X"FF",X"E0",X"FF",X"E6",X"FF",X"EC", + X"FF",X"F2",X"FF",X"F8",X"FF",X"00",X"00",X"00",X"00",X"08",X"00",X"0E",X"00",X"14",X"00",X"1A", + X"00",X"20",X"00",X"27",X"00",X"2C",X"00",X"32",X"00",X"39",X"00",X"3E",X"00",X"43",X"00",X"49", + X"00",X"4E",X"00",X"52",X"00",X"58",X"00",X"5C",X"00",X"60",X"00",X"63",X"00",X"63",X"00",X"6D", + X"00",X"70",X"00",X"76",X"00",X"78",X"00",X"7B",X"00",X"7F",X"00",X"81",X"00",X"85",X"00",X"88", + X"00",X"89",X"00",X"8D",X"00",X"90",X"00",X"91",X"00",X"94",X"00",X"97",X"00",X"94",X"00",X"9B", + X"00",X"9E",X"00",X"A1",X"00",X"A2",X"00",X"A5",X"00",X"A8",X"00",X"A9",X"00",X"AC",X"00",X"AF", + X"00",X"B0",X"00",X"B3",X"00",X"B6",X"00",X"B9",X"00",X"BA",X"00",X"BC",X"00",X"B9",X"00",X"C0", + X"00",X"C2",X"00",X"C4",X"00",X"C6",X"00",X"C8",X"00",X"C8",X"00",X"C9",X"00",X"CA",X"00",X"CB", + X"00",X"CC",X"00",X"CD",X"00",X"CE",X"00",X"CD",X"D2",X"07",X"CD",X"01",X"02",X"C0",X"21",X"DD", + X"0B",X"97",X"47",X"AE",X"23",X"10",X"FC",X"C6",X"E4",X"C4",X"11",X"0F",X"3A",X"AB",X"A9",X"21", + X"34",X"17",X"06",X"14",X"86",X"23",X"10",X"FC",X"C6",X"77",X"32",X"AB",X"A9",X"C3",X"1A",X"0F", + X"E7",X"00",X"E6",X"00",X"E5",X"00",X"E4",X"00",X"E3",X"00",X"E2",X"00",X"E1",X"00",X"E0",X"00", + X"DE",X"00",X"DC",X"00",X"DA",X"00",X"D8",X"00",X"D6",X"00",X"D3",X"00",X"D1",X"00",X"CF",X"00", + X"CC",X"00",X"C9",X"00",X"C6",X"00",X"C4",X"00",X"C1",X"00",X"BE",X"00",X"BC",X"00",X"B9",X"00", + X"B6",X"00",X"B4",X"00",X"B1",X"00",X"AE",X"00",X"AB",X"00",X"A9",X"00",X"A6",X"00",X"A3",X"00", + X"A1",X"00",X"9E",X"00",X"9A",X"00",X"98",X"00",X"95",X"00",X"91",X"00",X"8E",X"00",X"8A",X"00", + X"87",X"00",X"84",X"00",X"7E",X"00",X"7A",X"00",X"75",X"00",X"6F",X"00",X"6C",X"00",X"67",X"00", + X"62",X"00",X"5C",X"00",X"57",X"00",X"51",X"00",X"4B",X"00",X"45",X"00",X"3F",X"00",X"38",X"00", + X"31",X"00",X"2B",X"00",X"24",X"00",X"1D",X"00",X"16",X"00",X"0F",X"00",X"08",X"00",X"00",X"00", + X"00",X"00",X"F8",X"FF",X"F1",X"FF",X"00",X"00",X"E3",X"FF",X"DC",X"FF",X"D5",X"FF",X"CF",X"FF", + X"C8",X"FF",X"C1",X"FF",X"BB",X"FF",X"B5",X"FF",X"AF",X"FF",X"A9",X"FF",X"A4",X"FF",X"9E",X"FF", + X"99",X"FF",X"94",X"FF",X"91",X"FF",X"94",X"FF",X"86",X"FF",X"82",X"FF",X"7C",X"FF",X"79",X"FF", + X"76",X"FF",X"72",X"FF",X"6F",X"FF",X"6B",X"FF",X"68",X"FF",X"66",X"FF",X"62",X"FF",X"5F",X"FF", + X"5D",X"FF",X"5A",X"FF",X"57",X"FF",X"57",X"FF",X"52",X"FF",X"4F",X"FF",X"4C",X"FF",X"4A",X"FF", + X"47",X"FF",X"44",X"FF",X"42",X"FF",X"3F",X"FF",X"3C",X"FF",X"3A",X"FF",X"37",X"FF",X"34",X"FF", + X"31",X"FF",X"2F",X"FF",X"2D",X"FF",X"2A",X"FF",X"28",X"FF",X"26",X"FF",X"24",X"FF",X"22",X"FF", + X"20",X"FF",X"1F",X"FF",X"1E",X"FF",X"1D",X"FF",X"1C",X"FF",X"1B",X"FF",X"1A",X"FF",X"19",X"FF", + X"19",X"FF",X"1A",X"FF",X"1B",X"FF",X"1C",X"FF",X"1D",X"FF",X"1E",X"FF",X"1F",X"FF",X"20",X"FF", + X"22",X"FF",X"24",X"FF",X"26",X"FF",X"28",X"FF",X"2A",X"FF",X"2D",X"FF",X"2F",X"FF",X"31",X"FF", + X"34",X"FF",X"37",X"FF",X"3A",X"FF",X"3C",X"FF",X"3F",X"FF",X"42",X"FF",X"44",X"FF",X"47",X"FF", + X"4A",X"FF",X"4C",X"FF",X"4F",X"FF",X"52",X"FF",X"55",X"FF",X"57",X"FF",X"5A",X"FF",X"5D",X"FF", + X"5F",X"FF",X"62",X"FF",X"66",X"FF",X"68",X"FF",X"6B",X"FF",X"6F",X"FF",X"72",X"FF",X"76",X"FF", + X"79",X"FF",X"7C",X"FF",X"82",X"FF",X"86",X"FF",X"8B",X"FF",X"91",X"FF",X"94",X"FF",X"99",X"FF", + X"9E",X"FF",X"A4",X"FF",X"A9",X"FF",X"AF",X"FF",X"B5",X"FF",X"BB",X"FF",X"C1",X"FF",X"C8",X"FF", + X"CF",X"FF",X"D5",X"FF",X"DC",X"FF",X"E3",X"FF",X"EA",X"FF",X"F1",X"FF",X"F8",X"FF",X"00",X"00", + X"00",X"00",X"08",X"00",X"0F",X"00",X"16",X"00",X"1D",X"00",X"24",X"00",X"2B",X"00",X"31",X"00", + X"38",X"00",X"3F",X"00",X"45",X"00",X"4B",X"00",X"51",X"00",X"57",X"00",X"5C",X"00",X"62",X"00", + X"67",X"00",X"6C",X"00",X"6F",X"00",X"6F",X"00",X"7A",X"00",X"7E",X"00",X"84",X"00",X"87",X"00", + X"8A",X"00",X"8E",X"00",X"91",X"00",X"95",X"00",X"98",X"00",X"9A",X"00",X"9E",X"00",X"A1",X"00", + X"A3",X"00",X"A6",X"00",X"A9",X"00",X"A6",X"00",X"AE",X"00",X"B1",X"00",X"B4",X"00",X"B6",X"00", + X"B9",X"00",X"BC",X"00",X"BE",X"00",X"C1",X"00",X"C4",X"00",X"C6",X"00",X"C9",X"00",X"CC",X"00", + X"CF",X"00",X"D1",X"00",X"D3",X"00",X"CF",X"00",X"D8",X"00",X"DA",X"00",X"DC",X"00",X"DE",X"00", + X"E0",X"00",X"E1",X"00",X"E2",X"00",X"E3",X"00",X"E4",X"00",X"E5",X"00",X"E6",X"00",X"E7",X"00", + X"00",X"01",X"FF",X"00",X"FE",X"00",X"FD",X"00",X"FC",X"00",X"FB",X"00",X"FA",X"00",X"F8",X"00", + X"F6",X"00",X"F4",X"00",X"F2",X"00",X"F0",X"00",X"ED",X"00",X"EA",X"00",X"E8",X"00",X"E5",X"00", + X"E2",X"00",X"DF",X"00",X"DC",X"00",X"D9",X"00",X"D6",X"00",X"D3",X"00",X"D0",X"00",X"CD",X"00", + X"CA",X"00",X"C7",X"00",X"C4",X"00",X"C1",X"00",X"BE",X"00",X"BB",X"00",X"B8",X"00",X"B5",X"00", + X"B2",X"00",X"AF",X"00",X"AB",X"00",X"A8",X"00",X"A5",X"00",X"A1",X"00",X"9D",X"00",X"99",X"00", + X"96",X"00",X"92",X"00",X"8C",X"00",X"87",X"00",X"82",X"00",X"7B",X"00",X"78",X"00",X"72",X"00", + X"6C",X"00",X"66",X"00",X"60",X"00",X"59",X"00",X"53",X"00",X"4C",X"00",X"45",X"00",X"3E",X"00", + X"36",X"00",X"2F",X"00",X"28",X"00",X"20",X"00",X"18",X"00",X"10",X"00",X"08",X"00",X"00",X"00", + X"00",X"00",X"F8",X"FF",X"F0",X"FF",X"00",X"00",X"E0",X"FF",X"D8",X"FF",X"D1",X"FF",X"CA",X"FF", + X"C2",X"FF",X"BB",X"FF",X"B4",X"FF",X"AD",X"FF",X"A7",X"FF",X"A0",X"FF",X"9A",X"FF",X"94",X"FF", + X"8E",X"FF",X"88",X"FF",X"85",X"FF",X"88",X"FF",X"79",X"FF",X"74",X"FF",X"6E",X"FF",X"6A",X"FF", + X"67",X"FF",X"63",X"FF",X"5F",X"FF",X"5B",X"FF",X"58",X"FF",X"55",X"FF",X"51",X"FF",X"4E",X"FF", + X"4B",X"FF",X"48",X"FF",X"45",X"FF",X"45",X"FF",X"3F",X"FF",X"3C",X"FF",X"39",X"FF",X"36",X"FF", + X"33",X"FF",X"30",X"FF",X"2D",X"FF",X"2A",X"FF",X"27",X"FF",X"24",X"FF",X"21",X"FF",X"1E",X"FF", + X"1B",X"FF",X"18",X"FF",X"16",X"FF",X"13",X"FF",X"10",X"FF",X"0E",X"FF",X"0C",X"FF",X"0A",X"FF", + X"08",X"FF",X"06",X"FF",X"05",X"FF",X"04",X"FF",X"03",X"FF",X"02",X"FF",X"01",X"FF",X"00",X"FF", + X"00",X"FF",X"01",X"FF",X"02",X"FF",X"03",X"FF",X"04",X"FF",X"05",X"FF",X"06",X"FF",X"08",X"FF", + X"0A",X"FF",X"0C",X"FF",X"0E",X"FF",X"10",X"FF",X"13",X"FF",X"16",X"FF",X"18",X"FF",X"1B",X"FF", + X"1E",X"FF",X"21",X"FF",X"24",X"FF",X"27",X"FF",X"2A",X"FF",X"2D",X"FF",X"30",X"FF",X"33",X"FF", + X"36",X"FF",X"39",X"FF",X"3C",X"FF",X"3F",X"FF",X"42",X"FF",X"45",X"FF",X"48",X"FF",X"4B",X"FF", + X"4E",X"FF",X"51",X"FF",X"55",X"FF",X"58",X"FF",X"5B",X"FF",X"5F",X"FF",X"63",X"FF",X"67",X"FF", + X"6A",X"FF",X"6E",X"FF",X"74",X"FF",X"79",X"FF",X"7E",X"FF",X"85",X"FF",X"88",X"FF",X"8E",X"FF", + X"94",X"FF",X"9A",X"FF",X"A0",X"FF",X"A7",X"FF",X"AD",X"FF",X"B4",X"FF",X"BB",X"FF",X"C2",X"FF", + X"CA",X"FF",X"D1",X"FF",X"D8",X"FF",X"E0",X"FF",X"E8",X"FF",X"F0",X"FF",X"F8",X"FF",X"00",X"00", + X"00",X"00",X"08",X"00",X"10",X"00",X"18",X"00",X"20",X"00",X"28",X"00",X"2F",X"00",X"36",X"00", + X"3E",X"00",X"45",X"00",X"4C",X"00",X"53",X"00",X"59",X"00",X"60",X"00",X"66",X"00",X"6C",X"00", + X"72",X"00",X"78",X"00",X"7B",X"00",X"7B",X"00",X"87",X"00",X"8C",X"00",X"92",X"00",X"96",X"00", + X"99",X"00",X"9D",X"00",X"A1",X"00",X"A5",X"00",X"A8",X"00",X"AB",X"00",X"AF",X"00",X"B2",X"00", + X"B5",X"00",X"B8",X"00",X"BB",X"00",X"B8",X"00",X"C1",X"00",X"C4",X"00",X"C7",X"00",X"CA",X"00", + X"CD",X"00",X"D0",X"00",X"D3",X"00",X"D6",X"00",X"D9",X"00",X"DC",X"00",X"DF",X"00",X"E2",X"00", + X"E5",X"00",X"E8",X"00",X"EA",X"00",X"E5",X"00",X"F0",X"00",X"F2",X"00",X"F4",X"00",X"F6",X"00", + X"F8",X"00",X"FA",X"00",X"FB",X"00",X"FC",X"00",X"FD",X"00",X"FE",X"00",X"FF",X"00",X"00",X"01"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_sound_board.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_sound_board.vhd new file mode 100644 index 00000000..44bbb38f --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_sound_board.vhd @@ -0,0 +1,426 @@ +--------------------------------------------------------------------------------- +-- Time pilot sound board by Dar (darfpga@aol.fr) (29/10/2017) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- gen_ram.vhd +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T80/T80se - Version : 0247 +----------------------------- +-- Z80 compatible microprocessor core +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity time_pilot_sound_board is +port( + clock_14 : in std_logic; + reset : in std_logic; + + sound_cmd : in std_logic_vector(7 downto 0); + sound_trig : in std_logic; + + audio_out : out std_logic_vector(10 downto 0); + + dbg_cpu_addr : out std_logic_vector(15 downto 0) + ); +end time_pilot_sound_board; + +architecture struct of time_pilot_sound_board is + + signal reset_n: std_logic; + signal clock_14n : std_logic; + + signal clock_div1 : std_logic_vector(11 downto 0) := (others => '0'); + signal biquinary_div : std_logic_vector(3 downto 0) := (others => '0'); + + signal cpu_clock : std_logic; + signal ayx_clock : std_logic; + + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_wr_n : std_logic; + signal cpu_mreq_n : std_logic; + signal cpu_irq_n : std_logic; + signal cpu_iorq_n : std_logic; + signal cpu_m1_n : std_logic; + + signal cpu_rom_do : std_logic_vector( 7 downto 0); + signal wram_do : std_logic_vector( 7 downto 0); + signal wram_we : std_logic; + + signal clr_irq_n : std_logic; + signal sen1_n : std_logic; + signal sen2_n : std_logic; + signal sen3_n : std_logic; + signal sen4_n : std_logic; + + signal sound_trig_r : std_logic; + + signal ay1_do : std_logic_vector(7 downto 0); + signal ay1_cs_n : std_logic; + signal ay1_bdir : std_logic; + signal ay1_bc1 : std_logic; + signal ay1_audio_muxed : std_logic_vector(7 downto 0); + signal ay1_audio_chan : std_logic_vector(1 downto 0); + signal ay1_port_b_di : std_logic_vector(7 downto 0); + + signal ay2_do : std_logic_vector(7 downto 0); + signal ay2_cs_n : std_logic; + signal ay2_bdir : std_logic; + signal ay2_bc1 : std_logic; + signal ay2_audio_muxed : std_logic_vector(7 downto 0); + signal ay2_audio_chan : std_logic_vector(1 downto 0); + + signal ay1_chan_a : std_logic_vector(7 downto 0); + signal ay1_chan_b : std_logic_vector(7 downto 0); + signal ay1_chan_c : std_logic_vector(7 downto 0); + signal ay2_chan_a : std_logic_vector(7 downto 0); + signal ay2_chan_b : std_logic_vector(7 downto 0); + signal ay2_chan_c : std_logic_vector(7 downto 0); + + signal filter_cmd_we : std_logic; + signal filter_cmd : std_logic_vector(11 downto 0); + signal mult_cmd : std_logic_vector(1 downto 0); + signal mult_value : integer range 0 to 779; + + signal Vc_1a : integer range -256*1024 to 256*1024-1; + signal Vc_1b : integer range -256*1024 to 256*1024-1; + signal Vc_1c : integer range -256*1024 to 256*1024-1; + signal Vc_2a : integer range -256*1024 to 256*1024-1; + signal Vc_2b : integer range -256*1024 to 256*1024-1; + signal Vc_2c : integer range -256*1024 to 256*1024-1; + signal Vc : integer range -256*1024 to 256*1024-1; + signal Vin : integer range -256 to 255; + signal dV : integer range -512 to 511; + signal Vcn_a : integer range -1024*1024 to 1024*1024-1; + signal Vcn_b : integer range -1024*1024 to 1024*1024-1; + signal Vcn_c : integer range -256*1024 to 256*1024-1; + +begin + +clock_14n <= not clock_14; +reset_n <= not reset; + +-- debug +process (reset, clock_14) +begin + if rising_edge(clock_14) and cpu_mreq_n ='0' then + dbg_cpu_addr <= cpu_addr; + end if; +end process; + +-------------------------------------------------------- +-- RC filters equation +-- +-- Vc : capacitor voltage = output voltage +-- fs : sample frequency +-- Vin : voltage at resistor input +-- +-- Vc(k+1) = Vc(k) + (Vin-Vc(k))/(fs.R.C) +-- +-- Vcn * 1024 <= Vcn * 1024 + (Vin-Vc) * 1024/(fs.R.C) +-- With Vcn = 1024 * Vc +-------------------------------------------------------- +-- Filters will be run at 14.318MHz/512 = 27.96KHz +-------------------------------------------------------- +-- 6 filters have to be implemented +-- RC equation is time multiplexed to save multiplier +-- for small FPGA +-------------------------------------------------------- + +-- mux Vc +with clock_div1(3 downto 0) select +Vc <= Vc_1a when X"0", -- Vc_xy : [0..255*1024] + Vc_1b when X"1", -- => Vc : [-256*1024..255*1024] + Vc_1c when X"2", + Vc_2a when X"3", + Vc_2b when X"4", + Vc_2c when others; + +-- mux Vin +with clock_div1(3 downto 0) select +Vin <= to_integer(unsigned(ay1_chan_a)) when X"0", -- ayx_chan_y : [0..255] + to_integer(unsigned(ay1_chan_b)) when X"1", -- => Vin : [-256:255] + to_integer(unsigned(ay1_chan_c)) when X"2", + to_integer(unsigned(ay2_chan_a)) when X"3", + to_integer(unsigned(ay2_chan_b)) when X"4", + to_integer(unsigned(ay2_chan_c)) when others; + +-- compute dV +dV <= Vin-Vc/1024; -- Vc/1024 : [0..255], dv : [-255..511] => [-512..511] + +-- mux filter cmd +with clock_div1(3 downto 0) select +mult_cmd <= filter_cmd( 7 downto 6) when X"0", + filter_cmd( 9 downto 8) when X"1", + filter_cmd(11 downto 10) when X"2", + filter_cmd( 1 downto 0) when X"3", + filter_cmd( 3 downto 2) when X"4", + filter_cmd( 5 downto 4) when others; + +-- mux multiplier value +with mult_cmd select +mult_value <= 779 when "10", -- 0.047uF/1KOhm => (1024/fs.R.C = 779, cut fcy 3386Hz) + 166 when "01", -- 0.220uF/1KOhm => (1024/fs.R.C = 166, cut fcy 723Hz) + 137 when "11", -- 0.267uF/1KOhm => (1024/fs.R.C = 137, cut fcy 596Hz) + 779 when others; -- Not use + +-- compute Vcn +Vcn_a <= Vin*1024 when mult_cmd = "00" else Vc + dv*mult_value; -- => Vcn_a : [-1024*1024..1023*1024] + +-- limit to > 0 +Vcn_b <= 0 when Vcn_a < 0 else Vcn_a; + +-- limit to < 255*1024 +Vcn_c <= 255*1024 when Vcn_b > 255*1024 else Vcn_b; + +-- demux/store result and mix channels +process (clock_14) +begin + if rising_edge(clock_14) then -- 14.318MHz/512 => fs = 27.96KHz + + -- demux & down sample + if clock_div1(8 downto 0) = '0'&X"00" then Vc_1a <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"01" then Vc_1b <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"02" then Vc_1c <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"03" then Vc_2a <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"04" then Vc_2b <= Vcn_c; end if; + if clock_div1(8 downto 0) = '0'&X"05" then Vc_2c <= Vcn_c; end if; + + -- rescale and mix channels with down sample + if clock_div1(8 downto 0) = '0'&X"06" then + audio_out <= std_logic_vector(to_unsigned(Vc_1a/1024,11)) + + std_logic_vector(to_unsigned(Vc_1b/1024,11)) + + std_logic_vector(to_unsigned(Vc_1c/1024,11)) + + std_logic_vector(to_unsigned(Vc_2a/1024,11)) + + std_logic_vector(to_unsigned(Vc_2b/1024,11)) + + std_logic_vector(to_unsigned(Vc_2c/1024,11)); + end if; + end if; +end process; + + +-- divide clocks +-- random generator ? +process (clock_14) +begin + if reset='1' then + clock_div1 <= (others =>'0'); + biquinary_div <= (others =>'0'); + else + if rising_edge(clock_14) then + clock_div1 <= clock_div1 + '1'; + + if clock_div1 = X"800" then + if biquinary_div(3 downto 1) = "100" then + biquinary_div(3 downto 1) <= "000"; + biquinary_div(0) <= not biquinary_div(0); + else + biquinary_div(3 downto 1) <= biquinary_div(3 downto 1) + '1'; + end if; + end if; + + end if; + end if; +end process; + +-- make clocks for cpu and sound generators +cpu_clock <= clock_div1(2); +ayx_clock <= not clock_div1(2); + +-- mux rom/ram/devices data ouput to cpu data input w.r.t cpu address +cpu_di <= cpu_rom_do when cpu_addr(15 downto 12) = "0000" else -- 0000-0FFF + wram_do when cpu_addr(15 downto 12) = "0011" else -- 3000-3FFF + ay1_do when cpu_addr(15 downto 13) = "010" else -- 4000-5FFF + ay2_do when cpu_addr(15 downto 13) = "011" else -- 6000-7FFF + X"FF"; + +-- write enable to working ram and filter command register +wram_we <= '1' when cpu_wr_n = '0' and cpu_addr(15 downto 12) = "0011" else '0'; +filter_cmd_we <= '1' when cpu_wr_n = '0' and cpu_addr(15) = '1' else '0'; + +-- chip select with r/w direction to AY chips +sen1_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"4" else '1'; +sen2_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"5" else '1'; +sen3_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"6" else '1'; +sen4_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"7" else '1'; + +-- finalise AY r/w & address controls +ay1_bc1 <= not sen2_n or ( cpu_wr_n and not sen1_n); +ay1_bdir <= not sen2_n or (not cpu_wr_n and not sen1_n); +ay1_cs_n <= sen1_n and sen2_n; + +ay2_bc1 <= not sen4_n or ( cpu_wr_n and not sen3_n); +ay2_bdir <= not sen4_n or (not cpu_wr_n and not sen3_n); +ay2_cs_n <= sen3_n and sen4_n; + +-- input random (?) to AY1 chip +ay1_port_b_di <= biquinary_div(0)&biquinary_div(3)&biquinary_div(2)&clock_div1(11)&"0000"; + +-- clear irq when reset and irq acknowledge +clr_irq_n <= reset_n and (cpu_m1_n or cpu_iorq_n); + +-- regsiter filters commands (11 bits data are cpu address) +process (cpu_clock) +begin + if rising_edge(cpu_clock) then + if filter_cmd_we = '1' then filter_cmd <= cpu_addr(11 downto 0); end if; + end if; +end process; + +-- latch sound trigger rising edge to set cpu_irq, and manage clear +process (clock_14) +begin + if rising_edge(clock_14) then + + sound_trig_r <= sound_trig; + + if clr_irq_n = '0' then + cpu_irq_n <= '1'; + else + if sound_trig ='1' and sound_trig_r = '0' then + cpu_irq_n <= '0'; + end if; + end if; + + end if; +end process; + +-- demux AY chips output +process (ayx_clock) +begin + if rising_edge(ayx_clock) then + if ay1_audio_chan = "00" then ay1_chan_a <= ay1_audio_muxed; end if; + if ay1_audio_chan = "01" then ay1_chan_b <= ay1_audio_muxed; end if; + if ay1_audio_chan = "10" then ay1_chan_c <= ay1_audio_muxed; end if; + if ay2_audio_chan = "00" then ay2_chan_a <= ay2_audio_muxed; end if; + if ay2_audio_chan = "01" then ay2_chan_b <= ay2_audio_muxed; end if; + if ay2_audio_chan = "10" then ay2_chan_c <= ay2_audio_muxed; end if; + end if; +end process; + +-- microprocessor Z80 +cpu : entity work.T80se +generic map(Mode => 0, T2Write => 1, IOWait => 1) +port map( + RESET_n => reset_n, + CLK_n => cpu_clock, + CLKEN => '1', + WAIT_n => '1', + INT_n => cpu_irq_n, + NMI_n => '1', + BUSRQ_n => '1', + M1_n => cpu_m1_n, + MREQ_n => cpu_mreq_n, + IORQ_n => cpu_iorq_n, + RD_n => open, + WR_n => cpu_wr_n, + RFSH_n => open, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_di, + DO => cpu_do +); + +-- cpu1 program ROM +rom_cpu1 : entity work.time_pilot_sound_prog +port map( + clk => clock_14n, + addr => cpu_addr(11 downto 0), + data => cpu_rom_do +); + +-- working RAM +wram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 10) +port map( + clk => clock_14n, + we => wram_we, + addr => cpu_addr(9 downto 0), + d => cpu_do, + q => wram_do +); + +-- AY-3-8910 #1 +ay_3_8910_1 : entity work.YM2149 +port map( + -- data bus + I_DA => cpu_do, -- in std_logic_vector(7 downto 0); + O_DA => ay1_do, -- out std_logic_vector(7 downto 0); + O_DA_OE_L => open, -- out std_logic; + -- control + I_A9_L => ay1_cs_n, -- in std_logic; + I_A8 => '1', -- in std_logic; + I_BDIR => ay1_bdir, -- in std_logic; + I_BC2 => '1', -- in std_logic; + I_BC1 => ay1_bc1, -- in std_logic; + I_SEL_L => '1', -- in std_logic; + + O_AUDIO => ay1_audio_muxed, -- out std_logic_vector(7 downto 0); + O_CHAN => ay1_audio_chan, -- out std_logic_vector(1 downto 0); + + -- port a + I_IOA => sound_cmd, -- in std_logic_vector(7 downto 0); + O_IOA => open, -- out std_logic_vector(7 downto 0); + O_IOA_OE_L => open, -- out std_logic; + -- port b + I_IOB => ay1_port_b_di, -- in std_logic_vector(7 downto 0); + O_IOB => open, -- out std_logic_vector(7 downto 0); + O_IOB_OE_L => open, -- out std_logic; + + ENA => '1', --cpu_ena, -- in std_logic; -- clock enable for higher speed operation + RESET_L => reset_n, -- in std_logic; + CLK => ayx_clock -- in std_logic -- note 6 Mhz +); + +-- AY-3-8910 #2 +ay_3_8910_2 : entity work.YM2149 +port map( + -- data bus + I_DA => cpu_do, -- in std_logic_vector(7 downto 0); + O_DA => ay2_do, -- out std_logic_vector(7 downto 0); + O_DA_OE_L => open, -- out std_logic; + -- control + I_A9_L => ay2_cs_n, -- in std_logic; + I_A8 => '1', -- in std_logic; + I_BDIR => ay2_bdir, -- in std_logic; + I_BC2 => '1', -- in std_logic; + I_BC1 => ay2_bc1, -- in std_logic; + I_SEL_L => '1', -- in std_logic; + + O_AUDIO => ay2_audio_muxed, -- out std_logic_vector(7 downto 0); + O_CHAN => ay2_audio_chan, -- out std_logic_vector(1 downto 0); + + -- port a + I_IOA => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOA => open, -- out std_logic_vector(7 downto 0); + O_IOA_OE_L => open, -- out std_logic; + -- port b + I_IOB => (others => '0'), -- in std_logic_vector(7 downto 0); + O_IOB => open, -- out std_logic_vector(7 downto 0); + O_IOB_OE_L => open, -- out std_logic; + + ENA => '1', --cpu_ena, -- in std_logic; -- clock enable for higher speed operation + RESET_L => reset_n, -- in std_logic; + CLK => ayx_clock -- in std_logic -- note 6 Mhz +); + + +end struct; \ No newline at end of file diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_sound_prog.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_sound_prog.vhd new file mode 100644 index 00000000..220e010c --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_sound_prog.vhd @@ -0,0 +1,236 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity time_pilot_sound_prog is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of time_pilot_sound_prog is + type rom is array(0 to 3419) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"21",X"00",X"30",X"06",X"00",X"C3",X"9B",X"00",X"32",X"00",X"50",X"3A",X"00",X"40",X"C9",X"FF", + X"32",X"00",X"70",X"3A",X"00",X"60",X"C9",X"FF",X"32",X"00",X"50",X"79",X"32",X"00",X"40",X"C9", + X"32",X"00",X"70",X"79",X"32",X"00",X"60",X"C9",X"87",X"85",X"6F",X"7C",X"CE",X"00",X"67",X"7E", + X"23",X"66",X"6F",X"E9",X"FF",X"FF",X"FF",X"FF",X"D9",X"08",X"CD",X"40",X"00",X"08",X"D9",X"C9", + X"3E",X"0E",X"CF",X"B7",X"28",X"2F",X"57",X"E6",X"7F",X"FE",X"21",X"D0",X"CB",X"7A",X"20",X"42", + X"CD",X"80",X"00",X"20",X"1C",X"CD",X"80",X"00",X"20",X"16",X"21",X"00",X"30",X"1E",X"06",X"7E", + X"1D",X"28",X"08",X"2C",X"2C",X"BE",X"38",X"F8",X"C3",X"5F",X"00",X"BA",X"D0",X"CD",X"80",X"00", + X"72",X"2C",X"36",X"00",X"C9",X"21",X"00",X"30",X"06",X"0C",X"AF",X"77",X"2C",X"10",X"FC",X"C9", + X"21",X"00",X"30",X"06",X"06",X"0E",X"07",X"BE",X"28",X"05",X"2C",X"2C",X"10",X"F9",X"41",X"79", + X"90",X"C9",X"CD",X"80",X"00",X"C8",X"AF",X"77",X"2C",X"77",X"C9",X"70",X"23",X"7C",X"FE",X"34", + X"20",X"F9",X"F9",X"ED",X"56",X"21",X"00",X"80",X"22",X"0C",X"30",X"77",X"0E",X"00",X"16",X"06", + X"7A",X"CD",X"9C",X"01",X"15",X"20",X"F9",X"0E",X"38",X"3E",X"07",X"DF",X"3E",X"07",X"E7",X"FB", + X"3E",X"0F",X"CF",X"E6",X"F0",X"20",X"F9",X"F3",X"3E",X"01",X"32",X"0E",X"30",X"3A",X"01",X"30", + X"B7",X"3A",X"00",X"30",X"28",X"06",X"CD",X"7F",X"01",X"C3",X"DF",X"00",X"CD",X"69",X"01",X"FB", + X"00",X"00",X"F3",X"3E",X"02",X"32",X"0E",X"30",X"3A",X"03",X"30",X"B7",X"3A",X"02",X"30",X"28", + X"06",X"CD",X"7F",X"01",X"C3",X"FA",X"00",X"CD",X"69",X"01",X"FB",X"00",X"00",X"F3",X"3E",X"03", + X"32",X"0E",X"30",X"3A",X"05",X"30",X"B7",X"3A",X"04",X"30",X"28",X"06",X"CD",X"7F",X"01",X"C3", + X"15",X"01",X"CD",X"69",X"01",X"FB",X"00",X"00",X"F3",X"3E",X"04",X"32",X"0E",X"30",X"3A",X"07", + X"30",X"B7",X"3A",X"06",X"30",X"28",X"06",X"CD",X"7F",X"01",X"C3",X"30",X"01",X"CD",X"69",X"01", + X"FB",X"00",X"00",X"F3",X"3E",X"05",X"32",X"0E",X"30",X"3A",X"09",X"30",X"B7",X"3A",X"08",X"30", + X"28",X"06",X"CD",X"7F",X"01",X"C3",X"4B",X"01",X"CD",X"69",X"01",X"FB",X"00",X"00",X"F3",X"3E", + X"06",X"32",X"0E",X"30",X"3A",X"0B",X"30",X"B7",X"3A",X"0A",X"30",X"28",X"06",X"CD",X"7F",X"01", + X"C3",X"BF",X"00",X"CD",X"69",X"01",X"C3",X"BF",X"00",X"21",X"92",X"0A",X"EF",X"B7",X"20",X"17", + X"21",X"01",X"30",X"3A",X"0E",X"30",X"3D",X"87",X"5F",X"16",X"00",X"19",X"36",X"01",X"C9",X"B7", + X"C8",X"21",X"D4",X"0A",X"EF",X"B7",X"C8",X"21",X"00",X"30",X"3A",X"0E",X"30",X"3D",X"87",X"4F", + X"06",X"00",X"09",X"70",X"2C",X"70",X"C9",X"0E",X"00",X"3A",X"0E",X"30",X"FE",X"04",X"30",X"05", + X"C6",X"07",X"C3",X"18",X"00",X"C6",X"04",X"C3",X"20",X"00",X"3A",X"0E",X"30",X"FE",X"04",X"30", + X"0B",X"3D",X"87",X"47",X"4D",X"DF",X"78",X"3C",X"4C",X"C3",X"18",X"00",X"D6",X"04",X"87",X"47", + X"4D",X"E7",X"78",X"3C",X"4C",X"C3",X"20",X"00",X"01",X"FC",X"FF",X"21",X"00",X"00",X"1F",X"CB", + X"15",X"1F",X"CB",X"15",X"3A",X"0E",X"30",X"C6",X"02",X"FE",X"06",X"38",X"04",X"D6",X"06",X"28", + X"0A",X"87",X"29",X"37",X"CB",X"11",X"CB",X"10",X"3D",X"20",X"F7",X"EB",X"2A",X"0C",X"30",X"7D", + X"A1",X"B3",X"6F",X"7C",X"A0",X"B2",X"67",X"22",X"0C",X"30",X"77",X"C9",X"DD",X"35",X"01",X"C0", + X"DD",X"7E",X"08",X"DD",X"77",X"01",X"DD",X"35",X"00",X"28",X"15",X"DD",X"CB",X"00",X"46",X"C8", + X"DD",X"7E",X"09",X"B7",X"C8",X"DD",X"86",X"07",X"F8",X"DD",X"77",X"07",X"4F",X"C3",X"99",X"01", + X"DD",X"6E",X"02",X"DD",X"66",X"03",X"7E",X"57",X"E6",X"1F",X"28",X"24",X"FE",X"1F",X"28",X"37", + X"CD",X"50",X"02",X"7A",X"E6",X"1F",X"3D",X"07",X"4F",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"09", + X"5E",X"23",X"56",X"EB",X"CD",X"AA",X"01",X"DD",X"4E",X"06",X"DD",X"71",X"07",X"C3",X"99",X"01", + X"23",X"DD",X"75",X"02",X"DD",X"74",X"03",X"7A",X"E6",X"E0",X"07",X"07",X"07",X"47",X"3E",X"80", + X"07",X"10",X"FD",X"DD",X"77",X"00",X"C9",X"7A",X"E6",X"E0",X"07",X"07",X"07",X"11",X"20",X"02", + X"D5",X"23",X"5D",X"54",X"23",X"DD",X"75",X"02",X"DD",X"74",X"03",X"21",X"81",X"02",X"C3",X"28", + X"00",X"91",X"02",X"A5",X"02",X"B5",X"02",X"BA",X"02",X"C9",X"02",X"C9",X"02",X"BF",X"02",X"C9", + X"02",X"EB",X"4E",X"CB",X"21",X"06",X"00",X"21",X"CE",X"02",X"09",X"5E",X"23",X"56",X"DD",X"73", + X"04",X"DD",X"72",X"05",X"C9",X"EB",X"4E",X"06",X"00",X"21",X"66",X"03",X"09",X"7E",X"DD",X"77", + X"08",X"DD",X"77",X"01",X"C9",X"1A",X"DD",X"77",X"06",X"C9",X"1A",X"DD",X"77",X"09",X"C9",X"1A", + X"DD",X"77",X"02",X"13",X"1A",X"DD",X"77",X"03",X"C9",X"E1",X"E1",X"3E",X"FF",X"C9",X"EE",X"02", + X"F2",X"02",X"F6",X"02",X"FA",X"02",X"FE",X"02",X"02",X"03",X"06",X"03",X"0A",X"03",X"0E",X"03", + X"12",X"03",X"16",X"03",X"1A",X"03",X"1E",X"03",X"22",X"03",X"26",X"03",X"2A",X"03",X"FF",X"0F", + X"F2",X"07",X"80",X"07",X"14",X"07",X"AE",X"06",X"4E",X"06",X"F3",X"05",X"9E",X"05",X"4E",X"05", + X"01",X"05",X"B9",X"04",X"76",X"04",X"36",X"04",X"F9",X"03",X"C0",X"03",X"8A",X"03",X"57",X"03", + X"27",X"03",X"FA",X"02",X"CF",X"02",X"A7",X"02",X"81",X"02",X"5D",X"02",X"3B",X"02",X"1B",X"02", + X"FD",X"01",X"E0",X"01",X"C5",X"01",X"AC",X"01",X"94",X"01",X"7D",X"01",X"68",X"01",X"53",X"01", + X"40",X"01",X"2E",X"01",X"1D",X"01",X"0D",X"01",X"FE",X"00",X"F0",X"00",X"E3",X"00",X"D6",X"00", + X"CA",X"00",X"BE",X"00",X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97",X"00",X"8F",X"00",X"87",X"00", + X"7F",X"00",X"78",X"00",X"71",X"00",X"6B",X"00",X"65",X"00",X"5F",X"00",X"5A",X"00",X"55",X"00", + X"50",X"00",X"4C",X"00",X"07",X"00",X"3C",X"38",X"34",X"30",X"2C",X"28",X"24",X"20",X"1E",X"1C", + X"1A",X"18",X"16",X"14",X"12",X"10",X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"21",X"B5", + X"03",X"11",X"0F",X"30",X"01",X"32",X"00",X"ED",X"B0",X"87",X"4F",X"87",X"87",X"81",X"4F",X"06", + X"00",X"21",X"6E",X"0B",X"09",X"11",X"11",X"30",X"ED",X"A0",X"ED",X"A0",X"1E",X"1B",X"ED",X"A0", + X"ED",X"A0",X"1E",X"25",X"ED",X"A0",X"ED",X"A0",X"1E",X"2F",X"ED",X"A0",X"ED",X"A0",X"1E",X"39", + X"ED",X"A0",X"ED",X"A0",X"C9",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"01", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"FF",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"01",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"AF",X"CD",X"C8",X"01",X"21",X"6B",X"00",X"CD",X"AA", + X"01",X"21",X"41",X"30",X"36",X"00",X"2C",X"36",X"47",X"2C",X"0E",X"09",X"71",X"CD",X"99",X"01", + X"AF",X"C9",X"21",X"41",X"30",X"35",X"7E",X"E6",X"03",X"20",X"18",X"2C",X"35",X"7E",X"28",X"1D", + X"E6",X"07",X"28",X"11",X"E6",X"03",X"3D",X"4F",X"06",X"00",X"21",X"2F",X"04",X"09",X"6E",X"60", + X"CD",X"AA",X"01",X"AF",X"C9",X"2C",X"35",X"4E",X"CD",X"99",X"01",X"AF",X"C9",X"3D",X"C9",X"47", + X"55",X"6B",X"AF",X"CD",X"C8",X"01",X"0E",X"0A",X"CD",X"99",X"01",X"3E",X"80",X"32",X"44",X"30", + X"21",X"04",X"00",X"22",X"45",X"30",X"CD",X"AA",X"01",X"AF",X"C9",X"21",X"44",X"30",X"35",X"7E", + X"28",X"0E",X"FE",X"6D",X"28",X"EA",X"2A",X"45",X"30",X"01",X"18",X"00",X"09",X"C3",X"43",X"04", + X"3D",X"C9",X"AF",X"CD",X"C8",X"01",X"21",X"C0",X"00",X"22",X"47",X"30",X"CD",X"AA",X"01",X"0E", + X"09",X"CD",X"99",X"01",X"AF",X"21",X"49",X"30",X"77",X"C9",X"21",X"49",X"30",X"35",X"7E",X"E6", + X"07",X"20",X"12",X"2A",X"47",X"30",X"01",X"40",X"00",X"09",X"7C",X"FE",X"0C",X"28",X"08",X"22", + X"47",X"30",X"CD",X"AA",X"01",X"AF",X"C9",X"3E",X"FF",X"C9",X"3E",X"01",X"CD",X"C8",X"01",X"21", + X"4A",X"30",X"36",X"00",X"2C",X"0E",X"0F",X"71",X"CD",X"99",X"01",X"21",X"60",X"00",X"22",X"4C", + X"30",X"AF",X"C9",X"21",X"4A",X"30",X"35",X"7E",X"E6",X"0F",X"28",X"16",X"2A",X"4C",X"30",X"FE", + X"0C",X"01",X"10",X"00",X"30",X"03",X"01",X"D0",X"FF",X"09",X"22",X"4C",X"30",X"CD",X"AA",X"01", + X"AF",X"C9",X"2C",X"35",X"4E",X"20",X"D1",X"3D",X"C9",X"AF",X"CD",X"C8",X"01",X"21",X"4E",X"30", + X"36",X"B0",X"2C",X"36",X"0D",X"35",X"4E",X"CD",X"99",X"01",X"2C",X"36",X"20",X"6E",X"26",X"00", + X"CD",X"AA",X"01",X"AF",X"C9",X"21",X"4E",X"30",X"35",X"7E",X"28",X"0C",X"2C",X"E6",X"0F",X"28", + X"E4",X"2C",X"34",X"C3",X"ED",X"04",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"C8",X"01",X"21",X"50", + X"00",X"CD",X"AA",X"01",X"21",X"51",X"30",X"36",X"40",X"2C",X"0E",X"05",X"71",X"CD",X"99",X"01", + X"2C",X"36",X"17",X"2C",X"36",X"50",X"AF",X"C9",X"21",X"51",X"30",X"35",X"28",X"E9",X"7E",X"2C", + X"E6",X"0F",X"20",X"05",X"34",X"4E",X"CD",X"99",X"01",X"2C",X"7E",X"C6",X"29",X"77",X"2C",X"AE", + X"E6",X"3F",X"C6",X"50",X"77",X"6F",X"26",X"00",X"CD",X"AA",X"01",X"AF",X"C9",X"AF",X"CD",X"C8", + X"01",X"21",X"56",X"30",X"36",X"08",X"2D",X"36",X"2C",X"2C",X"35",X"28",X"29",X"4E",X"CD",X"99", + X"01",X"21",X"00",X"00",X"22",X"57",X"30",X"CD",X"AA",X"01",X"AF",X"C9",X"21",X"55",X"30",X"35", + X"7E",X"28",X"E4",X"FE",X"16",X"28",X"EA",X"2A",X"57",X"30",X"01",X"10",X"00",X"09",X"22",X"57", + X"30",X"CD",X"AA",X"01",X"AF",X"C9",X"3D",X"C9",X"3E",X"01",X"CD",X"C8",X"01",X"21",X"5C",X"30", + X"36",X"0C",X"4E",X"CD",X"99",X"01",X"2D",X"36",X"00",X"21",X"80",X"00",X"22",X"59",X"30",X"CD", + X"AA",X"01",X"AF",X"C9",X"21",X"5B",X"30",X"34",X"7E",X"FE",X"59",X"28",X"0F",X"4F",X"06",X"00", + X"2A",X"59",X"30",X"09",X"22",X"59",X"30",X"CD",X"AA",X"01",X"AF",X"C9",X"2C",X"7E",X"D6",X"04", + X"28",X"04",X"77",X"C3",X"92",X"05",X"3D",X"C9",X"3E",X"01",X"CD",X"C8",X"01",X"21",X"5D",X"30", + X"36",X"00",X"2C",X"36",X"E0",X"2C",X"0E",X"0D",X"71",X"CD",X"99",X"01",X"2C",X"36",X"93",X"2C", + X"36",X"D5",X"21",X"C0",X"00",X"CD",X"AA",X"01",X"AF",X"C9",X"21",X"5D",X"30",X"35",X"CB",X"46", + X"20",X"25",X"2C",X"35",X"7E",X"28",X"22",X"FE",X"D0",X"28",X"DA",X"2C",X"E6",X"0F",X"20",X"05", + X"35",X"4E",X"CD",X"99",X"01",X"2C",X"7E",X"C6",X"53",X"77",X"2C",X"AE",X"77",X"6F",X"FE",X"E0", + X"38",X"01",X"AF",X"67",X"CD",X"AA",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"C8",X"01",X"21", + X"62",X"30",X"36",X"00",X"2C",X"36",X"C0",X"2C",X"36",X"0D",X"35",X"4E",X"CD",X"99",X"01",X"21", + X"20",X"00",X"22",X"65",X"30",X"CD",X"AA",X"01",X"AF",X"C9",X"21",X"62",X"30",X"35",X"7E",X"E6", + X"01",X"20",X"17",X"2C",X"35",X"7E",X"28",X"14",X"2C",X"E6",X"0F",X"28",X"DD",X"2A",X"65",X"30", + X"01",X"40",X"00",X"09",X"22",X"65",X"30",X"CD",X"AA",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD", + X"C8",X"01",X"0E",X"0C",X"CD",X"99",X"01",X"21",X"67",X"30",X"36",X"B8",X"2C",X"36",X"1F",X"21", + X"1F",X"00",X"CD",X"AA",X"01",X"AF",X"C9",X"21",X"67",X"30",X"35",X"7E",X"28",X"15",X"FE",X"60", + X"28",X"EA",X"E6",X"03",X"20",X"0B",X"2C",X"7E",X"C6",X"20",X"77",X"6F",X"26",X"00",X"CD",X"AA", + X"01",X"AF",X"C9",X"3D",X"C9",X"3E",X"01",X"CD",X"C8",X"01",X"21",X"C0",X"00",X"CD",X"AA",X"01", + X"0E",X"0F",X"CD",X"99",X"01",X"AF",X"21",X"69",X"30",X"77",X"2C",X"36",X"53",X"2C",X"36",X"09", + X"2C",X"36",X"37",X"C9",X"21",X"69",X"30",X"35",X"56",X"2C",X"7E",X"C6",X"D5",X"77",X"2C",X"CB", + X"42",X"20",X"09",X"AE",X"77",X"E6",X"EF",X"4F",X"CD",X"99",X"01",X"79",X"2C",X"AE",X"77",X"F6", + X"80",X"6F",X"26",X"00",X"CD",X"AA",X"01",X"AF",X"C9",X"3E",X"01",X"CD",X"C8",X"01",X"21",X"6D", + X"30",X"36",X"28",X"2C",X"36",X"05",X"2C",X"36",X"30",X"21",X"00",X"06",X"CD",X"AA",X"01",X"0E", + X"08",X"CD",X"99",X"01",X"AF",X"C9",X"21",X"6D",X"30",X"35",X"28",X"E5",X"7E",X"E6",X"07",X"C6", + X"08",X"4F",X"CD",X"99",X"01",X"2C",X"7E",X"C6",X"B9",X"77",X"2C",X"AE",X"77",X"6F",X"26",X"06", + X"CD",X"AA",X"01",X"AF",X"C9",X"3E",X"01",X"CD",X"C8",X"01",X"21",X"00",X"01",X"CD",X"AA",X"01", + X"21",X"70",X"30",X"36",X"00",X"2C",X"0E",X"0F",X"71",X"CD",X"99",X"01",X"AF",X"2C",X"77",X"2C", + X"77",X"C9",X"21",X"70",X"30",X"35",X"7E",X"CB",X"47",X"23",X"20",X"0B",X"35",X"E6",X"10",X"20", + X"02",X"34",X"34",X"4E",X"CD",X"99",X"01",X"2C",X"7E",X"C6",X"D3",X"77",X"2C",X"AE",X"77",X"E6", + X"7F",X"C6",X"A8",X"6F",X"E6",X"07",X"67",X"CD",X"AA",X"01",X"AF",X"C9",X"3E",X"01",X"CD",X"C8", + X"01",X"21",X"00",X"01",X"CD",X"AA",X"01",X"0E",X"0C",X"CD",X"99",X"01",X"AF",X"21",X"74",X"30", + X"77",X"2C",X"77",X"C9",X"21",X"74",X"30",X"7E",X"C6",X"97",X"77",X"2C",X"AE",X"77",X"E6",X"7F", + X"C6",X"C0",X"6F",X"26",X"01",X"CD",X"AA",X"01",X"AF",X"C9",X"3E",X"01",X"CD",X"C8",X"01",X"0E", + X"0A",X"CD",X"99",X"01",X"21",X"76",X"30",X"36",X"30",X"2C",X"36",X"02",X"2C",X"3E",X"E0",X"77", + X"2C",X"77",X"6F",X"26",X"00",X"CD",X"AA",X"01",X"AF",X"C9",X"21",X"76",X"30",X"35",X"7E",X"28", + X"E6",X"2C",X"E6",X"0F",X"28",X"07",X"7E",X"2C",X"2C",X"86",X"C3",X"A1",X"07",X"34",X"34",X"2C", + X"7E",X"D6",X"20",X"C3",X"9F",X"07",X"3E",X"01",X"CD",X"C8",X"01",X"21",X"00",X"00",X"CD",X"AA", + X"01",X"21",X"7A",X"30",X"36",X"00",X"2C",X"0E",X"0F",X"71",X"CD",X"99",X"01",X"2C",X"36",X"45", + X"2C",X"36",X"99",X"AF",X"C9",X"21",X"7A",X"30",X"35",X"7E",X"CB",X"47",X"20",X"19",X"2C",X"E6", + X"3F",X"20",X"07",X"35",X"28",X"13",X"4E",X"CD",X"99",X"01",X"2C",X"7E",X"C6",X"D3",X"77",X"2C", + X"AE",X"77",X"6F",X"67",X"CD",X"AA",X"01",X"AF",X"C9",X"3D",X"C9",X"3E",X"01",X"CD",X"C8",X"01", + X"21",X"00",X"00",X"22",X"81",X"30",X"CD",X"AA",X"01",X"21",X"7E",X"30",X"36",X"00",X"2C",X"0E", + X"0F",X"71",X"CD",X"99",X"01",X"2C",X"AF",X"77",X"C9",X"21",X"7E",X"30",X"35",X"7E",X"57",X"2C", + X"E6",X"1F",X"20",X"07",X"35",X"28",X"1E",X"4E",X"CD",X"99",X"01",X"2C",X"7E",X"C6",X"C5",X"77", + X"2A",X"81",X"30",X"AA",X"AD",X"6F",X"67",X"FE",X"80",X"30",X"02",X"26",X"01",X"22",X"81",X"30", + X"CD",X"AA",X"01",X"AF",X"C9",X"3D",X"C9",X"3E",X"02",X"CD",X"C8",X"01",X"21",X"00",X"00",X"CD", + X"AA",X"01",X"21",X"83",X"30",X"0E",X"0F",X"71",X"CD",X"99",X"01",X"2C",X"36",X"30",X"2C",X"36", + X"95",X"2C",X"36",X"3D",X"21",X"70",X"00",X"22",X"87",X"30",X"22",X"89",X"30",X"AF",X"C9",X"21", + X"84",X"30",X"35",X"7E",X"28",X"28",X"FE",X"10",X"38",X"10",X"2C",X"7E",X"C6",X"C9",X"77",X"2C", + X"AE",X"77",X"6F",X"26",X"01",X"CD",X"AA",X"01",X"AF",X"C9",X"D6",X"10",X"ED",X"44",X"87",X"4F", + X"06",X"00",X"2A",X"89",X"30",X"09",X"22",X"89",X"30",X"CD",X"AA",X"01",X"AF",X"C9",X"2D",X"35", + X"28",X"1C",X"4E",X"CD",X"99",X"01",X"2C",X"3A",X"85",X"30",X"E6",X"3F",X"C6",X"30",X"77",X"2A", + X"87",X"30",X"01",X"60",X"00",X"09",X"22",X"87",X"30",X"22",X"89",X"30",X"AF",X"C9",X"3D",X"C9", + X"3E",X"02",X"CD",X"C8",X"01",X"21",X"00",X"00",X"CD",X"AA",X"01",X"21",X"8B",X"30",X"0E",X"0F", + X"71",X"CD",X"99",X"01",X"2C",X"36",X"30",X"2C",X"36",X"95",X"2C",X"36",X"3D",X"21",X"38",X"00", + X"22",X"8F",X"30",X"22",X"91",X"30",X"AF",X"C9",X"21",X"8C",X"30",X"35",X"7E",X"28",X"23",X"FE", + X"10",X"38",X"10",X"2C",X"7E",X"C6",X"D3",X"77",X"2C",X"AE",X"77",X"6F",X"26",X"01",X"CD",X"AA", + X"01",X"AF",X"C9",X"2A",X"91",X"30",X"01",X"30",X"00",X"09",X"22",X"91",X"30",X"CD",X"AA",X"01", + X"AF",X"C9",X"2D",X"35",X"28",X"1C",X"4E",X"CD",X"99",X"01",X"2C",X"3A",X"8D",X"30",X"E6",X"3F", + X"C6",X"30",X"77",X"2A",X"8F",X"30",X"01",X"06",X"00",X"09",X"22",X"8F",X"30",X"22",X"91",X"30", + X"AF",X"C9",X"3D",X"C9",X"3E",X"01",X"CD",X"C8",X"01",X"21",X"93",X"30",X"36",X"00",X"2C",X"36", + X"D0",X"2C",X"0E",X"0D",X"71",X"CD",X"99",X"01",X"2C",X"36",X"93",X"2C",X"36",X"D5",X"21",X"C0", + X"00",X"CD",X"AA",X"01",X"AF",X"C9",X"21",X"93",X"30",X"35",X"7E",X"E6",X"03",X"20",X"29",X"2C", + X"35",X"28",X"27",X"7E",X"FE",X"98",X"28",X"D9",X"FE",X"80",X"28",X"D5",X"2C",X"E6",X"0F",X"20", + X"05",X"35",X"4E",X"CD",X"99",X"01",X"2C",X"7E",X"C6",X"53",X"77",X"2C",X"AE",X"77",X"6F",X"FE", + X"E0",X"38",X"01",X"AF",X"67",X"CD",X"AA",X"01",X"AF",X"C9",X"3D",X"C9",X"AF",X"CD",X"C8",X"01", + X"0E",X"09",X"CD",X"99",X"01",X"21",X"99",X"30",X"3E",X"F6",X"D6",X"06",X"77",X"D6",X"7E",X"28", + X"1E",X"2D",X"36",X"30",X"21",X"30",X"00",X"CD",X"AA",X"01",X"AF",X"C9",X"21",X"98",X"30",X"7E", + X"C6",X"06",X"77",X"2C",X"BE",X"28",X"E3",X"6F",X"26",X"00",X"CD",X"AA",X"01",X"AF",X"C9",X"3D", + X"C9",X"3E",X"01",X"CD",X"C8",X"01",X"0E",X"0F",X"CD",X"99",X"01",X"21",X"9A",X"30",X"36",X"1D", + X"2C",X"2D",X"35",X"7E",X"28",X"1A",X"2C",X"77",X"87",X"6F",X"26",X"00",X"CD",X"AA",X"01",X"AF", + X"C9",X"21",X"9B",X"30",X"35",X"28",X"EA",X"6E",X"26",X"00",X"29",X"CD",X"AA",X"01",X"AF",X"C9", + X"3D",X"C9",X"AF",X"CD",X"C8",X"01",X"0E",X"0A",X"CD",X"99",X"01",X"3E",X"80",X"32",X"9E",X"30", + X"21",X"9C",X"30",X"36",X"00",X"2C",X"36",X"C0",X"21",X"C0",X"00",X"CD",X"AA",X"01",X"AF",X"C9", + X"21",X"9C",X"30",X"35",X"CB",X"46",X"23",X"7E",X"20",X"15",X"35",X"7E",X"FE",X"20",X"28",X"18", + X"2C",X"BE",X"3A",X"9D",X"30",X"20",X"09",X"7E",X"C6",X"05",X"77",X"2D",X"C3",X"16",X"0A",X"1F", + X"6F",X"26",X"00",X"CD",X"AA",X"01",X"AF",X"C9",X"3E",X"FF",X"C9",X"AF",X"CD",X"C8",X"01",X"21", + X"C0",X"00",X"CD",X"AA",X"01",X"0E",X"0F",X"CD",X"99",X"01",X"21",X"9F",X"30",X"36",X"00",X"2C", + X"36",X"10",X"2C",X"36",X"03",X"2C",X"36",X"05",X"AF",X"C9",X"21",X"9F",X"30",X"35",X"7E",X"2C", + X"E6",X"3F",X"20",X"03",X"35",X"28",X"19",X"E6",X"03",X"20",X"13",X"56",X"2C",X"7E",X"C6",X"05", + X"77",X"2C",X"AE",X"E6",X"0F",X"77",X"BA",X"38",X"01",X"AF",X"4F",X"CD",X"99",X"01",X"AF",X"C9", + X"3D",X"C9",X"97",X"01",X"E7",X"03",X"32",X"04",X"62",X"04",X"9A",X"04",X"D9",X"04",X"0A",X"05", + X"4D",X"05",X"88",X"05",X"C8",X"05",X"1B",X"06",X"5E",X"06",X"95",X"06",X"D9",X"06",X"15",X"07", + X"5C",X"07",X"8A",X"07",X"C6",X"07",X"0B",X"08",X"57",X"08",X"D0",X"08",X"44",X"09",X"9C",X"09", + X"D1",X"09",X"02",X"0A",X"4B",X"0A",X"16",X"0B",X"1A",X"0B",X"3B",X"0B",X"3B",X"0B",X"3B",X"0B", + X"3B",X"0B",X"3B",X"0B",X"00",X"00",X"02",X"04",X"4B",X"04",X"7A",X"04",X"B3",X"04",X"F5",X"04", + X"28",X"05",X"6C",X"05",X"A4",X"05",X"EA",X"05",X"3A",X"06",X"77",X"06",X"B4",X"06",X"F6",X"06", + X"32",X"07",X"74",X"07",X"AA",X"07",X"E5",X"07",X"29",X"08",X"7F",X"08",X"F8",X"08",X"66",X"09", + X"BC",X"09",X"F1",X"09",X"20",X"0A",X"6A",X"0A",X"00",X"00",X"00",X"00",X"41",X"0B",X"4A",X"0B", + X"53",X"0B",X"5C",X"0B",X"65",X"0B",X"AF",X"C3",X"1C",X"0B",X"3E",X"01",X"CD",X"7E",X"03",X"11", + X"00",X"30",X"21",X"2F",X"0B",X"01",X"0C",X"00",X"ED",X"B0",X"E1",X"E1",X"C3",X"BF",X"00",X"1C", + X"00",X"1D",X"00",X"1E",X"00",X"1F",X"00",X"20",X"00",X"00",X"00",X"AF",X"CD",X"C8",X"01",X"AF", + X"C9",X"DD",X"21",X"0F",X"30",X"CD",X"FC",X"01",X"AF",X"C9",X"DD",X"21",X"19",X"30",X"CD",X"FC", + X"01",X"AF",X"C9",X"DD",X"21",X"23",X"30",X"CD",X"FC",X"01",X"AF",X"C9",X"DD",X"21",X"2D",X"30", + X"CD",X"FC",X"01",X"AF",X"C9",X"DD",X"21",X"37",X"30",X"CD",X"FC",X"01",X"AF",X"C9",X"82",X"0B", + X"B2",X"0B",X"E2",X"0B",X"08",X"0C",X"2D",X"0C",X"2E",X"0C",X"70",X"0C",X"AD",X"0C",X"EB",X"0C", + X"04",X"0D",X"1F",X"0E",X"3F",X"16",X"5F",X"00",X"81",X"60",X"5F",X"08",X"66",X"A8",X"AD",X"92", + X"7F",X"00",X"B1",X"91",X"7F",X"FF",X"B1",X"B2",X"91",X"7F",X"00",X"D4",X"B4",X"7F",X"FF",X"B4", + X"60",X"74",X"3F",X"13",X"77",X"76",X"74",X"74",X"73",X"71",X"71",X"70",X"6D",X"6D",X"70",X"71", + X"AD",X"FF",X"1F",X"02",X"3F",X"16",X"5F",X"00",X"81",X"60",X"5F",X"08",X"66",X"A8",X"AD",X"92", + X"7F",X"00",X"B1",X"91",X"7F",X"FF",X"B1",X"B2",X"91",X"7F",X"00",X"D4",X"B4",X"7F",X"FF",X"B4", + X"60",X"74",X"3F",X"13",X"77",X"76",X"74",X"74",X"73",X"71",X"71",X"70",X"6D",X"6D",X"70",X"71", + X"AD",X"FF",X"1F",X"0E",X"3F",X"13",X"5F",X"08",X"8D",X"6D",X"8D",X"6D",X"8D",X"6D",X"8D",X"6D", + X"8D",X"6D",X"8D",X"6D",X"8D",X"6D",X"8D",X"6D",X"88",X"68",X"85",X"60",X"86",X"60",X"87",X"60", + X"7F",X"00",X"CB",X"7F",X"FF",X"AB",X"AD",X"FF",X"1F",X"02",X"3F",X"13",X"5F",X"08",X"8D",X"6D", + X"8D",X"6D",X"8D",X"6D",X"8D",X"6D",X"8D",X"6D",X"8D",X"6D",X"8D",X"6D",X"8D",X"6D",X"88",X"68", + X"85",X"60",X"86",X"60",X"87",X"60",X"7F",X"00",X"CB",X"7F",X"FF",X"AB",X"AD",X"FF",X"1F",X"0E", + X"3F",X"15",X"5F",X"00",X"81",X"5F",X"07",X"65",X"65",X"25",X"25",X"25",X"25",X"A5",X"85",X"65", + X"85",X"65",X"65",X"80",X"65",X"65",X"25",X"25",X"25",X"25",X"A5",X"85",X"65",X"61",X"68",X"6C", + X"6F",X"80",X"6A",X"6A",X"2A",X"2A",X"2A",X"2A",X"AA",X"8A",X"6A",X"8A",X"6A",X"6A",X"80",X"6A", + X"6A",X"2A",X"2A",X"2A",X"2A",X"AA",X"8A",X"68",X"68",X"68",X"6A",X"6A",X"80",X"DF",X"37",X"0C", + X"1F",X"0E",X"3F",X"15",X"5F",X"00",X"81",X"5F",X"07",X"68",X"68",X"28",X"28",X"28",X"28",X"A8", + X"88",X"68",X"88",X"68",X"68",X"80",X"68",X"68",X"28",X"28",X"28",X"28",X"A8",X"88",X"A8",X"60", + X"80",X"6D",X"6D",X"2D",X"2D",X"2D",X"2D",X"AD",X"8D",X"6D",X"8D",X"6D",X"6D",X"80",X"6D",X"6D", + X"2D",X"2D",X"2D",X"2D",X"AD",X"8D",X"6D",X"6D",X"6D",X"AD",X"DF",X"79",X"0C",X"1F",X"0E",X"3F", + X"15",X"5F",X"00",X"81",X"5F",X"07",X"6C",X"6C",X"2C",X"2C",X"2C",X"2C",X"AC",X"8C",X"6C",X"8C", + X"6C",X"6C",X"80",X"6C",X"6C",X"2C",X"2C",X"2C",X"2C",X"AC",X"8C",X"AC",X"60",X"80",X"72",X"72", + X"32",X"32",X"32",X"32",X"B2",X"92",X"72",X"92",X"72",X"72",X"80",X"72",X"72",X"32",X"32",X"32", + X"32",X"B2",X"92",X"72",X"72",X"72",X"92",X"80",X"DF",X"B6",X"0C",X"1F",X"0E",X"3F",X"15",X"5F", + X"00",X"E1",X"E0",X"E0",X"C0",X"A0",X"5F",X"07",X"78",X"74",X"79",X"76",X"E0",X"E0",X"E0",X"C0", + X"A0",X"DF",X"F8",X"0C",X"1F",X"02",X"3F",X"15",X"5F",X"07",X"8D",X"60",X"6D",X"88",X"60",X"6D", + X"60",X"6D",X"60",X"6D",X"28",X"28",X"28",X"28",X"88",X"60",X"8D",X"60",X"6D",X"88",X"60",X"6D", + X"60",X"6D",X"60",X"6D",X"88",X"6D",X"68",X"8F",X"60",X"6F",X"8A",X"60",X"6F",X"60",X"6F",X"60", + X"6F",X"2A",X"2A",X"2A",X"2A",X"8A",X"60",X"8F",X"60",X"6F",X"8A",X"60",X"8F",X"8F",X"6F",X"6A", + X"6F",X"6A",X"6E",X"DF",X"0A",X"0D",X"1F",X"0E",X"3F",X"16",X"5F",X"09",X"BF",X"B3",X"B2",X"A9", + X"B0",X"B9",X"BB",X"BA",X"AE",X"E2",X"B7",X"B3",X"B4",X"C1",X"B5",X"B9"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_sprite_color_lut.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_sprite_color_lut.vhd new file mode 100644 index 00000000..4ca4a971 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_sprite_color_lut.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity time_pilot_sprite_color_lut is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of time_pilot_sprite_color_lut is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"0D",X"0F",X"05",X"00",X"0E",X"06",X"0A",X"00",X"04",X"09",X"01",X"00",X"04",X"09",X"01", + X"00",X"04",X"09",X"01",X"00",X"0C",X"05",X"01",X"00",X"0E",X"05",X"01",X"00",X"0D",X"05",X"01", + X"00",X"0B",X"05",X"01",X"00",X"01",X"0F",X"04",X"00",X"01",X"0F",X"04",X"00",X"01",X"0F",X"04", + X"00",X"08",X"07",X"0C",X"00",X"01",X"0F",X"04",X"00",X"01",X"0F",X"04",X"00",X"0A",X"05",X"01", + X"00",X"05",X"09",X"01",X"00",X"0B",X"0D",X"05",X"00",X"06",X"05",X"01",X"00",X"0A",X"03",X"01", + X"00",X"0C",X"03",X"01",X"00",X"0E",X"03",X"01",X"00",X"0D",X"03",X"01",X"00",X"0B",X"03",X"01", + X"00",X"0E",X"0C",X"0F",X"00",X"05",X"03",X"01",X"00",X"0E",X"06",X"09",X"00",X"04",X"09",X"05", + X"00",X"09",X"0E",X"06",X"00",X"04",X"0E",X"05",X"00",X"09",X"0E",X"05",X"00",X"0B",X"05",X"01", + X"00",X"0C",X"07",X"01",X"00",X"05",X"0F",X"09",X"00",X"05",X"04",X"09",X"00",X"0A",X"03",X"01", + X"00",X"0C",X"02",X"03",X"00",X"0C",X"06",X"03",X"00",X"0C",X"06",X"09",X"00",X"0C",X"06",X"01", + X"00",X"0E",X"06",X"0C",X"00",X"0C",X"02",X"0F",X"00",X"0C",X"02",X"09",X"00",X"0C",X"02",X"01", + X"00",X"01",X"08",X"0F",X"00",X"0E",X"06",X"0F",X"00",X"09",X"0A",X"0F",X"00",X"05",X"06",X"0F", + X"00",X"0B",X"09",X"05",X"00",X"0A",X"06",X"0C",X"00",X"0A",X"06",X"09",X"00",X"0A",X"02",X"09", + X"00",X"06",X"01",X"0F",X"00",X"04",X"01",X"0F",X"00",X"0A",X"03",X"01",X"00",X"0A",X"02",X"0C", + X"00",X"05",X"09",X"01",X"00",X"0A",X"02",X"01",X"00",X"0E",X"02",X"09",X"00",X"0E",X"02",X"0C", + X"00",X"01",X"04",X"0F",X"00",X"01",X"04",X"0F",X"00",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_sprite_grphx.vhd b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_sprite_grphx.vhd new file mode 100644 index 00000000..f25833f9 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/time_pilot_sprite_grphx.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity time_pilot_sprite_grphx is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of time_pilot_sprite_grphx is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"11",X"33",X"67",X"47",X"8F",X"CF",X"9F",X"77",X"FF",X"FF",X"7F",X"FF",X"7F",X"7F",X"CC", + X"EE",X"CD",X"88",X"00",X"88",X"8C",X"06",X"03",X"00",X"00",X"08",X"08",X"08",X"04",X"04",X"04", + X"FF",X"FF",X"FF",X"77",X"77",X"33",X"11",X"00",X"CC",X"EE",X"EF",X"00",X"00",X"01",X"8E",X"00", + X"21",X"70",X"1F",X"10",X"01",X"0E",X"00",X"00",X"94",X"BC",X"88",X"08",X"40",X"40",X"80",X"00", + X"00",X"11",X"33",X"77",X"67",X"CF",X"8F",X"CF",X"77",X"FF",X"EE",X"EE",X"FF",X"FF",X"6E",X"4C", + X"CE",X"8A",X"01",X"01",X"00",X"8C",X"02",X"01",X"00",X"00",X"00",X"00",X"08",X"08",X"14",X"94", + X"DF",X"DF",X"FF",X"77",X"77",X"33",X"11",X"00",X"CC",X"EE",X"EF",X"CC",X"88",X"88",X"CD",X"46", + X"30",X"30",X"0F",X"00",X"01",X"06",X"08",X"00",X"EC",X"CC",X"84",X"28",X"10",X"10",X"00",X"00", + X"00",X"11",X"33",X"77",X"77",X"FF",X"DF",X"DF",X"46",X"CD",X"88",X"88",X"CC",X"EF",X"EE",X"CC", + X"00",X"08",X"06",X"01",X"00",X"0F",X"30",X"30",X"00",X"00",X"10",X"10",X"28",X"84",X"CC",X"EC", + X"CF",X"8F",X"CF",X"67",X"77",X"33",X"11",X"00",X"4C",X"6E",X"FF",X"FF",X"EE",X"EE",X"FF",X"77", + X"01",X"02",X"8C",X"00",X"01",X"01",X"8A",X"CE",X"94",X"14",X"08",X"08",X"00",X"00",X"00",X"00", + X"00",X"11",X"33",X"77",X"77",X"FF",X"FF",X"FF",X"00",X"8E",X"01",X"00",X"00",X"EF",X"EE",X"CC", + X"00",X"00",X"0E",X"01",X"10",X"1F",X"70",X"21",X"00",X"80",X"40",X"40",X"08",X"88",X"BC",X"94", + X"9F",X"CF",X"8F",X"47",X"67",X"33",X"11",X"00",X"CC",X"7F",X"7F",X"FF",X"7F",X"FF",X"FF",X"77", + X"03",X"06",X"8C",X"88",X"00",X"88",X"CD",X"EE",X"04",X"04",X"04",X"08",X"08",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33",X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00",X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00",X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00",X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00",X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00",X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00",X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00", + X"00",X"11",X"11",X"11",X"11",X"11",X"13",X"17",X"CE",X"EF",X"EF",X"FE",X"EF",X"EF",X"EF",X"EE", + X"00",X"00",X"00",X"00",X"00",X"00",X"69",X"0F",X"00",X"00",X"00",X"00",X"04",X"0C",X"0E",X"0C", + X"71",X"75",X"55",X"55",X"11",X"11",X"11",X"00",X"EE",X"FE",X"FE",X"FE",X"EF",X"FE",X"FE",X"EC", + X"3C",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"0E",X"84",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"33",X"33",X"33",X"33",X"00",X"00",X"00",X"C8",X"EC",X"EC",X"FE",X"FE", + X"00",X"00",X"00",X"10",X"12",X"07",X"1E",X"34",X"00",X"00",X"08",X"80",X"84",X"2C",X"84",X"C0", + X"11",X"13",X"12",X"70",X"22",X"22",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"77",X"33", + X"68",X"C0",X"C8",X"C8",X"EC",X"EC",X"EC",X"C8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"C8",X"ED", + X"00",X"00",X"03",X"03",X"03",X"16",X"1E",X"3C",X"00",X"00",X"00",X"4C",X"CC",X"8C",X"00",X"00", + X"33",X"11",X"11",X"01",X"01",X"10",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"7F",X"7B",X"99",X"44", + X"2C",X"68",X"C8",X"EC",X"FE",X"FE",X"FE",X"EC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"01",X"01",X"00",X"00",X"01",X"CE",X"EE",X"FF", + X"48",X"7C",X"7C",X"68",X"68",X"68",X"68",X"CA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"77",X"37",X"17",X"12",X"13",X"00", + X"AC",X"FC",X"FC",X"FC",X"E8",X"80",X"00",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"3D",X"3D",X"16",X"03",X"03",X"03", + X"00",X"00",X"00",X"80",X"80",X"48",X"48",X"68",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"11",X"11",X"11",X"11",X"00",X"01",X"03",X"07",X"07",X"37",X"CF",X"16",X"31", + X"A4",X"A4",X"A4",X"EC",X"A4",X"E0",X"80",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"52",X"1E",X"1E",X"07",X"03",X"03",X"20",X"77", + X"00",X"00",X"80",X"C0",X"48",X"68",X"EF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"77",X"33",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"9E",X"16",X"00",X"00",X"00",X"C0",X"C8",X"80",X"66",X"88",X"00",X"00",X"00", + X"00",X"00",X"11",X"10",X"03",X"03",X"00",X"00",X"00",X"00",X"C8",X"CC",X"78",X"1E",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"D0",X"79",X"3F",X"00",X"00",X"00",X"00",X"E0",X"FE",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"10",X"31",X"33",X"33",X"11",X"00",X"00", + X"77",X"FF",X"FF",X"FF",X"EF",X"88",X"00",X"00",X"EE",X"CC",X"D9",X"2E",X"48",X"00",X"00",X"00", + X"00",X"00",X"00",X"60",X"F0",X"16",X"07",X"96",X"00",X"00",X"00",X"00",X"10",X"F0",X"1E",X"1D", + X"00",X"30",X"73",X"F7",X"7F",X"FF",X"FF",X"FF",X"00",X"00",X"88",X"CC",X"CC",X"CC",X"99",X"EA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"95",X"17",X"37",X"33",X"33",X"33",X"00",X"00", + X"FF",X"FF",X"EF",X"EE",X"CC",X"CC",X"00",X"00",X"E2",X"48",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"11",X"55",X"55",X"57",X"17",X"CE",X"EF",X"EF",X"FE",X"EF",X"EF",X"EF",X"EE", + X"00",X"00",X"00",X"00",X"00",X"00",X"69",X"0F",X"00",X"00",X"00",X"00",X"04",X"0C",X"0E",X"0C", + X"71",X"31",X"11",X"11",X"11",X"11",X"11",X"00",X"EE",X"FE",X"FE",X"FE",X"EF",X"FE",X"FE",X"EC", + X"3C",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"0E",X"84",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"33",X"33",X"33",X"33",X"00",X"00",X"00",X"C8",X"EC",X"EC",X"FE",X"FE", + X"00",X"00",X"00",X"10",X"12",X"07",X"1E",X"34",X"00",X"00",X"08",X"80",X"84",X"2C",X"84",X"C0", + X"99",X"9B",X"56",X"70",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"77",X"33", + X"68",X"C0",X"C8",X"C8",X"EC",X"EC",X"EC",X"C8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"C8",X"ED", + X"00",X"00",X"03",X"03",X"03",X"16",X"1E",X"3C",X"00",X"00",X"00",X"4C",X"CC",X"8C",X"00",X"00", + X"33",X"11",X"11",X"45",X"23",X"10",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"7F",X"7B",X"11",X"00", + X"2C",X"68",X"C8",X"EC",X"FE",X"FE",X"FE",X"EC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"01",X"01",X"00",X"00",X"01",X"CE",X"EE",X"FF", + X"48",X"7C",X"7C",X"68",X"68",X"68",X"68",X"CA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"FF",X"FF",X"77",X"37",X"17",X"DE",X"02",X"00", + X"AC",X"FC",X"FC",X"FC",X"E8",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"3D",X"3D",X"16",X"03",X"03",X"03", + X"00",X"00",X"00",X"80",X"80",X"48",X"48",X"68",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"11",X"11",X"11",X"11",X"11",X"01",X"03",X"07",X"07",X"37",X"CF",X"16",X"EC", + X"A4",X"A4",X"A4",X"EC",X"A4",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"52",X"1E",X"1E",X"07",X"03",X"03",X"02",X"77", + X"00",X"00",X"80",X"C0",X"48",X"68",X"EF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"77",X"33",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"9E",X"16",X"66",X"88",X"00",X"C0",X"C8",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"10",X"03",X"03",X"00",X"00",X"00",X"00",X"C8",X"CC",X"78",X"1E",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"D0",X"79",X"3F",X"00",X"00",X"00",X"00",X"E0",X"FE",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"10",X"31",X"33",X"33",X"11",X"00",X"00", + X"77",X"FF",X"FF",X"FF",X"EF",X"88",X"11",X"00",X"EE",X"CC",X"C8",X"0C",X"48",X"88",X"00",X"00", + X"00",X"00",X"00",X"60",X"F0",X"16",X"07",X"96",X"00",X"00",X"00",X"00",X"10",X"F0",X"1E",X"1D", + X"00",X"30",X"73",X"F7",X"7F",X"FF",X"FF",X"FF",X"00",X"00",X"88",X"CC",X"CC",X"CC",X"88",X"C8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"95",X"17",X"37",X"33",X"33",X"33",X"00",X"00", + X"FF",X"FF",X"EF",X"EE",X"CC",X"CC",X"00",X"00",X"C0",X"48",X"4C",X"44",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"22",X"22",X"23",X"00",X"12",X"07",X"07",X"07",X"07",X"07",X"3F", + X"00",X"00",X"00",X"08",X"08",X"80",X"48",X"0F",X"00",X"00",X"00",X"00",X"00",X"04",X"0C",X"0E", + X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"F7",X"F3",X"70",X"43",X"43",X"43",X"43",X"30", + X"CB",X"F0",X"0C",X"08",X"08",X"08",X"00",X"00",X"E0",X"86",X"C0",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"44",X"00",X"00",X"00",X"80",X"E0",X"F0",X"F3",X"7F", + X"00",X"00",X"00",X"00",X"03",X"0F",X"8F",X"1E",X"00",X"00",X"04",X"0E",X"2C",X"0E",X"86",X"00", + X"45",X"23",X"30",X"00",X"00",X"00",X"00",X"00",X"6F",X"0F",X"C3",X"61",X"21",X"21",X"10",X"00", + X"3C",X"68",X"0E",X"0E",X"0E",X"2C",X"2C",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"78",X"F1",X"7B", + X"01",X"03",X"03",X"03",X"07",X"1E",X"1E",X"2C",X"00",X"08",X"C0",X"48",X"C0",X"00",X"00",X"00", + X"00",X"00",X"22",X"11",X"00",X"00",X"00",X"00",X"F7",X"6F",X"0F",X"3C",X"E0",X"00",X"00",X"00", + X"68",X"1E",X"0F",X"0F",X"87",X"87",X"52",X"30",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"73", + X"3C",X"0F",X"16",X"34",X"16",X"1E",X"1E",X"3C",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"73",X"63",X"03",X"03",X"CF",X"23",X"10",X"00", + X"3C",X"4B",X"0F",X"4B",X"C3",X"81",X"00",X"00",X"00",X"80",X"80",X"C0",X"48",X"48",X"08",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"07",X"07",X"03",X"01",X"01",X"01",X"30", + X"08",X"84",X"84",X"86",X"0E",X"0E",X"2C",X"2C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"11",X"01",X"01",X"00",X"77", + X"68",X"68",X"68",X"68",X"2C",X"0E",X"0C",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"01",X"00",X"00",X"00",X"00",X"86",X"0E",X"2C",X"1E",X"0F",X"03",X"03", + X"00",X"00",X"00",X"00",X"00",X"80",X"4B",X"4B",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"48", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"23",X"33",X"31",X"30",X"00",X"00",X"00",X"00", + X"4B",X"0F",X"AD",X"1E",X"07",X"12",X"76",X"88",X"2C",X"2C",X"48",X"80",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"03",X"03",X"00",X"00",X"00",X"00",X"C0",X"48",X"3C",X"1E",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"C3",X"87",X"0F",X"00",X"00",X"00",X"00",X"00",X"48",X"2C",X"2C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"21",X"30",X"30",X"10",X"00",X"00",X"00", + X"0F",X"CF",X"EF",X"E7",X"83",X"00",X"11",X"00",X"48",X"80",X"C0",X"48",X"48",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"E1",X"C3",X"0F",X"00",X"00",X"00",X"00",X"00",X"78",X"0F",X"0F", + X"00",X"00",X"01",X"43",X"87",X"0F",X"87",X"1E",X"00",X"00",X"80",X"48",X"48",X"48",X"80",X"00", + X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"37",X"73",X"70",X"30",X"30",X"00",X"00",X"00", + X"8F",X"DE",X"87",X"C0",X"80",X"11",X"00",X"00",X"80",X"80",X"C0",X"88",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"12",X"07",X"07",X"07",X"07",X"07",X"3F", + X"00",X"00",X"00",X"08",X"08",X"80",X"48",X"0F",X"00",X"00",X"00",X"00",X"00",X"04",X"0C",X"0E", + X"30",X"32",X"22",X"22",X"00",X"00",X"00",X"00",X"F7",X"F3",X"70",X"43",X"43",X"43",X"43",X"30", + X"CB",X"F0",X"0C",X"08",X"08",X"08",X"00",X"00",X"E0",X"86",X"C0",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"F3",X"7F", + X"00",X"00",X"00",X"00",X"03",X"0F",X"8F",X"1E",X"00",X"00",X"04",X"0E",X"2C",X"0E",X"86",X"00", + X"01",X"01",X"30",X"22",X"11",X"11",X"00",X"00",X"6F",X"0F",X"C3",X"61",X"21",X"21",X"10",X"00", + X"3C",X"68",X"0E",X"0E",X"0E",X"2C",X"2C",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"78",X"F1",X"7B", + X"01",X"03",X"03",X"03",X"07",X"1E",X"1E",X"2C",X"00",X"08",X"C0",X"48",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F7",X"6F",X"0F",X"3C",X"E0",X"44",X"22",X"00", + X"68",X"1E",X"0F",X"0F",X"87",X"87",X"52",X"30",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"73", + X"3C",X"0F",X"16",X"34",X"16",X"1E",X"1E",X"3C",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"73",X"63",X"03",X"03",X"03",X"01",X"10",X"00", + X"3C",X"4B",X"0F",X"4B",X"C3",X"81",X"88",X"66",X"00",X"80",X"80",X"C0",X"48",X"48",X"08",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"07",X"07",X"03",X"01",X"01",X"01",X"30", + X"08",X"84",X"84",X"86",X"0E",X"0E",X"2C",X"2C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"11",X"01",X"01",X"00",X"00", + X"68",X"68",X"68",X"68",X"2C",X"0E",X"0C",X"F7",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"01",X"00",X"00",X"00",X"00",X"86",X"0E",X"2C",X"1E",X"0F",X"03",X"03", + X"00",X"00",X"00",X"00",X"00",X"80",X"4B",X"4B",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"48", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"23",X"33",X"31",X"30",X"00",X"00",X"00",X"00", + X"4B",X"0F",X"AD",X"1E",X"07",X"12",X"10",X"00",X"2C",X"2C",X"48",X"80",X"A2",X"CC",X"00",X"00", + X"00",X"00",X"00",X"01",X"03",X"03",X"00",X"00",X"00",X"00",X"C0",X"48",X"3C",X"1E",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"C3",X"87",X"0F",X"00",X"00",X"00",X"00",X"00",X"48",X"2C",X"2C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"21",X"30",X"30",X"10",X"00",X"00",X"00", + X"0F",X"CF",X"EF",X"E7",X"83",X"00",X"00",X"00",X"48",X"80",X"D1",X"6A",X"48",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"E1",X"C3",X"0F",X"00",X"00",X"00",X"00",X"00",X"78",X"0F",X"0F", + X"00",X"00",X"01",X"43",X"87",X"0F",X"87",X"1E",X"00",X"00",X"80",X"48",X"48",X"48",X"80",X"22", + X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"37",X"73",X"70",X"30",X"30",X"00",X"00",X"00", + X"8F",X"DE",X"87",X"C0",X"80",X"00",X"00",X"00",X"C4",X"C4",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"10",X"00",X"23",X"0F", + X"00",X"00",X"00",X"03",X"87",X"0F",X"0F",X"87",X"00",X"00",X"00",X"00",X"C8",X"88",X"08",X"CC", + X"07",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"FF",X"03",X"00",X"10",X"00",X"00",X"00", + X"E3",X"D7",X"8F",X"0F",X"97",X"33",X"00",X"00",X"0C",X"CC",X"88",X"88",X"C8",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"21",X"12", + X"00",X"00",X"00",X"16",X"0F",X"3F",X"B7",X"E3",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"08", + X"00",X"00",X"01",X"03",X"13",X"04",X"00",X"00",X"34",X"1E",X"0F",X"3F",X"CC",X"00",X"00",X"00", + X"87",X"8F",X"CF",X"EF",X"71",X"80",X"00",X"00",X"08",X"48",X"0C",X"0C",X"CC",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"21",X"12", + X"00",X"00",X"20",X"2E",X"7F",X"6F",X"4F",X"87",X"00",X"00",X"00",X"00",X"08",X"08",X"4C",X"6C", + X"00",X"00",X"00",X"00",X"01",X"01",X"13",X"00",X"30",X"34",X"0F",X"1F",X"2E",X"4C",X"00",X"00", + X"87",X"0F",X"3F",X"88",X"10",X"00",X"00",X"00",X"2E",X"2E",X"CC",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"03",X"32",X"30", + X"00",X"80",X"4C",X"EE",X"CF",X"8F",X"8F",X"8F",X"00",X"00",X"00",X"00",X"C8",X"4C",X"0C",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"74",X"25",X"07",X"07",X"1F",X"2E",X"2E",X"4C", + X"0F",X"7E",X"EC",X"88",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"BF",X"17",X"13",X"03",X"21",X"30", + X"00",X"00",X"BE",X"1F",X"1F",X"1F",X"3E",X"BE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"10",X"01",X"01",X"00",X"00",X"00",X"00", + X"BE",X"8C",X"4C",X"4C",X"4C",X"4C",X"0C",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"0F",X"8F",X"DF",X"75",X"30",X"30", + X"4A",X"0E",X"8F",X"1F",X"1F",X"3E",X"BE",X"2E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"2E",X"2E",X"2E",X"1F",X"17",X"17",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"31",X"01",X"01",X"00",X"10",X"33",X"0F",X"8F",X"CF",X"EF",X"1E", + X"00",X"CC",X"2E",X"3E",X"2E",X"2E",X"0E",X"97",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DE",X"21",X"00",X"00",X"00",X"00",X"00",X"00", + X"D3",X"C3",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"88",X"4C",X"0C",X"2E",X"02",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"01",X"03",X"01",X"66",X"57",X"8F",X"8F",X"CF",X"0F",X"1F",X"3F", + X"00",X"00",X"88",X"C8",X"6C",X"4C",X"6E",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"FE",X"FF",X"02",X"00",X"00",X"00",X"00", + X"C7",X"C3",X"8F",X"00",X"00",X"00",X"00",X"00",X"88",X"4C",X"2E",X"0E",X"00",X"00",X"00",X"00", + X"34",X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F3",X"F3",X"F6",X"F0",X"F0",X"61", + X"9E",X"CF",X"CF",X"F8",X"E1",X"97",X"1F",X"3E",X"E0",X"E0",X"68",X"68",X"2C",X"86",X"84",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"07",X"12",X"03",X"01",X"00",X"00",X"00", + X"3C",X"96",X"E1",X"F0",X"3C",X"03",X"00",X"00",X"84",X"84",X"0C",X"80",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"03",X"07",X"16",X"34",X"00",X"0C",X"1E",X"0F",X"4B",X"C3",X"C3",X"97", + X"00",X"00",X"80",X"F0",X"3C",X"3C",X"1E",X"8F",X"00",X"00",X"00",X"08",X"0C",X"84",X"C2",X"E8", + X"30",X"10",X"10",X"12",X"12",X"07",X"16",X"34",X"B7",X"87",X"E1",X"F0",X"F0",X"78",X"F1",X"E1", + X"8F",X"CF",X"6F",X"2F",X"AF",X"EF",X"4F",X"0F",X"FC",X"FC",X"FC",X"F8",X"F8",X"F8",X"F8",X"F0", + X"30",X"30",X"70",X"61",X"21",X"30",X"30",X"30",X"F0",X"ED",X"E5",X"E7",X"6B",X"3C",X"1E",X"96", + X"ED",X"E9",X"F1",X"E3",X"F2",X"E1",X"E1",X"F0",X"68",X"E8",X"48",X"80",X"0C",X"68",X"C0",X"84", + X"70",X"70",X"21",X"21",X"00",X"00",X"00",X"00",X"87",X"2F",X"ED",X"3C",X"78",X"20",X"00",X"00", + X"F0",X"F0",X"C3",X"80",X"00",X"00",X"00",X"00",X"0C",X"08",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"01",X"00",X"00",X"00",X"24",X"34",X"96",X"C3",X"C3", + X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"A4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"21",X"12",X"12",X"01",X"01",X"10",X"10",X"E1",X"E1",X"B4",X"3C",X"69",X"F1",X"7A",X"1E", + X"9E",X"5E",X"F6",X"F6",X"FC",X"BC",X"F3",X"E5",X"80",X"C0",X"80",X"80",X"84",X"2C",X"2C",X"68", + X"30",X"70",X"30",X"21",X"01",X"03",X"34",X"34",X"87",X"C3",X"E1",X"E1",X"F0",X"F5",X"B7",X"A7", + X"3E",X"3E",X"B6",X"B4",X"78",X"B4",X"69",X"E1",X"E0",X"A4",X"C2",X"C2",X"84",X"84",X"0C",X"08", + X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"96",X"C3",X"E1",X"E1",X"00",X"00",X"00",X"00", + X"C3",X"C3",X"D2",X"D2",X"4A",X"04",X"00",X"00",X"48",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"00",X"00",X"00",X"01",X"21",X"A1",X"F0",X"78", + X"00",X"12",X"C3",X"F0",X"F0",X"FC",X"3E",X"1F",X"00",X"80",X"80",X"48",X"C0",X"E0",X"C2",X"C2", + X"12",X"12",X"12",X"12",X"01",X"10",X"10",X"30",X"78",X"B4",X"D2",X"DA",X"7C",X"3E",X"3F",X"87", + X"E1",X"E1",X"E5",X"C7",X"8F",X"9E",X"78",X"FC",X"84",X"84",X"08",X"80",X"C0",X"C0",X"C0",X"C0", + X"34",X"12",X"10",X"01",X"10",X"00",X"00",X"00",X"7C",X"7C",X"78",X"F0",X"F0",X"61",X"21",X"10", + X"C3",X"96",X"0F",X"2F",X"2F",X"ED",X"E1",X"F0",X"78",X"F0",X"E0",X"C0",X"C2",X"A5",X"3C",X"3C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"12",X"03",X"01",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"78",X"16",X"03",X"00",X"3C",X"96",X"D2",X"D2",X"E0",X"68",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"61",X"61",X"D2",X"D2", + X"00",X"30",X"78",X"78",X"0F",X"69",X"78",X"B4",X"00",X"C0",X"C2",X"C2",X"E1",X"78",X"3C",X"B4", + X"30",X"21",X"12",X"34",X"34",X"70",X"70",X"70",X"D2",X"3C",X"F0",X"C3",X"1F",X"3C",X"B4",X"94", + X"D2",X"C3",X"87",X"6F",X"FF",X"F3",X"F1",X"F1",X"B4",X"C6",X"C6",X"BC",X"3C",X"3C",X"78",X"78", + X"2D",X"2D",X"2D",X"2D",X"25",X"25",X"16",X"12",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"E0",X"E0",X"E0",X"E0",X"F3",X"C0",X"C0",X"80",X"43",X"43",X"61",X"E9",X"60",X"04",X"00",X"00", + X"12",X"03",X"01",X"21",X"70",X"F0",X"F0",X"00",X"0F",X"96",X"96",X"5A",X"69",X"69",X"87",X"00", + X"80",X"80",X"00",X"08",X"0C",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"12",X"16",X"16",X"25",X"00",X"68",X"B4",X"96",X"1E",X"1E",X"0F",X"0F", + X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"E0",X"E0",X"F1",X"E0",X"E0",X"E0",X"E0",X"E0",X"04",X"60",X"61",X"CB",X"43",X"43",X"03",X"03", + X"2D",X"2D",X"2D",X"2D",X"25",X"25",X"16",X"12",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"E0",X"F3",X"F7",X"F5",X"F3",X"C0",X"C0",X"80",X"CF",X"47",X"67",X"EB",X"60",X"04",X"00",X"00", + X"12",X"03",X"01",X"21",X"70",X"F0",X"F0",X"00",X"0F",X"96",X"96",X"5A",X"69",X"69",X"87",X"00", + X"80",X"80",X"00",X"08",X"0C",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"12",X"16",X"16",X"25",X"00",X"68",X"B4",X"96",X"1E",X"1E",X"0F",X"0F", + X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"E0",X"E0",X"F1",X"E0",X"E0",X"E0",X"E0",X"F1",X"04",X"60",X"61",X"CB",X"43",X"43",X"47",X"CF", + X"2D",X"2D",X"2D",X"2D",X"25",X"25",X"16",X"12",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F1",X"E2",X"E4",X"F3",X"F7",X"D5",X"D1",X"80",X"47",X"EF",X"EB",X"EB",X"64",X"40",X"00",X"00", + X"12",X"03",X"01",X"21",X"70",X"F0",X"F0",X"00",X"0F",X"96",X"96",X"5A",X"69",X"69",X"87",X"00", + X"80",X"80",X"00",X"08",X"0C",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"12",X"16",X"16",X"25",X"00",X"68",X"B4",X"96",X"1E",X"1E",X"0F",X"0F", + X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"E0",X"E0",X"F1",X"E0",X"E0",X"E0",X"E0",X"E0",X"04",X"60",X"61",X"CB",X"43",X"43",X"47",X"CF", + X"2D",X"2D",X"2D",X"2D",X"25",X"25",X"25",X"12",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F1",X"F3",X"E0",X"F7",X"F3",X"C4",X"D1",X"E6",X"EF",X"47",X"ED",X"ED",X"EA",X"AE",X"CC",X"CC", + X"12",X"03",X"01",X"21",X"70",X"F0",X"F0",X"00",X"0F",X"96",X"96",X"5A",X"69",X"69",X"87",X"00", + X"B3",X"A2",X"44",X"08",X"0C",X"0E",X"0E",X"00",X"44",X"CC",X"AA",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"12",X"16",X"16",X"25",X"00",X"68",X"B4",X"96",X"1E",X"1E",X"0F",X"0F", + X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"E0",X"E0",X"F1",X"E0",X"E0",X"E0",X"E0",X"E0",X"04",X"60",X"61",X"CB",X"43",X"43",X"47",X"CF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"32",X"65", + X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"3D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"65",X"65",X"32",X"11",X"00",X"00",X"00",X"00", + X"3D",X"3D",X"E2",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"32",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"E2",X"E2",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"21", + X"00",X"00",X"00",X"00",X"00",X"C0",X"68",X"2C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"2C",X"A4",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"21",X"53", + X"00",X"00",X"00",X"00",X"00",X"C0",X"2C",X"DE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"53",X"53",X"21",X"10",X"00",X"00",X"00",X"00", + X"DE",X"DE",X"2C",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"43", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"43",X"43",X"30",X"00",X"00",X"00",X"00",X"00", + X"48",X"08",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"72",X"73", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"73",X"71",X"30",X"00",X"00",X"00",X"00",X"00", + X"C8",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"21", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"11",X"11",X"31",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"22",X"22",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"00",X"00",X"10",X"00",X"00",X"00",X"00", + X"00",X"88",X"C8",X"C8",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"44",X"32", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"08",X"64",X"72",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"76", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"18",X"77",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EF",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"11",X"30", + X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"80",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00", + X"66",X"66",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"33",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"77",X"77",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33", + X"00",X"00",X"00",X"00",X"77",X"FF",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"FF",X"33", + X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"90",X"70",X"30", + X"00",X"00",X"00",X"80",X"80",X"90",X"F0",X"68",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"43",X"E1",X"30",X"10",X"10",X"10",X"00",X"00", + X"2C",X"68",X"F0",X"90",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"70",X"70",X"61",X"E1", + X"00",X"00",X"10",X"30",X"F0",X"B4",X"3C",X"1E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"E1",X"61",X"70",X"60",X"40",X"80",X"00", + X"78",X"2C",X"E0",X"E0",X"60",X"10",X"00",X"00",X"C0",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"00",X"40",X"40",X"70",X"70",X"52",X"E1",X"E1", + X"00",X"00",X"00",X"30",X"F0",X"B4",X"0F",X"3C",X"00",X"00",X"80",X"00",X"00",X"80",X"C0",X"F0", + X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"87",X"E1",X"70",X"70",X"70",X"60",X"80",X"00", + X"3C",X"1E",X"5A",X"F0",X"F0",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"40",X"20",X"30",X"10",X"10",X"10",X"10",X"30",X"00",X"10",X"30",X"F0",X"5A",X"A7",X"7F",X"7F", + X"80",X"00",X"00",X"F0",X"69",X"9E",X"FC",X"BC",X"00",X"00",X"20",X"C0",X"80",X"80",X"80",X"C0", + X"F0",X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"B7",X"A7",X"4B",X"F0",X"F0",X"E0",X"80",X"80", + X"9E",X"CF",X"3C",X"78",X"E0",X"60",X"20",X"20",X"C0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"27",X"16",X"07", + X"06",X"D3",X"FC",X"3F",X"1E",X"0F",X"6D",X"DA",X"00",X"00",X"88",X"88",X"88",X"C4",X"C4",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"13",X"01",X"01",X"00",X"00",X"00",X"00", + X"7C",X"1E",X"B5",X"1E",X"1E",X"35",X"31",X"00",X"88",X"88",X"00",X"88",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"12",X"31",X"27", + X"35",X"7D",X"3D",X"1E",X"9E",X"87",X"F8",X"7E",X"00",X"00",X"00",X"88",X"88",X"C4",X"C4",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1E",X"0F",X"0F",X"1E",X"27",X"03",X"00",X"00", + X"3D",X"3D",X"1E",X"0F",X"1E",X"3E",X"1A",X"00",X"88",X"00",X"88",X"C4",X"C4",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"13",X"03",X"07", + X"13",X"16",X"07",X"4F",X"3C",X"3D",X"96",X"6D",X"00",X"88",X"C4",X"C4",X"88",X"00",X"88",X"C4", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"03",X"13",X"01",X"00",X"00",X"00",X"00", + X"6D",X"DA",X"B5",X"DA",X"1E",X"1E",X"31",X"00",X"C4",X"88",X"00",X"88",X"88",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"01",X"03",X"36",X"17",X"1F",X"1F",X"8F", + X"00",X"1C",X"5E",X"6D",X"A5",X"96",X"B5",X"DA",X"00",X"88",X"88",X"C4",X"C4",X"88",X"00",X"88", + X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"5B",X"1F",X"1F",X"3E",X"21",X"03",X"01",X"01", + X"96",X"96",X"B5",X"1E",X"3E",X"7C",X"0D",X"08",X"88",X"88",X"00",X"88",X"C4",X"88",X"00",X"00", + X"07",X"07",X"07",X"07",X"07",X"13",X"10",X"01",X"1F",X"1F",X"0F",X"0F",X"8F",X"87",X"0F",X"0F", + X"87",X"96",X"1F",X"0F",X"0F",X"0F",X"0F",X"0F",X"C4",X"C4",X"6A",X"EE",X"6A",X"C4",X"C4",X"C4", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"2D",X"3E",X"13",X"01",X"00",X"00",X"00", + X"3E",X"1F",X"0F",X"0F",X"0F",X"04",X"00",X"00",X"C4",X"C4",X"4C",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"01",X"03",X"03",X"52",X"F5",X"7B", + X"00",X"07",X"5E",X"0F",X"0F",X"E1",X"FE",X"B5",X"00",X"88",X"C4",X"C4",X"C4",X"6A",X"E2",X"EA", + X"03",X"03",X"03",X"27",X"16",X"13",X"10",X"13",X"3C",X"0F",X"0F",X"87",X"8F",X"0F",X"0F",X"0F", + X"9F",X"1E",X"0F",X"0F",X"0F",X"1E",X"0F",X"0F",X"4C",X"C4",X"C4",X"6A",X"E2",X"CC",X"C4",X"C4", + X"73",X"21",X"07",X"07",X"0F",X"0F",X"16",X"35",X"0F",X"0F",X"3E",X"1F",X"1F",X"1F",X"0F",X"0F", + X"1F",X"DA",X"CB",X"87",X"96",X"87",X"0F",X"0F",X"C4",X"C4",X"6A",X"6A",X"EA",X"6A",X"C4",X"C4", + X"23",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"2F",X"03",X"01",X"00",X"00",X"00", + X"1E",X"0F",X"0F",X"8E",X"08",X"00",X"00",X"00",X"CC",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"03",X"07",X"43",X"E5",X"43",X"78", + X"00",X"03",X"3E",X"0F",X"0F",X"0F",X"2D",X"B4",X"00",X"08",X"C4",X"C4",X"C4",X"6A",X"6A",X"6A", + X"01",X"12",X"30",X"11",X"12",X"12",X"35",X"35",X"F7",X"8F",X"8F",X"8F",X"8F",X"8F",X"0F",X"0F", + X"FB",X"6D",X"6D",X"0F",X"0F",X"0F",X"0F",X"1E",X"E2",X"CC",X"C4",X"C4",X"C4",X"E6",X"E6",X"CC", + X"34",X"07",X"07",X"07",X"03",X"01",X"00",X"00",X"3E",X"2D",X"0F",X"0F",X"4F",X"CB",X"07",X"07", + X"87",X"0F",X"0F",X"0F",X"1E",X"0F",X"0F",X"0F",X"7B",X"3D",X"3D",X"B5",X"6A",X"6A",X"3D",X"B5", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"0F",X"8F",X"8F",X"8F",X"8F",X"07",X"00",X"00",X"79",X"E2",X"EA",X"E2",X"C4",X"88",X"00",X"00", + X"00",X"00",X"00",X"03",X"03",X"33",X"01",X"03",X"00",X"56",X"0F",X"0F",X"FF",X"1E",X"0F",X"0F", + X"12",X"C7",X"4B",X"0F",X"EF",X"F3",X"79",X"3C",X"00",X"84",X"0C",X"E4",X"2C",X"2C",X"EC",X"E4", + X"07",X"07",X"17",X"32",X"21",X"03",X"03",X"37",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F", + X"0F",X"0F",X"0F",X"0F",X"6D",X"6D",X"CB",X"87",X"C4",X"C4",X"6A",X"6A",X"6A",X"6A",X"C4",X"6A", + X"07",X"07",X"13",X"32",X"21",X"07",X"0F",X"0F",X"0F",X"1F",X"97",X"1F",X"3E",X"3E",X"0F",X"0F", + X"0F",X"E5",X"CB",X"87",X"1E",X"0F",X"1E",X"0F",X"6A",X"6A",X"6A",X"6A",X"CC",X"C4",X"EE",X"6A", + X"07",X"13",X"10",X"01",X"00",X"00",X"00",X"00",X"0F",X"87",X"0F",X"0F",X"0E",X"00",X"00",X"00", + X"1E",X"0F",X"4F",X"CB",X"96",X"03",X"00",X"00",X"CC",X"C4",X"C4",X"C4",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"61",X"6D",X"0F",X"78", + X"00",X"00",X"18",X"9F",X"0F",X"0F",X"0F",X"78",X"00",X"00",X"80",X"C4",X"C4",X"C4",X"6A",X"E2", + X"00",X"01",X"01",X"10",X"13",X"03",X"03",X"07",X"77",X"4F",X"0F",X"0F",X"87",X"8F",X"0F",X"0F", + X"F7",X"E9",X"6D",X"6D",X"6D",X"0F",X"0F",X"1E",X"EE",X"6E",X"6A",X"E6",X"C4",X"C4",X"E6",X"EE", + X"07",X"07",X"16",X"27",X"03",X"36",X"36",X"3E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F", + X"0F",X"0F",X"0F",X"0F",X"2F",X"6D",X"CB",X"CB",X"C4",X"6A",X"6A",X"3D",X"3D",X"F5",X"6A",X"6A", + X"1F",X"1F",X"07",X"07",X"13",X"10",X"03",X"07",X"B6",X"E5",X"CB",X"8F",X"87",X"0F",X"4F",X"3F", + X"C7",X"6B",X"2D",X"0F",X"1E",X"1E",X"8F",X"87",X"6A",X"6A",X"3D",X"7B",X"FB",X"EE",X"E6",X"C4", + X"07",X"4F",X"2D",X"0F",X"1E",X"35",X"27",X"03",X"0F",X"0F",X"1E",X"79",X"F6",X"9F",X"0F",X"0F", + X"0F",X"87",X"8F",X"0F",X"87",X"E9",X"7E",X"1F",X"C4",X"E6",X"6A",X"E6",X"CC",X"C4",X"E6",X"6A", + X"07",X"07",X"4F",X"2D",X"2D",X"4F",X"07",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"1E",X"1F",X"0F",X"0F",X"0F",X"7B",X"3D",X"3D",X"7B",X"F3",X"EA",X"E6",X"C4", + X"07",X"0F",X"0F",X"1E",X"27",X"03",X"03",X"12",X"3F",X"7D",X"5B",X"1F",X"0F",X"0F",X"0F",X"F0", + X"87",X"87",X"96",X"87",X"87",X"0F",X"0F",X"0F",X"7B",X"E6",X"CC",X"E6",X"E6",X"6A",X"7B",X"3D", + X"11",X"00",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F", + X"87",X"CB",X"7C",X"3F",X"0F",X"0F",X"6F",X"E9",X"3D",X"3D",X"7B",X"E6",X"EE",X"C4",X"E6",X"6A", + X"07",X"07",X"07",X"03",X"36",X"17",X"07",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"E5",X"3E",X"1F", + X"0F",X"0F",X"0F",X"0F",X"3E",X"6D",X"6D",X"E5",X"E6",X"E6",X"E6",X"7B",X"3D",X"3D",X"6A",X"6A", + X"4F",X"2D",X"0F",X"0F",X"0F",X"2F",X"6D",X"43",X"1F",X"1F",X"1F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"CB",X"CB",X"87",X"CB",X"CB",X"CB",X"0F",X"0F",X"6A",X"E6",X"E6",X"7B",X"7B",X"7B",X"7B",X"E6", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33",X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00",X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00",X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00",X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00",X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00",X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00",X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"13",X"07",X"0F",X"0F",X"07",X"07", + X"0F",X"1E",X"97",X"CB",X"0F",X"0F",X"0F",X"0F",X"0F",X"87",X"F8",X"7F",X"7A",X"6D",X"CB",X"CB", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"CB",X"CB",X"0F",X"07",X"03",X"00",X"00",X"00",X"4B",X"0F",X"0F",X"3E",X"6D",X"07",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"1F",X"0F",X"61",X"6F",X"0F",X"0F",X"0F",X"0F",X"0F",X"87", + X"1E",X"1E",X"3D",X"BD",X"96",X"1E",X"1E",X"1E",X"CB",X"E9",X"E9",X"CB",X"CB",X"E9",X"ED",X"FC", + X"3E",X"3E",X"3E",X"1E",X"0F",X"0F",X"0F",X"2D",X"C4",X"C4",X"C4",X"C4",X"C4",X"C4",X"C4",X"C4", + X"1E",X"1E",X"1E",X"1E",X"3E",X"7C",X"71",X"00",X"BA",X"88",X"88",X"88",X"88",X"88",X"00",X"00", + X"5E",X"16",X"31",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"32",X"3D",X"1E",X"1E",X"1E",X"1E",X"0C",X"A7",X"F1",X"D2",X"E9",X"CB",X"CB",X"CB", + X"00",X"08",X"6A",X"E2",X"6A",X"3D",X"3E",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"C4", + X"1E",X"1E",X"1E",X"3D",X"1E",X"0F",X"0F",X"0F",X"E9",X"F8",X"F9",X"E5",X"E5",X"E5",X"E5",X"E5", + X"0F",X"0F",X"A5",X"FA",X"ED",X"6D",X"6D",X"6D",X"C4",X"C4",X"C4",X"6A",X"6A",X"6A",X"E6",X"C4", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"27",X"12",X"03",X"03",X"03",X"01",X"00", + X"A5",X"0F",X"0F",X"0F",X"0F",X"6D",X"CB",X"0F",X"7A",X"7E",X"FA",X"F2",X"7A",X"7A",X"7A",X"F4", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"16",X"11",X"10",X"01",X"00",X"00",X"00",X"00",X"F4",X"E9",X"E1",X"4B",X"0F",X"0F",X"0F",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"30",X"3F",X"0F", + X"00",X"03",X"2F",X"1E",X"0F",X"E1",X"FC",X"3F",X"88",X"C4",X"C4",X"C4",X"E6",X"E6",X"E2",X"EA", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"8F",X"4B",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F", + X"0F",X"0F",X"0F",X"0F",X"6D",X"CB",X"ED",X"E5",X"E6",X"C4",X"6A",X"6A",X"6A",X"6A",X"7B",X"7B", + X"88",X"CC",X"E2",X"6A",X"6A",X"6A",X"3D",X"B5",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F9",X"7D",X"6A",X"6A",X"6A",X"C4",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"4F",X"07",X"07",X"13",X"01",X"01",X"00",X"00", + X"CB",X"4B",X"87",X"0F",X"0F",X"0F",X"2D",X"32",X"7B",X"7A",X"1E",X"1E",X"3D",X"3D",X"7A",X"F4", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"31",X"30",X"12",X"01",X"00",X"00",X"00",X"00",X"F8",X"F0",X"69",X"8F",X"0F",X"0F",X"07",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"27",X"1E", + X"00",X"01",X"1F",X"0F",X"0F",X"6D",X"3E",X"1F",X"4C",X"6A",X"6A",X"6A",X"6A",X"3D",X"3D",X"B5", + X"00",X"01",X"01",X"11",X"12",X"03",X"01",X"01",X"0F",X"0F",X"8F",X"87",X"0F",X"0F",X"0F",X"0F", + X"1F",X"CB",X"6D",X"6D",X"6D",X"6D",X"7E",X"7D",X"6A",X"6A",X"C4",X"E6",X"79",X"3D",X"3D",X"E2", + X"88",X"CC",X"FF",X"F8",X"96",X"96",X"C3",X"C3",X"00",X"00",X"00",X"88",X"88",X"88",X"C4",X"C4", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"87",X"1E",X"1E",X"3C",X"7A",X"7B",X"4C",X"08",X"C4",X"88",X"88",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"17",X"01",X"01",X"00", + X"1F",X"0F",X"0F",X"0F",X"0F",X"87",X"0F",X"0F",X"B5",X"DA",X"0F",X"0F",X"0F",X"0F",X"8F",X"9E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"17",X"10",X"01",X"00",X"00",X"00",X"00",X"00",X"96",X"F8",X"F7",X"30",X"21",X"03",X"03",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"03",X"03",X"03",X"27",X"1E",X"0F",X"00",X"C4",X"6A",X"6A",X"6A",X"6A",X"F7",X"79", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"03",X"03",X"27",X"1E",X"0F", + X"8F",X"4B",X"0F",X"0F",X"0F",X"1F",X"5F",X"3F",X"3D",X"6A",X"6A",X"3D",X"BD",X"F1",X"E2",X"B5", + X"AA",X"FD",X"F4",X"E5",X"E5",X"F5",X"F4",X"E9",X"00",X"88",X"88",X"C4",X"C4",X"C4",X"CC",X"C4", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"E9",X"C3",X"87",X"1E",X"3E",X"3F",X"0C",X"88",X"C4",X"C4",X"C4",X"88",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C0",X"30",X"21",X"10",X"10",X"40",X"60",X"52",X"E1",X"A7",X"F7",X"7F",X"B7", + X"10",X"10",X"F0",X"F0",X"5E",X"EF",X"FF",X"EF",X"00",X"00",X"00",X"00",X"80",X"C0",X"78",X"E0", + X"30",X"21",X"F0",X"10",X"00",X"00",X"00",X"00",X"97",X"3F",X"B7",X"D3",X"E1",X"F0",X"C0",X"80", + X"DE",X"DE",X"EF",X"1E",X"D2",X"F0",X"C0",X"40",X"C0",X"80",X"80",X"80",X"C0",X"C0",X"20",X"00", + X"00",X"00",X"00",X"80",X"70",X"30",X"10",X"10",X"20",X"20",X"70",X"F0",X"D7",X"FF",X"FF",X"7F", + X"00",X"00",X"10",X"F0",X"BC",X"CF",X"FF",X"EF",X"80",X"80",X"80",X"80",X"C0",X"E0",X"78",X"C0", + X"10",X"F0",X"30",X"10",X"10",X"30",X"20",X"40",X"7F",X"FF",X"FF",X"C7",X"E1",X"F0",X"00",X"00", + X"EF",X"FF",X"FF",X"EF",X"F4",X"E0",X"C0",X"40",X"80",X"80",X"80",X"E0",X"90",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"90",X"90",X"B0",X"A1",X"93",X"57",X"13", + X"88",X"CC",X"5D",X"1D",X"3F",X"1D",X"9D",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"13",X"01",X"01",X"11",X"11",X"01",X"23",X"33", + X"5D",X"5D",X"0C",X"08",X"08",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"90",X"90",X"B0",X"A1",X"57",X"13", + X"00",X"88",X"DD",X"DD",X"7F",X"1D",X"1D",X"BF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"01",X"01",X"11",X"11",X"23",X"33",X"00", + X"DD",X"1D",X"08",X"08",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"90",X"90",X"B0",X"47",X"13", + X"00",X"00",X"88",X"DD",X"DD",X"7F",X"1D",X"BF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"01",X"01",X"11",X"23",X"33",X"00",X"00", + X"9D",X"DD",X"08",X"08",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"90",X"B0",X"B0",X"56",X"03", + X"00",X"00",X"88",X"CC",X"DD",X"FF",X"5D",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"01",X"01",X"33",X"00",X"00",X"00",X"00", + X"9D",X"CC",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"90",X"B0",X"74",X"30", + X"00",X"00",X"00",X"1D",X"6E",X"4E",X"CE",X"4E",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AE",X"1D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"43",X"E1",X"70",X"70",X"21",X"43", + X"00",X"10",X"C3",X"2D",X"7A",X"7C",X"F8",X"E1",X"00",X"80",X"C0",X"48",X"68",X"2C",X"48",X"48", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"43",X"2D",X"F0",X"F0",X"70",X"21",X"00",X"00", + X"E9",X"6D",X"5F",X"3C",X"5A",X"69",X"68",X"40",X"C8",X"E8",X"E0",X"C0",X"C0",X"C0",X"00",X"00", + X"00",X"10",X"10",X"30",X"03",X"61",X"70",X"70",X"40",X"E0",X"E1",X"C3",X"C3",X"3E",X"B6",X"1F", + X"40",X"F0",X"F0",X"87",X"3F",X"F1",X"E1",X"E1",X"00",X"00",X"80",X"68",X"2C",X"4E",X"F8",X"F8", + X"70",X"21",X"00",X"00",X"00",X"00",X"00",X"00",X"4B",X"C3",X"E1",X"F0",X"F0",X"70",X"00",X"00", + X"E9",X"F0",X"69",X"69",X"69",X"00",X"00",X"00",X"48",X"2C",X"4A",X"E0",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"01",X"10",X"30",X"87",X"E1", + X"00",X"30",X"07",X"F3",X"F0",X"E1",X"E9",X"E5",X"00",X"00",X"08",X"68",X"8E",X"48",X"C0",X"68", + X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"E1",X"C3",X"D2",X"30",X"10",X"10",X"00",X"00", + X"3F",X"87",X"C3",X"C3",X"96",X"B4",X"78",X"00",X"68",X"68",X"E8",X"E8",X"C0",X"C0",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"21",X"13",X"57",X"93", + X"88",X"CC",X"5D",X"1D",X"3F",X"1D",X"9D",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"93",X"81",X"81",X"91",X"91",X"01",X"23",X"33", + X"5D",X"5D",X"0C",X"08",X"08",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"21",X"57",X"93", + X"00",X"88",X"DD",X"DD",X"7F",X"1D",X"1D",X"BF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"91",X"81",X"81",X"91",X"91",X"23",X"33",X"00", + X"DD",X"1D",X"08",X"08",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"47",X"93", + X"00",X"00",X"88",X"DD",X"DD",X"7F",X"1D",X"BF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"91",X"81",X"81",X"91",X"A3",X"33",X"00",X"00", + X"9D",X"DD",X"08",X"08",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"56",X"83", + X"00",X"00",X"88",X"CC",X"DD",X"FF",X"5D",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"91",X"81",X"81",X"B3",X"80",X"00",X"00",X"00", + X"9D",X"CC",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"74",X"B0", + X"00",X"00",X"00",X"1D",X"6E",X"4E",X"CE",X"4E",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"90",X"80",X"80",X"80",X"80",X"00",X"00",X"00", + X"AE",X"1D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"FF",X"88",X"FF",X"00", + X"EE",X"22",X"EE",X"00",X"EE",X"22",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"FF",X"99",X"99",X"00", + X"EE",X"22",X"EE",X"00",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"FF",X"88",X"FF",X"00", + X"EE",X"22",X"EE",X"00",X"EE",X"22",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"00",X"FF",X"00",X"FF", + X"EE",X"22",X"EE",X"00",X"88",X"EE",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"FF",X"88",X"FF",X"00", + X"EE",X"22",X"EE",X"00",X"EE",X"22",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"99",X"99",X"FF",X"00", + X"EE",X"22",X"EE",X"00",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"53",X"43",X"61",X"21",X"30",X"10",X"10",X"10", + X"DE",X"9E",X"BC",X"2C",X"68",X"48",X"48",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"30",X"21",X"61",X"43",X"53", + X"C0",X"48",X"48",X"68",X"2C",X"BC",X"9E",X"DE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"B7",X"D3",X"43",X"61",X"21",X"30",X"10",X"10", + X"EF",X"DE",X"9E",X"BC",X"2C",X"68",X"48",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"21",X"61",X"43",X"D3",X"B7", + X"C0",X"48",X"68",X"2C",X"BC",X"9E",X"DE",X"EF",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"30",X"E1",X"10",X"00",X"00",X"10",X"30",X"40",X"3F",X"7F",X"B7",X"97",X"C3",X"E1",X"21",X"21", + X"EF",X"8F",X"3C",X"68",X"2C",X"3C",X"F0",X"80",X"48",X"F0",X"80",X"00",X"00",X"00",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"00",X"00", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10", + X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"00",X"00",X"90",X"61",X"30",X"10",X"10",X"F0",X"87",X"97",X"D3",X"3F",X"1F",X"D3",X"97", + X"48",X"48",X"78",X"0F",X"DE",X"BC",X"9E",X"DE",X"10",X"20",X"C0",X"80",X"80",X"00",X"00",X"80", + X"F0",X"21",X"10",X"00",X"00",X"10",X"30",X"30",X"7F",X"3F",X"97",X"C3",X"D3",X"87",X"0F",X"C3", + X"8F",X"EF",X"9E",X"BC",X"BC",X"1E",X"87",X"F0",X"80",X"48",X"F0",X"00",X"00",X"80",X"80",X"C0", + X"60",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"61",X"30",X"10",X"10",X"10",X"10",X"10",X"00", + X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"40",X"20",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"20",X"20",X"30",X"21",X"21",X"61", + X"00",X"00",X"00",X"00",X"00",X"80",X"F0",X"0F",X"00",X"00",X"00",X"20",X"40",X"C0",X"80",X"80", + X"00",X"F0",X"61",X"10",X"10",X"00",X"00",X"10",X"43",X"D3",X"1F",X"7F",X"97",X"C3",X"97",X"B7", + X"9E",X"BC",X"9E",X"CF",X"EF",X"CF",X"9E",X"3C",X"80",X"00",X"80",X"78",X"C0",X"80",X"80",X"80", + X"00",X"00",X"00",X"20",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"33",X"B3",X"63",X"AD", + X"00",X"00",X"00",X"22",X"44",X"7E",X"7D",X"7B",X"00",X"00",X"00",X"40",X"80",X"00",X"00",X"88", + X"33",X"00",X"00",X"00",X"10",X"20",X"00",X"00",X"CF",X"65",X"63",X"B3",X"11",X"00",X"00",X"00", + X"0E",X"7B",X"7D",X"7E",X"22",X"88",X"00",X"00",X"44",X"00",X"88",X"00",X"80",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"11",X"00",X"00",X"00",X"22",X"11",X"91",X"63",X"65", + X"00",X"00",X"00",X"00",X"10",X"20",X"C8",X"C4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"CF",X"65",X"63",X"91",X"11",X"00",X"00",X"00", + X"6E",X"95",X"C8",X"A8",X"10",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"91",X"51",X"75", + X"00",X"00",X"00",X"00",X"00",X"20",X"C8",X"D5",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"75",X"51",X"80",X"00",X"00",X"00",X"00", + X"EE",X"C4",X"C8",X"A8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"11",X"51",X"75", + X"00",X"00",X"00",X"00",X"88",X"00",X"C8",X"C4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"75",X"73",X"22",X"00",X"00",X"00",X"00", + X"EE",X"A2",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"10",X"80",X"60",X"30",X"31", + X"00",X"00",X"00",X"00",X"A0",X"C0",X"C8",X"E8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"50",X"40",X"80",X"10",X"00",X"00",X"00", + X"FC",X"C4",X"C0",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"10",X"00",X"00",X"00",X"40",X"20",X"20",X"60",X"F1",X"33", + X"00",X"00",X"00",X"20",X"C0",X"90",X"A0",X"E8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"73",X"F0",X"60",X"20",X"20",X"40",X"00",X"00", + X"FC",X"88",X"C0",X"40",X"20",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"20",X"10",X"00",X"40",X"30",X"00",X"00",X"10",X"20",X"B0",X"F2",X"63",X"C7", + X"00",X"00",X"00",X"10",X"20",X"60",X"48",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"80", + X"00",X"10",X"20",X"00",X"00",X"00",X"00",X"00",X"E7",X"F1",X"50",X"D0",X"40",X"20",X"00",X"00", + X"6C",X"F8",X"C0",X"40",X"40",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"20",X"10",X"00",X"60",X"B0",X"00",X"00",X"00",X"00",X"A0",X"E0",X"D0",X"F2",X"E7", + X"00",X"40",X"80",X"80",X"C0",X"F4",X"EC",X"3E",X"00",X"00",X"00",X"00",X"80",X"00",X"40",X"00", + X"10",X"30",X"40",X"10",X"00",X"00",X"00",X"00",X"C7",X"E3",X"F2",X"70",X"50",X"90",X"00",X"00", + X"6C",X"F8",X"E8",X"A0",X"20",X"90",X"80",X"40",X"00",X"A0",X"C0",X"00",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"61",X"61",X"25",X"16",X"16",X"05",X"05",X"05", + X"48",X"0C",X"84",X"84",X"EE",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"12",X"12",X"10",X"00",X"00",X"00", + X"84",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"12",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"D2",X"5A",X"1E",X"2D", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"07",X"07",X"07",X"25",X"34",X"70",X"61", + X"08",X"0C",X"0C",X"04",X"0C",X"0C",X"48",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"61",X"61",X"25",X"16",X"77",X"05",X"05",X"05", + X"48",X"0C",X"84",X"84",X"84",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"12",X"12",X"10",X"00",X"00",X"00", + X"84",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"12",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"D2",X"5A",X"1E",X"2D", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"07",X"07",X"07",X"25",X"34",X"70",X"61", + X"08",X"0C",X"0C",X"04",X"0C",X"0C",X"48",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"71",X"71",X"25",X"16",X"16",X"05",X"05",X"05", + X"48",X"0C",X"84",X"84",X"EE",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"12",X"12",X"10",X"00",X"00",X"00", + X"84",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"12",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"D2",X"5A",X"1E",X"2D", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"07",X"07",X"07",X"67",X"76",X"FB",X"77", + X"08",X"0C",X"0C",X"04",X"8C",X"8C",X"C8",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"71",X"71",X"25",X"16",X"77",X"05",X"05",X"05", + X"48",X"0C",X"84",X"84",X"84",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"12",X"12",X"10",X"00",X"00",X"00", + X"84",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"12",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"D2",X"5A",X"1E",X"2D", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"07",X"07",X"07",X"47",X"67",X"BF",X"FF",X"73", + X"08",X"0C",X"0C",X"44",X"CC",X"8C",X"C8",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"71",X"71",X"25",X"16",X"16",X"05",X"05",X"05", + X"48",X"0C",X"84",X"84",X"EE",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"12",X"12",X"10",X"00",X"00",X"00", + X"84",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"12",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"D2",X"5A",X"1E",X"2D", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"07",X"07",X"17",X"57",X"67",X"BF",X"FF",X"73", + X"08",X"0C",X"0C",X"44",X"4C",X"8C",X"C8",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"71",X"71",X"25",X"16",X"77",X"05",X"05",X"05", + X"48",X"0C",X"84",X"84",X"84",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"12",X"12",X"10",X"00",X"00",X"00", + X"84",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"12",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"D2",X"5A",X"1E",X"2D", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DF",X"AF",X"67",X"67",X"BF",X"77",X"73",X"73", + X"88",X"AE",X"AE",X"44",X"AE",X"EE",X"C8",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"71",X"71",X"25",X"16",X"16",X"05",X"05",X"05", + X"48",X"0C",X"84",X"84",X"EE",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"12",X"12",X"10",X"00",X"00",X"00", + X"84",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"12",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"D2",X"5A",X"1E",X"2D", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"9F",X"AF",X"77",X"67",X"BF",X"77",X"73",X"73", + X"CC",X"AE",X"AE",X"44",X"9D",X"EE",X"C8",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"71",X"71",X"25",X"16",X"77",X"05",X"05",X"05", + X"48",X"0C",X"84",X"84",X"84",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"12",X"12",X"10",X"00",X"00",X"00", + X"84",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"12",X"03",X"01",X"11",X"00",X"00",X"00",X"E0",X"F2",X"7A",X"9F",X"7D", + X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"47",X"EF",X"77",X"37",X"37",X"76",X"73",X"71", + X"88",X"8C",X"8C",X"44",X"8C",X"AE",X"EE",X"C8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"12",X"12",X"12",X"12",X"12",X"02",X"02",X"77", + X"2C",X"C2",X"C2",X"C2",X"C0",X"E0",X"A4",X"A4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"02",X"02",X"00",X"01",X"00",X"00", + X"2C",X"2C",X"68",X"68",X"68",X"E2",X"E2",X"C4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"30",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"B4",X"B4",X"5A",X"4B",X"07",X"07",X"07", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"12",X"12",X"12",X"12",X"30",X"23",X"27",X"32", + X"80",X"C4",X"C6",X"C4",X"C0",X"C0",X"E0",X"68",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"12",X"12",X"12",X"12",X"12",X"02",X"02",X"03", + X"2C",X"C2",X"C2",X"C2",X"C0",X"E0",X"E0",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"02",X"02",X"00",X"01",X"00",X"00", + X"2C",X"2C",X"68",X"68",X"68",X"E2",X"E2",X"C4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"30",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"B4",X"B4",X"5A",X"4B",X"07",X"07",X"07", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"12",X"12",X"12",X"12",X"30",X"23",X"27",X"32", + X"80",X"C4",X"C6",X"C4",X"C0",X"C0",X"E0",X"68",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"12",X"12",X"12",X"12",X"12",X"02",X"02",X"77", + X"AC",X"8E",X"86",X"82",X"C0",X"E0",X"A4",X"A4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"02",X"02",X"00",X"01",X"00",X"00", + X"2C",X"2C",X"68",X"68",X"68",X"E2",X"E2",X"C4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"30",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"B4",X"B4",X"5A",X"4B",X"07",X"07",X"8F", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"9A",X"9B",X"56",X"56",X"BA",X"77",X"37",X"33", + X"80",X"C4",X"CE",X"CC",X"C8",X"C4",X"E8",X"E8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"12",X"12",X"12",X"12",X"12",X"02",X"02",X"03", + X"AC",X"8E",X"86",X"82",X"C0",X"E0",X"A4",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"02",X"02",X"00",X"01",X"00",X"00", + X"2C",X"2C",X"68",X"68",X"68",X"E2",X"E2",X"C4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"30",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"B4",X"B4",X"5A",X"4B",X"07",X"07",X"07", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"13",X"13",X"57",X"32",X"B9",X"77",X"77",X"33", + X"80",X"CC",X"C6",X"CC",X"C8",X"C8",X"E0",X"E8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"13",X"12",X"12",X"12",X"02",X"02",X"77", + X"2C",X"86",X"86",X"82",X"C0",X"E0",X"A4",X"A4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"02",X"02",X"00",X"01",X"00",X"00", + X"2C",X"2C",X"68",X"68",X"68",X"E2",X"E2",X"C4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"30",X"03",X"01",X"00",X"22",X"22",X"33",X"E0",X"B4",X"B4",X"5E",X"4F",X"CF",X"CF",X"67", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"76",X"BB",X"FF",X"67",X"33",X"33", + X"80",X"C4",X"CE",X"C4",X"C0",X"C0",X"E0",X"E8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"13",X"12",X"12",X"12",X"02",X"02",X"03", + X"2C",X"86",X"86",X"82",X"C0",X"E0",X"A4",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"02",X"02",X"00",X"01",X"00",X"00", + X"2C",X"2C",X"68",X"68",X"68",X"E2",X"E2",X"C4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"30",X"03",X"01",X"00",X"00",X"00",X"00",X"E0",X"B4",X"B4",X"5A",X"4B",X"47",X"47",X"23", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"BA",X"BB",X"76",X"76",X"67",X"33",X"33", + X"C4",X"CC",X"C6",X"C4",X"C8",X"C8",X"E8",X"E8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"13",X"12",X"12",X"12",X"02",X"02",X"77", + X"2C",X"86",X"86",X"82",X"C0",X"E0",X"A4",X"A4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"02",X"02",X"00",X"01",X"00",X"00", + X"2C",X"2C",X"68",X"68",X"68",X"E2",X"E2",X"C4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"31",X"13",X"11",X"00",X"00",X"00",X"11",X"E0",X"B4",X"F4",X"5E",X"EB",X"FF",X"67",X"23", + X"00",X"00",X"22",X"44",X"44",X"4C",X"4C",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"76",X"FF",X"77",X"57",X"33",X"BB",X"77",X"33", + X"88",X"C4",X"C6",X"CC",X"C0",X"CC",X"E0",X"E8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"13",X"12",X"12",X"12",X"02",X"02",X"03", + X"2C",X"86",X"86",X"82",X"C0",X"E0",X"A4",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"02",X"02",X"00",X"01",X"00",X"00", + X"2C",X"2C",X"68",X"68",X"68",X"E2",X"E2",X"C4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"30",X"03",X"23",X"22",X"11",X"11",X"11",X"E0",X"B4",X"F4",X"5E",X"6F",X"27",X"27",X"9F", + X"00",X"00",X"00",X"00",X"00",X"4C",X"4C",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DF",X"76",X"BB",X"BA",X"77",X"77",X"27",X"33", + X"C4",X"C4",X"C6",X"C4",X"C8",X"C8",X"EC",X"E8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"10",X"10",X"10",X"01",X"01",X"03",X"07",X"1E",X"3C", + X"43",X"C3",X"C3",X"43",X"C3",X"C3",X"42",X"C3",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"00",X"00",X"3C",X"37",X"33",X"11",X"10",X"00",X"00",X"00", + X"C2",X"E0",X"A4",X"86",X"86",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"10",X"00",X"00",X"00",X"13",X"17",X"3D",X"2D",X"0F", + X"00",X"00",X"00",X"80",X"C0",X"84",X"86",X"86",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"00",X"0F",X"16",X"12",X"10",X"10",X"10",X"10",X"10", + X"87",X"87",X"86",X"C3",X"C3",X"43",X"C3",X"C3",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"11",X"11",X"11",X"11",X"10",X"10",X"10",X"01",X"01",X"03",X"07",X"1E",X"3C", + X"43",X"C3",X"C3",X"43",X"C3",X"C3",X"42",X"C3",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00", + X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"3C",X"37",X"33",X"11",X"10",X"00",X"00",X"00", + X"C2",X"E0",X"A4",X"86",X"86",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"10",X"00",X"00",X"00",X"13",X"17",X"3D",X"2D",X"0F", + X"00",X"00",X"00",X"80",X"C0",X"84",X"86",X"86",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"0F",X"16",X"12",X"10",X"10",X"10",X"10",X"10", + X"87",X"87",X"86",X"C3",X"C3",X"43",X"C3",X"C3",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"10",X"10",X"10",X"01",X"01",X"03",X"07",X"1E",X"3C", + X"CB",X"CB",X"C3",X"43",X"C3",X"C3",X"42",X"C3",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"00",X"00",X"3C",X"37",X"33",X"11",X"10",X"00",X"00",X"00", + X"C2",X"E0",X"A4",X"86",X"86",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"10",X"00",X"00",X"00",X"13",X"17",X"3D",X"2D",X"0F", + X"00",X"00",X"00",X"80",X"C0",X"84",X"86",X"86",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"00",X"5F",X"76",X"32",X"BB",X"77",X"11",X"77",X"11", + X"C7",X"DF",X"FF",X"CF",X"E3",X"CF",X"CB",X"CF",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"11",X"11",X"11",X"11",X"10",X"11",X"10",X"01",X"01",X"03",X"07",X"1E",X"3C", + X"CB",X"CB",X"C3",X"43",X"C3",X"C3",X"42",X"C3",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00", + X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"3C",X"37",X"33",X"11",X"10",X"00",X"00",X"00", + X"C2",X"E0",X"A4",X"86",X"86",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"10",X"00",X"00",X"00",X"13",X"57",X"7D",X"7F",X"2F", + X"00",X"00",X"00",X"80",X"C0",X"C4",X"E6",X"CE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"AF",X"76",X"FF",X"FF",X"32",X"55",X"77",X"11", + X"CF",X"8F",X"E6",X"C7",X"CB",X"CB",X"CF",X"CB",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"10",X"10",X"10",X"01",X"01",X"03",X"07",X"1E",X"3C", + X"CB",X"CB",X"C3",X"43",X"C3",X"C3",X"42",X"C3",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"00",X"00",X"3C",X"37",X"33",X"11",X"10",X"00",X"00",X"00", + X"C2",X"E0",X"A4",X"86",X"86",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"10",X"00",X"11",X"55",X"77",X"37",X"BF",X"BF",X"AF", + X"00",X"00",X"22",X"A2",X"EA",X"DD",X"F7",X"E6",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"00",X"EF",X"37",X"FF",X"77",X"33",X"77",X"77",X"11", + X"CF",X"FF",X"CE",X"CB",X"EB",X"EF",X"CF",X"CB",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"11",X"11",X"11",X"11",X"10",X"10",X"10",X"01",X"01",X"03",X"07",X"1E",X"3C", + X"CB",X"CB",X"C3",X"43",X"C3",X"C3",X"42",X"C3",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00", + X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"3C",X"37",X"33",X"11",X"10",X"00",X"00",X"00", + X"C2",X"E0",X"A4",X"86",X"86",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"BB",X"77",X"77",X"33",X"11",X"11",X"32",X"00",X"AA",X"66",X"BB",X"DF",X"FF",X"6F",X"AF", + X"22",X"AA",X"FF",X"EE",X"EA",X"AE",X"BF",X"AE",X"00",X"88",X"00",X"00",X"00",X"88",X"00",X"00", + X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"AF",X"FF",X"77",X"DD",X"33",X"99",X"77",X"11", + X"EF",X"DF",X"EE",X"CF",X"CB",X"EF",X"CF",X"CB",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"69",X"69",X"69",X"69",X"2D",X"2D",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"1E",X"9E",X"9E",X"8F",X"07",X"07",X"07",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"07",X"03",X"03",X"03", + X"02",X"86",X"86",X"86",X"86",X"A4",X"2C",X"2C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"2D",X"2D",X"69",X"69",X"69",X"69",X"69",X"69",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"6D",X"6D",X"69",X"69",X"2D",X"2D",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"1E",X"9E",X"9E",X"8F",X"07",X"07",X"07",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"07",X"03",X"03",X"03", + X"02",X"86",X"86",X"86",X"86",X"A4",X"2C",X"2C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"23",X"33",X"11",X"55",X"33",X"01",X"33",X"01", + X"AF",X"6F",X"7F",X"EF",X"F9",X"EF",X"ED",X"EF",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"ED",X"6D",X"69",X"69",X"2D",X"2D",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"1E",X"9E",X"9E",X"8F",X"07",X"07",X"07",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"27",X"AB",X"77",X"9B", + X"02",X"86",X"86",X"86",X"86",X"AE",X"BF",X"6E",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"BB",X"77",X"77",X"11",X"23",X"33",X"01", + X"6F",X"6D",X"FB",X"EB",X"6D",X"FD",X"EF",X"ED",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"6D",X"6D",X"69",X"69",X"2D",X"2D",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"1E",X"9E",X"9E",X"8F",X"07",X"07",X"07",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"55",X"33",X"33",X"11",X"00",X"00",X"11",X"44",X"5F",X"3F",X"DF",X"EF",X"FF",X"33",X"57", + X"13",X"D7",X"F7",X"F7",X"D7",X"FD",X"7D",X"7D",X"00",X"44",X"88",X"00",X"00",X"44",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"77",X"33",X"67",X"11",X"45",X"33",X"01", + X"7F",X"EF",X"FF",X"EF",X"ED",X"FF",X"EF",X"ED",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"EF",X"EF",X"EF",X"77",X"23",X"01",X"01",X"01",X"3F",X"BF",X"3F",X"3F",X"3F",X"BF",X"3F",X"7F", + X"CF",X"CF",X"FF",X"FF",X"FF",X"CF",X"CF",X"CF",X"8F",X"8F",X"8F",X"8E",X"8E",X"8E",X"8C",X"8C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"33",X"11",X"11",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"CF",X"CF",X"FF",X"FF",X"47",X"77",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"FC", + X"70",X"70",X"F0",X"F0",X"F0",X"C7",X"F7",X"FF",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"11",X"11",X"11",X"31",X"61",X"E1",X"E7",X"EF",X"FD",X"FD",X"FF",X"3F",X"3F",X"BF",X"3F",X"7F", + X"CF",X"CF",X"CF",X"FF",X"FF",X"FF",X"CF",X"CF",X"CC",X"CC",X"AE",X"AE",X"AE",X"9F",X"9F",X"8F", + X"EF",X"EF",X"EF",X"67",X"23",X"01",X"01",X"11",X"3F",X"BF",X"3F",X"7F",X"3F",X"BF",X"3F",X"3F", + X"FF",X"FF",X"FF",X"CF",X"CF",X"CF",X"FF",X"FF",X"8F",X"8F",X"8F",X"8E",X"8E",X"8E",X"8C",X"8C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"33",X"11",X"11",X"00",X"00",X"00",X"00", + X"CF",X"CF",X"FF",X"FF",X"CF",X"CF",X"77",X"47",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"FC", + X"70",X"70",X"F0",X"F0",X"F0",X"F0",X"C7",X"C7",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"11",X"11",X"11",X"31",X"71",X"E1",X"E1",X"F7",X"FC",X"FD",X"FD",X"FF",X"3F",X"BF",X"3F",X"3F", + X"CF",X"FF",X"FF",X"FF",X"CF",X"CF",X"CF",X"CF",X"C4",X"CC",X"EE",X"AE",X"AE",X"BF",X"9F",X"9F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"31",X"73",X"73",X"B7",X"3F", + X"C0",X"40",X"E8",X"64",X"56",X"56",X"CF",X"47",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"37",X"37",X"33",X"11",X"11",X"00",X"00", + X"47",X"47",X"CF",X"46",X"46",X"44",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"71",X"73",X"B7",X"3F", + X"C0",X"C0",X"60",X"60",X"74",X"DE",X"56",X"47",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"37",X"37",X"33",X"11",X"11",X"00",X"00", + X"47",X"CF",X"47",X"46",X"46",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"31",X"73",X"73",X"B7",X"3F", + X"C0",X"40",X"60",X"64",X"DE",X"56",X"47",X"47",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"37",X"37",X"33",X"11",X"11",X"00",X"00", + X"CF",X"47",X"47",X"46",X"CE",X"44",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"71",X"73",X"B7",X"B7", + X"C0",X"C0",X"60",X"E8",X"74",X"56",X"56",X"CF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"37",X"37",X"33",X"11",X"11",X"00",X"00", + X"47",X"47",X"47",X"CE",X"46",X"44",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"40",X"20",X"12",X"57",X"8F",X"0F",X"0F",X"00",X"17",X"2F",X"2F",X"C7",X"2F",X"2F",X"0F", + X"06",X"CF",X"4F",X"2F",X"1E",X"2D",X"0F",X"8F",X"00",X"20",X"40",X"84",X"8C",X"6E",X"4E",X"8F", + X"07",X"8F",X"9F",X"36",X"21",X"41",X"11",X"00",X"5F",X"2F",X"A7",X"1F",X"0F",X"0F",X"0F",X"CC", + X"5F",X"0F",X"4F",X"4F",X"C7",X"A7",X"84",X"80",X"4E",X"AE",X"4E",X"0E",X"0C",X"48",X"20",X"00", + X"00",X"00",X"01",X"83",X"63",X"31",X"32",X"47",X"00",X"00",X"CD",X"1F",X"4F",X"9F",X"0F",X"2F", + X"00",X"40",X"4B",X"4B",X"CB",X"5F",X"2F",X"8F",X"00",X"00",X"00",X"1C",X"AC",X"CA",X"86",X"0C", + X"07",X"13",X"32",X"21",X"41",X"01",X"00",X"00",X"9F",X"8F",X"4F",X"4F",X"6D",X"2D",X"21",X"20", + X"5F",X"0F",X"CB",X"BD",X"5E",X"3F",X"4C",X"00",X"4C",X"CC",X"4C",X"88",X"00",X"80",X"40",X"00", + X"00",X"10",X"00",X"01",X"23",X"81",X"71",X"12",X"00",X"00",X"B3",X"6B",X"3D",X"0F",X"DF",X"0F", + X"10",X"10",X"1C",X"6D",X"7D",X"AF",X"0F",X"9E",X"00",X"00",X"00",X"88",X"5C",X"0C",X"E0",X"88", + X"23",X"11",X"11",X"01",X"00",X"00",X"10",X"00",X"4F",X"CF",X"3F",X"6D",X"49",X"80",X"00",X"00", + X"9F",X"2F",X"6B",X"BD",X"1C",X"00",X"00",X"00",X"4C",X"0C",X"0C",X"08",X"00",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"10",X"00",X"00",X"00",X"10",X"76",X"1E",X"8F",X"E7", + X"00",X"00",X"00",X"00",X"8C",X"9E",X"AC",X"6B",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"43",X"4F",X"1F",X"13",X"10",X"20",X"00",X"00", + X"8F",X"6C",X"3E",X"84",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"31", + X"00",X"00",X"00",X"00",X"00",X"40",X"88",X"64",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"11",X"62", + X"00",X"00",X"00",X"00",X"80",X"A8",X"44",X"3A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"A8",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"22",X"00",X"C6", + X"00",X"00",X"00",X"80",X"98",X"2A",X"00",X"13",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"40",X"00",X"00",X"00",X"00",X"00", + X"00",X"2A",X"98",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"80",X"44",X"02",X"00",X"AC", + X"00",X"00",X"80",X"88",X"19",X"82",X"00",X"21",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"C8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"44",X"80",X"00",X"00",X"00",X"00", + X"00",X"82",X"19",X"88",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"04", + X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"22",X"00",X"00",X"02",X"80",X"11",X"44",X"00",X"81", + X"00",X"00",X"88",X"20",X"00",X"15",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"10",X"80",X"02",X"00",X"00",X"00", + X"00",X"15",X"00",X"20",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"00",X"22",X"00",X"41",X"00",X"01",X"44",X"00",X"22",X"80",X"11",X"20", + X"00",X"00",X"40",X"11",X"80",X"02",X"00",X"91",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"44", + X"00",X"22",X"00",X"01",X"00",X"00",X"00",X"00",X"11",X"88",X"20",X"00",X"44",X"10",X"00",X"00", + X"00",X"20",X"08",X"11",X"44",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"11",X"00",X"00",X"07",X"1F", + X"00",X"00",X"01",X"CF",X"16",X"96",X"3C",X"8F",X"00",X"00",X"80",X"C4",X"00",X"00",X"80",X"08", + X"0F",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"F1",X"70",X"00",X"00",X"11",X"00",X"00", + X"CF",X"F8",X"E1",X"87",X"43",X"ED",X"10",X"00",X"0C",X"80",X"80",X"00",X"00",X"C4",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"11",X"01",X"37",X"7F", + X"00",X"00",X"12",X"9E",X"1E",X"2D",X"8F",X"CB",X"00",X"00",X"88",X"00",X"00",X"08",X"0C",X"C0", + X"07",X"0F",X"70",X"00",X"00",X"00",X"00",X"00",X"1F",X"3C",X"D0",X"00",X"00",X"00",X"00",X"00", + X"F0",X"87",X"87",X"C3",X"30",X"FE",X"00",X"00",X"C0",X"08",X"08",X"80",X"E2",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"10",X"13",X"3F", + X"00",X"00",X"71",X"E1",X"C3",X"87",X"CF",X"DA",X"00",X"00",X"00",X"00",X"08",X"08",X"80",X"48", + X"03",X"07",X"1E",X"70",X"00",X"00",X"00",X"00",X"1E",X"3C",X"F0",X"80",X"00",X"00",X"00",X"00", + X"C3",X"87",X"F0",X"10",X"66",X"00",X"00",X"00",X"48",X"2E",X"2C",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"32",X"30",X"33", + X"00",X"00",X"70",X"E1",X"C3",X"87",X"8F",X"DA",X"00",X"00",X"88",X"00",X"08",X"08",X"80",X"0C", + X"00",X"01",X"03",X"07",X"34",X"00",X"00",X"00",X"37",X"1E",X"0F",X"78",X"80",X"00",X"00",X"00", + X"C3",X"87",X"C3",X"F0",X"11",X"22",X"00",X"00",X"3D",X"2C",X"68",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"65",X"73",X"77", + X"00",X"C4",X"84",X"1E",X"3C",X"0F",X"87",X"87",X"00",X"00",X"00",X"00",X"00",X"A2",X"0C",X"48", + X"00",X"00",X"00",X"01",X"01",X"03",X"12",X"00",X"76",X"0F",X"1E",X"2C",X"48",X"80",X"00",X"00", + X"B4",X"D1",X"A2",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"21",X"21",X"21",X"32",X"76", + X"00",X"08",X"0C",X"2C",X"5A",X"0F",X"0F",X"1E",X"00",X"00",X"00",X"00",X"44",X"48",X"C0",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"76",X"74",X"07",X"1E",X"1E",X"2C",X"68",X"C0", + X"79",X"E2",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"11",X"33",X"33", + X"00",X"0C",X"2C",X"5A",X"0F",X"0F",X"87",X"96",X"00",X"00",X"88",X"00",X"08",X"80",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"23",X"03",X"07",X"16",X"16",X"16",X"24",X"24", + X"F0",X"E2",X"A2",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"16",X"07",X"03",X"03",X"21",X"23",X"33", + X"00",X"08",X"79",X"96",X"0F",X"0F",X"87",X"B4",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"13",X"03",X"03",X"03",X"03",X"12",X"02", + X"6A",X"6A",X"08",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E1",X"0F",X"16",X"12",X"03",X"23",X"33", + X"00",X"00",X"E2",X"68",X"1E",X"1E",X"96",X"A4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"11",X"01",X"01",X"01",X"01",X"00",X"00", + X"6A",X"6A",X"6A",X"48",X"48",X"48",X"48",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"0F",X"1E",X"07",X"07",X"23",X"33", + X"00",X"44",X"E0",X"1E",X"1E",X"1E",X"3D",X"B5",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"11",X"01",X"01",X"00",X"00",X"00",X"00", + X"F1",X"0C",X"2C",X"2C",X"2C",X"2C",X"2C",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"01",X"00",X"00",X"00",X"00",X"00",X"11",X"96",X"1E",X"1E",X"87",X"63",X"33", + X"00",X"80",X"48",X"2C",X"2C",X"2C",X"3D",X"B5",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"11",X"01",X"00",X"00",X"00",X"00",X"00", + X"C2",X"2C",X"2C",X"1E",X"1E",X"16",X"16",X"02",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"F0",X"1E",X"0F",X"87",X"F2", + X"00",X"C8",X"68",X"2C",X"2C",X"0E",X"1F",X"3D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"73",X"33",X"11",X"00",X"00",X"00",X"00",X"00", + X"A4",X"96",X"9E",X"0F",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"80",X"80",X"48",X"48",X"08", + X"00",X"00",X"00",X"00",X"01",X"01",X"32",X"10",X"11",X"10",X"21",X"C3",X"0F",X"0F",X"3C",X"F3", + X"80",X"C0",X"48",X"6A",X"59",X"48",X"2C",X"A4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F3",X"74",X"22",X"00",X"00",X"00",X"00",X"00", + X"DA",X"8F",X"0F",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"48",X"48",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"32",X"B8",X"43",X"87",X"87",X"87",X"0F",X"1E",X"B6", + X"00",X"80",X"80",X"80",X"C4",X"A2",X"48",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"F7",X"F3",X"44",X"22",X"00",X"00",X"00",X"00", + X"96",X"8F",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"48",X"0C",X"0E",X"00",X"00",X"00", + X"00",X"11",X"10",X"10",X"30",X"03",X"07",X"03",X"60",X"96",X"1E",X"1E",X"96",X"0F",X"0F",X"78", + X"00",X"00",X"00",X"88",X"44",X"80",X"C0",X"68",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"74",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"F7",X"F3",X"B4",X"66",X"00",X"00",X"00",X"00", + X"1E",X"8F",X"0F",X"01",X"00",X"00",X"00",X"00",X"00",X"80",X"48",X"0E",X"00",X"00",X"00",X"00", + X"00",X"22",X"10",X"10",X"10",X"03",X"07",X"03",X"C0",X"2C",X"1E",X"1E",X"87",X"0F",X"78",X"7F", + X"00",X"00",X"88",X"E6",X"80",X"E0",X"F0",X"96",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0", + X"74",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"F7",X"F0",X"E6",X"00",X"00",X"00",X"00",X"00", + X"8F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"2C",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"FF", + X"00",X"00",X"00",X"EE",X"22",X"EE",X"00",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"FF",X"00",X"99",X"99",X"FF",X"00",X"00", + X"22",X"EE",X"00",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"FF",X"88",X"FF",X"00", + X"EE",X"22",X"EE",X"00",X"EE",X"22",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"00",X"FF",X"44",X"00", + X"EE",X"22",X"EE",X"00",X"22",X"EE",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"99",X"99",X"FF",X"00",X"00",X"FF",X"44",X"00", + X"EE",X"22",X"22",X"00",X"22",X"EE",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"FF",X"88",X"FF",X"00", + X"EE",X"22",X"EE",X"00",X"EE",X"22",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"FF",X"88",X"FF",X"00", + X"EE",X"22",X"EE",X"00",X"EE",X"22",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"FF",X"99",X"99",X"00", + X"EE",X"22",X"EE",X"00",X"22",X"22",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"FF",X"99",X"99",X"00", + X"EE",X"22",X"EE",X"00",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"FF",X"00",X"FF",X"88",X"FF",X"00", + X"EE",X"22",X"EE",X"00",X"EE",X"22",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/rtl/video_mixer.sv b/Arcade/Konami Classic/Time_Pilot_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_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/Arcade/Konami Classic/Time_Pilot_MiST/time_pilot_mist.qpf b/Arcade/Konami Classic/Time_Pilot_MiST/time_pilot_mist.qpf new file mode 100644 index 00000000..91b40ed1 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/time_pilot_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 = 11:17:10 October 25, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "16.1" +DATE = "11:17:10 October 25, 2017" + +# Revisions + +PROJECT_REVISION = "time_pilot_mist" diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/time_pilot_mist.qsf b/Arcade/Konami Classic/Time_Pilot_MiST/time_pilot_mist.qsf new file mode 100644 index 00000000..14700b3e --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/time_pilot_mist.qsf @@ -0,0 +1,166 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 14:18:08 November 05, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# time_pilot_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 TOP_LEVEL_ENTITY time_pilot_mist + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name TIMEQUEST_DO_CCPP_REMOVAL ON +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" + +# Fitter Assignments +# ================== +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ENABLE_CONFIGURATION_PINS OFF +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +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 "ModelSim-Altera (VHDL)" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON + +# SignalTap II Assignments +# ======================== +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE output_files/stp1.stp + +# 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)" + + + +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_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 + + + +set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF +set_global_assignment -name ENABLE_NCE_PIN OFF +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +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 VHDL_FILE rtl/time_pilot_mist.vhd +set_global_assignment -name VHDL_FILE rtl/time_pilot.vhd +set_global_assignment -name VHDL_FILE rtl/YM2149_linmix_sep.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VHDL_FILE rtl/time_pilot_sprite_grphx.vhd +set_global_assignment -name VHDL_FILE rtl/time_pilot_sprite_color_lut.vhd +set_global_assignment -name VHDL_FILE rtl/time_pilot_sound_prog.vhd +set_global_assignment -name VHDL_FILE rtl/time_pilot_sound_board.vhd +set_global_assignment -name VHDL_FILE rtl/time_pilot_prog.vhd +set_global_assignment -name VHDL_FILE rtl/time_pilot_palette_green_red.vhd +set_global_assignment -name VHDL_FILE rtl/time_pilot_palette_blue_green.vhd +set_global_assignment -name VHDL_FILE rtl/time_pilot_char_grphx.vhd +set_global_assignment -name VHDL_FILE rtl/time_pilot_char_color_lut.vhd +set_global_assignment -name VHDL_FILE rtl/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80se.vhd +set_global_assignment -name VHDL_FILE rtl/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80.vhd +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name QIP_FILE rtl/mist_pll_12M_14M.qip +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/gen_video.vhd +set_global_assignment -name VHDL_FILE rtl/gen_ram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd + +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" + +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Konami Classic/Time_Pilot_MiST/time_pilot_mist.srf b/Arcade/Konami Classic/Time_Pilot_MiST/time_pilot_mist.srf new file mode 100644 index 00000000..e413eda9 --- /dev/null +++ b/Arcade/Konami Classic/Time_Pilot_MiST/time_pilot_mist.srf @@ -0,0 +1 @@ +{ "" "" "" "*" { } { } 0 10492 "" 0 0 "Quartus II" 0 -1 0 ""} diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/CosmicAvenger.qpf b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/CosmicAvenger.qpf new file mode 100644 index 00000000..790ac5e0 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/CosmicAvenger.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "CosmicAvenger" diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/CosmicAvenger.qsf b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/CosmicAvenger.qsf new file mode 100644 index 00000000..2ed25465 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/CosmicAvenger.qsf @@ -0,0 +1,206 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 10:02:22 November 16, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# CosmicAvenger_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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 QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_top.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_tone.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_noise.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_latch_ctrl.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_clock_div.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_attenuator.vhd +set_global_assignment -name VHDL_FILE rtl/sound/ladybug_sound_unit.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_sprite_u.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_sprite_l.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_cpu3.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_cpu2.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_cpu1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_char_u.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_char_l.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_decrypt.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_10_3.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_10_2.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_10_1.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80a.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ttl_393.vhd +set_global_assignment -name VHDL_FILE rtl/ttl_175.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_video_unit.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_video_timing.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_sprite_ctrl.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_sprite.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_rgb.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_res.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_rams.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_machine.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_gpio.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_dip_pack.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_cpu_unit.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_counter.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_clk.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_chutes.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_chute.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_char.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_addr_dec.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/CosmicAvenger.sv +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# 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 SAVE_DISK_SPACE OFF +set_global_assignment -name TOP_LEVEL_ENTITY CosmicAvenger + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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 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 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_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(CosmicAvenger) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(CosmicAvenger) +# ------------------- +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" +set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/CosmicAvenger.srf b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/CosmicAvenger.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/CosmicAvenger.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/README.txt b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/README.txt new file mode 100644 index 00000000..fa035762 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Cosmic Avenger port to MiST by Gehstock +-- 14 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Lady Bug hardware +-- Unknown Author on Papilio Plus board. +--------------------------------------------------------------------------------- +-- +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- L. ALT : Bomb +-- F2 : Start 2 players +-- F1 : Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + + +ToDo : Sound diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/Release/CosmicAvenger.rbf b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/Release/CosmicAvenger.rbf new file mode 100644 index 00000000..c41379dd Binary files /dev/null and b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/Release/CosmicAvenger.rbf differ diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/clean.bat b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_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/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/CosmicAvenger.sv b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/CosmicAvenger.sv new file mode 100644 index 00000000..95eed6d1 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/CosmicAvenger.sv @@ -0,0 +1,194 @@ +//============================================================================ +// Arcade: Cosmic Avenger +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module CosmicAvenger +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "C.Avenger;;", +// "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire signed[7:0] audio_s; +reg [6:0] audio; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(440), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_vid), + .ce_pix_actual(ce_vid), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn ? {r} : "0"), + .G(blankn ? {g&g} : "00"), + .B(blankn ? {b} : "0"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +wire m_bomb = kbjoy[8]; +wire blankn = ~(hblank | vblank); + + + +//condition ? if true : if false +ladybugt ladybugt +( + .CLK_IN(clk_sys), + .I_RESET(status[0] | status[6] | buttons[1]), + .O_PIXCE(ce_vid), + + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_VSYNC(vs), + .O_HSYNC(hs), + .O_VBLANK(vblank), + .O_HBLANK(hblank), + + .O_AUDIO(audio_s), + + .but_coin_s(~{1'b0,m_coin}), + .but_fire_s(~{1'b0,m_fire}), + .but_bomb_s(~{1'b0,m_bomb}), + .but_tilt_s(~{1'b0,1'b0}), + .but_select_s(~{m_start2,m_start1}), + .but_up_s(~{1'b0,m_up}), + .but_down_s(~{1'b0,m_down}), + .but_left_s(~{1'b0,m_left}), + .but_right_s(~{1'b0,m_right}) +); + +assign audio = audio_s; + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/prom_10_1.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/prom_10_1.vhd new file mode 100644 index 00000000..3f3f748f --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/prom_10_1.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_10_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_10_1 is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"78",X"A3",X"B5",X"00",X"8C",X"79",X"64",X"00",X"C3",X"EE",X"DD",X"00",X"3C",X"A2",X"4A", + X"00",X"87",X"BA",X"DE",X"00",X"2A",X"AE",X"BB",X"00",X"8C",X"C2",X"B7",X"00",X"AC",X"E2",X"1D"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/prom_10_2.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/prom_10_2.vhd new file mode 100644 index 00000000..c0b51aff --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/prom_10_2.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_10_2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_10_2 is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F5",X"C4",X"D0",X"B1",X"D4",X"90",X"45",X"44",X"00",X"54",X"91",X"94",X"25",X"21",X"65",X"F5", + X"21",X"00",X"25",X"D0",X"B1",X"90",X"D4",X"D4",X"25",X"B1",X"C4",X"90",X"65",X"D4",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/prom_10_3.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/prom_10_3.vhd new file mode 100644 index 00000000..a731ff5c --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/prom_10_3.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_10_3 is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_10_3 is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"3A",X"3A",X"3A",X"3A",X"28",X"28",X"38",X"38", + X"08",X"08",X"38",X"38",X"20",X"20",X"38",X"38",X"20",X"20",X"38",X"38",X"3E",X"3E",X"3E",X"3E"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/prom_decrypt.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/prom_decrypt.vhd new file mode 100644 index 00000000..00f98d21 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/prom_decrypt.vhd @@ -0,0 +1,63 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity prom_decrypt is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(7 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of prom_decrypt is + + + type ROM_ARRAY is array(0 to 255) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"01",x"02",x"03",x"04",x"05",x"06",x"07", -- 0x0000 + x"08",x"09",x"0A",x"0B",x"0C",x"0D",x"0E",x"0F", -- 0x0008 + x"10",x"11",x"12",x"13",x"14",x"15",x"16",x"17", -- 0x0010 + x"18",x"19",x"1A",x"1B",x"1C",x"1D",x"1E",x"1F", -- 0x0018 + x"20",x"21",x"22",x"23",x"24",x"25",x"26",x"27", -- 0x0020 + x"28",x"29",x"2A",x"2B",x"2C",x"2D",x"2E",x"2F", -- 0x0028 + x"30",x"31",x"32",x"33",x"34",x"35",x"36",x"37", -- 0x0030 + x"38",x"39",x"3A",x"3B",x"3C",x"3D",x"3E",x"3F", -- 0x0038 + x"40",x"41",x"42",x"43",x"44",x"45",x"46",x"47", -- 0x0040 + x"48",x"49",x"4A",x"4B",x"4C",x"4D",x"4E",x"4F", -- 0x0048 + x"50",x"51",x"52",x"53",x"54",x"55",x"56",x"57", -- 0x0050 + x"58",x"59",x"5A",x"5B",x"5C",x"5D",x"5E",x"5F", -- 0x0058 + x"60",x"61",x"62",x"63",x"64",x"65",x"66",x"67", -- 0x0060 + x"68",x"69",x"6A",x"6B",x"6C",x"6D",x"6E",x"6F", -- 0x0068 + x"70",x"71",x"72",x"73",x"74",x"75",x"76",x"77", -- 0x0070 + x"78",x"79",x"7A",x"7B",x"7C",x"7D",x"7E",x"7F", -- 0x0078 + x"80",x"81",x"82",x"83",x"84",x"85",x"86",x"87", -- 0x0080 + x"88",x"89",x"8A",x"8B",x"8C",x"8D",x"8E",x"8F", -- 0x0088 + x"90",x"91",x"92",x"93",x"94",x"95",x"96",x"97", -- 0x0090 + x"98",x"99",x"9A",x"9B",x"9C",x"9D",x"9E",x"9F", -- 0x0098 + x"A0",x"A1",x"A2",x"A3",x"A4",x"A5",x"A6",x"A7", -- 0x00A0 + x"A8",x"A9",x"AA",x"AB",x"AC",x"AD",x"AE",x"AF", -- 0x00A8 + x"B0",x"B1",x"B2",x"B3",x"B4",x"B5",x"B6",x"B7", -- 0x00B0 + x"B8",x"B9",x"BA",x"BB",x"BC",x"BD",x"BE",x"BF", -- 0x00B8 + x"C0",x"C1",x"C2",x"C3",x"C4",x"C5",x"C6",x"C7", -- 0x00C0 + x"C8",x"C9",x"CA",x"CB",x"CC",x"CD",x"CE",x"CF", -- 0x00C8 + x"D0",x"D1",x"D2",x"D3",x"D4",x"D5",x"D6",x"D7", -- 0x00D0 + x"D8",x"D9",x"DA",x"DB",x"DC",x"DD",x"DE",x"DF", -- 0x00D8 + x"E0",x"E1",x"E2",x"E3",x"E4",x"E5",x"E6",x"E7", -- 0x00E0 + x"E8",x"E9",x"EA",x"EB",x"EC",x"ED",x"EE",x"EF", -- 0x00E8 + x"F0",x"F1",x"F2",x"F3",x"F4",x"F5",x"F6",x"F7", -- 0x00F0 + x"F8",x"F9",x"FA",x"FB",x"FC",x"FD",x"FE",x"FF" -- 0x00F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_char_l.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_char_l.vhd new file mode 100644 index 00000000..209a2c92 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_char_l.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_char_l is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_char_l is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"7C",X"C6",X"C6",X"C6",X"C6",X"C6",X"7C",X"00",X"18",X"1C",X"18",X"18",X"18",X"18",X"3C", + X"00",X"7C",X"E6",X"C6",X"30",X"0C",X"C6",X"7E",X"00",X"7C",X"C6",X"C0",X"70",X"C6",X"C6",X"7C", + X"00",X"68",X"68",X"6C",X"64",X"FE",X"60",X"F0",X"00",X"7E",X"02",X"7E",X"C2",X"C0",X"C6",X"7C", + X"00",X"7C",X"C6",X"06",X"7E",X"C6",X"C6",X"7C",X"00",X"FE",X"C2",X"C2",X"60",X"30",X"18",X"18", + X"00",X"7C",X"C6",X"C6",X"7C",X"C6",X"C6",X"7C",X"00",X"7C",X"C6",X"C6",X"FC",X"C0",X"C6",X"7C", + X"00",X"70",X"58",X"C8",X"CC",X"FC",X"C6",X"C6",X"00",X"7E",X"CC",X"CC",X"7C",X"CC",X"CC",X"7E", + X"00",X"78",X"CC",X"06",X"06",X"86",X"CC",X"78",X"00",X"3E",X"6C",X"CC",X"CC",X"CC",X"6C",X"3E", + X"00",X"FE",X"CC",X"0C",X"3C",X"0C",X"CC",X"FE",X"00",X"FE",X"CC",X"0C",X"3C",X"0C",X"0C",X"1E", + X"00",X"78",X"CC",X"06",X"06",X"E6",X"CC",X"78",X"00",X"EE",X"6C",X"6C",X"7C",X"6C",X"6C",X"EE", + X"00",X"3C",X"18",X"18",X"18",X"18",X"18",X"3C",X"00",X"F0",X"60",X"60",X"60",X"60",X"6C",X"38", + X"00",X"9E",X"CC",X"6C",X"3C",X"6C",X"CC",X"DE",X"00",X"1E",X"0C",X"0C",X"0C",X"0C",X"CC",X"FE", + X"00",X"C6",X"EE",X"FE",X"D6",X"D6",X"C6",X"C6",X"00",X"C6",X"CE",X"DE",X"F6",X"E6",X"C6",X"C6", + X"00",X"7C",X"C6",X"C6",X"C6",X"C6",X"C6",X"7C",X"00",X"7E",X"CC",X"CC",X"7C",X"0C",X"0C",X"1E", + X"00",X"38",X"6C",X"C6",X"C6",X"D6",X"6C",X"D8",X"00",X"7E",X"CC",X"CC",X"7C",X"6C",X"CC",X"DE", + X"00",X"7C",X"8E",X"1C",X"78",X"F0",X"E2",X"7C",X"00",X"7E",X"5A",X"18",X"18",X"18",X"18",X"3C", + X"00",X"DE",X"8C",X"8C",X"8C",X"8C",X"8C",X"78",X"00",X"DE",X"8C",X"8C",X"8C",X"58",X"58",X"30", + X"00",X"B6",X"B6",X"B6",X"B6",X"FE",X"6C",X"28",X"00",X"C6",X"6E",X"3C",X"38",X"78",X"EC",X"C6", + X"00",X"E6",X"6C",X"78",X"30",X"30",X"18",X"1C",X"00",X"FE",X"E6",X"70",X"38",X"1C",X"CE",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00", + X"00",X"00",X"10",X"00",X"00",X"10",X"00",X"00",X"00",X"0C",X"12",X"14",X"08",X"14",X"22",X"7C", + X"30",X"30",X"38",X"38",X"18",X"08",X"00",X"04",X"38",X"44",X"44",X"20",X"10",X"10",X"00",X"10", + X"00",X"20",X"10",X"08",X"08",X"08",X"10",X"20",X"00",X"08",X"10",X"20",X"20",X"20",X"10",X"08", + X"00",X"10",X"10",X"10",X"FE",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"7E",X"00",X"00",X"00", + X"00",X"00",X"7E",X"00",X"00",X"7E",X"00",X"00",X"00",X"44",X"EE",X"EE",X"FE",X"7C",X"38",X"10", + X"38",X"44",X"44",X"38",X"10",X"7C",X"10",X"10",X"10",X"38",X"54",X"10",X"38",X"44",X"44",X"38", + X"18",X"38",X"28",X"48",X"28",X"0C",X"0E",X"06",X"10",X"38",X"7C",X"54",X"FE",X"28",X"44",X"28", + X"00",X"00",X"A7",X"A9",X"A7",X"A5",X"49",X"00",X"00",X"00",X"02",X"06",X"0A",X"0A",X"06",X"00", + X"00",X"00",X"07",X"31",X"53",X"51",X"57",X"00",X"00",X"04",X"04",X"06",X"05",X"05",X"06",X"00", + X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"10",X"38",X"7C",X"FE",X"38",X"38",X"38",X"38", + X"3C",X"42",X"99",X"85",X"85",X"99",X"42",X"3C",X"00",X"7C",X"18",X"F0",X"FC",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"0F",X"7F",X"00",X"00",X"00",X"3E",X"0C",X"F8",X"FE",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"3F",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"80",X"C0",X"C0",X"E0",X"E0",X"F0",X"F0",X"F8",X"F8",X"FC",X"FC",X"FE",X"FE",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"3F",X"1F",X"0F",X"07",X"03",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"02", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"03",X"00",X"00",X"00",X"00",X"00",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"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08", + X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0", + X"00",X"00",X"C8",X"C8",X"C8",X"C8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"30",X"31",X"FD",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"79",X"79",X"79",X"79",X"00",X"00",X"3E",X"7C",X"78",X"F8",X"F0",X"F0",X"F0",X"F0", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"00",X"00",X"18",X"18",X"18",X"18",X"3C",X"3C", + X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"FF",X"FF",X"00",X"00",X"7E",X"7E",X"7E",X"7E",X"00",X"00", + X"00",X"00",X"3C",X"00",X"3C",X"3C",X"00",X"00",X"3C",X"00",X"00",X"3C",X"3C",X"00",X"00",X"3C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"0C",X"8C",X"BE",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"9E",X"9E",X"9E",X"9E",X"00",X"00",X"7C",X"3E",X"1E",X"1F",X"0F",X"0F",X"0F",X"0F", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"00",X"00",X"13",X"13",X"13",X"13",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7E",X"7E",X"FF",X"7E",X"7E",X"FF",X"7E",X"7E", + X"C0",X"60",X"F0",X"78",X"7C",X"FE",X"7F",X"7E",X"03",X"06",X"0F",X"1E",X"3E",X"7F",X"FE",X"7E", + X"00",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"FF",X"C0",X"70",X"FC",X"7F",X"7F",X"FF",X"7F",X"7F", + X"03",X"0E",X"3F",X"FE",X"FE",X"FF",X"FE",X"FE",X"00",X"00",X"00",X"00",X"03",X"0F",X"3F",X"FF", + X"FF",X"FF",X"CC",X"CC",X"CC",X"CC",X"FF",X"FF",X"00",X"80",X"40",X"20",X"10",X"88",X"C4",X"F2", + X"F1",X"E8",X"E8",X"D0",X"A3",X"47",X"8F",X"1F",X"FF",X"00",X"00",X"F0",X"E3",X"C7",X"8F",X"1F", + X"2F",X"2F",X"17",X"8B",X"C5",X"E2",X"F1",X"F8",X"FF",X"00",X"00",X"0F",X"C7",X"E3",X"F1",X"F8", + X"74",X"74",X"F8",X"D0",X"A3",X"47",X"8F",X"1F",X"00",X"01",X"02",X"04",X"08",X"11",X"23",X"47", + X"8F",X"17",X"17",X"0B",X"C5",X"E2",X"F1",X"F8",X"00",X"00",X"80",X"C0",X"E0",X"70",X"38",X"1C", + X"1C",X"8E",X"AE",X"FE",X"DE",X"DF",X"FF",X"FF",X"07",X"07",X"07",X"06",X"0E",X"0E",X"0E",X"1C", + X"F8",X"F8",X"F0",X"F0",X"E0",X"E0",X"C0",X"C0",X"C0",X"E0",X"F8",X"3C",X"1C",X"0C",X"0C",X"0C", + X"E0",X"FE",X"FF",X"07",X"41",X"E0",X"A8",X"BC",X"F5",X"F7",X"BE",X"BE",X"F7",X"F7",X"BE",X"BE", + X"00",X"00",X"CE",X"CE",X"CE",X"C0",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"7F",X"3E",X"1C",X"1C",X"1C",X"07",X"7F",X"FF",X"E0",X"82",X"07",X"15",X"3D", + X"AF",X"EF",X"7D",X"7D",X"EF",X"EF",X"7D",X"7D",X"00",X"00",X"73",X"73",X"73",X"03",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"7C",X"38",X"38",X"38", + X"00",X"00",X"01",X"03",X"07",X"0E",X"1C",X"38",X"38",X"71",X"75",X"7F",X"7B",X"FB",X"FF",X"FF", + X"E0",X"E0",X"E0",X"60",X"70",X"70",X"70",X"38",X"1F",X"1F",X"0F",X"0F",X"07",X"07",X"03",X"03", + X"03",X"07",X"1F",X"3C",X"38",X"30",X"30",X"30",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FE",X"FC",X"F8",X"F0",X"E0",X"C0",X"80",X"FF",X"7F",X"3F",X"1F",X"0F",X"07",X"03",X"01", + X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0",X"F0",X"E0",X"E0",X"C0",X"C0",X"80",X"80",X"80", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"07",X"07",X"03",X"03",X"01",X"01",X"01", + X"FF",X"7F",X"7F",X"3F",X"3F",X"1F",X"1F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"3E",X"1C",X"7E",X"7E",X"FF",X"7E",X"7E",X"FF",X"7E",X"7E", + X"C0",X"60",X"F0",X"78",X"7C",X"FE",X"7F",X"7E",X"03",X"09",X"0F",X"1E",X"3E",X"7F",X"FE",X"7E", + X"00",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"FF",X"C0",X"70",X"FC",X"7F",X"7F",X"FF",X"7F",X"7F", + X"03",X"0E",X"3F",X"FE",X"FE",X"FF",X"FE",X"FE",X"00",X"00",X"00",X"00",X"03",X"0F",X"3F",X"FF", + X"00",X"00",X"80",X"C5",X"C7",X"05",X"10",X"71",X"00",X"00",X"00",X"80",X"C0",X"C0",X"10",X"10", + X"00",X"00",X"00",X"01",X"03",X"03",X"02",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"10", + X"00",X"00",X"00",X"00",X"60",X"70",X"01",X"70",X"00",X"00",X"01",X"03",X"07",X"00",X"80",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"FC",X"FC",X"FE",X"FE",X"FF",X"FF",X"00",X"C0",X"F0",X"F8",X"FC",X"FE",X"FE",X"FF", + X"C0",X"E9",X"E5",X"F4",X"72",X"79",X"38",X"3C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FC",X"F8",X"F8",X"F0",X"F0",X"E0",X"E0",X"F8",X"FC",X"FE",X"7F",X"7C",X"F8",X"E0",X"E0", + X"7E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"81",X"81",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"81",X"00",X"00",X"00",X"00",X"C3",X"FF",X"00",X"03",X"0F",X"1F",X"3F",X"7F",X"7F",X"FF", + X"01",X"53",X"13",X"27",X"26",X"4E",X"0C",X"1C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"3F",X"1F",X"1F",X"0F",X"0F",X"07",X"07",X"1F",X"3F",X"7F",X"FF",X"3F",X"1F",X"07",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"1F",X"3F",X"3F",X"7F",X"7F",X"FF",X"FF", + X"81",X"DB",X"7E",X"24",X"24",X"7E",X"E7",X"C3",X"80",X"D8",X"70",X"32",X"3E",X"7C",X"E6",X"C3", + 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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"4E",X"FF",X"00",X"00",X"00",X"80",X"80",X"C0",X"E0",X"F0", + X"FF",X"FF",X"0F",X"EE",X"EE",X"DE",X"DC",X"BC",X"B8",X"78",X"70",X"F0",X"E0",X"00",X"00",X"00", + X"00",X"00",X"00",X"F0",X"90",X"98",X"88",X"CC",X"44",X"46",X"63",X"21",X"30",X"18",X"0C",X"FF", + X"FF",X"FF",X"F8",X"FB",X"FB",X"F7",X"F7",X"F7",X"EF",X"EF",X"E0",X"FF",X"FF",X"F7",X"F7",X"F7", + X"11",X"11",X"11",X"22",X"22",X"24",X"24",X"24",X"24",X"24",X"FF",X"FF",X"FF",X"FF",X"24",X"24", + X"00",X"00",X"00",X"FF",X"99",X"99",X"18",X"18",X"18",X"3C",X"3C",X"3C",X"3C",X"7E",X"7E",X"FF", + X"FF",X"FF",X"00",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"00",X"FF",X"FF",X"7E",X"7E",X"7E", + X"81",X"81",X"81",X"42",X"42",X"42",X"42",X"42",X"42",X"42",X"FF",X"FF",X"FF",X"FF",X"42",X"42", + X"00",X"00",X"00",X"0F",X"09",X"19",X"11",X"33",X"22",X"62",X"C6",X"84",X"0C",X"18",X"30",X"FF", + X"FF",X"FF",X"1F",X"DF",X"DF",X"EF",X"EF",X"EF",X"F7",X"F7",X"07",X"FF",X"FF",X"EF",X"EF",X"EF", + X"88",X"88",X"88",X"44",X"44",X"24",X"24",X"24",X"24",X"24",X"FF",X"FF",X"FF",X"FF",X"24",X"24", + X"00",X"00",X"00",X"01",X"01",X"03",X"06",X"0F",X"FF",X"FF",X"F0",X"77",X"77",X"7B",X"3B",X"3D", + X"1D",X"1E",X"0E",X"0F",X"07",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"C0",X"E0",X"F0",X"F8",X"FC",X"FE",X"FF",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F",X"FF", + X"FF",X"FE",X"FC",X"F8",X"F0",X"E0",X"C0",X"80",X"FF",X"7F",X"3F",X"1F",X"0F",X"07",X"03",X"01", + X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"C0",X"E0",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"00",X"80",X"C0",X"E0",X"F8",X"FC",X"FF",X"FF", + X"01",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"1F", + X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07", + X"07",X"0F",X"1F",X"3F",X"3F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"07",X"1F",X"1F",X"3F",X"3F",X"7F",X"7F",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"01",X"07",X"0F",X"3F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"FF",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"FF",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"F0",X"80",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FE",X"F0",X"C0",X"80",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FC",X"F0",X"E0",X"E0",X"C0",X"C0",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FC",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC", + X"F8",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"F8", + X"F0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FE",X"FC",X"FC",X"F8",X"F0", + X"F0",X"E0",X"E0",X"C0",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"FF",X"7F",X"7F",X"3F",X"3F",X"3F",X"1F",X"1F",X"0F",X"0F",X"07",X"03",X"01",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"1F",X"1F",X"0F",X"03",X"01", + X"FF",X"FF",X"FF",X"FF",X"3F",X"0F",X"07",X"03",X"FF",X"FF",X"E7",X"81",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"F0",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"3C",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"7F",X"7F",X"3F",X"3F",X"3F",X"1F",X"1F",X"0F",X"0F",X"07",X"07",X"03",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"FF",X"3F",X"1F",X"07",X"03",X"03",X"01",X"01", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FC",X"F8",X"F0",X"E0",X"C0",X"C0",X"80",X"80", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0",X"C0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"F0",X"E0",X"C0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7C",X"30",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"7F",X"7F",X"3F",X"1F",X"0F",X"0F",X"07",X"07",X"03",X"03",X"01",X"01",X"00", + X"FF",X"FF",X"FF",X"FE",X"F8",X"E0",X"80",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"FE",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FE",X"FC",X"F8",X"F8",X"F0",X"F0",X"E0",X"E0",X"C0",X"80",X"80",X"00",X"00", + X"FF",X"FF",X"FF",X"7F",X"3F",X"1F",X"0F",X"06",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"7F",X"7F",X"7F",X"3F",X"1F",X"1F",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"3F",X"3F",X"3F",X"1F",X"1F",X"0F",X"07",X"03",X"01", + X"FF",X"7F",X"7F",X"7F",X"3F",X"1F",X"1F",X"0F",X"0F",X"07",X"03",X"01",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"E1",X"C0",X"80",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FC",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"F8",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FC",X"F8",X"F8",X"F0",X"E0",X"C0",X"80",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"F0",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"F8",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"7F",X"1F",X"0F",X"0F",X"01",X"00",X"FF",X"FF",X"FF",X"FF",X"2F",X"07",X"03",X"01", + X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"FC",X"F8",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"1F",X"1F",X"1F",X"07",X"03", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"3F",X"1F", + X"1F",X"0F",X"0F",X"07",X"07",X"07",X"07",X"07",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"7F",X"1F",X"07",X"03",X"03",X"03",X"01",X"01",X"FF",X"FF",X"FE",X"FE",X"FE",X"FC",X"FC",X"FC", + X"FC",X"FC",X"F8",X"F8",X"F8",X"F0",X"B0",X"10",X"FF",X"FF",X"FF",X"07",X"03",X"03",X"01",X"00", + X"FF",X"FF",X"FF",X"FE",X"FC",X"F0",X"E0",X"E0",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FE",X"F8",X"F0",X"F0",X"E0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"3F", + X"3F",X"1E",X"1C",X"08",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"FF",X"7F",X"3F",X"0F",X"07",X"01",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"1F",X"0F",X"0F",X"07", + X"FF",X"FF",X"FF",X"FF",X"C0",X"80",X"80",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FC",X"FC",X"F8",X"E0",X"80",X"80",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"FC",X"F8",X"F0",X"E0",X"C0",X"80",X"80",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FC",X"F8",X"F0",X"E0",X"C0",X"80",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"FC",X"78",X"20",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"FF",X"FF",X"FF",X"FF",X"7F",X"3F",X"0F",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"7F",X"3F",X"1F",X"07",X"03",X"01",X"01",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"7F",X"3F",X"0F",X"0F",X"07",X"03",X"03",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"7F",X"1F",X"0F",X"0F",X"07",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F", + X"FF",X"FF",X"FF",X"FF",X"3F",X"0F",X"00",X"00",X"FF",X"7F",X"7F",X"7F",X"3F",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"E0",X"F0",X"F8",X"FE",X"FF",X"FF",X"FF",X"C0",X"C0",X"E0",X"E0",X"F0",X"F8",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"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"F0", + X"F0",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0", + X"C0",X"E0",X"F0",X"F0",X"F8",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"80",X"C0",X"C0",X"E0",X"E0",X"F0",X"F8",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"80",X"80",X"C0",X"E0",X"E0",X"F0",X"F0",X"F8",X"F8",X"FC",X"FC",X"FE",X"FE",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"E0", + X"F0",X"F0",X"F8",X"F8",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"C0",X"E0",X"F0",X"F0",X"F0",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E1",X"F1",X"F3",X"F3",X"FF",X"FF",X"FF",X"FF",X"03",X"07",X"07",X"0F",X"0F",X"0F",X"6F",X"7F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"01",X"01",X"01",X"03",X"03",X"03", + X"07",X"0F",X"0F",X"1F",X"3F",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"01",X"03",X"07",X"07",X"0F",X"0F",X"1F",X"3F",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"03",X"07",X"07",X"0F",X"0F",X"1F",X"3F", + X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"07", + X"07",X"0F",X"0F",X"1F",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"81",X"C3",X"E7",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0", + X"F0",X"F0",X"F8",X"FC",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"F8",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"C0",X"F0",X"F8",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"06",X"07",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"01",X"03",X"07",X"07",X"0F",X"0F",X"1F",X"1F",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"03",X"07",X"07",X"0F",X"0F",X"1F",X"3F", + X"3F",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03", + X"03",X"07",X"0F",X"0F",X"1F",X"1F",X"3F",X"FF",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0", + X"C0",X"C0",X"E0",X"F0",X"F0",X"F8",X"FE",X"FF",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"C0",X"C0", + X"C0",X"E0",X"F0",X"F8",X"FE",X"FE",X"FC",X"FC",X"FC",X"F8",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"F0",X"F8",X"F8",X"F8",X"F8",X"F0",X"F0",X"FC",X"FE", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"80",X"E0",X"F0",X"F8",X"F8", + X"FC",X"FC",X"FE",X"FE",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"F0",X"F8",X"F8",X"F8",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FE",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"07",X"1F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"03",X"03",X"07",X"07",X"0F",X"0F",X"1F",X"1F",X"3F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"07",X"07",X"0F",X"0F",X"0F",X"1F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"01",X"01",X"01",X"03",X"03", + X"03",X"07",X"0F",X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"03",X"07",X"07",X"0F",X"0F",X"1F",X"1F", + X"1F",X"1F",X"3F",X"3F",X"7F",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"03",X"07",X"07",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"03",X"07",X"0F",X"0F",X"1F",X"3F",X"7F",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"03",X"07",X"0F",X"3F",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"1F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"FC",X"F8",X"F8",X"F0",X"F0",X"F0",X"E0",X"E0",X"C0",X"C0",X"C0",X"80",X"80",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"F8",X"F8",X"F8",X"F8",X"F0",X"F0",X"E0",X"E0",X"E0",X"E0",X"C0",X"C0",X"C0",X"80",X"80", + X"80",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"FE",X"FE",X"FE", + X"FC",X"FC",X"FC",X"FC",X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0",X"E0",X"E0",X"E0",X"E0",X"E0", + X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"7E",X"7E",X"7E",X"3E",X"3C",X"3C",X"18",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"3F", + X"3F",X"3F",X"3F",X"3F",X"1F",X"1F",X"1F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"07",X"03",X"03", + X"03",X"03",X"03",X"01",X"01",X"01",X"01",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"3F",X"3F",X"1F",X"1F",X"1F",X"1F",X"0F",X"0F",X"07",X"07", + X"03",X"03",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"3F",X"3F",X"1F",X"1F",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"03",X"03",X"01",X"01", + X"80",X"C0",X"C0",X"E0",X"F0",X"F8",X"F8",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"C0",X"C0",X"E0",X"E0",X"F0",X"F0",X"F8",X"FC",X"FC",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"E0",X"E0", + X"E0",X"F0",X"F0",X"F8",X"F8",X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"80",X"80",X"80",X"C0",X"C0",X"E0", + X"E0",X"E0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"FC",X"FC",X"FE",X"FE",X"FE",X"FE",X"FE",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"78",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"03",X"07",X"0F",X"0F",X"1F",X"1F",X"3F",X"3F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"03",X"03",X"07",X"07",X"07",X"0F",X"0F", + X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"03",X"03",X"07",X"07",X"0F",X"0F",X"1F",X"3F", + X"3F",X"3F",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"01",X"01",X"03",X"03",X"03",X"07",X"07",X"0F",X"0F",X"0F",X"1F",X"3F",X"7F",X"7F",X"7F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_char_u.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_char_u.vhd new file mode 100644 index 00000000..1c134e54 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_char_u.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_char_u is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_char_u is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7C",X"18",X"30",X"78",X"F8",X"7C",X"00", + X"00",X"00",X"00",X"00",X"0C",X"7F",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08", + X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"E0",X"E0",X"F0",X"F0",X"F0", + X"F8",X"FC",X"36",X"36",X"36",X"36",X"FC",X"F8",X"F0",X"E0",X"C0",X"80",X"80",X"00",X"00",X"00", + X"00",X"C0",X"F0",X"F8",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"87",X"FF",X"86",X"FF", + X"FF",X"FF",X"86",X"86",X"86",X"86",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE", + X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"7E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"DB",X"C3",X"FF",X"F7",X"FF",X"E7",X"FF",X"FF",X"FF",X"81",X"81",X"81",X"81",X"FF",X"FF", + X"FF",X"FF",X"C3",X"FF",X"C3",X"C3",X"FF",X"FF",X"C3",X"FF",X"FF",X"C3",X"C3",X"FF",X"FF",X"C3", + X"00",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"E1",X"FF",X"61",X"FF", + X"FF",X"FF",X"61",X"61",X"61",X"61",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F", + X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"03",X"03",X"07",X"07",X"07",X"0F",X"0F",X"0F",X"1F",X"3F",X"6C",X"6C",X"6C",X"6C",X"3F",X"1F", + X"0F",X"07",X"03",X"01",X"01",X"00",X"00",X"00",X"42",X"7E",X"C3",X"7E",X"7E",X"C3",X"7E",X"42", + X"C0",X"60",X"F0",X"58",X"7C",X"C6",X"7F",X"42",X"03",X"06",X"0F",X"1A",X"3E",X"63",X"FE",X"62", + X"00",X"00",X"00",X"00",X"C0",X"70",X"FC",X"47",X"C0",X"70",X"FC",X"47",X"7F",X"C0",X"7F",X"42", + X"03",X"0E",X"3F",X"E2",X"FE",X"03",X"FE",X"42",X"00",X"00",X"00",X"00",X"03",X"0E",X"3F",X"E2", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"80",X"C0",X"E0",X"70",X"B8",X"DC", + X"EE",X"E7",X"E7",X"CF",X"9C",X"3B",X"77",X"EF",X"00",X"FF",X"FF",X"EF",X"CC",X"BB",X"77",X"EF", + X"CF",X"CF",X"E7",X"73",X"B9",X"DC",X"EE",X"F7",X"00",X"FF",X"FF",X"F7",X"3B",X"DD",X"EE",X"F7", + X"F3",X"F3",X"E7",X"CE",X"9D",X"3B",X"77",X"EF",X"00",X"00",X"01",X"03",X"07",X"0E",X"1D",X"3B", + X"77",X"E7",X"E7",X"F3",X"39",X"DC",X"EE",X"F7",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"A0",X"F0",X"F8",X"F8",X"F8",X"F8",X"F8",X"F0",X"F0",X"E0",X"C0",X"80",X"00",X"00", + X"78",X"78",X"70",X"F0",X"E0",X"E0",X"C0",X"C0",X"C0",X"E0",X"F8",X"3C",X"1C",X"0C",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"40",X"E0",X"E8",X"FC",X"FD",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"7B",X"7F",X"FF",X"FF",X"FC",X"10",X"10",X"10",X"38",X"38",X"38",X"7D",X"7D", + X"80",X"C1",X"F7",X"77",X"3E",X"1C",X"1C",X"1C",X"00",X"00",X"00",X"00",X"02",X"07",X"17",X"3F", + X"BF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"DE",X"FE",X"FF",X"FF",X"3F", + X"08",X"08",X"08",X"1C",X"1C",X"1C",X"3E",X"3E",X"01",X"83",X"EF",X"EE",X"7C",X"38",X"38",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"05",X"0F",X"1F",X"1F",X"1F",X"1F", + X"1F",X"0F",X"0F",X"07",X"03",X"01",X"00",X"00",X"1E",X"1E",X"0E",X"0F",X"07",X"07",X"03",X"03", + X"03",X"07",X"1F",X"3C",X"38",X"30",X"30",X"30",X"23",X"11",X"11",X"08",X"48",X"48",X"44",X"60", + X"44",X"49",X"23",X"27",X"8F",X"9F",X"3F",X"7F",X"22",X"82",X"C2",X"E1",X"F1",X"F8",X"FC",X"FE", + X"20",X"29",X"49",X"43",X"43",X"27",X"27",X"0F",X"4F",X"5F",X"1F",X"3F",X"3F",X"7F",X"7F",X"7F", + X"4F",X"4F",X"6F",X"2F",X"2F",X"AF",X"8F",X"0F",X"F1",X"F9",X"F9",X"FC",X"FC",X"FE",X"FE",X"FE", + X"24",X"90",X"92",X"C2",X"CA",X"EA",X"E1",X"F1",X"F2",X"F2",X"F4",X"F4",X"FF",X"F2",X"F2",X"F1", + X"B2",X"92",X"88",X"88",X"C4",X"C4",X"D0",X"E3",X"BD",X"81",X"3C",X"81",X"81",X"3C",X"81",X"BD", + X"3F",X"1F",X"0F",X"A7",X"83",X"39",X"80",X"BD",X"FC",X"F9",X"F0",X"E5",X"C1",X"9C",X"01",X"BD", + X"FF",X"FF",X"FF",X"FF",X"3F",X"8F",X"03",X"38",X"3F",X"0F",X"03",X"B8",X"80",X"3F",X"80",X"BD", + X"FC",X"F1",X"C0",X"1D",X"01",X"FC",X"01",X"BD",X"FF",X"FF",X"FF",X"FF",X"FC",X"F1",X"C0",X"1D", + X"81",X"E7",X"7F",X"3A",X"38",X"FA",X"FF",X"FF",X"80",X"B0",X"E0",X"6C",X"38",X"3A",X"FE",X"FF", + X"01",X"0D",X"07",X"36",X"1C",X"5C",X"7D",X"FF",X"00",X"00",X"00",X"00",X"B0",X"E0",X"FA",X"FF", + X"80",X"F0",X"E2",X"FC",X"FD",X"FF",X"FF",X"FF",X"01",X"0F",X"26",X"3C",X"B8",X"F3",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"0D",X"07",X"5F",X"FF",X"80",X"80",X"C0",X"C0",X"E0",X"E0",X"F0",X"F0", + X"00",X"00",X"FC",X"FC",X"C0",X"00",X"00",X"00",X"00",X"C0",X"F0",X"F8",X"FC",X"FE",X"FE",X"FF", + X"FF",X"F6",X"FA",X"FB",X"FD",X"FE",X"FF",X"FF",X"00",X"00",X"03",X"0F",X"7F",X"FC",X"F0",X"E0", + X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00", + X"7E",X"FF",X"99",X"99",X"99",X"81",X"81",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"81",X"C3",X"E7",X"E7",X"E7",X"FF",X"7E",X"3C",X"18",X"18",X"18", + X"00",X"7E",X"FF",X"FF",X"FF",X"FF",X"3C",X"00",X"00",X"03",X"0F",X"1F",X"3F",X"7F",X"7F",X"FF", + X"FF",X"AF",X"EF",X"DF",X"DF",X"BF",X"FF",X"FF",X"00",X"00",X"C0",X"F0",X"FE",X"3F",X"0F",X"07", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"01",X"01",X"03",X"03",X"07",X"07",X"0F",X"0F",X"00",X"00",X"3F",X"3F",X"03",X"00",X"00",X"00", + X"01",X"0B",X"0E",X"04",X"04",X"0E",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"1B",X"0E",X"4C",X"7C",X"3E",X"67",X"C3",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FB",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"1E",X"1E",X"3E",X"3C",X"7C",X"78",X"F8",X"F0",X"F0",X"E0",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"60",X"60",X"70",X"30",X"B8",X"B8",X"9C",X"DE",X"CF",X"E7",X"F3",X"00", + X"FF",X"FF",X"FF",X"FC",X"FC",X"F8",X"F8",X"F8",X"F0",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EE",X"EE",X"EE",X"DC",X"DC",X"D8",X"D8",X"D8",X"D8",X"D8",X"FF",X"FF",X"FF",X"FF",X"D8",X"D8", + X"00",X"00",X"00",X"00",X"66",X"66",X"E7",X"E7",X"E7",X"C3",X"C3",X"C3",X"C3",X"81",X"81",X"00", + X"FF",X"FF",X"FF",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"7E",X"7E",X"7E",X"BD",X"BD",X"BD",X"BD",X"BD",X"BD",X"BD",X"FF",X"FF",X"FF",X"FF",X"BD",X"BD", + X"00",X"00",X"00",X"00",X"06",X"06",X"0E",X"0C",X"1D",X"1D",X"39",X"7B",X"F3",X"E7",X"CF",X"00", + X"FF",X"FF",X"FF",X"3F",X"3F",X"1F",X"1F",X"1F",X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"77",X"77",X"77",X"3B",X"3B",X"1B",X"1B",X"1B",X"1B",X"1B",X"FF",X"FF",X"FF",X"FF",X"1B",X"1B", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"FF",X"FF",X"FF",X"78",X"78",X"7C",X"3C",X"3E", + X"1E",X"1F",X"0F",X"0F",X"07",X"01",X"01",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"C0",X"E0",X"F0",X"F8",X"FC",X"FE",X"FF",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F",X"FF", + X"FF",X"FE",X"FC",X"F8",X"F0",X"E0",X"C0",X"80",X"FF",X"7F",X"3F",X"1F",X"0F",X"07",X"03",X"01", + X"7F",X"07",X"03",X"01",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"FF",X"7F",X"3F",X"0F",X"07",X"03",X"01",X"00",X"FF",X"FF",X"FF",X"7F",X"3F",X"0F",X"07",X"01", + X"FF",X"FF",X"F0",X"80",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"F8", + X"F0",X"F0",X"E0",X"C0",X"80",X"80",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE", + X"FC",X"FC",X"F8",X"F0",X"E0",X"E0",X"C0",X"80",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FC",X"F0",X"F0",X"E0",X"E0",X"C0",X"C0", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FC",X"F8",X"F0",X"E0",X"C0", + X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FC",X"F8",X"E0",X"C0",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + 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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"03",X"1F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"07",X"1F",X"3F",X"3F",X"7F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07", + X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"01",X"01",X"03",X"07",X"0F", + X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"1F", + X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"03",X"07",X"07",X"0F",X"1F",X"1F", + X"3F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"C0",X"C0",X"E0",X"E0",X"E0",X"F0",X"F0",X"F8",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"E0",X"F0",X"F0",X"F8",X"FE",X"FF",X"FF", + X"00",X"00",X"00",X"E0",X"F8",X"FC",X"FE",X"FF",X"00",X"3C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"03",X"03",X"07",X"1F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"E7",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0", + X"C0",X"E0",X"E0",X"E0",X"F0",X"F0",X"F8",X"F8",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1F",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"07",X"0F",X"0F",X"1F",X"7F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"03",X"07",X"1F",X"3F",X"7F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"81",X"C7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"C0",X"C0",X"E0",X"F0",X"F8",X"F8",X"FC",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"03",X"0F",X"3F",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03", + X"03",X"03",X"07",X"07",X"0F",X"0F",X"1F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"03",X"07",X"0F",X"0F",X"1F",X"1F",X"3F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"80",X"C0",X"E0",X"F0",X"F9",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"80",X"C0",X"C0",X"C0",X"E0",X"F0",X"F0",X"F8",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"E0",X"E0",X"F0",X"F0",X"F8",X"FC",X"FE",X"FF",X"FF", + X"C0",X"C0",X"C0",X"E0",X"F0",X"F0",X"F8",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"01",X"07",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"01",X"01",X"03",X"07",X"0F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"07",X"0F",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"01",X"03",X"03",X"07",X"07",X"0F",X"1F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"01",X"03",X"07",X"8F",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"80",X"C0",X"F0",X"F8",X"F8",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"F8",X"FC",X"FE",X"FF",X"FF", + X"00",X"00",X"00",X"03",X"07",X"07",X"0F",X"BF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"C0",X"E0",X"E0",X"F0",X"F0",X"F0",X"FC",X"FE",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"C0",X"E0",X"F0",X"F0", + X"F8",X"F8",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"FC",X"FE",X"FE",X"FE",X"FE",X"FF",X"FF",X"01",X"03",X"03",X"03",X"07",X"07",X"07",X"07", + X"07",X"0F",X"0F",X"0F",X"1F",X"FF",X"FF",X"FF",X"00",X"00",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF", + X"00",X"00",X"03",X"07",X"1F",X"3F",X"3F",X"3F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"03",X"0F",X"1F",X"1F",X"3F",X"FF",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"E1", + X"F3",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"C0",X"E0",X"F8",X"FC",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"F0",X"F8",X"F8",X"FC",X"FF", + X"00",X"00",X"00",X"7F",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07", + X"07",X"0F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03", + X"07",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"07",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"83", + X"87",X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"80",X"80",X"80",X"C0",X"E0",X"F8",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0", + X"E0",X"F0",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0", + X"F0",X"F8",X"F8",X"FC",X"FE",X"FE",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"80",X"C0",X"F0",X"F8",X"F8",X"FC",X"FE",X"FF",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"FF", + X"00",X"00",X"00",X"E0",X"F8",X"FF",X"FF",X"FF",X"C0",X"C0",X"C0",X"E1",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"1F",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"3F",X"1F",X"0F",X"03",X"00",X"00",X"FF",X"7F",X"7F",X"3F",X"3F",X"1F",X"0F",X"07", + X"01",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"FF",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"7F",X"1F", + X"01",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"7F",X"7F",X"3F", + X"1F",X"1F",X"07",X"03",X"03",X"01",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"7F",X"7F",X"3F",X"1F",X"1F",X"0F",X"0F",X"07",X"03",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"7F",X"7F",X"3F",X"3F",X"1F",X"0F",X"07",X"07",X"03",X"01",X"01",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"7F",X"3F",X"3F",X"1F",X"1F",X"0F",X"0F",X"07",X"07",X"03",X"03",X"01", + X"01",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"7F",X"7F",X"3F", + X"3F",X"1F",X"1F",X"0F",X"0F",X"07",X"03",X"03",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"7F",X"3F",X"1F",X"1F",X"1F",X"07",X"03",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"FF",X"3F",X"1F",X"1E",X"1E",X"00",X"00",X"00",X"FF",X"FE",X"FC",X"FC",X"F8",X"F8",X"F8",X"F8", + X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE", + X"FE",X"FC",X"F8",X"F8",X"F0",X"E0",X"E0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0",X"E0",X"E0",X"C0",X"C0",X"80",X"80", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0", + X"E0",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE", + X"FC",X"FC",X"F8",X"F8",X"F0",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"7E",X"3C",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F", + X"3F",X"1F",X"1F",X"0F",X"07",X"07",X"03",X"03",X"01",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"7F",X"3F",X"1F",X"0F",X"0F",X"07",X"03",X"01",X"01",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"7F",X"1F",X"0F",X"0F",X"07",X"03",X"01",X"01",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FD",X"F8",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0",X"F0",X"E0",X"C0",X"C0",X"80",X"80",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0", + X"E0",X"E0",X"E0",X"C0",X"C0",X"80",X"80",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"FE",X"FC",X"F8",X"F8",X"F0",X"F0",X"E0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F", + X"7F",X"7F",X"7F",X"3F",X"1F",X"1F",X"0F",X"03",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F", + X"7F",X"7F",X"3F",X"1F",X"0F",X"07",X"07",X"07",X"0F",X"0F",X"0F",X"07",X"03",X"03",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"3F",X"1F",X"0F",X"0F",X"1F",X"1F",X"1F",X"1F",X"07", + X"03",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"1F",X"0F", + X"0F",X"07",X"07",X"03",X"03",X"03",X"03",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"3F",X"1F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"07", + X"07",X"03",X"03",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"F9",X"F1",X"E0",X"C0",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FC",X"F0",X"C0",X"80",X"80",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0",X"F0",X"E0",X"C0",X"C0",X"C0",X"80",X"80",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"F8",X"F8",X"F0", + X"E0",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE", + X"FE",X"FE",X"FC",X"F8",X"F8",X"F0",X"F0",X"E0",X"E0",X"E0",X"E0",X"C0",X"C0",X"C0",X"80",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0", + X"F0",X"F0",X"F0",X"E0",X"E0",X"C0",X"80",X"80",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FE",X"FC",X"FC",X"F8",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",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"FF",X"FE",X"FC",X"F8",X"F8",X"F0",X"E0",X"C0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FE",X"FC",X"F8",X"E0",X"80",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE", + X"F0",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"07",X"0F",X"0F",X"1F",X"1F",X"1F",X"3F",X"3F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"03",X"03",X"07",X"07",X"07",X"07",X"07",X"07", + X"0F",X"0F",X"0F",X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"01",X"01",X"01",X"03",X"03",X"03",X"07", + X"07",X"07",X"07",X"0F",X"0F",X"0F",X"1F",X"1F",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F",X"3F",X"7F", + X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"01",X"81",X"81", + X"C3",X"C3",X"C3",X"E3",X"E7",X"E7",X"FF",X"FF",X"80",X"80",X"80",X"C0",X"C0",X"C0",X"E0",X"E0", + X"E0",X"E0",X"E0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE", + X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"80",X"80",X"C0",X"C0",X"C0",X"E0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"FC",X"FC",X"FE", + X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E0",X"E0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"FC",X"FC",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF", + X"FF",X"FF",X"7F",X"7F",X"3F",X"1F",X"0F",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"7F",X"7F",X"3F",X"3F",X"1F",X"1F",X"0F",X"0F",X"07",X"07",X"07",X"03",X"01",X"01", + X"01",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"7F",X"7F",X"3F", + X"3F",X"3F",X"1F",X"1F",X"0F",X"0F",X"07",X"07",X"07",X"07",X"03",X"03",X"03",X"01",X"01",X"01", + X"01",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"7F",X"7F", + X"3F",X"3F",X"3F",X"1F",X"1F",X"1F",X"0F",X"0F",X"0F",X"07",X"07",X"03",X"03",X"03",X"03",X"03", + X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"FF",X"CF",X"03",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FE",X"FC",X"F8",X"F8",X"F0",X"F0",X"E0",X"E0",X"C0",X"C0",X"C0",X"80",X"80",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FE",X"FC",X"FC",X"FC",X"F8", + X"F8",X"F8",X"F0",X"F0",X"E0",X"E0",X"E0",X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"80",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0", + X"E0",X"E0",X"E0",X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FE",X"FC",X"FC",X"F8",X"F8",X"F8",X"F0",X"E0",X"C0",X"C0", + X"C0",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"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"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_cpu1.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_cpu1.vhd new file mode 100644 index 00000000..10184892 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_cpu1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_cpu1 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 prom of rom_cpu1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"31",X"00",X"6C",X"C3",X"1E",X"01",X"FF",X"FF",X"5E",X"23",X"56",X"23",X"EB",X"C9",X"FF",X"FF", + X"77",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"01",X"90",X"C3",X"71",X"05",X"FF",X"FF",X"F5",X"C5",X"D5",X"E5",X"C3",X"7C",X"00",X"C1", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F5",X"C5",X"D5",X"E5",X"3A",X"03",X"90",X"E6",X"F0",X"0F", + X"0F",X"0F",X"0F",X"CD",X"8F",X"00",X"E1",X"D1",X"C1",X"F1",X"ED",X"45",X"3A",X"03",X"90",X"E6", + X"0F",X"C6",X"10",X"CD",X"8F",X"00",X"3A",X"00",X"80",X"E1",X"D1",X"C1",X"F1",X"FB",X"C9",X"47", + X"3A",X"02",X"60",X"A7",X"C0",X"1E",X"06",X"CD",X"00",X"07",X"78",X"87",X"5F",X"16",X"00",X"21", + X"DE",X"00",X"19",X"EB",X"68",X"01",X"05",X"60",X"09",X"34",X"1A",X"BE",X"C0",X"47",X"3A",X"04", + X"60",X"4F",X"13",X"1A",X"81",X"27",X"38",X"0B",X"FE",X"99",X"28",X"07",X"32",X"04",X"60",X"36", + X"00",X"18",X"07",X"3E",X"99",X"32",X"04",X"60",X"05",X"70",X"3A",X"00",X"60",X"17",X"D8",X"AF", + X"32",X"45",X"63",X"32",X"46",X"63",X"21",X"47",X"63",X"CB",X"FE",X"CB",X"E6",X"C9",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"01",X"03",X"02",X"03",X"01", + X"02",X"03",X"02",X"01",X"01",X"05",X"01",X"04",X"01",X"03",X"01",X"02",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"01",X"03",X"02",X"03",X"01", + X"02",X"03",X"02",X"01",X"01",X"05",X"01",X"04",X"01",X"03",X"01",X"02",X"01",X"01",X"3A",X"00", + X"90",X"47",X"3A",X"01",X"90",X"A0",X"E6",X"10",X"CA",X"09",X"02",X"21",X"00",X"60",X"11",X"01", + X"60",X"01",X"FF",X"0F",X"36",X"00",X"ED",X"B0",X"3A",X"02",X"90",X"E6",X"30",X"0F",X"0F",X"0F", + X"47",X"0F",X"80",X"4F",X"06",X"00",X"21",X"E3",X"01",X"09",X"11",X"73",X"60",X"01",X"03",X"00", + X"ED",X"B0",X"11",X"25",X"60",X"3E",X"05",X"21",X"73",X"60",X"01",X"03",X"00",X"ED",X"B0",X"21", + X"FF",X"01",X"01",X"0A",X"00",X"ED",X"B0",X"3D",X"20",X"ED",X"21",X"5B",X"36",X"22",X"76",X"60", + X"21",X"00",X"04",X"22",X"78",X"60",X"21",X"00",X"03",X"22",X"7A",X"60",X"CD",X"91",X"52",X"3A", + X"02",X"90",X"2F",X"E6",X"03",X"32",X"DC",X"60",X"47",X"87",X"87",X"5F",X"16",X"00",X"DD",X"21", + X"EF",X"01",X"DD",X"19",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"22",X"DD",X"60",X"DD",X"6E",X"02", + X"DD",X"66",X"03",X"22",X"DF",X"60",X"A7",X"3E",X"1E",X"28",X"02",X"3E",X"0F",X"32",X"E1",X"60", + X"78",X"2F",X"E6",X"03",X"3E",X"3C",X"20",X"02",X"3E",X"1E",X"32",X"E2",X"60",X"78",X"21",X"00", + X"02",X"A7",X"28",X"03",X"21",X"80",X"02",X"22",X"E3",X"60",X"21",X"00",X"01",X"E6",X"02",X"28", + X"01",X"29",X"22",X"E5",X"60",X"3E",X"80",X"32",X"45",X"63",X"ED",X"56",X"3A",X"00",X"80",X"FB", + X"C3",X"11",X"04",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"80",X"00",X"00",X"50",X"00",X"B4", + X"00",X"30",X"0D",X"B4",X"00",X"30",X"0D",X"00",X"01",X"00",X"0C",X"80",X"01",X"00",X"0A",X"1E", + X"17",X"12",X"1F",X"0E",X"1B",X"1C",X"0A",X"15",X"28",X"21",X"00",X"B0",X"36",X"9F",X"36",X"BF", + X"36",X"DF",X"36",X"FF",X"21",X"00",X"C0",X"36",X"9F",X"36",X"BF",X"36",X"DF",X"36",X"FF",X"21", + X"00",X"D0",X"36",X"24",X"23",X"7C",X"FE",X"E0",X"38",X"F8",X"0E",X"40",X"11",X"20",X"00",X"21", + X"00",X"70",X"06",X"20",X"36",X"00",X"19",X"10",X"FB",X"0D",X"20",X"F3",X"DD",X"21",X"ED",X"D1", + X"DD",X"36",X"00",X"1B",X"DD",X"36",X"01",X"18",X"DD",X"36",X"02",X"16",X"21",X"00",X"00",X"11", + X"00",X"00",X"AF",X"06",X"10",X"86",X"2C",X"20",X"FC",X"24",X"10",X"F9",X"BB",X"28",X"10",X"16", + X"FF",X"7B",X"C6",X"01",X"DD",X"77",X"04",X"01",X"00",X"00",X"0B",X"78",X"B1",X"20",X"FB",X"1C", + X"7B",X"FE",X"06",X"38",X"DD",X"CB",X"7A",X"C2",X"00",X"00",X"DD",X"36",X"04",X"18",X"DD",X"36", + X"05",X"14",X"01",X"00",X"00",X"0B",X"78",X"B1",X"20",X"FB",X"DD",X"36",X"00",X"1B",X"DD",X"36", + X"01",X"0A",X"DD",X"36",X"02",X"16",X"DD",X"36",X"04",X"24",X"DD",X"36",X"05",X"24",X"1E",X"FF", + X"21",X"00",X"60",X"16",X"10",X"7B",X"0E",X"10",X"06",X"10",X"C6",X"2F",X"77",X"23",X"10",X"FA", + X"3D",X"0D",X"20",X"F4",X"3D",X"15",X"20",X"EE",X"21",X"00",X"60",X"16",X"10",X"7B",X"0E",X"10", + X"06",X"10",X"C6",X"2F",X"BE",X"20",X"23",X"23",X"10",X"F8",X"3D",X"0D",X"20",X"F2",X"3D",X"15", + X"20",X"EC",X"7B",X"D6",X"0F",X"5F",X"30",X"C8",X"DD",X"36",X"04",X"18",X"DD",X"36",X"05",X"14", + X"01",X"00",X"00",X"0B",X"78",X"B1",X"20",X"FB",X"18",X"15",X"7C",X"E6",X"0C",X"0F",X"0F",X"C6", + X"01",X"DD",X"77",X"04",X"01",X"00",X"00",X"0B",X"78",X"B1",X"20",X"FB",X"C3",X"00",X"00",X"21", + X"34",X"03",X"CD",X"75",X"09",X"21",X"00",X"60",X"36",X"00",X"11",X"01",X"60",X"01",X"FF",X"0F", + X"ED",X"B0",X"1E",X"00",X"D5",X"CD",X"00",X"07",X"06",X"00",X"C5",X"F7",X"CD",X"8B",X"50",X"C1", + X"10",X"F8",X"D1",X"D5",X"CD",X"0E",X"07",X"F7",X"CD",X"8B",X"50",X"D1",X"1C",X"7B",X"FE",X"1A", + X"38",X"E2",X"18",X"09",X"ED",X"D1",X"06",X"1C",X"18",X"1E",X"17",X"0D",X"24",X"1E",X"FF",X"21", + X"00",X"D0",X"16",X"04",X"7B",X"0E",X"10",X"06",X"10",X"C6",X"2F",X"77",X"23",X"10",X"FA",X"3D", + X"0D",X"20",X"F4",X"3D",X"15",X"20",X"EE",X"21",X"00",X"D0",X"16",X"04",X"7B",X"0E",X"10",X"06", + X"10",X"C6",X"2F",X"BE",X"20",X"5F",X"23",X"10",X"F8",X"3D",X"0D",X"20",X"F2",X"3D",X"15",X"20", + X"EC",X"7B",X"D6",X"0F",X"5F",X"30",X"C8",X"1E",X"10",X"21",X"00",X"D4",X"16",X"04",X"7B",X"0E", + X"10",X"06",X"10",X"3C",X"77",X"23",X"10",X"FB",X"3C",X"0D",X"20",X"F5",X"3C",X"15",X"20",X"EF", + X"21",X"00",X"D4",X"16",X"04",X"7B",X"0E",X"10",X"06",X"10",X"C5",X"3C",X"E6",X"0F",X"47",X"7E", + X"E6",X"0F",X"B8",X"C1",X"20",X"23",X"23",X"10",X"F1",X"3C",X"0D",X"20",X"EB",X"3C",X"15",X"20", + X"E5",X"1D",X"20",X"C5",X"AF",X"CD",X"D5",X"07",X"21",X"E0",X"03",X"CD",X"75",X"09",X"06",X"3C", + X"F7",X"10",X"FD",X"18",X"2C",X"16",X"01",X"18",X"02",X"16",X"02",X"21",X"80",X"D0",X"01",X"00", + X"03",X"72",X"23",X"0B",X"78",X"B1",X"20",X"F9",X"06",X"3C",X"F7",X"10",X"FD",X"C3",X"00",X"00", + X"E9",X"D1",X"0E",X"0D",X"12",X"1C",X"19",X"15",X"0A",X"22",X"24",X"1B",X"0A",X"16",X"24",X"18", + X"14",X"AF",X"CD",X"D5",X"07",X"21",X"03",X"04",X"CD",X"75",X"09",X"06",X"78",X"F7",X"10",X"FD", + X"C3",X"00",X"00",X"EA",X"D1",X"0B",X"1F",X"0E",X"1B",X"1C",X"12",X"18",X"17",X"24",X"05",X"25", + X"00",X"F7",X"FD",X"21",X"00",X"60",X"FD",X"CB",X"01",X"7E",X"C4",X"B4",X"05",X"FD",X"CB",X"01", + X"76",X"C4",X"89",X"05",X"FD",X"CB",X"01",X"6E",X"C4",X"D8",X"06",X"FD",X"36",X"01",X"00",X"CD", + X"8B",X"50",X"21",X"AD",X"04",X"3A",X"00",X"60",X"FD",X"21",X"E7",X"60",X"CB",X"5F",X"28",X"04", + X"FD",X"21",X"16",X"62",X"5E",X"23",X"56",X"23",X"D5",X"DD",X"E1",X"5E",X"23",X"56",X"23",X"DD", + X"CB",X"00",X"7E",X"28",X"17",X"DD",X"7E",X"01",X"A7",X"28",X"05",X"DD",X"35",X"01",X"18",X"0C", + X"FD",X"E5",X"E5",X"EB",X"01",X"69",X"04",X"C5",X"E9",X"E1",X"FD",X"E1",X"EB",X"21",X"01",X"60", + X"3A",X"01",X"90",X"07",X"2F",X"AE",X"E6",X"01",X"28",X"14",X"34",X"7E",X"E6",X"1F",X"FE",X"02", + X"20",X"0C",X"FD",X"E5",X"D5",X"CD",X"8B",X"50",X"CD",X"79",X"05",X"D1",X"FD",X"E1",X"21",X"71", + X"05",X"A7",X"ED",X"52",X"28",X"03",X"EB",X"18",X"AB",X"3A",X"01",X"60",X"E6",X"1F",X"FE",X"02", + X"30",X"04",X"F7",X"CD",X"8B",X"50",X"21",X"03",X"60",X"34",X"C3",X"11",X"04",X"68",X"63",X"38", + X"2A",X"79",X"63",X"38",X"2A",X"60",X"63",X"B8",X"29",X"54",X"63",X"59",X"26",X"8A",X"63",X"69", + X"12",X"1C",X"65",X"4C",X"46",X"29",X"65",X"4C",X"46",X"36",X"65",X"4C",X"46",X"43",X"65",X"4C", + X"46",X"50",X"65",X"4C",X"46",X"5D",X"65",X"4C",X"46",X"6A",X"65",X"4C",X"46",X"77",X"65",X"4C", + X"46",X"80",X"64",X"08",X"3B",X"8A",X"64",X"08",X"3B",X"94",X"64",X"08",X"3B",X"9E",X"64",X"08", + X"3B",X"A8",X"64",X"08",X"3B",X"B2",X"64",X"08",X"3B",X"BC",X"64",X"08",X"3B",X"C6",X"64",X"08", + X"3B",X"FC",X"63",X"D7",X"36",X"07",X"64",X"D7",X"36",X"12",X"64",X"D7",X"36",X"1D",X"64",X"D7", + X"36",X"28",X"64",X"D7",X"36",X"33",X"64",X"D7",X"36",X"3E",X"64",X"D7",X"36",X"49",X"64",X"D7", + X"36",X"54",X"64",X"D7",X"36",X"5F",X"64",X"D7",X"36",X"6A",X"64",X"D7",X"36",X"75",X"64",X"D7", + X"36",X"D0",X"64",X"96",X"40",X"DC",X"64",X"94",X"43",X"E4",X"64",X"94",X"43",X"EC",X"64",X"94", + X"43",X"F4",X"64",X"94",X"43",X"FC",X"64",X"94",X"43",X"04",X"65",X"94",X"43",X"0C",X"65",X"94", + X"43",X"14",X"65",X"94",X"43",X"F9",X"63",X"9A",X"35",X"EE",X"63",X"03",X"2D",X"84",X"65",X"00", + X"2C",X"86",X"65",X"2C",X"2C",X"45",X"63",X"C4",X"0C",X"47",X"63",X"65",X"0D",X"49",X"63",X"BE", + X"0E",X"CB",X"7E",X"20",X"FC",X"CB",X"7E",X"28",X"FC",X"21",X"02",X"60",X"7E",X"A7",X"28",X"01", + X"35",X"3A",X"00",X"90",X"17",X"D8",X"36",X"0A",X"C9",X"21",X"00",X"71",X"0E",X"C0",X"16",X"02", + X"1E",X"60",X"CD",X"9C",X"05",X"21",X"40",X"71",X"16",X"0B",X"1E",X"60",X"06",X"04",X"36",X"C8", + X"23",X"71",X"23",X"72",X"23",X"73",X"23",X"79",X"C6",X"04",X"4F",X"7B",X"C6",X"10",X"5F",X"10", + X"ED",X"36",X"00",X"C9",X"21",X"89",X"65",X"11",X"80",X"70",X"DD",X"21",X"89",X"68",X"06",X"0C", + X"C5",X"E5",X"DD",X"7E",X"00",X"87",X"28",X"26",X"D5",X"87",X"4F",X"06",X"00",X"ED",X"B0",X"DD", + X"36",X"00",X"00",X"FE",X"40",X"28",X"13",X"FE",X"20",X"30",X"0A",X"AF",X"12",X"D1",X"21",X"20", + X"00",X"19",X"77",X"18",X"0F",X"AF",X"12",X"D1",X"18",X"0A",X"C1",X"C1",X"18",X"0E",X"12",X"21", + X"20",X"00",X"19",X"77",X"E1",X"01",X"40",X"00",X"09",X"EB",X"09",X"EB",X"C1",X"DD",X"23",X"10", + X"BF",X"C9",X"DD",X"66",X"03",X"DD",X"6E",X"05",X"3A",X"00",X"60",X"1F",X"30",X"0C",X"78",X"EE", + X"30",X"47",X"7C",X"2F",X"3D",X"67",X"7D",X"2F",X"3D",X"6F",X"CB",X"70",X"20",X"09",X"7C",X"D6", + X"02",X"5F",X"7D",X"D6",X"0B",X"18",X"07",X"7C",X"D6",X"06",X"5F",X"7D",X"D6",X"07",X"FE",X"D8", + X"D0",X"D6",X"18",X"D8",X"6F",X"E6",X"0F",X"B0",X"47",X"DD",X"E5",X"D5",X"7D",X"E6",X"F0",X"6F", + X"26",X"00",X"29",X"29",X"EB",X"DD",X"21",X"89",X"65",X"DD",X"19",X"0F",X"0F",X"0F",X"0F",X"5F", + X"16",X"00",X"21",X"89",X"68",X"19",X"7E",X"FE",X"10",X"30",X"1B",X"87",X"87",X"5F",X"DD",X"19", + X"D1",X"DD",X"70",X"00",X"DD",X"71",X"01",X"DD",X"72",X"02",X"DD",X"73",X"03",X"34",X"DD",X"E1", + X"21",X"01",X"60",X"CB",X"FE",X"C9",X"D1",X"DD",X"E1",X"C9",X"DD",X"56",X"02",X"DD",X"5E",X"03", + X"2A",X"78",X"60",X"3A",X"7B",X"60",X"AC",X"E6",X"80",X"28",X"13",X"7A",X"AC",X"E6",X"80",X"20", + X"05",X"ED",X"52",X"30",X"12",X"C9",X"2A",X"7A",X"60",X"ED",X"52",X"38",X"0A",X"C9",X"ED",X"52", + X"D8",X"2A",X"7A",X"60",X"ED",X"52",X"D0",X"7B",X"CB",X"1A",X"1F",X"CB",X"1A",X"1F",X"CB",X"1A", + X"1F",X"CB",X"1A",X"1F",X"C6",X"70",X"67",X"DD",X"7E",X"05",X"D6",X"48",X"30",X"03",X"AF",X"18", + X"0B",X"E6",X"F8",X"1F",X"1F",X"1F",X"FE",X"0E",X"38",X"02",X"3E",X"0D",X"C6",X"28",X"6F",X"50", + X"06",X"80",X"0E",X"6E",X"CD",X"08",X"06",X"C9",X"21",X"61",X"D0",X"11",X"7F",X"60",X"FD",X"46", + X"00",X"0E",X"12",X"1A",X"CB",X"40",X"28",X"02",X"2F",X"3D",X"77",X"0D",X"C8",X"13",X"13",X"7D", + X"C6",X"20",X"FE",X"80",X"38",X"02",X"D6",X"7F",X"6F",X"18",X"E8",X"3A",X"00",X"60",X"17",X"D0", + X"16",X"00",X"21",X"06",X"6C",X"19",X"36",X"01",X"21",X"C2",X"60",X"19",X"34",X"C9",X"16",X"00", + X"21",X"C2",X"60",X"19",X"7E",X"A7",X"28",X"02",X"35",X"C0",X"21",X"06",X"6C",X"19",X"CB",X"D6", + X"C9",X"3A",X"00",X"60",X"17",X"D0",X"FD",X"E5",X"E1",X"23",X"23",X"23",X"06",X"03",X"AF",X"1A", + X"8E",X"27",X"77",X"1B",X"2B",X"10",X"F8",X"E5",X"CD",X"16",X"09",X"D1",X"3A",X"02",X"90",X"E6", + X"30",X"C8",X"3E",X"04",X"21",X"00",X"60",X"CB",X"5E",X"28",X"01",X"0F",X"4F",X"A6",X"C0",X"E5", + X"13",X"21",X"73",X"60",X"CD",X"6B",X"07",X"E1",X"D8",X"79",X"B6",X"77",X"FD",X"7E",X"00",X"FD", + X"34",X"00",X"CD",X"AF",X"09",X"1E",X"06",X"CD",X"FB",X"06",X"C9",X"06",X"03",X"1A",X"BE",X"C0", + X"13",X"23",X"10",X"F9",X"C9",X"2A",X"76",X"60",X"54",X"5D",X"29",X"19",X"7B",X"84",X"67",X"22", + X"76",X"60",X"C9",X"CD",X"D5",X"07",X"21",X"89",X"68",X"11",X"8A",X"68",X"01",X"0B",X"00",X"36", + X"00",X"ED",X"B0",X"F7",X"21",X"00",X"70",X"11",X"20",X"00",X"06",X"20",X"36",X"00",X"19",X"10", + X"FB",X"21",X"C3",X"07",X"CD",X"75",X"09",X"CD",X"1D",X"09",X"21",X"CF",X"07",X"CD",X"75",X"09", + X"CD",X"2D",X"09",X"3A",X"00",X"60",X"E6",X"10",X"C8",X"21",X"C9",X"07",X"CD",X"75",X"09",X"CD", + X"25",X"09",X"C9",X"23",X"D3",X"03",X"01",X"1C",X"1D",X"43",X"D3",X"03",X"02",X"17",X"0D",X"33", + X"D3",X"03",X"1D",X"18",X"19",X"87",X"4F",X"06",X"00",X"21",X"15",X"08",X"09",X"5E",X"23",X"56", + X"21",X"00",X"D4",X"1A",X"A7",X"28",X"0C",X"4F",X"13",X"1A",X"13",X"D5",X"57",X"CD",X"0D",X"08", + X"D1",X"18",X"F0",X"21",X"80",X"D0",X"01",X"80",X"03",X"16",X"24",X"CD",X"0D",X"08",X"21",X"00", + X"D0",X"0E",X"80",X"16",X"00",X"CD",X"0D",X"08",X"21",X"7C",X"60",X"0E",X"46",X"72",X"23",X"0B", + X"78",X"B1",X"20",X"F9",X"C9",X"25",X"08",X"40",X"08",X"69",X"08",X"88",X"08",X"C9",X"08",X"E2", + X"08",X"E2",X"08",X"ED",X"08",X"FF",X"03",X"FF",X"03",X"C2",X"03",X"0A",X"01",X"56",X"06",X"06", + X"00",X"0A",X"05",X"06",X"06",X"0A",X"01",X"06",X"00",X"0A",X"05",X"0B",X"00",X"A5",X"05",X"00", + X"A7",X"01",X"39",X"06",X"07",X"01",X"39",X"03",X"07",X"01",X"39",X"05",X"07",X"01",X"39",X"04", + X"07",X"01",X"F9",X"02",X"2A",X"01",X"56",X"06",X"06",X"00",X"0A",X"05",X"06",X"06",X"0A",X"01", + X"06",X"00",X"0A",X"05",X"0B",X"00",X"A5",X"05",X"00",X"FF",X"03",X"FF",X"03",X"22",X"03",X"40", + X"05",X"60",X"04",X"0A",X"01",X"56",X"06",X"06",X"00",X"0A",X"05",X"06",X"06",X"0A",X"01",X"06", + X"00",X"0A",X"05",X"0B",X"00",X"A5",X"05",X"00",X"A7",X"01",X"39",X"06",X"07",X"01",X"39",X"03", + X"07",X"01",X"39",X"05",X"07",X"01",X"39",X"04",X"07",X"01",X"39",X"02",X"20",X"06",X"20",X"01", + X"1C",X"00",X"04",X"03",X"20",X"01",X"1C",X"00",X"04",X"03",X"20",X"01",X"1C",X"00",X"04",X"03", + X"20",X"01",X"1C",X"05",X"04",X"04",X"20",X"01",X"06",X"00",X"0A",X"05",X"06",X"06",X"0A",X"01", + X"06",X"00",X"0A",X"05",X"0B",X"00",X"A5",X"05",X"00",X"FF",X"05",X"FF",X"05",X"FF",X"05",X"23", + X"05",X"06",X"00",X"0A",X"05",X"06",X"06",X"0A",X"01",X"06",X"00",X"0A",X"05",X"0B",X"00",X"A5", + X"05",X"00",X"FF",X"01",X"FF",X"01",X"FF",X"01",X"FF",X"01",X"04",X"01",X"00",X"87",X"05",X"10", + X"04",X"09",X"05",X"07",X"05",X"10",X"04",X"09",X"05",X"07",X"05",X"10",X"04",X"09",X"05",X"FF", + X"01",X"FF",X"01",X"42",X"01",X"06",X"00",X"0A",X"05",X"06",X"06",X"0A",X"01",X"06",X"00",X"0A", + X"05",X"0B",X"00",X"A5",X"05",X"00",X"3A",X"00",X"60",X"CB",X"5F",X"20",X"08",X"11",X"27",X"D3", + X"21",X"E8",X"60",X"18",X"0E",X"11",X"47",X"D3",X"21",X"17",X"62",X"18",X"06",X"11",X"37",X"D3", + X"21",X"25",X"60",X"AF",X"06",X"06",X"ED",X"6F",X"20",X"05",X"F5",X"3E",X"24",X"18",X"05",X"CB", + X"FF",X"F5",X"E6",X"0F",X"12",X"F1",X"13",X"CB",X"40",X"28",X"05",X"ED",X"6F",X"23",X"18",X"06", + X"CB",X"50",X"20",X"02",X"CB",X"FF",X"10",X"DE",X"C9",X"5E",X"23",X"56",X"23",X"46",X"23",X"4E", + X"23",X"C5",X"D5",X"7E",X"12",X"13",X"23",X"10",X"FA",X"D1",X"EB",X"01",X"20",X"00",X"09",X"EB", + X"C1",X"0D",X"20",X"ED",X"C9",X"5E",X"23",X"56",X"23",X"46",X"23",X"7E",X"12",X"13",X"23",X"10", + X"FA",X"C9",X"C5",X"E5",X"36",X"24",X"23",X"10",X"FB",X"E1",X"01",X"20",X"00",X"09",X"C1",X"0D", + X"20",X"F0",X"C9",X"21",X"A6",X"09",X"CD",X"75",X"09",X"11",X"5C",X"D3",X"21",X"04",X"60",X"AF", + X"06",X"02",X"CD",X"36",X"09",X"C9",X"55",X"D3",X"06",X"0C",X"1B",X"0E",X"0D",X"12",X"1D",X"21", + X"D0",X"09",X"06",X"05",X"FD",X"7E",X"00",X"5E",X"23",X"56",X"23",X"EB",X"A7",X"28",X"08",X"3D", + X"36",X"3B",X"23",X"36",X"3C",X"18",X"05",X"36",X"24",X"23",X"36",X"24",X"EB",X"10",X"E8",X"C9", + X"C1",X"D0",X"C3",X"D0",X"C5",X"D0",X"A1",X"D0",X"A3",X"D0",X"21",X"E1",X"09",X"CD",X"59",X"09", + X"C9",X"87",X"D0",X"10",X"03",X"45",X"46",X"46",X"46",X"46",X"46",X"46",X"4E",X"4E",X"46",X"46", + X"46",X"46",X"46",X"46",X"47",X"48",X"4D",X"4D",X"4D",X"4D",X"4D",X"4D",X"4F",X"4F",X"4D",X"4D", + X"4D",X"4D",X"4D",X"4D",X"49",X"4A",X"4B",X"4B",X"4B",X"4B",X"4B",X"4B",X"50",X"50",X"4B",X"4B", + X"4B",X"4B",X"4B",X"4B",X"4C",X"FD",X"7E",X"00",X"CB",X"7F",X"C8",X"2F",X"CB",X"67",X"C9",X"E6", + X"38",X"FE",X"10",X"28",X"04",X"38",X"02",X"E6",X"08",X"0F",X"0F",X"4F",X"06",X"00",X"21",X"33", + X"0A",X"09",X"C9",X"03",X"03",X"07",X"07",X"0B",X"0B",X"78",X"86",X"47",X"23",X"79",X"86",X"4F", + X"2B",X"DD",X"7E",X"02",X"FD",X"B6",X"02",X"C0",X"DD",X"7E",X"03",X"FD",X"96",X"03",X"30",X"02", + X"ED",X"44",X"B8",X"D0",X"DD",X"7E",X"05",X"FD",X"96",X"05",X"30",X"02",X"ED",X"44",X"B9",X"C9", + X"DD",X"7E",X"05",X"E6",X"F8",X"5F",X"CD",X"F6",X"0A",X"DD",X"86",X"03",X"E6",X"F8",X"57",X"D5", + X"CD",X"03",X"0B",X"E5",X"CD",X"15",X"0B",X"E1",X"D1",X"C0",X"DD",X"7E",X"03",X"80",X"FE",X"F8", + X"30",X"1A",X"D9",X"86",X"D9",X"E6",X"F8",X"BA",X"28",X"12",X"D5",X"E5",X"7D",X"E6",X"E0",X"57", + X"7D",X"3C",X"E6",X"1F",X"B2",X"6F",X"CD",X"15",X"0B",X"E1",X"D1",X"C0",X"DD",X"7E",X"03",X"90", + X"FE",X"08",X"38",X"18",X"D9",X"86",X"D9",X"E6",X"F8",X"BA",X"28",X"10",X"D5",X"7D",X"E6",X"E0", + X"57",X"7D",X"3D",X"E6",X"1F",X"B2",X"6F",X"CD",X"15",X"0B",X"D1",X"C0",X"DD",X"56",X"03",X"DD", + X"7E",X"05",X"81",X"E6",X"F8",X"BB",X"28",X"15",X"D5",X"5F",X"D9",X"23",X"23",X"7E",X"2B",X"2B", + X"D9",X"82",X"E6",X"F8",X"57",X"CD",X"03",X"0B",X"CD",X"15",X"0B",X"D1",X"C0",X"DD",X"7E",X"05", + X"91",X"E6",X"F8",X"BB",X"C8",X"5F",X"D9",X"2B",X"2B",X"7E",X"D9",X"82",X"E6",X"F8",X"57",X"CD", + X"03",X"0B",X"CD",X"15",X"0B",X"C9",X"0F",X"0F",X"D9",X"5F",X"16",X"00",X"21",X"71",X"60",X"19", + X"7E",X"D9",X"C9",X"6B",X"26",X"00",X"29",X"29",X"7A",X"0F",X"0F",X"0F",X"5F",X"16",X"00",X"19", + X"11",X"00",X"D0",X"19",X"C9",X"7E",X"11",X"00",X"04",X"19",X"CB",X"5E",X"21",X"3B",X"0B",X"28", + X"03",X"21",X"5B",X"0B",X"5F",X"CB",X"3B",X"CB",X"3B",X"CB",X"3B",X"16",X"00",X"19",X"E6",X"07", + X"57",X"3E",X"80",X"28",X"04",X"0F",X"15",X"20",X"FC",X"A6",X"C9",X"FF",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2F",X"FF",X"E5",X"DB",X"FE",X"DF",X"FD",X"BE",X"BF", + X"6E",X"CF",X"FF",X"F7",X"83",X"7F",X"F7",X"DF",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"66",X"03",X"DD",X"6E", + X"04",X"ED",X"5B",X"7C",X"60",X"A7",X"ED",X"52",X"DD",X"74",X"03",X"DD",X"75",X"04",X"D0",X"DD", + X"35",X"02",X"C9",X"E6",X"0C",X"0F",X"5F",X"16",X"00",X"19",X"06",X"C0",X"4E",X"23",X"56",X"CD", + X"02",X"06",X"C9",X"E0",X"0D",X"E4",X"0C",X"E8",X"05",X"E6",X"38",X"FE",X"10",X"28",X"18",X"38", + X"02",X"E6",X"08",X"06",X"80",X"0E",X"70",X"16",X"01",X"CB",X"5F",X"28",X"06",X"06",X"C0",X"0E", + X"34",X"16",X"01",X"CD",X"02",X"06",X"C9",X"21",X"E3",X"0B",X"06",X"04",X"C5",X"56",X"23",X"5E", + X"23",X"4E",X"23",X"E5",X"CD",X"EF",X"0B",X"06",X"C0",X"16",X"01",X"CD",X"08",X"06",X"E1",X"C1", + X"10",X"EA",X"C9",X"F8",X"08",X"40",X"F8",X"F8",X"38",X"08",X"F8",X"3C",X"08",X"08",X"44",X"DD", + X"7E",X"03",X"82",X"67",X"DD",X"7E",X"05",X"83",X"6F",X"C9",X"AF",X"32",X"45",X"63",X"32",X"46", + X"63",X"32",X"54",X"63",X"32",X"55",X"63",X"32",X"60",X"63",X"32",X"68",X"63",X"32",X"79",X"63", + X"32",X"8A",X"63",X"21",X"94",X"63",X"11",X"05",X"00",X"06",X"12",X"CD",X"56",X"0C",X"32",X"EE", + X"63",X"32",X"F9",X"63",X"21",X"FC",X"63",X"11",X"0B",X"00",X"06",X"0C",X"CD",X"56",X"0C",X"21", + X"80",X"64",X"11",X"0A",X"00",X"06",X"08",X"CD",X"56",X"0C",X"32",X"D0",X"64",X"21",X"DC",X"64", + X"11",X"08",X"00",X"06",X"08",X"CD",X"56",X"0C",X"32",X"84",X"65",X"32",X"86",X"65",X"21",X"1C", + X"65",X"11",X"0D",X"00",X"06",X"08",X"77",X"19",X"10",X"FC",X"C9",X"3A",X"02",X"90",X"E6",X"C0", + X"07",X"07",X"4F",X"06",X"00",X"21",X"6E",X"0C",X"09",X"7E",X"FD",X"77",X"00",X"C9",X"02",X"05", + X"04",X"03",X"FD",X"E5",X"D1",X"13",X"62",X"6B",X"13",X"36",X"00",X"01",X"2D",X"01",X"ED",X"B0", + X"FD",X"36",X"04",X"01",X"FD",X"36",X"05",X"FF",X"FD",X"36",X"08",X"01",X"FD",X"36",X"10",X"12", + X"FD",X"36",X"13",X"01",X"FD",X"36",X"16",X"04",X"FD",X"36",X"1A",X"12",X"FD",X"36",X"1D",X"01", + X"FD",X"36",X"20",X"01",X"01",X"11",X"1B",X"FD",X"70",X"25",X"FD",X"71",X"26",X"FD",X"36",X"27", + X"01",X"FD",X"36",X"2A",X"0A",X"FD",X"70",X"2F",X"FD",X"71",X"30",X"FD",X"36",X"31",X"01",X"FD", + X"36",X"34",X"07",X"C9",X"3A",X"1E",X"6C",X"A7",X"C0",X"DD",X"CB",X"00",X"6E",X"20",X"24",X"DD", + X"CB",X"00",X"EE",X"AF",X"32",X"00",X"A0",X"CD",X"83",X"07",X"21",X"01",X"60",X"CB",X"F6",X"CD", + X"93",X"09",X"21",X"44",X"0D",X"CD",X"75",X"09",X"21",X"52",X"0D",X"CD",X"75",X"09",X"DD",X"36", + X"01",X"FF",X"C9",X"DD",X"CB",X"00",X"4E",X"20",X"1A",X"3E",X"01",X"CD",X"83",X"07",X"CD",X"93", + X"09",X"CD",X"21",X"12",X"21",X"52",X"0D",X"CD",X"75",X"09",X"DD",X"36",X"01",X"FF",X"DD",X"CB", + X"00",X"CE",X"C9",X"3E",X"07",X"CD",X"83",X"07",X"CD",X"93",X"09",X"FD",X"36",X"00",X"01",X"21", + X"EB",X"60",X"36",X"00",X"11",X"EC",X"60",X"01",X"2A",X"01",X"ED",X"B0",X"CD",X"80",X"0C",X"CD", + X"AF",X"09",X"CD",X"DA",X"09",X"21",X"8A",X"63",X"CB",X"FE",X"21",X"54",X"63",X"CB",X"FE",X"DD", + X"36",X"00",X"00",X"C9",X"EA",X"D1",X"0B",X"12",X"17",X"1C",X"0E",X"1B",X"1D",X"24",X"0C",X"18", + X"12",X"17",X"C8",X"D2",X"10",X"3A",X"24",X"1E",X"17",X"12",X"1F",X"0E",X"1B",X"1C",X"0A",X"15", + X"24",X"01",X"09",X"08",X"01",X"DD",X"7E",X"00",X"E6",X"03",X"C2",X"52",X"0E",X"3A",X"1E",X"6C", + X"A7",X"20",X"65",X"DD",X"CB",X"00",X"6E",X"20",X"47",X"DD",X"CB",X"00",X"EE",X"CD",X"FA",X"0B", + X"32",X"49",X"63",X"32",X"00",X"A0",X"3A",X"00",X"60",X"E6",X"16",X"32",X"00",X"60",X"3E",X"02", + X"CD",X"83",X"07",X"21",X"01",X"60",X"CB",X"F6",X"21",X"6C",X"0E",X"CD",X"75",X"09",X"21",X"73", + X"0E",X"CD",X"75",X"09",X"21",X"94",X"0E",X"CD",X"75",X"09",X"21",X"52",X"0D",X"CD",X"75",X"09", + X"CD",X"93",X"09",X"21",X"B3",X"0E",X"CD",X"75",X"09",X"13",X"3A",X"DC",X"60",X"C6",X"01",X"12", + X"DD",X"CB",X"00",X"66",X"C4",X"93",X"09",X"DD",X"CB",X"00",X"A6",X"3A",X"04",X"60",X"FE",X"02", + X"38",X"06",X"21",X"83",X"0E",X"CD",X"75",X"09",X"3A",X"04",X"60",X"FE",X"02",X"38",X"07",X"3A", + X"00",X"90",X"E6",X"40",X"28",X"08",X"3A",X"00",X"90",X"E6",X"20",X"28",X"33",X"C9",X"DD",X"CB", + X"00",X"CE",X"3E",X"90",X"32",X"00",X"60",X"21",X"04",X"60",X"7E",X"D6",X"02",X"27",X"77",X"FD", + X"21",X"E7",X"60",X"CD",X"5B",X"0C",X"CD",X"72",X"0C",X"FD",X"21",X"16",X"62",X"CD",X"5B",X"0C", + X"CD",X"72",X"0C",X"3E",X"04",X"CD",X"83",X"07",X"21",X"9D",X"0E",X"CD",X"75",X"09",X"18",X"20", + X"DD",X"CB",X"00",X"C6",X"3E",X"80",X"32",X"00",X"60",X"21",X"04",X"60",X"7E",X"D6",X"01",X"27", + X"77",X"FD",X"21",X"E7",X"60",X"CD",X"5B",X"0C",X"CD",X"72",X"0C",X"3E",X"04",X"CD",X"83",X"07", + X"AF",X"32",X"00",X"A0",X"32",X"DA",X"60",X"1E",X"18",X"CD",X"0E",X"07",X"1E",X"17",X"CD",X"FB", + X"06",X"C9",X"3E",X"07",X"CD",X"83",X"07",X"CD",X"AF",X"09",X"CD",X"DA",X"09",X"21",X"8A",X"63", + X"CB",X"FE",X"21",X"54",X"63",X"CB",X"FE",X"DD",X"36",X"00",X"00",X"C9",X"EE",X"D1",X"04",X"19", + X"1E",X"1C",X"11",X"29",X"D2",X"0D",X"18",X"17",X"15",X"22",X"24",X"01",X"24",X"19",X"15",X"0A", + X"22",X"0E",X"1B",X"29",X"D2",X"0E",X"01",X"24",X"18",X"1B",X"24",X"02",X"24",X"19",X"15",X"0A", + X"22",X"0E",X"1B",X"1C",X"6D",X"D2",X"06",X"0B",X"1E",X"1D",X"1D",X"18",X"17",X"EC",X"D1",X"08", + X"19",X"15",X"0A",X"22",X"0E",X"1B",X"24",X"01",X"EC",X"D1",X"08",X"19",X"15",X"0A",X"22",X"0E", + X"1B",X"24",X"02",X"14",X"D3",X"08",X"0F",X"0A",X"0C",X"12",X"15",X"12",X"1D",X"22",X"DD",X"CB", + X"00",X"56",X"C2",X"D3",X"0F",X"DD",X"CB",X"00",X"4E",X"C2",X"B9",X"0F",X"DD",X"CB",X"00",X"46", + X"20",X"32",X"DD",X"CB",X"00",X"C6",X"01",X"10",X"0E",X"DD",X"70",X"02",X"DD",X"71",X"03",X"AF", + X"DD",X"77",X"04",X"DD",X"77",X"05",X"DD",X"77",X"06",X"DD",X"77",X"07",X"DD",X"77",X"08",X"DD", + X"36",X"0A",X"0A",X"3A",X"02",X"90",X"E6",X"04",X"20",X"04",X"DD",X"36",X"0A",X"03",X"21",X"00", + X"60",X"CB",X"B6",X"C9",X"3A",X"60",X"63",X"17",X"D8",X"3A",X"68",X"63",X"17",X"D8",X"3A",X"79", + X"63",X"17",X"D8",X"21",X"80",X"64",X"11",X"0A",X"00",X"06",X"08",X"CB",X"7E",X"C0",X"19",X"10", + X"FA",X"21",X"DC",X"64",X"11",X"08",X"00",X"06",X"08",X"7E",X"2F",X"E6",X"88",X"C8",X"19",X"10", + X"F8",X"21",X"1C",X"65",X"11",X"0D",X"00",X"06",X"08",X"CB",X"7E",X"C0",X"19",X"10",X"FA",X"CD", + X"FA",X"0B",X"AF",X"32",X"CE",X"60",X"32",X"D0",X"60",X"32",X"D7",X"60",X"1E",X"0C",X"CD",X"0E", + X"07",X"1E",X"0E",X"CD",X"0E",X"07",X"1E",X"15",X"CD",X"0E",X"07",X"21",X"00",X"60",X"CB",X"7E", + X"28",X"4D",X"FD",X"7E",X"00",X"A7",X"28",X"0E",X"CB",X"66",X"28",X"1E",X"CD",X"ED",X"0F",X"1A", + X"A7",X"C4",X"F7",X"0F",X"18",X"14",X"CD",X"09",X"10",X"21",X"00",X"60",X"CB",X"66",X"28",X"2F", + X"CD",X"ED",X"0F",X"1A",X"A7",X"28",X"28",X"CD",X"F7",X"0F",X"3A",X"00",X"60",X"CB",X"67",X"28", + X"15",X"3E",X"04",X"CD",X"83",X"07",X"21",X"9D",X"0E",X"3A",X"00",X"60",X"CB",X"5F",X"28",X"03", + X"21",X"A8",X"0E",X"CD",X"75",X"09",X"DD",X"CB",X"00",X"CE",X"DD",X"36",X"01",X"3C",X"C9",X"DD", + X"CB",X"00",X"D6",X"1E",X"18",X"CD",X"FB",X"06",X"C9",X"3E",X"07",X"CD",X"83",X"07",X"CD",X"AF", + X"09",X"CD",X"DA",X"09",X"21",X"8A",X"63",X"CB",X"FE",X"21",X"54",X"63",X"CB",X"FE",X"DD",X"36", + X"00",X"00",X"C9",X"21",X"45",X"63",X"3A",X"04",X"60",X"A7",X"28",X"03",X"21",X"47",X"63",X"CB", + X"FE",X"21",X"00",X"60",X"7E",X"E6",X"16",X"77",X"DD",X"36",X"00",X"00",X"C9",X"11",X"16",X"62", + X"CB",X"5E",X"C8",X"11",X"E7",X"60",X"C9",X"7E",X"EE",X"08",X"77",X"3A",X"02",X"90",X"E6",X"08", + X"C8",X"7E",X"EE",X"01",X"77",X"32",X"00",X"A0",X"C9",X"21",X"25",X"60",X"FD",X"E5",X"D1",X"13", + X"06",X"05",X"C5",X"D5",X"E5",X"CD",X"6B",X"07",X"30",X"0A",X"E1",X"11",X"0D",X"00",X"19",X"D1", + X"C1",X"10",X"EF",X"C9",X"E1",X"D1",X"C1",X"3E",X"05",X"90",X"DD",X"77",X"09",X"EB",X"11",X"66", + X"60",X"01",X"03",X"00",X"ED",X"B0",X"EB",X"36",X"24",X"54",X"5D",X"13",X"01",X"09",X"00",X"ED", + X"B0",X"3E",X"03",X"CD",X"83",X"07",X"CD",X"21",X"12",X"21",X"16",X"12",X"CD",X"75",X"09",X"21", + X"F7",X"D1",X"DD",X"7E",X"0A",X"FE",X"0A",X"28",X"03",X"21",X"F0",X"D1",X"36",X"25",X"21",X"22", + X"D2",X"11",X"26",X"00",X"AF",X"0E",X"04",X"06",X"0D",X"77",X"3C",X"23",X"23",X"10",X"FA",X"19", + X"0D",X"20",X"F4",X"21",X"3C",X"D2",X"11",X"3F",X"00",X"06",X"03",X"36",X"34",X"23",X"36",X"35", + X"19",X"10",X"F8",X"36",X"36",X"23",X"36",X"37",X"3E",X"38",X"32",X"42",X"D2",X"1E",X"13",X"CD", + X"FB",X"06",X"F7",X"DD",X"E5",X"CD",X"8B",X"50",X"DD",X"E1",X"DD",X"46",X"02",X"DD",X"4E",X"03", + X"0B",X"DD",X"70",X"02",X"DD",X"71",X"03",X"78",X"B1",X"CA",X"8B",X"11",X"DD",X"7E",X"04",X"DD", + X"BE",X"0A",X"30",X"19",X"DD",X"34",X"05",X"DD",X"7E",X"05",X"E6",X"07",X"20",X"0F",X"CD",X"E3", + X"11",X"DD",X"CB",X"05",X"5E",X"28",X"04",X"36",X"39",X"18",X"02",X"36",X"24",X"DD",X"7E",X"06", + X"A7",X"28",X"05",X"DD",X"35",X"06",X"18",X"67",X"CD",X"0A",X"12",X"CB",X"66",X"20",X"60",X"DD", + X"36",X"06",X"20",X"DD",X"7E",X"07",X"FE",X"37",X"20",X"03",X"C3",X"8B",X"11",X"21",X"1D",X"12", + X"06",X"03",X"BE",X"28",X"07",X"30",X"29",X"23",X"10",X"F8",X"18",X"24",X"DD",X"7E",X"04",X"A7", + X"28",X"3D",X"DD",X"BE",X"0A",X"30",X"05",X"CD",X"E3",X"11",X"36",X"24",X"DD",X"35",X"04",X"CD", + X"ED",X"11",X"36",X"24",X"CD",X"DE",X"11",X"36",X"24",X"1E",X"0D",X"CD",X"FB",X"06",X"18",X"1F", + X"90",X"47",X"DD",X"7E",X"04",X"DD",X"BE",X"0A",X"30",X"15",X"CD",X"ED",X"11",X"70",X"CD",X"DE", + X"11",X"70",X"CD",X"E3",X"11",X"36",X"24",X"DD",X"34",X"04",X"1E",X"04",X"CD",X"FB",X"06",X"DD", + X"7E",X"08",X"A7",X"28",X"06",X"DD",X"35",X"08",X"C3",X"92",X"10",X"CD",X"0A",X"12",X"7E",X"2F", + X"E6",X"05",X"CA",X"92",X"10",X"DD",X"36",X"08",X"06",X"CB",X"57",X"20",X"11",X"DD",X"7E",X"07", + X"A7",X"CA",X"92",X"10",X"CD",X"F2",X"11",X"36",X"24",X"DD",X"35",X"07",X"18",X"10",X"DD",X"7E", + X"07",X"FE",X"37",X"CA",X"92",X"10",X"CD",X"F2",X"11",X"36",X"24",X"DD",X"34",X"07",X"CD",X"F2", + X"11",X"36",X"38",X"1E",X"0F",X"CD",X"FB",X"06",X"C3",X"92",X"10",X"DD",X"7E",X"09",X"FE",X"04", + X"28",X"11",X"2F",X"C6",X"05",X"21",X"58",X"60",X"11",X"65",X"60",X"01",X"0D",X"00",X"ED",X"B8", + X"3D",X"20",X"F8",X"DD",X"7E",X"09",X"4F",X"87",X"87",X"47",X"87",X"80",X"81",X"5F",X"16",X"00", + X"21",X"25",X"60",X"19",X"EB",X"21",X"66",X"60",X"01",X"0D",X"00",X"ED",X"B0",X"3E",X"01",X"CD", + X"83",X"07",X"CD",X"21",X"12",X"1E",X"13",X"CD",X"0E",X"07",X"1E",X"19",X"CD",X"FB",X"06",X"06", + X"FF",X"F7",X"DD",X"E5",X"C5",X"CD",X"8B",X"50",X"C1",X"DD",X"E1",X"10",X"F4",X"C9",X"21",X"ED", + X"D1",X"18",X"03",X"21",X"0D",X"D2",X"DD",X"5E",X"04",X"16",X"00",X"19",X"C9",X"21",X"69",X"60", + X"18",X"F4",X"21",X"42",X"D2",X"11",X"40",X"00",X"DD",X"7E",X"07",X"06",X"03",X"FE",X"0E",X"38", + X"05",X"D6",X"0E",X"19",X"10",X"F7",X"87",X"5F",X"19",X"C9",X"21",X"00",X"90",X"3A",X"00",X"60", + X"1F",X"D0",X"21",X"01",X"90",X"C9",X"E8",X"D1",X"04",X"17",X"0A",X"16",X"0E",X"29",X"1B",X"0D", + X"C9",X"21",X"4A",X"12",X"0E",X"05",X"CD",X"75",X"09",X"0D",X"20",X"FA",X"21",X"25",X"60",X"11", + X"AA",X"D0",X"06",X"05",X"C5",X"D5",X"CD",X"33",X"09",X"13",X"06",X"0A",X"CD",X"7B",X"09",X"D1", + X"EB",X"01",X"40",X"00",X"09",X"EB",X"C1",X"10",X"EB",X"C9",X"A5",X"D0",X"04",X"17",X"18",X"01", + X"28",X"E5",X"D0",X"03",X"17",X"18",X"02",X"25",X"D1",X"03",X"17",X"18",X"03",X"65",X"D1",X"03", + X"17",X"18",X"04",X"A5",X"D1",X"03",X"17",X"18",X"05",X"21",X"00",X"60",X"CB",X"76",X"C2",X"3B", + X"13",X"21",X"54",X"63",X"CB",X"7E",X"20",X"29",X"FD",X"7E",X"0C",X"E6",X"F8",X"FD",X"77",X"0C", + X"FD",X"36",X"0D",X"00",X"11",X"17",X"00",X"CD",X"25",X"13",X"11",X"21",X"00",X"CD",X"25",X"13", + X"11",X"2B",X"00",X"CD",X"25",X"13",X"11",X"35",X"00",X"CD",X"25",X"13",X"DD",X"36",X"00",X"00", + X"C9",X"DD",X"CB",X"00",X"6E",X"20",X"4C",X"DD",X"CB",X"00",X"EE",X"DD",X"36",X"02",X"00",X"DD", + X"36",X"03",X"00",X"DD",X"36",X"09",X"00",X"21",X"00",X"04",X"22",X"7C",X"60",X"21",X"7E",X"60", + X"36",X"00",X"11",X"7F",X"60",X"01",X"23",X"00",X"ED",X"B0",X"DD",X"E5",X"DD",X"21",X"94",X"63", + X"11",X"05",X"00",X"06",X"12",X"DD",X"36",X"00",X"00",X"DD",X"36",X"03",X"00",X"DD",X"19",X"10", + X"F4",X"DD",X"E1",X"21",X"EE",X"63",X"CB",X"FE",X"21",X"F9",X"63",X"CB",X"FE",X"21",X"84",X"65", + X"CB",X"FE",X"C9",X"3A",X"A1",X"60",X"DD",X"96",X"09",X"FE",X"08",X"38",X"12",X"CD",X"0B",X"14", + X"CD",X"A9",X"18",X"3A",X"A1",X"60",X"DD",X"77",X"09",X"CD",X"81",X"19",X"CD",X"81",X"19",X"21", + X"7F",X"60",X"06",X"12",X"7E",X"C6",X"04",X"77",X"23",X"23",X"10",X"F8",X"CD",X"C3",X"1A",X"21", + X"01",X"60",X"CB",X"EE",X"C9",X"FD",X"E5",X"E1",X"19",X"7E",X"E6",X"F8",X"BE",X"28",X"08",X"C6", + X"08",X"77",X"30",X"03",X"2B",X"34",X"23",X"23",X"36",X"00",X"C9",X"DD",X"CB",X"00",X"4E",X"20", + X"1F",X"3A",X"A1",X"60",X"DD",X"96",X"09",X"FE",X"08",X"38",X"15",X"CD",X"0B",X"14",X"DD",X"CB", + X"00",X"56",X"C4",X"30",X"18",X"CD",X"A9",X"18",X"3A",X"A1",X"60",X"E6",X"F8",X"DD",X"77",X"09", + X"CD",X"81",X"19",X"0E",X"00",X"DD",X"7E",X"00",X"E6",X"18",X"20",X"1C",X"FD",X"7E",X"38",X"E6", + X"60",X"20",X"15",X"21",X"A2",X"60",X"06",X"20",X"3E",X"1F",X"BE",X"38",X"05",X"7E",X"FE",X"07", + X"28",X"03",X"23",X"10",X"F5",X"D6",X"07",X"4F",X"DD",X"E5",X"DD",X"21",X"7E",X"60",X"3E",X"00", + X"B9",X"30",X"28",X"47",X"3E",X"12",X"90",X"87",X"87",X"87",X"5F",X"16",X"00",X"2A",X"7C",X"60", + X"ED",X"52",X"DD",X"56",X"01",X"DD",X"5E",X"00",X"19",X"DD",X"74",X"01",X"DD",X"75",X"00",X"78", + X"DD",X"23",X"DD",X"23",X"3C",X"FE",X"12",X"38",X"D7",X"18",X"1A",X"ED",X"5B",X"7C",X"60",X"DD", + X"66",X"01",X"DD",X"6E",X"00",X"19",X"DD",X"74",X"01",X"DD",X"75",X"00",X"DD",X"23",X"DD",X"23", + X"3C",X"FE",X"12",X"38",X"EA",X"DD",X"E1",X"CD",X"C3",X"1A",X"21",X"01",X"60",X"CB",X"EE",X"2A", + X"7C",X"60",X"FD",X"56",X"0C",X"FD",X"5E",X"0D",X"19",X"FD",X"74",X"0C",X"FD",X"75",X"0D",X"D0", + X"FD",X"66",X"0A",X"FD",X"6E",X"0B",X"23",X"FD",X"74",X"0A",X"FD",X"75",X"0B",X"FD",X"7E",X"0E", + X"C6",X"01",X"27",X"FD",X"77",X"0E",X"FD",X"36",X"0F",X"01",X"C9",X"FD",X"CB",X"04",X"46",X"28", + X"71",X"FD",X"CB",X"04",X"86",X"FD",X"35",X"08",X"20",X"3C",X"FD",X"34",X"05",X"FD",X"7E",X"05", + X"FE",X"12",X"38",X"04",X"AF",X"FD",X"77",X"05",X"5F",X"16",X"00",X"21",X"F2",X"1A",X"19",X"7E", + X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"ED",X"44",X"FD",X"77",X"09",X"7E",X"E6",X"0F",X"87",X"6F", + X"26",X"00",X"11",X"04",X"1B",X"19",X"5E",X"23",X"56",X"1A",X"FD",X"77",X"08",X"13",X"FD",X"72", + X"06",X"FD",X"73",X"07",X"18",X"03",X"CD",X"50",X"16",X"FD",X"E5",X"E1",X"01",X"38",X"00",X"09", + X"CD",X"60",X"16",X"FD",X"7E",X"38",X"FE",X"A5",X"20",X"05",X"3E",X"84",X"32",X"86",X"65",X"FD", + X"CB",X"38",X"7E",X"28",X"0D",X"CD",X"50",X"16",X"FD",X"E5",X"E1",X"01",X"4B",X"00",X"09",X"CD", + X"60",X"16",X"DD",X"E5",X"FD",X"E5",X"DD",X"E1",X"11",X"38",X"00",X"DD",X"19",X"01",X"12",X"07", + X"DD",X"CB",X"00",X"7E",X"28",X"03",X"01",X"0A",X"0F",X"DD",X"70",X"0C",X"DD",X"71",X"0D",X"DD", + X"7E",X"00",X"E6",X"60",X"0F",X"0F",X"0F",X"F6",X"10",X"47",X"DD",X"7E",X"05",X"E6",X"E1",X"B0", + X"47",X"CB",X"50",X"28",X"24",X"CB",X"58",X"20",X"0D",X"DD",X"7E",X"0A",X"A7",X"20",X"16",X"FD", + X"B6",X"55",X"20",X"15",X"18",X"0B",X"FD",X"7E",X"55",X"A7",X"20",X"09",X"DD",X"B6",X"0A",X"20", + X"08",X"3E",X"0C",X"18",X"02",X"3E",X"04",X"A8",X"47",X"DD",X"70",X"05",X"DD",X"66",X"03",X"DD", + X"6E",X"04",X"CB",X"7E",X"28",X"53",X"7E",X"E6",X"E0",X"47",X"E6",X"60",X"20",X"0B",X"DD",X"7E", + X"06",X"FE",X"77",X"28",X"04",X"78",X"F6",X"60",X"47",X"FD",X"70",X"5E",X"7E",X"E6",X"1F",X"FD", + X"86",X"09",X"FD",X"77",X"5F",X"23",X"7E",X"FD",X"86",X"09",X"FD",X"77",X"60",X"23",X"E5",X"FD", + X"7E",X"5E",X"E6",X"60",X"0F",X"0F",X"0F",X"0F",X"5F",X"16",X"00",X"21",X"9D",X"25",X"19",X"5E", + X"23",X"56",X"1A",X"FD",X"77",X"63",X"13",X"1A",X"FD",X"77",X"64",X"13",X"FD",X"72",X"61",X"FD", + X"73",X"62",X"E1",X"DD",X"74",X"03",X"DD",X"75",X"04",X"7E",X"47",X"E6",X"1F",X"FD",X"86",X"09", + X"4F",X"78",X"E6",X"E0",X"B1",X"DD",X"77",X"0B",X"23",X"7E",X"DD",X"77",X"0E",X"FD",X"CB",X"5E", + X"7E",X"28",X"03",X"FD",X"4E",X"5F",X"3A",X"A1",X"60",X"E6",X"F8",X"0F",X"0F",X"0F",X"5F",X"16", + X"00",X"21",X"A2",X"60",X"19",X"71",X"FD",X"CB",X"5E",X"7E",X"C4",X"C0",X"17",X"CD",X"C4",X"16", + X"DD",X"66",X"10",X"DD",X"6E",X"07",X"2B",X"DD",X"74",X"10",X"DD",X"75",X"07",X"DD",X"66",X"12", + X"DD",X"6E",X"09",X"2B",X"DD",X"74",X"12",X"DD",X"75",X"09",X"DD",X"7E",X"0A",X"A7",X"28",X"03", + X"DD",X"35",X"0A",X"DD",X"7E",X"07",X"DD",X"B6",X"10",X"20",X"06",X"FD",X"CB",X"04",X"C6",X"18", + X"20",X"DD",X"7E",X"09",X"DD",X"B6",X"12",X"20",X"18",X"DD",X"7E",X"01",X"DD",X"77",X"03",X"DD", + X"7E",X"02",X"DD",X"77",X"04",X"DD",X"7E",X"08",X"DD",X"77",X"09",X"DD",X"7E",X"11",X"DD",X"77", + X"12",X"DD",X"E1",X"FD",X"CB",X"38",X"7E",X"C8",X"DD",X"E5",X"FD",X"E5",X"DD",X"E1",X"11",X"4B", + X"00",X"DD",X"19",X"DD",X"36",X"0C",X"07",X"DD",X"36",X"0D",X"0B",X"DD",X"7E",X"00",X"E6",X"60", + X"0F",X"0F",X"0F",X"47",X"DD",X"7E",X"05",X"E6",X"E1",X"B0",X"47",X"DD",X"66",X"03",X"DD",X"6E", + X"04",X"7E",X"E6",X"1F",X"20",X"0A",X"CB",X"E0",X"23",X"DD",X"74",X"03",X"DD",X"75",X"04",X"2B", + X"CB",X"50",X"28",X"24",X"CB",X"58",X"20",X"0D",X"FD",X"7E",X"42",X"A7",X"20",X"16",X"DD",X"B6", + X"0A",X"20",X"15",X"18",X"0B",X"DD",X"7E",X"0A",X"A7",X"20",X"09",X"FD",X"B6",X"42",X"20",X"08", + X"3E",X"0C",X"18",X"02",X"3E",X"04",X"A8",X"47",X"DD",X"70",X"05",X"7E",X"DD",X"77",X"0B",X"23", + X"7E",X"DD",X"77",X"0E",X"CD",X"C4",X"16",X"DD",X"7E",X"0A",X"A7",X"28",X"03",X"DD",X"35",X"0A", + X"DD",X"E1",X"DD",X"CB",X"00",X"E6",X"2A",X"A0",X"60",X"DD",X"74",X"04",X"DD",X"75",X"05",X"C9", + X"FD",X"56",X"06",X"FD",X"5E",X"07",X"13",X"13",X"13",X"FD",X"72",X"06",X"FD",X"73",X"07",X"C9", + X"1A",X"77",X"DD",X"E5",X"E5",X"DD",X"E1",X"13",X"1A",X"DD",X"77",X"05",X"13",X"1A",X"DD",X"77", + X"06",X"DD",X"7E",X"00",X"E6",X"1F",X"87",X"4F",X"06",X"00",X"21",X"82",X"1B",X"09",X"5E",X"23", + X"56",X"1A",X"DD",X"77",X"10",X"13",X"1A",X"DD",X"77",X"07",X"13",X"1A",X"DD",X"77",X"11",X"DD", + X"77",X"12",X"13",X"1A",X"DD",X"77",X"08",X"DD",X"77",X"09",X"13",X"DD",X"CB",X"00",X"6E",X"28", + X"14",X"DD",X"CB",X"00",X"76",X"20",X"08",X"1A",X"DD",X"77",X"0A",X"13",X"13",X"18",X"06",X"13", + X"1A",X"DD",X"77",X"0A",X"13",X"DD",X"72",X"01",X"DD",X"73",X"02",X"DD",X"72",X"03",X"DD",X"73", + X"04",X"DD",X"E1",X"C9",X"DD",X"7E",X"0B",X"E6",X"1F",X"DD",X"BE",X"0C",X"20",X"59",X"CD",X"AF", + X"17",X"DD",X"7E",X"0B",X"E6",X"1F",X"F6",X"80",X"77",X"DD",X"7E",X"05",X"23",X"07",X"07",X"07", + X"47",X"CD",X"86",X"17",X"70",X"23",X"DD",X"7E",X"0E",X"DD",X"86",X"06",X"77",X"DD",X"56",X"03", + X"DD",X"5E",X"04",X"13",X"13",X"DD",X"72",X"03",X"DD",X"73",X"04",X"DD",X"CB",X"0B",X"6E",X"20", + X"06",X"DD",X"CB",X"05",X"A6",X"18",X"04",X"DD",X"CB",X"05",X"E6",X"DD",X"CB",X"0B",X"76",X"28", + X"6B",X"1A",X"47",X"E6",X"1F",X"FD",X"86",X"09",X"4F",X"78",X"E6",X"E0",X"B1",X"DD",X"77",X"0B", + X"13",X"1A",X"DD",X"77",X"0E",X"18",X"55",X"DD",X"CB",X"05",X"66",X"20",X"1E",X"CD",X"AF",X"17", + X"DD",X"7E",X"0C",X"E6",X"1F",X"F6",X"80",X"77",X"23",X"DD",X"7E",X"05",X"07",X"07",X"07",X"47", + X"CD",X"86",X"17",X"70",X"23",X"DD",X"7E",X"06",X"77",X"18",X"31",X"CD",X"AF",X"17",X"CB",X"7E", + X"20",X"2A",X"DD",X"7E",X"05",X"E6",X"0C",X"28",X"0B",X"FE",X"08",X"28",X"11",X"DD",X"7E",X"0C", + X"FE",X"10",X"30",X"0A",X"DD",X"7E",X"0C",X"E6",X"1F",X"F6",X"A0",X"77",X"18",X"0E",X"DD",X"7E", + X"0C",X"E6",X"1F",X"F6",X"80",X"77",X"23",X"36",X"06",X"23",X"36",X"FF",X"DD",X"34",X"0C",X"DD", + X"35",X"0D",X"C2",X"C4",X"16",X"C9",X"DD",X"7E",X"00",X"E6",X"60",X"C8",X"FE",X"40",X"C8",X"78", + X"E6",X"60",X"28",X"0D",X"FE",X"40",X"28",X"10",X"DD",X"7E",X"0B",X"E6",X"1F",X"FE",X"10",X"30", + X"07",X"78",X"E6",X"F8",X"F6",X"07",X"47",X"C9",X"78",X"E6",X"F8",X"F6",X"06",X"47",X"C9",X"DD", + X"7E",X"0C",X"D6",X"07",X"57",X"87",X"87",X"82",X"5F",X"16",X"00",X"21",X"94",X"63",X"19",X"C9", + X"FD",X"66",X"61",X"FD",X"6E",X"62",X"7E",X"FD",X"77",X"65",X"E6",X"1F",X"FD",X"86",X"5F",X"FD", + X"77",X"68",X"E5",X"F5",X"CD",X"B2",X"17",X"F1",X"F6",X"80",X"77",X"D1",X"23",X"13",X"1A",X"E6", + X"E0",X"FD",X"B6",X"63",X"07",X"07",X"07",X"77",X"FD",X"77",X"66",X"23",X"1A",X"E6",X"1F",X"FD", + X"86",X"64",X"77",X"FD",X"77",X"67",X"13",X"FD",X"72",X"61",X"FD",X"73",X"62",X"FD",X"7E",X"65", + X"CB",X"7F",X"20",X"27",X"CB",X"77",X"C8",X"CB",X"6F",X"28",X"B5",X"FD",X"34",X"68",X"FD",X"7E", + X"68",X"FD",X"BE",X"60",X"28",X"01",X"D0",X"F5",X"CD",X"B2",X"17",X"F1",X"F6",X"80",X"77",X"23", + X"FD",X"7E",X"66",X"77",X"23",X"FD",X"7E",X"67",X"77",X"18",X"E0",X"FD",X"36",X"5E",X"00",X"C9", + X"06",X"07",X"DD",X"7E",X"07",X"B8",X"38",X"2F",X"47",X"CD",X"B2",X"17",X"78",X"F6",X"80",X"77", + X"23",X"36",X"02",X"23",X"36",X"40",X"04",X"11",X"03",X"00",X"19",X"3C",X"77",X"23",X"36",X"02", + X"23",X"36",X"41",X"04",X"DD",X"35",X"07",X"DD",X"35",X"07",X"DD",X"7E",X"06",X"A7",X"20",X"07", + X"1E",X"0C",X"CD",X"FB",X"06",X"18",X"31",X"78",X"CD",X"B2",X"17",X"78",X"DD",X"BE",X"08",X"30", + X"10",X"F6",X"80",X"77",X"23",X"36",X"02",X"23",X"36",X"42",X"11",X"03",X"00",X"19",X"04",X"18", + X"EA",X"F6",X"80",X"77",X"23",X"36",X"02",X"23",X"36",X"43",X"DD",X"35",X"08",X"DD",X"7E",X"08", + X"FE",X"07",X"30",X"04",X"DD",X"CB",X"00",X"96",X"DD",X"CB",X"00",X"DE",X"2A",X"A0",X"60",X"DD", + X"74",X"04",X"DD",X"75",X"05",X"DD",X"34",X"06",X"C9",X"2A",X"A0",X"60",X"DD",X"56",X"02",X"DD", + X"5E",X"03",X"DD",X"74",X"02",X"DD",X"75",X"03",X"A7",X"ED",X"52",X"EB",X"DD",X"E5",X"FD",X"E5", + X"DD",X"E1",X"01",X"10",X"00",X"DD",X"09",X"06",X"04",X"D5",X"DD",X"66",X"07",X"DD",X"6E",X"08", + X"A7",X"ED",X"52",X"DD",X"74",X"07",X"DD",X"75",X"08",X"D2",X"74",X"19",X"DD",X"35",X"06",X"DD", + X"CB",X"06",X"7E",X"CA",X"74",X"19",X"DD",X"CB",X"00",X"FE",X"DD",X"35",X"03",X"20",X"3F",X"DD", + X"34",X"00",X"DD",X"7E",X"00",X"E6",X"7F",X"FE",X"12",X"38",X"05",X"DD",X"36",X"00",X"80",X"AF", + X"5F",X"16",X"00",X"21",X"F2",X"1A",X"19",X"7E",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"ED",X"44", + X"DD",X"77",X"09",X"7E",X"E6",X"0F",X"87",X"5F",X"16",X"00",X"21",X"04",X"1B",X"19",X"5E",X"23", + X"56",X"1A",X"DD",X"77",X"03",X"13",X"DD",X"72",X"01",X"DD",X"73",X"02",X"18",X"0F",X"DD",X"56", + X"01",X"DD",X"5E",X"02",X"13",X"13",X"13",X"DD",X"72",X"01",X"DD",X"73",X"02",X"1A",X"DD",X"77", + X"04",X"CB",X"7F",X"28",X"0D",X"13",X"13",X"13",X"1A",X"DD",X"77",X"05",X"DD",X"72",X"01",X"DD", + X"73",X"02",X"E6",X"1F",X"87",X"5F",X"16",X"00",X"21",X"82",X"1B",X"19",X"5E",X"23",X"56",X"EB", + X"56",X"23",X"5E",X"EB",X"29",X"29",X"29",X"DD",X"56",X"06",X"DD",X"5E",X"07",X"19",X"DD",X"74", + X"06",X"DD",X"75",X"07",X"11",X"0A",X"00",X"DD",X"19",X"D1",X"05",X"C2",X"C9",X"18",X"DD",X"E1", + X"C9",X"DD",X"E5",X"DD",X"7E",X"00",X"DD",X"21",X"94",X"63",X"CB",X"47",X"28",X"04",X"DD",X"21", + X"C1",X"63",X"06",X"09",X"C5",X"DD",X"CB",X"00",X"7E",X"C4",X"B6",X"19",X"11",X"05",X"00",X"DD", + X"19",X"C1",X"10",X"F0",X"DD",X"E1",X"DD",X"7E",X"00",X"EE",X"01",X"DD",X"77",X"00",X"E6",X"01", + X"C0",X"DD",X"CB",X"00",X"8E",X"C9",X"DD",X"7E",X"00",X"E6",X"1F",X"FE",X"18",X"20",X"55",X"FD", + X"7E",X"0F",X"A7",X"28",X"4F",X"FE",X"01",X"20",X"29",X"FD",X"34",X"0F",X"FD",X"7E",X"0E",X"E6", + X"F0",X"28",X"41",X"0F",X"0F",X"0F",X"0F",X"F5",X"CD",X"7F",X"1A",X"CD",X"8F",X"1A",X"CD",X"A6", + X"1A",X"F1",X"77",X"7C",X"C6",X"04",X"67",X"DD",X"7E",X"01",X"E6",X"07",X"77",X"DD",X"36",X"00", + X"00",X"C9",X"CD",X"7F",X"1A",X"CD",X"8F",X"1A",X"CD",X"A6",X"1A",X"FD",X"7E",X"0E",X"E6",X"0F", + X"77",X"7C",X"C6",X"04",X"67",X"DD",X"7E",X"01",X"E6",X"07",X"77",X"FD",X"36",X"0F",X"00",X"DD", + X"36",X"00",X"00",X"C9",X"DD",X"CB",X"00",X"6E",X"20",X"1A",X"CD",X"7F",X"1A",X"CD",X"8F",X"1A", + X"CD",X"A6",X"1A",X"DD",X"7E",X"02",X"77",X"7C",X"C6",X"04",X"67",X"DD",X"7E",X"01",X"77",X"DD", + X"36",X"00",X"00",X"C9",X"CD",X"7F",X"1A",X"7E",X"DD",X"96",X"03",X"FE",X"08",X"D8",X"7E",X"CD", + X"A6",X"1A",X"DD",X"7E",X"04",X"A7",X"20",X"27",X"E5",X"CD",X"75",X"07",X"E1",X"E6",X"07",X"47", + X"C6",X"51",X"77",X"7C",X"C6",X"04",X"67",X"70",X"DD",X"7E",X"00",X"E6",X"1F",X"D6",X"07",X"5F", + X"16",X"00",X"21",X"E0",X"1A",X"19",X"7E",X"DD",X"77",X"04",X"DD",X"36",X"00",X"00",X"C9",X"DD", + X"35",X"04",X"36",X"FF",X"7C",X"C6",X"04",X"67",X"36",X"07",X"DD",X"36",X"00",X"00",X"C9",X"DD", + X"7E",X"00",X"E6",X"1F",X"D6",X"07",X"87",X"5F",X"16",X"00",X"21",X"7F",X"60",X"19",X"C9",X"46", + X"3A",X"A1",X"60",X"E6",X"07",X"4F",X"78",X"E6",X"07",X"91",X"4F",X"78",X"91",X"77",X"47",X"2B", + X"3A",X"A0",X"60",X"77",X"78",X"C9",X"E6",X"F8",X"DD",X"77",X"03",X"0F",X"0F",X"0F",X"21",X"00", + X"D0",X"85",X"6F",X"EB",X"DD",X"7E",X"00",X"E6",X"1F",X"6F",X"26",X"00",X"29",X"29",X"29",X"29", + X"29",X"19",X"C9",X"DD",X"7E",X"00",X"E6",X"18",X"C8",X"3A",X"A1",X"60",X"DD",X"96",X"04",X"FE", + X"F8",X"D8",X"DD",X"7E",X"00",X"E6",X"E7",X"DD",X"77",X"00",X"1E",X"0C",X"CD",X"0E",X"07",X"C9", + X"01",X"03",X"05",X"07",X"09",X"0B",X"0D",X"0F",X"11",X"13",X"15",X"17",X"19",X"1B",X"1D",X"1F", + X"21",X"23",X"00",X"02",X"03",X"04",X"21",X"14",X"42",X"03",X"05",X"40",X"82",X"03",X"24",X"61", + X"34",X"C2",X"03",X"05",X"10",X"1B",X"14",X"1B",X"18",X"1B",X"55",X"1B",X"77",X"1B",X"7B",X"1B", + X"01",X"00",X"A0",X"77",X"01",X"00",X"20",X"AC",X"14",X"01",X"20",X"7E",X"02",X"20",X"7E",X"03", + X"20",X"7E",X"04",X"20",X"7E",X"01",X"20",X"7E",X"02",X"20",X"7E",X"03",X"20",X"7E",X"04",X"20", + X"7E",X"01",X"20",X"7E",X"02",X"20",X"7E",X"03",X"20",X"7E",X"04",X"20",X"7E",X"01",X"20",X"7E", + X"02",X"20",X"7E",X"03",X"20",X"7E",X"04",X"20",X"7E",X"01",X"20",X"7E",X"02",X"20",X"7E",X"03", + X"20",X"7E",X"04",X"20",X"7E",X"06",X"A5",X"00",X"A5",X"26",X"00",X"9B",X"C7",X"C0",X"A5",X"48", + X"C0",X"9B",X"49",X"C0",X"A5",X"CA",X"C0",X"A5",X"4B",X"C0",X"9B",X"CC",X"C0",X"A5",X"4D",X"C0", + X"9B",X"EE",X"00",X"A5",X"6F",X"00",X"9B",X"01",X"10",X"60",X"C6",X"01",X"91",X"20",X"E5",X"12", + X"20",X"E5",X"A8",X"1B",X"42",X"1E",X"48",X"1E",X"52",X"1E",X"5E",X"1E",X"68",X"1E",X"A8",X"1E", + X"F8",X"1E",X"84",X"1F",X"2E",X"20",X"A2",X"20",X"42",X"21",X"EB",X"21",X"FF",X"21",X"15",X"22", + X"3D",X"22",X"6F",X"22",X"15",X"25",X"59",X"25",X"01",X"40",X"01",X"40",X"18",X"00",X"18",X"00", + X"17",X"01",X"16",X"01",X"15",X"01",X"15",X"00",X"14",X"01",X"13",X"01",X"12",X"01",X"12",X"02", + X"13",X"05",X"13",X"06",X"14",X"00",X"14",X"02",X"15",X"02",X"16",X"00",X"15",X"01",X"14",X"03", + X"14",X"04",X"14",X"00",X"13",X"01",X"13",X"02",X"14",X"02",X"15",X"02",X"16",X"02",X"91",X"17", + X"17",X"02",X"18",X"00",X"18",X"00",X"18",X"00",X"16",X"01",X"15",X"01",X"15",X"02",X"16",X"02", + X"16",X"01",X"15",X"01",X"14",X"01",X"13",X"01",X"13",X"02",X"14",X"00",X"16",X"02",X"17",X"02", + X"18",X"00",X"17",X"01",X"16",X"00",X"15",X"01",X"13",X"01",X"12",X"01",X"11",X"01",X"10",X"00", + X"13",X"02",X"D3",X"17",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00", + X"18",X"00",X"17",X"03",X"17",X"04",X"16",X"03",X"16",X"04",X"16",X"00",X"16",X"00",X"15",X"03", + X"15",X"04",X"14",X"03",X"14",X"04",X"14",X"00",X"14",X"00",X"13",X"03",X"13",X"04",X"12",X"03", + X"12",X"04",X"12",X"00",X"11",X"01",X"10",X"01",X"10",X"02",X"11",X"02",X"12",X"05",X"12",X"06", + X"13",X"00",X"13",X"02",X"14",X"02",X"91",X"17",X"15",X"02",X"18",X"00",X"18",X"00",X"18",X"00", + X"15",X"01",X"14",X"01",X"14",X"00",X"13",X"03",X"13",X"04",X"12",X"01",X"11",X"01",X"12",X"02", + X"13",X"02",X"14",X"02",X"15",X"02",X"90",X"17",X"16",X"02",X"18",X"00",X"18",X"00",X"18",X"00", + X"17",X"01",X"92",X"17",X"17",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"16",X"01",X"15",X"01", + X"14",X"01",X"13",X"01",X"13",X"02",X"14",X"00",X"14",X"05",X"14",X"06",X"15",X"05",X"15",X"06", + X"15",X"01",X"14",X"01",X"14",X"02",X"15",X"02",X"16",X"02",X"12",X"03",X"12",X"04",X"18",X"00", + X"12",X"03",X"12",X"04",X"17",X"00",X"13",X"05",X"13",X"06",X"18",X"00",X"14",X"05",X"14",X"06", + X"16",X"01",X"15",X"01",X"15",X"02",X"16",X"00",X"15",X"01",X"14",X"01",X"13",X"01",X"13",X"02", + X"14",X"02",X"15",X"02",X"16",X"02",X"17",X"00",X"17",X"00",X"90",X"17",X"17",X"02",X"18",X"00", + X"18",X"00",X"18",X"00",X"17",X"01",X"16",X"01",X"15",X"01",X"14",X"01",X"14",X"02",X"15",X"02", + X"16",X"00",X"16",X"02",X"17",X"02",X"18",X"00",X"18",X"00",X"17",X"01",X"16",X"01",X"15",X"01", + X"14",X"01",X"13",X"01",X"13",X"00",X"12",X"01",X"12",X"02",X"13",X"02",X"14",X"00",X"D3",X"17", + X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"17",X"03", + X"17",X"04",X"16",X"03",X"16",X"04",X"16",X"00",X"16",X"00",X"15",X"03",X"15",X"04",X"14",X"03", + X"14",X"04",X"14",X"00",X"14",X"00",X"13",X"03",X"13",X"04",X"12",X"03",X"12",X"04",X"11",X"01", + X"10",X"01",X"0F",X"01",X"10",X"01",X"15",X"02",X"91",X"17",X"16",X"02",X"18",X"00",X"18",X"00", + X"18",X"00",X"16",X"01",X"16",X"00",X"15",X"01",X"14",X"01",X"13",X"01",X"12",X"01",X"12",X"02", + X"13",X"02",X"14",X"02",X"15",X"00",X"15",X"02",X"16",X"00",X"16",X"05",X"16",X"06",X"17",X"05", + X"17",X"06",X"18",X"00",X"17",X"01",X"16",X"01",X"16",X"00",X"15",X"01",X"14",X"01",X"14",X"00", + X"13",X"01",X"12",X"01",X"12",X"02",X"13",X"02",X"14",X"02",X"91",X"15",X"15",X"02",X"16",X"00", + X"16",X"00",X"16",X"00",X"16",X"02",X"17",X"02",X"93",X"17",X"18",X"00",X"18",X"00",X"18",X"00", + X"18",X"00",X"17",X"01",X"16",X"01",X"15",X"01",X"15",X"02",X"16",X"02",X"16",X"01",X"15",X"01", + X"14",X"01",X"13",X"01",X"13",X"00",X"13",X"00",X"13",X"00",X"13",X"00",X"13",X"00",X"13",X"02", + X"14",X"00",X"14",X"00",X"D3",X"17",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00", + X"17",X"03",X"17",X"04",X"16",X"03",X"16",X"04",X"16",X"00",X"16",X"00",X"15",X"03",X"15",X"04", + X"14",X"03",X"14",X"04",X"14",X"00",X"14",X"00",X"13",X"03",X"13",X"04",X"12",X"03",X"12",X"04", + X"12",X"00",X"11",X"01",X"11",X"02",X"12",X"02",X"13",X"02",X"13",X"01",X"13",X"02",X"14",X"02", + X"16",X"01",X"16",X"00",X"16",X"02",X"17",X"02",X"17",X"01",X"16",X"01",X"15",X"01",X"12",X"01", + X"12",X"02",X"14",X"01",X"14",X"02",X"16",X"01",X"16",X"02",X"18",X"00",X"18",X"00",X"17",X"01", + X"16",X"01",X"13",X"03",X"13",X"04",X"13",X"02",X"15",X"01",X"15",X"02",X"16",X"02",X"17",X"00", + X"17",X"02",X"18",X"00",X"18",X"00",X"17",X"01",X"16",X"01",X"15",X"01",X"15",X"02",X"16",X"02", + X"17",X"02",X"00",X"1E",X"00",X"01",X"18",X"00",X"00",X"02",X"00",X"02",X"17",X"01",X"56",X"01", + X"17",X"02",X"00",X"1E",X"00",X"02",X"56",X"03",X"17",X"04",X"56",X"05",X"17",X"06",X"00",X"02", + X"00",X"02",X"56",X"07",X"17",X"08",X"17",X"07",X"00",X"1D",X"00",X"1D",X"0B",X"00",X"17",X"01", + X"14",X"01",X"13",X"01",X"12",X"02",X"15",X"02",X"17",X"00",X"15",X"01",X"13",X"01",X"11",X"01", + X"0F",X"01",X"0F",X"02",X"10",X"02",X"12",X"05",X"12",X"06",X"15",X"05",X"15",X"06",X"17",X"06", + X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"17",X"01",X"16",X"03",X"15",X"01", + X"14",X"01",X"13",X"00",X"11",X"01",X"11",X"02",X"00",X"1D",X"00",X"1D",X"12",X"00",X"27",X"01", + X"48",X"03",X"29",X"04",X"4A",X"03",X"4B",X"05",X"2C",X"04",X"2D",X"01",X"2D",X"07",X"2C",X"00", + X"2C",X"02",X"2A",X"00",X"2A",X"02",X"48",X"08",X"29",X"06",X"28",X"01",X"29",X"01",X"29",X"00", + X"29",X"06",X"29",X"01",X"2B",X"01",X"4C",X"03",X"2D",X"04",X"2F",X"03",X"30",X"09",X"2F",X"06", + X"4D",X"07",X"2E",X"06",X"2C",X"02",X"49",X"07",X"4A",X"08",X"2B",X"06",X"28",X"00",X"28",X"02", + X"27",X"00",X"28",X"01",X"29",X"01",X"2A",X"09",X"00",X"44",X"00",X"44",X"12",X"02",X"14",X"02", + X"15",X"00",X"15",X"02",X"16",X"02",X"17",X"02",X"18",X"00",X"17",X"01",X"17",X"00",X"16",X"03", + X"16",X"04",X"15",X"01",X"15",X"00",X"15",X"00",X"14",X"01",X"14",X"00",X"13",X"01",X"13",X"02", + X"14",X"02",X"15",X"00",X"15",X"02",X"16",X"02",X"17",X"05",X"17",X"06",X"18",X"00",X"18",X"00", + X"17",X"01",X"16",X"01",X"16",X"00",X"15",X"01",X"15",X"02",X"16",X"02",X"17",X"05",X"17",X"06", + X"18",X"00",X"18",X"00",X"18",X"00",X"17",X"01",X"17",X"00",X"16",X"01",X"14",X"01",X"12",X"03", + X"12",X"04",X"12",X"02",X"13",X"02",X"14",X"05",X"14",X"06",X"17",X"02",X"18",X"00",X"17",X"01", + X"17",X"00",X"17",X"00",X"16",X"03",X"16",X"04",X"15",X"01",X"14",X"01",X"14",X"00",X"14",X"02", + X"15",X"05",X"15",X"06",X"17",X"05",X"17",X"06",X"18",X"00",X"17",X"03",X"17",X"04",X"16",X"01", + X"15",X"01",X"13",X"01",X"00",X"44",X"00",X"44",X"29",X"02",X"28",X"02",X"27",X"02",X"47",X"03", + X"28",X"04",X"29",X"01",X"4B",X"03",X"2C",X"04",X"2D",X"09",X"2C",X"06",X"2A",X"02",X"48",X"07", + X"29",X"06",X"27",X"00",X"28",X"03",X"4A",X"03",X"2B",X"05",X"2C",X"09",X"2C",X"01",X"2D",X"09", + X"2C",X"02",X"4A",X"07",X"2B",X"06",X"29",X"00",X"29",X"02",X"47",X"07",X"28",X"06",X"27",X"01", + X"28",X"01",X"29",X"01",X"2A",X"01",X"2A",X"00",X"2A",X"02",X"29",X"00",X"29",X"02",X"28",X"02", + X"27",X"07",X"27",X"04",X"48",X"03",X"29",X"05",X"4A",X"03",X"2B",X"04",X"2D",X"01",X"2E",X"09", + X"2D",X"02",X"4B",X"07",X"2C",X"06",X"49",X"07",X"2A",X"06",X"28",X"02",X"28",X"01",X"29",X"01", + X"2A",X"09",X"2A",X"01",X"2B",X"09",X"2A",X"02",X"29",X"02",X"28",X"02",X"28",X"04",X"49",X"03"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_cpu2.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_cpu2.vhd new file mode 100644 index 00000000..d6ac057a --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_cpu2.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_cpu2 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 prom of rom_cpu2 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"2A",X"04",X"4B",X"03",X"2C",X"04",X"4D",X"03",X"2E",X"04",X"2E",X"07",X"2D",X"07",X"2C",X"06", + X"2A",X"02",X"48",X"07",X"29",X"06",X"27",X"00",X"28",X"01",X"49",X"03",X"2A",X"04",X"2B",X"01", + X"2B",X"00",X"2B",X"06",X"2A",X"06",X"29",X"06",X"28",X"02",X"27",X"00",X"27",X"02",X"00",X"38", + X"00",X"38",X"12",X"03",X"12",X"04",X"12",X"02",X"13",X"02",X"14",X"05",X"14",X"06",X"15",X"02", + X"16",X"02",X"17",X"02",X"17",X"01",X"16",X"01",X"15",X"01",X"14",X"01",X"14",X"02",X"15",X"02", + X"16",X"02",X"17",X"02",X"18",X"00",X"18",X"00",X"17",X"01",X"17",X"00",X"17",X"00",X"14",X"01", + X"12",X"03",X"12",X"04",X"12",X"02",X"13",X"02",X"14",X"02",X"16",X"02",X"17",X"02",X"18",X"00", + X"18",X"00",X"17",X"01",X"16",X"01",X"14",X"01",X"13",X"01",X"13",X"05",X"13",X"06",X"15",X"02", + X"16",X"02",X"18",X"00",X"18",X"00",X"16",X"01",X"15",X"01",X"14",X"01",X"13",X"01",X"12",X"01", + X"12",X"02",X"13",X"02",X"15",X"02",X"16",X"02",X"16",X"01",X"15",X"03",X"15",X"04",X"16",X"02", + X"17",X"02",X"00",X"4E",X"00",X"4E",X"17",X"01",X"16",X"01",X"15",X"01",X"14",X"01",X"13",X"01", + X"12",X"03",X"12",X"04",X"14",X"02",X"15",X"02",X"16",X"02",X"17",X"02",X"18",X"00",X"18",X"00", + X"17",X"01",X"16",X"01",X"15",X"01",X"13",X"01",X"12",X"01",X"12",X"02",X"13",X"02",X"15",X"02", + X"16",X"02",X"17",X"02",X"18",X"00",X"18",X"00",X"18",X"00",X"17",X"01",X"17",X"00",X"16",X"01", + X"15",X"01",X"15",X"00",X"14",X"01",X"14",X"00",X"13",X"01",X"13",X"00",X"13",X"02",X"14",X"02", + X"15",X"02",X"16",X"02",X"17",X"00",X"17",X"02",X"18",X"00",X"17",X"01",X"15",X"01",X"14",X"01", + X"12",X"03",X"12",X"04",X"12",X"06",X"13",X"00",X"13",X"02",X"12",X"03",X"13",X"02",X"14",X"02", + X"15",X"00",X"15",X"02",X"16",X"00",X"16",X"00",X"15",X"01",X"14",X"01",X"13",X"01",X"13",X"00", + X"13",X"02",X"14",X"05",X"14",X"06",X"16",X"00",X"16",X"00",X"15",X"01",X"14",X"01",X"13",X"01", + X"12",X"03",X"12",X"04",X"12",X"02",X"13",X"02",X"15",X"02",X"16",X"00",X"15",X"01",X"14",X"01", + X"13",X"01",X"00",X"4E",X"00",X"4E",X"27",X"01",X"27",X"00",X"27",X"00",X"28",X"01",X"28",X"00", + X"49",X"03",X"2A",X"04",X"2B",X"01",X"2B",X"00",X"2C",X"03",X"2C",X"02",X"4A",X"07",X"2B",X"06", + X"2A",X"03",X"49",X"07",X"2A",X"06",X"28",X"07",X"27",X"00",X"28",X"01",X"29",X"01",X"29",X"07", + X"28",X"07",X"27",X"00",X"27",X"00",X"28",X"01",X"28",X"07",X"27",X"00",X"27",X"00",X"28",X"01", + X"29",X"04",X"2A",X"03",X"2B",X"01",X"2C",X"03",X"2D",X"01",X"2D",X"07",X"2C",X"07",X"2B",X"07", + X"2A",X"02",X"29",X"02",X"28",X"02",X"28",X"00",X"27",X"02",X"20",X"27",X"01",X"27",X"00",X"27", + X"00",X"27",X"00",X"28",X"01",X"28",X"00",X"29",X"01",X"2A",X"01",X"4B",X"03",X"2C",X"04",X"2C", + X"00",X"2C",X"07",X"2B",X"07",X"2A",X"07",X"29",X"00",X"29",X"02",X"27",X"00",X"27",X"00",X"27", + X"00",X"27",X"00",X"27",X"00",X"27",X"00",X"28",X"01",X"29",X"04",X"29",X"07",X"28",X"02",X"27", + X"00",X"27",X"00",X"28",X"04",X"29",X"09",X"28",X"00",X"28",X"02",X"27",X"02",X"27",X"04",X"28", + X"01",X"49",X"03",X"2A",X"04",X"2B",X"01",X"2C",X"09",X"2B",X"06",X"00",X"08",X"00",X"08",X"11", + X"01",X"10",X"01",X"10",X"00",X"11",X"02",X"12",X"02",X"14",X"02",X"16",X"02",X"17",X"02",X"00", + X"08",X"00",X"08",X"2A",X"02",X"29",X"02",X"28",X"02",X"27",X"00",X"28",X"01",X"29",X"03",X"4A", + X"03",X"2B",X"04",X"2C",X"04",X"00",X"11",X"00",X"11",X"00",X"08",X"18",X"00",X"18",X"00",X"18", + X"00",X"18",X"00",X"17",X"00",X"15",X"01",X"13",X"01",X"11",X"01",X"0F",X"01",X"0F",X"00",X"0F", + X"02",X"10",X"02",X"12",X"02",X"13",X"02",X"15",X"02",X"16",X"02",X"17",X"02",X"00",X"11",X"00", + X"11",X"00",X"03",X"4D",X"03",X"4E",X"05",X"4F",X"05",X"30",X"04",X"31",X"09",X"30",X"07",X"4D", + X"07",X"4E",X"08",X"2F",X"06",X"2C",X"07",X"2B",X"02",X"2A",X"02",X"29",X"02",X"28",X"00",X"29", + X"01",X"29",X"00",X"48",X"07",X"29",X"06",X"27",X"00",X"27",X"00",X"27",X"02",X"20",X"20",X"01", + X"40",X"01",X"40",X"18",X"00",X"17",X"01",X"15",X"01",X"14",X"01",X"13",X"01",X"13",X"00",X"13", + X"02",X"14",X"02",X"15",X"02",X"16",X"02",X"17",X"02",X"AE",X"17",X"18",X"00",X"18",X"00",X"18", + X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"AF",X"17",X"18",X"00",X"18",X"00",X"18", + X"00",X"18",X"00",X"18",X"00",X"17",X"01",X"16",X"01",X"15",X"01",X"14",X"01",X"13",X"01",X"13", + X"00",X"13",X"00",X"13",X"02",X"14",X"02",X"15",X"01",X"14",X"01",X"14",X"00",X"14",X"00",X"AF", + X"15",X"14",X"02",X"16",X"00",X"16",X"00",X"16",X"00",X"16",X"00",X"16",X"02",X"17",X"02",X"18", + X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"AD",X"17",X"18",X"00",X"18",X"00",X"18", + X"00",X"18",X"00",X"17",X"01",X"17",X"00",X"16",X"01",X"15",X"01",X"14",X"01",X"12",X"01",X"11", + X"01",X"11",X"00",X"11",X"00",X"11",X"02",X"12",X"02",X"15",X"02",X"16",X"02",X"17",X"00",X"17", + X"00",X"16",X"01",X"15",X"01",X"AD",X"13",X"14",X"01",X"14",X"00",X"14",X"00",X"14",X"00",X"14", + X"00",X"13",X"01",X"12",X"01",X"12",X"00",X"12",X"02",X"14",X"02",X"16",X"02",X"18",X"00",X"18", + X"00",X"18",X"00",X"15",X"01",X"13",X"01",X"12",X"01",X"10",X"01",X"0E",X"01",X"0D",X"00",X"0D", + X"00",X"0D",X"02",X"0F",X"02",X"11",X"02",X"14",X"02",X"15",X"02",X"17",X"02",X"18",X"00",X"17", + X"01",X"17",X"00",X"16",X"01",X"15",X"01",X"15",X"00",X"14",X"01",X"13",X"01",X"13",X"00",X"13", + X"00",X"12",X"01",X"12",X"00",X"11",X"01",X"11",X"00",X"10",X"01",X"10",X"00",X"10",X"00",X"11", + X"02",X"14",X"02",X"16",X"02",X"17",X"02",X"AE",X"15",X"18",X"00",X"16",X"00",X"16",X"00",X"16", + X"00",X"15",X"01",X"14",X"01",X"14",X"00",X"AC",X"12",X"13",X"01",X"13",X"00",X"13",X"00",X"13", + X"00",X"13",X"02",X"14",X"00",X"14",X"02",X"15",X"02",X"17",X"02",X"18",X"00",X"18",X"00",X"18", + X"00",X"18",X"00",X"17",X"01",X"16",X"01",X"14",X"01",X"13",X"01",X"11",X"01",X"10",X"01",X"10", + X"00",X"10",X"00",X"10",X"02",X"13",X"02",X"16",X"02",X"17",X"02",X"17",X"01",X"16",X"01",X"AE", + X"14",X"15",X"01",X"15",X"00",X"15",X"00",X"15",X"00",X"15",X"00",X"14",X"01",X"13",X"01",X"12", + X"01",X"12",X"00",X"12",X"02",X"15",X"02",X"16",X"02",X"AD",X"17",X"17",X"02",X"18",X"00",X"18", + X"00",X"18",X"00",X"18",X"00",X"17",X"01",X"16",X"01",X"16",X"00",X"16",X"00",X"AE",X"14",X"15", + X"01",X"15",X"00",X"15",X"00",X"15",X"00",X"15",X"02",X"18",X"00",X"18",X"00",X"18",X"00",X"18", + X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"16",X"01",X"15",X"01",X"15",X"00",X"15", + X"00",X"15",X"02",X"AE",X"17",X"16",X"02",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"17", + X"01",X"16",X"01",X"16",X"00",X"15",X"01",X"14",X"01",X"14",X"00",X"14",X"00",X"13",X"01",X"12", + X"01",X"12",X"00",X"11",X"01",X"10",X"01",X"10",X"00",X"0F",X"01",X"0F",X"00",X"11",X"02",X"12", + X"02",X"15",X"02",X"16",X"02",X"17",X"02",X"18",X"00",X"AE",X"17",X"18",X"00",X"18",X"00",X"18", + X"00",X"18",X"00",X"18",X"00",X"17",X"01",X"16",X"01",X"15",X"01",X"14",X"01",X"14",X"00",X"16", + X"02",X"17",X"00",X"AF",X"16",X"17",X"00",X"17",X"00",X"17",X"00",X"17",X"00",X"17",X"02",X"17", + X"01",X"16",X"01",X"14",X"01",X"14",X"00",X"14",X"00",X"14",X"02",X"17",X"02",X"18",X"00",X"AD", + X"17",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"17",X"01",X"16",X"01",X"15",X"01",X"14", + X"01",X"14",X"00",X"13",X"01",X"13",X"00",X"13",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"18", + X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"17",X"01",X"AE",X"16",X"17",X"00",X"17",X"00",X"17", + X"00",X"17",X"00",X"16",X"01",X"15",X"01",X"13",X"01",X"13",X"00",X"13",X"00",X"18",X"00",X"18", + X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"14",X"01",X"13",X"01",X"10",X"01",X"0E",X"01",X"0D", + X"01",X"0D",X"00",X"0D",X"02",X"0E",X"02",X"10",X"02",X"15",X"02",X"16",X"02",X"18",X"00",X"18", + X"00",X"17",X"01",X"15",X"01",X"14",X"01",X"14",X"00",X"14",X"02",X"16",X"02",X"16",X"01",X"AC", + X"13",X"14",X"01",X"14",X"00",X"14",X"00",X"14",X"00",X"14",X"02",X"15",X"00",X"15",X"00",X"13", + X"01",X"12",X"01",X"12",X"00",X"12",X"00",X"12",X"02",X"14",X"02",X"15",X"02",X"AD",X"17",X"17", + X"02",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"17",X"01",X"16",X"01",X"15",X"01",X"15", + X"00",X"15",X"02",X"17",X"02",X"00",X"20",X"00",X"20",X"18",X"01",X"17",X"01",X"16",X"01",X"15", + X"01",X"14",X"01",X"13",X"01",X"12",X"01",X"12",X"00",X"12",X"00",X"12",X"00",X"12",X"00",X"12", + X"00",X"12",X"00",X"12",X"00",X"12",X"00",X"12",X"00",X"12",X"00",X"12",X"00",X"12",X"00",X"12", + X"00",X"12",X"00",X"12",X"00",X"12",X"00",X"12",X"00",X"12",X"00",X"12",X"02",X"13",X"02",X"14", + X"02",X"15",X"02",X"16",X"02",X"17",X"02",X"18",X"02",X"00",X"20",X"00",X"20",X"27",X"03",X"28", + X"03",X"29",X"03",X"2A",X"03",X"2B",X"03",X"2C",X"03",X"2D",X"03",X"2D",X"00",X"2D",X"00",X"2D", + X"00",X"2D",X"00",X"2D",X"00",X"2D",X"00",X"2D",X"00",X"2D",X"00",X"2D",X"00",X"2D",X"00",X"2D", + X"00",X"2D",X"00",X"2D",X"00",X"2D",X"00",X"2D",X"00",X"2D",X"00",X"2D",X"00",X"2D",X"00",X"2D", + X"04",X"2C",X"04",X"2B",X"04",X"2A",X"04",X"29",X"04",X"28",X"04",X"27",X"04",X"A5",X"25",X"D5", + X"25",X"07",X"26",X"31",X"26",X"00",X"60",X"40",X"A0",X"41",X"A1",X"42",X"62",X"03",X"23",X"40", + X"A4",X"41",X"A5",X"42",X"66",X"43",X"27",X"64",X"28",X"40",X"A9",X"41",X"AA",X"42",X"6B",X"43", + X"2C",X"64",X"2D",X"40",X"AE",X"41",X"AF",X"42",X"70",X"43",X"31",X"64",X"32",X"40",X"B3",X"41", + X"B4",X"42",X"75",X"83",X"36",X"00",X"CD",X"41",X"20",X"42",X"41",X"03",X"42",X"40",X"23",X"41", + X"24",X"42",X"45",X"43",X"46",X"44",X"27",X"65",X"28",X"40",X"29",X"41",X"2A",X"42",X"4B",X"43", + X"4C",X"44",X"2D",X"65",X"2E",X"40",X"2F",X"41",X"30",X"42",X"51",X"43",X"52",X"44",X"33",X"65", + X"34",X"41",X"35",X"42",X"56",X"83",X"57",X"00",X"87",X"40",X"A0",X"41",X"A1",X"42",X"A2",X"43", + X"63",X"04",X"24",X"40",X"A5",X"41",X"A6",X"42",X"A7",X"43",X"68",X"04",X"29",X"40",X"AA",X"41", + X"AB",X"42",X"AC",X"43",X"6D",X"04",X"2E",X"40",X"AF",X"41",X"B0",X"42",X"B1",X"43",X"72",X"84", + X"33",X"00",X"B3",X"41",X"A0",X"02",X"C1",X"40",X"A2",X"41",X"A3",X"42",X"C4",X"43",X"C5",X"64", + X"86",X"40",X"A7",X"41",X"A8",X"42",X"C9",X"43",X"CA",X"64",X"8B",X"40",X"AC",X"41",X"AD",X"42", + X"CE",X"43",X"CF",X"64",X"90",X"41",X"B1",X"82",X"D2",X"DD",X"CB",X"00",X"66",X"C2",X"50",X"28", + X"DD",X"CB",X"00",X"6E",X"20",X"3B",X"DD",X"CB",X"00",X"EE",X"DD",X"36",X"02",X"00",X"DD",X"36", + X"03",X"38",X"DD",X"36",X"04",X"00",X"DD",X"36",X"05",X"40",X"DD",X"36",X"06",X"00",X"DD",X"36", + X"07",X"00",X"DD",X"36",X"08",X"00",X"DD",X"36",X"09",X"00",X"DD",X"36",X"0A",X"00",X"DD",X"36", + X"0B",X"00",X"DD",X"36",X"01",X"40",X"3A",X"1D",X"6C",X"A7",X"C0",X"1E",X"19",X"CD",X"FB",X"06", + X"C9",X"DD",X"CB",X"00",X"4E",X"20",X"2B",X"FD",X"7E",X"1E",X"47",X"FD",X"AE",X"28",X"E6",X"60", + X"C0",X"CB",X"70",X"28",X"08",X"DD",X"CB",X"00",X"C6",X"DD",X"36",X"05",X"80",X"DD",X"CB",X"00", + X"CE",X"FD",X"35",X"00",X"CD",X"AF",X"09",X"2A",X"DD",X"60",X"22",X"7C",X"60",X"21",X"00",X"60", + X"CB",X"F6",X"DD",X"CB",X"00",X"5E",X"20",X"1C",X"3A",X"1D",X"6C",X"A7",X"20",X"16",X"DD",X"CB", + X"00",X"DE",X"DD",X"CB",X"00",X"46",X"20",X"07",X"1E",X"13",X"CD",X"FB",X"06",X"18",X"05",X"1E", + X"16",X"CD",X"FB",X"06",X"CD",X"51",X"29",X"2F",X"E6",X"05",X"28",X"37",X"CB",X"57",X"20",X"05", + X"11",X"80",X"FE",X"18",X"03",X"11",X"80",X"01",X"DD",X"66",X"03",X"DD",X"6E",X"04",X"19",X"7C", + X"FE",X"78",X"30",X"1F",X"FE",X"38",X"38",X"1B",X"DD",X"74",X"03",X"DD",X"75",X"04",X"7C",X"D6", + X"38",X"57",X"ED",X"4B",X"DF",X"60",X"CD",X"3C",X"3A",X"ED",X"5B",X"DD",X"60",X"19",X"22",X"7C", + X"60",X"18",X"00",X"CD",X"71",X"29",X"2F",X"E6",X"0A",X"28",X"22",X"CB",X"5F",X"20",X"05",X"21", + X"00",X"01",X"18",X"03",X"21",X"00",X"FF",X"DD",X"56",X"05",X"DD",X"5E",X"06",X"19",X"7C",X"FE", + X"C0",X"30",X"0A",X"FE",X"40",X"38",X"06",X"DD",X"74",X"05",X"DD",X"75",X"06",X"3A",X"60",X"63", + X"17",X"38",X"1F",X"CD",X"98",X"29",X"CB",X"67",X"20",X"18",X"21",X"60",X"63",X"CB",X"FE",X"23", + X"23",X"EB",X"21",X"56",X"63",X"01",X"05",X"00",X"ED",X"B0",X"EB",X"36",X"00",X"1E",X"04",X"CD", + X"FB",X"06",X"DD",X"7E",X"0A",X"A7",X"20",X"39",X"21",X"68",X"63",X"CB",X"7E",X"28",X"07",X"21", + X"79",X"63",X"CB",X"7E",X"20",X"2E",X"EB",X"CD",X"A9",X"29",X"1F",X"38",X"27",X"EB",X"CB",X"FE", + X"23",X"23",X"EB",X"21",X"56",X"63",X"01",X"05",X"00",X"ED",X"B0",X"EB",X"36",X"00",X"ED",X"5B", + X"7C",X"60",X"23",X"72",X"23",X"73",X"DD",X"36",X"0A",X"20",X"1E",X"05",X"CD",X"FB",X"06",X"18", + X"03",X"DD",X"35",X"0A",X"3A",X"03",X"60",X"2F",X"E6",X"03",X"20",X"75",X"06",X"07",X"0E",X"03", + X"CD",X"60",X"0A",X"28",X"05",X"DD",X"CB",X"00",X"E6",X"C9",X"FD",X"7E",X"1E",X"FD",X"AE",X"28", + X"E6",X"60",X"28",X"5D",X"DD",X"7E",X"05",X"E6",X"F8",X"5F",X"CD",X"F6",X"0A",X"DD",X"86",X"03", + X"E6",X"F8",X"57",X"CD",X"03",X"0B",X"11",X"00",X"04",X"DD",X"CB",X"00",X"46",X"20",X"22",X"7E", + X"FE",X"FF",X"20",X"3D",X"19",X"7E",X"E6",X"07",X"FE",X"06",X"20",X"35",X"DD",X"CB",X"00",X"C6", + X"1E",X"13",X"CD",X"0E",X"07",X"1E",X"08",X"CD",X"FB",X"06",X"1E",X"16",X"CD",X"FB",X"06",X"18", + X"20",X"7E",X"FE",X"FF",X"20",X"08",X"19",X"7E",X"E6",X"07",X"FE",X"06",X"28",X"13",X"DD",X"CB", + X"00",X"86",X"1E",X"16",X"CD",X"0E",X"07",X"1E",X"03",X"CD",X"FB",X"06",X"1E",X"13",X"CD",X"FB", + X"06",X"06",X"C0",X"0E",X"00",X"16",X"03",X"CD",X"02",X"06",X"06",X"0D",X"CD",X"7A",X"06",X"C9", + X"CD",X"7B",X"0B",X"DA",X"39",X"29",X"DD",X"7E",X"09",X"FE",X"10",X"D2",X"39",X"29",X"DD",X"34", + X"09",X"E6",X"0C",X"28",X"0B",X"FE",X"04",X"28",X"25",X"FE",X"08",X"28",X"5A",X"C3",X"00",X"29", + X"01",X"74",X"C0",X"16",X"03",X"CD",X"02",X"06",X"DD",X"7E",X"09",X"FE",X"01",X"C0",X"1E",X"13", + X"CD",X"0E",X"07",X"1E",X"16",X"CD",X"0E",X"07",X"1E",X"00",X"CD",X"FB",X"06",X"C9",X"11",X"F8", + X"F8",X"CD",X"EF",X"0B",X"01",X"78",X"C0",X"16",X"0C",X"CD",X"08",X"06",X"11",X"F8",X"08",X"CD", + X"EF",X"0B",X"01",X"7C",X"C0",X"16",X"0C",X"CD",X"08",X"06",X"11",X"08",X"F8",X"CD",X"EF",X"0B", + X"01",X"80",X"C0",X"16",X"0C",X"CD",X"08",X"06",X"11",X"08",X"08",X"CD",X"EF",X"0B",X"01",X"84", + X"C0",X"16",X"0C",X"CD",X"08",X"06",X"C9",X"11",X"F8",X"F8",X"CD",X"EF",X"0B",X"01",X"88",X"C0", + X"16",X"02",X"CD",X"08",X"06",X"11",X"F8",X"08",X"CD",X"EF",X"0B",X"01",X"8C",X"C0",X"16",X"02", + X"CD",X"08",X"06",X"11",X"08",X"F8",X"CD",X"EF",X"0B",X"01",X"8C",X"F0",X"16",X"02",X"CD",X"08", + X"06",X"11",X"08",X"08",X"CD",X"EF",X"0B",X"01",X"88",X"F0",X"16",X"02",X"CD",X"08",X"06",X"C9", + X"11",X"F8",X"F8",X"CD",X"EF",X"0B",X"01",X"90",X"C0",X"16",X"0E",X"CD",X"08",X"06",X"11",X"F8", + X"08",X"CD",X"EF",X"0B",X"01",X"94",X"C0",X"16",X"0E",X"CD",X"08",X"06",X"11",X"08",X"F8",X"CD", + X"EF",X"0B",X"01",X"94",X"F0",X"16",X"0E",X"CD",X"08",X"06",X"11",X"08",X"08",X"CD",X"EF",X"0B", + X"01",X"90",X"F0",X"16",X"0E",X"CD",X"08",X"06",X"C9",X"DD",X"36",X"00",X"00",X"21",X"49",X"63", + X"CB",X"FE",X"21",X"00",X"60",X"CB",X"B6",X"23",X"CB",X"FE",X"21",X"00",X"00",X"22",X"7C",X"60", + X"C9",X"21",X"00",X"60",X"CB",X"7E",X"28",X"0A",X"3A",X"00",X"90",X"CB",X"46",X"C8",X"3A",X"01", + X"90",X"C9",X"DD",X"34",X"0B",X"DD",X"CB",X"0B",X"6E",X"20",X"03",X"3E",X"FB",X"C9",X"3E",X"FE", + X"C9",X"21",X"00",X"60",X"CB",X"7E",X"28",X"0A",X"3A",X"00",X"90",X"CB",X"46",X"C8",X"3A",X"01", + X"90",X"C9",X"3A",X"A1",X"60",X"DD",X"86",X"03",X"CD",X"EF",X"2B",X"D6",X"30",X"DD",X"BE",X"05", + X"30",X"03",X"3E",X"F7",X"C9",X"3E",X"FD",X"C9",X"21",X"00",X"60",X"AF",X"CB",X"7E",X"C8",X"3A", + X"00",X"90",X"CB",X"46",X"C8",X"3A",X"01",X"90",X"C9",X"21",X"00",X"60",X"AF",X"CB",X"7E",X"C8", + X"3A",X"00",X"E0",X"CB",X"46",X"C8",X"1F",X"C9",X"DD",X"CB",X"00",X"66",X"20",X"4C",X"21",X"00", + X"08",X"DD",X"56",X"03",X"DD",X"5E",X"04",X"19",X"7C",X"FE",X"F0",X"30",X"61",X"DD",X"74",X"03", + X"DD",X"75",X"04",X"FD",X"21",X"FC",X"63",X"11",X"0B",X"00",X"26",X"0C",X"06",X"18",X"0E",X"09", + X"CD",X"15",X"0A",X"28",X"05",X"CD",X"41",X"0A",X"38",X"17",X"FD",X"19",X"10",X"F2",X"06",X"10", + X"0E",X"01",X"CD",X"60",X"0A",X"20",X"0E",X"06",X"80",X"0E",X"6C",X"16",X"03",X"CD",X"02",X"06", + X"C9",X"FD",X"CB",X"00",X"E6",X"DD",X"CB",X"00",X"E6",X"C9",X"DD",X"7E",X"07",X"FE",X"0C",X"30", + X"1D",X"CD",X"7B",X"0B",X"38",X"18",X"DD",X"7E",X"07",X"21",X"A3",X"0B",X"CD",X"93",X"0B",X"DD", + X"34",X"07",X"DD",X"7E",X"07",X"FE",X"01",X"C0",X"1E",X"12",X"CD",X"FB",X"06",X"C9",X"DD",X"36", + X"00",X"00",X"21",X"01",X"60",X"CB",X"FE",X"C9",X"DD",X"CB",X"00",X"66",X"C2",X"C6",X"2B",X"DD", + X"CB",X"00",X"46",X"C2",X"DA",X"2A",X"21",X"80",X"01",X"DD",X"56",X"05",X"DD",X"5E",X"06",X"19", + X"DD",X"74",X"05",X"DD",X"75",X"06",X"ED",X"5B",X"7C",X"60",X"DD",X"66",X"08",X"DD",X"6E",X"09", + X"A7",X"ED",X"52",X"DD",X"56",X"03",X"DD",X"5E",X"04",X"19",X"7C",X"FE",X"08",X"DA",X"B7",X"2B", + X"FE",X"F8",X"D2",X"B7",X"2B",X"DD",X"74",X"03",X"DD",X"75",X"04",X"06",X"03",X"0E",X"01",X"CD", + X"60",X"0A",X"28",X"4C",X"3A",X"A1",X"60",X"DD",X"86",X"03",X"CD",X"EF",X"2B",X"D6",X"10",X"DD", + X"BE",X"05",X"38",X"05",X"DD",X"CB",X"00",X"E6",X"C9",X"DD",X"CB",X"00",X"C6",X"DD",X"36",X"08", + X"1E",X"C6",X"14",X"DD",X"77",X"0B",X"DD",X"36",X"0C",X"00",X"DD",X"77",X"0F",X"DD",X"36",X"10", + X"00",X"DD",X"7E",X"03",X"DD",X"77",X"09",X"DD",X"77",X"0D",X"DD",X"7E",X"04",X"DD",X"77",X"0A", + X"DD",X"77",X"0E",X"1E",X"05",X"CD",X"0E",X"07",X"1E",X"12",X"CD",X"FB",X"06",X"C3",X"A1",X"2B", + X"06",X"80",X"0E",X"6D",X"16",X"0D",X"CD",X"02",X"06",X"C9",X"DD",X"35",X"08",X"CA",X"BC",X"2B", + X"3A",X"03",X"60",X"E6",X"03",X"FE",X"01",X"20",X"5C",X"FD",X"21",X"FC",X"63",X"11",X"0B",X"00", + X"06",X"0C",X"CD",X"15",X"0A",X"28",X"23",X"FD",X"7E",X"02",X"A7",X"20",X"1D",X"FD",X"7E",X"00", + X"E6",X"07",X"FE",X"05",X"28",X"14",X"DD",X"7E",X"09",X"D6",X"0B",X"FD",X"BE",X"03",X"30",X"0A", + X"DD",X"7E",X"0D",X"C6",X"0B",X"FD",X"BE",X"03",X"30",X"27",X"FD",X"19",X"10",X"D4",X"FD",X"21", + X"D0",X"64",X"CD",X"15",X"0A",X"28",X"1E",X"FD",X"7E",X"02",X"A7",X"20",X"18",X"DD",X"7E",X"09", + X"D6",X"0A",X"FD",X"BE",X"03",X"30",X"0E",X"DD",X"7E",X"0D",X"C6",X"0A",X"FD",X"BE",X"03",X"38", + X"04",X"FD",X"CB",X"00",X"E6",X"ED",X"5B",X"7C",X"60",X"DD",X"7E",X"09",X"FE",X"10",X"38",X"0D", + X"67",X"DD",X"6E",X"0A",X"A7",X"ED",X"52",X"DD",X"74",X"09",X"DD",X"75",X"0A",X"DD",X"7E",X"0D", + X"FE",X"10",X"38",X"58",X"67",X"DD",X"6E",X"0E",X"CB",X"2A",X"CB",X"1B",X"A7",X"ED",X"52",X"DD", + X"74",X"0D",X"DD",X"75",X"0E",X"3A",X"A1",X"60",X"84",X"CD",X"EF",X"2B",X"C6",X"04",X"47",X"DD", + X"96",X"0F",X"30",X"02",X"ED",X"44",X"FE",X"20",X"30",X"32",X"DD",X"70",X"0F",X"DD",X"CB",X"08", + X"46",X"20",X"0E",X"DD",X"7E",X"09",X"DD",X"77",X"03",X"DD",X"7E",X"0B",X"DD",X"77",X"05",X"18", + X"0C",X"DD",X"7E",X"0D",X"DD",X"77",X"03",X"DD",X"7E",X"0F",X"DD",X"77",X"05",X"06",X"C0",X"0E", + X"BC",X"16",X"05",X"CD",X"02",X"06",X"C9",X"1E",X"05",X"CD",X"0E",X"07",X"DD",X"36",X"00",X"00", + X"21",X"01",X"60",X"CB",X"FE",X"C9",X"DD",X"7E",X"07",X"A7",X"20",X"0A",X"1E",X"05",X"CD",X"0E", + X"07",X"1E",X"12",X"CD",X"FB",X"06",X"DD",X"7E",X"07",X"FE",X"0C",X"30",X"DF",X"CD",X"7B",X"0B", + X"38",X"DA",X"DD",X"7E",X"07",X"21",X"A3",X"0B",X"CD",X"93",X"0B",X"DD",X"34",X"07",X"C9",X"E6", + X"F8",X"0F",X"0F",X"0F",X"5F",X"16",X"00",X"21",X"A2",X"60",X"19",X"7E",X"87",X"87",X"87",X"C9", + X"3A",X"54",X"63",X"17",X"38",X"05",X"DD",X"36",X"00",X"00",X"C9",X"2A",X"78",X"60",X"CD",X"1E", + X"2C",X"22",X"78",X"60",X"2A",X"7A",X"60",X"CD",X"1E",X"2C",X"22",X"7A",X"60",X"C9",X"11",X"80", + X"FF",X"19",X"7C",X"FE",X"FD",X"D0",X"FE",X"04",X"D8",X"26",X"03",X"C9",X"DD",X"CB",X"00",X"6E", + X"20",X"08",X"DD",X"CB",X"00",X"EE",X"DD",X"36",X"02",X"0E",X"DD",X"CB",X"02",X"46",X"20",X"19", + X"DD",X"7E",X"00",X"E6",X"07",X"87",X"5F",X"16",X"00",X"21",X"73",X"2C",X"19",X"5E",X"23",X"56", + X"EB",X"CD",X"75",X"09",X"CD",X"75",X"09",X"18",X"09",X"21",X"B7",X"D0",X"01",X"02",X"08",X"CD", + X"82",X"09",X"DD",X"36",X"01",X"08",X"DD",X"35",X"02",X"C0",X"DD",X"36",X"01",X"00",X"DD",X"36", + X"00",X"00",X"C9",X"81",X"2C",X"90",X"2C",X"A3",X"2C",X"B4",X"2C",X"CA",X"2C",X"DF",X"2C",X"F2", + X"2C",X"B7",X"D0",X"03",X"1E",X"0F",X"18",X"D9",X"D0",X"06",X"0C",X"18",X"16",X"12",X"17",X"10", + X"B7",X"D0",X"06",X"11",X"18",X"16",X"12",X"17",X"10",X"D8",X"D0",X"07",X"16",X"12",X"1C",X"1C", + X"12",X"15",X"0E",X"B7",X"D0",X"05",X"1B",X"0A",X"0D",X"0A",X"1B",X"D9",X"D0",X"06",X"1C",X"0E", + X"0A",X"1B",X"0C",X"11",X"B7",X"D0",X"08",X"1D",X"11",X"0E",X"24",X"1D",X"0A",X"17",X"14",X"D7", + X"D0",X"08",X"12",X"1C",X"24",X"0F",X"18",X"1E",X"17",X"0D",X"B7",X"D0",X"07",X"1D",X"11",X"0E", + X"24",X"1C",X"0E",X"0A",X"D7",X"D0",X"08",X"12",X"1C",X"24",X"0F",X"18",X"1E",X"17",X"0D",X"B7", + X"D0",X"07",X"16",X"12",X"1C",X"1C",X"12",X"15",X"0E",X"D9",X"D0",X"06",X"0C",X"18",X"16",X"12", + X"17",X"10",X"B7",X"D0",X"04",X"1C",X"1E",X"0B",X"2D",X"D9",X"D0",X"06",X"16",X"0A",X"1B",X"12", + X"17",X"0E",X"4E",X"21",X"00",X"60",X"CB",X"76",X"20",X"2B",X"21",X"54",X"63",X"CB",X"7E",X"20", + X"05",X"DD",X"36",X"00",X"00",X"C9",X"DD",X"CB",X"00",X"6E",X"20",X"19",X"DD",X"CB",X"00",X"EE", + X"DD",X"36",X"02",X"00",X"DD",X"36",X"04",X"10",X"DD",X"36",X"05",X"00",X"DD",X"36",X"08",X"00", + X"DD",X"36",X"0A",X"00",X"C9",X"26",X"00",X"DD",X"6E",X"02",X"DD",X"34",X"02",X"DD",X"7E",X"02", + X"FE",X"07",X"38",X"04",X"DD",X"36",X"02",X"00",X"29",X"11",X"52",X"2D",X"19",X"5E",X"23",X"56", + X"EB",X"E9",X"60",X"2D",X"03",X"31",X"87",X"32",X"51",X"33",X"A1",X"33",X"1E",X"34",X"B1",X"34", + X"FD",X"CB",X"2E",X"7E",X"28",X"48",X"CD",X"D8",X"2D",X"7E",X"FE",X"FF",X"28",X"0B",X"CD",X"1E", + X"2E",X"CD",X"40",X"2E",X"FD",X"34",X"6A",X"18",X"ED",X"FD",X"CB",X"69",X"7E",X"28",X"13",X"CD", + X"F2",X"2D",X"7E",X"FE",X"FF",X"28",X"0B",X"CD",X"1E",X"2E",X"CD",X"40",X"2E",X"FD",X"34",X"6C", + X"18",X"ED",X"FD",X"CB",X"2E",X"BE",X"FD",X"7E",X"32",X"FD",X"77",X"69",X"FD",X"36",X"6A",X"00", + X"CB",X"7F",X"28",X"0A",X"FD",X"7E",X"33",X"FD",X"77",X"6B",X"FD",X"36",X"6C",X"00",X"CD",X"D8", + X"2D",X"7E",X"FE",X"FF",X"28",X"0B",X"CD",X"0C",X"2E",X"38",X"06",X"CD",X"40",X"2E",X"FD",X"34", + X"6A",X"FD",X"CB",X"69",X"7E",X"C8",X"CD",X"F2",X"2D",X"7E",X"FE",X"FF",X"C8",X"CD",X"0C",X"2E", + X"D8",X"CD",X"40",X"2E",X"FD",X"34",X"6C",X"C9",X"FD",X"7E",X"69",X"E6",X"1F",X"87",X"5F",X"16", + X"00",X"21",X"01",X"2F",X"19",X"5E",X"23",X"56",X"FD",X"7E",X"6A",X"87",X"87",X"6F",X"26",X"00", + X"19",X"C9",X"FD",X"7E",X"6B",X"E6",X"1F",X"87",X"5F",X"16",X"00",X"21",X"01",X"2F",X"19",X"5E", + X"23",X"56",X"FD",X"7E",X"6C",X"87",X"87",X"6F",X"26",X"00",X"19",X"C9",X"E5",X"23",X"56",X"23", + X"5E",X"EB",X"FD",X"56",X"34",X"FD",X"5E",X"35",X"A7",X"ED",X"52",X"EB",X"E1",X"C9",X"CD",X"0C", + X"2E",X"E5",X"D5",X"FD",X"7E",X"32",X"E6",X"1F",X"87",X"5F",X"16",X"00",X"21",X"82",X"1B",X"19", + X"5E",X"23",X"56",X"EB",X"56",X"23",X"5E",X"EB",X"29",X"29",X"29",X"D1",X"19",X"EB",X"E1",X"C9", + X"FD",X"CB",X"69",X"6E",X"C0",X"FD",X"CB",X"69",X"76",X"20",X"05",X"CB",X"66",X"C8",X"18",X"03", + X"CB",X"5E",X"C8",X"7E",X"E6",X"07",X"FE",X"04",X"20",X"0A",X"D5",X"E5",X"CD",X"75",X"07",X"E1", + X"D1",X"E6",X"01",X"C8",X"DD",X"E5",X"D5",X"FD",X"E5",X"DD",X"E1",X"11",X"6F",X"00",X"DD",X"19", + X"11",X"08",X"00",X"06",X"18",X"DD",X"CB",X"00",X"7E",X"28",X"08",X"DD",X"19",X"10",X"F6",X"D1", + X"DD",X"E1",X"C9",X"D1",X"7E",X"E6",X"07",X"F6",X"80",X"DD",X"77",X"00",X"E5",X"21",X"00",X"04", + X"A7",X"ED",X"52",X"E5",X"2A",X"8C",X"63",X"55",X"5C",X"2A",X"A0",X"60",X"A7",X"ED",X"52",X"EB", + X"E1",X"7C",X"65",X"FD",X"6E",X"36",X"A7",X"ED",X"52",X"DE",X"00",X"DD",X"77",X"01",X"DD",X"74", + X"02",X"DD",X"75",X"03",X"E1",X"23",X"23",X"23",X"FD",X"7E",X"37",X"87",X"87",X"87",X"86",X"DD", + X"77",X"04",X"DD",X"36",X"05",X"00",X"2A",X"A0",X"60",X"DD",X"74",X"06",X"DD",X"75",X"07",X"DD", + X"E5",X"E1",X"DD",X"E1",X"7E",X"E6",X"07",X"FE",X"04",X"C8",X"DD",X"7E",X"09",X"A7",X"28",X"04", + X"DD",X"35",X"09",X"C9",X"CB",X"DE",X"FD",X"7E",X"0B",X"E6",X"30",X"0F",X"0F",X"0F",X"5F",X"16", + X"00",X"21",X"FB",X"30",X"3A",X"DC",X"60",X"A7",X"28",X"01",X"23",X"19",X"7E",X"DD",X"77",X"09", + X"C9",X"27",X"2F",X"FA",X"30",X"FA",X"30",X"FA",X"30",X"FA",X"30",X"FA",X"30",X"FA",X"30",X"FA", + X"30",X"EC",X"2F",X"FA",X"30",X"FA",X"30",X"F9",X"2F",X"FA",X"30",X"FA",X"30",X"FA",X"30",X"FA", + X"30",X"0A",X"30",X"FA",X"30",X"FA",X"30",X"10",X"09",X"98",X"97",X"10",X"09",X"80",X"A7",X"10", + X"09",X"28",X"8F",X"13",X"09",X"10",X"8F",X"13",X"08",X"F8",X"AF",X"13",X"08",X"C8",X"9F",X"14", + X"08",X"50",X"9F",X"11",X"08",X"14",X"AD",X"11",X"08",X"02",X"A7",X"11",X"07",X"F0",X"A3",X"11", + X"07",X"DE",X"9A",X"11",X"07",X"CC",X"97",X"11",X"07",X"BA",X"90",X"11",X"07",X"78",X"8F",X"11", + X"07",X"58",X"8F",X"13",X"07",X"40",X"8F",X"10",X"06",X"E0",X"87",X"13",X"06",X"C8",X"87",X"13", + X"06",X"A0",X"97",X"10",X"06",X"50",X"A7",X"10",X"05",X"60",X"87",X"13",X"05",X"48",X"87",X"13", + X"05",X"18",X"A7",X"13",X"04",X"B0",X"97",X"14",X"04",X"88",X"9F",X"11",X"04",X"58",X"B3",X"11", + X"04",X"46",X"AA",X"11",X"04",X"34",X"A7",X"11",X"04",X"22",X"A0",X"11",X"04",X"10",X"97",X"11", + X"03",X"B8",X"8F",X"13",X"03",X"A0",X"8F",X"13",X"03",X"58",X"9F",X"10",X"02",X"B8",X"8F",X"13", + X"02",X"A0",X"8F",X"10",X"02",X"88",X"9F",X"13",X"02",X"70",X"9F",X"13",X"01",X"F8",X"97",X"14", + X"01",X"D0",X"9F",X"11",X"01",X"9C",X"A9",X"11",X"01",X"8A",X"A7",X"11",X"01",X"78",X"9F",X"11", + X"01",X"66",X"97",X"11",X"01",X"54",X"95",X"11",X"01",X"42",X"8C",X"11",X"00",X"F8",X"AF",X"11", + X"00",X"E0",X"B7",X"13",X"00",X"B0",X"9F",X"13",X"00",X"48",X"AF",X"FF",X"0D",X"01",X"F0",X"5F", + X"0D",X"01",X"08",X"67",X"0D",X"00",X"80",X"6F",X"FF",X"0D",X"02",X"30",X"5F",X"0D",X"01",X"80", + X"5F",X"0D",X"00",X"E8",X"5F",X"0D",X"00",X"18",X"4F",X"FF",X"10",X"09",X"98",X"77",X"13",X"09", + X"80",X"77",X"10",X"09",X"60",X"7F",X"13",X"09",X"48",X"7F",X"10",X"08",X"E0",X"97",X"10",X"08", + X"D0",X"7F",X"13",X"08",X"B8",X"7F",X"10",X"08",X"70",X"6F",X"13",X"08",X"58",X"6F",X"13",X"08", + X"08",X"8F",X"10",X"07",X"E8",X"AF",X"10",X"07",X"C8",X"6F",X"13",X"07",X"B0",X"6F",X"10",X"07", + X"50",X"97",X"10",X"07",X"40",X"77",X"10",X"07",X"08",X"A7",X"10",X"06",X"E0",X"AF",X"10",X"06", + X"C8",X"9F",X"10",X"06",X"B0",X"8F",X"10",X"06",X"98",X"87",X"10",X"06",X"78",X"77",X"10",X"06", + X"48",X"77",X"13",X"06",X"30",X"77",X"10",X"06",X"10",X"67",X"13",X"05",X"F8",X"67",X"13",X"05", + X"D0",X"B7",X"10",X"05",X"98",X"9F",X"10",X"05",X"88",X"87",X"10",X"05",X"38",X"77",X"13",X"05", + X"20",X"77",X"10",X"04",X"D8",X"6F",X"13",X"04",X"C0",X"6F",X"10",X"04",X"90",X"77",X"13",X"04", + X"78",X"77",X"10",X"04",X"38",X"B7",X"10",X"04",X"00",X"77",X"13",X"03",X"E8",X"77",X"10",X"03", + X"B0",X"97",X"10",X"03",X"90",X"87",X"10",X"03",X"60",X"8F",X"10",X"03",X"30",X"77",X"13",X"03", + X"18",X"77",X"10",X"02",X"D0",X"7F",X"13",X"02",X"B8",X"7F",X"10",X"02",X"90",X"97",X"10",X"02", + X"68",X"6F",X"13",X"02",X"50",X"6F",X"10",X"02",X"18",X"8F",X"10",X"01",X"C8",X"77",X"13",X"01", + X"B0",X"77",X"10",X"01",X"90",X"8F",X"10",X"01",X"58",X"9F",X"10",X"01",X"40",X"6F",X"10",X"01", + X"10",X"AF",X"10",X"00",X"E0",X"9F",X"10",X"00",X"B8",X"67",X"13",X"00",X"A0",X"67",X"10",X"00", + X"70",X"87",X"10",X"00",X"48",X"6F",X"13",X"00",X"30",X"6F",X"FF",X"03",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"FD",X"CB",X"24",X"7E",X"28",X"21",X"CD",X"3C",X"31",X"7E",X"FE",X"FF",X"28", + X"0B",X"CD",X"68",X"31",X"CD",X"8A",X"31",X"FD",X"34",X"6E",X"18",X"ED",X"FD",X"CB",X"24",X"BE", + X"FD",X"7E",X"28",X"FD",X"77",X"6D",X"FD",X"36",X"6E",X"00",X"CD",X"3C",X"31",X"7E",X"FE",X"FF", + X"C8",X"CD",X"56",X"31",X"D8",X"CD",X"8A",X"31",X"FD",X"34",X"6E",X"C9",X"FD",X"7E",X"6D",X"E6", + X"1F",X"87",X"5F",X"16",X"00",X"21",X"F0",X"31",X"19",X"5E",X"23",X"56",X"FD",X"7E",X"6E",X"87", + X"87",X"6F",X"26",X"00",X"19",X"C9",X"E5",X"23",X"56",X"23",X"5E",X"EB",X"FD",X"56",X"2A",X"FD", + X"5E",X"2B",X"A7",X"ED",X"52",X"EB",X"E1",X"C9",X"CD",X"56",X"31",X"E5",X"D5",X"FD",X"7E",X"28", + X"E6",X"0F",X"87",X"5F",X"16",X"00",X"21",X"82",X"1B",X"19",X"5E",X"23",X"56",X"EB",X"56",X"23", + X"5E",X"EB",X"29",X"29",X"29",X"D1",X"19",X"EB",X"E1",X"C9",X"D5",X"DD",X"21",X"FC",X"63",X"11", + X"0B",X"00",X"06",X"0C",X"DD",X"CB",X"00",X"7E",X"28",X"06",X"DD",X"19",X"10",X"F6",X"D1",X"C9", + X"D1",X"7E",X"F6",X"80",X"DD",X"77",X"00",X"E5",X"21",X"00",X"01",X"A7",X"ED",X"52",X"E5",X"2A", + X"8C",X"63",X"55",X"5C",X"2A",X"A0",X"60",X"A7",X"ED",X"52",X"EB",X"E1",X"7C",X"65",X"FD",X"6E", + X"2C",X"A7",X"ED",X"52",X"DE",X"00",X"DD",X"77",X"02",X"DD",X"74",X"03",X"DD",X"75",X"04",X"E1", + X"23",X"23",X"23",X"FD",X"7E",X"2D",X"87",X"87",X"87",X"86",X"DD",X"77",X"05",X"DD",X"36",X"06", + X"00",X"DD",X"36",X"07",X"00",X"DD",X"36",X"08",X"00",X"3E",X"0C",X"90",X"DD",X"77",X"09",X"C9", + X"16",X"32",X"86",X"32",X"86",X"32",X"86",X"32",X"86",X"32",X"86",X"32",X"86",X"32",X"37",X"32", + X"86",X"32",X"44",X"32",X"51",X"32",X"86",X"32",X"86",X"32",X"86",X"32",X"86",X"32",X"86",X"32", + X"62",X"32",X"86",X"32",X"86",X"32",X"06",X"08",X"A8",X"B7",X"06",X"08",X"28",X"B7",X"06",X"05", + X"B8",X"A7",X"06",X"05",X"70",X"AF",X"06",X"04",X"6C",X"B7",X"06",X"03",X"20",X"B7",X"06",X"01", + X"B0",X"B3",X"06",X"00",X"90",X"B7",X"FF",X"06",X"01",X"E0",X"B7",X"06",X"01",X"00",X"B7",X"06", + X"00",X"20",X"B7",X"FF",X"06",X"01",X"28",X"B7",X"06",X"00",X"C0",X"B7",X"06",X"00",X"70",X"B7", + X"FF",X"06",X"02",X"08",X"B7",X"06",X"01",X"A0",X"B7",X"06",X"00",X"A8",X"A7",X"06",X"00",X"60", + X"A7",X"FF",X"06",X"09",X"10",X"8F",X"07",X"07",X"68",X"B7",X"06",X"05",X"B8",X"B7",X"06",X"04", + X"18",X"9F",X"07",X"03",X"38",X"B7",X"06",X"02",X"70",X"B7",X"06",X"01",X"E8",X"B7",X"06",X"01", + X"68",X"B7",X"07",X"00",X"F8",X"B7",X"FF",X"DD",X"7E",X"04",X"A7",X"28",X"04",X"DD",X"35",X"04", + X"C9",X"FD",X"7E",X"0B",X"E6",X"70",X"0F",X"0F",X"0F",X"5F",X"16",X"00",X"21",X"39",X"33",X"3A", + X"DC",X"60",X"A7",X"28",X"01",X"23",X"19",X"7E",X"DD",X"77",X"04",X"21",X"49",X"33",X"CB",X"3B", + X"19",X"DD",X"7E",X"05",X"BE",X"D0",X"CD",X"75",X"07",X"E6",X"01",X"20",X"11",X"CD",X"DF",X"32", + X"30",X"04",X"CD",X"F1",X"32",X"C9",X"CD",X"EB",X"32",X"D0",X"CD",X"F5",X"32",X"C9",X"CD",X"EB", + X"32",X"30",X"04",X"CD",X"F5",X"32",X"C9",X"CD",X"DF",X"32",X"D0",X"CD",X"F1",X"32",X"C9",X"FD", + X"7E",X"14",X"FE",X"11",X"D0",X"FD",X"7E",X"1E",X"FE",X"11",X"C9",X"FD",X"7E",X"32",X"FE",X"11", + X"C9",X"0E",X"FD",X"18",X"02",X"0E",X"04",X"DD",X"21",X"80",X"64",X"11",X"0A",X"00",X"06",X"08", + X"DD",X"CB",X"00",X"7E",X"28",X"05",X"DD",X"19",X"10",X"F6",X"C9",X"3E",X"08",X"90",X"CB",X"FF", + X"CB",X"79",X"28",X"02",X"CB",X"EF",X"DD",X"77",X"00",X"DD",X"71",X"02",X"DD",X"36",X"03",X"00", + X"DD",X"36",X"04",X"00",X"DD",X"36",X"05",X"80",X"DD",X"36",X"06",X"00",X"DD",X"36",X"07",X"00", + X"DD",X"36",X"08",X"00",X"21",X"F3",X"63",X"34",X"C9",X"40",X"20",X"23",X"19",X"1F",X"17",X"1B", + X"15",X"17",X"13",X"15",X"12",X"12",X"11",X"10",X"10",X"04",X"05",X"05",X"06",X"06",X"07",X"07", + X"08",X"3A",X"00",X"60",X"CB",X"77",X"C8",X"21",X"D0",X"64",X"CB",X"7E",X"C0",X"FD",X"7E",X"28", + X"E6",X"1F",X"C8",X"FE",X"04",X"D0",X"36",X"80",X"E5",X"DD",X"E1",X"DD",X"36",X"02",X"01",X"DD", + X"36",X"03",X"00",X"DD",X"36",X"04",X"00",X"FD",X"7E",X"2D",X"87",X"87",X"87",X"C6",X"B7",X"DD", + X"77",X"0B",X"47",X"D6",X"10",X"DD",X"77",X"0A",X"4F",X"FD",X"7E",X"28",X"FE",X"01",X"20",X"05", + X"DD",X"70",X"05",X"18",X"03",X"DD",X"71",X"05",X"DD",X"36",X"06",X"00",X"DD",X"36",X"07",X"00", + X"C9",X"FD",X"7E",X"32",X"E6",X"60",X"FE",X"40",X"C0",X"DD",X"7E",X"06",X"A7",X"28",X"04",X"DD", + X"35",X"06",X"C9",X"FD",X"7E",X"0B",X"E6",X"70",X"0F",X"0F",X"0F",X"5F",X"16",X"00",X"21",X"39", + X"33",X"3A",X"DC",X"60",X"A7",X"28",X"01",X"23",X"19",X"7E",X"CB",X"2F",X"CB",X"2F",X"DD",X"77", + X"06",X"21",X"49",X"33",X"CB",X"3B",X"19",X"DD",X"7E",X"0A",X"BE",X"D0",X"DD",X"21",X"80",X"64", + X"11",X"0A",X"00",X"06",X"08",X"DD",X"CB",X"00",X"7E",X"28",X"05",X"DD",X"19",X"10",X"F6",X"C9", + X"3E",X"08",X"90",X"F6",X"88",X"DD",X"77",X"00",X"DD",X"36",X"02",X"04",X"DD",X"36",X"03",X"00", + X"DD",X"36",X"04",X"00",X"DD",X"36",X"05",X"80",X"DD",X"36",X"06",X"00",X"DD",X"36",X"07",X"00", + X"DD",X"36",X"08",X"00",X"21",X"F8",X"63",X"34",X"3E",X"86",X"32",X"86",X"65",X"C9",X"3A",X"00", + X"60",X"E6",X"40",X"C8",X"FD",X"7E",X"28",X"FE",X"CC",X"20",X"08",X"FD",X"7E",X"2B",X"FE",X"18", + X"38",X"10",X"C9",X"E6",X"E0",X"FE",X"C0",X"C0",X"DD",X"7E",X"07",X"A7",X"28",X"04",X"DD",X"35", + X"07",X"C9",X"FD",X"7E",X"0B",X"E6",X"E0",X"07",X"07",X"07",X"5F",X"16",X"00",X"21",X"9D",X"34", + X"19",X"7E",X"DD",X"77",X"07",X"21",X"A7",X"34",X"19",X"DD",X"7E",X"08",X"BE",X"D0",X"DD",X"21", + X"DC",X"64",X"11",X"08",X"00",X"06",X"08",X"DD",X"CB",X"00",X"7E",X"28",X"05",X"DD",X"19",X"10", + X"F6",X"C9",X"3E",X"08",X"90",X"F6",X"80",X"DD",X"77",X"00",X"DD",X"36",X"02",X"00",X"DD",X"36", + X"03",X"FF",X"DD",X"36",X"04",X"00",X"CD",X"75",X"07",X"E6",X"0F",X"C6",X"7C",X"DD",X"77",X"05", + X"DD",X"36",X"06",X"00",X"DD",X"36",X"07",X"00",X"21",X"F6",X"63",X"34",X"C9",X"0D",X"0A",X"09", + X"09",X"08",X"07",X"07",X"06",X"05",X"05",X"04",X"05",X"05",X"06",X"06",X"07",X"07",X"08",X"08", + X"08",X"3A",X"00",X"60",X"E6",X"40",X"C8",X"FD",X"7E",X"1E",X"FE",X"49",X"20",X"1E",X"CD",X"24", + X"35",X"CD",X"33",X"35",X"D0",X"CD",X"75",X"07",X"FD",X"7E",X"20",X"A7",X"20",X"0A",X"FD",X"7E", + X"21",X"BC",X"30",X"04",X"CB",X"3C",X"BC",X"D8",X"CD",X"61",X"35",X"C9",X"FD",X"7E",X"28",X"FE", + X"49",X"28",X"0F",X"DD",X"CB",X"00",X"46",X"C8",X"DD",X"CB",X"00",X"86",X"1E",X"15",X"CD",X"0E", + X"07",X"C9",X"CD",X"24",X"35",X"CD",X"33",X"35",X"D0",X"21",X"C0",X"01",X"FD",X"56",X"2A",X"FD", + X"5E",X"2B",X"A7",X"ED",X"52",X"EB",X"21",X"00",X"01",X"A7",X"ED",X"52",X"30",X"05",X"CD",X"75", + X"07",X"18",X"0D",X"7D",X"F5",X"CD",X"75",X"07",X"F1",X"BC",X"38",X"04",X"CB",X"24",X"BC",X"D0", + X"CD",X"61",X"35",X"C9",X"DD",X"CB",X"00",X"46",X"C0",X"DD",X"CB",X"00",X"C6",X"1E",X"15",X"CD", + X"FB",X"06",X"C9",X"3A",X"DC",X"60",X"2F",X"E6",X"03",X"28",X"0A",X"DD",X"7E",X"07",X"A7",X"28", + X"04",X"DD",X"35",X"07",X"C9",X"FD",X"7E",X"0B",X"E6",X"E0",X"07",X"07",X"07",X"5F",X"16",X"00", + X"21",X"9F",X"34",X"19",X"7E",X"DD",X"77",X"07",X"21",X"A9",X"34",X"19",X"DD",X"7E",X"08",X"BE", + X"C9",X"DD",X"21",X"DC",X"64",X"11",X"08",X"00",X"06",X"08",X"DD",X"CB",X"00",X"7E",X"28",X"05", + X"DD",X"19",X"10",X"F6",X"C9",X"DD",X"36",X"02",X"00",X"DD",X"74",X"03",X"DD",X"36",X"04",X"00", + X"3E",X"08",X"90",X"F6",X"88",X"DD",X"77",X"00",X"DD",X"36",X"05",X"40",X"DD",X"36",X"06",X"00", + X"DD",X"36",X"07",X"00",X"21",X"F6",X"63",X"34",X"C9",X"45",X"3A",X"54",X"63",X"17",X"D2",X"FE", + X"35",X"DD",X"CB",X"00",X"6E",X"20",X"23",X"DD",X"CB",X"00",X"EE",X"DD",X"36",X"02",X"00",X"FD", + X"E5",X"11",X"6F",X"00",X"FD",X"19",X"11",X"08",X"00",X"06",X"18",X"2A",X"A0",X"60",X"FD",X"74", + X"06",X"FD",X"75",X"07",X"FD",X"19",X"10",X"F6",X"FD",X"E1",X"DD",X"7E",X"02",X"87",X"87",X"87", + X"5F",X"16",X"00",X"21",X"6F",X"00",X"19",X"EB",X"FD",X"19",X"11",X"18",X"00",X"06",X"03",X"FD", + X"CB",X"00",X"7E",X"28",X"07",X"D5",X"C5",X"CD",X"1E",X"36",X"C1",X"D1",X"FD",X"19",X"10",X"EF", + X"DD",X"34",X"02",X"DD",X"7E",X"02",X"FE",X"08",X"D8",X"DD",X"36",X"02",X"00",X"C9",X"11",X"6F", + X"00",X"FD",X"19",X"11",X"08",X"00",X"06",X"18",X"FD",X"CB",X"00",X"7E",X"28",X"07",X"C5",X"D5", + X"CD",X"98",X"36",X"D1",X"C1",X"FD",X"19",X"10",X"EF",X"DD",X"36",X"00",X"00",X"C9",X"2A",X"A0", + X"60",X"FD",X"56",X"06",X"FD",X"5E",X"07",X"FD",X"74",X"06",X"FD",X"75",X"07",X"A7",X"ED",X"52", + X"EB",X"FD",X"66",X"02",X"FD",X"6E",X"03",X"A7",X"ED",X"52",X"FD",X"74",X"02",X"FD",X"75",X"03", + X"30",X"04",X"FD",X"35",X"01",X"C9",X"6C",X"FD",X"66",X"01",X"11",X"E0",X"FE",X"19",X"D8",X"FD", + X"7E",X"00",X"E6",X"07",X"FE",X"01",X"20",X"0F",X"21",X"8A",X"63",X"CB",X"5E",X"20",X"05",X"FD", + X"35",X"00",X"18",X"03",X"FD",X"34",X"00",X"21",X"FC",X"63",X"11",X"0B",X"00",X"06",X"0C",X"CB", + X"7E",X"28",X"05",X"19",X"10",X"F9",X"18",X"1B",X"FD",X"7E",X"00",X"77",X"3E",X"0C",X"90",X"EB", + X"13",X"13",X"FD",X"E5",X"E1",X"23",X"01",X"05",X"00",X"ED",X"B0",X"EB",X"36",X"00",X"23",X"36", + X"00",X"23",X"77",X"FD",X"36",X"00",X"00",X"C9",X"3A",X"93",X"63",X"67",X"2E",X"00",X"FD",X"56", + X"06",X"FD",X"5E",X"07",X"A7",X"ED",X"52",X"EB",X"FD",X"66",X"02",X"FD",X"6E",X"03",X"A7",X"ED", + X"52",X"FD",X"74",X"02",X"FD",X"75",X"03",X"30",X"09",X"CB",X"7A",X"20",X"0C",X"FD",X"35",X"01", + X"18",X"07",X"CB",X"7A",X"28",X"03",X"FD",X"34",X"01",X"6C",X"FD",X"66",X"01",X"11",X"E0",X"FE", + X"19",X"D8",X"FD",X"36",X"00",X"00",X"C9",X"3A",X"00",X"60",X"E6",X"40",X"20",X"07",X"3A",X"54", + X"63",X"17",X"DA",X"37",X"3A",X"CD",X"7B",X"0B",X"30",X"08",X"DD",X"7E",X"02",X"CB",X"7F",X"C2", + X"37",X"3A",X"DD",X"7E",X"00",X"E6",X"07",X"FE",X"04",X"20",X"34",X"3A",X"8A",X"63",X"E6",X"0C", + X"20",X"5F",X"DD",X"66",X"02",X"DD",X"6E",X"03",X"11",X"FC",X"FE",X"19",X"38",X"53",X"21",X"8A", + X"63",X"CB",X"D6",X"21",X"90",X"63",X"36",X"00",X"23",X"DD",X"7E",X"05",X"E6",X"F8",X"0F",X"0F", + X"0F",X"D6",X"02",X"77",X"23",X"C6",X"02",X"77",X"3E",X"82",X"32",X"86",X"65",X"18",X"32",X"DD", + X"CB",X"00",X"66",X"C2",X"8C",X"39",X"3A",X"03",X"60",X"DD",X"AE",X"09",X"E6",X"03",X"20",X"48", + X"DD",X"7E",X"02",X"A7",X"20",X"1B",X"FD",X"21",X"54",X"63",X"CD",X"15",X"0A",X"28",X"12",X"06", + X"0F",X"0E",X"0B",X"CD",X"41",X"0A",X"30",X"09",X"FD",X"CB",X"00",X"E6",X"DD",X"CB",X"00",X"E6", + X"C9",X"DD",X"7E",X"00",X"E6",X"07",X"87",X"5F",X"16",X"00",X"21",X"77",X"37",X"19",X"5E",X"23", + X"56",X"EB",X"11",X"88",X"37",X"D5",X"E9",X"AD",X"37",X"37",X"3A",X"45",X"38",X"A6",X"38",X"87", + X"37",X"0F",X"39",X"87",X"37",X"79",X"39",X"C9",X"DD",X"7E",X"02",X"A7",X"C0",X"DD",X"7E",X"00", + X"E6",X"07",X"87",X"5F",X"16",X"00",X"21",X"C8",X"3A",X"19",X"DD",X"7E",X"07",X"A7",X"28",X"01", + X"23",X"4E",X"21",X"B8",X"3A",X"19",X"46",X"23",X"56",X"CD",X"02",X"06",X"C9",X"DD",X"7E",X"02", + X"A7",X"C0",X"DD",X"7E",X"07",X"A7",X"28",X"04",X"DD",X"35",X"07",X"C9",X"FD",X"21",X"54",X"63", + X"CD",X"15",X"0A",X"C8",X"DD",X"CB",X"00",X"5E",X"20",X"0C",X"DD",X"7E",X"03",X"FE",X"F0",X"D0", + X"FD",X"BE",X"03",X"D8",X"18",X"32",X"DD",X"7E",X"03",X"FD",X"96",X"03",X"D8",X"C8",X"57",X"ED", + X"4B",X"E3",X"60",X"CD",X"3C",X"3A",X"7C",X"B5",X"28",X"1E",X"DD",X"7E",X"05",X"FD",X"96",X"05", + X"D8",X"E5",X"57",X"ED",X"4B",X"7C",X"60",X"CD",X"3C",X"3A",X"EB",X"E1",X"7A",X"B3",X"C8",X"ED", + X"52",X"38",X"05",X"11",X"F0",X"FF",X"19",X"D8",X"CD",X"CB",X"42",X"C0",X"3E",X"08",X"90",X"F6", + X"80",X"77",X"E5",X"FD",X"E1",X"FD",X"36",X"02",X"00",X"DD",X"7E",X"03",X"FD",X"77",X"03",X"DD", + X"7E",X"04",X"FD",X"77",X"04",X"DD",X"7E",X"05",X"FD",X"77",X"05",X"FD",X"36",X"06",X"00",X"DD", + X"7E",X"09",X"FD",X"77",X"07",X"FD",X"36",X"08",X"00",X"3A",X"E1",X"60",X"DD",X"77",X"07",X"1E", + X"0D",X"CD",X"FB",X"06",X"C9",X"DD",X"7E",X"02",X"A7",X"C0",X"DD",X"7E",X"07",X"A7",X"28",X"04", + X"DD",X"35",X"07",X"C9",X"FD",X"21",X"54",X"63",X"CD",X"15",X"0A",X"C8",X"DD",X"7E",X"03",X"FE", + X"F0",X"D0",X"FD",X"BE",X"03",X"D8",X"CD",X"CB",X"42",X"C0",X"3E",X"08",X"90",X"F6",X"80",X"77", + X"E5",X"FD",X"E1",X"FD",X"36",X"02",X"00",X"DD",X"7E",X"03",X"FD",X"77",X"03",X"DD",X"7E",X"04", + X"FD",X"77",X"04",X"DD",X"7E",X"05",X"D6",X"08",X"FD",X"77",X"05",X"FD",X"36",X"06",X"00",X"DD", + X"7E",X"09",X"F6",X"10",X"FD",X"77",X"07",X"FD",X"36",X"08",X"00",X"FD",X"36",X"09",X"00",X"3A", + X"E1",X"60",X"DD",X"77",X"07",X"C9",X"3A",X"DC",X"60",X"E6",X"02",X"20",X"05",X"DD",X"CB",X"00", + X"5E",X"C8",X"DD",X"7E",X"02",X"A7",X"C0",X"DD",X"7E",X"07",X"A7",X"C0",X"FD",X"21",X"54",X"63", + X"CD",X"15",X"0A",X"C8",X"FD",X"7E",X"03",X"DD",X"96",X"03",X"D8",X"D6",X"10",X"D8",X"CD",X"CB", + X"42",X"C0",X"3E",X"08",X"90",X"F6",X"80",X"77",X"E5",X"FD",X"E1",X"FD",X"36",X"02",X"00",X"DD", + X"7E",X"03",X"C6",X"08",X"FD",X"77",X"03",X"DD",X"7E",X"04",X"FD",X"77",X"04",X"DD",X"7E",X"05", + X"D6",X"08",X"FD",X"77",X"05",X"FD",X"36",X"06",X"00",X"DD",X"7E",X"09",X"F6",X"20",X"FD",X"77", + X"07",X"FD",X"36",X"08",X"00",X"DD",X"36",X"07",X"3C",X"1E",X"0D",X"CD",X"FB",X"06",X"C9",X"DD", + X"7E",X"02",X"A7",X"C0",X"DD",X"7E",X"07",X"A7",X"28",X"04",X"DD",X"35",X"07",X"C9",X"FD",X"21", + X"54",X"63",X"CD",X"15",X"0A",X"C8",X"DD",X"7E",X"03",X"FE",X"F0",X"D0",X"FD",X"BE",X"03",X"D8", + X"CD",X"CB",X"42",X"C0",X"3E",X"08",X"90",X"F6",X"80",X"77",X"E5",X"FD",X"E1",X"FD",X"36",X"02", + X"00",X"DD",X"7E",X"03",X"D6",X"08",X"FD",X"77",X"03",X"DD",X"7E",X"04",X"FD",X"77",X"04",X"DD", + X"7E",X"05",X"C6",X"08",X"FD",X"77",X"05",X"FD",X"36",X"06",X"00",X"DD",X"7E",X"09",X"F6",X"30", + X"FD",X"77",X"07",X"FD",X"36",X"08",X"00",X"3A",X"59",X"63",X"FD",X"77",X"09",X"3A",X"E1",X"60", + X"DD",X"77",X"07",X"1E",X"0D",X"CD",X"FB",X"06",X"C9",X"DD",X"34",X"0A",X"DD",X"CB",X"0A",X"46", + X"20",X"05",X"DD",X"36",X"07",X"00",X"C9",X"DD",X"36",X"07",X"FF",X"C9",X"DD",X"7E",X"08",X"FE", + X"0C",X"D2",X"37",X"3A",X"A7",X"20",X"21",X"DD",X"7E",X"00",X"E6",X"07",X"5F",X"87",X"83",X"5F", + X"16",X"00",X"21",X"DA",X"3A",X"DD",X"7E",X"07",X"A7",X"28",X"03",X"21",X"F2",X"3A",X"19",X"EB", + X"CD",X"21",X"07",X"1E",X"01",X"CD",X"FB",X"06",X"DD",X"7E",X"08",X"DD",X"34",X"08",X"E6",X"0C", + X"28",X"06",X"FE",X"04",X"28",X"1B",X"18",X"52",X"01",X"98",X"C0",X"16",X"0D",X"CD",X"02",X"06", + X"DD",X"7E",X"00",X"E6",X"07",X"FE",X"07",X"C0",X"DD",X"7E",X"08",X"FE",X"02",X"CC",X"56",X"3A", + X"C9",X"11",X"F8",X"F8",X"CD",X"EF",X"0B",X"01",X"9C",X"C0",X"16",X"00",X"CD",X"08",X"06",X"11", + X"F8",X"08",X"CD",X"EF",X"0B",X"01",X"A0",X"C0",X"16",X"00",X"CD",X"08",X"06",X"11",X"08",X"F8", + X"CD",X"EF",X"0B",X"01",X"A4",X"C0",X"16",X"00",X"CD",X"08",X"06",X"11",X"08",X"08",X"CD",X"EF", + X"0B",X"01",X"EC",X"C0",X"16",X"00",X"CD",X"08",X"06",X"C9",X"11",X"00",X"F8",X"CD",X"EF",X"0B", + X"01",X"F0",X"C0",X"16",X"02",X"CD",X"08",X"06",X"11",X"00",X"08",X"CD",X"EF",X"0B",X"01",X"F4", + X"C0",X"16",X"02",X"CD",X"08",X"06",X"C9",X"DD",X"36",X"00",X"00",X"C9",X"3E",X"08",X"1E",X"00", + X"21",X"00",X"00",X"CB",X"22",X"30",X"04",X"09",X"30",X"01",X"1C",X"3D",X"28",X"05",X"29",X"CB", + X"13",X"18",X"F0",X"6C",X"63",X"C9",X"11",X"95",X"68",X"21",X"E0",X"D4",X"01",X"40",X"02",X"7E", + X"12",X"E6",X"08",X"77",X"13",X"23",X"0B",X"78",X"B1",X"20",X"F4",X"1E",X"07",X"CD",X"FB",X"06", + X"F7",X"CD",X"8B",X"50",X"FD",X"21",X"80",X"64",X"11",X"0A",X"00",X"06",X"08",X"CD",X"15",X"0A", + X"28",X"0A",X"FD",X"7E",X"02",X"A7",X"20",X"04",X"FD",X"CB",X"00",X"E6",X"FD",X"19",X"10",X"ED", + X"FD",X"21",X"FC",X"63",X"11",X"0B",X"00",X"06",X"0C",X"CD",X"15",X"0A",X"28",X"0A",X"FD",X"7E", + X"02",X"A7",X"20",X"04",X"FD",X"CB",X"00",X"E6",X"FD",X"19",X"10",X"ED",X"21",X"95",X"68",X"11", + X"E0",X"D4",X"01",X"40",X"02",X"ED",X"B0",X"C9",X"C0",X"08",X"80",X"00",X"C0",X"02",X"C0",X"0D", + X"C0",X"0B",X"F0",X"0D",X"C0",X"00",X"C0",X"00",X"08",X"0C",X"00",X"00",X"30",X"30",X"20",X"24", + X"48",X"48",X"20",X"24",X"4C",X"4C",X"F8",X"FC",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"50",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"01",X"00",X"00",X"03",X"00", + X"00",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"50",X"00",X"00",X"50",X"00",X"00",X"00",X"00", + X"00",X"50",X"00",X"01",X"00",X"00",X"03",X"00",X"DD",X"CB",X"00",X"5E",X"C2",X"BA",X"3E",X"DD", + X"7E",X"02",X"A7",X"28",X"07",X"3A",X"54",X"63",X"17",X"D2",X"52",X"3E",X"DD",X"CB",X"00",X"66", + X"C2",X"A6",X"3D",X"06",X"05",X"CD",X"7A",X"06",X"DD",X"7E",X"02",X"A7",X"28",X"62",X"FA",X"19", + X"3D",X"DD",X"CB",X"00",X"6E",X"20",X"1F",X"CD",X"7B",X"0B",X"FD",X"7E",X"28",X"FE",X"11",X"DC", + X"85",X"0B",X"FD",X"7E",X"28",X"FD",X"46",X"2D",X"CD",X"5B",X"3E",X"DD",X"7E",X"02",X"A7",X"C0", + X"1E",X"10",X"CD",X"FB",X"06",X"C9",X"FD",X"7E",X"32",X"FE",X"11",X"30",X"29",X"21",X"00",X"08", + X"ED",X"5B",X"7C",X"60",X"A7",X"ED",X"52",X"DD",X"56",X"03",X"DD",X"5E",X"04",X"19",X"DD",X"74", + X"03",X"DD",X"75",X"04",X"30",X"0A",X"DD",X"34",X"02",X"DD",X"7E",X"02",X"FE",X"02",X"30",X"06", + X"06",X"80",X"CD",X"6A",X"3E",X"C9",X"DD",X"CB",X"00",X"AE",X"3E",X"80",X"32",X"86",X"65",X"C9", + X"DD",X"CB",X"00",X"6E",X"28",X"31",X"FD",X"7E",X"28",X"FE",X"11",X"30",X"26",X"ED",X"5B",X"7C", + X"60",X"CB",X"3A",X"CB",X"1B",X"21",X"00",X"04",X"A7",X"ED",X"52",X"DD",X"56",X"03",X"DD",X"5E", + X"04",X"19",X"DD",X"74",X"03",X"DD",X"75",X"04",X"30",X"36",X"DD",X"34",X"02",X"1E",X"10",X"CD", + X"0E",X"07",X"C9",X"DD",X"CB",X"00",X"AE",X"DD",X"66",X"03",X"DD",X"6E",X"04",X"ED",X"5B",X"7C", + X"60",X"7A",X"B3",X"20",X"05",X"11",X"00",X"04",X"18",X"0B",X"FD",X"7E",X"1E",X"FE",X"11",X"38", + X"04",X"CB",X"3A",X"CB",X"1B",X"CD",X"85",X"0B",X"30",X"06",X"1E",X"10",X"CD",X"0E",X"07",X"C9", + X"FD",X"7E",X"20",X"A7",X"20",X"08",X"FD",X"7E",X"21",X"DD",X"BE",X"03",X"38",X"0B",X"FD",X"7E", + X"1E",X"FD",X"46",X"23",X"CD",X"5B",X"3E",X"18",X"09",X"FD",X"7E",X"28",X"FD",X"46",X"2D",X"CD", + X"5B",X"3E",X"06",X"C0",X"0E",X"04",X"16",X"01",X"CD",X"02",X"06",X"3A",X"03",X"60",X"DD",X"AE", + X"00",X"E6",X"03",X"C0",X"FD",X"21",X"54",X"63",X"CD",X"15",X"0A",X"28",X"0A",X"06",X"0F",X"0E", + X"07",X"CD",X"41",X"0A",X"DA",X"BA",X"3C",X"FD",X"21",X"60",X"63",X"CD",X"15",X"0A",X"28",X"09", + X"06",X"18",X"0E",X"05",X"CD",X"41",X"0A",X"38",X"71",X"FD",X"21",X"68",X"63",X"CD",X"15",X"0A", + X"28",X"0F",X"FD",X"CB",X"00",X"46",X"20",X"09",X"06",X"0B",X"0E",X"05",X"CD",X"41",X"0A",X"38", + X"59",X"FD",X"21",X"79",X"63",X"CD",X"15",X"0A",X"28",X"0F",X"FD",X"CB",X"00",X"46",X"20",X"09", + X"06",X"0B",X"0E",X"05",X"CD",X"41",X"0A",X"38",X"41",X"FD",X"21",X"D0",X"64",X"CD",X"15",X"0A", + X"28",X"09",X"06",X"0F",X"0E",X"0A",X"CD",X"41",X"0A",X"38",X"2F",X"DD",X"7E",X"00",X"E6",X"07", + X"28",X"31",X"FD",X"21",X"BC",X"64",X"11",X"F6",X"FF",X"67",X"D6",X"07",X"28",X"07",X"ED",X"44", + X"FD",X"19",X"3D",X"20",X"FB",X"06",X"10",X"0E",X"08",X"CD",X"15",X"0A",X"28",X"05",X"CD",X"41", + X"0A",X"38",X"07",X"FD",X"19",X"25",X"20",X"F1",X"18",X"09",X"FD",X"CB",X"00",X"E6",X"DD",X"CB", + X"00",X"E6",X"C9",X"FD",X"21",X"54",X"63",X"CD",X"15",X"0A",X"C8",X"DD",X"7E",X"08",X"A7",X"28", + X"04",X"DD",X"35",X"08",X"C9",X"CD",X"CB",X"42",X"C0",X"3E",X"08",X"90",X"F6",X"80",X"77",X"E5", + X"FD",X"E1",X"FD",X"36",X"02",X"00",X"DD",X"7E",X"03",X"FD",X"77",X"03",X"DD",X"7E",X"04",X"FD", + X"77",X"04",X"DD",X"7E",X"05",X"FD",X"77",X"05",X"DD",X"7E",X"06",X"FD",X"77",X"06",X"DD",X"7E", + X"00",X"E6",X"07",X"F6",X"40",X"FD",X"77",X"07",X"FD",X"36",X"08",X"00",X"CD",X"DA",X"42",X"DD", + X"36",X"08",X"08",X"1E",X"0F",X"CD",X"FB",X"06",X"C9",X"DD",X"CB",X"00",X"6E",X"20",X"30",X"CD", + X"7B",X"0B",X"FD",X"7E",X"14",X"FE",X"11",X"DC",X"85",X"0B",X"06",X"80",X"CD",X"6A",X"3E",X"DD", + X"7E",X"02",X"FE",X"FF",X"D0",X"FE",X"FD",X"DA",X"52",X"3E",X"FD",X"7E",X"1E",X"FE",X"11",X"D0", + X"DD",X"CB",X"00",X"EE",X"1E",X"0C",X"CD",X"FB",X"06",X"3E",X"80",X"32",X"86",X"65",X"C9",X"FD", + X"7E",X"1E",X"FE",X"11",X"30",X"46",X"21",X"00",X"08",X"ED",X"5B",X"7C",X"60",X"A7",X"ED",X"52", + X"DD",X"56",X"03",X"DD",X"5E",X"04",X"19",X"DD",X"74",X"03",X"DD",X"75",X"04",X"30",X"23",X"DD", + X"34",X"02",X"DD",X"7E",X"02",X"A7",X"28",X"10",X"FE",X"FE",X"20",X"16",X"1E",X"0C",X"CD",X"FB", + X"06",X"3E",X"80",X"32",X"86",X"65",X"18",X"0A",X"1E",X"10",X"CD",X"FB",X"06",X"1E",X"0C",X"CD", + X"0E",X"07",X"FD",X"7E",X"1E",X"FD",X"46",X"23",X"CD",X"5B",X"3E",X"C9",X"DD",X"CB",X"00",X"AE", + X"1E",X"0C",X"CD",X"0E",X"07",X"C9",X"DD",X"7E",X"07",X"FE",X"0C",X"D2",X"52",X"3E",X"A7",X"20", + X"10",X"11",X"92",X"40",X"CD",X"21",X"07",X"1E",X"10",X"CD",X"0E",X"07",X"1E",X"0A",X"CD",X"FB", + X"06",X"CD",X"7B",X"0B",X"DA",X"52",X"3E",X"DD",X"7E",X"07",X"DD",X"34",X"07",X"E6",X"0C",X"28", + X"06",X"FE",X"04",X"28",X"0B",X"18",X"42",X"01",X"A8",X"C0",X"16",X"0F",X"CD",X"02",X"06",X"C9", + X"11",X"F8",X"F8",X"CD",X"EF",X"0B",X"01",X"AC",X"C0",X"16",X"00",X"CD",X"08",X"06",X"11",X"F8", + X"08",X"CD",X"EF",X"0B",X"01",X"B0",X"C0",X"16",X"00",X"CD",X"08",X"06",X"11",X"08",X"F8",X"CD", + X"EF",X"0B",X"01",X"B0",X"F0",X"16",X"00",X"CD",X"08",X"06",X"11",X"08",X"08",X"CD",X"EF",X"0B", + X"01",X"AC",X"F0",X"16",X"00",X"CD",X"08",X"06",X"C9",X"11",X"F8",X"F8",X"CD",X"EF",X"0B",X"01", + X"B4",X"C0",X"16",X"0C",X"CD",X"08",X"06",X"11",X"F8",X"08",X"CD",X"EF",X"0B",X"01",X"B8",X"C0", + X"16",X"0C",X"CD",X"08",X"06",X"11",X"08",X"F8",X"CD",X"EF",X"0B",X"01",X"B8",X"F0",X"16",X"0C", + X"CD",X"08",X"06",X"11",X"08",X"08",X"CD",X"EF",X"0B",X"01",X"B4",X"F0",X"16",X"0C",X"CD",X"08", + X"06",X"C9",X"DD",X"36",X"00",X"00",X"21",X"F3",X"63",X"35",X"C9",X"E6",X"1F",X"5F",X"16",X"00", + X"21",X"A7",X"3E",X"19",X"78",X"87",X"87",X"87",X"86",X"47",X"DD",X"34",X"09",X"DD",X"7E",X"05", + X"FE",X"40",X"38",X"09",X"B8",X"30",X"1B",X"DD",X"CB",X"09",X"7E",X"20",X"15",X"DD",X"66",X"05", + X"DD",X"6E",X"06",X"11",X"00",X"01",X"19",X"DD",X"74",X"05",X"DD",X"75",X"06",X"DD",X"CB",X"09", + X"BE",X"C9",X"DD",X"66",X"05",X"DD",X"6E",X"06",X"11",X"00",X"FF",X"19",X"DD",X"74",X"05",X"DD", + X"75",X"06",X"DD",X"CB",X"09",X"FE",X"C9",X"70",X"B0",X"A8",X"A8",X"A8",X"70",X"38",X"88",X"38", + X"88",X"88",X"38",X"78",X"38",X"70",X"38",X"58",X"88",X"38",X"DD",X"7E",X"02",X"A7",X"28",X"07", + X"3A",X"54",X"63",X"17",X"D2",X"49",X"40",X"DD",X"CB",X"00",X"66",X"C2",X"27",X"40",X"06",X"05", + X"CD",X"7A",X"06",X"DD",X"7E",X"02",X"A7",X"FA",X"12",X"40",X"28",X"1B",X"CD",X"7B",X"0B",X"FD", + X"7E",X"28",X"E6",X"60",X"FE",X"40",X"CC",X"85",X"0B",X"CD",X"52",X"40",X"DD",X"7E",X"02",X"A7", + X"C0",X"1E",X"14",X"CD",X"FB",X"06",X"C9",X"ED",X"5B",X"7C",X"60",X"7A",X"B3",X"20",X"03",X"11", + X"00",X"04",X"DD",X"66",X"03",X"DD",X"6E",X"04",X"CD",X"85",X"0B",X"30",X"06",X"1E",X"14",X"CD", + X"0E",X"07",X"C9",X"CD",X"52",X"40",X"06",X"C0",X"0E",X"68",X"16",X"0B",X"CD",X"02",X"06",X"3A", + X"03",X"60",X"DD",X"AE",X"00",X"E6",X"03",X"C0",X"FD",X"21",X"54",X"63",X"CD",X"15",X"0A",X"28", + X"09",X"06",X"0F",X"0E",X"07",X"CD",X"41",X"0A",X"38",X"71",X"FD",X"21",X"60",X"63",X"CD",X"15", + X"0A",X"28",X"09",X"06",X"18",X"0E",X"05",X"CD",X"41",X"0A",X"38",X"5F",X"FD",X"21",X"68",X"63", + X"CD",X"15",X"0A",X"28",X"0F",X"FD",X"CB",X"00",X"46",X"20",X"09",X"06",X"0B",X"0E",X"05",X"CD", + X"41",X"0A",X"38",X"47",X"FD",X"21",X"79",X"63",X"CD",X"15",X"0A",X"28",X"0F",X"FD",X"CB",X"00", + X"46",X"20",X"09",X"06",X"0B",X"0E",X"05",X"CD",X"41",X"0A",X"38",X"2F",X"DD",X"7E",X"00",X"E6", + X"07",X"28",X"31",X"FD",X"21",X"BC",X"64",X"11",X"F6",X"FF",X"67",X"D6",X"07",X"28",X"07",X"ED", + X"44",X"FD",X"19",X"3D",X"20",X"FB",X"06",X"10",X"0E",X"08",X"CD",X"15",X"0A",X"28",X"05",X"CD", + X"41",X"0A",X"38",X"07",X"FD",X"19",X"25",X"20",X"F1",X"18",X"09",X"DD",X"CB",X"00",X"E6",X"FD", + X"CB",X"00",X"E6",X"C9",X"FD",X"21",X"54",X"63",X"CD",X"15",X"0A",X"C8",X"DD",X"7E",X"08",X"A7", + X"28",X"04",X"DD",X"35",X"08",X"C9",X"3A",X"57",X"63",X"DD",X"BE",X"03",X"D0",X"CD",X"CB",X"42", + X"C0",X"3E",X"08",X"90",X"F6",X"80",X"77",X"E5",X"FD",X"E1",X"FD",X"36",X"02",X"00",X"DD",X"7E", + X"03",X"D6",X"08",X"FD",X"77",X"03",X"DD",X"7E",X"04",X"FD",X"77",X"04",X"DD",X"7E",X"05",X"C6", + X"02",X"FD",X"77",X"05",X"DD",X"7E",X"06",X"FD",X"77",X"06",X"DD",X"7E",X"00",X"E6",X"07",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_cpu3.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_cpu3.vhd new file mode 100644 index 00000000..1d8e63da --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_cpu3.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_cpu3 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 prom of rom_cpu3 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"60",X"FD",X"77",X"07",X"FD",X"36",X"08",X"00",X"DD",X"36",X"08",X"08",X"1E",X"09",X"CD",X"FB", + X"06",X"C9",X"CD",X"7B",X"0B",X"FD",X"7E",X"14",X"E6",X"60",X"FE",X"40",X"CC",X"85",X"0B",X"DD", + X"7E",X"02",X"FE",X"FD",X"38",X"23",X"C9",X"DD",X"7E",X"07",X"FE",X"0C",X"30",X"1B",X"A7",X"20", + X"10",X"11",X"95",X"40",X"CD",X"21",X"07",X"1E",X"14",X"CD",X"0E",X"07",X"1E",X"02",X"CD",X"FB", + X"06",X"CD",X"7B",X"0B",X"38",X"03",X"C3",X"C7",X"3D",X"DD",X"36",X"00",X"00",X"21",X"F8",X"63", + X"35",X"C9",X"DD",X"34",X"09",X"DD",X"7E",X"05",X"FE",X"7C",X"38",X"0A",X"FE",X"8B",X"30",X"1B", + X"DD",X"CB",X"09",X"76",X"20",X"15",X"DD",X"66",X"05",X"DD",X"6E",X"06",X"11",X"80",X"00",X"19", + X"DD",X"74",X"05",X"DD",X"75",X"06",X"DD",X"CB",X"09",X"B6",X"C9",X"DD",X"66",X"05",X"DD",X"6E", + X"06",X"11",X"80",X"FF",X"19",X"DD",X"74",X"05",X"DD",X"75",X"06",X"DD",X"CB",X"09",X"F6",X"C9", + X"00",X"01",X"00",X"00",X"01",X"00",X"DD",X"CB",X"00",X"66",X"C2",X"28",X"42",X"DD",X"7E",X"02", + X"A7",X"28",X"0D",X"FA",X"C0",X"42",X"CD",X"7B",X"0B",X"D0",X"1E",X"0E",X"CD",X"FB",X"06",X"C9", + X"DD",X"7E",X"05",X"C6",X"05",X"E6",X"F8",X"5F",X"CD",X"F6",X"0A",X"DD",X"86",X"03",X"C6",X"05", + X"E6",X"F8",X"57",X"CD",X"03",X"0B",X"CD",X"15",X"0B",X"20",X"31",X"DD",X"7E",X"05",X"C6",X"09", + X"E6",X"F8",X"5F",X"CD",X"F6",X"0A",X"DD",X"86",X"03",X"C6",X"09",X"E6",X"F8",X"57",X"CD",X"03", + X"0B",X"CD",X"15",X"0B",X"20",X"2F",X"2A",X"7C",X"60",X"CB",X"3C",X"CB",X"1D",X"DD",X"56",X"05", + X"DD",X"5E",X"06",X"19",X"DD",X"74",X"05",X"DD",X"75",X"06",X"18",X"46",X"ED",X"5B",X"7C",X"60", + X"CB",X"3A",X"CB",X"1B",X"DD",X"66",X"05",X"DD",X"6E",X"06",X"A7",X"ED",X"52",X"DD",X"74",X"05", + X"DD",X"75",X"06",X"18",X"2D",X"DD",X"7E",X"05",X"4F",X"DD",X"96",X"0A",X"28",X"24",X"47",X"79", + X"DD",X"96",X"0B",X"28",X"1D",X"30",X"02",X"ED",X"44",X"4F",X"78",X"CB",X"7F",X"28",X"02",X"ED", + X"44",X"B9",X"30",X"08",X"DD",X"7E",X"0A",X"DD",X"77",X"05",X"18",X"06",X"DD",X"7E",X"0B",X"DD", + X"77",X"05",X"ED",X"5B",X"7C",X"60",X"DD",X"66",X"03",X"DD",X"6E",X"04",X"FD",X"7E",X"28",X"E6", + X"1F",X"28",X"08",X"FE",X"04",X"30",X"04",X"CB",X"3A",X"CB",X"1B",X"CD",X"85",X"0B",X"30",X"06", + X"1E",X"0E",X"CD",X"0E",X"07",X"C9",X"FD",X"21",X"54",X"63",X"CD",X"15",X"0A",X"28",X"09",X"06", + X"0E",X"0E",X"09",X"CD",X"41",X"0A",X"38",X"12",X"FD",X"21",X"60",X"63",X"CD",X"15",X"0A",X"28", + X"12",X"06",X"17",X"0E",X"07",X"CD",X"41",X"0A",X"30",X"09",X"DD",X"CB",X"00",X"E6",X"FD",X"CB", + X"00",X"E6",X"C9",X"FD",X"21",X"54",X"63",X"CD",X"15",X"0A",X"28",X"5F",X"DD",X"7E",X"08",X"A7", + X"28",X"13",X"DD",X"35",X"08",X"3A",X"E2",X"60",X"CB",X"2F",X"DD",X"BE",X"08",X"38",X"4C",X"DD", + X"CB",X"00",X"86",X"18",X"46",X"CD",X"CB",X"42",X"20",X"41",X"3E",X"08",X"90",X"F6",X"80",X"77", + X"E5",X"FD",X"E1",X"FD",X"36",X"02",X"00",X"DD",X"7E",X"03",X"D6",X"02",X"FD",X"77",X"03",X"DD", + X"7E",X"04",X"FD",X"77",X"04",X"DD",X"7E",X"05",X"D6",X"03",X"FD",X"77",X"05",X"FD",X"36",X"06", + X"00",X"FD",X"36",X"07",X"50",X"FD",X"36",X"08",X"00",X"CD",X"DA",X"42",X"DD",X"CB",X"00",X"C6", + X"3A",X"E2",X"60",X"DD",X"77",X"08",X"1E",X"0B",X"CD",X"FB",X"06",X"06",X"C0",X"0E",X"50",X"16", + X"04",X"3A",X"54",X"63",X"17",X"30",X"1D",X"DD",X"34",X"09",X"DD",X"CB",X"00",X"46",X"20",X"0A", + X"DD",X"CB",X"09",X"5E",X"28",X"0E",X"0E",X"54",X"18",X"0A",X"0E",X"58",X"DD",X"CB",X"09",X"5E", + X"28",X"02",X"0E",X"5C",X"CD",X"02",X"06",X"C9",X"DD",X"7E",X"07",X"FE",X"0C",X"D2",X"C0",X"42", + X"A7",X"20",X"19",X"11",X"C7",X"42",X"DD",X"CB",X"00",X"46",X"20",X"03",X"11",X"CA",X"42",X"CD", + X"21",X"07",X"1E",X"0E",X"CD",X"0E",X"07",X"1E",X"01",X"CD",X"FB",X"06",X"CD",X"7B",X"0B",X"38", + X"6F",X"DD",X"7E",X"07",X"DD",X"34",X"07",X"E6",X"0C",X"28",X"06",X"FE",X"04",X"28",X"0B",X"18", + X"42",X"01",X"98",X"C0",X"16",X"0D",X"CD",X"02",X"06",X"C9",X"11",X"F8",X"F8",X"CD",X"EF",X"0B", + X"01",X"9C",X"C0",X"16",X"00",X"CD",X"08",X"06",X"11",X"F8",X"08",X"CD",X"EF",X"0B",X"01",X"A0", + X"C0",X"16",X"00",X"CD",X"08",X"06",X"11",X"08",X"F8",X"CD",X"EF",X"0B",X"01",X"A4",X"C0",X"16", + X"00",X"CD",X"08",X"06",X"11",X"08",X"08",X"CD",X"EF",X"0B",X"01",X"EC",X"C0",X"16",X"00",X"CD", + X"08",X"06",X"C9",X"11",X"00",X"F8",X"CD",X"EF",X"0B",X"01",X"F0",X"C0",X"16",X"02",X"CD",X"08", + X"06",X"11",X"00",X"08",X"CD",X"EF",X"0B",X"01",X"F4",X"C0",X"16",X"02",X"CD",X"08",X"06",X"C9", + X"DD",X"36",X"00",X"00",X"C9",X"00",X"01",X"00",X"00",X"01",X"30",X"21",X"1C",X"65",X"11",X"0D", + X"00",X"06",X"08",X"CB",X"7E",X"C8",X"19",X"10",X"FA",X"C9",X"3A",X"57",X"63",X"DD",X"96",X"03", + X"30",X"02",X"ED",X"44",X"47",X"3A",X"59",X"63",X"DD",X"96",X"05",X"30",X"02",X"ED",X"44",X"4F", + X"B8",X"30",X"1D",X"69",X"59",X"26",X"00",X"16",X"00",X"29",X"29",X"19",X"58",X"ED",X"52",X"38", + X"2C",X"69",X"59",X"26",X"00",X"29",X"19",X"EB",X"68",X"29",X"ED",X"52",X"38",X"31",X"18",X"26", + X"68",X"58",X"26",X"00",X"16",X"00",X"29",X"29",X"19",X"59",X"ED",X"52",X"38",X"33",X"68",X"58", + X"26",X"00",X"29",X"19",X"EB",X"69",X"29",X"ED",X"52",X"38",X"14",X"18",X"1B",X"ED",X"5B",X"80", + X"43",X"2A",X"82",X"43",X"18",X"22",X"ED",X"5B",X"84",X"43",X"2A",X"86",X"43",X"18",X"19",X"ED", + X"5B",X"88",X"43",X"2A",X"8A",X"43",X"18",X"10",X"ED",X"5B",X"8C",X"43",X"2A",X"8E",X"43",X"18", + X"07",X"ED",X"5B",X"90",X"43",X"2A",X"92",X"43",X"3A",X"59",X"63",X"DD",X"96",X"05",X"DC",X"78", + X"43",X"FD",X"74",X"0B",X"FD",X"75",X"0C",X"EB",X"3A",X"57",X"63",X"DD",X"96",X"03",X"DC",X"78", + X"43",X"FD",X"74",X"09",X"FD",X"75",X"0A",X"C9",X"7D",X"2F",X"6F",X"7C",X"2F",X"67",X"23",X"C9", + X"00",X"03",X"00",X"00",X"C6",X"02",X"26",X"01",X"1F",X"02",X"1F",X"02",X"26",X"01",X"C6",X"02", + X"00",X"00",X"00",X"03",X"DD",X"CB",X"00",X"5E",X"C2",X"8B",X"45",X"DD",X"CB",X"00",X"66",X"C2", + X"68",X"44",X"CD",X"7B",X"0B",X"DA",X"82",X"45",X"DD",X"66",X"05",X"DD",X"6E",X"06",X"DD",X"CB", + X"00",X"6E",X"20",X"0F",X"11",X"80",X"00",X"19",X"7C",X"FE",X"8A",X"38",X"15",X"DD",X"CB",X"00", + X"EE",X"18",X"15",X"11",X"80",X"FF",X"19",X"7C",X"FE",X"7C",X"30",X"06",X"DD",X"CB",X"00",X"AE", + X"18",X"06",X"DD",X"74",X"05",X"DD",X"75",X"06",X"3A",X"03",X"60",X"DD",X"AE",X"00",X"E6",X"03", + X"C2",X"5E",X"44",X"FD",X"21",X"54",X"63",X"CD",X"15",X"0A",X"28",X"09",X"06",X"0C",X"0E",X"08", + X"CD",X"41",X"0A",X"38",X"60",X"FD",X"21",X"60",X"63",X"CD",X"15",X"0A",X"28",X"09",X"06",X"15", + X"0E",X"06",X"CD",X"41",X"0A",X"38",X"4E",X"FD",X"21",X"68",X"63",X"CD",X"15",X"0A",X"28",X"0F", + X"FD",X"CB",X"00",X"46",X"20",X"09",X"06",X"08",X"0E",X"06",X"CD",X"41",X"0A",X"38",X"36",X"FD", + X"21",X"79",X"63",X"CD",X"15",X"0A",X"28",X"0F",X"FD",X"CB",X"00",X"46",X"20",X"09",X"06",X"08", + X"0E",X"06",X"CD",X"41",X"0A",X"38",X"1E",X"FD",X"21",X"80",X"64",X"11",X"0A",X"00",X"06",X"0D", + X"0E",X"09",X"26",X"08",X"CD",X"15",X"0A",X"28",X"05",X"CD",X"41",X"0A",X"38",X"07",X"FD",X"19", + X"25",X"20",X"F1",X"18",X"09",X"DD",X"CB",X"00",X"E6",X"FD",X"CB",X"00",X"E6",X"C9",X"06",X"C0", + X"0E",X"60",X"16",X"0C",X"CD",X"02",X"06",X"C9",X"DD",X"7E",X"07",X"FE",X"28",X"D2",X"82",X"45", + X"A7",X"20",X"0B",X"11",X"48",X"46",X"CD",X"21",X"07",X"1E",X"11",X"CD",X"FB",X"06",X"CD",X"7B", + X"0B",X"DA",X"82",X"45",X"DD",X"7E",X"07",X"CD",X"A9",X"0B",X"3A",X"03",X"60",X"DD",X"AE",X"00", + X"E6",X"03",X"C2",X"7E",X"45",X"DD",X"7E",X"07",X"CD",X"1F",X"0A",X"FD",X"21",X"54",X"63",X"CD", + X"15",X"0A",X"28",X"0A",X"06",X"07",X"0E",X"03",X"CD",X"39",X"0A",X"DA",X"7A",X"45",X"FD",X"21", + X"60",X"63",X"CD",X"15",X"0A",X"28",X"0A",X"06",X"10",X"0E",X"01",X"CD",X"39",X"0A",X"DA",X"7A", + X"45",X"FD",X"21",X"68",X"63",X"CD",X"15",X"0A",X"28",X"10",X"FD",X"CB",X"00",X"46",X"20",X"0A", + X"06",X"03",X"0E",X"01",X"CD",X"39",X"0A",X"DA",X"7A",X"45",X"FD",X"21",X"79",X"63",X"CD",X"15", + X"0A",X"28",X"10",X"FD",X"CB",X"00",X"46",X"20",X"0A",X"06",X"03",X"0E",X"01",X"CD",X"39",X"0A", + X"DA",X"7A",X"45",X"FD",X"21",X"FC",X"63",X"11",X"0B",X"00",X"06",X"0C",X"CD",X"15",X"0A",X"28", + X"0B",X"C5",X"06",X"08",X"0E",X"08",X"CD",X"39",X"0A",X"C1",X"38",X"6E",X"FD",X"19",X"10",X"EC", + X"FD",X"21",X"80",X"64",X"11",X"0A",X"00",X"06",X"08",X"CD",X"15",X"0A",X"28",X"0B",X"C5",X"06", + X"08",X"0E",X"04",X"CD",X"39",X"0A",X"C1",X"38",X"51",X"FD",X"19",X"10",X"EC",X"FD",X"21",X"DC", + X"64",X"11",X"08",X"00",X"06",X"08",X"CD",X"15",X"0A",X"28",X"15",X"C5",X"06",X"05",X"0E",X"05", + X"FD",X"CB",X"00",X"5E",X"28",X"04",X"06",X"04",X"0E",X"06",X"CD",X"39",X"0A",X"C1",X"38",X"2A", + X"FD",X"19",X"10",X"E2",X"FD",X"21",X"1C",X"65",X"11",X"0D",X"00",X"06",X"08",X"CD",X"15",X"0A", + X"28",X"12",X"C5",X"D5",X"01",X"00",X"00",X"FD",X"7E",X"07",X"CD",X"0E",X"4C",X"CD",X"39",X"0A", + X"D1",X"C1",X"38",X"06",X"FD",X"19",X"10",X"E5",X"18",X"04",X"FD",X"CB",X"00",X"E6",X"DD",X"34", + X"07",X"C9",X"DD",X"36",X"00",X"00",X"21",X"F6",X"63",X"35",X"C9",X"DD",X"CB",X"00",X"66",X"C2", + X"35",X"46",X"CD",X"7B",X"0B",X"38",X"EB",X"21",X"00",X"01",X"DD",X"56",X"05",X"DD",X"5E",X"06", + X"19",X"DD",X"74",X"05",X"DD",X"75",X"06",X"3A",X"03",X"60",X"DD",X"AE",X"00",X"E6",X"03",X"C2", + X"2B",X"46",X"06",X"04",X"0E",X"06",X"CD",X"60",X"0A",X"28",X"09",X"DD",X"CB",X"00",X"EE",X"DD", + X"CB",X"00",X"E6",X"C9",X"FD",X"21",X"54",X"63",X"CD",X"15",X"0A",X"28",X"09",X"06",X"0B",X"0E", + X"09",X"CD",X"41",X"0A",X"38",X"4C",X"FD",X"21",X"60",X"63",X"CD",X"15",X"0A",X"28",X"09",X"06", + X"14",X"0E",X"07",X"CD",X"41",X"0A",X"38",X"3A",X"FD",X"21",X"FC",X"63",X"11",X"0B",X"00",X"26", + X"0C",X"06",X"0C",X"0E",X"0E",X"CD",X"15",X"0A",X"28",X"05",X"CD",X"41",X"0A",X"38",X"23",X"FD", + X"19",X"25",X"20",X"F1",X"FD",X"21",X"80",X"64",X"11",X"0A",X"00",X"26",X"08",X"06",X"0C",X"0E", + X"0A",X"CD",X"15",X"0A",X"28",X"05",X"CD",X"41",X"0A",X"38",X"07",X"FD",X"19",X"25",X"20",X"F1", + X"18",X"09",X"DD",X"CB",X"00",X"E6",X"FD",X"CB",X"00",X"E6",X"C9",X"06",X"C0",X"0E",X"64",X"16", + X"03",X"CD",X"02",X"06",X"C9",X"DD",X"CB",X"00",X"6E",X"CA",X"68",X"44",X"DD",X"7E",X"07",X"A7", + X"C2",X"68",X"44",X"C3",X"79",X"44",X"00",X"00",X"50",X"00",X"00",X"50",X"DD",X"CB",X"00",X"66", + X"C2",X"9F",X"4A",X"3A",X"03",X"60",X"DD",X"AE",X"00",X"E6",X"03",X"C2",X"03",X"47",X"FD",X"21", + X"54",X"63",X"CD",X"15",X"0A",X"28",X"0F",X"01",X"03",X"07",X"DD",X"7E",X"07",X"CD",X"0E",X"4C", + X"CD",X"41",X"0A",X"DA",X"FA",X"46",X"FD",X"21",X"60",X"63",X"CD",X"15",X"0A",X"28",X"0E",X"01", + X"01",X"10",X"DD",X"7E",X"07",X"CD",X"0E",X"4C",X"CD",X"41",X"0A",X"38",X"6D",X"FD",X"21",X"68", + X"63",X"CD",X"15",X"0A",X"28",X"0E",X"01",X"02",X"03",X"DD",X"7E",X"07",X"CD",X"0E",X"4C",X"CD", + X"41",X"0A",X"38",X"56",X"FD",X"21",X"79",X"63",X"CD",X"15",X"0A",X"28",X"0E",X"01",X"02",X"03", + X"DD",X"7E",X"07",X"CD",X"0E",X"4C",X"CD",X"41",X"0A",X"38",X"3F",X"DD",X"7E",X"00",X"E6",X"07", + X"28",X"41",X"FD",X"21",X"6A",X"65",X"11",X"F3",X"FF",X"47",X"D6",X"07",X"28",X"07",X"ED",X"44", + X"FD",X"19",X"3D",X"20",X"FB",X"D9",X"01",X"00",X"00",X"DD",X"7E",X"07",X"CD",X"0E",X"4C",X"D9", + X"CD",X"15",X"0A",X"28",X"0F",X"D9",X"C5",X"FD",X"7E",X"07",X"CD",X"0E",X"4C",X"CD",X"41",X"0A", + X"C1",X"D9",X"38",X"06",X"FD",X"19",X"10",X"E8",X"18",X"09",X"DD",X"CB",X"00",X"E6",X"FD",X"CB", + X"00",X"E6",X"C9",X"DD",X"7E",X"07",X"E6",X"70",X"0F",X"0F",X"0F",X"5F",X"16",X"00",X"21",X"17", + X"47",X"19",X"5E",X"23",X"56",X"EB",X"E9",X"27",X"47",X"80",X"47",X"EC",X"47",X"CC",X"48",X"88", + X"49",X"EA",X"49",X"39",X"4A",X"C8",X"4B",X"DD",X"66",X"05",X"DD",X"6E",X"06",X"ED",X"5B",X"E3", + X"60",X"A7",X"ED",X"52",X"7C",X"FE",X"40",X"38",X"44",X"DD",X"74",X"05",X"DD",X"75",X"06",X"CD", + X"7B",X"0B",X"38",X"39",X"3A",X"03",X"60",X"DD",X"AE",X"00",X"E6",X"03",X"20",X"1C",X"FD",X"21", + X"80",X"64",X"11",X"0A",X"00",X"26",X"08",X"06",X"0C",X"0E",X"0A",X"CD",X"15",X"0A",X"28",X"05", + X"CD",X"41",X"0A",X"38",X"0F",X"FD",X"19",X"25",X"20",X"F1",X"06",X"C0",X"0E",X"14",X"16",X"06", + X"CD",X"02",X"06",X"C9",X"FD",X"CB",X"00",X"E6",X"DD",X"CB",X"00",X"E6",X"C9",X"C3",X"C8",X"4B", + X"CD",X"7B",X"0B",X"38",X"64",X"DD",X"CB",X"09",X"66",X"20",X"05",X"DD",X"34",X"09",X"18",X"08", + X"3A",X"59",X"63",X"DD",X"BE",X"05",X"30",X"4C",X"DD",X"66",X"05",X"DD",X"6E",X"06",X"ED",X"5B", + X"E3",X"60",X"A7",X"ED",X"52",X"7C",X"FE",X"44",X"38",X"3A",X"DD",X"74",X"05",X"DD",X"75",X"06", + X"3A",X"03",X"60",X"DD",X"AE",X"00",X"E6",X"03",X"20",X"1C",X"FD",X"21",X"80",X"64",X"11",X"0A", + X"00",X"26",X"08",X"06",X"0A",X"0E",X"08",X"CD",X"15",X"0A",X"28",X"05",X"CD",X"41",X"0A",X"38", + X"0F",X"FD",X"19",X"25",X"20",X"F1",X"06",X"80",X"0E",X"6F",X"16",X"0C",X"CD",X"02",X"06",X"C9", + X"FD",X"CB",X"00",X"E6",X"DD",X"CB",X"00",X"E6",X"C9",X"C3",X"C8",X"4B",X"DD",X"CB",X"00",X"5E", + X"20",X"0F",X"CD",X"B6",X"48",X"3A",X"59",X"63",X"BC",X"38",X"7B",X"DD",X"CB",X"00",X"DE",X"18", + X"75",X"ED",X"5B",X"7C",X"60",X"21",X"C0",X"03",X"A7",X"ED",X"52",X"DD",X"56",X"03",X"DD",X"5E", + X"04",X"19",X"7C",X"FE",X"F8",X"D2",X"C8",X"4B",X"FE",X"08",X"38",X"06",X"DD",X"74",X"03",X"DD", + X"75",X"04",X"DD",X"34",X"09",X"DD",X"7E",X"09",X"E6",X"01",X"20",X"12",X"3A",X"59",X"63",X"DD", + X"BE",X"05",X"28",X"0A",X"30",X"05",X"CD",X"B6",X"48",X"18",X"03",X"CD",X"BB",X"48",X"3A",X"03", + X"60",X"DD",X"AE",X"00",X"E6",X"03",X"20",X"53",X"FD",X"21",X"FC",X"63",X"11",X"0B",X"00",X"26", + X"0C",X"06",X"0F",X"0E",X"0C",X"CD",X"15",X"0A",X"28",X"05",X"CD",X"41",X"0A",X"38",X"4E",X"FD", + X"19",X"25",X"20",X"F1",X"FD",X"21",X"D0",X"64",X"CD",X"15",X"0A",X"28",X"09",X"06",X"0E",X"0E", + X"0A",X"CD",X"41",X"0A",X"38",X"37",X"FD",X"21",X"80",X"64",X"11",X"0A",X"00",X"26",X"08",X"06", + X"0F",X"0E",X"08",X"CD",X"15",X"0A",X"28",X"05",X"CD",X"41",X"0A",X"38",X"20",X"FD",X"19",X"25", + X"20",X"F1",X"06",X"07",X"0E",X"04",X"CD",X"60",X"0A",X"20",X"16",X"06",X"C0",X"0E",X"28",X"16", + X"03",X"DD",X"CB",X"00",X"5E",X"28",X"02",X"0E",X"2C",X"CD",X"02",X"06",X"C9",X"FD",X"CB",X"00", + X"E6",X"DD",X"CB",X"00",X"E6",X"C9",X"11",X"00",X"FF",X"18",X"03",X"11",X"00",X"01",X"DD",X"66", + X"05",X"DD",X"6E",X"06",X"19",X"DD",X"74",X"05",X"DD",X"75",X"06",X"C9",X"DD",X"CB",X"00",X"5E", + X"20",X"30",X"2A",X"7C",X"60",X"11",X"00",X"02",X"19",X"EB",X"DD",X"66",X"03",X"DD",X"6E",X"04", + X"CD",X"85",X"0B",X"DA",X"85",X"49",X"DD",X"66",X"05",X"DD",X"6E",X"06",X"11",X"00",X"02",X"19", + X"DD",X"74",X"05",X"DD",X"75",X"06",X"7C",X"DD",X"BE",X"09",X"38",X"1A",X"DD",X"CB",X"00",X"DE", + X"18",X"14",X"2A",X"7C",X"60",X"ED",X"5B",X"E5",X"60",X"19",X"EB",X"DD",X"66",X"03",X"DD",X"6E", + X"04",X"CD",X"85",X"0B",X"38",X"6F",X"3A",X"03",X"60",X"DD",X"AE",X"00",X"E6",X"03",X"20",X"4A", + X"01",X"03",X"08",X"CD",X"60",X"0A",X"20",X"58",X"FD",X"21",X"80",X"64",X"11",X"0A",X"00",X"26", + X"08",X"06",X"10",X"0E",X"07",X"CD",X"15",X"0A",X"28",X"05",X"CD",X"41",X"0A",X"38",X"3D",X"FD", + X"19",X"25",X"20",X"F1",X"FD",X"21",X"DC",X"64",X"11",X"08",X"00",X"26",X"08",X"CD",X"15",X"0A", + X"28",X"13",X"06",X"0D",X"0E",X"08",X"FD",X"CB",X"00",X"5E",X"28",X"04",X"06",X"0C",X"0E",X"09", + X"CD",X"41",X"0A",X"38",X"17",X"FD",X"19",X"25",X"20",X"E3",X"06",X"F0",X"0E",X"28",X"16",X"03", + X"DD",X"CB",X"00",X"5E",X"28",X"02",X"0E",X"2C",X"CD",X"02",X"06",X"C9",X"FD",X"CB",X"00",X"E6", + X"DD",X"CB",X"00",X"E6",X"C9",X"C3",X"C8",X"4B",X"CD",X"D2",X"4B",X"DA",X"C8",X"4B",X"3A",X"03", + X"60",X"DD",X"AE",X"00",X"E6",X"03",X"20",X"37",X"06",X"01",X"0E",X"00",X"CD",X"60",X"0A",X"20", + X"44",X"FD",X"21",X"FC",X"63",X"11",X"0B",X"00",X"26",X"0C",X"06",X"09",X"0E",X"08",X"CD",X"15", + X"0A",X"28",X"05",X"CD",X"41",X"0A",X"38",X"29",X"FD",X"19",X"25",X"20",X"F1",X"FD",X"21",X"D0", + X"64",X"CD",X"15",X"0A",X"28",X"09",X"06",X"08",X"0E",X"06",X"CD",X"41",X"0A",X"38",X"12",X"06", + X"80",X"DD",X"CB",X"09",X"7E",X"28",X"02",X"CB",X"E8",X"0E",X"72",X"16",X"0D",X"CD",X"02",X"06", + X"C9",X"FD",X"CB",X"00",X"E6",X"DD",X"CB",X"00",X"E6",X"C9",X"CD",X"D2",X"4B",X"38",X"42",X"3A", + X"03",X"60",X"DD",X"AE",X"00",X"E6",X"03",X"20",X"25",X"06",X"04",X"0E",X"03",X"CD",X"60",X"0A", + X"20",X"2A",X"FD",X"21",X"80",X"64",X"11",X"0A",X"00",X"26",X"08",X"06",X"0C",X"0E",X"07",X"CD", + X"15",X"0A",X"28",X"05",X"CD",X"41",X"0A",X"38",X"0F",X"FD",X"19",X"25",X"20",X"F1",X"06",X"80", + X"0E",X"71",X"16",X"02",X"CD",X"02",X"06",X"C9",X"FD",X"CB",X"00",X"E6",X"DD",X"CB",X"00",X"E6", + X"C9",X"1E",X"0B",X"CD",X"0E",X"07",X"C3",X"C8",X"4B",X"2A",X"7C",X"60",X"11",X"00",X"03",X"19", + X"EB",X"DD",X"66",X"03",X"DD",X"6E",X"04",X"CD",X"85",X"0B",X"38",X"4B",X"3A",X"03",X"60",X"DD", + X"AE",X"00",X"E6",X"03",X"20",X"2E",X"01",X"02",X"04",X"CD",X"60",X"0A",X"20",X"34",X"FD",X"21", + X"DC",X"64",X"11",X"08",X"00",X"26",X"08",X"CD",X"15",X"0A",X"28",X"13",X"06",X"09",X"0E",X"07", + X"FD",X"CB",X"00",X"5E",X"28",X"04",X"06",X"08",X"0E",X"08",X"CD",X"41",X"0A",X"38",X"0F",X"FD", + X"19",X"25",X"20",X"E3",X"06",X"80",X"0E",X"73",X"16",X"0C",X"CD",X"02",X"06",X"C9",X"FD",X"CB", + X"00",X"E6",X"DD",X"CB",X"00",X"E6",X"C9",X"1E",X"09",X"CD",X"0E",X"07",X"C3",X"C8",X"4B",X"DD", + X"7E",X"07",X"E6",X"70",X"FE",X"10",X"28",X"51",X"DD",X"7E",X"08",X"FE",X"0C",X"30",X"47",X"A7", + X"20",X"32",X"DD",X"7E",X"07",X"E6",X"70",X"0F",X"0F",X"0F",X"47",X"0F",X"80",X"5F",X"16",X"00", + X"21",X"34",X"4C",X"19",X"EB",X"CD",X"21",X"07",X"DD",X"7E",X"07",X"E6",X"07",X"FE",X"05",X"38", + X"0E",X"20",X"07",X"1E",X"0B",X"CD",X"0E",X"07",X"18",X"05",X"1E",X"09",X"CD",X"0E",X"07",X"1E", + X"12",X"CD",X"FB",X"06",X"CD",X"7B",X"0B",X"38",X"0D",X"DD",X"7E",X"08",X"21",X"A3",X"0B",X"CD", + X"93",X"0B",X"DD",X"34",X"08",X"C9",X"C3",X"C8",X"4B",X"DD",X"7E",X"08",X"FE",X"28",X"D2",X"C8", + X"4B",X"A7",X"20",X"05",X"1E",X"11",X"CD",X"FB",X"06",X"CD",X"7B",X"0B",X"DA",X"C8",X"4B",X"DD", + X"7E",X"08",X"CD",X"A9",X"0B",X"3A",X"03",X"60",X"DD",X"AE",X"00",X"E6",X"03",X"C2",X"C4",X"4B", + X"DD",X"7E",X"08",X"CD",X"1F",X"0A",X"FD",X"21",X"54",X"63",X"CD",X"15",X"0A",X"28",X"0A",X"06", + X"07",X"0E",X"03",X"CD",X"39",X"0A",X"DA",X"C0",X"4B",X"FD",X"21",X"60",X"63",X"CD",X"15",X"0A", + X"28",X"09",X"06",X"10",X"0E",X"01",X"CD",X"39",X"0A",X"38",X"75",X"FD",X"21",X"68",X"63",X"CD", + X"15",X"0A",X"28",X"0F",X"FD",X"CB",X"00",X"46",X"20",X"09",X"06",X"03",X"0E",X"01",X"CD",X"39", + X"0A",X"38",X"5D",X"FD",X"21",X"79",X"63",X"CD",X"15",X"0A",X"28",X"0F",X"FD",X"CB",X"00",X"46", + X"20",X"09",X"06",X"03",X"0E",X"01",X"CD",X"39",X"0A",X"38",X"45",X"FD",X"21",X"80",X"64",X"11", + X"0A",X"00",X"06",X"08",X"CD",X"15",X"0A",X"28",X"0B",X"C5",X"06",X"08",X"0E",X"04",X"CD",X"39", + X"0A",X"C1",X"38",X"2C",X"FD",X"19",X"10",X"EC",X"FD",X"21",X"1C",X"65",X"D9",X"11",X"0D",X"00", + X"06",X"08",X"CD",X"15",X"0A",X"28",X"12",X"D9",X"01",X"00",X"00",X"FD",X"7E",X"07",X"E5",X"CD", + X"0E",X"4C",X"E1",X"CD",X"39",X"0A",X"38",X"08",X"D9",X"FD",X"19",X"10",X"E5",X"D9",X"18",X"04", + X"FD",X"CB",X"00",X"E6",X"DD",X"34",X"08",X"C9",X"DD",X"36",X"00",X"00",X"21",X"01",X"60",X"CB", + X"FE",X"C9",X"DD",X"56",X"03",X"DD",X"5E",X"04",X"DD",X"66",X"09",X"DD",X"6E",X"0A",X"19",X"7C", + X"FE",X"08",X"38",X"28",X"FE",X"F8",X"30",X"24",X"DD",X"74",X"03",X"DD",X"75",X"04",X"DD",X"56", + X"05",X"DD",X"5E",X"06",X"DD",X"66",X"0B",X"DD",X"6E",X"0C",X"19",X"7C",X"FE",X"40",X"38",X"0C", + X"FE",X"C0",X"30",X"08",X"DD",X"74",X"05",X"DD",X"75",X"06",X"A7",X"C9",X"37",X"C9",X"E6",X"70", + X"0F",X"0F",X"0F",X"5F",X"16",X"00",X"21",X"22",X"4C",X"19",X"7E",X"80",X"47",X"23",X"7E",X"81", + X"4F",X"C9",X"04",X"08",X"02",X"04",X"07",X"04",X"08",X"03",X"01",X"00",X"04",X"03",X"04",X"02", + X"00",X"00",X"00",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"30",X"00",X"00",X"30",X"00",X"00", + X"50",X"00",X"00",X"30",X"00",X"00",X"50",X"00",X"00",X"00",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"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"34",X"50",X"39",X"50",X"3E",X"50",X"43",X"50",X"48",X"50",X"4B",X"50",X"4E",X"50",X"50",X"50", + X"52",X"50",X"54",X"50",X"57",X"50",X"5A",X"50",X"62",X"50",X"5F",X"50",X"5C",X"50",X"65",X"50", + X"67",X"50",X"6A",X"50",X"6D",X"50",X"70",X"50",X"73",X"50",X"76",X"50",X"79",X"50",X"7C",X"50", + X"82",X"50",X"88",X"50",X"04",X"20",X"30",X"60",X"70",X"04",X"20",X"30",X"60",X"70",X"04",X"20", + X"30",X"60",X"70",X"04",X"20",X"30",X"60",X"70",X"02",X"60",X"70",X"02",X"40",X"50",X"01",X"00", + X"01",X"00",X"01",X"00",X"02",X"20",X"30",X"02",X"00",X"10",X"01",X"00",X"02",X"20",X"30",X"02", + X"20",X"30",X"02",X"00",X"10",X"01",X"00",X"02",X"00",X"10",X"02",X"00",X"10",X"02",X"20",X"30", + X"02",X"00",X"10",X"02",X"00",X"10",X"02",X"00",X"10",X"02",X"00",X"10",X"FF",X"9A",X"5C",X"03", + X"0C",X"5D",X"FF",X"51",X"5D",X"03",X"9D",X"5D",X"02",X"20",X"30",X"FD",X"21",X"00",X"6C",X"DD", + X"21",X"06",X"6C",X"FD",X"36",X"02",X"00",X"01",X"00",X"1A",X"21",X"29",X"52",X"DD",X"7E",X"00", + X"E6",X"03",X"20",X"07",X"DD",X"36",X"00",X"00",X"C3",X"04",X"52",X"E5",X"DD",X"CB",X"00",X"56", + X"28",X"15",X"DD",X"36",X"00",X"00",X"CF",X"23",X"36",X"00",X"FD",X"7E",X"02",X"A7",X"C2",X"03", + X"52",X"CD",X"91",X"52",X"C3",X"03",X"52",X"FD",X"34",X"02",X"CB",X"47",X"28",X"1B",X"DD",X"CB", + X"00",X"86",X"DD",X"CB",X"00",X"CE",X"CF",X"71",X"23",X"36",X"80",X"FD",X"7E",X"02",X"FE",X"01", + X"C2",X"03",X"52",X"CD",X"91",X"52",X"C3",X"03",X"52",X"C5",X"DD",X"E5",X"CF",X"E5",X"DD",X"E1", + X"DD",X"CB",X"01",X"76",X"28",X"09",X"DD",X"35",X"02",X"20",X"0F",X"DD",X"CB",X"01",X"B6",X"EB", + X"CF",X"FD",X"E5",X"01",X"08",X"51",X"C5",X"E9",X"FD",X"E1",X"FD",X"7E",X"02",X"FE",X"01",X"C2", + X"00",X"52",X"DD",X"CB",X"01",X"7E",X"CA",X"00",X"52",X"DD",X"6E",X"00",X"26",X"00",X"29",X"11", + X"00",X"50",X"19",X"CF",X"7E",X"FE",X"FF",X"CA",X"87",X"51",X"47",X"23",X"7E",X"23",X"E5",X"21", + X"00",X"B0",X"FE",X"40",X"38",X"05",X"D6",X"40",X"21",X"00",X"C0",X"87",X"C6",X"80",X"4F",X"FE", + X"E0",X"28",X"1E",X"DD",X"7E",X"03",X"E6",X"0F",X"81",X"77",X"DD",X"7E",X"03",X"E6",X"F0",X"0F", + X"0F",X"0F",X"0F",X"5F",X"DD",X"7E",X"04",X"E6",X"03",X"07",X"07",X"07",X"07",X"83",X"77",X"18", + X"11",X"DD",X"CB",X"04",X"7E",X"28",X"0B",X"DD",X"CB",X"04",X"BE",X"DD",X"7E",X"03",X"E6",X"07", + X"81",X"77",X"DD",X"7E",X"05",X"2F",X"E6",X"0F",X"81",X"C6",X"10",X"77",X"E1",X"11",X"03",X"00", + X"DD",X"19",X"10",X"A8",X"C3",X"00",X"52",X"FD",X"36",X"03",X"02",X"21",X"00",X"B0",X"FD",X"36", + X"04",X"03",X"01",X"80",X"90",X"DD",X"7E",X"04",X"2F",X"E6",X"0F",X"80",X"47",X"DD",X"23",X"DD", + X"7E",X"04",X"A7",X"20",X"06",X"78",X"F6",X"0F",X"77",X"18",X"23",X"E5",X"6F",X"26",X"00",X"29", + X"11",X"D5",X"52",X"19",X"CF",X"7D",X"E6",X"0F",X"81",X"57",X"7D",X"E6",X"F0",X"0F",X"0F",X"0F", + X"0F",X"6F",X"7C",X"E6",X"03",X"07",X"07",X"07",X"07",X"85",X"E1",X"72",X"77",X"70",X"E5",X"21", + X"20",X"20",X"09",X"44",X"4D",X"E1",X"DD",X"23",X"FD",X"35",X"04",X"20",X"C2",X"DD",X"7E",X"04", + X"DD",X"CB",X"04",X"BE",X"CB",X"77",X"20",X"04",X"06",X"FF",X"18",X"08",X"CB",X"7F",X"28",X"04", + X"E6",X"07",X"81",X"77",X"70",X"DD",X"23",X"FD",X"35",X"03",X"21",X"00",X"C0",X"C2",X"8E",X"51", + X"DD",X"E1",X"C1",X"E1",X"11",X"04",X"00",X"19",X"DD",X"23",X"0C",X"79",X"FE",X"06",X"20",X"0A", + X"FD",X"7E",X"02",X"FD",X"77",X"05",X"FD",X"36",X"02",X"00",X"05",X"C2",X"9D",X"50",X"FD",X"7E", + X"02",X"FD",X"86",X"05",X"C0",X"CD",X"91",X"52",X"C9",X"20",X"6C",X"26",X"58",X"39",X"6C",X"26", + X"58",X"52",X"6C",X"26",X"58",X"6B",X"6C",X"26",X"58",X"84",X"6C",X"A4",X"58",X"8F",X"6C",X"C4", + X"58",X"99",X"6C",X"07",X"59",X"A1",X"6C",X"07",X"59",X"A9",X"6C",X"22",X"59",X"B6",X"6C",X"76", + X"59",X"C0",X"6C",X"AB",X"59",X"CE",X"6C",X"22",X"59",X"F1",X"6C",X"15",X"5A",X"E6",X"6C",X"A4", + X"58",X"DB",X"6C",X"A4",X"58",X"02",X"6D",X"07",X"59",X"0A",X"6D",X"7F",X"5A",X"1B",X"6D",X"06", + X"5B",X"26",X"6D",X"79",X"5B",X"30",X"6D",X"7F",X"5A",X"41",X"6D",X"AD",X"5B",X"51",X"6D",X"7F", + X"5A",X"62",X"6D",X"62",X"5C",X"6E",X"6D",X"3D",X"53",X"CE",X"6D",X"3D",X"53",X"2E",X"6E",X"A4", + X"58",X"3E",X"9F",X"32",X"00",X"B0",X"32",X"00",X"C0",X"C6",X"20",X"30",X"F6",X"C9",X"DD",X"36", + X"01",X"00",X"DD",X"5E",X"00",X"16",X"00",X"21",X"06",X"6C",X"19",X"36",X"00",X"3A",X"02",X"6C", + X"FE",X"01",X"C0",X"CD",X"91",X"52",X"C9",X"00",X"01",X"80",X"01",X"00",X"02",X"00",X"03",X"00", + X"04",X"00",X"06",X"00",X"08",X"00",X"0C",X"00",X"10",X"00",X"18",X"00",X"20",X"AA",X"00",X"55", + X"01",X"AA",X"02",X"55",X"05",X"00",X"00",X"F8",X"03",X"BF",X"03",X"89",X"03",X"56",X"03",X"26", + X"03",X"FA",X"02",X"CE",X"02",X"A6",X"02",X"80",X"02",X"5C",X"02",X"3A",X"02",X"1A",X"02",X"FC", + X"01",X"DF",X"01",X"C4",X"01",X"AB",X"01",X"93",X"01",X"7D",X"01",X"67",X"01",X"53",X"01",X"40", + X"01",X"2E",X"01",X"1D",X"01",X"0D",X"01",X"FE",X"00",X"F0",X"00",X"E2",X"00",X"D6",X"00",X"CA", + X"00",X"BE",X"00",X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97",X"00",X"8F",X"00",X"87",X"00",X"7F", + X"00",X"78",X"00",X"71",X"00",X"6B",X"00",X"65",X"00",X"5F",X"00",X"5A",X"00",X"55",X"00",X"50", + X"00",X"4B",X"00",X"47",X"00",X"43",X"00",X"3F",X"00",X"3C",X"00",X"39",X"00",X"DD",X"CB",X"01", + X"6E",X"20",X"5B",X"DD",X"E5",X"E1",X"23",X"23",X"AF",X"01",X"01",X"5E",X"D7",X"DD",X"CB",X"01", + X"EE",X"DD",X"5E",X"00",X"CB",X"23",X"16",X"00",X"21",X"00",X"50",X"19",X"CF",X"23",X"CF",X"DD", + X"E5",X"FD",X"E1",X"01",X"0E",X"00",X"FD",X"09",X"FD",X"CB",X"00",X"FE",X"46",X"23",X"4E",X"23", + X"FD",X"75",X"0A",X"FD",X"74",X"0B",X"FD",X"71",X"0C",X"FD",X"70",X"0D",X"1A",X"DD",X"77",X"03", + X"FE",X"01",X"C8",X"13",X"EB",X"CF",X"11",X"29",X"00",X"FD",X"19",X"FD",X"CB",X"00",X"FE",X"4E", + X"23",X"FD",X"75",X"0A",X"FD",X"74",X"0B",X"FD",X"71",X"0C",X"FD",X"70",X"0D",X"C9",X"DD",X"7E", + X"03",X"A7",X"20",X"04",X"CD",X"9E",X"52",X"C9",X"DD",X"CB",X"03",X"46",X"28",X"23",X"DD",X"E5", + X"11",X"0E",X"00",X"DD",X"19",X"DD",X"E5",X"FD",X"E1",X"DD",X"E1",X"DD",X"E5",X"11",X"04",X"00", + X"DD",X"19",X"CD",X"F9",X"53",X"DD",X"E1",X"FD",X"CB",X"00",X"7E",X"20",X"04",X"DD",X"CB",X"03", + X"86",X"DD",X"CB",X"03",X"4E",X"C8",X"DD",X"E5",X"11",X"37",X"00",X"DD",X"19",X"DD",X"E5",X"FD", + X"E1",X"DD",X"E1",X"DD",X"E5",X"11",X"09",X"00",X"DD",X"19",X"CD",X"F9",X"53",X"DD",X"E1",X"FD", + X"CB",X"00",X"7E",X"C0",X"DD",X"CB",X"03",X"8E",X"C9",X"06",X"05",X"21",X"2C",X"54",X"FD",X"E5", + X"FD",X"CB",X"00",X"7E",X"28",X"1B",X"FD",X"CB",X"00",X"76",X"28",X"09",X"FD",X"35",X"01",X"20", + X"10",X"FD",X"CB",X"00",X"B6",X"C5",X"CF",X"D5",X"11",X"1D",X"54",X"D5",X"E9",X"E1",X"C1",X"18", + X"02",X"23",X"23",X"FD",X"23",X"FD",X"23",X"10",X"D7",X"FD",X"E1",X"C9",X"36",X"54",X"3B",X"56", + X"79",X"56",X"82",X"56",X"AB",X"56",X"CD",X"B0",X"55",X"CB",X"7C",X"20",X"07",X"CB",X"6D",X"C2", + X"21",X"55",X"18",X"38",X"FD",X"36",X"06",X"00",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"00", + X"DD",X"36",X"02",X"00",X"DD",X"36",X"03",X"00",X"DD",X"36",X"04",X"00",X"7C",X"E6",X"70",X"0F", + X"0F",X"0F",X"5F",X"16",X"00",X"21",X"6C",X"54",X"19",X"CF",X"E9",X"C9",X"6B",X"54",X"35",X"55", + X"4A",X"55",X"60",X"55",X"6B",X"54",X"6B",X"54",X"6B",X"54",X"AB",X"55",X"FD",X"7E",X"10",X"A7", + X"20",X"18",X"FD",X"36",X"06",X"00",X"DD",X"36",X"01",X"00",X"DD",X"36",X"02",X"00",X"DD",X"36", + X"03",X"00",X"FD",X"7E",X"0C",X"E6",X"0F",X"DD",X"77",X"00",X"CB",X"74",X"C2",X"00",X"55",X"7D", + X"E6",X"0F",X"CD",X"D9",X"55",X"FD",X"77",X"01",X"FD",X"CB",X"00",X"F6",X"FD",X"7E",X"0F",X"E6", + X"3F",X"20",X"05",X"DD",X"36",X"00",X"00",X"C9",X"FD",X"CB",X"0E",X"7E",X"20",X"1D",X"01",X"F0", + X"00",X"FD",X"CB",X"0E",X"76",X"28",X"03",X"01",X"80",X"00",X"FD",X"56",X"01",X"1E",X"00",X"CD", + X"EF",X"55",X"FD",X"74",X"05",X"FD",X"36",X"04",X"C0",X"18",X"25",X"FD",X"7E",X"01",X"FD",X"77", + X"1B",X"FD",X"36",X"06",X"80",X"FD",X"7E",X"0C",X"FD",X"77",X"18",X"FD",X"36",X"17",X"00",X"67", + X"2E",X"00",X"FD",X"46",X"01",X"0E",X"00",X"CD",X"10",X"56",X"FD",X"73",X"19",X"FD",X"72",X"1A", + X"FD",X"7E",X"0F",X"E6",X"3F",X"DD",X"E5",X"E1",X"FD",X"5E",X"10",X"16",X"00",X"19",X"23",X"77", + X"FD",X"CB",X"0F",X"76",X"28",X"06",X"FD",X"34",X"10",X"C3",X"36",X"54",X"FD",X"36",X"10",X"00", + X"C9",X"7C",X"F6",X"C4",X"DD",X"77",X"04",X"7D",X"E6",X"0F",X"CD",X"D9",X"55",X"FD",X"77",X"09", + X"FD",X"36",X"08",X"C0",X"C9",X"FD",X"34",X"1C",X"CD",X"C4",X"55",X"FD",X"7E",X"0E",X"77",X"23", + X"FD",X"7E",X"0A",X"77",X"23",X"FD",X"7E",X"0B",X"77",X"C9",X"CD",X"C4",X"55",X"35",X"20",X"05", + X"FD",X"35",X"1C",X"18",X"0A",X"23",X"7E",X"FD",X"77",X"0A",X"23",X"7E",X"FD",X"77",X"0B",X"C9", + X"FD",X"36",X"02",X"80",X"FD",X"7E",X"0F",X"E6",X"0F",X"07",X"07",X"07",X"FD",X"77",X"11",X"FD", + X"7E",X"0E",X"E6",X"0F",X"FD",X"77",X"12",X"FD",X"96",X"0C",X"30",X"06",X"FD",X"CB",X"02",X"EE", + X"ED",X"44",X"67",X"2E",X"00",X"FD",X"46",X"11",X"0E",X"00",X"CD",X"10",X"56",X"FD",X"CB",X"02", + X"6E",X"28",X"07",X"21",X"00",X"00",X"AF",X"ED",X"52",X"EB",X"FD",X"73",X"15",X"FD",X"72",X"16", + X"FD",X"7E",X"0C",X"FD",X"77",X"14",X"FD",X"36",X"13",X"00",X"C9",X"FD",X"36",X"00",X"00",X"C9", + X"FD",X"6E",X"0A",X"FD",X"66",X"0B",X"CF",X"FD",X"73",X"0A",X"FD",X"72",X"0B",X"FD",X"75",X"0E", + X"FD",X"74",X"0F",X"C9",X"FD",X"E5",X"E1",X"01",X"1D",X"00",X"09",X"FD",X"7E",X"1C",X"87",X"FD", + X"86",X"1C",X"D6",X"03",X"4F",X"06",X"00",X"09",X"C9",X"3D",X"87",X"5F",X"16",X"00",X"21",X"B7", + X"52",X"19",X"CF",X"E5",X"C1",X"FD",X"56",X"0D",X"1E",X"00",X"CD",X"EF",X"55",X"7C",X"C9",X"D5", + X"21",X"00",X"00",X"78",X"A7",X"28",X"0A",X"CB",X"3F",X"30",X"01",X"19",X"EB",X"29",X"EB",X"18", + X"F3",X"D1",X"79",X"CB",X"3A",X"CB",X"1B",X"A7",X"C8",X"CB",X"27",X"30",X"F6",X"19",X"18",X"F3", + X"FD",X"E5",X"FD",X"21",X"00",X"00",X"11",X"00",X"01",X"78",X"B1",X"28",X"18",X"AF",X"ED",X"42", + X"38",X"04",X"FD",X"19",X"18",X"F7",X"09",X"CB",X"38",X"CB",X"19",X"78",X"B1",X"28",X"06",X"CB", + X"3A",X"CB",X"1B",X"30",X"E8",X"FD",X"E5",X"D1",X"FD",X"E1",X"C9",X"FD",X"35",X"0F",X"20",X"0B", + X"FD",X"7E",X"10",X"FD",X"77",X"0A",X"FD",X"36",X"00",X"00",X"C9",X"FD",X"6E",X"11",X"FD",X"66", + X"12",X"FD",X"5E",X"13",X"FD",X"56",X"14",X"19",X"FD",X"75",X"11",X"FD",X"74",X"12",X"7C",X"E6", + X"0F",X"FD",X"77",X"0A",X"47",X"DD",X"7E",X"00",X"A7",X"28",X"03",X"DD",X"70",X"00",X"FD",X"7E", + X"0B",X"FD",X"77",X"01",X"FD",X"CB",X"00",X"F6",X"C9",X"DD",X"36",X"00",X"00",X"FD",X"36",X"00", + X"00",X"C9",X"FD",X"35",X"15",X"20",X"05",X"FD",X"36",X"00",X"00",X"C9",X"FD",X"6E",X"11",X"FD", + X"66",X"12",X"FD",X"5E",X"13",X"FD",X"56",X"14",X"AF",X"ED",X"52",X"FD",X"75",X"11",X"FD",X"74", + X"12",X"7C",X"E6",X"0F",X"DD",X"77",X"00",X"A7",X"28",X"DD",X"C9",X"DD",X"36",X"04",X"00",X"FD", + X"36",X"00",X"00",X"C9",X"DD",X"CB",X"01",X"EE",X"DD",X"6E",X"00",X"26",X"00",X"29",X"11",X"D0", + X"56",X"19",X"CF",X"4E",X"23",X"06",X"00",X"DD",X"E5",X"D1",X"13",X"13",X"13",X"ED",X"B0",X"C9", + X"04",X"57",X"1B",X"57",X"32",X"57",X"49",X"57",X"60",X"57",X"69",X"57",X"71",X"57",X"77",X"57", + X"7D",X"57",X"88",X"57",X"90",X"57",X"9C",X"57",X"B9",X"57",X"B0",X"57",X"A7",X"57",X"C2",X"57", + X"C8",X"57",X"D7",X"57",X"E0",X"57",X"E8",X"57",X"F7",X"57",X"04",X"58",X"13",X"58",X"00",X"00", + X"00",X"00",X"1D",X"58",X"16",X"80",X"00",X"00",X"07",X"C0",X"0F",X"AD",X"01",X"00",X"06",X"C0", + X"0F",X"F0",X"60",X"00",X"60",X"00",X"FF",X"FF",X"01",X"FE",X"18",X"16",X"80",X"00",X"00",X"07", + X"C0",X"0F",X"00",X"00",X"00",X"07",X"C0",X"0F",X"F0",X"60",X"00",X"60",X"00",X"FD",X"FF",X"01", + X"FC",X"18",X"16",X"00",X"01",X"00",X"03",X"C0",X"0F",X"AD",X"01",X"00",X"07",X"C0",X"0F",X"F0", + X"60",X"00",X"60",X"00",X"FD",X"FF",X"01",X"FB",X"08",X"16",X"10",X"00",X"00",X"07",X"C0",X"0F", + X"AD",X"01",X"00",X"07",X"C0",X"0F",X"C0",X"80",X"00",X"00",X"00",X"FD",X"FF",X"01",X"FD",X"08", + X"08",X"00",X"00",X"0A",X"07",X"C0",X"0F",X"02",X"BF",X"07",X"01",X"00",X"0F",X"40",X"00",X"0F", + X"40",X"05",X"00",X"00",X"0F",X"55",X"FA",X"05",X"01",X"00",X"0F",X"55",X"AF",X"0A",X"AD",X"01", + X"0F",X"60",X"F0",X"59",X"56",X"FA",X"FF",X"FF",X"07",X"04",X"00",X"00",X"07",X"C0",X"0F",X"F0", + X"0B",X"20",X"00",X"0F",X"9C",X"00",X"0F",X"30",X"00",X"00",X"00",X"00",X"0A",X"00",X"00",X"0F", + X"60",X"F0",X"50",X"94",X"FE",X"FF",X"FD",X"08",X"04",X"00",X"0A",X"07",X"C0",X"0A",X"DD",X"ED", + X"08",X"FF",X"00",X"08",X"07",X"C0",X"0B",X"FF",X"1F",X"08",X"7D",X"00",X"0C",X"3E",X"00",X"0C", + X"38",X"00",X"05",X"E8",X"00",X"0F",X"02",X"7F",X"0E",X"40",X"01",X"0E",X"42",X"01",X"0E",X"0D", + X"0D",X"40",X"01",X"18",X"41",X"01",X"18",X"08",X"A0",X"03",X"0F",X"E2",X"03",X"0F",X"F0",X"00", + X"07",X"02",X"00",X"0F",X"06",X"C0",X"0F",X"F0",X"0E",X"D0",X"03",X"0A",X"D1",X"03",X"0A",X"09", + X"09",X"D0",X"03",X"10",X"D1",X"03",X"10",X"0C",X"98",X"00",X"0F",X"98",X"00",X"0F",X"A0",X"A0", + X"00",X"38",X"00",X"F0",X"0E",X"20",X"00",X"0A",X"21",X"00",X"0A",X"03",X"01",X"20",X"00",X"10", + X"21",X"00",X"10",X"09",X"60",X"00",X"0F",X"61",X"00",X"0F",X"60",X"01",X"F0",X"08",X"00",X"00", + X"00",X"07",X"C0",X"0F",X"01",X"FF",X"DD",X"CB",X"01",X"6E",X"20",X"12",X"CD",X"B4",X"56",X"DD", + X"7E",X"18",X"DD",X"77",X"02",X"DD",X"CB",X"01",X"F6",X"DD",X"CB",X"01",X"E6",X"C9",X"DD",X"CB", + X"01",X"66",X"28",X"1D",X"DD",X"6E",X"10",X"DD",X"66",X"11",X"DD",X"75",X"03",X"DD",X"74",X"04", + X"DD",X"6E",X"12",X"DD",X"66",X"13",X"DD",X"75",X"09",X"DD",X"74",X"0A",X"DD",X"CB",X"01",X"A6", + X"C9",X"DD",X"7E",X"08",X"A7",X"20",X"04",X"CD",X"9E",X"52",X"C9",X"DD",X"6E",X"03",X"DD",X"66", + X"04",X"DD",X"5E",X"14",X"DD",X"56",X"15",X"19",X"DD",X"75",X"03",X"DD",X"74",X"04",X"DD",X"7E", + X"16",X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"0A",X"DD",X"77",X"09",X"DD",X"7E",X"0F",X"DD", + X"86",X"17",X"DD",X"77",X"0F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"DD",X"77",X"08", + X"DD",X"77",X"0E",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"09",X"CD",X"B4",X"56",X"21",X"1D",X"6C", + X"CB",X"D6",X"C9",X"DD",X"7E",X"09",X"DD",X"86",X"03",X"DD",X"A6",X"0A",X"DD",X"77",X"03",X"C0", + X"CD",X"9E",X"52",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"0A",X"CD",X"B4",X"56",X"21",X"1D",X"6C", + X"CB",X"D6",X"18",X"2A",X"DD",X"7E",X"09",X"A7",X"20",X"04",X"CD",X"9E",X"52",X"C9",X"DD",X"6E", + X"03",X"DD",X"66",X"04",X"11",X"09",X"00",X"19",X"DD",X"75",X"03",X"DD",X"74",X"04",X"DD",X"6E", + X"06",X"DD",X"66",X"07",X"19",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"35",X"09",X"DD",X"CB", + X"01",X"F6",X"DD",X"36",X"02",X"04",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"04",X"CD",X"B4",X"56", + X"C9",X"DD",X"7E",X"06",X"DD",X"86",X"03",X"DD",X"A6",X"07",X"DD",X"77",X"03",X"C0",X"CD",X"9E", + X"52",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"04",X"CD",X"B4",X"56",X"C9",X"DD",X"7E",X"06",X"DD", + X"BE",X"08",X"38",X"12",X"28",X"10",X"DD",X"7E",X"03",X"DD",X"86",X"09",X"30",X"03",X"DD",X"34", + X"04",X"DD",X"77",X"03",X"18",X"13",X"DD",X"6E",X"03",X"DD",X"66",X"04",X"DD",X"4E",X"0A",X"DD", + X"46",X"0B",X"09",X"DD",X"75",X"03",X"DD",X"74",X"04",X"DD",X"35",X"06",X"DD",X"7E",X"07",X"DD", + X"86",X"0C",X"DD",X"77",X"07",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"DD",X"77",X"05", + X"20",X"03",X"CD",X"9E",X"52",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"0C",X"DD",X"CB",X"01",X"F6", + X"DD",X"36",X"02",X"0B",X"CD",X"B4",X"56",X"C9",X"DD",X"36",X"03",X"0F",X"DD",X"7E",X"08",X"A7", + X"20",X"04",X"CD",X"9E",X"52",X"C9",X"DD",X"35",X"09",X"DD",X"35",X"09",X"DD",X"7E",X"09",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"DD",X"77",X"08",X"C9",X"DD",X"CB",X"01",X"6E",X"20", + X"05",X"CD",X"B4",X"56",X"18",X"3B",X"DD",X"6E",X"03",X"DD",X"66",X"04",X"11",X"E0",X"FF",X"19", + X"DD",X"75",X"03",X"DD",X"74",X"04",X"DD",X"35",X"09",X"20",X"04",X"CD",X"9E",X"52",X"C9",X"DD", + X"6E",X"06",X"DD",X"66",X"07",X"DD",X"5E",X"0B",X"DD",X"56",X"0C",X"19",X"DD",X"75",X"06",X"DD", + X"74",X"07",X"DD",X"35",X"0A",X"C0",X"DD",X"7E",X"0D",X"C6",X"03",X"DD",X"77",X"0D",X"FE",X"0C", + X"D0",X"DD",X"5E",X"0D",X"16",X"00",X"21",X"09",X"5A",X"19",X"7E",X"DD",X"77",X"0A",X"23",X"7E", + X"DD",X"77",X"0B",X"23",X"7E",X"DD",X"77",X"0C",X"C9",X"05",X"F6",X"FF",X"06",X"06",X"00",X"07", + X"F0",X"FF",X"FF",X"7C",X"00",X"DD",X"CB",X"01",X"6E",X"20",X"04",X"CD",X"B4",X"56",X"C9",X"DD", + X"7E",X"09",X"A7",X"20",X"05",X"DD",X"CB",X"01",X"AE",X"C9",X"DD",X"35",X"09",X"DD",X"7E",X"09", + X"FE",X"3E",X"38",X"11",X"28",X"0F",X"DD",X"7E",X"03",X"C6",X"1E",X"30",X"03",X"DD",X"34",X"04", + X"DD",X"77",X"03",X"18",X"10",X"DD",X"6E",X"03",X"DD",X"66",X"04",X"01",X"F9",X"FF",X"09",X"DD", + X"75",X"03",X"DD",X"74",X"04",X"DD",X"7E",X"0A",X"FE",X"10",X"30",X"0F",X"DD",X"7E",X"06",X"C6", + X"09",X"30",X"03",X"DD",X"34",X"07",X"DD",X"77",X"06",X"18",X"10",X"DD",X"6E",X"06",X"DD",X"66", + X"07",X"01",X"FD",X"FF",X"09",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"34",X"0A",X"C9",X"DD", + X"CB",X"01",X"6E",X"20",X"04",X"CD",X"B4",X"56",X"C9",X"DD",X"6E",X"03",X"DD",X"66",X"04",X"DD", + X"4E",X"09",X"06",X"00",X"CB",X"79",X"28",X"01",X"05",X"09",X"DD",X"75",X"03",X"DD",X"74",X"04", + X"DD",X"5E",X"0B",X"DD",X"56",X"0C",X"EB",X"AF",X"ED",X"52",X"F2",X"B4",X"5A",X"11",X"00",X"00", + X"EB",X"AF",X"ED",X"52",X"DD",X"5E",X"0D",X"16",X"00",X"AF",X"ED",X"52",X"28",X"09",X"FA",X"C7", + X"5A",X"79",X"ED",X"44",X"DD",X"77",X"09",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"DD",X"4E",X"0A", + X"06",X"00",X"CB",X"79",X"28",X"01",X"05",X"09",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"5E", + X"0E",X"DD",X"56",X"0F",X"EB",X"AF",X"ED",X"52",X"F2",X"F2",X"5A",X"11",X"00",X"00",X"EB",X"AF", + X"ED",X"52",X"DD",X"5E",X"10",X"16",X"00",X"AF",X"ED",X"52",X"28",X"09",X"FA",X"05",X"5B",X"79", + X"ED",X"44",X"DD",X"77",X"0A",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"04",X"CD",X"B4",X"56",X"C9", + X"DD",X"7E",X"0A",X"FE",X"10",X"30",X"1F",X"DD",X"6E",X"03",X"DD",X"66",X"04",X"11",X"FD",X"FF", + X"19",X"DD",X"75",X"03",X"DD",X"74",X"04",X"DD",X"7E",X"06",X"C6",X"02",X"30",X"03",X"DD",X"34", + X"07",X"DD",X"77",X"06",X"18",X"1D",X"DD",X"7E",X"03",X"C6",X"02",X"30",X"03",X"DD",X"34",X"04", + X"DD",X"77",X"03",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"11",X"FE",X"FF",X"19",X"DD",X"75",X"06", + X"DD",X"74",X"07",X"DD",X"7E",X"09",X"C6",X"FE",X"DD",X"77",X"09",X"CB",X"3F",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"DD",X"77",X"05",X"DD",X"77",X"08",X"DD",X"34",X"0A",X"DD",X"7E",X"0A",X"FE", + X"50",X"38",X"05",X"28",X"03",X"CD",X"9E",X"52",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"0C",X"DD", + X"CB",X"01",X"F6",X"DD",X"36",X"02",X"0A",X"CD",X"B4",X"56",X"C9",X"DD",X"36",X"03",X"01",X"DD", + X"7E",X"05",X"A7",X"20",X"04",X"CD",X"9E",X"52",X"C9",X"DD",X"7E",X"09",X"D6",X"08",X"DD",X"77", + X"09",X"A7",X"1F",X"1F",X"1F",X"1F",X"DD",X"77",X"05",X"DD",X"77",X"08",X"C9",X"DD",X"CB",X"01", + X"6E",X"20",X"08",X"DD",X"36",X"0F",X"FF",X"CD",X"B4",X"56",X"C9",X"DD",X"7E",X"0F",X"A7",X"20", + X"04",X"CD",X"9E",X"52",X"C9",X"DD",X"7E",X"09",X"A7",X"20",X"05",X"DD",X"35",X"0F",X"18",X"E7", + X"DD",X"35",X"09",X"DD",X"7E",X"05",X"A7",X"28",X"14",X"DD",X"35",X"0E",X"DD",X"7E",X"0E",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"DD",X"77",X"05",X"DD",X"77",X"08",X"DD",X"4E",X"0A", + X"DD",X"46",X"0B",X"DD",X"6E",X"03",X"DD",X"66",X"04",X"09",X"DD",X"75",X"03",X"DD",X"74",X"04", + X"11",X"20",X"01",X"AF",X"ED",X"52",X"F2",X"10",X"5C",X"EB",X"21",X"00",X"00",X"AF",X"ED",X"52", + X"11",X"33",X"00",X"AF",X"ED",X"52",X"FA",X"27",X"5C",X"28",X"0C",X"21",X"00",X"00",X"AF",X"ED", + X"42",X"DD",X"75",X"0A",X"DD",X"74",X"0B",X"DD",X"4E",X"0C",X"DD",X"46",X"0D",X"DD",X"6E",X"06", + X"DD",X"66",X"07",X"09",X"DD",X"75",X"06",X"DD",X"74",X"07",X"11",X"60",X"00",X"AF",X"ED",X"52", + X"F2",X"4A",X"5C",X"EB",X"21",X"00",X"00",X"AF",X"ED",X"52",X"11",X"CC",X"0C",X"AF",X"ED",X"52", + X"FA",X"61",X"5C",X"28",X"0C",X"AF",X"21",X"00",X"00",X"ED",X"42",X"DD",X"75",X"0C",X"DD",X"74", + X"0D",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"04",X"CD",X"B4",X"56",X"C9",X"DD",X"7E",X"09",X"DD", + X"B6",X"0A",X"20",X"02",X"18",X"F2",X"DD",X"7E",X"09",X"D6",X"01",X"30",X"03",X"DD",X"35",X"0A", + X"DD",X"77",X"09",X"DD",X"7E",X"05",X"A7",X"C8",X"DD",X"35",X"0B",X"DD",X"7E",X"0B",X"A7",X"1F", + X"1F",X"1F",X"1F",X"DD",X"77",X"05",X"DD",X"77",X"08",X"C9",X"03",X"0F",X"02",X"90",X"00",X"50", + X"45",X"1C",X"00",X"50",X"03",X"1C",X"00",X"50",X"03",X"1C",X"00",X"50",X"07",X"1C",X"00",X"54", + X"45",X"20",X"00",X"50",X"03",X"1C",X"00",X"54",X"03",X"20",X"00",X"57",X"07",X"23",X"00",X"A0", + X"00",X"57",X"45",X"23",X"00",X"58",X"45",X"24",X"00",X"57",X"45",X"23",X"00",X"58",X"45",X"24", + X"00",X"57",X"45",X"23",X"00",X"58",X"45",X"24",X"00",X"57",X"45",X"23",X"00",X"58",X"45",X"24", + X"00",X"57",X"45",X"23",X"00",X"57",X"03",X"23",X"00",X"57",X"03",X"23",X"00",X"57",X"45",X"23", + X"00",X"57",X"45",X"23",X"00",X"57",X"07",X"23",X"07",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"02",X"90",X"00", + X"50",X"87",X"04",X"00",X"50",X"87",X"04",X"00",X"54",X"87",X"08",X"00",X"54",X"87",X"08",X"00", + X"A0",X"00",X"55",X"87",X"09",X"00",X"55",X"87",X"09",X"00",X"52",X"87",X"07",X"00",X"52",X"87", + X"07",X"00",X"54",X"87",X"08",X"00",X"54",X"87",X"08",X"00",X"50",X"87",X"04",X"07",X"00",X"FF", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"05",X"0F",X"02",X"90",X"00",X"5C",X"85",X"23",X"00",X"5C",X"03",X"23",X"00",X"5C",X"03", + X"23",X"00",X"57",X"85",X"1C",X"00",X"5C",X"85",X"20",X"00",X"A0",X"00",X"5B",X"03",X"20",X"00", + X"5A",X"03",X"1F",X"00",X"59",X"03",X"1E",X"00",X"58",X"03",X"1D",X"00",X"57",X"03",X"1C",X"00", + X"58",X"03",X"1D",X"00",X"59",X"03",X"1E",X"00",X"5A",X"03",X"1F",X"00",X"5B",X"45",X"20",X"00", + X"60",X"45",X"23",X"00",X"5C",X"85",X"17",X"05",X"00",X"FF",X"FF",X"00",X"00",X"0F",X"02",X"90", + X"85",X"14",X"85",X"16",X"85",X"14",X"85",X"10",X"00",X"A0",X"45",X"10",X"45",X"0F",X"45",X"0D", + X"45",X"0F",X"87",X"10",X"07",X"00",X"FF",X"FF",X"43",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_sprite_l.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_sprite_l.vhd new file mode 100644 index 00000000..f825258c --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_sprite_l.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_sprite_l is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_sprite_l is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"80",X"2A",X"A0",X"1A",X"A9",X"D5",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"40",X"55",X"55", + X"D5",X"7F",X"05",X"FF",X"05",X"00",X"14",X"00",X"55",X"50",X"00",X"00",X"00",X"00",X"00",X"00", + X"F5",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"81",X"0A",X"05",X"28",X"15",X"2A",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"42",X"80",X"50",X"A0",X"54",X"28",X"AA",X"A8", + X"AF",X"EF",X"2A",X"AA",X"28",X"15",X"0A",X"05",X"02",X"81",X"00",X"00",X"00",X"00",X"00",X"00", + X"FB",X"FA",X"AA",X"A8",X"54",X"28",X"50",X"A0",X"42",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"AA",X"A5",X"55",X"9A",X"AA",X"9A",X"F7",X"69",X"35",X"A6",X"3D",X"9A",X"3D",X"28",X"0D", + X"AA",X"AA",X"55",X"56",X"AA",X"A9",X"7C",X"FA",X"70",X"3E",X"F0",X"4D",X"F0",X"FD",X"C0",X"3D", + X"00",X"05",X"00",X"05",X"00",X"26",X"00",X"26",X"00",X"05",X"00",X"05",X"00",X"01",X"00",X"01", + X"40",X"4D",X"40",X"FD",X"60",X"3D",X"60",X"4D",X"40",X"FD",X"40",X"3D",X"00",X"4C",X"00",X"FC", + X"AA",X"AA",X"A5",X"55",X"9A",X"AA",X"9A",X"00",X"69",X"00",X"A6",X"00",X"9A",X"00",X"28",X"00", + X"AA",X"AA",X"99",X"56",X"AA",X"A9",X"00",X"FA",X"00",X"3E",X"00",X"4D",X"00",X"FD",X"00",X"3D", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"47",X"00",X"FD",X"00",X"3D",X"00",X"47",X"00",X"FD",X"00",X"3D",X"00",X"4C",X"00",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"02",X"00",X"08",X"00",X"28",X"C0",X"AB",X"08",X"2E",X"A0",X"BA",X"80",X"E2",X"00", + X"00",X"03",X"00",X"0C",X"00",X"30",X"00",X"C0",X"05",X"00",X"05",X"00",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"00",X"17",X"00",X"16",X"00",X"16",X"00",X"06",X"00",X"05",X"00",X"05",X"00",X"01", + X"41",X"00",X"75",X"00",X"65",X"00",X"65",X"00",X"A4",X"00",X"94",X"00",X"94",X"00",X"90",X"00", + X"00",X"02",X"00",X"02",X"00",X"0E",X"00",X"0E",X"00",X"02",X"00",X"02",X"00",X"00",X"00",X"00", + X"A0",X"00",X"A0",X"00",X"EC",X"00",X"EC",X"00",X"A0",X"00",X"A0",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"10",X"00",X"05",X"00",X"05",X"00",X"00",X"C0",X"00",X"30",X"00",X"0C",X"00",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E2",X"00",X"BA",X"80",X"2E",X"A0",X"AB",X"08",X"28",X"C0",X"08",X"00",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"AA",X"0A",X"A0", + X"55",X"7F",X"05",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FE",X"0A",X"A0",X"02",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"5D",X"55",X"4D",X"55",X"5D",X"57",X"4D",X"5E",X"5D",X"5F",X"4D",X"5B",X"5F",X"EE",X"4C",X"FB", + X"55",X"55",X"AA",X"A8",X"FF",X"FC",X"A9",X"70",X"AA",X"5C",X"C0",X"17",X"C0",X"00",X"B0",X"00", + X"5C",X"3E",X"4C",X"03",X"5C",X"00",X"4C",X"00",X"5C",X"00",X"4C",X"00",X"5C",X"00",X"40",X"00", + X"E0",X"00",X"A9",X"00",X"29",X"00",X"16",X"40",X"01",X"A0",X"00",X"A0",X"00",X"0C",X"00",X"03", + X"5D",X"55",X"4D",X"55",X"5D",X"57",X"47",X"52",X"5D",X"50",X"4D",X"50",X"5C",X"00",X"4C",X"00", + X"55",X"55",X"AA",X"A8",X"FF",X"FC",X"A9",X"70",X"AA",X"5C",X"00",X"17",X"00",X"00",X"00",X"00", + X"5C",X"00",X"4C",X"00",X"5C",X"00",X"4C",X"00",X"5C",X"00",X"4C",X"00",X"5C",X"00",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"0C",X"20",X"03",X"E8",X"23",X"9A",X"0A",X"66",X"02",X"99",X"00",X"A6", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"40",X"00", + X"00",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"5C",X"00",X"5C",X"00",X"F7",X"00",X"0D",X"40",X"01",X"40",X"00",X"20",X"00",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"80",X"0A",X"A8",X"3D",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"00",X"57",X"40", + X"FA",X"AA",X"3D",X"55",X"0A",X"A8",X"AA",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"5A",X"57",X"40",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"2A",X"01",X"88",X"85",X"AA",X"29",X"88",X"BA",X"2A",X"EF",X"08",X"BA",X"02",X"6F",X"00",X"AA", + X"40",X"A8",X"52",X"22",X"68",X"AA",X"AE",X"22",X"FB",X"A8",X"AE",X"20",X"F9",X"80",X"AA",X"00", + X"00",X"0F",X"00",X"07",X"00",X"03",X"00",X"03",X"00",X"03",X"00",X"0F",X"00",X"1D",X"00",X"11", + X"F0",X"00",X"D0",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"F0",X"00",X"74",X"00",X"44",X"00", + X"00",X"01",X"18",X"BC",X"0D",X"A0",X"01",X"66",X"0F",X"BB",X"3E",X"39",X"2A",X"D8",X"06",X"78", + X"80",X"10",X"AE",X"20",X"FA",X"41",X"C7",X"C4",X"96",X"38",X"66",X"AF",X"49",X"6A",X"26",X"3C", + X"C6",X"4A",X"56",X"F6",X"39",X"C9",X"32",X"D8",X"0E",X"4B",X"06",X"4A",X"30",X"81",X"04",X"08", + X"A9",X"8C",X"F9",X"95",X"E1",X"EC",X"56",X"44",X"3A",X"08",X"90",X"10",X"61",X"20",X"68",X"00", + X"00",X"42",X"00",X"D2",X"00",X"14",X"00",X"00",X"00",X"04",X"00",X"AE",X"00",X"02",X"00",X"00", + X"2A",X"7E",X"A6",X"89",X"57",X"E9",X"E8",X"EA",X"E8",X"7A",X"ED",X"DF",X"E9",X"BF",X"60",X"3E", + X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"A9",X"03",X"21",X"25",X"24",X"14",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"6A",X"96",X"6E",X"A9",X"AB",X"98",X"E2",X"E6",X"57",X"E8",X"6A",X"DA",X"62",X"D5",X"AA",X"AE", + X"52",X"00",X"03",X"00",X"4F",X"00",X"68",X"00",X"04",X"00",X"A0",X"00",X"80",X"00",X"30",X"00", + X"71",X"A0",X"35",X"44",X"0A",X"80",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"8C",X"00",X"90",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"0A",X"00",X"10",X"A8",X"04",X"09", + X"00",X"00",X"00",X"2E",X"00",X"0A",X"00",X"00",X"00",X"00",X"00",X"2A",X"00",X"06",X"00",X"06", + X"26",X"C6",X"01",X"5A",X"93",X"06",X"9B",X"D6",X"02",X"EA",X"9A",X"AF",X"9A",X"F9",X"17",X"3A", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"02",X"1F",X"83",X"34",X"8C",X"12",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"00",X"00",X"00",X"C4",X"10", + X"7C",X"A3",X"B6",X"96",X"3F",X"11",X"ED",X"AB",X"AA",X"2D",X"09",X"B0",X"B5",X"BB",X"F1",X"BB", + X"E8",X"00",X"99",X"00",X"48",X"00",X"6A",X"00",X"40",X"00",X"0C",X"00",X"D0",X"00",X"43",X"00", + X"DE",X"AA",X"CE",X"55",X"FE",X"AA",X"FE",X"80",X"DE",X"FC",X"CC",X"FF",X"FC",X"FE",X"FC",X"3A", + X"AA",X"95",X"6A",X"15",X"A0",X"15",X"00",X"14",X"00",X"14",X"2A",X"A0",X"A8",X"0C",X"A0",X"3A", + X"DC",X"0A",X"CC",X"2A",X"FC",X"28",X"30",X"20",X"00",X"20",X"55",X"63",X"55",X"4E",X"55",X"42", + X"40",X"3A",X"10",X"EA",X"07",X"AA",X"0F",X"AA",X"3A",X"AA",X"EA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"C0",X"F0",X"C0",X"F5",X"C1",X"F5",X"FA",X"FA",X"F5",X"F5",X"3D",X"7D",X"1F",X"7D",X"AA",X"AA", + X"0F",X"03",X"5F",X"03",X"5F",X"43",X"AF",X"AF",X"5F",X"5F",X"7D",X"7C",X"7D",X"F4",X"AA",X"AA", + X"3F",X"BF",X"3F",X"BF",X"65",X"96",X"96",X"56",X"26",X"56",X"25",X"95",X"01",X"96",X"00",X"16", + X"FE",X"FC",X"FE",X"FC",X"96",X"59",X"95",X"96",X"95",X"98",X"96",X"58",X"96",X"40",X"94",X"00", + X"11",X"11",X"68",X"0A",X"28",X"0A",X"40",X"00",X"D2",X"80",X"C6",X"80",X"F1",X"11",X"BF",X"FF", + X"11",X"00",X"0A",X"40",X"0A",X"10",X"00",X"04",X"A0",X"A3",X"A0",X"A7",X"11",X"13",X"FF",X"FC", + X"AA",X"AA",X"2A",X"AA",X"03",X"FF",X"05",X"55",X"02",X"AA",X"00",X"AA",X"00",X"14",X"00",X"00", + X"AA",X"A0",X"AA",X"00",X"C0",X"00",X"50",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"44",X"28",X"0A",X"68",X"0A",X"00",X"00",X"D2",X"80",X"C6",X"80",X"F0",X"50",X"BF",X"FF", + X"50",X"40",X"0A",X"10",X"0A",X"04",X"00",X"00",X"A0",X"A7",X"A0",X"A3",X"44",X"47",X"FF",X"FC", + X"AA",X"AA",X"2A",X"AA",X"03",X"FF",X"05",X"55",X"02",X"AA",X"00",X"AA",X"00",X"14",X"00",X"00", + X"AA",X"A0",X"AA",X"00",X"C0",X"00",X"50",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"68",X"0A",X"28",X"0A",X"40",X"00",X"D2",X"80",X"C6",X"80",X"F1",X"11",X"BF",X"FF", + X"11",X"00",X"0A",X"40",X"0A",X"10",X"00",X"04",X"A0",X"A3",X"A0",X"A7",X"11",X"13",X"FF",X"FC", + X"AA",X"AA",X"2A",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"A0",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"44",X"28",X"0A",X"68",X"0A",X"00",X"00",X"D2",X"80",X"C6",X"80",X"F0",X"50",X"BF",X"FF", + X"50",X"40",X"0A",X"10",X"0A",X"04",X"00",X"00",X"A0",X"A7",X"A0",X"A3",X"44",X"47",X"FF",X"FC", + X"AA",X"AA",X"2A",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"A0",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"C0",X"00",X"32",X"00",X"0B",X"00",X"E6", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"00",X"8C",X"00",X"60",X"00",X"B8",X"C0", + X"03",X"2E",X"00",X"09",X"00",X"32",X"00",X"C3",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"9B",X"00",X"E0",X"00",X"8C",X"00",X"03",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"0D",X"00",X"3F",X"00",X"3F",X"00",X"0F",X"00",X"03", + X"00",X"00",X"00",X"00",X"40",X"00",X"70",X"00",X"FC",X"00",X"FC",X"00",X"F0",X"00",X"C0",X"00", + X"00",X"06",X"00",X"06",X"00",X"0A",X"00",X"0A",X"00",X"2A",X"00",X"28",X"00",X"20",X"00",X"00", + X"90",X"00",X"90",X"00",X"A0",X"00",X"A0",X"00",X"A8",X"00",X"28",X"00",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"FE",X"3F",X"FF",X"FF",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"AA",X"A0",X"FF",X"F5",X"AA",X"AA", + X"17",X"33",X"05",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F5",X"57",X"A8",X"15",X"7F",X"08",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"00",X"0F",X"F4",X"28",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"80",X"02",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"30",X"0E",X"B0",X"0D",X"70",X"01",X"40",X"01",X"40",X"0B",X"E0",X"05",X"50",X"01",X"40", + X"80",X"B0",X"26",X"ED",X"32",X"CA",X"F5",X"6C",X"1A",X"DA",X"3B",X"15",X"12",X"80",X"C0",X"84", + X"00",X"00",X"05",X"50",X"2A",X"A8",X"FF",X"FF",X"2A",X"A8",X"0A",X"A0",X"03",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"C0",X"07",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"05",X"D7",X"FC",X"30",X"05",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"04",X"0C",X"01",X"00",X"29",X"03",X"81",X"08",X"C5",X"20",X"3D",X"00",X"5F",X"05",X"1F", + X"00",X"00",X"08",X"0C",X"20",X"30",X"8F",X"00",X"7C",X"20",X"F0",X"40",X"F6",X"55",X"BD",X"40", + X"51",X"7F",X"00",X"D7",X"23",X"05",X"0C",X"81",X"00",X"81",X"30",X"20",X"00",X"C0",X"00",X"00", + X"F5",X"08",X"7C",X"20",X"5F",X"00",X"42",X"C0",X"08",X"30",X"82",X"0C",X"40",X"00",X"40",X"00", + X"00",X"3F",X"3F",X"FC",X"C0",X"03",X"00",X"03",X"00",X"4C",X"01",X"F9",X"00",X"A8",X"02",X"94", + X"3A",X"95",X"FF",X"79",X"F7",X"FA",X"3F",X"FE",X"7F",X"FD",X"BF",X"EF",X"FC",X"BF",X"F2",X"5F", + X"00",X"83",X"02",X"0C",X"00",X"00",X"00",X"02",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"C2",X"4F",X"08",X"17",X"20",X"03",X"81",X"03",X"04",X"00",X"C0",X"08",X"00",X"00",X"00",X"80", + X"5A",X"AF",X"75",X"FD",X"7D",X"7F",X"7B",X"FF",X"7F",X"EF",X"FD",X"FA",X"7F",X"78",X"FB",X"DC", + X"F0",X"00",X"FF",X"00",X"7F",X"40",X"D4",X"FC",X"F5",X"00",X"F5",X"40",X"BD",X"10",X"2C",X"00", + X"D0",X"FC",X"C0",X"3F",X"00",X"0F",X"01",X"08",X"20",X"40",X"00",X"14",X"08",X"00",X"00",X"00", + X"0B",X"00",X"02",X"C0",X"C0",X"A0",X"F1",X"20",X"30",X"00",X"0C",X"00",X"03",X"00",X"00",X"00", + X"00",X"00",X"C0",X"00",X"30",X"0C",X"0C",X"00",X"03",X"C0",X"00",X"FD",X"00",X"BF",X"00",X"AF", + X"00",X"01",X"0C",X"00",X"03",X"00",X"13",X"C4",X"42",X"C1",X"2A",X"F3",X"EB",X"F3",X"7F",X"BC", + X"00",X"0B",X"0C",X"02",X"03",X"F0",X"00",X"3F",X"00",X"0F",X"14",X"03",X"10",X"88",X"04",X"01", + X"DF",X"EF",X"F7",X"FF",X"BB",X"FB",X"FF",X"FE",X"FD",X"FE",X"FF",X"5E",X"FF",X"D5",X"FE",X"F5", + X"00",X"00",X"04",X"01",X"30",X"08",X"30",X"28",X"F4",X"A0",X"F0",X"83",X"FC",X"BF",X"FE",X"FF", + X"00",X"00",X"00",X"00",X"0C",X"00",X"30",X"00",X"F0",X"10",X"C0",X"40",X"C5",X"00",X"08",X"00", + X"7B",X"FC",X"7F",X"DE",X"7F",X"6F",X"7D",X"BF",X"56",X"FF",X"57",X"DF",X"59",X"7F",X"96",X"FA", + X"A0",X"00",X"A3",X"F0",X"BF",X"00",X"FC",X"10",X"BD",X"40",X"00",X"0C",X"FF",X"C0",X"0F",X"FE", + X"01",X"15",X"05",X"C5",X"15",X"C7",X"05",X"71",X"01",X"5D",X"00",X"44",X"01",X"11",X"00",X"12", + X"5F",X"FB",X"F5",X"6A",X"55",X"AA",X"46",X"9A",X"5A",X"57",X"65",X"1F",X"B5",X"7D",X"51",X"D5", + X"00",X"08",X"00",X"42",X"00",X"02",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"54",X"54",X"05",X"51",X"11",X"CC",X"41",X"75",X"04",X"57",X"00",X"90",X"00",X"0F",X"00",X"00", + X"FA",X"55",X"BA",X"A9",X"AE",X"B5",X"E2",X"FD",X"AB",X"F5",X"6A",X"FD",X"6F",X"BF",X"5B",X"C7", + X"D4",X"C0",X"53",X"54",X"D5",X"50",X"14",X"00",X"53",X"40",X"7D",X"10",X"51",X"54",X"54",X"60", + X"58",X"15",X"5E",X"5D",X"97",X"15",X"B5",X"4D",X"05",X"04",X"C1",X"40",X"00",X"00",X"00",X"00", + X"CA",X"80",X"01",X"00",X"D4",X"00",X"51",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"1F",X"01",X"0F",X"00",X"83",X"00",X"0F",X"00",X"0A",X"00",X"A8",X"00",X"04",X"00",X"00", + X"3F",X"2B",X"FA",X"5E",X"D5",X"56",X"55",X"16",X"1F",X"D2",X"CF",X"15",X"33",X"D6",X"CF",X"25", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"C5",X"10",X"01",X"00",X"81",X"00",X"00",X"00",X"02",X"00",X"02",X"00",X"00",X"00",X"00", + X"A9",X"5A",X"EA",X"57",X"55",X"A5",X"14",X"55",X"5B",X"ED",X"4C",X"FF",X"7F",X"33",X"4C",X"C0", + X"C3",X"00",X"F0",X"00",X"3C",X"00",X"70",X"00",X"54",X"00",X"05",X"00",X"30",X"00",X"C0",X"00", + X"00",X"CC",X"C3",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"02",X"FB",X"13",X"BE",X"0F",X"EA",X"0F",X"5E",X"3E",X"95",X"38",X"65",X"C0",X"A6",X"02",X"9B", + X"FD",X"E0",X"E6",X"84",X"9A",X"E1",X"6B",X"F8",X"AA",X"BC",X"6F",X"C3",X"AB",X"F0",X"BB",X"4C", + X"08",X"1F",X"20",X"4F",X"01",X"0C",X"04",X"3C",X"00",X"3C",X"0C",X"30",X"00",X"C3",X"00",X"C0", + X"BE",X"10",X"2F",X"84",X"73",X"E0",X"70",X"C8",X"BC",X"C2",X"8C",X"30",X"0C",X"00",X"03",X"00", + X"0C",X"0F",X"20",X"3F",X"00",X"FD",X"03",X"C2",X"00",X"10",X"0A",X"03",X"20",X"0C",X"80",X"30", + X"DB",X"EA",X"6F",X"FB",X"BF",X"2A",X"FE",X"FB",X"F3",X"CE",X"02",X"FE",X"03",X"CA",X"0F",X"22", + X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3C",X"00",X"30",X"0C",X"02",X"00",X"08",X"00",X"00",X"00",X"20",X"00",X"03",X"00",X"00",X"00", + X"CA",X"BF",X"FE",X"A0",X"FD",X"A3",X"D5",X"28",X"5D",X"62",X"83",X"5A",X"13",X"14",X"80",X"C1", + X"4F",X"00",X"40",X"C0",X"10",X"00",X"14",X"00",X"01",X"00",X"80",X"10",X"A0",X"04",X"20",X"00", + X"80",X"00",X"20",X"00",X"08",X"0C",X"02",X"00",X"C0",X"00",X"00",X"80",X"10",X"00",X"04",X"00", + X"C8",X"03",X"32",X"00",X"00",X"80",X"00",X"00",X"C0",X"00",X"0C",X"00",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"02",X"00",X"00",X"04",X"05",X"01",X"10",X"00",X"57",X"0C",X"17",X"03",X"5C", + X"0A",X"00",X"02",X"00",X"86",X"8D",X"A5",X"5C",X"69",X"90",X"DA",X"96",X"D6",X"AA",X"35",X"9A", + X"02",X"F5",X"30",X"96",X"00",X"2A",X"0F",X"03",X"03",X"E7",X"00",X"3C",X"00",X"FF",X"03",X"07", + X"F9",X"59",X"E9",X"44",X"AA",X"55",X"A9",X"95",X"E9",X"59",X"F5",X"6A",X"35",X"AA",X"D6",X"FB", + X"00",X"32",X"00",X"02",X"0C",X"4A",X"0B",X"1A",X"02",X"D6",X"00",X"B5",X"3C",X"29",X"AF",X"E5", + X"00",X"00",X"80",X"50",X"05",X"C0",X"97",X"00",X"5C",X"0C",X"5A",X"AA",X"DA",X"80",X"55",X"0D", + X"02",X"A5",X"08",X"B6",X"00",X"1B",X"30",X"53",X"01",X"00",X"04",X"23",X"00",X"80",X"00",X"00", + X"B5",X"40",X"AB",X"54",X"AA",X"04",X"4A",X"80",X"42",X"A0",X"10",X"20",X"13",X"00",X"10",X"00", + X"00",X"00",X"00",X"05",X"01",X"14",X"00",X"00",X"00",X"03",X"00",X"0F",X"00",X"FC",X"00",X"02", + X"57",X"EC",X"41",X"AA",X"3E",X"BA",X"FE",X"D6",X"FB",X"5E",X"F5",X"7F",X"14",X"3F",X"43",X"FF", + X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F1",X"03",X"C1",X"05",X"04",X"10",X"04",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"6A",X"BA",X"A9",X"7F",X"AA",X"D7",X"9A",X"BD",X"95",X"AC",X"BD",X"F3",X"BD",X"7F",X"EF",X"53", + X"D4",X"00",X"30",X"00",X"C0",X"00",X"F0",X"00",X"30",X"00",X"0C",X"00",X"C0",X"00",X"F0",X"00", + X"FF",X"DC",X"FC",X"D5",X"3C",X"3D",X"0F",X"3D",X"03",X"0F",X"00",X"C0",X"00",X"00",X"00",X"00", + X"3C",X"00",X"03",X"C0",X"00",X"00",X"50",X"00",X"C4",X"00",X"50",X"00",X"04",X"00",X"01",X"00", + X"01",X"55",X"00",X"01",X"00",X"0A",X"00",X"A8",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"03", + X"55",X"A5",X"69",X"69",X"95",X"65",X"01",X"26",X"30",X"15",X"FF",X"D9",X"C7",X"A5",X"1A",X"06", + X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"02",X"80",X"C2",X"03",X"0E",X"0C",X"0C",X"00",X"00",X"00",X"0C",X"00",X"00",X"00",X"00", + X"5A",X"AA",X"6A",X"B0",X"9B",X"FC",X"AA",X"C3",X"A6",X"50",X"65",X"6A",X"69",X"50",X"05",X"D5", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"00",X"00",X"00", + X"4A",X"FD",X"70",X"8F",X"0F",X"C0",X"00",X"C0",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"10",X"00",X"C4",X"00",X"30",X"00",X"0C",X"00",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"01",X"10",X"23",X"01",X"0A",X"72",X"00",X"1F",X"02",X"8A",X"30",X"17",X"C3",X"1C", + X"08",X"00",X"30",X"C0",X"8C",X"08",X"BE",X"34",X"FF",X"C0",X"CB",X"12",X"EF",X"FC",X"FE",X"04", + X"08",X"23",X"21",X"0C",X"00",X"F2",X"02",X"0A",X"08",X"48",X"00",X"23",X"01",X"30",X"00",X"02", + X"33",X"81",X"9C",X"F0",X"09",X"4C",X"D4",X"A0",X"CC",X"08",X"03",X"00",X"10",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"55",X"00",X"50",X"00",X"50",X"00",X"50",X"00",X"50",X"00",X"55",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"0F",X"00",X"FF",X"0F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FA",X"FF",X"AA", + X"00",X"00",X"51",X"55",X"51",X"01",X"01",X"01",X"01",X"01",X"51",X"01",X"51",X"55",X"00",X"00", + X"00",X"00",X"45",X"55",X"45",X"05",X"40",X"14",X"41",X"40",X"45",X"05",X"45",X"55",X"00",X"00", + X"00",X"00",X"0A",X"AA",X"FF",X"EA",X"AA",X"AA",X"FA",X"AA",X"AA",X"A8",X"AA",X"A0",X"AA",X"80", + X"AA",X"FF",X"A8",X"FF",X"A0",X"FF",X"80",X"3F",X"0C",X"3F",X"0F",X"FF",X"0F",X"F1",X"0F",X"FF", + X"00",X"00",X"14",X"51",X"14",X"51",X"14",X"51",X"15",X"55",X"15",X"05",X"14",X"01",X"00",X"00", + X"00",X"00",X"15",X"15",X"15",X"14",X"15",X"14",X"15",X"14",X"15",X"14",X"15",X"15",X"00",X"00", + X"FF",X"AA",X"FF",X"2A",X"FF",X"0A",X"FC",X"02",X"FC",X"00",X"FC",X"00",X"3C",X"00",X"F0",X"00", + X"00",X"00",X"AA",X"A0",X"AB",X"FF",X"AA",X"AA",X"AA",X"AF",X"2A",X"AA",X"0A",X"AA",X"02",X"AA", + X"00",X"00",X"54",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"14",X"00",X"54",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"AF",X"FF",X"FF",X"FF",X"FF",X"FF",X"AF",X"FF",X"AA",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"F0",X"00",X"FF",X"00",X"FF",X"F0",X"FF",X"FF", + X"A8",X"00",X"AB",X"0A",X"AA",X"02",X"2A",X"C2",X"2A",X"C2",X"2A",X"AA",X"2A",X"B2",X"0A",X"B2", + X"00",X"00",X"A0",X"AA",X"BC",X"AA",X"B2",X"AA",X"B2",X"AA",X"BA",X"BA",X"BA",X"BA",X"BA",X"BA", + X"0A",X"BA",X"0A",X"BA",X"0A",X"BA",X"02",X"AA",X"02",X"AB",X"00",X"A8",X"00",X"A0",X"00",X"00", + X"CA",X"C2",X"EA",X"C2",X"EA",X"C2",X"2A",X"C2",X"2A",X"CA",X"AA",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0A",X"80",X"C2",X"AA",X"C2",X"AA",X"C2",X"AF",X"C2",X"AC",X"BA",X"AA",X"B2",X"AA", + X"00",X"00",X"00",X"00",X"A2",X"A8",X"AC",X"AF",X"EC",X"AC",X"0C",X"AC",X"B0",X"AF",X"C0",X"AE", + X"B2",X"AC",X"B2",X"AF",X"B2",X"AA",X"B2",X"AA",X"8A",X"A8",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"AE",X"EC",X"AA",X"AC",X"AB",X"A2",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"2A",X"82",X"EA",X"0A",X"EA",X"0A",X"AA",X"EA",X"BA",X"EA",X"BA",X"EA", + X"00",X"00",X"00",X"00",X"AA",X"0A",X"BA",X"BA",X"3A",X"BA",X"3A",X"BA",X"EA",X"BA",X"00",X"3A", + X"BA",X"EA",X"3A",X"EA",X"FA",X"3A",X"2A",X"8A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"3A",X"FA",X"BA",X"BA",X"BA",X"AA",X"BA",X"AA",X"0A",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"2A",X"A2",X"AA",X"AE",X"AB",X"AE",X"BF",X"8E",X"83",X"0E",X"AA",X"0E",X"AA",X"0E", + X"00",X"AA",X"A3",X"A8",X"A2",X"A0",X"AE",X"A0",X"AE",X"80",X"AA",X"80",X"AA",X"00",X"AA",X"A8", + X"8E",X"0E",X"80",X"CE",X"B0",X"EE",X"AB",X"EE",X"AA",X"AE",X"2A",X"A2",X"00",X"00",X"00",X"00", + X"A0",X"EA",X"A0",X"EA",X"A3",X"EA",X"AF",X"AA",X"AA",X"A8",X"AA",X"A8",X"0A",X"80",X"00",X"00", + X"00",X"00",X"01",X"31",X"10",X"5A",X"04",X"6F",X"05",X"2E",X"01",X"79",X"54",X"A9",X"07",X"65", + X"43",X"00",X"14",X"C4",X"94",X"50",X"E1",X"9C",X"9E",X"80",X"DA",X"E4",X"F6",X"95",X"5A",X"E0", + X"03",X"6A",X"0C",X"AB",X"30",X"59",X"01",X"45",X"0C",X"54",X"00",X"10",X"00",X"C0",X"00",X"00", + X"DA",X"A7",X"AB",X"10",X"AE",X"54",X"51",X"40",X"90",X"50",X"44",X"24",X"41",X"00",X"40",X"00", + X"00",X"30",X"02",X"04",X"1C",X"68",X"C5",X"85",X"06",X"97",X"10",X"AF",X"05",X"AA",X"2B",X"FE", + X"8C",X"00",X"A3",X"20",X"6C",X"80",X"BC",X"78",X"F9",X"61",X"AA",X"99",X"A6",X"8C",X"61",X"F0", + X"0F",X"8A",X"30",X"9F",X"0A",X"53",X"11",X"0B",X"40",X"36",X"00",X"38",X"00",X"C0",X"03",X"00", + X"9F",X"87",X"A5",X"F0",X"E5",X"8C",X"4E",X"42",X"53",X"90",X"00",X"84",X"91",X"00",X"00",X"30", + X"00",X"80",X"00",X"E0",X"04",X"08",X"01",X"C1",X"C0",X"74",X"30",X"07",X"03",X"31",X"00",X"87", + X"30",X"0C",X"8C",X"80",X"12",X"10",X"58",X"40",X"61",X"00",X"44",X"00",X"1D",X"50",X"51",X"03", + X"20",X"D1",X"08",X"14",X"00",X"50",X"20",X"42",X"03",X"08",X"0C",X"00",X"00",X"20",X"80",X"00", + X"D4",X"80",X"75",X"0E",X"12",X"40",X"10",X"10",X"08",X"00",X"00",X"30",X"10",X"0C",X"00",X"00", + X"00",X"02",X"02",X"08",X"2B",X"EA",X"AC",X"38",X"BF",X"D3",X"AD",X"7F",X"95",X"CF",X"57",X"FB", + X"00",X"00",X"00",X"00",X"30",X"00",X"F0",X"00",X"E4",X"00",X"90",X"00",X"C3",X"00",X"C0",X"00", + X"5A",X"A1",X"6A",X"97",X"9A",X"7E",X"A9",X"FF",X"6A",X"F4",X"5A",X"BD",X"A6",X"FF",X"EA",X"8F", + X"7C",X"00",X"FF",X"C0",X"B0",X"30",X"E0",X"00",X"08",X"0C",X"00",X"C0",X"C0",X"00",X"FC",X"00", + X"00",X"00",X"00",X"08",X"00",X"20",X"00",X"33",X"01",X"01",X"04",X"04",X"00",X"40",X"00",X"00", + X"0F",X"EA",X"35",X"E8",X"D3",X"EA",X"0F",X"AE",X"2E",X"BE",X"3F",X"FF",X"BC",X"F7",X"F0",X"1D", + X"0C",X"05",X"30",X"04",X"00",X"C0",X"00",X"82",X"02",X"00",X"00",X"03",X"00",X"08",X"00",X"00", + X"CB",X"7C",X"43",X"F0",X"8F",X"14",X"0F",X"00",X"3C",X"12",X"00",X"10",X"00",X"40",X"04",X"00", + X"8F",X"D0",X"DF",X"F4",X"F7",X"39",X"FD",X"82",X"B7",X"70",X"B1",X"FC",X"FC",X"71",X"CE",X"1C", + X"00",X"00",X"C4",X"00",X"40",X"00",X"00",X"80",X"A0",X"00",X"0C",X"00",X"03",X"00",X"20",X"10", + X"F0",X"35",X"FC",X"BD",X"34",X"30",X"3C",X"0C",X"0C",X"00",X"83",X"20",X"80",X"08",X"20",X"02", + X"00",X"04",X"02",X"00",X"80",X"80",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"EF",X"6F",X"EF",X"67",X"FE",X"66",X"FF",X"66",X"6E",X"26",X"6F",X"26",X"6E",X"26",X"6F", + X"FB",X"BF",X"FB",X"F9",X"BF",X"D9",X"FF",X"99",X"B9",X"99",X"F9",X"99",X"B9",X"98",X"F9",X"98", + X"26",X"6F",X"06",X"55",X"01",X"55",X"03",X"FF",X"02",X"AA",X"00",X"FF",X"00",X"0A",X"00",X"03", + X"F9",X"98",X"55",X"90",X"55",X"40",X"FF",X"C0",X"AA",X"80",X"FF",X"00",X"A0",X"00",X"C0",X"00", + X"55",X"55",X"55",X"55",X"6A",X"A5",X"5A",X"95",X"56",X"A5",X"55",X"A9",X"55",X"6A",X"55",X"5A", + X"55",X"55",X"55",X"55",X"5A",X"A9",X"56",X"A5",X"5A",X"95",X"6A",X"55",X"A9",X"55",X"A5",X"55", + X"55",X"5A",X"55",X"6A",X"55",X"A9",X"56",X"A5",X"5A",X"95",X"6A",X"A5",X"55",X"55",X"55",X"55", + X"A5",X"55",X"A9",X"55",X"6A",X"55",X"5A",X"95",X"56",X"A5",X"5A",X"A9",X"55",X"55",X"55",X"55"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_sprite_u.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_sprite_u.vhd new file mode 100644 index 00000000..5fc0eddb --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ROM/rom_sprite_u.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_sprite_u is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_sprite_u is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"80",X"2A",X"A0",X"1A",X"A9",X"D5",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"40",X"55",X"55", + X"D5",X"7F",X"05",X"FF",X"05",X"00",X"14",X"00",X"55",X"50",X"00",X"00",X"00",X"00",X"00",X"00", + X"F5",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"81",X"0A",X"05",X"28",X"15",X"2A",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"42",X"80",X"50",X"A0",X"54",X"28",X"AA",X"A8", + X"AF",X"EF",X"2A",X"AA",X"28",X"15",X"0A",X"05",X"02",X"81",X"00",X"00",X"00",X"00",X"00",X"00", + X"FB",X"FA",X"AA",X"A8",X"54",X"28",X"50",X"A0",X"42",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"AA",X"A5",X"55",X"9A",X"AA",X"9A",X"F7",X"69",X"35",X"A6",X"3D",X"9A",X"3D",X"28",X"0D", + X"AA",X"AA",X"55",X"56",X"AA",X"A9",X"7C",X"FA",X"70",X"3E",X"F0",X"4D",X"F0",X"FD",X"C0",X"3D", + X"00",X"05",X"00",X"05",X"00",X"26",X"00",X"26",X"00",X"05",X"00",X"05",X"00",X"01",X"00",X"01", + X"40",X"4D",X"40",X"FD",X"60",X"3D",X"60",X"4D",X"40",X"FD",X"40",X"3D",X"00",X"4C",X"00",X"FC", + X"AA",X"AA",X"A5",X"55",X"9A",X"AA",X"9A",X"00",X"69",X"00",X"A6",X"00",X"9A",X"00",X"28",X"00", + X"AA",X"AA",X"99",X"56",X"AA",X"A9",X"00",X"FA",X"00",X"3E",X"00",X"4D",X"00",X"FD",X"00",X"3D", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"47",X"00",X"FD",X"00",X"3D",X"00",X"47",X"00",X"FD",X"00",X"3D",X"00",X"4C",X"00",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"02",X"00",X"08",X"00",X"28",X"C0",X"AB",X"08",X"2E",X"A0",X"BA",X"80",X"E2",X"00", + X"00",X"03",X"00",X"0C",X"00",X"30",X"00",X"C0",X"05",X"00",X"05",X"00",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"00",X"17",X"00",X"16",X"00",X"16",X"00",X"06",X"00",X"05",X"00",X"05",X"00",X"01", + X"41",X"00",X"75",X"00",X"65",X"00",X"65",X"00",X"A4",X"00",X"94",X"00",X"94",X"00",X"90",X"00", + X"00",X"02",X"00",X"02",X"00",X"0E",X"00",X"0E",X"00",X"02",X"00",X"02",X"00",X"00",X"00",X"00", + X"A0",X"00",X"A0",X"00",X"EC",X"00",X"EC",X"00",X"A0",X"00",X"A0",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"10",X"00",X"05",X"00",X"05",X"00",X"00",X"C0",X"00",X"30",X"00",X"0C",X"00",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E2",X"00",X"BA",X"80",X"2E",X"A0",X"AB",X"08",X"28",X"C0",X"08",X"00",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"AA",X"0A",X"A0", + X"55",X"7F",X"05",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FE",X"0A",X"A0",X"02",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"5D",X"55",X"4D",X"55",X"5D",X"57",X"4D",X"5E",X"5D",X"5F",X"4D",X"5B",X"5F",X"EE",X"4C",X"FB", + X"55",X"55",X"AA",X"A8",X"FF",X"FC",X"A9",X"70",X"AA",X"5C",X"C0",X"17",X"C0",X"00",X"B0",X"00", + X"5C",X"3E",X"4C",X"03",X"5C",X"00",X"4C",X"00",X"5C",X"00",X"4C",X"00",X"5C",X"00",X"40",X"00", + X"E0",X"00",X"A9",X"00",X"29",X"00",X"16",X"40",X"01",X"A0",X"00",X"A0",X"00",X"0C",X"00",X"03", + X"5D",X"55",X"4D",X"55",X"5D",X"57",X"47",X"52",X"5D",X"50",X"4D",X"50",X"5C",X"00",X"4C",X"00", + X"55",X"55",X"AA",X"A8",X"FF",X"FC",X"A9",X"70",X"AA",X"5C",X"00",X"17",X"00",X"00",X"00",X"00", + X"5C",X"00",X"4C",X"00",X"5C",X"00",X"4C",X"00",X"5C",X"00",X"4C",X"00",X"5C",X"00",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"0C",X"20",X"03",X"E8",X"23",X"9A",X"0A",X"66",X"02",X"99",X"00",X"A6", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"40",X"00", + X"00",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"5C",X"00",X"5C",X"00",X"F7",X"00",X"0D",X"40",X"01",X"40",X"00",X"20",X"00",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"80",X"0A",X"A8",X"3D",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"00",X"57",X"40", + X"FA",X"AA",X"3D",X"55",X"0A",X"A8",X"AA",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"5A",X"57",X"40",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"2A",X"01",X"88",X"85",X"AA",X"29",X"88",X"BA",X"2A",X"EF",X"08",X"BA",X"02",X"6F",X"00",X"AA", + X"40",X"A8",X"52",X"22",X"68",X"AA",X"AE",X"22",X"FB",X"A8",X"AE",X"20",X"F9",X"80",X"AA",X"00", + X"00",X"0F",X"00",X"07",X"00",X"03",X"00",X"03",X"00",X"03",X"00",X"0F",X"00",X"1D",X"00",X"11", + X"F0",X"00",X"D0",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"F0",X"00",X"74",X"00",X"44",X"00", + X"00",X"01",X"18",X"BC",X"0D",X"A0",X"01",X"66",X"0F",X"BB",X"3E",X"39",X"2A",X"D8",X"06",X"78", + X"80",X"10",X"AE",X"20",X"FA",X"41",X"C7",X"C4",X"96",X"38",X"66",X"AF",X"49",X"6A",X"26",X"3C", + X"C6",X"4A",X"56",X"F6",X"39",X"C9",X"32",X"D8",X"0E",X"4B",X"06",X"4A",X"30",X"81",X"04",X"08", + X"A9",X"8C",X"F9",X"95",X"E1",X"EC",X"56",X"44",X"3A",X"08",X"90",X"10",X"61",X"20",X"68",X"00", + X"00",X"42",X"00",X"D2",X"00",X"14",X"00",X"00",X"00",X"04",X"00",X"AE",X"00",X"02",X"00",X"00", + X"2A",X"7E",X"A6",X"89",X"57",X"E9",X"E8",X"EA",X"E8",X"7A",X"ED",X"DF",X"E9",X"BF",X"60",X"3E", + X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"A9",X"03",X"21",X"25",X"24",X"14",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"6A",X"96",X"6E",X"A9",X"AB",X"98",X"E2",X"E6",X"57",X"E8",X"6A",X"DA",X"62",X"D5",X"AA",X"AE", + X"52",X"00",X"03",X"00",X"4F",X"00",X"68",X"00",X"04",X"00",X"A0",X"00",X"80",X"00",X"30",X"00", + X"71",X"A0",X"35",X"44",X"0A",X"80",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"8C",X"00",X"90",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"0A",X"00",X"10",X"A8",X"04",X"09", + X"00",X"00",X"00",X"2E",X"00",X"0A",X"00",X"00",X"00",X"00",X"00",X"2A",X"00",X"06",X"00",X"06", + X"26",X"C6",X"01",X"5A",X"93",X"06",X"9B",X"D6",X"02",X"EA",X"9A",X"AF",X"9A",X"F9",X"17",X"3A", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"02",X"1F",X"83",X"34",X"8C",X"12",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"00",X"00",X"00",X"C4",X"10", + X"7C",X"A3",X"B6",X"96",X"3F",X"11",X"ED",X"AB",X"AA",X"2D",X"09",X"B0",X"B5",X"BB",X"F1",X"BB", + X"E8",X"00",X"99",X"00",X"48",X"00",X"6A",X"00",X"40",X"00",X"0C",X"00",X"D0",X"00",X"43",X"00", + X"DE",X"AA",X"CE",X"55",X"FE",X"AA",X"FE",X"80",X"DE",X"FC",X"CC",X"FF",X"FC",X"FE",X"FC",X"3A", + X"AA",X"95",X"6A",X"15",X"A0",X"15",X"00",X"14",X"00",X"14",X"2A",X"A0",X"A8",X"0C",X"A0",X"3A", + X"DC",X"0A",X"CC",X"2A",X"FC",X"28",X"30",X"20",X"00",X"20",X"55",X"63",X"55",X"4E",X"55",X"42", + X"40",X"3A",X"10",X"EA",X"07",X"AA",X"0F",X"AA",X"3A",X"AA",X"EA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"C0",X"F0",X"C0",X"F5",X"C1",X"F5",X"FA",X"FA",X"F5",X"F5",X"3D",X"7D",X"1F",X"7D",X"AA",X"AA", + X"0F",X"03",X"5F",X"03",X"5F",X"43",X"AF",X"AF",X"5F",X"5F",X"7D",X"7C",X"7D",X"F4",X"AA",X"AA", + X"3F",X"BF",X"3F",X"BF",X"65",X"96",X"96",X"56",X"26",X"56",X"25",X"95",X"01",X"96",X"00",X"16", + X"FE",X"FC",X"FE",X"FC",X"96",X"59",X"95",X"96",X"95",X"98",X"96",X"58",X"96",X"40",X"94",X"00", + X"11",X"11",X"68",X"0A",X"28",X"0A",X"40",X"00",X"D2",X"80",X"C6",X"80",X"F1",X"11",X"BF",X"FF", + X"11",X"00",X"0A",X"40",X"0A",X"10",X"00",X"04",X"A0",X"A3",X"A0",X"A7",X"11",X"13",X"FF",X"FC", + X"AA",X"AA",X"2A",X"AA",X"03",X"FF",X"05",X"55",X"02",X"AA",X"00",X"AA",X"00",X"14",X"00",X"00", + X"AA",X"A0",X"AA",X"00",X"C0",X"00",X"50",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"44",X"28",X"0A",X"68",X"0A",X"00",X"00",X"D2",X"80",X"C6",X"80",X"F0",X"50",X"BF",X"FF", + X"50",X"40",X"0A",X"10",X"0A",X"04",X"00",X"00",X"A0",X"A7",X"A0",X"A3",X"44",X"47",X"FF",X"FC", + X"AA",X"AA",X"2A",X"AA",X"03",X"FF",X"05",X"55",X"02",X"AA",X"00",X"AA",X"00",X"14",X"00",X"00", + X"AA",X"A0",X"AA",X"00",X"C0",X"00",X"50",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"68",X"0A",X"28",X"0A",X"40",X"00",X"D2",X"80",X"C6",X"80",X"F1",X"11",X"BF",X"FF", + X"11",X"00",X"0A",X"40",X"0A",X"10",X"00",X"04",X"A0",X"A3",X"A0",X"A7",X"11",X"13",X"FF",X"FC", + X"AA",X"AA",X"2A",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"A0",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"44",X"28",X"0A",X"68",X"0A",X"00",X"00",X"D2",X"80",X"C6",X"80",X"F0",X"50",X"BF",X"FF", + X"50",X"40",X"0A",X"10",X"0A",X"04",X"00",X"00",X"A0",X"A7",X"A0",X"A3",X"44",X"47",X"FF",X"FC", + X"AA",X"AA",X"2A",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"A0",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"C0",X"00",X"32",X"00",X"0B",X"00",X"E6", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"00",X"8C",X"00",X"60",X"00",X"B8",X"C0", + X"03",X"2E",X"00",X"09",X"00",X"32",X"00",X"C3",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"9B",X"00",X"E0",X"00",X"8C",X"00",X"03",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"0D",X"00",X"3F",X"00",X"3F",X"00",X"0F",X"00",X"03", + X"00",X"00",X"00",X"00",X"40",X"00",X"70",X"00",X"FC",X"00",X"FC",X"00",X"F0",X"00",X"C0",X"00", + X"00",X"06",X"00",X"06",X"00",X"0A",X"00",X"0A",X"00",X"2A",X"00",X"28",X"00",X"20",X"00",X"00", + X"90",X"00",X"90",X"00",X"A0",X"00",X"A0",X"00",X"A8",X"00",X"28",X"00",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"FE",X"3F",X"FF",X"FF",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"AA",X"A0",X"FF",X"F5",X"AA",X"AA", + X"17",X"33",X"05",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F5",X"57",X"A8",X"15",X"7F",X"08",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"00",X"0F",X"F4",X"28",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"80",X"02",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"30",X"0E",X"B0",X"0D",X"70",X"01",X"40",X"01",X"40",X"0B",X"E0",X"05",X"50",X"01",X"40", + X"80",X"B0",X"26",X"ED",X"32",X"CA",X"F5",X"6C",X"1A",X"DA",X"3B",X"15",X"12",X"80",X"C0",X"84", + X"00",X"00",X"05",X"50",X"2A",X"A8",X"FF",X"FF",X"2A",X"A8",X"0A",X"A0",X"03",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"C0",X"07",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"05",X"D7",X"FC",X"30",X"05",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"04",X"0C",X"01",X"00",X"29",X"03",X"81",X"08",X"C5",X"20",X"3D",X"00",X"5F",X"05",X"1F", + X"00",X"00",X"08",X"0C",X"20",X"30",X"8F",X"00",X"7C",X"20",X"F0",X"40",X"F6",X"55",X"BD",X"40", + X"51",X"7F",X"00",X"D7",X"23",X"05",X"0C",X"81",X"00",X"81",X"30",X"20",X"00",X"C0",X"00",X"00", + X"F5",X"08",X"7C",X"20",X"5F",X"00",X"42",X"C0",X"08",X"30",X"82",X"0C",X"40",X"00",X"40",X"00", + X"00",X"3F",X"3F",X"FC",X"C0",X"03",X"00",X"03",X"00",X"4C",X"01",X"F9",X"00",X"A8",X"02",X"94", + X"3A",X"95",X"FF",X"79",X"F7",X"FA",X"3F",X"FE",X"7F",X"FD",X"BF",X"EF",X"FC",X"BF",X"F2",X"5F", + X"00",X"83",X"02",X"0C",X"00",X"00",X"00",X"02",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"C2",X"4F",X"08",X"17",X"20",X"03",X"81",X"03",X"04",X"00",X"C0",X"08",X"00",X"00",X"00",X"80", + X"5A",X"AF",X"75",X"FD",X"7D",X"7F",X"7B",X"FF",X"7F",X"EF",X"FD",X"FA",X"7F",X"78",X"FB",X"DC", + X"F0",X"00",X"FF",X"00",X"7F",X"40",X"D4",X"FC",X"F5",X"00",X"F5",X"40",X"BD",X"10",X"2C",X"00", + X"D0",X"FC",X"C0",X"3F",X"00",X"0F",X"01",X"08",X"20",X"40",X"00",X"14",X"08",X"00",X"00",X"00", + X"0B",X"00",X"02",X"C0",X"C0",X"A0",X"F1",X"20",X"30",X"00",X"0C",X"00",X"03",X"00",X"00",X"00", + X"00",X"00",X"C0",X"00",X"30",X"0C",X"0C",X"00",X"03",X"C0",X"00",X"FD",X"00",X"BF",X"00",X"AF", + X"00",X"01",X"0C",X"00",X"03",X"00",X"13",X"C4",X"42",X"C1",X"2A",X"F3",X"EB",X"F3",X"7F",X"BC", + X"00",X"0B",X"0C",X"02",X"03",X"F0",X"00",X"3F",X"00",X"0F",X"14",X"03",X"10",X"88",X"04",X"01", + X"DF",X"EF",X"F7",X"FF",X"BB",X"FB",X"FF",X"FE",X"FD",X"FE",X"FF",X"5E",X"FF",X"D5",X"FE",X"F5", + X"00",X"00",X"04",X"01",X"30",X"08",X"30",X"28",X"F4",X"A0",X"F0",X"83",X"FC",X"BF",X"FE",X"FF", + X"00",X"00",X"00",X"00",X"0C",X"00",X"30",X"00",X"F0",X"10",X"C0",X"40",X"C5",X"00",X"08",X"00", + X"7B",X"FC",X"7F",X"DE",X"7F",X"6F",X"7D",X"BF",X"56",X"FF",X"57",X"DF",X"59",X"7F",X"96",X"FA", + X"A0",X"00",X"A3",X"F0",X"BF",X"00",X"FC",X"10",X"BD",X"40",X"00",X"0C",X"FF",X"C0",X"0F",X"FE", + X"01",X"15",X"05",X"C5",X"15",X"C7",X"05",X"71",X"01",X"5D",X"00",X"44",X"01",X"11",X"00",X"12", + X"5F",X"FB",X"F5",X"6A",X"55",X"AA",X"46",X"9A",X"5A",X"57",X"65",X"1F",X"B5",X"7D",X"51",X"D5", + X"00",X"08",X"00",X"42",X"00",X"02",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"54",X"54",X"05",X"51",X"11",X"CC",X"41",X"75",X"04",X"57",X"00",X"90",X"00",X"0F",X"00",X"00", + X"FA",X"55",X"BA",X"A9",X"AE",X"B5",X"E2",X"FD",X"AB",X"F5",X"6A",X"FD",X"6F",X"BF",X"5B",X"C7", + X"D4",X"C0",X"53",X"54",X"D5",X"50",X"14",X"00",X"53",X"40",X"7D",X"10",X"51",X"54",X"54",X"60", + X"58",X"15",X"5E",X"5D",X"97",X"15",X"B5",X"4D",X"05",X"04",X"C1",X"40",X"00",X"00",X"00",X"00", + X"CA",X"80",X"01",X"00",X"D4",X"00",X"51",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"1F",X"01",X"0F",X"00",X"83",X"00",X"0F",X"00",X"0A",X"00",X"A8",X"00",X"04",X"00",X"00", + X"3F",X"2B",X"FA",X"5E",X"D5",X"56",X"55",X"16",X"1F",X"D2",X"CF",X"15",X"33",X"D6",X"CF",X"25", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"C5",X"10",X"01",X"00",X"81",X"00",X"00",X"00",X"02",X"00",X"02",X"00",X"00",X"00",X"00", + X"A9",X"5A",X"EA",X"57",X"55",X"A5",X"14",X"55",X"5B",X"ED",X"4C",X"FF",X"7F",X"33",X"4C",X"C0", + X"C3",X"00",X"F0",X"00",X"3C",X"00",X"70",X"00",X"54",X"00",X"05",X"00",X"30",X"00",X"C0",X"00", + X"00",X"CC",X"C3",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"02",X"FB",X"13",X"BE",X"0F",X"EA",X"0F",X"5E",X"3E",X"95",X"38",X"65",X"C0",X"A6",X"02",X"9B", + X"FD",X"E0",X"E6",X"84",X"9A",X"E1",X"6B",X"F8",X"AA",X"BC",X"6F",X"C3",X"AB",X"F0",X"BB",X"4C", + X"08",X"1F",X"20",X"4F",X"01",X"0C",X"04",X"3C",X"00",X"3C",X"0C",X"30",X"00",X"C3",X"00",X"C0", + X"BE",X"10",X"2F",X"84",X"73",X"E0",X"70",X"C8",X"BC",X"C2",X"8C",X"30",X"0C",X"00",X"03",X"00", + X"0C",X"0F",X"20",X"3F",X"00",X"FD",X"03",X"C2",X"00",X"10",X"0A",X"03",X"20",X"0C",X"80",X"30", + X"DB",X"EA",X"6F",X"FB",X"BF",X"2A",X"FE",X"FB",X"F3",X"CE",X"02",X"FE",X"03",X"CA",X"0F",X"22", + X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3C",X"00",X"30",X"0C",X"02",X"00",X"08",X"00",X"00",X"00",X"20",X"00",X"03",X"00",X"00",X"00", + X"CA",X"BF",X"FE",X"A0",X"FD",X"A3",X"D5",X"28",X"5D",X"62",X"83",X"5A",X"13",X"14",X"80",X"C1", + X"4F",X"00",X"40",X"C0",X"10",X"00",X"14",X"00",X"01",X"00",X"80",X"10",X"A0",X"04",X"20",X"00", + X"80",X"00",X"20",X"00",X"08",X"0C",X"02",X"00",X"C0",X"00",X"00",X"80",X"10",X"00",X"04",X"00", + X"C8",X"03",X"32",X"00",X"00",X"80",X"00",X"00",X"C0",X"00",X"0C",X"00",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"02",X"00",X"00",X"04",X"05",X"01",X"10",X"00",X"57",X"0C",X"17",X"03",X"5C", + X"0A",X"00",X"02",X"00",X"86",X"8D",X"A5",X"5C",X"69",X"90",X"DA",X"96",X"D6",X"AA",X"35",X"9A", + X"02",X"F5",X"30",X"96",X"00",X"2A",X"0F",X"03",X"03",X"E7",X"00",X"3C",X"00",X"FF",X"03",X"07", + X"F9",X"59",X"E9",X"44",X"AA",X"55",X"A9",X"95",X"E9",X"59",X"F5",X"6A",X"35",X"AA",X"D6",X"FB", + X"00",X"32",X"00",X"02",X"0C",X"4A",X"0B",X"1A",X"02",X"D6",X"00",X"B5",X"3C",X"29",X"AF",X"E5", + X"00",X"00",X"80",X"50",X"05",X"C0",X"97",X"00",X"5C",X"0C",X"5A",X"AA",X"DA",X"80",X"55",X"0D", + X"02",X"A5",X"08",X"B6",X"00",X"1B",X"30",X"53",X"01",X"00",X"04",X"23",X"00",X"80",X"00",X"00", + X"B5",X"40",X"AB",X"54",X"AA",X"04",X"4A",X"80",X"42",X"A0",X"10",X"20",X"13",X"00",X"10",X"00", + X"00",X"00",X"00",X"05",X"01",X"14",X"00",X"00",X"00",X"03",X"00",X"0F",X"00",X"FC",X"00",X"02", + X"57",X"EC",X"41",X"AA",X"3E",X"BA",X"FE",X"D6",X"FB",X"5E",X"F5",X"7F",X"14",X"3F",X"43",X"FF", + X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F1",X"03",X"C1",X"05",X"04",X"10",X"04",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"6A",X"BA",X"A9",X"7F",X"AA",X"D7",X"9A",X"BD",X"95",X"AC",X"BD",X"F3",X"BD",X"7F",X"EF",X"53", + X"D4",X"00",X"30",X"00",X"C0",X"00",X"F0",X"00",X"30",X"00",X"0C",X"00",X"C0",X"00",X"F0",X"00", + X"FF",X"DC",X"FC",X"D5",X"3C",X"3D",X"0F",X"3D",X"03",X"0F",X"00",X"C0",X"00",X"00",X"00",X"00", + X"3C",X"00",X"03",X"C0",X"00",X"00",X"50",X"00",X"C4",X"00",X"50",X"00",X"04",X"00",X"01",X"00", + X"01",X"55",X"00",X"01",X"00",X"0A",X"00",X"A8",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"03", + X"55",X"A5",X"69",X"69",X"95",X"65",X"01",X"26",X"30",X"15",X"FF",X"D9",X"C7",X"A5",X"1A",X"06", + X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"02",X"80",X"C2",X"03",X"0E",X"0C",X"0C",X"00",X"00",X"00",X"0C",X"00",X"00",X"00",X"00", + X"5A",X"AA",X"6A",X"B0",X"9B",X"FC",X"AA",X"C3",X"A6",X"50",X"65",X"6A",X"69",X"50",X"05",X"D5", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"00",X"00",X"00", + X"4A",X"FD",X"70",X"8F",X"0F",X"C0",X"00",X"C0",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"10",X"00",X"C4",X"00",X"30",X"00",X"0C",X"00",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"01",X"10",X"23",X"01",X"0A",X"72",X"00",X"1F",X"02",X"8A",X"30",X"17",X"C3",X"1C", + X"08",X"00",X"30",X"C0",X"8C",X"08",X"BE",X"34",X"FF",X"C0",X"CB",X"12",X"EF",X"FC",X"FE",X"04", + X"08",X"23",X"21",X"0C",X"00",X"F2",X"02",X"0A",X"08",X"48",X"00",X"23",X"01",X"30",X"00",X"02", + X"33",X"81",X"9C",X"F0",X"09",X"4C",X"D4",X"A0",X"CC",X"08",X"03",X"00",X"10",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"55",X"00",X"50",X"00",X"50",X"00",X"50",X"00",X"50",X"00",X"55",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"0F",X"00",X"FF",X"0F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FA",X"FF",X"AA", + X"00",X"00",X"51",X"55",X"51",X"01",X"01",X"01",X"01",X"01",X"51",X"01",X"51",X"55",X"00",X"00", + X"00",X"00",X"45",X"55",X"45",X"05",X"40",X"14",X"41",X"40",X"45",X"05",X"45",X"55",X"00",X"00", + X"00",X"00",X"0A",X"AA",X"FF",X"EA",X"AA",X"AA",X"FA",X"AA",X"AA",X"A8",X"AA",X"A0",X"AA",X"80", + X"AA",X"FF",X"A8",X"FF",X"A0",X"FF",X"80",X"3F",X"0C",X"3F",X"0F",X"FF",X"0F",X"F1",X"0F",X"FF", + X"00",X"00",X"14",X"51",X"14",X"51",X"14",X"51",X"15",X"55",X"15",X"05",X"14",X"01",X"00",X"00", + X"00",X"00",X"15",X"15",X"15",X"14",X"15",X"14",X"15",X"14",X"15",X"14",X"15",X"15",X"00",X"00", + X"FF",X"AA",X"FF",X"2A",X"FF",X"0A",X"FC",X"02",X"FC",X"00",X"FC",X"00",X"3C",X"00",X"F0",X"00", + X"00",X"00",X"AA",X"A0",X"AB",X"FF",X"AA",X"AA",X"AA",X"AF",X"2A",X"AA",X"0A",X"AA",X"02",X"AA", + X"00",X"00",X"54",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"14",X"00",X"54",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"AF",X"FF",X"FF",X"FF",X"FF",X"FF",X"AF",X"FF",X"AA",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"F0",X"00",X"FF",X"00",X"FF",X"F0",X"FF",X"FF", + X"A8",X"00",X"AB",X"0A",X"AA",X"02",X"2A",X"C2",X"2A",X"C2",X"2A",X"AA",X"2A",X"B2",X"0A",X"B2", + X"00",X"00",X"A0",X"AA",X"BC",X"AA",X"B2",X"AA",X"B2",X"AA",X"BA",X"BA",X"BA",X"BA",X"BA",X"BA", + X"0A",X"BA",X"0A",X"BA",X"0A",X"BA",X"02",X"AA",X"02",X"AB",X"00",X"A8",X"00",X"A0",X"00",X"00", + X"CA",X"C2",X"EA",X"C2",X"EA",X"C2",X"2A",X"C2",X"2A",X"CA",X"AA",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0A",X"80",X"C2",X"AA",X"C2",X"AA",X"C2",X"AF",X"C2",X"AC",X"BA",X"AA",X"B2",X"AA", + X"00",X"00",X"00",X"00",X"A2",X"A8",X"AC",X"AF",X"EC",X"AC",X"0C",X"AC",X"B0",X"AF",X"C0",X"AE", + X"B2",X"AC",X"B2",X"AF",X"B2",X"AA",X"B2",X"AA",X"8A",X"A8",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"AE",X"EC",X"AA",X"AC",X"AB",X"A2",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"2A",X"82",X"EA",X"0A",X"EA",X"0A",X"AA",X"EA",X"BA",X"EA",X"BA",X"EA", + X"00",X"00",X"00",X"00",X"AA",X"0A",X"BA",X"BA",X"3A",X"BA",X"3A",X"BA",X"EA",X"BA",X"00",X"3A", + X"BA",X"EA",X"3A",X"EA",X"FA",X"3A",X"2A",X"8A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"3A",X"FA",X"BA",X"BA",X"BA",X"AA",X"BA",X"AA",X"0A",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"2A",X"A2",X"AA",X"AE",X"AB",X"AE",X"BF",X"8E",X"83",X"0E",X"AA",X"0E",X"AA",X"0E", + X"00",X"AA",X"A3",X"A8",X"A2",X"A0",X"AE",X"A0",X"AE",X"80",X"AA",X"80",X"AA",X"00",X"AA",X"A8", + X"8E",X"0E",X"80",X"CE",X"B0",X"EE",X"AB",X"EE",X"AA",X"AE",X"2A",X"A2",X"00",X"00",X"00",X"00", + X"A0",X"EA",X"A0",X"EA",X"A3",X"EA",X"AF",X"AA",X"AA",X"A8",X"AA",X"A8",X"0A",X"80",X"00",X"00", + X"00",X"00",X"01",X"31",X"10",X"5A",X"04",X"6F",X"05",X"2E",X"01",X"79",X"54",X"A9",X"07",X"65", + X"43",X"00",X"14",X"C4",X"94",X"50",X"E1",X"9C",X"9E",X"80",X"DA",X"E4",X"F6",X"95",X"5A",X"E0", + X"03",X"6A",X"0C",X"AB",X"30",X"59",X"01",X"45",X"0C",X"54",X"00",X"10",X"00",X"C0",X"00",X"00", + X"DA",X"A7",X"AB",X"10",X"AE",X"54",X"51",X"40",X"90",X"50",X"44",X"24",X"41",X"00",X"40",X"00", + X"00",X"30",X"02",X"04",X"1C",X"68",X"C5",X"85",X"06",X"97",X"10",X"AF",X"05",X"AA",X"2B",X"FE", + X"8C",X"00",X"A3",X"20",X"6C",X"80",X"BC",X"78",X"F9",X"61",X"AA",X"99",X"A6",X"8C",X"61",X"F0", + X"0F",X"8A",X"30",X"9F",X"0A",X"53",X"11",X"0B",X"40",X"36",X"00",X"38",X"00",X"C0",X"03",X"00", + X"9F",X"87",X"A5",X"F0",X"E5",X"8C",X"4E",X"42",X"53",X"90",X"00",X"84",X"91",X"00",X"00",X"30", + X"00",X"80",X"00",X"E0",X"04",X"08",X"01",X"C1",X"C0",X"74",X"30",X"07",X"03",X"31",X"00",X"87", + X"30",X"0C",X"8C",X"80",X"12",X"10",X"58",X"40",X"61",X"00",X"44",X"00",X"1D",X"50",X"51",X"03", + X"20",X"D1",X"08",X"14",X"00",X"50",X"20",X"42",X"03",X"08",X"0C",X"00",X"00",X"20",X"80",X"00", + X"D4",X"80",X"75",X"0E",X"12",X"40",X"10",X"10",X"08",X"00",X"00",X"30",X"10",X"0C",X"00",X"00", + X"00",X"02",X"02",X"08",X"2B",X"EA",X"AC",X"38",X"BF",X"D3",X"AD",X"7F",X"95",X"CF",X"57",X"FB", + X"00",X"00",X"00",X"00",X"30",X"00",X"F0",X"00",X"E4",X"00",X"90",X"00",X"C3",X"00",X"C0",X"00", + X"5A",X"A1",X"6A",X"97",X"9A",X"7E",X"A9",X"FF",X"6A",X"F4",X"5A",X"BD",X"A6",X"FF",X"EA",X"8F", + X"7C",X"00",X"FF",X"C0",X"B0",X"30",X"E0",X"00",X"08",X"0C",X"00",X"C0",X"C0",X"00",X"FC",X"00", + X"00",X"00",X"00",X"08",X"00",X"20",X"00",X"33",X"01",X"01",X"04",X"04",X"00",X"40",X"00",X"00", + X"0F",X"EA",X"35",X"E8",X"D3",X"EA",X"0F",X"AE",X"2E",X"BE",X"3F",X"FF",X"BC",X"F7",X"F0",X"1D", + X"0C",X"05",X"30",X"04",X"00",X"C0",X"00",X"82",X"02",X"00",X"00",X"03",X"00",X"08",X"00",X"00", + X"CB",X"7C",X"43",X"F0",X"8F",X"14",X"0F",X"00",X"3C",X"12",X"00",X"10",X"00",X"40",X"04",X"00", + X"8F",X"D0",X"DF",X"F4",X"F7",X"39",X"FD",X"82",X"B7",X"70",X"B1",X"FC",X"FC",X"71",X"CE",X"1C", + X"00",X"00",X"C4",X"00",X"40",X"00",X"00",X"80",X"A0",X"00",X"0C",X"00",X"03",X"00",X"20",X"10", + X"F0",X"35",X"FC",X"BD",X"34",X"30",X"3C",X"0C",X"0C",X"00",X"83",X"20",X"80",X"08",X"20",X"02", + X"00",X"04",X"02",X"00",X"80",X"80",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"EF",X"6F",X"EF",X"67",X"FE",X"66",X"FF",X"66",X"6E",X"26",X"6F",X"26",X"6E",X"26",X"6F", + X"FB",X"BF",X"FB",X"F9",X"BF",X"D9",X"FF",X"99",X"B9",X"99",X"F9",X"99",X"B9",X"98",X"F9",X"98", + X"26",X"6F",X"06",X"55",X"01",X"55",X"03",X"FF",X"02",X"AA",X"00",X"FF",X"00",X"0A",X"00",X"03", + X"F9",X"98",X"55",X"90",X"55",X"40",X"FF",X"C0",X"AA",X"80",X"FF",X"00",X"A0",X"00",X"C0",X"00", + X"55",X"55",X"55",X"55",X"6A",X"A5",X"5A",X"95",X"56",X"A5",X"55",X"A9",X"55",X"6A",X"55",X"5A", + X"55",X"55",X"55",X"55",X"5A",X"A9",X"56",X"A5",X"5A",X"95",X"6A",X"55",X"A9",X"55",X"A5",X"55", + X"55",X"5A",X"55",X"6A",X"55",X"A9",X"56",X"A5",X"5A",X"95",X"6A",X"A5",X"55",X"55",X"55",X"55", + X"A5",X"55",X"A9",X"55",X"6A",X"55",X"5A",X"95",X"56",X"A5",X"5A",X"A9",X"55",X"55",X"55",X"55"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/build_id.tcl b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_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/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/build_id.v b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/build_id.v new file mode 100644 index 00000000..75d3f865 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171116" +`define BUILD_TIME "122617" diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c3e13c5c --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1094 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..7e8a9995 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,370 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..7d407fb8 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2027 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..6904b66b --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..998033ef --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80a.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80a.vhd new file mode 100644 index 00000000..33d61068 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/cpu/T80a.vhd @@ -0,0 +1,280 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80a is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLK_EN_SYS : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80a; + +architecture rtl of T80a is + + signal CEN : std_logic; + signal Reset_s : std_logic; + signal IntCycle_n : std_logic; + signal IORQ : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal MREQ : std_logic; + signal MReq_Inhibit : std_logic; + signal Req_Inhibit : std_logic; + signal RD : std_logic; + signal MREQ_n_i : std_logic; + signal IORQ_n_i : std_logic; + signal RD_n_i : std_logic; + signal WR_n_i : std_logic; + signal RFSH_n_i : std_logic; + signal BUSAK_n_i : std_logic; + signal A_i : std_logic_vector(15 downto 0); + signal DO_Reg : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector (7 downto 0); -- Input synchroniser + signal Wait_s : std_logic; + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + -- clock enable supplied from clocking system + CEN <= CLK_EN_SYS; + + BUSAK_n <= BUSAK_n_i; + MREQ_n_i <= not MREQ or (Req_Inhibit and MReq_Inhibit); + RD_n_i <= not RD or Req_Inhibit; + + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DO <= DO_Reg; + +-- process (RESET_n, CLK_n) +-- begin +-- if RESET_n = '0' then +-- Reset_s <= '0'; +-- elsif CLK_n'event and CLK_n = '1' then +-- Reset_s <= '1'; +-- end if; +-- end process; + -- T80 reset input has already proper characteristics: + -- * asynchronous assertion + -- * deassertion synchronous to CLK_n (main_clk) + Reset_s <= RESET_n; + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, + DInst => DI, + DI => DI_Reg, + DO => DO_Reg, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + if CEN = '1' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then + DI_Reg <= to_x01(DI); + end if; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + WR_n_i <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + WR_n_i <= '1'; + if TState = "001" then -- To short for IO writes !!!!!!!!!!!!!!!!!!! + WR_n_i <= not Write; + end if; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + Req_Inhibit <= '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and TState = "010" then + Req_Inhibit <= '1'; + else + Req_Inhibit <= '0'; + end if; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + MReq_Inhibit <= '0'; + elsif CLK_n'event and CLK_n = '0' then + if CEN = '1' then + if MCycle = "001" and TState = "010" then + MReq_Inhibit <= '1'; + else + MReq_Inhibit <= '0'; + end if; + end if; + end if; + end process; + + process(Reset_s,CLK_n) + begin + if Reset_s = '0' then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '0'; + elsif CLK_n'event and CLK_n = '0' then + if CEN = '1' then + + if MCycle = "001" then + if TState = "001" then + RD <= IntCycle_n; + MREQ <= IntCycle_n; + IORQ_n_i <= IntCycle_n; + end if; + if TState = "011" then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '1'; + end if; + if TState = "100" then + MREQ <= '0'; + end if; + else + if TState = "001" and NoRead = '0' then + RD <= not Write; + IORQ_n_i <= not IORQ; + MREQ <= not IORQ; + end if; + if TState = "011" then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '0'; + end if; + end if; + + end if; + end if; + end process; + +end; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/dac.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/dac.vhd new file mode 100644 index 00000000..75d941cb --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_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 := 6 + ); + 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/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/dpram.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/hq2x.sv b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_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/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/keyboard.v b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug.vhd new file mode 100644 index 00000000..a1a186fe --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug.vhd @@ -0,0 +1,243 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- Toplevel port for Papilio Plus board. +-- +------------------------------------------------------------------------------- +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + +library ieee; + use ieee.numeric_std.all; + +use work.ladybug_dip_pack.all; + +entity ladybugt is +port ( + -- Global Interface ------------------------------------------------------- + CLK_IN : in std_logic; -- 20MHz + I_RESET : in std_logic; + + -- VGA Interface ---------------------------------------------------------- + O_VIDEO_R : out std_logic_vector( 1 downto 0); + O_VIDEO_G : out std_logic_vector( 1 downto 0); + O_VIDEO_B : out std_logic_vector( 1 downto 0); + O_VSYNC : out std_logic; + O_HSYNC : out std_logic; + O_VBLANK : out std_logic; + O_HBLANK : out std_logic; + O_PIXCE : out std_logic; + + -- Audio Interface -------------------------------------------------------- + O_AUDIO : out signed(7 downto 0); + + but_coin_s : in std_logic_vector( 1 downto 0); + but_fire_s : in std_logic_vector( 1 downto 0); + but_bomb_s : in std_logic_vector( 1 downto 0); + but_tilt_s : in std_logic_vector( 1 downto 0); + but_select_s : in std_logic_vector( 1 downto 0); + but_up_s : in std_logic_vector( 1 downto 0); + but_down_s : in std_logic_vector( 1 downto 0); + but_left_s : in std_logic_vector( 1 downto 0); + but_right_s : in std_logic_vector( 1 downto 0) +); +end ladybugt; + +architecture struct of ladybugt is + + signal + ps2_codeready, + clk_20mhz_s, + clk_en_5mhz_s, + ext_res_n_s, + ext_res_s, + audio_s, + vid_hsync, + vid_vsync, + vga_hsync, + vid_comp_sync_n, + vga_vsync : std_logic; + + signal rom_cpu_a_s : std_logic_vector(14 downto 0); + signal rom_cpu_d_s : std_logic_vector( 7 downto 0); + signal rom_cpu_d1 : std_logic_vector( 7 downto 0); + signal rom_cpu_d2 : std_logic_vector( 7 downto 0); + signal rom_cpu_d3 : std_logic_vector( 7 downto 0); + signal rom_cpu_d4 : std_logic_vector( 7 downto 0); + signal rom_cpu_d5 : std_logic_vector( 7 downto 0); + signal rom_cpu_d6 : std_logic_vector( 7 downto 0); + + signal rom_char_a_s : std_logic_vector(11 downto 0); + signal rom_char_d_s : std_logic_vector(15 downto 0); + + signal rom_sprite_a_s : std_logic_vector(11 downto 0); + signal rom_sprite_d_s : std_logic_vector(15 downto 0); + + signal + dac_audio_s, + dip_block_1_s, + dip_block_2_s : std_logic_vector( 7 downto 0) := (others => '0'); + + signal ps2_scancode : std_logic_vector( 9 downto 0) := (others => '0'); + + signal + vid_rgb, + vga_rgb : std_logic_vector(15 downto 0) := (others => '0'); + + signal but_chute_s : std_logic_vector( 1 downto 0) := (others=>'0'); + +begin + + O_PIXCE <= clk_en_5mhz_s; + + but_chute_s <= not but_coin_s(1) & not but_coin_s(0); + + ----------------------------------------------------------------------------- + -- inputs assignments + ----------------------------------------------------------------------------- + ext_res_s <= I_RESET; + ext_res_n_s <= not ext_res_s; + clk_20mhz_s <= CLK_IN; + + ----------------------------------------------------------------------------- + -- Ladybug Machine + ----------------------------------------------------------------------------- + machine_b : entity work.ladybug_machine + port map ( + ext_res_n_i => ext_res_n_s, + clk_20mhz_i => clk_20mhz_s, + clk_en_5mhz_o => clk_en_5mhz_s, + tilt_n_i => but_tilt_s(0), + player_select_n_i => but_select_s, + player_fire_n_i => but_fire_s, + player_up_n_i => but_up_s, + player_right_n_i => but_right_s, + player_down_n_i => but_down_s, + player_left_n_i => but_left_s, + player_bomb_n_i => but_bomb_s, + right_chute_i => but_chute_s(0), + left_chute_i => but_chute_s(1), + dip_block_1_i => dip_block_1_s, + dip_block_2_i => dip_block_2_s, + rgb_r_o => O_VIDEO_R, + rgb_g_o => O_VIDEO_G, + rgb_b_o => O_VIDEO_B, + hsync_n_o => O_HSYNC, + vsync_n_o => O_VSYNC, + vblank_o => O_VBLANK, + hblank_o => O_HBLANK, + audio_o => O_AUDIO, + rom_cpu_a_o => rom_cpu_a_s, + rom_cpu_d_i => rom_cpu_d_s, + rom_char_a_o => rom_char_a_s, + rom_char_d_i => rom_char_d_s, + rom_sprite_a_o => rom_sprite_a_s, + rom_sprite_d_i => rom_sprite_d_s + ); + + ----------------------------------------------------------------------------- + -- Building the DIP Switches - see file ladybug_dip_pack.vhd + ----------------------------------------------------------------------------- +-- dip_block_1_s <= lb_dip_block_1_c; -- Lady Bug +-- dip_block_1_s <= do_dip_block_1_c; -- Dorodon + dip_block_1_s <= ca_dip_block_1_c; -- Cosmic Avenger + dip_block_2_s <= price_dip_block_2_c; -- Common for all games (coins per game pricing) + + ----------------------------------------------------------------------------- + -- Game ROMs + ----------------------------------------------------------------------------- + inst_rom_spritel : entity work.rom_sprite_l + port map ( + CLK => clk_20mhz_s, + ADDR => rom_sprite_a_s, + DATA => rom_sprite_d_s( 7 downto 0) + ); + + inst_rom_spriteu : entity work.rom_sprite_u + port map ( + CLK => clk_20mhz_s, + ADDR => rom_sprite_a_s, + DATA => rom_sprite_d_s(15 downto 8) + ); + + inst_rom_charl : entity work.rom_char_l + port map ( + CLK => clk_20mhz_s, + ADDR => rom_char_a_s, + DATA => rom_char_d_s( 7 downto 0) + ); + + inst_rom_charu : entity work.rom_char_u + port map ( + CLK => clk_20mhz_s, + ADDR => rom_char_a_s, + DATA => rom_char_d_s(15 downto 8) + ); + + inst_rom_cpu1 : entity work.rom_cpu1 + port map ( + CLK => clk_20mhz_s, + ADDR => rom_cpu_a_s(12 downto 0), + DATA => rom_cpu_d1 + ); + + inst_rom_cpu2 : entity work.rom_cpu2 + port map ( + CLK => clk_20mhz_s, + ADDR => rom_cpu_a_s(12 downto 0), + DATA => rom_cpu_d2 + ); + + inst_rom_cpu3 : entity work.rom_cpu3 + port map ( + CLK => clk_20mhz_s, + ADDR => rom_cpu_a_s(12 downto 0), + DATA => rom_cpu_d3 + ); + + ----------------------------------------------------------------------------- + -- Program ROMs data mux + ----------------------------------------------------------------------------- + rom_cpu_d_s <= + rom_cpu_d1 when rom_cpu_a_s(14 downto 13) = "00" else + rom_cpu_d2 when rom_cpu_a_s(14 downto 13) = "01" else + rom_cpu_d3 when rom_cpu_a_s(14 downto 13) = "10" else + (others=>'0'); + +end struct; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_addr_dec.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_addr_dec.vhd new file mode 100644 index 00000000..6d857f6c --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_addr_dec.vhd @@ -0,0 +1,130 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_addr_dec.vhd,v 1.10 2005/12/10 14:51:46 arnim Exp $ +-- +-- Address decoder of the CPU Unit. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_addr_dec is + + port ( + clk_20mhz_i : in std_logic; + res_n_i : in std_logic; + a_i : in std_logic_vector(15 downto 12); + rd_n_i : in std_logic; + wr_n_i : in std_logic; + mreq_n_i : in std_logic; + rfsh_n_i : in std_logic; + cs_n_o : out std_logic_vector(15 downto 0); + ram_cpu_cs_n_o : out std_logic + ); + +end ladybug_addr_dec; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_addr_dec is + +begin + + ----------------------------------------------------------------------------- + -- Process adec + -- + -- Purpose: + -- Decode the CPU address and generate one-hot chip select signals. + -- Each chip select enables a 4 KByte address segment. + -- + -- The chip select outputs are registered with the 20 MHz clock to + -- break potentially long combinational paths here. + -- + adec: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + cs_n_o <= (others => '1'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- default assignment + cs_n_o <= (others => '1'); + + if a_i(15) = '0' then + if rd_n_i = '0' or wr_n_i = '0' then + cs_n_o(to_integer(unsigned( '0' & a_i(14 downto 12) ))) <= '0'; + end if; + + else + if mreq_n_i = '0' and rfsh_n_i = '1' then + cs_n_o(to_integer(unsigned( '1' & a_i(14 downto 12) ))) <= '0'; + end if; + + end if; + + end if; + end process adec; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process cs_ext_ram + -- + -- Purpose: + -- Builds the combinational chip select signal for the external CPU RAM. + -- + cs_ext_ram: process (a_i, + rd_n_i, wr_n_i) + begin + if (rd_n_i = '0' or wr_n_i = '0') and + a_i(15 downto 12) = "0110" then + ram_cpu_cs_n_o <= '0'; + else + ram_cpu_cs_n_o <= '1'; + end if; + end process cs_ext_ram; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_char.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_char.vhd new file mode 100644 index 00000000..1ca149f3 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_char.vhd @@ -0,0 +1,740 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_char.vhd,v 1.18 2005/10/10 22:02:14 arnim Exp $ +-- +-- Character Video Module of Lady Bug Machine. +-- +-- This unit contains most of the logic found on schematic page three. +-- Excluded parts are: +-- * the 10 MHz and 5 MHz clock generation +-- moved into separate module on toplevel of Lady Bug machine +-- * the video timing circuitry +-- moved into separate module on toplevel of video unit +-- * the video MUX and RGB conversion unit +-- moved into separate module at toplevel of video unit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity ladybug_char is + port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + res_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_4mhz_i : in std_logic; + -- CPU Interface ---------------------------------------------------------- + cs10_n_i : in std_logic; + cs13_n_i : in std_logic; + a_i : in std_logic_vector(10 downto 0); + rd_n_i : in std_logic; + wr_n_i : in std_logic; + wait_n_o : out std_logic; + d_from_cpu_i : in std_logic_vector( 7 downto 0); + d_from_char_o : out std_logic_vector( 7 downto 0); + -- RGB Video Interface ---------------------------------------------------- + h_i : in std_logic_vector( 3 downto 0); + h_t_i : in std_logic_vector( 3 downto 0); + ha_t_rise_i : in std_logic; + hx_i : in std_logic; + v_i : in std_logic_vector( 3 downto 0); + v_t_i : in std_logic_vector( 3 downto 0); + hbl_i : in std_logic; + blank_flont_i : in std_logic; + blank_o : out std_logic; + crg_o : out std_logic_vector( 5 downto 1); + vblank_o : out std_logic; + hblank_o : out std_logic; + -- Character ROM Interface ------------------------------------------------ + rom_char_a_o : out std_logic_vector(11 downto 0); + rom_char_d_i : in std_logic_vector(15 downto 0) + ); + +end ladybug_char; + +architecture rtl of ladybug_char is + + signal flip_screen_q : std_logic; + + signal h0_s, + h1_s, + h2_s : std_logic; + signal h_flip_s, + h_t_flip_s : std_logic_vector(3 downto 0); + signal v_flip_s, + v_t_flip_s : std_logic_vector(3 downto 0); + + signal h_ctrl_d_s, + h_ctrl_s, + h_ctrl_n_s, + h_ctrl_d_out_s, + h_ctrl_d_n_out_s, + h_ctrl_rise_s, + h_ctrl_n_rise_s : std_logic_vector(4 downto 1); + + signal hx_ctrl_q, + hx_ctrl_s, + hx_ctrl_n_rise_s : std_logic; + signal hx_ctrl_clear_q : std_logic; + + signal b1_ff_q, + b1_ff_s, + b1_ff_n_rise_s : std_logic; + + signal wait_q : std_logic; + signal wait_clear_q : std_logic; + + signal cgs_q, + cgs_s, + cgs_rise_s : std_logic; + + signal ram_addr_s : std_logic_vector(9 downto 0); + signal select_a_s : std_logic; + + signal char_ram_cs_n_s, + char_ram_we_n_s : std_logic; + signal col_ram_cs_n_s, + col_ram_we_n_s : std_logic; + signal d_from_char_ram_s : std_logic_vector(7 downto 0); + signal d_from_col_ram_s : std_logic_vector(3 downto 0); + + signal s_q : std_logic_vector( 7 downto 0); + signal d_char_ram_q : std_logic_vector( 7 downto 0); + signal d_col_ram_q : std_logic_vector( 3 downto 0); + + signal d_char_rom_q : std_logic_vector(15 downto 0); + signal crg1_s, + crg2_s, + crg3_q, + crg4_q, + crg5_q : std_logic; + + signal hbl_q,hbl_d : std_logic; + + signal hcnt : integer; + signal vdd_s : std_logic; + +begin + + vdd_s <= '1'; + + ----------------------------------------------------------------------------- + -- Process flip + -- + -- Purpose: + -- Implement the flip_screen flag. + -- + flip: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + -- Actually, this asynchronous reset of the ls259 is not 100% + -- equivalent to the real behavior of this circuit. However, + -- the flip_screen latch is modelled like this for the sake of + -- simplicity. It's sufficient for the purpose here. + flip_screen_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if a_i(2 downto 0) = "000" and cs10_n_i = '0' then + flip_screen_q <= d_from_cpu_i(0); + end if; + + end if; + end process flip; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process h_flip + -- + -- Purpose: + -- Build the flipped horizontal timing signals. + -- + h_flip: process (flip_screen_q, + h_i, h_t_i, + s_q) + variable a_v, b_v, + sum_v : unsigned(8 downto 0); + begin + -- calculate sum + a_v := '0' & unsigned(s_q); + b_v := '0' & unsigned(h_t_i) & unsigned(h_i); + sum_v := a_v + b_v; + + -- h0,1,2 are taken from directly from sum + h0_s <= sum_v(0); + h1_s <= sum_v(1); + h2_s <= sum_v(2); + + -- now flip + for idx in 3 downto 0 loop + h_flip_s(idx) <= flip_screen_q xor sum_v(idx); + h_t_flip_s(idx) <= flip_screen_q xor sum_v(idx + 4); + end loop; + end process h_flip; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process v_flip + -- + -- Purpose: + -- Build the flipped horizontal timing signals. + -- + v_flip: process (flip_screen_q, + v_i, v_t_i) + begin + for idx in 3 downto 0 loop + v_flip_s(idx) <= flip_screen_q xor v_i(idx); + v_t_flip_s(idx) <= flip_screen_q xor v_t_i(idx); + end loop; + end process v_flip; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- The Horizontal Control Signals + -- Detailed purpose/meaning is unknown. + ----------------------------------------------------------------------------- + h_ctrl_d_s(1) <= not (not h2_s and (h1_s xor h0_s)); + h_ctrl_d_s(2) <= hx_i; + h_ctrl_d_s(3) <= not ((h1_s xor h0_s) or (not h2_s xor h1_s)); + h_ctrl_d_s(4) <= '0'; + h_ctrl_b : entity work.ttl_175 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => clk_en_5mhz_i, + por_n_i => por_n_i, + cl_n_i => vdd_s, + d_i => h_ctrl_d_s, + q_o => h_ctrl_s, + q_n_o => h_ctrl_n_s, + d_o => h_ctrl_d_out_s, + d_n_o => h_ctrl_d_n_out_s + ); + h_ctrl_rise_s <= not h_ctrl_s and h_ctrl_d_out_s; + h_ctrl_n_rise_s <= h_ctrl_s and not h_ctrl_d_n_out_s; + + + ----------------------------------------------------------------------------- + -- Process ctrl_seq + -- + -- Purpose: + -- Implemente the various sequential elements for horizontal control. + -- + ctrl_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + hx_ctrl_q <= '0'; + hx_ctrl_clear_q <= '0'; + b1_ff_q <= '0'; + wait_q <= '0'; + wait_clear_q <= '0'; + cgs_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- the HX control flip-flop + hx_ctrl_q <= hx_ctrl_s; + + -- the clear counterpart of hx_ctrl_q + if h_ctrl_s(2) = '0' then + -- pseudo-asynchronous clear + hx_ctrl_clear_q <= '0'; + elsif hx_ctrl_n_rise_s = '1' then + -- rising edge indicator acts as clock enable instead of clock + hx_ctrl_clear_q <= '1'; + end if; + + -- the mysterious B1 flip-flop + b1_ff_q <= b1_ff_s; + + -- the CGS rising edge indicator support flip-flops + cgs_q <= cgs_s; + + -- the WAIT flip-flop + if wait_clear_q = '1' then + -- pseudo-asynchronous clear + wait_q <= '0'; + elsif cgs_rise_s = '1' then + -- rising edge indicator acts as clock enable instead of clock + wait_q <= '1'; + end if; + + -- the clear counterpart of wait_q + if clk_en_4mhz_i = '1' then + wait_clear_q <= wait_q and (h_ctrl_s(3) and (b1_ff_q or hx_ctrl_q)); + end if; + + end if; + end process ctrl_seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process ctrl_comp + -- + -- Purpose: + -- Implements the combination logic for the horizontal control + -- elements. + -- + ctrl_comp: process (h_ctrl_rise_s, + hx_i, hx_ctrl_q, + hx_ctrl_clear_q, + h_ctrl_n_rise_s, + b1_ff_q, + cgs_q, cs13_n_i) + begin + -- default assignments + hx_ctrl_s <= hx_ctrl_q; + hx_ctrl_n_rise_s <= '0'; + b1_ff_s <= b1_ff_q; + b1_ff_n_rise_s <= '0'; + cgs_s <= cgs_q; + cgs_rise_s <= '0'; + + -- the HX control flip-flop ----------------------------------------------- + if hx_ctrl_clear_q = '1' then + -- pseudo-asynchronous clear + hx_ctrl_s <= '0'; + + if (not hx_ctrl_q) = '0' then + -- detct rising edge of inverted ouput + hx_ctrl_n_rise_s <= '1'; + end if; + elsif h_ctrl_rise_s(1) = '1' then + -- rising edge indicator acts as clock enable instead of clock + if hx_i = '1' then + -- toggle FF + hx_ctrl_s <= not hx_ctrl_q; + + if (not hx_ctrl_q) = '0' then + -- detct rising edge of inverted ouput + hx_ctrl_n_rise_s <= '1'; + end if; + end if; + end if; + + -- the mysterious B1 flip-flop -------------------------------------------- + if hx_ctrl_q = '1' then + -- pseudo-asynchronous clear + b1_ff_s <= '0'; + + if (not b1_ff_q) = '0' then + -- detct rising edge of inverted ouput + b1_ff_n_rise_s <= '1'; + end if; + elsif h_ctrl_n_rise_s(3) = '1' then + -- rising edge indicator acts as clock enable instead of clock + b1_ff_s <= '1'; + end if; + + -- the CGS rising edge indicator support flip-flop ------------------------ + cgs_s <= not cs13_n_i; + cgs_rise_s <= not cgs_q and not cs13_n_i; + + end process ctrl_comp; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process ram_addr + -- + -- Purpose: + -- Multiplexes the CPU address bus and the h+v timing control signals to + -- form the RAM address bus. + -- + ram_addr: process (h_flip_s, h_t_flip_s, + v_flip_s, v_t_flip_s, + a_i, + h_ctrl_s, h_ctrl_n_s, + hx_ctrl_q, + b1_ff_q) + variable a_v, b_v, g_n_v : std_logic; + variable vec_v : std_logic_vector(1 downto 0); + begin + -- default assignment + ram_addr_s <= (others => '0'); + + -- logic that drives A input of IC L4 and K4 + a_v := not (h_ctrl_n_s(1) and (b1_ff_q or hx_ctrl_q)); + -- logic that drives B input of IC L4 and K4 + b_v := hx_ctrl_q; + -- logic that drives /G input of IC J4 + g_n_v := hx_ctrl_q and (h_ctrl_n_s(1) and (b1_ff_q or hx_ctrl_q)); + + -- IC L4 and K4: Dual 4:1 Multiplexer ------------------------------------- + vec_v := b_v & a_v; + case vec_v is + when "00" => + ram_addr_s(0) <= h_flip_s (3); + ram_addr_s(1) <= h_t_flip_s(0); + -- + ram_addr_s(2) <= h_t_flip_s(1); + ram_addr_s(3) <= h_t_flip_s(2); + when "01" => + ram_addr_s(0) <= a_i (0); + ram_addr_s(1) <= a_i (1); + -- + ram_addr_s(2) <= a_i (2); + ram_addr_s(3) <= a_i (3); + when "10" => + ram_addr_s(0) <= v_t_flip_s(1); + ram_addr_s(1) <= v_t_flip_s(2); + -- + ram_addr_s(2) <= v_t_flip_s(3); + ram_addr_s(3) <= '0'; + when "11" => + ram_addr_s(0) <= a_i (0); + ram_addr_s(1) <= a_i (1); + -- + ram_addr_s(2) <= a_i (2); + ram_addr_s(3) <= a_i (3); + when others => + null; + end case; + + -- IC J4 and H4: Quad 2:1 Multiplexer ------------------------------------- + case a_v is + when '0' => + ram_addr_s(4) <= h_t_flip_s(3) and not g_n_v; + ram_addr_s(7) <= v_t_flip_s(1) and not g_n_v; + ram_addr_s(8) <= v_t_flip_s(2) and not g_n_v; + ram_addr_s(9) <= v_t_flip_s(3) and not g_n_v; + -- + ram_addr_s(5) <= v_flip_s (3); + ram_addr_s(6) <= v_t_flip_s(0); + when '1' => + ram_addr_s(4) <= a_i (4) and not g_n_v; + ram_addr_s(7) <= a_i (7) and not g_n_v; + ram_addr_s(8) <= a_i (8) and not g_n_v; + ram_addr_s(9) <= a_i (9) and not g_n_v; + -- + ram_addr_s(5) <= a_i (5); + ram_addr_s(6) <= a_i (6); + when others => + null; + end case; + + select_a_s <= a_v; + + end process ram_addr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process ram_ctrl + -- + -- Purpose: + -- Generate the control signals for the character and color RAMs. + -- This comprises: + -- * reading RAMs while the beam sweeps the screen + -- * reading RAMs to the CPU + -- * writing RAMs from the CPU + -- + ram_ctrl: process (cs13_n_i, + wait_q, + select_a_s, + a_i, + wr_n_i, rd_n_i, + d_from_char_ram_s, d_from_col_ram_s, + clk_en_4mhz_i) + variable cpu_read_char_ram_v : boolean; + variable cpu_write_char_ram_v : boolean; + variable cpu_read_col_ram_v : boolean; + variable cpu_write_col_ram_v : boolean; + variable vec_v : std_logic_vector(2 downto 0); + begin + -- default assignments + char_ram_cs_n_s <= '1'; + char_ram_we_n_s <= '1'; + col_ram_cs_n_s <= '1'; + col_ram_we_n_s <= '1'; + d_from_char_o <= (others => '1'); + cpu_read_char_ram_v := false; + cpu_write_char_ram_v := false; + cpu_read_col_ram_v := false; + cpu_write_col_ram_v := false; + + -- detect and decode CPU access + if clk_en_4mhz_i = '1' and -- operate RAMs with CPU clock + (not cs13_n_i and select_a_s and not wait_q) = '1' then + vec_v := a_i(10) & rd_n_i & wr_n_i; + case vec_v is + when "001" => + cpu_read_char_ram_v := true; + when "010" => + cpu_write_char_ram_v := true; + when "101" => + cpu_read_col_ram_v := true; + when "110" => + cpu_write_col_ram_v := true; + when others => + null; + end case; + end if; + + -- now we are prepared to generate the /CS and /WE signals for the RAMs + if select_a_s = '0' or + cpu_read_char_ram_v or cpu_write_char_ram_v then + char_ram_cs_n_s <= '0'; + end if; + if select_a_s = '0' or + cpu_read_col_ram_v or cpu_write_col_ram_v then + col_ram_cs_n_s <= '0'; + end if; + if cpu_write_char_ram_v then + char_ram_we_n_s <= '0'; + end if; + if cpu_write_col_ram_v then + col_ram_we_n_s <= '0'; + end if; + + -- and we can multiplex the data bus towards the CPU + if cpu_read_char_ram_v then + d_from_char_o <= d_from_char_ram_s; + elsif cpu_read_col_ram_v then + d_from_char_o(3 downto 0) <= d_from_col_ram_s; + end if; + + end process ram_ctrl; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- The character RAM + ----------------------------------------------------------------------------- + char_ram_b : entity work.ladybug_char_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_4mhz_i, + a_i => ram_addr_s, + cs_n_i => char_ram_cs_n_s, + we_n_i => char_ram_we_n_s, + d_i => d_from_cpu_i, + d_o => d_from_char_ram_s + ); + ----------------------------------------------------------------------------- + -- The color RAM + ----------------------------------------------------------------------------- + col_ram_b : entity work.ladybug_char_col_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_4mhz_i, + a_i => ram_addr_s, + cs_n_i => col_ram_cs_n_s, + we_n_i => col_ram_we_n_s, + d_i => d_from_cpu_i(3 downto 0), + d_o => d_from_col_ram_s + ); + + + ----------------------------------------------------------------------------- + -- Process ram_d_seq + -- + -- Purpose: + -- Implements three latch banks that save the output of the character + -- and color RAMs. + -- + ram_d_seq: process (clk_20mhz_i, por_n_i) + variable complex_rising_edge_v : boolean; + begin + if por_n_i = '0' then + s_q <= (others => '0'); + d_char_ram_q <= (others => '0'); + d_col_ram_q <= (others => '0'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- latch data from the character RAM to form input for h_flip ----------- + if hx_ctrl_n_rise_s = '1' then + s_q <= d_from_char_ram_s; + end if; + + -- latch data from the character RAM for ROM address generation --------- + -- there are three sources for a rising edge: + -- 1) falling edge of h_ctrl_n_s(1) + -- => equivalen to rising edge of h_ctrl_s(1) + -- 2) rising edge of hx_ctrl_n_q + -- 3) rising edge of b1_ff_n + -- For each source, the two have to be in a defined state to let + -- the edge propage to the latches. + complex_rising_edge_v := ((h_ctrl_rise_s(1) and + (b1_ff_q or hx_ctrl_q)) or + (hx_ctrl_n_rise_s and + (not b1_ff_q and not h_ctrl_n_s(1))) or + (b1_ff_n_rise_s and + (not hx_ctrl_q and not h_ctrl_s(1)))) = '1'; + if complex_rising_edge_v then + d_char_ram_q <= d_from_char_ram_s; + d_col_ram_q <= d_from_col_ram_s; + end if; + + end if; + end process ram_d_seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process latch_rom_d + -- + -- Purpose: + -- Latch the output of the character ROM. + -- + latch_rom_d: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + d_char_rom_q <= (others => '0'); + crg3_q <= '0'; + crg4_q <= '0'; + crg5_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if (clk_en_5mhz_i and + h2_s and h1_s and h0_s) = '1' then + d_char_rom_q <= rom_char_d_i; + crg3_q <= d_col_ram_q(0); + crg4_q <= d_col_ram_q(1); + crg5_q <= d_col_ram_q(2); + end if; + + end if; + end process latch_rom_d; + -- + ----------------------------------------------------------------------------- + -- Process hbl_seq + -- + -- Purpose: + -- Implements the flip-flop that latches HBL. + -- + hbl_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + hbl_q <= '0'; + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if clk_en_5mhz_i = '1' then + if hcnt /= 255 then + hcnt <= hcnt + 1; + end if; + end if; + if ha_t_rise_i = '1' then + hbl_q <= hbl_i; + if hbl_q = '1' and hbl_i = '0' then + hcnt <= 0; + end if; + end if; + end if; + end process hbl_seq; + -- + ----------------------------------------------------------------------------- + + process (clk_20mhz_i) + begin + if rising_edge(clk_20mhz_i) then + if clk_en_5mhz_i = '1' then + hbl_d <= hbl_q; + + if hcnt < 240 then + hblank_o <= '0'; + else + hblank_o <= '1'; + end if; + + if hbl_d = '0' and hbl_q = '1' then + vblank_o <= not blank_flont_i; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Process crg_mux + -- + -- Purpose: + -- Multiplexes the latched character ROM data to CRG1 and CRG2. + -- + crg_mux: process (d_char_rom_q, + h_flip_s, + blank_flont_i, + hbl_q) + variable blank_v : std_logic; + variable idx_v : unsigned(2 downto 0); + begin + blank_v := not (blank_flont_i and not hbl_q); + idx_v := unsigned(h_flip_s(2 downto 0)); + + if blank_v = '0' then + crg1_s <= d_char_rom_q(to_integer('0' & idx_v)); + crg2_s <= d_char_rom_q(to_integer('1' & idx_v)); + else + crg1_s <= '0'; + crg2_s <= '0'; + end if; + + blank_o <= blank_v; + end process crg_mux; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + wait_n_o <= not wait_q; + crg_o(5) <= crg5_q; + crg_o(4) <= crg4_q; + crg_o(3) <= crg3_q; + crg_o(2) <= crg2_s; + crg_o(1) <= crg1_s; + rom_char_a_o( 2 downto 0) <= v_flip_s(2 downto 0); + rom_char_a_o(10 downto 3) <= d_char_ram_q; + rom_char_a_o(11) <= d_col_ram_q(3); + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_chute.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_chute.vhd new file mode 100644 index 00000000..b3255fe0 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_chute.vhd @@ -0,0 +1,130 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_chute.vhd,v 1.3 2005/10/10 21:21:20 arnim Exp $ +-- +-- Pulse shaper for a chute input. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_chute is + + port ( + clk_20mhz_i : in std_logic; + res_n_i : in std_logic; + chute_i : in std_logic; + chute_o : out std_logic + ); + +end ladybug_chute; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_chute is + + -- 2.35e-2 s = 1 / 20,000,000 Hz * 470000 + constant chute_delay_c : natural := 470000; + + signal chute_cnt_q : unsigned(18 downto 0); + + signal chute_sync_q : std_logic_vector(1 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process sync + -- + -- Purpose: + -- Synchronize the asynchronous chute input. + -- + sync: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + chute_sync_q <= (others => '0'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + chute_sync_q(0) <= chute_i; + chute_sync_q(1) <= chute_sync_q(0); + + end if; + end process sync; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process cnt + -- + -- Purpose: + -- Count the required number of 20 MHz clock cycles before emitting + -- chute event. This is a low pass filter for the rising edge of chute_i. + -- + cnt: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + chute_cnt_q <= (others => '0'); + chute_o <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if chute_sync_q(1) = '1' then + if chute_cnt_q = chute_delay_c then + chute_o <= '1'; + else + chute_cnt_q <= chute_cnt_q + 1; + end if; + + else + -- reset counter when chute input goes back to 0 + chute_cnt_q <= (others => '0'); + chute_o <= '0'; + + end if; + + end if; + end process cnt; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_chutes.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_chutes.vhd new file mode 100644 index 00000000..7584de89 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_chutes.vhd @@ -0,0 +1,134 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_chutes.vhd,v 1.4 2005/10/10 21:21:20 arnim Exp $ +-- +-- Pulse shaping for the two chute inputs. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_chutes is + + port ( + clk_20mhz_i : in std_logic; + res_n_i : in std_logic; + right_chute_i : in std_logic; + left_chute_i : in std_logic; + cs8_n_i : in std_logic; + nmi_n_o : out std_logic; + int_n_o : out std_logic + ); + +end ladybug_chutes; + +architecture rtl of ladybug_chutes is + + signal right_chute_s, + left_chute_s : std_logic; + signal left_chute_q : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Pulse shaper for Right Chute + ----------------------------------------------------------------------------- + right_chute_b : entity work.ladybug_chute + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + chute_i => right_chute_i, + chute_o => right_chute_s + ); + + + ----------------------------------------------------------------------------- + -- Pulse shaper for Left Chute + ----------------------------------------------------------------------------- + left_chute_b : entity work.ladybug_chute + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + chute_i => left_chute_i, + chute_o => left_chute_s + ); + + + ----------------------------------------------------------------------------- + -- Process left_edge + -- + -- Purpose: + -- Implement the edge detector for the left chute. + -- Only a rising edge of the filtered chute input can trigger a new + -- interrupt to the CPU. + -- + left_edge: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + left_chute_q <= '0'; + int_n_o <= '1'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + left_chute_q <= left_chute_s; + + if cs8_n_i = '0' then + -- synchronous set, has priority over data path + int_n_o <= '1'; + + -- edge detector + elsif left_chute_s = '1' and left_chute_q = '0' then + int_n_o <= '0'; + + end if; + + end if; + end process left_edge; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + nmi_n_o <= not right_chute_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_clk.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_clk.vhd new file mode 100644 index 00000000..d3e00484 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_clk.vhd @@ -0,0 +1,158 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_clk.vhd,v 1.5 2005/10/28 21:17:41 arnim Exp $ +-- +-- Clock generator for the Lady Bug machine. +-- +-- This module generates the clock enables which are required to mimic the +-- different clocks of the Lady Bug boards. +-- +-- Theory of Operation: +-- A PLL is used to tune the external clock to 20 MHz. This forms the +-- main clock which is used by all sequential elements. +-- All derived clocks are built with clock enables to allow a synchronous +-- design style (sort of). +-- +-- Note: +-- The counters and enable signals are reset by the power-on reset. +-- Thus, the "derived clocks" run during normal system reset. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_clk is + + port ( + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + clk_en_10mhz_o : out std_logic; + clk_en_10mhz_n_o : out std_logic; + clk_en_5mhz_o : out std_logic; + clk_en_5mhz_n_o : out std_logic; + clk_en_4mhz_o : out std_logic + ); + +end ladybug_clk; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_clk is + + -- counter for 5 MHz and 10 MHz clock enables + signal clk_cnt_5mhz_q : unsigned(1 downto 0); + -- counter for 4 MHz clock enable + signal clk_cnt_4mhz_q : unsigned(2 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process clk_en + -- + -- Purpose: + -- Generates the clock enables for 10 MHz, 5 MHz, 4 MHz. + -- + clk_en: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + clk_cnt_5mhz_q <= (others => '0'); + clk_cnt_4mhz_q <= (others => '0'); + clk_en_10mhz_o <= '0'; + clk_en_10mhz_n_o <= '0'; + clk_en_5mhz_o <= '0'; + clk_en_5mhz_n_o <= '0'; + clk_en_4mhz_o <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + + ------------------------------------------------------------------------- + -- 10 MHz / 5 MHz clock domain + -- + -- counter for 10 MHz and 5 MHz clock enables + clk_cnt_5mhz_q <= clk_cnt_5mhz_q + 1; + + -- generate clock enable for 10 MHz + -- enable on every second clock of clk_20mhz_i + clk_en_10mhz_o <= clk_cnt_5mhz_q(0); + -- enable with 180 deg phase shift + clk_en_10mhz_n_o <= not clk_cnt_5mhz_q(0); + + -- generate clock enables for 5 MHz: + -- enable on every forth clock of clk_20mhz_i + if clk_cnt_5mhz_q = "11" then + clk_en_5mhz_o <= '1'; + else + clk_en_5mhz_o <= '0'; + end if; + -- enable with 180 deg phase shift + if clk_cnt_5mhz_q = "01" then + clk_en_5mhz_n_o <= '1'; + else + clk_en_5mhz_n_o <= '0'; + end if; + -- + ------------------------------------------------------------------------- + + + ------------------------------------------------------------------------- + -- 4 MHz domain + -- + -- counter for 4 MHz clock enable, wrap around after 5 clocks + clk_en_4mhz_o <= clk_cnt_4mhz_q(2); + + if clk_cnt_4mhz_q = "100" then + clk_cnt_4mhz_q <= (others => '0'); + else + clk_cnt_4mhz_q <= clk_cnt_4mhz_q + 1; + end if; + -- + ------------------------------------------------------------------------- + + end if; + end process clk_en; + -- + ----------------------------------------------------------------------------- + + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_counter.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_counter.vhd new file mode 100644 index 00000000..d07256bb --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_counter.vhd @@ -0,0 +1,95 @@ +------------------------------------------------------------------------------- +-- +-- Synchronous 8-Bit Binary Counter with preset. +-- +-- $Id: ladybug_counter.vhd,v 1.9 2005/10/10 21:59:13 arnim Exp $ +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity counter is +port ( + ck_i : in std_logic; + ck_en_i : in std_logic; + reset_n_i : in std_logic; + load_i : in std_logic; + preset_i : in std_logic_vector(7 downto 0); + q_o : out std_logic_vector(7 downto 0); + rise_q_o : out std_logic_vector(7 downto 0); + d_o : out std_logic_vector(7 downto 0); + co_o : out std_logic +); +end counter; + +architecture rtl of counter is + signal cnt_q : std_logic_vector(7 downto 0); + signal cnt_s : std_logic_vector(7 downto 0); +begin + + seq: process (ck_i, reset_n_i) + begin + if reset_n_i = '0' then + cnt_q <= (others => '0'); + elsif rising_edge(ck_i) then + cnt_q <= cnt_s; + end if; + end process seq; + + adder: process (ck_en_i, cnt_q, load_i, preset_i) + begin + cnt_s <= cnt_q; + + if ck_en_i = '1' then + if load_i = '1' then + cnt_s <= preset_i; + else + cnt_s <= cnt_q + 1; + end if; + end if; + end process adder; + + co_o <= '1' when cnt_q = x"FF" else '0'; + rise_q_o <= cnt_s and not cnt_q; + q_o <= cnt_q; + d_o <= cnt_s; +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_cpu_unit.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_cpu_unit.vhd new file mode 100644 index 00000000..7d41074f --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_cpu_unit.vhd @@ -0,0 +1,260 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_cpu_unit.vhd,v 1.19 2005/12/10 14:51:51 arnim Exp $ +-- +-- CPU Main Unit of the Lady Bug Machine. +-- +-- Actually, the PCB where the CPU resides on contains also the sound chips and +-- parts of the video controller. For the sake of simplicity, the CPU and chip +-- select logic has been moved into this separate unit. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_cpu_unit is + port ( + clk_20mhz_i : in std_logic; + clk_en_4mhz_i : in std_logic; + res_n_i : in std_logic; + rom_cpu_a_o : out std_logic_vector(14 downto 0); + rom_cpu_d_i : in std_logic_vector( 7 downto 0); + sound_wait_n_i : in std_logic; + wait_n_i : in std_logic; + right_chute_i : in std_logic; + left_chute_i : in std_logic; + gpio_in0_i : in std_logic_vector( 7 downto 0); + gpio_in1_i : in std_logic_vector( 7 downto 0); + gpio_in2_i : in std_logic_vector( 7 downto 0); + gpio_in3_i : in std_logic_vector( 7 downto 0); + gpio_extra_i : in std_logic_vector( 7 downto 0); + a_o : out std_logic_vector(10 downto 0); + d_to_cpu_i : in std_logic_vector( 7 downto 0); + d_from_cpu_o : out std_logic_vector( 7 downto 0); + rd_n_o : out std_logic; + wr_n_o : out std_logic; + cs7_n_o : out std_logic; + cs10_n_o : out std_logic; + cs11_n_o : out std_logic; + cs12_n_o : out std_logic; + cs13_n_o : out std_logic + ); + +end ladybug_cpu_unit; + +architecture struct of ladybug_cpu_unit is + + signal t80_clk_en_s : std_logic; + + signal wait_n_s : std_logic; + signal int_n_s : std_logic; + signal nmi_n_s : std_logic; + signal mreq_n_s : std_logic; + signal rd_n_s : std_logic; + signal wr_n_s : std_logic; + signal rfsh_n_s : std_logic; + signal m1_n_s : std_logic; + signal a_s : std_logic_vector(15 downto 0); + signal d_to_cpu_s : std_logic_vector( 7 downto 0); + signal d_from_cpu_s : std_logic_vector( 7 downto 0); + signal d_from_rom_s, + d_decrypted_s, + d_rom_mux_s : std_logic_vector( 7 downto 0); + signal d_from_ram_s : std_logic_vector( 7 downto 0); + signal d_from_gpio_s : std_logic_vector( 7 downto 0); + + signal cs_n_s : std_logic_vector(15 downto 0); + + signal ram_cpu_cs_n_s : std_logic; + + signal vcc_s : std_logic; + +begin + vcc_s <= '1'; + + wait_n_s <= sound_wait_n_i and wait_n_i; + + ----------------------------------------------------------------------------- + -- The T80 CPU + ----------------------------------------------------------------------------- + -- "wait" has to be modelled with the clock enable because the T80 is not + -- able to enlarge write accesses properly when they are delayed with "wait" + t80_clk_en_s <= clk_en_4mhz_i and wait_n_s; + T80a_b : entity work.T80a + generic map ( + Mode => 0 + ) + port map ( + RESET_n => res_n_i, + CLK_n => clk_20mhz_i, + CLK_EN_SYS => t80_clk_en_s, + WAIT_n => wait_n_s, + INT_n => int_n_s, + NMI_n => nmi_n_s, + BUSRQ_n => vcc_s, + M1_n => m1_n_s, + MREQ_n => mreq_n_s, + IORQ_n => open, + RD_n => rd_n_s, + WR_n => wr_n_s, + RFSH_n => rfsh_n_s, + HALT_n => open, + BUSAK_n => open, + A => a_s, + DI => d_to_cpu_s, + DO => d_from_cpu_s + ); + d_from_cpu_o <= d_from_cpu_s; + + + ----------------------------------------------------------------------------- + -- The CPU RAM + ----------------------------------------------------------------------------- + cpu_ram_b : entity work.ladybug_cpu_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_4mhz_i, + a_i => a_s(11 downto 0), + cs_n_i => cs_n_s(6), + we_n_i => wr_n_s, + d_i => d_from_cpu_s, + d_o => d_from_ram_s + ); + + ----------------------------------------------------------------------------- + -- The Address Decoder + ----------------------------------------------------------------------------- + addr_dec_b : entity work.ladybug_addr_dec + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + a_i => a_s(15 downto 12), + rd_n_i => rd_n_s, + wr_n_i => wr_n_s, + mreq_n_i => mreq_n_s, + rfsh_n_i => rfsh_n_s, + cs_n_o => cs_n_s, + ram_cpu_cs_n_o => ram_cpu_cs_n_s + ); + + + ----------------------------------------------------------------------------- + -- The General Purpose IO + ----------------------------------------------------------------------------- + gpio_b : entity work.ladybug_gpio + port map ( + a_i => a_s(1 downto 0), + cs_in_n_i => cs_n_s(9), + cs_extra_n_i => cs_n_s(14), + in0_i => gpio_in0_i, + in1_i => gpio_in1_i, + in2_i => gpio_in2_i, + in3_i => gpio_in3_i, + extra_i => gpio_extra_i, + d_o => d_from_gpio_s + ); + + + ----------------------------------------------------------------------------- + -- The Coin Chutes + ----------------------------------------------------------------------------- + coin_chutes_b : entity work.ladybug_chutes + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + right_chute_i => right_chute_i, + left_chute_i => left_chute_i, + cs8_n_i => cs_n_s(8), + nmi_n_o => nmi_n_s, + int_n_o => int_n_s + ); + + + ----------------------------------------------------------------------------- + -- Decrytion PROMs + ----------------------------------------------------------------------------- + + decrypt_prom : entity work.prom_decrypt + port map ( + CLK => clk_20mhz_i, + ADDR => rom_cpu_d_i, + DATA => d_decrypted_s + ); + + ----------------------------------------------------------------------------- + -- Only opcodes (i.e. instruction fetches) have to be decrypted + ----------------------------------------------------------------------------- + d_rom_mux_s <= d_decrypted_s when m1_n_s = '0' else rom_cpu_d_i; + + ----------------------------------------------------------------------------- + -- Gate Data Bus from ROM + -- The ROM puts data on the data bus within the CPU Main Unit so we do + -- gating here. + ----------------------------------------------------------------------------- + d_from_rom_s <= d_rom_mux_s + when cs_n_s(0) = '0' or cs_n_s(1) = '0' or cs_n_s(2) = '0' or + cs_n_s(3) = '0' or cs_n_s(4) = '0' or cs_n_s(5) = '0' else + (others => '1'); + + + ----------------------------------------------------------------------------- + -- Combine Data Buses + -- Uses an AND of all incoming buses from submodules. Each module has to + -- drive ones when not active so we can save logic complexity here. + ----------------------------------------------------------------------------- + d_to_cpu_s <= d_to_cpu_i and d_from_rom_s and d_from_ram_s and d_from_gpio_s; + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + a_o <= a_s(10 downto 0); + rom_cpu_a_o <= a_s(14 downto 0); + rd_n_o <= rd_n_s; + wr_n_o <= wr_n_s; + cs7_n_o <= cs_n_s(7); + cs10_n_o <= cs_n_s(10); + cs11_n_o <= cs_n_s(11); + cs12_n_o <= cs_n_s(12); + cs13_n_o <= cs_n_s(13); + +end struct; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_dip_pack.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_dip_pack.vhd new file mode 100644 index 00000000..ebff8ec4 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_dip_pack.vhd @@ -0,0 +1,142 @@ +------------------------------------------------------------------------------- +-- +-- $Id: ladybug_dip_pack-p.vhd,v 1.4 2005/10/10 20:52:04 arnim Exp $ +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +package ladybug_dip_pack is + + ----------------------------------------------------------------------------- + -- DIP switch settings for Lady Bug + ----------------------------------------------------------------------------- + constant lb_dip_block_1_c : std_logic_vector(7 downto 0) := + -- Lives ------------------------------------------------------------------ + -- 0 = 5 Lives + -- 1 = 3 Lives + '0' & + -- Free Play -------------------------------------------------------------- + -- 0 = Free Play + -- 1 = No Free Play + '1' & + -- Cabinet ---------------------------------------------------------------- + -- 0 = Upright + -- 1 = Cocktail + '0' & + -- Screen Freeze ---------------------------------------------------------- + -- 0 = Freeze + -- 1 = No Freeze + '1' & + -- Rack Test (Cheat) ------------------------------------------------------ + -- 0 = On + -- 1 = Off + '1' & + -- High Score Initials ---------------------------------------------------- + -- 0 = 3-Letter Initials + -- 1 = 10-Letter Initials + '1' & + -- Difficulty ------------------------------------------------------------- + -- 11 = Easy + -- 10 = Medium + -- 01 = Hard + -- 00 = Hardest + "10"; + + ----------------------------------------------------------------------------- + -- DIP switch settings for Dorodon + ----------------------------------------------------------------------------- + constant do_dip_block_1_c : std_logic_vector(7 downto 0) := + -- Lives ------------------------------------------------------------------ + -- 0 = 5 Lives + -- 1 = 3 Lives + '0' & + -- Free Play -------------------------------------------------------------- + -- 0 = Free Play + -- 1 = No Free Play + '1' & + -- Cabinet ---------------------------------------------------------------- + -- 0 = Upright + -- 1 = Cocktail + '0' & + -- Screen Freeze ---------------------------------------------------------- + -- 0 = Freeze + -- 1 = No Freeze + '1' & + -- Rack Test (Cheat) ------------------------------------------------------ + -- 0 = On + -- 1 = Off + '1' & + -- Bonus Life ------------------------------------------------------------- + -- 0 = 40000 + -- 1 = 20000 + '1' & + -- Difficulty ------------------------------------------------------------- + -- 11 = Easy + -- 10 = Medium + -- 01 = Hard + -- 00 = Hardest + "10"; + + + ----------------------------------------------------------------------------- + -- DIP switch settings for Cosmic Avenger + ----------------------------------------------------------------------------- + constant ca_dip_block_1_c : std_logic_vector(7 downto 0) := + -- Lives per Game --------------------------------------------------------- + -- 00 = 2 Lives + -- 11 = 3 Lives + -- 10 = 4 Lives + -- 01 = 5 Lives + "01" & + -- Initial High Score ----------------------------------------------------- + -- 00 = 0 + -- 11 = 5000 + -- 10 = 8000 + -- 01 = 10000 + "11" & + -- Cabinet ---------------------------------------------------------------- + -- 0 = Upright + -- 1 = Cocktail + '0' & + -- High Score Names ------------------------------------------------------- + -- 0 = 3 Letters + -- 1 = 10 Letters + '1' & + -- Difficulty ------------------------------------------------------------- + -- 11 = Easy + -- 10 = Medium + -- 01 = Hard + -- 00 = Hardest + "10"; + + constant price_dip_block_2_c : std_logic_vector(7 downto 0) := + -- Pricing Options -------------------------------------------------------- + -- 1111 = 1 coin 1 credit + -- 1110 = 1 coin 2 credits + -- 1101 = 1 coin 3 credits + -- 1100 = 1 coin 4 credits + -- 1011 = 1 coin 5 credits + -- 1010 = 2 coins 1 credit + -- 1001 = 2 coins 3 credits + -- 1000 = 3 coins 1 credit + -- 0111 = 3 coins 2 credit + -- 0110 = 4 coins 1 credit + -- 0101 = 1 coin 1 credit + -- 0100 = 1 coin 1 credit + -- 0011 = 1 coin 1 credit + -- 0010 = 1 coin 1 credit + -- 0001 = 1 coin 1 credit + -- 0000 = 1 coin 1 credit + -- + -- Left Chute + "1111" & + -- Right Chute + "1111"; + +end ladybug_dip_pack; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_gpio.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_gpio.vhd new file mode 100644 index 00000000..6ca21711 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_gpio.vhd @@ -0,0 +1,139 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_gpio.vhd,v 1.3 2005/10/10 21:21:20 arnim Exp $ +-- +-- General purpose IO input for CPU Main Unit. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_gpio is + + port ( + a_i : in std_logic_vector(1 downto 0); + cs_in_n_i : in std_logic; + cs_extra_n_i : in std_logic; + in0_i : in std_logic_vector(7 downto 0); + in1_i : in std_logic_vector(7 downto 0); + in2_i : in std_logic_vector(7 downto 0); + in3_i : in std_logic_vector(7 downto 0); + extra_i : in std_logic_vector(7 downto 0); + d_o : out std_logic_vector(7 downto 0) + ); + +end ladybug_gpio; + + +architecture rtl of ladybug_gpio is + +begin + + ----------------------------------------------------------------------------- + -- Process gpio + -- + -- Purpose: + -- Multiplex the IN and EXTRA inputs onto the data bus for CPU. + -- + gpio: process (a_i, + cs_in_n_i, + cs_extra_n_i, + in0_i, + in1_i, + in2_i, + in3_i, + extra_i) + variable cs_n_v : std_logic_vector(1 downto 0); + begin + -- default assignment with inactive bus value + d_o <= (others => '1'); + + cs_n_v := cs_extra_n_i & cs_in_n_i; + case cs_n_v is + -- IN ports and DIP switches selected ----------------------------------- + when "10" => + case a_i is + -- IN 0 addressed + when "00" => + d_o <= in0_i; + -- IN 1 addressed + when "01" => + d_o <= in1_i; + -- DIP 0 addressed + when "10" => + d_o <= in2_i; + -- DIP 1 addressed + when "11" => + d_o <= in3_i; + + when others => + null; + end case; + + -- Extra bank selected -------------------------------------------------- + when "01" => + case a_i is + when "00" => + d_o(1) <= extra_i(7); + d_o(0) <= extra_i(3); + when "01" => + d_o(1) <= extra_i(6); + d_o(0) <= extra_i(2); + when "10" => + d_o(1) <= extra_i(5); + d_o(0) <= extra_i(1); + when "11" => + d_o(1) <= extra_i(4); + d_o(0) <= extra_i(0); + when others => + null; + end case; + + when others => + null; + end case; + + end process gpio; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_machine.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_machine.vhd new file mode 100644 index 00000000..584b8391 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_machine.vhd @@ -0,0 +1,295 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_machine.vhd,v 1.23 2006/02/07 00:44:21 arnim Exp $ +-- +-- Toplevel of the Lady Bug machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ladybug_machine is + port ( + -- Clock and Reset Interface ---------------------------------------------- + ext_res_n_i : in std_logic; + clk_20mhz_i : in std_logic; + clk_en_10mhz_o : out std_logic; + clk_en_5mhz_o : out std_logic; + por_n_o : out std_logic; + -- Control Interface ------------------------------------------------------ + tilt_n_i : in std_logic; + player_select_n_i : in std_logic_vector( 1 downto 0); + player_fire_n_i : in std_logic_vector( 1 downto 0); + player_up_n_i : in std_logic_vector( 1 downto 0); + player_right_n_i : in std_logic_vector( 1 downto 0); + player_down_n_i : in std_logic_vector( 1 downto 0); + player_left_n_i : in std_logic_vector( 1 downto 0); + player_bomb_n_i : in std_logic_vector( 1 downto 0); + right_chute_i : in std_logic; + left_chute_i : in std_logic; + -- DIP Switch Interface --------------------------------------------------- + dip_block_1_i : in std_logic_vector( 7 downto 0); + dip_block_2_i : in std_logic_vector( 7 downto 0); + -- RGB Video Interface ---------------------------------------------------- + rgb_r_o : out std_logic_vector( 1 downto 0); + rgb_g_o : out std_logic_vector( 1 downto 0); + rgb_b_o : out std_logic_vector( 1 downto 0); + hsync_n_o : out std_logic; + vsync_n_o : out std_logic; + comp_sync_n_o : out std_logic; + vblank_o : out std_logic; + hblank_o : out std_logic; + -- Audio Interface -------------------------------------------------------- + audio_o : out signed( 7 downto 0); + -- CPU ROM Interface ------------------------------------------------------ + rom_cpu_a_o : out std_logic_vector(14 downto 0); + rom_cpu_d_i : in std_logic_vector( 7 downto 0); + -- Character ROM Interface ------------------------------------------------ + rom_char_a_o : out std_logic_vector(11 downto 0); + rom_char_d_i : in std_logic_vector(15 downto 0); + -- Sprite ROM Interface --------------------------------------------------- + rom_sprite_a_o : out std_logic_vector(11 downto 0); + rom_sprite_d_i : in std_logic_vector(15 downto 0) + ); + + +end ladybug_machine; + +architecture struct of ladybug_machine is + + -- Clock System ------------------------------------------------------------- + signal clk_en_10mhz_s, + clk_en_10mhz_n_s : std_logic; + signal clk_en_5mhz_s, + clk_en_5mhz_n_s : std_logic; + signal clk_en_4mhz_s : std_logic; + + -- Reset System ------------------------------------------------------------- + signal por_n_s : std_logic; + signal res_n_s : std_logic; + + signal sound_wait_n_s : std_logic; + signal wait_n_s : std_logic; + signal a_s : std_logic_vector(10 downto 0); + signal d_to_cpu_s, + d_from_cpu_s, + d_from_video_s : std_logic_vector( 7 downto 0); + signal rd_n_s, + wr_n_s : std_logic; + signal cs7_n_s, + cs10_n_s, + cs11_n_s, + cs12_n_s, + cs13_n_s : std_logic; + signal vc_s, + vbl_tick_n_s, + vbl_buf_s : std_logic; + + signal gpio_in0_s, + gpio_in1_s, + gpio_in2_s, + gpio_in3_s, + gpio_extra_s : std_logic_vector( 7 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Clock Generator + ----------------------------------------------------------------------------- + clk_b : entity work.ladybug_clk + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_s, + clk_en_10mhz_o => clk_en_10mhz_s, + clk_en_10mhz_n_o => clk_en_10mhz_n_s, + clk_en_5mhz_o => clk_en_5mhz_s, + clk_en_5mhz_n_o => clk_en_5mhz_n_s, + clk_en_4mhz_o => clk_en_4mhz_s + ); + -- + clk_en_5mhz_o <= clk_en_5mhz_s; + clk_en_10mhz_o <= clk_en_10mhz_s; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Reset Generator + ----------------------------------------------------------------------------- + res_b : entity work.ladybug_res + port map ( + clk_20mhz_i => clk_20mhz_i, + ext_res_n_i => ext_res_n_i, + res_n_o => res_n_s, + por_n_o => por_n_s + ); + -- + por_n_o <= por_n_s; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Joystick and DIP Switch Mapping + ----------------------------------------------------------------------------- + gpio_in0_s <= tilt_n_i & + player_select_n_i(1) & + player_select_n_i(0) & + player_fire_n_i(0) & + player_up_n_i(0) & + player_right_n_i(0) & + player_down_n_i(0) & + player_left_n_i(0); + gpio_in1_s <= vbl_buf_s & + vbl_tick_n_s & + vc_s & + player_fire_n_i(1) & + player_up_n_i(1) & + player_right_n_i(1) & + player_down_n_i(1) & + player_left_n_i(1); + gpio_in2_s <= dip_block_1_i; + gpio_in3_s <= dip_block_2_i; + gpio_extra_s <= player_bomb_n_i(1) & + '1' & + '1' & + '1' & + player_bomb_n_i(0) & + '1' & + '1' & + '1'; + + + ----------------------------------------------------------------------------- + -- CPU Unit + ----------------------------------------------------------------------------- + cpu_b : entity work.ladybug_cpu_unit + port map ( + clk_20mhz_i => clk_20mhz_i, + clk_en_4mhz_i => clk_en_4mhz_s, + res_n_i => res_n_s, + rom_cpu_a_o => rom_cpu_a_o, + rom_cpu_d_i => rom_cpu_d_i, + + sound_wait_n_i => sound_wait_n_s, + wait_n_i => wait_n_s, + right_chute_i => right_chute_i, + left_chute_i => left_chute_i, + gpio_in0_i => gpio_in0_s, + gpio_in1_i => gpio_in1_s, + gpio_in2_i => gpio_in2_s, + gpio_in3_i => gpio_in3_s, + gpio_extra_i => gpio_extra_s, + a_o => a_s, + d_to_cpu_i => d_to_cpu_s, + d_from_cpu_o => d_from_cpu_s, + rd_n_o => rd_n_s, + wr_n_o => wr_n_s, + cs7_n_o => cs7_n_s, + cs10_n_o => cs10_n_s, + cs11_n_o => cs11_n_s, + cs12_n_o => cs12_n_s, + cs13_n_o => cs13_n_s + ); + + ----------------------------------------------------------------------------- + -- Bus Multiplexer + ----------------------------------------------------------------------------- + d_to_cpu_s <= d_from_video_s when (cs7_n_s and cs13_n_s) = '0' else (others => '1'); + + ----------------------------------------------------------------------------- + -- Video Unit + ----------------------------------------------------------------------------- + video_b : entity work.ladybug_video_unit + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_s, + res_n_i => res_n_s, + clk_en_10mhz_i => clk_en_10mhz_s, + clk_en_10mhz_n_i => clk_en_10mhz_n_s, + clk_en_5mhz_i => clk_en_5mhz_s, + clk_en_5mhz_n_i => clk_en_5mhz_n_s, + clk_en_4mhz_i => clk_en_4mhz_s, + cs7_n_i => cs7_n_s, + cs10_n_i => cs10_n_s, + cs13_n_i => cs13_n_s, + a_i => a_s, + rd_n_i => rd_n_s, + wr_n_i => wr_n_s, + wait_n_o => wait_n_s, + d_from_cpu_i => d_from_cpu_s, + d_from_video_o => d_from_video_s, + vc_o => vc_s, + vbl_tick_n_o => vbl_tick_n_s, + vbl_buf_o => vbl_buf_s, + rgb_r_o => rgb_r_o, + rgb_g_o => rgb_g_o, + rgb_b_o => rgb_b_o, + hsync_n_o => hsync_n_o, + vsync_n_o => vsync_n_o, + comp_sync_n_o => comp_sync_n_o, + vblank_o => vblank_o, + hblank_o => hblank_o, + rom_char_a_o => rom_char_a_o, + rom_char_d_i => rom_char_d_i, + rom_sprite_a_o => rom_sprite_a_o, + rom_sprite_d_i => rom_sprite_d_i + ); + + ----------------------------------------------------------------------------- + -- Sound Unit + ----------------------------------------------------------------------------- + sound_b : entity work.ladybug_sound_unit + port map ( + clk_20mhz_i => clk_20mhz_i, + clk_en_4mhz_i => clk_en_4mhz_s, + por_n_i => por_n_s, + cs11_n_i => cs11_n_s, + cs12_n_i => cs12_n_s, + wr_n_i => wr_n_s, + d_from_cpu_i => d_from_cpu_s, + sound_wait_n_o => sound_wait_n_s, + audio_o => audio_o + ); + +end struct; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_rams.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_rams.vhd new file mode 100644 index 00000000..578d08e7 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_rams.vhd @@ -0,0 +1,340 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_char_ram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video character RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 8 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_char_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 7 downto 0); + d_o : out std_logic_vector( 7 downto 0) + ); + +end ladybug_char_ram; + +architecture struct of ladybug_char_ram is + + signal d_s : std_logic_vector(7 downto 0); + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,8) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_s + ); + + -- gate the data output for and'ing on CPU bus + d_o <= d_s when cs_n_i = '0' else (others => '1'); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite_ram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video sprite RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 8 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_sprite_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 7 downto 0); + d_o : out std_logic_vector( 7 downto 0) + ); + +end ladybug_sprite_ram; + +architecture struct of ladybug_sprite_ram is + + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,8) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_o + ); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_char_col_ram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video character color RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 4 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_char_col_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 3 downto 0); + d_o : out std_logic_vector( 3 downto 0) + ); + +end ladybug_char_col_ram; + +architecture struct of ladybug_char_col_ram is + + signal d_s : std_logic_vector(3 downto 0); + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,4) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_s + ); + + -- gate the data output for and'ing on CPU bus + d_o <= d_s when cs_n_i = '0' else (others => '1'); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite_vram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video sprite VRAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 4 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_sprite_vram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 3 downto 0); + d_o : out std_logic_vector( 3 downto 0) + ); + +end ladybug_sprite_vram; + +architecture struct of ladybug_sprite_vram is + + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,4) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_o + ); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_cpu_ram.vhd,v 1.1 2005/11/06 15:43:38 arnim Exp $ +-- +-- Wrapper for technology dependent CPU RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 4 K x 8 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_cpu_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(11 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 7 downto 0); + d_o : out std_logic_vector( 7 downto 0) + ); + +end ladybug_cpu_ram; + +architecture struct of ladybug_cpu_ram is + + signal d_s : std_logic_vector(7 downto 0); + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram1_inst: work.spram generic map(12,8) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_s + ); + + -- gate the data output for and'ing on CPU bus + d_o <= d_s when cs_n_i = '0' else (others => '1'); + +end struct; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_res.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_res.vhd new file mode 100644 index 00000000..85998a10 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_res.vhd @@ -0,0 +1,148 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_res.vhd,v 1.8 2005/10/10 20:52:04 arnim Exp $ +-- +-- Reset generator for the Lady Bug machine. +-- +-- This module generates a reset signal for the whole system synchronous to +-- the main clock. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +library ieee; +use ieee.numeric_std.all; + +entity ladybug_res is + + port ( + clk_20mhz_i : in std_logic; + ext_res_n_i : in std_logic; + res_n_o : out std_logic; + por_n_o : out std_logic + ); + +end ladybug_res; + +architecture rtl of ladybug_res is + + -- 4.7e-2 s = 1 / 20,000,000 Hz * 940000 + constant res_delay_c : natural := 940000; + + signal res_sync_n_q : std_logic_vector(1 downto 0); + + signal res_delay_q : unsigned(19 downto 0); + signal res_n_q : std_logic; + + signal por_cnt_q : unsigned(1 downto 0) := "00"; + signal por_n_q : std_logic := '0'; +begin + + por_n_o <= por_n_q; + res_n_o <= res_n_q; + + ----------------------------------------------------------------------------- + -- Process por_cnt + -- + -- Purpose: + -- Generate a power-on reset for 4 clock cycles. + -- + por_cnt: process (clk_20mhz_i) + begin + if clk_20mhz_i'event and clk_20mhz_i = '1' then + if por_cnt_q = "11" then + por_n_q <= '1'; + else + por_cnt_q <= por_cnt_q + 1; + end if; + end if; + end process por_cnt; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process res_sync + -- + -- Purpose: + -- Synchronize asynchronous external reset to main 20 MHz clock. + -- + res_sync: process (clk_20mhz_i, ext_res_n_i, por_n_q) + begin + if ext_res_n_i = '0' or por_n_q = '0' then + res_sync_n_q <= (others => '0'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + res_sync_n_q(0) <= '1'; + res_sync_n_q(1) <= res_sync_n_q(0); + end if; + end process res_sync; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process res_delay + -- + -- Purpose: + -- Delay reset event (external or power-on) by 4.7e-2 s. + -- Reset delay is taken from Lady Bug reset circuit using NE555. + -- This duration might be too long for the actual requirements of the + -- FPGA circuit. + -- + res_delay: process (clk_20mhz_i, res_sync_n_q) + begin + if res_sync_n_q(1) = '0' then + res_delay_q <= (others => '0'); + res_n_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if res_delay_q = res_delay_c then + res_n_q <= '1'; + else + res_delay_q <= res_delay_q + 1; + end if; + end if; + end process res_delay; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_rgb.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_rgb.vhd new file mode 100644 index 00000000..1bfcd53c --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_rgb.vhd @@ -0,0 +1,135 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_rgb.vhd,v 1.4 2005/10/10 22:02:14 arnim Exp $ +-- +-- RGB Generation Module of the Lady Bug Machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_rgb is + + port ( + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + crg_i : in std_logic_vector(5 downto 1); + sig_i : in std_logic_vector(4 downto 1); + rgb_r_o : out std_logic_vector(1 downto 0); + rgb_g_o : out std_logic_vector(1 downto 0); + rgb_b_o : out std_logic_vector(1 downto 0) + ); + +end ladybug_rgb; + +architecture rtl of ladybug_rgb is + + signal a_s : std_logic_vector(5 downto 1); + signal rgb_s : std_logic_vector(8 downto 1); + signal rgb_n_q : std_logic_vector(8 downto 1); + +begin + + ----------------------------------------------------------------------------- + -- Process addr + -- + -- Purpose: + -- Generates the PROM address. + -- + addr: process (crg_i, + sig_i) + variable sig_and_v : std_logic; + begin + sig_and_v := sig_i(1) and sig_i(2) and sig_i(3) and sig_i(4); + + a_s(5) <= crg_i(1) and sig_and_v; + + if not (sig_and_v and (crg_i(1) or crg_i(2))) = '0' then + a_s(4 downto 1) <= crg_i(2) & crg_i(5) & crg_i(4) & crg_i(3); + else + a_s(4 downto 1) <= sig_i; + end if; + + end process addr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- The RGB Conversion PROM + ----------------------------------------------------------------------------- + rgb_prom_b : entity work.prom_10_2 + port map ( + CLK => clk_20mhz_i, + ADDR => a_s, + DATA => rgb_s + ); + + ----------------------------------------------------------------------------- + -- Process rgb_latch + -- + -- Purpose: + -- Implements the output latch for the RGB values. + -- + rgb_latch: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + rgb_n_q <= (others => '1'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if clk_en_5mhz_i = '1' then + rgb_n_q <= not rgb_s; + end if; + end if; + end process rgb_latch; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + rgb_r_o <= rgb_n_q(5+1) & rgb_n_q(0+1); + rgb_g_o <= rgb_n_q(6+1) & rgb_n_q(2+1); + rgb_b_o <= rgb_n_q(7+1) & rgb_n_q(4+1); + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_sprite.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_sprite.vhd new file mode 100644 index 00000000..941d997c --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_sprite.vhd @@ -0,0 +1,857 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite.vhd,v 1.12 2005/10/10 22:02:14 arnim Exp $ +-- +-- Sprite Video Module of Lady Bug Machine. +-- +-- This unit contains the whole sprite logic which is distributed on the +-- CPU and video boards. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity ladybug_sprite is +port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + res_n_i : in std_logic; + clk_en_10mhz_i : in std_logic; + clk_en_10mhz_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_5mhz_n_i : in std_logic; + -- CPU Interface ---------------------------------------------------------- + cs7_n_i : in std_logic; + a_i : in std_logic_vector( 9 downto 0); + d_from_cpu_i : in std_logic_vector( 7 downto 0); + -- RGB Video Interface ---------------------------------------------------- + h_i : in std_logic_vector( 3 downto 0); + h_t_i : in std_logic_vector( 3 downto 0); + hx_i : in std_logic; + ha_d_i : in std_logic; + v_i : in std_logic_vector( 3 downto 0); + v_t_i : in std_logic_vector( 3 downto 0); + vbl_n_i : in std_logic; + vbl_d_n_i : in std_logic; + vc_d_i : in std_logic; + blank_flont_i : in std_logic; + blank_i : in std_logic; + sig_o : out std_logic_vector( 4 downto 1); + -- Sprite ROM Interface --------------------------------------------------- + rom_sprite_a_o : out std_logic_vector(11 downto 0); + rom_sprite_d_i : in std_logic_vector(15 downto 0) +); + +end ladybug_sprite; + +architecture rtl of ladybug_sprite is + + signal sprite_ram_cs_n_s, + sprite_ram_we_n_s, + clk_5mhz_n_q, + clk_en_eck_s, + clk_en_rd_s, + clk_en_5ck_n_s, + clk_en_6ck_n_s, + clk_en_7ck_n_s, + clk_en_b7_p3_s, + clk_en_e7_3_s, + s6ck_n_s, + s7ck_n_s, + e5_p8_s, + a8_p5_n_s, + ct0_s, + ct1_s, + cr_mux_sel_s, + ck_inh_s, + ck_inh_n_q, + qh1_s, + qh2_s : std_logic; + + signal rb_s, + rb_unflip_s, + rc_s : std_logic_vector( 7 downto 0); + + signal c_s : std_logic_vector(10 downto 0); + signal v_cnt_s : std_logic_vector( 4 downto 0); + signal ra_s : std_logic_vector( 9 downto 0); + + signal ma_s : std_logic_vector(11 downto 0); + signal ma_q : std_logic_vector(11 downto 6); + signal mb_q : std_logic_vector( 1 downto 0); + signal mc_q : std_logic_vector( 6 downto 0); + signal cl_q : std_logic_vector( 4 downto 0); + + signal j7_s : std_logic_vector( 2 downto 0); + signal df_muxed_s : std_logic_vector( 7 downto 0); + + signal lu_a_s : std_logic_vector( 4 downto 0); + signal lu_d_s : std_logic_vector( 7 downto 0); + signal lu_d_mux_s : std_logic_vector( 3 downto 0); + + signal rd_shift_s, + rd_shift_int, + rd_vram_s : std_logic_vector(15 downto 0); + signal rs_s, + rs_int, + rs_n_s : std_logic_vector( 3 downto 0); + signal rs_enable_s : std_logic; + signal shift_oc_n_s : std_logic; + + signal j6_shifter : std_logic_vector( 3 downto 0); + signal h6_shifter : std_logic_vector( 3 downto 0); + signal ctrl_lu_a_s : std_logic_vector( 4 downto 0); + signal ctrl_lu_d_s : std_logic_vector( 7 downto 0); + signal v_cnt_a5_a6_s : std_logic_vector( 7 downto 0); + + signal ctrl_lu_q_d_s, + ctrl_lu_q : std_logic_vector( 6 downto 1); + + signal vram_we_n_s : std_logic; + signal vram_a6_in_s, + vram_a6_out_s, + vram_b6_in_s, + vram_b6_out_s, + vram_c6_in_s, + vram_c6_out_s, + vram_d6_in_s, + vram_d6_out_s : std_logic_vector( 3 downto 0); + + signal ca_q : std_logic_vector( 3 downto 1); + signal ca6_s, + ca7_s, + ca8_s : std_logic; + signal x_s : std_logic_vector( 5 downto 0); + + signal cr_s : std_logic_vector( 9 downto 0); + + signal vram_q : std_logic_vector(15 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- The Vertical Counters C5 D5 + ----------------------------------------------------------------------------- + v_cnt_c5_c6_b : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + v_cnt_s <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if clk_en_b7_p3_s = '1' then + if e5_p8_s = '0' then + v_cnt_s <= (v_t_i & "0"); + else + v_cnt_s <= v_cnt_s + 1; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Counter J7 + ----------------------------------------------------------------------------- + j7_b : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + j7_s <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if clk_en_10mhz_i = '1' then + if s6ck_n_s = '0' then + j7_s <= not mc_q(6) & mc_q(6) & '0'; + elsif (ct0_s or ct1_s or a8_p5_n_s or ck_inh_s) = '0' then + j7_s <= j7_s + 1; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Sprite VRAM Counters A5 A6 + ----------------------------------------------------------------------------- + ct0_s <= v_cnt_a5_a6_s(0); + ct1_s <= v_cnt_a5_a6_s(1); + x_s <= v_cnt_a5_a6_s(7 downto 2); + + v_cnt_a5_a6_b : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + v_cnt_a5_a6_s <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if clk_en_10mhz_i = '1' then + if s7ck_n_s = '0' then + v_cnt_a5_a6_s(7 downto 4) <= (rb_s(7 downto 4)); + v_cnt_a5_a6_s(3 downto 0) <= (rb_s(3 downto 2) & not rc_s(7) & not rc_s(6)); + elsif ck_inh_n_q = '1' then + v_cnt_a5_a6_s <=v_cnt_a5_a6_s + 1; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Process sprite_ram_ctrl + -- + -- Purpose: + -- Generates the control signals for the sprite RAM. + -- + sprite_ram_ctrl: process ( cs7_n_i, + vbl_n_i, + a_i, + c_s, v_cnt_s) + variable cpu_access_v : std_logic; + begin + cpu_access_v := not cs7_n_i and not vbl_n_i; + + sprite_ram_we_n_s <= not cpu_access_v; + sprite_ram_cs_n_s <= cpu_access_v nor vbl_n_i; + + if vbl_n_i = '0' then + ra_s <= a_i; + else + ra_s <= v_cnt_s(4 downto 0) & c_s(4 downto 0); + end if; + end process sprite_ram_ctrl; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- The Sprite RAM P5 N5 + ----------------------------------------------------------------------------- + sprite_ram_b : entity work.ladybug_sprite_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_5mhz_i, + a_i => ra_s, + cs_n_i => sprite_ram_cs_n_s, + we_n_i => sprite_ram_we_n_s, + d_i => d_from_cpu_i, + d_o => rb_s + ); + + ----------------------------------------------------------------------------- + -- Process rc_add + -- + -- Purpose: + -- Implements IC N6 and E6 which add sprite RAM data and Cx signals to + -- form RCx bus. + -- + rc_add: process (rb_s, c_s, v_i) + variable a_v, b_v, + sum_v : std_logic_vector(7 downto 0); + begin + -- prepare the inputs of the adder + a_v(3 downto 0) := rb_s(3 downto 0); + a_v(4) := '1'; + a_v(5) := '0'; + a_v(7 downto 6) := rb_s(1 downto 0); + + b_v(0) := not c_s(6); + b_v(1) := not c_s(7); + b_v(2) := not c_s(8); + b_v(3) := not v_i(3); + b_v(4) := c_s(10); + b_v(5) := '0'; + b_v(7 downto 6) := "11"; + + sum_v := a_v + b_v; + + rc_s <= sum_v; + + end process rc_add; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Sprite Control Logic + ----------------------------------------------------------------------------- + sprite_ctrl_b : entity work.ladybug_sprite_ctrl + port map ( + clk_20mhz_i => clk_20mhz_i, + clk_en_5mhz_i => clk_en_5mhz_i, + clk_en_5mhz_n_i => clk_en_5mhz_n_i, + por_n_i => por_n_i, + vbl_n_i => vbl_n_i, + vbl_d_n_i => vbl_d_n_i, + vc_i => v_i(2), + vc_d_i => vc_d_i, + ha_i => h_i(0), + ha_d_i => ha_d_i, + rb6_i => rb_s(6), + rb7_i => rb_s(7), + rc3_i => rc_s(3), + rc4_i => rc_s(4), + rc5_i => rc_s(5), + j7_b_i => j7_s(1), + j7_c_i => j7_s(2), + clk_en_eck_i => clk_en_eck_s, + c_o => c_s, + clk_en_5ck_n_o => clk_en_5ck_n_s, + clk_en_6ck_n_o => clk_en_6ck_n_s, + clk_en_7ck_n_o => clk_en_7ck_n_s, + s6ck_n_o => s6ck_n_s, + s7ck_n_o => s7ck_n_s, + clk_en_b7_p3_o => clk_en_b7_p3_s, + e5_p8_o => e5_p8_s, + clk_en_e7_3_o => clk_en_e7_3_s, + a8_p5_n_o => a8_p5_n_s + ); + + ----------------------------------------------------------------------------- + -- Process misc_seq + -- + -- Purpose: + -- Implements several sequential elements. + -- + misc_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + clk_5mhz_n_q <= '0'; + ma_q <= (others => '0'); + mb_q <= (others => '0'); + mc_q <= (others => '0'); + cl_q <= (others => '0'); + ck_inh_n_q <= '1'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Turn clk_5mhz_n into clock waveform ---------------------------------- + if clk_en_5mhz_n_i = '1' then + clk_5mhz_n_q <= '1'; + elsif clk_en_5mhz_i = '1' then + clk_5mhz_n_q <= '0'; + end if; + + -- 8-Bit Register M6 ---------------------------------------------------- + if clk_en_5ck_n_s = '1' then + mb_q <= rb_s(1 downto 0); + ma_q <= rb_s(7 downto 2); + end if; + + -- 8-Bit Register P6 ---------------------------------------------------- + if clk_en_e7_3_s = '1' then + -- these are inverted based on mc_q(4) + mc_q(3 downto 0) <= rc_s(3 downto 0); + -- inverts sprites horizontally + mc_q(4) <= rb_s(4); + -- inverts sprites vertically + mc_q(5) <= rb_s(5); + -- + mc_q(6) <= rb_s(6); + end if; + + -- 6-Bit Register B6 ---------------------------------------------------- + if clk_en_6ck_n_s = '1' then + cl_q <= rb_s(4 downto 0); + end if; + + -- Flip-Flop H8 --------------------------------------------------------- + if clk_en_10mhz_n_i = '1' then + ck_inh_n_q <= not ck_inh_s; + end if; + + end if; + end process misc_seq; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process ma_vec + -- + -- Purpose: + -- Build the ma_s vector. + -- + ma_vec: process ( ma_q, + mb_q, + mc_q, + j7_s) + begin + ma_s(11 downto 6) <= ma_q; + + if mc_q(6) = '0' then + ma_s(5) <= mb_q(1); + ma_s(4) <= mb_q(0); + else + ma_s(5) <= mc_q(3) xor mc_q(4); + ma_s(4) <= mc_q(5) xor j7_s(2); + end if; + + ma_s(3) <= mc_q(2) xor mc_q(4); + ma_s(2) <= mc_q(1) xor mc_q(4); + ma_s(1) <= mc_q(0) xor mc_q(4); + ma_s(0) <= mc_q(5) xor j7_s(0); + end process ma_vec; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process df_mux + -- + -- Purpose: + -- Builds the multiplexed data from Sprite ROM. + -- Two-stage multiplexer: + -- 1) ROM data to DFx: 16->8 + -- 2) DF to input for shift register: 8->8 + -- This is actually a scrambler. + -- + df_mux: process ( rom_sprite_d_i, + cl_q, + mc_q) + variable df_v : std_logic_vector(7 downto 0); + begin + if cl_q(4) = '0' then + -- ROM L7 + df_v := rom_sprite_d_i( 7 downto 0); + else + -- ROM M7 + df_v := rom_sprite_d_i(15 downto 8); + end if; + + if mc_q(5) = '0' then + df_muxed_s(0) <= df_v(1); + df_muxed_s(1) <= df_v(3); + df_muxed_s(2) <= df_v(5); + df_muxed_s(3) <= df_v(7); + -- + df_muxed_s(4) <= df_v(0); + df_muxed_s(5) <= df_v(2); + df_muxed_s(6) <= df_v(4); + df_muxed_s(7) <= df_v(6); + else + df_muxed_s(0) <= df_v(7); + df_muxed_s(1) <= df_v(5); + df_muxed_s(2) <= df_v(3); + df_muxed_s(3) <= df_v(1); + -- + df_muxed_s(4) <= df_v(6); + df_muxed_s(5) <= df_v(4); + df_muxed_s(6) <= df_v(2); + df_muxed_s(7) <= df_v(0); + end if; + + end process df_mux; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- The Two 8-Bit Shift Registers H6 J6 + ----------------------------------------------------------------------------- + shifters_h6_j6 : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + h6_shifter <= (others=>'0'); + j6_shifter <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if (clk_en_10mhz_i and not ck_inh_s) = '1' then + if (ct0_s or ct1_s or a8_p5_n_s) = '0' then + h6_shifter <= df_muxed_s(3 downto 0); + j6_shifter <= df_muxed_s(7 downto 4); + else + h6_shifter <= h6_shifter(2 downto 0) & "0"; + j6_shifter <= j6_shifter(2 downto 0) & "0"; + end if; + end if; + end if; + end process; + + qh1_s <= h6_shifter(3); + qh2_s <= j6_shifter(3); + + ----------------------------------------------------------------------------- + -- Sprite Look-up PROM F4 + ----------------------------------------------------------------------------- + lu_a_s(4 downto 2) <= cl_q(2 downto 0); + lu_a_s(1) <= qh2_s; + lu_a_s(0) <= qh1_s; + + prom_F4 : entity work.prom_10_1 + port map ( + CLK => clk_20mhz_i, + ADDR => lu_a_s, + DATA => lu_d_s + ); + + lu_d_mux_s <= lu_d_s(3 downto 0) when cl_q(3) = '0' else lu_d_s(7 downto 4); + + ----------------------------------------------------------------------------- + -- Sprite Control Look-up PROM C4 + ----------------------------------------------------------------------------- + ctrl_lu_a_s(0) <= '1'; + ctrl_lu_a_s(1) <= hx_i; + ctrl_lu_a_s(2) <= clk_5mhz_n_q; + ctrl_lu_a_s(3) <= h_i(0); + ctrl_lu_a_s(4) <= h_i(1); + + prom_C4 : entity work.prom_10_3 + port map ( + CLK => clk_20mhz_i, + ADDR => ctrl_lu_a_s, + DATA => ctrl_lu_d_s + ); + + ----------------------------------------------------------------------------- + -- Process ctrl_lu_seq + -- + -- Purpose: + -- Registers output of Sprite Control Look-up PROM. + -- + ctrl_lu_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + ctrl_lu_q <= (others => '0'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + ctrl_lu_q <= ctrl_lu_q_d_s; + end if; + end process ctrl_lu_seq; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process ctrl_lu_comb + -- + -- Purpose: + -- Combinational logic for the sprite control registers. + -- + ctrl_lu_comb: process ( clk_en_10mhz_i, + ctrl_lu_d_s, + ctrl_lu_q, + ctrl_lu_q_d_s) + begin + -- default assignments + ctrl_lu_q_d_s <= ctrl_lu_q; + clk_en_eck_s <= '0'; + clk_en_rd_s <= '0'; + + -- register control + if clk_en_10mhz_i = '1' then + ctrl_lu_q_d_s <= ctrl_lu_d_s(5 downto 0); + + if ctrl_lu_q(1) = '0' and ctrl_lu_q_d_s(1) = '1' then + -- detect rising edge on ctrl_lu_q(1) + clk_en_eck_s <= '1'; + end if; + + if ctrl_lu_q(6) = '0' and ctrl_lu_q_d_s(6) = '1' then + -- detect rising edge on ctrl_lu_q(6) + clk_en_rd_s <= '1'; + end if; + end if; + + end process ctrl_lu_comb; + -- + shift_oc_n_s <= ctrl_lu_q(1) nand res_n_i; + ck_inh_s <= ctrl_lu_q(2); + cr_mux_sel_s <= ctrl_lu_q(3); + vram_we_n_s <= ctrl_lu_q(4); + rs_enable_s <= ctrl_lu_q(5); + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process ca_seq + -- + -- Purpose: + -- Implements B5, the register that holds the CS flip-flops. + -- + ca_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + ca_q <= (others => '0'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if clk_en_7ck_n_s = '1' then + ca_q <= c_s(8 downto 6); + end if; + end if; + end process ca_seq; + -- + ca6_s <= ca_q(1); + ca7_s <= ca_q(2); + ca8_s <= ca_q(3); + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process vram_mux + -- + -- Purpose: + -- Generates the VRAM address CRx. + -- It implements chips D5, C5 and B5. + -- + vram_mux: process ( h_i, h_t_i, + v_i, + x_s, + ca6_s, ca7_s, ca8_s, + cr_mux_sel_s) + begin + if cr_mux_sel_s = '0' then + -- D5 + cr_s(0) <= h_i(2); + cr_s(1) <= h_i(3); + cr_s(2) <= h_t_i(0); + cr_s(3) <= h_t_i(1); + -- C5 + cr_s(4) <= h_t_i(2); + cr_s(5) <= h_t_i(3); + cr_s(6) <= v_i(0); + cr_s(7) <= v_i(1); + -- B5 + cr_s(8) <= v_i(2); + cr_s(9) <= v_i(3); + + else + -- D5 + cr_s(0) <= x_s(0); + cr_s(1) <= x_s(1); + cr_s(2) <= x_s(2); + cr_s(3) <= x_s(3); + -- C5 + cr_s(4) <= x_s(4); + cr_s(5) <= x_s(5); + cr_s(6) <= ca6_s; + cr_s(7) <= ca7_s; + -- B5 + cr_s(8) <= ca8_s; + cr_s(9) <= not v_i(3); + + end if; + end process vram_mux; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Shift Registers + ----------------------------------------------------------------------------- + shifters_a7_a8_d7_d8_f8 : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + rd_shift_int <= (others=>'1'); + elsif rising_edge(clk_20mhz_i) then + if (clk_en_10mhz_i and not ck_inh_s) = '1' then + rs_int <= (qh1_s nor qh2_s) & rs_int(3 downto 1); + rd_shift_int <= + lu_d_mux_s(0) & rd_shift_int(15 downto 13) & + lu_d_mux_s(1) & rd_shift_int(11 downto 9) & + lu_d_mux_s(2) & rd_shift_int( 7 downto 5) & + lu_d_mux_s(3) & rd_shift_int( 3 downto 1); + end if; + end if; + end process; + + rd_shift_s <= rd_shift_int when shift_oc_n_s = '0' else (others=>'1'); + rs_s <= rs_int when shift_oc_n_s = '0' else (others=>'1'); +-- rs_n_s(3) <= not rs_s(3) or not rs_enable_s; +-- rs_n_s(2) <= not rs_s(2) or not rs_enable_s; +-- rs_n_s(1) <= not rs_s(1) or not rs_enable_s; +-- rs_n_s(0) <= not rs_s(0) or not rs_enable_s; + rs_n_s(3) <= rs_s(3) and rs_enable_s; + rs_n_s(2) <= rs_s(2) and rs_enable_s; + rs_n_s(1) <= rs_s(1) and rs_enable_s; + rs_n_s(0) <= rs_s(0) and rs_enable_s; + + ----------------------------------------------------------------------------- + -- Sprite VRAM + ----------------------------------------------------------------------------- + vram_a6_in_s(0) <= rd_shift_s( 0); + vram_a6_in_s(1) <= rd_shift_s( 4); + vram_a6_in_s(2) <= rd_shift_s( 8); + vram_a6_in_s(3) <= rd_shift_s(12); + vram_a6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(0), + we_n_i => vram_we_n_s, + d_i => vram_a6_in_s, + d_o => vram_a6_out_s + ); + -- + vram_b6_in_s(0) <= rd_shift_s( 1); + vram_b6_in_s(1) <= rd_shift_s( 5); + vram_b6_in_s(2) <= rd_shift_s( 9); + vram_b6_in_s(3) <= rd_shift_s(13); + vram_b6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(1), + we_n_i => vram_we_n_s, + d_i => vram_b6_in_s, + d_o => vram_b6_out_s + ); + -- + vram_c6_in_s(0) <= rd_shift_s( 2); + vram_c6_in_s(1) <= rd_shift_s( 6); + vram_c6_in_s(2) <= rd_shift_s(10); + vram_c6_in_s(3) <= rd_shift_s(14); + vram_c6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(2), + we_n_i => vram_we_n_s, + d_i => vram_c6_in_s, + d_o => vram_c6_out_s + ); + -- + vram_d6_in_s(0) <= rd_shift_s( 3); + vram_d6_in_s(1) <= rd_shift_s( 7); + vram_d6_in_s(2) <= rd_shift_s(11); + vram_d6_in_s(3) <= rd_shift_s(15); + vram_d6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(3), + we_n_i => vram_we_n_s, + d_i => vram_d6_in_s, + d_o => vram_d6_out_s + ); + -- Remap VRAM data outputs to the complete bus ------------------------------ + rd_vram_s(15) <= vram_d6_out_s(3) or rs_n_s(3); + rd_vram_s(14) <= vram_c6_out_s(3) or rs_n_s(2); + rd_vram_s(13) <= vram_b6_out_s(3) or rs_n_s(1); + rd_vram_s(12) <= vram_a6_out_s(3) or rs_n_s(0); + -- + rd_vram_s(11) <= vram_d6_out_s(2) or rs_n_s(3); + rd_vram_s(10) <= vram_c6_out_s(2) or rs_n_s(2); + rd_vram_s( 9) <= vram_b6_out_s(2) or rs_n_s(1); + rd_vram_s( 8) <= vram_a6_out_s(2) or rs_n_s(0); + -- + rd_vram_s( 7) <= vram_d6_out_s(1) or rs_n_s(3); + rd_vram_s( 6) <= vram_c6_out_s(1) or rs_n_s(2); + rd_vram_s( 5) <= vram_b6_out_s(1) or rs_n_s(1); + rd_vram_s( 4) <= vram_a6_out_s(1) or rs_n_s(0); + -- + rd_vram_s( 3) <= vram_d6_out_s(0) or rs_n_s(3); + rd_vram_s( 2) <= vram_c6_out_s(0) or rs_n_s(2); + rd_vram_s( 1) <= vram_b6_out_s(0) or rs_n_s(1); + rd_vram_s( 0) <= vram_a6_out_s(0) or rs_n_s(0); + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process rd_seq + -- + -- Purpose: + -- Implements the registers saving the RDx bus. + -- + rd_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + vram_q <= (others => '0'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if blank_flont_i = '0' then + -- pseudo-asynchronous clear + vram_q <= (others => '0'); + + elsif clk_en_rd_s = '1' then + if shift_oc_n_s = '0' then + -- take data from shift registers + vram_q <= rd_shift_s; + else + -- take data from VRAM + vram_q <= rd_vram_s; + end if; + end if; + end if; + end process rd_seq; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process sig_mux + -- + -- Purpose: + -- Multiplexes the saved VRAM data to generate the four SIG outputs. + -- + sig_mux: process (vram_q, + h_i, + blank_i) + variable vec_v : std_logic_vector(1 downto 0); + begin + -- default assignment + sig_o <= (others => '0'); + + vec_v := (h_i(1) & h_i(0)); + + if blank_i = '0' then + case vec_v is + when "00" => + sig_o(1) <= vram_q( 1); + sig_o(2) <= vram_q( 5); + sig_o(3) <= vram_q( 9); + sig_o(4) <= vram_q(13); + when "01" => + sig_o(1) <= vram_q( 2); + sig_o(2) <= vram_q( 6); + sig_o(3) <= vram_q(10); + sig_o(4) <= vram_q(14); + when "10" => + sig_o(1) <= vram_q( 3); + sig_o(2) <= vram_q( 7); + sig_o(3) <= vram_q(11); + sig_o(4) <= vram_q(15); + when "11" => + sig_o(1) <= vram_q( 0); + sig_o(2) <= vram_q( 4); + sig_o(3) <= vram_q( 8); + sig_o(4) <= vram_q(12); + when others => + null; + end case; + end if; + end process sig_mux; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + rom_sprite_a_o <= ma_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_sprite_ctrl.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_sprite_ctrl.vhd new file mode 100644 index 00000000..f0eaff48 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_sprite_ctrl.vhd @@ -0,0 +1,491 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite_ctrl.vhd,v 1.8 2005/10/10 22:02:14 arnim Exp $ +-- +-- Control logic of the Sprite module. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +library ieee; +use ieee.numeric_std.all; + +entity ladybug_sprite_ctrl is + + port ( + clk_20mhz_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_5mhz_n_i : in std_logic; + por_n_i : in std_logic; + vbl_n_i : in std_logic; + vbl_d_n_i : in std_logic; + vc_i : in std_logic; + vc_d_i : in std_logic; + ha_i : in std_logic; + ha_d_i : in std_logic; + rb6_i : in std_logic; + rb7_i : in std_logic; + rc3_i : in std_logic; + rc4_i : in std_logic; + rc5_i : in std_logic; + j7_b_i : in std_logic; + j7_c_i : in std_logic; + clk_en_eck_i : in std_logic; + c_o : out std_logic_vector(10 downto 0); + clk_en_5ck_n_o : out std_logic; + clk_en_6ck_n_o : out std_logic; + clk_en_7ck_n_o : out std_logic; + s6ck_n_o : out std_logic; + s7ck_n_o : out std_logic; + clk_en_b7_p3_o : out std_logic; + e5_p8_o : out std_logic; + clk_en_e7_3_o : out std_logic; + a8_p5_n_o : out std_logic + ); + +end ladybug_sprite_ctrl; + + +architecture rtl of ladybug_sprite_ctrl is + + signal clk_5mhz_q : std_logic; + + signal a7_p5_s, + a7_p5_q : std_logic; + signal a7_p9_q : std_logic; + + signal a8_p5_q : std_logic; + + signal n4_p5_s, + n4_p5_q : std_logic; + + signal f7_ck_en_s, + f7_cl_s, + f7_qa_s, f7_qb_s, f7_qc_s, f7_qd_s, + f7_da_s, f7_db_s, f7_dc_s, f7_dd_s : std_logic_vector(2 downto 1); + + signal j5_ck_en_s, + j5_cl_s, + j5_qa_s, j5_qb_s, j5_qc_s, j5_qd_s, + j5_da_s, j5_db_s, j5_dc_s, j5_dd_s : std_logic_vector(2 downto 1); + + signal e7_ck_en_s, + e7_cl_n_s : std_logic; + signal e7_d_s, + e7_q_s, e7_q_n_s, + e7_d_out_s, e7_d_out_n_s : std_logic_vector(4 downto 1); + + signal h5_n_s : std_logic_vector(7 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements various sequential elements. + -- + seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + clk_5mhz_q <= '0'; + a7_p5_q <= '0'; + a7_p9_q <= '0'; + a8_p5_q <= '0'; + n4_p5_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Turn clk_5mhz enable into clock waveform ----------------------------- + if clk_en_5mhz_i = '1' then + clk_5mhz_q <= '1'; + elsif clk_en_5mhz_n_i = '1' then + clk_5mhz_q <= '0'; + end if; + + -- Flip-Flop A7 --------------------------------------------------------- + a7_p5_q <= a7_p5_s; + -- + if clk_en_5mhz_n_i = '1' then + a7_p9_q <= j5_qd_s(2); + end if; + + -- Flip-Flop A8 --------------------------------------------------------- + if clk_en_eck_i = '1' then + a8_p5_q <= j7_b_i nand j7_c_i; + end if; + + -- Flip-Flop N4 --------------------------------------------------------- + n4_p5_q <= n4_p5_s; + + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements various combinational signals. + -- + comb: process (a7_p5_q, + vc_i, vc_d_i, + n4_p5_q, + ha_i, ha_d_i, + f7_qd_s) + begin + -- D Input for Flip-Flop N4 ----------------------------------------------- + if a7_p5_q = '0' then + -- pseudo-asynchronous clear + n4_p5_s <= '0'; + elsif (vc_i and not vc_d_i) = '1' then + -- falling edge on VC + n4_p5_s <= '1'; + else + n4_p5_s <= n4_p5_q; + end if; + + -- D-Input for Flip-Flop A7.5 --------------------------------------------- + if (ha_i and not ha_d_i) = '1' then + -- falling edge on HA + a7_p5_s <= f7_qd_s(2); + else + a7_p5_s <= a7_p5_q; + end if; + + end process comb; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- F7 - Dual 4-Bit Binary Counter + ----------------------------------------------------------------------------- + f7_cl_s(1) <= n4_p5_q and ha_i and vbl_n_i; + f7_cl_s(2) <= f7_cl_s(1); + -- + f7_b : entity work.ttl_393 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => f7_ck_en_s, + por_n_i => por_n_i, + cl_i => f7_cl_s, + qa_o => f7_qa_s, + qb_o => f7_qb_s, + qc_o => f7_qc_s, + qd_o => f7_qd_s, + da_o => f7_da_s, + db_o => f7_db_s, + dc_o => f7_dc_s, + dd_o => f7_dd_s + ); + + + ----------------------------------------------------------------------------- + -- Process f7_ck_en + -- + -- Purpose: + -- Build the clock enable for the two counters in F7. + -- + f7_ck_en: process (j5_qd_s, j5_dd_s, + vbl_n_i, vbl_d_n_i, + ha_i, ha_d_i, + n4_p5_q, n4_p5_s, + f7_qd_s, f7_dd_s, + e7_q_n_s, e7_d_out_n_s, + f7_qb_s, f7_db_s) + + variable ff_q_v, ff_d_v : std_logic; + + begin + + -- combinational result based on flip-flop outputs + ff_q_v := j5_qd_s(2) or ( not ( not ( vbl_n_i and ha_i and n4_p5_q ) ) or not ( not f7_qd_s(2) nand not e7_q_n_s(1) ) ); + + -- combinational result based on flip-flop inputs + ff_d_v := j5_dd_s(2) or ( not ( not ( vbl_d_n_i and ha_d_i and n4_p5_s ) ) or not ( not f7_qd_s(2) nand not e7_d_out_n_s(1) ) ); +-- B7.3 D7.8 D7.8 F6.3 B7.6 + -- rising edge detector on B7.3 + f7_ck_en_s(1) <= not ff_q_v and ff_d_v; + + -- falling edge detector on F7.QB(1) + f7_ck_en_s(2) <= f7_qb_s(1) and not f7_db_s(1); + + end process f7_ck_en; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- J5 - Dual 4-Bit Binary Counter + ----------------------------------------------------------------------------- + j5_cl_s(1) <= not vbl_n_i + or -- D7.6 + not( + not clk_5mhz_q + nand -- F5.8 + not h5_n_s(0) + ) + or -- D7.6 + n4_p5_q; + j5_cl_s(2) <= a7_p9_q + or -- B7.8 + ( + not ( + not ( + n4_p5_q + and -- D7.8 + ha_i + and -- D7.8 + vbl_n_i + ) + ) + or -- F6.3 + not ( + not f7_qd_s(2) + nand -- B7.6 + not e7_q_n_s(1) + ) + ); + -- + j5_b : entity work.ttl_393 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => j5_ck_en_s, + por_n_i => por_n_i, + cl_i => j5_cl_s, + qa_o => j5_qa_s, + qb_o => j5_qb_s, + qc_o => j5_qc_s, + qd_o => j5_qd_s, + da_o => j5_da_s, + db_o => j5_db_s, + dc_o => j5_dc_s, + dd_o => j5_dd_s + ); + + + ----------------------------------------------------------------------------- + -- Process j5_ck_en + -- + -- Purpose: + -- Build the clock enable for the two counters in J5. + -- + j5_ck_en: process (ha_i, ha_d_i, + e7_q_s, e7_d_out_s, + j5_qc_s, j5_dc_s) + begin + -- falling edge detector on F6.11 + j5_ck_en_s(1) <= -- Flip-Flop Outputs + ( + not ha_i + nand + e7_q_s(3) + ) + and not -- Flip-Flop Inputs + ( + not ha_d_i + nand + e7_d_out_s(3) + ); + + -- falling edge detector on C7.10 + j5_ck_en_s(2) <= -- Flip-Flop Outputs + ( + j5_qc_s(1) + nor + e7_q_s(2) + ) + and not -- Flip-Flop Inputs + ( + j5_dc_s(1) + nor + e7_d_out_s(2) + ); + end process j5_ck_en; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- E7 - Quad D-Type Flip-Flops with Clear + ----------------------------------------------------------------------------- + e7_d_s(1) <= not rb7_i; + e7_d_s(2) <= not ( + rb7_i + and -- D7.12 + rc5_i + and -- D7.12 + ( + not rc4_i + and -- C7.1 + not ( + not rc3_i + nor -- C6.3 + rb6_i + ) + ) + ); + e7_d_s(3) <= not e7_d_s(2) + and -- C7.4 + not a8_p5_q; + e7_d_s(4) <= '0'; + + -- This clock enable is not 100% equivalent to the schematics. + -- There, h5_n_s(4) could also generate a rising edge for E7 + -- but this is ignored here. It is believed that h5_n_s(4) acts + -- only as a clock enable/suppress for the 5 MHz clock. + -- This implementation suppresses as well a combinational feedback + -- loop from J5/1. + e7_ck_en_s <= clk_en_5mhz_i and not h5_n_s(4); + + e7_cl_n_s <= f7_qd_s(2) + or -- B7.3?? + ( + not clk_5mhz_q + nand -- F5.8 + not h5_n_s(0) + ) after 20 ns; + + e7_b : entity work.ttl_175 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => e7_ck_en_s, + por_n_i => por_n_i, + cl_n_i => e7_cl_n_s, + d_i => e7_d_s, + q_o => e7_q_s, + q_n_o => e7_q_n_s, + d_o => e7_d_out_s, + d_n_o => e7_d_out_n_s + ); + + clk_en_e7_3_o <= not e7_q_s(3) and e7_d_out_s(3); + + + ----------------------------------------------------------------------------- + -- Process h5 + -- + -- Purpose: + -- Implements all functionality regarding H5. + -- + h5: process (j5_qa_s, j5_da_s, + j5_qb_s, j5_db_s, + ha_i, ha_d_i, + vbl_n_i, vbl_d_n_i, + a7_p5_q, a7_p5_s) + variable ff_q_v, ff_d_v : std_logic_vector(7 downto 0); + variable f5_p3_q_v, f5_p3_d_v : std_logic; + + ----------------------------------------------------------------------------- + -- 7445 - BCD to Decimal Decoder + ----------------------------------------------------------------------------- + function ttl_45_f(a, b, c, d : in std_logic) return + std_logic_vector is + variable idx_v : std_logic_vector( 3 downto 0); + variable vec_v : std_logic_vector(15 downto 0); + begin + vec_v := (others => '1'); + + idx_v := d & c & b & a; + vec_v(to_integer(unsigned(idx_v))) := '0'; + + return vec_v(7 downto 0); + end ttl_45_f; + + begin + -- combinational result based on flip-flop outputs + f5_p3_q_v := not a7_p5_q nand vbl_n_i; + ff_q_v := ttl_45_f(a => j5_qa_s(1), + b => j5_qb_s(1), + c => ha_i, + d => f5_p3_q_v); + -- combinational result based on flip-flop inputs + f5_p3_d_v := not a7_p5_s nand vbl_d_n_i; + ff_d_v := ttl_45_f(a => j5_da_s(1), + b => j5_db_s(1), + c => ha_d_i, + d => f5_p3_d_v); + + -- combinational output of H5 is based on flip-flop outputs + h5_n_s <= ff_q_v; + + -- clock enable for flip-flops on /5CK + clk_en_5ck_n_o <= not ff_q_v(5) and ff_d_v(5); + -- clock enable for flip-flops on /6CK + clk_en_6ck_n_o <= not ff_q_v(6) and ff_d_v(6); + -- clock enable for flip-flops on /7CK + clk_en_7ck_n_o <= not ff_q_v(7) and ff_d_v(7); + + s6ck_n_o <= ff_q_v(6); + s7ck_n_o <= ff_q_v(7); + end process h5; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + clk_en_b7_p3_o <= f7_ck_en_s(1); + e5_p8_o <= n4_p5_q + nor -- E5.8 + not ( + f7_qa_s(1) + nand -- F6.8 + f7_qb_s(1) + ); + a8_p5_n_o <= not a8_p5_q; + + c_o( 0) <= j5_qa_s(1); + c_o( 1) <= j5_qb_s(1); + c_o( 2) <= j5_qa_s(2); + c_o( 3) <= j5_qb_s(2); + c_o( 4) <= j5_qc_s(2); + c_o( 5) <= j5_qd_s(2); + c_o( 6) <= f7_qa_s(2); + c_o( 7) <= f7_qb_s(2); + c_o( 8) <= f7_qc_s(2); + c_o( 9) <= f7_qa_s(1); + c_o(10) <= f7_qb_s(1); + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_video_timing.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_video_timing.vhd new file mode 100644 index 00000000..58a3a818 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_video_timing.vhd @@ -0,0 +1,356 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_video_timing.vhd,v 1.16 2006/02/07 19:27:38 arnim Exp $ +-- +-- The Video Timing Module of Lady Bug Machine. +-- +-- It implements the horizontal and vertical timing signals including composite +-- sync information. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +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 ladybug_video_timing is + + port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + -- Horizontal Timing Interface -------------------------------------------- + h_o : out std_logic_vector(3 downto 0); + h_t_o : out std_logic_vector(3 downto 0); + hbl_o : out std_logic; + hx_o : out std_logic; + ha_d_o : out std_logic; + ha_t_rise_o : out std_logic; + -- Vertical Timing Interface ---------------------------------------------- + v_o : out std_logic_vector(3 downto 0); + v_t_o : out std_logic_vector(3 downto 0); + vc_d_o : out std_logic; + vbl_n_o : out std_logic; + vbl_d_n_o : out std_logic; + vbl_t_n_o : out std_logic; + blank_flont_o : out std_logic; + -- RBG Video Interface ---------------------------------------------------- + hsync_n_o : out std_logic; + vsync_n_o : out std_logic; + comp_sync_n_o : out std_logic + ); + +end ladybug_video_timing; + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_video_timing is + + -- horizontal timing circuit + signal h_preset : std_logic_vector(7 downto 0); + signal h_rise : std_logic_vector(7 downto 0); + signal h_do : std_logic_vector(7 downto 0); + signal h_j2_h2 : std_logic_vector(7 downto 0); + signal h_s : std_logic_vector(7 downto 0); + signal hx_q, + hx_s, + hx_n_s : std_logic; + signal hx_rise_s : std_logic; + signal hbl_q : std_logic; +-- signal hbl_n_s : std_logic; + signal hsync_n_q : std_logic; + signal h_carry_s : std_logic; + signal hd_rise_s : std_logic; + + -- vertical timing circuit + signal v_preset : std_logic_vector(7 downto 0); + signal v_rise : std_logic_vector(7 downto 0); + signal v_do : std_logic_vector(7 downto 0); + signal v_s : std_logic_vector(7 downto 0); + signal vx_q, + vx_n_s : std_logic; + signal vbl_q, + vbl_s, + vbl_n_s : std_logic; + signal vbl_t_q, + vbl_t_s, + vbl_t_n_s : std_logic; + signal vsync_n_q : std_logic; + signal v_carry_s : std_logic; + signal vc_rise_s, + vd_rise_s : std_logic; + signal vb_t_rise_s : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Horizontal Timing counters J2 H2 + ----------------------------------------------------------------------------- + hd_rise_s <= h_rise(3); + ha_t_rise_o <= h_rise(4); + ha_d_o <= h_do(0); + h_preset <= hx_n_s & hx_n_s & "00" & hx_n_s & "000"; + + h_counter : entity work.counter + port map ( + ck_i => clk_20mhz_i, + ck_en_i => clk_en_5mhz_i, + reset_n_i => por_n_i, + load_i => h_carry_s, + preset_i => h_preset, + q_o => h_s, + co_o => h_carry_s, + rise_q_o => h_rise, + d_o => h_do + ); + + ----------------------------------------------------------------------------- + -- Process h_timing + -- + -- Purpose: + -- Implement the horizontal timing circuit. + -- + -- The original circuit has no asynchronous reset. To have a stable + -- behavior on silicon, all sequential elements are cleared with the + -- power-on reset. This assumes that the original chips power-up to + -- these values. + -- + -- See also instantiations of ttl_161. + -- + h_timing: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + hx_q <= '0'; + hbl_q <= '0'; + hsync_n_q <= '1'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Flip-flops on 5 MHz clock -------------------------------------------- + -- HX + hx_q <= hx_s; + + -- Free running flip-flops ---------------------------------------------- + -- HBL + if (hx_q and not h_s(3)) = '1' then + -- pseudo-asynchronous preset + hbl_q <= '1'; + elsif hd_rise_s = '1' then + -- Rising edge on HD + hbl_q <= hx_q; + end if; + + -- HSYNC + if hx_q = '0' then + -- pseudo-asynchronous preset + hsync_n_q <= '1'; + elsif hd_rise_s = '1' then + -- rising edge on HD + hsync_n_q <= h_s(5); + end if; + + end if; + + end process h_timing; + -- + ----------------------------------------------------------------------------- + + hx_n_s <= not hx_q; +--hbl_n_s <= not hbl_q; + + ----------------------------------------------------------------------------- + -- Process hx_comb + -- + -- Purpose: + -- Implements the combinational logic for hx. Including rising edge + -- detection. + -- + hx_comb: process (clk_en_5mhz_i, h_carry_s, hx_q) + begin + -- default assignments + hx_s <= hx_q; + hx_rise_s <= '0'; + + -- HX + if clk_en_5mhz_i = '1' then + if h_carry_s = '1' then + hx_s <= not hx_q; + + -- flag rising edge of hx_q + if hx_q = '0' then + hx_rise_s <= '1'; + end if; + end if; + end if; + + end process hx_comb; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Vertical Timing counters E5 E2 + ----------------------------------------------------------------------------- + vb_t_rise_s <= v_rise(5); + vd_rise_s <= v_rise(3); + vc_rise_s <= v_rise(2); + vc_d_o <= v_do(2); + v_preset <= vx_n_s & vx_n_s & vx_n_s & vx_q & vx_n_s & '0' & vx_n_s & '0'; + + v_counter : entity work.counter + port map ( + ck_i => clk_20mhz_i, + ck_en_i => hx_rise_s, + reset_n_i => por_n_i, + load_i => v_carry_s, + preset_i => v_preset, + q_o => v_s, + co_o => v_carry_s, + rise_q_o => v_rise, + d_o => v_do + ); + + ----------------------------------------------------------------------------- + -- Process v_timing + -- + -- Purpose: + -- Implement the vertical timing circuit. + -- + -- See process h_timing for reset discussion. + -- + v_timing: process (clk_20mhz_i, por_n_i) + variable preset_v : boolean; + begin + if por_n_i = '0' then + vx_q <= '0'; + vbl_q <= '0'; + vsync_n_q <= '1'; + vbl_t_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Free running flip-flops ---------------------------------------------- + -- VX + if hx_rise_s = '1' then + if v_carry_s = '1' then + vx_q <= vx_n_s; + end if; + end if; + + -- VSYNC + if vc_rise_s = '1' then + -- rising edge on VC + vsync_n_q <= not (v_s(7) and v_s(6) and v_s(5) and v_s(4) and v_s(3) and vx_n_s); + end if; + + -- VBL + vbl_q <= vbl_s; + + -- VBL' + vbl_t_q <= vbl_t_s; + + end if; + end process v_timing; + -- + ----------------------------------------------------------------------------- + + vx_n_s <= not vx_q; + vbl_n_s <= not vbl_q; + vbl_t_n_s <= not vbl_t_q; + + + ----------------------------------------------------------------------------- + -- Process vbl_comb + -- + -- Purpose: + -- Combinational logic for vbl_q and vbl_t_q. + -- + vbl_comb: process (v_s, vb_t_rise_s, vd_rise_s, vx_q, vbl_q, vbl_t_q) + variable preset_v : boolean; + begin + preset_v := (v_s(5) and v_s(6) and v_s(7)) = '1'; + -- VBL + vbl_s <= vbl_q; + if preset_v then + -- pseudo-asynchronous preset + vbl_s <= '1'; + elsif vb_t_rise_s = '1' then + -- rising edge on VB' + vbl_s <= vx_q; + end if; + + -- VBL' + vbl_t_s <= vbl_t_q; + if preset_v then + -- pseudo-asynchronous preset + vbl_t_s <= '1'; + elsif vd_rise_s = '1' then + -- rising edge on VD + vbl_t_s <= vx_q; + end if; + + end process vbl_comb; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + h_o <= h_s(3 downto 0); + h_t_o <= h_s(7 downto 4); + hbl_o <= hbl_q; + hx_o <= hx_q; + v_o <= v_s(3 downto 0); + v_t_o <= v_s(7 downto 4); + vbl_n_o <= vbl_n_s; + vbl_t_n_o <= vbl_t_n_s; + vbl_d_n_o <= not vbl_s; + hsync_n_o <= hsync_n_q; + vsync_n_o <= vsync_n_q; + comp_sync_n_o <= not hsync_n_q xor vsync_n_q; + + -- I have no idea why there is an additional wire called BLANK FLONT. + -- From the schematics, it is the same as /VBL (just buffered). + blank_flont_o <= vbl_n_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_video_unit.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_video_unit.vhd new file mode 100644 index 00000000..96d58e5f --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ladybug_video_unit.vhd @@ -0,0 +1,240 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_video_unit.vhd,v 1.22 2006/02/07 00:44:35 arnim Exp $ +-- +-- The Video Unit of the Lady Bug Machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_video_unit is + port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + res_n_i : in std_logic; + clk_en_10mhz_i : in std_logic; + clk_en_10mhz_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_5mhz_n_i : in std_logic; + clk_en_4mhz_i : in std_logic; + -- CPU Interface ---------------------------------------------------------- + cs7_n_i : in std_logic; + cs10_n_i : in std_logic; + cs13_n_i : in std_logic; + a_i : in std_logic_vector(10 downto 0); + rd_n_i : in std_logic; + wr_n_i : in std_logic; + wait_n_o : out std_logic; + d_from_cpu_i : in std_logic_vector( 7 downto 0); + d_from_video_o : out std_logic_vector( 7 downto 0); + vc_o : out std_logic; + vbl_tick_n_o : out std_logic; + vbl_buf_o : out std_logic; + -- RGB Video Interface ---------------------------------------------------- + rgb_r_o : out std_logic_vector( 1 downto 0); + rgb_g_o : out std_logic_vector( 1 downto 0); + rgb_b_o : out std_logic_vector( 1 downto 0); + hsync_n_o : out std_logic; + vsync_n_o : out std_logic; + comp_sync_n_o : out std_logic; + vblank_o : out std_logic; + hblank_o : out std_logic; + -- Character ROM Interface ------------------------------------------------ + rom_char_a_o : out std_logic_vector(11 downto 0); + rom_char_d_i : in std_logic_vector(15 downto 0); + -- Sprite ROM Interface --------------------------------------------------- + rom_sprite_a_o : out std_logic_vector(11 downto 0); + rom_sprite_d_i : in std_logic_vector(15 downto 0) + ); + +end ladybug_video_unit; + +architecture struct of ladybug_video_unit is + + signal h_s, + h_t_s : std_logic_vector(3 downto 0); + signal ha_d_s, + ha_t_rise_s : std_logic; + signal hbl_s : std_logic; + signal hx_s : std_logic; + + signal v_s, + v_t_s : std_logic_vector(3 downto 0); + signal vc_d_s : std_logic; + signal vbl_n_s, + vbl_d_n_s : std_logic; + + signal blank_flont_s : std_logic; + + signal d_from_char_s : std_logic_vector(7 downto 0); + + signal blank_s : std_logic; + signal crg_s : std_logic_vector(5 downto 1); + + signal sig_s : std_logic_vector(4 downto 1); + + signal comp_sync_n : std_logic; + +begin + comp_sync_n_o <= comp_sync_n and vbl_n_s; + vbl_buf_o <= not vbl_n_s; + ----------------------------------------------------------------------------- + -- Horizontal and Vertical Timing Generator + ----------------------------------------------------------------------------- + timing_b : entity work.ladybug_video_timing + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + h_o => h_s, + h_t_o => h_t_s, + hbl_o => hbl_s, + hx_o => hx_s, + ha_d_o => ha_d_s, + ha_t_rise_o => ha_t_rise_s, + v_o => v_s, + v_t_o => v_t_s, + vc_d_o => vc_d_s, + vbl_n_o => vbl_n_s, + vbl_d_n_o => vbl_d_n_s, + vbl_t_n_o => vbl_tick_n_o, + blank_flont_o => blank_flont_s, + hsync_n_o => hsync_n_o, + vsync_n_o => vsync_n_o, + comp_sync_n_o => comp_sync_n + ); + vc_o <= v_s(2); + + + ----------------------------------------------------------------------------- + -- Character Module + ----------------------------------------------------------------------------- + char_b : entity work.ladybug_char + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + res_n_i => res_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + clk_en_4mhz_i => clk_en_4mhz_i, + cs10_n_i => cs10_n_i, + cs13_n_i => cs13_n_i, + a_i => a_i, + rd_n_i => rd_n_i, + wr_n_i => wr_n_i, + wait_n_o => wait_n_o, + d_from_cpu_i => d_from_cpu_i, + d_from_char_o => d_from_char_s, + h_i => h_s, + h_t_i => h_t_s, + ha_t_rise_i => ha_t_rise_s, + hx_i => hx_s, + v_i => v_s, + v_t_i => v_t_s, + hbl_i => hbl_s, + blank_flont_i => blank_flont_s, + blank_o => blank_s, + vblank_o => vblank_o, + hblank_o => hblank_o, + crg_o => crg_s, + rom_char_a_o => rom_char_a_o, + rom_char_d_i => rom_char_d_i + ); + + + ----------------------------------------------------------------------------- + -- Sprite Module + ----------------------------------------------------------------------------- + sprite_b : entity work.ladybug_sprite + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + res_n_i => res_n_i, + clk_en_10mhz_i => clk_en_10mhz_i, + clk_en_10mhz_n_i => clk_en_10mhz_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + clk_en_5mhz_n_i => clk_en_5mhz_n_i, + cs7_n_i => cs7_n_i, + a_i => a_i(9 downto 0), + d_from_cpu_i => d_from_cpu_i, + h_i => h_s, + h_t_i => h_t_s, + hx_i => hx_s, + ha_d_i => ha_d_s, + v_i => v_s, + v_t_i => v_t_s, + vbl_n_i => vbl_n_s, + vbl_d_n_i => vbl_d_n_s, + vc_d_i => vc_d_s, + blank_flont_i => blank_flont_s, + blank_i => blank_s, + sig_o => sig_s, + rom_sprite_a_o => rom_sprite_a_o, + rom_sprite_d_i => rom_sprite_d_i + ); + + + ----------------------------------------------------------------------------- + -- RGB Generator + ----------------------------------------------------------------------------- + rgb_b : entity work.ladybug_rgb + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + crg_i => crg_s, + sig_i => sig_s, + rgb_r_o => rgb_r_o, + rgb_g_o => rgb_g_o, + rgb_b_o => rgb_b_o + ); + + + ----------------------------------------------------------------------------- + -- Bus Multiplexer + ----------------------------------------------------------------------------- + d_from_video_o <= d_from_char_s + when cs13_n_i = '0' else + (others => '1'); + +end struct; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/mist_io.v b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_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/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/osd.v b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_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/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/pll.qip b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_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/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/pll.v b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/pll.v new file mode 100644 index 00000000..65715540 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 20, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "20.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "20" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "20.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "20" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/scandoubler.v b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/ladybug_sound_unit.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/ladybug_sound_unit.vhd new file mode 100644 index 00000000..23ad2a6a --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/ladybug_sound_unit.vhd @@ -0,0 +1,143 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sound_unit.vhd,v 1.4 2006/06/16 22:41:37 arnim Exp $ +-- +-- Sound Unit of the Lady Bug Machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ladybug_sound_unit is + + port ( + clk_20mhz_i : in std_logic; + clk_en_4mhz_i : in std_logic; + por_n_i : in std_logic; + cs11_n_i : in std_logic; + cs12_n_i : in std_logic; + wr_n_i : in std_logic; + d_from_cpu_i : in std_logic_vector(7 downto 0); + sound_wait_n_o : out std_logic; + audio_o : out signed(7 downto 0) + ); + +end ladybug_sound_unit; + +architecture struct of ladybug_sound_unit is + + signal ready_b1_s, + ready_c1_s : std_logic; + + signal aout_b1_s, + aout_c1_s : signed(7 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- SN76489 Sound Chip B1 + ----------------------------------------------------------------------------- + snd_b1_b : entity work.sn76489_top + generic map ( + clock_div_16_g => 1 + ) + port map ( + clock_i => clk_20mhz_i, + clock_en_i => clk_en_4mhz_i, + res_n_i => por_n_i, + ce_n_i => cs11_n_i, + we_n_i => wr_n_i, + ready_o => ready_b1_s, + d_i => d_from_cpu_i, + aout_o => aout_b1_s + ); + + + ----------------------------------------------------------------------------- + -- SN76489 Sound Chip C1 + ----------------------------------------------------------------------------- + snd_c1_b : entity work.sn76489_top + generic map ( + clock_div_16_g => 1 + ) + port map ( + clock_i => clk_20mhz_i, + clock_en_i => clk_en_4mhz_i, + res_n_i => por_n_i, + ce_n_i => cs12_n_i, + we_n_i => wr_n_i, + ready_o => ready_c1_s, + d_i => d_from_cpu_i, + aout_o => aout_c1_s + ); + + + ----------------------------------------------------------------------------- + -- Process mix + -- + -- Purpose: + -- Mix the digital audio of the two SN76489 instances. + -- Additional care is taken to avoid audio overfow/clipping. + -- + mix: process (aout_b1_s, + aout_c1_s) + variable sum_v : signed(8 downto 0); + begin + sum_v := RESIZE(aout_b1_s, 9) + RESIZE(aout_c1_s, 9); + + if sum_v > 127 then + audio_o <= to_signed(127, 8); + elsif sum_v < -128 then + audio_o <= to_signed(-128, 8); + else + audio_o <= RESIZE(sum_v, 8); + end if; + + end process mix; + -- + ----------------------------------------------------------------------------- + + + sound_wait_n_o <= ready_b1_s and ready_c1_s; + +end struct; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/COPYING b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/COPYING new file mode 100644 index 00000000..60549be5 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/README b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/README new file mode 100644 index 00000000..33630144 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/README @@ -0,0 +1,143 @@ + +An SN76489AN Compatible Implementation in VHDL +============================================== +Version: $Date: 2006/06/18 19:28:40 $ + +Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +See the file COPYING. + + +Integration +----------- + +The sn76489 design exhibits all interface signals as the original chip. It +only differs in the audio data output which is provided as an 8 bit signed +vector instead of an analog output pin. + + generic ( + clock_div_16_g : integer := 1 + -- Set to '1' when operating the design in SN76489 mode. The primary clock + -- input is divided by 16 in this variant. The data sheet mentions the + -- SN76494 which contains a divide-by-2 clock input stage. Set the generic + -- to '0' to enable this mode. + ); + port ( + clock_i : in std_logic; + -- Primary clock input + -- Drive with the target frequency or any integer multiple of it. + + clock_en_i : in std_logic; + -- Clock enable + -- A '1' on this input qualifies a valid rising edge on clock_i. A '0' + -- disables the next rising clock edge, effectivley halting the design + -- until the next enabled rising clock edge. + -- Can be used to run the core at lower frequencies than applied on + -- clock_i. + + res_n_i : in std_logic; + -- Asynchronous low active reset input. + -- Sets all sequential elements to a known state. + + ce_n_i : in std_logic; + -- Chip enable, low active. + + we_n_i : in std_logic; + -- Write enable, low active. + + ready_o : out std_logic; + -- Ready indication to microprocessor. + + d_i : in std_logic_vector(0 to 7); + -- Data input + -- MSB 0 ... 7 LSB + + aout_o : out signed(0 to 7) + -- Audio output, signed vector + -- MSB/SIGN 0 ... 7 LSB + ); + + +Both 8 bit vector ports are defined (0 to 7) which declares bit 0 to be the +MSB and bit 7 to be the LSB. This has been implemented according to TI's data +sheet, thus all register/data format figures apply 1:1 for this design. +Many systems will flip the system data bus bit wise before it is connected to +this PSG. This is simply achieved with the following VHDL construct: + + signal data_s : std_logic_vector(7 downto 0); + + ... + d_i => data_s, + ... + +d_i and data_s will be assigned from left to right, resulting in the expected +bit assignment: + + d_i data_s + 0 7 + 1 6 + ... + 6 1 + 7 0 + + +As this design is fully synchronous, care has to be taken when the design +replaces an SN76489 in asynchronous mode. No problems are expected when +interfacing the code to other synchronous components. + + +Design Hierarchy +---------------- + + sn76489_top + | + +-- sn76489_latch_ctrl + | + +-- sn76489_clock_div + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + \-- sn76489_noise + | + \-- sn76489_attentuator + +Resulting compilation sequence: + + sn76489_comp_pack-p.vhd + sn76489_top.vhd + sn76489_latch_ctrl.vhd + sn76489_latch_ctrl-c.vhd + sn76489_clock_div.vhd + sn76489_clock_div-c.vhd + sn76489_attenuator.vhd + sn76489_attenuator-c.vhd + sn76489_tone.vhd + sn76489_tone-c.vhd + sn76489_noise.vhd + sn76489_noise-c.vhd + sn76489_top-c.vhd + +Skip the files containing VHDL configurations when analyzing the code for +synthesis. + + +References +---------- + +* TI Data sheet SN76489.pdf + ftp://ftp.whtech.com/datasheets%20&%20manuals/SN76489.pdf + +* John Kortink's article on the SN76489: + http://web.inter.nl.net/users/J.Kortink/home/articles/sn76489/ + +* Maxim's "SN76489 notes" in + http://www.smspower.org/maxim/docs/SN76489.txt diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_attenuator.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_attenuator.vhd new file mode 100644 index 00000000..444064e5 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_attenuator.vhd @@ -0,0 +1,114 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_attenuator.vhd,v 1.7 2006/02/27 20:30:10 arnim Exp $ +-- +-- Attenuator Module +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_attenuator is + + port ( + attenuation_i : in std_logic_vector(0 to 3); + factor_i : in signed(0 to 1); + product_o : out signed(0 to 7) + ); + +end sn76489_attenuator; + + +architecture rtl of sn76489_attenuator is + +begin + + ----------------------------------------------------------------------------- + -- Process attenuate + -- + -- Purpose: + -- Determine the attenuation and generate the resulting product. + -- + -- The maximum attenuation value is 31 which corresponds to volume off. + -- As described in the data sheet, the maximum "playing" attenuation is + -- 28 = 16 + 8 + 4 + -- + -- The table for the volume constants is derived from the following + -- formula (each step is 2dB voltage): + -- v(0) = 31 + -- v(n+1) = v(n) * 0.79432823 + -- + attenuate: process (attenuation_i, + factor_i) + + type volume_t is array (natural range 0 to 15) of natural; + constant volume_c : volume_t := + (31, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3, 2, 2, 2, 1, 0); + + variable attenuation_v : unsigned(attenuation_i'range); + variable volume_v : signed(product_o'range); + + begin + + attenuation_v := unsigned(attenuation_i); + + -- volume look-up table + volume_v := to_signed(volume_c(to_integer(attenuation_v)), + product_o'length); + + -- this replaces a multiplier and consumes a bit fewer + -- resources + case to_integer(factor_i) is + when +1 => + product_o <= volume_v; + when -1 => + product_o <= -volume_v; + when others => + product_o <= (others => '0'); + end case; + + end process attenuate; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_clock_div.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_clock_div.vhd new file mode 100644 index 00000000..eab86beb --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_clock_div.vhd @@ -0,0 +1,134 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_clock_div.vhd,v 1.4 2005/10/10 21:51:27 arnim Exp $ +-- +-- Clock Divider Circuit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity sn76489_clock_div is + + generic ( + clock_div_16_g : integer := 1 + ); + port ( + clock_i : in std_logic; + clock_en_i : in std_logic; + res_n_i : in std_logic; + clk_en_o : out boolean + ); + +end sn76489_clock_div; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of sn76489_clock_div is + + signal cnt_s, + cnt_q : unsigned(3 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the sequential counter element. + -- + seq: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + cnt_q <= (others => '0'); + elsif clock_i'event and clock_i = '1' then + cnt_q <= cnt_s; + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements the combinational counter logic. + -- + comb: process (clock_en_i, + cnt_q) + begin + -- default assignments + cnt_s <= cnt_q; + clk_en_o <= false; + + if clock_en_i = '1' then + + if cnt_q = 0 then + clk_en_o <= true; + + if clock_div_16_g = 1 then + cnt_s <= to_unsigned(15, cnt_q'length); + elsif clock_div_16_g = 0 then + cnt_s <= to_unsigned( 1, cnt_q'length); + else + -- pragma translate_off + assert false + report "Generic clock_div_16_g must be either 0 or 1." + severity failure; + -- pragma translate_on + end if; + + else + cnt_s <= cnt_q - 1; + + end if; + + end if; + + end process comb; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_latch_ctrl.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_latch_ctrl.vhd new file mode 100644 index 00000000..789720c2 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_latch_ctrl.vhd @@ -0,0 +1,138 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_latch_ctrl.vhd,v 1.6 2006/02/27 20:30:10 arnim Exp $ +-- +-- Latch Control Unit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity sn76489_latch_ctrl is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + ce_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector(0 to 7); + ready_o : out std_logic; + tone1_we_o : out boolean; + tone2_we_o : out boolean; + tone3_we_o : out boolean; + noise_we_o : out boolean; + r2_o : out std_logic + ); + +end sn76489_latch_ctrl; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of sn76489_latch_ctrl is + + signal reg_q : std_logic_vector(0 to 2); + signal we_q : boolean; + signal ready_q : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the sequential elements. + -- + seq: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + reg_q <= (others => '0'); + we_q <= false; + ready_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + -- READY Flag Output ---------------------------------------------------- + if ready_q = '0' and we_q then + if clk_en_i then + -- assert READY when write access happened + ready_q <= '1'; + end if; + elsif ce_n_i = '1' then + -- deassert READY when access has finished + ready_q <= '0'; + end if; + + -- Register Selection --------------------------------------------------- + if ce_n_i = '0' and we_n_i = '0' then + if clk_en_i then + if d_i(0) = '1' then + reg_q <= d_i(1 to 3); + end if; + we_q <= true; + end if; + else + we_q <= false; + end if; + + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output mapping + ----------------------------------------------------------------------------- + tone1_we_o <= reg_q(0 to 1) = "00" and we_q; + tone2_we_o <= reg_q(0 to 1) = "01" and we_q; + tone3_we_o <= reg_q(0 to 1) = "10" and we_q; + noise_we_o <= reg_q(0 to 1) = "11" and we_q; + + r2_o <= reg_q(2); + + ready_o <= ready_q + when ce_n_i = '0' else + '1'; + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_noise.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_noise.vhd new file mode 100644 index 00000000..688bdd56 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_noise.vhd @@ -0,0 +1,278 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_noise.vhd,v 1.6 2006/02/27 20:30:10 arnim Exp $ +-- +-- Noise Generator +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_noise is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + we_i : in boolean; + d_i : in std_logic_vector(0 to 7); + r2_i : in std_logic; + tone3_ff_i : in std_logic; + noise_o : out signed(0 to 7) + ); + +end sn76489_noise; + +architecture rtl of sn76489_noise is + + signal nf_q : std_logic_vector(0 to 1); + signal fb_q : std_logic; + signal a_q : std_logic_vector(0 to 3); + signal freq_cnt_q : unsigned(0 to 6); + signal freq_ff_q : std_logic; + + signal shift_source_s, + shift_source_q : std_logic; + signal shift_rise_edge_s : boolean; + + signal lfsr_q : std_logic_vector(0 to 15); + + signal freq_s : signed(0 to 1); + +begin + + ----------------------------------------------------------------------------- + -- Process cpu_regs + -- + -- Purpose: + -- Implements the registers writable by the CPU. + -- + cpu_regs: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + nf_q <= (others => '0'); + fb_q <= '0'; + a_q <= (others => '1'); + + elsif clock_i'event and clock_i = '1' then + if clk_en_i and we_i then + if r2_i = '0' then + -- access to control register + -- both access types can write to the control register! + nf_q <= d_i(6 to 7); + fb_q <= d_i(5); + + else + -- access to attenuator register + -- both access types can write to the attenuator register! + a_q <= d_i(4 to 7); + + end if; + end if; + end if; + end process cpu_regs; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process freq_gen + -- + -- Purpose: + -- Implements the frequency generation components. + -- + freq_gen: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + freq_cnt_q <= (others => '0'); + freq_ff_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if freq_cnt_q = 0 then + -- reload frequency counter according to NF setting + case nf_q is + when "00" => + freq_cnt_q <= to_unsigned(16 * 2 - 1, freq_cnt_q'length); + when "01" => + freq_cnt_q <= to_unsigned(16 * 4 - 1, freq_cnt_q'length); + when "10" => + freq_cnt_q <= to_unsigned(16 * 8 - 1, freq_cnt_q'length); + when others => + null; + end case; + + freq_ff_q <= not freq_ff_q; + + else + -- decrement frequency counter + freq_cnt_q <= freq_cnt_q - 1; + + end if; + + end if; + end if; + end process freq_gen; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Multiplex the source of the LFSR's shift enable + ----------------------------------------------------------------------------- + shift_source_s <= tone3_ff_i + when nf_q = "11" else + freq_ff_q; + + ----------------------------------------------------------------------------- + -- Process rise_edge + -- + -- Purpose: + -- Detect the rising edge of the selected LFSR shift source. + -- + rise_edge: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + shift_source_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + shift_source_q <= shift_source_s; + end if; + end if; + end process rise_edge; + -- + ----------------------------------------------------------------------------- + + -- detect rising edge on shift source + shift_rise_edge_s <= shift_source_q = '0' and shift_source_s = '1'; + + + ----------------------------------------------------------------------------- + -- Process lfsr + -- + -- Purpose: + -- Implements the LFSR that generates noise. + -- Note: This implementation shifts the register right, i.e. from index + -- 15 towards 0 => bit 15 is the input, bit 0 is the output + -- + -- Tapped bits according to MAME's sn76496.c, implemented in function + -- lfsr_tapped_f. + -- + lfsr: process (clock_i, res_n_i) + + function lfsr_tapped_f(lfsr : in std_logic_vector) return std_logic is + constant tapped_bits_c : std_logic_vector(0 to 15) + -- tapped bits are 0, 2, 15 + := "1010000000000001"; + variable parity_v : std_logic; + begin + parity_v := '0'; + + for idx in lfsr'low to lfsr'high loop + parity_v := parity_v xor (lfsr(idx) and tapped_bits_c(idx)); + end loop; + + return parity_v; + end; + + begin + if res_n_i = '0' then + -- reset LFSR to "0000000000000001" + lfsr_q <= (others => '0'); + lfsr_q(lfsr_q'right) <= '1'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if we_i and r2_i = '0' then + -- write to noise register + -- -> reset LFSR + lfsr_q <= (others => '0'); + lfsr_q(lfsr_q'right) <= '1'; + + elsif shift_rise_edge_s then + + -- shift LFSR left towards MSB + for idx in lfsr_q'right-1 downto lfsr_q'left loop + lfsr_q(idx) <= lfsr_q(idx+1); + end loop; + + -- determine input bit + if fb_q = '0' then + -- "Periodic" Noise + -- -> input to LFSR is output + lfsr_q(lfsr_q'right) <= lfsr_q(lfsr_q'left); + else + -- "White" Noise + -- -> input to LFSR is parity of tapped bits + lfsr_q(lfsr_q'right) <= lfsr_tapped_f(lfsr_q); + end if; + + end if; + + end if; + end if; + end process lfsr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Map output of LFSR to signed value for attenuator. + ----------------------------------------------------------------------------- + freq_s <= to_signed(+1, 2) + when lfsr_q(0) = '1' else + to_signed( 0, 2); + + + ----------------------------------------------------------------------------- + -- The attenuator itself + ----------------------------------------------------------------------------- + attenuator_b : entity work.sn76489_attenuator + port map ( + attenuation_i => a_q, + factor_i => freq_s, + product_o => noise_o + ); + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_tone.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_tone.vhd new file mode 100644 index 00000000..3658efcc --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_tone.vhd @@ -0,0 +1,188 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_tone.vhd,v 1.5 2006/02/27 20:30:10 arnim Exp $ +-- +-- Tone Generator +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_tone is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + we_i : in boolean; + d_i : in std_logic_vector(0 to 7); + r2_i : in std_logic; + ff_o : out std_logic; + tone_o : out signed(0 to 7) + ); + +end sn76489_tone; + +architecture rtl of sn76489_tone is + + signal f_q : std_logic_vector(0 to 9); + signal a_q : std_logic_vector(0 to 3); + signal freq_cnt_q : unsigned(0 to 9); + signal freq_ff_q : std_logic; + + signal freq_s : signed(0 to 1); + + function all_zero(a : in std_logic_vector) return boolean is + variable result_v : boolean; + begin + result_v := true; + + for idx in a'low to a'high loop + if a(idx) /= '0' then + result_v := false; + end if; + end loop; + + return result_v; + end; + +begin + + ----------------------------------------------------------------------------- + -- Process cpu_regs + -- + -- Purpose: + -- Implements the registers writable by the CPU. + -- + cpu_regs: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + f_q <= (others => '0'); + a_q <= (others => '1'); + + elsif clock_i'event and clock_i = '1' then + if clk_en_i and we_i then + if r2_i = '0' then + -- access to frequency register + if d_i(0) = '0' then + f_q(0 to 5) <= d_i(2 to 7); + else + f_q(6 to 9) <= d_i(4 to 7); + end if; + + else + -- access to attenuator register + -- both access types can write to the attenuator register! + a_q <= d_i(4 to 7); + + end if; + end if; + end if; + end process cpu_regs; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process freq_gen + -- + -- Purpose: + -- Implements the frequency generation components. + -- + freq_gen: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + freq_cnt_q <= (others => '0'); + freq_ff_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if freq_cnt_q = 0 then + -- update counter from frequency register + freq_cnt_q <= unsigned(f_q); + + -- and toggle the frequency flip-flop if enabled + if not all_zero(f_q) then + freq_ff_q <= not freq_ff_q; + else + -- if frequency setting is 0, then keep flip-flop at +1 + freq_ff_q <= '1'; + end if; + + else + -- decrement frequency counter + freq_cnt_q <= freq_cnt_q - 1; + + end if; + end if; + end if; + end process freq_gen; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Map frequency flip-flop to signed value for attenuator. + ----------------------------------------------------------------------------- + freq_s <= to_signed(+1, 2) + when freq_ff_q = '1' else + to_signed(-1, 2); + + + ----------------------------------------------------------------------------- + -- The attenuator itself + ----------------------------------------------------------------------------- + attenuator_b : entity work.sn76489_attenuator + port map ( + attenuation_i => a_q, + factor_i => freq_s, + product_o => tone_o + ); + + + ----------------------------------------------------------------------------- + -- Output mapping + ----------------------------------------------------------------------------- + ff_o <= freq_ff_q; + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_top.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_top.vhd new file mode 100644 index 00000000..c26d0e1a --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/sound/sn76489/sn76489_top.vhd @@ -0,0 +1,200 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_top.vhd,v 1.9 2006/02/27 20:30:10 arnim Exp $ +-- +-- Chip Toplevel +-- +-- References: +-- +-- * TI Data sheet SN76489.pdf +-- ftp://ftp.whtech.com/datasheets%20&%20manuals/SN76489.pdf +-- +-- * John Kortink's article on the SN76489: +-- http://web.inter.nl.net/users/J.Kortink/home/articles/sn76489/ +-- +-- * Maxim's "SN76489 notes" in +-- http://www.smspower.org/maxim/docs/SN76489.txt +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library ieee; +use ieee.numeric_std.all; + +entity sn76489_top is + + generic ( + clock_div_16_g : integer := 1 + ); + port ( + clock_i : in std_logic; + clock_en_i : in std_logic; + res_n_i : in std_logic; + ce_n_i : in std_logic; + we_n_i : in std_logic; + ready_o : out std_logic; + d_i : in std_logic_vector(0 to 7); + aout_o : out signed(0 to 7) + ); + +end sn76489_top; + +architecture struct of sn76489_top is + + signal clk_en_s : boolean; + + signal tone1_we_s, + tone2_we_s, + tone3_we_s, + noise_we_s : boolean; + signal r2_s : std_logic; + + signal tone1_s, + tone2_s, + tone3_s, + noise_s : signed(0 to 7); + + signal tone3_ff_s : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Clock Divider + ----------------------------------------------------------------------------- + clock_div_b : entity work.sn76489_clock_div + generic map ( + clock_div_16_g => clock_div_16_g + ) + port map ( + clock_i => clock_i, + clock_en_i => clock_en_i, + res_n_i => res_n_i, + clk_en_o => clk_en_s + ); + + + ----------------------------------------------------------------------------- + -- Latch Control = CPU Interface + ----------------------------------------------------------------------------- + latch_ctrl_b : entity work.sn76489_latch_ctrl + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + ce_n_i => ce_n_i, + we_n_i => we_n_i, + d_i => d_i, + ready_o => ready_o, + tone1_we_o => tone1_we_s, + tone2_we_o => tone2_we_s, + tone3_we_o => tone3_we_s, + noise_we_o => noise_we_s, + r2_o => r2_s + ); + + + ----------------------------------------------------------------------------- + -- Tone Channel 1 + ----------------------------------------------------------------------------- + tone1_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone1_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => open, + tone_o => tone1_s + ); + + ----------------------------------------------------------------------------- + -- Tone Channel 2 + ----------------------------------------------------------------------------- + tone2_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone2_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => open, + tone_o => tone2_s + ); + + ----------------------------------------------------------------------------- + -- Tone Channel 3 + ----------------------------------------------------------------------------- + tone3_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone3_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => tone3_ff_s, + tone_o => tone3_s + ); + + ----------------------------------------------------------------------------- + -- Noise Channel + ----------------------------------------------------------------------------- + noise_b : entity work.sn76489_noise + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => noise_we_s, + d_i => d_i, + r2_i => r2_s, + tone3_ff_i => tone3_ff_s, + noise_o => noise_s + ); + + + aout_o <= tone1_s + tone2_s + tone3_s + noise_s; + +end struct; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/spram.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/spram.vhd new file mode 100644 index 00000000..fa4a1fd7 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/spram.vhd @@ -0,0 +1,84 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY spram IS + GENERIC + ( + widthad_a : natural; + width_a : natural := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + data : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + COMPONENT altsyncram + GENERIC ( + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + power_up_uninitialized : STRING; + read_during_write_mode_port_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + wren_a : IN STD_LOGIC ; + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + wren_a => wren, + clock0 => clock, + address_a => address, + data_a => data, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ttl_175.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ttl_175.vhd new file mode 100644 index 00000000..b6459332 --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ttl_175.vhd @@ -0,0 +1,129 @@ +------------------------------------------------------------------------------- +-- +-- TTL 74175 - Quad D-Type Flip-Flops with Clear +-- +-- $Id: ttl_175.vhd,v 1.5 2005/10/10 21:59:13 arnim Exp $ +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ttl_175 is + + port ( + ck_i : in std_logic; + ck_en_i : in std_logic; + por_n_i : in std_logic; + cl_n_i : in std_logic; + d_i : in std_logic_vector(4 downto 1); + q_o : out std_logic_vector(4 downto 1); + q_n_o : out std_logic_vector(4 downto 1); + d_o : out std_logic_vector(4 downto 1); + d_n_o : out std_logic_vector(4 downto 1) + ); + +end ttl_175; + + +architecture rtl of ttl_175 is + + signal flops_q, + flops_s : std_logic_vector(4 downto 1); + +begin + + ----------------------------------------------------------------------------- + -- Process flops + -- + -- Purpose: + -- Implement the sequential elements. + -- + -- Note: We assume that the sequential elements power-up to the same state + -- as forced into by cl_n_i. + -- + flops: process (ck_i, por_n_i) + begin + if por_n_i = '0' then + flops_q <= (others => '0'); + elsif ck_i'event and ck_i = '1' then + flops_q <= flops_s; + end if; + end process flops; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements the combinational logic. + -- + comb: process (flops_q, + cl_n_i, + d_i, + ck_en_i) + begin + -- default assignments + flops_s <= flops_q; + + if cl_n_i = '1' then + if ck_en_i = '1' then + flops_s <= d_i; + end if; + + else + -- pseudo-asynchronous clear + flops_s <= (others => '0'); + end if; + end process comb; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + q_o <= flops_q; + q_n_o <= not flops_q; + d_o <= flops_s; + d_n_o <= not flops_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ttl_393.vhd b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ttl_393.vhd new file mode 100644 index 00000000..3ef25d4b --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/ttl_393.vhd @@ -0,0 +1,152 @@ +------------------------------------------------------------------------------- +-- +-- TTL 74LS393 - Dual 4-Bit Binary Counter +-- +-- $Id: ttl_393.vhd,v 1.3 2005/10/10 21:59:13 arnim Exp $ +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ttl_393 is + + port ( + ck_i : in std_logic; + ck_en_i : in std_logic_vector(2 downto 1); + por_n_i : in std_logic; + cl_i : in std_logic_vector(2 downto 1); + qa_o : out std_logic_vector(2 downto 1); + qb_o : out std_logic_vector(2 downto 1); + qc_o : out std_logic_vector(2 downto 1); + qd_o : out std_logic_vector(2 downto 1); + da_o : out std_logic_vector(2 downto 1); + db_o : out std_logic_vector(2 downto 1); + dc_o : out std_logic_vector(2 downto 1); + dd_o : out std_logic_vector(2 downto 1) + ); + +end ttl_393; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ttl_393 is + + type cnt_q_t is array (natural range 2 downto 1) of unsigned(3 downto 0); + type cnt_d_t is array (natural range 2 downto 1) of unsigned(4 downto 0); + signal cnt_q : cnt_q_t; + signal cnt_s : cnt_d_t; + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the flip-flops. + -- + -- Note: We assume that the sequential elements power-up to the same state + -- as forced into by cl_i. + -- + seq: process (ck_i, por_n_i) + begin + if por_n_i = '0' then + cnt_q(1) <= (others => '0'); + cnt_q(2) <= (others => '0'); + elsif ck_i'event and ck_i = '1' then + cnt_q(1) <= cnt_s(1)(3 downto 0); + cnt_q(2) <= cnt_s(2)(3 downto 0); + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process adder + -- + -- Purpose: + -- Implements the adder. + -- + adder: process (ck_en_i, + cl_i, + cnt_q) + begin + for idx in 2 downto 1 loop + cnt_s(idx) <= '0' & cnt_q(idx); + + if cl_i(idx) = '0' then + if ck_en_i(idx) = '1' then + -- increment upon enable + cnt_s(idx) <= ('0' & cnt_q(idx)) + 1; + end if; + + else + -- pseudo-asynchronous clear + cnt_s(idx) <= (others => '0'); + end if; + end loop; + end process adder; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + qa_o(1) <= cnt_q(1)(0); + qb_o(1) <= cnt_q(1)(1); + qc_o(1) <= cnt_q(1)(2); + qd_o(1) <= cnt_q(1)(3); + qa_o(2) <= cnt_q(2)(0); + qb_o(2) <= cnt_q(2)(1); + qc_o(2) <= cnt_q(2)(2); + qd_o(2) <= cnt_q(2)(3); + da_o(1) <= cnt_s(1)(0); + db_o(1) <= cnt_s(1)(1); + dc_o(1) <= cnt_s(1)(2); + dd_o(1) <= cnt_s(1)(3); + da_o(2) <= cnt_s(2)(0); + db_o(2) <= cnt_s(2)(1); + dc_o(2) <= cnt_s(2)(2); + dd_o(2) <= cnt_s(2)(3); + +end rtl; diff --git a/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/video_mixer.sv b/Arcade/Ladybug Hardware/CosmicAvenger_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Ladybug Hardware/CosmicAvenger_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/Arcade/Ladybug Hardware/Dorodon_MiST/Dorodon.qpf b/Arcade/Ladybug Hardware/Dorodon_MiST/Dorodon.qpf new file mode 100644 index 00000000..d654a810 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/Dorodon.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Dorodon" diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/Dorodon.qsf b/Arcade/Ladybug Hardware/Dorodon_MiST/Dorodon.qsf new file mode 100644 index 00000000..99c8897e --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/Dorodon.qsf @@ -0,0 +1,206 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 10:02:22 November 16, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Dorodon_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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 QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_top.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_tone.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_noise.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_latch_ctrl.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_clock_div.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_attenuator.vhd +set_global_assignment -name VHDL_FILE rtl/sound/ladybug_sound_unit.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_sprite_u.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_sprite_l.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_cpu3.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_cpu2.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_cpu1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_char_u.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_char_l.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_decrypt.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_10_3.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_10_2.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_10_1.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80a.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ttl_393.vhd +set_global_assignment -name VHDL_FILE rtl/ttl_175.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_video_unit.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_video_timing.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_sprite_ctrl.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_sprite.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_rgb.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_res.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_rams.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_machine.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_gpio.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_dip_pack.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_cpu_unit.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_counter.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_clk.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_chutes.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_chute.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_char.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_addr_dec.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Dorodon.sv +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# 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 SAVE_DISK_SPACE OFF +set_global_assignment -name TOP_LEVEL_ENTITY Dorodon + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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 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 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_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(CosmicAvenger) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(CosmicAvenger) +# ------------------- +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" +set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/Dorodon.srf b/Arcade/Ladybug Hardware/Dorodon_MiST/Dorodon.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/Dorodon.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/README.txt b/Arcade/Ladybug Hardware/Dorodon_MiST/README.txt new file mode 100644 index 00000000..6c7fb60e --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Dorodon port to MiST by Gehstock +-- 14 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Lady Bug hardware +-- Unknown Author on Papilio Plus board. +--------------------------------------------------------------------------------- +-- +-- +-- Only controls are rotated on VGA output. +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + + +ToDo : Sound diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/Release/Dorodon.rbf b/Arcade/Ladybug Hardware/Dorodon_MiST/Release/Dorodon.rbf new file mode 100644 index 00000000..76f2ff7f Binary files /dev/null and b/Arcade/Ladybug Hardware/Dorodon_MiST/Release/Dorodon.rbf differ diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/clean.bat b/Arcade/Ladybug Hardware/Dorodon_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_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/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/Dorodon.sv b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/Dorodon.sv new file mode 100644 index 00000000..53dc7473 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/Dorodon.sv @@ -0,0 +1,194 @@ +//============================================================================ +// Arcade: Dorodon +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Dorodon +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Dorodon;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire signed[7:0] audio_s; +reg [6:0] audio; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(440), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_vid), + .ce_pix_actual(ce_vid), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn ? {r} : "0"), + .G(blankn ? {g&g} : "00"), + .B(blankn ? {b} : "0"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +wire m_bomb = kbjoy[8]; +wire blankn = ~(hblank | vblank); + + + +//condition ? if true : if false +ladybugt ladybugt +( + .CLK_IN(clk_sys), + .I_RESET(status[0] | status[6] | buttons[1]), + .O_PIXCE(ce_vid), + + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_VSYNC(vs), + .O_HSYNC(hs), + .O_VBLANK(vblank), + .O_HBLANK(hblank), + + .O_AUDIO(audio_s), + + .but_coin_s(~{1'b0,m_coin}), + .but_fire_s(~{1'b0,m_fire}), + .but_bomb_s(~{1'b0,m_bomb}), + .but_tilt_s(~{1'b0,1'b0}), + .but_select_s(~{m_start2,m_start1}), + .but_up_s(~{1'b0,m_up}), + .but_down_s(~{1'b0,m_down}), + .but_left_s(~{1'b0,m_left}), + .but_right_s(~{1'b0,m_right}) +); + +assign audio = audio_s; + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/prom_10_1.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/prom_10_1.vhd new file mode 100644 index 00000000..dc8bb30e --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/prom_10_1.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_10_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_10_1 is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"94",X"83",X"A7",X"00",X"F3",X"FC",X"F4",X"00",X"D5",X"E3",X"28",X"00",X"67",X"D3",X"15", + X"00",X"3F",X"CF",X"7F",X"00",X"F7",X"FA",X"F8",X"00",X"F1",X"F8",X"FA",X"00",X"F8",X"F3",X"F2"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/prom_10_2.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/prom_10_2.vhd new file mode 100644 index 00000000..35c1596b --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/prom_10_2.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_10_2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_10_2 is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"FF",X"BB",X"4E",X"21",X"9E",X"DB",X"DE",X"1E",X"9E",X"4F",X"DE",X"10",X"00",X"FF",X"90",X"FF", + X"21",X"21",X"21",X"21",X"90",X"00",X"00",X"00",X"90",X"DE",X"9E",X"00",X"DE",X"BB",X"1E",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/prom_10_3.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/prom_10_3.vhd new file mode 100644 index 00000000..a731ff5c --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/prom_10_3.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_10_3 is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_10_3 is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"3A",X"3A",X"3A",X"3A",X"28",X"28",X"38",X"38", + X"08",X"08",X"38",X"38",X"20",X"20",X"38",X"38",X"20",X"20",X"38",X"38",X"3E",X"3E",X"3E",X"3E"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/prom_decrypt.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/prom_decrypt.vhd new file mode 100644 index 00000000..43b4ae55 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/prom_decrypt.vhd @@ -0,0 +1,63 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity prom_decrypt is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(7 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of prom_decrypt is + + + type ROM_ARRAY is array(0 to 255) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"F1",x"3F",x"86",x"4F",x"66",x"07",x"73", -- 0x0000 + x"71",x"64",x"A7",x"59",x"2B",x"56",x"FB",x"8B", -- 0x0008 + x"8F",x"B6",x"9E",x"9D",x"04",x"11",x"BC",x"80", -- 0x0010 + x"12",x"CB",x"18",x"5D",x"D2",x"7A",x"85",x"75", -- 0x0018 + x"B5",x"BE",x"7E",x"05",x"6E",x"3E",x"D5",x"4B", -- 0x0020 + x"2E",x"52",x"15",x"84",x"38",x"6A",x"6C",x"53", -- 0x0028 + x"FA",x"C8",x"08",x"B8",x"D4",x"E9",x"5C",x"22", -- 0x0030 + x"1D",x"49",x"BD",x"AD",x"46",x"1F",x"E1",x"0A", -- 0x0038 + x"19",x"5B",x"41",x"45",x"4A",x"2A",x"B4",x"4D", -- 0x0040 + x"57",x"90",x"8E",x"3A",x"BB",x"9B",x"E4",x"29", -- 0x0048 + x"8A",x"EB",x"AA",x"F0",x"CE",x"EE",x"88",x"5F", -- 0x0050 + x"33",x"31",x"C6",x"60",x"3C",x"9A",x"3D",x"B7", -- 0x0058 + x"63",x"6D",x"AB",x"62",x"E3",x"78",x"E5",x"B9", -- 0x0060 + x"EF",x"5E",x"7B",x"83",x"94",x"E6",x"D6",x"A1", -- 0x0068 + x"D9",x"36",x"47",x"3B",x"C4",x"DF",x"21",x"0C", -- 0x0070 + x"14",x"E7",x"C3",x"1A",x"1C",x"28",x"4C",x"9C", -- 0x0078 + x"50",x"40",x"91",x"55",x"D8",x"A4",x"76",x"9F", -- 0x0080 + x"98",x"10",x"6B",x"2F",x"A3",x"43",x"39",x"B1", -- 0x0088 + x"42",x"72",x"7D",x"65",x"03",x"8D",x"F2",x"F5", -- 0x0090 + x"69",x"27",x"0D",x"CA",x"CF",x"1B",x"35",x"EC", -- 0x0098 + x"A2",x"F7",x"93",x"70",x"CD",x"68",x"97",x"2D", -- 0x00A0 + x"37",x"F9",x"AE",x"26",x"96",x"E8",x"48",x"99", -- 0x00A8 + x"95",x"D7",x"B0",x"06",x"DC",x"C9",x"ED",x"87", -- 0x00B0 + x"7F",x"B3",x"17",x"A0",x"0F",x"25",x"DB",x"DE", -- 0x00B8 + x"23",x"74",x"79",x"89",x"B2",x"FC",x"24",x"13", -- 0x00C0 + x"81",x"8C",x"D3",x"C5",x"BF",x"A6",x"16",x"44", -- 0x00C8 + x"0B",x"34",x"F8",x"D1",x"0E",x"E0",x"09",x"EA", -- 0x00D0 + x"02",x"DD",x"92",x"F4",x"C1",x"BA",x"32",x"D0", -- 0x00D8 + x"7C",x"2C",x"FD",x"F3",x"61",x"A5",x"CC",x"DA", -- 0x00E0 + x"5A",x"67",x"30",x"6F",x"82",x"20",x"AF",x"54", -- 0x00E8 + x"AC",x"E2",x"1E",x"C2",x"FE",x"A9",x"58",x"01", -- 0x00F0 + x"77",x"C0",x"4E",x"C7",x"A8",x"51",x"F6",x"FF" -- 0x00F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; + + diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_char_l.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_char_l.vhd new file mode 100644 index 00000000..105ec742 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_char_l.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_char_l is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_char_l is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"38",X"7C",X"86",X"82",X"C2",X"7C",X"38",X"00",X"00",X"02",X"42",X"FE",X"FE",X"02",X"02", + X"00",X"46",X"CE",X"9E",X"9A",X"BA",X"F2",X"62",X"00",X"04",X"86",X"92",X"B2",X"F2",X"DE",X"8C", + X"00",X"18",X"38",X"68",X"C8",X"FE",X"FE",X"08",X"00",X"E4",X"E6",X"A2",X"A2",X"A2",X"BE",X"1C", + X"00",X"3C",X"7E",X"D2",X"92",X"92",X"9E",X"0C",X"00",X"C0",X"C0",X"8E",X"9E",X"B0",X"E0",X"C0", + X"00",X"6C",X"F2",X"B2",X"9A",X"9A",X"6E",X"0C",X"00",X"60",X"F2",X"92",X"92",X"96",X"FC",X"78", + X"00",X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00",X"FE",X"FE",X"92",X"92",X"92",X"FE",X"6C", + X"00",X"38",X"7C",X"C6",X"82",X"82",X"C6",X"44",X"00",X"FE",X"FE",X"82",X"82",X"C6",X"7C",X"38", + X"00",X"00",X"FE",X"FE",X"92",X"92",X"92",X"82",X"00",X"FE",X"FE",X"90",X"90",X"90",X"90",X"80", + X"00",X"38",X"7C",X"C6",X"82",X"92",X"9E",X"9E",X"00",X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE", + X"00",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"04",X"06",X"02",X"02",X"02",X"FE",X"FC", + X"00",X"FE",X"FE",X"18",X"3C",X"6E",X"C6",X"82",X"00",X"00",X"FE",X"FE",X"02",X"02",X"02",X"02", + X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00",X"FE",X"FE",X"70",X"38",X"1C",X"FE",X"FE", + X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00",X"FE",X"FE",X"88",X"88",X"88",X"F8",X"70", + X"00",X"7C",X"FE",X"82",X"8A",X"8E",X"FC",X"7A",X"00",X"FE",X"FE",X"88",X"8C",X"9E",X"F6",X"72", + X"00",X"64",X"F6",X"92",X"92",X"D2",X"5E",X"0C",X"00",X"00",X"80",X"80",X"FE",X"FE",X"80",X"80", + X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00",X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0", + X"00",X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00",X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6", + X"00",X"00",X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"86",X"8E",X"9E",X"BA",X"F2",X"E2",X"C2", + X"00",X"00",X"6C",X"92",X"92",X"6A",X"04",X"0A",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"4E",X"CA",X"8E",X"82",X"C6",X"FE",X"7C",X"00",X"60",X"E0",X"80",X"9A",X"BA",X"E0",X"60", + X"00",X"00",X"02",X"78",X"F0",X"E0",X"00",X"00",X"00",X"60",X"F0",X"F8",X"7C",X"F8",X"F0",X"60", + X"00",X"00",X"0C",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"7E",X"48",X"48",X"36",X"00",X"7C",X"02", + X"02",X"02",X"7C",X"00",X"7E",X"52",X"52",X"2C",X"00",X"00",X"00",X"00",X"06",X"06",X"00",X"00", + X"00",X"00",X"00",X"00",X"0C",X"0E",X"00",X"00",X"3C",X"42",X"99",X"A5",X"A5",X"95",X"42",X"3C", + X"FF",X"FF",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"E0",X"E0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00", + X"00",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"DF",X"DF",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"DF",X"DF",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"C0",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"E0",X"70",X"38",X"1C",X"0E",X"07",X"03", + X"E0",X"E0",X"F0",X"38",X"1C",X"0E",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"07",X"0E",X"1C",X"38",X"70", + X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0E",X"1C",X"38",X"F0", + X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"1F",X"38",X"30",X"37", + X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF",X"00",X"00",X"00",X"E0",X"F0",X"38",X"18",X"D8", + X"37",X"37",X"30",X"38",X"1F",X"0F",X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"00",X"FF",X"00",X"00",X"FF",X"FF",X"00",X"00",X"58",X"D8",X"18",X"38",X"F0",X"E0",X"00",X"00", + X"58",X"58",X"58",X"58",X"58",X"58",X"58",X"58",X"37",X"34",X"34",X"34",X"34",X"34",X"34",X"34", + X"34",X"34",X"34",X"34",X"34",X"34",X"34",X"34",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"22",X"14",X"08",X"14",X"22",X"00",X"00",X"7E",X"52",X"52",X"52",X"00",X"7E",X"30", + X"18",X"0C",X"7E",X"00",X"7E",X"42",X"66",X"3C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"78",X"F8",X"F8",X"F0",X"84",X"50",X"00",X"00", + X"72",X"F0",X"F4",X"E8",X"70",X"00",X"80",X"00",X"78",X"F8",X"F8",X"F0",X"84",X"50",X"00",X"00", + X"72",X"F0",X"F4",X"E0",X"70",X"00",X"80",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"76",X"F6",X"C0",X"80",X"00",X"00",X"00",X"00",X"E2",X"8F",X"F9",X"F3",X"FE",X"1C",X"3C",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"27",X"0F",X"0F",X"0B",X"04",X"02",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"1C",X"1C",X"1F",X"0F",X"07",X"00",X"00",X"00",X"1C",X"1C",X"1F",X"0F",X"07",X"00",X"00",X"00", + X"01",X"1F",X"07",X"00",X"01",X"00",X"00",X"00",X"01",X"1F",X"07",X"00",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"0B",X"17",X"07",X"00",X"00",X"00",X"00",X"07",X"0B",X"17",X"07", + X"00",X"00",X"00",X"00",X"07",X"0B",X"17",X"07",X"C0",X"C0",X"00",X"00",X"07",X"0B",X"17",X"07", + X"0F",X"17",X"07",X"17",X"03",X"08",X"00",X"00",X"00",X"00",X"00",X"05",X"10",X"07",X"0F",X"0F", + X"00",X"00",X"00",X"08",X"E0",X"F4",X"F0",X"F4",X"C0",X"C0",X"00",X"05",X"10",X"07",X"0F",X"0F", + X"27",X"0F",X"0F",X"0B",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"0B",X"17",X"07", + X"00",X"00",X"80",X"20",X"10",X"E8",X"F8",X"F8",X"C0",X"C0",X"00",X"00",X"07",X"0B",X"17",X"07", + X"0F",X"17",X"07",X"17",X"03",X"08",X"00",X"00",X"00",X"00",X"00",X"05",X"10",X"07",X"0F",X"0F", + X"00",X"00",X"00",X"08",X"E0",X"F4",X"F0",X"F4",X"C0",X"C0",X"00",X"05",X"10",X"07",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E", + X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E",X"C0",X"C0",X"00",X"00",X"00",X"07",X"0F",X"1E", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"C0",X"C0",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"80",X"20",X"10",X"E8",X"F8",X"F8",X"00",X"00",X"80",X"20",X"10",X"E8",X"F8",X"F8", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"78",X"3E",X"EE",X"F3",X"00",X"00",X"00",X"00",X"78",X"3E",X"EE",X"F3", + X"FF",X"00",X"0E",X"1F",X"3F",X"77",X"67",X"7F",X"7F",X"7F",X"67",X"77",X"3F",X"1F",X"0E",X"00", + X"FF",X"07",X"07",X"87",X"D7",X"F7",X"F7",X"C7",X"C7",X"C7",X"F7",X"F7",X"D7",X"87",X"07",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"80",X"E0", + X"FC",X"FF",X"FF",X"7F",X"3F",X"1F",X"FF",X"FF",X"FB",X"FB",X"EA",X"EA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"A8",X"A8",X"A0",X"A0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"90",X"E0",X"F2",X"FA",X"FC",X"FE",X"FE", + X"F8",X"FC",X"F6",X"FA",X"7C",X"76",X"7A",X"2A",X"2C",X"34",X"16",X"1A",X"1A",X"0A",X"0C",X"0C", + X"04",X"06",X"06",X"02",X"02",X"02",X"02",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"22",X"7E",X"02",X"00",X"3C",X"42",X"3C",X"00",X"22",X"7E",X"02",X"00",X"72",X"52",X"4C", + X"00",X"26",X"4A",X"32",X"00",X"3C",X"42",X"3C",X"00",X"26",X"4A",X"32",X"00",X"72",X"52",X"4C", + X"00",X"44",X"52",X"6C",X"00",X"3C",X"42",X"3C",X"00",X"44",X"52",X"6C",X"00",X"72",X"52",X"4C", + X"00",X"1C",X"24",X"7E",X"00",X"3C",X"42",X"3C",X"00",X"1C",X"24",X"7E",X"00",X"72",X"52",X"4C", + X"00",X"72",X"52",X"4C",X"00",X"3C",X"42",X"3C",X"00",X"72",X"52",X"4C",X"00",X"72",X"52",X"4C", + X"00",X"3C",X"52",X"5C",X"00",X"3C",X"42",X"3C",X"00",X"3C",X"52",X"5C",X"00",X"72",X"52",X"4C", + X"00",X"60",X"4E",X"70",X"00",X"3C",X"42",X"3C",X"00",X"60",X"4E",X"70",X"00",X"72",X"52",X"4C", + X"00",X"2C",X"52",X"2C",X"00",X"3C",X"42",X"3C",X"00",X"2C",X"52",X"2C",X"00",X"72",X"52",X"4C", + X"00",X"32",X"4A",X"3C",X"00",X"3C",X"42",X"3C",X"00",X"32",X"4A",X"3C",X"00",X"72",X"52",X"4C", + X"00",X"3C",X"42",X"3C",X"00",X"3C",X"42",X"3C",X"00",X"3C",X"42",X"3C",X"00",X"3C",X"42",X"3C", + X"00",X"0A",X"04",X"0A",X"00",X"26",X"4A",X"32",X"00",X"0A",X"04",X"0A",X"00",X"44",X"52",X"6C", + X"00",X"0A",X"04",X"0A",X"00",X"1C",X"24",X"7E",X"00",X"0A",X"04",X"0A",X"00",X"72",X"52",X"4C", + X"00",X"0A",X"04",X"0A",X"00",X"3C",X"52",X"5C",X"00",X"0A",X"04",X"0A",X"00",X"60",X"4E",X"70", + X"00",X"0A",X"04",X"0A",X"00",X"2C",X"52",X"2C",X"00",X"00",X"00",X"C0",X"40",X"40",X"00",X"00", + X"00",X"00",X"40",X"40",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"FF",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"FF",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E", + X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E", + X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"07",X"07",X"07",X"03", + X"7F",X"FF",X"FF",X"FF",X"FF",X"FC",X"F0",X"C0",X"FC",X"FC",X"F0",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"1F", + X"0F",X"03",X"07",X"1F",X"7E",X"FC",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF",X"3E",X"3C",X"30",X"40", + X"00",X"06",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"F0",X"FF",X"1F",X"03",X"00", + X"00",X"00",X"04",X"3F",X"FF",X"FF",X"FF",X"7F",X"00",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"01",X"00",X"00", + X"1F",X"7F",X"FF",X"FF",X"FF",X"F8",X"00",X"00",X"FF",X"FE",X"F8",X"E0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"00",X"00",X"00",X"00",X"1C",X"7E",X"FF",X"FF", + X"1F",X"1F",X"0F",X"07",X"01",X"00",X"00",X"00",X"E0",X"C0",X"80",X"80",X"00",X"01",X"01",X"03", + X"00",X"01",X"0F",X"3F",X"FF",X"FF",X"FF",X"FF",X"3F",X"FF",X"FF",X"FF",X"FE",X"F8",X"E0",X"00", + X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"FC",X"FC",X"FC",X"FE",X"7E",X"7F",X"3F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"03",X"07",X"0F",X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0", + X"20",X"70",X"F8",X"FC",X"FE",X"FF",X"FE",X"FC",X"1F",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"3F",X"3F",X"3F",X"7F",X"7F",X"7F",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"1F",X"FF",X"7F",X"00",X"00",X"00",X"0F",X"FF",X"FF",X"FF",X"FF", + X"00",X"07",X"FF",X"FF",X"FF",X"FF",X"FF",X"FC",X"7C",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"00",X"01",X"01",X"03",X"00",X"00",X"0F",X"3F",X"7F",X"FF",X"FF",X"FF",X"78",X"00", + X"FC",X"F8",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3E",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"FE",X"FE",X"7F",X"7F",X"7E",X"3C",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"3F",X"3F",X"7F",X"7F",X"7E",X"FE",X"FE",X"FC", + X"FF",X"FF",X"FF",X"FF",X"1F",X"07",X"01",X"00",X"F0",X"F8",X"FE",X"FE",X"FF",X"FF",X"FF",X"7F", + X"7F",X"7F",X"7F",X"FF",X"FE",X"FC",X"FC",X"FC",X"E0",X"F0",X"F8",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"1F",X"1F",X"1F",X"00",X"00",X"00",X"00",X"00",X"80",X"F8",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"01",X"0F",X"7F", + X"00",X"00",X"00",X"01",X"01",X"80",X"80",X"C0",X"00",X"01",X"1F",X"FF",X"FF",X"7F",X"3F",X"0F", + X"3F",X"FF",X"FF",X"FF",X"FF",X"FE",X"F0",X"80",X"FF",X"FF",X"FE",X"F8",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"07", + X"00",X"00",X"00",X"00",X"00",X"1C",X"FE",X"FF",X"38",X"30",X"00",X"00",X"00",X"00",X"01",X"00", + X"00",X"00",X"00",X"07",X"3F",X"FF",X"FF",X"FF",X"07",X"1F",X"7F",X"FF",X"FF",X"FF",X"FE",X"FC", + X"F8",X"F0",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"3F",X"7F",X"7E",X"7E",X"7E",X"7E",X"7F",X"3E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"0F",X"01",X"00",X"00",X"01",X"01",X"03", + X"FF",X"FF",X"FE",X"FE",X"FE",X"FC",X"FC",X"F8",X"03",X"07",X"0F",X"0F",X"1F",X"1F",X"3F",X"3F", + X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"8F",X"00",X"00",X"F0",X"FC",X"FC",X"FE",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"30",X"3E",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"3F",X"7F",X"3F",X"00",X"00",X"00",X"0F",X"FF",X"FF",X"FF",X"FF", + X"00",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"F8",X"7C",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00", + X"07",X"1F",X"7F",X"7F",X"FF",X"FF",X"78",X"00",X"FC",X"F8",X"F0",X"E0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1E",X"0C",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FE",X"FE",X"7F",X"7F",X"7C",X"38",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"3F",X"3F",X"3F",X"7F",X"7E",X"FE",X"FE",X"FC",X"FF",X"FF",X"FF",X"FF",X"1F",X"07",X"01",X"00", + X"F0",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF",X"3F",X"7F",X"FF",X"FE",X"FE",X"7C",X"38",X"00",X"00", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"0F",X"1F",X"3F",X"3F", + X"FC",X"F8",X"F8",X"F0",X"E0",X"E0",X"C0",X"80",X"7F",X"3F",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"3F",X"00",X"00",X"00",X"00",X"01",X"FE",X"FF",X"FF",X"7F",X"7F",X"FF",X"FE",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"01",X"00",X"00",X"00",X"40",X"F0",X"FF", + X"FE",X"F0",X"00",X"00",X"00",X"01",X"0F",X"FF",X"00",X"00",X"00",X"00",X"00",X"F8",X"FC",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"03",X"07",X"1F",X"3F",X"7F",X"FF",X"7F",X"FF",X"FF",X"FE",X"FC",X"F0",X"E0",X"80", + X"3F",X"1F",X"1F",X"0F",X"03",X"00",X"00",X"00",X"E0",X"E0",X"C0",X"C0",X"C0",X"C1",X"01",X"00", + X"3F",X"7F",X"7F",X"FF",X"FF",X"FC",X"F0",X"00",X"FC",X"F8",X"F0",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"3F",X"07",X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F", + X"FE",X"FC",X"F8",X"E0",X"C0",X"80",X"80",X"C0",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0F", + X"07",X"07",X"0F",X"3F",X"7F",X"FF",X"FF",X"FE",X"F8",X"F8",X"F0",X"E0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"01",X"03",X"00",X"00",X"00",X"40",X"F8",X"FF", + X"FF",X"F8",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"01",X"01",X"03", + X"3F",X"7F",X"7E",X"FE",X"FE",X"FE",X"FC",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"07",X"1F",X"3F",X"7F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FC",X"F8",X"E0", + X"FE",X"FF",X"FF",X"FF",X"7F",X"7F",X"3F",X"3F",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0",X"E0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"1F",X"00",X"00",X"00",X"00",X"E0",X"F8",X"FC",X"FE", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"B8",X"80",X"00",X"00",X"00", + X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FE",X"FF",X"FF",X"FF",X"EF",X"C7",X"87",X"0E",X"7F",X"FF",X"FC",X"FC",X"F8",X"F0",X"C0", + X"00",X"00",X"80",X"E0",X"00",X"00",X"00",X"00",X"E0",X"E0",X"E1",X"F3",X"FF",X"FF",X"FF",X"FF", + X"00",X"E0",X"F0",X"F8",X"FC",X"FC",X"FC",X"FC",X"7E",X"3C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"E0",X"E0", + X"07",X"07",X"03",X"01",X"01",X"00",X"00",X"00",X"F0",X"F8",X"F8",X"FC",X"FC",X"FE",X"FE",X"7E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"08",X"00",X"01",X"03",X"00",X"00",X"00", + X"0F",X"3F",X"FF",X"FF",X"FF",X"7E",X"00",X"00",X"FE",X"FE",X"FF",X"FF",X"BF",X"1F",X"1F",X"0F", + X"00",X"00",X"00",X"80",X"80",X"C0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1E",X"1C",X"80",X"80",X"80",X"C0",X"C0",X"80",X"01",X"03", + X"00",X"00",X"18",X"3F",X"7F",X"FF",X"FF",X"FE",X"3F",X"1F",X"07",X"C1",X"80",X"80",X"00",X"00", + X"F8",X"FE",X"FF",X"FF",X"FF",X"3E",X"1C",X"00",X"07",X"0F",X"1F",X"1F",X"1F",X"3F",X"3F",X"3F", + X"E0",X"F0",X"F0",X"E0",X"C0",X"80",X"80",X"00",X"7F",X"7F",X"7F",X"3F",X"0F",X"07",X"01",X"00", + X"80",X"E0",X"F0",X"FC",X"FE",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"F0", + X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"07",X"20",X"60",X"60",X"E0",X"E0",X"E0",X"E0",X"E0", + X"00",X"00",X"00",X"C0",X"E0",X"F8",X"FC",X"FF",X"FF",X"3F",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"0F",X"0F",X"07",X"03",X"00",X"00",X"00",X"E3",X"FF",X"FF",X"FF",X"FF", + X"3F",X"7F",X"FF",X"FE",X"FE",X"FC",X"F8",X"F0",X"FC",X"FC",X"FC",X"FC",X"FE",X"78",X"60",X"00", + X"07",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"F0",X"F8",X"F8",X"FC",X"FE",X"FE",X"7F",X"7F", + X"1F",X"3F",X"3F",X"7F",X"7F",X"7E",X"FE",X"FC",X"FE",X"FE",X"FF",X"3F",X"3F",X"1F",X"0F",X"0F", + X"00",X"00",X"00",X"80",X"80",X"C0",X"E0",X"E0",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"1F", + X"00",X"00",X"E0",X"E0",X"F0",X"F8",X"F8",X"FC",X"3F",X"07",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"07",X"07",X"03",X"01",X"00",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"F9",X"B8",X"B0",X"90",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"3E",X"00",X"00",X"00",X"00",X"00",X"FC",X"E0",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"3F",X"3F",X"1F",X"0F",X"03",X"01",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3C", + X"FF",X"FF",X"DF",X"DF",X"9F",X"9F",X"1F",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"F8", + X"38",X"00",X"C0",X"C0",X"80",X"00",X"00",X"00",X"0F",X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F", + X"FF",X"FF",X"FF",X"FB",X"FB",X"F9",X"FD",X"FC",X"F8",X"F0",X"F0",X"F0",X"E0",X"E0",X"E0",X"80", + X"3F",X"1F",X"1F",X"0F",X"07",X"03",X"01",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F", + X"F1",X"F9",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"F7",X"F7",X"F3",X"F1",X"3F",X"1C",X"00",X"01",X"07",X"0F",X"0F",X"1F", + X"FF",X"FF",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"1F",X"9F",X"8F",X"CF",X"CF",X"EF",X"FF",X"FF", + X"FE",X"FC",X"FC",X"F9",X"FF",X"FF",X"FF",X"FF",X"0F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"00",X"00",X"03",X"01",X"03",X"07",X"07",X"0F",X"00",X"FE",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF", + X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"FF",X"DF",X"DF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E0",X"E0",X"F0",X"F4",X"F4",X"FE",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"07",X"0F",X"0F",X"1F",X"3F",X"3F",X"7F", + X"00",X"00",X"80",X"81",X"83",X"C3",X"C7",X"CF",X"00",X"3F",X"FE",X"F8",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"00",X"00",X"00",X"00",X"07",X"3F",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"C0",X"FC",X"FE",X"FE",X"FE",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_char_u.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_char_u.vhd new file mode 100644 index 00000000..60b0796a --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_char_u.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_char_u is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_char_u is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"38",X"7C",X"86",X"82",X"C2",X"7C",X"38",X"00",X"00",X"02",X"42",X"FE",X"FE",X"02",X"02", + X"00",X"46",X"CE",X"9E",X"9A",X"BA",X"F2",X"62",X"00",X"04",X"86",X"92",X"B2",X"F2",X"DE",X"8C", + X"00",X"18",X"38",X"68",X"C8",X"FE",X"FE",X"08",X"00",X"E4",X"E6",X"A2",X"A2",X"A2",X"BE",X"1C", + X"00",X"3C",X"7E",X"D2",X"92",X"92",X"9E",X"0C",X"00",X"C0",X"C0",X"8E",X"9E",X"B0",X"E0",X"C0", + X"00",X"6C",X"F2",X"B2",X"9A",X"9A",X"6E",X"0C",X"00",X"60",X"F2",X"92",X"92",X"96",X"FC",X"78", + X"00",X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00",X"FE",X"FE",X"92",X"92",X"92",X"FE",X"6C", + X"00",X"38",X"7C",X"C6",X"82",X"82",X"C6",X"44",X"00",X"FE",X"FE",X"82",X"82",X"C6",X"7C",X"38", + X"00",X"00",X"FE",X"FE",X"92",X"92",X"92",X"82",X"00",X"FE",X"FE",X"90",X"90",X"90",X"90",X"80", + X"00",X"38",X"7C",X"C6",X"82",X"92",X"9E",X"9E",X"00",X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE", + X"00",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"04",X"06",X"02",X"02",X"02",X"FE",X"FC", + X"00",X"FE",X"FE",X"18",X"3C",X"6E",X"C6",X"82",X"00",X"00",X"FE",X"FE",X"02",X"02",X"02",X"02", + X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00",X"FE",X"FE",X"70",X"38",X"1C",X"FE",X"FE", + X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00",X"FE",X"FE",X"88",X"88",X"88",X"F8",X"70", + X"00",X"7C",X"FE",X"82",X"8A",X"8E",X"FC",X"7A",X"00",X"FE",X"FE",X"88",X"8C",X"9E",X"F6",X"72", + X"00",X"64",X"F6",X"92",X"92",X"D2",X"5E",X"0C",X"00",X"00",X"80",X"80",X"FE",X"FE",X"80",X"80", + X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00",X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0", + X"00",X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00",X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6", + X"00",X"00",X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"86",X"8E",X"9E",X"BA",X"F2",X"E2",X"C2", + X"00",X"00",X"6C",X"92",X"92",X"6A",X"04",X"0A",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"4E",X"CA",X"8E",X"82",X"C6",X"FE",X"7C",X"00",X"60",X"E0",X"80",X"9A",X"BA",X"E0",X"60", + X"00",X"00",X"02",X"78",X"F0",X"E0",X"00",X"00",X"00",X"60",X"F0",X"F8",X"7C",X"F8",X"F0",X"60", + X"00",X"00",X"0C",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"7E",X"48",X"48",X"36",X"00",X"7C",X"02", + X"02",X"02",X"7C",X"00",X"7E",X"52",X"52",X"2C",X"00",X"00",X"00",X"00",X"06",X"06",X"00",X"00", + X"00",X"00",X"00",X"00",X"0C",X"0E",X"00",X"00",X"3C",X"42",X"99",X"A5",X"A5",X"95",X"42",X"3C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00", + X"C0",X"C0",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00", + X"00",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"1F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"00",X"00",X"00",X"00",X"00",X"00", + X"DF",X"DF",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"70",X"38",X"1C",X"0E",X"07",X"03", + X"C0",X"C0",X"30",X"38",X"1C",X"0E",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"0E",X"1C",X"38",X"70", + X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0E",X"1C",X"38",X"30", + X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"08",X"38",X"20",X"27", + X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"E0",X"20",X"38",X"08",X"C8", + X"27",X"27",X"20",X"38",X"08",X"0F",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00", + X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00",X"48",X"C8",X"08",X"38",X"20",X"E0",X"00",X"00", + X"48",X"48",X"48",X"48",X"48",X"48",X"48",X"48",X"27",X"24",X"24",X"24",X"24",X"24",X"24",X"24", + X"24",X"24",X"24",X"24",X"24",X"24",X"24",X"24",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"22",X"14",X"08",X"14",X"22",X"00",X"00",X"7E",X"52",X"52",X"52",X"00",X"7E",X"30", + X"18",X"0C",X"7E",X"00",X"7E",X"42",X"66",X"3C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"60",X"00",X"00",X"80",X"84",X"50",X"00",X"00", + X"70",X"60",X"00",X"00",X"00",X"00",X"80",X"00",X"18",X"F8",X"F8",X"70",X"00",X"00",X"00",X"00", + X"02",X"90",X"F4",X"E8",X"70",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"76",X"F6",X"C0",X"80",X"00",X"00",X"00",X"00",X"FD",X"F0",X"FE",X"FF",X"FE",X"1C",X"3C",X"00", + X"FF",X"FF",X"FF",X"FF",X"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"01",X"01",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"1C",X"1C",X"1F",X"0F",X"07",X"00",X"00",X"00",X"1C",X"1C",X"1F",X"0F",X"07",X"00",X"00",X"00", + X"01",X"1F",X"47",X"00",X"01",X"00",X"06",X"00",X"01",X"1F",X"47",X"00",X"01",X"00",X"06",X"00", + X"00",X"00",X"00",X"00",X"07",X"0B",X"17",X"04",X"00",X"00",X"00",X"00",X"07",X"0B",X"17",X"04", + X"00",X"00",X"00",X"00",X"07",X"0B",X"17",X"04",X"00",X"00",X"00",X"00",X"07",X"0B",X"17",X"04", + X"0C",X"10",X"00",X"10",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"0F", + X"00",X"00",X"00",X"08",X"00",X"04",X"80",X"84",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"0F", + X"07",X"0E",X"0E",X"0B",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"00",X"00",X"80",X"20",X"10",X"68",X"38",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"03",X"07",X"07",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"E0",X"F0",X"70",X"70",X"00",X"00",X"00",X"05",X"10",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E", + X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E", + X"00",X"00",X"00",X"00",X"04",X"00",X"03",X"18",X"00",X"00",X"00",X"00",X"04",X"00",X"03",X"18", + X"00",X"00",X"00",X"00",X"04",X"00",X"03",X"18",X"00",X"00",X"00",X"00",X"04",X"00",X"03",X"18", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"78",X"3E",X"FE",X"FF",X"00",X"00",X"00",X"00",X"78",X"3E",X"FE",X"FF", + X"FF",X"00",X"0E",X"4C",X"C0",X"81",X"03",X"02",X"02",X"02",X"03",X"81",X"C0",X"4C",X"0E",X"00", + X"FF",X"05",X"05",X"05",X"15",X"35",X"35",X"05",X"05",X"05",X"35",X"35",X"15",X"05",X"05",X"05", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"03",X"03",X"03",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"78",X"48",X"48",X"78",X"00",X"00",X"00",X"00",X"78",X"48",X"48",X"78",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"40",X"C0",X"C0",X"C0",X"C0",X"40",X"40",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"22",X"7E",X"02",X"00",X"3C",X"42",X"3C",X"00",X"22",X"7E",X"02",X"00",X"72",X"52",X"4C", + X"00",X"26",X"4A",X"32",X"00",X"3C",X"42",X"3C",X"00",X"26",X"4A",X"32",X"00",X"72",X"52",X"4C", + X"00",X"44",X"52",X"6C",X"00",X"3C",X"42",X"3C",X"00",X"44",X"52",X"6C",X"00",X"72",X"52",X"4C", + X"00",X"1C",X"24",X"7E",X"00",X"3C",X"42",X"3C",X"00",X"1C",X"24",X"7E",X"00",X"72",X"52",X"4C", + X"00",X"72",X"52",X"4C",X"00",X"3C",X"42",X"3C",X"00",X"72",X"52",X"4C",X"00",X"72",X"52",X"4C", + X"00",X"3C",X"52",X"5C",X"00",X"3C",X"42",X"3C",X"00",X"3C",X"52",X"5C",X"00",X"72",X"52",X"4C", + X"00",X"60",X"4E",X"70",X"00",X"3C",X"42",X"3C",X"00",X"60",X"4E",X"70",X"00",X"72",X"52",X"4C", + X"00",X"2C",X"52",X"2C",X"00",X"3C",X"42",X"3C",X"00",X"2C",X"52",X"2C",X"00",X"72",X"52",X"4C", + X"00",X"32",X"4A",X"3C",X"00",X"3C",X"42",X"3C",X"00",X"32",X"4A",X"3C",X"00",X"72",X"52",X"4C", + X"00",X"3C",X"42",X"3C",X"00",X"3C",X"42",X"3C",X"00",X"3C",X"42",X"3C",X"00",X"3C",X"42",X"3C", + X"00",X"0A",X"04",X"0A",X"00",X"26",X"4A",X"32",X"00",X"0A",X"04",X"0A",X"00",X"44",X"52",X"6C", + X"00",X"0A",X"04",X"0A",X"00",X"1C",X"24",X"7E",X"00",X"0A",X"04",X"0A",X"00",X"72",X"52",X"4C", + X"00",X"0A",X"04",X"0A",X"00",X"3C",X"52",X"5C",X"00",X"0A",X"04",X"0A",X"00",X"60",X"4E",X"70", + X"00",X"0A",X"04",X"0A",X"00",X"2C",X"52",X"2C",X"00",X"78",X"FC",X"3E",X"3E",X"3E",X"FC",X"FC", + X"FC",X"FC",X"3E",X"3E",X"3E",X"FC",X"78",X"00",X"00",X"00",X"01",X"02",X"06",X"06",X"0F",X"0F", + X"0F",X"0F",X"06",X"06",X"02",X"01",X"00",X"00",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"05", + X"FF",X"05",X"05",X"05",X"05",X"05",X"05",X"05",X"FF",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E", + X"00",X"00",X"00",X"00",X"04",X"00",X"03",X"18",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E", + X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E", + X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"1E", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"07",X"07",X"07",X"03", + X"7F",X"FF",X"FF",X"FF",X"FF",X"FC",X"F0",X"C0",X"FC",X"FC",X"F0",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"1F", + X"0F",X"03",X"07",X"1F",X"7E",X"FC",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF",X"3E",X"3C",X"30",X"40", + X"07",X"07",X"07",X"03",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"03",X"00", + X"FF",X"FE",X"FC",X"FF",X"FF",X"FF",X"FF",X"7F",X"80",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"FE", + X"FC",X"FE",X"FF",X"7F",X"7F",X"3F",X"1F",X"0F",X"00",X"00",X"01",X"C7",X"FF",X"FF",X"FF",X"FF", + X"1F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0",X"E0", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"FC",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"FE",X"7E",X"7E",X"7E",X"7E",X"7E",X"FF",X"FF", + X"1F",X"1F",X"0F",X"07",X"01",X"00",X"00",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FB",X"E1",X"00", + X"E0",X"F0",X"F8",X"F8",X"FC",X"FC",X"FC",X"FE",X"FC",X"FC",X"FC",X"FE",X"7E",X"7F",X"3F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"01",X"87",X"CF",X"00",X"00",X"00",X"0F",X"7F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"C1",X"F9",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"F8",X"F0", + X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"07", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FC",X"E0",X"FE",X"FC",X"F8",X"F0",X"C0",X"00",X"00",X"00", + X"3F",X"3F",X"3F",X"3F",X"7F",X"7F",X"7F",X"7F",X"30",X"30",X"38",X"38",X"1C",X"1E",X"1F",X"0F", + X"00",X"00",X"00",X"00",X"01",X"1F",X"FF",X"FF",X"00",X"00",X"00",X"0F",X"FF",X"FF",X"FF",X"FF", + X"03",X"07",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"3F", + X"C0",X"E0",X"E0",X"60",X"60",X"60",X"70",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"70",X"70",X"F0",X"F0",X"E0",X"E0",X"E0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"30",X"70",X"70",X"60",X"60",X"60",X"E0",X"E0", + X"07",X"03",X"03",X"01",X"01",X"00",X"00",X"00",X"E0",X"E0",X"E0",X"E0",X"F0",X"F0",X"F0",X"F0", + X"1F",X"1F",X"1F",X"1F",X"1F",X"3F",X"38",X"38",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"78",X"00", + X"FF",X"FF",X"F3",X"E0",X"C0",X"00",X"00",X"00",X"FE",X"FE",X"FF",X"FF",X"7F",X"1F",X"0F",X"0F", + X"3E",X"1C",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"FC",X"FE",X"FE",X"7F",X"7F",X"7F",X"3F",X"3F", + X"00",X"00",X"1F",X"7F",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"9F",X"E7",X"F9",X"FC",X"F0",X"F8",X"FE",X"FE",X"FF",X"FF",X"FF",X"7F", + X"7F",X"7F",X"7F",X"FF",X"FE",X"FC",X"FC",X"FC",X"FF",X"FF",X"FB",X"C0",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"3F",X"1F",X"1F",X"1F",X"FF",X"FF",X"FF",X"FC",X"F0",X"80",X"F8",X"FF", + X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"80",X"01",X"01",X"00",X"00",X"00",X"01",X"0F",X"7F", + X"F8",X"F8",X"FC",X"FD",X"FF",X"FF",X"FF",X"FF",X"00",X"01",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"F8",X"F0",X"F0",X"E0", + X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"FC",X"FC",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8", + X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E3",X"01",X"01",X"00",X"00",X"00",X"00",X"07", + X"F8",X"FC",X"FC",X"FC",X"FC",X"FC",X"FE",X"FF",X"3F",X"3F",X"1F",X"3F",X"3F",X"7F",X"7F",X"FE", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F8",X"F0",X"F0",X"E0",X"E0",X"F0",X"F0",X"F8",X"3F",X"7F",X"7E",X"7E",X"7E",X"7E",X"7F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"FF",X"FF",X"0F",X"01",X"00",X"00",X"01",X"81",X"F3", + X"FF",X"FF",X"FE",X"FE",X"FE",X"FC",X"FC",X"F8",X"03",X"07",X"0F",X"0F",X"1F",X"1F",X"3F",X"3F", + X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"8F",X"00",X"00",X"F0",X"FC",X"FC",X"FE",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"30",X"3E",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"FC",X"FE",X"FE",X"7E",X"7F",X"7F",X"3F",X"3F", + X"00",X"00",X"00",X"00",X"01",X"3F",X"FF",X"FF",X"00",X"00",X"00",X"0F",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"BF", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"0F",X"0F",X"07",X"07",X"07",X"07",X"07",X"07", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"1F",X"3F",X"3F",X"3F",X"7F",X"7F",X"7E",X"FE", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"78",X"00",X"FF",X"FF",X"FF",X"E3",X"C0",X"00",X"00",X"00", + X"FC",X"FE",X"FF",X"FF",X"FF",X"7F",X"3F",X"1F",X"1E",X"0C",X"00",X"80",X"80",X"C0",X"C0",X"E0", + X"FC",X"FE",X"FE",X"7F",X"7F",X"7F",X"3F",X"3F",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FF",X"FF", + X"3F",X"3F",X"3F",X"FF",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"87",X"E1",X"F8", + X"F0",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF",X"3F",X"7F",X"FF",X"FE",X"FE",X"7C",X"38",X"00",X"00", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"0F",X"1F",X"3F",X"3F", + X"FC",X"F8",X"F8",X"F0",X"E0",X"E0",X"C0",X"80",X"7F",X"3F",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"3F",X"00",X"00",X"00",X"00",X"01",X"FE",X"FF",X"FF",X"7F",X"7F",X"FF",X"FE",X"FE", + X"0F",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"FB",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F8",X"F0",X"E0",X"C0",X"80",X"F8",X"FC",X"FE", + X"3E",X"3E",X"3E",X"3F",X"3F",X"1F",X"1F",X"0F",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E1", + X"00",X"00",X"03",X"07",X"1F",X"3F",X"7F",X"FF",X"7F",X"FF",X"FF",X"FE",X"FE",X"FE",X"FC",X"FC", + X"3F",X"1F",X"1F",X"0F",X"03",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"3E", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FC",X"F0",X"00",X"FD",X"F8",X"F0",X"C0",X"00",X"00",X"00",X"00", + X"FE",X"FE",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F",X"07",X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F", + X"FE",X"FC",X"F8",X"E1",X"C3",X"87",X"8F",X"CF",X"1F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F8",X"F8",X"F0",X"E0",X"F0",X"F8",X"FC",X"FC", + X"07",X"07",X"03",X"01",X"00",X"00",X"01",X"03",X"E1",X"FF",X"FF",X"FF",X"FF",X"7F",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FC",X"80",X"FC",X"F8",X"F0",X"E0",X"C0",X"01",X"01",X"03", + X"3F",X"7F",X"7E",X"FE",X"FE",X"FE",X"FC",X"FC",X"20",X"30",X"38",X"18",X"1C",X"1E",X"0F",X"0F", + X"00",X"00",X"01",X"03",X"07",X"1F",X"3F",X"7F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE", + X"FE",X"FF",X"FF",X"FF",X"7F",X"7F",X"3F",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20", + X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"1F",X"00",X"20",X"20",X"60",X"E0",X"F8",X"FC",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7E",X"3C",X"00",X"00",X"00",X"00",X"00",X"00", + X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"07",X"03",X"01",X"01",X"00",X"00",X"00",X"F0",X"F8",X"F8",X"FC",X"FC",X"FE",X"FE",X"7E", + X"70",X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"1F",X"0F",X"0F",X"0F",X"1F",X"18",X"30",X"20", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7E",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"BF",X"1F",X"1F",X"0F", + X"FC",X"FE",X"FF",X"FF",X"8F",X"C3",X"E1",X"E0",X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"E0", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1F",X"1F",X"80",X"80",X"80",X"C0",X"DF",X"FF",X"FF",X"FF", + X"FF",X"3F",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C1",X"80",X"80",X"C0",X"F0", + X"F8",X"FE",X"FF",X"FF",X"FF",X"3E",X"1C",X"00",X"07",X"0F",X"1F",X"1F",X"1F",X"3F",X"3F",X"3F", + X"FF",X"FF",X"FF",X"EF",X"C7",X"87",X"83",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"E0",X"F1",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"07",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"80",X"80",X"C0",X"E0",X"F8",X"FC",X"FF",X"FF",X"3F",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FE",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"00",X"01",X"03",X"07",X"07",X"0F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"E7",X"C3",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"FE",X"FC",X"FC",X"FC",X"FC",X"FE",X"7F",X"7F",X"7F", + X"07",X"03",X"03",X"01",X"00",X"F0",X"FC",X"FF",X"F0",X"F8",X"F8",X"FC",X"FE",X"FE",X"7F",X"7F", + X"1F",X"3F",X"3F",X"7F",X"7F",X"7E",X"FE",X"FC",X"FE",X"FE",X"FF",X"3F",X"3F",X"1F",X"0F",X"0F", + X"00",X"00",X"00",X"80",X"80",X"C0",X"E0",X"E0",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"1F", + X"00",X"00",X"E0",X"E0",X"F0",X"F8",X"F8",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"30",X"38",X"38",X"1C",X"0E",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"40",X"40",X"60",X"E0",X"E0",X"C0",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"20",X"20",X"60",X"60",X"60",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"07", + X"C6",X"F8",X"30",X"30",X"60",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"04",X"04",X"06",X"02",X"03",X"06",X"0E",X"0C",X"0C",X"18",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"06",X"07",X"07",X"07",X"07",X"07",X"07",X"60",X"60",X"40",X"40",X"40",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"08",X"0C",X"0E",X"00",X"03",X"0F",X"1E",X"38",X"70",X"70",X"60", + X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"70",X"30",X"30",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"00",X"00",X"0E",X"1C",X"18",X"38",X"30",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"20",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"18",X"1C",X"0C",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"08",X"18",X"10",X"70",X"60",X"C0",X"C0",X"80", + X"C0",X"E0",X"60",X"70",X"70",X"30",X"30",X"30",X"00",X"00",X"01",X"07",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"E0",X"F0",X"70",X"38",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_cpu1.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_cpu1.vhd new file mode 100644 index 00000000..1495349a --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_cpu1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_cpu1 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 prom of rom_cpu1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"B3",X"00",X"25",X"9F",X"DE",X"00",X"B0",X"DE",X"00",X"C0",X"25",X"BF",X"DE", + X"00",X"B0",X"DE",X"00",X"C0",X"25",X"DF",X"DE",X"00",X"B0",X"DE",X"00",X"C0",X"25",X"FF",X"DE", + X"00",X"B0",X"DE",X"00",X"C0",X"89",X"DE",X"76",X"00",X"62",X"B3",X"00",X"71",X"00",X"C0",X"89", + X"FB",X"7A",X"00",X"01",X"FF",X"FF",X"FF",X"FF",X"7A",X"9E",X"01",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7A",X"34",X"02",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"4B",X"27",X"60",X"5C",X"7A",X"9B",X"3B",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"59",X"FF",X"67",X"B6",X"0D",X"E3",X"4B",X"00",X"80",X"A4",X"6E",X"17",X"A4",X"D4",X"1A",X"A4", + X"06",X"2B",X"A4",X"BA",X"1A",X"A4",X"55",X"17",X"A4",X"C6",X"02",X"59",X"FF",X"67",X"EE",X"DE", + X"00",X"A0",X"A4",X"BA",X"1A",X"A4",X"A2",X"5B",X"1A",X"1C",X"00",X"B3",X"03",X"CB",X"EE",X"A4", + X"71",X"4C",X"B3",X"20",X"A4",X"A9",X"4D",X"25",X"01",X"A4",X"71",X"4C",X"B3",X"20",X"A4",X"A9", + X"4D",X"DC",X"89",X"E9",X"B5",X"00",X"A4",X"60",X"4C",X"A4",X"2B",X"01",X"76",X"02",X"90",X"19", + X"86",X"9B",X"8C",X"01",X"A4",X"99",X"4C",X"76",X"5F",X"60",X"19",X"6D",X"76",X"F8",X"0E",X"37", + X"D8",X"61",X"A4",X"36",X"1F",X"DE",X"66",X"60",X"EE",X"DE",X"67",X"60",X"DE",X"65",X"60",X"DE", + X"6E",X"60",X"DE",X"6F",X"60",X"7A",X"F7",X"03",X"76",X"1C",X"60",X"EE",X"F8",X"76",X"21",X"60", + X"F8",X"A4",X"CD",X"3C",X"76",X"5F",X"60",X"19",X"CD",X"7A",X"1B",X"01",X"25",X"09",X"DE",X"5E", + X"60",X"7A",X"5F",X"03",X"CB",X"97",X"B3",X"1F",X"A4",X"28",X"05",X"01",X"DC",X"B5",X"97",X"66", + X"CB",X"4B",X"CD",X"61",X"F4",X"00",X"F3",X"2B",X"02",X"4B",X"5B",X"60",X"F4",X"00",X"F3",X"2B", + X"02",X"25",X"03",X"DE",X"5B",X"60",X"25",X"FF",X"76",X"03",X"90",X"B6",X"E9",X"8B",X"76",X"E2", + X"0B",X"19",X"99",X"04",X"B3",X"00",X"D6",X"26",X"51",X"19",X"8E",X"76",X"30",X"68",X"D6",X"D1", + X"7B",X"21",X"9B",X"D9",X"01",X"D3",X"7A",X"26",X"02",X"71",X"00",X"C7",X"7B",X"D3",X"7A",X"FC", + X"01",X"4B",X"0C",X"62",X"19",X"04",X"9B",X"8B",X"08",X"19",X"75",X"DE",X"0C",X"62",X"19",X"4A", + X"76",X"FF",X"FF",X"F2",X"01",X"A4",X"2C",X"3C",X"7A",X"77",X"02",X"00",X"76",X"5E",X"60",X"03", + X"F8",X"72",X"4B",X"21",X"D3",X"F4",X"1D",X"ED",X"08",X"65",X"F4",X"0A",X"EA",X"03",X"DE",X"61", + X"D3",X"4B",X"5F",X"60",X"19",X"72",X"ED",X"0E",X"76",X"08",X"00",X"8E",X"A9",X"F7",X"5F",X"03", + X"CB",X"76",X"FA",X"FF",X"8E",X"A9",X"76",X"01",X"60",X"19",X"6D",X"4B",X"00",X"80",X"0E",X"DC", + X"3E",X"01",X"B6",X"47",X"97",X"66",X"CB",X"4B",X"CD",X"61",X"F4",X"00",X"F3",X"C1",X"02",X"4B", + X"5B",X"60",X"F4",X"00",X"F3",X"C1",X"02",X"25",X"03",X"DE",X"5B",X"60",X"25",X"FF",X"76",X"03", + X"90",X"B6",X"EB",X"8B",X"76",X"E2",X"0B",X"19",X"99",X"04",X"B3",X"00",X"D6",X"26",X"51",X"19", + X"8E",X"76",X"30",X"68",X"D6",X"D1",X"7B",X"21",X"9B",X"6F",X"02",X"D3",X"7A",X"BC",X"02",X"71", + X"00",X"C7",X"7B",X"D3",X"7A",X"92",X"02",X"A4",X"BD",X"3D",X"66",X"76",X"01",X"60",X"19",X"F4", + X"3E",X"7A",X"84",X"07",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"76",X"5E",X"60",X"03",X"F8",X"72",X"4B",X"21",X"D3",X"F4",X"1D",X"ED",X"08",X"65", + X"F4",X"0A",X"EA",X"03",X"DE",X"61",X"D3",X"4B",X"5F",X"60",X"19",X"72",X"ED",X"0E",X"76",X"08", + X"00",X"8E",X"A9",X"F7",X"5F",X"03",X"CB",X"76",X"FA",X"FF",X"8E",X"A9",X"76",X"01",X"60",X"19", + X"6D",X"DC",X"3E",X"01",X"B6",X"43",X"EE",X"DE",X"5B",X"60",X"DE",X"00",X"A0",X"DE",X"C9",X"61", + X"A4",X"24",X"50",X"DE",X"CD",X"61",X"DE",X"5E",X"60",X"7A",X"57",X"49",X"A4",X"F9",X"02",X"A4", + X"12",X"03",X"EE",X"76",X"68",X"60",X"F8",X"C0",X"F8",X"C0",X"F8",X"76",X"00",X"60",X"B3",X"1C", + X"F8",X"C0",X"89",X"FC",X"A4",X"2F",X"03",X"0E",X"B5",X"B3",X"09",X"76",X"73",X"60",X"EE",X"5C", + X"F8",X"EE",X"C0",X"F8",X"C0",X"F8",X"C0",X"89",X"F6",X"B5",X"A4",X"FB",X"5B",X"A4",X"BA",X"1A", + X"B5",X"00",X"76",X"80",X"D3",X"B3",X"09",X"CB",X"D9",X"76",X"02",X"2F",X"B3",X"07",X"D9",X"22", + X"00",X"D9",X"C0",X"F8",X"C0",X"89",X"F7",X"25",X"FF",X"F8",X"C0",X"DC",X"89",X"E9",X"B5",X"B3", + X"32",X"EE",X"76",X"1C",X"60",X"F8",X"C0",X"89",X"FC",X"B5",X"97",X"4B",X"5B",X"60",X"F4",X"00", + X"7D",X"04",X"5E",X"DE",X"5B",X"60",X"4B",X"CD",X"61",X"F4",X"00",X"7D",X"01",X"5E",X"DE",X"CD", + X"61",X"4B",X"00",X"90",X"19",X"B8",X"ED",X"05",X"25",X"05",X"DE",X"CD",X"61",X"01",X"B5",X"76", + X"5F",X"60",X"19",X"5A",X"19",X"CD",X"76",X"1C",X"60",X"EE",X"F8",X"76",X"21",X"60",X"F8",X"A4", + X"CD",X"3C",X"EE",X"DE",X"00",X"A0",X"A4",X"25",X"25",X"25",X"01",X"DE",X"E2",X"61",X"EE",X"DE", + X"C8",X"61",X"F7",X"01",X"00",X"76",X"00",X"90",X"19",X"24",X"7D",X"27",X"4B",X"5E",X"60",X"F4", + X"02",X"2C",X"04",X"19",X"86",X"7D",X"34",X"CB",X"A4",X"A5",X"1C",X"A4",X"E5",X"27",X"A4",X"55", + X"27",X"A4",X"5A",X"2D",X"B3",X"01",X"A4",X"2D",X"01",X"DC",X"89",X"D9",X"1A",X"D4",X"00",X"00", + X"00",X"00",X"00",X"4B",X"5F",X"60",X"19",X"10",X"DE",X"5F",X"60",X"A4",X"36",X"1F",X"DE",X"66", + X"60",X"EE",X"DE",X"67",X"60",X"76",X"5E",X"60",X"9E",X"1A",X"16",X"4B",X"5F",X"60",X"19",X"9C", + X"DE",X"5F",X"60",X"A4",X"36",X"1F",X"DE",X"66",X"60",X"DE",X"67",X"60",X"7A",X"60",X"49",X"9E", + X"9E",X"EE",X"7A",X"6C",X"49",X"76",X"68",X"60",X"F8",X"C0",X"F8",X"C0",X"F8",X"C0",X"F8",X"C0", + X"F8",X"C0",X"F8",X"C0",X"F8",X"C0",X"F8",X"25",X"FF",X"76",X"9D",X"60",X"B3",X"06",X"F8",X"C0", + X"89",X"FC",X"EE",X"DE",X"9F",X"60",X"DE",X"A2",X"60",X"76",X"1C",X"D6",X"37",X"63",X"60",X"76", + X"5F",X"60",X"19",X"AC",X"A4",X"0A",X"03",X"A4",X"E5",X"1B",X"EE",X"DE",X"60",X"60",X"8B",X"DE", + X"62",X"60",X"25",X"0C",X"DE",X"61",X"60",X"A4",X"C6",X"1C",X"A4",X"44",X"21",X"A4",X"BC",X"5D", + X"A4",X"64",X"1D",X"A4",X"77",X"1D",X"A4",X"D1",X"1D",X"A4",X"8B",X"1E",X"B3",X"08",X"25",X"05", + X"76",X"E1",X"D4",X"A4",X"7D",X"1E",X"A4",X"E0",X"1E",X"A4",X"26",X"28",X"B3",X"05",X"25",X"05", + X"76",X"E1",X"D4",X"A4",X"7D",X"1E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"D9", + X"76",X"1C",X"60",X"D9",X"71",X"00",X"82",X"D9",X"71",X"01",X"06",X"D9",X"71",X"02",X"0F",X"A4", + X"7F",X"1F",X"D9",X"F8",X"03",X"D9",X"A3",X"04",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"D9",X"71", + X"00",X"81",X"7A",X"D5",X"04",X"D9",X"76",X"70",X"60",X"B6",X"57",X"D4",X"00",X"3D",X"19",X"15", + X"D9",X"08",X"00",X"B6",X"57",X"6D",X"07",X"3D",X"54",X"02",X"F4",X"05",X"ED",X"0A",X"4B",X"E2", + X"61",X"F4",X"00",X"25",X"05",X"ED",X"01",X"5C",X"D9",X"F8",X"01",X"B6",X"57",X"3D",X"6D",X"03", + X"3D",X"54",X"07",X"F4",X"08",X"ED",X"1A",X"72",X"A4",X"36",X"1F",X"5C",X"04",X"4B",X"65",X"60", + X"F4",X"00",X"7D",X"05",X"4B",X"67",X"60",X"1A",X"03",X"4B",X"66",X"60",X"67",X"65",X"2C",X"01", + X"5C",X"D9",X"F8",X"02",X"B5",X"EE",X"DE",X"C9",X"61",X"A4",X"CF",X"33",X"A4",X"77",X"1D",X"A4", + X"85",X"04",X"A4",X"FE",X"28",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"25",X"81",X"DE",X"21",X"60", + X"A4",X"F4",X"30",X"A4",X"1C",X"31",X"A4",X"54",X"31",X"A4",X"77",X"1D",X"A4",X"F4",X"1E",X"00", + X"00",X"00",X"00",X"00",X"00",X"76",X"1F",X"60",X"A4",X"7F",X"1F",X"F8",X"C0",X"A3",X"A4",X"C7", + X"1F",X"A4",X"8F",X"17",X"B3",X"B4",X"A4",X"28",X"05",X"A4",X"C1",X"2A",X"EE",X"DE",X"21",X"60", + X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"1A",X"19",X"76",X"01",X"90",X"A4",X"5A",X"2D",X"19",X"22", + X"7D",X"FC",X"19",X"22",X"ED",X"FC",X"CB",X"A4",X"3A",X"03",X"A4",X"8F",X"17",X"DC",X"89",X"E8", + X"B5",X"A4",X"44",X"21",X"A4",X"E3",X"33",X"00",X"00",X"00",X"A4",X"92",X"31",X"A4",X"DA",X"30", + X"A4",X"CF",X"30",X"A4",X"44",X"31",X"25",X"03",X"DE",X"9B",X"61",X"A4",X"15",X"2B",X"A4",X"F4", + X"30",X"A4",X"1C",X"31",X"A4",X"54",X"31",X"A4",X"F4",X"1E",X"00",X"00",X"00",X"00",X"00",X"00", + X"D9",X"76",X"1C",X"60",X"D9",X"71",X"00",X"82",X"D9",X"71",X"01",X"06",X"D9",X"71",X"02",X"0F", + X"A4",X"7F",X"1F",X"D9",X"F8",X"03",X"D9",X"A3",X"04",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"D9", + X"71",X"00",X"81",X"76",X"1C",X"D6",X"37",X"63",X"60",X"EE",X"DE",X"60",X"60",X"8B",X"DE",X"62", + X"60",X"25",X"0C",X"DE",X"61",X"60",X"A4",X"C6",X"1C",X"A4",X"AE",X"05",X"1A",X"23",X"15",X"05", + X"00",X"76",X"2B",X"60",X"D4",X"00",X"22",X"6D",X"03",X"7D",X"08",X"40",X"77",X"F4",X"04",X"ED", + X"F5",X"1A",X"0D",X"A4",X"61",X"30",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"D9",X"71",X"00",X"81", + X"B5",X"4B",X"65",X"60",X"F4",X"00",X"7D",X"05",X"76",X"67",X"60",X"1A",X"03",X"76",X"66",X"60", + X"9E",X"22",X"97",X"A4",X"77",X"1D",X"01",X"D9",X"76",X"26",X"60",X"D9",X"71",X"00",X"82",X"D9", + X"71",X"01",X"58",X"D9",X"71",X"02",X"56",X"EE",X"D9",X"F8",X"03",X"D9",X"F8",X"04",X"76",X"00", + X"60",X"19",X"FE",X"25",X"FF",X"A4",X"4C",X"1E",X"7A",X"30",X"07",X"A4",X"C1",X"2A",X"EE",X"DE", + X"C9",X"61",X"A4",X"4C",X"1E",X"7A",X"41",X"05",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"A4",X"CF",X"33",X"76",X"66",X"60",X"4B",X"65",X"60",X"F4",X"00",X"7D",X"03",X"76", + X"67",X"60",X"D1",X"D1",X"66",X"A4",X"85",X"04",X"3E",X"9E",X"9E",X"A4",X"FE",X"28",X"A4",X"C7", + X"1F",X"A4",X"8F",X"17",X"25",X"81",X"DE",X"21",X"60",X"A4",X"F4",X"30",X"A4",X"1C",X"31",X"A4", + X"54",X"31",X"A4",X"77",X"1D",X"A4",X"F4",X"1E",X"76",X"01",X"D1",X"00",X"00",X"00",X"76",X"1F", + X"60",X"A4",X"7F",X"1F",X"F8",X"C0",X"A3",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"B3",X"B4",X"A4", + X"28",X"05",X"A4",X"1B",X"0A",X"EE",X"DE",X"21",X"60",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"A4", + X"44",X"21",X"A4",X"E3",X"33",X"00",X"00",X"00",X"A4",X"92",X"31",X"A4",X"44",X"31",X"A4",X"54", + X"31",X"A4",X"DA",X"30",X"A4",X"CF",X"30",X"A4",X"15",X"2B",X"EE",X"DE",X"60",X"60",X"8B",X"DE", + X"62",X"60",X"25",X"0C",X"DE",X"61",X"60",X"A4",X"C6",X"1C",X"76",X"1C",X"D6",X"37",X"63",X"60", + X"A4",X"F4",X"1E",X"76",X"01",X"D1",X"00",X"00",X"00",X"D9",X"76",X"1C",X"60",X"D9",X"71",X"00", + X"82",X"D9",X"71",X"01",X"06",X"D9",X"71",X"02",X"0F",X"A4",X"7F",X"1F",X"D9",X"F8",X"03",X"D9", + X"A3",X"04",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"D9",X"71",X"00",X"81",X"A4",X"AE",X"05",X"76", + X"26",X"60",X"71",X"82",X"C0",X"71",X"58",X"C0",X"71",X"56",X"A4",X"C7",X"1F",X"A4",X"8F",X"17", + X"A4",X"E3",X"35",X"D9",X"76",X"B6",X"61",X"D9",X"71",X"00",X"60",X"D9",X"71",X"01",X"00",X"D9", + X"71",X"02",X"00",X"D9",X"71",X"03",X"B4",X"EE",X"DE",X"B5",X"61",X"DE",X"B4",X"61",X"DE",X"E1", + X"61",X"76",X"CE",X"61",X"B3",X"05",X"EE",X"F8",X"C0",X"89",X"FC",X"76",X"5F",X"60",X"19",X"F4", + X"76",X"96",X"61",X"71",X"58",X"C0",X"71",X"56",X"C0",X"71",X"08",X"25",X"08",X"DE",X"98",X"61", + X"15",X"00",X"00",X"B6",X"2F",X"99",X"61",X"76",X"5F",X"60",X"19",X"11",X"A4",X"FD",X"45",X"A4", + X"3A",X"46",X"1A",X"06",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"A4",X"5A",X"2D",X"76",X"5F",X"60", + X"19",X"05",X"ED",X"08",X"76",X"02",X"90",X"19",X"69",X"9B",X"5E",X"09",X"A4",X"B1",X"39",X"A4", + X"6D",X"2B",X"4B",X"E1",X"61",X"F4",X"00",X"ED",X"03",X"A4",X"7E",X"40",X"A4",X"37",X"5F",X"A4", + X"FF",X"35",X"A4",X"99",X"3A",X"B3",X"04",X"7A",X"60",X"21",X"15",X"05",X"00",X"19",X"FA",X"F3", + X"C8",X"07",X"40",X"89",X"F8",X"7A",X"EE",X"07",X"66",X"C0",X"C0",X"4B",X"28",X"60",X"AC",X"EA", + X"02",X"B6",X"CF",X"F4",X"06",X"1C",X"EA",X"07",X"0C",X"4B",X"27",X"60",X"AC",X"EA",X"02",X"B6", + X"CF",X"F4",X"06",X"1C",X"EA",X"07",X"3E",X"7A",X"E1",X"01",X"3E",X"7A",X"C2",X"07",X"A4",X"B0", + X"3C",X"6D",X"0F",X"F4",X"0F",X"ED",X"1D",X"D9",X"76",X"21",X"60",X"D9",X"19",X"00",X"4E",X"9B", + X"14",X"08",X"D9",X"22",X"01",X"D9",X"21",X"06",X"F3",X"14",X"08",X"D9",X"22",X"02",X"D9",X"21", + X"07",X"9B",X"98",X"08",X"4B",X"5F",X"60",X"19",X"B8",X"ED",X"30",X"4B",X"27",X"60",X"48",X"4B", + X"28",X"60",X"57",X"4B",X"26",X"60",X"19",X"02",X"19",X"02",X"19",X"02",X"19",X"02",X"F4",X"02", + X"7D",X"0D",X"2C",X"0F",X"F4",X"04",X"7D",X"0E",X"6A",X"6E",X"04",X"57",X"7A",X"6E",X"08",X"38", + X"7A",X"6E",X"08",X"78",X"78",X"78",X"78",X"78",X"7A",X"6E",X"08",X"4B",X"28",X"60",X"76",X"97", + X"61",X"AC",X"1C",X"57",X"08",X"B6",X"CF",X"F4",X"05",X"1C",X"88",X"08",X"4B",X"27",X"60",X"0C", + X"AC",X"1C",X"66",X"08",X"B6",X"CF",X"F4",X"05",X"1C",X"88",X"08",X"0D",X"C0",X"69",X"A4",X"0A", + X"3C",X"22",X"00",X"00",X"00",X"00",X"00",X"F4",X"63",X"9B",X"EA",X"0A",X"F4",X"59",X"2C",X"08", + X"F4",X"62",X"E7",X"CC",X"09",X"9B",X"FE",X"09",X"7A",X"84",X"07",X"19",X"03",X"19",X"4A",X"A4", + X"C7",X"1F",X"A4",X"8F",X"17",X"7A",X"F3",X"0A",X"76",X"21",X"60",X"19",X"03",X"19",X"4A",X"76", + X"26",X"60",X"19",X"4A",X"76",X"00",X"60",X"19",X"54",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"25", + X"05",X"DE",X"E1",X"61",X"A4",X"26",X"1F",X"F4",X"13",X"2C",X"02",X"25",X"12",X"97",X"5E",X"76", + X"79",X"0C",X"B3",X"00",X"04",X"D6",X"FA",X"4B",X"65",X"60",X"F4",X"00",X"ED",X"06",X"D9",X"76", + X"68",X"60",X"1A",X"04",X"D9",X"76",X"6B",X"60",X"D9",X"22",X"01",X"C8",X"99",X"D9",X"F8",X"01", + X"D9",X"22",X"00",X"56",X"99",X"D9",X"F8",X"00",X"4B",X"65",X"60",X"F4",X"00",X"ED",X"05",X"76", + X"C4",X"D2",X"1A",X"03",X"76",X"C3",X"D2",X"A4",X"06",X"1E",X"01",X"15",X"00",X"04",X"5E",X"72", + X"5A",X"C6",X"76",X"F0",X"D1",X"F8",X"40",X"71",X"05",X"65",X"F4",X"06",X"2C",X"04",X"25",X"D9", + X"1A",X"02",X"25",X"D8",X"76",X"10",X"D2",X"F8",X"40",X"71",X"05",X"B3",X"20",X"CB",X"A4",X"C7", + X"1F",X"A4",X"8F",X"17",X"A4",X"5A",X"2D",X"DC",X"89",X"F3",X"76",X"F0",X"D1",X"71",X"FF",X"15", + X"00",X"04",X"40",X"71",X"00",X"76",X"10",X"D2",X"71",X"FF",X"40",X"71",X"00",X"76",X"5F",X"60", + X"19",X"FE",X"76",X"26",X"60",X"19",X"54",X"7A",X"84",X"07",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"A4",X"2F", + X"3F",X"A4",X"CD",X"3C",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"7A",X"62",X"06",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"A4",X"E5",X"3F",X"A4", + X"2B",X"3D",X"00",X"00",X"00",X"00",X"00",X"00",X"A4",X"BD",X"3D",X"66",X"26",X"CB",X"97",X"25", + X"03",X"DE",X"3F",X"60",X"76",X"00",X"60",X"19",X"6E",X"A4",X"03",X"58",X"A4",X"89",X"49",X"01", + X"DC",X"D3",X"3E",X"7A",X"84",X"07",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"A4",X"E5", + X"3F",X"66",X"76",X"0C",X"62",X"19",X"5A",X"76",X"01",X"60",X"19",X"5A",X"3E",X"A4",X"2B",X"3D", + X"A4",X"BD",X"3D",X"F2",X"01",X"A4",X"2C",X"3C",X"7A",X"84",X"07",X"A4",X"C1",X"2A",X"76",X"00", + X"60",X"19",X"FE",X"B5",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"A4",X"E5",X"3F",X"A4",X"2B",X"3D", + X"A4",X"05",X"40",X"76",X"01",X"60",X"19",X"55",X"A4",X"64",X"2D",X"A4",X"CD",X"3C",X"66",X"76", + X"5F",X"60",X"19",X"05",X"3E",X"F3",X"78",X"01",X"4B",X"65",X"60",X"F4",X"00",X"ED",X"13",X"4B", + X"66",X"60",X"F4",X"00",X"ED",X"1F",X"4B",X"67",X"60",X"F4",X"00",X"9B",X"96",X"0B",X"25",X"01", + X"1A",X"37",X"4B",X"67",X"60",X"F4",X"00",X"ED",X"0C",X"4B",X"66",X"60",X"F4",X"00",X"9B",X"96", + X"0B",X"25",X"02",X"1A",X"24",X"4B",X"5F",X"60",X"19",X"04",X"7D",X"17",X"4B",X"65",X"60",X"F4", + X"00",X"ED",X"09",X"4B",X"67",X"60",X"F4",X"00",X"ED",X"24",X"1A",X"07",X"4B",X"66",X"60",X"F4", + X"00",X"ED",X"1B",X"7A",X"F7",X"21",X"FF",X"FF",X"FF",X"97",X"A4",X"99",X"3A",X"A4",X"F3",X"3C", + X"00",X"00",X"00",X"01",X"A4",X"FC",X"2C",X"B3",X"80",X"A4",X"28",X"05",X"1A",X"09",X"A4",X"99", + X"3A",X"A4",X"F3",X"3C",X"00",X"00",X"00",X"A4",X"74",X"2C",X"B3",X"80",X"A4",X"28",X"05",X"4B", + X"65",X"60",X"8B",X"DE",X"65",X"60",X"A4",X"CD",X"3F",X"76",X"5F",X"60",X"19",X"0D",X"F3",X"0B", + X"06",X"19",X"6E",X"7A",X"D5",X"04",X"A4",X"40",X"2B",X"B3",X"80",X"A4",X"28",X"05",X"76",X"1C", + X"60",X"19",X"03",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"A4",X"BA",X"1A",X"A4",X"60",X"50",X"4B", + X"5E",X"60",X"F4",X"00",X"7D",X"0A",X"76",X"02",X"90",X"19",X"86",X"7D",X"1D",X"7A",X"5F",X"03", + X"76",X"02",X"90",X"19",X"86",X"7D",X"13",X"76",X"5F",X"60",X"19",X"03",X"B3",X"02",X"CB",X"B3", + X"B4",X"A4",X"28",X"05",X"DC",X"89",X"F7",X"7A",X"1B",X"01",X"25",X"09",X"DE",X"5E",X"60",X"7A", + X"5F",X"03",X"01",X"01",X"01",X"02",X"01",X"03",X"01",X"04",X"01",X"05",X"02",X"01",X"02",X"03", + X"03",X"01",X"03",X"02",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"CA",X"D0",X"D0",X"D0",X"D6",X"D0",X"5A",X"D1",X"1A",X"D2",X"DA",X"D2",X"0A",X"D1", + X"46",X"D1",X"4C",X"D1",X"D0",X"D1",X"12",X"D2",X"C6",X"D2",X"D4",X"D2",X"16",X"D3",X"4A",X"D3", + X"50",X"D3",X"56",X"D3",X"06",X"D2",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"10",X"15",X"20",X"25",X"30",X"35",X"40", + X"45",X"50",X"55",X"60",X"65",X"70",X"75",X"80",X"85",X"90",X"95",X"18",X"30",X"60",X"48",X"78", + X"90",X"A8",X"C0",X"12",X"15",X"15",X"16",X"15",X"12",X"17",X"12",X"17",X"18",X"1A",X"12",X"12", + X"16",X"1B",X"15",X"16",X"17",X"5E",X"66",X"74",X"9A",X"63",X"72",X"8C",X"A2",X"62",X"70",X"88", + X"A0",X"5B",X"64",X"74",X"94",X"59",X"64",X"74",X"90",X"5A",X"66",X"74",X"92",X"5C",X"64",X"74", + X"96",X"5D",X"68",X"78",X"98",X"5C",X"6A",X"7C",X"96",X"5F",X"6C",X"80",X"9C",X"60",X"6E",X"84", + X"9E",X"61",X"66",X"74",X"92",X"00",X"47",X"46",X"49",X"48",X"FF",X"4A",X"FF",X"00",X"41",X"39", + X"00",X"40",X"42",X"43",X"00",X"44",X"45",X"01",X"39",X"01",X"35",X"36",X"37",X"01",X"FF",X"01", + X"01",X"3D",X"01",X"40",X"3E",X"FF",X"01",X"3F",X"01",X"01",X"FC",X"06",X"F2",X"03",X"6D",X"06", + X"C7",X"01",X"FC",X"03",X"6D",X"06",X"F2",X"06",X"C7",X"13",X"11",X"33",X"11",X"32",X"13",X"21", + X"12",X"11",X"31",X"12",X"13",X"23",X"22",X"32",X"32",X"21",X"12",X"11",X"12",X"F5",X"D0",X"27", + X"D1",X"2D",X"D1",X"39",X"D1",X"6F",X"D1",X"75",X"D1",X"A9",X"D1",X"AD",X"D1",X"B3",X"D1",X"B7", + X"D1",X"69",X"D2",X"6D",X"D2",X"73",X"D2",X"77",X"D2",X"AF",X"D2",X"B5",X"D2",X"E7",X"D2",X"ED", + X"D2",X"F9",X"D2",X"35",X"D3",X"32",X"3C",X"38",X"31",X"32",X"3B",X"38",X"33",X"33",X"3C",X"34", + X"31",X"33",X"3B",X"34",X"33",X"20",X"01",X"13",X"12",X"20",X"11",X"33",X"33",X"12",X"10",X"FF", + X"E5",X"5E",X"5B",X"59",X"5A",X"5C",X"5D",X"5C",X"5F",X"60",X"61",X"62",X"63",X"19",X"15",X"0A", + X"22",X"0E",X"1B",X"FF",X"0C",X"11",X"0A",X"17",X"10",X"0E",X"02",X"02",X"02",X"01",X"01",X"01", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"1C", + X"21",X"2C",X"31",X"3E",X"43",X"49",X"56",X"5A",X"61",X"64",X"65",X"6A",X"6B",X"6C",X"6D",X"6E", + X"6F",X"70",X"EC",X"EE",X"EE",X"EE",X"EE",X"06",X"FD",X"FF",X"FF",X"FF",X"FF",X"07",X"FD",X"FF", + X"FF",X"FF",X"FF",X"07",X"FD",X"FF",X"FF",X"FF",X"FF",X"07",X"FD",X"FF",X"FF",X"FF",X"FF",X"07", + X"FD",X"FF",X"FF",X"FF",X"FF",X"07",X"FD",X"FF",X"FF",X"FF",X"FF",X"07",X"FD",X"FF",X"FF",X"FF", + X"FF",X"07",X"FD",X"FF",X"FF",X"FF",X"FF",X"07",X"FD",X"FF",X"FF",X"FF",X"FF",X"07",X"B9",X"BB", + X"BB",X"BB",X"BB",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"02",X"03",X"05",X"03",X"06",X"09",X"15",X"08",X"16",X"24",X"40",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"33",X"FF",X"10",X"0A",X"16",X"0E",X"FF",X"18",X"1F",X"0E", + X"1B",X"01",X"1C",X"1D",X"FF",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"02",X"17",X"0D",X"FF",X"19", + X"15",X"0A",X"22",X"0E",X"1B",X"AE",X"AB",X"A7",X"AB",X"AE",X"A7",X"AB",X"00",X"01",X"02",X"03", + X"00",X"03",X"03",X"03",X"04",X"00",X"04",X"04",X"04",X"04",X"00",X"04",X"05",X"05",X"05",X"00", + X"06",X"06",X"06",X"07",X"90",X"24",X"00",X"00",X"02",X"04",X"01",X"03",X"05",X"06",X"08",X"05", + X"07",X"09",X"0A",X"0B",X"08",X"0C",X"0D",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"12",X"12",X"12",X"15",X"15",X"15",X"18",X"18", + X"18",X"18",X"18",X"20",X"20",X"20",X"20",X"20",X"12",X"12",X"15",X"15",X"18",X"18",X"18",X"18", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"08",X"08",X"04",X"04",X"04",X"02",X"02", + X"02",X"04",X"04",X"04",X"02",X"02",X"02",X"04",X"04",X"08",X"08",X"08",X"08",X"08",X"01",X"01", + X"01",X"08",X"08",X"08",X"01",X"01",X"01",X"08",X"08",X"08",X"08",X"08",X"04",X"04",X"02",X"02", + X"02",X"04",X"04",X"08",X"08",X"04",X"04",X"08",X"08",X"04",X"04",X"02",X"02",X"01",X"01",X"01", + X"01",X"01",X"02",X"02",X"01",X"01",X"01",X"08",X"08",X"08",X"01",X"01",X"01",X"01",X"01",X"02", + X"02",X"04",X"04",X"04",X"02",X"02",X"02",X"04",X"04",X"04",X"02",X"02",X"02",X"02",X"02",X"02", + X"02",X"02",X"01",X"01",X"08",X"08",X"08",X"01",X"01",X"02",X"02",X"01",X"01",X"02",X"02",X"01", + X"01",X"08",X"08",X"08",X"08",X"04",X"04",X"08",X"08",X"08",X"08",X"01",X"01",X"08",X"08",X"04", + X"04",X"02",X"02",X"02",X"04",X"04",X"04",X"02",X"02",X"02",X"04",X"04",X"04",X"02",X"02",X"02", + X"04",X"04",X"04",X"02",X"02",X"01",X"01",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"04",X"04", + X"04",X"04",X"04",X"08",X"FF",X"04",X"04",X"04",X"04",X"04",X"02",X"02",X"02",X"02",X"02",X"01", + X"01",X"01",X"08",X"08",X"08",X"04",X"04",X"08",X"08",X"01",X"01",X"02",X"02",X"01",X"01",X"08", + X"08",X"08",X"08",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"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"10",X"23",X"10",X"28",X"10",X"2D",X"10",X"30",X"10",X"33",X"10",X"36",X"10",X"3B",X"10", + X"40",X"10",X"45",X"10",X"4A",X"10",X"4F",X"10",X"54",X"10",X"57",X"10",X"5C",X"10",X"5F",X"10", + X"01",X"8B",X"10",X"02",X"C8",X"12",X"1D",X"13",X"02",X"88",X"12",X"A7",X"12",X"01",X"62",X"10", + X"01",X"A7",X"10",X"01",X"A3",X"13",X"02",X"B9",X"10",X"00",X"11",X"02",X"47",X"11",X"56",X"11", + X"02",X"DE",X"13",X"FF",X"13",X"02",X"65",X"11",X"76",X"11",X"02",X"0E",X"12",X"47",X"12",X"02", + X"BC",X"11",X"E5",X"11",X"01",X"AC",X"10",X"02",X"87",X"11",X"16",X"14",X"01",X"9A",X"10",X"01", + X"84",X"13",X"04",X"B0",X"05",X"C1",X"04",X"C2",X"04",X"C3",X"04",X"B1",X"05",X"C2",X"04",X"C3", + X"04",X"C4",X"04",X"B2",X"05",X"C3",X"04",X"C4",X"04",X"C5",X"04",X"B3",X"05",X"C4",X"04",X"C5", + X"04",X"C6",X"04",X"B4",X"05",X"C5",X"04",X"C6",X"04",X"C7",X"FF",X"30",X"C1",X"2F",X"C1",X"2D", + X"C1",X"2B",X"C1",X"30",X"C1",X"30",X"C3",X"00",X"CF",X"FF",X"41",X"D0",X"00",X"EF",X"F1",X"F0", + X"41",X"F0",X"41",X"F0",X"00",X"EF",X"FF",X"1C",X"F3",X"1F",X"F3",X"FF",X"1F",X"C0",X"23",X"C0", + X"26",X"A0",X"23",X"A0",X"2B",X"80",X"00",X"AF",X"FF",X"2B",X"73",X"2A",X"A3",X"29",X"73",X"28", + X"A3",X"26",X"93",X"24",X"C3",X"23",X"93",X"21",X"C3",X"1F",X"A3",X"00",X"CF",X"1F",X"C3",X"1E", + X"93",X"1F",X"C3",X"21",X"93",X"1F",X"C3",X"1E",X"93",X"1F",X"C3",X"21",X"93",X"1F",X"C3",X"1E", + X"93",X"1F",X"C3",X"28",X"A3",X"00",X"AF",X"28",X"63",X"1F",X"C3",X"1E",X"93",X"1F",X"C3",X"21", + X"93",X"1F",X"C3",X"1E",X"93",X"1F",X"C3",X"21",X"83",X"23",X"83",X"24",X"53",X"00",X"EF",X"FF", + X"13",X"72",X"12",X"A2",X"11",X"72",X"10",X"A2",X"0E",X"92",X"0C",X"C2",X"0B",X"92",X"09",X"C2", + X"07",X"A2",X"00",X"CF",X"07",X"C2",X"06",X"92",X"07",X"C2",X"00",X"A2",X"00",X"AF",X"07",X"A2", + X"00",X"AF",X"00",X"A2",X"00",X"AF",X"07",X"A2",X"00",X"AF",X"0C",X"A2",X"00",X"AF",X"0C",X"62", + X"07",X"C2",X"06",X"92",X"07",X"C2",X"07",X"A2",X"00",X"AF",X"00",X"A2",X"00",X"AF",X"0C",X"82", + X"0E",X"82",X"10",X"52",X"00",X"AF",X"FF",X"18",X"C1",X"1C",X"C1",X"1F",X"C1",X"24",X"C1",X"28", + X"C1",X"2B",X"C1",X"30",X"C1",X"FF",X"13",X"C1",X"18",X"C1",X"1C",X"C1",X"1F",X"C1",X"24",X"C1", + X"28",X"C1",X"2B",X"C1",X"FF",X"1B",X"D1",X"1D",X"D1",X"1F",X"D1",X"20",X"D1",X"22",X"D1",X"24", + X"D1",X"26",X"D1",X"27",X"D1",X"FF",X"27",X"D1",X"26",X"D1",X"24",X"D1",X"22",X"D1",X"20",X"D1", + X"1F",X"D1",X"1D",X"D1",X"1B",X"D1",X"FF",X"24",X"B2",X"26",X"B2",X"28",X"A2",X"00",X"CF",X"2B", + X"A2",X"00",X"CF",X"2B",X"A2",X"00",X"CF",X"2D",X"A2",X"00",X"CF",X"2B",X"A2",X"00",X"CF",X"28", + X"A2",X"00",X"CF",X"24",X"82",X"26",X"A2",X"28",X"A2",X"00",X"CF",X"28",X"A2",X"00",X"CF",X"26", + X"A2",X"00",X"CF",X"26",X"A2",X"00",X"CF",X"24",X"92",X"00",X"CF",X"FF",X"28",X"83",X"2B",X"A3", + X"28",X"A3",X"00",X"AF",X"26",X"A3",X"23",X"83",X"26",X"A3",X"23",X"A3",X"00",X"AF",X"1F",X"A3", + X"21",X"83",X"1F",X"A3",X"1C",X"A3",X"00",X"8F",X"1C",X"73",X"0E",X"A3",X"00",X"AF",X"0E",X"A3", + X"10",X"73",X"00",X"AF",X"FF",X"24",X"85",X"28",X"A5",X"24",X"A5",X"00",X"AF",X"23",X"A5",X"1F", + X"85",X"23",X"A5",X"1F",X"A5",X"00",X"AF",X"1C",X"A5",X"1E",X"85",X"1C",X"A5",X"18",X"A5",X"00", + X"8F",X"18",X"75",X"0B",X"A5",X"00",X"AF",X"0B",X"A5",X"0C",X"75",X"00",X"AF",X"FF",X"21",X"A2", + X"23",X"C2",X"24",X"A2",X"00",X"AF",X"24",X"A2",X"00",X"AF",X"1F",X"A2",X"00",X"AF",X"1F",X"A2", + X"00",X"AF",X"1C",X"A2",X"00",X"AF",X"1C",X"A2",X"00",X"AF",X"1A",X"82",X"18",X"92",X"1A",X"C2", + X"1C",X"A2",X"1F",X"82",X"21",X"A2",X"1F",X"92",X"1C",X"C2",X"18",X"92",X"1A",X"C2",X"1C",X"82", + X"1A",X"82",X"18",X"72",X"00",X"AF",X"FF",X"00",X"CF",X"00",X"AF",X"0C",X"A3",X"00",X"AF",X"13", + X"A3",X"00",X"AF",X"0C",X"A3",X"00",X"AF",X"13",X"A3",X"00",X"AF",X"0C",X"A3",X"00",X"AF",X"13", + X"A3",X"00",X"AF",X"13",X"A3",X"00",X"AF",X"0E",X"A3",X"00",X"AF",X"0C",X"A3",X"00",X"AF",X"13", + X"A3",X"00",X"AF",X"0C",X"A3",X"00",X"AF",X"13",X"A3",X"00",X"AF",X"13",X"A3",X"00",X"AF",X"0E", + X"A3",X"00",X"AF",X"0C",X"73",X"00",X"AF",X"FF",X"00",X"BF",X"30",X"C1",X"2F",X"C1",X"2D",X"C1", + X"2B",X"C1",X"30",X"C1",X"2F",X"C1",X"2D",X"C1",X"2B",X"C1",X"30",X"C1",X"2F",X"C1",X"2D",X"C1", + X"2B",X"C1",X"30",X"C1",X"30",X"C3",X"FF",X"00",X"BF",X"0C",X"C1",X"0B",X"C1",X"09",X"C1",X"07", + X"C1",X"18",X"C1",X"17",X"C1",X"15",X"C1",X"13",X"C1",X"24",X"C1",X"23",X"C1",X"21",X"C1",X"1F", + X"C1",X"24",X"C1",X"24",X"C3",X"00",X"AF",X"FF",X"1F",X"A3",X"21",X"93",X"22",X"C3",X"00",X"8F", + X"23",X"A3",X"00",X"AF",X"1F",X"A3",X"00",X"AF",X"00",X"8F",X"23",X"83",X"00",X"AF",X"1F",X"A3", + X"00",X"AF",X"1F",X"A3",X"21",X"93",X"23",X"C3",X"00",X"8F",X"24",X"A3",X"00",X"AF",X"1F",X"A3", + X"00",X"7F",X"24",X"83",X"00",X"AF",X"1F",X"A3",X"00",X"AF",X"1F",X"A3",X"21",X"93",X"22",X"C3", + X"00",X"8F",X"23",X"A3",X"00",X"AF",X"1F",X"A3",X"00",X"7F",X"23",X"83",X"00",X"AF",X"1F",X"A3", + X"00",X"AF",X"1F",X"A3",X"21",X"93",X"23",X"C3",X"24",X"53",X"00",X"AF",X"FF",X"00",X"7F",X"0B", + X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"0B",X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"0B", + X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"0C", + X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"0C",X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"0C", + X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"0C",X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"0B", + X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"0B",X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"0B", + X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"10",X"A4",X"00",X"AF",X"13",X"A4",X"00",X"AF",X"0C", + X"54",X"00",X"AF",X"FF",X"2D",X"E2",X"2A",X"E2",X"27",X"E2",X"24",X"E2",X"21",X"E2",X"1E",X"E2", + X"1B",X"E2",X"18",X"E2",X"15",X"E2",X"12",X"E2",X"0F",X"E2",X"0C",X"E2",X"09",X"E2",X"06",X"E2", + X"03",X"E2",X"FF",X"03",X"96",X"04",X"A5",X"05",X"B4",X"06",X"C3",X"07",X"D2",X"08",X"E1",X"03", + X"96",X"04",X"A5",X"05",X"B4",X"06",X"C3",X"07",X"D2",X"08",X"E1",X"03",X"96",X"04",X"A5",X"05", + X"B4",X"06",X"C3",X"07",X"D2",X"08",X"E1",X"03",X"96",X"04",X"A5",X"05",X"B4",X"06",X"C3",X"07", + X"D2",X"08",X"E1",X"08",X"F4",X"07",X"F6",X"06",X"F8",X"05",X"FA",X"00",X"EF",X"FF",X"14",X"E0", + X"15",X"E0",X"16",X"E1",X"17",X"E1",X"18",X"E2",X"19",X"E2",X"1A",X"E3",X"1B",X"E3",X"1C",X"E4", + X"1D",X"E4",X"1E",X"E5",X"1F",X"E5",X"20",X"E6",X"21",X"E6",X"22",X"E7",X"00",X"EF",X"FF",X"81", + X"E1",X"81",X"E1",X"81",X"E2",X"81",X"E3",X"81",X"E4",X"81",X"E5",X"81",X"E6",X"81",X"E7",X"81", + X"E8",X"81",X"A9",X"00",X"EF",X"FF",X"1C",X"B2",X"1D",X"B2",X"1F",X"A2",X"00",X"CF",X"1C",X"A2", + X"00",X"CF",X"1F",X"A2",X"00",X"CF",X"1C",X"A2",X"00",X"CF",X"1F",X"A2",X"00",X"CF",X"1C",X"A2", + X"00",X"CF",X"1F",X"A2",X"00",X"CF",X"1C",X"A2",X"00",X"CF",X"1F",X"A2",X"00",X"CF",X"1F",X"A2", + X"00",X"CF",X"1D",X"A2",X"00",X"CF",X"1D",X"A2",X"00",X"CF",X"18",X"96",X"13",X"96",X"0C",X"76", + X"00",X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"CB",X"72",X"25",X"01",X"23",X"7D",X"05",X"19",X"99",X"7A",X"36",X"17",X"DC",X"B5", + X"26",X"97",X"65",X"5E",X"57",X"19",X"99",X"6B",X"D9",X"76",X"04",X"60",X"57",X"CE",X"00",X"D9", + X"40",X"01",X"D3",X"B5",X"B5",X"76",X"00",X"70",X"B3",X"04",X"D4",X"00",X"CB",X"B3",X"FF",X"4B", + X"01",X"90",X"19",X"F8",X"ED",X"F9",X"08",X"C0",X"89",X"F5",X"DC",X"89",X"EF",X"B5",X"25",X"9F", + X"DE",X"00",X"B0",X"DE",X"00",X"C0",X"25",X"BF",X"DE",X"00",X"B0",X"DE",X"00",X"C0",X"25",X"DF", + X"DE",X"00",X"B0",X"DE",X"00",X"C0",X"25",X"FF",X"DE",X"00",X"B0",X"DE",X"00",X"C0",X"B5",X"76", + X"5F",X"60",X"19",X"05",X"9B",X"A1",X"17",X"76",X"00",X"60",X"EE",X"F8",X"C0",X"F8",X"C0",X"F8", + X"B5",X"D9",X"66",X"76",X"00",X"60",X"22",X"6D",X"FF",X"F3",X"E5",X"17",X"C0",X"22",X"6D",X"FF", + X"F3",X"D0",X"17",X"C0",X"22",X"6D",X"FF",X"9B",X"BF",X"18",X"B3",X"10",X"19",X"3D",X"1C",X"C4", + X"17",X"A4",X"FA",X"17",X"14",X"32",X"65",X"F4",X"18",X"9B",X"BF",X"18",X"32",X"7A",X"BC",X"17", + X"B3",X"08",X"19",X"3D",X"1C",X"DA",X"17",X"A4",X"FA",X"17",X"14",X"32",X"65",X"F4",X"10",X"7D", + X"D2",X"32",X"7A",X"D2",X"17",X"B3",X"00",X"19",X"3D",X"1C",X"EF",X"17",X"A4",X"FA",X"17",X"14", + X"32",X"65",X"F4",X"08",X"7D",X"B6",X"32",X"7A",X"E7",X"17",X"CB",X"97",X"66",X"76",X"00",X"10", + X"19",X"ED",X"AE",X"B3",X"00",X"D6",X"3C",X"C0",X"FA",X"A5",X"E4",X"3C",X"C0",X"04",X"65",X"6D", + X"FF",X"9B",X"AF",X"18",X"C2",X"69",X"C0",X"0D",X"C0",X"D9",X"76",X"03",X"60",X"7B",X"6D",X"C0", + X"9B",X"46",X"18",X"D9",X"22",X"00",X"19",X"F8",X"ED",X"0C",X"B6",X"2F",X"16",X"60",X"D9",X"19", + X"00",X"F6",X"23",X"7A",X"0D",X"18",X"23",X"19",X"B8",X"ED",X"D2",X"B6",X"2F",X"19",X"60",X"D9", + X"19",X"00",X"FE",X"7A",X"0D",X"18",X"D9",X"22",X"00",X"19",X"72",X"F3",X"5A",X"18",X"B6",X"2F", + X"04",X"60",X"D9",X"19",X"00",X"C6",X"23",X"7A",X"0D",X"18",X"19",X"04",X"F3",X"6B",X"18",X"B6", + X"2F",X"07",X"60",X"D9",X"19",X"00",X"CE",X"23",X"7A",X"0D",X"18",X"19",X"48",X"F3",X"7C",X"18", + X"B6",X"2F",X"0A",X"60",X"D9",X"19",X"00",X"D6",X"23",X"7A",X"0D",X"18",X"19",X"57",X"F3",X"8D", + X"18",X"B6",X"2F",X"0D",X"60",X"D9",X"19",X"00",X"DE",X"23",X"7A",X"0D",X"18",X"19",X"E9",X"F3", + X"9E",X"18",X"B6",X"2F",X"10",X"60",X"D9",X"19",X"00",X"E6",X"23",X"7A",X"0D",X"18",X"23",X"19", + X"EB",X"F3",X"0D",X"18",X"B6",X"2F",X"13",X"60",X"D9",X"19",X"00",X"EE",X"7A",X"0D",X"18",X"3E", + X"01",X"DC",X"32",X"65",X"6D",X"07",X"5C",X"A4",X"32",X"17",X"8B",X"CD",X"F8",X"32",X"B5",X"4B", + X"03",X"60",X"B3",X"06",X"D9",X"76",X"04",X"60",X"19",X"02",X"E7",X"DA",X"18",X"D9",X"C0",X"D9", + X"C0",X"D9",X"C0",X"23",X"9B",X"CF",X"19",X"7A",X"C8",X"18",X"32",X"D9",X"22",X"02",X"F4",X"00", + X"7D",X"07",X"D9",X"9E",X"02",X"32",X"7A",X"CD",X"18",X"D9",X"24",X"00",X"D9",X"05",X"01",X"22", + X"F4",X"FF",X"F3",X"3E",X"19",X"25",X"06",X"49",X"F4",X"03",X"2C",X"14",X"6E",X"03",X"19",X"99", + X"19",X"99",X"19",X"99",X"19",X"99",X"19",X"99",X"FE",X"9F",X"DE",X"00",X"C0",X"7A",X"1F",X"19", + X"19",X"99",X"19",X"99",X"19",X"99",X"19",X"99",X"19",X"99",X"FE",X"9F",X"DE",X"00",X"B0",X"25", + X"06",X"49",X"48",X"F2",X"01",X"1D",X"F4",X"00",X"7D",X"06",X"2A",X"19",X"C0",X"7A",X"25",X"19", + X"6A",X"8B",X"57",X"4B",X"03",X"60",X"8C",X"DE",X"03",X"60",X"32",X"7A",X"CD",X"18",X"25",X"06", + X"49",X"F4",X"03",X"30",X"9A",X"19",X"6E",X"03",X"19",X"99",X"19",X"99",X"19",X"99",X"19",X"99", + X"19",X"99",X"FE",X"80",X"04",X"E2",X"76",X"07",X"1B",X"22",X"6D",X"3F",X"19",X"99",X"57",X"CE", + X"00",X"E2",X"40",X"E2",X"22",X"00",X"8F",X"DE",X"00",X"C0",X"E2",X"22",X"01",X"DE",X"00",X"C0", + X"C0",X"25",X"00",X"B6",X"E9",X"8F",X"19",X"79",X"DE",X"00",X"C0",X"25",X"00",X"B6",X"EB",X"E2", + X"76",X"F7",X"1A",X"C0",X"D9",X"1F",X"00",X"D9",X"C1",X"01",X"57",X"CE",X"00",X"E2",X"40",X"E2", + X"22",X"00",X"5E",X"D9",X"F8",X"02",X"32",X"7A",X"CD",X"18",X"19",X"99",X"19",X"99",X"19",X"99", + X"19",X"99",X"19",X"99",X"FE",X"80",X"04",X"E2",X"76",X"07",X"1B",X"22",X"6D",X"3F",X"19",X"99", + X"57",X"CE",X"00",X"E2",X"40",X"E2",X"22",X"00",X"8F",X"DE",X"00",X"B0",X"E2",X"22",X"01",X"DE", + X"00",X"B0",X"C0",X"EE",X"B6",X"E9",X"8F",X"19",X"79",X"DE",X"00",X"B0",X"7A",X"7B",X"19",X"19", + X"02",X"2C",X"0D",X"D9",X"C0",X"D9",X"C0",X"D9",X"C0",X"19",X"02",X"2C",X"72",X"7A",X"B7",X"1A", + X"32",X"D9",X"22",X"02",X"F4",X"00",X"7D",X"07",X"D9",X"9E",X"02",X"32",X"7A",X"D3",X"19",X"D9", + X"24",X"00",X"D9",X"05",X"01",X"22",X"F4",X"FF",X"ED",X"11",X"25",X"FF",X"DE",X"00",X"B0",X"4B", + X"03",X"60",X"6D",X"BF",X"DE",X"03",X"60",X"32",X"7A",X"D3",X"19",X"B3",X"00",X"19",X"02",X"19", + X"89",X"19",X"02",X"19",X"02",X"19",X"02",X"19",X"02",X"19",X"02",X"5E",X"19",X"ED",X"19",X"ED", + X"B2",X"FE",X"E0",X"DE",X"00",X"B0",X"C0",X"25",X"00",X"B6",X"E9",X"FE",X"F0",X"DE",X"00",X"B0", + X"25",X"00",X"B6",X"EB",X"E2",X"76",X"F7",X"1A",X"C0",X"D9",X"1F",X"00",X"D9",X"C1",X"01",X"57", + X"CE",X"00",X"E2",X"40",X"E2",X"22",X"00",X"5E",X"D9",X"F8",X"02",X"32",X"7A",X"D3",X"19",X"D9", + X"22",X"02",X"F4",X"00",X"7D",X"06",X"D9",X"9E",X"02",X"7A",X"B7",X"1A",X"D9",X"24",X"00",X"D9", + X"05",X"01",X"22",X"F4",X"FF",X"ED",X"10",X"25",X"FF",X"DE",X"00",X"C0",X"4B",X"03",X"60",X"6D", + X"7F",X"DE",X"03",X"60",X"7A",X"B7",X"1A",X"B3",X"00",X"19",X"02",X"19",X"89",X"19",X"02",X"19", + X"02",X"19",X"02",X"19",X"02",X"19",X"02",X"5E",X"19",X"ED",X"19",X"ED",X"B2",X"FE",X"E0",X"DE", + X"00",X"C0",X"C0",X"25",X"00",X"B6",X"E9",X"FE",X"F0",X"DE",X"00",X"C0",X"25",X"00",X"B6",X"EB", + X"E2",X"76",X"F7",X"1A",X"C0",X"D9",X"1F",X"00",X"D9",X"C1",X"01",X"57",X"CE",X"00",X"E2",X"40", + X"E2",X"22",X"00",X"5E",X"D9",X"F8",X"02",X"D9",X"3E",X"B5",X"66",X"97",X"CB",X"76",X"80",X"D0", + X"25",X"FF",X"D4",X"18",X"00",X"B3",X"20",X"F8",X"C0",X"89",X"FC",X"00",X"9A",X"F3",X"C4",X"1A", + X"DC",X"01",X"3E",X"B5",X"25",X"00",X"B3",X"80",X"76",X"00",X"D0",X"F8",X"C0",X"89",X"FC",X"D4", + X"00",X"B3",X"18",X"F8",X"15",X"20",X"00",X"40",X"89",X"F9",X"77",X"9A",X"F3",X"F6",X"1A",X"77", + X"76",X"9F",X"D0",X"7A",X"E1",X"1A",X"B5",X"FF",X"C0",X"80",X"60",X"40",X"30",X"20",X"18",X"10", + X"0C",X"08",X"06",X"04",X"03",X"02",X"01",X"08",X"3F",X"0F",X"3B",X"09",X"38",X"06",X"35",X"06", + X"32",X"0A",X"2F",X"0E",X"2C",X"06",X"2A",X"00",X"28",X"0C",X"25",X"0A",X"23",X"0A",X"21",X"0C", + X"1F",X"0F",X"1D",X"04",X"1C",X"0B",X"1A",X"03",X"19",X"0D",X"17",X"07",X"16",X"03",X"15",X"00", + X"14",X"0E",X"12",X"0D",X"11",X"0D",X"10",X"0E",X"0F",X"00",X"0F",X"02",X"0E",X"06",X"0D",X"0A", + X"0C",X"0E",X"0B",X"04",X"0B",X"0A",X"0A",X"00",X"0A",X"07",X"09",X"0F",X"08",X"07",X"08",X"0F", + X"07",X"08",X"07",X"01",X"07",X"0B",X"06",X"05",X"06",X"0F",X"05",X"0A",X"05",X"05",X"05",X"00", + X"05",X"0B",X"04",X"07",X"04",X"03",X"04",X"0F",X"03",X"0C",X"03",X"09",X"03",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"C1",X"15",X"19",X"17",X"B5",X"94",X"D4",X"00",X"CB",X"B3",X"00",X"A4",X"FC",X"1B",X"DC", + X"89",X"02",X"1A",X"04",X"77",X"CB",X"1A",X"F2",X"00",X"00",X"00",X"B5",X"D9",X"76",X"55",X"0C", + X"CE",X"00",X"65",X"F4",X"02",X"ED",X"02",X"F2",X"02",X"C2",X"19",X"99",X"19",X"99",X"26",X"CE", + X"00",X"57",X"D9",X"40",X"D3",X"D9",X"69",X"00",X"CB",X"D9",X"3C",X"03",X"19",X"2C",X"19",X"2C", + X"19",X"2C",X"19",X"2C",X"D9",X"24",X"01",X"D9",X"05",X"02",X"07",X"26",X"15",X"20",X"00",X"40", + X"D3",X"89",X"F7",X"19",X"90",X"ED",X"15",X"78",X"D9",X"24",X"01",X"D9",X"05",X"02",X"C0",X"D9", + X"3C",X"03",X"19",X"2C",X"19",X"2C",X"19",X"2C",X"19",X"2C",X"1A",X"DE",X"DC",X"65",X"F4",X"00", + X"ED",X"17",X"14",X"CB",X"F7",X"20",X"00",X"D9",X"24",X"01",X"D9",X"05",X"02",X"D6",X"D9",X"22", + X"03",X"6D",X"0F",X"72",X"F2",X"03",X"7A",X"2A",X"1C",X"B5",X"F7",X"00",X"00",X"76",X"9E",X"D0", + X"25",X"4B",X"F8",X"D9",X"76",X"52",X"0C",X"D9",X"D6",X"D9",X"3C",X"00",X"A4",X"9B",X"1C",X"77", + X"C2",X"F4",X"03",X"ED",X"EB",X"76",X"9D",X"D0",X"D9",X"76",X"61",X"0C",X"B3",X"18",X"15",X"20", + X"00",X"D9",X"22",X"00",X"F8",X"D9",X"C0",X"40",X"89",X"F7",X"B5",X"5C",X"15",X"20",X"00",X"40", + X"F8",X"40",X"89",X"FC",X"B5",X"C0",X"19",X"22",X"7D",X"FC",X"19",X"22",X"ED",X"FC",X"66",X"A4", + X"3A",X"03",X"A4",X"8F",X"17",X"3E",X"19",X"22",X"7D",X"FC",X"B5",X"CB",X"72",X"25",X"01",X"89", + X"02",X"DC",X"B5",X"06",X"1A",X"F7",X"B5",X"00",X"4B",X"62",X"60",X"F4",X"00",X"7D",X"04",X"F2", + X"06",X"1A",X"02",X"F2",X"05",X"D4",X"00",X"B3",X"0C",X"76",X"1C",X"D6",X"07",X"A4",X"24",X"1D", + X"14",X"25",X"17",X"33",X"ED",X"0A",X"77",X"25",X"04",X"67",X"ED",X"02",X"D4",X"00",X"B3",X"00", + X"25",X"00",X"67",X"ED",X"05",X"25",X"0C",X"33",X"7D",X"1E",X"4B",X"60",X"60",X"67",X"ED",X"15", + X"4B",X"61",X"60",X"33",X"ED",X"0F",X"37",X"63",X"60",X"78",X"4B",X"62",X"60",X"F4",X"00",X"7D", + X"03",X"38",X"1A",X"01",X"7C",X"7A",X"DC",X"1C",X"EE",X"DD",X"ED",X"07",X"4B",X"62",X"60",X"8B", + X"DE",X"62",X"60",X"B5",X"26",X"19",X"42",X"7D",X"0A",X"19",X"39",X"7D",X"03",X"C0",X"1A",X"10", + X"0C",X"1A",X"0D",X"19",X"39",X"7D",X"05",X"15",X"E0",X"FF",X"1A",X"03",X"15",X"20",X"00",X"40", + X"D3",X"B5",X"25",X"52",X"D4",X"00",X"76",X"9C",X"D0",X"32",X"25",X"4E",X"B3",X"16",X"F8",X"A4", + X"24",X"1D",X"32",X"F8",X"A4",X"24",X"1D",X"89",X"FA",X"F4",X"55",X"7D",X"06",X"5C",X"32",X"5C", + X"77",X"1A",X"E9",X"B5",X"15",X"20",X"00",X"76",X"A3",X"D4",X"25",X"06",X"B3",X"0C",X"F8",X"66", + X"C0",X"F8",X"3E",X"40",X"89",X"F8",X"B5",X"15",X"20",X"00",X"4B",X"65",X"60",X"F4",X"00",X"7D", + X"05",X"4B",X"67",X"60",X"1A",X"03",X"4B",X"66",X"60",X"F4",X"07",X"2C",X"02",X"25",X"06",X"72", + X"EE",X"32",X"25",X"06",X"49",X"04",X"CB",X"76",X"A3",X"D0",X"25",X"E1",X"DE",X"C8",X"61",X"EE", + X"33",X"4B",X"C8",X"61",X"7D",X"08",X"F8",X"5C",X"40",X"F8",X"5E",X"40",X"89",X"F8",X"25",X"FF", + X"42",X"19",X"ED",X"DE",X"C8",X"61",X"EE",X"33",X"4B",X"C8",X"61",X"7D",X"04",X"F8",X"40",X"89", + X"FC",X"32",X"F4",X"FF",X"7D",X"0A",X"8B",X"32",X"76",X"A4",X"D0",X"25",X"E3",X"DC",X"1A",X"CC", + X"B5",X"EE",X"A4",X"4C",X"1E",X"15",X"20",X"00",X"4B",X"5F",X"60",X"19",X"04",X"7D",X"13",X"76", + X"43",X"D2",X"71",X"02",X"40",X"71",X"1E",X"40",X"7A",X"31",X"49",X"D9",X"76",X"6B",X"60",X"A4", + X"06",X"1E",X"76",X"44",X"D2",X"71",X"01",X"40",X"71",X"1E",X"40",X"7A",X"3A",X"49",X"D9",X"76", + X"68",X"60",X"A4",X"06",X"1E",X"B5",X"26",X"CB",X"66",X"B3",X"03",X"76",X"DA",X"61",X"66",X"D9", + X"22",X"00",X"04",X"19",X"02",X"19",X"02",X"19",X"02",X"19",X"02",X"F8",X"C0",X"C2",X"6D",X"0F", + X"F8",X"D9",X"C0",X"C0",X"89",X"E9",X"3E",X"B3",X"05",X"EE",X"21",X"ED",X"05",X"71",X"FF",X"C0", + X"89",X"F8",X"3E",X"D9",X"66",X"D9",X"76",X"DA",X"61",X"15",X"20",X"00",X"B3",X"06",X"D9",X"22", + X"00",X"F8",X"D9",X"C0",X"40",X"89",X"F7",X"D9",X"3E",X"DC",X"D3",X"B5",X"97",X"CB",X"66",X"F4", + X"00",X"ED",X"14",X"25",X"03",X"76",X"44",X"D6",X"B3",X"0A",X"A4",X"7D",X"1E",X"76",X"43",X"D6", + X"B3",X"0A",X"A4",X"7D",X"1E",X"1A",X"12",X"4B",X"65",X"60",X"F4",X"00",X"ED",X"07",X"76",X"44", + X"D6",X"25",X"00",X"1A",X"EB",X"25",X"00",X"1A",X"E4",X"3E",X"DC",X"01",X"B5",X"CB",X"26",X"66", + X"15",X"20",X"00",X"F8",X"40",X"89",X"FC",X"3E",X"D3",X"DC",X"B5",X"76",X"E2",X"D4",X"25",X"06", + X"B3",X"08",X"A4",X"7D",X"1E",X"76",X"E2",X"D0",X"71",X"11",X"15",X"20",X"00",X"40",X"71",X"12", + X"40",X"71",X"2A",X"40",X"A4",X"24",X"5F",X"A4",X"BD",X"25",X"B5",X"8B",X"FF",X"BC",X"3F",X"77", + X"1A",X"17",X"FF",X"FF",X"FF",X"FF",X"FF",X"B3",X"09",X"76",X"80",X"D3",X"D9",X"76",X"AB",X"1E", + X"CB",X"B3",X"03",X"D9",X"22",X"00",X"F8",X"C0",X"D9",X"C0",X"89",X"F7",X"DC",X"89",X"ED",X"B3", + X"09",X"76",X"73",X"60",X"71",X"01",X"C0",X"71",X"00",X"C0",X"71",X"00",X"C0",X"89",X"F5",X"B5", + X"76",X"E1",X"D0",X"15",X"20",X"00",X"71",X"1B",X"40",X"71",X"18",X"40",X"71",X"1E",X"40",X"71", + X"17",X"7A",X"1D",X"5F",X"76",X"A1",X"D1",X"15",X"20",X"00",X"A4",X"26",X"1F",X"F4",X"00",X"7D", + X"24",X"F4",X"64",X"2C",X"08",X"71",X"09",X"40",X"71",X"09",X"7A",X"25",X"1F",X"B3",X"00",X"D4", + X"0A",X"67",X"2C",X"04",X"82",X"14",X"1A",X"F9",X"32",X"EE",X"33",X"7D",X"03",X"A3",X"1A",X"02", + X"71",X"FF",X"40",X"32",X"F8",X"B5",X"4B",X"65",X"60",X"19",X"04",X"7D",X"05",X"4B",X"6F",X"60", + X"1A",X"03",X"4B",X"6E",X"60",X"B5",X"4B",X"02",X"90",X"19",X"B8",X"7D",X"04",X"25",X"03",X"1A", + X"02",X"25",X"05",X"B5",X"A4",X"26",X"1F",X"F4",X"00",X"ED",X"04",X"71",X"FF",X"1A",X"2F",X"5E", + X"F4",X"12",X"2C",X"02",X"25",X"11",X"CE",X"00",X"57",X"E2",X"76",X"79",X"0C",X"E2",X"40",X"15", + X"20",X"00",X"E2",X"22",X"00",X"04",X"6D",X"F0",X"7D",X"0A",X"19",X"02",X"19",X"02",X"19",X"02", + X"19",X"02",X"F8",X"40",X"C2",X"6D",X"0F",X"F8",X"40",X"71",X"00",X"40",X"71",X"00",X"B5",X"D9", + X"66",X"A4",X"26",X"1F",X"F4",X"00",X"7D",X"07",X"5E",X"F4",X"12",X"2C",X"02",X"25",X"11",X"D9", + X"76",X"93",X"0C",X"04",X"B3",X"00",X"D9",X"D6",X"D9",X"3C",X"00",X"D4",X"00",X"19",X"99",X"19", + X"99",X"C8",X"D9",X"3E",X"B5",X"D9",X"22",X"01",X"F4",X"07",X"1C",X"AF",X"1F",X"25",X"07",X"6E", + X"07",X"57",X"19",X"73",X"19",X"73",X"19",X"73",X"19",X"73",X"6D",X"0F",X"32",X"6A",X"F4",X"0B", + X"E7",X"C5",X"1F",X"F2",X"0B",X"32",X"B5",X"D9",X"66",X"A4",X"7D",X"44",X"A4",X"5A",X"2D",X"76", + X"01",X"90",X"19",X"22",X"9B",X"D2",X"1F",X"76",X"59",X"60",X"D1",X"22",X"76",X"5A",X"60",X"6D", + X"03",X"ED",X"01",X"D1",X"A4",X"3A",X"03",X"76",X"4E",X"60",X"EE",X"B3",X"0B",X"F8",X"C0",X"89", + X"FC",X"D9",X"76",X"1C",X"60",X"D9",X"22",X"00",X"6D",X"03",X"F3",X"0C",X"20",X"14",X"25",X"0A"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_cpu2.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_cpu2.vhd new file mode 100644 index 00000000..c49ef130 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_cpu2.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_cpu2 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 prom of rom_cpu2 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"33",X"9B",X"03",X"21",X"15",X"05",X"00",X"D9",X"40",X"7A",X"F5",X"1F",X"76",X"5F",X"60",X"19", + X"FA",X"7D",X"20",X"76",X"02",X"90",X"19",X"24",X"7D",X"19",X"04",X"4B",X"65",X"60",X"F4",X"00", + X"C2",X"7D",X"10",X"D9",X"FA",X"02",X"25",X"FE",X"82",X"04",X"D9",X"0D",X"01",X"25",X"AE",X"DA", + X"7A",X"39",X"20",X"D9",X"22",X"01",X"D9",X"FA",X"02",X"D9",X"0D",X"00",X"19",X"4B",X"19",X"4B", + X"19",X"4B",X"19",X"4B",X"A4",X"40",X"22",X"26",X"CE",X"00",X"E2",X"76",X"4E",X"60",X"E2",X"40", + X"97",X"E2",X"22",X"00",X"E2",X"D1",X"00",X"CB",X"8D",X"14",X"E2",X"76",X"80",X"70",X"15",X"40", + X"00",X"E2",X"40",X"89",X"FC",X"19",X"99",X"19",X"99",X"57",X"E2",X"40",X"DC",X"C2",X"6E",X"07", + X"E2",X"F8",X"03",X"01",X"6D",X"0F",X"D3",X"F2",X"00",X"19",X"29",X"ED",X"06",X"19",X"90",X"7D", + X"06",X"19",X"79",X"7C",X"7A",X"8D",X"20",X"19",X"E8",X"ED",X"02",X"19",X"68",X"76",X"5F",X"60", + X"19",X"FA",X"7D",X"2A",X"76",X"02",X"90",X"19",X"24",X"7D",X"23",X"DE",X"C8",X"61",X"4B",X"65", + X"60",X"F4",X"00",X"4B",X"C8",X"61",X"7D",X"16",X"19",X"E9",X"ED",X"05",X"19",X"79",X"7A",X"B3", + X"20",X"19",X"0A",X"19",X"EB",X"ED",X"05",X"19",X"68",X"7A",X"BE",X"20",X"19",X"EE",X"FE",X"C0", + X"E2",X"F8",X"00",X"D9",X"22",X"03",X"D9",X"19",X"04",X"66",X"ED",X"2B",X"F4",X"D8",X"EA",X"27", + X"32",X"EE",X"4C",X"ED",X"06",X"32",X"5A",X"0C",X"7A",X"DC",X"20",X"32",X"32",X"4B",X"5A",X"60", + X"6D",X"03",X"19",X"72",X"7D",X"05",X"CE",X"04",X"7A",X"F1",X"20",X"F4",X"02",X"ED",X"07",X"CE", + X"08",X"32",X"EC",X"7A",X"F7",X"20",X"32",X"E2",X"F8",X"01",X"D9",X"22",X"04",X"E2",X"F8",X"02", + X"7A",X"FD",X"1F",X"76",X"C0",X"70",X"B3",X"0B",X"D9",X"76",X"4E",X"60",X"D9",X"22",X"00",X"66", + X"19",X"99",X"19",X"99",X"57",X"CE",X"00",X"40",X"91",X"66",X"D3",X"6A",X"D3",X"26",X"A2",X"F4", + X"20",X"EA",X"0D",X"E2",X"3E",X"E2",X"66",X"15",X"20",X"00",X"E2",X"40",X"EE",X"E2",X"F8",X"00", + X"15",X"40",X"00",X"D9",X"C0",X"3E",X"40",X"89",X"D3",X"76",X"01",X"90",X"19",X"22",X"F3",X"3C", + X"21",X"D9",X"3E",X"B5",X"25",X"00",X"B3",X"16",X"76",X"A6",X"D4",X"15",X"20",X"00",X"CB",X"B3", + X"16",X"66",X"F8",X"C0",X"89",X"FC",X"3E",X"DC",X"40",X"89",X"F3",X"B5",X"B5",X"FF",X"FF",X"FF", + X"26",X"CB",X"97",X"A4",X"CC",X"56",X"4B",X"0F",X"62",X"F4",X"AA",X"7D",X"09",X"01",X"DC",X"D3", + X"76",X"2B",X"60",X"7A",X"BA",X"07",X"25",X"00",X"DE",X"0F",X"62",X"A4",X"84",X"57",X"2C",X"06", + X"01",X"DC",X"D3",X"7A",X"53",X"22",X"76",X"D1",X"57",X"3C",X"D4",X"00",X"C0",X"22",X"CB",X"66", + X"76",X"F9",X"D4",X"A4",X"23",X"56",X"22",X"3E",X"DC",X"6D",X"0F",X"F4",X"03",X"ED",X"01",X"77", + X"89",X"EA",X"19",X"4F",X"4B",X"3B",X"62",X"67",X"EA",X"C3",X"F4",X"0B",X"EA",X"BF",X"76",X"3B", + X"62",X"D1",X"C0",X"D1",X"4B",X"3B",X"62",X"76",X"BE",X"D0",X"F7",X"40",X"00",X"D6",X"5E",X"ED", + X"FC",X"15",X"00",X"04",X"66",X"71",X"53",X"0C",X"71",X"E7",X"0C",X"71",X"E6",X"3E",X"40",X"71", + X"02",X"0C",X"71",X"02",X"0C",X"71",X"02",X"25",X"D7",X"16",X"ED",X"18",X"25",X"7C",X"3A",X"ED", + X"13",X"71",X"02",X"C0",X"71",X"02",X"C0",X"71",X"02",X"76",X"7C",X"D3",X"71",X"4F",X"C0",X"71", + X"4F",X"C0",X"71",X"4E",X"7A",X"6D",X"21",X"A4",X"FD",X"21",X"7A",X"DC",X"04",X"25",X"00",X"DE", + X"C9",X"61",X"15",X"54",X"54",X"25",X"02",X"B3",X"0B",X"76",X"BE",X"D0",X"A4",X"D1",X"5D",X"15", + X"FF",X"FF",X"25",X"02",X"B3",X"0B",X"76",X"BD",X"D0",X"A4",X"D1",X"5D",X"15",X"E5",X"E5",X"25", + X"02",X"B3",X"0B",X"76",X"BC",X"D0",X"A4",X"D1",X"5D",X"76",X"7C",X"D3",X"71",X"4F",X"C0",X"71", + X"4F",X"C0",X"71",X"4E",X"76",X"7C",X"D7",X"71",X"02",X"C0",X"71",X"02",X"C0",X"71",X"02",X"B5", + X"97",X"1D",X"F4",X"02",X"ED",X"09",X"4B",X"4B",X"62",X"F4",X"00",X"ED",X"02",X"CE",X"08",X"01", + X"7A",X"A8",X"1F",X"B3",X"80",X"A4",X"73",X"22",X"76",X"01",X"60",X"19",X"6E",X"A4",X"2F",X"3F", + X"B3",X"30",X"A4",X"73",X"22",X"00",X"00",X"A4",X"64",X"4B",X"76",X"F8",X"0E",X"37",X"D8",X"61", + X"7A",X"A0",X"22",X"CB",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"DC",X"89",X"F6",X"B5",X"66",X"76", + X"5F",X"60",X"19",X"05",X"7D",X"06",X"3E",X"71",X"02",X"7A",X"FB",X"35",X"3E",X"F4",X"01",X"ED", + X"05",X"71",X"02",X"7A",X"FB",X"35",X"F4",X"05",X"1C",X"F1",X"35",X"71",X"03",X"7A",X"FB",X"35", + X"A4",X"FD",X"21",X"7A",X"5E",X"09",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"66",X"CB",X"B3",X"FF",X"CB",X"B3",X"FF",X"CB",X"B3",X"FF",X"00", + X"89",X"FD",X"DC",X"89",X"F7",X"DC",X"89",X"F1",X"DC",X"3E",X"B5",X"66",X"CB",X"66",X"F4",X"04", + X"2C",X"10",X"19",X"72",X"7D",X"06",X"E2",X"76",X"F0",X"0C",X"1A",X"52",X"E2",X"76",X"E7",X"0C", + X"1A",X"4C",X"D4",X"00",X"19",X"72",X"7D",X"24",X"15",X"E1",X"FF",X"40",X"32",X"22",X"F4",X"E5", + X"ED",X"02",X"19",X"DC",X"15",X"3E",X"00",X"40",X"22",X"F4",X"E5",X"ED",X"02",X"19",X"70",X"97", + X"C2",X"DE",X"8E",X"60",X"01",X"32",X"E2",X"76",X"DE",X"0C",X"1A",X"22",X"15",X"21",X"00",X"40", + X"32",X"22",X"F4",X"E5",X"ED",X"02",X"19",X"B5",X"15",X"BE",X"FF",X"40",X"22",X"F4",X"E5",X"ED", + X"02",X"19",X"D3",X"97",X"C2",X"DE",X"8E",X"60",X"01",X"32",X"E2",X"76",X"D5",X"0C",X"A4",X"0F", + X"24",X"3E",X"D4",X"00",X"32",X"19",X"4B",X"19",X"9D",X"1C",X"DF",X"23",X"C2",X"F4",X"00",X"ED", + X"05",X"A4",X"D9",X"24",X"1A",X"79",X"F4",X"04",X"ED",X"05",X"A4",X"8B",X"24",X"1A",X"70",X"A4", + X"23",X"24",X"26",X"E2",X"66",X"CE",X"00",X"5E",X"F4",X"04",X"2C",X"01",X"5E",X"57",X"E2",X"40", + X"E2",X"22",X"00",X"E2",X"3E",X"D3",X"F4",X"01",X"ED",X"40",X"66",X"76",X"8E",X"60",X"C2",X"F4", + X"03",X"ED",X"06",X"19",X"FA",X"7D",X"18",X"1A",X"1A",X"EA",X"06",X"19",X"3C",X"7D",X"10",X"1A", + X"12",X"F4",X"08",X"ED",X"06",X"19",X"0D",X"7D",X"06",X"1A",X"08",X"19",X"69",X"ED",X"04",X"25", + X"FF",X"1A",X"14",X"25",X"E5",X"97",X"25",X"02",X"D9",X"66",X"26",X"15",X"00",X"04",X"D9",X"40", + X"D9",X"F8",X"00",X"D3",X"D9",X"3E",X"01",X"3E",X"1A",X"12",X"97",X"25",X"05",X"D9",X"66",X"26", + X"15",X"00",X"04",X"D9",X"40",X"D9",X"F8",X"00",X"D3",X"D9",X"3E",X"01",X"D9",X"F8",X"00",X"C2", + X"F4",X"0A",X"7D",X"05",X"77",X"32",X"7A",X"54",X"23",X"32",X"F4",X"04",X"2C",X"0D",X"25",X"00", + X"DE",X"8E",X"60",X"DE",X"90",X"60",X"DE",X"8F",X"60",X"1A",X"11",X"25",X"09",X"DE",X"8F",X"60", + X"25",X"01",X"DE",X"90",X"60",X"66",X"76",X"00",X"60",X"19",X"5A",X"3E",X"DC",X"3E",X"B5",X"97", + X"19",X"99",X"57",X"CE",X"00",X"D9",X"76",X"F9",X"0C",X"D9",X"40",X"D9",X"0D",X"00",X"D9",X"69", + X"01",X"01",X"B5",X"26",X"66",X"D9",X"3E",X"F4",X"06",X"7D",X"3C",X"F4",X"02",X"ED",X"04",X"D9", + X"C0",X"1A",X"34",X"EA",X"07",X"15",X"E1",X"FF",X"D9",X"40",X"1A",X"2B",X"F4",X"05",X"ED",X"05", + X"15",X"E0",X"FF",X"1A",X"F3",X"EA",X"05",X"15",X"21",X"00",X"1A",X"EC",X"F4",X"08",X"ED",X"05", + X"15",X"DF",X"FF",X"1A",X"E3",X"EA",X"05",X"15",X"20",X"00",X"1A",X"DC",X"F4",X"09",X"7D",X"05", + X"15",X"1F",X"00",X"1A",X"D3",X"D9",X"0C",X"D3",X"B5",X"7A",X"A9",X"56",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"26",X"66",X"15",X"C0",X"FF", + X"40",X"A4",X"69",X"24",X"F4",X"02",X"ED",X"0D",X"32",X"F4",X"04",X"2C",X"04",X"71",X"34",X"1A", + X"34",X"71",X"33",X"1A",X"30",X"EA",X"0D",X"32",X"F4",X"04",X"2C",X"04",X"71",X"38",X"1A",X"25", + X"71",X"FF",X"1A",X"21",X"32",X"F4",X"04",X"2C",X"0E",X"32",X"22",X"F4",X"3B",X"ED",X"04",X"71", + X"3A",X"1A",X"13",X"71",X"34",X"1A",X"0F",X"32",X"22",X"F4",X"3A",X"ED",X"04",X"71",X"3B",X"1A", + X"05",X"71",X"33",X"1A",X"01",X"32",X"3E",X"D3",X"B5",X"26",X"66",X"C0",X"C0",X"A4",X"69",X"24", + X"F4",X"02",X"ED",X"0D",X"32",X"F4",X"04",X"2C",X"04",X"71",X"3B",X"1A",X"34",X"71",X"33",X"1A", + X"30",X"EA",X"0D",X"32",X"F4",X"04",X"2C",X"04",X"71",X"3C",X"1A",X"25",X"71",X"FF",X"1A",X"21", + X"32",X"F4",X"04",X"2C",X"0E",X"32",X"22",X"F4",X"34",X"ED",X"04",X"71",X"3A",X"1A",X"13",X"71", + X"3B",X"1A",X"0F",X"32",X"22",X"F4",X"3A",X"ED",X"04",X"71",X"34",X"1A",X"05",X"71",X"33",X"1A", + X"01",X"32",X"3E",X"D3",X"B5",X"A4",X"06",X"2B",X"A4",X"BA",X"1A",X"A4",X"55",X"17",X"A4",X"3E", + X"25",X"A4",X"60",X"4C",X"A4",X"1D",X"27",X"A4",X"CB",X"27",X"A4",X"26",X"28",X"B5",X"B3",X"10", + X"76",X"1E",X"D1",X"D9",X"76",X"D7",X"2E",X"D4",X"04",X"A4",X"B3",X"27",X"76",X"1C",X"D1",X"B3", + X"01",X"66",X"65",X"F4",X"01",X"7D",X"08",X"D4",X"03",X"A4",X"B1",X"25",X"F8",X"1A",X"07",X"D4", + X"00",X"A4",X"B1",X"25",X"71",X"1D",X"15",X"20",X"00",X"40",X"D9",X"76",X"CF",X"2E",X"F4",X"05", + X"EA",X"08",X"5E",X"19",X"99",X"CE",X"00",X"57",X"1A",X"03",X"15",X"06",X"00",X"D9",X"40",X"A4", + X"B1",X"25",X"D9",X"22",X"00",X"F8",X"D9",X"C0",X"26",X"15",X"20",X"00",X"40",X"D3",X"A4",X"B1", + X"25",X"D9",X"22",X"00",X"F8",X"26",X"15",X"40",X"00",X"40",X"D3",X"A4",X"BD",X"25",X"3E",X"14", + X"65",X"F4",X"0A",X"EA",X"0B",X"F4",X"02",X"ED",X"04",X"0C",X"0C",X"1A",X"A4",X"0C",X"1A",X"A1", + X"B5",X"97",X"66",X"26",X"15",X"00",X"04",X"40",X"08",X"D3",X"3E",X"01",X"B5",X"CB",X"D9",X"76", + X"80",X"D3",X"65",X"5E",X"72",X"7D",X"05",X"EE",X"5A",X"08",X"89",X"FC",X"57",X"CE",X"00",X"D9", + X"40",X"B3",X"07",X"15",X"00",X"04",X"66",X"40",X"08",X"3E",X"D9",X"22",X"00",X"F8",X"26",X"15", + X"20",X"00",X"40",X"D9",X"C0",X"D3",X"89",X"EE",X"B3",X"06",X"C2",X"66",X"40",X"A4",X"7D",X"1E", + X"3E",X"DC",X"D9",X"76",X"73",X"60",X"65",X"CB",X"5E",X"72",X"19",X"99",X"17",X"DC",X"57",X"CE", + X"00",X"D9",X"40",X"A4",X"06",X"1E",X"B5",X"B5",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"97",X"66",X"F8",X"5C",X"66",X"40",X"F8",X"3E",X"0C",X"5C", + X"F8",X"40",X"5C",X"F8",X"3E",X"01",X"B5",X"CB",X"B3",X"03",X"F8",X"5C",X"40",X"89",X"FB",X"DC", + X"B5",X"CB",X"B3",X"03",X"F8",X"5E",X"0A",X"B6",X"29",X"89",X"F9",X"DC",X"B5",X"B3",X"09",X"76", + X"8B",X"D1",X"D9",X"76",X"F1",X"2E",X"D4",X"03",X"00",X"00",X"00",X"B3",X"02",X"76",X"EA",X"D1", + X"D9",X"76",X"FA",X"2E",X"D4",X"03",X"00",X"00",X"00",X"B3",X"0E",X"76",X"29",X"D1",X"D9",X"76", + X"FC",X"2E",X"D4",X"03",X"A4",X"B3",X"27",X"B3",X"05",X"76",X"C7",X"D1",X"D9",X"76",X"0A",X"2F", + X"D4",X"01",X"A4",X"B3",X"27",X"4B",X"02",X"90",X"19",X"F8",X"ED",X"33",X"B3",X"03",X"76",X"06", + X"D1",X"D9",X"76",X"21",X"2F",X"D4",X"01",X"A4",X"B3",X"27",X"B3",X"0E",X"76",X"86",X"D1",X"D9", + X"76",X"24",X"2F",X"A4",X"B3",X"27",X"15",X"00",X"04",X"76",X"C6",X"D0",X"D4",X"04",X"66",X"40", + X"08",X"3E",X"71",X"01",X"76",X"66",X"D1",X"66",X"40",X"08",X"3E",X"71",X"02",X"1A",X"23",X"4B", + X"5E",X"60",X"F4",X"01",X"ED",X"C6",X"15",X"00",X"04",X"76",X"C6",X"D0",X"D4",X"04",X"66",X"40", + X"08",X"3E",X"71",X"01",X"B3",X"12",X"76",X"06",X"D1",X"D9",X"76",X"0F",X"2F",X"D4",X"01",X"A4", + X"B3",X"27",X"B5",X"26",X"15",X"00",X"04",X"66",X"40",X"08",X"3E",X"D9",X"22",X"00",X"F8",X"26", + X"15",X"20",X"00",X"40",X"D9",X"C0",X"D3",X"89",X"EE",X"D3",X"B5",X"97",X"CB",X"26",X"66",X"B3", + X"09",X"76",X"82",X"D4",X"25",X"02",X"15",X"20",X"00",X"F8",X"C0",X"F8",X"40",X"F8",X"0C",X"F8", + X"40",X"89",X"F6",X"1A",X"07",X"97",X"CB",X"26",X"66",X"15",X"20",X"00",X"4B",X"5E",X"60",X"72", + X"25",X"09",X"33",X"1A",X"1C",X"EE",X"76",X"03",X"90",X"B6",X"EB",X"76",X"82",X"D0",X"F4",X"0F", + X"ED",X"0B",X"D4",X"E9",X"C2",X"A4",X"16",X"28",X"40",X"89",X"F9",X"1A",X"04",X"D4",X"ED",X"1A", + X"F3",X"3E",X"D3",X"DC",X"01",X"B5",X"26",X"15",X"20",X"00",X"F8",X"5E",X"C0",X"F8",X"5E",X"40", + X"F8",X"5E",X"0C",X"F8",X"D3",X"B5",X"15",X"20",X"00",X"B3",X"08",X"76",X"81",X"D6",X"25",X"02", + X"F8",X"40",X"89",X"FC",X"4B",X"02",X"90",X"19",X"F8",X"7D",X"1B",X"B3",X"06",X"D9",X"76",X"81", + X"D2",X"76",X"E7",X"2E",X"A4",X"CF",X"29",X"76",X"61",X"D3",X"4B",X"5E",X"60",X"F4",X"09",X"2C", + X"02",X"25",X"09",X"F8",X"1A",X"0C",X"B3",X"04",X"D9",X"76",X"01",X"D3",X"76",X"ED",X"2E",X"A4", + X"CF",X"29",X"B5",X"B5",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"66",X"A4", + X"1C",X"29",X"A4",X"C1",X"2A",X"76",X"B3",X"D1",X"A4",X"E3",X"1E",X"A4",X"82",X"29",X"A4",X"A8", + X"29",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"B5",X"76",X"B3",X"D5",X"25", + X"05",X"B3",X"05",X"A4",X"74",X"29",X"76",X"D5",X"D5",X"25",X"01",X"23",X"A4",X"74",X"29",X"76", + X"74",X"D5",X"25",X"04",X"B3",X"0A",X"A4",X"74",X"29",X"76",X"33",X"D5",X"25",X"00",X"B3",X"0F", + X"00",X"00",X"00",X"76",X"10",X"D5",X"25",X"03",X"B3",X"10",X"A4",X"74",X"29",X"C0",X"A4",X"74", + X"29",X"76",X"AD",X"D5",X"25",X"05",X"B3",X"06",X"A4",X"74",X"29",X"C0",X"A4",X"74",X"29",X"76", + X"AA",X"D5",X"A4",X"74",X"29",X"C0",X"A4",X"74",X"29",X"76",X"10",X"D5",X"25",X"03",X"B3",X"10", + X"A4",X"74",X"29",X"B5",X"CB",X"66",X"97",X"15",X"20",X"00",X"F8",X"40",X"89",X"FC",X"01",X"3E", + X"DC",X"B5",X"76",X"D5",X"D1",X"71",X"FF",X"15",X"20",X"00",X"40",X"00",X"00",X"00",X"D9",X"76", + X"21",X"60",X"D9",X"71",X"00",X"82",X"D9",X"71",X"01",X"58",X"D9",X"71",X"02",X"AE",X"A4",X"7F", + X"1F",X"D9",X"F8",X"03",X"D9",X"A3",X"04",X"B5",X"A4",X"26",X"1F",X"B3",X"11",X"76",X"4A",X"2F", + X"15",X"0F",X"00",X"5E",X"7D",X"03",X"40",X"89",X"FA",X"D9",X"76",X"33",X"D1",X"B3",X"0F",X"00", + X"00",X"00",X"B3",X"10",X"D9",X"76",X"10",X"D1",X"76",X"50",X"30",X"A4",X"CF",X"29",X"B5",X"26", + X"15",X"20",X"00",X"22",X"D9",X"F8",X"00",X"C0",X"D9",X"40",X"89",X"F7",X"D3",X"B5",X"A4",X"26", + X"1F",X"76",X"B0",X"D2",X"F4",X"12",X"2C",X"07",X"B3",X"06",X"A4",X"32",X"2A",X"1A",X"42",X"F4", + X"0A",X"2C",X"0D",X"B3",X"05",X"15",X"20",X"00",X"0A",X"B6",X"29",X"A4",X"32",X"2A",X"1A",X"31", + X"F4",X"05",X"2C",X"0D",X"B3",X"04",X"15",X"40",X"00",X"0A",X"B6",X"29",X"A4",X"32",X"2A",X"1A", + X"20",X"F4",X"02",X"2C",X"0D",X"B3",X"03",X"15",X"60",X"00",X"0A",X"B6",X"29",X"A4",X"32",X"2A", + X"1A",X"0F",X"F4",X"01",X"2C",X"0B",X"B3",X"02",X"15",X"80",X"00",X"0A",X"B6",X"29",X"A4",X"32", + X"2A",X"B5",X"15",X"20",X"00",X"71",X"63",X"C0",X"71",X"73",X"0A",X"B6",X"29",X"71",X"F0",X"0C", + X"71",X"A3",X"0A",X"B6",X"29",X"89",X"EE",X"B5",X"76",X"4D",X"D2",X"E2",X"76",X"6F",X"60",X"B3", + X"03",X"D9",X"76",X"AD",X"0C",X"E2",X"C0",X"E2",X"69",X"00",X"19",X"C0",X"19",X"C0",X"CE",X"00", + X"D9",X"40",X"A4",X"68",X"2A",X"89",X"EA",X"B5",X"26",X"15",X"20",X"00",X"D9",X"22",X"00",X"F8", + X"C0",X"D9",X"C0",X"D9",X"22",X"00",X"5C",X"F8",X"0A",X"B6",X"29",X"A4",X"91",X"2A",X"F8",X"0C", + X"D9",X"C0",X"D9",X"C0",X"D9",X"22",X"00",X"5C",X"F8",X"15",X"20",X"00",X"0A",X"B6",X"29",X"D3", + X"B5",X"CB",X"E2",X"22",X"00",X"B3",X"F1",X"F4",X"09",X"7D",X"08",X"6E",X"05",X"2C",X"04",X"5C", + X"17",X"1A",X"01",X"65",X"DC",X"B5",X"76",X"4A",X"D2",X"B3",X"03",X"15",X"20",X"00",X"71",X"62", + X"C0",X"71",X"71",X"0A",X"B6",X"29",X"71",X"EF",X"0C",X"71",X"A1",X"0A",X"B6",X"29",X"89",X"EE", + X"B5",X"A4",X"FD",X"21",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"76",X"A6",X"D0",X"15",X"20",X"00",X"25",X"FF",X"D4",X"16",X"66",X"B3", + X"16",X"F8",X"40",X"89",X"FC",X"3E",X"C0",X"9A",X"ED",X"F4",X"B5",X"66",X"26",X"15",X"00",X"04", + X"40",X"71",X"00",X"D3",X"3E",X"B5",X"F7",X"FF",X"03",X"76",X"00",X"D4",X"EE",X"F8",X"C0",X"D0", + X"65",X"8F",X"ED",X"F8",X"B5",X"76",X"0B",X"62",X"15",X"0C",X"00",X"B3",X"0A",X"71",X"00",X"C0", + X"71",X"00",X"C0",X"71",X"00",X"C0",X"71",X"00",X"C0",X"71",X"00",X"40",X"89",X"EF",X"A4",X"C7", + X"1F",X"7A",X"C1",X"54",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"66",X"76",X"AB",X"62",X"71",X"00",X"C0",X"71",X"00",X"C0",X"71",X"00",X"3E",X"7A",X"FC",X"2C", + X"15",X"00",X"04",X"CB",X"FA",X"C0",X"3C",X"C0",X"66",X"CB",X"3E",X"40",X"F8",X"C0",X"F8",X"26", + X"15",X"E0",X"FF",X"40",X"F8",X"0C",X"F8",X"D3",X"3E",X"DC",X"89",X"E7",X"B5",X"76",X"99",X"61", + X"D1",X"22",X"97",X"76",X"A8",X"61",X"B3",X"06",X"6D",X"0F",X"F4",X"00",X"ED",X"07",X"25",X"02", + X"A4",X"50",X"2B",X"1A",X"09",X"F4",X"08",X"ED",X"05",X"25",X"01",X"A4",X"50",X"2B",X"01",X"97", + X"6D",X"07",X"76",X"A2",X"61",X"B3",X"03",X"F4",X"00",X"ED",X"05",X"A4",X"C6",X"2B",X"1A",X"07", + X"F4",X"04",X"ED",X"03",X"A4",X"C6",X"2B",X"01",X"97",X"6D",X"1F",X"76",X"9C",X"61",X"B3",X"03", + X"F4",X"00",X"ED",X"07",X"25",X"00",X"A4",X"50",X"2B",X"1A",X"09",X"F4",X"10",X"ED",X"05",X"25", + X"03",X"A4",X"50",X"2B",X"01",X"B5",X"CB",X"FA",X"C0",X"3C",X"C0",X"66",X"CB",X"3E",X"15",X"E1", + X"FF",X"40",X"22",X"15",X"20",X"00",X"F4",X"7F",X"ED",X"10",X"71",X"7B",X"0C",X"71",X"7A",X"40", + X"71",X"5D",X"C0",X"71",X"78",X"3E",X"DC",X"89",X"DD",X"B5",X"F4",X"83",X"ED",X"0D",X"71",X"7F", + X"0C",X"71",X"7E",X"40",X"71",X"5C",X"C0",X"71",X"7C",X"1A",X"EA",X"F4",X"77",X"ED",X"0D",X"71", + X"83",X"0C",X"71",X"82",X"40",X"71",X"5B",X"C0",X"71",X"80",X"1A",X"D9",X"F4",X"7B",X"ED",X"0D", + X"71",X"77",X"0C",X"71",X"9A",X"40",X"71",X"5E",X"C0",X"71",X"66",X"1A",X"C8",X"F4",X"79",X"ED", + X"04",X"71",X"74",X"1A",X"ED",X"F4",X"7D",X"ED",X"04",X"71",X"79",X"1A",X"AF",X"F4",X"81",X"ED", + X"04",X"71",X"7D",X"1A",X"BB",X"71",X"81",X"1A",X"C8",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1D",X"F4",X"00",X"7D",X"0C",X"F4", + X"02",X"7D",X"0C",X"F4",X"03",X"ED",X"0A",X"71",X"3B",X"1A",X"06",X"71",X"34",X"1A",X"02",X"71", + X"3A",X"CE",X"00",X"B5",X"A4",X"C1",X"2A",X"76",X"26",X"60",X"19",X"FA",X"7D",X"03",X"A4",X"A2", + X"2C",X"76",X"50",X"D1",X"25",X"FF",X"B3",X"0D",X"A4",X"7D",X"1E",X"76",X"50",X"D5",X"25",X"06", + X"B3",X"0D",X"A4",X"7D",X"1E",X"76",X"6D",X"0D",X"D9",X"76",X"50",X"D1",X"B3",X"0D",X"A4",X"CF", + X"29",X"B5",X"EE",X"76",X"21",X"60",X"F8",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"76",X"2B",X"60", + X"B3",X"07",X"15",X"05",X"00",X"EE",X"F8",X"26",X"A4",X"4F",X"2E",X"D3",X"40",X"89",X"F7",X"76", + X"26",X"60",X"66",X"71",X"12",X"C0",X"A4",X"4F",X"2E",X"9E",X"22",X"F4",X"07",X"ED",X"F7",X"3E", + X"71",X"22",X"C0",X"C0",X"A4",X"4F",X"2E",X"9E",X"22",X"F4",X"22",X"ED",X"F7",X"76",X"26",X"60", + X"71",X"00",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"4B",X"65",X"60",X"F4",X"00",X"7D",X"05",X"76", + X"67",X"60",X"1A",X"03",X"76",X"66",X"60",X"D1",X"A4",X"77",X"1D",X"B5",X"97",X"A4",X"C1",X"2A", + X"76",X"71",X"D5",X"B3",X"0A",X"25",X"00",X"A4",X"7D",X"1E",X"0C",X"A4",X"7D",X"1E",X"0C",X"A4", + X"7D",X"1E",X"01",X"F4",X"01",X"7D",X"10",X"EA",X"28",X"B3",X"09",X"D9",X"76",X"90",X"D1",X"76", + X"68",X"0E",X"A4",X"CF",X"29",X"1A",X"32",X"B3",X"0A",X"D9",X"76",X"71",X"D1",X"76",X"71",X"0E", + X"A4",X"CF",X"29",X"B3",X"09",X"D9",X"76",X"8F",X"D1",X"76",X"68",X"0E",X"A4",X"CF",X"29",X"1A", + X"18",X"B3",X"0A",X"D9",X"76",X"71",X"D1",X"76",X"7B",X"0E",X"A4",X"CF",X"29",X"B3",X"09",X"D9", + X"76",X"8F",X"D1",X"76",X"68",X"0E",X"A4",X"CF",X"29",X"B5",X"97",X"4B",X"02",X"90",X"19",X"E9", + X"7D",X"F9",X"01",X"B5",X"76",X"26",X"60",X"71",X"82",X"B3",X"1E",X"25",X"48",X"C0",X"C0",X"C0", + X"A4",X"4F",X"2E",X"F8",X"C0",X"71",X"10",X"0C",X"89",X"F6",X"B3",X"03",X"5A",X"04",X"D4",X"08", + X"F8",X"A4",X"4F",X"2E",X"9A",X"ED",X"F9",X"89",X"F3",X"B3",X"04",X"25",X"58",X"D4",X"18",X"F8", + X"C0",X"71",X"10",X"19",X"6D",X"0C",X"A4",X"4F",X"2E",X"9A",X"ED",X"F3",X"5A",X"04",X"89",X"ED", + X"B3",X"1E",X"F8",X"A4",X"4F",X"2E",X"89",X"FA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"15",X"CE",X"2D",X"26",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"D3",X"76",X"26", + X"60",X"71",X"00",X"A4",X"2F",X"3F",X"B5",X"0C",X"B3",X"02",X"25",X"AF",X"D1",X"21",X"9B",X"12", + X"2E",X"A4",X"4F",X"2E",X"89",X"F6",X"B3",X"04",X"25",X"AF",X"D1",X"21",X"9B",X"12",X"2E",X"C0", + X"D1",X"25",X"D7",X"21",X"9B",X"12",X"2E",X"A4",X"4F",X"2E",X"0C",X"89",X"EB",X"C0",X"B3",X"04", + X"D1",X"21",X"9B",X"12",X"2E",X"A4",X"4F",X"2E",X"89",X"F6",X"B3",X"05",X"A4",X"4F",X"2E",X"89", + X"FB",X"B5",X"D3",X"B5",X"0C",X"B3",X"02",X"EE",X"9E",X"21",X"9B",X"4D",X"2E",X"A4",X"4F",X"2E", + X"89",X"F6",X"B3",X"04",X"EE",X"9E",X"21",X"9B",X"4D",X"2E",X"C0",X"D1",X"25",X"D7",X"21",X"9B", + X"4D",X"2E",X"A4",X"4F",X"2E",X"0C",X"89",X"EC",X"C0",X"B3",X"04",X"D1",X"21",X"9B",X"4D",X"2E", + X"A4",X"4F",X"2E",X"89",X"F6",X"B3",X"05",X"A4",X"4F",X"2E",X"89",X"FB",X"B5",X"D3",X"B5",X"97", + X"66",X"CB",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"DC",X"3E",X"01",X"B5",X"76",X"A4",X"0E",X"A4", + X"26",X"1F",X"19",X"72",X"ED",X"01",X"C0",X"4B",X"B9",X"61",X"21",X"E7",X"9E",X"2E",X"4B",X"65", + X"60",X"F4",X"00",X"7D",X"0C",X"4B",X"02",X"90",X"19",X"EB",X"7D",X"05",X"4B",X"01",X"90",X"1A", + X"03",X"4B",X"00",X"90",X"F4",X"00",X"9B",X"9E",X"2E",X"4B",X"98",X"61",X"76",X"C4",X"61",X"B3", + X"04",X"19",X"02",X"EA",X"02",X"19",X"75",X"F8",X"C0",X"89",X"F6",X"7A",X"CB",X"2E",X"76",X"C4", + X"61",X"B3",X"04",X"B6",X"57",X"6D",X"0F",X"19",X"02",X"5C",X"F4",X"03",X"2C",X"0D",X"F4",X"05", + X"2C",X"0E",X"F4",X"07",X"2C",X"0F",X"25",X"08",X"7A",X"C7",X"2E",X"25",X"01",X"7A",X"C7",X"2E", + X"25",X"02",X"7A",X"C7",X"2E",X"25",X"04",X"F8",X"C0",X"89",X"D8",X"A4",X"31",X"30",X"B5",X"18", + X"19",X"17",X"0D",X"1B",X"0D",X"1D",X"11",X"1D",X"18",X"0D",X"0A",X"22",X"2E",X"1C",X"FF",X"11", + X"12",X"2A",X"1C",X"0C",X"18",X"1B",X"0E",X"0C",X"1B",X"0E",X"0D",X"12",X"1D",X"0F",X"1B",X"0E", + X"0E",X"19",X"1B",X"0E",X"1C",X"0E",X"17",X"1D",X"0E",X"0D",X"0B",X"22",X"2F",X"FF",X"01",X"09", + X"08",X"03",X"FF",X"0F",X"0A",X"15",X"0C",X"18",X"17",X"FF",X"19",X"1E",X"1C",X"11",X"FF",X"19", + X"15",X"0A",X"22",X"0E",X"1B",X"FF",X"0B",X"1E",X"1D",X"1D",X"18",X"17",X"FF",X"18",X"17",X"15", + X"22",X"18",X"1B",X"FF",X"FF",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"FF",X"0B",X"1E",X"1D",X"1D", + X"18",X"17",X"C0",X"AB",X"C1",X"A8",X"A8",X"C1",X"B9",X"C3",X"B2",X"C2",X"AB",X"C0",X"BD",X"C4", + X"C5",X"AF",X"C2",X"B2",X"B9",X"C3",X"BD",X"C4",X"A8",X"C1",X"D9",X"66",X"76",X"0C",X"62",X"19", + X"3C",X"7D",X"13",X"D9",X"76",X"2B",X"60",X"15",X"05",X"00",X"B3",X"04",X"D9",X"19",X"00",X"4E", + X"ED",X"0A",X"D9",X"40",X"89",X"F6",X"19",X"03",X"B3",X"1E",X"1A",X"09",X"19",X"FA",X"74",X"AE", + X"2F",X"ED",X"F3",X"B3",X"48",X"D9",X"3E",X"CB",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"A4",X"5A", + X"2D",X"76",X"0C",X"62",X"19",X"3C",X"74",X"8D",X"2F",X"DC",X"89",X"EB",X"B5",X"3E",X"DC",X"CB", + X"66",X"65",X"F4",X"01",X"ED",X"28",X"76",X"0C",X"62",X"5C",X"F8",X"4B",X"C3",X"61",X"0C",X"F8", + X"25",X"10",X"DE",X"C3",X"61",X"A4",X"AE",X"2F",X"25",X"48",X"D4",X"03",X"1A",X"22",X"97",X"EE", + X"DE",X"60",X"60",X"5C",X"DE",X"99",X"61",X"25",X"0D",X"DE",X"61",X"60",X"01",X"B5",X"BC",X"84", + X"BC",X"84",X"BC",X"84",X"6D",X"0F",X"31",X"72",X"25",X"68",X"5A",X"04",X"89",X"FC",X"D4",X"1C", + X"D9",X"66",X"D9",X"76",X"2B",X"60",X"15",X"05",X"00",X"B3",X"04",X"D9",X"19",X"00",X"4E",X"7D", + X"06",X"D9",X"F8",X"03",X"D9",X"08",X"04",X"D9",X"40",X"89",X"F0",X"D9",X"3E",X"B5",X"FF",X"FF", + X"4B",X"0C",X"62",X"19",X"57",X"ED",X"06",X"A4",X"3F",X"3E",X"7A",X"F8",X"3D",X"66",X"76",X"27", + X"60",X"3C",X"C0",X"22",X"76",X"0C",X"62",X"19",X"12",X"3E",X"7A",X"FB",X"3D",X"D9",X"66",X"D9", + X"76",X"2B",X"60",X"76",X"0C",X"62",X"15",X"05",X"00",X"B3",X"04",X"25",X"48",X"D9",X"19",X"00", + X"4E",X"7D",X"05",X"D9",X"21",X"03",X"7D",X"06",X"D9",X"40",X"89",X"F1",X"19",X"AC",X"D9",X"3E", + X"B5",X"4B",X"0C",X"62",X"19",X"04",X"E6",X"D8",X"46",X"B5",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0C",X"11",X"0A",X"17",X"10",X"0E",X"FF",X"1D",X"18",X"FF",X"20",X"11",X"12",X"1D",X"0E",X"28", + X"FF",X"C2",X"D9",X"76",X"2B",X"60",X"19",X"99",X"19",X"99",X"C8",X"CE",X"00",X"57",X"D9",X"40", + X"D9",X"71",X"00",X"82",X"D9",X"71",X"01",X"58",X"D9",X"71",X"02",X"86",X"D9",X"71",X"03",X"18", + X"D9",X"71",X"04",X"03",X"B5",X"FF",X"FF",X"97",X"66",X"A4",X"26",X"1F",X"5E",X"6D",X"07",X"76", + X"8B",X"0C",X"CE",X"00",X"57",X"40",X"FA",X"76",X"A0",X"30",X"40",X"3C",X"3E",X"01",X"C2",X"B5", + X"94",X"94",X"94",X"94",X"94",X"94",X"94",X"94",X"76",X"0C",X"62",X"19",X"FA",X"7D",X"04",X"19", + X"4A",X"19",X"6E",X"76",X"2B",X"60",X"B5",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"A4", + X"A9",X"34",X"72",X"25",X"75",X"49",X"DE",X"A9",X"60",X"B5",X"B3",X"03",X"4B",X"65",X"60",X"F4", + X"00",X"7D",X"05",X"76",X"A6",X"60",X"1A",X"03",X"76",X"A3",X"60",X"71",X"95",X"C0",X"71",X"6A", + X"C0",X"71",X"0A",X"B5",X"4B",X"65",X"60",X"F4",X"00",X"7D",X"05",X"4B",X"A0",X"60",X"1A",X"03", + X"4B",X"9D",X"60",X"B3",X"07",X"76",X"BD",X"D4",X"CE",X"03",X"F2",X"07",X"3D",X"2C",X"03",X"00", + X"1A",X"01",X"91",X"26",X"15",X"20",X"00",X"40",X"D3",X"89",X"F1",X"B5",X"4B",X"65",X"60",X"F4", + X"00",X"7D",X"05",X"4B",X"A1",X"60",X"1A",X"03",X"4B",X"9E",X"60",X"B3",X"05",X"76",X"DD",X"D5", + X"CE",X"03",X"F2",X"06",X"3D",X"2C",X"03",X"07",X"1A",X"01",X"91",X"26",X"15",X"20",X"00",X"40", + X"D3",X"89",X"F1",X"B5",X"76",X"9F",X"60",X"4B",X"65",X"60",X"F4",X"00",X"7D",X"03",X"76",X"A2", + X"60",X"EE",X"F8",X"B5",X"4B",X"65",X"60",X"F4",X"00",X"7D",X"05",X"4B",X"A2",X"60",X"1A",X"03", + X"4B",X"9F",X"60",X"76",X"BD",X"D6",X"15",X"20",X"00",X"B3",X"03",X"D4",X"05",X"F4",X"00",X"ED", + X"0D",X"A3",X"40",X"A3",X"40",X"A3",X"40",X"A3",X"40",X"A3",X"40",X"A3",X"1A",X"13",X"08",X"40", + X"08",X"F4",X"01",X"7D",X"EF",X"40",X"08",X"40",X"08",X"F4",X"02",X"7D",X"EB",X"40",X"08",X"40", + X"08",X"B5",X"A4",X"63",X"33",X"A4",X"3D",X"3F",X"B3",X"0A",X"CE",X"00",X"E2",X"76",X"91",X"60", + X"E2",X"66",X"E2",X"22",X"01",X"A4",X"C5",X"32",X"E2",X"C0",X"E2",X"C0",X"E2",X"C0",X"E2",X"C0", + X"78",X"25",X"03",X"DD",X"ED",X"EC",X"A4",X"A9",X"34",X"E2",X"3E",X"B3",X"0B",X"CE",X"00",X"32", + X"E2",X"22",X"02",X"A4",X"C5",X"32",X"E2",X"C0",X"E2",X"C0",X"E2",X"C0",X"E2",X"C0",X"78",X"32", + X"5E",X"7D",X"0E",X"32",X"1D",X"F4",X"03",X"ED",X"E7",X"E2",X"76",X"92",X"60",X"CE",X"00",X"1A", + X"DF",X"CE",X"00",X"E2",X"76",X"70",X"60",X"B6",X"57",X"06",X"19",X"18",X"06",X"6D",X"03",X"50", + X"CE",X"00",X"F4",X"01",X"1A",X"32",X"2C",X"10",X"F4",X"03",X"9B",X"68",X"7A",X"30",X"78",X"32", + X"F4",X"0D",X"30",X"A7",X"32",X"7A",X"88",X"32",X"E2",X"3C",X"00",X"4B",X"91",X"60",X"A4",X"C5", + X"32",X"78",X"E2",X"3C",X"01",X"4B",X"95",X"60",X"A4",X"C5",X"32",X"78",X"E2",X"3C",X"02",X"4B", + X"99",X"60",X"A4",X"C5",X"32",X"7A",X"C4",X"32",X"E2",X"3C",X"00",X"4B",X"91",X"60",X"A4",X"C5", + X"32",X"78",X"E2",X"3C",X"02",X"4B",X"95",X"60",X"A4",X"C5",X"32",X"78",X"E2",X"3C",X"01",X"4B", + X"99",X"60",X"A4",X"C5",X"32",X"7A",X"C4",X"32",X"E2",X"3C",X"01",X"4B",X"91",X"60",X"A4",X"C5", + X"32",X"78",X"E2",X"3C",X"00",X"4B",X"95",X"60",X"A4",X"C5",X"32",X"78",X"E2",X"3C",X"02",X"4B", + X"99",X"60",X"A4",X"C5",X"32",X"7A",X"C4",X"32",X"E2",X"3C",X"01",X"4B",X"91",X"60",X"A4",X"C5", + X"32",X"78",X"E2",X"3C",X"02",X"4B",X"95",X"60",X"A4",X"C5",X"32",X"78",X"E2",X"3C",X"00",X"4B", + X"99",X"60",X"A4",X"C5",X"32",X"7A",X"C4",X"32",X"E2",X"3C",X"02",X"4B",X"91",X"60",X"A4",X"C5", + X"32",X"78",X"E2",X"3C",X"00",X"4B",X"95",X"60",X"A4",X"C5",X"32",X"78",X"E2",X"3C",X"01",X"4B", + X"99",X"60",X"A4",X"C5",X"32",X"1A",X"1D",X"E2",X"3C",X"02",X"4B",X"91",X"60",X"A4",X"C5",X"32", + X"78",X"E2",X"3C",X"01",X"4B",X"95",X"60",X"A4",X"C5",X"32",X"78",X"E2",X"3C",X"00",X"4B",X"99", + X"60",X"A4",X"C5",X"32",X"B5",X"97",X"A4",X"79",X"3A",X"A4",X"44",X"34",X"01",X"97",X"CB",X"04", + X"1D",X"A4",X"3B",X"33",X"DC",X"65",X"1A",X"01",X"97",X"CB",X"B3",X"03",X"F4",X"0A",X"ED",X"06", + X"D9",X"76",X"A5",X"0C",X"1A",X"0A",X"F4",X"0B",X"ED",X"09",X"B3",X"01",X"D9",X"76",X"A9",X"0C", + X"26",X"1A",X"0E",X"D9",X"76",X"AD",X"0C",X"26",X"19",X"99",X"19",X"99",X"CE",X"00",X"57",X"00", + X"00",X"D9",X"22",X"00",X"F8",X"15",X"00",X"04",X"66",X"40",X"A3",X"3E",X"D9",X"22",X"01",X"C0", + X"00",X"00",X"00",X"00",X"00",X"F8",X"66",X"40",X"A3",X"3E",X"26",X"15",X"E0",X"FF",X"40",X"D3", + X"D9",X"22",X"02",X"C8",X"F8",X"66",X"40",X"A3",X"3E",X"0C",X"D9",X"22",X"03",X"19",X"42",X"7D", + X"01",X"5C",X"F8",X"66",X"40",X"A3",X"3E",X"D3",X"DC",X"01",X"B5",X"D9",X"66",X"CB",X"F4",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"76",X"02",X"0C",X"1A",X"03",X"00",X"00", + X"00",X"B3",X"00",X"19",X"76",X"D6",X"66",X"D9",X"3E",X"D9",X"24",X"00",X"D9",X"05",X"01",X"DC", + X"D9",X"3E",X"B5",X"B3",X"0C",X"7A",X"B5",X"33",X"66",X"D9",X"3E",X"B6",X"57",X"04",X"BC",X"C3", + X"6D",X"0F",X"19",X"76",X"19",X"76",X"54",X"00",X"A4",X"82",X"33",X"2C",X"EE",X"F8",X"C0",X"89", + X"EA",X"B5",X"66",X"CB",X"47",X"76",X"91",X"60",X"21",X"7D",X"10",X"C0",X"97",X"92",X"5E",X"67", + X"7D",X"03",X"01",X"1A",X"F3",X"01",X"DC",X"3E",X"A8",X"02",X"B5",X"4B",X"3E",X"62",X"5C",X"DE", + X"3E",X"62",X"F4",X"00",X"ED",X"0B",X"DC",X"3E",X"3E",X"B6",X"57",X"DE",X"3E",X"62",X"7A",X"63", + X"33",X"DC",X"3E",X"A8",X"B5",X"76",X"5F",X"60",X"19",X"05",X"ED",X"06",X"76",X"91",X"60",X"7A", + X"68",X"33",X"76",X"91",X"60",X"71",X"04",X"C0",X"71",X"0E",X"00",X"7A",X"ED",X"33",X"FF",X"D9", + X"76",X"6E",X"60",X"4B",X"65",X"60",X"F4",X"00",X"ED",X"05",X"D9",X"D1",X"00",X"1A",X"03",X"D9", + X"D1",X"01",X"B5",X"76",X"E7",X"D0",X"A4",X"25",X"34",X"A4",X"00",X"22",X"B5",X"C0",X"71",X"10", + X"C0",X"71",X"02",X"C0",X"71",X"03",X"C0",X"71",X"00",X"C0",X"71",X"08",X"C0",X"71",X"01",X"C0", + X"71",X"0C",X"C0",X"71",X"09",X"C0",X"71",X"0F",X"C0",X"71",X"0A",X"B5",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"D4",X"00",X"25",X"33",X"15",X"00",X"04",X"B3",X"0A",X"CB",X"B3", + X"0A",X"F8",X"66",X"40",X"08",X"3E",X"C0",X"C0",X"89",X"F7",X"26",X"15",X"2C",X"00",X"40",X"D3", + X"DC",X"89",X"EB",X"B5",X"04",X"00",X"B5",X"3F",X"7D",X"5E",X"F4",X"64",X"7D",X"5A",X"F4",X"07", + X"2C",X"24",X"F4",X"09",X"7D",X"20",X"F4",X"31",X"7D",X"1C",X"F4",X"3A",X"7D",X"18",X"F4",X"3C", + X"7D",X"14",X"F4",X"43",X"7D",X"10",X"F4",X"5A",X"7D",X"0C",X"F4",X"6B",X"7D",X"08",X"F4",X"6D", + X"7D",X"04",X"F4",X"6E",X"ED",X"03",X"77",X"1A",X"2E",X"F4",X"18",X"7D",X"28",X"F4",X"1C",X"7D", + X"24",X"F4",X"2C",X"7D",X"20",X"F4",X"3A",X"7D",X"1C",X"F4",X"3B",X"7D",X"18",X"F4",X"3E",X"7D", + X"14",X"F4",X"56",X"7D",X"10",X"F4",X"6A",X"7D",X"0C",X"F4",X"6C",X"7D",X"08",X"F4",X"6F",X"7D", + X"04",X"F4",X"70",X"ED",X"02",X"77",X"77",X"77",X"B5",X"A4",X"26",X"1F",X"F4",X"01",X"ED",X"04", + X"25",X"02",X"1A",X"1A",X"F4",X"05",X"EA",X"04",X"25",X"03",X"1A",X"12",X"F4",X"0A",X"EA",X"04", + X"25",X"04",X"1A",X"0A",X"F4",X"11",X"EA",X"04",X"25",X"05",X"1A",X"02",X"25",X"06",X"B5",X"FF", + X"66",X"26",X"CB",X"76",X"AB",X"62",X"4B",X"65",X"60",X"5F",X"ED",X"09",X"19",X"3C",X"ED",X"29", + X"15",X"66",X"60",X"1A",X"07",X"19",X"FA",X"ED",X"20",X"15",X"67",X"60",X"4B",X"02",X"90",X"6D", + X"04",X"25",X"02",X"ED",X"02",X"25",X"03",X"D9",X"21",X"00",X"ED",X"0D",X"19",X"5A",X"7B",X"5C", + X"18",X"76",X"01",X"60",X"19",X"54",X"A4",X"77",X"1D",X"DC",X"D3",X"3E",X"A4",X"06",X"1E",X"B5", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"A4",X"26",X"1F",X"76",X"AA",X"60",X"7A",X"7E",X"22",X"FF",X"FF",X"FF",X"FF", + X"FF",X"F4",X"06",X"EA",X"04",X"71",X"04",X"1A",X"02",X"71",X"02",X"22",X"C0",X"F8",X"B5",X"76", + X"5F",X"60",X"19",X"05",X"9B",X"29",X"36",X"45",X"D8",X"61",X"4B",X"27",X"60",X"6D",X"0F",X"F4", + X"08",X"ED",X"13",X"4B",X"28",X"60",X"6D",X"0F",X"F4",X"06",X"ED",X"0A",X"C0",X"22",X"F4",X"FF", + X"ED",X"01",X"0C",X"37",X"D8",X"61",X"22",X"1A",X"17",X"4B",X"65",X"60",X"F4",X"00",X"7D",X"0C", + X"4B",X"02",X"90",X"19",X"EB",X"7D",X"05",X"4B",X"01",X"90",X"1A",X"03",X"4B",X"00",X"90",X"8B", + X"6D",X"0F",X"31",X"F4",X"01",X"7D",X"0B",X"F4",X"02",X"7D",X"07",X"F4",X"04",X"7D",X"03",X"F4", + X"08",X"F9",X"48",X"4B",X"5F",X"60",X"19",X"B8",X"9B",X"C1",X"36",X"4B",X"27",X"60",X"6D",X"0F", + X"F4",X"08",X"9B",X"43",X"49",X"4B",X"28",X"60",X"6D",X"0F",X"F4",X"06",X"F3",X"4B",X"49",X"26", + X"EE",X"DE",X"E0",X"61",X"7A",X"CE",X"36",X"19",X"02",X"DD",X"F3",X"1E",X"38",X"76",X"27",X"60", + X"6D",X"0A",X"7D",X"1E",X"22",X"6D",X"0F",X"F4",X"08",X"2C",X"03",X"9E",X"1A",X"01",X"D1",X"C0", + X"19",X"E8",X"ED",X"07",X"9E",X"25",X"02",X"DE",X"98",X"61",X"B5",X"D1",X"25",X"08",X"DE",X"98", + X"61",X"B5",X"C0",X"22",X"6D",X"0F",X"F4",X"07",X"2C",X"03",X"9E",X"1A",X"01",X"D1",X"0C",X"19", + X"29",X"7D",X"07",X"D1",X"25",X"04",X"DE",X"98",X"61",X"B5",X"9E",X"25",X"01",X"DE",X"98",X"61", + X"B5",X"26",X"EE",X"DE",X"E0",X"61",X"4B",X"98",X"61",X"6D",X"0A",X"F3",X"6E",X"37",X"4B",X"27", + X"60",X"72",X"4B",X"28",X"60",X"A4",X"DA",X"36",X"1A",X"1B",X"6E",X"36",X"19",X"02",X"19",X"02", + X"19",X"02",X"19",X"02",X"19",X"99",X"76",X"E4",X"0D",X"CE",X"00",X"57",X"40",X"69",X"C0",X"0D", + X"25",X"08",X"D4",X"10",X"B5",X"19",X"4B",X"19",X"9D",X"2C",X"03",X"C8",X"1A",X"F7",X"A4",X"03", + X"37",X"1A",X"03",X"33",X"02",X"B5",X"7D",X"06",X"2C",X"08",X"19",X"30",X"1A",X"ED",X"E9",X"EB", + X"1A",X"0D",X"E9",X"19",X"C0",X"19",X"18",X"82",X"19",X"C0",X"19",X"18",X"EA",X"F9",X"EB",X"4B", + X"27",X"60",X"32",X"D9",X"76",X"96",X"61",X"E0",X"6E",X"06",X"48",X"32",X"DD",X"EA",X"33",X"32", + X"1D",X"6E",X"02",X"48",X"32",X"DD",X"EA",X"25",X"32",X"92",X"5A",X"06",X"57",X"32",X"4C",X"2C", + X"17",X"32",X"6A",X"5A",X"02",X"57",X"32",X"4C",X"1C",X"0A",X"38",X"D9",X"1F",X"00",X"66",X"76", + X"E0",X"61",X"19",X"54",X"3E",X"7A",X"0A",X"38",X"D9",X"1F",X"00",X"1A",X"08",X"D9",X"C1",X"00", + X"1A",X"EC",X"D9",X"C1",X"00",X"4B",X"28",X"60",X"D9",X"F8",X"01",X"7A",X"06",X"38",X"4B",X"28", + X"60",X"72",X"4B",X"27",X"60",X"A4",X"7A",X"37",X"1A",X"1B",X"6E",X"08",X"19",X"02",X"19",X"02", + X"19",X"02",X"19",X"02",X"19",X"99",X"76",X"FA",X"0D",X"CE",X"00",X"57",X"40",X"69",X"C0",X"0D", + X"25",X"36",X"D4",X"10",X"B5",X"19",X"4B",X"19",X"9D",X"2C",X"03",X"C8",X"1A",X"F7",X"A4",X"03", + X"37",X"7D",X"06",X"2C",X"08",X"19",X"30",X"1A",X"F2",X"E9",X"EB",X"1A",X"0D",X"E9",X"19",X"C0", + X"19",X"18",X"82",X"19",X"C0",X"19",X"18",X"EA",X"F9",X"EB",X"4B",X"28",X"60",X"32",X"D9",X"76", + X"96",X"61",X"E0",X"6E",X"05",X"48",X"32",X"DD",X"EA",X"33",X"32",X"1D",X"6E",X"03",X"48",X"32", + X"DD",X"EA",X"25",X"32",X"92",X"5A",X"05",X"57",X"32",X"4C",X"2C",X"17",X"32",X"6A",X"5A",X"03", + X"57",X"32",X"4C",X"1C",X"0A",X"38",X"D9",X"1F",X"01",X"66",X"76",X"E0",X"61",X"19",X"5A",X"3E", + X"7A",X"0A",X"38",X"D9",X"1F",X"01",X"1A",X"08",X"D9",X"C1",X"01",X"1A",X"EC",X"D9",X"C1",X"01", + X"4B",X"27",X"60",X"D9",X"F8",X"00",X"D3",X"7A",X"8C",X"38",X"D3",X"76",X"5F",X"60",X"19",X"21", + X"4B",X"26",X"60",X"19",X"02",X"19",X"02",X"19",X"02",X"19",X"02",X"DD",X"7D",X"0F",X"1D",X"19", + X"99",X"19",X"99",X"19",X"99",X"19",X"99",X"FE",X"02",X"DE",X"26",X"60",X"B5",X"25",X"05",X"A0", + X"7D",X"0A",X"4B",X"98",X"61",X"6D",X"05",X"9B",X"69",X"38",X"1A",X"08",X"4B",X"98",X"61",X"6D", + X"0A",X"9B",X"69",X"38",X"D9",X"76",X"27",X"60",X"1D",X"F4",X"02",X"2C",X"0B",X"7D",X"0E",X"F4", + X"04",X"7D",X"0F",X"D9",X"D1",X"01",X"1A",X"0D",X"D9",X"9E",X"00",X"1A",X"08",X"D9",X"9E",X"01", + X"1A",X"03",X"D9",X"D1",X"00",X"DE",X"98",X"61",X"B5",X"4B",X"E0",X"61",X"F4",X"00",X"31",X"19", + X"72",X"7D",X"0D",X"76",X"28",X"60",X"4B",X"97",X"61",X"21",X"2C",X"02",X"D1",X"B5",X"9E",X"B5", + X"76",X"27",X"60",X"4B",X"96",X"61",X"21",X"2C",X"F5",X"7A",X"7C",X"38",X"76",X"5F",X"60",X"19", + X"F4",X"4B",X"26",X"60",X"19",X"02",X"19",X"02",X"19",X"02",X"19",X"02",X"DD",X"F3",X"1E",X"38", + X"E2",X"76",X"26",X"60",X"D9",X"76",X"96",X"61",X"4B",X"28",X"60",X"D9",X"21",X"01",X"ED",X"36", + X"4B",X"27",X"60",X"D9",X"21",X"00",X"ED",X"07",X"A4",X"0D",X"39",X"1C",X"44",X"38",X"B5",X"4B", + X"27",X"60",X"D9",X"21",X"00",X"2C",X"10",X"25",X"05",X"A0",X"F3",X"44",X"38",X"A4",X"0D",X"39", + X"84",X"E2",X"9E",X"01",X"7A",X"44",X"38",X"25",X"05",X"A0",X"ED",X"F8",X"A4",X"0D",X"39",X"84", + X"E2",X"D1",X"01",X"7A",X"D4",X"38",X"E2",X"22",X"02",X"D9",X"21",X"01",X"2C",X"0F",X"25",X"0A", + X"A0",X"ED",X"E1",X"A4",X"0D",X"39",X"84",X"E2",X"9E",X"02",X"7A",X"D4",X"38",X"25",X"0A",X"A0", + X"ED",X"D2",X"A4",X"0D",X"39",X"84",X"E2",X"D1",X"02",X"7A",X"D4",X"38",X"B5",X"D9",X"76",X"96", + X"61",X"D9",X"22",X"00",X"19",X"02",X"19",X"02",X"19",X"02",X"19",X"02",X"19",X"99",X"57",X"19", + X"99",X"6B",X"B3",X"00",X"04",X"76",X"A2",X"0D",X"D6",X"D9",X"22",X"01",X"19",X"02",X"19",X"02", + X"19",X"02",X"19",X"02",X"6E",X"03",X"57",X"19",X"02",X"04",X"D6",X"22",X"19",X"8D",X"7D",X"0B", + X"19",X"02",X"19",X"02",X"19",X"02",X"19",X"02",X"7A",X"4D",X"39",X"6D",X"0F",X"57",X"A0",X"F3", + X"54",X"39",X"A8",X"B5",X"0A",X"B5",X"45",X"99",X"61",X"C0",X"37",X"99",X"61",X"92",X"6D",X"08", + X"F4",X"08",X"25",X"01",X"7D",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"25",X"02",X"B3",X"06",X"D9",X"76",X"A8",X"61",X"15",X"00", + X"04",X"D9",X"24",X"00",X"D9",X"C0",X"D9",X"05",X"00",X"D9",X"C0",X"04",X"EE",X"16",X"C2",X"7D", + X"0D",X"40",X"F8",X"C0",X"F8",X"26",X"15",X"E0",X"FF",X"40",X"D3",X"F8",X"0C",X"F8",X"89",X"E1", + X"B5",X"76",X"AA",X"60",X"9E",X"F3",X"48",X"3A",X"76",X"63",X"60",X"9E",X"ED",X"07",X"71",X"03", + X"76",X"00",X"60",X"19",X"6D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"76",X"61",X"60",X"D1",X"22",X"F4",X"17",X"ED",X"0F", + X"71",X"00",X"76",X"60",X"60",X"D1",X"22",X"F4",X"04",X"ED",X"16",X"71",X"00",X"1A",X"12",X"F4", + X"0C",X"ED",X"0E",X"4B",X"60",X"60",X"F4",X"00",X"ED",X"07",X"4B",X"62",X"60",X"8B",X"DE",X"62", + X"60",X"4B",X"AB",X"60",X"DE",X"AA",X"60",X"4B",X"60",X"60",X"F4",X"00",X"ED",X"3A",X"4B",X"61", + X"60",X"F4",X"01",X"7D",X"1B",X"F4",X"0C",X"ED",X"2F",X"B3",X"04",X"15",X"05",X"00",X"A4",X"A8", + X"30",X"19",X"3C",X"ED",X"05",X"40",X"89",X"F9",X"1A",X"1E",X"19",X"03",X"19",X"54",X"1A",X"18", + X"B3",X"04",X"15",X"05",X"00",X"76",X"2B",X"60",X"19",X"3C",X"ED",X"05",X"40",X"89",X"F9",X"1A", + X"07",X"66",X"76",X"00",X"60",X"19",X"55",X"3E",X"76",X"CA",X"61",X"9E",X"76",X"B6",X"61",X"9E", + X"C0",X"ED",X"22",X"0C",X"71",X"3C",X"C0",X"66",X"C0",X"D1",X"B3",X"04",X"76",X"CE",X"61",X"EE", + X"21",X"7D",X"01",X"9E",X"C0",X"89",X"F9",X"76",X"E1",X"61",X"21",X"7D",X"01",X"9E",X"3E",X"22", + X"F4",X"F0",X"EA",X"01",X"D1",X"C0",X"C0",X"9E",X"B5",X"66",X"26",X"97",X"1D",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"76",X"7A",X"0D", + X"01",X"57",X"CE",X"00",X"40",X"22",X"D3",X"3E",X"B5",X"4B",X"C9",X"61",X"6D",X"FF",X"7D",X"03", + X"7A",X"F9",X"3A",X"4B",X"26",X"60",X"19",X"02",X"19",X"02",X"19",X"02",X"19",X"02",X"76",X"98", + X"61",X"21",X"F9",X"F4",X"02",X"E7",X"98",X"3B",X"9B",X"61",X"3B",X"F4",X"04",X"9B",X"2E",X"3B", + X"4B",X"27",X"60",X"6E",X"04",X"48",X"4B",X"28",X"60",X"00",X"57",X"A4",X"0A",X"3C",X"3C",X"38", + X"A4",X"0A",X"3C",X"22",X"33",X"7D",X"21",X"65",X"F4",X"36",X"ED",X"05",X"C0",X"EE",X"7A",X"CA", + X"3B",X"7C",X"1D",X"5A",X"08",X"48",X"A4",X"0A",X"3C",X"25",X"35",X"21",X"F9",X"26",X"15",X"20", + X"00",X"40",X"D3",X"25",X"01",X"7A",X"CA",X"3B",X"B5",X"45",X"CB",X"61",X"4B",X"C9",X"61",X"32", + X"EE",X"DE",X"C9",X"61",X"32",X"F4",X"02",X"7D",X"0A",X"2C",X"0C",X"F4",X"03",X"7D",X"0C",X"25", + X"06",X"1A",X"0A",X"25",X"07",X"1A",X"06",X"25",X"05",X"1A",X"02",X"25",X"04",X"A4",X"EA",X"3B", + X"A4",X"EB",X"22",X"A4",X"7B",X"46",X"76",X"5F",X"60",X"19",X"12",X"7A",X"A3",X"3A",X"4B",X"27", + X"60",X"5A",X"05",X"48",X"4B",X"28",X"60",X"5A",X"05",X"57",X"A4",X"0A",X"3C",X"22",X"78",X"A4", + X"0A",X"3C",X"21",X"7D",X"1B",X"25",X"3E",X"21",X"ED",X"05",X"25",X"03",X"7A",X"CA",X"3B",X"6A", + X"6E",X"08",X"57",X"A4",X"0A",X"3C",X"25",X"3D",X"21",X"F9",X"0C",X"25",X"02",X"7A",X"CA",X"3B", + X"B5",X"4B",X"27",X"60",X"5A",X"04",X"48",X"4B",X"28",X"60",X"6E",X"04",X"57",X"A4",X"0A",X"3C", + X"22",X"38",X"A4",X"0A",X"3C",X"21",X"7D",X"1F",X"25",X"35",X"21",X"ED",X"0A",X"26",X"15",X"20", + X"00",X"40",X"D3",X"EE",X"7A",X"CA",X"3B",X"1D",X"6E",X"08",X"48",X"A4",X"0A",X"3C",X"25",X"36", + X"21",X"F9",X"25",X"01",X"7A",X"CA",X"3B",X"B5",X"7A",X"80",X"00",X"5C",X"48",X"4B",X"28",X"60", + X"6E",X"03",X"57",X"A4",X"0A",X"3C",X"22",X"2A",X"A4",X"0A",X"3C",X"21",X"7D",X"1B",X"25",X"3D", + X"21",X"ED",X"06",X"0C",X"25",X"03",X"7A",X"CA",X"3B",X"6A",X"5A",X"08",X"57",X"A4",X"0A",X"3C", + X"25",X"3E",X"21",X"F9",X"25",X"02",X"7A",X"CA",X"3B",X"B5",X"32",X"4B",X"C9",X"61",X"F4",X"00", + X"F3",X"F9",X"3A",X"32",X"72",X"5C",X"DE",X"C9",X"61",X"65",X"37",X"CB",X"61",X"32",X"25",X"01", + X"DE",X"CA",X"61",X"32",X"A4",X"EA",X"3B",X"7A",X"FE",X"3B",X"7A",X"8A",X"56",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"A4",X"EB", + X"22",X"A4",X"7B",X"46",X"76",X"5F",X"60",X"19",X"12",X"B5",X"97",X"CB",X"1D",X"6D",X"F8",X"B3", + X"00",X"04",X"19",X"76",X"19",X"89",X"19",X"76",X"19",X"89",X"76",X"A0",X"D0",X"D6",X"6A",X"19", + X"02",X"19",X"02",X"19",X"02",X"B3",X"00",X"04",X"D6",X"DC",X"01",X"B5",X"66",X"76",X"5F",X"60", + X"19",X"05",X"F3",X"AE",X"3C",X"26",X"4B",X"65",X"60",X"F4",X"00",X"ED",X"05",X"4B",X"9F",X"60", + X"1A",X"03",X"4B",X"A2",X"60",X"32",X"76",X"10",X"0E",X"EE",X"4C",X"ED",X"15",X"32",X"B3",X"00", + X"04",X"D6",X"22",X"19",X"99",X"19",X"99",X"19",X"99",X"19",X"99",X"B3",X"00",X"D4",X"00",X"48", + X"1A",X"10",X"38",X"19",X"C0",X"19",X"C0",X"CE",X"00",X"40",X"32",X"57",X"40",X"B3",X"00",X"FA", + X"CE",X"00",X"4B",X"65",X"60",X"F4",X"00",X"ED",X"06",X"D9",X"76",X"68",X"60",X"1A",X"04",X"D9", + X"76",X"6B",X"60",X"D9",X"22",X"02",X"EC",X"99",X"D9",X"F8",X"02",X"D9",X"22",X"01",X"C3",X"99", + X"D9",X"F8",X"01",X"D9",X"22",X"00",X"56",X"99",X"D9",X"F8",X"00",X"4B",X"65",X"60",X"F4",X"00", + X"ED",X"05",X"76",X"C4",X"D2",X"1A",X"03",X"76",X"C3",X"D2",X"A4",X"D0",X"34",X"D3",X"3E",X"B5", + X"66",X"26",X"CB",X"76",X"44",X"60",X"15",X"FB",X"FF",X"B3",X"06",X"EE",X"19",X"FA",X"7D",X"04", + X"A8",X"7A",X"C5",X"3C",X"0A",X"BA",X"40",X"89",X"F3",X"DC",X"D3",X"3E",X"B5",X"CB",X"26",X"66", + X"B3",X"09",X"15",X"05",X"00",X"76",X"21",X"60",X"19",X"03",X"19",X"4A",X"40",X"89",X"F9",X"D9", + X"66",X"E2",X"66",X"97",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"01",X"E2",X"3E",X"D9",X"3E",X"3E", + X"D3",X"DC",X"B5",X"D9",X"76",X"43",X"0D",X"B3",X"14",X"F2",X"00",X"D9",X"24",X"00",X"D9",X"05", + X"01",X"22",X"F4",X"36",X"ED",X"03",X"0A",X"1A",X"01",X"A8",X"19",X"C7",X"19",X"18",X"19",X"15", + X"D9",X"0C",X"D9",X"0C",X"89",X"E5",X"4B",X"65",X"60",X"F4",X"00",X"ED",X"05",X"76",X"A3",X"60", + X"1A",X"03",X"76",X"A6",X"60",X"07",X"C0",X"91",X"C0",X"08",X"B5",X"66",X"D4",X"02",X"B3",X"03", + X"15",X"02",X"0C",X"7B",X"C7",X"3A",X"F3",X"3E",X"3D",X"7B",X"16",X"9B",X"64",X"3D",X"C7",X"89", + X"F2",X"9A",X"B3",X"03",X"7B",X"C7",X"3A",X"F3",X"4F",X"3D",X"7B",X"16",X"9B",X"64",X"3D",X"C7", + X"89",X"F2",X"D4",X"03",X"00",X"7A",X"64",X"3D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"B3",X"00",X"D9",X"76",X"58",X"0E",X"19",X"76",X"19",X"76",X"D9",X"D6", + X"D9",X"22",X"00",X"F8",X"66",X"15",X"00",X"04",X"40",X"71",X"02",X"3E",X"C0",X"D9",X"22",X"01", + X"F8",X"66",X"40",X"71",X"00",X"3E",X"26",X"15",X"E0",X"FF",X"40",X"D3",X"D9",X"22",X"02",X"F8", + X"66",X"40",X"71",X"00",X"3E",X"0C",X"D9",X"22",X"03",X"F8",X"40",X"71",X"00",X"3E",X"B5",X"66", + X"45",X"99",X"61",X"E0",X"F4",X"00",X"ED",X"09",X"92",X"F4",X"1F",X"2C",X"08",X"F4",X"B4",X"2C", + X"08",X"F2",X"01",X"1A",X"06",X"F2",X"03",X"1A",X"02",X"F2",X"02",X"3E",X"B5",X"26",X"25",X"DA", + X"32",X"4B",X"65",X"60",X"F4",X"00",X"ED",X"05",X"4B",X"9F",X"60",X"1A",X"03",X"4B",X"A2",X"60", + X"F4",X"00",X"7D",X"0D",X"F4",X"03",X"7D",X"06",X"72",X"32",X"23",X"17",X"1A",X"02",X"25",X"DD", + X"F8",X"D9",X"76",X"26",X"60",X"D9",X"19",X"00",X"86",X"D9",X"19",X"00",X"8E",X"D9",X"76",X"49", + X"60",X"D9",X"71",X"00",X"82",X"7A",X"F0",X"2F",X"25",X"09",X"C8",X"D9",X"F8",X"02",X"D9",X"A3", + X"01",X"D9",X"71",X"04",X"03",X"6A",X"F4",X"02",X"2C",X"0E",X"7D",X"06",X"D9",X"71",X"03",X"E0", + X"1A",X"0A",X"D9",X"71",X"03",X"DC",X"1A",X"04",X"D9",X"71",X"03",X"D8",X"66",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"A4",X"4A",X"2F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"EE",X"DE",X"49",X"60",X"76",X"26",X"60",X"19",X"54",X"3E",X"71",X"FF",X"D3",X"B5",X"66", + X"26",X"15",X"A0",X"D0",X"0A",X"B6",X"29",X"47",X"25",X"E0",X"E5",X"EB",X"B3",X"02",X"19",X"5C", + X"19",X"38",X"89",X"FA",X"43",X"19",X"76",X"19",X"76",X"19",X"76",X"D3",X"3E",X"B5",X"66",X"CE", + X"00",X"F4",X"5E",X"7D",X"2F",X"78",X"F4",X"5B",X"7D",X"2A",X"78",X"F4",X"59",X"7D",X"25",X"78", + X"F4",X"5A",X"7D",X"20",X"78",X"F4",X"5C",X"ED",X"0A",X"C0",X"22",X"F4",X"66",X"2C",X"15",X"78", + X"78",X"1A",X"11",X"78",X"F4",X"5D",X"7D",X"0C",X"78",X"78",X"F4",X"5F",X"7D",X"06",X"78",X"F4", + X"60",X"7D",X"01",X"78",X"3E",X"B5",X"F4",X"03",X"7D",X"05",X"F4",X"02",X"7D",X"12",X"B5",X"4B", + X"65",X"60",X"F4",X"00",X"ED",X"05",X"76",X"9D",X"60",X"1A",X"16",X"76",X"A0",X"60",X"1A",X"11", + X"4B",X"65",X"60",X"F4",X"00",X"ED",X"05",X"76",X"9E",X"60",X"1A",X"3E",X"76",X"A1",X"60",X"1A", + X"39",X"1D",X"F4",X"00",X"ED",X"04",X"19",X"AA",X"1A",X"2E",X"F4",X"01",X"ED",X"04",X"19",X"AC", + X"1A",X"26",X"F4",X"02",X"ED",X"04",X"19",X"03",X"1A",X"1E",X"F4",X"03",X"ED",X"04",X"19",X"4A", + X"1A",X"16",X"F4",X"04",X"ED",X"04",X"19",X"12",X"1A",X"0E",X"F4",X"05",X"ED",X"04",X"19",X"CD", + X"1A",X"06",X"F4",X"06",X"ED",X"02",X"19",X"11",X"1A",X"2F",X"1D",X"F4",X"00",X"ED",X"04",X"19", + X"CD",X"1A",X"1E",X"F4",X"01",X"ED",X"04",X"19",X"03",X"1A",X"16",X"F4",X"07",X"ED",X"04",X"19", + X"4A",X"1A",X"0E",X"F4",X"08",X"ED",X"04",X"19",X"AC",X"1A",X"06",X"F4",X"09",X"ED",X"02",X"19", + X"12",X"0C",X"66",X"A4",X"1C",X"31",X"3E",X"1A",X"05",X"66",X"A4",X"F4",X"30",X"3E",X"B5",X"A4", + X"C7",X"1F",X"A4",X"8F",X"17",X"4B",X"03",X"60",X"F4",X"00",X"ED",X"F3",X"B5",X"E2",X"76",X"9C", + X"61",X"D9",X"76",X"91",X"60",X"A4",X"35",X"40",X"D9",X"76",X"92",X"60",X"A4",X"35",X"40",X"D9", + X"76",X"93",X"60",X"A4",X"35",X"40",X"D9",X"76",X"94",X"60",X"A4",X"35",X"40",X"B5",X"F5",X"D1", + X"32",X"72",X"25",X"06",X"49",X"7D",X"13",X"72",X"32",X"19",X"99",X"CE",X"00",X"57",X"76",X"A8", + X"61",X"40",X"71",X"00",X"C0",X"71",X"00",X"C0",X"89",X"F8",X"B5",X"D9",X"66",X"97",X"26",X"65", + X"F4",X"0A",X"2C",X"12",X"7D",X"0A",X"F4",X"0B",X"ED",X"2D",X"D9",X"76",X"A8",X"61",X"1A",X"0A", + X"D9",X"76",X"A2",X"61",X"1A",X"04",X"D9",X"76",X"9C",X"61",X"D9",X"22",X"01",X"F4",X"00",X"7D", + X"10",X"D9",X"C0",X"D9",X"C0",X"D9",X"66",X"15",X"B4",X"61",X"6A",X"D3",X"4C",X"7D",X"08",X"1A", + X"E9",X"D9",X"1F",X"00",X"D9",X"C1",X"01",X"D3",X"01",X"D9",X"3E",X"B5",X"97",X"CB",X"66",X"EE", + X"B3",X"18",X"76",X"9C",X"61",X"F8",X"C0",X"89",X"FC",X"3E",X"DC",X"01",X"B5",X"76",X"02",X"90", + X"19",X"24",X"7D",X"10",X"76",X"00",X"A0",X"4B",X"65",X"60",X"F4",X"00",X"ED",X"04",X"19",X"03", + X"1A",X"02",X"19",X"5A",X"B5",X"97",X"CB",X"26",X"B3",X"0C",X"15",X"9C",X"61",X"7B",X"3A",X"ED", + X"06",X"C7",X"7B",X"9D",X"16",X"7D",X"06",X"C7",X"C7",X"89",X"F2",X"1A",X"04",X"EE",X"18",X"C7"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_cpu3.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_cpu3.vhd new file mode 100644 index 00000000..fd2fc3ed --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_cpu3.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_cpu3 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 prom of rom_cpu3 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"18",X"D3",X"DC",X"01",X"B5",X"B3",X"06",X"D9",X"76",X"A8",X"61",X"D9",X"22",X"01",X"F4",X"00", + X"7D",X"1C",X"D9",X"24",X"00",X"D9",X"05",X"01",X"D9",X"66",X"CB",X"A4",X"2B",X"3D",X"00",X"00", + X"76",X"A9",X"60",X"D1",X"DC",X"D9",X"3E",X"EE",X"D9",X"F8",X"00",X"D9",X"F8",X"01",X"D9",X"C0", + X"D9",X"C0",X"89",X"D7",X"B5",X"EE",X"B3",X"03",X"D9",X"FA",X"00",X"A4",X"3B",X"33",X"E2",X"1F", + X"00",X"E2",X"C0",X"E2",X"C1",X"00",X"E2",X"C0",X"5C",X"D9",X"C0",X"D9",X"C0",X"D9",X"C0",X"D9", + X"C0",X"89",X"E5",X"B5",X"B3",X"0C",X"D9",X"76",X"9C",X"61",X"D9",X"22",X"01",X"F4",X"00",X"7D", + X"16",X"D9",X"24",X"00",X"D9",X"05",X"01",X"D9",X"66",X"CB",X"A4",X"2B",X"3D",X"DC",X"D9",X"3E", + X"EE",X"D9",X"F8",X"00",X"D9",X"F8",X"01",X"D9",X"C0",X"D9",X"C0",X"89",X"DD",X"B5",X"4B",X"B4", + X"61",X"6D",X"0F",X"9B",X"A4",X"40",X"76",X"21",X"60",X"19",X"4A",X"19",X"03",X"B3",X"04",X"76", + X"2B",X"60",X"15",X"05",X"00",X"3D",X"1C",X"9D",X"40",X"19",X"03",X"19",X"4A",X"40",X"89",X"F5", + X"EE",X"DE",X"B4",X"61",X"A4",X"F8",X"40",X"A4",X"B0",X"3C",X"6D",X"0F",X"7D",X"1D",X"A4",X"5C", + X"2E",X"A4",X"CC",X"40",X"B3",X"04",X"76",X"2B",X"60",X"7A",X"C2",X"40",X"26",X"15",X"05",X"00", + X"40",X"D3",X"19",X"FA",X"7D",X"03",X"A4",X"BA",X"42",X"89",X"F1",X"B5",X"4B",X"C3",X"61",X"72", + X"19",X"8B",X"19",X"8B",X"19",X"8B",X"19",X"8B",X"57",X"19",X"AE",X"ED",X"10",X"19",X"80",X"ED", + X"08",X"19",X"F6",X"7D",X"12",X"25",X"CC",X"1A",X"06",X"25",X"80",X"1A",X"02",X"25",X"33",X"76", + X"B5",X"61",X"03",X"F8",X"EA",X"01",X"7C",X"B5",X"A4",X"26",X"1F",X"76",X"A6",X"0E",X"F4",X"33", + X"E7",X"05",X"41",X"25",X"32",X"57",X"CE",X"00",X"40",X"69",X"76",X"D8",X"0E",X"4B",X"02",X"90", + X"19",X"04",X"ED",X"03",X"76",X"E8",X"0E",X"4B",X"B7",X"61",X"19",X"02",X"19",X"02",X"19",X"02", + X"19",X"02",X"6B",X"F4",X"10",X"2C",X"02",X"25",X"0F",X"57",X"40",X"22",X"DE",X"C3",X"61",X"B5", + X"19",X"72",X"ED",X"1B",X"19",X"04",X"ED",X"2A",X"19",X"48",X"ED",X"39",X"25",X"02",X"6B",X"57", + X"A4",X"0A",X"3C",X"22",X"F4",X"35",X"7D",X"3F",X"F4",X"37",X"7D",X"3B",X"7A",X"85",X"41",X"1D", + X"6E",X"01",X"48",X"A4",X"0A",X"3C",X"22",X"F4",X"3D",X"7D",X"2C",X"F4",X"3F",X"7D",X"28",X"7A", + X"85",X"41",X"6A",X"6E",X"07",X"57",X"A4",X"0A",X"3C",X"22",X"F4",X"35",X"7D",X"19",X"F4",X"37", + X"7D",X"15",X"7A",X"85",X"41",X"25",X"08",X"EC",X"48",X"A4",X"0A",X"3C",X"22",X"F4",X"3F",X"7D", + X"06",X"F4",X"3D",X"7D",X"02",X"0A",X"B5",X"A8",X"B5",X"19",X"72",X"ED",X"2C",X"19",X"04",X"ED", + X"4B",X"19",X"48",X"ED",X"6A",X"25",X"02",X"6B",X"72",X"57",X"A4",X"0A",X"3C",X"22",X"F4",X"4A", + X"9B",X"22",X"42",X"F4",X"45",X"7D",X"7B",X"65",X"5A",X"02",X"57",X"A4",X"0A",X"3C",X"22",X"F4", + X"41",X"7D",X"6F",X"F4",X"46",X"7D",X"6B",X"1A",X"67",X"1D",X"6E",X"01",X"72",X"48",X"A4",X"0A", + X"3C",X"22",X"F4",X"45",X"7D",X"5C",X"F4",X"46",X"7D",X"58",X"65",X"6E",X"02",X"48",X"A4",X"0A", + X"3C",X"22",X"F4",X"4A",X"7D",X"4C",X"F4",X"41",X"7D",X"48",X"1A",X"44",X"6A",X"6E",X"81",X"72", + X"57",X"A4",X"0A",X"3C",X"22",X"F4",X"49",X"7D",X"39",X"F4",X"43",X"7D",X"35",X"65",X"6E",X"06", + X"57",X"A4",X"0A",X"3C",X"22",X"F4",X"41",X"7D",X"29",X"F4",X"46",X"7D",X"25",X"1A",X"21",X"25", + X"02",X"EC",X"72",X"48",X"A4",X"0A",X"3C",X"22",X"F4",X"44",X"7D",X"16",X"F4",X"47",X"7D",X"12", + X"65",X"5A",X"06",X"48",X"A4",X"0A",X"3C",X"22",X"F4",X"4A",X"7D",X"06",X"F4",X"41",X"7D",X"02", + X"0A",X"B5",X"A8",X"B5",X"D9",X"22",X"00",X"F4",X"02",X"2C",X"0A",X"7D",X"0C",X"F4",X"04",X"7D", + X"0C",X"D9",X"D1",X"02",X"B5",X"D9",X"9E",X"01",X"B5",X"D9",X"9E",X"02",X"B5",X"D9",X"D1",X"01", + X"B5",X"D9",X"76",X"BE",X"61",X"D9",X"0D",X"00",X"D9",X"69",X"01",X"B3",X"01",X"3D",X"EA",X"0A", + X"19",X"ED",X"19",X"5B",X"7D",X"F7",X"EE",X"7A",X"4B",X"42",X"DE",X"C8",X"61",X"CB",X"80",X"A4", + X"11",X"39",X"DC",X"4B",X"C8",X"61",X"2C",X"E8",X"DE",X"C8",X"61",X"CB",X"65",X"D9",X"0D",X"00", + X"D9",X"69",X"01",X"A4",X"30",X"41",X"DC",X"4B",X"C8",X"61",X"2C",X"D4",X"80",X"B5",X"32",X"1D", + X"6D",X"0F",X"F4",X"08",X"ED",X"32",X"6A",X"6D",X"0F",X"F4",X"06",X"ED",X"2B",X"32",X"6D",X"05", + X"ED",X"08",X"8D",X"1D",X"A4",X"7A",X"37",X"7A",X"9F",X"42",X"90",X"6A",X"A4",X"DA",X"36",X"19", + X"4B",X"19",X"9D",X"E7",X"AA",X"42",X"C8",X"7A",X"9F",X"42",X"A4",X"03",X"37",X"7D",X"07",X"2C", + X"07",X"19",X"30",X"7A",X"A6",X"42",X"A8",X"B5",X"0A",X"B5",X"66",X"26",X"CB",X"A4",X"F0",X"43", + X"F7",X"03",X"00",X"76",X"BA",X"61",X"15",X"BD",X"61",X"B6",X"B2",X"EE",X"DE",X"C1",X"61",X"DE", + X"C2",X"61",X"76",X"BD",X"61",X"22",X"C0",X"0D",X"C0",X"69",X"A4",X"7E",X"42",X"1C",X"3A",X"43", + X"A4",X"E6",X"42",X"7A",X"BA",X"43",X"D9",X"76",X"BE",X"61",X"3E",X"DC",X"CB",X"66",X"25",X"04", + X"49",X"04",X"B3",X"00",X"76",X"C4",X"61",X"D6",X"0D",X"A4",X"11",X"39",X"2C",X"13",X"26",X"1D", + X"76",X"BE",X"61",X"0D",X"C0",X"69",X"A4",X"30",X"41",X"D3",X"2C",X"05",X"76",X"BD",X"61",X"91", + X"B5",X"4B",X"C1",X"61",X"C4",X"DE",X"C1",X"61",X"76",X"BD",X"61",X"22",X"72",X"8C",X"7D",X"09", + X"65",X"C0",X"0D",X"C0",X"69",X"A4",X"30",X"41",X"DF",X"4B",X"BD",X"61",X"72",X"4B",X"C1",X"61", + X"B2",X"DE",X"C1",X"61",X"A4",X"41",X"42",X"7A",X"0C",X"43",X"76",X"BD",X"61",X"22",X"C0",X"0D", + X"C0",X"69",X"A4",X"89",X"41",X"EA",X"12",X"4B",X"BD",X"61",X"72",X"19",X"02",X"19",X"02",X"19", + X"ED",X"19",X"ED",X"B2",X"6D",X"0F",X"DE",X"BD",X"61",X"76",X"BD",X"61",X"22",X"C0",X"0D",X"C0", + X"69",X"F4",X"02",X"7D",X"0D",X"2C",X"12",X"F4",X"04",X"7D",X"0B",X"6A",X"6E",X"04",X"57",X"7A", + X"7B",X"43",X"38",X"7A",X"7B",X"43",X"78",X"78",X"78",X"78",X"78",X"A4",X"0A",X"3C",X"22",X"F4", + X"63",X"F3",X"BA",X"43",X"A4",X"E5",X"3F",X"A4",X"2B",X"3D",X"66",X"76",X"01",X"60",X"19",X"F4", + X"76",X"5F",X"60",X"19",X"11",X"3E",X"DC",X"CB",X"76",X"B4",X"61",X"25",X"04",X"49",X"7D",X"0B", + X"F4",X"02",X"7D",X"0C",X"2C",X"0F",X"19",X"BF",X"7A",X"CE",X"43",X"19",X"5A",X"7A",X"CE",X"43", + X"19",X"6E",X"7A",X"CE",X"43",X"19",X"54",X"7A",X"CE",X"43",X"D9",X"76",X"BD",X"61",X"A4",X"24", + X"42",X"76",X"C2",X"61",X"D1",X"22",X"DC",X"D3",X"26",X"CB",X"4C",X"F3",X"D2",X"42",X"DC",X"D3", + X"3E",X"66",X"26",X"CB",X"4B",X"BD",X"61",X"19",X"99",X"19",X"99",X"19",X"99",X"19",X"99",X"19", + X"9C",X"F8",X"4B",X"BE",X"61",X"C0",X"F8",X"4B",X"BF",X"61",X"C0",X"F8",X"DC",X"D3",X"3E",X"B5", + X"15",X"BA",X"61",X"22",X"19",X"02",X"19",X"02",X"19",X"02",X"19",X"02",X"18",X"C7",X"C0",X"22", + X"18",X"C7",X"C0",X"22",X"18",X"B5",X"15",X"05",X"00",X"B3",X"04",X"76",X"2B",X"60",X"66",X"CB", + X"19",X"3C",X"F3",X"E5",X"5F",X"40",X"89",X"F8",X"DC",X"3E",X"19",X"FA",X"7D",X"23",X"40",X"89", + X"F9",X"76",X"5F",X"60",X"19",X"86",X"F9",X"D9",X"76",X"21",X"60",X"D9",X"71",X"00",X"82",X"D9", + X"71",X"01",X"58",X"D9",X"71",X"02",X"86",X"A4",X"7F",X"1F",X"D9",X"F8",X"03",X"D9",X"A3",X"04", + X"B5",X"66",X"CB",X"B3",X"04",X"76",X"2B",X"60",X"19",X"FA",X"7D",X"1B",X"66",X"D9",X"3E",X"25", + X"58",X"D9",X"21",X"01",X"ED",X"11",X"25",X"86",X"D9",X"21",X"02",X"2C",X"0A",X"25",X"94",X"D9", + X"21",X"02",X"EA",X"03",X"DC",X"3E",X"B5",X"40",X"89",X"DE",X"DC",X"65",X"6E",X"04",X"B6",X"CF", + X"04",X"A4",X"61",X"30",X"3E",X"19",X"4A",X"19",X"5A",X"B5",X"DC",X"3E",X"B5",X"4B",X"5F",X"60", + X"19",X"57",X"9B",X"9A",X"44",X"B6",X"27",X"D3",X"61",X"B6",X"41",X"D5",X"61",X"AB",X"62",X"4B", + X"D7",X"61",X"F4",X"00",X"9B",X"CA",X"44",X"7A",X"42",X"45",X"A4",X"C4",X"45",X"F7",X"CF",X"62", + X"15",X"FF",X"62",X"25",X"FF",X"D8",X"18",X"76",X"26",X"60",X"19",X"FA",X"31",X"C0",X"26",X"CB", + X"0D",X"C0",X"69",X"25",X"35",X"4C",X"E7",X"BC",X"44",X"DC",X"D3",X"B5",X"A4",X"DC",X"45",X"DC", + X"D3",X"9A",X"D8",X"AB",X"62",X"EB",X"22",X"FE",X"0F",X"F8",X"3F",X"F4",X"FF",X"9B",X"3C",X"45", + X"EB",X"19",X"22",X"7D",X"12",X"66",X"26",X"15",X"F0",X"FF",X"40",X"D3",X"22",X"6D",X"0F",X"ED", + X"05",X"19",X"54",X"38",X"92",X"18",X"3E",X"19",X"86",X"7D",X"0D",X"66",X"E1",X"22",X"6D",X"0F", + X"ED",X"05",X"19",X"5A",X"38",X"92",X"18",X"3E",X"19",X"24",X"7D",X"12",X"66",X"26",X"15",X"10", + X"00",X"40",X"D3",X"22",X"6D",X"0F",X"ED",X"05",X"19",X"BF",X"38",X"92",X"18",X"3E",X"19",X"05", + X"7D",X"0D",X"66",X"A7",X"22",X"6D",X"0F",X"ED",X"05",X"19",X"6E",X"38",X"92",X"18",X"3E",X"77", + X"66",X"76",X"01",X"90",X"19",X"22",X"3E",X"9B",X"CA",X"44",X"76",X"5F",X"60",X"19",X"BF",X"B6", + X"8D",X"D3",X"61",X"B6",X"2F",X"D5",X"61",X"EE",X"DE",X"D7",X"61",X"B5",X"7B",X"F4",X"FF",X"9B", + X"BE",X"45",X"7B",X"F4",X"FF",X"9B",X"B8",X"45",X"EB",X"19",X"22",X"7D",X"12",X"66",X"26",X"15", + X"F0",X"FF",X"40",X"D3",X"22",X"6D",X"0F",X"ED",X"05",X"19",X"54",X"9A",X"92",X"D8",X"3E",X"19", + X"86",X"7D",X"0D",X"66",X"E1",X"22",X"6D",X"0F",X"ED",X"05",X"19",X"5A",X"9A",X"92",X"D8",X"3E", + X"19",X"24",X"7D",X"12",X"66",X"26",X"15",X"10",X"00",X"40",X"D3",X"22",X"6D",X"0F",X"ED",X"05", + X"19",X"BF",X"9A",X"92",X"D8",X"3E",X"19",X"05",X"7D",X"0D",X"66",X"A7",X"22",X"6D",X"0F",X"ED", + X"05",X"19",X"6E",X"9A",X"92",X"D8",X"3E",X"7C",X"66",X"76",X"01",X"90",X"19",X"22",X"3E",X"9B", + X"42",X"45",X"76",X"5F",X"60",X"19",X"BF",X"B6",X"8D",X"D3",X"61",X"B6",X"2F",X"D5",X"61",X"19", + X"FB",X"DE",X"D7",X"61",X"B5",X"7A",X"42",X"45",X"3F",X"F4",X"FF",X"F3",X"CA",X"44",X"76",X"5F", + X"60",X"19",X"12",X"B5",X"15",X"10",X"00",X"76",X"00",X"62",X"66",X"B3",X"0B",X"22",X"6D",X"F0", + X"F8",X"C0",X"89",X"F9",X"3E",X"40",X"25",X"B0",X"3A",X"ED",X"EF",X"B5",X"19",X"4B",X"19",X"4B", + X"19",X"4B",X"19",X"4B",X"6A",X"6E",X"30",X"19",X"02",X"19",X"02",X"19",X"02",X"19",X"02",X"04", + X"25",X"0A",X"82",X"19",X"99",X"19",X"99",X"19",X"99",X"19",X"99",X"C4",X"B5",X"D9",X"76",X"A2", + X"0D",X"76",X"A0",X"62",X"B3",X"0B",X"15",X"F0",X"FF",X"66",X"CB",X"B3",X"05",X"D9",X"22",X"00", + X"04",X"6D",X"0F",X"19",X"99",X"19",X"99",X"19",X"99",X"19",X"99",X"F8",X"40",X"C2",X"6D",X"F0", + X"F8",X"40",X"D9",X"C0",X"89",X"E7",X"D9",X"22",X"00",X"19",X"99",X"19",X"99",X"19",X"99",X"19", + X"99",X"F8",X"DC",X"3E",X"D9",X"C0",X"C0",X"89",X"D0",X"B5",X"7A",X"42",X"56",X"22",X"DE",X"C8", + X"61",X"F4",X"36",X"AB",X"62",X"A5",X"F7",X"F0",X"FF",X"7D",X"1A",X"4B",X"C8",X"61",X"F4",X"3E", + X"F9",X"19",X"F4",X"19",X"CD",X"0C",X"19",X"F4",X"19",X"11",X"D6",X"19",X"55",X"19",X"11",X"C0", + X"19",X"55",X"19",X"CD",X"B5",X"19",X"6D",X"19",X"21",X"0C",X"19",X"FE",X"19",X"21",X"D6",X"19", + X"FE",X"19",X"AA",X"C0",X"19",X"6D",X"19",X"AA",X"B5",X"FF",X"FF",X"7A",X"3D",X"46",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"A4",X"26",X"1F",X"F4",X"1E",X"2C",X"02",X"25", + X"1E",X"76",X"88",X"47",X"DE",X"C8",X"61",X"5E",X"1E",X"EB",X"25",X"00",X"C9",X"E9",X"22",X"76", + X"A6",X"47",X"1E",X"EB",X"25",X"00",X"C9",X"E9",X"22",X"72",X"97",X"4B",X"B8",X"61",X"04",X"65", + X"B3",X"00",X"BA",X"2C",X"03",X"14",X"1A",X"FA",X"CB",X"C2",X"06",X"89",X"FD",X"DC",X"19",X"02", + X"89",X"FC",X"72",X"01",X"33",X"ED",X"3C",X"4B",X"B6",X"61",X"F4",X"3B",X"ED",X"35",X"76",X"D2", + X"61",X"22",X"D1",X"6D",X"03",X"76",X"CE",X"61",X"1E",X"EB",X"25",X"00",X"C9",X"E9",X"22",X"F4", + X"00",X"ED",X"20",X"66",X"76",X"AE",X"47",X"4B",X"02",X"90",X"19",X"72",X"ED",X"03",X"76",X"CD", + X"47",X"4B",X"B7",X"61",X"19",X"02",X"19",X"02",X"19",X"02",X"1E",X"EB",X"25",X"00",X"C9",X"E9", + X"22",X"3E",X"F8",X"E2",X"76",X"C4",X"61",X"15",X"05",X"00",X"D9",X"76",X"2C",X"60",X"76",X"CE", + X"61",X"B3",X"04",X"22",X"F4",X"00",X"7D",X"18",X"26",X"D9",X"0D",X"00",X"D9",X"69",X"01",X"A4", + X"DC",X"45",X"57",X"CE",X"62",X"7B",X"6D",X"0F",X"D3",X"F4",X"0F",X"7D",X"03",X"E2",X"F8",X"00", + X"E2",X"C0",X"D9",X"40",X"C0",X"89",X"DC",X"B5",X"00",X"02",X"03",X"04",X"01",X"02",X"03",X"02", + X"03",X"04",X"03",X"04",X"05",X"05",X"06",X"06",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"07",X"05",X"05",X"05",X"04",X"03",X"02",X"01",X"01",X"03",X"03", + X"04",X"04",X"05",X"05",X"06",X"06",X"07",X"07",X"08",X"08",X"09",X"09",X"0A",X"0A",X"0B",X"0B", + X"0C",X"0C",X"0D",X"0D",X"0E",X"0E",X"0F",X"0F",X"10",X"10",X"11",X"11",X"12",X"0A",X"0B",X"0C", + X"0D",X"0E",X"0F",X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17",X"18",X"19",X"1A",X"1B",X"1C", + X"1D",X"1E",X"1F",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"28",X"F5",X"E5",X"D5",X"C5", + X"DD",X"E5",X"06",X"0C",X"21",X"9D",X"D0",X"11",X"20",X"00",X"3E",X"FF",X"77",X"23",X"77",X"19", + X"77",X"2B",X"77",X"19",X"10",X"F6",X"06",X"0C",X"21",X"9D",X"D4",X"3E",X"01",X"77",X"23",X"77", + X"19",X"77",X"2B",X"77",X"19",X"10",X"F6",X"06",X"16",X"21",X"9E",X"D0",X"DD",X"21",X"08",X"49", + X"DD",X"7E",X"00",X"77",X"19",X"DD",X"23",X"10",X"F7",X"06",X"13",X"21",X"9D",X"D0",X"DD",X"21", + X"1E",X"49",X"DD",X"7E",X"00",X"77",X"19",X"DD",X"23",X"10",X"F7",X"DD",X"E1",X"C1",X"D1",X"E1", + X"F1",X"C9",X"CD",X"EC",X"47",X"E5",X"D5",X"C5",X"F5",X"E5",X"D5",X"C5",X"F5",X"11",X"DE",X"D0", + X"06",X"05",X"21",X"01",X"00",X"39",X"3E",X"00",X"ED",X"6F",X"CD",X"B2",X"48",X"ED",X"6F",X"CD", + X"C0",X"48",X"23",X"10",X"F1",X"F1",X"C1",X"D1",X"E1",X"F1",X"C1",X"D1",X"E1",X"C5",X"D5",X"E5", + X"DD",X"E5",X"FD",X"E5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"11",X"5D",X"D3",X"06",X"03", + X"21",X"00",X"00",X"39",X"3E",X"00",X"ED",X"67",X"CD",X"CE",X"48",X"ED",X"67",X"CD",X"CE",X"48", + X"23",X"ED",X"67",X"CD",X"CE",X"48",X"ED",X"67",X"CD",X"DE",X"48",X"23",X"10",X"E6",X"FD",X"E1", + X"DD",X"E1",X"E1",X"D1",X"C1",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"C9",X"76",X"CD",X"D5", + X"22",X"C9",X"E5",X"F5",X"6B",X"62",X"77",X"11",X"20",X"00",X"19",X"5D",X"54",X"F1",X"E1",X"C9", + X"E5",X"F5",X"6B",X"62",X"77",X"11",X"80",X"00",X"19",X"5D",X"54",X"F1",X"E1",X"C9",X"E5",X"F5", + X"6B",X"62",X"77",X"11",X"20",X"00",X"A7",X"ED",X"52",X"5D",X"54",X"F1",X"E1",X"C9",X"E5",X"F5", + X"6B",X"62",X"77",X"11",X"A0",X"00",X"A7",X"ED",X"52",X"5D",X"54",X"F1",X"E1",X"C9",X"21",X"00", + X"60",X"7E",X"CD",X"42",X"48",X"DD",X"21",X"00",X"90",X"DD",X"CB",X"00",X"76",X"20",X"FA",X"DD", + X"CB",X"00",X"76",X"28",X"FA",X"23",X"18",X"E9",X"0A",X"2A",X"FF",X"FF",X"FF",X"0C",X"2A",X"FF", + X"FF",X"FF",X"0B",X"2A",X"FF",X"FF",X"FF",X"0E",X"2A",X"FF",X"FF",X"FF",X"0D",X"2A",X"11",X"15", + X"2A",X"FF",X"FF",X"FF",X"FF",X"FF",X"12",X"21",X"2A",X"FF",X"FF",X"FF",X"FF",X"FF",X"12",X"22", + X"2A",X"71",X"19",X"40",X"71",X"FF",X"40",X"7A",X"EB",X"1D",X"71",X"19",X"40",X"71",X"FF",X"40", + X"7A",X"FE",X"1D",X"26",X"EE",X"DE",X"E0",X"61",X"7A",X"6E",X"37",X"4B",X"26",X"60",X"19",X"02", + X"19",X"02",X"19",X"02",X"7A",X"77",X"36",X"DE",X"5F",X"60",X"DE",X"E3",X"61",X"7A",X"DC",X"02", + X"76",X"5E",X"60",X"9E",X"9E",X"76",X"E2",X"61",X"D1",X"7A",X"E1",X"03",X"DE",X"65",X"60",X"76", + X"E3",X"61",X"22",X"F4",X"00",X"9B",X"86",X"49",X"4B",X"5F",X"60",X"19",X"04",X"9B",X"81",X"49", + X"9E",X"9E",X"EE",X"DE",X"E2",X"61",X"7A",X"E5",X"03",X"D9",X"76",X"2B",X"60",X"76",X"2B",X"62", + X"15",X"05",X"00",X"B3",X"04",X"EE",X"D9",X"19",X"00",X"4E",X"ED",X"03",X"F8",X"1A",X"1F",X"21", + X"7D",X"1C",X"D9",X"19",X"00",X"8E",X"D9",X"19",X"00",X"C6",X"97",X"D9",X"22",X"03",X"F4",X"48", + X"7D",X"04",X"D9",X"71",X"03",X"30",X"01",X"66",X"76",X"01",X"60",X"19",X"54",X"3E",X"C0",X"D9", + X"40",X"89",X"D3",X"25",X"00",X"DE",X"0D",X"62",X"D9",X"76",X"2B",X"60",X"76",X"2B",X"62",X"15", + X"05",X"00",X"B3",X"04",X"66",X"26",X"CB",X"A4",X"64",X"4A",X"DC",X"D3",X"3E",X"C0",X"D9",X"40", + X"89",X"F2",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"A4",X"5A",X"2D",X"A4",X"01",X"4A",X"76",X"2B", + X"62",X"B3",X"04",X"EE",X"21",X"ED",X"D1",X"C0",X"89",X"FA",X"4B",X"0E",X"62",X"5F",X"ED",X"E2", + X"B5",X"76",X"0D",X"62",X"EE",X"21",X"31",X"19",X"3C",X"7D",X"09",X"C0",X"71",X"09",X"0C",X"19", + X"03",X"19",X"54",X"B5",X"C0",X"22",X"5F",X"ED",X"18",X"0C",X"F8",X"76",X"00",X"D0",X"15",X"20", + X"00",X"B3",X"04",X"CB",X"66",X"B3",X"08",X"F8",X"C0",X"89",X"FC",X"3E",X"40",X"DC",X"89",X"F3", + X"B5",X"76",X"0D",X"62",X"4B",X"0E",X"62",X"6D",X"0F",X"72",X"B6",X"CF",X"04",X"4B",X"00",X"D0", + X"33",X"ED",X"04",X"19",X"AC",X"1A",X"05",X"67",X"ED",X"02",X"19",X"6E",X"F4",X"00",X"ED",X"08", + X"66",X"76",X"0E",X"62",X"9E",X"3E",X"7D",X"C3",X"19",X"0D",X"ED",X"04",X"6E",X"01",X"1A",X"BB", + X"5A",X"01",X"1A",X"B7",X"22",X"5F",X"31",X"6D",X"0F",X"F4",X"01",X"7D",X"0D",X"F4",X"02",X"7D", + X"28",X"F4",X"03",X"7D",X"38",X"F4",X"04",X"7D",X"58",X"B5",X"D9",X"22",X"01",X"5A",X"02",X"D9", + X"F8",X"01",X"F4",X"B0",X"2C",X"06",X"22",X"6D",X"F0",X"FE",X"02",X"F8",X"D9",X"22",X"02",X"5A", + X"02",X"D9",X"F8",X"02",X"F4",X"E6",X"EA",X"49",X"B5",X"D9",X"22",X"01",X"6E",X"02",X"D9",X"F8", + X"01",X"F4",X"06",X"EA",X"E7",X"22",X"6D",X"F0",X"FE",X"01",X"F8",X"1A",X"DF",X"D9",X"22",X"01", + X"6E",X"02",X"D9",X"F8",X"01",X"F4",X"06",X"EA",X"02",X"71",X"04",X"D9",X"22",X"02",X"6E",X"02", + X"D9",X"F8",X"02",X"F4",X"32",X"DF",X"22",X"F4",X"04",X"25",X"02",X"ED",X"02",X"25",X"01",X"F8", + X"B5",X"D9",X"22",X"01",X"5A",X"02",X"D9",X"F8",X"01",X"F4",X"B0",X"2C",X"DE",X"71",X"03",X"1A", + X"DA",X"D9",X"22",X"03",X"F4",X"48",X"7D",X"1C",X"19",X"05",X"ED",X"18",X"4B",X"3C",X"62",X"5F", + X"7D",X"0F",X"4B",X"3B",X"62",X"72",X"25",X"08",X"5A",X"10",X"89",X"FC",X"D9",X"21",X"01",X"EA", + X"10",X"19",X"6D",X"B5",X"D9",X"22",X"02",X"F4",X"F0",X"84",X"D9",X"71",X"00",X"00",X"71",X"00", + X"B5",X"66",X"76",X"00",X"60",X"19",X"BF",X"4B",X"3D",X"62",X"5C",X"72",X"76",X"7D",X"D0",X"15", + X"40",X"00",X"40",X"89",X"FD",X"25",X"A4",X"15",X"20",X"00",X"A4",X"F6",X"26",X"25",X"02",X"26", + X"15",X"00",X"04",X"40",X"D3",X"A4",X"56",X"4B",X"4B",X"3C",X"62",X"5E",X"DE",X"3C",X"62",X"4B", + X"3D",X"62",X"5C",X"DE",X"3D",X"62",X"4B",X"0D",X"62",X"19",X"FB",X"DE",X"0D",X"62",X"3E",X"D9", + X"71",X"00",X"00",X"71",X"00",X"B5",X"97",X"66",X"66",X"F8",X"40",X"F8",X"3E",X"0C",X"F8",X"40", + X"F8",X"3E",X"01",X"B5",X"76",X"A6",X"D0",X"F7",X"16",X"16",X"A4",X"52",X"5D",X"76",X"22",X"60", + X"B3",X"1E",X"71",X"00",X"C0",X"89",X"FB",X"4B",X"3D",X"62",X"5F",X"ED",X"11",X"76",X"54",X"4C", + X"A4",X"36",X"5D",X"76",X"01",X"60",X"19",X"BF",X"A4",X"9E",X"4B",X"7A",X"37",X"4C",X"76",X"44", + X"4C",X"A4",X"36",X"5D",X"B3",X"03",X"76",X"5C",X"62",X"71",X"00",X"C0",X"89",X"FB",X"D9",X"66", + X"B3",X"4F",X"CB",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"A4",X"5A",X"2D",X"DC",X"89",X"F3",X"D9", + X"3E",X"4B",X"3D",X"62",X"5F",X"31",X"76",X"7D",X"D0",X"15",X"40",X"00",X"72",X"40",X"89",X"FD", + X"66",X"66",X"15",X"20",X"00",X"71",X"E7",X"40",X"71",X"FF",X"3E",X"0C",X"71",X"E6",X"40",X"71", + X"E5",X"3E",X"26",X"15",X"00",X"04",X"40",X"D3",X"25",X"02",X"A4",X"56",X"4B",X"76",X"00",X"60", + X"19",X"F4",X"B3",X"00",X"D4",X"05",X"CE",X"00",X"D9",X"66",X"D9",X"76",X"5C",X"62",X"D9",X"22", + X"02",X"EC",X"99",X"D9",X"F8",X"02",X"D9",X"22",X"01",X"C3",X"99",X"D9",X"F8",X"01",X"D9",X"22", + X"00",X"56",X"99",X"D9",X"F8",X"00",X"76",X"91",X"D1",X"A4",X"06",X"1E",X"D9",X"3E",X"76",X"3D", + X"62",X"9E",X"ED",X"8A",X"A4",X"9E",X"4B",X"76",X"01",X"60",X"19",X"54",X"76",X"5F",X"60",X"19", + X"05",X"ED",X"14",X"D9",X"66",X"D9",X"76",X"5C",X"62",X"D9",X"3C",X"00",X"D9",X"FA",X"01",X"D9", + X"0D",X"02",X"A4",X"72",X"3C",X"D9",X"3E",X"A4",X"9E",X"4B",X"76",X"A6",X"D0",X"F7",X"16",X"16", + X"A4",X"52",X"5D",X"B5",X"53",X"D1",X"03",X"0C",X"0B",X"18",X"17",X"1E",X"1C",X"FF",X"19",X"18", + X"12",X"17",X"1D",X"1C",X"93",X"D1",X"01",X"08",X"17",X"18",X"FF",X"0B",X"18",X"17",X"1E",X"1C", + X"A4",X"91",X"4C",X"A4",X"C2",X"4C",X"A4",X"FE",X"4C",X"A4",X"DE",X"4C",X"A4",X"62",X"4D",X"1A", + X"09",X"A4",X"91",X"4C",X"0A",X"7D",X"0B",X"A4",X"FE",X"4C",X"15",X"1C",X"60",X"A4",X"98",X"4D", + X"1A",X"09",X"A4",X"32",X"4D",X"15",X"1C",X"60",X"A4",X"A0",X"4D",X"B3",X"01",X"A4",X"A9",X"4D", + X"B5",X"76",X"01",X"90",X"19",X"22",X"F9",X"1A",X"F8",X"A4",X"91",X"4C",X"A4",X"D0",X"4C",X"A4", + X"42",X"4D",X"A4",X"52",X"4D",X"B3",X"05",X"CB",X"EE",X"A4",X"87",X"4D",X"B3",X"20",X"A4",X"A9", + X"4D",X"25",X"01",X"A4",X"87",X"4D",X"B3",X"20",X"A4",X"A9",X"4D",X"DC",X"89",X"E9",X"A4",X"FB", + X"5B",X"B5",X"76",X"AC",X"D4",X"25",X"05",X"DE",X"6B",X"62",X"25",X"0E",X"D4",X"16",X"1A",X"1A", + X"76",X"31",X"D5",X"25",X"0B",X"DE",X"6B",X"62",X"25",X"0E",X"D4",X"0E",X"1A",X"0C",X"76",X"82", + X"D5",X"25",X"03",X"DE",X"6B",X"62",X"25",X"00",X"D4",X"07",X"15",X"20",X"00",X"66",X"97",X"4B", + X"6B",X"62",X"72",X"01",X"F8",X"C0",X"89",X"FC",X"3E",X"40",X"9A",X"ED",X"F0",X"B5",X"76",X"AC", + X"D0",X"D9",X"76",X"38",X"4E",X"25",X"05",X"DE",X"6B",X"62",X"D4",X"01",X"A4",X"70",X"4D",X"D9", + X"76",X"CA",X"4D",X"D4",X"07",X"A4",X"70",X"4D",X"D9",X"76",X"3D",X"4E",X"D4",X"04",X"A4",X"70", + X"4D",X"D9",X"76",X"0B",X"4E",X"D4",X"09",X"A4",X"70",X"4D",X"D9",X"76",X"38",X"4E",X"D4",X"01", + X"1A",X"3E",X"76",X"AC",X"D0",X"D9",X"76",X"CA",X"4D",X"25",X"05",X"DE",X"6B",X"62",X"D4",X"16", + X"1A",X"2E",X"76",X"AC",X"D0",X"25",X"05",X"DE",X"6B",X"62",X"D9",X"76",X"79",X"4E",X"D4",X"16", + X"1A",X"1E",X"76",X"31",X"D1",X"D9",X"76",X"E7",X"4E",X"25",X"0B",X"DE",X"6B",X"62",X"D4",X"0E", + X"1A",X"0E",X"76",X"82",X"D1",X"D9",X"76",X"DB",X"4F",X"25",X"03",X"DE",X"6B",X"62",X"D4",X"07", + X"15",X"20",X"00",X"66",X"4B",X"6B",X"62",X"72",X"D9",X"22",X"00",X"F8",X"D9",X"C0",X"C0",X"89", + X"F7",X"3E",X"40",X"9A",X"ED",X"ED",X"B5",X"15",X"1C",X"60",X"F7",X"2D",X"00",X"0A",X"76",X"AE", + X"4F",X"ED",X"13",X"76",X"81",X"4F",X"1A",X"0E",X"76",X"51",X"4E",X"F7",X"14",X"00",X"1A",X"06", + X"76",X"65",X"4E",X"F7",X"14",X"00",X"B6",X"B2",X"B5",X"4B",X"5E",X"60",X"0A",X"ED",X"0B",X"CB", + X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"DC",X"89",X"F0",X"B5",X"F4",X"02",X"4B",X"00",X"90",X"8B", + X"2C",X"03",X"6D",X"60",X"F9",X"6D",X"20",X"F9",X"1A",X"E5",X"00",X"00",X"58",X"57",X"00",X"56", + X"55",X"54",X"53",X"00",X"52",X"51",X"50",X"4F",X"00",X"4E",X"4D",X"4C",X"4B",X"00",X"4A",X"49", + X"48",X"47",X"46",X"45",X"44",X"43",X"42",X"41",X"40",X"3F",X"3E",X"3D",X"3C",X"3B",X"3A",X"39", + X"38",X"37",X"36",X"35",X"34",X"33",X"32",X"31",X"30",X"00",X"00",X"2F",X"2E",X"00",X"00",X"00", + X"2D",X"2C",X"2B",X"00",X"00",X"2A",X"29",X"28",X"27",X"26",X"25",X"24",X"23",X"22",X"21",X"20", + X"1F",X"1E",X"1D",X"1C",X"1B",X"1A",X"19",X"18",X"17",X"16",X"15",X"14",X"00",X"13",X"12",X"11", + X"10",X"0F",X"0E",X"00",X"0D",X"0C",X"0B",X"0A",X"00",X"09",X"08",X"07",X"00",X"00",X"06",X"05", + X"04",X"03",X"00",X"00",X"00",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"6A",X"69",X"68", + X"67",X"66",X"65",X"64",X"63",X"62",X"61",X"60",X"5F",X"00",X"00",X"5E",X"5D",X"5C",X"5B",X"5A", + X"59",X"81",X"4C",X"74",X"78",X"03",X"11",X"5C",X"74",X"84",X"03",X"41",X"10",X"66",X"90",X"00", + X"11",X"98",X"66",X"90",X"00",X"81",X"4C",X"74",X"60",X"03",X"11",X"5C",X"74",X"6C",X"03",X"41", + X"08",X"66",X"90",X"00",X"11",X"A0",X"66",X"90",X"00",X"00",X"BE",X"BD",X"00",X"00",X"BC",X"BB", + X"BA",X"00",X"00",X"B9",X"B8",X"B7",X"00",X"00",X"B6",X"B5",X"B4",X"B3",X"00",X"B2",X"B1",X"B0", + X"AF",X"AE",X"AD",X"AC",X"AB",X"AA",X"A9",X"A8",X"A7",X"A6",X"A5",X"A4",X"A3",X"A2",X"A1",X"A0", + X"9F",X"9E",X"9D",X"9C",X"9B",X"9A",X"00",X"99",X"98",X"97",X"90",X"96",X"95",X"94",X"90",X"90", + X"00",X"93",X"92",X"91",X"90",X"8F",X"8E",X"00",X"00",X"8D",X"8C",X"8B",X"8A",X"00",X"89",X"88", + X"87",X"86",X"85",X"84",X"83",X"82",X"81",X"80",X"7F",X"7E",X"7D",X"7C",X"7B",X"7A",X"79",X"78", + X"77",X"76",X"00",X"75",X"74",X"73",X"72",X"00",X"71",X"70",X"6F",X"00",X"00",X"6E",X"6D",X"00", + X"00",X"00",X"6C",X"6B",X"00",X"00",X"00",X"00",X"00",X"00",X"EF",X"EE",X"ED",X"EC",X"EB",X"00", + X"00",X"00",X"00",X"EA",X"E9",X"E8",X"90",X"90",X"90",X"E7",X"E6",X"00",X"00",X"E5",X"E4",X"90", + X"E3",X"90",X"90",X"90",X"E2",X"E1",X"E0",X"00",X"90",X"90",X"90",X"90",X"90",X"90",X"90",X"90", + X"90",X"DF",X"00",X"DE",X"90",X"90",X"90",X"90",X"90",X"90",X"90",X"90",X"DD",X"DC",X"90",X"90", + X"90",X"90",X"90",X"00",X"90",X"90",X"90",X"90",X"DB",X"90",X"90",X"90",X"90",X"90",X"00",X"90", + X"90",X"90",X"DA",X"D9",X"90",X"90",X"90",X"90",X"90",X"00",X"90",X"90",X"90",X"D8",X"D7",X"D6", + X"90",X"90",X"90",X"90",X"90",X"90",X"90",X"90",X"90",X"D5",X"D4",X"90",X"90",X"90",X"90",X"90", + X"90",X"90",X"90",X"D3",X"D2",X"D1",X"90",X"D0",X"90",X"90",X"90",X"90",X"90",X"90",X"CF",X"00", + X"00",X"CE",X"CD",X"CC",X"CB",X"90",X"90",X"CA",X"C9",X"C8",X"00",X"00",X"00",X"C7",X"C6",X"C5", + X"C4",X"C3",X"C2",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C1",X"C0",X"BF",X"00",X"00",X"00", + X"00",X"81",X"44",X"9A",X"90",X"13",X"81",X"44",X"AA",X"94",X"13",X"81",X"44",X"BA",X"98",X"13", + X"81",X"54",X"9A",X"9C",X"13",X"81",X"54",X"AA",X"A0",X"13",X"81",X"54",X"BA",X"A4",X"13",X"81", + X"64",X"9A",X"A8",X"13",X"81",X"64",X"AA",X"AC",X"13",X"81",X"64",X"BA",X"B0",X"13",X"81",X"44", + X"9A",X"B4",X"13",X"81",X"44",X"AA",X"B8",X"13",X"81",X"44",X"BA",X"BC",X"13",X"81",X"54",X"9A", + X"C0",X"13",X"81",X"54",X"AA",X"C4",X"13",X"81",X"54",X"BA",X"C8",X"13",X"81",X"64",X"9A",X"CC", + X"13",X"81",X"64",X"AA",X"D0",X"13",X"81",X"64",X"BA",X"D4",X"13",X"A9",X"FF",X"FF",X"AA",X"B6", + X"B1",X"AB",X"B7",X"B2",X"AC",X"B8",X"B3",X"AD",X"B9",X"B4",X"AE",X"BA",X"B5",X"AF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"4B",X"02",X"90",X"6D",X"20",X"9B",X"0E",X"52",X"4B",X"65",X"60",X"0A",X"9B",X"0E",X"52",X"7A", + X"13",X"52",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"76",X"30",X"68",X"B3",X"10",X"F8",X"C0",X"89",X"FC",X"B5",X"CB",X"A4", + X"C7",X"1F",X"A4",X"8F",X"17",X"DC",X"89",X"F6",X"B5",X"6D",X"02",X"7D",X"0C",X"1A",X"39",X"A4", + X"A4",X"50",X"2C",X"05",X"1A",X"42",X"A4",X"F6",X"50",X"A4",X"3E",X"25",X"A4",X"93",X"4C",X"A4", + X"B1",X"5B",X"B5",X"A4",X"8F",X"17",X"76",X"80",X"D0",X"F7",X"18",X"20",X"A4",X"52",X"5D",X"B5", + X"15",X"68",X"60",X"4B",X"65",X"60",X"0A",X"7D",X"03",X"15",X"6B",X"60",X"A4",X"A4",X"50",X"34", + X"F6",X"50",X"4B",X"5F",X"60",X"7A",X"39",X"50",X"15",X"6B",X"60",X"4B",X"65",X"60",X"0A",X"7D", + X"03",X"15",X"68",X"60",X"7A",X"3F",X"50",X"84",X"4B",X"65",X"60",X"0A",X"7D",X"02",X"25",X"FF", + X"8B",X"DE",X"65",X"60",X"72",X"4B",X"02",X"90",X"6D",X"20",X"7D",X"04",X"65",X"DE",X"00",X"A0", + X"7A",X"46",X"50",X"B5",X"76",X"73",X"60",X"F7",X"00",X"09",X"CB",X"26",X"66",X"A4",X"2C",X"5D", + X"EA",X"0C",X"3E",X"F7",X"03",X"00",X"D6",X"D3",X"DC",X"77",X"89",X"EE",X"A8",X"B5",X"3E",X"D3", + X"DC",X"D9",X"76",X"00",X"68",X"D9",X"71",X"00",X"5C",X"D9",X"71",X"01",X"20",X"D9",X"71",X"02", + X"03",X"4B",X"02",X"90",X"6D",X"04",X"ED",X"04",X"D9",X"71",X"02",X"03",X"D9",X"71",X"03",X"00", + X"D9",X"08",X"04",X"51",X"15",X"05",X"68",X"F7",X"03",X"00",X"B6",X"B2",X"51",X"B3",X"0A",X"71", + X"FF",X"C0",X"89",X"FB",X"0A",X"B5",X"E2",X"76",X"12",X"68",X"E2",X"71",X"00",X"82",X"E2",X"71", + X"01",X"58",X"E2",X"71",X"02",X"36",X"76",X"85",X"D0",X"F7",X"18",X"1A",X"A4",X"52",X"5D",X"76", + X"4E",X"54",X"A4",X"36",X"5D",X"76",X"59",X"54",X"A4",X"36",X"5D",X"76",X"65",X"54",X"A4",X"36", + X"5D",X"D9",X"22",X"04",X"72",X"B7",X"17",X"57",X"CE",X"00",X"76",X"6F",X"54",X"40",X"51",X"26", + X"76",X"DE",X"D1",X"F7",X"00",X"03",X"A4",X"3F",X"5D",X"D3",X"76",X"DD",X"D0",X"F7",X"02",X"03", + X"A4",X"3F",X"5D",X"A4",X"6D",X"5D",X"A4",X"BC",X"5D",X"F7",X"0A",X"05",X"76",X"E7",X"D0",X"15", + X"20",X"00",X"CB",X"66",X"71",X"31",X"40",X"71",X"31",X"40",X"71",X"33",X"40",X"40",X"89",X"F4", + X"3E",X"C0",X"C0",X"DC",X"9A",X"ED",X"EB",X"25",X"0A",X"B3",X"03",X"76",X"98",X"D1",X"A4",X"15", + X"54",X"F7",X"04",X"05",X"76",X"16",X"D1",X"CB",X"66",X"A4",X"15",X"54",X"3E",X"0C",X"0C",X"DC", + X"9A",X"ED",X"F4",X"B3",X"03",X"A4",X"15",X"54",X"25",X"01",X"B3",X"02",X"A4",X"15",X"54",X"B3", + X"05",X"76",X"0C",X"D1",X"A4",X"15",X"54",X"B3",X"02",X"76",X"0A",X"D1",X"A4",X"15",X"54",X"25", + X"27",X"B3",X"01",X"A4",X"15",X"54",X"25",X"28",X"B3",X"01",X"A4",X"15",X"54",X"25",X"24",X"B3", + X"01",X"A4",X"15",X"54",X"25",X"2D",X"B3",X"01",X"76",X"88",X"D1",X"A4",X"15",X"54",X"25",X"29", + X"B3",X"01",X"76",X"88",X"D2",X"A4",X"15",X"54",X"76",X"F8",X"D0",X"A4",X"28",X"54",X"76",X"F8", + X"D2",X"A4",X"28",X"54",X"76",X"E8",X"D0",X"A4",X"28",X"54",X"A4",X"3C",X"54",X"A4",X"47",X"5E", + X"A4",X"9C",X"5E",X"D9",X"66",X"E2",X"66",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"E2",X"3E",X"D9", + X"3E",X"D9",X"9E",X"01",X"ED",X"12",X"D9",X"71",X"01",X"20",X"00",X"00",X"00",X"76",X"00",X"60", + X"19",X"6D",X"D9",X"9E",X"00",X"9B",X"29",X"53",X"7A",X"00",X"50",X"00",X"00",X"00",X"4B",X"00", + X"90",X"1A",X"03",X"4B",X"01",X"90",X"8B",X"6D",X"0F",X"7D",X"C5",X"3D",X"2C",X"68",X"3D",X"2C", + X"44",X"3D",X"2C",X"21",X"E2",X"71",X"00",X"82",X"E2",X"22",X"02",X"F4",X"D6",X"1C",X"E0",X"51", + X"E2",X"FA",X"01",X"76",X"BD",X"53",X"A4",X"9F",X"53",X"1C",X"E0",X"51",X"E2",X"08",X"01",X"E2", + X"D1",X"02",X"7A",X"E0",X"51",X"E2",X"71",X"00",X"42",X"E2",X"22",X"01",X"F4",X"A8",X"1C",X"E0", + X"51",X"E2",X"FA",X"02",X"76",X"B1",X"53",X"A4",X"9F",X"53",X"1C",X"E0",X"51",X"E2",X"08",X"02", + X"E2",X"D1",X"01",X"1A",X"3F",X"E2",X"71",X"00",X"22",X"E2",X"22",X"02",X"F4",X"37",X"E7",X"E0", + X"51",X"E2",X"FA",X"01",X"76",X"BD",X"53",X"A4",X"9F",X"53",X"1C",X"E0",X"51",X"E2",X"08",X"01", + X"E2",X"9E",X"02",X"7A",X"E0",X"51",X"E2",X"71",X"00",X"12",X"E2",X"22",X"01",X"F4",X"09",X"E7", + X"E0",X"51",X"E2",X"FA",X"02",X"76",X"B1",X"53",X"A4",X"9F",X"53",X"1C",X"E0",X"51",X"E2",X"08", + X"02",X"E2",X"9E",X"01",X"65",X"6E",X"02",X"E7",X"E0",X"51",X"F4",X"09",X"1C",X"E0",X"51",X"72", + X"B7",X"B7",X"17",X"48",X"E2",X"FA",X"01",X"76",X"C4",X"53",X"A4",X"9F",X"53",X"0A",X"F3",X"E0", + X"51",X"65",X"5E",X"EC",X"57",X"CE",X"00",X"76",X"94",X"54",X"40",X"22",X"0A",X"ED",X"07",X"76", + X"00",X"60",X"19",X"F4",X"1A",X"53",X"F4",X"80",X"ED",X"1F",X"76",X"01",X"60",X"19",X"54",X"D9", + X"22",X"03",X"0A",X"9B",X"E0",X"51",X"D9",X"9E",X"03",X"76",X"10",X"68",X"15",X"11",X"68",X"F7", + X"09",X"00",X"B6",X"33",X"51",X"71",X"FF",X"1A",X"21",X"72",X"76",X"00",X"60",X"19",X"5A",X"D9", + X"22",X"03",X"D9",X"21",X"02",X"1C",X"E0",X"51",X"D9",X"D1",X"03",X"CB",X"76",X"09",X"68",X"15", + X"08",X"68",X"F7",X"09",X"00",X"B6",X"B2",X"51",X"DC",X"A3",X"F7",X"00",X"0A",X"15",X"08",X"68", + X"76",X"5D",X"D1",X"A4",X"3F",X"5D",X"7A",X"E0",X"51",X"76",X"08",X"68",X"B3",X"0A",X"25",X"FF", + X"21",X"ED",X"0E",X"C0",X"89",X"FA",X"76",X"8E",X"54",X"15",X"0C",X"68",X"F7",X"06",X"00",X"B6", + X"B2",X"15",X"8D",X"60",X"D9",X"22",X"04",X"6E",X"08",X"EA",X"0D",X"B6",X"CF",X"72",X"B7",X"17", + X"04",X"B3",X"00",X"76",X"8A",X"60",X"B6",X"33",X"76",X"07",X"68",X"F7",X"03",X"00",X"B6",X"33", + X"15",X"C6",X"D3",X"D9",X"22",X"04",X"6E",X"08",X"EA",X"0F",X"B6",X"CF",X"B7",X"B7",X"B7",X"00", + X"00",X"04",X"B3",X"00",X"76",X"BE",X"D3",X"B6",X"33",X"76",X"11",X"68",X"F7",X"06",X"00",X"B6", + X"33",X"25",X"FF",X"18",X"9D",X"18",X"EE",X"DE",X"26",X"60",X"A4",X"C7",X"1F",X"A4",X"8F",X"17", + X"76",X"80",X"D0",X"F7",X"18",X"20",X"A4",X"52",X"5D",X"B5",X"00",X"00",X"00",X"00",X"B5",X"3C", + X"C0",X"22",X"82",X"EA",X"02",X"B6",X"CF",X"F4",X"07",X"2C",X"04",X"C0",X"89",X"F3",X"B5",X"FA", + X"B5",X"0B",X"36",X"46",X"56",X"66",X"76",X"86",X"96",X"A6",X"B6",X"C6",X"D6",X"06",X"08",X"28", + X"48",X"68",X"88",X"A8",X"05",X"1B",X"3B",X"5B",X"7B",X"9B",X"D9",X"22",X"00",X"F4",X"0C",X"2C", + X"2C",X"F4",X"23",X"2C",X"1F",X"F4",X"3A",X"2C",X"14",X"F4",X"51",X"2C",X"09",X"6E",X"5C",X"B6", + X"CF",X"15",X"1C",X"D6",X"1A",X"1E",X"6E",X"3A",X"15",X"65",X"D7",X"1A",X"21",X"6E",X"23",X"15", + X"85",X"D4",X"1A",X"10",X"6E",X"22",X"B6",X"CF",X"15",X"86",X"D4",X"1A",X"11",X"6E",X"0B",X"B6", + X"CF",X"15",X"BC",X"D4",X"EB",X"AB",X"00",X"4F",X"4F",X"4F",X"4F",X"4F",X"1A",X"03",X"EB",X"AB", + X"00",X"40",X"71",X"05",X"B5",X"15",X"00",X"04",X"CB",X"66",X"F8",X"40",X"71",X"00",X"3E",X"F7", + X"80",X"00",X"D6",X"DC",X"5C",X"89",X"F1",X"B5",X"F7",X"20",X"00",X"15",X"00",X"04",X"66",X"71", + X"2B",X"40",X"71",X"01",X"3E",X"D6",X"71",X"2C",X"40",X"71",X"01",X"B5",X"25",X"57",X"DE",X"E8", + X"D2",X"5C",X"DE",X"08",X"D3",X"25",X"02",X"DE",X"E8",X"D6",X"DE",X"08",X"D7",X"B5",X"DE",X"D0", + X"00",X"07",X"22",X"18",X"1E",X"FF",X"10",X"0E",X"1D",X"5E",X"D2",X"00",X"08",X"11",X"12",X"FF", + X"1C",X"0C",X"18",X"1B",X"0E",X"DD",X"D2",X"00",X"06",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1D", + X"18",X"19",X"02",X"17",X"0D",X"03",X"1B",X"0D",X"04",X"1D",X"11",X"05",X"1D",X"11",X"06",X"1D", + X"11",X"07",X"1D",X"11",X"08",X"1D",X"11",X"09",X"1D",X"11",X"FF",X"FF",X"FF",X"FF",X"16",X"1B", + X"2D",X"20",X"11",X"18",X"80",X"0C",X"0B",X"0A",X"80",X"11",X"10",X"0F",X"0E",X"0D",X"16",X"15", + X"14",X"13",X"12",X"1B",X"1A",X"19",X"18",X"17",X"20",X"1F",X"1E",X"1D",X"1C",X"02",X"01",X"23", + X"22",X"21",X"07",X"06",X"05",X"04",X"03",X"24",X"28",X"27",X"09",X"08",X"00",X"29",X"FF",X"2D", + X"80",X"97",X"CB",X"26",X"66",X"76",X"0B",X"62",X"71",X"00",X"C0",X"71",X"00",X"C0",X"71",X"00", + X"C0",X"71",X"00",X"76",X"D1",X"57",X"3C",X"C0",X"22",X"CB",X"66",X"A4",X"00",X"55",X"3E",X"DC", + X"23",X"ED",X"F4",X"76",X"D1",X"57",X"3C",X"A4",X"22",X"55",X"04",X"C0",X"22",X"CB",X"26",X"66", + X"76",X"F9",X"D4",X"A4",X"23",X"56",X"08",X"3E",X"D3",X"DC",X"23",X"ED",X"EA",X"7A",X"A1",X"55", + X"97",X"66",X"76",X"1F",X"62",X"B6",X"57",X"03",X"F8",X"76",X"2F",X"62",X"19",X"72",X"7D",X"03", + X"22",X"8B",X"F8",X"22",X"19",X"72",X"7D",X"05",X"3E",X"01",X"7A",X"52",X"55",X"3E",X"01",X"7A", + X"78",X"55",X"CB",X"B6",X"57",X"3D",X"1E",X"3D",X"6D",X"03",X"7D",X"F7",X"72",X"4B",X"1F",X"62", + X"17",X"DE",X"1F",X"62",X"6D",X"03",X"F4",X"03",X"ED",X"04",X"25",X"03",X"1A",X"12",X"F4",X"02", + X"ED",X"04",X"25",X"02",X"1A",X"0A",X"F4",X"01",X"ED",X"04",X"25",X"01",X"1A",X"02",X"25",X"00", + X"DC",X"B5",X"76",X"FB",X"D0",X"A4",X"23",X"56",X"00",X"00",X"00",X"22",X"00",X"F4",X"33",X"ED", + X"04",X"25",X"3B",X"1A",X"02",X"25",X"3C",X"F8",X"0C",X"71",X"3D",X"0C",X"71",X"3E",X"0C",X"71", + X"3F",X"15",X"E1",X"FF",X"40",X"71",X"40",X"B5",X"76",X"B9",X"D0",X"A4",X"23",X"56",X"00",X"00", + X"00",X"00",X"00",X"22",X"00",X"F4",X"33",X"ED",X"04",X"25",X"34",X"1A",X"02",X"25",X"38",X"F8", + X"15",X"20",X"00",X"40",X"71",X"35",X"40",X"71",X"36",X"C0",X"71",X"39",X"0C",X"40",X"71",X"37", + X"B5",X"76",X"D1",X"57",X"A4",X"D2",X"55",X"B6",X"57",X"72",X"45",X"A2",X"61",X"A4",X"C1",X"55", + X"45",X"A4",X"61",X"A4",X"C1",X"55",X"45",X"A6",X"61",X"A4",X"C1",X"55",X"3E",X"D3",X"DC",X"01", + X"B5",X"25",X"03",X"15",X"00",X"04",X"40",X"F8",X"C0",X"F8",X"15",X"E0",X"FF",X"40",X"F8",X"0C", + X"F8",X"B5",X"3C",X"C0",X"22",X"97",X"CB",X"66",X"76",X"F9",X"D0",X"A4",X"23",X"56",X"22",X"F4", + X"36",X"7D",X"06",X"F4",X"3E",X"7D",X"1D",X"1A",X"33",X"15",X"00",X"04",X"40",X"15",X"E0",X"FF", + X"3C",X"C0",X"A3",X"C0",X"A3",X"0C",X"0C",X"40",X"A3",X"40",X"A3",X"15",X"20",X"00",X"40",X"40", + X"40",X"A3",X"1A",X"18",X"15",X"00",X"04",X"40",X"15",X"C0",X"FF",X"3C",X"40",X"A3",X"15",X"20", + X"00",X"40",X"A3",X"40",X"C0",X"A3",X"C0",X"A3",X"0C",X"0C",X"0C",X"A3",X"3E",X"DC",X"01",X"23", + X"ED",X"B1",X"B5",X"72",X"3D",X"3D",X"3D",X"3D",X"6D",X"0F",X"F4",X"01",X"7D",X"05",X"0C",X"0C", + X"5E",X"1A",X"F7",X"15",X"40",X"00",X"65",X"6D",X"0F",X"F4",X"01",X"7D",X"04",X"40",X"5E",X"1A", + X"F8",X"B5",X"97",X"B3",X"0A",X"D4",X"0A",X"65",X"06",X"06",X"06",X"06",X"C8",X"CB",X"97",X"76", + X"F9",X"D0",X"A4",X"23",X"56",X"01",X"72",X"22",X"76",X"00",X"62",X"A5",X"F7",X"F0",X"FF",X"F4", + X"36",X"7D",X"0D",X"F4",X"3E",X"7D",X"16",X"DC",X"9A",X"ED",X"DC",X"23",X"ED",X"D7",X"01",X"B5", + X"19",X"21",X"0C",X"19",X"21",X"D6",X"19",X"AA",X"C0",X"19",X"AA",X"1A",X"EA",X"19",X"CD",X"0C", + X"19",X"11",X"D6",X"19",X"11",X"C0",X"19",X"CD",X"1A",X"DD",X"97",X"66",X"19",X"7C",X"19",X"38", + X"25",X"0F",X"E5",X"8B",X"5A",X"0E",X"72",X"19",X"7C",X"19",X"38",X"25",X"F0",X"E5",X"6E",X"20", + X"B2",X"06",X"06",X"06",X"06",X"72",X"3E",X"01",X"B5",X"C2",X"F4",X"00",X"7D",X"0D",X"65",X"6D", + X"0F",X"F4",X"01",X"ED",X"03",X"25",X"01",X"B5",X"25",X"03",X"B5",X"65",X"3D",X"3D",X"3D",X"3D", + X"6D",X"0F",X"F4",X"01",X"ED",X"03",X"25",X"01",X"B5",X"25",X"03",X"B5",X"97",X"CB",X"26",X"66", + X"76",X"D1",X"57",X"A4",X"DB",X"56",X"3E",X"D3",X"DC",X"01",X"B5",X"3C",X"C0",X"22",X"97",X"CB", + X"66",X"76",X"F9",X"D0",X"A4",X"23",X"56",X"22",X"F4",X"36",X"7D",X"06",X"F4",X"3E",X"7D",X"32", + X"1A",X"29",X"15",X"C0",X"03",X"40",X"22",X"6D",X"0F",X"72",X"15",X"40",X"00",X"40",X"22",X"6D", + X"0F",X"33",X"7D",X"17",X"A4",X"48",X"57",X"15",X"20",X"00",X"40",X"A3",X"15",X"E0",X"FF",X"40", + X"A3",X"C0",X"A3",X"C0",X"A3",X"0C",X"0C",X"40",X"A3",X"40",X"A3",X"3E",X"DC",X"01",X"23",X"ED", + X"BB",X"B5",X"15",X"02",X"04",X"40",X"22",X"6D",X"0F",X"72",X"0C",X"0C",X"22",X"6D",X"0F",X"33", + X"7D",X"E9",X"A4",X"48",X"57",X"15",X"E0",X"FF",X"0C",X"A3",X"C0",X"A3",X"C0",X"A3",X"C0",X"A3", + X"0C",X"0C",X"40",X"A3",X"40",X"A3",X"1A",X"D3",X"25",X"AA",X"DE",X"0F",X"62",X"66",X"26",X"CB", + X"97",X"F2",X"00",X"A4",X"2C",X"3C",X"01",X"DC",X"D3",X"3E",X"A4",X"26",X"1F",X"F4",X"02",X"EA", + X"03",X"B3",X"03",X"B5",X"65",X"F4",X"00",X"ED",X"03",X"B3",X"01",X"B5",X"F4",X"01",X"ED",X"03", + X"B3",X"03",X"B5",X"F4",X"02",X"ED",X"03",X"B3",X"03",X"B5",X"F4",X"03",X"ED",X"03",X"B3",X"00", + X"B5",X"B3",X"02",X"B5",X"66",X"26",X"CB",X"97",X"76",X"D1",X"57",X"C0",X"22",X"76",X"F9",X"D4", + X"A4",X"23",X"56",X"22",X"6D",X"0F",X"72",X"D4",X"00",X"CB",X"76",X"D1",X"57",X"A4",X"B3",X"57", + X"DC",X"C2",X"F4",X"00",X"ED",X"07",X"01",X"DC",X"D3",X"3E",X"A8",X"02",X"B5",X"01",X"DC",X"D3", + X"3E",X"A8",X"B5",X"3C",X"C0",X"22",X"66",X"CB",X"76",X"F9",X"D4",X"A4",X"23",X"56",X"22",X"DC", + X"3E",X"D9",X"3E",X"D3",X"6D",X"0F",X"DD",X"7D",X"01",X"7C",X"26",X"D9",X"66",X"23",X"ED",X"E4", + X"B5",X"1F",X"11",X"41",X"71",X"A1",X"22",X"52",X"33",X"63",X"93",X"14",X"44",X"74",X"A4",X"25", + X"85",X"36",X"66",X"96",X"17",X"47",X"77",X"A7",X"28",X"58",X"88",X"69",X"99",X"1A",X"4A",X"7A", + X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"66",X"26",X"CB",X"97",X"DE",X"3F",X"62",X"76",X"2B",X"60",X"B3",X"04",X"22", + X"B6",X"8D",X"AE",X"62",X"6D",X"03",X"F4",X"00",X"ED",X"0D",X"C0",X"C0",X"C0",X"C0",X"C0",X"7A", + X"44",X"58",X"00",X"00",X"00",X"00",X"00",X"19",X"22",X"7D",X"04",X"19",X"21",X"19",X"55",X"C0", + X"22",X"5A",X"00",X"6D",X"F0",X"5A",X"08",X"F8",X"C0",X"22",X"5A",X"02",X"6D",X"F0",X"5A",X"06", + X"F8",X"A4",X"94",X"58",X"23",X"ED",X"C8",X"76",X"01",X"90",X"19",X"22",X"ED",X"FC",X"19",X"22", + X"7D",X"FC",X"A4",X"C7",X"1F",X"CE",X"08",X"26",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"A4",X"C7", + X"1F",X"A4",X"8F",X"17",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"76",X"D1",X"57",X"FA",X"C0",X"66", + X"3C",X"65",X"76",X"F9",X"D4",X"CB",X"A4",X"23",X"56",X"22",X"6D",X"0F",X"72",X"4B",X"3F",X"62", + X"33",X"ED",X"03",X"A4",X"40",X"59",X"DC",X"3E",X"9A",X"ED",X"E3",X"D3",X"2A",X"ED",X"C8",X"01", + X"DC",X"D3",X"3E",X"B5",X"66",X"26",X"CB",X"97",X"69",X"0C",X"0D",X"1D",X"19",X"02",X"19",X"02", + X"19",X"02",X"19",X"02",X"6D",X"0F",X"5A",X"01",X"48",X"6A",X"8B",X"5A",X"F0",X"6D",X"F0",X"EC", + X"48",X"76",X"F9",X"D0",X"A4",X"23",X"56",X"22",X"F4",X"36",X"ED",X"03",X"A4",X"03",X"59",X"F4", + X"3E",X"ED",X"03",X"A4",X"03",X"59",X"C0",X"C0",X"22",X"F4",X"36",X"ED",X"03",X"A4",X"09",X"59", + X"F4",X"3E",X"ED",X"03",X"A4",X"09",X"59",X"15",X"C0",X"FF",X"40",X"22",X"F4",X"36",X"ED",X"03", + X"A4",X"0F",X"59",X"F4",X"3E",X"ED",X"03",X"A4",X"0F",X"59",X"0C",X"0C",X"22",X"F4",X"36",X"ED", + X"03",X"A4",X"15",X"59",X"F4",X"3E",X"ED",X"03",X"A4",X"15",X"59",X"01",X"DC",X"D3",X"3E",X"C0", + X"C0",X"C0",X"B5",X"66",X"CB",X"D4",X"03",X"1A",X"10",X"66",X"CB",X"D4",X"04",X"1A",X"0A",X"66", + X"CB",X"D4",X"01",X"1A",X"04",X"66",X"CB",X"D4",X"02",X"15",X"00",X"04",X"40",X"22",X"6D",X"0F", + X"72",X"4B",X"3F",X"62",X"33",X"ED",X"16",X"C2",X"B6",X"27",X"AE",X"62",X"76",X"2F",X"62",X"15", + X"FF",X"FF",X"04",X"65",X"F4",X"00",X"7D",X"04",X"40",X"5E",X"ED",X"FC",X"08",X"DC",X"3E",X"B5", + X"4B",X"3F",X"62",X"48",X"F7",X"00",X"FC",X"D6",X"22",X"F4",X"36",X"ED",X"03",X"7A",X"88",X"59", + X"F4",X"48",X"ED",X"03",X"7A",X"C0",X"59",X"F4",X"3E",X"ED",X"03",X"7A",X"14",X"5A",X"7A",X"56", + X"5A",X"F7",X"C0",X"FF",X"F2",X"FF",X"66",X"D6",X"07",X"F7",X"1F",X"00",X"D6",X"07",X"C0",X"07", + X"C0",X"07",X"F7",X"1E",X"00",X"D6",X"07",X"C0",X"07",X"C0",X"07",X"C0",X"07",X"F7",X"1D",X"00", + X"D6",X"07",X"C0",X"07",X"C0",X"07",X"3E",X"B5",X"A4",X"61",X"59",X"71",X"48",X"F7",X"00",X"04", + X"66",X"D6",X"91",X"3E",X"66",X"C0",X"71",X"47",X"D6",X"91",X"3E",X"66",X"CB",X"F7",X"21",X"00", + X"D6",X"71",X"46",X"DC",X"D6",X"91",X"3E",X"66",X"CB",X"F7",X"E0",X"FF",X"D6",X"DC",X"71",X"49", + X"D6",X"91",X"3E",X"66",X"CB",X"F7",X"DF",X"FF",X"D6",X"71",X"4A",X"DC",X"D6",X"91",X"3E",X"B5", + X"A4",X"61",X"59",X"F7",X"00",X"04",X"66",X"71",X"3E",X"D6",X"91",X"3E",X"66",X"C0",X"71",X"3D", + X"D6",X"91",X"3E",X"66",X"C0",X"C0",X"92",X"6D",X"1F",X"F4",X"1A",X"2C",X"04",X"71",X"3C",X"1A", + X"02",X"71",X"3B",X"D6",X"91",X"3E",X"66",X"0C",X"71",X"3F",X"D6",X"91",X"3E",X"66",X"CB",X"F7", + X"E0",X"FF",X"D6",X"DC",X"71",X"40",X"D6",X"91",X"3E",X"E0",X"F4",X"D0",X"ED",X"08",X"92",X"6D", + X"E0",X"F4",X"E0",X"ED",X"01",X"B5",X"66",X"CB",X"F7",X"C0",X"FF",X"D6",X"71",X"33",X"DC",X"D6", + X"71",X"00",X"3E",X"B5",X"A4",X"61",X"59",X"F7",X"00",X"04",X"66",X"71",X"42",X"D6",X"91",X"3E", + X"66",X"0C",X"71",X"44",X"D6",X"91",X"3E",X"66",X"CB",X"F7",X"E0",X"FF",X"D6",X"DC",X"71",X"40", + X"D6",X"91",X"3E",X"66",X"CB",X"F7",X"E1",X"FF",X"D6",X"DC",X"71",X"41",X"D6",X"91",X"3E",X"66", + X"CB",X"F7",X"20",X"00",X"D6",X"DC",X"71",X"43",X"D6",X"91",X"3E",X"66",X"CB",X"F7",X"1F",X"00", + X"D6",X"DC",X"D6",X"91",X"3E",X"B5",X"A4",X"61",X"59",X"F7",X"00",X"04",X"66",X"71",X"36",X"D6", + X"91",X"3E",X"66",X"C0",X"71",X"39",X"D6",X"91",X"3E",X"66",X"CB",X"F7",X"20",X"00",X"D6",X"DC", + X"71",X"37",X"D6",X"91",X"3E",X"66",X"CB",X"F7",X"E0",X"FF",X"D6",X"DC",X"71",X"35",X"D6",X"91", + X"3E",X"66",X"CB",X"F7",X"C0",X"FF",X"D6",X"DC",X"E0",X"F4",X"D0",X"ED",X"0B",X"92",X"6D",X"E0", + X"F4",X"A0",X"ED",X"04",X"71",X"38",X"1A",X"02",X"71",X"34",X"D6",X"91",X"3E",X"92",X"6D",X"1F", + X"F4",X"19",X"EA",X"09",X"66",X"C0",X"C0",X"71",X"33",X"D6",X"71",X"00",X"3E",X"B5",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"EE",X"DE",X"65",X"60",X"76",X"0F",X"5C",X"15",X"1C",X"60",X"F7",X"32",X"00",X"00", + X"00",X"76",X"56",X"5C",X"A4",X"36",X"5D",X"4B",X"03",X"90",X"6D",X"0F",X"97",X"76",X"27",X"D1", + X"A4",X"41",X"5C",X"01",X"72",X"25",X"06",X"DE",X"27",X"D5",X"DE",X"27",X"D6",X"4B",X"03",X"90", + X"6D",X"F0",X"BC",X"BC",X"BC",X"BC",X"33",X"31",X"76",X"25",X"D1",X"A4",X"41",X"5C",X"25",X"06", + X"DE",X"25",X"D5",X"DE",X"25",X"D6",X"76",X"1B",X"5D",X"A4",X"36",X"5D",X"51",X"A4",X"36",X"5D", + X"B5",X"97",X"CB",X"B3",X"1F",X"A4",X"2E",X"50",X"DC",X"01",X"B5",X"76",X"1C",X"60",X"71",X"00", + X"15",X"1D",X"60",X"F7",X"31",X"00",X"B6",X"B2",X"A4",X"C7",X"1F",X"7A",X"53",X"50",X"B5",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"66",X"B7",X"57",X"CE",X"00",X"76",X"65",X"5C",X"40",X"69",X"C0",X"0D",X"3E",X"B3",X"0F", + X"D4",X"02",X"A4",X"3F",X"5D",X"B5",X"69",X"D1",X"00",X"0B",X"12",X"17",X"1C",X"0E",X"1B",X"1D", + X"FF",X"0C",X"18",X"12",X"17",X"85",X"5C",X"85",X"5C",X"85",X"5C",X"85",X"5C",X"85",X"5C",X"85", + X"5C",X"0C",X"5D",X"FD",X"5C",X"EE",X"5C",X"DF",X"5C",X"D0",X"5C",X"C1",X"5C",X"B2",X"5C",X"A3", + X"5C",X"94",X"5C",X"85",X"5C",X"01",X"FF",X"0C",X"18",X"12",X"17",X"FF",X"FF",X"01",X"FF",X"19", + X"15",X"0A",X"22",X"FF",X"01",X"FF",X"0C",X"18",X"12",X"17",X"FF",X"FF",X"02",X"FF",X"19",X"15", + X"0A",X"22",X"1C",X"01",X"FF",X"0C",X"18",X"12",X"17",X"FF",X"FF",X"03",X"FF",X"19",X"15",X"0A", + X"22",X"1C",X"01",X"FF",X"0C",X"18",X"12",X"17",X"FF",X"FF",X"04",X"FF",X"19",X"15",X"0A",X"22", + X"1C",X"01",X"FF",X"0C",X"18",X"12",X"17",X"FF",X"FF",X"05",X"FF",X"19",X"15",X"0A",X"22",X"1C", + X"02",X"FF",X"0C",X"18",X"12",X"17",X"1C",X"FF",X"01",X"FF",X"19",X"15",X"0A",X"22",X"FF",X"02", + X"FF",X"0C",X"18",X"12",X"17",X"1C",X"FF",X"03",X"FF",X"19",X"15",X"0A",X"22",X"1C",X"03",X"FF", + X"0C",X"18",X"12",X"17",X"1C",X"FF",X"01",X"FF",X"19",X"15",X"0A",X"22",X"FF",X"03",X"FF",X"0C", + X"18",X"12",X"17",X"1C",X"FF",X"02",X"FF",X"19",X"15",X"0A",X"22",X"1C",X"04",X"FF",X"0C",X"18", + X"12",X"17",X"1C",X"FF",X"01",X"FF",X"19",X"15",X"0A",X"22",X"FF",X"E8",X"D0",X"01",X"05",X"1B", + X"12",X"10",X"11",X"1D",X"E6",X"D0",X"01",X"04",X"15",X"0E",X"0F",X"1D",X"B3",X"03",X"7B",X"21", + X"F9",X"C7",X"C0",X"89",X"F9",X"B5",X"69",X"C0",X"0D",X"C0",X"FA",X"C0",X"3C",X"C0",X"51",X"26", + X"66",X"7B",X"F8",X"15",X"00",X"04",X"40",X"08",X"3E",X"15",X"20",X"00",X"40",X"D3",X"C7",X"89", + X"EE",X"B5",X"26",X"15",X"00",X"04",X"CB",X"66",X"66",X"71",X"FF",X"40",X"71",X"00",X"3E",X"C0", + X"89",X"F6",X"3E",X"F7",X"20",X"00",X"D6",X"DC",X"9A",X"ED",X"EB",X"D3",X"B5",X"15",X"BD",X"D2", + X"76",X"05",X"68",X"EE",X"B3",X"06",X"B6",X"EB",X"7D",X"09",X"FE",X"80",X"97",X"6D",X"0F",X"5A", + X"00",X"18",X"01",X"66",X"76",X"20",X"00",X"40",X"51",X"3E",X"19",X"81",X"7D",X"05",X"B6",X"EB", + X"C0",X"1A",X"06",X"19",X"AE",X"ED",X"02",X"FE",X"80",X"89",X"DB",X"B5",X"F7",X"18",X"18",X"76", + X"85",X"D0",X"A4",X"52",X"5D",X"76",X"1C",X"60",X"15",X"05",X"00",X"71",X"00",X"40",X"71",X"00", + X"40",X"B3",X"07",X"40",X"71",X"00",X"89",X"FB",X"A4",X"BC",X"5D",X"B5",X"7A",X"EB",X"5D",X"91", + X"C0",X"07",X"C0",X"66",X"26",X"15",X"FE",X"03",X"40",X"F8",X"C0",X"F8",X"D3",X"3E",X"89",X"EF", + X"B5",X"91",X"CB",X"F7",X"20",X"00",X"D6",X"07",X"D6",X"DC",X"66",X"26",X"15",X"C0",X"03",X"40", + X"F8",X"15",X"20",X"00",X"40",X"F8",X"D3",X"3E",X"89",X"E7",X"B5",X"15",X"E5",X"E5",X"25",X"02", + X"B3",X"0B",X"76",X"BC",X"D0",X"A4",X"D1",X"5D",X"15",X"52",X"52",X"25",X"02",X"B3",X"0C",X"76", + X"85",X"D0",X"A4",X"D1",X"5D",X"15",X"4C",X"4C",X"25",X"02",X"B3",X"0C",X"76",X"86",X"D0",X"A4", + X"BF",X"5D",X"15",X"50",X"50",X"B3",X"0C",X"76",X"66",X"D3",X"A4",X"BF",X"5D",X"15",X"54",X"54", + X"76",X"9E",X"D0",X"25",X"02",X"B3",X"0C",X"A4",X"D1",X"5D",X"25",X"4D",X"DE",X"85",X"D0",X"25", + X"51",X"DE",X"65",X"D3",X"25",X"4B",X"DE",X"9E",X"D0",X"25",X"4E",X"76",X"7E",X"D3",X"F8",X"25", + X"4F",X"0C",X"F8",X"0C",X"F8",X"B5",X"FF",X"D9",X"66",X"E2",X"66",X"A4",X"D1",X"1D",X"A4",X"8B", + X"1E",X"B3",X"06",X"25",X"05",X"76",X"A1",X"D5",X"A4",X"7D",X"1E",X"A4",X"E0",X"1E",X"A4",X"26", + X"28",X"B3",X"05",X"25",X"01",X"76",X"E1",X"D4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"D9",X"76",X"1C",X"60",X"D9",X"71",X"00",X"82",X"D9",X"71",X"01",X"08", + X"D9",X"71",X"02",X"0F",X"A4",X"7F",X"1F",X"D9",X"F8",X"03",X"D9",X"A3",X"04",X"A4",X"C7",X"1F", + X"A4",X"8F",X"17",X"D9",X"71",X"00",X"81",X"E2",X"3E",X"D9",X"3E",X"B5",X"15",X"26",X"60",X"76", + X"12",X"68",X"F7",X"03",X"00",X"B6",X"B2",X"51",X"71",X"00",X"C0",X"71",X"00",X"B5",X"15",X"3F", + X"60",X"1A",X"EC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"40",X"71",X"0D", + X"40",X"7A",X"FA",X"1E",X"71",X"1C",X"40",X"71",X"0C",X"40",X"71",X"18",X"40",X"71",X"1B",X"40", + X"71",X"0E",X"40",X"04",X"B3",X"01",X"B5",X"A4",X"0D",X"30",X"A4",X"41",X"5F",X"A4",X"06",X"44", + X"B5",X"76",X"0C",X"62",X"19",X"0D",X"31",X"D9",X"66",X"76",X"01",X"60",X"19",X"5A",X"B3",X"48", + X"CB",X"A4",X"C7",X"1F",X"A4",X"8F",X"17",X"A4",X"5A",X"2D",X"A4",X"6C",X"5F",X"DC",X"89",X"F0", + X"EE",X"DE",X"49",X"60",X"76",X"26",X"60",X"19",X"54",X"D9",X"3E",X"B5",X"3E",X"DC",X"CB",X"66", + X"65",X"F4",X"01",X"ED",X"2C",X"76",X"0C",X"62",X"71",X"00",X"0C",X"22",X"DE",X"C3",X"61",X"D9", + X"76",X"2B",X"60",X"15",X"05",X"00",X"B3",X"04",X"D9",X"19",X"00",X"4E",X"7D",X"0E",X"D9",X"19", + X"04",X"66",X"7D",X"08",X"D9",X"19",X"00",X"86",X"D9",X"19",X"00",X"8E",X"D9",X"40",X"89",X"E8", + X"B5",X"BC",X"84",X"BC",X"84",X"BC",X"84",X"6D",X"0F",X"31",X"72",X"25",X"68",X"5A",X"04",X"89", + X"FC",X"D4",X"1C",X"D9",X"66",X"D9",X"76",X"2B",X"60",X"15",X"05",X"00",X"B3",X"04",X"D9",X"19", + X"00",X"4E",X"7D",X"18",X"97",X"25",X"48",X"D9",X"21",X"03",X"7D",X"06",X"D9",X"19",X"04",X"66", + X"7D",X"09",X"01",X"D9",X"F8",X"03",X"D9",X"08",X"04",X"1A",X"01",X"01",X"D9",X"40",X"89",X"DE", + X"D9",X"3E",X"B5",X"FF",X"FF",X"EE",X"DE",X"21",X"60",X"7A",X"7A",X"44",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_sprite_l.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_sprite_l.vhd new file mode 100644 index 00000000..25912b85 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_sprite_l.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_sprite_l is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_sprite_l is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"03",X"FF",X"0F",X"EB",X"3F",X"AB",X"3F",X"AB",X"3F",X"AB",X"0F",X"AB",X"03",X"EB", + X"00",X"00",X"00",X"00",X"54",X"00",X"43",X"00",X"43",X"00",X"FF",X"00",X"57",X"00",X"43",X"00", + X"0F",X"FB",X"3F",X"FF",X"3F",X"FF",X"3F",X"FF",X"3F",X"FF",X"0F",X"FF",X"03",X"F0",X"00",X"00", + X"43",X"00",X"FC",X"00",X"FC",X"00",X"F0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"3F",X"03",X"FB",X"0F",X"EB",X"3F",X"EB",X"3F",X"EB",X"3F",X"EB",X"03",X"EB", + X"00",X"00",X"C0",X"00",X"54",X"00",X"04",X"00",X"07",X"00",X"FF",X"00",X"57",X"00",X"07",X"00", + X"3F",X"FB",X"3F",X"FF",X"3F",X"FF",X"0F",X"FF",X"03",X"FF",X"00",X"FF",X"00",X"00",X"00",X"00", + X"04",X"00",X"FC",X"00",X"F0",X"00",X"F0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"3F",X"FF",X"3F",X"FB",X"3F",X"EB",X"0F",X"EB",X"0F",X"EB",X"03",X"EB",X"03",X"EB", + X"00",X"00",X"00",X"00",X"54",X"00",X"43",X"00",X"43",X"00",X"FF",X"00",X"43",X"00",X"43",X"00", + X"07",X"FB",X"0F",X"FF",X"0F",X"FF",X"1F",X"FF",X"3F",X"FF",X"3F",X"FC",X"2F",X"40",X"00",X"00", + X"54",X"00",X"FC",X"00",X"F0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"FF",X"0F",X"FF",X"3F",X"EB",X"3F",X"AB",X"0F",X"AB",X"03",X"AB", + X"00",X"00",X"00",X"00",X"C0",X"00",X"FC",X"00",X"57",X"00",X"43",X"00",X"43",X"C0",X"FF",X"C0", + X"03",X"AB",X"03",X"AB",X"03",X"AB",X"03",X"AB",X"00",X"FF",X"00",X"3F",X"00",X"00",X"00",X"00", + X"FF",X"C0",X"43",X"C0",X"43",X"00",X"57",X"00",X"FC",X"00",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"FC",X"0F",X"FF",X"3F",X"FF",X"3F",X"EF",X"3F",X"AF",X"0F",X"AF",X"03",X"AF", + X"00",X"00",X"00",X"00",X"C0",X"00",X"F0",X"00",X"54",X"00",X"07",X"00",X"07",X"00",X"FF",X"00", + X"03",X"AF",X"0F",X"AF",X"3F",X"AF",X"3F",X"EF",X"3F",X"FF",X"0F",X"FF",X"03",X"FC",X"00",X"00", + X"FF",X"00",X"57",X"00",X"07",X"00",X"04",X"00",X"F0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"3C",X"00",X"FF",X"03",X"FF",X"03",X"EF",X"03",X"AF",X"0F",X"AF",X"0F",X"AF", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"54",X"00",X"04",X"00",X"04",X"00",X"F0",X"00", + X"0F",X"AF",X"0F",X"AF",X"3F",X"AF",X"3F",X"EF",X"3F",X"FF",X"0F",X"FF",X"03",X"F0",X"00",X"00", + X"F0",X"00",X"04",X"00",X"04",X"00",X"54",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"02",X"A8",X"02",X"AF",X"02",X"AD",X"03",X"F5",X"03",X"F5",X"03",X"F5",X"23",X"F5", + X"00",X"00",X"A0",X"14",X"FC",X"54",X"7C",X"50",X"50",X"C0",X"5F",X"C0",X"5F",X"C0",X"70",X"C0", + X"2B",X"FD",X"2B",X"FF",X"2B",X"FE",X"03",X"FE",X"00",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"C0",X"FF",X"D4",X"BF",X"54",X"AC",X"50",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"3E",X"20",X"FF",X"2B",X"F7",X"2B",X"F5",X"2B",X"F5",X"03",X"F5",X"23",X"F5", + X"00",X"00",X"A0",X"14",X"FC",X"54",X"F3",X"50",X"C3",X"C0",X"FF",X"C0",X"FF",X"C0",X"C3",X"C0", + X"2B",X"F7",X"2B",X"FF",X"2B",X"FF",X"03",X"FF",X"00",X"FE",X"00",X"02",X"00",X"00",X"00",X"00", + X"F3",X"C0",X"FF",X"C0",X"FF",X"50",X"AC",X"54",X"A0",X"14",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"02",X"00",X"FF",X"23",X"F5",X"2B",X"F5",X"2B",X"F5",X"2B",X"F5",X"03",X"F5", + X"00",X"00",X"A0",X"00",X"FC",X"14",X"C3",X"54",X"73",X"D4",X"7F",X"C0",X"7F",X"C0",X"C3",X"C0", + X"03",X"F7",X"03",X"F7",X"03",X"FF",X"02",X"AF",X"02",X"AF",X"02",X"A8",X"00",X"00",X"00",X"00", + X"F3",X"C0",X"FF",X"C0",X"FF",X"50",X"AC",X"54",X"A8",X"14",X"28",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"FF",X"23",X"FE",X"2B",X"FA",X"2B",X"DB",X"2B",X"EA",X"03",X"D9", + X"00",X"00",X"00",X"00",X"A0",X"00",X"AC",X"50",X"BF",X"54",X"F3",X"D4",X"C3",X"C0",X"FF",X"C0", + X"03",X"EA",X"03",X"D9",X"03",X"EB",X"03",X"FB",X"0A",X"BF",X"0A",X"BF",X"0A",X"A2",X"00",X"02", + X"FF",X"C0",X"F3",X"C0",X"C3",X"C0",X"FF",X"50",X"FC",X"54",X"A0",X"14",X"A0",X"00",X"80",X"00", + X"00",X"00",X"00",X"02",X"00",X"FE",X"23",X"FF",X"2B",X"FB",X"2B",X"FA",X"2B",X"FE",X"03",X"FE", + X"00",X"00",X"80",X"00",X"A0",X"14",X"AC",X"54",X"FF",X"50",X"F3",X"C0",X"C3",X"C0",X"FF",X"C0", + X"03",X"FE",X"2B",X"FE",X"2B",X"FA",X"2B",X"FB",X"23",X"FF",X"00",X"FE",X"00",X"02",X"00",X"00", + X"FF",X"C0",X"C3",X"C0",X"F3",X"C0",X"FF",X"50",X"AC",X"54",X"A0",X"14",X"80",X"00",X"00",X"00", + X"00",X"02",X"0A",X"A2",X"0A",X"BF",X"0A",X"BF",X"03",X"DF",X"03",X"E7",X"03",X"D9",X"03",X"EA", + X"80",X"00",X"A0",X"00",X"A0",X"14",X"FC",X"54",X"FF",X"50",X"C3",X"C0",X"F3",X"C0",X"FF",X"C0", + X"03",X"D9",X"2B",X"EA",X"2B",X"D7",X"2B",X"EE",X"23",X"FE",X"00",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"C0",X"C3",X"C0",X"F3",X"D4",X"BF",X"54",X"AC",X"50",X"A0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"28",X"20",X"AF",X"28",X"FF",X"2B",X"FC",X"2B",X"F0",X"0F",X"FC",X"0F",X"5F", + X"01",X"40",X"05",X"40",X"F5",X"00",X"FF",X"05",X"FF",X"D5",X"3F",X"D4",X"FF",X"F0",X"F3",X"F0", + X"0F",X"D7",X"0F",X"F5",X"03",X"FD",X"03",X"FF",X"00",X"FF",X"00",X"0F",X"00",X"00",X"00",X"00", + X"C0",X"F0",X"F3",X"F8",X"7F",X"E8",X"7F",X"E0",X"FF",X"00",X"FA",X"80",X"0A",X"A0",X"00",X"00", + X"00",X"00",X"02",X"80",X"50",X"AF",X"54",X"FF",X"17",X"F3",X"03",X"C0",X"0F",X"F3",X"0F",X"FF", + X"00",X"00",X"2A",X"80",X"FA",X"80",X"FF",X"00",X"F7",X"C0",X"DF",X"C0",X"F7",X"F0",X"DF",X"F0", + X"0F",X"FF",X"0F",X"F3",X"03",X"C0",X"17",X"F3",X"54",X"FF",X"50",X"AF",X"02",X"80",X"00",X"00", + X"DF",X"F0",X"F7",X"F0",X"DF",X"C0",X"F7",X"C0",X"FF",X"00",X"FA",X"80",X"2A",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"FF",X"03",X"FF",X"03",X"FD",X"0F",X"F5",X"0F",X"D7", + X"00",X"00",X"0A",X"A0",X"FA",X"80",X"FF",X"00",X"7F",X"E0",X"7F",X"E8",X"F3",X"F8",X"C0",X"F0", + X"0F",X"5F",X"0F",X"FC",X"2B",X"F0",X"2B",X"FC",X"28",X"FF",X"20",X"AF",X"00",X"28",X"00",X"00", + X"F3",X"F0",X"FF",X"F0",X"3F",X"D4",X"FF",X"D5",X"FF",X"05",X"F5",X"00",X"05",X"40",X"01",X"40", + X"00",X"00",X"00",X"28",X"20",X"AF",X"28",X"FF",X"2B",X"FC",X"2B",X"F0",X"0F",X"FC",X"0F",X"0F", + X"01",X"40",X"05",X"40",X"F5",X"00",X"FF",X"05",X"FF",X"D5",X"3F",X"D4",X"FF",X"F0",X"F3",X"F0", + X"0F",X"D7",X"0F",X"F5",X"03",X"FD",X"03",X"FF",X"00",X"FF",X"00",X"0F",X"00",X"00",X"00",X"00", + X"C0",X"F0",X"F3",X"F8",X"7F",X"E8",X"7F",X"E0",X"FF",X"00",X"FA",X"80",X"0A",X"A0",X"00",X"00", + X"00",X"00",X"02",X"80",X"50",X"AF",X"54",X"FF",X"17",X"F3",X"03",X"C0",X"0F",X"F3",X"0F",X"FF", + X"00",X"00",X"2A",X"80",X"FA",X"80",X"FF",X"00",X"F7",X"C0",X"DF",X"C0",X"F7",X"F0",X"DF",X"F0", + X"0F",X"FF",X"0F",X"F3",X"03",X"C0",X"17",X"F3",X"54",X"FF",X"50",X"AF",X"02",X"80",X"00",X"00", + X"DF",X"F0",X"F7",X"F0",X"DF",X"C0",X"F7",X"C0",X"FF",X"00",X"FA",X"80",X"2A",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"FF",X"03",X"FF",X"03",X"FD",X"0F",X"F5",X"0F",X"D7", + X"00",X"00",X"0A",X"A0",X"FA",X"80",X"FF",X"00",X"7F",X"E0",X"7F",X"E8",X"F3",X"F8",X"C0",X"F0", + X"0F",X"5F",X"0F",X"FC",X"2B",X"F0",X"2B",X"FC",X"28",X"FF",X"20",X"AF",X"00",X"28",X"00",X"00", + X"F3",X"F0",X"FF",X"F0",X"3F",X"D4",X"FF",X"D5",X"FF",X"05",X"F5",X"00",X"05",X"40",X"01",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"25",X"02",X"A5",X"2A",X"A5", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"65",X"00",X"65",X"90",X"96",X"54", + X"2A",X"A5",X"2A",X"A5",X"2A",X"A5",X"02",X"A5",X"00",X"25",X"00",X"05",X"00",X"01",X"00",X"00", + X"96",X"54",X"95",X"90",X"95",X"90",X"95",X"40",X"95",X"40",X"65",X"00",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"25",X"02",X"A5",X"2A",X"A5",X"2A",X"A5", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"64",X"00",X"65",X"80",X"95",X"90",X"96",X"50", + X"2A",X"A5",X"2A",X"A6",X"02",X"A6",X"00",X"26",X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"00", + X"96",X"54",X"56",X"50",X"59",X"40",X"58",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"00",X"05",X"00",X"25",X"02",X"A5",X"2A",X"A5",X"2A",X"A5",X"2A",X"A5", + X"00",X"00",X"40",X"00",X"65",X"00",X"65",X"40",X"95",X"40",X"95",X"90",X"95",X"90",X"96",X"54", + X"2A",X"A5",X"02",X"A5",X"00",X"25",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"96",X"54",X"A5",X"90",X"65",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"15",X"00",X"25",X"02",X"A5",X"2A",X"A5",X"2A",X"A5", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"94",X"00",X"96",X"40",X"66",X"50",X"65",X"94", + X"2A",X"A5",X"2A",X"A5",X"02",X"A5",X"00",X"25",X"00",X"15",X"00",X"04",X"00",X"00",X"00",X"00", + X"65",X"94",X"66",X"50",X"96",X"50",X"95",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"25",X"02",X"A5",X"2A",X"A5",X"2A",X"A5", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"64",X"00",X"65",X"80",X"95",X"90",X"96",X"50", + X"2A",X"A5",X"2A",X"A6",X"02",X"A6",X"00",X"26",X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"00", + X"96",X"54",X"56",X"50",X"59",X"40",X"58",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"25",X"02",X"A5",X"2A",X"96",X"2A",X"96", + X"00",X"00",X"00",X"00",X"00",X"00",X"50",X"00",X"65",X"00",X"95",X"90",X"56",X"94",X"56",X"54", + X"2A",X"96",X"2A",X"96",X"02",X"A5",X"00",X"25",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"56",X"54",X"56",X"90",X"95",X"80",X"65",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0E",X"02",X"AB", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"AC",X"00",X"AF",X"00", + X"0A",X"BF",X"0A",X"FF",X"03",X"F5",X"03",X"F5",X"03",X"F5",X"0F",X"D5",X"0F",X"D5",X"0F",X"D5", + X"FF",X"05",X"FF",X"C5",X"FF",X"D5",X"7F",X"14",X"5F",X"30",X"5C",X"30",X"5F",X"F0",X"5F",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0E",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"AC",X"00",X"AF",X"00", + X"23",X"FF",X"23",X"FF",X"2B",X"FD",X"2B",X"FD",X"2B",X"FD",X"0F",X"FF",X"0F",X"FF",X"0F",X"FF", + X"FF",X"05",X"FF",X"C5",X"FF",X"D5",X"FC",X"D4",X"7C",X"F0",X"70",X"F0",X"7F",X"F0",X"7F",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"00",X"A8",X"00",X"AF",X"00", + X"23",X"FF",X"23",X"FF",X"2B",X"FF",X"2B",X"F7",X"2B",X"F5",X"0F",X"F5",X"0F",X"F5",X"0F",X"F5", + X"FF",X"50",X"FF",X"54",X"FF",X"D4",X"FC",X"D4",X"FC",X"F0",X"70",X"F0",X"7F",X"F0",X"7F",X"F0", + X"0F",X"D5",X"0F",X"D5",X"0F",X"D5",X"2B",X"F5",X"2B",X"F5",X"2B",X"F5",X"23",X"FF",X"23",X"FF", + X"5F",X"F0",X"5F",X"F0",X"5C",X"30",X"5F",X"30",X"7F",X"14",X"FF",X"D4",X"FF",X"54",X"FF",X"50", + X"00",X"FF",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AF",X"00",X"A8",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"FF",X"0F",X"FF",X"0F",X"FF",X"2B",X"FD",X"2B",X"FD",X"2B",X"FD",X"23",X"FF",X"23",X"FF", + X"7F",X"F0",X"7F",X"F0",X"70",X"F0",X"7C",X"F0",X"FC",X"D4",X"FF",X"D5",X"FF",X"C5",X"FF",X"05", + X"00",X"FF",X"00",X"0E",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AF",X"00",X"AC",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"F5",X"0F",X"F5",X"0F",X"F5",X"03",X"F5",X"03",X"F7",X"03",X"FF",X"0A",X"FF",X"0A",X"BF", + X"7F",X"F0",X"7F",X"F0",X"70",X"F0",X"FC",X"F0",X"FC",X"D4",X"FF",X"D5",X"FF",X"C5",X"FF",X"05", + X"02",X"AB",X"00",X"02",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AF",X"00",X"AC",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"20",X"FF",X"2B",X"FF",X"2B",X"FD",X"03",X"FD", + X"00",X"00",X"00",X"00",X"00",X"00",X"E8",X"50",X"AF",X"50",X"F3",X"D4",X"F0",X"D4",X"7F",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"20",X"FF",X"2B",X"FF",X"2B",X"FF",X"03",X"FD", + X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"00",X"AF",X"00",X"BF",X"D5",X"F0",X"D5",X"3F",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"AF",X"02",X"BF",X"02",X"BE",X"03",X"F5",X"03",X"FD", + X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"00",X"AC",X"50",X"BF",X"50",X"C3",X"50",X"FF",X"C0", + X"03",X"FD",X"2B",X"FD",X"2B",X"FF",X"20",X"FF",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"F0",X"F0",X"D4",X"F3",X"D4",X"AF",X"50",X"E8",X"50",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"FD",X"03",X"FF",X"02",X"BF",X"02",X"BF",X"02",X"AF",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"F0",X"F0",X"D5",X"BF",X"D5",X"AF",X"00",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"FD",X"2B",X"F5",X"2B",X"FE",X"20",X"FF",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"C0",X"C3",X"50",X"BF",X"50",X"AC",X"50",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"FC",X"0F",X"FF",X"3F",X"B0",X"3E",X"F0",X"3E",X"F5",X"0E",X"FF",X"0E",X"FF", + X"00",X"00",X"00",X"00",X"C0",X"00",X"70",X"00",X"7C",X"00",X"7C",X"00",X"FF",X"00",X"FF",X"00", + X"0E",X"F0",X"0E",X"B0",X"3F",X"B5",X"3F",X"FF",X"3F",X"FF",X"0F",X"FF",X"03",X"FC",X"00",X"00", + X"7F",X"00",X"7F",X"00",X"7C",X"00",X"FC",X"00",X"F0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0F",X"00",X"3F",X"C0",X"3F",X"F3",X"3F",X"BD",X"3F",X"AD",X"0F",X"AD",X"0F",X"AF", + X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"00",X"0F",X"00",X"0F",X"00",X"5F",X"00",X"FF",X"00", + X"3F",X"AD",X"3F",X"AD",X"3F",X"BD",X"3F",X"FF",X"0F",X"FF",X"0F",X"FF",X"03",X"FC",X"00",X"00", + X"0F",X"00",X"0C",X"00",X"5C",X"00",X"FC",X"00",X"F0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"3F",X"03",X"F5",X"0F",X"B4",X"3E",X"F4",X"3E",X"FF",X"3E",X"FF",X"3E",X"F5", + X"00",X"00",X"C0",X"00",X"70",X"00",X"3C",X"00",X"3C",X"00",X"FC",X"00",X"FC",X"00",X"7C",X"00", + X"0E",X"B4",X"0F",X"B4",X"3F",X"FF",X"3F",X"FF",X"3F",X"FF",X"3F",X"FF",X"03",X"F0",X"00",X"00", + X"30",X"00",X"30",X"00",X"F0",X"00",X"C0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AB",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"BA",X"AA",X"FA",X"AA",X"FE",X"EA",X"BA",X"FA",X"AA",X"FA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AB",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"FA",X"AA",X"FA",X"AA",X"EA",X"BA",X"AA",X"FA",X"AA",X"FE",X"AA",X"BA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AB",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"BA",X"AA",X"FE",X"AA",X"EE",X"EA",X"BA",X"BA",X"AA",X"BA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AB",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"BA",X"AA",X"BA",X"AA",X"EA",X"AA",X"AA",X"BA",X"AA",X"FE",X"AA",X"EE",X"AA",X"BA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AB",X"AA",X"AB",X"AA",X"AB",X"AA",X"AF",X"AA",X"AF", + X"AA",X"AA",X"AA",X"BA",X"AA",X"FE",X"AA",X"BE",X"EA",X"BA",X"EA",X"AA",X"FA",X"AA",X"FA",X"AA", + X"AA",X"AF",X"AA",X"AF",X"AA",X"AB",X"AA",X"AB",X"AA",X"AB",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"FA",X"AA",X"FA",X"AA",X"EA",X"AA",X"EA",X"BA",X"AA",X"FE",X"AA",X"BE",X"AA",X"BA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AB",X"AA",X"AB",X"AA",X"AF", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"EA",X"AA",X"EA",X"AA",X"EA",X"AA",X"EA",X"AA", + X"AA",X"AF",X"AA",X"AB",X"AA",X"AB",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"EA",X"AA",X"EA",X"AA",X"EA",X"AA",X"EA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AB",X"AA",X"AB",X"AA",X"AF", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"EA",X"AA",X"FA",X"AA",X"FA",X"AA",X"FA",X"AA", + X"AA",X"AF",X"AA",X"AB",X"AA",X"AB",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"FA",X"AA",X"FA",X"AA",X"FA",X"AA",X"EA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AB",X"AA",X"AB",X"AA",X"AB", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"EA",X"AA",X"EA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AB",X"AA",X"AB",X"AA",X"AB",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"EA",X"AA",X"EA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AB",X"AA",X"AB",X"AA",X"AF", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"EA",X"AA",X"EA",X"AA",X"EA",X"AA",X"EA",X"AA", + X"AA",X"AF",X"AA",X"AB",X"AA",X"AB",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"EA",X"AA",X"EA",X"AA",X"EA",X"AA",X"EA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AB",X"AA",X"AB",X"AA",X"AF", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"EA",X"AA",X"FA",X"AA",X"FA",X"AA",X"FA",X"AA", + X"AA",X"AF",X"AA",X"AB",X"AA",X"AB",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"FA",X"AA",X"FA",X"AA",X"FA",X"AA",X"EA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AB",X"AA",X"AB",X"AA",X"AB", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"EA",X"AA",X"EA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AB",X"AA",X"AB",X"AA",X"AB",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"EA",X"AA",X"EA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AE",X"AA",X"AE",X"AA",X"AE",X"AA",X"AF",X"AA",X"AB", + X"AA",X"AA",X"AA",X"AA",X"AB",X"EA",X"AB",X"EA",X"AB",X"FE",X"AB",X"FE",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AB",X"AA",X"AF",X"AA",X"AE",X"AA",X"AE",X"AA",X"AE",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AB",X"EA",X"AB",X"EA",X"AB",X"FE",X"AB",X"FE",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AE",X"AA",X"AE",X"AA",X"AF",X"AA",X"AF", + X"AA",X"AA",X"AA",X"AA",X"AB",X"FE",X"AB",X"AE",X"AB",X"AE",X"AB",X"FE",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AF",X"AA",X"AF",X"AA",X"AE",X"AA",X"AE",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AB",X"FE",X"AB",X"AE",X"AB",X"AE",X"AB",X"FE",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AE",X"AA",X"AF",X"AA",X"AF",X"AA",X"BF",X"AA",X"BF", + X"AA",X"AA",X"AA",X"AA",X"AB",X"FE",X"AB",X"FE",X"AA",X"BE",X"AA",X"BE",X"EA",X"AA",X"EA",X"AA", + X"AA",X"BF",X"AA",X"BF",X"AA",X"AF",X"AA",X"AF",X"AA",X"AE",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"EA",X"AA",X"EA",X"AA",X"AB",X"FE",X"AB",X"FE",X"AA",X"BE",X"AA",X"BE",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AE",X"AA",X"AE",X"AA",X"AE",X"AA",X"AF",X"AA",X"AB", + X"AA",X"AA",X"AA",X"AA",X"AB",X"EA",X"AB",X"EA",X"AB",X"FE",X"AB",X"FE",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AB",X"AA",X"AF",X"AA",X"AE",X"AA",X"AE",X"AA",X"AE",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AB",X"EA",X"AB",X"EA",X"AB",X"FE",X"AB",X"FE",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AE",X"AA",X"AE",X"AA",X"AF",X"AA",X"AF", + X"AA",X"AA",X"AA",X"AA",X"AB",X"FE",X"AB",X"AE",X"AB",X"AE",X"AB",X"FE",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AF",X"AA",X"AF",X"AA",X"AE",X"AA",X"AE",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AB",X"FE",X"AB",X"AE",X"AB",X"AE",X"AB",X"FE",X"AA",X"AA",X"AA",X"AA", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AE",X"AA",X"AF",X"AA",X"AF",X"AA",X"BF",X"AA",X"BF", + X"AA",X"AA",X"AA",X"AA",X"AB",X"FE",X"AB",X"FE",X"AA",X"BE",X"AA",X"BE",X"EA",X"AA",X"EA",X"AA", + X"AA",X"BF",X"AA",X"BF",X"AA",X"AF",X"AA",X"AF",X"AA",X"AE",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"EA",X"AA",X"EA",X"AA",X"AB",X"FE",X"AB",X"FE",X"AA",X"BE",X"AA",X"BE",X"AA",X"AA",X"AA",X"AA", + X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"30",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"30", + X"00",X"00",X"00",X"00",X"F0",X"00",X"0C",X"00",X"F0",X"00",X"00",X"00",X"F0",X"00",X"0C",X"00", + X"00",X"0F",X"00",X"00",X"00",X"30",X"00",X"3F",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"FC",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"30",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"30", + X"00",X"00",X"00",X"00",X"F0",X"00",X"0C",X"00",X"F0",X"00",X"00",X"00",X"F0",X"00",X"0C",X"00", + X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"30",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"3C",X"00",X"CC",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"30",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"30", + X"00",X"00",X"00",X"00",X"F0",X"00",X"0C",X"00",X"F0",X"00",X"00",X"00",X"F0",X"00",X"0C",X"00", + X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"30",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"30",X"00",X"CC",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"81",X"0A",X"25",X"0A",X"A5",X"0A",X"A5", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"65",X"00",X"65",X"90",X"96",X"54", + X"0A",X"A5",X"0A",X"A5",X"2A",X"A5",X"2A",X"A5",X"20",X"25",X"00",X"05",X"00",X"01",X"00",X"00", + X"96",X"54",X"95",X"90",X"95",X"90",X"95",X"40",X"95",X"40",X"65",X"00",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"20",X"25",X"2A",X"A5",X"2A",X"A5",X"0A",X"A5", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"64",X"00",X"65",X"80",X"95",X"C0",X"96",X"50", + X"0A",X"A5",X"2A",X"A6",X"2A",X"A6",X"20",X"26",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"96",X"54",X"56",X"50",X"59",X"40",X"1C",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"00",X"05",X"20",X"25",X"2A",X"A5",X"2A",X"A5",X"0A",X"A5",X"0A",X"A5", + X"00",X"00",X"40",X"00",X"65",X"00",X"65",X"40",X"95",X"40",X"95",X"90",X"95",X"90",X"96",X"54", + X"0F",X"F0",X"0F",X"F0",X"0F",X"30",X"0F",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"96",X"54",X"A5",X"90",X"65",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"14",X"0A",X"95",X"0A",X"25",X"0A",X"A5",X"0A",X"A5",X"0A",X"A5", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"94",X"00",X"96",X"40",X"66",X"50",X"65",X"94", + X"0A",X"A5",X"2A",X"A5",X"2A",X"A5",X"20",X"25",X"00",X"15",X"00",X"14",X"00",X"00",X"00",X"00", + X"65",X"D0",X"66",X"50",X"96",X"50",X"95",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"00",X"14",X"00",X"35",X"75",X"2F",X"F5",X"2B",X"F5",X"0B",X"F5", + X"00",X"00",X"00",X"00",X"14",X"00",X"55",X"00",X"71",X"40",X"60",X"C0",X"D1",X"D0",X"D7",X"50", + X"01",X"5F",X"01",X"57",X"05",X"55",X"15",X"57",X"14",X"0A",X"10",X"28",X"00",X"00",X"00",X"00", + X"D7",X"50",X"D1",X"50",X"40",X"40",X"51",X"40",X"55",X"00",X"94",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"20",X"25",X"2A",X"A5",X"2A",X"96",X"0A",X"96", + X"00",X"00",X"00",X"00",X"00",X"00",X"50",X"00",X"45",X"20",X"95",X"90",X"56",X"94",X"56",X"54", + X"0A",X"96",X"0A",X"96",X"0A",X"A5",X"0A",X"25",X"0A",X"81",X"00",X"00",X"00",X"00",X"00",X"00", + X"56",X"54",X"56",X"90",X"95",X"80",X"65",X"00",X"40",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_sprite_u.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_sprite_u.vhd new file mode 100644 index 00000000..dbaf8985 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ROM/rom_sprite_u.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_sprite_u is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_sprite_u is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"0A",X"00",X"AA",X"02",X"AA",X"0A",X"AA",X"0A",X"AA",X"0A",X"AA", + X"00",X"00",X"00",X"00",X"A8",X"00",X"AB",X"00",X"AB",X"C0",X"AB",X"C0",X"AA",X"C0",X"AA",X"E0", + X"02",X"AA",X"0A",X"AA",X"0A",X"AA",X"02",X"AA",X"00",X"AA",X"00",X"0A",X"00",X"00",X"00",X"00", + X"AA",X"00",X"AA",X"80",X"96",X"80",X"56",X"80",X"5A",X"00",X"A8",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0A",X"00",X"AA",X"02",X"AA",X"02",X"AE",X"0A",X"BA",X"0A",X"BA", + X"00",X"00",X"00",X"80",X"AA",X"A0",X"AA",X"20",X"AA",X"00",X"AA",X"00",X"BA",X"00",X"EA",X"00", + X"0A",X"BA",X"0A",X"BA",X"0A",X"3A",X"0A",X"3A",X"00",X"3A",X"00",X"0A",X"00",X"00",X"00",X"00", + X"EA",X"00",X"EA",X"00",X"EA",X"00",X"3A",X"00",X"3A",X"00",X"0A",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1A",X"02",X"95",X"05",X"5B",X"06",X"DA",X"36",X"95", + X"C0",X"00",X"CC",X"00",X"F3",X"C0",X"FF",X"00",X"7F",X"F0",X"6F",X"C0",X"57",X"F0",X"6C",X"00", + X"25",X"5B",X"16",X"DA",X"36",X"95",X"25",X"5B",X"06",X"DA",X"02",X"94",X"00",X"00",X"00",X"00", + X"68",X"00",X"54",X"00",X"70",X"00",X"60",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"AA",X"02",X"BA",X"02",X"AA",X"0A",X"AB",X"0A",X"EA",X"0A",X"AA", + X"00",X"00",X"00",X"00",X"80",X"00",X"A8",X"00",X"A8",X"00",X"AA",X"00",X"A6",X"00",X"A5",X"00", + X"0A",X"AE",X"0B",X"AA",X"0A",X"AA",X"02",X"EA",X"02",X"AE",X"00",X"AA",X"00",X"00",X"00",X"00", + X"96",X"00",X"A6",X"00",X"AA",X"00",X"A8",X"00",X"A8",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0A",X"00",X"AA",X"02",X"AA",X"02",X"AA",X"0A",X"AA",X"0A",X"AA", + X"00",X"00",X"2A",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"80",X"AA",X"80",X"AA",X"80",X"AE",X"80", + X"0A",X"AA",X"0A",X"AA",X"0A",X"AA",X"0A",X"AA",X"02",X"AA",X"02",X"80",X"00",X"00",X"00",X"00", + X"AE",X"00",X"BA",X"00",X"A8",X"00",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2A",X"00",X"A2",X"02",X"AA",X"02",X"8A",X"0A",X"AA", + X"00",X"00",X"00",X"00",X"30",X"00",X"BC",X"30",X"AC",X"C0",X"BF",X"00",X"AB",X"C0",X"AB",X"B0", + X"08",X"A8",X"0A",X"AA",X"0A",X"2A",X"0A",X"A8",X"02",X"AA",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"80",X"A2",X"80",X"AA",X"00",X"A8",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"AA",X"0A",X"95",X"0A",X"66",X"29",X"5A",X"26",X"A5",X"26",X"99", + X"00",X"00",X"00",X"00",X"80",X"00",X"A8",X"00",X"58",X"20",X"9A",X"20",X"A6",X"A0",X"66",X"20", + X"2A",X"56",X"25",X"69",X"0A",X"A9",X"0A",X"55",X"02",X"9A",X"00",X"2A",X"00",X"00",X"00",X"00", + X"9A",X"00",X"9A",X"00",X"66",X"00",X"A8",X"00",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0A",X"BC",X"2A",X"A0",X"2A",X"A0",X"2A",X"A0", + X"00",X"00",X"00",X"00",X"3F",X"F0",X"C0",X"C0",X"03",X"00",X"03",X"00",X"0C",X"00",X"0C",X"00", + X"2A",X"A0",X"0A",X"82",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00", + X"AC",X"00",X"AA",X"00",X"AA",X"00",X"AA",X"00",X"AA",X"00",X"A8",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"FC",X"0F",X"FF",X"3F",X"FF",X"3F",X"FF",X"3F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"FF",X"00",X"FF",X"C0", + X"3F",X"FF",X"3F",X"FF",X"3F",X"7F",X"0F",X"D7",X"03",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"C0",X"FE",X"A0",X"FF",X"20",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"02",X"00",X"29",X"00",X"AA",X"00",X"AA",X"02",X"69", + X"00",X"00",X"A0",X"C0",X"A8",X"C0",X"AB",X"F0",X"AF",X"30",X"6A",X"00",X"AA",X"80",X"AA",X"A0", + X"0A",X"A6",X"0A",X"AA",X"02",X"9A",X"0A",X"A2",X"0A",X"A0",X"02",X"80",X"00",X"00",X"00",X"00", + X"9A",X"60",X"A6",X"80",X"AA",X"80",X"8A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"25",X"02",X"95",X"02",X"55",X"0A",X"95",X"0A",X"FF",X"03",X"55", + X"00",X"00",X"00",X"00",X"50",X"00",X"55",X"00",X"55",X"00",X"55",X"40",X"55",X"40",X"D5",X"40", + X"0A",X"55",X"09",X"55",X"0A",X"55",X"0A",X"95",X"02",X"A5",X"00",X"95",X"00",X"00",X"00",X"00", + X"55",X"40",X"55",X"40",X"55",X"40",X"55",X"00",X"55",X"00",X"50",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"00",X"3F",X"00",X"FA",X"03",X"EA",X"03",X"AA",X"0F",X"A8",X"0E",X"8A", + X"00",X"00",X"FF",X"00",X"AB",X"C0",X"8A",X"00",X"AA",X"00",X"88",X"00",X"A8",X"00",X"A0",X"00", + X"0E",X"A8",X"0E",X"AA",X"0F",X"A2",X"03",X"AA",X"03",X"EA",X"00",X"F8",X"00",X"3C",X"00",X"00", + X"A0",X"00",X"80",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"AA",X"02",X"AA",X"02",X"AA",X"0A",X"AA",X"0A",X"AA",X"0A",X"AA",X"0A",X"AA", + X"00",X"00",X"A0",X"00",X"A8",X"00",X"E8",X"00",X"BB",X"00",X"BF",X"00",X"BF",X"00",X"FC",X"00", + X"0A",X"AA",X"0A",X"AA",X"0A",X"5A",X"02",X"56",X"02",X"96",X"00",X"AA",X"00",X"00",X"00",X"00", + X"BC",X"00",X"BF",X"00",X"BB",X"00",X"EB",X"00",X"A8",X"00",X"A0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2A",X"02",X"AA",X"0A",X"AA",X"0A",X"AA",X"0A",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"10",X"AA",X"50",X"A9",X"40",X"AA",X"00",X"AA",X"00", + X"0A",X"AA",X"0B",X"AA",X"0B",X"EA",X"02",X"AA",X"00",X"AA",X"00",X"00",X"00",X"00",X"00",X"00", + X"A8",X"00",X"A8",X"00",X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"FF",X"03",X"FF",X"03",X"FD",X"03",X"F4", + X"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"F0",X"FF",X"FC",X"7F",X"C0",X"5F",X"C0",X"A7",X"F0", + X"03",X"F6",X"03",X"DA",X"00",X"DA",X"00",X"D2",X"00",X"DA",X"00",X"1A",X"00",X"01",X"00",X"00", + X"A9",X"F0",X"29",X"F0",X"91",X"F0",X"A9",X"70",X"6A",X"40",X"8A",X"00",X"A4",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"A8",X"0A",X"AA",X"2A",X"AA",X"2A",X"AA",X"2A",X"AA",X"2A",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"A8",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"80", + X"2A",X"AA",X"2A",X"AA",X"2A",X"EA",X"0A",X"BE",X"02",X"AA",X"00",X"00",X"00",X"00",X"00",X"00", + X"A9",X"50",X"AA",X"10",X"AA",X"00",X"A8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"BF",X"02",X"AF",X"02",X"AF",X"02",X"AF",X"02",X"AF", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"FC",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"C0", + X"02",X"AF",X"02",X"AF",X"02",X"AF",X"02",X"AE",X"00",X"BF",X"00",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"C0",X"FF",X"00",X"EF",X"00",X"BC",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"FF",X"03",X"FA",X"03",X"E8",X"0F",X"EA",X"0F",X"A2", + X"00",X"00",X"00",X"00",X"E8",X"00",X"AA",X"00",X"AA",X"00",X"8A",X"80",X"52",X"80",X"5A",X"80", + X"0F",X"A9",X"0F",X"A1",X"0F",X"A8",X"03",X"AA",X"03",X"EA",X"00",X"3A",X"00",X"00",X"00",X"00", + X"62",X"80",X"6A",X"00",X"8A",X"00",X"A8",X"00",X"A8",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0F",X"C0",X"3F",X"F0",X"3F",X"FC",X"3F",X"3C",X"3C",X"0F",X"3F",X"3F",X"0F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"FF",X"3F",X"3F",X"3C",X"0F",X"3F",X"3C",X"3F",X"FC",X"3F",X"F0",X"3F",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"FF",X"3F",X"EF",X"3F",X"AB",X"7B",X"AB",X"0E",X"AB",X"02",X"AB", + X"00",X"00",X"00",X"00",X"C0",X"00",X"FC",X"00",X"CF",X"00",X"03",X"00",X"CF",X"C0",X"FF",X"C0", + X"02",X"AB",X"0E",X"AB",X"3E",X"AB",X"3F",X"AB",X"3F",X"EF",X"03",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"C0",X"CF",X"C0",X"03",X"00",X"CF",X"00",X"FC",X"00",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"FF",X"0F",X"FE",X"3F",X"EA",X"3F",X"AA",X"0F",X"AA",X"03",X"AA", + X"00",X"00",X"00",X"00",X"F0",X"00",X"BF",X"00",X"AF",X"F0",X"AF",X"30",X"AC",X"0C",X"AB",X"3C", + X"03",X"AA",X"0F",X"AA",X"3F",X"AA",X"3F",X"EA",X"0F",X"FE",X"00",X"FF",X"00",X"00",X"00",X"00", + X"AB",X"3C",X"AC",X"0C",X"AF",X"30",X"AF",X"F0",X"BF",X"00",X"F0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"FF",X"3F",X"EA",X"3F",X"AA",X"3F",X"AA",X"0E",X"AA",X"0E",X"AA", + X"00",X"00",X"00",X"00",X"F0",X"00",X"AF",X"00",X"AB",X"C0",X"AA",X"30",X"AA",X"30",X"AA",X"F0", + X"0E",X"AA",X"0E",X"AA",X"3F",X"AA",X"3F",X"AA",X"3F",X"EA",X"03",X"FF",X"00",X"00",X"00",X"00", + X"AA",X"F0",X"AA",X"30",X"AA",X"30",X"AB",X"C0",X"AF",X"00",X"F0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"FF",X"3F",X"EA",X"3F",X"AA",X"3F",X"AA",X"0E",X"AA",X"0E",X"AA", + X"00",X"00",X"00",X"00",X"F0",X"00",X"AF",X"00",X"AB",X"C0",X"AA",X"30",X"AA",X"30",X"AA",X"F0", + X"0E",X"AA",X"0E",X"AA",X"3F",X"AA",X"3F",X"AA",X"3F",X"EA",X"03",X"FF",X"00",X"00",X"00",X"00", + X"AA",X"F0",X"AA",X"30",X"AA",X"30",X"AB",X"C0",X"AF",X"00",X"F0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"FC",X"0F",X"FF",X"3F",X"EB",X"3F",X"AB",X"3E",X"AB",X"0E",X"AA",X"0E",X"AA", + X"00",X"00",X"00",X"00",X"C0",X"00",X"F0",X"00",X"CC",X"00",X"03",X"00",X"CF",X"00",X"FF",X"00", + X"0E",X"AA",X"0E",X"AA",X"3E",X"AB",X"3F",X"AB",X"3F",X"EB",X"0F",X"FF",X"03",X"FC",X"00",X"00", + X"FF",X"00",X"CF",X"00",X"03",X"00",X"CC",X"00",X"F0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"FC",X"0F",X"BF",X"3F",X"EF",X"3F",X"AF",X"3F",X"BF",X"0F",X"AF",X"03",X"EF", + X"00",X"00",X"00",X"00",X"C0",X"00",X"F0",X"00",X"FC",X"00",X"CF",X"00",X"03",X"00",X"CF",X"00", + X"03",X"EF",X"0F",X"AF",X"3F",X"BF",X"3F",X"AF",X"3F",X"EF",X"0F",X"BF",X"03",X"FC",X"00",X"00", + X"CF",X"00",X"03",X"00",X"CF",X"00",X"FC",X"00",X"F0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"F0",X"0E",X"BC",X"3F",X"BF",X"3E",X"BF",X"3E",X"FC",X"0E",X"B0",X"0F",X"BC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"F0",X"00",X"30",X"00",X"F0",X"00", + X"0F",X"BC",X"0E",X"B0",X"3E",X"FC",X"3E",X"BF",X"3F",X"BF",X"0E",X"BC",X"03",X"F0",X"00",X"00", + X"F0",X"00",X"30",X"00",X"F0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0B",X"C0",X"3A",X"F0",X"3E",X"F8",X"3A",X"FC",X"3B",X"CF",X"0A",X"03",X"0E",X"CF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"CF",X"0A",X"03",X"3B",X"CF",X"3A",X"FC",X"3E",X"FC",X"3A",X"F0",X"0B",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"02",X"0B",X"02",X"3A",X"02",X"3E",X"00",X"33",X"00",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"00",X"CC",X"00",X"C0",X"C0",X"C0",X"C0", + X"0C",X"C0",X"0C",X"CC",X"0E",X"0C",X"02",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"23",X"00",X"2B",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"32",X"30",X"F2",X"30",X"C2",X"3C",X"C2",X"0F",X"0F",X"0E",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"C0",X"CC",X"C0",X"83",X"C0",X"83",X"00",X"8B",X"00", + X"0E",X"3C",X"02",X"30",X"00",X"00",X"00",X"C3",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"00",X"3A",X"00",X"38",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"30",X"00",X"30",X"0C",X"8C",X"0C",X"8C",X"0F",X"C2",X"33",X"CA", + X"00",X"00",X"C2",X"00",X"C2",X"00",X"8A",X"00",X"A8",X"C0",X"AC",X"C0",X"3F",X"C0",X"08",X"C0", + X"33",X"C8",X"32",X"C8",X"0A",X"3C",X"08",X"33",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"C8",X"00",X"C8",X"00",X"EC",X"00",X"2C",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C0",X"03",X"B0",X"03",X"B0",X"0C",X"BC",X"3B",X"33",X"3B",X"33",X"CC",X"EF", + X"00",X"00",X"08",X"00",X"38",X"00",X"32",X"C0",X"E2",X"F0",X"EE",X"30",X"AF",X"80",X"3C",X"80", + X"CC",X"EB",X"F8",X"FB",X"CB",X"38",X"C8",X"08",X"20",X"02",X"00",X"00",X"00",X"00",X"00",X"00", + X"0B",X"00",X"CB",X"00",X"C8",X"00",X"F0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"30",X"00",X"F3",X"23",X"EF",X"2F",X"AF",X"3F",X"AF",X"FF",X"AF",X"FB",X"FF", + X"03",X"C0",X"CF",X"80",X"FF",X"B0",X"FF",X"B0",X"FE",X"F0",X"EE",X"C0",X"EF",X"C0",X"EB",X"00", + X"EB",X"FE",X"EB",X"FE",X"EF",X"3E",X"2C",X"0B",X"0C",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"EB",X"00",X"F8",X"00",X"F0",X"00",X"B0",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"00",X"0B",X"0F",X"FE",X"3E",X"BE",X"3B",X"EF",X"2F",X"FF",X"FF",X"FF",X"FB",X"FF", + X"F0",X"00",X"FC",X"00",X"FE",X"00",X"FE",X"F0",X"FE",X"F0",X"EF",X"F0",X"EF",X"F0",X"BF",X"F0", + X"FE",X"FB",X"FE",X"FE",X"3F",X"FE",X"0F",X"FC",X"0F",X"F0",X"03",X"C0",X"00",X"00",X"00",X"00", + X"FE",X"80",X"FF",X"80",X"FF",X"00",X"FF",X"00",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"3C",X"0C",X"FA",X"3E",X"BE",X"FF",X"BF",X"FF",X"FF",X"BF",X"FF", + X"00",X"00",X"00",X"00",X"FC",X"00",X"FA",X"00",X"FE",X"C0",X"FF",X"C0",X"EF",X"C0",X"AE",X"00", + X"AF",X"EF",X"3F",X"FB",X"3E",X"FB",X"3A",X"FC",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"00",X"FC",X"00",X"FC",X"00",X"AC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"FC",X"3C",X"FF",X"3F",X"AF",X"3F",X"EF",X"EF",X"FE",X"FE",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"E0",X"00",X"EC",X"00",X"FC",X"00",X"BC",X"00",X"B0",X"00",X"C0",X"00", + X"EF",X"FB",X"EB",X"EF",X"3F",X"CF",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"3C",X"F0",X"FF",X"EC",X"FE",X"BB",X"BF",X"BF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"C0",X"00",X"F0",X"00",X"F0",X"00", + X"FB",X"EF",X"FF",X"AF",X"3F",X"FF",X"3F",X"CF",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"AF",X"AA",X"AF",X"AA",X"AF",X"AA",X"AF",X"AA",X"AF",X"AA",X"AF",X"AA",X"03",X"AA",X"80", + X"FF",X"75",X"FF",X"75",X"FD",X"57",X"FD",X"5F",X"FF",X"FD",X"FF",X"DD",X"FF",X"DD",X"FD",X"55", + X"AA",X"A0",X"AA",X"A0",X"AA",X"A0",X"AA",X"80",X"AA",X"80",X"AA",X"00",X"A8",X"00",X"00",X"00", + X"FC",X"00",X"3F",X"FF",X"03",X"FF",X"00",X"3F",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"FF",X"FF",X"FE",X"BF",X"FA",X"AF",X"EA",X"AF", + X"7F",X"FC",X"5F",X"FF",X"DF",X"FF",X"DF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EA",X"AB",X"EA",X"AB",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"2A",X"AA",X"02",X"AA",X"00",X"0A", + X"FE",X"BF",X"EA",X"AF",X"AA",X"A8",X"AA",X"A8",X"AA",X"A8",X"AA",X"A0",X"AA",X"80",X"A8",X"00", + X"03",X"FF",X"03",X"FF",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"EA",X"FF",X"AA", + X"FC",X"00",X"F8",X"00",X"FA",X"00",X"EA",X"80",X"AA",X"80",X"AA",X"A0",X"AA",X"A0",X"AA",X"A8", + X"FA",X"AA",X"0A",X"AA",X"02",X"AA",X"00",X"AA",X"00",X"0A",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"A8",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"A8",X"AA",X"A8",X"0A",X"80",X"00",X"00", + X"AA",X"AF",X"AA",X"AF",X"AA",X"AF",X"00",X"03",X"00",X"03",X"00",X"03",X"00",X"00",X"00",X"00", + X"FD",X"55",X"FF",X"57",X"FF",X"FF",X"FF",X"77",X"FD",X"FD",X"FD",X"FD",X"FD",X"55",X"FF",X"57", + X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"03",X"00",X"03",X"AA",X"AF",X"AA",X"AF",X"AA",X"AF", + X"FF",X"FF",X"FD",X"FF",X"FD",X"FF",X"FD",X"55",X"FD",X"55",X"FF",X"FF",X"FD",X"5F",X"FD",X"57", + X"FF",X"FD",X"FF",X"F5",X"FF",X"F7",X"FF",X"D7",X"FF",X"D7",X"FF",X"5F",X"FF",X"5F",X"FF",X"5F", + X"FF",X"FC",X"FF",X"F0",X"FF",X"F0",X"FF",X"C0",X"FF",X"C0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"5F",X"FF",X"5F",X"FF",X"5F",X"FF",X"D7",X"FF",X"D7",X"FF",X"F7",X"FF",X"F5",X"FF",X"FD", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"FF",X"C0",X"FF",X"F0",X"FF",X"F0",X"FF",X"FC", + X"03",X"FF",X"0F",X"FF",X"0F",X"FF",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FC",X"00",X"FC",X"00",X"FC",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"FF",X"0F",X"FF",X"0F",X"FF",X"03",X"FF", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FC",X"00",X"FC",X"00",X"FC",X"00", + X"00",X"00",X"A8",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"80",X"AA",X"A0",X"AA",X"A0",X"AA",X"A0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"03",X"FF",X"3F",X"FF",X"FD",X"55", + X"AA",X"80",X"AA",X"03",X"AA",X"AF",X"AA",X"AF",X"AA",X"AF",X"AA",X"AF",X"AA",X"AF",X"AA",X"AF", + X"FF",X"5F",X"FF",X"D7",X"FD",X"55",X"FD",X"55",X"FF",X"FF",X"FF",X"57",X"FD",X"55",X"FD",X"FD", + X"00",X"0A",X"02",X"AA",X"2A",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"EA",X"AB",X"EA",X"AB", + X"A8",X"00",X"AA",X"80",X"AA",X"A0",X"AA",X"A8",X"AA",X"A8",X"AA",X"A8",X"EA",X"AF",X"FE",X"BF", + X"EA",X"AF",X"FA",X"AF",X"FE",X"BF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"DF",X"FF",X"DF",X"FF",X"5F",X"FF",X"7F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"00",X"AA",X"02",X"AA",X"0A",X"AA",X"FA",X"AA", + X"00",X"00",X"0A",X"80",X"AA",X"A8",X"AA",X"A8",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"A8", + X"FF",X"AA",X"FF",X"EA",X"FF",X"FE",X"FF",X"FF",X"FF",X"FF",X"0F",X"FF",X"03",X"FF",X"03",X"FF", + X"AA",X"A8",X"AA",X"A0",X"AA",X"A0",X"AA",X"80",X"EA",X"80",X"FA",X"00",X"F8",X"00",X"FC",X"00", + X"0A",X"AA",X"AA",X"AA",X"AA",X"AA",X"2A",X"AA",X"0A",X"AA",X"0A",X"AA",X"02",X"AA",X"00",X"AA", + X"BF",X"FD",X"AF",X"FD",X"AB",X"F5",X"AB",X"F5",X"AA",X"FF",X"AA",X"BF",X"AA",X"BF",X"AA",X"3F", + X"00",X"AA",X"00",X"2A",X"00",X"0A",X"00",X"0A",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00", + X"A8",X"35",X"AA",X"0F",X"AA",X"00",X"AA",X"80",X"AA",X"80",X"AA",X"80",X"AA",X"00",X"28",X"00", + X"D7",X"F5",X"D7",X"F5",X"5F",X"FD",X"7F",X"FD",X"F7",X"FF",X"77",X"FF",X"77",X"FF",X"57",X"FF", + X"55",X"FF",X"55",X"FF",X"55",X"FF",X"57",X"FF",X"5F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"57",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"FF",X"00",X"AA",X"02",X"AA",X"02",X"AA",X"00",X"AA", + X"FF",X"FA",X"FF",X"AA",X"FA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"A8",X"A8",X"00", + X"F0",X"FF",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"EA",X"AF",X"2A", + X"FC",X"00",X"FA",X"00",X"FA",X"80",X"EA",X"80",X"AA",X"80",X"AA",X"A0",X"AA",X"A0",X"AA",X"A0", + X"A8",X"2A",X"A8",X"2A",X"A0",X"2A",X"A0",X"AA",X"80",X"AA",X"00",X"AA",X"00",X"AA",X"00",X"2A", + X"AA",X"A0",X"AA",X"A0",X"AA",X"80",X"AA",X"80",X"AA",X"80",X"AA",X"00",X"A8",X"00",X"80",X"00", + X"00",X"AA",X"00",X"0A",X"00",X"03",X"00",X"03",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"BF",X"F5",X"FF",X"FD",X"FF",X"FF",X"FF",X"FD",X"FF",X"F7",X"FF",X"F7",X"FF",X"F5",X"FF",X"FD", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"03",X"00",X"03",X"00",X"0A",X"00",X"AA", + X"FF",X"FF",X"FF",X"F7",X"FF",X"F7",X"FF",X"F5",X"FF",X"F5",X"FF",X"FF",X"FF",X"F5",X"BF",X"F5", + X"57",X"D5",X"5F",X"D5",X"FF",X"D5",X"DF",X"D5",X"F7",X"55",X"F7",X"55",X"57",X"55",X"5F",X"55", + X"55",X"FF",X"57",X"FF",X"57",X"FF",X"5F",X"F0",X"5F",X"F0",X"7F",X"FF",X"7F",X"FF",X"7F",X"FF", + X"FF",X"55",X"FF",X"55",X"FF",X"55",X"57",X"55",X"57",X"D5",X"FF",X"D5",X"7F",X"D5",X"5F",X"D5", + X"7F",X"FF",X"7F",X"FF",X"7F",X"FF",X"5F",X"F0",X"5F",X"F0",X"57",X"FF",X"57",X"FF",X"55",X"FF", + X"F3",X"FF",X"C3",X"FF",X"0F",X"FF",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FC",X"00",X"FC",X"00",X"FC",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"FF",X"0F",X"FF",X"C3",X"FF",X"F3",X"FF", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FC",X"00",X"FC",X"00",X"FC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A",X"00",X"0A",X"00",X"2A",X"00",X"AA", + X"28",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"80",X"AA",X"80",X"AA",X"0F",X"AA",X"3F",X"A8",X"35", + X"00",X"AA",X"02",X"AA",X"0A",X"AA",X"0A",X"AA",X"2A",X"AA",X"AA",X"AA",X"AA",X"AA",X"0A",X"AA", + X"AA",X"3D",X"AA",X"BF",X"AA",X"B5",X"AA",X"F5",X"AB",X"FF",X"AB",X"FD",X"AF",X"F5",X"BF",X"F7", + X"00",X"AA",X"02",X"AA",X"02",X"AA",X"00",X"AA",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"57",X"FF", + X"A8",X"00",X"AA",X"A8",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"FA",X"AA",X"FF",X"AA",X"FF",X"FA", + X"7F",X"FF",X"5F",X"FF",X"57",X"FF",X"57",X"FF",X"FF",X"FD",X"5F",X"FD",X"57",X"F5",X"F7",X"F5", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"5F",X"FF",X"57",X"FF",X"55",X"FF",X"55",X"FF",X"55",X"FF", + X"00",X"2A",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"A0",X"AA",X"A0",X"2A",X"A8",X"2A",X"A8",X"2A", + X"80",X"00",X"A8",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"80",X"AA",X"80",X"AA",X"A0",X"AA",X"A0", + X"AF",X"2A",X"FF",X"EA",X"FF",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"FF",X"F0",X"FF", + X"AA",X"A0",X"AA",X"A0",X"AA",X"A0",X"AA",X"80",X"EA",X"80",X"FA",X"80",X"FA",X"00",X"FC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A",X"00",X"0A",X"00",X"2A",X"00",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"AA",X"02",X"AA",X"0A",X"AA",X"0A",X"AA",X"02",X"AA",X"AA",X"AA",X"AA",X"AA",X"0A",X"AA", + X"28",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"80",X"AA",X"80",X"AA",X"0F",X"AA",X"3F",X"A8",X"35", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"57",X"FF", + X"AA",X"3D",X"AA",X"BF",X"AA",X"B5",X"AA",X"F5",X"AB",X"FF",X"AB",X"FD",X"AF",X"F5",X"BF",X"F7", + X"7F",X"FF",X"5F",X"FF",X"57",X"FF",X"57",X"FF",X"FF",X"FD",X"5F",X"F5",X"57",X"F5",X"F7",X"D5", + X"2A",X"80",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"EA",X"AA",X"FA",X"AA",X"FF",X"AA", + X"00",X"00",X"00",X"00",X"A0",X"00",X"AA",X"00",X"AA",X"A0",X"AA",X"A8",X"AA",X"AA",X"AA",X"AA", + X"FF",X"FA",X"FF",X"FF",X"D7",X"FF",X"55",X"FF",X"55",X"7F",X"55",X"7F",X"55",X"7F",X"55",X"7F", + X"AA",X"AB",X"EA",X"BF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"FF",X"F0",X"FF",X"C0", + X"00",X"00",X"05",X"50",X"15",X"54",X"55",X"55",X"55",X"55",X"55",X"55",X"15",X"55",X"15",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"50",X"00", + X"15",X"55",X"D5",X"55",X"FD",X"55",X"FF",X"55",X"FF",X"D5",X"FF",X"F5",X"FF",X"F5",X"FF",X"FC", + X"50",X"00",X"50",X"00",X"50",X"00",X"40",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"2A",X"80",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"EA",X"AA",X"FA",X"AA",X"FF",X"AA", + X"00",X"00",X"00",X"00",X"A0",X"00",X"AA",X"00",X"AA",X"A0",X"AA",X"A8",X"AA",X"AA",X"AA",X"AA", + X"FF",X"FA",X"FF",X"FF",X"D7",X"FF",X"55",X"FF",X"55",X"7F",X"55",X"7F",X"55",X"7F",X"55",X"7F", + X"AA",X"AB",X"EA",X"BF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"FF",X"F0",X"FF",X"C0", + X"00",X"00",X"05",X"50",X"15",X"54",X"55",X"55",X"55",X"55",X"55",X"55",X"15",X"55",X"15",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"50",X"00", + X"15",X"55",X"D5",X"55",X"FD",X"55",X"FF",X"55",X"FF",X"D5",X"FF",X"F5",X"FF",X"F5",X"FF",X"FC", + X"50",X"00",X"50",X"00",X"50",X"00",X"40",X"00",X"40",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/build_id.tcl b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_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/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/build_id.v b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/build_id.v new file mode 100644 index 00000000..10dd7c3c --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171116" +`define BUILD_TIME "123540" diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c3e13c5c --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1094 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..7e8a9995 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,370 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..7d407fb8 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2027 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..6904b66b --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..998033ef --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80a.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80a.vhd new file mode 100644 index 00000000..33d61068 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/cpu/T80a.vhd @@ -0,0 +1,280 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80a is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLK_EN_SYS : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80a; + +architecture rtl of T80a is + + signal CEN : std_logic; + signal Reset_s : std_logic; + signal IntCycle_n : std_logic; + signal IORQ : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal MREQ : std_logic; + signal MReq_Inhibit : std_logic; + signal Req_Inhibit : std_logic; + signal RD : std_logic; + signal MREQ_n_i : std_logic; + signal IORQ_n_i : std_logic; + signal RD_n_i : std_logic; + signal WR_n_i : std_logic; + signal RFSH_n_i : std_logic; + signal BUSAK_n_i : std_logic; + signal A_i : std_logic_vector(15 downto 0); + signal DO_Reg : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector (7 downto 0); -- Input synchroniser + signal Wait_s : std_logic; + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + -- clock enable supplied from clocking system + CEN <= CLK_EN_SYS; + + BUSAK_n <= BUSAK_n_i; + MREQ_n_i <= not MREQ or (Req_Inhibit and MReq_Inhibit); + RD_n_i <= not RD or Req_Inhibit; + + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DO <= DO_Reg; + +-- process (RESET_n, CLK_n) +-- begin +-- if RESET_n = '0' then +-- Reset_s <= '0'; +-- elsif CLK_n'event and CLK_n = '1' then +-- Reset_s <= '1'; +-- end if; +-- end process; + -- T80 reset input has already proper characteristics: + -- * asynchronous assertion + -- * deassertion synchronous to CLK_n (main_clk) + Reset_s <= RESET_n; + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, + DInst => DI, + DI => DI_Reg, + DO => DO_Reg, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + if CEN = '1' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then + DI_Reg <= to_x01(DI); + end if; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + WR_n_i <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + WR_n_i <= '1'; + if TState = "001" then -- To short for IO writes !!!!!!!!!!!!!!!!!!! + WR_n_i <= not Write; + end if; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + Req_Inhibit <= '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and TState = "010" then + Req_Inhibit <= '1'; + else + Req_Inhibit <= '0'; + end if; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + MReq_Inhibit <= '0'; + elsif CLK_n'event and CLK_n = '0' then + if CEN = '1' then + if MCycle = "001" and TState = "010" then + MReq_Inhibit <= '1'; + else + MReq_Inhibit <= '0'; + end if; + end if; + end if; + end process; + + process(Reset_s,CLK_n) + begin + if Reset_s = '0' then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '0'; + elsif CLK_n'event and CLK_n = '0' then + if CEN = '1' then + + if MCycle = "001" then + if TState = "001" then + RD <= IntCycle_n; + MREQ <= IntCycle_n; + IORQ_n_i <= IntCycle_n; + end if; + if TState = "011" then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '1'; + end if; + if TState = "100" then + MREQ <= '0'; + end if; + else + if TState = "001" and NoRead = '0' then + RD <= not Write; + IORQ_n_i <= not IORQ; + MREQ <= not IORQ; + end if; + if TState = "011" then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '0'; + end if; + end if; + + end if; + end if; + end process; + +end; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/dac.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/dac.vhd new file mode 100644 index 00000000..c21b306b --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_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 := 7 + ); + 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/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/dpram.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/hq2x.sv b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_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/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/keyboard.v b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug.vhd new file mode 100644 index 00000000..92348ed0 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug.vhd @@ -0,0 +1,243 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- Toplevel port for Papilio Plus board. +-- +------------------------------------------------------------------------------- +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + +library ieee; + use ieee.numeric_std.all; + +use work.ladybug_dip_pack.all; + +entity ladybugt is +port ( + -- Global Interface ------------------------------------------------------- + CLK_IN : in std_logic; -- 20MHz + I_RESET : in std_logic; + + -- VGA Interface ---------------------------------------------------------- + O_VIDEO_R : out std_logic_vector( 1 downto 0); + O_VIDEO_G : out std_logic_vector( 1 downto 0); + O_VIDEO_B : out std_logic_vector( 1 downto 0); + O_VSYNC : out std_logic; + O_HSYNC : out std_logic; + O_VBLANK : out std_logic; + O_HBLANK : out std_logic; + O_PIXCE : out std_logic; + + -- Audio Interface -------------------------------------------------------- + O_AUDIO : out signed(7 downto 0); + + but_coin_s : in std_logic_vector( 1 downto 0); + but_fire_s : in std_logic_vector( 1 downto 0); + but_bomb_s : in std_logic_vector( 1 downto 0); + but_tilt_s : in std_logic_vector( 1 downto 0); + but_select_s : in std_logic_vector( 1 downto 0); + but_up_s : in std_logic_vector( 1 downto 0); + but_down_s : in std_logic_vector( 1 downto 0); + but_left_s : in std_logic_vector( 1 downto 0); + but_right_s : in std_logic_vector( 1 downto 0) +); +end ladybugt; + +architecture struct of ladybugt is + + signal + ps2_codeready, + clk_20mhz_s, + clk_en_5mhz_s, + ext_res_n_s, + ext_res_s, + audio_s, + vid_hsync, + vid_vsync, + vga_hsync, + vid_comp_sync_n, + vga_vsync : std_logic; + + signal rom_cpu_a_s : std_logic_vector(14 downto 0); + signal rom_cpu_d_s : std_logic_vector( 7 downto 0); + signal rom_cpu_d1 : std_logic_vector( 7 downto 0); + signal rom_cpu_d2 : std_logic_vector( 7 downto 0); + signal rom_cpu_d3 : std_logic_vector( 7 downto 0); + signal rom_cpu_d4 : std_logic_vector( 7 downto 0); + signal rom_cpu_d5 : std_logic_vector( 7 downto 0); + signal rom_cpu_d6 : std_logic_vector( 7 downto 0); + + signal rom_char_a_s : std_logic_vector(11 downto 0); + signal rom_char_d_s : std_logic_vector(15 downto 0); + + signal rom_sprite_a_s : std_logic_vector(11 downto 0); + signal rom_sprite_d_s : std_logic_vector(15 downto 0); + + signal + dac_audio_s, + dip_block_1_s, + dip_block_2_s : std_logic_vector( 7 downto 0) := (others => '0'); + + signal ps2_scancode : std_logic_vector( 9 downto 0) := (others => '0'); + + signal + vid_rgb, + vga_rgb : std_logic_vector(15 downto 0) := (others => '0'); + + signal but_chute_s : std_logic_vector( 1 downto 0) := (others=>'0'); + +begin + + O_PIXCE <= clk_en_5mhz_s; + + but_chute_s <= not but_coin_s(1) & not but_coin_s(0); + + ----------------------------------------------------------------------------- + -- inputs assignments + ----------------------------------------------------------------------------- + ext_res_s <= I_RESET; + ext_res_n_s <= not ext_res_s; + clk_20mhz_s <= CLK_IN; + + ----------------------------------------------------------------------------- + -- Ladybug Machine + ----------------------------------------------------------------------------- + machine_b : entity work.ladybug_machine + port map ( + ext_res_n_i => ext_res_n_s, + clk_20mhz_i => clk_20mhz_s, + clk_en_5mhz_o => clk_en_5mhz_s, + tilt_n_i => but_tilt_s(0), + player_select_n_i => but_select_s, + player_fire_n_i => but_fire_s, + player_up_n_i => but_up_s, + player_right_n_i => but_right_s, + player_down_n_i => but_down_s, + player_left_n_i => but_left_s, + player_bomb_n_i => but_bomb_s, + right_chute_i => but_chute_s(0), + left_chute_i => but_chute_s(1), + dip_block_1_i => dip_block_1_s, + dip_block_2_i => dip_block_2_s, + rgb_r_o => O_VIDEO_R, + rgb_g_o => O_VIDEO_G, + rgb_b_o => O_VIDEO_B, + hsync_n_o => O_HSYNC, + vsync_n_o => O_VSYNC, + vblank_o => O_VBLANK, + hblank_o => O_HBLANK, + audio_o => O_AUDIO, + rom_cpu_a_o => rom_cpu_a_s, + rom_cpu_d_i => rom_cpu_d_s, + rom_char_a_o => rom_char_a_s, + rom_char_d_i => rom_char_d_s, + rom_sprite_a_o => rom_sprite_a_s, + rom_sprite_d_i => rom_sprite_d_s + ); + + ----------------------------------------------------------------------------- + -- Building the DIP Switches - see file ladybug_dip_pack.vhd + ----------------------------------------------------------------------------- +-- dip_block_1_s <= lb_dip_block_1_c; -- Lady Bug + dip_block_1_s <= do_dip_block_1_c; -- Dorodon +-- dip_block_1_s <= ca_dip_block_1_c; -- Cosmic Avenger + dip_block_2_s <= price_dip_block_2_c; -- Common for all games (coins per game pricing) + + ----------------------------------------------------------------------------- + -- Game ROMs + ----------------------------------------------------------------------------- + inst_rom_spritel : entity work.rom_sprite_l + port map ( + CLK => clk_20mhz_s, + ADDR => rom_sprite_a_s, + DATA => rom_sprite_d_s( 7 downto 0) + ); + + inst_rom_spriteu : entity work.rom_sprite_u + port map ( + CLK => clk_20mhz_s, + ADDR => rom_sprite_a_s, + DATA => rom_sprite_d_s(15 downto 8) + ); + + inst_rom_charl : entity work.rom_char_l + port map ( + CLK => clk_20mhz_s, + ADDR => rom_char_a_s, + DATA => rom_char_d_s( 7 downto 0) + ); + + inst_rom_charu : entity work.rom_char_u + port map ( + CLK => clk_20mhz_s, + ADDR => rom_char_a_s, + DATA => rom_char_d_s(15 downto 8) + ); + + inst_rom_cpu1 : entity work.rom_cpu1 + port map ( + CLK => clk_20mhz_s, + ADDR => rom_cpu_a_s(12 downto 0), + DATA => rom_cpu_d1 + ); + + inst_rom_cpu2 : entity work.rom_cpu2 + port map ( + CLK => clk_20mhz_s, + ADDR => rom_cpu_a_s(12 downto 0), + DATA => rom_cpu_d2 + ); + + inst_rom_cpu3 : entity work.rom_cpu3 + port map ( + CLK => clk_20mhz_s, + ADDR => rom_cpu_a_s(12 downto 0), + DATA => rom_cpu_d3 + ); + + ----------------------------------------------------------------------------- + -- Program ROMs data mux + ----------------------------------------------------------------------------- + rom_cpu_d_s <= + rom_cpu_d1 when rom_cpu_a_s(14 downto 13) = "00" else + rom_cpu_d2 when rom_cpu_a_s(14 downto 13) = "01" else + rom_cpu_d3 when rom_cpu_a_s(14 downto 13) = "10" else + (others=>'0'); + +end struct; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_addr_dec.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_addr_dec.vhd new file mode 100644 index 00000000..6d857f6c --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_addr_dec.vhd @@ -0,0 +1,130 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_addr_dec.vhd,v 1.10 2005/12/10 14:51:46 arnim Exp $ +-- +-- Address decoder of the CPU Unit. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_addr_dec is + + port ( + clk_20mhz_i : in std_logic; + res_n_i : in std_logic; + a_i : in std_logic_vector(15 downto 12); + rd_n_i : in std_logic; + wr_n_i : in std_logic; + mreq_n_i : in std_logic; + rfsh_n_i : in std_logic; + cs_n_o : out std_logic_vector(15 downto 0); + ram_cpu_cs_n_o : out std_logic + ); + +end ladybug_addr_dec; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_addr_dec is + +begin + + ----------------------------------------------------------------------------- + -- Process adec + -- + -- Purpose: + -- Decode the CPU address and generate one-hot chip select signals. + -- Each chip select enables a 4 KByte address segment. + -- + -- The chip select outputs are registered with the 20 MHz clock to + -- break potentially long combinational paths here. + -- + adec: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + cs_n_o <= (others => '1'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- default assignment + cs_n_o <= (others => '1'); + + if a_i(15) = '0' then + if rd_n_i = '0' or wr_n_i = '0' then + cs_n_o(to_integer(unsigned( '0' & a_i(14 downto 12) ))) <= '0'; + end if; + + else + if mreq_n_i = '0' and rfsh_n_i = '1' then + cs_n_o(to_integer(unsigned( '1' & a_i(14 downto 12) ))) <= '0'; + end if; + + end if; + + end if; + end process adec; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process cs_ext_ram + -- + -- Purpose: + -- Builds the combinational chip select signal for the external CPU RAM. + -- + cs_ext_ram: process (a_i, + rd_n_i, wr_n_i) + begin + if (rd_n_i = '0' or wr_n_i = '0') and + a_i(15 downto 12) = "0110" then + ram_cpu_cs_n_o <= '0'; + else + ram_cpu_cs_n_o <= '1'; + end if; + end process cs_ext_ram; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_char.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_char.vhd new file mode 100644 index 00000000..1ca149f3 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_char.vhd @@ -0,0 +1,740 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_char.vhd,v 1.18 2005/10/10 22:02:14 arnim Exp $ +-- +-- Character Video Module of Lady Bug Machine. +-- +-- This unit contains most of the logic found on schematic page three. +-- Excluded parts are: +-- * the 10 MHz and 5 MHz clock generation +-- moved into separate module on toplevel of Lady Bug machine +-- * the video timing circuitry +-- moved into separate module on toplevel of video unit +-- * the video MUX and RGB conversion unit +-- moved into separate module at toplevel of video unit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity ladybug_char is + port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + res_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_4mhz_i : in std_logic; + -- CPU Interface ---------------------------------------------------------- + cs10_n_i : in std_logic; + cs13_n_i : in std_logic; + a_i : in std_logic_vector(10 downto 0); + rd_n_i : in std_logic; + wr_n_i : in std_logic; + wait_n_o : out std_logic; + d_from_cpu_i : in std_logic_vector( 7 downto 0); + d_from_char_o : out std_logic_vector( 7 downto 0); + -- RGB Video Interface ---------------------------------------------------- + h_i : in std_logic_vector( 3 downto 0); + h_t_i : in std_logic_vector( 3 downto 0); + ha_t_rise_i : in std_logic; + hx_i : in std_logic; + v_i : in std_logic_vector( 3 downto 0); + v_t_i : in std_logic_vector( 3 downto 0); + hbl_i : in std_logic; + blank_flont_i : in std_logic; + blank_o : out std_logic; + crg_o : out std_logic_vector( 5 downto 1); + vblank_o : out std_logic; + hblank_o : out std_logic; + -- Character ROM Interface ------------------------------------------------ + rom_char_a_o : out std_logic_vector(11 downto 0); + rom_char_d_i : in std_logic_vector(15 downto 0) + ); + +end ladybug_char; + +architecture rtl of ladybug_char is + + signal flip_screen_q : std_logic; + + signal h0_s, + h1_s, + h2_s : std_logic; + signal h_flip_s, + h_t_flip_s : std_logic_vector(3 downto 0); + signal v_flip_s, + v_t_flip_s : std_logic_vector(3 downto 0); + + signal h_ctrl_d_s, + h_ctrl_s, + h_ctrl_n_s, + h_ctrl_d_out_s, + h_ctrl_d_n_out_s, + h_ctrl_rise_s, + h_ctrl_n_rise_s : std_logic_vector(4 downto 1); + + signal hx_ctrl_q, + hx_ctrl_s, + hx_ctrl_n_rise_s : std_logic; + signal hx_ctrl_clear_q : std_logic; + + signal b1_ff_q, + b1_ff_s, + b1_ff_n_rise_s : std_logic; + + signal wait_q : std_logic; + signal wait_clear_q : std_logic; + + signal cgs_q, + cgs_s, + cgs_rise_s : std_logic; + + signal ram_addr_s : std_logic_vector(9 downto 0); + signal select_a_s : std_logic; + + signal char_ram_cs_n_s, + char_ram_we_n_s : std_logic; + signal col_ram_cs_n_s, + col_ram_we_n_s : std_logic; + signal d_from_char_ram_s : std_logic_vector(7 downto 0); + signal d_from_col_ram_s : std_logic_vector(3 downto 0); + + signal s_q : std_logic_vector( 7 downto 0); + signal d_char_ram_q : std_logic_vector( 7 downto 0); + signal d_col_ram_q : std_logic_vector( 3 downto 0); + + signal d_char_rom_q : std_logic_vector(15 downto 0); + signal crg1_s, + crg2_s, + crg3_q, + crg4_q, + crg5_q : std_logic; + + signal hbl_q,hbl_d : std_logic; + + signal hcnt : integer; + signal vdd_s : std_logic; + +begin + + vdd_s <= '1'; + + ----------------------------------------------------------------------------- + -- Process flip + -- + -- Purpose: + -- Implement the flip_screen flag. + -- + flip: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + -- Actually, this asynchronous reset of the ls259 is not 100% + -- equivalent to the real behavior of this circuit. However, + -- the flip_screen latch is modelled like this for the sake of + -- simplicity. It's sufficient for the purpose here. + flip_screen_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if a_i(2 downto 0) = "000" and cs10_n_i = '0' then + flip_screen_q <= d_from_cpu_i(0); + end if; + + end if; + end process flip; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process h_flip + -- + -- Purpose: + -- Build the flipped horizontal timing signals. + -- + h_flip: process (flip_screen_q, + h_i, h_t_i, + s_q) + variable a_v, b_v, + sum_v : unsigned(8 downto 0); + begin + -- calculate sum + a_v := '0' & unsigned(s_q); + b_v := '0' & unsigned(h_t_i) & unsigned(h_i); + sum_v := a_v + b_v; + + -- h0,1,2 are taken from directly from sum + h0_s <= sum_v(0); + h1_s <= sum_v(1); + h2_s <= sum_v(2); + + -- now flip + for idx in 3 downto 0 loop + h_flip_s(idx) <= flip_screen_q xor sum_v(idx); + h_t_flip_s(idx) <= flip_screen_q xor sum_v(idx + 4); + end loop; + end process h_flip; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process v_flip + -- + -- Purpose: + -- Build the flipped horizontal timing signals. + -- + v_flip: process (flip_screen_q, + v_i, v_t_i) + begin + for idx in 3 downto 0 loop + v_flip_s(idx) <= flip_screen_q xor v_i(idx); + v_t_flip_s(idx) <= flip_screen_q xor v_t_i(idx); + end loop; + end process v_flip; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- The Horizontal Control Signals + -- Detailed purpose/meaning is unknown. + ----------------------------------------------------------------------------- + h_ctrl_d_s(1) <= not (not h2_s and (h1_s xor h0_s)); + h_ctrl_d_s(2) <= hx_i; + h_ctrl_d_s(3) <= not ((h1_s xor h0_s) or (not h2_s xor h1_s)); + h_ctrl_d_s(4) <= '0'; + h_ctrl_b : entity work.ttl_175 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => clk_en_5mhz_i, + por_n_i => por_n_i, + cl_n_i => vdd_s, + d_i => h_ctrl_d_s, + q_o => h_ctrl_s, + q_n_o => h_ctrl_n_s, + d_o => h_ctrl_d_out_s, + d_n_o => h_ctrl_d_n_out_s + ); + h_ctrl_rise_s <= not h_ctrl_s and h_ctrl_d_out_s; + h_ctrl_n_rise_s <= h_ctrl_s and not h_ctrl_d_n_out_s; + + + ----------------------------------------------------------------------------- + -- Process ctrl_seq + -- + -- Purpose: + -- Implemente the various sequential elements for horizontal control. + -- + ctrl_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + hx_ctrl_q <= '0'; + hx_ctrl_clear_q <= '0'; + b1_ff_q <= '0'; + wait_q <= '0'; + wait_clear_q <= '0'; + cgs_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- the HX control flip-flop + hx_ctrl_q <= hx_ctrl_s; + + -- the clear counterpart of hx_ctrl_q + if h_ctrl_s(2) = '0' then + -- pseudo-asynchronous clear + hx_ctrl_clear_q <= '0'; + elsif hx_ctrl_n_rise_s = '1' then + -- rising edge indicator acts as clock enable instead of clock + hx_ctrl_clear_q <= '1'; + end if; + + -- the mysterious B1 flip-flop + b1_ff_q <= b1_ff_s; + + -- the CGS rising edge indicator support flip-flops + cgs_q <= cgs_s; + + -- the WAIT flip-flop + if wait_clear_q = '1' then + -- pseudo-asynchronous clear + wait_q <= '0'; + elsif cgs_rise_s = '1' then + -- rising edge indicator acts as clock enable instead of clock + wait_q <= '1'; + end if; + + -- the clear counterpart of wait_q + if clk_en_4mhz_i = '1' then + wait_clear_q <= wait_q and (h_ctrl_s(3) and (b1_ff_q or hx_ctrl_q)); + end if; + + end if; + end process ctrl_seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process ctrl_comp + -- + -- Purpose: + -- Implements the combination logic for the horizontal control + -- elements. + -- + ctrl_comp: process (h_ctrl_rise_s, + hx_i, hx_ctrl_q, + hx_ctrl_clear_q, + h_ctrl_n_rise_s, + b1_ff_q, + cgs_q, cs13_n_i) + begin + -- default assignments + hx_ctrl_s <= hx_ctrl_q; + hx_ctrl_n_rise_s <= '0'; + b1_ff_s <= b1_ff_q; + b1_ff_n_rise_s <= '0'; + cgs_s <= cgs_q; + cgs_rise_s <= '0'; + + -- the HX control flip-flop ----------------------------------------------- + if hx_ctrl_clear_q = '1' then + -- pseudo-asynchronous clear + hx_ctrl_s <= '0'; + + if (not hx_ctrl_q) = '0' then + -- detct rising edge of inverted ouput + hx_ctrl_n_rise_s <= '1'; + end if; + elsif h_ctrl_rise_s(1) = '1' then + -- rising edge indicator acts as clock enable instead of clock + if hx_i = '1' then + -- toggle FF + hx_ctrl_s <= not hx_ctrl_q; + + if (not hx_ctrl_q) = '0' then + -- detct rising edge of inverted ouput + hx_ctrl_n_rise_s <= '1'; + end if; + end if; + end if; + + -- the mysterious B1 flip-flop -------------------------------------------- + if hx_ctrl_q = '1' then + -- pseudo-asynchronous clear + b1_ff_s <= '0'; + + if (not b1_ff_q) = '0' then + -- detct rising edge of inverted ouput + b1_ff_n_rise_s <= '1'; + end if; + elsif h_ctrl_n_rise_s(3) = '1' then + -- rising edge indicator acts as clock enable instead of clock + b1_ff_s <= '1'; + end if; + + -- the CGS rising edge indicator support flip-flop ------------------------ + cgs_s <= not cs13_n_i; + cgs_rise_s <= not cgs_q and not cs13_n_i; + + end process ctrl_comp; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process ram_addr + -- + -- Purpose: + -- Multiplexes the CPU address bus and the h+v timing control signals to + -- form the RAM address bus. + -- + ram_addr: process (h_flip_s, h_t_flip_s, + v_flip_s, v_t_flip_s, + a_i, + h_ctrl_s, h_ctrl_n_s, + hx_ctrl_q, + b1_ff_q) + variable a_v, b_v, g_n_v : std_logic; + variable vec_v : std_logic_vector(1 downto 0); + begin + -- default assignment + ram_addr_s <= (others => '0'); + + -- logic that drives A input of IC L4 and K4 + a_v := not (h_ctrl_n_s(1) and (b1_ff_q or hx_ctrl_q)); + -- logic that drives B input of IC L4 and K4 + b_v := hx_ctrl_q; + -- logic that drives /G input of IC J4 + g_n_v := hx_ctrl_q and (h_ctrl_n_s(1) and (b1_ff_q or hx_ctrl_q)); + + -- IC L4 and K4: Dual 4:1 Multiplexer ------------------------------------- + vec_v := b_v & a_v; + case vec_v is + when "00" => + ram_addr_s(0) <= h_flip_s (3); + ram_addr_s(1) <= h_t_flip_s(0); + -- + ram_addr_s(2) <= h_t_flip_s(1); + ram_addr_s(3) <= h_t_flip_s(2); + when "01" => + ram_addr_s(0) <= a_i (0); + ram_addr_s(1) <= a_i (1); + -- + ram_addr_s(2) <= a_i (2); + ram_addr_s(3) <= a_i (3); + when "10" => + ram_addr_s(0) <= v_t_flip_s(1); + ram_addr_s(1) <= v_t_flip_s(2); + -- + ram_addr_s(2) <= v_t_flip_s(3); + ram_addr_s(3) <= '0'; + when "11" => + ram_addr_s(0) <= a_i (0); + ram_addr_s(1) <= a_i (1); + -- + ram_addr_s(2) <= a_i (2); + ram_addr_s(3) <= a_i (3); + when others => + null; + end case; + + -- IC J4 and H4: Quad 2:1 Multiplexer ------------------------------------- + case a_v is + when '0' => + ram_addr_s(4) <= h_t_flip_s(3) and not g_n_v; + ram_addr_s(7) <= v_t_flip_s(1) and not g_n_v; + ram_addr_s(8) <= v_t_flip_s(2) and not g_n_v; + ram_addr_s(9) <= v_t_flip_s(3) and not g_n_v; + -- + ram_addr_s(5) <= v_flip_s (3); + ram_addr_s(6) <= v_t_flip_s(0); + when '1' => + ram_addr_s(4) <= a_i (4) and not g_n_v; + ram_addr_s(7) <= a_i (7) and not g_n_v; + ram_addr_s(8) <= a_i (8) and not g_n_v; + ram_addr_s(9) <= a_i (9) and not g_n_v; + -- + ram_addr_s(5) <= a_i (5); + ram_addr_s(6) <= a_i (6); + when others => + null; + end case; + + select_a_s <= a_v; + + end process ram_addr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process ram_ctrl + -- + -- Purpose: + -- Generate the control signals for the character and color RAMs. + -- This comprises: + -- * reading RAMs while the beam sweeps the screen + -- * reading RAMs to the CPU + -- * writing RAMs from the CPU + -- + ram_ctrl: process (cs13_n_i, + wait_q, + select_a_s, + a_i, + wr_n_i, rd_n_i, + d_from_char_ram_s, d_from_col_ram_s, + clk_en_4mhz_i) + variable cpu_read_char_ram_v : boolean; + variable cpu_write_char_ram_v : boolean; + variable cpu_read_col_ram_v : boolean; + variable cpu_write_col_ram_v : boolean; + variable vec_v : std_logic_vector(2 downto 0); + begin + -- default assignments + char_ram_cs_n_s <= '1'; + char_ram_we_n_s <= '1'; + col_ram_cs_n_s <= '1'; + col_ram_we_n_s <= '1'; + d_from_char_o <= (others => '1'); + cpu_read_char_ram_v := false; + cpu_write_char_ram_v := false; + cpu_read_col_ram_v := false; + cpu_write_col_ram_v := false; + + -- detect and decode CPU access + if clk_en_4mhz_i = '1' and -- operate RAMs with CPU clock + (not cs13_n_i and select_a_s and not wait_q) = '1' then + vec_v := a_i(10) & rd_n_i & wr_n_i; + case vec_v is + when "001" => + cpu_read_char_ram_v := true; + when "010" => + cpu_write_char_ram_v := true; + when "101" => + cpu_read_col_ram_v := true; + when "110" => + cpu_write_col_ram_v := true; + when others => + null; + end case; + end if; + + -- now we are prepared to generate the /CS and /WE signals for the RAMs + if select_a_s = '0' or + cpu_read_char_ram_v or cpu_write_char_ram_v then + char_ram_cs_n_s <= '0'; + end if; + if select_a_s = '0' or + cpu_read_col_ram_v or cpu_write_col_ram_v then + col_ram_cs_n_s <= '0'; + end if; + if cpu_write_char_ram_v then + char_ram_we_n_s <= '0'; + end if; + if cpu_write_col_ram_v then + col_ram_we_n_s <= '0'; + end if; + + -- and we can multiplex the data bus towards the CPU + if cpu_read_char_ram_v then + d_from_char_o <= d_from_char_ram_s; + elsif cpu_read_col_ram_v then + d_from_char_o(3 downto 0) <= d_from_col_ram_s; + end if; + + end process ram_ctrl; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- The character RAM + ----------------------------------------------------------------------------- + char_ram_b : entity work.ladybug_char_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_4mhz_i, + a_i => ram_addr_s, + cs_n_i => char_ram_cs_n_s, + we_n_i => char_ram_we_n_s, + d_i => d_from_cpu_i, + d_o => d_from_char_ram_s + ); + ----------------------------------------------------------------------------- + -- The color RAM + ----------------------------------------------------------------------------- + col_ram_b : entity work.ladybug_char_col_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_4mhz_i, + a_i => ram_addr_s, + cs_n_i => col_ram_cs_n_s, + we_n_i => col_ram_we_n_s, + d_i => d_from_cpu_i(3 downto 0), + d_o => d_from_col_ram_s + ); + + + ----------------------------------------------------------------------------- + -- Process ram_d_seq + -- + -- Purpose: + -- Implements three latch banks that save the output of the character + -- and color RAMs. + -- + ram_d_seq: process (clk_20mhz_i, por_n_i) + variable complex_rising_edge_v : boolean; + begin + if por_n_i = '0' then + s_q <= (others => '0'); + d_char_ram_q <= (others => '0'); + d_col_ram_q <= (others => '0'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- latch data from the character RAM to form input for h_flip ----------- + if hx_ctrl_n_rise_s = '1' then + s_q <= d_from_char_ram_s; + end if; + + -- latch data from the character RAM for ROM address generation --------- + -- there are three sources for a rising edge: + -- 1) falling edge of h_ctrl_n_s(1) + -- => equivalen to rising edge of h_ctrl_s(1) + -- 2) rising edge of hx_ctrl_n_q + -- 3) rising edge of b1_ff_n + -- For each source, the two have to be in a defined state to let + -- the edge propage to the latches. + complex_rising_edge_v := ((h_ctrl_rise_s(1) and + (b1_ff_q or hx_ctrl_q)) or + (hx_ctrl_n_rise_s and + (not b1_ff_q and not h_ctrl_n_s(1))) or + (b1_ff_n_rise_s and + (not hx_ctrl_q and not h_ctrl_s(1)))) = '1'; + if complex_rising_edge_v then + d_char_ram_q <= d_from_char_ram_s; + d_col_ram_q <= d_from_col_ram_s; + end if; + + end if; + end process ram_d_seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process latch_rom_d + -- + -- Purpose: + -- Latch the output of the character ROM. + -- + latch_rom_d: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + d_char_rom_q <= (others => '0'); + crg3_q <= '0'; + crg4_q <= '0'; + crg5_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if (clk_en_5mhz_i and + h2_s and h1_s and h0_s) = '1' then + d_char_rom_q <= rom_char_d_i; + crg3_q <= d_col_ram_q(0); + crg4_q <= d_col_ram_q(1); + crg5_q <= d_col_ram_q(2); + end if; + + end if; + end process latch_rom_d; + -- + ----------------------------------------------------------------------------- + -- Process hbl_seq + -- + -- Purpose: + -- Implements the flip-flop that latches HBL. + -- + hbl_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + hbl_q <= '0'; + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if clk_en_5mhz_i = '1' then + if hcnt /= 255 then + hcnt <= hcnt + 1; + end if; + end if; + if ha_t_rise_i = '1' then + hbl_q <= hbl_i; + if hbl_q = '1' and hbl_i = '0' then + hcnt <= 0; + end if; + end if; + end if; + end process hbl_seq; + -- + ----------------------------------------------------------------------------- + + process (clk_20mhz_i) + begin + if rising_edge(clk_20mhz_i) then + if clk_en_5mhz_i = '1' then + hbl_d <= hbl_q; + + if hcnt < 240 then + hblank_o <= '0'; + else + hblank_o <= '1'; + end if; + + if hbl_d = '0' and hbl_q = '1' then + vblank_o <= not blank_flont_i; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Process crg_mux + -- + -- Purpose: + -- Multiplexes the latched character ROM data to CRG1 and CRG2. + -- + crg_mux: process (d_char_rom_q, + h_flip_s, + blank_flont_i, + hbl_q) + variable blank_v : std_logic; + variable idx_v : unsigned(2 downto 0); + begin + blank_v := not (blank_flont_i and not hbl_q); + idx_v := unsigned(h_flip_s(2 downto 0)); + + if blank_v = '0' then + crg1_s <= d_char_rom_q(to_integer('0' & idx_v)); + crg2_s <= d_char_rom_q(to_integer('1' & idx_v)); + else + crg1_s <= '0'; + crg2_s <= '0'; + end if; + + blank_o <= blank_v; + end process crg_mux; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + wait_n_o <= not wait_q; + crg_o(5) <= crg5_q; + crg_o(4) <= crg4_q; + crg_o(3) <= crg3_q; + crg_o(2) <= crg2_s; + crg_o(1) <= crg1_s; + rom_char_a_o( 2 downto 0) <= v_flip_s(2 downto 0); + rom_char_a_o(10 downto 3) <= d_char_ram_q; + rom_char_a_o(11) <= d_col_ram_q(3); + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_chute.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_chute.vhd new file mode 100644 index 00000000..b3255fe0 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_chute.vhd @@ -0,0 +1,130 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_chute.vhd,v 1.3 2005/10/10 21:21:20 arnim Exp $ +-- +-- Pulse shaper for a chute input. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_chute is + + port ( + clk_20mhz_i : in std_logic; + res_n_i : in std_logic; + chute_i : in std_logic; + chute_o : out std_logic + ); + +end ladybug_chute; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_chute is + + -- 2.35e-2 s = 1 / 20,000,000 Hz * 470000 + constant chute_delay_c : natural := 470000; + + signal chute_cnt_q : unsigned(18 downto 0); + + signal chute_sync_q : std_logic_vector(1 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process sync + -- + -- Purpose: + -- Synchronize the asynchronous chute input. + -- + sync: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + chute_sync_q <= (others => '0'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + chute_sync_q(0) <= chute_i; + chute_sync_q(1) <= chute_sync_q(0); + + end if; + end process sync; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process cnt + -- + -- Purpose: + -- Count the required number of 20 MHz clock cycles before emitting + -- chute event. This is a low pass filter for the rising edge of chute_i. + -- + cnt: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + chute_cnt_q <= (others => '0'); + chute_o <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if chute_sync_q(1) = '1' then + if chute_cnt_q = chute_delay_c then + chute_o <= '1'; + else + chute_cnt_q <= chute_cnt_q + 1; + end if; + + else + -- reset counter when chute input goes back to 0 + chute_cnt_q <= (others => '0'); + chute_o <= '0'; + + end if; + + end if; + end process cnt; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_chutes.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_chutes.vhd new file mode 100644 index 00000000..7584de89 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_chutes.vhd @@ -0,0 +1,134 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_chutes.vhd,v 1.4 2005/10/10 21:21:20 arnim Exp $ +-- +-- Pulse shaping for the two chute inputs. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_chutes is + + port ( + clk_20mhz_i : in std_logic; + res_n_i : in std_logic; + right_chute_i : in std_logic; + left_chute_i : in std_logic; + cs8_n_i : in std_logic; + nmi_n_o : out std_logic; + int_n_o : out std_logic + ); + +end ladybug_chutes; + +architecture rtl of ladybug_chutes is + + signal right_chute_s, + left_chute_s : std_logic; + signal left_chute_q : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Pulse shaper for Right Chute + ----------------------------------------------------------------------------- + right_chute_b : entity work.ladybug_chute + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + chute_i => right_chute_i, + chute_o => right_chute_s + ); + + + ----------------------------------------------------------------------------- + -- Pulse shaper for Left Chute + ----------------------------------------------------------------------------- + left_chute_b : entity work.ladybug_chute + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + chute_i => left_chute_i, + chute_o => left_chute_s + ); + + + ----------------------------------------------------------------------------- + -- Process left_edge + -- + -- Purpose: + -- Implement the edge detector for the left chute. + -- Only a rising edge of the filtered chute input can trigger a new + -- interrupt to the CPU. + -- + left_edge: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + left_chute_q <= '0'; + int_n_o <= '1'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + left_chute_q <= left_chute_s; + + if cs8_n_i = '0' then + -- synchronous set, has priority over data path + int_n_o <= '1'; + + -- edge detector + elsif left_chute_s = '1' and left_chute_q = '0' then + int_n_o <= '0'; + + end if; + + end if; + end process left_edge; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + nmi_n_o <= not right_chute_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_clk.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_clk.vhd new file mode 100644 index 00000000..d3e00484 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_clk.vhd @@ -0,0 +1,158 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_clk.vhd,v 1.5 2005/10/28 21:17:41 arnim Exp $ +-- +-- Clock generator for the Lady Bug machine. +-- +-- This module generates the clock enables which are required to mimic the +-- different clocks of the Lady Bug boards. +-- +-- Theory of Operation: +-- A PLL is used to tune the external clock to 20 MHz. This forms the +-- main clock which is used by all sequential elements. +-- All derived clocks are built with clock enables to allow a synchronous +-- design style (sort of). +-- +-- Note: +-- The counters and enable signals are reset by the power-on reset. +-- Thus, the "derived clocks" run during normal system reset. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_clk is + + port ( + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + clk_en_10mhz_o : out std_logic; + clk_en_10mhz_n_o : out std_logic; + clk_en_5mhz_o : out std_logic; + clk_en_5mhz_n_o : out std_logic; + clk_en_4mhz_o : out std_logic + ); + +end ladybug_clk; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_clk is + + -- counter for 5 MHz and 10 MHz clock enables + signal clk_cnt_5mhz_q : unsigned(1 downto 0); + -- counter for 4 MHz clock enable + signal clk_cnt_4mhz_q : unsigned(2 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process clk_en + -- + -- Purpose: + -- Generates the clock enables for 10 MHz, 5 MHz, 4 MHz. + -- + clk_en: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + clk_cnt_5mhz_q <= (others => '0'); + clk_cnt_4mhz_q <= (others => '0'); + clk_en_10mhz_o <= '0'; + clk_en_10mhz_n_o <= '0'; + clk_en_5mhz_o <= '0'; + clk_en_5mhz_n_o <= '0'; + clk_en_4mhz_o <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + + ------------------------------------------------------------------------- + -- 10 MHz / 5 MHz clock domain + -- + -- counter for 10 MHz and 5 MHz clock enables + clk_cnt_5mhz_q <= clk_cnt_5mhz_q + 1; + + -- generate clock enable for 10 MHz + -- enable on every second clock of clk_20mhz_i + clk_en_10mhz_o <= clk_cnt_5mhz_q(0); + -- enable with 180 deg phase shift + clk_en_10mhz_n_o <= not clk_cnt_5mhz_q(0); + + -- generate clock enables for 5 MHz: + -- enable on every forth clock of clk_20mhz_i + if clk_cnt_5mhz_q = "11" then + clk_en_5mhz_o <= '1'; + else + clk_en_5mhz_o <= '0'; + end if; + -- enable with 180 deg phase shift + if clk_cnt_5mhz_q = "01" then + clk_en_5mhz_n_o <= '1'; + else + clk_en_5mhz_n_o <= '0'; + end if; + -- + ------------------------------------------------------------------------- + + + ------------------------------------------------------------------------- + -- 4 MHz domain + -- + -- counter for 4 MHz clock enable, wrap around after 5 clocks + clk_en_4mhz_o <= clk_cnt_4mhz_q(2); + + if clk_cnt_4mhz_q = "100" then + clk_cnt_4mhz_q <= (others => '0'); + else + clk_cnt_4mhz_q <= clk_cnt_4mhz_q + 1; + end if; + -- + ------------------------------------------------------------------------- + + end if; + end process clk_en; + -- + ----------------------------------------------------------------------------- + + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_counter.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_counter.vhd new file mode 100644 index 00000000..d07256bb --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_counter.vhd @@ -0,0 +1,95 @@ +------------------------------------------------------------------------------- +-- +-- Synchronous 8-Bit Binary Counter with preset. +-- +-- $Id: ladybug_counter.vhd,v 1.9 2005/10/10 21:59:13 arnim Exp $ +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity counter is +port ( + ck_i : in std_logic; + ck_en_i : in std_logic; + reset_n_i : in std_logic; + load_i : in std_logic; + preset_i : in std_logic_vector(7 downto 0); + q_o : out std_logic_vector(7 downto 0); + rise_q_o : out std_logic_vector(7 downto 0); + d_o : out std_logic_vector(7 downto 0); + co_o : out std_logic +); +end counter; + +architecture rtl of counter is + signal cnt_q : std_logic_vector(7 downto 0); + signal cnt_s : std_logic_vector(7 downto 0); +begin + + seq: process (ck_i, reset_n_i) + begin + if reset_n_i = '0' then + cnt_q <= (others => '0'); + elsif rising_edge(ck_i) then + cnt_q <= cnt_s; + end if; + end process seq; + + adder: process (ck_en_i, cnt_q, load_i, preset_i) + begin + cnt_s <= cnt_q; + + if ck_en_i = '1' then + if load_i = '1' then + cnt_s <= preset_i; + else + cnt_s <= cnt_q + 1; + end if; + end if; + end process adder; + + co_o <= '1' when cnt_q = x"FF" else '0'; + rise_q_o <= cnt_s and not cnt_q; + q_o <= cnt_q; + d_o <= cnt_s; +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_cpu_unit.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_cpu_unit.vhd new file mode 100644 index 00000000..7d41074f --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_cpu_unit.vhd @@ -0,0 +1,260 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_cpu_unit.vhd,v 1.19 2005/12/10 14:51:51 arnim Exp $ +-- +-- CPU Main Unit of the Lady Bug Machine. +-- +-- Actually, the PCB where the CPU resides on contains also the sound chips and +-- parts of the video controller. For the sake of simplicity, the CPU and chip +-- select logic has been moved into this separate unit. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_cpu_unit is + port ( + clk_20mhz_i : in std_logic; + clk_en_4mhz_i : in std_logic; + res_n_i : in std_logic; + rom_cpu_a_o : out std_logic_vector(14 downto 0); + rom_cpu_d_i : in std_logic_vector( 7 downto 0); + sound_wait_n_i : in std_logic; + wait_n_i : in std_logic; + right_chute_i : in std_logic; + left_chute_i : in std_logic; + gpio_in0_i : in std_logic_vector( 7 downto 0); + gpio_in1_i : in std_logic_vector( 7 downto 0); + gpio_in2_i : in std_logic_vector( 7 downto 0); + gpio_in3_i : in std_logic_vector( 7 downto 0); + gpio_extra_i : in std_logic_vector( 7 downto 0); + a_o : out std_logic_vector(10 downto 0); + d_to_cpu_i : in std_logic_vector( 7 downto 0); + d_from_cpu_o : out std_logic_vector( 7 downto 0); + rd_n_o : out std_logic; + wr_n_o : out std_logic; + cs7_n_o : out std_logic; + cs10_n_o : out std_logic; + cs11_n_o : out std_logic; + cs12_n_o : out std_logic; + cs13_n_o : out std_logic + ); + +end ladybug_cpu_unit; + +architecture struct of ladybug_cpu_unit is + + signal t80_clk_en_s : std_logic; + + signal wait_n_s : std_logic; + signal int_n_s : std_logic; + signal nmi_n_s : std_logic; + signal mreq_n_s : std_logic; + signal rd_n_s : std_logic; + signal wr_n_s : std_logic; + signal rfsh_n_s : std_logic; + signal m1_n_s : std_logic; + signal a_s : std_logic_vector(15 downto 0); + signal d_to_cpu_s : std_logic_vector( 7 downto 0); + signal d_from_cpu_s : std_logic_vector( 7 downto 0); + signal d_from_rom_s, + d_decrypted_s, + d_rom_mux_s : std_logic_vector( 7 downto 0); + signal d_from_ram_s : std_logic_vector( 7 downto 0); + signal d_from_gpio_s : std_logic_vector( 7 downto 0); + + signal cs_n_s : std_logic_vector(15 downto 0); + + signal ram_cpu_cs_n_s : std_logic; + + signal vcc_s : std_logic; + +begin + vcc_s <= '1'; + + wait_n_s <= sound_wait_n_i and wait_n_i; + + ----------------------------------------------------------------------------- + -- The T80 CPU + ----------------------------------------------------------------------------- + -- "wait" has to be modelled with the clock enable because the T80 is not + -- able to enlarge write accesses properly when they are delayed with "wait" + t80_clk_en_s <= clk_en_4mhz_i and wait_n_s; + T80a_b : entity work.T80a + generic map ( + Mode => 0 + ) + port map ( + RESET_n => res_n_i, + CLK_n => clk_20mhz_i, + CLK_EN_SYS => t80_clk_en_s, + WAIT_n => wait_n_s, + INT_n => int_n_s, + NMI_n => nmi_n_s, + BUSRQ_n => vcc_s, + M1_n => m1_n_s, + MREQ_n => mreq_n_s, + IORQ_n => open, + RD_n => rd_n_s, + WR_n => wr_n_s, + RFSH_n => rfsh_n_s, + HALT_n => open, + BUSAK_n => open, + A => a_s, + DI => d_to_cpu_s, + DO => d_from_cpu_s + ); + d_from_cpu_o <= d_from_cpu_s; + + + ----------------------------------------------------------------------------- + -- The CPU RAM + ----------------------------------------------------------------------------- + cpu_ram_b : entity work.ladybug_cpu_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_4mhz_i, + a_i => a_s(11 downto 0), + cs_n_i => cs_n_s(6), + we_n_i => wr_n_s, + d_i => d_from_cpu_s, + d_o => d_from_ram_s + ); + + ----------------------------------------------------------------------------- + -- The Address Decoder + ----------------------------------------------------------------------------- + addr_dec_b : entity work.ladybug_addr_dec + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + a_i => a_s(15 downto 12), + rd_n_i => rd_n_s, + wr_n_i => wr_n_s, + mreq_n_i => mreq_n_s, + rfsh_n_i => rfsh_n_s, + cs_n_o => cs_n_s, + ram_cpu_cs_n_o => ram_cpu_cs_n_s + ); + + + ----------------------------------------------------------------------------- + -- The General Purpose IO + ----------------------------------------------------------------------------- + gpio_b : entity work.ladybug_gpio + port map ( + a_i => a_s(1 downto 0), + cs_in_n_i => cs_n_s(9), + cs_extra_n_i => cs_n_s(14), + in0_i => gpio_in0_i, + in1_i => gpio_in1_i, + in2_i => gpio_in2_i, + in3_i => gpio_in3_i, + extra_i => gpio_extra_i, + d_o => d_from_gpio_s + ); + + + ----------------------------------------------------------------------------- + -- The Coin Chutes + ----------------------------------------------------------------------------- + coin_chutes_b : entity work.ladybug_chutes + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + right_chute_i => right_chute_i, + left_chute_i => left_chute_i, + cs8_n_i => cs_n_s(8), + nmi_n_o => nmi_n_s, + int_n_o => int_n_s + ); + + + ----------------------------------------------------------------------------- + -- Decrytion PROMs + ----------------------------------------------------------------------------- + + decrypt_prom : entity work.prom_decrypt + port map ( + CLK => clk_20mhz_i, + ADDR => rom_cpu_d_i, + DATA => d_decrypted_s + ); + + ----------------------------------------------------------------------------- + -- Only opcodes (i.e. instruction fetches) have to be decrypted + ----------------------------------------------------------------------------- + d_rom_mux_s <= d_decrypted_s when m1_n_s = '0' else rom_cpu_d_i; + + ----------------------------------------------------------------------------- + -- Gate Data Bus from ROM + -- The ROM puts data on the data bus within the CPU Main Unit so we do + -- gating here. + ----------------------------------------------------------------------------- + d_from_rom_s <= d_rom_mux_s + when cs_n_s(0) = '0' or cs_n_s(1) = '0' or cs_n_s(2) = '0' or + cs_n_s(3) = '0' or cs_n_s(4) = '0' or cs_n_s(5) = '0' else + (others => '1'); + + + ----------------------------------------------------------------------------- + -- Combine Data Buses + -- Uses an AND of all incoming buses from submodules. Each module has to + -- drive ones when not active so we can save logic complexity here. + ----------------------------------------------------------------------------- + d_to_cpu_s <= d_to_cpu_i and d_from_rom_s and d_from_ram_s and d_from_gpio_s; + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + a_o <= a_s(10 downto 0); + rom_cpu_a_o <= a_s(14 downto 0); + rd_n_o <= rd_n_s; + wr_n_o <= wr_n_s; + cs7_n_o <= cs_n_s(7); + cs10_n_o <= cs_n_s(10); + cs11_n_o <= cs_n_s(11); + cs12_n_o <= cs_n_s(12); + cs13_n_o <= cs_n_s(13); + +end struct; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_dip_pack.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_dip_pack.vhd new file mode 100644 index 00000000..ebff8ec4 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_dip_pack.vhd @@ -0,0 +1,142 @@ +------------------------------------------------------------------------------- +-- +-- $Id: ladybug_dip_pack-p.vhd,v 1.4 2005/10/10 20:52:04 arnim Exp $ +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +package ladybug_dip_pack is + + ----------------------------------------------------------------------------- + -- DIP switch settings for Lady Bug + ----------------------------------------------------------------------------- + constant lb_dip_block_1_c : std_logic_vector(7 downto 0) := + -- Lives ------------------------------------------------------------------ + -- 0 = 5 Lives + -- 1 = 3 Lives + '0' & + -- Free Play -------------------------------------------------------------- + -- 0 = Free Play + -- 1 = No Free Play + '1' & + -- Cabinet ---------------------------------------------------------------- + -- 0 = Upright + -- 1 = Cocktail + '0' & + -- Screen Freeze ---------------------------------------------------------- + -- 0 = Freeze + -- 1 = No Freeze + '1' & + -- Rack Test (Cheat) ------------------------------------------------------ + -- 0 = On + -- 1 = Off + '1' & + -- High Score Initials ---------------------------------------------------- + -- 0 = 3-Letter Initials + -- 1 = 10-Letter Initials + '1' & + -- Difficulty ------------------------------------------------------------- + -- 11 = Easy + -- 10 = Medium + -- 01 = Hard + -- 00 = Hardest + "10"; + + ----------------------------------------------------------------------------- + -- DIP switch settings for Dorodon + ----------------------------------------------------------------------------- + constant do_dip_block_1_c : std_logic_vector(7 downto 0) := + -- Lives ------------------------------------------------------------------ + -- 0 = 5 Lives + -- 1 = 3 Lives + '0' & + -- Free Play -------------------------------------------------------------- + -- 0 = Free Play + -- 1 = No Free Play + '1' & + -- Cabinet ---------------------------------------------------------------- + -- 0 = Upright + -- 1 = Cocktail + '0' & + -- Screen Freeze ---------------------------------------------------------- + -- 0 = Freeze + -- 1 = No Freeze + '1' & + -- Rack Test (Cheat) ------------------------------------------------------ + -- 0 = On + -- 1 = Off + '1' & + -- Bonus Life ------------------------------------------------------------- + -- 0 = 40000 + -- 1 = 20000 + '1' & + -- Difficulty ------------------------------------------------------------- + -- 11 = Easy + -- 10 = Medium + -- 01 = Hard + -- 00 = Hardest + "10"; + + + ----------------------------------------------------------------------------- + -- DIP switch settings for Cosmic Avenger + ----------------------------------------------------------------------------- + constant ca_dip_block_1_c : std_logic_vector(7 downto 0) := + -- Lives per Game --------------------------------------------------------- + -- 00 = 2 Lives + -- 11 = 3 Lives + -- 10 = 4 Lives + -- 01 = 5 Lives + "01" & + -- Initial High Score ----------------------------------------------------- + -- 00 = 0 + -- 11 = 5000 + -- 10 = 8000 + -- 01 = 10000 + "11" & + -- Cabinet ---------------------------------------------------------------- + -- 0 = Upright + -- 1 = Cocktail + '0' & + -- High Score Names ------------------------------------------------------- + -- 0 = 3 Letters + -- 1 = 10 Letters + '1' & + -- Difficulty ------------------------------------------------------------- + -- 11 = Easy + -- 10 = Medium + -- 01 = Hard + -- 00 = Hardest + "10"; + + constant price_dip_block_2_c : std_logic_vector(7 downto 0) := + -- Pricing Options -------------------------------------------------------- + -- 1111 = 1 coin 1 credit + -- 1110 = 1 coin 2 credits + -- 1101 = 1 coin 3 credits + -- 1100 = 1 coin 4 credits + -- 1011 = 1 coin 5 credits + -- 1010 = 2 coins 1 credit + -- 1001 = 2 coins 3 credits + -- 1000 = 3 coins 1 credit + -- 0111 = 3 coins 2 credit + -- 0110 = 4 coins 1 credit + -- 0101 = 1 coin 1 credit + -- 0100 = 1 coin 1 credit + -- 0011 = 1 coin 1 credit + -- 0010 = 1 coin 1 credit + -- 0001 = 1 coin 1 credit + -- 0000 = 1 coin 1 credit + -- + -- Left Chute + "1111" & + -- Right Chute + "1111"; + +end ladybug_dip_pack; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_gpio.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_gpio.vhd new file mode 100644 index 00000000..6ca21711 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_gpio.vhd @@ -0,0 +1,139 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_gpio.vhd,v 1.3 2005/10/10 21:21:20 arnim Exp $ +-- +-- General purpose IO input for CPU Main Unit. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_gpio is + + port ( + a_i : in std_logic_vector(1 downto 0); + cs_in_n_i : in std_logic; + cs_extra_n_i : in std_logic; + in0_i : in std_logic_vector(7 downto 0); + in1_i : in std_logic_vector(7 downto 0); + in2_i : in std_logic_vector(7 downto 0); + in3_i : in std_logic_vector(7 downto 0); + extra_i : in std_logic_vector(7 downto 0); + d_o : out std_logic_vector(7 downto 0) + ); + +end ladybug_gpio; + + +architecture rtl of ladybug_gpio is + +begin + + ----------------------------------------------------------------------------- + -- Process gpio + -- + -- Purpose: + -- Multiplex the IN and EXTRA inputs onto the data bus for CPU. + -- + gpio: process (a_i, + cs_in_n_i, + cs_extra_n_i, + in0_i, + in1_i, + in2_i, + in3_i, + extra_i) + variable cs_n_v : std_logic_vector(1 downto 0); + begin + -- default assignment with inactive bus value + d_o <= (others => '1'); + + cs_n_v := cs_extra_n_i & cs_in_n_i; + case cs_n_v is + -- IN ports and DIP switches selected ----------------------------------- + when "10" => + case a_i is + -- IN 0 addressed + when "00" => + d_o <= in0_i; + -- IN 1 addressed + when "01" => + d_o <= in1_i; + -- DIP 0 addressed + when "10" => + d_o <= in2_i; + -- DIP 1 addressed + when "11" => + d_o <= in3_i; + + when others => + null; + end case; + + -- Extra bank selected -------------------------------------------------- + when "01" => + case a_i is + when "00" => + d_o(1) <= extra_i(7); + d_o(0) <= extra_i(3); + when "01" => + d_o(1) <= extra_i(6); + d_o(0) <= extra_i(2); + when "10" => + d_o(1) <= extra_i(5); + d_o(0) <= extra_i(1); + when "11" => + d_o(1) <= extra_i(4); + d_o(0) <= extra_i(0); + when others => + null; + end case; + + when others => + null; + end case; + + end process gpio; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_machine.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_machine.vhd new file mode 100644 index 00000000..584b8391 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_machine.vhd @@ -0,0 +1,295 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_machine.vhd,v 1.23 2006/02/07 00:44:21 arnim Exp $ +-- +-- Toplevel of the Lady Bug machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ladybug_machine is + port ( + -- Clock and Reset Interface ---------------------------------------------- + ext_res_n_i : in std_logic; + clk_20mhz_i : in std_logic; + clk_en_10mhz_o : out std_logic; + clk_en_5mhz_o : out std_logic; + por_n_o : out std_logic; + -- Control Interface ------------------------------------------------------ + tilt_n_i : in std_logic; + player_select_n_i : in std_logic_vector( 1 downto 0); + player_fire_n_i : in std_logic_vector( 1 downto 0); + player_up_n_i : in std_logic_vector( 1 downto 0); + player_right_n_i : in std_logic_vector( 1 downto 0); + player_down_n_i : in std_logic_vector( 1 downto 0); + player_left_n_i : in std_logic_vector( 1 downto 0); + player_bomb_n_i : in std_logic_vector( 1 downto 0); + right_chute_i : in std_logic; + left_chute_i : in std_logic; + -- DIP Switch Interface --------------------------------------------------- + dip_block_1_i : in std_logic_vector( 7 downto 0); + dip_block_2_i : in std_logic_vector( 7 downto 0); + -- RGB Video Interface ---------------------------------------------------- + rgb_r_o : out std_logic_vector( 1 downto 0); + rgb_g_o : out std_logic_vector( 1 downto 0); + rgb_b_o : out std_logic_vector( 1 downto 0); + hsync_n_o : out std_logic; + vsync_n_o : out std_logic; + comp_sync_n_o : out std_logic; + vblank_o : out std_logic; + hblank_o : out std_logic; + -- Audio Interface -------------------------------------------------------- + audio_o : out signed( 7 downto 0); + -- CPU ROM Interface ------------------------------------------------------ + rom_cpu_a_o : out std_logic_vector(14 downto 0); + rom_cpu_d_i : in std_logic_vector( 7 downto 0); + -- Character ROM Interface ------------------------------------------------ + rom_char_a_o : out std_logic_vector(11 downto 0); + rom_char_d_i : in std_logic_vector(15 downto 0); + -- Sprite ROM Interface --------------------------------------------------- + rom_sprite_a_o : out std_logic_vector(11 downto 0); + rom_sprite_d_i : in std_logic_vector(15 downto 0) + ); + + +end ladybug_machine; + +architecture struct of ladybug_machine is + + -- Clock System ------------------------------------------------------------- + signal clk_en_10mhz_s, + clk_en_10mhz_n_s : std_logic; + signal clk_en_5mhz_s, + clk_en_5mhz_n_s : std_logic; + signal clk_en_4mhz_s : std_logic; + + -- Reset System ------------------------------------------------------------- + signal por_n_s : std_logic; + signal res_n_s : std_logic; + + signal sound_wait_n_s : std_logic; + signal wait_n_s : std_logic; + signal a_s : std_logic_vector(10 downto 0); + signal d_to_cpu_s, + d_from_cpu_s, + d_from_video_s : std_logic_vector( 7 downto 0); + signal rd_n_s, + wr_n_s : std_logic; + signal cs7_n_s, + cs10_n_s, + cs11_n_s, + cs12_n_s, + cs13_n_s : std_logic; + signal vc_s, + vbl_tick_n_s, + vbl_buf_s : std_logic; + + signal gpio_in0_s, + gpio_in1_s, + gpio_in2_s, + gpio_in3_s, + gpio_extra_s : std_logic_vector( 7 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Clock Generator + ----------------------------------------------------------------------------- + clk_b : entity work.ladybug_clk + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_s, + clk_en_10mhz_o => clk_en_10mhz_s, + clk_en_10mhz_n_o => clk_en_10mhz_n_s, + clk_en_5mhz_o => clk_en_5mhz_s, + clk_en_5mhz_n_o => clk_en_5mhz_n_s, + clk_en_4mhz_o => clk_en_4mhz_s + ); + -- + clk_en_5mhz_o <= clk_en_5mhz_s; + clk_en_10mhz_o <= clk_en_10mhz_s; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Reset Generator + ----------------------------------------------------------------------------- + res_b : entity work.ladybug_res + port map ( + clk_20mhz_i => clk_20mhz_i, + ext_res_n_i => ext_res_n_i, + res_n_o => res_n_s, + por_n_o => por_n_s + ); + -- + por_n_o <= por_n_s; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Joystick and DIP Switch Mapping + ----------------------------------------------------------------------------- + gpio_in0_s <= tilt_n_i & + player_select_n_i(1) & + player_select_n_i(0) & + player_fire_n_i(0) & + player_up_n_i(0) & + player_right_n_i(0) & + player_down_n_i(0) & + player_left_n_i(0); + gpio_in1_s <= vbl_buf_s & + vbl_tick_n_s & + vc_s & + player_fire_n_i(1) & + player_up_n_i(1) & + player_right_n_i(1) & + player_down_n_i(1) & + player_left_n_i(1); + gpio_in2_s <= dip_block_1_i; + gpio_in3_s <= dip_block_2_i; + gpio_extra_s <= player_bomb_n_i(1) & + '1' & + '1' & + '1' & + player_bomb_n_i(0) & + '1' & + '1' & + '1'; + + + ----------------------------------------------------------------------------- + -- CPU Unit + ----------------------------------------------------------------------------- + cpu_b : entity work.ladybug_cpu_unit + port map ( + clk_20mhz_i => clk_20mhz_i, + clk_en_4mhz_i => clk_en_4mhz_s, + res_n_i => res_n_s, + rom_cpu_a_o => rom_cpu_a_o, + rom_cpu_d_i => rom_cpu_d_i, + + sound_wait_n_i => sound_wait_n_s, + wait_n_i => wait_n_s, + right_chute_i => right_chute_i, + left_chute_i => left_chute_i, + gpio_in0_i => gpio_in0_s, + gpio_in1_i => gpio_in1_s, + gpio_in2_i => gpio_in2_s, + gpio_in3_i => gpio_in3_s, + gpio_extra_i => gpio_extra_s, + a_o => a_s, + d_to_cpu_i => d_to_cpu_s, + d_from_cpu_o => d_from_cpu_s, + rd_n_o => rd_n_s, + wr_n_o => wr_n_s, + cs7_n_o => cs7_n_s, + cs10_n_o => cs10_n_s, + cs11_n_o => cs11_n_s, + cs12_n_o => cs12_n_s, + cs13_n_o => cs13_n_s + ); + + ----------------------------------------------------------------------------- + -- Bus Multiplexer + ----------------------------------------------------------------------------- + d_to_cpu_s <= d_from_video_s when (cs7_n_s and cs13_n_s) = '0' else (others => '1'); + + ----------------------------------------------------------------------------- + -- Video Unit + ----------------------------------------------------------------------------- + video_b : entity work.ladybug_video_unit + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_s, + res_n_i => res_n_s, + clk_en_10mhz_i => clk_en_10mhz_s, + clk_en_10mhz_n_i => clk_en_10mhz_n_s, + clk_en_5mhz_i => clk_en_5mhz_s, + clk_en_5mhz_n_i => clk_en_5mhz_n_s, + clk_en_4mhz_i => clk_en_4mhz_s, + cs7_n_i => cs7_n_s, + cs10_n_i => cs10_n_s, + cs13_n_i => cs13_n_s, + a_i => a_s, + rd_n_i => rd_n_s, + wr_n_i => wr_n_s, + wait_n_o => wait_n_s, + d_from_cpu_i => d_from_cpu_s, + d_from_video_o => d_from_video_s, + vc_o => vc_s, + vbl_tick_n_o => vbl_tick_n_s, + vbl_buf_o => vbl_buf_s, + rgb_r_o => rgb_r_o, + rgb_g_o => rgb_g_o, + rgb_b_o => rgb_b_o, + hsync_n_o => hsync_n_o, + vsync_n_o => vsync_n_o, + comp_sync_n_o => comp_sync_n_o, + vblank_o => vblank_o, + hblank_o => hblank_o, + rom_char_a_o => rom_char_a_o, + rom_char_d_i => rom_char_d_i, + rom_sprite_a_o => rom_sprite_a_o, + rom_sprite_d_i => rom_sprite_d_i + ); + + ----------------------------------------------------------------------------- + -- Sound Unit + ----------------------------------------------------------------------------- + sound_b : entity work.ladybug_sound_unit + port map ( + clk_20mhz_i => clk_20mhz_i, + clk_en_4mhz_i => clk_en_4mhz_s, + por_n_i => por_n_s, + cs11_n_i => cs11_n_s, + cs12_n_i => cs12_n_s, + wr_n_i => wr_n_s, + d_from_cpu_i => d_from_cpu_s, + sound_wait_n_o => sound_wait_n_s, + audio_o => audio_o + ); + +end struct; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_rams.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_rams.vhd new file mode 100644 index 00000000..578d08e7 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_rams.vhd @@ -0,0 +1,340 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_char_ram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video character RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 8 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_char_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 7 downto 0); + d_o : out std_logic_vector( 7 downto 0) + ); + +end ladybug_char_ram; + +architecture struct of ladybug_char_ram is + + signal d_s : std_logic_vector(7 downto 0); + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,8) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_s + ); + + -- gate the data output for and'ing on CPU bus + d_o <= d_s when cs_n_i = '0' else (others => '1'); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite_ram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video sprite RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 8 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_sprite_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 7 downto 0); + d_o : out std_logic_vector( 7 downto 0) + ); + +end ladybug_sprite_ram; + +architecture struct of ladybug_sprite_ram is + + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,8) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_o + ); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_char_col_ram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video character color RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 4 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_char_col_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 3 downto 0); + d_o : out std_logic_vector( 3 downto 0) + ); + +end ladybug_char_col_ram; + +architecture struct of ladybug_char_col_ram is + + signal d_s : std_logic_vector(3 downto 0); + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,4) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_s + ); + + -- gate the data output for and'ing on CPU bus + d_o <= d_s when cs_n_i = '0' else (others => '1'); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite_vram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video sprite VRAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 4 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_sprite_vram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 3 downto 0); + d_o : out std_logic_vector( 3 downto 0) + ); + +end ladybug_sprite_vram; + +architecture struct of ladybug_sprite_vram is + + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,4) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_o + ); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_cpu_ram.vhd,v 1.1 2005/11/06 15:43:38 arnim Exp $ +-- +-- Wrapper for technology dependent CPU RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 4 K x 8 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_cpu_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(11 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 7 downto 0); + d_o : out std_logic_vector( 7 downto 0) + ); + +end ladybug_cpu_ram; + +architecture struct of ladybug_cpu_ram is + + signal d_s : std_logic_vector(7 downto 0); + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram1_inst: work.spram generic map(12,8) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_s + ); + + -- gate the data output for and'ing on CPU bus + d_o <= d_s when cs_n_i = '0' else (others => '1'); + +end struct; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_res.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_res.vhd new file mode 100644 index 00000000..85998a10 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_res.vhd @@ -0,0 +1,148 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_res.vhd,v 1.8 2005/10/10 20:52:04 arnim Exp $ +-- +-- Reset generator for the Lady Bug machine. +-- +-- This module generates a reset signal for the whole system synchronous to +-- the main clock. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +library ieee; +use ieee.numeric_std.all; + +entity ladybug_res is + + port ( + clk_20mhz_i : in std_logic; + ext_res_n_i : in std_logic; + res_n_o : out std_logic; + por_n_o : out std_logic + ); + +end ladybug_res; + +architecture rtl of ladybug_res is + + -- 4.7e-2 s = 1 / 20,000,000 Hz * 940000 + constant res_delay_c : natural := 940000; + + signal res_sync_n_q : std_logic_vector(1 downto 0); + + signal res_delay_q : unsigned(19 downto 0); + signal res_n_q : std_logic; + + signal por_cnt_q : unsigned(1 downto 0) := "00"; + signal por_n_q : std_logic := '0'; +begin + + por_n_o <= por_n_q; + res_n_o <= res_n_q; + + ----------------------------------------------------------------------------- + -- Process por_cnt + -- + -- Purpose: + -- Generate a power-on reset for 4 clock cycles. + -- + por_cnt: process (clk_20mhz_i) + begin + if clk_20mhz_i'event and clk_20mhz_i = '1' then + if por_cnt_q = "11" then + por_n_q <= '1'; + else + por_cnt_q <= por_cnt_q + 1; + end if; + end if; + end process por_cnt; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process res_sync + -- + -- Purpose: + -- Synchronize asynchronous external reset to main 20 MHz clock. + -- + res_sync: process (clk_20mhz_i, ext_res_n_i, por_n_q) + begin + if ext_res_n_i = '0' or por_n_q = '0' then + res_sync_n_q <= (others => '0'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + res_sync_n_q(0) <= '1'; + res_sync_n_q(1) <= res_sync_n_q(0); + end if; + end process res_sync; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process res_delay + -- + -- Purpose: + -- Delay reset event (external or power-on) by 4.7e-2 s. + -- Reset delay is taken from Lady Bug reset circuit using NE555. + -- This duration might be too long for the actual requirements of the + -- FPGA circuit. + -- + res_delay: process (clk_20mhz_i, res_sync_n_q) + begin + if res_sync_n_q(1) = '0' then + res_delay_q <= (others => '0'); + res_n_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if res_delay_q = res_delay_c then + res_n_q <= '1'; + else + res_delay_q <= res_delay_q + 1; + end if; + end if; + end process res_delay; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_rgb.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_rgb.vhd new file mode 100644 index 00000000..1bfcd53c --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_rgb.vhd @@ -0,0 +1,135 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_rgb.vhd,v 1.4 2005/10/10 22:02:14 arnim Exp $ +-- +-- RGB Generation Module of the Lady Bug Machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_rgb is + + port ( + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + crg_i : in std_logic_vector(5 downto 1); + sig_i : in std_logic_vector(4 downto 1); + rgb_r_o : out std_logic_vector(1 downto 0); + rgb_g_o : out std_logic_vector(1 downto 0); + rgb_b_o : out std_logic_vector(1 downto 0) + ); + +end ladybug_rgb; + +architecture rtl of ladybug_rgb is + + signal a_s : std_logic_vector(5 downto 1); + signal rgb_s : std_logic_vector(8 downto 1); + signal rgb_n_q : std_logic_vector(8 downto 1); + +begin + + ----------------------------------------------------------------------------- + -- Process addr + -- + -- Purpose: + -- Generates the PROM address. + -- + addr: process (crg_i, + sig_i) + variable sig_and_v : std_logic; + begin + sig_and_v := sig_i(1) and sig_i(2) and sig_i(3) and sig_i(4); + + a_s(5) <= crg_i(1) and sig_and_v; + + if not (sig_and_v and (crg_i(1) or crg_i(2))) = '0' then + a_s(4 downto 1) <= crg_i(2) & crg_i(5) & crg_i(4) & crg_i(3); + else + a_s(4 downto 1) <= sig_i; + end if; + + end process addr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- The RGB Conversion PROM + ----------------------------------------------------------------------------- + rgb_prom_b : entity work.prom_10_2 + port map ( + CLK => clk_20mhz_i, + ADDR => a_s, + DATA => rgb_s + ); + + ----------------------------------------------------------------------------- + -- Process rgb_latch + -- + -- Purpose: + -- Implements the output latch for the RGB values. + -- + rgb_latch: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + rgb_n_q <= (others => '1'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if clk_en_5mhz_i = '1' then + rgb_n_q <= not rgb_s; + end if; + end if; + end process rgb_latch; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + rgb_r_o <= rgb_n_q(5+1) & rgb_n_q(0+1); + rgb_g_o <= rgb_n_q(6+1) & rgb_n_q(2+1); + rgb_b_o <= rgb_n_q(7+1) & rgb_n_q(4+1); + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_sprite.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_sprite.vhd new file mode 100644 index 00000000..941d997c --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_sprite.vhd @@ -0,0 +1,857 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite.vhd,v 1.12 2005/10/10 22:02:14 arnim Exp $ +-- +-- Sprite Video Module of Lady Bug Machine. +-- +-- This unit contains the whole sprite logic which is distributed on the +-- CPU and video boards. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity ladybug_sprite is +port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + res_n_i : in std_logic; + clk_en_10mhz_i : in std_logic; + clk_en_10mhz_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_5mhz_n_i : in std_logic; + -- CPU Interface ---------------------------------------------------------- + cs7_n_i : in std_logic; + a_i : in std_logic_vector( 9 downto 0); + d_from_cpu_i : in std_logic_vector( 7 downto 0); + -- RGB Video Interface ---------------------------------------------------- + h_i : in std_logic_vector( 3 downto 0); + h_t_i : in std_logic_vector( 3 downto 0); + hx_i : in std_logic; + ha_d_i : in std_logic; + v_i : in std_logic_vector( 3 downto 0); + v_t_i : in std_logic_vector( 3 downto 0); + vbl_n_i : in std_logic; + vbl_d_n_i : in std_logic; + vc_d_i : in std_logic; + blank_flont_i : in std_logic; + blank_i : in std_logic; + sig_o : out std_logic_vector( 4 downto 1); + -- Sprite ROM Interface --------------------------------------------------- + rom_sprite_a_o : out std_logic_vector(11 downto 0); + rom_sprite_d_i : in std_logic_vector(15 downto 0) +); + +end ladybug_sprite; + +architecture rtl of ladybug_sprite is + + signal sprite_ram_cs_n_s, + sprite_ram_we_n_s, + clk_5mhz_n_q, + clk_en_eck_s, + clk_en_rd_s, + clk_en_5ck_n_s, + clk_en_6ck_n_s, + clk_en_7ck_n_s, + clk_en_b7_p3_s, + clk_en_e7_3_s, + s6ck_n_s, + s7ck_n_s, + e5_p8_s, + a8_p5_n_s, + ct0_s, + ct1_s, + cr_mux_sel_s, + ck_inh_s, + ck_inh_n_q, + qh1_s, + qh2_s : std_logic; + + signal rb_s, + rb_unflip_s, + rc_s : std_logic_vector( 7 downto 0); + + signal c_s : std_logic_vector(10 downto 0); + signal v_cnt_s : std_logic_vector( 4 downto 0); + signal ra_s : std_logic_vector( 9 downto 0); + + signal ma_s : std_logic_vector(11 downto 0); + signal ma_q : std_logic_vector(11 downto 6); + signal mb_q : std_logic_vector( 1 downto 0); + signal mc_q : std_logic_vector( 6 downto 0); + signal cl_q : std_logic_vector( 4 downto 0); + + signal j7_s : std_logic_vector( 2 downto 0); + signal df_muxed_s : std_logic_vector( 7 downto 0); + + signal lu_a_s : std_logic_vector( 4 downto 0); + signal lu_d_s : std_logic_vector( 7 downto 0); + signal lu_d_mux_s : std_logic_vector( 3 downto 0); + + signal rd_shift_s, + rd_shift_int, + rd_vram_s : std_logic_vector(15 downto 0); + signal rs_s, + rs_int, + rs_n_s : std_logic_vector( 3 downto 0); + signal rs_enable_s : std_logic; + signal shift_oc_n_s : std_logic; + + signal j6_shifter : std_logic_vector( 3 downto 0); + signal h6_shifter : std_logic_vector( 3 downto 0); + signal ctrl_lu_a_s : std_logic_vector( 4 downto 0); + signal ctrl_lu_d_s : std_logic_vector( 7 downto 0); + signal v_cnt_a5_a6_s : std_logic_vector( 7 downto 0); + + signal ctrl_lu_q_d_s, + ctrl_lu_q : std_logic_vector( 6 downto 1); + + signal vram_we_n_s : std_logic; + signal vram_a6_in_s, + vram_a6_out_s, + vram_b6_in_s, + vram_b6_out_s, + vram_c6_in_s, + vram_c6_out_s, + vram_d6_in_s, + vram_d6_out_s : std_logic_vector( 3 downto 0); + + signal ca_q : std_logic_vector( 3 downto 1); + signal ca6_s, + ca7_s, + ca8_s : std_logic; + signal x_s : std_logic_vector( 5 downto 0); + + signal cr_s : std_logic_vector( 9 downto 0); + + signal vram_q : std_logic_vector(15 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- The Vertical Counters C5 D5 + ----------------------------------------------------------------------------- + v_cnt_c5_c6_b : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + v_cnt_s <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if clk_en_b7_p3_s = '1' then + if e5_p8_s = '0' then + v_cnt_s <= (v_t_i & "0"); + else + v_cnt_s <= v_cnt_s + 1; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Counter J7 + ----------------------------------------------------------------------------- + j7_b : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + j7_s <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if clk_en_10mhz_i = '1' then + if s6ck_n_s = '0' then + j7_s <= not mc_q(6) & mc_q(6) & '0'; + elsif (ct0_s or ct1_s or a8_p5_n_s or ck_inh_s) = '0' then + j7_s <= j7_s + 1; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Sprite VRAM Counters A5 A6 + ----------------------------------------------------------------------------- + ct0_s <= v_cnt_a5_a6_s(0); + ct1_s <= v_cnt_a5_a6_s(1); + x_s <= v_cnt_a5_a6_s(7 downto 2); + + v_cnt_a5_a6_b : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + v_cnt_a5_a6_s <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if clk_en_10mhz_i = '1' then + if s7ck_n_s = '0' then + v_cnt_a5_a6_s(7 downto 4) <= (rb_s(7 downto 4)); + v_cnt_a5_a6_s(3 downto 0) <= (rb_s(3 downto 2) & not rc_s(7) & not rc_s(6)); + elsif ck_inh_n_q = '1' then + v_cnt_a5_a6_s <=v_cnt_a5_a6_s + 1; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Process sprite_ram_ctrl + -- + -- Purpose: + -- Generates the control signals for the sprite RAM. + -- + sprite_ram_ctrl: process ( cs7_n_i, + vbl_n_i, + a_i, + c_s, v_cnt_s) + variable cpu_access_v : std_logic; + begin + cpu_access_v := not cs7_n_i and not vbl_n_i; + + sprite_ram_we_n_s <= not cpu_access_v; + sprite_ram_cs_n_s <= cpu_access_v nor vbl_n_i; + + if vbl_n_i = '0' then + ra_s <= a_i; + else + ra_s <= v_cnt_s(4 downto 0) & c_s(4 downto 0); + end if; + end process sprite_ram_ctrl; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- The Sprite RAM P5 N5 + ----------------------------------------------------------------------------- + sprite_ram_b : entity work.ladybug_sprite_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_5mhz_i, + a_i => ra_s, + cs_n_i => sprite_ram_cs_n_s, + we_n_i => sprite_ram_we_n_s, + d_i => d_from_cpu_i, + d_o => rb_s + ); + + ----------------------------------------------------------------------------- + -- Process rc_add + -- + -- Purpose: + -- Implements IC N6 and E6 which add sprite RAM data and Cx signals to + -- form RCx bus. + -- + rc_add: process (rb_s, c_s, v_i) + variable a_v, b_v, + sum_v : std_logic_vector(7 downto 0); + begin + -- prepare the inputs of the adder + a_v(3 downto 0) := rb_s(3 downto 0); + a_v(4) := '1'; + a_v(5) := '0'; + a_v(7 downto 6) := rb_s(1 downto 0); + + b_v(0) := not c_s(6); + b_v(1) := not c_s(7); + b_v(2) := not c_s(8); + b_v(3) := not v_i(3); + b_v(4) := c_s(10); + b_v(5) := '0'; + b_v(7 downto 6) := "11"; + + sum_v := a_v + b_v; + + rc_s <= sum_v; + + end process rc_add; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Sprite Control Logic + ----------------------------------------------------------------------------- + sprite_ctrl_b : entity work.ladybug_sprite_ctrl + port map ( + clk_20mhz_i => clk_20mhz_i, + clk_en_5mhz_i => clk_en_5mhz_i, + clk_en_5mhz_n_i => clk_en_5mhz_n_i, + por_n_i => por_n_i, + vbl_n_i => vbl_n_i, + vbl_d_n_i => vbl_d_n_i, + vc_i => v_i(2), + vc_d_i => vc_d_i, + ha_i => h_i(0), + ha_d_i => ha_d_i, + rb6_i => rb_s(6), + rb7_i => rb_s(7), + rc3_i => rc_s(3), + rc4_i => rc_s(4), + rc5_i => rc_s(5), + j7_b_i => j7_s(1), + j7_c_i => j7_s(2), + clk_en_eck_i => clk_en_eck_s, + c_o => c_s, + clk_en_5ck_n_o => clk_en_5ck_n_s, + clk_en_6ck_n_o => clk_en_6ck_n_s, + clk_en_7ck_n_o => clk_en_7ck_n_s, + s6ck_n_o => s6ck_n_s, + s7ck_n_o => s7ck_n_s, + clk_en_b7_p3_o => clk_en_b7_p3_s, + e5_p8_o => e5_p8_s, + clk_en_e7_3_o => clk_en_e7_3_s, + a8_p5_n_o => a8_p5_n_s + ); + + ----------------------------------------------------------------------------- + -- Process misc_seq + -- + -- Purpose: + -- Implements several sequential elements. + -- + misc_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + clk_5mhz_n_q <= '0'; + ma_q <= (others => '0'); + mb_q <= (others => '0'); + mc_q <= (others => '0'); + cl_q <= (others => '0'); + ck_inh_n_q <= '1'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Turn clk_5mhz_n into clock waveform ---------------------------------- + if clk_en_5mhz_n_i = '1' then + clk_5mhz_n_q <= '1'; + elsif clk_en_5mhz_i = '1' then + clk_5mhz_n_q <= '0'; + end if; + + -- 8-Bit Register M6 ---------------------------------------------------- + if clk_en_5ck_n_s = '1' then + mb_q <= rb_s(1 downto 0); + ma_q <= rb_s(7 downto 2); + end if; + + -- 8-Bit Register P6 ---------------------------------------------------- + if clk_en_e7_3_s = '1' then + -- these are inverted based on mc_q(4) + mc_q(3 downto 0) <= rc_s(3 downto 0); + -- inverts sprites horizontally + mc_q(4) <= rb_s(4); + -- inverts sprites vertically + mc_q(5) <= rb_s(5); + -- + mc_q(6) <= rb_s(6); + end if; + + -- 6-Bit Register B6 ---------------------------------------------------- + if clk_en_6ck_n_s = '1' then + cl_q <= rb_s(4 downto 0); + end if; + + -- Flip-Flop H8 --------------------------------------------------------- + if clk_en_10mhz_n_i = '1' then + ck_inh_n_q <= not ck_inh_s; + end if; + + end if; + end process misc_seq; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process ma_vec + -- + -- Purpose: + -- Build the ma_s vector. + -- + ma_vec: process ( ma_q, + mb_q, + mc_q, + j7_s) + begin + ma_s(11 downto 6) <= ma_q; + + if mc_q(6) = '0' then + ma_s(5) <= mb_q(1); + ma_s(4) <= mb_q(0); + else + ma_s(5) <= mc_q(3) xor mc_q(4); + ma_s(4) <= mc_q(5) xor j7_s(2); + end if; + + ma_s(3) <= mc_q(2) xor mc_q(4); + ma_s(2) <= mc_q(1) xor mc_q(4); + ma_s(1) <= mc_q(0) xor mc_q(4); + ma_s(0) <= mc_q(5) xor j7_s(0); + end process ma_vec; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process df_mux + -- + -- Purpose: + -- Builds the multiplexed data from Sprite ROM. + -- Two-stage multiplexer: + -- 1) ROM data to DFx: 16->8 + -- 2) DF to input for shift register: 8->8 + -- This is actually a scrambler. + -- + df_mux: process ( rom_sprite_d_i, + cl_q, + mc_q) + variable df_v : std_logic_vector(7 downto 0); + begin + if cl_q(4) = '0' then + -- ROM L7 + df_v := rom_sprite_d_i( 7 downto 0); + else + -- ROM M7 + df_v := rom_sprite_d_i(15 downto 8); + end if; + + if mc_q(5) = '0' then + df_muxed_s(0) <= df_v(1); + df_muxed_s(1) <= df_v(3); + df_muxed_s(2) <= df_v(5); + df_muxed_s(3) <= df_v(7); + -- + df_muxed_s(4) <= df_v(0); + df_muxed_s(5) <= df_v(2); + df_muxed_s(6) <= df_v(4); + df_muxed_s(7) <= df_v(6); + else + df_muxed_s(0) <= df_v(7); + df_muxed_s(1) <= df_v(5); + df_muxed_s(2) <= df_v(3); + df_muxed_s(3) <= df_v(1); + -- + df_muxed_s(4) <= df_v(6); + df_muxed_s(5) <= df_v(4); + df_muxed_s(6) <= df_v(2); + df_muxed_s(7) <= df_v(0); + end if; + + end process df_mux; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- The Two 8-Bit Shift Registers H6 J6 + ----------------------------------------------------------------------------- + shifters_h6_j6 : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + h6_shifter <= (others=>'0'); + j6_shifter <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if (clk_en_10mhz_i and not ck_inh_s) = '1' then + if (ct0_s or ct1_s or a8_p5_n_s) = '0' then + h6_shifter <= df_muxed_s(3 downto 0); + j6_shifter <= df_muxed_s(7 downto 4); + else + h6_shifter <= h6_shifter(2 downto 0) & "0"; + j6_shifter <= j6_shifter(2 downto 0) & "0"; + end if; + end if; + end if; + end process; + + qh1_s <= h6_shifter(3); + qh2_s <= j6_shifter(3); + + ----------------------------------------------------------------------------- + -- Sprite Look-up PROM F4 + ----------------------------------------------------------------------------- + lu_a_s(4 downto 2) <= cl_q(2 downto 0); + lu_a_s(1) <= qh2_s; + lu_a_s(0) <= qh1_s; + + prom_F4 : entity work.prom_10_1 + port map ( + CLK => clk_20mhz_i, + ADDR => lu_a_s, + DATA => lu_d_s + ); + + lu_d_mux_s <= lu_d_s(3 downto 0) when cl_q(3) = '0' else lu_d_s(7 downto 4); + + ----------------------------------------------------------------------------- + -- Sprite Control Look-up PROM C4 + ----------------------------------------------------------------------------- + ctrl_lu_a_s(0) <= '1'; + ctrl_lu_a_s(1) <= hx_i; + ctrl_lu_a_s(2) <= clk_5mhz_n_q; + ctrl_lu_a_s(3) <= h_i(0); + ctrl_lu_a_s(4) <= h_i(1); + + prom_C4 : entity work.prom_10_3 + port map ( + CLK => clk_20mhz_i, + ADDR => ctrl_lu_a_s, + DATA => ctrl_lu_d_s + ); + + ----------------------------------------------------------------------------- + -- Process ctrl_lu_seq + -- + -- Purpose: + -- Registers output of Sprite Control Look-up PROM. + -- + ctrl_lu_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + ctrl_lu_q <= (others => '0'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + ctrl_lu_q <= ctrl_lu_q_d_s; + end if; + end process ctrl_lu_seq; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process ctrl_lu_comb + -- + -- Purpose: + -- Combinational logic for the sprite control registers. + -- + ctrl_lu_comb: process ( clk_en_10mhz_i, + ctrl_lu_d_s, + ctrl_lu_q, + ctrl_lu_q_d_s) + begin + -- default assignments + ctrl_lu_q_d_s <= ctrl_lu_q; + clk_en_eck_s <= '0'; + clk_en_rd_s <= '0'; + + -- register control + if clk_en_10mhz_i = '1' then + ctrl_lu_q_d_s <= ctrl_lu_d_s(5 downto 0); + + if ctrl_lu_q(1) = '0' and ctrl_lu_q_d_s(1) = '1' then + -- detect rising edge on ctrl_lu_q(1) + clk_en_eck_s <= '1'; + end if; + + if ctrl_lu_q(6) = '0' and ctrl_lu_q_d_s(6) = '1' then + -- detect rising edge on ctrl_lu_q(6) + clk_en_rd_s <= '1'; + end if; + end if; + + end process ctrl_lu_comb; + -- + shift_oc_n_s <= ctrl_lu_q(1) nand res_n_i; + ck_inh_s <= ctrl_lu_q(2); + cr_mux_sel_s <= ctrl_lu_q(3); + vram_we_n_s <= ctrl_lu_q(4); + rs_enable_s <= ctrl_lu_q(5); + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process ca_seq + -- + -- Purpose: + -- Implements B5, the register that holds the CS flip-flops. + -- + ca_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + ca_q <= (others => '0'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if clk_en_7ck_n_s = '1' then + ca_q <= c_s(8 downto 6); + end if; + end if; + end process ca_seq; + -- + ca6_s <= ca_q(1); + ca7_s <= ca_q(2); + ca8_s <= ca_q(3); + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process vram_mux + -- + -- Purpose: + -- Generates the VRAM address CRx. + -- It implements chips D5, C5 and B5. + -- + vram_mux: process ( h_i, h_t_i, + v_i, + x_s, + ca6_s, ca7_s, ca8_s, + cr_mux_sel_s) + begin + if cr_mux_sel_s = '0' then + -- D5 + cr_s(0) <= h_i(2); + cr_s(1) <= h_i(3); + cr_s(2) <= h_t_i(0); + cr_s(3) <= h_t_i(1); + -- C5 + cr_s(4) <= h_t_i(2); + cr_s(5) <= h_t_i(3); + cr_s(6) <= v_i(0); + cr_s(7) <= v_i(1); + -- B5 + cr_s(8) <= v_i(2); + cr_s(9) <= v_i(3); + + else + -- D5 + cr_s(0) <= x_s(0); + cr_s(1) <= x_s(1); + cr_s(2) <= x_s(2); + cr_s(3) <= x_s(3); + -- C5 + cr_s(4) <= x_s(4); + cr_s(5) <= x_s(5); + cr_s(6) <= ca6_s; + cr_s(7) <= ca7_s; + -- B5 + cr_s(8) <= ca8_s; + cr_s(9) <= not v_i(3); + + end if; + end process vram_mux; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Shift Registers + ----------------------------------------------------------------------------- + shifters_a7_a8_d7_d8_f8 : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + rd_shift_int <= (others=>'1'); + elsif rising_edge(clk_20mhz_i) then + if (clk_en_10mhz_i and not ck_inh_s) = '1' then + rs_int <= (qh1_s nor qh2_s) & rs_int(3 downto 1); + rd_shift_int <= + lu_d_mux_s(0) & rd_shift_int(15 downto 13) & + lu_d_mux_s(1) & rd_shift_int(11 downto 9) & + lu_d_mux_s(2) & rd_shift_int( 7 downto 5) & + lu_d_mux_s(3) & rd_shift_int( 3 downto 1); + end if; + end if; + end process; + + rd_shift_s <= rd_shift_int when shift_oc_n_s = '0' else (others=>'1'); + rs_s <= rs_int when shift_oc_n_s = '0' else (others=>'1'); +-- rs_n_s(3) <= not rs_s(3) or not rs_enable_s; +-- rs_n_s(2) <= not rs_s(2) or not rs_enable_s; +-- rs_n_s(1) <= not rs_s(1) or not rs_enable_s; +-- rs_n_s(0) <= not rs_s(0) or not rs_enable_s; + rs_n_s(3) <= rs_s(3) and rs_enable_s; + rs_n_s(2) <= rs_s(2) and rs_enable_s; + rs_n_s(1) <= rs_s(1) and rs_enable_s; + rs_n_s(0) <= rs_s(0) and rs_enable_s; + + ----------------------------------------------------------------------------- + -- Sprite VRAM + ----------------------------------------------------------------------------- + vram_a6_in_s(0) <= rd_shift_s( 0); + vram_a6_in_s(1) <= rd_shift_s( 4); + vram_a6_in_s(2) <= rd_shift_s( 8); + vram_a6_in_s(3) <= rd_shift_s(12); + vram_a6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(0), + we_n_i => vram_we_n_s, + d_i => vram_a6_in_s, + d_o => vram_a6_out_s + ); + -- + vram_b6_in_s(0) <= rd_shift_s( 1); + vram_b6_in_s(1) <= rd_shift_s( 5); + vram_b6_in_s(2) <= rd_shift_s( 9); + vram_b6_in_s(3) <= rd_shift_s(13); + vram_b6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(1), + we_n_i => vram_we_n_s, + d_i => vram_b6_in_s, + d_o => vram_b6_out_s + ); + -- + vram_c6_in_s(0) <= rd_shift_s( 2); + vram_c6_in_s(1) <= rd_shift_s( 6); + vram_c6_in_s(2) <= rd_shift_s(10); + vram_c6_in_s(3) <= rd_shift_s(14); + vram_c6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(2), + we_n_i => vram_we_n_s, + d_i => vram_c6_in_s, + d_o => vram_c6_out_s + ); + -- + vram_d6_in_s(0) <= rd_shift_s( 3); + vram_d6_in_s(1) <= rd_shift_s( 7); + vram_d6_in_s(2) <= rd_shift_s(11); + vram_d6_in_s(3) <= rd_shift_s(15); + vram_d6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(3), + we_n_i => vram_we_n_s, + d_i => vram_d6_in_s, + d_o => vram_d6_out_s + ); + -- Remap VRAM data outputs to the complete bus ------------------------------ + rd_vram_s(15) <= vram_d6_out_s(3) or rs_n_s(3); + rd_vram_s(14) <= vram_c6_out_s(3) or rs_n_s(2); + rd_vram_s(13) <= vram_b6_out_s(3) or rs_n_s(1); + rd_vram_s(12) <= vram_a6_out_s(3) or rs_n_s(0); + -- + rd_vram_s(11) <= vram_d6_out_s(2) or rs_n_s(3); + rd_vram_s(10) <= vram_c6_out_s(2) or rs_n_s(2); + rd_vram_s( 9) <= vram_b6_out_s(2) or rs_n_s(1); + rd_vram_s( 8) <= vram_a6_out_s(2) or rs_n_s(0); + -- + rd_vram_s( 7) <= vram_d6_out_s(1) or rs_n_s(3); + rd_vram_s( 6) <= vram_c6_out_s(1) or rs_n_s(2); + rd_vram_s( 5) <= vram_b6_out_s(1) or rs_n_s(1); + rd_vram_s( 4) <= vram_a6_out_s(1) or rs_n_s(0); + -- + rd_vram_s( 3) <= vram_d6_out_s(0) or rs_n_s(3); + rd_vram_s( 2) <= vram_c6_out_s(0) or rs_n_s(2); + rd_vram_s( 1) <= vram_b6_out_s(0) or rs_n_s(1); + rd_vram_s( 0) <= vram_a6_out_s(0) or rs_n_s(0); + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process rd_seq + -- + -- Purpose: + -- Implements the registers saving the RDx bus. + -- + rd_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + vram_q <= (others => '0'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if blank_flont_i = '0' then + -- pseudo-asynchronous clear + vram_q <= (others => '0'); + + elsif clk_en_rd_s = '1' then + if shift_oc_n_s = '0' then + -- take data from shift registers + vram_q <= rd_shift_s; + else + -- take data from VRAM + vram_q <= rd_vram_s; + end if; + end if; + end if; + end process rd_seq; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process sig_mux + -- + -- Purpose: + -- Multiplexes the saved VRAM data to generate the four SIG outputs. + -- + sig_mux: process (vram_q, + h_i, + blank_i) + variable vec_v : std_logic_vector(1 downto 0); + begin + -- default assignment + sig_o <= (others => '0'); + + vec_v := (h_i(1) & h_i(0)); + + if blank_i = '0' then + case vec_v is + when "00" => + sig_o(1) <= vram_q( 1); + sig_o(2) <= vram_q( 5); + sig_o(3) <= vram_q( 9); + sig_o(4) <= vram_q(13); + when "01" => + sig_o(1) <= vram_q( 2); + sig_o(2) <= vram_q( 6); + sig_o(3) <= vram_q(10); + sig_o(4) <= vram_q(14); + when "10" => + sig_o(1) <= vram_q( 3); + sig_o(2) <= vram_q( 7); + sig_o(3) <= vram_q(11); + sig_o(4) <= vram_q(15); + when "11" => + sig_o(1) <= vram_q( 0); + sig_o(2) <= vram_q( 4); + sig_o(3) <= vram_q( 8); + sig_o(4) <= vram_q(12); + when others => + null; + end case; + end if; + end process sig_mux; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + rom_sprite_a_o <= ma_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_sprite_ctrl.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_sprite_ctrl.vhd new file mode 100644 index 00000000..f0eaff48 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_sprite_ctrl.vhd @@ -0,0 +1,491 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite_ctrl.vhd,v 1.8 2005/10/10 22:02:14 arnim Exp $ +-- +-- Control logic of the Sprite module. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +library ieee; +use ieee.numeric_std.all; + +entity ladybug_sprite_ctrl is + + port ( + clk_20mhz_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_5mhz_n_i : in std_logic; + por_n_i : in std_logic; + vbl_n_i : in std_logic; + vbl_d_n_i : in std_logic; + vc_i : in std_logic; + vc_d_i : in std_logic; + ha_i : in std_logic; + ha_d_i : in std_logic; + rb6_i : in std_logic; + rb7_i : in std_logic; + rc3_i : in std_logic; + rc4_i : in std_logic; + rc5_i : in std_logic; + j7_b_i : in std_logic; + j7_c_i : in std_logic; + clk_en_eck_i : in std_logic; + c_o : out std_logic_vector(10 downto 0); + clk_en_5ck_n_o : out std_logic; + clk_en_6ck_n_o : out std_logic; + clk_en_7ck_n_o : out std_logic; + s6ck_n_o : out std_logic; + s7ck_n_o : out std_logic; + clk_en_b7_p3_o : out std_logic; + e5_p8_o : out std_logic; + clk_en_e7_3_o : out std_logic; + a8_p5_n_o : out std_logic + ); + +end ladybug_sprite_ctrl; + + +architecture rtl of ladybug_sprite_ctrl is + + signal clk_5mhz_q : std_logic; + + signal a7_p5_s, + a7_p5_q : std_logic; + signal a7_p9_q : std_logic; + + signal a8_p5_q : std_logic; + + signal n4_p5_s, + n4_p5_q : std_logic; + + signal f7_ck_en_s, + f7_cl_s, + f7_qa_s, f7_qb_s, f7_qc_s, f7_qd_s, + f7_da_s, f7_db_s, f7_dc_s, f7_dd_s : std_logic_vector(2 downto 1); + + signal j5_ck_en_s, + j5_cl_s, + j5_qa_s, j5_qb_s, j5_qc_s, j5_qd_s, + j5_da_s, j5_db_s, j5_dc_s, j5_dd_s : std_logic_vector(2 downto 1); + + signal e7_ck_en_s, + e7_cl_n_s : std_logic; + signal e7_d_s, + e7_q_s, e7_q_n_s, + e7_d_out_s, e7_d_out_n_s : std_logic_vector(4 downto 1); + + signal h5_n_s : std_logic_vector(7 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements various sequential elements. + -- + seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + clk_5mhz_q <= '0'; + a7_p5_q <= '0'; + a7_p9_q <= '0'; + a8_p5_q <= '0'; + n4_p5_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Turn clk_5mhz enable into clock waveform ----------------------------- + if clk_en_5mhz_i = '1' then + clk_5mhz_q <= '1'; + elsif clk_en_5mhz_n_i = '1' then + clk_5mhz_q <= '0'; + end if; + + -- Flip-Flop A7 --------------------------------------------------------- + a7_p5_q <= a7_p5_s; + -- + if clk_en_5mhz_n_i = '1' then + a7_p9_q <= j5_qd_s(2); + end if; + + -- Flip-Flop A8 --------------------------------------------------------- + if clk_en_eck_i = '1' then + a8_p5_q <= j7_b_i nand j7_c_i; + end if; + + -- Flip-Flop N4 --------------------------------------------------------- + n4_p5_q <= n4_p5_s; + + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements various combinational signals. + -- + comb: process (a7_p5_q, + vc_i, vc_d_i, + n4_p5_q, + ha_i, ha_d_i, + f7_qd_s) + begin + -- D Input for Flip-Flop N4 ----------------------------------------------- + if a7_p5_q = '0' then + -- pseudo-asynchronous clear + n4_p5_s <= '0'; + elsif (vc_i and not vc_d_i) = '1' then + -- falling edge on VC + n4_p5_s <= '1'; + else + n4_p5_s <= n4_p5_q; + end if; + + -- D-Input for Flip-Flop A7.5 --------------------------------------------- + if (ha_i and not ha_d_i) = '1' then + -- falling edge on HA + a7_p5_s <= f7_qd_s(2); + else + a7_p5_s <= a7_p5_q; + end if; + + end process comb; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- F7 - Dual 4-Bit Binary Counter + ----------------------------------------------------------------------------- + f7_cl_s(1) <= n4_p5_q and ha_i and vbl_n_i; + f7_cl_s(2) <= f7_cl_s(1); + -- + f7_b : entity work.ttl_393 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => f7_ck_en_s, + por_n_i => por_n_i, + cl_i => f7_cl_s, + qa_o => f7_qa_s, + qb_o => f7_qb_s, + qc_o => f7_qc_s, + qd_o => f7_qd_s, + da_o => f7_da_s, + db_o => f7_db_s, + dc_o => f7_dc_s, + dd_o => f7_dd_s + ); + + + ----------------------------------------------------------------------------- + -- Process f7_ck_en + -- + -- Purpose: + -- Build the clock enable for the two counters in F7. + -- + f7_ck_en: process (j5_qd_s, j5_dd_s, + vbl_n_i, vbl_d_n_i, + ha_i, ha_d_i, + n4_p5_q, n4_p5_s, + f7_qd_s, f7_dd_s, + e7_q_n_s, e7_d_out_n_s, + f7_qb_s, f7_db_s) + + variable ff_q_v, ff_d_v : std_logic; + + begin + + -- combinational result based on flip-flop outputs + ff_q_v := j5_qd_s(2) or ( not ( not ( vbl_n_i and ha_i and n4_p5_q ) ) or not ( not f7_qd_s(2) nand not e7_q_n_s(1) ) ); + + -- combinational result based on flip-flop inputs + ff_d_v := j5_dd_s(2) or ( not ( not ( vbl_d_n_i and ha_d_i and n4_p5_s ) ) or not ( not f7_qd_s(2) nand not e7_d_out_n_s(1) ) ); +-- B7.3 D7.8 D7.8 F6.3 B7.6 + -- rising edge detector on B7.3 + f7_ck_en_s(1) <= not ff_q_v and ff_d_v; + + -- falling edge detector on F7.QB(1) + f7_ck_en_s(2) <= f7_qb_s(1) and not f7_db_s(1); + + end process f7_ck_en; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- J5 - Dual 4-Bit Binary Counter + ----------------------------------------------------------------------------- + j5_cl_s(1) <= not vbl_n_i + or -- D7.6 + not( + not clk_5mhz_q + nand -- F5.8 + not h5_n_s(0) + ) + or -- D7.6 + n4_p5_q; + j5_cl_s(2) <= a7_p9_q + or -- B7.8 + ( + not ( + not ( + n4_p5_q + and -- D7.8 + ha_i + and -- D7.8 + vbl_n_i + ) + ) + or -- F6.3 + not ( + not f7_qd_s(2) + nand -- B7.6 + not e7_q_n_s(1) + ) + ); + -- + j5_b : entity work.ttl_393 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => j5_ck_en_s, + por_n_i => por_n_i, + cl_i => j5_cl_s, + qa_o => j5_qa_s, + qb_o => j5_qb_s, + qc_o => j5_qc_s, + qd_o => j5_qd_s, + da_o => j5_da_s, + db_o => j5_db_s, + dc_o => j5_dc_s, + dd_o => j5_dd_s + ); + + + ----------------------------------------------------------------------------- + -- Process j5_ck_en + -- + -- Purpose: + -- Build the clock enable for the two counters in J5. + -- + j5_ck_en: process (ha_i, ha_d_i, + e7_q_s, e7_d_out_s, + j5_qc_s, j5_dc_s) + begin + -- falling edge detector on F6.11 + j5_ck_en_s(1) <= -- Flip-Flop Outputs + ( + not ha_i + nand + e7_q_s(3) + ) + and not -- Flip-Flop Inputs + ( + not ha_d_i + nand + e7_d_out_s(3) + ); + + -- falling edge detector on C7.10 + j5_ck_en_s(2) <= -- Flip-Flop Outputs + ( + j5_qc_s(1) + nor + e7_q_s(2) + ) + and not -- Flip-Flop Inputs + ( + j5_dc_s(1) + nor + e7_d_out_s(2) + ); + end process j5_ck_en; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- E7 - Quad D-Type Flip-Flops with Clear + ----------------------------------------------------------------------------- + e7_d_s(1) <= not rb7_i; + e7_d_s(2) <= not ( + rb7_i + and -- D7.12 + rc5_i + and -- D7.12 + ( + not rc4_i + and -- C7.1 + not ( + not rc3_i + nor -- C6.3 + rb6_i + ) + ) + ); + e7_d_s(3) <= not e7_d_s(2) + and -- C7.4 + not a8_p5_q; + e7_d_s(4) <= '0'; + + -- This clock enable is not 100% equivalent to the schematics. + -- There, h5_n_s(4) could also generate a rising edge for E7 + -- but this is ignored here. It is believed that h5_n_s(4) acts + -- only as a clock enable/suppress for the 5 MHz clock. + -- This implementation suppresses as well a combinational feedback + -- loop from J5/1. + e7_ck_en_s <= clk_en_5mhz_i and not h5_n_s(4); + + e7_cl_n_s <= f7_qd_s(2) + or -- B7.3?? + ( + not clk_5mhz_q + nand -- F5.8 + not h5_n_s(0) + ) after 20 ns; + + e7_b : entity work.ttl_175 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => e7_ck_en_s, + por_n_i => por_n_i, + cl_n_i => e7_cl_n_s, + d_i => e7_d_s, + q_o => e7_q_s, + q_n_o => e7_q_n_s, + d_o => e7_d_out_s, + d_n_o => e7_d_out_n_s + ); + + clk_en_e7_3_o <= not e7_q_s(3) and e7_d_out_s(3); + + + ----------------------------------------------------------------------------- + -- Process h5 + -- + -- Purpose: + -- Implements all functionality regarding H5. + -- + h5: process (j5_qa_s, j5_da_s, + j5_qb_s, j5_db_s, + ha_i, ha_d_i, + vbl_n_i, vbl_d_n_i, + a7_p5_q, a7_p5_s) + variable ff_q_v, ff_d_v : std_logic_vector(7 downto 0); + variable f5_p3_q_v, f5_p3_d_v : std_logic; + + ----------------------------------------------------------------------------- + -- 7445 - BCD to Decimal Decoder + ----------------------------------------------------------------------------- + function ttl_45_f(a, b, c, d : in std_logic) return + std_logic_vector is + variable idx_v : std_logic_vector( 3 downto 0); + variable vec_v : std_logic_vector(15 downto 0); + begin + vec_v := (others => '1'); + + idx_v := d & c & b & a; + vec_v(to_integer(unsigned(idx_v))) := '0'; + + return vec_v(7 downto 0); + end ttl_45_f; + + begin + -- combinational result based on flip-flop outputs + f5_p3_q_v := not a7_p5_q nand vbl_n_i; + ff_q_v := ttl_45_f(a => j5_qa_s(1), + b => j5_qb_s(1), + c => ha_i, + d => f5_p3_q_v); + -- combinational result based on flip-flop inputs + f5_p3_d_v := not a7_p5_s nand vbl_d_n_i; + ff_d_v := ttl_45_f(a => j5_da_s(1), + b => j5_db_s(1), + c => ha_d_i, + d => f5_p3_d_v); + + -- combinational output of H5 is based on flip-flop outputs + h5_n_s <= ff_q_v; + + -- clock enable for flip-flops on /5CK + clk_en_5ck_n_o <= not ff_q_v(5) and ff_d_v(5); + -- clock enable for flip-flops on /6CK + clk_en_6ck_n_o <= not ff_q_v(6) and ff_d_v(6); + -- clock enable for flip-flops on /7CK + clk_en_7ck_n_o <= not ff_q_v(7) and ff_d_v(7); + + s6ck_n_o <= ff_q_v(6); + s7ck_n_o <= ff_q_v(7); + end process h5; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + clk_en_b7_p3_o <= f7_ck_en_s(1); + e5_p8_o <= n4_p5_q + nor -- E5.8 + not ( + f7_qa_s(1) + nand -- F6.8 + f7_qb_s(1) + ); + a8_p5_n_o <= not a8_p5_q; + + c_o( 0) <= j5_qa_s(1); + c_o( 1) <= j5_qb_s(1); + c_o( 2) <= j5_qa_s(2); + c_o( 3) <= j5_qb_s(2); + c_o( 4) <= j5_qc_s(2); + c_o( 5) <= j5_qd_s(2); + c_o( 6) <= f7_qa_s(2); + c_o( 7) <= f7_qb_s(2); + c_o( 8) <= f7_qc_s(2); + c_o( 9) <= f7_qa_s(1); + c_o(10) <= f7_qb_s(1); + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_video_timing.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_video_timing.vhd new file mode 100644 index 00000000..58a3a818 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_video_timing.vhd @@ -0,0 +1,356 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_video_timing.vhd,v 1.16 2006/02/07 19:27:38 arnim Exp $ +-- +-- The Video Timing Module of Lady Bug Machine. +-- +-- It implements the horizontal and vertical timing signals including composite +-- sync information. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +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 ladybug_video_timing is + + port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + -- Horizontal Timing Interface -------------------------------------------- + h_o : out std_logic_vector(3 downto 0); + h_t_o : out std_logic_vector(3 downto 0); + hbl_o : out std_logic; + hx_o : out std_logic; + ha_d_o : out std_logic; + ha_t_rise_o : out std_logic; + -- Vertical Timing Interface ---------------------------------------------- + v_o : out std_logic_vector(3 downto 0); + v_t_o : out std_logic_vector(3 downto 0); + vc_d_o : out std_logic; + vbl_n_o : out std_logic; + vbl_d_n_o : out std_logic; + vbl_t_n_o : out std_logic; + blank_flont_o : out std_logic; + -- RBG Video Interface ---------------------------------------------------- + hsync_n_o : out std_logic; + vsync_n_o : out std_logic; + comp_sync_n_o : out std_logic + ); + +end ladybug_video_timing; + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_video_timing is + + -- horizontal timing circuit + signal h_preset : std_logic_vector(7 downto 0); + signal h_rise : std_logic_vector(7 downto 0); + signal h_do : std_logic_vector(7 downto 0); + signal h_j2_h2 : std_logic_vector(7 downto 0); + signal h_s : std_logic_vector(7 downto 0); + signal hx_q, + hx_s, + hx_n_s : std_logic; + signal hx_rise_s : std_logic; + signal hbl_q : std_logic; +-- signal hbl_n_s : std_logic; + signal hsync_n_q : std_logic; + signal h_carry_s : std_logic; + signal hd_rise_s : std_logic; + + -- vertical timing circuit + signal v_preset : std_logic_vector(7 downto 0); + signal v_rise : std_logic_vector(7 downto 0); + signal v_do : std_logic_vector(7 downto 0); + signal v_s : std_logic_vector(7 downto 0); + signal vx_q, + vx_n_s : std_logic; + signal vbl_q, + vbl_s, + vbl_n_s : std_logic; + signal vbl_t_q, + vbl_t_s, + vbl_t_n_s : std_logic; + signal vsync_n_q : std_logic; + signal v_carry_s : std_logic; + signal vc_rise_s, + vd_rise_s : std_logic; + signal vb_t_rise_s : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Horizontal Timing counters J2 H2 + ----------------------------------------------------------------------------- + hd_rise_s <= h_rise(3); + ha_t_rise_o <= h_rise(4); + ha_d_o <= h_do(0); + h_preset <= hx_n_s & hx_n_s & "00" & hx_n_s & "000"; + + h_counter : entity work.counter + port map ( + ck_i => clk_20mhz_i, + ck_en_i => clk_en_5mhz_i, + reset_n_i => por_n_i, + load_i => h_carry_s, + preset_i => h_preset, + q_o => h_s, + co_o => h_carry_s, + rise_q_o => h_rise, + d_o => h_do + ); + + ----------------------------------------------------------------------------- + -- Process h_timing + -- + -- Purpose: + -- Implement the horizontal timing circuit. + -- + -- The original circuit has no asynchronous reset. To have a stable + -- behavior on silicon, all sequential elements are cleared with the + -- power-on reset. This assumes that the original chips power-up to + -- these values. + -- + -- See also instantiations of ttl_161. + -- + h_timing: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + hx_q <= '0'; + hbl_q <= '0'; + hsync_n_q <= '1'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Flip-flops on 5 MHz clock -------------------------------------------- + -- HX + hx_q <= hx_s; + + -- Free running flip-flops ---------------------------------------------- + -- HBL + if (hx_q and not h_s(3)) = '1' then + -- pseudo-asynchronous preset + hbl_q <= '1'; + elsif hd_rise_s = '1' then + -- Rising edge on HD + hbl_q <= hx_q; + end if; + + -- HSYNC + if hx_q = '0' then + -- pseudo-asynchronous preset + hsync_n_q <= '1'; + elsif hd_rise_s = '1' then + -- rising edge on HD + hsync_n_q <= h_s(5); + end if; + + end if; + + end process h_timing; + -- + ----------------------------------------------------------------------------- + + hx_n_s <= not hx_q; +--hbl_n_s <= not hbl_q; + + ----------------------------------------------------------------------------- + -- Process hx_comb + -- + -- Purpose: + -- Implements the combinational logic for hx. Including rising edge + -- detection. + -- + hx_comb: process (clk_en_5mhz_i, h_carry_s, hx_q) + begin + -- default assignments + hx_s <= hx_q; + hx_rise_s <= '0'; + + -- HX + if clk_en_5mhz_i = '1' then + if h_carry_s = '1' then + hx_s <= not hx_q; + + -- flag rising edge of hx_q + if hx_q = '0' then + hx_rise_s <= '1'; + end if; + end if; + end if; + + end process hx_comb; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Vertical Timing counters E5 E2 + ----------------------------------------------------------------------------- + vb_t_rise_s <= v_rise(5); + vd_rise_s <= v_rise(3); + vc_rise_s <= v_rise(2); + vc_d_o <= v_do(2); + v_preset <= vx_n_s & vx_n_s & vx_n_s & vx_q & vx_n_s & '0' & vx_n_s & '0'; + + v_counter : entity work.counter + port map ( + ck_i => clk_20mhz_i, + ck_en_i => hx_rise_s, + reset_n_i => por_n_i, + load_i => v_carry_s, + preset_i => v_preset, + q_o => v_s, + co_o => v_carry_s, + rise_q_o => v_rise, + d_o => v_do + ); + + ----------------------------------------------------------------------------- + -- Process v_timing + -- + -- Purpose: + -- Implement the vertical timing circuit. + -- + -- See process h_timing for reset discussion. + -- + v_timing: process (clk_20mhz_i, por_n_i) + variable preset_v : boolean; + begin + if por_n_i = '0' then + vx_q <= '0'; + vbl_q <= '0'; + vsync_n_q <= '1'; + vbl_t_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Free running flip-flops ---------------------------------------------- + -- VX + if hx_rise_s = '1' then + if v_carry_s = '1' then + vx_q <= vx_n_s; + end if; + end if; + + -- VSYNC + if vc_rise_s = '1' then + -- rising edge on VC + vsync_n_q <= not (v_s(7) and v_s(6) and v_s(5) and v_s(4) and v_s(3) and vx_n_s); + end if; + + -- VBL + vbl_q <= vbl_s; + + -- VBL' + vbl_t_q <= vbl_t_s; + + end if; + end process v_timing; + -- + ----------------------------------------------------------------------------- + + vx_n_s <= not vx_q; + vbl_n_s <= not vbl_q; + vbl_t_n_s <= not vbl_t_q; + + + ----------------------------------------------------------------------------- + -- Process vbl_comb + -- + -- Purpose: + -- Combinational logic for vbl_q and vbl_t_q. + -- + vbl_comb: process (v_s, vb_t_rise_s, vd_rise_s, vx_q, vbl_q, vbl_t_q) + variable preset_v : boolean; + begin + preset_v := (v_s(5) and v_s(6) and v_s(7)) = '1'; + -- VBL + vbl_s <= vbl_q; + if preset_v then + -- pseudo-asynchronous preset + vbl_s <= '1'; + elsif vb_t_rise_s = '1' then + -- rising edge on VB' + vbl_s <= vx_q; + end if; + + -- VBL' + vbl_t_s <= vbl_t_q; + if preset_v then + -- pseudo-asynchronous preset + vbl_t_s <= '1'; + elsif vd_rise_s = '1' then + -- rising edge on VD + vbl_t_s <= vx_q; + end if; + + end process vbl_comb; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + h_o <= h_s(3 downto 0); + h_t_o <= h_s(7 downto 4); + hbl_o <= hbl_q; + hx_o <= hx_q; + v_o <= v_s(3 downto 0); + v_t_o <= v_s(7 downto 4); + vbl_n_o <= vbl_n_s; + vbl_t_n_o <= vbl_t_n_s; + vbl_d_n_o <= not vbl_s; + hsync_n_o <= hsync_n_q; + vsync_n_o <= vsync_n_q; + comp_sync_n_o <= not hsync_n_q xor vsync_n_q; + + -- I have no idea why there is an additional wire called BLANK FLONT. + -- From the schematics, it is the same as /VBL (just buffered). + blank_flont_o <= vbl_n_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_video_unit.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_video_unit.vhd new file mode 100644 index 00000000..96d58e5f --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ladybug_video_unit.vhd @@ -0,0 +1,240 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_video_unit.vhd,v 1.22 2006/02/07 00:44:35 arnim Exp $ +-- +-- The Video Unit of the Lady Bug Machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_video_unit is + port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + res_n_i : in std_logic; + clk_en_10mhz_i : in std_logic; + clk_en_10mhz_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_5mhz_n_i : in std_logic; + clk_en_4mhz_i : in std_logic; + -- CPU Interface ---------------------------------------------------------- + cs7_n_i : in std_logic; + cs10_n_i : in std_logic; + cs13_n_i : in std_logic; + a_i : in std_logic_vector(10 downto 0); + rd_n_i : in std_logic; + wr_n_i : in std_logic; + wait_n_o : out std_logic; + d_from_cpu_i : in std_logic_vector( 7 downto 0); + d_from_video_o : out std_logic_vector( 7 downto 0); + vc_o : out std_logic; + vbl_tick_n_o : out std_logic; + vbl_buf_o : out std_logic; + -- RGB Video Interface ---------------------------------------------------- + rgb_r_o : out std_logic_vector( 1 downto 0); + rgb_g_o : out std_logic_vector( 1 downto 0); + rgb_b_o : out std_logic_vector( 1 downto 0); + hsync_n_o : out std_logic; + vsync_n_o : out std_logic; + comp_sync_n_o : out std_logic; + vblank_o : out std_logic; + hblank_o : out std_logic; + -- Character ROM Interface ------------------------------------------------ + rom_char_a_o : out std_logic_vector(11 downto 0); + rom_char_d_i : in std_logic_vector(15 downto 0); + -- Sprite ROM Interface --------------------------------------------------- + rom_sprite_a_o : out std_logic_vector(11 downto 0); + rom_sprite_d_i : in std_logic_vector(15 downto 0) + ); + +end ladybug_video_unit; + +architecture struct of ladybug_video_unit is + + signal h_s, + h_t_s : std_logic_vector(3 downto 0); + signal ha_d_s, + ha_t_rise_s : std_logic; + signal hbl_s : std_logic; + signal hx_s : std_logic; + + signal v_s, + v_t_s : std_logic_vector(3 downto 0); + signal vc_d_s : std_logic; + signal vbl_n_s, + vbl_d_n_s : std_logic; + + signal blank_flont_s : std_logic; + + signal d_from_char_s : std_logic_vector(7 downto 0); + + signal blank_s : std_logic; + signal crg_s : std_logic_vector(5 downto 1); + + signal sig_s : std_logic_vector(4 downto 1); + + signal comp_sync_n : std_logic; + +begin + comp_sync_n_o <= comp_sync_n and vbl_n_s; + vbl_buf_o <= not vbl_n_s; + ----------------------------------------------------------------------------- + -- Horizontal and Vertical Timing Generator + ----------------------------------------------------------------------------- + timing_b : entity work.ladybug_video_timing + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + h_o => h_s, + h_t_o => h_t_s, + hbl_o => hbl_s, + hx_o => hx_s, + ha_d_o => ha_d_s, + ha_t_rise_o => ha_t_rise_s, + v_o => v_s, + v_t_o => v_t_s, + vc_d_o => vc_d_s, + vbl_n_o => vbl_n_s, + vbl_d_n_o => vbl_d_n_s, + vbl_t_n_o => vbl_tick_n_o, + blank_flont_o => blank_flont_s, + hsync_n_o => hsync_n_o, + vsync_n_o => vsync_n_o, + comp_sync_n_o => comp_sync_n + ); + vc_o <= v_s(2); + + + ----------------------------------------------------------------------------- + -- Character Module + ----------------------------------------------------------------------------- + char_b : entity work.ladybug_char + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + res_n_i => res_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + clk_en_4mhz_i => clk_en_4mhz_i, + cs10_n_i => cs10_n_i, + cs13_n_i => cs13_n_i, + a_i => a_i, + rd_n_i => rd_n_i, + wr_n_i => wr_n_i, + wait_n_o => wait_n_o, + d_from_cpu_i => d_from_cpu_i, + d_from_char_o => d_from_char_s, + h_i => h_s, + h_t_i => h_t_s, + ha_t_rise_i => ha_t_rise_s, + hx_i => hx_s, + v_i => v_s, + v_t_i => v_t_s, + hbl_i => hbl_s, + blank_flont_i => blank_flont_s, + blank_o => blank_s, + vblank_o => vblank_o, + hblank_o => hblank_o, + crg_o => crg_s, + rom_char_a_o => rom_char_a_o, + rom_char_d_i => rom_char_d_i + ); + + + ----------------------------------------------------------------------------- + -- Sprite Module + ----------------------------------------------------------------------------- + sprite_b : entity work.ladybug_sprite + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + res_n_i => res_n_i, + clk_en_10mhz_i => clk_en_10mhz_i, + clk_en_10mhz_n_i => clk_en_10mhz_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + clk_en_5mhz_n_i => clk_en_5mhz_n_i, + cs7_n_i => cs7_n_i, + a_i => a_i(9 downto 0), + d_from_cpu_i => d_from_cpu_i, + h_i => h_s, + h_t_i => h_t_s, + hx_i => hx_s, + ha_d_i => ha_d_s, + v_i => v_s, + v_t_i => v_t_s, + vbl_n_i => vbl_n_s, + vbl_d_n_i => vbl_d_n_s, + vc_d_i => vc_d_s, + blank_flont_i => blank_flont_s, + blank_i => blank_s, + sig_o => sig_s, + rom_sprite_a_o => rom_sprite_a_o, + rom_sprite_d_i => rom_sprite_d_i + ); + + + ----------------------------------------------------------------------------- + -- RGB Generator + ----------------------------------------------------------------------------- + rgb_b : entity work.ladybug_rgb + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + crg_i => crg_s, + sig_i => sig_s, + rgb_r_o => rgb_r_o, + rgb_g_o => rgb_g_o, + rgb_b_o => rgb_b_o + ); + + + ----------------------------------------------------------------------------- + -- Bus Multiplexer + ----------------------------------------------------------------------------- + d_from_video_o <= d_from_char_s + when cs13_n_i = '0' else + (others => '1'); + +end struct; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/mist_io.v b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_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/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/osd.v b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_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/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/pll.qip b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_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/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/pll.v b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/pll.v new file mode 100644 index 00000000..65715540 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 20, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "20.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "20" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "20.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "20" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/scandoubler.v b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/ladybug_sound_unit.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/ladybug_sound_unit.vhd new file mode 100644 index 00000000..23ad2a6a --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/ladybug_sound_unit.vhd @@ -0,0 +1,143 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sound_unit.vhd,v 1.4 2006/06/16 22:41:37 arnim Exp $ +-- +-- Sound Unit of the Lady Bug Machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ladybug_sound_unit is + + port ( + clk_20mhz_i : in std_logic; + clk_en_4mhz_i : in std_logic; + por_n_i : in std_logic; + cs11_n_i : in std_logic; + cs12_n_i : in std_logic; + wr_n_i : in std_logic; + d_from_cpu_i : in std_logic_vector(7 downto 0); + sound_wait_n_o : out std_logic; + audio_o : out signed(7 downto 0) + ); + +end ladybug_sound_unit; + +architecture struct of ladybug_sound_unit is + + signal ready_b1_s, + ready_c1_s : std_logic; + + signal aout_b1_s, + aout_c1_s : signed(7 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- SN76489 Sound Chip B1 + ----------------------------------------------------------------------------- + snd_b1_b : entity work.sn76489_top + generic map ( + clock_div_16_g => 1 + ) + port map ( + clock_i => clk_20mhz_i, + clock_en_i => clk_en_4mhz_i, + res_n_i => por_n_i, + ce_n_i => cs11_n_i, + we_n_i => wr_n_i, + ready_o => ready_b1_s, + d_i => d_from_cpu_i, + aout_o => aout_b1_s + ); + + + ----------------------------------------------------------------------------- + -- SN76489 Sound Chip C1 + ----------------------------------------------------------------------------- + snd_c1_b : entity work.sn76489_top + generic map ( + clock_div_16_g => 1 + ) + port map ( + clock_i => clk_20mhz_i, + clock_en_i => clk_en_4mhz_i, + res_n_i => por_n_i, + ce_n_i => cs12_n_i, + we_n_i => wr_n_i, + ready_o => ready_c1_s, + d_i => d_from_cpu_i, + aout_o => aout_c1_s + ); + + + ----------------------------------------------------------------------------- + -- Process mix + -- + -- Purpose: + -- Mix the digital audio of the two SN76489 instances. + -- Additional care is taken to avoid audio overfow/clipping. + -- + mix: process (aout_b1_s, + aout_c1_s) + variable sum_v : signed(8 downto 0); + begin + sum_v := RESIZE(aout_b1_s, 9) + RESIZE(aout_c1_s, 9); + + if sum_v > 127 then + audio_o <= to_signed(127, 8); + elsif sum_v < -128 then + audio_o <= to_signed(-128, 8); + else + audio_o <= RESIZE(sum_v, 8); + end if; + + end process mix; + -- + ----------------------------------------------------------------------------- + + + sound_wait_n_o <= ready_b1_s and ready_c1_s; + +end struct; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/COPYING b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/COPYING new file mode 100644 index 00000000..60549be5 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/README b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/README new file mode 100644 index 00000000..33630144 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/README @@ -0,0 +1,143 @@ + +An SN76489AN Compatible Implementation in VHDL +============================================== +Version: $Date: 2006/06/18 19:28:40 $ + +Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +See the file COPYING. + + +Integration +----------- + +The sn76489 design exhibits all interface signals as the original chip. It +only differs in the audio data output which is provided as an 8 bit signed +vector instead of an analog output pin. + + generic ( + clock_div_16_g : integer := 1 + -- Set to '1' when operating the design in SN76489 mode. The primary clock + -- input is divided by 16 in this variant. The data sheet mentions the + -- SN76494 which contains a divide-by-2 clock input stage. Set the generic + -- to '0' to enable this mode. + ); + port ( + clock_i : in std_logic; + -- Primary clock input + -- Drive with the target frequency or any integer multiple of it. + + clock_en_i : in std_logic; + -- Clock enable + -- A '1' on this input qualifies a valid rising edge on clock_i. A '0' + -- disables the next rising clock edge, effectivley halting the design + -- until the next enabled rising clock edge. + -- Can be used to run the core at lower frequencies than applied on + -- clock_i. + + res_n_i : in std_logic; + -- Asynchronous low active reset input. + -- Sets all sequential elements to a known state. + + ce_n_i : in std_logic; + -- Chip enable, low active. + + we_n_i : in std_logic; + -- Write enable, low active. + + ready_o : out std_logic; + -- Ready indication to microprocessor. + + d_i : in std_logic_vector(0 to 7); + -- Data input + -- MSB 0 ... 7 LSB + + aout_o : out signed(0 to 7) + -- Audio output, signed vector + -- MSB/SIGN 0 ... 7 LSB + ); + + +Both 8 bit vector ports are defined (0 to 7) which declares bit 0 to be the +MSB and bit 7 to be the LSB. This has been implemented according to TI's data +sheet, thus all register/data format figures apply 1:1 for this design. +Many systems will flip the system data bus bit wise before it is connected to +this PSG. This is simply achieved with the following VHDL construct: + + signal data_s : std_logic_vector(7 downto 0); + + ... + d_i => data_s, + ... + +d_i and data_s will be assigned from left to right, resulting in the expected +bit assignment: + + d_i data_s + 0 7 + 1 6 + ... + 6 1 + 7 0 + + +As this design is fully synchronous, care has to be taken when the design +replaces an SN76489 in asynchronous mode. No problems are expected when +interfacing the code to other synchronous components. + + +Design Hierarchy +---------------- + + sn76489_top + | + +-- sn76489_latch_ctrl + | + +-- sn76489_clock_div + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + \-- sn76489_noise + | + \-- sn76489_attentuator + +Resulting compilation sequence: + + sn76489_comp_pack-p.vhd + sn76489_top.vhd + sn76489_latch_ctrl.vhd + sn76489_latch_ctrl-c.vhd + sn76489_clock_div.vhd + sn76489_clock_div-c.vhd + sn76489_attenuator.vhd + sn76489_attenuator-c.vhd + sn76489_tone.vhd + sn76489_tone-c.vhd + sn76489_noise.vhd + sn76489_noise-c.vhd + sn76489_top-c.vhd + +Skip the files containing VHDL configurations when analyzing the code for +synthesis. + + +References +---------- + +* TI Data sheet SN76489.pdf + ftp://ftp.whtech.com/datasheets%20&%20manuals/SN76489.pdf + +* John Kortink's article on the SN76489: + http://web.inter.nl.net/users/J.Kortink/home/articles/sn76489/ + +* Maxim's "SN76489 notes" in + http://www.smspower.org/maxim/docs/SN76489.txt diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_attenuator.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_attenuator.vhd new file mode 100644 index 00000000..444064e5 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_attenuator.vhd @@ -0,0 +1,114 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_attenuator.vhd,v 1.7 2006/02/27 20:30:10 arnim Exp $ +-- +-- Attenuator Module +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_attenuator is + + port ( + attenuation_i : in std_logic_vector(0 to 3); + factor_i : in signed(0 to 1); + product_o : out signed(0 to 7) + ); + +end sn76489_attenuator; + + +architecture rtl of sn76489_attenuator is + +begin + + ----------------------------------------------------------------------------- + -- Process attenuate + -- + -- Purpose: + -- Determine the attenuation and generate the resulting product. + -- + -- The maximum attenuation value is 31 which corresponds to volume off. + -- As described in the data sheet, the maximum "playing" attenuation is + -- 28 = 16 + 8 + 4 + -- + -- The table for the volume constants is derived from the following + -- formula (each step is 2dB voltage): + -- v(0) = 31 + -- v(n+1) = v(n) * 0.79432823 + -- + attenuate: process (attenuation_i, + factor_i) + + type volume_t is array (natural range 0 to 15) of natural; + constant volume_c : volume_t := + (31, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3, 2, 2, 2, 1, 0); + + variable attenuation_v : unsigned(attenuation_i'range); + variable volume_v : signed(product_o'range); + + begin + + attenuation_v := unsigned(attenuation_i); + + -- volume look-up table + volume_v := to_signed(volume_c(to_integer(attenuation_v)), + product_o'length); + + -- this replaces a multiplier and consumes a bit fewer + -- resources + case to_integer(factor_i) is + when +1 => + product_o <= volume_v; + when -1 => + product_o <= -volume_v; + when others => + product_o <= (others => '0'); + end case; + + end process attenuate; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_clock_div.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_clock_div.vhd new file mode 100644 index 00000000..eab86beb --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_clock_div.vhd @@ -0,0 +1,134 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_clock_div.vhd,v 1.4 2005/10/10 21:51:27 arnim Exp $ +-- +-- Clock Divider Circuit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity sn76489_clock_div is + + generic ( + clock_div_16_g : integer := 1 + ); + port ( + clock_i : in std_logic; + clock_en_i : in std_logic; + res_n_i : in std_logic; + clk_en_o : out boolean + ); + +end sn76489_clock_div; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of sn76489_clock_div is + + signal cnt_s, + cnt_q : unsigned(3 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the sequential counter element. + -- + seq: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + cnt_q <= (others => '0'); + elsif clock_i'event and clock_i = '1' then + cnt_q <= cnt_s; + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements the combinational counter logic. + -- + comb: process (clock_en_i, + cnt_q) + begin + -- default assignments + cnt_s <= cnt_q; + clk_en_o <= false; + + if clock_en_i = '1' then + + if cnt_q = 0 then + clk_en_o <= true; + + if clock_div_16_g = 1 then + cnt_s <= to_unsigned(15, cnt_q'length); + elsif clock_div_16_g = 0 then + cnt_s <= to_unsigned( 1, cnt_q'length); + else + -- pragma translate_off + assert false + report "Generic clock_div_16_g must be either 0 or 1." + severity failure; + -- pragma translate_on + end if; + + else + cnt_s <= cnt_q - 1; + + end if; + + end if; + + end process comb; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_latch_ctrl.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_latch_ctrl.vhd new file mode 100644 index 00000000..789720c2 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_latch_ctrl.vhd @@ -0,0 +1,138 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_latch_ctrl.vhd,v 1.6 2006/02/27 20:30:10 arnim Exp $ +-- +-- Latch Control Unit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity sn76489_latch_ctrl is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + ce_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector(0 to 7); + ready_o : out std_logic; + tone1_we_o : out boolean; + tone2_we_o : out boolean; + tone3_we_o : out boolean; + noise_we_o : out boolean; + r2_o : out std_logic + ); + +end sn76489_latch_ctrl; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of sn76489_latch_ctrl is + + signal reg_q : std_logic_vector(0 to 2); + signal we_q : boolean; + signal ready_q : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the sequential elements. + -- + seq: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + reg_q <= (others => '0'); + we_q <= false; + ready_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + -- READY Flag Output ---------------------------------------------------- + if ready_q = '0' and we_q then + if clk_en_i then + -- assert READY when write access happened + ready_q <= '1'; + end if; + elsif ce_n_i = '1' then + -- deassert READY when access has finished + ready_q <= '0'; + end if; + + -- Register Selection --------------------------------------------------- + if ce_n_i = '0' and we_n_i = '0' then + if clk_en_i then + if d_i(0) = '1' then + reg_q <= d_i(1 to 3); + end if; + we_q <= true; + end if; + else + we_q <= false; + end if; + + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output mapping + ----------------------------------------------------------------------------- + tone1_we_o <= reg_q(0 to 1) = "00" and we_q; + tone2_we_o <= reg_q(0 to 1) = "01" and we_q; + tone3_we_o <= reg_q(0 to 1) = "10" and we_q; + noise_we_o <= reg_q(0 to 1) = "11" and we_q; + + r2_o <= reg_q(2); + + ready_o <= ready_q + when ce_n_i = '0' else + '1'; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_noise.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_noise.vhd new file mode 100644 index 00000000..688bdd56 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_noise.vhd @@ -0,0 +1,278 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_noise.vhd,v 1.6 2006/02/27 20:30:10 arnim Exp $ +-- +-- Noise Generator +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_noise is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + we_i : in boolean; + d_i : in std_logic_vector(0 to 7); + r2_i : in std_logic; + tone3_ff_i : in std_logic; + noise_o : out signed(0 to 7) + ); + +end sn76489_noise; + +architecture rtl of sn76489_noise is + + signal nf_q : std_logic_vector(0 to 1); + signal fb_q : std_logic; + signal a_q : std_logic_vector(0 to 3); + signal freq_cnt_q : unsigned(0 to 6); + signal freq_ff_q : std_logic; + + signal shift_source_s, + shift_source_q : std_logic; + signal shift_rise_edge_s : boolean; + + signal lfsr_q : std_logic_vector(0 to 15); + + signal freq_s : signed(0 to 1); + +begin + + ----------------------------------------------------------------------------- + -- Process cpu_regs + -- + -- Purpose: + -- Implements the registers writable by the CPU. + -- + cpu_regs: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + nf_q <= (others => '0'); + fb_q <= '0'; + a_q <= (others => '1'); + + elsif clock_i'event and clock_i = '1' then + if clk_en_i and we_i then + if r2_i = '0' then + -- access to control register + -- both access types can write to the control register! + nf_q <= d_i(6 to 7); + fb_q <= d_i(5); + + else + -- access to attenuator register + -- both access types can write to the attenuator register! + a_q <= d_i(4 to 7); + + end if; + end if; + end if; + end process cpu_regs; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process freq_gen + -- + -- Purpose: + -- Implements the frequency generation components. + -- + freq_gen: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + freq_cnt_q <= (others => '0'); + freq_ff_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if freq_cnt_q = 0 then + -- reload frequency counter according to NF setting + case nf_q is + when "00" => + freq_cnt_q <= to_unsigned(16 * 2 - 1, freq_cnt_q'length); + when "01" => + freq_cnt_q <= to_unsigned(16 * 4 - 1, freq_cnt_q'length); + when "10" => + freq_cnt_q <= to_unsigned(16 * 8 - 1, freq_cnt_q'length); + when others => + null; + end case; + + freq_ff_q <= not freq_ff_q; + + else + -- decrement frequency counter + freq_cnt_q <= freq_cnt_q - 1; + + end if; + + end if; + end if; + end process freq_gen; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Multiplex the source of the LFSR's shift enable + ----------------------------------------------------------------------------- + shift_source_s <= tone3_ff_i + when nf_q = "11" else + freq_ff_q; + + ----------------------------------------------------------------------------- + -- Process rise_edge + -- + -- Purpose: + -- Detect the rising edge of the selected LFSR shift source. + -- + rise_edge: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + shift_source_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + shift_source_q <= shift_source_s; + end if; + end if; + end process rise_edge; + -- + ----------------------------------------------------------------------------- + + -- detect rising edge on shift source + shift_rise_edge_s <= shift_source_q = '0' and shift_source_s = '1'; + + + ----------------------------------------------------------------------------- + -- Process lfsr + -- + -- Purpose: + -- Implements the LFSR that generates noise. + -- Note: This implementation shifts the register right, i.e. from index + -- 15 towards 0 => bit 15 is the input, bit 0 is the output + -- + -- Tapped bits according to MAME's sn76496.c, implemented in function + -- lfsr_tapped_f. + -- + lfsr: process (clock_i, res_n_i) + + function lfsr_tapped_f(lfsr : in std_logic_vector) return std_logic is + constant tapped_bits_c : std_logic_vector(0 to 15) + -- tapped bits are 0, 2, 15 + := "1010000000000001"; + variable parity_v : std_logic; + begin + parity_v := '0'; + + for idx in lfsr'low to lfsr'high loop + parity_v := parity_v xor (lfsr(idx) and tapped_bits_c(idx)); + end loop; + + return parity_v; + end; + + begin + if res_n_i = '0' then + -- reset LFSR to "0000000000000001" + lfsr_q <= (others => '0'); + lfsr_q(lfsr_q'right) <= '1'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if we_i and r2_i = '0' then + -- write to noise register + -- -> reset LFSR + lfsr_q <= (others => '0'); + lfsr_q(lfsr_q'right) <= '1'; + + elsif shift_rise_edge_s then + + -- shift LFSR left towards MSB + for idx in lfsr_q'right-1 downto lfsr_q'left loop + lfsr_q(idx) <= lfsr_q(idx+1); + end loop; + + -- determine input bit + if fb_q = '0' then + -- "Periodic" Noise + -- -> input to LFSR is output + lfsr_q(lfsr_q'right) <= lfsr_q(lfsr_q'left); + else + -- "White" Noise + -- -> input to LFSR is parity of tapped bits + lfsr_q(lfsr_q'right) <= lfsr_tapped_f(lfsr_q); + end if; + + end if; + + end if; + end if; + end process lfsr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Map output of LFSR to signed value for attenuator. + ----------------------------------------------------------------------------- + freq_s <= to_signed(+1, 2) + when lfsr_q(0) = '1' else + to_signed( 0, 2); + + + ----------------------------------------------------------------------------- + -- The attenuator itself + ----------------------------------------------------------------------------- + attenuator_b : entity work.sn76489_attenuator + port map ( + attenuation_i => a_q, + factor_i => freq_s, + product_o => noise_o + ); + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_tone.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_tone.vhd new file mode 100644 index 00000000..3658efcc --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_tone.vhd @@ -0,0 +1,188 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_tone.vhd,v 1.5 2006/02/27 20:30:10 arnim Exp $ +-- +-- Tone Generator +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_tone is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + we_i : in boolean; + d_i : in std_logic_vector(0 to 7); + r2_i : in std_logic; + ff_o : out std_logic; + tone_o : out signed(0 to 7) + ); + +end sn76489_tone; + +architecture rtl of sn76489_tone is + + signal f_q : std_logic_vector(0 to 9); + signal a_q : std_logic_vector(0 to 3); + signal freq_cnt_q : unsigned(0 to 9); + signal freq_ff_q : std_logic; + + signal freq_s : signed(0 to 1); + + function all_zero(a : in std_logic_vector) return boolean is + variable result_v : boolean; + begin + result_v := true; + + for idx in a'low to a'high loop + if a(idx) /= '0' then + result_v := false; + end if; + end loop; + + return result_v; + end; + +begin + + ----------------------------------------------------------------------------- + -- Process cpu_regs + -- + -- Purpose: + -- Implements the registers writable by the CPU. + -- + cpu_regs: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + f_q <= (others => '0'); + a_q <= (others => '1'); + + elsif clock_i'event and clock_i = '1' then + if clk_en_i and we_i then + if r2_i = '0' then + -- access to frequency register + if d_i(0) = '0' then + f_q(0 to 5) <= d_i(2 to 7); + else + f_q(6 to 9) <= d_i(4 to 7); + end if; + + else + -- access to attenuator register + -- both access types can write to the attenuator register! + a_q <= d_i(4 to 7); + + end if; + end if; + end if; + end process cpu_regs; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process freq_gen + -- + -- Purpose: + -- Implements the frequency generation components. + -- + freq_gen: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + freq_cnt_q <= (others => '0'); + freq_ff_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if freq_cnt_q = 0 then + -- update counter from frequency register + freq_cnt_q <= unsigned(f_q); + + -- and toggle the frequency flip-flop if enabled + if not all_zero(f_q) then + freq_ff_q <= not freq_ff_q; + else + -- if frequency setting is 0, then keep flip-flop at +1 + freq_ff_q <= '1'; + end if; + + else + -- decrement frequency counter + freq_cnt_q <= freq_cnt_q - 1; + + end if; + end if; + end if; + end process freq_gen; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Map frequency flip-flop to signed value for attenuator. + ----------------------------------------------------------------------------- + freq_s <= to_signed(+1, 2) + when freq_ff_q = '1' else + to_signed(-1, 2); + + + ----------------------------------------------------------------------------- + -- The attenuator itself + ----------------------------------------------------------------------------- + attenuator_b : entity work.sn76489_attenuator + port map ( + attenuation_i => a_q, + factor_i => freq_s, + product_o => tone_o + ); + + + ----------------------------------------------------------------------------- + -- Output mapping + ----------------------------------------------------------------------------- + ff_o <= freq_ff_q; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_top.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_top.vhd new file mode 100644 index 00000000..c26d0e1a --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/sound/sn76489/sn76489_top.vhd @@ -0,0 +1,200 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_top.vhd,v 1.9 2006/02/27 20:30:10 arnim Exp $ +-- +-- Chip Toplevel +-- +-- References: +-- +-- * TI Data sheet SN76489.pdf +-- ftp://ftp.whtech.com/datasheets%20&%20manuals/SN76489.pdf +-- +-- * John Kortink's article on the SN76489: +-- http://web.inter.nl.net/users/J.Kortink/home/articles/sn76489/ +-- +-- * Maxim's "SN76489 notes" in +-- http://www.smspower.org/maxim/docs/SN76489.txt +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library ieee; +use ieee.numeric_std.all; + +entity sn76489_top is + + generic ( + clock_div_16_g : integer := 1 + ); + port ( + clock_i : in std_logic; + clock_en_i : in std_logic; + res_n_i : in std_logic; + ce_n_i : in std_logic; + we_n_i : in std_logic; + ready_o : out std_logic; + d_i : in std_logic_vector(0 to 7); + aout_o : out signed(0 to 7) + ); + +end sn76489_top; + +architecture struct of sn76489_top is + + signal clk_en_s : boolean; + + signal tone1_we_s, + tone2_we_s, + tone3_we_s, + noise_we_s : boolean; + signal r2_s : std_logic; + + signal tone1_s, + tone2_s, + tone3_s, + noise_s : signed(0 to 7); + + signal tone3_ff_s : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Clock Divider + ----------------------------------------------------------------------------- + clock_div_b : entity work.sn76489_clock_div + generic map ( + clock_div_16_g => clock_div_16_g + ) + port map ( + clock_i => clock_i, + clock_en_i => clock_en_i, + res_n_i => res_n_i, + clk_en_o => clk_en_s + ); + + + ----------------------------------------------------------------------------- + -- Latch Control = CPU Interface + ----------------------------------------------------------------------------- + latch_ctrl_b : entity work.sn76489_latch_ctrl + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + ce_n_i => ce_n_i, + we_n_i => we_n_i, + d_i => d_i, + ready_o => ready_o, + tone1_we_o => tone1_we_s, + tone2_we_o => tone2_we_s, + tone3_we_o => tone3_we_s, + noise_we_o => noise_we_s, + r2_o => r2_s + ); + + + ----------------------------------------------------------------------------- + -- Tone Channel 1 + ----------------------------------------------------------------------------- + tone1_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone1_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => open, + tone_o => tone1_s + ); + + ----------------------------------------------------------------------------- + -- Tone Channel 2 + ----------------------------------------------------------------------------- + tone2_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone2_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => open, + tone_o => tone2_s + ); + + ----------------------------------------------------------------------------- + -- Tone Channel 3 + ----------------------------------------------------------------------------- + tone3_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone3_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => tone3_ff_s, + tone_o => tone3_s + ); + + ----------------------------------------------------------------------------- + -- Noise Channel + ----------------------------------------------------------------------------- + noise_b : entity work.sn76489_noise + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => noise_we_s, + d_i => d_i, + r2_i => r2_s, + tone3_ff_i => tone3_ff_s, + noise_o => noise_s + ); + + + aout_o <= tone1_s + tone2_s + tone3_s + noise_s; + +end struct; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/spram.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/spram.vhd new file mode 100644 index 00000000..fa4a1fd7 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/spram.vhd @@ -0,0 +1,84 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY spram IS + GENERIC + ( + widthad_a : natural; + width_a : natural := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + data : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + COMPONENT altsyncram + GENERIC ( + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + power_up_uninitialized : STRING; + read_during_write_mode_port_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + wren_a : IN STD_LOGIC ; + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + wren_a => wren, + clock0 => clock, + address_a => address, + data_a => data, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ttl_175.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ttl_175.vhd new file mode 100644 index 00000000..b6459332 --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ttl_175.vhd @@ -0,0 +1,129 @@ +------------------------------------------------------------------------------- +-- +-- TTL 74175 - Quad D-Type Flip-Flops with Clear +-- +-- $Id: ttl_175.vhd,v 1.5 2005/10/10 21:59:13 arnim Exp $ +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ttl_175 is + + port ( + ck_i : in std_logic; + ck_en_i : in std_logic; + por_n_i : in std_logic; + cl_n_i : in std_logic; + d_i : in std_logic_vector(4 downto 1); + q_o : out std_logic_vector(4 downto 1); + q_n_o : out std_logic_vector(4 downto 1); + d_o : out std_logic_vector(4 downto 1); + d_n_o : out std_logic_vector(4 downto 1) + ); + +end ttl_175; + + +architecture rtl of ttl_175 is + + signal flops_q, + flops_s : std_logic_vector(4 downto 1); + +begin + + ----------------------------------------------------------------------------- + -- Process flops + -- + -- Purpose: + -- Implement the sequential elements. + -- + -- Note: We assume that the sequential elements power-up to the same state + -- as forced into by cl_n_i. + -- + flops: process (ck_i, por_n_i) + begin + if por_n_i = '0' then + flops_q <= (others => '0'); + elsif ck_i'event and ck_i = '1' then + flops_q <= flops_s; + end if; + end process flops; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements the combinational logic. + -- + comb: process (flops_q, + cl_n_i, + d_i, + ck_en_i) + begin + -- default assignments + flops_s <= flops_q; + + if cl_n_i = '1' then + if ck_en_i = '1' then + flops_s <= d_i; + end if; + + else + -- pseudo-asynchronous clear + flops_s <= (others => '0'); + end if; + end process comb; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + q_o <= flops_q; + q_n_o <= not flops_q; + d_o <= flops_s; + d_n_o <= not flops_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ttl_393.vhd b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ttl_393.vhd new file mode 100644 index 00000000..3ef25d4b --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/ttl_393.vhd @@ -0,0 +1,152 @@ +------------------------------------------------------------------------------- +-- +-- TTL 74LS393 - Dual 4-Bit Binary Counter +-- +-- $Id: ttl_393.vhd,v 1.3 2005/10/10 21:59:13 arnim Exp $ +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ttl_393 is + + port ( + ck_i : in std_logic; + ck_en_i : in std_logic_vector(2 downto 1); + por_n_i : in std_logic; + cl_i : in std_logic_vector(2 downto 1); + qa_o : out std_logic_vector(2 downto 1); + qb_o : out std_logic_vector(2 downto 1); + qc_o : out std_logic_vector(2 downto 1); + qd_o : out std_logic_vector(2 downto 1); + da_o : out std_logic_vector(2 downto 1); + db_o : out std_logic_vector(2 downto 1); + dc_o : out std_logic_vector(2 downto 1); + dd_o : out std_logic_vector(2 downto 1) + ); + +end ttl_393; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ttl_393 is + + type cnt_q_t is array (natural range 2 downto 1) of unsigned(3 downto 0); + type cnt_d_t is array (natural range 2 downto 1) of unsigned(4 downto 0); + signal cnt_q : cnt_q_t; + signal cnt_s : cnt_d_t; + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the flip-flops. + -- + -- Note: We assume that the sequential elements power-up to the same state + -- as forced into by cl_i. + -- + seq: process (ck_i, por_n_i) + begin + if por_n_i = '0' then + cnt_q(1) <= (others => '0'); + cnt_q(2) <= (others => '0'); + elsif ck_i'event and ck_i = '1' then + cnt_q(1) <= cnt_s(1)(3 downto 0); + cnt_q(2) <= cnt_s(2)(3 downto 0); + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process adder + -- + -- Purpose: + -- Implements the adder. + -- + adder: process (ck_en_i, + cl_i, + cnt_q) + begin + for idx in 2 downto 1 loop + cnt_s(idx) <= '0' & cnt_q(idx); + + if cl_i(idx) = '0' then + if ck_en_i(idx) = '1' then + -- increment upon enable + cnt_s(idx) <= ('0' & cnt_q(idx)) + 1; + end if; + + else + -- pseudo-asynchronous clear + cnt_s(idx) <= (others => '0'); + end if; + end loop; + end process adder; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + qa_o(1) <= cnt_q(1)(0); + qb_o(1) <= cnt_q(1)(1); + qc_o(1) <= cnt_q(1)(2); + qd_o(1) <= cnt_q(1)(3); + qa_o(2) <= cnt_q(2)(0); + qb_o(2) <= cnt_q(2)(1); + qc_o(2) <= cnt_q(2)(2); + qd_o(2) <= cnt_q(2)(3); + da_o(1) <= cnt_s(1)(0); + db_o(1) <= cnt_s(1)(1); + dc_o(1) <= cnt_s(1)(2); + dd_o(1) <= cnt_s(1)(3); + da_o(2) <= cnt_s(2)(0); + db_o(2) <= cnt_s(2)(1); + dc_o(2) <= cnt_s(2)(2); + dd_o(2) <= cnt_s(2)(3); + +end rtl; diff --git a/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/video_mixer.sv b/Arcade/Ladybug Hardware/Dorodon_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Ladybug Hardware/Dorodon_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/Arcade/Ladybug Hardware/LadyBug_MiST/LadyBug.qpf b/Arcade/Ladybug Hardware/LadyBug_MiST/LadyBug.qpf new file mode 100644 index 00000000..7af75589 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/LadyBug.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "LadyBug" diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/LadyBug.qsf b/Arcade/Ladybug Hardware/LadyBug_MiST/LadyBug.qsf new file mode 100644 index 00000000..56238f32 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/LadyBug.qsf @@ -0,0 +1,205 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 10:02:22 November 16, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Arcade-LadyBug_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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 QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_top.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_tone.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_noise.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_latch_ctrl.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_clock_div.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_attenuator.vhd +set_global_assignment -name VHDL_FILE rtl/sound/ladybug_sound_unit.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_sprite_u.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_sprite_l.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_cpu3.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_cpu2.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_cpu1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_char_u.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_char_l.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_decrypt.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_10_3.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_10_2.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_10_1.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80a.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ttl_393.vhd +set_global_assignment -name VHDL_FILE rtl/ttl_175.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_video_unit.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_video_timing.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_sprite_ctrl.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_sprite.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_rgb.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_res.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_rams.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_machine.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_gpio.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_dip_pack.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_cpu_unit.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_counter.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_clk.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_chutes.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_chute.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_char.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_addr_dec.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/LadyBug.sv +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE_FILTER_PACKAGE UFBGA +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 672 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 7 +set_global_assignment -name SAVE_DISK_SPACE OFF +set_global_assignment -name TOP_LEVEL_ENTITY LadyBug + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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 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 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_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(LadyBug) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(LadyBug) +# ------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/LadyBug.srf b/Arcade/Ladybug Hardware/LadyBug_MiST/LadyBug.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/LadyBug.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/README.txt b/Arcade/Ladybug Hardware/LadyBug_MiST/README.txt new file mode 100644 index 00000000..59c4a482 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Lady Bug port to MiST by Gehstock +-- 14 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Lady Bug hardware +-- Unknown Author on Papilio Plus board. +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + + +ToDo : Sound diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/Release/LadyBug.rbf b/Arcade/Ladybug Hardware/LadyBug_MiST/Release/LadyBug.rbf new file mode 100644 index 00000000..c3a0193c Binary files /dev/null and b/Arcade/Ladybug Hardware/LadyBug_MiST/Release/LadyBug.rbf differ diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/clean.bat b/Arcade/Ladybug Hardware/LadyBug_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_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/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/LadyBug.sv b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/LadyBug.sv new file mode 100644 index 00000000..88349241 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/LadyBug.sv @@ -0,0 +1,194 @@ +//============================================================================ +// Arcade: Lady Bug +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module LadyBug +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Ladybug;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire signed[7:0] audio_s; +reg [6:0] audio; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(292), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_vid), + .ce_pix_actual(ce_vid), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn ? {r} : "0"), + .G(blankn ? {g&g} : "00"), + .B(blankn ? {b} : "0"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +wire m_bomb = kbjoy[8]; +wire blankn = ~(hblank | vblank); + + + +//condition ? if true : if false +ladybugt ladybugt +( + .CLK_IN(clk_sys), + .I_RESET(status[0] | status[6] | buttons[1]), + .O_PIXCE(ce_vid), + + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_VSYNC(vs), + .O_HSYNC(hs), + .O_VBLANK(vblank), + .O_HBLANK(hblank), + + .O_AUDIO(audio_s), + + .but_coin_s(~{1'b0,m_coin}), + .but_fire_s(~{1'b0,m_fire}), + .but_bomb_s(~{1'b0,m_bomb}), + .but_tilt_s(~{1'b0,1'b0}), + .but_select_s(~{m_start2,m_start1}), + .but_up_s(~{1'b0,m_up}), + .but_down_s(~{1'b0,m_down}), + .but_left_s(~{1'b0,m_left}), + .but_right_s(~{1'b0,m_right}) +); + +assign audio = audio_s; + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/prom_10_1.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/prom_10_1.vhd new file mode 100644 index 00000000..e1045eae --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/prom_10_1.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_10_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_10_1 is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"59",X"33",X"B8",X"00",X"D4",X"A3",X"8D",X"00",X"2C",X"63",X"DD",X"00",X"22",X"38",X"1D", + X"00",X"93",X"3A",X"DD",X"00",X"E2",X"38",X"DD",X"00",X"82",X"3A",X"D8",X"00",X"22",X"68",X"1D"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/prom_10_2.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/prom_10_2.vhd new file mode 100644 index 00000000..3027d172 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/prom_10_2.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_10_2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_10_2 is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F5",X"90",X"41",X"54",X"94",X"11",X"80",X"65",X"05",X"D4",X"01",X"00",X"B1",X"A0",X"00",X"F5", + X"04",X"B1",X"00",X"15",X"11",X"25",X"90",X"D0",X"A0",X"90",X"15",X"84",X"B5",X"04",X"04",X"04"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/prom_10_3.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/prom_10_3.vhd new file mode 100644 index 00000000..a731ff5c --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/prom_10_3.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_10_3 is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_10_3 is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"3A",X"3A",X"3A",X"3A",X"28",X"28",X"38",X"38", + X"08",X"08",X"38",X"38",X"20",X"20",X"38",X"38",X"20",X"20",X"38",X"38",X"3E",X"3E",X"3E",X"3E"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/prom_decrypt.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/prom_decrypt.vhd new file mode 100644 index 00000000..00f98d21 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/prom_decrypt.vhd @@ -0,0 +1,63 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity prom_decrypt is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(7 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of prom_decrypt is + + + type ROM_ARRAY is array(0 to 255) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"01",x"02",x"03",x"04",x"05",x"06",x"07", -- 0x0000 + x"08",x"09",x"0A",x"0B",x"0C",x"0D",x"0E",x"0F", -- 0x0008 + x"10",x"11",x"12",x"13",x"14",x"15",x"16",x"17", -- 0x0010 + x"18",x"19",x"1A",x"1B",x"1C",x"1D",x"1E",x"1F", -- 0x0018 + x"20",x"21",x"22",x"23",x"24",x"25",x"26",x"27", -- 0x0020 + x"28",x"29",x"2A",x"2B",x"2C",x"2D",x"2E",x"2F", -- 0x0028 + x"30",x"31",x"32",x"33",x"34",x"35",x"36",x"37", -- 0x0030 + x"38",x"39",x"3A",x"3B",x"3C",x"3D",x"3E",x"3F", -- 0x0038 + x"40",x"41",x"42",x"43",x"44",x"45",x"46",x"47", -- 0x0040 + x"48",x"49",x"4A",x"4B",x"4C",x"4D",x"4E",x"4F", -- 0x0048 + x"50",x"51",x"52",x"53",x"54",x"55",x"56",x"57", -- 0x0050 + x"58",x"59",x"5A",x"5B",x"5C",x"5D",x"5E",x"5F", -- 0x0058 + x"60",x"61",x"62",x"63",x"64",x"65",x"66",x"67", -- 0x0060 + x"68",x"69",x"6A",x"6B",x"6C",x"6D",x"6E",x"6F", -- 0x0068 + x"70",x"71",x"72",x"73",x"74",x"75",x"76",x"77", -- 0x0070 + x"78",x"79",x"7A",x"7B",x"7C",x"7D",x"7E",x"7F", -- 0x0078 + x"80",x"81",x"82",x"83",x"84",x"85",x"86",x"87", -- 0x0080 + x"88",x"89",x"8A",x"8B",x"8C",x"8D",x"8E",x"8F", -- 0x0088 + x"90",x"91",x"92",x"93",x"94",x"95",x"96",x"97", -- 0x0090 + x"98",x"99",x"9A",x"9B",x"9C",x"9D",x"9E",x"9F", -- 0x0098 + x"A0",x"A1",x"A2",x"A3",x"A4",x"A5",x"A6",x"A7", -- 0x00A0 + x"A8",x"A9",x"AA",x"AB",x"AC",x"AD",x"AE",x"AF", -- 0x00A8 + x"B0",x"B1",x"B2",x"B3",x"B4",x"B5",x"B6",x"B7", -- 0x00B0 + x"B8",x"B9",x"BA",x"BB",x"BC",x"BD",x"BE",x"BF", -- 0x00B8 + x"C0",x"C1",x"C2",x"C3",x"C4",x"C5",x"C6",x"C7", -- 0x00C0 + x"C8",x"C9",x"CA",x"CB",x"CC",x"CD",x"CE",x"CF", -- 0x00C8 + x"D0",x"D1",x"D2",x"D3",x"D4",x"D5",x"D6",x"D7", -- 0x00D0 + x"D8",x"D9",x"DA",x"DB",x"DC",x"DD",x"DE",x"DF", -- 0x00D8 + x"E0",x"E1",x"E2",x"E3",x"E4",x"E5",x"E6",x"E7", -- 0x00E0 + x"E8",x"E9",x"EA",x"EB",x"EC",x"ED",x"EE",x"EF", -- 0x00E8 + x"F0",x"F1",x"F2",x"F3",x"F4",x"F5",x"F6",x"F7", -- 0x00F0 + x"F8",x"F9",x"FA",x"FB",x"FC",x"FD",x"FE",x"FF" -- 0x00F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_char_l.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_char_l.vhd new file mode 100644 index 00000000..8d1f1092 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_char_l.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_char_l is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_char_l is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"3C",X"66",X"42",X"42",X"42",X"66",X"3C",X"00",X"00",X"00",X"22",X"7E",X"02",X"00",X"00", + X"00",X"26",X"6E",X"4A",X"4A",X"4A",X"7A",X"32",X"00",X"44",X"46",X"52",X"52",X"52",X"7E",X"6C", + X"00",X"0C",X"1C",X"34",X"64",X"44",X"7E",X"04",X"00",X"74",X"56",X"52",X"52",X"52",X"5E",X"0C", + X"00",X"3C",X"76",X"52",X"52",X"52",X"5E",X"0C",X"00",X"40",X"42",X"46",X"4C",X"58",X"70",X"60", + X"00",X"2C",X"7E",X"52",X"52",X"52",X"7E",X"2C",X"00",X"30",X"7A",X"4A",X"4A",X"4A",X"6E",X"3C", + X"00",X"1E",X"34",X"64",X"44",X"64",X"34",X"1E",X"00",X"7E",X"52",X"52",X"52",X"52",X"7E",X"2C", + X"00",X"3C",X"66",X"42",X"42",X"42",X"66",X"24",X"00",X"7E",X"42",X"42",X"42",X"42",X"66",X"3C", + X"00",X"7E",X"52",X"52",X"52",X"52",X"42",X"42",X"00",X"7E",X"50",X"50",X"50",X"50",X"40",X"40", + X"00",X"3C",X"66",X"42",X"42",X"4A",X"6A",X"2E",X"00",X"7E",X"10",X"10",X"10",X"10",X"10",X"7E", + X"00",X"00",X"00",X"42",X"7E",X"42",X"00",X"00",X"00",X"0C",X"06",X"02",X"02",X"02",X"06",X"7C", + X"00",X"7E",X"06",X"0C",X"18",X"34",X"66",X"42",X"00",X"7E",X"02",X"02",X"02",X"02",X"02",X"02", + X"00",X"7E",X"30",X"18",X"0C",X"18",X"30",X"7E",X"00",X"7E",X"60",X"30",X"18",X"0C",X"06",X"7E", + X"00",X"3C",X"66",X"42",X"42",X"42",X"66",X"3C",X"00",X"7E",X"48",X"48",X"48",X"48",X"78",X"30", + X"00",X"3C",X"66",X"42",X"4A",X"4C",X"66",X"3A",X"00",X"7E",X"48",X"48",X"48",X"4E",X"7A",X"32", + X"00",X"24",X"76",X"52",X"5A",X"4A",X"6E",X"24",X"00",X"40",X"40",X"40",X"7E",X"40",X"40",X"40", + X"00",X"7C",X"06",X"02",X"02",X"02",X"06",X"7C",X"00",X"70",X"1C",X"06",X"02",X"06",X"1C",X"70", + X"00",X"7C",X"06",X"0C",X"18",X"0C",X"06",X"7C",X"00",X"42",X"66",X"2C",X"18",X"34",X"66",X"42", + X"00",X"60",X"30",X"18",X"0E",X"18",X"30",X"60",X"00",X"42",X"46",X"4E",X"5A",X"72",X"62",X"42", + X"00",X"6C",X"7E",X"52",X"42",X"16",X"1C",X"10",X"00",X"24",X"7E",X"24",X"24",X"24",X"7E",X"24", + X"00",X"2E",X"6A",X"4E",X"42",X"42",X"66",X"3C",X"00",X"20",X"60",X"40",X"5A",X"50",X"70",X"20", + X"00",X"00",X"00",X"00",X"7A",X"60",X"00",X"00",X"00",X"30",X"78",X"7C",X"3E",X"7C",X"78",X"30", + X"00",X"24",X"24",X"24",X"24",X"24",X"24",X"24",X"00",X"00",X"18",X"3C",X"66",X"42",X"00",X"00", + X"00",X"00",X"42",X"66",X"3C",X"18",X"00",X"00",X"00",X"00",X"06",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"60",X"70",X"00",X"00",X"00",X"00",X"00",X"7C",X"82",X"BA",X"AA",X"AA",X"82",X"7C", + X"FF",X"FF",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00", + X"00",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00", + X"FF",X"FF",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"DF",X"DF",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"DF",X"DF",X"00",X"00",X"00",X"00",X"00",X"00", + X"DF",X"DF",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"FE",X"FE",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"70",X"38",X"1C",X"0E",X"07",X"03", + X"00",X"00",X"30",X"38",X"1C",X"0E",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"0E",X"1C",X"38",X"70", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0E",X"1C",X"38",X"30", + X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F", + X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"22",X"14",X"08",X"14",X"22",X"00",X"7E",X"52",X"52",X"52",X"00",X"7E",X"30", + X"18",X"0C",X"7E",X"00",X"7E",X"42",X"66",X"3C",X"58",X"58",X"10",X"F0",X"C0",X"00",X"00",X"00", + X"78",X"78",X"70",X"F0",X"C0",X"00",X"00",X"00",X"58",X"58",X"D0",X"F0",X"C0",X"00",X"00",X"00", + X"D8",X"D8",X"D0",X"F0",X"C0",X"00",X"00",X"00",X"18",X"D8",X"F0",X"F0",X"C0",X"00",X"00",X"00", + X"B8",X"B8",X"10",X"F0",X"C0",X"00",X"00",X"00",X"78",X"38",X"90",X"F0",X"C0",X"00",X"00",X"00", + X"18",X"F8",X"F0",X"F0",X"C0",X"00",X"00",X"00",X"78",X"18",X"50",X"F0",X"C0",X"00",X"00",X"00", + X"F8",X"F8",X"F0",X"F0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CD",X"CD",X"C5",X"C7",X"C1",X"C0",X"C0",X"C0",X"0D",X"0D",X"05",X"07",X"01",X"00",X"00",X"00", + X"CD",X"CD",X"C4",X"C7",X"C1",X"C0",X"C0",X"C0",X"0D",X"0D",X"04",X"07",X"01",X"00",X"00",X"00", + X"CC",X"CD",X"C7",X"C7",X"C1",X"C0",X"C0",X"C0",X"0C",X"0D",X"07",X"07",X"01",X"00",X"00",X"00", + X"CF",X"CF",X"C7",X"C7",X"C1",X"C0",X"C0",X"C0",X"0F",X"0F",X"07",X"07",X"01",X"00",X"00",X"00", + X"CF",X"CE",X"C4",X"C7",X"C1",X"C0",X"C0",X"C0",X"0F",X"0E",X"04",X"07",X"01",X"00",X"00",X"00", + X"CC",X"CD",X"C5",X"C7",X"C1",X"C0",X"C0",X"C0",X"0C",X"0D",X"05",X"07",X"01",X"00",X"00",X"00", + X"CF",X"CF",X"C7",X"C7",X"C1",X"C0",X"C0",X"C0",X"0F",X"0F",X"07",X"07",X"01",X"00",X"00",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"C0",X"C0",X"C1",X"C7",X"C4",X"CD",X"C0",X"C0",X"C0",X"C0",X"C1",X"C7",X"C4",X"CD", + X"FF",X"FF",X"00",X"00",X"01",X"07",X"04",X"0D",X"C0",X"C0",X"00",X"00",X"01",X"07",X"04",X"0D", + X"FF",X"FF",X"C0",X"C0",X"C1",X"C7",X"C7",X"CD",X"C0",X"C0",X"C0",X"C0",X"C1",X"C7",X"C7",X"CD", + X"FF",X"FF",X"00",X"00",X"01",X"07",X"07",X"0D",X"C0",X"C0",X"00",X"00",X"01",X"07",X"07",X"0D", + X"FF",X"FF",X"C0",X"C0",X"C1",X"C7",X"C4",X"CF",X"C0",X"C0",X"C0",X"C0",X"C1",X"C7",X"C4",X"CF", + X"FF",X"FF",X"00",X"00",X"01",X"07",X"04",X"0F",X"C0",X"C0",X"00",X"00",X"01",X"07",X"04",X"0F", + X"FF",X"FF",X"C0",X"C0",X"C1",X"C7",X"C4",X"CE",X"C0",X"C0",X"C0",X"C0",X"C1",X"C7",X"C4",X"CE", + X"FF",X"FF",X"00",X"00",X"01",X"07",X"04",X"0E",X"C0",X"C0",X"00",X"00",X"01",X"07",X"04",X"0E", + X"FF",X"FF",X"C0",X"C0",X"C1",X"C7",X"C5",X"CD",X"C0",X"C0",X"C0",X"C0",X"C1",X"C7",X"C5",X"CD", + X"FF",X"FF",X"00",X"00",X"01",X"07",X"05",X"0D",X"C0",X"C0",X"00",X"00",X"01",X"07",X"05",X"0D", + X"FF",X"FF",X"C0",X"C0",X"C1",X"C7",X"C7",X"CF",X"C0",X"C0",X"C0",X"C0",X"C1",X"C7",X"C7",X"CF", + X"FF",X"FF",X"00",X"00",X"01",X"07",X"07",X"0F",X"C0",X"C0",X"00",X"00",X"01",X"07",X"07",X"0F", + X"FF",X"FF",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"C0",X"F0",X"50",X"58",X"00",X"00",X"00",X"00",X"C0",X"F0",X"50",X"58", + X"FF",X"FF",X"00",X"00",X"C0",X"F0",X"10",X"78",X"00",X"00",X"00",X"00",X"C0",X"F0",X"10",X"78", + X"FF",X"FF",X"00",X"00",X"C0",X"F0",X"10",X"58",X"00",X"00",X"00",X"00",X"C0",X"F0",X"10",X"58", + X"FF",X"FF",X"00",X"00",X"C0",X"F0",X"10",X"D8",X"00",X"00",X"00",X"00",X"C0",X"F0",X"10",X"D8", + X"FF",X"FF",X"00",X"00",X"C0",X"F0",X"F0",X"D8",X"00",X"00",X"00",X"00",X"C0",X"F0",X"F0",X"D8", + X"FF",X"FF",X"00",X"00",X"C0",X"F0",X"10",X"B8",X"00",X"00",X"00",X"00",X"C0",X"F0",X"10",X"B8", + X"FF",X"FF",X"00",X"00",X"C0",X"F0",X"90",X"38",X"00",X"00",X"00",X"00",X"C0",X"F0",X"90",X"38", + X"FF",X"FF",X"00",X"00",X"C0",X"F0",X"F0",X"F8",X"00",X"00",X"00",X"00",X"C0",X"F0",X"F0",X"F8", + X"FF",X"FF",X"00",X"00",X"C0",X"F0",X"F0",X"F8",X"00",X"00",X"00",X"00",X"C0",X"F0",X"F0",X"F8", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"40",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"20",X"00",X"00",X"20",X"40",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"18",X"20",X"00",X"00",X"00",X"08",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"05",X"02",X"05",X"00",X"13",X"25",X"19",X"00",X"05",X"02",X"05",X"00",X"22",X"29",X"36",X"00", + X"05",X"02",X"05",X"00",X"0E",X"12",X"3F",X"02",X"05",X"02",X"05",X"00",X"3A",X"29",X"26",X"00", + X"05",X"02",X"05",X"00",X"1E",X"29",X"26",X"00",X"05",X"02",X"05",X"00",X"23",X"2C",X"30",X"00", + X"05",X"02",X"05",X"00",X"16",X"29",X"16",X"00",X"00",X"00",X"00",X"40",X"00",X"90",X"C0",X"D8", + X"98",X"00",X"00",X"00",X"E0",X"80",X"40",X"00",X"00",X"00",X"00",X"02",X"00",X"09",X"03",X"1B", + X"19",X"00",X"00",X"00",X"07",X"01",X"02",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FE",X"FC",X"FC",X"F8",X"F0",X"C0",X"00",X"FF",X"FF",X"7F",X"7F",X"3F",X"1F",X"07",X"00", + X"07",X"1F",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"C0",X"F0",X"F8",X"FC",X"FC",X"FE",X"FE",X"FE", + X"FE",X"FE",X"FC",X"FC",X"F8",X"F0",X"C0",X"00",X"FF",X"FF",X"7F",X"7F",X"3F",X"1F",X"07",X"00", + X"07",X"1F",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"C0",X"F0",X"F8",X"FC",X"FC",X"FE",X"FE",X"FE", + X"C0",X"F0",X"F8",X"FC",X"FC",X"FE",X"FE",X"FE",X"00",X"00",X"00",X"00",X"01",X"07",X"07",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"04",X"0D", + X"00",X"00",X"00",X"00",X"01",X"07",X"07",X"0D",X"00",X"00",X"00",X"00",X"01",X"07",X"04",X"0F", + X"00",X"00",X"00",X"00",X"01",X"07",X"04",X"0E",X"00",X"00",X"00",X"00",X"01",X"07",X"05",X"0D", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"00",X"00",X"00",X"00",X"30",X"30",X"3F",X"7F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"78",X"FC", + X"FE",X"00",X"FE",X"FE",X"FE",X"00",X"00",X"00",X"FF",X"F0",X"FF",X"7F",X"3F",X"00",X"C8",X"18", + X"80",X"E1",X"80",X"00",X"00",X"00",X"00",X"00",X"FE",X"FF",X"FE",X"FC",X"78",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"EF",X"FF",X"DF",X"AF",X"1F",X"AF", + X"30",X"E1",X"C7",X"81",X"C0",X"E0",X"E0",X"C3",X"00",X"00",X"03",X"0F",X"3F",X"7F",X"7F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DF",X"FF",X"EF",X"C3",X"00",X"00",X"00",X"00", + X"80",X"C1",X"FF",X"3F",X"0F",X"00",X"00",X"00",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"13",X"3F",X"7F",X"CF",X"DF",X"7F",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0", + X"00",X"00",X"00",X"1E",X"3F",X"7F",X"FF",X"FF",X"00",X"00",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"F1",X"FB",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"E3",X"F7",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"03",X"0F",X"3F",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"3F",X"3F",X"7F",X"7F",X"7F",X"FF",X"FF",X"C0",X"E0",X"E0",X"F0",X"F0",X"E0",X"C7",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CF", + X"7F",X"7F",X"3F",X"3F",X"1F",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"0F",X"07",X"03",X"1F",X"3F",X"3F",X"5F",X"FC",X"C0",X"80",X"80",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7C",X"00",X"00",X"FF",X"FF",X"FF",X"FB",X"71",X"00",X"00",X"84", + X"FF",X"FE",X"7C",X"00",X"00",X"02",X"3E",X"FF",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"7F",X"FF",X"7F",X"7F",X"7F",X"7F",X"3F",X"00",X"00",X"C0",X"C0",X"E0",X"F0",X"F0",X"F0", + X"00",X"00",X"C1",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"BF",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"37",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FC",X"10",X"01",X"03",X"07",X"0F",X"1F",X"FF",X"FF",X"E0",X"C0",X"80",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"EF",X"C7",X"02",X"10",X"F8",X"FF",X"F7",X"E3",X"01",X"10",X"FC",X"FE",X"FF", + X"3F",X"07",X"03",X"00",X"02",X"0F",X"5F",X"FF",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"1F",X"0F",X"FF",X"07",X"03",X"00",X"00",X"C0",X"E0",X"E0",X"FF",X"E0",X"C0",X"00", + X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"67",X"03", + X"FF",X"FF",X"FF",X"FF",X"1F",X"0E",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CF",X"9E",X"3C",X"7C",X"F8",X"F8",X"F8",X"F0",X"DF",X"EF",X"DF",X"EE",X"DC",X"F9",X"F3",X"E7", + X"FF",X"3C",X"FF",X"3F",X"FF",X"3C",X"FF",X"3F",X"FE",X"62",X"6E",X"0E",X"6E",X"02",X"BE",X"7E", + X"7F",X"D0",X"17",X"C7",X"D7",X"00",X"FF",X"FF",X"00",X"FF",X"38",X"83",X"BB",X"80",X"AF",X"9F", + X"00",X"07",X"18",X"7B",X"FF",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"30",X"B0",X"CF",X"9F",X"3F",X"7F",X"F1",X"FD",X"8C",X"FF", + X"FF",X"3F",X"FF",X"3E",X"FC",X"39",X"F3",X"E7",X"BE",X"FE",X"FE",X"7E",X"3E",X"1E",X"5E",X"FE", + X"FF",X"FF",X"80",X"0F",X"7F",X"FF",X"FF",X"FF",X"AF",X"9F",X"AF",X"9F",X"AE",X"9C",X"AD",X"9F", + X"03",X"00",X"01",X"03",X"06",X"0D",X"1B",X"F7",X"00",X"00",X"00",X"00",X"0C",X"0C",X"0C",X"FF", + X"B0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"FF",X"FF",X"7F",X"3F",X"9F",X"CF", + X"E7",X"F3",X"39",X"FC",X"3E",X"FF",X"3F",X"FF",X"FE",X"5E",X"1E",X"3E",X"7E",X"FE",X"FE",X"BE", + X"FF",X"FF",X"FF",X"7F",X"0F",X"80",X"FF",X"FF",X"AF",X"9D",X"AC",X"9E",X"AF",X"9F",X"AF",X"9F", + X"F7",X"1B",X"0D",X"06",X"03",X"01",X"00",X"03",X"FF",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00", + X"F0",X"F8",X"F8",X"F8",X"7C",X"3C",X"9E",X"CF",X"E7",X"F3",X"F9",X"DC",X"EE",X"DF",X"EF",X"DF", + X"3F",X"FF",X"3C",X"FF",X"3F",X"FF",X"3C",X"FF",X"7E",X"BE",X"06",X"6E",X"0E",X"6E",X"66",X"FE", + X"FF",X"FF",X"00",X"D7",X"C7",X"17",X"D0",X"7F",X"AF",X"9F",X"80",X"BB",X"83",X"38",X"FF",X"00", + X"00",X"03",X"00",X"FF",X"7B",X"18",X"07",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00", + X"FF",X"F9",X"FA",X"39",X"3A",X"39",X"FA",X"F9",X"FF",X"FF",X"7F",X"FE",X"72",X"E2",X"7F",X"FF", + X"FF",X"DA",X"B6",X"DA",X"B6",X"DA",X"B6",X"DA",X"FF",X"FF",X"FF",X"01",X"01",X"01",X"FF",X"FF", + X"FF",X"4F",X"D7",X"4F",X"D6",X"4F",X"D7",X"4F",X"FF",X"FD",X"FE",X"05",X"06",X"05",X"06",X"FD", + X"FF",X"7F",X"BF",X"78",X"B0",X"70",X"B8",X"7F",X"07",X"1F",X"07",X"01",X"01",X"07",X"1F",X"FF", + X"3A",X"39",X"3A",X"F9",X"FA",X"FF",X"00",X"00",X"62",X"F2",X"7E",X"FF",X"7F",X"FF",X"00",X"00", + X"B6",X"DA",X"B6",X"DA",X"B6",X"FF",X"00",X"00",X"FF",X"01",X"01",X"01",X"FF",X"FF",X"FE",X"E0", + X"D7",X"4F",X"D6",X"4F",X"DB",X"7B",X"F3",X"E7",X"FE",X"FD",X"06",X"05",X"06",X"05",X"FE",X"FD", + X"BF",X"7F",X"B8",X"70",X"B0",X"78",X"BF",X"FF",X"1F",X"07",X"01",X"01",X"07",X"1F",X"07",X"01", + X"00",X"00",X"FF",X"FA",X"F9",X"3A",X"39",X"3A",X"00",X"00",X"FF",X"7F",X"FF",X"7E",X"F2",X"62", + X"00",X"00",X"FF",X"B6",X"DA",X"B6",X"DA",X"B6",X"E0",X"FE",X"FF",X"FF",X"01",X"01",X"01",X"FF", + X"E7",X"F3",X"7B",X"DB",X"4F",X"D6",X"4F",X"D7",X"FD",X"FE",X"05",X"06",X"05",X"06",X"FD",X"FE", + X"FF",X"BF",X"78",X"B0",X"70",X"B8",X"7F",X"BF",X"01",X"07",X"1F",X"07",X"01",X"01",X"07",X"1F", + X"F9",X"FA",X"39",X"3A",X"39",X"FA",X"F9",X"FF",X"FF",X"7F",X"E2",X"72",X"FE",X"7F",X"FF",X"FF", + X"DA",X"B6",X"DA",X"B6",X"DA",X"B6",X"DA",X"FF",X"FF",X"FF",X"01",X"01",X"01",X"FF",X"FF",X"FF", + X"4F",X"D7",X"4F",X"D6",X"4F",X"D7",X"4F",X"FF",X"FD",X"06",X"05",X"06",X"05",X"FE",X"FD",X"FF", + X"7F",X"B8",X"70",X"B0",X"78",X"BF",X"7F",X"FF",X"FF",X"1F",X"07",X"01",X"01",X"07",X"1F",X"07", + X"03",X"03",X"0F",X"0F",X"3F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"14",X"41",X"11",X"14",X"41",X"11",X"14",X"41",X"11",X"14",X"41",X"11",X"14",X"41",X"10", + X"17",X"43",X"1F",X"0F",X"7F",X"3F",X"FF",X"FF",X"FF",X"FF",X"3F",X"7F",X"0F",X"1F",X"43",X"17", + X"10",X"41",X"14",X"11",X"41",X"14",X"11",X"41",X"14",X"11",X"41",X"14",X"11",X"41",X"14",X"01", + X"FF",X"FF",X"3F",X"3F",X"0F",X"0F",X"03",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"03",X"07",X"FF",X"0F",X"1F",X"1F",X"1F",X"00",X"C0",X"E0",X"FF",X"E0",X"E0",X"C0",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"03",X"67",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"0E",X"1F",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"0F",X"07",X"03",X"01",X"10",X"FC",X"FE",X"00",X"00",X"00",X"80",X"C0",X"E0",X"FF",X"FF", + X"F8",X"10",X"02",X"C7",X"EF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"10",X"01",X"E3",X"F7",X"FF", + X"FF",X"5F",X"0F",X"02",X"00",X"03",X"07",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"7F",X"7F",X"7F",X"7F",X"FF",X"7F",X"7F",X"F0",X"F0",X"F0",X"E0",X"C0",X"C0",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"C1",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE", + X"BF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"07",X"37",X"FF",X"FF",X"FF",X"7F",X"3F",X"1F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"5F",X"3F",X"3F",X"1F",X"03",X"07",X"0F",X"1F",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"FC", + X"00",X"00",X"7C",X"FF",X"FF",X"FF",X"FF",X"FF",X"84",X"00",X"00",X"71",X"FB",X"FF",X"FF",X"FF", + X"FF",X"3E",X"02",X"00",X"00",X"7C",X"FE",X"FF",X"0B",X"00",X"00",X"00",X"00",X"00",X"03",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"FF",X"C7",X"E0",X"F0",X"F0",X"E0",X"E0",X"C0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"03",X"07",X"1F",X"3F",X"3F",X"7F",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"DF",X"CF",X"7F",X"3F",X"13",X"01",X"00",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"7F",X"3F",X"1E",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FE",X"FC",X"F8",X"00",X"00", + X"FF",X"FF",X"FF",X"FB",X"F1",X"00",X"00",X"00",X"FF",X"FF",X"F7",X"E3",X"00",X"00",X"00",X"00", + X"7F",X"3F",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"19",X"19",X"03",X"03",X"19",X"19",X"03",X"00",X"03",X"53",X"D8",X"03",X"D8",X"53",X"03", + X"F8",X"48",X"EE",X"5F",X"89",X"FE",X"18",X"E8",X"FF",X"92",X"93",X"96",X"99",X"FF",X"33",X"D2", + X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"01",X"48",X"48",X"48",X"F8",X"58",X"58",X"58",X"48", + X"92",X"92",X"92",X"BF",X"F2",X"F2",X"D2",X"92",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"68",X"68",X"F8",X"48",X"48",X"48",X"48",X"48",X"B2",X"92",X"9F",X"9A",X"BA",X"B2",X"92",X"92", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"58",X"58",X"58",X"48",X"68",X"68",X"F8", + X"BF",X"F2",X"F2",X"D2",X"92",X"B2",X"92",X"9F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"48",X"48",X"48",X"48",X"FC",X"54",X"56",X"4A",X"9A",X"BA",X"B2",X"92",X"97",X"9E",X"9E",X"9A", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"4A",X"FE",X"4A",X"4B",X"4D",X"4D",X"FF",X"48", + X"92",X"97",X"9E",X"9E",X"9A",X"92",X"93",X"93",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"48",X"48",X"48",X"C8",X"C8",X"C8",X"48",X"48",X"97",X"96",X"92",X"92",X"93",X"93",X"FF",X"92", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"48",X"48",X"48",X"48",X"48",X"F8",X"48",X"F8", + X"92",X"92",X"92",X"92",X"92",X"FF",X"92",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"48",X"78",X"98",X"F8",X"48",X"48",X"C8",X"C8",X"92",X"DE",X"96",X"F7",X"92",X"92",X"92",X"93", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C8",X"48",X"48",X"48",X"C8",X"C8",X"C8",X"48", + X"93",X"FF",X"92",X"92",X"92",X"93",X"93",X"FF",X"00",X"03",X"02",X"02",X"02",X"02",X"02",X"03", + X"48",X"FC",X"54",X"54",X"4C",X"48",X"F8",X"48",X"92",X"97",X"9E",X"9E",X"9A",X"92",X"BF",X"F2", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"58",X"58",X"58",X"F8",X"48",X"48",X"48",X"48", + X"F2",X"D2",X"92",X"9F",X"9A",X"BA",X"B2",X"92",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"F8",X"48",X"F8",X"48",X"C8",X"C8",X"C8",X"48",X"FF",X"92",X"FF",X"92",X"9F",X"90",X"9C",X"9D", + X"02",X"02",X"04",X"04",X"04",X"04",X"04",X"04",X"48",X"48",X"48",X"48",X"48",X"48",X"48",X"48", + X"92",X"92",X"92",X"AA",X"AA",X"AA",X"92",X"92",X"02",X"02",X"01",X"00",X"00",X"00",X"00",X"00", + X"48",X"48",X"48",X"48",X"48",X"48",X"48",X"48",X"92",X"92",X"92",X"92",X"92",X"92",X"92",X"92", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"48",X"48",X"48",X"48",X"F8",X"48",X"F8",X"F8", + X"92",X"92",X"92",X"92",X"FF",X"92",X"FF",X"FF",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_char_u.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_char_u.vhd new file mode 100644 index 00000000..e21d3747 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_char_u.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_char_u is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_char_u is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"E0",X"E0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00", + X"00",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"1F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"C0",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"E0",X"70",X"38",X"1C",X"0E",X"07",X"03", + X"E0",X"E0",X"F0",X"38",X"1C",X"0E",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"07",X"0E",X"1C",X"38",X"70", + X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0E",X"1C",X"38",X"F0", + X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1F",X"1F",X"1F",X"1F",X"1E",X"00",X"1E",X"1E",X"1F",X"1F",X"1F",X"1F",X"00", + X"C0",X"DE",X"1E",X"7E",X"7E",X"7E",X"7E",X"00",X"00",X"00",X"00",X"7E",X"7E",X"7E",X"7E",X"1E", + X"00",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"FF",X"FF",X"00",X"7F",X"7F",X"7F",X"7F",X"00", + X"C0",X"DE",X"DE",X"DE",X"DE",X"DE",X"DE",X"DE",X"00",X"00",X"00",X"7F",X"7F",X"7F",X"7F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"F0",X"58",X"70",X"F8",X"E0",X"00",X"00",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C1",X"C3",X"C1",X"C0",X"C0",X"C0",X"C0",X"C0",X"01",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"CF",X"CE",X"C6",X"C7",X"C1",X"C0",X"C0",X"C0",X"0F",X"0E",X"06",X"07",X"01",X"00",X"00",X"00", + X"FF",X"FF",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"C0",X"C0",X"C0",X"C0",X"C1",X"C3",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C1",X"C3", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"03",X"C0",X"C0",X"00",X"00",X"00",X"00",X"01",X"03", + X"FF",X"FF",X"C0",X"C0",X"C1",X"C7",X"C6",X"CE",X"C0",X"C0",X"C0",X"C0",X"C1",X"C7",X"C6",X"CE", + X"FF",X"FF",X"00",X"00",X"01",X"07",X"06",X"0E",X"C0",X"C0",X"00",X"00",X"01",X"07",X"06",X"0E", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"80",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0", + X"FF",X"FF",X"00",X"00",X"E0",X"F8",X"70",X"58",X"00",X"00",X"00",X"00",X"E0",X"F8",X"70",X"58", + X"7E",X"FC",X"FE",X"FF",X"FF",X"0F",X"0F",X"0F",X"1F",X"1F",X"3E",X"7E",X"FC",X"FC",X"F8",X"FC", + X"3E",X"1F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F", + X"3F",X"3E",X"7C",X"78",X"F8",X"F0",X"F0",X"F0",X"F0",X"F3",X"FF",X"FF",X"FF",X"FE",X"70",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0F",X"7F",X"FF",X"FF",X"78",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"3F",X"FF",X"FF",X"FC",X"E0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"01",X"03",X"0F",X"FF",X"FF",X"FF",X"7F",X"FF",X"FF",X"F8",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F8",X"7C",X"7F",X"3F",X"1F",X"07",X"F0",X"F3",X"FF",X"FF",X"FF",X"FE",X"F0",X"80", + X"00",X"00",X"00",X"00",X"03",X"1F",X"7F",X"FF",X"FE",X"70",X"00",X"00",X"00",X"00",X"00",X"00", + X"78",X"FC",X"FE",X"FE",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"1F",X"7F",X"FE",X"FC",X"F0",X"C0",X"60",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"E0",X"C0",X"C0",X"80",X"00", + X"00",X"03",X"1F",X"FF",X"FF",X"FE",X"F0",X"80",X"00",X"03",X"1F",X"7F",X"FF",X"FE",X"70",X"00", + X"80",X"E3",X"FF",X"FF",X"FF",X"3E",X"00",X"00",X"7F",X"FF",X"FF",X"F8",X"C0",X"00",X"00",X"00", + X"77",X"CF",X"FF",X"78",X"00",X"00",X"00",X"00",X"3F",X"3E",X"7C",X"58",X"B8",X"B0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"03",X"1F",X"67",X"DF",X"60",X"F0",X"D0",X"B0",X"B0",X"F0",X"F0",X"F0", + X"00",X"03",X"1F",X"67",X"DF",X"FE",X"70",X"00",X"77",X"CF",X"FF",X"F8",X"F0",X"F0",X"F0",X"F0", + X"22",X"7E",X"02",X"00",X"3C",X"42",X"3C",X"00",X"22",X"7E",X"02",X"00",X"74",X"52",X"4C",X"00", + X"26",X"4A",X"32",X"00",X"3C",X"42",X"3C",X"00",X"26",X"4A",X"32",X"00",X"74",X"52",X"4C",X"00", + X"44",X"52",X"6C",X"00",X"3C",X"42",X"3C",X"00",X"44",X"52",X"6C",X"00",X"74",X"52",X"4C",X"00", + X"1C",X"24",X"7E",X"00",X"3C",X"42",X"3C",X"00",X"1C",X"24",X"7E",X"00",X"74",X"52",X"4C",X"00", + X"74",X"52",X"4C",X"00",X"3C",X"42",X"3C",X"00",X"74",X"52",X"4C",X"00",X"74",X"52",X"4C",X"00", + X"3C",X"52",X"4C",X"00",X"3C",X"42",X"3C",X"00",X"3C",X"52",X"4C",X"00",X"74",X"52",X"4C",X"00", + X"60",X"40",X"7E",X"00",X"3C",X"42",X"3C",X"00",X"60",X"40",X"7E",X"00",X"74",X"52",X"4C",X"00", + X"2C",X"52",X"2C",X"00",X"3C",X"42",X"3C",X"00",X"2C",X"52",X"2C",X"00",X"74",X"52",X"4C",X"00", + X"32",X"4A",X"3C",X"00",X"3C",X"42",X"3C",X"00",X"32",X"4A",X"3C",X"00",X"74",X"52",X"4C",X"00", + X"3C",X"42",X"3C",X"00",X"3C",X"42",X"3C",X"00",X"3C",X"42",X"3C",X"00",X"3C",X"42",X"3C",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"F8",X"F8",X"FC",X"FC",X"FC", + X"FC",X"FC",X"F8",X"F0",X"20",X"00",X"00",X"00",X"00",X"03",X"0F",X"1F",X"1F",X"3F",X"3F",X"3F", + X"3F",X"3F",X"1F",X"0F",X"04",X"00",X"00",X"00",X"A0",X"00",X"A0",X"00",X"00",X"00",X"00",X"00", + X"04",X"6C",X"08",X"98",X"F0",X"C0",X"00",X"00",X"40",X"6F",X"21",X"33",X"1F",X"07",X"00",X"00", + X"00",X"07",X"1F",X"33",X"21",X"6D",X"40",X"6E",X"00",X"C0",X"F0",X"98",X"08",X"EC",X"04",X"EC", + X"04",X"6C",X"08",X"98",X"F0",X"C0",X"00",X"00",X"40",X"6F",X"21",X"33",X"1F",X"07",X"00",X"00", + X"00",X"07",X"1F",X"33",X"21",X"6D",X"40",X"6E",X"00",X"C0",X"F0",X"98",X"08",X"EC",X"04",X"EC", + X"00",X"C0",X"F0",X"98",X"08",X"EC",X"04",X"EC",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03", + X"00",X"00",X"00",X"00",X"01",X"07",X"06",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"F0",X"F0",X"C0",X"80", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"3D", + X"01",X"00",X"01",X"01",X"01",X"01",X"00",X"1F",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F8",X"F8", + X"7F",X"1E",X"7F",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"3E",X"3F",X"3D",X"01",X"01",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"C0",X"E0",X"C0",X"20",X"50",X"E0",X"50", + X"0F",X"1E",X"38",X"7E",X"7F",X"FF",X"FF",X"7F",X"00",X"00",X"00",X"00",X"03",X"03",X"03",X"03", + X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"00",X"00",X"A0",X"C0",X"E0",X"C0",X"00",X"00",X"00",X"00", + X"7F",X"3E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"7D",X"6D",X"C1",X"81",X"31",X"21",X"89",X"00",X"80",X"C0",X"E1",X"F3",X"7B",X"7B",X"39", + X"3F",X"7F",X"7F",X"E1",X"C0",X"80",X"00",X"00",X"FC",X"FE",X"07",X"03",X"01",X"00",X"10",X"10", + X"F8",X"FD",X"FF",X"0E",X"04",X"00",X"00",X"00",X"00",X"E1",X"FB",X"FF",X"1C",X"08",X"01",X"01", + X"00",X"03",X"07",X"EF",X"FC",X"F0",X"C0",X"80",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"0F", + X"C9",X"51",X"C1",X"83",X"83",X"03",X"C7",X"DF",X"38",X"1C",X"1C",X"0D",X"08",X"18",X"F7",X"FF", + X"10",X"20",X"20",X"30",X"10",X"FF",X"FF",X"01",X"30",X"20",X"30",X"10",X"E8",X"FF",X"3F",X"00", + X"80",X"80",X"80",X"FF",X"FF",X"01",X"06",X"0C",X"01",X"F0",X"FF",X"1F",X"60",X"C0",X"80",X"30", + X"8F",X"8F",X"C1",X"C0",X"E0",X"F8",X"7C",X"0E",X"07",X"03",X"01",X"01",X"00",X"00",X"00",X"00", + X"1F",X"0F",X"1F",X"3D",X"E1",X"C1",X"C1",X"A1",X"7C",X"30",X"78",X"7C",X"FC",X"F8",X"F0",X"E0", + X"02",X"1E",X"10",X"00",X"00",X"83",X"FF",X"FF",X"00",X"00",X"00",X"04",X"8E",X"FF",X"FF",X"7B", + X"08",X"09",X"83",X"FF",X"FF",X"FD",X"C1",X"00",X"F8",X"FC",X"DF",X"0F",X"07",X"0F",X"3F",X"74", + X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"81",X"9B",X"13",X"B3",X"83",X"87",X"8F",X"1F",X"F1",X"FB",X"3B",X"39",X"1C",X"0D",X"08",X"E8", + X"FF",X"FF",X"3E",X"00",X"00",X"00",X"00",X"FF",X"01",X"00",X"08",X"08",X"08",X"88",X"FC",X"07", + X"00",X"00",X"04",X"FC",X"87",X"81",X"00",X"40",X"E0",X"C0",X"80",X"0F",X"00",X"01",X"CB",X"F8", + X"01",X"03",X"03",X"01",X"07",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"DE",X"DC",X"10",X"07",X"1D",X"39",X"71",X"61",X"FF",X"1F",X"18",X"38",X"78",X"F0",X"E0",X"F0", + X"20",X"20",X"00",X"10",X"38",X"FD",X"EF",X"07",X"00",X"08",X"1C",X"FE",X"EF",X"03",X"C1",X"40", + X"C0",X"F8",X"7C",X"3F",X"7D",X"F0",X"A0",X"00",X"7C",X"0F",X"06",X"00",X"00",X"00",X"03",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"25",X"05",X"09",X"03",X"F7",X"07",X"03",X"00",X"F8",X"3C",X"18",X"10",X"FF",X"10",X"38",X"F0", + X"61",X"30",X"18",X"88",X"FF",X"04",X"08",X"18",X"60",X"A0",X"F0",X"1F",X"20",X"01",X"99",X"FC", + X"00",X"0F",X"02",X"06",X"E4",X"F1",X"3F",X"1D",X"0E",X"1C",X"0C",X"0E",X"07",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"18",X"38",X"70",X"F0",X"F0",X"E0",X"E0",X"DE",X"EC",X"D8",X"E0",X"C0",X"C1",X"83",X"07", + X"F8",X"30",X"F8",X"3F",X"F8",X"30",X"F8",X"3F",X"00",X"60",X"68",X"0C",X"68",X"00",X"B8",X"7C", + X"00",X"50",X"17",X"C7",X"D7",X"00",X"FF",X"FF",X"00",X"00",X"38",X"83",X"3B",X"00",X"2F",X"1F", + X"00",X"00",X"00",X"1B",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"20",X"20",X"0F",X"1F",X"3F",X"7F",X"F1",X"F1",X"80",X"80", + X"FE",X"3C",X"F8",X"30",X"E0",X"01",X"83",X"07",X"B8",X"7C",X"38",X"1C",X"08",X"0C",X"08",X"0C", + X"FF",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"2F",X"1F",X"2E",X"1C",X"28",X"18",X"28",X"18", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"80",X"F3",X"F3",X"FF",X"7F",X"3F",X"1F",X"0F", + X"07",X"83",X"01",X"E0",X"30",X"F8",X"3C",X"FE",X"08",X"0C",X"08",X"0C",X"18",X"3C",X"78",X"BC", + X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"FF",X"28",X"18",X"28",X"18",X"2C",X"1E",X"2F",X"1F", + X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"F0",X"F0",X"70",X"38",X"18",X"0C",X"07",X"83",X"C1",X"C0",X"E0",X"D8",X"EC",X"DE", + X"3F",X"F8",X"30",X"F8",X"3F",X"F8",X"30",X"F8",X"78",X"BC",X"00",X"6C",X"08",X"6C",X"60",X"00", + X"FF",X"FF",X"00",X"D7",X"C7",X"17",X"50",X"00",X"2F",X"1F",X"00",X"3B",X"83",X"38",X"00",X"00", + X"00",X"00",X"00",X"00",X"1B",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F1",X"12",X"11",X"12",X"11",X"12",X"11",X"00",X"FF",X"7C",X"E0",X"40",X"C0",X"40",X"C0", + X"00",X"D8",X"B4",X"D8",X"B4",X"D8",X"B4",X"D8",X"00",X"FF",X"01",X"01",X"01",X"01",X"01",X"FF", + X"00",X"0F",X"96",X"0C",X"94",X"0C",X"96",X"0F",X"00",X"FD",X"06",X"05",X"06",X"05",X"06",X"05", + X"00",X"7F",X"B0",X"60",X"A0",X"60",X"A0",X"70",X"00",X"07",X"00",X"00",X"00",X"00",X"07",X"1F", + X"12",X"11",X"12",X"11",X"F2",X"00",X"00",X"00",X"40",X"C0",X"60",X"FC",X"7F",X"00",X"00",X"00", + X"B4",X"D8",X"B4",X"D8",X"B4",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"FC",X"C0",X"00", + X"96",X"0C",X"94",X"0C",X"82",X"03",X"83",X"06",X"FE",X"05",X"06",X"05",X"06",X"05",X"06",X"FD", + X"BF",X"70",X"A0",X"60",X"A0",X"60",X"B0",X"7F",X"07",X"00",X"00",X"00",X"00",X"07",X"01",X"00", + X"00",X"00",X"00",X"F2",X"11",X"12",X"11",X"12",X"00",X"00",X"00",X"7F",X"FC",X"60",X"C0",X"40", + X"00",X"00",X"00",X"B4",X"D8",X"B4",X"D8",X"B4",X"00",X"C0",X"FC",X"01",X"01",X"01",X"01",X"01", + X"06",X"83",X"03",X"82",X"0C",X"94",X"0C",X"96",X"FD",X"06",X"05",X"06",X"05",X"06",X"05",X"FE", + X"7F",X"B0",X"60",X"A0",X"60",X"A0",X"70",X"BF",X"00",X"01",X"07",X"00",X"00",X"00",X"00",X"07", + X"11",X"12",X"11",X"12",X"11",X"12",X"F1",X"00",X"C0",X"40",X"C0",X"40",X"E0",X"7C",X"FF",X"00", + X"D8",X"B4",X"D8",X"B4",X"D8",X"B4",X"D8",X"00",X"FF",X"01",X"01",X"01",X"01",X"01",X"FF",X"00", + X"0F",X"96",X"0C",X"94",X"0C",X"96",X"0F",X"00",X"05",X"06",X"05",X"06",X"05",X"06",X"FD",X"00", + X"70",X"A0",X"60",X"A0",X"60",X"B0",X"7F",X"00",X"1F",X"07",X"00",X"00",X"00",X"00",X"07",X"00", + X"01",X"01",X"05",X"05",X"15",X"15",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"05",X"5A",X"A5",X"55",X"5A",X"A5",X"55",X"5A",X"A5",X"55",X"5A",X"A5",X"55",X"5A",X"A5",X"54", + X"59",X"A5",X"55",X"45",X"95",X"55",X"55",X"55",X"55",X"55",X"55",X"95",X"45",X"55",X"A1",X"59", + X"54",X"A5",X"5A",X"55",X"A5",X"5A",X"55",X"A5",X"5A",X"55",X"A5",X"5A",X"55",X"A5",X"5A",X"05", + X"55",X"55",X"15",X"15",X"05",X"05",X"01",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"03",X"07",X"F7",X"03",X"09",X"05",X"15",X"F0",X"38",X"10",X"FF",X"10",X"18",X"3C",X"F8", + X"18",X"08",X"04",X"FF",X"88",X"18",X"30",X"61",X"FC",X"99",X"01",X"20",X"1F",X"F0",X"A0",X"60", + X"1D",X"3F",X"F1",X"E4",X"06",X"02",X"0F",X"00",X"00",X"00",X"01",X"07",X"0E",X"0C",X"1C",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"61",X"71",X"39",X"1D",X"07",X"10",X"DC",X"DE",X"F0",X"E0",X"F0",X"78",X"38",X"18",X"1F",X"FF", + X"07",X"EF",X"FD",X"38",X"10",X"00",X"20",X"20",X"40",X"C1",X"03",X"EF",X"FE",X"1C",X"08",X"00", + X"00",X"A0",X"F0",X"7D",X"3F",X"7C",X"F8",X"C0",X"07",X"03",X"00",X"00",X"00",X"06",X"0F",X"7C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"8F",X"87",X"83",X"B3",X"13",X"9B",X"81",X"E8",X"08",X"0D",X"1C",X"39",X"3B",X"FB",X"F1", + X"FF",X"00",X"00",X"00",X"00",X"3E",X"FF",X"FF",X"07",X"FC",X"88",X"08",X"08",X"08",X"00",X"01", + X"48",X"0E",X"81",X"87",X"FC",X"04",X"08",X"08",X"F8",X"CB",X"01",X"00",X"0F",X"80",X"C0",X"E0", + X"00",X"03",X"07",X"07",X"01",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A1",X"C1",X"C1",X"E1",X"3D",X"1F",X"0F",X"1F",X"E0",X"F1",X"F9",X"FC",X"7C",X"78",X"30",X"7C", + X"FF",X"FF",X"83",X"00",X"00",X"10",X"1E",X"02",X"7B",X"FF",X"FF",X"8E",X"04",X"00",X"00",X"00", + X"00",X"C1",X"FD",X"FF",X"FF",X"83",X"09",X"08",X"74",X"3F",X"0F",X"07",X"0F",X"DF",X"FC",X"F8", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"DF",X"C7",X"03",X"83",X"83",X"C1",X"51",X"C9",X"FF",X"F7",X"18",X"08",X"0D",X"1C",X"1C",X"38", + X"01",X"FF",X"FF",X"10",X"30",X"20",X"20",X"10",X"00",X"3F",X"FF",X"E8",X"10",X"30",X"20",X"30", + X"0C",X"06",X"01",X"FF",X"FF",X"80",X"80",X"80",X"30",X"80",X"C0",X"60",X"1F",X"FF",X"F0",X"01", + X"0E",X"7C",X"F8",X"E0",X"C0",X"C1",X"8F",X"8F",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"07", + X"89",X"21",X"31",X"81",X"C1",X"6D",X"7D",X"38",X"39",X"7B",X"7B",X"F3",X"E1",X"C0",X"80",X"00", + X"00",X"00",X"80",X"C0",X"E1",X"7F",X"7F",X"3F",X"10",X"10",X"00",X"01",X"03",X"07",X"FE",X"FC", + X"00",X"00",X"00",X"04",X"0E",X"FF",X"FD",X"F8",X"01",X"01",X"08",X"1C",X"FF",X"FB",X"E1",X"00", + X"80",X"C0",X"F0",X"FC",X"EF",X"07",X"03",X"00",X"0F",X"0F",X"07",X"03",X"01",X"00",X"00",X"00", + X"1B",X"25",X"25",X"1B",X"1B",X"25",X"25",X"1B",X"00",X"03",X"03",X"00",X"23",X"00",X"03",X"03", + X"00",X"00",X"E6",X"57",X"89",X"FE",X"10",X"E0",X"00",X"00",X"01",X"06",X"08",X"FF",X"21",X"C0", + X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"01",X"00",X"00",X"00",X"F0",X"10",X"10",X"18",X"08", + X"00",X"00",X"00",X"3F",X"60",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"28",X"28",X"F8",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"0F",X"18",X"38",X"30",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"10",X"10",X"18",X"08",X"28",X"28",X"F8", + X"3F",X"60",X"E0",X"C0",X"00",X"20",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FC",X"14",X"16",X"02",X"18",X"38",X"30",X"00",X"07",X"0C",X"1C",X"18", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"FE",X"02",X"03",X"05",X"05",X"FF",X"00", + X"00",X"07",X"0C",X"1C",X"18",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C0",X"C0",X"80",X"00",X"00",X"07",X"06",X"00",X"00",X"01",X"01",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"70",X"90",X"F8",X"00",X"00",X"C0",X"C0",X"00",X"4C",X"94",X"65",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"C0",X"C0",X"80",X"00", + X"01",X"FF",X"00",X"00",X"00",X"01",X"01",X"FF",X"00",X"03",X"02",X"02",X"02",X"02",X"02",X"03", + X"00",X"FC",X"14",X"14",X"0C",X"08",X"F8",X"08",X"00",X"07",X"0C",X"1C",X"18",X"00",X"3F",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"50",X"50",X"F0",X"00",X"00",X"00",X"00", + X"E0",X"C0",X"00",X"0F",X"18",X"38",X"B0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"1F",X"10",X"1C",X"0D", + X"02",X"02",X"04",X"04",X"04",X"04",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"A8",X"28",X"28",X"10",X"00",X"02",X"02",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_cpu1.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_cpu1.vhd new file mode 100644 index 00000000..4f473424 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_cpu1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_cpu1 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 prom of rom_cpu1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"C3",X"18",X"50",X"69",X"30",X"81",X"00",X"10",X"14",X"02",X"80",X"10",X"98",X"01",X"80",X"4C", + X"C0",X"02",X"00",X"C4",X"40",X"22",X"00",X"88",X"00",X"12",X"92",X"82",X"60",X"12",X"03",X"00", + X"00",X"20",X"82",X"00",X"00",X"00",X"A0",X"40",X"00",X"30",X"02",X"68",X"40",X"00",X"00",X"00", + X"10",X"00",X"00",X"00",X"02",X"10",X"00",X"20",X"C3",X"9E",X"01",X"68",X"42",X"80",X"48",X"00", + X"14",X"80",X"08",X"71",X"25",X"29",X"05",X"08",X"0D",X"05",X"00",X"11",X"70",X"80",X"45",X"03", + X"4C",X"8E",X"04",X"4D",X"41",X"21",X"00",X"05",X"08",X"0D",X"89",X"01",X"85",X"03",X"25",X"00", + X"20",X"01",X"28",X"21",X"40",X"00",X"C3",X"34",X"02",X"01",X"00",X"08",X"20",X"08",X"01",X"00", + X"10",X"00",X"30",X"40",X"00",X"00",X"09",X"00",X"20",X"01",X"20",X"00",X"20",X"30",X"48",X"02", + X"3A",X"27",X"60",X"3C",X"C3",X"9B",X"3B",X"21",X"88",X"00",X"46",X"45",X"9A",X"80",X"09",X"C0", + X"82",X"96",X"42",X"81",X"00",X"83",X"8A",X"58",X"80",X"10",X"62",X"04",X"86",X"2A",X"C3",X"01", + X"00",X"10",X"00",X"90",X"A0",X"00",X"10",X"50",X"22",X"10",X"50",X"00",X"60",X"00",X"02",X"80", + X"10",X"00",X"1A",X"82",X"41",X"A0",X"0B",X"04",X"00",X"40",X"00",X"08",X"00",X"01",X"00",X"40", + X"50",X"05",X"40",X"90",X"01",X"01",X"89",X"0C",X"0C",X"2B",X"04",X"40",X"0E",X"14",X"45",X"04", + X"11",X"20",X"04",X"04",X"04",X"01",X"89",X"55",X"0C",X"02",X"29",X"40",X"83",X"D0",X"90",X"07", + X"00",X"04",X"02",X"00",X"20",X"41",X"08",X"40",X"40",X"41",X"29",X"00",X"00",X"01",X"29",X"60", + X"20",X"04",X"20",X"09",X"08",X"00",X"08",X"02",X"00",X"00",X"08",X"01",X"41",X"00",X"20",X"20", + X"31",X"FF",X"67",X"ED",X"56",X"F3",X"3A",X"00",X"80",X"CD",X"6E",X"17",X"CD",X"D4",X"1A",X"CD", + X"06",X"2B",X"CD",X"BA",X"1A",X"CD",X"55",X"17",X"CD",X"C6",X"02",X"31",X"FF",X"67",X"AF",X"32", + X"00",X"A0",X"CD",X"BA",X"1A",X"CD",X"28",X"50",X"CD",X"07",X"26",X"06",X"03",X"C5",X"06",X"03", + X"AF",X"CD",X"63",X"28",X"CD",X"30",X"50",X"3C",X"CD",X"63",X"28",X"CD",X"30",X"50",X"10",X"F0", + X"21",X"02",X"90",X"CB",X"76",X"C1",X"CA",X"8C",X"01",X"05",X"20",X"E1",X"CD",X"38",X"50",X"CD", + X"20",X"50",X"21",X"5F",X"60",X"CB",X"E6",X"21",X"F8",X"0E",X"22",X"D8",X"61",X"00",X"00",X"00", + X"00",X"00",X"CD",X"36",X"1F",X"32",X"66",X"60",X"AF",X"32",X"67",X"60",X"32",X"65",X"60",X"32", + X"6E",X"60",X"32",X"6F",X"60",X"C3",X"F7",X"03",X"21",X"1C",X"60",X"AF",X"77",X"21",X"21",X"60", + X"77",X"CD",X"CD",X"3C",X"21",X"5F",X"60",X"CB",X"A6",X"C3",X"1B",X"01",X"3E",X"09",X"32",X"5E", + X"60",X"C3",X"5F",X"03",X"C5",X"F5",X"06",X"1F",X"CD",X"28",X"05",X"F1",X"C1",X"C9",X"F5",X"E5", + X"C5",X"3A",X"CD",X"61",X"FE",X"00",X"C2",X"2B",X"02",X"3A",X"5B",X"60",X"FE",X"00",X"C2",X"2B", + X"02",X"3E",X"03",X"32",X"5B",X"60",X"3E",X"FF",X"21",X"03",X"90",X"ED",X"67",X"2F",X"21",X"E2", + X"0B",X"CB",X"27",X"4F",X"06",X"00",X"09",X"D5",X"EB",X"CB",X"39",X"21",X"30",X"68",X"09",X"34", + X"1A",X"BE",X"CA",X"D9",X"01",X"D1",X"C3",X"26",X"02",X"36",X"00",X"13",X"1A",X"D1",X"C3",X"FC", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"5E",X"60",X"86", + X"77",X"47",X"3A",X"21",X"D3",X"FE",X"1D",X"20",X"08",X"78",X"FE",X"0A",X"30",X"03",X"32",X"61", + X"D3",X"3A",X"5F",X"60",X"CB",X"47",X"20",X"0E",X"21",X"08",X"00",X"39",X"F9",X"01",X"5F",X"03", + X"C5",X"21",X"FA",X"FF",X"39",X"F9",X"21",X"01",X"60",X"CB",X"E6",X"3A",X"00",X"80",X"FB",X"C1", + X"E1",X"F1",X"ED",X"4D",X"F5",X"E5",X"C5",X"3A",X"CD",X"61",X"FE",X"00",X"C2",X"C1",X"02",X"3A", + X"5B",X"60",X"FE",X"00",X"C2",X"C1",X"02",X"3E",X"03",X"32",X"5B",X"60",X"3E",X"FF",X"21",X"03", + X"90",X"ED",X"6F",X"2F",X"21",X"E2",X"0B",X"CB",X"27",X"4F",X"06",X"00",X"09",X"D5",X"EB",X"CB", + X"39",X"21",X"30",X"68",X"09",X"34",X"1A",X"BE",X"CA",X"6F",X"02",X"D1",X"C3",X"BC",X"02",X"36", + X"00",X"13",X"1A",X"D1",X"C3",X"92",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"5E",X"60",X"86",X"77",X"47",X"3A",X"21",X"D3",X"FE",X"1D",X"20",X"08",X"78", + X"FE",X"0A",X"30",X"03",X"32",X"61",X"D3",X"3A",X"5F",X"60",X"CB",X"47",X"20",X"0E",X"21",X"08", + X"00",X"39",X"F9",X"01",X"5F",X"03",X"C5",X"21",X"FA",X"FF",X"39",X"F9",X"21",X"01",X"60",X"CB", + X"E6",X"C1",X"E1",X"F1",X"ED",X"45",X"AF",X"32",X"5B",X"60",X"32",X"00",X"A0",X"32",X"C9",X"61", + X"CD",X"40",X"50",X"32",X"CD",X"61",X"32",X"5E",X"60",X"C3",X"57",X"49",X"CD",X"F9",X"02",X"CD", + X"0A",X"03",X"AF",X"21",X"68",X"60",X"77",X"23",X"77",X"23",X"77",X"21",X"00",X"60",X"06",X"1C", + X"77",X"23",X"10",X"FC",X"CD",X"2F",X"03",X"FB",X"C9",X"06",X"09",X"21",X"73",X"60",X"AF",X"3C", + X"77",X"AF",X"23",X"77",X"23",X"77",X"23",X"10",X"F6",X"C9",X"21",X"80",X"D3",X"06",X"09",X"C5", + X"06",X"02",X"3E",X"FF",X"77",X"23",X"10",X"FC",X"DD",X"21",X"FC",X"2E",X"06",X"09",X"DD",X"7E", + X"00",X"DD",X"23",X"77",X"23",X"10",X"F7",X"3E",X"FF",X"77",X"23",X"C1",X"10",X"E1",X"C9",X"06", + X"32",X"AF",X"21",X"1C",X"60",X"77",X"23",X"10",X"FC",X"C9",X"F5",X"3A",X"5B",X"60",X"FE",X"00", + X"28",X"04",X"3D",X"32",X"5B",X"60",X"3A",X"CD",X"61",X"FE",X"00",X"28",X"01",X"3D",X"32",X"CD", + X"61",X"3A",X"00",X"90",X"CB",X"7F",X"20",X"05",X"3E",X"05",X"32",X"CD",X"61",X"F1",X"C9",X"21", + X"5F",X"60",X"CB",X"C6",X"CB",X"A6",X"21",X"1C",X"60",X"AF",X"77",X"21",X"21",X"60",X"77",X"CD", + X"CD",X"3C",X"AF",X"32",X"00",X"A0",X"CD",X"25",X"25",X"3E",X"01",X"32",X"E2",X"61",X"AF",X"32", + X"C8",X"61",X"01",X"17",X"00",X"21",X"00",X"90",X"CB",X"6E",X"28",X"27",X"3A",X"5E",X"60",X"FE", + X"02",X"38",X"04",X"CB",X"76",X"28",X"34",X"C5",X"CD",X"A5",X"1C",X"CD",X"E5",X"27",X"CD",X"55", + X"27",X"CD",X"5A",X"2D",X"C1",X"0B",X"78",X"B1",X"20",X"DB",X"3A",X"C8",X"61",X"CD",X"63",X"28", + X"2F",X"18",X"CC",X"3A",X"5F",X"60",X"CB",X"8F",X"32",X"5F",X"60",X"CD",X"36",X"1F",X"32",X"66", + X"60",X"AF",X"32",X"67",X"60",X"21",X"5E",X"60",X"35",X"18",X"16",X"3A",X"5F",X"60",X"CB",X"CF", + X"32",X"5F",X"60",X"CD",X"36",X"1F",X"32",X"66",X"60",X"32",X"67",X"60",X"C3",X"60",X"49",X"35", + X"35",X"AF",X"C3",X"6C",X"49",X"21",X"68",X"60",X"77",X"23",X"77",X"23",X"77",X"23",X"77",X"23", + X"77",X"23",X"77",X"23",X"77",X"23",X"77",X"3E",X"FF",X"21",X"9D",X"60",X"06",X"06",X"77",X"23", + X"10",X"FC",X"AF",X"32",X"9F",X"60",X"32",X"A2",X"60",X"21",X"1C",X"D6",X"22",X"63",X"60",X"21", + X"5F",X"60",X"CB",X"96",X"CD",X"BA",X"1A",X"CD",X"E5",X"1B",X"AF",X"32",X"60",X"60",X"2F",X"32", + X"62",X"60",X"3E",X"0C",X"32",X"61",X"60",X"CD",X"C6",X"1C",X"CD",X"44",X"21",X"CD",X"42",X"1D", + X"CD",X"64",X"1D",X"CD",X"77",X"1D",X"CD",X"D1",X"1D",X"CD",X"8B",X"1E",X"06",X"06",X"3E",X"05", + X"21",X"A1",X"D5",X"CD",X"7D",X"1E",X"CD",X"E0",X"1E",X"CD",X"26",X"28",X"06",X"05",X"3E",X"01", + X"21",X"E1",X"D4",X"CD",X"7D",X"1E",X"21",X"E1",X"D0",X"36",X"2A",X"19",X"CD",X"44",X"1F",X"DD", + X"21",X"1C",X"60",X"DD",X"36",X"00",X"82",X"DD",X"36",X"01",X"08",X"DD",X"36",X"02",X"0F",X"CD", + X"7F",X"1F",X"DD",X"77",X"03",X"DD",X"70",X"04",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"DD",X"36", + X"00",X"81",X"C3",X"D5",X"04",X"DD",X"21",X"70",X"60",X"ED",X"5F",X"0E",X"00",X"1F",X"CB",X"11", + X"DD",X"71",X"00",X"ED",X"5F",X"E6",X"07",X"1F",X"CE",X"02",X"FE",X"05",X"20",X"0A",X"3A",X"E2", + X"61",X"FE",X"00",X"3E",X"05",X"20",X"01",X"3C",X"DD",X"77",X"01",X"ED",X"5F",X"1F",X"E6",X"03", + X"1F",X"CE",X"07",X"FE",X"08",X"20",X"1A",X"47",X"CD",X"36",X"1F",X"3C",X"4F",X"3A",X"65",X"60", + X"FE",X"00",X"28",X"05",X"3A",X"67",X"60",X"18",X"03",X"3A",X"66",X"60",X"B9",X"78",X"38",X"01", + X"3C",X"DD",X"77",X"02",X"C9",X"AF",X"32",X"C9",X"61",X"CD",X"CF",X"33",X"CD",X"77",X"1D",X"CD", + X"85",X"04",X"CD",X"FE",X"28",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"3E",X"81",X"32",X"21",X"60", + X"CD",X"F4",X"30",X"CD",X"1C",X"31",X"CD",X"54",X"31",X"CD",X"77",X"1D",X"CD",X"F4",X"1E",X"21", + X"01",X"D1",X"CD",X"44",X"1F",X"21",X"1F",X"60",X"CD",X"7F",X"1F",X"77",X"23",X"70",X"CD",X"C7", + X"1F",X"CD",X"8F",X"17",X"06",X"B4",X"CD",X"28",X"05",X"CD",X"C1",X"2A",X"AF",X"32",X"21",X"60", + X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"18",X"19",X"21",X"01",X"90",X"CD",X"5A",X"2D",X"CB",X"7E", + X"28",X"FC",X"CB",X"7E",X"20",X"FC",X"C5",X"CD",X"3A",X"03",X"CD",X"8F",X"17",X"C1",X"10",X"E8", + X"C9",X"CD",X"44",X"21",X"CD",X"E3",X"33",X"CD",X"5C",X"21",X"CD",X"92",X"31",X"CD",X"DA",X"30", + X"CD",X"CF",X"30",X"CD",X"44",X"31",X"3E",X"03",X"32",X"9B",X"61",X"CD",X"15",X"2B",X"CD",X"F4", + X"30",X"CD",X"1C",X"31",X"CD",X"54",X"31",X"CD",X"F4",X"1E",X"21",X"01",X"D1",X"CD",X"44",X"1F", + X"DD",X"21",X"1C",X"60",X"DD",X"36",X"00",X"82",X"DD",X"36",X"01",X"08",X"DD",X"36",X"02",X"0F", + X"CD",X"7F",X"1F",X"DD",X"77",X"03",X"DD",X"70",X"04",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"DD", + X"36",X"00",X"81",X"21",X"1C",X"D6",X"22",X"63",X"60",X"AF",X"32",X"60",X"60",X"2F",X"32",X"62", + X"60",X"3E",X"0C",X"32",X"61",X"60",X"CD",X"C6",X"1C",X"CD",X"AE",X"05",X"18",X"23",X"11",X"05", + X"00",X"21",X"2B",X"60",X"0E",X"00",X"7E",X"E6",X"03",X"28",X"08",X"19",X"0C",X"FE",X"04",X"20", + X"F5",X"18",X"0D",X"CD",X"61",X"30",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"DD",X"36",X"00",X"81", + X"C9",X"3A",X"65",X"60",X"FE",X"00",X"28",X"05",X"21",X"67",X"60",X"18",X"03",X"21",X"66",X"60", + X"35",X"7E",X"F5",X"CD",X"77",X"1D",X"F1",X"DD",X"21",X"26",X"60",X"DD",X"36",X"00",X"42",X"DD", + X"36",X"02",X"1F",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"C6",X"08",X"DD",X"77",X"01", + X"DD",X"36",X"03",X"00",X"DD",X"36",X"04",X"00",X"C3",X"21",X"06",X"CD",X"C1",X"2A",X"AF",X"32", + X"C9",X"61",X"CD",X"4C",X"1E",X"CD",X"44",X"21",X"CD",X"5C",X"21",X"CD",X"92",X"35",X"C3",X"56", + X"05",X"21",X"00",X"60",X"CB",X"F6",X"21",X"27",X"60",X"AF",X"16",X"58",X"06",X"0F",X"10",X"06", + X"2F",X"CD",X"4C",X"1E",X"06",X"0F",X"F5",X"C5",X"E5",X"D5",X"CD",X"C7",X"1F",X"CD",X"8F",X"17", + X"D1",X"E1",X"C1",X"7E",X"BA",X"28",X"04",X"34",X"F1",X"18",X"E3",X"FE",X"56",X"28",X"0A",X"3E", + X"82",X"32",X"26",X"60",X"23",X"16",X"56",X"18",X"EF",X"F1",X"3E",X"FF",X"CD",X"4C",X"1E",X"C3", + X"30",X"07",X"CD",X"CF",X"33",X"21",X"66",X"60",X"3A",X"65",X"60",X"FE",X"00",X"28",X"03",X"21", + X"67",X"60",X"34",X"34",X"E5",X"CD",X"85",X"04",X"E1",X"35",X"35",X"CD",X"FE",X"28",X"CD",X"C7", + X"1F",X"CD",X"8F",X"17",X"3E",X"81",X"32",X"21",X"60",X"CD",X"F4",X"30",X"CD",X"1C",X"31",X"CD", + X"54",X"31",X"CD",X"77",X"1D",X"CD",X"F4",X"1E",X"21",X"01",X"D1",X"CD",X"44",X"1F",X"21",X"1F", + X"60",X"CD",X"7F",X"1F",X"77",X"23",X"70",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"06",X"B4",X"CD", + X"28",X"05",X"CD",X"C1",X"2A",X"AF",X"32",X"21",X"60",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"CD", + X"44",X"21",X"CD",X"E3",X"33",X"CD",X"5C",X"21",X"CD",X"92",X"31",X"CD",X"44",X"31",X"CD",X"54", + X"31",X"CD",X"DA",X"30",X"CD",X"CF",X"30",X"CD",X"15",X"2B",X"AF",X"32",X"60",X"60",X"2F",X"32", + X"62",X"60",X"3E",X"0C",X"32",X"61",X"60",X"CD",X"C6",X"1C",X"21",X"1C",X"D6",X"22",X"63",X"60", + X"CD",X"F4",X"1E",X"21",X"01",X"D1",X"CD",X"44",X"1F",X"DD",X"21",X"1C",X"60",X"DD",X"36",X"00", + X"82",X"DD",X"36",X"01",X"08",X"DD",X"36",X"02",X"0F",X"CD",X"7F",X"1F",X"DD",X"77",X"03",X"DD", + X"70",X"04",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"DD",X"36",X"00",X"81",X"CD",X"AE",X"05",X"21", + X"26",X"60",X"36",X"82",X"23",X"36",X"58",X"23",X"36",X"56",X"CD",X"C7",X"1F",X"CD",X"8F",X"17", + X"CD",X"E3",X"35",X"DD",X"21",X"B6",X"61",X"DD",X"36",X"00",X"60",X"DD",X"36",X"01",X"00",X"DD", + X"36",X"02",X"00",X"DD",X"36",X"03",X"B4",X"AF",X"32",X"B5",X"61",X"32",X"B4",X"61",X"32",X"E1", + X"61",X"21",X"CE",X"61",X"06",X"05",X"AF",X"77",X"23",X"10",X"FC",X"21",X"5F",X"60",X"CB",X"FE", + X"21",X"96",X"61",X"36",X"58",X"23",X"36",X"56",X"23",X"36",X"08",X"3E",X"08",X"32",X"98",X"61", + X"11",X"00",X"00",X"ED",X"53",X"99",X"61",X"21",X"5F",X"60",X"CB",X"B6",X"CD",X"FD",X"45",X"CD", + X"3A",X"46",X"18",X"06",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"CD",X"5A",X"2D",X"21",X"5F",X"60", + X"CB",X"66",X"20",X"08",X"21",X"02",X"90",X"CB",X"5E",X"CA",X"5E",X"09",X"CD",X"B1",X"39",X"CD", + X"56",X"39",X"3A",X"E1",X"61",X"FE",X"00",X"20",X"03",X"CD",X"7E",X"40",X"CD",X"06",X"44",X"CD", + X"FF",X"35",X"CD",X"99",X"3A",X"06",X"04",X"21",X"2B",X"60",X"11",X"05",X"00",X"CB",X"4E",X"C2", + X"C8",X"07",X"19",X"10",X"F8",X"C3",X"EE",X"07",X"E5",X"23",X"23",X"3A",X"28",X"60",X"96",X"30", + X"02",X"ED",X"44",X"FE",X"09",X"D2",X"EA",X"07",X"2B",X"3A",X"27",X"60",X"96",X"30",X"02",X"ED", + X"44",X"FE",X"09",X"D2",X"EA",X"07",X"E1",X"C3",X"8B",X"08",X"E1",X"C3",X"C2",X"07",X"CD",X"B0", + X"3C",X"E6",X"0F",X"FE",X"0F",X"20",X"1D",X"DD",X"21",X"21",X"60",X"DD",X"CB",X"00",X"4E",X"CA", + X"14",X"08",X"DD",X"7E",X"01",X"DD",X"BE",X"06",X"C2",X"14",X"08",X"DD",X"7E",X"02",X"DD",X"BE", + X"07",X"CA",X"98",X"08",X"3A",X"5F",X"60",X"CB",X"7F",X"20",X"30",X"3A",X"27",X"60",X"57",X"3A", + X"28",X"60",X"5F",X"3A",X"26",X"60",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"FE",X"02", + X"28",X"0D",X"38",X"0F",X"FE",X"04",X"28",X"0E",X"7B",X"D6",X"04",X"5F",X"C3",X"6E",X"08",X"1D", + X"C3",X"6E",X"08",X"14",X"14",X"14",X"14",X"14",X"C3",X"6E",X"08",X"3A",X"28",X"60",X"21",X"97", + X"61",X"96",X"D2",X"57",X"08",X"ED",X"44",X"FE",X"05",X"D2",X"88",X"08",X"3A",X"27",X"60",X"2B", + X"96",X"D2",X"66",X"08",X"ED",X"44",X"FE",X"05",X"D2",X"88",X"08",X"56",X"23",X"5E",X"CD",X"0A", + X"3C",X"7E",X"FE",X"E5",X"CA",X"4A",X"09",X"FE",X"63",X"CA",X"EA",X"0A",X"FE",X"59",X"38",X"08", + X"FE",X"62",X"DA",X"FE",X"09",X"CA",X"CC",X"09",X"C3",X"84",X"07",X"CB",X"86",X"CB",X"8E",X"CD", + X"C7",X"1F",X"CD",X"8F",X"17",X"C3",X"F3",X"0A",X"21",X"21",X"60",X"CB",X"86",X"CB",X"8E",X"21", + X"26",X"60",X"CB",X"8E",X"21",X"00",X"60",X"CB",X"CE",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"3E", + X"05",X"32",X"E1",X"61",X"CD",X"26",X"1F",X"FE",X"13",X"38",X"02",X"3E",X"12",X"F5",X"3D",X"21", + X"79",X"0C",X"06",X"00",X"4F",X"09",X"4E",X"3A",X"65",X"60",X"FE",X"00",X"20",X"06",X"DD",X"21", + X"68",X"60",X"18",X"04",X"DD",X"21",X"6B",X"60",X"DD",X"7E",X"01",X"81",X"27",X"DD",X"77",X"01", + X"DD",X"7E",X"00",X"88",X"27",X"DD",X"77",X"00",X"3A",X"65",X"60",X"FE",X"00",X"20",X"05",X"21", + X"C4",X"D2",X"18",X"03",X"21",X"C3",X"D2",X"CD",X"06",X"1E",X"F1",X"11",X"00",X"04",X"3D",X"47", + X"C6",X"C6",X"21",X"F0",X"D1",X"77",X"19",X"36",X"05",X"78",X"FE",X"06",X"38",X"04",X"3E",X"D9", + X"18",X"02",X"3E",X"D8",X"21",X"10",X"D2",X"77",X"19",X"36",X"05",X"06",X"20",X"C5",X"CD",X"C7", + X"1F",X"CD",X"8F",X"17",X"CD",X"5A",X"2D",X"C1",X"10",X"F3",X"21",X"F0",X"D1",X"36",X"32",X"11", + X"00",X"04",X"19",X"36",X"00",X"21",X"10",X"D2",X"36",X"FF",X"19",X"36",X"00",X"21",X"5F",X"60", + X"CB",X"F6",X"21",X"26",X"60",X"CB",X"CE",X"C3",X"84",X"07",X"3E",X"FF",X"77",X"1E",X"00",X"CD", + X"2C",X"3C",X"21",X"00",X"60",X"CB",X"DE",X"21",X"A9",X"60",X"35",X"C2",X"84",X"07",X"CD",X"2F", + X"3F",X"21",X"01",X"60",X"CB",X"CE",X"CD",X"2F",X"3F",X"21",X"9B",X"61",X"35",X"20",X"1E",X"3A", + X"5F",X"60",X"CB",X"4F",X"28",X"17",X"3A",X"65",X"60",X"FE",X"00",X"28",X"09",X"3A",X"66",X"60", + X"FE",X"00",X"28",X"09",X"18",X"16",X"3A",X"67",X"60",X"FE",X"00",X"20",X"0F",X"CD",X"CD",X"3C", + X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"CD",X"54",X"40",X"C3",X"62",X"06",X"CD",X"99",X"3A",X"CD", + X"F3",X"3C",X"CD",X"10",X"35",X"CD",X"CD",X"3C",X"21",X"26",X"60",X"CB",X"CE",X"CD",X"74",X"2C", + X"06",X"80",X"CD",X"28",X"05",X"3A",X"65",X"60",X"2F",X"32",X"65",X"60",X"CD",X"CD",X"3F",X"21", + X"5F",X"60",X"CB",X"56",X"CA",X"D5",X"04",X"CB",X"96",X"C3",X"0B",X"06",X"CD",X"E5",X"3F",X"CD", + X"2B",X"3D",X"CD",X"9F",X"3D",X"CD",X"2C",X"3C",X"CD",X"BD",X"3D",X"7B",X"FE",X"01",X"20",X"1B", + X"3A",X"65",X"60",X"FE",X"00",X"20",X"06",X"21",X"9F",X"60",X"34",X"18",X"04",X"21",X"A2",X"60", + X"34",X"7E",X"FE",X"04",X"38",X"02",X"36",X"03",X"CD",X"54",X"31",X"C3",X"57",X"09",X"CD",X"E5", + X"3F",X"CD",X"9F",X"3D",X"7B",X"FE",X"03",X"28",X"04",X"FE",X"02",X"20",X"04",X"7E",X"CD",X"5E", + X"3E",X"D5",X"CD",X"2B",X"3D",X"D1",X"CD",X"2C",X"3C",X"CD",X"BD",X"3D",X"7B",X"FE",X"03",X"28", + X"04",X"FE",X"02",X"20",X"12",X"CD",X"96",X"3E",X"7E",X"CB",X"BF",X"FE",X"00",X"28",X"0B",X"23", + X"7E",X"E6",X"1F",X"FE",X"00",X"28",X"45",X"C3",X"57",X"09",X"AF",X"21",X"E2",X"61",X"BE",X"28", + X"01",X"35",X"C3",X"89",X"49",X"21",X"00",X"60",X"CB",X"FE",X"06",X"00",X"48",X"04",X"CD",X"C2", + X"0A",X"CD",X"10",X"50",X"06",X"00",X"0E",X"00",X"CD",X"FC",X"1B",X"3E",X"FF",X"08",X"21",X"9D", + X"60",X"3A",X"65",X"60",X"FE",X"00",X"28",X"03",X"21",X"A0",X"60",X"08",X"77",X"21",X"01",X"60", + X"CB",X"E6",X"21",X"5E",X"60",X"34",X"CD",X"26",X"28",X"C3",X"69",X"09",X"CD",X"2F",X"3F",X"21", + X"00",X"60",X"CB",X"FE",X"06",X"01",X"48",X"CD",X"C2",X"0A",X"CD",X"08",X"50",X"06",X"00",X"0E", + X"01",X"CD",X"FC",X"1B",X"3E",X"FF",X"08",X"21",X"9E",X"60",X"3A",X"65",X"60",X"FE",X"00",X"28", + X"03",X"21",X"A1",X"60",X"08",X"77",X"21",X"01",X"60",X"CB",X"F6",X"3A",X"65",X"60",X"FE",X"00", + X"20",X"06",X"21",X"66",X"60",X"34",X"18",X"04",X"21",X"67",X"60",X"34",X"CD",X"77",X"1D",X"C3", + X"69",X"09",X"C5",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"C1",X"3A",X"59",X"60",X"E6",X"0F",X"20", + X"0C",X"78",X"FE",X"01",X"28",X"03",X"05",X"18",X"01",X"04",X"CD",X"FC",X"1B",X"3A",X"03",X"60", + X"FE",X"00",X"20",X"DE",X"06",X"01",X"CD",X"FC",X"1B",X"C9",X"CD",X"E5",X"3F",X"CD",X"2B",X"3D", + X"CD",X"05",X"40",X"21",X"01",X"60",X"CB",X"EE",X"CD",X"64",X"2D",X"CD",X"CD",X"3C",X"E5",X"21", + X"5F",X"60",X"CB",X"66",X"E1",X"C2",X"78",X"01",X"3A",X"65",X"60",X"FE",X"00",X"20",X"13",X"3A", + X"66",X"60",X"FE",X"00",X"20",X"1F",X"3A",X"67",X"60",X"FE",X"00",X"CA",X"96",X"0B",X"3E",X"01", + X"18",X"37",X"3A",X"67",X"60",X"FE",X"00",X"20",X"0C",X"3A",X"66",X"60",X"FE",X"00",X"CA",X"96", + X"0B",X"3E",X"02",X"18",X"24",X"3A",X"5F",X"60",X"CB",X"4F",X"28",X"17",X"3A",X"65",X"60",X"FE", + X"00",X"20",X"09",X"3A",X"67",X"60",X"FE",X"00",X"20",X"24",X"18",X"07",X"3A",X"66",X"60",X"FE", + X"00",X"20",X"1B",X"CD",X"99",X"3A",X"C3",X"93",X"05",X"F5",X"CD",X"99",X"3A",X"CD",X"F3",X"3C", + X"CD",X"10",X"35",X"F1",X"CD",X"FC",X"2C",X"06",X"80",X"CD",X"28",X"05",X"18",X"09",X"CD",X"99", + X"3A",X"CD",X"F3",X"3C",X"CD",X"10",X"35",X"CD",X"74",X"2C",X"06",X"80",X"CD",X"28",X"05",X"3A", + X"65",X"60",X"2F",X"32",X"65",X"60",X"CD",X"CD",X"3F",X"21",X"5F",X"60",X"CB",X"56",X"C2",X"0B", + X"06",X"CB",X"D6",X"C3",X"D5",X"04",X"CD",X"FC",X"2C",X"06",X"80",X"CD",X"28",X"05",X"21",X"1C", + X"60",X"CB",X"86",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"CD",X"BA",X"1A",X"CD",X"00",X"50",X"3A", + X"5E",X"60",X"FE",X"00",X"28",X"0A",X"21",X"02",X"90",X"CB",X"76",X"28",X"1D",X"C3",X"5F",X"03", + X"21",X"02",X"90",X"CB",X"76",X"28",X"13",X"21",X"5F",X"60",X"CB",X"86",X"06",X"02",X"C5",X"06", + X"B4",X"CD",X"28",X"05",X"C1",X"10",X"F7",X"C3",X"1B",X"01",X"3E",X"09",X"32",X"5E",X"60",X"C3", + X"5F",X"03",X"01",X"01",X"01",X"02",X"01",X"03",X"01",X"04",X"01",X"05",X"02",X"01",X"02",X"03", + X"03",X"01",X"03",X"02",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"D8",X"D0",X"DA",X"D0",X"9A",X"D1",X"DA",X"D1",X"14",X"D2",X"16",X"D2",X"18",X"D2", + X"1A",X"D2",X"5A",X"D2",X"9A",X"D2",X"C6",X"D0",X"C8",X"D0",X"CA",X"D0",X"CC",X"D0",X"CE",X"D0", + X"D0",X"D0",X"D2",X"D0",X"0A",X"D1",X"10",X"D1",X"12",X"D1",X"4A",X"D1",X"52",X"D1",X"86",X"D1", + X"C6",X"D1",X"D0",X"D1",X"46",X"D2",X"50",X"D2",X"86",X"D2",X"CA",X"D2",X"D2",X"D2",X"0A",X"D3", + X"10",X"D3",X"12",X"D3",X"46",X"D3",X"48",X"D3",X"4A",X"D3",X"4C",X"D3",X"4E",X"D3",X"50",X"D3", + X"52",X"D3",X"08",X"06",X"07",X"07",X"9D",X"D4",X"97",X"06",X"BD",X"D5",X"75",X"05",X"9D",X"D6", + X"86",X"4D",X"1C",X"19",X"0E",X"0C",X"12",X"0A",X"15",X"4D",X"4D",X"0E",X"21",X"1D",X"1B",X"0A", + X"4D",X"4D",X"56",X"02",X"56",X"03",X"56",X"05",X"4D",X"10",X"15",X"20",X"25",X"30",X"35",X"40", + X"45",X"50",X"55",X"60",X"65",X"70",X"75",X"80",X"85",X"90",X"95",X"18",X"30",X"60",X"48",X"78", + X"90",X"A8",X"C0",X"10",X"11",X"1B",X"1C",X"10",X"1C",X"15",X"15",X"14",X"1A",X"15",X"16",X"19", + X"14",X"10",X"14",X"12",X"14",X"62",X"70",X"88",X"A0",X"63",X"72",X"8C",X"A2",X"5E",X"66",X"74", + X"9A",X"5B",X"64",X"74",X"94",X"59",X"64",X"74",X"90",X"5A",X"66",X"74",X"92",X"5C",X"64",X"74", + X"96",X"5D",X"68",X"78",X"98",X"5C",X"6A",X"7C",X"96",X"5F",X"6C",X"80",X"9C",X"60",X"6E",X"84", + X"9E",X"61",X"66",X"74",X"92",X"00",X"47",X"46",X"49",X"48",X"FF",X"4A",X"FF",X"00",X"41",X"39", + X"00",X"40",X"42",X"43",X"00",X"44",X"45",X"01",X"39",X"01",X"35",X"36",X"37",X"01",X"FF",X"01", + X"01",X"3D",X"01",X"40",X"3E",X"FF",X"01",X"3F",X"01",X"01",X"FC",X"06",X"F2",X"03",X"6D",X"06", + X"C7",X"01",X"FC",X"03",X"6D",X"06",X"F2",X"06",X"C7",X"11",X"21",X"13",X"11",X"32",X"13",X"21", + X"12",X"11",X"31",X"12",X"13",X"23",X"22",X"32",X"32",X"21",X"12",X"11",X"12",X"F5",X"D0",X"27", + X"D1",X"2D",X"D1",X"39",X"D1",X"6F",X"D1",X"75",X"D1",X"A9",X"D1",X"AD",X"D1",X"B3",X"D1",X"B7", + X"D1",X"69",X"D2",X"6D",X"D2",X"73",X"D2",X"77",X"D2",X"AF",X"D2",X"B5",X"D2",X"E7",X"D2",X"ED", + X"D2",X"F9",X"D2",X"35",X"D3",X"32",X"3C",X"38",X"31",X"32",X"3B",X"38",X"33",X"33",X"3C",X"34", + X"31",X"33",X"3B",X"34",X"33",X"20",X"01",X"13",X"12",X"20",X"11",X"33",X"33",X"12",X"10",X"FF", + X"E5",X"5E",X"5B",X"59",X"5A",X"5C",X"5D",X"5C",X"5F",X"60",X"61",X"62",X"63",X"19",X"15",X"0A", + X"22",X"0E",X"1B",X"FF",X"0C",X"11",X"0A",X"17",X"10",X"0E",X"09",X"0A",X"2B",X"36",X"3A",X"3B", + X"3C",X"3D",X"48",X"53",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"0D",X"10",X"11",X"18",X"1C", + X"21",X"2C",X"31",X"3E",X"43",X"49",X"56",X"5A",X"61",X"64",X"65",X"6A",X"6B",X"6C",X"6D",X"6E", + X"6F",X"70",X"AC",X"AE",X"EA",X"EE",X"AE",X"06",X"6D",X"C5",X"3E",X"95",X"C7",X"07",X"7D",X"BD", + X"EF",X"EB",X"BF",X"07",X"D5",X"EF",X"BF",X"FE",X"EF",X"07",X"BD",X"97",X"AF",X"3F",X"3D",X"05", + X"AD",X"AF",X"87",X"AF",X"AF",X"07",X"ED",X"C7",X"AF",X"6F",X"6D",X"05",X"D5",X"BF",X"EF",X"FB", + X"BF",X"07",X"7D",X"ED",X"BF",X"BE",X"EF",X"07",X"3D",X"95",X"6B",X"C5",X"97",X"07",X"A9",X"AB", + X"BA",X"BB",X"AB",X"03",X"77",X"07",X"DE",X"03",X"FD",X"05",X"DE",X"03",X"FE",X"03",X"AF",X"07", + X"FD",X"05",X"DF",X"07",X"FF",X"07",X"DE",X"03",X"AF",X"07",X"E5",X"05",X"FF",X"07",X"FF",X"07", + X"FE",X"07",X"DF",X"03",X"75",X"05",X"DF",X"03",X"FE",X"07",X"FF",X"07",X"BB",X"07",X"E5",X"05", + X"01",X"02",X"03",X"05",X"03",X"06",X"09",X"15",X"08",X"16",X"24",X"40",X"DA",X"D0",X"10",X"D3", + X"0A",X"D1",X"10",X"D1",X"12",X"D1",X"86",X"D1",X"9A",X"D1",X"DA",X"D1",X"1A",X"D2",X"5A",X"D2", + X"86",X"D2",X"9A",X"D2",X"0A",X"D3",X"12",X"D3",X"C6",X"D0",X"C8",X"D0",X"CA",X"D0",X"CC",X"D0", + X"CE",X"D0",X"D0",X"D0",X"D2",X"D0",X"D8",X"D0",X"D0",X"D1",X"14",X"D2",X"18",X"D2",X"50",X"D2", + X"D2",X"D2",X"48",X"D3",X"4C",X"D3",X"4E",X"D3",X"FF",X"31",X"30",X"32",X"FF",X"31",X"31",X"FF", + X"FF",X"FF",X"32",X"32",X"FF",X"FF",X"33",X"FF",X"10",X"0A",X"16",X"0E",X"FF",X"18",X"1F",X"0E", + X"1B",X"01",X"1C",X"1D",X"FF",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"02",X"17",X"0D",X"FF",X"19", + X"15",X"0A",X"22",X"0E",X"1B",X"AE",X"AB",X"A7",X"AB",X"AE",X"A7",X"AB",X"00",X"01",X"02",X"03", + X"00",X"03",X"03",X"03",X"04",X"00",X"04",X"04",X"04",X"04",X"00",X"04",X"05",X"05",X"05",X"00", + X"06",X"06",X"06",X"07",X"90",X"24",X"00",X"00",X"02",X"04",X"01",X"03",X"05",X"06",X"08",X"05", + X"07",X"09",X"0A",X"0B",X"08",X"0C",X"0D",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"10",X"10",X"10",X"10",X"10",X"10",X"12",X"12", + X"12",X"12",X"12",X"12",X"15",X"15",X"15",X"18",X"10",X"10",X"10",X"12",X"12",X"12",X"15",X"15", + X"15",X"15",X"18",X"18",X"18",X"18",X"18",X"20",X"00",X"08",X"08",X"04",X"04",X"02",X"02",X"04", + X"04",X"08",X"08",X"04",X"04",X"08",X"08",X"01",X"01",X"08",X"08",X"01",X"01",X"08",X"08",X"04", + X"04",X"08",X"08",X"01",X"01",X"08",X"08",X"04",X"04",X"08",X"08",X"04",X"04",X"02",X"02",X"04", + X"04",X"08",X"08",X"04",X"04",X"02",X"02",X"02",X"01",X"01",X"01",X"02",X"02",X"02",X"04",X"04", + X"04",X"08",X"08",X"01",X"01",X"04",X"04",X"02",X"02",X"02",X"01",X"01",X"02",X"02",X"02",X"01", + X"01",X"02",X"02",X"04",X"04",X"04",X"08",X"08",X"08",X"02",X"02",X"02",X"02",X"02",X"01",X"01", + X"08",X"08",X"01",X"01",X"02",X"02",X"01",X"01",X"01",X"08",X"08",X"04",X"04",X"08",X"08",X"01", + X"01",X"01",X"01",X"01",X"02",X"02",X"04",X"04",X"02",X"02",X"01",X"01",X"01",X"08",X"08",X"01", + X"01",X"02",X"02",X"01",X"01",X"08",X"08",X"08",X"08",X"08",X"08",X"04",X"04",X"02",X"02",X"02", + X"04",X"04",X"08",X"08",X"04",X"04",X"08",X"08",X"01",X"01",X"08",X"08",X"01",X"01",X"01",X"08", + X"08",X"08",X"08",X"08",X"04",X"04",X"04",X"04",X"04",X"04",X"02",X"02",X"02",X"02",X"02",X"01", + X"01",X"01",X"08",X"08",X"08",X"04",X"04",X"08",X"08",X"01",X"01",X"02",X"02",X"01",X"01",X"08", + X"08",X"08",X"08",X"FF",X"1C",X"D1",X"1E",X"D1",X"21",X"D1",X"23",X"D1",X"25",X"D1",X"28",X"D1", + X"FF",X"D1",X"FF",X"1B",X"D1",X"1D",X"D1",X"1F",X"D1",X"20",X"D1",X"22",X"D1",X"24",X"D1",X"26", + X"D1",X"27",X"D1",X"FF",X"D1",X"FF",X"27",X"D1",X"26",X"D1",X"24",X"D1",X"22",X"D1",X"20",X"D1", + X"1F",X"D1",X"1D",X"D1",X"1B",X"D1",X"FF",X"D1",X"FF",X"1B",X"E2",X"1D",X"F1",X"1B",X"E2",X"1D", + X"F1",X"27",X"D0",X"FF",X"C1",X"D1",X"41",X"D1",X"00",X"DF",X"FF",X"03",X"E1",X"0A",X"E2",X"FF", + X"27",X"E0",X"29",X"D0",X"2B",X"D0",X"2C",X"E0",X"2C",X"D2",X"FF",X"EF",X"2E",X"A1",X"00",X"EF", + X"2E",X"D1",X"00",X"EF",X"2E",X"D1",X"00",X"EF",X"2E",X"D1",X"00",X"EF",X"2E",X"A1",X"00",X"EF", + X"2E",X"D1",X"00",X"EF",X"2E",X"D1",X"00",X"EF",X"2E",X"D1",X"00",X"EF",X"2E",X"A1",X"00",X"EF", + X"FF",X"18",X"A2",X"18",X"E2",X"16",X"D2",X"16",X"E2",X"18",X"A2",X"18",X"E2",X"16",X"D2",X"16", + X"E2",X"18",X"B2",X"1A",X"D2",X"1A",X"E2",X"1B",X"D2",X"1B",X"E2",X"1B",X"92",X"1A",X"C1",X"1A", + X"E1",X"00",X"EF",X"1A",X"D1",X"1A",X"E1",X"18",X"D1",X"18",X"E1",X"1A",X"D1",X"1A",X"E1",X"1B", + X"B1",X"1D",X"D1",X"1D",X"E1",X"1D",X"71",X"FF",X"14",X"A4",X"14",X"E4",X"13",X"D4",X"13",X"E4", + X"14",X"A4",X"14",X"E4",X"13",X"D4",X"13",X"E4",X"14",X"B4",X"16",X"D4",X"16",X"E4",X"18",X"D4", + X"18",X"E4",X"18",X"94",X"16",X"C4",X"16",X"E4",X"00",X"EF",X"16",X"D4",X"16",X"E4",X"15",X"D4", + X"15",X"E4",X"16",X"D4",X"16",X"E4",X"18",X"B4",X"1A",X"D4",X"1A",X"E4",X"1A",X"74",X"FF",X"08", + X"A4",X"00",X"EF",X"08",X"D4",X"00",X"EF",X"08",X"94",X"08",X"A4",X"00",X"EF",X"08",X"D4",X"00", + X"EF",X"08",X"94",X"0A",X"A4",X"00",X"EF",X"0A",X"D4",X"00",X"EF",X"0A",X"94",X"0A",X"A4",X"00", + X"EF",X"0A",X"D4",X"00",X"EF",X"0A",X"94",X"FF",X"08",X"A4",X"00",X"EF",X"08",X"D4",X"00",X"EF", + X"08",X"94",X"08",X"A4",X"00",X"EF",X"08",X"D4",X"00",X"EF",X"08",X"94",X"0A",X"A4",X"00",X"EF", + X"0A",X"D4",X"00",X"EF",X"0A",X"94",X"0A",X"A4",X"00",X"EF",X"0A",X"D4",X"00",X"EF",X"0A",X"94", + X"FF",X"27",X"C1",X"1B",X"C1",X"1F",X"C1",X"22",X"C1",X"27",X"C1",X"2B",X"C1",X"27",X"C1",X"FF", + X"0F",X"C1",X"16",X"C1",X"1B",X"C1",X"1F",X"C1",X"13",X"C1",X"22",X"C1",X"1F",X"C1",X"FF",X"22", + X"C1",X"20",X"C1",X"1F",X"C1",X"1D",X"C1",X"1B",X"C1",X"1A",X"C1",X"1B",X"A1",X"FF",X"1F",X"C1", + X"1D",X"0C",X"1B",X"0C",X"1A",X"C1",X"18",X"C1",X"16",X"C1",X"18",X"A1",X"FF",X"1B",X"D1",X"1D", + X"D1",X"1F",X"D1",X"20",X"D1",X"22",X"D1",X"24",X"D1",X"26",X"D1",X"27",X"D1",X"FF",X"27",X"D1", + X"26",X"D1",X"24",X"D1",X"22",X"D1",X"20",X"D1",X"1F",X"D1",X"1D",X"D1",X"1B",X"D1",X"FF",X"1F", + X"92",X"1D",X"C2",X"1F",X"92",X"1D",X"C2",X"1B",X"D2",X"1B",X"E2",X"00",X"EF",X"1B",X"A2",X"1A", + X"C2",X"18",X"92",X"18",X"D2",X"18",X"E2",X"00",X"EF",X"18",X"B2",X"18",X"E2",X"00",X"EF",X"18", + X"A2",X"1B",X"C2",X"1F",X"A2",X"1D",X"C2",X"1D",X"42",X"FF",X"E1",X"00",X"03",X"A4",X"03",X"D4", + X"03",X"E4",X"00",X"EF",X"03",X"D4",X"03",X"E4",X"00",X"EF",X"07",X"84",X"0C",X"A4",X"0C",X"D4", + X"0C",X"E4",X"00",X"EF",X"0C",X"D4",X"0C",X"E4",X"00",X"EF",X"0C",X"84",X"FF",X"1B",X"81",X"18", + X"A2",X"1B",X"D2",X"1B",X"E2",X"00",X"EF",X"1B",X"D2",X"1B",X"E2",X"00",X"EF",X"1B",X"D2",X"1B", + X"E2",X"00",X"EF",X"1B",X"C2",X"18",X"C2",X"16",X"C2",X"18",X"C2",X"16",X"C2",X"13",X"D2",X"13", + X"E2",X"00",X"EF",X"13",X"D2",X"13",X"E2",X"00",X"EF",X"13",X"82",X"11",X"B2",X"11",X"E2",X"00", + X"EF",X"11",X"D2",X"11",X"E2",X"00",X"EF",X"11",X"D2",X"11",X"E2",X"00",X"EF",X"11",X"D2",X"11", + X"E2",X"00",X"EF",X"11",X"B2",X"11",X"E2",X"00",X"EF",X"11",X"C2",X"16",X"D2",X"16",X"E2",X"00", + X"EF",X"16",X"C2",X"18",X"C2",X"16",X"D2",X"16",X"E2",X"00",X"EF",X"16",X"82",X"FF",X"B1",X"18", + X"08",X"A4",X"08",X"D4",X"08",X"E4",X"00",X"EF",X"08",X"D4",X"08",X"E4",X"00",X"EF",X"08",X"84", + X"03",X"A4",X"03",X"D4",X"03",X"E4",X"00",X"EF",X"03",X"D4",X"03",X"E4",X"00",X"EF",X"03",X"84", + X"05",X"A4",X"05",X"D4",X"05",X"E4",X"00",X"EF",X"05",X"D4",X"05",X"E4",X"00",X"EF",X"05",X"84", + X"0A",X"A4",X"0A",X"D4",X"0A",X"E4",X"00",X"EF",X"0A",X"D4",X"0A",X"E4",X"00",X"EF",X"0A",X"84", + X"FF",X"11",X"E1",X"1B",X"D0",X"00",X"CF",X"18",X"D0",X"00",X"CF",X"14",X"D0",X"00",X"CF",X"0F", + X"D0",X"00",X"CF",X"11",X"B2",X"13",X"B1",X"14",X"B0",X"13",X"D0",X"11",X"D1",X"0F",X"D2",X"0E", + X"D3",X"0C",X"D4",X"0A",X"D5",X"08",X"A0",X"24",X"C4",X"25",X"C2",X"24",X"C1",X"25",X"C2",X"24", + X"C4",X"25",X"C8",X"24",X"C4",X"25",X"C2",X"24",X"C1",X"25",X"C2",X"24",X"C4",X"25",X"C8",X"24", + X"C4",X"25",X"C2",X"24",X"C1",X"25",X"C2",X"24",X"C4",X"25",X"C8",X"FF",X"A1",X"14",X"A1",X"16", + X"A1",X"18",X"C0",X"16",X"18",X"D0",X"00",X"CF",X"14",X"D0",X"00",X"CF",X"11",X"D0",X"00",X"CF", + X"0C",X"D0",X"00",X"CF",X"0E",X"B2",X"0F",X"B1",X"11",X"B0",X"0F",X"D0",X"0E",X"D1",X"0C",X"D2", + X"0A",X"D3",X"08",X"D4",X"07",X"D5",X"05",X"A0",X"27",X"C4",X"28",X"C2",X"27",X"C1",X"28",X"C2", + X"27",X"C4",X"28",X"C8",X"27",X"C4",X"28",X"C2",X"27",X"C1",X"28",X"C2",X"27",X"C4",X"28",X"C8", + X"27",X"C4",X"28",X"C2",X"27",X"C1",X"28",X"C2",X"27",X"C4",X"28",X"C8",X"FF",X"1F",X"A1",X"1D", + X"C1",X"1D",X"41",X"FF",X"0E",X"17",X"F0",X"16",X"F0",X"15",X"F0",X"14",X"F0",X"16",X"F0",X"15", + X"F0",X"14",X"F0",X"13",X"F0",X"15",X"F0",X"14",X"F0",X"13",X"F0",X"12",X"F0",X"14",X"F0",X"13", + X"F0",X"12",X"F0",X"11",X"F0",X"13",X"F0",X"12",X"F0",X"11",X"F0",X"10",X"F0",X"12",X"F0",X"11", + X"F0",X"10",X"F0",X"0F",X"F0",X"11",X"F0",X"10",X"F0",X"0F",X"F0",X"0E",X"F0",X"10",X"F0",X"0F", + X"F0",X"0E",X"F0",X"0D",X"F0",X"0F",X"F0",X"0E",X"F0",X"0D",X"F0",X"0C",X"F0",X"0E",X"F0",X"0D", + X"F0",X"0C",X"F0",X"0B",X"F0",X"FF",X"13",X"F0",X"12",X"F0",X"11",X"F0",X"10",X"F0",X"12",X"F0", + X"11",X"F0",X"10",X"F0",X"0F",X"F0",X"11",X"F0",X"10",X"F0",X"0F",X"F0",X"0E",X"F0",X"10",X"F0", + X"0F",X"F0",X"0E",X"F0",X"0D",X"F0",X"0F",X"F0",X"0E",X"F0",X"0D",X"F0",X"0C",X"F0",X"0E",X"F0", + X"0D",X"F0",X"0C",X"F0",X"0B",X"F0",X"0D",X"F0",X"0C",X"F0",X"0B",X"F0",X"0A",X"F0",X"0C",X"F0", + X"0B",X"F0",X"0A",X"F0",X"09",X"F0",X"0B",X"F0",X"0A",X"F0",X"09",X"F0",X"08",X"F0",X"0A",X"F0", + X"09",X"F0",X"08",X"F0",X"07",X"F0",X"FF",X"20",X"D1",X"22",X"D1",X"24",X"D1",X"27",X"D1",X"29", + X"D1",X"27",X"D1",X"24",X"D1",X"22",X"D1",X"20",X"D1",X"00",X"AF",X"1B",X"C0",X"00",X"CF",X"16", + X"C1",X"00",X"CF",X"1B",X"C0",X"00",X"CF",X"16",X"C1",X"00",X"CF",X"1F",X"B0",X"1D",X"D1",X"1B", + X"D0",X"1B",X"D0",X"1B",X"D0",X"16",X"D0",X"18",X"C1",X"1A",X"C1",X"1B",X"C1",X"1D",X"C1",X"1F", + X"C0",X"00",X"CF",X"21",X"C0",X"00",X"CF",X"22",X"C0",X"00",X"9F",X"22",X"D0",X"24",X"D0",X"00", + X"CF",X"24",X"D0",X"26",X"D0",X"00",X"CF",X"26",X"D0",X"27",X"D0",X"FF",X"15",X"E8",X"00",X"EF", + X"15",X"B8",X"15",X"E8",X"00",X"EF",X"15",X"C8",X"18",X"A8",X"1B",X"D8",X"1B",X"E8",X"00",X"EF", + X"1B",X"68",X"1A",X"68",X"FF",X"00",X"4F",X"00",X"4F",X"00",X"4F",X"00",X"4F",X"0F",X"68",X"0E", + X"68",X"0C",X"68",X"0E",X"68",X"0F",X"88",X"0F",X"21",X"D1",X"23",X"D1",X"25",X"D1",X"28",X"D1", + X"2A",X"D1",X"28",X"D1",X"25",X"D1",X"23",X"D1",X"21",X"D1",X"00",X"AF",X"0A",X"C0",X"00",X"CF", + X"0F",X"C1",X"00",X"CF",X"0A",X"C0",X"00",X"CF",X"0F",X"C1",X"00",X"CF",X"16",X"B0",X"14",X"D1", + X"13",X"D0",X"13",X"D0",X"13",X"D0",X"0F",X"D0",X"14",X"C1",X"11",X"C1",X"13",X"C1",X"14",X"C1", + X"0F",X"C0",X"00",X"CF",X"11",X"C0",X"00",X"CF",X"16",X"C0",X"00",X"9F",X"16",X"D0",X"14",X"D0", + X"00",X"CF",X"14",X"D0",X"11",X"D0",X"00",X"CF",X"11",X"D0",X"0F",X"D0",X"FF",X"00",X"EF",X"11", + X"C8",X"0F",X"C8",X"11",X"C8",X"13",X"A8",X"14",X"C8",X"14",X"68",X"16",X"98",X"13",X"C8",X"17", + X"98",X"13",X"D8",X"13",X"E8",X"00",X"EF",X"13",X"D8",X"13",X"E8",X"00",X"EF",X"13",X"A8",X"0F", + X"88",X"11",X"C8",X"11",X"B8",X"11",X"E8",X"00",X"EF",X"00",X"F2",X"03",X"F2",X"06",X"F2",X"09", + X"F2",X"0C",X"F2",X"0F",X"F2",X"12",X"F2",X"15",X"F2",X"18",X"F2",X"1B",X"F2",X"1E",X"F2",X"21", + X"F2",X"24",X"F2",X"27",X"F2",X"2A",X"F2",X"FF",X"03",X"F2",X"06",X"F2",X"09",X"F2",X"0C",X"F2", + X"0F",X"F2",X"12",X"F2",X"15",X"F2",X"18",X"F2",X"1B",X"F2",X"1E",X"F2",X"21",X"F2",X"24",X"F2", + X"27",X"F2",X"2A",X"F2",X"2D",X"F2",X"FF",X"03",X"F0",X"04",X"F0",X"05",X"F0",X"06",X"F0",X"07", + X"F0",X"08",X"F0",X"09",X"F0",X"0A",X"F0",X"0B",X"F0",X"0C",X"F0",X"0D",X"F0",X"0E",X"F0",X"09", + X"F0",X"0A",X"F0",X"0B",X"F0",X"0C",X"F0",X"0D",X"F0",X"0E",X"F0",X"0F",X"F0",X"10",X"F0",X"11", + X"F0",X"12",X"F0",X"13",X"F0",X"14",X"F0",X"0F",X"F0",X"10",X"F0",X"11",X"F0",X"12",X"F0",X"13", + X"F0",X"14",X"F0",X"15",X"F0",X"16",X"F0",X"17",X"F0",X"18",X"F0",X"19",X"F0",X"1A",X"F0",X"15", + X"F0",X"16",X"F0",X"17",X"F0",X"18",X"F0",X"19",X"F0",X"1A",X"F0",X"1B",X"F0",X"1C",X"F0",X"1D", + X"F0",X"1E",X"F0",X"1F",X"F0",X"20",X"F0",X"1B",X"F0",X"1C",X"F0",X"1D",X"F0",X"1E",X"F0",X"1F", + X"F0",X"20",X"F0",X"21",X"F0",X"22",X"F0",X"23",X"F0",X"24",X"F0",X"25",X"F0",X"26",X"F0",X"21", + X"F0",X"22",X"F0",X"23",X"F0",X"24",X"F0",X"25",X"F0",X"26",X"F0",X"27",X"F0",X"28",X"F0",X"29", + X"F0",X"2A",X"F0",X"2B",X"F0",X"2C",X"F0",X"27",X"F0",X"28",X"F0",X"29",X"F0",X"2A",X"F0",X"2B", + X"F0",X"2C",X"F0",X"2D",X"F0",X"2E",X"F0",X"2F",X"F0",X"30",X"F0",X"31",X"F0",X"32",X"F0",X"FF", + X"00",X"EF",X"FF",X"EF",X"03",X"D4",X"03",X"E4",X"00",X"EF",X"03",X"C4",X"05",X"C4",X"07",X"A4", + X"08",X"A8",X"08",X"D8",X"08",X"E8",X"00",X"EF",X"08",X"D8",X"08",X"E8",X"00",X"EF",X"08",X"98", + X"08",X"D8",X"08",X"E8",X"00",X"EF",X"08",X"A8",X"08",X"D8",X"08",X"E8",X"00",X"EF",X"08",X"D8", + X"08",X"E8",X"00",X"EF",X"08",X"88",X"03",X"A8",X"03",X"D8",X"03",X"E8",X"00",X"EF",X"03",X"D8", + X"03",X"E8",X"00",X"EF",X"03",X"98",X"03",X"D8",X"03",X"E8",X"00",X"EF",X"03",X"A8",X"03",X"D8", + X"03",X"00",X"EF",X"FF",X"03",X"D8",X"03",X"E8",X"00",X"EF",X"03",X"88",X"08",X"A8",X"08",X"D8", + X"08",X"E8",X"00",X"EF",X"08",X"D8",X"08",X"E8",X"00",X"EF",X"08",X"98",X"08",X"D8",X"08",X"E8", + X"00",X"EF",X"08",X"A8",X"08",X"D8",X"08",X"E8",X"00",X"EF",X"08",X"D8",X"08",X"E8",X"00",X"EF", + X"08",X"88",X"0A",X"A8",X"0A",X"D8",X"0A",X"E8",X"00",X"EF",X"0A",X"D8",X"0A",X"E8",X"00",X"EF", + X"0A",X"98",X"0A",X"D8",X"0A",X"E8",X"00",X"EF",X"0A",X"A8",X"0A",X"D8",X"0A",X"E8",X"00",X"EF", + X"0A",X"D8",X"03",X"A4",X"03",X"D4",X"03",X"E4",X"00",X"EF",X"03",X"D4",X"03",X"E4",X"00",X"EF", + X"07",X"84",X"0C",X"A4",X"0C",X"D4",X"0C",X"E4",X"00",X"EF",X"0C",X"D4",X"0C",X"E4",X"00",X"EF", + X"0C",X"84",X"05",X"B4",X"05",X"E4",X"00",X"EF",X"05",X"B4",X"05",X"E4",X"00",X"EF",X"05",X"D4", + X"05",X"E4",X"00",X"EF",X"05",X"B4",X"05",X"E4",X"00",X"EF",X"05",X"C4",X"0A",X"B4",X"0A",X"E4", + X"00",X"EF",X"0A",X"B4",X"0A",X"E4",X"00",X"EF",X"0A",X"B4",X"0A",X"E4",X"00",X"EF",X"0A",X"B4", + X"0A",X"E4",X"00",X"EF",X"0A",X"D4",X"0A",X"E4",X"00",X"EF",X"0A",X"B4",X"0A",X"E4",X"00",X"EF", + X"0A",X"D4",X"0A",X"E4",X"00",X"EF",X"0A",X"84",X"FF",X"E8",X"00",X"EF",X"0A",X"88",X"FF",X"27", + X"E0",X"29",X"D0",X"2B",X"D0",X"2C",X"E0",X"2C",X"D2",X"FF",X"03",X"C1",X"05",X"C1",X"C1",X"A1", + X"FF",X"18",X"B0",X"FF",X"04",X"D1",X"00",X"DF",X"04",X"D1",X"00",X"DF",X"04",X"D1",X"00",X"DF", + X"00",X"B1",X"FF",X"1C",X"D1",X"00",X"DF",X"1C",X"D1",X"00",X"DF",X"1C",X"D1",X"00",X"DF",X"18", + X"B1",X"FF",X"0A",X"B2",X"0C",X"B4",X"0A",X"B2",X"0C",X"B4",X"0A",X"C2",X"00",X"CF",X"0E",X"C4", + X"00",X"CF",X"0F",X"B8",X"00",X"BF",X"0F",X"91",X"FF",X"00",X"5F",X"00",X"CF",X"13",X"91",X"FF", + X"00",X"5F",X"00",X"CF",X"16",X"91",X"FF",X"00",X"DF",X"00",X"EF",X"03",X"B1",X"00",X"BF",X"13", + X"D4",X"13",X"E4",X"00",X"DF",X"00",X"EF",X"13",X"D4",X"13",X"E4",X"00",X"DF",X"00",X"EF",X"0F", + X"B4",X"00",X"BF",X"0A",X"D1",X"0A",X"E1",X"00",X"DF",X"00",X"EF",X"0A",X"D1",X"0A",X"E1",X"FF", + X"00",X"DF",X"0F",X"C1",X"00",X"CF",X"1F",X"D4",X"00",X"DF",X"1F",X"D4",X"00",X"DF",X"1B",X"C4", + X"00",X"CF",X"16",X"D1",X"00",X"DF",X"16",X"D1",X"FF",X"00",X"EF",X"1B",X"D1",X"00",X"DF",X"2B", + X"E4",X"00",X"EF",X"2B",X"E4",X"00",X"EF",X"27",X"D4",X"00",X"DF",X"22",X"E1",X"00",X"EF",X"22", + X"E1",X"FF",X"C5",X"47",X"3E",X"01",X"05",X"28",X"05",X"CB",X"27",X"C3",X"36",X"17",X"C1",X"C9", + X"D5",X"F5",X"78",X"3D",X"5F",X"CB",X"27",X"83",X"DD",X"21",X"04",X"60",X"5F",X"16",X"00",X"DD", + X"19",X"F1",X"D1",X"C9",X"C9",X"21",X"00",X"70",X"06",X"04",X"0E",X"00",X"C5",X"06",X"FF",X"3A", + X"01",X"90",X"CB",X"77",X"20",X"F9",X"71",X"23",X"10",X"F5",X"C1",X"10",X"EF",X"C9",X"3E",X"9F", + X"32",X"00",X"B0",X"32",X"00",X"C0",X"3E",X"BF",X"32",X"00",X"B0",X"32",X"00",X"C0",X"3E",X"DF", + X"32",X"00",X"B0",X"32",X"00",X"C0",X"3E",X"FF",X"32",X"00",X"B0",X"32",X"00",X"C0",X"C9",X"21", + X"5F",X"60",X"CB",X"66",X"CA",X"A1",X"17",X"21",X"00",X"60",X"AF",X"77",X"23",X"77",X"23",X"77", + X"C9",X"DD",X"E5",X"21",X"00",X"60",X"7E",X"E6",X"FF",X"C2",X"E5",X"17",X"23",X"7E",X"E6",X"FF", + X"C2",X"D0",X"17",X"23",X"7E",X"E6",X"FF",X"CA",X"BF",X"18",X"06",X"10",X"CB",X"1F",X"D2",X"C4", + X"17",X"CD",X"FA",X"17",X"04",X"08",X"78",X"FE",X"18",X"CA",X"BF",X"18",X"08",X"C3",X"BC",X"17", + X"06",X"08",X"CB",X"1F",X"D2",X"DA",X"17",X"CD",X"FA",X"17",X"04",X"08",X"78",X"FE",X"10",X"28", + X"D2",X"08",X"C3",X"D2",X"17",X"06",X"00",X"CB",X"1F",X"D2",X"EF",X"17",X"CD",X"FA",X"17",X"04", + X"08",X"78",X"FE",X"08",X"28",X"B6",X"08",X"C3",X"E7",X"17",X"C5",X"F5",X"E5",X"21",X"6D",X"1B", + X"CB",X"20",X"48",X"06",X"00",X"09",X"46",X"23",X"4E",X"68",X"61",X"46",X"23",X"4F",X"78",X"E6", + X"FF",X"CA",X"AF",X"18",X"79",X"5E",X"23",X"56",X"23",X"DD",X"21",X"03",X"60",X"1A",X"E6",X"C0", + X"CA",X"46",X"18",X"DD",X"7E",X"00",X"CB",X"77",X"20",X"0C",X"ED",X"53",X"16",X"60",X"DD",X"CB", + X"00",X"F6",X"05",X"C3",X"0D",X"18",X"05",X"CB",X"7F",X"20",X"D2",X"ED",X"53",X"19",X"60",X"DD", + X"CB",X"00",X"FE",X"C3",X"0D",X"18",X"DD",X"7E",X"00",X"CB",X"47",X"C2",X"5A",X"18",X"ED",X"53", + X"04",X"60",X"DD",X"CB",X"00",X"C6",X"05",X"C3",X"0D",X"18",X"CB",X"4F",X"C2",X"6B",X"18",X"ED", + X"53",X"07",X"60",X"DD",X"CB",X"00",X"CE",X"05",X"C3",X"0D",X"18",X"CB",X"57",X"C2",X"7C",X"18", + X"ED",X"53",X"0A",X"60",X"DD",X"CB",X"00",X"D6",X"05",X"C3",X"0D",X"18",X"CB",X"5F",X"C2",X"8D", + X"18",X"ED",X"53",X"0D",X"60",X"DD",X"CB",X"00",X"DE",X"05",X"C3",X"0D",X"18",X"CB",X"67",X"C2", + X"9E",X"18",X"ED",X"53",X"10",X"60",X"DD",X"CB",X"00",X"E6",X"05",X"C3",X"0D",X"18",X"05",X"CB", + X"6F",X"C2",X"0D",X"18",X"ED",X"53",X"13",X"60",X"DD",X"CB",X"00",X"EE",X"C3",X"0D",X"18",X"E1", + X"F1",X"C1",X"08",X"78",X"E6",X"07",X"3C",X"CD",X"32",X"17",X"2F",X"A6",X"77",X"08",X"C9",X"3A", + X"03",X"60",X"06",X"06",X"DD",X"21",X"04",X"60",X"CB",X"3F",X"DA",X"DA",X"18",X"DD",X"23",X"DD", + X"23",X"DD",X"23",X"05",X"CA",X"CF",X"19",X"C3",X"C8",X"18",X"08",X"DD",X"7E",X"02",X"FE",X"00", + X"28",X"07",X"DD",X"35",X"02",X"08",X"C3",X"CD",X"18",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"7E", + X"FE",X"FF",X"C2",X"3E",X"19",X"3E",X"06",X"90",X"FE",X"03",X"38",X"14",X"D6",X"03",X"CB",X"27", + X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"F6",X"9F",X"32",X"00",X"C0",X"C3",X"1F",X"19", + X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"F6",X"9F",X"32",X"00",X"B0",X"3E", + X"06",X"90",X"57",X"1E",X"01",X"7A",X"FE",X"00",X"28",X"06",X"15",X"CB",X"23",X"C3",X"25",X"19", + X"7B",X"2F",X"5F",X"3A",X"03",X"60",X"A3",X"32",X"03",X"60",X"08",X"C3",X"CD",X"18",X"3E",X"06", + X"90",X"FE",X"03",X"FA",X"9A",X"19",X"D6",X"03",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27", + X"CB",X"27",X"F6",X"80",X"4F",X"FD",X"21",X"07",X"1B",X"7E",X"E6",X"3F",X"CB",X"27",X"5F",X"16", + X"00",X"FD",X"19",X"FD",X"7E",X"00",X"B1",X"32",X"00",X"C0",X"FD",X"7E",X"01",X"32",X"00",X"C0", + X"23",X"3E",X"00",X"ED",X"67",X"B1",X"CB",X"E7",X"32",X"00",X"C0",X"3E",X"00",X"ED",X"6F",X"FD", + X"21",X"F7",X"1A",X"23",X"DD",X"75",X"00",X"DD",X"74",X"01",X"5F",X"16",X"00",X"FD",X"19",X"FD", + X"7E",X"00",X"3D",X"DD",X"77",X"02",X"08",X"C3",X"CD",X"18",X"CB",X"27",X"CB",X"27",X"CB",X"27", + X"CB",X"27",X"CB",X"27",X"F6",X"80",X"4F",X"FD",X"21",X"07",X"1B",X"7E",X"E6",X"3F",X"CB",X"27", + X"5F",X"16",X"00",X"FD",X"19",X"FD",X"7E",X"00",X"B1",X"32",X"00",X"B0",X"FD",X"7E",X"01",X"32", + X"00",X"B0",X"23",X"AF",X"ED",X"67",X"B1",X"CB",X"E7",X"32",X"00",X"B0",X"C3",X"7B",X"19",X"CB", + X"3F",X"38",X"0D",X"DD",X"23",X"DD",X"23",X"DD",X"23",X"CB",X"3F",X"38",X"72",X"C3",X"B7",X"1A", + X"08",X"DD",X"7E",X"02",X"FE",X"00",X"28",X"07",X"DD",X"35",X"02",X"08",X"C3",X"D3",X"19",X"DD", + X"6E",X"00",X"DD",X"66",X"01",X"7E",X"FE",X"FF",X"20",X"11",X"3E",X"FF",X"32",X"00",X"B0",X"3A", + X"03",X"60",X"E6",X"BF",X"32",X"03",X"60",X"08",X"C3",X"D3",X"19",X"06",X"00",X"CB",X"3F",X"CB", + X"10",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"3D",X"CB",X"20",X"CB",X"20", + X"B0",X"F6",X"E0",X"32",X"00",X"B0",X"23",X"3E",X"00",X"ED",X"67",X"F6",X"F0",X"32",X"00",X"B0", + X"3E",X"00",X"ED",X"6F",X"FD",X"21",X"F7",X"1A",X"23",X"DD",X"75",X"00",X"DD",X"74",X"01",X"5F", + X"16",X"00",X"FD",X"19",X"FD",X"7E",X"00",X"3D",X"DD",X"77",X"02",X"08",X"C3",X"D3",X"19",X"DD", + X"7E",X"02",X"FE",X"00",X"28",X"06",X"DD",X"35",X"02",X"C3",X"B7",X"1A",X"DD",X"6E",X"00",X"DD", + X"66",X"01",X"7E",X"FE",X"FF",X"20",X"10",X"3E",X"FF",X"32",X"00",X"C0",X"3A",X"03",X"60",X"E6", + X"7F",X"32",X"03",X"60",X"C3",X"B7",X"1A",X"06",X"00",X"CB",X"3F",X"CB",X"10",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"3D",X"CB",X"20",X"CB",X"20",X"B0",X"F6",X"E0",X"32", + X"00",X"C0",X"23",X"3E",X"00",X"ED",X"67",X"F6",X"F0",X"32",X"00",X"C0",X"3E",X"00",X"ED",X"6F", + X"FD",X"21",X"F7",X"1A",X"23",X"DD",X"75",X"00",X"DD",X"74",X"01",X"5F",X"16",X"00",X"FD",X"19", + X"FD",X"7E",X"00",X"3D",X"DD",X"77",X"02",X"DD",X"E1",X"C9",X"E5",X"F5",X"C5",X"21",X"80",X"D0", + X"3E",X"FF",X"0E",X"18",X"23",X"06",X"1E",X"77",X"23",X"10",X"FC",X"23",X"0D",X"C2",X"C4",X"1A", + X"C1",X"F1",X"E1",X"C9",X"3E",X"00",X"06",X"80",X"21",X"00",X"D0",X"77",X"23",X"10",X"FC",X"0E", + X"00",X"06",X"18",X"77",X"11",X"20",X"00",X"19",X"10",X"F9",X"0C",X"0D",X"C2",X"F6",X"1A",X"0C", + X"21",X"9F",X"D0",X"C3",X"E1",X"1A",X"C9",X"FF",X"E0",X"C0",X"A0",X"80",X"60",X"40",X"30",X"20", + X"18",X"10",X"0C",X"08",X"04",X"02",X"01",X"08",X"3F",X"0F",X"3B",X"09",X"38",X"06",X"35",X"06", + X"32",X"0A",X"2F",X"0E",X"2C",X"06",X"2A",X"00",X"28",X"0C",X"25",X"0A",X"23",X"0A",X"21",X"0C", + X"1F",X"0F",X"1D",X"04",X"1C",X"0B",X"1A",X"03",X"19",X"0D",X"17",X"07",X"16",X"03",X"15",X"00", + X"14",X"0E",X"12",X"0D",X"11",X"0D",X"10",X"0E",X"0F",X"00",X"0F",X"02",X"0E",X"06",X"0D",X"0A", + X"0C",X"0E",X"0B",X"04",X"0B",X"0A",X"0A",X"00",X"0A",X"07",X"09",X"0F",X"08",X"07",X"08",X"0F", + X"07",X"08",X"07",X"01",X"07",X"0B",X"06",X"05",X"06",X"0F",X"05",X"0A",X"05",X"05",X"05",X"00", + X"05",X"0B",X"04",X"07",X"04",X"03",X"04",X"0F",X"03",X"0C",X"03",X"09",X"03",X"91",X"1B",X"D1", + X"1B",X"D6",X"1B",X"9C",X"1B",X"9F",X"1B",X"DB",X"1B",X"A5",X"1B",X"AE",X"1B",X"AE",X"1B",X"B8", + X"1B",X"BD",X"1B",X"C2",X"1B",X"A2",X"1B",X"C7",X"1B",X"99",X"1B",X"CC",X"1B",X"DE",X"1B",X"DE", + X"1B",X"01",X"B4",X"0F",X"02",X"C3",X"0F",X"D6",X"0F",X"01",X"E9",X"0F",X"01",X"F4",X"0F",X"01", + X"FB",X"0F",X"01",X"00",X"10",X"04",X"31",X"10",X"68",X"10",X"9F",X"10",X"C8",X"10",X"02",X"F1", + X"10",X"00",X"11",X"02",X"0F",X"11",X"1E",X"11",X"02",X"2D",X"11",X"3E",X"11",X"02",X"4F",X"11", + X"12",X"16",X"02",X"9F",X"11",X"00",X"12",X"02",X"43",X"12",X"94",X"12",X"02",X"E5",X"12",X"36", + X"13",X"02",X"87",X"13",X"08",X"14",X"02",X"89",X"14",X"A8",X"14",X"01",X"C7",X"14",X"02",X"70", + X"15",X"C1",X"15",X"19",X"17",X"06",X"03",X"0E",X"00",X"C5",X"06",X"00",X"CD",X"FC",X"1B",X"C1", + X"10",X"02",X"18",X"04",X"0C",X"C5",X"18",X"F2",X"CD",X"6A",X"1C",X"C9",X"DD",X"21",X"55",X"0C", + X"16",X"00",X"78",X"FE",X"02",X"20",X"02",X"1E",X"02",X"79",X"CB",X"27",X"CB",X"27",X"D5",X"16", + X"00",X"5F",X"DD",X"19",X"D1",X"DD",X"5E",X"00",X"C5",X"DD",X"46",X"03",X"CB",X"38",X"CB",X"38", + X"CB",X"38",X"CB",X"38",X"DD",X"6E",X"01",X"DD",X"66",X"02",X"73",X"D5",X"11",X"20",X"00",X"19", + X"D1",X"10",X"F7",X"CB",X"42",X"20",X"15",X"14",X"DD",X"6E",X"01",X"DD",X"66",X"02",X"23",X"DD", + X"46",X"03",X"CB",X"38",X"CB",X"38",X"CB",X"38",X"CB",X"38",X"18",X"DE",X"C1",X"78",X"FE",X"00", + X"20",X"17",X"04",X"C5",X"01",X"20",X"00",X"DD",X"6E",X"01",X"DD",X"66",X"02",X"09",X"DD",X"7E", + X"03",X"E6",X"0F",X"47",X"1E",X"03",X"C3",X"2A",X"1C",X"C9",X"01",X"00",X"00",X"21",X"9E",X"D0", + X"3E",X"4B",X"77",X"DD",X"21",X"52",X"0C",X"DD",X"09",X"DD",X"46",X"00",X"CD",X"9B",X"1C",X"0C", + X"79",X"FE",X"03",X"20",X"EB",X"21",X"9D",X"D0",X"DD",X"21",X"61",X"0C",X"06",X"18",X"11",X"20", + X"00",X"DD",X"7E",X"00",X"77",X"DD",X"23",X"19",X"10",X"F7",X"C9",X"3C",X"11",X"20",X"00",X"19", + X"77",X"19",X"10",X"FC",X"C9",X"23",X"CB",X"7E",X"28",X"FC",X"CB",X"7E",X"20",X"FC",X"E5",X"CD", + X"3A",X"03",X"CD",X"8F",X"17",X"E1",X"CB",X"7E",X"28",X"FC",X"C9",X"C5",X"47",X"3E",X"01",X"10", + X"02",X"C1",X"C9",X"07",X"18",X"F7",X"16",X"00",X"3A",X"62",X"60",X"FE",X"00",X"28",X"04",X"1E", + X"06",X"18",X"02",X"1E",X"05",X"0E",X"00",X"06",X"0C",X"21",X"1C",X"D6",X"73",X"CD",X"24",X"1D", + X"04",X"3E",X"17",X"B8",X"20",X"0A",X"0C",X"3E",X"04",X"B9",X"20",X"02",X"0E",X"00",X"06",X"00", + X"3E",X"00",X"B9",X"20",X"05",X"3E",X"0C",X"B8",X"28",X"1E",X"3A",X"60",X"60",X"B9",X"20",X"15", + X"3A",X"61",X"60",X"B8",X"20",X"0F",X"22",X"63",X"60",X"14",X"3A",X"62",X"60",X"FE",X"00",X"28", + X"03",X"1D",X"18",X"01",X"1C",X"C3",X"DC",X"1C",X"AF",X"BA",X"20",X"07",X"3A",X"62",X"60",X"2F", + X"32",X"62",X"60",X"C9",X"D5",X"CB",X"41",X"28",X"0A",X"CB",X"49",X"28",X"03",X"23",X"18",X"10", + X"2B",X"18",X"0D",X"CB",X"49",X"28",X"05",X"11",X"E0",X"FF",X"18",X"03",X"11",X"20",X"00",X"19", + X"D1",X"C9",X"3E",X"52",X"0E",X"00",X"21",X"9C",X"D0",X"08",X"3E",X"4E",X"06",X"16",X"77",X"CD", + X"24",X"1D",X"08",X"77",X"CD",X"24",X"1D",X"10",X"FA",X"FE",X"55",X"28",X"06",X"3C",X"08",X"3C", + X"0C",X"18",X"E9",X"C9",X"11",X"20",X"00",X"21",X"A3",X"D4",X"3E",X"01",X"06",X"0C",X"77",X"E5", + X"23",X"77",X"E1",X"19",X"10",X"F8",X"C9",X"11",X"20",X"00",X"3A",X"65",X"60",X"FE",X"00",X"28", + X"05",X"3A",X"67",X"60",X"18",X"03",X"3A",X"66",X"60",X"FE",X"07",X"38",X"02",X"3E",X"06",X"47", + X"AF",X"08",X"3E",X"06",X"90",X"4F",X"C5",X"21",X"A3",X"D0",X"3E",X"E1",X"32",X"C8",X"61",X"AF", + X"B8",X"3A",X"C8",X"61",X"28",X"08",X"77",X"3C",X"19",X"77",X"3D",X"19",X"10",X"F8",X"3E",X"FF", + X"41",X"CB",X"20",X"32",X"C8",X"61",X"AF",X"B8",X"3A",X"C8",X"61",X"28",X"04",X"77",X"19",X"10", + X"FC",X"08",X"FE",X"FF",X"28",X"0A",X"2F",X"08",X"21",X"A4",X"D0",X"3E",X"E3",X"C1",X"18",X"CC", + X"C9",X"AF",X"CD",X"4C",X"1E",X"11",X"20",X"00",X"3A",X"5F",X"60",X"CB",X"4F",X"28",X"13",X"21", + X"43",X"D2",X"36",X"02",X"19",X"36",X"17",X"19",X"C3",X"31",X"49",X"DD",X"21",X"6B",X"60",X"CD", + X"06",X"1E",X"21",X"44",X"D2",X"36",X"01",X"19",X"36",X"1C",X"19",X"C3",X"3A",X"49",X"DD",X"21", + X"68",X"60",X"CD",X"06",X"1E",X"C9",X"D5",X"C5",X"E5",X"06",X"03",X"21",X"DA",X"61",X"E5",X"DD", + X"7E",X"00",X"4F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"77",X"23",X"79",X"E6",X"0F", + X"77",X"DD",X"23",X"23",X"10",X"E9",X"E1",X"06",X"05",X"AF",X"BE",X"20",X"05",X"36",X"FF",X"23", + X"10",X"F8",X"E1",X"DD",X"E5",X"DD",X"21",X"DA",X"61",X"11",X"20",X"00",X"06",X"06",X"DD",X"7E", + X"00",X"77",X"DD",X"23",X"19",X"10",X"F7",X"DD",X"E1",X"C1",X"D1",X"C9",X"F5",X"C5",X"E5",X"FE", + X"00",X"20",X"14",X"3E",X"03",X"21",X"44",X"D6",X"06",X"0A",X"CD",X"7D",X"1E",X"21",X"43",X"D6", + X"06",X"0A",X"CD",X"7D",X"1E",X"18",X"12",X"3A",X"65",X"60",X"FE",X"00",X"20",X"07",X"21",X"44", + X"D6",X"3E",X"04",X"18",X"EB",X"3E",X"04",X"18",X"E4",X"E1",X"C1",X"F1",X"C9",X"C5",X"D5",X"E5", + X"11",X"20",X"00",X"77",X"19",X"10",X"FC",X"E1",X"D1",X"C1",X"C9",X"21",X"E2",X"D4",X"3E",X"07", + X"06",X"03",X"CD",X"7D",X"1E",X"21",X"E2",X"D0",X"36",X"1D",X"11",X"20",X"00",X"19",X"36",X"18", + X"19",X"36",X"19",X"19",X"4F",X"06",X"01",X"CD",X"BD",X"25",X"C9",X"FF",X"FF",X"2F",X"1E",X"17", + X"12",X"1F",X"0E",X"1B",X"1C",X"0A",X"15",X"06",X"09",X"21",X"80",X"D3",X"DD",X"21",X"AB",X"1E", + X"C5",X"06",X"0C",X"DD",X"7E",X"00",X"77",X"23",X"DD",X"23",X"10",X"F7",X"C1",X"10",X"ED",X"06", + X"09",X"21",X"73",X"60",X"36",X"01",X"23",X"36",X"00",X"23",X"36",X"00",X"23",X"10",X"F5",X"C9", + X"21",X"A1",X"D1",X"11",X"20",X"00",X"36",X"19",X"19",X"36",X"0A",X"19",X"36",X"1B",X"19",X"36", + X"1D",X"19",X"18",X"06",X"21",X"21",X"D2",X"11",X"20",X"00",X"CD",X"26",X"1F",X"FE",X"00",X"28", + X"24",X"FE",X"64",X"38",X"08",X"36",X"09",X"19",X"36",X"09",X"C3",X"25",X"1F",X"06",X"00",X"0E", + X"0A",X"B9",X"38",X"04",X"91",X"04",X"18",X"F9",X"08",X"AF",X"B8",X"28",X"03",X"70",X"18",X"02", + X"36",X"FF",X"19",X"08",X"77",X"C9",X"3A",X"65",X"60",X"CB",X"4F",X"28",X"05",X"3A",X"6F",X"60", + X"18",X"03",X"3A",X"6E",X"60",X"C9",X"3A",X"02",X"90",X"CB",X"7F",X"28",X"04",X"3E",X"03",X"18", + X"02",X"3E",X"05",X"C9",X"CD",X"26",X"1F",X"FE",X"00",X"20",X"04",X"36",X"FF",X"18",X"2F",X"3D", + X"FE",X"12",X"38",X"02",X"3E",X"11",X"16",X"00",X"5F",X"FD",X"21",X"79",X"0C",X"FD",X"19",X"11", + X"20",X"00",X"FD",X"7E",X"00",X"4F",X"E6",X"F0",X"28",X"0A",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F", + X"CB",X"3F",X"77",X"19",X"79",X"E6",X"0F",X"77",X"19",X"36",X"00",X"19",X"36",X"00",X"C9",X"DD", + X"E5",X"CD",X"26",X"1F",X"FE",X"00",X"28",X"07",X"3D",X"FE",X"12",X"38",X"02",X"3E",X"11",X"DD", + X"21",X"93",X"0C",X"4F",X"06",X"00",X"DD",X"09",X"DD",X"46",X"00",X"0E",X"00",X"CB",X"27",X"CB", + X"27",X"81",X"DD",X"E1",X"C9",X"DD",X"7E",X"01",X"FE",X"07",X"D2",X"AF",X"1F",X"3E",X"07",X"D6", + X"07",X"5F",X"CB",X"3B",X"CB",X"3B",X"CB",X"3B",X"CB",X"3B",X"E6",X"0F",X"08",X"7B",X"FE",X"0B", + X"DA",X"C5",X"1F",X"1E",X"0B",X"08",X"C9",X"DD",X"E5",X"CD",X"7D",X"44",X"CD",X"5A",X"2D",X"21", + X"01",X"90",X"CB",X"7E",X"CA",X"D2",X"1F",X"21",X"59",X"60",X"34",X"7E",X"21",X"5A",X"60",X"E6", + X"07",X"20",X"01",X"34",X"CD",X"3A",X"03",X"21",X"4E",X"60",X"AF",X"06",X"0B",X"77",X"23",X"10", + X"FC",X"DD",X"21",X"1C",X"60",X"DD",X"7E",X"00",X"E6",X"03",X"C2",X"0C",X"20",X"04",X"3E",X"0A"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_cpu2.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_cpu2.vhd new file mode 100644 index 00000000..a7f5b86f --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_cpu2.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_cpu2 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 prom of rom_cpu2 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"B8",X"CA",X"03",X"21",X"11",X"05",X"00",X"DD",X"19",X"C3",X"F5",X"1F",X"21",X"5F",X"60",X"CB", + X"4E",X"28",X"20",X"21",X"02",X"90",X"CB",X"6E",X"28",X"19",X"4F",X"3A",X"65",X"60",X"FE",X"00", + X"79",X"28",X"10",X"DD",X"4E",X"02",X"3E",X"FE",X"91",X"4F",X"DD",X"56",X"01",X"3E",X"AE",X"92", + X"C3",X"39",X"20",X"DD",X"7E",X"01",X"DD",X"4E",X"02",X"DD",X"56",X"00",X"CB",X"3A",X"CB",X"3A", + X"CB",X"3A",X"CB",X"3A",X"CD",X"A8",X"1F",X"D5",X"16",X"00",X"FD",X"21",X"4E",X"60",X"FD",X"19", + X"F5",X"FD",X"7E",X"00",X"FD",X"34",X"00",X"C5",X"43",X"04",X"FD",X"21",X"80",X"70",X"11",X"40", + X"00",X"FD",X"19",X"10",X"FC",X"CB",X"27",X"CB",X"27",X"5F",X"FD",X"19",X"C1",X"79",X"D6",X"07", + X"FD",X"77",X"03",X"F1",X"E6",X"0F",X"D1",X"1E",X"00",X"CB",X"52",X"20",X"06",X"CB",X"42",X"28", + X"06",X"CB",X"E7",X"1C",X"C3",X"8D",X"20",X"CB",X"5A",X"20",X"02",X"CB",X"EF",X"21",X"5F",X"60", + X"CB",X"4E",X"28",X"2A",X"21",X"02",X"90",X"CB",X"6E",X"28",X"23",X"32",X"C8",X"61",X"3A",X"65", + X"60",X"FE",X"00",X"3A",X"C8",X"61",X"28",X"16",X"CB",X"67",X"20",X"05",X"CB",X"E7",X"C3",X"B3", + X"20",X"CB",X"A7",X"CB",X"6F",X"20",X"05",X"CB",X"EF",X"C3",X"BE",X"20",X"CB",X"AF",X"F6",X"C0", + X"FD",X"77",X"00",X"DD",X"7E",X"03",X"DD",X"CB",X"04",X"66",X"20",X"2B",X"FE",X"D8",X"30",X"27", + X"08",X"AF",X"BB",X"20",X"06",X"08",X"C6",X"0C",X"C3",X"DC",X"20",X"08",X"08",X"3A",X"5A",X"60", + X"E6",X"03",X"CB",X"47",X"28",X"05",X"16",X"04",X"C3",X"F1",X"20",X"FE",X"02",X"20",X"07",X"16", + X"08",X"08",X"82",X"C3",X"F7",X"20",X"08",X"FD",X"77",X"01",X"DD",X"7E",X"04",X"FD",X"77",X"02", + X"C3",X"FD",X"1F",X"21",X"C0",X"70",X"06",X"0B",X"DD",X"21",X"4E",X"60",X"DD",X"7E",X"00",X"E5", + X"CB",X"27",X"CB",X"27",X"5F",X"16",X"00",X"19",X"72",X"E5",X"D1",X"7B",X"D1",X"D5",X"93",X"FE", + X"20",X"30",X"0D",X"FD",X"E1",X"FD",X"E5",X"11",X"20",X"00",X"FD",X"19",X"AF",X"FD",X"77",X"00", + X"11",X"40",X"00",X"DD",X"23",X"E1",X"19",X"10",X"D3",X"21",X"01",X"90",X"CB",X"7E",X"C2",X"3C", + X"21",X"DD",X"E1",X"C9",X"3E",X"00",X"06",X"16",X"21",X"A6",X"D4",X"11",X"20",X"00",X"C5",X"06", + X"16",X"E5",X"77",X"23",X"10",X"FC",X"E1",X"C1",X"19",X"10",X"F3",X"C9",X"DD",X"21",X"E7",X"D0", + X"3E",X"32",X"11",X"20",X"00",X"DD",X"77",X"01",X"DD",X"77",X"05",X"DD",X"77",X"07",X"DD",X"77", + X"08",X"DD",X"77",X"11",X"3D",X"DD",X"77",X"04",X"DD",X"77",X"0A",X"DD",X"77",X"0C",X"3D",X"DD", + X"77",X"02",X"3C",X"DD",X"19",X"DD",X"77",X"02",X"DD",X"77",X"04",X"DD",X"77",X"0A",X"DD",X"77", + X"0C",X"DD",X"77",X"10",X"DD",X"19",X"3C",X"DD",X"77",X"09",X"DD",X"77",X"0A",X"DD",X"77",X"0D", + X"3C",X"DD",X"77",X"04",X"DD",X"77",X"0C",X"DD",X"77",X"10",X"DD",X"19",X"3D",X"3D",X"DD",X"77", + X"02",X"DD",X"19",X"DD",X"77",X"00",X"3C",X"DD",X"77",X"05",X"DD",X"77",X"0B",X"DD",X"77",X"11", + X"DD",X"77",X"12",X"3C",X"DD",X"77",X"04",X"DD",X"19",X"3D",X"3D",X"DD",X"77",X"00",X"DD",X"19", + X"3C",X"DD",X"77",X"09",X"DD",X"77",X"0A",X"3C",X"DD",X"77",X"00",X"DD",X"19",X"3D",X"3D",X"DD", + X"77",X"04",X"DD",X"77",X"0E",X"DD",X"77",X"12",X"DD",X"19",X"DD",X"77",X"08",X"3C",X"DD",X"77", + X"01",X"DD",X"77",X"02",X"DD",X"77",X"05",X"DD",X"77",X"06",X"DD",X"77",X"09",X"DD",X"77",X"0A", + X"DD",X"77",X"0D",X"DD",X"77",X"0E",X"DD",X"77",X"11",X"DD",X"77",X"12",X"3C",X"DD",X"77",X"00", + X"DD",X"77",X"04",X"DD",X"77",X"0C",X"DD",X"77",X"10",X"DD",X"19",X"3D",X"3D",X"DD",X"77",X"08", + X"DD",X"19",X"3D",X"DD",X"77",X"0E",X"DD",X"77",X"12",X"3C",X"DD",X"77",X"04",X"3C",X"DD",X"77", + X"01",X"DD",X"77",X"05",X"DD",X"77",X"09",X"DD",X"77",X"0A",X"DD",X"77",X"0D",X"DD",X"77",X"11", + X"3C",X"DD",X"77",X"00",X"DD",X"77",X"08",X"DD",X"19",X"3D",X"3D",X"DD",X"77",X"04",X"DD",X"77", + X"0E",X"DD",X"77",X"12",X"DD",X"19",X"DD",X"77",X"00",X"3C",X"DD",X"77",X"09",X"DD",X"77",X"0A", + X"DD",X"19",X"3D",X"DD",X"77",X"00",X"DD",X"19",X"DD",X"77",X"02",X"3C",X"DD",X"77",X"05",X"DD", + X"77",X"0B",X"DD",X"77",X"0C",X"DD",X"77",X"11",X"3C",X"DD",X"77",X"04",X"DD",X"19",X"3D",X"3D", + X"DD",X"77",X"02",X"DD",X"19",X"DD",X"77",X"04",X"DD",X"77",X"0C",X"DD",X"77",X"10",X"3C",X"DD", + X"77",X"09",X"DD",X"77",X"0D",X"3D",X"3D",X"DD",X"77",X"0A",X"DD",X"19",X"3C",X"DD",X"77",X"02", + X"DD",X"77",X"04",X"DD",X"77",X"0A",X"DD",X"77",X"0C",X"DD",X"77",X"10",X"DD",X"19",X"3C",X"DD", + X"77",X"01",X"DD",X"77",X"02",X"DD",X"77",X"05",X"DD",X"77",X"06",X"DD",X"77",X"07",X"DD",X"77", + X"08",X"DD",X"77",X"11",X"DD",X"77",X"12",X"3C",X"DD",X"77",X"00",X"DD",X"77",X"04",X"DD",X"77", + X"0A",X"DD",X"77",X"0C",X"C9",X"E5",X"C5",X"06",X"FF",X"C5",X"06",X"FF",X"C5",X"06",X"FF",X"00", + X"10",X"FD",X"C1",X"10",X"F7",X"C1",X"10",X"F1",X"C1",X"E1",X"C9",X"E5",X"C5",X"E5",X"FE",X"04", + X"38",X"10",X"CB",X"47",X"28",X"06",X"FD",X"21",X"F0",X"0C",X"18",X"52",X"FD",X"21",X"E7",X"0C", + X"18",X"4C",X"0E",X"00",X"CB",X"47",X"28",X"24",X"11",X"E1",X"FF",X"19",X"08",X"7E",X"FE",X"E5", + X"20",X"02",X"CB",X"C1",X"11",X"3E",X"00",X"19",X"7E",X"FE",X"E5",X"20",X"02",X"CB",X"D9",X"F5", + X"79",X"32",X"8E",X"60",X"F1",X"08",X"FD",X"21",X"DE",X"0C",X"18",X"22",X"11",X"21",X"00",X"19", + X"08",X"7E",X"FE",X"E5",X"20",X"02",X"CB",X"C9",X"11",X"BE",X"FF",X"19",X"7E",X"FE",X"E5",X"20", + X"02",X"CB",X"D1",X"F5",X"79",X"32",X"8E",X"60",X"F1",X"08",X"FD",X"21",X"D5",X"0C",X"CD",X"0F", + X"24",X"E1",X"0E",X"00",X"08",X"CB",X"3A",X"CB",X"1B",X"D2",X"DF",X"23",X"79",X"FE",X"00",X"20", + X"05",X"CD",X"D9",X"24",X"18",X"79",X"FE",X"04",X"20",X"05",X"CD",X"8B",X"24",X"18",X"70",X"CD", + X"23",X"24",X"D5",X"FD",X"E5",X"16",X"00",X"3D",X"FE",X"04",X"38",X"01",X"3D",X"5F",X"FD",X"19", + X"FD",X"7E",X"00",X"FD",X"E1",X"D1",X"FE",X"01",X"20",X"40",X"E5",X"21",X"8E",X"60",X"79",X"FE", + X"03",X"20",X"06",X"CB",X"4E",X"28",X"18",X"18",X"1A",X"30",X"06",X"CB",X"46",X"28",X"10",X"18", + X"12",X"FE",X"08",X"20",X"06",X"CB",X"56",X"28",X"06",X"18",X"08",X"CB",X"5E",X"20",X"04",X"3E", + X"FF",X"18",X"14",X"3E",X"E5",X"F5",X"3E",X"02",X"DD",X"E5",X"D5",X"11",X"00",X"04",X"DD",X"19", + X"DD",X"77",X"00",X"D1",X"DD",X"E1",X"F1",X"E1",X"18",X"12",X"F5",X"3E",X"00",X"DD",X"E5",X"D5", + X"11",X"00",X"04",X"DD",X"19",X"DD",X"77",X"00",X"D1",X"DD",X"E1",X"F1",X"DD",X"77",X"00",X"79", + X"FE",X"0A",X"28",X"05",X"0C",X"08",X"C3",X"54",X"23",X"08",X"FE",X"04",X"38",X"0D",X"3E",X"00", + X"32",X"8E",X"60",X"32",X"90",X"60",X"32",X"8F",X"60",X"18",X"11",X"3E",X"09",X"32",X"8F",X"60", + X"3E",X"01",X"32",X"90",X"60",X"E5",X"21",X"00",X"60",X"CB",X"C6",X"E1",X"C1",X"E1",X"C9",X"F5", + X"CB",X"27",X"5F",X"16",X"00",X"DD",X"21",X"F9",X"0C",X"DD",X"19",X"DD",X"56",X"00",X"DD",X"5E", + X"01",X"F1",X"C9",X"D5",X"E5",X"DD",X"E1",X"FE",X"06",X"28",X"3C",X"FE",X"02",X"20",X"04",X"DD", + X"23",X"18",X"34",X"30",X"07",X"11",X"E1",X"FF",X"DD",X"19",X"18",X"2B",X"FE",X"05",X"20",X"05", + X"11",X"E0",X"FF",X"18",X"F3",X"30",X"05",X"11",X"21",X"00",X"18",X"EC",X"FE",X"08",X"20",X"05", + X"11",X"DF",X"FF",X"18",X"E3",X"30",X"05",X"11",X"20",X"00",X"18",X"DC",X"FE",X"09",X"28",X"05", + X"11",X"1F",X"00",X"18",X"D3",X"DD",X"2B",X"D1",X"C9",X"DD",X"21",X"09",X"0D",X"78",X"3D",X"16", + X"00",X"5F",X"DD",X"19",X"DD",X"56",X"00",X"79",X"FE",X"00",X"28",X"0B",X"CB",X"3A",X"CB",X"3A", + X"CB",X"3A",X"CB",X"3A",X"7A",X"18",X"03",X"7A",X"E6",X"0F",X"C9",X"D5",X"E5",X"11",X"C0",X"FF", + X"19",X"CD",X"69",X"24",X"FE",X"02",X"20",X"0D",X"08",X"FE",X"04",X"38",X"04",X"36",X"34",X"18", + X"34",X"36",X"33",X"18",X"30",X"30",X"0D",X"08",X"FE",X"04",X"38",X"04",X"36",X"38",X"18",X"25", + X"36",X"32",X"18",X"21",X"08",X"FE",X"04",X"38",X"0E",X"08",X"7E",X"FE",X"3B",X"20",X"04",X"36", + X"3A",X"18",X"13",X"36",X"34",X"18",X"0F",X"08",X"7E",X"FE",X"3A",X"20",X"04",X"36",X"3B",X"18", + X"05",X"36",X"33",X"18",X"01",X"08",X"E1",X"D1",X"C9",X"D5",X"E5",X"23",X"23",X"CD",X"69",X"24", + X"FE",X"02",X"20",X"0D",X"08",X"FE",X"04",X"38",X"04",X"36",X"3B",X"18",X"34",X"36",X"33",X"18", + X"30",X"30",X"0D",X"08",X"FE",X"04",X"38",X"04",X"36",X"3C",X"18",X"25",X"36",X"31",X"18",X"21", + X"08",X"FE",X"04",X"38",X"0E",X"08",X"7E",X"FE",X"34",X"20",X"04",X"36",X"3A",X"18",X"13",X"36", + X"3B",X"18",X"0F",X"08",X"7E",X"FE",X"3A",X"20",X"04",X"36",X"34",X"18",X"05",X"36",X"33",X"18", + X"01",X"08",X"E1",X"D1",X"C9",X"CD",X"06",X"2B",X"CD",X"BA",X"1A",X"CD",X"55",X"17",X"CD",X"3E", + X"25",X"CD",X"07",X"26",X"CD",X"1D",X"27",X"CD",X"CB",X"27",X"CD",X"26",X"28",X"C9",X"06",X"10", + X"21",X"1E",X"D1",X"DD",X"21",X"D7",X"2E",X"0E",X"06",X"CD",X"B3",X"27",X"21",X"DC",X"D0",X"06", + X"01",X"E5",X"78",X"FE",X"01",X"28",X"08",X"0E",X"03",X"CD",X"B1",X"25",X"77",X"18",X"07",X"0E", + X"07",X"CD",X"B1",X"25",X"36",X"1D",X"11",X"20",X"00",X"19",X"DD",X"21",X"CF",X"2E",X"FE",X"05", + X"30",X"08",X"3D",X"CB",X"27",X"16",X"00",X"5F",X"18",X"03",X"11",X"06",X"00",X"DD",X"19",X"CD", + X"B1",X"25",X"DD",X"7E",X"00",X"77",X"DD",X"23",X"D5",X"11",X"20",X"00",X"19",X"D1",X"CD",X"B1", + X"25",X"DD",X"7E",X"00",X"77",X"D5",X"11",X"40",X"00",X"19",X"D1",X"CD",X"BD",X"25",X"E1",X"04", + X"78",X"FE",X"0A",X"30",X"0B",X"FE",X"02",X"20",X"04",X"2B",X"2B",X"18",X"A4",X"2B",X"18",X"A1", + X"C9",X"F5",X"E5",X"D5",X"11",X"00",X"04",X"19",X"71",X"D1",X"E1",X"F1",X"C9",X"78",X"DD",X"21", + X"80",X"D3",X"3D",X"CB",X"27",X"CB",X"27",X"57",X"CB",X"27",X"82",X"5F",X"16",X"00",X"DD",X"19", + X"C5",X"06",X"0C",X"11",X"00",X"04",X"E5",X"19",X"71",X"E1",X"DD",X"7E",X"00",X"77",X"D5",X"11", + X"20",X"00",X"19",X"DD",X"23",X"D1",X"10",X"EE",X"06",X"06",X"79",X"E5",X"19",X"CD",X"7D",X"1E", + X"E1",X"C1",X"DD",X"21",X"73",X"60",X"78",X"C5",X"3D",X"47",X"CB",X"27",X"80",X"C1",X"5F",X"16", + X"00",X"DD",X"19",X"CD",X"06",X"1E",X"C9",X"21",X"AC",X"D4",X"3E",X"02",X"0E",X"07",X"11",X"20", + X"00",X"E5",X"06",X"17",X"77",X"19",X"10",X"FC",X"E1",X"23",X"0D",X"20",X"F4",X"21",X"50",X"D7", + X"3E",X"07",X"77",X"23",X"77",X"19",X"77",X"2B",X"77",X"21",X"B1",X"D0",X"3E",X"AA",X"CD",X"F6", + X"26",X"2B",X"2B",X"36",X"BC",X"2B",X"3E",X"B4",X"77",X"3C",X"19",X"77",X"19",X"77",X"19",X"E5", + X"36",X"A5",X"19",X"36",X"A6",X"E1",X"23",X"3E",X"A7",X"CD",X"07",X"27",X"2B",X"A7",X"ED",X"52", + X"3E",X"A4",X"CD",X"07",X"27",X"21",X"6F",X"D1",X"36",X"A7",X"19",X"36",X"A8",X"21",X"B1",X"D1", + X"3E",X"AA",X"CD",X"F6",X"26",X"2B",X"2B",X"E5",X"3E",X"B1",X"CD",X"07",X"27",X"E1",X"2B",X"3E", + X"A4",X"CD",X"07",X"27",X"21",X"0F",X"D2",X"36",X"BD",X"2B",X"36",X"BF",X"2B",X"36",X"AD",X"A7", + X"ED",X"52",X"36",X"AE",X"2B",X"3E",X"BB",X"CD",X"11",X"27",X"21",X"51",X"D2",X"3E",X"AA",X"E5", + X"77",X"3C",X"3C",X"2B",X"77",X"2B",X"36",X"BC",X"2B",X"3E",X"B4",X"77",X"3C",X"3C",X"19",X"77", + X"E1",X"19",X"3E",X"AF",X"77",X"3C",X"19",X"77",X"2B",X"3E",X"B8",X"77",X"3D",X"A7",X"ED",X"52", + X"77",X"2B",X"19",X"E5",X"36",X"BE",X"19",X"3E",X"B2",X"77",X"3C",X"19",X"77",X"E1",X"2B",X"3E", + X"A4",X"CD",X"07",X"27",X"E5",X"23",X"36",X"BD",X"19",X"3E",X"A7",X"CD",X"07",X"27",X"E1",X"3E", + X"A4",X"CD",X"07",X"27",X"21",X"4E",X"D3",X"36",X"BF",X"2B",X"36",X"AD",X"A7",X"ED",X"52",X"36", + X"AE",X"2B",X"3E",X"BB",X"CD",X"11",X"27",X"21",X"50",X"D3",X"36",X"93",X"23",X"36",X"F1",X"19", + X"36",X"67",X"2B",X"36",X"61",X"C9",X"F5",X"E5",X"77",X"3C",X"E5",X"19",X"77",X"E1",X"2B",X"3C", + X"77",X"19",X"3C",X"77",X"E1",X"F1",X"C9",X"C5",X"06",X"03",X"77",X"3C",X"19",X"10",X"FB",X"C1", + X"C9",X"C5",X"06",X"03",X"77",X"3D",X"A7",X"ED",X"52",X"10",X"F9",X"C1",X"C9",X"06",X"09",X"21", + X"8B",X"D1",X"DD",X"21",X"F1",X"2E",X"0E",X"03",X"CD",X"B3",X"27",X"06",X"02",X"21",X"EA",X"D1", + X"DD",X"21",X"FA",X"2E",X"0E",X"03",X"CD",X"B3",X"27",X"06",X"0E",X"21",X"29",X"D1",X"DD",X"21", + X"FC",X"2E",X"0E",X"07",X"CD",X"B3",X"27",X"06",X"05",X"21",X"C7",X"D1",X"DD",X"21",X"0A",X"2F", + X"0E",X"01",X"CD",X"B3",X"27",X"3A",X"02",X"90",X"CB",X"77",X"20",X"33",X"06",X"03",X"21",X"05", + X"D1",X"DD",X"21",X"21",X"2F",X"0E",X"01",X"CD",X"B3",X"27",X"06",X"0E",X"21",X"85",X"D1",X"DD", + X"21",X"24",X"2F",X"CD",X"B3",X"27",X"11",X"00",X"04",X"21",X"C5",X"D0",X"0E",X"04",X"E5",X"19", + X"71",X"E1",X"36",X"01",X"21",X"65",X"D1",X"E5",X"19",X"71",X"E1",X"36",X"02",X"18",X"23",X"3A", + X"5E",X"60",X"FE",X"01",X"20",X"C6",X"11",X"00",X"04",X"21",X"C5",X"D0",X"0E",X"04",X"E5",X"19", + X"71",X"E1",X"36",X"01",X"06",X"12",X"21",X"05",X"D1",X"DD",X"21",X"0F",X"2F",X"0E",X"01",X"CD", + X"B3",X"27",X"C9",X"D5",X"11",X"00",X"04",X"E5",X"19",X"71",X"E1",X"DD",X"7E",X"00",X"77",X"D5", + X"11",X"20",X"00",X"19",X"DD",X"23",X"D1",X"10",X"EE",X"D1",X"C9",X"F5",X"C5",X"D5",X"E5",X"06", + X"09",X"21",X"82",X"D4",X"3E",X"02",X"11",X"20",X"00",X"77",X"23",X"77",X"19",X"77",X"2B",X"77", + X"19",X"10",X"F6",X"18",X"07",X"F5",X"C5",X"D5",X"E5",X"11",X"20",X"00",X"3A",X"5E",X"60",X"47", + X"3E",X"09",X"B8",X"38",X"1C",X"AF",X"21",X"03",X"90",X"ED",X"6F",X"21",X"82",X"D0",X"FE",X"0F", + X"20",X"0B",X"0E",X"E9",X"79",X"CD",X"16",X"28",X"19",X"10",X"F9",X"18",X"04",X"0E",X"ED",X"18", + X"F3",X"E1",X"D1",X"C1",X"F1",X"C9",X"D5",X"11",X"20",X"00",X"77",X"3D",X"23",X"77",X"3D",X"19", + X"77",X"3D",X"2B",X"77",X"D1",X"C9",X"11",X"20",X"00",X"06",X"08",X"21",X"81",X"D6",X"3E",X"02", + X"77",X"19",X"10",X"FC",X"3A",X"02",X"90",X"CB",X"77",X"28",X"1B",X"06",X"06",X"DD",X"21",X"81", + X"D2",X"21",X"E7",X"2E",X"CD",X"CF",X"29",X"21",X"61",X"D3",X"3A",X"5E",X"60",X"FE",X"09",X"38", + X"02",X"3E",X"09",X"77",X"18",X"0C",X"06",X"04",X"DD",X"21",X"01",X"D3",X"21",X"ED",X"2E",X"CD", + X"CF",X"29",X"C9",X"F5",X"21",X"D1",X"D0",X"DD",X"21",X"32",X"2F",X"FE",X"01",X"30",X"0D",X"CD", + X"F5",X"28",X"11",X"5E",X"00",X"19",X"DD",X"7E",X"00",X"77",X"18",X"04",X"DD",X"23",X"18",X"EF", + X"F1",X"21",X"8F",X"D1",X"DD",X"21",X"36",X"2F",X"FE",X"01",X"F5",X"30",X"20",X"CD",X"F5",X"28", + X"11",X"1D",X"00",X"19",X"CD",X"F5",X"28",X"11",X"23",X"00",X"19",X"CD",X"F5",X"28",X"23",X"23", + X"CD",X"F5",X"28",X"11",X"3E",X"00",X"19",X"DD",X"7E",X"00",X"77",X"18",X"04",X"DD",X"23",X"18", + X"DC",X"F1",X"21",X"71",X"D2",X"DD",X"21",X"40",X"2F",X"FE",X"01",X"F5",X"30",X"0D",X"CD",X"F5", + X"28",X"11",X"3E",X"00",X"19",X"DD",X"7E",X"00",X"77",X"18",X"04",X"DD",X"23",X"18",X"EF",X"F1", + X"21",X"EC",X"D2",X"DD",X"21",X"44",X"2F",X"FE",X"01",X"F5",X"30",X"13",X"CD",X"F5",X"28",X"23", + X"23",X"23",X"CD",X"F5",X"28",X"11",X"40",X"00",X"19",X"DD",X"7E",X"00",X"77",X"18",X"04",X"DD", + X"23",X"18",X"E9",X"F1",X"C9",X"DD",X"7E",X"00",X"77",X"DD",X"23",X"DD",X"23",X"C9",X"E5",X"CD", + X"1C",X"29",X"CD",X"C1",X"2A",X"21",X"B8",X"D1",X"CD",X"E3",X"1E",X"CD",X"82",X"29",X"CD",X"A8", + X"29",X"CD",X"DE",X"29",X"CD",X"48",X"2A",X"CD",X"A6",X"2A",X"E1",X"C9",X"21",X"B8",X"D5",X"3E", + X"05",X"06",X"06",X"CD",X"74",X"29",X"21",X"D5",X"D5",X"3E",X"01",X"05",X"CD",X"74",X"29",X"21", + X"74",X"D5",X"3E",X"04",X"06",X"0A",X"CD",X"74",X"29",X"21",X"33",X"D5",X"3E",X"06",X"06",X"0F", + X"CD",X"74",X"29",X"21",X"50",X"D5",X"3E",X"06",X"06",X"0C",X"CD",X"74",X"29",X"23",X"CD",X"74", + X"29",X"21",X"AD",X"D5",X"3E",X"05",X"06",X"06",X"CD",X"74",X"29",X"23",X"CD",X"74",X"29",X"21", + X"AA",X"D5",X"CD",X"74",X"29",X"23",X"CD",X"74",X"29",X"21",X"88",X"D5",X"3E",X"07",X"06",X"09", + X"CD",X"74",X"29",X"C9",X"C5",X"E5",X"F5",X"11",X"20",X"00",X"77",X"19",X"10",X"FC",X"F1",X"E1", + X"C1",X"C9",X"21",X"D5",X"D1",X"36",X"2A",X"11",X"20",X"00",X"19",X"CD",X"44",X"1F",X"DD",X"21", + X"21",X"60",X"DD",X"36",X"00",X"82",X"DD",X"36",X"01",X"40",X"DD",X"36",X"02",X"AE",X"CD",X"7F", + X"1F",X"DD",X"77",X"03",X"DD",X"70",X"04",X"C9",X"CD",X"26",X"1F",X"06",X"11",X"21",X"4A",X"2F", + X"11",X"0F",X"00",X"3D",X"28",X"03",X"19",X"10",X"FA",X"DD",X"21",X"33",X"D1",X"06",X"0F",X"CD", + X"CF",X"29",X"06",X"09",X"DD",X"21",X"88",X"D1",X"21",X"58",X"30",X"CD",X"CF",X"29",X"C9",X"D5", + X"11",X"20",X"00",X"7E",X"DD",X"77",X"00",X"23",X"DD",X"19",X"10",X"F7",X"D1",X"C9",X"CD",X"26", + X"1F",X"21",X"B0",X"D2",X"FE",X"12",X"38",X"07",X"06",X"06",X"CD",X"32",X"2A",X"18",X"42",X"FE", + X"0A",X"38",X"0D",X"06",X"05",X"11",X"20",X"00",X"A7",X"ED",X"52",X"CD",X"32",X"2A",X"18",X"31", + X"FE",X"05",X"38",X"0D",X"06",X"04",X"11",X"40",X"00",X"A7",X"ED",X"52",X"CD",X"32",X"2A",X"18", + X"20",X"FE",X"02",X"38",X"0D",X"06",X"03",X"11",X"60",X"00",X"A7",X"ED",X"52",X"CD",X"32",X"2A", + X"18",X"0F",X"FE",X"01",X"38",X"0B",X"06",X"02",X"11",X"80",X"00",X"A7",X"ED",X"52",X"CD",X"32", + X"2A",X"C9",X"11",X"20",X"00",X"36",X"63",X"23",X"36",X"73",X"A7",X"ED",X"52",X"36",X"F0",X"2B", + X"36",X"A3",X"A7",X"ED",X"52",X"10",X"EE",X"C9",X"21",X"4D",X"D2",X"FD",X"21",X"6F",X"60",X"06", + X"03",X"DD",X"21",X"AD",X"0C",X"FD",X"23",X"FD",X"5E",X"00",X"CB",X"23",X"CB",X"23",X"16",X"00", + X"DD",X"19",X"CD",X"68",X"2A",X"10",X"EA",X"C9",X"D5",X"11",X"20",X"00",X"DD",X"7E",X"00",X"77", + X"23",X"DD",X"23",X"DD",X"7E",X"00",X"3C",X"77",X"A7",X"ED",X"52",X"CD",X"91",X"2A",X"77",X"2B", + X"DD",X"23",X"DD",X"23",X"DD",X"7E",X"00",X"3C",X"77",X"11",X"20",X"00",X"A7",X"ED",X"52",X"D1", + X"C9",X"C5",X"FD",X"7E",X"00",X"06",X"F1",X"FE",X"09",X"28",X"08",X"D6",X"05",X"38",X"04",X"3C", + X"80",X"18",X"01",X"78",X"C1",X"C9",X"21",X"4A",X"D2",X"06",X"03",X"11",X"20",X"00",X"36",X"62", + X"23",X"36",X"71",X"A7",X"ED",X"52",X"36",X"EF",X"2B",X"36",X"A1",X"A7",X"ED",X"52",X"10",X"EE", + X"C9",X"06",X"15",X"21",X"A6",X"D0",X"3E",X"32",X"77",X"CD",X"FB",X"2A",X"23",X"10",X"F9",X"36", + X"30",X"CD",X"FB",X"2A",X"06",X"15",X"21",X"DB",X"D0",X"11",X"20",X"00",X"3D",X"77",X"CD",X"FB", + X"2A",X"19",X"10",X"F9",X"21",X"C6",X"D0",X"11",X"20",X"00",X"3E",X"FF",X"0E",X"15",X"E5",X"06", + X"15",X"77",X"19",X"10",X"FC",X"E1",X"23",X"0D",X"20",X"F4",X"C9",X"E5",X"D5",X"11",X"00",X"04", + X"19",X"36",X"00",X"D1",X"E1",X"C9",X"01",X"FF",X"03",X"21",X"00",X"D4",X"AF",X"77",X"23",X"0B", + X"78",X"B1",X"20",X"F8",X"C9",X"3A",X"65",X"60",X"FE",X"00",X"20",X"06",X"DD",X"21",X"A3",X"60", + X"18",X"04",X"DD",X"21",X"A6",X"60",X"3E",X"01",X"DD",X"4E",X"00",X"DD",X"56",X"01",X"DD",X"5E", + X"02",X"06",X"00",X"CB",X"3B",X"CB",X"1A",X"CB",X"19",X"CB",X"10",X"CD",X"6E",X"2B",X"F5",X"FE", + X"03",X"28",X"1C",X"FE",X"05",X"28",X"18",X"FE",X"06",X"28",X"14",X"FE",X"0A",X"28",X"10",X"FE", + X"0C",X"28",X"0C",X"FE",X"0D",X"28",X"08",X"FE",X"0F",X"28",X"04",X"FE",X"10",X"20",X"04",X"CB", + X"18",X"CB",X"15",X"F1",X"3C",X"FE",X"15",X"20",X"C8",X"4D",X"CD",X"1C",X"2C",X"C9",X"D5",X"C5", + X"DD",X"E5",X"F5",X"E5",X"5F",X"4F",X"CD",X"04",X"2C",X"78",X"FE",X"00",X"20",X"1A",X"36",X"36", + X"E5",X"23",X"36",X"39",X"E1",X"2B",X"36",X"FF",X"11",X"20",X"00",X"23",X"E5",X"19",X"36",X"37", + X"E1",X"A7",X"ED",X"52",X"36",X"35",X"18",X"18",X"36",X"3E",X"E5",X"23",X"36",X"3D",X"E1",X"2B", + X"36",X"3F",X"11",X"20",X"00",X"23",X"E5",X"19",X"36",X"FF",X"E1",X"A7",X"ED",X"52",X"36",X"40", + X"19",X"E5",X"FD",X"21",X"45",X"0D",X"DD",X"21",X"55",X"0D",X"16",X"00",X"59",X"1D",X"D5",X"CB", + X"3B",X"DD",X"19",X"DD",X"4E",X"00",X"D1",X"CB",X"43",X"20",X"06",X"79",X"E6",X"0F",X"4F",X"18", + X"08",X"CB",X"39",X"CB",X"39",X"CB",X"39",X"CB",X"39",X"C5",X"06",X"00",X"CB",X"21",X"CB",X"21", + X"FD",X"09",X"C1",X"78",X"FE",X"00",X"20",X"04",X"FD",X"23",X"FD",X"23",X"01",X"40",X"00",X"A7", + X"ED",X"42",X"FD",X"7E",X"00",X"77",X"E1",X"23",X"23",X"FD",X"7E",X"01",X"77",X"E1",X"F1",X"DD", + X"E1",X"C1",X"D1",X"C9",X"D5",X"DD",X"E5",X"DD",X"21",X"1D",X"0D",X"16",X"00",X"1D",X"CB",X"23", + X"DD",X"19",X"DD",X"66",X"01",X"DD",X"6E",X"00",X"DD",X"E1",X"D1",X"C9",X"16",X"00",X"CB",X"21", + X"CB",X"12",X"CB",X"21",X"CB",X"12",X"21",X"2F",X"D1",X"CD",X"5A",X"2C",X"CB",X"21",X"CB",X"12", + X"CB",X"21",X"CB",X"12",X"21",X"77",X"D1",X"CD",X"5A",X"2C",X"1E",X"00",X"CB",X"21",X"CB",X"12", + X"CB",X"21",X"CB",X"13",X"CB",X"21",X"CB",X"12",X"CB",X"21",X"CB",X"13",X"21",X"6F",X"D2",X"CD", + X"5A",X"2C",X"53",X"21",X"75",X"D2",X"CD",X"5A",X"2C",X"C9",X"7A",X"FE",X"00",X"28",X"0C",X"FE", + X"02",X"28",X"0C",X"FE",X"03",X"20",X"0A",X"36",X"3B",X"18",X"06",X"36",X"34",X"18",X"02",X"36", + X"3A",X"16",X"00",X"C9",X"CD",X"C1",X"2A",X"21",X"26",X"60",X"CB",X"4E",X"28",X"03",X"CD",X"A2", + X"2C",X"21",X"50",X"D1",X"3E",X"FF",X"06",X"0D",X"CD",X"7D",X"1E",X"21",X"50",X"D5",X"3E",X"06", + X"06",X"0D",X"CD",X"7D",X"1E",X"21",X"6D",X"0D",X"DD",X"21",X"50",X"D1",X"06",X"0D",X"CD",X"CF", + X"29",X"C9",X"AF",X"21",X"21",X"60",X"77",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"21",X"2B",X"60", + X"06",X"07",X"11",X"05",X"00",X"AF",X"77",X"D5",X"CD",X"4F",X"2E",X"D1",X"19",X"10",X"F7",X"21", + X"26",X"60",X"E5",X"36",X"12",X"23",X"CD",X"4F",X"2E",X"35",X"7E",X"FE",X"07",X"20",X"F7",X"E1", + X"36",X"22",X"23",X"23",X"CD",X"4F",X"2E",X"35",X"7E",X"FE",X"22",X"20",X"F7",X"21",X"26",X"60", + X"36",X"00",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"3A",X"65",X"60",X"FE",X"00",X"28",X"05",X"21", + X"67",X"60",X"18",X"03",X"21",X"66",X"60",X"34",X"CD",X"77",X"1D",X"C9",X"F5",X"CD",X"C1",X"2A", + X"21",X"71",X"D5",X"06",X"0A",X"3E",X"07",X"CD",X"7D",X"1E",X"2B",X"CD",X"7D",X"1E",X"2B",X"CD", + X"7D",X"1E",X"F1",X"FE",X"01",X"28",X"10",X"30",X"28",X"06",X"09",X"DD",X"21",X"90",X"D1",X"21", + X"68",X"0E",X"CD",X"CF",X"29",X"18",X"32",X"06",X"0A",X"DD",X"21",X"71",X"D1",X"21",X"71",X"0E", + X"CD",X"CF",X"29",X"06",X"09",X"DD",X"21",X"8F",X"D1",X"21",X"68",X"0E",X"CD",X"CF",X"29",X"18", + X"18",X"06",X"0A",X"DD",X"21",X"71",X"D1",X"21",X"7B",X"0E",X"CD",X"CF",X"29",X"06",X"09",X"DD", + X"21",X"8F",X"D1",X"21",X"68",X"0E",X"CD",X"CF",X"29",X"C9",X"F5",X"3A",X"02",X"90",X"CB",X"67", + X"28",X"F9",X"F1",X"C9",X"21",X"26",X"60",X"36",X"82",X"06",X"1E",X"3E",X"E4",X"23",X"23",X"23", + X"CD",X"4F",X"2E",X"77",X"23",X"36",X"00",X"2B",X"10",X"F6",X"06",X"06",X"C6",X"04",X"0E",X"05", + X"77",X"CD",X"4F",X"2E",X"0D",X"20",X"F9",X"10",X"F3",X"06",X"06",X"3E",X"48",X"0E",X"05",X"77", + X"23",X"36",X"09",X"CB",X"E6",X"2B",X"CD",X"4F",X"2E",X"0D",X"20",X"F3",X"C6",X"04",X"10",X"ED", + X"06",X"1E",X"77",X"CD",X"4F",X"2E",X"10",X"FA",X"DD",X"21",X"02",X"60",X"DD",X"CB",X"00",X"C6", + X"2B",X"11",X"CE",X"2D",X"D5",X"CD",X"D7",X"2D",X"CD",X"14",X"2E",X"CD",X"14",X"2E",X"CD",X"D7", + X"2D",X"CD",X"D7",X"2D",X"CD",X"14",X"2E",X"CD",X"14",X"2E",X"CD",X"D7",X"2D",X"D1",X"21",X"26", + X"60",X"36",X"00",X"CD",X"2F",X"3F",X"C9",X"2B",X"06",X"02",X"3E",X"AF",X"34",X"BE",X"CA",X"12", + X"2E",X"CD",X"4F",X"2E",X"10",X"F6",X"06",X"04",X"3E",X"AF",X"34",X"BE",X"CA",X"12",X"2E",X"23", + X"34",X"3E",X"D7",X"BE",X"CA",X"12",X"2E",X"CD",X"4F",X"2E",X"2B",X"10",X"EB",X"23",X"06",X"04", + X"34",X"BE",X"CA",X"12",X"2E",X"CD",X"4F",X"2E",X"10",X"F6",X"06",X"05",X"CD",X"4F",X"2E",X"10", + X"FB",X"C9",X"D1",X"C9",X"2B",X"06",X"02",X"AF",X"35",X"BE",X"CA",X"4D",X"2E",X"CD",X"4F",X"2E", + X"10",X"F6",X"06",X"04",X"AF",X"35",X"BE",X"CA",X"4D",X"2E",X"23",X"34",X"3E",X"D7",X"BE",X"CA", + X"4D",X"2E",X"CD",X"4F",X"2E",X"2B",X"10",X"EC",X"23",X"06",X"04",X"34",X"BE",X"CA",X"4D",X"2E", + X"CD",X"4F",X"2E",X"10",X"F6",X"06",X"05",X"CD",X"4F",X"2E",X"10",X"FB",X"C9",X"D1",X"C9",X"F5", + X"E5",X"C5",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"C1",X"E1",X"F1",X"C9",X"21",X"A4",X"0E",X"CD", + X"26",X"1F",X"CB",X"47",X"20",X"01",X"23",X"3A",X"B9",X"61",X"BE",X"DA",X"9E",X"2E",X"3A",X"65", + X"60",X"FE",X"00",X"28",X"0C",X"3A",X"02",X"90",X"CB",X"6F",X"28",X"05",X"3A",X"01",X"90",X"18", + X"03",X"3A",X"00",X"90",X"FE",X"00",X"CA",X"9E",X"2E",X"3A",X"98",X"61",X"21",X"C4",X"61",X"06", + X"04",X"CB",X"3F",X"30",X"02",X"CB",X"DF",X"77",X"23",X"10",X"F6",X"C3",X"CB",X"2E",X"21",X"C4", + X"61",X"06",X"04",X"ED",X"5F",X"E6",X"0F",X"CB",X"3F",X"3C",X"FE",X"03",X"38",X"0D",X"FE",X"05", + X"38",X"0E",X"FE",X"07",X"38",X"0F",X"3E",X"08",X"C3",X"C7",X"2E",X"3E",X"01",X"C3",X"C7",X"2E", + X"3E",X"02",X"C3",X"C7",X"2E",X"3E",X"04",X"77",X"23",X"10",X"D8",X"CD",X"D8",X"46",X"C9",X"18", + X"19",X"17",X"0D",X"1B",X"0D",X"1D",X"11",X"1D",X"18",X"0D",X"0A",X"22",X"2E",X"1C",X"FF",X"11", + X"12",X"FF",X"1C",X"0C",X"18",X"1B",X"0E",X"0C",X"1B",X"0E",X"0D",X"12",X"1D",X"0F",X"1B",X"0E", + X"0E",X"19",X"1B",X"0E",X"1C",X"0E",X"17",X"1D",X"0E",X"0D",X"0B",X"22",X"1E",X"17",X"12",X"1F", + X"0E",X"1B",X"1C",X"0A",X"15",X"2F",X"01",X"09",X"08",X"01",X"19",X"1B",X"0E",X"1C",X"1C",X"19", + X"15",X"0A",X"22",X"0E",X"1B",X"FF",X"0B",X"1E",X"1D",X"1D",X"18",X"17",X"FF",X"18",X"17",X"15", + X"22",X"18",X"1B",X"FF",X"FF",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"FF",X"0B",X"1E",X"1D",X"1D", + X"18",X"17",X"C0",X"AB",X"C1",X"A8",X"A8",X"C1",X"B9",X"C3",X"B2",X"C2",X"AB",X"C0",X"BD",X"C4", + X"C5",X"AF",X"C2",X"B2",X"B9",X"C3",X"BD",X"C4",X"A8",X"C1",X"FF",X"FF",X"FF",X"0C",X"1E",X"0C", + X"1E",X"16",X"0B",X"0E",X"1B",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0E",X"10",X"10",X"FF", + X"19",X"15",X"0A",X"17",X"1D",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0C",X"0A",X"1B",X"1B", + X"18",X"1D",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1B",X"0A",X"0D",X"12",X"1C", + X"11",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"19",X"0A",X"1B",X"1C",X"15",X"0E", + X"22",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1D",X"18",X"16",X"0A",X"1D",X"18",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"19",X"1E",X"16",X"19",X"14",X"12",X"17",X"FF", + X"FF",X"FF",X"FF",X"FF",X"0B",X"0A",X"16",X"0B",X"18",X"18",X"FF",X"1C",X"11",X"18",X"18",X"1D", + X"FF",X"FF",X"13",X"0A",X"19",X"0A",X"17",X"0E",X"1C",X"0E",X"FF",X"1B",X"0A",X"0D",X"12",X"1C", + X"11",X"FF",X"FF",X"FF",X"16",X"1E",X"1C",X"11",X"1B",X"18",X"18",X"16",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"19",X"18",X"1D",X"0A",X"1D",X"18",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"18",X"17",X"12",X"18",X"17",X"FF",X"FF",X"FF",X"FF",X"FF",X"0C",X"11", + X"12",X"17",X"0E",X"1C",X"0E",X"FF",X"0C",X"0A",X"0B",X"0B",X"0A",X"10",X"0E",X"FF",X"FF",X"FF", + X"FF",X"1D",X"1E",X"1B",X"17",X"12",X"19",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1B", + X"0E",X"0D",X"FF",X"19",X"0E",X"19",X"0E",X"1B",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0C", + X"0E",X"15",X"0E",X"1B",X"22",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1C",X"20",X"0E",X"0E",X"1D", + X"FF",X"19",X"18",X"1D",X"0A",X"1D",X"18",X"FF",X"FF",X"FF",X"FF",X"11",X"18",X"1B",X"1C",X"0E", + X"1B",X"0A",X"0D",X"12",X"1C",X"11",X"FF",X"FF",X"10",X"18",X"18",X"0D",X"FF",X"15",X"1E",X"0C", + X"14",X"79",X"DD",X"21",X"2B",X"60",X"CB",X"27",X"CB",X"27",X"81",X"16",X"00",X"5F",X"DD",X"19", + X"DD",X"36",X"00",X"82",X"DD",X"36",X"01",X"58",X"DD",X"36",X"02",X"86",X"79",X"CD",X"87",X"30", + X"DD",X"77",X"03",X"DD",X"70",X"04",X"C9",X"F5",X"CD",X"26",X"1F",X"FE",X"09",X"30",X"20",X"4F", + X"FE",X"03",X"28",X"06",X"FE",X"04",X"28",X"05",X"18",X"04",X"3C",X"18",X"01",X"3D",X"47",X"79", + X"3D",X"E5",X"21",X"8B",X"0C",X"16",X"00",X"5F",X"19",X"7E",X"4F",X"E1",X"F1",X"79",X"C9",X"3D", + X"E6",X"07",X"FE",X"05",X"38",X"02",X"D6",X"05",X"47",X"F1",X"80",X"47",X"04",X"4F",X"3E",X"18", + X"CB",X"21",X"CB",X"21",X"CB",X"21",X"08",X"79",X"CB",X"21",X"81",X"4F",X"08",X"81",X"C9",X"CD", + X"A9",X"34",X"47",X"3E",X"75",X"90",X"32",X"A9",X"60",X"C9",X"06",X"03",X"3A",X"65",X"60",X"FE", + X"00",X"28",X"05",X"21",X"A6",X"60",X"18",X"03",X"21",X"A3",X"60",X"36",X"95",X"23",X"36",X"6A", + X"23",X"36",X"0A",X"C9",X"3A",X"65",X"60",X"FE",X"00",X"28",X"05",X"3A",X"A0",X"60",X"18",X"03", + X"3A",X"9D",X"60",X"06",X"07",X"21",X"BD",X"D4",X"16",X"03",X"1E",X"07",X"1F",X"38",X"03",X"73", + X"18",X"01",X"72",X"D5",X"11",X"20",X"00",X"19",X"D1",X"10",X"F1",X"C9",X"3A",X"65",X"60",X"FE", + X"00",X"28",X"05",X"3A",X"A1",X"60",X"18",X"03",X"3A",X"9E",X"60",X"06",X"05",X"21",X"DD",X"D5", + X"16",X"03",X"1E",X"06",X"1F",X"38",X"03",X"73",X"18",X"01",X"72",X"D5",X"11",X"20",X"00",X"19", + X"D1",X"10",X"F1",X"C9",X"21",X"9F",X"60",X"3A",X"65",X"60",X"FE",X"00",X"28",X"03",X"21",X"A2", + X"60",X"AF",X"77",X"C9",X"3A",X"65",X"60",X"FE",X"00",X"28",X"05",X"3A",X"A2",X"60",X"18",X"03", + X"3A",X"9F",X"60",X"21",X"BD",X"D6",X"11",X"20",X"00",X"06",X"03",X"0E",X"05",X"FE",X"00",X"20", + X"0D",X"70",X"19",X"70",X"19",X"70",X"19",X"70",X"19",X"70",X"19",X"70",X"18",X"13",X"71",X"19", + X"71",X"FE",X"01",X"28",X"EF",X"19",X"71",X"19",X"71",X"FE",X"02",X"28",X"EB",X"19",X"71",X"19", + X"71",X"C9",X"CD",X"63",X"33",X"CD",X"3D",X"3F",X"06",X"0A",X"16",X"00",X"FD",X"21",X"91",X"60", + X"FD",X"E5",X"FD",X"7E",X"01",X"CD",X"C5",X"32",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"FD",X"23", + X"14",X"3E",X"03",X"BA",X"20",X"EC",X"CD",X"A9",X"34",X"FD",X"E1",X"06",X"0B",X"16",X"00",X"08", + X"FD",X"7E",X"02",X"CD",X"C5",X"32",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"14",X"08", + X"3D",X"28",X"0E",X"08",X"7A",X"FE",X"03",X"20",X"E7",X"FD",X"21",X"92",X"60",X"16",X"00",X"18", + X"DF",X"16",X"00",X"FD",X"21",X"70",X"60",X"ED",X"5F",X"07",X"CB",X"12",X"07",X"E6",X"03",X"8A", + X"16",X"00",X"FE",X"01",X"28",X"32",X"38",X"10",X"FE",X"03",X"CA",X"68",X"32",X"DA",X"48",X"32", + X"FE",X"05",X"CA",X"A7",X"32",X"C3",X"88",X"32",X"FD",X"46",X"00",X"3A",X"91",X"60",X"CD",X"C5", + X"32",X"14",X"FD",X"46",X"01",X"3A",X"95",X"60",X"CD",X"C5",X"32",X"14",X"FD",X"46",X"02",X"3A", + X"99",X"60",X"CD",X"C5",X"32",X"C3",X"C4",X"32",X"FD",X"46",X"00",X"3A",X"91",X"60",X"CD",X"C5", + X"32",X"14",X"FD",X"46",X"02",X"3A",X"95",X"60",X"CD",X"C5",X"32",X"14",X"FD",X"46",X"01",X"3A", + X"99",X"60",X"CD",X"C5",X"32",X"C3",X"C4",X"32",X"FD",X"46",X"01",X"3A",X"91",X"60",X"CD",X"C5", + X"32",X"14",X"FD",X"46",X"00",X"3A",X"95",X"60",X"CD",X"C5",X"32",X"14",X"FD",X"46",X"02",X"3A", + X"99",X"60",X"CD",X"C5",X"32",X"C3",X"C4",X"32",X"FD",X"46",X"01",X"3A",X"91",X"60",X"CD",X"C5", + X"32",X"14",X"FD",X"46",X"02",X"3A",X"95",X"60",X"CD",X"C5",X"32",X"14",X"FD",X"46",X"00",X"3A", + X"99",X"60",X"CD",X"C5",X"32",X"C3",X"C4",X"32",X"FD",X"46",X"02",X"3A",X"91",X"60",X"CD",X"C5", + X"32",X"14",X"FD",X"46",X"00",X"3A",X"95",X"60",X"CD",X"C5",X"32",X"14",X"FD",X"46",X"01",X"3A", + X"99",X"60",X"CD",X"C5",X"32",X"18",X"1D",X"FD",X"46",X"02",X"3A",X"91",X"60",X"CD",X"C5",X"32", + X"14",X"FD",X"46",X"01",X"3A",X"95",X"60",X"CD",X"C5",X"32",X"14",X"FD",X"46",X"00",X"3A",X"99", + X"60",X"CD",X"C5",X"32",X"C9",X"F5",X"CD",X"79",X"3A",X"CD",X"44",X"34",X"F1",X"F5",X"C5",X"4F", + X"7A",X"CD",X"3B",X"33",X"C1",X"78",X"18",X"01",X"F5",X"C5",X"06",X"07",X"FE",X"0A",X"20",X"06", + X"DD",X"21",X"A5",X"0C",X"18",X"0A",X"FE",X"0B",X"20",X"09",X"06",X"06",X"DD",X"21",X"A9",X"0C", + X"D5",X"18",X"0E",X"DD",X"21",X"AD",X"0C",X"D5",X"CB",X"27",X"CB",X"27",X"16",X"00",X"5F",X"DD", + X"19",X"DD",X"7E",X"00",X"77",X"11",X"00",X"04",X"E5",X"19",X"70",X"E1",X"DD",X"7E",X"01",X"23", + X"CB",X"49",X"28",X"01",X"3C",X"77",X"E5",X"19",X"70",X"E1",X"D5",X"11",X"E0",X"FF",X"19",X"D1", + X"DD",X"7E",X"02",X"81",X"77",X"E5",X"19",X"70",X"E1",X"2B",X"DD",X"7E",X"03",X"CB",X"41",X"28", + X"01",X"3C",X"77",X"E5",X"19",X"70",X"E1",X"D1",X"C1",X"F1",X"C9",X"DD",X"E5",X"C5",X"FE",X"01", + X"28",X"0C",X"38",X"05",X"21",X"34",X"0C",X"18",X"08",X"21",X"02",X"0C",X"18",X"03",X"21",X"16", + X"0C",X"06",X"00",X"CB",X"21",X"09",X"E5",X"DD",X"E1",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"C1", + X"DD",X"E1",X"C9",X"06",X"04",X"21",X"91",X"60",X"E5",X"DD",X"E1",X"ED",X"5F",X"4F",X"E6",X"07", + X"CB",X"21",X"CE",X"00",X"CB",X"21",X"CE",X"00",X"CD",X"A2",X"33",X"38",X"EE",X"77",X"23",X"10", + X"EA",X"21",X"95",X"60",X"06",X"02",X"C5",X"E5",X"DD",X"E1",X"06",X"04",X"ED",X"5F",X"4F",X"E6", + X"0F",X"FE",X"0F",X"28",X"F7",X"CD",X"A2",X"33",X"38",X"F2",X"77",X"23",X"10",X"EE",X"C1",X"10", + X"E5",X"C9",X"08",X"78",X"FE",X"01",X"20",X"14",X"08",X"DD",X"BE",X"02",X"28",X"1F",X"DD",X"BE", + X"01",X"28",X"1A",X"DD",X"BE",X"00",X"28",X"15",X"37",X"3F",X"18",X"12",X"FE",X"02",X"20",X"03", + X"08",X"18",X"EB",X"FE",X"03",X"20",X"03",X"08",X"18",X"E9",X"08",X"18",X"EB",X"37",X"C9",X"DD", + X"21",X"6E",X"60",X"3A",X"65",X"60",X"FE",X"00",X"20",X"05",X"DD",X"34",X"00",X"18",X"03",X"DD", + X"34",X"01",X"C9",X"21",X"C6",X"D0",X"CD",X"25",X"34",X"D5",X"11",X"06",X"00",X"19",X"D1",X"E5", + X"DD",X"E1",X"DD",X"77",X"00",X"DD",X"77",X"02",X"DD",X"77",X"06",X"DD",X"77",X"08",X"DD",X"77", + X"0A",X"DD",X"77",X"0C",X"DD",X"77",X"0E",X"DD",X"19",X"DD",X"71",X"00",X"DD",X"71",X"02",X"DD", + X"71",X"06",X"DD",X"71",X"08",X"DD",X"71",X"0A",X"DD",X"71",X"0C",X"DD",X"71",X"0E",X"21",X"46", + X"D2",X"CD",X"25",X"34",X"C9",X"0E",X"02",X"3E",X"E5",X"11",X"00",X"04",X"06",X"05",X"C5",X"06", + X"0B",X"77",X"E5",X"19",X"71",X"E1",X"23",X"23",X"10",X"F7",X"D5",X"11",X"2A",X"00",X"19",X"D1", + X"C1",X"10",X"EB",X"C9",X"0E",X"00",X"FE",X"0A",X"28",X"5E",X"FE",X"64",X"28",X"5A",X"FE",X"07", + X"38",X"24",X"FE",X"09",X"28",X"20",X"FE",X"31",X"28",X"1C",X"FE",X"3A",X"28",X"18",X"FE",X"3C", + X"28",X"14",X"FE",X"43",X"28",X"10",X"FE",X"5A",X"28",X"0C",X"FE",X"6B",X"28",X"08",X"FE",X"6D", + X"28",X"04",X"FE",X"6E",X"20",X"03",X"0C",X"18",X"2E",X"FE",X"18",X"28",X"28",X"FE",X"1C",X"28", + X"24",X"FE",X"2C",X"28",X"20",X"FE",X"3A",X"28",X"1C",X"FE",X"3B",X"28",X"18",X"FE",X"3E",X"28", + X"14",X"FE",X"56",X"28",X"10",X"FE",X"6A",X"28",X"0C",X"FE",X"6C",X"28",X"08",X"FE",X"6F",X"28", + X"04",X"FE",X"70",X"20",X"02",X"0C",X"0C",X"0C",X"C9",X"CD",X"26",X"1F",X"FE",X"01",X"20",X"04", + X"3E",X"02",X"18",X"1A",X"FE",X"05",X"30",X"04",X"3E",X"03",X"18",X"12",X"FE",X"0A",X"30",X"04", + X"3E",X"04",X"18",X"0A",X"FE",X"11",X"30",X"04",X"3E",X"05",X"18",X"02",X"3E",X"06",X"C9",X"C5", + X"E5",X"FD",X"7E",X"00",X"FE",X"0C",X"38",X"1B",X"FE",X"FF",X"28",X"06",X"FE",X"E5",X"28",X"02", + X"3E",X"FF",X"77",X"FE",X"FF",X"28",X"26",X"11",X"00",X"04",X"19",X"36",X"02",X"21",X"A9",X"60", + X"34",X"18",X"1A",X"FE",X"0B",X"28",X"06",X"E5",X"21",X"A9",X"60",X"34",X"E1",X"41",X"08",X"79", + X"CD",X"44",X"34",X"08",X"47",X"CD",X"D8",X"32",X"E1",X"E5",X"CD",X"7B",X"3F",X"E1",X"C1",X"C9", + X"0E",X"00",X"21",X"C6",X"D0",X"3A",X"65",X"60",X"FE",X"00",X"28",X"06",X"DD",X"21",X"21",X"61", + X"18",X"04",X"DD",X"21",X"AC",X"60",X"06",X"0B",X"CD",X"63",X"35",X"DD",X"77",X"00",X"DD",X"23", + X"0C",X"79",X"FE",X"37",X"20",X"20",X"11",X"32",X"00",X"19",X"CD",X"63",X"35",X"DD",X"77",X"00", + X"DD",X"23",X"0C",X"23",X"23",X"CD",X"63",X"35",X"DD",X"77",X"00",X"DD",X"23",X"0C",X"06",X"05", + X"23",X"23",X"23",X"23",X"18",X"D2",X"FE",X"75",X"28",X"08",X"10",X"F6",X"11",X"2C",X"00",X"19", + X"18",X"C4",X"C9",X"FD",X"21",X"5F",X"0D",X"16",X"00",X"7E",X"FD",X"BE",X"00",X"28",X"10",X"FD", + X"23",X"14",X"18",X"F6",X"7A",X"FE",X"01",X"28",X"02",X"30",X"14",X"FD",X"7E",X"00",X"C9",X"FE", + X"5C",X"20",X"F1",X"E5",X"23",X"7E",X"E1",X"FE",X"66",X"38",X"E9",X"14",X"14",X"18",X"E5",X"D6", + X"02",X"C9",X"CD",X"BC",X"3F",X"AF",X"32",X"A9",X"60",X"3A",X"65",X"60",X"FE",X"00",X"20",X"06", + X"FD",X"21",X"AC",X"60",X"18",X"04",X"FD",X"21",X"21",X"61",X"21",X"C6",X"D0",X"0E",X"00",X"06", + X"0B",X"CD",X"CF",X"34",X"FD",X"23",X"0C",X"79",X"FE",X"37",X"20",X"1A",X"11",X"32",X"00",X"19", + X"CD",X"CF",X"34",X"FD",X"23",X"0C",X"23",X"23",X"CD",X"CF",X"34",X"FD",X"23",X"0C",X"06",X"05", + X"23",X"23",X"23",X"23",X"18",X"DB",X"FE",X"75",X"28",X"08",X"10",X"F6",X"11",X"2C",X"00",X"19", + X"18",X"CD",X"C9",X"CD",X"26",X"1F",X"21",X"AA",X"60",X"FE",X"02",X"30",X"04",X"36",X"09",X"18", + X"0A",X"FE",X"05",X"30",X"04",X"36",X"06",X"18",X"02",X"36",X"03",X"7E",X"23",X"77",X"C9",X"21", + X"5F",X"60",X"CB",X"66",X"CA",X"29",X"36",X"2A",X"D8",X"61",X"3A",X"27",X"60",X"E6",X"0F",X"FE", + X"08",X"20",X"13",X"3A",X"28",X"60",X"E6",X"0F",X"FE",X"06",X"20",X"0A",X"23",X"7E",X"FE",X"FF", + X"20",X"01",X"2B",X"22",X"D8",X"61",X"7E",X"18",X"17",X"3A",X"65",X"60",X"FE",X"00",X"28",X"0C", + X"3A",X"02",X"90",X"CB",X"6F",X"28",X"05",X"3A",X"01",X"90",X"18",X"03",X"3A",X"00",X"90",X"2F", + X"E6",X"0F",X"C8",X"FE",X"01",X"28",X"0B",X"FE",X"02",X"28",X"07",X"FE",X"04",X"28",X"03",X"FE", + X"08",X"C0",X"57",X"3A",X"5F",X"60",X"CB",X"7F",X"CA",X"C1",X"36",X"3A",X"27",X"60",X"E6",X"0F", + X"FE",X"08",X"CA",X"43",X"49",X"3A",X"28",X"60",X"E6",X"0F",X"FE",X"06",X"C2",X"4B",X"49",X"D5", + X"AF",X"32",X"E0",X"61",X"C3",X"CE",X"36",X"CB",X"3F",X"BA",X"C2",X"1E",X"38",X"21",X"27",X"60", + X"E6",X"0A",X"28",X"1E",X"7E",X"E6",X"0F",X"FE",X"08",X"38",X"03",X"35",X"18",X"01",X"34",X"23", + X"CB",X"5A",X"20",X"07",X"35",X"3E",X"02",X"32",X"98",X"61",X"C9",X"34",X"3E",X"08",X"32",X"98", + X"61",X"C9",X"23",X"7E",X"E6",X"0F",X"FE",X"07",X"38",X"03",X"35",X"18",X"01",X"34",X"2B",X"CB", + X"52",X"28",X"07",X"34",X"3E",X"04",X"32",X"98",X"61",X"C9",X"35",X"3E",X"01",X"32",X"98",X"61", + X"C9",X"D5",X"AF",X"32",X"E0",X"61",X"3A",X"98",X"61",X"E6",X"0A",X"C2",X"6E",X"37",X"3A",X"27", + X"60",X"47",X"3A",X"28",X"60",X"CD",X"DA",X"36",X"18",X"1B",X"D6",X"36",X"CB",X"3F",X"CB",X"3F", + X"CB",X"3F",X"CB",X"3F",X"CB",X"27",X"21",X"E4",X"0D",X"16",X"00",X"5F",X"19",X"5E",X"23",X"56", + X"3E",X"08",X"0E",X"10",X"C9",X"CB",X"3A",X"CB",X"1B",X"38",X"03",X"81",X"18",X"F7",X"CD",X"03", + X"37",X"18",X"03",X"B8",X"3F",X"C9",X"28",X"06",X"38",X"08",X"CB",X"FA",X"18",X"ED",X"67",X"6F", + X"18",X"0D",X"67",X"CB",X"23",X"CB",X"12",X"91",X"CB",X"23",X"CB",X"12",X"30",X"F9",X"6F",X"3A", + X"27",X"60",X"08",X"DD",X"21",X"96",X"61",X"7C",X"D6",X"04",X"57",X"08",X"BA",X"30",X"33",X"08", + X"7A",X"D6",X"02",X"57",X"08",X"BA",X"30",X"25",X"08",X"7D",X"C6",X"05",X"5F",X"08",X"BB",X"38", + X"17",X"08",X"7B",X"C6",X"02",X"5F",X"08",X"BB",X"D2",X"0A",X"38",X"DD",X"75",X"00",X"E5",X"21", + X"E0",X"61",X"CB",X"CE",X"E1",X"C3",X"0A",X"38",X"DD",X"75",X"00",X"18",X"08",X"DD",X"74",X"00", + X"18",X"EC",X"DD",X"74",X"00",X"3A",X"28",X"60",X"DD",X"77",X"01",X"C3",X"06",X"38",X"3A",X"28", + X"60",X"47",X"3A",X"27",X"60",X"CD",X"7A",X"37",X"18",X"1B",X"D6",X"08",X"CB",X"3F",X"CB",X"3F", + X"CB",X"3F",X"CB",X"3F",X"CB",X"27",X"21",X"FA",X"0D",X"16",X"00",X"5F",X"19",X"5E",X"23",X"56", + X"3E",X"36",X"0E",X"10",X"C9",X"CB",X"3A",X"CB",X"1B",X"38",X"03",X"81",X"18",X"F7",X"CD",X"03", + X"37",X"28",X"06",X"38",X"08",X"CB",X"FA",X"18",X"F2",X"67",X"6F",X"18",X"0D",X"67",X"CB",X"23", + X"CB",X"12",X"91",X"CB",X"23",X"CB",X"12",X"30",X"F9",X"6F",X"3A",X"28",X"60",X"08",X"DD",X"21", + X"96",X"61",X"7C",X"D6",X"04",X"57",X"08",X"BA",X"30",X"33",X"08",X"7A",X"D6",X"03",X"57",X"08", + X"BA",X"30",X"25",X"08",X"7D",X"C6",X"05",X"5F",X"08",X"BB",X"38",X"17",X"08",X"7B",X"C6",X"03", + X"5F",X"08",X"BB",X"D2",X"0A",X"38",X"DD",X"75",X"01",X"E5",X"21",X"E0",X"61",X"CB",X"C6",X"E1", + X"C3",X"0A",X"38",X"DD",X"75",X"01",X"18",X"08",X"DD",X"74",X"01",X"18",X"EC",X"DD",X"74",X"01", + X"3A",X"27",X"60",X"DD",X"77",X"00",X"D1",X"C3",X"8C",X"38",X"D1",X"21",X"5F",X"60",X"CB",X"BE", + X"3A",X"26",X"60",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"BA",X"28",X"0F",X"7A",X"CB", + X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"F6",X"02",X"32",X"26",X"60",X"C9",X"3E",X"05",X"A2", + X"28",X"0A",X"3A",X"98",X"61",X"E6",X"05",X"CA",X"69",X"38",X"18",X"08",X"3A",X"98",X"61",X"E6", + X"0A",X"CA",X"69",X"38",X"DD",X"21",X"27",X"60",X"7A",X"FE",X"02",X"38",X"0B",X"28",X"0E",X"FE", + X"04",X"28",X"0F",X"DD",X"34",X"01",X"18",X"0D",X"DD",X"35",X"00",X"18",X"08",X"DD",X"35",X"01", + X"18",X"03",X"DD",X"34",X"00",X"32",X"98",X"61",X"C9",X"3A",X"E0",X"61",X"FE",X"00",X"C8",X"CB", + X"47",X"28",X"0D",X"21",X"28",X"60",X"3A",X"97",X"61",X"BE",X"38",X"02",X"34",X"C9",X"35",X"C9", + X"21",X"27",X"60",X"3A",X"96",X"61",X"BE",X"38",X"F5",X"C3",X"7C",X"38",X"21",X"5F",X"60",X"CB", + X"FE",X"3A",X"26",X"60",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"BA",X"C2",X"1E",X"38", + X"FD",X"21",X"26",X"60",X"DD",X"21",X"96",X"61",X"3A",X"28",X"60",X"DD",X"BE",X"01",X"20",X"36", + X"3A",X"27",X"60",X"DD",X"BE",X"00",X"20",X"07",X"CD",X"0D",X"39",X"D2",X"44",X"38",X"C9",X"3A", + X"27",X"60",X"DD",X"BE",X"00",X"38",X"10",X"3E",X"05",X"A2",X"C2",X"44",X"38",X"CD",X"0D",X"39", + X"D8",X"FD",X"35",X"01",X"C3",X"44",X"38",X"3E",X"05",X"A2",X"20",X"F8",X"CD",X"0D",X"39",X"D8", + X"FD",X"34",X"01",X"C3",X"D4",X"38",X"FD",X"7E",X"02",X"DD",X"BE",X"01",X"38",X"0F",X"3E",X"0A", + X"A2",X"20",X"E1",X"CD",X"0D",X"39",X"D8",X"FD",X"35",X"02",X"C3",X"D4",X"38",X"3E",X"0A",X"A2", + X"20",X"D2",X"CD",X"0D",X"39",X"D8",X"FD",X"34",X"02",X"C3",X"D4",X"38",X"C9",X"DD",X"21",X"96", + X"61",X"DD",X"7E",X"00",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"27",X"5F",X"CB", + X"27",X"83",X"06",X"00",X"4F",X"21",X"A2",X"0D",X"09",X"DD",X"7E",X"01",X"CB",X"3F",X"CB",X"3F", + X"CB",X"3F",X"CB",X"3F",X"D6",X"03",X"5F",X"CB",X"3F",X"4F",X"09",X"7E",X"CB",X"43",X"28",X"0B", + X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C3",X"4D",X"39",X"E6",X"0F",X"5F",X"A2",X"C2", + X"54",X"39",X"37",X"C9",X"A7",X"C9",X"2A",X"99",X"61",X"23",X"22",X"99",X"61",X"7C",X"FE",X"00", + X"28",X"13",X"FE",X"02",X"38",X"4A",X"7D",X"FE",X"58",X"38",X"45",X"21",X"00",X"00",X"22",X"99", + X"61",X"3E",X"07",X"18",X"13",X"7D",X"FE",X"01",X"28",X"F7",X"FE",X"1E",X"20",X"04",X"3E",X"06", + X"18",X"06",X"FE",X"B4",X"20",X"2A",X"3E",X"05",X"06",X"06",X"DD",X"21",X"9C",X"61",X"11",X"00", + X"04",X"DD",X"6E",X"00",X"DD",X"23",X"DD",X"66",X"00",X"DD",X"23",X"4F",X"AF",X"BC",X"79",X"28", + X"0D",X"19",X"77",X"23",X"77",X"D5",X"11",X"E0",X"FF",X"19",X"D1",X"77",X"2B",X"77",X"10",X"E1", + X"C9",X"21",X"AA",X"60",X"35",X"C2",X"48",X"3A",X"2A",X"63",X"60",X"3A",X"62",X"60",X"FE",X"00", + X"28",X"04",X"36",X"06",X"18",X"02",X"36",X"05",X"3A",X"60",X"60",X"4F",X"CD",X"24",X"1D",X"22", + X"63",X"60",X"21",X"00",X"60",X"CB",X"E6",X"21",X"61",X"60",X"34",X"7E",X"FE",X"17",X"20",X"0F", + X"36",X"00",X"21",X"60",X"60",X"34",X"7E",X"FE",X"04",X"20",X"16",X"36",X"00",X"18",X"12",X"FE", + X"0C",X"20",X"0E",X"3A",X"60",X"60",X"FE",X"00",X"20",X"07",X"3A",X"62",X"60",X"2F",X"32",X"62", + X"60",X"3A",X"AB",X"60",X"32",X"AA",X"60",X"3A",X"60",X"60",X"FE",X"00",X"20",X"3A",X"3A",X"61", + X"60",X"FE",X"01",X"28",X"1B",X"FE",X"0C",X"20",X"2F",X"06",X"04",X"11",X"05",X"00",X"21",X"2B", + X"60",X"CB",X"46",X"20",X"05",X"19",X"10",X"F9",X"18",X"1E",X"CB",X"86",X"CB",X"CE",X"18",X"18", + X"06",X"04",X"11",X"05",X"00",X"21",X"2B",X"60",X"CB",X"46",X"20",X"05",X"19",X"10",X"F9",X"18", + X"07",X"E5",X"21",X"00",X"60",X"CB",X"EE",X"E1",X"21",X"CA",X"61",X"35",X"21",X"B6",X"61",X"35", + X"23",X"20",X"22",X"2B",X"36",X"3C",X"23",X"E5",X"23",X"34",X"06",X"04",X"21",X"CE",X"61",X"AF", + X"BE",X"28",X"01",X"35",X"23",X"10",X"F9",X"21",X"E1",X"61",X"BE",X"28",X"01",X"35",X"E1",X"7E", + X"FE",X"F0",X"30",X"01",X"34",X"23",X"23",X"35",X"C9",X"E5",X"D5",X"F5",X"7A",X"FE",X"01",X"28", + X"07",X"38",X"0A",X"21",X"93",X"0D",X"18",X"08",X"21",X"84",X"0D",X"18",X"03",X"21",X"7A",X"0D", + X"F1",X"5F",X"16",X"00",X"19",X"7E",X"D1",X"E1",X"C9",X"3A",X"C9",X"61",X"E6",X"FF",X"28",X"03", + X"C3",X"F9",X"3A",X"3A",X"26",X"60",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"21",X"98", + X"61",X"BE",X"C0",X"FE",X"02",X"DA",X"98",X"3B",X"CA",X"61",X"3B",X"FE",X"04",X"CA",X"2E",X"3B", + X"3A",X"27",X"60",X"D6",X"04",X"57",X"3A",X"28",X"60",X"00",X"5F",X"CD",X"0A",X"3C",X"46",X"1D", + X"CD",X"0A",X"3C",X"7E",X"B8",X"28",X"21",X"78",X"FE",X"36",X"20",X"05",X"23",X"AF",X"C3",X"CA", + X"3B",X"1C",X"7A",X"C6",X"08",X"57",X"CD",X"0A",X"3C",X"3E",X"35",X"BE",X"C0",X"D5",X"11",X"20", + X"00",X"19",X"D1",X"3E",X"01",X"C3",X"CA",X"3B",X"C9",X"2A",X"CB",X"61",X"3A",X"C9",X"61",X"08", + X"AF",X"32",X"C9",X"61",X"08",X"FE",X"02",X"28",X"0A",X"38",X"0C",X"FE",X"03",X"28",X"0C",X"3E", + X"06",X"18",X"0A",X"3E",X"07",X"18",X"06",X"3E",X"05",X"18",X"02",X"3E",X"04",X"CD",X"EA",X"3B", + X"CD",X"EB",X"22",X"CD",X"7B",X"46",X"21",X"5F",X"60",X"CB",X"9E",X"C3",X"A3",X"3A",X"3A",X"27", + X"60",X"C6",X"05",X"57",X"3A",X"28",X"60",X"C6",X"05",X"5F",X"CD",X"0A",X"3C",X"7E",X"14",X"CD", + X"0A",X"3C",X"BE",X"28",X"1B",X"3E",X"3E",X"BE",X"20",X"05",X"3E",X"03",X"C3",X"CA",X"3B",X"7B", + X"D6",X"08",X"5F",X"CD",X"0A",X"3C",X"3E",X"3D",X"BE",X"C0",X"2B",X"3E",X"02",X"C3",X"CA",X"3B", + X"C9",X"3A",X"27",X"60",X"C6",X"04",X"57",X"3A",X"28",X"60",X"D6",X"04",X"5F",X"CD",X"0A",X"3C", + X"7E",X"1D",X"CD",X"0A",X"3C",X"BE",X"28",X"1F",X"3E",X"35",X"BE",X"20",X"0A",X"D5",X"11",X"20", + X"00",X"19",X"D1",X"AF",X"C3",X"CA",X"3B",X"7A",X"D6",X"08",X"57",X"CD",X"0A",X"3C",X"3E",X"36", + X"BE",X"C0",X"3E",X"01",X"C3",X"CA",X"3B",X"C9",X"C3",X"80",X"00",X"3C",X"57",X"3A",X"28",X"60", + X"D6",X"03",X"5F",X"CD",X"0A",X"3C",X"7E",X"15",X"CD",X"0A",X"3C",X"BE",X"28",X"1B",X"3E",X"3D", + X"BE",X"20",X"06",X"2B",X"3E",X"03",X"C3",X"CA",X"3B",X"7B",X"C6",X"08",X"5F",X"CD",X"0A",X"3C", + X"3E",X"3E",X"BE",X"C0",X"3E",X"02",X"C3",X"CA",X"3B",X"C9",X"08",X"3A",X"C9",X"61",X"FE",X"00", + X"C2",X"F9",X"3A",X"08",X"47",X"3C",X"32",X"C9",X"61",X"78",X"22",X"CB",X"61",X"08",X"3E",X"01", + X"32",X"CA",X"61",X"08",X"CD",X"EA",X"3B",X"C3",X"FE",X"3B",X"F5",X"E5",X"06",X"01",X"7D",X"21", + X"1D",X"0D",X"BE",X"28",X"06",X"04",X"23",X"23",X"C3",X"F2",X"3B",X"E1",X"F1",X"C9",X"CD",X"EB", + X"22",X"CD",X"7B",X"46",X"21",X"5F",X"60",X"CB",X"9E",X"C9",X"F5",X"C5",X"7A",X"E6",X"F8",X"06", + X"00",X"4F",X"CB",X"21",X"CB",X"10",X"CB",X"21",X"CB",X"10",X"21",X"A0",X"D0",X"09",X"7B",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"06",X"00",X"4F",X"09",X"C1",X"F1",X"C9",X"E5",X"21",X"5F",X"60", + X"CB",X"66",X"C2",X"AE",X"3C",X"D5",X"3A",X"65",X"60",X"FE",X"00",X"20",X"05",X"3A",X"9F",X"60", + X"18",X"03",X"3A",X"A2",X"60",X"08",X"21",X"10",X"0E",X"AF",X"BB",X"20",X"15",X"08",X"06",X"00", + X"4F",X"09",X"7E",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"06",X"00",X"0E",X"00",X"57", + X"18",X"10",X"1D",X"CB",X"23",X"CB",X"23",X"16",X"00",X"19",X"08",X"5F",X"19",X"06",X"00",X"4E", + X"16",X"00",X"3A",X"65",X"60",X"FE",X"00",X"20",X"06",X"DD",X"21",X"68",X"60",X"18",X"04",X"DD", + X"21",X"6B",X"60",X"DD",X"7E",X"02",X"82",X"27",X"DD",X"77",X"02",X"DD",X"7E",X"01",X"89",X"27", + X"DD",X"77",X"01",X"DD",X"7E",X"00",X"88",X"27",X"DD",X"77",X"00",X"3A",X"65",X"60",X"FE",X"00", + X"20",X"05",X"21",X"C4",X"D2",X"18",X"03",X"21",X"C3",X"D2",X"CD",X"06",X"1E",X"D1",X"E1",X"C9", + X"E5",X"D5",X"C5",X"21",X"44",X"60",X"11",X"FB",X"FF",X"06",X"06",X"AF",X"CB",X"4E",X"28",X"04", + X"37",X"C3",X"C5",X"3C",X"A7",X"17",X"19",X"10",X"F3",X"C1",X"D1",X"E1",X"C9",X"C5",X"D5",X"E5", + X"06",X"09",X"11",X"05",X"00",X"21",X"21",X"60",X"CB",X"86",X"CB",X"8E",X"19",X"10",X"F9",X"DD", + X"E5",X"FD",X"E5",X"F5",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"F1",X"FD",X"E1",X"DD",X"E1",X"E1", + X"D1",X"C1",X"C9",X"DD",X"21",X"43",X"0D",X"06",X"14",X"1E",X"00",X"DD",X"6E",X"00",X"DD",X"66", + X"01",X"7E",X"FE",X"36",X"20",X"03",X"A7",X"18",X"01",X"37",X"CB",X"13",X"CB",X"12",X"CB",X"11", + X"DD",X"2B",X"DD",X"2B",X"10",X"E5",X"3A",X"65",X"60",X"FE",X"00",X"20",X"05",X"21",X"A3",X"60", + X"18",X"03",X"21",X"A6",X"60",X"73",X"23",X"72",X"23",X"71",X"C9",X"E5",X"0E",X"00",X"06",X"02", + X"11",X"1C",X"0E",X"1A",X"13",X"BD",X"C2",X"3E",X"3D",X"1A",X"BC",X"CA",X"64",X"3D",X"13",X"10", + X"F2",X"0C",X"06",X"0C",X"1A",X"13",X"BD",X"C2",X"4F",X"3D",X"1A",X"BC",X"CA",X"64",X"3D",X"13", + X"10",X"F2",X"0C",X"06",X"10",X"1A",X"13",X"BD",X"C2",X"60",X"3D",X"1A",X"BC",X"CA",X"64",X"3D", + X"13",X"10",X"F2",X"0C",X"06",X"00",X"DD",X"21",X"58",X"0E",X"CB",X"21",X"CB",X"21",X"DD",X"09", + X"DD",X"7E",X"00",X"77",X"E5",X"11",X"00",X"04",X"19",X"36",X"02",X"E1",X"23",X"DD",X"7E",X"01", + X"77",X"E5",X"19",X"36",X"00",X"E1",X"D5",X"11",X"E0",X"FF",X"19",X"D1",X"DD",X"7E",X"02",X"77", + X"E5",X"19",X"36",X"00",X"E1",X"2B",X"DD",X"7E",X"03",X"77",X"19",X"36",X"00",X"E1",X"C9",X"E5", + X"2A",X"99",X"61",X"7C",X"FE",X"00",X"20",X"09",X"7D",X"FE",X"1F",X"38",X"08",X"FE",X"B4",X"38", + X"08",X"1E",X"01",X"18",X"06",X"1E",X"03",X"18",X"02",X"1E",X"02",X"E1",X"C9",X"D5",X"3E",X"DA", + X"08",X"3A",X"65",X"60",X"FE",X"00",X"20",X"05",X"3A",X"9F",X"60",X"18",X"03",X"3A",X"A2",X"60", + X"FE",X"00",X"28",X"0D",X"FE",X"03",X"28",X"06",X"47",X"08",X"05",X"80",X"18",X"02",X"3E",X"DD", + X"77",X"DD",X"21",X"26",X"60",X"DD",X"CB",X"00",X"86",X"DD",X"CB",X"00",X"8E",X"DD",X"21",X"49", + X"60",X"DD",X"36",X"00",X"82",X"CD",X"3F",X"3E",X"3E",X"09",X"81",X"DD",X"77",X"02",X"DD",X"70", + X"01",X"DD",X"36",X"04",X"0F",X"7B",X"FE",X"02",X"38",X"0E",X"28",X"06",X"DD",X"36",X"03",X"E0", + X"18",X"0A",X"DD",X"36",X"03",X"DC",X"18",X"04",X"DD",X"36",X"03",X"D8",X"E5",X"21",X"00",X"60", + X"CB",X"D6",X"06",X"1E",X"C5",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"CD",X"5A",X"2D",X"C1",X"10", + X"F3",X"AF",X"32",X"49",X"60",X"21",X"26",X"60",X"CB",X"CE",X"E1",X"36",X"FF",X"D1",X"C9",X"E5", + X"D5",X"11",X"A0",X"D0",X"A7",X"ED",X"52",X"4D",X"3E",X"E0",X"A5",X"6F",X"06",X"02",X"CB",X"3C", + X"CB",X"1D",X"10",X"FA",X"45",X"CB",X"21",X"CB",X"21",X"CB",X"21",X"D1",X"E1",X"C9",X"E5",X"16", + X"00",X"FE",X"5E",X"28",X"2F",X"14",X"FE",X"5B",X"28",X"2A",X"14",X"FE",X"59",X"28",X"25",X"14", + X"FE",X"5A",X"28",X"20",X"14",X"FE",X"5C",X"20",X"0A",X"23",X"7E",X"FE",X"66",X"38",X"15",X"14", + X"14",X"18",X"11",X"14",X"FE",X"5D",X"28",X"0C",X"14",X"14",X"FE",X"5F",X"28",X"06",X"14",X"FE", + X"60",X"28",X"01",X"14",X"E1",X"C9",X"FE",X"03",X"28",X"05",X"FE",X"02",X"28",X"12",X"C9",X"3A", + X"65",X"60",X"FE",X"00",X"20",X"05",X"21",X"9D",X"60",X"18",X"16",X"21",X"A0",X"60",X"18",X"11", + X"3A",X"65",X"60",X"FE",X"00",X"20",X"05",X"21",X"9E",X"60",X"18",X"3E",X"21",X"A1",X"60",X"18", + X"39",X"7A",X"FE",X"00",X"20",X"04",X"CB",X"AE",X"18",X"2E",X"FE",X"01",X"20",X"04",X"CB",X"96", + X"18",X"26",X"FE",X"02",X"20",X"04",X"CB",X"86",X"18",X"1E",X"FE",X"03",X"20",X"04",X"CB",X"8E", + X"18",X"16",X"FE",X"04",X"20",X"04",X"CB",X"9E",X"18",X"0E",X"FE",X"05",X"20",X"04",X"CB",X"A6", + X"18",X"06",X"FE",X"06",X"20",X"02",X"CB",X"B6",X"18",X"2F",X"7A",X"FE",X"00",X"20",X"04",X"CB", + X"A6",X"18",X"1E",X"FE",X"01",X"20",X"04",X"CB",X"86",X"18",X"16",X"FE",X"07",X"20",X"04",X"CB", + X"8E",X"18",X"0E",X"FE",X"08",X"20",X"04",X"CB",X"96",X"18",X"06",X"FE",X"09",X"20",X"02",X"CB", + X"9E",X"2B",X"E5",X"CD",X"1C",X"31",X"E1",X"18",X"05",X"E5",X"CD",X"F4",X"30",X"E1",X"C9",X"CD", + X"C7",X"1F",X"CD",X"8F",X"17",X"3A",X"03",X"60",X"FE",X"00",X"20",X"F3",X"C9",X"FD",X"21",X"9C", + X"61",X"DD",X"21",X"91",X"60",X"CD",X"35",X"40",X"DD",X"21",X"92",X"60",X"CD",X"35",X"40",X"DD", + X"21",X"93",X"60",X"CD",X"35",X"40",X"DD",X"21",X"94",X"60",X"CD",X"35",X"40",X"CD",X"A9",X"34", + X"08",X"47",X"3E",X"06",X"90",X"28",X"13",X"47",X"08",X"CB",X"27",X"16",X"00",X"5F",X"21",X"A8", + X"61",X"19",X"36",X"00",X"23",X"36",X"00",X"23",X"10",X"F8",X"C9",X"DD",X"E5",X"F5",X"D5",X"78", + X"FE",X"0A",X"38",X"12",X"28",X"0A",X"FE",X"0B",X"20",X"2D",X"DD",X"21",X"A8",X"61",X"18",X"0A", + X"DD",X"21",X"A2",X"61",X"18",X"04",X"DD",X"21",X"9C",X"61",X"DD",X"7E",X"01",X"FE",X"00",X"28", + X"10",X"DD",X"23",X"DD",X"23",X"DD",X"E5",X"11",X"B4",X"61",X"7B",X"D1",X"BB",X"28",X"08",X"18", + X"E9",X"DD",X"75",X"00",X"DD",X"74",X"01",X"D1",X"F1",X"DD",X"E1",X"C9",X"F5",X"C5",X"E5",X"AF", + X"06",X"18",X"21",X"9C",X"61",X"77",X"23",X"10",X"FC",X"E1",X"C1",X"F1",X"C9",X"21",X"02",X"90", + X"CB",X"6E",X"28",X"10",X"21",X"00",X"A0",X"3A",X"65",X"60",X"FE",X"00",X"20",X"04",X"CB",X"86", + X"18",X"02",X"CB",X"C6",X"C9",X"F5",X"C5",X"D5",X"06",X"0C",X"11",X"9C",X"61",X"1A",X"BD",X"20", + X"06",X"13",X"1A",X"1B",X"BC",X"28",X"06",X"13",X"13",X"10",X"F2",X"18",X"04",X"AF",X"12",X"13"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_cpu3.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_cpu3.vhd new file mode 100644 index 00000000..32387a66 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_cpu3.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_cpu3 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 prom of rom_cpu3 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"12",X"D1",X"C1",X"F1",X"C9",X"06",X"06",X"DD",X"21",X"A8",X"61",X"DD",X"7E",X"01",X"FE",X"00", + X"28",X"1C",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"DD",X"E5",X"C5",X"CD",X"2B",X"3D",X"36",X"E5", + X"21",X"A9",X"60",X"34",X"C1",X"DD",X"E1",X"AF",X"DD",X"77",X"00",X"DD",X"77",X"01",X"DD",X"23", + X"DD",X"23",X"10",X"D7",X"C9",X"AF",X"06",X"03",X"DD",X"4E",X"00",X"CD",X"3B",X"33",X"FD",X"75", + X"00",X"FD",X"23",X"FD",X"74",X"00",X"FD",X"23",X"3C",X"DD",X"23",X"DD",X"23",X"DD",X"23",X"DD", + X"23",X"10",X"E5",X"C9",X"06",X"0C",X"DD",X"21",X"9C",X"61",X"DD",X"7E",X"01",X"FE",X"00",X"28", + X"16",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"DD",X"E5",X"C5",X"CD",X"2B",X"3D",X"C1",X"DD",X"E1", + X"AF",X"DD",X"77",X"00",X"DD",X"77",X"01",X"DD",X"23",X"DD",X"23",X"10",X"DD",X"C9",X"3A",X"B4", + X"61",X"E6",X"0F",X"CA",X"A4",X"40",X"21",X"21",X"60",X"CB",X"8E",X"CB",X"86",X"06",X"04",X"21", + X"2B",X"60",X"11",X"05",X"00",X"1F",X"D2",X"9D",X"40",X"CB",X"86",X"CB",X"8E",X"19",X"10",X"F5", + X"AF",X"32",X"B4",X"61",X"CD",X"F8",X"40",X"CD",X"B0",X"3C",X"E6",X"0F",X"28",X"1D",X"CD",X"5C", + X"2E",X"CD",X"CC",X"40",X"06",X"04",X"21",X"2B",X"60",X"C3",X"C2",X"40",X"D5",X"11",X"05",X"00", + X"19",X"D1",X"CB",X"4E",X"28",X"03",X"CD",X"BA",X"42",X"10",X"F1",X"C9",X"3A",X"C3",X"61",X"47", + X"CB",X"2F",X"CB",X"2F",X"CB",X"2F",X"CB",X"2F",X"5F",X"CB",X"48",X"20",X"10",X"CB",X"50",X"20", + X"08",X"CB",X"58",X"28",X"12",X"3E",X"CC",X"18",X"06",X"3E",X"80",X"18",X"02",X"3E",X"33",X"21", + X"B5",X"61",X"86",X"77",X"30",X"01",X"1C",X"C9",X"CD",X"26",X"1F",X"21",X"A6",X"0E",X"FE",X"33", + X"DA",X"05",X"41",X"3E",X"32",X"5F",X"16",X"00",X"19",X"5E",X"21",X"D8",X"0E",X"3A",X"02",X"90", + X"CB",X"4F",X"20",X"03",X"21",X"E8",X"0E",X"3A",X"B7",X"61",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F", + X"CB",X"3F",X"83",X"FE",X"10",X"38",X"02",X"3E",X"0F",X"5F",X"19",X"7E",X"32",X"C3",X"61",X"C9", + X"CB",X"47",X"20",X"1B",X"CB",X"4F",X"20",X"2A",X"CB",X"57",X"20",X"39",X"3E",X"02",X"83",X"5F", + X"CD",X"0A",X"3C",X"7E",X"FE",X"35",X"28",X"3F",X"FE",X"37",X"28",X"3B",X"C3",X"85",X"41",X"7A", + X"D6",X"01",X"57",X"CD",X"0A",X"3C",X"7E",X"FE",X"3D",X"28",X"2C",X"FE",X"3F",X"28",X"28",X"C3", + X"85",X"41",X"7B",X"D6",X"07",X"5F",X"CD",X"0A",X"3C",X"7E",X"FE",X"35",X"28",X"19",X"FE",X"37", + X"28",X"15",X"C3",X"85",X"41",X"3E",X"08",X"82",X"57",X"CD",X"0A",X"3C",X"7E",X"FE",X"3F",X"28", + X"06",X"FE",X"3D",X"28",X"02",X"A7",X"C9",X"37",X"C9",X"CB",X"47",X"20",X"2C",X"CB",X"4F",X"20", + X"4B",X"CB",X"57",X"20",X"6A",X"3E",X"02",X"83",X"47",X"5F",X"CD",X"0A",X"3C",X"7E",X"FE",X"4A", + X"CA",X"22",X"42",X"FE",X"45",X"28",X"7B",X"78",X"C6",X"02",X"5F",X"CD",X"0A",X"3C",X"7E",X"FE", + X"41",X"28",X"6F",X"FE",X"46",X"28",X"6B",X"18",X"67",X"7A",X"D6",X"01",X"47",X"57",X"CD",X"0A", + X"3C",X"7E",X"FE",X"45",X"28",X"5C",X"FE",X"46",X"28",X"58",X"78",X"D6",X"02",X"57",X"CD",X"0A", + X"3C",X"7E",X"FE",X"4A",X"28",X"4C",X"FE",X"41",X"28",X"48",X"18",X"44",X"7B",X"D6",X"01",X"47", + X"5F",X"CD",X"0A",X"3C",X"7E",X"FE",X"49",X"28",X"39",X"FE",X"43",X"28",X"35",X"78",X"D6",X"06", + X"5F",X"CD",X"0A",X"3C",X"7E",X"FE",X"41",X"28",X"29",X"FE",X"46",X"28",X"25",X"18",X"21",X"3E", + X"02",X"82",X"47",X"57",X"CD",X"0A",X"3C",X"7E",X"FE",X"44",X"28",X"16",X"FE",X"47",X"28",X"12", + X"78",X"C6",X"06",X"57",X"CD",X"0A",X"3C",X"7E",X"FE",X"4A",X"28",X"06",X"FE",X"41",X"28",X"02", + X"A7",X"C9",X"37",X"C9",X"DD",X"7E",X"00",X"FE",X"02",X"38",X"0A",X"28",X"0C",X"FE",X"04",X"28", + X"0C",X"DD",X"34",X"02",X"C9",X"DD",X"35",X"01",X"C9",X"DD",X"35",X"02",X"C9",X"DD",X"34",X"01", + X"C9",X"DD",X"21",X"BE",X"61",X"DD",X"56",X"00",X"DD",X"5E",X"01",X"06",X"01",X"1F",X"30",X"0A", + X"CB",X"20",X"CB",X"60",X"28",X"F7",X"AF",X"C3",X"4B",X"42",X"32",X"C8",X"61",X"C5",X"50",X"CD", + X"11",X"39",X"C1",X"3A",X"C8",X"61",X"38",X"E8",X"32",X"C8",X"61",X"C5",X"78",X"DD",X"56",X"00", + X"DD",X"5E",X"01",X"CD",X"30",X"41",X"C1",X"3A",X"C8",X"61",X"38",X"D4",X"50",X"C9",X"08",X"7A", + X"E6",X"0F",X"FE",X"08",X"20",X"32",X"7B",X"E6",X"0F",X"FE",X"06",X"20",X"2B",X"08",X"E6",X"05", + X"20",X"08",X"43",X"7A",X"CD",X"7A",X"37",X"C3",X"9F",X"42",X"42",X"7B",X"CD",X"DA",X"36",X"CB", + X"3A",X"CB",X"1B",X"DA",X"AA",X"42",X"81",X"C3",X"9F",X"42",X"CD",X"03",X"37",X"28",X"07",X"38", + X"07",X"CB",X"FA",X"C3",X"A6",X"42",X"37",X"C9",X"A7",X"C9",X"E5",X"D5",X"C5",X"CD",X"F0",X"43", + X"01",X"03",X"00",X"21",X"BA",X"61",X"11",X"BD",X"61",X"ED",X"B0",X"AF",X"32",X"C1",X"61",X"32", + X"C2",X"61",X"21",X"BD",X"61",X"7E",X"23",X"56",X"23",X"5E",X"CD",X"7E",X"42",X"D2",X"3A",X"43", + X"CD",X"E6",X"42",X"C3",X"BA",X"43",X"DD",X"21",X"BE",X"61",X"E1",X"C1",X"C5",X"E5",X"3E",X"04", + X"90",X"4F",X"06",X"00",X"21",X"C4",X"61",X"09",X"56",X"CD",X"11",X"39",X"38",X"13",X"D5",X"7A", + X"21",X"BE",X"61",X"56",X"23",X"5E",X"CD",X"30",X"41",X"D1",X"38",X"05",X"21",X"BD",X"61",X"72", + X"C9",X"3A",X"C1",X"61",X"B2",X"32",X"C1",X"61",X"21",X"BD",X"61",X"7E",X"47",X"A3",X"28",X"09", + X"78",X"23",X"56",X"23",X"5E",X"CD",X"30",X"41",X"D0",X"3A",X"BD",X"61",X"47",X"3A",X"C1",X"61", + X"B0",X"32",X"C1",X"61",X"CD",X"41",X"42",X"C3",X"0C",X"43",X"21",X"BD",X"61",X"7E",X"23",X"56", + X"23",X"5E",X"CD",X"89",X"41",X"30",X"12",X"3A",X"BD",X"61",X"47",X"CB",X"3F",X"CB",X"3F",X"CB", + X"20",X"CB",X"20",X"B0",X"E6",X"0F",X"32",X"BD",X"61",X"21",X"BD",X"61",X"7E",X"23",X"56",X"23", + X"5E",X"FE",X"02",X"28",X"0D",X"38",X"12",X"FE",X"04",X"28",X"0B",X"7B",X"D6",X"04",X"5F",X"C3", + X"7B",X"43",X"1D",X"C3",X"7B",X"43",X"14",X"14",X"14",X"14",X"14",X"CD",X"0A",X"3C",X"7E",X"FE", + X"63",X"C2",X"BA",X"43",X"CD",X"E5",X"3F",X"CD",X"2B",X"3D",X"E5",X"21",X"01",X"60",X"CB",X"FE", + X"21",X"5F",X"60",X"CB",X"B6",X"E1",X"C1",X"C5",X"21",X"B4",X"61",X"3E",X"04",X"90",X"28",X"0B", + X"FE",X"02",X"28",X"0C",X"38",X"0F",X"CB",X"DE",X"C3",X"CE",X"43",X"CB",X"C6",X"C3",X"CE",X"43", + X"CB",X"D6",X"C3",X"CE",X"43",X"CB",X"CE",X"C3",X"CE",X"43",X"DD",X"21",X"BD",X"61",X"CD",X"24", + X"42",X"21",X"C2",X"61",X"34",X"7E",X"C1",X"D1",X"D5",X"C5",X"BB",X"C2",X"D2",X"42",X"C1",X"D1", + X"E1",X"E5",X"D5",X"C5",X"3A",X"BD",X"61",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB", + X"CF",X"77",X"3A",X"BE",X"61",X"23",X"77",X"3A",X"BF",X"61",X"23",X"77",X"C1",X"D1",X"E1",X"C9", + X"11",X"BA",X"61",X"7E",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"12",X"13",X"23",X"7E", + X"12",X"13",X"23",X"7E",X"12",X"C9",X"11",X"05",X"00",X"06",X"04",X"21",X"2B",X"60",X"E5",X"C5", + X"CB",X"46",X"C2",X"7A",X"44",X"19",X"10",X"F8",X"C1",X"E1",X"CB",X"4E",X"28",X"23",X"19",X"10", + X"F9",X"21",X"5F",X"60",X"CB",X"76",X"C0",X"DD",X"21",X"21",X"60",X"DD",X"36",X"00",X"82",X"DD", + X"36",X"01",X"58",X"DD",X"36",X"02",X"86",X"CD",X"7F",X"1F",X"DD",X"77",X"03",X"DD",X"70",X"04", + X"C9",X"E5",X"C5",X"06",X"04",X"21",X"2B",X"60",X"CB",X"4E",X"28",X"1B",X"E5",X"DD",X"E1",X"3E", + X"58",X"DD",X"BE",X"01",X"20",X"11",X"3E",X"86",X"DD",X"BE",X"02",X"38",X"0A",X"3E",X"94",X"DD", + X"BE",X"02",X"30",X"03",X"C1",X"E1",X"C9",X"19",X"10",X"DE",X"C1",X"78",X"D6",X"04",X"ED",X"44", + X"4F",X"CD",X"61",X"30",X"E1",X"CB",X"8E",X"CB",X"C6",X"C9",X"C1",X"E1",X"C9",X"3A",X"5F",X"60", + X"CB",X"5F",X"CA",X"9A",X"44",X"ED",X"4B",X"D3",X"61",X"ED",X"5B",X"D5",X"61",X"26",X"62",X"3A", + X"D7",X"61",X"FE",X"00",X"CA",X"CA",X"44",X"C3",X"42",X"45",X"CD",X"C4",X"45",X"01",X"CF",X"62", + X"11",X"FF",X"62",X"3E",X"FF",X"02",X"12",X"21",X"26",X"60",X"CB",X"4E",X"C8",X"23",X"D5",X"C5", + X"56",X"23",X"5E",X"3E",X"35",X"BB",X"DA",X"BC",X"44",X"C1",X"D1",X"C9",X"CD",X"DC",X"45",X"C1", + X"D1",X"0D",X"02",X"26",X"62",X"6F",X"7E",X"F6",X"0F",X"77",X"0A",X"FE",X"FF",X"CA",X"3C",X"45", + X"6F",X"CB",X"7E",X"28",X"12",X"E5",X"D5",X"11",X"F0",X"FF",X"19",X"D1",X"7E",X"E6",X"0F",X"20", + X"05",X"CB",X"CE",X"1D",X"7D",X"12",X"E1",X"CB",X"76",X"28",X"0D",X"E5",X"2C",X"7E",X"E6",X"0F", + X"20",X"05",X"CB",X"C6",X"1D",X"7D",X"12",X"E1",X"CB",X"6E",X"28",X"12",X"E5",X"D5",X"11",X"10", + X"00",X"19",X"D1",X"7E",X"E6",X"0F",X"20",X"05",X"CB",X"DE",X"1D",X"7D",X"12",X"E1",X"CB",X"66", + X"28",X"0D",X"E5",X"2D",X"7E",X"E6",X"0F",X"20",X"05",X"CB",X"D6",X"1D",X"7D",X"12",X"E1",X"0C", + X"E5",X"21",X"01",X"90",X"CB",X"7E",X"E1",X"CA",X"CA",X"44",X"21",X"5F",X"60",X"CB",X"DE",X"ED", + X"43",X"D3",X"61",X"ED",X"53",X"D5",X"61",X"AF",X"32",X"D7",X"61",X"C9",X"1A",X"FE",X"FF",X"CA", + X"BE",X"45",X"1A",X"FE",X"FF",X"CA",X"B8",X"45",X"6F",X"CB",X"7E",X"28",X"12",X"E5",X"D5",X"11", + X"F0",X"FF",X"19",X"D1",X"7E",X"E6",X"0F",X"20",X"05",X"CB",X"CE",X"0D",X"7D",X"02",X"E1",X"CB", + X"76",X"28",X"0D",X"E5",X"2C",X"7E",X"E6",X"0F",X"20",X"05",X"CB",X"C6",X"0D",X"7D",X"02",X"E1", + X"CB",X"6E",X"28",X"12",X"E5",X"D5",X"11",X"10",X"00",X"19",X"D1",X"7E",X"E6",X"0F",X"20",X"05", + X"CB",X"DE",X"0D",X"7D",X"02",X"E1",X"CB",X"66",X"28",X"0D",X"E5",X"2D",X"7E",X"E6",X"0F",X"20", + X"05",X"CB",X"D6",X"0D",X"7D",X"02",X"E1",X"1C",X"E5",X"21",X"01",X"90",X"CB",X"7E",X"E1",X"CA", + X"42",X"45",X"21",X"5F",X"60",X"CB",X"DE",X"ED",X"43",X"D3",X"61",X"ED",X"53",X"D5",X"61",X"CB", + X"C7",X"32",X"D7",X"61",X"C9",X"C3",X"42",X"45",X"0A",X"FE",X"FF",X"C2",X"CA",X"44",X"21",X"5F", + X"60",X"CB",X"9E",X"C9",X"11",X"10",X"00",X"21",X"00",X"62",X"E5",X"06",X"0B",X"7E",X"E6",X"F0", + X"77",X"23",X"10",X"F9",X"E1",X"19",X"3E",X"B0",X"BD",X"20",X"EF",X"C9",X"CB",X"3A",X"CB",X"3A", + X"CB",X"3A",X"CB",X"3A",X"7B",X"D6",X"30",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"4F", + X"3E",X"0A",X"91",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"B2",X"C9",X"DD",X"21",X"A2", + X"0D",X"21",X"A0",X"62",X"06",X"0B",X"11",X"F0",X"FF",X"E5",X"C5",X"06",X"05",X"DD",X"7E",X"00", + X"4F",X"E6",X"0F",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"77",X"19",X"79",X"E6",X"F0", + X"77",X"19",X"DD",X"23",X"10",X"E7",X"DD",X"7E",X"00",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB", + X"27",X"77",X"C1",X"E1",X"DD",X"23",X"23",X"10",X"D0",X"C9",X"11",X"C4",X"46",X"DD",X"21",X"1D", + X"0D",X"3E",X"01",X"01",X"F0",X"FF",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"F5",X"7E",X"FE",X"36", + X"21",X"00",X"62",X"1A",X"6F",X"28",X"0D",X"CB",X"A6",X"2B",X"CB",X"B6",X"09",X"CB",X"B6",X"23", + X"CB",X"A6",X"18",X"0B",X"CB",X"BE",X"2B",X"CB",X"BE",X"09",X"CB",X"AE",X"23",X"CB",X"AE",X"F1", + X"13",X"DD",X"23",X"DD",X"23",X"3C",X"FE",X"15",X"20",X"CC",X"C9",X"E5",X"21",X"C4",X"46",X"05", + X"48",X"06",X"00",X"09",X"EB",X"01",X"F0",X"FF",X"E1",X"7E",X"32",X"C8",X"61",X"FE",X"36",X"21", + X"00",X"62",X"1A",X"6F",X"28",X"1A",X"3A",X"C8",X"61",X"FE",X"3E",X"C0",X"CB",X"FE",X"CB",X"A6", + X"2B",X"CB",X"FE",X"CB",X"B6",X"09",X"CB",X"EE",X"CB",X"B6",X"23",X"CB",X"EE",X"CB",X"A6",X"C9", + X"CB",X"E6",X"CB",X"BE",X"2B",X"CB",X"F6",X"CB",X"BE",X"09",X"CB",X"F6",X"CB",X"AE",X"23",X"CB", + X"E6",X"CB",X"AE",X"C9",X"31",X"A2",X"72",X"12",X"63",X"33",X"94",X"74",X"44",X"24",X"97",X"77", + X"47",X"27",X"68",X"38",X"A9",X"79",X"19",X"3A",X"CD",X"26",X"1F",X"FE",X"1E",X"38",X"02",X"3E", + X"1E",X"21",X"88",X"47",X"32",X"C8",X"61",X"3D",X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"21", + X"A6",X"47",X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"47",X"F5",X"3A",X"B8",X"61",X"4F",X"78", + X"06",X"00",X"17",X"38",X"03",X"04",X"18",X"FA",X"C5",X"79",X"07",X"10",X"FD",X"C1",X"CB",X"3F", + X"10",X"FC",X"47",X"F1",X"B8",X"20",X"3C",X"3A",X"B6",X"61",X"FE",X"3B",X"20",X"35",X"21",X"D2", + X"61",X"7E",X"34",X"E6",X"03",X"21",X"CE",X"61",X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"FE", + X"00",X"20",X"20",X"E5",X"21",X"AE",X"47",X"3A",X"02",X"90",X"CB",X"47",X"20",X"03",X"21",X"CD", + X"47",X"3A",X"B7",X"61",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"85",X"6F",X"3E",X"00",X"8C",X"67", + X"7E",X"E1",X"77",X"FD",X"21",X"C4",X"61",X"11",X"05",X"00",X"DD",X"21",X"2C",X"60",X"21",X"CE", + X"61",X"06",X"04",X"7E",X"FE",X"00",X"28",X"18",X"D5",X"DD",X"56",X"00",X"DD",X"5E",X"01",X"CD", + X"DC",X"45",X"5F",X"16",X"62",X"1A",X"E6",X"0F",X"D1",X"FE",X"0F",X"28",X"03",X"FD",X"77",X"00", + X"FD",X"23",X"DD",X"19",X"23",X"10",X"DC",X"C9",X"00",X"02",X"03",X"04",X"01",X"02",X"03",X"02", + X"03",X"04",X"03",X"04",X"05",X"05",X"06",X"06",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"07",X"05",X"05",X"05",X"04",X"03",X"02",X"01",X"01",X"03",X"03", + X"04",X"04",X"05",X"05",X"06",X"06",X"07",X"07",X"08",X"08",X"09",X"09",X"0A",X"0A",X"0B",X"0B", + X"0C",X"0C",X"0D",X"0D",X"0E",X"0E",X"0F",X"0F",X"10",X"10",X"11",X"11",X"12",X"0A",X"0B",X"0C", + X"0D",X"0E",X"0F",X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17",X"18",X"19",X"1A",X"1B",X"1C", + X"1D",X"1E",X"1F",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"28",X"F5",X"E5",X"D5",X"C5", + X"DD",X"E5",X"06",X"0C",X"21",X"9D",X"D0",X"11",X"20",X"00",X"3E",X"FF",X"77",X"23",X"77",X"19", + X"77",X"2B",X"77",X"19",X"10",X"F6",X"06",X"0C",X"21",X"9D",X"D4",X"3E",X"01",X"77",X"23",X"77", + X"19",X"77",X"2B",X"77",X"19",X"10",X"F6",X"06",X"16",X"21",X"9E",X"D0",X"DD",X"21",X"08",X"49", + X"DD",X"7E",X"00",X"77",X"19",X"DD",X"23",X"10",X"F7",X"06",X"13",X"21",X"9D",X"D0",X"DD",X"21", + X"1E",X"49",X"DD",X"7E",X"00",X"77",X"19",X"DD",X"23",X"10",X"F7",X"DD",X"E1",X"C1",X"D1",X"E1", + X"F1",X"C9",X"CD",X"EC",X"47",X"E5",X"D5",X"C5",X"F5",X"E5",X"D5",X"C5",X"F5",X"11",X"DE",X"D0", + X"06",X"05",X"21",X"01",X"00",X"39",X"3E",X"00",X"ED",X"6F",X"CD",X"B2",X"48",X"ED",X"6F",X"CD", + X"C0",X"48",X"23",X"10",X"F1",X"F1",X"C1",X"D1",X"E1",X"F1",X"C1",X"D1",X"E1",X"C5",X"D5",X"E5", + X"DD",X"E5",X"FD",X"E5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"11",X"5D",X"D3",X"06",X"03", + X"21",X"00",X"00",X"39",X"3E",X"00",X"ED",X"67",X"CD",X"CE",X"48",X"ED",X"67",X"CD",X"CE",X"48", + X"23",X"ED",X"67",X"CD",X"CE",X"48",X"ED",X"67",X"CD",X"DE",X"48",X"23",X"10",X"E6",X"FD",X"E1", + X"DD",X"E1",X"E1",X"D1",X"C1",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"C9",X"76",X"CD",X"D5", + X"22",X"C9",X"E5",X"F5",X"6B",X"62",X"77",X"11",X"20",X"00",X"19",X"5D",X"54",X"F1",X"E1",X"C9", + X"E5",X"F5",X"6B",X"62",X"77",X"11",X"80",X"00",X"19",X"5D",X"54",X"F1",X"E1",X"C9",X"E5",X"F5", + X"6B",X"62",X"77",X"11",X"20",X"00",X"A7",X"ED",X"52",X"5D",X"54",X"F1",X"E1",X"C9",X"E5",X"F5", + X"6B",X"62",X"77",X"11",X"A0",X"00",X"A7",X"ED",X"52",X"5D",X"54",X"F1",X"E1",X"C9",X"21",X"00", + X"60",X"7E",X"CD",X"42",X"48",X"DD",X"21",X"00",X"90",X"DD",X"CB",X"00",X"76",X"20",X"FA",X"DD", + X"CB",X"00",X"76",X"28",X"FA",X"23",X"18",X"E9",X"0A",X"2A",X"FF",X"FF",X"FF",X"0C",X"2A",X"FF", + X"FF",X"FF",X"0B",X"2A",X"FF",X"FF",X"FF",X"0E",X"2A",X"FF",X"FF",X"FF",X"0D",X"2A",X"11",X"15", + X"2A",X"FF",X"FF",X"FF",X"FF",X"FF",X"12",X"21",X"2A",X"FF",X"FF",X"FF",X"FF",X"FF",X"12",X"22", + X"2A",X"36",X"0D",X"19",X"36",X"FF",X"19",X"C3",X"EB",X"1D",X"36",X"1D",X"19",X"36",X"FF",X"19", + X"C3",X"FE",X"1D",X"D5",X"AF",X"32",X"E0",X"61",X"C3",X"6E",X"37",X"3A",X"26",X"60",X"CB",X"3F", + X"CB",X"3F",X"CB",X"3F",X"C3",X"77",X"36",X"32",X"5F",X"60",X"32",X"E3",X"61",X"C3",X"DC",X"02", + X"21",X"5E",X"60",X"35",X"35",X"21",X"E2",X"61",X"34",X"C3",X"E1",X"03",X"32",X"65",X"60",X"21", + X"E3",X"61",X"7E",X"FE",X"00",X"CA",X"86",X"49",X"3A",X"5F",X"60",X"CB",X"4F",X"CA",X"81",X"49", + X"35",X"35",X"AF",X"32",X"E2",X"61",X"C3",X"E5",X"03",X"21",X"E3",X"61",X"34",X"CD",X"2F",X"3F", + X"C3",X"45",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"19",X"58",X"A0",X"00",X"41",X"19",X"60",X"1C",X"06",X"21",X"11",X"68",X"A4",X"F6",X"5A", + X"01",X"44",X"04",X"80",X"09",X"A1",X"00",X"A0",X"05",X"01",X"00",X"00",X"40",X"22",X"00",X"00", + X"02",X"10",X"A0",X"00",X"04",X"00",X"00",X"29",X"01",X"20",X"01",X"04",X"85",X"0D",X"21",X"33", + X"9B",X"1F",X"02",X"1E",X"C9",X"C0",X"88",X"84",X"84",X"4A",X"80",X"C2",X"42",X"14",X"C6",X"46", + X"46",X"00",X"D0",X"A4",X"A1",X"4C",X"C2",X"99",X"18",X"8A",X"42",X"E8",X"42",X"13",X"C8",X"E0", + X"11",X"10",X"18",X"62",X"22",X"40",X"41",X"02",X"80",X"04",X"50",X"08",X"18",X"10",X"40",X"80", + X"F0",X"20",X"A0",X"00",X"0D",X"04",X"00",X"00",X"14",X"60",X"80",X"40",X"00",X"10",X"04",X"60", + X"10",X"16",X"58",X"87",X"71",X"15",X"01",X"92",X"A5",X"01",X"06",X"02",X"02",X"01",X"00",X"C0", + X"23",X"01",X"10",X"85",X"81",X"80",X"50",X"22",X"44",X"0B",X"19",X"02",X"8B",X"B5",X"AF",X"AC", + X"00",X"00",X"00",X"82",X"80",X"24",X"00",X"10",X"00",X"00",X"01",X"50",X"00",X"80",X"10",X"80", + X"20",X"00",X"09",X"04",X"01",X"00",X"40",X"00",X"00",X"00",X"12",X"00",X"A0",X"81",X"22",X"63", + X"5B",X"4E",X"0D",X"58",X"44",X"C2",X"93",X"11",X"94",X"C4",X"82",X"41",X"40",X"00",X"40",X"FA", + X"66",X"8B",X"50",X"C5",X"2B",X"81",X"0F",X"07",X"42",X"85",X"80",X"06",X"1A",X"48",X"47",X"89", + X"08",X"0C",X"00",X"C8",X"00",X"10",X"44",X"00",X"10",X"00",X"00",X"00",X"08",X"00",X"08",X"44", + X"92",X"00",X"10",X"40",X"80",X"01",X"10",X"0A",X"00",X"02",X"42",X"00",X"AA",X"00",X"10",X"60", + X"B1",X"90",X"14",X"68",X"A3",X"80",X"85",X"12",X"96",X"0A",X"02",X"10",X"21",X"05",X"81",X"03", + X"20",X"70",X"00",X"00",X"44",X"11",X"09",X"0D",X"61",X"01",X"9A",X"A8",X"45",X"B8",X"9C",X"A7", + X"A0",X"C2",X"83",X"21",X"40",X"20",X"20",X"00",X"08",X"20",X"81",X"00",X"35",X"08",X"00",X"90", + X"B0",X"00",X"00",X"00",X"00",X"28",X"41",X"00",X"20",X"20",X"04",X"10",X"AC",X"84",X"A6",X"38", + X"42",X"62",X"A2",X"2C",X"95",X"84",X"91",X"C3",X"C0",X"04",X"42",X"01",X"59",X"44",X"83",X"C0", + X"4A",X"64",X"64",X"30",X"C0",X"2E",X"58",X"C8",X"B9",X"C3",X"E8",X"E1",X"84",X"5A",X"05",X"CE", + X"00",X"80",X"00",X"10",X"00",X"00",X"08",X"40",X"72",X"04",X"40",X"08",X"40",X"00",X"00",X"90", + X"01",X"00",X"00",X"00",X"01",X"40",X"00",X"00",X"90",X"A0",X"00",X"A2",X"00",X"80",X"90",X"00", + X"74",X"80",X"29",X"01",X"F0",X"30",X"B1",X"A1",X"21",X"31",X"35",X"1D",X"09",X"1D",X"A5",X"07", + X"21",X"F0",X"22",X"20",X"27",X"A1",X"01",X"82",X"C0",X"08",X"A4",X"11",X"38",X"B5",X"C8",X"A5", + X"22",X"00",X"00",X"03",X"30",X"E1",X"A0",X"01",X"00",X"00",X"08",X"00",X"00",X"00",X"01",X"00", + X"00",X"00",X"00",X"00",X"41",X"80",X"40",X"80",X"01",X"00",X"08",X"50",X"82",X"20",X"9F",X"4D", + X"72",X"A9",X"06",X"4E",X"38",X"40",X"80",X"2E",X"04",X"A6",X"83",X"30",X"24",X"02",X"08",X"00", + X"40",X"30",X"C2",X"20",X"62",X"64",X"E8",X"62",X"E8",X"DA",X"03",X"9B",X"08",X"51",X"46",X"16", + X"88",X"14",X"00",X"22",X"05",X"C0",X"00",X"00",X"11",X"00",X"02",X"00",X"80",X"A0",X"40",X"00", + X"00",X"01",X"00",X"02",X"00",X"08",X"80",X"11",X"00",X"00",X"1E",X"02",X"A0",X"22",X"10",X"00", + X"43",X"E0",X"41",X"71",X"40",X"05",X"14",X"80",X"9C",X"20",X"AF",X"3B",X"4A",X"F8",X"01",X"33", + X"31",X"02",X"51",X"A0",X"18",X"7C",X"80",X"33",X"25",X"00",X"1C",X"24",X"3E",X"EC",X"78",X"5F", + X"21",X"00",X"00",X"11",X"04",X"04",X"01",X"00",X"00",X"04",X"00",X"00",X"10",X"00",X"00",X"14", + X"80",X"20",X"40",X"20",X"20",X"16",X"00",X"90",X"08",X"04",X"00",X"10",X"23",X"40",X"08",X"09", + X"C8",X"8A",X"C8",X"C8",X"CA",X"82",X"82",X"52",X"4A",X"C0",X"0A",X"4A",X"8A",X"C0",X"02",X"4A", + X"4A",X"CA",X"C0",X"CA",X"C8",X"CA",X"CA",X"88",X"48",X"4A",X"4A",X"4A",X"4A",X"62",X"02",X"C0", + X"DA",X"CA",X"08",X"EA",X"CA",X"4A",X"CA",X"EA",X"CA",X"8A",X"CA",X"C0",X"08",X"CA",X"82",X"88", + X"80",X"C8",X"CA",X"C8",X"42",X"8A",X"C2",X"8A",X"8A",X"08",X"CA",X"CA",X"40",X"CA",X"C8",X"9A", + X"30",X"34",X"15",X"34",X"25",X"35",X"24",X"25",X"10",X"10",X"35",X"15",X"20",X"35",X"31",X"15", + X"10",X"35",X"35",X"34",X"74",X"34",X"11",X"14",X"20",X"34",X"04",X"31",X"34",X"35",X"35",X"25", + X"2D",X"25",X"15",X"14",X"34",X"34",X"35",X"01",X"35",X"05",X"35",X"24",X"35",X"35",X"35",X"35", + X"33",X"35",X"15",X"31",X"15",X"35",X"35",X"15",X"31",X"35",X"34",X"35",X"34",X"15",X"3D",X"35", + X"CA",X"C0",X"CA",X"CA",X"88",X"88",X"CA",X"8A",X"4A",X"C8",X"C8",X"C2",X"C2",X"C8",X"4A",X"4A", + X"00",X"CA",X"4A",X"CA",X"80",X"4A",X"CA",X"CA",X"42",X"C8",X"CA",X"42",X"4A",X"0A",X"40",X"CA", + X"CA",X"CA",X"5A",X"CA",X"CA",X"CA",X"CA",X"4A",X"8A",X"A8",X"02",X"4A",X"CA",X"8A",X"4A",X"42", + X"C2",X"8A",X"0A",X"C2",X"CA",X"4A",X"CA",X"CA",X"48",X"C2",X"88",X"CA",X"CA",X"C8",X"C2",X"C2", + X"04",X"14",X"31",X"35",X"30",X"34",X"20",X"35",X"31",X"34",X"34",X"34",X"34",X"31",X"11",X"34", + X"25",X"31",X"35",X"35",X"30",X"30",X"10",X"14",X"34",X"31",X"04",X"30",X"34",X"35",X"15",X"21", + X"31",X"15",X"30",X"00",X"34",X"35",X"31",X"30",X"04",X"11",X"04",X"34",X"14",X"24",X"15",X"35", + X"25",X"24",X"15",X"01",X"35",X"15",X"35",X"35",X"35",X"05",X"35",X"35",X"35",X"35",X"25",X"31", + X"DA",X"88",X"40",X"9A",X"C2",X"CA",X"48",X"CA",X"CA",X"48",X"42",X"C0",X"0A",X"48",X"CA",X"C0", + X"08",X"C2",X"42",X"CA",X"C8",X"42",X"C0",X"4A",X"C2",X"4A",X"48",X"CA",X"4A",X"E8",X"42",X"CA", + X"C2",X"CA",X"CA",X"C2",X"8E",X"8A",X"C8",X"8A",X"4A",X"CA",X"CA",X"8A",X"8A",X"CA",X"CA",X"4A", + X"C8",X"CA",X"C2",X"80",X"C8",X"4A",X"5A",X"42",X"C2",X"C0",X"8A",X"0A",X"80",X"CA",X"CA",X"C2", + X"35",X"31",X"31",X"31",X"25",X"00",X"11",X"35",X"15",X"11",X"15",X"31",X"31",X"11",X"04",X"25", + X"05",X"15",X"35",X"71",X"25",X"25",X"30",X"31",X"34",X"15",X"11",X"15",X"25",X"35",X"35",X"11", + X"3C",X"25",X"35",X"35",X"35",X"35",X"55",X"15",X"25",X"31",X"31",X"14",X"35",X"3C",X"24",X"35", + X"34",X"25",X"35",X"25",X"31",X"25",X"35",X"31",X"25",X"35",X"35",X"14",X"3D",X"25",X"35",X"B5", + X"C8",X"CA",X"8A",X"CA",X"4A",X"CA",X"00",X"C8",X"0A",X"00",X"8A",X"CA",X"E2",X"82",X"CA",X"C0", + X"CA",X"C2",X"48",X"CA",X"0A",X"CA",X"CA",X"C8",X"C8",X"88",X"8A",X"C8",X"C2",X"4A",X"42",X"0A", + X"CA",X"CA",X"9A",X"CA",X"88",X"C2",X"CA",X"C2",X"CA",X"8A",X"CA",X"C2",X"82",X"CA",X"4A",X"CA", + X"CA",X"C2",X"DA",X"44",X"CA",X"C8",X"CE",X"0A",X"C8",X"CA",X"48",X"0A",X"02",X"EA",X"C8",X"48", + X"35",X"01",X"34",X"15",X"01",X"35",X"05",X"31",X"15",X"25",X"15",X"35",X"35",X"15",X"01",X"05", + X"35",X"34",X"35",X"35",X"15",X"34",X"35",X"21",X"21",X"30",X"31",X"31",X"35",X"A5",X"15",X"31", + X"30",X"34",X"01",X"B5",X"35",X"21",X"35",X"34",X"13",X"35",X"31",X"15",X"35",X"21",X"35",X"35", + X"15",X"00",X"35",X"35",X"25",X"35",X"54",X"31",X"25",X"35",X"35",X"30",X"39",X"1D",X"35",X"15", + X"88",X"80",X"C8",X"4A",X"80",X"CA",X"48",X"82",X"CA",X"C8",X"CA",X"C2",X"42",X"CA",X"C8",X"8A", + X"88",X"42",X"8A",X"8A",X"C0",X"40",X"C2",X"CA",X"42",X"CA",X"CA",X"C2",X"0A",X"88",X"4A",X"4A", + X"82",X"CA",X"C6",X"CA",X"08",X"8A",X"8A",X"C2",X"CA",X"CA",X"C8",X"CA",X"C2",X"CA",X"4A",X"CA", + X"CA",X"C8",X"CA",X"8A",X"CA",X"CA",X"DA",X"C8",X"CA",X"88",X"02",X"CA",X"8A",X"4A",X"CA",X"80", + X"10",X"24",X"14",X"24",X"15",X"11",X"25",X"11",X"01",X"01",X"34",X"30",X"3D",X"05",X"14",X"31", + X"34",X"25",X"04",X"24",X"34",X"35",X"14",X"35",X"74",X"35",X"31",X"34",X"34",X"35",X"35",X"31", + X"35",X"10",X"05",X"15",X"95",X"15",X"14",X"14",X"35",X"35",X"35",X"00",X"35",X"17",X"30",X"3D", + X"05",X"24",X"05",X"35",X"25",X"25",X"24",X"3D",X"35",X"71",X"34",X"01",X"14",X"35",X"35",X"3C", + X"8A",X"C2",X"CA",X"CA",X"C0",X"C8",X"40",X"C8",X"CA",X"C2",X"4A",X"C2",X"C2",X"CA",X"80",X"00", + X"CA",X"C6",X"08",X"CA",X"4A",X"C8",X"80",X"C8",X"C2",X"CA",X"CA",X"88",X"C2",X"C8",X"CA",X"CA", + X"CA",X"CA",X"CA",X"CA",X"C2",X"CA",X"C8",X"CA",X"CA",X"CA",X"CA",X"C2",X"CA",X"CA",X"CA",X"CA", + X"C2",X"CA",X"CA",X"C2",X"DA",X"4A",X"CA",X"CA",X"CA",X"8A",X"C2",X"C0",X"CA",X"6A",X"CA",X"C2", + X"24",X"15",X"11",X"34",X"35",X"35",X"35",X"05",X"25",X"11",X"01",X"21",X"25",X"21",X"15",X"21", + X"25",X"11",X"11",X"35",X"15",X"35",X"34",X"31",X"35",X"31",X"14",X"34",X"35",X"35",X"35",X"35", + X"34",X"11",X"35",X"35",X"15",X"15",X"14",X"21",X"25",X"35",X"31",X"34",X"34",X"31",X"34",X"3D", + X"35",X"31",X"11",X"31",X"34",X"31",X"34",X"05",X"35",X"15",X"21",X"11",X"35",X"BD",X"B5",X"B4", + X"C8",X"88",X"CA",X"8A",X"88",X"C8",X"CA",X"4A",X"4A",X"C8",X"CA",X"02",X"CA",X"C8",X"CA",X"C8", + X"CA",X"CA",X"CA",X"40",X"C2",X"CA",X"4A",X"8A",X"CA",X"CA",X"48",X"8A",X"0A",X"CA",X"4A",X"E0", + X"CA",X"C2",X"4A",X"CA",X"CA",X"CA",X"8A",X"C2",X"CA",X"CA",X"CA",X"08",X"8A",X"DA",X"82",X"4A", + X"0A",X"C2",X"02",X"48",X"CA",X"CA",X"CA",X"0A",X"0A",X"C2",X"C2",X"88",X"C2",X"42",X"CA",X"42", + X"14",X"30",X"14",X"34",X"31",X"21",X"31",X"25",X"27",X"14",X"35",X"31",X"24",X"24",X"35",X"31", + X"04",X"25",X"B4",X"15",X"25",X"31",X"30",X"34",X"21",X"25",X"24",X"00",X"35",X"35",X"35",X"A5", + X"B5",X"14",X"01",X"31",X"34",X"35",X"24",X"21",X"35",X"34",X"25",X"31",X"35",X"11",X"14",X"35", + X"35",X"34",X"30",X"35",X"24",X"05",X"30",X"35",X"35",X"05",X"35",X"21",X"15",X"35",X"15",X"35", + X"C0",X"CA",X"C2",X"C2",X"CA",X"C8",X"0A",X"C8",X"4A",X"40",X"02",X"42",X"C2",X"C8",X"CA",X"C2", + X"4A",X"CA",X"C8",X"8A",X"42",X"8A",X"C8",X"4A",X"08",X"CA",X"C2",X"40",X"48",X"C8",X"0A",X"CA", + X"CA",X"8A",X"4A",X"C2",X"CA",X"C2",X"CA",X"CA",X"4A",X"CA",X"C2",X"8A",X"42",X"C2",X"C2",X"C8", + X"8E",X"8A",X"8A",X"CA",X"8A",X"C8",X"8A",X"EA",X"8A",X"02",X"02",X"C2",X"C2",X"4A",X"0A",X"C8", + X"31",X"25",X"14",X"21",X"14",X"01",X"34",X"35",X"05",X"35",X"11",X"04",X"25",X"15",X"34",X"25", + X"30",X"35",X"75",X"25",X"35",X"05",X"35",X"21",X"11",X"01",X"04",X"34",X"14",X"35",X"34",X"35", + X"35",X"15",X"35",X"31",X"34",X"11",X"34",X"14",X"35",X"35",X"35",X"25",X"35",X"31",X"34",X"15", + X"35",X"15",X"25",X"25",X"11",X"35",X"31",X"25",X"15",X"15",X"35",X"25",X"31",X"35",X"3D",X"3D", + X"C3",X"60",X"50",X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"C1",X"54",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C3",X"1B",X"56",X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"AF",X"57",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C3",X"BF",X"58",X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"A6",X"5B",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C3",X"F1",X"5B",X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"FB",X"5B",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"30",X"68",X"06",X"10",X"77",X"23",X"10",X"FC",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"68",X"CB",X"1A", + X"11",X"68",X"60",X"3A",X"65",X"60",X"A7",X"28",X"03",X"11",X"6B",X"60",X"CD",X"A4",X"50",X"D4", + X"F6",X"50",X"3A",X"5F",X"60",X"C3",X"C0",X"5E",X"11",X"6B",X"60",X"3A",X"65",X"60",X"A7",X"28", + X"03",X"11",X"68",X"60",X"C3",X"D0",X"5E",X"D8",X"3A",X"65",X"60",X"A7",X"28",X"02",X"3E",X"FF", + X"2F",X"32",X"65",X"60",X"47",X"3A",X"02",X"90",X"E6",X"20",X"28",X"04",X"78",X"32",X"00",X"A0", + X"C3",X"E0",X"5E",X"C9",X"21",X"73",X"60",X"01",X"00",X"09",X"C5",X"D5",X"E5",X"CD",X"2C",X"5D", + X"30",X"0C",X"E1",X"01",X"03",X"00",X"09",X"D1",X"C1",X"0C",X"10",X"EE",X"37",X"C9",X"E1",X"D1", + X"C1",X"DD",X"21",X"00",X"68",X"DD",X"36",X"00",X"5C",X"DD",X"36",X"01",X"4E",X"DD",X"36",X"02", + X"0A",X"3A",X"02",X"90",X"E6",X"04",X"20",X"04",X"DD",X"36",X"02",X"03",X"DD",X"36",X"03",X"00", + X"DD",X"71",X"04",X"EB",X"11",X"05",X"68",X"01",X"03",X"00",X"ED",X"B0",X"EB",X"06",X"0A",X"36", + X"FF",X"23",X"10",X"FB",X"A7",X"C9",X"FD",X"21",X"12",X"68",X"FD",X"36",X"00",X"82",X"FD",X"36", + X"01",X"58",X"FD",X"36",X"02",X"36",X"21",X"85",X"D0",X"01",X"18",X"1A",X"CD",X"52",X"5D",X"21", + X"4E",X"54",X"CD",X"36",X"5D",X"21",X"59",X"54",X"CD",X"36",X"5D",X"21",X"65",X"54",X"CD",X"36", + X"5D",X"DD",X"7E",X"04",X"47",X"87",X"80",X"5F",X"16",X"00",X"21",X"6F",X"54",X"19",X"EB",X"D5", + X"21",X"DE",X"D1",X"01",X"06",X"03",X"CD",X"3F",X"5D",X"D1",X"21",X"DD",X"D0",X"01",X"07",X"03", + X"CD",X"3F",X"5D",X"CD",X"6D",X"5D",X"CD",X"BC",X"5D",X"01",X"0A",X"05",X"21",X"E7",X"D0",X"11", + X"20",X"00",X"C5",X"E5",X"36",X"31",X"19",X"36",X"31",X"19",X"36",X"33",X"19",X"19",X"10",X"F4", + X"E1",X"23",X"23",X"C1",X"0D",X"20",X"EB",X"3E",X"0A",X"06",X"03",X"21",X"98",X"D1",X"CD",X"15", + X"54",X"01",X"04",X"05",X"21",X"16",X"D1",X"C5",X"E5",X"CD",X"15",X"54",X"E1",X"2B",X"2B",X"C1", + X"0D",X"20",X"F4",X"06",X"03",X"CD",X"15",X"54",X"3E",X"01",X"06",X"02",X"CD",X"15",X"54",X"06", + X"05",X"21",X"0C",X"D1",X"CD",X"15",X"54",X"06",X"02",X"21",X"0A",X"D1",X"CD",X"15",X"54",X"3E", + X"27",X"06",X"01",X"CD",X"15",X"54",X"3E",X"28",X"06",X"01",X"CD",X"15",X"54",X"3E",X"24",X"06", + X"01",X"CD",X"15",X"54",X"3E",X"2D",X"06",X"01",X"21",X"88",X"D1",X"CD",X"15",X"54",X"3E",X"29", + X"06",X"01",X"21",X"88",X"D2",X"CD",X"15",X"54",X"21",X"F8",X"D0",X"CD",X"28",X"54",X"21",X"F8", + X"D2",X"CD",X"28",X"54",X"21",X"E8",X"D0",X"CD",X"28",X"54",X"CD",X"3C",X"54",X"CD",X"47",X"5E", + X"CD",X"9C",X"5E",X"DD",X"E5",X"FD",X"E5",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"FD",X"E1",X"DD", + X"E1",X"DD",X"35",X"01",X"20",X"12",X"DD",X"36",X"01",X"4E",X"CD",X"CA",X"53",X"21",X"00",X"60", + X"CB",X"E6",X"DD",X"35",X"00",X"CA",X"29",X"53",X"3A",X"65",X"60",X"A7",X"20",X"05",X"3A",X"00", + X"90",X"18",X"03",X"3A",X"01",X"90",X"2F",X"E6",X"0F",X"28",X"C5",X"1F",X"38",X"68",X"1F",X"38", + X"44",X"1F",X"38",X"21",X"FD",X"36",X"00",X"82",X"FD",X"7E",X"02",X"FE",X"D6",X"D2",X"E0",X"51", + X"FD",X"4E",X"01",X"21",X"BD",X"53",X"CD",X"9F",X"53",X"D2",X"E0",X"51",X"FD",X"71",X"01",X"FD", + X"34",X"02",X"C3",X"E0",X"51",X"FD",X"36",X"00",X"42",X"FD",X"7E",X"01",X"FE",X"A8",X"D2",X"E0", + X"51",X"FD",X"4E",X"02",X"21",X"B1",X"53",X"CD",X"9F",X"53",X"D2",X"E0",X"51",X"FD",X"71",X"02", + X"FD",X"34",X"01",X"18",X"3F",X"FD",X"36",X"00",X"22",X"FD",X"7E",X"02",X"FE",X"37",X"DA",X"E0", + X"51",X"FD",X"4E",X"01",X"21",X"BD",X"53",X"CD",X"9F",X"53",X"D2",X"E0",X"51",X"FD",X"71",X"01", + X"FD",X"35",X"02",X"C3",X"E0",X"51",X"FD",X"36",X"00",X"12",X"FD",X"7E",X"01",X"FE",X"09",X"DA", + X"E0",X"51",X"FD",X"4E",X"02",X"21",X"B1",X"53",X"CD",X"9F",X"53",X"D2",X"E0",X"51",X"FD",X"71", + X"02",X"FD",X"35",X"01",X"78",X"D6",X"02",X"DA",X"E0",X"51",X"FE",X"09",X"D2",X"E0",X"51",X"47", + X"87",X"87",X"80",X"57",X"FD",X"4E",X"01",X"21",X"C4",X"53",X"CD",X"9F",X"53",X"A7",X"C2",X"E0", + X"51",X"78",X"3D",X"82",X"5F",X"16",X"00",X"21",X"94",X"54",X"19",X"7E",X"A7",X"20",X"07",X"21", + X"00",X"60",X"CB",X"FE",X"18",X"53",X"FE",X"80",X"20",X"1F",X"21",X"01",X"60",X"CB",X"CE",X"DD", + X"7E",X"03",X"A7",X"CA",X"E0",X"51",X"DD",X"35",X"03",X"21",X"10",X"68",X"11",X"11",X"68",X"01", + X"09",X"00",X"ED",X"B8",X"EB",X"36",X"FF",X"18",X"21",X"47",X"21",X"00",X"60",X"CB",X"C6",X"DD", + X"7E",X"03",X"DD",X"BE",X"02",X"D2",X"E0",X"51",X"DD",X"34",X"03",X"C5",X"21",X"09",X"68",X"11", + X"08",X"68",X"01",X"09",X"00",X"ED",X"B0",X"EB",X"C1",X"70",X"01",X"07",X"0A",X"11",X"08",X"68", + X"21",X"7D",X"D1",X"CD",X"3F",X"5D",X"C3",X"E0",X"51",X"21",X"08",X"68",X"06",X"0A",X"3E",X"FF", + X"BE",X"20",X"0E",X"23",X"10",X"FA",X"21",X"8A",X"54",X"11",X"08",X"68",X"01",X"0A",X"00",X"ED", + X"B0",X"11",X"8D",X"60",X"DD",X"7E",X"04",X"D6",X"08",X"30",X"0D",X"ED",X"44",X"47",X"87",X"80", + X"4F",X"06",X"00",X"21",X"8A",X"60",X"ED",X"B8",X"21",X"07",X"68",X"01",X"03",X"00",X"ED",X"B8", + X"11",X"EB",X"D3",X"DD",X"7E",X"04",X"D6",X"08",X"30",X"0F",X"ED",X"44",X"87",X"87",X"47",X"87", + X"80",X"4F",X"06",X"00",X"21",X"DF",X"D3",X"ED",X"B8",X"3E",X"FF",X"12",X"1B",X"21",X"11",X"68", + X"01",X"0A",X"00",X"ED",X"B8",X"12",X"AF",X"32",X"26",X"60",X"CD",X"C7",X"1F",X"CD",X"8F",X"17", + X"21",X"80",X"D0",X"01",X"18",X"20",X"CD",X"52",X"5D",X"C9",X"00",X"00",X"00",X"00",X"C9",X"46", + X"23",X"7E",X"91",X"30",X"02",X"ED",X"44",X"FE",X"07",X"38",X"04",X"23",X"10",X"F3",X"C9",X"4E", + X"C9",X"0B",X"36",X"46",X"56",X"66",X"76",X"86",X"96",X"A6",X"B6",X"C6",X"D6",X"06",X"08",X"28", + X"48",X"68",X"88",X"A8",X"05",X"1B",X"3B",X"5B",X"7B",X"9B",X"DD",X"7E",X"00",X"FE",X"0C",X"38", + X"2C",X"FE",X"23",X"38",X"1F",X"FE",X"3A",X"38",X"14",X"FE",X"51",X"38",X"09",X"D6",X"5C",X"ED", + X"44",X"11",X"1C",X"D6",X"18",X"1E",X"D6",X"3A",X"11",X"65",X"D7",X"18",X"21",X"D6",X"23",X"11", + X"85",X"D4",X"18",X"10",X"D6",X"22",X"ED",X"44",X"11",X"86",X"D4",X"18",X"11",X"D6",X"0B",X"ED", + X"44",X"11",X"BC",X"D4",X"6F",X"26",X"00",X"29",X"29",X"29",X"29",X"29",X"18",X"03",X"6F",X"26", + X"00",X"19",X"36",X"05",X"C9",X"11",X"00",X"04",X"C5",X"E5",X"77",X"19",X"36",X"05",X"E1",X"01", + X"80",X"00",X"09",X"C1",X"3C",X"10",X"F1",X"C9",X"01",X"20",X"00",X"11",X"00",X"04",X"E5",X"36", + X"0C",X"19",X"36",X"06",X"E1",X"09",X"36",X"15",X"19",X"36",X"06",X"C9",X"3E",X"57",X"32",X"E8", + X"D2",X"3C",X"32",X"08",X"D3",X"3E",X"07",X"32",X"E8",X"D6",X"32",X"08",X"D7",X"C9",X"DE",X"D0", + X"06",X"07",X"22",X"18",X"1E",X"FF",X"10",X"0E",X"1D",X"5E",X"D2",X"06",X"08",X"11",X"12",X"FF", + X"1C",X"0C",X"18",X"1B",X"0E",X"DD",X"D2",X"07",X"06",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1D", + X"18",X"19",X"02",X"17",X"0D",X"03",X"1B",X"0D",X"04",X"1D",X"11",X"05",X"1D",X"11",X"06",X"1D", + X"11",X"07",X"1D",X"11",X"08",X"1D",X"11",X"09",X"1D",X"11",X"FF",X"FF",X"15",X"0A",X"0D",X"22", + X"FF",X"0B",X"1E",X"10",X"80",X"0C",X"0B",X"0A",X"80",X"11",X"10",X"0F",X"0E",X"0D",X"16",X"15", + X"14",X"13",X"12",X"1B",X"1A",X"19",X"18",X"17",X"20",X"1F",X"1E",X"1D",X"1C",X"02",X"01",X"23", + X"22",X"21",X"07",X"06",X"05",X"04",X"03",X"24",X"28",X"27",X"09",X"08",X"00",X"29",X"FF",X"2D", + X"80",X"F5",X"C5",X"D5",X"E5",X"FD",X"E5",X"CD",X"9C",X"5D",X"21",X"C3",X"55",X"CD",X"1B",X"57", + X"3E",X"C1",X"0E",X"08",X"21",X"D8",X"55",X"06",X"05",X"C5",X"5E",X"23",X"56",X"23",X"46",X"23", + X"E5",X"EB",X"CD",X"C9",X"55",X"E1",X"C1",X"10",X"F0",X"3E",X"C0",X"21",X"D8",X"55",X"06",X"05", + X"C5",X"5E",X"23",X"56",X"23",X"46",X"23",X"E5",X"EB",X"2B",X"CD",X"C9",X"55",X"E1",X"C1",X"10", + X"EF",X"21",X"E7",X"55",X"CD",X"36",X"5D",X"EB",X"CD",X"36",X"5D",X"EB",X"CD",X"36",X"5D",X"EB", + X"CD",X"36",X"5D",X"FD",X"21",X"12",X"68",X"FD",X"36",X"00",X"22",X"FD",X"36",X"01",X"58",X"FD", + X"36",X"02",X"D6",X"FD",X"36",X"03",X"10",X"FD",X"E5",X"CD",X"AE",X"5E",X"CD",X"C7",X"1F",X"CD", + X"8F",X"17",X"FD",X"E1",X"FD",X"35",X"03",X"20",X"EE",X"21",X"B4",X"55",X"FD",X"74",X"04",X"FD", + X"75",X"05",X"21",X"01",X"60",X"CB",X"D6",X"FD",X"66",X"04",X"FD",X"6E",X"05",X"7E",X"A7",X"28", + X"41",X"FD",X"77",X"00",X"23",X"7E",X"FD",X"77",X"03",X"23",X"FD",X"74",X"04",X"FD",X"75",X"05", + X"FD",X"7E",X"00",X"17",X"38",X"15",X"17",X"38",X"0D",X"17",X"38",X"05",X"FD",X"35",X"01",X"18", + X"0D",X"FD",X"35",X"02",X"18",X"08",X"FD",X"34",X"01",X"18",X"03",X"FD",X"34",X"02",X"FD",X"E5", + X"CD",X"AE",X"5E",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"FD",X"E1",X"FD",X"35",X"03",X"20",X"D0", + X"18",X"B5",X"21",X"3F",X"60",X"36",X"00",X"FD",X"36",X"03",X"10",X"FD",X"E5",X"CD",X"C7",X"1F", + X"CD",X"8F",X"17",X"FD",X"E1",X"FD",X"35",X"03",X"20",X"F1",X"CD",X"9C",X"5D",X"FD",X"E1",X"E1", + X"D1",X"C1",X"F1",X"C9",X"22",X"40",X"12",X"10",X"22",X"20",X"42",X"20",X"82",X"20",X"12",X"60", + X"22",X"78",X"00",X"17",X"D1",X"03",X"10",X"C2",X"0B",X"11",X"00",X"04",X"E5",X"77",X"19",X"71", + X"E1",X"11",X"20",X"00",X"19",X"10",X"F2",X"C9",X"F5",X"D0",X"07",X"55",X"D2",X"07",X"F1",X"D1", + X"02",X"EF",X"D0",X"05",X"8F",X"D2",X"05",X"0C",X"D1",X"02",X"10",X"0C",X"18",X"17",X"10",X"1B", + X"0A",X"1D",X"1E",X"15",X"0A",X"1D",X"12",X"18",X"17",X"1C",X"28",X"AA",X"D1",X"02",X"07",X"22", + X"18",X"1E",X"FF",X"20",X"12",X"17",X"28",X"D1",X"06",X"05",X"0E",X"21",X"1D",X"1B",X"0A",X"E8", + X"D1",X"02",X"08",X"15",X"0A",X"0D",X"22",X"FF",X"0B",X"1E",X"10",X"F5",X"08",X"F5",X"C5",X"D5", + X"E5",X"FD",X"E5",X"CD",X"9C",X"5D",X"FD",X"21",X"12",X"68",X"3A",X"27",X"60",X"FD",X"77",X"01", + X"3A",X"28",X"60",X"FD",X"77",X"02",X"21",X"67",X"57",X"CD",X"36",X"5D",X"EB",X"CD",X"36",X"5D", + X"06",X"10",X"CD",X"10",X"57",X"21",X"01",X"60",X"CB",X"DE",X"21",X"43",X"57",X"CD",X"1B",X"57", + X"21",X"49",X"57",X"CD",X"1B",X"57",X"06",X"18",X"CD",X"10",X"57",X"21",X"4F",X"57",X"CD",X"1B", + X"57",X"21",X"55",X"57",X"CD",X"1B",X"57",X"21",X"5B",X"57",X"CD",X"1B",X"57",X"21",X"73",X"57", + X"CD",X"36",X"5D",X"EB",X"CD",X"36",X"5D",X"06",X"48",X"CD",X"10",X"57",X"21",X"61",X"57",X"CD", + X"1B",X"57",X"3E",X"0A",X"32",X"09",X"D6",X"32",X"29",X"D6",X"06",X"30",X"CD",X"10",X"57",X"21", + X"91",X"57",X"06",X"06",X"C5",X"CD",X"36",X"5D",X"C1",X"EB",X"10",X"F8",X"06",X"30",X"CD",X"10", + X"57",X"FD",X"21",X"12",X"68",X"FD",X"7E",X"01",X"FE",X"0F",X"28",X"1D",X"38",X"09",X"FD",X"36", + X"00",X"12",X"FD",X"35",X"01",X"18",X"07",X"FD",X"36",X"00",X"42",X"FD",X"34",X"01",X"CD",X"9C", + X"5E",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"18",X"D8",X"FD",X"21",X"12",X"68",X"FD",X"7E",X"02", + X"FE",X"CF",X"28",X"1D",X"38",X"09",X"FD",X"36",X"00",X"22",X"FD",X"35",X"02",X"18",X"07",X"FD", + X"36",X"00",X"82",X"FD",X"34",X"02",X"CD",X"9C",X"5E",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"18", + X"D8",X"01",X"02",X"02",X"21",X"D9",X"D0",X"CD",X"52",X"5D",X"AF",X"32",X"26",X"60",X"01",X"15", + X"15",X"21",X"C6",X"D0",X"CD",X"52",X"5D",X"FD",X"E1",X"E1",X"D1",X"C1",X"F1",X"08",X"F1",X"C9", + X"C5",X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"C1",X"10",X"F6",X"C9",X"5E",X"23",X"56",X"23",X"46", + X"23",X"4E",X"23",X"7E",X"23",X"08",X"7E",X"08",X"EB",X"C5",X"E5",X"11",X"00",X"04",X"E5",X"77", + X"19",X"08",X"77",X"08",X"3C",X"E1",X"23",X"10",X"F5",X"E1",X"11",X"20",X"00",X"19",X"C1",X"0D", + X"20",X"E7",X"C9",X"C6",X"D0",X"08",X"06",X"10",X"0C",X"86",X"D2",X"08",X"06",X"90",X"0C",X"CC", + X"D1",X"08",X"04",X"40",X"0A",X"88",X"D1",X"08",X"02",X"60",X"0A",X"48",X"D2",X"08",X"02",X"70", + X"0A",X"C8",X"D1",X"04",X"04",X"00",X"0B",X"D9",X"D0",X"02",X"02",X"E9",X"E6",X"DA",X"D0",X"02", + X"02",X"E8",X"E7",X"46",X"D1",X"0A",X"0C",X"80",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"81", + X"81",X"81",X"88",X"67",X"D1",X"0A",X"0A",X"82",X"83",X"84",X"81",X"81",X"81",X"81",X"85",X"86", + X"87",X"71",X"D1",X"07",X"01",X"29",X"93",X"D1",X"07",X"01",X"29",X"D4",X"D1",X"07",X"01",X"29", + X"34",X"D2",X"07",X"01",X"29",X"73",X"D2",X"07",X"01",X"29",X"91",X"D2",X"07",X"01",X"29",X"21", + X"00",X"B0",X"36",X"9F",X"36",X"BF",X"36",X"DF",X"36",X"FF",X"21",X"00",X"C0",X"36",X"9F",X"36", + X"BF",X"36",X"DF",X"36",X"FF",X"21",X"00",X"D0",X"36",X"FF",X"23",X"7C",X"FE",X"D4",X"38",X"F8", + X"36",X"00",X"23",X"7C",X"FE",X"D8",X"38",X"F8",X"0E",X"40",X"11",X"20",X"00",X"21",X"00",X"70", + X"06",X"20",X"36",X"00",X"19",X"10",X"FB",X"0D",X"20",X"F3",X"21",X"00",X"00",X"AF",X"06",X"60", + X"86",X"2C",X"20",X"FC",X"24",X"10",X"F9",X"A7",X"00",X"00",X"D9",X"47",X"D9",X"D9",X"0E",X"00", + X"D9",X"1E",X"FF",X"21",X"00",X"60",X"16",X"10",X"7B",X"0E",X"10",X"06",X"10",X"C6",X"2F",X"77", + X"23",X"10",X"FA",X"3D",X"0D",X"20",X"F4",X"3D",X"15",X"20",X"EE",X"21",X"00",X"60",X"16",X"10", + X"7B",X"0E",X"10",X"06",X"10",X"C6",X"2F",X"BE",X"28",X"04",X"D9",X"0E",X"FF",X"D9",X"23",X"10", + X"F4",X"3D",X"0D",X"20",X"EE",X"3D",X"15",X"20",X"E8",X"7B",X"D6",X"0F",X"5F",X"30",X"C4",X"3E", + X"1B",X"32",X"92",X"D1",X"32",X"8F",X"D1",X"3E",X"18",X"32",X"B2",X"D1",X"3E",X"0A",X"32",X"AF", + X"D1",X"3E",X"16",X"32",X"D2",X"D1",X"32",X"CF",X"D1",X"D9",X"78",X"A7",X"20",X"0C",X"3E",X"18", + X"32",X"12",X"D2",X"3E",X"14",X"32",X"32",X"D2",X"18",X"1C",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F", + X"32",X"92",X"D2",X"78",X"E6",X"0F",X"32",X"B2",X"D2",X"3E",X"0E",X"32",X"12",X"D2",X"3E",X"1B", + X"32",X"32",X"D2",X"32",X"52",X"D2",X"79",X"A7",X"20",X"0C",X"3E",X"18",X"32",X"0F",X"D2",X"3E", + X"14",X"32",X"2F",X"D2",X"18",X"0D",X"3E",X"0E",X"32",X"0F",X"D2",X"3E",X"1B",X"32",X"2F",X"D2", + X"32",X"4F",X"D2",X"78",X"B1",X"D9",X"11",X"03",X"00",X"28",X"03",X"11",X"12",X"00",X"01",X"00", + X"00",X"0B",X"78",X"B1",X"20",X"FB",X"1B",X"7A",X"B3",X"20",X"F6",X"C3",X"00",X"01",X"A2",X"CD", + X"9C",X"5D",X"CD",X"E5",X"1B",X"21",X"FF",X"5A",X"06",X"0D",X"C5",X"CD",X"36",X"5D",X"EB",X"C1", + X"10",X"F8",X"CD",X"47",X"5E",X"DD",X"21",X"1A",X"68",X"DD",X"36",X"00",X"FF",X"3A",X"DF",X"5A", + X"DD",X"77",X"01",X"21",X"E0",X"5A",X"DD",X"74",X"02",X"DD",X"75",X"03",X"DD",X"36",X"04",X"07", + X"DD",X"36",X"05",X"1E",X"DD",X"36",X"06",X"00",X"FD",X"21",X"12",X"68",X"FD",X"36",X"00",X"42", + X"FD",X"36",X"01",X"08",X"FD",X"36",X"02",X"B7",X"CD",X"9C",X"5E",X"DD",X"E5",X"FD",X"E5",X"CD", + X"C7",X"1F",X"CD",X"8F",X"17",X"FD",X"E1",X"DD",X"E1",X"DD",X"35",X"05",X"20",X"07",X"DD",X"36", + X"05",X"1E",X"CD",X"93",X"5A",X"DD",X"7E",X"00",X"A7",X"28",X"08",X"DD",X"35",X"01",X"CC",X"7A", + X"5A",X"18",X"D5",X"FD",X"34",X"01",X"DD",X"35",X"01",X"20",X"CD",X"CD",X"44",X"5A",X"DD",X"7E", + X"06",X"FE",X"0F",X"30",X"28",X"CD",X"B8",X"59",X"CD",X"7A",X"5A",X"DD",X"34",X"06",X"DD",X"7E", + X"06",X"FE",X"0C",X"28",X"0E",X"FE",X"05",X"20",X"AF",X"FD",X"36",X"01",X"08",X"FD",X"36",X"02", + X"9F",X"18",X"A5",X"FD",X"36",X"01",X"08",X"FD",X"36",X"02",X"87",X"18",X"9B",X"3E",X"81",X"32", + X"26",X"60",X"21",X"9A",X"59",X"0E",X"0F",X"06",X"1E",X"5E",X"23",X"56",X"23",X"ED",X"53",X"29", + X"60",X"C5",X"E5",X"CD",X"10",X"57",X"E1",X"C1",X"06",X"05",X"0D",X"20",X"EC",X"06",X"3C",X"CD", + X"10",X"57",X"AF",X"32",X"26",X"60",X"C3",X"F0",X"5E",X"C9",X"E4",X"00",X"E8",X"00",X"EC",X"00", + X"F0",X"00",X"F4",X"00",X"F8",X"00",X"FC",X"00",X"FC",X"09",X"48",X"19",X"4C",X"19",X"50",X"19", + X"54",X"19",X"58",X"19",X"5C",X"19",X"60",X"19",X"DD",X"7E",X"06",X"FE",X"0C",X"30",X"37",X"FE", + X"05",X"30",X"17",X"CD",X"20",X"5A",X"11",X"DD",X"D5",X"19",X"36",X"06",X"FE",X"04",X"C0",X"21", + X"2C",X"5A",X"CD",X"36",X"5D",X"EB",X"CD",X"36",X"5D",X"C9",X"D6",X"05",X"CD",X"20",X"5A",X"11", + X"BD",X"D4",X"19",X"36",X"07",X"DD",X"7E",X"06",X"FE",X"0B",X"C0",X"21",X"38",X"5A",X"CD",X"36", + X"5D",X"EB",X"CD",X"36",X"5D",X"C9",X"D6",X"0C",X"87",X"CD",X"20",X"5A",X"11",X"BD",X"D6",X"19", + X"36",X"05",X"11",X"20",X"00",X"19",X"36",X"05",X"0F",X"5F",X"16",X"00",X"21",X"29",X"5A",X"19", + X"3E",X"56",X"32",X"ED",X"D2",X"32",X"EA",X"D2",X"7E",X"32",X"0D",X"D3",X"32",X"0A",X"D3",X"C9", + X"6F",X"26",X"00",X"29",X"29",X"29",X"29",X"29",X"C9",X"02",X"03",X"05",X"17",X"D3",X"01",X"02", + X"E3",X"E4",X"16",X"D3",X"01",X"02",X"E1",X"E2",X"14",X"D3",X"02",X"02",X"E8",X"E7",X"13",X"D3", + X"02",X"02",X"E9",X"E6",X"DD",X"7E",X"06",X"87",X"5F",X"16",X"00",X"21",X"5A",X"5A",X"19",X"5E", + X"23",X"56",X"EB",X"01",X"02",X"02",X"CD",X"52",X"5D",X"C9",X"36",X"D1",X"76",X"D1",X"B6",X"D1", + X"F6",X"D1",X"36",X"D2",X"33",X"D1",X"73",X"D1",X"B3",X"D1",X"F3",X"D1",X"33",X"D2",X"73",X"D2", + X"B3",X"D2",X"30",X"D1",X"B0",X"D1",X"30",X"D2",X"10",X"D3",X"DD",X"7E",X"00",X"2F",X"DD",X"77", + X"00",X"DD",X"66",X"02",X"DD",X"6E",X"03",X"7E",X"DD",X"77",X"01",X"23",X"DD",X"74",X"02",X"DD", + X"75",X"03",X"C9",X"DD",X"7E",X"04",X"3D",X"FE",X"05",X"30",X"02",X"3E",X"07",X"DD",X"77",X"04", + X"21",X"37",X"D5",X"06",X"0A",X"CD",X"CA",X"5A",X"2B",X"06",X"0E",X"CD",X"CA",X"5A",X"2B",X"06", + X"0A",X"CD",X"CA",X"5A",X"21",X"2B",X"D5",X"06",X"02",X"CD",X"CA",X"5A",X"D6",X"05",X"5F",X"16", + X"00",X"21",X"DC",X"5A",X"19",X"7E",X"32",X"8A",X"D1",X"C9",X"0E",X"02",X"11",X"20",X"00",X"C5", + X"E5",X"77",X"19",X"10",X"FC",X"E1",X"2B",X"C1",X"0D",X"20",X"F4",X"C9",X"01",X"03",X"08",X"68", + X"20",X"4A",X"10",X"4A",X"10",X"4A",X"10",X"4A",X"10",X"1C",X"20",X"4A",X"10",X"4A",X"10",X"4A", + X"10",X"4A",X"10",X"4A",X"10",X"4A",X"10",X"1C",X"20",X"3A",X"20",X"3A",X"20",X"3A",X"38",X"79", + X"D1",X"02",X"0B",X"12",X"17",X"1C",X"1D",X"1B",X"1E",X"0C",X"1D",X"12",X"18",X"17",X"37",X"D1", + X"07",X"0A",X"F1",X"65",X"F4",X"6D",X"F5",X"6F",X"F1",X"67",X"F1",X"67",X"36",X"D1",X"07",X"0A", + X"95",X"5B",X"9D",X"5F",X"9F",X"60",X"93",X"61",X"9B",X"5E",X"34",X"D1",X"07",X"0E",X"F1",X"65", + X"F1",X"67",X"F1",X"65",X"F1",X"65",X"F2",X"69",X"F1",X"67",X"F3",X"6B",X"33",X"D1",X"07",X"0E", + X"91",X"59",X"93",X"5A",X"95",X"5B",X"97",X"5C",X"99",X"5D",X"9B",X"5E",X"97",X"5C",X"31",X"D1", + X"07",X"0A",X"EF",X"71",X"FF",X"FF",X"EF",X"71",X"FF",X"FF",X"EF",X"71",X"30",X"D1",X"07",X"0A", + X"A1",X"62",X"FF",X"FF",X"A1",X"62",X"FF",X"FF",X"A1",X"62",X"11",X"D3",X"06",X"02",X"F0",X"73", + X"10",X"D3",X"06",X"02",X"A3",X"63",X"4D",X"D1",X"02",X"0F",X"E5",X"FF",X"FF",X"01",X"00",X"FF", + X"19",X"18",X"12",X"17",X"1D",X"1C",X"FF",X"FF",X"FF",X"2B",X"D1",X"07",X"02",X"F4",X"6D",X"2A", + X"D1",X"07",X"02",X"9D",X"5F",X"8A",X"D1",X"02",X"0D",X"08",X"00",X"00",X"FF",X"19",X"18",X"12", + X"17",X"1D",X"1C",X"FF",X"FF",X"FF",X"C3",X"00",X"5F",X"11",X"1C",X"60",X"01",X"32",X"00",X"ED", + X"B0",X"21",X"56",X"5C",X"CD",X"36",X"5D",X"3A",X"03",X"90",X"E6",X"0F",X"F5",X"21",X"26",X"D1", + X"CD",X"41",X"5C",X"F1",X"47",X"3E",X"06",X"32",X"26",X"D5",X"32",X"26",X"D6",X"3A",X"03",X"90", + X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"B8",X"C8",X"21",X"23",X"D1",X"CD",X"41",X"5C",X"3E",X"06", + X"32",X"23",X"D5",X"32",X"23",X"D6",X"21",X"1B",X"5D",X"CD",X"36",X"5D",X"EB",X"CD",X"36",X"5D", + X"C9",X"F5",X"C5",X"06",X"1F",X"CD",X"10",X"57",X"C1",X"F1",X"C9",X"21",X"1C",X"60",X"36",X"00", + X"11",X"1D",X"60",X"01",X"31",X"00",X"ED",X"B0",X"CD",X"C7",X"1F",X"C3",X"10",X"5F",X"C9",X"42", + X"17",X"AF",X"30",X"02",X"82",X"3F",X"DF",X"78",X"05",X"82",X"5F",X"A7",X"60",X"04",X"12",X"97", + X"CF",X"18",X"01",X"42",X"10",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"E5",X"87",X"5F",X"16",X"00",X"21",X"65",X"5C",X"19",X"5E",X"23",X"56",X"E1",X"06",X"0F", + X"0E",X"02",X"CD",X"3F",X"5D",X"C9",X"69",X"D1",X"00",X"0B",X"12",X"17",X"1C",X"0E",X"1B",X"1D", + X"FF",X"0C",X"18",X"12",X"17",X"85",X"5C",X"85",X"5C",X"85",X"5C",X"85",X"5C",X"85",X"5C",X"85", + X"5C",X"0C",X"5D",X"FD",X"5C",X"EE",X"5C",X"DF",X"5C",X"D0",X"5C",X"C1",X"5C",X"B2",X"5C",X"A3", + X"5C",X"94",X"5C",X"85",X"5C",X"01",X"FF",X"0C",X"18",X"12",X"17",X"FF",X"FF",X"01",X"FF",X"19", + X"15",X"0A",X"22",X"FF",X"01",X"FF",X"0C",X"18",X"12",X"17",X"FF",X"FF",X"02",X"FF",X"19",X"15", + X"0A",X"22",X"1C",X"01",X"FF",X"0C",X"18",X"12",X"17",X"FF",X"FF",X"03",X"FF",X"19",X"15",X"0A", + X"22",X"1C",X"01",X"FF",X"0C",X"18",X"12",X"17",X"FF",X"FF",X"04",X"FF",X"19",X"15",X"0A",X"22", + X"1C",X"01",X"FF",X"0C",X"18",X"12",X"17",X"FF",X"FF",X"05",X"FF",X"19",X"15",X"0A",X"22",X"1C", + X"02",X"FF",X"0C",X"18",X"12",X"17",X"1C",X"FF",X"01",X"FF",X"19",X"15",X"0A",X"22",X"FF",X"02", + X"FF",X"0C",X"18",X"12",X"17",X"1C",X"FF",X"03",X"FF",X"19",X"15",X"0A",X"22",X"1C",X"03",X"FF", + X"0C",X"18",X"12",X"17",X"1C",X"FF",X"01",X"FF",X"19",X"15",X"0A",X"22",X"FF",X"03",X"FF",X"0C", + X"18",X"12",X"17",X"1C",X"FF",X"02",X"FF",X"19",X"15",X"0A",X"22",X"1C",X"04",X"FF",X"0C",X"18", + X"12",X"17",X"1C",X"FF",X"01",X"FF",X"19",X"15",X"0A",X"22",X"FF",X"E7",X"D0",X"01",X"05",X"1B", + X"12",X"10",X"11",X"1D",X"E4",X"D0",X"01",X"04",X"15",X"0E",X"0F",X"1D",X"06",X"03",X"1A",X"BE", + X"C0",X"13",X"23",X"10",X"F9",X"C9",X"5E",X"23",X"56",X"23",X"4E",X"23",X"46",X"23",X"EB",X"D5", + X"E5",X"1A",X"77",X"11",X"00",X"04",X"19",X"71",X"E1",X"11",X"20",X"00",X"19",X"D1",X"13",X"10", + X"EE",X"C9",X"D5",X"11",X"00",X"04",X"C5",X"E5",X"E5",X"36",X"FF",X"19",X"36",X"00",X"E1",X"23", + X"10",X"F6",X"E1",X"01",X"20",X"00",X"09",X"C1",X"0D",X"20",X"EB",X"D1",X"C9",X"11",X"DD",X"D2", + X"21",X"05",X"68",X"AF",X"06",X"06",X"ED",X"6F",X"28",X"09",X"F6",X"80",X"F5",X"E6",X"0F",X"C6", + X"00",X"12",X"F1",X"E5",X"21",X"20",X"00",X"19",X"EB",X"E1",X"CB",X"40",X"28",X"05",X"ED",X"6F", + X"23",X"18",X"06",X"CB",X"48",X"20",X"02",X"F6",X"80",X"10",X"DB",X"C9",X"01",X"18",X"18",X"21", + X"85",X"D0",X"CD",X"52",X"5D",X"21",X"1C",X"60",X"11",X"05",X"00",X"36",X"00",X"19",X"36",X"00", + X"19",X"06",X"07",X"19",X"36",X"00",X"10",X"FB",X"CD",X"BC",X"5D",X"C9",X"0E",X"06",X"3E",X"4E", + X"32",X"9C",X"D0",X"79",X"32",X"9C",X"D4",X"3E",X"4F",X"32",X"7C",X"D3",X"79",X"32",X"7C",X"D7", + X"3E",X"51",X"32",X"85",X"D0",X"79",X"32",X"85",X"D4",X"3E",X"50",X"32",X"65",X"D3",X"79",X"32", + X"65",X"D7",X"3E",X"52",X"06",X"16",X"21",X"BC",X"D0",X"CD",X"2A",X"5E",X"3E",X"54",X"06",X"16", + X"21",X"A5",X"D0",X"CD",X"2A",X"5E",X"3E",X"55",X"06",X"16",X"21",X"86",X"D0",X"CD",X"3B",X"5E", + X"3E",X"53",X"06",X"16",X"21",X"66",X"D3",X"CD",X"3B",X"5E",X"0E",X"00",X"3E",X"30",X"32",X"BB", + X"D0",X"79",X"32",X"BB",X"D4",X"3E",X"31",X"06",X"15",X"21",X"DB",X"D0",X"CD",X"2A",X"5E",X"3E", + X"32",X"06",X"15",X"21",X"A6",X"D0",X"CD",X"3B",X"5E",X"C9",X"11",X"00",X"04",X"C5",X"E5",X"77", + X"19",X"71",X"E1",X"01",X"20",X"00",X"09",X"C1",X"10",X"F3",X"C9",X"11",X"00",X"04",X"E5",X"77", + X"19",X"71",X"E1",X"23",X"10",X"F8",X"C9",X"DD",X"E5",X"FD",X"E5",X"CD",X"D1",X"1D",X"CD",X"8B", + X"1E",X"06",X"06",X"3E",X"05",X"21",X"A1",X"D5",X"CD",X"7D",X"1E",X"CD",X"E0",X"1E",X"CD",X"26", + X"28",X"06",X"05",X"3E",X"01",X"21",X"E1",X"D4",X"CD",X"7D",X"1E",X"21",X"E1",X"D0",X"36",X"2A", + X"19",X"CD",X"44",X"1F",X"DD",X"21",X"1C",X"60",X"DD",X"36",X"00",X"82",X"DD",X"36",X"01",X"08", + X"DD",X"36",X"02",X"0F",X"CD",X"7F",X"1F",X"DD",X"77",X"03",X"DD",X"70",X"04",X"CD",X"C7",X"1F", + X"CD",X"8F",X"17",X"DD",X"36",X"00",X"81",X"FD",X"E1",X"DD",X"E1",X"C9",X"11",X"26",X"60",X"21", + X"12",X"68",X"01",X"03",X"00",X"ED",X"B0",X"EB",X"36",X"00",X"23",X"36",X"00",X"C9",X"11",X"3F", + X"60",X"18",X"EC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E6",X"02",X"CA",X"E3",X"5E",X"C3",X"78",X"50",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CD",X"A4",X"50",X"DA",X"E3",X"5E",X"C3",X"88",X"50",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CD",X"F6",X"50",X"CD",X"3E",X"25",X"CD",X"07",X"26",X"CD",X"B1",X"5B",X"00",X"00",X"00",X"C9", + X"CD",X"C7",X"1F",X"CD",X"8F",X"17",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"AF",X"32",X"65",X"60",X"21",X"0F",X"5C",X"C3",X"A9",X"5B",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CD",X"8F",X"17",X"21",X"80",X"D0",X"01",X"18",X"20",X"CD",X"52",X"5D",X"C9",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_sprite_l.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_sprite_l.vhd new file mode 100644 index 00000000..1be1bd2b --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_sprite_l.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_sprite_l is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_sprite_l is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"01",X"00",X"01",X"00",X"35",X"00",X"AA",X"02",X"AA",X"0A",X"AA",X"0B",X"E9", + X"00",X"00",X"40",X"00",X"40",X"00",X"5C",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"A0",X"6B",X"E0", + X"0B",X"E5",X"0A",X"A5",X"0A",X"E9",X"02",X"AA",X"02",X"A6",X"00",X"AA",X"00",X"0A",X"00",X"00", + X"5B",X"E0",X"5A",X"A0",X"6B",X"A0",X"AA",X"80",X"9A",X"80",X"AA",X"00",X"A0",X"00",X"00",X"00", + X"00",X"00",X"00",X"04",X"00",X"01",X"00",X"35",X"00",X"AA",X"02",X"AA",X"0A",X"AA",X"0B",X"EB", + X"00",X"00",X"10",X"00",X"40",X"00",X"5C",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"A0",X"EB",X"E0", + X"0B",X"EF",X"0A",X"AF",X"0A",X"6B",X"02",X"AA",X"02",X"AE",X"00",X"AA",X"00",X"0A",X"00",X"00", + X"FB",X"E0",X"FA",X"A0",X"E9",X"A0",X"AA",X"80",X"BA",X"80",X"AA",X"00",X"A0",X"00",X"00",X"00", + X"00",X"00",X"00",X"14",X"00",X"01",X"00",X"35",X"00",X"AA",X"02",X"AA",X"0A",X"AA",X"09",X"6B", + X"00",X"00",X"14",X"00",X"40",X"00",X"5C",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"A0",X"E9",X"60", + X"09",X"6F",X"0A",X"AF",X"0A",X"EB",X"02",X"AA",X"02",X"AE",X"00",X"AA",X"00",X"0A",X"00",X"00", + X"F9",X"60",X"FA",X"A0",X"EB",X"A0",X"AA",X"80",X"BA",X"80",X"AA",X"00",X"A0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"2A",X"02",X"AB",X"0A",X"BB",X"0A",X"AA",X"29",X"A5",X"2A",X"95", + X"00",X"00",X"00",X"00",X"A0",X"00",X"E8",X"00",X"EA",X"00",X"AA",X"C0",X"AA",X"40",X"6A",X"54", + X"2A",X"95",X"29",X"A5",X"0A",X"AA",X"0A",X"BB",X"02",X"AB",X"00",X"2A",X"00",X"00",X"00",X"00", + X"6A",X"54",X"AA",X"40",X"AA",X"C0",X"EA",X"00",X"E8",X"00",X"A0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"2A",X"02",X"AB",X"0A",X"9B",X"0A",X"AA",X"2B",X"AF",X"2A",X"BF", + X"00",X"00",X"00",X"00",X"A0",X"00",X"E8",X"00",X"EA",X"00",X"AA",X"C0",X"AA",X"44",X"EA",X"50", + X"2A",X"BF",X"2B",X"AF",X"0A",X"AA",X"0A",X"9B",X"02",X"AB",X"00",X"2A",X"00",X"00",X"00",X"00", + X"EA",X"50",X"AA",X"44",X"AA",X"C0",X"EA",X"00",X"E8",X"00",X"A0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"2A",X"02",X"A9",X"0A",X"B9",X"0A",X"AA",X"2B",X"AF",X"2A",X"BF", + X"00",X"00",X"00",X"00",X"A0",X"00",X"68",X"00",X"6A",X"00",X"AA",X"C4",X"AA",X"44",X"EA",X"50", + X"2A",X"BF",X"2B",X"AF",X"0A",X"AA",X"0A",X"B9",X"02",X"A9",X"00",X"2A",X"00",X"00",X"00",X"00", + X"EA",X"50",X"AA",X"44",X"AA",X"C4",X"6A",X"00",X"68",X"00",X"A0",X"00",X"00",X"00",X"00",X"00", + X"00",X"28",X"00",X"80",X"00",X"88",X"04",X"A1",X"04",X"35",X"04",X"AA",X"02",X"AA",X"0A",X"AE", + X"28",X"00",X"02",X"00",X"22",X"00",X"48",X"10",X"5C",X"10",X"AA",X"10",X"AA",X"80",X"BA",X"A0", + X"0A",X"AA",X"0A",X"AE",X"0A",X"AA",X"06",X"AE",X"06",X"AA",X"00",X"AE",X"00",X"0A",X"00",X"00", + X"AA",X"A0",X"BA",X"A0",X"AA",X"A0",X"BA",X"90",X"AA",X"90",X"BA",X"00",X"A0",X"00",X"00",X"00", + X"00",X"F0",X"02",X"00",X"02",X"30",X"00",X"81",X"04",X"B5",X"04",X"AA",X"02",X"AA",X"0A",X"AE", + X"0F",X"00",X"00",X"80",X"0C",X"80",X"42",X"80",X"5E",X"10",X"AA",X"10",X"AA",X"80",X"BA",X"A0", + X"0A",X"AA",X"0A",X"AE",X"0A",X"AA",X"02",X"AE",X"06",X"AA",X"04",X"AE",X"00",X"0A",X"00",X"00", + X"AA",X"A0",X"BA",X"A0",X"AA",X"A0",X"BA",X"80",X"AA",X"90",X"BA",X"10",X"A0",X"00",X"00",X"00", + X"02",X"80",X"08",X"00",X"08",X"C0",X"0A",X"01",X"02",X"35",X"04",X"AA",X"06",X"AA",X"0A",X"AE", + X"02",X"80",X"00",X"20",X"03",X"20",X"40",X"A0",X"5C",X"80",X"AA",X"10",X"AA",X"90",X"BA",X"A0", + X"0A",X"AA",X"0A",X"AE",X"0A",X"AA",X"02",X"AE",X"06",X"AA",X"04",X"AE",X"04",X"0A",X"00",X"00", + X"AA",X"A0",X"BA",X"A0",X"AA",X"A0",X"BA",X"80",X"AA",X"90",X"BA",X"10",X"A0",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"6A",X"02",X"AA",X"0A",X"AA",X"0A",X"AA",X"2E",X"EE",X"2A",X"AA", + X"00",X"00",X"00",X"00",X"85",X"40",X"A0",X"00",X"A8",X"A8",X"AB",X"82",X"E9",X"22",X"A9",X"40", + X"2A",X"AA",X"2E",X"EE",X"0A",X"AA",X"0A",X"AA",X"02",X"AA",X"01",X"6A",X"00",X"00",X"00",X"00", + X"A9",X"40",X"E9",X"22",X"AB",X"82",X"A8",X"28",X"A0",X"00",X"85",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"05",X"2A",X"02",X"AA",X"0A",X"AA",X"0A",X"AA",X"2E",X"EE",X"2A",X"AA", + X"00",X"00",X"00",X"00",X"85",X"00",X"A0",X"28",X"AA",X"83",X"AB",X"33",X"E9",X"00",X"A9",X"40", + X"2A",X"AA",X"2E",X"EE",X"0A",X"AA",X"0A",X"AA",X"02",X"AA",X"05",X"2A",X"00",X"00",X"00",X"00", + X"A9",X"40",X"E9",X"00",X"AB",X"33",X"AA",X"83",X"A0",X"A8",X"85",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"15",X"2A",X"02",X"AA",X"0A",X"AA",X"0A",X"AA",X"2E",X"EE",X"2A",X"AA", + X"00",X"00",X"00",X"00",X"94",X"A8",X"A2",X"82",X"A8",X"32",X"AB",X"00",X"E9",X"00",X"A9",X"40", + X"2A",X"AA",X"2E",X"EE",X"0A",X"AA",X"0A",X"AA",X"02",X"AA",X"15",X"2A",X"00",X"00",X"00",X"00", + X"A9",X"40",X"E9",X"00",X"AB",X"00",X"A8",X"32",X"A2",X"82",X"94",X"A8",X"00",X"00",X"00",X"00", + X"03",X"F0",X"0C",X"3C",X"0C",X"3E",X"0F",X"FE",X"03",X"FA",X"00",X"A9",X"00",X"2A",X"00",X"09", + X"0F",X"C0",X"30",X"F0",X"B0",X"F0",X"BF",X"F0",X"AF",X"C0",X"6A",X"00",X"A8",X"00",X"60",X"00", + X"00",X"0A",X"00",X"09",X"00",X"5A",X"01",X"09",X"00",X"1A",X"00",X"49",X"01",X"02",X"00",X"00", + X"A0",X"00",X"60",X"00",X"A5",X"00",X"60",X"40",X"A4",X"00",X"61",X"00",X"80",X"40",X"00",X"00", + X"03",X"F0",X"0F",X"0C",X"0F",X"0E",X"0F",X"FE",X"03",X"FA",X"00",X"A9",X"02",X"AA",X"02",X"95", + X"0F",X"C0",X"3C",X"30",X"BC",X"30",X"BF",X"F0",X"AF",X"C0",X"6A",X"00",X"AA",X"80",X"56",X"80", + X"00",X"AA",X"04",X"95",X"01",X"AA",X"00",X"29",X"00",X"4A",X"05",X"09",X"00",X"02",X"00",X"00", + X"AA",X"00",X"56",X"10",X"AA",X"40",X"68",X"00",X"A1",X"00",X"60",X"50",X"80",X"00",X"00",X"00", + X"03",X"F0",X"0F",X"FC",X"0C",X"02",X"0F",X"FE",X"03",X"FA",X"00",X"A9",X"00",X"2A",X"00",X"09", + X"0F",X"C0",X"3F",X"F0",X"80",X"30",X"BF",X"F0",X"AF",X"C0",X"6A",X"00",X"A8",X"00",X"60",X"00", + X"04",X"2A",X"01",X"25",X"00",X"AA",X"04",X"95",X"01",X"AA",X"00",X"29",X"00",X"0A",X"00",X"00", + X"A8",X"10",X"58",X"40",X"AA",X"00",X"56",X"10",X"AA",X"40",X"68",X"00",X"A0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"40",X"04",X"10",X"01",X"10",X"0A",X"AA",X"26",X"66", + X"00",X"00",X"00",X"00",X"00",X"FC",X"03",X"C3",X"0B",X"C3",X"2B",X"FF",X"AA",X"FC",X"66",X"A0", + X"26",X"66",X"0A",X"AA",X"01",X"10",X"04",X"10",X"10",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"66",X"A0",X"AA",X"FC",X"2B",X"C3",X"0B",X"C3",X"03",X"FF",X"00",X"FC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"04",X"04",X"04",X"10",X"01",X"2A",X"00",X"A6",X"0A",X"A6",X"26",X"66", + X"00",X"00",X"00",X"00",X"00",X"FC",X"A3",X"FF",X"AB",X"C3",X"6B",X"C3",X"6A",X"FC",X"66",X"A0", + X"26",X"66",X"0A",X"A6",X"00",X"A6",X"01",X"2A",X"04",X"10",X"04",X"04",X"00",X"00",X"00",X"00", + X"66",X"A0",X"6A",X"FC",X"6B",X"FF",X"AB",X"C3",X"A3",X"C3",X"00",X"FC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"41",X"01",X"04",X"02",X"A0",X"0A",X"6A",X"2A",X"66",X"26",X"66", + X"00",X"00",X"00",X"00",X"00",X"FC",X"03",X"CF",X"0B",X"CF",X"2B",X"CF",X"AA",X"CC",X"66",X"A0", + X"26",X"66",X"2A",X"66",X"0A",X"6A",X"02",X"A0",X"01",X"04",X"00",X"41",X"00",X"00",X"00",X"00", + X"66",X"A0",X"AA",X"CC",X"2B",X"CF",X"0B",X"CF",X"03",X"CF",X"00",X"FC",X"00",X"00",X"00",X"00", + X"00",X"28",X"00",X"20",X"00",X"20",X"00",X"08",X"00",X"FE",X"00",X"3E",X"0C",X"3E",X"0F",X"FE", + X"28",X"00",X"08",X"00",X"08",X"00",X"20",X"00",X"BF",X"00",X"83",X"C0",X"83",X"F0",X"BF",X"F0", + X"00",X"2A",X"02",X"55",X"08",X"AA",X"08",X"55",X"00",X"2A",X"00",X"85",X"02",X"02",X"00",X"00", + X"A8",X"00",X"55",X"80",X"AA",X"20",X"55",X"20",X"A8",X"00",X"52",X"00",X"80",X"80",X"00",X"00", + X"00",X"A0",X"00",X"80",X"00",X"A0",X"00",X"08",X"00",X"FE",X"03",X"C2",X"0F",X"C2",X"0F",X"FE", + X"0A",X"00",X"02",X"00",X"0A",X"00",X"20",X"00",X"BF",X"00",X"83",X"C0",X"83",X"F0",X"BF",X"F0", + X"00",X"2A",X"00",X"05",X"02",X"2A",X"08",X"55",X"00",X"AA",X"02",X"55",X"08",X"2A",X"00",X"00", + X"A8",X"00",X"50",X"00",X"A8",X"80",X"55",X"20",X"AA",X"00",X"55",X"80",X"A8",X"20",X"00",X"00", + X"02",X"00",X"02",X"00",X"00",X"A0",X"00",X"08",X"00",X"FE",X"03",X"C2",X"0F",X"C2",X"0F",X"FE", + X"00",X"80",X"00",X"80",X"0A",X"00",X"20",X"00",X"BF",X"00",X"BC",X"00",X"BC",X"30",X"BF",X"F0", + X"00",X"2A",X"08",X"95",X"02",X"2A",X"00",X"05",X"02",X"8A",X"00",X"25",X"00",X"02",X"00",X"00", + X"A8",X"00",X"56",X"20",X"A8",X"80",X"50",X"00",X"A2",X"80",X"58",X"00",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"A0",X"20",X"08",X"08",X"64",X"02",X"66",X"06",X"66",X"26",X"66", + X"00",X"00",X"00",X"00",X"F0",X"00",X"C0",X"00",X"C3",X"00",X"FF",X"2A",X"FF",X"82",X"AA",X"00", + X"26",X"66",X"06",X"66",X"02",X"66",X"08",X"64",X"20",X"08",X"00",X"A0",X"00",X"00",X"00",X"00", + X"AA",X"00",X"C3",X"82",X"C3",X"2A",X"FF",X"00",X"FC",X"00",X"F0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"20",X"80",X"08",X"20",X"06",X"40",X"26",X"62",X"26",X"66",X"26",X"66", + X"00",X"00",X"00",X"00",X"F0",X"00",X"FC",X"00",X"FF",X"2A",X"C3",X"22",X"C3",X"80",X"AA",X"00", + X"26",X"66",X"26",X"66",X"26",X"62",X"06",X"40",X"08",X"20",X"20",X"80",X"00",X"00",X"00",X"00", + X"AA",X"00",X"C3",X"80",X"C3",X"22",X"FF",X"2A",X"FC",X"00",X"F0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"02",X"20",X"02",X"08",X"08",X"26",X"06",X"66",X"26",X"66", + X"00",X"00",X"00",X"00",X"F0",X"00",X"FC",X"0A",X"FF",X"20",X"C3",X"20",X"C3",X"80",X"AA",X"00", + X"26",X"66",X"06",X"66",X"08",X"26",X"02",X"08",X"02",X"20",X"00",X"08",X"00",X"00",X"00",X"00", + X"AA",X"00",X"FF",X"80",X"FF",X"20",X"C3",X"20",X"C0",X"0A",X"F0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"43",X"01",X"50",X"05",X"10",X"04",X"10",X"00",X"12",X"00",X"4A",X"00",X"6A", + X"14",X"00",X"AA",X"C0",X"AA",X"00",X"28",X"00",X"A8",X"40",X"A0",X"50",X"A1",X"10",X"A9",X"10", + X"00",X"AE",X"00",X"AA",X"05",X"AE",X"04",X"2A",X"04",X"2E",X"00",X"0A",X"00",X"02",X"00",X"00", + X"BA",X"00",X"AA",X"00",X"BA",X"50",X"A8",X"10",X"B8",X"10",X"A0",X"00",X"80",X"00",X"00",X"00", + X"00",X"01",X"00",X"3A",X"01",X"0A",X"05",X"42",X"04",X"42",X"04",X"12",X"00",X"1A",X"00",X"2A", + X"40",X"00",X"AC",X"00",X"A0",X"40",X"81",X"50",X"81",X"10",X"84",X"10",X"A4",X"00",X"A8",X"00", + X"00",X"AE",X"00",X"AA",X"00",X"AE",X"01",X"AA",X"04",X"BA",X"04",X"28",X"01",X"20",X"00",X"00", + X"BA",X"00",X"AA",X"00",X"BA",X"00",X"AA",X"40",X"AE",X"10",X"28",X"10",X"08",X"40",X"00",X"00", + X"00",X"14",X"03",X"AA",X"00",X"AA",X"00",X"28",X"01",X"2A",X"05",X"0A",X"04",X"4A",X"04",X"6A", + X"00",X"00",X"C1",X"00",X"05",X"40",X"04",X"50",X"04",X"10",X"84",X"00",X"A1",X"00",X"A9",X"00", + X"00",X"AE",X"00",X"AA",X"00",X"AE",X"01",X"2A",X"04",X"2E",X"01",X"0A",X"00",X"42",X"00",X"00", + X"BA",X"00",X"AA",X"00",X"BA",X"00",X"A8",X"40",X"B8",X"10",X"A0",X"40",X"81",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"50",X"00",X"10",X"00",X"2A",X"02",X"AA",X"0B",X"BB",X"2A",X"AA", + X"00",X"00",X"00",X"00",X"01",X"40",X"00",X"50",X"50",X"14",X"85",X"50",X"A0",X"00",X"A8",X"0C", + X"2A",X"AA",X"0B",X"BB",X"02",X"AA",X"00",X"2A",X"00",X"10",X"01",X"50",X"00",X"00",X"00",X"00", + X"AA",X"28",X"AA",X"A9",X"82",X"A9",X"50",X"28",X"05",X"0C",X"54",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"05",X"00",X"10",X"40",X"02",X"AA",X"2B",X"AA",X"0A",X"BB",X"02",X"AA", + X"00",X"00",X"00",X"00",X"05",X"40",X"00",X"50",X"01",X"40",X"94",X"0C",X"A0",X"28",X"AA",X"A9", + X"02",X"AA",X"0A",X"BB",X"2B",X"AA",X"02",X"AA",X"10",X"40",X"05",X"00",X"00",X"00",X"00",X"00", + X"AA",X"A9",X"A0",X"28",X"94",X"0C",X"01",X"40",X"00",X"50",X"05",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"00",X"04",X"40",X"10",X"2A",X"02",X"AA",X"0B",X"BB",X"2A",X"AA", + X"00",X"00",X"00",X"00",X"54",X"00",X"05",X"0C",X"50",X"28",X"82",X"A9",X"AA",X"A9",X"AA",X"28", + X"2A",X"AA",X"0B",X"BB",X"02",X"AA",X"10",X"2A",X"04",X"40",X"01",X"00",X"00",X"00",X"00",X"00", + X"A8",X"0C",X"A0",X"00",X"85",X"50",X"50",X"14",X"00",X"50",X"01",X"40",X"00",X"00",X"00",X"00", + X"00",X"08",X"00",X"0A",X"04",X"02",X"04",X"0E",X"04",X"2A",X"01",X"AA",X"02",X"AA",X"0A",X"AA", + X"20",X"00",X"A0",X"00",X"80",X"10",X"B0",X"10",X"A8",X"10",X"AA",X"40",X"AA",X"80",X"AA",X"A0", + X"03",X"FF",X"0A",X"AA",X"0A",X"AA",X"02",X"AA",X"04",X"AA",X"04",X"2A",X"01",X"0A",X"00",X"00", + X"FF",X"C0",X"AA",X"A0",X"AA",X"A0",X"AA",X"80",X"AA",X"10",X"A8",X"10",X"A0",X"40",X"00",X"00", + X"00",X"80",X"00",X"AA",X"00",X"02",X"01",X"0E",X"04",X"2A",X"01",X"AA",X"02",X"AA",X"0A",X"AA", + X"02",X"00",X"AA",X"00",X"80",X"00",X"B0",X"40",X"A8",X"10",X"AA",X"40",X"AA",X"80",X"AA",X"A0", + X"03",X"FF",X"0A",X"AA",X"0A",X"AA",X"02",X"AB",X"02",X"AB",X"04",X"AB",X"04",X"28",X"00",X"00", + X"FF",X"C0",X"AA",X"A0",X"AA",X"A0",X"EA",X"80",X"EA",X"80",X"EA",X"10",X"28",X"10",X"00",X"00", + X"08",X"00",X"0A",X"AA",X"00",X"02",X"04",X"0E",X"04",X"2A",X"04",X"AA",X"02",X"AA",X"0A",X"AA", + X"00",X"20",X"AA",X"A0",X"80",X"00",X"B0",X"10",X"A8",X"10",X"AA",X"10",X"AA",X"80",X"AA",X"A0", + X"03",X"FF",X"0A",X"AB",X"0A",X"AB",X"0A",X"AB",X"0A",X"AF",X"02",X"AF",X"04",X"A0",X"00",X"00", + X"FF",X"C0",X"EA",X"A0",X"EA",X"A0",X"EA",X"A0",X"FA",X"A0",X"FA",X"80",X"0A",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"05",X"28",X"10",X"AB",X"02",X"AB",X"0A",X"AB",X"2A",X"AB",X"2A",X"AB", + X"00",X"00",X"00",X"00",X"81",X"50",X"A4",X"00",X"A8",X"00",X"AA",X"00",X"AA",X"CA",X"AA",X"A8", + X"2A",X"AB",X"2A",X"AB",X"0A",X"AB",X"02",X"AB",X"10",X"AB",X"05",X"28",X"00",X"00",X"00",X"00", + X"AA",X"A8",X"AA",X"CA",X"AA",X"00",X"A8",X"00",X"A4",X"00",X"81",X"50",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"14",X"28",X"02",X"AB",X"0A",X"AB",X"2A",X"AB",X"2A",X"AB",X"0F",X"EB", + X"00",X"00",X"00",X"00",X"81",X"00",X"A4",X"40",X"A8",X"0A",X"AA",X"08",X"AA",X"C8",X"AA",X"A8", + X"0F",X"EB",X"2A",X"AB",X"2A",X"AB",X"0A",X"AB",X"02",X"AB",X"14",X"28",X"00",X"00",X"00",X"00", + X"AA",X"A8",X"AA",X"C8",X"AA",X"08",X"A8",X"0A",X"A4",X"40",X"81",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"12",X"A8",X"0A",X"AB",X"2A",X"AB",X"2A",X"AB",X"0F",X"AB",X"0F",X"FF", + X"00",X"00",X"00",X"00",X"85",X"4A",X"A0",X"08",X"A8",X"08",X"AA",X"08",X"AA",X"C8",X"AA",X"A8", + X"0F",X"FF",X"0F",X"AB",X"2A",X"AB",X"2A",X"AB",X"0A",X"AB",X"12",X"A8",X"00",X"00",X"00",X"00", + X"AA",X"A8",X"AA",X"C8",X"AA",X"08",X"A8",X"08",X"A0",X"08",X"85",X"4A",X"00",X"00",X"00",X"00", + X"02",X"A3",X"00",X"0F",X"00",X"02",X"00",X"CA",X"03",X"1A",X"0C",X"16",X"0C",X"17",X"00",X"16", + X"CA",X"80",X"F0",X"00",X"80",X"00",X"A3",X"00",X"A4",X"C0",X"94",X"30",X"D4",X"30",X"94",X"00", + X"00",X"57",X"00",X"56",X"00",X"57",X"00",X"56",X"00",X"57",X"00",X"54",X"00",X"14",X"00",X"00", + X"D5",X"00",X"95",X"00",X"D5",X"00",X"95",X"00",X"D5",X"00",X"15",X"00",X"14",X"00",X"00",X"00", + X"00",X"A3",X"00",X"0F",X"0C",X"02",X"0C",X"CA",X"03",X"1A",X"00",X"56",X"00",X"57",X"01",X"5A", + X"CA",X"00",X"F0",X"00",X"80",X"30",X"A3",X"30",X"A4",X"C0",X"95",X"00",X"D5",X"00",X"A5",X"40", + X"01",X"5F",X"05",X"5A",X"05",X"5F",X"05",X"4A",X"05",X"43",X"05",X"00",X"04",X"00",X"00",X"00", + X"F5",X"40",X"A5",X"50",X"F5",X"50",X"A1",X"50",X"C1",X"50",X"00",X"50",X"00",X"10",X"00",X"00", + X"00",X"23",X"0C",X"8F",X"0C",X"02",X"03",X"CA",X"00",X"1A",X"01",X"56",X"01",X"57",X"05",X"52", + X"C8",X"00",X"F2",X"30",X"80",X"30",X"A3",X"C0",X"A4",X"00",X"95",X"40",X"D5",X"40",X"85",X"50", + X"05",X"5F",X"05",X"4A",X"05",X"7F",X"05",X"2A",X"05",X"3F",X"04",X"0A",X"00",X"03",X"00",X"00", + X"F5",X"50",X"A1",X"50",X"FD",X"50",X"A8",X"50",X"FC",X"50",X"A0",X"10",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"55",X"15",X"55",X"15",X"55",X"03",X"BB", + X"00",X"00",X"00",X"00",X"3C",X"00",X"03",X"02",X"00",X"C2",X"55",X"02",X"56",X"8C",X"BA",X"AF", + X"03",X"BB",X"15",X"55",X"15",X"55",X"05",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"BA",X"AF",X"56",X"8C",X"55",X"02",X"00",X"C2",X"03",X"02",X"3C",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"15",X"54",X"05",X"55",X"01",X"55",X"00",X"15",X"00",X"BB",X"03",X"BB", + X"00",X"00",X"00",X"00",X"00",X"F0",X"43",X"00",X"54",X"C2",X"55",X"02",X"96",X"8C",X"BA",X"AF", + X"03",X"BB",X"00",X"BB",X"00",X"15",X"01",X"55",X"05",X"55",X"15",X"54",X"00",X"00",X"00",X"00", + X"BA",X"AF",X"96",X"8C",X"55",X"02",X"54",X"C2",X"43",X"00",X"00",X"F0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"05",X"55",X"01",X"55",X"00",X"15",X"03",X"B1",X"0B",X"BB",X"3B",X"BB", + X"00",X"00",X"00",X"00",X"40",X"3C",X"54",X"C0",X"54",X"C8",X"55",X"02",X"16",X"8C",X"BA",X"AF", + X"3B",X"BB",X"0B",X"BB",X"03",X"B1",X"00",X"15",X"01",X"55",X"05",X"55",X"00",X"00",X"00",X"00", + X"BA",X"AF",X"16",X"8C",X"55",X"02",X"54",X"C8",X"54",X"C0",X"40",X"3C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"02",X"A0",X"0A",X"A8",X"0B",X"C2",X"0B",X"C2", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A",X"80",X"2A",X"A0",X"BC",X"20",X"BC",X"20", + X"0B",X"FE",X"0A",X"FE",X"0A",X"AA",X"09",X"40",X"05",X"88",X"0A",X"64",X"01",X"A0",X"00",X"00", + X"BF",X"E0",X"BF",X"A0",X"AA",X"A0",X"01",X"60",X"22",X"50",X"19",X"A0",X"0A",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"02",X"A0",X"0A",X"A8",X"0B",X"FE",X"0B",X"0E",X"0B",X"0E", + X"00",X"00",X"00",X"00",X"02",X"00",X"0A",X"80",X"2A",X"A0",X"BF",X"E0",X"B0",X"E0",X"B0",X"E0", + X"0A",X"FE",X"0A",X"AA",X"05",X"50",X"0A",X"80",X"05",X"40",X"02",X"90",X"00",X"58",X"00",X"00", + X"BF",X"A0",X"AA",X"A0",X"05",X"50",X"02",X"A0",X"01",X"50",X"06",X"80",X"25",X"00",X"00",X"00", + X"00",X"80",X"02",X"A0",X"0A",X"A8",X"08",X"3E",X"08",X"3E",X"0B",X"FE",X"0A",X"FE",X"0A",X"AA", + X"02",X"00",X"0A",X"80",X"2A",X"A0",X"83",X"E0",X"83",X"E0",X"BF",X"E0",X"BF",X"A0",X"AA",X"A0", + X"05",X"54",X"0A",X"A8",X"01",X"54",X"02",X"A8",X"00",X"54",X"00",X"28",X"00",X"04",X"00",X"00", + X"15",X"50",X"2A",X"A0",X"15",X"40",X"2A",X"80",X"15",X"00",X"28",X"00",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"09",X"AA",X"19",X"6B",X"26",X"6F",X"28",X"2F",X"06",X"2F",X"00",X"2A", + X"00",X"00",X"00",X"00",X"A8",X"00",X"FA",X"00",X"FA",X"80",X"0A",X"00",X"08",X"00",X"A0",X"00", + X"00",X"2A",X"06",X"2F",X"28",X"2F",X"26",X"6F",X"19",X"6B",X"09",X"AA",X"00",X"00",X"00",X"00", + X"A0",X"00",X"F8",X"00",X"FA",X"00",X"0A",X"80",X"0A",X"00",X"A8",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"9A",X"09",X"9A",X"19",X"9B",X"14",X"1B",X"20",X"0B",X"00",X"0A", + X"00",X"00",X"00",X"00",X"AA",X"00",X"FE",X"80",X"0E",X"A0",X"0E",X"80",X"FE",X"00",X"A8",X"00", + X"00",X"0A",X"20",X"0B",X"14",X"1B",X"19",X"9B",X"09",X"9A",X"01",X"9A",X"00",X"00",X"00",X"00", + X"A8",X"00",X"FE",X"00",X"0E",X"80",X"0E",X"A0",X"FE",X"80",X"AA",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"09",X"00",X"99",X"01",X"99",X"09",X"99",X"19",X"99",X"00",X"00", + X"00",X"00",X"00",X"00",X"AA",X"A0",X"AC",X"28",X"BC",X"2A",X"BF",X"E8",X"BF",X"E0",X"AA",X"80", + X"00",X"00",X"19",X"99",X"09",X"99",X"01",X"99",X"00",X"99",X"00",X"09",X"00",X"00",X"00",X"00", + X"AA",X"80",X"BC",X"20",X"BC",X"28",X"BF",X"EA",X"AF",X"E8",X"AA",X"A0",X"00",X"00",X"00",X"00", + X"00",X"E0",X"03",X"F2",X"02",X"D4",X"00",X"55",X"02",X"15",X"08",X"25",X"00",X"81",X"00",X"08", + X"80",X"00",X"08",X"00",X"20",X"00",X"80",X"80",X"42",X"00",X"58",X"00",X"54",X"A0",X"56",X"00", + X"00",X"20",X"00",X"00",X"00",X"A1",X"00",X"05",X"00",X"95",X"02",X"15",X"00",X"04",X"00",X"00", + X"54",X"00",X"54",X"A0",X"56",X"00",X"50",X"00",X"4A",X"00",X"80",X"80",X"20",X"00",X"00",X"00", + X"00",X"03",X"02",X"0B",X"08",X"8F",X"00",X"25",X"02",X"05",X"08",X"85",X"00",X"25",X"02",X"05", + X"C0",X"00",X"E0",X"80",X"F2",X"20",X"58",X"00",X"50",X"80",X"52",X"20",X"58",X"00",X"50",X"80", + X"08",X"85",X"00",X"25",X"02",X"05",X"08",X"85",X"00",X"25",X"00",X"05",X"00",X"01",X"00",X"00", + X"52",X"20",X"58",X"00",X"50",X"80",X"52",X"20",X"58",X"00",X"50",X"00",X"80",X"00",X"00",X"00", + X"00",X"02",X"00",X"20",X"00",X"08",X"02",X"02",X"00",X"81",X"00",X"25",X"0A",X"15",X"00",X"95", + X"0B",X"00",X"8F",X"C0",X"17",X"80",X"55",X"00",X"54",X"80",X"58",X"20",X"42",X"00",X"20",X"00", + X"00",X"15",X"0A",X"15",X"00",X"95",X"00",X"05",X"00",X"A1",X"02",X"02",X"00",X"08",X"00",X"00", + X"08",X"00",X"00",X"00",X"4A",X"00",X"50",X"00",X"56",X"00",X"54",X"80",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"02",X"20",X"05",X"22",X"15",X"40",X"05",X"50", + X"00",X"00",X"00",X"00",X"08",X"00",X"02",X"2C",X"20",X"7F",X"09",X"5E",X"85",X"50",X"15",X"48", + X"09",X"55",X"20",X"55",X"02",X"15",X"02",X"20",X"08",X"08",X"00",X"08",X"00",X"00",X"00",X"00", + X"55",X"82",X"54",X"20",X"58",X"08",X"82",X"00",X"20",X"80",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"82",X"00",X"20",X"00",X"82",X"02",X"08",X"05",X"55",X"15",X"55", + X"00",X"00",X"00",X"00",X"08",X"20",X"82",X"08",X"08",X"20",X"20",X"80",X"55",X"78",X"55",X"7F", + X"15",X"55",X"05",X"55",X"02",X"08",X"00",X"82",X"00",X"20",X"00",X"82",X"00",X"00",X"00",X"00", + X"55",X"7F",X"55",X"78",X"20",X"80",X"08",X"20",X"82",X"08",X"08",X"20",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"02",X"20",X"02",X"15",X"20",X"55",X"09",X"55", + X"00",X"00",X"00",X"00",X"20",X"00",X"20",X"80",X"82",X"00",X"58",X"08",X"54",X"20",X"55",X"82", + X"05",X"50",X"15",X"40",X"05",X"22",X"02",X"20",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"15",X"48",X"85",X"50",X"09",X"5E",X"20",X"7F",X"02",X"2C",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"30",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"30", + X"00",X"00",X"00",X"00",X"F0",X"00",X"0C",X"00",X"F0",X"00",X"00",X"00",X"F0",X"00",X"0C",X"00", + X"00",X"0F",X"00",X"00",X"00",X"30",X"00",X"3F",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"FC",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"30",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"30", + X"00",X"00",X"00",X"00",X"F0",X"00",X"0C",X"00",X"F0",X"00",X"00",X"00",X"F0",X"00",X"0C",X"00", + X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"30",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"3C",X"00",X"CC",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"30",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"30", + X"00",X"00",X"00",X"00",X"F0",X"00",X"0C",X"00",X"F0",X"00",X"00",X"00",X"F0",X"00",X"0C",X"00", + X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"30",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"30",X"00",X"CC",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0A",X"00",X"AA",X"02",X"AA",X"02",X"AA",X"0A",X"AA",X"0A",X"AA", + X"00",X"00",X"00",X"00",X"A0",X"00",X"A8",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"88",X"AA",X"A0", + X"0A",X"AA",X"0A",X"AA",X"02",X"AA",X"02",X"AA",X"00",X"AA",X"00",X"0A",X"00",X"00",X"00",X"00", + X"AA",X"A0",X"AA",X"88",X"AA",X"80",X"AA",X"00",X"A8",X"00",X"A0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0A",X"00",X"AA",X"02",X"AA",X"02",X"AA",X"0A",X"AA",X"0A",X"AA", + X"00",X"00",X"00",X"00",X"A0",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"80",X"AA",X"A0",X"AA",X"A0", + X"0A",X"AA",X"0A",X"AA",X"02",X"AA",X"02",X"AA",X"00",X"AA",X"00",X"0A",X"00",X"00",X"00",X"00", + X"AA",X"A0",X"AA",X"A0",X"AA",X"80",X"AA",X"80",X"AA",X"00",X"A0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"00",X"2A",X"00",X"AA",X"02",X"AA",X"02",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"00",X"A8",X"00",X"AA",X"00",X"AA",X"80",X"AA",X"80", + X"02",X"AA",X"02",X"AA",X"00",X"AA",X"00",X"2A",X"00",X"0A",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"80",X"AA",X"80",X"AA",X"00",X"A8",X"00",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"00",X"2A",X"00",X"AA",X"00",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"00",X"A8",X"00",X"AA",X"00",X"AA",X"00", + X"00",X"AA",X"00",X"AA",X"00",X"2A",X"00",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"00",X"AA",X"00",X"A8",X"00",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A",X"00",X"2A", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"A0",X"00",X"A8",X"00", + X"00",X"2A",X"00",X"0A",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A8",X"00",X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"A0",X"00", + X"00",X"0A",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_sprite_u.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_sprite_u.vhd new file mode 100644 index 00000000..a8d873d5 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ROM/rom_sprite_u.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_sprite_u is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_sprite_u is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"00",X"35",X"00",X"55",X"01",X"DD", + X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"00",X"55",X"40",X"55",X"00",X"C0",X"00",X"00",X"00", + X"01",X"54",X"01",X"DC",X"01",X"50",X"01",X"D0",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2A",X"00",X"AA",X"00",X"AA",X"02",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"40",X"95",X"00",X"95",X"00",X"A9",X"00",X"A0",X"00", + X"02",X"AA",X"02",X"AA",X"02",X"AB",X"02",X"BE",X"00",X"AA",X"00",X"28",X"00",X"00",X"00",X"00", + X"A0",X"00",X"80",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A",X"00",X"0A",X"00",X"2A", + X"00",X"00",X"00",X"00",X"00",X"00",X"B5",X"40",X"BD",X"00",X"AD",X"00",X"AB",X"00",X"A8",X"00", + X"00",X"2A",X"00",X"AA",X"00",X"AA",X"02",X"A8",X"02",X"A0",X"00",X"00",X"00",X"00",X"00",X"00", + X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"00",X"AA",X"02",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"40",X"05",X"00",X"04",X"00",X"10",X"00",X"54",X"40", + X"02",X"AA",X"00",X"AE",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"41",X"40",X"10",X"00",X"04",X"00",X"05",X"00",X"01",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"01",X"00",X"15", + X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"00",X"11",X"00",X"44",X"00",X"11",X"00",X"40",X"00", + X"00",X"10",X"01",X"55",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"54",X"40",X"11",X"00",X"44",X"40",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2A",X"00",X"AA",X"00",X"AA",X"02",X"AA",X"02",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"00",X"A8",X"00",X"A5",X"00",X"A9",X"00",X"A5",X"00", + X"02",X"AA",X"02",X"AA",X"00",X"AA",X"00",X"AF",X"00",X"2A",X"00",X"00",X"00",X"00",X"00",X"00", + X"A9",X"40",X"A5",X"00",X"E9",X"00",X"A5",X"00",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"00",X"AA",X"02",X"A5",X"00",X"95",X"01",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"A0",X"00",X"A0",X"00",X"40",X"00",X"50",X"00", + X"01",X"55",X"00",X"95",X"02",X"A5",X"00",X"AA",X"00",X"0A",X"00",X"00",X"00",X"00",X"00",X"00", + X"5A",X"00",X"40",X"00",X"A0",X"00",X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"AA",X"02",X"A9",X"03",X"A5",X"01",X"66", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"50",X"00",X"68",X"00",X"9A",X"00",X"96",X"80", + X"02",X"5A",X"03",X"96",X"02",X"A5",X"03",X"A5",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A5",X"80",X"A5",X"00",X"A5",X"00",X"41",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"16",X"80",X"F5",X"00",X"FD",X"00",X"FC",X"00", + X"00",X"3F",X"00",X"FF",X"03",X"FF",X"03",X"FC",X"03",X"F0",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"00",X"AA",X"00",X"BA",X"00",X"BA",X"80",X"5A",X"80", + X"01",X"55",X"01",X"54",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"5A",X"80",X"BA",X"80",X"BA",X"00",X"AA",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"2A",X"00",X"AE",X"02",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"2A",X"00",X"AA",X"80",X"BA",X"80",X"AA",X"80",X"AB",X"80", + X"02",X"AA",X"02",X"AA",X"02",X"AB",X"02",X"EA",X"00",X"AA",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"00",X"A0",X"00",X"80",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"00",X"FF",X"03",X"AA",X"02",X"FF",X"03",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"B0",X"00",X"D5",X"40", + X"02",X"AA",X"03",X"FF",X"02",X"FF",X"00",X"BE",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00", + X"B4",X"00",X"E0",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"0B",X"00",X"2E",X"00",X"BA", + X"00",X"00",X"00",X"00",X"00",X"00",X"D4",X"00",X"F5",X"00",X"FD",X"40",X"F5",X"40",X"FF",X"40", + X"02",X"AA",X"03",X"AB",X"03",X"EA",X"00",X"FA",X"00",X"3E",X"00",X"00",X"00",X"00",X"00",X"00", + X"EF",X"00",X"AC",X"00",X"B0",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A",X"00",X"08",X"00",X"08",X"00",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"80",X"2A",X"80",X"AA",X"80",X"A8",X"00",X"80",X"00", + X"00",X"D2",X"03",X"F4",X"03",X"FD",X"03",X"FF",X"03",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"AA",X"00",X"0A",X"80",X"02",X"80",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A",X"00",X"2A", + X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"C0",X"AF",X"00",X"AB",X"00",X"AB",X"00",X"A8",X"00", + X"00",X"AA",X"00",X"AA",X"02",X"A0",X"02",X"80",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"80",X"88",X"80",X"22",X"00",X"68",X"80",X"58",X"80", + X"00",X"15",X"03",X"55",X"03",X"D5",X"00",X"F4",X"00",X"3C",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"2A",X"00",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"AA",X"00",X"AA",X"00",X"AA",X"00",X"A8",X"00", + X"02",X"AA",X"02",X"AA",X"02",X"AA",X"02",X"AA",X"02",X"A0",X"00",X"00",X"00",X"00",X"00",X"00", + X"A0",X"00",X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"01",X"00",X"15",X"00",X"55",X"00",X"05", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"50",X"80",X"55",X"00",X"54",X"80",X"40",X"80", + X"00",X"05",X"00",X"55",X"00",X"54",X"01",X"55",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"42",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"00",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"A0",X"00", + X"00",X"02",X"00",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2A",X"00",X"0A",X"00",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"A8",X"00",X"A8",X"00", + X"00",X"02",X"00",X"0A",X"00",X"2A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A8",X"00",X"A8",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2A",X"00",X"0A",X"00",X"02",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"A8",X"00",X"AA",X"00",X"AA",X"00", + X"00",X"00",X"00",X"02",X"00",X"0A",X"00",X"2A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"00",X"AA",X"00",X"A8",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2A",X"00",X"0A",X"00",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"A0",X"00",X"A2",X"00",X"8A",X"80",X"08",X"80", + X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A",X"00",X"2A",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"80",X"8A",X"80",X"A2",X"00",X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"2A",X"00",X"0A",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"A0",X"00",X"A0",X"00",X"80",X"80",X"02",X"A0",X"02",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A",X"00",X"2A",X"00",X"00",X"00",X"00", + X"02",X"20",X"02",X"A0",X"80",X"80",X"A0",X"00",X"A0",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0A",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"A0",X"00",X"A8",X"00",X"A8",X"00",X"20",X"20",X"00",X"A8",X"00",X"88",X"00",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A",X"00",X"00", + X"00",X"88",X"00",X"88",X"00",X"A8",X"20",X"20",X"A8",X"00",X"A8",X"00",X"A0",X"00",X"00",X"00", + X"00",X"0A",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A0",X"00",X"A8",X"00",X"A8",X"00",X"20",X"00",X"00",X"08",X"00",X"2A",X"00",X"22",X"00",X"22", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A", + X"00",X"22",X"00",X"22",X"00",X"2A",X"00",X"08",X"20",X"00",X"A8",X"00",X"A8",X"00",X"A0",X"00", + X"00",X"00",X"00",X"00",X"15",X"00",X"55",X"40",X"45",X"54",X"05",X"55",X"15",X"55",X"55",X"55", + X"02",X"55",X"00",X"55",X"00",X"55",X"01",X"55",X"05",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"55",X"55",X"55",X"40",X"55",X"00",X"54",X"00",X"54",X"00",X"54",X"00",X"14",X"00",X"50",X"00", + X"55",X"55",X"55",X"55",X"01",X"55",X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"55",X"55",X"55",X"55",X"D5",X"57",X"F5",X"57",X"F1",X"57",X"C0",X"14",X"00",X"50",X"00", + X"55",X"95",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"15",X"55",X"05",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"55",X"00",X"55",X"00",X"15",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"3F",X"00",X"FF",X"C0",X"CF",X"FC",X"0F",X"FF",X"3F",X"FF",X"FF",X"FF", + X"05",X"55",X"01",X"55",X"00",X"D5",X"03",X"FE",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"C0",X"FF",X"00",X"FC",X"00",X"FC",X"00",X"FC",X"00",X"3C",X"00",X"F0",X"00", + X"FF",X"FF",X"FF",X"FF",X"03",X"FF",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"55",X"FD",X"55",X"F5",X"57",X"F5",X"5F",X"D5",X"43",X"F5",X"40",X"14",X"00",X"F0",X"00", + X"55",X"65",X"55",X"55",X"55",X"55",X"D5",X"55",X"D5",X"55",X"F5",X"55",X"35",X"55",X"0D",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"55",X"00",X"D5",X"00",X"35",X"00",X"0D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"56",X"55",X"56",X"55",X"5A",X"55",X"42", + X"5A",X"AA",X"6A",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"55",X"00",X"54",X"00",X"50",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0A",X"AA",X"00",X"2A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"56",X"55",X"5A",X"55",X"6A",X"55",X"EA",X"57",X"F2", + X"5A",X"AA",X"6A",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"5F",X"C0",X"7F",X"00",X"FC",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0A",X"AA",X"00",X"2A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"5A",X"56",X"AA",X"AA",X"AA",X"AA",X"AA",X"EA",X"AA",X"FE",X"AA",X"FF",X"EA",X"FF",X"C2", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"FF",X"00",X"FC",X"00",X"F0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0A",X"AA",X"00",X"2A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"56",X"55",X"56",X"55",X"5A",X"55",X"52", + X"5A",X"AA",X"6A",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"55",X"40",X"55",X"00",X"54",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0A",X"AA",X"00",X"2A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"55",X"A9",X"55",X"AA",X"A5",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"A8", + X"55",X"55",X"55",X"54",X"55",X"50",X"55",X"50",X"95",X"40",X"95",X"40",X"55",X"00",X"55",X"00", + X"AA",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00", + X"54",X"00",X"57",X"00",X"5F",X"C0",X"53",X"F0",X"54",X"FC",X"14",X"3C",X"17",X"3C",X"50",X"F0", + X"55",X"55",X"A9",X"55",X"AA",X"A5",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"A8", + X"55",X"55",X"55",X"56",X"55",X"5A",X"55",X"5A",X"95",X"6A",X"95",X"40",X"55",X"00",X"55",X"00", + X"AA",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00", + X"54",X"00",X"D5",X"00",X"F5",X"40",X"F1",X"50",X"F0",X"50",X"3C",X"14",X"3D",X"14",X"F0",X"50", + X"00",X"01",X"00",X"45",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00", + X"C0",X"05",X"F0",X"00",X"F0",X"00",X"3C",X"00",X"0C",X"00",X"3C",X"00",X"F0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"55",X"A9",X"55",X"AA",X"A5",X"AA",X"A5",X"AA",X"A5",X"AA",X"96",X"AA",X"96",X"AA",X"5A", + X"56",X"AA",X"6A",X"AA",X"6A",X"A9",X"AA",X"A9",X"AA",X"A5",X"AA",X"A5",X"AA",X"95",X"AB",X"C0", + X"AA",X"5A",X"AA",X"94",X"00",X"04",X"01",X"14",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00", + X"83",X"F0",X"00",X"FC",X"00",X"3C",X"00",X"0F",X"00",X"03",X"00",X"CF",X"00",X"3C",X"00",X"00", + X"55",X"55",X"95",X"55",X"A5",X"55",X"A5",X"55",X"A5",X"75",X"A5",X"75",X"25",X"F5",X"15",X"D5", + X"55",X"40",X"55",X"40",X"55",X"40",X"55",X"40",X"D5",X"40",X"D5",X"40",X"F5",X"40",X"55",X"40", + X"17",X"D5",X"17",X"D5",X"5F",X"55",X"5F",X"55",X"5D",X"55",X"7D",X"45",X"3D",X"54",X"05",X"40", + X"55",X"00",X"55",X"00",X"54",X"00",X"54",X"00",X"50",X"00",X"40",X"00",X"00",X"00",X"00",X"00", + X"55",X"55",X"95",X"55",X"A5",X"55",X"A5",X"55",X"A5",X"5D",X"A5",X"5D",X"29",X"5F",X"09",X"5F", + X"55",X"54",X"5D",X"54",X"5F",X"54",X"5C",X"55",X"57",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"01",X"5F",X"01",X"57",X"00",X"57",X"00",X"57",X"00",X"17",X"00",X"17",X"00",X"07",X"00",X"00", + X"D5",X"54",X"D5",X"54",X"35",X"54",X"35",X"44",X"0D",X"54",X"3D",X"50",X"05",X"00",X"00",X"00", + X"55",X"55",X"95",X"55",X"A5",X"55",X"A5",X"55",X"A5",X"55",X"A5",X"5D",X"25",X"73",X"15",X"C3", + X"55",X"50",X"55",X"50",X"75",X"50",X"7D",X"50",X"71",X"54",X"5D",X"54",X"55",X"54",X"55",X"54", + X"15",X"C3",X"15",X"C0",X"17",X"00",X"17",X"00",X"17",X"00",X"1C",X"00",X"00",X"00",X"00",X"00", + X"55",X"50",X"D5",X"50",X"D5",X"50",X"D4",X"40",X"35",X"40",X"F5",X"00",X"14",X"00",X"00",X"00", + X"55",X"55",X"95",X"55",X"A5",X"55",X"A5",X"55",X"A5",X"55",X"A5",X"75",X"25",X"75",X"15",X"F5", + X"55",X"40",X"55",X"40",X"55",X"40",X"75",X"40",X"F5",X"40",X"C5",X"40",X"D5",X"40",X"55",X"40", + X"15",X"F5",X"15",X"F5",X"17",X"35",X"17",X"35",X"17",X"35",X"1C",X"35",X"00",X"F5",X"00",X"15", + X"55",X"40",X"55",X"40",X"55",X"00",X"55",X"00",X"55",X"00",X"14",X"00",X"50",X"00",X"40",X"00", + X"55",X"55",X"95",X"55",X"A5",X"55",X"A5",X"55",X"A5",X"55",X"A5",X"75",X"25",X"75",X"15",X"F5", + X"55",X"40",X"55",X"40",X"55",X"40",X"55",X"40",X"75",X"40",X"F5",X"40",X"35",X"40",X"D5",X"40", + X"15",X"F5",X"15",X"D5",X"17",X"D5",X"17",X"D5",X"17",X"55",X"1F",X"55",X"03",X"55",X"01",X"50", + X"55",X"00",X"55",X"00",X"54",X"00",X"54",X"00",X"50",X"00",X"50",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"15",X"41",X"55",X"55",X"55",X"55",X"7F",X"55",X"CD",X"55",X"55",X"55",X"55", + X"00",X"00",X"40",X"00",X"50",X"00",X"54",X"00",X"55",X"00",X"55",X"40",X"55",X"40",X"55",X"40", + X"55",X"55",X"55",X"55",X"55",X"CD",X"55",X"7F",X"55",X"55",X"01",X"55",X"00",X"15",X"00",X"00", + X"55",X"40",X"55",X"40",X"55",X"40",X"55",X"00",X"54",X"00",X"50",X"00",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"40",X"00",X"55",X"40",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"50",X"00",X"54",X"00",X"55",X"00",X"55",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"55",X"40",X"55",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"50",X"00",X"55",X"54",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"50",X"00",X"54",X"00",X"55",X"00",X"55",X"00", + X"02",X"A9",X"02",X"A9",X"02",X"AA",X"0F",X"AA",X"FF",X"AA",X"03",X"AA",X"0F",X"EA",X"FF",X"EA", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"95",X"55",X"A5",X"55",X"A9",X"55",X"AA",X"55", + X"FF",X"FA",X"FF",X"FA",X"FF",X"CE",X"FF",X"02",X"FC",X"00",X"FC",X"00",X"3C",X"00",X"F0",X"00", + X"AA",X"95",X"AA",X"95",X"AA",X"A5",X"AA",X"A5",X"AA",X"A5",X"AA",X"95",X"2A",X"95",X"0A",X"95", + X"02",X"A9",X"02",X"A9",X"02",X"AA",X"00",X"AA",X"00",X"AA",X"00",X"AA",X"00",X"2A",X"00",X"2A", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"95",X"55",X"A5",X"55",X"A9",X"55",X"AA",X"55", + X"00",X"0A",X"00",X"0A",X"00",X"0E",X"05",X"7E",X"15",X"53",X"01",X"57",X"15",X"55",X"55",X"55", + X"AA",X"95",X"AA",X"95",X"AA",X"A5",X"AA",X"A5",X"AA",X"A5",X"AA",X"95",X"EA",X"95",X"5A",X"95", + X"02",X"A9",X"02",X"A9",X"02",X"AA",X"05",X"6A",X"15",X"5A",X"01",X"56",X"05",X"56",X"55",X"55", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"95",X"55",X"A5",X"55",X"A9",X"55",X"AA",X"55", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"15",X"54",X"05",X"54",X"01",X"14",X"00",X"50",X"00", + X"5A",X"95",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"15",X"55", + X"02",X"A9",X"02",X"A9",X"02",X"AA",X"00",X"AA",X"00",X"AA",X"00",X"AA",X"00",X"2A",X"00",X"2A", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"95",X"55",X"A5",X"55",X"A9",X"55",X"AA",X"55", + X"00",X"0A",X"00",X"0A",X"00",X"05",X"0F",X"D5",X"3F",X"F1",X"03",X"F5",X"3F",X"55",X"FF",X"55", + X"AA",X"95",X"AA",X"95",X"AA",X"A5",X"6A",X"A5",X"6A",X"A5",X"5A",X"A5",X"56",X"A5",X"55",X"A5", + X"50",X"00",X"55",X"00",X"55",X"54",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"50",X"00",X"55",X"40",X"55",X"55",X"55",X"55",X"55",X"55", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"55",X"40",X"55",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"55",X"40",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"50",X"00",X"54",X"00",X"55",X"00",X"55",X"54",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"55",X"55",X"A5",X"55",X"AA",X"55",X"AA",X"A5",X"AA",X"A5",X"AA",X"96",X"AA",X"96",X"AA",X"A5", + X"5A",X"5F",X"69",X"F5",X"67",X"D4",X"A7",X"55",X"A7",X"55",X"A7",X"D4",X"A9",X"F5",X"AA",X"5F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"55",X"40",X"55",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00", + X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"50",X"00",X"54",X"00",X"55",X"40",X"55",X"56",X"55",X"56",X"55",X"56",X"55",X"5A",X"55",X"6A", + X"A5",X"54",X"A5",X"54",X"A5",X"54",X"A5",X"55",X"A5",X"55",X"A9",X"55",X"A9",X"55",X"A9",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00", + X"A9",X"55",X"AA",X"55",X"2A",X"55",X"2A",X"55",X"2A",X"95",X"0A",X"95",X"0A",X"A5",X"0A",X"A5", + X"50",X"00",X"50",X"00",X"54",X"00",X"55",X"00",X"55",X"40",X"55",X"50",X"55",X"54",X"55",X"55", + X"0A",X"95",X"0A",X"55",X"0A",X"55",X"2A",X"55",X"2A",X"55",X"29",X"55",X"A9",X"55",X"A9",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00", + X"A9",X"55",X"AA",X"55",X"2A",X"55",X"2A",X"55",X"2A",X"95",X"0A",X"95",X"0A",X"A5",X"0A",X"A5", + X"50",X"00",X"50",X"00",X"54",X"00",X"55",X"00",X"55",X"40",X"55",X"50",X"55",X"54",X"55",X"55", + X"02",X"A5",X"02",X"95",X"0A",X"95",X"0A",X"55",X"2A",X"55",X"29",X"55",X"29",X"55",X"A9",X"55", + X"40",X"00",X"40",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00", + X"A9",X"55",X"AA",X"55",X"AA",X"55",X"2A",X"55",X"2A",X"95",X"0A",X"95",X"0A",X"A5",X"0A",X"A5", + X"50",X"00",X"50",X"00",X"54",X"00",X"55",X"00",X"55",X"40",X"55",X"50",X"55",X"54",X"55",X"55", + X"00",X"14",X"00",X"94",X"02",X"54",X"02",X"50",X"0A",X"50",X"09",X"40",X"29",X"40",X"25",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"25",X"40",X"A5",X"40",X"95",X"40",X"95",X"40",X"95",X"50",X"95",X"50",X"95",X"50",X"A5",X"50", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"0A", + X"00",X"00",X"00",X"00",X"00",X"50",X"09",X"40",X"25",X"00",X"94",X"00",X"94",X"00",X"54",X"00", + X"00",X"09",X"00",X"29",X"00",X"25",X"00",X"A5",X"00",X"95",X"02",X"95",X"02",X"95",X"02",X"95", + X"50",X"00",X"50",X"00",X"50",X"00",X"40",X"00",X"40",X"00",X"40",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0A",X"00",X"29",X"02",X"A5",X"0A",X"55",X"29",X"55",X"A9",X"54",X"A5",X"50", + X"A8",X"00",X"96",X"80",X"55",X"60",X"55",X"54",X"50",X"55",X"00",X"05",X"00",X"00",X"00",X"00", + X"00",X"3C",X"00",X"FC",X"00",X"FF",X"00",X"3F",X"00",X"3F",X"00",X"FC",X"00",X"FC",X"03",X"F0", + X"00",X"00",X"00",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"F0",X"0F",X"C0",X"0F",X"C0",X"FF",X"00",X"FF",X"00",X"FF",X"C0",X"0F",X"C0",X"0F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"50",X"00",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"00",X"00",X"00",X"00",X"40",X"00",X"54",X"00",X"55",X"00",X"55",X"40",X"55",X"50",X"55",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/build_id.tcl b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_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/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/build_id.v b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/build_id.v new file mode 100644 index 00000000..744846ed --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171116" +`define BUILD_TIME "111346" diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c3e13c5c --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1094 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..7e8a9995 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,370 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..7d407fb8 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2027 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..6904b66b --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..998033ef --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80a.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80a.vhd new file mode 100644 index 00000000..33d61068 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/cpu/T80a.vhd @@ -0,0 +1,280 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80a is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLK_EN_SYS : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80a; + +architecture rtl of T80a is + + signal CEN : std_logic; + signal Reset_s : std_logic; + signal IntCycle_n : std_logic; + signal IORQ : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal MREQ : std_logic; + signal MReq_Inhibit : std_logic; + signal Req_Inhibit : std_logic; + signal RD : std_logic; + signal MREQ_n_i : std_logic; + signal IORQ_n_i : std_logic; + signal RD_n_i : std_logic; + signal WR_n_i : std_logic; + signal RFSH_n_i : std_logic; + signal BUSAK_n_i : std_logic; + signal A_i : std_logic_vector(15 downto 0); + signal DO_Reg : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector (7 downto 0); -- Input synchroniser + signal Wait_s : std_logic; + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + -- clock enable supplied from clocking system + CEN <= CLK_EN_SYS; + + BUSAK_n <= BUSAK_n_i; + MREQ_n_i <= not MREQ or (Req_Inhibit and MReq_Inhibit); + RD_n_i <= not RD or Req_Inhibit; + + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DO <= DO_Reg; + +-- process (RESET_n, CLK_n) +-- begin +-- if RESET_n = '0' then +-- Reset_s <= '0'; +-- elsif CLK_n'event and CLK_n = '1' then +-- Reset_s <= '1'; +-- end if; +-- end process; + -- T80 reset input has already proper characteristics: + -- * asynchronous assertion + -- * deassertion synchronous to CLK_n (main_clk) + Reset_s <= RESET_n; + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, + DInst => DI, + DI => DI_Reg, + DO => DO_Reg, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + if CEN = '1' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then + DI_Reg <= to_x01(DI); + end if; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + WR_n_i <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + WR_n_i <= '1'; + if TState = "001" then -- To short for IO writes !!!!!!!!!!!!!!!!!!! + WR_n_i <= not Write; + end if; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + Req_Inhibit <= '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and TState = "010" then + Req_Inhibit <= '1'; + else + Req_Inhibit <= '0'; + end if; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + MReq_Inhibit <= '0'; + elsif CLK_n'event and CLK_n = '0' then + if CEN = '1' then + if MCycle = "001" and TState = "010" then + MReq_Inhibit <= '1'; + else + MReq_Inhibit <= '0'; + end if; + end if; + end if; + end process; + + process(Reset_s,CLK_n) + begin + if Reset_s = '0' then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '0'; + elsif CLK_n'event and CLK_n = '0' then + if CEN = '1' then + + if MCycle = "001" then + if TState = "001" then + RD <= IntCycle_n; + MREQ <= IntCycle_n; + IORQ_n_i <= IntCycle_n; + end if; + if TState = "011" then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '1'; + end if; + if TState = "100" then + MREQ <= '0'; + end if; + else + if TState = "001" and NoRead = '0' then + RD <= not Write; + IORQ_n_i <= not IORQ; + MREQ <= not IORQ; + end if; + if TState = "011" then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '0'; + end if; + end if; + + end if; + end if; + end process; + +end; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/dac.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/dac.vhd new file mode 100644 index 00000000..75d941cb --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_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 := 6 + ); + 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/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/dpram.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/hq2x.sv b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_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/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/keyboard.v b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug.vhd new file mode 100644 index 00000000..b19b5cf8 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug.vhd @@ -0,0 +1,243 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- Toplevel port for Papilio Plus board. +-- +------------------------------------------------------------------------------- +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + +library ieee; + use ieee.numeric_std.all; + +use work.ladybug_dip_pack.all; + +entity ladybugt is +port ( + -- Global Interface ------------------------------------------------------- + CLK_IN : in std_logic; -- 20MHz + I_RESET : in std_logic; + + -- VGA Interface ---------------------------------------------------------- + O_VIDEO_R : out std_logic_vector( 1 downto 0); + O_VIDEO_G : out std_logic_vector( 1 downto 0); + O_VIDEO_B : out std_logic_vector( 1 downto 0); + O_VSYNC : out std_logic; + O_HSYNC : out std_logic; + O_VBLANK : out std_logic; + O_HBLANK : out std_logic; + O_PIXCE : out std_logic; + + -- Audio Interface -------------------------------------------------------- + O_AUDIO : out signed(7 downto 0); + + but_coin_s : in std_logic_vector( 1 downto 0); + but_fire_s : in std_logic_vector( 1 downto 0); + but_bomb_s : in std_logic_vector( 1 downto 0); + but_tilt_s : in std_logic_vector( 1 downto 0); + but_select_s : in std_logic_vector( 1 downto 0); + but_up_s : in std_logic_vector( 1 downto 0); + but_down_s : in std_logic_vector( 1 downto 0); + but_left_s : in std_logic_vector( 1 downto 0); + but_right_s : in std_logic_vector( 1 downto 0) +); +end ladybugt; + +architecture struct of ladybugt is + + signal + ps2_codeready, + clk_20mhz_s, + clk_en_5mhz_s, + ext_res_n_s, + ext_res_s, + audio_s, + vid_hsync, + vid_vsync, + vga_hsync, + vid_comp_sync_n, + vga_vsync : std_logic; + + signal rom_cpu_a_s : std_logic_vector(14 downto 0); + signal rom_cpu_d_s : std_logic_vector( 7 downto 0); + signal rom_cpu_d1 : std_logic_vector( 7 downto 0); + signal rom_cpu_d2 : std_logic_vector( 7 downto 0); + signal rom_cpu_d3 : std_logic_vector( 7 downto 0); + signal rom_cpu_d4 : std_logic_vector( 7 downto 0); + signal rom_cpu_d5 : std_logic_vector( 7 downto 0); + signal rom_cpu_d6 : std_logic_vector( 7 downto 0); + + signal rom_char_a_s : std_logic_vector(11 downto 0); + signal rom_char_d_s : std_logic_vector(15 downto 0); + + signal rom_sprite_a_s : std_logic_vector(11 downto 0); + signal rom_sprite_d_s : std_logic_vector(15 downto 0); + + signal + dac_audio_s, + dip_block_1_s, + dip_block_2_s : std_logic_vector( 7 downto 0) := (others => '0'); + + signal ps2_scancode : std_logic_vector( 9 downto 0) := (others => '0'); + + signal + vid_rgb, + vga_rgb : std_logic_vector(15 downto 0) := (others => '0'); + + signal but_chute_s : std_logic_vector( 1 downto 0) := (others=>'0'); + +begin + + O_PIXCE <= clk_en_5mhz_s; + + but_chute_s <= not but_coin_s(1) & not but_coin_s(0); + + ----------------------------------------------------------------------------- + -- inputs assignments + ----------------------------------------------------------------------------- + ext_res_s <= I_RESET; + ext_res_n_s <= not ext_res_s; + clk_20mhz_s <= CLK_IN; + + ----------------------------------------------------------------------------- + -- Ladybug Machine + ----------------------------------------------------------------------------- + machine_b : entity work.ladybug_machine + port map ( + ext_res_n_i => ext_res_n_s, + clk_20mhz_i => clk_20mhz_s, + clk_en_5mhz_o => clk_en_5mhz_s, + tilt_n_i => but_tilt_s(0), + player_select_n_i => but_select_s, + player_fire_n_i => but_fire_s, + player_up_n_i => but_up_s, + player_right_n_i => but_right_s, + player_down_n_i => but_down_s, + player_left_n_i => but_left_s, + player_bomb_n_i => but_bomb_s, + right_chute_i => but_chute_s(0), + left_chute_i => but_chute_s(1), + dip_block_1_i => dip_block_1_s, + dip_block_2_i => dip_block_2_s, + rgb_r_o => O_VIDEO_R, + rgb_g_o => O_VIDEO_G, + rgb_b_o => O_VIDEO_B, + hsync_n_o => O_HSYNC, + vsync_n_o => O_VSYNC, + vblank_o => O_VBLANK, + hblank_o => O_HBLANK, + audio_o => O_AUDIO, + rom_cpu_a_o => rom_cpu_a_s, + rom_cpu_d_i => rom_cpu_d_s, + rom_char_a_o => rom_char_a_s, + rom_char_d_i => rom_char_d_s, + rom_sprite_a_o => rom_sprite_a_s, + rom_sprite_d_i => rom_sprite_d_s + ); + + ----------------------------------------------------------------------------- + -- Building the DIP Switches - see file ladybug_dip_pack.vhd + ----------------------------------------------------------------------------- + dip_block_1_s <= lb_dip_block_1_c; -- Lady Bug +-- dip_block_1_s <= do_dip_block_1_c; -- Dorodon +-- dip_block_1_s <= ca_dip_block_1_c; -- Cosmic Avenger + dip_block_2_s <= price_dip_block_2_c; -- Common for all games (coins per game pricing) + + ----------------------------------------------------------------------------- + -- Game ROMs + ----------------------------------------------------------------------------- + inst_rom_spritel : entity work.rom_sprite_l + port map ( + CLK => clk_20mhz_s, + ADDR => rom_sprite_a_s, + DATA => rom_sprite_d_s( 7 downto 0) + ); + + inst_rom_spriteu : entity work.rom_sprite_u + port map ( + CLK => clk_20mhz_s, + ADDR => rom_sprite_a_s, + DATA => rom_sprite_d_s(15 downto 8) + ); + + inst_rom_charl : entity work.rom_char_l + port map ( + CLK => clk_20mhz_s, + ADDR => rom_char_a_s, + DATA => rom_char_d_s( 7 downto 0) + ); + + inst_rom_charu : entity work.rom_char_u + port map ( + CLK => clk_20mhz_s, + ADDR => rom_char_a_s, + DATA => rom_char_d_s(15 downto 8) + ); + + inst_rom_cpu1 : entity work.rom_cpu1 + port map ( + CLK => clk_20mhz_s, + ADDR => rom_cpu_a_s(12 downto 0), + DATA => rom_cpu_d1 + ); + + inst_rom_cpu2 : entity work.rom_cpu2 + port map ( + CLK => clk_20mhz_s, + ADDR => rom_cpu_a_s(12 downto 0), + DATA => rom_cpu_d2 + ); + + inst_rom_cpu3 : entity work.rom_cpu3 + port map ( + CLK => clk_20mhz_s, + ADDR => rom_cpu_a_s(12 downto 0), + DATA => rom_cpu_d3 + ); + + ----------------------------------------------------------------------------- + -- Program ROMs data mux + ----------------------------------------------------------------------------- + rom_cpu_d_s <= + rom_cpu_d1 when rom_cpu_a_s(14 downto 13) = "00" else + rom_cpu_d2 when rom_cpu_a_s(14 downto 13) = "01" else + rom_cpu_d3 when rom_cpu_a_s(14 downto 13) = "10" else + (others=>'0'); + +end struct; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_addr_dec.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_addr_dec.vhd new file mode 100644 index 00000000..6d857f6c --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_addr_dec.vhd @@ -0,0 +1,130 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_addr_dec.vhd,v 1.10 2005/12/10 14:51:46 arnim Exp $ +-- +-- Address decoder of the CPU Unit. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_addr_dec is + + port ( + clk_20mhz_i : in std_logic; + res_n_i : in std_logic; + a_i : in std_logic_vector(15 downto 12); + rd_n_i : in std_logic; + wr_n_i : in std_logic; + mreq_n_i : in std_logic; + rfsh_n_i : in std_logic; + cs_n_o : out std_logic_vector(15 downto 0); + ram_cpu_cs_n_o : out std_logic + ); + +end ladybug_addr_dec; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_addr_dec is + +begin + + ----------------------------------------------------------------------------- + -- Process adec + -- + -- Purpose: + -- Decode the CPU address and generate one-hot chip select signals. + -- Each chip select enables a 4 KByte address segment. + -- + -- The chip select outputs are registered with the 20 MHz clock to + -- break potentially long combinational paths here. + -- + adec: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + cs_n_o <= (others => '1'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- default assignment + cs_n_o <= (others => '1'); + + if a_i(15) = '0' then + if rd_n_i = '0' or wr_n_i = '0' then + cs_n_o(to_integer(unsigned( '0' & a_i(14 downto 12) ))) <= '0'; + end if; + + else + if mreq_n_i = '0' and rfsh_n_i = '1' then + cs_n_o(to_integer(unsigned( '1' & a_i(14 downto 12) ))) <= '0'; + end if; + + end if; + + end if; + end process adec; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process cs_ext_ram + -- + -- Purpose: + -- Builds the combinational chip select signal for the external CPU RAM. + -- + cs_ext_ram: process (a_i, + rd_n_i, wr_n_i) + begin + if (rd_n_i = '0' or wr_n_i = '0') and + a_i(15 downto 12) = "0110" then + ram_cpu_cs_n_o <= '0'; + else + ram_cpu_cs_n_o <= '1'; + end if; + end process cs_ext_ram; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_char.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_char.vhd new file mode 100644 index 00000000..1ca149f3 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_char.vhd @@ -0,0 +1,740 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_char.vhd,v 1.18 2005/10/10 22:02:14 arnim Exp $ +-- +-- Character Video Module of Lady Bug Machine. +-- +-- This unit contains most of the logic found on schematic page three. +-- Excluded parts are: +-- * the 10 MHz and 5 MHz clock generation +-- moved into separate module on toplevel of Lady Bug machine +-- * the video timing circuitry +-- moved into separate module on toplevel of video unit +-- * the video MUX and RGB conversion unit +-- moved into separate module at toplevel of video unit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity ladybug_char is + port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + res_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_4mhz_i : in std_logic; + -- CPU Interface ---------------------------------------------------------- + cs10_n_i : in std_logic; + cs13_n_i : in std_logic; + a_i : in std_logic_vector(10 downto 0); + rd_n_i : in std_logic; + wr_n_i : in std_logic; + wait_n_o : out std_logic; + d_from_cpu_i : in std_logic_vector( 7 downto 0); + d_from_char_o : out std_logic_vector( 7 downto 0); + -- RGB Video Interface ---------------------------------------------------- + h_i : in std_logic_vector( 3 downto 0); + h_t_i : in std_logic_vector( 3 downto 0); + ha_t_rise_i : in std_logic; + hx_i : in std_logic; + v_i : in std_logic_vector( 3 downto 0); + v_t_i : in std_logic_vector( 3 downto 0); + hbl_i : in std_logic; + blank_flont_i : in std_logic; + blank_o : out std_logic; + crg_o : out std_logic_vector( 5 downto 1); + vblank_o : out std_logic; + hblank_o : out std_logic; + -- Character ROM Interface ------------------------------------------------ + rom_char_a_o : out std_logic_vector(11 downto 0); + rom_char_d_i : in std_logic_vector(15 downto 0) + ); + +end ladybug_char; + +architecture rtl of ladybug_char is + + signal flip_screen_q : std_logic; + + signal h0_s, + h1_s, + h2_s : std_logic; + signal h_flip_s, + h_t_flip_s : std_logic_vector(3 downto 0); + signal v_flip_s, + v_t_flip_s : std_logic_vector(3 downto 0); + + signal h_ctrl_d_s, + h_ctrl_s, + h_ctrl_n_s, + h_ctrl_d_out_s, + h_ctrl_d_n_out_s, + h_ctrl_rise_s, + h_ctrl_n_rise_s : std_logic_vector(4 downto 1); + + signal hx_ctrl_q, + hx_ctrl_s, + hx_ctrl_n_rise_s : std_logic; + signal hx_ctrl_clear_q : std_logic; + + signal b1_ff_q, + b1_ff_s, + b1_ff_n_rise_s : std_logic; + + signal wait_q : std_logic; + signal wait_clear_q : std_logic; + + signal cgs_q, + cgs_s, + cgs_rise_s : std_logic; + + signal ram_addr_s : std_logic_vector(9 downto 0); + signal select_a_s : std_logic; + + signal char_ram_cs_n_s, + char_ram_we_n_s : std_logic; + signal col_ram_cs_n_s, + col_ram_we_n_s : std_logic; + signal d_from_char_ram_s : std_logic_vector(7 downto 0); + signal d_from_col_ram_s : std_logic_vector(3 downto 0); + + signal s_q : std_logic_vector( 7 downto 0); + signal d_char_ram_q : std_logic_vector( 7 downto 0); + signal d_col_ram_q : std_logic_vector( 3 downto 0); + + signal d_char_rom_q : std_logic_vector(15 downto 0); + signal crg1_s, + crg2_s, + crg3_q, + crg4_q, + crg5_q : std_logic; + + signal hbl_q,hbl_d : std_logic; + + signal hcnt : integer; + signal vdd_s : std_logic; + +begin + + vdd_s <= '1'; + + ----------------------------------------------------------------------------- + -- Process flip + -- + -- Purpose: + -- Implement the flip_screen flag. + -- + flip: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + -- Actually, this asynchronous reset of the ls259 is not 100% + -- equivalent to the real behavior of this circuit. However, + -- the flip_screen latch is modelled like this for the sake of + -- simplicity. It's sufficient for the purpose here. + flip_screen_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if a_i(2 downto 0) = "000" and cs10_n_i = '0' then + flip_screen_q <= d_from_cpu_i(0); + end if; + + end if; + end process flip; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process h_flip + -- + -- Purpose: + -- Build the flipped horizontal timing signals. + -- + h_flip: process (flip_screen_q, + h_i, h_t_i, + s_q) + variable a_v, b_v, + sum_v : unsigned(8 downto 0); + begin + -- calculate sum + a_v := '0' & unsigned(s_q); + b_v := '0' & unsigned(h_t_i) & unsigned(h_i); + sum_v := a_v + b_v; + + -- h0,1,2 are taken from directly from sum + h0_s <= sum_v(0); + h1_s <= sum_v(1); + h2_s <= sum_v(2); + + -- now flip + for idx in 3 downto 0 loop + h_flip_s(idx) <= flip_screen_q xor sum_v(idx); + h_t_flip_s(idx) <= flip_screen_q xor sum_v(idx + 4); + end loop; + end process h_flip; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process v_flip + -- + -- Purpose: + -- Build the flipped horizontal timing signals. + -- + v_flip: process (flip_screen_q, + v_i, v_t_i) + begin + for idx in 3 downto 0 loop + v_flip_s(idx) <= flip_screen_q xor v_i(idx); + v_t_flip_s(idx) <= flip_screen_q xor v_t_i(idx); + end loop; + end process v_flip; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- The Horizontal Control Signals + -- Detailed purpose/meaning is unknown. + ----------------------------------------------------------------------------- + h_ctrl_d_s(1) <= not (not h2_s and (h1_s xor h0_s)); + h_ctrl_d_s(2) <= hx_i; + h_ctrl_d_s(3) <= not ((h1_s xor h0_s) or (not h2_s xor h1_s)); + h_ctrl_d_s(4) <= '0'; + h_ctrl_b : entity work.ttl_175 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => clk_en_5mhz_i, + por_n_i => por_n_i, + cl_n_i => vdd_s, + d_i => h_ctrl_d_s, + q_o => h_ctrl_s, + q_n_o => h_ctrl_n_s, + d_o => h_ctrl_d_out_s, + d_n_o => h_ctrl_d_n_out_s + ); + h_ctrl_rise_s <= not h_ctrl_s and h_ctrl_d_out_s; + h_ctrl_n_rise_s <= h_ctrl_s and not h_ctrl_d_n_out_s; + + + ----------------------------------------------------------------------------- + -- Process ctrl_seq + -- + -- Purpose: + -- Implemente the various sequential elements for horizontal control. + -- + ctrl_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + hx_ctrl_q <= '0'; + hx_ctrl_clear_q <= '0'; + b1_ff_q <= '0'; + wait_q <= '0'; + wait_clear_q <= '0'; + cgs_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- the HX control flip-flop + hx_ctrl_q <= hx_ctrl_s; + + -- the clear counterpart of hx_ctrl_q + if h_ctrl_s(2) = '0' then + -- pseudo-asynchronous clear + hx_ctrl_clear_q <= '0'; + elsif hx_ctrl_n_rise_s = '1' then + -- rising edge indicator acts as clock enable instead of clock + hx_ctrl_clear_q <= '1'; + end if; + + -- the mysterious B1 flip-flop + b1_ff_q <= b1_ff_s; + + -- the CGS rising edge indicator support flip-flops + cgs_q <= cgs_s; + + -- the WAIT flip-flop + if wait_clear_q = '1' then + -- pseudo-asynchronous clear + wait_q <= '0'; + elsif cgs_rise_s = '1' then + -- rising edge indicator acts as clock enable instead of clock + wait_q <= '1'; + end if; + + -- the clear counterpart of wait_q + if clk_en_4mhz_i = '1' then + wait_clear_q <= wait_q and (h_ctrl_s(3) and (b1_ff_q or hx_ctrl_q)); + end if; + + end if; + end process ctrl_seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process ctrl_comp + -- + -- Purpose: + -- Implements the combination logic for the horizontal control + -- elements. + -- + ctrl_comp: process (h_ctrl_rise_s, + hx_i, hx_ctrl_q, + hx_ctrl_clear_q, + h_ctrl_n_rise_s, + b1_ff_q, + cgs_q, cs13_n_i) + begin + -- default assignments + hx_ctrl_s <= hx_ctrl_q; + hx_ctrl_n_rise_s <= '0'; + b1_ff_s <= b1_ff_q; + b1_ff_n_rise_s <= '0'; + cgs_s <= cgs_q; + cgs_rise_s <= '0'; + + -- the HX control flip-flop ----------------------------------------------- + if hx_ctrl_clear_q = '1' then + -- pseudo-asynchronous clear + hx_ctrl_s <= '0'; + + if (not hx_ctrl_q) = '0' then + -- detct rising edge of inverted ouput + hx_ctrl_n_rise_s <= '1'; + end if; + elsif h_ctrl_rise_s(1) = '1' then + -- rising edge indicator acts as clock enable instead of clock + if hx_i = '1' then + -- toggle FF + hx_ctrl_s <= not hx_ctrl_q; + + if (not hx_ctrl_q) = '0' then + -- detct rising edge of inverted ouput + hx_ctrl_n_rise_s <= '1'; + end if; + end if; + end if; + + -- the mysterious B1 flip-flop -------------------------------------------- + if hx_ctrl_q = '1' then + -- pseudo-asynchronous clear + b1_ff_s <= '0'; + + if (not b1_ff_q) = '0' then + -- detct rising edge of inverted ouput + b1_ff_n_rise_s <= '1'; + end if; + elsif h_ctrl_n_rise_s(3) = '1' then + -- rising edge indicator acts as clock enable instead of clock + b1_ff_s <= '1'; + end if; + + -- the CGS rising edge indicator support flip-flop ------------------------ + cgs_s <= not cs13_n_i; + cgs_rise_s <= not cgs_q and not cs13_n_i; + + end process ctrl_comp; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process ram_addr + -- + -- Purpose: + -- Multiplexes the CPU address bus and the h+v timing control signals to + -- form the RAM address bus. + -- + ram_addr: process (h_flip_s, h_t_flip_s, + v_flip_s, v_t_flip_s, + a_i, + h_ctrl_s, h_ctrl_n_s, + hx_ctrl_q, + b1_ff_q) + variable a_v, b_v, g_n_v : std_logic; + variable vec_v : std_logic_vector(1 downto 0); + begin + -- default assignment + ram_addr_s <= (others => '0'); + + -- logic that drives A input of IC L4 and K4 + a_v := not (h_ctrl_n_s(1) and (b1_ff_q or hx_ctrl_q)); + -- logic that drives B input of IC L4 and K4 + b_v := hx_ctrl_q; + -- logic that drives /G input of IC J4 + g_n_v := hx_ctrl_q and (h_ctrl_n_s(1) and (b1_ff_q or hx_ctrl_q)); + + -- IC L4 and K4: Dual 4:1 Multiplexer ------------------------------------- + vec_v := b_v & a_v; + case vec_v is + when "00" => + ram_addr_s(0) <= h_flip_s (3); + ram_addr_s(1) <= h_t_flip_s(0); + -- + ram_addr_s(2) <= h_t_flip_s(1); + ram_addr_s(3) <= h_t_flip_s(2); + when "01" => + ram_addr_s(0) <= a_i (0); + ram_addr_s(1) <= a_i (1); + -- + ram_addr_s(2) <= a_i (2); + ram_addr_s(3) <= a_i (3); + when "10" => + ram_addr_s(0) <= v_t_flip_s(1); + ram_addr_s(1) <= v_t_flip_s(2); + -- + ram_addr_s(2) <= v_t_flip_s(3); + ram_addr_s(3) <= '0'; + when "11" => + ram_addr_s(0) <= a_i (0); + ram_addr_s(1) <= a_i (1); + -- + ram_addr_s(2) <= a_i (2); + ram_addr_s(3) <= a_i (3); + when others => + null; + end case; + + -- IC J4 and H4: Quad 2:1 Multiplexer ------------------------------------- + case a_v is + when '0' => + ram_addr_s(4) <= h_t_flip_s(3) and not g_n_v; + ram_addr_s(7) <= v_t_flip_s(1) and not g_n_v; + ram_addr_s(8) <= v_t_flip_s(2) and not g_n_v; + ram_addr_s(9) <= v_t_flip_s(3) and not g_n_v; + -- + ram_addr_s(5) <= v_flip_s (3); + ram_addr_s(6) <= v_t_flip_s(0); + when '1' => + ram_addr_s(4) <= a_i (4) and not g_n_v; + ram_addr_s(7) <= a_i (7) and not g_n_v; + ram_addr_s(8) <= a_i (8) and not g_n_v; + ram_addr_s(9) <= a_i (9) and not g_n_v; + -- + ram_addr_s(5) <= a_i (5); + ram_addr_s(6) <= a_i (6); + when others => + null; + end case; + + select_a_s <= a_v; + + end process ram_addr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process ram_ctrl + -- + -- Purpose: + -- Generate the control signals for the character and color RAMs. + -- This comprises: + -- * reading RAMs while the beam sweeps the screen + -- * reading RAMs to the CPU + -- * writing RAMs from the CPU + -- + ram_ctrl: process (cs13_n_i, + wait_q, + select_a_s, + a_i, + wr_n_i, rd_n_i, + d_from_char_ram_s, d_from_col_ram_s, + clk_en_4mhz_i) + variable cpu_read_char_ram_v : boolean; + variable cpu_write_char_ram_v : boolean; + variable cpu_read_col_ram_v : boolean; + variable cpu_write_col_ram_v : boolean; + variable vec_v : std_logic_vector(2 downto 0); + begin + -- default assignments + char_ram_cs_n_s <= '1'; + char_ram_we_n_s <= '1'; + col_ram_cs_n_s <= '1'; + col_ram_we_n_s <= '1'; + d_from_char_o <= (others => '1'); + cpu_read_char_ram_v := false; + cpu_write_char_ram_v := false; + cpu_read_col_ram_v := false; + cpu_write_col_ram_v := false; + + -- detect and decode CPU access + if clk_en_4mhz_i = '1' and -- operate RAMs with CPU clock + (not cs13_n_i and select_a_s and not wait_q) = '1' then + vec_v := a_i(10) & rd_n_i & wr_n_i; + case vec_v is + when "001" => + cpu_read_char_ram_v := true; + when "010" => + cpu_write_char_ram_v := true; + when "101" => + cpu_read_col_ram_v := true; + when "110" => + cpu_write_col_ram_v := true; + when others => + null; + end case; + end if; + + -- now we are prepared to generate the /CS and /WE signals for the RAMs + if select_a_s = '0' or + cpu_read_char_ram_v or cpu_write_char_ram_v then + char_ram_cs_n_s <= '0'; + end if; + if select_a_s = '0' or + cpu_read_col_ram_v or cpu_write_col_ram_v then + col_ram_cs_n_s <= '0'; + end if; + if cpu_write_char_ram_v then + char_ram_we_n_s <= '0'; + end if; + if cpu_write_col_ram_v then + col_ram_we_n_s <= '0'; + end if; + + -- and we can multiplex the data bus towards the CPU + if cpu_read_char_ram_v then + d_from_char_o <= d_from_char_ram_s; + elsif cpu_read_col_ram_v then + d_from_char_o(3 downto 0) <= d_from_col_ram_s; + end if; + + end process ram_ctrl; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- The character RAM + ----------------------------------------------------------------------------- + char_ram_b : entity work.ladybug_char_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_4mhz_i, + a_i => ram_addr_s, + cs_n_i => char_ram_cs_n_s, + we_n_i => char_ram_we_n_s, + d_i => d_from_cpu_i, + d_o => d_from_char_ram_s + ); + ----------------------------------------------------------------------------- + -- The color RAM + ----------------------------------------------------------------------------- + col_ram_b : entity work.ladybug_char_col_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_4mhz_i, + a_i => ram_addr_s, + cs_n_i => col_ram_cs_n_s, + we_n_i => col_ram_we_n_s, + d_i => d_from_cpu_i(3 downto 0), + d_o => d_from_col_ram_s + ); + + + ----------------------------------------------------------------------------- + -- Process ram_d_seq + -- + -- Purpose: + -- Implements three latch banks that save the output of the character + -- and color RAMs. + -- + ram_d_seq: process (clk_20mhz_i, por_n_i) + variable complex_rising_edge_v : boolean; + begin + if por_n_i = '0' then + s_q <= (others => '0'); + d_char_ram_q <= (others => '0'); + d_col_ram_q <= (others => '0'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- latch data from the character RAM to form input for h_flip ----------- + if hx_ctrl_n_rise_s = '1' then + s_q <= d_from_char_ram_s; + end if; + + -- latch data from the character RAM for ROM address generation --------- + -- there are three sources for a rising edge: + -- 1) falling edge of h_ctrl_n_s(1) + -- => equivalen to rising edge of h_ctrl_s(1) + -- 2) rising edge of hx_ctrl_n_q + -- 3) rising edge of b1_ff_n + -- For each source, the two have to be in a defined state to let + -- the edge propage to the latches. + complex_rising_edge_v := ((h_ctrl_rise_s(1) and + (b1_ff_q or hx_ctrl_q)) or + (hx_ctrl_n_rise_s and + (not b1_ff_q and not h_ctrl_n_s(1))) or + (b1_ff_n_rise_s and + (not hx_ctrl_q and not h_ctrl_s(1)))) = '1'; + if complex_rising_edge_v then + d_char_ram_q <= d_from_char_ram_s; + d_col_ram_q <= d_from_col_ram_s; + end if; + + end if; + end process ram_d_seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process latch_rom_d + -- + -- Purpose: + -- Latch the output of the character ROM. + -- + latch_rom_d: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + d_char_rom_q <= (others => '0'); + crg3_q <= '0'; + crg4_q <= '0'; + crg5_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if (clk_en_5mhz_i and + h2_s and h1_s and h0_s) = '1' then + d_char_rom_q <= rom_char_d_i; + crg3_q <= d_col_ram_q(0); + crg4_q <= d_col_ram_q(1); + crg5_q <= d_col_ram_q(2); + end if; + + end if; + end process latch_rom_d; + -- + ----------------------------------------------------------------------------- + -- Process hbl_seq + -- + -- Purpose: + -- Implements the flip-flop that latches HBL. + -- + hbl_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + hbl_q <= '0'; + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if clk_en_5mhz_i = '1' then + if hcnt /= 255 then + hcnt <= hcnt + 1; + end if; + end if; + if ha_t_rise_i = '1' then + hbl_q <= hbl_i; + if hbl_q = '1' and hbl_i = '0' then + hcnt <= 0; + end if; + end if; + end if; + end process hbl_seq; + -- + ----------------------------------------------------------------------------- + + process (clk_20mhz_i) + begin + if rising_edge(clk_20mhz_i) then + if clk_en_5mhz_i = '1' then + hbl_d <= hbl_q; + + if hcnt < 240 then + hblank_o <= '0'; + else + hblank_o <= '1'; + end if; + + if hbl_d = '0' and hbl_q = '1' then + vblank_o <= not blank_flont_i; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Process crg_mux + -- + -- Purpose: + -- Multiplexes the latched character ROM data to CRG1 and CRG2. + -- + crg_mux: process (d_char_rom_q, + h_flip_s, + blank_flont_i, + hbl_q) + variable blank_v : std_logic; + variable idx_v : unsigned(2 downto 0); + begin + blank_v := not (blank_flont_i and not hbl_q); + idx_v := unsigned(h_flip_s(2 downto 0)); + + if blank_v = '0' then + crg1_s <= d_char_rom_q(to_integer('0' & idx_v)); + crg2_s <= d_char_rom_q(to_integer('1' & idx_v)); + else + crg1_s <= '0'; + crg2_s <= '0'; + end if; + + blank_o <= blank_v; + end process crg_mux; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + wait_n_o <= not wait_q; + crg_o(5) <= crg5_q; + crg_o(4) <= crg4_q; + crg_o(3) <= crg3_q; + crg_o(2) <= crg2_s; + crg_o(1) <= crg1_s; + rom_char_a_o( 2 downto 0) <= v_flip_s(2 downto 0); + rom_char_a_o(10 downto 3) <= d_char_ram_q; + rom_char_a_o(11) <= d_col_ram_q(3); + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_chute.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_chute.vhd new file mode 100644 index 00000000..b3255fe0 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_chute.vhd @@ -0,0 +1,130 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_chute.vhd,v 1.3 2005/10/10 21:21:20 arnim Exp $ +-- +-- Pulse shaper for a chute input. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_chute is + + port ( + clk_20mhz_i : in std_logic; + res_n_i : in std_logic; + chute_i : in std_logic; + chute_o : out std_logic + ); + +end ladybug_chute; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_chute is + + -- 2.35e-2 s = 1 / 20,000,000 Hz * 470000 + constant chute_delay_c : natural := 470000; + + signal chute_cnt_q : unsigned(18 downto 0); + + signal chute_sync_q : std_logic_vector(1 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process sync + -- + -- Purpose: + -- Synchronize the asynchronous chute input. + -- + sync: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + chute_sync_q <= (others => '0'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + chute_sync_q(0) <= chute_i; + chute_sync_q(1) <= chute_sync_q(0); + + end if; + end process sync; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process cnt + -- + -- Purpose: + -- Count the required number of 20 MHz clock cycles before emitting + -- chute event. This is a low pass filter for the rising edge of chute_i. + -- + cnt: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + chute_cnt_q <= (others => '0'); + chute_o <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if chute_sync_q(1) = '1' then + if chute_cnt_q = chute_delay_c then + chute_o <= '1'; + else + chute_cnt_q <= chute_cnt_q + 1; + end if; + + else + -- reset counter when chute input goes back to 0 + chute_cnt_q <= (others => '0'); + chute_o <= '0'; + + end if; + + end if; + end process cnt; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_chutes.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_chutes.vhd new file mode 100644 index 00000000..7584de89 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_chutes.vhd @@ -0,0 +1,134 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_chutes.vhd,v 1.4 2005/10/10 21:21:20 arnim Exp $ +-- +-- Pulse shaping for the two chute inputs. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_chutes is + + port ( + clk_20mhz_i : in std_logic; + res_n_i : in std_logic; + right_chute_i : in std_logic; + left_chute_i : in std_logic; + cs8_n_i : in std_logic; + nmi_n_o : out std_logic; + int_n_o : out std_logic + ); + +end ladybug_chutes; + +architecture rtl of ladybug_chutes is + + signal right_chute_s, + left_chute_s : std_logic; + signal left_chute_q : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Pulse shaper for Right Chute + ----------------------------------------------------------------------------- + right_chute_b : entity work.ladybug_chute + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + chute_i => right_chute_i, + chute_o => right_chute_s + ); + + + ----------------------------------------------------------------------------- + -- Pulse shaper for Left Chute + ----------------------------------------------------------------------------- + left_chute_b : entity work.ladybug_chute + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + chute_i => left_chute_i, + chute_o => left_chute_s + ); + + + ----------------------------------------------------------------------------- + -- Process left_edge + -- + -- Purpose: + -- Implement the edge detector for the left chute. + -- Only a rising edge of the filtered chute input can trigger a new + -- interrupt to the CPU. + -- + left_edge: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + left_chute_q <= '0'; + int_n_o <= '1'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + left_chute_q <= left_chute_s; + + if cs8_n_i = '0' then + -- synchronous set, has priority over data path + int_n_o <= '1'; + + -- edge detector + elsif left_chute_s = '1' and left_chute_q = '0' then + int_n_o <= '0'; + + end if; + + end if; + end process left_edge; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + nmi_n_o <= not right_chute_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_clk.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_clk.vhd new file mode 100644 index 00000000..d3e00484 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_clk.vhd @@ -0,0 +1,158 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_clk.vhd,v 1.5 2005/10/28 21:17:41 arnim Exp $ +-- +-- Clock generator for the Lady Bug machine. +-- +-- This module generates the clock enables which are required to mimic the +-- different clocks of the Lady Bug boards. +-- +-- Theory of Operation: +-- A PLL is used to tune the external clock to 20 MHz. This forms the +-- main clock which is used by all sequential elements. +-- All derived clocks are built with clock enables to allow a synchronous +-- design style (sort of). +-- +-- Note: +-- The counters and enable signals are reset by the power-on reset. +-- Thus, the "derived clocks" run during normal system reset. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_clk is + + port ( + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + clk_en_10mhz_o : out std_logic; + clk_en_10mhz_n_o : out std_logic; + clk_en_5mhz_o : out std_logic; + clk_en_5mhz_n_o : out std_logic; + clk_en_4mhz_o : out std_logic + ); + +end ladybug_clk; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_clk is + + -- counter for 5 MHz and 10 MHz clock enables + signal clk_cnt_5mhz_q : unsigned(1 downto 0); + -- counter for 4 MHz clock enable + signal clk_cnt_4mhz_q : unsigned(2 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process clk_en + -- + -- Purpose: + -- Generates the clock enables for 10 MHz, 5 MHz, 4 MHz. + -- + clk_en: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + clk_cnt_5mhz_q <= (others => '0'); + clk_cnt_4mhz_q <= (others => '0'); + clk_en_10mhz_o <= '0'; + clk_en_10mhz_n_o <= '0'; + clk_en_5mhz_o <= '0'; + clk_en_5mhz_n_o <= '0'; + clk_en_4mhz_o <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + + ------------------------------------------------------------------------- + -- 10 MHz / 5 MHz clock domain + -- + -- counter for 10 MHz and 5 MHz clock enables + clk_cnt_5mhz_q <= clk_cnt_5mhz_q + 1; + + -- generate clock enable for 10 MHz + -- enable on every second clock of clk_20mhz_i + clk_en_10mhz_o <= clk_cnt_5mhz_q(0); + -- enable with 180 deg phase shift + clk_en_10mhz_n_o <= not clk_cnt_5mhz_q(0); + + -- generate clock enables for 5 MHz: + -- enable on every forth clock of clk_20mhz_i + if clk_cnt_5mhz_q = "11" then + clk_en_5mhz_o <= '1'; + else + clk_en_5mhz_o <= '0'; + end if; + -- enable with 180 deg phase shift + if clk_cnt_5mhz_q = "01" then + clk_en_5mhz_n_o <= '1'; + else + clk_en_5mhz_n_o <= '0'; + end if; + -- + ------------------------------------------------------------------------- + + + ------------------------------------------------------------------------- + -- 4 MHz domain + -- + -- counter for 4 MHz clock enable, wrap around after 5 clocks + clk_en_4mhz_o <= clk_cnt_4mhz_q(2); + + if clk_cnt_4mhz_q = "100" then + clk_cnt_4mhz_q <= (others => '0'); + else + clk_cnt_4mhz_q <= clk_cnt_4mhz_q + 1; + end if; + -- + ------------------------------------------------------------------------- + + end if; + end process clk_en; + -- + ----------------------------------------------------------------------------- + + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_counter.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_counter.vhd new file mode 100644 index 00000000..d07256bb --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_counter.vhd @@ -0,0 +1,95 @@ +------------------------------------------------------------------------------- +-- +-- Synchronous 8-Bit Binary Counter with preset. +-- +-- $Id: ladybug_counter.vhd,v 1.9 2005/10/10 21:59:13 arnim Exp $ +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity counter is +port ( + ck_i : in std_logic; + ck_en_i : in std_logic; + reset_n_i : in std_logic; + load_i : in std_logic; + preset_i : in std_logic_vector(7 downto 0); + q_o : out std_logic_vector(7 downto 0); + rise_q_o : out std_logic_vector(7 downto 0); + d_o : out std_logic_vector(7 downto 0); + co_o : out std_logic +); +end counter; + +architecture rtl of counter is + signal cnt_q : std_logic_vector(7 downto 0); + signal cnt_s : std_logic_vector(7 downto 0); +begin + + seq: process (ck_i, reset_n_i) + begin + if reset_n_i = '0' then + cnt_q <= (others => '0'); + elsif rising_edge(ck_i) then + cnt_q <= cnt_s; + end if; + end process seq; + + adder: process (ck_en_i, cnt_q, load_i, preset_i) + begin + cnt_s <= cnt_q; + + if ck_en_i = '1' then + if load_i = '1' then + cnt_s <= preset_i; + else + cnt_s <= cnt_q + 1; + end if; + end if; + end process adder; + + co_o <= '1' when cnt_q = x"FF" else '0'; + rise_q_o <= cnt_s and not cnt_q; + q_o <= cnt_q; + d_o <= cnt_s; +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_cpu_unit.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_cpu_unit.vhd new file mode 100644 index 00000000..7d41074f --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_cpu_unit.vhd @@ -0,0 +1,260 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_cpu_unit.vhd,v 1.19 2005/12/10 14:51:51 arnim Exp $ +-- +-- CPU Main Unit of the Lady Bug Machine. +-- +-- Actually, the PCB where the CPU resides on contains also the sound chips and +-- parts of the video controller. For the sake of simplicity, the CPU and chip +-- select logic has been moved into this separate unit. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_cpu_unit is + port ( + clk_20mhz_i : in std_logic; + clk_en_4mhz_i : in std_logic; + res_n_i : in std_logic; + rom_cpu_a_o : out std_logic_vector(14 downto 0); + rom_cpu_d_i : in std_logic_vector( 7 downto 0); + sound_wait_n_i : in std_logic; + wait_n_i : in std_logic; + right_chute_i : in std_logic; + left_chute_i : in std_logic; + gpio_in0_i : in std_logic_vector( 7 downto 0); + gpio_in1_i : in std_logic_vector( 7 downto 0); + gpio_in2_i : in std_logic_vector( 7 downto 0); + gpio_in3_i : in std_logic_vector( 7 downto 0); + gpio_extra_i : in std_logic_vector( 7 downto 0); + a_o : out std_logic_vector(10 downto 0); + d_to_cpu_i : in std_logic_vector( 7 downto 0); + d_from_cpu_o : out std_logic_vector( 7 downto 0); + rd_n_o : out std_logic; + wr_n_o : out std_logic; + cs7_n_o : out std_logic; + cs10_n_o : out std_logic; + cs11_n_o : out std_logic; + cs12_n_o : out std_logic; + cs13_n_o : out std_logic + ); + +end ladybug_cpu_unit; + +architecture struct of ladybug_cpu_unit is + + signal t80_clk_en_s : std_logic; + + signal wait_n_s : std_logic; + signal int_n_s : std_logic; + signal nmi_n_s : std_logic; + signal mreq_n_s : std_logic; + signal rd_n_s : std_logic; + signal wr_n_s : std_logic; + signal rfsh_n_s : std_logic; + signal m1_n_s : std_logic; + signal a_s : std_logic_vector(15 downto 0); + signal d_to_cpu_s : std_logic_vector( 7 downto 0); + signal d_from_cpu_s : std_logic_vector( 7 downto 0); + signal d_from_rom_s, + d_decrypted_s, + d_rom_mux_s : std_logic_vector( 7 downto 0); + signal d_from_ram_s : std_logic_vector( 7 downto 0); + signal d_from_gpio_s : std_logic_vector( 7 downto 0); + + signal cs_n_s : std_logic_vector(15 downto 0); + + signal ram_cpu_cs_n_s : std_logic; + + signal vcc_s : std_logic; + +begin + vcc_s <= '1'; + + wait_n_s <= sound_wait_n_i and wait_n_i; + + ----------------------------------------------------------------------------- + -- The T80 CPU + ----------------------------------------------------------------------------- + -- "wait" has to be modelled with the clock enable because the T80 is not + -- able to enlarge write accesses properly when they are delayed with "wait" + t80_clk_en_s <= clk_en_4mhz_i and wait_n_s; + T80a_b : entity work.T80a + generic map ( + Mode => 0 + ) + port map ( + RESET_n => res_n_i, + CLK_n => clk_20mhz_i, + CLK_EN_SYS => t80_clk_en_s, + WAIT_n => wait_n_s, + INT_n => int_n_s, + NMI_n => nmi_n_s, + BUSRQ_n => vcc_s, + M1_n => m1_n_s, + MREQ_n => mreq_n_s, + IORQ_n => open, + RD_n => rd_n_s, + WR_n => wr_n_s, + RFSH_n => rfsh_n_s, + HALT_n => open, + BUSAK_n => open, + A => a_s, + DI => d_to_cpu_s, + DO => d_from_cpu_s + ); + d_from_cpu_o <= d_from_cpu_s; + + + ----------------------------------------------------------------------------- + -- The CPU RAM + ----------------------------------------------------------------------------- + cpu_ram_b : entity work.ladybug_cpu_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_4mhz_i, + a_i => a_s(11 downto 0), + cs_n_i => cs_n_s(6), + we_n_i => wr_n_s, + d_i => d_from_cpu_s, + d_o => d_from_ram_s + ); + + ----------------------------------------------------------------------------- + -- The Address Decoder + ----------------------------------------------------------------------------- + addr_dec_b : entity work.ladybug_addr_dec + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + a_i => a_s(15 downto 12), + rd_n_i => rd_n_s, + wr_n_i => wr_n_s, + mreq_n_i => mreq_n_s, + rfsh_n_i => rfsh_n_s, + cs_n_o => cs_n_s, + ram_cpu_cs_n_o => ram_cpu_cs_n_s + ); + + + ----------------------------------------------------------------------------- + -- The General Purpose IO + ----------------------------------------------------------------------------- + gpio_b : entity work.ladybug_gpio + port map ( + a_i => a_s(1 downto 0), + cs_in_n_i => cs_n_s(9), + cs_extra_n_i => cs_n_s(14), + in0_i => gpio_in0_i, + in1_i => gpio_in1_i, + in2_i => gpio_in2_i, + in3_i => gpio_in3_i, + extra_i => gpio_extra_i, + d_o => d_from_gpio_s + ); + + + ----------------------------------------------------------------------------- + -- The Coin Chutes + ----------------------------------------------------------------------------- + coin_chutes_b : entity work.ladybug_chutes + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + right_chute_i => right_chute_i, + left_chute_i => left_chute_i, + cs8_n_i => cs_n_s(8), + nmi_n_o => nmi_n_s, + int_n_o => int_n_s + ); + + + ----------------------------------------------------------------------------- + -- Decrytion PROMs + ----------------------------------------------------------------------------- + + decrypt_prom : entity work.prom_decrypt + port map ( + CLK => clk_20mhz_i, + ADDR => rom_cpu_d_i, + DATA => d_decrypted_s + ); + + ----------------------------------------------------------------------------- + -- Only opcodes (i.e. instruction fetches) have to be decrypted + ----------------------------------------------------------------------------- + d_rom_mux_s <= d_decrypted_s when m1_n_s = '0' else rom_cpu_d_i; + + ----------------------------------------------------------------------------- + -- Gate Data Bus from ROM + -- The ROM puts data on the data bus within the CPU Main Unit so we do + -- gating here. + ----------------------------------------------------------------------------- + d_from_rom_s <= d_rom_mux_s + when cs_n_s(0) = '0' or cs_n_s(1) = '0' or cs_n_s(2) = '0' or + cs_n_s(3) = '0' or cs_n_s(4) = '0' or cs_n_s(5) = '0' else + (others => '1'); + + + ----------------------------------------------------------------------------- + -- Combine Data Buses + -- Uses an AND of all incoming buses from submodules. Each module has to + -- drive ones when not active so we can save logic complexity here. + ----------------------------------------------------------------------------- + d_to_cpu_s <= d_to_cpu_i and d_from_rom_s and d_from_ram_s and d_from_gpio_s; + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + a_o <= a_s(10 downto 0); + rom_cpu_a_o <= a_s(14 downto 0); + rd_n_o <= rd_n_s; + wr_n_o <= wr_n_s; + cs7_n_o <= cs_n_s(7); + cs10_n_o <= cs_n_s(10); + cs11_n_o <= cs_n_s(11); + cs12_n_o <= cs_n_s(12); + cs13_n_o <= cs_n_s(13); + +end struct; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_dip_pack.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_dip_pack.vhd new file mode 100644 index 00000000..ebff8ec4 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_dip_pack.vhd @@ -0,0 +1,142 @@ +------------------------------------------------------------------------------- +-- +-- $Id: ladybug_dip_pack-p.vhd,v 1.4 2005/10/10 20:52:04 arnim Exp $ +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +package ladybug_dip_pack is + + ----------------------------------------------------------------------------- + -- DIP switch settings for Lady Bug + ----------------------------------------------------------------------------- + constant lb_dip_block_1_c : std_logic_vector(7 downto 0) := + -- Lives ------------------------------------------------------------------ + -- 0 = 5 Lives + -- 1 = 3 Lives + '0' & + -- Free Play -------------------------------------------------------------- + -- 0 = Free Play + -- 1 = No Free Play + '1' & + -- Cabinet ---------------------------------------------------------------- + -- 0 = Upright + -- 1 = Cocktail + '0' & + -- Screen Freeze ---------------------------------------------------------- + -- 0 = Freeze + -- 1 = No Freeze + '1' & + -- Rack Test (Cheat) ------------------------------------------------------ + -- 0 = On + -- 1 = Off + '1' & + -- High Score Initials ---------------------------------------------------- + -- 0 = 3-Letter Initials + -- 1 = 10-Letter Initials + '1' & + -- Difficulty ------------------------------------------------------------- + -- 11 = Easy + -- 10 = Medium + -- 01 = Hard + -- 00 = Hardest + "10"; + + ----------------------------------------------------------------------------- + -- DIP switch settings for Dorodon + ----------------------------------------------------------------------------- + constant do_dip_block_1_c : std_logic_vector(7 downto 0) := + -- Lives ------------------------------------------------------------------ + -- 0 = 5 Lives + -- 1 = 3 Lives + '0' & + -- Free Play -------------------------------------------------------------- + -- 0 = Free Play + -- 1 = No Free Play + '1' & + -- Cabinet ---------------------------------------------------------------- + -- 0 = Upright + -- 1 = Cocktail + '0' & + -- Screen Freeze ---------------------------------------------------------- + -- 0 = Freeze + -- 1 = No Freeze + '1' & + -- Rack Test (Cheat) ------------------------------------------------------ + -- 0 = On + -- 1 = Off + '1' & + -- Bonus Life ------------------------------------------------------------- + -- 0 = 40000 + -- 1 = 20000 + '1' & + -- Difficulty ------------------------------------------------------------- + -- 11 = Easy + -- 10 = Medium + -- 01 = Hard + -- 00 = Hardest + "10"; + + + ----------------------------------------------------------------------------- + -- DIP switch settings for Cosmic Avenger + ----------------------------------------------------------------------------- + constant ca_dip_block_1_c : std_logic_vector(7 downto 0) := + -- Lives per Game --------------------------------------------------------- + -- 00 = 2 Lives + -- 11 = 3 Lives + -- 10 = 4 Lives + -- 01 = 5 Lives + "01" & + -- Initial High Score ----------------------------------------------------- + -- 00 = 0 + -- 11 = 5000 + -- 10 = 8000 + -- 01 = 10000 + "11" & + -- Cabinet ---------------------------------------------------------------- + -- 0 = Upright + -- 1 = Cocktail + '0' & + -- High Score Names ------------------------------------------------------- + -- 0 = 3 Letters + -- 1 = 10 Letters + '1' & + -- Difficulty ------------------------------------------------------------- + -- 11 = Easy + -- 10 = Medium + -- 01 = Hard + -- 00 = Hardest + "10"; + + constant price_dip_block_2_c : std_logic_vector(7 downto 0) := + -- Pricing Options -------------------------------------------------------- + -- 1111 = 1 coin 1 credit + -- 1110 = 1 coin 2 credits + -- 1101 = 1 coin 3 credits + -- 1100 = 1 coin 4 credits + -- 1011 = 1 coin 5 credits + -- 1010 = 2 coins 1 credit + -- 1001 = 2 coins 3 credits + -- 1000 = 3 coins 1 credit + -- 0111 = 3 coins 2 credit + -- 0110 = 4 coins 1 credit + -- 0101 = 1 coin 1 credit + -- 0100 = 1 coin 1 credit + -- 0011 = 1 coin 1 credit + -- 0010 = 1 coin 1 credit + -- 0001 = 1 coin 1 credit + -- 0000 = 1 coin 1 credit + -- + -- Left Chute + "1111" & + -- Right Chute + "1111"; + +end ladybug_dip_pack; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_gpio.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_gpio.vhd new file mode 100644 index 00000000..6ca21711 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_gpio.vhd @@ -0,0 +1,139 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_gpio.vhd,v 1.3 2005/10/10 21:21:20 arnim Exp $ +-- +-- General purpose IO input for CPU Main Unit. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_gpio is + + port ( + a_i : in std_logic_vector(1 downto 0); + cs_in_n_i : in std_logic; + cs_extra_n_i : in std_logic; + in0_i : in std_logic_vector(7 downto 0); + in1_i : in std_logic_vector(7 downto 0); + in2_i : in std_logic_vector(7 downto 0); + in3_i : in std_logic_vector(7 downto 0); + extra_i : in std_logic_vector(7 downto 0); + d_o : out std_logic_vector(7 downto 0) + ); + +end ladybug_gpio; + + +architecture rtl of ladybug_gpio is + +begin + + ----------------------------------------------------------------------------- + -- Process gpio + -- + -- Purpose: + -- Multiplex the IN and EXTRA inputs onto the data bus for CPU. + -- + gpio: process (a_i, + cs_in_n_i, + cs_extra_n_i, + in0_i, + in1_i, + in2_i, + in3_i, + extra_i) + variable cs_n_v : std_logic_vector(1 downto 0); + begin + -- default assignment with inactive bus value + d_o <= (others => '1'); + + cs_n_v := cs_extra_n_i & cs_in_n_i; + case cs_n_v is + -- IN ports and DIP switches selected ----------------------------------- + when "10" => + case a_i is + -- IN 0 addressed + when "00" => + d_o <= in0_i; + -- IN 1 addressed + when "01" => + d_o <= in1_i; + -- DIP 0 addressed + when "10" => + d_o <= in2_i; + -- DIP 1 addressed + when "11" => + d_o <= in3_i; + + when others => + null; + end case; + + -- Extra bank selected -------------------------------------------------- + when "01" => + case a_i is + when "00" => + d_o(1) <= extra_i(7); + d_o(0) <= extra_i(3); + when "01" => + d_o(1) <= extra_i(6); + d_o(0) <= extra_i(2); + when "10" => + d_o(1) <= extra_i(5); + d_o(0) <= extra_i(1); + when "11" => + d_o(1) <= extra_i(4); + d_o(0) <= extra_i(0); + when others => + null; + end case; + + when others => + null; + end case; + + end process gpio; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_machine.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_machine.vhd new file mode 100644 index 00000000..584b8391 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_machine.vhd @@ -0,0 +1,295 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_machine.vhd,v 1.23 2006/02/07 00:44:21 arnim Exp $ +-- +-- Toplevel of the Lady Bug machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ladybug_machine is + port ( + -- Clock and Reset Interface ---------------------------------------------- + ext_res_n_i : in std_logic; + clk_20mhz_i : in std_logic; + clk_en_10mhz_o : out std_logic; + clk_en_5mhz_o : out std_logic; + por_n_o : out std_logic; + -- Control Interface ------------------------------------------------------ + tilt_n_i : in std_logic; + player_select_n_i : in std_logic_vector( 1 downto 0); + player_fire_n_i : in std_logic_vector( 1 downto 0); + player_up_n_i : in std_logic_vector( 1 downto 0); + player_right_n_i : in std_logic_vector( 1 downto 0); + player_down_n_i : in std_logic_vector( 1 downto 0); + player_left_n_i : in std_logic_vector( 1 downto 0); + player_bomb_n_i : in std_logic_vector( 1 downto 0); + right_chute_i : in std_logic; + left_chute_i : in std_logic; + -- DIP Switch Interface --------------------------------------------------- + dip_block_1_i : in std_logic_vector( 7 downto 0); + dip_block_2_i : in std_logic_vector( 7 downto 0); + -- RGB Video Interface ---------------------------------------------------- + rgb_r_o : out std_logic_vector( 1 downto 0); + rgb_g_o : out std_logic_vector( 1 downto 0); + rgb_b_o : out std_logic_vector( 1 downto 0); + hsync_n_o : out std_logic; + vsync_n_o : out std_logic; + comp_sync_n_o : out std_logic; + vblank_o : out std_logic; + hblank_o : out std_logic; + -- Audio Interface -------------------------------------------------------- + audio_o : out signed( 7 downto 0); + -- CPU ROM Interface ------------------------------------------------------ + rom_cpu_a_o : out std_logic_vector(14 downto 0); + rom_cpu_d_i : in std_logic_vector( 7 downto 0); + -- Character ROM Interface ------------------------------------------------ + rom_char_a_o : out std_logic_vector(11 downto 0); + rom_char_d_i : in std_logic_vector(15 downto 0); + -- Sprite ROM Interface --------------------------------------------------- + rom_sprite_a_o : out std_logic_vector(11 downto 0); + rom_sprite_d_i : in std_logic_vector(15 downto 0) + ); + + +end ladybug_machine; + +architecture struct of ladybug_machine is + + -- Clock System ------------------------------------------------------------- + signal clk_en_10mhz_s, + clk_en_10mhz_n_s : std_logic; + signal clk_en_5mhz_s, + clk_en_5mhz_n_s : std_logic; + signal clk_en_4mhz_s : std_logic; + + -- Reset System ------------------------------------------------------------- + signal por_n_s : std_logic; + signal res_n_s : std_logic; + + signal sound_wait_n_s : std_logic; + signal wait_n_s : std_logic; + signal a_s : std_logic_vector(10 downto 0); + signal d_to_cpu_s, + d_from_cpu_s, + d_from_video_s : std_logic_vector( 7 downto 0); + signal rd_n_s, + wr_n_s : std_logic; + signal cs7_n_s, + cs10_n_s, + cs11_n_s, + cs12_n_s, + cs13_n_s : std_logic; + signal vc_s, + vbl_tick_n_s, + vbl_buf_s : std_logic; + + signal gpio_in0_s, + gpio_in1_s, + gpio_in2_s, + gpio_in3_s, + gpio_extra_s : std_logic_vector( 7 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Clock Generator + ----------------------------------------------------------------------------- + clk_b : entity work.ladybug_clk + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_s, + clk_en_10mhz_o => clk_en_10mhz_s, + clk_en_10mhz_n_o => clk_en_10mhz_n_s, + clk_en_5mhz_o => clk_en_5mhz_s, + clk_en_5mhz_n_o => clk_en_5mhz_n_s, + clk_en_4mhz_o => clk_en_4mhz_s + ); + -- + clk_en_5mhz_o <= clk_en_5mhz_s; + clk_en_10mhz_o <= clk_en_10mhz_s; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Reset Generator + ----------------------------------------------------------------------------- + res_b : entity work.ladybug_res + port map ( + clk_20mhz_i => clk_20mhz_i, + ext_res_n_i => ext_res_n_i, + res_n_o => res_n_s, + por_n_o => por_n_s + ); + -- + por_n_o <= por_n_s; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Joystick and DIP Switch Mapping + ----------------------------------------------------------------------------- + gpio_in0_s <= tilt_n_i & + player_select_n_i(1) & + player_select_n_i(0) & + player_fire_n_i(0) & + player_up_n_i(0) & + player_right_n_i(0) & + player_down_n_i(0) & + player_left_n_i(0); + gpio_in1_s <= vbl_buf_s & + vbl_tick_n_s & + vc_s & + player_fire_n_i(1) & + player_up_n_i(1) & + player_right_n_i(1) & + player_down_n_i(1) & + player_left_n_i(1); + gpio_in2_s <= dip_block_1_i; + gpio_in3_s <= dip_block_2_i; + gpio_extra_s <= player_bomb_n_i(1) & + '1' & + '1' & + '1' & + player_bomb_n_i(0) & + '1' & + '1' & + '1'; + + + ----------------------------------------------------------------------------- + -- CPU Unit + ----------------------------------------------------------------------------- + cpu_b : entity work.ladybug_cpu_unit + port map ( + clk_20mhz_i => clk_20mhz_i, + clk_en_4mhz_i => clk_en_4mhz_s, + res_n_i => res_n_s, + rom_cpu_a_o => rom_cpu_a_o, + rom_cpu_d_i => rom_cpu_d_i, + + sound_wait_n_i => sound_wait_n_s, + wait_n_i => wait_n_s, + right_chute_i => right_chute_i, + left_chute_i => left_chute_i, + gpio_in0_i => gpio_in0_s, + gpio_in1_i => gpio_in1_s, + gpio_in2_i => gpio_in2_s, + gpio_in3_i => gpio_in3_s, + gpio_extra_i => gpio_extra_s, + a_o => a_s, + d_to_cpu_i => d_to_cpu_s, + d_from_cpu_o => d_from_cpu_s, + rd_n_o => rd_n_s, + wr_n_o => wr_n_s, + cs7_n_o => cs7_n_s, + cs10_n_o => cs10_n_s, + cs11_n_o => cs11_n_s, + cs12_n_o => cs12_n_s, + cs13_n_o => cs13_n_s + ); + + ----------------------------------------------------------------------------- + -- Bus Multiplexer + ----------------------------------------------------------------------------- + d_to_cpu_s <= d_from_video_s when (cs7_n_s and cs13_n_s) = '0' else (others => '1'); + + ----------------------------------------------------------------------------- + -- Video Unit + ----------------------------------------------------------------------------- + video_b : entity work.ladybug_video_unit + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_s, + res_n_i => res_n_s, + clk_en_10mhz_i => clk_en_10mhz_s, + clk_en_10mhz_n_i => clk_en_10mhz_n_s, + clk_en_5mhz_i => clk_en_5mhz_s, + clk_en_5mhz_n_i => clk_en_5mhz_n_s, + clk_en_4mhz_i => clk_en_4mhz_s, + cs7_n_i => cs7_n_s, + cs10_n_i => cs10_n_s, + cs13_n_i => cs13_n_s, + a_i => a_s, + rd_n_i => rd_n_s, + wr_n_i => wr_n_s, + wait_n_o => wait_n_s, + d_from_cpu_i => d_from_cpu_s, + d_from_video_o => d_from_video_s, + vc_o => vc_s, + vbl_tick_n_o => vbl_tick_n_s, + vbl_buf_o => vbl_buf_s, + rgb_r_o => rgb_r_o, + rgb_g_o => rgb_g_o, + rgb_b_o => rgb_b_o, + hsync_n_o => hsync_n_o, + vsync_n_o => vsync_n_o, + comp_sync_n_o => comp_sync_n_o, + vblank_o => vblank_o, + hblank_o => hblank_o, + rom_char_a_o => rom_char_a_o, + rom_char_d_i => rom_char_d_i, + rom_sprite_a_o => rom_sprite_a_o, + rom_sprite_d_i => rom_sprite_d_i + ); + + ----------------------------------------------------------------------------- + -- Sound Unit + ----------------------------------------------------------------------------- + sound_b : entity work.ladybug_sound_unit + port map ( + clk_20mhz_i => clk_20mhz_i, + clk_en_4mhz_i => clk_en_4mhz_s, + por_n_i => por_n_s, + cs11_n_i => cs11_n_s, + cs12_n_i => cs12_n_s, + wr_n_i => wr_n_s, + d_from_cpu_i => d_from_cpu_s, + sound_wait_n_o => sound_wait_n_s, + audio_o => audio_o + ); + +end struct; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_rams.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_rams.vhd new file mode 100644 index 00000000..578d08e7 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_rams.vhd @@ -0,0 +1,340 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_char_ram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video character RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 8 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_char_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 7 downto 0); + d_o : out std_logic_vector( 7 downto 0) + ); + +end ladybug_char_ram; + +architecture struct of ladybug_char_ram is + + signal d_s : std_logic_vector(7 downto 0); + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,8) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_s + ); + + -- gate the data output for and'ing on CPU bus + d_o <= d_s when cs_n_i = '0' else (others => '1'); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite_ram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video sprite RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 8 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_sprite_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 7 downto 0); + d_o : out std_logic_vector( 7 downto 0) + ); + +end ladybug_sprite_ram; + +architecture struct of ladybug_sprite_ram is + + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,8) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_o + ); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_char_col_ram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video character color RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 4 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_char_col_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 3 downto 0); + d_o : out std_logic_vector( 3 downto 0) + ); + +end ladybug_char_col_ram; + +architecture struct of ladybug_char_col_ram is + + signal d_s : std_logic_vector(3 downto 0); + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,4) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_s + ); + + -- gate the data output for and'ing on CPU bus + d_o <= d_s when cs_n_i = '0' else (others => '1'); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite_vram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video sprite VRAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 4 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_sprite_vram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 3 downto 0); + d_o : out std_logic_vector( 3 downto 0) + ); + +end ladybug_sprite_vram; + +architecture struct of ladybug_sprite_vram is + + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,4) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_o + ); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_cpu_ram.vhd,v 1.1 2005/11/06 15:43:38 arnim Exp $ +-- +-- Wrapper for technology dependent CPU RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 4 K x 8 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_cpu_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(11 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 7 downto 0); + d_o : out std_logic_vector( 7 downto 0) + ); + +end ladybug_cpu_ram; + +architecture struct of ladybug_cpu_ram is + + signal d_s : std_logic_vector(7 downto 0); + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram1_inst: work.spram generic map(12,8) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_s + ); + + -- gate the data output for and'ing on CPU bus + d_o <= d_s when cs_n_i = '0' else (others => '1'); + +end struct; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_res.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_res.vhd new file mode 100644 index 00000000..85998a10 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_res.vhd @@ -0,0 +1,148 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_res.vhd,v 1.8 2005/10/10 20:52:04 arnim Exp $ +-- +-- Reset generator for the Lady Bug machine. +-- +-- This module generates a reset signal for the whole system synchronous to +-- the main clock. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +library ieee; +use ieee.numeric_std.all; + +entity ladybug_res is + + port ( + clk_20mhz_i : in std_logic; + ext_res_n_i : in std_logic; + res_n_o : out std_logic; + por_n_o : out std_logic + ); + +end ladybug_res; + +architecture rtl of ladybug_res is + + -- 4.7e-2 s = 1 / 20,000,000 Hz * 940000 + constant res_delay_c : natural := 940000; + + signal res_sync_n_q : std_logic_vector(1 downto 0); + + signal res_delay_q : unsigned(19 downto 0); + signal res_n_q : std_logic; + + signal por_cnt_q : unsigned(1 downto 0) := "00"; + signal por_n_q : std_logic := '0'; +begin + + por_n_o <= por_n_q; + res_n_o <= res_n_q; + + ----------------------------------------------------------------------------- + -- Process por_cnt + -- + -- Purpose: + -- Generate a power-on reset for 4 clock cycles. + -- + por_cnt: process (clk_20mhz_i) + begin + if clk_20mhz_i'event and clk_20mhz_i = '1' then + if por_cnt_q = "11" then + por_n_q <= '1'; + else + por_cnt_q <= por_cnt_q + 1; + end if; + end if; + end process por_cnt; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process res_sync + -- + -- Purpose: + -- Synchronize asynchronous external reset to main 20 MHz clock. + -- + res_sync: process (clk_20mhz_i, ext_res_n_i, por_n_q) + begin + if ext_res_n_i = '0' or por_n_q = '0' then + res_sync_n_q <= (others => '0'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + res_sync_n_q(0) <= '1'; + res_sync_n_q(1) <= res_sync_n_q(0); + end if; + end process res_sync; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process res_delay + -- + -- Purpose: + -- Delay reset event (external or power-on) by 4.7e-2 s. + -- Reset delay is taken from Lady Bug reset circuit using NE555. + -- This duration might be too long for the actual requirements of the + -- FPGA circuit. + -- + res_delay: process (clk_20mhz_i, res_sync_n_q) + begin + if res_sync_n_q(1) = '0' then + res_delay_q <= (others => '0'); + res_n_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if res_delay_q = res_delay_c then + res_n_q <= '1'; + else + res_delay_q <= res_delay_q + 1; + end if; + end if; + end process res_delay; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_rgb.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_rgb.vhd new file mode 100644 index 00000000..1bfcd53c --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_rgb.vhd @@ -0,0 +1,135 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_rgb.vhd,v 1.4 2005/10/10 22:02:14 arnim Exp $ +-- +-- RGB Generation Module of the Lady Bug Machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_rgb is + + port ( + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + crg_i : in std_logic_vector(5 downto 1); + sig_i : in std_logic_vector(4 downto 1); + rgb_r_o : out std_logic_vector(1 downto 0); + rgb_g_o : out std_logic_vector(1 downto 0); + rgb_b_o : out std_logic_vector(1 downto 0) + ); + +end ladybug_rgb; + +architecture rtl of ladybug_rgb is + + signal a_s : std_logic_vector(5 downto 1); + signal rgb_s : std_logic_vector(8 downto 1); + signal rgb_n_q : std_logic_vector(8 downto 1); + +begin + + ----------------------------------------------------------------------------- + -- Process addr + -- + -- Purpose: + -- Generates the PROM address. + -- + addr: process (crg_i, + sig_i) + variable sig_and_v : std_logic; + begin + sig_and_v := sig_i(1) and sig_i(2) and sig_i(3) and sig_i(4); + + a_s(5) <= crg_i(1) and sig_and_v; + + if not (sig_and_v and (crg_i(1) or crg_i(2))) = '0' then + a_s(4 downto 1) <= crg_i(2) & crg_i(5) & crg_i(4) & crg_i(3); + else + a_s(4 downto 1) <= sig_i; + end if; + + end process addr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- The RGB Conversion PROM + ----------------------------------------------------------------------------- + rgb_prom_b : entity work.prom_10_2 + port map ( + CLK => clk_20mhz_i, + ADDR => a_s, + DATA => rgb_s + ); + + ----------------------------------------------------------------------------- + -- Process rgb_latch + -- + -- Purpose: + -- Implements the output latch for the RGB values. + -- + rgb_latch: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + rgb_n_q <= (others => '1'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if clk_en_5mhz_i = '1' then + rgb_n_q <= not rgb_s; + end if; + end if; + end process rgb_latch; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + rgb_r_o <= rgb_n_q(5+1) & rgb_n_q(0+1); + rgb_g_o <= rgb_n_q(6+1) & rgb_n_q(2+1); + rgb_b_o <= rgb_n_q(7+1) & rgb_n_q(4+1); + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_sprite.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_sprite.vhd new file mode 100644 index 00000000..941d997c --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_sprite.vhd @@ -0,0 +1,857 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite.vhd,v 1.12 2005/10/10 22:02:14 arnim Exp $ +-- +-- Sprite Video Module of Lady Bug Machine. +-- +-- This unit contains the whole sprite logic which is distributed on the +-- CPU and video boards. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity ladybug_sprite is +port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + res_n_i : in std_logic; + clk_en_10mhz_i : in std_logic; + clk_en_10mhz_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_5mhz_n_i : in std_logic; + -- CPU Interface ---------------------------------------------------------- + cs7_n_i : in std_logic; + a_i : in std_logic_vector( 9 downto 0); + d_from_cpu_i : in std_logic_vector( 7 downto 0); + -- RGB Video Interface ---------------------------------------------------- + h_i : in std_logic_vector( 3 downto 0); + h_t_i : in std_logic_vector( 3 downto 0); + hx_i : in std_logic; + ha_d_i : in std_logic; + v_i : in std_logic_vector( 3 downto 0); + v_t_i : in std_logic_vector( 3 downto 0); + vbl_n_i : in std_logic; + vbl_d_n_i : in std_logic; + vc_d_i : in std_logic; + blank_flont_i : in std_logic; + blank_i : in std_logic; + sig_o : out std_logic_vector( 4 downto 1); + -- Sprite ROM Interface --------------------------------------------------- + rom_sprite_a_o : out std_logic_vector(11 downto 0); + rom_sprite_d_i : in std_logic_vector(15 downto 0) +); + +end ladybug_sprite; + +architecture rtl of ladybug_sprite is + + signal sprite_ram_cs_n_s, + sprite_ram_we_n_s, + clk_5mhz_n_q, + clk_en_eck_s, + clk_en_rd_s, + clk_en_5ck_n_s, + clk_en_6ck_n_s, + clk_en_7ck_n_s, + clk_en_b7_p3_s, + clk_en_e7_3_s, + s6ck_n_s, + s7ck_n_s, + e5_p8_s, + a8_p5_n_s, + ct0_s, + ct1_s, + cr_mux_sel_s, + ck_inh_s, + ck_inh_n_q, + qh1_s, + qh2_s : std_logic; + + signal rb_s, + rb_unflip_s, + rc_s : std_logic_vector( 7 downto 0); + + signal c_s : std_logic_vector(10 downto 0); + signal v_cnt_s : std_logic_vector( 4 downto 0); + signal ra_s : std_logic_vector( 9 downto 0); + + signal ma_s : std_logic_vector(11 downto 0); + signal ma_q : std_logic_vector(11 downto 6); + signal mb_q : std_logic_vector( 1 downto 0); + signal mc_q : std_logic_vector( 6 downto 0); + signal cl_q : std_logic_vector( 4 downto 0); + + signal j7_s : std_logic_vector( 2 downto 0); + signal df_muxed_s : std_logic_vector( 7 downto 0); + + signal lu_a_s : std_logic_vector( 4 downto 0); + signal lu_d_s : std_logic_vector( 7 downto 0); + signal lu_d_mux_s : std_logic_vector( 3 downto 0); + + signal rd_shift_s, + rd_shift_int, + rd_vram_s : std_logic_vector(15 downto 0); + signal rs_s, + rs_int, + rs_n_s : std_logic_vector( 3 downto 0); + signal rs_enable_s : std_logic; + signal shift_oc_n_s : std_logic; + + signal j6_shifter : std_logic_vector( 3 downto 0); + signal h6_shifter : std_logic_vector( 3 downto 0); + signal ctrl_lu_a_s : std_logic_vector( 4 downto 0); + signal ctrl_lu_d_s : std_logic_vector( 7 downto 0); + signal v_cnt_a5_a6_s : std_logic_vector( 7 downto 0); + + signal ctrl_lu_q_d_s, + ctrl_lu_q : std_logic_vector( 6 downto 1); + + signal vram_we_n_s : std_logic; + signal vram_a6_in_s, + vram_a6_out_s, + vram_b6_in_s, + vram_b6_out_s, + vram_c6_in_s, + vram_c6_out_s, + vram_d6_in_s, + vram_d6_out_s : std_logic_vector( 3 downto 0); + + signal ca_q : std_logic_vector( 3 downto 1); + signal ca6_s, + ca7_s, + ca8_s : std_logic; + signal x_s : std_logic_vector( 5 downto 0); + + signal cr_s : std_logic_vector( 9 downto 0); + + signal vram_q : std_logic_vector(15 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- The Vertical Counters C5 D5 + ----------------------------------------------------------------------------- + v_cnt_c5_c6_b : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + v_cnt_s <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if clk_en_b7_p3_s = '1' then + if e5_p8_s = '0' then + v_cnt_s <= (v_t_i & "0"); + else + v_cnt_s <= v_cnt_s + 1; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Counter J7 + ----------------------------------------------------------------------------- + j7_b : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + j7_s <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if clk_en_10mhz_i = '1' then + if s6ck_n_s = '0' then + j7_s <= not mc_q(6) & mc_q(6) & '0'; + elsif (ct0_s or ct1_s or a8_p5_n_s or ck_inh_s) = '0' then + j7_s <= j7_s + 1; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Sprite VRAM Counters A5 A6 + ----------------------------------------------------------------------------- + ct0_s <= v_cnt_a5_a6_s(0); + ct1_s <= v_cnt_a5_a6_s(1); + x_s <= v_cnt_a5_a6_s(7 downto 2); + + v_cnt_a5_a6_b : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + v_cnt_a5_a6_s <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if clk_en_10mhz_i = '1' then + if s7ck_n_s = '0' then + v_cnt_a5_a6_s(7 downto 4) <= (rb_s(7 downto 4)); + v_cnt_a5_a6_s(3 downto 0) <= (rb_s(3 downto 2) & not rc_s(7) & not rc_s(6)); + elsif ck_inh_n_q = '1' then + v_cnt_a5_a6_s <=v_cnt_a5_a6_s + 1; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Process sprite_ram_ctrl + -- + -- Purpose: + -- Generates the control signals for the sprite RAM. + -- + sprite_ram_ctrl: process ( cs7_n_i, + vbl_n_i, + a_i, + c_s, v_cnt_s) + variable cpu_access_v : std_logic; + begin + cpu_access_v := not cs7_n_i and not vbl_n_i; + + sprite_ram_we_n_s <= not cpu_access_v; + sprite_ram_cs_n_s <= cpu_access_v nor vbl_n_i; + + if vbl_n_i = '0' then + ra_s <= a_i; + else + ra_s <= v_cnt_s(4 downto 0) & c_s(4 downto 0); + end if; + end process sprite_ram_ctrl; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- The Sprite RAM P5 N5 + ----------------------------------------------------------------------------- + sprite_ram_b : entity work.ladybug_sprite_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_5mhz_i, + a_i => ra_s, + cs_n_i => sprite_ram_cs_n_s, + we_n_i => sprite_ram_we_n_s, + d_i => d_from_cpu_i, + d_o => rb_s + ); + + ----------------------------------------------------------------------------- + -- Process rc_add + -- + -- Purpose: + -- Implements IC N6 and E6 which add sprite RAM data and Cx signals to + -- form RCx bus. + -- + rc_add: process (rb_s, c_s, v_i) + variable a_v, b_v, + sum_v : std_logic_vector(7 downto 0); + begin + -- prepare the inputs of the adder + a_v(3 downto 0) := rb_s(3 downto 0); + a_v(4) := '1'; + a_v(5) := '0'; + a_v(7 downto 6) := rb_s(1 downto 0); + + b_v(0) := not c_s(6); + b_v(1) := not c_s(7); + b_v(2) := not c_s(8); + b_v(3) := not v_i(3); + b_v(4) := c_s(10); + b_v(5) := '0'; + b_v(7 downto 6) := "11"; + + sum_v := a_v + b_v; + + rc_s <= sum_v; + + end process rc_add; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Sprite Control Logic + ----------------------------------------------------------------------------- + sprite_ctrl_b : entity work.ladybug_sprite_ctrl + port map ( + clk_20mhz_i => clk_20mhz_i, + clk_en_5mhz_i => clk_en_5mhz_i, + clk_en_5mhz_n_i => clk_en_5mhz_n_i, + por_n_i => por_n_i, + vbl_n_i => vbl_n_i, + vbl_d_n_i => vbl_d_n_i, + vc_i => v_i(2), + vc_d_i => vc_d_i, + ha_i => h_i(0), + ha_d_i => ha_d_i, + rb6_i => rb_s(6), + rb7_i => rb_s(7), + rc3_i => rc_s(3), + rc4_i => rc_s(4), + rc5_i => rc_s(5), + j7_b_i => j7_s(1), + j7_c_i => j7_s(2), + clk_en_eck_i => clk_en_eck_s, + c_o => c_s, + clk_en_5ck_n_o => clk_en_5ck_n_s, + clk_en_6ck_n_o => clk_en_6ck_n_s, + clk_en_7ck_n_o => clk_en_7ck_n_s, + s6ck_n_o => s6ck_n_s, + s7ck_n_o => s7ck_n_s, + clk_en_b7_p3_o => clk_en_b7_p3_s, + e5_p8_o => e5_p8_s, + clk_en_e7_3_o => clk_en_e7_3_s, + a8_p5_n_o => a8_p5_n_s + ); + + ----------------------------------------------------------------------------- + -- Process misc_seq + -- + -- Purpose: + -- Implements several sequential elements. + -- + misc_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + clk_5mhz_n_q <= '0'; + ma_q <= (others => '0'); + mb_q <= (others => '0'); + mc_q <= (others => '0'); + cl_q <= (others => '0'); + ck_inh_n_q <= '1'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Turn clk_5mhz_n into clock waveform ---------------------------------- + if clk_en_5mhz_n_i = '1' then + clk_5mhz_n_q <= '1'; + elsif clk_en_5mhz_i = '1' then + clk_5mhz_n_q <= '0'; + end if; + + -- 8-Bit Register M6 ---------------------------------------------------- + if clk_en_5ck_n_s = '1' then + mb_q <= rb_s(1 downto 0); + ma_q <= rb_s(7 downto 2); + end if; + + -- 8-Bit Register P6 ---------------------------------------------------- + if clk_en_e7_3_s = '1' then + -- these are inverted based on mc_q(4) + mc_q(3 downto 0) <= rc_s(3 downto 0); + -- inverts sprites horizontally + mc_q(4) <= rb_s(4); + -- inverts sprites vertically + mc_q(5) <= rb_s(5); + -- + mc_q(6) <= rb_s(6); + end if; + + -- 6-Bit Register B6 ---------------------------------------------------- + if clk_en_6ck_n_s = '1' then + cl_q <= rb_s(4 downto 0); + end if; + + -- Flip-Flop H8 --------------------------------------------------------- + if clk_en_10mhz_n_i = '1' then + ck_inh_n_q <= not ck_inh_s; + end if; + + end if; + end process misc_seq; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process ma_vec + -- + -- Purpose: + -- Build the ma_s vector. + -- + ma_vec: process ( ma_q, + mb_q, + mc_q, + j7_s) + begin + ma_s(11 downto 6) <= ma_q; + + if mc_q(6) = '0' then + ma_s(5) <= mb_q(1); + ma_s(4) <= mb_q(0); + else + ma_s(5) <= mc_q(3) xor mc_q(4); + ma_s(4) <= mc_q(5) xor j7_s(2); + end if; + + ma_s(3) <= mc_q(2) xor mc_q(4); + ma_s(2) <= mc_q(1) xor mc_q(4); + ma_s(1) <= mc_q(0) xor mc_q(4); + ma_s(0) <= mc_q(5) xor j7_s(0); + end process ma_vec; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process df_mux + -- + -- Purpose: + -- Builds the multiplexed data from Sprite ROM. + -- Two-stage multiplexer: + -- 1) ROM data to DFx: 16->8 + -- 2) DF to input for shift register: 8->8 + -- This is actually a scrambler. + -- + df_mux: process ( rom_sprite_d_i, + cl_q, + mc_q) + variable df_v : std_logic_vector(7 downto 0); + begin + if cl_q(4) = '0' then + -- ROM L7 + df_v := rom_sprite_d_i( 7 downto 0); + else + -- ROM M7 + df_v := rom_sprite_d_i(15 downto 8); + end if; + + if mc_q(5) = '0' then + df_muxed_s(0) <= df_v(1); + df_muxed_s(1) <= df_v(3); + df_muxed_s(2) <= df_v(5); + df_muxed_s(3) <= df_v(7); + -- + df_muxed_s(4) <= df_v(0); + df_muxed_s(5) <= df_v(2); + df_muxed_s(6) <= df_v(4); + df_muxed_s(7) <= df_v(6); + else + df_muxed_s(0) <= df_v(7); + df_muxed_s(1) <= df_v(5); + df_muxed_s(2) <= df_v(3); + df_muxed_s(3) <= df_v(1); + -- + df_muxed_s(4) <= df_v(6); + df_muxed_s(5) <= df_v(4); + df_muxed_s(6) <= df_v(2); + df_muxed_s(7) <= df_v(0); + end if; + + end process df_mux; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- The Two 8-Bit Shift Registers H6 J6 + ----------------------------------------------------------------------------- + shifters_h6_j6 : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + h6_shifter <= (others=>'0'); + j6_shifter <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if (clk_en_10mhz_i and not ck_inh_s) = '1' then + if (ct0_s or ct1_s or a8_p5_n_s) = '0' then + h6_shifter <= df_muxed_s(3 downto 0); + j6_shifter <= df_muxed_s(7 downto 4); + else + h6_shifter <= h6_shifter(2 downto 0) & "0"; + j6_shifter <= j6_shifter(2 downto 0) & "0"; + end if; + end if; + end if; + end process; + + qh1_s <= h6_shifter(3); + qh2_s <= j6_shifter(3); + + ----------------------------------------------------------------------------- + -- Sprite Look-up PROM F4 + ----------------------------------------------------------------------------- + lu_a_s(4 downto 2) <= cl_q(2 downto 0); + lu_a_s(1) <= qh2_s; + lu_a_s(0) <= qh1_s; + + prom_F4 : entity work.prom_10_1 + port map ( + CLK => clk_20mhz_i, + ADDR => lu_a_s, + DATA => lu_d_s + ); + + lu_d_mux_s <= lu_d_s(3 downto 0) when cl_q(3) = '0' else lu_d_s(7 downto 4); + + ----------------------------------------------------------------------------- + -- Sprite Control Look-up PROM C4 + ----------------------------------------------------------------------------- + ctrl_lu_a_s(0) <= '1'; + ctrl_lu_a_s(1) <= hx_i; + ctrl_lu_a_s(2) <= clk_5mhz_n_q; + ctrl_lu_a_s(3) <= h_i(0); + ctrl_lu_a_s(4) <= h_i(1); + + prom_C4 : entity work.prom_10_3 + port map ( + CLK => clk_20mhz_i, + ADDR => ctrl_lu_a_s, + DATA => ctrl_lu_d_s + ); + + ----------------------------------------------------------------------------- + -- Process ctrl_lu_seq + -- + -- Purpose: + -- Registers output of Sprite Control Look-up PROM. + -- + ctrl_lu_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + ctrl_lu_q <= (others => '0'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + ctrl_lu_q <= ctrl_lu_q_d_s; + end if; + end process ctrl_lu_seq; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process ctrl_lu_comb + -- + -- Purpose: + -- Combinational logic for the sprite control registers. + -- + ctrl_lu_comb: process ( clk_en_10mhz_i, + ctrl_lu_d_s, + ctrl_lu_q, + ctrl_lu_q_d_s) + begin + -- default assignments + ctrl_lu_q_d_s <= ctrl_lu_q; + clk_en_eck_s <= '0'; + clk_en_rd_s <= '0'; + + -- register control + if clk_en_10mhz_i = '1' then + ctrl_lu_q_d_s <= ctrl_lu_d_s(5 downto 0); + + if ctrl_lu_q(1) = '0' and ctrl_lu_q_d_s(1) = '1' then + -- detect rising edge on ctrl_lu_q(1) + clk_en_eck_s <= '1'; + end if; + + if ctrl_lu_q(6) = '0' and ctrl_lu_q_d_s(6) = '1' then + -- detect rising edge on ctrl_lu_q(6) + clk_en_rd_s <= '1'; + end if; + end if; + + end process ctrl_lu_comb; + -- + shift_oc_n_s <= ctrl_lu_q(1) nand res_n_i; + ck_inh_s <= ctrl_lu_q(2); + cr_mux_sel_s <= ctrl_lu_q(3); + vram_we_n_s <= ctrl_lu_q(4); + rs_enable_s <= ctrl_lu_q(5); + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process ca_seq + -- + -- Purpose: + -- Implements B5, the register that holds the CS flip-flops. + -- + ca_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + ca_q <= (others => '0'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if clk_en_7ck_n_s = '1' then + ca_q <= c_s(8 downto 6); + end if; + end if; + end process ca_seq; + -- + ca6_s <= ca_q(1); + ca7_s <= ca_q(2); + ca8_s <= ca_q(3); + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process vram_mux + -- + -- Purpose: + -- Generates the VRAM address CRx. + -- It implements chips D5, C5 and B5. + -- + vram_mux: process ( h_i, h_t_i, + v_i, + x_s, + ca6_s, ca7_s, ca8_s, + cr_mux_sel_s) + begin + if cr_mux_sel_s = '0' then + -- D5 + cr_s(0) <= h_i(2); + cr_s(1) <= h_i(3); + cr_s(2) <= h_t_i(0); + cr_s(3) <= h_t_i(1); + -- C5 + cr_s(4) <= h_t_i(2); + cr_s(5) <= h_t_i(3); + cr_s(6) <= v_i(0); + cr_s(7) <= v_i(1); + -- B5 + cr_s(8) <= v_i(2); + cr_s(9) <= v_i(3); + + else + -- D5 + cr_s(0) <= x_s(0); + cr_s(1) <= x_s(1); + cr_s(2) <= x_s(2); + cr_s(3) <= x_s(3); + -- C5 + cr_s(4) <= x_s(4); + cr_s(5) <= x_s(5); + cr_s(6) <= ca6_s; + cr_s(7) <= ca7_s; + -- B5 + cr_s(8) <= ca8_s; + cr_s(9) <= not v_i(3); + + end if; + end process vram_mux; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Shift Registers + ----------------------------------------------------------------------------- + shifters_a7_a8_d7_d8_f8 : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + rd_shift_int <= (others=>'1'); + elsif rising_edge(clk_20mhz_i) then + if (clk_en_10mhz_i and not ck_inh_s) = '1' then + rs_int <= (qh1_s nor qh2_s) & rs_int(3 downto 1); + rd_shift_int <= + lu_d_mux_s(0) & rd_shift_int(15 downto 13) & + lu_d_mux_s(1) & rd_shift_int(11 downto 9) & + lu_d_mux_s(2) & rd_shift_int( 7 downto 5) & + lu_d_mux_s(3) & rd_shift_int( 3 downto 1); + end if; + end if; + end process; + + rd_shift_s <= rd_shift_int when shift_oc_n_s = '0' else (others=>'1'); + rs_s <= rs_int when shift_oc_n_s = '0' else (others=>'1'); +-- rs_n_s(3) <= not rs_s(3) or not rs_enable_s; +-- rs_n_s(2) <= not rs_s(2) or not rs_enable_s; +-- rs_n_s(1) <= not rs_s(1) or not rs_enable_s; +-- rs_n_s(0) <= not rs_s(0) or not rs_enable_s; + rs_n_s(3) <= rs_s(3) and rs_enable_s; + rs_n_s(2) <= rs_s(2) and rs_enable_s; + rs_n_s(1) <= rs_s(1) and rs_enable_s; + rs_n_s(0) <= rs_s(0) and rs_enable_s; + + ----------------------------------------------------------------------------- + -- Sprite VRAM + ----------------------------------------------------------------------------- + vram_a6_in_s(0) <= rd_shift_s( 0); + vram_a6_in_s(1) <= rd_shift_s( 4); + vram_a6_in_s(2) <= rd_shift_s( 8); + vram_a6_in_s(3) <= rd_shift_s(12); + vram_a6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(0), + we_n_i => vram_we_n_s, + d_i => vram_a6_in_s, + d_o => vram_a6_out_s + ); + -- + vram_b6_in_s(0) <= rd_shift_s( 1); + vram_b6_in_s(1) <= rd_shift_s( 5); + vram_b6_in_s(2) <= rd_shift_s( 9); + vram_b6_in_s(3) <= rd_shift_s(13); + vram_b6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(1), + we_n_i => vram_we_n_s, + d_i => vram_b6_in_s, + d_o => vram_b6_out_s + ); + -- + vram_c6_in_s(0) <= rd_shift_s( 2); + vram_c6_in_s(1) <= rd_shift_s( 6); + vram_c6_in_s(2) <= rd_shift_s(10); + vram_c6_in_s(3) <= rd_shift_s(14); + vram_c6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(2), + we_n_i => vram_we_n_s, + d_i => vram_c6_in_s, + d_o => vram_c6_out_s + ); + -- + vram_d6_in_s(0) <= rd_shift_s( 3); + vram_d6_in_s(1) <= rd_shift_s( 7); + vram_d6_in_s(2) <= rd_shift_s(11); + vram_d6_in_s(3) <= rd_shift_s(15); + vram_d6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(3), + we_n_i => vram_we_n_s, + d_i => vram_d6_in_s, + d_o => vram_d6_out_s + ); + -- Remap VRAM data outputs to the complete bus ------------------------------ + rd_vram_s(15) <= vram_d6_out_s(3) or rs_n_s(3); + rd_vram_s(14) <= vram_c6_out_s(3) or rs_n_s(2); + rd_vram_s(13) <= vram_b6_out_s(3) or rs_n_s(1); + rd_vram_s(12) <= vram_a6_out_s(3) or rs_n_s(0); + -- + rd_vram_s(11) <= vram_d6_out_s(2) or rs_n_s(3); + rd_vram_s(10) <= vram_c6_out_s(2) or rs_n_s(2); + rd_vram_s( 9) <= vram_b6_out_s(2) or rs_n_s(1); + rd_vram_s( 8) <= vram_a6_out_s(2) or rs_n_s(0); + -- + rd_vram_s( 7) <= vram_d6_out_s(1) or rs_n_s(3); + rd_vram_s( 6) <= vram_c6_out_s(1) or rs_n_s(2); + rd_vram_s( 5) <= vram_b6_out_s(1) or rs_n_s(1); + rd_vram_s( 4) <= vram_a6_out_s(1) or rs_n_s(0); + -- + rd_vram_s( 3) <= vram_d6_out_s(0) or rs_n_s(3); + rd_vram_s( 2) <= vram_c6_out_s(0) or rs_n_s(2); + rd_vram_s( 1) <= vram_b6_out_s(0) or rs_n_s(1); + rd_vram_s( 0) <= vram_a6_out_s(0) or rs_n_s(0); + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process rd_seq + -- + -- Purpose: + -- Implements the registers saving the RDx bus. + -- + rd_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + vram_q <= (others => '0'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if blank_flont_i = '0' then + -- pseudo-asynchronous clear + vram_q <= (others => '0'); + + elsif clk_en_rd_s = '1' then + if shift_oc_n_s = '0' then + -- take data from shift registers + vram_q <= rd_shift_s; + else + -- take data from VRAM + vram_q <= rd_vram_s; + end if; + end if; + end if; + end process rd_seq; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process sig_mux + -- + -- Purpose: + -- Multiplexes the saved VRAM data to generate the four SIG outputs. + -- + sig_mux: process (vram_q, + h_i, + blank_i) + variable vec_v : std_logic_vector(1 downto 0); + begin + -- default assignment + sig_o <= (others => '0'); + + vec_v := (h_i(1) & h_i(0)); + + if blank_i = '0' then + case vec_v is + when "00" => + sig_o(1) <= vram_q( 1); + sig_o(2) <= vram_q( 5); + sig_o(3) <= vram_q( 9); + sig_o(4) <= vram_q(13); + when "01" => + sig_o(1) <= vram_q( 2); + sig_o(2) <= vram_q( 6); + sig_o(3) <= vram_q(10); + sig_o(4) <= vram_q(14); + when "10" => + sig_o(1) <= vram_q( 3); + sig_o(2) <= vram_q( 7); + sig_o(3) <= vram_q(11); + sig_o(4) <= vram_q(15); + when "11" => + sig_o(1) <= vram_q( 0); + sig_o(2) <= vram_q( 4); + sig_o(3) <= vram_q( 8); + sig_o(4) <= vram_q(12); + when others => + null; + end case; + end if; + end process sig_mux; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + rom_sprite_a_o <= ma_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_sprite_ctrl.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_sprite_ctrl.vhd new file mode 100644 index 00000000..f0eaff48 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_sprite_ctrl.vhd @@ -0,0 +1,491 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite_ctrl.vhd,v 1.8 2005/10/10 22:02:14 arnim Exp $ +-- +-- Control logic of the Sprite module. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +library ieee; +use ieee.numeric_std.all; + +entity ladybug_sprite_ctrl is + + port ( + clk_20mhz_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_5mhz_n_i : in std_logic; + por_n_i : in std_logic; + vbl_n_i : in std_logic; + vbl_d_n_i : in std_logic; + vc_i : in std_logic; + vc_d_i : in std_logic; + ha_i : in std_logic; + ha_d_i : in std_logic; + rb6_i : in std_logic; + rb7_i : in std_logic; + rc3_i : in std_logic; + rc4_i : in std_logic; + rc5_i : in std_logic; + j7_b_i : in std_logic; + j7_c_i : in std_logic; + clk_en_eck_i : in std_logic; + c_o : out std_logic_vector(10 downto 0); + clk_en_5ck_n_o : out std_logic; + clk_en_6ck_n_o : out std_logic; + clk_en_7ck_n_o : out std_logic; + s6ck_n_o : out std_logic; + s7ck_n_o : out std_logic; + clk_en_b7_p3_o : out std_logic; + e5_p8_o : out std_logic; + clk_en_e7_3_o : out std_logic; + a8_p5_n_o : out std_logic + ); + +end ladybug_sprite_ctrl; + + +architecture rtl of ladybug_sprite_ctrl is + + signal clk_5mhz_q : std_logic; + + signal a7_p5_s, + a7_p5_q : std_logic; + signal a7_p9_q : std_logic; + + signal a8_p5_q : std_logic; + + signal n4_p5_s, + n4_p5_q : std_logic; + + signal f7_ck_en_s, + f7_cl_s, + f7_qa_s, f7_qb_s, f7_qc_s, f7_qd_s, + f7_da_s, f7_db_s, f7_dc_s, f7_dd_s : std_logic_vector(2 downto 1); + + signal j5_ck_en_s, + j5_cl_s, + j5_qa_s, j5_qb_s, j5_qc_s, j5_qd_s, + j5_da_s, j5_db_s, j5_dc_s, j5_dd_s : std_logic_vector(2 downto 1); + + signal e7_ck_en_s, + e7_cl_n_s : std_logic; + signal e7_d_s, + e7_q_s, e7_q_n_s, + e7_d_out_s, e7_d_out_n_s : std_logic_vector(4 downto 1); + + signal h5_n_s : std_logic_vector(7 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements various sequential elements. + -- + seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + clk_5mhz_q <= '0'; + a7_p5_q <= '0'; + a7_p9_q <= '0'; + a8_p5_q <= '0'; + n4_p5_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Turn clk_5mhz enable into clock waveform ----------------------------- + if clk_en_5mhz_i = '1' then + clk_5mhz_q <= '1'; + elsif clk_en_5mhz_n_i = '1' then + clk_5mhz_q <= '0'; + end if; + + -- Flip-Flop A7 --------------------------------------------------------- + a7_p5_q <= a7_p5_s; + -- + if clk_en_5mhz_n_i = '1' then + a7_p9_q <= j5_qd_s(2); + end if; + + -- Flip-Flop A8 --------------------------------------------------------- + if clk_en_eck_i = '1' then + a8_p5_q <= j7_b_i nand j7_c_i; + end if; + + -- Flip-Flop N4 --------------------------------------------------------- + n4_p5_q <= n4_p5_s; + + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements various combinational signals. + -- + comb: process (a7_p5_q, + vc_i, vc_d_i, + n4_p5_q, + ha_i, ha_d_i, + f7_qd_s) + begin + -- D Input for Flip-Flop N4 ----------------------------------------------- + if a7_p5_q = '0' then + -- pseudo-asynchronous clear + n4_p5_s <= '0'; + elsif (vc_i and not vc_d_i) = '1' then + -- falling edge on VC + n4_p5_s <= '1'; + else + n4_p5_s <= n4_p5_q; + end if; + + -- D-Input for Flip-Flop A7.5 --------------------------------------------- + if (ha_i and not ha_d_i) = '1' then + -- falling edge on HA + a7_p5_s <= f7_qd_s(2); + else + a7_p5_s <= a7_p5_q; + end if; + + end process comb; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- F7 - Dual 4-Bit Binary Counter + ----------------------------------------------------------------------------- + f7_cl_s(1) <= n4_p5_q and ha_i and vbl_n_i; + f7_cl_s(2) <= f7_cl_s(1); + -- + f7_b : entity work.ttl_393 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => f7_ck_en_s, + por_n_i => por_n_i, + cl_i => f7_cl_s, + qa_o => f7_qa_s, + qb_o => f7_qb_s, + qc_o => f7_qc_s, + qd_o => f7_qd_s, + da_o => f7_da_s, + db_o => f7_db_s, + dc_o => f7_dc_s, + dd_o => f7_dd_s + ); + + + ----------------------------------------------------------------------------- + -- Process f7_ck_en + -- + -- Purpose: + -- Build the clock enable for the two counters in F7. + -- + f7_ck_en: process (j5_qd_s, j5_dd_s, + vbl_n_i, vbl_d_n_i, + ha_i, ha_d_i, + n4_p5_q, n4_p5_s, + f7_qd_s, f7_dd_s, + e7_q_n_s, e7_d_out_n_s, + f7_qb_s, f7_db_s) + + variable ff_q_v, ff_d_v : std_logic; + + begin + + -- combinational result based on flip-flop outputs + ff_q_v := j5_qd_s(2) or ( not ( not ( vbl_n_i and ha_i and n4_p5_q ) ) or not ( not f7_qd_s(2) nand not e7_q_n_s(1) ) ); + + -- combinational result based on flip-flop inputs + ff_d_v := j5_dd_s(2) or ( not ( not ( vbl_d_n_i and ha_d_i and n4_p5_s ) ) or not ( not f7_qd_s(2) nand not e7_d_out_n_s(1) ) ); +-- B7.3 D7.8 D7.8 F6.3 B7.6 + -- rising edge detector on B7.3 + f7_ck_en_s(1) <= not ff_q_v and ff_d_v; + + -- falling edge detector on F7.QB(1) + f7_ck_en_s(2) <= f7_qb_s(1) and not f7_db_s(1); + + end process f7_ck_en; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- J5 - Dual 4-Bit Binary Counter + ----------------------------------------------------------------------------- + j5_cl_s(1) <= not vbl_n_i + or -- D7.6 + not( + not clk_5mhz_q + nand -- F5.8 + not h5_n_s(0) + ) + or -- D7.6 + n4_p5_q; + j5_cl_s(2) <= a7_p9_q + or -- B7.8 + ( + not ( + not ( + n4_p5_q + and -- D7.8 + ha_i + and -- D7.8 + vbl_n_i + ) + ) + or -- F6.3 + not ( + not f7_qd_s(2) + nand -- B7.6 + not e7_q_n_s(1) + ) + ); + -- + j5_b : entity work.ttl_393 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => j5_ck_en_s, + por_n_i => por_n_i, + cl_i => j5_cl_s, + qa_o => j5_qa_s, + qb_o => j5_qb_s, + qc_o => j5_qc_s, + qd_o => j5_qd_s, + da_o => j5_da_s, + db_o => j5_db_s, + dc_o => j5_dc_s, + dd_o => j5_dd_s + ); + + + ----------------------------------------------------------------------------- + -- Process j5_ck_en + -- + -- Purpose: + -- Build the clock enable for the two counters in J5. + -- + j5_ck_en: process (ha_i, ha_d_i, + e7_q_s, e7_d_out_s, + j5_qc_s, j5_dc_s) + begin + -- falling edge detector on F6.11 + j5_ck_en_s(1) <= -- Flip-Flop Outputs + ( + not ha_i + nand + e7_q_s(3) + ) + and not -- Flip-Flop Inputs + ( + not ha_d_i + nand + e7_d_out_s(3) + ); + + -- falling edge detector on C7.10 + j5_ck_en_s(2) <= -- Flip-Flop Outputs + ( + j5_qc_s(1) + nor + e7_q_s(2) + ) + and not -- Flip-Flop Inputs + ( + j5_dc_s(1) + nor + e7_d_out_s(2) + ); + end process j5_ck_en; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- E7 - Quad D-Type Flip-Flops with Clear + ----------------------------------------------------------------------------- + e7_d_s(1) <= not rb7_i; + e7_d_s(2) <= not ( + rb7_i + and -- D7.12 + rc5_i + and -- D7.12 + ( + not rc4_i + and -- C7.1 + not ( + not rc3_i + nor -- C6.3 + rb6_i + ) + ) + ); + e7_d_s(3) <= not e7_d_s(2) + and -- C7.4 + not a8_p5_q; + e7_d_s(4) <= '0'; + + -- This clock enable is not 100% equivalent to the schematics. + -- There, h5_n_s(4) could also generate a rising edge for E7 + -- but this is ignored here. It is believed that h5_n_s(4) acts + -- only as a clock enable/suppress for the 5 MHz clock. + -- This implementation suppresses as well a combinational feedback + -- loop from J5/1. + e7_ck_en_s <= clk_en_5mhz_i and not h5_n_s(4); + + e7_cl_n_s <= f7_qd_s(2) + or -- B7.3?? + ( + not clk_5mhz_q + nand -- F5.8 + not h5_n_s(0) + ) after 20 ns; + + e7_b : entity work.ttl_175 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => e7_ck_en_s, + por_n_i => por_n_i, + cl_n_i => e7_cl_n_s, + d_i => e7_d_s, + q_o => e7_q_s, + q_n_o => e7_q_n_s, + d_o => e7_d_out_s, + d_n_o => e7_d_out_n_s + ); + + clk_en_e7_3_o <= not e7_q_s(3) and e7_d_out_s(3); + + + ----------------------------------------------------------------------------- + -- Process h5 + -- + -- Purpose: + -- Implements all functionality regarding H5. + -- + h5: process (j5_qa_s, j5_da_s, + j5_qb_s, j5_db_s, + ha_i, ha_d_i, + vbl_n_i, vbl_d_n_i, + a7_p5_q, a7_p5_s) + variable ff_q_v, ff_d_v : std_logic_vector(7 downto 0); + variable f5_p3_q_v, f5_p3_d_v : std_logic; + + ----------------------------------------------------------------------------- + -- 7445 - BCD to Decimal Decoder + ----------------------------------------------------------------------------- + function ttl_45_f(a, b, c, d : in std_logic) return + std_logic_vector is + variable idx_v : std_logic_vector( 3 downto 0); + variable vec_v : std_logic_vector(15 downto 0); + begin + vec_v := (others => '1'); + + idx_v := d & c & b & a; + vec_v(to_integer(unsigned(idx_v))) := '0'; + + return vec_v(7 downto 0); + end ttl_45_f; + + begin + -- combinational result based on flip-flop outputs + f5_p3_q_v := not a7_p5_q nand vbl_n_i; + ff_q_v := ttl_45_f(a => j5_qa_s(1), + b => j5_qb_s(1), + c => ha_i, + d => f5_p3_q_v); + -- combinational result based on flip-flop inputs + f5_p3_d_v := not a7_p5_s nand vbl_d_n_i; + ff_d_v := ttl_45_f(a => j5_da_s(1), + b => j5_db_s(1), + c => ha_d_i, + d => f5_p3_d_v); + + -- combinational output of H5 is based on flip-flop outputs + h5_n_s <= ff_q_v; + + -- clock enable for flip-flops on /5CK + clk_en_5ck_n_o <= not ff_q_v(5) and ff_d_v(5); + -- clock enable for flip-flops on /6CK + clk_en_6ck_n_o <= not ff_q_v(6) and ff_d_v(6); + -- clock enable for flip-flops on /7CK + clk_en_7ck_n_o <= not ff_q_v(7) and ff_d_v(7); + + s6ck_n_o <= ff_q_v(6); + s7ck_n_o <= ff_q_v(7); + end process h5; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + clk_en_b7_p3_o <= f7_ck_en_s(1); + e5_p8_o <= n4_p5_q + nor -- E5.8 + not ( + f7_qa_s(1) + nand -- F6.8 + f7_qb_s(1) + ); + a8_p5_n_o <= not a8_p5_q; + + c_o( 0) <= j5_qa_s(1); + c_o( 1) <= j5_qb_s(1); + c_o( 2) <= j5_qa_s(2); + c_o( 3) <= j5_qb_s(2); + c_o( 4) <= j5_qc_s(2); + c_o( 5) <= j5_qd_s(2); + c_o( 6) <= f7_qa_s(2); + c_o( 7) <= f7_qb_s(2); + c_o( 8) <= f7_qc_s(2); + c_o( 9) <= f7_qa_s(1); + c_o(10) <= f7_qb_s(1); + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_video_timing.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_video_timing.vhd new file mode 100644 index 00000000..58a3a818 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_video_timing.vhd @@ -0,0 +1,356 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_video_timing.vhd,v 1.16 2006/02/07 19:27:38 arnim Exp $ +-- +-- The Video Timing Module of Lady Bug Machine. +-- +-- It implements the horizontal and vertical timing signals including composite +-- sync information. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +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 ladybug_video_timing is + + port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + -- Horizontal Timing Interface -------------------------------------------- + h_o : out std_logic_vector(3 downto 0); + h_t_o : out std_logic_vector(3 downto 0); + hbl_o : out std_logic; + hx_o : out std_logic; + ha_d_o : out std_logic; + ha_t_rise_o : out std_logic; + -- Vertical Timing Interface ---------------------------------------------- + v_o : out std_logic_vector(3 downto 0); + v_t_o : out std_logic_vector(3 downto 0); + vc_d_o : out std_logic; + vbl_n_o : out std_logic; + vbl_d_n_o : out std_logic; + vbl_t_n_o : out std_logic; + blank_flont_o : out std_logic; + -- RBG Video Interface ---------------------------------------------------- + hsync_n_o : out std_logic; + vsync_n_o : out std_logic; + comp_sync_n_o : out std_logic + ); + +end ladybug_video_timing; + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_video_timing is + + -- horizontal timing circuit + signal h_preset : std_logic_vector(7 downto 0); + signal h_rise : std_logic_vector(7 downto 0); + signal h_do : std_logic_vector(7 downto 0); + signal h_j2_h2 : std_logic_vector(7 downto 0); + signal h_s : std_logic_vector(7 downto 0); + signal hx_q, + hx_s, + hx_n_s : std_logic; + signal hx_rise_s : std_logic; + signal hbl_q : std_logic; +-- signal hbl_n_s : std_logic; + signal hsync_n_q : std_logic; + signal h_carry_s : std_logic; + signal hd_rise_s : std_logic; + + -- vertical timing circuit + signal v_preset : std_logic_vector(7 downto 0); + signal v_rise : std_logic_vector(7 downto 0); + signal v_do : std_logic_vector(7 downto 0); + signal v_s : std_logic_vector(7 downto 0); + signal vx_q, + vx_n_s : std_logic; + signal vbl_q, + vbl_s, + vbl_n_s : std_logic; + signal vbl_t_q, + vbl_t_s, + vbl_t_n_s : std_logic; + signal vsync_n_q : std_logic; + signal v_carry_s : std_logic; + signal vc_rise_s, + vd_rise_s : std_logic; + signal vb_t_rise_s : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Horizontal Timing counters J2 H2 + ----------------------------------------------------------------------------- + hd_rise_s <= h_rise(3); + ha_t_rise_o <= h_rise(4); + ha_d_o <= h_do(0); + h_preset <= hx_n_s & hx_n_s & "00" & hx_n_s & "000"; + + h_counter : entity work.counter + port map ( + ck_i => clk_20mhz_i, + ck_en_i => clk_en_5mhz_i, + reset_n_i => por_n_i, + load_i => h_carry_s, + preset_i => h_preset, + q_o => h_s, + co_o => h_carry_s, + rise_q_o => h_rise, + d_o => h_do + ); + + ----------------------------------------------------------------------------- + -- Process h_timing + -- + -- Purpose: + -- Implement the horizontal timing circuit. + -- + -- The original circuit has no asynchronous reset. To have a stable + -- behavior on silicon, all sequential elements are cleared with the + -- power-on reset. This assumes that the original chips power-up to + -- these values. + -- + -- See also instantiations of ttl_161. + -- + h_timing: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + hx_q <= '0'; + hbl_q <= '0'; + hsync_n_q <= '1'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Flip-flops on 5 MHz clock -------------------------------------------- + -- HX + hx_q <= hx_s; + + -- Free running flip-flops ---------------------------------------------- + -- HBL + if (hx_q and not h_s(3)) = '1' then + -- pseudo-asynchronous preset + hbl_q <= '1'; + elsif hd_rise_s = '1' then + -- Rising edge on HD + hbl_q <= hx_q; + end if; + + -- HSYNC + if hx_q = '0' then + -- pseudo-asynchronous preset + hsync_n_q <= '1'; + elsif hd_rise_s = '1' then + -- rising edge on HD + hsync_n_q <= h_s(5); + end if; + + end if; + + end process h_timing; + -- + ----------------------------------------------------------------------------- + + hx_n_s <= not hx_q; +--hbl_n_s <= not hbl_q; + + ----------------------------------------------------------------------------- + -- Process hx_comb + -- + -- Purpose: + -- Implements the combinational logic for hx. Including rising edge + -- detection. + -- + hx_comb: process (clk_en_5mhz_i, h_carry_s, hx_q) + begin + -- default assignments + hx_s <= hx_q; + hx_rise_s <= '0'; + + -- HX + if clk_en_5mhz_i = '1' then + if h_carry_s = '1' then + hx_s <= not hx_q; + + -- flag rising edge of hx_q + if hx_q = '0' then + hx_rise_s <= '1'; + end if; + end if; + end if; + + end process hx_comb; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Vertical Timing counters E5 E2 + ----------------------------------------------------------------------------- + vb_t_rise_s <= v_rise(5); + vd_rise_s <= v_rise(3); + vc_rise_s <= v_rise(2); + vc_d_o <= v_do(2); + v_preset <= vx_n_s & vx_n_s & vx_n_s & vx_q & vx_n_s & '0' & vx_n_s & '0'; + + v_counter : entity work.counter + port map ( + ck_i => clk_20mhz_i, + ck_en_i => hx_rise_s, + reset_n_i => por_n_i, + load_i => v_carry_s, + preset_i => v_preset, + q_o => v_s, + co_o => v_carry_s, + rise_q_o => v_rise, + d_o => v_do + ); + + ----------------------------------------------------------------------------- + -- Process v_timing + -- + -- Purpose: + -- Implement the vertical timing circuit. + -- + -- See process h_timing for reset discussion. + -- + v_timing: process (clk_20mhz_i, por_n_i) + variable preset_v : boolean; + begin + if por_n_i = '0' then + vx_q <= '0'; + vbl_q <= '0'; + vsync_n_q <= '1'; + vbl_t_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Free running flip-flops ---------------------------------------------- + -- VX + if hx_rise_s = '1' then + if v_carry_s = '1' then + vx_q <= vx_n_s; + end if; + end if; + + -- VSYNC + if vc_rise_s = '1' then + -- rising edge on VC + vsync_n_q <= not (v_s(7) and v_s(6) and v_s(5) and v_s(4) and v_s(3) and vx_n_s); + end if; + + -- VBL + vbl_q <= vbl_s; + + -- VBL' + vbl_t_q <= vbl_t_s; + + end if; + end process v_timing; + -- + ----------------------------------------------------------------------------- + + vx_n_s <= not vx_q; + vbl_n_s <= not vbl_q; + vbl_t_n_s <= not vbl_t_q; + + + ----------------------------------------------------------------------------- + -- Process vbl_comb + -- + -- Purpose: + -- Combinational logic for vbl_q and vbl_t_q. + -- + vbl_comb: process (v_s, vb_t_rise_s, vd_rise_s, vx_q, vbl_q, vbl_t_q) + variable preset_v : boolean; + begin + preset_v := (v_s(5) and v_s(6) and v_s(7)) = '1'; + -- VBL + vbl_s <= vbl_q; + if preset_v then + -- pseudo-asynchronous preset + vbl_s <= '1'; + elsif vb_t_rise_s = '1' then + -- rising edge on VB' + vbl_s <= vx_q; + end if; + + -- VBL' + vbl_t_s <= vbl_t_q; + if preset_v then + -- pseudo-asynchronous preset + vbl_t_s <= '1'; + elsif vd_rise_s = '1' then + -- rising edge on VD + vbl_t_s <= vx_q; + end if; + + end process vbl_comb; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + h_o <= h_s(3 downto 0); + h_t_o <= h_s(7 downto 4); + hbl_o <= hbl_q; + hx_o <= hx_q; + v_o <= v_s(3 downto 0); + v_t_o <= v_s(7 downto 4); + vbl_n_o <= vbl_n_s; + vbl_t_n_o <= vbl_t_n_s; + vbl_d_n_o <= not vbl_s; + hsync_n_o <= hsync_n_q; + vsync_n_o <= vsync_n_q; + comp_sync_n_o <= not hsync_n_q xor vsync_n_q; + + -- I have no idea why there is an additional wire called BLANK FLONT. + -- From the schematics, it is the same as /VBL (just buffered). + blank_flont_o <= vbl_n_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_video_unit.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_video_unit.vhd new file mode 100644 index 00000000..96d58e5f --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ladybug_video_unit.vhd @@ -0,0 +1,240 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_video_unit.vhd,v 1.22 2006/02/07 00:44:35 arnim Exp $ +-- +-- The Video Unit of the Lady Bug Machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_video_unit is + port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + res_n_i : in std_logic; + clk_en_10mhz_i : in std_logic; + clk_en_10mhz_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_5mhz_n_i : in std_logic; + clk_en_4mhz_i : in std_logic; + -- CPU Interface ---------------------------------------------------------- + cs7_n_i : in std_logic; + cs10_n_i : in std_logic; + cs13_n_i : in std_logic; + a_i : in std_logic_vector(10 downto 0); + rd_n_i : in std_logic; + wr_n_i : in std_logic; + wait_n_o : out std_logic; + d_from_cpu_i : in std_logic_vector( 7 downto 0); + d_from_video_o : out std_logic_vector( 7 downto 0); + vc_o : out std_logic; + vbl_tick_n_o : out std_logic; + vbl_buf_o : out std_logic; + -- RGB Video Interface ---------------------------------------------------- + rgb_r_o : out std_logic_vector( 1 downto 0); + rgb_g_o : out std_logic_vector( 1 downto 0); + rgb_b_o : out std_logic_vector( 1 downto 0); + hsync_n_o : out std_logic; + vsync_n_o : out std_logic; + comp_sync_n_o : out std_logic; + vblank_o : out std_logic; + hblank_o : out std_logic; + -- Character ROM Interface ------------------------------------------------ + rom_char_a_o : out std_logic_vector(11 downto 0); + rom_char_d_i : in std_logic_vector(15 downto 0); + -- Sprite ROM Interface --------------------------------------------------- + rom_sprite_a_o : out std_logic_vector(11 downto 0); + rom_sprite_d_i : in std_logic_vector(15 downto 0) + ); + +end ladybug_video_unit; + +architecture struct of ladybug_video_unit is + + signal h_s, + h_t_s : std_logic_vector(3 downto 0); + signal ha_d_s, + ha_t_rise_s : std_logic; + signal hbl_s : std_logic; + signal hx_s : std_logic; + + signal v_s, + v_t_s : std_logic_vector(3 downto 0); + signal vc_d_s : std_logic; + signal vbl_n_s, + vbl_d_n_s : std_logic; + + signal blank_flont_s : std_logic; + + signal d_from_char_s : std_logic_vector(7 downto 0); + + signal blank_s : std_logic; + signal crg_s : std_logic_vector(5 downto 1); + + signal sig_s : std_logic_vector(4 downto 1); + + signal comp_sync_n : std_logic; + +begin + comp_sync_n_o <= comp_sync_n and vbl_n_s; + vbl_buf_o <= not vbl_n_s; + ----------------------------------------------------------------------------- + -- Horizontal and Vertical Timing Generator + ----------------------------------------------------------------------------- + timing_b : entity work.ladybug_video_timing + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + h_o => h_s, + h_t_o => h_t_s, + hbl_o => hbl_s, + hx_o => hx_s, + ha_d_o => ha_d_s, + ha_t_rise_o => ha_t_rise_s, + v_o => v_s, + v_t_o => v_t_s, + vc_d_o => vc_d_s, + vbl_n_o => vbl_n_s, + vbl_d_n_o => vbl_d_n_s, + vbl_t_n_o => vbl_tick_n_o, + blank_flont_o => blank_flont_s, + hsync_n_o => hsync_n_o, + vsync_n_o => vsync_n_o, + comp_sync_n_o => comp_sync_n + ); + vc_o <= v_s(2); + + + ----------------------------------------------------------------------------- + -- Character Module + ----------------------------------------------------------------------------- + char_b : entity work.ladybug_char + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + res_n_i => res_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + clk_en_4mhz_i => clk_en_4mhz_i, + cs10_n_i => cs10_n_i, + cs13_n_i => cs13_n_i, + a_i => a_i, + rd_n_i => rd_n_i, + wr_n_i => wr_n_i, + wait_n_o => wait_n_o, + d_from_cpu_i => d_from_cpu_i, + d_from_char_o => d_from_char_s, + h_i => h_s, + h_t_i => h_t_s, + ha_t_rise_i => ha_t_rise_s, + hx_i => hx_s, + v_i => v_s, + v_t_i => v_t_s, + hbl_i => hbl_s, + blank_flont_i => blank_flont_s, + blank_o => blank_s, + vblank_o => vblank_o, + hblank_o => hblank_o, + crg_o => crg_s, + rom_char_a_o => rom_char_a_o, + rom_char_d_i => rom_char_d_i + ); + + + ----------------------------------------------------------------------------- + -- Sprite Module + ----------------------------------------------------------------------------- + sprite_b : entity work.ladybug_sprite + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + res_n_i => res_n_i, + clk_en_10mhz_i => clk_en_10mhz_i, + clk_en_10mhz_n_i => clk_en_10mhz_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + clk_en_5mhz_n_i => clk_en_5mhz_n_i, + cs7_n_i => cs7_n_i, + a_i => a_i(9 downto 0), + d_from_cpu_i => d_from_cpu_i, + h_i => h_s, + h_t_i => h_t_s, + hx_i => hx_s, + ha_d_i => ha_d_s, + v_i => v_s, + v_t_i => v_t_s, + vbl_n_i => vbl_n_s, + vbl_d_n_i => vbl_d_n_s, + vc_d_i => vc_d_s, + blank_flont_i => blank_flont_s, + blank_i => blank_s, + sig_o => sig_s, + rom_sprite_a_o => rom_sprite_a_o, + rom_sprite_d_i => rom_sprite_d_i + ); + + + ----------------------------------------------------------------------------- + -- RGB Generator + ----------------------------------------------------------------------------- + rgb_b : entity work.ladybug_rgb + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + crg_i => crg_s, + sig_i => sig_s, + rgb_r_o => rgb_r_o, + rgb_g_o => rgb_g_o, + rgb_b_o => rgb_b_o + ); + + + ----------------------------------------------------------------------------- + -- Bus Multiplexer + ----------------------------------------------------------------------------- + d_from_video_o <= d_from_char_s + when cs13_n_i = '0' else + (others => '1'); + +end struct; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/mist_io.v b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_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/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/osd.v b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_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/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/pll.qip b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_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/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/pll.v b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/pll.v new file mode 100644 index 00000000..65715540 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 20, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "20.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "20" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "20.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "20" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/scandoubler.v b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/ladybug_sound_unit.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/ladybug_sound_unit.vhd new file mode 100644 index 00000000..23ad2a6a --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/ladybug_sound_unit.vhd @@ -0,0 +1,143 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sound_unit.vhd,v 1.4 2006/06/16 22:41:37 arnim Exp $ +-- +-- Sound Unit of the Lady Bug Machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ladybug_sound_unit is + + port ( + clk_20mhz_i : in std_logic; + clk_en_4mhz_i : in std_logic; + por_n_i : in std_logic; + cs11_n_i : in std_logic; + cs12_n_i : in std_logic; + wr_n_i : in std_logic; + d_from_cpu_i : in std_logic_vector(7 downto 0); + sound_wait_n_o : out std_logic; + audio_o : out signed(7 downto 0) + ); + +end ladybug_sound_unit; + +architecture struct of ladybug_sound_unit is + + signal ready_b1_s, + ready_c1_s : std_logic; + + signal aout_b1_s, + aout_c1_s : signed(7 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- SN76489 Sound Chip B1 + ----------------------------------------------------------------------------- + snd_b1_b : entity work.sn76489_top + generic map ( + clock_div_16_g => 1 + ) + port map ( + clock_i => clk_20mhz_i, + clock_en_i => clk_en_4mhz_i, + res_n_i => por_n_i, + ce_n_i => cs11_n_i, + we_n_i => wr_n_i, + ready_o => ready_b1_s, + d_i => d_from_cpu_i, + aout_o => aout_b1_s + ); + + + ----------------------------------------------------------------------------- + -- SN76489 Sound Chip C1 + ----------------------------------------------------------------------------- + snd_c1_b : entity work.sn76489_top + generic map ( + clock_div_16_g => 1 + ) + port map ( + clock_i => clk_20mhz_i, + clock_en_i => clk_en_4mhz_i, + res_n_i => por_n_i, + ce_n_i => cs12_n_i, + we_n_i => wr_n_i, + ready_o => ready_c1_s, + d_i => d_from_cpu_i, + aout_o => aout_c1_s + ); + + + ----------------------------------------------------------------------------- + -- Process mix + -- + -- Purpose: + -- Mix the digital audio of the two SN76489 instances. + -- Additional care is taken to avoid audio overfow/clipping. + -- + mix: process (aout_b1_s, + aout_c1_s) + variable sum_v : signed(8 downto 0); + begin + sum_v := RESIZE(aout_b1_s, 9) + RESIZE(aout_c1_s, 9); + + if sum_v > 127 then + audio_o <= to_signed(127, 8); + elsif sum_v < -128 then + audio_o <= to_signed(-128, 8); + else + audio_o <= RESIZE(sum_v, 8); + end if; + + end process mix; + -- + ----------------------------------------------------------------------------- + + + sound_wait_n_o <= ready_b1_s and ready_c1_s; + +end struct; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/COPYING b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/COPYING new file mode 100644 index 00000000..60549be5 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/README b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/README new file mode 100644 index 00000000..33630144 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/README @@ -0,0 +1,143 @@ + +An SN76489AN Compatible Implementation in VHDL +============================================== +Version: $Date: 2006/06/18 19:28:40 $ + +Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +See the file COPYING. + + +Integration +----------- + +The sn76489 design exhibits all interface signals as the original chip. It +only differs in the audio data output which is provided as an 8 bit signed +vector instead of an analog output pin. + + generic ( + clock_div_16_g : integer := 1 + -- Set to '1' when operating the design in SN76489 mode. The primary clock + -- input is divided by 16 in this variant. The data sheet mentions the + -- SN76494 which contains a divide-by-2 clock input stage. Set the generic + -- to '0' to enable this mode. + ); + port ( + clock_i : in std_logic; + -- Primary clock input + -- Drive with the target frequency or any integer multiple of it. + + clock_en_i : in std_logic; + -- Clock enable + -- A '1' on this input qualifies a valid rising edge on clock_i. A '0' + -- disables the next rising clock edge, effectivley halting the design + -- until the next enabled rising clock edge. + -- Can be used to run the core at lower frequencies than applied on + -- clock_i. + + res_n_i : in std_logic; + -- Asynchronous low active reset input. + -- Sets all sequential elements to a known state. + + ce_n_i : in std_logic; + -- Chip enable, low active. + + we_n_i : in std_logic; + -- Write enable, low active. + + ready_o : out std_logic; + -- Ready indication to microprocessor. + + d_i : in std_logic_vector(0 to 7); + -- Data input + -- MSB 0 ... 7 LSB + + aout_o : out signed(0 to 7) + -- Audio output, signed vector + -- MSB/SIGN 0 ... 7 LSB + ); + + +Both 8 bit vector ports are defined (0 to 7) which declares bit 0 to be the +MSB and bit 7 to be the LSB. This has been implemented according to TI's data +sheet, thus all register/data format figures apply 1:1 for this design. +Many systems will flip the system data bus bit wise before it is connected to +this PSG. This is simply achieved with the following VHDL construct: + + signal data_s : std_logic_vector(7 downto 0); + + ... + d_i => data_s, + ... + +d_i and data_s will be assigned from left to right, resulting in the expected +bit assignment: + + d_i data_s + 0 7 + 1 6 + ... + 6 1 + 7 0 + + +As this design is fully synchronous, care has to be taken when the design +replaces an SN76489 in asynchronous mode. No problems are expected when +interfacing the code to other synchronous components. + + +Design Hierarchy +---------------- + + sn76489_top + | + +-- sn76489_latch_ctrl + | + +-- sn76489_clock_div + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + \-- sn76489_noise + | + \-- sn76489_attentuator + +Resulting compilation sequence: + + sn76489_comp_pack-p.vhd + sn76489_top.vhd + sn76489_latch_ctrl.vhd + sn76489_latch_ctrl-c.vhd + sn76489_clock_div.vhd + sn76489_clock_div-c.vhd + sn76489_attenuator.vhd + sn76489_attenuator-c.vhd + sn76489_tone.vhd + sn76489_tone-c.vhd + sn76489_noise.vhd + sn76489_noise-c.vhd + sn76489_top-c.vhd + +Skip the files containing VHDL configurations when analyzing the code for +synthesis. + + +References +---------- + +* TI Data sheet SN76489.pdf + ftp://ftp.whtech.com/datasheets%20&%20manuals/SN76489.pdf + +* John Kortink's article on the SN76489: + http://web.inter.nl.net/users/J.Kortink/home/articles/sn76489/ + +* Maxim's "SN76489 notes" in + http://www.smspower.org/maxim/docs/SN76489.txt diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_attenuator.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_attenuator.vhd new file mode 100644 index 00000000..444064e5 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_attenuator.vhd @@ -0,0 +1,114 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_attenuator.vhd,v 1.7 2006/02/27 20:30:10 arnim Exp $ +-- +-- Attenuator Module +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_attenuator is + + port ( + attenuation_i : in std_logic_vector(0 to 3); + factor_i : in signed(0 to 1); + product_o : out signed(0 to 7) + ); + +end sn76489_attenuator; + + +architecture rtl of sn76489_attenuator is + +begin + + ----------------------------------------------------------------------------- + -- Process attenuate + -- + -- Purpose: + -- Determine the attenuation and generate the resulting product. + -- + -- The maximum attenuation value is 31 which corresponds to volume off. + -- As described in the data sheet, the maximum "playing" attenuation is + -- 28 = 16 + 8 + 4 + -- + -- The table for the volume constants is derived from the following + -- formula (each step is 2dB voltage): + -- v(0) = 31 + -- v(n+1) = v(n) * 0.79432823 + -- + attenuate: process (attenuation_i, + factor_i) + + type volume_t is array (natural range 0 to 15) of natural; + constant volume_c : volume_t := + (31, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3, 2, 2, 2, 1, 0); + + variable attenuation_v : unsigned(attenuation_i'range); + variable volume_v : signed(product_o'range); + + begin + + attenuation_v := unsigned(attenuation_i); + + -- volume look-up table + volume_v := to_signed(volume_c(to_integer(attenuation_v)), + product_o'length); + + -- this replaces a multiplier and consumes a bit fewer + -- resources + case to_integer(factor_i) is + when +1 => + product_o <= volume_v; + when -1 => + product_o <= -volume_v; + when others => + product_o <= (others => '0'); + end case; + + end process attenuate; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_clock_div.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_clock_div.vhd new file mode 100644 index 00000000..eab86beb --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_clock_div.vhd @@ -0,0 +1,134 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_clock_div.vhd,v 1.4 2005/10/10 21:51:27 arnim Exp $ +-- +-- Clock Divider Circuit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity sn76489_clock_div is + + generic ( + clock_div_16_g : integer := 1 + ); + port ( + clock_i : in std_logic; + clock_en_i : in std_logic; + res_n_i : in std_logic; + clk_en_o : out boolean + ); + +end sn76489_clock_div; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of sn76489_clock_div is + + signal cnt_s, + cnt_q : unsigned(3 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the sequential counter element. + -- + seq: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + cnt_q <= (others => '0'); + elsif clock_i'event and clock_i = '1' then + cnt_q <= cnt_s; + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements the combinational counter logic. + -- + comb: process (clock_en_i, + cnt_q) + begin + -- default assignments + cnt_s <= cnt_q; + clk_en_o <= false; + + if clock_en_i = '1' then + + if cnt_q = 0 then + clk_en_o <= true; + + if clock_div_16_g = 1 then + cnt_s <= to_unsigned(15, cnt_q'length); + elsif clock_div_16_g = 0 then + cnt_s <= to_unsigned( 1, cnt_q'length); + else + -- pragma translate_off + assert false + report "Generic clock_div_16_g must be either 0 or 1." + severity failure; + -- pragma translate_on + end if; + + else + cnt_s <= cnt_q - 1; + + end if; + + end if; + + end process comb; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_latch_ctrl.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_latch_ctrl.vhd new file mode 100644 index 00000000..789720c2 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_latch_ctrl.vhd @@ -0,0 +1,138 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_latch_ctrl.vhd,v 1.6 2006/02/27 20:30:10 arnim Exp $ +-- +-- Latch Control Unit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity sn76489_latch_ctrl is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + ce_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector(0 to 7); + ready_o : out std_logic; + tone1_we_o : out boolean; + tone2_we_o : out boolean; + tone3_we_o : out boolean; + noise_we_o : out boolean; + r2_o : out std_logic + ); + +end sn76489_latch_ctrl; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of sn76489_latch_ctrl is + + signal reg_q : std_logic_vector(0 to 2); + signal we_q : boolean; + signal ready_q : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the sequential elements. + -- + seq: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + reg_q <= (others => '0'); + we_q <= false; + ready_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + -- READY Flag Output ---------------------------------------------------- + if ready_q = '0' and we_q then + if clk_en_i then + -- assert READY when write access happened + ready_q <= '1'; + end if; + elsif ce_n_i = '1' then + -- deassert READY when access has finished + ready_q <= '0'; + end if; + + -- Register Selection --------------------------------------------------- + if ce_n_i = '0' and we_n_i = '0' then + if clk_en_i then + if d_i(0) = '1' then + reg_q <= d_i(1 to 3); + end if; + we_q <= true; + end if; + else + we_q <= false; + end if; + + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output mapping + ----------------------------------------------------------------------------- + tone1_we_o <= reg_q(0 to 1) = "00" and we_q; + tone2_we_o <= reg_q(0 to 1) = "01" and we_q; + tone3_we_o <= reg_q(0 to 1) = "10" and we_q; + noise_we_o <= reg_q(0 to 1) = "11" and we_q; + + r2_o <= reg_q(2); + + ready_o <= ready_q + when ce_n_i = '0' else + '1'; + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_noise.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_noise.vhd new file mode 100644 index 00000000..688bdd56 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_noise.vhd @@ -0,0 +1,278 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_noise.vhd,v 1.6 2006/02/27 20:30:10 arnim Exp $ +-- +-- Noise Generator +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_noise is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + we_i : in boolean; + d_i : in std_logic_vector(0 to 7); + r2_i : in std_logic; + tone3_ff_i : in std_logic; + noise_o : out signed(0 to 7) + ); + +end sn76489_noise; + +architecture rtl of sn76489_noise is + + signal nf_q : std_logic_vector(0 to 1); + signal fb_q : std_logic; + signal a_q : std_logic_vector(0 to 3); + signal freq_cnt_q : unsigned(0 to 6); + signal freq_ff_q : std_logic; + + signal shift_source_s, + shift_source_q : std_logic; + signal shift_rise_edge_s : boolean; + + signal lfsr_q : std_logic_vector(0 to 15); + + signal freq_s : signed(0 to 1); + +begin + + ----------------------------------------------------------------------------- + -- Process cpu_regs + -- + -- Purpose: + -- Implements the registers writable by the CPU. + -- + cpu_regs: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + nf_q <= (others => '0'); + fb_q <= '0'; + a_q <= (others => '1'); + + elsif clock_i'event and clock_i = '1' then + if clk_en_i and we_i then + if r2_i = '0' then + -- access to control register + -- both access types can write to the control register! + nf_q <= d_i(6 to 7); + fb_q <= d_i(5); + + else + -- access to attenuator register + -- both access types can write to the attenuator register! + a_q <= d_i(4 to 7); + + end if; + end if; + end if; + end process cpu_regs; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process freq_gen + -- + -- Purpose: + -- Implements the frequency generation components. + -- + freq_gen: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + freq_cnt_q <= (others => '0'); + freq_ff_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if freq_cnt_q = 0 then + -- reload frequency counter according to NF setting + case nf_q is + when "00" => + freq_cnt_q <= to_unsigned(16 * 2 - 1, freq_cnt_q'length); + when "01" => + freq_cnt_q <= to_unsigned(16 * 4 - 1, freq_cnt_q'length); + when "10" => + freq_cnt_q <= to_unsigned(16 * 8 - 1, freq_cnt_q'length); + when others => + null; + end case; + + freq_ff_q <= not freq_ff_q; + + else + -- decrement frequency counter + freq_cnt_q <= freq_cnt_q - 1; + + end if; + + end if; + end if; + end process freq_gen; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Multiplex the source of the LFSR's shift enable + ----------------------------------------------------------------------------- + shift_source_s <= tone3_ff_i + when nf_q = "11" else + freq_ff_q; + + ----------------------------------------------------------------------------- + -- Process rise_edge + -- + -- Purpose: + -- Detect the rising edge of the selected LFSR shift source. + -- + rise_edge: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + shift_source_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + shift_source_q <= shift_source_s; + end if; + end if; + end process rise_edge; + -- + ----------------------------------------------------------------------------- + + -- detect rising edge on shift source + shift_rise_edge_s <= shift_source_q = '0' and shift_source_s = '1'; + + + ----------------------------------------------------------------------------- + -- Process lfsr + -- + -- Purpose: + -- Implements the LFSR that generates noise. + -- Note: This implementation shifts the register right, i.e. from index + -- 15 towards 0 => bit 15 is the input, bit 0 is the output + -- + -- Tapped bits according to MAME's sn76496.c, implemented in function + -- lfsr_tapped_f. + -- + lfsr: process (clock_i, res_n_i) + + function lfsr_tapped_f(lfsr : in std_logic_vector) return std_logic is + constant tapped_bits_c : std_logic_vector(0 to 15) + -- tapped bits are 0, 2, 15 + := "1010000000000001"; + variable parity_v : std_logic; + begin + parity_v := '0'; + + for idx in lfsr'low to lfsr'high loop + parity_v := parity_v xor (lfsr(idx) and tapped_bits_c(idx)); + end loop; + + return parity_v; + end; + + begin + if res_n_i = '0' then + -- reset LFSR to "0000000000000001" + lfsr_q <= (others => '0'); + lfsr_q(lfsr_q'right) <= '1'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if we_i and r2_i = '0' then + -- write to noise register + -- -> reset LFSR + lfsr_q <= (others => '0'); + lfsr_q(lfsr_q'right) <= '1'; + + elsif shift_rise_edge_s then + + -- shift LFSR left towards MSB + for idx in lfsr_q'right-1 downto lfsr_q'left loop + lfsr_q(idx) <= lfsr_q(idx+1); + end loop; + + -- determine input bit + if fb_q = '0' then + -- "Periodic" Noise + -- -> input to LFSR is output + lfsr_q(lfsr_q'right) <= lfsr_q(lfsr_q'left); + else + -- "White" Noise + -- -> input to LFSR is parity of tapped bits + lfsr_q(lfsr_q'right) <= lfsr_tapped_f(lfsr_q); + end if; + + end if; + + end if; + end if; + end process lfsr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Map output of LFSR to signed value for attenuator. + ----------------------------------------------------------------------------- + freq_s <= to_signed(+1, 2) + when lfsr_q(0) = '1' else + to_signed( 0, 2); + + + ----------------------------------------------------------------------------- + -- The attenuator itself + ----------------------------------------------------------------------------- + attenuator_b : entity work.sn76489_attenuator + port map ( + attenuation_i => a_q, + factor_i => freq_s, + product_o => noise_o + ); + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_tone.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_tone.vhd new file mode 100644 index 00000000..3658efcc --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_tone.vhd @@ -0,0 +1,188 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_tone.vhd,v 1.5 2006/02/27 20:30:10 arnim Exp $ +-- +-- Tone Generator +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_tone is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + we_i : in boolean; + d_i : in std_logic_vector(0 to 7); + r2_i : in std_logic; + ff_o : out std_logic; + tone_o : out signed(0 to 7) + ); + +end sn76489_tone; + +architecture rtl of sn76489_tone is + + signal f_q : std_logic_vector(0 to 9); + signal a_q : std_logic_vector(0 to 3); + signal freq_cnt_q : unsigned(0 to 9); + signal freq_ff_q : std_logic; + + signal freq_s : signed(0 to 1); + + function all_zero(a : in std_logic_vector) return boolean is + variable result_v : boolean; + begin + result_v := true; + + for idx in a'low to a'high loop + if a(idx) /= '0' then + result_v := false; + end if; + end loop; + + return result_v; + end; + +begin + + ----------------------------------------------------------------------------- + -- Process cpu_regs + -- + -- Purpose: + -- Implements the registers writable by the CPU. + -- + cpu_regs: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + f_q <= (others => '0'); + a_q <= (others => '1'); + + elsif clock_i'event and clock_i = '1' then + if clk_en_i and we_i then + if r2_i = '0' then + -- access to frequency register + if d_i(0) = '0' then + f_q(0 to 5) <= d_i(2 to 7); + else + f_q(6 to 9) <= d_i(4 to 7); + end if; + + else + -- access to attenuator register + -- both access types can write to the attenuator register! + a_q <= d_i(4 to 7); + + end if; + end if; + end if; + end process cpu_regs; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process freq_gen + -- + -- Purpose: + -- Implements the frequency generation components. + -- + freq_gen: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + freq_cnt_q <= (others => '0'); + freq_ff_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if freq_cnt_q = 0 then + -- update counter from frequency register + freq_cnt_q <= unsigned(f_q); + + -- and toggle the frequency flip-flop if enabled + if not all_zero(f_q) then + freq_ff_q <= not freq_ff_q; + else + -- if frequency setting is 0, then keep flip-flop at +1 + freq_ff_q <= '1'; + end if; + + else + -- decrement frequency counter + freq_cnt_q <= freq_cnt_q - 1; + + end if; + end if; + end if; + end process freq_gen; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Map frequency flip-flop to signed value for attenuator. + ----------------------------------------------------------------------------- + freq_s <= to_signed(+1, 2) + when freq_ff_q = '1' else + to_signed(-1, 2); + + + ----------------------------------------------------------------------------- + -- The attenuator itself + ----------------------------------------------------------------------------- + attenuator_b : entity work.sn76489_attenuator + port map ( + attenuation_i => a_q, + factor_i => freq_s, + product_o => tone_o + ); + + + ----------------------------------------------------------------------------- + -- Output mapping + ----------------------------------------------------------------------------- + ff_o <= freq_ff_q; + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_top.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_top.vhd new file mode 100644 index 00000000..c26d0e1a --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/sound/sn76489/sn76489_top.vhd @@ -0,0 +1,200 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_top.vhd,v 1.9 2006/02/27 20:30:10 arnim Exp $ +-- +-- Chip Toplevel +-- +-- References: +-- +-- * TI Data sheet SN76489.pdf +-- ftp://ftp.whtech.com/datasheets%20&%20manuals/SN76489.pdf +-- +-- * John Kortink's article on the SN76489: +-- http://web.inter.nl.net/users/J.Kortink/home/articles/sn76489/ +-- +-- * Maxim's "SN76489 notes" in +-- http://www.smspower.org/maxim/docs/SN76489.txt +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library ieee; +use ieee.numeric_std.all; + +entity sn76489_top is + + generic ( + clock_div_16_g : integer := 1 + ); + port ( + clock_i : in std_logic; + clock_en_i : in std_logic; + res_n_i : in std_logic; + ce_n_i : in std_logic; + we_n_i : in std_logic; + ready_o : out std_logic; + d_i : in std_logic_vector(0 to 7); + aout_o : out signed(0 to 7) + ); + +end sn76489_top; + +architecture struct of sn76489_top is + + signal clk_en_s : boolean; + + signal tone1_we_s, + tone2_we_s, + tone3_we_s, + noise_we_s : boolean; + signal r2_s : std_logic; + + signal tone1_s, + tone2_s, + tone3_s, + noise_s : signed(0 to 7); + + signal tone3_ff_s : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Clock Divider + ----------------------------------------------------------------------------- + clock_div_b : entity work.sn76489_clock_div + generic map ( + clock_div_16_g => clock_div_16_g + ) + port map ( + clock_i => clock_i, + clock_en_i => clock_en_i, + res_n_i => res_n_i, + clk_en_o => clk_en_s + ); + + + ----------------------------------------------------------------------------- + -- Latch Control = CPU Interface + ----------------------------------------------------------------------------- + latch_ctrl_b : entity work.sn76489_latch_ctrl + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + ce_n_i => ce_n_i, + we_n_i => we_n_i, + d_i => d_i, + ready_o => ready_o, + tone1_we_o => tone1_we_s, + tone2_we_o => tone2_we_s, + tone3_we_o => tone3_we_s, + noise_we_o => noise_we_s, + r2_o => r2_s + ); + + + ----------------------------------------------------------------------------- + -- Tone Channel 1 + ----------------------------------------------------------------------------- + tone1_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone1_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => open, + tone_o => tone1_s + ); + + ----------------------------------------------------------------------------- + -- Tone Channel 2 + ----------------------------------------------------------------------------- + tone2_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone2_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => open, + tone_o => tone2_s + ); + + ----------------------------------------------------------------------------- + -- Tone Channel 3 + ----------------------------------------------------------------------------- + tone3_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone3_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => tone3_ff_s, + tone_o => tone3_s + ); + + ----------------------------------------------------------------------------- + -- Noise Channel + ----------------------------------------------------------------------------- + noise_b : entity work.sn76489_noise + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => noise_we_s, + d_i => d_i, + r2_i => r2_s, + tone3_ff_i => tone3_ff_s, + noise_o => noise_s + ); + + + aout_o <= tone1_s + tone2_s + tone3_s + noise_s; + +end struct; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/spram.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/spram.vhd new file mode 100644 index 00000000..fa4a1fd7 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/spram.vhd @@ -0,0 +1,84 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY spram IS + GENERIC + ( + widthad_a : natural; + width_a : natural := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + data : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + COMPONENT altsyncram + GENERIC ( + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + power_up_uninitialized : STRING; + read_during_write_mode_port_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + wren_a : IN STD_LOGIC ; + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + wren_a => wren, + clock0 => clock, + address_a => address, + data_a => data, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ttl_175.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ttl_175.vhd new file mode 100644 index 00000000..b6459332 --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ttl_175.vhd @@ -0,0 +1,129 @@ +------------------------------------------------------------------------------- +-- +-- TTL 74175 - Quad D-Type Flip-Flops with Clear +-- +-- $Id: ttl_175.vhd,v 1.5 2005/10/10 21:59:13 arnim Exp $ +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ttl_175 is + + port ( + ck_i : in std_logic; + ck_en_i : in std_logic; + por_n_i : in std_logic; + cl_n_i : in std_logic; + d_i : in std_logic_vector(4 downto 1); + q_o : out std_logic_vector(4 downto 1); + q_n_o : out std_logic_vector(4 downto 1); + d_o : out std_logic_vector(4 downto 1); + d_n_o : out std_logic_vector(4 downto 1) + ); + +end ttl_175; + + +architecture rtl of ttl_175 is + + signal flops_q, + flops_s : std_logic_vector(4 downto 1); + +begin + + ----------------------------------------------------------------------------- + -- Process flops + -- + -- Purpose: + -- Implement the sequential elements. + -- + -- Note: We assume that the sequential elements power-up to the same state + -- as forced into by cl_n_i. + -- + flops: process (ck_i, por_n_i) + begin + if por_n_i = '0' then + flops_q <= (others => '0'); + elsif ck_i'event and ck_i = '1' then + flops_q <= flops_s; + end if; + end process flops; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements the combinational logic. + -- + comb: process (flops_q, + cl_n_i, + d_i, + ck_en_i) + begin + -- default assignments + flops_s <= flops_q; + + if cl_n_i = '1' then + if ck_en_i = '1' then + flops_s <= d_i; + end if; + + else + -- pseudo-asynchronous clear + flops_s <= (others => '0'); + end if; + end process comb; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + q_o <= flops_q; + q_n_o <= not flops_q; + d_o <= flops_s; + d_n_o <= not flops_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ttl_393.vhd b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ttl_393.vhd new file mode 100644 index 00000000..3ef25d4b --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/ttl_393.vhd @@ -0,0 +1,152 @@ +------------------------------------------------------------------------------- +-- +-- TTL 74LS393 - Dual 4-Bit Binary Counter +-- +-- $Id: ttl_393.vhd,v 1.3 2005/10/10 21:59:13 arnim Exp $ +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ttl_393 is + + port ( + ck_i : in std_logic; + ck_en_i : in std_logic_vector(2 downto 1); + por_n_i : in std_logic; + cl_i : in std_logic_vector(2 downto 1); + qa_o : out std_logic_vector(2 downto 1); + qb_o : out std_logic_vector(2 downto 1); + qc_o : out std_logic_vector(2 downto 1); + qd_o : out std_logic_vector(2 downto 1); + da_o : out std_logic_vector(2 downto 1); + db_o : out std_logic_vector(2 downto 1); + dc_o : out std_logic_vector(2 downto 1); + dd_o : out std_logic_vector(2 downto 1) + ); + +end ttl_393; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ttl_393 is + + type cnt_q_t is array (natural range 2 downto 1) of unsigned(3 downto 0); + type cnt_d_t is array (natural range 2 downto 1) of unsigned(4 downto 0); + signal cnt_q : cnt_q_t; + signal cnt_s : cnt_d_t; + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the flip-flops. + -- + -- Note: We assume that the sequential elements power-up to the same state + -- as forced into by cl_i. + -- + seq: process (ck_i, por_n_i) + begin + if por_n_i = '0' then + cnt_q(1) <= (others => '0'); + cnt_q(2) <= (others => '0'); + elsif ck_i'event and ck_i = '1' then + cnt_q(1) <= cnt_s(1)(3 downto 0); + cnt_q(2) <= cnt_s(2)(3 downto 0); + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process adder + -- + -- Purpose: + -- Implements the adder. + -- + adder: process (ck_en_i, + cl_i, + cnt_q) + begin + for idx in 2 downto 1 loop + cnt_s(idx) <= '0' & cnt_q(idx); + + if cl_i(idx) = '0' then + if ck_en_i(idx) = '1' then + -- increment upon enable + cnt_s(idx) <= ('0' & cnt_q(idx)) + 1; + end if; + + else + -- pseudo-asynchronous clear + cnt_s(idx) <= (others => '0'); + end if; + end loop; + end process adder; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + qa_o(1) <= cnt_q(1)(0); + qb_o(1) <= cnt_q(1)(1); + qc_o(1) <= cnt_q(1)(2); + qd_o(1) <= cnt_q(1)(3); + qa_o(2) <= cnt_q(2)(0); + qb_o(2) <= cnt_q(2)(1); + qc_o(2) <= cnt_q(2)(2); + qd_o(2) <= cnt_q(2)(3); + da_o(1) <= cnt_s(1)(0); + db_o(1) <= cnt_s(1)(1); + dc_o(1) <= cnt_s(1)(2); + dd_o(1) <= cnt_s(1)(3); + da_o(2) <= cnt_s(2)(0); + db_o(2) <= cnt_s(2)(1); + dc_o(2) <= cnt_s(2)(2); + dd_o(2) <= cnt_s(2)(3); + +end rtl; diff --git a/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/video_mixer.sv b/Arcade/Ladybug Hardware/LadyBug_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Ladybug Hardware/LadyBug_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/Arcade/Ladybug Hardware/Snapjack_MiST/README.txt b/Arcade/Ladybug Hardware/Snapjack_MiST/README.txt new file mode 100644 index 00000000..dfd6ccd6 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Snapjack port to MiST by Gehstock +-- 14 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Lady Bug hardware +-- Unknown Author on Papilio Plus board. +--------------------------------------------------------------------------------- +-- +-- +-- Only controls are rotated on VGA output. +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + + +ToDo : Sound diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/Release/Snapjack.rbf b/Arcade/Ladybug Hardware/Snapjack_MiST/Release/Snapjack.rbf new file mode 100644 index 00000000..34d39896 Binary files /dev/null and b/Arcade/Ladybug Hardware/Snapjack_MiST/Release/Snapjack.rbf differ diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/Snapjack.qpf b/Arcade/Ladybug Hardware/Snapjack_MiST/Snapjack.qpf new file mode 100644 index 00000000..4709662f --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/Snapjack.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Snapjack" diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/Snapjack.qsf b/Arcade/Ladybug Hardware/Snapjack_MiST/Snapjack.qsf new file mode 100644 index 00000000..55249b70 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/Snapjack.qsf @@ -0,0 +1,206 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 10:02:22 November 16, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Snapjack_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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 QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_top.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_tone.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_noise.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_latch_ctrl.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_clock_div.vhd +set_global_assignment -name VHDL_FILE rtl/sound/sn76489/sn76489_attenuator.vhd +set_global_assignment -name VHDL_FILE rtl/sound/ladybug_sound_unit.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_sprite_u.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_sprite_l.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_cpu3.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_cpu2.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_cpu1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_char_u.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/rom_char_l.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_decrypt.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_10_3.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_10_2.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom_10_1.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80a.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ttl_393.vhd +set_global_assignment -name VHDL_FILE rtl/ttl_175.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_video_unit.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_video_timing.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_sprite_ctrl.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_sprite.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_rgb.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_res.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_rams.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_machine.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_gpio.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_dip_pack.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_cpu_unit.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_counter.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_clk.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_chutes.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_chute.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_char.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug_addr_dec.vhd +set_global_assignment -name VHDL_FILE rtl/ladybug.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Snapjack.sv +set_global_assignment -name VHDL_FILE rtl/dpram.vhd + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# 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 SAVE_DISK_SPACE OFF +set_global_assignment -name TOP_LEVEL_ENTITY Snapjack + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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 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 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_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(CosmicAvenger) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(CosmicAvenger) +# ------------------- +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" +set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/Snapjack.srf b/Arcade/Ladybug Hardware/Snapjack_MiST/Snapjack.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/Snapjack.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/clean.bat b/Arcade/Ladybug Hardware/Snapjack_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_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/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/prom_10_1.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/prom_10_1.vhd new file mode 100644 index 00000000..31cb8a94 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/prom_10_1.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_10_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_10_1 is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"9D",X"11",X"B8",X"00",X"79",X"62",X"18",X"00",X"9E",X"25",X"DA",X"00",X"D7",X"A3",X"79", + X"00",X"DE",X"29",X"74",X"00",X"D4",X"75",X"9D",X"00",X"AD",X"86",X"97",X"00",X"5A",X"4C",X"17"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/prom_10_2.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/prom_10_2.vhd new file mode 100644 index 00000000..51862067 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/prom_10_2.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_10_2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_10_2 is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F5",X"05",X"54",X"C1",X"C4",X"94",X"84",X"24",X"D0",X"90",X"A1",X"00",X"31",X"50",X"25",X"F5", + X"90",X"31",X"05",X"25",X"05",X"94",X"30",X"41",X"05",X"94",X"61",X"30",X"94",X"50",X"05",X"A5"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/prom_10_3.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/prom_10_3.vhd new file mode 100644 index 00000000..a731ff5c --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/prom_10_3.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity prom_10_3 is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of prom_10_3 is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"37",X"3A",X"3A",X"3A",X"3A",X"28",X"28",X"38",X"38", + X"08",X"08",X"38",X"38",X"20",X"20",X"38",X"38",X"20",X"20",X"38",X"38",X"3E",X"3E",X"3E",X"3E"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/prom_decrypt.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/prom_decrypt.vhd new file mode 100644 index 00000000..00f98d21 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/prom_decrypt.vhd @@ -0,0 +1,63 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity prom_decrypt is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(7 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of prom_decrypt is + + + type ROM_ARRAY is array(0 to 255) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"01",x"02",x"03",x"04",x"05",x"06",x"07", -- 0x0000 + x"08",x"09",x"0A",x"0B",x"0C",x"0D",x"0E",x"0F", -- 0x0008 + x"10",x"11",x"12",x"13",x"14",x"15",x"16",x"17", -- 0x0010 + x"18",x"19",x"1A",x"1B",x"1C",x"1D",x"1E",x"1F", -- 0x0018 + x"20",x"21",x"22",x"23",x"24",x"25",x"26",x"27", -- 0x0020 + x"28",x"29",x"2A",x"2B",x"2C",x"2D",x"2E",x"2F", -- 0x0028 + x"30",x"31",x"32",x"33",x"34",x"35",x"36",x"37", -- 0x0030 + x"38",x"39",x"3A",x"3B",x"3C",x"3D",x"3E",x"3F", -- 0x0038 + x"40",x"41",x"42",x"43",x"44",x"45",x"46",x"47", -- 0x0040 + x"48",x"49",x"4A",x"4B",x"4C",x"4D",x"4E",x"4F", -- 0x0048 + x"50",x"51",x"52",x"53",x"54",x"55",x"56",x"57", -- 0x0050 + x"58",x"59",x"5A",x"5B",x"5C",x"5D",x"5E",x"5F", -- 0x0058 + x"60",x"61",x"62",x"63",x"64",x"65",x"66",x"67", -- 0x0060 + x"68",x"69",x"6A",x"6B",x"6C",x"6D",x"6E",x"6F", -- 0x0068 + x"70",x"71",x"72",x"73",x"74",x"75",x"76",x"77", -- 0x0070 + x"78",x"79",x"7A",x"7B",x"7C",x"7D",x"7E",x"7F", -- 0x0078 + x"80",x"81",x"82",x"83",x"84",x"85",x"86",x"87", -- 0x0080 + x"88",x"89",x"8A",x"8B",x"8C",x"8D",x"8E",x"8F", -- 0x0088 + x"90",x"91",x"92",x"93",x"94",x"95",x"96",x"97", -- 0x0090 + x"98",x"99",x"9A",x"9B",x"9C",x"9D",x"9E",x"9F", -- 0x0098 + x"A0",x"A1",x"A2",x"A3",x"A4",x"A5",x"A6",x"A7", -- 0x00A0 + x"A8",x"A9",x"AA",x"AB",x"AC",x"AD",x"AE",x"AF", -- 0x00A8 + x"B0",x"B1",x"B2",x"B3",x"B4",x"B5",x"B6",x"B7", -- 0x00B0 + x"B8",x"B9",x"BA",x"BB",x"BC",x"BD",x"BE",x"BF", -- 0x00B8 + x"C0",x"C1",x"C2",x"C3",x"C4",x"C5",x"C6",x"C7", -- 0x00C0 + x"C8",x"C9",x"CA",x"CB",x"CC",x"CD",x"CE",x"CF", -- 0x00C8 + x"D0",x"D1",x"D2",x"D3",x"D4",x"D5",x"D6",x"D7", -- 0x00D0 + x"D8",x"D9",x"DA",x"DB",x"DC",x"DD",x"DE",x"DF", -- 0x00D8 + x"E0",x"E1",x"E2",x"E3",x"E4",x"E5",x"E6",x"E7", -- 0x00E0 + x"E8",x"E9",x"EA",x"EB",x"EC",x"ED",x"EE",x"EF", -- 0x00E8 + x"F0",x"F1",x"F2",x"F3",x"F4",x"F5",x"F6",x"F7", -- 0x00F0 + x"F8",x"F9",x"FA",x"FB",x"FC",x"FD",x"FE",x"FF" -- 0x00F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_char_l.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_char_l.vhd new file mode 100644 index 00000000..1780bb2c --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_char_l.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_char_l is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_char_l is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"04",X"0C",X"02",X"02",X"FE",X"FE",X"44",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"26",X"AF",X"AF",X"AF",X"2E",X"FC",X"00",X"0F",X"FE",X"16",X"0E",X"16",X"FE",X"0F",X"00", + X"68",X"FA",X"9B",X"0B",X"9B",X"FA",X"68",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00", + X"10",X"10",X"10",X"FF",X"FF",X"10",X"10",X"10",X"00",X"E7",X"A5",X"E5",X"E5",X"A5",X"E7",X"00", + X"3F",X"63",X"41",X"00",X"00",X"41",X"63",X"3F",X"00",X"30",X"20",X"20",X"20",X"20",X"20",X"00", + X"00",X"70",X"50",X"40",X"70",X"10",X"70",X"00",X"00",X"70",X"40",X"70",X"40",X"40",X"70",X"00", + X"00",X"10",X"10",X"50",X"50",X"70",X"40",X"00",X"00",X"70",X"10",X"70",X"40",X"40",X"70",X"00", + X"00",X"70",X"10",X"70",X"50",X"50",X"70",X"00",X"00",X"70",X"40",X"40",X"40",X"40",X"40",X"00", + X"00",X"70",X"50",X"70",X"50",X"50",X"70",X"00",X"00",X"70",X"50",X"70",X"40",X"40",X"40",X"00", + X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"F8",X"00",X"04",X"0F",X"FF",X"FB",X"E5",X"9E",X"6E", + X"00",X"0F",X"B7",X"57",X"DB",X"CB",X"9C",X"9C",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"13",X"00",X"00",X"00",X"00",X"00",X"00",X"90",X"D8", + X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"F8",X"00",X"00",X"00",X"00",X"04",X"0D",X"13",X"9F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"BC",X"BF",X"BC",X"BC",X"BC", + X"00",X"00",X"00",X"01",X"07",X"01",X"01",X"81",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"0D", + X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"3C",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"1C", + X"00",X"18",X"6C",X"EE",X"6C",X"6C",X"6C",X"6C",X"00",X"00",X"00",X"10",X"DC",X"B0",X"30",X"D8", + X"FC",X"F0",X"C6",X"88",X"60",X"80",X"00",X"00",X"01",X"03",X"0F",X"3F",X"FC",X"F1",X"E6",X"9C", + X"9C",X"9C",X"8C",X"88",X"80",X"83",X"87",X"8F",X"DD",X"9D",X"89",X"8B",X"97",X"95",X"B5",X"A9", + X"1D",X"1D",X"0D",X"0D",X"0D",X"0D",X"F1",X"8D",X"DE",X"B2",X"B6",X"B5",X"AF",X"A7",X"66",X"07", + X"F0",X"70",X"60",X"61",X"61",X"61",X"61",X"61",X"AC",X"AF",X"AF",X"A3",X"A3",X"A3",X"A3",X"B3", + X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"0D",X"BC",X"BC",X"BC",X"BC",X"BC",X"BC",X"BC",X"7C", + X"E1",X"11",X"71",X"71",X"71",X"71",X"6E",X"71",X"0D",X"8B",X"8B",X"9B",X"9A",X"9A",X"96",X"94", + X"DF",X"EF",X"F7",X"7B",X"3B",X"1B",X"1B",X"1B",X"DB",X"EB",X"E0",X"60",X"60",X"60",X"20",X"20", + X"6C",X"6C",X"6C",X"AC",X"5C",X"3C",X"DC",X"EC",X"EC",X"F4",X"7C",X"3F",X"1C",X"1D",X"15",X"11", + X"30",X"F8",X"FC",X"FC",X"0E",X"76",X"F6",X"3C",X"20",X"01",X"03",X"07",X"1F",X"FE",X"F8",X"F2", + X"AF",X"AF",X"AF",X"AF",X"AF",X"B7",X"D3",X"19",X"AD",X"CD",X"FD",X"DD",X"AD",X"8D",X"8D",X"0C", + X"1D",X"8D",X"CD",X"CD",X"AD",X"ED",X"E9",X"80",X"43",X"C6",X"FC",X"D3",X"9D",X"B1",X"80",X"00", + X"63",X"62",X"62",X"66",X"66",X"65",X"75",X"00",X"D3",X"61",X"61",X"B3",X"BB",X"C3",X"C3",X"C2", + X"26",X"6B",X"7D",X"5D",X"0E",X"0E",X"05",X"03",X"BC",X"BC",X"BC",X"BC",X"BC",X"BC",X"9C",X"EE", + X"39",X"4B",X"DB",X"39",X"B5",X"3D",X"1D",X"10",X"B4",X"AC",X"2F",X"6D",X"69",X"5B",X"5C",X"80", + X"17",X"17",X"37",X"2F",X"1E",X"FE",X"F8",X"00",X"00",X"00",X"00",X"00",X"88",X"A7",X"79",X"3E", + X"EC",X"6C",X"6C",X"6E",X"9F",X"3F",X"CC",X"F1",X"28",X"28",X"2C",X"5E",X"B9",X"DA",X"EB",X"F1", + X"3C",X"18",X"10",X"10",X"20",X"00",X"60",X"C0",X"F4",X"40",X"40",X"80",X"80",X"00",X"00",X"00", + X"BC",X"9E",X"0F",X"07",X"03",X"01",X"00",X"00",X"0F",X"8F",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C1",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"87",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"9F",X"FF",X"FF",X"FC",X"70",X"00",X"B8",X"F7",X"7B",X"3D",X"1E",X"0E",X"07",X"07",X"03", + X"19",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"E1",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"07",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"FF",X"00",X"00",X"00",X"00",X"F0",X"FF",X"FF",X"FF", + X"00",X"00",X"F8",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"0F",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"FF", + X"00",X"00",X"00",X"00",X"00",X"FC",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FC",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"FC",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"FC",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"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"3F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"3F",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"3F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"FF",X"00",X"00",X"00",X"00",X"00",X"F0",X"FF",X"FF", + X"00",X"00",X"80",X"F0",X"FF",X"FF",X"FF",X"FF",X"F8",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"00",X"00",X"00",X"00",X"C0",X"F8",X"FF",X"FF", + X"00",X"00",X"80",X"FC",X"FF",X"FF",X"FF",X"FF",X"00",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F8",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"01",X"1F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"03",X"1F",X"FF",X"FF",X"1F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"00",X"00",X"01",X"0F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"0F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"FF",X"00",X"00",X"00",X"00",X"C0",X"F8",X"FF",X"FF", + X"80",X"E0",X"F8",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"80",X"E0",X"F8",X"FE",X"80",X"E0",X"F8",X"FE",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"80",X"E0",X"F8",X"FF", + X"00",X"00",X"F0",X"FE",X"FF",X"FF",X"FF",X"FF",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"07",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"0F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"07",X"1F",X"7F", + X"01",X"07",X"1F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"01",X"07",X"1F",X"7F",X"01",X"07",X"1F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"03",X"1F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"FF",X"00",X"00",X"C0",X"F0",X"FC",X"FF",X"FF",X"FF", + X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"80",X"C0",X"F0",X"F8", + X"F0",X"F8",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0", + X"00",X"C0",X"E0",X"F0",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"00",X"00",X"00",X"00",X"00",X"E0",X"F8",X"FE",X"00",X"80",X"F0",X"FC",X"FF",X"FF",X"FF",X"FF", + X"F8",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"01",X"0F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"07",X"1F",X"7F",X"00",X"03",X"07",X"0F",X"3F",X"FF",X"FF",X"FF", + X"0F",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03", + X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F", + X"00",X"00",X"03",X"0F",X"3F",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"00",X"33",X"33",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"FF",X"00",X"C0",X"E0",X"F0",X"F8",X"FE",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"80",X"E0",X"F0",X"F8",X"FC",X"FE", + X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"80",X"C0",X"E0",X"E0",X"F0",X"F8",X"FC", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"80",X"80",X"C0",X"E0",X"F0",X"F8",X"FC",X"FE", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"80",X"E0",X"F0",X"F8",X"FC",X"FE",X"FF", + X"3E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"01",X"07",X"0F",X"3F",X"FF",X"FF", + X"03",X"0F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"E0",X"F0",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"1E",X"7F",X"FF", + X"03",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"07",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"F8", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"1F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"F8", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"1F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"80",X"C0",X"F8",X"FF",X"E0",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"80",X"C0",X"C0",X"E0",X"F0",X"F8",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C0",X"C0",X"E0",X"F0",X"F8",X"F8",X"FC",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"F0",X"F0",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"80",X"80",X"C0",X"E0",X"F0", + X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"80",X"C0",X"C0",X"E0",X"F0",X"F8",X"F8",X"FC", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"F8",X"FC",X"FE",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"1F",X"3F",X"7F",X"FF", + X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"03",X"03",X"07",X"0F",X"0F",X"1F",X"3F", + X"0F",X"1F",X"3F",X"3F",X"7F",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0F", + X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"03",X"03",X"07",X"0F",X"1F",X"1F",X"3F",X"7F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"01",X"03",X"03",X"07",X"0F",X"1F",X"07",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"07",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"01",X"1F",X"FF", + X"FF",X"F8",X"E0",X"C0",X"80",X"80",X"00",X"00",X"C0",X"C0",X"80",X"80",X"80",X"80",X"00",X"00", + X"F0",X"F0",X"E0",X"E0",X"E0",X"E0",X"C0",X"C0",X"F8",X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0", + X"FE",X"FE",X"FE",X"FE",X"FC",X"FC",X"FC",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"E0",X"E0",X"E0",X"C0",X"C0",X"C0", + X"FC",X"FC",X"FC",X"F8",X"F8",X"F8",X"F8",X"F0",X"FF",X"FF",X"FF",X"FE",X"FE",X"FE",X"FE",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"FE",X"FC",X"F8",X"E0",X"C0", + X"FF",X"FF",X"FF",X"7F",X"3F",X"1F",X"07",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"07",X"07",X"03",X"03",X"03",X"01",X"01",X"1F",X"1F",X"1F",X"0F",X"0F",X"0F",X"0F",X"07", + X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"03",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"0F",X"07",X"07",X"07",X"07",X"03",X"03",X"03", + X"1F",X"1F",X"1F",X"1F",X"0F",X"0F",X"0F",X"0F",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"07",X"03",X"01",X"01",X"00",X"00", + X"FF",X"FC",X"F8",X"F0",X"E0",X"C0",X"C0",X"80",X"F0",X"E0",X"C0",X"C0",X"80",X"80",X"00",X"00", + X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"F8",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"FC",X"F8",X"F8",X"F8",X"F0",X"E0",X"C0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE", + X"1F",X"1F",X"0F",X"0F",X"07",X"03",X"03",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"3F", + X"FF",X"F7",X"E1",X"C1",X"C0",X"80",X"00",X"00",X"7C",X"38",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"FE",X"0F",X"07",X"07",X"03",X"03",X"01",X"01",X"00", + X"FF",X"FF",X"FF",X"7F",X"3F",X"3F",X"1F",X"1F",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"1F",X"0F",X"07",X"07",X"03",X"03",X"01",X"FF",X"F8",X"F0",X"E0",X"C0",X"80",X"00",X"00", + X"FC",X"F8",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE", + X"FC",X"F8",X"70",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"FE", + X"FF",X"F1",X"C0",X"80",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"78", + X"3F",X"1F",X"0F",X"07",X"03",X"01",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"3F", + X"1F",X"0F",X"07",X"03",X"01",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"3F",X"3F", + X"FF",X"1F",X"07",X"01",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00", + X"E0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"80",X"F0",X"F0",X"F0",X"E0",X"E0",X"E0",X"E0",X"E0", + X"FF",X"FE",X"FC",X"FC",X"F8",X"F8",X"F8",X"F0",X"FC",X"FC",X"F8",X"F8",X"F0",X"F0",X"E0",X"C0", + X"FF",X"FF",X"FE",X"FE",X"FE",X"FE",X"FE",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3F",X"1F",X"1F",X"1F",X"0F",X"0F",X"07",X"03",X"FF",X"FF",X"7F",X"7F",X"7D",X"7D",X"3F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00", + X"07",X"03",X"03",X"03",X"03",X"03",X"03",X"01",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"07",X"07", + X"FF",X"7F",X"3F",X"3F",X"1F",X"1F",X"1F",X"0F",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00", + X"FF",X"FC",X"F0",X"F0",X"E0",X"C0",X"C0",X"C0",X"FC",X"FC",X"F8",X"F8",X"F0",X"F0",X"E0",X"C0", + X"FF",X"FE",X"FE",X"FE",X"FE",X"FE",X"FC",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3F",X"3F",X"1F",X"1F",X"0F",X"0F",X"07",X"03",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00", + X"FF",X"3F",X"0F",X"0F",X"07",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"FF", + X"C0",X"F0",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"00",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"FF",X"C0",X"F0",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"00",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"FF", + X"C0",X"F0",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"00",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"FF",X"C0",X"F0",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"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"E7",X"F7", + X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"FF",X"FF",X"FF",X"C7",X"C7",X"C7",X"C7",X"C7", + X"07",X"07",X"07",X"03",X"03",X"03",X"01",X"00",X"FF",X"FF",X"7F",X"3F",X"1F",X"1F",X"0F",X"0F", + X"E3",X"E3",X"E3",X"E3",X"E3",X"E3",X"F3",X"FB",X"FF",X"FF",X"FF",X"FF",X"E3",X"E3",X"E3",X"E3", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F9",X"FD",X"FF",X"FF",X"3F",X"0F",X"07",X"03",X"FF",X"FF",X"FF",X"FF",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"3F",X"07",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"38",X"38",X"FC",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FC",X"E0",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"1C",X"1C",X"3F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"9F",X"BF",X"FF",X"FF",X"FC",X"F0",X"E0",X"C0",X"FF",X"FF",X"FF",X"FF",X"8F",X"8F",X"8F",X"8F", + X"E0",X"E0",X"E0",X"C0",X"C0",X"C0",X"80",X"80",X"FF",X"FF",X"FE",X"FC",X"F8",X"F8",X"F0",X"F0", + X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"CF",X"DF",X"FF",X"FF",X"FF",X"FF",X"C7",X"C7",X"C7",X"C7", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"E3",X"E3",X"E3",X"E3",X"E3",X"E3",X"E7",X"EF", + X"E3",X"E3",X"E3",X"E3",X"E3",X"E3",X"E3",X"E3",X"FF",X"FF",X"FF",X"FF",X"E3",X"E3",X"E3",X"E3", + X"03",X"0F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"03",X"0F",X"3F",X"FF",X"03",X"0F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"03",X"0F",X"3F",X"FF", + X"03",X"0F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"03",X"0F",X"3F",X"FF",X"03",X"0F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"03",X"0F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_char_u.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_char_u.vhd new file mode 100644 index 00000000..015e229d --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_char_u.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_char_u is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_char_u is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"7C",X"C6",X"C6",X"C6",X"C6",X"C6",X"7C",X"00",X"18",X"1C",X"18",X"18",X"18",X"18",X"3C", + X"00",X"7C",X"E6",X"C6",X"30",X"0C",X"C6",X"7E",X"00",X"7C",X"C6",X"C0",X"70",X"C6",X"C6",X"7C", + X"00",X"68",X"68",X"6C",X"64",X"FE",X"60",X"F0",X"00",X"7E",X"02",X"7E",X"C2",X"C0",X"C6",X"7C", + X"00",X"7C",X"C6",X"06",X"7E",X"C6",X"C6",X"7C",X"00",X"FE",X"C2",X"C2",X"60",X"30",X"18",X"18", + X"00",X"7C",X"C6",X"C6",X"7C",X"C6",X"C6",X"7C",X"00",X"7C",X"C6",X"C6",X"FC",X"C0",X"C6",X"7C", + X"00",X"70",X"58",X"C8",X"CC",X"FC",X"C6",X"C6",X"00",X"7E",X"CC",X"CC",X"7C",X"CC",X"CC",X"7E", + X"00",X"78",X"CC",X"06",X"06",X"86",X"CC",X"78",X"00",X"3E",X"6C",X"CC",X"CC",X"CC",X"6C",X"3E", + X"00",X"FE",X"CC",X"0C",X"3C",X"0C",X"CC",X"FE",X"00",X"FE",X"CC",X"0C",X"3C",X"0C",X"0C",X"1E", + X"00",X"78",X"CC",X"06",X"06",X"E6",X"CC",X"78",X"00",X"EE",X"6C",X"6C",X"7C",X"6C",X"6C",X"EE", + X"00",X"3C",X"18",X"18",X"18",X"18",X"18",X"3C",X"00",X"F0",X"60",X"60",X"60",X"60",X"6C",X"38", + X"00",X"9E",X"CC",X"6C",X"3C",X"6C",X"CC",X"DE",X"00",X"1E",X"0C",X"0C",X"0C",X"0C",X"CC",X"FE", + X"00",X"C6",X"EE",X"FE",X"D6",X"D6",X"C6",X"C6",X"00",X"C6",X"CE",X"DE",X"F6",X"E6",X"C6",X"C6", + X"00",X"7C",X"C6",X"C6",X"C6",X"C6",X"C6",X"7C",X"00",X"7E",X"CC",X"CC",X"7C",X"0C",X"0C",X"1E", + X"00",X"38",X"6C",X"C6",X"C6",X"D6",X"6C",X"D8",X"00",X"7E",X"CC",X"CC",X"7C",X"6C",X"CC",X"DE", + X"00",X"7C",X"8E",X"1C",X"78",X"F0",X"E2",X"7C",X"00",X"7E",X"5A",X"18",X"18",X"18",X"18",X"3C", + X"00",X"DE",X"8C",X"8C",X"8C",X"8C",X"8C",X"78",X"00",X"DE",X"8C",X"8C",X"8C",X"58",X"58",X"30", + X"00",X"B6",X"B6",X"B6",X"B6",X"FE",X"6C",X"28",X"00",X"C6",X"6E",X"3C",X"38",X"78",X"EC",X"C6", + X"00",X"E6",X"6C",X"78",X"30",X"30",X"18",X"1C",X"00",X"FE",X"E6",X"70",X"38",X"1C",X"CE",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00", + X"00",X"00",X"10",X"00",X"00",X"10",X"00",X"00",X"00",X"0C",X"12",X"14",X"08",X"14",X"22",X"7C", + X"30",X"30",X"38",X"38",X"18",X"08",X"00",X"04",X"38",X"44",X"44",X"20",X"10",X"10",X"00",X"10", + X"00",X"20",X"10",X"08",X"08",X"08",X"10",X"20",X"00",X"08",X"10",X"20",X"20",X"20",X"10",X"08", + X"00",X"10",X"10",X"10",X"FE",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"7E",X"00",X"00",X"00", + X"00",X"00",X"7E",X"00",X"00",X"7E",X"00",X"00",X"00",X"44",X"EE",X"EE",X"FE",X"7C",X"38",X"10", + X"38",X"44",X"44",X"38",X"10",X"7C",X"10",X"10",X"10",X"38",X"54",X"10",X"38",X"44",X"44",X"38", + X"18",X"38",X"28",X"48",X"28",X"0C",X"0E",X"06",X"10",X"38",X"7C",X"54",X"FE",X"28",X"44",X"28", + X"00",X"00",X"A7",X"A9",X"A7",X"A5",X"49",X"00",X"00",X"00",X"02",X"06",X"0A",X"0A",X"06",X"00", + X"00",X"00",X"07",X"31",X"53",X"51",X"57",X"00",X"00",X"04",X"04",X"06",X"05",X"05",X"06",X"00", + X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"10",X"38",X"7C",X"FE",X"38",X"38",X"38",X"38", + X"3C",X"42",X"99",X"85",X"85",X"99",X"42",X"3C",X"00",X"60",X"60",X"30",X"10",X"00",X"00",X"00", + X"FE",X"F2",X"02",X"02",X"02",X"FE",X"FE",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + 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"00",X"00",X"F8",X"F8",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18", + X"18",X"18",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"18",X"18",X"18",X"18", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"1F",X"1F",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18", + X"18",X"18",X"1F",X"1F",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"01",X"01",X"01",X"01",X"01",X"01",X"01",X"FF",X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"FF", + X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"FF",X"FF",X"81",X"81",X"81",X"81",X"81",X"81",X"FF", + X"00",X"D8",X"50",X"50",X"50",X"D0",X"00",X"00",X"00",X"F9",X"1D",X"0D",X"1D",X"F9",X"00",X"00", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0E",X"0C",X"00",X"00",X"00",X"38",X"28",X"38",X"00",X"00",X"00", + X"10",X"10",X"10",X"FF",X"FF",X"10",X"10",X"10",X"1F",X"98",X"9A",X"FA",X"FA",X"9A",X"98",X"1F", + X"3F",X"63",X"41",X"00",X"00",X"41",X"63",X"3F",X"F8",X"CC",X"DE",X"DF",X"DF",X"DE",X"DC",X"F8", + X"F8",X"8C",X"AE",X"BF",X"8F",X"EE",X"8C",X"F8",X"F8",X"8C",X"BE",X"8F",X"BF",X"BE",X"8C",X"F8", + X"F8",X"EC",X"EE",X"AF",X"AF",X"8E",X"BC",X"F8",X"F8",X"8C",X"EE",X"8F",X"BF",X"BE",X"8C",X"F8", + X"F8",X"8C",X"EE",X"8F",X"AF",X"AE",X"8C",X"F8",X"F8",X"8C",X"BE",X"BF",X"BF",X"BE",X"BC",X"F8", + X"F8",X"8C",X"AE",X"8F",X"AF",X"AE",X"8C",X"F8",X"F8",X"8C",X"AE",X"8F",X"BF",X"BE",X"BC",X"F8", + X"00",X"00",X"80",X"40",X"30",X"18",X"0C",X"06",X"06",X"1B",X"F0",X"00",X"04",X"1E",X"7F",X"EF", + X"3F",X"10",X"F8",X"B8",X"3C",X"3C",X"5F",X"5E",X"00",X"00",X"00",X"00",X"00",X"01",X"0E",X"C4", + X"00",X"00",X"00",X"00",X"00",X"04",X"07",X"14",X"00",X"00",X"00",X"00",X"20",X"30",X"A8",X"E6", + X"00",X"00",X"00",X"00",X"80",X"60",X"10",X"06",X"00",X"00",X"01",X"03",X"05",X"3E",X"2C",X"E0", + X"00",X"00",X"00",X"00",X"C0",X"E0",X"00",X"00",X"20",X"70",X"8C",X"C3",X"C0",X"C3",X"C2",X"C2", + X"00",X"00",X"01",X"01",X"07",X"01",X"81",X"61",X"00",X"00",X"00",X"00",X"02",X"03",X"0A",X"8E", + X"00",X"00",X"00",X"80",X"40",X"30",X"1C",X"C3",X"00",X"00",X"00",X"80",X"01",X"06",X"38",X"23", + X"18",X"24",X"72",X"F1",X"73",X"72",X"72",X"72",X"00",X"00",X"30",X"2C",X"E3",X"CC",X"C8",X"E4", + X"03",X"0E",X"3E",X"F8",X"E0",X"80",X"00",X"78",X"02",X"0C",X"30",X"C0",X"03",X"0F",X"1E",X"7C", + X"5F",X"5E",X"4C",X"48",X"43",X"44",X"58",X"50",X"3E",X"5E",X"4E",X"4C",X"58",X"5A",X"7A",X"76", + X"9E",X"1E",X"8E",X"8E",X"8E",X"FE",X"0E",X"42",X"E1",X"C9",X"CD",X"CC",X"DE",X"D6",X"96",X"A6", + X"0C",X"88",X"90",X"91",X"91",X"91",X"91",X"91",X"DF",X"DF",X"DF",X"D3",X"D3",X"D3",X"D3",X"CB", + X"00",X"01",X"01",X"01",X"01",X"01",X"0D",X"13",X"C2",X"C2",X"C2",X"C2",X"C2",X"C2",X"C2",X"82", + X"19",X"8D",X"E9",X"E9",X"69",X"6F",X"61",X"68",X"8E",X"4C",X"4C",X"5C",X"5D",X"5D",X"59",X"5A", + X"E0",X"F0",X"F8",X"7C",X"3C",X"1C",X"1C",X"1C",X"E7",X"F7",X"F8",X"78",X"68",X"68",X"20",X"20", + X"72",X"72",X"F2",X"72",X"A2",X"42",X"E2",X"F2",X"F2",X"FA",X"7B",X"38",X"1A",X"1B",X"1B",X"1D", + X"CC",X"06",X"02",X"03",X"F1",X"F9",X"F9",X"3B",X"E1",X"86",X"8C",X"B8",X"E0",X"01",X"07",X"0E", + X"70",X"70",X"70",X"70",X"70",X"78",X"3C",X"FE",X"76",X"36",X"0E",X"3E",X"6E",X"4E",X"4E",X"EF", + X"FE",X"6E",X"AE",X"BE",X"9E",X"DE",X"DE",X"FF",X"A0",X"21",X"03",X"3F",X"7D",X"71",X"60",X"F0", + X"93",X"93",X"93",X"97",X"97",X"9E",X"8E",X"FF",X"EB",X"FD",X"EF",X"73",X"7B",X"23",X"23",X"23", + X"39",X"7C",X"7E",X"5E",X"0F",X"0F",X"06",X"04",X"C2",X"C2",X"C2",X"C2",X"C2",X"C2",X"E2",X"F1", + X"05",X"27",X"37",X"F7",X"B3",X"3B",X"1B",X"1F",X"7A",X"72",X"B0",X"F3",X"77",X"67",X"62",X"FF", + X"18",X"18",X"38",X"30",X"21",X"01",X"06",X"F8",X"60",X"20",X"30",X"98",X"76",X"68",X"FE",X"3F", + X"F2",X"72",X"72",X"F1",X"60",X"40",X"F3",X"FF",X"34",X"B4",X"F2",X"A1",X"C4",X"E6",X"F7",X"F9", + X"3A",X"1E",X"1C",X"18",X"38",X"30",X"60",X"C0",X"0C",X"B0",X"A0",X"C0",X"80",X"00",X"00",X"00", + X"BF",X"9F",X"0F",X"07",X"03",X"01",X"00",X"00",X"0F",X"8F",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C1",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"23",X"47",X"C0",X"80",X"00",X"00",X"00",X"00", + X"98",X"60",X"00",X"00",X"03",X"8E",X"F8",X"F8",X"F8",X"7C",X"3E",X"1F",X"0F",X"07",X"07",X"03", + X"19",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"E1",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"07",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"E0",X"66",X"24", + X"00",X"00",X"00",X"80",X"C2",X"E7",X"66",X"24",X"00",X"80",X"98",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"01",X"19",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"01",X"43",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"07",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"44",X"00",X"00",X"00",X"00",X"00",X"E0",X"66",X"24", + X"00",X"00",X"00",X"00",X"C0",X"E7",X"66",X"24",X"00",X"00",X"00",X"80",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"98",X"81",X"C3",X"E7",X"66",X"24",X"00",X"98",X"99",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"19",X"99",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"19",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"00",X"01",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"03",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"07",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"24", + X"00",X"00",X"00",X"00",X"C0",X"E6",X"66",X"24",X"00",X"90",X"9C",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"60",X"24", + X"00",X"00",X"00",X"00",X"80",X"C3",X"66",X"24",X"00",X"00",X"80",X"80",X"C3",X"E7",X"66",X"24", + X"00",X"90",X"99",X"81",X"C3",X"E7",X"66",X"24",X"00",X"09",X"99",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"01",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"03",X"C7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"01",X"06",X"24",X"00",X"01",X"01",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"67",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"60",X"24", + X"00",X"00",X"80",X"80",X"C0",X"E7",X"66",X"24",X"3C",X"99",X"99",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"20",X"00",X"00",X"80",X"80",X"C0",X"E7",X"66",X"24", + X"3C",X"99",X"99",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"20", + X"00",X"00",X"00",X"80",X"C0",X"E7",X"66",X"24",X"00",X"80",X"98",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"01",X"19",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"01",X"03",X"E7",X"66",X"24", + X"3C",X"99",X"99",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"04", + X"00",X"00",X"01",X"01",X"03",X"E7",X"66",X"24",X"3C",X"99",X"99",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"00",X"00",X"00",X"01",X"03",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"01",X"06",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"80",X"C0",X"E0",X"66",X"24", + X"30",X"98",X"98",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20", + X"00",X"80",X"90",X"80",X"C2",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"80",X"C0",X"E0",X"66",X"24",X"3C",X"98",X"99",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"20",X"00",X"00",X"00",X"80",X"C0",X"E6",X"66",X"24", + X"00",X"90",X"99",X"81",X"C3",X"E7",X"66",X"24",X"00",X"09",X"99",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"00",X"01",X"03",X"67",X"66",X"24",X"3C",X"19",X"99",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"00",X"00",X"01",X"01",X"03",X"07",X"66",X"24", + X"00",X"01",X"09",X"01",X"43",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"19",X"19",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04", + X"00",X"00",X"00",X"01",X"03",X"07",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3C",X"99",X"99",X"81",X"C3",X"E7",X"66",X"24", + X"C3",X"66",X"3C",X"E7",X"3C",X"66",X"C3",X"7E",X"00",X"00",X"FF",X"FF",X"CC",X"CC",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"E0",X"64",X"24", + X"3C",X"98",X"99",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"C0",X"E0",X"60",X"20", + X"38",X"98",X"98",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"80",X"C0",X"C0",X"60",X"20", + X"3C",X"98",X"99",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"80",X"C0",X"E0",X"60",X"20", + X"3C",X"99",X"99",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"80",X"C0",X"E0",X"60",X"24", + X"00",X"18",X"19",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"03",X"07",X"06",X"24", + X"00",X"01",X"01",X"01",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"80",X"80",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3C",X"99",X"99",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"24", + X"00",X"01",X"01",X"01",X"03",X"27",X"66",X"24",X"00",X"01",X"01",X"01",X"03",X"27",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"03",X"27",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"03",X"27",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E0",X"0F",X"C0",X"03",X"F8",X"0F",X"E0",X"07",X"00",X"00",X"00",X"00",X"00",X"C0",X"7C",X"03", + X"07",X"E0",X"1F",X"F8",X"01",X"C0",X"1F",X"F0",X"00",X"00",X"00",X"00",X"00",X"03",X"3E",X"E0", + X"F0",X"03",X"CC",X"00",X"F8",X"03",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"7C",X"07", + X"01",X"F8",X"0F",X"E0",X"03",X"1E",X"01",X"E0",X"00",X"00",X"00",X"00",X"00",X"03",X"3E",X"E0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"88",X"90",X"80",X"C0",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"C0",X"E4",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"90",X"98",X"80",X"C2",X"E6",X"66",X"24", + X"00",X"00",X"00",X"00",X"80",X"80",X"40",X"20",X"3C",X"90",X"98",X"81",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"80",X"80",X"C0",X"E0",X"60",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"90",X"80",X"C0",X"E4",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"98",X"98",X"80",X"C3",X"E7",X"66",X"24",X"00",X"00",X"80",X"80",X"C0",X"E0",X"60",X"20", + X"3C",X"99",X"99",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"E0",X"60",X"24", + X"3C",X"99",X"99",X"81",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"07",X"06",X"04", + X"1C",X"19",X"19",X"41",X"43",X"E7",X"66",X"24",X"00",X"00",X"01",X"01",X"03",X"07",X"06",X"04", + X"00",X"01",X"09",X"01",X"03",X"17",X"36",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3C",X"19",X"19",X"81",X"C3",X"E7",X"66",X"24",X"00",X"01",X"01",X"01",X"03",X"07",X"06",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"09",X"19",X"01",X"43",X"67",X"66",X"24", + X"00",X"00",X"00",X"00",X"01",X"01",X"02",X"04",X"00",X"01",X"01",X"01",X"03",X"27",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"03",X"27",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04", + X"C0",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"40",X"C0",X"00",X"40",X"00",X"80",X"00",X"C0",X"60",X"30",X"E0",X"20",X"60",X"C0",X"60", + X"C0",X"64",X"1C",X"F0",X"38",X"60",X"C0",X"70",X"C3",X"66",X"3C",X"E7",X"3C",X"66",X"C2",X"7C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"40",X"C0",X"40",X"00",X"80",X"00",X"00", + X"C0",X"60",X"30",X"E0",X"30",X"60",X"C0",X"60",X"C2",X"66",X"3C",X"E4",X"3C",X"64",X"C0",X"78", + X"C3",X"66",X"3C",X"E7",X"3C",X"66",X"C2",X"7E",X"C3",X"66",X"3C",X"E0",X"30",X"40",X"80",X"00", + X"43",X"66",X"3C",X"07",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"02",X"00",X"01",X"00",X"00",X"00",X"00",X"03",X"06",X"04",X"07",X"04",X"06",X"03",X"02", + X"03",X"26",X"1C",X"07",X"1C",X"06",X"03",X"0E",X"C3",X"66",X"3C",X"67",X"3C",X"66",X"43",X"3E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"02",X"00",X"03",X"00",X"00",X"01",X"00", + X"03",X"06",X"0C",X"07",X"04",X"06",X"03",X"06",X"03",X"26",X"3C",X"07",X"1C",X"06",X"03",X"0E", + X"C3",X"66",X"3C",X"E7",X"3C",X"66",X"43",X"3E",X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"60",X"20",X"C0",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C2",X"64",X"3C",X"E0",X"38",X"60",X"C0",X"60",X"C3",X"66",X"3C",X"E7",X"3C",X"66",X"C3",X"7E", + X"C0",X"60",X"30",X"E0",X"20",X"40",X"80",X"00",X"C3",X"66",X"3C",X"E7",X"3C",X"66",X"C0",X"7C", + X"03",X"06",X"04",X"03",X"00",X"00",X"00",X"00",X"C3",X"66",X"3C",X"67",X"3C",X"26",X"03",X"0E", + X"C0",X"40",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C3",X"66",X"3C",X"E7",X"3C",X"66",X"40",X"38",X"03",X"02",X"00",X"01",X"00",X"00",X"00",X"00", + X"43",X"66",X"3C",X"07",X"1C",X"06",X"03",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"06",X"00",X"03",X"00",X"00",X"00",X"00",X"C0",X"60",X"00",X"80",X"00",X"00",X"00",X"00", + X"C0",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"66",X"3C",X"E7",X"3C",X"66",X"C0",X"78", + X"40",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"66",X"3C",X"E7",X"3C",X"66",X"C0",X"78", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"66",X"3C",X"E6",X"3C",X"60",X"00",X"00", + X"03",X"06",X"00",X"01",X"00",X"00",X"00",X"00",X"C3",X"66",X"3C",X"E7",X"3C",X"26",X"03",X"1E", + X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"66",X"3C",X"67",X"3C",X"06",X"03",X"0E", + X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"00",X"80",X"00",X"80",X"00",X"00",X"C0",X"60",X"00",X"C0",X"00",X"40",X"C0",X"40", + X"C0",X"60",X"38",X"E0",X"30",X"60",X"C0",X"60",X"C0",X"60",X"30",X"E0",X"20",X"40",X"80",X"00", + X"C0",X"64",X"3C",X"E4",X"3C",X"64",X"C0",X"78",X"C3",X"66",X"3C",X"E7",X"3C",X"66",X"C2",X"7E", + X"03",X"06",X"0C",X"07",X"04",X"02",X"01",X"00",X"03",X"26",X"3C",X"27",X"3C",X"04",X"03",X"1E", + X"C3",X"66",X"3C",X"E7",X"3C",X"66",X"43",X"7E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"01",X"00",X"01",X"00",X"00",X"03",X"06",X"00",X"03",X"00",X"02",X"03",X"02", + X"03",X"06",X"1C",X"07",X"0C",X"06",X"03",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"60",X"20",X"C0",X"00",X"00",X"80",X"00",X"C0",X"60",X"30",X"E0",X"20",X"40",X"80",X"00", + X"C0",X"64",X"3C",X"64",X"3C",X"60",X"C0",X"78",X"C3",X"66",X"3C",X"67",X"3C",X"66",X"C2",X"7E", + X"03",X"06",X"0C",X"07",X"04",X"02",X"01",X"00",X"03",X"26",X"3C",X"27",X"3C",X"06",X"03",X"1E", + X"C3",X"66",X"3C",X"E7",X"3C",X"66",X"43",X"7E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"06",X"04",X"03",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"38", + X"00",X"80",X"E0",X"38",X"8E",X"E3",X"60",X"24",X"0E",X"83",X"98",X"80",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"38",X"00",X"80",X"E0",X"38",X"8E",X"E3",X"60",X"24", + X"0E",X"83",X"98",X"80",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"38", + X"00",X"80",X"E0",X"38",X"8E",X"E3",X"60",X"24",X"0E",X"83",X"98",X"80",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"38",X"00",X"80",X"E0",X"38",X"8E",X"E3",X"60",X"24", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"FF",X"39",X"39",X"39",X"39",X"39",X"39",X"19",X"09", + X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"FF",X"01",X"01",X"39",X"39",X"39",X"39",X"39", + X"04",X"04",X"06",X"02",X"02",X"03",X"01",X"00",X"80",X"C0",X"60",X"30",X"10",X"18",X"08",X"0C", + X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"0C",X"04",X"FF",X"00",X"00",X"00",X"1C",X"1C",X"1C",X"1C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"06",X"02",X"80",X"E0",X"38",X"0C",X"06",X"03",X"FF",X"00",X"00",X"00",X"0E",X"0E",X"0E",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"3C",X"07",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"C7",X"C7",X"03",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"3C",X"E0",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"E3",X"E3",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"40",X"01",X"07",X"1C",X"30",X"60",X"C0",X"FF",X"00",X"00",X"00",X"70",X"70",X"70",X"70", + X"20",X"20",X"60",X"40",X"40",X"C0",X"80",X"80",X"01",X"03",X"06",X"0C",X"08",X"18",X"10",X"30", + X"38",X"38",X"38",X"38",X"38",X"38",X"30",X"20",X"FF",X"00",X"00",X"00",X"38",X"38",X"38",X"38", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF",X"9C",X"9C",X"9C",X"9C",X"9C",X"9C",X"98",X"90", + X"9C",X"9C",X"9C",X"9C",X"9C",X"9C",X"9C",X"9C",X"FF",X"80",X"80",X"80",X"9C",X"9C",X"9C",X"9C", + X"00",X"01",X"07",X"1C",X"71",X"C7",X"06",X"24",X"70",X"C1",X"19",X"01",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"1C",X"00",X"01",X"07",X"1C",X"71",X"C7",X"06",X"24", + X"70",X"C1",X"19",X"01",X"C3",X"E7",X"66",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"1C", + X"00",X"01",X"07",X"1C",X"71",X"C7",X"06",X"24",X"70",X"C1",X"19",X"01",X"C3",X"E7",X"66",X"24", + X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"1C",X"00",X"01",X"07",X"1C",X"71",X"C7",X"06",X"24", + X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"1C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_cpu1.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_cpu1.vhd new file mode 100644 index 00000000..4f1da5e4 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_cpu1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_cpu1 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 prom of rom_cpu1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"31",X"00",X"6C",X"C3",X"70",X"02",X"C7",X"C7",X"5E",X"23",X"56",X"23",X"EB",X"C9",X"C7",X"C7", + X"77",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"C9",X"D1",X"5F",X"CB",X"23",X"16",X"00",X"19",X"5E", + X"23",X"56",X"EB",X"E9",X"C7",X"C7",X"C7",X"C7",X"21",X"01",X"90",X"C3",X"AD",X"01",X"C7",X"C7", + X"73",X"CB",X"D4",X"72",X"CB",X"94",X"C9",X"C7",X"F5",X"E5",X"21",X"01",X"60",X"3A",X"00",X"90", + X"17",X"38",X"05",X"36",X"0A",X"C3",X"A9",X"00",X"7E",X"A7",X"C2",X"A9",X"00",X"C3",X"93",X"00", + X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", + X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"F5",X"E5",X"21",X"01",X"60",X"3A",X"00",X"90",X"17",X"38", + X"04",X"36",X"0A",X"18",X"1A",X"7E",X"A7",X"20",X"16",X"3A",X"03",X"60",X"A7",X"20",X"10",X"3E", + X"55",X"32",X"06",X"60",X"32",X"16",X"6B",X"32",X"38",X"6E",X"3E",X"03",X"32",X"03",X"60",X"E1", + X"F1",X"ED",X"45",X"3A",X"02",X"60",X"A7",X"20",X"10",X"3E",X"55",X"32",X"05",X"60",X"32",X"09", + X"6B",X"32",X"25",X"6E",X"3E",X"03",X"32",X"02",X"60",X"3A",X"00",X"80",X"E1",X"F1",X"FB",X"C9", + X"06",X"00",X"4F",X"21",X"6D",X"01",X"09",X"EB",X"7E",X"DD",X"BE",X"00",X"C2",X"57",X"01",X"FD", + X"BE",X"00",X"C2",X"57",X"01",X"34",X"DD",X"34",X"00",X"FD",X"34",X"00",X"7E",X"DD",X"BE",X"00", + X"C2",X"57",X"01",X"FD",X"BE",X"00",X"C2",X"57",X"01",X"1A",X"BE",X"28",X"04",X"D0",X"C3",X"57", + X"01",X"36",X"00",X"DD",X"36",X"00",X"00",X"FD",X"36",X"00",X"00",X"13",X"3A",X"04",X"60",X"21", + X"5B",X"6B",X"BE",X"C2",X"62",X"01",X"21",X"91",X"6E",X"BE",X"C2",X"62",X"01",X"21",X"04",X"60", + X"1A",X"86",X"FE",X"63",X"38",X"02",X"3E",X"63",X"77",X"21",X"5B",X"6B",X"1A",X"86",X"FE",X"63", + X"38",X"02",X"3E",X"63",X"77",X"21",X"91",X"6E",X"1A",X"86",X"FE",X"63",X"38",X"02",X"3E",X"63", + X"77",X"3A",X"04",X"60",X"21",X"5B",X"6B",X"BE",X"C2",X"62",X"01",X"21",X"91",X"6E",X"BE",X"C2", + X"62",X"01",X"3A",X"00",X"60",X"CB",X"47",X"20",X"03",X"CD",X"33",X"1E",X"3E",X"00",X"CD",X"86", + X"0F",X"3E",X"40",X"CD",X"98",X"3B",X"3A",X"00",X"60",X"CB",X"7F",X"C0",X"21",X"DB",X"61",X"36", + X"80",X"3E",X"FF",X"32",X"0B",X"60",X"C9",X"36",X"00",X"DD",X"36",X"00",X"00",X"FD",X"36",X"00", + X"00",X"C9",X"AF",X"32",X"04",X"60",X"32",X"5B",X"6B",X"32",X"91",X"6E",X"C9",X"01",X"01",X"01", + X"02",X"01",X"03",X"01",X"04",X"01",X"05",X"02",X"01",X"02",X"02",X"02",X"03",X"03",X"01",X"03", + X"02",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"02",X"01",X"03",X"01",X"04",X"01",X"05",X"02",X"01",X"02",X"02",X"02",X"03",X"03",X"01",X"03", + X"02",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"CB",X"7E",X"20", + X"FC",X"CB",X"7E",X"28",X"FC",X"21",X"01",X"60",X"3A",X"00",X"90",X"17",X"38",X"03",X"36",X"0A", + X"C9",X"7E",X"A7",X"CA",X"C8",X"01",X"35",X"C9",X"21",X"03",X"60",X"7E",X"A7",X"CA",X"11",X"02", + X"35",X"C2",X"11",X"02",X"3E",X"55",X"21",X"06",X"60",X"BE",X"20",X"2B",X"21",X"16",X"6B",X"BE", + X"20",X"25",X"21",X"38",X"6E",X"BE",X"20",X"1F",X"3A",X"03",X"90",X"2F",X"E6",X"F0",X"0F",X"0F", + X"0F",X"DD",X"E5",X"FD",X"E5",X"11",X"08",X"60",X"DD",X"21",X"3E",X"6B",X"FD",X"21",X"6C",X"6E", + X"CD",X"B0",X"00",X"FD",X"E1",X"DD",X"E1",X"AF",X"32",X"06",X"60",X"32",X"16",X"6B",X"32",X"38", + X"6E",X"21",X"02",X"60",X"7E",X"A7",X"C8",X"35",X"C0",X"3E",X"55",X"21",X"05",X"60",X"BE",X"20", + X"44",X"21",X"09",X"6B",X"BE",X"20",X"3E",X"21",X"25",X"6E",X"BE",X"20",X"38",X"DD",X"E5",X"FD", + X"E5",X"11",X"07",X"60",X"DD",X"21",X"27",X"6B",X"FD",X"21",X"4F",X"6E",X"3A",X"03",X"90",X"67", + X"CB",X"0F",X"CB",X"0F",X"CB",X"0F",X"CB",X"0F",X"AC",X"20",X"0B",X"11",X"08",X"60",X"DD",X"21", + X"3E",X"6B",X"FD",X"21",X"6C",X"6E",X"7C",X"2F",X"E6",X"0F",X"CB",X"27",X"C6",X"20",X"CD",X"B0", + X"00",X"FD",X"E1",X"DD",X"E1",X"AF",X"32",X"05",X"60",X"32",X"09",X"6B",X"32",X"25",X"6E",X"C9", + X"3A",X"00",X"90",X"E6",X"60",X"CA",X"80",X"5D",X"21",X"00",X"60",X"01",X"10",X"00",X"AF",X"77", + X"23",X"10",X"FC",X"0D",X"20",X"F9",X"EF",X"21",X"00",X"70",X"01",X"04",X"00",X"AF",X"D7",X"21", + X"E5",X"02",X"E5",X"11",X"94",X"6A",X"01",X"03",X"00",X"ED",X"B0",X"E1",X"06",X"05",X"11",X"94", + X"6A",X"C5",X"E5",X"01",X"03",X"00",X"ED",X"B0",X"E1",X"C1",X"10",X"F5",X"21",X"AE",X"1D",X"11", + X"A3",X"6A",X"06",X"05",X"C5",X"E5",X"01",X"0A",X"00",X"ED",X"B0",X"E1",X"C1",X"10",X"F5",X"21", + X"00",X"A0",X"36",X"00",X"21",X"50",X"50",X"22",X"15",X"60",X"21",X"CE",X"61",X"36",X"80",X"CD", + X"8C",X"3B",X"ED",X"56",X"21",X"00",X"80",X"36",X"00",X"FB",X"AF",X"32",X"0A",X"60",X"AF",X"CD", + X"98",X"3B",X"C3",X"E8",X"02",X"01",X"00",X"00",X"EF",X"3A",X"0A",X"60",X"CB",X"47",X"20",X"07", + X"11",X"3C",X"03",X"06",X"0C",X"18",X"05",X"11",X"6C",X"03",X"06",X"11",X"C5",X"EB",X"5E",X"23", + X"56",X"23",X"EB",X"E5",X"DD",X"E1",X"CB",X"7E",X"20",X"04",X"13",X"13",X"18",X"1E",X"CB",X"76", + X"28",X"0D",X"23",X"7E",X"A7",X"28",X"05",X"35",X"13",X"13",X"18",X"10",X"2B",X"CB",X"B6",X"EB", + X"5E",X"23",X"56",X"23",X"EB",X"D5",X"01",X"2B",X"03",X"C5",X"E9",X"D1",X"C1",X"10",X"CD",X"21", + X"0A",X"60",X"34",X"CD",X"73",X"3B",X"CD",X"13",X"1F",X"C3",X"E8",X"02",X"DF",X"61",X"8A",X"07", + X"CE",X"61",X"B0",X"03",X"D5",X"61",X"74",X"04",X"DB",X"61",X"71",X"05",X"DD",X"61",X"48",X"06", + X"E2",X"61",X"68",X"09",X"E8",X"61",X"47",X"24",X"00",X"62",X"6B",X"33",X"D6",X"62",X"F5",X"0F", + X"EC",X"62",X"F5",X"0F",X"02",X"63",X"58",X"11",X"9C",X"62",X"6E",X"2A",X"28",X"62",X"6E",X"2A", + X"45",X"62",X"6E",X"2A",X"62",X"62",X"6E",X"2A",X"7F",X"62",X"6E",X"2A",X"20",X"63",X"57",X"12", + X"47",X"63",X"15",X"15",X"58",X"63",X"15",X"15",X"69",X"63",X"54",X"16",X"7B",X"63",X"54",X"16", + X"8D",X"63",X"DE",X"17",X"9B",X"63",X"DE",X"17",X"A9",X"63",X"25",X"19",X"BE",X"63",X"25",X"19", + X"D3",X"63",X"25",X"19",X"11",X"63",X"58",X"11",X"B9",X"62",X"6E",X"2A",X"C5",X"69",X"9D",X"3B", + X"DD",X"CB",X"00",X"6E",X"28",X"0B",X"DD",X"7E",X"02",X"21",X"BD",X"03",X"DF",X"EF",X"03",X"69", + X"04",X"DD",X"CB",X"00",X"EE",X"DD",X"36",X"02",X"00",X"AF",X"32",X"00",X"60",X"32",X"00",X"A0", + X"CD",X"8C",X"3B",X"3E",X"00",X"CD",X"A0",X"1B",X"21",X"66",X"1D",X"CD",X"39",X"1D",X"DD",X"36", + X"03",X"00",X"DD",X"36",X"04",X"08",X"DD",X"36",X"05",X"10",X"DD",X"36",X"06",X"60",X"C9",X"DD", + X"7E",X"03",X"FE",X"C0",X"38",X"0C",X"DD",X"36",X"01",X"78",X"DD",X"CB",X"00",X"F6",X"DD",X"34", + X"02",X"C9",X"DD",X"7E",X"05",X"A7",X"28",X"40",X"DD",X"7E",X"04",X"D6",X"08",X"38",X"39",X"DD", + X"77",X"04",X"DD",X"7E",X"06",X"16",X"00",X"DD",X"5E",X"03",X"CB",X"3B",X"CB",X"3B",X"CB",X"3B", + X"21",X"C0",X"D1",X"19",X"77",X"3E",X"6F",X"DD",X"86",X"05",X"21",X"FF",X"D1",X"A7",X"ED",X"52", + X"77",X"DD",X"7E",X"06",X"C6",X"20",X"21",X"00",X"D2",X"19",X"77",X"C6",X"10",X"21",X"20",X"D2", + X"19",X"77",X"DD",X"34",X"06",X"DD",X"35",X"05",X"DD",X"7E",X"04",X"C6",X"03",X"DD",X"77",X"04", + X"DD",X"7E",X"03",X"C6",X"03",X"DD",X"77",X"03",X"32",X"43",X"D0",X"32",X"04",X"D0",X"32",X"24", + X"D0",X"47",X"3E",X"00",X"90",X"32",X"63",X"D0",X"C9",X"06",X"07",X"CD",X"8D",X"1B",X"21",X"D5", + X"61",X"36",X"80",X"C9",X"DD",X"7E",X"02",X"21",X"7B",X"04",X"DF",X"83",X"04",X"AF",X"04",X"26", + X"05",X"50",X"05",X"21",X"17",X"60",X"11",X"FD",X"69",X"CD",X"95",X"1B",X"DD",X"36",X"00",X"80", + X"DD",X"36",X"02",X"01",X"CD",X"A9",X"05",X"3E",X"02",X"CD",X"A0",X"1B",X"3E",X"80",X"32",X"00", + X"60",X"CD",X"DF",X"1C",X"3E",X"01",X"32",X"00",X"60",X"21",X"E2",X"61",X"36",X"80",X"C9",X"21", + X"E8",X"61",X"CB",X"6E",X"CA",X"D0",X"04",X"3A",X"15",X"60",X"E6",X"07",X"87",X"5F",X"16",X"00", + X"21",X"61",X"05",X"19",X"7E",X"DD",X"77",X"03",X"23",X"7E",X"DD",X"77",X"01",X"C3",X"21",X"05", + X"3A",X"EA",X"61",X"FE",X"01",X"20",X"05",X"21",X"EF",X"61",X"18",X"03",X"21",X"30",X"60",X"3A", + X"07",X"62",X"BE",X"28",X"04",X"38",X"06",X"18",X"08",X"06",X"00",X"18",X"06",X"06",X"08",X"18", + X"02",X"06",X"02",X"DD",X"7E",X"05",X"A7",X"28",X"05",X"DD",X"35",X"05",X"18",X"18",X"3A",X"15", + X"60",X"E6",X"0F",X"DD",X"77",X"05",X"3A",X"16",X"60",X"E6",X"03",X"5F",X"16",X"00",X"21",X"5B", + X"05",X"19",X"7E",X"DD",X"77",X"04",X"DD",X"7E",X"04",X"B0",X"DD",X"77",X"03",X"DD",X"36",X"01", + X"03",X"DD",X"CB",X"00",X"F6",X"C9",X"21",X"17",X"60",X"11",X"FD",X"69",X"CD",X"95",X"1B",X"DD", + X"36",X"02",X"03",X"DD",X"36",X"00",X"E0",X"DD",X"36",X"01",X"78",X"CD",X"B2",X"1B",X"CD",X"C9", + X"1B",X"CD",X"B5",X"0D",X"3E",X"01",X"CD",X"E1",X"1B",X"CD",X"DF",X"1C",X"CD",X"5D",X"22",X"C9", + X"06",X"06",X"CD",X"8D",X"1B",X"21",X"CE",X"61",X"36",X"80",X"C9",X"04",X"00",X"04",X"04",X"00", + X"00",X"04",X"10",X"01",X"14",X"0C",X"0C",X"09",X"08",X"03",X"06",X"06",X"04",X"08",X"08",X"02", + X"04",X"DD",X"CB",X"00",X"6E",X"C2",X"CE",X"05",X"AF",X"32",X"0B",X"60",X"21",X"17",X"60",X"11", + X"FD",X"69",X"CD",X"95",X"1B",X"DD",X"36",X"00",X"A0",X"AF",X"32",X"00",X"60",X"3E",X"02",X"CD", + X"A0",X"1B",X"3E",X"80",X"32",X"00",X"60",X"CD",X"10",X"1E",X"21",X"73",X"1D",X"CD",X"39",X"1D", + X"CD",X"39",X"1D",X"CD",X"A9",X"05",X"C3",X"E5",X"05",X"3A",X"02",X"90",X"07",X"07",X"E6",X"03", + X"5F",X"16",X"00",X"21",X"44",X"06",X"19",X"7E",X"32",X"17",X"60",X"32",X"18",X"60",X"3E",X"01", + X"32",X"59",X"60",X"32",X"97",X"61",X"AF",X"32",X"28",X"60",X"32",X"29",X"60",X"C9",X"3A",X"04", + X"60",X"FE",X"02",X"38",X"10",X"DD",X"CB",X"00",X"66",X"20",X"0A",X"DD",X"CB",X"00",X"E6",X"21", + X"98",X"1D",X"CD",X"39",X"1D",X"3A",X"04",X"60",X"21",X"00",X"90",X"4E",X"CB",X"69",X"28",X"0C", + X"FE",X"02",X"DA",X"43",X"06",X"CB",X"71",X"28",X"08",X"C3",X"43",X"06",X"01",X"01",X"81",X"18", + X"03",X"01",X"02",X"C1",X"21",X"00",X"60",X"70",X"3A",X"04",X"60",X"91",X"32",X"04",X"60",X"3A", + X"5B",X"6B",X"91",X"32",X"5B",X"6B",X"3A",X"91",X"6E",X"91",X"32",X"91",X"6E",X"21",X"0C",X"60", + X"11",X"12",X"60",X"CD",X"95",X"1B",X"CD",X"DF",X"1C",X"CD",X"33",X"1E",X"06",X"1E",X"CD",X"76", + X"0F",X"DD",X"36",X"00",X"00",X"21",X"E2",X"61",X"36",X"80",X"23",X"23",X"36",X"00",X"3E",X"15", + X"CD",X"86",X"0F",X"C9",X"02",X"05",X"04",X"03",X"CD",X"8C",X"3B",X"21",X"DF",X"61",X"11",X"FD", + X"69",X"CD",X"95",X"1B",X"21",X"17",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"01",X"23",X"7E", + X"D6",X"01",X"27",X"77",X"A7",X"28",X"0B",X"3A",X"00",X"60",X"CB",X"77",X"CA",X"CD",X"06",X"C3", + X"98",X"06",X"21",X"00",X"60",X"CB",X"76",X"CA",X"00",X"07",X"CB",X"6E",X"20",X"04",X"CB",X"D6", + X"18",X"02",X"CB",X"CE",X"7E",X"E6",X"06",X"FE",X"06",X"CA",X"00",X"07",X"CD",X"45",X"07",X"CD", + X"60",X"07",X"CD",X"8F",X"1F",X"CD",X"EE",X"3F",X"21",X"00",X"60",X"CB",X"6E",X"20",X"08",X"CB", + X"4E",X"20",X"2A",X"CB",X"EE",X"18",X"06",X"CB",X"56",X"20",X"22",X"CB",X"AE",X"DD",X"E5",X"21", + X"52",X"60",X"11",X"90",X"60",X"DD",X"21",X"90",X"61",X"7E",X"DD",X"46",X"00",X"DD",X"77",X"00", + X"70",X"23",X"DD",X"23",X"E5",X"AF",X"ED",X"52",X"E1",X"20",X"EE",X"DD",X"E1",X"CD",X"B2",X"1B", + X"CD",X"C9",X"1B",X"3A",X"00",X"60",X"06",X"00",X"CB",X"6F",X"28",X"08",X"3A",X"02",X"90",X"CB", + X"5F",X"28",X"01",X"05",X"21",X"00",X"A0",X"70",X"21",X"28",X"60",X"3A",X"00",X"60",X"CB",X"6F", + X"28",X"03",X"21",X"29",X"60",X"7E",X"21",X"E2",X"61",X"36",X"80",X"23",X"23",X"77",X"18",X"40", + X"CD",X"45",X"07",X"CD",X"60",X"07",X"21",X"00",X"60",X"CB",X"BE",X"CD",X"8F",X"1F",X"CD",X"EE", + X"3F",X"1E",X"17",X"CD",X"91",X"0F",X"3A",X"0B",X"60",X"A7",X"C2",X"2B",X"07",X"3A",X"1D",X"6C", + X"A7",X"28",X"08",X"06",X"0A",X"CD",X"76",X"0F",X"C3",X"16",X"07",X"AF",X"32",X"00",X"A0",X"32", + X"00",X"60",X"21",X"CE",X"61",X"3A",X"04",X"60",X"A7",X"28",X"03",X"21",X"DB",X"61",X"36",X"80", + X"DD",X"36",X"00",X"00",X"C9",X"21",X"0C",X"60",X"11",X"00",X"6F",X"01",X"06",X"00",X"ED",X"B0", + X"3E",X"30",X"21",X"00",X"60",X"CB",X"6E",X"CA",X"5C",X"07",X"3E",X"31",X"CD",X"98",X"3B",X"C9", + X"CD",X"B2",X"1B",X"CD",X"B5",X"0D",X"CD",X"C9",X"1B",X"3E",X"03",X"CD",X"E1",X"1B",X"21",X"B8", + X"1D",X"CD",X"39",X"1D",X"21",X"C4",X"1D",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"CF", + X"1D",X"CD",X"39",X"1D",X"06",X"3C",X"CD",X"76",X"0F",X"C9",X"FD",X"21",X"E8",X"63",X"DD",X"36", + X"02",X"0D",X"21",X"75",X"64",X"11",X"80",X"70",X"E5",X"D5",X"FD",X"7E",X"00",X"A7",X"28",X"07", + X"87",X"87",X"4F",X"06",X"00",X"ED",X"B0",X"AF",X"12",X"FD",X"7E",X"00",X"FE",X"08",X"30",X"08", + X"D1",X"D5",X"21",X"20",X"00",X"19",X"36",X"00",X"D1",X"E1",X"01",X"40",X"00",X"09",X"EB",X"09", + X"EB",X"FD",X"23",X"DD",X"35",X"02",X"20",X"D0",X"AF",X"21",X"E8",X"63",X"01",X"01",X"0D",X"D7", + X"C9",X"E5",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"08",X"3A",X"02",X"90",X"CB",X"5F",X"C2",X"19", + X"08",X"3E",X"FF",X"DD",X"96",X"07",X"CD",X"2B",X"09",X"E1",X"DD",X"5E",X"08",X"CB",X"23",X"16", + X"00",X"19",X"CF",X"7C",X"E6",X"30",X"F6",X"C0",X"FD",X"86",X"00",X"FD",X"77",X"00",X"DD",X"7E", + X"05",X"D6",X"07",X"FD",X"77",X"03",X"CB",X"24",X"CB",X"24",X"CB",X"24",X"CB",X"24",X"DD",X"7E", + X"09",X"84",X"FD",X"75",X"01",X"FD",X"77",X"02",X"C9",X"DD",X"7E",X"07",X"CD",X"2B",X"09",X"E1", + X"DD",X"5E",X"08",X"CB",X"23",X"16",X"00",X"19",X"CF",X"7C",X"EE",X"30",X"E6",X"30",X"F6",X"C0", + X"FD",X"86",X"00",X"FD",X"77",X"00",X"3E",X"F9",X"DD",X"96",X"05",X"FD",X"77",X"03",X"18",X"C6", + X"3A",X"00",X"60",X"CB",X"6F",X"28",X"07",X"3A",X"02",X"90",X"CB",X"5F",X"20",X"15",X"3E",X"FF", + X"93",X"CD",X"2B",X"09",X"FD",X"CB",X"00",X"FE",X"FD",X"CB",X"00",X"F6",X"7A",X"D6",X"07",X"FD", + X"77",X"03",X"C9",X"7B",X"CD",X"2B",X"09",X"FD",X"CB",X"00",X"FE",X"FD",X"CB",X"00",X"F6",X"3E", + X"F9",X"92",X"FD",X"77",X"03",X"C9",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"07",X"3A",X"02",X"90", + X"CB",X"5F",X"20",X"15",X"3E",X"FB",X"93",X"CD",X"2B",X"09",X"FD",X"CB",X"00",X"FE",X"FD",X"CB", + X"00",X"B6",X"7A",X"D6",X"03",X"FD",X"77",X"03",X"C9",X"7B",X"D6",X"04",X"CD",X"2B",X"09",X"FD", + X"CB",X"00",X"FE",X"FD",X"CB",X"00",X"B6",X"3E",X"FD",X"92",X"FD",X"77",X"03",X"C9",X"7E",X"FD", + X"77",X"01",X"23",X"7E",X"23",X"07",X"07",X"07",X"07",X"FD",X"77",X"02",X"7E",X"E6",X"0F",X"FD", + X"86",X"02",X"FD",X"77",X"02",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"07",X"3A",X"02",X"90",X"CB", + X"5F",X"20",X"05",X"7E",X"E6",X"30",X"18",X"04",X"7E",X"2F",X"E6",X"30",X"FD",X"86",X"00",X"FD", + X"77",X"00",X"23",X"C9",X"7A",X"D6",X"08",X"57",X"D5",X"E5",X"CD",X"40",X"08",X"E1",X"CD",X"AE", + X"08",X"D1",X"7A",X"C6",X"10",X"57",X"30",X"05",X"23",X"23",X"23",X"18",X"0A",X"D5",X"E5",X"CD", + X"40",X"08",X"E1",X"CD",X"AE",X"08",X"D1",X"7A",X"D6",X"08",X"57",X"C9",X"7B",X"C6",X"08",X"5F", + X"CD",X"E4",X"08",X"7B",X"D6",X"10",X"5F",X"CD",X"E4",X"08",X"C9",X"CD",X"0C",X"09",X"7A",X"D6", + X"10",X"57",X"E5",X"CD",X"40",X"08",X"E1",X"CD",X"AE",X"08",X"C9",X"D5",X"4F",X"E6",X"F0",X"0F", + X"0F",X"0F",X"0F",X"47",X"21",X"F5",X"63",X"11",X"40",X"00",X"19",X"10",X"FD",X"D6",X"02",X"E5", + X"5F",X"16",X"00",X"21",X"E8",X"63",X"19",X"7E",X"FE",X"10",X"38",X"08",X"E1",X"21",X"F5",X"63", + X"0E",X"00",X"18",X"0C",X"34",X"87",X"87",X"5F",X"16",X"00",X"E1",X"19",X"79",X"E6",X"0F",X"4F", + X"E5",X"FD",X"E1",X"FD",X"71",X"00",X"D1",X"C9",X"21",X"6F",X"09",X"DD",X"7E",X"02",X"DF",X"75", + X"09",X"29",X"0A",X"EE",X"0A",X"21",X"2C",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21", + X"2E",X"60",X"AF",X"01",X"01",X"04",X"D7",X"21",X"52",X"60",X"01",X"01",X"07",X"D7",X"CD",X"15", + X"0E",X"CD",X"3C",X"0E",X"CD",X"E8",X"0E",X"3A",X"60",X"60",X"CB",X"7F",X"28",X"03",X"CD",X"F0", + X"0E",X"3E",X"03",X"CD",X"A0",X"1B",X"CD",X"9F",X"3A",X"CD",X"EF",X"3A",X"CD",X"74",X"3F",X"CD", + X"BA",X"3F",X"CD",X"4D",X"1E",X"CD",X"26",X"0F",X"CD",X"D6",X"32",X"CD",X"5E",X"29",X"DD",X"CB", + X"00",X"C6",X"DD",X"36",X"04",X"80",X"21",X"00",X"02",X"22",X"52",X"60",X"EF",X"CD",X"FC",X"0A", + X"3A",X"00",X"60",X"CB",X"7F",X"20",X"05",X"3A",X"0B",X"60",X"A7",X"C0",X"DD",X"E5",X"CD",X"73", + X"3B",X"CD",X"53",X"1B",X"DD",X"E1",X"DD",X"35",X"04",X"20",X"E1",X"DD",X"CB",X"00",X"86",X"CD", + X"51",X"1E",X"CD",X"7C",X"1B",X"EF",X"DD",X"E5",X"DD",X"21",X"DF",X"61",X"DD",X"36",X"00",X"80", + X"CD",X"8A",X"07",X"DD",X"E1",X"06",X"01",X"CD",X"76",X"0F",X"3A",X"1B",X"6C",X"A7",X"20",X"F5", + X"DD",X"36",X"02",X"02",X"CD",X"9D",X"23",X"21",X"00",X"02",X"22",X"52",X"60",X"21",X"80",X"80", + X"22",X"30",X"60",X"3E",X"14",X"CD",X"86",X"0F",X"C9",X"3E",X"03",X"CD",X"A0",X"1B",X"CD",X"4D", + X"1E",X"CD",X"26",X"0F",X"CD",X"9F",X"3A",X"CD",X"EF",X"3A",X"CD",X"74",X"3F",X"CD",X"BA",X"3F", + X"DD",X"CB",X"00",X"C6",X"DD",X"36",X"04",X"80",X"21",X"00",X"02",X"22",X"52",X"60",X"EF",X"DD", + X"E5",X"DD",X"21",X"DF",X"61",X"CD",X"8A",X"07",X"CD",X"73",X"3B",X"CD",X"53",X"1B",X"DD",X"E1", + X"CD",X"FC",X"0A",X"DD",X"E5",X"DD",X"21",X"A9",X"63",X"DD",X"CB",X"00",X"7E",X"28",X"03",X"CD", + X"25",X"19",X"DD",X"21",X"BE",X"63",X"DD",X"CB",X"00",X"7E",X"28",X"03",X"CD",X"25",X"19",X"DD", + X"21",X"D3",X"63",X"DD",X"CB",X"00",X"7E",X"28",X"03",X"CD",X"25",X"19",X"DD",X"21",X"8D",X"63", + X"DD",X"CB",X"00",X"7E",X"28",X"03",X"CD",X"DE",X"17",X"DD",X"E1",X"DD",X"35",X"04",X"20",X"AE", + X"DD",X"CB",X"00",X"86",X"CD",X"7C",X"1B",X"06",X"5A",X"CD",X"76",X"0F",X"21",X"DF",X"61",X"36", + X"80",X"CD",X"D6",X"32",X"CD",X"5E",X"29",X"21",X"00",X"02",X"22",X"52",X"60",X"CD",X"51",X"1E", + X"CD",X"3A",X"33",X"3A",X"60",X"60",X"E6",X"0F",X"FE",X"0F",X"28",X"03",X"CD",X"9D",X"23",X"EF", + X"DD",X"E5",X"DD",X"21",X"DF",X"61",X"DD",X"36",X"00",X"80",X"CD",X"8A",X"07",X"DD",X"E1",X"06", + X"5A",X"CD",X"76",X"0F",X"DD",X"36",X"02",X"02",X"3E",X"14",X"CD",X"86",X"0F",X"C9",X"CD",X"6A", + X"0F",X"C3",X"CA",X"0B",X"21",X"E8",X"61",X"CB",X"6E",X"C2",X"CA",X"0B",X"FD",X"21",X"59",X"60", + X"2A",X"52",X"60",X"EB",X"2A",X"54",X"60",X"19",X"22",X"54",X"60",X"D5",X"CD",X"BD",X"0D",X"D1", + X"2A",X"56",X"60",X"19",X"11",X"00",X"08",X"E5",X"AF",X"ED",X"52",X"30",X"07",X"E1",X"22",X"56", + X"60",X"C3",X"CA",X"0B",X"D1",X"22",X"56",X"60",X"FD",X"7E",X"08",X"FD",X"BE",X"35",X"38",X"1B", + X"CD",X"15",X"23",X"3A",X"60",X"60",X"E6",X"0F",X"FE",X"0F",X"20",X"12",X"DD",X"E5",X"DD",X"21", + X"E8",X"61",X"06",X"18",X"CD",X"8D",X"1B",X"DD",X"E1",X"18",X"03",X"FD",X"34",X"08",X"CD",X"17", + X"0C",X"CD",X"B2",X"23",X"CD",X"DD",X"29",X"21",X"69",X"60",X"7E",X"E6",X"0F",X"CA",X"CA",X"0B", + X"7E",X"E6",X"F0",X"0F",X"0F",X"0F",X"5F",X"16",X"00",X"23",X"19",X"3A",X"61",X"60",X"BE",X"20", + X"59",X"23",X"7E",X"47",X"E6",X"F0",X"0F",X"0F",X"0F",X"5F",X"16",X"00",X"21",X"E0",X"0B",X"19", + X"CF",X"CF",X"3E",X"FF",X"BD",X"28",X"3B",X"CB",X"7E",X"28",X"03",X"EB",X"18",X"F3",X"78",X"E6", + X"F0",X"FE",X"60",X"CA",X"B8",X"0B",X"DD",X"CB",X"00",X"46",X"20",X"2F",X"FE",X"20",X"20",X"18", + X"E5",X"21",X"35",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"43",X"60",X"34",X"5E", + X"16",X"00",X"19",X"7E",X"A7",X"E1",X"28",X"0A",X"CB",X"FE",X"11",X"03",X"00",X"19",X"78",X"E6", + X"0F",X"77",X"21",X"69",X"60",X"7E",X"3D",X"C6",X"10",X"77",X"C9",X"78",X"E6",X"F0",X"FE",X"70", + X"C2",X"C2",X"0B",X"06",X"03",X"C3",X"B8",X"0B",X"00",X"02",X"80",X"00",X"03",X"00",X"FD",X"FF", + X"00",X"00",X"F2",X"0B",X"F7",X"0B",X"FC",X"0B",X"FF",X"0B",X"04",X"0C",X"09",X"0C",X"0E",X"0C", + X"15",X"0C",X"D6",X"62",X"EC",X"62",X"FF",X"02",X"63",X"11",X"63",X"FF",X"20",X"63",X"FF",X"47", + X"63",X"58",X"63",X"FF",X"69",X"63",X"7B",X"63",X"FF",X"8D",X"63",X"9B",X"63",X"FF",X"A9",X"63", + X"BE",X"63",X"D3",X"63",X"FF",X"FF",X"FF",X"FD",X"21",X"59",X"60",X"3A",X"55",X"60",X"CB",X"3F", + X"CB",X"3F",X"CB",X"3F",X"5F",X"16",X"00",X"21",X"00",X"D3",X"19",X"CD",X"26",X"23",X"01",X"E0", + X"FF",X"09",X"FD",X"36",X"FF",X"10",X"FD",X"7E",X"21",X"FE",X"13",X"28",X"08",X"1E",X"FD",X"CD", + X"9F",X"0D",X"57",X"F7",X"09",X"E5",X"FD",X"6E",X"27",X"FD",X"66",X"28",X"7E",X"23",X"FD",X"75", + X"27",X"FD",X"74",X"28",X"E1",X"47",X"CB",X"38",X"CB",X"38",X"CB",X"38",X"CB",X"38",X"28",X"0C", + X"F7",X"C5",X"01",X"E0",X"FF",X"09",X"C1",X"FD",X"35",X"FF",X"10",X"F4",X"E6",X"0F",X"28",X"27", + X"47",X"FD",X"5E",X"22",X"FD",X"56",X"23",X"CD",X"9F",X"0D",X"D5",X"CB",X"22",X"CB",X"22",X"CB", + X"22",X"82",X"57",X"F7",X"C5",X"01",X"E0",X"FF",X"09",X"C1",X"FD",X"35",X"FF",X"D1",X"13",X"10", + X"E6",X"FD",X"73",X"22",X"FD",X"72",X"23",X"E5",X"21",X"90",X"60",X"3A",X"8F",X"60",X"5F",X"16", + X"00",X"19",X"EB",X"FD",X"6E",X"24",X"FD",X"66",X"25",X"01",X"04",X"00",X"ED",X"B0",X"FD",X"75", + X"24",X"FD",X"74",X"25",X"E1",X"FD",X"35",X"26",X"20",X"08",X"E5",X"FD",X"35",X"1E",X"C4",X"E8", + X"0E",X"E1",X"FD",X"CB",X"07",X"7E",X"20",X"23",X"1E",X"24",X"FD",X"56",X"01",X"01",X"E0",X"FF", + X"F7",X"09",X"FD",X"35",X"FF",X"20",X"F9",X"21",X"10",X"61",X"3A",X"8F",X"60",X"5F",X"16",X"00", + X"19",X"AF",X"06",X"04",X"77",X"23",X"10",X"FC",X"C3",X"8E",X"0D",X"E5",X"FD",X"6E",X"33",X"FD", + X"66",X"34",X"7E",X"23",X"FD",X"75",X"33",X"FD",X"74",X"34",X"E1",X"47",X"CB",X"38",X"CB",X"38", + X"CB",X"38",X"CB",X"38",X"E6",X"0F",X"4F",X"80",X"FD",X"96",X"FF",X"ED",X"44",X"C5",X"47",X"1E", + X"24",X"CD",X"9F",X"0D",X"57",X"F7",X"C5",X"01",X"E0",X"FF",X"09",X"C1",X"FD",X"35",X"FF",X"10", + X"F0",X"C1",X"78",X"A7",X"28",X"28",X"C5",X"FD",X"5E",X"2E",X"FD",X"56",X"2F",X"CD",X"9F",X"0D", + X"D5",X"CB",X"22",X"CB",X"22",X"CB",X"22",X"82",X"57",X"F7",X"C5",X"01",X"E0",X"FF",X"09",X"C1", + X"FD",X"35",X"FF",X"D1",X"13",X"10",X"E6",X"FD",X"73",X"2E",X"FD",X"72",X"2F",X"C1",X"79",X"A7", + X"28",X"15",X"41",X"1E",X"FE",X"CD",X"9F",X"0D",X"57",X"F7",X"C5",X"01",X"E0",X"FF",X"09",X"C1", + X"FD",X"35",X"FF",X"28",X"02",X"10",X"F2",X"21",X"10",X"61",X"3A",X"8F",X"60",X"5F",X"16",X"00", + X"19",X"EB",X"FD",X"6E",X"30",X"FD",X"66",X"31",X"01",X"04",X"00",X"ED",X"B0",X"FD",X"75",X"30", + X"FD",X"74",X"31",X"FD",X"35",X"32",X"20",X"06",X"FD",X"35",X"2A",X"C4",X"F0",X"0E",X"3A",X"8F", + X"60",X"C6",X"04",X"FE",X"80",X"38",X"01",X"AF",X"32",X"8F",X"60",X"32",X"8F",X"60",X"C9",X"FD", + X"7E",X"21",X"FE",X"10",X"28",X"08",X"FE",X"13",X"28",X"08",X"FD",X"7E",X"01",X"C9",X"FD",X"7E", + X"03",X"C9",X"3E",X"03",X"C9",X"AF",X"06",X"18",X"21",X"E5",X"0D",X"18",X"20",X"06",X"13",X"3A", + X"00",X"60",X"CB",X"6F",X"28",X"07",X"3A",X"02",X"90",X"CB",X"5F",X"20",X"08",X"21",X"E9",X"0D", + X"3A",X"55",X"60",X"18",X"08",X"21",X"E9",X"0D",X"3A",X"55",X"60",X"ED",X"44",X"5E",X"23",X"56", + X"23",X"12",X"10",X"F9",X"C9",X"01",X"D0",X"21",X"D0",X"41",X"D0",X"61",X"D0",X"02",X"D0",X"22", + X"D0",X"42",X"D0",X"62",X"D0",X"03",X"D0",X"23",X"D0",X"43",X"D0",X"63",X"D0",X"04",X"D0",X"24", + X"D0",X"44",X"D0",X"64",X"D0",X"05",X"D0",X"25",X"D0",X"45",X"D0",X"65",X"D0",X"06",X"D0",X"26", + X"D0",X"46",X"D0",X"66",X"D0",X"FD",X"E5",X"FD",X"21",X"59",X"60",X"FD",X"5E",X"00",X"1D",X"CB", + X"23",X"16",X"00",X"21",X"40",X"50",X"19",X"CF",X"11",X"5A",X"60",X"01",X"04",X"00",X"ED",X"B0", + X"FD",X"75",X"05",X"FD",X"74",X"06",X"FD",X"E1",X"CD",X"07",X"11",X"C9",X"FD",X"E5",X"FD",X"21", + X"59",X"60",X"FD",X"6E",X"05",X"FD",X"66",X"06",X"7E",X"FD",X"77",X"07",X"23",X"06",X"3F",X"CB", + X"6F",X"28",X"02",X"06",X"1F",X"E6",X"0F",X"FE",X"0F",X"20",X"02",X"06",X"A0",X"FD",X"70",X"35", + X"FD",X"36",X"08",X"00",X"7E",X"FD",X"77",X"1D",X"23",X"7E",X"FD",X"77",X"29",X"23",X"7E",X"FD", + X"77",X"10",X"23",X"A7",X"28",X"09",X"87",X"4F",X"06",X"00",X"11",X"6A",X"60",X"ED",X"B0",X"FD", + X"75",X"05",X"FD",X"74",X"06",X"FD",X"5E",X"1D",X"CB",X"23",X"16",X"00",X"21",X"6A",X"53",X"19", + X"CF",X"FD",X"CB",X"07",X"6E",X"28",X"26",X"23",X"11",X"62",X"60",X"01",X"03",X"00",X"ED",X"B0", + X"7E",X"FD",X"77",X"1E",X"23",X"FD",X"75",X"1F",X"FD",X"74",X"20",X"5F",X"16",X"00",X"19",X"7E", + X"FD",X"77",X"2A",X"23",X"FD",X"75",X"2B",X"FD",X"74",X"2C",X"C3",X"E5",X"0E",X"7E",X"FD",X"77", + X"1E",X"23",X"FD",X"75",X"1F",X"FD",X"74",X"20",X"FD",X"CB",X"07",X"7E",X"28",X"17",X"FD",X"5E", + X"29",X"CB",X"23",X"16",X"00",X"21",X"6A",X"53",X"19",X"CF",X"7E",X"FD",X"77",X"2A",X"23",X"FD", + X"75",X"2B",X"FD",X"74",X"2C",X"FD",X"E1",X"C9",X"FD",X"E5",X"FD",X"21",X"59",X"60",X"18",X"06", + X"FD",X"E5",X"FD",X"21",X"65",X"60",X"FD",X"6E",X"1F",X"FD",X"66",X"20",X"7E",X"FD",X"77",X"21", + X"23",X"FD",X"75",X"1F",X"FD",X"74",X"20",X"87",X"5F",X"16",X"00",X"21",X"72",X"54",X"19",X"CF", + X"11",X"22",X"00",X"FD",X"19",X"FD",X"E5",X"D1",X"01",X"05",X"00",X"ED",X"B0",X"FD",X"75",X"05", + X"FD",X"74",X"06",X"FD",X"E1",X"C9",X"3E",X"FF",X"21",X"C0",X"D0",X"01",X"01",X"20",X"D7",X"C9", + X"00",X"CD",X"47",X"0F",X"21",X"90",X"60",X"19",X"7E",X"C6",X"48",X"C9",X"CD",X"47",X"0F",X"21", + X"10",X"61",X"19",X"3E",X"C8",X"96",X"C9",X"5F",X"E6",X"F8",X"57",X"3A",X"55",X"60",X"E6",X"F8", + X"82",X"CB",X"3F",X"57",X"7B",X"E6",X"07",X"CB",X"3F",X"82",X"CB",X"BF",X"5F",X"16",X"00",X"C9", + X"21",X"52",X"60",X"5E",X"23",X"56",X"CD",X"4B",X"1F",X"C9",X"21",X"E2",X"61",X"CB",X"66",X"C0", + X"E1",X"23",X"23",X"23",X"E5",X"C9",X"DD",X"E5",X"C5",X"EF",X"CD",X"73",X"3B",X"CD",X"B5",X"01", + X"C1",X"10",X"F5",X"DD",X"E1",X"C9",X"5F",X"FE",X"00",X"28",X"06",X"3A",X"00",X"60",X"CB",X"7F", + X"C8",X"16",X"00",X"21",X"06",X"6C",X"19",X"7B",X"FE",X"14",X"CA",X"B0",X"0F",X"FE",X"10",X"30", + X"03",X"36",X"01",X"C9",X"D6",X"10",X"E5",X"5F",X"21",X"B6",X"0F",X"19",X"7E",X"E1",X"77",X"C9", + X"36",X"01",X"CD",X"C8",X"0F",X"C9",X"C1",X"91",X"81",X"C1",X"A1",X"B1",X"A1",X"31",X"5F",X"16", + X"00",X"21",X"06",X"6C",X"19",X"CB",X"D6",X"C9",X"2A",X"52",X"60",X"CB",X"25",X"CB",X"14",X"CB", + X"25",X"CB",X"14",X"7C",X"FE",X"09",X"38",X"02",X"3E",X"08",X"6F",X"26",X"00",X"11",X"EB",X"0F", + X"19",X"3A",X"1A",X"6C",X"E6",X"0F",X"86",X"32",X"1A",X"6C",X"C9",X"70",X"80",X"90",X"A0",X"B0", + X"C0",X"D0",X"E0",X"F0",X"85",X"DD",X"CB",X"00",X"6E",X"C2",X"4A",X"10",X"DD",X"CB",X"00",X"EE", + X"DD",X"36",X"01",X"3C",X"DD",X"36",X"02",X"01",X"DD",X"7E",X"03",X"E6",X"03",X"DD",X"77",X"03", + X"87",X"4F",X"87",X"81",X"4F",X"06",X"00",X"11",X"04",X"00",X"DD",X"E5",X"E1",X"19",X"EB",X"21", + X"E3",X"10",X"ED",X"B0",X"3A",X"59",X"60",X"3D",X"DD",X"77",X"08",X"DD",X"77",X"0E",X"DD",X"77", + X"14",X"5F",X"16",X"00",X"21",X"01",X"11",X"19",X"7E",X"DD",X"77",X"09",X"DD",X"77",X"0F",X"DD", + X"77",X"15",X"3E",X"0A",X"CD",X"86",X"0F",X"C3",X"CC",X"10",X"CD",X"6A",X"0F",X"C3",X"CC",X"10", + X"DD",X"7E",X"01",X"A7",X"28",X"03",X"DD",X"35",X"01",X"21",X"00",X"02",X"C3",X"7A",X"10",X"DD", + X"7E",X"02",X"A7",X"20",X"08",X"2A",X"52",X"60",X"CD",X"43",X"1F",X"18",X"0D",X"21",X"40",X"00", + X"FE",X"02",X"20",X"03",X"21",X"80",X"FF",X"CD",X"F9",X"22",X"EB",X"DD",X"6E",X"04",X"DD",X"66", + X"05",X"19",X"DD",X"7E",X"01",X"A7",X"20",X"0F",X"7C",X"FE",X"08",X"38",X"04",X"FE",X"F8",X"38", + X"06",X"06",X"16",X"CD",X"8D",X"1B",X"C9",X"DD",X"75",X"04",X"DD",X"74",X"05",X"DD",X"46",X"03", + X"05",X"28",X"0F",X"DD",X"75",X"0A",X"DD",X"74",X"0B",X"05",X"28",X"06",X"DD",X"75",X"10",X"DD", + X"74",X"11",X"CD",X"46",X"33",X"FE",X"10",X"30",X"13",X"3E",X"C4",X"DD",X"46",X"03",X"D6",X"10", + X"10",X"FC",X"47",X"3A",X"07",X"62",X"B8",X"38",X"03",X"CD",X"60",X"33",X"DD",X"E5",X"DD",X"46", + X"03",X"C5",X"21",X"F5",X"10",X"CD",X"D1",X"07",X"11",X"06",X"00",X"DD",X"19",X"C1",X"10",X"F1", + X"DD",X"E1",X"C9",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"B0",X"00",X"00",X"00", + X"00",X"00",X"A0",X"00",X"00",X"E0",X"01",X"E4",X"01",X"E8",X"01",X"EC",X"01",X"F0",X"01",X"F4", + X"01",X"09",X"04",X"04",X"05",X"05",X"05",X"21",X"35",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28", + X"03",X"21",X"43",X"60",X"01",X"01",X"0E",X"AF",X"D7",X"21",X"4C",X"11",X"3A",X"59",X"60",X"3D", + X"87",X"5F",X"16",X"00",X"19",X"4E",X"23",X"46",X"11",X"36",X"60",X"3A",X"00",X"60",X"CB",X"6F", + X"28",X"03",X"11",X"44",X"60",X"CD",X"13",X"1F",X"7D",X"E6",X"0F",X"91",X"30",X"FD",X"81",X"26", + X"00",X"6F",X"19",X"7E",X"A7",X"20",X"EE",X"36",X"FF",X"10",X"EA",X"C9",X"02",X"01",X"06",X"03", + X"04",X"02",X"0C",X"06",X"08",X"04",X"0D",X"07",X"DD",X"CB",X"00",X"6E",X"C2",X"96",X"11",X"DD", + X"CB",X"00",X"EE",X"DD",X"E5",X"E1",X"11",X"04",X"00",X"19",X"EB",X"21",X"03",X"12",X"DD",X"7E", + X"03",X"87",X"87",X"87",X"DD",X"86",X"03",X"4F",X"06",X"00",X"09",X"01",X"09",X"00",X"ED",X"B0", + X"DD",X"36",X"0D",X"04",X"DD",X"36",X"0E",X"00",X"3E",X"02",X"CD",X"86",X"0F",X"DD",X"CB",X"00", + X"F6",X"DD",X"36",X"01",X"2D",X"C9",X"DD",X"35",X"0C",X"20",X"06",X"06",X"0F",X"CD",X"8D",X"1B", + X"C9",X"CD",X"46",X"33",X"FE",X"0E",X"30",X"0A",X"CD",X"53",X"33",X"FE",X"0E",X"30",X"03",X"CD", + X"60",X"33",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"DD",X"5E",X"08",X"DD",X"56",X"09",X"19",X"DD", + X"75",X"04",X"DD",X"74",X"05",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"DD",X"5E",X"0A",X"DD",X"56", + X"0B",X"19",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"35",X"0D",X"20",X"07",X"DD",X"36",X"0D", + X"04",X"DD",X"34",X"0E",X"21",X"27",X"12",X"11",X"0C",X"00",X"DD",X"CB",X"03",X"46",X"28",X"02", + X"19",X"19",X"DD",X"CB",X"0E",X"46",X"28",X"01",X"19",X"DD",X"56",X"05",X"DD",X"5E",X"07",X"CD", + X"0C",X"09",X"C9",X"00",X"F8",X"00",X"78",X"00",X"FC",X"00",X"00",X"3C",X"00",X"08",X"00",X"8A", + X"00",X"04",X"00",X"00",X"3C",X"00",X"F8",X"00",X"C8",X"00",X"FC",X"00",X"FE",X"3C",X"00",X"08", + X"00",X"C8",X"00",X"04",X"00",X"FE",X"3C",X"C0",X"01",X"01",X"C4",X"01",X"01",X"C8",X"01",X"01", + X"CC",X"01",X"01",X"D0",X"01",X"01",X"D4",X"01",X"01",X"D8",X"01",X"01",X"DC",X"01",X"01",X"C4", + X"01",X"21",X"C0",X"01",X"21",X"CC",X"01",X"21",X"C8",X"01",X"21",X"D4",X"01",X"21",X"D0",X"01", + X"21",X"DC",X"01",X"21",X"D8",X"01",X"21",X"DD",X"CB",X"00",X"6E",X"C2",X"CB",X"12",X"DD",X"36", + X"00",X"A0",X"21",X"80",X"01",X"DD",X"CB",X"03",X"56",X"28",X"07",X"DD",X"CB",X"00",X"E6",X"21", + X"00",X"04",X"DD",X"75",X"11",X"DD",X"74",X"12",X"3E",X"01",X"DD",X"CB",X"03",X"46",X"28",X"01", + X"3C",X"DD",X"77",X"02",X"3A",X"16",X"60",X"E6",X"07",X"5F",X"16",X"00",X"21",X"8E",X"14",X"19", + X"7E",X"DD",X"77",X"0B",X"DD",X"36",X"0A",X"00",X"DD",X"46",X"02",X"0E",X"10",X"DD",X"CB",X"00", + X"66",X"20",X"07",X"3E",X"FE",X"81",X"10",X"FD",X"18",X"02",X"3E",X"02",X"DD",X"77",X"05",X"DD", + X"36",X"04",X"00",X"CD",X"31",X"0F",X"DD",X"86",X"0B",X"C6",X"08",X"DD",X"77",X"07",X"DD",X"36", + X"08",X"01",X"DD",X"36",X"09",X"0C",X"3E",X"0C",X"CD",X"86",X"0F",X"CD",X"6A",X"0F",X"C3",X"4E", + X"13",X"DD",X"4E",X"11",X"DD",X"46",X"12",X"DD",X"CB",X"00",X"66",X"28",X"07",X"C5",X"E1",X"CD", + X"F9",X"22",X"18",X"03",X"CD",X"60",X"0F",X"DD",X"75",X"13",X"DD",X"74",X"14",X"DD",X"CB",X"00", + X"66",X"20",X"03",X"CD",X"43",X"1F",X"DD",X"5E",X"04",X"DD",X"56",X"05",X"19",X"DD",X"75",X"04", + X"DD",X"74",X"05",X"7C",X"DD",X"CB",X"00",X"5E",X"20",X"18",X"DD",X"CB",X"00",X"66",X"20",X"0A", + X"FE",X"80",X"30",X"0E",X"FE",X"70",X"38",X"0A",X"18",X"04",X"FE",X"80",X"38",X"04",X"DD",X"CB", + X"00",X"DE",X"3A",X"07",X"62",X"DD",X"BE",X"07",X"38",X"0C",X"DD",X"7E",X"07",X"FE",X"A0",X"30", + X"0F",X"DD",X"34",X"0B",X"18",X"0A",X"DD",X"7E",X"0B",X"FE",X"20",X"38",X"03",X"DD",X"35",X"0B", + X"DD",X"7E",X"05",X"CD",X"31",X"0F",X"DD",X"86",X"0B",X"C6",X"08",X"DD",X"77",X"07",X"DD",X"7E", + X"02",X"DD",X"77",X"15",X"DD",X"36",X"16",X"00",X"DD",X"7E",X"05",X"CD",X"A6",X"14",X"C3",X"BE", + X"13",X"DD",X"34",X"16",X"21",X"96",X"14",X"CD",X"D1",X"07",X"DD",X"56",X"05",X"DD",X"5E",X"07", + X"DD",X"7E",X"0B",X"CD",X"D4",X"14",X"D5",X"DD",X"6E",X"0C",X"DD",X"66",X"0D",X"ED",X"5B",X"52", + X"60",X"19",X"E5",X"11",X"00",X"08",X"AF",X"ED",X"52",X"E1",X"38",X"06",X"21",X"00",X"00",X"DD", + X"34",X"0E",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"21",X"9A",X"14",X"DD",X"CB",X"0E",X"46",X"20", + X"03",X"21",X"9D",X"14",X"D1",X"E5",X"CD",X"40",X"08",X"E1",X"CD",X"AE",X"08",X"CD",X"46",X"33", + X"FE",X"0C",X"30",X"0A",X"CD",X"53",X"33",X"FE",X"0C",X"30",X"03",X"CD",X"60",X"33",X"DD",X"7E", + X"05",X"DD",X"77",X"17",X"DD",X"E5",X"E1",X"11",X"19",X"00",X"19",X"DD",X"75",X"25",X"DD",X"74", + X"26",X"DD",X"7E",X"17",X"D6",X"10",X"DD",X"77",X"17",X"CD",X"A6",X"14",X"C3",X"68",X"14",X"DD", + X"34",X"16",X"DD",X"7E",X"17",X"CD",X"31",X"0F",X"DD",X"86",X"0B",X"C6",X"08",X"DD",X"77",X"18", + X"DD",X"56",X"17",X"5F",X"CD",X"40",X"08",X"21",X"A3",X"14",X"CD",X"AE",X"08",X"DD",X"56",X"17", + X"DD",X"5E",X"18",X"DD",X"7E",X"0B",X"CD",X"D4",X"14",X"D5",X"DD",X"6E",X"25",X"DD",X"66",X"26", + X"E5",X"FD",X"E1",X"FD",X"6E",X"00",X"FD",X"66",X"01",X"ED",X"5B",X"52",X"60",X"19",X"E5",X"11", + X"00",X"08",X"AF",X"ED",X"52",X"E1",X"38",X"06",X"21",X"00",X"00",X"FD",X"34",X"02",X"FD",X"75", + X"00",X"FD",X"74",X"01",X"21",X"9A",X"14",X"FD",X"CB",X"02",X"46",X"28",X"03",X"21",X"9D",X"14", + X"D1",X"E5",X"CD",X"40",X"08",X"E1",X"CD",X"AE",X"08",X"3A",X"05",X"62",X"DD",X"96",X"17",X"30", + X"02",X"ED",X"44",X"FE",X"0C",X"30",X"11",X"3A",X"07",X"62",X"DD",X"96",X"18",X"30",X"02",X"ED", + X"44",X"FE",X"0C",X"30",X"03",X"CD",X"60",X"33",X"DD",X"6E",X"25",X"DD",X"66",X"26",X"11",X"03", + X"00",X"19",X"DD",X"75",X"25",X"DD",X"74",X"26",X"DD",X"35",X"15",X"C2",X"D1",X"13",X"DD",X"7E", + X"16",X"A7",X"C0",X"06",X"27",X"CD",X"8D",X"1B",X"3E",X"0C",X"CD",X"BE",X"0F",X"C9",X"24",X"28", + X"2C",X"30",X"34",X"38",X"3C",X"40",X"D0",X"00",X"D0",X"00",X"D8",X"00",X"06",X"DC",X"00",X"06", + X"D4",X"00",X"06",X"D4",X"00",X"06",X"DD",X"CB",X"00",X"66",X"20",X"12",X"DD",X"CB",X"00",X"5E", + X"20",X"06",X"FE",X"40",X"30",X"18",X"18",X"1B",X"FE",X"C0",X"38",X"12",X"18",X"15",X"DD",X"CB", + X"00",X"5E",X"20",X"06",X"FE",X"C0",X"38",X"06",X"18",X"09",X"FE",X"40",X"38",X"05",X"E1",X"23", + X"23",X"23",X"E5",X"C9",X"CD",X"C8",X"32",X"7B",X"D6",X"10",X"5F",X"78",X"A7",X"28",X"16",X"05", + X"28",X"13",X"C5",X"D5",X"CD",X"40",X"08",X"21",X"86",X"32",X"CD",X"AE",X"08",X"D1",X"7B",X"D6", + X"10",X"5F",X"C1",X"10",X"ED",X"79",X"A7",X"28",X"1B",X"D5",X"C5",X"3D",X"4F",X"87",X"81",X"4F", + X"06",X"00",X"21",X"59",X"32",X"09",X"E5",X"CD",X"40",X"08",X"E1",X"CD",X"AE",X"08",X"C1",X"D1", + X"7B",X"91",X"5F",X"14",X"C9",X"DD",X"CB",X"00",X"6E",X"C2",X"6B",X"15",X"DD",X"36",X"00",X"A0", + X"DD",X"36",X"04",X"00",X"3E",X"F8",X"DD",X"77",X"05",X"CD",X"31",X"0F",X"C6",X"08",X"DD",X"77", + X"07",X"DD",X"36",X"06",X"00",X"DD",X"36",X"08",X"00",X"DD",X"36",X"09",X"07",X"DD",X"7E",X"03", + X"87",X"87",X"5F",X"16",X"00",X"21",X"3C",X"16",X"19",X"DD",X"E5",X"06",X"04",X"7E",X"DD",X"77", + X"0A",X"23",X"DD",X"23",X"10",X"F7",X"DD",X"E1",X"DD",X"7E",X"0A",X"DD",X"77",X"0E",X"DD",X"7E", + X"0B",X"DD",X"77",X"0F",X"DD",X"36",X"10",X"03",X"C3",X"0F",X"16",X"01",X"20",X"01",X"CD",X"60", + X"0F",X"CD",X"43",X"1F",X"EB",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"19",X"DD",X"75",X"04",X"DD", + X"74",X"05",X"7C",X"FE",X"08",X"30",X"06",X"06",X"11",X"CD",X"8D",X"1B",X"C9",X"DD",X"6E",X"0E", + X"DD",X"66",X"0F",X"DD",X"5E",X"0C",X"DD",X"56",X"0D",X"DD",X"CB",X"00",X"66",X"C2",X"D0",X"15", + X"AF",X"ED",X"52",X"38",X"1C",X"DD",X"75",X"0E",X"DD",X"74",X"0F",X"EB",X"DD",X"6E",X"06",X"DD", + X"66",X"07",X"19",X"7C",X"FE",X"C0",X"30",X"09",X"DD",X"75",X"06",X"DD",X"74",X"07",X"C3",X"0F", + X"16",X"DD",X"CB",X"00",X"E6",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"0F",X"00",X"C3",X"0F",X"16", + X"19",X"DD",X"75",X"0E",X"DD",X"74",X"0F",X"CD",X"43",X"1F",X"EB",X"DD",X"6E",X"06",X"DD",X"66", + X"07",X"19",X"E5",X"DD",X"7E",X"05",X"CD",X"31",X"0F",X"E1",X"C6",X"08",X"BC",X"38",X"1A",X"67", + X"2E",X"00",X"DD",X"CB",X"00",X"A6",X"E5",X"3E",X"0B",X"CD",X"86",X"0F",X"E1",X"DD",X"7E",X"0A", + X"DD",X"77",X"0E",X"DD",X"7E",X"0B",X"DD",X"77",X"0F",X"DD",X"75",X"06",X"DD",X"74",X"07",X"CD", + X"46",X"33",X"FE",X"0C",X"30",X"0A",X"CD",X"53",X"33",X"FE",X"0C",X"30",X"03",X"CD",X"60",X"33", + X"DD",X"35",X"10",X"20",X"10",X"DD",X"36",X"10",X"03",X"DD",X"7E",X"08",X"3C",X"FE",X"08",X"38", + X"01",X"AF",X"DD",X"77",X"08",X"21",X"44",X"16",X"CD",X"D1",X"07",X"C9",X"00",X"07",X"60",X"00", + X"00",X"05",X"60",X"00",X"E0",X"00",X"E4",X"00",X"E0",X"20",X"F0",X"00",X"E0",X"00",X"E4",X"00", + X"E0",X"20",X"F0",X"00",X"DD",X"CB",X"00",X"6E",X"C2",X"CF",X"16",X"DD",X"36",X"00",X"A0",X"DD", + X"7E",X"03",X"E6",X"03",X"87",X"5F",X"16",X"00",X"21",X"B4",X"17",X"19",X"7E",X"DD",X"77",X"0A", + X"23",X"7E",X"DD",X"77",X"0B",X"3E",X"F8",X"CD",X"31",X"0F",X"C6",X"18",X"DD",X"77",X"07",X"DD", + X"36",X"06",X"00",X"DD",X"36",X"04",X"00",X"DD",X"36",X"05",X"F8",X"DD",X"36",X"08",X"00",X"DD", + X"36",X"10",X"00",X"DD",X"36",X"11",X"00",X"DD",X"7E",X"03",X"E6",X"0C",X"CB",X"5F",X"20",X"04", + X"DD",X"CB",X"00",X"E6",X"0F",X"0F",X"5F",X"16",X"00",X"21",X"BA",X"17",X"19",X"7E",X"DD",X"77", + X"0E",X"DD",X"77",X"0F",X"3E",X"11",X"CD",X"86",X"0F",X"DD",X"56",X"05",X"DD",X"5E",X"07",X"21", + X"C6",X"17",X"DD",X"CB",X"08",X"46",X"28",X"03",X"21",X"D2",X"17",X"CD",X"0C",X"09",X"C9",X"CD", + X"6A",X"0F",X"C3",X"B9",X"16",X"DD",X"4E",X"0A",X"DD",X"46",X"0B",X"CD",X"60",X"0F",X"DD",X"75", + X"0C",X"DD",X"74",X"0D",X"CD",X"43",X"1F",X"DD",X"5E",X"04",X"DD",X"56",X"05",X"19",X"DD",X"75", + X"04",X"DD",X"74",X"05",X"7C",X"FE",X"08",X"30",X"13",X"06",X"12",X"CD",X"8D",X"1B",X"3A",X"69", + X"63",X"21",X"7B",X"63",X"B6",X"C0",X"3E",X"11",X"CD",X"BE",X"0F",X"C9",X"DD",X"CB",X"00",X"66", + X"28",X"1D",X"DD",X"35",X"0F",X"20",X"4C",X"DD",X"7E",X"0E",X"DD",X"77",X"0F",X"3A",X"07",X"62", + X"DD",X"BE",X"07",X"30",X"05",X"DD",X"34",X"07",X"18",X"03",X"DD",X"35",X"07",X"18",X"34",X"21", + X"00",X"01",X"DD",X"CB",X"00",X"56",X"28",X"03",X"CD",X"43",X"1F",X"DD",X"5E",X"06",X"DD",X"56", + X"07",X"19",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"35",X"0F",X"20",X"16",X"DD",X"7E",X"0E", + X"DD",X"77",X"0F",X"DD",X"7E",X"00",X"DD",X"CB",X"00",X"96",X"2F",X"E6",X"04",X"DD",X"86",X"00", + X"DD",X"77",X"00",X"DD",X"7E",X"07",X"FE",X"98",X"38",X"04",X"DD",X"36",X"07",X"98",X"DD",X"7E", + X"05",X"CD",X"31",X"0F",X"C6",X"18",X"DD",X"BE",X"07",X"38",X"07",X"FE",X"98",X"30",X"03",X"DD", + X"77",X"07",X"CD",X"46",X"33",X"FE",X"12",X"30",X"0A",X"CD",X"53",X"33",X"FE",X"12",X"30",X"03", + X"CD",X"60",X"33",X"DD",X"6E",X"10",X"DD",X"66",X"11",X"DD",X"5E",X"0C",X"DD",X"56",X"0D",X"19", + X"7C",X"FE",X"08",X"38",X"06",X"D6",X"08",X"67",X"DD",X"34",X"08",X"DD",X"75",X"10",X"DD",X"74", + X"11",X"C3",X"B9",X"16",X"40",X"01",X"00",X"01",X"C0",X"00",X"0C",X"06",X"08",X"18",X"71",X"74", + X"77",X"7A",X"7D",X"81",X"84",X"87",X"00",X"01",X"0B",X"04",X"01",X"0B",X"08",X"01",X"0B",X"0C", + X"01",X"0B",X"10",X"01",X"0B",X"14",X"01",X"0B",X"18",X"01",X"0B",X"1C",X"01",X"0B",X"DD",X"CB", + X"00",X"6E",X"20",X"23",X"DD",X"36",X"00",X"A0",X"DD",X"36",X"04",X"00",X"DD",X"36",X"05",X"20", + X"DD",X"36",X"06",X"00",X"DD",X"36",X"07",X"58",X"DD",X"36",X"02",X"00",X"DD",X"36",X"0D",X"50", + X"DD",X"36",X"08",X"01",X"C3",X"14",X"18",X"DD",X"7E",X"02",X"21",X"0E",X"18",X"DF",X"14",X"18", + X"14",X"18",X"14",X"18",X"CD",X"6A",X"0F",X"C3",X"5C",X"18",X"DD",X"6E",X"04",X"DD",X"66",X"05", + X"ED",X"5B",X"52",X"60",X"AF",X"ED",X"52",X"DD",X"75",X"04",X"DD",X"74",X"05",X"7C",X"FE",X"80", + X"38",X"07",X"DD",X"CB",X"00",X"C6",X"C3",X"4B",X"18",X"DD",X"CB",X"00",X"46",X"CA",X"4B",X"18", + X"FE",X"08",X"D2",X"4B",X"18",X"06",X"0E",X"CD",X"8D",X"1B",X"C9",X"CD",X"46",X"33",X"FE",X"14", + X"30",X"0A",X"CD",X"53",X"33",X"FE",X"14",X"30",X"03",X"CD",X"60",X"33",X"DD",X"7E",X"09",X"A7", + X"28",X"05",X"DD",X"35",X"09",X"18",X"2C",X"DD",X"34",X"08",X"21",X"E3",X"18",X"DD",X"7E",X"08", + X"FE",X"04",X"38",X"04",X"AF",X"DD",X"77",X"08",X"5F",X"16",X"00",X"21",X"19",X"19",X"19",X"7E", + X"DD",X"77",X"09",X"C3",X"A9",X"18",X"CB",X"23",X"21",X"1D",X"19",X"19",X"CF",X"DD",X"75",X"0A", + X"DD",X"74",X"0B",X"C3",X"A9",X"18",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"DD",X"5E",X"0A",X"DD", + X"56",X"0B",X"19",X"DD",X"75",X"04",X"DD",X"74",X"05",X"DD",X"CB",X"00",X"46",X"28",X"18",X"DD", + X"7E",X"08",X"07",X"07",X"5F",X"07",X"83",X"5F",X"16",X"00",X"21",X"E3",X"18",X"19",X"DD",X"56", + X"05",X"DD",X"5E",X"07",X"CD",X"0C",X"09",X"DD",X"7E",X"05",X"DD",X"CB",X"00",X"46",X"28",X"03", + X"FE",X"28",X"D8",X"D6",X"20",X"DD",X"77",X"0C",X"57",X"DD",X"5E",X"0D",X"21",X"13",X"19",X"CD", + X"E4",X"08",X"C9",X"24",X"01",X"2E",X"20",X"01",X"2E",X"2C",X"01",X"2E",X"28",X"01",X"2E",X"34", + X"01",X"2E",X"30",X"01",X"2E",X"3C",X"01",X"2E",X"38",X"01",X"2E",X"44",X"01",X"2E",X"40",X"01", + X"2E",X"4C",X"01",X"2E",X"48",X"01",X"2E",X"34",X"01",X"2E",X"30",X"01",X"2E",X"3C",X"01",X"2E", + X"38",X"01",X"2E",X"50",X"01",X"00",X"54",X"01",X"00",X"04",X"04",X"04",X"04",X"C0",X"FF",X"00", + X"00",X"40",X"00",X"00",X"00",X"DD",X"CB",X"00",X"6E",X"C2",X"8D",X"19",X"DD",X"CB",X"00",X"EE", + X"DD",X"36",X"02",X"00",X"3A",X"18",X"6C",X"A7",X"20",X"05",X"3E",X"12",X"CD",X"86",X"0F",X"DD", + X"E5",X"21",X"0A",X"1B",X"06",X"0C",X"7E",X"DD",X"77",X"04",X"23",X"DD",X"23",X"10",X"F7",X"DD", + X"E1",X"DD",X"7E",X"03",X"E6",X"03",X"FE",X"03",X"20",X"07",X"DD",X"36",X"02",X"04",X"C3",X"40", + X"1A",X"5F",X"16",X"00",X"21",X"18",X"1B",X"19",X"7E",X"DD",X"77",X"10",X"87",X"DD",X"77",X"12", + X"DD",X"7E",X"03",X"E6",X"0C",X"0F",X"0F",X"5F",X"16",X"00",X"21",X"1A",X"1B",X"19",X"7E",X"DD", + X"77",X"11",X"DD",X"36",X"13",X"00",X"DD",X"36",X"14",X"00",X"C3",X"BE",X"19",X"DD",X"7E",X"02", + X"FE",X"05",X"CA",X"1C",X"1B",X"CD",X"6A",X"0F",X"C3",X"40",X"1A",X"DD",X"CB",X"00",X"66",X"C2", + X"BE",X"19",X"21",X"A9",X"19",X"DD",X"7E",X"02",X"DF",X"B5",X"19",X"70",X"1A",X"B7",X"1A",X"C3", + X"1A",X"BE",X"19",X"1C",X"1B",X"DD",X"35",X"12",X"20",X"04",X"DD",X"36",X"02",X"01",X"21",X"E8", + X"61",X"CB",X"6E",X"C2",X"40",X"1A",X"2A",X"52",X"60",X"CD",X"43",X"1F",X"EB",X"DD",X"6E",X"04", + X"DD",X"66",X"05",X"19",X"DD",X"75",X"04",X"DD",X"74",X"05",X"DD",X"CB",X"00",X"5E",X"20",X"09", + X"7C",X"FE",X"80",X"30",X"04",X"DD",X"CB",X"00",X"DE",X"DD",X"6E",X"0A",X"DD",X"66",X"0B",X"19", + X"DD",X"75",X"0A",X"DD",X"74",X"0B",X"DD",X"CB",X"00",X"5E",X"28",X"1C",X"7C",X"FE",X"10",X"30", + X"17",X"06",X"15",X"CD",X"8D",X"1B",X"3A",X"A9",X"63",X"21",X"BE",X"63",X"B6",X"21",X"D3",X"63", + X"B6",X"C0",X"3E",X"12",X"CD",X"BE",X"0F",X"C9",X"DD",X"7E",X"0B",X"DD",X"96",X"05",X"FE",X"20", + X"38",X"1E",X"3A",X"05",X"62",X"47",X"DD",X"7E",X"05",X"C6",X"10",X"B8",X"30",X"12",X"DD",X"7E", + X"0B",X"D6",X"10",X"B8",X"38",X"0A",X"21",X"00",X"62",X"CB",X"EE",X"21",X"03",X"62",X"36",X"09", + X"DD",X"CB",X"00",X"5E",X"28",X"07",X"DD",X"7E",X"05",X"FE",X"E0",X"30",X"06",X"21",X"16",X"1B", + X"CD",X"D1",X"07",X"DD",X"CB",X"00",X"5E",X"20",X"07",X"DD",X"7E",X"0B",X"FE",X"20",X"38",X"0F", + X"DD",X"E5",X"11",X"06",X"00",X"DD",X"19",X"21",X"16",X"1B",X"CD",X"D1",X"07",X"DD",X"E1",X"C9", + X"DD",X"6E",X"13",X"DD",X"66",X"14",X"E5",X"11",X"00",X"10",X"AF",X"ED",X"52",X"E1",X"38",X"0D", + X"DD",X"36",X"02",X"02",X"DD",X"7E",X"11",X"DD",X"77",X"12",X"C3",X"BE",X"19",X"11",X"80",X"00", + X"19",X"DD",X"75",X"13",X"DD",X"74",X"14",X"DD",X"6E",X"0A",X"DD",X"66",X"0B",X"19",X"DD",X"75", + X"0A",X"DD",X"74",X"0B",X"11",X"80",X"FF",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"19",X"DD",X"75", + X"04",X"DD",X"74",X"05",X"C3",X"BE",X"19",X"DD",X"35",X"12",X"20",X"04",X"DD",X"36",X"02",X"03", + X"C3",X"BE",X"19",X"DD",X"7E",X"14",X"A7",X"28",X"04",X"CB",X"7F",X"28",X"0D",X"DD",X"36",X"02", + X"00",X"DD",X"7E",X"10",X"DD",X"77",X"12",X"C3",X"BE",X"19",X"11",X"80",X"00",X"DD",X"6E",X"04", + X"DD",X"66",X"05",X"19",X"DD",X"75",X"04",X"DD",X"74",X"05",X"11",X"80",X"FF",X"DD",X"6E",X"0A", + X"DD",X"66",X"0B",X"19",X"DD",X"75",X"0A",X"DD",X"74",X"0B",X"DD",X"6E",X"13",X"DD",X"66",X"14", + X"19",X"DD",X"75",X"13",X"DD",X"74",X"14",X"C3",X"BE",X"19",X"00",X"F7",X"00",X"63",X"00",X"08", + X"00",X"07",X"00",X"63",X"00",X"08",X"EC",X"00",X"05",X"0F",X"03",X"05",X"DD",X"5E",X"13",X"DD", + X"56",X"14",X"7A",X"A7",X"CA",X"48",X"1B",X"CB",X"7F",X"C2",X"48",X"1B",X"DD",X"6E",X"04",X"DD", + X"66",X"05",X"19",X"DD",X"75",X"04",X"DD",X"74",X"05",X"DD",X"6E",X"0A",X"DD",X"66",X"0B",X"AF", + X"ED",X"52",X"DD",X"75",X"0A",X"DD",X"74",X"0B",X"DD",X"CB",X"00",X"E6",X"DD",X"36",X"02",X"04", + X"C3",X"40",X"1A",X"3A",X"D5",X"61",X"CB",X"7F",X"C0",X"21",X"19",X"60",X"34",X"4E",X"21",X"51", + X"1D",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"57",X"1D",X"CB",X"51",X"20",X"05",X"CD", + X"39",X"1D",X"18",X"07",X"CF",X"3E",X"24",X"01",X"01",X"03",X"D7",X"C9",X"21",X"51",X"1D",X"3A", + X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"57",X"1D",X"CD",X"39",X"1D",X"C9",X"DD",X"E5",X"E1", + X"0E",X"01",X"AF",X"D7",X"C9",X"AF",X"77",X"23",X"E5",X"ED",X"52",X"E1",X"C8",X"38",X"F6",X"C9", + X"F5",X"CD",X"B2",X"1B",X"CD",X"C9",X"1B",X"CD",X"B5",X"0D",X"F1",X"CD",X"E1",X"1B",X"CD",X"DF", + X"1C",X"C9",X"21",X"E8",X"63",X"01",X"05",X"0C",X"AF",X"D7",X"EF",X"06",X"00",X"11",X"04",X"00", + X"21",X"00",X"70",X"AF",X"77",X"19",X"10",X"FC",X"C9",X"21",X"80",X"D0",X"01",X"03",X"00",X"3E", + X"24",X"D7",X"21",X"80",X"D4",X"01",X"00",X"03",X"CB",X"9E",X"23",X"0B",X"78",X"B1",X"20",X"F8", + X"C9",X"87",X"5F",X"16",X"00",X"21",X"FC",X"1B",X"19",X"CF",X"11",X"80",X"D4",X"7E",X"A7",X"C8", + X"47",X"23",X"4E",X"23",X"EB",X"71",X"23",X"10",X"FC",X"EB",X"18",X"F1",X"06",X"1C",X"25",X"1C", + X"5E",X"1C",X"81",X"1C",X"9C",X"1C",X"13",X"00",X"04",X"02",X"09",X"03",X"03",X"01",X"07",X"00", + X"09",X"01",X"04",X"02",X"09",X"03",X"80",X"02",X"80",X"02",X"A0",X"02",X"A0",X"03",X"08",X"01", + X"18",X"03",X"60",X"00",X"00",X"13",X"00",X"04",X"02",X"09",X"03",X"03",X"01",X"07",X"00",X"09", + X"01",X"04",X"02",X"09",X"03",X"40",X"00",X"08",X"00",X"08",X"03",X"30",X"00",X"08",X"02",X"08", + X"03",X"30",X"02",X"08",X"04",X"08",X"03",X"30",X"04",X"08",X"05",X"08",X"03",X"30",X"05",X"08", + X"06",X"08",X"03",X"30",X"06",X"C0",X"00",X"08",X"01",X"18",X"03",X"60",X"00",X"00",X"13",X"00", + X"04",X"02",X"09",X"03",X"03",X"01",X"07",X"00",X"09",X"01",X"04",X"02",X"09",X"03",X"C0",X"05", + X"80",X"00",X"80",X"02",X"12",X"05",X"0E",X"03",X"60",X"00",X"08",X"01",X"18",X"03",X"60",X"00", + X"00",X"13",X"00",X"04",X"02",X"09",X"03",X"03",X"01",X"07",X"00",X"09",X"01",X"04",X"02",X"09", + X"03",X"20",X"06",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"60",X"03",X"00",X"13",X"00",X"04",X"02", + X"09",X"03",X"03",X"01",X"07",X"00",X"09",X"01",X"04",X"02",X"09",X"03",X"40",X"00",X"08",X"00", + X"08",X"03",X"30",X"00",X"08",X"02",X"08",X"03",X"30",X"02",X"08",X"04",X"08",X"03",X"30",X"04", + X"08",X"05",X"08",X"03",X"30",X"05",X"08",X"06",X"08",X"03",X"30",X"06",X"3C",X"00",X"04",X"01", + X"3C",X"00",X"04",X"01",X"3C",X"00",X"04",X"01",X"3C",X"00",X"04",X"03",X"40",X"00",X"00",X"21", + X"46",X"1D",X"CD",X"39",X"1D",X"CD",X"39",X"1D",X"DD",X"E5",X"DD",X"21",X"94",X"6A",X"06",X"06", + X"21",X"AB",X"D0",X"CD",X"95",X"1E",X"DD",X"21",X"0C",X"60",X"06",X"06",X"21",X"97",X"D0",X"CD", + X"95",X"1E",X"CD",X"4D",X"1E",X"3A",X"00",X"60",X"CB",X"7F",X"20",X"11",X"21",X"5D",X"1D",X"CD", + X"39",X"1D",X"CD",X"33",X"1E",X"21",X"A9",X"1D",X"CD",X"39",X"1D",X"18",X"07",X"3A",X"00",X"60", + X"CB",X"77",X"28",X"12",X"21",X"57",X"1D",X"CD",X"39",X"1D",X"DD",X"21",X"0F",X"60",X"06",X"06", + X"21",X"B7",X"D0",X"CD",X"95",X"1E",X"DD",X"E1",X"C9",X"5E",X"23",X"56",X"23",X"46",X"23",X"7E", + X"12",X"13",X"23",X"10",X"FA",X"C9",X"8A",X"D0",X"08",X"11",X"12",X"2D",X"1C",X"0C",X"18",X"1B", + X"0E",X"93",X"D0",X"03",X"01",X"1C",X"1D",X"B3",X"D0",X"03",X"02",X"17",X"0D",X"02",X"D3",X"06", + X"0C",X"1B",X"0E",X"0D",X"12",X"1D",X"46",X"D1",X"0A",X"15",X"0E",X"1D",X"3B",X"1C",X"24",X"19", + X"15",X"0A",X"22",X"E7",X"D1",X"11",X"19",X"1E",X"1C",X"11",X"24",X"1C",X"1D",X"0A",X"1B",X"1D", + X"24",X"0B",X"1E",X"1D",X"1D",X"18",X"17",X"48",X"D2",X"0E",X"24",X"18",X"17",X"15",X"22",X"24", + X"01",X"24",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"48",X"D2",X"0E",X"01",X"24",X"18",X"1B",X"24", + X"02",X"24",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"1C",X"4A",X"D3",X"0B",X"3A",X"24",X"1E",X"17", + X"12",X"1F",X"0E",X"1B",X"1C",X"0A",X"15",X"24",X"6A",X"D1",X"09",X"10",X"0A",X"16",X"0E",X"24", + X"18",X"1F",X"0E",X"1B",X"CB",X"D1",X"08",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"24",X"01",X"CB", + X"D1",X"08",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"24",X"02",X"CB",X"D1",X"0F",X"0B",X"18",X"17", + X"1E",X"1C",X"24",X"0C",X"11",X"0A",X"1B",X"0A",X"17",X"10",X"0E",X"28",X"0C",X"D2",X"0B",X"19", + X"1E",X"1C",X"11",X"24",X"0B",X"1E",X"1D",X"1D",X"18",X"17",X"79",X"D2",X"03",X"19",X"1D",X"1C", + X"EF",X"D1",X"08",X"17",X"18",X"24",X"0B",X"18",X"17",X"1E",X"1C",X"11",X"0B",X"D1",X"18",X"03", + X"11",X"28",X"D1",X"3E",X"60",X"01",X"04",X"10",X"D5",X"12",X"D5",X"EB",X"11",X"00",X"04",X"19", + X"36",X"02",X"D1",X"3C",X"13",X"10",X"F2",X"06",X"10",X"D1",X"21",X"20",X"00",X"19",X"EB",X"0D", + X"20",X"E6",X"C9",X"3A",X"04",X"60",X"CD",X"27",X"1F",X"32",X"09",X"60",X"DD",X"E5",X"DD",X"21", + X"09",X"60",X"06",X"02",X"21",X"09",X"D3",X"CD",X"95",X"1E",X"DD",X"E1",X"C9",X"06",X"00",X"18", + X"02",X"06",X"01",X"21",X"17",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"01",X"23",X"E5",X"7E", + X"90",X"38",X"21",X"FE",X"06",X"38",X"02",X"3E",X"06",X"47",X"3E",X"06",X"90",X"4F",X"21",X"A3", + X"D0",X"78",X"A7",X"28",X"05",X"36",X"3C",X"23",X"10",X"FB",X"79",X"A7",X"28",X"06",X"47",X"36", + X"24",X"23",X"10",X"FB",X"E1",X"DD",X"E5",X"E5",X"DD",X"E1",X"06",X"02",X"21",X"A1",X"D0",X"CD", + X"95",X"1E",X"DD",X"E1",X"C9",X"0E",X"00",X"DD",X"7E",X"00",X"CB",X"40",X"20",X"08",X"E6",X"F0", + X"0F",X"0F",X"0F",X"0F",X"18",X"04",X"E6",X"0F",X"DD",X"23",X"A7",X"28",X"04",X"0E",X"FF",X"18", + X"0E",X"CB",X"41",X"20",X"0A",X"78",X"FE",X"01",X"28",X"04",X"3E",X"24",X"18",X"01",X"AF",X"77", + X"23",X"10",X"D4",X"C9",X"DD",X"E5",X"FD",X"E5",X"FD",X"21",X"00",X"60",X"FD",X"CB",X"00",X"7E", + X"CA",X"02",X"1F",X"21",X"14",X"60",X"11",X"0E",X"60",X"FD",X"CB",X"00",X"6E",X"28",X"03",X"11", + X"11",X"60",X"CD",X"07",X"1F",X"06",X"06",X"DD",X"21",X"0C",X"60",X"21",X"97",X"D0",X"FD",X"CB", + X"00",X"6E",X"28",X"07",X"DD",X"21",X"0F",X"60",X"21",X"B7",X"D0",X"DD",X"E5",X"CD",X"95",X"1E", + X"DD",X"E1",X"FD",X"E1",X"DD",X"E1",X"C9",X"AF",X"06",X"03",X"1A",X"8E",X"27",X"12",X"2B",X"1B", + X"10",X"F8",X"C9",X"2A",X"15",X"60",X"7C",X"CB",X"25",X"CB",X"14",X"CB",X"BC",X"E6",X"60",X"E2", + X"23",X"1F",X"23",X"22",X"15",X"60",X"C9",X"FE",X"64",X"38",X"04",X"D6",X"64",X"18",X"F8",X"01", + X"00",X"0A",X"90",X"38",X"03",X"0C",X"18",X"FA",X"80",X"CB",X"21",X"CB",X"21",X"CB",X"21",X"CB", + X"21",X"81",X"C9",X"7C",X"2F",X"67",X"7D",X"2F",X"6F",X"23",X"C9",X"D5",X"21",X"00",X"00",X"78", + X"A7",X"28",X"0A",X"CB",X"18",X"30",X"01",X"19",X"EB",X"29",X"EB",X"18",X"F2",X"D1",X"CB",X"3A", + X"CB",X"1B",X"79",X"A7",X"C8",X"CB",X"11",X"30",X"F5",X"19",X"18",X"F2",X"FD",X"21",X"00",X"00", + X"11",X"00",X"01",X"78",X"B1",X"C8",X"AF",X"ED",X"42",X"38",X"04",X"FD",X"19",X"18",X"F7",X"09", + X"CB",X"38",X"CB",X"19",X"78",X"B1",X"C8",X"CB",X"3A",X"CB",X"1B",X"D8",X"18",X"E8",X"C3",X"21", + X"89",X"6A",X"01",X"01",X"0A",X"3E",X"24",X"D7",X"DD",X"E5",X"FD",X"E5",X"FD",X"21",X"94",X"6A", + X"DD",X"21",X"0C",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"04",X"DD",X"21",X"0F",X"60",X"01", + X"00",X"05",X"DD",X"56",X"00",X"DD",X"5E",X"01",X"FD",X"66",X"00",X"FD",X"6E",X"01",X"AF",X"ED", + X"52",X"20",X"08",X"FD",X"7E",X"02",X"DD",X"96",X"02",X"28",X"0E",X"38",X"0C",X"FD",X"23",X"FD", + X"23",X"FD",X"23",X"0C",X"10",X"E2",X"C3",X"94",X"21",X"DD",X"7E",X"02",X"DD",X"21",X"80",X"6A", + X"DD",X"72",X"06",X"DD",X"73",X"07",X"DD",X"77",X"08",X"DD",X"71",X"00",X"DD",X"56",X"06",X"DD", + X"5E",X"07",X"DD",X"7E",X"08",X"08",X"FD",X"66",X"00",X"FD",X"6E",X"01",X"FD",X"7E",X"02",X"DD"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_cpu2.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_cpu2.vhd new file mode 100644 index 00000000..bc456fab --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_cpu2.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_cpu2 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 prom of rom_cpu2 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"74",X"06",X"DD",X"75",X"07",X"DD",X"77",X"08",X"08",X"FD",X"72",X"00",X"FD",X"73",X"01",X"FD", + X"77",X"02",X"C5",X"79",X"87",X"4F",X"87",X"87",X"81",X"5F",X"16",X"00",X"21",X"A3",X"6A",X"19", + X"11",X"89",X"6A",X"06",X"0A",X"1A",X"4E",X"EB",X"12",X"71",X"EB",X"13",X"23",X"10",X"F6",X"C1", + X"FD",X"23",X"FD",X"23",X"FD",X"23",X"0C",X"10",X"B3",X"3E",X"04",X"CD",X"A0",X"1B",X"3E",X"24", + X"21",X"00",X"D3",X"01",X"01",X"60",X"D7",X"DD",X"36",X"01",X"B4",X"DD",X"36",X"03",X"00",X"DD", + X"36",X"04",X"00",X"DD",X"36",X"05",X"00",X"DD",X"36",X"13",X"FF",X"CD",X"62",X"22",X"CD",X"C0", + X"21",X"CD",X"E2",X"21",X"CD",X"08",X"22",X"CD",X"27",X"22",X"1E",X"14",X"CD",X"91",X"0F",X"3A", + X"0B",X"60",X"A7",X"C2",X"8E",X"21",X"CD",X"08",X"22",X"CD",X"53",X"1B",X"06",X"05",X"CD",X"76", + X"0F",X"CD",X"0C",X"22",X"CD",X"53",X"1B",X"06",X"05",X"CD",X"76",X"0F",X"DD",X"35",X"01",X"CA", + X"75",X"21",X"3A",X"00",X"60",X"21",X"00",X"90",X"CB",X"6F",X"28",X"03",X"21",X"01",X"90",X"CB", + X"56",X"28",X"06",X"CB",X"46",X"28",X"1D",X"18",X"47",X"CD",X"E6",X"21",X"DD",X"7E",X"03",X"3C", + X"FE",X"0E",X"38",X"0B",X"DD",X"7E",X"04",X"FE",X"03",X"30",X"23",X"DD",X"34",X"04",X"AF",X"DD", + X"77",X"03",X"18",X"1A",X"CD",X"E6",X"21",X"DD",X"7E",X"03",X"A7",X"28",X"03",X"3D",X"18",X"0B", + X"DD",X"7E",X"04",X"A7",X"28",X"08",X"DD",X"35",X"04",X"3E",X"0D",X"DD",X"77",X"03",X"CD",X"E2", + X"21",X"1E",X"07",X"21",X"32",X"60",X"34",X"CB",X"46",X"20",X"02",X"1E",X"08",X"CD",X"91",X"0F", + X"3A",X"00",X"60",X"CB",X"6F",X"20",X"0E",X"3A",X"00",X"90",X"CB",X"5F",X"28",X"19",X"CB",X"4F", + X"28",X"15",X"C3",X"10",X"21",X"3A",X"01",X"90",X"CB",X"5F",X"28",X"0B",X"CB",X"4F",X"28",X"07", + X"DD",X"36",X"13",X"FF",X"C3",X"6F",X"20",X"DD",X"7E",X"03",X"DD",X"BE",X"13",X"CA",X"6F",X"20", + X"DD",X"77",X"13",X"FE",X"0D",X"20",X"25",X"DD",X"7E",X"04",X"FE",X"03",X"CA",X"75",X"21",X"DD", + X"7E",X"05",X"A7",X"CA",X"6F",X"20",X"CD",X"0C",X"22",X"DD",X"35",X"05",X"CD",X"08",X"22",X"3E", + X"24",X"CD",X"99",X"21",X"1E",X"03",X"CD",X"91",X"0F",X"C3",X"6F",X"20",X"CD",X"44",X"22",X"B8", + X"D2",X"6F",X"20",X"DD",X"7E",X"04",X"07",X"07",X"47",X"07",X"80",X"DD",X"86",X"04",X"DD",X"86", + X"03",X"CD",X"99",X"21",X"CD",X"0C",X"22",X"DD",X"34",X"05",X"CD",X"08",X"22",X"1E",X"09",X"CD", + X"91",X"0F",X"C3",X"6F",X"20",X"1E",X"0F",X"CD",X"91",X"0F",X"CD",X"5D",X"22",X"0E",X"12",X"3A", + X"0B",X"60",X"A7",X"C2",X"8E",X"21",X"06",X"0A",X"CD",X"76",X"0F",X"0D",X"20",X"F1",X"CD",X"8C", + X"3B",X"CD",X"7C",X"1B",X"FD",X"E1",X"DD",X"E1",X"C9",X"DD",X"5E",X"00",X"CB",X"23",X"CB",X"23", + X"16",X"00",X"21",X"D1",X"22",X"19",X"CF",X"E5",X"F5",X"CD",X"55",X"22",X"4F",X"F1",X"06",X"00", + X"09",X"77",X"EB",X"CF",X"EB",X"E1",X"CD",X"47",X"22",X"7E",X"12",X"23",X"13",X"10",X"FA",X"C9", + X"AF",X"21",X"62",X"D2",X"0E",X"04",X"06",X"0D",X"77",X"3C",X"23",X"23",X"10",X"FA",X"11",X"26", + X"00",X"19",X"0D",X"20",X"F1",X"21",X"E5",X"22",X"06",X"04",X"C5",X"CD",X"39",X"1D",X"C1",X"10", + X"F9",X"C9",X"0E",X"38",X"18",X"02",X"0E",X"24",X"DD",X"7E",X"04",X"21",X"82",X"D2",X"A7",X"28", + X"07",X"11",X"40",X"00",X"47",X"19",X"10",X"FD",X"DD",X"7E",X"03",X"87",X"5F",X"16",X"00",X"19", + X"71",X"CB",X"D4",X"36",X"06",X"CB",X"94",X"C9",X"0E",X"39",X"18",X"02",X"0E",X"24",X"DD",X"7E", + X"00",X"21",X"31",X"D1",X"A7",X"28",X"07",X"11",X"40",X"00",X"47",X"19",X"10",X"FD",X"CD",X"55", + X"22",X"5F",X"16",X"00",X"19",X"71",X"C9",X"21",X"1B",X"D1",X"3A",X"02",X"90",X"CB",X"57",X"20", + X"03",X"21",X"14",X"D1",X"DD",X"7E",X"00",X"A7",X"28",X"07",X"11",X"40",X"00",X"47",X"19",X"10", + X"FD",X"36",X"28",X"C9",X"DD",X"7E",X"05",X"E5",X"21",X"02",X"90",X"06",X"0A",X"CB",X"56",X"20", + X"02",X"06",X"03",X"E1",X"C9",X"CD",X"44",X"22",X"B8",X"D8",X"78",X"3D",X"C9",X"3E",X"01",X"CD", + X"A0",X"1B",X"21",X"B3",X"22",X"06",X"05",X"C5",X"CD",X"39",X"1D",X"C1",X"10",X"F9",X"DD",X"E5", + X"21",X"0A",X"D1",X"DD",X"21",X"94",X"6A",X"06",X"05",X"11",X"3A",X"00",X"C5",X"06",X"06",X"CD", + X"95",X"1E",X"19",X"C1",X"10",X"F6",X"DD",X"E1",X"21",X"A3",X"6A",X"11",X"11",X"D1",X"CD",X"AA", + X"22",X"11",X"51",X"D1",X"CD",X"AA",X"22",X"11",X"91",X"D1",X"CD",X"AA",X"22",X"11",X"D1",X"D1", + X"CD",X"AA",X"22",X"11",X"11",X"D2",X"CD",X"AA",X"22",X"C9",X"06",X"0A",X"7E",X"12",X"23",X"13", + X"10",X"FA",X"C9",X"05",X"D1",X"03",X"17",X"18",X"01",X"45",X"D1",X"03",X"17",X"18",X"02",X"85", + X"D1",X"03",X"17",X"18",X"03",X"C5",X"D1",X"03",X"17",X"18",X"04",X"05",X"D2",X"03",X"17",X"18", + X"05",X"A3",X"6A",X"11",X"D1",X"AD",X"6A",X"51",X"D1",X"B7",X"6A",X"91",X"D1",X"C1",X"6A",X"D1", + X"D1",X"CB",X"6A",X"11",X"D2",X"7C",X"D2",X"02",X"34",X"35",X"BC",X"D2",X"02",X"34",X"35",X"FC", + X"D2",X"02",X"34",X"35",X"3C",X"D3",X"02",X"36",X"37",X"E5",X"2A",X"D8",X"0B",X"ED",X"5B",X"52", + X"60",X"AF",X"ED",X"52",X"D1",X"19",X"C9",X"21",X"59",X"60",X"34",X"7E",X"FE",X"07",X"38",X"02", + X"36",X"06",X"CD",X"15",X"0E",X"CD",X"3C",X"0E",X"CD",X"E8",X"0E",X"3A",X"60",X"60",X"CB",X"7F", + X"28",X"03",X"CD",X"F0",X"0E",X"C9",X"E5",X"21",X"2C",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28", + X"03",X"21",X"2E",X"60",X"34",X"7E",X"FE",X"20",X"30",X"07",X"E1",X"1E",X"54",X"16",X"00",X"F7", + X"C9",X"36",X"00",X"23",X"7E",X"3C",X"27",X"77",X"E1",X"16",X"01",X"5F",X"CB",X"3B",X"CB",X"3B", + X"CB",X"3B",X"CB",X"3B",X"28",X"0B",X"E5",X"F5",X"7D",X"C6",X"1F",X"E6",X"1F",X"6F",X"F7",X"F1", + X"E1",X"E6",X"0F",X"5F",X"F7",X"C9",X"21",X"30",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03", + X"21",X"31",X"60",X"3A",X"15",X"60",X"47",X"E6",X"0F",X"CB",X"78",X"20",X"03",X"86",X"18",X"03", + X"96",X"ED",X"44",X"4F",X"E5",X"3E",X"FC",X"CD",X"31",X"0F",X"C6",X"1C",X"B9",X"30",X"0B",X"3E", + X"FC",X"CD",X"3C",X"0F",X"D6",X"20",X"B9",X"38",X"01",X"79",X"E1",X"77",X"C9",X"DD",X"E5",X"DD", + X"21",X"E8",X"61",X"DD",X"36",X"00",X"80",X"DD",X"36",X"02",X"00",X"DD",X"36",X"0E",X"00",X"DD", + X"E1",X"C9",X"3A",X"60",X"60",X"E6",X"0F",X"FE",X"0F",X"20",X"27",X"21",X"51",X"60",X"7E",X"FE", + X"04",X"D0",X"34",X"5F",X"16",X"00",X"21",X"43",X"24",X"19",X"5E",X"16",X"05",X"D5",X"21",X"30", + X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"31",X"60",X"7E",X"CD",X"01",X"24",X"D1", + X"F7",X"C9",X"AF",X"32",X"51",X"60",X"DD",X"34",X"03",X"DD",X"7E",X"03",X"FE",X"03",X"D8",X"DD", + X"36",X"03",X"00",X"C0",X"3A",X"E8",X"61",X"A7",X"C8",X"CD",X"66",X"23",X"CD",X"01",X"24",X"18", + X"1A",X"2F",X"E6",X"F8",X"6F",X"26",X"00",X"29",X"29",X"11",X"00",X"D0",X"19",X"3A",X"55",X"60", + X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"5F",X"16",X"00",X"19",X"C9",X"7E",X"FE",X"24",X"C0",X"3A", + X"F6",X"61",X"0E",X"00",X"D6",X"05",X"38",X"03",X"0C",X"18",X"F9",X"79",X"FE",X"04",X"38",X"02", + X"0E",X"03",X"06",X"00",X"E5",X"21",X"3F",X"24",X"09",X"56",X"E1",X"1E",X"53",X"F7",X"C9",X"02", + X"01",X"06",X"00",X"13",X"1E",X"16",X"19",X"DD",X"7E",X"02",X"21",X"4E",X"24",X"DF",X"56",X"24", + X"A0",X"24",X"D2",X"25",X"E4",X"25",X"DD",X"7E",X"0E",X"FE",X"14",X"D8",X"3A",X"59",X"60",X"3D", + X"5F",X"16",X"00",X"21",X"95",X"26",X"19",X"7E",X"DD",X"77",X"0B",X"DD",X"36",X"02",X"01",X"3E", + X"F8",X"CD",X"31",X"0F",X"47",X"3E",X"F8",X"CD",X"3C",X"0F",X"90",X"CB",X"3F",X"80",X"DD",X"77", + X"07",X"DD",X"36",X"06",X"00",X"DD",X"36",X"04",X"00",X"DD",X"36",X"05",X"00",X"DD",X"36",X"08", + X"00",X"DD",X"36",X"09",X"08",X"DD",X"36",X"0A",X"0A",X"DD",X"CB",X"00",X"E6",X"C3",X"CB",X"25", + X"CD",X"6A",X"0F",X"C3",X"CB",X"25",X"ED",X"5B",X"52",X"60",X"DD",X"6E",X"04",X"DD",X"66",X"05", + X"AF",X"ED",X"52",X"DD",X"75",X"04",X"DD",X"74",X"05",X"7C",X"FE",X"08",X"30",X"0F",X"DD",X"35", + X"0B",X"C2",X"6F",X"24",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"02",X"00",X"C9",X"CD",X"46",X"33", + X"FE",X"08",X"D2",X"AA",X"25",X"CD",X"53",X"33",X"FE",X"08",X"D2",X"AA",X"25",X"DD",X"CB",X"00", + X"EE",X"21",X"C5",X"69",X"36",X"80",X"3E",X"02",X"32",X"2B",X"62",X"32",X"48",X"62",X"32",X"65", + X"62",X"32",X"82",X"62",X"32",X"9F",X"62",X"32",X"BC",X"62",X"3A",X"59",X"60",X"3D",X"87",X"47", + X"87",X"80",X"5F",X"16",X"00",X"21",X"9B",X"26",X"19",X"01",X"06",X"00",X"11",X"F8",X"61",X"ED", + X"B0",X"DD",X"7E",X"14",X"CB",X"3F",X"DD",X"77",X"14",X"DD",X"77",X"15",X"DD",X"36",X"16",X"00", + X"CD",X"45",X"3E",X"06",X"02",X"FE",X"02",X"38",X"02",X"06",X"03",X"DD",X"7E",X"17",X"80",X"DD", + X"77",X"17",X"DD",X"36",X"03",X"02",X"DD",X"36",X"02",X"02",X"21",X"01",X"00",X"22",X"13",X"60", + X"AF",X"32",X"12",X"60",X"CD",X"C4",X"1E",X"3E",X"0C",X"CD",X"BE",X"0F",X"3E",X"02",X"CD",X"BE", + X"0F",X"3E",X"02",X"CD",X"BE",X"0F",X"3E",X"11",X"CD",X"BE",X"0F",X"3E",X"10",X"CD",X"86",X"0F", + X"3E",X"05",X"CD",X"86",X"0F",X"CD",X"50",X"26",X"21",X"E2",X"61",X"CB",X"E6",X"21",X"02",X"62", + X"36",X"03",X"21",X"D6",X"62",X"11",X"A9",X"63",X"CD",X"95",X"1B",X"DD",X"E5",X"DD",X"21",X"A9", + X"63",X"DD",X"CB",X"00",X"7E",X"28",X"04",X"DD",X"36",X"02",X"05",X"DD",X"21",X"BE",X"63",X"DD", + X"CB",X"00",X"7E",X"28",X"04",X"DD",X"36",X"02",X"05",X"DD",X"21",X"D3",X"63",X"DD",X"CB",X"00", + X"7E",X"28",X"04",X"DD",X"36",X"02",X"05",X"DD",X"E1",X"C9",X"DD",X"35",X"0A",X"20",X"1C",X"DD", + X"36",X"0A",X"0A",X"DD",X"CB",X"00",X"66",X"28",X"0A",X"DD",X"CB",X"00",X"A6",X"DD",X"36",X"08", + X"00",X"18",X"08",X"DD",X"CB",X"00",X"E6",X"DD",X"36",X"08",X"01",X"21",X"BF",X"26",X"CD",X"D1", + X"07",X"C9",X"DD",X"35",X"10",X"C0",X"DD",X"7E",X"11",X"A7",X"28",X"04",X"DD",X"35",X"11",X"C9", + X"DD",X"36",X"02",X"03",X"DD",X"35",X"15",X"20",X"20",X"DD",X"7E",X"14",X"DD",X"77",X"15",X"DD", + X"7E",X"03",X"2F",X"E6",X"03",X"DD",X"77",X"03",X"CB",X"47",X"28",X"0A",X"CD",X"7B",X"26",X"3E", + X"03",X"CD",X"86",X"0F",X"18",X"03",X"CD",X"67",X"26",X"DD",X"35",X"12",X"C0",X"DD",X"7E",X"13", + X"A7",X"28",X"04",X"DD",X"35",X"13",X"C9",X"21",X"00",X"62",X"CB",X"7E",X"20",X"05",X"DD",X"36", + X"12",X"01",X"C9",X"CB",X"66",X"20",X"08",X"CD",X"7B",X"26",X"21",X"02",X"62",X"36",X"10",X"CD", + X"5E",X"29",X"DD",X"CB",X"00",X"AE",X"DD",X"36",X"02",X"00",X"DD",X"36",X"0E",X"00",X"DD",X"36", + X"17",X"00",X"DD",X"E5",X"DD",X"21",X"C5",X"69",X"06",X"26",X"CD",X"8D",X"1B",X"DD",X"E1",X"C9", + X"11",X"E0",X"D4",X"21",X"F5",X"67",X"01",X"10",X"01",X"1A",X"ED",X"6F",X"13",X"1A",X"ED",X"6F", + X"13",X"23",X"0B",X"79",X"B0",X"20",X"F2",X"16",X"07",X"21",X"E0",X"D4",X"01",X"20",X"02",X"7E", + X"E6",X"F8",X"82",X"77",X"23",X"0B",X"79",X"B0",X"20",X"F5",X"C9",X"11",X"E0",X"D4",X"21",X"F5", + X"67",X"01",X"10",X"01",X"ED",X"6F",X"12",X"13",X"ED",X"6F",X"12",X"ED",X"6F",X"13",X"23",X"0B", + X"79",X"B0",X"20",X"F0",X"C9",X"03",X"03",X"02",X"02",X"01",X"01",X"D2",X"00",X"96",X"00",X"1E", + X"05",X"B4",X"00",X"78",X"00",X"18",X"05",X"A5",X"00",X"69",X"00",X"15",X"05",X"96",X"00",X"5A", + X"00",X"12",X"05",X"87",X"00",X"4B",X"00",X"0F",X"05",X"78",X"00",X"3C",X"00",X"0C",X"05",X"78", + X"00",X"7C",X"00",X"DD",X"36",X"09",X"03",X"DD",X"CB",X"00",X"C6",X"DD",X"7E",X"05",X"CD",X"31", + X"0F",X"C6",X"08",X"DD",X"BE",X"07",X"38",X"0A",X"DD",X"36",X"02",X"02",X"DD",X"36",X"08",X"07", + X"18",X"22",X"DD",X"36",X"08",X"06",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"11",X"00",X"FC",X"19", + X"DD",X"75",X"06",X"DD",X"74",X"07",X"CD",X"47",X"27",X"DD",X"7E",X"05",X"FE",X"08",X"38",X"D8", + X"FE",X"F8",X"30",X"D4",X"C9",X"DD",X"7E",X"05",X"FE",X"08",X"38",X"04",X"FE",X"F8",X"38",X"37", + X"DD",X"36",X"02",X"00",X"DD",X"CB",X"00",X"86",X"DD",X"CB",X"00",X"9E",X"CD",X"13",X"1F",X"3A", + X"15",X"60",X"E6",X"3F",X"DD",X"77",X"01",X"DD",X"CB",X"00",X"F6",X"DD",X"36",X"05",X"02",X"3A", + X"16",X"60",X"E6",X"3F",X"C6",X"B8",X"DD",X"77",X"19",X"E6",X"07",X"5F",X"16",X"00",X"21",X"5C", + X"27",X"19",X"7E",X"DD",X"77",X"07",X"C9",X"2A",X"52",X"60",X"CD",X"43",X"1F",X"EB",X"DD",X"6E", + X"04",X"DD",X"66",X"05",X"19",X"DD",X"75",X"04",X"DD",X"74",X"05",X"C9",X"80",X"98",X"7C",X"8C", + X"78",X"90",X"84",X"88",X"DD",X"7E",X"05",X"FE",X"08",X"D8",X"FE",X"F8",X"D0",X"DD",X"7E",X"03", + X"FE",X"02",X"C2",X"A2",X"27",X"DD",X"7E",X"05",X"DD",X"CB",X"00",X"5E",X"20",X"04",X"C6",X"08", + X"18",X"02",X"D6",X"08",X"CD",X"31",X"0F",X"C6",X"10",X"DD",X"BE",X"07",X"DA",X"0E",X"28",X"DD", + X"34",X"07",X"DD",X"CB",X"00",X"5E",X"C2",X"D1",X"27",X"DD",X"5E",X"11",X"DD",X"56",X"12",X"C3", + X"C6",X"27",X"DD",X"7E",X"05",X"DD",X"CB",X"00",X"5E",X"20",X"04",X"C6",X"1C",X"18",X"02",X"D6", + X"04",X"CD",X"31",X"0F",X"C6",X"10",X"DD",X"BE",X"07",X"DA",X"0E",X"28",X"DD",X"CB",X"00",X"5E", + X"20",X"0F",X"ED",X"5B",X"52",X"60",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"AF",X"ED",X"52",X"18", + X"0D",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"DD",X"5E",X"11",X"DD",X"56",X"12",X"19",X"DD",X"75", + X"04",X"DD",X"74",X"05",X"DD",X"34",X"07",X"DD",X"34",X"07",X"DD",X"CB",X"15",X"C6",X"DD",X"CB", + X"14",X"7E",X"28",X"0F",X"DD",X"6E",X"13",X"DD",X"66",X"14",X"CD",X"43",X"1F",X"DD",X"75",X"13", + X"DD",X"74",X"14",X"DD",X"36",X"16",X"00",X"DD",X"36",X"17",X"00",X"C3",X"AC",X"28",X"DD",X"7E", + X"03",X"FE",X"02",X"C2",X"43",X"28",X"DD",X"7E",X"05",X"DD",X"CB",X"00",X"5E",X"20",X"04",X"C6", + X"08",X"18",X"02",X"D6",X"08",X"CD",X"3C",X"0F",X"D6",X"08",X"DD",X"BE",X"07",X"D2",X"AC",X"28", + X"DD",X"35",X"07",X"DD",X"CB",X"00",X"5E",X"C2",X"72",X"28",X"DD",X"5E",X"11",X"DD",X"56",X"12", + X"C3",X"67",X"28",X"DD",X"7E",X"05",X"DD",X"CB",X"00",X"5E",X"20",X"04",X"C6",X"1C",X"18",X"02", + X"00",X"00",X"CD",X"3C",X"0F",X"D6",X"08",X"DD",X"BE",X"07",X"D2",X"AC",X"28",X"DD",X"CB",X"00", + X"5E",X"20",X"0F",X"ED",X"5B",X"52",X"60",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"AF",X"ED",X"52", + X"18",X"0D",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"DD",X"5E",X"11",X"DD",X"56",X"12",X"19",X"DD", + X"75",X"04",X"DD",X"74",X"05",X"DD",X"35",X"07",X"DD",X"35",X"07",X"DD",X"CB",X"15",X"86",X"DD", + X"CB",X"14",X"7E",X"20",X"0F",X"DD",X"6E",X"13",X"DD",X"66",X"14",X"CD",X"43",X"1F",X"DD",X"75", + X"13",X"DD",X"74",X"14",X"DD",X"36",X"16",X"00",X"DD",X"36",X"17",X"00",X"3A",X"00",X"62",X"E6", + X"30",X"C2",X"09",X"29",X"CD",X"46",X"33",X"FE",X"0A",X"30",X"4E",X"57",X"CD",X"53",X"33",X"FE", + X"0A",X"30",X"46",X"5F",X"3A",X"E8",X"61",X"CB",X"6F",X"28",X"11",X"21",X"00",X"62",X"CB",X"4E", + X"C2",X"35",X"29",X"CB",X"CE",X"DD",X"36",X"02",X"04",X"C3",X"35",X"29",X"3A",X"05",X"62",X"DD", + X"CB",X"00",X"5E",X"20",X"0D",X"DD",X"BE",X"05",X"30",X"15",X"7A",X"FE",X"07",X"38",X"10",X"C3", + X"09",X"29",X"DD",X"BE",X"05",X"38",X"08",X"7A",X"FE",X"07",X"38",X"03",X"C3",X"09",X"29",X"DD", + X"36",X"08",X"01",X"CD",X"60",X"33",X"C3",X"35",X"29",X"FD",X"21",X"69",X"63",X"FD",X"CB",X"00", + X"7E",X"28",X"09",X"CD",X"36",X"29",X"C3",X"1C",X"29",X"C3",X"2C",X"29",X"FD",X"21",X"7B",X"63", + X"FD",X"CB",X"00",X"7E",X"28",X"0F",X"CD",X"36",X"29",X"C3",X"35",X"29",X"DD",X"36",X"02",X"01", + X"3E",X"09",X"CD",X"86",X"0F",X"C9",X"FD",X"56",X"05",X"FD",X"5E",X"07",X"CD",X"4E",X"29",X"FE", + X"14",X"D0",X"CD",X"56",X"29",X"FE",X"14",X"D0",X"E1",X"23",X"23",X"23",X"E5",X"C9",X"DD",X"7E", + X"05",X"92",X"D0",X"ED",X"44",X"C9",X"DD",X"7E",X"07",X"93",X"D0",X"ED",X"44",X"C9",X"21",X"28", + X"62",X"11",X"D6",X"62",X"CD",X"95",X"1B",X"DD",X"E5",X"DD",X"21",X"28",X"62",X"DD",X"36",X"00", + X"C0",X"CD",X"45",X"3E",X"87",X"5F",X"16",X"00",X"21",X"D5",X"29",X"19",X"46",X"23",X"4E",X"DD", + X"70",X"01",X"DD",X"36",X"03",X"01",X"DD",X"36",X"05",X"02",X"DD",X"36",X"07",X"90",X"DD",X"36", + X"19",X"D0",X"DD",X"21",X"45",X"62",X"DD",X"36",X"00",X"C0",X"DD",X"71",X"01",X"DD",X"36",X"03", + X"01",X"DD",X"36",X"05",X"02",X"DD",X"36",X"07",X"80",X"DD",X"36",X"19",X"E0",X"CD",X"45",X"3E", + X"FE",X"02",X"38",X"1E",X"DD",X"21",X"62",X"62",X"DD",X"36",X"00",X"C0",X"79",X"C6",X"1E",X"DD", + X"77",X"01",X"DD",X"36",X"03",X"01",X"DD",X"36",X"05",X"02",X"DD",X"36",X"07",X"70",X"DD",X"36", + X"19",X"D8",X"DD",X"E1",X"C9",X"3C",X"B4",X"28",X"78",X"19",X"50",X"0A",X"28",X"21",X"E8",X"61", + X"CB",X"7E",X"C8",X"11",X"60",X"28",X"CD",X"0B",X"39",X"01",X"60",X"0A",X"11",X"20",X"00",X"FE", + X"53",X"28",X"0F",X"79",X"C6",X"08",X"4F",X"AF",X"ED",X"52",X"7E",X"FE",X"53",X"28",X"03",X"10", + X"F2",X"C9",X"CB",X"D4",X"CB",X"5E",X"CB",X"94",X"20",X"F5",X"CD",X"45",X"3E",X"06",X"04",X"FE", + X"02",X"38",X"02",X"06",X"03",X"3A",X"FF",X"61",X"B8",X"D0",X"36",X"24",X"5F",X"3C",X"32",X"FF", + X"61",X"CB",X"23",X"16",X"00",X"21",X"6B",X"2E",X"19",X"CD",X"45",X"3E",X"1E",X"04",X"FE",X"02", + X"38",X"02",X"1E",X"06",X"16",X"00",X"19",X"CF",X"DD",X"E5",X"E5",X"DD",X"E1",X"DD",X"36",X"00", + X"80",X"DD",X"36",X"02",X"07",X"DD",X"36",X"03",X"00",X"DD",X"36",X"05",X"28",X"DD",X"71",X"07", + X"DD",X"36",X"08",X"00",X"DD",X"36",X"09",X"01",X"DD",X"36",X"0C",X"0A",X"3A",X"15",X"60",X"E6", + X"3F",X"C6",X"B8",X"DD",X"77",X"19",X"DD",X"E1",X"3E",X"06",X"CD",X"86",X"0F",X"C9",X"DD",X"7E", + X"02",X"21",X"75",X"2A",X"DF",X"EE",X"2A",X"87",X"2C",X"8E",X"2C",X"9B",X"2C",X"A0",X"2C",X"FE", + X"2C",X"24",X"2D",X"5B",X"2D",X"84",X"2D",X"DD",X"7E",X"00",X"E6",X"03",X"20",X"43",X"CD",X"93", + X"2A",X"18",X"26",X"DD",X"7E",X"0A",X"A7",X"28",X"05",X"DD",X"35",X"0A",X"18",X"17",X"DD",X"7E", + X"0B",X"3C",X"FE",X"03",X"38",X"01",X"AF",X"DD",X"77",X"0B",X"5F",X"16",X"00",X"21",X"EB",X"2A", + X"19",X"7E",X"DD",X"77",X"0A",X"DD",X"7E",X"0B",X"C9",X"DD",X"CB",X"00",X"5E",X"28",X"02",X"C6", + X"03",X"DD",X"77",X"08",X"21",X"E8",X"2A",X"DD",X"5E",X"03",X"16",X"00",X"19",X"7E",X"DD",X"77", + X"09",X"21",X"D8",X"2A",X"CD",X"D1",X"07",X"C9",X"90",X"20",X"94",X"20",X"98",X"20",X"90",X"00", + X"94",X"00",X"98",X"00",X"A8",X"00",X"AC",X"00",X"01",X"0F",X"02",X"05",X"02",X"0A",X"CD",X"6A", + X"0F",X"C3",X"0B",X"2B",X"3A",X"60",X"60",X"E6",X"0F",X"FE",X"0F",X"20",X"07",X"DD",X"36",X"02", + X"06",X"C3",X"6E",X"2A",X"DD",X"7E",X"03",X"21",X"16",X"2B",X"DF",X"21",X"E8",X"61",X"CB",X"6E", + X"CA",X"D1",X"2A",X"C3",X"52",X"2C",X"1C",X"2B",X"65",X"2B",X"C5",X"2B",X"DD",X"CB",X"00",X"6E", + X"20",X"36",X"DD",X"CB",X"00",X"EE",X"DD",X"CB",X"00",X"9E",X"3A",X"15",X"60",X"CB",X"7F",X"28", + X"0E",X"DD",X"CB",X"15",X"86",X"DD",X"36",X"13",X"20",X"DD",X"36",X"14",X"FF",X"18",X"0C",X"DD", + X"CB",X"15",X"C6",X"DD",X"36",X"13",X"E0",X"DD",X"36",X"14",X"00",X"DD",X"36",X"16",X"00",X"DD", + X"36",X"17",X"00",X"DD",X"36",X"1C",X"20",X"C9",X"CD",X"91",X"2D",X"CD",X"25",X"2E",X"CD",X"64", + X"27",X"CD",X"87",X"2A",X"C9",X"DD",X"CB",X"00",X"56",X"20",X"2C",X"DD",X"CB",X"00",X"D6",X"DD", + X"CB",X"00",X"9E",X"DD",X"CB",X"15",X"C6",X"21",X"C0",X"00",X"CD",X"18",X"2E",X"DD",X"75",X"13", + X"DD",X"74",X"14",X"DD",X"36",X"16",X"00",X"DD",X"36",X"17",X"00",X"CD",X"45",X"3E",X"07",X"07", + X"07",X"C6",X"28",X"DD",X"77",X"1C",X"C9",X"CD",X"91",X"2D",X"DD",X"CB",X"00",X"5E",X"20",X"1B", + X"11",X"40",X"00",X"3A",X"07",X"62",X"DD",X"BE",X"07",X"30",X"03",X"11",X"C0",X"FF",X"DD",X"6E", + X"06",X"DD",X"66",X"07",X"19",X"DD",X"75",X"06",X"DD",X"74",X"07",X"CD",X"25",X"2E",X"CD",X"64", + X"27",X"CD",X"87",X"2A",X"C9",X"DD",X"CB",X"00",X"66",X"C2",X"EE",X"2B",X"DD",X"CB",X"00",X"E6", + X"21",X"00",X"02",X"DD",X"CB",X"15",X"46",X"20",X"03",X"21",X"00",X"FE",X"DD",X"75",X"13",X"DD", + X"74",X"14",X"DD",X"36",X"16",X"00",X"DD",X"36",X"17",X"00",X"DD",X"36",X"1C",X"70",X"11",X"80", + X"FF",X"DD",X"7E",X"0B",X"FE",X"02",X"20",X"03",X"11",X"80",X"02",X"DD",X"73",X"11",X"DD",X"72", + X"12",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"DD",X"CB",X"00",X"5E",X"20",X"0C",X"19",X"7C",X"FE", + X"B8",X"38",X"12",X"DD",X"CB",X"00",X"DE",X"18",X"0C",X"AF",X"ED",X"52",X"7C",X"FE",X"38",X"30", + X"04",X"DD",X"CB",X"00",X"9E",X"DD",X"75",X"04",X"DD",X"74",X"05",X"11",X"80",X"00",X"3A",X"07", + X"62",X"DD",X"BE",X"07",X"38",X"03",X"11",X"80",X"FF",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"19", + X"DD",X"75",X"06",X"DD",X"74",X"07",X"CD",X"25",X"2E",X"CD",X"64",X"27",X"CD",X"93",X"2A",X"DD", + X"77",X"08",X"3E",X"02",X"21",X"EB",X"61",X"CB",X"46",X"28",X"02",X"3E",X"0F",X"DD",X"77",X"09", + X"21",X"67",X"2C",X"CD",X"D1",X"07",X"C9",X"A0",X"00",X"A4",X"00",X"9C",X"00",X"A0",X"00",X"A4", + X"00",X"9C",X"00",X"B0",X"00",X"B4",X"00",X"B8",X"00",X"BC",X"00",X"C0",X"00",X"C4",X"00",X"C8", + X"00",X"CC",X"00",X"F4",X"00",X"F8",X"00",X"CD",X"C3",X"26",X"CD",X"87",X"2A",X"C9",X"CD",X"6A", + X"0F",X"C3",X"97",X"2C",X"CD",X"05",X"27",X"CD",X"87",X"2A",X"C9",X"DD",X"36",X"02",X"00",X"C9", + X"3E",X"04",X"CD",X"86",X"0F",X"21",X"00",X"62",X"CB",X"BE",X"3A",X"05",X"62",X"DD",X"77",X"05", + X"3A",X"07",X"62",X"DD",X"77",X"07",X"21",X"FE",X"61",X"7E",X"E5",X"87",X"5F",X"16",X"00",X"21", + X"77",X"2E",X"19",X"56",X"23",X"5E",X"EB",X"22",X"13",X"60",X"AF",X"32",X"12",X"60",X"CD",X"C4", + X"1E",X"E1",X"7E",X"34",X"DD",X"77",X"08",X"21",X"2A",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28", + X"03",X"21",X"2B",X"60",X"7E",X"C6",X"01",X"27",X"77",X"CD",X"EF",X"3A",X"DD",X"36",X"09",X"02", + X"DD",X"36",X"01",X"0A",X"DD",X"34",X"02",X"21",X"73",X"2C",X"CD",X"D1",X"07",X"C9",X"DD",X"35", + X"01",X"20",X"F4",X"21",X"00",X"62",X"CB",X"FE",X"06",X"1D",X"CD",X"8D",X"1B",X"21",X"FF",X"61", + X"35",X"C0",X"DD",X"E5",X"DD",X"21",X"E8",X"61",X"CD",X"17",X"26",X"DD",X"E1",X"C9",X"06",X"1D", + X"CD",X"8D",X"1B",X"C9",X"3A",X"05",X"62",X"DD",X"BE",X"05",X"30",X"08",X"21",X"80",X"00",X"CD", + X"F9",X"22",X"18",X"06",X"2A",X"52",X"60",X"CD",X"43",X"1F",X"EB",X"DD",X"6E",X"04",X"DD",X"66", + X"05",X"19",X"DD",X"75",X"04",X"DD",X"74",X"05",X"7C",X"FE",X"08",X"38",X"04",X"FE",X"F8",X"38", + X"03",X"C3",X"1E",X"2D",X"CD",X"64",X"27",X"CD",X"87",X"2A",X"C9",X"DD",X"35",X"0C",X"20",X"0B", + X"DD",X"34",X"02",X"DD",X"36",X"0C",X"0A",X"DD",X"36",X"08",X"01",X"11",X"00",X"01",X"DD",X"6E", + X"04",X"DD",X"66",X"05",X"AF",X"ED",X"52",X"DD",X"75",X"04",X"DD",X"74",X"05",X"21",X"83",X"2C", + X"CD",X"D1",X"07",X"C9",X"DD",X"35",X"0C",X"C2",X"6B",X"2D",X"DD",X"36",X"02",X"00",X"C3",X"EE", + X"2A",X"DD",X"CB",X"00",X"5E",X"20",X"3E",X"21",X"E0",X"FF",X"DD",X"7E",X"0B",X"FE",X"02",X"20", + X"06",X"21",X"20",X"01",X"CD",X"18",X"2E",X"CD",X"F9",X"22",X"DD",X"75",X"11",X"DD",X"74",X"12", + X"DD",X"5E",X"04",X"DD",X"56",X"05",X"19",X"DD",X"75",X"04",X"DD",X"74",X"05",X"7C",X"DD",X"BE", + X"19",X"DA",X"17",X"2E",X"DD",X"CB",X"00",X"DE",X"3A",X"15",X"60",X"E6",X"1F",X"C6",X"0C",X"DD", + X"77",X"19",X"C3",X"17",X"2E",X"DD",X"7E",X"0B",X"FE",X"02",X"20",X"0E",X"21",X"C0",X"01",X"CD", + X"18",X"2E",X"E5",X"C1",X"CD",X"60",X"0F",X"EB",X"18",X"03",X"11",X"00",X"00",X"DD",X"73",X"11", + X"DD",X"72",X"12",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"AF",X"ED",X"52",X"DD",X"75",X"04",X"DD", + X"74",X"05",X"7C",X"DD",X"BE",X"19",X"D2",X"17",X"2E",X"DD",X"CB",X"00",X"9E",X"3A",X"15",X"60", + X"E6",X"3F",X"C6",X"B8",X"DD",X"77",X"19",X"C9",X"CD",X"45",X"3E",X"07",X"07",X"07",X"07",X"07", + X"5F",X"16",X"00",X"19",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"DD",X"5E",X"13",X"DD",X"56", + X"14",X"19",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"6E",X"16",X"DD",X"66",X"17",X"19",X"DD", + X"75",X"16",X"DD",X"74",X"17",X"7C",X"CB",X"7F",X"20",X"0B",X"DD",X"BE",X"1C",X"38",X"1B",X"DD", + X"CB",X"15",X"86",X"18",X"0B",X"ED",X"44",X"DD",X"BE",X"1C",X"38",X"0E",X"DD",X"CB",X"15",X"C6", + X"EB",X"CD",X"43",X"1F",X"DD",X"75",X"13",X"DD",X"74",X"14",X"C9",X"28",X"62",X"45",X"62",X"62", + X"62",X"7F",X"62",X"9C",X"62",X"B9",X"62",X"00",X"01",X"50",X"01",X"00",X"02",X"50",X"02",X"00", + X"03",X"50",X"03",X"B8",X"78",X"E6",X"0A",X"28",X"20",X"21",X"0D",X"32",X"FE",X"02",X"20",X"02", + X"23",X"23",X"5E",X"23",X"56",X"DD",X"6E",X"0D",X"DD",X"66",X"0E",X"19",X"7C",X"FE",X"08",X"30", + X"02",X"26",X"08",X"DD",X"75",X"0D",X"DD",X"74",X"0E",X"DD",X"7E",X"05",X"D6",X"04",X"CD",X"31", + X"0F",X"DD",X"86",X"0E",X"C6",X"08",X"DD",X"77",X"07",X"DD",X"46",X"0D",X"DD",X"70",X"06",X"DD", + X"7E",X"05",X"C6",X"04",X"CD",X"31",X"0F",X"FE",X"44",X"20",X"10",X"3A",X"60",X"60",X"FE",X"0F", + X"3E",X"48",X"20",X"07",X"DD",X"36",X"02",X"0A",X"C3",X"D4",X"35",X"57",X"1E",X"00",X"DD",X"6E", + X"06",X"DD",X"66",X"07",X"AF",X"ED",X"52",X"7C",X"D6",X"08",X"30",X"02",X"3E",X"04",X"DD",X"75", + X"0B",X"DD",X"77",X"0C",X"C9",X"DD",X"7E",X"05",X"CD",X"31",X"0F",X"C6",X"06",X"DD",X"BE",X"07", + X"DA",X"0E",X"2F",X"DD",X"36",X"0C",X"08",X"DD",X"36",X"0E",X"08",X"C3",X"4C",X"2F",X"DD",X"7E", + X"07",X"C6",X"08",X"4F",X"DD",X"7E",X"05",X"CD",X"3C",X"0F",X"B9",X"28",X"01",X"D0",X"FE",X"C8", + X"38",X"2A",X"DD",X"7E",X"07",X"D6",X"C0",X"4F",X"DD",X"7E",X"07",X"91",X"DD",X"77",X"07",X"DD", + X"7E",X"0C",X"91",X"DD",X"77",X"0C",X"DD",X"7E",X"0E",X"91",X"DD",X"77",X"0E",X"C9",X"DD",X"36", + X"02",X"08",X"DD",X"CB",X"00",X"96",X"DD",X"36",X"1D",X"F8",X"18",X"09",X"DD",X"36",X"03",X"04", + X"E1",X"23",X"23",X"23",X"E5",X"E1",X"23",X"23",X"23",X"E5",X"C9",X"DD",X"5E",X"08",X"16",X"00", + X"21",X"3B",X"32",X"19",X"7E",X"DD",X"77",X"09",X"21",X"11",X"32",X"CD",X"D1",X"07",X"DD",X"7E", + X"0E",X"DD",X"CB",X"00",X"DE",X"DD",X"BE",X"0C",X"38",X"07",X"DD",X"CB",X"00",X"9E",X"DD",X"7E", + X"0C",X"DD",X"36",X"10",X"00",X"47",X"DD",X"56",X"05",X"DD",X"7E",X"07",X"D6",X"10",X"5F",X"78", + X"D6",X"08",X"30",X"07",X"ED",X"44",X"83",X"5F",X"C3",X"E2",X"2F",X"CD",X"C8",X"32",X"78",X"A7", + X"28",X"19",X"C5",X"CD",X"40",X"08",X"21",X"95",X"32",X"CD",X"AE",X"08",X"7B",X"D6",X"10",X"5F", + X"DD",X"7E",X"10",X"C6",X"10",X"DD",X"77",X"10",X"C1",X"10",X"E7",X"79",X"A7",X"28",X"23",X"C5", + X"DD",X"7E",X"05",X"C6",X"03",X"DD",X"CB",X"00",X"5E",X"28",X"02",X"D6",X"08",X"57",X"CD",X"40", + X"08",X"C1",X"7B",X"91",X"5F",X"79",X"87",X"81",X"4F",X"06",X"00",X"21",X"98",X"32",X"09",X"CD", + X"AE",X"08",X"DD",X"7E",X"05",X"C6",X"04",X"DD",X"CB",X"00",X"5E",X"28",X"02",X"D6",X"08",X"57", + X"7B",X"C6",X"04",X"5F",X"CD",X"76",X"08",X"DD",X"CB",X"00",X"66",X"20",X"1B",X"DD",X"5E",X"1A", + X"DD",X"56",X"1B",X"2A",X"52",X"60",X"19",X"7C",X"FE",X"06",X"38",X"06",X"21",X"00",X"00",X"DD", + X"34",X"1C",X"DD",X"75",X"1A",X"DD",X"74",X"1B",X"21",X"50",X"32",X"DD",X"CB",X"1C",X"46",X"28", + X"03",X"21",X"53",X"32",X"CD",X"AE",X"08",X"DD",X"7E",X"0C",X"DD",X"CB",X"00",X"5E",X"20",X"03", + X"DD",X"7E",X"0E",X"47",X"D6",X"08",X"30",X"0D",X"ED",X"44",X"DD",X"86",X"07",X"D6",X"10",X"5F", + X"01",X"00",X"00",X"18",X"12",X"78",X"DD",X"96",X"10",X"D6",X"08",X"CD",X"C8",X"32",X"DD",X"7E", + X"07",X"DD",X"96",X"10",X"D6",X"10",X"5F",X"DD",X"7E",X"05",X"D6",X"05",X"DD",X"CB",X"00",X"5E", + X"28",X"02",X"C6",X"08",X"57",X"78",X"A7",X"28",X"11",X"C5",X"CD",X"40",X"08",X"21",X"C5",X"32", + X"CD",X"AE",X"08",X"7B",X"D6",X"10",X"5F",X"C1",X"10",X"EF",X"79",X"A7",X"28",X"15",X"C5",X"CD", + X"40",X"08",X"C1",X"7B",X"91",X"5F",X"79",X"87",X"81",X"4F",X"06",X"00",X"21",X"98",X"32",X"09", + X"CD",X"AE",X"08",X"7B",X"C6",X"04",X"5F",X"14",X"CD",X"76",X"08",X"21",X"50",X"32",X"DD",X"CB", + X"1C",X"46",X"28",X"03",X"21",X"53",X"32",X"CD",X"AE",X"08",X"C9",X"DD",X"CB",X"00",X"E6",X"DD", + X"36",X"08",X"13",X"DD",X"E5",X"06",X"04",X"DD",X"7E",X"04",X"DD",X"77",X"13",X"DD",X"23",X"10", + X"F6",X"DD",X"E1",X"DD",X"36",X"17",X"05",X"DD",X"34",X"02",X"CD",X"8C",X"3B",X"3E",X"0D",X"CD", + X"86",X"0F",X"DD",X"56",X"14",X"DD",X"5E",X"16",X"21",X"89",X"32",X"CD",X"0C",X"09",X"C3",X"5B", + X"2F",X"DD",X"35",X"17",X"20",X"EC",X"DD",X"34",X"02",X"DD",X"7E",X"0C",X"DD",X"BE",X"0E",X"38", + X"03",X"DD",X"7E",X"0E",X"FE",X"09",X"30",X"19",X"DD",X"34",X"02",X"DD",X"36",X"08",X"14",X"DD", + X"36",X"09",X"03",X"DD",X"36",X"01",X"0F",X"DD",X"7E",X"07",X"D6",X"08",X"DD",X"77",X"07",X"18", + X"1A",X"DD",X"35",X"0C",X"DD",X"35",X"0C",X"DD",X"35",X"0E",X"DD",X"35",X"0E",X"DD",X"35",X"07", + X"DD",X"35",X"07",X"C3",X"5B",X"2F",X"DD",X"35",X"01",X"28",X"07",X"21",X"11",X"32",X"CD",X"D1", + X"07",X"C9",X"3A",X"60",X"60",X"E6",X"0F",X"FE",X"0F",X"20",X"15",X"CD",X"3C",X"39",X"21",X"2A", + X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"2B",X"60",X"36",X"00",X"CD",X"07",X"23", + X"21",X"28",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"29",X"60",X"36",X"01",X"3A", + X"D5",X"61",X"CB",X"7F",X"28",X"07",X"3E",X"02",X"32",X"D7",X"61",X"18",X"0A",X"21",X"DD",X"61", + X"36",X"80",X"21",X"E2",X"61",X"CB",X"A6",X"06",X"78",X"CD",X"76",X"0F",X"C9",X"DD",X"CB",X"00", + X"56",X"20",X"31",X"DD",X"CB",X"00",X"D6",X"DD",X"7E",X"07",X"DD",X"86",X"1D",X"DD",X"77",X"07", + X"DD",X"7E",X"0C",X"DD",X"86",X"1D",X"FE",X"F0",X"38",X"02",X"3E",X"08",X"DD",X"77",X"0C",X"DD", + X"7E",X"0E",X"DD",X"86",X"1D",X"FE",X"F0",X"38",X"02",X"3E",X"08",X"DD",X"77",X"0E",X"DD",X"36", + X"11",X"0C",X"18",X"2E",X"DD",X"35",X"11",X"20",X"0A",X"DD",X"36",X"02",X"00",X"DD",X"CB",X"00", + X"96",X"18",X"1F",X"3E",X"04",X"DD",X"CB",X"11",X"46",X"20",X"02",X"ED",X"44",X"47",X"DD",X"86", + X"07",X"DD",X"77",X"07",X"DD",X"7E",X"0C",X"80",X"DD",X"77",X"0C",X"DD",X"7E",X"0E",X"80",X"DD", + X"77",X"0E",X"C9",X"06",X"48",X"DD",X"7E",X"07",X"D6",X"08",X"DD",X"96",X"0C",X"B8",X"30",X"06", + X"DD",X"36",X"02",X"04",X"18",X"10",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"11",X"00",X"FD",X"19", + X"DD",X"75",X"06",X"DD",X"74",X"07",X"C3",X"5B",X"2F",X"00",X"FD",X"00",X"02",X"00",X"02",X"00", + X"FE",X"20",X"00",X"24",X"00",X"28",X"00",X"08",X"00",X"0C",X"00",X"00",X"00",X"04",X"00",X"10", + X"00",X"14",X"00",X"00",X"20",X"04",X"20",X"08",X"20",X"0C",X"20",X"2C",X"20",X"FC",X"20",X"10", + X"10",X"14",X"10",X"2C",X"00",X"FC",X"00",X"18",X"00",X"1C",X"00",X"00",X"00",X"00",X"0A",X"0A", + X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"0A",X"00",X"03", + X"74",X"00",X"0D",X"75",X"00",X"0D",X"70",X"00",X"00",X"30",X"00",X"00",X"34",X"00",X"00",X"38", + X"00",X"00",X"3C",X"00",X"00",X"40",X"00",X"00",X"44",X"00",X"00",X"48",X"00",X"00",X"4C",X"00", + X"00",X"50",X"00",X"00",X"54",X"00",X"00",X"58",X"00",X"00",X"5C",X"00",X"00",X"60",X"00",X"00", + X"64",X"00",X"00",X"68",X"00",X"00",X"6C",X"00",X"00",X"80",X"00",X"02",X"84",X"00",X"02",X"88", + X"00",X"02",X"8C",X"00",X"02",X"A0",X"01",X"0C",X"60",X"01",X"0C",X"64",X"01",X"0C",X"68",X"01", + X"0C",X"6C",X"01",X"0C",X"70",X"01",X"0C",X"74",X"01",X"0C",X"78",X"01",X"0C",X"7C",X"01",X"0C", + X"80",X"01",X"0C",X"84",X"01",X"0C",X"88",X"01",X"0C",X"8C",X"01",X"0C",X"90",X"01",X"0C",X"94", + X"01",X"0C",X"98",X"01",X"0C",X"9C",X"01",X"0C",X"01",X"00",X"00",X"D6",X"10",X"38",X"03",X"04", + X"18",X"F9",X"C6",X"10",X"4F",X"C9",X"DD",X"E5",X"DD",X"21",X"00",X"62",X"06",X"28",X"CD",X"8D", + X"1B",X"DD",X"36",X"00",X"80",X"DD",X"36",X"05",X"40",X"DD",X"36",X"0E",X"10",X"DD",X"7E",X"05", + X"D6",X"04",X"CD",X"31",X"0F",X"C6",X"18",X"DD",X"77",X"07",X"DD",X"7E",X"05",X"C6",X"04",X"CD", + X"31",X"0F",X"47",X"DD",X"7E",X"07",X"D6",X"08",X"90",X"30",X"02",X"3E",X"08",X"DD",X"77",X"0C", + X"DD",X"7E",X"05",X"C6",X"04",X"CD",X"3C",X"0F",X"D6",X"08",X"DD",X"BE",X"07",X"30",X"18",X"DD", + X"36",X"0E",X"08",X"DD",X"7E",X"07",X"D6",X"08",X"DD",X"77",X"07",X"DD",X"7E",X"0C",X"D6",X"08", + X"30",X"02",X"3E",X"08",X"DD",X"77",X"0C",X"DD",X"E1",X"C9",X"DD",X"E5",X"DD",X"21",X"00",X"62", + X"CD",X"5B",X"2F",X"DD",X"E1",X"C9",X"06",X"00",X"3A",X"05",X"62",X"DD",X"96",X"05",X"D0",X"ED", + X"44",X"05",X"C9",X"0E",X"00",X"3A",X"07",X"62",X"DD",X"96",X"07",X"D0",X"ED",X"44",X"0D",X"C9", + X"21",X"00",X"62",X"CB",X"EE",X"21",X"03",X"62",X"36",X"04",X"C9",X"DD",X"7E",X"02",X"21",X"72", + X"33",X"DF",X"96",X"33",X"17",X"34",X"AB",X"34",X"C1",X"34",X"AC",X"35",X"AF",X"35",X"B2",X"35", + X"B5",X"35",X"B8",X"35",X"D1",X"35",X"D4",X"35",X"3F",X"36",X"72",X"37",X"3F",X"36",X"77",X"37", + X"3F",X"36",X"0E",X"35",X"62",X"35",X"DD",X"CB",X"00",X"6E",X"28",X"0E",X"DD",X"7E",X"03",X"DD", + X"77",X"02",X"21",X"E2",X"61",X"CB",X"E6",X"C3",X"6B",X"33",X"CD",X"B2",X"37",X"CD",X"0E",X"2F", + X"C3",X"B9",X"33",X"C3",X"F4",X"33",X"C3",X"9C",X"33",X"DD",X"7E",X"0A",X"A7",X"20",X"15",X"CD", + X"A0",X"38",X"C3",X"F4",X"33",X"DD",X"36",X"0A",X"01",X"DD",X"36",X"08",X"01",X"DD",X"36",X"1E", + X"03",X"C3",X"13",X"34",X"DD",X"35",X"1E",X"C2",X"13",X"34",X"DD",X"36",X"08",X"02",X"CD",X"E9", + X"38",X"21",X"F6",X"61",X"34",X"DD",X"36",X"0A",X"00",X"DD",X"36",X"1F",X"00",X"DD",X"36",X"20", + X"01",X"C3",X"13",X"34",X"DD",X"34",X"1F",X"DD",X"7E",X"1F",X"FE",X"08",X"38",X"07",X"DD",X"36", + X"1F",X"00",X"DD",X"34",X"20",X"DD",X"36",X"08",X"00",X"DD",X"CB",X"20",X"46",X"28",X"04",X"DD", + X"36",X"08",X"02",X"CD",X"5B",X"2F",X"C9",X"DD",X"CB",X"00",X"AE",X"DD",X"CB",X"00",X"4E",X"28", + X"10",X"21",X"E2",X"61",X"CB",X"E6",X"DD",X"36",X"01",X"04",X"DD",X"36",X"02",X"02",X"C3",X"85", + X"34",X"CD",X"B2",X"37",X"CD",X"82",X"38",X"CD",X"F5",X"2E",X"C3",X"43",X"34",X"C3",X"4C",X"34", + X"C3",X"9C",X"33",X"CD",X"A0",X"38",X"C3",X"4C",X"34",X"CD",X"E9",X"38",X"DD",X"7E",X"26",X"A7", + X"28",X"15",X"DD",X"BE",X"27",X"28",X"10",X"DD",X"77",X"27",X"5F",X"16",X"00",X"21",X"9B",X"34", + X"19",X"7E",X"DD",X"77",X"08",X"18",X"1A",X"DD",X"7E",X"18",X"A7",X"28",X"06",X"DD",X"35",X"18", + X"C3",X"85",X"34",X"DD",X"CB",X"08",X"46",X"20",X"05",X"DD",X"35",X"08",X"18",X"03",X"DD",X"34", + X"08",X"DD",X"36",X"18",X"02",X"DD",X"36",X"09",X"0A",X"3A",X"EB",X"61",X"CB",X"47",X"28",X"04", + X"DD",X"36",X"09",X"00",X"21",X"11",X"32",X"CD",X"D1",X"07",X"C9",X"03",X"0B",X"0F",X"0D",X"03", + X"03",X"11",X"03",X"07",X"09",X"03",X"03",X"05",X"03",X"03",X"03",X"DD",X"35",X"01",X"C2",X"85", + X"34",X"21",X"E2",X"61",X"CB",X"A6",X"DD",X"36",X"02",X"01",X"DD",X"CB",X"00",X"8E",X"C3",X"85", + X"34",X"DD",X"CB",X"00",X"AE",X"11",X"00",X"02",X"DD",X"6E",X"0B",X"DD",X"66",X"0C",X"AF",X"ED", + X"52",X"7C",X"FE",X"08",X"38",X"1C",X"DD",X"75",X"0B",X"DD",X"74",X"0C",X"DD",X"6E",X"0D",X"DD", + X"66",X"0E",X"AF",X"ED",X"52",X"7C",X"FE",X"08",X"38",X"08",X"DD",X"75",X"0D",X"DD",X"74",X"0E", + X"18",X"14",X"21",X"E2",X"61",X"CB",X"A6",X"DD",X"36",X"02",X"01",X"DD",X"36",X"08",X"03",X"DD", + X"36",X"18",X"02",X"C3",X"85",X"34",X"DD",X"36",X"08",X"02",X"CD",X"5B",X"2F",X"C9",X"3E",X"10", + X"CD",X"BE",X"0F",X"21",X"E2",X"61",X"CB",X"E6",X"DD",X"34",X"02",X"DD",X"7E",X"05",X"C6",X"04", + X"CD",X"31",X"0F",X"C6",X"08",X"47",X"DD",X"7E",X"07",X"90",X"38",X"04",X"FE",X"08",X"30",X"02", + X"3E",X"08",X"DD",X"77",X"12",X"DD",X"7E",X"05",X"D6",X"04",X"CD",X"31",X"0F",X"C6",X"08",X"4F", + X"DD",X"7E",X"07",X"91",X"38",X"04",X"FE",X"08",X"30",X"02",X"3E",X"08",X"DD",X"77",X"19",X"DD", + X"36",X"0B",X"00",X"DD",X"36",X"0C",X"08",X"DD",X"36",X"0D",X"00",X"DD",X"36",X"0E",X"08",X"C3", + X"A4",X"35",X"DD",X"6E",X"0D",X"DD",X"66",X"0E",X"11",X"A0",X"01",X"19",X"DD",X"75",X"0D",X"DD", + X"74",X"0E",X"7C",X"DD",X"BE",X"19",X"30",X"13",X"DD",X"6E",X"0B",X"DD",X"66",X"0C",X"19",X"DD", + X"75",X"0B",X"DD",X"74",X"0C",X"7C",X"DD",X"BE",X"12",X"38",X"19",X"DD",X"7E",X"12",X"DD",X"77", + X"0C",X"DD",X"7E",X"19",X"DD",X"77",X"0E",X"21",X"E2",X"61",X"CB",X"A6",X"DD",X"36",X"02",X"00", + X"DD",X"36",X"0A",X"00",X"DD",X"36",X"08",X"00",X"CD",X"5B",X"2F",X"C9",X"C3",X"AB",X"30",X"C3", + X"E1",X"30",X"C3",X"E9",X"30",X"C3",X"26",X"31",X"DD",X"CB",X"00",X"6E",X"C2",X"9C",X"33",X"CD", + X"7D",X"31",X"CD",X"A9",X"2E",X"CD",X"0E",X"2F",X"C3",X"B9",X"33",X"C3",X"F4",X"33",X"C3",X"9C", + X"33",X"C3",X"E3",X"31",X"DD",X"CB",X"00",X"6E",X"C2",X"9C",X"33",X"DD",X"CB",X"00",X"46",X"20", + X"3B",X"DD",X"CB",X"00",X"C6",X"3E",X"0E",X"CD",X"86",X"0F",X"3E",X"10",X"CD",X"BE",X"0F",X"3E", + X"13",X"CD",X"86",X"0F",X"DD",X"36",X"01",X"0C",X"DD",X"36",X"21",X"00",X"DD",X"36",X"22",X"00", + X"DD",X"36",X"23",X"05",X"DD",X"36",X"24",X"00",X"DD",X"36",X"07",X"B8",X"DD",X"36",X"0C",X"08", + X"DD",X"36",X"0E",X"08",X"DD",X"36",X"08",X"02",X"CD",X"5B",X"2F",X"C9",X"DD",X"7E",X"0C",X"FE", + X"10",X"30",X"06",X"DD",X"34",X"0C",X"DD",X"34",X"0E",X"DD",X"35",X"01",X"20",X"EA",X"DD",X"34", + X"02",X"DD",X"36",X"08",X"01",X"DD",X"36",X"25",X"01",X"DD",X"CB",X"00",X"86",X"18",X"D9",X"DD", + X"CB",X"00",X"6E",X"C2",X"9C",X"33",X"DD",X"6E",X"21",X"DD",X"66",X"22",X"DD",X"5E",X"23",X"DD", + X"56",X"24",X"AF",X"ED",X"52",X"DD",X"75",X"21",X"DD",X"74",X"22",X"EB",X"DD",X"6E",X"06",X"DD", + X"66",X"07",X"19",X"DD",X"75",X"06",X"DD",X"74",X"07",X"CD",X"43",X"38",X"DD",X"CB",X"25",X"46", + X"C2",X"97",X"36",X"DD",X"CB",X"22",X"7E",X"20",X"13",X"06",X"00",X"DD",X"35",X"12",X"DD",X"CB", + X"12",X"56",X"28",X"02",X"06",X"02",X"DD",X"70",X"08",X"C3",X"18",X"36",X"DD",X"CB",X"25",X"C6", + X"DD",X"36",X"08",X"01",X"C3",X"18",X"36",X"DD",X"7E",X"02",X"FE",X"0B",X"20",X"14",X"DD",X"7E", + X"05",X"D6",X"04",X"CD",X"31",X"0F",X"DD",X"BE",X"07",X"38",X"07",X"DD",X"36",X"03",X"04",X"C3", + X"9C",X"33",X"DD",X"7E",X"07",X"FE",X"98",X"30",X"1B",X"06",X"0F",X"FE",X"68",X"30",X"04",X"06", + X"08",X"18",X"0B",X"4F",X"3E",X"98",X"D6",X"06",X"B9",X"38",X"03",X"05",X"18",X"F8",X"DD",X"70", + X"0C",X"DD",X"70",X"0E",X"DD",X"7E",X"02",X"FE",X"0F",X"CA",X"3B",X"37",X"DD",X"7E",X"07",X"FE", + X"68",X"30",X"55",X"FE",X"60",X"38",X"45",X"21",X"8D",X"63",X"CB",X"7E",X"28",X"13",X"3A",X"99", + X"63",X"D6",X"14",X"DD",X"BE",X"05",X"30",X"09",X"C6",X"28",X"DD",X"BE",X"05",X"38",X"02",X"18", + X"18",X"21",X"9B",X"63",X"CB",X"7E",X"28",X"30",X"3A",X"A7",X"63",X"D6",X"10",X"DD",X"BE",X"05", + X"30",X"26",X"C6",X"20",X"DD",X"BE",X"05",X"38",X"1F",X"3E",X"0B",X"CD",X"86",X"0F",X"3E",X"0E", + X"CD",X"86",X"0F",X"DD",X"36",X"08",X"02",X"DD",X"34",X"02",X"18",X"0C",X"FE",X"58",X"30",X"08", + X"DD",X"36",X"03",X"04",X"DD",X"CB",X"00",X"EE",X"C3",X"18",X"36",X"DD",X"7E",X"07",X"FE",X"58", + X"30",X"F6",X"DD",X"56",X"05",X"1E",X"4C",X"CD",X"0B",X"39",X"FE",X"A4",X"FE",X"A4",X"DA",X"AB", + X"36",X"FE",X"A8",X"D2",X"AB",X"36",X"CD",X"2B",X"39",X"CD",X"07",X"23",X"CD",X"9F",X"3A",X"CD", + X"EF",X"3A",X"DD",X"36",X"02",X"00",X"CD",X"5E",X"29",X"CD",X"9D",X"23",X"3E",X"14",X"CD",X"86", + X"0F",X"C9",X"21",X"06",X"00",X"18",X"03",X"21",X"08",X"00",X"DD",X"75",X"23",X"DD",X"74",X"24", + X"DD",X"6E",X"21",X"DD",X"66",X"22",X"CD",X"43",X"1F",X"DD",X"75",X"21",X"DD",X"74",X"22",X"DD", + X"CB",X"25",X"86",X"DD",X"7E",X"07",X"C6",X"08",X"DD",X"77",X"07",X"DD",X"36",X"0C",X"10",X"DD", + X"36",X"0E",X"10",X"DD",X"36",X"08",X"02",X"DD",X"36",X"12",X"00",X"DD",X"34",X"02",X"CD",X"5B", + X"2F",X"C9",X"3A",X"D5",X"61",X"CB",X"7F",X"28",X"05",X"3A",X"D8",X"61",X"18",X"0F",X"21",X"00", + X"90",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"01",X"90",X"7E",X"2F",X"E6",X"0F",X"DD", + X"77",X"26",X"47",X"E6",X"05",X"CA",X"37",X"38",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"ED",X"5B", + X"52",X"60",X"D5",X"FE",X"01",X"20",X"28",X"ED",X"5B",X"09",X"32",X"19",X"7C",X"FE",X"38",X"30", + X"03",X"21",X"00",X"38",X"DD",X"75",X"04",X"DD",X"74",X"05",X"E1",X"ED",X"5B",X"DE",X"0B",X"19", + X"ED",X"5B",X"DA",X"0B",X"E5",X"AF",X"ED",X"52",X"E1",X"30",X"01",X"EB",X"C3",X"34",X"38",X"ED", + X"5B",X"0B",X"32",X"19",X"7C",X"FE",X"B8",X"38",X"03",X"21",X"00",X"B8",X"DD",X"75",X"04",X"DD", + X"74",X"05",X"E1",X"ED",X"5B",X"DC",X"0B",X"19",X"ED",X"5B",X"D8",X"0B",X"E5",X"AF",X"ED",X"52", + X"E1",X"38",X"01",X"EB",X"22",X"52",X"60",X"21",X"E8",X"61",X"CB",X"6E",X"C0",X"CD",X"C8",X"0F", + X"C3",X"84",X"2E",X"21",X"00",X"90",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"01",X"90", + X"7E",X"2F",X"E6",X"05",X"C8",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"FE",X"01",X"20",X"0F",X"ED", + X"5B",X"09",X"32",X"19",X"7C",X"FE",X"38",X"30",X"12",X"21",X"00",X"38",X"18",X"0D",X"ED",X"5B", + X"0B",X"32",X"19",X"7C",X"FE",X"B8",X"38",X"03",X"21",X"00",X"B8",X"DD",X"75",X"04",X"DD",X"74", + X"05",X"C9",X"78",X"E6",X"0A",X"C8",X"21",X"0D",X"32",X"FE",X"02",X"20",X"02",X"23",X"23",X"5E", + X"23",X"56",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"19",X"DD",X"75",X"06",X"DD",X"74",X"07",X"C9", + X"DD",X"7E",X"05",X"C6",X"04",X"57",X"DD",X"7E",X"07",X"C6",X"04",X"5F",X"D5",X"CD",X"0B",X"39", + X"D1",X"FE",X"53",X"28",X"24",X"7B",X"D6",X"08",X"5F",X"D5",X"CD",X"0B",X"39",X"D1",X"FE",X"53", + X"28",X"17",X"7A",X"D6",X"08",X"57",X"D5",X"CD",X"0B",X"39",X"D1",X"FE",X"53",X"28",X"0A",X"7B", + X"C6",X"08",X"5F",X"CD",X"0B",X"39",X"FE",X"53",X"C0",X"CB",X"D4",X"CB",X"5E",X"CB",X"94",X"C0", + X"22",X"33",X"60",X"E1",X"23",X"23",X"23",X"E5",X"C9",X"2A",X"33",X"60",X"36",X"24",X"21",X"00", + X"20",X"22",X"13",X"60",X"AF",X"32",X"12",X"60",X"CD",X"C4",X"1E",X"21",X"32",X"60",X"34",X"3E", + X"07",X"CB",X"46",X"20",X"02",X"3E",X"08",X"CD",X"86",X"0F",X"C9",X"3A",X"55",X"60",X"82",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"E6",X"1F",X"4F",X"7B",X"ED",X"44",X"E6",X"F8",X"6F",X"26",X"00", + X"29",X"29",X"11",X"00",X"D0",X"19",X"06",X"00",X"09",X"7E",X"C9",X"21",X"2A",X"60",X"3A",X"00", + X"60",X"CB",X"6F",X"28",X"03",X"21",X"2B",X"60",X"7E",X"A7",X"20",X"28",X"CD",X"8C",X"3B",X"21", + X"32",X"D1",X"06",X"08",X"11",X"EC",X"39",X"CD",X"1D",X"3A",X"06",X"B4",X"CD",X"76",X"0F",X"21", + X"2A",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"2B",X"60",X"36",X"00",X"21",X"32", + X"D1",X"C3",X"CD",X"39",X"E5",X"21",X"52",X"D1",X"06",X"08",X"11",X"F7",X"39",X"CD",X"1D",X"3A", + X"CD",X"2C",X"3A",X"CD",X"8C",X"3B",X"E1",X"E5",X"06",X"0A",X"CD",X"76",X"0F",X"E1",X"7E",X"3D", + X"47",X"E6",X"0F",X"FE",X"0A",X"30",X"03",X"78",X"18",X"07",X"D6",X"06",X"4F",X"78",X"E6",X"F0", + X"81",X"77",X"E5",X"CD",X"EF",X"3A",X"3A",X"59",X"60",X"3D",X"87",X"5F",X"16",X"00",X"21",X"93", + X"3A",X"19",X"5E",X"23",X"56",X"EB",X"22",X"13",X"60",X"AF",X"32",X"12",X"60",X"CD",X"C4",X"1E", + X"3E",X"0F",X"CD",X"86",X"0F",X"E1",X"7E",X"A7",X"20",X"BD",X"06",X"3C",X"CD",X"76",X"0F",X"21", + X"B5",X"D1",X"06",X"05",X"11",X"02",X"3A",X"CD",X"1D",X"3A",X"21",X"52",X"D1",X"06",X"08",X"11", + X"02",X"3A",X"CD",X"1D",X"3A",X"CD",X"8C",X"3B",X"3E",X"16",X"CD",X"86",X"0F",X"06",X"01",X"CD", + X"76",X"0F",X"3A",X"1C",X"6C",X"A7",X"20",X"F5",X"C9",X"72",X"D1",X"08",X"17",X"18",X"24",X"0B", + X"18",X"17",X"1E",X"1C",X"72",X"D1",X"08",X"24",X"24",X"24",X"0B",X"18",X"17",X"1E",X"1C",X"72", + X"D1",X"08",X"24",X"24",X"24",X"24",X"24",X"24",X"24",X"24",X"7D",X"E6",X"E0",X"4F",X"3A",X"55", + X"60",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"85",X"E6",X"1F",X"81",X"6F",X"C9",X"CD",X"0A",X"3A", + X"1A",X"77",X"13",X"7D",X"3C",X"E6",X"1F",X"81",X"6F",X"10",X"F5",X"C9",X"21",X"B5",X"D1",X"CD", + X"0A",X"3A",X"1E",X"52",X"16",X"00",X"F7",X"21",X"B6",X"D1",X"CD",X"0A",X"3A",X"1E",X"21",X"F7", + X"CD",X"6F",X"3A",X"C5",X"21",X"B7",X"D1",X"CD",X"0A",X"3A",X"C1",X"58",X"F7",X"C5",X"21",X"B8", + X"D1",X"CD",X"0A",X"3A",X"C1",X"59",X"F7",X"21",X"B9",X"D1",X"CD",X"0A",X"3A",X"1E",X"00",X"F7", + X"C9",X"21",X"50",X"D3",X"1E",X"21",X"16",X"00",X"F7",X"23",X"CD",X"6F",X"3A",X"18",X"1A",X"3A", + X"59",X"60",X"3D",X"87",X"4F",X"06",X"00",X"E5",X"21",X"93",X"3A",X"09",X"46",X"23",X"4E",X"CB", + X"39",X"CB",X"39",X"CB",X"39",X"CB",X"39",X"E1",X"C9",X"58",X"F7",X"23",X"59",X"F7",X"23",X"1E", + X"00",X"F7",X"C9",X"01",X"00",X"01",X"50",X"02",X"00",X"02",X"50",X"03",X"00",X"03",X"50",X"11", + X"C2",X"3A",X"0E",X"03",X"21",X"21",X"D3",X"06",X"0F",X"1A",X"13",X"77",X"CB",X"D4",X"36",X"02", + X"CB",X"94",X"23",X"10",X"F4",X"D5",X"11",X"11",X"00",X"19",X"D1",X"0D",X"20",X"E9",X"CD",X"61", + X"3A",X"C9",X"40",X"43",X"43",X"43",X"43",X"43",X"43",X"43",X"43",X"43",X"45",X"43",X"43",X"43", + X"48",X"41",X"1E",X"17",X"12",X"1F",X"0E",X"1B",X"1C",X"0A",X"15",X"46",X"24",X"24",X"24",X"49", + X"42",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"47",X"44",X"44",X"44",X"4A",X"21", + X"2A",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"2B",X"60",X"7E",X"E5",X"CB",X"3F", + X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"21",X"4D",X"D3",X"A7",X"28",X"11",X"16",X"00",X"1E",X"55", + X"F7",X"23",X"1E",X"56",X"F7",X"2B",X"2B",X"C6",X"56",X"5F",X"F7",X"18",X"09",X"2B",X"36",X"24", + X"23",X"36",X"24",X"23",X"36",X"24",X"E1",X"7E",X"08",X"7E",X"21",X"42",X"D3",X"0E",X"09",X"E6", + X"0F",X"47",X"28",X"09",X"16",X"01",X"1E",X"52",X"F7",X"23",X"0D",X"10",X"FB",X"08",X"41",X"E6", + X"F0",X"28",X"0A",X"78",X"A7",X"28",X"05",X"36",X"24",X"23",X"10",X"FB",X"C9",X"78",X"A7",X"28", + X"18",X"3E",X"09",X"90",X"5F",X"16",X"00",X"E5",X"21",X"6A",X"3B",X"19",X"EB",X"E1",X"1A",X"13", + X"D5",X"5F",X"16",X"03",X"F7",X"23",X"D1",X"10",X"F5",X"C9",X"1E",X"17",X"12",X"1F",X"0E",X"1B", + X"1C",X"0A",X"15",X"21",X"00",X"60",X"3E",X"10",X"CB",X"7E",X"CA",X"86",X"3B",X"3E",X"20",X"CB", + X"6E",X"CA",X"86",X"3B",X"3E",X"21",X"CD",X"98",X"3B",X"C3",X"0F",X"42",X"21",X"06",X"6C",X"01", + X"02",X"FA",X"AF",X"D7",X"C3",X"9C",X"43",X"C9",X"C3",X"50",X"59",X"C9",X"E6",X"DD",X"7E",X"02", + X"21",X"A4",X"3B",X"DF",X"AC",X"3B",X"AA",X"3C",X"98",X"3D",X"0D",X"3E",X"AF",X"21",X"F3",X"69", + X"01",X"01",X"05",X"D7",X"CD",X"20",X"3E",X"DD",X"36",X"02",X"01",X"21",X"EB",X"69",X"3E",X"01", + X"06",X"08",X"77",X"23",X"3C",X"10",X"FB",X"21",X"EB",X"69",X"3A",X"05",X"62",X"4F",X"3E",X"54", + X"06",X"05",X"B9",X"30",X"05",X"C6",X"12",X"23",X"10",X"F8",X"36",X"FF",X"23",X"36",X"FF",X"23", + X"36",X"FF",X"DD",X"70",X"06",X"21",X"1A",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21", + X"21",X"60",X"7E",X"FE",X"03",X"38",X"2A",X"23",X"7E",X"FE",X"04",X"38",X"24",X"23",X"01",X"00", + X"05",X"7E",X"A7",X"28",X"04",X"23",X"0C",X"10",X"F8",X"DD",X"5E",X"06",X"16",X"00",X"21",X"A4", + X"3C",X"19",X"5E",X"21",X"EB",X"69",X"19",X"36",X"FF",X"06",X"00",X"21",X"F3",X"69",X"09",X"1C", + X"73",X"06",X"05",X"11",X"F3",X"69",X"1A",X"A7",X"20",X"17",X"C5",X"06",X"00",X"CD",X"13",X"1F", + X"7C",X"E6",X"07",X"4F",X"21",X"EB",X"69",X"09",X"7E",X"FE",X"FF",X"28",X"F0",X"C1",X"36",X"FF", + X"12",X"13",X"10",X"E2",X"DD",X"E5",X"11",X"08",X"00",X"DD",X"19",X"FD",X"E5",X"FD",X"21",X"F3", + X"69",X"01",X"00",X"05",X"FD",X"5E",X"00",X"1D",X"16",X"00",X"21",X"9C",X"3C",X"19",X"7E",X"DD", + X"77",X"01",X"CD",X"31",X"0F",X"FD",X"77",X"00",X"DD",X"7E",X"01",X"CD",X"3C",X"0F",X"FD",X"96", + X"00",X"D6",X"16",X"C5",X"57",X"1E",X"00",X"CD",X"13",X"1F",X"4D",X"06",X"00",X"CD",X"4B",X"1F", + X"C1",X"7C",X"FD",X"86",X"00",X"C6",X"0A",X"DD",X"77",X"03",X"DD",X"71",X"04",X"0C",X"FD",X"23", + X"11",X"06",X"00",X"DD",X"19",X"10",X"BD",X"FD",X"E1",X"DD",X"E1",X"C9",X"39",X"4B",X"5D",X"6F", + X"81",X"93",X"A5",X"B7",X"01",X"01",X"00",X"07",X"06",X"06",X"21",X"00",X"62",X"CB",X"7E",X"CA", + X"6A",X"3D",X"DD",X"35",X"03",X"20",X"08",X"CD",X"20",X"3E",X"DD",X"36",X"02",X"03",X"C9",X"FD", + X"E5",X"DD",X"E5",X"DD",X"E5",X"FD",X"E1",X"11",X"04",X"00",X"DD",X"19",X"FD",X"36",X"04",X"00", + X"FD",X"36",X"06",X"05",X"DD",X"7E",X"08",X"FE",X"FF",X"28",X"0E",X"CD",X"46",X"33",X"FE",X"0D", + X"30",X"07",X"CD",X"53",X"33",X"FE",X"0D",X"38",X"14",X"FD",X"34",X"04",X"11",X"06",X"00",X"DD", + X"19",X"FD",X"35",X"06",X"20",X"DE",X"DD",X"E1",X"FD",X"E1",X"C3",X"51",X"3D",X"DD",X"36",X"08", + X"05",X"DD",X"36",X"09",X"08",X"21",X"00",X"62",X"CB",X"BE",X"21",X"E2",X"61",X"CB",X"E6",X"21", + X"02",X"00",X"22",X"13",X"60",X"AF",X"32",X"12",X"60",X"CD",X"C4",X"1E",X"3E",X"0F",X"CD",X"86", + X"0F",X"21",X"1C",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"23",X"60",X"E5",X"FD", + X"5E",X"04",X"16",X"00",X"19",X"7E",X"36",X"FF",X"E1",X"FE",X"FF",X"28",X"02",X"2B",X"34",X"CD", + X"BA",X"3F",X"DD",X"E1",X"FD",X"E1",X"DD",X"36",X"05",X"0A",X"DD",X"36",X"02",X"02",X"C3",X"6A", + X"3D",X"3E",X"08",X"DD",X"CB",X"03",X"56",X"28",X"02",X"3E",X"0D",X"DD",X"77",X"0D",X"DD",X"77", + X"13",X"DD",X"77",X"19",X"DD",X"77",X"1F",X"DD",X"77",X"25",X"DD",X"E5",X"11",X"04",X"00",X"DD", + X"19",X"06",X"05",X"C5",X"DD",X"7E",X"08",X"FE",X"FF",X"28",X"06",X"21",X"8C",X"3D",X"CD",X"D1", + X"07",X"11",X"06",X"00",X"DD",X"19",X"C1",X"10",X"EA",X"DD",X"E1",X"C9",X"AC",X"01",X"B0",X"01", + X"B4",X"01",X"B8",X"01",X"BC",X"01",X"B8",X"00",X"DD",X"35",X"05",X"C2",X"6A",X"3D",X"DD",X"7E", + X"04",X"87",X"47",X"87",X"80",X"C6",X"08",X"5F",X"16",X"00",X"DD",X"E5",X"DD",X"19",X"DD",X"36", + X"04",X"FF",X"DD",X"E1",X"3A",X"1B",X"60",X"21",X"00",X"60",X"CB",X"6E",X"28",X"03",X"3A",X"22", + X"60",X"FE",X"05",X"30",X"11",X"21",X"00",X"62",X"CB",X"FE",X"21",X"E2",X"61",X"CB",X"A6",X"DD", + X"36",X"02",X"01",X"C3",X"6A",X"3D",X"21",X"1A",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03", + X"21",X"21",X"60",X"34",X"EF",X"DD",X"E5",X"DD",X"21",X"DF",X"61",X"CD",X"8A",X"07",X"EF",X"CD", + X"8A",X"07",X"DD",X"E1",X"CD",X"4C",X"3E",X"21",X"00",X"62",X"CB",X"FE",X"21",X"E2",X"61",X"CB", + X"A6",X"DD",X"E5",X"DD",X"21",X"E8",X"61",X"CD",X"17",X"26",X"DD",X"E1",X"C9",X"21",X"00",X"62", + X"CB",X"7E",X"C8",X"DD",X"35",X"03",X"C0",X"DD",X"36",X"02",X"00",X"DD",X"36",X"03",X"3C",X"C9", + X"21",X"1A",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"21",X"60",X"7E",X"06",X"15", + X"A7",X"28",X"08",X"06",X"12",X"FE",X"01",X"28",X"02",X"06",X"0F",X"CD",X"45",X"3E",X"4F",X"78", + X"91",X"DD",X"77",X"03",X"C9",X"3A",X"02",X"90",X"2F",X"E6",X"03",X"C9",X"21",X"40",X"D1",X"11", + X"05",X"69",X"CD",X"1D",X"3F",X"21",X"A0",X"D1",X"CD",X"1D",X"3F",X"21",X"00",X"D2",X"CD",X"1D", + X"3F",X"21",X"48",X"D1",X"11",X"3D",X"3F",X"3E",X"00",X"CD",X"02",X"3F",X"21",X"A6",X"D1",X"CD", + X"02",X"3F",X"21",X"09",X"D2",X"CD",X"02",X"3F",X"21",X"0F",X"D2",X"3E",X"01",X"CD",X"02",X"3F", + X"21",X"14",X"D2",X"3E",X"00",X"CD",X"02",X"3F",X"DD",X"36",X"03",X"F0",X"CD",X"EB",X"3E",X"21", + X"17",X"60",X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"18",X"60",X"7E",X"C6",X"01",X"27", + X"77",X"CD",X"51",X"1E",X"3E",X"01",X"CD",X"86",X"0F",X"21",X"00",X"10",X"22",X"12",X"60",X"AF", + X"32",X"14",X"60",X"CD",X"C4",X"1E",X"DD",X"36",X"03",X"F0",X"CD",X"EB",X"3E",X"21",X"1B",X"60", + X"3A",X"00",X"60",X"CB",X"6F",X"28",X"03",X"21",X"22",X"60",X"AF",X"01",X"01",X"06",X"D7",X"CD", + X"74",X"3F",X"CD",X"BA",X"3F",X"21",X"40",X"D1",X"11",X"05",X"69",X"CD",X"2D",X"3F",X"21",X"A0", + X"D1",X"CD",X"2D",X"3F",X"21",X"00",X"D2",X"CD",X"2D",X"3F",X"C9",X"DD",X"35",X"03",X"C8",X"06", + X"01",X"CD",X"76",X"0F",X"CD",X"74",X"3F",X"DD",X"CB",X"03",X"56",X"20",X"EE",X"CD",X"BA",X"3F", + X"18",X"E9",X"08",X"CD",X"0A",X"3A",X"1A",X"47",X"13",X"1A",X"77",X"CB",X"D4",X"08",X"77",X"08", + X"CB",X"94",X"13",X"7D",X"3C",X"E6",X"1F",X"81",X"6F",X"10",X"EE",X"08",X"C9",X"06",X"20",X"7E", + X"12",X"13",X"CB",X"D4",X"7E",X"CB",X"94",X"12",X"13",X"23",X"10",X"F3",X"C9",X"06",X"20",X"1A", + X"77",X"13",X"1A",X"CB",X"D4",X"77",X"CB",X"94",X"13",X"23",X"10",X"F3",X"C9",X"11",X"0C",X"00", + X"17",X"10",X"1B",X"0A",X"1D",X"1E",X"15",X"0A",X"1D",X"12",X"18",X"17",X"1C",X"24",X"28",X"13", + X"22",X"00",X"1E",X"24",X"20",X"12",X"17",X"24",X"0A",X"24",X"0E",X"21",X"1D",X"1B",X"0A",X"24", + X"0C",X"0A",X"1B",X"06",X"0B",X"00",X"17",X"1E",X"1C",X"24",X"05",X"01",X"00",X"00",X"00",X"24", + X"03",X"19",X"1D",X"1C",X"11",X"94",X"3F",X"0E",X"03",X"21",X"34",X"D3",X"06",X"0B",X"1A",X"13", + X"77",X"CB",X"D4",X"36",X"03",X"CB",X"94",X"23",X"10",X"F4",X"D5",X"11",X"15",X"00",X"19",X"D1", + X"0D",X"20",X"E9",X"C9",X"40",X"43",X"45",X"43",X"45",X"43",X"45",X"43",X"45",X"43",X"48",X"41", + X"24",X"46",X"24",X"46",X"24",X"46",X"24",X"46",X"24",X"49",X"42",X"44",X"47",X"44",X"47",X"44", + X"47",X"44",X"47",X"44",X"4A",X"0E",X"21",X"1D",X"1B",X"0A",X"11",X"1C",X"60",X"3A",X"00",X"60", + X"CB",X"6F",X"28",X"03",X"11",X"23",X"60",X"06",X"05",X"21",X"55",X"D3",X"DD",X"E5",X"DD",X"21", + X"B5",X"3F",X"DD",X"7E",X"00",X"77",X"1A",X"CB",X"D4",X"A7",X"20",X"04",X"36",X"06",X"18",X"02", + X"36",X"01",X"CB",X"94",X"23",X"23",X"13",X"DD",X"23",X"10",X"E7",X"DD",X"E1",X"C9",X"DD",X"E5", + X"DD",X"21",X"F8",X"69",X"DD",X"36",X"00",X"30",X"DD",X"36",X"01",X"14",X"3E",X"01",X"21",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_cpu3.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_cpu3.vhd new file mode 100644 index 00000000..c72150e9 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_cpu3.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_cpu3 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 prom of rom_cpu3 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"60",X"CB",X"BE",X"CB",X"86",X"CB",X"6E",X"28",X"02",X"3E",X"02",X"DD",X"77",X"02",X"DD",X"36", + X"03",X"0A",X"DD",X"36",X"04",X"00",X"3E",X"00",X"CD",X"A0",X"1B",X"CD",X"21",X"40",X"C3",X"44", + X"40",X"21",X"53",X"41",X"CD",X"39",X"1D",X"CD",X"39",X"1D",X"CD",X"39",X"1D",X"DD",X"7E",X"02", + X"FE",X"02",X"20",X"03",X"21",X"98",X"41",X"CD",X"39",X"1D",X"21",X"B1",X"41",X"CD",X"39",X"1D", + X"CD",X"39",X"41",X"C9",X"EF",X"DD",X"E5",X"CD",X"73",X"3B",X"DD",X"E1",X"CD",X"53",X"1B",X"DD", + X"35",X"01",X"20",X"17",X"DD",X"36",X"01",X"14",X"DD",X"7E",X"00",X"D6",X"01",X"27",X"DD",X"77", + X"00",X"CD",X"39",X"41",X"DD",X"7E",X"00",X"A7",X"CA",X"1F",X"41",X"DD",X"35",X"03",X"20",X"07", + X"DD",X"36",X"03",X"0A",X"DD",X"34",X"04",X"3A",X"04",X"60",X"A7",X"20",X"13",X"21",X"53",X"41", + X"DD",X"CB",X"04",X"46",X"20",X"05",X"CD",X"39",X"1D",X"18",X"03",X"CD",X"46",X"41",X"18",X"B4", + X"21",X"7F",X"41",X"DD",X"7E",X"02",X"FE",X"02",X"20",X"03",X"21",X"98",X"41",X"DD",X"CB",X"04", + X"46",X"20",X"05",X"CD",X"39",X"1D",X"18",X"03",X"CD",X"46",X"41",X"21",X"00",X"90",X"DD",X"7E", + X"02",X"FE",X"02",X"28",X"1B",X"CB",X"6E",X"C2",X"44",X"40",X"21",X"00",X"60",X"CB",X"A6",X"CB", + X"96",X"21",X"17",X"60",X"11",X"0C",X"60",X"AF",X"32",X"2A",X"60",X"01",X"1A",X"60",X"18",X"19", + X"CB",X"76",X"C2",X"44",X"40",X"21",X"00",X"60",X"CB",X"9E",X"CB",X"8E",X"21",X"18",X"60",X"11", + X"0F",X"60",X"AF",X"32",X"2B",X"60",X"01",X"21",X"60",X"AF",X"12",X"13",X"12",X"13",X"12",X"E5", + X"C5",X"E1",X"01",X"01",X"07",X"D7",X"3A",X"02",X"90",X"07",X"07",X"E6",X"03",X"5F",X"16",X"00", + X"21",X"44",X"06",X"19",X"7E",X"E1",X"3C",X"77",X"3A",X"04",X"60",X"3D",X"32",X"04",X"60",X"3A", + X"5B",X"6B",X"3D",X"32",X"5B",X"6B",X"3A",X"91",X"6E",X"3D",X"32",X"91",X"6E",X"DD",X"E1",X"CD", + X"7C",X"1B",X"21",X"00",X"60",X"CB",X"FE",X"CB",X"C6",X"21",X"DB",X"61",X"36",X"00",X"21",X"0B", + X"60",X"36",X"00",X"CD",X"21",X"40",X"DD",X"E1",X"C9",X"DD",X"E5",X"06",X"02",X"21",X"D9",X"D2", + X"CD",X"95",X"1E",X"DD",X"E1",X"C9",X"5E",X"23",X"56",X"23",X"46",X"3E",X"24",X"EB",X"77",X"23", + X"10",X"FC",X"C9",X"25",X"D1",X"0D",X"19",X"1E",X"1D",X"24",X"16",X"18",X"1B",X"0E",X"24",X"0C", + X"18",X"12",X"17",X"66",X"D1",X"13",X"1D",X"18",X"24",X"0C",X"18",X"17",X"1D",X"12",X"17",X"1E", + X"0E",X"24",X"1D",X"18",X"24",X"19",X"15",X"0A",X"22",X"CE",X"D1",X"03",X"0A",X"17",X"0D",X"25", + X"D2",X"16",X"19",X"1E",X"1C",X"11",X"24",X"24",X"01",X"24",X"19",X"15",X"0A",X"22",X"0E",X"1B", + X"24",X"24",X"0B",X"1E",X"1D",X"1D",X"18",X"17",X"25",X"D2",X"16",X"19",X"1E",X"1C",X"11",X"24", + X"24",X"02",X"24",X"19",X"15",X"0A",X"22",X"0E",X"1B",X"1C",X"24",X"0B",X"1E",X"1D",X"1D",X"18", + X"17",X"D4",X"D2",X"04",X"1D",X"12",X"16",X"0E",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", + X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"62", + X"00",X"42",X"00",X"42",X"05",X"42",X"02",X"42",X"02",X"42",X"00",X"42",X"02",X"42",X"00",X"42", + X"00",X"42",X"02",X"42",X"02",X"42",X"02",X"42",X"02",X"42",X"02",X"42",X"02",X"42",X"02",X"42", + X"0C",X"42",X"0C",X"42",X"0C",X"42",X"0C",X"42",X"0C",X"42",X"0C",X"42",X"0C",X"42",X"0C",X"42", + X"01",X"00",X"02",X"00",X"10",X"06",X"00",X"10",X"20",X"30",X"60",X"70",X"02",X"40",X"50",X"FD", + X"21",X"00",X"6C",X"DD",X"21",X"06",X"6C",X"FD",X"36",X"02",X"00",X"01",X"00",X"18",X"21",X"3C", + X"43",X"DD",X"7E",X"00",X"E6",X"03",X"20",X"07",X"DD",X"36",X"00",X"00",X"C3",X"17",X"43",X"E5", + X"DD",X"CB",X"00",X"56",X"28",X"15",X"DD",X"36",X"00",X"00",X"CF",X"23",X"36",X"00",X"FD",X"7E", + X"02",X"A7",X"C2",X"16",X"43",X"CD",X"9C",X"43",X"C3",X"16",X"43",X"FD",X"34",X"02",X"CB",X"47", + X"28",X"1B",X"DD",X"CB",X"00",X"86",X"DD",X"CB",X"00",X"CE",X"CF",X"71",X"23",X"36",X"80",X"FD", + X"7E",X"02",X"FE",X"01",X"C2",X"16",X"43",X"CD",X"9C",X"43",X"C3",X"16",X"43",X"C5",X"DD",X"E5", + X"CF",X"E5",X"DD",X"E1",X"79",X"FE",X"10",X"38",X"08",X"FD",X"7E",X"02",X"FE",X"01",X"C2",X"13", + X"43",X"DD",X"CB",X"01",X"76",X"28",X"09",X"DD",X"35",X"02",X"20",X"0F",X"DD",X"CB",X"01",X"B6", + X"EB",X"CF",X"FD",X"E5",X"01",X"99",X"42",X"C5",X"E9",X"FD",X"E1",X"FD",X"7E",X"02",X"FE",X"01", + X"C2",X"13",X"43",X"DD",X"CB",X"01",X"7E",X"CA",X"13",X"43",X"DD",X"6E",X"00",X"26",X"00",X"29", + X"11",X"D0",X"41",X"19",X"CF",X"7E",X"47",X"23",X"7E",X"23",X"E5",X"21",X"00",X"B0",X"FE",X"40", + X"38",X"05",X"D6",X"40",X"21",X"00",X"C0",X"87",X"C6",X"80",X"4F",X"FE",X"E0",X"28",X"1E",X"DD", + X"7E",X"03",X"E6",X"0F",X"81",X"77",X"DD",X"7E",X"03",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"5F", + X"DD",X"7E",X"04",X"E6",X"03",X"07",X"07",X"07",X"07",X"83",X"77",X"18",X"11",X"DD",X"CB",X"04", + X"7E",X"28",X"0B",X"DD",X"CB",X"04",X"BE",X"DD",X"7E",X"03",X"E6",X"07",X"81",X"77",X"DD",X"7E", + X"05",X"2F",X"E6",X"0F",X"81",X"C6",X"10",X"77",X"E1",X"11",X"03",X"00",X"DD",X"19",X"10",X"A8", + X"C3",X"13",X"43",X"DD",X"E1",X"C1",X"E1",X"11",X"04",X"00",X"19",X"DD",X"23",X"0C",X"79",X"FE", + X"10",X"20",X"0A",X"FD",X"7E",X"02",X"FD",X"77",X"05",X"FD",X"36",X"02",X"00",X"05",X"C2",X"21", + X"42",X"FD",X"7E",X"02",X"FD",X"86",X"05",X"C0",X"CD",X"9C",X"43",X"C9",X"1E",X"6C",X"DA",X"45", + X"2A",X"6C",X"63",X"46",X"32",X"6C",X"37",X"47",X"49",X"6C",X"A0",X"49",X"56",X"6C",X"E1",X"49", + X"68",X"6C",X"22",X"46",X"73",X"6C",X"E1",X"49",X"85",X"6C",X"22",X"46",X"90",X"6C",X"22",X"46", + X"9B",X"6C",X"09",X"48",X"AC",X"6C",X"05",X"48",X"BA",X"6C",X"2D",X"49",X"CC",X"6C",X"F1",X"48", + X"DA",X"6C",X"7E",X"46",X"F1",X"6C",X"B2",X"48",X"FE",X"6C",X"E1",X"49",X"10",X"6D",X"4E",X"4A", + X"2D",X"6D",X"4E",X"4A",X"4A",X"6D",X"4E",X"4A",X"67",X"6D",X"4E",X"4A",X"84",X"6D",X"4E",X"4A", + X"A1",X"6D",X"4E",X"4A",X"BE",X"6D",X"4E",X"4A",X"DB",X"6D",X"4E",X"4A",X"3E",X"9F",X"32",X"00", + X"B0",X"32",X"00",X"C0",X"C6",X"20",X"30",X"F6",X"C9",X"DD",X"36",X"01",X"00",X"DD",X"5E",X"00", + X"16",X"00",X"21",X"06",X"6C",X"19",X"36",X"00",X"3A",X"02",X"6C",X"FE",X"01",X"C0",X"CD",X"9C", + X"43",X"C9",X"00",X"00",X"F8",X"03",X"BF",X"03",X"89",X"03",X"56",X"03",X"26",X"03",X"FA",X"02", + X"CE",X"02",X"A6",X"02",X"80",X"02",X"5C",X"02",X"3A",X"02",X"1A",X"02",X"FC",X"01",X"DF",X"01", + X"C4",X"01",X"AB",X"01",X"93",X"01",X"7D",X"01",X"67",X"01",X"53",X"01",X"40",X"01",X"2E",X"01", + X"1D",X"01",X"0D",X"01",X"FE",X"00",X"F0",X"00",X"E2",X"00",X"D6",X"00",X"CA",X"00",X"BE",X"00", + X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97",X"00",X"8F",X"00",X"87",X"00",X"7F",X"00",X"78",X"00", + X"71",X"00",X"6B",X"00",X"65",X"00",X"5F",X"00",X"5A",X"00",X"55",X"00",X"50",X"00",X"4B",X"00", + X"47",X"00",X"43",X"00",X"3F",X"00",X"3C",X"00",X"39",X"00",X"D5",X"21",X"00",X"00",X"78",X"A7", + X"28",X"0A",X"CB",X"3F",X"30",X"01",X"19",X"EB",X"29",X"EB",X"18",X"F3",X"D1",X"79",X"CB",X"3A", + X"CB",X"1B",X"A7",X"C8",X"CB",X"27",X"30",X"F6",X"19",X"18",X"F3",X"FD",X"E5",X"FD",X"21",X"00", + X"00",X"11",X"00",X"01",X"78",X"B1",X"28",X"18",X"AF",X"ED",X"42",X"38",X"04",X"FD",X"19",X"18", + X"F7",X"09",X"CB",X"38",X"CB",X"19",X"78",X"B1",X"28",X"06",X"CB",X"3A",X"CB",X"1B",X"30",X"E8", + X"FD",X"E5",X"D1",X"FD",X"E1",X"C9",X"DD",X"CB",X"01",X"EE",X"DD",X"6E",X"00",X"26",X"00",X"29", + X"11",X"92",X"44",X"19",X"CF",X"4E",X"23",X"06",X"00",X"DD",X"E5",X"D1",X"13",X"13",X"13",X"ED", + X"B0",X"C9",X"C2",X"44",X"CC",X"44",X"71",X"45",X"F7",X"44",X"E7",X"44",X"00",X"45",X"61",X"45", + X"09",X"45",X"12",X"45",X"1B",X"45",X"86",X"45",X"2A",X"45",X"45",X"45",X"D2",X"44",X"3A",X"45", + X"51",X"45",X"92",X"45",X"9B",X"45",X"A4",X"45",X"AD",X"45",X"B6",X"45",X"BF",X"45",X"C8",X"45", + X"D1",X"45",X"09",X"00",X"00",X"0F",X"F0",X"60",X"50",X"EE",X"81",X"04",X"05",X"00",X"00",X"0F", + X"F6",X"FE",X"14",X"40",X"00",X"0A",X"48",X"00",X"0A",X"06",X"0E",X"0C",X"20",X"11",X"09",X"00", + X"11",X"0F",X"80",X"01",X"81",X"01",X"08",X"0F",X"AD",X"01",X"0F",X"00",X"01",X"0F",X"00",X"F0", + X"1C",X"1C",X"5E",X"05",X"04",X"03",X"50",X"08",X"60",X"00",X"0F",X"57",X"01",X"0F",X"36",X"F0", + X"08",X"80",X"03",X"0F",X"18",X"08",X"77",X"50",X"01",X"08",X"FF",X"03",X"0F",X"07",X"07",X"00", + X"A0",X"01",X"08",X"00",X"00",X"0F",X"07",X"00",X"A0",X"00",X"01",X"0E",X"00",X"03",X"0F",X"01", + X"03",X"0F",X"F0",X"67",X"00",X"AA",X"00",X"03",X"02",X"04",X"0F",X"A0",X"03",X"0F",X"30",X"03", + X"0F",X"F0",X"00",X"10",X"03",X"40",X"06",X"06",X"FF",X"00",X"0A",X"10",X"00",X"0C",X"01",X"00", + X"0C",X"FF",X"01",X"40",X"02",X"0B",X"00",X"00",X"0C",X"01",X"00",X"0C",X"88",X"02",X"88",X"02", + X"02",X"0F",X"80",X"03",X"0F",X"00",X"00",X"0F",X"00",X"F0",X"06",X"1C",X"1D",X"BB",X"18",X"03", + X"50",X"0F",X"01",X"03",X"00",X"00",X"03",X"00",X"00",X"F0",X"07",X"1C",X"1D",X"0E",X"0E",X"03", + X"50",X"14",X"01",X"00",X"0A",X"00",X"02",X"00",X"00",X"00",X"00",X"03",X"C0",X"00",X"00",X"00", + X"00",X"07",X"C0",X"00",X"00",X"00",X"0B",X"50",X"00",X"0F",X"60",X"00",X"0F",X"F0",X"03",X"03", + X"04",X"02",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"4C",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"73",X"4D",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"BD",X"4D",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"1F",X"4E",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"AB",X"4E",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"71",X"4F",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"B1", + X"4F",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"FB",X"4F",X"DD",X"CB",X"01",X"6E",X"20",X"04", + X"CD",X"76",X"44",X"C9",X"DD",X"7E",X"07",X"DD",X"BE",X"08",X"38",X"0F",X"28",X"0D",X"DD",X"7E", + X"03",X"DD",X"86",X"09",X"30",X"10",X"DD",X"34",X"04",X"18",X"0B",X"DD",X"7E",X"03",X"DD",X"96", + X"0A",X"30",X"03",X"DD",X"35",X"04",X"DD",X"77",X"03",X"DD",X"35",X"07",X"DD",X"7E",X"06",X"DD", + X"96",X"0B",X"DD",X"77",X"06",X"1F",X"1F",X"1F",X"1F",X"DD",X"77",X"05",X"20",X"03",X"CD",X"A9", + X"43",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"04",X"CD",X"76",X"44",X"C9",X"DD",X"7E",X"06",X"DD", + X"BE",X"07",X"38",X"0F",X"28",X"0D",X"DD",X"7E",X"03",X"DD",X"86",X"08",X"30",X"10",X"DD",X"34", + X"04",X"18",X"0B",X"DD",X"7E",X"03",X"DD",X"96",X"09",X"30",X"03",X"DD",X"35",X"04",X"DD",X"77", + X"03",X"DD",X"CB",X"01",X"F6",X"DD",X"7E",X"0A",X"DD",X"77",X"02",X"DD",X"35",X"06",X"C0",X"CD", + X"A9",X"43",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"04",X"CD",X"76",X"44",X"C9",X"DD",X"7E",X"06", + X"DD",X"86",X"03",X"DD",X"77",X"03",X"DD",X"A6",X"07",X"C0",X"CD",X"A9",X"43",X"C9",X"DD",X"CB", + X"01",X"6E",X"20",X"08",X"CD",X"76",X"44",X"DD",X"CB",X"01",X"A6",X"C9",X"DD",X"7E",X"0C",X"A7", + X"20",X"04",X"CD",X"A9",X"43",X"C9",X"DD",X"7E",X"09",X"A7",X"20",X"43",X"DD",X"CB",X"01",X"66", + X"20",X"1D",X"DD",X"CB",X"01",X"E6",X"DD",X"7E",X"12",X"DD",X"77",X"03",X"DD",X"7E",X"13",X"DD", + X"77",X"04",X"DD",X"7E",X"14",X"DD",X"77",X"06",X"DD",X"7E",X"15",X"DD",X"77",X"07",X"C9",X"DD", + X"7E",X"03",X"DD",X"96",X"16",X"30",X"03",X"DD",X"35",X"04",X"DD",X"77",X"03",X"DD",X"7E",X"06", + X"DD",X"96",X"16",X"30",X"03",X"DD",X"35",X"07",X"DD",X"77",X"06",X"DD",X"35",X"0C",X"C9",X"DD", + X"7E",X"0F",X"DD",X"BE",X"0D",X"20",X"08",X"DD",X"36",X"0F",X"00",X"DD",X"35",X"09",X"C9",X"DD", + X"7E",X"0F",X"DD",X"BE",X"0E",X"38",X"20",X"28",X"1E",X"DD",X"7E",X"03",X"DD",X"96",X"0B",X"30", + X"03",X"DD",X"35",X"04",X"DD",X"77",X"03",X"DD",X"7E",X"06",X"DD",X"96",X"11",X"30",X"03",X"DD", + X"35",X"07",X"DD",X"77",X"06",X"18",X"1C",X"DD",X"7E",X"03",X"DD",X"86",X"0A",X"30",X"03",X"DD", + X"34",X"04",X"DD",X"77",X"03",X"DD",X"7E",X"06",X"DD",X"86",X"10",X"30",X"03",X"DD",X"34",X"07", + X"DD",X"77",X"06",X"DD",X"34",X"0F",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"08",X"CD",X"76",X"44", + X"DD",X"CB",X"01",X"A6",X"C9",X"DD",X"CB",X"01",X"66",X"20",X"33",X"DD",X"7E",X"16",X"C6",X"02", + X"DD",X"77",X"16",X"1F",X"1F",X"1F",X"1F",X"DD",X"77",X"0B",X"DD",X"77",X"11",X"DD",X"77",X"14", + X"DD",X"7E",X"15",X"C6",X"03",X"DD",X"77",X"15",X"1F",X"1F",X"1F",X"1F",X"DD",X"77",X"08",X"DD", + X"77",X"0E",X"E6",X"0F",X"FE",X"0F",X"20",X"38",X"DD",X"CB",X"01",X"E6",X"18",X"32",X"DD",X"7E", + X"0B",X"E6",X"0F",X"20",X"04",X"CD",X"A9",X"43",X"C9",X"DD",X"7E",X"16",X"D6",X"07",X"DD",X"77", + X"16",X"1F",X"1F",X"1F",X"1F",X"DD",X"77",X"0B",X"DD",X"77",X"11",X"DD",X"77",X"14",X"DD",X"7E", + X"15",X"D6",X"0A",X"DD",X"77",X"15",X"1F",X"1F",X"1F",X"1F",X"DD",X"77",X"08",X"DD",X"77",X"0E", + X"DD",X"7E",X"03",X"DD",X"CB",X"01",X"5E",X"20",X"0B",X"C6",X"1A",X"DD",X"77",X"03",X"DD",X"CB", + X"01",X"DE",X"18",X"09",X"D6",X"18",X"DD",X"77",X"03",X"DD",X"CB",X"01",X"9E",X"DD",X"7E",X"06", + X"C6",X"04",X"38",X"05",X"DD",X"77",X"06",X"18",X"0A",X"DD",X"7E",X"06",X"D6",X"04",X"38",X"ED", + X"DD",X"77",X"06",X"DD",X"7E",X"09",X"C6",X"01",X"30",X"02",X"3E",X"00",X"DD",X"77",X"09",X"DD", + X"7E",X"0F",X"C6",X"04",X"30",X"03",X"DD",X"34",X"10",X"DD",X"77",X"0F",X"DD",X"CB",X"01",X"F6", + X"DD",X"36",X"02",X"02",X"C9",X"CD",X"A9",X"43",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"04",X"CD", + X"76",X"44",X"C9",X"DD",X"7E",X"05",X"FE",X"00",X"20",X"04",X"CD",X"A9",X"43",X"C9",X"DD",X"7E", + X"0C",X"FE",X"00",X"20",X"08",X"30",X"06",X"DD",X"36",X"0C",X"00",X"18",X"6D",X"DD",X"6E",X"03", + X"DD",X"66",X"04",X"DD",X"5E",X"0A",X"DD",X"56",X"0B",X"19",X"DD",X"75",X"03",X"DD",X"74",X"04", + X"DD",X"6E",X"06",X"DD",X"66",X"07",X"DD",X"5E",X"0A",X"DD",X"56",X"0B",X"19",X"DD",X"75",X"06", + X"DD",X"74",X"07",X"DD",X"6E",X"03",X"DD",X"66",X"04",X"DD",X"4E",X"0A",X"06",X"00",X"CB",X"79", + X"28",X"01",X"05",X"09",X"DD",X"75",X"03",X"DD",X"74",X"04",X"DD",X"5E",X"0D",X"DD",X"56",X"0E", + X"EB",X"AF",X"ED",X"52",X"F2",X"7E",X"48",X"11",X"00",X"00",X"EB",X"AF",X"ED",X"52",X"DD",X"5E", + X"0C",X"16",X"00",X"AF",X"ED",X"52",X"28",X"09",X"FA",X"91",X"48",X"79",X"ED",X"44",X"DD",X"77", + X"0A",X"DD",X"7E",X"0C",X"DD",X"96",X"0F",X"DD",X"77",X"0C",X"DD",X"7E",X"09",X"DD",X"96",X"10", + X"DD",X"77",X"09",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"DD",X"77",X"05",X"DD",X"77", + X"08",X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"05",X"CD",X"76",X"44",X"18",X"29",X"DD",X"7E",X"09", + X"A7",X"20",X"04",X"CD",X"A9",X"43",X"C9",X"DD",X"7E",X"03",X"DD",X"86",X"0A",X"30",X"03",X"DD", + X"34",X"04",X"DD",X"77",X"03",X"DD",X"7E",X"06",X"DD",X"86",X"0B",X"30",X"03",X"DD",X"34",X"07", + X"DD",X"77",X"06",X"DD",X"35",X"09",X"DD",X"CB",X"01",X"F6",X"DD",X"7E",X"0C",X"DD",X"77",X"02", + X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"05",X"CD",X"76",X"44",X"18",X"26",X"DD",X"6E",X"03",X"DD", + X"66",X"04",X"DD",X"5E",X"09",X"DD",X"56",X"0A",X"19",X"DD",X"75",X"03",X"DD",X"74",X"04",X"DD", + X"6E",X"06",X"DD",X"66",X"07",X"DD",X"5E",X"0B",X"DD",X"56",X"0C",X"19",X"DD",X"75",X"06",X"DD", + X"74",X"07",X"DD",X"CB",X"01",X"F6",X"DD",X"7E",X"0D",X"DD",X"77",X"02",X"C9",X"DD",X"CB",X"01", + X"6E",X"20",X"04",X"CD",X"76",X"44",X"C9",X"DD",X"7E",X"0A",X"DD",X"BE",X"0B",X"30",X"20",X"28", + X"1E",X"DD",X"7E",X"03",X"DD",X"86",X"0E",X"30",X"03",X"DD",X"34",X"04",X"DD",X"77",X"03",X"DD", + X"7E",X"06",X"DD",X"86",X"0F",X"30",X"03",X"DD",X"34",X"07",X"DD",X"77",X"06",X"18",X"1C",X"DD", + X"7E",X"03",X"DD",X"96",X"10",X"30",X"03",X"DD",X"35",X"04",X"DD",X"77",X"03",X"DD",X"7E",X"06", + X"DD",X"86",X"11",X"30",X"03",X"DD",X"34",X"07",X"DD",X"77",X"06",X"DD",X"7E",X"09",X"DD",X"96", + X"0C",X"DD",X"77",X"09",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"DD",X"77",X"05",X"DD", + X"77",X"08",X"DD",X"34",X"0A",X"DD",X"7E",X"0A",X"DD",X"BE",X"0D",X"C0",X"CD",X"A9",X"43",X"C9", + X"DD",X"CB",X"01",X"6E",X"20",X"0C",X"DD",X"36",X"0B",X"04",X"DD",X"36",X"0C",X"01",X"CD",X"76", + X"44",X"C9",X"DD",X"7E",X"09",X"A7",X"20",X"0D",X"DD",X"35",X"0C",X"DD",X"7E",X"0C",X"A7",X"20", + X"ED",X"CD",X"A9",X"43",X"C9",X"DD",X"35",X"09",X"DD",X"7E",X"05",X"A7",X"C8",X"DD",X"7E",X"0A", + X"DD",X"96",X"0B",X"DD",X"77",X"0A",X"1F",X"1F",X"1F",X"1F",X"DD",X"77",X"05",X"DD",X"77",X"08", + X"C9",X"DD",X"CB",X"01",X"6E",X"20",X"04",X"CD",X"76",X"44",X"C9",X"DD",X"7E",X"09",X"DD",X"BE", + X"0B",X"30",X"1E",X"DD",X"7E",X"0C",X"DD",X"86",X"03",X"30",X"03",X"DD",X"34",X"04",X"DD",X"77", + X"03",X"DD",X"7E",X"06",X"DD",X"86",X"0D",X"30",X"03",X"DD",X"34",X"07",X"DD",X"77",X"06",X"18", + X"1C",X"DD",X"7E",X"03",X"DD",X"96",X"0E",X"30",X"03",X"DD",X"35",X"04",X"DD",X"77",X"03",X"DD", + X"7E",X"06",X"DD",X"96",X"0F",X"30",X"03",X"DD",X"35",X"07",X"DD",X"77",X"06",X"DD",X"7E",X"0A", + X"DD",X"96",X"10",X"DD",X"77",X"0A",X"1F",X"1F",X"1F",X"1F",X"DD",X"77",X"05",X"DD",X"77",X"08", + X"DD",X"34",X"09",X"DD",X"7E",X"09",X"DD",X"BE",X"11",X"C0",X"CD",X"A9",X"43",X"C9",X"DD",X"CB", + X"01",X"6E",X"20",X"44",X"DD",X"CB",X"01",X"EE",X"DD",X"E5",X"06",X"1A",X"DD",X"36",X"03",X"00", + X"DD",X"23",X"10",X"F8",X"DD",X"E1",X"CD",X"76",X"44",X"DD",X"6E",X"09",X"DD",X"66",X"0A",X"7E", + X"DD",X"77",X"0B",X"23",X"7E",X"DD",X"77",X"0C",X"23",X"DD",X"75",X"09",X"DD",X"74",X"0A",X"DD", + X"7E",X"0C",X"E6",X"0F",X"DD",X"CB",X"01",X"8E",X"DD",X"CB",X"01",X"96",X"DD",X"CB",X"01",X"9E", + X"DD",X"CB",X"01",X"A6",X"DD",X"77",X"14",X"C9",X"DD",X"CB",X"01",X"66",X"28",X"41",X"DD",X"CB", + X"01",X"4E",X"28",X"22",X"DD",X"7E",X"11",X"DD",X"BE",X"13",X"30",X"30",X"DD",X"7E",X"1A",X"DD", + X"96",X"1C",X"30",X"02",X"3E",X"00",X"DD",X"77",X"1A",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB", + X"3F",X"DD",X"77",X"08",X"18",X"16",X"DD",X"7E",X"13",X"DD",X"BE",X"11",X"38",X"0E",X"DD",X"36", + X"08",X"00",X"DD",X"CB",X"01",X"A6",X"DD",X"36",X"11",X"00",X"18",X"03",X"DD",X"35",X"11",X"DD", + X"7E",X"10",X"FE",X"00",X"28",X"38",X"DD",X"CB",X"01",X"56",X"28",X"22",X"DD",X"7E",X"10",X"DD", + X"BE",X"12",X"30",X"26",X"DD",X"7E",X"19",X"DD",X"96",X"1B",X"30",X"02",X"3E",X"00",X"DD",X"77", + X"19",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"DD",X"77",X"05",X"18",X"0C",X"DD",X"7E", + X"12",X"DD",X"BE",X"10",X"38",X"04",X"DD",X"36",X"05",X"00",X"DD",X"35",X"10",X"C9",X"DD",X"6E", + X"09",X"DD",X"66",X"0A",X"7E",X"DD",X"77",X"0B",X"23",X"7E",X"DD",X"77",X"0C",X"23",X"DD",X"75", + X"09",X"DD",X"74",X"0A",X"DD",X"CB",X"0C",X"7E",X"28",X"3D",X"DD",X"7E",X"0C",X"E6",X"F0",X"FE", + X"F0",X"20",X"04",X"CD",X"A9",X"43",X"C9",X"FE",X"90",X"20",X"13",X"DD",X"7E",X"0B",X"DD",X"77", + X"0D",X"DD",X"6E",X"09",X"DD",X"66",X"0A",X"DD",X"75",X"0E",X"DD",X"74",X"0F",X"C9",X"FE",X"A0", + X"C0",X"DD",X"7E",X"0D",X"FE",X"00",X"C8",X"DD",X"7E",X"0E",X"DD",X"77",X"09",X"DD",X"7E",X"0F", + X"DD",X"77",X"0A",X"DD",X"35",X"0D",X"C9",X"DD",X"CB",X"0C",X"76",X"28",X"08",X"DD",X"CB",X"01", + X"DE",X"DD",X"CB",X"01",X"E6",X"DD",X"7E",X"0C",X"E6",X"3F",X"CB",X"27",X"E6",X"FF",X"28",X"18", + X"4F",X"06",X"00",X"21",X"C2",X"43",X"09",X"7E",X"DD",X"77",X"03",X"23",X"7E",X"DD",X"77",X"04", + X"DD",X"7E",X"14",X"DD",X"77",X"05",X"18",X"04",X"DD",X"36",X"05",X"00",X"DD",X"7E",X"0B",X"E6", + X"0F",X"21",X"D4",X"4C",X"4F",X"06",X"00",X"09",X"7E",X"DD",X"77",X"15",X"DD",X"7E",X"00",X"21", + X"06",X"6C",X"4F",X"06",X"00",X"09",X"7E",X"E6",X"F0",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"21", + X"DF",X"4C",X"4F",X"06",X"00",X"09",X"4E",X"DD",X"71",X"17",X"23",X"46",X"DD",X"70",X"18",X"DD", + X"5E",X"15",X"16",X"00",X"CD",X"2A",X"44",X"DD",X"75",X"10",X"CB",X"3D",X"DD",X"75",X"12",X"DD", + X"7E",X"0B",X"E6",X"40",X"20",X"06",X"DD",X"CB",X"01",X"D6",X"18",X"06",X"DD",X"CB",X"01",X"96", + X"18",X"2E",X"DD",X"7E",X"05",X"6F",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"DD",X"77", + X"19",X"26",X"00",X"DD",X"4E",X"12",X"06",X"00",X"CD",X"4B",X"44",X"CB",X"22",X"CB",X"22",X"CB", + X"22",X"CB",X"22",X"CB",X"3B",X"CB",X"3B",X"CB",X"3B",X"CB",X"3B",X"7A",X"83",X"DD",X"77",X"1B", + X"DD",X"CB",X"01",X"5E",X"C8",X"DD",X"6E",X"09",X"DD",X"66",X"0A",X"7E",X"DD",X"77",X"0B",X"23", + X"7E",X"DD",X"77",X"0C",X"23",X"DD",X"75",X"09",X"DD",X"74",X"0A",X"DD",X"7E",X"0C",X"E6",X"3F", + X"CB",X"27",X"4F",X"06",X"00",X"21",X"C2",X"43",X"09",X"7E",X"DD",X"77",X"06",X"23",X"7E",X"DD", + X"77",X"07",X"DD",X"7E",X"14",X"DD",X"77",X"08",X"DD",X"7E",X"0B",X"E6",X"0F",X"21",X"D4",X"4C", + X"4F",X"06",X"00",X"09",X"7E",X"DD",X"77",X"16",X"DD",X"4E",X"17",X"DD",X"46",X"18",X"DD",X"5E", + X"16",X"16",X"00",X"CD",X"2A",X"44",X"DD",X"75",X"11",X"CB",X"3D",X"DD",X"75",X"13",X"DD",X"7E", + X"0B",X"E6",X"40",X"20",X"06",X"DD",X"CB",X"01",X"CE",X"18",X"06",X"DD",X"CB",X"01",X"8E",X"18", + X"2E",X"DD",X"7E",X"08",X"6F",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"DD",X"77",X"1A", + X"26",X"00",X"DD",X"4E",X"13",X"06",X"00",X"CD",X"4B",X"44",X"CB",X"22",X"CB",X"22",X"CB",X"22", + X"CB",X"22",X"CB",X"3B",X"CB",X"3B",X"CB",X"3B",X"CB",X"3B",X"7A",X"83",X"DD",X"77",X"1C",X"DD", + X"CB",X"01",X"9E",X"C9",X"04",X"06",X"08",X"0C",X"10",X"18",X"20",X"30",X"40",X"60",X"80",X"80", + X"01",X"70",X"01",X"60",X"01",X"50",X"01",X"40",X"01",X"30",X"01",X"20",X"01",X"10",X"01",X"00", + X"01",X"F0",X"00",X"E0",X"00",X"D0",X"00",X"C0",X"00",X"B0",X"00",X"A0",X"00",X"90",X"00",X"00", + X"8C",X"FF",X"90",X"02",X"63",X"05",X"14",X"02",X"23",X"02",X"23",X"04",X"61",X"04",X"12",X"02", + X"60",X"02",X"10",X"05",X"54",X"07",X"23",X"02",X"10",X"02",X"12",X"02",X"14",X"02",X"65",X"05", + X"15",X"02",X"21",X"02",X"25",X"04",X"68",X"02",X"17",X"02",X"65",X"02",X"15",X"04",X"54",X"07", + X"23",X"02",X"14",X"02",X"10",X"02",X"12",X"02",X"14",X"02",X"65",X"05",X"15",X"02",X"21",X"02", + X"25",X"02",X"68",X"04",X"17",X"02",X"27",X"02",X"65",X"02",X"15",X"02",X"63",X"05",X"14",X"02", + X"25",X"02",X"23",X"02",X"60",X"05",X"10",X"02",X"1C",X"02",X"20",X"02",X"63",X"05",X"12",X"02", + X"23",X"02",X"23",X"04",X"65",X"04",X"10",X"02",X"67",X"02",X"0F",X"07",X"68",X"07",X"10",X"01", + X"00",X"00",X"A0",X"00",X"8A",X"FF",X"90",X"05",X"63",X"05",X"20",X"05",X"60",X"05",X"1C",X"05", + X"63",X"05",X"20",X"05",X"60",X"05",X"1C",X"05",X"65",X"05",X"21",X"05",X"60",X"05",X"1C",X"05", + X"65",X"05",X"21",X"05",X"60",X"05",X"1C",X"05",X"67",X"05",X"23",X"05",X"60",X"05",X"1C",X"05", + X"67",X"05",X"23",X"05",X"60",X"05",X"1C",X"03",X"65",X"03",X"21",X"03",X"60",X"03",X"1C",X"05", + X"63",X"05",X"20",X"05",X"60",X"05",X"1C",X"05",X"60",X"05",X"1C",X"00",X"A0",X"00",X"8C",X"FF", + X"90",X"04",X"63",X"06",X"14",X"02",X"23",X"02",X"25",X"04",X"63",X"06",X"14",X"04",X"21",X"04", + X"60",X"04",X"10",X"04",X"61",X"04",X"12",X"06",X"63",X"06",X"14",X"04",X"5E",X"04",X"0F",X"04", + X"60",X"04",X"10",X"06",X"61",X"06",X"12",X"04",X"60",X"04",X"10",X"04",X"61",X"04",X"12",X"06", + X"63",X"06",X"14",X"04",X"63",X"06",X"14",X"02",X"23",X"02",X"25",X"04",X"63",X"06",X"14",X"04", + X"21",X"04",X"60",X"04",X"10",X"04",X"61",X"04",X"12",X"06",X"63",X"06",X"14",X"06",X"5E",X"06", + X"0F",X"06",X"63",X"06",X"0F",X"04",X"60",X"04",X"10",X"07",X"5C",X"07",X"10",X"00",X"A0",X"00", + X"8C",X"FF",X"90",X"04",X"60",X"06",X"14",X"02",X"1C",X"02",X"17",X"04",X"60",X"06",X"14",X"02", + X"1C",X"02",X"17",X"04",X"61",X"06",X"15",X"02",X"1E",X"02",X"17",X"04",X"63",X"06",X"17",X"02", + X"20",X"02",X"17",X"04",X"63",X"06",X"17",X"02",X"20",X"02",X"17",X"04",X"61",X"06",X"15",X"02", + X"1E",X"02",X"17",X"04",X"60",X"06",X"14",X"02",X"1C",X"02",X"17",X"04",X"5E",X"06",X"12",X"02", + X"1B",X"02",X"17",X"04",X"5C",X"06",X"10",X"02",X"17",X"02",X"14",X"04",X"5C",X"06",X"10",X"02", + X"17",X"02",X"14",X"04",X"5E",X"06",X"12",X"02",X"1B",X"02",X"17",X"04",X"60",X"06",X"14",X"02", + X"1C",X"02",X"17",X"04",X"60",X"06",X"14",X"02",X"1C",X"02",X"17",X"04",X"60",X"05",X"14",X"02", + X"1C",X"02",X"5E",X"02",X"12",X"04",X"5E",X"06",X"12",X"02",X"1B",X"02",X"17",X"04",X"5E",X"04", + X"0B",X"02",X"5B",X"02",X"17",X"02",X"57",X"02",X"12",X"00",X"A0",X"00",X"89",X"FF",X"90",X"03", + X"5C",X"05",X"04",X"03",X"1E",X"03",X"60",X"03",X"04",X"05",X"60",X"05",X"08",X"03",X"5E",X"03", + X"08",X"03",X"5C",X"05",X"0B",X"03",X"00",X"03",X"5C",X"05",X"04",X"03",X"1E",X"03",X"5E",X"03", + X"04",X"03",X"60",X"05",X"08",X"03",X"00",X"03",X"60",X"03",X"08",X"03",X"5E",X"05",X"0B",X"03", + X"1C",X"03",X"59",X"05",X"01",X"03",X"1B",X"03",X"5C",X"03",X"01",X"05",X"5C",X"05",X"04",X"03", + X"5B",X"03",X"04",X"03",X"59",X"05",X"08",X"03",X"00",X"03",X"59",X"05",X"01",X"03",X"1B",X"03", + X"5B",X"03",X"01",X"03",X"5C",X"05",X"04",X"03",X"00",X"03",X"5C",X"03",X"04",X"03",X"5E",X"05", + X"08",X"03",X"1C",X"03",X"5E",X"05",X"06",X"03",X"20",X"03",X"61",X"03",X"06",X"05",X"61",X"05", + X"09",X"03",X"60",X"03",X"09",X"03",X"5E",X"05",X"0D",X"03",X"00",X"03",X"5E",X"05",X"06",X"03", + X"20",X"03",X"60",X"03",X"06",X"03",X"61",X"05",X"09",X"03",X"00",X"03",X"61",X"03",X"09",X"03", + X"60",X"05",X"0D",X"03",X"21",X"03",X"63",X"04",X"0B",X"03",X"00",X"03",X"63",X"04",X"0B",X"03", + X"00",X"03",X"63",X"04",X"0B",X"05",X"00",X"05",X"63",X"06",X"0B",X"03",X"23",X"03",X"61",X"05", + X"09",X"03",X"21",X"03",X"60",X"05",X"08",X"03",X"20",X"03",X"5E",X"05",X"06",X"03",X"1E",X"00", + X"A0",X"00",X"8C",X"05",X"50",X"05",X"14",X"02",X"50",X"02",X"14",X"04",X"50",X"04",X"14",X"04", + X"5C",X"04",X"20",X"04",X"5B",X"04",X"1E",X"04",X"59",X"04",X"1C",X"04",X"57",X"04",X"1B",X"04", + X"55",X"04",X"19",X"05",X"54",X"05",X"17",X"02",X"55",X"02",X"19",X"04",X"54",X"04",X"17",X"04", + X"52",X"04",X"15",X"04",X"50",X"04",X"14",X"04",X"52",X"04",X"15",X"05",X"54",X"05",X"17",X"FF", + X"FF",X"00",X"8C",X"04",X"5C",X"04",X"0B",X"02",X"68",X"02",X"14",X"02",X"67",X"02",X"10",X"04", + X"65",X"04",X"10",X"04",X"63",X"04",X"0F",X"04",X"61",X"04",X"0D",X"04",X"60",X"04",X"0B",X"04", + X"5E",X"04",X"09",X"04",X"00",X"04",X"5C",X"04",X"08",X"02",X"57",X"02",X"01",X"02",X"59",X"02", + X"03",X"02",X"5B",X"02",X"04",X"02",X"5C",X"02",X"06",X"02",X"5E",X"02",X"08",X"02",X"60",X"02", + X"08",X"04",X"1C",X"04",X"00",X"06",X"5C",X"06",X"04",X"FF",X"FF",X"00",X"8C",X"02",X"5C",X"02", + X"17",X"02",X"63",X"02",X"10",X"02",X"60",X"02",X"17",X"02",X"5C",X"02",X"10",X"02",X"5E",X"04", + X"12",X"02",X"1B",X"04",X"57",X"04",X"0F",X"02",X"5E",X"04",X"17",X"02",X"21",X"02",X"65",X"04", + X"14",X"02",X"23",X"02",X"61",X"04",X"12",X"02",X"1B",X"04",X"60",X"04",X"10",X"04",X"60",X"04", + X"10",X"04",X"63",X"04",X"14",X"04",X"68",X"04",X"17",X"FF",X"FF",X"C7",X"C7",X"C7",X"C7",X"C7", + X"4C",X"50",X"86",X"50",X"F2",X"50",X"48",X"51",X"0E",X"52",X"8E",X"52",X"04",X"01",X"00",X"07", + X"01",X"01",X"00",X"00",X"02",X"05",X"00",X"02",X"1F",X"11",X"3B",X"21",X"01",X"02",X"00",X"03", + X"0A",X"12",X"27",X"21",X"3F",X"11",X"A6",X"13",X"00",X"00",X"A8",X"14",X"00",X"01",X"03",X"51", + X"A6",X"13",X"00",X"01",X"1F",X"40",X"A8",X"14",X"00",X"00",X"0F",X"15",X"00",X"04",X"10",X"12", + X"2B",X"11",X"3C",X"60",X"58",X"60",X"05",X"03",X"00",X"0C",X"01",X"04",X"00",X"01",X"3D",X"30", + X"03",X"09",X"00",X"02",X"3A",X"12",X"3D",X"31",X"03",X"0C",X"00",X"03",X"19",X"23",X"2B",X"30", + X"3F",X"12",X"02",X"08",X"00",X"03",X"23",X"13",X"2B",X"21",X"2C",X"35",X"01",X"03",X"00",X"02", + X"2B",X"22",X"38",X"21",X"A6",X"13",X"00",X"01",X"01",X"34",X"A6",X"13",X"00",X"00",X"85",X"09", + X"12",X"02",X"1C",X"50",X"3C",X"41",X"85",X"0C",X"12",X"01",X"23",X"50",X"85",X"09",X"12",X"03", + X"02",X"21",X"1B",X"52",X"3E",X"41",X"A8",X"14",X"00",X"01",X"10",X"20",X"A8",X"14",X"00",X"02", + X"00",X"51",X"1C",X"40",X"0F",X"15",X"00",X"05",X"10",X"12",X"2B",X"11",X"3C",X"60",X"40",X"12", + X"5A",X"60",X"06",X"03",X"00",X"05",X"04",X"0D",X"00",X"03",X"23",X"75",X"24",X"12",X"3C",X"13", + X"04",X"0F",X"00",X"06",X"10",X"13",X"16",X"74",X"22",X"70",X"24",X"12",X"2E",X"71",X"38",X"13", + X"04",X"0F",X"00",X"05",X"00",X"21",X"16",X"75",X"22",X"71",X"24",X"50",X"2E",X"74",X"85",X"0E", + X"11",X"04",X"18",X"22",X"1A",X"70",X"26",X"71",X"34",X"21",X"04",X"0F",X"00",X"05",X"16",X"70", + X"1F",X"13",X"22",X"74",X"2E",X"75",X"3C",X"13",X"0F",X"15",X"00",X"06",X"02",X"23",X"14",X"12", + X"2C",X"12",X"3E",X"60",X"42",X"11",X"5C",X"60",X"01",X"03",X"00",X"12",X"03",X"0A",X"00",X"01", + X"3E",X"41",X"03",X"0C",X"00",X"04",X"0A",X"13",X"1A",X"40",X"29",X"12",X"38",X"41",X"03",X"0A", + X"00",X"04",X"0B",X"11",X"1E",X"40",X"28",X"13",X"38",X"40",X"03",X"0B",X"00",X"04",X"08",X"12", + X"1C",X"41",X"29",X"13",X"3A",X"40",X"02",X"06",X"00",X"06",X"08",X"13",X"1C",X"23",X"22",X"21", + X"2E",X"21",X"39",X"12",X"3F",X"23",X"03",X"0A",X"00",X"05",X"0E",X"23",X"1C",X"21",X"26",X"23", + X"30",X"13",X"3D",X"21",X"02",X"05",X"00",X"03",X"0E",X"21",X"1F",X"23",X"30",X"23",X"A6",X"13", + X"00",X"02",X"04",X"41",X"1E",X"51",X"A6",X"13",X"00",X"00",X"A8",X"14",X"00",X"02",X"04",X"50", + X"1F",X"41",X"A8",X"14",X"00",X"01",X"10",X"52",X"03",X"0C",X"00",X"04",X"08",X"12",X"14",X"52", + X"28",X"41",X"3F",X"50",X"A6",X"13",X"00",X"01",X"18",X"52",X"A6",X"13",X"00",X"01",X"18",X"52", + X"04",X"0E",X"00",X"03",X"1A",X"74",X"26",X"71",X"3F",X"21",X"85",X"0E",X"10",X"03",X"1A",X"71", + X"26",X"74",X"3C",X"31",X"04",X"0F",X"00",X"06",X"16",X"74",X"20",X"12",X"22",X"75",X"2E",X"70", + X"3C",X"12",X"3F",X"31",X"04",X"0D",X"00",X"03",X"20",X"12",X"22",X"70",X"3F",X"13",X"0F",X"15", + X"00",X"06",X"00",X"31",X"14",X"12",X"28",X"12",X"34",X"12",X"3C",X"60",X"58",X"60",X"00",X"03", + X"00",X"0C",X"A6",X"13",X"00",X"01",X"1B",X"52",X"85",X"0C",X"11",X"02",X"1F",X"50",X"34",X"52", + X"85",X"0B",X"12",X"04",X"00",X"21",X"20",X"51",X"2C",X"52",X"3C",X"52",X"85",X"0C",X"12",X"03", + X"10",X"22",X"1C",X"51",X"3E",X"51",X"85",X"0A",X"11",X"03",X"0A",X"21",X"18",X"50",X"34",X"50", + X"A8",X"14",X"00",X"02",X"06",X"50",X"12",X"52",X"85",X"06",X"10",X"03",X"1A",X"21",X"34",X"41", + X"3A",X"40",X"85",X"0C",X"11",X"03",X"12",X"40",X"1A",X"41",X"3A",X"23",X"85",X"0C",X"10",X"03", + X"16",X"40",X"1E",X"41",X"3E",X"20",X"85",X"07",X"12",X"03",X"06",X"20",X"1C",X"40",X"32",X"41", + X"A8",X"14",X"00",X"03",X"06",X"21",X"12",X"41",X"18",X"40",X"A8",X"14",X"00",X"00",X"0F",X"15", + X"00",X"06",X"0E",X"12",X"20",X"11",X"2A",X"12",X"3C",X"60",X"48",X"11",X"58",X"60",X"02",X"03", + X"00",X"15",X"A6",X"13",X"00",X"00",X"04",X"0E",X"00",X"06",X"0E",X"31",X"1A",X"71",X"1E",X"12", + X"26",X"70",X"32",X"13",X"36",X"31",X"85",X"0F",X"12",X"06",X"12",X"23",X"16",X"74",X"22",X"71", + X"23",X"34",X"2E",X"70",X"3E",X"30",X"85",X"0F",X"11",X"05",X"16",X"70",X"17",X"21",X"22",X"71", + X"2A",X"30",X"2E",X"74",X"04",X"0E",X"00",X"06",X"0E",X"31",X"1A",X"70",X"1E",X"13",X"26",X"71", + X"36",X"22",X"3C",X"12",X"A6",X"13",X"00",X"02",X"06",X"41",X"1A",X"21",X"A6",X"13",X"00",X"02", + X"0A",X"41",X"0B",X"34",X"A6",X"13",X"00",X"01",X"06",X"40",X"A6",X"13",X"00",X"02",X"02",X"31", + X"08",X"41",X"85",X"0B",X"11",X"05",X"0C",X"22",X"0E",X"31",X"1E",X"40",X"26",X"41",X"3E",X"35", + X"A6",X"13",X"00",X"03",X"06",X"41",X"0E",X"34",X"1F",X"22",X"A6",X"13",X"00",X"03",X"02",X"41", + X"0A",X"40",X"14",X"35",X"A6",X"13",X"00",X"02",X"06",X"41",X"1C",X"35",X"A6",X"13",X"00",X"01", + X"06",X"40",X"A8",X"14",X"00",X"02",X"12",X"21",X"18",X"31",X"85",X"0C",X"12",X"04",X"0C",X"21", + X"20",X"22",X"2E",X"21",X"3C",X"21",X"A6",X"13",X"00",X"01",X"0A",X"41",X"A6",X"13",X"00",X"02", + X"08",X"41",X"12",X"31",X"85",X"08",X"12",X"03",X"0C",X"20",X"28",X"22",X"32",X"31",X"85",X"0A", + X"12",X"01",X"2E",X"31",X"03",X"16",X"00",X"02",X"22",X"12",X"36",X"12",X"0F",X"15",X"00",X"05", + X"0A",X"12",X"26",X"12",X"3A",X"12",X"3C",X"60",X"58",X"60",X"98",X"53",X"A1",X"53",X"A6",X"53", + X"AC",X"53",X"B1",X"53",X"B7",X"53",X"BC",X"53",X"C1",X"53",X"C6",X"53",X"CB",X"53",X"D0",X"53", + X"D5",X"53",X"DC",X"53",X"E4",X"53",X"ED",X"53",X"F7",X"53",X"02",X"54",X"0D",X"54",X"19",X"54", + X"24",X"54",X"32",X"54",X"40",X"54",X"66",X"54",X"08",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"04",X"03",X"03",X"03",X"03",X"05",X"03",X"02",X"03",X"03",X"02",X"04",X"04",X"03",X"04", + X"03",X"05",X"02",X"04",X"03",X"04",X"02",X"04",X"04",X"03",X"05",X"03",X"04",X"04",X"05",X"04", + X"05",X"04",X"05",X"03",X"06",X"04",X"04",X"06",X"05",X"06",X"05",X"04",X"05",X"03",X"07",X"04", + X"04",X"05",X"07",X"05",X"06",X"06",X"05",X"01",X"02",X"07",X"01",X"06",X"07",X"02",X"02",X"07", + X"01",X"02",X"07",X"01",X"08",X"03",X"0F",X"10",X"12",X"10",X"11",X"01",X"02",X"09",X"02",X"0F", + X"10",X"12",X"10",X"12",X"10",X"11",X"02",X"0A",X"01",X"0F",X"10",X"12",X"10",X"12",X"10",X"12", + X"10",X"11",X"0A",X"0E",X"0C",X"0B",X"0B",X"0D",X"0E",X"0D",X"0C",X"0B",X"0C",X"0B",X"0E",X"0B", + X"0D",X"0C",X"0E",X"0C",X"0B",X"0D",X"0E",X"0B",X"0E",X"0A",X"0E",X"0C",X"0A",X"0C",X"0C",X"0E", + X"0D",X"0B",X"0A",X"0D",X"FF",X"09",X"13",X"09",X"02",X"09",X"03",X"06",X"00",X"00",X"00",X"00", + X"0A",X"0C",X"FF",X"0D",X"17",X"09",X"02",X"03",X"09",X"06",X"0C",X"0A",X"00",X"00",X"00",X"00", + X"25",X"02",X"0F",X"14",X"15",X"16",X"13",X"13",X"13",X"13",X"13",X"13",X"13",X"13",X"13",X"13", + X"13",X"13",X"13",X"13",X"13",X"13",X"13",X"13",X"13",X"13",X"13",X"13",X"13",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"0B",X"0F",X"14",X"15",X"16",X"16",X"16",X"16",X"14",X"15", + X"14",X"0F",X"A0",X"54",X"A9",X"54",X"B2",X"54",X"BF",X"54",X"D4",X"54",X"E9",X"54",X"FE",X"54", + X"13",X"55",X"28",X"55",X"39",X"55",X"4E",X"55",X"5B",X"55",X"68",X"55",X"75",X"55",X"7E",X"55", + X"87",X"55",X"94",X"55",X"A1",X"55",X"AE",X"55",X"B7",X"55",X"C0",X"55",X"CD",X"55",X"DA",X"55", + X"A0",X"00",X"E1",X"55",X"04",X"00",X"00",X"00",X"00",X"A4",X"00",X"F1",X"55",X"04",X"01",X"01", + X"01",X"01",X"A8",X"00",X"01",X"56",X"08",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"B0", + X"00",X"21",X"56",X"10",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"C0",X"00",X"61",X"56",X"10",X"01",X"01",X"01",X"02",X"11",X"11",X"11", + X"11",X"11",X"11",X"11",X"11",X"02",X"01",X"01",X"01",X"D2",X"00",X"A1",X"56",X"10",X"01",X"01", + X"01",X"02",X"11",X"12",X"21",X"21",X"21",X"21",X"12",X"11",X"02",X"01",X"01",X"01",X"E6",X"00", + X"E1",X"56",X"10",X"01",X"01",X"02",X"12",X"21",X"22",X"31",X"31",X"31",X"31",X"22",X"21",X"12", + X"02",X"01",X"01",X"00",X"01",X"21",X"57",X"10",X"01",X"01",X"02",X"12",X"22",X"32",X"41",X"41", + X"32",X"32",X"32",X"31",X"22",X"12",X"02",X"01",X"1A",X"01",X"61",X"57",X"0C",X"01",X"01",X"01", + X"02",X"11",X"12",X"22",X"32",X"42",X"52",X"62",X"71",X"40",X"01",X"C1",X"57",X"10",X"01",X"02", + X"12",X"22",X"33",X"52",X"62",X"72",X"72",X"62",X"52",X"33",X"22",X"12",X"02",X"01",X"60",X"01", + X"01",X"58",X"08",X"10",X"50",X"54",X"18",X"18",X"54",X"50",X"10",X"78",X"01",X"21",X"58",X"08", + X"10",X"30",X"22",X"22",X"12",X"22",X"21",X"20",X"87",X"01",X"41",X"58",X"08",X"10",X"20",X"21", + X"12",X"12",X"21",X"20",X"10",X"93",X"01",X"61",X"58",X"04",X"40",X"33",X"33",X"40",X"A1",X"01", + X"71",X"58",X"04",X"20",X"31",X"31",X"20",X"AB",X"01",X"81",X"58",X"08",X"01",X"01",X"02",X"11", + X"12",X"21",X"22",X"31",X"B6",X"01",X"A1",X"58",X"08",X"04",X"04",X"04",X"04",X"04",X"04",X"04", + X"04",X"D6",X"01",X"C1",X"58",X"08",X"31",X"22",X"21",X"12",X"11",X"02",X"01",X"01",X"A0",X"00", + X"E1",X"58",X"04",X"00",X"00",X"00",X"00",X"20",X"01",X"F1",X"58",X"04",X"02",X"02",X"02",X"02", + X"AB",X"01",X"01",X"59",X"08",X"41",X"41",X"42",X"51",X"52",X"61",X"62",X"71",X"AB",X"01",X"21", + X"59",X"08",X"81",X"81",X"82",X"91",X"92",X"A1",X"A2",X"B1",X"A4",X"00",X"41",X"59",X"02",X"C1", + X"C1",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"02",X"02",X"03",X"03",X"04",X"04",X"05",X"05",X"06",X"06",X"07", + X"07",X"07",X"07",X"06",X"06",X"05",X"05",X"04",X"04",X"03",X"03",X"02",X"02",X"01",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"02",X"02",X"02",X"02",X"03",X"03", + X"03",X"03",X"04",X"04",X"04",X"04",X"05",X"05",X"05",X"05",X"06",X"06",X"06",X"06",X"07",X"07", + X"07",X"07",X"07",X"07",X"06",X"06",X"06",X"06",X"05",X"05",X"05",X"05",X"04",X"04",X"04",X"04", + X"03",X"03",X"03",X"03",X"02",X"02",X"02",X"02",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"02",X"02",X"03",X"03",X"04",X"04",X"05",X"06",X"07", + X"08",X"09",X"09",X"0A",X"0B",X"0B",X"0C",X"0C",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0E",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0E",X"0E",X"0E",X"0D",X"0D",X"0D",X"0C",X"0C",X"0B",X"0B",X"0A",X"0A", + X"09",X"08",X"08",X"07",X"06",X"05",X"04",X"03",X"03",X"02",X"02",X"01",X"01",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"02",X"03",X"03",X"04",X"05",X"06",X"07",X"08",X"09", + X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"12",X"13",X"14",X"15",X"15",X"16",X"16",X"16", + X"17",X"17",X"17",X"16",X"16",X"15",X"15",X"14",X"13",X"12",X"11",X"10",X"0F",X"0E",X"0D",X"0C", + X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"03",X"02",X"01",X"01",X"01",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"09",X"0A",X"0C",X"0D",X"0F", + X"10",X"12",X"13",X"14",X"16",X"17",X"18",X"19",X"1A",X"1B",X"1C",X"1D",X"1D",X"1E",X"1E",X"1F", + X"1F",X"1F",X"1F",X"1F",X"1E",X"1E",X"1D",X"1C",X"1B",X"1A",X"19",X"18",X"17",X"16",X"14",X"13", + X"12",X"10",X"0F",X"0D",X"0C",X"0A",X"09",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"01",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"05",X"06",X"08",X"0A",X"0C",X"0E",X"10",X"12", + X"14",X"16",X"18",X"1A",X"1C",X"1E",X"20",X"22",X"24",X"26",X"27",X"27",X"26",X"24",X"23",X"22", + X"21",X"1F",X"1E",X"1C",X"1B",X"1B",X"1B",X"1C",X"1E",X"20",X"22",X"21",X"20",X"1F",X"1E",X"1C", + X"1A",X"18",X"16",X"14",X"12",X"10",X"0E",X"0C",X"0A",X"08",X"06",X"04",X"02",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"02",X"02",X"02",X"03",X"04",X"05",X"06",X"07",X"08", + X"09",X"0A",X"0C",X"0D",X"0E",X"0F",X"11",X"12",X"13",X"15",X"17",X"18",X"19",X"1B",X"1C",X"1E", + X"1F",X"21",X"23",X"25",X"27",X"29",X"2B",X"2E",X"31",X"32",X"35",X"38",X"3C",X"40",X"40",X"40", + X"40",X"3F",X"3F",X"3F",X"3F",X"3E",X"3A",X"37",X"34",X"31",X"2F",X"2C",X"2A",X"28",X"26",X"24", + X"22",X"20",X"1F",X"1D",X"1C",X"1A",X"19",X"17",X"16",X"14",X"13",X"11",X"10",X"0F",X"0D",X"0C", + X"0B",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"03",X"02",X"02",X"02",X"01",X"01",X"01",X"00", + X"00",X"00",X"00",X"01",X"02",X"03",X"05",X"06",X"08",X"0A",X"0C",X"0E",X"10",X"14",X"16",X"19", + X"1C",X"1E",X"21",X"24",X"27",X"2A",X"2D",X"30",X"32",X"35",X"38",X"3B",X"3E",X"40",X"42",X"43", + X"43",X"43",X"43",X"43",X"41",X"3F",X"3C",X"39",X"36",X"34",X"31",X"2E",X"2B",X"28",X"25",X"23", + X"20",X"1D",X"1A",X"18",X"15",X"12",X"0F",X"0D",X"0B",X"09",X"07",X"05",X"03",X"02",X"01",X"01", + X"00",X"01",X"01",X"02",X"04",X"08",X"10",X"1A",X"22",X"2B",X"33",X"3A",X"40",X"43",X"45",X"46", + X"48",X"48",X"47",X"46",X"44",X"41",X"3B",X"33",X"2B",X"24",X"1D",X"15",X"0C",X"06",X"03",X"02", + X"01",X"01",X"02",X"04",X"07",X"0A",X"0E",X"11",X"14",X"17",X"1A",X"1E",X"20",X"20",X"1D",X"1A", + X"17",X"14",X"12",X"12",X"15",X"17",X"19",X"1A",X"19",X"17",X"13",X"10",X"0C",X"09",X"05",X"02", + X"01",X"01",X"01",X"03",X"05",X"07",X"09",X"0B",X"0D",X"0F",X"11",X"13",X"13",X"12",X"11",X"12", + X"13",X"15",X"17",X"18",X"18",X"16",X"14",X"12",X"0F",X"0D",X"0B",X"09",X"06",X"04",X"03",X"02", + X"01",X"01",X"04",X"0B",X"17",X"22",X"2A",X"2E",X"30",X"30",X"2F",X"2C",X"26",X"1E",X"11",X"07", + X"02",X"01",X"02",X"04",X"08",X"11",X"1A",X"1E",X"20",X"20",X"1F",X"1C",X"16",X"0D",X"05",X"02", + X"01",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E", + X"0F",X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17",X"18",X"19",X"1A",X"1B",X"1C",X"1D",X"1E", + X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"1F",X"1F",X"1E",X"1D",X"1C",X"1B",X"1A",X"19",X"18",X"17",X"16",X"15",X"14",X"13",X"12",X"11", + X"10",X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01", + X"00",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"1F",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FC",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E", + X"2F",X"30",X"31",X"32",X"33",X"34",X"35",X"36",X"37",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E", + X"3F",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E", + X"4F",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E", + X"5F",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"0E",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", + X"F5",X"C5",X"D5",X"E5",X"4F",X"E6",X"F0",X"FE",X"50",X"30",X"13",X"0F",X"0F",X"0F",X"5F",X"16", + X"00",X"21",X"73",X"59",X"19",X"5E",X"23",X"56",X"EB",X"11",X"6E",X"59",X"D5",X"E9",X"E1",X"D1", + X"C1",X"F1",X"C9",X"7D",X"59",X"8B",X"59",X"D6",X"59",X"E9",X"59",X"4D",X"5A",X"21",X"00",X"6F", + X"36",X"00",X"11",X"01",X"6F",X"01",X"7D",X"00",X"ED",X"B0",X"C9",X"21",X"0C",X"6F",X"11",X"E4", + X"5A",X"CD",X"B7",X"5A",X"3A",X"06",X"6F",X"FE",X"38",X"30",X"24",X"E6",X"FC",X"0F",X"5F",X"16", + X"00",X"21",X"85",X"5A",X"19",X"CD",X"58",X"5A",X"21",X"07",X"6F",X"7E",X"2B",X"FE",X"02",X"28", + X"0B",X"47",X"7E",X"E6",X"03",X"20",X"03",X"78",X"A7",X"C0",X"34",X"C9",X"36",X"00",X"C9",X"CD", + X"93",X"5B",X"3A",X"06",X"6F",X"FE",X"38",X"20",X"05",X"CD",X"AF",X"5A",X"20",X"F4",X"CD",X"59", + X"5D",X"AF",X"32",X"06",X"6F",X"C9",X"11",X"E4",X"5A",X"CB",X"41",X"20",X"05",X"21",X"58",X"6F", + X"18",X"03",X"21",X"5D",X"6F",X"CD",X"B7",X"5A",X"C9",X"CB",X"41",X"28",X"2E",X"21",X"0C",X"6F", + X"11",X"5D",X"6F",X"CD",X"B7",X"5A",X"21",X"11",X"6F",X"11",X"5D",X"6F",X"CD",X"B7",X"5A",X"21", + X"13",X"6F",X"11",X"E4",X"5A",X"CD",X"D4",X"5A",X"21",X"5B",X"6F",X"CD",X"E5",X"5A",X"21",X"03", + X"6F",X"CD",X"FA",X"5A",X"21",X"59",X"6F",X"CD",X"8B",X"5B",X"C9",X"21",X"0C",X"6F",X"11",X"58", + X"6F",X"CD",X"B7",X"5A",X"21",X"11",X"6F",X"11",X"58",X"6F",X"CD",X"B7",X"5A",X"21",X"13",X"6F", + X"11",X"E4",X"5A",X"CD",X"D4",X"5A",X"21",X"56",X"6F",X"CD",X"E5",X"5A",X"21",X"00",X"6F",X"CD", + X"FA",X"5A",X"21",X"54",X"6F",X"CD",X"8B",X"5B",X"AF",X"32",X"06",X"6F",X"C9",X"3A",X"06",X"6F", + X"FE",X"38",X"C0",X"3C",X"32",X"06",X"6F",X"C9",X"AF",X"32",X"07",X"6F",X"5E",X"23",X"56",X"EB", + X"5E",X"23",X"56",X"7A",X"B3",X"C8",X"23",X"1A",X"A6",X"23",X"BE",X"20",X"04",X"23",X"23",X"18", + X"EF",X"47",X"3E",X"01",X"32",X"07",X"6F",X"78",X"23",X"BE",X"20",X"03",X"23",X"18",X"E1",X"3E", + X"02",X"32",X"07",X"6F",X"C9",X"A1",X"5A",X"A8",X"5A",X"A1",X"5A",X"A8",X"5A",X"A1",X"5A",X"A8", + X"5A",X"A1",X"5A",X"A8",X"5A",X"A1",X"5A",X"A8",X"5A",X"A1",X"5A",X"A8",X"5A",X"A1",X"5A",X"A8", + X"5A",X"00",X"90",X"7F",X"1B",X"1F",X"00",X"00",X"00",X"90",X"7F",X"1F",X"1B",X"00",X"00",X"3A", + X"00",X"90",X"E6",X"1F",X"FE",X"1E",X"C9",X"06",X"03",X"37",X"3F",X"1A",X"8E",X"27",X"38",X"08", + X"FE",X"60",X"38",X"06",X"D6",X"60",X"18",X"02",X"C6",X"40",X"77",X"1B",X"2B",X"10",X"EB",X"3F", + X"CD",X"D5",X"5A",X"C9",X"AF",X"06",X"02",X"1A",X"8E",X"27",X"77",X"1B",X"2B",X"10",X"F8",X"C9", + X"00",X"00",X"00",X"00",X"01",X"11",X"0F",X"5B",X"CD",X"69",X"5B",X"CB",X"21",X"06",X"00",X"21", + X"15",X"6F",X"09",X"11",X"E4",X"5A",X"CD",X"D4",X"5A",X"C9",X"11",X"3C",X"5B",X"CD",X"69",X"5B", + X"CB",X"21",X"06",X"00",X"21",X"35",X"6F",X"09",X"11",X"E4",X"5A",X"CD",X"D4",X"5A",X"C9",X"01", + X"00",X"00",X"02",X"00",X"00",X"03",X"00",X"00",X"04",X"00",X"00",X"05",X"00",X"00",X"06",X"00", + X"00",X"07",X"00",X"00",X"08",X"00",X"00",X"09",X"00",X"00",X"10",X"00",X"00",X"12",X"00",X"00", + X"14",X"00",X"00",X"16",X"00",X"00",X"18",X"00",X"00",X"20",X"00",X"00",X"00",X"20",X"00",X"00", + X"50",X"00",X"01",X"00",X"00",X"01",X"30",X"00",X"01",X"60",X"00",X"02",X"00",X"00",X"02",X"50", + X"00",X"03",X"00",X"00",X"03",X"50",X"00",X"04",X"00",X"00",X"05",X"00",X"00",X"06",X"00",X"00", + X"08",X"00",X"00",X"10",X"00",X"00",X"15",X"00",X"00",X"01",X"00",X"0F",X"C5",X"D5",X"E5",X"06", + X"03",X"1A",X"BE",X"20",X"06",X"13",X"23",X"10",X"F8",X"18",X"0C",X"30",X"0A",X"E1",X"D1",X"13", + X"13",X"13",X"C1",X"0C",X"10",X"E6",X"C9",X"E1",X"D1",X"C1",X"C9",X"AF",X"06",X"05",X"77",X"23", + X"10",X"FC",X"C9",X"21",X"00",X"D0",X"11",X"5E",X"6F",X"01",X"04",X"08",X"C5",X"E5",X"7E",X"12", + X"36",X"00",X"13",X"23",X"10",X"F8",X"E1",X"01",X"20",X"00",X"09",X"C1",X"0D",X"20",X"ED",X"21", + X"80",X"D0",X"36",X"24",X"11",X"81",X"D0",X"01",X"FF",X"02",X"ED",X"B0",X"21",X"80",X"D4",X"01", + X"00",X"03",X"36",X"00",X"23",X"0B",X"78",X"B1",X"20",X"F8",X"0E",X"40",X"11",X"20",X"00",X"21", + X"00",X"70",X"06",X"20",X"36",X"00",X"19",X"10",X"FB",X"0D",X"20",X"F3",X"21",X"71",X"5C",X"0E", + X"25",X"CD",X"15",X"5C",X"0D",X"20",X"FA",X"11",X"AF",X"D0",X"21",X"08",X"6F",X"CD",X"22",X"5C", + X"11",X"EF",X"D0",X"21",X"0D",X"6F",X"CD",X"22",X"5C",X"11",X"2F",X"D1",X"21",X"12",X"6F",X"CD", + X"40",X"5C",X"11",X"6A",X"D1",X"21",X"14",X"6F",X"CD",X"2E",X"5C",X"11",X"78",X"D1",X"21",X"34", + X"6F",X"CD",X"2E",X"5C",X"C9",X"5E",X"23",X"56",X"23",X"46",X"23",X"7E",X"12",X"13",X"23",X"10", + X"FA",X"C9",X"CD",X"40",X"5C",X"13",X"CD",X"44",X"5C",X"13",X"CD",X"44",X"5C",X"C9",X"06",X"10", + X"C5",X"D5",X"CD",X"40",X"5C",X"D1",X"EB",X"01",X"20",X"00",X"09",X"EB",X"C1",X"10",X"F1",X"C9", + X"06",X"04",X"18",X"02",X"06",X"02",X"AF",X"ED",X"6F",X"28",X"13",X"CB",X"FF",X"F5",X"D5",X"E5", + X"E6",X"0F",X"5F",X"16",X"00",X"21",X"4F",X"5D",X"19",X"7E",X"E1",X"D1",X"12",X"F1",X"13",X"CB", + X"40",X"28",X"05",X"ED",X"6F",X"23",X"18",X"06",X"CB",X"48",X"28",X"02",X"CB",X"FF",X"10",X"D7", + X"C9",X"A6",X"D0",X"05",X"1D",X"18",X"1D",X"0A",X"15",X"B3",X"D0",X"07",X"11",X"24",X"24",X"16", + X"24",X"24",X"1C",X"E6",X"D0",X"07",X"12",X"17",X"24",X"19",X"15",X"0A",X"22",X"F3",X"D0",X"07", + X"11",X"24",X"24",X"16",X"24",X"24",X"1C",X"26",X"D1",X"05",X"1D",X"12",X"16",X"0E",X"1C",X"65", + X"D1",X"04",X"01",X"16",X"12",X"17",X"72",X"D1",X"05",X"02",X"14",X"19",X"1D",X"1C",X"85",X"D1", + X"01",X"02",X"92",X"D1",X"02",X"05",X"14",X"A5",X"D1",X"01",X"03",X"B1",X"D1",X"03",X"01",X"00", + X"14",X"C5",X"D1",X"01",X"04",X"D1",X"D1",X"03",X"01",X"03",X"14",X"E5",X"D1",X"01",X"05",X"F1", + X"D1",X"03",X"01",X"06",X"14",X"05",X"D2",X"01",X"06",X"11",X"D2",X"03",X"02",X"00",X"14",X"25", + X"D2",X"01",X"07",X"31",X"D2",X"03",X"02",X"05",X"14",X"45",X"D2",X"01",X"08",X"51",X"D2",X"03", + X"03",X"00",X"14",X"65",X"D2",X"01",X"09",X"71",X"D2",X"03",X"03",X"05",X"14",X"84",X"D2",X"02", + X"01",X"00",X"91",X"D2",X"03",X"04",X"00",X"14",X"A4",X"D2",X"02",X"01",X"02",X"B1",X"D2",X"03", + X"05",X"00",X"14",X"C4",X"D2",X"02",X"01",X"04",X"D1",X"D2",X"03",X"06",X"00",X"14",X"E4",X"D2", + X"02",X"01",X"06",X"F1",X"D2",X"03",X"08",X"00",X"14",X"04",X"D3",X"02",X"01",X"08",X"10",X"D3", + X"04",X"01",X"00",X"00",X"14",X"24",X"D3",X"02",X"02",X"00",X"30",X"D3",X"04",X"01",X"05",X"00", + X"14",X"44",X"D3",X"04",X"18",X"1F",X"0E",X"1B",X"50",X"D3",X"04",X"18",X"1F",X"0E",X"1B",X"00", + X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"21",X"80",X"D0",X"36",X"24",X"11",X"81", + X"D0",X"01",X"FF",X"02",X"ED",X"B0",X"21",X"5E",X"6F",X"11",X"00",X"D0",X"01",X"08",X"04",X"C5", + X"06",X"00",X"ED",X"B0",X"EB",X"01",X"18",X"00",X"09",X"EB",X"C1",X"10",X"F2",X"C9",X"C7",X"C7", + X"21",X"00",X"B0",X"36",X"9F",X"36",X"BF",X"36",X"DF",X"36",X"FF",X"21",X"00",X"C0",X"36",X"9F", + X"36",X"BF",X"36",X"DF",X"36",X"FF",X"21",X"80",X"D0",X"36",X"24",X"23",X"7C",X"FE",X"E0",X"38", + X"F8",X"21",X"00",X"D0",X"36",X"00",X"11",X"01",X"D0",X"01",X"7F",X"00",X"ED",X"B0",X"0E",X"40", + X"11",X"20",X"00",X"21",X"00",X"70",X"06",X"20",X"36",X"00",X"19",X"10",X"FB",X"0D",X"20",X"F3", + X"DD",X"21",X"ED",X"D1",X"DD",X"36",X"00",X"1B",X"DD",X"36",X"01",X"18",X"DD",X"36",X"02",X"16", + X"21",X"00",X"00",X"11",X"00",X"00",X"AF",X"06",X"10",X"86",X"2C",X"20",X"FC",X"24",X"10",X"F9", + X"BB",X"28",X"10",X"16",X"FF",X"7B",X"C6",X"01",X"DD",X"77",X"04",X"01",X"00",X"00",X"0B",X"78", + X"B1",X"20",X"FB",X"1C",X"7B",X"FE",X"06",X"38",X"DD",X"CB",X"7A",X"C2",X"00",X"00",X"DD",X"36", + X"04",X"18",X"DD",X"36",X"05",X"14",X"01",X"00",X"00",X"0B",X"78",X"B1",X"20",X"FB",X"DD",X"36", + X"00",X"1B",X"DD",X"36",X"01",X"0A",X"DD",X"36",X"02",X"16",X"DD",X"36",X"04",X"24",X"DD",X"36", + X"05",X"24",X"1E",X"FF",X"21",X"00",X"60",X"16",X"10",X"7B",X"0E",X"10",X"06",X"10",X"C6",X"2F", + X"77",X"23",X"10",X"FA",X"3D",X"0D",X"20",X"F4",X"3D",X"15",X"20",X"EE",X"21",X"00",X"60",X"16", + X"10",X"7B",X"0E",X"10",X"06",X"10",X"C6",X"2F",X"BE",X"20",X"23",X"23",X"10",X"F8",X"3D",X"0D", + X"20",X"F2",X"3D",X"15",X"20",X"EC",X"7B",X"D6",X"0F",X"5F",X"30",X"C8",X"DD",X"36",X"04",X"18", + X"DD",X"36",X"05",X"14",X"01",X"00",X"00",X"0B",X"78",X"B1",X"20",X"FB",X"18",X"15",X"7C",X"E6", + X"0C",X"0F",X"0F",X"C6",X"01",X"DD",X"77",X"04",X"01",X"00",X"00",X"0B",X"78",X"B1",X"20",X"FB", + X"C3",X"00",X"00",X"DD",X"36",X"00",X"1C",X"DD",X"36",X"01",X"18",X"DD",X"36",X"02",X"1E",X"DD", + X"36",X"03",X"17",X"DD",X"36",X"04",X"0D",X"DD",X"36",X"05",X"24",X"CD",X"E0",X"5E",X"3E",X"03", + X"21",X"81",X"D0",X"11",X"81",X"D4",X"06",X"1D",X"36",X"4D",X"12",X"13",X"23",X"10",X"F9",X"36", + X"4F",X"12",X"21",X"A1",X"D0",X"11",X"A1",X"D4",X"01",X"17",X"1D",X"C5",X"36",X"4C",X"12",X"23", + X"13",X"10",X"F9",X"36",X"4E",X"12",X"23",X"23",X"23",X"13",X"13",X"13",X"C1",X"0D",X"20",X"EB", + X"18",X"FE",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", + X"DD",X"21",X"00",X"6C",X"16",X"02",X"21",X"00",X"B0",X"18",X"03",X"21",X"00",X"C0",X"06",X"04", + X"3E",X"9F",X"77",X"C6",X"20",X"10",X"FB",X"15",X"28",X"02",X"18",X"EF",X"21",X"00",X"B0",X"0E", + X"00",X"11",X"EC",X"5F",X"06",X"03",X"1A",X"77",X"13",X"1A",X"13",X"DD",X"77",X"00",X"DD",X"36", + X"01",X"00",X"CD",X"A0",X"5F",X"28",X"05",X"CD",X"CD",X"5F",X"18",X"F6",X"1A",X"77",X"13",X"10", + X"E5",X"CD",X"C6",X"5F",X"06",X"02",X"36",X"E3",X"36",X"F0",X"DD",X"36",X"00",X"C0",X"DD",X"36", + X"01",X"00",X"CD",X"A0",X"5F",X"28",X"05",X"CD",X"CD",X"5F",X"18",X"F6",X"36",X"E7",X"10",X"EA", + X"36",X"FF",X"CD",X"C6",X"5F",X"11",X"F5",X"5F",X"06",X"06",X"36",X"F0",X"1A",X"13",X"77",X"CD", + X"C6",X"5F",X"10",X"F8",X"36",X"FF",X"CD",X"C6",X"5F",X"11",X"EC",X"5F",X"06",X"03",X"1A",X"77", + X"DD",X"77",X"00",X"13",X"1A",X"77",X"13",X"36",X"0F",X"CD",X"94",X"5F",X"28",X"05",X"CD",X"BF", + X"5F",X"18",X"F6",X"13",X"10",X"E8",X"CD",X"C6",X"5F",X"36",X"E4",X"DD",X"36",X"00",X"F0",X"CD", + X"94",X"5F",X"28",X"05",X"CD",X"BF",X"5F",X"18",X"F6",X"79",X"FE",X"00",X"C0",X"0C",X"21",X"00", + X"C0",X"C3",X"01",X"5F",X"DD",X"34",X"00",X"DD",X"7E",X"00",X"77",X"E6",X"0F",X"FE",X"0F",X"C9", + X"DD",X"34",X"00",X"DD",X"7E",X"00",X"E6",X"0F",X"FE",X"0F",X"20",X"0B",X"DD",X"34",X"01",X"DD", + X"7E",X"00",X"D6",X"0F",X"DD",X"77",X"00",X"DD",X"7E",X"01",X"E6",X"3F",X"FE",X"3F",X"C9",X"D9", + X"08",X"11",X"89",X"1D",X"18",X"14",X"D9",X"08",X"11",X"24",X"76",X"18",X"0D",X"DD",X"7E",X"00", + X"77",X"DD",X"7E",X"01",X"77",X"D9",X"08",X"11",X"7B",X"00",X"DD",X"CB",X"00",X"46",X"1B",X"7A", + X"FE",X"00",X"20",X"F6",X"7B",X"FE",X"00",X"20",X"F1",X"D9",X"08",X"C9",X"90",X"80",X"9F",X"B0", + X"A0",X"BF",X"D0",X"C0",X"DF",X"E0",X"E1",X"E2",X"E4",X"E5",X"E6",X"C7",X"C7",X"C7",X"C7",X"C7"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_sprite_l.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_sprite_l.vhd new file mode 100644 index 00000000..edab8fcd --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_sprite_l.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_sprite_l is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_sprite_l is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"3F",X"03",X"F5",X"0F",X"A5",X"3D",X"69",X"E5",X"59",X"DA",X"57",X"D5",X"AB",X"D5",X"57", + X"F0",X"00",X"BF",X"00",X"95",X"C0",X"65",X"70",X"65",X"5C",X"FD",X"5C",X"0D",X"5C",X"33",X"5C", + X"D6",X"81",X"EA",X"80",X"EA",X"80",X"35",X"55",X"0D",X"55",X"03",X"55",X"00",X"FF",X"00",X"00", + X"C3",X"DC",X"CC",X"3C",X"F0",X"FC",X"4F",X"0C",X"57",X"3C",X"57",X"C0",X"FF",X"C0",X"00",X"00", + X"0F",X"FF",X"3D",X"5A",X"3A",X"95",X"D5",X"6A",X"E9",X"55",X"D6",X"A9",X"D5",X"55",X"D6",X"05", + X"FF",X"00",X"95",X"C0",X"65",X"70",X"59",X"5F",X"96",X"57",X"7F",X"FF",X"F0",X"C3",X"C3",X"C3", + X"DA",X"03",X"EA",X"03",X"EA",X"95",X"35",X"55",X"0D",X"55",X"03",X"55",X"00",X"D5",X"00",X"3F", + X"03",X"0F",X"C0",X"0C",X"F0",X"00",X"C0",X"00",X"CC",X"00",X"70",X"C0",X"73",X"00",X"FC",X"00", + X"00",X"3F",X"03",X"D5",X"0D",X"55",X"3A",X"AA",X"35",X"57",X"3A",X"AC",X"F5",X"5C",X"D6",X"AC", + X"F0",X"00",X"5C",X"00",X"57",X"00",X"95",X"C0",X"FF",X"FC",X"CC",X"FF",X"CC",X"CF",X"CC",X"CC", + X"EA",X"5F",X"D5",X"60",X"DA",X"A0",X"FA",X"A0",X"3E",X"A9",X"0F",X"55",X"03",X"FF",X"00",X"00", + X"FF",X"FF",X"15",X"57",X"15",X"5C",X"15",X"70",X"55",X"C0",X"57",X"00",X"FC",X"00",X"00",X"00", + X"00",X"FF",X"0F",X"55",X"35",X"55",X"EA",X"AA",X"D5",X"55",X"DA",X"AA",X"E9",X"55",X"E5",X"AA", + X"FF",X"F0",X"55",X"5C",X"55",X"FF",X"AB",X"CF",X"5C",X"C3",X"BC",X"C3",X"70",X"C0",X"B0",X"00", + X"D6",X"95",X"DA",X"50",X"39",X"60",X"39",X"A8",X"0D",X"AA",X"03",X"A9",X"00",X"D5",X"00",X"3F", + X"70",X"00",X"3C",X"00",X"0F",X"30",X"17",X"33",X"57",X"F3",X"55",X"FF",X"55",X"5F",X"FF",X"F0", + X"00",X"3F",X"00",X"D6",X"03",X"A6",X"0E",X"A6",X"36",X"A5",X"36",X"A9",X"36",X"03",X"35",X"03", + X"F0",X"00",X"7F",X"C0",X"59",X"B0",X"99",X"9C",X"99",X"9C",X"99",X"97",X"FF",X"97",X"03",X"97", + X"35",X"03",X"35",X"57",X"35",X"57",X"0D",X"57",X"03",X"57",X"00",X"D7",X"00",X"37",X"00",X"0F", + X"FF",X"97",X"03",X"57",X"FF",X"5C",X"03",X"70",X"FF",X"C0",X"0F",X"00",X"FC",X"00",X"3C",X"00", + X"00",X"0F",X"00",X"F5",X"03",X"A9",X"0D",X"5A",X"3A",X"96",X"DA",X"A5",X"DA",X"81",X"D6",X"01", + X"FF",X"C0",X"A5",X"B0",X"69",X"9C",X"59",X"9C",X"99",X"97",X"99",X"97",X"99",X"97",X"99",X"97", + X"D5",X"01",X"D5",X"4F",X"D5",X"7C",X"D7",X"F0",X"DF",X"00",X"DF",X"F0",X"3C",X"00",X"3F",X"C0", + X"99",X"97",X"FD",X"97",X"0F",X"97",X"00",X"D7",X"3F",X"F7",X"00",X"37",X"00",X"FC",X"0F",X"F0", + X"02",X"00",X"0F",X"FF",X"3F",X"FF",X"FF",X"FF",X"00",X"05",X"00",X"54",X"01",X"50",X"01",X"40", + X"02",X"00",X"FF",X"C0",X"FF",X"F0",X"FF",X"FC",X"40",X"00",X"54",X"00",X"15",X"00",X"05",X"00", + X"00",X"00",X"2A",X"00",X"2A",X"00",X"55",X"55",X"5A",X"81",X"5A",X"81",X"5A",X"A9",X"15",X"55", + X"00",X"00",X"02",X"A0",X"02",X"A0",X"55",X"54",X"0A",X"94",X"0A",X"94",X"AA",X"94",X"55",X"50", + X"00",X"AA",X"0A",X"A0",X"2A",X"00",X"AA",X"FC",X"AA",X"CF",X"55",X"50",X"55",X"EC",X"57",X"EF", + X"AA",X"A8",X"00",X"00",X"00",X"00",X"3F",X"C0",X"F0",X"FC",X"00",X"00",X"00",X"00",X"55",X"55", + X"16",X"AA",X"07",X"EF",X"00",X"ED",X"00",X"00",X"00",X"3F",X"03",X"FF",X"0F",X"C0",X"00",X"FF", + X"55",X"55",X"55",X"50",X"55",X"00",X"00",X"00",X"FF",X"00",X"0F",X"F0",X"00",X"FC",X"FF",X"C0", + X"02",X"00",X"02",X"00",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"A0",X"54",X"A1",X"45",X"A0",X"00", + X"02",X"00",X"02",X"00",X"FF",X"FC",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"A8", + X"A0",X"00",X"55",X"55",X"59",X"99",X"59",X"99",X"59",X"99",X"15",X"55",X"00",X"00",X"00",X"00", + X"00",X"A8",X"55",X"55",X"6A",X"05",X"6A",X"05",X"6A",X"A5",X"55",X"54",X"00",X"00",X"00",X"00", + X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"A0",X"50",X"A1",X"55",X"A1",X"45",X"A0",X"00",X"A0",X"00", + X"FF",X"F0",X"FF",X"FC",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A0",X"00",X"A0",X"00",X"A0",X"00",X"A0",X"00",X"A0",X"00",X"55",X"55",X"59",X"99",X"15",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A8",X"55",X"55",X"6A",X"15",X"55",X"54", + X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"55",X"55", + X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"FF",X"FC",X"FF",X"FF",X"FF",X"FF",X"55",X"55", + X"59",X"99",X"59",X"99",X"59",X"99",X"15",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"42",X"A5",X"42",X"A5",X"6A",X"A5",X"55",X"54",X"30",X"00",X"30",X"14",X"0C",X"14",X"03",X"C0", + X"0F",X"FF",X"0C",X"F5",X"F0",X"CD",X"DF",X"0F",X"D7",X"30",X"D5",X"C3",X"D5",X"FC",X"D5",X"0F", + X"FC",X"00",X"57",X"00",X"55",X"C0",X"55",X"70",X"F5",X"70",X"3A",X"7C",X"35",X"AC",X"F5",X"5C", + X"D5",X"03",X"D5",X"01",X"D5",X"A9",X"35",X"A9",X"0D",X"A5",X"03",X"A5",X"00",X"FF",X"00",X"00", + X"9A",X"5C",X"96",X"BC",X"95",X"B0",X"65",X"F0",X"67",X"C0",X"5F",X"00",X"FC",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00", + X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00", + X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00", + X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00", + X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00", + X"01",X"00",X"05",X"40",X"17",X"50",X"1F",X"D0",X"17",X"50",X"05",X"40",X"01",X"00",X"02",X"00", + X"05",X"40",X"17",X"50",X"5F",X"D4",X"17",X"50",X"05",X"40",X"02",X"00",X"02",X"00",X"02",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"00",X"1A",X"00",X"6B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"90",X"00",X"A4",X"00", + X"00",X"6F",X"00",X"6B",X"00",X"1A",X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"24",X"00",X"A4",X"00",X"90",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"80",X"02",X"05",X"00",X"1F",X"00",X"7E",X"08",X"7A", + X"00",X"00",X"00",X"00",X"80",X"00",X"02",X"00",X"50",X"80",X"F4",X"00",X"BD",X"00",X"AD",X"20", + X"08",X"7A",X"00",X"7E",X"00",X"1F",X"02",X"05",X"00",X"80",X"00",X"02",X"00",X"00",X"00",X"00", + X"AD",X"20",X"BD",X"00",X"F4",X"00",X"50",X"80",X"02",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"06",X"00",X"54",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"60",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"20",X"00",X"90",X"00", + X"00",X"01",X"00",X"15",X"00",X"55",X"00",X"54",X"00",X"50",X"00",X"00",X"00",X"04",X"00",X"00", + X"00",X"10",X"80",X"90",X"00",X"90",X"02",X"40",X"02",X"40",X"05",X"00",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"08",X"04",X"02", + X"00",X"00",X"00",X"00",X"02",X"00",X"0C",X"00",X"02",X"80",X"00",X"20",X"00",X"00",X"00",X"00", + X"0C",X"02",X"06",X"00",X"06",X"00",X"02",X"00",X"02",X"00",X"00",X"00",X"00",X"20",X"00",X"00", + X"80",X"20",X"A0",X"00",X"9C",X"00",X"19",X"00",X"0A",X"00",X"00",X"00",X"00",X"00",X"08",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"02",X"80",X"02",X"B0",X"00",X"7A",X"00",X"05", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0B",X"00",X"0B",X"00",X"03",X"80",X"C0",X"80", + X"00",X"02",X"00",X"00",X"03",X"00",X"07",X"C0",X"06",X"0C",X"02",X"02",X"00",X"00",X"00",X"00", + X"C0",X"40",X"A0",X"20",X"28",X"00",X"02",X"00",X"00",X"00",X"80",X"00",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"51",X"02",X"50",X"01",X"50",X"01",X"10",X"10",X"40", + X"00",X"00",X"10",X"00",X"00",X"00",X"01",X"40",X"01",X"40",X"0D",X"00",X"20",X"04",X"40",X"00", + X"07",X"02",X"04",X"00",X"04",X"00",X"20",X"10",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"C0",X"05",X"C0",X"20",X"00",X"00",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"00",X"26",X"00",X"66",X"01",X"66", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"43",X"F0",X"4F",X"FC",X"7F",X"0F",X"7C",X"03", + X"01",X"66",X"01",X"66",X"00",X"66",X"00",X"26",X"00",X"06",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"7C",X"03",X"7F",X"0F",X"4F",X"FC",X"43",X"F0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"3C",X"10",X"FF",X"13",X"FF",X"9F",X"C3",X"9F",X"03",X"9C",X"03", + X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"90",X"00",X"9C",X"03",X"9F",X"03",X"9F",X"03",X"13",X"FF",X"10",X"FF",X"00",X"3C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"69",X"0A",X"69",X"1A",X"69", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"C0",X"FF",X"FF", + X"5A",X"69",X"1A",X"69",X"0A",X"69",X"00",X"69",X"00",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"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"3C",X"00",X"CF",X"00",X"03",X"00",X"03",X"00",X"0F",X"00",X"0D",X"00",X"05",X"00",X"2A", + X"0F",X"00",X"3C",X"C0",X"30",X"00",X"30",X"00",X"3C",X"00",X"5C",X"00",X"54",X"00",X"AA",X"00", + X"00",X"2A",X"00",X"2A",X"00",X"05",X"00",X"05",X"00",X"02",X"00",X"02",X"00",X"00",X"00",X"00", + X"AA",X"00",X"AA",X"00",X"54",X"00",X"54",X"00",X"A0",X"00",X"A0",X"00",X"40",X"00",X"00",X"00", + X"00",X"3C",X"00",X"F0",X"03",X"C0",X"03",X"C0",X"03",X"F0",X"00",X"35",X"00",X"15",X"00",X"AA", + X"0F",X"00",X"03",X"C0",X"00",X"F0",X"00",X"F0",X"03",X"F0",X"57",X"00",X"55",X"00",X"AA",X"80", + X"00",X"AA",X"00",X"15",X"00",X"15",X"00",X"0A",X"00",X"0A",X"00",X"01",X"00",X"00",X"00",X"00", + X"AA",X"80",X"55",X"00",X"55",X"00",X"A8",X"00",X"A8",X"00",X"50",X"00",X"00",X"00",X"00",X"00", + X"03",X"F0",X"0F",X"00",X"3C",X"00",X"3C",X"00",X"0F",X"F0",X"03",X"D5",X"05",X"55",X"0A",X"AA", + X"03",X"F0",X"00",X"3C",X"00",X"0F",X"00",X"0F",X"03",X"FC",X"55",X"F0",X"55",X"54",X"AA",X"A8", + X"02",X"AA",X"00",X"55",X"00",X"15",X"00",X"0A",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"A0",X"55",X"40",X"55",X"00",X"A8",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"05",X"40",X"15",X"50",X"D5",X"54",X"D5",X"05",X"D4",X"01",X"DA",X"03",X"EA",X"03",X"EA",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"03",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"EA",X"FF",X"FF",X"CF",X"FF",X"CF",X"FC",X"00",X"FF",X"CF",X"FF",X"CC",X"3F",X"F0",X"0F",X"C0", + X"00",X"55",X"05",X"55",X"15",X"57",X"55",X"15",X"55",X"15",X"50",X"01",X"55",X"15",X"15",X"14", + X"55",X"40",X"FD",X"50",X"FE",X"94",X"4A",X"94",X"4E",X"A4",X"0E",X"A8",X"0C",X"28",X"0F",X"08", + X"05",X"50",X"00",X"54",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"28",X"03",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"41",X"00",X"41", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"51",X"50",X"11",X"10", + X"00",X"41",X"00",X"41",X"01",X"41",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"10",X"11",X"10",X"51",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"41",X"00",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"51",X"50",X"11",X"10", + X"00",X"41",X"00",X"41",X"01",X"41",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"51",X"10",X"01",X"10",X"51",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"51",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"51",X"50",X"11",X"10", + X"01",X"51",X"00",X"11",X"01",X"51",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"10",X"11",X"10",X"51",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"51",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"51",X"50",X"11",X"10", + X"01",X"51",X"00",X"11",X"01",X"51",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"51",X"10",X"01",X"10",X"51",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"51",X"00",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"51",X"50",X"11",X"10", + X"01",X"51",X"00",X"11",X"01",X"51",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"10",X"11",X"10",X"51",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"51",X"00",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"51",X"50",X"11",X"10", + X"01",X"51",X"00",X"11",X"01",X"51",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"51",X"10",X"01",X"10",X"51",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"01",X"51", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"51",X"50",X"11",X"10", + X"01",X"11",X"01",X"11",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"10",X"11",X"10",X"51",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"01",X"50", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"51",X"50",X"11",X"10", + X"01",X"11",X"01",X"11",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"51",X"10",X"01",X"10",X"51",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"2A",X"00",X"AA",X"00",X"AB",X"03",X"FF",X"03",X"FF",X"3F",X"FF",X"FF",X"FF",X"55",X"55", + X"55",X"80",X"FE",X"80",X"FE",X"00",X"FF",X"F0",X"FF",X"FC",X"FF",X"FC",X"FF",X"FC",X"55",X"54", + X"55",X"5A",X"55",X"6A",X"55",X"6A",X"55",X"6A",X"15",X"6A",X"15",X"5A",X"05",X"55",X"00",X"55", + X"AA",X"95",X"80",X"15",X"00",X"15",X"00",X"54",X"81",X"50",X"A5",X"50",X"55",X"40",X"50",X"00", + X"00",X"2A",X"00",X"AA",X"00",X"AB",X"03",X"FF",X"0F",X"FF",X"3F",X"FF",X"FF",X"FF",X"55",X"55", + X"55",X"80",X"FE",X"80",X"FE",X"00",X"FF",X"C0",X"FF",X"FC",X"FF",X"FC",X"FF",X"FC",X"55",X"54", + X"55",X"5A",X"55",X"6A",X"55",X"6A",X"55",X"6A",X"15",X"6A",X"15",X"5A",X"05",X"55",X"00",X"55", + X"AA",X"95",X"80",X"15",X"00",X"15",X"00",X"54",X"81",X"50",X"A5",X"50",X"55",X"40",X"50",X"00", + X"00",X"05",X"00",X"15",X"00",X"15",X"00",X"57",X"00",X"5F",X"00",X"5D",X"00",X"5F",X"00",X"57", + X"40",X"00",X"50",X"00",X"50",X"00",X"54",X"00",X"D4",X"00",X"D4",X"00",X"D4",X"00",X"54",X"00", + X"00",X"15",X"00",X"15",X"00",X"05",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02", + X"50",X"00",X"50",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"15",X"01",X"55",X"05",X"5F",X"05",X"7D",X"05",X"5F",X"01",X"55",X"00",X"15",X"00",X"02", + X"50",X"00",X"55",X"00",X"D5",X"00",X"F5",X"40",X"D5",X"40",X"55",X"00",X"50",X"00",X"00",X"00", + X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"00",X"2A",X"00",X"A9",X"03",X"E6",X"0B",X"FE",X"2A",X"FF",X"29",X"FF",X"A6",X"BF", + X"A4",X"00",X"5A",X"80",X"AA",X"90",X"AA",X"68",X"A9",X"A8",X"A6",X"A9",X"DA",X"A6",X"FA",X"A6", + X"9A",X"AF",X"9A",X"A7",X"6A",X"9A",X"2A",X"6A",X"29",X"AA",X"06",X"AA",X"02",X"A5",X"00",X"1A", + X"FE",X"9A",X"FF",X"68",X"FF",X"A8",X"BF",X"E0",X"9B",X"C0",X"6A",X"00",X"A8",X"00",X"80",X"00", + X"00",X"00",X"00",X"AB",X"2A",X"AB",X"AA",X"5F",X"95",X"AF",X"6A",X"AF",X"AA",X"AF",X"5A",X"5F", + X"00",X"00",X"EA",X"00",X"EA",X"A8",X"F5",X"AA",X"FA",X"56",X"FA",X"A9",X"FA",X"AA",X"FA",X"5A", + X"A5",X"AF",X"AA",X"AF",X"6A",X"AF",X"95",X"AF",X"AA",X"5F",X"2A",X"AB",X"00",X"AB",X"00",X"00", + X"F5",X"A5",X"FA",X"AA",X"FA",X"A9",X"FA",X"56",X"F5",X"AA",X"EA",X"A8",X"EA",X"00",X"00",X"00", + X"3F",X"0F",X"0C",X"3F",X"3F",X"FF",X"3F",X"FF",X"FF",X"FF",X"6A",X"6A",X"6A",X"6A",X"6A",X"6A", + X"F0",X"FC",X"FC",X"30",X"FF",X"FC",X"FF",X"FF",X"FF",X"FF",X"A9",X"A9",X"A9",X"A9",X"A9",X"A9", + X"6A",X"6A",X"6A",X"5A",X"5A",X"9A",X"16",X"96",X"05",X"A6",X"01",X"55",X"00",X"0C",X"00",X"3F", + X"A9",X"A9",X"A5",X"A9",X"A6",X"A5",X"96",X"94",X"9A",X"50",X"55",X"40",X"30",X"00",X"FC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"A0",X"0A",X"14",X"14",X"05",X"50", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"A0",X"0A",X"14",X"14",X"05",X"50", + X"05",X"50",X"14",X"14",X"A0",X"0A",X"AA",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"05",X"50",X"14",X"14",X"A0",X"0A",X"AA",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"02",X"9A",X"0A",X"6A",X"0A",X"69",X"2A",X"69",X"29",X"AA",X"29",X"AA",X"2B",X"FF",X"3F",X"FF", + X"66",X"80",X"69",X"A0",X"A9",X"A0",X"A9",X"A8",X"6A",X"68",X"6A",X"68",X"FF",X"E8",X"FF",X"FC", + X"3F",X"FF",X"2B",X"FF",X"29",X"A9",X"29",X"A9",X"2A",X"6A",X"0A",X"6A",X"0A",X"69",X"02",X"99", + X"FF",X"FC",X"FF",X"E8",X"AA",X"68",X"AA",X"68",X"69",X"68",X"69",X"A0",X"A9",X"A0",X"A6",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"01",X"00",X"30",X"00",X"C0",X"C0",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"84",X"00",X"02",X"00",X"00",X"40",X"48",X"00", + X"00",X"00",X"C0",X"CC",X"0C",X"01",X"00",X"C1",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"48",X"00",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"C2",X"0C",X"C0",X"C0",X"CC",X"C0",X"0E",X"00",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"44",X"00",X"66",X"00",X"A4",X"40",X"92",X"40", + X"C0",X"0E",X"C0",X"CD",X"0C",X"C1",X"0C",X"C1",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"19",X"40",X"89",X"00",X"20",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"00",X"0F",X"00",X"00",X"0C",X"00",X"30",X"03",X"C3",X"00",X"FC",X"30",X"D7",X"FC", + X"FF",X"C0",X"0D",X"C0",X"0D",X"70",X"FD",X"5C",X"CE",X"57",X"0D",X"97",X"3D",X"67",X"F6",X"5B", + X"D5",X"5F",X"D5",X"50",X"D5",X"50",X"35",X"60",X"0D",X"6A",X"03",X"6A",X"00",X"E9",X"00",X"3F", + X"65",X"9B",X"59",X"9B",X"19",X"97",X"19",X"67",X"59",X"67",X"56",X"6F",X"56",X"70",X"FF",X"C0"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_sprite_u.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_sprite_u.vhd new file mode 100644 index 00000000..5e926cad --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ROM/rom_sprite_u.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity rom_sprite_u is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of rom_sprite_u is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AA",X"AA",X"AA",X"AF",X"2A",X"FF",X"06",X"F5",X"06",X"F1",X"01",X"F5",X"00",X"7C",X"00",X"7F", + X"FF",X"FD",X"FF",X"FD",X"3F",X"FD",X"4F",X"FD",X"43",X"FD",X"03",X"FD",X"0F",X"F7",X"3F",X"F7", + X"00",X"1F",X"00",X"07",X"00",X"07",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F7",X"FF",X"DF",X"FF",X"5F",X"7D",X"FF",X"17",X"FF",X"01",X"55",X"00",X"15",X"00",X"00", + X"FF",X"7F",X"FF",X"5F",X"FD",X"F7",X"F7",X"F5",X"5F",X"FD",X"DF",X"F5",X"F7",X"F5",X"FD",X"D5", + X"FF",X"C0",X"D5",X"40",X"DA",X"80",X"42",X"A0",X"02",X"A0",X"00",X"A0",X"80",X"A8",X"80",X"28", + X"FD",X"56",X"FD",X"5A",X"F5",X"5A",X"D5",X"A5",X"56",X"6A",X"5A",X"9A",X"0A",X"A5",X"00",X"2A", + X"80",X"0A",X"80",X"02",X"A0",X"00",X"50",X"00",X"A0",X"00",X"A0",X"00",X"54",X"00",X"AA",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"00",X"1F",X"00",X"7F",X"01",X"FF", + X"00",X"00",X"00",X"00",X"05",X"54",X"5F",X"5D",X"FF",X"DF",X"FF",X"DF",X"FF",X"F7",X"FF",X"F7", + X"0A",X"AA",X"0A",X"AA",X"05",X"41",X"01",X"00",X"00",X"01",X"04",X"05",X"05",X"15",X"15",X"2A", + X"AB",X"FD",X"AA",X"A6",X"40",X"01",X"04",X"09",X"05",X"AD",X"4A",X"BD",X"AB",X"FD",X"AF",X"FD", + X"00",X"24",X"00",X"2A",X"00",X"AA",X"40",X"A9",X"D6",X"A6",X"F5",X"6A",X"FD",X"6A",X"FD",X"D9", + X"00",X"00",X"00",X"00",X"40",X"00",X"80",X"00",X"A0",X"00",X"A4",X"00",X"58",X"00",X"AA",X"02", + X"FD",X"F6",X"FD",X"FD",X"F5",X"FD",X"5F",X"FD",X"F5",X"FD",X"FD",X"F5",X"FF",X"77",X"FF",X"5F", + X"AA",X"0A",X"00",X"28",X"00",X"A8",X"40",X"A0",X"42",X"A0",X"52",X"A0",X"DA",X"80",X"D5",X"40", + X"00",X"00",X"00",X"04",X"00",X"05",X"10",X"05",X"14",X"06",X"15",X"0A",X"15",X"6A",X"05",X"AA", + X"16",X"BF",X"1A",X"BF",X"2A",X"FF",X"AA",X"FF",X"AB",X"FF",X"AB",X"CF",X"AF",X"43",X"BC",X"50", + X"0A",X"AA",X"2A",X"AA",X"2A",X"AB",X"02",X"97",X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"50",X"FD",X"40",X"FF",X"03",X"FF",X"FF",X"5F",X"FF",X"15",X"7D",X"00",X"55",X"00",X"00", + X"DF",X"7F",X"DF",X"5F",X"DF",X"77",X"D5",X"F5",X"DF",X"FD",X"D7",X"FD",X"DD",X"F5",X"DF",X"75", + X"FF",X"C0",X"D5",X"40",X"DA",X"80",X"42",X"A0",X"40",X"A8",X"40",X"2A",X"00",X"02",X"00",X"00", + X"DF",X"56",X"DF",X"5A",X"DF",X"55",X"55",X"6A",X"55",X"55",X"56",X"AA",X"5A",X"A8",X"00",X"00", + X"A0",X"00",X"55",X"00",X"AA",X"A0",X"AA",X"A8",X"55",X"40",X"A0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"29",X"00",X"AA",X"02",X"AA",X"01",X"5A",X"01",X"51", + X"00",X"00",X"00",X"54",X"55",X"55",X"5F",X"5F",X"BF",X"DF",X"5F",X"DF",X"AB",X"D7",X"6A",X"F7", + X"01",X"41",X"01",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"52",X"A9",X"41",X"5A",X"01",X"06",X"00",X"02",X"00",X"02",X"00",X"1A",X"10",X"6B",X"14",X"AF", + X"00",X"00",X"00",X"00",X"40",X"0A",X"54",X"2A",X"F6",X"A5",X"F5",X"5A",X"FD",X"DA",X"FD",X"F5", + X"00",X"00",X"A0",X"00",X"A8",X"00",X"A4",X"00",X"58",X"00",X"AA",X"00",X"95",X"00",X"6A",X"00", + X"FD",X"FD",X"7D",X"FD",X"75",X"FD",X"5F",X"FD",X"55",X"FD",X"5D",X"F5",X"5F",X"77",X"DF",X"5F", + X"AA",X"00",X"0A",X"00",X"40",X"02",X"40",X"2A",X"40",X"A8",X"42",X"A0",X"DA",X"80",X"D5",X"40", + X"AB",X"57",X"2B",X"55",X"0B",X"55",X"03",X"5F",X"03",X"55",X"03",X"55",X"0B",X"57",X"2B",X"55", + X"55",X"55",X"D5",X"55",X"75",X"57",X"D7",X"5D",X"75",X"F5",X"D5",X"55",X"55",X"55",X"55",X"55", + X"0A",X"D5",X"00",X"D5",X"00",X"35",X"00",X"B5",X"02",X"AD",X"00",X"AB",X"00",X"00",X"00",X"00", + X"56",X"A0",X"56",X"A0",X"55",X"A8",X"55",X"6A",X"55",X"56",X"D5",X"55",X"3D",X"55",X"0F",X"FF", + X"55",X"55",X"55",X"55",X"D5",X"7D",X"75",X"DF",X"5F",X"55",X"55",X"55",X"55",X"55",X"55",X"55", + X"57",X"00",X"57",X"00",X"5F",X"00",X"75",X"C0",X"D5",X"C0",X"55",X"C0",X"55",X"C0",X"55",X"C0", + X"15",X"55",X"05",X"55",X"05",X"55",X"05",X"55",X"A5",X"55",X"65",X"55",X"55",X"FF",X"FF",X"00", + X"55",X"C0",X"15",X"C0",X"05",X"C0",X"55",X"C0",X"57",X"C0",X"7F",X"00",X"C0",X"00",X"00",X"00", + X"F5",X"55",X"0D",X"55",X"03",X"55",X"02",X"D5",X"0A",X"D7",X"0A",X"B7",X"02",X"AF",X"00",X"0F", + X"5F",X"AA",X"75",X"C0",X"D5",X"7A",X"D5",X"5E",X"55",X"5C",X"55",X"57",X"55",X"55",X"55",X"D5", + X"00",X"0F",X"00",X"AB",X"0A",X"AB",X"02",X"AD",X"00",X"BD",X"00",X"35",X"02",X"D5",X"2A",X"D5", + X"55",X"F5",X"55",X"ED",X"57",X"ED",X"57",X"AD",X"57",X"AB",X"55",X"EB",X"55",X"7F",X"55",X"57", + X"AA",X"C0",X"00",X"C0",X"AA",X"C0",X"AA",X"C0",X"00",X"C0",X"AB",X"00",X"EB",X"00",X"7B",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"0F",X"57",X"F5",X"7D", + X"7D",X"55",X"5D",X"55",X"57",X"55",X"7F",X"57",X"55",X"DC",X"5F",X"F0",X"55",X"C0",X"FF",X"FF", + X"55",X"57",X"55",X"75",X"5F",X"5F",X"F0",X"D5",X"00",X"35",X"00",X"3F",X"00",X"00",X"FC",X"00", + X"00",X"D5",X"03",X"55",X"03",X"57",X"03",X"5D",X"03",X"5D",X"03",X"5D",X"03",X"55",X"03",X"6A", + X"55",X"55",X"FF",X"FF",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"15",X"55",X"05",X"05",X"55", + X"03",X"5A",X"03",X"5A",X"00",X"D6",X"00",X"D5",X"00",X"35",X"00",X"0F",X"00",X"03",X"00",X"00", + X"01",X"55",X"01",X"55",X"81",X"55",X"A9",X"55",X"69",X"55",X"55",X"55",X"F5",X"55",X"0F",X"FF", + X"55",X"55",X"FF",X"FD",X"55",X"57",X"55",X"55",X"55",X"55",X"45",X"55",X"05",X"55",X"55",X"0A", + X"70",X"00",X"70",X"00",X"5C",X"00",X"DF",X"00",X"D7",X"00",X"D7",X"00",X"57",X"00",X"97",X"00", + X"54",X"0A",X"54",X"0A",X"54",X"29",X"56",X"A5",X"56",X"95",X"55",X"57",X"55",X"7C",X"FF",X"F0", + X"5C",X"00",X"5C",X"00",X"5C",X"00",X"70",X"00",X"70",X"00",X"C0",X"00",X"00",X"00",X"00",X"00", + X"35",X"55",X"0D",X"55",X"03",X"55",X"02",X"D5",X"0A",X"D5",X"0A",X"95",X"02",X"A5",X"00",X"0D", + X"5E",X"AA",X"57",X"00",X"57",X"AA",X"55",X"EA",X"55",X"7F",X"55",X"F5",X"57",X"D5",X"5D",X"55", + X"00",X"0D",X"00",X"0B",X"00",X"2B",X"00",X"AB",X"00",X"2F",X"00",X"0D",X"00",X"F5",X"00",X"D5", + X"75",X"55",X"55",X"55",X"55",X"57",X"55",X"5E",X"55",X"7A",X"55",X"EA",X"55",X"7F",X"55",X"57", + X"A0",X"3F",X"30",X"F5",X"B3",X"D5",X"FF",X"55",X"55",X"D7",X"55",X"7C",X"55",X"70",X"55",X"5C", + X"00",X"00",X"C0",X"00",X"70",X"00",X"5F",X"00",X"55",X"F0",X"D5",X"5C",X"35",X"FC",X"0D",X"5C", + X"5D",X"57",X"F7",X"55",X"D7",X"55",X"DC",X"D5",X"F0",X"37",X"C0",X"35",X"00",X"0D",X"FF",X"FF", + X"CD",X"7C",X"73",X"5C",X"5C",X"FC",X"DC",X"00",X"7C",X"00",X"F0",X"00",X"70",X"00",X"C0",X"00", + X"03",X"FF",X"0D",X"55",X"3F",X"FF",X"00",X"00",X"28",X"02",X"82",X"08",X"00",X"A0",X"00",X"00", + X"55",X"55",X"55",X"55",X"FF",X"FD",X"02",X"AD",X"8A",X"8D",X"28",X"D5",X"0F",X"55",X"F5",X"56", + X"FF",X"FF",X"D5",X"55",X"D5",X"55",X"35",X"54",X"35",X"50",X"35",X"55",X"0F",X"55",X"00",X"FF", + X"55",X"5A",X"55",X"50",X"55",X"50",X"55",X"50",X"55",X"54",X"55",X"55",X"55",X"55",X"FF",X"FF", + X"55",X"DE",X"57",X"57",X"5D",X"55",X"57",X"F5",X"5D",X"55",X"57",X"55",X"55",X"D5",X"AA",X"55", + X"A0",X"00",X"E0",X"00",X"C0",X"00",X"70",X"00",X"70",X"00",X"7C",X"00",X"5E",X"00",X"5E",X"80", + X"AA",X"95",X"0A",X"55",X"09",X"55",X"05",X"55",X"15",X"55",X"55",X"57",X"57",X"FC",X"FF",X"00", + X"5E",X"00",X"5C",X"00",X"5C",X"00",X"5E",X"00",X"7A",X"00",X"EA",X"80",X"00",X"00",X"00",X"00", + X"D5",X"55",X"35",X"55",X"0F",X"55",X"0A",X"D5",X"0A",X"B5",X"0A",X"B5",X"00",X"3D",X"00",X"03", + X"57",X"AA",X"55",X"00",X"55",X"FE",X"55",X"5F",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"7F", + X"00",X"03",X"00",X"0A",X"00",X"0A",X"00",X"AA",X"00",X"0A",X"00",X"00",X"00",X"00",X"00",X"03", + X"57",X"FA",X"D7",X"00",X"D7",X"AA",X"D7",X"AA",X"D5",X"C0",X"D5",X"7A",X"D5",X"5F",X"55",X"55", + X"AA",X"C0",X"00",X"C0",X"AA",X"C0",X"FF",X"C0",X"55",X"FC",X"55",X"57",X"55",X"55",X"F5",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"F0",X"FD",X"5C",X"55",X"5F",X"55",X"55", + X"AF",X"FF",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"30",X"00",X"AC",X"00",X"EA",X"00",X"7F",X"FA", + X"F5",X"7D",X"0D",X"57",X"0D",X"75",X"03",X"5F",X"00",X"D5",X"00",X"35",X"00",X"0F",X"A0",X"00", + X"99",X"99",X"66",X"66",X"9C",X"CC",X"6C",X"CC",X"9E",X"AA",X"6E",X"55",X"9E",X"69",X"6E",X"69", + X"99",X"99",X"66",X"66",X"CC",X"CC",X"CC",X"CC",X"AA",X"AA",X"A5",X"59",X"A6",X"99",X"A6",X"99", + X"9E",X"A9",X"6E",X"A9",X"9E",X"A5",X"6E",X"AA",X"9C",X"CC",X"6C",X"CC",X"99",X"99",X"66",X"66", + X"A6",X"99",X"A6",X"99",X"66",X"99",X"AA",X"AA",X"CC",X"CC",X"CC",X"CC",X"99",X"99",X"66",X"66", + X"99",X"99",X"66",X"66",X"CC",X"CC",X"CC",X"CC",X"AA",X"AA",X"A6",X"99",X"A6",X"99",X"99",X"99", + X"99",X"98",X"66",X"64",X"CC",X"D8",X"CC",X"E4",X"AA",X"D8",X"AA",X"E4",X"AA",X"D8",X"56",X"E4", + X"99",X"99",X"6A",X"59",X"6A",X"59",X"AA",X"AA",X"CC",X"CC",X"CC",X"CC",X"99",X"99",X"66",X"66", + X"A6",X"D8",X"A6",X"E4",X"56",X"D8",X"AA",X"E4",X"CC",X"D8",X"CC",X"E4",X"99",X"98",X"66",X"64", + X"00",X"2A",X"00",X"02",X"0A",X"80",X"2A",X"A2",X"AA",X"AA",X"5A",X"82",X"56",X"80",X"55",X"45", + X"80",X"00",X"A0",X"00",X"A0",X"00",X"80",X"00",X"88",X"00",X"A0",X"00",X"00",X"20",X"40",X"08", + X"55",X"55",X"55",X"58",X"55",X"60",X"55",X"80",X"5A",X"00",X"A8",X"00",X"80",X"00",X"00",X"00", + X"50",X"2A",X"50",X"AA",X"50",X"AA",X"50",X"68",X"11",X"50",X"15",X"40",X"05",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"40",X"00",X"40",X"00",X"80",X"00",X"80",X"00", + X"01",X"00",X"01",X"00",X"02",X"00",X"02",X"00",X"01",X"00",X"01",X"00",X"02",X"00",X"02",X"00", + X"01",X"00",X"01",X"00",X"02",X"00",X"02",X"00",X"01",X"00",X"01",X"00",X"02",X"00",X"02",X"00", + X"01",X"00",X"01",X"00",X"02",X"00",X"02",X"00",X"01",X"00",X"01",X"00",X"02",X"00",X"02",X"00", + X"01",X"00",X"01",X"00",X"02",X"00",X"02",X"00",X"01",X"00",X"01",X"00",X"02",X"00",X"02",X"00", + X"00",X"00",X"02",X"AA",X"00",X"2A",X"00",X"0A",X"00",X"0A",X"00",X"0A",X"00",X"0A",X"00",X"0A", + X"00",X"00",X"AA",X"00",X"A8",X"00",X"A0",X"00",X"A0",X"00",X"A0",X"00",X"A0",X"00",X"A0",X"00", + X"00",X"0A",X"00",X"0A",X"00",X"0A",X"00",X"0A",X"02",X"AA",X"00",X"AA",X"00",X"2A",X"00",X"00", + X"A0",X"00",X"A0",X"00",X"A0",X"00",X"A0",X"00",X"A0",X"00",X"A0",X"00",X"A0",X"00",X"00",X"00", + X"00",X"00",X"0A",X"AA",X"0A",X"AA",X"0A",X"AA",X"02",X"A0",X"00",X"A8",X"00",X"AA",X"00",X"0A", + X"00",X"00",X"AA",X"A0",X"AA",X"A0",X"AA",X"A0",X"00",X"00",X"00",X"00",X"80",X"00",X"A8",X"00", + X"00",X"00",X"00",X"00",X"0A",X"A0",X"0A",X"A0",X"02",X"A8",X"02",X"AA",X"00",X"AA",X"00",X"00", + X"AA",X"80",X"0A",X"A0",X"0A",X"A0",X"0A",X"A0",X"0A",X"A0",X"AA",X"80",X"A8",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"14",X"00",X"40",X"01",X"2A",X"01",X"28",X"04",X"28", + X"00",X"00",X"00",X"00",X"50",X"00",X"05",X"00",X"00",X"40",X"AA",X"10",X"00",X"10",X"00",X"04", + X"04",X"2A",X"04",X"28",X"01",X"28",X"01",X"2A",X"00",X"40",X"00",X"14",X"00",X"01",X"00",X"00", + X"A8",X"04",X"00",X"04",X"00",X"10",X"AA",X"10",X"00",X"40",X"05",X"00",X"50",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"14",X"00",X"40",X"01",X"28",X"01",X"0A",X"04",X"02", + X"00",X"00",X"00",X"00",X"50",X"00",X"05",X"00",X"00",X"40",X"0A",X"10",X"28",X"10",X"20",X"04", + X"04",X"00",X"04",X"02",X"01",X"0A",X"01",X"28",X"00",X"40",X"00",X"14",X"00",X"01",X"00",X"00", + X"80",X"04",X"20",X"04",X"28",X"10",X"0A",X"10",X"00",X"40",X"05",X"00",X"50",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"14",X"00",X"40",X"01",X"00",X"01",X"00",X"04",X"00", + X"00",X"00",X"00",X"00",X"50",X"00",X"05",X"00",X"80",X"40",X"80",X"10",X"80",X"10",X"80",X"04", + X"04",X"00",X"04",X"00",X"01",X"2A",X"01",X"2A",X"00",X"40",X"00",X"14",X"00",X"01",X"00",X"00", + X"80",X"04",X"80",X"04",X"AA",X"10",X"AA",X"10",X"00",X"40",X"05",X"00",X"50",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"14",X"00",X"40",X"01",X"28",X"01",X"28",X"04",X"28", + X"00",X"00",X"00",X"00",X"50",X"00",X"05",X"00",X"00",X"40",X"0A",X"10",X"28",X"10",X"A0",X"04", + X"04",X"2A",X"04",X"28",X"01",X"28",X"01",X"2A",X"00",X"40",X"00",X"14",X"00",X"01",X"00",X"00", + X"A8",X"04",X"02",X"04",X"02",X"10",X"A8",X"10",X"00",X"40",X"05",X"00",X"50",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"14",X"00",X"40",X"01",X"28",X"01",X"28",X"04",X"2A", + X"00",X"00",X"00",X"00",X"50",X"00",X"05",X"00",X"00",X"40",X"0A",X"10",X"0A",X"10",X"AA",X"04", + X"04",X"28",X"04",X"08",X"01",X"0A",X"01",X"02",X"00",X"40",X"00",X"14",X"00",X"01",X"00",X"00", + X"0A",X"04",X"08",X"04",X"28",X"10",X"A0",X"10",X"80",X"40",X"05",X"00",X"50",X"00",X"00",X"00", + X"17",X"FA",X"17",X"FE",X"17",X"FE",X"15",X"FF",X"15",X"7F",X"05",X"5E",X"05",X"57",X"01",X"55", + X"AA",X"AB",X"AA",X"BF",X"AB",X"FF",X"AD",X"EF",X"FF",X"F5",X"FF",X"FF",X"FE",X"D5",X"7F",X"D5", + X"00",X"55",X"00",X"55",X"00",X"15",X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"55",X"55",X"55",X"51",X"55",X"55",X"50",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"55",X"F5",X"40",X"55",X"55",X"D5",X"54",X"55",X"41",X"55",X"54",X"54",X"00",X"55",X"05", + X"55",X"54",X"50",X"00",X"00",X"00",X"01",X"00",X"54",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"05",X"50",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"00",X"15",X"00",X"55",X"00",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"40",X"55",X"50",X"55",X"41",X"55",X"55",X"55",X"55", + X"01",X"55",X"01",X"5F",X"05",X"5F",X"05",X"7B",X"15",X"7F",X"15",X"FE",X"15",X"FA",X"17",X"FA", + X"73",X"D5",X"FF",X"F5",X"FE",X"F7",X"AB",X"FD",X"AA",X"FF",X"AA",X"FF",X"AA",X"BF",X"AA",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"54",X"00",X"50",X"50", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"05",X"50",X"40",X"F5",X"55",X"4F",X"54",X"55",X"01",X"F5",X"55",X"FF",X"94",X"AF",X"F5", + X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"04",X"00",X"51",X"00", + X"57",X"EA",X"17",X"FA",X"15",X"FF",X"05",X"7E",X"05",X"57",X"01",X"55",X"01",X"55",X"00",X"15", + X"AA",X"AA",X"AA",X"BF",X"9A",X"2D",X"FF",X"FF",X"FB",X"FF",X"7F",X"F5",X"55",X"7F",X"55",X"55", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"50",X"05",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"F5",X"F5",X"55",X"3F",X"41",X"D5",X"54",X"75",X"55",X"55",X"45",X"55",X"50",X"50",X"00", + X"55",X"50",X"51",X"40",X"54",X"00",X"00",X"00",X"01",X"00",X"54",X"00",X"00",X"00",X"00",X"00", + X"15",X"40",X"54",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"15",X"01",X"55", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"15",X"40",X"55",X"55",X"55",X"50",X"55",X"55", + X"01",X"55",X"05",X"55",X"05",X"57",X"15",X"7F",X"15",X"FF",X"15",X"FE",X"57",X"FA",X"57",X"EA", + X"55",X"7F",X"7F",X"D5",X"FF",X"FF",X"F7",X"BC",X"2E",X"FF",X"AA",X"AF",X"AA",X"AB",X"AA",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"45",X"55",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00", + X"41",X"54",X"55",X"00",X"5F",X"54",X"F5",X"75",X"FD",X"D4",X"FF",X"F5",X"FF",X"FD",X"AB",X"EF", + X"00",X"00",X"00",X"00",X"00",X"00",X"51",X"40",X"14",X"00",X"50",X"00",X"45",X"40",X"FD",X"55", + X"01",X"55",X"05",X"7F",X"15",X"7F",X"50",X"3F",X"55",X"55",X"58",X"14",X"58",X"14",X"5A",X"96", + X"50",X"00",X"54",X"00",X"55",X"10",X"01",X"54",X"55",X"55",X"25",X"55",X"25",X"44",X"A5",X"04", + X"15",X"55",X"05",X"55",X"20",X"0C",X"20",X"3F",X"20",X"3F",X"28",X"00",X"0A",X"00",X"02",X"AA", + X"55",X"05",X"54",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"0A",X"00",X"28",X"00",X"A0",X"00", + X"01",X"DD",X"1D",X"DD",X"DE",X"AA",X"EA",X"AB",X"2A",X"AB",X"2A",X"AA",X"0A",X"4A",X"09",X"56", + X"DD",X"DC",X"DD",X"DD",X"AA",X"A9",X"AE",X"AA",X"AE",X"AA",X"EB",X"AA",X"B0",X"A8",X"80",X"00", + X"01",X"56",X"01",X"54",X"01",X"54",X"01",X"54",X"3F",X"FF",X"3F",X"FF",X"3F",X"FF",X"3F",X"FF", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00", + X"03",X"FF",X"03",X"FF",X"00",X"FC",X"00",X"FE",X"03",X"CE",X"0A",X"FE",X"2A",X"AA",X"AA",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"00",X"A9",X"80",X"A5",X"60",X"95",X"58",X"55",X"56", + X"15",X"55",X"1F",X"FD",X"1C",X"CD",X"1F",X"FD",X"1C",X"CD",X"1F",X"FD",X"15",X"55",X"15",X"55", + X"55",X"54",X"55",X"54",X"55",X"54",X"57",X"F4",X"57",X"B4",X"57",X"F4",X"57",X"F4",X"57",X"F4", + X"01",X"55",X"05",X"55",X"15",X"55",X"15",X"55",X"15",X"55",X"15",X"55",X"15",X"55",X"05",X"55", + X"55",X"40",X"55",X"50",X"55",X"D4",X"55",X"74",X"55",X"74",X"55",X"74",X"55",X"D4",X"55",X"50", + X"81",X"55",X"AA",X"AA",X"2A",X"55",X"08",X"55",X"08",X"55",X"28",X"15",X"20",X"05",X"A0",X"01", + X"55",X"40",X"A8",X"00",X"5D",X"00",X"5D",X"00",X"55",X"00",X"54",X"00",X"50",X"00",X"40",X"00", + X"05",X"01",X"15",X"99",X"16",X"59",X"16",X"40",X"58",X"00",X"59",X"50",X"56",X"59",X"56",X"65", + X"40",X"50",X"66",X"54",X"65",X"94",X"00",X"94",X"01",X"65",X"05",X"65",X"65",X"95",X"59",X"95", + X"59",X"25",X"58",X"05",X"60",X"01",X"65",X"59",X"65",X"65",X"49",X"65",X"19",X"03",X"00",X"03", + X"59",X"25",X"50",X"29",X"40",X"09",X"65",X"59",X"59",X"59",X"59",X"65",X"C0",X"64",X"C0",X"00", + X"00",X"00",X"00",X"05",X"00",X"55",X"01",X"5F",X"01",X"7C",X"05",X"7C",X"05",X"5F",X"15",X"55", + X"00",X"00",X"50",X"00",X"55",X"00",X"F5",X"40",X"FD",X"40",X"FD",X"50",X"F5",X"50",X"55",X"54", + X"15",X"0A",X"15",X"5A",X"55",X"5A",X"55",X"56",X"55",X"55",X"00",X"0A",X"00",X"22",X"00",X"14", + X"A0",X"54",X"A5",X"54",X"A5",X"55",X"95",X"55",X"55",X"55",X"A0",X"00",X"88",X"00",X"14",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/Snapjack.sv b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/Snapjack.sv new file mode 100644 index 00000000..29bc7662 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/Snapjack.sv @@ -0,0 +1,192 @@ +//============================================================================ +// Arcade: Snapjack +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Snapjack +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Snapjack;;", + //"O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire signed[7:0] audio_s; +reg [6:0] audio; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(440), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_vid), + .ce_pix_actual(ce_vid), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(blankn ? {r} : "0"), + .G(blankn ? {g&g} : "00"), + .B(blankn ? {b} : "0"), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +wire m_bomb = kbjoy[8]; +wire blankn = ~(hblank | vblank); + + +ladybugt ladybugt +( + .CLK_IN(clk_sys), + .I_RESET(status[0] | status[6] | buttons[1]), + .O_PIXCE(ce_vid), + + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_VSYNC(vs), + .O_HSYNC(hs), + .O_VBLANK(vblank), + .O_HBLANK(hblank), + + .O_AUDIO(audio_s), + + .but_coin_s(~{1'b0,m_coin}), + .but_fire_s(~{m_fire,m_fire}), + .but_bomb_s(~{m_bomb,m_bomb}), + .but_tilt_s(~{1'b0,1'b0}), + .but_select_s(~{m_start2,m_start1}), + .but_up_s(~{m_up,m_up}), + .but_down_s(~{m_down,m_down}), + .but_left_s(~{m_left,m_left}), + .but_right_s(~{m_right,m_right}) +); + +assign audio = audio_s; + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/build_id.tcl b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_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/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/build_id.v b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/build_id.v new file mode 100644 index 00000000..ff95db6c --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180103" +`define BUILD_TIME "182358" diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..c3e13c5c --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1094 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..7e8a9995 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,370 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..7d407fb8 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,2027 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..6904b66b --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,220 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..998033ef --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80a.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80a.vhd new file mode 100644 index 00000000..33d61068 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/cpu/T80a.vhd @@ -0,0 +1,280 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core, asynchronous top level +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80a is + generic( + Mode : integer := 0 -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLK_EN_SYS : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80a; + +architecture rtl of T80a is + + signal CEN : std_logic; + signal Reset_s : std_logic; + signal IntCycle_n : std_logic; + signal IORQ : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal MREQ : std_logic; + signal MReq_Inhibit : std_logic; + signal Req_Inhibit : std_logic; + signal RD : std_logic; + signal MREQ_n_i : std_logic; + signal IORQ_n_i : std_logic; + signal RD_n_i : std_logic; + signal WR_n_i : std_logic; + signal RFSH_n_i : std_logic; + signal BUSAK_n_i : std_logic; + signal A_i : std_logic_vector(15 downto 0); + signal DO_Reg : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector (7 downto 0); -- Input synchroniser + signal Wait_s : std_logic; + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + -- clock enable supplied from clocking system + CEN <= CLK_EN_SYS; + + BUSAK_n <= BUSAK_n_i; + MREQ_n_i <= not MREQ or (Req_Inhibit and MReq_Inhibit); + RD_n_i <= not RD or Req_Inhibit; + + MREQ_n <= MREQ_n_i; + IORQ_n <= IORQ_n_i; + RD_n <= RD_n_i; + WR_n <= WR_n_i; + RFSH_n <= RFSH_n_i; + A <= A_i; + DO <= DO_Reg; + +-- process (RESET_n, CLK_n) +-- begin +-- if RESET_n = '0' then +-- Reset_s <= '0'; +-- elsif CLK_n'event and CLK_n = '1' then +-- Reset_s <= '1'; +-- end if; +-- end process; + -- T80 reset input has already proper characteristics: + -- * asynchronous assertion + -- * deassertion synchronous to CLK_n (main_clk) + Reset_s <= RESET_n; + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 1) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n_i, + HALT_n => HALT_n, + WAIT_n => Wait_s, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => Reset_s, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n_i, + CLK_n => CLK_n, + A => A_i, + DInst => DI, + DI => DI_Reg, + DO => DO_Reg, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (CLK_n) + begin + if CLK_n'event and CLK_n = '0' then + if CEN = '1' then + Wait_s <= WAIT_n; + if TState = "011" and BUSAK_n_i = '1' then + DI_Reg <= to_x01(DI); + end if; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + WR_n_i <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + WR_n_i <= '1'; + if TState = "001" then -- To short for IO writes !!!!!!!!!!!!!!!!!!! + WR_n_i <= not Write; + end if; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + Req_Inhibit <= '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and TState = "010" then + Req_Inhibit <= '1'; + else + Req_Inhibit <= '0'; + end if; + end if; + end if; + end process; + + process (Reset_s,CLK_n) + begin + if Reset_s = '0' then + MReq_Inhibit <= '0'; + elsif CLK_n'event and CLK_n = '0' then + if CEN = '1' then + if MCycle = "001" and TState = "010" then + MReq_Inhibit <= '1'; + else + MReq_Inhibit <= '0'; + end if; + end if; + end if; + end process; + + process(Reset_s,CLK_n) + begin + if Reset_s = '0' then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '0'; + elsif CLK_n'event and CLK_n = '0' then + if CEN = '1' then + + if MCycle = "001" then + if TState = "001" then + RD <= IntCycle_n; + MREQ <= IntCycle_n; + IORQ_n_i <= IntCycle_n; + end if; + if TState = "011" then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '1'; + end if; + if TState = "100" then + MREQ <= '0'; + end if; + else + if TState = "001" and NoRead = '0' then + RD <= not Write; + IORQ_n_i <= not IORQ; + MREQ <= not IORQ; + end if; + if TState = "011" then + RD <= '0'; + IORQ_n_i <= '1'; + MREQ <= '0'; + end if; + end if; + + end if; + end if; + end process; + +end; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/dac.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/dac.vhd new file mode 100644 index 00000000..c21b306b --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_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 := 7 + ); + 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/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/dpram.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/hq2x.sv b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_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/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/keyboard.v b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug.vhd new file mode 100644 index 00000000..a1a186fe --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug.vhd @@ -0,0 +1,243 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- Toplevel port for Papilio Plus board. +-- +------------------------------------------------------------------------------- +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + +library ieee; + use ieee.numeric_std.all; + +use work.ladybug_dip_pack.all; + +entity ladybugt is +port ( + -- Global Interface ------------------------------------------------------- + CLK_IN : in std_logic; -- 20MHz + I_RESET : in std_logic; + + -- VGA Interface ---------------------------------------------------------- + O_VIDEO_R : out std_logic_vector( 1 downto 0); + O_VIDEO_G : out std_logic_vector( 1 downto 0); + O_VIDEO_B : out std_logic_vector( 1 downto 0); + O_VSYNC : out std_logic; + O_HSYNC : out std_logic; + O_VBLANK : out std_logic; + O_HBLANK : out std_logic; + O_PIXCE : out std_logic; + + -- Audio Interface -------------------------------------------------------- + O_AUDIO : out signed(7 downto 0); + + but_coin_s : in std_logic_vector( 1 downto 0); + but_fire_s : in std_logic_vector( 1 downto 0); + but_bomb_s : in std_logic_vector( 1 downto 0); + but_tilt_s : in std_logic_vector( 1 downto 0); + but_select_s : in std_logic_vector( 1 downto 0); + but_up_s : in std_logic_vector( 1 downto 0); + but_down_s : in std_logic_vector( 1 downto 0); + but_left_s : in std_logic_vector( 1 downto 0); + but_right_s : in std_logic_vector( 1 downto 0) +); +end ladybugt; + +architecture struct of ladybugt is + + signal + ps2_codeready, + clk_20mhz_s, + clk_en_5mhz_s, + ext_res_n_s, + ext_res_s, + audio_s, + vid_hsync, + vid_vsync, + vga_hsync, + vid_comp_sync_n, + vga_vsync : std_logic; + + signal rom_cpu_a_s : std_logic_vector(14 downto 0); + signal rom_cpu_d_s : std_logic_vector( 7 downto 0); + signal rom_cpu_d1 : std_logic_vector( 7 downto 0); + signal rom_cpu_d2 : std_logic_vector( 7 downto 0); + signal rom_cpu_d3 : std_logic_vector( 7 downto 0); + signal rom_cpu_d4 : std_logic_vector( 7 downto 0); + signal rom_cpu_d5 : std_logic_vector( 7 downto 0); + signal rom_cpu_d6 : std_logic_vector( 7 downto 0); + + signal rom_char_a_s : std_logic_vector(11 downto 0); + signal rom_char_d_s : std_logic_vector(15 downto 0); + + signal rom_sprite_a_s : std_logic_vector(11 downto 0); + signal rom_sprite_d_s : std_logic_vector(15 downto 0); + + signal + dac_audio_s, + dip_block_1_s, + dip_block_2_s : std_logic_vector( 7 downto 0) := (others => '0'); + + signal ps2_scancode : std_logic_vector( 9 downto 0) := (others => '0'); + + signal + vid_rgb, + vga_rgb : std_logic_vector(15 downto 0) := (others => '0'); + + signal but_chute_s : std_logic_vector( 1 downto 0) := (others=>'0'); + +begin + + O_PIXCE <= clk_en_5mhz_s; + + but_chute_s <= not but_coin_s(1) & not but_coin_s(0); + + ----------------------------------------------------------------------------- + -- inputs assignments + ----------------------------------------------------------------------------- + ext_res_s <= I_RESET; + ext_res_n_s <= not ext_res_s; + clk_20mhz_s <= CLK_IN; + + ----------------------------------------------------------------------------- + -- Ladybug Machine + ----------------------------------------------------------------------------- + machine_b : entity work.ladybug_machine + port map ( + ext_res_n_i => ext_res_n_s, + clk_20mhz_i => clk_20mhz_s, + clk_en_5mhz_o => clk_en_5mhz_s, + tilt_n_i => but_tilt_s(0), + player_select_n_i => but_select_s, + player_fire_n_i => but_fire_s, + player_up_n_i => but_up_s, + player_right_n_i => but_right_s, + player_down_n_i => but_down_s, + player_left_n_i => but_left_s, + player_bomb_n_i => but_bomb_s, + right_chute_i => but_chute_s(0), + left_chute_i => but_chute_s(1), + dip_block_1_i => dip_block_1_s, + dip_block_2_i => dip_block_2_s, + rgb_r_o => O_VIDEO_R, + rgb_g_o => O_VIDEO_G, + rgb_b_o => O_VIDEO_B, + hsync_n_o => O_HSYNC, + vsync_n_o => O_VSYNC, + vblank_o => O_VBLANK, + hblank_o => O_HBLANK, + audio_o => O_AUDIO, + rom_cpu_a_o => rom_cpu_a_s, + rom_cpu_d_i => rom_cpu_d_s, + rom_char_a_o => rom_char_a_s, + rom_char_d_i => rom_char_d_s, + rom_sprite_a_o => rom_sprite_a_s, + rom_sprite_d_i => rom_sprite_d_s + ); + + ----------------------------------------------------------------------------- + -- Building the DIP Switches - see file ladybug_dip_pack.vhd + ----------------------------------------------------------------------------- +-- dip_block_1_s <= lb_dip_block_1_c; -- Lady Bug +-- dip_block_1_s <= do_dip_block_1_c; -- Dorodon + dip_block_1_s <= ca_dip_block_1_c; -- Cosmic Avenger + dip_block_2_s <= price_dip_block_2_c; -- Common for all games (coins per game pricing) + + ----------------------------------------------------------------------------- + -- Game ROMs + ----------------------------------------------------------------------------- + inst_rom_spritel : entity work.rom_sprite_l + port map ( + CLK => clk_20mhz_s, + ADDR => rom_sprite_a_s, + DATA => rom_sprite_d_s( 7 downto 0) + ); + + inst_rom_spriteu : entity work.rom_sprite_u + port map ( + CLK => clk_20mhz_s, + ADDR => rom_sprite_a_s, + DATA => rom_sprite_d_s(15 downto 8) + ); + + inst_rom_charl : entity work.rom_char_l + port map ( + CLK => clk_20mhz_s, + ADDR => rom_char_a_s, + DATA => rom_char_d_s( 7 downto 0) + ); + + inst_rom_charu : entity work.rom_char_u + port map ( + CLK => clk_20mhz_s, + ADDR => rom_char_a_s, + DATA => rom_char_d_s(15 downto 8) + ); + + inst_rom_cpu1 : entity work.rom_cpu1 + port map ( + CLK => clk_20mhz_s, + ADDR => rom_cpu_a_s(12 downto 0), + DATA => rom_cpu_d1 + ); + + inst_rom_cpu2 : entity work.rom_cpu2 + port map ( + CLK => clk_20mhz_s, + ADDR => rom_cpu_a_s(12 downto 0), + DATA => rom_cpu_d2 + ); + + inst_rom_cpu3 : entity work.rom_cpu3 + port map ( + CLK => clk_20mhz_s, + ADDR => rom_cpu_a_s(12 downto 0), + DATA => rom_cpu_d3 + ); + + ----------------------------------------------------------------------------- + -- Program ROMs data mux + ----------------------------------------------------------------------------- + rom_cpu_d_s <= + rom_cpu_d1 when rom_cpu_a_s(14 downto 13) = "00" else + rom_cpu_d2 when rom_cpu_a_s(14 downto 13) = "01" else + rom_cpu_d3 when rom_cpu_a_s(14 downto 13) = "10" else + (others=>'0'); + +end struct; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_addr_dec.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_addr_dec.vhd new file mode 100644 index 00000000..6d857f6c --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_addr_dec.vhd @@ -0,0 +1,130 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_addr_dec.vhd,v 1.10 2005/12/10 14:51:46 arnim Exp $ +-- +-- Address decoder of the CPU Unit. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_addr_dec is + + port ( + clk_20mhz_i : in std_logic; + res_n_i : in std_logic; + a_i : in std_logic_vector(15 downto 12); + rd_n_i : in std_logic; + wr_n_i : in std_logic; + mreq_n_i : in std_logic; + rfsh_n_i : in std_logic; + cs_n_o : out std_logic_vector(15 downto 0); + ram_cpu_cs_n_o : out std_logic + ); + +end ladybug_addr_dec; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_addr_dec is + +begin + + ----------------------------------------------------------------------------- + -- Process adec + -- + -- Purpose: + -- Decode the CPU address and generate one-hot chip select signals. + -- Each chip select enables a 4 KByte address segment. + -- + -- The chip select outputs are registered with the 20 MHz clock to + -- break potentially long combinational paths here. + -- + adec: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + cs_n_o <= (others => '1'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- default assignment + cs_n_o <= (others => '1'); + + if a_i(15) = '0' then + if rd_n_i = '0' or wr_n_i = '0' then + cs_n_o(to_integer(unsigned( '0' & a_i(14 downto 12) ))) <= '0'; + end if; + + else + if mreq_n_i = '0' and rfsh_n_i = '1' then + cs_n_o(to_integer(unsigned( '1' & a_i(14 downto 12) ))) <= '0'; + end if; + + end if; + + end if; + end process adec; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process cs_ext_ram + -- + -- Purpose: + -- Builds the combinational chip select signal for the external CPU RAM. + -- + cs_ext_ram: process (a_i, + rd_n_i, wr_n_i) + begin + if (rd_n_i = '0' or wr_n_i = '0') and + a_i(15 downto 12) = "0110" then + ram_cpu_cs_n_o <= '0'; + else + ram_cpu_cs_n_o <= '1'; + end if; + end process cs_ext_ram; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_char.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_char.vhd new file mode 100644 index 00000000..1ca149f3 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_char.vhd @@ -0,0 +1,740 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_char.vhd,v 1.18 2005/10/10 22:02:14 arnim Exp $ +-- +-- Character Video Module of Lady Bug Machine. +-- +-- This unit contains most of the logic found on schematic page three. +-- Excluded parts are: +-- * the 10 MHz and 5 MHz clock generation +-- moved into separate module on toplevel of Lady Bug machine +-- * the video timing circuitry +-- moved into separate module on toplevel of video unit +-- * the video MUX and RGB conversion unit +-- moved into separate module at toplevel of video unit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity ladybug_char is + port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + res_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_4mhz_i : in std_logic; + -- CPU Interface ---------------------------------------------------------- + cs10_n_i : in std_logic; + cs13_n_i : in std_logic; + a_i : in std_logic_vector(10 downto 0); + rd_n_i : in std_logic; + wr_n_i : in std_logic; + wait_n_o : out std_logic; + d_from_cpu_i : in std_logic_vector( 7 downto 0); + d_from_char_o : out std_logic_vector( 7 downto 0); + -- RGB Video Interface ---------------------------------------------------- + h_i : in std_logic_vector( 3 downto 0); + h_t_i : in std_logic_vector( 3 downto 0); + ha_t_rise_i : in std_logic; + hx_i : in std_logic; + v_i : in std_logic_vector( 3 downto 0); + v_t_i : in std_logic_vector( 3 downto 0); + hbl_i : in std_logic; + blank_flont_i : in std_logic; + blank_o : out std_logic; + crg_o : out std_logic_vector( 5 downto 1); + vblank_o : out std_logic; + hblank_o : out std_logic; + -- Character ROM Interface ------------------------------------------------ + rom_char_a_o : out std_logic_vector(11 downto 0); + rom_char_d_i : in std_logic_vector(15 downto 0) + ); + +end ladybug_char; + +architecture rtl of ladybug_char is + + signal flip_screen_q : std_logic; + + signal h0_s, + h1_s, + h2_s : std_logic; + signal h_flip_s, + h_t_flip_s : std_logic_vector(3 downto 0); + signal v_flip_s, + v_t_flip_s : std_logic_vector(3 downto 0); + + signal h_ctrl_d_s, + h_ctrl_s, + h_ctrl_n_s, + h_ctrl_d_out_s, + h_ctrl_d_n_out_s, + h_ctrl_rise_s, + h_ctrl_n_rise_s : std_logic_vector(4 downto 1); + + signal hx_ctrl_q, + hx_ctrl_s, + hx_ctrl_n_rise_s : std_logic; + signal hx_ctrl_clear_q : std_logic; + + signal b1_ff_q, + b1_ff_s, + b1_ff_n_rise_s : std_logic; + + signal wait_q : std_logic; + signal wait_clear_q : std_logic; + + signal cgs_q, + cgs_s, + cgs_rise_s : std_logic; + + signal ram_addr_s : std_logic_vector(9 downto 0); + signal select_a_s : std_logic; + + signal char_ram_cs_n_s, + char_ram_we_n_s : std_logic; + signal col_ram_cs_n_s, + col_ram_we_n_s : std_logic; + signal d_from_char_ram_s : std_logic_vector(7 downto 0); + signal d_from_col_ram_s : std_logic_vector(3 downto 0); + + signal s_q : std_logic_vector( 7 downto 0); + signal d_char_ram_q : std_logic_vector( 7 downto 0); + signal d_col_ram_q : std_logic_vector( 3 downto 0); + + signal d_char_rom_q : std_logic_vector(15 downto 0); + signal crg1_s, + crg2_s, + crg3_q, + crg4_q, + crg5_q : std_logic; + + signal hbl_q,hbl_d : std_logic; + + signal hcnt : integer; + signal vdd_s : std_logic; + +begin + + vdd_s <= '1'; + + ----------------------------------------------------------------------------- + -- Process flip + -- + -- Purpose: + -- Implement the flip_screen flag. + -- + flip: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + -- Actually, this asynchronous reset of the ls259 is not 100% + -- equivalent to the real behavior of this circuit. However, + -- the flip_screen latch is modelled like this for the sake of + -- simplicity. It's sufficient for the purpose here. + flip_screen_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if a_i(2 downto 0) = "000" and cs10_n_i = '0' then + flip_screen_q <= d_from_cpu_i(0); + end if; + + end if; + end process flip; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process h_flip + -- + -- Purpose: + -- Build the flipped horizontal timing signals. + -- + h_flip: process (flip_screen_q, + h_i, h_t_i, + s_q) + variable a_v, b_v, + sum_v : unsigned(8 downto 0); + begin + -- calculate sum + a_v := '0' & unsigned(s_q); + b_v := '0' & unsigned(h_t_i) & unsigned(h_i); + sum_v := a_v + b_v; + + -- h0,1,2 are taken from directly from sum + h0_s <= sum_v(0); + h1_s <= sum_v(1); + h2_s <= sum_v(2); + + -- now flip + for idx in 3 downto 0 loop + h_flip_s(idx) <= flip_screen_q xor sum_v(idx); + h_t_flip_s(idx) <= flip_screen_q xor sum_v(idx + 4); + end loop; + end process h_flip; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process v_flip + -- + -- Purpose: + -- Build the flipped horizontal timing signals. + -- + v_flip: process (flip_screen_q, + v_i, v_t_i) + begin + for idx in 3 downto 0 loop + v_flip_s(idx) <= flip_screen_q xor v_i(idx); + v_t_flip_s(idx) <= flip_screen_q xor v_t_i(idx); + end loop; + end process v_flip; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- The Horizontal Control Signals + -- Detailed purpose/meaning is unknown. + ----------------------------------------------------------------------------- + h_ctrl_d_s(1) <= not (not h2_s and (h1_s xor h0_s)); + h_ctrl_d_s(2) <= hx_i; + h_ctrl_d_s(3) <= not ((h1_s xor h0_s) or (not h2_s xor h1_s)); + h_ctrl_d_s(4) <= '0'; + h_ctrl_b : entity work.ttl_175 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => clk_en_5mhz_i, + por_n_i => por_n_i, + cl_n_i => vdd_s, + d_i => h_ctrl_d_s, + q_o => h_ctrl_s, + q_n_o => h_ctrl_n_s, + d_o => h_ctrl_d_out_s, + d_n_o => h_ctrl_d_n_out_s + ); + h_ctrl_rise_s <= not h_ctrl_s and h_ctrl_d_out_s; + h_ctrl_n_rise_s <= h_ctrl_s and not h_ctrl_d_n_out_s; + + + ----------------------------------------------------------------------------- + -- Process ctrl_seq + -- + -- Purpose: + -- Implemente the various sequential elements for horizontal control. + -- + ctrl_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + hx_ctrl_q <= '0'; + hx_ctrl_clear_q <= '0'; + b1_ff_q <= '0'; + wait_q <= '0'; + wait_clear_q <= '0'; + cgs_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- the HX control flip-flop + hx_ctrl_q <= hx_ctrl_s; + + -- the clear counterpart of hx_ctrl_q + if h_ctrl_s(2) = '0' then + -- pseudo-asynchronous clear + hx_ctrl_clear_q <= '0'; + elsif hx_ctrl_n_rise_s = '1' then + -- rising edge indicator acts as clock enable instead of clock + hx_ctrl_clear_q <= '1'; + end if; + + -- the mysterious B1 flip-flop + b1_ff_q <= b1_ff_s; + + -- the CGS rising edge indicator support flip-flops + cgs_q <= cgs_s; + + -- the WAIT flip-flop + if wait_clear_q = '1' then + -- pseudo-asynchronous clear + wait_q <= '0'; + elsif cgs_rise_s = '1' then + -- rising edge indicator acts as clock enable instead of clock + wait_q <= '1'; + end if; + + -- the clear counterpart of wait_q + if clk_en_4mhz_i = '1' then + wait_clear_q <= wait_q and (h_ctrl_s(3) and (b1_ff_q or hx_ctrl_q)); + end if; + + end if; + end process ctrl_seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process ctrl_comp + -- + -- Purpose: + -- Implements the combination logic for the horizontal control + -- elements. + -- + ctrl_comp: process (h_ctrl_rise_s, + hx_i, hx_ctrl_q, + hx_ctrl_clear_q, + h_ctrl_n_rise_s, + b1_ff_q, + cgs_q, cs13_n_i) + begin + -- default assignments + hx_ctrl_s <= hx_ctrl_q; + hx_ctrl_n_rise_s <= '0'; + b1_ff_s <= b1_ff_q; + b1_ff_n_rise_s <= '0'; + cgs_s <= cgs_q; + cgs_rise_s <= '0'; + + -- the HX control flip-flop ----------------------------------------------- + if hx_ctrl_clear_q = '1' then + -- pseudo-asynchronous clear + hx_ctrl_s <= '0'; + + if (not hx_ctrl_q) = '0' then + -- detct rising edge of inverted ouput + hx_ctrl_n_rise_s <= '1'; + end if; + elsif h_ctrl_rise_s(1) = '1' then + -- rising edge indicator acts as clock enable instead of clock + if hx_i = '1' then + -- toggle FF + hx_ctrl_s <= not hx_ctrl_q; + + if (not hx_ctrl_q) = '0' then + -- detct rising edge of inverted ouput + hx_ctrl_n_rise_s <= '1'; + end if; + end if; + end if; + + -- the mysterious B1 flip-flop -------------------------------------------- + if hx_ctrl_q = '1' then + -- pseudo-asynchronous clear + b1_ff_s <= '0'; + + if (not b1_ff_q) = '0' then + -- detct rising edge of inverted ouput + b1_ff_n_rise_s <= '1'; + end if; + elsif h_ctrl_n_rise_s(3) = '1' then + -- rising edge indicator acts as clock enable instead of clock + b1_ff_s <= '1'; + end if; + + -- the CGS rising edge indicator support flip-flop ------------------------ + cgs_s <= not cs13_n_i; + cgs_rise_s <= not cgs_q and not cs13_n_i; + + end process ctrl_comp; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process ram_addr + -- + -- Purpose: + -- Multiplexes the CPU address bus and the h+v timing control signals to + -- form the RAM address bus. + -- + ram_addr: process (h_flip_s, h_t_flip_s, + v_flip_s, v_t_flip_s, + a_i, + h_ctrl_s, h_ctrl_n_s, + hx_ctrl_q, + b1_ff_q) + variable a_v, b_v, g_n_v : std_logic; + variable vec_v : std_logic_vector(1 downto 0); + begin + -- default assignment + ram_addr_s <= (others => '0'); + + -- logic that drives A input of IC L4 and K4 + a_v := not (h_ctrl_n_s(1) and (b1_ff_q or hx_ctrl_q)); + -- logic that drives B input of IC L4 and K4 + b_v := hx_ctrl_q; + -- logic that drives /G input of IC J4 + g_n_v := hx_ctrl_q and (h_ctrl_n_s(1) and (b1_ff_q or hx_ctrl_q)); + + -- IC L4 and K4: Dual 4:1 Multiplexer ------------------------------------- + vec_v := b_v & a_v; + case vec_v is + when "00" => + ram_addr_s(0) <= h_flip_s (3); + ram_addr_s(1) <= h_t_flip_s(0); + -- + ram_addr_s(2) <= h_t_flip_s(1); + ram_addr_s(3) <= h_t_flip_s(2); + when "01" => + ram_addr_s(0) <= a_i (0); + ram_addr_s(1) <= a_i (1); + -- + ram_addr_s(2) <= a_i (2); + ram_addr_s(3) <= a_i (3); + when "10" => + ram_addr_s(0) <= v_t_flip_s(1); + ram_addr_s(1) <= v_t_flip_s(2); + -- + ram_addr_s(2) <= v_t_flip_s(3); + ram_addr_s(3) <= '0'; + when "11" => + ram_addr_s(0) <= a_i (0); + ram_addr_s(1) <= a_i (1); + -- + ram_addr_s(2) <= a_i (2); + ram_addr_s(3) <= a_i (3); + when others => + null; + end case; + + -- IC J4 and H4: Quad 2:1 Multiplexer ------------------------------------- + case a_v is + when '0' => + ram_addr_s(4) <= h_t_flip_s(3) and not g_n_v; + ram_addr_s(7) <= v_t_flip_s(1) and not g_n_v; + ram_addr_s(8) <= v_t_flip_s(2) and not g_n_v; + ram_addr_s(9) <= v_t_flip_s(3) and not g_n_v; + -- + ram_addr_s(5) <= v_flip_s (3); + ram_addr_s(6) <= v_t_flip_s(0); + when '1' => + ram_addr_s(4) <= a_i (4) and not g_n_v; + ram_addr_s(7) <= a_i (7) and not g_n_v; + ram_addr_s(8) <= a_i (8) and not g_n_v; + ram_addr_s(9) <= a_i (9) and not g_n_v; + -- + ram_addr_s(5) <= a_i (5); + ram_addr_s(6) <= a_i (6); + when others => + null; + end case; + + select_a_s <= a_v; + + end process ram_addr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process ram_ctrl + -- + -- Purpose: + -- Generate the control signals for the character and color RAMs. + -- This comprises: + -- * reading RAMs while the beam sweeps the screen + -- * reading RAMs to the CPU + -- * writing RAMs from the CPU + -- + ram_ctrl: process (cs13_n_i, + wait_q, + select_a_s, + a_i, + wr_n_i, rd_n_i, + d_from_char_ram_s, d_from_col_ram_s, + clk_en_4mhz_i) + variable cpu_read_char_ram_v : boolean; + variable cpu_write_char_ram_v : boolean; + variable cpu_read_col_ram_v : boolean; + variable cpu_write_col_ram_v : boolean; + variable vec_v : std_logic_vector(2 downto 0); + begin + -- default assignments + char_ram_cs_n_s <= '1'; + char_ram_we_n_s <= '1'; + col_ram_cs_n_s <= '1'; + col_ram_we_n_s <= '1'; + d_from_char_o <= (others => '1'); + cpu_read_char_ram_v := false; + cpu_write_char_ram_v := false; + cpu_read_col_ram_v := false; + cpu_write_col_ram_v := false; + + -- detect and decode CPU access + if clk_en_4mhz_i = '1' and -- operate RAMs with CPU clock + (not cs13_n_i and select_a_s and not wait_q) = '1' then + vec_v := a_i(10) & rd_n_i & wr_n_i; + case vec_v is + when "001" => + cpu_read_char_ram_v := true; + when "010" => + cpu_write_char_ram_v := true; + when "101" => + cpu_read_col_ram_v := true; + when "110" => + cpu_write_col_ram_v := true; + when others => + null; + end case; + end if; + + -- now we are prepared to generate the /CS and /WE signals for the RAMs + if select_a_s = '0' or + cpu_read_char_ram_v or cpu_write_char_ram_v then + char_ram_cs_n_s <= '0'; + end if; + if select_a_s = '0' or + cpu_read_col_ram_v or cpu_write_col_ram_v then + col_ram_cs_n_s <= '0'; + end if; + if cpu_write_char_ram_v then + char_ram_we_n_s <= '0'; + end if; + if cpu_write_col_ram_v then + col_ram_we_n_s <= '0'; + end if; + + -- and we can multiplex the data bus towards the CPU + if cpu_read_char_ram_v then + d_from_char_o <= d_from_char_ram_s; + elsif cpu_read_col_ram_v then + d_from_char_o(3 downto 0) <= d_from_col_ram_s; + end if; + + end process ram_ctrl; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- The character RAM + ----------------------------------------------------------------------------- + char_ram_b : entity work.ladybug_char_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_4mhz_i, + a_i => ram_addr_s, + cs_n_i => char_ram_cs_n_s, + we_n_i => char_ram_we_n_s, + d_i => d_from_cpu_i, + d_o => d_from_char_ram_s + ); + ----------------------------------------------------------------------------- + -- The color RAM + ----------------------------------------------------------------------------- + col_ram_b : entity work.ladybug_char_col_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_4mhz_i, + a_i => ram_addr_s, + cs_n_i => col_ram_cs_n_s, + we_n_i => col_ram_we_n_s, + d_i => d_from_cpu_i(3 downto 0), + d_o => d_from_col_ram_s + ); + + + ----------------------------------------------------------------------------- + -- Process ram_d_seq + -- + -- Purpose: + -- Implements three latch banks that save the output of the character + -- and color RAMs. + -- + ram_d_seq: process (clk_20mhz_i, por_n_i) + variable complex_rising_edge_v : boolean; + begin + if por_n_i = '0' then + s_q <= (others => '0'); + d_char_ram_q <= (others => '0'); + d_col_ram_q <= (others => '0'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- latch data from the character RAM to form input for h_flip ----------- + if hx_ctrl_n_rise_s = '1' then + s_q <= d_from_char_ram_s; + end if; + + -- latch data from the character RAM for ROM address generation --------- + -- there are three sources for a rising edge: + -- 1) falling edge of h_ctrl_n_s(1) + -- => equivalen to rising edge of h_ctrl_s(1) + -- 2) rising edge of hx_ctrl_n_q + -- 3) rising edge of b1_ff_n + -- For each source, the two have to be in a defined state to let + -- the edge propage to the latches. + complex_rising_edge_v := ((h_ctrl_rise_s(1) and + (b1_ff_q or hx_ctrl_q)) or + (hx_ctrl_n_rise_s and + (not b1_ff_q and not h_ctrl_n_s(1))) or + (b1_ff_n_rise_s and + (not hx_ctrl_q and not h_ctrl_s(1)))) = '1'; + if complex_rising_edge_v then + d_char_ram_q <= d_from_char_ram_s; + d_col_ram_q <= d_from_col_ram_s; + end if; + + end if; + end process ram_d_seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process latch_rom_d + -- + -- Purpose: + -- Latch the output of the character ROM. + -- + latch_rom_d: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + d_char_rom_q <= (others => '0'); + crg3_q <= '0'; + crg4_q <= '0'; + crg5_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if (clk_en_5mhz_i and + h2_s and h1_s and h0_s) = '1' then + d_char_rom_q <= rom_char_d_i; + crg3_q <= d_col_ram_q(0); + crg4_q <= d_col_ram_q(1); + crg5_q <= d_col_ram_q(2); + end if; + + end if; + end process latch_rom_d; + -- + ----------------------------------------------------------------------------- + -- Process hbl_seq + -- + -- Purpose: + -- Implements the flip-flop that latches HBL. + -- + hbl_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + hbl_q <= '0'; + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if clk_en_5mhz_i = '1' then + if hcnt /= 255 then + hcnt <= hcnt + 1; + end if; + end if; + if ha_t_rise_i = '1' then + hbl_q <= hbl_i; + if hbl_q = '1' and hbl_i = '0' then + hcnt <= 0; + end if; + end if; + end if; + end process hbl_seq; + -- + ----------------------------------------------------------------------------- + + process (clk_20mhz_i) + begin + if rising_edge(clk_20mhz_i) then + if clk_en_5mhz_i = '1' then + hbl_d <= hbl_q; + + if hcnt < 240 then + hblank_o <= '0'; + else + hblank_o <= '1'; + end if; + + if hbl_d = '0' and hbl_q = '1' then + vblank_o <= not blank_flont_i; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Process crg_mux + -- + -- Purpose: + -- Multiplexes the latched character ROM data to CRG1 and CRG2. + -- + crg_mux: process (d_char_rom_q, + h_flip_s, + blank_flont_i, + hbl_q) + variable blank_v : std_logic; + variable idx_v : unsigned(2 downto 0); + begin + blank_v := not (blank_flont_i and not hbl_q); + idx_v := unsigned(h_flip_s(2 downto 0)); + + if blank_v = '0' then + crg1_s <= d_char_rom_q(to_integer('0' & idx_v)); + crg2_s <= d_char_rom_q(to_integer('1' & idx_v)); + else + crg1_s <= '0'; + crg2_s <= '0'; + end if; + + blank_o <= blank_v; + end process crg_mux; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + wait_n_o <= not wait_q; + crg_o(5) <= crg5_q; + crg_o(4) <= crg4_q; + crg_o(3) <= crg3_q; + crg_o(2) <= crg2_s; + crg_o(1) <= crg1_s; + rom_char_a_o( 2 downto 0) <= v_flip_s(2 downto 0); + rom_char_a_o(10 downto 3) <= d_char_ram_q; + rom_char_a_o(11) <= d_col_ram_q(3); + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_chute.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_chute.vhd new file mode 100644 index 00000000..b3255fe0 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_chute.vhd @@ -0,0 +1,130 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_chute.vhd,v 1.3 2005/10/10 21:21:20 arnim Exp $ +-- +-- Pulse shaper for a chute input. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_chute is + + port ( + clk_20mhz_i : in std_logic; + res_n_i : in std_logic; + chute_i : in std_logic; + chute_o : out std_logic + ); + +end ladybug_chute; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_chute is + + -- 2.35e-2 s = 1 / 20,000,000 Hz * 470000 + constant chute_delay_c : natural := 470000; + + signal chute_cnt_q : unsigned(18 downto 0); + + signal chute_sync_q : std_logic_vector(1 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process sync + -- + -- Purpose: + -- Synchronize the asynchronous chute input. + -- + sync: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + chute_sync_q <= (others => '0'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + chute_sync_q(0) <= chute_i; + chute_sync_q(1) <= chute_sync_q(0); + + end if; + end process sync; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process cnt + -- + -- Purpose: + -- Count the required number of 20 MHz clock cycles before emitting + -- chute event. This is a low pass filter for the rising edge of chute_i. + -- + cnt: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + chute_cnt_q <= (others => '0'); + chute_o <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if chute_sync_q(1) = '1' then + if chute_cnt_q = chute_delay_c then + chute_o <= '1'; + else + chute_cnt_q <= chute_cnt_q + 1; + end if; + + else + -- reset counter when chute input goes back to 0 + chute_cnt_q <= (others => '0'); + chute_o <= '0'; + + end if; + + end if; + end process cnt; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_chutes.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_chutes.vhd new file mode 100644 index 00000000..7584de89 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_chutes.vhd @@ -0,0 +1,134 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_chutes.vhd,v 1.4 2005/10/10 21:21:20 arnim Exp $ +-- +-- Pulse shaping for the two chute inputs. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_chutes is + + port ( + clk_20mhz_i : in std_logic; + res_n_i : in std_logic; + right_chute_i : in std_logic; + left_chute_i : in std_logic; + cs8_n_i : in std_logic; + nmi_n_o : out std_logic; + int_n_o : out std_logic + ); + +end ladybug_chutes; + +architecture rtl of ladybug_chutes is + + signal right_chute_s, + left_chute_s : std_logic; + signal left_chute_q : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Pulse shaper for Right Chute + ----------------------------------------------------------------------------- + right_chute_b : entity work.ladybug_chute + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + chute_i => right_chute_i, + chute_o => right_chute_s + ); + + + ----------------------------------------------------------------------------- + -- Pulse shaper for Left Chute + ----------------------------------------------------------------------------- + left_chute_b : entity work.ladybug_chute + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + chute_i => left_chute_i, + chute_o => left_chute_s + ); + + + ----------------------------------------------------------------------------- + -- Process left_edge + -- + -- Purpose: + -- Implement the edge detector for the left chute. + -- Only a rising edge of the filtered chute input can trigger a new + -- interrupt to the CPU. + -- + left_edge: process (clk_20mhz_i, res_n_i) + begin + if res_n_i = '0' then + left_chute_q <= '0'; + int_n_o <= '1'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + left_chute_q <= left_chute_s; + + if cs8_n_i = '0' then + -- synchronous set, has priority over data path + int_n_o <= '1'; + + -- edge detector + elsif left_chute_s = '1' and left_chute_q = '0' then + int_n_o <= '0'; + + end if; + + end if; + end process left_edge; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + nmi_n_o <= not right_chute_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_clk.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_clk.vhd new file mode 100644 index 00000000..d3e00484 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_clk.vhd @@ -0,0 +1,158 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_clk.vhd,v 1.5 2005/10/28 21:17:41 arnim Exp $ +-- +-- Clock generator for the Lady Bug machine. +-- +-- This module generates the clock enables which are required to mimic the +-- different clocks of the Lady Bug boards. +-- +-- Theory of Operation: +-- A PLL is used to tune the external clock to 20 MHz. This forms the +-- main clock which is used by all sequential elements. +-- All derived clocks are built with clock enables to allow a synchronous +-- design style (sort of). +-- +-- Note: +-- The counters and enable signals are reset by the power-on reset. +-- Thus, the "derived clocks" run during normal system reset. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_clk is + + port ( + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + clk_en_10mhz_o : out std_logic; + clk_en_10mhz_n_o : out std_logic; + clk_en_5mhz_o : out std_logic; + clk_en_5mhz_n_o : out std_logic; + clk_en_4mhz_o : out std_logic + ); + +end ladybug_clk; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_clk is + + -- counter for 5 MHz and 10 MHz clock enables + signal clk_cnt_5mhz_q : unsigned(1 downto 0); + -- counter for 4 MHz clock enable + signal clk_cnt_4mhz_q : unsigned(2 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process clk_en + -- + -- Purpose: + -- Generates the clock enables for 10 MHz, 5 MHz, 4 MHz. + -- + clk_en: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + clk_cnt_5mhz_q <= (others => '0'); + clk_cnt_4mhz_q <= (others => '0'); + clk_en_10mhz_o <= '0'; + clk_en_10mhz_n_o <= '0'; + clk_en_5mhz_o <= '0'; + clk_en_5mhz_n_o <= '0'; + clk_en_4mhz_o <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + + ------------------------------------------------------------------------- + -- 10 MHz / 5 MHz clock domain + -- + -- counter for 10 MHz and 5 MHz clock enables + clk_cnt_5mhz_q <= clk_cnt_5mhz_q + 1; + + -- generate clock enable for 10 MHz + -- enable on every second clock of clk_20mhz_i + clk_en_10mhz_o <= clk_cnt_5mhz_q(0); + -- enable with 180 deg phase shift + clk_en_10mhz_n_o <= not clk_cnt_5mhz_q(0); + + -- generate clock enables for 5 MHz: + -- enable on every forth clock of clk_20mhz_i + if clk_cnt_5mhz_q = "11" then + clk_en_5mhz_o <= '1'; + else + clk_en_5mhz_o <= '0'; + end if; + -- enable with 180 deg phase shift + if clk_cnt_5mhz_q = "01" then + clk_en_5mhz_n_o <= '1'; + else + clk_en_5mhz_n_o <= '0'; + end if; + -- + ------------------------------------------------------------------------- + + + ------------------------------------------------------------------------- + -- 4 MHz domain + -- + -- counter for 4 MHz clock enable, wrap around after 5 clocks + clk_en_4mhz_o <= clk_cnt_4mhz_q(2); + + if clk_cnt_4mhz_q = "100" then + clk_cnt_4mhz_q <= (others => '0'); + else + clk_cnt_4mhz_q <= clk_cnt_4mhz_q + 1; + end if; + -- + ------------------------------------------------------------------------- + + end if; + end process clk_en; + -- + ----------------------------------------------------------------------------- + + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_counter.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_counter.vhd new file mode 100644 index 00000000..d07256bb --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_counter.vhd @@ -0,0 +1,95 @@ +------------------------------------------------------------------------------- +-- +-- Synchronous 8-Bit Binary Counter with preset. +-- +-- $Id: ladybug_counter.vhd,v 1.9 2005/10/10 21:59:13 arnim Exp $ +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity counter is +port ( + ck_i : in std_logic; + ck_en_i : in std_logic; + reset_n_i : in std_logic; + load_i : in std_logic; + preset_i : in std_logic_vector(7 downto 0); + q_o : out std_logic_vector(7 downto 0); + rise_q_o : out std_logic_vector(7 downto 0); + d_o : out std_logic_vector(7 downto 0); + co_o : out std_logic +); +end counter; + +architecture rtl of counter is + signal cnt_q : std_logic_vector(7 downto 0); + signal cnt_s : std_logic_vector(7 downto 0); +begin + + seq: process (ck_i, reset_n_i) + begin + if reset_n_i = '0' then + cnt_q <= (others => '0'); + elsif rising_edge(ck_i) then + cnt_q <= cnt_s; + end if; + end process seq; + + adder: process (ck_en_i, cnt_q, load_i, preset_i) + begin + cnt_s <= cnt_q; + + if ck_en_i = '1' then + if load_i = '1' then + cnt_s <= preset_i; + else + cnt_s <= cnt_q + 1; + end if; + end if; + end process adder; + + co_o <= '1' when cnt_q = x"FF" else '0'; + rise_q_o <= cnt_s and not cnt_q; + q_o <= cnt_q; + d_o <= cnt_s; +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_cpu_unit.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_cpu_unit.vhd new file mode 100644 index 00000000..7d41074f --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_cpu_unit.vhd @@ -0,0 +1,260 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_cpu_unit.vhd,v 1.19 2005/12/10 14:51:51 arnim Exp $ +-- +-- CPU Main Unit of the Lady Bug Machine. +-- +-- Actually, the PCB where the CPU resides on contains also the sound chips and +-- parts of the video controller. For the sake of simplicity, the CPU and chip +-- select logic has been moved into this separate unit. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_cpu_unit is + port ( + clk_20mhz_i : in std_logic; + clk_en_4mhz_i : in std_logic; + res_n_i : in std_logic; + rom_cpu_a_o : out std_logic_vector(14 downto 0); + rom_cpu_d_i : in std_logic_vector( 7 downto 0); + sound_wait_n_i : in std_logic; + wait_n_i : in std_logic; + right_chute_i : in std_logic; + left_chute_i : in std_logic; + gpio_in0_i : in std_logic_vector( 7 downto 0); + gpio_in1_i : in std_logic_vector( 7 downto 0); + gpio_in2_i : in std_logic_vector( 7 downto 0); + gpio_in3_i : in std_logic_vector( 7 downto 0); + gpio_extra_i : in std_logic_vector( 7 downto 0); + a_o : out std_logic_vector(10 downto 0); + d_to_cpu_i : in std_logic_vector( 7 downto 0); + d_from_cpu_o : out std_logic_vector( 7 downto 0); + rd_n_o : out std_logic; + wr_n_o : out std_logic; + cs7_n_o : out std_logic; + cs10_n_o : out std_logic; + cs11_n_o : out std_logic; + cs12_n_o : out std_logic; + cs13_n_o : out std_logic + ); + +end ladybug_cpu_unit; + +architecture struct of ladybug_cpu_unit is + + signal t80_clk_en_s : std_logic; + + signal wait_n_s : std_logic; + signal int_n_s : std_logic; + signal nmi_n_s : std_logic; + signal mreq_n_s : std_logic; + signal rd_n_s : std_logic; + signal wr_n_s : std_logic; + signal rfsh_n_s : std_logic; + signal m1_n_s : std_logic; + signal a_s : std_logic_vector(15 downto 0); + signal d_to_cpu_s : std_logic_vector( 7 downto 0); + signal d_from_cpu_s : std_logic_vector( 7 downto 0); + signal d_from_rom_s, + d_decrypted_s, + d_rom_mux_s : std_logic_vector( 7 downto 0); + signal d_from_ram_s : std_logic_vector( 7 downto 0); + signal d_from_gpio_s : std_logic_vector( 7 downto 0); + + signal cs_n_s : std_logic_vector(15 downto 0); + + signal ram_cpu_cs_n_s : std_logic; + + signal vcc_s : std_logic; + +begin + vcc_s <= '1'; + + wait_n_s <= sound_wait_n_i and wait_n_i; + + ----------------------------------------------------------------------------- + -- The T80 CPU + ----------------------------------------------------------------------------- + -- "wait" has to be modelled with the clock enable because the T80 is not + -- able to enlarge write accesses properly when they are delayed with "wait" + t80_clk_en_s <= clk_en_4mhz_i and wait_n_s; + T80a_b : entity work.T80a + generic map ( + Mode => 0 + ) + port map ( + RESET_n => res_n_i, + CLK_n => clk_20mhz_i, + CLK_EN_SYS => t80_clk_en_s, + WAIT_n => wait_n_s, + INT_n => int_n_s, + NMI_n => nmi_n_s, + BUSRQ_n => vcc_s, + M1_n => m1_n_s, + MREQ_n => mreq_n_s, + IORQ_n => open, + RD_n => rd_n_s, + WR_n => wr_n_s, + RFSH_n => rfsh_n_s, + HALT_n => open, + BUSAK_n => open, + A => a_s, + DI => d_to_cpu_s, + DO => d_from_cpu_s + ); + d_from_cpu_o <= d_from_cpu_s; + + + ----------------------------------------------------------------------------- + -- The CPU RAM + ----------------------------------------------------------------------------- + cpu_ram_b : entity work.ladybug_cpu_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_4mhz_i, + a_i => a_s(11 downto 0), + cs_n_i => cs_n_s(6), + we_n_i => wr_n_s, + d_i => d_from_cpu_s, + d_o => d_from_ram_s + ); + + ----------------------------------------------------------------------------- + -- The Address Decoder + ----------------------------------------------------------------------------- + addr_dec_b : entity work.ladybug_addr_dec + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + a_i => a_s(15 downto 12), + rd_n_i => rd_n_s, + wr_n_i => wr_n_s, + mreq_n_i => mreq_n_s, + rfsh_n_i => rfsh_n_s, + cs_n_o => cs_n_s, + ram_cpu_cs_n_o => ram_cpu_cs_n_s + ); + + + ----------------------------------------------------------------------------- + -- The General Purpose IO + ----------------------------------------------------------------------------- + gpio_b : entity work.ladybug_gpio + port map ( + a_i => a_s(1 downto 0), + cs_in_n_i => cs_n_s(9), + cs_extra_n_i => cs_n_s(14), + in0_i => gpio_in0_i, + in1_i => gpio_in1_i, + in2_i => gpio_in2_i, + in3_i => gpio_in3_i, + extra_i => gpio_extra_i, + d_o => d_from_gpio_s + ); + + + ----------------------------------------------------------------------------- + -- The Coin Chutes + ----------------------------------------------------------------------------- + coin_chutes_b : entity work.ladybug_chutes + port map ( + clk_20mhz_i => clk_20mhz_i, + res_n_i => res_n_i, + right_chute_i => right_chute_i, + left_chute_i => left_chute_i, + cs8_n_i => cs_n_s(8), + nmi_n_o => nmi_n_s, + int_n_o => int_n_s + ); + + + ----------------------------------------------------------------------------- + -- Decrytion PROMs + ----------------------------------------------------------------------------- + + decrypt_prom : entity work.prom_decrypt + port map ( + CLK => clk_20mhz_i, + ADDR => rom_cpu_d_i, + DATA => d_decrypted_s + ); + + ----------------------------------------------------------------------------- + -- Only opcodes (i.e. instruction fetches) have to be decrypted + ----------------------------------------------------------------------------- + d_rom_mux_s <= d_decrypted_s when m1_n_s = '0' else rom_cpu_d_i; + + ----------------------------------------------------------------------------- + -- Gate Data Bus from ROM + -- The ROM puts data on the data bus within the CPU Main Unit so we do + -- gating here. + ----------------------------------------------------------------------------- + d_from_rom_s <= d_rom_mux_s + when cs_n_s(0) = '0' or cs_n_s(1) = '0' or cs_n_s(2) = '0' or + cs_n_s(3) = '0' or cs_n_s(4) = '0' or cs_n_s(5) = '0' else + (others => '1'); + + + ----------------------------------------------------------------------------- + -- Combine Data Buses + -- Uses an AND of all incoming buses from submodules. Each module has to + -- drive ones when not active so we can save logic complexity here. + ----------------------------------------------------------------------------- + d_to_cpu_s <= d_to_cpu_i and d_from_rom_s and d_from_ram_s and d_from_gpio_s; + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + a_o <= a_s(10 downto 0); + rom_cpu_a_o <= a_s(14 downto 0); + rd_n_o <= rd_n_s; + wr_n_o <= wr_n_s; + cs7_n_o <= cs_n_s(7); + cs10_n_o <= cs_n_s(10); + cs11_n_o <= cs_n_s(11); + cs12_n_o <= cs_n_s(12); + cs13_n_o <= cs_n_s(13); + +end struct; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_dip_pack.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_dip_pack.vhd new file mode 100644 index 00000000..ebff8ec4 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_dip_pack.vhd @@ -0,0 +1,142 @@ +------------------------------------------------------------------------------- +-- +-- $Id: ladybug_dip_pack-p.vhd,v 1.4 2005/10/10 20:52:04 arnim Exp $ +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +package ladybug_dip_pack is + + ----------------------------------------------------------------------------- + -- DIP switch settings for Lady Bug + ----------------------------------------------------------------------------- + constant lb_dip_block_1_c : std_logic_vector(7 downto 0) := + -- Lives ------------------------------------------------------------------ + -- 0 = 5 Lives + -- 1 = 3 Lives + '0' & + -- Free Play -------------------------------------------------------------- + -- 0 = Free Play + -- 1 = No Free Play + '1' & + -- Cabinet ---------------------------------------------------------------- + -- 0 = Upright + -- 1 = Cocktail + '0' & + -- Screen Freeze ---------------------------------------------------------- + -- 0 = Freeze + -- 1 = No Freeze + '1' & + -- Rack Test (Cheat) ------------------------------------------------------ + -- 0 = On + -- 1 = Off + '1' & + -- High Score Initials ---------------------------------------------------- + -- 0 = 3-Letter Initials + -- 1 = 10-Letter Initials + '1' & + -- Difficulty ------------------------------------------------------------- + -- 11 = Easy + -- 10 = Medium + -- 01 = Hard + -- 00 = Hardest + "10"; + + ----------------------------------------------------------------------------- + -- DIP switch settings for Dorodon + ----------------------------------------------------------------------------- + constant do_dip_block_1_c : std_logic_vector(7 downto 0) := + -- Lives ------------------------------------------------------------------ + -- 0 = 5 Lives + -- 1 = 3 Lives + '0' & + -- Free Play -------------------------------------------------------------- + -- 0 = Free Play + -- 1 = No Free Play + '1' & + -- Cabinet ---------------------------------------------------------------- + -- 0 = Upright + -- 1 = Cocktail + '0' & + -- Screen Freeze ---------------------------------------------------------- + -- 0 = Freeze + -- 1 = No Freeze + '1' & + -- Rack Test (Cheat) ------------------------------------------------------ + -- 0 = On + -- 1 = Off + '1' & + -- Bonus Life ------------------------------------------------------------- + -- 0 = 40000 + -- 1 = 20000 + '1' & + -- Difficulty ------------------------------------------------------------- + -- 11 = Easy + -- 10 = Medium + -- 01 = Hard + -- 00 = Hardest + "10"; + + + ----------------------------------------------------------------------------- + -- DIP switch settings for Cosmic Avenger + ----------------------------------------------------------------------------- + constant ca_dip_block_1_c : std_logic_vector(7 downto 0) := + -- Lives per Game --------------------------------------------------------- + -- 00 = 2 Lives + -- 11 = 3 Lives + -- 10 = 4 Lives + -- 01 = 5 Lives + "01" & + -- Initial High Score ----------------------------------------------------- + -- 00 = 0 + -- 11 = 5000 + -- 10 = 8000 + -- 01 = 10000 + "11" & + -- Cabinet ---------------------------------------------------------------- + -- 0 = Upright + -- 1 = Cocktail + '0' & + -- High Score Names ------------------------------------------------------- + -- 0 = 3 Letters + -- 1 = 10 Letters + '1' & + -- Difficulty ------------------------------------------------------------- + -- 11 = Easy + -- 10 = Medium + -- 01 = Hard + -- 00 = Hardest + "10"; + + constant price_dip_block_2_c : std_logic_vector(7 downto 0) := + -- Pricing Options -------------------------------------------------------- + -- 1111 = 1 coin 1 credit + -- 1110 = 1 coin 2 credits + -- 1101 = 1 coin 3 credits + -- 1100 = 1 coin 4 credits + -- 1011 = 1 coin 5 credits + -- 1010 = 2 coins 1 credit + -- 1001 = 2 coins 3 credits + -- 1000 = 3 coins 1 credit + -- 0111 = 3 coins 2 credit + -- 0110 = 4 coins 1 credit + -- 0101 = 1 coin 1 credit + -- 0100 = 1 coin 1 credit + -- 0011 = 1 coin 1 credit + -- 0010 = 1 coin 1 credit + -- 0001 = 1 coin 1 credit + -- 0000 = 1 coin 1 credit + -- + -- Left Chute + "1111" & + -- Right Chute + "1111"; + +end ladybug_dip_pack; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_gpio.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_gpio.vhd new file mode 100644 index 00000000..6ca21711 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_gpio.vhd @@ -0,0 +1,139 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_gpio.vhd,v 1.3 2005/10/10 21:21:20 arnim Exp $ +-- +-- General purpose IO input for CPU Main Unit. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_gpio is + + port ( + a_i : in std_logic_vector(1 downto 0); + cs_in_n_i : in std_logic; + cs_extra_n_i : in std_logic; + in0_i : in std_logic_vector(7 downto 0); + in1_i : in std_logic_vector(7 downto 0); + in2_i : in std_logic_vector(7 downto 0); + in3_i : in std_logic_vector(7 downto 0); + extra_i : in std_logic_vector(7 downto 0); + d_o : out std_logic_vector(7 downto 0) + ); + +end ladybug_gpio; + + +architecture rtl of ladybug_gpio is + +begin + + ----------------------------------------------------------------------------- + -- Process gpio + -- + -- Purpose: + -- Multiplex the IN and EXTRA inputs onto the data bus for CPU. + -- + gpio: process (a_i, + cs_in_n_i, + cs_extra_n_i, + in0_i, + in1_i, + in2_i, + in3_i, + extra_i) + variable cs_n_v : std_logic_vector(1 downto 0); + begin + -- default assignment with inactive bus value + d_o <= (others => '1'); + + cs_n_v := cs_extra_n_i & cs_in_n_i; + case cs_n_v is + -- IN ports and DIP switches selected ----------------------------------- + when "10" => + case a_i is + -- IN 0 addressed + when "00" => + d_o <= in0_i; + -- IN 1 addressed + when "01" => + d_o <= in1_i; + -- DIP 0 addressed + when "10" => + d_o <= in2_i; + -- DIP 1 addressed + when "11" => + d_o <= in3_i; + + when others => + null; + end case; + + -- Extra bank selected -------------------------------------------------- + when "01" => + case a_i is + when "00" => + d_o(1) <= extra_i(7); + d_o(0) <= extra_i(3); + when "01" => + d_o(1) <= extra_i(6); + d_o(0) <= extra_i(2); + when "10" => + d_o(1) <= extra_i(5); + d_o(0) <= extra_i(1); + when "11" => + d_o(1) <= extra_i(4); + d_o(0) <= extra_i(0); + when others => + null; + end case; + + when others => + null; + end case; + + end process gpio; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_machine.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_machine.vhd new file mode 100644 index 00000000..584b8391 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_machine.vhd @@ -0,0 +1,295 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_machine.vhd,v 1.23 2006/02/07 00:44:21 arnim Exp $ +-- +-- Toplevel of the Lady Bug machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ladybug_machine is + port ( + -- Clock and Reset Interface ---------------------------------------------- + ext_res_n_i : in std_logic; + clk_20mhz_i : in std_logic; + clk_en_10mhz_o : out std_logic; + clk_en_5mhz_o : out std_logic; + por_n_o : out std_logic; + -- Control Interface ------------------------------------------------------ + tilt_n_i : in std_logic; + player_select_n_i : in std_logic_vector( 1 downto 0); + player_fire_n_i : in std_logic_vector( 1 downto 0); + player_up_n_i : in std_logic_vector( 1 downto 0); + player_right_n_i : in std_logic_vector( 1 downto 0); + player_down_n_i : in std_logic_vector( 1 downto 0); + player_left_n_i : in std_logic_vector( 1 downto 0); + player_bomb_n_i : in std_logic_vector( 1 downto 0); + right_chute_i : in std_logic; + left_chute_i : in std_logic; + -- DIP Switch Interface --------------------------------------------------- + dip_block_1_i : in std_logic_vector( 7 downto 0); + dip_block_2_i : in std_logic_vector( 7 downto 0); + -- RGB Video Interface ---------------------------------------------------- + rgb_r_o : out std_logic_vector( 1 downto 0); + rgb_g_o : out std_logic_vector( 1 downto 0); + rgb_b_o : out std_logic_vector( 1 downto 0); + hsync_n_o : out std_logic; + vsync_n_o : out std_logic; + comp_sync_n_o : out std_logic; + vblank_o : out std_logic; + hblank_o : out std_logic; + -- Audio Interface -------------------------------------------------------- + audio_o : out signed( 7 downto 0); + -- CPU ROM Interface ------------------------------------------------------ + rom_cpu_a_o : out std_logic_vector(14 downto 0); + rom_cpu_d_i : in std_logic_vector( 7 downto 0); + -- Character ROM Interface ------------------------------------------------ + rom_char_a_o : out std_logic_vector(11 downto 0); + rom_char_d_i : in std_logic_vector(15 downto 0); + -- Sprite ROM Interface --------------------------------------------------- + rom_sprite_a_o : out std_logic_vector(11 downto 0); + rom_sprite_d_i : in std_logic_vector(15 downto 0) + ); + + +end ladybug_machine; + +architecture struct of ladybug_machine is + + -- Clock System ------------------------------------------------------------- + signal clk_en_10mhz_s, + clk_en_10mhz_n_s : std_logic; + signal clk_en_5mhz_s, + clk_en_5mhz_n_s : std_logic; + signal clk_en_4mhz_s : std_logic; + + -- Reset System ------------------------------------------------------------- + signal por_n_s : std_logic; + signal res_n_s : std_logic; + + signal sound_wait_n_s : std_logic; + signal wait_n_s : std_logic; + signal a_s : std_logic_vector(10 downto 0); + signal d_to_cpu_s, + d_from_cpu_s, + d_from_video_s : std_logic_vector( 7 downto 0); + signal rd_n_s, + wr_n_s : std_logic; + signal cs7_n_s, + cs10_n_s, + cs11_n_s, + cs12_n_s, + cs13_n_s : std_logic; + signal vc_s, + vbl_tick_n_s, + vbl_buf_s : std_logic; + + signal gpio_in0_s, + gpio_in1_s, + gpio_in2_s, + gpio_in3_s, + gpio_extra_s : std_logic_vector( 7 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Clock Generator + ----------------------------------------------------------------------------- + clk_b : entity work.ladybug_clk + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_s, + clk_en_10mhz_o => clk_en_10mhz_s, + clk_en_10mhz_n_o => clk_en_10mhz_n_s, + clk_en_5mhz_o => clk_en_5mhz_s, + clk_en_5mhz_n_o => clk_en_5mhz_n_s, + clk_en_4mhz_o => clk_en_4mhz_s + ); + -- + clk_en_5mhz_o <= clk_en_5mhz_s; + clk_en_10mhz_o <= clk_en_10mhz_s; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Reset Generator + ----------------------------------------------------------------------------- + res_b : entity work.ladybug_res + port map ( + clk_20mhz_i => clk_20mhz_i, + ext_res_n_i => ext_res_n_i, + res_n_o => res_n_s, + por_n_o => por_n_s + ); + -- + por_n_o <= por_n_s; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Joystick and DIP Switch Mapping + ----------------------------------------------------------------------------- + gpio_in0_s <= tilt_n_i & + player_select_n_i(1) & + player_select_n_i(0) & + player_fire_n_i(0) & + player_up_n_i(0) & + player_right_n_i(0) & + player_down_n_i(0) & + player_left_n_i(0); + gpio_in1_s <= vbl_buf_s & + vbl_tick_n_s & + vc_s & + player_fire_n_i(1) & + player_up_n_i(1) & + player_right_n_i(1) & + player_down_n_i(1) & + player_left_n_i(1); + gpio_in2_s <= dip_block_1_i; + gpio_in3_s <= dip_block_2_i; + gpio_extra_s <= player_bomb_n_i(1) & + '1' & + '1' & + '1' & + player_bomb_n_i(0) & + '1' & + '1' & + '1'; + + + ----------------------------------------------------------------------------- + -- CPU Unit + ----------------------------------------------------------------------------- + cpu_b : entity work.ladybug_cpu_unit + port map ( + clk_20mhz_i => clk_20mhz_i, + clk_en_4mhz_i => clk_en_4mhz_s, + res_n_i => res_n_s, + rom_cpu_a_o => rom_cpu_a_o, + rom_cpu_d_i => rom_cpu_d_i, + + sound_wait_n_i => sound_wait_n_s, + wait_n_i => wait_n_s, + right_chute_i => right_chute_i, + left_chute_i => left_chute_i, + gpio_in0_i => gpio_in0_s, + gpio_in1_i => gpio_in1_s, + gpio_in2_i => gpio_in2_s, + gpio_in3_i => gpio_in3_s, + gpio_extra_i => gpio_extra_s, + a_o => a_s, + d_to_cpu_i => d_to_cpu_s, + d_from_cpu_o => d_from_cpu_s, + rd_n_o => rd_n_s, + wr_n_o => wr_n_s, + cs7_n_o => cs7_n_s, + cs10_n_o => cs10_n_s, + cs11_n_o => cs11_n_s, + cs12_n_o => cs12_n_s, + cs13_n_o => cs13_n_s + ); + + ----------------------------------------------------------------------------- + -- Bus Multiplexer + ----------------------------------------------------------------------------- + d_to_cpu_s <= d_from_video_s when (cs7_n_s and cs13_n_s) = '0' else (others => '1'); + + ----------------------------------------------------------------------------- + -- Video Unit + ----------------------------------------------------------------------------- + video_b : entity work.ladybug_video_unit + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_s, + res_n_i => res_n_s, + clk_en_10mhz_i => clk_en_10mhz_s, + clk_en_10mhz_n_i => clk_en_10mhz_n_s, + clk_en_5mhz_i => clk_en_5mhz_s, + clk_en_5mhz_n_i => clk_en_5mhz_n_s, + clk_en_4mhz_i => clk_en_4mhz_s, + cs7_n_i => cs7_n_s, + cs10_n_i => cs10_n_s, + cs13_n_i => cs13_n_s, + a_i => a_s, + rd_n_i => rd_n_s, + wr_n_i => wr_n_s, + wait_n_o => wait_n_s, + d_from_cpu_i => d_from_cpu_s, + d_from_video_o => d_from_video_s, + vc_o => vc_s, + vbl_tick_n_o => vbl_tick_n_s, + vbl_buf_o => vbl_buf_s, + rgb_r_o => rgb_r_o, + rgb_g_o => rgb_g_o, + rgb_b_o => rgb_b_o, + hsync_n_o => hsync_n_o, + vsync_n_o => vsync_n_o, + comp_sync_n_o => comp_sync_n_o, + vblank_o => vblank_o, + hblank_o => hblank_o, + rom_char_a_o => rom_char_a_o, + rom_char_d_i => rom_char_d_i, + rom_sprite_a_o => rom_sprite_a_o, + rom_sprite_d_i => rom_sprite_d_i + ); + + ----------------------------------------------------------------------------- + -- Sound Unit + ----------------------------------------------------------------------------- + sound_b : entity work.ladybug_sound_unit + port map ( + clk_20mhz_i => clk_20mhz_i, + clk_en_4mhz_i => clk_en_4mhz_s, + por_n_i => por_n_s, + cs11_n_i => cs11_n_s, + cs12_n_i => cs12_n_s, + wr_n_i => wr_n_s, + d_from_cpu_i => d_from_cpu_s, + sound_wait_n_o => sound_wait_n_s, + audio_o => audio_o + ); + +end struct; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_rams.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_rams.vhd new file mode 100644 index 00000000..578d08e7 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_rams.vhd @@ -0,0 +1,340 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_char_ram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video character RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 8 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_char_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 7 downto 0); + d_o : out std_logic_vector( 7 downto 0) + ); + +end ladybug_char_ram; + +architecture struct of ladybug_char_ram is + + signal d_s : std_logic_vector(7 downto 0); + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,8) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_s + ); + + -- gate the data output for and'ing on CPU bus + d_o <= d_s when cs_n_i = '0' else (others => '1'); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite_ram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video sprite RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 8 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_sprite_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 7 downto 0); + d_o : out std_logic_vector( 7 downto 0) + ); + +end ladybug_sprite_ram; + +architecture struct of ladybug_sprite_ram is + + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,8) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_o + ); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_char_col_ram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video character color RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 4 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_char_col_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 3 downto 0); + d_o : out std_logic_vector( 3 downto 0) + ); + +end ladybug_char_col_ram; + +architecture struct of ladybug_char_col_ram is + + signal d_s : std_logic_vector(3 downto 0); + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,4) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_s + ); + + -- gate the data output for and'ing on CPU bus + d_o <= d_s when cs_n_i = '0' else (others => '1'); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite_vram.vhd,v 1.1 2005/11/06 15:42:13 arnim Exp $ +-- +-- Wrapper for technology dependent video sprite VRAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 1 K x 4 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_sprite_vram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(9 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 3 downto 0); + d_o : out std_logic_vector( 3 downto 0) + ); + +end ladybug_sprite_vram; + +architecture struct of ladybug_sprite_vram is + + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram_inst: work.spram generic map(10,4) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_o + ); + +end struct; + +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_cpu_ram.vhd,v 1.1 2005/11/06 15:43:38 arnim Exp $ +-- +-- Wrapper for technology dependent CPU RAM. +-- +-- Xilinx flavor. +-- +-- Instantiate 4 K x 8 synchronous RAM. +-- +-- The clock enable of the controller clock is not attached to the RAM to +-- emulate the asynchronous read behavior of the original RAM. Read data is +-- available within a clock cycle of the controller although it takes two +-- cycles of the main clock to get the data from the RAM macro. +-- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_cpu_ram is + + port ( + clk_i : in std_logic; + clk_en_i : in std_logic; + a_i : in std_logic_vector(11 downto 0); + cs_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector( 7 downto 0); + d_o : out std_logic_vector( 7 downto 0) + ); + +end ladybug_cpu_ram; + +architecture struct of ladybug_cpu_ram is + + signal d_s : std_logic_vector(7 downto 0); + signal we_s : std_logic; + +begin + + -- generate write enable at same clock edge as controller logic + -- this might suppress intermediate writes when address bus changes + -- during write cycle + we_s <= not cs_n_i and not we_n_i and clk_en_i; + + ram1_inst: work.spram generic map(12,8) + port map + ( + address => a_i, + clock => clk_i, + data => d_i, + wren => we_s, + q => d_s + ); + + -- gate the data output for and'ing on CPU bus + d_o <= d_s when cs_n_i = '0' else (others => '1'); + +end struct; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_res.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_res.vhd new file mode 100644 index 00000000..85998a10 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_res.vhd @@ -0,0 +1,148 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_res.vhd,v 1.8 2005/10/10 20:52:04 arnim Exp $ +-- +-- Reset generator for the Lady Bug machine. +-- +-- This module generates a reset signal for the whole system synchronous to +-- the main clock. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +library ieee; +use ieee.numeric_std.all; + +entity ladybug_res is + + port ( + clk_20mhz_i : in std_logic; + ext_res_n_i : in std_logic; + res_n_o : out std_logic; + por_n_o : out std_logic + ); + +end ladybug_res; + +architecture rtl of ladybug_res is + + -- 4.7e-2 s = 1 / 20,000,000 Hz * 940000 + constant res_delay_c : natural := 940000; + + signal res_sync_n_q : std_logic_vector(1 downto 0); + + signal res_delay_q : unsigned(19 downto 0); + signal res_n_q : std_logic; + + signal por_cnt_q : unsigned(1 downto 0) := "00"; + signal por_n_q : std_logic := '0'; +begin + + por_n_o <= por_n_q; + res_n_o <= res_n_q; + + ----------------------------------------------------------------------------- + -- Process por_cnt + -- + -- Purpose: + -- Generate a power-on reset for 4 clock cycles. + -- + por_cnt: process (clk_20mhz_i) + begin + if clk_20mhz_i'event and clk_20mhz_i = '1' then + if por_cnt_q = "11" then + por_n_q <= '1'; + else + por_cnt_q <= por_cnt_q + 1; + end if; + end if; + end process por_cnt; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process res_sync + -- + -- Purpose: + -- Synchronize asynchronous external reset to main 20 MHz clock. + -- + res_sync: process (clk_20mhz_i, ext_res_n_i, por_n_q) + begin + if ext_res_n_i = '0' or por_n_q = '0' then + res_sync_n_q <= (others => '0'); + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + res_sync_n_q(0) <= '1'; + res_sync_n_q(1) <= res_sync_n_q(0); + end if; + end process res_sync; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process res_delay + -- + -- Purpose: + -- Delay reset event (external or power-on) by 4.7e-2 s. + -- Reset delay is taken from Lady Bug reset circuit using NE555. + -- This duration might be too long for the actual requirements of the + -- FPGA circuit. + -- + res_delay: process (clk_20mhz_i, res_sync_n_q) + begin + if res_sync_n_q(1) = '0' then + res_delay_q <= (others => '0'); + res_n_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if res_delay_q = res_delay_c then + res_n_q <= '1'; + else + res_delay_q <= res_delay_q + 1; + end if; + end if; + end process res_delay; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_rgb.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_rgb.vhd new file mode 100644 index 00000000..1bfcd53c --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_rgb.vhd @@ -0,0 +1,135 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_rgb.vhd,v 1.4 2005/10/10 22:02:14 arnim Exp $ +-- +-- RGB Generation Module of the Lady Bug Machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_rgb is + + port ( + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + crg_i : in std_logic_vector(5 downto 1); + sig_i : in std_logic_vector(4 downto 1); + rgb_r_o : out std_logic_vector(1 downto 0); + rgb_g_o : out std_logic_vector(1 downto 0); + rgb_b_o : out std_logic_vector(1 downto 0) + ); + +end ladybug_rgb; + +architecture rtl of ladybug_rgb is + + signal a_s : std_logic_vector(5 downto 1); + signal rgb_s : std_logic_vector(8 downto 1); + signal rgb_n_q : std_logic_vector(8 downto 1); + +begin + + ----------------------------------------------------------------------------- + -- Process addr + -- + -- Purpose: + -- Generates the PROM address. + -- + addr: process (crg_i, + sig_i) + variable sig_and_v : std_logic; + begin + sig_and_v := sig_i(1) and sig_i(2) and sig_i(3) and sig_i(4); + + a_s(5) <= crg_i(1) and sig_and_v; + + if not (sig_and_v and (crg_i(1) or crg_i(2))) = '0' then + a_s(4 downto 1) <= crg_i(2) & crg_i(5) & crg_i(4) & crg_i(3); + else + a_s(4 downto 1) <= sig_i; + end if; + + end process addr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- The RGB Conversion PROM + ----------------------------------------------------------------------------- + rgb_prom_b : entity work.prom_10_2 + port map ( + CLK => clk_20mhz_i, + ADDR => a_s, + DATA => rgb_s + ); + + ----------------------------------------------------------------------------- + -- Process rgb_latch + -- + -- Purpose: + -- Implements the output latch for the RGB values. + -- + rgb_latch: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + rgb_n_q <= (others => '1'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if clk_en_5mhz_i = '1' then + rgb_n_q <= not rgb_s; + end if; + end if; + end process rgb_latch; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + rgb_r_o <= rgb_n_q(5+1) & rgb_n_q(0+1); + rgb_g_o <= rgb_n_q(6+1) & rgb_n_q(2+1); + rgb_b_o <= rgb_n_q(7+1) & rgb_n_q(4+1); + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_sprite.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_sprite.vhd new file mode 100644 index 00000000..941d997c --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_sprite.vhd @@ -0,0 +1,857 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite.vhd,v 1.12 2005/10/10 22:02:14 arnim Exp $ +-- +-- Sprite Video Module of Lady Bug Machine. +-- +-- This unit contains the whole sprite logic which is distributed on the +-- CPU and video boards. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity ladybug_sprite is +port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + res_n_i : in std_logic; + clk_en_10mhz_i : in std_logic; + clk_en_10mhz_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_5mhz_n_i : in std_logic; + -- CPU Interface ---------------------------------------------------------- + cs7_n_i : in std_logic; + a_i : in std_logic_vector( 9 downto 0); + d_from_cpu_i : in std_logic_vector( 7 downto 0); + -- RGB Video Interface ---------------------------------------------------- + h_i : in std_logic_vector( 3 downto 0); + h_t_i : in std_logic_vector( 3 downto 0); + hx_i : in std_logic; + ha_d_i : in std_logic; + v_i : in std_logic_vector( 3 downto 0); + v_t_i : in std_logic_vector( 3 downto 0); + vbl_n_i : in std_logic; + vbl_d_n_i : in std_logic; + vc_d_i : in std_logic; + blank_flont_i : in std_logic; + blank_i : in std_logic; + sig_o : out std_logic_vector( 4 downto 1); + -- Sprite ROM Interface --------------------------------------------------- + rom_sprite_a_o : out std_logic_vector(11 downto 0); + rom_sprite_d_i : in std_logic_vector(15 downto 0) +); + +end ladybug_sprite; + +architecture rtl of ladybug_sprite is + + signal sprite_ram_cs_n_s, + sprite_ram_we_n_s, + clk_5mhz_n_q, + clk_en_eck_s, + clk_en_rd_s, + clk_en_5ck_n_s, + clk_en_6ck_n_s, + clk_en_7ck_n_s, + clk_en_b7_p3_s, + clk_en_e7_3_s, + s6ck_n_s, + s7ck_n_s, + e5_p8_s, + a8_p5_n_s, + ct0_s, + ct1_s, + cr_mux_sel_s, + ck_inh_s, + ck_inh_n_q, + qh1_s, + qh2_s : std_logic; + + signal rb_s, + rb_unflip_s, + rc_s : std_logic_vector( 7 downto 0); + + signal c_s : std_logic_vector(10 downto 0); + signal v_cnt_s : std_logic_vector( 4 downto 0); + signal ra_s : std_logic_vector( 9 downto 0); + + signal ma_s : std_logic_vector(11 downto 0); + signal ma_q : std_logic_vector(11 downto 6); + signal mb_q : std_logic_vector( 1 downto 0); + signal mc_q : std_logic_vector( 6 downto 0); + signal cl_q : std_logic_vector( 4 downto 0); + + signal j7_s : std_logic_vector( 2 downto 0); + signal df_muxed_s : std_logic_vector( 7 downto 0); + + signal lu_a_s : std_logic_vector( 4 downto 0); + signal lu_d_s : std_logic_vector( 7 downto 0); + signal lu_d_mux_s : std_logic_vector( 3 downto 0); + + signal rd_shift_s, + rd_shift_int, + rd_vram_s : std_logic_vector(15 downto 0); + signal rs_s, + rs_int, + rs_n_s : std_logic_vector( 3 downto 0); + signal rs_enable_s : std_logic; + signal shift_oc_n_s : std_logic; + + signal j6_shifter : std_logic_vector( 3 downto 0); + signal h6_shifter : std_logic_vector( 3 downto 0); + signal ctrl_lu_a_s : std_logic_vector( 4 downto 0); + signal ctrl_lu_d_s : std_logic_vector( 7 downto 0); + signal v_cnt_a5_a6_s : std_logic_vector( 7 downto 0); + + signal ctrl_lu_q_d_s, + ctrl_lu_q : std_logic_vector( 6 downto 1); + + signal vram_we_n_s : std_logic; + signal vram_a6_in_s, + vram_a6_out_s, + vram_b6_in_s, + vram_b6_out_s, + vram_c6_in_s, + vram_c6_out_s, + vram_d6_in_s, + vram_d6_out_s : std_logic_vector( 3 downto 0); + + signal ca_q : std_logic_vector( 3 downto 1); + signal ca6_s, + ca7_s, + ca8_s : std_logic; + signal x_s : std_logic_vector( 5 downto 0); + + signal cr_s : std_logic_vector( 9 downto 0); + + signal vram_q : std_logic_vector(15 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- The Vertical Counters C5 D5 + ----------------------------------------------------------------------------- + v_cnt_c5_c6_b : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + v_cnt_s <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if clk_en_b7_p3_s = '1' then + if e5_p8_s = '0' then + v_cnt_s <= (v_t_i & "0"); + else + v_cnt_s <= v_cnt_s + 1; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Counter J7 + ----------------------------------------------------------------------------- + j7_b : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + j7_s <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if clk_en_10mhz_i = '1' then + if s6ck_n_s = '0' then + j7_s <= not mc_q(6) & mc_q(6) & '0'; + elsif (ct0_s or ct1_s or a8_p5_n_s or ck_inh_s) = '0' then + j7_s <= j7_s + 1; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Sprite VRAM Counters A5 A6 + ----------------------------------------------------------------------------- + ct0_s <= v_cnt_a5_a6_s(0); + ct1_s <= v_cnt_a5_a6_s(1); + x_s <= v_cnt_a5_a6_s(7 downto 2); + + v_cnt_a5_a6_b : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + v_cnt_a5_a6_s <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if clk_en_10mhz_i = '1' then + if s7ck_n_s = '0' then + v_cnt_a5_a6_s(7 downto 4) <= (rb_s(7 downto 4)); + v_cnt_a5_a6_s(3 downto 0) <= (rb_s(3 downto 2) & not rc_s(7) & not rc_s(6)); + elsif ck_inh_n_q = '1' then + v_cnt_a5_a6_s <=v_cnt_a5_a6_s + 1; + end if; + end if; + end if; + end process; + + ----------------------------------------------------------------------------- + -- Process sprite_ram_ctrl + -- + -- Purpose: + -- Generates the control signals for the sprite RAM. + -- + sprite_ram_ctrl: process ( cs7_n_i, + vbl_n_i, + a_i, + c_s, v_cnt_s) + variable cpu_access_v : std_logic; + begin + cpu_access_v := not cs7_n_i and not vbl_n_i; + + sprite_ram_we_n_s <= not cpu_access_v; + sprite_ram_cs_n_s <= cpu_access_v nor vbl_n_i; + + if vbl_n_i = '0' then + ra_s <= a_i; + else + ra_s <= v_cnt_s(4 downto 0) & c_s(4 downto 0); + end if; + end process sprite_ram_ctrl; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- The Sprite RAM P5 N5 + ----------------------------------------------------------------------------- + sprite_ram_b : entity work.ladybug_sprite_ram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => clk_en_5mhz_i, + a_i => ra_s, + cs_n_i => sprite_ram_cs_n_s, + we_n_i => sprite_ram_we_n_s, + d_i => d_from_cpu_i, + d_o => rb_s + ); + + ----------------------------------------------------------------------------- + -- Process rc_add + -- + -- Purpose: + -- Implements IC N6 and E6 which add sprite RAM data and Cx signals to + -- form RCx bus. + -- + rc_add: process (rb_s, c_s, v_i) + variable a_v, b_v, + sum_v : std_logic_vector(7 downto 0); + begin + -- prepare the inputs of the adder + a_v(3 downto 0) := rb_s(3 downto 0); + a_v(4) := '1'; + a_v(5) := '0'; + a_v(7 downto 6) := rb_s(1 downto 0); + + b_v(0) := not c_s(6); + b_v(1) := not c_s(7); + b_v(2) := not c_s(8); + b_v(3) := not v_i(3); + b_v(4) := c_s(10); + b_v(5) := '0'; + b_v(7 downto 6) := "11"; + + sum_v := a_v + b_v; + + rc_s <= sum_v; + + end process rc_add; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Sprite Control Logic + ----------------------------------------------------------------------------- + sprite_ctrl_b : entity work.ladybug_sprite_ctrl + port map ( + clk_20mhz_i => clk_20mhz_i, + clk_en_5mhz_i => clk_en_5mhz_i, + clk_en_5mhz_n_i => clk_en_5mhz_n_i, + por_n_i => por_n_i, + vbl_n_i => vbl_n_i, + vbl_d_n_i => vbl_d_n_i, + vc_i => v_i(2), + vc_d_i => vc_d_i, + ha_i => h_i(0), + ha_d_i => ha_d_i, + rb6_i => rb_s(6), + rb7_i => rb_s(7), + rc3_i => rc_s(3), + rc4_i => rc_s(4), + rc5_i => rc_s(5), + j7_b_i => j7_s(1), + j7_c_i => j7_s(2), + clk_en_eck_i => clk_en_eck_s, + c_o => c_s, + clk_en_5ck_n_o => clk_en_5ck_n_s, + clk_en_6ck_n_o => clk_en_6ck_n_s, + clk_en_7ck_n_o => clk_en_7ck_n_s, + s6ck_n_o => s6ck_n_s, + s7ck_n_o => s7ck_n_s, + clk_en_b7_p3_o => clk_en_b7_p3_s, + e5_p8_o => e5_p8_s, + clk_en_e7_3_o => clk_en_e7_3_s, + a8_p5_n_o => a8_p5_n_s + ); + + ----------------------------------------------------------------------------- + -- Process misc_seq + -- + -- Purpose: + -- Implements several sequential elements. + -- + misc_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + clk_5mhz_n_q <= '0'; + ma_q <= (others => '0'); + mb_q <= (others => '0'); + mc_q <= (others => '0'); + cl_q <= (others => '0'); + ck_inh_n_q <= '1'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Turn clk_5mhz_n into clock waveform ---------------------------------- + if clk_en_5mhz_n_i = '1' then + clk_5mhz_n_q <= '1'; + elsif clk_en_5mhz_i = '1' then + clk_5mhz_n_q <= '0'; + end if; + + -- 8-Bit Register M6 ---------------------------------------------------- + if clk_en_5ck_n_s = '1' then + mb_q <= rb_s(1 downto 0); + ma_q <= rb_s(7 downto 2); + end if; + + -- 8-Bit Register P6 ---------------------------------------------------- + if clk_en_e7_3_s = '1' then + -- these are inverted based on mc_q(4) + mc_q(3 downto 0) <= rc_s(3 downto 0); + -- inverts sprites horizontally + mc_q(4) <= rb_s(4); + -- inverts sprites vertically + mc_q(5) <= rb_s(5); + -- + mc_q(6) <= rb_s(6); + end if; + + -- 6-Bit Register B6 ---------------------------------------------------- + if clk_en_6ck_n_s = '1' then + cl_q <= rb_s(4 downto 0); + end if; + + -- Flip-Flop H8 --------------------------------------------------------- + if clk_en_10mhz_n_i = '1' then + ck_inh_n_q <= not ck_inh_s; + end if; + + end if; + end process misc_seq; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process ma_vec + -- + -- Purpose: + -- Build the ma_s vector. + -- + ma_vec: process ( ma_q, + mb_q, + mc_q, + j7_s) + begin + ma_s(11 downto 6) <= ma_q; + + if mc_q(6) = '0' then + ma_s(5) <= mb_q(1); + ma_s(4) <= mb_q(0); + else + ma_s(5) <= mc_q(3) xor mc_q(4); + ma_s(4) <= mc_q(5) xor j7_s(2); + end if; + + ma_s(3) <= mc_q(2) xor mc_q(4); + ma_s(2) <= mc_q(1) xor mc_q(4); + ma_s(1) <= mc_q(0) xor mc_q(4); + ma_s(0) <= mc_q(5) xor j7_s(0); + end process ma_vec; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process df_mux + -- + -- Purpose: + -- Builds the multiplexed data from Sprite ROM. + -- Two-stage multiplexer: + -- 1) ROM data to DFx: 16->8 + -- 2) DF to input for shift register: 8->8 + -- This is actually a scrambler. + -- + df_mux: process ( rom_sprite_d_i, + cl_q, + mc_q) + variable df_v : std_logic_vector(7 downto 0); + begin + if cl_q(4) = '0' then + -- ROM L7 + df_v := rom_sprite_d_i( 7 downto 0); + else + -- ROM M7 + df_v := rom_sprite_d_i(15 downto 8); + end if; + + if mc_q(5) = '0' then + df_muxed_s(0) <= df_v(1); + df_muxed_s(1) <= df_v(3); + df_muxed_s(2) <= df_v(5); + df_muxed_s(3) <= df_v(7); + -- + df_muxed_s(4) <= df_v(0); + df_muxed_s(5) <= df_v(2); + df_muxed_s(6) <= df_v(4); + df_muxed_s(7) <= df_v(6); + else + df_muxed_s(0) <= df_v(7); + df_muxed_s(1) <= df_v(5); + df_muxed_s(2) <= df_v(3); + df_muxed_s(3) <= df_v(1); + -- + df_muxed_s(4) <= df_v(6); + df_muxed_s(5) <= df_v(4); + df_muxed_s(6) <= df_v(2); + df_muxed_s(7) <= df_v(0); + end if; + + end process df_mux; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- The Two 8-Bit Shift Registers H6 J6 + ----------------------------------------------------------------------------- + shifters_h6_j6 : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + h6_shifter <= (others=>'0'); + j6_shifter <= (others=>'0'); + elsif rising_edge(clk_20mhz_i) then + if (clk_en_10mhz_i and not ck_inh_s) = '1' then + if (ct0_s or ct1_s or a8_p5_n_s) = '0' then + h6_shifter <= df_muxed_s(3 downto 0); + j6_shifter <= df_muxed_s(7 downto 4); + else + h6_shifter <= h6_shifter(2 downto 0) & "0"; + j6_shifter <= j6_shifter(2 downto 0) & "0"; + end if; + end if; + end if; + end process; + + qh1_s <= h6_shifter(3); + qh2_s <= j6_shifter(3); + + ----------------------------------------------------------------------------- + -- Sprite Look-up PROM F4 + ----------------------------------------------------------------------------- + lu_a_s(4 downto 2) <= cl_q(2 downto 0); + lu_a_s(1) <= qh2_s; + lu_a_s(0) <= qh1_s; + + prom_F4 : entity work.prom_10_1 + port map ( + CLK => clk_20mhz_i, + ADDR => lu_a_s, + DATA => lu_d_s + ); + + lu_d_mux_s <= lu_d_s(3 downto 0) when cl_q(3) = '0' else lu_d_s(7 downto 4); + + ----------------------------------------------------------------------------- + -- Sprite Control Look-up PROM C4 + ----------------------------------------------------------------------------- + ctrl_lu_a_s(0) <= '1'; + ctrl_lu_a_s(1) <= hx_i; + ctrl_lu_a_s(2) <= clk_5mhz_n_q; + ctrl_lu_a_s(3) <= h_i(0); + ctrl_lu_a_s(4) <= h_i(1); + + prom_C4 : entity work.prom_10_3 + port map ( + CLK => clk_20mhz_i, + ADDR => ctrl_lu_a_s, + DATA => ctrl_lu_d_s + ); + + ----------------------------------------------------------------------------- + -- Process ctrl_lu_seq + -- + -- Purpose: + -- Registers output of Sprite Control Look-up PROM. + -- + ctrl_lu_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + ctrl_lu_q <= (others => '0'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + ctrl_lu_q <= ctrl_lu_q_d_s; + end if; + end process ctrl_lu_seq; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process ctrl_lu_comb + -- + -- Purpose: + -- Combinational logic for the sprite control registers. + -- + ctrl_lu_comb: process ( clk_en_10mhz_i, + ctrl_lu_d_s, + ctrl_lu_q, + ctrl_lu_q_d_s) + begin + -- default assignments + ctrl_lu_q_d_s <= ctrl_lu_q; + clk_en_eck_s <= '0'; + clk_en_rd_s <= '0'; + + -- register control + if clk_en_10mhz_i = '1' then + ctrl_lu_q_d_s <= ctrl_lu_d_s(5 downto 0); + + if ctrl_lu_q(1) = '0' and ctrl_lu_q_d_s(1) = '1' then + -- detect rising edge on ctrl_lu_q(1) + clk_en_eck_s <= '1'; + end if; + + if ctrl_lu_q(6) = '0' and ctrl_lu_q_d_s(6) = '1' then + -- detect rising edge on ctrl_lu_q(6) + clk_en_rd_s <= '1'; + end if; + end if; + + end process ctrl_lu_comb; + -- + shift_oc_n_s <= ctrl_lu_q(1) nand res_n_i; + ck_inh_s <= ctrl_lu_q(2); + cr_mux_sel_s <= ctrl_lu_q(3); + vram_we_n_s <= ctrl_lu_q(4); + rs_enable_s <= ctrl_lu_q(5); + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process ca_seq + -- + -- Purpose: + -- Implements B5, the register that holds the CS flip-flops. + -- + ca_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + ca_q <= (others => '0'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if clk_en_7ck_n_s = '1' then + ca_q <= c_s(8 downto 6); + end if; + end if; + end process ca_seq; + -- + ca6_s <= ca_q(1); + ca7_s <= ca_q(2); + ca8_s <= ca_q(3); + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process vram_mux + -- + -- Purpose: + -- Generates the VRAM address CRx. + -- It implements chips D5, C5 and B5. + -- + vram_mux: process ( h_i, h_t_i, + v_i, + x_s, + ca6_s, ca7_s, ca8_s, + cr_mux_sel_s) + begin + if cr_mux_sel_s = '0' then + -- D5 + cr_s(0) <= h_i(2); + cr_s(1) <= h_i(3); + cr_s(2) <= h_t_i(0); + cr_s(3) <= h_t_i(1); + -- C5 + cr_s(4) <= h_t_i(2); + cr_s(5) <= h_t_i(3); + cr_s(6) <= v_i(0); + cr_s(7) <= v_i(1); + -- B5 + cr_s(8) <= v_i(2); + cr_s(9) <= v_i(3); + + else + -- D5 + cr_s(0) <= x_s(0); + cr_s(1) <= x_s(1); + cr_s(2) <= x_s(2); + cr_s(3) <= x_s(3); + -- C5 + cr_s(4) <= x_s(4); + cr_s(5) <= x_s(5); + cr_s(6) <= ca6_s; + cr_s(7) <= ca7_s; + -- B5 + cr_s(8) <= ca8_s; + cr_s(9) <= not v_i(3); + + end if; + end process vram_mux; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Shift Registers + ----------------------------------------------------------------------------- + shifters_a7_a8_d7_d8_f8 : process(clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + rd_shift_int <= (others=>'1'); + elsif rising_edge(clk_20mhz_i) then + if (clk_en_10mhz_i and not ck_inh_s) = '1' then + rs_int <= (qh1_s nor qh2_s) & rs_int(3 downto 1); + rd_shift_int <= + lu_d_mux_s(0) & rd_shift_int(15 downto 13) & + lu_d_mux_s(1) & rd_shift_int(11 downto 9) & + lu_d_mux_s(2) & rd_shift_int( 7 downto 5) & + lu_d_mux_s(3) & rd_shift_int( 3 downto 1); + end if; + end if; + end process; + + rd_shift_s <= rd_shift_int when shift_oc_n_s = '0' else (others=>'1'); + rs_s <= rs_int when shift_oc_n_s = '0' else (others=>'1'); +-- rs_n_s(3) <= not rs_s(3) or not rs_enable_s; +-- rs_n_s(2) <= not rs_s(2) or not rs_enable_s; +-- rs_n_s(1) <= not rs_s(1) or not rs_enable_s; +-- rs_n_s(0) <= not rs_s(0) or not rs_enable_s; + rs_n_s(3) <= rs_s(3) and rs_enable_s; + rs_n_s(2) <= rs_s(2) and rs_enable_s; + rs_n_s(1) <= rs_s(1) and rs_enable_s; + rs_n_s(0) <= rs_s(0) and rs_enable_s; + + ----------------------------------------------------------------------------- + -- Sprite VRAM + ----------------------------------------------------------------------------- + vram_a6_in_s(0) <= rd_shift_s( 0); + vram_a6_in_s(1) <= rd_shift_s( 4); + vram_a6_in_s(2) <= rd_shift_s( 8); + vram_a6_in_s(3) <= rd_shift_s(12); + vram_a6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(0), + we_n_i => vram_we_n_s, + d_i => vram_a6_in_s, + d_o => vram_a6_out_s + ); + -- + vram_b6_in_s(0) <= rd_shift_s( 1); + vram_b6_in_s(1) <= rd_shift_s( 5); + vram_b6_in_s(2) <= rd_shift_s( 9); + vram_b6_in_s(3) <= rd_shift_s(13); + vram_b6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(1), + we_n_i => vram_we_n_s, + d_i => vram_b6_in_s, + d_o => vram_b6_out_s + ); + -- + vram_c6_in_s(0) <= rd_shift_s( 2); + vram_c6_in_s(1) <= rd_shift_s( 6); + vram_c6_in_s(2) <= rd_shift_s(10); + vram_c6_in_s(3) <= rd_shift_s(14); + vram_c6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(2), + we_n_i => vram_we_n_s, + d_i => vram_c6_in_s, + d_o => vram_c6_out_s + ); + -- + vram_d6_in_s(0) <= rd_shift_s( 3); + vram_d6_in_s(1) <= rd_shift_s( 7); + vram_d6_in_s(2) <= rd_shift_s(11); + vram_d6_in_s(3) <= rd_shift_s(15); + vram_d6_b : entity work.ladybug_sprite_vram + port map ( + clk_i => clk_20mhz_i, + clk_en_i => '1', + a_i => cr_s, + cs_n_i => rs_n_s(3), + we_n_i => vram_we_n_s, + d_i => vram_d6_in_s, + d_o => vram_d6_out_s + ); + -- Remap VRAM data outputs to the complete bus ------------------------------ + rd_vram_s(15) <= vram_d6_out_s(3) or rs_n_s(3); + rd_vram_s(14) <= vram_c6_out_s(3) or rs_n_s(2); + rd_vram_s(13) <= vram_b6_out_s(3) or rs_n_s(1); + rd_vram_s(12) <= vram_a6_out_s(3) or rs_n_s(0); + -- + rd_vram_s(11) <= vram_d6_out_s(2) or rs_n_s(3); + rd_vram_s(10) <= vram_c6_out_s(2) or rs_n_s(2); + rd_vram_s( 9) <= vram_b6_out_s(2) or rs_n_s(1); + rd_vram_s( 8) <= vram_a6_out_s(2) or rs_n_s(0); + -- + rd_vram_s( 7) <= vram_d6_out_s(1) or rs_n_s(3); + rd_vram_s( 6) <= vram_c6_out_s(1) or rs_n_s(2); + rd_vram_s( 5) <= vram_b6_out_s(1) or rs_n_s(1); + rd_vram_s( 4) <= vram_a6_out_s(1) or rs_n_s(0); + -- + rd_vram_s( 3) <= vram_d6_out_s(0) or rs_n_s(3); + rd_vram_s( 2) <= vram_c6_out_s(0) or rs_n_s(2); + rd_vram_s( 1) <= vram_b6_out_s(0) or rs_n_s(1); + rd_vram_s( 0) <= vram_a6_out_s(0) or rs_n_s(0); + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process rd_seq + -- + -- Purpose: + -- Implements the registers saving the RDx bus. + -- + rd_seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + vram_q <= (others => '0'); + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + if blank_flont_i = '0' then + -- pseudo-asynchronous clear + vram_q <= (others => '0'); + + elsif clk_en_rd_s = '1' then + if shift_oc_n_s = '0' then + -- take data from shift registers + vram_q <= rd_shift_s; + else + -- take data from VRAM + vram_q <= rd_vram_s; + end if; + end if; + end if; + end process rd_seq; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Process sig_mux + -- + -- Purpose: + -- Multiplexes the saved VRAM data to generate the four SIG outputs. + -- + sig_mux: process (vram_q, + h_i, + blank_i) + variable vec_v : std_logic_vector(1 downto 0); + begin + -- default assignment + sig_o <= (others => '0'); + + vec_v := (h_i(1) & h_i(0)); + + if blank_i = '0' then + case vec_v is + when "00" => + sig_o(1) <= vram_q( 1); + sig_o(2) <= vram_q( 5); + sig_o(3) <= vram_q( 9); + sig_o(4) <= vram_q(13); + when "01" => + sig_o(1) <= vram_q( 2); + sig_o(2) <= vram_q( 6); + sig_o(3) <= vram_q(10); + sig_o(4) <= vram_q(14); + when "10" => + sig_o(1) <= vram_q( 3); + sig_o(2) <= vram_q( 7); + sig_o(3) <= vram_q(11); + sig_o(4) <= vram_q(15); + when "11" => + sig_o(1) <= vram_q( 0); + sig_o(2) <= vram_q( 4); + sig_o(3) <= vram_q( 8); + sig_o(4) <= vram_q(12); + when others => + null; + end case; + end if; + end process sig_mux; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + rom_sprite_a_o <= ma_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_sprite_ctrl.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_sprite_ctrl.vhd new file mode 100644 index 00000000..f0eaff48 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_sprite_ctrl.vhd @@ -0,0 +1,491 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sprite_ctrl.vhd,v 1.8 2005/10/10 22:02:14 arnim Exp $ +-- +-- Control logic of the Sprite module. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +library ieee; +use ieee.numeric_std.all; + +entity ladybug_sprite_ctrl is + + port ( + clk_20mhz_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_5mhz_n_i : in std_logic; + por_n_i : in std_logic; + vbl_n_i : in std_logic; + vbl_d_n_i : in std_logic; + vc_i : in std_logic; + vc_d_i : in std_logic; + ha_i : in std_logic; + ha_d_i : in std_logic; + rb6_i : in std_logic; + rb7_i : in std_logic; + rc3_i : in std_logic; + rc4_i : in std_logic; + rc5_i : in std_logic; + j7_b_i : in std_logic; + j7_c_i : in std_logic; + clk_en_eck_i : in std_logic; + c_o : out std_logic_vector(10 downto 0); + clk_en_5ck_n_o : out std_logic; + clk_en_6ck_n_o : out std_logic; + clk_en_7ck_n_o : out std_logic; + s6ck_n_o : out std_logic; + s7ck_n_o : out std_logic; + clk_en_b7_p3_o : out std_logic; + e5_p8_o : out std_logic; + clk_en_e7_3_o : out std_logic; + a8_p5_n_o : out std_logic + ); + +end ladybug_sprite_ctrl; + + +architecture rtl of ladybug_sprite_ctrl is + + signal clk_5mhz_q : std_logic; + + signal a7_p5_s, + a7_p5_q : std_logic; + signal a7_p9_q : std_logic; + + signal a8_p5_q : std_logic; + + signal n4_p5_s, + n4_p5_q : std_logic; + + signal f7_ck_en_s, + f7_cl_s, + f7_qa_s, f7_qb_s, f7_qc_s, f7_qd_s, + f7_da_s, f7_db_s, f7_dc_s, f7_dd_s : std_logic_vector(2 downto 1); + + signal j5_ck_en_s, + j5_cl_s, + j5_qa_s, j5_qb_s, j5_qc_s, j5_qd_s, + j5_da_s, j5_db_s, j5_dc_s, j5_dd_s : std_logic_vector(2 downto 1); + + signal e7_ck_en_s, + e7_cl_n_s : std_logic; + signal e7_d_s, + e7_q_s, e7_q_n_s, + e7_d_out_s, e7_d_out_n_s : std_logic_vector(4 downto 1); + + signal h5_n_s : std_logic_vector(7 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements various sequential elements. + -- + seq: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + clk_5mhz_q <= '0'; + a7_p5_q <= '0'; + a7_p9_q <= '0'; + a8_p5_q <= '0'; + n4_p5_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Turn clk_5mhz enable into clock waveform ----------------------------- + if clk_en_5mhz_i = '1' then + clk_5mhz_q <= '1'; + elsif clk_en_5mhz_n_i = '1' then + clk_5mhz_q <= '0'; + end if; + + -- Flip-Flop A7 --------------------------------------------------------- + a7_p5_q <= a7_p5_s; + -- + if clk_en_5mhz_n_i = '1' then + a7_p9_q <= j5_qd_s(2); + end if; + + -- Flip-Flop A8 --------------------------------------------------------- + if clk_en_eck_i = '1' then + a8_p5_q <= j7_b_i nand j7_c_i; + end if; + + -- Flip-Flop N4 --------------------------------------------------------- + n4_p5_q <= n4_p5_s; + + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements various combinational signals. + -- + comb: process (a7_p5_q, + vc_i, vc_d_i, + n4_p5_q, + ha_i, ha_d_i, + f7_qd_s) + begin + -- D Input for Flip-Flop N4 ----------------------------------------------- + if a7_p5_q = '0' then + -- pseudo-asynchronous clear + n4_p5_s <= '0'; + elsif (vc_i and not vc_d_i) = '1' then + -- falling edge on VC + n4_p5_s <= '1'; + else + n4_p5_s <= n4_p5_q; + end if; + + -- D-Input for Flip-Flop A7.5 --------------------------------------------- + if (ha_i and not ha_d_i) = '1' then + -- falling edge on HA + a7_p5_s <= f7_qd_s(2); + else + a7_p5_s <= a7_p5_q; + end if; + + end process comb; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- F7 - Dual 4-Bit Binary Counter + ----------------------------------------------------------------------------- + f7_cl_s(1) <= n4_p5_q and ha_i and vbl_n_i; + f7_cl_s(2) <= f7_cl_s(1); + -- + f7_b : entity work.ttl_393 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => f7_ck_en_s, + por_n_i => por_n_i, + cl_i => f7_cl_s, + qa_o => f7_qa_s, + qb_o => f7_qb_s, + qc_o => f7_qc_s, + qd_o => f7_qd_s, + da_o => f7_da_s, + db_o => f7_db_s, + dc_o => f7_dc_s, + dd_o => f7_dd_s + ); + + + ----------------------------------------------------------------------------- + -- Process f7_ck_en + -- + -- Purpose: + -- Build the clock enable for the two counters in F7. + -- + f7_ck_en: process (j5_qd_s, j5_dd_s, + vbl_n_i, vbl_d_n_i, + ha_i, ha_d_i, + n4_p5_q, n4_p5_s, + f7_qd_s, f7_dd_s, + e7_q_n_s, e7_d_out_n_s, + f7_qb_s, f7_db_s) + + variable ff_q_v, ff_d_v : std_logic; + + begin + + -- combinational result based on flip-flop outputs + ff_q_v := j5_qd_s(2) or ( not ( not ( vbl_n_i and ha_i and n4_p5_q ) ) or not ( not f7_qd_s(2) nand not e7_q_n_s(1) ) ); + + -- combinational result based on flip-flop inputs + ff_d_v := j5_dd_s(2) or ( not ( not ( vbl_d_n_i and ha_d_i and n4_p5_s ) ) or not ( not f7_qd_s(2) nand not e7_d_out_n_s(1) ) ); +-- B7.3 D7.8 D7.8 F6.3 B7.6 + -- rising edge detector on B7.3 + f7_ck_en_s(1) <= not ff_q_v and ff_d_v; + + -- falling edge detector on F7.QB(1) + f7_ck_en_s(2) <= f7_qb_s(1) and not f7_db_s(1); + + end process f7_ck_en; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- J5 - Dual 4-Bit Binary Counter + ----------------------------------------------------------------------------- + j5_cl_s(1) <= not vbl_n_i + or -- D7.6 + not( + not clk_5mhz_q + nand -- F5.8 + not h5_n_s(0) + ) + or -- D7.6 + n4_p5_q; + j5_cl_s(2) <= a7_p9_q + or -- B7.8 + ( + not ( + not ( + n4_p5_q + and -- D7.8 + ha_i + and -- D7.8 + vbl_n_i + ) + ) + or -- F6.3 + not ( + not f7_qd_s(2) + nand -- B7.6 + not e7_q_n_s(1) + ) + ); + -- + j5_b : entity work.ttl_393 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => j5_ck_en_s, + por_n_i => por_n_i, + cl_i => j5_cl_s, + qa_o => j5_qa_s, + qb_o => j5_qb_s, + qc_o => j5_qc_s, + qd_o => j5_qd_s, + da_o => j5_da_s, + db_o => j5_db_s, + dc_o => j5_dc_s, + dd_o => j5_dd_s + ); + + + ----------------------------------------------------------------------------- + -- Process j5_ck_en + -- + -- Purpose: + -- Build the clock enable for the two counters in J5. + -- + j5_ck_en: process (ha_i, ha_d_i, + e7_q_s, e7_d_out_s, + j5_qc_s, j5_dc_s) + begin + -- falling edge detector on F6.11 + j5_ck_en_s(1) <= -- Flip-Flop Outputs + ( + not ha_i + nand + e7_q_s(3) + ) + and not -- Flip-Flop Inputs + ( + not ha_d_i + nand + e7_d_out_s(3) + ); + + -- falling edge detector on C7.10 + j5_ck_en_s(2) <= -- Flip-Flop Outputs + ( + j5_qc_s(1) + nor + e7_q_s(2) + ) + and not -- Flip-Flop Inputs + ( + j5_dc_s(1) + nor + e7_d_out_s(2) + ); + end process j5_ck_en; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- E7 - Quad D-Type Flip-Flops with Clear + ----------------------------------------------------------------------------- + e7_d_s(1) <= not rb7_i; + e7_d_s(2) <= not ( + rb7_i + and -- D7.12 + rc5_i + and -- D7.12 + ( + not rc4_i + and -- C7.1 + not ( + not rc3_i + nor -- C6.3 + rb6_i + ) + ) + ); + e7_d_s(3) <= not e7_d_s(2) + and -- C7.4 + not a8_p5_q; + e7_d_s(4) <= '0'; + + -- This clock enable is not 100% equivalent to the schematics. + -- There, h5_n_s(4) could also generate a rising edge for E7 + -- but this is ignored here. It is believed that h5_n_s(4) acts + -- only as a clock enable/suppress for the 5 MHz clock. + -- This implementation suppresses as well a combinational feedback + -- loop from J5/1. + e7_ck_en_s <= clk_en_5mhz_i and not h5_n_s(4); + + e7_cl_n_s <= f7_qd_s(2) + or -- B7.3?? + ( + not clk_5mhz_q + nand -- F5.8 + not h5_n_s(0) + ) after 20 ns; + + e7_b : entity work.ttl_175 + port map ( + ck_i => clk_20mhz_i, + ck_en_i => e7_ck_en_s, + por_n_i => por_n_i, + cl_n_i => e7_cl_n_s, + d_i => e7_d_s, + q_o => e7_q_s, + q_n_o => e7_q_n_s, + d_o => e7_d_out_s, + d_n_o => e7_d_out_n_s + ); + + clk_en_e7_3_o <= not e7_q_s(3) and e7_d_out_s(3); + + + ----------------------------------------------------------------------------- + -- Process h5 + -- + -- Purpose: + -- Implements all functionality regarding H5. + -- + h5: process (j5_qa_s, j5_da_s, + j5_qb_s, j5_db_s, + ha_i, ha_d_i, + vbl_n_i, vbl_d_n_i, + a7_p5_q, a7_p5_s) + variable ff_q_v, ff_d_v : std_logic_vector(7 downto 0); + variable f5_p3_q_v, f5_p3_d_v : std_logic; + + ----------------------------------------------------------------------------- + -- 7445 - BCD to Decimal Decoder + ----------------------------------------------------------------------------- + function ttl_45_f(a, b, c, d : in std_logic) return + std_logic_vector is + variable idx_v : std_logic_vector( 3 downto 0); + variable vec_v : std_logic_vector(15 downto 0); + begin + vec_v := (others => '1'); + + idx_v := d & c & b & a; + vec_v(to_integer(unsigned(idx_v))) := '0'; + + return vec_v(7 downto 0); + end ttl_45_f; + + begin + -- combinational result based on flip-flop outputs + f5_p3_q_v := not a7_p5_q nand vbl_n_i; + ff_q_v := ttl_45_f(a => j5_qa_s(1), + b => j5_qb_s(1), + c => ha_i, + d => f5_p3_q_v); + -- combinational result based on flip-flop inputs + f5_p3_d_v := not a7_p5_s nand vbl_d_n_i; + ff_d_v := ttl_45_f(a => j5_da_s(1), + b => j5_db_s(1), + c => ha_d_i, + d => f5_p3_d_v); + + -- combinational output of H5 is based on flip-flop outputs + h5_n_s <= ff_q_v; + + -- clock enable for flip-flops on /5CK + clk_en_5ck_n_o <= not ff_q_v(5) and ff_d_v(5); + -- clock enable for flip-flops on /6CK + clk_en_6ck_n_o <= not ff_q_v(6) and ff_d_v(6); + -- clock enable for flip-flops on /7CK + clk_en_7ck_n_o <= not ff_q_v(7) and ff_d_v(7); + + s6ck_n_o <= ff_q_v(6); + s7ck_n_o <= ff_q_v(7); + end process h5; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + clk_en_b7_p3_o <= f7_ck_en_s(1); + e5_p8_o <= n4_p5_q + nor -- E5.8 + not ( + f7_qa_s(1) + nand -- F6.8 + f7_qb_s(1) + ); + a8_p5_n_o <= not a8_p5_q; + + c_o( 0) <= j5_qa_s(1); + c_o( 1) <= j5_qb_s(1); + c_o( 2) <= j5_qa_s(2); + c_o( 3) <= j5_qb_s(2); + c_o( 4) <= j5_qc_s(2); + c_o( 5) <= j5_qd_s(2); + c_o( 6) <= f7_qa_s(2); + c_o( 7) <= f7_qb_s(2); + c_o( 8) <= f7_qc_s(2); + c_o( 9) <= f7_qa_s(1); + c_o(10) <= f7_qb_s(1); + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_video_timing.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_video_timing.vhd new file mode 100644 index 00000000..58a3a818 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_video_timing.vhd @@ -0,0 +1,356 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_video_timing.vhd,v 1.16 2006/02/07 19:27:38 arnim Exp $ +-- +-- The Video Timing Module of Lady Bug Machine. +-- +-- It implements the horizontal and vertical timing signals including composite +-- sync information. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +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 ladybug_video_timing is + + port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + -- Horizontal Timing Interface -------------------------------------------- + h_o : out std_logic_vector(3 downto 0); + h_t_o : out std_logic_vector(3 downto 0); + hbl_o : out std_logic; + hx_o : out std_logic; + ha_d_o : out std_logic; + ha_t_rise_o : out std_logic; + -- Vertical Timing Interface ---------------------------------------------- + v_o : out std_logic_vector(3 downto 0); + v_t_o : out std_logic_vector(3 downto 0); + vc_d_o : out std_logic; + vbl_n_o : out std_logic; + vbl_d_n_o : out std_logic; + vbl_t_n_o : out std_logic; + blank_flont_o : out std_logic; + -- RBG Video Interface ---------------------------------------------------- + hsync_n_o : out std_logic; + vsync_n_o : out std_logic; + comp_sync_n_o : out std_logic + ); + +end ladybug_video_timing; + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ladybug_video_timing is + + -- horizontal timing circuit + signal h_preset : std_logic_vector(7 downto 0); + signal h_rise : std_logic_vector(7 downto 0); + signal h_do : std_logic_vector(7 downto 0); + signal h_j2_h2 : std_logic_vector(7 downto 0); + signal h_s : std_logic_vector(7 downto 0); + signal hx_q, + hx_s, + hx_n_s : std_logic; + signal hx_rise_s : std_logic; + signal hbl_q : std_logic; +-- signal hbl_n_s : std_logic; + signal hsync_n_q : std_logic; + signal h_carry_s : std_logic; + signal hd_rise_s : std_logic; + + -- vertical timing circuit + signal v_preset : std_logic_vector(7 downto 0); + signal v_rise : std_logic_vector(7 downto 0); + signal v_do : std_logic_vector(7 downto 0); + signal v_s : std_logic_vector(7 downto 0); + signal vx_q, + vx_n_s : std_logic; + signal vbl_q, + vbl_s, + vbl_n_s : std_logic; + signal vbl_t_q, + vbl_t_s, + vbl_t_n_s : std_logic; + signal vsync_n_q : std_logic; + signal v_carry_s : std_logic; + signal vc_rise_s, + vd_rise_s : std_logic; + signal vb_t_rise_s : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Horizontal Timing counters J2 H2 + ----------------------------------------------------------------------------- + hd_rise_s <= h_rise(3); + ha_t_rise_o <= h_rise(4); + ha_d_o <= h_do(0); + h_preset <= hx_n_s & hx_n_s & "00" & hx_n_s & "000"; + + h_counter : entity work.counter + port map ( + ck_i => clk_20mhz_i, + ck_en_i => clk_en_5mhz_i, + reset_n_i => por_n_i, + load_i => h_carry_s, + preset_i => h_preset, + q_o => h_s, + co_o => h_carry_s, + rise_q_o => h_rise, + d_o => h_do + ); + + ----------------------------------------------------------------------------- + -- Process h_timing + -- + -- Purpose: + -- Implement the horizontal timing circuit. + -- + -- The original circuit has no asynchronous reset. To have a stable + -- behavior on silicon, all sequential elements are cleared with the + -- power-on reset. This assumes that the original chips power-up to + -- these values. + -- + -- See also instantiations of ttl_161. + -- + h_timing: process (clk_20mhz_i, por_n_i) + begin + if por_n_i = '0' then + hx_q <= '0'; + hbl_q <= '0'; + hsync_n_q <= '1'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Flip-flops on 5 MHz clock -------------------------------------------- + -- HX + hx_q <= hx_s; + + -- Free running flip-flops ---------------------------------------------- + -- HBL + if (hx_q and not h_s(3)) = '1' then + -- pseudo-asynchronous preset + hbl_q <= '1'; + elsif hd_rise_s = '1' then + -- Rising edge on HD + hbl_q <= hx_q; + end if; + + -- HSYNC + if hx_q = '0' then + -- pseudo-asynchronous preset + hsync_n_q <= '1'; + elsif hd_rise_s = '1' then + -- rising edge on HD + hsync_n_q <= h_s(5); + end if; + + end if; + + end process h_timing; + -- + ----------------------------------------------------------------------------- + + hx_n_s <= not hx_q; +--hbl_n_s <= not hbl_q; + + ----------------------------------------------------------------------------- + -- Process hx_comb + -- + -- Purpose: + -- Implements the combinational logic for hx. Including rising edge + -- detection. + -- + hx_comb: process (clk_en_5mhz_i, h_carry_s, hx_q) + begin + -- default assignments + hx_s <= hx_q; + hx_rise_s <= '0'; + + -- HX + if clk_en_5mhz_i = '1' then + if h_carry_s = '1' then + hx_s <= not hx_q; + + -- flag rising edge of hx_q + if hx_q = '0' then + hx_rise_s <= '1'; + end if; + end if; + end if; + + end process hx_comb; + -- + ----------------------------------------------------------------------------- + + ----------------------------------------------------------------------------- + -- Vertical Timing counters E5 E2 + ----------------------------------------------------------------------------- + vb_t_rise_s <= v_rise(5); + vd_rise_s <= v_rise(3); + vc_rise_s <= v_rise(2); + vc_d_o <= v_do(2); + v_preset <= vx_n_s & vx_n_s & vx_n_s & vx_q & vx_n_s & '0' & vx_n_s & '0'; + + v_counter : entity work.counter + port map ( + ck_i => clk_20mhz_i, + ck_en_i => hx_rise_s, + reset_n_i => por_n_i, + load_i => v_carry_s, + preset_i => v_preset, + q_o => v_s, + co_o => v_carry_s, + rise_q_o => v_rise, + d_o => v_do + ); + + ----------------------------------------------------------------------------- + -- Process v_timing + -- + -- Purpose: + -- Implement the vertical timing circuit. + -- + -- See process h_timing for reset discussion. + -- + v_timing: process (clk_20mhz_i, por_n_i) + variable preset_v : boolean; + begin + if por_n_i = '0' then + vx_q <= '0'; + vbl_q <= '0'; + vsync_n_q <= '1'; + vbl_t_q <= '0'; + + elsif clk_20mhz_i'event and clk_20mhz_i = '1' then + -- Free running flip-flops ---------------------------------------------- + -- VX + if hx_rise_s = '1' then + if v_carry_s = '1' then + vx_q <= vx_n_s; + end if; + end if; + + -- VSYNC + if vc_rise_s = '1' then + -- rising edge on VC + vsync_n_q <= not (v_s(7) and v_s(6) and v_s(5) and v_s(4) and v_s(3) and vx_n_s); + end if; + + -- VBL + vbl_q <= vbl_s; + + -- VBL' + vbl_t_q <= vbl_t_s; + + end if; + end process v_timing; + -- + ----------------------------------------------------------------------------- + + vx_n_s <= not vx_q; + vbl_n_s <= not vbl_q; + vbl_t_n_s <= not vbl_t_q; + + + ----------------------------------------------------------------------------- + -- Process vbl_comb + -- + -- Purpose: + -- Combinational logic for vbl_q and vbl_t_q. + -- + vbl_comb: process (v_s, vb_t_rise_s, vd_rise_s, vx_q, vbl_q, vbl_t_q) + variable preset_v : boolean; + begin + preset_v := (v_s(5) and v_s(6) and v_s(7)) = '1'; + -- VBL + vbl_s <= vbl_q; + if preset_v then + -- pseudo-asynchronous preset + vbl_s <= '1'; + elsif vb_t_rise_s = '1' then + -- rising edge on VB' + vbl_s <= vx_q; + end if; + + -- VBL' + vbl_t_s <= vbl_t_q; + if preset_v then + -- pseudo-asynchronous preset + vbl_t_s <= '1'; + elsif vd_rise_s = '1' then + -- rising edge on VD + vbl_t_s <= vx_q; + end if; + + end process vbl_comb; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + h_o <= h_s(3 downto 0); + h_t_o <= h_s(7 downto 4); + hbl_o <= hbl_q; + hx_o <= hx_q; + v_o <= v_s(3 downto 0); + v_t_o <= v_s(7 downto 4); + vbl_n_o <= vbl_n_s; + vbl_t_n_o <= vbl_t_n_s; + vbl_d_n_o <= not vbl_s; + hsync_n_o <= hsync_n_q; + vsync_n_o <= vsync_n_q; + comp_sync_n_o <= not hsync_n_q xor vsync_n_q; + + -- I have no idea why there is an additional wire called BLANK FLONT. + -- From the schematics, it is the same as /VBL (just buffered). + blank_flont_o <= vbl_n_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_video_unit.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_video_unit.vhd new file mode 100644 index 00000000..96d58e5f --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ladybug_video_unit.vhd @@ -0,0 +1,240 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_video_unit.vhd,v 1.22 2006/02/07 00:44:35 arnim Exp $ +-- +-- The Video Unit of the Lady Bug Machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ladybug_video_unit is + port ( + -- Clock and Reset Interface ---------------------------------------------- + clk_20mhz_i : in std_logic; + por_n_i : in std_logic; + res_n_i : in std_logic; + clk_en_10mhz_i : in std_logic; + clk_en_10mhz_n_i : in std_logic; + clk_en_5mhz_i : in std_logic; + clk_en_5mhz_n_i : in std_logic; + clk_en_4mhz_i : in std_logic; + -- CPU Interface ---------------------------------------------------------- + cs7_n_i : in std_logic; + cs10_n_i : in std_logic; + cs13_n_i : in std_logic; + a_i : in std_logic_vector(10 downto 0); + rd_n_i : in std_logic; + wr_n_i : in std_logic; + wait_n_o : out std_logic; + d_from_cpu_i : in std_logic_vector( 7 downto 0); + d_from_video_o : out std_logic_vector( 7 downto 0); + vc_o : out std_logic; + vbl_tick_n_o : out std_logic; + vbl_buf_o : out std_logic; + -- RGB Video Interface ---------------------------------------------------- + rgb_r_o : out std_logic_vector( 1 downto 0); + rgb_g_o : out std_logic_vector( 1 downto 0); + rgb_b_o : out std_logic_vector( 1 downto 0); + hsync_n_o : out std_logic; + vsync_n_o : out std_logic; + comp_sync_n_o : out std_logic; + vblank_o : out std_logic; + hblank_o : out std_logic; + -- Character ROM Interface ------------------------------------------------ + rom_char_a_o : out std_logic_vector(11 downto 0); + rom_char_d_i : in std_logic_vector(15 downto 0); + -- Sprite ROM Interface --------------------------------------------------- + rom_sprite_a_o : out std_logic_vector(11 downto 0); + rom_sprite_d_i : in std_logic_vector(15 downto 0) + ); + +end ladybug_video_unit; + +architecture struct of ladybug_video_unit is + + signal h_s, + h_t_s : std_logic_vector(3 downto 0); + signal ha_d_s, + ha_t_rise_s : std_logic; + signal hbl_s : std_logic; + signal hx_s : std_logic; + + signal v_s, + v_t_s : std_logic_vector(3 downto 0); + signal vc_d_s : std_logic; + signal vbl_n_s, + vbl_d_n_s : std_logic; + + signal blank_flont_s : std_logic; + + signal d_from_char_s : std_logic_vector(7 downto 0); + + signal blank_s : std_logic; + signal crg_s : std_logic_vector(5 downto 1); + + signal sig_s : std_logic_vector(4 downto 1); + + signal comp_sync_n : std_logic; + +begin + comp_sync_n_o <= comp_sync_n and vbl_n_s; + vbl_buf_o <= not vbl_n_s; + ----------------------------------------------------------------------------- + -- Horizontal and Vertical Timing Generator + ----------------------------------------------------------------------------- + timing_b : entity work.ladybug_video_timing + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + h_o => h_s, + h_t_o => h_t_s, + hbl_o => hbl_s, + hx_o => hx_s, + ha_d_o => ha_d_s, + ha_t_rise_o => ha_t_rise_s, + v_o => v_s, + v_t_o => v_t_s, + vc_d_o => vc_d_s, + vbl_n_o => vbl_n_s, + vbl_d_n_o => vbl_d_n_s, + vbl_t_n_o => vbl_tick_n_o, + blank_flont_o => blank_flont_s, + hsync_n_o => hsync_n_o, + vsync_n_o => vsync_n_o, + comp_sync_n_o => comp_sync_n + ); + vc_o <= v_s(2); + + + ----------------------------------------------------------------------------- + -- Character Module + ----------------------------------------------------------------------------- + char_b : entity work.ladybug_char + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + res_n_i => res_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + clk_en_4mhz_i => clk_en_4mhz_i, + cs10_n_i => cs10_n_i, + cs13_n_i => cs13_n_i, + a_i => a_i, + rd_n_i => rd_n_i, + wr_n_i => wr_n_i, + wait_n_o => wait_n_o, + d_from_cpu_i => d_from_cpu_i, + d_from_char_o => d_from_char_s, + h_i => h_s, + h_t_i => h_t_s, + ha_t_rise_i => ha_t_rise_s, + hx_i => hx_s, + v_i => v_s, + v_t_i => v_t_s, + hbl_i => hbl_s, + blank_flont_i => blank_flont_s, + blank_o => blank_s, + vblank_o => vblank_o, + hblank_o => hblank_o, + crg_o => crg_s, + rom_char_a_o => rom_char_a_o, + rom_char_d_i => rom_char_d_i + ); + + + ----------------------------------------------------------------------------- + -- Sprite Module + ----------------------------------------------------------------------------- + sprite_b : entity work.ladybug_sprite + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + res_n_i => res_n_i, + clk_en_10mhz_i => clk_en_10mhz_i, + clk_en_10mhz_n_i => clk_en_10mhz_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + clk_en_5mhz_n_i => clk_en_5mhz_n_i, + cs7_n_i => cs7_n_i, + a_i => a_i(9 downto 0), + d_from_cpu_i => d_from_cpu_i, + h_i => h_s, + h_t_i => h_t_s, + hx_i => hx_s, + ha_d_i => ha_d_s, + v_i => v_s, + v_t_i => v_t_s, + vbl_n_i => vbl_n_s, + vbl_d_n_i => vbl_d_n_s, + vc_d_i => vc_d_s, + blank_flont_i => blank_flont_s, + blank_i => blank_s, + sig_o => sig_s, + rom_sprite_a_o => rom_sprite_a_o, + rom_sprite_d_i => rom_sprite_d_i + ); + + + ----------------------------------------------------------------------------- + -- RGB Generator + ----------------------------------------------------------------------------- + rgb_b : entity work.ladybug_rgb + port map ( + clk_20mhz_i => clk_20mhz_i, + por_n_i => por_n_i, + clk_en_5mhz_i => clk_en_5mhz_i, + crg_i => crg_s, + sig_i => sig_s, + rgb_r_o => rgb_r_o, + rgb_g_o => rgb_g_o, + rgb_b_o => rgb_b_o + ); + + + ----------------------------------------------------------------------------- + -- Bus Multiplexer + ----------------------------------------------------------------------------- + d_from_video_o <= d_from_char_s + when cs13_n_i = '0' else + (others => '1'); + +end struct; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/mist_io.v b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_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/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/osd.v b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_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/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/pll.qip b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_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/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/pll.v b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/pll.v new file mode 100644 index 00000000..65715540 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 20, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "20.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "20" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "20.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "20" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/scandoubler.v b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/ladybug_sound_unit.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/ladybug_sound_unit.vhd new file mode 100644 index 00000000..23ad2a6a --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/ladybug_sound_unit.vhd @@ -0,0 +1,143 @@ +------------------------------------------------------------------------------- +-- +-- FPGA Lady Bug +-- +-- $Id: ladybug_sound_unit.vhd,v 1.4 2006/06/16 22:41:37 arnim Exp $ +-- +-- Sound Unit of the Lady Bug Machine. +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ladybug_sound_unit is + + port ( + clk_20mhz_i : in std_logic; + clk_en_4mhz_i : in std_logic; + por_n_i : in std_logic; + cs11_n_i : in std_logic; + cs12_n_i : in std_logic; + wr_n_i : in std_logic; + d_from_cpu_i : in std_logic_vector(7 downto 0); + sound_wait_n_o : out std_logic; + audio_o : out signed(7 downto 0) + ); + +end ladybug_sound_unit; + +architecture struct of ladybug_sound_unit is + + signal ready_b1_s, + ready_c1_s : std_logic; + + signal aout_b1_s, + aout_c1_s : signed(7 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- SN76489 Sound Chip B1 + ----------------------------------------------------------------------------- + snd_b1_b : entity work.sn76489_top + generic map ( + clock_div_16_g => 1 + ) + port map ( + clock_i => clk_20mhz_i, + clock_en_i => clk_en_4mhz_i, + res_n_i => por_n_i, + ce_n_i => cs11_n_i, + we_n_i => wr_n_i, + ready_o => ready_b1_s, + d_i => d_from_cpu_i, + aout_o => aout_b1_s + ); + + + ----------------------------------------------------------------------------- + -- SN76489 Sound Chip C1 + ----------------------------------------------------------------------------- + snd_c1_b : entity work.sn76489_top + generic map ( + clock_div_16_g => 1 + ) + port map ( + clock_i => clk_20mhz_i, + clock_en_i => clk_en_4mhz_i, + res_n_i => por_n_i, + ce_n_i => cs12_n_i, + we_n_i => wr_n_i, + ready_o => ready_c1_s, + d_i => d_from_cpu_i, + aout_o => aout_c1_s + ); + + + ----------------------------------------------------------------------------- + -- Process mix + -- + -- Purpose: + -- Mix the digital audio of the two SN76489 instances. + -- Additional care is taken to avoid audio overfow/clipping. + -- + mix: process (aout_b1_s, + aout_c1_s) + variable sum_v : signed(8 downto 0); + begin + sum_v := RESIZE(aout_b1_s, 9) + RESIZE(aout_c1_s, 9); + + if sum_v > 127 then + audio_o <= to_signed(127, 8); + elsif sum_v < -128 then + audio_o <= to_signed(-128, 8); + else + audio_o <= RESIZE(sum_v, 8); + end if; + + end process mix; + -- + ----------------------------------------------------------------------------- + + + sound_wait_n_o <= ready_b1_s and ready_c1_s; + +end struct; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/COPYING b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/COPYING new file mode 100644 index 00000000..60549be5 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/README b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/README new file mode 100644 index 00000000..33630144 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/README @@ -0,0 +1,143 @@ + +An SN76489AN Compatible Implementation in VHDL +============================================== +Version: $Date: 2006/06/18 19:28:40 $ + +Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +See the file COPYING. + + +Integration +----------- + +The sn76489 design exhibits all interface signals as the original chip. It +only differs in the audio data output which is provided as an 8 bit signed +vector instead of an analog output pin. + + generic ( + clock_div_16_g : integer := 1 + -- Set to '1' when operating the design in SN76489 mode. The primary clock + -- input is divided by 16 in this variant. The data sheet mentions the + -- SN76494 which contains a divide-by-2 clock input stage. Set the generic + -- to '0' to enable this mode. + ); + port ( + clock_i : in std_logic; + -- Primary clock input + -- Drive with the target frequency or any integer multiple of it. + + clock_en_i : in std_logic; + -- Clock enable + -- A '1' on this input qualifies a valid rising edge on clock_i. A '0' + -- disables the next rising clock edge, effectivley halting the design + -- until the next enabled rising clock edge. + -- Can be used to run the core at lower frequencies than applied on + -- clock_i. + + res_n_i : in std_logic; + -- Asynchronous low active reset input. + -- Sets all sequential elements to a known state. + + ce_n_i : in std_logic; + -- Chip enable, low active. + + we_n_i : in std_logic; + -- Write enable, low active. + + ready_o : out std_logic; + -- Ready indication to microprocessor. + + d_i : in std_logic_vector(0 to 7); + -- Data input + -- MSB 0 ... 7 LSB + + aout_o : out signed(0 to 7) + -- Audio output, signed vector + -- MSB/SIGN 0 ... 7 LSB + ); + + +Both 8 bit vector ports are defined (0 to 7) which declares bit 0 to be the +MSB and bit 7 to be the LSB. This has been implemented according to TI's data +sheet, thus all register/data format figures apply 1:1 for this design. +Many systems will flip the system data bus bit wise before it is connected to +this PSG. This is simply achieved with the following VHDL construct: + + signal data_s : std_logic_vector(7 downto 0); + + ... + d_i => data_s, + ... + +d_i and data_s will be assigned from left to right, resulting in the expected +bit assignment: + + d_i data_s + 0 7 + 1 6 + ... + 6 1 + 7 0 + + +As this design is fully synchronous, care has to be taken when the design +replaces an SN76489 in asynchronous mode. No problems are expected when +interfacing the code to other synchronous components. + + +Design Hierarchy +---------------- + + sn76489_top + | + +-- sn76489_latch_ctrl + | + +-- sn76489_clock_div + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + \-- sn76489_noise + | + \-- sn76489_attentuator + +Resulting compilation sequence: + + sn76489_comp_pack-p.vhd + sn76489_top.vhd + sn76489_latch_ctrl.vhd + sn76489_latch_ctrl-c.vhd + sn76489_clock_div.vhd + sn76489_clock_div-c.vhd + sn76489_attenuator.vhd + sn76489_attenuator-c.vhd + sn76489_tone.vhd + sn76489_tone-c.vhd + sn76489_noise.vhd + sn76489_noise-c.vhd + sn76489_top-c.vhd + +Skip the files containing VHDL configurations when analyzing the code for +synthesis. + + +References +---------- + +* TI Data sheet SN76489.pdf + ftp://ftp.whtech.com/datasheets%20&%20manuals/SN76489.pdf + +* John Kortink's article on the SN76489: + http://web.inter.nl.net/users/J.Kortink/home/articles/sn76489/ + +* Maxim's "SN76489 notes" in + http://www.smspower.org/maxim/docs/SN76489.txt diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_attenuator.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_attenuator.vhd new file mode 100644 index 00000000..444064e5 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_attenuator.vhd @@ -0,0 +1,114 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_attenuator.vhd,v 1.7 2006/02/27 20:30:10 arnim Exp $ +-- +-- Attenuator Module +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_attenuator is + + port ( + attenuation_i : in std_logic_vector(0 to 3); + factor_i : in signed(0 to 1); + product_o : out signed(0 to 7) + ); + +end sn76489_attenuator; + + +architecture rtl of sn76489_attenuator is + +begin + + ----------------------------------------------------------------------------- + -- Process attenuate + -- + -- Purpose: + -- Determine the attenuation and generate the resulting product. + -- + -- The maximum attenuation value is 31 which corresponds to volume off. + -- As described in the data sheet, the maximum "playing" attenuation is + -- 28 = 16 + 8 + 4 + -- + -- The table for the volume constants is derived from the following + -- formula (each step is 2dB voltage): + -- v(0) = 31 + -- v(n+1) = v(n) * 0.79432823 + -- + attenuate: process (attenuation_i, + factor_i) + + type volume_t is array (natural range 0 to 15) of natural; + constant volume_c : volume_t := + (31, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3, 2, 2, 2, 1, 0); + + variable attenuation_v : unsigned(attenuation_i'range); + variable volume_v : signed(product_o'range); + + begin + + attenuation_v := unsigned(attenuation_i); + + -- volume look-up table + volume_v := to_signed(volume_c(to_integer(attenuation_v)), + product_o'length); + + -- this replaces a multiplier and consumes a bit fewer + -- resources + case to_integer(factor_i) is + when +1 => + product_o <= volume_v; + when -1 => + product_o <= -volume_v; + when others => + product_o <= (others => '0'); + end case; + + end process attenuate; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_clock_div.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_clock_div.vhd new file mode 100644 index 00000000..eab86beb --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_clock_div.vhd @@ -0,0 +1,134 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_clock_div.vhd,v 1.4 2005/10/10 21:51:27 arnim Exp $ +-- +-- Clock Divider Circuit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity sn76489_clock_div is + + generic ( + clock_div_16_g : integer := 1 + ); + port ( + clock_i : in std_logic; + clock_en_i : in std_logic; + res_n_i : in std_logic; + clk_en_o : out boolean + ); + +end sn76489_clock_div; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of sn76489_clock_div is + + signal cnt_s, + cnt_q : unsigned(3 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the sequential counter element. + -- + seq: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + cnt_q <= (others => '0'); + elsif clock_i'event and clock_i = '1' then + cnt_q <= cnt_s; + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements the combinational counter logic. + -- + comb: process (clock_en_i, + cnt_q) + begin + -- default assignments + cnt_s <= cnt_q; + clk_en_o <= false; + + if clock_en_i = '1' then + + if cnt_q = 0 then + clk_en_o <= true; + + if clock_div_16_g = 1 then + cnt_s <= to_unsigned(15, cnt_q'length); + elsif clock_div_16_g = 0 then + cnt_s <= to_unsigned( 1, cnt_q'length); + else + -- pragma translate_off + assert false + report "Generic clock_div_16_g must be either 0 or 1." + severity failure; + -- pragma translate_on + end if; + + else + cnt_s <= cnt_q - 1; + + end if; + + end if; + + end process comb; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_latch_ctrl.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_latch_ctrl.vhd new file mode 100644 index 00000000..789720c2 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_latch_ctrl.vhd @@ -0,0 +1,138 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_latch_ctrl.vhd,v 1.6 2006/02/27 20:30:10 arnim Exp $ +-- +-- Latch Control Unit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity sn76489_latch_ctrl is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + ce_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector(0 to 7); + ready_o : out std_logic; + tone1_we_o : out boolean; + tone2_we_o : out boolean; + tone3_we_o : out boolean; + noise_we_o : out boolean; + r2_o : out std_logic + ); + +end sn76489_latch_ctrl; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of sn76489_latch_ctrl is + + signal reg_q : std_logic_vector(0 to 2); + signal we_q : boolean; + signal ready_q : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the sequential elements. + -- + seq: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + reg_q <= (others => '0'); + we_q <= false; + ready_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + -- READY Flag Output ---------------------------------------------------- + if ready_q = '0' and we_q then + if clk_en_i then + -- assert READY when write access happened + ready_q <= '1'; + end if; + elsif ce_n_i = '1' then + -- deassert READY when access has finished + ready_q <= '0'; + end if; + + -- Register Selection --------------------------------------------------- + if ce_n_i = '0' and we_n_i = '0' then + if clk_en_i then + if d_i(0) = '1' then + reg_q <= d_i(1 to 3); + end if; + we_q <= true; + end if; + else + we_q <= false; + end if; + + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output mapping + ----------------------------------------------------------------------------- + tone1_we_o <= reg_q(0 to 1) = "00" and we_q; + tone2_we_o <= reg_q(0 to 1) = "01" and we_q; + tone3_we_o <= reg_q(0 to 1) = "10" and we_q; + noise_we_o <= reg_q(0 to 1) = "11" and we_q; + + r2_o <= reg_q(2); + + ready_o <= ready_q + when ce_n_i = '0' else + '1'; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_noise.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_noise.vhd new file mode 100644 index 00000000..688bdd56 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_noise.vhd @@ -0,0 +1,278 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_noise.vhd,v 1.6 2006/02/27 20:30:10 arnim Exp $ +-- +-- Noise Generator +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_noise is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + we_i : in boolean; + d_i : in std_logic_vector(0 to 7); + r2_i : in std_logic; + tone3_ff_i : in std_logic; + noise_o : out signed(0 to 7) + ); + +end sn76489_noise; + +architecture rtl of sn76489_noise is + + signal nf_q : std_logic_vector(0 to 1); + signal fb_q : std_logic; + signal a_q : std_logic_vector(0 to 3); + signal freq_cnt_q : unsigned(0 to 6); + signal freq_ff_q : std_logic; + + signal shift_source_s, + shift_source_q : std_logic; + signal shift_rise_edge_s : boolean; + + signal lfsr_q : std_logic_vector(0 to 15); + + signal freq_s : signed(0 to 1); + +begin + + ----------------------------------------------------------------------------- + -- Process cpu_regs + -- + -- Purpose: + -- Implements the registers writable by the CPU. + -- + cpu_regs: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + nf_q <= (others => '0'); + fb_q <= '0'; + a_q <= (others => '1'); + + elsif clock_i'event and clock_i = '1' then + if clk_en_i and we_i then + if r2_i = '0' then + -- access to control register + -- both access types can write to the control register! + nf_q <= d_i(6 to 7); + fb_q <= d_i(5); + + else + -- access to attenuator register + -- both access types can write to the attenuator register! + a_q <= d_i(4 to 7); + + end if; + end if; + end if; + end process cpu_regs; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process freq_gen + -- + -- Purpose: + -- Implements the frequency generation components. + -- + freq_gen: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + freq_cnt_q <= (others => '0'); + freq_ff_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if freq_cnt_q = 0 then + -- reload frequency counter according to NF setting + case nf_q is + when "00" => + freq_cnt_q <= to_unsigned(16 * 2 - 1, freq_cnt_q'length); + when "01" => + freq_cnt_q <= to_unsigned(16 * 4 - 1, freq_cnt_q'length); + when "10" => + freq_cnt_q <= to_unsigned(16 * 8 - 1, freq_cnt_q'length); + when others => + null; + end case; + + freq_ff_q <= not freq_ff_q; + + else + -- decrement frequency counter + freq_cnt_q <= freq_cnt_q - 1; + + end if; + + end if; + end if; + end process freq_gen; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Multiplex the source of the LFSR's shift enable + ----------------------------------------------------------------------------- + shift_source_s <= tone3_ff_i + when nf_q = "11" else + freq_ff_q; + + ----------------------------------------------------------------------------- + -- Process rise_edge + -- + -- Purpose: + -- Detect the rising edge of the selected LFSR shift source. + -- + rise_edge: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + shift_source_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + shift_source_q <= shift_source_s; + end if; + end if; + end process rise_edge; + -- + ----------------------------------------------------------------------------- + + -- detect rising edge on shift source + shift_rise_edge_s <= shift_source_q = '0' and shift_source_s = '1'; + + + ----------------------------------------------------------------------------- + -- Process lfsr + -- + -- Purpose: + -- Implements the LFSR that generates noise. + -- Note: This implementation shifts the register right, i.e. from index + -- 15 towards 0 => bit 15 is the input, bit 0 is the output + -- + -- Tapped bits according to MAME's sn76496.c, implemented in function + -- lfsr_tapped_f. + -- + lfsr: process (clock_i, res_n_i) + + function lfsr_tapped_f(lfsr : in std_logic_vector) return std_logic is + constant tapped_bits_c : std_logic_vector(0 to 15) + -- tapped bits are 0, 2, 15 + := "1010000000000001"; + variable parity_v : std_logic; + begin + parity_v := '0'; + + for idx in lfsr'low to lfsr'high loop + parity_v := parity_v xor (lfsr(idx) and tapped_bits_c(idx)); + end loop; + + return parity_v; + end; + + begin + if res_n_i = '0' then + -- reset LFSR to "0000000000000001" + lfsr_q <= (others => '0'); + lfsr_q(lfsr_q'right) <= '1'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if we_i and r2_i = '0' then + -- write to noise register + -- -> reset LFSR + lfsr_q <= (others => '0'); + lfsr_q(lfsr_q'right) <= '1'; + + elsif shift_rise_edge_s then + + -- shift LFSR left towards MSB + for idx in lfsr_q'right-1 downto lfsr_q'left loop + lfsr_q(idx) <= lfsr_q(idx+1); + end loop; + + -- determine input bit + if fb_q = '0' then + -- "Periodic" Noise + -- -> input to LFSR is output + lfsr_q(lfsr_q'right) <= lfsr_q(lfsr_q'left); + else + -- "White" Noise + -- -> input to LFSR is parity of tapped bits + lfsr_q(lfsr_q'right) <= lfsr_tapped_f(lfsr_q); + end if; + + end if; + + end if; + end if; + end process lfsr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Map output of LFSR to signed value for attenuator. + ----------------------------------------------------------------------------- + freq_s <= to_signed(+1, 2) + when lfsr_q(0) = '1' else + to_signed( 0, 2); + + + ----------------------------------------------------------------------------- + -- The attenuator itself + ----------------------------------------------------------------------------- + attenuator_b : entity work.sn76489_attenuator + port map ( + attenuation_i => a_q, + factor_i => freq_s, + product_o => noise_o + ); + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_tone.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_tone.vhd new file mode 100644 index 00000000..3658efcc --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_tone.vhd @@ -0,0 +1,188 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_tone.vhd,v 1.5 2006/02/27 20:30:10 arnim Exp $ +-- +-- Tone Generator +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_tone is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + we_i : in boolean; + d_i : in std_logic_vector(0 to 7); + r2_i : in std_logic; + ff_o : out std_logic; + tone_o : out signed(0 to 7) + ); + +end sn76489_tone; + +architecture rtl of sn76489_tone is + + signal f_q : std_logic_vector(0 to 9); + signal a_q : std_logic_vector(0 to 3); + signal freq_cnt_q : unsigned(0 to 9); + signal freq_ff_q : std_logic; + + signal freq_s : signed(0 to 1); + + function all_zero(a : in std_logic_vector) return boolean is + variable result_v : boolean; + begin + result_v := true; + + for idx in a'low to a'high loop + if a(idx) /= '0' then + result_v := false; + end if; + end loop; + + return result_v; + end; + +begin + + ----------------------------------------------------------------------------- + -- Process cpu_regs + -- + -- Purpose: + -- Implements the registers writable by the CPU. + -- + cpu_regs: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + f_q <= (others => '0'); + a_q <= (others => '1'); + + elsif clock_i'event and clock_i = '1' then + if clk_en_i and we_i then + if r2_i = '0' then + -- access to frequency register + if d_i(0) = '0' then + f_q(0 to 5) <= d_i(2 to 7); + else + f_q(6 to 9) <= d_i(4 to 7); + end if; + + else + -- access to attenuator register + -- both access types can write to the attenuator register! + a_q <= d_i(4 to 7); + + end if; + end if; + end if; + end process cpu_regs; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process freq_gen + -- + -- Purpose: + -- Implements the frequency generation components. + -- + freq_gen: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + freq_cnt_q <= (others => '0'); + freq_ff_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if freq_cnt_q = 0 then + -- update counter from frequency register + freq_cnt_q <= unsigned(f_q); + + -- and toggle the frequency flip-flop if enabled + if not all_zero(f_q) then + freq_ff_q <= not freq_ff_q; + else + -- if frequency setting is 0, then keep flip-flop at +1 + freq_ff_q <= '1'; + end if; + + else + -- decrement frequency counter + freq_cnt_q <= freq_cnt_q - 1; + + end if; + end if; + end if; + end process freq_gen; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Map frequency flip-flop to signed value for attenuator. + ----------------------------------------------------------------------------- + freq_s <= to_signed(+1, 2) + when freq_ff_q = '1' else + to_signed(-1, 2); + + + ----------------------------------------------------------------------------- + -- The attenuator itself + ----------------------------------------------------------------------------- + attenuator_b : entity work.sn76489_attenuator + port map ( + attenuation_i => a_q, + factor_i => freq_s, + product_o => tone_o + ); + + + ----------------------------------------------------------------------------- + -- Output mapping + ----------------------------------------------------------------------------- + ff_o <= freq_ff_q; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_top.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_top.vhd new file mode 100644 index 00000000..c26d0e1a --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/sound/sn76489/sn76489_top.vhd @@ -0,0 +1,200 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_top.vhd,v 1.9 2006/02/27 20:30:10 arnim Exp $ +-- +-- Chip Toplevel +-- +-- References: +-- +-- * TI Data sheet SN76489.pdf +-- ftp://ftp.whtech.com/datasheets%20&%20manuals/SN76489.pdf +-- +-- * John Kortink's article on the SN76489: +-- http://web.inter.nl.net/users/J.Kortink/home/articles/sn76489/ +-- +-- * Maxim's "SN76489 notes" in +-- http://www.smspower.org/maxim/docs/SN76489.txt +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library ieee; +use ieee.numeric_std.all; + +entity sn76489_top is + + generic ( + clock_div_16_g : integer := 1 + ); + port ( + clock_i : in std_logic; + clock_en_i : in std_logic; + res_n_i : in std_logic; + ce_n_i : in std_logic; + we_n_i : in std_logic; + ready_o : out std_logic; + d_i : in std_logic_vector(0 to 7); + aout_o : out signed(0 to 7) + ); + +end sn76489_top; + +architecture struct of sn76489_top is + + signal clk_en_s : boolean; + + signal tone1_we_s, + tone2_we_s, + tone3_we_s, + noise_we_s : boolean; + signal r2_s : std_logic; + + signal tone1_s, + tone2_s, + tone3_s, + noise_s : signed(0 to 7); + + signal tone3_ff_s : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Clock Divider + ----------------------------------------------------------------------------- + clock_div_b : entity work.sn76489_clock_div + generic map ( + clock_div_16_g => clock_div_16_g + ) + port map ( + clock_i => clock_i, + clock_en_i => clock_en_i, + res_n_i => res_n_i, + clk_en_o => clk_en_s + ); + + + ----------------------------------------------------------------------------- + -- Latch Control = CPU Interface + ----------------------------------------------------------------------------- + latch_ctrl_b : entity work.sn76489_latch_ctrl + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + ce_n_i => ce_n_i, + we_n_i => we_n_i, + d_i => d_i, + ready_o => ready_o, + tone1_we_o => tone1_we_s, + tone2_we_o => tone2_we_s, + tone3_we_o => tone3_we_s, + noise_we_o => noise_we_s, + r2_o => r2_s + ); + + + ----------------------------------------------------------------------------- + -- Tone Channel 1 + ----------------------------------------------------------------------------- + tone1_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone1_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => open, + tone_o => tone1_s + ); + + ----------------------------------------------------------------------------- + -- Tone Channel 2 + ----------------------------------------------------------------------------- + tone2_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone2_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => open, + tone_o => tone2_s + ); + + ----------------------------------------------------------------------------- + -- Tone Channel 3 + ----------------------------------------------------------------------------- + tone3_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone3_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => tone3_ff_s, + tone_o => tone3_s + ); + + ----------------------------------------------------------------------------- + -- Noise Channel + ----------------------------------------------------------------------------- + noise_b : entity work.sn76489_noise + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => noise_we_s, + d_i => d_i, + r2_i => r2_s, + tone3_ff_i => tone3_ff_s, + noise_o => noise_s + ); + + + aout_o <= tone1_s + tone2_s + tone3_s + noise_s; + +end struct; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/spram.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/spram.vhd new file mode 100644 index 00000000..fa4a1fd7 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/spram.vhd @@ -0,0 +1,84 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY spram IS + GENERIC + ( + widthad_a : natural; + width_a : natural := 8 + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + data : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END spram; + + +ARCHITECTURE SYN OF spram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + COMPONENT altsyncram + GENERIC ( + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + power_up_uninitialized : STRING; + read_during_write_mode_port_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + wren_a : IN STD_LOGIC ; + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + wren_a => wren, + clock0 => clock, + address_a => address, + data_a => data, + q_a => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ttl_175.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ttl_175.vhd new file mode 100644 index 00000000..b6459332 --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ttl_175.vhd @@ -0,0 +1,129 @@ +------------------------------------------------------------------------------- +-- +-- TTL 74175 - Quad D-Type Flip-Flops with Clear +-- +-- $Id: ttl_175.vhd,v 1.5 2005/10/10 21:59:13 arnim Exp $ +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ttl_175 is + + port ( + ck_i : in std_logic; + ck_en_i : in std_logic; + por_n_i : in std_logic; + cl_n_i : in std_logic; + d_i : in std_logic_vector(4 downto 1); + q_o : out std_logic_vector(4 downto 1); + q_n_o : out std_logic_vector(4 downto 1); + d_o : out std_logic_vector(4 downto 1); + d_n_o : out std_logic_vector(4 downto 1) + ); + +end ttl_175; + + +architecture rtl of ttl_175 is + + signal flops_q, + flops_s : std_logic_vector(4 downto 1); + +begin + + ----------------------------------------------------------------------------- + -- Process flops + -- + -- Purpose: + -- Implement the sequential elements. + -- + -- Note: We assume that the sequential elements power-up to the same state + -- as forced into by cl_n_i. + -- + flops: process (ck_i, por_n_i) + begin + if por_n_i = '0' then + flops_q <= (others => '0'); + elsif ck_i'event and ck_i = '1' then + flops_q <= flops_s; + end if; + end process flops; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements the combinational logic. + -- + comb: process (flops_q, + cl_n_i, + d_i, + ck_en_i) + begin + -- default assignments + flops_s <= flops_q; + + if cl_n_i = '1' then + if ck_en_i = '1' then + flops_s <= d_i; + end if; + + else + -- pseudo-asynchronous clear + flops_s <= (others => '0'); + end if; + end process comb; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + q_o <= flops_q; + q_n_o <= not flops_q; + d_o <= flops_s; + d_n_o <= not flops_s; + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ttl_393.vhd b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ttl_393.vhd new file mode 100644 index 00000000..3ef25d4b --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/ttl_393.vhd @@ -0,0 +1,152 @@ +------------------------------------------------------------------------------- +-- +-- TTL 74LS393 - Dual 4-Bit Binary Counter +-- +-- $Id: ttl_393.vhd,v 1.3 2005/10/10 21:59:13 arnim Exp $ +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity ttl_393 is + + port ( + ck_i : in std_logic; + ck_en_i : in std_logic_vector(2 downto 1); + por_n_i : in std_logic; + cl_i : in std_logic_vector(2 downto 1); + qa_o : out std_logic_vector(2 downto 1); + qb_o : out std_logic_vector(2 downto 1); + qc_o : out std_logic_vector(2 downto 1); + qd_o : out std_logic_vector(2 downto 1); + da_o : out std_logic_vector(2 downto 1); + db_o : out std_logic_vector(2 downto 1); + dc_o : out std_logic_vector(2 downto 1); + dd_o : out std_logic_vector(2 downto 1) + ); + +end ttl_393; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of ttl_393 is + + type cnt_q_t is array (natural range 2 downto 1) of unsigned(3 downto 0); + type cnt_d_t is array (natural range 2 downto 1) of unsigned(4 downto 0); + signal cnt_q : cnt_q_t; + signal cnt_s : cnt_d_t; + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the flip-flops. + -- + -- Note: We assume that the sequential elements power-up to the same state + -- as forced into by cl_i. + -- + seq: process (ck_i, por_n_i) + begin + if por_n_i = '0' then + cnt_q(1) <= (others => '0'); + cnt_q(2) <= (others => '0'); + elsif ck_i'event and ck_i = '1' then + cnt_q(1) <= cnt_s(1)(3 downto 0); + cnt_q(2) <= cnt_s(2)(3 downto 0); + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process adder + -- + -- Purpose: + -- Implements the adder. + -- + adder: process (ck_en_i, + cl_i, + cnt_q) + begin + for idx in 2 downto 1 loop + cnt_s(idx) <= '0' & cnt_q(idx); + + if cl_i(idx) = '0' then + if ck_en_i(idx) = '1' then + -- increment upon enable + cnt_s(idx) <= ('0' & cnt_q(idx)) + 1; + end if; + + else + -- pseudo-asynchronous clear + cnt_s(idx) <= (others => '0'); + end if; + end loop; + end process adder; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output Mapping + ----------------------------------------------------------------------------- + qa_o(1) <= cnt_q(1)(0); + qb_o(1) <= cnt_q(1)(1); + qc_o(1) <= cnt_q(1)(2); + qd_o(1) <= cnt_q(1)(3); + qa_o(2) <= cnt_q(2)(0); + qb_o(2) <= cnt_q(2)(1); + qc_o(2) <= cnt_q(2)(2); + qd_o(2) <= cnt_q(2)(3); + da_o(1) <= cnt_s(1)(0); + db_o(1) <= cnt_s(1)(1); + dc_o(1) <= cnt_s(1)(2); + dd_o(1) <= cnt_s(1)(3); + da_o(2) <= cnt_s(2)(0); + db_o(2) <= cnt_s(2)(1); + dc_o(2) <= cnt_s(2)(2); + dd_o(2) <= cnt_s(2)(3); + +end rtl; diff --git a/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/video_mixer.sv b/Arcade/Ladybug Hardware/Snapjack_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Ladybug Hardware/Snapjack_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/Arcade/Midway8080 Hardware/Midway8080_MiST/Midway8080.qpf b/Arcade/Midway8080 Hardware/Midway8080_MiST/Midway8080.qpf new file mode 100644 index 00000000..9d9324d0 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/Midway8080.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 10:56:36 February 09, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "10:56:36 February 09, 2017" + +# Revisions + +PROJECT_REVISION = "Midway8080" +PROJECT_REVISION = "invaders" diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/Midway8080.qsf b/Arcade/Midway8080 Hardware/Midway8080_MiST/Midway8080.qsf new file mode 100644 index 00000000..bbfbb296 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/Midway8080.qsf @@ -0,0 +1,164 @@ +# copyright (c) 1991-2005 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 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. + + +# the default values for assignments are stored in the file +# invaders_assignment_defaults.qdf +# if this file doesn't exist, and for assignments not listed, see file +# assignment_defaults.qdf + +# 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 LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files + +# pin & location assignments +# ========================== + +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_7 -to LED +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_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 + + +# analysis & synthesis assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY target_top + +# fitter assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_ASDO_AFTER_CONFIGURATION "AS INPUT TRI-STATED" + +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_COLOR 2147039 -section_id Top +set_global_assignment -name LL_ROOT_REGION ON -section_id "Root Region" +set_global_assignment -name LL_MEMBER_STATE LOCKED -section_id "Root Region" +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name VHDL_INPUT_VERSION VHDL_2008 +set_global_assignment -name VHDL_SHOW_LMF_MAPPING_MESSAGES OFF +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +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)" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON +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 LVCMOS" +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" +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 +set_global_assignment -name SEARCH_PATH device/cycloneii/ -tag from_archive +set_global_assignment -name SEARCH_PATH pacman/openep3c16/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/component/cpu/t80/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/component/io/gamecube/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/component/io/maple/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/component/ps2/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/component/sound/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/component/toys/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/pace/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/pace/stubs/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/pace/video/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/platform/midway8080/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/platform/midway8080/invaders/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/platform/midway8080/invaders/roms/ -tag from_archive +set_global_assignment -name SEARCH_PATH src/target/mist/ -tag from_archive +set_global_assignment -name VERILOG_FILE src/mist/ps2_intf.v +set_global_assignment -name VERILOG_FILE src/mist/osd.v +set_global_assignment -name VERILOG_FILE src/mist/keyboard.v +set_global_assignment -name VHDL_FILE src/Z80.vhd +set_global_assignment -name VERILOG_FILE src/mist/user_io.v +set_global_assignment -name VHDL_FILE src/mist/target_top.vhd +set_global_assignment -name VHDL_FILE src/mist/target_pkg.vhd +set_global_assignment -name VHDL_FILE src/mist/sigma_delta_dac.vhd +set_global_assignment -name VHDL_FILE src/mist/custom_io.vhd +set_global_assignment -name VHDL_FILE src/video_mixer.vhd +set_global_assignment -name VHDL_FILE src/video_controller_pkg_body.vhd +set_global_assignment -name VHDL_FILE src/video_controller_pkg.vhd +set_global_assignment -name VHDL_FILE src/video_controller.vhd +set_global_assignment -name VHDL_FILE src/tilemapctl_e.vhd +set_global_assignment -name VHDL_FILE src/sprom.vhd +set_global_assignment -name VHDL_FILE src/sprite_pkg_body.vhd +set_global_assignment -name VHDL_FILE src/sprite_pkg.vhd +set_global_assignment -name VHDL_FILE src/spram.vhd +set_global_assignment -name VHDL_FILE src/Sound.vhd +set_global_assignment -name VHDL_FILE src/project_pkg.vhd +set_global_assignment -name QIP_FILE src/pllclk_ez.qip +set_global_assignment -name VHDL_FILE src/platform_variant_pkg.vhd +set_global_assignment -name VHDL_FILE src/platform_pkg.vhd +set_global_assignment -name VHDL_FILE src/platform.vhd +set_global_assignment -name VHDL_FILE src/pace_pkg_body.vhd +set_global_assignment -name VHDL_FILE src/pace_pkg.vhd +set_global_assignment -name VHDL_FILE src/pace.vhd +set_global_assignment -name VHDL_FILE src/invaders_audio.vhd +set_global_assignment -name VHDL_FILE src/Inputs.VHD +set_global_assignment -name VHDL_FILE src/InputMapper.VHDL +set_global_assignment -name VHDL_FILE src/Graphics.VHD +set_global_assignment -name VHDL_FILE src/dpram_1r1w.vhd +set_global_assignment -name VHDL_FILE src/dpram.vhd +set_global_assignment -name VHDL_FILE src/clk_div.vhd +set_global_assignment -name VHDL_FILE src/bitmapctl_e.vhd +set_global_assignment -name VHDL_FILE src/bitmapctl.vhd +set_global_assignment -name VHDL_FILE src/altera_mem.vhd +set_global_assignment -name VHDL_FILE src/ps2kbd.vhd +set_global_assignment -name VHDL_FILE src/ps2kbd_pkg.vhd +set_global_assignment -name VHDL_FILE src/T80_Pack.vhd +set_global_assignment -name VHDL_FILE src/T80se.vhd +set_global_assignment -name VHDL_FILE src/T80.vhd +set_global_assignment -name VHDL_FILE src/T80_ALU.vhd +set_global_assignment -name VHDL_FILE src/T80_Reg.vhd +set_global_assignment -name VHDL_FILE src/T80_MCode.vhd +set_global_assignment -name QIP_FILE src/mist/pll27.qip +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/README.txt b/Arcade/Midway8080 Hardware/Midway8080_MiST/README.txt new file mode 100644 index 00000000..59855f77 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/README.txt @@ -0,0 +1,22 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Space Invaders port to MiST by Gehstock +-- 10 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of MIDWAY8080 hardware +--------------------------------------------------------------------------------- +-- +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE : Fire +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Galaxy_Wars(Midway8080).rbf b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Galaxy_Wars(Midway8080).rbf new file mode 100644 index 00000000..a77e6f8d Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Galaxy_Wars(Midway8080).rbf differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Lunar_Rescue(Midway8080).rbf b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Lunar_Rescue(Midway8080).rbf new file mode 100644 index 00000000..195e9533 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Lunar_Rescue(Midway8080).rbf differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Space_Attack_II(Midway8080).rbf b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Space_Attack_II(Midway8080).rbf new file mode 100644 index 00000000..ed1a4415 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Space_Attack_II(Midway8080).rbf differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Space_Invaders(Midway8080).rbf b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Space_Invaders(Midway8080).rbf new file mode 100644 index 00000000..ab3fee8e Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Space_Invaders(Midway8080).rbf differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Space_Invaders_Deluxe(Midway8080).rbf b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Space_Invaders_Deluxe(Midway8080).rbf new file mode 100644 index 00000000..37be9127 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Space_Invaders_Deluxe(Midway8080).rbf differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Space_Laser(Midway8080).rbf b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Space_Laser(Midway8080).rbf new file mode 100644 index 00000000..5c3f030d Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Space_Laser(Midway8080).rbf differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Super_Earth_Invasion(Midway8080).rbf b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Super_Earth_Invasion(Midway8080).rbf new file mode 100644 index 00000000..30420d93 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/Release/Super_Earth_Invasion(Midway8080).rbf differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/clean.bat b/Arcade/Midway8080 Hardware/Midway8080_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/readme.md b/Arcade/Midway8080 Hardware/Midway8080_MiST/readme.md new file mode 100644 index 00000000..dd48826a --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/readme.md @@ -0,0 +1,19 @@ +Midway 8080 Arcade Platform for Mist FPGA + +- with OSD +- Keyboard/Joystick Support +- only VGA Supported + + + +Following Games currently working: + +Space Invaders +Space Invaders 2 +Super Earth Invasion +Lunar Rescue +Space Laser +Galaxy Wars +Space Attack II + +See File platform_variant_pkg.vhd diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/280zzzap.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/280zzzap.hex new file mode 100644 index 00000000..65555ea7 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/280zzzap.hex @@ -0,0 +1,194 @@ +:020000040000FA +:200000000000AFD305C36400F5C5D50E00C39E06F5C5D50E01C39E06E3D5C5F5E925302059 +:20002000E1F1C1D1E1C93500C3160F05B4041404E37E23E3CD910F77DF215E207E23B6E6BA +:200040001FCA5D0001FF1DCD6201215E207ECD5E0F237ECD5E0FE701FF1DC3620101001D93 +:20006000CD6201E7DB02E60CFE04C2610B0601110000210020D307707EA8CA8C004F7DE699 +:200080000179C28A00B257C38C00B35F237CFE40C27500D3072B7CFE1FCAC9007EA8CAB04B +:2000A000004F7DE60179C2AE00B257C3B000B35F782F77AECA93004F7DE60179C2C400B289 +:2000C00057C3C600B35FC39300D307237CFE40CAEC00782FAECAE7004F7DE60179C2E50092 +:2000E000B257C3E700B35FAF77C3C900780747D272007AB3CA1B01EBF91100200600210030 +:2001000000390E10AF29DA0A012F12133E1812130DC2040105C2FE00C35401310024210CC9 +:2001200028E5210000115901010004AF86D307230DC22C0105C22C01A7CA46011AE3EBC59A +:20014000CD8103C1EBE3137CFE18C22801E17DFE0CCA0000D307C354014847464544430169 +:2001600000E011004021000039EBF3F9EB7841C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C53DEC +:20018000C26F01F9FBC93C7E6666666666667E3C181C1818181818183C3C3C7E66607C3E22 +:2001A00006067E7E3C7E6660387860667E3C666666667E7E606060603E3E06063E7E606669 +:2001C0007E3C3C3E06063E7E66667E3C7E7E60703038181C0C0C3C7E66663C7E66667E3C57 +:2001E0003C7E66667E7C60607C3C00181800000000181800FFFFFFFFFFFF7777FFFF7F7FC3 +:200200007F7F7FFF7777FFFF1F7F1FDF1FFF7777FFFF000000000000000018181818181840 +:2002200018180000181800000000000000000000183C7E6666667E7E66663E7E66663E7E4E +:2002400066667E3E3C7E6606060606667E3C3E7E6666666666667E3E7E7E06063E3E060652 +:200260007E7E7E7E06063E3E060606063C7E6606067676667E3C666666667E7E6666666682 +:200280003C3C1818181818183C3C60606060606060667E3C6666763E1E1E3E7666660606D6 +:2002A0000606060606067E7EC3C3E7E7FFFFDBC3C3C366666E6E7E7E767666663C7E6666C6 +:2002C000666666667E3C3E7E66667E3E060606063C7E6666666666667E5C3E7E66667E3E34 +:2002E000766666663C7E66063E7C60667E3C7E7E181818181818181866666666666666660A +:200300007E3C66666666667E3C3C1818C3C3C3DBFFFFE7E7C3C366667E3C18183C7E66664D +:2003200066667E3C1818181818187E7E6070381C0E067E7E1155555511FF7777F7F7115713 +:20034000515D11FF7777F7F71555515717FF7777F7F7115D515511FF7777F7F711555155F3 +:2003600011FF7777F7F77EE6F0C275033E40CD8103C37C037E07070707CD7D037EE60FC6D2 +:2003800030E67FFE300600D28F034FEB09EBC9E5D5CDB2037CFE3B3E00DA9D032F4FC51A33 +:2003A00013A97701200009C105C29E03D113E1C90600D6304F6069292929090901860109E7 +:2003C000060AEBC9CD8810E61C4F060021A50F091100280604CDE2037BC6085F2305C2D563 +:2003E00003C97EDFCDB003E51A131FDCFA0323A7C2EA03E12405C2E703E7E5D5C5F501FFC0 +:2004000008112000711905C20404E76DFF1904053E042B000527050F043B002704139D0509 +:200420002204271D06220436FE3504033E04300403B40439047F0000000327052B04032642 +:200440000000800100800700E00F00BC1F00E61B00671B007F0F03EE81073CC00F10FC1F0A +:2004600010C00F20400F40E00F80F00F80C10F80C10700030300830700FE3F00FE7F00E0BE +:20048000EF0080CF0080CF0080CF0080CF0080DF00C0DF00C01F00E01F00F00E00700E00D9 +:2004A000380E00381C00303800707000606000606000787803252000800100800700E00FAB +:2004C00000BC1900F61900FF1F03EF8F07EEC10F3CFC1F10C00F20400F40E00F80F00F8001 +:2004E000C10F80C10700030300830700FE0F00FE0F00E00F00800F00800F00800F00800F0F +:2005000000801F00801F00801F00801F00800F0080070080070080070080030000030000B5 +:200520000300000300C00303260000800100800700E00D00F81D009E1F009F1B00FF0F0337 +:20054000F681073CC00F10FC1F10C00F20400F40E00F80F00F80C10F80C1070003030083CA +:200560000700FE0F00FE1F00E03F00806F00806F00806F00806F00803F00801F00801F0072 +:20058000C01F00C01F00C00700E00300E01900E01C006038006070006060007878041FDFE4 +:2005A0000000003000000078000000FC0000C0FF013303FC003303F400CC00FE00CC00FFE6 +:2005C000003303FC0033037C00CC003000CC00F800FFFFFF1F00F0FF3F0000FF700000FCC2 +:2005E000E00000FCC00000F8810000F8810000F8810000FC030000FC030000DE0300008E87 +:2006000003000007070080030E008001FC008001F8008001800080018000E00180041FDFDD +:20062000009F0F3000930D7800830DFC0083CDFF019B0DFC00930DF4009F0FFE000000FC08 +:20064000000020F80000807C00000030000000F800FFFFFF1F33E3FF3F3303FF70CC00FC81 +:20066000E0CC00FCC03303F8813303F881CC00F881CC00FC030000FC030000DE0300008E36 +:2006800003000007070080030E008001FC008001F8008001800080018000E00180E0E5DBBF +:2006A0000047DB00A8E640C2BE0678212020AE70E640CABE0678E640C2BE06233601212456 +:2006C000207EA9C2DA067E21D206E5A7C28B08C3E0062124207E3CE60177E1D1C1F1FBC98B +:2006E0003A2220A7FA9D0AC80FD231082A2720CDC909CDC909CDC909CDC909CDC909CDC932 +:2007000009012000CDE509CDE509CDE509CDE509CDE509CDE5092A2520CDFB09CDFB09CD6F +:20072000FB09CDFB09CDFB09CDFB09CD330ACD330ACD330ACD330ACD330ACD330ACDEF0842 +:200740003A3E2121432135F26D073603213E217E23BECA6D07DA6607FE04D26107AFC36B2A +:2007600007D604C36B075F3A5A20832B775F16002A47207CA7CA7C07192247202A49207C04 +:20078000A7CA880719224920EB29292929EB2A3B2019223B207C2FE61FC6403203204A16B5 +:2007A000003A3720CD5C08F5783202203A2220EE03CA30083A3E21A7CA30083A372047CD60 +:2007C00087080F0F0FE6062F3CC60BB9D2E8072F3C813C0FE6034F324121F17842A7F20173 +:2007E00008792F3C4FC3FF07AF324121790FE60781793A3A20CD5C0842D1824FF201080699 +:20080000FF2A0020092200207CA7CA22083A2220EE05CA1A0821222034C97C2F6F26002210 +:2008200000207DCD8708FE287C8F324021C33108F1214520DB007723DB0177CD4E08213F3D +:2008400020CD490823CD4908237EA7C835C9212E207EA7C835C03A2D20D305C9A7F5CD87A2 +:20086000085F216D11197E4759212E121986F27B085AFEEEDA81081CC381085F21AE11195D +:200880005EF17BF02F3CC9A7F02FC93A2220A7F80FD02A272011460019CDC909CDC9092A98 +:2008A000252011460019CD5C0ACD5C0A2A2720113C0019CDC909CDC9092A2520113C001933 +:2008C000CD5C0ACD5C0A2A2720EB2A2520222720EB2225202260203E05D304AFD3033A03AE +:2008E00020CD0D092103207EC62077D2E108C92A60207CB5C83E05D304AFD3032103207E4E +:20090000E61F77CD0D092103207EC620774F0600214521094E3A022081A7F22B09FEEED2BE +:20092000260968C331092E01C331094F21AE11096E603A3720A7F23F09AF956F789C67EB66 +:200940002A0020192204203A03204F214522097E320820577E2106200FE67F5F0FE61F775F +:20096000230F0FE6074F3C777A50835FD52A042019E5097CE1CD8D09D1AF935F3E009A5710 +:20098000AF914F3E0098472A042009197CA7C2BC09EB2A60203A072077233A062077237B8C +:2009A000D303E60777233A0820D303DB037723AFD303DB03C6247723226020C92A602036F8 +:2009C0000011050019226020C97EA7CA610A234623235E235623E5EB111F00722372190555 +:2009E000C2DB09E1C97EA7CA610A237E23235E235623EB70093DC2F309EBC97EA7CA610AFF +:200A00004F2346237E235E235623E5EBD304AFD30357E55921940A197ED303DB034FAFD3C4 +:200A2000031E1FE17EB17723DB03B6771905C2240AE1C97EA7CA610A2346237ED304AFD34C +:200A4000033E01D303DB034F235E235623E5EB1120007EB1771905C2520AE1C97EA7C2665A +:200A60000A11050019C94F2346237E235E235623E5D5D304AFD303575921940A197ED3030C +:200A8000DB034FAFD303DB031E1FE17123771905C28B0AE1C90103070F1F3F7FFFCDAA0A07 +:200AA000CDE80A21DA06E3C33108214B2035F2BA0AEB2A4D200609CDDF0A2154203A4C209E +:200AC0008677234FE6077723790F0F0FE61FC6A077233629214F2035F0EB2A522006057E51 +:200AE00023121305C2DF0AC92A56207CB5C82A58207CB5CA080B012605111B007872233D4A +:200B0000C2FD0A190DC2FC0A2A4D207CB5C2180B3E01322220C3520B2A50204E2346235ECC +:200B2000235623E52A5620192258203A5520D304AFD303D1C5E51A13D303DB0377230DC211 +:200B4000360BAFD303DB0377012000E109C105C2340B2A2520113C0019CDFB09CDFB09C968 +:200B60007F0100FF310520CD6201310024CDAF1021FFFF220920220B20CDB30EFBC31F0E5F +:200B8000D3072121207EA7CAB80BAF77473E0A322E203E22D305DB0207E6064F21CF0F09D3 +:200BA0005E2356212F20347EBBC2B80B70237E82773A2320A7CA2A0CCD0F103A2320A7CAF4 +:200BC000210C2141207EA7C2120C363C213420352142207EC6992777C20F0C3A2320EE03FC +:200BE000CAB60DDB020F0F0FE6064F0600211D00094E213E207EE6F02B860F0F0F0FB9DA35 +:200C0000B60D3E033223203A4420324220F781CDF10F2123207EFE01C03A3D20FE01D834A1 +:200C2000C9CD88103A4520E680C02130207EA7C835310024AF3222202A3D20222920113281 +:200C4000200628121305C2430C67DB020FE6066F11D70F197E324220237E3244203E003294 +:200C60002D203E20D302CD980E3E013223203EFF3241203EF8324820DB00E610CA810CF70E +:200C800065EF04210B04224D203EE03254203EFF322220EFE8CD800B2140217E23B6CAB046 +:200CA0000C3A3E21A7CAB00CCD330F0400C3B50CCD330F00002122207EEE05C2C70C3A40D9 +:200CC00020A7C2C70C36017EEE02CA590E2148207EA7FAEE0C36F82A322023223220213EA0 +:200CE000207EC6012777D2EB0C2B34CDDF0FCD770D3A3720CD87080F0F0F0FE603C610CD08 +:200D0000480F3A452047E60F57074F07814F78E6103A3E21CA390DFE28D2270DF7650E0070 +:200D20003E20D302C34F0D79074F7AF610D3023E01325A20F760C34F0DFE28DA430DF7662F +:200D4000C3450DF7607AF620D3023E02325A2079323F213A4620CD600D2F323A20C3950CD2 +:200D60003A46202FC681FE81DA710DFEC0D03EC0C9FE40D83E3FC93A3E21470F0F0FE61FC3 +:200D80002F3C80214221BEC8DA8F0D34C3900D357E0F0F0FE61FC6A55F16397EE6074F0696 +:200DA0000021950A097E2FEB0E1F11FF047723730915C2AD0DC93100243E04322220CD4BFE +:200DC0000E322320CDF10FCD440F092A2B20EB2A3D207DBBDAEF0DC2DF0D7ABCD2EF0D22D1 +:200DE0002B20CD5700CD5A0F6FCD5A0F84EFFFCD5700CD5A0F623A34204F06FF582A3220C5 +:200E00007CA7FA0A0E091CC3000E3A3520A77BC2130E3CC694CD5E0FEFFFEFFFCDB30E3E9B +:200E20000A323120CD4B0E3A3020A7CA350ECD440F08C3390ECD440F07EFFFCD440F0EEF5D +:200E4000FF21312035C2240EC31C0ECD330F02003E02322D20AFD302C9310024CD330F0387 +:200E60003CCDC40321352034CD280FAFD302CD330F020ACD280FCD330F0A50CD280FCD987F +:200E80000E3A2320FE013EFFCA8D0E3E783240203E05322220C3950CCDDE0ECD5A0F4BCDBC +:200EA000F10FCDDF0F3E013222203A2320EE03C0F781C9CDDE0ECD5A0F43F76CF78DCDDF90 +:200EC0000F212B2011B93CCDE50F21292011993ECDE50F3E033222203E50323F21C9AF323E +:200EE0002220CD5F0101FF1411803ACD6501215A200EEAAF77230DC2F40E3E01325A2021B8 +:200F0000622022272021D020222520218000220020CD5A0F2AC9E37E23E3323F20CD800B12 +:200F20003A3F20A7C21D0FC9CD800B3A2E20A7C2280FC9E34E234623E3212E207EA7C0700D +:200F400079D305C9E37E23E3CD910F77F501000A114025CD6501F1C35E0FE37E23E3E5070F +:200F6000F5070707E60E4F060021C50F095E2356F1E63ECA8F0FD54F213F12CD0010EB0965 +:200F80005E2356EBD17ECD81037E23A7F2850FE1C9C5F5070707E6074F0600215B2009F1D0 +:200FA000C1BEC0E1C9504F573F5A41503F57414D3F42414D3F5A4F524B42414E47424F4F78 +:200FC0004D5A4F4E4B00244038C03AA03C803E0101010202010203804001019950603021E9 +:200FE0003D2011D93ACD66033E3ECD810323C37403214712CD0010214220C36603A7000063 +:20100000DB02070707E6065F1600195E2356C93A4A20A7F8213620467E23BECA3710AE782E +:20102000FA2B10BED22F1035C33010BED22710343A3920324A20C9237EA7C22710473A239C +:20104000204F07814F217C1009113620CD8810E607CA6F10CD8810E67FD640121313CD8825 +:2010600010A6121323CD8810A62386C6FC12C9121313CD8810E63FC620C36210030300033B +:201080000300030102030003E5C521092006087E070707AE17172109207E1777237E17774B +:2010A000237E1777237E177705C29010C1E1C9214421363511E710014000CDC91023EB060C +:2010C00008CDDF0AEB2B013EFF1AD5160407075FE603A8F2D7103C862377157BC2CD10D1C2 +:2010E000130DC2C910C9D525555515151504511111044411041041041041010104040404FD +:20110000040101004010040100401001001004004004001001001000400100100040010018 +:20112000010004001000407F7974706B676460FEEEA6996555555451451111110441041038 +:201140004041004040100400400400100010001000010000040000040000004000000010AD +:2011600000000000400000000001000000818FA2ADB5BBC0C4C8CBCED0D3D5D7D9DBDCDEBD +:20118000DFE1E2E3E4E6E7E8E9EAEBECEDEDEEEFF0F1F1F2F3F4F4F5F6F6F7F7F8F9F9FA7E +:2011A000FAFBFBFCFCFDFDFEFEFFFFFFFFFF0101010101010101010101020202020202023D +:2011C00002020202020202020303030303030303030404040404040405050505050606069D +:2011E0000606070707070808080909090A0A0A0B0B0C0C0C0D0D0E0E0F101011111213137D +:20120000141516161718191A1B1C1D1E1F202123242527282A2B2D2F30323436383A3C3E21 +:20122000414346484B4E5154575A5C6164680001131E262C313335393B3D3F414243444DC0 +:2012400012F0135115B316C83AC83AC93ACA3AB812DB133C138113C612E012FD120913159A +:20126000131F13351343134F135F137013931281129412A6129C13A713B713C413D013D0E1 +:2012800013074D415840435552564540313630404D5048C0074D41584043555256454031AA +:2012A0003230404D50C8074D415840435552564540403830404D50C80A455854454E4445D1 +:2012C000444054494DC5045348494654404745415240494E544F404C4F574053504545C41D +:2012E00002534849465440544F404849474840464F52404D41584053434F5245BF0A494EC2 +:201300005345525440434F49CE0A5055534840425554544FCE0C47414D45404F5645D20599 +:201320005B3B5C3B5D3B5E3B5F3C5B3C5C3C5D3C5E3C5F3DDB0254494D453A090353434F7F +:201340005245BA03484947484053434F5245BA0350524556494F55534053434F5245BA08A5 +:2013600044415453554E40323830405A5A5A41D008434F4E47524154554C4154494F4E53E0 +:20138000BF03594F554048415645405345544041404E4557405245434F5244BF0A31025206 +:2013A0004F414440484FC708320246454E4445524042454E4445D2093302484F5440574853 +:2013C00045454CD30A340250524F4052414345D20A35024348414D50494FCE06594F5552A1 +:2013E00040524154494E47403140544F4035BA0000003C144015A214EC1449145E147314B4 +:20140000821491141F139B14AA14BE145F13D014931228142F143614051511151F152C15A7 +:20142000D013D013870000000C313630404BCD0C313230404BCD0D3830404BCD0A5A4549AE +:201440005440505241454D49C50647414E4740415546404C4F40534348414C5445CE0647FC +:20146000414E474041554640484940534348414C5445CE0947454C444045494E5745524622 +:2014800045CE094B4E4F50464044525545434B45CE0B535049454C454E44C5025A4549543F +:2014A0003A080350554E4B5445BA03484F4543485354454050554E4B545A41484CBA034CF6 +:2014C00045545A54454050554E4B545A41484CBA0247524154554C494552453F02534945AD +:2014E00040484142454E4045494E45CE044E4556454E4052454B4F5244404155464745539D +:2015000054454C4CD40A3102414E4641454E4745D209320253504F52544641485245D2096C +:20152000330252454E4E4641485245D20634024752414E444050524958404641485245D268 +:201540000752414E47464F4C47454031404249534035BA97151D163C130516AC15CF158FB4 +:2015600016A316C7151F1389156E167E165F13E915931228142F1436142E164116491656AA +:20158000165F165F16000000000254454D50533A0B53434F5245BA0654454D5053405355CE +:2015A00050504C454D454E54414952C50350415353455A404C41405052454D4945524540A6 +:2015C000564954455353C50C5445524D494EC50350415353455A404C41405345434F4E4426 +:2015E0004540564954455353C502425241564F3F02564F5553404156455A405245414C4996 +:2016000053454055CE044E4F5556454155405245434F52444044454050495354C508564FEE +:201620005452454043415445474F524945BA0752455052454E455A40554E45404C45434F35 +:20164000CE0C414D41544555D20A50524F46455353494F4E45CC0C4348414D50494FCE091A +:201660005355504552404348414D50494FCE0353434F5245404140424154545245BA0353BA +:20168000434F524540505245434544454E54BA06494E54524F4455495345524031404652E6 +:2016A000414EC307504F555353455A404C4540424F55544FCEFC167617F4165F170D1728C5 +:2016C00017DC17EC1740171F13EB16CE17BE175F135017931228142F14361483179717AB7F +:2016E00017BD17CD17CD1700000000025449454D504F3A060350554E54454FBA08544945A5 +:201700004D504F40455854454E444944CF0343414D4249454C4F4041404D454E4F53405661 +:20172000454C4F43494441C40443414D4249454C4F40414D41534056454C4F43494441C407 +:20174000084A5545474F405445524D494E4144CF0946454C494349544143494F4E45D30514 +:201760004849434953544540554E404E5545564F405245434FD20A54554050554E54454FA7 +:201780004045D3064C4C45564153404C414044454C414E544552C107564140454E405345BE +:2017A00047554E444F404C554741D2074C4C414E5441534043414C49454E5445D3060353A7 +:2017C0004547554E444F405055455354CF06035052494D4552405055455354CF08504F4E3A +:2017E0004741404C41404D4F4E4544C10841474143484140454C40424F544FCEFFFFFFFF74 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Gunfight/7609e.bin b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Gunfight/7609e.bin new file mode 100644 index 00000000..33e81491 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Gunfight/7609e.bin differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Gunfight/7609f.bin b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Gunfight/7609f.bin new file mode 100644 index 00000000..6ed65a9c Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Gunfight/7609f.bin differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Gunfight/7609g.bin b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Gunfight/7609g.bin new file mode 100644 index 00000000..93a4839f Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Gunfight/7609g.bin differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Gunfight/7609h.bin b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Gunfight/7609h.bin new file mode 100644 index 00000000..e7268c49 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Gunfight/7609h.bin differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Midway8080.txt b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Midway8080.txt new file mode 100644 index 00000000..13c51004 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/Midway8080.txt @@ -0,0 +1,1639 @@ + +ROM_START( searthin ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "earthinv.h", 0x0000, 0x0800, CRC(58a750c8) SHA1(90bfa4ea06f38e67fe4286d37d151632439249d2) ) + ROM_LOAD( "earthinv.g", 0x0800, 0x0800, CRC(b91742f1) SHA1(8d9ca92405fbaf1d5a7138d400986616378d061e) ) + ROM_LOAD( "earthinv.f", 0x1000, 0x0800, CRC(4acbbc60) SHA1(b8c1efb4251a1e690ff6936ec956d6f66136a085) ) + ROM_LOAD( "earthinv.e", 0x1800, 0x0800, CRC(df397b12) SHA1(e7e8c080cb6baf342ec637532e05d38129ae73cf) ) +ROM_END + +ROM_START( searthina ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "unkh.h1", 0x0000, 0x0400, CRC(272b9bf3) SHA1(dd57d6a88d42024a39640931114107b547b4c520) ) + ROM_LOAD( "unkg.g1", 0x0400, 0x0400, CRC(61bb6101) SHA1(8fc8bbd8ac93d239e0cf0e4881f709860ec2c973) ) + ROM_LOAD( "unkf.f1", 0x0800, 0x0400, CRC(2a8d9cd5) SHA1(7948d79b326e729bcb629607c8797156ff9fb0e8) ) + ROM_LOAD( "unke.e1", 0x0c00, 0x0400, CRC(1938d349) SHA1(3bd2a0deb126cf2e22bc3cb53e9a59c3875be260) ) + ROM_LOAD( "unkd.d1", 0x1000, 0x0400, CRC(9bc2ab88) SHA1(1e9f3b780135827d16ba25978382b097a8110828) ) + ROM_LOAD( "unkc.c1", 0x1400, 0x0400, CRC(d4e2dada) SHA1(e98271212fc89e240fdf97d292edd17dc8dd4191) ) + ROM_LOAD( "unkb.b1", 0x1800, 0x0400, CRC(ab645a9c) SHA1(9c286f8a031a8babfb8e9b594e05e133c338b342) ) + ROM_LOAD( "unka.a1", 0x1c00, 0x0400, CRC(4b65bd7c) SHA1(3931f9f5b0e3339ab484eee14473d3a474935fd9) ) +ROM_END + +ROM_START( searthie ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "searthie.h", 0x0000, 0x0800, CRC(92b08b91) SHA1(4cebb70735e5231717619c7b8e5d3080694338b7) ) + ROM_LOAD( "searthie.g", 0x0800, 0x0800, CRC(23e24bcc) SHA1(a62e8422554f7db34796d4fb1c01e8ddebc7e978) ) + ROM_LOAD( "searthie.f", 0x1000, 0x0800, CRC(8700286a) SHA1(e0a3c099bc60e70bc9a6c0325944454d9d26428f) ) + ROM_LOAD( "searthie.e", 0x1800, 0x0800, CRC(baf949b0) SHA1(bfda97a3ef59fcdf87814afc6918507190c3e315) ) +ROM_END + +ROM_START( invadrmr ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "11.1t", 0x0000, 0x0400, CRC(389d44b6) SHA1(5d2581b8bc0da918ce57cf319e06b5b31989c681) ) + ROM_LOAD( "sv02.1p", 0x0400, 0x0400, CRC(0e159534) SHA1(94b2015a9d38ca738705b8d024a79fd2f9855b98) ) + ROM_LOAD( "20.1n", 0x0800, 0x0400, CRC(805b04f0) SHA1(209f42dfde1593699ccf3755e9267d425416d910) ) + ROM_LOAD( "sv04.1j", 0x1400, 0x0400, CRC(1293b826) SHA1(165cd5d08a19eadbe954145b12807f10df9e691a) ) + ROM_LOAD( "13.1h", 0x1800, 0x0400, CRC(76b4a6ea) SHA1(076f8d12ba7ebe66b83a40d9a848075627776554) ) + ROM_LOAD( "sv06.1g", 0x1c00, 0x0400, CRC(2c68e0b4) SHA1(a5e5357120102ad32792bf3ef6362f45b7ba7070) ) +ROM_END + +ROM_START( claybust ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "0.a1", 0x0000, 0x0400, CRC(90810582) SHA1(a5c3655bae6f92a3cd0eae3a5a3c25e414d4fdf0) ) + ROM_LOAD( "1.a2", 0x0400, 0x0400, CRC(5ce6fb0e) SHA1(19fa3fbc0dd7e0fa4fffc005ded5a814c3b48f2d) ) + ROM_LOAD( "2.a4", 0x0800, 0x0400, CRC(d4c1d523) SHA1(1a4785095caa8200d7e1d8d53a93c8e298f52c65) ) + ROM_LOAD( "3.a5", 0x0c00, 0x0400, CRC(1ca00825) SHA1(74633a4903a51f1eebdd09679597dbe86db2e001) ) + ROM_LOAD( "4.a6", 0x1000, 0x0400, CRC(09a21120) SHA1(e976d2c173c649e51b032bc5dad54f006864155c) ) + ROM_LOAD( "5.a8", 0x1400, 0x0400, CRC(92cd4da8) SHA1(217e00012a52c479bf0b0cf37ce556387755740d) ) +ROM_END + +ROM_START( gunchamp ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "251.a1", 0x0000, 0x0400, CRC(f27a8c1e) SHA1(510debd1ac2c0986f99c217e3078208a39d7837c) ) + ROM_LOAD( "252.a2", 0x0400, 0x0400, CRC(d53b8f91) SHA1(56919f4c88fb3b5c23b5365f0866698bfceb2762) ) + ROM_LOAD( "253.a4", 0x0800, 0x0400, CRC(9ef35c6c) SHA1(95bda3e2cdd50f7ac989c581481bad5f1ef2992f) ) + ROM_LOAD( "254.a5", 0x0c00, 0x0400, CRC(ba5b562d) SHA1(47819d7e5ef3700e700a5f2faa9537bc2199561c) ) + ROM_LOAD( "255.a6", 0x1000, 0x0400, CRC(00ea8293) SHA1(9c921fa4bafc36fc16a3f5f8588887342936d433) ) + ROM_LOAD( "256.a8", 0x1400, 0x0400, CRC(e271150c) SHA1(36d0c0c1335036b4a994e8a38904adcf74161c59) ) + ROM_LOAD( "257.a9", 0x1800, 0x0400, CRC(0da5d9ad) SHA1(c87c6ab248bfd2b75f070343a8f7fcbaed13f4e3) ) + ROM_LOAD( "258.a10", 0x1c00, 0x0400, CRC(471d4052) SHA1(c8ccda2eba44c2ab49f5fc2874fe70c2bdae35d3) ) +ROM_END + +ROM_START( spaceatt ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "h", 0x0000, 0x0400, CRC(d0c32d72) SHA1(b3bd950b1ba940fbeb5d95e55113ed8f4c311434) ) // == SV01 + ROM_LOAD( "sv02.bin", 0x0400, 0x0400, CRC(0e159534) SHA1(94b2015a9d38ca738705b8d024a79fd2f9855b98) ) // == SV02 + ROM_LOAD( "f", 0x0800, 0x0400, CRC(483e651e) SHA1(ae795ee3bc53ac3936f6cf2c72cca7a890783513) ) // == SV10 + ROM_LOAD( "c", 0x1400, 0x0400, CRC(1293b826) SHA1(165cd5d08a19eadbe954145b12807f10df9e691a) ) // == SV04 + ROM_LOAD( "b", 0x1800, 0x0400, CRC(6fc782aa) SHA1(0275adbeec455e146f4443b0b836b1171436b79b) ) + ROM_LOAD( "a", 0x1c00, 0x0400, CRC(211ac4a3) SHA1(e08e90a4e77cfa30400626a484c9f37c87ea13f9) ) +ROM_END + +/* SPACE ATTACK set is from Video Game GmbH - 1010 A / Top board shows Video-Games - 6302 LICH - 1034 + Roms are set up as 1k bproms (82S137) and data is 1 rom top 4 bits, another bottom 4. This data once assembled matches original spaceatt set */ +ROM_START( spaceattbp ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROMX_LOAD( "06e.bin", 0x0000, 0x0400, CRC(68301d05) SHA1(b0c33a982b42378da828281e74356d58fbea1d86), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI ) + ROMX_LOAD( "12l.bin", 0x0000, 0x0400, CRC(c5a5228f) SHA1(7861b5567d44e972d728551d47aab9b92d71ffc7), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO ) + ROMX_LOAD( "05de.bin", 0x0400, 0x0400, CRC(42032c14) SHA1(753948e7f52b88655c894b48d419b76de07c14f2), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI ) + ROMX_LOAD( "11hl.bin", 0x0400, 0x0400, CRC(d5d3811a) SHA1(7d2d983fa88b0349a90a6331ca3e18583125d21e), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO ) + ROMX_LOAD( "04d.bin", 0x0800, 0x0400, CRC(5f5e540c) SHA1(9092794a878494dbe34c2f05a212ff7b9d00fc55), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI ) + ROMX_LOAD( "10h.bin", 0x0800, 0x0400, CRC(9d5ef6f1) SHA1(ef584678373375a7f13307d7c4597639a5f6010e), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO ) + ROMX_LOAD( "03b.bin", 0x1400, 0x0400, CRC(89e13008) SHA1(1ad82ae0607af27925b42758f8c86a0e89079620), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI ) + ROMX_LOAD( "09g.bin", 0x1400, 0x0400, CRC(c16f5503) SHA1(cf36beac472c5c405342193b7ef434d32b37a4a8), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO ) + ROMX_LOAD( "02ab.bin", 0x1800, 0x0400, CRC(ffa166c2) SHA1(10496fcbb272130cc200dfb1886808559be8d6ea), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI ) + ROMX_LOAD( "08f.bin", 0x1800, 0x0400, CRC(b5fa1a2b) SHA1(7eab1cb9a9f95520a37ee4fb2b246ef072dedcbd), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO ) + ROMX_LOAD( "01a.bin", 0x1c00, 0x0400, CRC(44f8e99c) SHA1(9adecdadb16edaebde02892e30f9f87fb98f4ae1), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI ) + ROMX_LOAD( "07ef.bin", 0x1c00, 0x0400, CRC(9560880d) SHA1(866d6c3714b939814ce48707be53a69ef8355b34), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO ) +ROM_END + +/* SPACE ATTACK set is from Video Games GmbH - Board Typ 1010 C / Top board shows Video-Games - 6302 LICH - 1034B + Contains same data as spaceatt but with added 00 fill to make larger roms (b+a=E1, 00fill+c=F1, f+00fill=G1, h+sv02=H1) */ +ROM_START( spaceatt2k ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "H1.bin", 0x0000, 0x0800, CRC(734f5ad8) SHA1(ff6200af4c9110d8181249cbcef1a8a40fa40b7f) ) + ROM_LOAD( "G1.bin", 0x0800, 0x0800, CRC(6bfaca4a) SHA1(16f48649b531bdef8c2d1446c429b5f414524350) ) + ROM_LOAD( "F1.bin", 0x1000, 0x0800, CRC(0ccead96) SHA1(537aef03468f63c5b9e11dd61e253f7ae17d9743) ) + ROM_LOAD( "E1.bin", 0x1800, 0x0800, CRC(19971ca7) SHA1(373900e6796aa681f35158e2c4c7665574990906) ) +ROM_END + +ROM_START( spaceat2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "spaceatt.h", 0x0000, 0x0800, CRC(a31d0756) SHA1(2b76929654ed0b180091348546dac29fc6e5438e) ) + ROM_LOAD( "spaceatt.g", 0x0800, 0x0800, CRC(f41241f7) SHA1(d93cead75922510075433849c4f7099279eafc18) ) + ROM_LOAD( "spaceatt.f", 0x1000, 0x0800, CRC(4c060223) SHA1(957e75a978aa600627399061cae0a6525e92ad11) ) + ROM_LOAD( "spaceatt.e", 0x1800, 0x0800, CRC(7cf6f604) SHA1(469557de15178c4b2d686e5724e1006f7c20d7a4) ) +ROM_END + +ROM_START( cosmicin ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "CN7472N-7921.bin", 0x0000, 0x0800, CRC(734f5ad8) SHA1(ff6200af4c9110d8181249cbcef1a8a40fa40b7f) ) + ROM_LOAD( "CN7471N-7918.bin", 0x0800, 0x0800, CRC(6bfaca4a) SHA1(16f48649b531bdef8c2d1446c429b5f414524350) ) + ROM_LOAD( "CN7470N-7918.bin", 0x1000, 0x0800, CRC(0ccead96) SHA1(537aef03468f63c5b9e11dd61e253f7ae17d9743) ) + ROM_LOAD( "CN7469N-7921.bin", 0x1800, 0x0800, CRC(5733048c) SHA1(e9197925396b723f5dda4653238e6e1ea287fdae) ) +ROM_END + +ROM_START( galmonst ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "h.5m", 0x0000, 0x0400, CRC(8a0395e9) SHA1(f456aaa0301a1d0f3f9f45cbe39c5ff14909ecd3) ) + ROM_LOAD( "g.5n", 0x0400, 0x0400, CRC(6183ed16) SHA1(8e0bc13cafa237daa5fdeda9a5d6df8f491eabc2) ) + ROM_LOAD( "f.5p", 0x0800, 0x0400, CRC(b6047fdd) SHA1(bc324a9bf7829a2c2bb2bbf965d64272b0d07223) ) + ROM_LOAD( "c.5t", 0x1400, 0x0400, CRC(e88e8c96) SHA1(43108ddb328914c68977c7c49b4c1f71073ca36b) ) + ROM_LOAD( "b.5u", 0x1800, 0x0400, CRC(34678b80) SHA1(17f01facb3272c963a8bca290c4ca36411b8de31) ) + ROM_LOAD( "a.5v", 0x1c00, 0x0400, CRC(05a6806b) SHA1(ea884110d0ea6463801cbc2f87ce9c4921b49e33) ) +ROM_END + +ROM_START( spacecom ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1f.ic67", 0x0000, 0x0400, BAD_DUMP CRC(703f2cbe) SHA1(b183f9fbedd8658399555c0ba21ecab6370e86cb) ) + ROM_LOAD( "2g.ic82", 0x0400, 0x0400, CRC(7269b719) SHA1(6fd5879a6f2a5b1d38c7f00996037418df9491d3) ) + ROM_LOAD( "3f.ic68", 0x0800, 0x0400, CRC(6badac4f) SHA1(7b998d8fb21d143f26d605fe2a7dbbe1cf65210f) ) + ROM_LOAD( "4g.ic83", 0x0c00, 0x0400, CRC(75b59ea7) SHA1(e00eb4a9cf662c84e18fc9efc29cedebf0c5af67) ) + ROM_LOAD( "5f.ic69", 0x1000, 0x0400, CRC(84b61117) SHA1(3e41ff74ad02a7da4bbc22f3b84917eec067bbca) ) + ROM_LOAD( "6g.ic84", 0x1400, 0x0400, CRC(de383625) SHA1(7ec0d7171e771c4b43e026f3f50a88d8ab2236bb) ) + ROM_LOAD( "7f.ic70", 0x1800, 0x0400, CRC(5a23dbc8) SHA1(4d193bb7b38fb7ccd57d2c72463a3fe123dbca58) ) + ROM_LOAD( "8g.ic85", 0x1c00, 0x0400, CRC(a5a467e3) SHA1(ef591059e55d21f14baa8af1f1324a9bc2ada8c4) ) +ROM_END + +ROM_START( sinvzen ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1.bin", 0x0000, 0x0400, CRC(9b0da779) SHA1(a52ccdb252eb69c497aa5eafb35d7f25a311b44e) ) + ROM_LOAD( "2.bin", 0x0400, 0x0400, CRC(9858ccab) SHA1(5ad8e5ef0d95779f0e513634b97bc330c9269ce4) ) + ROM_LOAD( "3.bin", 0x0800, 0x0400, CRC(a1cc38b5) SHA1(45fc9466b548d511b8174f6f3a4783164dd59489) ) + ROM_LOAD( "4.bin", 0x0c00, 0x0400, CRC(1f2db7a8) SHA1(354ad155743f724f2bebcab422f1ef96cb57c683) ) + ROM_LOAD( "5.bin", 0x1000, 0x0400, CRC(9b505fcd) SHA1(7461b7087d31dbe09f7b3078584ccaa2c9122c95) ) + ROM_LOAD( "6.bin", 0x1400, 0x0400, CRC(de0ca0ae) SHA1(a15d1218361839a2a2bf8da3f78d81621251fe1c) ) + ROM_LOAD( "7.bin", 0x1800, 0x0400, CRC(25a296f6) SHA1(37df98384c1513f0e33a350dfcaa99655f91c9ba) ) + ROM_LOAD( "8.bin", 0x1c00, 0x0400, CRC(f4bc4a98) SHA1(bff3806750a3695a136f398c7dbb69a0b7daa88a) ) +ROM_END + +ROM_START( sinvemag ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "sv01.36", 0x0000, 0x0400, CRC(86bb8cb6) SHA1(a75648e7f2446c756d86624b15d387d25ce47b66) ) // sldh - == SV0H + ROM_LOAD( "emag_si.b", 0x0400, 0x0400, CRC(febe6d1a) SHA1(e1c3a24b4fa5862107ada1f9d7249466e8c3f06a) ) + ROM_LOAD( "emag_si.c", 0x0800, 0x0400, CRC(aafb24f7) SHA1(6718cdfae09f77d735be5145b9d202a73d8ed9db) ) + ROM_LOAD( "emag_si.d", 0x1400, 0x0400, CRC(68c4b9da) SHA1(8953dc0427b09b71bd763e65caa7deaca09a15da) ) + ROM_LOAD( "emag_si.e", 0x1800, 0x0400, CRC(c4e80586) SHA1(3d427d5a2eea3c911ec7bd055e06e6747ce5e84d) ) + ROM_LOAD( "emag_si.f", 0x1c00, 0x0400, CRC(077f5ef2) SHA1(625de6839073ac4c904f949efc1b2e0afea5d676) ) +ROM_END + +ROM_START( tst_invd ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "test.h", 0x0000, 0x0800, CRC(f86a2eea) SHA1(4a72ff01f3e6d16bbe9bf7f123cd98895bfbed9a) ) /* The Test ROM */ + ROM_LOAD( "invaders.g", 0x0800, 0x0800, CRC(6bfaca4a) SHA1(16f48649b531bdef8c2d1446c429b5f414524350) ) + ROM_LOAD( "invaders.f", 0x1000, 0x0800, CRC(0ccead96) SHA1(537aef03468f63c5b9e11dd61e253f7ae17d9743) ) + ROM_LOAD( "invaders.e", 0x1800, 0x0800, CRC(14e538b0) SHA1(1d6ca0c99f9df71e2990b610deb9d7da0125e2d8) ) +ROM_END + +ROM_START( alieninv ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "alieninv.h", 0x0000, 0x0800, CRC(6ad601c3) SHA1(9fc88698f98ce43992a5044d28d3e19751f82772) ) + ROM_LOAD( "alieninv.g", 0x0800, 0x0800, CRC(c6bb6fb3) SHA1(01a12163309f967dcffce19890b1e0d079021fc2) ) + ROM_LOAD( "alieninv.f", 0x1000, 0x0800, CRC(1d2ff324) SHA1(209766a981fdd3a68e36da3d8122a244c883cae7) ) + ROM_LOAD( "alieninv.e", 0x1800, 0x0800, CRC(2f2e6791) SHA1(08a1f17bcfec598182386f1c43e4fc7b476212de) ) +ROM_END + +ROM_START( alieninvp2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1h.bin", 0x0000, 0x0800, CRC(c46df7f4) SHA1(eec34b3d5585bae03c7b80585daaa05ddfcc2164) ) + ROM_LOAD( "1g.bin", 0x0800, 0x0800, CRC(4b1112d6) SHA1(b693667656e5d8f44eeb2ea730f4d4db436da579) ) + ROM_LOAD( "1f.bin", 0x1000, 0x0800, CRC(adca18a5) SHA1(7e02651692113db31fd469868ae5ffdb0f941ecf) ) + ROM_LOAD( "1e.bin", 0x1800, 0x0800, CRC(0449cb52) SHA1(8adcb7cd4492fa6649d9ee81172d8dff56621d64) ) +ROM_END + +ROM_START( sitv1 ) // rev 1 + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "tv01.s1", 0x0000, 0x0800, CRC(9f37b146) SHA1(0b7ef79dbc3de3beeae3bf222d086b60249d429f) ) + ROM_LOAD( "tv02.rp1", 0x0800, 0x0800, CRC(3c759a90) SHA1(d847d592dee592b1d3a575c21d89eaf3f7f6ae1b) ) + ROM_LOAD( "tv03.n1", 0x1000, 0x0800, CRC(0ad3657f) SHA1(a501f316535c50f7d7a20ef8e6dede1526a3f2a8) ) + ROM_LOAD( "tv04.m1", 0x1800, 0x0800, CRC(cd2c67f6) SHA1(60f9d8fe2d36ff589277b607f07c1edc917c755c) ) +ROM_END + +ROM_START( sitv ) // rev 2, minor bug fixes of sitv1; delay when writing to sound latch 0x05, and another unknown change + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "tv0h.s1", 0x0000, 0x0800, CRC(fef18aad) SHA1(043edeefe6a6d4934bd384eafea19326de1dbeec) ) + ROM_LOAD( "tv02.rp1", 0x0800, 0x0800, CRC(3c759a90) SHA1(d847d592dee592b1d3a575c21d89eaf3f7f6ae1b) ) + ROM_LOAD( "tv03.n1", 0x1000, 0x0800, CRC(0ad3657f) SHA1(a501f316535c50f7d7a20ef8e6dede1526a3f2a8) ) + ROM_LOAD( "tv04.m1", 0x1800, 0x0800, CRC(cd2c67f6) SHA1(60f9d8fe2d36ff589277b607f07c1edc917c755c) ) +ROM_END + +ROM_START( sicv ) // likely not the first sicv version... + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "cv17.36", 0x0000, 0x0800, CRC(3dfbe9e6) SHA1(26487df7fa0bbd0b9b7f74347c4b9318b0a73b89) ) + ROM_LOAD( "cv18.35", 0x0800, 0x0800, CRC(bc3c82bf) SHA1(33e39fc97bd46699be1f9b9741a86f433efdc911) ) + ROM_LOAD( "cv19.34", 0x1000, 0x0800, CRC(d202b41c) SHA1(868fe938ef768655c894ec95b7d9a81bf21f69ca) ) + ROM_LOAD( "cv20.33", 0x1800, 0x0800, CRC(c74ee7b6) SHA1(4f52db274a2d4433ab67c099ee805e8eb8516c0f) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + ROM_LOAD( "cv01.1", 0x0000, 0x0400, CRC(037e16ac) SHA1(d585030aaff428330c91ae94d7cd5c96ebdd67dd) ) + ROM_LOAD( "cv02.2", 0x0400, 0x0400, CRC(8263da38) SHA1(2e7c769d129e6f8a1a31eba1e02777bb94ac32b2) ) +ROM_END + +ROM_START( sicv1 ) // Original Taito board AA017742B - data match for sicv, just smaller program roms (2708s vs. 2716s) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "cv11.s1", 0x0000, 0x0400, CRC(309d4582) SHA1(e60a1a696111502c115ee00d84cd418c85aba9af) ) + ROM_LOAD( "cv12.r1", 0x0400, 0x0400, CRC(70153e09) SHA1(b75068b7738aa232f75272c539fca04b3d0c2c4a) ) + ROM_LOAD( "cv13.np1", 0x0800, 0x0400, CRC(2ca24fee) SHA1(4b516ebd5a777b001443159233d89fc0a331f756) ) + ROM_FILL( 0x0c00, 0x0400, 0xff ) /* rom socket at M1 is unpopulated */ + ROM_FILL( 0x1000, 0x0400, 0xff ) /* rom socket at L1 is unpopulated */ + ROM_LOAD( "cv14.jk1", 0x1400, 0x0400, CRC(556d9a97) SHA1(fb792e981658d79d1c801b01f06345c237e9e803) ) + ROM_LOAD( "cv15.i1", 0x1800, 0x0400, CRC(ac520cf5) SHA1(47281256083d64a2754b2045c252e74fe5b71153) ) + ROM_LOAD( "cv16.g1", 0x1c00, 0x0400, CRC(285cfb59) SHA1(53eab8ed07dc9ca107e2e91b4556b9424a073530) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + ROM_LOAD( "cv01.1", 0x0000, 0x0400, CRC(037e16ac) SHA1(d585030aaff428330c91ae94d7cd5c96ebdd67dd) ) + ROM_LOAD( "cv02.2", 0x0400, 0x0400, CRC(8263da38) SHA1(2e7c769d129e6f8a1a31eba1e02777bb94ac32b2) ) +ROM_END + +ROM_START( sisv1 ) // rev 1, this version may or may not really exist (may have been test/prototype only?) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "sv01.36", 0x0000, 0x0400, CRC(d0c32d72) SHA1(b3bd950b1ba940fbeb5d95e55113ed8f4c311434) ) + ROM_LOAD( "sv02.35", 0x0400, 0x0400, CRC(0e159534) SHA1(94b2015a9d38ca738705b8d024a79fd2f9855b98) ) + ROM_LOAD( "sv03.34", 0x0800, 0x0400, NO_DUMP ) + ROM_LOAD( "sv04.31", 0x1400, 0x0400, CRC(1293b826) SHA1(165cd5d08a19eadbe954145b12807f10df9e691a) ) + ROM_LOAD( "sv05.42", 0x1800, 0x0400, NO_DUMP ) + ROM_LOAD( "sv06.41", 0x1c00, 0x0400, CRC(2c68e0b4) SHA1(a5e5357120102ad32792bf3ef6362f45b7ba7070) ) +ROM_END + +ROM_START( sisv2 ) // rev 2 + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "sv01.36", 0x0000, 0x0400, CRC(d0c32d72) SHA1(b3bd950b1ba940fbeb5d95e55113ed8f4c311434) ) + ROM_LOAD( "sv02.35", 0x0400, 0x0400, CRC(0e159534) SHA1(94b2015a9d38ca738705b8d024a79fd2f9855b98) ) + ROM_LOAD( "sv10.34", 0x0800, 0x0400, CRC(483e651e) SHA1(ae795ee3bc53ac3936f6cf2c72cca7a890783513) ) + ROM_LOAD( "sv04.31", 0x1400, 0x0400, CRC(1293b826) SHA1(165cd5d08a19eadbe954145b12807f10df9e691a) ) + ROM_LOAD( "sv09.42", 0x1800, 0x0400, CRC(cd80b13f) SHA1(0f4b9537b99fe3cdeebe525efb1869a1be0bc704) ) + ROM_LOAD( "sv06.41", 0x1c00, 0x0400, CRC(2c68e0b4) SHA1(a5e5357120102ad32792bf3ef6362f45b7ba7070) ) +ROM_END + +ROM_START( sisv3 ) // rev 3 + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "sv0h.36", 0x0000, 0x0400, CRC(86bb8cb6) SHA1(a75648e7f2446c756d86624b15d387d25ce47b66) ) + ROM_LOAD( "sv02.35", 0x0400, 0x0400, CRC(0e159534) SHA1(94b2015a9d38ca738705b8d024a79fd2f9855b98) ) + ROM_LOAD( "sv10.34", 0x0800, 0x0400, CRC(483e651e) SHA1(ae795ee3bc53ac3936f6cf2c72cca7a890783513) ) + ROM_LOAD( "sv04.31", 0x1400, 0x0400, CRC(1293b826) SHA1(165cd5d08a19eadbe954145b12807f10df9e691a) ) + ROM_LOAD( "sv09.42", 0x1800, 0x0400, CRC(cd80b13f) SHA1(0f4b9537b99fe3cdeebe525efb1869a1be0bc704) ) + ROM_LOAD( "sv06.41", 0x1c00, 0x0400, CRC(2c68e0b4) SHA1(a5e5357120102ad32792bf3ef6362f45b7ba7070) ) +ROM_END + +ROM_START( sisv ) // rev 4, with 5-digit scoring + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "sv0h.36", 0x0000, 0x0400, CRC(86bb8cb6) SHA1(a75648e7f2446c756d86624b15d387d25ce47b66) ) + ROM_LOAD( "sv11.35", 0x0400, 0x0400, CRC(febe6d1a) SHA1(e1c3a24b4fa5862107ada1f9d7249466e8c3f06a) ) + ROM_LOAD( "sv12.34", 0x0800, 0x0400, CRC(a08e7202) SHA1(de9f7c851d1b894915e720cfc5d794cdb31752f6) ) + ROM_LOAD( "sv04.31", 0x1400, 0x0400, CRC(1293b826) SHA1(165cd5d08a19eadbe954145b12807f10df9e691a) ) + ROM_LOAD( "sv13.42", 0x1800, 0x0400, CRC(a9011634) SHA1(1f1369ecb02078042cfdf17a497b8dda6dd23793) ) + ROM_LOAD( "sv14.41", 0x1c00, 0x0400, CRC(58730370) SHA1(13dc806bcecd2d6089a85dd710ac2869413f7475) ) +ROM_END + +ROM_START( spacerng ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "sr1.u36", 0x0000, 0x0800, CRC(b984f52d) SHA1(fdc8b249c0b65339977f91b674bdcb435aa99474) ) + ROM_LOAD( "sr2.u35", 0x0800, 0x0800, CRC(4b4f07e6) SHA1(408dcdae3e80a09584d8ebd6491bc90c4def1fcf) ) + ROM_LOAD( "sr3.u34", 0x1000, 0x0800, CRC(edc28ba9) SHA1(c96668f709d3fa0b97a6b118614e9c139f8f54cc) ) + ROM_LOAD( "sr4.u33", 0x1800, 0x0800, CRC(a95f559f) SHA1(f597c7af96a9d039fd8e54d976d68a065f6bf0c8) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + /* !! not dumped yet, these were taken from sisv */ + // NOTE: SISV (L-shaped boardset) was not supposed to HAVE color proms and hence they are removed. Maybe this is the correct set for these? + ROM_LOAD( "cv01.1", 0x0000, 0x0400, BAD_DUMP CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) // sldh + ROM_LOAD( "cv02.2", 0x0400, 0x0400, BAD_DUMP CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) // sldh +ROM_END + +ROM_START( spceking ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "invaders.h", 0x0000, 0x0800, CRC(734f5ad8) SHA1(ff6200af4c9110d8181249cbcef1a8a40fa40b7f) ) + ROM_LOAD( "spcekng2", 0x0800, 0x0800, CRC(96dcdd42) SHA1(e18d7ffca92e863ef40e235b2be973d8c5879fdb) ) + ROM_LOAD( "spcekng3", 0x1000, 0x0800, CRC(95fc96ad) SHA1(38175edad0e538a1561cec8f7613f15ae274dd14) ) + ROM_LOAD( "spcekng4", 0x1800, 0x0800, CRC(54170ada) SHA1(1e8b3774355ec0d448f04805a917f4c1fe64bceb) ) +ROM_END + +ROM_START( spcewars ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "sanritsu.1", 0x0000, 0x0400, CRC(ca331679) SHA1(5c362c3d1c721d293bcddbef4033533769c8f0e0) ) + ROM_LOAD( "sanritsu.2", 0x0400, 0x0400, CRC(48dc791c) SHA1(91a98205c83ca38961e6ba2ac43a41e6e8bc2675) ) + ROM_LOAD( "ic35.bin", 0x0800, 0x0800, CRC(40c2d55b) SHA1(b641b63046d242ad23911143ed840011fc98eaff) ) + ROM_LOAD( "sanritsu.5", 0x1000, 0x0400, CRC(77475431) SHA1(15a04a2655847ee462be65d1065d643c872bb47c) ) + ROM_LOAD( "sanritsu.6", 0x1400, 0x0400, CRC(392ef82c) SHA1(77c98c11ee727ed3ed6e118f13d97aabdb555540) ) + ROM_LOAD( "sanritsu.7", 0x1800, 0x0400, CRC(b3a93df8) SHA1(3afc96814149d4d5343fe06eac09f808384d02c4) ) + ROM_LOAD( "sanritsu.8", 0x1c00, 0x0400, CRC(64fdc3e1) SHA1(c3c278bc236ced7fc85e1a9b018e80be6ab33402) ) + ROM_LOAD( "sanritsu.9", 0x4000, 0x0400, CRC(b2f29601) SHA1(ce855e312f50df7a74682974803cb4f9b2d184f3) ) +ROM_END + +ROM_START( spacewr3 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ic36.bin", 0x0000, 0x0800, CRC(9e30f88a) SHA1(314dfb2920d9b43b977cc19e40ac315e6933c3b9) ) + ROM_LOAD( "ic35.bin", 0x0800, 0x0800, CRC(40c2d55b) SHA1(b641b63046d242ad23911143ed840011fc98eaff) ) + ROM_LOAD( "ic34.bin", 0x1000, 0x0800, CRC(b435f021) SHA1(2d0d813b99d571b53770fa878a1f82ca67827caa) ) + ROM_LOAD( "ic33.bin", 0x1800, 0x0800, CRC(cbdc6fe8) SHA1(63038ea09d320c54e3d1cf7f043c17bba71bf13c) ) + ROM_LOAD( "ic32.bin", 0x4000, 0x0800, CRC(1e5a753c) SHA1(5b7cd7b347203f4edf816f02c366bd3b1b9517c4) ) +ROM_END + +ROM_START( invaderl ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "c01", 0x0000, 0x0400, CRC(499f253a) SHA1(e13353194277f5d35e92db9b11912b5f392f51b7) ) + ROM_LOAD( "c02", 0x0400, 0x0400, CRC(2d0b2e1f) SHA1(2e0262d9dba607824fcd720d2995531649bdd03d) ) + ROM_LOAD( "c03", 0x0800, 0x0400, CRC(03033dc2) SHA1(87d7838e6a6542c2c5510af593df45137cb397c6) ) + ROM_LOAD( "c07", 0x1000, 0x0400, CRC(5a7bbf1f) SHA1(659f2a8c646660d316d6e70f1d9548375f1da63f) ) + ROM_LOAD( "c04", 0x1400, 0x0400, CRC(455b1fa7) SHA1(668800a0a3ba18d8b54c2aa4dfd4bd01a667d679) ) + ROM_LOAD( "c05", 0x1800, 0x0400, CRC(40cbef75) SHA1(15994ed8bb8ab8faed6198926873851062c9d95f) ) + ROM_LOAD( "sv06.bin", 0x1c00, 0x0400, CRC(2c68e0b4) SHA1(a5e5357120102ad32792bf3ef6362f45b7ba7070) ) +ROM_END + +ROM_START( invader4 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "spin4.a", 0x0000, 0x0800, CRC(bb386dfe) SHA1(cc00f3e4f6ca4c05bae038a24ccdb213fb951cfc) ) + ROM_LOAD( "spin4.b", 0x0800, 0x0800, CRC(63afa11d) SHA1(d8cedfa010a49237e31f6ebaed35134cb1c3ce68) ) + ROM_LOAD( "spin4.c", 0x1000, 0x0800, CRC(22b0317c) SHA1(8fd037bf5f89a7bcb06042697410566d5180912a) ) + ROM_LOAD( "spin4.d", 0x1800, 0x0800, CRC(9102fd68) SHA1(3523e69314844fcd1863b1e9a9d7fcebe9ee174b) ) +ROM_END + +ROM_START( jspecter ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "3305.u6", 0x0000, 0x1000, CRC(ab211a4f) SHA1(d675ed29c3479d7318f8559bd56dd619cf631b6a) ) + ROM_LOAD( "3306.u7", 0x1400, 0x1000, CRC(0df142a7) SHA1(2f1c32d6fe7eafb7808fef0bdeb69b4909427417) ) +ROM_END + +ROM_START( jspecter2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "unksi.b2", 0x0000, 0x1000, CRC(0584b6c4) SHA1(c130021b878bde2beda4a189f71bbfed61088535) ) + ROM_LOAD( "unksi.a2", 0x1400, 0x1000, CRC(58095955) SHA1(545df3bb9ee4ff09f491d7a4b704e31aa311a8d7) ) +ROM_END + +ROM_START( invadpt2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "pv01", 0x0000, 0x0800, CRC(7288a511) SHA1(ff617872784c28ed03591aefa9f0519e5651701f) ) + ROM_LOAD( "pv02", 0x0800, 0x0800, CRC(097dd8d5) SHA1(8d68654d54d075c0f0d7f63c87ff4551ce8b7fbf) ) + ROM_LOAD( "pv03", 0x1000, 0x0800, CRC(1766337e) SHA1(ea959bf06c9930d83a07559e191a28641efb07ac) ) + ROM_LOAD( "pv04", 0x1800, 0x0800, CRC(8f0e62e0) SHA1(a967b155f15f8432222fcc78b23121b00c405c5c) ) + ROM_LOAD( "pv05", 0x4000, 0x0800, CRC(19b505e9) SHA1(6a31a37586782ce421a7d2cffd8f958c00b7b415) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + ROM_LOAD( "pv06.1", 0x0000, 0x0400, CRC(a732810b) SHA1(a5fabffa73ca740909e23b9530936f9274dff356) ) + ROM_LOAD( "pv07.2", 0x0400, 0x0400, CRC(2c5b91cb) SHA1(7fa4d4aef85473b1b4f18734230c164e72be44e7) ) +ROM_END + +ROM_START( invadpt2br ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "pv01", 0x0000, 0x0800, CRC(7288a511) SHA1(ff617872784c28ed03591aefa9f0519e5651701f) ) + /* pv01 had weird encryption applied to it, very likely to have been done post-dump. */ +// for (offs = 0x4fc; offs < 0x5fc; offs++) +// rom[offs] ^= 0x6c; + + // 0x4fc + 1 * 0x56 +// for (offs = 0x54e; offs < 0x552; offs++) +// rom[offs] ^= 0x03; + + // 0x4fc + 2 * 0x56 +// for (offs = 0x5a4; offs < 0x5a8; offs++) +// rom[offs] ^= 0x01; + + // 0x4fc + 3 * 0x56 +// for (offs = 0x5fa; offs < 0x5fc; offs++) +// rom[offs] ^= 0x02; + + ROM_LOAD( "br_pv02", 0x0800, 0x0800, CRC(420c7c35) SHA1(b51265f4d9e5a8cf9d53099a97cadd25ea0b34ce) ) + ROM_LOAD( "br_pv03", 0x1000, 0x0800, CRC(dffd04b9) SHA1(d51a0f27e90b0a49cf2d57ec82a863dcae9f3ea4) ) + ROM_LOAD( "br_pv04", 0x1800, 0x0800, CRC(b0626aff) SHA1(b7de6c21030732bd0479228f057ca4c87b913b0a) ) + ROM_LOAD( "br_pv05", 0x4000, 0x0800, CRC(84c70bb8) SHA1(75fef3ee6da3e7e01a257629016bc10a23691d62) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 (taken from parent set) */ + ROM_LOAD( "pv06.1", 0x0000, 0x0400, CRC(a732810b) SHA1(a5fabffa73ca740909e23b9530936f9274dff356) ) + ROM_LOAD( "pv07.2", 0x0400, 0x0400, CRC(2c5b91cb) SHA1(7fa4d4aef85473b1b4f18734230c164e72be44e7) ) +ROM_END + +ROM_START( invaddlx ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "invdelux.h", 0x0000, 0x0800, CRC(e690818f) SHA1(0860fb03a64d34a9704a1459a5e96929eafd39c7) ) + ROM_LOAD( "invdelux.g", 0x0800, 0x0800, CRC(4268c12d) SHA1(df02419f01cf0874afd1f1aa16276751acd0604a) ) + ROM_LOAD( "invdelux.f", 0x1000, 0x0800, CRC(f4aa1880) SHA1(995d77b67cb4f2f3781c2c8747cb058b7c1b3412) ) + ROM_LOAD( "invdelux.e", 0x1800, 0x0800, CRC(408849c1) SHA1(f717e81017047497a2e9f33f0aafecfec5a2ed7d) ) + ROM_LOAD( "invdelux.d", 0x4000, 0x0800, CRC(e8d5afcd) SHA1(91fde9a9e7c3dd53aac4770bd169721a79b41ed1) ) +ROM_END + +/* Runs on a Space Invaders Part II boardset with an epoxy module in place of the 8080 CPU */ +ROM_START( vortex ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1.t36", 0x0000, 0x0800, CRC(577417a6) SHA1(13ed1b989b8ea27cea88be7872921ff9283b5dd6) ) + ROM_LOAD( "2.t35", 0x0800, 0x0800, CRC(126d0049) SHA1(4c189a2364bca8682543d605e84d458bf81ee489) ) + ROM_LOAD( "3.t34", 0x1000, 0x0800, CRC(4a2510b3) SHA1(1c62583b7baf8ee2b6014a6e5dfc7e2d516886d1) ) + ROM_LOAD( "4.t33", 0x1800, 0x0800, CRC(da0274fe) SHA1(b8ab1b16d66700f9ca6a2380a5b6796eaef6e1bd) ) + ROM_LOAD( "5.t32", 0x4000, 0x0800, CRC(a3de49d6) SHA1(e302c6fd2705c6e7f9125b52b2dcb034cc88a90e) ) + ROM_LOAD( "6.t31", 0x4800, 0x0800, CRC(271085d0) SHA1(a772cec8135bc746f6c56aa294eb22c0604e16f9) ) +ROM_END + + +ROM_START( moonbase ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ze3-1.a4", 0x0000, 0x0400, CRC(82dbf2c7) SHA1(c767d8b866db4a5059bd79f962a90ce3a962e1e6) ) + ROM_LOAD( "ze3-2.c4", 0x0400, 0x0400, CRC(c867f5b4) SHA1(686318fda6edde297aecaf33f480bfa075fa6eca) ) + ROM_LOAD( "ze3-3.e4", 0x0800, 0x0400, CRC(cb23ccc1) SHA1(86be2d14d52b3404e1a25c573bd25b97729d82a1) ) + ROM_LOAD( "ze3-4.f4", 0x0c00, 0x0400, CRC(9a11abe2) SHA1(f5337183c7f279d75ddeeab24f4f132aa2ee103b) ) // 'Taito Corp' string hidden in ROM + ROM_LOAD( "ze3-5.h4", 0x1000, 0x0400, CRC(2b105ed3) SHA1(fa0767089b3aaec25be39e950e7163ecbdc2f39f) ) + ROM_LOAD( "ze3-6.l4", 0x1400, 0x0400, CRC(cb3d6dcb) SHA1(b4923b12a141c76b7d50274f19a3224db26a5669) ) + ROM_LOAD( "ze3-7.a5", 0x1800, 0x0400, CRC(774b52c9) SHA1(ddbbba874ac069fb930b364a890c45675ec389f7) ) + ROM_LOAD( "ze3-8.c5", 0x1c00, 0x0400, CRC(e88ea83b) SHA1(ef05be4783c860369ee5ecd4844837207e99ad9f) ) + ROM_LOAD( "ze3-9.e5", 0x4000, 0x0400, CRC(2dd5adfa) SHA1(62cb98cad1e48de0e0cbf30392d35834b38dadbd) ) + ROM_LOAD( "ze3-10.f5", 0x4400, 0x0400, CRC(1e7c22a4) SHA1(b34173375494ffbf5400dd4014a683a9807f4f08) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + ROM_LOAD( "cv02.h7", 0x0400, 0x0400, CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) /* NEC B406 or compatible BPROM, like the 82S137 */ + ROM_LOAD( "cv01.g7", 0x0000, 0x0400, CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) /* NEC B406 or compatible BPROM, like the 82S137 */ +ROM_END + +ROM_START( moonbasea ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ze3-1.a4", 0x0000, 0x0400, CRC(82dbf2c7) SHA1(c767d8b866db4a5059bd79f962a90ce3a962e1e6) ) + ROM_LOAD( "ze3-2.c4", 0x0400, 0x0400, CRC(c867f5b4) SHA1(686318fda6edde297aecaf33f480bfa075fa6eca) ) + ROM_LOAD( "ze3-3.e4", 0x0800, 0x0400, CRC(cb23ccc1) SHA1(86be2d14d52b3404e1a25c573bd25b97729d82a1) ) + ROM_LOAD( "ze3-4_alt.f4", 0x0c00, 0x0400, CRC(86a00411) SHA1(f518f5098512d6d23a8887605707844c1b32e54f) ) // 'Nichibutsu' string hidden in ROM + ROM_LOAD( "ze3-5.h4", 0x1000, 0x0400, CRC(2b105ed3) SHA1(fa0767089b3aaec25be39e950e7163ecbdc2f39f) ) + ROM_LOAD( "ze3-6.l4", 0x1400, 0x0400, CRC(cb3d6dcb) SHA1(b4923b12a141c76b7d50274f19a3224db26a5669) ) + ROM_LOAD( "ze3-7.a5", 0x1800, 0x0400, CRC(774b52c9) SHA1(ddbbba874ac069fb930b364a890c45675ec389f7) ) + ROM_LOAD( "ze3-8.c5", 0x1c00, 0x0400, CRC(e88ea83b) SHA1(ef05be4783c860369ee5ecd4844837207e99ad9f) ) + ROM_LOAD( "ze3-9.e5", 0x4000, 0x0400, CRC(2dd5adfa) SHA1(62cb98cad1e48de0e0cbf30392d35834b38dadbd) ) + ROM_LOAD( "ze3-10.f5", 0x4400, 0x0400, CRC(1e7c22a4) SHA1(b34173375494ffbf5400dd4014a683a9807f4f08) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + ROM_LOAD( "cv02.h7", 0x0400, 0x0400, CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) /* NEC B406 or compatible BPROM, like the 82S137 */ + ROM_LOAD( "cv01.g7", 0x0000, 0x0400, CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) /* NEC B406 or compatible BPROM, like the 82S137 */ +ROM_END + + +ROM_START( invrvnge ) // Space Invaders hw + sound daughterboard + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "h.ic36", 0x0000, 0x0800, CRC(0e229b9f) SHA1(617197bf94e9700cbbb2f32487dc47b318d4f2af) ) + ROM_LOAD( "g.ic35", 0x0800, 0x0800, CRC(26b38aa4) SHA1(f281c7ec47ce6ab61bfda2e7aa6a5b8a01f2c11e) ) + ROM_LOAD( "f.ic34", 0x1000, 0x0800, CRC(b3b2749e) SHA1(4f854f981396e2d6a959dd48cff12234074fb69b) ) + ROM_LOAD( "e.ic33", 0x1800, 0x0800, CRC(d8e75102) SHA1(86d5618944265947e3ce60fdf048d8fff4a55744) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) // encrypted + ROM_LOAD( "snd.2c", 0xf000, 0x0800, CRC(135f3b16) SHA1(d472a6ca32c4a16cc1faf09f4a4876d75cd4ba24) ) + ROM_LOAD( "snd.1c", 0xf800, 0x0800, CRC(152fc85e) SHA1(df207d6e690287a56e4e330deaa5ee40a179f1fc) ) + + ROM_REGION( 0x0800, "proms", 0 ) + ROM_LOAD( "colour.bin", 0x0000, 0x0800, CRC(7de74988) SHA1(0b8c94b2bfdbc3921d60aad765df8af611f3fdd7) ) +ROM_END + +ROM_START( invrvngea ) // Space Invaders hw + sound daughterboard + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "h.ic36", 0x0000, 0x0800, CRC(0914b279) SHA1(91e465f56ed0dc8c68e109e33ec9d2bda2616a21) ) // sldh + ROM_LOAD( "g.ic35", 0x0800, 0x0800, CRC(84d9497c) SHA1(fb1b5fc49365fbf89e5418789e64efd186cdeecf) ) // sldh + ROM_LOAD( "f.ic34", 0x1000, 0x0800, CRC(78d34d97) SHA1(a50c19df12e75c644b014d74a463094e249db207) ) // sldh + ROM_LOAD( "e.ic33", 0x1800, 0x0800, CRC(30c71887) SHA1(17c9e905eb327435d52b6d51842f7f42a5e6ab7d) ) // sldh + + ROM_REGION( 0x10000, "audiocpu", 0 ) // encrypted + ROM_LOAD( "snd.2c", 0xf000, 0x0800, CRC(135f3b16) SHA1(d472a6ca32c4a16cc1faf09f4a4876d75cd4ba24) ) + ROM_LOAD( "snd.1c", 0xf800, 0x0800, CRC(152fc85e) SHA1(df207d6e690287a56e4e330deaa5ee40a179f1fc) ) + + ROM_REGION( 0x0800, "proms", 0 ) + ROM_LOAD( "colour.bin", 0x0000, 0x0800, CRC(7de74988) SHA1(0b8c94b2bfdbc3921d60aad765df8af611f3fdd7) ) +ROM_END + +ROM_START( invrvngeb ) // source unknown + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "invrvnge.h", 0x0000, 0x0800, CRC(aca41bbb) SHA1(ca71f792abd6d9a44d15b19d2ccf678e82ccba4f) ) + ROM_LOAD( "invrvnge.g", 0x0800, 0x0800, CRC(cfe89dad) SHA1(218b6a0b636c49c4cdc3667e8b1387ef0e257115) ) + ROM_LOAD( "invrvnge.f", 0x1000, 0x0800, CRC(e350de2c) SHA1(e845565e2f96f9dec3242ec5ab75910a515428c9) ) + ROM_LOAD( "invrvnge.e", 0x1800, 0x0800, CRC(1ec8dfc8) SHA1(fc8fbe1161958f57c9f4ccbcab8a769184b1c562) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) // encrypted + ROM_LOAD( "snd.2c", 0xf000, 0x0800, BAD_DUMP CRC(135f3b16) SHA1(d472a6ca32c4a16cc1faf09f4a4876d75cd4ba24) ) // not dumped, taken from parent + ROM_LOAD( "snd.1c", 0xf800, 0x0800, BAD_DUMP CRC(152fc85e) SHA1(df207d6e690287a56e4e330deaa5ee40a179f1fc) ) // not dumped, taken from parent + + ROM_REGION( 0x0800, "proms", 0 ) + ROM_LOAD( "colour.bin", 0x0000, 0x0800, BAD_DUMP CRC(7de74988) SHA1(0b8c94b2bfdbc3921d60aad765df8af611f3fdd7) ) // not dumped, taken from parent +ROM_END + +ROM_START( invrvngedu ) // single PCB + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ir.5m", 0x0000, 0x0800, CRC(b145cb71) SHA1(127eb11de7ab9835f06510fb12838c0b728c0d42) ) + ROM_LOAD( "ir.5n", 0x0800, 0x0800, CRC(660e8af3) SHA1(bd52eadf4ee3d717fd5bd7206e1e87d729250c92) ) + ROM_LOAD( "ir.5p", 0x1000, 0x0800, CRC(6ec5a9ad) SHA1(d1e84d2d60c6128c092f2cd20a2b87216df3034b) ) + ROM_LOAD( "ir.5r", 0x1800, 0x0800, CRC(74516811) SHA1(0f595c7b0fae5f3f83fdd1ffed5a408ee77c9438) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) // encrypted + ROM_LOAD( "ir.1t", 0xf000, 0x0800, BAD_DUMP CRC(135f3b16) SHA1(d472a6ca32c4a16cc1faf09f4a4876d75cd4ba24) ) // not dumped, taken from parent + ROM_LOAD( "ir.1u", 0xf800, 0x0800, BAD_DUMP CRC(152fc85e) SHA1(df207d6e690287a56e4e330deaa5ee40a179f1fc) ) // not dumped, taken from parent + + ROM_REGION( 0x0800, "proms", 0 ) + ROM_LOAD( "ir.3r", 0x0000, 0x0800, CRC(57da51a9) SHA1(a8cb0b45c52eef353b83fe75b61e4990e27eb124) ) +ROM_END + +ROM_START( invrvngegw ) // single PCB + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ir.5m", 0x0000, 0x0800, CRC(4fe35d1f) SHA1(469d563f88229cf163f8b21dce9e68f75d3d214e) ) // sldh + ROM_LOAD( "ir.5n", 0x0800, 0x0800, CRC(92d0442c) SHA1(1d104fbb225ce1a3a72e47af396a641030d990c2) ) // sldh + ROM_LOAD( "ir.5p", 0x1000, 0x0800, CRC(18d2372d) SHA1(d19b7bd315226ef0a565b296964b221fa4714413) ) // sldh + ROM_LOAD( "ir.5r", 0x1800, 0x0800, CRC(657ddf27) SHA1(957c6bbdb2133d4697d3302b2358979d1451b6d5) ) // sldh + + ROM_REGION( 0x10000, "audiocpu", 0 ) // encrypted + ROM_LOAD( "ir.1t", 0xf000, 0x0800, CRC(64e9e81e) SHA1(3390f8bab219cf134b33ae21c473da0873e01929) ) // sldh - bad? + ROM_LOAD( "ir.1u", 0xf800, 0x0800, CRC(152fc85e) SHA1(df207d6e690287a56e4e330deaa5ee40a179f1fc) ) + + ROM_REGION( 0x0800, "proms", 0 ) + ROM_LOAD( "ir.3r", 0x0000, 0x0800, CRC(6ce639bf) SHA1(73752f5886dcf8729d9853ddc258770f5c724ca3) ) // sldh +ROM_END + + +ROM_START( spclaser ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "la01", 0x0000, 0x0800, CRC(bedc0078) SHA1(a5bb0cbbb8e3f27d03beb8101b2be1111d73689d) ) + ROM_LOAD( "la02", 0x0800, 0x0800, CRC(43bc65c5) SHA1(5f9827c02c2d221e1607359c840374ff7fb92fbf) ) + ROM_LOAD( "la03", 0x1000, 0x0800, CRC(1083e9cc) SHA1(7ad45c6230c9e02fcf51e3414c15e2237eebbd7a) ) + ROM_LOAD( "la04", 0x1800, 0x0800, CRC(5116b234) SHA1(b165b2574cbcb26a5bb43f91df5f8be5f111f486) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + /* !! not dumped yet, these were taken from sisv/intruder */ + ROM_LOAD( "01.1", 0x0000, 0x0400, BAD_DUMP CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) + ROM_LOAD( "02.2", 0x0400, 0x0400, BAD_DUMP CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) +ROM_END + +ROM_START( intruder ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "la01-1.36", 0x0000, 0x0800, CRC(bedc0078) SHA1(a5bb0cbbb8e3f27d03beb8101b2be1111d73689d) ) + ROM_LOAD( "la02-1.35", 0x0800, 0x0800, CRC(43bc65c5) SHA1(5f9827c02c2d221e1607359c840374ff7fb92fbf) ) + ROM_LOAD( "la03-1.34", 0x1000, 0x0800, CRC(278ef9cf) SHA1(74a9c1d3500ea28e50d07363a547c381999c84fa) ) + ROM_LOAD( "la04-1.33", 0x1800, 0x0800, CRC(5116b234) SHA1(b165b2574cbcb26a5bb43f91df5f8be5f111f486) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + ROM_LOAD( "01.1", 0x0000, 0x0400, CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) + ROM_LOAD( "02.2", 0x0400, 0x0400, CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) +ROM_END + +ROM_START( laser ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1.u36", 0x0000, 0x0800, CRC(b44e2c41) SHA1(00e0b2e088495d6f3bc175e8a53dcb3686ea8484) ) + ROM_LOAD( "2.u35", 0x0800, 0x0800, CRC(9876f331) SHA1(14e36b26d186d9a195492834ef989ed5664d7b65) ) + ROM_LOAD( "3.u34", 0x1000, 0x0800, CRC(ed79000b) SHA1(bfe0407e833ce61aa909f5f1f93c3fc1d46605e9) ) + ROM_LOAD( "4.u33", 0x1800, 0x0800, CRC(10a160a1) SHA1(e2d4208af11b65fc42d2856e57ee3c196f89d360) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + /* !! not dumped yet, these were taken from intruder */ + ROM_LOAD( "01.1", 0x0000, 0x0400, BAD_DUMP CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) + ROM_LOAD( "02.2", 0x0400, 0x0400, BAD_DUMP CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) +ROM_END + +ROM_START( spcewarl ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "spcewarl.1", 0x0000, 0x0800, CRC(1fcd34d2) SHA1(674139944e0d842a85bd21b326bd735e15453038) ) + ROM_LOAD( "spcewarl.2", 0x0800, 0x0800, CRC(43bc65c5) SHA1(5f9827c02c2d221e1607359c840374ff7fb92fbf) ) + ROM_LOAD( "spcewarl.3", 0x1000, 0x0800, CRC(7820df3a) SHA1(53315857f4282c68624b338b068d80ee6828af4c) ) + ROM_LOAD( "spcewarl.4", 0x1800, 0x0800, CRC(adc05b8d) SHA1(c4acf75537c0662a4785d5d6a90643239a54bf43) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + /* !! not dumped yet, these were taken from intruder */ + ROM_LOAD( "01.1", 0x0000, 0x0400, BAD_DUMP CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) + ROM_LOAD( "02.2", 0x0400, 0x0400, BAD_DUMP CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) +ROM_END + +ROM_START( galxwars ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "univgw3.0", 0x0000, 0x0400, CRC(937796f4) SHA1(88e9494cc532498e51e3a68fa1122c40f22b27dd) ) + ROM_LOAD( "univgw4.1", 0x0400, 0x0400, CRC(4b86e7a6) SHA1(167f9f7491a2de39d08e3e6f7057cc75b36c9340) ) + ROM_LOAD( "univgw5.2", 0x0800, 0x0400, CRC(47a187cd) SHA1(640c896ba25f34d323624005bd676257ad17b687) ) + ROM_LOAD( "univgw6.3", 0x0c00, 0x0400, CRC(7b7d22ff) SHA1(74364cf2b04dcfbbc8e0131fa12c0e574f693d34) ) + ROM_LOAD( "univgw1.4", 0x4000, 0x0400, CRC(0871156e) SHA1(3726d0bfe153a0afc62ea56737662074986064b0) ) + ROM_LOAD( "univgw2.5", 0x4400, 0x0400, CRC(6036d7bf) SHA1(36c2ad2ffdb47bbecc40fd67ced6ab51a5cd2f3e) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + /* !! not dumped yet, these were taken from sisv/intruder */ + /* Or are colormaps generated by a group of TTLs, similar to dai3wksi? */ + ROM_LOAD( "01.1", 0x0000, 0x0400, BAD_DUMP CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) + ROM_LOAD( "02.2", 0x0400, 0x0400, BAD_DUMP CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) +ROM_END + +ROM_START( galxwars2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "3192.h6", 0x0000, 0x1000, CRC(bde6860b) SHA1(e04b8add32d8f7ea588fae6d6a387f1d40495f1b) ) + ROM_LOAD( "3193.h7", 0x4000, 0x1000, CRC(a17cd507) SHA1(554ab0e8bdc0e7af4a30b0ddc8aa053c8e70255c) ) /* 2nd half unused */ + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + /* !! not dumped yet, these were taken from sisv/intruder */ + /* Or are colormaps generated by a group of TTLs, similar to dai3wksi? */ + ROM_LOAD( "01.1", 0x0000, 0x0400, BAD_DUMP CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) + ROM_LOAD( "02.2", 0x0400, 0x0400, BAD_DUMP CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) +ROM_END + +ROM_START( galxwarst ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "galxwars.0", 0x0000, 0x0400, CRC(608bfe7f) SHA1(a41a40a2f0a1bb61a70b9ff8a7da925ab1db7f74) ) + ROM_LOAD( "galxwars.1", 0x0400, 0x0400, CRC(a810b258) SHA1(030a72fffcf240f643bc3006028cb4883cf58bbc) ) + ROM_LOAD( "galxwars.2", 0x0800, 0x0400, CRC(74f31781) SHA1(1de70e8ebbb26eea20ffedb7bd0ca051a67f45e7) ) + ROM_LOAD( "galxwars.3", 0x0c00, 0x0400, CRC(c88f886c) SHA1(4d705fbb97e3868c3f6c90c5e5753ad17cfbf5d6) ) + ROM_LOAD( "galxwars.4", 0x4000, 0x0400, CRC(ae4fe8fb) SHA1(494f44167dc84e4515b769c12f6e24419461dce4) ) + ROM_LOAD( "galxwars.5", 0x4400, 0x0400, CRC(37708a35) SHA1(df6fd521ddfa146ef93e390e47741bdbfda1e7ba) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + /* !! not dumped yet, these were taken from sisv/intruder */ + /* Or are colormaps generated by a group of TTLs, similar to dai3wksi? */ + ROM_LOAD( "01.1", 0x0000, 0x0400, BAD_DUMP CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) + ROM_LOAD( "02.2", 0x0400, 0x0400, BAD_DUMP CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) +ROM_END + +ROM_START( starw ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "roma", 0x0000, 0x0400, CRC(60e8993c) SHA1(0bdf163ff0f2e6a8771987d4e7ac604c45af21b8) ) + ROM_LOAD( "romb", 0x0400, 0x0400, CRC(b8060773) SHA1(92aa358c338ef8f5773bccada8988d068764e7ea) ) + ROM_LOAD( "romc", 0x0800, 0x0400, CRC(307ce6b8) SHA1(f4b6f54db3d2377ec27d62d33fa1c4946559a092) ) + ROM_LOAD( "romd", 0x1400, 0x0400, CRC(2b0d0a88) SHA1(d079d12b6d4136519ded32415d668a02147b7601) ) + ROM_LOAD( "rome", 0x1800, 0x0400, CRC(5b1c3ad0) SHA1(edb42eec59c3dd7e274e2ea08fed0f3e8fc72e9e) ) + ROM_LOAD( "romf", 0x1c00, 0x0400, CRC(c8e42d3d) SHA1(841b27af251b9c3a964972e864fb7c88acc742e0) ) +ROM_END + +ROM_START( starw1 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "gc.75", 0x0000, 0x0400, CRC(ad10c128) SHA1(c30ff9ff5cf8dedf7654c8e2799a4bb79a30104a) ) + ROM_LOAD( "gc.77", 0x0400, 0x0400, CRC(ab77c474) SHA1(eb07dcad1f265834b93a8108298d4441d6a74b2e) ) + ROM_LOAD( "gc.76", 0x0800, 0x0400, CRC(3638aed4) SHA1(1426c9270f248fd2ab134dc35526599c02051ccd) ) + ROM_LOAD( "gc.80", 0x1400, 0x0400, CRC(4c67957b) SHA1(dda7bbd54e7395dea80d224e487318fb4429f027) ) + ROM_LOAD( "gc.81", 0x1800, 0x0400, CRC(246621ef) SHA1(bddc5253f735fa81266d725a24b1c14faabe0c6a) ) + ROM_LOAD( "gc.82", 0x1c00, 0x0400, CRC(19bd32ee) SHA1(a1718a6a6300c3d7df469793cb0d590c4a966aff) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + ROM_LOAD( "cv01", 0x0000, 0x0400, CRC(8d892ef3) SHA1(c471dd6197a3c779d89c33fcb425cf3bbdf4fc15) ) + ROM_IGNORE( 0x0400 ) + ROM_LOAD( "cv02", 0x0400, 0x0400, CRC(b44ddde8) SHA1(8793f370526c072e645d8d0b9794b1b64a7701ef) ) + ROM_IGNORE( 0x0400 ) +ROM_END + +ROM_START( lrescue ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "lrescue.1", 0x0000, 0x0800, CRC(2bbc4778) SHA1(0167f1ac1501ab0b4c4e555023fa5efed59d56ae) ) + ROM_LOAD( "lrescue.2", 0x0800, 0x0800, CRC(49e79706) SHA1(bed675bb97d59ae0132c007ccead0d096ed2ddf1) ) + ROM_LOAD( "lrescue.3", 0x1000, 0x0800, CRC(1ac969be) SHA1(67ac47f45b9fa5c530bf6047bb7d5776b52847be) ) + ROM_LOAD( "lrescue.4", 0x1800, 0x0800, CRC(782fee3c) SHA1(668295e9d6d99084bb4e7c5491f00fe75f4f5a88) ) + ROM_LOAD( "lrescue.5", 0x4000, 0x0800, CRC(58fde8bc) SHA1(663665ac5254204c1eba18357d9867034eae55eb) ) + ROM_LOAD( "lrescue.6", 0x4800, 0x0800, CRC(bfb0f65d) SHA1(ea0943d764a16094b6e2289f62ef117c9f838c98) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color map */ + ROM_LOAD( "7643-1.cpu", 0x0000, 0x0400, CRC(8b2e38de) SHA1(d6a757be31c3a179d31bd3709e71f9e38ec632e9) ) + ROM_RELOAD( 0x0400, 0x0400 ) +ROM_END + +/* +MOON LANDER +Manufacturer: Leisure Time Electronics +Year: 1980 +Orientation: Vertical B/W +Cabinet: Cocktail +Leisure Time Electronics produced three games: Astro Laser, Moon Lander, and Space Ranger. +The games were designed to be interchangeable with a universal cocktail cabinet which they designed and named "Star Series". The cocktail cabinets share the same artwork with all three games and has a different instruction card for each game. +There were no upright or cabaret cabinets. The game ROMs operate on Taito pc boards. +Moon Lander is a clone/ripoff of Lunar Rescue/Destination Earth. I do not have a manual or schematics for this pcb although +I was able to confirm 5 out of 8 dipswitch settings. I was surprised to hear the sounds effects are almost exactly like when Lunar Rescue used the "invaders" external samples in MAME. The pcb does not play the invader "hit" sound for some reason. +I couldn't find anything obviously wrong in the sound section so it must be that it's just not hooked up as-is from the factory. There does not appear to be a sound-in-attract option. +CPU - Mitsubishi M5L8080AP +X-tal - 19968 mhz (decimal not shown, device stamped very lightly) +Sound - discrete, SN76477N +I/O board - Taito # CV070001A/CVN00001A label= serial# 172190 +CPU board - Taito # AA017757 label= CVN00004 serial# 802868 +ROM board - Taito # AA017756A label= CVN00006 serial# 046120 +EPROMs - 6x 2716 +ML1.u36 checksum 0002CA52 +ML2.u35 checksum 0002C999 +ML3.u34 checksum 0002BD5C +ML4.u33 checksum 000252EE +ML5.u32 checksum 00029365 +ML6.u31 checksum 0002C624 +Dipswitch sw1, 8-bank +sw1 - # ships +sw2 - # ships +sw3 - not used/unknown +sw4 - not used/unknown +sw5 - ON= enable player2 move right OFF= disabled +sw6 - ON= enable player2 move left OFF= disabled +sw7 - ON= enable player2 fire/shoot OFF= disabled +sw8 - not used/unknown +-------------------------------------------------------------------------- + 1 2 3 4 5 6 7 8 +-------------------------------------------------------------------------- +# of player ships +- 3 ships on on +- 4 ships off on +- 5 ships on off +- 6 ships off off +Maximum Credits= 9 +Sound Pots: +VR1 = engine sound +VR2 = beam gun +VR3 = ship explosion sound +VR4 = enemy explosion sound (not connected?) +VR5 = bonus ship sound +VR6 = bonus music, footsteps, and docking sound +VR7 = shooting star/ship descending sound +VR8 = pot for adjusting total sounds +*/ + +ROM_START( mlander ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ml1.u36", 0x0000, 0x0800, CRC(69df529a) SHA1(ded3b4a04e28dc341b1fc5a8880bc48aa332bdb5) ) + ROM_LOAD( "ml2.u35", 0x0800, 0x0800, CRC(3b503337) SHA1(d1056c0161d481202996811503e9970d0a0c9147) ) + ROM_LOAD( "ml3.u34", 0x1000, 0x0800, CRC(64e53458) SHA1(629f2434eea4d31dc9db0ee7bc8364cd2bf08a04) ) + ROM_LOAD( "ml4.u33", 0x1800, 0x0800, CRC(c9a74571) SHA1(b1671d19eff17f7adb274013c8f11eb044ebdd28) ) + ROM_LOAD( "ml5.u32", 0x4000, 0x0800, CRC(88291fa2) SHA1(40c4eb51f75b5ca81a62121231d22b9f48d0f628) ) + ROM_LOAD( "ml6.u31", 0x4800, 0x0800, CRC(bfb0f65d) SHA1(ea0943d764a16094b6e2289f62ef117c9f838c98) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color map */ + ROM_LOAD( "01.bin", 0x0000, 0x0400, CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) + ROM_LOAD( "02.bin", 0x0400, 0x0400, CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) +ROM_END + +ROM_START( grescue ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "lrescue.1", 0x0000, 0x0800, CRC(2bbc4778) SHA1(0167f1ac1501ab0b4c4e555023fa5efed59d56ae) ) + ROM_LOAD( "lrescue.2", 0x0800, 0x0800, CRC(49e79706) SHA1(bed675bb97d59ae0132c007ccead0d096ed2ddf1) ) + ROM_LOAD( "lrescue.3", 0x1000, 0x0800, CRC(1ac969be) SHA1(67ac47f45b9fa5c530bf6047bb7d5776b52847be) ) + ROM_LOAD( "grescue.4", 0x1800, 0x0800, CRC(ca412991) SHA1(41b59f338a6c246e0942a8bfa3c0bca2c24c7f81) ) + ROM_LOAD( "grescue.5", 0x4000, 0x0800, CRC(a419a4d6) SHA1(8eeeb31cbebffc98d2c6c5b964f9b320fcf303d2) ) + ROM_LOAD( "lrescue.6", 0x4800, 0x0800, CRC(bfb0f65d) SHA1(ea0943d764a16094b6e2289f62ef117c9f838c98) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color map */ + ROM_LOAD( "7643-1.cpu", 0x0000, 0x0400, CRC(8b2e38de) SHA1(d6a757be31c3a179d31bd3709e71f9e38ec632e9) ) + ROM_RELOAD( 0x0400, 0x0400 ) +ROM_END + +ROM_START( desterth ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "36_h.bin", 0x0000, 0x0800, CRC(f86923e5) SHA1(d19935ba3d2c1c2553b3779f1a7ad8856c003dae) ) + ROM_LOAD( "35_g.bin", 0x0800, 0x0800, CRC(797f440d) SHA1(a96917f2296ae467acc795eacc1533a2a2d2f401) ) + ROM_LOAD( "34_f.bin", 0x1000, 0x0800, CRC(993d0846) SHA1(6be0c45add41fa7e43cac96c776cd0ebb45ade7b) ) + ROM_LOAD( "33_e.bin", 0x1800, 0x0800, CRC(8d155fc5) SHA1(1ef5e62d71abbf870c027fa1e477121ff124b8da) ) + ROM_LOAD( "32_d.bin", 0x4000, 0x0800, CRC(3f531b6f) SHA1(2fc1f4912688986650e20a050a5d63ddecd4267e) ) + ROM_LOAD( "31_c.bin", 0x4800, 0x0800, CRC(ab019c30) SHA1(33931510a722168bcf7c30d22eac9345576b6631) ) + ROM_LOAD( "42_b.bin", 0x5000, 0x0800, CRC(ed9dbac6) SHA1(4553f445ac32ebb1be490b02df4924f76557e8f9) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color map */ + ROM_LOAD( "7643-1.cpu", 0x0000, 0x0400, CRC(8b2e38de) SHA1(d6a757be31c3a179d31bd3709e71f9e38ec632e9) ) + ROM_RELOAD( 0x0400, 0x0400 ) +ROM_END + +ROM_START( escmars ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "2516_em.m5", 0x0000, 0x0800, CRC(6580f1c3) SHA1(fd44d4bab799e02b2d7c20fe6bf14ade9c8d4f1d) ) + ROM_LOAD( "2716_em.n5", 0x0800, 0x0800, CRC(49e79706) SHA1(bed675bb97d59ae0132c007ccead0d096ed2ddf1) ) + ROM_LOAD( "2516_em.p5", 0x1000, 0x0800, CRC(1ac969be) SHA1(67ac47f45b9fa5c530bf6047bb7d5776b52847be) ) + ROM_LOAD( "2516_em.r5", 0x1800, 0x0800, CRC(c1bd5949) SHA1(df390dd159766ed6489abfae8bb258115dc643e6) ) + ROM_LOAD( "2716_em.s5", 0x4000, 0x0800, CRC(1ec21a31) SHA1(5db61f00d8987662ccae1132fb25da318ac177dd) ) + ROM_LOAD( "2716_em.t5", 0x4800, 0x0800, CRC(bfb0f65d) SHA1(ea0943d764a16094b6e2289f62ef117c9f838c98) ) + + /* No proms, only colour overlay */ +ROM_END + +ROM_START( lrescuem ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "48.ic36", 0x0000, 0x0400, CRC(bad5ba48) SHA1(6d8a2df172e058d16f196ad7f29430e9fd1fdaa8) ) + ROM_LOAD( "49.ic35", 0x0400, 0x0400, CRC(a6dc23d6) SHA1(76b9105935bf239ae90b47900f64dac3032ceecd) ) + ROM_LOAD( "50.ic34", 0x0800, 0x0400, CRC(90179fee) SHA1(35059f7399229b8d9588d34f79073fa4d3301614) ) + ROM_LOAD( "51.ic33", 0x0c00, 0x0400, CRC(1d197d87) SHA1(21e049f9c2a0fe1c0403d9d1a2dc695c4ee764f9) ) + ROM_LOAD( "52.ic32", 0x1000, 0x0400, CRC(4326d338) SHA1(ac31645bdf292f28dfcfcb9d5e158e5df7a6f95d) ) + ROM_LOAD( "53.ic31", 0x1400, 0x0400, CRC(3b272372) SHA1(39b807c810d093d7a34b102eec16f3d9baeb21f1) ) + ROM_LOAD( "54.ic42", 0x1800, 0x0400, CRC(a877c5b6) SHA1(862871c3dd18221d5713fe1fd2dc4f5b7cb913c1) ) + ROM_LOAD( "55.ic41", 0x1c00, 0x0400, CRC(c9a93407) SHA1(604bcace8e3bec07db6ca8a8918b306b77643e14) ) + ROM_LOAD( "56.ic40", 0x4000, 0x0400, CRC(3398798f) SHA1(d7dd9e65a1048df8edd217f4206b19cd01f143f4) ) + ROM_LOAD( "57.ic39", 0x4400, 0x0400, CRC(37c5bfc6) SHA1(b0aec85e6f979cdf7a3a985830c8530302804837) ) + ROM_LOAD( "58.ic38", 0x4800, 0x0400, CRC(1b7a5644) SHA1(d26530ea11ada86f7c99b11d6faf4416a8f5a9eb) ) + ROM_LOAD( "59.ic37", 0x4c00, 0x0400, CRC(c342b907) SHA1(327da029420c4eedabc2a0534199a008a3f341b8) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 - these don't really fit this game, but were on the PCB */ + ROM_LOAD( "cv01-7643.2c", 0x0000, 0x0400, CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) + ROM_LOAD( "cv02-7643.1c", 0x0400, 0x0400, CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) +ROM_END + +ROM_START( lrescuem2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "0.bin", 0x0000, 0x0800, CRC(27d37ad6) SHA1(18b2de9f9c022a31187b2a4049573e7f204e84c9) ) + ROM_LOAD( "1.bin", 0x0800, 0x0800, CRC(d8ed56f0) SHA1(d3f02d43f59d8ee83b4ed94f58f1bd25dca1a8de) ) + ROM_LOAD( "2.bin", 0x1000, 0x0800, CRC(3aed9788) SHA1(1be3c2f9f3a0f7d187a6faa2b020979027fa60e9) ) + ROM_LOAD( "3.bin", 0x1800, 0x0800, CRC(fa121b92) SHA1(2753b8b93d69d49e85075765630958038aa21ce3) ) + ROM_LOAD( "4.bin", 0x4000, 0x0800, CRC(535b4a78) SHA1(dd5613f47a3c7e15701c5d1dbac4a2228b9c28f2) ) + ROM_LOAD( "5.bin", 0x4800, 0x0800, CRC(0613a977) SHA1(47b85efdc436b39f8fb12355f9b87cb791f2d3b1) ) + ROM_LOAD( "6.bin", 0x5000, 0x0800, CRC(8fe51cc0) SHA1(1a98044ab95a1559362813a3961c1436267dcf63) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 - these don't really fit this game, but were on the PCB */ + ROM_LOAD( "cv01-7643.2c", 0x0000, 0x0400, CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) + ROM_LOAD( "cv02-7643.1c", 0x0400, 0x0400, CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) +ROM_END + + +/* +Cosmo +TDS & Mints, 1979/80? +Notes: +This game runs on modified "original" Taito (3 board) Space Invaders hardware. +There are approx. 70 (or more) wires tied to various parts of the boards, plus +there is an extra board on top of the sound board with a *HUGE* amount of wires +running to it from the main boards. There are 2 EPROMs on the top board that appear +to be for use with colour generation or extra sounds(?) The PROMs on the middle board +have been removed and in their place are a pile of wires that join to the top board. +The remainder of the hardware is just standard Taito Space Invaders..... including +a SN76477 and the discrete components for sound generation. +Note that the sounds and gameplay of Cosmo are VERY different from Space Invaders. +*/ + +ROM_START( cosmo ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1.36", 0x0000, 0x0800, CRC(445c9a98) SHA1(89bce80a061e9c12544231f970d9dec801eb1b94) ) + ROM_LOAD( "2.35", 0x0800, 0x0800, CRC(df3eb731) SHA1(fb90c1d0f2518195dd49062c9f0fd890536d89f4) ) + ROM_LOAD( "3.34", 0x1000, 0x0800, CRC(772c813f) SHA1(a1c0d857c660fb0b838dd0466af7bf5d73bcd55d) ) + ROM_LOAD( "4.33", 0x1800, 0x0800, CRC(279f66e6) SHA1(8ce71c08cca0bdde2f2e0ef21622731c4610c030) ) + ROM_LOAD( "5.32", 0x4000, 0x0800, CRC(cefb18df) SHA1(bb500cf3f7d1a54045a165d3613a92ab3f11d3e8) ) + ROM_LOAD( "6.31", 0x4800, 0x0800, CRC(b037f6c4) SHA1(b9a42948052b8cda8d2e4575e59909589f4e7a8d) ) + ROM_LOAD( "7.42", 0x5000, 0x0800, CRC(c3831ea2) SHA1(8c67ef0312656ef0eeff34b8463376c736bd8ea1) ) + + ROM_REGION( 0x1000, "proms", 0 ) /* color map */ + ROM_LOAD( "n-1.7d", 0x0800, 0x0800, CRC(bd8576f1) SHA1(aa5fe0a4d024f21a3bca7a6b3f5022779af6f3f4) ) + ROM_LOAD( "n-2.6e", 0x0000, 0x0800, CRC(48f1ade5) SHA1(a1b45f82f3649cde8ae6a2ef494a3a6cdb5e65d0) ) +ROM_END + + +ROM_START( cosmicmo ) /* Roms stamped with "II", denoting version II */ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ii-1.h1", 0x0000, 0x0400, CRC(d6e4e5da) SHA1(8b4275a3c71ac3fa80d17237dc04de5f586645f4) ) + ROM_LOAD( "ii-2.h2", 0x0400, 0x0400, CRC(8f7988e6) SHA1(b6a01d5dcab013350f8f7f3e3ebfc986bb939fe0) ) + ROM_LOAD( "ii-3.h3", 0x0800, 0x0400, CRC(2d2e9dc8) SHA1(dd3da4fc752e003e5e7c64bf189288133aed545b) ) + ROM_LOAD( "ii-4.h4", 0x0c00, 0x0400, CRC(26cae456) SHA1(2f2262340c10e5c29d71317f6eb8072c26655563) ) + ROM_LOAD( "ii-5.h5", 0x4000, 0x0400, CRC(b13f228e) SHA1(a0de05aa36435e72c77f5333f3ad964ec448a8f0) ) + ROM_LOAD( "ii-6.h6", 0x4400, 0x0400, CRC(4ae1b9c4) SHA1(8eed87eebe68caa775fa679363b0fe3728d98c34) ) + ROM_LOAD( "ii-7.h7", 0x4800, 0x0400, CRC(6a13b15b) SHA1(dc03a6c3e938cfd08d16bd1660899f951ba72ea2) ) + + /* There is no colour circuits or tracking on the game pcb, its a black and white composite video signal only */ + /* The PCB is etched with Universal 7814A-3 */ +ROM_END + +ROM_START( cosmicm2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "3907.bin", 0x0000, 0x1000, CRC(bbffede6) SHA1(e7505ee8e3f19557ebbfd0145dc2ae0d1c529eba) ) + ROM_LOAD( "3906.bin", 0x4000, 0x1000, CRC(b841f894) SHA1(b1f9e1800969baab14da2fd8873b58d4707b7236) ) +ROM_END + +ROM_START( superinv ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "00", 0x0000, 0x0400, CRC(7a9b4485) SHA1(dde918ec106971972bf7c7e5085c1262522f7e35) ) + ROM_LOAD( "01", 0x0400, 0x0400, CRC(7c86620d) SHA1(9e92ec0aa4eee96a7fa115a14a611c488d13b9dd) ) + ROM_LOAD( "02", 0x0800, 0x0400, CRC(ccaf38f6) SHA1(8eb0456e8abdba0d1dda20a335a9ecbe7c38f9ed) ) + ROM_LOAD( "03", 0x1400, 0x0400, CRC(8ec9eae2) SHA1(48d7a7dc61e0417ca4093e5c2a36efd96e359233) ) + ROM_LOAD( "04", 0x1800, 0x0400, CRC(68719b30) SHA1(2084bd63cd61ef1d2497c32112cdb42b7b582da4) ) + ROM_LOAD( "05", 0x1c00, 0x0400, CRC(8abe2466) SHA1(17494b1e5db207e37a7d28d7c89cbc5f36b7aefc) ) +ROM_END + +ROM_START( invasion ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "10136-0.0k", 0x0000, 0x0400, CRC(7a9b4485) SHA1(dde918ec106971972bf7c7e5085c1262522f7e35) ) + ROM_LOAD( "10136-1.1k", 0x0400, 0x0400, CRC(7c86620d) SHA1(9e92ec0aa4eee96a7fa115a14a611c488d13b9dd) ) + ROM_LOAD( "10136-2.2k", 0x0800, 0x0400, CRC(ccaf38f6) SHA1(8eb0456e8abdba0d1dda20a335a9ecbe7c38f9ed) ) + ROM_LOAD( "10136-5.5k", 0x1400, 0x0400, CRC(8ec9eae2) SHA1(48d7a7dc61e0417ca4093e5c2a36efd96e359233) ) + ROM_LOAD( "10136-6.6k", 0x1800, 0x0400, CRC(ff0b0690) SHA1(8547c4b2a228f1690287217a916613c8f0caccf6) ) + ROM_LOAD( "10136-7.7k", 0x1c00, 0x0400, CRC(75d7acaf) SHA1(977d146d7df555cea1bb2156d29d88bec9731f98) ) +ROM_END + +ROM_START( invasiona ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "invasiona_0.bin", 0x0000, 0x0400, CRC(c2fe6197) SHA1(823d02c2790711f40c167544a55e1669a97d93b4) ) + ROM_LOAD( "invasiona_1.bin", 0x0400, 0x0400, CRC(7c86620d) SHA1(9e92ec0aa4eee96a7fa115a14a611c488d13b9dd) ) + ROM_LOAD( "invasiona_2.bin", 0x0800, 0x0400, CRC(ccaf38f6) SHA1(8eb0456e8abdba0d1dda20a335a9ecbe7c38f9ed) ) + ROM_LOAD( "invasiona_3.bin", 0x1400, 0x0400, CRC(8ec9eae2) SHA1(48d7a7dc61e0417ca4093e5c2a36efd96e359233) ) + ROM_LOAD( "invasiona_4.bin", 0x1800, 0x0400, CRC(24b39879) SHA1(c93530ac20c412b516fbcba8220d85a9bd4fa804) ) + ROM_LOAD( "invasiona_5.bin", 0x1c00, 0x0400, CRC(59134ff8) SHA1(2e6a040066b35b10f867a3e500e3b13922c0eb7a) ) +ROM_END + +ROM_START( invasionb ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "invasionb_0.bin", 0x0000, 0x0400, CRC(7a9b4485) SHA1(dde918ec106971972bf7c7e5085c1262522f7e35) ) + ROM_LOAD( "invasionb_1.bin", 0x0400, 0x0400, CRC(7c86620d) SHA1(9e92ec0aa4eee96a7fa115a14a611c488d13b9dd) ) + ROM_LOAD( "invasionb_2.bin", 0x0800, 0x0400, CRC(ccaf38f6) SHA1(8eb0456e8abdba0d1dda20a335a9ecbe7c38f9ed) ) + ROM_LOAD( "invasionb_5.bin", 0x1400, 0x0400, CRC(8ec9eae2) SHA1(48d7a7dc61e0417ca4093e5c2a36efd96e359233) ) + ROM_LOAD( "invasionb_6.bin", 0x1800, 0x0400, CRC(ec0edb4a) SHA1(8c6946b50ba5c319fe03c55b43c4e714387719b8) ) + ROM_LOAD( "invasionb_7.bin", 0x1c00, 0x0400, CRC(6aac1281) SHA1(f071a21de72d2c9f7851195592c828fa501197ce) ) +ROM_END + +ROM_START( invasionrz ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "rz0.0k", 0x0000, 0x0400, CRC(7a9b4485) SHA1(dde918ec106971972bf7c7e5085c1262522f7e35) ) + ROM_LOAD( "rz1.1k", 0x0400, 0x0400, CRC(7c86620d) SHA1(9e92ec0aa4eee96a7fa115a14a611c488d13b9dd) ) + ROM_LOAD( "rz2.2k", 0x0800, 0x0400, CRC(ccaf38f6) SHA1(8eb0456e8abdba0d1dda20a335a9ecbe7c38f9ed) ) + ROM_LOAD( "rz5.5k", 0x1400, 0x0400, CRC(8ec9eae2) SHA1(48d7a7dc61e0417ca4093e5c2a36efd96e359233) ) + ROM_LOAD( "rz6.6k", 0x1800, 0x0400, CRC(ec0edb4a) SHA1(8c6946b50ba5c319fe03c55b43c4e714387719b8) ) + ROM_LOAD( "rz7.7k", 0x1c00, 0x0400, CRC(e4ab9012) SHA1(4f54e3fd3e3835a7b7d3b8d77929f4d9e42a4917) ) +ROM_END + +ROM_START( invasionrza ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "rz0-0.9k", 0x0000, 0x0400, CRC(3044806f) SHA1(7eaedd7fd7fcfd421432d5f6970ede12f586f644) ) + ROM_LOAD( "rz1-1.8k", 0x0400, 0x0400, CRC(7c86620d) SHA1(9e92ec0aa4eee96a7fa115a14a611c488d13b9dd) ) + ROM_LOAD( "rz2-2.7k", 0x0800, 0x0400, CRC(c808e941) SHA1(c17f2171d82df1984c4b048f2664dea5bd9c136b) ) + ROM_LOAD( "rz5-5.4k", 0x1400, 0x0400, CRC(8ec9eae2) SHA1(48d7a7dc61e0417ca4093e5c2a36efd96e359233) ) + // 2 reads of the bad rom + ROM_LOAD( "rz6-6.3k", 0x1800, 0x0400, BAD_DUMP CRC(c48df3ca) SHA1(d92064d171e099a45821c944324b993e39d894f7) ) + ROM_LOAD( "rz6-6.3ka", 0x1800, 0x0400, BAD_DUMP CRC(aa51b2c3) SHA1(bb30f3827a66ec3cb8436566f6b865995d702f76) ) + ROM_LOAD( "rz7-7.2k", 0x1c00, 0x0400, CRC(27dbea48) SHA1(f0bf5d31424dc72ac2e6fa01c528365efff838d2) ) +ROM_END + +/* +Space Invaders (Electromar, Madrid) 1980 +Board by Roselson +Dumped by Ricky2001 from Aumap +This game runs in a clone of a Midway L-Shape Space Invaders pcb with different connectors, but identical. +The board is updated with a litthe daughter board for the reset, instead of being generated in the Power supply. +Most of the Texts are in Spanish but keeps the original name "Space Invaders", also in the psb is writen a Patent number, I think this means it was a licensed version. +Boards Electromar 1007-A / 1007B +Patente N MU221718 +*/ + +ROM_START( invadersem ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "h.bin", 0x0000, 0x0400, CRC(7fc672a5) SHA1(93c8dd27769e9c1ab812fd68031c67a5dc79d0da) ) + ROM_LOAD( "g.bin", 0x0400, 0x0400, CRC(ad518883) SHA1(8f7f1f520287b738ebb6f2c70b7da2cae5db2be8) ) + ROM_LOAD( "f.bin", 0x0800, 0x0400, CRC(f4a6c480) SHA1(eb179a46345d652ffd74f77956d361cebfbb1112)) + ROM_LOAD( "c.bin", 0x1400, 0x0400, CRC(8f62c513) SHA1(87570241d4ab7df3ef380d57d27055af3cca7845) ) + ROM_LOAD( "b.bin", 0x1800, 0x0400, CRC(2808e5c0) SHA1(aef4821d6d6e7f062e3ebecb878e6370b604224e) ) + ROM_LOAD( "a.bin", 0x1c00, 0x0400, CRC(04c9b084) SHA1(d267438589de2d8332410e9641164fe68f337f73) ) +ROM_END + +ROM_START( ultrainv ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "in-01.bin", 0x0000, 0x0400, CRC(db9de599) SHA1(ccee1116ca924b520a126b63088a76d2ce8c396f) ) + ROM_LOAD( "in-02.bin", 0x0400, 0x0400, CRC(febe6d1a) SHA1(e1c3a24b4fa5862107ada1f9d7249466e8c3f06a) ) + ROM_LOAD( "in-03.bin", 0x0800, 0x0400, CRC(3d5c9820) SHA1(f3c83c660edf56a04148e2aa1c8e00427b86ca07) ) + ROM_LOAD( "in-04.bin", 0x1400, 0x0400, CRC(1293b826) SHA1(165cd5d08a19eadbe954145b12807f10df9e691a) ) + ROM_LOAD( "in-05.bin", 0x1800, 0x0400, CRC(e315a8c4) SHA1(dffec9e8bd7014fa34500b4bdac7feadac090482) ) + ROM_LOAD( "in-06.bin", 0x1c00, 0x0400, CRC(d958478c) SHA1(9df38c400c500b45d306d52fe74cd4d5ca92c0f0) ) +ROM_END + + +ROM_START( invmulti ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) // decrypted rom goes here + + ROM_REGION( 0x20000, "user1", 0 ) + ROM_LOAD("m803d.bin", 0x00000, 0x20000, CRC(6a62cb3c) SHA1(eb7b567098ad596859f417dd5c59c2cf1ebf1154) ) +ROM_END + +ROM_START( invmultim3a ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) + + ROM_REGION( 0x20000, "user1", 0 ) + ROM_LOAD("m803a.bin", 0x00000, 0x20000, CRC(6d538828) SHA1(9a80c67abd32c4c8cd04320501a2aa4e2a308fc9) ) +ROM_END + +ROM_START( invmultim2c ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) + + ROM_REGION( 0x20000, "user1", 0 ) + ROM_LOAD("m802c.bin", 0x00000, 0x20000, CRC(5b537de5) SHA1(4d8a6b622b818e88383d011c25f8f34b7372db6d) ) +ROM_END + +ROM_START( invmultim2a ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) + + ROM_REGION( 0x20000, "user1", 0 ) + ROM_LOAD("m802a.bin", 0x00000, 0x20000, CRC(8079b1d0) SHA1(b13d910f314550eef468ee819b92788d2a002d82) ) +ROM_END + +ROM_START( invmultim1a ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) + + ROM_REGION( 0x20000, "user1", 0 ) + ROM_LOAD("m801a.bin", 0x00000, 0x20000, CRC(f28536d2) SHA1(08ef3ea3fac38c7a478f094bfa7c369ac39515c4) ) +ROM_END + +ROM_START( invmultit3d ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) + + ROM_REGION( 0x20000, "user1", 0 ) + ROM_LOAD("t803d.bin", 0x00000, 0x20000, CRC(4d53173c) SHA1(a9caf7fd8e2fea86ca1cf7edc104bdacf09203f8) ) +ROM_END + +ROM_START( invmultis3a ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) + + ROM_REGION( 0x20000, "user1", 0 ) + ROM_LOAD("s083a.bin", 0x00000, 0x20000, CRC(f426d43b) SHA1(a299472f1d65f356ec01ca7cc8d3039abac20019) ) +ROM_END + +ROM_START( invmultis2a ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) + + ROM_REGION( 0x20000, "user1", 0 ) + ROM_LOAD("s082a.bin", 0x00000, 0x20000, CRC(25f0f17e) SHA1(a3ccf823399e23dd9fdb38fd58c0acfe80b57fe3) ) +ROM_END + +ROM_START( invmultis1a ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) + + ROM_REGION( 0x20000, "user1", 0 ) + ROM_LOAD("s081a.bin", 0x00000, 0x20000, CRC(daa77345) SHA1(0fdc9c2a6d9c0aa3233c5d31433adb1ea4e5b250) ) +ROM_END + +ROM_START( invmultip ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) + + ROM_REGION( 0x20000, "user1", 0 ) + ROM_LOAD("s10.bin", 0x00000, 0x20000, CRC(1b43e4d3) SHA1(c50decd9caaec7f2d8b3ba74f718372d31bc1c3b) ) +ROM_END + + +ROM_START( rollingc ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "rc01.bin", 0x0000, 0x0400, CRC(66fa50bf) SHA1(7451d4ff8d3b351a324aaecdbdc5b46672f5fdd0) ) + ROM_LOAD( "rc02.bin", 0x0400, 0x0400, CRC(61c06ae4) SHA1(7685c806e20e4a4a0508a547ac08ca8f6d75bb79) ) + ROM_LOAD( "rc03.bin", 0x0800, 0x0400, CRC(77e39fa0) SHA1(16bf88af1b97c5a2a81e105af08b8d9d1f10dcc8) ) + ROM_LOAD( "rc04.bin", 0x0c00, 0x0400, CRC(3fdfd0f3) SHA1(4c5e7136a766f3f16399e61eaaa0e00ef6b619f7) ) + ROM_LOAD( "rc05.bin", 0x1000, 0x0400, CRC(c26a8f5b) SHA1(f7a541999cfe04c6d6927d285484f0f81857e04a) ) + ROM_LOAD( "rc06.bin", 0x1400, 0x0400, CRC(0b98dbe5) SHA1(33cedab82ddccb4caaf681fce553b5230a8d6f92) ) + ROM_LOAD( "rc07.bin", 0x1800, 0x0400, CRC(6242145c) SHA1(b01bb02835dda89dc02604ec52e423167183e8c9) ) + ROM_LOAD( "rc08.bin", 0x1c00, 0x0400, CRC(d23c2ef1) SHA1(909e3d53291dbd219f4f9e0047c65317b9f6d5bd) ) + + ROM_LOAD( "rc09.bin", 0x4000, 0x0800, CRC(2e2c5b95) SHA1(33f4e2789d67e355ccd99d2c0d07301ec2bd3bc1) ) + ROM_LOAD( "rc10.bin", 0x4800, 0x0800, CRC(ef94c502) SHA1(07c0504b2ebce0fa6e53e6957e7b6c0e9caab430) ) + ROM_LOAD( "rc11.bin", 0x5000, 0x0800, CRC(a3164b18) SHA1(7270af25fa4171f86476f5dc409e658da7fba7fc) ) + ROM_LOAD( "rc12.bin", 0x5800, 0x0800, CRC(2052f6d9) SHA1(036702fc40cf133eb374ed674695d7c6c79e8311) ) +ROM_END + +ROM_START( schaser ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "rt13.bin", 0x0000, 0x0400, CRC(0dfbde68) SHA1(7367b138ad8448aba9222fed632a892df65cecbd) ) + ROM_LOAD( "rt14.bin", 0x0400, 0x0400, CRC(5a508a25) SHA1(c681d0bbf49317e79b596fb094e66b8912f0e409) ) + ROM_LOAD( "rt15.bin", 0x0800, 0x0400, CRC(2ac43a93) SHA1(d364f0940681a888c0147e06bcb01f8a0d4a24c8) ) + ROM_LOAD( "rt16.bin", 0x0c00, 0x0400, CRC(f5583afc) SHA1(5e8edb43ccb138fd47ac8f3da1af79b4444a4a82) ) + ROM_LOAD( "rt17.bin", 0x1000, 0x0400, CRC(51cf1155) SHA1(fd8c82d951602fd7e0ada65fc7cdee9f277c70db) ) + ROM_LOAD( "rt18.bin", 0x1400, 0x0400, CRC(3f0fc73a) SHA1(b801c3f1e8e6e41c564432db7c5891f6b27293b2) ) + ROM_LOAD( "rt19.bin", 0x1800, 0x0400, CRC(b66ea369) SHA1(d277f572f9c7c4301518546cf60671a6539326ee) ) + ROM_LOAD( "rt20.bin", 0x1c00, 0x0400, CRC(e3a7466a) SHA1(2378970f38b0cec066ef853a6540500e468e4ab4) ) + ROM_LOAD( "rt21.bin", 0x4000, 0x0400, CRC(b368ac98) SHA1(6860efe0496955db67611183be0efecda92c9c98) ) + ROM_LOAD( "rt22.bin", 0x4400, 0x0400, CRC(6e060dfb) SHA1(614e2ecf676c3ea2f9ea869125cfffef2f713684) ) + + ROM_REGION( 0x0400, "proms", 0 ) /* background color map */ + ROM_LOAD( "rt06.ic2", 0x0000, 0x0400, CRC(950cf973) SHA1(d22df09b325835a0057ccd0d54f827b374254ac6) ) +ROM_END + +ROM_START( schasera ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "rt13.bin", 0x0000, 0x0800, CRC(7b0bfeed) SHA1(832fe90430653d03cd0e7ea1b046524a2ca292ea) ) // sldh + ROM_LOAD( "rt15.bin", 0x0800, 0x0800, CRC(825fc8ac) SHA1(176ff0f4d0cd55be30efb184bd5bef62b92d0333) ) // sldh + ROM_LOAD( "rt17.bin", 0x1000, 0x0800, CRC(de9d3f85) SHA1(13a71fdd889023cfc65ed2c0a65236884b79b1f0) ) // sldh + ROM_LOAD( "rt19.bin", 0x1800, 0x0800, CRC(c0adab87) SHA1(4bb8e4ccfb5eaa052584555bfa03fecf19ab8a29) ) // sldh + ROM_LOAD( "rt21.bin", 0x4000, 0x0800, CRC(a3b31070) SHA1(af0108e1446a2be66cfc00d0b837fa91ab882441) ) // sldh + + ROM_REGION( 0x0400, "proms", 0 ) /* background color map */ + ROM_LOAD( "rt06.ic2", 0x0000, 0x0400, CRC(950cf973) SHA1(d22df09b325835a0057ccd0d54f827b374254ac6) ) +ROM_END + +ROM_START( schaserb ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "rt33.bin", 0x0000, 0x0800, CRC(eec6b032) SHA1(da14fcd862d6b80531cd3b858034bc5a120ed8ae) ) + ROM_LOAD( "rt34.bin", 0x0800, 0x0800, CRC(13a73701) SHA1(48ddbc10dec458070274c9fabbb0c420e2a07c96) ) + ROM_LOAD( "rt35.bin", 0x1000, 0x0800, CRC(de9d3f85) SHA1(13a71fdd889023cfc65ed2c0a65236884b79b1f0) ) + ROM_LOAD( "rt36.bin", 0x1800, 0x0800, CRC(521ec25e) SHA1(ce53e882c11a4c36f3edc3b389d3f5ad0e0ec151) ) + ROM_LOAD( "rt37.bin", 0x4000, 0x0800, CRC(44f65f19) SHA1(ee97d7987f54c9c26f5a20c72bdae04c46f94dc4) ) + + ROM_REGION( 0x0400, "proms", 0 ) /* background color map */ + ROM_LOAD( "rt06.ic2", 0x0000, 0x0400, CRC(950cf973) SHA1(d22df09b325835a0057ccd0d54f827b374254ac6) ) +ROM_END + +ROM_START( schaserm ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "MR26.71", 0x0000, 0x0800, CRC(4e547879) SHA1(464fab35373d6bd6218474e7f5109425376f1db2) ) + ROM_LOAD( "RT08.70", 0x0800, 0x0800, CRC(825fc8ac) SHA1(176ff0f4d0cd55be30efb184bd5bef62b92d0333) ) + ROM_LOAD( "RT09.69", 0x1000, 0x0800, CRC(de9d3f85) SHA1(13a71fdd889023cfc65ed2c0a65236884b79b1f0) ) + ROM_LOAD( "MR27.62", 0x1800, 0x0800, CRC(069ec108) SHA1(b12cd288d7e42002d01290f0572f9074adf2cdca) ) + ROM_LOAD( "RT11.61", 0x4000, 0x0800, CRC(17a7ef7a) SHA1(1a7b3f9393dceddcd1e220cadbff7e619594f884) ) + + ROM_REGION( 0x0400, "proms", 0 ) /* background color map */ + ROM_LOAD( "rt06.ic2", 0x0000, 0x0400, CRC(950cf973) SHA1(d22df09b325835a0057ccd0d54f827b374254ac6) ) +ROM_END + +ROM_START( sflush ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "fr05.sc2", 0xd800, 0x800, CRC(c4f08f9f) SHA1(997f216f5244942fc1a19f5c1988adbfadc301fc) ) + ROM_LOAD( "fr04.sc3", 0xe000, 0x800, CRC(87a754a5) SHA1(07c0e2c3cb7aa0086d8f4dd202a452bc6c20d4ee) ) + ROM_LOAD( "fr03.sc4", 0xe800, 0x800, CRC(5b12847f) SHA1(4b62342723dd49a387fae6637c331d7c853712a3) ) + ROM_LOAD( "fr02.sc5", 0xf000, 0x800, CRC(291c9b1f) SHA1(7e5b3e1605581abf3d8165f4de9d4e32a5ee3bb0) ) + ROM_LOAD( "fr01.sc6", 0xf800, 0x800, CRC(55d688c6) SHA1(574a3a2ca73cabb4b8f3444aa4464e6d64daa3ad) ) +ROM_END + +ROM_START( schasercv ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1", 0x0000, 0x0400, CRC(bec2b16b) SHA1(c62210ecb64d7c38e5b63481d7fe04eb59bb1068) ) + ROM_LOAD( "2", 0x0400, 0x0400, CRC(9d25e608) SHA1(4cc52a93a3ab96a0ec1d07593e17832fa59b30a1) ) + ROM_LOAD( "3", 0x0800, 0x0400, CRC(113d0635) SHA1(ab5e98d0b5fc37d7d69bb5c541681a0f66460440) ) + ROM_LOAD( "4", 0x0c00, 0x0400, CRC(f3a43c8d) SHA1(29a7a8b7d1de763a255cfec79157fd95e7bff551) ) + ROM_LOAD( "5", 0x1000, 0x0400, CRC(47c84f23) SHA1(61b475fa92b8335f8edd3a128d8ac8561658e464) ) + ROM_LOAD( "6", 0x1400, 0x0400, CRC(02ff2199) SHA1(e12c235b2064cb4bb426145172e523256e3c6358) ) + ROM_LOAD( "7", 0x1800, 0x0400, CRC(87d06b88) SHA1(2d743161f85e47cb8ee2a600cbee790b1ad7ad99) ) + ROM_LOAD( "8", 0x1c00, 0x0400, CRC(6dfaad08) SHA1(2184c4e2f4b6bffdc4fe13e178134331fcd43253) ) + ROM_LOAD( "9", 0x4000, 0x0400, CRC(3d1a2ae3) SHA1(672ad6590aebdfebc2748455fa638107f3934c41) ) + ROM_LOAD( "10", 0x4400, 0x0400, CRC(037edb99) SHA1(f2fc5e61f962666e7f6bb81753ac24ea0b97e581) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 (not used, but they were on the board) */ + ROM_LOAD( "cv01", 0x0000, 0x0400, CRC(037e16ac) SHA1(d585030aaff428330c91ae94d7cd5c96ebdd67dd) ) + ROM_LOAD( "cv02", 0x0400, 0x0400, CRC(8263da38) SHA1(2e7c769d129e6f8a1a31eba1e02777bb94ac32b2) ) +ROM_END + +ROM_START( schaserc ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "45.ic30", 0x0000, 0x0400, CRC(ca90619c) SHA1(d2f9b29290d720c57f867d1dc193e877248e6afd) ) + ROM_LOAD( "46.ic36", 0x0400, 0x0400, CRC(6a016895) SHA1(6984d9d002e5d8fa14bdaf16f6ba9ca02136372c) ) + ROM_LOAD( "rt15.bin", 0x0800, 0x0400, CRC(2ac43a93) SHA1(d364f0940681a888c0147e06bcb01f8a0d4a24c8) ) + ROM_LOAD( "rt16.bin", 0x0c00, 0x0400, CRC(f5583afc) SHA1(5e8edb43ccb138fd47ac8f3da1af79b4444a4a82) ) + ROM_LOAD( "rt17.bin", 0x1000, 0x0400, CRC(51cf1155) SHA1(fd8c82d951602fd7e0ada65fc7cdee9f277c70db) ) + ROM_LOAD( "rt18.bin", 0x1400, 0x0400, CRC(3f0fc73a) SHA1(b801c3f1e8e6e41c564432db7c5891f6b27293b2) ) + ROM_LOAD( "rt19.bin", 0x1800, 0x0400, CRC(b66ea369) SHA1(d277f572f9c7c4301518546cf60671a6539326ee) ) + ROM_LOAD( "47.ic39", 0x1c00, 0x0400, CRC(d476e182) SHA1(87428bf0131f8bf39d506b8df424af94cd944d82) ) + ROM_LOAD( "rt21.bin", 0x4000, 0x0400, CRC(b368ac98) SHA1(6860efe0496955db67611183be0efecda92c9c98) ) + ROM_LOAD( "rt22.bin", 0x4400, 0x0400, CRC(6e060dfb) SHA1(614e2ecf676c3ea2f9ea869125cfffef2f713684) ) + + ROM_REGION( 0x0400, "proms", 0 ) /* background color map */ + ROM_LOAD( "rt06.ic2", 0x0000, 0x0400, CRC(950cf973) SHA1(d22df09b325835a0057ccd0d54f827b374254ac6) ) +ROM_END + +ROM_START( lupin3 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "lp01.36", 0x0000, 0x0800, CRC(fd506ee8) SHA1(67ce62f24892f0eddf3e47913dff541f41493a17) ) + ROM_LOAD( "lp02.35", 0x0800, 0x0800, CRC(ec4225f8) SHA1(cd7360b3b339e5050075b498226070914fb7a031) ) + ROM_LOAD( "lp03.34", 0x1000, 0x0800, CRC(9307d377) SHA1(081f6c63ff2dcc549e44ab5ff5f5ddf99d544640) ) + ROM_LOAD( "lp04.33", 0x1800, 0x0800, CRC(e41e8b2b) SHA1(e67eaa8aeaf13f706afc17074fbbde3ad2cc9548) ) + ROM_LOAD( "lp05.32", 0x4000, 0x0800, CRC(f5c2faf4) SHA1(8d056f8c630e4659c02dd5da759dd497e4734292) ) + ROM_LOAD( "lp06.31", 0x4800, 0x0800, CRC(66289ab2) SHA1(fc9b4a7b7a08d43f34beaf1a8e68ed0ff6148534) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color map */ + ROM_LOAD( "lp08.1", 0x0000, 0x0400, CRC(33dbd03a) SHA1(1e0ae1cad1e9a90642886ae2ef726d3f383dd6cf) ) + ROM_LOAD( "lp09.2", 0x0400, 0x0400, CRC(9eaee652) SHA1(a4d2d8282ba825f3a8c0cc9bca16e1d36a0d0796) ) +ROM_END + +ROM_START( lupin3a ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "lp12.bin", 0x0000, 0x0800, CRC(68a7f47a) SHA1(dce99b3810331d7603fa468f1dea984e571f709b) ) + ROM_LOAD( "lp13.bin", 0x0800, 0x0800, CRC(cae9a17b) SHA1(a333ba7db45325996e3254ab36162bb7577e8a38) ) + ROM_LOAD( "lp14.bin", 0x1000, 0x0800, CRC(3553b9e4) SHA1(6affb5b6caf08f365c0dce669e44046295c3df91) ) + ROM_LOAD( "lp15.bin", 0x1800, 0x0800, CRC(acbeef64) SHA1(50d78cdc9938285b6bf9fa81fa0f6c30b23e0756) ) + ROM_LOAD( "lp16.bin", 0x4000, 0x0800, CRC(19fcdc54) SHA1(2f18ee8158321fff68886ffe793724001e8b18c2) ) + ROM_LOAD( "lp17.bin", 0x4800, 0x0800, CRC(66289ab2) SHA1(fc9b4a7b7a08d43f34beaf1a8e68ed0ff6148534) ) + ROM_LOAD( "lp18.bin", 0x5000, 0x0800, CRC(2f07b4ba) SHA1(982e4c437b39b45e23d15af1b2fc8c7aa3034559) ) +ROM_END + +ROM_START( polaris ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ps01-1.30", 0x0000, 0x0800, CRC(7d41007c) SHA1(168f002fe997aac6e4141292de826d389859bb04) ) + ROM_LOAD( "ps09.36", 0x0800, 0x0800, CRC(9a5c8cb2) SHA1(7a8c5d74f8b431072d9476d3ef65a3fe1d639813) ) + ROM_LOAD( "ps03-1.31", 0x1000, 0x0800, CRC(21f32415) SHA1(6ac9ae9b55e342729fe260147021ed3911a24dc2) ) + ROM_LOAD( "ps04.37", 0x1800, 0x0800, CRC(65694948) SHA1(de92a7f3e3ef732b573254baa60df60f8e068a5d) ) + ROM_LOAD( "ps05.32", 0x4000, 0x0800, CRC(772e31f3) SHA1(fa0b866b6df1a9217e286ca880b3bb3fb0644bf3) ) + ROM_LOAD( "ps10.38", 0x4800, 0x0800, CRC(3df77bac) SHA1(b3275c34b8d42df83df2c404c5b7d220aae651fa) ) + ROM_LOAD( "ps26", 0x5000, 0x0800, CRC(9d5c3d50) SHA1(a6acf9ca6e807625156cb1759269014d5830a44f) ) + + ROM_REGION( 0x0400, "proms", 0 ) /* background color map */ + ROM_LOAD( "ps08.1b", 0x0000, 0x0400, CRC(164aa05d) SHA1(41c699ce45c76a60c71294f25d8df6c6e6c1280a) ) /* NEC B406 or compatible BPROM (82S137) */ + + ROM_REGION( 0x0100, "user1", 0 ) /* cloud graphics */ + ROM_LOAD( "ps07.2c", 0x0000, 0x0100, CRC(2953253b) SHA1(2fb851bc9652ca4e51d473b484ede6dab05f1b51) ) /* MB7052 or compatible BPROM (82S129) */ +ROM_END + +ROM_START( polarisa ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ps01.30", 0x0000, 0x0800, CRC(c04ce5a9) SHA1(62cc9b3b682ebecfb7600393862c65e26ff5263f) ) + ROM_LOAD( "ps09.36", 0x0800, 0x0800, CRC(9a5c8cb2) SHA1(7a8c5d74f8b431072d9476d3ef65a3fe1d639813) ) + ROM_LOAD( "ps03.31", 0x1000, 0x0800, CRC(8680d7ea) SHA1(7fd4b8a415666c36842fed80d2798b48f8b29d0d) ) + ROM_LOAD( "ps04.37", 0x1800, 0x0800, CRC(65694948) SHA1(de92a7f3e3ef732b573254baa60df60f8e068a5d) ) + ROM_LOAD( "ps05.32", 0x4000, 0x0800, CRC(772e31f3) SHA1(fa0b866b6df1a9217e286ca880b3bb3fb0644bf3) ) + ROM_LOAD( "ps10.38", 0x4800, 0x0800, CRC(3df77bac) SHA1(b3275c34b8d42df83df2c404c5b7d220aae651fa) ) + + ROM_REGION( 0x0400, "proms", 0 ) /* background color map */ + ROM_LOAD( "ps08.1b", 0x0000, 0x0400, CRC(164aa05d) SHA1(41c699ce45c76a60c71294f25d8df6c6e6c1280a) ) /* NEC B406 or compatible BPROM (82S137) */ + + ROM_REGION( 0x0100, "user1", 0 ) /* cloud graphics */ + ROM_LOAD( "ps07.2c", 0x0000, 0x0100, CRC(2953253b) SHA1(2fb851bc9652ca4e51d473b484ede6dab05f1b51) ) /* MB7052 or compatible BPROM (82S129) */ +ROM_END + + +ROM_START( polariso ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ps01.30", 0x0000, 0x0800, CRC(c04ce5a9) SHA1(62cc9b3b682ebecfb7600393862c65e26ff5263f) ) + ROM_LOAD( "ps02.36", 0x0800, 0x0800, CRC(18648e4f) SHA1(9f672e108177d5d9bc004b41eec00dc4d19269ff) ) + ROM_LOAD( "ps03.31", 0x1000, 0x0800, CRC(8680d7ea) SHA1(7fd4b8a415666c36842fed80d2798b48f8b29d0d) ) + ROM_LOAD( "ps04.37", 0x1800, 0x0800, CRC(65694948) SHA1(de92a7f3e3ef732b573254baa60df60f8e068a5d) ) + ROM_LOAD( "ps05.32", 0x4000, 0x0800, CRC(772e31f3) SHA1(fa0b866b6df1a9217e286ca880b3bb3fb0644bf3) ) + ROM_LOAD( "ps06.38", 0x4800, 0x0800, CRC(f577cb72) SHA1(7a931b5ebaf0d6941191f21afb9ed670d0251e07) ) + + ROM_REGION( 0x0400, "proms", 0 ) /* background color map */ + ROM_LOAD( "ps08.1b", 0x0000, 0x0400, CRC(164aa05d) SHA1(41c699ce45c76a60c71294f25d8df6c6e6c1280a) ) /* NEC B406 or compatible BPROM (82S137) */ + + ROM_REGION( 0x0100, "user1", 0 ) /* cloud graphics */ + ROM_LOAD( "ps07.2c", 0x0000, 0x0100, CRC(2953253b) SHA1(2fb851bc9652ca4e51d473b484ede6dab05f1b51) ) /* MB7052 or compatible BPROM (82S129) */ +ROM_END + +ROM_START( polarisbr ) /* aka Polaris II on flyers? */ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1", 0x0000, 0x0800, CRC(17015f52) SHA1(8beb4d927c08420f9990fac787a81d4bd6dd419c) ) + ROM_LOAD( "2", 0x0800, 0x0800, CRC(9a5c8cb2) SHA1(7a8c5d74f8b431072d9476d3ef65a3fe1d639813) ) + ROM_LOAD( "3", 0x1000, 0x0800, CRC(60118368) SHA1(e1189fd88b943fcf77a5c41c519cccdb8196910c) ) + ROM_LOAD( "4", 0x1800, 0x0800, CRC(65694948) SHA1(de92a7f3e3ef732b573254baa60df60f8e068a5d) ) + ROM_LOAD( "5", 0x4000, 0x0800, CRC(6cb21b31) SHA1(f9d435a3aa905f124cb87c139b047e1585d0997b) ) + ROM_LOAD( "6", 0x4800, 0x0800, CRC(3df77bac) SHA1(b3275c34b8d42df83df2c404c5b7d220aae651fa) ) + ROM_LOAD( "7", 0x5000, 0x0800, CRC(0d811b92) SHA1(09af62997e1e0da0525ab4f6ced775d3673d8f35) ) + + ROM_REGION( 0x0400, "proms", 0 ) /* background color map */ + ROM_LOAD( "ps08.1b", 0x0000, 0x0400, CRC(164aa05d) SHA1(41c699ce45c76a60c71294f25d8df6c6e6c1280a) ) /* NEC B406 or compatible BPROM (82S137) */ + + ROM_REGION( 0x0100, "user1", 0 ) /* cloud graphics */ + ROM_LOAD( "ps07.2c", 0x0000, 0x0100, CRC(2953253b) SHA1(2fb851bc9652ca4e51d473b484ede6dab05f1b51) ) /* MB7052 or compatible BPROM (82S129) */ +ROM_END + +ROM_START( ozmawars ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "mw01", 0x0000, 0x0800, CRC(31f4397d) SHA1(bba9765aadd608d19e2515a5edf8e0eceb70916a) ) + ROM_LOAD( "mw02", 0x0800, 0x0800, CRC(d8e77c62) SHA1(84fc81cf9a924ecbb13a008cd7435b7d465bddf6) ) + ROM_LOAD( "mw03", 0x1000, 0x0800, CRC(3bfa418f) SHA1(7318878202322a2263551ca463e4c70943401f68) ) + ROM_LOAD( "mw04", 0x1800, 0x0800, CRC(e190ce6c) SHA1(120898e9a683f5ce874c6fde761570a26de2fa8c) ) + ROM_LOAD( "mw05", 0x4000, 0x0800, CRC(3bc7d4c7) SHA1(b084f8cd2ce0f502c2e915da3eceffcbb448e9c0) ) + ROM_LOAD( "mw06", 0x4800, 0x0800, CRC(99ca2eae) SHA1(8d0f220f68043eff0c85d2de7bee7fd4365fb51c) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + /* !! not dumped yet, these were taken from sisv/intruder */ + ROM_LOAD( "01.1", 0x0000, 0x0400, BAD_DUMP CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) + ROM_LOAD( "02.2", 0x0400, 0x0400, BAD_DUMP CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) +ROM_END + +/* +------------------------------ +Ozma Wars by SHIN NIHON KIKAKU +------------------------------ +Location Type File ID Checksum +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +ROM IC36 2708 OZ1 8707 +ROM IC35 2708 OZ2 60A7 +ROM IC34 2708 OZ3 7504 +ROM IC33 2708 OZ4 55A1 +ROM IC32 2708 OZ5 6BC3 +ROM IC31 2708 OZ6 2808 +ROM IC42 2708 OZ7 FE8A +ROM IC41 2708 OZ8 C03B +ROM IC40 2708 OZ9 7515 +ROM IC39 2708 OZ10 4BD4 +ROM IC38 2708 OZ11 50BA +ROM IC37 2708 OZ12 3411 +Note: CPU - CPU board (AA017757) + AUD - Audio/IO board (CV070005) + ROM - ROM board (AA017756A) + - Uses Taito's three board colour version + of Space Invaders PCB +*/ + +ROM_START( ozmawars2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "oz1", 0x0000, 0x0400, CRC(9300830e) SHA1(7ed349f7ad01b30aefb41dcaf97e209d00f5af6c) ) + ROM_LOAD( "oz2", 0x0400, 0x0400, CRC(957fc661) SHA1(ac0edc901d8033619f62967f8eaf53a02947e109) ) + ROM_LOAD( "oz3", 0x0800, 0x0400, CRC(cf8f4d6c) SHA1(effb4dc48594e1b7164b37f683a5a78b1a9bdd4f) ) + ROM_LOAD( "oz4", 0x0c00, 0x0400, CRC(f51544a5) SHA1(368411a2dadaebcbb4d5b6cf6c2beec036ce817f) ) + ROM_LOAD( "oz5", 0x1000, 0x0400, CRC(5597bf52) SHA1(626c7348365ed974d416485d94d057745b5d9b96) ) + ROM_LOAD( "oz6", 0x1400, 0x0400, CRC(19b43578) SHA1(3609b7c77f5ee6f10f302892f56fcc8375577f20) ) + ROM_LOAD( "oz7", 0x1800, 0x0400, CRC(a285bfde) SHA1(ed7a9fce4d887d3b5d596645893ea87c0bafda02) ) + ROM_LOAD( "oz8", 0x1c00, 0x0400, CRC(ae59a629) SHA1(0c9ea67dc35f93ec65ec91e1dab2e4b6212428bf) ) + ROM_LOAD( "oz9", 0x4000, 0x0400, CRC(df0cc633) SHA1(3725af2e5a6e9ab08dd9ada345630de19c88ce73) ) + ROM_LOAD( "oz10", 0x4400, 0x0400, CRC(31b7692e) SHA1(043880750d134d04311eab55e30ee223977d3d17) ) + ROM_LOAD( "oz11", 0x4800, 0x0400, CRC(660e934c) SHA1(1d50ae3a9de041b908e256892203ce1738d588f6) ) + ROM_LOAD( "oz12", 0x4c00, 0x0400, CRC(8b969f61) SHA1(6d12cacc73c31a897812ccd8de24725ee56dd975) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + /* !! not dumped yet, these were taken from sisv/intruder */ + ROM_LOAD( "01.1", 0x0000, 0x0400, BAD_DUMP CRC(aac24f34) SHA1(ad110e776547fb48baac568bb50d61854537ca34) ) + ROM_LOAD( "02.2", 0x0400, 0x0400, BAD_DUMP CRC(2bdf83a0) SHA1(01ffbd43964c41987e7d44816271308f9a70802b) ) +ROM_END + +ROM_START( ozmawarsmr ) // single PCB marked CS 210. No PROMS. + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "73.1s", 0x0000, 0x0400, CRC(9300830e) SHA1(7ed349f7ad01b30aefb41dcaf97e209d00f5af6c) ) + ROM_LOAD( "74.1pr", 0x0400, 0x0400, CRC(957fc661) SHA1(ac0edc901d8033619f62967f8eaf53a02947e109) ) + ROM_LOAD( "75.1n", 0x0800, 0x0400, CRC(cf8f4d6c) SHA1(effb4dc48594e1b7164b37f683a5a78b1a9bdd4f) ) + ROM_LOAD( "76.1m", 0x0c00, 0x0400, CRC(f51544a5) SHA1(368411a2dadaebcbb4d5b6cf6c2beec036ce817f) ) + ROM_LOAD( "77.1l", 0x1000, 0x0400, CRC(4a653fe6) SHA1(22aee4c6cc3bd474d7159a552c4fb666b78fc4fb) ) + ROM_LOAD( "78.1kj", 0x1400, 0x0400, CRC(fb3db187) SHA1(bbf3e316215cefe2237115d766332ce185c8ca01) ) + ROM_LOAD( "79.1h", 0x1800, 0x0400, CRC(ed2d7c34) SHA1(f468b422e9f06522b034d213cebc914afb21dda1) ) + ROM_LOAD( "80.1g", 0x1c00, 0x0400, CRC(85728971) SHA1(400968f5c99b50416cdeefb4405989aa8012a3d1) ) + ROM_LOAD( "81.1ef", 0x4000, 0x0400, CRC(df0cc633) SHA1(3725af2e5a6e9ab08dd9ada345630de19c88ce73) ) + ROM_LOAD( "82.1d", 0x4400, 0x0400, CRC(31b7692e) SHA1(043880750d134d04311eab55e30ee223977d3d17) ) + ROM_LOAD( "83.1c", 0x4800, 0x0400, CRC(50257351) SHA1(5c3eb29f36f04b7fb8f0351ccf9c8cfc7587f927) ) + ROM_LOAD( "84.1b", 0x4c00, 0x0400, CRC(293303c9) SHA1(bd3770ff7cf6fa38b17cdfd0e0633d84c015dea7) ) +ROM_END + +ROM_START( solfight ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "solfight.m", 0x0000, 0x0800, CRC(a4f2814e) SHA1(e2437e3543dcc97eeaea32babcd4aec6455581ac) ) + ROM_LOAD( "solfight.n", 0x0800, 0x0800, CRC(5657ec07) SHA1(9a2fb398841160f59483bb70060caba37addb8a4) ) + ROM_LOAD( "solfight.p", 0x1000, 0x0800, CRC(ef9ce96d) SHA1(96867b4f2d72f3a8827b1eb3a0748922eaa8d608) ) + ROM_LOAD( "solfight.r", 0x1800, 0x0800, CRC(4f1ef540) SHA1(a798e57959e72bfb554dd2fed0e37027312f9ed3) ) + ROM_LOAD( "mw05", 0x4000, 0x0800, CRC(3bc7d4c7) SHA1(b084f8cd2ce0f502c2e915da3eceffcbb448e9c0) ) + ROM_LOAD( "solfight.t", 0x4800, 0x0800, CRC(3b6fb206) SHA1(db631f4a0bd5344d130ff8d723d949e9914b6f92) ) +ROM_END + +ROM_START( spaceph ) /* Also seen in a 6-rom version which matches contents exactly (sv01+sv02, sv03+sv04, etc)*/ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "sv01.bin", 0x0000, 0x0400, CRC(de84771d) SHA1(13a7e5eedb826cca4d59634d38db9fcf5e65b732) ) + ROM_LOAD( "sv02.bin", 0x0400, 0x0400, CRC(957fc661) SHA1(ac0edc901d8033619f62967f8eaf53a02947e109) ) + ROM_LOAD( "sv03.bin", 0x0800, 0x0400, CRC(dbda38b9) SHA1(73a277616a0c236b07c9ffa66f16a27a78c12d70) ) + ROM_LOAD( "sv04.bin", 0x0c00, 0x0400, CRC(f51544a5) SHA1(368411a2dadaebcbb4d5b6cf6c2beec036ce817f) ) + ROM_LOAD( "sv05.bin", 0x1000, 0x0400, CRC(98d02683) SHA1(f13958df8d385f532e993e4c34569d992904a4ed) ) + ROM_LOAD( "sv06.bin", 0x1400, 0x0400, CRC(4ec390fd) SHA1(ade23efde5d55d282fbb28a5f8a1346601501b79) ) + ROM_LOAD( "sv07.bin", 0x1800, 0x0400, CRC(170862fd) SHA1(ac64a97b1510ca81d4ef3a5fcf45b7e6c7414914) ) + ROM_LOAD( "sv08.bin", 0x1c00, 0x0400, CRC(511b12cf) SHA1(08ba43024c8574ded11aa457eca24b72984f5ea9) ) + ROM_LOAD( "sv09.bin", 0x4000, 0x0400, CRC(af1cd1af) SHA1(286d77e8556e475b291a3b1a53acaca8b7dc3678) ) + ROM_LOAD( "sv10.bin", 0x4400, 0x0400, CRC(31b7692e) SHA1(043880750d134d04311eab55e30ee223977d3d17) ) + ROM_LOAD( "sv11.bin", 0x4800, 0x0400, CRC(50257351) SHA1(5c3eb29f36f04b7fb8f0351ccf9c8cfc7587f927) ) + ROM_LOAD( "sv12.bin", 0x4c00, 0x0400, CRC(a2a3366a) SHA1(87032787450216d378406122effa95ea01145bf7) ) +ROM_END + +ROM_START( ballbomb ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "tn01", 0x0000, 0x0800, CRC(551585b5) SHA1(7c17b046bdfca6ab107b7e68ba9bde6ca590c3d4) ) + ROM_LOAD( "tn02", 0x0800, 0x0800, CRC(7e1f734f) SHA1(a15656818cd730d9bc98d00ff1e7fe3f860bd624) ) + ROM_LOAD( "tn03", 0x1000, 0x0800, CRC(d93e20bc) SHA1(2bf72f813750cef8fad572a18fb8e9fd5bf38804) ) + ROM_LOAD( "tn04", 0x1800, 0x0800, CRC(d0689a22) SHA1(1f6b258431b7eb878853ff979e4d97a05fb6b797) ) + ROM_LOAD( "tn05-1", 0x4000, 0x0800, CRC(5d5e94f1) SHA1(b9f8ba38161ef4f0940c274e9d93fed4bb7db017) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + ROM_LOAD( "tn06", 0x0000, 0x0400, CRC(7ec554c4) SHA1(b638605ba2043fdca4c5e18755fa5fa81ed3db07) ) + ROM_LOAD( "tn07", 0x0400, 0x0400, CRC(deb0ac82) SHA1(839581c4e58cb7b0c2c14cf4f239220017cc26eb) ) + + ROM_REGION( 0x0100, "user1", 0 ) /* cloud graphics (missing) */ + ROM_LOAD( "mb7052.2c", 0x0000, 0x0100, NO_DUMP ) +ROM_END + +ROM_START( yosakdon ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "yd1.bin", 0x0000, 0x0400, CRC(607899c9) SHA1(219c0c99894715818606fba49cc75517f6f43e0c) ) + ROM_LOAD( "yd2.bin", 0x0400, 0x0400, CRC(78336df4) SHA1(b0b6254568d191d2d0b9c9280a3ccf2417ef3f38) ) + ROM_LOAD( "yd3.bin", 0x0800, 0x0400, CRC(c5af6d52) SHA1(c40af79fe060562c64fc316881b7d0348e11ee3f) ) + ROM_LOAD( "yd4.bin", 0x0c00, 0x0400, CRC(dca8064f) SHA1(77a58137cc7f0b5fbe0e9e8deb9c5be88b1ebbcf) ) + ROM_LOAD( "yd5.bin", 0x1400, 0x0400, CRC(38804ff1) SHA1(9b7527b9d2b106355f0c8df46666b1e3f286b2e3) ) + ROM_LOAD( "yd6.bin", 0x1800, 0x0400, CRC(988d2362) SHA1(deaf864b4e287cbc2585c2a11343b1ae82e15463) ) + ROM_LOAD( "yd7.bin", 0x1c00, 0x0400, CRC(2744e68b) SHA1(5ad5a7a615d36f57b6d560425e035c15e25e9005) ) +ROM_END + +ROM_START( yosakdona ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "yosaku1", 0x0000, 0x0400, CRC(d132f4f0) SHA1(373c7ea1bd6debcb3dad5881793b8c31dc7a01e6) ) + ROM_LOAD( "yd2.bin", 0x0400, 0x0400, CRC(78336df4) SHA1(b0b6254568d191d2d0b9c9280a3ccf2417ef3f38) ) + ROM_LOAD( "yosaku3", 0x0800, 0x0400, CRC(b1a0b3eb) SHA1(4eb80668920b45dc6216424f8ca53d753a35f4f1) ) + ROM_LOAD( "yosaku4", 0x0c00, 0x0400, CRC(c06c225e) SHA1(2699e3c13b09b6de16bd3ca3ca2e9d7a91b7e268) ) + ROM_LOAD( "yosaku5", 0x1400, 0x0400, CRC(ae422a43) SHA1(5219680f9d6c5d984b29167f85106fa375856121) ) + ROM_LOAD( "yosaku6", 0x1800, 0x0400, CRC(26b24a12) SHA1(387589fa4027d41b6fb06555661d4f92fe2f990c) ) + ROM_LOAD( "yosaku7", 0x1c00, 0x0400, CRC(878d5a18) SHA1(6adc8763d5644602eed7fe6d9186a48be105aace) ) +ROM_END + +ROM_START( indianbt ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1.36", 0x0000, 0x0800, CRC(ddc2b25d) SHA1(120ae17492b79d7d2ad515de9f1e3be7f8b9d4eb) ) + ROM_LOAD( "2.35", 0x0800, 0x0800, CRC(6499b062) SHA1(62a301d532b9fc4e7a17cbe8d2061eb0e842bdfa) ) + ROM_LOAD( "3.34", 0x1000, 0x0800, CRC(5c51675d) SHA1(1313e8794ee6cd0252452b96d42cff7907eeaa21) ) + ROM_LOAD( "4.33", 0x1800, 0x0800, CRC(70ebec95) SHA1(f6e1e7a28033d89e49b88c559ea8926b1b4ff21b) ) + ROM_LOAD( "5.32", 0x4000, 0x0800, CRC(7b4022f4) SHA1(10dec8110e8f4bc79764d3183bdfb3c135e27faf) ) + ROM_LOAD( "6.31", 0x4800, 0x0800, CRC(89bd6f73) SHA1(5dc63871252c530ef0aae4f4cd02fee44b397815) ) + ROM_LOAD( "7.42", 0x5000, 0x0800, CRC(7060ba0b) SHA1(366ce02b7b0a3391afef23b8b41cd98a91034830) ) + ROM_LOAD( "8.41", 0x5800, 0x0800, CRC(eaccfc0a) SHA1(c6c2d702243bdd1d2ad5fbaaceadb5a5798577bc) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + ROM_LOAD( "mb7054.1", 0x0000, 0x0400, CRC(4acf4db3) SHA1(842a6c9f91806b424b7cc437670b4fe0bd57dff1) ) + ROM_LOAD( "mb7054.2", 0x0400, 0x0400, CRC(62cb3419) SHA1(3df65062945589f1df37359dbd3e30ae4b23f469) ) +ROM_END + +ROM_START( indianbtbr ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1.36", 0x0000, 0x0800, CRC(5cf6316b) SHA1(9812fbb7139d6f33a832a2485f9cd6422146d1ae) ) // sldh + ROM_LOAD( "2.35", 0x0800, 0x0800, CRC(882c7421) SHA1(b2cc15c8693bd1fc74dddfcf52bf08984423f4bf) ) // sldh + ROM_LOAD( "3.34", 0x1000, 0x0800, CRC(5c51675d) SHA1(1313e8794ee6cd0252452b96d42cff7907eeaa21) ) + ROM_LOAD( "4.33", 0x1800, 0x0800, CRC(70ebec95) SHA1(f6e1e7a28033d89e49b88c559ea8926b1b4ff21b) ) + ROM_LOAD( "5.32", 0x4000, 0x0800, CRC(aa12dbae) SHA1(083425b82cfdc0f037afcf293ad03b98fc6af3e5) ) // sldh + ROM_LOAD( "6.31", 0x4800, 0x0800, CRC(d9cb1691) SHA1(c13cd8479914ba6719427b408ed589c9892f832c) ) // sldh + ROM_LOAD( "7.42", 0x5000, 0x0800, CRC(7060ba0b) SHA1(366ce02b7b0a3391afef23b8b41cd98a91034830) ) + ROM_LOAD( "8.41", 0x5800, 0x0800, CRC(e96699d6) SHA1(701d370ae28608221fb4d00e12877d30122c848e) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 */ + ROM_LOAD( "mb7054.1", 0x0000, 0x0400, CRC(4acf4db3) SHA1(842a6c9f91806b424b7cc437670b4fe0bd57dff1) ) + ROM_LOAD( "mb7054.2", 0x0400, 0x0400, CRC(62cb3419) SHA1(3df65062945589f1df37359dbd3e30ae4b23f469) ) +ROM_END + +ROM_START( shuttlei ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1.13c", 0x0000, 0x0400, CRC(b6d4f0cd) SHA1(f855a793e78ff6283288c815b59e6942513ab4f8) ) + ROM_LOAD( "2.11c", 0x0400, 0x0400, CRC(168d6138) SHA1(e0e5ba58eb5a3a00802504c48a96d63522f9865f) ) + ROM_LOAD( "3.13d", 0x0800, 0x0400, CRC(804bd7fb) SHA1(f019bcc2894f9b819a14c069de8f1a7d228b79eb) ) + ROM_LOAD( "4.11d", 0x0c00, 0x0400, CRC(8205b369) SHA1(685dd244881f5762d0f53cbfa935da2b857e3fba) ) + ROM_LOAD( "5.13e", 0x1000, 0x0400, CRC(b50df820) SHA1(27a846ac3da4c0890a80f60483ed5750cb0b2476) ) + ROM_LOAD( "8.11f", 0x1c00, 0x0400, CRC(4978552b) SHA1(5a6b6e39f57a353580ed9281d7da24950f058426) ) + + ROM_REGION( 0x0100, "proms", 0 ) + ROM_LOAD( "82s129.2b", 0x0000, 0x0100, CRC(f108d00d) SHA1(de0cb9d18e4c9920495011f962c4497a789f651f) ) +ROM_END + +ROM_START( skylove ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "01", 0x0000, 0x0400, CRC(391ad7d0) SHA1(73358fff44da5fffd4e08fbb615ccc0245e3365b) ) + ROM_LOAD( "02", 0x0400, 0x0400, CRC(365ba070) SHA1(8493bde493ea0d04b3563f9bc752a6ec57022524) ) + ROM_LOAD( "03", 0x0800, 0x0400, CRC(47364dad) SHA1(b49704f8d49a0866cb9cd8bb867f30246e3dabc9) ) + ROM_LOAD( "04", 0x0c00, 0x0400, CRC(9d76f33d) SHA1(5aa6a081a3609e6c036843049d58cc763a86fedb) ) + ROM_LOAD( "05", 0x1000, 0x0400, CRC(09084954) SHA1(f5c826188ffb7a572c45aad94e794f31bebfebe5) ) + ROM_LOAD( "06", 0x1400, 0x0400, CRC(6d494e82) SHA1(8e5ee1b842621cd088e80124b92b8a517e8dfbb9) ) + ROM_LOAD( "07", 0x1800, 0x0400, CRC(1a9aa4b8) SHA1(0da553c6343a2740312ebafc2b936ffbbf24af04) ) + ROM_LOAD( "08", 0x1c00, 0x0400, CRC(ecaacacc) SHA1(b815366d3aaa8ef311cd54a5be9fb4d60324e5a7) ) +ROM_END + + +ROM_START( darthvdr ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "rom0", 0x0000, 0x0400, CRC(b15785b6) SHA1(f453a006019dc83bd746f3a26736e913186332e6) ) + ROM_LOAD( "rom1", 0x0400, 0x0400, CRC(95947743) SHA1(59f414de21f680e0d68ca8c4b6b538c8006cfdd6) ) + ROM_LOAD( "rom2", 0x0800, 0x0400, CRC(19b1731f) SHA1(2383c241de8a1ed57f03ecc7ded97585a6c10c91) ) + ROM_LOAD( "rom3", 0x0c00, 0x0400, CRC(ca1b5e3c) SHA1(e54ca4a3f36b2ed5e4e42c1e8bbbde43c92796e9) ) + ROM_LOAD( "rom4", 0x1000, 0x0400, CRC(eede5f41) SHA1(cd9f023057eb9598bad01b9e9d91bb4866b9bd3b) ) + ROM_LOAD( "rom5", 0x1400, 0x0400, CRC(cc52a4bb) SHA1(857b75a8b01fc707db940197d6bf3b0466c4a7b5) ) +ROM_END + +ROM_START( astropal ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "2708.0a", 0x0000, 0x0400, CRC(e6883322) SHA1(05b0ab0dc6297209dcfdd173e762bfae3a720e8d) ) + ROM_LOAD( "2708.1a", 0x0400, 0x0400, CRC(4401df1d) SHA1(16f3b957278aa67cb37bcd5defb6e4dd8ccf7d1f) ) + ROM_LOAD( "2708.2a", 0x0800, 0x0400, CRC(5bac1ee4) SHA1(8c3e5f882f4798f8ed0523b60a216c989324a7c2) ) + ROM_LOAD( "2708.3a", 0x0c00, 0x0400, CRC(a870afad) SHA1(1a256db2bc6baa238ee1df4eff2fdce0888f812c) ) + ROM_LOAD( "2708.4a", 0x1000, 0x0400, CRC(8bd2d985) SHA1(3ff9110c1bad7d4562664da772d14750d738c2d6) ) + ROM_LOAD( "2708.5a", 0x1400, 0x0400, CRC(5e97a86b) SHA1(f3500d48ecb3969b8aaea9c4e812fbf6cf4170af) ) + ROM_LOAD( "2708.6a", 0x1800, 0x0400, CRC(22c354d0) SHA1(c465ca5787ad8de3be97deac1214d3abd0b27e6b) ) + ROM_LOAD( "2708.7a", 0x1c00, 0x0400, CRC(aeca51c1) SHA1(767bca1e6bca41327b9ff6c3570edcabe46dec21) ) +ROM_END + +ROM_START( steelwkr ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1.36", 0x0000, 0x0400, CRC(5d78873a) SHA1(293cbc067937668148181453877239cb5ed57600) ) + ROM_LOAD( "2.35", 0x0400, 0x0400, CRC(99cd70c6) SHA1(a08bf4db6b39d22dfcf052cc6603aab041db0208) ) + ROM_LOAD( "3.34", 0x0800, 0x0400, CRC(18103b67) SHA1(45929ea56ab15769fc68873570aab3d403e8e913) ) + ROM_LOAD( "4.33", 0x0c00, 0x0400, CRC(c413ae82) SHA1(302b933b45b2aaa515434b5268fd74aec4160e3f) ) + ROM_LOAD( "5.32", 0x1000, 0x0400, CRC(ca7b07b5) SHA1(cbea221c4daf84825f99bbef6d731fc2ef88feeb) ) + ROM_LOAD( "6.31", 0x1400, 0x0400, CRC(f8181fa0) SHA1(a907611529a1500a2ae118e834c2d4b6d11974f1) ) + ROM_LOAD( "7.42", 0x1800, 0x0400, CRC(a35f113e) SHA1(53073037db55c14055810c0bee7b85eb75bbaa72) ) + ROM_LOAD( "8.41", 0x1c00, 0x0400, CRC(af208370) SHA1(ccbd002accda26cc0a02987d9801a47e5f49921a) ) + + ROM_REGION( 0x0800, "proms", 0 ) /* color maps player 1/player 2 (not used, but they were on the board) */ + ROM_LOAD( "la05.1", 0x0000, 0x0400, CRC(98f31392) SHA1(ccdd1bd2ddd24bd6b1f8255a87e138f937eaf5b4) ) + ROM_LOAD( "la06.2", 0x0400, 0x0400, CRC(98f31392) SHA1(ccdd1bd2ddd24bd6b1f8255a87e138f937eaf5b4) ) +ROM_END + +ROM_START( galactic ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1", 0x0000, 0x0800, CRC(b5098f1e) SHA1(9d1d045d8abeafd4716d3052fe93e52c6b347049) ) // sldh + ROM_LOAD( "2", 0x0800, 0x0800, CRC(f97410ee) SHA1(47f1f296c905fa13f6c521edc12c10f1f0e42400) ) + ROM_LOAD( "3", 0x1000, 0x0800, CRC(c1175feb) SHA1(83bf955ed3a52e1ce8c688d89725d8dee1bcc866) ) + ROM_LOAD( "4", 0x1800, 0x0800, CRC(b4451d7c) SHA1(62a18e8e927ef00a7f6cb933cdc5aeae9f074dc0) ) + ROM_LOAD( "5", 0x4000, 0x0800, CRC(74c9da61) SHA1(cb98105729f0fa4343b71af3c658b378ade1ed46) ) + ROM_LOAD( "6", 0x4800, 0x0800, CRC(5e7c6c44) SHA1(be7eeef10462377909018cf40503766f38466022) ) + ROM_LOAD( "7", 0x5000, 0x0800, CRC(02619e18) SHA1(4c59f17fbc96ca08090f08c41ca9fc72c074e9c0) ) +ROM_END + +ROM_START( spacmiss ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1", 0x0000, 0x0800, CRC(e212dc88) SHA1(bc56052bf43d18081f777b936b2be792e91ba842) ) // sldh + ROM_LOAD( "2", 0x0800, 0x0800, CRC(f97410ee) SHA1(47f1f296c905fa13f6c521edc12c10f1f0e42400) ) + ROM_LOAD( "3", 0x1000, 0x0800, CRC(c1175feb) SHA1(83bf955ed3a52e1ce8c688d89725d8dee1bcc866) ) + ROM_LOAD( "4", 0x1800, 0x0800, CRC(b4451d7c) SHA1(62a18e8e927ef00a7f6cb933cdc5aeae9f074dc0) ) + ROM_LOAD( "5", 0x4000, 0x0800, CRC(74c9da61) SHA1(cb98105729f0fa4343b71af3c658b378ade1ed46) ) + ROM_LOAD( "6", 0x4800, 0x0800, CRC(5e7c6c44) SHA1(be7eeef10462377909018cf40503766f38466022) ) + ROM_LOAD( "7", 0x5000, 0x0800, CRC(02619e18) SHA1(4c59f17fbc96ca08090f08c41ca9fc72c074e9c0) ) + + ROM_REGION( 0x0800, "user1", 0 ) + ROM_LOAD( "8", 0x0000, 0x0800, CRC(942e5261) SHA1(e8af51d644eab4e7b31c14dc66bb036ad8940c42) ) // ? +ROM_END + +ROM_START( attackfc ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "30a.bin", 0x0000, 0x0400, CRC(c12e3386) SHA1(72b1d3d67a83edf0be0b0c37ef6dcffba450f16f) ) + ROM_LOAD( "36a.bin", 0x0400, 0x0400, CRC(6738dcb9) SHA1(e4c68553fc3f2d3db3d251b9cb325e2409d9c02a) ) + ROM_LOAD( "31a.bin", 0x0800, 0x0400, CRC(787a4658) SHA1(5be3143bdba6a32256603be94400034a8ea1fda6) ) + ROM_LOAD( "37a.bin", 0x0c00, 0x0400, CRC(ad6bfbbe) SHA1(5f5437b6c8e7dfe9649b25040862f8a51d8c43ed) ) + ROM_LOAD( "32a.bin", 0x1000, 0x0400, CRC(cbe0a711) SHA1(6e5f4214a4b48b70464005f4263c9b1ec3cbbeb1) ) + ROM_LOAD( "33a.bin", 0x1800, 0x0400, CRC(53147393) SHA1(57e078f1734e382e8a46be09c133daab30c75681) ) + ROM_LOAD( "39a.bin", 0x1c00, 0x0400, CRC(f538cf08) SHA1(4a375a41ab5d9f0d9f9a2ebef4c448038c139204) ) +ROM_END + + +/* board # rom parent machine inp init monitor, .. */ + +// Taito games (+clones), starting with Space Invaders +GAME( 1978, sisv1, invaders, invaders, sitv, driver_device, 0, ROT270, "Taito", "Space Invaders (SV Version rev 1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1978, sisv2, invaders, invaders, sitv, driver_device, 0, ROT270, "Taito", "Space Invaders (SV Version rev 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1978, sisv3, invaders, invaders, sitv, driver_device, 0, ROT270, "Taito", "Space Invaders (SV Version rev 3)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1978, sisv, invaders, invaders, sitv, driver_device, 0, ROT270, "Taito", "Space Invaders (SV Version rev 4)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAMEL(1978, sitv1, invaders, invaders, sitv, driver_device, 0, ROT270, "Taito", "Space Invaders (TV Version rev 1)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(1978, sitv, invaders, invaders, sitv, driver_device, 0, ROT270, "Taito", "Space Invaders (TV Version rev 2)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAME( 1979, sicv, invaders, invadpt2, sicv, driver_device, 0, ROT270, "Taito", "Space Invaders (CV Version, larger roms)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1979, sicv1, invaders, invadpt2, sicv, driver_device, 0, ROT270, "Taito", "Space Invaders (CV Version, smaller roms)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAMEL(1978, invadrmr, invaders, invaders, invadrmr, driver_device, 0, ROT270, "Taito / Model Racing", "Space Invaders (Model Racing)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // unclassified, licensed or bootleg? +GAMEL(1978, invaderl, invaders, invaders, sicv, driver_device, 0, ROT270, "Taito / Logitec", "Space Invaders (Logitec)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // unclassified, licensed or bootleg? +GAMEL(1978, spcewars, invaders, spcewars, spcewars, driver_device, 0, ROT270, "Taito / Sanritsu", "Space War (Sanritsu)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_invaders ) // unclassified, licensed or bootleg? +GAMEL(1978, spceking, invaders, invaders, sicv, driver_device, 0, ROT270, "Taito / Leijac Corporation", "Space King", MACHINE_SUPPORTS_SAVE, layout_invaders ) // unclassified, licensed or bootleg? +GAMEL(1979, cosmicmo, invaders, cosmicmo, cosmicmo, driver_device, 0, ROT270, "Taito / Universal", "Cosmic Monsters (version II)", MACHINE_SUPPORTS_SAVE, layout_cosmicm ) // unclassified, licensed or bootleg? +GAMEL(1979, cosmicm2, invaders, cosmicmo, cosmicmo, driver_device, 0, ROT270, "Taito / Universal", "Cosmic Monsters 2", MACHINE_SUPPORTS_SAVE, layout_cosmicm ) // unclassified, licensed or bootleg? +GAMEL(1980?,sinvzen, invaders, invaders, sinvzen, driver_device, 0, ROT270, "Taito / Zenitone-Microsec Ltd.", "Super Invaders (Zenitone-Microsec)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // unclassified, licensed or bootleg? +GAMEL(1980, ultrainv, invaders, invaders, sicv, driver_device, 0, ROT270, "Taito / Konami", "Ultra Invaders", MACHINE_SUPPORTS_SAVE, layout_invaders ) // unclassified, licensed or bootleg? +GAMEL(1978, spaceatt, invaders, invaders, sicv, driver_device, 0, ROT270, "bootleg (Video Games GmbH)", "Space Attack (bootleg of Space Invaders)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(1978, spaceattbp, invaders, invaders, sicv, driver_device, 0, ROT270, "bootleg (Video Games GmbH)", "Space Attack (bproms)(bootleg of Space Invaders)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(1978, spaceatt2k, invaders, invaders, sicv, driver_device, 0, ROT270, "bootleg (Video Games GmbH)", "Space Attack (2k roms)(bootleg of Space Invaders)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(1978, cosmicin, invaders, invaders, sicv, driver_device, 0, ROT270, "bootleg", "Cosmic Invaders (bootleg of Space Invaders)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(1978, galmonst, invaders, invaders, sicv, driver_device, 0, ROT270, "bootleg (Laguna S.A.)", "Galaxy Monsters (Laguna S.A. Spanish bootleg of Space Invaders)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(1980, spaceat2, invaders, invaders, spaceat2, driver_device, 0, ROT270, "bootleg (Video Games UK)", "Space Attack II (bootleg of Super Invaders)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // bootleg of Zenitone-Microsec Super Invaders +GAMEL(1979, spacecom, invaders, spacecom, spacecom, _8080bw_state, spacecom, ROT270, "bootleg", "Space Combat (bootleg of Space Invaders)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_spacecom ) +GAME( 1978, spacerng, invaders, spacerng, sitv, driver_device, 0, ROT90, "bootleg (Leisure Time Electronics)", "Space Ranger (bootleg of Space Invaders)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // many modifications +GAMEL(19??, invasion, invaders, invaders, invasion, driver_device, 0, ROT270, "bootleg (Sidam)", "Invasion (Sidam)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(19??, invasiona, invaders, invaders, invasion, driver_device, 0, ROT270, "bootleg", "Invasion (bootleg set 1, normal graphics)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // has Sidam replaced with 'Ufo Monster Attack' and standard GFX +GAMEL(19??, invasionb, invaders, invaders, invasion, driver_device, 0, ROT270, "bootleg", "Invasion (bootleg set 2, no copyright)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(19??, invasionrz, invaders, invaders, invasion, driver_device, 0, ROT270, "bootleg (R Z SRL Bologna)", "Invasion (bootleg set 3, R Z SRL Bologna)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING, layout_invaders ) +GAMEL(19??, invasionrza,invaders, invaders, invasion, driver_device, 0, ROT270, "bootleg (R Z SRL Bologna)", "Invasion (bootleg set 4, R Z SRL Bologna)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING, layout_invaders ) +GAMEL(19??, invadersem, invaders, invaders, sitv, driver_device, 0, ROT270, "Electromar", "Space Invaders (Electromar, Spanish)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // possibly licensed +GAMEL(1978, superinv, invaders, invaders, superinv, driver_device, 0, ROT270, "bootleg", "Super Invaders (bootleg set 1)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // not related to Zenitone-Microsec version +GAMEL(1978, sinvemag, invaders, invaders, sinvemag, driver_device, 0, ROT270, "bootleg (Emag)", "Super Invaders (bootleg set 2)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // not related to Zenitone-Microsec version +GAMEL(1980, searthin, invaders, invaders, searthin, driver_device, 0, ROT270, "bootleg (Competitive Video)", "Super Earth Invasion (set 1)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(1980, searthina, invaders, invaders, searthin, driver_device, 0, ROT270, "bootleg (Competitive Video)", "Super Earth Invasion (set 2)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(1980, searthie, invaders, invaders, searthin, driver_device, 0, ROT270, "bootleg (Electrocoin)", "Super Earth Invasion (set 3)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(19??, alieninv, invaders, invaders, alieninv, driver_device, 0, ROT270, "bootleg (Margamatics)", "Alien Invasion", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(19??, alieninvp2, invaders, invaders, searthin, driver_device, 0, ROT270, "bootleg", "Alien Invasion Part II", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(1979, jspecter, invaders, invaders, jspecter, driver_device, 0, ROT270, "bootleg (Jatre)", "Jatre Specter (set 1)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(1979, jspecter2, invaders, invaders, jspecter, driver_device, 0, ROT270, "bootleg (Jatre)", "Jatre Specter (set 2)", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAMEL(1978, spacewr3, invaders, spcewars, sicv, driver_device, 0, ROT270, "bootleg", "Space War Part 3", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_invaders ) // unrelated to Sanritsu's version? +GAMEL(1978, invader4, invaders, invaders, sicv, driver_device, 0, ROT270, "bootleg", "Space Invaders Part Four", MACHINE_SUPPORTS_SAVE, layout_invaders ) +GAME( 1978, darthvdr, invaders, darthvdr, darthvdr, driver_device, 0, ROT270, "bootleg", "Darth Vader (bootleg of Space Invaders)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAMEL(19??, tst_invd, invaders, invaders, sicv, driver_device, 0, ROT0, "", "Space Invaders Test ROM", MACHINE_SUPPORTS_SAVE, layout_invaders ) + +// other Taito +GAME( 1979, invadpt2, 0, invadpt2, invadpt2, driver_device, 0, ROT270, "Taito", "Space Invaders Part II (Taito)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1979, invadpt2br, invadpt2, invadpt2, invadpt2, driver_device, 0, ROT270, "Taito do Brasil", "Space Invaders Part II (Brazil)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1980, invaddlx, invadpt2, invaders, invadpt2, driver_device, 0, ROT270, "Taito (Midway license)", "Space Invaders Deluxe", MACHINE_SUPPORTS_SAVE ) +GAME( 1979, moonbase, invadpt2, invadpt2, invadpt2, driver_device, 0, ROT270, "Taito / Nichibutsu", "Moon Base (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // this has a 'Taito Corp' string hidden away in the rom - how do you get it to display? +GAME( 1979, moonbasea, invadpt2, invadpt2, invadpt2, driver_device, 0, ROT270, "Taito / Nichibutsu", "Moon Base (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // this has the same string replaced with Nichibutsu, no other differences + +GAME( 1980, spclaser, 0, invadpt2, spclaser, driver_device, 0, ROT270, "Taito", "Space Laser", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1980, intruder, spclaser, invadpt2, spclaser, driver_device, 0, ROT270, "Taito (Game Plan license)", "Intruder", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1980, laser, spclaser, invadpt2, spclaser, driver_device, 0, ROT270, "bootleg (Leisure Time Electronics)", "Astro Laser (bootleg of Space Laser)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1979, spcewarl, spclaser, invadpt2, spclaser, driver_device, 0, ROT270, "Leijac Corporation", "Space War (Leijac Corporation)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // Taito's version is actually a spin-off of this? + +GAME( 1979, lrescue, 0, lrescue, lrescue, driver_device, 0, ROT270, "Taito", "Lunar Rescue", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1979, grescue, lrescue, lrescue, lrescue, driver_device, 0, ROT270, "Taito (Universal license?)", "Galaxy Rescue", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1980, mlander, lrescue, lrescue, lrescue, driver_device, 0, ROT270, "bootleg (Leisure Time Electronics)", "Moon Lander (bootleg of Lunar Rescue)", MACHINE_SUPPORTS_SAVE ) +GAME( 1979, lrescuem, lrescue, lrescue, lrescue, driver_device, 0, ROT270, "bootleg (Model Racing)", "Lunar Rescue (Model Racing bootleg, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1979, lrescuem2, lrescue, lrescue, lrescue, driver_device, 0, ROT270, "bootleg (Model Racing)", "Lunar Rescue (Model Racing bootleg, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1979, desterth, lrescue, lrescue, lrescue, driver_device, 0, ROT270, "bootleg", "Destination Earth (bootleg of Lunar Rescue)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAMEL( 1980,escmars, lrescue, escmars, lrescue, driver_device, 0, ROT270, "bootleg", "Escape from Mars (bootleg of Lunar Rescue)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_escmars ) + +GAME( 1979, schaser, 0, schaser, schaser, driver_device, 0, ROT270, "Taito", "Space Chaser (set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1979, schasera, schaser, schaser, schaser, driver_device, 0, ROT270, "Taito", "Space Chaser (set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1979, schaserb, schaser, schaser, schaser, driver_device, 0, ROT270, "Taito", "Space Chaser (set 3)", MACHINE_SUPPORTS_SAVE ) +GAME( 1979, schaserc, schaser, schaser, schaser, driver_device, 0, ROT270, "Taito", "Space Chaser (set 4)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS ) +GAME( 1979, schasercv, schaser, schasercv, schasercv, driver_device, 0, ROT270, "Taito", "Space Chaser (CV version - set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS ) +GAME( 1979, schaserm, schaser, schaser, schaserm, driver_device, 0, ROT270, "bootleg (Model Racing)", "Space Chaser (Model Racing bootleg)", MACHINE_SUPPORTS_SAVE ) // on original Taito PCB, hacked to be harder? + +GAME( 1979, sflush, 0, sflush, sflush, driver_device, 0, ROT270, "Taito", "Straight Flush", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL) + +GAME( 1980, lupin3, 0, lupin3, lupin3, driver_device, 0, ROT270, "Taito", "Lupin III (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1980, lupin3a, lupin3, lupin3a, lupin3a, driver_device, 0, ROT270, "Taito", "Lupin III (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) + +GAME( 1980, polaris, 0, polaris, polaris, driver_device, 0, ROT270, "Taito", "Polaris (Latest version)", MACHINE_SUPPORTS_SAVE ) +GAME( 1980, polarisa, polaris, polaris, polaris, driver_device, 0, ROT270, "Taito", "Polaris (First revision)", MACHINE_SUPPORTS_SAVE ) +GAME( 1980, polariso, polaris, polaris, polaris, driver_device, 0, ROT270, "Taito", "Polaris (Original version)", MACHINE_SUPPORTS_SAVE ) +GAME( 1981, polarisbr, polaris, polaris, polaris, driver_device, 0, ROT270, "Taito do Brasil", "Polaris (Brazil)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1980, ballbomb, 0, ballbomb, ballbomb, driver_device, 0, ROT270, "Taito", "Balloon Bomber", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) /* missing clouds */ + +GAME( 1980, indianbt, 0, indianbt, indianbt, driver_device, 0, ROT270, "Taito", "Indian Battle", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1983, indianbtbr, indianbt, indianbtbr,indianbtbr,driver_device, 0, ROT270, "Taito do Brasil", "Indian Battle (Brazil)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) + +GAME( 1980, steelwkr, 0, steelwkr, steelwkr, driver_device, 0, ROT0 , "Taito", "Steel Worker", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) + +GAMEL(1980?,galactic, 0, invaders, galactic, driver_device, 0, ROT270, "Taito do Brasil", "Galactica - Batalha Espacial", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_galactic ) +GAMEL(1980?,spacmiss, galactic, invaders, galactic, driver_device, 0, ROT270, "bootleg?", "Space Missile - Space Fighting Game", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_galactic ) + +// Misc. manufacturers +GAME( 1979, galxwars, 0, invadpt2, galxwars, driver_device, 0, ROT270, "Universal", "Galaxy Wars (Universal set 1)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1979, galxwars2, galxwars, invadpt2, galxwars, driver_device, 0, ROT270, "Universal", "Galaxy Wars (Universal set 2)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1979, galxwarst, galxwars, invadpt2, galxwars, driver_device, 0, ROT270, "Universal (Taito license?)", "Galaxy Wars (Taito?)" , MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // Copyright not displayed +GAME( 1979, starw, galxwars, invaders, galxwars, driver_device, 0, ROT270, "bootleg", "Star Wars (bootleg of Galaxy Wars, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1979, starw1, galxwars, starw1, galxwars, driver_device, 0, ROT270, "bootleg (Yamashita)", "Star Wars (bootleg of Galaxy Wars, set 2)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1979, cosmo, 0, cosmo, cosmo, driver_device, 0, ROT90, "TDS & MINTS", "Cosmo", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) + +GAME( 1980?,invrvnge, 0, invrvnge, invrvnge, driver_device, 0, ROT270, "Zenitone-Microsec Ltd.", "Invader's Revenge (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND ) // copyright is either late-1980, or early-1981 +GAME( 1980?,invrvngea, invrvnge, invrvnge, invrvnge, driver_device, 0, ROT270, "Zenitone-Microsec Ltd.", "Invader's Revenge (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND ) +GAME( 1980?,invrvngeb, invrvnge, invrvnge, invrvnge, driver_device, 0, ROT270, "Zenitone-Microsec Ltd.", "Invader's Revenge (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND ) +GAME( 1980?,invrvngedu, invrvnge, invrvnge, invrvnge, driver_device, 0, ROT270, "Zenitone-Microsec Ltd. (Dutchford license)", "Invader's Revenge (Dutchford, single PCB)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND ) +GAME( 1980?,invrvngegw, invrvnge, invrvnge, invrvnge, driver_device, 0, ROT270, "Zenitone-Microsec Ltd. (Game World license)", "Invader's Revenge (Game World, single PCB)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND ) + +GAME( 1980, vortex, 0, vortex, vortex, _8080bw_state, vortex, ROT270, "Zilec Electronics", "Vortex", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) /* Encrypted 8080/IO */ + +GAME( 1979, rollingc, 0, rollingc, rollingc, driver_device, 0, ROT270, "Nichibutsu", "Rolling Crash / Moon Base", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) + +GAME( 1979, ozmawars, 0, invadpt2, ozmawars, driver_device, 0, ROT270, "SNK", "Ozma Wars (set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1979, ozmawars2, ozmawars, invadpt2, ozmawars, driver_device, 0, ROT270, "SNK", "Ozma Wars (set 2)", MACHINE_SUPPORTS_SAVE ) /* Uses Taito's three board color version of Space Invaders PCB */ +GAME( 1979, ozmawarsmr, ozmawars, invaders, ozmawars, driver_device, 0, ROT270, "bootleg (Model Racing)", "Ozma Wars (Model Racing bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1979, spaceph, ozmawars, invaders, spaceph, driver_device, 0, ROT270, "bootleg? (Zilec Games)", "Space Phantoms (bootleg of Ozma Wars)", MACHINE_SUPPORTS_SAVE ) +GAME( 1979, solfight, ozmawars, invaders, ozmawars, driver_device, 0, ROT270, "bootleg", "Solar Fight (bootleg of Ozma Wars)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1979, yosakdon, 0, yosakdon, yosakdon, driver_device, 0, ROT270, "Wing", "Yosaku To Donbei (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1979, yosakdona, yosakdon, yosakdon, yosakdon, driver_device, 0, ROT270, "Wing", "Yosaku To Donbei (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) + +GAMEL(1979, shuttlei, 0, shuttlei, shuttlei, driver_device, 0, ROT270, "Omori Electric Co., Ltd.", "Shuttle Invader", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_shuttlei ) + +GAMEL(1979, skylove, 0, shuttlei, skylove, driver_device, 0, ROT270, "Omori Electric Co., Ltd.", "Sky Love", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_shuttlei ) + +GAME (1978, claybust, 0, claybust, claybust, driver_device, 0, ROT0, "Model Racing", "Claybuster", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND ) // no titlescreen, Claybuster according to flyers + +GAMEL(1980, gunchamp, 0, claybust, gunchamp, driver_device, 0, ROT0, "Model Racing", "Gun Champ", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND, layout_gunchamp ) // no titlescreen, Gun Champ according to original cab + +GAME( 1980?,astropal, 0, astropal, astropal, driver_device, 0, ROT0, "Sidam?", "Astropal", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) + +GAMEL(1979?,attackfc, 0, attackfc, attackfc, _8080bw_state, attackfc, ROT0, "Electronic Games Systems", "Attack Force", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND, layout_attackfc ) + +GAME( 2002, invmulti, 0, invmulti, invmulti, _8080bw_state, invmulti, ROT270, "hack (Braze Technologies)", "Space Invaders Multigame (M8.03D)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 2002, invmultim3a,invmulti, invmulti, invmulti, _8080bw_state, invmulti, ROT270, "hack (Braze Technologies)", "Space Invaders Multigame (M8.03A)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 2002, invmultim2c,invmulti, invmulti, invmulti, _8080bw_state, invmulti, ROT270, "hack (Braze Technologies)", "Space Invaders Multigame (M8.02C)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 2002, invmultim2a,invmulti, invmulti, invmulti, _8080bw_state, invmulti, ROT270, "hack (Braze Technologies)", "Space Invaders Multigame (M8.02A)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 2002, invmultim1a,invmulti, invmulti, invmulti, _8080bw_state, invmulti, ROT270, "hack (Braze Technologies)", "Space Invaders Multigame (M8.01A)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 2002, invmultit3d,invmulti, invmulti, invmulti, _8080bw_state, invmulti, ROT270, "hack (Braze Technologies)", "Space Invaders Multigame (T8.03D)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 2002, invmultis3a,invmulti, invmulti, invmulti, _8080bw_state, invmulti, ROT270, "hack (Braze Technologies)", "Space Invaders Multigame (S0.83A)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 2002, invmultis2a,invmulti, invmulti, invmulti, _8080bw_state, invmulti, ROT270, "hack (Braze Technologies)", "Space Invaders Multigame (S0.82A)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 2002, invmultis1a,invmulti, invmulti, invmulti, _8080bw_state, invmulti, ROT270, "hack (Braze Technologies)", "Space Invaders Multigame (S0.81A)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 2002, invmultip, invmulti, invmulti, invmulti, _8080bw_state, invmulti, ROT270, "hack (Braze Technologies)", "Space Invaders Multigame (prototype)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +Contact GitHub API Training Shop Blog About +© 2017 GitHub, Inc. Terms Privacy Security Status Help \ No newline at end of file diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/ballbomb.zip b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/ballbomb.zip new file mode 100644 index 00000000..74f170d9 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/ballbomb.zip differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bin2hex.exe b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bin2hex.exe new file mode 100644 index 00000000..443395a5 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bin2hex.exe differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bomb1.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bomb1.hex new file mode 100644 index 00000000..46f817dd --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bomb1.hex @@ -0,0 +1,322 @@ +:020000040000FA +:20000000000000C318000000FBC9000000000000E5D5C5F5C3D804FF310024CD7601060090 +:20002000CDBC04CDC504CDD004CD4C00FBAFD303D305CDBC00CDBB01CDC100CD2401CD012B +:2000400001CDBB01CD5500D306C32D00213C09CD7B1AC3351BCDBA04CDC504212F2034216A +:20006000E02034CD521A2E060612702E0A702E0E702E12702E16702E1A70213520AFBEC242 +:20008000A500CD940021542034CDDB16CD1812D306C37A00211420AFBEC03A0120E67FC0C4 +:2000A00023233601C9CD9A1821E0203600CDBA04CDC504C3C1003EFF32DF20C9AF32DF2068 +:2000C000C93E50C3D51421052611D700010801CDD5010617C360023C4299A5A581423C1B7F +:2000E000212928201B130008130E1B020E110F0E110013080E0D010E0C0104113E20C3D550 +:2001000014CDBB01CDC600CDFC0021112C060C111801CD6002C3C100080D120411131B1B14 +:20012000020E080D11A02021A0460615CD8B03CD821721AA20343AAA20A7D306C23601CD7D +:20014000FC00210C2E11F6000606CD6002CDC100CDC60011A0202181180615CD8B03CD8295 +:200160001721AA20343AAA20A7D306C265013E80CDD514C37601210024AF77237CFE40DACD +:200180007901C9211E2511E043061ACD6002211D2611C320CDB101211D3011DC20CDB10164 +:2001A0003ADA20A7CAB001211D3911C620CDB101C922D620EB22D420C3A302CD7601CD831E +:2001C00001CD2303CD150321022401E0013E7FC38D08012003C5E51A77231305C2D701E1F3 +:2001E00001200009C10DC2D501C921B00411D8200602C38B0321B204C3ED0121E62046B0CA +:20020000D30377C921E620462FA0D30377C921E52046B0D30577C921E520462FA0D30577B8 +:20022000C921C3203AD8206F2B2B22C920060311DC20AF1ABEDA410296C0231305C23302AD +:20024000C906032AC92011DC207E12231305C24902211D3022D6202AC92022D420C3A302BD +:20026000D51ACD2E03CD4503D11305C26002C921C22011C5203AD8205FCDE102132306032D +:20028000CD8B0321C020110300C364033AE420A7C8CD6F0221D8207E3D3D2ED4772ED97ECA +:2002A0002ED7772AD4207E2322D420E60FCDD1020602C52AD4207EF5E6F00F0F0F0FCDD14A +:2002C00002F1E60FCDD10221D42034C105C2B202C9C620CD2E032AD620CD450321D72034E3 +:2002E000C90603AF1A8E27772B1B05C2E402C91A7713231A77132323237EFEFFC2EF02C9B0 +:200300000606C57D12137C1201000609131313C105C20203C93AE720C620CD2E0321013EB8 +:20032000C3450321013711B4040606C36002119403A7C8E5210000C5010500093DC2380334 +:2003400019EBC1E1C9C50605D306C51A07771301200009C105C24803AF7701200009770948 +:200360007709C1C9AF77231BBAC26503BBC26503C97DE607D302C506037C1F677D1F6F055E +:20038000C279037CE63FF62067C1C97E12231305C28B03C91F2444241F7F494949363E41BA +:2003A0004141227F4141413E7F494949417F484848403E414145477F0808087F00417F4184 +:2003C00000020101017E7F081422417F010101017F2018207F7F1008047F3E4141413E7FEB +:2003E000484848303E4145423D7F484C4A31324949492640407F40407E0101017E7C0201F4 +:20040000027C7F020C027F631408146360100F1060434549516100000303000000000000E2 +:20042000101010101022147F1422081422410000412214083E4549513E00217F010023451F +:2004400049493142414959660C14247F04725151514E1E2949494640474850603649494925 +:20046000363149494A3C141414141401020408100000000000181818181800001818000FC3 +:200480001412071B0E0D0B181B211B0F0B00180411121B011413130E0D1B211B0E111B2202 +:2004A0001B0F0B00180411121B011413130E0D00C526C83902110403081306C021004611F8 +:2004C0000020C38B030650110021210047C38B030650110022C3CA04210020352334CDECCA +:2004E00013DB010FDA280521E8207EA7CA03052B7EFE09D2FF04C6012732E720CD1503AF97 +:2005000032E8203ADF20A7C222053AE420A7C2D3083AE720A7C22D053AE020A7C2D308CD2F +:200520003D17F1C1D1E1FBC93E01C300053A0220A7C222053E01320220310024FBCDB600E6 +:2005400021E02036002EAA3600CDBB01211330117F040604CD60023AE7203DD306211127CC +:200560000616C2A707118304CD6002D306DB01E604CA57050699AF32DA203AE720802732CF +:20058000E720CD150321C320110600CD6403CDBA04CDC504CDD004CDBB01212F20342EE41F +:2005A00034CDBC0021010122E920CD181ACD0D193E20CDFB01CDB600CD2A1ACD0E06CDBC19 +:2005C00000CD781ACD1812D306CD6B07CDA11A213520AFBEC24806CDE618CDFB18CDF218B0 +:2005E000CD0419CDE905C3C4052E24CD521A7EFE03219B20D2FA053600C93601CD07137E78 +:200600000F0F014000DAFE1201C0FFC3FE120607C5CD521A211E25D21C062638013801CD36 +:2006200024143E08CDD514CD521A11F343211E38DA380611E04326250607CD60023E08CDA9 +:20064000D514C105C21006C9CDB600E5CD4C00CD0D19E1CD9A183ADA20A7C29106CD441A17 +:2006600035CA7A07CD7A06CDBA04CDBB01212F2034CDFC00CDBC00C3B5057E3D210125CA5A +:20068000880624243DC28206011001CD8C08C3C100CDB6003ADB200FDAC806CD441A35C275 +:2006A000F506CD5D072107303E21CD2E03CD4503CD2102CDC10021DB203601CD441AA7C2DF +:2006C0000407CD1E14C37D07CD441A35C24607CD5D072107303E22CD2E03CD4503CD21026E +:2006E000CDC10021DB203600CD441AA7C23807CD1E14C37D07CD7A0621DB203601CD441A36 +:20070000A7CA3E07CDF501CD1E14CD1607CDEF12CDB600C367063ADB200FDA3307AF21E5E9 +:200720002077F3D305060A0E000DC2290705C22707FBC93E20C31E07CDEA01C3070721DBB6 +:20074000203600C33807CD7A0621DB203600CD441AA7C2380721DB203601C304072107285E +:2007600011D4440614CD6002C3FC00CD521A2E257EFE02D82154203601C9CD2102210000C0 +:2007800022DA2022E42022E52022E92021DA20360121142D11DF440609CD60023E80CDD53F +:2007A00014CDEA01C32D00119904CD6002DB010F0FDABB070FDA7405C357053E010698C3E9 +:2007C0007705210520AFBEC8CD77082207202A09200160000922092044210B20AFBEC2E7DF +:2007E0000778FE2BD2320823AFBEC2F30778FE31D24D0823AFBEC2FF0778FE37D25B0823CE +:20080000AFBEC20B0878FE3ED2690878FE3CDA25082A0920011E02CD8C0821052036002174 +:20082000BF203600C92A0720EB2A0920011E02C3D50136FF210521CDA008EB2E06CD521A48 +:20084000E5C10A6F030A67CDD201C3250836FF210921CDA008EB2E0AC33D0836FF210D21D1 +:20086000CDA008EB2E0EC33D0836FF211121CDA008EB2E12C33D08210620347EE601C2857D +:2008800008217240C9213640C9012003AFC5E5772305C28F08E101200009C10DC28D08C9E6 +:2008A0007E211D413DC811600019C3A408AF7C1F577D1FE6F00F0F0F0F5F7AE60F0707070B +:2008C00007B3C911DD430602C3AD0E11DD430602C39A19CD3814CD5314CD4010CD4209CDE0 +:2008E000F808CD65093AE420A7CA2205CD891ACD1309CD351BC32205211F207EA7C84636BE +:20090000002124207E0FD036002A2220EB213820C30D0ACD521A2E247EFE03D821BF20AFA4 +:20092000BEC034213509C37B1A000007070100010006060100000004040100000200010124 +:2009400001003AE420A7C82138207EFEFFCA60090FD259093E10C30E0223232323C34A09BC +:200960003E10C31702210420347EE60377A7CA2819FE01CA3819FE02CA6619FE03CA851978 +:20098000C9213820CD210A213C20CD210A119D20CDDF09CD0713CD6A0AC3D909214020CD0A +:2009A000210A214420CD210A119E20CDDF092E0CCD521ACD6A0ACDD909C31515214820CD65 +:2009C000210A214C20CD210A119F20CDDF092E14CD521ACD6A0AC3D909219C203600C92184 +:2009E0009B207EA7CAEB09233600C9EB347EFE02D2F809EB2336FFC93600EB233600C95721 +:200A00003A9C20A77AC20A0A37C9373FC9783DCA190A23232323C30E0A360123237323721C +:200A2000C97E0FD02323E5CD6C11CD5B0AE1E5CD6C117DFE18DA480A01F9FF09EBE17323B6 +:200A400072EB11DA43C3CF0EE1E5CD6C1122B720E12BAF772B7721B52034C911DA43C3ABFF +:200A60000E7CB537C87B957A9CC9E57E4707D28A0A2323CD150B780F0F7AD2DA0AFE4BDA16 +:200A8000A10A3625E1E53EDFA67721372034E1232323233A3720FE02DA6A0A2137203600AA +:200AA000C9FE3CD2CC0A780FE1E5237E234E23462B2BDA2F0BCDFF09D2BF0A3DCA230B773D +:200AC000CDA108EB6069CDD201C38A0AE1E5CD030BE1E57E0F0F0FC38A0A2B2B2BFE25DA0E +:200AE000EE0AFE3CDAFB0A7E0F0F0FC38A0ACD080BE1E52323233648C38A0A463EDFA6777F +:200B0000C3A60A7E070707D83E20B67723235E2356EBC38908E55E23562A282119EBE17389 +:200B20002372C936012B3E01B6773E01C3C00ACDFF09D2BF0A3CFE08DABF0A36072B3EFEC4 +:200B4000A6773E07C3C00ACD560BCDAB0BCDD60BCD4015C32716AF21B520BEC823347EFE27 +:200B600001CA010CFE04CA070CFE07D8113C44CD0A0CCDE01521B820D2810BCD9B0BC3849A +:200B80000BCD8B0B21000022B520C9AF3A3420BED87E217D20BED877C30D16AF3A3420BE09 +:200BA000D07E217F20BED077C3ED15AF211D20BEC823347EFE01CA160CFE04CA1C0CFE0711 +:200BC000D82A2220CD7603011002CD8C08210000221D20C37D15AF212720BEC823347EFED2 +:200BE00001CA2B0CFE04CA470CFE07D82A2D20011002CD8C08210000222720CD6F1AC37DEC +:200C000015110C44C30A0C1124442AB720CD7603010C02C3D501115444C31F0C1174442A93 +:200C20002220CD7603011002C3D5012A292011DA43CDAD0E2A2920CD7603222D2011944446 +:200C4000011002CDD501C92A2D2011B444C3400C3AE420A7C83ADB200FDB01D0DB02C92122 +:200C60002F20AFBEC823BEC26E0C34CDE40C3AE420A7C29D0C2AE2203AE1203C32E120E6D6 +:200C80000FC28B0C7DFE13CC9A0C2322E2207E0FDA060D0FDA230DC3A90C2E00C9CD500C7A +:200CA0000707DA060D07DA230D060021322070CDE40C213120CDA10D2A332011BE43010203 +:200CC0000ECD7103C5E51AA6CAD00C3E013235201AAE7723130DC2C60CE101200009C10508 +:200CE000C2C40CC92A332011BE4301020ECD7103C5E51AAE7723130DC2F20CE101200009C1 +:200D0000C105C2F00CC93A3420FEDAD2A90C2A332001F80F09CD76037EFE7FC2A90C06024B +:200D2000C3AB0C3A3420FE38DAA90C2A332001F8FC09CD76037EFE7FC2A90C06FEC3AB0C35 +:200D400023235E237EC60257EBCDAD08577DE61F0707075FEBC9215420AFBEC823BEC273E1 +:200D60000D3423BE2100FD22582021C8D0C41A0E225A203A5620A7215B207EC2AD0DFE2845 +:200D8000DAC90D21572034E60121AE40CCC10D225C20215A20CDF00DCD020ECD240E2158EF +:200DA000204E23462379867723788677C9FED0D2C90D21572034E601213640CCC50DC38FB2 +:200DC0000D21E540C9217240C92A5A20011B02CD7603CD8C08060C215446115420CD8B0345 +:200DE000211320347EE6012156203601C03600C9E523235E2356234E2346E1D55E2356EB25 +:200E0000D1C9CD7603C5E51A7723130DC2070EE101200009C105C2050EC921000322582070 +:200E200021C828C93A5620A7C2A10ECD350ED60AB8DA3D0EC92A3420443A0A20C921B0209A +:200E4000AFBECA470E35C9E5CD4B1A237EFE040650D2560E0660E170FE0BD27A0EFE09CDD4 +:200E6000521A2E247EFE04D28F0E216020342E67342E6E342195203600C921FB03226320BE +:200E800021FA02226A2021FBFA227120C36A0E21FC0222632021FB01226A2021FBFDC38993 +:200EA0000ECD350EC608B8D23D0EC90603CD7103C5E51AD304DB032FA6772313AFD304DB02 +:200EC000032FA677E101200009C105C2B00EC90603CD7103C5E51AD304DB03AE772313AFDC +:200EE000D304DB03AE77E101200009C105C2D40EC9216020AFBEC823BEC2FE0E35C923BE76 +:200F0000C20A0F34CD330F226520CD3B0F2166207EFE30DC460FFEE8D4530F2B7EFE18DABC +:200F20005E0F216320CDA10D2A652011DA0F0608C3D10E2A5A2001000809C92A652011DAB3 +:200F40000F0608C3AD0EF5E52A6520CD3E0FE136E0F1C9E52A6520CD3E0FE13634C9CD3BD8 +:200F60000F2160461160200607C38B03216720AFBEC823BECA790F35C923BEC2850F34CD66 +:200F8000330F226C202A6C20CD3E0F216D207EFE30DCBC0FFEE8D4C40F2B7E47CD521A2EAC +:200FA000247EFE050E13D2AB0F0E1878B9DACB0F216A20CDA10D2A6C20C32B0FF5E52A6C8B +:200FC00020C3570FE52A6C20C34B0F2A6C20CD3E0F216746116720C3670F60F0F0F0F06021 +:200FE0009090216E20AFBEC823BECAEF0F35C923BEC2FB0F34CD330F2273202A7320CD3ED9 +:201000000F2174207EFE30DC2210FEE8D42A102B7EFE18DA3110217120CDA10D2A7320C3D7 +:201020002B0FF5E52A7320C34B0FE52A7320C3570F2A7320CD3E0F216E46116E20C3670F73 +:20104000211120AFBEC83600211420342100002216202A1A20CDC308216020AFBECAB0103D +:20106000216520CD8F10D46C10C3B010CD9610DA7310C9CD9D10D27A10C9CDA910DA811062 +:20108000C9E12A652022932021912034C35E0F3A1A20C608BEC9F53E1086C3A5103A1B206D +:2010A00023F57ED60847F1B8C9F53E1086C3A510216720AFBECAE710216C20CD8F10D4C43B +:2010C00010C3E710CD9610DACB10C9CD9D10D2D210C9CDA910DAD910C9E12A6C20229320E0 +:2010E00021912034C3CB0F216E20AFBECA1E11217320CD8F10D4FB10C31E11CD9610DA02F8 +:2011000011C9CD9D10D20911C9CDA910DA1011C9E12A732022932021912034C331102138A6 +:20112000202275200E067EA7CA33112323CD8F10D444112A7520110400192275200DC2261D +:2011400011C37111CD9610DA4B11C9CD9D10D25211C9CDA910DA5911C9F12B2B2B3600CD47 +:201160006A1122292021272034C923235E2356EBC9CD07132277200E06E5211F2034E17EC7 +:2011800007DC9D112A7720110400192277200DC27911211F203600CDE214C37D15CD6A11C7 +:2011A0007CFE3CD0C5CD490D227920C12179203A1A20C60ABED2B911C9F53E208647F1B85B +:2011C000DAC411C93A1B2023F57ED60847F1B8D2D311C9F53E238647F1B8DADE11C9F1E50B +:2011E000211D20342A1A200100F6092222202A77207EE60F77CD6A11CD8908E12B3E05866F +:20120000473A1A20B8D20E12CD671AC30C1321242034CD5F1AC30C132E24CD521A7EFE066B +:20122000D22412C9E53A1D20A7D306C22512E13600CD0D19CD4C00217B203421004611007D +:20124000200631CD8B032135461135200646CD8B03218146118120063FCD8B032114203470 +:20126000CD1E14CD521A2E26347E470FDA71122B3478FE08CC1313FE0FCC1313CDAD12CD56 +:20128000071323235E23562109207323723E30CDD514210520347EA7D306C29612217B2003 +:2012A00036002E2F342E143600CD781AC9CD521A2E257EFE0BDABB123E037747FE07DAC36C +:2012C0001206063E18D60305C2C5124FCD07132323EB692627CD00032E25CD521A7E0F0F0E +:2012E00011E844DAE91211F844CD0713CDEF02CD07137E0F0F012000DAFE1201E0FF212833 +:2013000021712370C3BC002E04C3521A2E24CD521A34C9F53EFFCD04023E04CDFB01CDC1A2 +:20132000003E20CDFB01CD831ACDBC00CD69133E04CD04022E26CD521A7E0FDA49132112B2 +:20134000301114400604C3511321122D111840060ACD6002CDB600CD4C003E80CDD514CDE2 +:2013600092132130203600F1C9210324222D21211C40222F210E71C52A2D21CDBB13222D1A +:20138000212A2F21CDCF13222F21C10DC27713CDFC000E79211C33222D21210332222F217F +:2013A000C5AF2A2D21CDD113222D21AF2A2F21CDBD13222F21C10DC2A013C93EFF061AE59A +:2013C0007723CDE31305C2C013E111200019C93EFF061AE5772BCDE31305C2D413E111E0FB +:2013E000FF19C91E20D3061DC2E513C9DB02E604C83A0320A7C03100240604C5CD1E14C11E +:2014000005C2FB133E01320320CDB600FB1122402116300604CD6002CDC100C31800210345 +:201420002401DF1AC5E536002305C22614E111200019C10DC22414C9CD500CE610CA4D1484 +:20144000211420AFBEC023BEC0342334C92115203600C9211620AFBEC823BEC26914342AB6 +:20146000332001100509221A202A1A20CDC3082A1A203A5420A77DC28814FEE0D28D14C6F7 +:20148000036F221A20C3CB08FEC0C37C142A1A2022BD2021BB20342116461116200607C3B0 +:2014A0008B0321BB20AFBEC823BEC2BD14342ABD2011CD14010801CD7603C3D501AF772B92 +:2014C000772ABD20010801CD7603C38C08A95CBE7FFE7F7E953200203A0020A7D306C2D84F +:2014E00014C9218220AFBEC83A1A20D608218320BED0C612BED83A1B2023D603BED0C60937 +:20150000BED82A8320228D20CD5B0A2182203600218B2034C9218220AFBEC8235E2356EBC8 +:20152000E5CD5B0AE111F9FF192283207DFE18D2420A22872021852036FF2182203600C995 +:20154000218520AFBEC823347EFE01CA8315FE04C25915112444C38615FE07D8113C44CD16 +:201560008615210000228120228520CDE015218820D27A15CDE715C37D15CD0716211420DC +:201580003600C9110C442A8720CD7603010C02C3D501218B20AFBEC823347EFE01CACE15AA +:2015A000FE04C2AB1511B444C3D115FE07D82A8D20CD7603011002CD8C08210000228B2099 +:2015C0002181203600CD6F1ACDD715C37D151194442A8D20C38915CDE015DAED15C30D160A +:2015E000CD07137E0F0FC9AF3A3420BED0218020347EFE03DAFF1536003EE82B8677C9FE27 +:20160000023EF0DAFB15C9AF3A3420BED8217E20347EFE03DA1F1636003E152B8677C9FE1B +:20162000023E0DDA1B16C9219120AFBEC823347EFE01CABA16FE04CAC916FE07D8CDCF16DA +:20164000210000229120CD5F1A219520347EFE03D25E163E5032C220CD8C02C37D15CD88DA +:201660001621C1207078C620CD2E032A9320CD7603CD4503113404CD4503113404CD450392 +:201680002196203423360AC93A01200F0F06030FD806050FD806070FD80609C9219620AF66 +:2016A000BEC823BECAA91635C9CD8C02011801CDD2162196203600C37D151194442A9320EA +:2016C000CD7603011002C3D50111B444C3BD160110022A9320CD7603C38C08218120AFBEBD +:2016E000C0CD0713E57EFEFFC2ED16E1C907DAF916E123232323C3E416E1E5CD400D4D44E9 +:20170000CDE015217F20DA2F172E7D7EB8D2F116C604B8DAF116218320712378FE30DAF141 +:2017200016FEF0D2F1167021FFFF228120E1C97EB8D2F116C606B8DAF116C316173AAA2068 +:20174000A7C821A220CDF00DCD5D1721AE20357EA7C25717C3821721A020C3A10D7DE6079B +:20176000D302CD7603C5E51AD304DB03B6772313AFD304DB03B677E101200009C105C265E9 +:2017800017C92AA820EB1A2AAF202DCABA1722AF2032AE20131AE60F0701BF1726006F0922 +:2017A000E5C121A0200A7703230A77131A6F131A6722A220EB2322A820C9AF32AA20C90031 +:2017C000020202020002FE00FEFEFEFE00FE020102020102FF01FEFFFEFEFFFE01FF02FF0A +:2017E000FF2406D7301000D7300407D7500A06CF580405BC580407B4500A06AC5804059858 +:2018000058100090310C06D0380800D0380800D0380407D0480506C8500405BE4E0800B84A +:20182000380C06B0380800B0380407B0480506A85004059E4E080098380C0990590C0EA6F5 +:2018400067080098600B06A6780A0090780B06A6900A0090900C06A6A80A00A6A80C06A6FF +:20186000BC0B0090A80C06A6C00A00A6C00C06A6D40B0090C00C06A6D80C07A6D80C06A6C1 +:20188000F00000000092180104E117000000000017001E1E1E1EFFFFFFFF3600CDDC183EF1 +:2018A00004CDFB012A3320CD76030E05E5C511D019D50602C5E5011202CDD5013E05CDD5BD +:2018C00014E1C105C2B418D1C1E10DC2AC18011202CD8C08CDC1003E04C30402212F203604 +:2018E000002E143600C93A1720A73E02C2FB01C304023A1D20A73E01C3EC183A2720A73E3E +:2019000008C3EC183A9120A73E08C3EC183EDFCD04023EDFC317023AE420A7C83A5420A76E +:201920003E01C20E02C31702CD9519D8CD5F0CCD470BCD1719C39215CDC207CD9519D8CDF3 +:201940008109CDF10ECD4B19C3A214CD5A192134207E2E7FBED8C60877C92134207E2E7D65 +:20196000BED0D60877C9CD7919CD9519D8CD5F0CCD9C09CDDB16C36C0F3A0520A73E04C259 +:201980000E02C31702CD9519D8CDBC09CDE20FCD560DC39C163A7B200FC9CD7103C5E51A61 +:2019A000D304DB03A6CAAD193E01321120DB03AE772313AFD304DB03A6CAC1193E01321131 +:2019C00020DB03AE77E101200009C105C29D19C900000700000042000000150211498F0089 +:2019E000EF052F08D1211D20000017000911070007004700000221404910050000800108BD +:201A0000094007000300010049024944008009020040870802000300DB02E603212721F517 +:201A20008677F12E2726228677C9CD441A7E3DC84F210125112640C5011001CDD501C10D52 +:201A4000C2341AC9CD521A2E277EC9CD521A2E257EC93ADB200FDA5C1A2621C92622C93E12 +:201A60005032C220C38C023E0132C120C38C0221015022C120C38C02212909113621060681 +:201A8000C38B03212F09C37B1A211220AFBE3E10CA040235C3FB0121E9203ADB200FD02311 +:201AA000C9CD971AAFBEC8CD521A21C420D2B21A2EC77E0615B8D8CD441A34CD2A1ACD97DC +:201AC0001A36002112203650C9FEFFCA251BFEFECA1A1B213B213680237723EB215D1B8717 +:201AE0004F0600097E23666FC3F91A3A3B21A7C8213D2135C0EB2A3E217EA7CA251BFEFF23 +:201B0000CA141B12237E0608D3010705C2081B23223E21C93A3C21F2D31A3E01323D213E56 +:201B200080323B21C93EFF0608D3010705C2291BAF323B21C92139217E3D77C02B7E2377E7 +:201B4000237EA7C2491BC3EB1A3A3621CDC91AAF323A21C9AF3237213C323A21C908459C55 +:201B600045C645FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:202000000101000002020100010202020200000101000000060E0E03150411181B1B050804 +:202020000D0413080B1300000707021C8B778B1C020707000000000000000000003800F049 +:2020400000700030001800180018001C001C001C003E00BE00E0009C009C009C80B0C0ADF7 +:20206000C0DC009E009E001E00040038000000000000000000000000003800F00070003066 +:20208000001800180018001C001C001C003E00BE00E0009C009C009C80B0C0ADC0DC009E1D +:2020A000009E001E0004800300000000000000380004001E009E009EC0DCC0AD80B0009C72 +:2020C000009C009C00E000BE003E001C001C001C0018001800180030007000F00038000088 +:2020E000000000000080030004001E009E009EC0DCC0AD80B0009C009C009C00E000BE0054 +:202100003E001C001C001C0018001800180030007000F0003800000000000000000000001D +:20212000000000006000003000801B00C0FF00C06700C00B0000080000080000080000109B +:202140001E00103F00907F00E0FF00E0FF00E0FF00C0FF00C0FF00807F00003F00001E008C +:2021600000000000000000000000000000000000000000000000000000000000000000005F +:20218000000000000000000000000000000100800100800700800300F000007801007802D0 +:2021A0001E38043F38887F00D0FF00E0FF00E0FF00C0FF00C0FF00807F00003F00001E00E0 +:2021C0000000000000000000000000000000000000000000000000000000000000000000FF +:2021E000000000000000000000000000000000000000000000400000400200C00100C000DC +:202200001E40003FF0817F78C6FF78D8FF38E0FF38C0FF00C0FF00807F00003F00001E007C +:2022200000000000000000000000000000000000000000000000000000000000000000009E +:20224000000000000000000000000000000000000000000000000000000000240000340026 +:202260001E34003F3C807F3CC0FF18C0FFF8FFFF1CC0FF3CC0FF3C807F38003F10001E0014 +:2022800000000000000000000000000000000000000000000000000000000000000000003E +:2022A00000000000000000000000000000000000000000000000000000000000000000001E +:2022C0001E00003F00807F00C0FF00C0FF20E0FF24D8FF38C6FFB0817F60003FE0001EE000 +:2022E0000000E00100E00100C00100800100000000000000000000000000000000000000DA +:202300000000000000000000000000000000000000000000000000000000000000000000BD +:202320001E00003F00807F00C0FF00C0FF00E0FF00E0FF00D0FF40887F40043F40021EF814 +:202340000100E0000080030080070000070000070000000000000000000000000000000084 +:2023600000000000000000000000000000000000000000000000000000000000000000005D +:202380001E00003F00807F00C0FF00C0FF00E0FF00E0FF00E0FF00907F00103F00101E003A +:2023A0000800000800800500000B00000600C07F0000FB0000F00000000000000000150038 +:2023C0001F001F000600F2002DC0DE7FDE7F2DC0F20006001F001F001500DE3FDE7C7C7C79 +:2023E00012020E11041C211B1B07081C12020E11041B1B12020E11041C22000003300330C0 +:202400001D261D291D2F05231D2600007F040F0383400138110C01000101038C071A0F40CC +:202420000F209F0CFF001F000F2027000700130403000700130107201F007F007F003F008F +:202440000F000100030003000300030007000F003F007F000000000000010000A4040010D3 +:20246000C854E01BE0038C012012000C30110000000000000CC007F10F115600822108452C +:202480000A00A063B042400104000E704A7803310BC002000000000000008000A013C804B8 +:2024A000E0015007A01EC00BC0028810000000000000000002000010901C384821048C20F2 +:2024C000184008082400201C144868202201000B084300000F0B001804111B1E1B1F1B06FC +:2024E000000C041B0E150411C301C204C305C206C302C203FFFFFFFFC102C005C106C001C9 +:20250000C103C004FFFFFFFF02DD01FF01D702CC01FF01D702DD01FF01D702CC01FF01D77D +:2025200002DD02FF02E102FF06E102FF02DD01FF01D702CC01FF01D702DD01FF01D702CC0D +:2025400001FF01D702D202FF02DD02FF06B902FF02DD01FF01D702CC01FF01D702DD01FFF2 +:2025600001D702CC01FF01D702DD02FF02E102FF06E402FF02E602FF01E401E101DD01D9C6 +:2025800002D701FF01D202CC01FF01C902CC02FF02E602FF03CC06FFFF00000004D902D7B6 +:2025A00001FF01D901D201FF04D901DD01FF01DF01FF01E101FF01E201FF01E401FF02E641 +:2025C00007FFFF00000001FF000000000000000000000000000000000000000000000000F6 +:2025E0000000000000000000000000000000000000000000000000000000000000000000DB +:202600000000000000000000000000000000000000000000000000000000000000000000BA +:20262000000000000000000000000000000000000000001880000000000000000000000002 +:2026400000000000000000000000000000000000FFFFFFFF000000000000C8D00000021BC9 +:20266000000000FD000000000400FD000000000800FD00000000000000000000003000E83F +:2026800000000000000000000000000000000000000000000000000000000000000000003A +:2026A00000000000B1461002E11700000000002900030303000000000000000000000000E7 +:2026C00000000000000000000000000000001D251D381D2E00000000C5260100000000002C +:2026E00000000040000000000000000000000000000000000000000000000000000000009A +:20270000FFFFFFFFC3011827C204182DC3051833C2061839C302183FC2031845FFFFFFFF49 +:20272000000000000000000320000000000000000000000000000000000000000000000076 +:20274000000000000000000000000000000000000000000000000000000000000000000079 +:20276000000000000000000000000000000000000000000000000000000000000000000059 +:20278000000000000000000000000000000000000000000000000000000000000000000039 +:2027A000000000000000000000000000000000000000000000000000000000000000000019 +:2027C0000000000000000000000000000000000000000000000000000000000000000000F9 +:2027E0000000000000000000000000000000000000000000000000000000000000000000D9 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bomb2.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bomb2.hex new file mode 100644 index 00000000..23e160a7 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bomb2.hex @@ -0,0 +1,66 @@ +:020000040000FA +:200000000F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F00 +:200020000F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0FE0 +:200040000F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0FC0 +:200060000F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0FA0 +:200080000E0E0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0ECB +:2000A0000E0E0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0EAB +:2000C0000E0E0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0E8B +:2000E0000E0E0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0E6B +:200100000E0E0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0E4A +:200120000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0E30 +:200140000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0E10 +:200160000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0EF0 +:200180000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0ED0 +:2001A0000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0909BA +:2001C0000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F09099A +:2001E0000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F09097A +:200200000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F090959 +:200220000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F090939 +:200240000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F090919 +:200260000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0909F9 +:200280000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0909D9 +:2002A0000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0909B9 +:2002C0000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F090999 +:2002E0000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0D71 +:200300000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0D50 +:200320000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0D30 +:200340000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0D10 +:200360000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0DF0 +:200380000B0B0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0DD0 +:2003A0000F0F0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0DA8 +:2003C0000F0F0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0D88 +:2003E0000F0F0D0E0E090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0D68 +:200400000F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0FFC +:200420000F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0FDC +:200440000F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0FBC +:200460000F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F9C +:200480000D0D0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0ECA +:2004A0000D0D0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0EAA +:2004C0000D0D0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0E8A +:2004E0000D0D0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0E6A +:200500000D0D0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0E49 +:200520000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0E2D +:200540000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0E0D +:200560000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0EED +:200580000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0E0ECD +:2005A0000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0909B7 +:2005C0000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F090997 +:2005E0000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F090977 +:200600000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F090956 +:200620000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F090936 +:200640000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F090916 +:200660000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0909F6 +:200680000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0909D6 +:2006A0000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0909B6 +:2006C0000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F090996 +:2006E0000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0D6E +:200700000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0D4D +:200720000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0D2D +:200740000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0D0D +:200760000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0DED +:200780000B0B0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0DCD +:2007A0000F0F0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0DA5 +:2007C0000F0F0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0D85 +:2007E0000F0F0E0D0D090909090D0D0D0F0F0F0D0D0D0B0B0B0C0C0C0E0E0E0E090F0D0D65 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/boothill.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/boothill.hex new file mode 100644 index 00000000..c4374540 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/boothill.hex @@ -0,0 +1,258 @@ +:020000040000FA +:200000000000AFD303C31700F5C5D5E5C39A0E00F5C5D5E5C3B00EDB02E610CA620F060198 +:20002000110000210020D304707EA8CA3D004F7DE60179C23B00B257C33D00B35F237CFE19 +:2000400040C22600D3042B7CFE1FCA7A007EA8CA61004F7DE60179C25F00B257C36100B31B +:200060005F782F77AECA44004F7DE60179C27500B257C37700B35FC34400D304237CFE40D4 +:20008000CA9D00782FAECA98004F7DE60179C29600B257C39800B35FAF77C37A007807471F +:2000A000D223007AB3CACC00EBF91100200600210000390E10AF29DABB002F12133E0812DC +:2000C000130DC2B50005C2AF00C31A013100242100001100000E04AF86D304234779BC7879 +:2000E000C2D800E5211F0119BE3E40CAF70021002034212801197E2129201977E1130C0CCE +:200100000C0C3E24B9C2D7002129203A0020A7CA00001108303E08CD3001D304C31A01009C +:20012000CA401947E8B800BC4848474746464544F57E23A7FA3101D630F24D0147137BE65C +:200140001FC24601141404C23D01C33101E5D53CFE0BFA5701D606217101010A00093DC283 +:200160005D01EB0120003E0AF51A137709F13DC26801D1E113F13DC23001C93C7E66666637 +:200180006666667E3C181C1818181818183C3C3C7E66607C3E06067E7E3C7E666038786065 +:2001A000667E3C666666667E7E606060603E3E06063E7E60667E3C3C3E06063E7E66667EBB +:2001C0003C7E7E60703038181C0C0C3C7E66663C7E66667E3C3C7E66667E7C60607C3C00A5 +:2001E000000000000000000000183C7E6666667E7E66663E7E66663E7E66667E3E3C7E6647 +:2002000006060606667E3C3E7E6666666666667E3E7E7E06063E3E06067E7E7E7E06063EF8 +:200220003E060606063C7E6606067676667E3C666666667E7E666666663C3C181818181814 +:20024000183C3C60606060606060667E3C6666763E1E1E3E76666606060606060606067E64 +:200260007EC3C3E7E7FFFFDBC3C3C366666E6E7E7E767666663C7E6666666666667E3C3E18 +:200280007E66667E3E060606063C7E6666666666667E5C3E7E66667E3E766666663C7E663C +:2002A000063E7C60667E3C7E7E181818181818181866666666666666667E3C66666666665A +:2002C0007E3C3C1818C3C3C3DBFFFFE7E7C3C366667E3C18183C7E666666667E3C18181878 +:2002E0001818187E7E6070381C0E067E7EC0C0C0C0C0C00000C0C0103838383838383838B6 +:200300007C4703510379036F038D035B03830365039703A103AB03290333033D031F0389C0 +:200320000E890E890E890E890E810D810D810D810D810D2B0C2B0C8D0C8D0CC10CE90C1714 +:200340000D3D0D570D710D280B7E0BCB0BF30B130CC103D605B507ED08FD0902041106D969 +:20036000070D091B0A43044C06FD072D09390A8404870621084D09570AC504C20645086DE5 +:2003800009750A0605FD0669088D09930A470538078D08AD09B10A88057307B108CD09CF2D +:2003A0000AA2058907C508DD09D60ABC059F07D908ED09DD0ACD09DD09ED09CF0AD60ADDFC +:2003C0000A0315000500800D00800D00800F00C89F00F8FF00C01700C03F00C07F00C01FFB +:2003E00000801F00000700800F00F83F00FC7F00CEFF01C6FF03C61F17C61F0EC61F14FA9E +:200400003F200315000500800D00800D00800F00C89F00F8FF00C01700C03F00C07F00C084 +:200420001F00801F00000700800F00F83F00FC7F00CEFF01C6FF07C61F1EC61F70C61F00DF +:20044000FA3F000315000500800D00800D00800F00C89F00F8FF00C01700C03F00C07F002A +:20046000C01F00801F00000700800F00F83F00FCFF01CEFF0FC61F7FC61F00C61F00C61F46 +:2004800000FA3F000315000500800D00800D00800F00C89F00F8FF00C01700C03F00C07FEA +:2004A00000C01F00801F00000708800FF0F8FF1FFCFF0FCEFF00C61F00C61F00C61F00C6CE +:2004C0001F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01700C03F00C00A +:2004E0007F00C01F00801FC0000738800F0CF8FF0FFCFF03CEFF00C61F00C61F00C61F00E5 +:20050000C61F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01700C03F00C3 +:20052000C07F00C01FC0801F7000073C800F0FF8FF03FCFF01CEFF00C61F00C61F00C61F7B +:2005400000C61F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01780C03F03 +:2005600050C07F60C01F30801F3800071C800F0EF8FF07FCFF03CEFF01C61F00C61F00C68C +:200580001F00C61F00FA3F00020CF03FF03FE03DC079C071C0E1C0E1E060707034343838F1 +:2005A000F0F0020CF03FE03FC01FC01FC01F001F001E001C000C000D000E003C020CF03F69 +:2005C000F03FE01FC00F801F003EC07DE078703034343838F0F00313400100600300E003B7 +:2005E00000F41700FC1F00E00200E00F00E00300E00300C00100E00300FC0F00FE3F00F35F +:200600007F00F3E302F3C301F18302FE0304FC07000313400100600300E00300F41700FCAA +:200620001F00E00200E00F00E00300E00300C00100E00300FC0F00FE1F00F37F00F3E301EF +:20064000F30307F10300FE0300FC07000313400100600300E00300F41700FC1F00E0020000 +:20066000E00F00E00300E00300C00100E00300FC1F00FEFF00F3FF07F30300F30300F10330 +:2006800000FE0300FC07000313400100600300E00300F41700FC1F00E00200E00F00E003DF +:2006A00000E00300C00101E0031EFCFF03FEFF03F30F00F30300F30300F10300FE0300FCB7 +:2006C00007000313400100600300E00300F41700FC1F00E00200E00F00E00300E0030CC0ED +:2006E0008103E0C300FCFF00FE3F00F30F00F30300F30300F10300FE0300FC07000313405F +:200700000100600300E00300F41700FC1F00E00200E00F00E00300E00306C0C103E0F30078 +:20072000FC3F00FE1F00F30F00F30300F30300F10300FE0300FC07000313400100600300C1 +:20074000E00300F41700FC1F00E00204E08F06E00303E08303C0C101E0E300FC7F00FE3FEC +:2007600000F31F00F30300F30300F10300FE0300FC0700020AF807700F700E701C301C386B +:200780000C1C0E0C060E073C1E020AFC03F803F003F003C003C00380038001C001800702E2 +:2007A0000AFC03F801F000E001C8039C070E07060387031E0F02115000D800F800FE03B837 +:2007C00000F801F8006000F000FC03FE07FF06F90CF918F920FE01FE0102115000D800F86F +:2007E00000FE03B800F801F8006000F000FC03FE0FFF3CF960F900F900FE01FE010211500C +:2008000000D800F800FE03B800F801F8006000F000FC07FE7FFF00F900F900F900FE01FEA7 +:200820000102115000D800F800FE03B800F801F8006000F0E0FC3FFE03FF00F900F900F984 +:2008400000FE01FE0102115000D800F800FE03B800F801F8006000F070FC1FFE07FF00F9E5 +:2008600000F900F900FE01FE0102115000D800F800FE03B800F801F80060E0F01CFC07FE5E +:2008800003FF00F900F900F900FE01FE0102115000D800F800FE03B840F861F8306018F058 +:2008A0000CFC07FE03FF00F900F900F900FE01FE010209FC01F803980318071C078E038649 +:2008C00001C7019E070209FC01F801F801F001E001E000C000E000C0030209FC00F801F0AB +:2008E00003C8079C070E03060387033E0F020F280068007800FE015800F80078003000FC86 +:2009000000FE017F037904790879107E00020F280068007800FE015800F80078003000FC45 +:2009200000FE037F0F7938790079007E00020F280068007800FE015800F80078003000FCFB +:2009400007FE3F7F007900790079007E00020F280068007800FE015800F80078003078FC67 +:200960000FFE007F007900790079007E00020F280068007800FE015800F8007818300EFCD0 +:2009800007FE017F007900790079007E00020F280068007800FE015800F8007818300EFCB7 +:2009A00007FE017F007900790079007E00020F280068007800FE115808F80478023003FC9C +:2009C00001FE017F007900790079007E0002077E00EC00CC018C01C6006300CE0102077C65 +:2009E0000078007800700030002000E00002077E00F800E001CC018600C3008E03020E143C +:200A00000034003C00FF002C007C003C0018007C00FE003F013D023D043D00020E1400349C +:200A2000003C00FF002C007C003C001800FC00FE033F0E3D003D003D00020E140034003CEA +:200A400000FF002C007C003C001800FC01FE0F3F003D003D003D00020E140034003C00FF08 +:200A6000002C007C003C00180EFC037E003F003D003D003D00020E140034003C00FF002C3A +:200A8000007C003C00180EFC03FE003F003D003D003D00020E140034003C00FF002C007C4A +:200AA000003C081806FC03FE003F003D003D003D00020E140034003C00FF042C027C023C62 +:200AC000019801FC007E003F003D003D003D0001057E6432117701053E3818107001057ED2 +:200AE000702621E7011A1838383838383A3ABEB8B8F8FB3B3B3B3F3C38383838383838388C +:200B0000011508181818181A1ED858787819191F1E181818181818010F10101018507014D4 +:200B200014141C1010101010031C007E0080FF01E0FF07F0FF0FF0FF0FF8FF1FF8FF1FF8FE +:200B4000FF1FF8E71FF0C30FF0810FE08107C0810380C301F0FF0FE0FF07E0FF07F4FF2F5B +:200B600084C321048120048120068160F7FFEF068160040020040020040020040020031964 +:200B8000001E00807F00C0FF00E0FF01F0FF03F0FF03F8F307F8E107F8C007F0C003E0C0D1 +:200BA00001C0E100807F00F0FF03E0FF01E0FF01F4FF0BC4E108844008864018F7FF3B86D6 +:200BC00040180400080400080400080213E003F80FFC1F7C1F3E3E1E3C1E3C3C1EF80FF063 +:200BE00007FC1FF80FFD5F394E1144FD5F114401400140020FC001F007F80F780F3C1E3878 +:200C00000E7007E003F80FF0073A2E1224FB6F02200220020B2000F800FC01DE038E03DCB2 +:200C200001F800DC018904FD05010403200400001902007A0100FC00007E0500FE0380FC91 +:200C40000340FE0768F9033EF0FF0FA0FF0380FF0080FF00C0FF00E0FF00E0FF0170FF031C +:200C600030FE0730FC0F30FE0F30FE0F30F80F20F00700F00700F00700C007008007000000 +:200C80000700000300400300800300000F0219140034003C00FF003C002E007E003C40185B +:200CA00030F81FFC07FE01FE01F701E303C307E30FE21F821F001F001F000E000C000E004A +:200CC0003C0213140034003C00FF002E007E003810180CFC077E007A00F201F201E003E084 +:200CE00003C0018001C0018007040BA0000000B0010000B0013C00F0017E00F913FF00FFA1 +:200D00009FFF81F8C7FF9FFCFFFFFFFEFFFFFF0000FC4100000020040980020000C00600B1 +:200D200000C0071C00C8273E00F83F7F10E00FFF13F0FFFF1FF0FFFF1F00007E080308141D +:200D400000003400003CF000FFF8413CFC4FFEFF7FFEFF7F00E0230308A00000A00100E04D +:200D6000C101F8E743E0F14FF0FF7FF0FF7F00C02302070A001A001E007F8E1E9FFFFF009D +:200D80004002160104081E3C0FF84FFC07FE077F0FFE3FFC7FF03FF939F87FD03FFC0FFC02 +:200DA00047FE07FF0DE41FC23FC97780038021062430000000000CF0010000800FF01F007E +:200DC00000F80FE0FFFFFFFF07E0FFFFFFFF07E0FFFFFFFF07C0FFFFFFFF03C0FFFFFFFFE8 +:200DE00003C0FFFFFFFF0380FFFFFFFF0180FFFFFFFF0180FFFFFFFF0100FFFFFFFF0000BE +:200E0000FFFFFFFF0000FFFFFFFF0000FFFFFFFF00000000000000C0FFFFFFFF03C0FFFF61 +:200E2000FFFF03C0FFFFFFFF03C0FFFFFFFF03007C00003E0000930180C9008010024008C2 +:200E400001401105A08802409204204902205408102A04203808101C04F0EF1FF8F70F206A +:200E60003808101C04205408102A04409204204902401105A0880280100240080100930118 +:200E800080C900007C00003E00010F183C7EFFE7E78181E7E7E7E7E7FFFFCDF50E110B2011 +:200EA0001AEEFF12C2EC0ECD4010CDE60FC3EC0E3A0B20A7CADE0ECD4010CDA013CDB70FCF +:200EC000CDB014CD2915CD6310225220CD60122100002233202A5220CD2D11C3EC0E2A52ED +:200EE00020E5CDD010CD0911E1CD7B10CD9816E1D1C1F1FBC92102207EA7CAFF0E35C9231D +:200F00007EA7CA0C0F352B3A052077C9237EA7CA180F353E00D305C92A00207EA7C22C0F0F +:200F20003E00D3053A0A20A7C0D303C9F23B0FE67F32052023220020C31B0F320320233A35 +:200F400005203D3202203E013204207E23220020E67F074F060021501D097ED305237ED341 +:200F600006C9310024CD4912AF0613110020121305C26E0F3D12131221911A220620217E9C +:200F80000FE5FBD3042A06207EA7CA9F0F23220620EB215119074F0600097E23666FE9CD2C +:200FA000F312CD1A17CDF616CDEB143A0A20A7C8CD5A15CDDD16C9218620110B0019E5CD43 +:200FC000D80FE101EF00FE70D2CD0F06107EA1B0777DFEB2C2BA0FC97EA7F0237E2386778A +:200FE000237E238677C9214B207EA7C04721092035C21410361E3A4520A7C20E1021082087 +:201000007EA7CA0E10C6992777C20E100601212220CD3210212320CD321023CD321023CDD8 +:20102000321023CD321023CD321023CD3210324B20C97EA7CA3C1035C23C1037781747C91E +:20104000218620110B0019E5E5CDA610E17DFEB2C24310E1CD0D12E1CD0D12E1CD0D12E1DC +:20106000C30D121154201A3CFE03C26E10AF12214920111200193DF27510C97EE620C87EA4 +:20108000E69F7701060009113320CD9110232323231A1377231A1377231313131A133C773F +:2010A000231A137723C93A0B20AEE610C07EE620C87EE640C2B9103600010500095E23561D +:2010C00023EBCDC8100E1F091A1377231A1377C97EE620C823010500095E2356237BB2C886 +:2010E000D55E235609E3CDF610E15E2356237BB2C8D55E2356E1012000E57B3600233DC24F +:20110000FB10E10915C2F910C92133205E2356237AB3C8D57E23D3015E2356234E234623B0 +:20112000E3E608CC9411C4EB11E1C30C117EE640C87EE6BFF62077E6084723235E237BE673 +:201140000705FA46112F323520323C205623CDD911EB223320EBD5CDB31123232323E5217B +:201160003620CD8711E1C15E237BA7C816003E05EB293DC2711109EB7E23835FEB223A20DB +:20118000EBCDB311213D207323722371237023AF772377C9C5E51A13D302DB0377230DC287 +:2011A0009611AFD302DB0377E101200009C105C29411C95E23E5160021010319195E235604 +:2011C000EBE35E23E3160019195E2356E1EB4E234623EBC97BE607D3010603AF7A1F577B05 +:2011E0001F5F05C2DB117AC62457C979856FC5E51A13D302DB03772B0DC2F011AFD302DB72 +:201200000377E101200009C105C2EE11C93A0B20AEE610C07EE640C87EF6207723235E23F2 +:20122000235623CDD41173237223EBCD3212011F00097E12133E03D302DB03B677237E1299 +:2012400013AFD302DB03B677C9F3E10100001100003120403E10C513BAC25612310024E964 +:201260007EA7F0E6040100001104FCCA71121106FA237EE60FCAA9121FD27D12421FD282AF +:2012800012431FD287124A1FD28C124B790E0023A7C4D0122378A7C4C6122B2B79A7CAA98D +:2012A000122B7EE6EDF66077C92B7EE602C2A212545D010C00097EFE08C83608EB7EE61053 +:2012C000C07EF67077C986FE11D8FEB4D0770CC986E5F52323235E16007DFE6021601ACA72 +:2012E000E512216A1A19195E2356F1E1BBD8BAD0770CC9215B207EA7F21013CD39131146C8 +:201300001A3A5C20CD5013219819CD9913226520216D207EA7F22D13CD391311531A3A6E97 +:2013200020CD501321A419CD9913227720217F207EA7F0CD39132371C92323225020237E89 +:2013400023EB21731901FF000CBE23DA4813EBC91F1F1F1FE60FC25B133E017723F5E54662 +:2013600071CD7A13E1F1110800421971FE0BFA73130E052B7EA7C03608C9212C1A78BEC2D9 +:201380008F132379BEC290131A2A50208677C92323137DFE06C27D13C909095E2356EBC9E0 +:2013A0003A4320A7C0219120CDBD13219C20CDBD1321A720CDF01321B220C3F0137EA7F0BA +:2013C000CD9514C8CD6C14FE07F8CD5A14FE0AF8D609219019FE04FAA014216E203E30775D +:2013E000325C20237EFEDEDAEC1336DEAFC31F147EA7F0CD9514C8CD6C14FE0AF0CD5A145D +:20140000FE07F0D603FE01218A19F2A014215C203E3077326E20237EFE30DA1F14363032DF +:201420005520AF3225203227203228203257203258203222203C3249203245203224203241 +:2014400043203A0A20A7C83E043226203A5520A73E48CA57143E88D303C97EE6BF77110774 +:201460000019AF7723772377237778C9E523237EE52181190601040404BE23D27614E12381 +:20148000237E218519118819051323BEDA8814EB964F78E1C9E5110700197E2323B6E1C99F +:2014A00023233DC2A0145E23562E0161EBC3F610218620110B0019E5CDC314E17DFEB2C2C3 +:2014C000B314C97EA7F023237EFE08DAE414FEF8D2E41423237EFE10DADE14FECCD82B7E22 +:2014E0002F3C77C92B2B7EE6BF77C9216D20110D20CDFA14215B20110E207EA7F0E601C822 +:201500002323237EFE17D0AF3245202B2B7EE60FF6E0772B7EE6FE773E023222203A0A2087 +:20152000A7C81A3C2712C3241C3A0920D605F8C22C152A4C207DFE20D23E1521231A462B4C +:20154000224C203A5C20E60FCA4F15783267203A6E20E60FC878327920C93A5720A7CA70D0 +:2015600015DB0047DB0021202011B019B8CC82153A5820A7C8DB0147DB0121212011C01997 +:20158000B8C0E52FF50F0F0F0FE6074F060021B41509F1E68FB6E1AEC84F0601790FDAAA84 +:2015A000154F7807471313C39C1578AE77A0EB4E236669E93070405020506010215B201159 +:2015C0002020C3CB15216D201121207EF602771AE67F2377C9C82191207EA7F2E415219CF2 +:2015E000207EA7F81159201AFE07F0D53C1211040019E521281E11A23ECD3001215F205E8B +:2016000016002BE521CC1906183A0A20A7CA181678D3033E04322620191919195E23562317 +:201620004E2346E17E80472B7E814FE1702B722B712B732B36C0D11AFE06C03C12137BFE82 +:201640005ACA46161B1B060A3A1120A7CA511606051AFE06FA5916060278322520324A205C +:20166000C9C821A7207EA7F2701621B2207EA7F8115A201AFE07F0D53C1211040019E52153 +:20168000281E11B83ECD30012171205E16002BE521E8190628C30916210C20DB022F47DB1C +:2016A000022FB8C0E64047AEC87078A7C83E0CD303016400D30405C2B4160DC2B4163E087B +:2016C000D3032112203421BA1DCD871C3A0A20A7C021E71A220620310024C37E0F3A4420CD +:2016E000A7C8110820012920CD441C212920110F243E02C33001217F207EA7F02323237E2D +:20170000FE17D208173EB677EB2172190177192303BEDA0F17EB0A2B77C9214B207EA7C873 +:2017200036001FF5DC5417F11FF5DCA817F11FF5DC4F17F11FF5DC4918F11FF5DC8A18F17B +:201740001FDC1B191FF5DC1019F11FDC2319C93E08D303C921132006087E070707AE17179A +:201760002113207E1777237E177705C25917F602E61F322820E6074F060021741A094621CB +:201780005E207EFEA0DA8A170601FE18D2911706022B7EFE38DA9A170604FE10D2A1170683 +:2017A000082B7EE6F0B077C93A0920F620322720AFCDC217325F20215C207EE60FB077C3C0 +:2017C000D515F5215D204E235E216F20462356CDEF17C614217A1A2323BE23DAD717F1A765 +:2017E000CAE417237E4F17171717E6F04779C97A93C85F9F572100003E06193DC2FA177C45 +:20180000A7324820FC41187891C8444D6F9F67CD4118EB3E11210000E519D21E18E3E1F51B +:2018200079174F7817477D176F7C1767F13DC21818AF7C1F577D1F5F3A4820A779F02F3C1D +:20184000C97C2F677D2F6F23C9114A201A3DCA661812F6302129207711B03E3E01CD300137 +:201860003E1E322520C9AF325720325820322720CD7918FA6018C31019218620110B001999 +:201880007EA7F87DFEB2C27F18C92155207EA7115E20C2981811702023344E0600217C191E +:2018A000097EEB562B5E2B772B1F3E47DAB0183DB67721221A09097E23666FE93E0F3224E9 +:2018C00020CDD911D604FE25D2CD18C60757EB224E20EB3A0920E61C4F0600212E1E093E85 +:2018E00004C3300121C81D3A5520A7CAF11821E01DCD821C3E0A3224202A4E20EB3E0FC3E7 +:201900006E1B3E0F3224202A4E20EB3E10C36E1BAF3223202A0F20220620C92A062023223B +:201920000620C9AF325720325820322720322520CD7918FA4D193A0620D667C24D19320A07 +:201940002021911A22062021F61DC3871C3E01320820C98A1B681B811B8B1B9D1BA61BB2C2 +:201960001B4912111C241C5C1C6F1C2B1D481D7B1C7F1CA08060300E747478787AB0C0D052 +:20198000D158718FA8FF80500E9E5E2E0D2A0C300B38122A133014381500120011000F00A7 +:2019A0000E0000001501120111000F000E010000BC15BC15BC15BC15BC15BC15BC15D51520 +:2019C000C515C515C515C515C515C515C515611606061A1506FE1A0406001A0906FA1AFEFC +:2019E00006041A1106FC1A0206021A0EFA06FC15FAFEFC04FA00FC09FAFAFCFEFA04FC1163 +:201A0000FAFCFC02FA02FC0EE40A0B38000B0C30170B0D2AE40A1438000B1330170B122A15 +:201A200008090A09BC18E41802198A1B0000000101000101010202010202020303020303D4 +:201A40000304040304040002FE0002FE0001FF0001FF0000FE020006FA00FF0100FF010070 +:201A600001400342054406450746A8E8AAE8ACE8ADE8AEE8050205060906010A19010417BD +:201A800005061507021303031102070F06050104010601112006004420040AAE1A020E0042 +:201AA00024031E0002070024031E00059D1A0E080A02090028033C0002110030033C0002C1 +:201AC0000A003C033C00080A095F2000100832800971200010DE36880400AE1A06012820BC +:201AE000035A000D05E01A080F951C08109C1D0B1120FB1A0212002C05FF1A0213003003ED +:201B0000690008060144200A07095F2001B00138800B1120261B06845B2006355C20061E89 +:201B200028200650272009712001B0DE3488020BA034031E00020CA034030F000208A03407 +:201B4000020DA23E0B4720521B0C09832000B074018006015820060157200B1120631B069D +:201B60000057200400021B001A13CD8B1CEB4F214E1E7E23A7F2721B0DC2721BE67FC330EA +:201B800001EB7E32232023220620C9EB7E322220235E235623220620EB220F20C9EB5E237F +:201BA00056EB220620C9EB7E235E23562322062012C9210D207E23B6FE04F2BE1BAF324790 +:201BC0002021AF0D110D3ACDF71B21141A3A0D20CDD91B21081A3A0E20A7C8FE03FAE21B48 +:201BE0003E03F55E235623D55E235623E3CDF71BE1F13DC2E21BC94E234623EBC5E51A13F1 +:201C000077230DC2FE1BE101200009C105C2FC1BC9EB5E2356230E057E23121B0DC2181C06 +:201C2000220620C9110D20012920CD441C13CD441C1100242129203E02CD3001111E243E30 +:201C400002C330011A1F1F1F1FE60FC2501C3E10C63002031AE60FC6300203C9EB4E234617 +:201C6000235E2356230AA7C26B1CEB220620C9210D3A11BD20010624C3FC1BCD8B1CE9CDCC +:201C80008B1C3A0A20A7C8220020C9EB5E235623220620EBC93A12200E05FE04D2B01C3D82 +:201CA000070747DB02E603B04F060021171D094E1100281100280479A71F4FD2CE1CC5D5FE +:201CC00078CD6E1BE111000219EBC1C3B61CC2B61CD304DB022FE6A0CAD11C07E6014FDB1C +:201CE0000207E606B14F060021231D09462112207E90FAD11CF37E907779E6013D32112079 +:201D00003D320A20DB02E60C0707C664320820AF320D20320E20C92B05080805053305050B +:201D2000052B0501020101020402023A4920A7C03E01CDC217327120216E207EE60FB07764 +:201D40002B7EF64277C361163A1220A7C2D116C900003F131D1633183F1A051D011F3920A8 +:201D600027221124352513272B283F290F2B192C1F2D212E212F1D30153109323B32293395 +:201D800017343F3427350D363136113731370F382B3805391D3935390B3A213A84061402E3 +:201DA000120311010F0A1101080108040D010D010D030D010C020D0A0F00840115020002B0 +:201DC0000E01110310030C0084040F030F010F040F031201110311010F030F010E080F0072 +:201DE000840208010D010D02110A14011401140211020D0A110086030A010A060F030A01E0 +:201E00000F0613030A010F0213030A010F0213030A010F0613030F011304160213020F0694 +:201E20000A030A010A060F004040404040405547485B504F575B5A41505B57414D5B424152 +:201E40004D5B54485544554D465B4152475B8D27544F4053544152544047414D45952B509E +:201E600052455353403140504C4159455240425554544F4E9A2D50524553534031404F52E5 +:201E8000403240504C4159455240425554544F4E9229494E534552544031404D4F524540F3 +:201EA000434F494E932A494E534552544032404D4F524540434F494E53932A464F5240548E +:201EC000574F40504C415945524047414D458989244040404040404040408925424F4F549D +:201EE0004048494C4C8B26494E5345525440434F494E40892447455440524541445989245B +:201F00004040445241575B40408C5C5C5C5C5C5C205C5C5C5C5C5C892447414D45404F5690 +:201F200045528753484F54134D455B8740404040134040409A2754574F40504C4159455223 +:201F4000404F521D53494E474C4540504C41594552B22A55534540504C415945524031402D +:201F600048414E444C455328434F4D505554455240434F4E54524F4C53404F544845524015 +:201F8000434F57424F59992D4D4159405448454042455454455240434F57424F59405749A7 +:201FA0004E00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bowler1.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bowler1.hex new file mode 100644 index 00000000..85f2e821 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bowler1.hex @@ -0,0 +1,258 @@ +:020000040000FA +:20000000C3580285004B1563FBC94F00009C3778F5E5D5C5CDCB043A11223C3211223A299C +:20002000223D322922C264003A15223A2822B7C23600B7CA64003D322822C264003A1522E5 +:20004000B7C25A0021972235CA53003EBE322822C364003C329222C36400DB02E604CA64C4 +:2000600000329122210920DB052F479670CD8800222222210C20DB062F479670CD88002219 +:200080002022C1D1E1F1FBC9B7FA9600FE21FA9D003E21C39D00FEE0F29D003EE023470E37 +:2000A000007E2F57237E2F5F13EB0906027CB7F2B300371F677D1F6F05C2AD00EB7B867787 +:2000C0005F2B7E8A77676BC9856FD024C9070707072100201600E6F05F19C9D1E17E4723A7 +:2000E000E5D5CDCD00220020C9CDDB002A00204E21830B79CDC8005E2356EB221121EB2380 +:200100005E2356EB220F213E0FCD5002B71F322722D22201060A11D301CD46013A2722E6A7 +:2001200010C03A2722060211D301B7C23101118001CD46012A002023235E2323563E0ACD8F +:200140005002732372C9AFD30278CD5002E607D3013A1221217801CDC8006E260019EB2A42 +:200160001121D52DC26201CD26022A11213E20944F06002A0F21EBC9463C32281E140A0068 +:200180001AD302DB012FB67713231AD302DB012FB67713231AD302DB012FB67713231AD35B +:2001A00002DB012FB67713231AD302DB012FB67713231AD302DB012FB67713231AD302DB4B +:2001C000012FB6771323AFD302DB012FB67709AFD302C91AD302DB012FAE7713231AD30236 +:2001E000DB012FAE7723131AD302DB012FAE7713231AD302DB012FAE7713231AD302DB0124 +:200200002FAE7713231AD302DB012FAE7713231AD302DB012FAE771323AFD302DB012FAE6D +:200220007709AFD302C978CD50020F0F0FE61F572378FE0ACA3802237E0F0F0F47E6E0B29D +:200240005F78E61FC62457C9CDC8007E23666FC92A0020CDC8007EC9310024DB02E680C264 +:20026000BC02AF322822329322321522329022328722D3052100200620772305C279023239 +:200280001C2221A0220608772305C287023E40328622214009228E22FBC353060001020394 +:2002A0000405060708090A0B0C0D0E0F100F0E0D0C0B0A090807060504030201060111002C +:2002C00000210020D304707EA8CACF02CD8903237CFE40C2C402D3042B7CFE1FCAF4027E3E +:2002E000A8CAE702CD8903782F77AECAD602CD8903C3D602D304237CFE40CA0B03782FAE07 +:20030000CA0603CD8903AF77C3F402780747D2C1027AB3CA3A03EBF9110020060021000007 +:20032000390E10AF29DA29032F12133E1812130DC2230305C21D03C38403310024210C32DF +:20034000E52100001199033E0A320322010004AF86D304230DC2500305C250033CCA6A0368 +:200360001AE3EBC5CDA303C1EBE3133A03223DCA7D03FE02C24903210040C34903E17DFEFB +:200380000CCA0000D304C384034F7DE60179C29603B257C39803B35FC948484747464645AE +:2003A000454444D5E5EBCDE203CDF103E1D113C92A1622EB3AB1224E2306003DFAC30309F3 +:2003C000C3B703EB793DF8F51A13D5FE30C2D603CD1507C3DD03CDE203CDF10309D1F1C3BA +:2003E000C503EB213E04D64147070780CDC800EBC93E05F501E0FF091AAE77F13D09C8F55E +:2004000013C3F803EB3D211104CDE803CDF10309C940447E40407252525A4E425A5A5A7E54 +:200420000E08087E004E4A4A32007E4A4A7A004222120A063C5A5A5A3C040A0A0A7E781448 +:200440001614787E4A4A4A343C424242247E4242423C7E525252427E121202023C42425256 +:20046000747E1010107E42427E424232423E02027E181824427E404040407E0408047E7E84 +:200480000418207E3C4242423C7E1212120C3C4242225C7E1212324C244A5A522402027E86 +:2004A00002023E4040403E06186018063E4078403E4224182442060870080662725A4E46BA +:2004C00000000000007060500804952105207E4F17DA0E05237EA7CAF204352B3E8FB677E2 +:2004E0003A0820F606320820D3053E24D30F3E20D306DB042FE6014779E640CA31054FCDFA +:200500003105B9C8233423343E01321822C9357EE60FCA2A05FE08C2F2043A0820E6FD322C +:200520000820D305AFD306C3F2043E7FA677C3F20421052078A7C240053E40B677E640C9E1 +:200540003EBFA677C9216009CD41443A1922470E00CD33442139222200223A1922FE01CAD0 +:20056000B30547050E033E12CDC80022042279CDC800EB79CD1843EBBEFA9E05C291052BD6 +:20058000EB2B7E0DF277052A042205C26405C3B3052A04223E07CDC8003601C38705C53AA2 +:2005A000192290470E01CD3344C12A0422220022C387052139223A1922472281223E07CD23 +:2005C0001B43C2CD05C5CDDA43CD0644C12A81223E12CDC80005C2BA05218037111E003E25 +:2005E000433600233600233600193DC2E10521603F118D07221622CDB30321A0223A8822C9 +:20060000B7CA070621A4220E0322042279CDC800EB79CD1843EBBEFA3606C225062BEB2B65 +:200620007E0DF215062A0422EB2A00220E047E1223130DC22E062A0422CD2942CD1D07CD7A +:200640001D07CD1D07CD10443A88223290223E01321522F33A0820E602320820D305FB2169 +:20066000BB11DB02E610CA6A0623221322DB02E603FE03FA77063D32B122AF321822321941 +:2006800022328C22329422D30ED306D3073A1522B7CAE6113A0720B7C2E6117E323022CD53 +:2006A000A506C39D13CD2C07CD430711B707CDB303CD15073A1922B7CADA063A8C22F6080E +:2006C000328C22D30E116208CDB3033A1922FE04C8110108CDB303CD1507112A08CDB003D3 +:2006E0003A3022CD0404114708CDB3033A3022FE01CAFA06115C08CDB3033A1922B7C8CDA8 +:20070000150711F007CDB3033A19223CCD0404110F08C3B3032A162223221622C9AF321171 +:2007200022D3043A1122FE60DA2107C9210D33AF067811D0FF0E1077230DC237071905C217 +:200740003507C93A88220601B7CA4E0706003A8C22E6FEB0328C22D30ECD4F443A1922B704 +:20076000C268073A0720B7C8113B0ACDB303CD150711FD09CDB30311EB093A8822B7CA841E +:200780000711B009CDB303CD1507C31507093048495B53434F52450E4D45494C4C4555522F +:2007A0003053434F524510484F45434830535445524745424E49530D544F5B535441525457 +:2007C0005B47414D4512504F55525B534F554552304150505559455217554D5B4441535BC6 +:2007E000535049454C305A555B5354415254454E04464F525B05504F55525B0546554552FE +:200800005B034F525B034F555B054F4445525B085B504C4159455253085B4A4F5545555232 +:2008200053085B535049454C4552084445504F5349545B074D455454455A5B0B57455246F9 +:20084000454E5B53494530055B434F494E065B5049454345075B4D55454E5A45015301536B +:20086000014E12505553485B53544152545B425554544F4E3013415050555945525B53554B +:200880005230424F55544F4E301653544152544B4E4F5046304245544145544947454E3075 +:2008A000085B5B5B5350415245085B5B5B5350415245085B5B5B5350415245175B5B5B460E +:2008C0004F554C305B5B53484F4F54305B5B414741494E1B5B5B4641555445305B5B5449A6 +:2008E0005245525B41305B5B4E4F5556454155195B5B464F554C305B5B4E4F43484D414C7D +:20090000305B5B57455246454E0F5B5B53484F4F54305B5B414741494E135B5B5449524595 +:20092000525B41305B5B4E4F5556454155125B5B4E4F43484D414C305B5B57455246454E49 +:20094000015B015B015B075B5B5B5B5B4F52075B5B5B5B5B4F55095B5B5B5B5B4F444552A8 +:200960000F5B5B5B47414D45305B5B5B4F564552075B5B5B5B46494E0A5B535049454C4549 +:200980004E44450E5B5B4C415354305B5B4652414D450E5B4445524E494552305B434F5553 +:2009A000500E5B4C45545A544552305B575552460A524547554C4154494F4E095245474C4E +:2009C000454D454E540A42455354494D4D554E47085B5B5B464C415348085B5B5B464C4126 +:2009E0005348085B5B5B424C49545A05464C41534805464C41534805424C49545A04464FB5 +:200A0000525B05504F55525B05465545525B0E5B5B42454552305B5B4652414D450E5B5BFA +:200A2000434F5550305B5B42494552450E5B5B42494552305B5B52554E4445175C5B505278 +:200A40004553535B53454C454354305B5B425554544F4E215C5B415050555945525B5355CD +:200A60005230424F55544F4E5B44453053454C454354494F4E195C5B574145484C4B4E4F3A +:200A80005046305B5B4245544145544947454E0E5B5B5B535452494B45305B5B5B580E5B0F +:200AA0005B5B535452494B45305B5B5B580E5B5B5B535452494B45305B5B5B580F5B5B5B6B +:200AC000444F55424C45305B5B5B58580F5B5B5B444F55424C45305B5B5B5858105B5B5B7D +:200AE000444F5050454C54305B5B5B58580E5B5B5455524B4559305B5B585858015B015B9F +:200B00000F5B5B484559484559305B5B58585858015B015B095B484F4C595B434F57015B06 +:200B2000015B1130505553485B425554544F4E30464F525B1130505553485B425554544FC5 +:200B40004E30464F525B1130505553485B425554544F4E30464F525B04484F4F4B04484FDB +:200B60004F4B04484F4F4B08535452414947485408535452414947485408535452414947F8 +:200B80004854D201013C0C01013F0C0106400C0701421046022A0D3301B80D0701460C07CA +:200BA000014D0C0701540C06025B0C0602670C0602730C06027F0C06028B0C0602970C061F +:200BC00002A30C0602AF0C0602BB0C0602C70C0801EB0C0801F30C0801FB0C0801030D08BE +:200BE000010B0D0801130D08011B0D0801230D0C02D30C02013D0C2C039E0E2301170E41AB +:200C0000013A0E23017B0E1A01EB0D1201050E0C02220F0C023A0F0C02520F0C026A0F0C0D +:200C200002820F0C029C0F0C02B40F0C02CC0F0C02E40F1A020E100902FC0F15010707FF3A +:200C4000FFFFFFFFFFFF41221408142241406070787C7E7F00000000000000FE01FF03039F +:200C6000030303FF03FE0100000003FF03FF03020300001E033F0333033303F703E603EEBE +:200C800001FF033303330387038601FF03FF03300030003F003F00E001F30333033303BFF0 +:200CA00003BF01E001F30333033303FF03FE010F003F00FB00E30383030300EE01FF033351 +:200CC000033303FF03EE01FE01FF03330333033F031E00F000FC03FE07FE07FF0FFF0FFF09 +:200CE0000FFF0FFE07FE07FC03F000000078FFFF7800000070787C3C1C0303183C3C3C3C26 +:200D000018181800070F1F1E1C606000001EFFFF1E000060601C1E1F0F07001818183C3C33 +:200D20003C3C1803031C3C7C7870000200020002000200020002000200020002000200024B +:200D40000002000200020002000206020802700208020602000278021402160214027802B9 +:200D600000023E024002780240023E0200023C024202420242027E020002420242027E025D +:200D80004202420200027E020402080204027E0200020002000200020002000200020002A3 +:200DA00000020002000200020002000200020002000200020002000200000000000000001B +:200DC00000000000000000000608700806007814161478003E4078403E003C4242427E0065 +:200DE00042427E4242007E0408047E11151F00001F0608061F00001F091F0000171D051F2B +:200E0000000105051F1E081E00041E0400001F11111F0000101F11261909093F002129299B +:200E2000293F00202020203F001F203C201F001E2121211E001A2525253F3A2921211F00A6 +:200E40003F100C023F0021213F212100202020203F001F203C201F001E2121211E001A25DC +:200E600025253F000000000000001F203C201F001E2121211E003F100C023F261909093F64 +:200E800000212929293F003F100C023F003F100C023F0021213F2121001F203C201FFFFFC4 +:200EA00001010101010101010101010101010101010101010101FFFF010100010100010118 +:200EC0000001010001010001010001010001010001010001010001010001010001010001FD +:200EE0000100010100010100010100010100010100010100010100010100010100010100DD +:200F000001010001010001010001010001010001010001010001010001010001010001FFBD +:200F2000FF01001C00140014FF170110011001100110FD1705140514071CFF1E8112811267 +:200F40008112AD16A514A514AD17291029102910EF1FFF1F011001100110BD17A514A514B5 +:200F6000ED160912091209120F1E8003FF1E011001100110FF1E8002F80208020802080266 +:200F8000F803EF1F291029102910AD17A514A514BD16811281128112FF1EEF1FEF1F291069 +:200FA00029102910AD17A514A514BD17011001100110FF1FFF1F011001100110FD1F0500F2 +:200FC00005000D000900090009000F00E01F3F1001100110BD17A514A514BD170110011029 +:200FE0003F10E01FFF1F011001100110BD17A514A514BD16811281128112FF1EFF01010161 +:20100000010101010101010101010101FF01FF1F011001100110FD1705140514FD17011008 +:2010200001100110FF1F00000000001C00140014FF170110011001100110FD17051405148C +:20104000071C3C247F7D7D7D7F00D034000318FF00002400016800103400014800FF24003D +:20106000016804002408002004008B08002004113408001804117B08001800D024000111E1 +:2010800000D07B00011100289C00014200389C00014204289C0800020428DD0800028C2A3A +:2010A0009F000001842EBF000001744A9C0000018C4ECA000001244EA70000017843B20097 +:2010C0000001FF74749C0000019078CA0000012478A7000001786DB2000001FF749E9C002F +:2010E000000194A2CA00000124A2A70000017897B2000001FF74C89C00000198CCCA0000B8 +:201100000124CCA700000178C1B2000001FF081135000146FF00009C00014200109C00012B +:201120004204019C0800020401DE0800028802C8000001840BC0000001B4049F000803FFD1 +:2011400040404040404040400433323131414141042333323231313104132333323232317C +:2011600004132323333232320414132323333232041413232323333204141313232332335F +:2011800000010205080B0E0F1000030607080706030000000102030506080A0C0D0E0F1076 +:2011A0001000020305060708080807060503020000010409101924314051640102004B4AC0 +:2011C000749EC88F0ABC0AED0A000B140B5E3E04322F2021E03F2D3600C2D611D304257CD0 +:2011E000FE23C2D611C9CDCE11211020161036002315C2EE113E7032E0203E6232E2203E18 +:201200000432EF20AF328322329F223A9022328822214910CD4042215010CD404223220466 +:20122000223A1922FE04CA51122A13223A0720477E90323022CA3B12F2511278963207207C +:201240003A19223C3219222A04223DCA2912C31A123A1922B7C27B123A0720B7C27B123CD1 +:20126000321522CDA50621603F118D07221622CDB30321A022CD2942C39D13CDA506D3046E +:201280003A9F22B7C2C712DB04E608219322BECAC71277B7CAC212CD59073A8822EE0132FF +:2012A0008822B7C2B412D3073E2132EF20CDE9000EC3BF123E0432EF20218722CD5243CDF7 +:2012C00043073E06329F223A1122B7CADE12AF321122219F227EB7CADB1235CD43433A19F2 +:2012E000224FB7CAF312DB04E604C2071379FE04CA7E122A13223A0720477E90473A302295 +:20130000B8CA7E12C32912F33A0820F604320820D305FBCD2C07214910CD4042215010CD2A +:2013200040423A8C22E6F7328C22D30E2139222281223A19224711BF110E00712371237120 +:20134000237123712371231A771323362023362023362023713E08CDC80005C23B13AF323A +:20136000362232152232352232922232952232AC223C323722CDD14321BD11DB02E608CA28 +:2013800089133A1922233297227E3228223A8822B7CA9D133E2132EF20CDE9000EAF3212C8 +:2013A0002232A8223A1522B7C2E9132A81223E04CD1B433294220604B7CABE1306023A8CDD +:2013C00022E6F9B0328C22D30ECD4145DB02E640CAE9133A362217171717E610F32108205F +:2013E000477EE6EFB077D305FBAF3283223296223A8822B7CA05143E0432EF20CDE9000E24 +:201400003E0532EF203E0A32342221302001721216003E0432032278323222793231223A9D +:201420000322320822364C2372237023722371233E0472233DC2321436011E061936042348 +:2014400079D6144F3A08223DC222140610DB02E620C30046060E3A322280473A3122D60A69 +:201460004F3A03223DC214142130203A3422320222220020CDEC003E0FCD50023605233A41 +:2014800002223DC26E14AF3233223C320222AF322B22212020220020220022366C2A0020DE +:2014A0002336002336F3233600233663CDEC003E05322F203A1522B7CAE0142A1A223A1C53 +:2014C000223DF2CA142183453E0601040009221A22321C223A0720B7C25306EBC3D7168482 +:2014E0003A2B22B7C209153E09D30FF33A0820F601320820D305FBCD7A41F33A0820E6FE6B +:20150000320820D305FBC37115CDEC0021BB08CD4144F33A0820F608320820D305FB3E05A3 +:20152000320322FE04C228151120003E4621BA2A3600193DC23015321122D3043A1122FE5F +:2015400004C23A15214910CD4042AF321122D3043A1122FE04C24E153A03223DC22015F3A8 +:201560003A0820E6F7320820D305FB2A00222200203A2322FEFFF28915D3043A1122B7CAA0 +:201580007915AF321122C37115AF320922328D22320822329F22CDEC00CD1D44CD43432AC0 +:2015A0000022220020AF321122D3043A9F22B7C22516DB02E640CAD61506103A36220FDAE4 +:2015C000C4150602DB04A0CACC153E01219422BECA2516C3EB15DB04E602219522BECA2518 +:2015E0001677B7CA25163A9422EE01F5CD4145F1329422CD41453A1222B7C209162A81227C +:201600003E04CDC8003A9422773A8C22E6F94F3A9422B73E04CA1A163E02B1D30E328C22E1 +:201620003E06329F223A1122B7CAA915219F227EB7CA3516353A0822B7CA5C163C32082277 +:20164000FE0CCAB1162A1E223A2322BCFA5C16C2B1163A2222BDFA5C16C2B1162A002023B8 +:201660004E2346EB2A2222221E22CD2443097CEBFE58DA7A16FEF2DA7C163EF277FED0D2F1 +:201680008D163A0822B7C28D163C3208222B7323234E2346EB2A2022CD244309EB723E25A0 +:2016A000BADAA516773E7EBED2AC16772B73C396153A0922B7C42C44CD10443A1F222100C6 +:2016C000FEBCFACA163E01C38F142100F9BCF2D416221E22111E223E05CD18433E10D306DA +:2016E00006041A77132305C2E216702120203E01C330173A2920B7C217173A9422B7C21796 +:20170000170106002A272009222720EB2120202200203E07CD05433A3322B7CAEA1721307E +:2017200020AF3207223AA822B7FAAD443A02223D2200223203223E09856F7EB7CA4717FE0D +:20174000FDC2CD17C3C8173E052A0022856F5E23567AB7F25C172F577B2F5F13234E2346D8 +:2017600078B7F26B172F47792F4F033E05F57AE604C2A21778E604C2A217EB29EB60690991 +:20178000444DF13DC26D172A00227EFE4CCAC8173E09856F360306042B360005C29817C36F +:2017A000CD17F12140117807070782856FD2B117247EF50F0F0F0FE60F4F3E05CDE442F107 +:2017C000E60F4F3E07CDE4423E013207220110002A0022093A03223DC230173A0722B7C20C +:2017E000EA173A2920FEFFCAB21B3E043206222120203A022222002232032216087EFE6CD5 +:20180000CA051816043E09856F7EFEFECA3518B7C277183E0ECDA34282FE34D223183626D8 +:20182000C32A18FE7BDA3518367F7AFE02CA53181EFEC36D183E0CCDA3424F82FE10D24648 +:20184000183602C353183A3322B7CA771879FE5CDA77181EFD0E013E0506042A0022856F78 +:2018600036002305C260183E0C0DCA59183E09D30A2A0022856F732A00227EFE6CC29F18BA +:201880003AA822B7CA9F1823237EFE1BC29C1823237EFE72CA9744FE30CA9D442A002201BA +:2018A0001000093A03223DC2F5172120203A02223203222200223DCAD31A3208223E09852F +:2018C0006F7EB7FAC41A2A0022320722011000092204223A0722473E09856F7EB7FAB71A9E +:2018E000A0C2B71A3209222A042223234623234E2A002216097ED64CCAFF183E02160B3269 +:201900002E222323869047322422F216192F3C473E0132092278322C22BAD2B71A7A322FBD +:201920002223235621B01178856FD22E19245E3A2E2282914F322522F247192F3C4F3A094C +:2019400022EE0132092279212F22BED2B71A322D227E21AF11856FD25B19247EC602577979 +:2019600021B011856FD26919247E83BAD2B71A3E07CDB842220F22EB220D22483A24223226 +:2019800025223E05CDB842EB220B222A0F22197CB7CA9719F2C41A2A04223E09CDC8007E21 +:2019A000FE013600CAB1193E09CD1843FE01C2C3193A2E22B7CABF19D308D30AC3C319D345 +:2019C00009D30A3E09CD184336002A0B221180113A2E22B7CAE81978FE09FAE5193A2D2277 +:2019E000D60E2F3C4711921178CD8142220F221189113A2E22B7CAFC1911A111782A0D22E3 +:201A0000CD8142EB3E05320A223283223A0922B7CA1A1A7B2F5F7A2F57132A0F2219220FF8 +:201A200022EB2A04223A0A22220020856F7E83775F237E8A7757CD05432A0F223A2E22B72C +:201A4000CA5C1A3A0A22FE07C27C1A0E017CB7F2531A371F677D1F6F0DC24D1AEB2A0022AD +:201A60002200203A0A22856F7E93775F237E9A7757CD05433A0A22FE07CAB71A2A0D223A2C +:201A80002E22B7CA8E1A3E0E119211C3931A1180113E0890CD8142220F223E07320A222A35 +:201AA0000B221189113A2E22B7CAAF1A11A11178CD8142EBC30C1A2A04223A08223D3208B0 +:201AC00022C2CC180110002A0022093A03223DC3B0182B3A06223DC2EC17D3043A1122FEE0 +:201AE00001DADA1A3A2220070707E607D306AF3211222120202200203E09CD5002B7C21911 +:201B00001B3E06CD50021100FFB7F2111BBAC2191B722B733E06CD05432120203A02222268 +:201B200000222200203203223E09CD1843CA3C1BFEFECA3C1BFEFDC2A01B36FF2346234EB6 +:201B40002A00227EFE4CCA701B23237EB8C2571B23237EB9CAA01B78FE58D2751B3A3422AA +:201B60003C3202223233222A00227EFE6CCA751B1621C3771B16053E0FCD1843F572CDEC82 +:201B8000003E0FCD1843FE21C29E1B36042A00227EFE68C2981B3E48C60477C37E1BF177CC +:201BA0003E10CD18433A03223DC21F1BCD4343C3F3163E05322F20CDE900020610CD7A41DE +:201BC00005C2BD1B3A8822B7CAEC1B3A9622B7C2EC1B3A1222B7C2E01B3A8322B7CAEC1B3F +:201BE0003E2132EF20329622CDE9000E212220360123233625CD5741210E11CD4042CD7A21 +:201C000041212020220020CDEC003E0A320822AF322E223A34224F32382221302011302015 +:201C20003203222200203E09CD5002FE01C25B1CD5C5CDEC00C1D1060F2A00207E12231363 +:201C400005C23C1C3E0512133A0822FE0ACA5C1CFE07CA5C1C322E22C35C1C0D3E10CD50D3 +:201C6000023A08223D3208223A03223DC2201C79FE02C2811C3A2E22B7C2811C3E0132A83A +:201C8000223A1522B7CA8E1C2139222281222A81223E05CDC80079323422B7CAA31C360029 +:201CA000C3F91C3A1222B7CABA1C360021A0083E24D30F3E20D306C3CF1C7EFE05CAC21C36 +:201CC0003C3421C11123233DC2C51C5E2356EBCD41443A8822B7CAF91C2A84223A1222B7F8 +:201CE000CAE51C232323EB21AD223600231A7723131A77233600CDEB44CD7A412A81223A40 +:201D00003522C60FCDC8003A3422473A38229077AFD3062A81223E05CDC8007EB7CA421D05 +:201D20003E12D30FF33A0820F620D305320820FBCD7A41CD7A41F33A0820E6DF320820D382 +:201D400005FB3E08D3063E0432DF203E3532D4203E3732D2203E1432D020CDE9000D212245 +:201D6000207EC60477FEF3D29A1DFED0DA721DAFD306CDE90002CD7A413AD220FE07CA5EB2 +:201D80001D3E1032D020CDE9000D3AD220D60132D220FE07C2521DC35E1D3A8822B7CAA84B +:201DA0001D3A3422B7CCEB44CD10443A1522B7CA2B1E3A3422B7CACA1D3A1222B7C2C71DA5 +:201DC0003C321222C38614CD57413A9122B7CAF11DF33A0820E604C2E51DF604320820D3F9 +:201DE00005FBC3F11DE6FB320820D305FBAF329122CD4F443A8822EE01328822CD43073A10 +:201E00008822B7CA1A1E3E0432EF2021A022CD294221A422CD2942C39D13D30721A422CDA1 +:201E2000294221A022CD2942C39D13213522343A3422473A3822904F3A1222B7CA541E3A18 +:201E40003422B7CA541ECD7A413A3722FE0ACA541ECD57413A3422473A382290473E0A2AC1 +:201E60008122CDC8007EB7CAAB1E237886772B35CA781E2323C3651EE5C5237ECDB241CDA6 +:201E800096432A81223E09CDC8007EFE20C2941E2BC38A1E3620CD9643C1E1545D13131A8B +:201EA00077AF1223131A772BC3651E2225223A3422B7CAF41E3A1222B7C2D31E3C321222AC +:201EC0003A3722FE0AC286143A3522FE03C28614C3621F3E20CD7F433A3522FE03CA621F0F +:201EE0003E0A21342296CDB2413A3722D60AC2871FC3621F3A1222B73E18CAFF1E3E1C32C0 +:201F00009E22CD7F433A12224F3A3722FE0AC21A1FAF321222C5CD6B44C13A8822B7CA396A +:201F20001F2A84220DC22A1F2323EBCD8D413A3522FE03CA621FC3511F3A3522FE03CA6200 +:201F40001F2A252236010DCA4B1F3423360A2336003A3722FE0AC2871F210909CD4144C33E +:201F6000E9133A3422B7CA6F1FCD7A41CD57413A3522FE03C2871F3A8822B7CA871F3E0A8C +:201F800021342296CDB241CDD743CD41453A3722FE0AC2CE1F219B222298223E053212208F +:201FA0003E04321F203EB0328B223214203A9A223DFACE1F329A227E32102023222522CDFA +:201FC000E900012A25223A1420D608C3AA1FAF323522213622343A1922BECA01402A8122DE +:201FE0003E12CDC800228122CDD143C39D13643723EB2B732372EB11E905CD2437D20620FD +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bowler2.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bowler2.hex new file mode 100644 index 00000000..89a75003 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/bowler2.hex @@ -0,0 +1,66 @@ +:020000040000FA +:20000000C03AAC22B7CAA7402139222200223A192257FE01CA7740060A48592200223E0F62 +:20002000CDC8007EB8F2294047237EB9F230404F237EBBF237405F3E12CD184315C21B407A +:200040007B3225221E0FCD2845C26540411CCD2845C265401C3A252247CD2845C26540CD8E +:200060000745C3A7403A1922572139222200227BCD1B43B8CA9A403E06CD18433AAC228602 +:200080003212203E923214203E0C3210203E04321F20C5D5CDE90001D1C13E12CD184315F7 +:2000A000C26C40AF32AC223A9222B7F2BD40210E33221622118309CDB303C345053A372213 +:2000C0003C323722FE0BCA45053D0707C6883210203E2A3212203E9F3214203E04321F207F +:2000E000CDE900013A1020C604321020CDE90001AF323622213922228122CDD1433A37220E +:20010000FE0ACA3141FE05C216413A9222B7C21D413E01C348413A9222B7CA9D13210E33AE +:20012000221622118309CDB3033EFF329222C39D13211511CD4042219B22229822AF329AE4 +:20014000223EB0328B223E0932AC22210E0ACD4144CD0745C39D133A3422213020320322FA +:200160002200203E0FCD50023621CDEC003E10CD50023A03223DC25D41C9AF321122D304A4 +:200180003A1122FE02DA7E41AF321122C9D5CDD541D12A81223E01CDC8000602131A86FE99 +:2001A0000AFAA941D60A23342B772305C29C41C3D541F5CDD541F12A81228623FE0AFAC7D0 +:2001C0004134D60AC3BC412B77237EFE0AFAD541D60A7723342A81223E06CDC8007EC60413 +:2001E0003212203EBF3214203E04321F20AF3207220103002A8122097EB7C204423A072201 +:20020000B7CA15427E0707C624320722321020C5CDE90001C11114201AD608120DF8C2F48C +:20022000413E01320722C3F4413E123212203ECA321420228122CDE841213922228122C904 +:20024000111020AF321F2006057E1223131305C249427E1B1223221C20CDE900013A1220B8 +:200260002116208632122023233A1420863214202335C25942D3042A1C207EFEFFC24042EC +:20028000C9EBCDC8004E2100000DFA914219C389420E047CB7F29942371F677D1F6F0DC27C +:2002A0009342C9F5CD18434E2346F1D60BCD18437E8177237E8877C9F52A0422CDC8005EBB +:2002C0002356F1CD1843935F237E9A572100000DFAD74219C3CF423A2522B7F07C2F677D23 +:2002E0002F6F23C9320A222A00222200200600CDC8005E23567AB7FAFF4205792F4F03EBC0 +:2003000009EB722B730E02EBCD9342EB3A0A22C607CD5002732372C92A0022856FD22143B8 +:20032000247EB7C97CB7CA3543FEFFC07DFEF0D82600C339437DFE10D02E003A03223C326B +:200340000322C93A8822B7C83A8322B7C021872235F036102A84223A862207B7F263432198 +:200360005F450701050009228422328622F680D3077E32E420CDE9000E3E0532EF20C9F517 +:20038000CD96432A81223E07CDC8000603F14E77237905C28E432A81223E06CDC8007E3CBD +:2003A0003212203E9D3214203E04321F203E02320322232289227E321020CDE900012A8914 +:2003C000223A1220C6083212203A03223DC2AF43C9CDDA43C3E443CDE4433EB23214203EE8 +:2003E00078C3EB433E943214203E7C3210202A81223E06CDC8007ED6073212203E04321F48 +:2004000020CDE90001C93EB23214203E80C3EB432A8E22CD4144214009228E22C9218D2236 +:2004200035F036103A0922EE01320922CDD541CDE443C9214022713E12CDC80005C23644E6 +:20044000C9228E22EB214A33221622CDB303C9210E3322162211B0093A8822B7CA62441130 +:20046000D009CDB303CD1507C315072A98223A9E227723229822219A22343210203E05321C +:2004800012203A8B22321420D608328B223E04321F20CDE90001C921B145C3A04421A34526 +:2004A0003E0532A92222AA223EFF32A82221A92235FACA442AAA22EB2122201A771323237E +:2004C0001A7713EB22AA22C3DA1A2AAA227E323820237E323920237E324820237E32492047 +:2004E000AF32A822D308D30AC3F3162A8122E521AD222281223E283212203E67321420CDC4 +:20050000E841E1228122C93A19224F2139222200223E0FCDC80036002336002336003E12A5 +:20052000CD18430DC20E45C92139223A1922577BCDC8007EB8C03E1293CDC80015C22F4597 +:20054000C911580B21670B3A9422B7CA4F45EBE521DC3F221622CDB30311220BCDB303D14B +:20056000CDB303C976000201016D0004020264000503035B000705055200050303490004BB +:200580000202400002010120FDEAFE48FB60FE20FD00FF00FAD8FE00FEC0FE70FCF0FE4823 +:2005A000FAA0FF1B301A2F182E162D142C000103001B6C1A6D186E166F1470FE0000017530 +:2005C0006E6420474C4F42414C1D556E61626C6520746F2061737369676E20494E434C55C1 +:2005E00068452066696C652152656769737465722065787072657373696F6E206973206E2E +:20060000CA56143A1522B7C25614C35414616C69642072656769737465722070616972221A +:2006200052656769737465722065787072657373696F6E2067726561746572207468616E30 +:2006400020371A4D697373696E67206F7220696E76616C6964206F706572616E64CA424FE3 +:200660004C574F42250000090000060100000000BE45C8D441524353FB0F0100200000C856 +:2006800043414DD50F0100000000D9414C50B0020100240000CB43415453A8210100240033 +:2006A00000D4554F48538C030102000000CE4948530A0F0101000000D254434853150F019F +:2006C00001000000D250575354B4210102000000D34D5753542D0F0180000000C3534D4F94 +:2006E00052CD1E010C320000DA4953504843EE0F0100040000C44154534C2D0201FF1F00E5 +:2007000000B04A424F750F0100200401C3454A424F810F0100200401CF4E4A424FD334010B +:2007200002200401D443434D4C320105200401C34353D42E0107200401D4554F444E53E07D +:20074000170108200401CC5648444C4FBD0F0109200401CC5656444C4FD015010C200401A2 +:20076000D44243454D57340102000000D2544E434DC90F0105000000D25057534E43FF00C2 +:200780000104000000CB53414D43E20F0101000000CE454552435361210100240000C44186 +:2007A000564D4711010F210401D354494253960F0111210401D4455345522D2E01000004C3 +:2007C00001C35653544E4977120110000401B15653544E492B100136000401B1544F4D497C +:2007E000548F260153000401D454414D49549B37015A000401C54C504D4153191B01640037 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/checkmat.e b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/checkmat.e new file mode 100644 index 00000000..ebef43ef Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/checkmat.e differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/checkmat.g b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/checkmat.g new file mode 100644 index 00000000..bfc47d1e Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/checkmat.g differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/checkmat.h b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/checkmat.h new file mode 100644 index 00000000..ec6f3852 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/checkmat.h differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/checkmate.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/checkmate.hex new file mode 100644 index 00000000..91510622 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/checkmate.hex @@ -0,0 +1,130 @@ +:020000040000FA +:200000000000AFD301C39700F5C5D50600C32B00F5C5D50601C32B00C37D0D084D4154C500 +:20002000C3A80C08434F49CEC3990CE5CD7F00780FD27900210320CD920021BE21CD92002B +:2000400023CD9200DB00E60FCA530032C2213E0132C121DB000F0F0F0FE60FCA610032CA96 +:2000600021DB01E60FCA6B0032D221DB010F0F0F0FE60FCA790032DA21E1D1C1F1FBC9DBB4 +:20008000034FDB03B9C0210020AE71A1E680C82377C97EA7C835C9DB02E680CAF904060129 +:2000A000110000210020D302707EA8CABD004F7DE60179C2BB00B257C3BD00B35F237CFE1B +:2000C00040C2A600D3022B7CFE1FCAFA007EA8CAE1004F7DE60179C2DF00B257C3E100B31D +:2000E0005F782F77AECAC4004F7DE60179C2F500B257C3F700B35FC3C400D302237CFE4056 +:20010000CA1D01782FAECA18014F7DE60179C21601B257C31801B35FAF77C3FA007807471A +:20012000D2A3007AB3CA4C01EBF91100200600210000390E10AF29DA3B012F12133E1812C9 +:20014000130DC2350105C22F01C38501310024210C28E5210000119301010004AF86D302E3 +:20016000230DC25D0105C25D013CCA77011AE3EBC5CD0004C1EBE3137CFE10C25901E17D68 +:20018000FE0CCA0000D302C38501000000000000000000484746453C7E6666666666667EB7 +:2001A0003C181C1818181818183C3C3C7E66607C3E06067E7E3C7E6660387860667E3C666F +:2001C0006666667E7E606060603E3E06063E7E60667E3C3C3E06063E7E66667E3C7E7E6089 +:2001E000703038181C0C0C3C7E66663C7E66667E3C3C7E66667E7C60607C3C00FF8181819B +:20020000818181FF0000FF81BDA5A5BD81FF0000FFD5ABD5ABD5ABFF0000FFE7E79999E734 +:20022000E7FF00FFFFFFFFFFFFFFFFFFFF1818181818180000181800000000000000000022 +:2002400000183C7E6666667E7E66663E7E66663E7E66667E3E3C7E6606060606667E3C3E70 +:200260007E6666666666667E3E7E7E06063E3E06067E7E7E7E06063E3E060606063C7E6698 +:2002800006067676667E3C666666667E7E666666663C3C1818181818183C3C6060606060BA +:2002A0006060667E3C6666763E1E1E3E76666606060606060606067E7EC3C3E7E7FFFFDBC9 +:2002C000C3C3C366666E6E7E7E767666663C7E6666666666667E3C3E7E66667E3E0606064B +:2002E000063C7E6666666666667E5C3E7E66667E3E766666663C7E66063E7C60667E3C7E36 +:200300007E181818181818181866666666666666667E3C66666666667E3C3C1818C3C3C348 +:20032000DBFFFFE7E7C3C366667E3C18183C7E666666667E3C1818181818187E7E6070383A +:200340001C0E067E7E00FFEFE7EFEFEFC7FF0000FFC3DBDFC3FBC3FF0000FFC3DFE7DFDFC7 +:20036000C3FF0000FFDBDBC3DFDFDFFF00FFFFFFE8EAE8EE8EFFFFFFFFFFA8AA88DADAFFEC +:20038000FFFFFFFFC8AECCAEA8FFFFFFFFFF4757575747FFFFFFFFFF17D695D317FFFFFFD7 +:2003A000FFFF476F6F6FEFFFFFFFFFFF1757555518FFFFFFFFFF1FBFBFBFBFFFFFFFFFFF80 +:2003C0009555915555FFFFFFFFFF11DD99DD11FFFFFFFFFF115D595D1DFFFFFFFFFF955567 +:2003E000955551FFFF7EE6F0C2F4033E40CD0004C3FB037E07070707CDFC037EE60FC630D8 +:20040000E67FFE300600D21D04EB01E001F5237DE61FC2160409F13DC20D04EBC9E5D5CDC8 +:200420003A043AE8214FC51A13A97701200009C105C22604D113E1C90600D6304F60692923 +:200440002929090901970109060AEBC9E67FE5FE30D25B046F260019EBE1C9D5CD3804C543 +:200460001A13D5E521E3210104005F5007D2720416F00778D279043E0FB2772B7B07070D62 +:20048000C26A04EB13E10E04D5E506041A13772305C28C04E111200019D10DC28804D1C170 +:2004A00005C25F04D113131313E1C9A30000000000000000183C7EFF181818181818181817 +:2004C000FF7E3C18080C0EFFFF0E0C08103070FFFF7030100A00000018180000000A000067 +:2004E0002418182400000A002442181842240014528124118824814A00310024CD0B0D2190 +:200500000020017E04CD140521FFFF220A20220C20C37206AF77230DC2150505C21505C982 +:20052000D3022101207EA7CA4E053600233411E80FCD780D3A0620A7C0310024CD0B0D1169 +:200540000000CDC60DCDA506CD2005C348053A0320A7C26E052A04207EA7CA6B0532032046 +:20056000237ED30123220420C36E05AFD301CD910D3A0620A7C0DB03E60FC81E001C0FD2FC +:200580007D05DB02E601577B07B221100ECD910C572102207E92F8777BFE01C2A7053209A5 +:2005A000203E045FC3AA053209203207207B21B80FCD9C0C220E203E01320620310024211F +:2005C0002720019602CD1405DB020F0FE603C6023208203E01321020212D20222B20CDBC4A +:2005E00006211020E721082035C2DE05AF3206202127203A0720471100004A7E23B9CA08FC +:2006000006DA09064F5816FF1405C2FB057AA7CA2106110401CDB80D110503CDB80DC347E5 +:2006200006213C0ECDE80DE9D511412A21540ECDBB0D1313C13A072091C631CD4C041148EF +:2006400034215A0ECDBB0D3EFFDFCD9C06110601CDB80D110703CDB80D11E50FCD730DCD47 +:20066000F20D3A0220A7CA7206CD0B0D110100C34205CD9C06110801CDB80D110903CDB878 +:200680000D3E78DFCD9C06110A01CDB80D110B03CDB80D3E78DFCDD506C372061100402100 +:2006A000C600C3110D110302DB02E601C2C60D3A0220FE02D2C60D1E02C3C60DCDF607366D +:2006C000FFCDF60736AACDF60736FFCDF6073A102077C31A073A0720A7C80603CDF607EB55 +:2006E0001A3CC2F606CDF6077EFEAAC2F606CDF6077E3CCA0807EB222B20C5CD2005C10DFE +:20070000C2DC0605C2DC06C9CDF6073A0720BEDAF6067EA7CAF606321020CD95093A1020E2 +:200720003211203A07203212203A0620A7CA560711DC0FCD730D21172036037EC630118E76 +:200740002FCD4C043E1EDF21172035C23B07118E2F3E40CD4C04CDEE0A3A0620A7CA6B0710 +:200760003A09203DC270073AC021A73E02CA76072112203E0B9632BF2121A00FEF7EA7C26D +:200780008907211120E7C37907E5CD3C0BA7C296073E04CDB40CE5CDB307E177E1CD0F08F6 +:2007A0003A1220FE02D2AC073E78DFC9211120E7C35607473A0620A7CAD207CDE307F2C334 +:2007C000073600783D0DFACE070707C3C507B67778C9CDE3077E0DFADF070F0FC3D607E67A +:2007E000033CC921BD2135F2EC0736034EF5FCF607F12A2B20C92A2B2023F57CFE21C20A40 +:20080000087DFEBDC20A08212D20222B20F1C922132001060009E5E54E234679B0CA260828 +:20082000215C0FCD330DE12B462B4EE3712370C521540FCD330D2A13202323237E32182069 +:2008400021B00FCD9C0CC17C80477D814FE1712370CD590CC28C083A1120CD3B0C3A182094 +:2008600021640FCD9C0CCD340D3A11203DE6030707473A18203DB007070707F609470E05A7 +:20088000C35B0D2A0000000000000000CD830C22152001280ACD5B0D21440ECDE80DE93E8C +:2008A000FF32E82111613E21540ECDC90D1321FF0EEFCDC90D13CD910DE60321180FCD9C3D +:2008C0000CCDC90DAF32E8212A152011E021CD4A0D11D4041A13A7CAE608F52A1520CD391B +:2008E0000DF1DFC3D4082A152011E021CD390D2A132036003A0620A7CA26093A1120F53ACB +:20090000072032112021A00FEF7EA7CA1B09212620CD8E0C7E3C2777CDCA0C21112035C269 +:200920000509F13211202112203506190E1F3A11205FCD590CBBC24809AFCD3B0CCD830C98 +:20094000C50608AFCDDF0CC10DF22E0905F22C093E043217203A1220321920321A20211A11 +:2009600020E77E21A00FCD9C0C7EA7CA5E092A0E203A1A20CD9C0CCDE90C21192035C25EA5 +:20098000093E1EDF21172035C25509110040210EFFCD110DC9110040210EFFCD110D114078 +:2009A0003E21B800CD110D114027211AFFCD110D21402706B8CDDD0C215F2706B8CDDD0C81 +:2009C00021BD2101C102CD14050E1F1E0F06007BCD3B0C06187BCD3B0C0DF2CD0906180ED1 +:2009E000007BCD3B0C0E1F7BCD3B0C05F2DF093A0620A7CA080A3EFF32E821210820110F09 +:200A000025CDE503AF32E8213C3217203A10203211203A0720F52A0E20EFE5E5CDE90C2156 +:200A20006C0FEFE301610109EBE1CDC90DCDCA0C21800FEFD113CDC90D3A172021C00FCD97 +:200A40009C0CEB21A00FEF36012336013A0920FE01C2550A3523232373237223424BE521D4 +:200A6000A80FEFEBE17323723A1120CD3B0C21172034211120E7F13DC2150A3A0720321204 +:200A8000203A072032172021A00FEF110400195E2356234E234678B1CAD40A78BAC2B00A4F +:200AA00079ABC2B00A772B7721122035C2D40AC9E5CD830CD5C50608AFCDDF0CC1D178BA78 +:200AC000CDE50A4779BBCDE50A4FE1702B7121540FCD330D211120E721172035C2870A3EFF +:200AE00006DFC3810AC8DAEB0A3DC93CC9C93A1120321A20CD20053ABF21A7C83A0620A7FF +:200B0000CAF40A3A1A2021A00FCD9C0C7EA7CA350BE5010600097E23B6E1CA350B237EA7A6 +:200B2000CA350B2BCD3C0B21640FCD9C0CE5CD830CD1CD390D211A20E7C3F40A235623E5BA +:200B4000235E234E23467AA7C2AB0BAF321B2032212021E92134D51E05CDCF0BD121E92118 +:200B6000352121207EA7CA960B21E921F5CD8E0CF135F2800BCD910DE60FC60A77C38F0B20 +:200B8000212120577B5A23BECAA70B15C2860B2121207EC39E0B211B207EA7CAA70BCDB438 +:200BA0000CCD910CE123C9E1237EC9CDCD0BE17E23A2577BC8FE037ADAC40B1E001C0FD205 +:200BC000BD0B7BC91E091D07D2C60B7BC91600CDDD0B04CDE80B0505CDE80B04C90CCDE8F0 +:200BE0000B0D0DCDE80B0CC93AE921A7C2FD0BE5CD590C7AC2F90BF6800757E1C93DC2357D +:200C00000C1DCD590CC0211B20347ECD910C7321E921347B1600FE03DA210CCDD20BC32445 +:200C20000CCDDD0B21E921357AA7C8212120347ECD910C73C9CD590CC014C9E5D5F5CD6B3A +:200C40000C7EDA500CE60F5FF107070707C3540CE6F05FF1B377D1E1C9E5D5CD6B0C7EDA2F +:200C6000660C0F0F0F0FE60FD1E1C978070707075FE601577BE6F05F791FF5B35F21EE21A6 +:200C800019F1C9F579C6406F78CE2667F1C93A1120D55F160019D17EC93A112007D55F166F +:200CA00000195E2356EBD1C93A0720BECAB10C34C93601C9E5D5F5CD910D5F1600626AF1D0 +:200CC000193DC2C00C7C3CD1E1C92A0E20EF01650109E5212620CD8E0CD1C3E5033EFF11C9 +:200CE0002000771905C2E20CC911400119111900060C7EEEC077230E067E2F77230DC2F936 +:200D00000C7EEE03771905C2F20CC911004021E000444C7D21000039EBF3F9C5C5C5C5C5D1 +:200D2000C5C5C5C5C5C5C5C5C5C5C53DC21B0DEBF9FBC9EFE5CD830CD106080E201A13778C +:200D4000780600093D47C23D0DC906080E207E1213780600094705C24E0DC93A0620A7C84C +:200D60002A04207EA7C07932032078D301C93A0620A7C82A04207EA7EB220420C932BE2110 +:200D8000C5D5E5CD20053ABE21A7C2830DE1D1C1C9E5C5210A2006087E070707AE17172101 +:200DA0000A207E1777237E1777237E1777237E177705C2990DC1E1C9CDD40D7ECD4C047ED1 +:200DC000A723F2BB0DC9CDD40D7ECD00047EA723F2C90DC9211A0E7ACD9C0CE5214C0ECD8B +:200DE000E80D7BCD9C0CD1C9DB02070707E603C39C0C06123E0948D301F5C5CD2005C1F155 +:200E00000DC2F70DC610D2F60D05C2F40D3E0AD301C901010101020102010028402A002EDD +:200E20004034613E6C0E7A0E8A0ED50E5E0E620E620E670EF40E1B00FA0E230028060010DB +:200E4000031006109F0809100C100F10240E201040106010504C415945D257494ED30854E2 +:200E600049C50847414DC5084F5645D207544F4053544152544047414DC508594F5540481F +:200E8000415645404352454449D40350524553534031404F52403240504C41594552404218 +:200EA0005554544F4E2325494E53455254404144444954494F4E414C40434F494E25254669 +:200EC0004F524033404F52403440504C415945524047414DC54050524553534031403240D2 +:200EE00033404F52403440504C4159455240425554544FCE0643484543CB04494E53455258 +:200F0000D4090F0C0F0F0F140F4F4EC55457CF54485245C5464F55D2200F2E0F3D0F470FEB +:200F200042495445534054484540445553D44D4545545340484953404D414B45D243484577 +:200F4000434B53404F55D450524F4E4F554E43454440444541C4460350035A036403FC01D0 +:200F6000060210021A02B404BC04C404CC04760F790F7C0F7F0F3A3ADB3B3BDC3C3CDD3DD2 +:200F80003DDE8A0F900F960F9C0F5F60613E62E35F60613E64E55F60616667E85F60613E31 +:200FA00069EAC021C821D021D8211E17011715170B1700FF0001FF000100C80FC80FCC0F06 +:200FC000D20F1B0B040B0E040F1300241824002407241824002407241124182414091419D2 +:200FE0001429143900F00000140405A90519057900320000000000000000000000000000E3 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/d.cpu b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/d.cpu new file mode 100644 index 00000000..c1388277 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/d.cpu differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/deluxe.bin b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/deluxe.bin new file mode 100644 index 00000000..7ceb85ca Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/deluxe.bin differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/e.cpu b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/e.cpu new file mode 100644 index 00000000..58e11b22 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/e.cpu differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/f.cpu b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/f.cpu new file mode 100644 index 00000000..ce731b30 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/f.cpu differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/g.cpu b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/g.cpu new file mode 100644 index 00000000..742933f3 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/g.cpu differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/galxwars0.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/galxwars0.hex new file mode 100644 index 00000000..56d895e4 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/galxwars0.hex @@ -0,0 +1,257 @@ +:10000000310022C3D0010000E52601C35E000000DC +:10001000E52602C35E003C4299A5A581423C00044E +:10002000C3E3A60000000000000000000000000084 +:10003000C3E3A60000000000F3E5D5C5F50F0F0FE0 +:10004000E61E5F1600215000195E2356EBF1F5E91C +:10005000F20001010A010A01370100006401D5C55F +:10006000F57C21D72306081104000E00F5A623CA4B +:10007000760035CA7F00F11905CA9000C36C002BC9 +:1000800036002B3603AFB9C28B00482323C376005A +:10009000AFB1CAEC003A002047CD6E017EFE02C22D +:1000A000AC003E0891B8F2EC00C3520131D623FBFC +:1000B000060021D6230E081105007EFE02F2C900BB +:1000C00004190DC2BA00C3A001F3783200207E36B5 +:1000D000022346360023235E2356EBFE04C2E100D2 +:1000E000E9F9FE02CAEC0078C1C3ED00F1C1D1E12B +:1000F000FBC9CD6E01360423772323712370C346D9 +:1001000001CD6E01772377C3EC00CD6B01237E36E2 +:1001100000FE80CAE800F1F5E60F7723702B2B363E +:1001200001AF01030009EB21000039EB732372FEDC +:1001300001C2AC00C35E01CD6E017E233680FE019C +:10014000C2EC002B36033A002047F1F5E60FB8F277 +:10015000EC0032002078CD6E013E01C32201CD6B50 +:1001600001C3CE00CD6B0177C3AC003A002021D68D +:1001700023110500E60FC8193DC3740131D62321B0 +:1001800000201100203600231B7AB3C285013E07F0 +:10019000010004FFC3AC00FF235804C2AB01EBCD48 +:1001A000D3062A97017EFE20DAB0002A9901064B79 +:1001B000AFAE2305C2B1012ABF01BDCAB0003E17D0 +:1001C000FFC3B0003E08C33702FE44C2D3013E1055 +:1001D000DB00FE40CA7C01C30000C33702FE50C2F0 +:1001E000E7013E42C33702FE42C22E0221571A7E69 +:1001F000F6C2771A13FE30DA9401FE3AD29401E681 +:100200001A7723130B79B0C20002C9160072230BB0 +:1002100079B0C20D02C9C51A771301200009C105C2 +:10022000C21602C90601C32A021AC5E526006FD507 +:10023000E52929D11911F00219EBE1E301200009A8 +:100240000605CD160201400009D113C105C22902DD +:10025000C90E001A810E0086FE0AFA60020CD60A48 +:100260001205C81B2BC353020E001A910E0096F202 +:1002700075020CC60A1205C81B2BC36A0246234E20 +:10028000AFB9C8235E235623EBB8C29602C541CD51 +:100290002902C1C3A402C53E23FF0601CD2902C124 +:1002A0000DC29602EBC37F020E00112000711905EA +:1002B000C8C3AD02112000E57872233DC2B902E146 +:1002C0000DC819C3B702051AB7C2D702C53E26CD5D +:1002D0002402C105C2C70204C32902C5E51A771367 +:1002E000230DC2DD02012000E109C105C2DB02C904 +:1002F0003E4141413E00217F0100234549493142B1 +:10030000414959660C14247F04725151514E1E29E3 +:10031000494946404748506036494949363149497C +:100320004A3C1F2444241F7F494949363E414141EC +:10033000227F4141413E7F494949417F48484840E9 +:100340003E414145477F0808087F00417F41007DCD +:100350000000007D7F081422417F010101017F2000 +:1003600018207F7F1008047F3E4141413E7F48486E +:1003700048303E4145423D7F484C4A313249494927 +:100380002640407F40407E0101017E7C0201027CCC +:100390007F020C027F631408146360100F10604327 +:1003A00045495161001C2241000041221C0000000F +:1003B000000000141414141422147F142220404D41 +:1003C000502008080808080922881A3A5C1A3D32A9 +:1003D0005C1AC2BE03CD4007CDEE073A571AE6FEBF +:1003E00032571A3A5D1AB7CA0904215F1A22741AE1 +:1003F000CD8C0D79E602CA0304CD040DAF325D1A2F +:10040000317022FB014304AFFFCD3B04DB010FD26F +:100410000904CD3B04DB010FDA1204DB02073E01C5 +:10042000D224043CCD27433A012007DA09043E8058 +:10043000320120AF01E504FFC30904D3063E2306C1 +:1004400002FFC931C023FBAF322620320120D30383 +:10045000D305321E20321F20CDBD42CDD742DB0056 +:10046000211B09BECA6A043E17FFF521A72C1116ED +:10047000000608CD1602F10F0FF60E21072ECD242F +:1004800002060811900421072FCD2902C398041EEB +:1004900017121F0E1B1C0A1521A546CD7D023E22F8 +:1004A0000680FF218E46CD7D023E220660FF060CAF +:1004B00011AE4621122CCD290221BA46CD7D022152 +:1004C000CF46DB0207D2CB0421FA46CD7D023E2285 +:1004D0000600FFCD2A4221E80B2227202142442298 +:1004E0002420C3C20531C023FBCD8943AF322B206A +:1004F000322620D303D305321E20321F203A022099 +:10050000B7C20A05320120C34304CDD74206041105 +:100510001047211330CD29023E220603FF210F2868 +:100520003A02203D0614C24005112847CD2902DBBE +:1005300001E604CA18053E81CD27433E02C3540597 +:10054000111447CD2902DB01E602CA2F053E82CDF8 +:1005500027433E8332192021FF2334210B20010C35 +:1005600000CD0B02CDBD42CD2A4221E80B2227202F +:100570003A192007DA7F050630211D38CDA8023E42 +:1005800020321E20D3033A1F20E620321F20D3053D +:10059000CDD742CDA943060E21112B3A1F20E620CC +:1005A000C2B005111D260E0AD5C5113C47C3BA05B8 +:1005B000111D380E0FD5C5114A47CD2902C1E1CD15 +:1005C000E343CDD742CDA943011CE0210224CDAAAB +:1005D00002CD1642117E44010500C521C020CD0088 +:1005E0000211834421C520C1CD00022172441E06A0 +:1005F0003E014E234623FF3C1DC2F2053E2206204B +:10060000FF31C023FBCDA94306603E22FF01050058 +:10061000C5117E4421C020CD0002C111834421C5F3 +:1006200020CD0002210000221720AF322020CDE291 +:10063000413E013226203A012007D24707CD8F42A2 +:10064000E6706F26012217203A2020B7C216093A19 +:1006500017204FE610CA6A063E0132202021C02032 +:10066000CD044441CDA802C3160979E640CA7606F6 +:10067000CD7541C38B0679E620CA8206CDA641C35B +:100680008B06210000221A20221C2021C020CD042C +:100690004441CDE7401167452AC7200607CD944362 +:1006A000CD3A412AC220EB2A1A201922C2207D21EC +:1006B000CD44E620CABA0621E54422C0202AC7203C +:1006C000EB2A1C201922C72021C020CD044441CD93 +:1006D000D04021C520CD044441CD9443CD1841B72D +:1006E000C267072A1A207DB4C2FD0621C520CD04A9 +:1006F0004441CD9443CD4F4179B7C267073E2206AE +:1007000005FF3A2020B7CA36073AC720FED8DA36A6 +:100710000721C520CD044441CD8B40CD9A42AF3254 +:1007200026203E2206A0FF212B20347EFE05DA087B +:10073000063600C339083A012007DA3606211820A8 +:1007400035CA3606C348062A24204E2346233E4493 +:100750002F573E722F5FEB19EBD25F0721424422E5 +:1007600024206960C34506AF322B203226203A2070 +:1007700020B7CADF073AC720FEB0DA930721C520A9 +:10078000CD044441CD8B40CD9A423E0501B20CFFD1 +:100790003E60FF31C023FBCD9A421100FC2AC720E6 +:1007A0001922C72021754522C5203E1032C92021BB +:1007B000C520CD044441CD920F3A1E20F604321ECE +:1007C00020D3033E220620FF3A1E20E6FB321E20E5 +:1007D000D30321C520CD044441CD8B40C32708213C +:1007E000C520CD044441CD8B403A1E20F604321E74 +:1007F00020D3030E0CC57911FD440FD20108112D31 +:10080000452AC220010218CDDB023E220609FFC1A3 +:100810000DC2F5073A1E20E6FB321E20D3032AC282 +:1008200020011802CDB4023A012007DA3908CD8937 +:10083000433E220680FFC3430421612035CAAD0830 +:100840003A19204F07D256083A1F20E62079C25E97 +:1008500008E601C263083E2206A0FFC30106E602C5 +:10086000CA5608CD8943AF321E20D3033A1F20E673 +:1008700020321F20D305CD60423A1F20E620F5CC60 +:10088000AF42C4B642011000CD0002F1CCB642C462 +:10089000AF42EB011000CD00023E220680FF3A1F5E +:1008A00020E620EE20321F20D305C37F05CDA943CB +:1008B000CD8943AF321E20D3033A1F20E620321FDA +:1008C00020D3053A1F20E620C2D6083A1920E6FDBB +:1008D000210B20C3DE083A1920E6FE21112032192F +:1008E00020CD02433A192007D20809216647CD7D61 +:1008F000023A1F20E6200707073C210339CD2402D6 +:100900003A1920E603C26608215847CD7D023E22EF +:1009100006E0FFC3E5043A17204FE640CA2509CD9B +:100920007541C3370979E620CA3109CDA641C337DD +:1009300009210000221C203E01321C202AC7201160 +:10094000F8001922222021C520CD044441CD8B403E +:10095000CDD5412A22200605CD660F2A1C20EB2A80 +:10096000C7201922C7202A22201922222021C5208F +:10097000CD044441CD3640F53A1720E610CAC009EF +:100980003A1E20F601321E20D3033A21203CE60114 +:10099000322120CDD5412A22200605CD3C0FF1B7CA +:1009A000C267073AC820070E21D2AD090C3A1720BA +:1009B000E61079C2B9090606FF790602FFC30207ED +:1009C0003A1E20E6FE321E20D30311AE03C3960961 +:1009D00031C023FBCD8943216020347EFE21CC1D14 +:1009E0000AFE0FCC2C0AFE03CC470AFE07CC3E0AB7 +:1009F000FE0ACC350A118C44216420014100CD004F +:100A000002CD1642011000213020CD0B023E2206FD +:100A100060FFC3C2053E220660FFC3D742CD150A60 +:100A2000211D46CD7D023E220640FFC9CD150A217B +:100A30002B46C3230ACD150A213B46C3230ACD15F5 +:100A40000A214B46C3230ACD150A215B46C3230A5C +:100A5000319023FB3EFF323C20CDB50BB7CA690B6A +:100A60003AC820C38A0A316023FB3EFF323D20C3CF +:100A7000870A313023FB3EFF323E20C3870A310014 +:100A800023FB3EFF323F20CDD40B47213420CD1332 +:100A900044115701B7C2A90A78213020CD1344115F +:100AA0005901B7C2A90AC3690B473A26200FD2C021 +:100AB0000A3A3820FE04D2C30ACDB50BB7C2C30A26 +:100AC000C3690BC5213B203A00204F060009C1E550 +:100AD00078CD344419EB626B0140002B7E09860906 +:100AE000B6E1C2690BE506073A6020FE00CA090BB1 +:100AF00005FE01CA090B05FE02CA090B05FE03CA61 +:100B0000090B05FE0FDA090B0578323B20347EEB2A +:100B100011C9450FDA1B0B11C3452B0603D5E5CDD3 +:100B20001841E1D1B7C2420B7DE61FFE02CA420B5B +:100B30003A3B20473E23FFE50603CD3A41D1E1C3CE +:100B4000E50AC1C5E50603CD3A41E111A0FF19064A +:100B50000811CF45E5D5CD18413E230610FF060804 +:100B6000D1E1CD3A41E13EFF773A26200FDA8E0BF4 +:100B70003E230610FF3A26200FD2700B3A0020FECB +:100B800001C2860B3E0507070707473E23FF3E23AA +:100B90000602FF3A3820FE03DAA00B3E230608FFC8 +:100BA0003A0020FE01CA540AFE02CA6A0AFE03CABB +:100BB000760AC3820A2A3C207CE6F8B7CAD30B7DAA +:100BC000E6F8B7CAD30B2A3E207CE6F8B7CAD30BA7 +:100BD0007DE6F8C9F32A27207EB7C2E20B21E70B96 +:100BE0003E9023222720FBC950D070F0904060E057 +:100BF000A030C08050E0B00031D022FB3A3820B79E +:100C0000C20F0C010C0011A60C213020CD000211E6 +:100C10003320212F20237EB7CA320C3C3C77FEE9DB +:100C2000DA320C3E2377D5E50617211A3DCDA8020E +:100C3000E1D17BBDC2150C113720213320237EB7B3 +:100C4000CA5A0C3D3D77FE22D25A0C3EE877D5E5D4 +:100C50000617215824CDA802E1D17BBDC23D0C3A34 +:100C600039203C32392011DF450FD2700C11F2458A +:100C7000213020D5E54D7EB7CA980CCD344479FE9D +:100C800034DA8A0C7DF618C38D0C7DF61A6F0617C0 +:100C9000CD16023E230603FF2138207DE1D123BD7E +:100CA000C2730CC3F80B386B9ED12C5F92C5080041 +:100CB000000031D022FB06003AC720E604C2CF0C68 +:100CC0003AC720E6F8FEB0CAD10CFEC0CAD10C0665 +:100CD0000178323A203AC7202130201E1AFEC0D2B5 +:100CE000E70C2134201E183AC820C607CD1344B79C +:100CF000C21C0D3AC720E6F8FEC0C2130D3E0132F9 +:100D00003A202134201E183AC820C607CD1344B714 +:100D1000C21C0D3E00019307FFC3F80B7E06007056 +:100D2000CD34447DB36FE50617110746CD1602F3A7 +:100D30003A1F20F610321F20D305FB3E230630FF5A +:100D4000E1E50617CDA802E1E5AF32D4203A6020F4 +:100D5000FE05DA570D3E043C473A3A200FD2660DA5 +:100D6000780F47C3930D3A6020E6034F3A3820814D +:100D7000FE05C2870D3AC720E607FE03D2870D3E67 +:100D80000632D320C3A20DC3CE0F000000003E05E3 +:100D900032D42078E60732D320B7C2A20D3E053206 +:100DA000D420060311D3203AD320B7C2B80D3E2673 +:100DB000CD2402060211D420CD2902C3C10F0000A8 +:100DC00000003A62200FD2020E2A0D203A1F20E6C0 +:100DD00020CAD70D2A132006FDDB02E608CAE20D61 +:100DE00006FB7D80D2020E21612034CDA9433A62F8 +:100DF00020E6FE326220F33A1E20F610321E20D387 +:100E000003FB3E230670FFF33A1E20E6EF321E205E +:100E1000D3033A1F20E6EF321F20D305FBE106186B +:100E2000CDA8023A38203D323820CA360E3E0001A5 +:100E30000106FFC3F80B3E0001D009FF3E60FF3101 +:100E4000A022FBAF21000022292021C800BEC254ED +:100E50000EF617FF2163204E2323CDE50E0DC25A57 +:100E60000E2164207E2307E6FE4F09E53A6020FE4E +:100E700004DA760E3E0306004F210D0F094EE1C540 +:100E800006013E23FFC15E2356E57B0FDACC0EEB55 +:100E9000097CFE3DDA9A0ECD040FEBE1722B73CD87 +:100EA000E50E3A64204F0C3A632091C2C50E2A2900 +:100EB00020B5CABA0EAF6FC3BC0E2E18222920214E +:100EC0006520C3C60E79326420C36B0E21E0FF1982 +:100ED0007CFE25D29A0ECD040F7DFEE4C29A0E212F +:100EE000153DC39A0E5E235623E5EB119B457D0FFE +:100EF000DAF60E119345E52A292019EBE10610CD0B +:100F00001602E1C9E50610CDA802E12BC920406018 +:100F1000802147187E7DE6074F0CCD9443C5E51A26 +:100F20006F26000DCA2B0F29C3230F4C7DE17723B9 +:100F3000712BCD6E41C11305C21D0FC97DE6074F50 +:100F40000CCD9443C5E51A6F26000DCA520F29C374 +:100F50004A0F4C7DE1B6772379B6772BCD6E41C130 +:100F60001305C2440FC97DE6074F0CCD9443C5E578 +:100F70001A6F26000DCA7C0F29C3740F7D4CE12F18 +:100F8000A67723792FA6772BCD6E4113C105C26EAC +:100F90000FC97DE6074F0CCD9443C5D5E51A6F13F5 +:100FA0001A67AF0DCAAC0F2917C3A30FEBE1732368 +:100FB0007223772B2BCD6E41D11313C105C29A0F2B +:100FC000C93A012007D2020ECDE042C3C20D3AC792 +:100FD00020E607FE03D2930DC38E0D08CA0910FE4A +:100FE0007FCA0910FE18CA0110FE20DAC80FFEFEE3 +:100FF000D2C80F7DFEF2CAC80F7E23CDB81EC3C86B +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/galxwars1.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/galxwars1.hex new file mode 100644 index 00000000..d08e4be6 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/galxwars1.hex @@ -0,0 +1,129 @@ +:100000007DE6074F0CCD9443C5D5E51A6F131A67EB +:10001000AF0DCA1A402917C31140EBE1F57BB67743 +:10002000237AB67723F1B6772B2BCD6E41D11313FC +:10003000C105C20800C97DE6074F0CCD9443AFC58A +:10004000D5F5E51A6F131A67AF0DCA52402917C3C9 +:100050004940EBE14F7BA6CA5E40F13E01F57BB61D +:1000600077237AA6CA6B40F13E01F57AB6772379F9 +:10007000A6CA7840F13E01F579B6772B2BF1CD6E0B +:1000800041D11313C105C23F404FC97DE6074F0C54 +:10009000CD9443C5D5E51A6F131A67AF0DCAA540B5 +:1000A0002917C39C40EBE14F7B2FA677237A2FA61D +:1000B0007723792FA6772B2BCD6E41D11313C10552 +:1000C000C29340C91AB67713CD6E4105C2C440C968 +:1000D0000E001AF5A6CADA400E01F1B677CD6E41D0 +:1000E0001305C2D24079C91A2FA677CD6E411305E8 +:1000F000C2E740C9E51A7713231A7713E1CD6E41A1 +:1001000005C2F440C9E51AB67723131AB677E1138E +:10011000CD6E4105C20541C90E00E5CD2E41231328 +:10012000CD2E4113E1CD6E4105C21A4179C91AF5B0 +:10013000A6CA36410E01F1B677C9E51A2FA6772374 +:10014000131A2FA67713E1CD6E4105C23A41C90EAD +:1001500000E51A2FA6CA5A410E0123131A2FA6CA68 +:1001600064410E01E1CD6E411305C25141C9C50183 +:10017000200009C1C93A2020B7C29B413AC320FEE2 +:100180003BDA8E41210000221A20221C20C92120A6 +:1001900000221A20210001221C20C93AC820FEE9B1 +:1001A000D28441C394413A2020B7C2CA413AC32005 +:1001B000FE26C2BD413AC220E6F0CA844121E0FFDA +:1001C000221A202100FF221C20C93AC820FE31DA61 +:1001D0008441C3C3413A2120E601115D45C011624B +:1001E00045C9CDFD4121C020CD044441CDD04021A1 +:1001F000C520CD044441CD9443CD1841C9AF1E4024 +:1002000001200021052FB6091DC20642B7C83E22B3 +:100210000602FFC3FD412160207EFE1BD22542C69F +:1002200005326320C93E20C32142014500118844A4 +:10023000C5D521E020CD0002D1C1214021CD000251 +:10024000DB02E603C60232E1203241210130002107 +:100250003020CD0B02CD8142EB014500CD0002C91B +:100260003A1F20E620F5CC8142C48842014500CDEA +:100270000002F1CC8842C48142EB014500CD00026E +:10028000C911602021E020C9116020214021C93A14 +:100290001F20E620DB01C8DB02C93A1E20E6FE3241 +:1002A0001E20D3032A222011AE030605C3150F1109 +:1002B0003020214020C9113020215020C92166461C +:1002C000CD7D020E00CD60430E05CD60430E0ACDFC +:1002D00060430E0FC3604301E01B210224C3B4023C +:1002E0003A1F20E6201116203E0FC2F242111020C4 +:1002F0003E0AF5D521D520D10606CD5102F14FC3D6 +:100300006043E511052006061ABEDA1843C21643FB +:10031000231305C20843E1C9D1210520010600CD00 +:1003200000020E05C36043472102201778D23443F0 +:10033000E6032F3C86FE63D077781104201F215DF1 +:1003400043DA4743215F4306021717DA5443CD517E +:1003500002C35743CD68020E00C360430001000290 +:10036000060021754309CD044441EB7907D22902E7 +:100370000606C3C602013C0320021D2F0520861D70 +:10038000260B20861D381120863E110606FF3C05EF +:10039000C28D43C9C50E037C1F677D1F6F0DC297B9 +:1003A000437CE61FF62067C1C93A6120210125CDB3 +:1003B00024022101263A0120073A61204FD2C94385 +:1003C00079B7CAD4430DCAD443061811CD44CD160B +:1003D00002C3C5437CFE35D0060111AE03CD160223 +:1003E000C3D4430610C5E50630CDA8023E2206045C +:1003F000FFE1C1C5E5CD60433E220604FFE1C10532 +:10040000C2E543C95E2356D5235E2356234E2346B9 +:10041000EBD1C9C54F06047EB7CA28447996DA28BD +:100420004479D61C96DA3144AF05CA324423C31747 +:10043000447EC1C90F0F0F6FE61FF620677DE6E00F +:100440006FC9402010363018102850101020501856 +:1004500010100010302010185020000850182020D4 +:100460000018301000025040301050103010501062 +:100470001010500A660A720A7E0AF80B3F0ECD442D +:100480006330186745208C070000010000153B0F02 +:10049000270D310B2E0934113D0926142C0D3A0776 +:1004A0002F0F37112D0A3C052C0A270C3F67281502 +:1004B00029143D1333122D102710340E310D290B42 +:1004C0003B083007390633053A1328113500000080 +:1004D000181E1FDADBFAFFDA5B5E5BDAFFFADBDAA3 +:1004E0001F1E180000000000181F1EDBDAFBFEDBD9 +:1004F0005A5F5ADBFEFBDADB1E1F18000020820069 +:100500004190200810040842042102134117207F63 +:1005100014730243008740040914122220434087C9 +:10052000040408E4108220084110822004000080A6 +:10053000004022001008084404220201210B100F81 +:10054000099B00130086081411222247000700644B +:1005500004420888101001000200040000709CEEA4 +:100560009C7060B0D8B06007001E06FC1FFC7FFCCA +:100570001F1E060700480890240210240A09403E66 +:1005800026040CB839040C3A260940240A021090BB +:100590002408090000000000002A223C7E76FFEBC0 +:1005A000727E3C222A0000000000000000000008CB +:1005B0002A2A003C7E76FFEB727E3C002A2A080045 +:1005C000000000D002A005C0088C005A002D009049 +:1005D0000440022801180408005002800420010091 +:1005E00000000004068E4A2F1B1E3A1E1B2F4A8E47 +:1005F00006040000000004062E4E8B4F5AFE5A4F90 +:100600008B4E2E0604000000000489462A1C8841F7 +:10061000222461242241881D2A46890400000A11EF +:100620002D10121F0E261E19261300000B112D0F60 +:100630000A171D0A1C1D120C261300000B112D2079 +:1006400018170D0E1B0F1E15261300000B112D1F62 +:100650000E1B22261018180D26130000061130104C +:1006600018180D261300001A1E251C0C181B0E242A +:1006700001252611122A1C0C181B0E261C0C181BF7 +:100680000E2402250601350C1B0E0D121D000E0452 +:10069000163019150A220B142C100A150A212226CD +:1006A000200A1B1C0000040530010907090012176D +:1006B0001C0E1B1D26260C1812170E10102A2401C2 +:1006C00026181B26022619150A220E1B1C25000EB1 +:1006D000110E2A28012619150A220E1B262601268C +:1006E0000C181217120C2A28022619150A220E1BA2 +:1006F0001C2602260C1812171C000E110E2A2801A7 +:10070000260C18121726022619150A220E1B1C0089 +:10071000191E1C110126181B260219150A220E1B70 +:100720001C260B1E1D1D181718171522260119153A +:100730000A220E1B26260B1E1D1D181719150A222C +:100740002619150A220E1B24012519150A2226191D +:10075000150A220E1B2402250E09162D100A160E4C +:1007600026181F0E1B000E140327100A160E26183B +:100770001F0E1B262619150A220E1B2426250000F3 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/gunfight.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/gunfight.hex new file mode 100644 index 00000000..28fcd1fa --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/gunfight.hex @@ -0,0 +1,130 @@ +:020000040000FA +:200000000000310024C39003E5D5C5F5C3870000E5D5C5F521B9207E2F77A7FAEA00216FCA +:2000200020E5CDBD02CA38001A1377231A1377780E1F0905A7CA2800E1111200197DFEB727 +:20004000C2210021A220E5CDBD02CA76001A13EB73237223EBD3027E12133E03D304DB038D +:20006000B677237E1213AFD304DB03B677780E1F0905A7CA5700E111EEFF197DFE5AC246AC +:200080000021B220C391003AB920A7FA180221AB20CDBD02D5CAB400CDBD02EBD5CDBD02A8 +:2000A000D1CAB400E54B70230DC2A600E10E200915C2A400E1CDBD02CA18021A13D302D5FE +:2000C000E3CDBD025E235623E322BA200600CD2D02E35E235623E3CD2D022ABA20E30C71B6 +:2000E000237023D1732372C318022163207EA7E5F25101237EA7237EFA0301FE70D2080172 +:20010000C35101FE90D25101110C00197EA7CA510111F8FF197ED610FEC0D25101E1E5363E +:20012000A023237E1F1F1F1FE60F4F232323237E321D20D6101F1FE630B11F5F1600213A48 +:200140000F19791F7ED24C011F1F1F1FE60F321C20E1111200193EABBDC2ED002163207ECF +:20016000A7F283013EFF32C420CD5E027E17F67FA677F28301E501090009CD59037323721C +:200180002371E1011200093EABBDC25F012ABE207DB4C29801212A2022C020AF32BD207EC9 +:2001A000A7F2B101CD5E023ABD20A7CCC90222BE20111300193E63BDC2BE01212A203AC0F1 +:2001C00020BDC29F012114207EA7CAD40135C2D401AFD30121092035F20802362221042060 +:2001E0007EA7CAF601C6992777C2F601EB21C42034C29D03EB342103207EA7CA0802C69922 +:200200002777C21802C314022115207EA7CA180235C2180221C52035DB0247DB02B8210600 +:2002200020119E09CC0D04F1C1D1E1FBC97AB3C81A134F1A8032BC201A1347C5E51A13D3AA +:2002400004DB0377230DC23D02AFD304DB0377E101200009C105C23B023ABC2047C9E57EE0 +:2002600023CD80025AE3AE771F1FE3232323CD80022B46E1AE77237EB02BC03EBFA677C93B +:20028000E603477E23864F239623DA970296D297022B2B7156AFC92B2B05C2A7022BAF969D +:2002A00077233E10C3BA022B36002305C2B4023E60C3BA0205C294023E4056A7C9AF5E7794 +:2002C00023567723477AB3EBC9E5010F0009444D2F32BD203E60BA21AB20D2E00221B2202B +:2002E00071237023CD5903732372237123E37EEB210B0019EBE3732372EB1717DA14031767 +:20030000DA3E032B562B5E0104003E8009732372E1AE77C9E13E50BDC8E53E2ABD214903AA +:20032000CA26032151033A0920E60C0F856FD23203245E2356E1E5010D00AFC30C03AF7780 +:20034000237723772377E177C98B0DB10DD70DB10DC722ED221323ED227BE6074F0603AF0A +:200360007A1F577B1F5F05C25F03E521002419EBE1C9F37E2312130DC27303C9D55F160082 +:200380001978462356E1865F232323237E8257C93E08210220060070233DC29703CD5506B8 +:2003A000212108220020FB2A00203AC620A7CAB403219B085E23220020160021AE0919197D +:2003C0005E2356EB11A603D5E9CD1308DB0047DB00B8211720117E09CC0D04DB0147DB017A +:2003E000B8211820118E09CC0D04211C207EA7CA04043600075F160021D609195E2356EB86 +:20040000220020C93A0920FE22F4A705C9AEC84F0601790FDA20044F7807471313C312047F +:2004200078AE77A0EB4E236669E91AE6700F0F0FA7C8321A2021E20E112A20C34F041AE671 +:20044000700F0F0FA7C8321B2021F00E113D204F0600094E2346EB36C0110B001971237067 +:20046000C906FEC268040600212A2036C01105001970C90602C3630406FFC27F040600210F +:200480002A2036C02370C90601C37A0406FEC293040600213D20C36B040602C38E0406FF03 +:2004A000C2A5040600213D20C382040601C3A004C82163207EE680CAC1042175207EE6801D +:2004C000C01112201AA7C0E5EB11A23E011020CDFA043EE2D301112C2001081A3A1A2021D2 +:2004E000FE0ECD7C03E1F336C623712373232323702372FB3E02321420C90A3C02FE06FA8C +:20050000110577472103207E3611A7CA100536027821A40FC3FB05C82187207EE680CA28CB +:20052000052199207EE680C01113201AA7C0E5EB11B83E011120CDFA043ED2D301113F204B +:2005400001F8F63A1B20C3DF04C83E04321420D301210720343A06204FE603BED0360079FC +:200560001F1FE6033C21082086E60777C83A0420A7C03A0820A7C83D32082006603A06202A +:20058000E630CA90054F78C6104779D610C285057832042021C62035210220AF7723772327 +:2005A0002377C9AF3203200E04211E201102201A1F1F1F1FE60FC2BB053E10C63077231A2B +:2005C000E60FF63077062B79FE03C2D605062C1AA7C2D6053640132370230DC2AF053E08A9 +:2005E000211E20110524C3FB052A00207E235E235623D55E235623220020E1F57E23D6302C +:20060000F21406471C7BE61FC20D06141404C20406C3FC05E5D521F809CA2406010A000976 +:200620003DC21F06EB0120003E0AF51A137709F13DC22A06D1E113F13DC2FB05C92A0020B8 +:200640007E23220020320320C92A00207E23220020321520C9F3E10100001100003E1031D7 +:200660000F40C513BAC26206AFD301310024FBE92A00205E2356232200201AE6BF1213AF9A +:2006800012C92A00205E2356EB220020C92A00205E2356230E0FCD7203220020C92A002070 +:2006A0005E2356230E09CD7203220020C92A00205E2356232200201AEE6012C9210E0FAF26 +:2006C000D3023A02203DFAEB06FE02F41907FE05FAD5063E045E235623D55E2356230600C4 +:2006E000E3F5CD2D02F1E13DF2D5063A162047E680C2030778F68032162021220F3A05205A +:20070000C3C5063A1620E640C0F6403216203E04D302AF21360FC3D506E5F52150207EE6BE +:2007200080C22D07EB0E0F21520FCD72033A1620F640321620F1E1C92A00205E2356232268 +:2007400000201A3C2712CDA3052A00205E235623F33E801213137E2312131313131AC60861 +:20076000124E234623220020131313EB71237023AF772377C92A00207ED301237E232200F5 +:2007800020321420C92A00203A1D205E235623220020922E0267CD5903EBE54B70230DC23E +:2007A0009C07E10E200915C29A07C921002111C40B1AA7C87723134F1A13477723C5780645 +:2007C0000009472B1A13D5571E0006087A1F577B175F05C2CC0773D10DC2C307C178060082 +:2007E000094705C2BD07C3B107213F20C3F207212C205E0104000956CD59031B1515152194 +:20080000CE0F3E07C3FB053A0820A7C8218208220020C921C52034C8352A00202B2200207E +:20082000C90413010C610F0A24100F035A0001296D0F0026035A00010B990F143D052A2034 +:20084000C30100004000660BAA8B0D4A0D8B0D035A00066320C6035400FE027800C8034B61 +:2008600000010BA40F143D033C00053D20C2FF400060006627A0C7220021C72203400009FA +:2008800021080127D50F012A052A20C30200004000A00BAA8B0D4A0D8B0D0004130F0A0197 +:2008A00009AF0F0C2E010CB80FA23E052A20C0010000480066139A8B0D870C8B0D053D20F3 +:2008C000C0FFE7A0480066139AC722C321C72206632006000004F800000AC80675200600C3 +:2008E0000004F800000AC806872006000004F800000AC806992006000004F800000AC80313 +:200900001E000109C50F0C2E030A072A20073D20000105A40F0E2E14099B080C05202A20AF +:2009200020FD0D0DC202030F000B2A20105F0E12032D00099B080E6010095D090E60500936 +:200940005D090E6090095D090E7810095D090E9010095D090E9050095D090E90900DB20256 +:200960000917090C02203D20D039230DB202030A000B3D20D09B2311032D00099B08610481 +:200980007304780487042A042A042A04B0048C0499049E04AB043E043E043E0417058407B0 +:2009A0008407840784078407840749056C051308E9053D06490655068D069D067006AD066C +:2009C0008206BC064907380775078507AB070708E907EF07A305C9031B0936093C09420928 +:2009E00048094E0954095A09630900000000000000000000000000003C7E66666666666605 +:200A00007E3C181C1818181818183C3C3C7E66607C3E06067E7E3C7E6660387860667E3CEE +:200A2000666666667E7E606060603E3E06063E7E60667E3C3C3E06063E7E66667E3C7E7E1A +:200A400060703038181C0C0C3C7E66663C7E66667E3C3C7E66667E7C60607C3C103838389C +:200A600038383838387CC0C0C0C0C0C00000C0C00000000000000000C0C00000002040FF03 +:200A800040200000F0C0A09008040201000078FCCCE07030300030300000000000000000B7 +:200AA0000000183C7E6666667E7E66663E7E66663E7E66667E3E3C7E6606060606667E3C46 +:200AC0003E7E6666666666667E3E7E7E06063E3E06067E7E7E7E06063E3E060606063C7E58 +:200AE0006606067676667E3C666666667E7E666666663C3C1818181818183C3C06060606B4 +:200B0000060606067E7EC3C3E7E7FFFFDBC3C3C366666E6E7E7E767666663C7E666666669D +:200B200066667E3C3E7E66667E3E060606063E7E66667E3E766666663C7E66063E7C606641 +:200B40007E3C7E7E181818181818181866666666666666667E3C66666666667E3C3C181811 +:200B6000C3C3C3DBFFFFE7E7C3C366667E3C1818181818180116101818181858781B1A1E3F +:200B80001E9898783818181818181818021B000100038003C007C007601D00318007E01F49 +:200BA000F03D383904418003C007E00FF81F3E2907E90001000900050005081F381B3829BC +:200BC000CC37FE5D0315000500800D00800D00800F00C89F00F8FF00C01780C03F50C07FAE +:200BE00060C01F30801F3800071C800F0EF8FF07FCFF03CEFF01C61F00C61F00C61F00C6B0 +:200C00001F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01700C03F00C0C2 +:200C20007F00C01FC0801F7000073C800F0FF8FF03FCFF01CEFF00C61F00C61F00C61F0034 +:200C4000C61F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01700C03F007C +:200C6000C07F00C01F00801FC0000738800F0CF8FF0FFCFF03CE7F00C61F00C61F00C61F1D +:200C800000C61F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01700C03F3C +:200CA00000C07F00C01F00801F00000708800FF0F8FF1FFCFF0FCEFF00C61F00C61F00C66C +:200CC0001F00C61F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01700C01C +:200CE0003F00C07F00C01F00801F00000700800F00F83F00FCFF01CEFF0FC61F7FC61F000A +:200D0000C61F00C61F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01700D5 +:200D2000C03F00C07F00C01F00801F00000700800F00F83F00FCFF00CEFF01C6FF07C61FB0 +:200D40001EC61F70C61F00FA3F000315000500800D00800D00800F00C89F00F8FF00C01707 +:200D600000C03F00C07F00C01F00801F00000700800F00F83F00FC7F00CEFF01C6FF03C613 +:200D80001F17C61F0EC61F14FA3F20030CF03F00F03F00E03D00C07900C07100C0E100C083 +:200DA000E100E06000707000343400383800F0F000030CF03F00E03F00C01F00C01F00C09F +:200DC0001F00C01F00001E00001C00000C00000D00000E00003C00030CF03F00F03F00E02B +:200DE0001F00C00F00801F00003E00C07C00E07800703000343400383800F0F00003200415 +:200E000000001902007A0100FC00007E0500FE0380FC0340FE0738F9033EF0FF0FA0FF03E6 +:200E200080FF0080FF00C0FF00E0FF00E0FF0170FF0330FE0730FC0F30FE0F30FE0F30F8B2 +:200E40000F20F00700F00700F00700C00700800700000700000300400300800300000F044D +:200E60000BA0000000B0010000B0013C00B0017E00F913FF00FF9FFF81F8C7FF9FFCFFFF7A +:200E8000FFFEFFFFFF0000FF400000002000031C007E0080FF01E0FF07F0FF0FF0FF0FF802 +:200EA000FF1FF8FF1FF8FF1FF8E71FF0C30FF0810FE08107C0810380C301F0FF0FE0FF07D4 +:200EC000E0FF07F4FF2F843C21048120048120068160F7FFEF0681600400200400200400E0 +:200EE000200400204A0D460C870CC40B090D050CC80C86228221C321002145224121042269 +:200F0000061AFF08000CFAFE0316FD0201141328740B3336740B1230740B32368C0B1228DD +:200F20008C0B0C38740B0C2A740B0D30740B0C2A8C0B0C388C0B0F30740B111111526599FD +:200F4000999911111153759999991111115485999999C400747020FFA00AB400008E0E0001 +:200F60000047414B45404040404D53454F4040404040404040404040404040404040404065 +:200F80004040404040404040404040404000002547524C404649474851494C50454F51404E +:200FA000434D494C4040404040404040404040474551404F454144553A3A3A3A3A3A203A0B +:200FC0003A3A3A3A3A4040444F41543B4040474D51404B453B484555404E414F444C454F78 +:200FE0003B2E554D52404841534540434F454449513C00001A4E52504840425251514D4CA1 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/h.cpu b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/h.cpu new file mode 100644 index 00000000..8c16322f Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/h.cpu differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invaddlx.zip b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invaddlx.zip new file mode 100644 index 00000000..a2e07a6d Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invaddlx.zip differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invaders0.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invaders0.hex new file mode 100644 index 00000000..0b16ce9e --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invaders0.hex @@ -0,0 +1,513 @@ +:10000000000000C3D4180000F5C5D5E5C38C00007E +:10001000F5C5D5E53E8032722021C02035CDCD1703 +:10002000DB010FDA67003AEA20A7CA42003AEB2068 +:10003000FE99CA3E00C6012732EB20CD4719AF32E8 +:10004000EA203AE920A7CA82003AEF20A7C26F004F +:100050003AEB20A7C25D00CDBF0AC382003A9320CD +:10006000A7C28200C365073E0132EA20C33F00CD2C +:1000700040173A3220328020CD0001CD4802CD1306 +:100080000900E1D1C1F1FBC900000000AF327220CC +:100090003AE920A7CA82003AEF20A7C2A5003AC1D8 +:1000A000200FD28200212020CD4B02CD4101C382FE +:1000B00000CD8608E57E23666F220920220B20E111 +:1000C0002B7EFE03C2C8003D320820FEFE3E00C269 +:1000D000D3003C320D20C93E0232FB2132FB22C349 +:1000E000E408000000000000000000000000000024 +:1000F0000000000000000000000000000000000000 +:100100002102207EA7C23815E53A06206F3A672003 +:10011000677EA7E1CA360123237E2346E6FE070752 +:10012000075F160021001C19EB78A7C43B012A0BBE +:10013000200610CDD315AF320020C921300019EBB5 +:10014000C93A6820A7C83A0020A7C03A6720673A92 +:10015000062016023CFE37CCA1016F4605C25401B1 +:10016000320620CD7A0161220B207DFE28DA71193A +:100170007A3204203E01320020C916007D21092078 +:1001800046234EFE0BFA9401DE0B5F78C610477BC8 +:1001900014C3830168A7C85F79C6104F7B3DC39520 +:1001A0000115CACD012106203600234E3600CDD9D7 +:1001B000012105207E3CE60177AF21672066C9005A +:1001C000210021063736012305C2C501C9E1C93E18 +:1001D0000106E0210224C3CC142346237986772329 +:1001E000788677C906C011001B210020C3321A216E +:1001F0004221C3F8012142220E0411201DD5062CF4 +:10020000CD321AD10DC2FD01C93E01C31B023E0110 +:10021000C31402AF114222C31E02AF114221328128 +:10022000200102162106283E04F5C53A8120A7C206 +:100230004202CD691AC1F13DC8D511E00219D1C3FE +:100240002902CD7C14C335022110207EFEFFC8FE9A +:10025000FECA810223464FB079C27702237EA7C22D +:100260008802235E2356E5EBE5216F02E3D5E9E141 +:10027000110C0019C34B020504C27D023D05702B11 +:100280007711100019C34B02352B2BC38102E123D8 +:100290007EFEFFCA3B032335C047AF326820326978 +:1002A000203E30326A207836052335C29B032A1A55 +:1002B000200610CD241421102011101B0610CD3261 +:1002C0001A0600CDDC193A6D20A7C03AEF20A7C866 +:1002D000310024FBCDD719CD2E09A7CA6D16CDE765 +:1002E000187EA7CA2C033ACE20A7CA2C033A67204F +:1002F000F50FDA3203CD0E02CD78087323722B2B63 +:100300007000CDE401F10F3E210600D21203062059 +:100310003E22326720CDB60AAF32112078D3053C99 +:10032000329820CDD609CD7F1AC3F907CD7F1AC3E5 +:100330001708CD0902C3F802000000216820360129 +:10034000237EA7C3B003002B36013A1B20473AEFA8 +:1003500020A7C263033A1D200FDA81030FDA8E0350 +:10036000C36F03CDC0170707DA810307DA8E0321B5 +:100370001820CD3B1ACD471ACD39143E0032122039 +:10038000C978FED9CA6F033C321B20C36F0378FEC5 +:1003900030CA6F033D321B20C36F033CE6013215A8 +:1003A000200707070721701C856F221820C36F03E1 +:1003B000C24A032335C24A03C34603112A20CD068D +:1003C0001AE1D0237EA7C8FE01CAFA03FE02CA0AB8 +:1003D0000423FE03C22A0435CA36047EFE0FC0E59C +:1003E000CD3004CD5214E123342323353523353564 +:1003F00035233608CD3004C300143C773A1B20C6A1 +:1004000008322A20CD3004C30014CD3004D5E5C510 +:10041000CD5214C1E1D13A2C20856F322920CD91E3 +:10042000143A6120A7C8320220C9FE05C8C33604A9 +:10043000212720C33B1ACD3004CD52142125201191 +:10044000251B0607CD321A2A8D202C7DFE63DA5338 +:10045000042E54228D202A8F202C228F203A842093 +:10046000A7C07EE601012902C26E0401E0FE218AD6 +:100470002071232370C9E13A321B3232202A3820FE +:100480007DB4C28A042B223820C91135203EF9CD13 +:1004900050053A46203270203A5620327120CD6302 +:1004A000053A7820A7213520C25B0511301B213089 +:1004B000200610C3321AE13A6E20A7C03A8020FE0F +:1004C00001C01145203EEDCD50053A362032702056 +:1004D0003A5620327120CD63053A7620FE10DAE7D5 +:1004E000043A481B3276203A7820A7214520C25B87 +:1004F0000511401B2140200610CD321A3A82203DC2 +:10050000C208053E01326E202A7620C37E06E11124 +:1005100055203EDBCD50053A46203270203A362039 +:10052000327120CD63053A7620FE15DA34053A584B +:100530001B3276203A7820A7215520C25B05115046 +:100540001B2150200610CD321A2A7620225820C9AD +:10055000327F20217320060BC3321A117320060B41 +:10056000C3321A2173207EE680C2C1053AC120FE43 +:10057000043A6920CAB705A7C82336003A7020A7F5 +:10058000CA8905473ACF20B8D03A7120A7CA960544 +:10059000473ACF20B8D0237EA7CA1B062A76204E22 +:1005A0002300227620CD2F06D0CD7A0179C60767A9 +:1005B0007DD60A6F227B202173207EF6807723343C +:1005C000C9117C20CD061AD0237EE601C244062341 +:1005D00034CD75063A7920C603217F20BEDAE205C4 +:1005E000D60C3279203A7B20473A7E2080327B201D +:1005F000CD6C063A7B20FE15DA12063A6120A7C8B8 +:100600003A7B20FE1EDA1206FE2700D2120697322F +:1006100015203A7320F601327320C93A1B20C60810 +:1006200067CD6F1579FE0CDAA5050E0BC3A5050D78 +:100630003A6720676916057EA737C07DC60B6F1520 +:10064000C23706C9217820357EFE03C26706CD7504 +:100650000621DC1C227920217C2035352B35353EC6 +:1006600006327D20C36C06A7C0C37506217920CD54 +:100670003B1AC39114217920CD3B1AC3521422484E +:1006800020C9E13A8020FE02C02183207EA7CA0F44 +:10069000053A5620A7C20F05237EA7C2AB063A82B1 +:1006A00020FE08DA0F053601CD3C07118A20CD0661 +:1006B0001AD02185207EA7C2D606218A207E232338 +:1006C00086328A20CD3C07218A207EFE28DAF90670 +:1006D000FEE1D2F906C906FECDDC1923357EFE1FE8 +:1006E000CA4B07FE18CA0C07A7C006EF2198207E48 +:1006F000A077E620D305000000CD4207CDCB142122 +:100700008320060ACD5F0706FEC3DC193E0132F1E5 +:10071000202A8D20460E0421501D114C1D1AB8CAE6 +:10072000280723130DC21D077E3287202600682963 +:1007300029292922F220CD4207C3F108CD4207C35F +:100740003914218720CD3B1AC3471A06102198205F +:100750007EB077CD7017217C1D228720C33C071106 +:10076000831BC3321A3E01329320310024FBCD7922 +:1007700019CDD60921133011F31F0E04CDF3083A19 +:10078000EB203D2110280E14C2570811CF1ACDF3CB +:1007900008DB01E604CA7F070699AF32CE203AEBA8 +:1007A00020802732EB20CD471921000022F820229B +:1007B000FC20CD2519CD2B19CDD7192101017C3273 +:1007C000EF2022E72022E520CD5619CDEF01CDF50F +:1007D00001CDD10832FF2132FF22CDD700AF32FE4A +:1007E0002132FE22CDC001CD041921783822FC210E +:1007F00022FC22CDE401CD7F1ACD8D08CDD6090093 +:10080000AF32C120CDCF013A67200FDA7208CD1385 +:1008100002CDCF01CDB100CDD1190620CDFA18CD32 +:100820001816CD0A19CDF315CD88093A8220A7CA2A +:10083000EF09CD0E17CD3509CDD808CD2C17CD59E0 +:100840000ACA49080604CDFA18CD7517D306CD0497 +:1008500018C31F0800000011BA1ACDF3080698DB70 +:10086000010F0FDA6D080FDA9807C37F073E01C347 +:100870009B07CD1A02C314083A0820472A0920EB27 +:10088000C386080000003A6720672EFCC921112B9F +:1008900011701B0E0ECDF3083A67200F3E1C21117C +:1008A00037D4FF083EB032C0203AC020A7C8E604C3 +:1008B000C2BC08CDCA09CD3119C3A9080620211C24 +:1008C000273A67200FDACB08211C39CDCB14C3A9F6 +:1008D00008DB02E603C603C93A8220FE09D03EFBCC +:1008E000327E20C93ACE20A7C0211C390620C3CBB6 +:1008F000140E031AD5CDFF08D1130DC2F308C91188 +:10090000001EE526006F29292919EBE10608D30608 +:10091000C339143A0920FE78D02A91207DB4C22927 +:10092000092100063E013283202B229120C9CD11DE +:10093000162EFF7EC9CD10192B2B7EA7C80615DBFE +:1009400002E608CA48090610CDCA09237EB8D8CDE8 +:100950002E09347EF521012524243DC258090610B4 +:1009600011601CCD3914F13CCD8B1ACD10192B2BF5 +:1009700036003EFF3299200610C3FA1821A01DFE52 +:1009800002D823FE04D823C9CDCA093AF120A7C84A +:10099000AF32F120E52AF220EBE17E8327775F2357 +:1009A0007E8A277757237E23666FC3AD097ACDB23F +:1009B000097BD5F50F0F0F0FE60FCDC509F1E60F37 +:1009C000CDC509D1C9C61AC3FF083A67200F21F85F +:1009D00020D821FC20C92102243600237DE61FFEF9 +:1009E0001CDAE809110600197CFE40DAD909C9CDE4 +:1009F0003C0AAF32E920CDD6093A6720F5CDE401B3 +:100A0000F13267203A672067E52EFE7EE6073C77E5 +:100A100021A21D233DC2130A7EE12EFC7723363826 +:100A20007C0FDA330A3E21329820CDF501CD04192E +:100A3000C30408CDEF01CDC001C30408CD590AC2DB +:100A4000520A3E3032C0203AC020A7C8CD590ACA47 +:100A5000470ACD590AC2520AC93A1520FEFFC93ABF +:100A6000EF20A7CA7C0A480608CDFA184178CD7C49 +:100A7000097E21F32036002B772B3601216220C915 +:100A80003E0232C120D3063ACB20A7CA850AAF3234 +:100A9000C120C9D51ACDFF08D13E0732C0203AC0C7 +:100AA000203DC29E0A130DC2930AC9215020C34B98 +:100AB000023E40C3D70A3E80C3D70AE1C372003A60 +:100AC000C1200FDABB0A0FDA68180FDAAB0AC921A6 +:100AD000142B0E0FC3930A32C0203AC020A7C2DAEB +:100AE0000AC921C220060CC3321AAFD303D305CDE5 +:100AF0008219FBCDB10A3AEC20A72117300E04C2AF +:100B0000E80B11FA1CCD930A11AF1DCDCF0ACDB160 +:100B10000ACD1518CDB60A3AEC20A7C24A0B11959A +:100B20001ACDE20ACD800A11B01BCDE20ACD800AAF +:100B3000CDB10A11C91FCDE20ACD800ACDB10A217B +:100B4000B733060ACDCB14CDB60ACDD6093AFF216C +:100B5000A7C25D0BCDD10832FF21CD7F1ACDE401B4 +:100B6000CDC001CDEF01CD1A023E0132C120CDCF63 +:100B700001CD1816CDF10BD306CD590ACA710BAFB2 +:100B8000322520CD590AC2830BAF32C120CDB10A24 +:100B9000CD88190E0C21112C11901FCDF3083AECC1 +:100BA00020FE00C2AE0B2111333E02CDFF08019C96 +:100BB0001FCD5618CD4C18DB0207DAC30B01A01F5E +:100BC000CD3A18CDB60A3AEC20FE00C2DA0B11D5A8 +:100BD0001FCDE20ACD800ACD9E1821EC207E3CE696 +:100BE0000177CDD609C3DF1811AB1DCD930AC30B16 +:100BF0000BCD0A19C39A19130008130E26020E0F03 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000CD741400C5E51AD304DB03B6772313AB +:10141000AFD304DB03B677E101200009C105C205A3 +:1014200014C90000CD7414C5E5AF77237723E1011B +:10143000200009C105C22714C9C51A77130120006D +:1014400009C105C23914C9000000000000000000F5 +:101450000000CD7414C5E51AD304DB032FA677234F +:1014600013AFD304DB032FA677E101200009C105E8 +:10147000C25514C97DE607D302C3471AC5E57E12DB +:1014800013230DC27E14E101200009C105C27C14A2 +:10149000C9CD7414AF326120C5E51AD304DB03F55E +:1014A000A6CAA9143E01326120F1B6772313AFD347 +:1014B00004DB03F5A6CABD143E01326120F1B67704 +:1014C000E101200009C105C29814C9AFC577012008 +:1014D0000009C105C2CC14C93A2520FE05C8FE0288 +:1014E000C03A2920FED847D230153A0220A7C87842 +:1014F000FECED27915C606473A0920FE90D20415D1 +:10150000B8D2301568CD62153A2A2067CD6F152202 +:1015100064203E05322520CD81157EA7CA301536C0 +:1015200000CD5F0ACD3B1ACDD3153E10320320C942 +:101530003E03322520C34A1521032035C02A6420EA +:101540000610CD24143E04322520AF32022006F7C7 +:10155000C3DC19000E00BCD49015BCD0C6100CC35F +:101560005A153A092065CD54154105DE106FC93A68 +:101570000A20CD5415DE1067C93E01328520C345CF +:101580001578070707808080813D6F3A672067C91B +:101590000CC610FA9015C93A0D20A7C2B71521A4A0 +:1015A0003ECDC515D006FE3E01320D207832082012 +:1015B0003A0E20320720C9212425CDC515D0CDF102 +:1015C00018AFC3A91506177EA7C26B162305C2C79D +:1015D00015C900CD7414E5C5E51AD304DB037723E0 +:1015E00013AFD304DB0377E101200009C105C2D7A3 +:1015F00015E1C9CD11160100377EA7CAFF150C23CE +:1016000005C2F91579328220FE01C0216B20360116 +:10161000C92E003A672067C93A1520FEFFC0211085 +:10162000207E2346B0C03A2520A7C03AEF20A7CAA3 +:1016300052163A2D20A7C24816CDC017E610C83E54 +:1016400001322520322D20C9CDC017E610C0322D21 +:1016500020C921252036012AED20237DFE7EDA6374 +:10166000162E7422ED207E321D20C937C9AFCD8BD6 +:101670001ACD10193600CDCA092311F5201ABE1B48 +:101680002B1ACA8B16D29816C38F16BED298167E06 +:101690001213237E12CD50193ACE20A7CAC91621A3 +:1016A000032811A61A0E14CD930A2525061B3A67A6 +:1016B000200FDAB716061C78CDFF08CDB10ACDE7AA +:1016C000187EA7CAC916C3ED0221182D11A61A0E3D +:1016D0000ACD930ACDB60ACDD609AF32EF20D30595 +:1016E000CDD119C3890B310024FBAF321520CDD8E1 +:1016F000140604CDFA18CD590AC2EE16CDD7192119 +:101700000127CDFA19AFCD8B1A06FBC36B19CDCAD1 +:1017100009237E11B81C21A11A0E04471AB8D2273A +:101720001723130DC21C177E32CF20C93A2520FE85 +:1017300000C2391706FDC3DC190602C3FA180000FF +:10174000219B2035CC6D173A6820A7CA6D172196CA +:101750002035C02198207ED3053A8220A7CA6D1774 +:101760002B7E2B772B36013E04329B20C93A9820E2 +:10177000E630D305C93A9520A7CAAA1721111A1134 +:10178000211A3A8220BED28E172313C385171A322C +:1017900097202198207EE630477EE60F07FE10C294 +:1017A000A4173E01B077AF32952021992035C006AD +:1017B000EFC3DC1906EF2198207EA077D305C9007E +:1017C0003A67200FD2CA17DB01C9DB02C9DB02E688 +:1017D00004C83A9A20A7C03100240604CDD60905D2 +:1017E000C2DC173E01329A20CDD719FB11BC1C2157 +:1017F00016300E04CD930ACDB10AAF329A2032933F +:1018000020C3C9162184207EA7CA0707237EA7C04C +:101810000601C3FA1821102811A31C0E15CDF308D8 +:101820003E0A326C2001BE1DCD5618DA3718CD4461 +:1018300018C32818CDB10A01CF1DCD5618D8CD4CEC +:1018400018C33A18C50610CD3914C1C9C53A6C2061 +:101850004FCD930AC1C90AFEFF37C86F030A670359 +:101860000A5F030A5703A7C921C22034234ECDD9EA +:1018700001473ACA20B8CA98183AC220E6042ACCCE +:1018800020C288181130001922C72021C520CD3B65 +:101890001AEBC3D3150000003E0132CB20C9215002 +:1018A0002011C01B0610CD321A3E023280203EFFAE +:1018B000327E203E0432C1203A5520E601CAB818D3 +:1018C0003A5520E601C2C0182111333E2600CDFF53 +:1018D00008C3B60A3100240600CDE601CD56193EF4 +:1018E0000832CF20C3EA0A3A672021E7200FD0232D +:1018F000C906023A82203DC004C93A9420B032940D +:1019000020D303C9210022C3C301CDD814C3971526 +:1019100021E7203A67200FD823C90E1C211E24116D +:10192000E41AC3F30821F820C3311921FC20C33184 +:10193000195E2356237E23666FC3AD090E0721016E +:101940003511A91FC3F3083AEB2021013CC3B209AA +:1019500021F420C33119CD5C1ACD1A19CD2519CD2A +:101960002B19CD5019CD3C19C34719CDDC19C371C2 +:10197000163E01326D20C3E616CDD719CD4719C3E7 +:101980003C1932C120C98B19C3D60921032811BEC5 +:10199000190E13C3F308000000003A1E20A7C2ACC2 +:1019A00019DB01E676D672C03C321E20DB01E676FA +:1019B000FE34C0211B2E11F70B0E09C3F3082813A8 +:1019C0000008130E26020E110F0E110013080E0D43 +:1019D000283E0132E920C9AFC3D319003A9420A0B0 +:1019E000329420D303C9210127CAFA1911601C06B9 +:1019F000104FCD3914793DC2EC190610CDCB147CB3 +:101A0000FE35C2FA19C9217220461AE680A8C037ED +:101A1000C9322B241C16110D0A08070605040302FF +:101A200001342E27221C181513100E0D0C0B09075C +:101A300005FF1A77231305C2321AC95E2356237E87 +:101A4000234E2346616FC9C506037C1F677D1F6F48 +:101A500005C24A1A7CE63FF62067C1C92100243638 +:101A600000237CFE40C25F1AC9C5E51AB67713236E +:101A70000DC26B1AE101200009C105C2691AC9CD66 +:101A80002E09A7C8F53D77CDE619F1210125E60F0E +:101A9000C3C50900000000FFB8FE201C109E0020F6 +:101AA0001C30100B080706000C04260E1504112626 +:101AB000260F0B001804112426251B260E11261CA8 +:101AC0000F0B001804111226011413130E0D260E0D +:101AD0000D0B18261B0F0B001804112626011413DA +:101AE000130E0D262612020E1104241B25260708AC +:101AF0003F12020E11042612020E1104241C252688 +:101B00000100001000000000027838783800F8006A +:101B10000080008E02FF050C601C203010010000C8 +:101B2000000000BB030010901C2830010400FFFFE0 +:101B30000000027604000000000004EE1C00000318 +:101B4000000000B604000001001D04E21C000003B8 +:101B50000000008206000001061D04D01C000003E6 +:101B6000FF00C01C00001021010030001200000026 +:101B70000F0B0018260F0B00180411241B25FC0066 +:101B800001FFFF00000020641DD0291802541D0031 +:101B90000800060000014000010000109E00201C0B +:101BA000000304781413081A3D68FCFC683D1A0011 +:101BB000000001B898A01B10FF00A01B000000004F +:101BC0000010000E05000000000007D01CC89B0399 +:101BD0000000030478140B193A6DFAFA6D3A1900F3 +:101BE00000000000000000000001000001741F0060 +:101BF0008000000000001C2F00001C2700001C3982 +:101C0000000039797A6EECFAFAEC6E7A79390000D4 +:101C1000000000781DBE6C3C3C3C6CBE1D78000092 +:101C200000000000193A6DFAFA6D3A190000000040 +:101C30000000387A7F6DECFAFAEC6D7F7A3800009C +:101C40000000000E18BE6D3D3C3D6DBE180E00003C +:101C5000000000001A3D68FCFC683D1A000000000E +:101C600000000F1F1F1F1F7FFF7F1F1F1F1F0F0061 +:101C7000000401130307B30F2F032F4904030001CE +:101C8000400805A30A035B0F27270B4B408411482C +:101C90000F993C7E3DBC3E7C99271B1A260F0E08EF +:101CA0000D13122812020E110426000315000D0256 +:101CB00004261300010B04280210203013080B1314 +:101CC0000008492214814200428114224908000080 +:101CD00044AA1088542210AA442254884A15BE3FB0 +:101CE0005E2504FC0410FC1020FC2080FC8000FE1B +:101CF0000024FE1200FE0048FE900F0B0029000099 +:101D00000107010101040B01060301010B0902088F +:101D1000020B04070A050205040607080A060A035F +:101D2000FF0FFF1FFF3FFF7FFFFFFCFFF8FFF0FFEC +:101D3000F0FFF0FFF0FFF0FFF0FFF0FFF8FFFCFF17 +:101D4000FFFFFFFFFF7FFF3FFF1FFF0F0510153055 +:101D500094979A9D1005051015101005301010105D +:101D60000515100500000000040C1E373E7C747E33 +:101D70007E747C3E371E0C0400000000002200A58B +:101D80004008983DB63C361D104862B61D98084282 +:101D900090080000261F1A1B1A1A1B1F1A1D1A1A58 +:101DA00010203060504848484040400F0B00181247 +:101DB0000F0002042626080D1500030411120E2C34 +:101DC000681D0C2C201C0A2C401C082C001CFF0E2B +:101DD0002EE01D0C2EEA1D0A2EF41D082E991CFF64 +:101DE0002738260C181213041118271D1A260F0E57 +:101DF000080D1312271C1A260F0E080D13120000CF +:101E0000001F2444241F0000007F49494936000078 +:101E1000003E414141220000007F4141413E00001F +:101E2000007F494949410000007F48484840000080 +:101E3000003E414145470000007F0808087F000040 +:101E40000000417F4100000000020101017E00000E +:101E5000007F081422410000007F01010101000001 +:101E6000007F2018207F0000007F1008047F000002 +:101E7000003E4141413E0000007F4848483000009C +:101E8000003E4145423D0000007F484C4A31000081 +:101E900000324949492600000040407F4040000090 +:101EA000007E0101017E0000007C0201027C000036 +:101EB000007F020C027F000000631408146300001E +:101EC0000060100F106000000043454951610000A0 +:101ED000003E4549513E00000000217F0100000006 +:101EE000002345494931000000424149596600003C +:101EF000000C14247F04000000725151514E000068 +:101F0000001E294949460000004047485060000033 +:101F10000036494949360000003149494A3C000031 +:101F200000081422410000000000412214080000B3 +:101F3000000000000000000000141414141400003D +:101F40000022147F14220000000304780403000020 +:101F5000241B260E11261C260F0B00180411122517 +:101F60002626281B260F0B0018041126261B2602E6 +:101F70000E080D260101000001000201000201000F +:101F800060100F106030181A3D68FCFC683D1A00A4 +:101F9000080D120411132626020E080D0D2A501FDB +:101FA0000A2A621F072AE11FFF02110403081326F1 +:101FB0000060100F106038193A6DFAFA6D3A190086 +:101FC0000020404D50200000000000FFB8FF801F9F +:101FD000109700801F000001D022201C10940020C8 +:101FE0001C281C260F0B0018041112261C26020E9A +:101FF000080D120F14120726000808080808000030 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invadpt20.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invadpt20.hex new file mode 100644 index 00000000..e9eda7fe --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invadpt20.hex @@ -0,0 +1,513 @@ +:10000000000000C38F160000F5C5D5E5C3830D00C1 +:10001000F5C5D5E53E8032722021C02035CDF515DD +:10002000DB010FDA70003AEA20A7CA4B003AEB2056 +:10003000FE09CA4700C6012732EB203ACC20C60190 +:100040002732CC20CD0517AF32EA203AE920A7CAE3 +:100050008A003AEF20A7C275003AEB20A7C26600DB +:10006000CDAE0CC38A003A9320A7C29400C34508C2 +:100070003E01C34800CD6915CD83433A322032801A +:1000800020CD0F01CD8E02CDFC0A3AB920A7C4695C +:1000900015CD2D1921EB207E2ECCBEC20300E1D15F +:1000A000C1F1FBC9AF3272203AE920A7CA8A003AEF +:1000B000EF20A7C2BD003AC1200FD29400CDEC4280 +:1000C000212020CD9102CD5F01C39400CD6C0AE5C3 +:1000D0007E23666F220920220B20E12B7EFE03C2C5 +:1000E000E3003D320820FEFE3E00C2EE003C320D31 +:1000F00020C93E0232FB2132FB22C3CA0AF378D365 +:1001000005060A0E000DC2050105C20301FBC92147 +:1001100002207EA7C28A12E53A06206F3A6720675E +:100120007EA7E1CA440123232346E6F60707075FBB +:10013000160021011C19EB78A7C459010610CD49FE +:1001400001CD9613AF320020C92A0B203A6B20A7AD +:10015000C87CFE30D004251BC921400019EBC93AE8 +:100160006820A7C83A0020A7C03A6720673A06204F +:1001700016023CFE37CCBF016F7EA77DCA720132EA +:100180000620CD980161220B207DFE28DA37177AF0 +:100190003204203C320020C916007D21092046236C +:1001A0004EFE0BFAB201DE0B5F78C610477B14C31C +:1001B000A10168A7C85F79C6104F7B3DC3B3011585 +:1001C000CA13022106203600234E3600CD1F02211D +:1001D00005207E3CE60177AF21672066C92121001A +:1001E00021062CD306E5CDF907C5164001101EA740 +:1001F000CAFD01FE11D40F02033DC2F8010A5FC11E +:10020000E1CDB217060B3E05772305C20802C936B9 +:10021000097EC9E1C93E0106E0210224C31112236F +:10022000462379867723788677C906C011001B217B +:100230000020C3B217214221C33E022142220E04F4 +:10024000111C1DD5062CCDB217D10DC24302C93EDB +:1002500001C361023E01C35A02AF114222C36402CC +:10026000AF1142213281200102162106283E04F5F9 +:10027000C53A8120A7C28802CDE917C1F13DC8D592 +:1002800011E00219D1C36F02CDC111C37B0221104D +:10029000207EFEFFC8FEFECAC70223464FB079C2C9 +:1002A000BD02237EA7C2CE02235E2356E5EBE521E5 +:1002B000B502E3D5E9E1110C0019C391020504C2AE +:1002C000C3023D05702B7711100019C39102352B25 +:1002D0002BC3C702E1237EFEFFCA88032335C04734 +:1002E000AF3268203269203E30326A2078360523EA +:1002F00035C2EB032A1A200610CDB911CD101221F8 +:10030000102011101B0610CDB2170600CD5C173A55 +:100310006D20A7C03AEF20A7C8310024FBCD5817A5 +:10032000CD170BA7CA5314CDA5167EA7CA7C033AD6 +:10033000CE20A7CA7C033A6720F50FDA8203CD549A +:10034000023A0820472A0920EBCD6C0A7323722B4E +:100350002B70CD2A02F10F3E210600D26203062047 +:100360003E22326720CDA20CAF321120CDFD003CE1 +:10037000329820CDA30BCDFF17C3FD08CDFF17C3C7 +:100380003609CD4F02C341032168203601237EA7E1 +:10039000C29B032335C29B032B36013A1B20473AED +:1003A000EF20A7C2B4033A1D200FDAD1030FDADE23 +:1003B00003C3C003CDE8150707DAD10307DADE036C +:1003C000211820CDBB17CDC717CD8311AF32122016 +:1003D000C978FED8CAC0033C321B20C3C00378FED4 +:1003E00030CAC0033D321B20C3C0033CE6013215B6 +:1003F000200707070721911C856F221820C3C0031F +:10040000112A20CD8617E1D0237EA7C8FE01CA3F5E +:1004100004FE02CA4F0423FE03C26F0435CA7B04E4 +:100420007EFE0FC0E5CD7504CD9711E12334232363 +:10043000353523353535233608CD7504C34E113C8B +:10044000773A1B20C608322A20CD7504C34E11CD41 +:100450007504D5E5C5CD9711C1E1D13A2C20856F42 +:10046000322920CDD6113A6120A7C8320220C9FE18 +:1004700005C8C37B04212720C3BB17CD7504CD97C6 +:100480001121252011251B0607CDB2172A8D202CFE +:10049000E5CDF9132EF834E17DFE5FDAA0042E508D +:1004A000228D202A8F202C228F203A8420A7C07EE4 +:1004B000E601012902C2BB0401E0FE218A2071236A +:1004C0002370C9E13A321B3232202A38207DB4C26F +:1004D000D7042B223820C91135203EFCCDA5053A82 +:1004E00046203270203A5620327120CDB8053A7835 +:1004F00020A7213520C2B00511301B213020061065 +:10050000C3B217CDF907FE04E1D258053A6E20A711 +:10051000C03A8020FE01C01145203EF0CDA5053A2D +:1005200036203270203A5620327120CDB8053A7606 +:1005300020FE90DA3C053A481B3276203A7820A714 +:10054000214520C2B00511401B2140200610CDB22C +:10055000173A82203DC25D053E01326E202A762088 +:10056000C3D506E11155203EDECDA5053A46203221 +:1005700070203A3620327120CDB8053A7620FE95AB +:10058000DA89053A581B3276203A7820A72155207F +:10059000C2B00511501B2150200610CDB2172A768B +:1005A00020225820C9327F20217320060BC3B217A6 +:1005B000117320060BC3B2173AE420A7C0217320A1 +:1005C0007EE680C21A063AC120FE043A6920CA10AB +:1005D00006A7C82336003A7020A7CAE305473ACFDA +:1005E00020B8D03A7120A7CAF005473ACF20B8D03A +:1005F000237EA7CA73062A76204E23227620CD8733 +:1006000006D0CD980179C607677DD60A6F227B2078 +:100610002173207EF680772334C9117C20CD861784 +:10062000D0237EE601C29B062334CDCC063A792046 +:10063000C603217F20BEDA3B06D60C3279203A7BF6 +:1006400020473A7E2080327B20CDC3063A7B20FEB5 +:1006500015DA6A063A6120A7C83A7B20FE1EDA6ADC +:1006600006FE27D26A06973215203A7320F6013229 +:100670007320C93A1B20C60867CDC01279FE0CDA78 +:10068000FE050E0BC3FE050DCDF9136916057EA7F9 +:1006900037C07DC60B6F15C28E06C9217820357E06 +:1006A000FE03C2BE06CDCC0621DE1C227920217CB1 +:1006B0002035352B35353E06327D20C3C306A7C015 +:1006C000C3CC06217920CDBB17C3D611217920CD0B +:1006D000BB17C39711224820C9E13A8020FE02C00F +:1006E0002183207EA7CA64053A5620A7C264052349 +:1006F0007EA7C205073A8220FE08DA64053601CDDE +:100700005907CD1108118A20CD8617D02185207E6A +:10071000A7C28C073AA120A7218A20CA2107C311AA +:10072000087E232386328A20CD3A07218A207EFE46 +:1007300028DAAC07FEE1D2AC07C9CD5307C21108D5 +:1007400021BD20347EE604C24D07C31108CD170831 +:10075000C310123ABC20FE02C921BC20347EFE0226 +:10076000C0217E182287203A8C20328C20C9CD539C +:1007700007C021A81DCD81072287200650E1C3EDC7 +:10078000073ABA20A7C83E0132BB20C906FECD5C9D +:100790001723357EFE1FCA2008FE18CABF07A7C050 +:1007A00006EF2198207EA077E620D305CD1708CD4F +:1007B0001012218320060ACD3F0806FEC35C173EB7 +:1007C0000132F1203ABC20FE01C2CF0732BA20CD5F +:1007D0006E072A8D20460E04214C1D11481D1AB8A3 +:1007E000CAE90723130DC2DE077E32872026006880 +:1007F000CD0108CD1708C3D70A3A6720672EF97EC6 +:10080000C93AEF20A7CA0C0822F220C9AF32F12062 +:10081000C9CD1708C38311218720CDBB17C3C717C4 +:1008200006102198207EB077CD9915CD3408228707 +:1008300020C3110821781DCD5307C021781DC9118F +:10084000831BC3B2173E01329320310024FBCD58E5 +:1008500017CD0517CDFA16CD1617211330113E1FEF +:100860000E04CDD90A3AEB203D2110280E14C27394 +:1008700009114D18CDD90ADB01E604CA65080699AD +:10088000AF32CE203AEB20802732EB203ACC2080CA +:100890002732CC20CD051721000022F82022FC2091 +:1008A00022F82122F822CDE316CDE916CD9710CDFE +:1008B0003010CD58172101017C32EF2022E7202291 +:1008C000E520CD1617CD3502CD3B02CDB70A32FF5C +:1008D0002132FF22CDF200AF32FE2132FE2232E47D +:1008E000203C32FA2132FA22CDDE01CDC216217827 +:1008F0003822FC2122FC22CD2A02CDFF17DB02E6A2 +:1009000008C4B945CD730ACDA30BAF32C120CD15B4 +:10091000023A67200FDA8E09CD5902CD9709CD151D +:1009200002CDCC003E0132B9200620CDB816CDCA8A +:10093000093E0032B920CD52170620CDB816CDFEA3 +:1009400013CDC816CDB513CD580B3A8220A7CACA0D +:100950000BCD9111CD1E0BCDBE0ACD5815CD5E0C21 +:10096000CA68090604CDB816CD9E15D306CD2E163D +:10097000C33E09113818CDD90A0698DB010F0FDAEA +:1009800089090FDA7E08C365083E01C38108CD607E +:1009900002CD9709C31E092127290E043A67205763 +:1009A0001EFA1AC61CF5C5CD241A0605C51AA6AE30 +:1009B000771301200009C105C2AC0901000509C176 +:1009C000F10DC2A509C91B241D1C21002311002003 +:1009D000E5D50610CDB21721082036002336A8230E +:1009E0002336A8232323E5CDB5133A8220FE1AD25D +:1009F000600AFE0AD2660AE136FFCD5F01CD0F0123 +:100A00003A0E203207203A8220FE05D2160AC5018E +:100A10005003CDC90EC13A09203A0920473A0923AB +:100A2000F5C53E0ACDB815C1F1B8D306F526202E7E +:100A3000E12C7EA7CA4A0ACD491FE676FE56C24A75 +:100A40000A2EEA2C36022ECC3602F1C2FA09E1D186 +:100A50000610CDB217CD19173AE720A7C8C3CA0AA6 +:100A6000E136FCC3FA09E136FEC3FA093A672067AA +:100A70002EFCC921112B11701B0E0ECDD90A3A671D +:100A8000200F3E1E211137D4E50A3EB032C0203A75 +:100A9000C020A7C8E604C2A20ACD970BCDEF16C3AB +:100AA0008F0A0628211C263A67200FDAB10A211C7A +:100AB00039CD1012C38F0ADB02E601C603C93A82A0 +:100AC00020FE09D03EFB327E20C93ACE20A7C021AD +:100AD0001C390628C310120E031AD5CDE50AD1130E +:100AE0000DC2D90AC9CD241A0605D306CD8311C576 +:100AF000AF770120000977097709C1C93A0920FEBB +:100B000078D02A91207DB4C2120B2100063E01321A +:100B100083202B229120C9CDF7132EFF7EC9CDCE85 +:100B2000162B2B7EA7C80615CD8A10B8D8CD374610 +:100B3000CDCE162B2B36003EFF3299200610C3B8BF +:100B400016F53AAF20A7CA560B219C1DF1FE02D81C +:100B500023FE04D823C9F1C9CD970B3AF120A7C8C9 +:100B6000AF32F120E52AF220EBE17E8327775F2385 +:100B70007E8A277757237E23666F7ACD7F0B7BD5BE +:100B8000F50F0F0F0FE60FCD920BF1E60FCD920B85 +:100B9000D1C9C61CC3E50A3A67200F21F820D82125 +:100BA000FC20C92102240E1A06DFE5C536001120FB +:100BB000001905C2AC0BC1E1230DC2A80BC93ABA9A +:100BC00020FE02C03E0132BB20C9CD410CCD1044F5 +:100BD000CD8246CDF9132EF83600CDBE0BCD96183A +:100BE000AF32E920CDA30B3A6720F5CD2A02F132CE +:100BF00067203A6720672EFEE52EFA347EE52EF94F +:100C000034E1FE0AC2090C3600E17ECD210C7C0FD6 +:100C1000DA380C3E21329820CD3B02CDC216C30EED +:100C200009E6073C77219F1D233DC2280C46CDF9DC +:100C3000132EFC70233638C9CD3502CDDE01C30E2C +:100C400009CD5E0CC2570C3E3032C0203AC020A7FE +:100C5000C8CD5E0CCA4C0CCD5E0CC2570CC93A15FF +:100C600020FEFFC93AEF20A7CA810C480608CDB87C +:100C7000164178CD410B7E21F32036002B772B36A1 +:100C800001216220C9D51ACDE50AD13E0732C02024 +:100C90003AC0203DC2900C130DC2850CC93E40C322 +:100CA000B60C3E80C3B60CE1CD8343C37B003AC192 +:100CB000200FDAA70CC932C0203AC020A7C2B90C55 +:100CC000C921EC207EA7C2D10C360132F921C3DE46 +:100CD0000136003E03C3CB0CAFD303D305CDDC17E5 +:100CE000FBCD9D0CCDDC40CD9D0CCD3F16CD9D0C9C +:100CF000CDA30B3AFF21A7C2030DCDB70A32FF21C6 +:100D0000CDFF17CD2A02CDC10CCD3502CD6002CD6D +:100D10001502CDCA093E0132C120CDFE13CD680DAA +:100D2000D306CD5E0CCA1A0DAF322520CD5E0CC2A3 +:100D30002C0DAF32C120CD9D0CCDA30B0E0C21117B +:100D40002C111711CDD90ACDD20D012311CD7D164D +:100D5000CD7316DB0207DA5F0D012711CD6116CDC9 +:100D6000A20CCDA30BC39D16CDC816C31945DBD06D +:100D7000D2CFC3DCCFD4C9C1D41B07082B12020EBB +:100D800011041BDB00E640CCC90D3A4D23A7CAA4D1 +:100D900000DB01E606C4C30DCDB90DE61006012146 +:100DA000B120C2AE0D7EA723C2AE0D2B0600702A65 +:100DB0004A2323224A23C394003AE120A7C2F21512 +:100DC000DB01C93E0132BF20C9CD3011CD9710C320 +:100DD0003010E5C5CDBA10C1E1C93E20C3B60C3E06 +:100DE00005C3B60C015006CDB90DE660CAF80D0D6D +:100DF000C2E70D05C2E70DC9E1C9CDA30BCD28108F +:100E00000615116510214023CDB217113D10211791 +:100E1000270E17CDD90A21122711211ECDA70E2189 +:100E20001027CDA70E210E270E05CDA90E210E33BA +:100E300011161F0628CD83111154100E1121062AF8 +:100E4000CDD90A3A4D23A7CA1B103A4B23FE20D214 +:100E50001B10CDB90ECDB90DE676FE40CCD20EFEFC +:100E600020CC280F3ABF20A7C21B103AB220A7C23D +:100E7000720F013001CDC90ECDC10E3A4B23FE1DBC +:100E8000C2430E0605C521062A0620CD7111CDDF0D +:100E90000D11541021062A0E04CDD90ACDDF0DC143 +:100EA00005C2850EC3430E0E0B0605CD8311C50189 +:100EB000600109C10DC2A90EC92A4E233E2AC3E50D +:100EC0000A2A4E233E1BC3E50A0DC2C90E05C2C93C +:100ED0000EC9CDE40DCDC10E2A4E237DFE11CA03ED +:100EE0000FFE0FCA0C0F7CFE33CA170F24247CFEA2 +:100EF00035D2F70EC3FD0ECDC10E210D36224E2385 +:100F0000C3B90E7CFE3BD21C0FC3120F7CFE3BD23A +:100F1000220F2424C3FD0E2634C3EC0E210F27C359 +:100F2000FD0E210D27C3FD0ECDE40DCDC10E2A4EC1 +:100F3000237DFE11CA4C0FFE0FCA5D0F7CFE28DA1E +:100F4000660FFE34C2520F2633C3520F7CFE28DADE +:100F5000570F2525C3FD0E211127C3FD0E7CFE284A +:100F6000DA6C0FC3520F210F3BC3FD0E21113BC39F +:100F7000FD0E01FF20CDC90E3A4C23FE0AD200100F +:100F80003A4E23FE11CAA00FFE0FCAA60F3A4F23F6 +:100F9000FE32D2AE0FCDDE0FC616CDE50FC3430E27 +:100FA000CDDE0FC3E50FCDDE0FC60BC3E50FFE355B +:100FB000D21B103A4C23A7CAD40F2A502325225003 +:100FC000233E1BCDE50A214C23352140233A4C23F7 +:100FD000856F361BAF32B12032B220C3430E3A4F79 +:100FE00023D6270FC9214023F53A4C23856FF1778B +:100FF0002A5023CDE50A225023214C2334C3D40F99 +:101000003A4E23FE0DC21B103A4F23FE32D213106C +:10101000C31B10FE36D21B10C3B30FAF324D23CD0E +:101020009710CD3010C3A30B0650211E2DC3711194 +:101030002A3E231140233A4C234FC3D90A07082BD9 +:1010400012020E1104111B1B1104060812131100C9 +:1010500013080E0D0D000C041B2E2F2F2F2F2F2FDA +:101060002F2F2F2F301B1B1B1B1B1B1B1B1B1B0086 +:101070000000FF11270730000000E5D5110004191A +:101080003E1CCDE50AD1E1C37A0BCD970B7E2366DA +:101090006F292929297CC93A4C23A7CAAE10473E9B +:1010A0000A90373F1FC62D672E1E223E23C9211EE0 +:1010B0002D223E233E0A324C23C9CD7345AF32E484 +:1010C00020FB0605C511790D0E0A211E2DCDD90A6A +:1010D000CDDA0DCD2810CD9710CD3010CDDA0DC161 +:1010E00005C2C410C9261D1B0E111B1E1B0F0B00B1 +:1010F00018041112271B1B291D1B0F0B00180411AC +:101100001B1B1D1B020E080D1B1B1B130008130EBF +:101110001B1B1B00000000080D120411131B1B02F7 +:101120000E080D0D2AE5100A2AF710072A3C11FFB8 +:10113000060E110911214023CDB217C9291E1B0F1C +:101140000B00180411121B1E1B020E080D12CDB944 +:1011500011C5E51AD304DB03B6772313AFD304DB41 +:1011600003B677E101200009C105C25111C9CDB90B +:1011700011C5E5AF77237723E101200009C105C23E +:101180007111C9C51A771301200009C105C2831165 +:10119000C9CD8A10C33F15CDB911C5E51AD304DBFB +:1011A000032FA6772313AFD304DB032FA677E10128 +:1011B000200009C105C29A11C97DE607D302C3C741 +:1011C00017C5E57E1213230DC2C311E101200009EA +:1011D000C105C2C111C9CDB911AF326120C5E51A2F +:1011E000D304DB03F5A6CAEE113E01326120F1B64D +:1011F000772313AFD304DB03F5A6CA02123E0132F4 +:101200006120F1B677E101200009C105C2DD11C9F5 +:10121000AFC57701200009C105C21112C93A2520C6 +:10122000FE05C8FE02C03A2920FED847D282123AF3 +:101230000220A7C878FECED2D012C606473A0920AF +:10124000FE90D24912B8D28212683A0920C650BD27 +:10125000DCCA12CDB3123A2A2067CDC01279FE0C37 +:10126000D282122264203E05322520CD45137EA76E +:10127000CA8212CDD812CDBB17CD96133E103203C1 +:1012800020C93E03322520C39C1221032035C02AE9 +:1012900064200612CD30133E04322520AF320220E6 +:1012A00006F7C35C170E00BCD45413BCD0C6100C98 +:1012B000C3AB123A092065CDA5124105DE106FC9F6 +:1012C0003A0A20CDA512DE1067C93E0132AD20C911 +:1012D0003E01328520C397127E32DB2006053600A0 +:1012E000E521622036C223361C2323233610E1FE7B +:1012F00001CC0113FE03CC0713FE07CC0413C36417 +:101300000C0601C90607C9E5F5CDF907FE03D2278A +:1013100013F1E10603C923360721622036E02336A4 +:101320001A2323233620C9F1E136070603C3161317 +:101330003A6220FEC2CA6E1111311CD5CD9613D16E +:101340000610C3991378070707808080813D6F3AA4 +:10135000672067C90CC610FA5413C93A0D20A7C2FA +:101360007B1321A43ECD8913D006FE3E01320D2011 +:10137000783208203A0E20320720C9212425CD8951 +:1013800013D0CDAF16AFC36D1306177EA7C251148D +:101390002305C28B13C9CDB91100C5E51AD304DBEF +:1013A00003772313AFD304DB0377E101200009C1E6 +:1013B00005C29A13C9CDF7130100377EA7CAC1131E +:1013C0000C2305C2BB1379328220FE01C0216B20A1 +:1013D0003601CDF7137EA7C2774606167EA7C2E771 +:1013E000132305C2DC13C9FE01C02E057EA7C47EEF +:1013F000463E0132AE20C92E003A672067C93A1531 +:1014000020FEFFC02110207E2346B0C03A2520A731 +:10141000C03AEF20A7CA38143A2D20A7C22E14CD07 +:10142000E815E610C83E01322520322D20C9CDE84E +:1014300015E610C0322D20C921252036012AED20C5 +:10144000237DFECADA49142EBF22ED207E321D20F4 +:10145000C937C9AFCD0B18CDCE163600CD970B23AB +:1014600011F5201ABE1B2B1ACA7114D28114C37530 +:1014700014BED281147E1213237E12CD1017CDB26A +:10148000143ACE20A7CAF2142103281124180E14EE +:10149000CD850C2525061D3A67200FDAA014061EFF +:1014A00078CDE50ACD9D0CCDA5167EA7CAF214C352 +:1014B0003603CDE41421E02036013A6720FE21C234 +:1014C000C614233600C9233620C921E0207EA7C8D0 +:1014D00023E546CDFD00CDFA0DE136FF2B360006A3 +:1014E00000C3FD00CD2810060A116510214023C35A +:1014F000B21721182D1124180E0ACD850CCDA20C7F +:10150000CDCA14CDA30BAF32EF20D305CD5217C3F4 +:10151000320D310024FBAF321520CD1D120604CD53 +:10152000B816CD5E0CC21A15CD5817210127CD7AF9 +:1015300017AFCD0B1806FBC33117CD970B237E11C8 +:10154000BA1C211F180E04471AB8D2531523130DC5 +:10155000C248157E32CF20C93A2520A7C26415069D +:10156000FDC35C170602C3B816219B2035CC961527 +:101570003A6820A7CA961521962035C02198207E6A +:10158000D3053A8220A7CA96152B7E2B772B3601DE +:101590003E04329B20C93A9820E630D305C93A95DB +:1015A00020A7CAD31521911711A1173A8220BED2C4 +:1015B000B7152313C3AE151A3297202198207EE663 +:1015C00030477EE60F07FE10C2CD153E01B077AF63 +:1015D00032952021992035C006EFC35C1706EF2114 +:1015E00098207EA077D305C93A67200FD2F215DB89 +:1015F00001C9DB02C9DB02E604C83A9A20A7C0C3CE +:10160000501A0604C5CDA30BC105C204163E013213 +:101610009A20CD5817FB11BE1C2116300E04CD8523 +:101620000CCD9D0CAF329A20329320C3F21421844A +:10163000207EA7CABA07237EA7C00601C3B8162119 +:10164000122811CB1A0E15CDD90A3E0B326C20018F +:10165000AB1DCD7D16DA5E16CD6B16C3521601C4D6 +:101660001DCD7D16D8CD7316C36116C50610CD836A +:1016700011C1C9C53A6C204FCD850CC1C90AFEFF06 +:1016800037C86F030A67030A5F030A5703A7C93104 +:1016900000240600CD2C02CD3011CD16173E0832A5 +:1016A000CF20C3D80C3A672021E7200FD023C906EA +:1016B000023A82203DC004C93A9420B0329420D32B +:1016C00003C9210022C3E101CD1D12C35B1321E731 +:1016D000203A67200FD823C90E1C211E241162183E +:1016E000C3D90A21F820C3EF1621FC20C3EF165EF0 +:1016F0002356237E23666FC37A100E07210135110E +:10170000421FC3D90A3AEB2021013CC61CC3E50A9B +:1017100021F420C3EF16CDDC17CDD816CDE316CDBE +:10172000E916CD1017CD9710CD3010CDFA16C305A0 +:1017300017CD5C17C357143E01326D20C31215F14B +:10174000D5D6D0DBC8D9D6D7D9D6CAE3D6DBD0C850 +:10175000DBF13E0132E920C9AFC354173A9420A00F +:10176000329420D303C9210127CA7A1711811C069C +:10177000104FCD8311793DC26C170610CD10127C2D +:10178000FE35C27A17C9217220461AE680A8C037F2 +:10179000C9322B241C16110D0A0807060504030282 +:1017A00001342E27221C181513100E0D0C0B0907DF +:1017B00005FF1A77231305C2B217C95E2356237E8D +:1017C000234E2346616FC9C506037C1F677D1F6FCB +:1017D00005C2CA177CE63FF62067C1C9210024363E +:1017E00000237CFE40C2DF17C9C5E51AB677132374 +:1017F0000DC2EB17E101200009C105C2E917C9CDEF +:10180000170BA7C8F53D77CD6617F1210125E60F27 +:10181000C3920B0000FFB8FE211C109E00211C305B +:10182000100B080706000C041B0E1504111B1B0FE0 +:101830000B00180411261B271D1B0E111B1E0F0B5E +:1018400000180411121B011413130E0D1B0E0D0BA7 +:10185000181B1D0F0B001804111B1B011413130E72 +:101860000D1B1B12020E11042B1D1B1B1B1B1B1B14 +:101870001B1B1B1B1B1B12020E11042B1E1B00002B +:1018800000000C141C163E76DEF6DE763E161C14A6 +:101890000C0000000000CD5817CDA30B21011C1136 +:1018A00010003ADB20FE01CAB71819FE03CAB718A8 +:1018B00019FE05CAB7181922DD2021D12011D11B2C +:1018C000060CCDB2172A0B2022D42021010122D2EE +:1018D000203E0132D0203AD420FED0D20E19D306B9 +:1018E0003AD920A7C2D6183AD120A7CAD618AF3203 +:1018F000D020CD9D0C2110280E0E11161ACD850C6E +:10190000CD9D0C3E0132D02032D920C3D618CDBA9D +:1019100007AF32D020CDA30BC39D0C21DF20357E35 +:10192000E602CABA07C33A16120E121B2D3AEF206E +:10193000A7CC531F3AD020A7C811D520C3401AFE08 +:1019400022C24B19CD8617D0C34F19CD8617D83A6E +:10195000BB20A7C2BC19CD1B193AD520FEB0D4A418 +:1019600019FE50DC9B1921D420CDBB17EBE5CD9699 +:10197000132ADD20EB010807E1090610CDA01A218A +:10198000DA20357EE601C294193C32D22021D220E1 +:101990004EC31F02AF32D220C38D193E0132D32075 +:1019A000F5C3AA19F53EFF32D3202AD42026D01140 +:1019B00028190E05CDC717CDD90AF1C93AD420FE92 +:1019C00098D2C719C356193AD120A7C2E9192AD407 +:1019D000200108070922D4202ADD2022D62021D880 +:1019E00020361021010022D22021DF20357EE601A1 +:1019F000C2F619CD8D193E0132D12021D420CDBBA4 +:101A000017EBE521DC20357EE604CC111AE1C39604 +:101A1000133E40835FC9040D06080D041B13110E0D +:101A200014010B0411211EA7C8E5210000C5010502 +:101A300000093DC22E1A19EBC1E1C9210024115041 +:101A4000DB02E602C244193A6720C33F1909444247 +:101A500032D020D303D305329820310024C302169C +:101A60000000000000000000000000000000000076 +:101A70003730482C304443480D0A09444209304469 +:101A80000107010101040B01060301010B09020812 +:101A9000020B04070A050205040607080A060A03E2 +:101AA000CDB911C5E51AD304DB03B6772313AFD341 +:101AB00004DB0377E101200009C105C2A31AC901B3 +:101AC00001000001000201000201002912020E11B2 +:101AD000041B000315000D02041B1300010B042955 +:101AE00000000000317ADCF4F4DC7A313A4C3A310F +:101AF0007ADCF4F4DC7A3100000000000000000021 +:101B00000100001000000000027838783800F8006A +:101B1000008000D402FF050C811C20301001000061 +:101B200000000000040010B11C2830010400FFFF79 +:101B3000000002C304000000000004F01C000003C9 +:101B40000000000305000001801A04E41C000003EB +:101B5000000000D906000001861A04D21C00000310 +:101B6000FF00C21C00001021010030001200000024 +:101B70000F0B00181B0F0B00180411261D27FC006B +:101B800001FFFF00000020601DD0291802501D0039 +:101B90000800060000014000010000109E00211C0A +:101BA0000000FE00C800251C080000000000000125 +:101BB0000000000000020000000000000000000023 +:101BC0000010000000000000000000000000000005 +:101BD000000000000000FC1C1D00000000000000D0 +:101BE00000FF0101000000000001000001BF1A0019 +:101BF0007800000000051C2F00001C2600001C3986 +:101C000000000039797A6EECFAFAEC6E7A793900D4 +:101C100000000000781DBE6C3C3C3C6CBE1D780092 +:101C20000000000000193A6DFAFA6D3A1900000040 +:101C30000000000000307ADDF4F4DD7A30000000AE +:101C4000000000387A7F6DECFAFAEC6D7F7A38008C +:101C5000000000000E18BE6D3D3C3D6DBE180E002C +:101C600000000000001A3D68FCFC683D1A000000FE +:101C7000000000000000102A7C7C2A1000000000F8 +:101C80000000000F1F1F1F1F7FFF7F1F1F1F1F0F41 +:101C900000000401130307B30F2F032F49040300AF +:101CA00001400805A30A035B0F27270B4B40841153 +:101CB000480F993C7E3DBC3E7C99021020301308B1 +:101CC0000B13000849221481420042811422490862 +:101CD000000044AA1088542210AA442254884A15AD +:101CE000BE3F5E2504FC0410FC1020FC2080FC801C +:101CF00000FE0024FE1200FE0048FE9000000004DA +:101D00000C0C1E3E2E6E7EFCECECFCFCECECFC7E27 +:101D10006E2E3E1E0C0C040000000000FF0FFF1F83 +:101D2000FF3FFF7FFFFFFCFFF8FFF0FFF0FFF0FF3A +:101D3000F0FFF0FFF0FFF0FFF8FFFCFFFFFFFFFFF9 +:101D4000FF7FFF3FFF1FFF0F0510153090939699FF +:101D50001005051015101005301010100515100590 +:101D600000000000040C1E373E7C747E7E747C3EB6 +:101D7000371E0C0400000000002200A54008983D1A +:101D8000B63C361D104862B61D9808429008000007 +:101D90001B211C1D1C1C1D211C1F1C1C01020305DA +:101DA0006050484848404040211C1C0E2C82180CB2 +:101DB0002C641D0A2A311C0A2C211C082C511C06DB +:101DC0002C011CFF0E2ED91D0C2EE41D0A2EEF1D1A +:101DD000082EFA1D062E051EFF28211C1C1B0F0EA7 +:101DE000080D1312281B2C1B0C1812130411182891 +:101DF0001B1F1C1B0F0E080D1312281B1E1C1B0F74 +:101E00000E080D1312281B1D1C1B0F0E080D13129C +:101E10000000002C2C84845858B0B0B02C58588442 +:101E2000841F2444241F7F494949363E41414122B1 +:101E30007F4141413E7F494949417F484848403EB2 +:101E4000414145477F0808087F00417F410002016A +:101E500001017E7F081422417F010101017F2018CA +:101E6000207F7F1008047F3E4141413E7F48484823 +:101E7000303E4145423D7F484C4A3132494949262E +:101E800040407F40407E0101017E7C0201027C7F58 +:101E9000020C027F631408146360100F1060434546 +:101EA000495161000003030000000000003E454965 +:101EB000513E00217F0100234549493142414959A2 +:101EC000660C14247F04725151514E1E2949494613 +:101ED000404748506036494949363149494A3C08EB +:101EE0001422410000412214081414141414221462 +:101EF0007F14221818181818080808080820404DE0 +:101F00005020000079007900000000C040404040AF +:101F100040C000000000001F141609001E01011E31 +:101F2000001F15150A000000000000000000001F3F +:101F3000151511001F08041F001F11110E000F14AA +:101F400012070211040308131B21521FE52EEF266E +:101F500015E9C9CD9C45C34F450D0A094A4E5A099A +:101F60004558494E340D0A0944435809480D0A0999 +:101F70004D4F5609412C4D0D0A09414E4909383043 +:101F8000480D0A09525A0D0A4558494E313A094C32 +:101F900044410950552B304130480D0A09414E4902 +:101FA000093046480D0A094D4F5609422C410D0A89 +:101FB000094C44410950552B3041480D0A455849B8 +:101FC0004E323A0944435209420D0A094A5A094518 +:101FD00058494E330D0A09414449093130480D0A28 +:101FE000094A4D50094558494E320D0A3B0D0A45E4 +:101FF00058494E333A0941444909303448FFFF09F2 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invadpt21.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invadpt21.hex new file mode 100644 index 00000000..15539a06 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invadpt21.hex @@ -0,0 +1,129 @@ +:1000000001010101010101010101010101010101E0 +:1000100001010101010103030303030303030303BC +:1000200003030303030303030303030301010101A8 +:1000300001010101010101010101010303030101AA +:10004000010105050003030003030005050505057F +:10005000050505050505050501030101010101016E +:100060000103010101000303030303000101070071 +:100070000500030503000500070707030005050544 +:100080000003070701010101010101010101010153 +:100090000303030001000303030105050500030337 +:1000A00003000505050707070707070707070707F1 +:1000B000010103030303030303010101010303031C +:1000C0000303030301010503030303030303030302 +:1000D000050505050503030305050505211726117B +:1000E000E441011808CDCD41CD9D0C21172611EC1E +:1000F00041011006CD4841CD9D0C210D2611E44152 +:10010000011804CDCD41CD9D0C210D26114C42018D +:100110000806CD4841CD9D0C21062E117C420102DE +:1001200038CD3341CD9D0CCD1917CDD20DCD9D0CC1 +:10013000C3A30BC5E51A7723130DC23541E1012096 +:100140000009C105C23341C9E5C5D50E081A0FF52E +:10015000D2A441C50E04112000190DC25941C1F1AC +:100160000DC24E41D11305C24A4121B020347EE672 +:1001700002CA7C413600C1E12BC37E41C1E10DC200 +:100180004841AF32B020261F2EE4242D7EA7C8CDD3 +:10019000491FE676FE36C02EEC2D261F2436022E91 +:1001A000CC3602C9C50E033AB020FE01C2C8413E9A +:1001B000E046A077112000190DC2B141190150028B +:1001C000CDC90ED306C35E413E0EC3B141E5C5D5D0 +:1001D000D3060608CD8311D10DC2CF41C1E12B0555 +:1001E000C2CD41C9EEEEEE00EEEEEE001EFCC10700 +:1001F0001EFE7FFCC3073FFEFFFCE78F7FFEFFFC78 +:10020000E78F7FFEE31CF79F7307E71CF79F7307D9 +:100210000E1C779D03073EFC779D031FFCF8F3DF60 +:10022000811FF0F9C1C7811FC039E0CE8101983923 +:10023000E0CE9D01983970DCDD01F83970DCDF0F0C +:10024000F039E08ECF0FE038E00EC70F369B39CF84 +:10025000F738369B39DBB06D769B6DDBB00DF69BC6 +:100260006DDBB00DF6F37CDBF338B6F36CDBB0611D +:1002700036636CDBB06D36636CCFB739FFFFFFFFC1 +:10028000FFFFC0F1C0F1C0FF807F003F0000000011 +:10029000FF0FFF3FFFFFC0F1C0F1FFFFFF3FFF0F68 +:1002A00000000000FFFFFFFFFFFFC0F1E0F1FFFFD4 +:1002B000BF7F1F3F0000000000F000F000F0FFFFD4 +:1002C000FFFFFFFF00F000F000F000000000000062 +:1002D000000000000000000007F0FFFFFFFFFFFF2D +:1002E00007F007F0FFFFFFFFFFFF07F0CDF907FE64 +:1002F00002D8FE04D2FC423AB820A7C03AAD20A7EB +:10030000C0CDBB4321A1207EA7C25E432B7EE680E9 +:10031000C83AA020E60F473A0A2005CA2343C61070 +:10032000C31A43C60432A520DE08E6FE47218A2010 +:100330007EE6FEB8C03A0920C64032A9203A06201F +:1003400021AA20BED2594306023A0D20A7C2524329 +:1003500006FE3AA5208032A5203E0132A12021A42C +:1003600020CDBB17EB3AA920BDDA79432AAA203663 +:1003700005CDA3433E0132B720212020CD9102E1DB +:10038000C3940021A1207EA7C821A2204ECD1F0228 +:1003900021A420CDBB17EB7DFE2FD2AE43118C459F +:1003A000CD9613060E21A02011A01BC3B2173AADA3 +:1003B00020A7CAB843119445C396133A8420A7CA0C +:1003C000FF433AA120A7C04F3A8C20FE02793A673A +:1003D0002067060BC2E4432E2C7EA7CAF1432305F7 +:1003E000C2D943C92E367EA7CAF1432B05C2E643C4 +:1003F000C922AA207DC605E60FF68032A020C93AA0 +:10040000A020E67F32A02021B7207EA7C82377C98D +:100410003AAE20A7C8CD5817CD534622F2203E0150 +:1004200032F120CD580B3E0232C0202104291108A0 +:10043000450E11CDD90A01B4200AA711C609C24937 +:10044000440B0AA7CA5144131321042F0E02CDD91D +:100450000A2110231104450604CDB2172A0B203EB1 +:10046000078467221223CD8944CDE3447DFEC8D2A0 +:10047000EB44CDCF44E5CDA344E1CDB944211023D5 +:10048000342334CDE044C36C44CDCF443AC020A7DC +:10049000CA9B443E0232C020C33A163E0032C020FE +:1004A000C3BA073A10234F3A1123477C9067FE38AE +:1004B000D8CDCF440DC2A744C93A10234F3A1123D7 +:1004C000477C8067FEE8D0CDCF440DC2BD44C9E56E +:1004D000CDC7173E0F77E1C5012003CDC90EC1C9B5 +:1004E0002A12233E08856F221223C921BE20343AE6 +:1004F000B520BEDAFC44CDA30BC32B443600CDBAE5 +:1005000007C3A20C01020000010E0D14121B1B21D7 +:100510001C1C1B0F0E080D131226202E1E7EA7C2B8 +:100520002E45CD491FE676D652C03C321E20CD491D +:100530001FE676FE34C0262C2E1B160D1E780E0AE2 +:100540000C1AC63FD5CDE50AD11B0DC24145C921C4 +:10055000D0DB01DBC8114C171AFED6C0131ABCC081 +:10056000131ABDC0131AB8C0131AB9C02EE2262040 +:100570003600C926282E031E5116170E120C1AC655 +:1005800038D5CDE50AD11B0DC27E45C9183C7EDBAE +:10059000FF245AA5985CB65F5FB65C98DB00E60A5C +:1005A000FE0ACA0000A700C021E3203600C90F11CF +:1005B000041204131B0C0E030421152D11AE450E5D +:1005C0000BCD850CDB01E676FE10C8FE04CCE445BD +:1005D000FE20CCF945FE02CCFF45FE40CC3146D38F +:1005E00006C3C445DB01E604C2E44521000122F252 +:1005F000203E0132F120C3580B21E4203601C9DB33 +:1006000001E602C2FF45CDF907FE12DA10463609AF +:10061000342EFA347EFE0AC21C463600CD5902CD75 +:100620009709CDDE01CDC216CDF9132EFE7EC32172 +:100630000C21E4203600C9CD170B347EF5210125AD +:1006400024243DC24046061011811CCD8311F13C8B +:10065000C30B1821B3207EA7C26546237EA7C26EB6 +:1006600046215000C92100013E0432B520C9218035 +:10067000003E0332B520C932B32032AE20C932B4B5 +:1006800020C9CDF9132EF87EFE38D0CD170B347E5D +:10069000FE07D0CD3C46CD3C0B010000CDC90E0677 +:1006A000EFC35C174230482C304230482C30423087 +:1006B000480D0A094442093243482C3538482C3544 +:1006C00038482C3834480D0A094442093834480D5A +:1006D0000A3B0D0A3B0D0A3B092A2A2A2A2A2043F3 +:1006E00048415241435445522044415441202A2A12 +:1006F0002A2A2A0D0A3B0D0A4348524F4D3A094413 +:1007000042093146482C3234482C343448092020E0 +:10071000203B2020412020203C30303E0D0A09445F +:1007200042093234482C3146480D0A0944420937FF +:1007300046482C3439482C343948092020203B20A5 +:1007400020422020203C30313E0D0A094442093429 +:1007500039482C3336480D0A094442093345482CA0 +:100760003431482C343148092020203B20204320BC +:1007700020203C30323E0D0A094442093431482CD5 +:100780003232480D0A094442093746482C34314870 +:100790002C343148092020203B2020442020203CBC +:1007A00030333E0D0A094442093431482C33454860 +:1007B0000D0A094442093746482C3439482C34394B +:1007C00048092020203B2020452020203C30343E7A +:1007D0000D0A094442093439482C3431480D0A09BC +:1007E0004442093746482C3438482C3438480920CC +:1007F00020203B2020462020203C30353E0D0A0999 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdelux.d b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdelux.d new file mode 100644 index 00000000..6367ea4b Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdelux.d differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdelux.e b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdelux.e new file mode 100644 index 00000000..5ad93523 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdelux.e differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdelux.g b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdelux.g new file mode 100644 index 00000000..6ae5bdc8 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdelux.g differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdelux.h b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdelux.h new file mode 100644 index 00000000..a10b2cb5 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdelux.h differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdeluxe.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdeluxe.hex new file mode 100644 index 00000000..6d57e0da --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/invdeluxe.hex @@ -0,0 +1,322 @@ +:020000040000FA +:20000000000000C38F160000F5C5D5E5C3830D00F5C5D5E53E8032722021C02035CDF515AE +:20002000DB010FDA70003AEA20A7CA4B003AEB20FE09CA4700C6012732EB203ACC20C60116 +:200040002732CC20CD0517AF32EA203AE920A7CA8A003AEF20A7C275003AEB20A7C266000E +:20006000CDAE0CC38A003A9320A7C29400C345083E01C34800CD6915CD83433A322032804C +:2000800020CD0F01CD8E02CDFC0A3AB920A7C46915CD2D1921EB207E2ECCBEC20300E1D14B +:2000A000C1F1FBC9AF3272203AE920A7CA8A003AEF20A7C2BD003AC1200FD29400CDEC421F +:2000C000212020CD9102CD5F01C39400CD6C0AE57E23666F220920220B20E12B7EFE03C258 +:2000E000E3003D320820FEFE3E00C2EE003C320D20C93E0232FB2132FB22C3CA0AF378D386 +:2001000005060A0E000DC2050105C20301FBC92102207EA7C28A12E53A06206F3A672067B6 +:200120007EA7E1CA440123232346E6F60707075F160021011C19EB78A7C459010610CD49EA +:2001400001CD9613AF320020C92A0B203A6B20A7C87CFE30D004251BC921400019EBC93AE6 +:200160006820A7C83A0020A7C03A6720673A062016023CFE37CCBF016F7EA77DCA720132AA +:200180000620CD980161220B207DFE28DA37177A3204203C320020C916007D2109204623ED +:2001A0004EFE0BFAB201DE0B5F78C610477B14C3A10168A7C85F79C6104F7B3DC3B3011552 +:2001C000CA13022106203600234E3600CD1F022105207E3CE60177AF21672066C921210008 +:2001E00021062CD306E5CDF907C5164001101EA7CAFD01FE11D40F02033DC2F8010A5FC14F +:20020000E1CDB217060B3E05772305C20802C936097EC9E1C93E0106E0210224C31112233A +:20022000462379867723788677C906C011001B210020C3B217214221C33E022142220E04A1 +:20024000111C1DD5062CCDB217D10DC24302C93E01C361023E01C35A02AF114222C36402F9 +:20026000AF1142213281200102162106283E04F5C53A8120A7C28802CDE917C1F13DC8D5FD +:2002800011E00219D1C36F02CDC111C37B022110207EFEFFC8FEFECAC70223464FB079C2A8 +:2002A000BD02237EA7C2CE02235E2356E5EBE521B502E3D5E9E1110C0019C391020504C245 +:2002C000C3023D05702B7711100019C39102352B2BC3C702E1237EFEFFCA88032335C0472B +:2002E000AF3268203269203E30326A207836052335C2EB032A1A200610CDB911CD101221D4 +:20030000102011101B0610CDB2170600CD5C173A6D20A7C03AEF20A7C8310024FBCD58170D +:20032000CD170BA7CA5314CDA5167EA7CA7C033ACE20A7CA7C033A6720F50FDA8203CD54A3 +:20034000023A0820472A0920EBCD6C0A7323722B2B70CD2A02F10F3E210600D262030620E8 +:200360003E22326720CDA20CAF321120CDFD003C329820CDA30BCDFF17C3FD08CDFF17C31B +:200380003609CD4F02C341032168203601237EA7C29B032335C29B032B36013A1B20473A61 +:2003A000EF20A7C2B4033A1D200FDAD1030FDADE03C3C003CDE8150707DAD10307DADE0342 +:2003C000211820CDBB17CDC717CD8311AF321220C978FED8CAC0033C321B20C3C00378FEBD +:2003E00030CAC0033D321B20C3C0033CE6013215200707070721911C856F221820C3C003C8 +:20040000112A20CD8617E1D0237EA7C8FE01CA3F04FE02CA4F0423FE03C26F0435CA7B0456 +:200420007EFE0FC0E5CD7504CD9711E123342323353523353535233608CD7504C34E113C22 +:20044000773A1B20C608322A20CD7504C34E11CD7504D5E5C5CD9711C1E1D13A2C20856FD7 +:20046000322920CDD6113A6120A7C8320220C9FE05C8C37B04212720C3BB17CD7504CD9752 +:200480001121252011251B0607CDB2172A8D202CE5CDF9132EF834E17DFE5FDAA0042E501F +:2004A000228D202A8F202C228F203A8420A7C07EE601012902C2BB0401E0FE218A20712302 +:2004C0002370C9E13A321B3232202A38207DB4C2D7042B223820C91135203EFCCDA5053AC5 +:2004E00046203270203A5620327120CDB8053A7820A7213520C2B00511301B21302006108E +:20050000C3B217CDF907FE04E1D258053A6E20A7C03A8020FE01C01145203EF0CDA5053A53 +:2005200036203270203A5620327120CDB8053A7620FE90DA3C053A481B3276203A7820A74F +:20054000214520C2B00511401B2140200610CDB2173A82203DC25D053E01326E202A762009 +:20056000C3D506E11155203EDECDA5053A46203270203A3620327120CDB8053A7620FE9541 +:20058000DA89053A581B3276203A7820A7215520C2B00511501B2150200610CDB2172A769F +:2005A00020225820C9327F20217320060BC3B217117320060BC3B2173AE420A7C0217320FC +:2005C0007EE680C21A063AC120FE043A6920CA1006A7C82336003A7020A7CAE305473ACF5A +:2005E00020B8D03A7120A7CAF005473ACF20B8D0237EA7CA73062A76204E23227620CD8762 +:2006000006D0CD980179C607677DD60A6F227B202173207EF680772334C9117C20CD861712 +:20062000D0237EE601C29B062334CDCC063A7920C603217F20BEDA3B06D60C3279203A7B72 +:2006400020473A7E2080327B20CDC3063A7B20FE15DA6A063A6120A7C83A7B20FE1EDA6AE7 +:2006600006FE27D26A06973215203A7320F601327320C93A1B20C60867CDC01279FE0CDA17 +:20068000FE050E0BC3FE050DCDF9136916057EA737C07DC60B6F15C28E06C9217820357E95 +:2006A000FE03C2BE06CDCC0621DE1C227920217C2035352B35353E06327D20C3C306A7C07C +:2006C000C3CC06217920CDBB17C3D611217920CDBB17C39711224820C9E13A8020FE02C0F0 +:2006E0002183207EA7CA64053A5620A7C26405237EA7C205073A8220FE08DA64053601CD1D +:200700005907CD1108118A20CD8617D02185207EA7C28C073AA120A7218A20CA2107C3112B +:20072000087E232386328A20CD3A07218A207EFE28DAAC07FEE1D2AC07C9CD5307C2110852 +:2007400021BD20347EE604C24D07C31108CD1708C310123ABC20FE02C921BC20347EFE02AE +:20076000C0217E182287203A8C20328C20C9CD5307C021A81DCD81072287200620E1C3ED0A +:20078000073ABA20A7C83E0132BB20C906FECD5C1723357EFE1FCA2008FE18CABF07A7C084 +:2007A00006EF2198207EA077E620D305CD1708CD1012218320060ACD3F0806FEC35C173EBD +:2007C0000132F1203ABC20FE01C2CF0732BA20CD6E072A8D20460E04214C1D11481D1AB8D9 +:2007E000CAE90723130DC2DE077E328720260068CD0108CD1708C3D70A3A6720672EF97E3D +:20080000C93AEF20A7CA0C0822F220C9AF32F120C9CD1708C38311218720CDBB17C3C7173E +:2008200006102198207EB077CD9915CD3408228720C3110821781DCD5307C021781DC911CE +:20084000831BC3B2173E01329320310024FBCD5817CD0517CDFA16CD1617211330113E1F2C +:200860000E04CDD90A3AEB203D2110280E14C27309114D18CDD90ADB01E604CA65080699B9 +:20088000AF32CE203AEB20802732EB203ACC20802732CC20CD051721000022F82022FC20F3 +:2008A00022F82122F822CDE316CDE916CD9710CD3010CD58172101017C32EF2022E7202247 +:2008C000E520CD1617CD3502CD3B02CDB70A32FF2132FF22CDF200AF32FE2132FE2232E4B1 +:2008E000203C32FA2132FA22CDDE01CDC21621783822FC2122FC22CD2A02CDFF17DB02E6C1 +:2009000008C4B945CD730ACDA30BAF32C120CD15023A67200FDA8E09CD5902CD9709CD15EA +:2009200002CDCC003E0132B9200620CDB816CDCA093E0032B920CD52170620CDB816CDFE66 +:2009400013CDC816CDB513CD580B3A8220A7CACA0BCD9111CD1E0BCDBE0ACD5815CD5E0C87 +:20096000CA68090604CDB816CD9E15D306CD2E16C33E09113818CDD90A0698DB010F0FDAA0 +:2009800089090FDA7E08C365083E01C38108CD6002CD9709C31E092127290E043A6720577A +:2009A0001EFA1AC61CF5C5CD241A0605C51AA6AE771301200009C105C2AC0901000509C15F +:2009C000F10DC2A509C91B241D1C210023110020E5D50610CDB21721082036002336A823EA +:2009E0002336A8232323E5CDB5133A8220FE1AD2600AFE0AD2660AE136FFCD5F01CD0F0179 +:200A00003A0E203207203A8220FE05D2160AC5015003CDC90EC13A09203A0920473A092353 +:200A2000F5C53E0ACDB815C1F1B8D306F526202EE12C7EA7CA4A0ACD491FE676FE56C24A2D +:200A40000A2EEA2C36022ECC3602F1C2FA09E1D10610CDB217CD19173AE720A7C8C3CA0A86 +:200A6000E136FCC3FA09E136FEC3FA093A6720672EFCC921112B11701B0E0ECDD90A3A6741 +:200A8000200F3E1E211137D4E50A3EB032C0203AC020A7C8E604C2A20ACD970BCDEF16C3BA +:200AA0008F0A0628211C263A67200FDAB10A211C39CD1012C38F0ADB02E601C603C93A82D4 +:200AC00020FE09D03EFB327E20C93ACE20A7C0211C390628C310120E031AD5CDE50AD11395 +:200AE0000DC2D90AC9CD241A0605D306CD8311C5AF770120000977097709C1C93A0920FE2B +:200B000078D02A91207DB4C2120B2100063E013283202B229120C9CDF7132EFF7EC9CDCEBA +:200B2000162B2B7EA7C80615CD8A10B8D8CD3746CDCE162B2B36003EFF3299200610C3B80A +:200B400016F53AAF20A7CA560B219C1DF1FE02D823FE04D823C9F1C9CD970B3AF120A7C840 +:200B6000AF32F120E52AF220EBE17E8327775F237E8A277757237E23666F7ACD7F0B7BD5BE +:200B8000F50F0F0F0FE60FCD920BF1E60FCD920BD1C9C61CC3E50A3A67200F21F820D82145 +:200BA000FC20C92102240E1A06DFE5C536001120001905C2AC0BC1E1230DC2A80BC93ABA50 +:200BC00020FE02C03E0132BB20C9CD410CCD1044CD8246CDF9132EF83600CDBE0BCD96180A +:200BE000AF32E920CDA30B3A6720F5CD2A02F13267203A6720672EFEE52EFA347EE52EF918 +:200C000034E1FE0AC2090C3600E17ECD210C7C0FDA380C3E21329820CD3B02CDC216C30EDF +:200C200009E6073C77219F1D233DC2280C46CDF9132EFC70233638C9CD3502CDDE01C30E44 +:200C400009CD5E0CC2570C3E3032C0203AC020A7C8CD5E0CCA4C0CCD5E0CC2570CC93A1559 +:200C600020FEFFC93AEF20A7CA810C480608CDB8164178CD410B7E21F32036002B772B3699 +:200C800001216220C9D51ACDE50AD13E0732C0203AC0203DC2900C130DC2850CC93E40C3E2 +:200CA000B60C3E80C3B60CE1CD8343C37B003AC1200FDAA70CC932C0203AC020A7C2B90CA3 +:200CC000C921EC207EA7C2D10C360132F921C3DE0136003E03C3CB0CAFD303D305CDDC1707 +:200CE000FBCD9D0CCDDC40CD9D0CCD3F16CD9D0CCDA30B3AFF21A7C2030DCDB70A32FF215E +:200D0000CDFF17CD2A02CDC10CCD3502CD6002CD1502CDCA093E0132C120CDFE13CD680D34 +:200D2000D306CD5E0CCA1A0DAF322520CD5E0CC22C0DAF32C120CD9D0CCDA30B0E0C21115B +:200D40002C111711CDD90ACDD20D012311CD7D16CD7316DB0207DA5F0D012711CD6116CD73 +:200D6000A20CCDA30BC39D16CDC816C31945DBD0D2CFC3DCCFD4C9C1D41B07082B12020EA5 +:200D800011041BDB00E640CCC90D3A4D23A7CAA400DB01E606C4C30DCDB90DE610060121B4 +:200DA000B120C2AE0D7EA723C2AE0D2B0600702A4A2323224A23C394003AE120A7C2F21534 +:200DC000DB01C93E0132BF20C9CD3011CD9710C33010E5C5CDBA10C1E1C93E20C3B60C3E03 +:200DE00005C3B60C015006CDB90DE660CAF80D0DC2E70D05C2E70DC9E1C9CDA30BCD2810F9 +:200E00000615116510214023CDB217113D102117270E17CDD90A21122711211ECDA70E2138 +:200E20001027CDA70E210E270E05CDA90ECD601A11161F0628CD83111154100E1121062A0B +:200E4000CDD90A3A4D23A7CA1B103A4B23FE20D21B10CDB90ECDB90DE676FE40CCD20EFE6E +:200E600020CC280F3ABF20A7C21B103AB220A7C2720F013001CDC90ECDC10E3A4B23FE1D77 +:200E8000C2430E0605C521062A0620CD7111CDDF0D11541021062A0E04CDD90ACDDF0DC1EE +:200EA00005C2850EC3430E0E0B0605CD8311C501600109C10DC2A90EC92A4E233E2AC3E554 +:200EC0000A2A4E233E1BC3E50A0DC2C90E05C2C90EC9CDE40DCDC10E2A4E237DFE11CA0307 +:200EE0000FFE0FCA0C0F7CFE33CA170F24247CFE35D2F70EC3FD0ECDC10E210D36224E2325 +:200F0000C3B90E7CFE3BD21C0FC3120F7CFE3BD2220F2424C3FD0E2634C3EC0E210F27C3B2 +:200F2000FD0E210D27C3FD0ECDE40DCDC10E2A4E237DFE11CA4C0FFE0FCA5D0F7CFE28DA1E +:200F4000660FFE34C2520F2633C3520F7CFE28DA570F2525C3FD0E211127C3FD0E7CFE2887 +:200F6000DA6C0FC3520F210F3BC3FD0E21113BC3FD0E01FF20CDC90E3A4C23FE0AD200102D +:200F80003A4E23FE11CAA00FFE0FCAA60F3A4F23FE32D2AE0FCDDE0FC616CDE50FC3430EBC +:200FA000CDDE0FC3E50FCDDE0FC60BC3E50FFE35D21B103A4C23A7CAD40F2A50232522501D +:200FC000233E1BCDE50A214C23352140233A4C23856F361BAF32B12032B220C3430E3A4F4F +:200FE00023D6270FC9214023F53A4C23856FF1772A5023CDE50A225023214C2334C3D40F23 +:201000003A4E23FE0DC21B103A4F23FE32D21310C31B10FE36D21B10C3B30FAF324D23CD9A +:201020009710CD3010C3A30B0650211E2DC371112A3E231140233A4C234FC3D90A07082BAD +:2010400012020E1104111B1B110406081213110013080E0D0D000C041B2E2F2F2F2F2F2F03 +:201060002F2F2F2F301B1B1B1B1B1B1B1B1B1B000000FF11270730000000E5D51100041920 +:201080003E1CCDE50AD1E1C37A0BCD970B7E23666F292929297CC93A4C23A7CAAE10473E15 +:2010A0000A90373F1FC62D672E1E223E23C9211E2D223E233E0A324C23C9CD7345AF32E424 +:2010C00020FB0605C511790D0E0A211E2DCDD90ACDDA0DCD2810CD9710CD3010CDDA0DC1AB +:2010E00005C2C410C9261D1B0E111B1E1B0F0B0018041112271B1B291D1B0F0B001804115D +:201100001B1B1D1B020E080D1B1B1B0C08031600181B1B00000000080D120411131B1B02E9 +:201120000E080D0D2AE5100A2AF710072A3C11FF060E110911214023CDB217C9291E1B0F15 +:201140000B00180411121B1E1B020E080D12CDB911C5E51AD304DB03B6772313AFD304DBE6 +:2011600003B677E101200009C105C25111C9CDB911C5E5AF77237723E101200009C105C2CA +:201180007111C9C51A771301200009C105C28311C9CD8A10C33F15CDB911C5E51AD304DB01 +:2011A000032FA6772313AFD304DB032FA677E101200009C105C29A11C97DE607D302C3C72A +:2011C00017C5E57E1213230DC2C311E101200009C105C2C111C9CDB911AF326120C5E51AFA +:2011E000D304DB03F5A6CAEE113E01326120F1B6772313AFD304DB03F5A6CA02123E013242 +:201200006120F1B677E101200009C105C2DD11C9AFC57701200009C105C21112C93A2520DD +:20122000FE05C8FE02C03A2920FED847D282123A0220A7C878FECED2D012C606473A0920E4 +:20124000FE90D24912B8D28212683A0920C650BDDCCA12CDB3123A2A2067CDC01279FE0CC0 +:20126000D282122264203E05322520CD45137EA7CA8212CDD812CDBB17CD96133E103203B1 +:2012800020C93E03322520C39C1221032035C02A64200612CD30133E04322520AF32022071 +:2012A00006F7C35C170E00BCD45413BCD0C6100CC3AB123A092065CDA5124105DE106FC950 +:2012C0003A0A20CDA512DE1067C93E0132AD20C93E01328520C397127E32DB200605360093 +:2012E000E521622036C223361C2323233610E1FE01CC0113FE03CC0713FE07CC0413C36494 +:201300000C0601C90607C9E5F5CDF907FE01D22713F1E10603C923360721622036E0233653 +:201320001A2323233620C9F1E136070603C316133A6220FEC2CA6E1111311CD5CD9613D1C8 +:201340000610C3991378070707808080813D6F3A672067C90CC610FA5413C93A0D20A7C201 +:201360007B1321A43ECD8913D006FE3E01320D20783208203A0E20320720C9212425CD89E5 +:2013800013D0CDAF16AFC36D1306177EA7C251142305C28B13C9CDB91100C5E51AD304DB1F +:2013A00003772313AFD304DB0377E101200009C105C29A13C9CDF7130100377EA7CAC113C7 +:2013C0000C2305C2BB1379328220FE01C0216B203601CDF7137EA7C2774606167EA7C2E7F5 +:2013E000132305C2DC13C9FE01C02E057EA7C47E463E0132AE20C92E003A672067C93A1523 +:2014000020FEFFC02110207E2346B0C03A2520A7C03AEF20A7CA38143A2D20A7C22E14CD5C +:20142000E815E610C83E01322520322D20C9CDE815E610C0322D20C921252036012AED2057 +:20144000237DFECADA49142EBF22ED207E321D20C937C9AFCD0B18CDCE163600CD970B2303 +:2014600011F5201ABE1B2B1ACA7114D28114C37514BED281147E1213237E12CD1017CDB21E +:20148000143ACE20A7CAF2142103281124180E14CD850C2525061D3A67200FDAA014061E91 +:2014A00078CDE50ACD9D0CCDA5167EA7CAF214C33603CDE41421E02036013A6720FE21C24A +:2014C000C614233600C9233620C921E0207EA7C823E546CDFD00CDFA0DE136FF2B36000657 +:2014E00000C3FD00CD2810060A116510214023C3B21721182D1124180E0ACD850CCDA20CDD +:20150000CDCA14CDA30BAF32EF20D305CD5217C3320D310024FBAF321520CD1D120604CD6C +:20152000B816CD5E0CC21A15CD5817210127CD7A17AFCD0B1806FBC33117CD970B237E1106 +:20154000BA1C211F180E04471AB8D2531523130DC248157E32CF20C93A2520A7C2641506C7 +:20156000FDC35C170602C3B816219B2035CC96153A6820A7CA961521962035C02198207E16 +:20158000D3053A8220A7CA96152B7E2B772B36013E04329B20C93A9820E630D305C93A955E +:2015A00020A7CAD31521911711A1173A8220BED2B7152313C3AE151A3297202198207EE6EC +:2015C00030477EE60F07FE10C2CD153E01B077AF32952021992035C006EFC35C1706EF215C +:2015E00098207EA077D305C93A67200FD2F215DB01C9DB02C9DB02E604C83A9A20A7C0C35C +:20160000501A0604C5CDA30BC105C204163E01329A20CD5817FB11BE1C2116300E04CD855C +:201620000CCD9D0CAF329A20329320C3F2142184207EA7CABA07237EA7C00601C3B81621A9 +:20164000122811CB1A0E15CDD90A3E0B326C2001AB1DCD7D16DA5E16CD6B16C3521601C4CB +:201660001DCD7D16D8CD7316C36116C50610CD8311C1C9C53A6C204FCD850CC1C90AFEFFF6 +:2016800037C86F030A67030A5F030A5703A7C93100240600CD2C02CD3011CD16173E08324F +:2016A000CF20C3D80C3A672021E7200FD023C906023A82203DC004C93A9420B0329420D3DB +:2016C00003C9210022C3E101CD1D12C35B1321E7203A67200FD823C90E1C211E2411621855 +:2016E000C3D90A21F820C3EF1621FC20C3EF165E2356237E23666FC37A100E072101351104 +:20170000421FC3D90A3AEB2021013CC61CC3E50A21F420C3EF16CDDC17CDD816CDE316CD80 +:20172000E916CD1017CD9710CD3010CDFA16C30517CD5C17C357143E01326D20C31215F132 +:20174000E3E2D6CAE3E2CECDD4E3E0C8DECBD0D4E3F13E0132E920C9AFC354173A9420A096 +:20176000329420D303C9210127CA7A1711811C06104FCD8311793DC26C170610CD10127C50 +:20178000FE35C27A17C9217220461AE680A8C037C9322B241C16110D0A080706050403021B +:2017A00001342E27221C181513100E0D0C0B090705FF1A77231305C2B217C95E2356237E33 +:2017C000234E2346616FC9C506037C1F677D1F6F05C2CA177CE63FF62067C1C921002436F0 +:2017E00000237CFE40C2DF17C9C5E51AB67713230DC2EB17E101200009C105C2E917C9CD6A +:20180000170BA7C8F53D77CD6617F1210125E60FC3920B0000FFB8FE211C109E00211C30AA +:20182000100B080706000C041B0E1504111B1B0F0B00180411261B271D1B0E111B1E0F0B86 +:2018400000180411121B011413130E0D1B0E0D0B181B1D0F0B001804111B1B011413130E81 +:201860000D1B1B12020E11042B1D1B1B1B1B1B1B1B1B1B1B1B1B12020E11042B1E1B0000C7 +:2018800000000C141C163E76DEF6DE763E161C140C0000000000CD5817CDA30B21011C1184 +:2018A00010003ADB20FE01CAB71819FE03CAB71819FE05CAB7181922DD2021D12011D11B9C +:2018C000060CCDB2172A0B2022D42021010122D2203E0132D0203AD420FED0D20E19D3068F +:2018E0003AD920A7C2D6183AD120A7CAD618AF32D020CD9D0C2110280E0E11161ACD850C79 +:20190000CD9D0C3E0132D02032D920C3D618CDBA07AF32D020CDA30BC39D0C21DF20357EFB +:20192000E602CABA07C33A16120E121B2D3AEF20A7CC531F3AD020A7C811D520C3401AFEBF +:2019400022C24B19CD8617D0C34F19CD8617D83ABB20A7C2BC19CD1B193AD520FEB0D4A4EF +:2019600019FE50DC9B1921D420CDBB17EBE5CD96132ADD20EB010807E1090610CDA01A21AC +:20198000DA20357EE601C294193C32D22021D2204EC31F02AF32D220C38D193E0132D320FF +:2019A000F5C3AA19F53EFF32D3202AD42026D01128190E05CDC717CDD90AF1C93AD420FE9B +:2019C00098D2C719C356193AD120A7C2E9192AD4200108070922D4202ADD2022D62021D870 +:2019E00020361021010022D22021DF20357EE601C2F619CD8D193E0132D12021D420CDBB4E +:201A000017EBE521DC20357EE604CC111AE1C396133E40835FC9040D06080D041B13110E3B +:201A200014010B0411211EA7C8E5210000C5010500093DC22E1A19EBC1E1C921002411508D +:201A4000DB02E602C244193A6720C33F19FFFFFF32D020D303D305329820310024C30216DF +:201A6000218E3011701A0610CD8311210E33C9000032494926007F484830003E414122003F +:201A80000107010101040B01060301010B090208020B04070A050205040607080A060A039E +:201AA000CDB911C5E51AD304DB03B6772313AFD304DB0377E101200009C105C2A31AC901BE +:201AC00001000001000201000201002912020E11041B000315000D02041B1300010B0429F1 +:201AE00000000000317ADCF4F4DC7A313A4C3A317ADCF4F4DC7A310000000000000000003A +:201B00000100001000000000027838783800F800008000D402FF050C811C203010010000F6 +:201B200000000000040010B11C2830010400FFFF000002C304000000000004F01C0000038D +:201B40000000000305000001801A04E41C000003000000D906000001861A04D21C00000366 +:201B6000FF00C21C0000102101003000120000000F0B00181B0F0B00180411261D27FC001A +:201B800001FFFF00000020601DD0291802501D000800060000014000010000109E00211CEE +:201BA0000000FE00C800251C08000000000000010000000000020000000000000000000013 +:201BC00000100000000000000000000000000000000000000000FC1C1D00000000000000C0 +:201BE00000FF0101000000000001000001BF1A007800000000051C2F00001C2600001C39AA +:201C000000000039797A6EECFAFAEC6E7A79390000000000781DBE6C3C3C3C6CBE1D780092 +:201C20000000000000193A6DFAFA6D3A190000000000000000307ADDF4F4DD7A300000003A +:201C4000000000387A7F6DECFAFAEC6D7F7A3800000000000E18BE6D3D3C3D6DBE180E0024 +:201C600000000000001A3D68FCFC683D1A000000000000000000102A7C7C2A100000000082 +:201C80000000000F1F1F1F1F7FFF7F1F1F1F1F0F00000401130307B30F2F032F490403009C +:201CA00001400805A30A035B0F27270B4B408411480F993C7E3DBC3E7C99021020301308D0 +:201CC0000B130008492214814200428114224908000044AA1088542210AA442254884A15FB +:201CE000BE3F5E2504FC0410FC1020FC2080FC8000FE0024FE1200FE0048FE900000000402 +:201D00000C0C1E3E2E6E7EFCECECFCFCECECFC7E6E2E3E1E0C0C040000000000FF0FFF1FD7 +:201D2000FF3FFF7FFFFFFCFFF8FFF0FFF0FFF0FFF0FFF0FFF0FFF0FFF8FFFCFFFFFFFFFF80 +:201D4000FF7FFF3FFF1FFF0F051015309093969910050510151010053010101005151005FC +:201D600000000000040C1E373E7C747E7E747C3E371E0C0400000000002200A54008983D5D +:201D8000B63C361D104862B61D980842900800001B211C1D1C1C1D211C1F1C1C010203058E +:201DA00060504848484040401E1C1C0E2C82180C2C641D0A2A311C0A2C211C082C511C065D +:201DC0002C011CFF0E2ED91D0C2EE41D0A2EEF1D082EFA1D062E051EFF281E1C1C1B0F0EB1 +:201DE000080D1312281B2C1B0C181213041118281B1F1C1B0F0E080D1312281B1E1C1B0F12 +:201E00000E080D1312281B1D1C1B0F0E080D1312002C2C2C2C84845858B0B0B02C585884B4 +:201E2000841F2444241F7F494949363E414141227F4141413E7F494949417F484848403EB1 +:201E4000414145477F0808087F00417F4100020101017E7F081422417F010101017F2018A2 +:201E6000207F7F1008047F3E4141413E7F484848303E4145423D7F484C4A313249494926DF +:201E800040407F40407E0101017E7C0201027C7F020C027F631408146360100F106043454C +:201EA000495161000003030000000000003E4549513E00217F0100234549493142414959D5 +:201EC000660C14247F04725151514E1E29494946404748506036494949363149494A3C08EC +:201EE000142241000041221408141414141422147F14221818181818080808080820404D50 +:201F00005020000079007900000000C04040404040C000000000001F141609001E01011E0F +:201F2000001F15150A000000000000000000001F151511001F08041F001F11110E000F1438 +:201F400012070211040308131B21521FE52EEF2615E9C9CD9C45C34F45FFFFFFFFFFFFFF99 +:201F6000000000000000000000000000000000000000000000000000000000000000000061 +:201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:201FA000000000000000000000000000000000000000000000000000000000000000000021 +:201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:201FE0000000000000000000000000000000000000000000000000000000000000FFFF00E3 +:2020000001010101010101010101010101010101010101010101030303030303030303038C +:20202000030303030303030303030303010101010101010101010101010101030303010162 +:2020400001010505000303000303000505050505050505050505050501030101010101011D +:20206000010301010100030303030300010107000500030503000500070707030005050505 +:202080000003070701010101010101010101010103030300010003030301050505000303FA +:2020A00003000505050707070707070707070707010103030303030303010101010303039D +:2020C00003030303010105030303030303030303050505050503030305050505211726112D +:2020E000E441011808CDCD41CD9D0C21172611EC41011006CD4841CD9D0C210D2611E44140 +:20210000011804CDCD41CD9D0C210D26114C42010806CD4841CD9D0C21062E117C4201025C +:2021200038CD3341CD9D0CCD1917CDD20DCD9D0CC3A30BC5E51A7723130DC23541E1012068 +:202140000009C105C23341C9E5C5D50E081A0FF5D2A441C50E04112000190DC25941C1F10B +:202160000DC24E41D11305C24A4121B020347EE602CA7C413600C1E12BC37E41C1E10DC2C3 +:202180004841AF32B020261F2EE4242D7EA7C8CD491FE676FE36C02EEC2D261F2436022ED5 +:2021A000CC3602C9C50E033AB020FE01C2C8413EE046A077112000190DC2B14119015002B6 +:2021C000CDC90ED306C35E413E0EC3B141E5C5D5D3060608CD8311D10DC2CF41C1E12B05D6 +:2021E000C2CD41C9EEEEEE00EEEEEE001EFCC1071EFE7FFCC3073FFEFFFCE78F7FFEFFFC49 +:20220000E78F7FFEE31CF79F7307E71CF79F73070E1C779D03073EFC779D031FFCF8F3DF2B +:20222000811FF0F9C1C7811FC039E0CE81019839E0CE9D01983970DCDD01F83970DCDF0F41 +:20224000F039E08ECF0FE038E00EC70F369B39CFF738369B39DBB06D769B6DDBB00DF69B7C +:202260006DDBB00DF6F37CDBF338B6F36CDBB06136636CDBB06D36636CCFB739FFFFFFFF30 +:20228000FFFFC0F1C0F1C0FF807F003F00000000FF0FFF3FFFFFC0F1C0F1FFFFFF3FFF0FEB +:2022A00000000000FFFFFFFFFFFFC0F1E0F1FFFFBF7F1F3F0000000000F000F000F0FFFF3A +:2022C000FFFFFFFF00F000F000F0000000000000000000000000000007F0FFFFFFFFFFFF41 +:2022E00007F007F0FFFFFFFFFFFF07F0CDF907FE02D8FE04D2FC423AB820A7C03AAD20A721 +:20230000C0CDBB4321A1207EA7C25E432B7EE680C83AA020E60F473A0A2005CA2343C6104C +:20232000C31A43C60432A520DE08E6FE47218A207EE6FEB8C03A0920C64032A9203A062042 +:2023400021AA20BED2594306023A0D20A7C2524306FE3AA5208032A5203E0132A12021A488 +:2023600020CDBB17EB3AA920BDDA79432AAA203605CDA3433E0132B720212020CD9102E191 +:20238000C3940021A1207EA7C821A2204ECD1F0221A420CDBB17EB7DFE2FD2AE43118C453A +:2023A000CD9613060E21A02011A01BC3B2173AAD20A7CAB843119445C396133A8420A7CA42 +:2023C000FF433AA120A7C04F3A8C20FE02793A672067060BC2E4432E2C7EA7CAF1432305E4 +:2023E000C2D943C92E367EA7CAF1432B05C2E643C922AA207DC605E60FF68032A020C93A37 +:20240000A020E67F32A02021B7207EA7C82377C93AAE20A7C8CD5817CD534622F2203E01D1 +:2024200032F120CD580B3E0232C0202104291108450E11CDD90A01B4200AA711C609C249EB +:20244000440B0AA7CA5144131321042F0E02CDD90A2110231104450604CDB2172A0B203E02 +:20246000078467221223CD8944CDE3447DFEC8D2EB44CDCF44E5CDA344E1CDB944211023C9 +:20248000342334CDE044C36C44CDCF443AC020A7CA9B443E0232C020C33A163E0032C0204E +:2024A000C3BA073A10234F3A1123477C9067FE38D8CDCF440DC2A744C93A10234F3A112319 +:2024C000477C8067FEE8D0CDCF440DC2BD44C9E5CDC7173E0F77E1C5012003CDC90EC1C9D7 +:2024E0002A12233E08856F221223C921BE20343AB520BEDAFC44CDA30BC32B443600CDBA9F +:2025000007C3A20C01020000010E0D14121B1B211C1C1B0F0E080D131226202E1E7EA7C284 +:202520002E45CD491FE676D652C03C321E20CD491FE676FE34C0262C2E1B160D1E780E0A14 +:202540000C1AC63FD5CDE50AD11B0DC24145C921D0CB01E3D4114C171AFEDEC0131ABCC06E +:20256000131ABDC0131AB8C0131AB9C02EE226203600C926282E031E5116170E120C1AC6EA +:2025800038D5CDE50AD11B0DC27E45C9183C7EDBFF245AA5985CB65F5FB65C98DB00E60A7F +:2025A000FE0ACA0000A700C021E3203600C90F11041204131B0C0E030421152D11AE450EC1 +:2025C0000BCD850CDB01E676FE10C8FE04CCE445FE20CCF945FE02CCFF45FE40CC3146D301 +:2025E00006C3C445DB01E604C2E44521000122F2203E0132F120C3580B21E4203601C9DB5A +:2026000001E602C2FF45CDF907FE12DA10463609342EFA347EFE0AC21C463600CD5902CD1A +:202620009709CDDE01CDC216CDF9132EFE7EC3210C21E4203600C9CD170B347EF521012535 +:2026400024243DC24046061011811CCD8311F13CC30B1821B3207EA7C26546237EA7C26E77 +:2026600046215000C92100013E0432B520C92180003E0332B520C932B32032AE20C932B440 +:2026800020C9CDF9132EF87EFE38D0CD170B347EFE07D0CD3C46CD3C0B010000CDC90E064A +:2026A000EFC35C1700000000000000000000000000000000000000000000000000000000F5 +:2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2026E0000000000000000000000000000000000000000000000000000000000000000000DA +:20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:20272000000000000000000000000000000000000000000000000000000000000000000099 +:20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20276000000000000000000000000000000000000000000000000000000000000000000059 +:20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:2027A000000000000000000000000000000000000000000000000000000000000000000019 +:2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2027E0000000000000000000000000000000000000000000000000000000000000000000D9 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/jatrespecter.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/jatrespecter.hex new file mode 100644 index 00000000..98ced5ec --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/jatrespecter.hex @@ -0,0 +1,258 @@ +:020000040000FA +:20000000000000C3D4180000F5C5D5E5C38C0000F5C5D5E53E8032722021C0203500000042 +:20002000DB010FDA67003AEA20A7CA42003AEB20FE99CA3E00C6012732EB20CD4719AF3280 +:20004000EA203AE920A7CA82003AEF20A7C26F003AEB20A7C25D00CDBF0AC382003A93206C +:20006000A7C28200C365073E0132EA20C33F00CD40173A3220328020CD0001CD4802CD9223 +:200080001900E1D1C1F1FBC900000000AF3272203AE920A7CA82003AEF20A7C2A5003AC124 +:2000A000200FD28200212020CD4B02CD4101C38200CD8608E57E23666F220920220B20E1BF +:2000C0002B7EFE03C2C8003D320820FEFE3E00C2D3003C320D20C93E0232FB2132FB22C382 +:2000E000E408CDE601210000220023211C2D220223C911F5203A0623A7C0110123C9000092 +:200100002102207EA7C23815E53A06206F3A6720677EA7E1CA360123237E2346E6FE070766 +:20012000075F160021001C19EB78A7C43B012A0B200610CDD315AF320020C921300019EBA4 +:20014000C93A6820A7C83A0020A7C03A6720673A062016023CFE37CCA1016F4605C2540194 +:20016000320620CD7A0161220B207DFE28DA71197A3204203E01320020C916007D21092023 +:2001800046234EFE0BFA9401DE0B5F78C610477B14C3830168A7C85F79C6104F7B3DC39579 +:2001A0000115CACD012106203600234E3600CDD9012105207E3CE60177AF21672066C900E2 +:2001C000210021063736012305C2C501C9E1C93E0106E0210224C3CC142346237986772312 +:2001E000788677C906C011001B210020C3321A214221C3F8012142220E0411201DD5062C53 +:20020000CD321AD10DC2FD01C93E01C31B023E01C31402AF114222C31E02AF11422132814A +:20022000200102162106283E04F5C53A8120A7C24202CD691AC1F13DC8D511E00219D1C336 +:200240002902CD7C14C335022110207EFEFFC8FEFECA810223464FB079C27702237EA7C219 +:200260008802235E2356E5EBE5216F02E3D5E9E1110C0019C34B020504C27D023D05702BC4 +:200280007711100019C34B02352B2BC38102E1237EFEFFCA3B032335C047AF3268203269E2 +:2002A000203E30326A207836052335C29B032A1A200610CD241421102011101B0610CD3268 +:2002C0001A0600CDDC193A6D20A7C03AEF20A7C8310024FBCDD719CD2E09A7CA6D16CDC8BC +:2002E0001E7EA7CA2C033ACE20A7CA2C033A6720F50FDA3203CD0E02CD78087323722B2B9E +:200300007000CDE401F10F3E210600D2120306203E22326720CDB60AAF32112078D3053C05 +:20032000329820CDD609CD7F1AC3F907CD7F1AC31708CD0902C3F802000000216820360141 +:20034000237EA7C3B003002B36013A1B20473AEF20A7C263033A1D200FDA81030FDA8E034B +:20036000C36F03CDC0170707DA810307DA8E03211820CD3B1ACD471ACD39143E0032122061 +:20038000C978FED9CA6F033C321B20C36F0378FE30CA6F033D321B20C36F033CE601321500 +:2003A000200707070721701C856F221820C36F03C24A032335C24A03C34603112A20CD0621 +:2003C0001AE1D0237EA7C8FE01CAFA03FE02CA0A0423FE03C22A0435CA36047EFE0FC0E527 +:2003E000CD3004CD5214E123342323353523353535233608CD3004C300143C773A1B20C6F8 +:2004000008322A20CD3004C30014CD3004D5E5C5CD5214C1E1D13A2C20856F322920CD9107 +:20042000143A6120A7C8320220C9FE05C8C33604212720C33B1ACD3004CD5214212520116E +:20044000251B0607CD321A2A8D202C7DFE63DA53042E54228D202A8F202C228F203A84201F +:20046000A7C07EE601012902C26E0401E0FE218A2071232370C9E13A321B3232202A382048 +:200480007DB4C28A042B223820C91135203EF9CD50053A46203270203A5620327120CD63A9 +:2004A000053A7820A7213520C25B0511301B2130200610C3321AE13A6E20A7C03A8020FE4C +:2004C00001C01145203EEDCD50053A36203270203A5620327120CD63053A7620FE10DAE7FF +:2004E000043A481B3276203A7820A7214520C25B0511401B2140200610CD321A3A82203D3D +:20050000C208053E01326E202A7620C37E06E11155203EDBCD50053A46203270203A362072 +:20052000327120CD63053A7620FE15DA34053A581B3276203A7820A7215520C25B051150C6 +:200540001B2150200610CD321A2A7620225820C9327F20217320060BC3321A117320060B43 +:20056000C3321A2173207EE680C2C1053AC120FE043A6920CAB705A7C82336003A7020A7AD +:20058000CA8905473ACF20B8D03A7120A7CA9605473ACF20B8D0237EA7CA1B062A76204EFB +:2005A0002300227620CD2F06D0CD7A0179C607677DD60A6F227B202173207EF6807723349A +:2005C000C9117C20CD061AD0237EE601C244062334CD75063A7920C603217F20BEDAE205DA +:2005E000D60C3279203A7B20473A7E2080327B20CD6C063A7B20FE15DA12063A6120A7C8CA +:200600003A7B20FE1EDA1206FE2700D21206973215203A7320F601327320C93A1B20C60855 +:2006200067CD6F1579FE0CDAA5050E0BC3A5050D3A6720676916057EA737C07DC60B6F15CE +:20064000C23706C9217820357EFE03C26706CD750621DC1C227920217C2035352B35353E20 +:2006600006327D20C36C06A7C0C37506217920CD3B1AC39114217920CD3B1AC35214224818 +:2006800020C9E13A8020FE02C02183207EA7CA0F053A5620A7C20F05237EA7C2AB063A828B +:2006A00020FE08DA0F053601CD3C07118A20CD061AD02185207EA7C2D606218A207E23234F +:2006C00086328A20CD3C07218A207EFE28DAF906FEE1D2F906C906FECDDC1923357EFE1F2E +:2006E000CA4B07FE18CA0C07A7C006EF2198207EA077E620D305000000CD4207CDCB142160 +:200700008320060ACD5F0706FEC3DC193E0132F1202A8D20460E0421501D114C1D1AB8CAE2 +:20072000280723130DC21D077E3287202600682929292922F220CD4207C3F108CD4207C3F9 +:200740003914218720CD3B1AC3471A06102198207EB077CD7017217C1D228720C33C0711BC +:20076000831BC3321A3E01329320310024FBCD7919CDD609210F3011F31F0E04CDB01E3AE3 +:20078000EB203D210C280E14C2570811CF1ACDF308DB01E604CA7F070699AFCDCD173AEB7D +:2007A00020802732EB20CD471921000022F82022FC20CD2519CD2B19CDD7192101017C32C5 +:2007C000EF2022E72022E520CD5619CDEF01CDF501CDD10832FF2132FF22CDD700AF32FE30 +:2007E0002132FE22CDC001CD041921783822FC2122FC22CDE401CD7F1ACD8D08CDD6090098 +:20080000AF32C120CDCF013A67200FDA7208CD1302CDCF01CDB100CDD1190620CDFA18CDCF +:200820001816CD0A19CDF315CD88093A8220A7CAEF09CD0E17CD3509CDD808CD2C17CD5942 +:200840000ACA49080604CDFA18CD7517D306CD0418C31F0800000011BA1ACDF3080698DB5F +:20086000010F0FDA6D080FDA9807C37F073E01C39B07CD1A02C314083A0820472A0920EBE6 +:20088000C386080000003A6720672EFCC921112B11701B0E0ECDF3083A67200F3E1C2111B3 +:2008A00037D4FF083EB032C0203AC020A7C8E604C2BC08CDCA09CD3119C3A9080620211C9F +:2008C000263A67200FDACB08211C3ACDCB14C3A908DB02E603C603C93A8220FE09D03EFB9A +:2008E000327E20C93ACE20A7C0211C3A0620C3CB140E031AD5CDFF08D1130DC2F308C91135 +:20090000001EE526006F29292919EBE10608D306C339143A0920FE78D02A91207DB4C22948 +:20092000092100063E013283202B229120C9CD11162EFF7EC9CD10192B2B7EA7C80615DB15 +:2009400002E608CA48090610CDCA09237EB8D8CD2E09347EF521012524243DC258090610F5 +:2009600011601CCD3914F13CCD8B1ACD10192B2B36003EFF3299200610C3FA1821A01DFEC0 +:2009800002D823FE04D823C9CDCA093AF120A7C8AF32F120E52AF220EBE17E8327775F233A +:2009A0007E8A277757237E23666FC3AD097ACDB2097BD5F50F0F0F0FE60FCDC509F1E60F2F +:2009C000CDC509D1C9C61AC3FF083A67200F21F820D821FC20C92102243600237DE61FFE31 +:2009E0001CDAE809110600197CFE40DAD909C9CD3C0AAF32E920CDD6093A6720F5CDE40190 +:200A0000F13267203A672067E52EFE7EE6073C7721A21D233DC2130A7EE12EFC7723363825 +:200A20007C0FDA330A3E21329820CDF501CD0419C30408CDEF01CDC001C30408CD590AC243 +:200A4000520A3E3032C0203AC020A7C8CD590ACA470ACD590AC2520AC93A1520FEFFC93A60 +:200A6000EF20A7CA7C0A480608CDFA184178CD7C097E21F32036002B772B3601216220C9D8 +:200A80003E0232C120D3063ACB20A7CA850AAF32C120C9D51ACDFF08D13E0732C0203AC095 +:200AA000203DC29E0A130DC2930AC9215020C34B023E40C3D70A3E80C3D70AE1C372003AB2 +:200AC000C1200FDABB0A0FDA68180FDAAB0AC921142B0E0FC3930A32C0203AC020A7C2DA6B +:200AE0000AC921C220060CC3321AAFD303D305CD8219FBCDB10A3AEC20A72117300E04C28E +:200B0000E80B11FA1CCD930A11AF1DCDCF0ACDB10ACD1518CDB60A3AEC20A7C24A0B119515 +:200B20001ACDE20ACD800A11B01BCDE20ACD800ACDB10A11C91FCDE20ACD800ACDB10A2165 +:200B4000B733060ACDCB14CDB60ACDD6093AFF21A7C25D0BCDD10832FF21CD7F1ACDE4017B +:200B6000CDC001CDEF01CD1A023E0132C120CDCF01CD1816CD0A19D306CD590ACA710BAF69 +:200B8000322520CD590AC2830BAF32C120CDB10ACD88190E0C21112C11901FCDF3083AEC80 +:200BA00020FE00C2AE0B2111333E02CDFF08019C1FCD5618CD4C1800000000000001A01F3B +:200BC000CD3A18CDB60A3AEC20FE00C2DA0B11D51FCDE20ACD800ACD9E1821EC207E3CE619 +:200BE0000177CDD609C3DF1811AB1DCD930AC30B0BCD0A19C39A1924002526262624012590 +:200C00000000000000000000000000000000000000000000000000000000000000000000D4 +:200C20000000000000000000000000000000000000000000000000000000000000000000B4 +:200C4000000000000000000000000000000000000000000000000000000000000000000094 +:200C6000000000000000000000000000000000000000000000000000000000000000000074 +:200C8000000000000000000000000000000000000000000000000000000000000000000054 +:200CA000000000000000000000000000000000000000000000000000000000000000000034 +:200CC000000000000000000000000000000000000000000000000000000000000000000014 +:200CE0000000000000000000000000000000000000000000000000000000000000000000F4 +:200D00000000000000000000000000000000000000000000000000000000000000000000D3 +:200D20000000000000000000000000000000000000000000000000000000000000000000B3 +:200D4000000000000000000000000000000000000000000000000000000000000000000093 +:200D6000000000000000000000000000000000000000000000000000000000000000000073 +:200D8000000000000000000000000000000000000000000000000000000000000000000053 +:200DA000000000000000000000000000000000000000000000000000000000000000000033 +:200DC000000000000000000000000000000000000000000000000000000000000000000013 +:200DE0000000000000000000000000000000000000000000000000000000000000000000F3 +:200E00000000000000000000000000000000000000000000000000000000000000000000D2 +:200E20000000000000000000000000000000000000000000000000000000000000000000B2 +:200E4000000000000000000000000000000000000000000000000000000000000000000092 +:200E6000000000000000000000000000000000000000000000000000000000000000000072 +:200E8000000000000000000000000000000000000000000000000000000000000000000052 +:200EA000000000000000000000000000000000000000000000000000000000000000000032 +:200EC000000000000000000000000000000000000000000000000000000000000000000012 +:200EE0000000000000000000000000000000000000000000000000000000000000000000F2 +:200F00000000000000000000000000000000000000000000000000000000000000000000D1 +:200F20000000000000000000000000000000000000000000000000000000000000000000B1 +:200F4000000000000000000000000000000000000000000000000000000000000000000091 +:200F6000000000000000000000000000000000000000000000000000000000000000000071 +:200F8000000000000000000000000000000000000000000000000000000000000000000051 +:200FA000000000000000000000000000000000000000000000000000000000000000000031 +:200FC000000000000000000000000000000000000000000000000000000000000000000011 +:200FE0000000000000000000000000000000000000000000000000000000000000000000F1 +:2010000000CD741400C5E51AD304DB03B6772313AFD304DB03B677E101200009C105C20576 +:2010200014C90000CD7414C5E5AF77237723E101200009C105C22714C9C51A7713012000D0 +:2010400009C105C23914C90000000000000000000000CD7414C5E51AD304DB032FA67723AC +:2010600013AFD304DB032FA677E101200009C105C25514C97DE607D302C3471AC5E57E124B +:2010800013230DC27E14E101200009C105C27C14C9CD7414AF326120C5E51AD304DB03F5A8 +:2010A000A6CAA9143E01326120F1B6772313AFD304DB03F5A6CABD143E01326120F1B67713 +:2010C000E101200009C105C29814C9AFC57701200009C105C2CC14C93A2520FE05C8FE0278 +:2010E000C03A2920FED847D230153A0220A7C878FECED27915C606473A0920FE90D204151B +:20110000B8D2301568CD62153A2A2067CD6F152264203E05322520CD81157EA7CA301536EB +:2011200000CD5F0ACD3B1ACDD3153E10320320C93E03322520C34A1521032035C02A642075 +:201140000610CD24143E04322520AF32022006F7C3DC19000E00BCD49015BCD0C6100CC38F +:201160005A153A092065CD54154105DE106FC93A0A20CD5415DE1067C93E01328520C345C0 +:201180001578070707808080813D6F3A672067C90CC610FA9015C93A0D20A7C2B71521A464 +:2011A0003ECDC515D006FE3E01320D20783208203A0E20320720C9212425CDC515D0CDF1DD +:2011C00018AFC3A91506177EA7C26B162305C2C715C900CD7414E5C5E51AD304DB03772366 +:2011E00013AFD304DB0377E101200009C105C2D715E1C9CD11160100377EA7CAFF150C237A +:2012000005C2F91579328220FE01C0216B203601C92E003A672067C93A1520FEFFC02110C5 +:20122000207E2346B0C03A2520A7C03AEF20A7CA52163A2D20A7C24816CDC017E610C83E41 +:2012400001322520322D20C9CDC017E610C0322D20C921252036012AED20237DFE7EDA63FF +:20126000162E7422ED207E321D20C937C9AFCD8B1ACD10193600CDCA0923CDF2001ABE1B0F +:201280002B1ACA8B16D29816C38F16BED298167E1213237E12CD5019CD8B19A7CAC916210A +:2012A000032811A61A0E14CD930A2525061B3A67200FDAB716061C78CDFF08CDB10ACDE71A +:2012C000187EA7CAC916C3ED0221182D11A61A0E0ACD930ACDB60ACDD609AF32EF20D305BC +:2012E000CDD119C3890B310024FBAF321520CDD8140604CDFA18CD590AC2EE16CDD7192104 +:201300000127CDFA19AFCD8B1A06FBC36B19CDCA09237E11B81C2107230E04471AB8D227C7 +:201320001723130DC21C177E32CF20C93A2520FE00C2391706FDC3DC190602C3FA180000CF +:20134000219B2035CC6D173A6820A7CA6D1721962035C02198207ED3053A8220A7CA6D17A9 +:201360002B7E2B772B36013E04329B20C93A9820E630D305C93A9520A7CAAA1721111A11A1 +:20138000211A3A8220BED28E172313C385171A3297202198207EE630477EE60F07FE10C26B +:2013A000A4173E01B077AF32952021992035C006EFC3DC1906EF2198207EA077D305C900F6 +:2013C0003A67200FD2CA17DB01C9DB02C932CE20DB01E680210623772311EA17C2E217111B +:2013E000EF17C50605CD321AC1C930100B0807030202020221F420CD3119210023C93293F1 +:2014000020C3C9162184207EA7CA0707237EA7C00601C3FA1821102811A31C0E15CDF30850 +:201420003E0A326C2001BE1DCD5618DA3718CD4418C32818CDB10A01CF1DCD5618D8CD4C99 +:2014400018C33A18C50610CD3914C1C9C53A6C204FCD930AC1C90AFEFF37C86F030A670326 +:201460000A5F030A5703A7C921C22034234ECDD901473ACA20B8CA98183AC220E6042ACC44 +:2014800020C288181130001922C72021C520CD3B1AEBC3D3150000003E0132CB20C9215013 +:2014A0002011C01B0610CD321A3E023280203EFF327E203E0432C1203A5520E601CAB8184D +:2014C0003A5520E601C2C0182111333E2600CDFF08C3B60A3100240600CDE200CD56193E38 +:2014E0000832CF20C3EA0A3A672021E7200FD023C906023A82203DC004C93A9420B0329446 +:2015000020D303C9210022C3C301CDD814C3971521E7203A67200FD823C90E1C211E2411C0 +:20152000E41AC3BF1921F820C3311921FC20C331195E2356237E23666FC3AD090E07210162 +:201540003511A91FC3F3083AEB2021013CC3B209CDF417C33119CD5C1ACD1A19CD2519CD9E +:201560002B19CD5019CD3C19C34719CDDC19C371163E01326D20C3E616CDD719CD4719C336 +:201580003C1932C120C98B19C3D609CDC2193ACE20C9CD13093AEF20A7C83A062306002110 +:2015A0009D2EA7CAAA19219D34043A10233D321023E610C2BB193E26C3FF0878C3FF08CD5E +:2015C000F3080E09219D2D11F70BC3F308262626263E0132E920C9AFC3D319003A9420A076 +:2015E000329420D303C9210127CAFA1911601C06104FCD3914793DC2EC190610CDCB147C79 +:20160000FE35C2FA19C9217220461AE680A8C037C9322B241C16110D0A080706050403021A +:2016200001342E27221C181513100E0D0C0B090705FF1A77231305C2321AC95E2356237E31 +:20164000234E2346616FC9C506037C1F677D1F6F05C24A1A7CE63FF62067C1C921002436EE +:2016600000237CFE40C25F1AC9C5E51AB67713230DC26B1AE101200009C105C2691AC9CD62 +:201680002E09A7C8F53D77CDE619F1210125E60FC3C50900000000FFB8FE201C109E0020B2 +:2016A0001C30100B080706000C04260E15041126260F0B001804112426251B260E11261C9C +:2016C0000F0B001804111226011413130E0D260E0D0B18261B0F0B001804112626011413D5 +:2016E000130E0D262612020E1104241B252607083F12020E11042612020E1104241C252642 +:201700000100001000000000027838783800F8000080008E02FF050C601C20301001000061 +:20172000000000BB030010901C2830010400FFFF0000027604000000000004EE1C00000347 +:20174000000000B604000001001D04E21C0000030000008206000001061D04D01C0000030D +:20176000FF00C01C0000102101003000120000000F0B0018260F0B00180411241B25FC001B +:2017800001FFFF00000020641DD0291802541D000800060000014000010000109E00201CEB +:2017A000000304781413081A3D68FCFC683D1A00000001B898A01B10FF00A01B000000002F +:2017C0000010000E05000000000007D01CC89B030000030478140B193A6DFAFA6D3A19007B +:2017E00000000000000000000001000001741F008000000000001C3300001C2600001C3AED +:20180000000039797A6EECFAFAEC6E7A79390000000000781DBE6C3C3C3C6CBE1D78000096 +:2018200000000000193A6DFAFA6D3A19000000000000387A7F6DECFAFAEC6D7F7A3800002C +:201840000000000E18BE6D3D3C3D6DBE180E0000000000001A3D68FCFC683D1A00000000BA +:2018600000000F1F1F1F1F7FFF7F1F1F1F1F0F00000401130307B30F2F032F4904030001BF +:20188000400805A30A035B0F27270B4B408411480F993C7E3DBC3E7C99271B1A260F0E08CB +:2018A0000D13122812020E110426000315000D0204261300010B04280210203013080B133A +:2018C0000008492214814200428114224908000044AA1088542210AA442254884A15BE3F20 +:2018E0005E2504FC0410FC1020FC2080FC8000FE0024FE1200FE0048FE900F0B00290000C4 +:201900000107010101040B01060301010B090208020B04070A050205040607080A060A031F +:20192000FF0FFF1FFF3FFF7FFFFFFCFFF8FFF0FFF0FFF0FFF0FFF0FFF0FFF0FFF8FFFCFF54 +:20194000FFFFFFFFFF7FFF3FFF1FFF0F0510153094979A9D10050510151010053010101023 +:201960000515100500000000040C1E373E7C747E7E747C3E371E0C0400000000002200A54F +:201980004008983DB63C361D104862B61D98084290080000261F1A1B1A1A1B1F1A1D1A1A8B +:2019A00010203060504848484040400F0B001809001311042626120F0402130411260E2C21 +:2019C000681D0C2C201C0A2C401C082C001CFF0E2EE01D0C2EEA1D0A2EF41D082E991CFF80 +:2019E0002738260C181213041118271D1A260F0E080D1312271C1A260F0E080D1312000037 +:201A0000001F2444241F0000007F494949360000003E414141220000007F4141413E0000C9 +:201A2000007F494949410000007F484848400000003E414145470000007F0808087F000012 +:201A40000000417F4100000000020101017E0000007F081422410000007F01010101000081 +:201A6000007F2018207F0000007F1008047F0000003E4141413E0000007F48484830000030 +:201A8000003E4145423D0000007F484C4A31000000324949492600000040407F40400000C3 +:201AA000007E0101017E0000007C0201027C0000CDF3080E1221132911621FCDF308C900C2 +:201AC0000060100F10600000CDC219C3E7180000003E4549513E00000000217F01000000B1 +:201AE00000234549493100000042414959660000000C14247F04000000725151514E0000B6 +:201B0000001E29494946000000404748506000000036494949360000003149494A3C000097 +:201B2000000814224100000000004122140800000000000000000000001414141414000043 +:201B40000022147F142200000003047804030000241B260E11261C260F0B001804111225AA +:201B6000262612040B0402132600260E1126012606000C0401010000010002010002010008 +:201B800060100F106030181A3D68FCFC683D1A00080D120411132626020E080D0D2A501F32 +:201BA0000A29621F0729E11FFF021104030813260060100F106038193A6DFAFA6D3A19004C +:201BC0000020404D50200000000000FFB8FF801F109700801F000001D022201C109400205A +:201BE0001C0026050E11260F110E05041212080E0D000B0F14120726000808080808000046 +:201C00000000000000000000000000000000000000000000000000000000000000000000C4 +:201C20000000000000000000000000000000000000000000000000000000000000000000A4 +:201C4000000000000000000000000000000000000000000000000000000000000000000084 +:201C6000000000000000000000000000000000000000000000000000000000000000000064 +:201C8000000000000000000000000000000000000000000000000000000000000000000044 +:201CA000000000000000000000000000000000000000000000000000000000000000000024 +:201CC000000000000000000000000000000000000000000000000000000000000000000004 +:201CE0000000000000000000000000000000000000000000000000000000000000000000E4 +:201D00000000000000000000000000000000000000000000000000000000000000000000C3 +:201D20000000000000000000000000000000000000000000000000000000000000000000A3 +:201D4000000000000000000000000000000000000000000000000000000000000000000083 +:201D6000000000000000000000000000000000000000000000000000000000000000000063 +:201D8000000000000000000000000000000000000000000000000000000000000000000043 +:201DA000000000000000000000000000000000000000000000000000000000000000000023 +:201DC000000000000000000000000000000000000000000000000000000000000000000003 +:201DE0000000000000000000000000000000000000000000000000000000000000000000E3 +:201E00000000000000000000000000000000000000000000000000000000000000000000C2 +:201E20000000000000000000000000000000000000000000000000000000000000000000A2 +:201E4000000000000000000000000000000000000000000000000000000000000000000082 +:201E6000000000000000000000000000000000000000000000000000000000000000000062 +:201E8000000000000000000000000000000000000000000000000000000000000000000042 +:201EA000000000000000000000000000000000000000000000000000000000000000000022 +:201EC000000000000000000000000000000000000000000000000000000000000000000002 +:201EE0000000000000000000000000000000000000000000000000000000000000000000E2 +:201F00000000000000000000000000000000000000000000000000000000000000000000C1 +:201F20000000000000000000000000000000000000000000000000000000000000000000A1 +:201F4000000000000000000000000000000000000000000000000000000000000000000081 +:201F6000000000000000000000000000000000000000000000000000000000000000000061 +:201F8000000000000000000000000000000000000000000000000000000000000000000041 +:201FA000000000000000000000000000000000000000000000000000000000000000000021 +:201FC000000000000000000000000000000000000000000000000000000000000000000001 +:201FE0000000000000000000000000000000000000000000000000000000000000000000E1 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/jpecter.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/jpecter.hex new file mode 100644 index 00000000..09dea5f9 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/jpecter.hex @@ -0,0 +1,130 @@ +:020000040000FA +:2000000000CD741400C5E51AD304DB03B6772313AFD304DB03B677E101200009C105C20586 +:2000200014C90000CD7414C5E5AF77237723E101200009C105C22714C9C51A7713012000E0 +:2000400009C105C23914C90000000000000000000000CD7414C5E51AD304DB032FA67723BC +:2000600013AFD304DB032FA677E101200009C105C25514C97DE607D302C3471AC5E57E125B +:2000800013230DC27E14E101200009C105C27C14C9CD7414AF326120C5E51AD304DB03F5B8 +:2000A000A6CAA9143E01326120F1B6772313AFD304DB03F5A6CABD143E01326120F1B67723 +:2000C000E101200009C105C29814C9AFC57701200009C105C2CC14C93A2520FE05C8FE0288 +:2000E000C03A2920FED847D230153A0220A7C878FECED27915C606473A0920FE90D204152B +:20010000B8D2301568CD62153A2A2067CD6F152264203E05322520CD81157EA7CA301536FB +:2001200000CD5F0ACD3B1ACDD3153E10320320C93E03322520C34A1521032035C02A642085 +:200140000610CD24143E04322520AF32022006F7C3DC19000E00BCD49015BCD0C6100CC39F +:200160005A153A092065CD54154105DE106FC93A0A20CD5415DE1067C93E01328520C345D0 +:200180001578070707808080813D6F3A672067C90CC610FA9015C93A0D20A7C2B71521A474 +:2001A0003ECDC515D006FE3E01320D20783208203A0E20320720C9212425CDC515D0CDF1ED +:2001C00018AFC3A91506177EA7C26B162305C2C715C900CD7414E5C5E51AD304DB03772376 +:2001E00013AFD304DB0377E101200009C105C2D715E1C9CD11160100377EA7CAFF150C238A +:2002000005C2F91579328220FE01C0216B203601C92E003A672067C93A1520FEFFC02110D5 +:20022000207E2346B0C03A2520A7C03AEF20A7CA52163A2D20A7C24816CDC017E610C83E51 +:2002400001322520322D20C9CDC017E610C0322D20C921252036012AED20237DFE7EDA630F +:20026000162E7422ED207E321D20C937C9AFCD8B1ACD10193600CDCA0923CDF2001ABE1B1F +:200280002B1ACA8B16D29816C38F16BED298167E1213237E12CD5019CD8B19A7CAC916211A +:2002A000032811A61A0E14CD930A2525061B3A67200FDAB716061C78CDFF08CDB10ACDE72A +:2002C000187EA7CAC916C3ED0221182D11A61A0E0ACD930ACDB60ACDD609AF32EF20D305CC +:2002E000CDD119C3890B310024FBAF321520CDD8140604CDFA18CD590AC2EE16CDD7192114 +:200300000127CDFA19AFCD8B1A06FBC36B19CDCA09237E11B81C2107230E04471AB8D227D7 +:200320001723130DC21C177E32CF20C93A2520FE00C2391706FDC3DC190602C3FA180000DF +:20034000219B2035CC6D173A6820A7CA6D1721962035C02198207ED3053A8220A7CA6D17B9 +:200360002B7E2B772B36013E04329B20C93A9820E630D305C93A9520A7CAAA1721111A11B1 +:20038000211A3A8220BED28E172313C385171A3297202198207EE630477EE60F07FE10C27B +:2003A000A4173E01B077AF32952021992035C006EFC3DC1906EF2198207EA077D305C90006 +:2003C0003A67200FD2CA17DB01C9DB02C932CE20DB01E680210623772311EA17C2E217112B +:2003E000EF17C50605CD321AC1C930100B0807030202020221F420CD3119210023C9329301 +:2004000020C3C9162184207EA7CA0707237EA7C00601C3FA1821102811A31C0E15CDF30860 +:200420003E0A326C2001BE1DCD5618DA3718CD4418C32818CDB10A01CF1DCD5618D8CD4CA9 +:2004400018C33A18C50610CD3914C1C9C53A6C204FCD930AC1C90AFEFF37C86F030A670336 +:200460000A5F030A5703A7C921C22034234ECDD901473ACA20B8CA98183AC220E6042ACC54 +:2004800020C288181130001922C72021C520CD3B1AEBC3D3150000003E0132CB20C9215023 +:2004A0002011C01B0610CD321A3E023280203EFF327E203E0432C1203A5520E601CAB8185D +:2004C0003A5520E601C2C0182111333E2600CDFF08C3B60A3100240600CDE200CD56193E48 +:2004E0000832CF20C3EA0A3A672021E7200FD023C906023A82203DC004C93A9420B0329456 +:2005000020D303C9210022C3C301CDD814C3971521E7203A67200FD823C90E1C211E2411D0 +:20052000E41AC3BF1921F820C3311921FC20C331195E2356237E23666FC3AD090E07210172 +:200540003511A91FC3F3083AEB2021013CC3B209CDF417C33119CD5C1ACD1A19CD2519CDAE +:200560002B19CD5019CD3C19C34719CDDC19C371163E01326D20C3E616CDD719CD4719C346 +:200580003C1932C120C98B19C3D609CDC2193ACE20C9CD13093AEF20A7C83A062306002120 +:2005A0009D2EA7CAAA19219D34043A10233D321023E610C2BB193E26C3FF0878C3FF08CD6E +:2005C000F3080E09219D2D11F70BC3F308262626263E0132E920C9AFC3D319003A9420A086 +:2005E000329420D303C9210127CAFA1911601C06104FCD3914793DC2EC190610CDCB147C89 +:20060000FE35C2FA19C9217220461AE680A8C037C9322B241C16110D0A080706050403022A +:2006200001342E27221C181513100E0D0C0B090705FF1A77231305C2321AC95E2356237E41 +:20064000234E2346616FC9C506037C1F677D1F6F05C24A1A7CE63FF62067C1C921002436FE +:2006600000237CFE40C25F1AC9C5E51AB67713230DC26B1AE101200009C105C2691AC9CD72 +:200680002E09A7C8F53D77CDE619F1210125E60FC3C50900000000FFB8FE201C109E0020C2 +:2006A0001C30100B080706000C04260E15041126260F0B001804112426251B260E11261CAC +:2006C0000F0B001804111226011413130E0D260E0D0B18261B0F0B001804112626011413E5 +:2006E000130E0D262612020E1104241B252607083F12020E11042612020E1104241C252652 +:200700000100001000000000027838783800F8000080008E02FF050C601C20301001000071 +:20072000000000BB030010901C2830010400FFFF0000027604000000000004EE1C00000357 +:20074000000000B604000001001D04E21C0000030000008206000001061D04D01C0000031D +:20076000FF00C01C0000102101003000120000000F0B0018260F0B00180411241B25FC002B +:2007800001FFFF00000020641DD0291802541D000800060000014000010000109E00201CFB +:2007A000000304781413081A3D68FCFC683D1A00000001B898A01B10FF00A01B000000003F +:2007C0000010000E05000000000007D01CC89B030000030478140B193A6DFAFA6D3A19008B +:2007E00000000000000000000001000001741F008000000000001C3300001C2600001C3AFD +:20080000000039797A6EECFAFAEC6E7A79390000000000781DBE6C3C3C3C6CBE1D780000A6 +:2008200000000000193A6DFAFA6D3A19000000000000387A7F6DECFAFAEC6D7F7A3800003C +:200840000000000E18BE6D3D3C3D6DBE180E0000000000001A3D68FCFC683D1A00000000CA +:2008600000000F1F1F1F1F7FFF7F1F1F1F1F0F00000401130307B30F2F032F4904030001CF +:20088000400805A30A035B0F27270B4B408411480F993C7E3DBC3E7C99271B1A260F0E08DB +:2008A0000D13122812020E110426000315000D0204261300010B04280210203013080B134A +:2008C0000008492214814200428114224908000044AA1088542210AA442254884A15BE3F30 +:2008E0005E2504FC0410FC1020FC2080FC8000FE0024FE1200FE0048FE900F0B00290000D4 +:200900000107010101040B01060301010B090208020B04070A050205040607080A060A032F +:20092000FF0FFF1FFF3FFF7FFFFFFCFFF8FFF0FFF0FFF0FFF0FFF0FFF0FFF0FFF8FFFCFF64 +:20094000FFFFFFFFFF7FFF3FFF1FFF0F0510153094979A9D10050510151010053010101033 +:200960000515100500000000040C1E373E7C747E7E747C3E371E0C0400000000002200A55F +:200980004008983DB63C361D104862B61D98084290080000261F1A1B1A1A1B1F1A1D1A1A9B +:2009A00010203060504848484040400F0B001809001311042626120F0402130411260E2C31 +:2009C000681D0C2C201C0A2C401C082C001CFF0E2EE01D0C2EEA1D0A2EF41D082E991CFF90 +:2009E0002738260C181213041118271D1A260F0E080D1312271C1A260F0E080D1312000047 +:200A0000001F2444241F0000007F494949360000003E414141220000007F4141413E0000D9 +:200A2000007F494949410000007F484848400000003E414145470000007F0808087F000022 +:200A40000000417F4100000000020101017E0000007F081422410000007F01010101000091 +:200A6000007F2018207F0000007F1008047F0000003E4141413E0000007F48484830000040 +:200A8000003E4145423D0000007F484C4A31000000324949492600000040407F40400000D3 +:200AA000007E0101017E0000007C0201027C0000CDF3080E1221132911621FCDF308C900D2 +:200AC0000060100F10600000CDC219C3E7180000003E4549513E00000000217F01000000C1 +:200AE00000234549493100000042414959660000000C14247F04000000725151514E0000C6 +:200B0000001E29494946000000404748506000000036494949360000003149494A3C0000A7 +:200B2000000814224100000000004122140800000000000000000000001414141414000053 +:200B40000022147F142200000003047804030000241B260E11261C260F0B001804111225BA +:200B6000262612040B0402132600260E1126012606000C0401010000010002010002010018 +:200B800060100F106030181A3D68FCFC683D1A00080D120411132626020E080D0D2A501F42 +:200BA0000A29621F0729E11FFF021104030813260060100F106038193A6DFAFA6D3A19005C +:200BC0000020404D50200000000000FFB8FF801F109700801F000001D022201C109400206A +:200BE0001C0026050E11260F110E05041212080E0D000B0F14120726000808080808000056 +:200C00000000000000000000000000000000000000000000000000000000000000000000D4 +:200C20000000000000000000000000000000000000000000000000000000000000000000B4 +:200C4000000000000000000000000000000000000000000000000000000000000000000094 +:200C6000000000000000000000000000000000000000000000000000000000000000000074 +:200C8000000000000000000000000000000000000000000000000000000000000000000054 +:200CA000000000000000000000000000000000000000000000000000000000000000000034 +:200CC000000000000000000000000000000000000000000000000000000000000000000014 +:200CE0000000000000000000000000000000000000000000000000000000000000000000F4 +:200D00000000000000000000000000000000000000000000000000000000000000000000D3 +:200D20000000000000000000000000000000000000000000000000000000000000000000B3 +:200D4000000000000000000000000000000000000000000000000000000000000000000093 +:200D6000000000000000000000000000000000000000000000000000000000000000000073 +:200D8000000000000000000000000000000000000000000000000000000000000000000053 +:200DA000000000000000000000000000000000000000000000000000000000000000000033 +:200DC000000000000000000000000000000000000000000000000000000000000000000013 +:200DE0000000000000000000000000000000000000000000000000000000000000000000F3 +:200E00000000000000000000000000000000000000000000000000000000000000000000D2 +:200E20000000000000000000000000000000000000000000000000000000000000000000B2 +:200E4000000000000000000000000000000000000000000000000000000000000000000092 +:200E6000000000000000000000000000000000000000000000000000000000000000000072 +:200E8000000000000000000000000000000000000000000000000000000000000000000052 +:200EA000000000000000000000000000000000000000000000000000000000000000000032 +:200EC000000000000000000000000000000000000000000000000000000000000000000012 +:200EE0000000000000000000000000000000000000000000000000000000000000000000F2 +:200F00000000000000000000000000000000000000000000000000000000000000000000D1 +:200F20000000000000000000000000000000000000000000000000000000000000000000B1 +:200F4000000000000000000000000000000000000000000000000000000000000000000091 +:200F6000000000000000000000000000000000000000000000000000000000000000000071 +:200F8000000000000000000000000000000000000000000000000000000000000000000051 +:200FA000000000000000000000000000000000000000000000000000000000000000000031 +:200FC000000000000000000000000000000000000000000000000000000000000000000011 +:200FE0000000000000000000000000000000000000000000000000000000000000000000F1 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/jspecter.zip b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/jspecter.zip new file mode 100644 index 00000000..d4e747be Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/jspecter.zip differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/jspecter2.zip b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/jspecter2.zip new file mode 100644 index 00000000..387a96ee Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/jspecter2.zip differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/laser1.bin b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/laser1.bin new file mode 100644 index 00000000..c113ee79 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/laser1.bin differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/laser1.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/laser1.hex new file mode 100644 index 00000000..b87186d5 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/laser1.hex @@ -0,0 +1,258 @@ +:020000040000FA +:20000000C34000414B412045FBC9203135353848D306C380003020434E414B4120454F55D9 +:200020002031353538480D013932383020434E414B4120454F552031353538480D01393269 +:200040002100203600237CFE40C2430031C022CD5A01CD6F01CD0004CD401CAF3250203252 +:200060005120325A203252203E0932592032582000FBC37000454F552031353538480D01C3 +:20008000CD990FC3BC00211E20347E0FDA9800CDD700CDE100C39E00CDE100CDD700CDD236 +:2000A00006CDEE0BCD0903CD7F01CDF80A3A5020A7CC340ACD5907CD8007FBC92147207ED9 +:2000C000A7CA001435CACB00C30014214E207EE6EF77D303C30014CD1104CD1406CD6506F3 +:2000E000C9CDA707CD8809CDD90900C9487802E002504802B002583002A002606002C8023E +:200100006828029802704802E802782002780280A802B8028840028802905802B8029890F7 +:2001200002E802A07002B802A85002E002B030029002007E183C66663C187E0000181818FF +:200140003C247E7E180000925428C628549200000000000000000000000021002111EC000A +:200160001A7713237DFE47C26001AF32C021C92100212281213E07328A21AF328B21C93A90 +:20018000C021A7CA9E013DCA900132C021C39E01AF32C0213A4E20E6F7D303324E202A81F9 +:2001A000217E328321232284217E328621232287217E328921218B21343A8321A7C2E00119 +:2001C0001105002A8121197DFE46C2D0012100212281213A8A21218B21BEC29E01AF77C90A +:2001E0003A8321E60F328E21AF328C21328D213A8621A7C22F02218D2134218C21347EFEE1 +:2002000002C214023A8D21FE02C211022A8121AF77C3C0012A842123237E3286212284219E +:200220002A872123237E328921228721C3EF013A8921FE01CA3D02DA5502C35E0221460127 +:20024000228F213A4E20F608D303324E203E0A32C021C37402215001228F21C374023A8ED7 +:2002600021A7C26E02213201228F21C37402213C01228F21AF3291213A8E21A7C28502CDBC +:200280008B02C3BB02CD8B02C3EA023A83210F0F0FE61F4F06203A86216F260029292929A9 +:2002A0002909EB2A8F21EB0120001A7713093A91213C329121FE0AC2AA02C93A8921FE0160 +:2002C000CADA02DAE2022A84217EFEFFC2D5023E1877C3FA013C77C3FA012A8721AF77C320 +:2002E000FA012A8421AF77C3FA013A8921FE01CADA02DAE2022A84217EFE16C204033EFFA2 +:2003000077C3FA013D77C3FA013A0D20A7C218033A2C20A7C22F03C921062022A02121070F +:200320002022A221CD3E03AF320D20322C20C921292022A021212A2022A221C324032AA004 +:20034000217E3CE6F8472100211105000E0E0D7EB8CA5B031979A7C24E03C901140222A4CC +:20036000212AA2217ED60A2AA42123BECA7D03232305C26B0306023C0DC26703C93E0123D4 +:2003800077C9C3BB02CD8B02C3EA023A83210F0F0FE61F4F06203A86216F260029292929F5 +:2003A0002909EB2A8F21EB0120001A7713093A91213C329121FE0AC2AA02C93A8921FE015F +:2003C000CADA02DAE2022A84217EFEFFC2D5023E1877C3FA013C77C3FA012A8721AF77C31F +:2003E000FA012A8421AF77C3FA013A8921FE01CADA02DAE2022A84217EFE16C204033EFFA1 +:20040000065021002011700E1A77132305C20804C93A0C20A7C03A0020A7C265053A0220FD +:20042000A7C207053A0120A7C270043A5020A7CAD9043A1420A7C0DB01E610CA03053A3B29 +:2004400020A7C207052F323B20AF323820CD040C3A0820FE05DA07053E01320120CDFF0686 +:200460003A0A20C6073207203E003205203233203A05203C320520CD200ACD5A052A062073 +:20048000EBCDAD063A30204F160F3A05205F3A0820BBDAF6043E26BBDAF6047AA6C2490521 +:2004A000E5C5012000097EA7C2CF0401C0FF097EA7C2CF04C1E17AB6770DCA5A05CD200AB5 +:2004C0003A05203C3205200FD2D40423C38804C1E1C3490516F0C38A043E013236202138D5 +:2004E000207EA7C249042139207EFE0100CA2B05D23A05C319053A05203D320520CD2A0AD1 +:20050000C34F05AF323B203A5020A7CAE604DB010707DA2B0507DA3A052A0920EBCDAD06B1 +:20052000EB2A1520EB060FCDC406C93A0A20FEE0CA19053C320A20C319053A0A20FE30CA12 +:2005400019053D320A20C319057AB677320B203E01320C203A32203219203A05208787C638 +:2005600037320620C93A03203D320320A7C03E05320320CD43073A04203D320420A7CAA01C +:20058000053A10203CE601321020070707072A1520856FEB2A0920EBE5CDAD06D1C32505AC +:2005A0003A5020A7CAE105CD4E073A1A203D321A20F5CD0711F1CACF053A5020A7CAE10591 +:2005C000CD740ACD5A01CD581531C022C370002F321D203257203E12325820CDB60ACD830A +:2005E000132150203600233600CD4E07AF320122C3C0053A5020A7C82A20203A242085276D +:200600006F3A25208C2767222420210000222020CD5510C93A0B20A7C83A0520FE25DA417D +:20062000063E013214203E0A3203203E1632042021300E2217203E01321020322120C35EDB +:2006400006320D2001070921500E3A0520B8DA5A0623040404040DC24D067E322020AF322E +:200660000B20C3F3053A0C20A7C83A19203D321920A7C02A0620EBCDAD06AF3A0520471F0E +:20068000CE0036002B3DC28206320C20320120CD38073A082090320820AF320F203A3320FE +:2006A0002FC69B473A0E208027320E20C926006A2929292929010020097B0F0F0FE61F06F1 +:2006C000004F09C91A7713C501200009C105C2C406C93A2D203D322D20C03A3120322D203E +:2006E0003A0820FE64CA12073C3208203A0E20C60127320E20DA0A07AF320F20C30F073AF9 +:200700004E20F601324E20D303C93E01320F20CDBF0F3A2B20FE64C83C322B203A2E20C644 +:200720000127322E20DA2F07AF322F20C334073E01322F20000000C93A4E20E6FE324E201E +:20074000D303C93A4E20F604324E20D303C93A4E20E6FB324E20D303C93A4520A7C03A25EC +:2007600020FE05D8211A2034CD07113A4E20F610324E20D3033E803247203E01324520C9F0 +:200780003A4620A7C03A2720FE05D8211B2034CD1A113A4E20F610324E20D3033E80324713 +:2007A000203E01324620C93A2820A7C03A1420A7C205093A0120A7C294083A0220A7C20383 +:2007C000083A0020A7C03A3620A7C27908DB02E610CA90083A3C20A7C294082F323C20AF9A +:2007E000324B223A2B20FE05DA94083E01320220CDFF063A1320C607322A203E00320520AC +:200800003233203A05203C320520CD200ACDF7082A2920EBCDAD063A30204F16F03A052082 +:200820005F3A2B20BBDA6C083E26BBDA6C087AA6C2E608E5C5012000097EA7C2620801C0A8 +:20084000FF097EA7C26208C1E17AB6770DCAF708CD200A3A05203C3205200FD267082BC3F9 +:200860001B08C1E1C3E608160FC31D083A05203D320520CD2A0AC3EC08214B227EA7C2DFF6 +:20088000073A4C22FE0100CAB808D2CF08C3A608AF323C203A3620A7C28108DB020707DA82 +:2008A000CF0807DAB8082A1220EBCDAD06EB2A1720EB060FCDC406C93A1320FEE0CAC70869 +:2008C0003C321320C3A6083EFF324C22C3A6083A1320FE30CADE083D321320C3A6083E011B +:2008E000324C22C3A6087AB677321F203E013228203A32203219203A052087872FC601C6F6 +:20090000C8322920C93A03203D320320A7C03E05320320CD43073A04203D320420A7CA4024 +:20092000093A10203CE601321020070707072A1720856FEB2A1220EBE5CDAD06D1C3B20869 +:200940003A3620A7C25909CD4E073A1B203D321B20F5CD1A11F1CA5F09CD4E07C3B905C385 +:20096000CF053A5020A7C83A3620A7C02A22203A262085276F3A27208C2767222620210068 +:2009800000222220CDAE10C93A1F20A7C83A0520FE25DAB5093E013200203E0A3203203E31 +:2009A0001632042021100E2215203E01321020322320C3D209322C2001070921500E3A0534 +:2009C00020B8DACE0923040404040DC2C1097E322220AF321F20C362093A2820A7C83A193E +:2009E000203D321920C02A2920EBCDAD06AF3A0520471FCE003600233DC2F509322820324D +:200A00000220CD38073A2B2090322B203A33202FC69B473A2E208027322E20AF322F20C90A +:200A20003A3320C60127323320C93A3320C69927323320C93A0820C34B0A21372035C0366F +:200A4000200FDA590A21392036FFC93A0820FE38DA3A0A3E01323820C92139203601C921CF +:200A600000002224202226202245203A8A0E321A20321B2021002011700E1A7713237DFE64 +:200A80001ACAA10AFE24CAA80AFE34CAAF0A7DFE40C27A0A3A3620A7CAA00A3E24321B20F9 +:200AA000C92E1C1E8CC37A0A2E281E98C37A0A2E371EA7C37A0A3E0232A0212A2420E5C127 +:200AC0002A26207CB8CACE0ADAD60AC3DB0A7DB9DAD60AC3DB0AC5D1C3DD0AE5D13AA021E5 +:200AE0003D32A021CAEF0A2A3420424BC3C30A7A3235207B323420C93A4D22E601C2820BBE +:200B0000CD610C3A3422A7CA630B3A3222A7CA6E0B3A4A22A7C2380B213C227EA7C27E0B73 +:200B20003A4322210A2086E67F323C220FDA5A0B3A5E0C2F3C324C223A3622A7214A227E0F +:200B4000CA490BF60177C3F70CE6FE773A4122E60F323622C3F70CC3450B3A5E0C324C22AF +:200B6000C3380B3A2B20FE30D27C0CC3180B3A4022E60F3232223E01324B22C3F70C35C3C9 +:200B8000F70C213C2235C2970B34214D227EE6FE772BAF77C3000B21332235C2AB0B36081D +:200BA000CD240C21322235F2AB0B3421352235C2BF0B3607CD240C21342235F2BF0B342182 +:200BC000372235C2D30B3608CD240C21362235F2D30B3421312235C2E90B3607CD240C2140 +:200BE000302235C2E90BC3140D214F2234C906072147227E172B7E177705C2F50B21472291 +:200C00007E1777C9060821590C1147227E122B1B05C20C0C3E023233223E053235223E016A +:200C2000323622C93A2520FE01DA510C35FE02DA510C35FE04DA510C35FE10DA510C35FE25 +:200C400020DA510C35FE40DA510C35FE80DA510C35C9D44B8CADB5195DE602050100010039 +:200C6000023A0A2021132096213F22DA730C772BAF77C92F3C772B3EFFC3710CDB01E6402C +:200C8000C2900CDB01E620C29B0CCDD00CC3E20C3A3E22E680C2DF0CC3A60C3A3E22E6802F +:200CA000C2A60CC3DF0C3A3F22A7CAEC0C3A3E22E680C2CB0C3E01324C22214C2277CDD0F3 +:200CC0000C3A3F22BEDAEC0CC3F70C3EFFC3B70C213D2236003A4F22E60786323D22C9CD59 +:200CE000D00C3A3F22213D2296D2A60C3A4122E60F323422C3760B214922360FCD240C3A7D +:200D00004F22E60FBE00DA970B2101207EA7C21F0DC3970B3A4422E60F323022C3E90B2188 +:200D20003F227EFE09D2970B2B7EA7214C223601C2350D36FF214D227EF601773A4522E607 +:200D40000FC60A323C22C3970B0685050B094D554003060C8F2D511189041512450DC50437 +:200D6000A340A14E2008E21925160D1926060405A209515BC5098D05250540449A040103E1 +:200D8000870B712114002503A79D0309C2096336E102C40D809003840D87880955512E00FB +:200DA000821098C84904260C078BCC0860130709898239435B0530029D808F4283180C4DDE +:200DC00055186048000E938D869480CA70188A04C90052603E00C84A8982FF80481C8AAC67 +:200DE0004D028804410BDC0B06126DA0800E4F0881001ACACD121D8A62C81C082501454DEA +:200E0000001F070F0E153FE53F150E0F071F004A1184404B0B27270F5B030AA30508400095 +:200E2000000401130307A30F2F032F4904030C0800C02092F4C0F4F0CDE0C0C8802000003A +:200E40000210A0C550C0DAF0E4E4D0D20221881501020304050607010011E0170423202982 +:200E600000F8E0F070A8FCA7FCA870F0E0F800820000000000000000003030000000000031 +:200E80000000C8E000000E600E00050505000000000000000000000000C8E0000006000071 +:200EA0000403080000000000000025092AC8081C640414041C000000E70546703F40000220 +:200EC0008D086000169064650E210500892E410D860F27078B0B2A297C010D0304000549EA +:200EE0003C0810414400960B4512470910082C046A004723690185003F08892BCF040212E4 +:200F0000AF320122C30C0FAF3C320122AF02CD440F02CD440F02CD440F210022868686863F +:200F2000866F26003A01221E00BBC2330F112D11C3360F11FF111916057E0223CD440F15D8 +:200F4000C2390FC9E521200009444DE1C9D11A47131A4F131A13D516FFBACA760F1630BA73 +:200F6000C26C0F21000109444DC3720F320022CD0C0FD1C3540FE1E93A0222E60F32002290 +:200F8000011E3DCD000F3A0222E6F00F0F0F0F320022011E3CCD000FC9DB01E601CABA0FFF +:200FA0003A032247AFB8C2B90F3A02223C27320222CD780FAF3C320322C9AF320322C93A1B +:200FC0000E20E60F320022011C37CD000F01032CCD070F3A0E20E6F00F0F0F0F3200220188 +:200FE0001C36CD000F01032DCD070F3A0F20FE00CAF80F3E01C3FA0F3E24320022011C3564 +:20100000CD000F01032ECD070FC93A2E20E60F320022011B37CD000F01042CCD070F3A2E9A +:2010200020E6F00F0F0F0F320022011B36CD000F01042DCD070F3A2F20FE00CA43103E0104 +:20104000C345103E24320022011B35CD000F01042ECD070FC93A2520E6F00F0F0F0F3200F3 +:2010600022011C2ECD000F010335CD070F3A2520E60F320022011C2FCD000F010334CD070F +:201080000F3A2420E6F00F0F0F0F320022011C30CD000F010333CD070F3A2420E60F320075 +:2010A00022011C31CD000F010332CD070FC93A2720E6F00F0F0F0F320022011B2ECD000FF5 +:2010C000010435CD070F3A2720E60F320022011B2FCD000F010434CD070F3A2620E6F00F81 +:2010E0000F0F0F320022011B30CD000F010433CD070F3A2620E60F320022011B31CD000F3A +:20110000010432CD070FC9011C3C3A1A20320022CD000F010327CD070FC9011B3C3A1B204B +:20112000320022CD000F010427CD070FC93E4141413E00217F01003143454931224149499F +:20114000360C14247F0479494949463E4949492640474850303649494936304949493E1FBB +:201160002444241F7F494949363E414141227F4141221C7F494949417F484848403E4149D8 +:20118000492F7F0808087F00417F41000201417E403F081422417F010101017F2018207F27 +:2011A0007F1008047F3E4141413E7F484848303E4145423D7F484C4A3132494949264040CB +:2011C0007F40407E0101017E7C0201027C7E0106017E631408146360100F10604345495109 +:2011E00061000000000004080408000814224100004122140822147F142214141414140029 +:201200000000000000000000000000000000000000000000000000000000000000000000CE +:2012200000000000000000000000000000000000001F2444241F7F494949363E4141412231 +:201240007F4141221C7F494949417F484848403E4149492F7F0808087F00417F41000201C3 +:20126000417E403F081422417F010101017F2018207F7F1008047F3E4141413E7F48484828 +:20128000303E4145423D7F484C4A31324949492640407F40407E0101017E7C0201027C7E21 +:2012A0000106017E22147F142260100F1060000003030000000000003E00320122CD4D0F0C +:2012C000261E11121C0C181B0E30000000000030300C1B0E0D121D300000FFCD4D0F2E1D9A +:2012E0001C0C181B0E300F1E0E15301C111219FFCD4D0F261C2619150A220E1B2700000043 +:20130000000030303000003030303000FFCD4D0F261B303030303030303030303030303074 +:20132000303030303030303030FF3E01320122CD4D0F2E0230211D0A121D18300C181B19CA +:20134000232130FFCD4D0F2703303030303030303030303030303030303030303030303077 +:20136000FFCD4D0F27043030303030303030211C190A0C0E30150A1C0E1B213030FFAF322B +:201380000122C93A3520E6F00F0F0F0F320022011E2ECD000F3A3520E60F320022011E2F1D +:2013A000CD000F3A3420E6F00F0F0F0F320022011E30CD000F3A3420E60F320022011E310B +:2013C000CD000FC90D1231363536202053484C442032314134480D123136363020204C480C +:2013E0004C442032314132480D0F3136363420204D4F5620412C4D0D0F31363638202053A2 +:201400003A5720A7C27B153A5020E601C286003A0222E6FFC232143A5120FE00CA09163A32 +:201420005120FE02C28600CD62153E03325120C38600DB02E680C2BE143A5520E601C2490A +:2014400014CD17153E01325520DB01E604CA66143A022206998027320222AF321B203E013A +:20146000323620C38B14DB01E602C8DB02E680C27A143A02220699C382143A02223DC83C6E +:2014800006988027320222AF323620AF325220325C2032552032CC213C325020325B20CD5B +:2014A0004B15CD481CCD5F0ACD8313CD780FCD0711CD1A113E20324E20D303C386003A5525 +:2014C00020A7C2D014CDEB143E01325520C349143A0222FE01CA49143A5520FE01C249147C +:2014E000CD17153E02325520C34914CD6215AF320122CD4D0F3014191E1C11FFCD4D0F2883 +:2015000011303030281C1D0A1B1D300B1E1D1D181728303030FFC9AF320122DB02E680C23C +:201520002F15CD6215CD4D0F3014191E1C11FFCD4D0F281124242424281C1D0A1B1D240B8F +:201540001E1D1D181728242424FFC93E40210024360023BCC25015C93A1A20A7C83A1B2088 +:20156000A7C8110B002106243600237DE61FFE1BC26815197CFE40C26815C93A58203D3266 +:201580005820C03A5A20FE01C29D15AF325A20325120324E20D303C620325820C9FE00C25F +:2015A000BE153A5920A7CABE153A59203D325920C2C8153E01325A203E30325820C9AF327A +:2015C00057203E09325920C93D4787805F160021F115197E2332002246230E08E5CD000F64 +:2015E000E1460E170000003E09325820AF320122C91B362D0E352E1F342F1833300E303384 +:20160000162F340A2E35102D363A5220FE00CA78183A5B203D325B20C03A5220FE01C23968 +:2016200016CD6215CD4D0F301619150A22FF3E20325B203E02325220C9FE02C25616CD8C49 +:2016400017A7CA4B163E09325B20C93E20325B203E03325220C9FE03C2AE16CD4D0F280F44 +:20166000281C0C181B0E300A0D1F0A170C0E301D0A0B150E28FF3E0A325F20113201010C42 +:201680002ACD64183E0F325F2011000E01CA29CD6418010C2C3E29320022CD000F010A2C76 +:2016A000CD000F3E20325B203E04325220C9FE04C2CB16CD8C17A7C2C5163E20325B203EF2 +:2016C00005325220C93E09325B20C9FE05C2E816CD8C17A7C2E2163E60325B203E06325234 +:2016E00020C93E09325B20C9FE06C20C17CD6215CD4D0F2C1512171C0E1B1D300C181217A5 +:20170000FF3E60325B203E07325220C9FE07C22917CD8C17A7C223173E20325B203E083230 +:201720005220C93E09325B20C9FE08C24617CD8C17A7C240173E20325B203E09325220C99D +:201740003E09325B20C9FE09C27C17CD8C17A7C276173A5C20A7CA6B17DB02E680C27617CF +:201760003A5C20C60B325C20C376173E40325B203E0A325220C93E09325B20C9AF325220F4 +:20178000325C203E02325120325B20C921ED1716003A5C205F197EFEFFCAEA17FEFECAAC21 +:2017A00017473A5C203C325C20C3C017237E325E20237E325D2023463A5C20C604325C2059 +:2017C000783200222A5D20444D24225D20CD000F21ED1716003A5C205F197EFEFECAE817BA +:2017E000FEFFCAEA173EFFC9AFC9C3501CFE2C131C190A0C0E24150A1C0E1BFE2E0C01001D +:2018000025070024191812171D1CFE2E0A010000002424191812171D1CFE2A112618171530 +:201820002224012419150A220E1B2724FE290E28282828282401090800242828282828242C +:20184000FE290B281D0A121D18240C181B19181B0A1D121817282424FFFE340B01240C18B4 +:20186000121724FF1A023A5F203DC8325F201321200009444DC364183ACC21A7CA88183DEF +:20188000CA76193DCA7619C9110B002106243600237DE61FFE1BC28E18197CFE40C28E1892 +:2018A0003E0132CC213E5432B0213EC832B121AF32BF21C3C8183E5532B0213EC932B12126 +:2018C000AF32BF21C3C818C921D81922B2212AB2217EFE00CAC61BFE07CAB01932B5212AE6 +:2018E000B2212322B2217E32B6213AB621A7CACE193D32B6213AB52121B021FE00CA2319C1 +:20190000FE01CA2919FE02CA2F19FE03CA3319FE04CA3719FE05CA3C19FE09CA4119FE0A22 +:20192000CA4719342334C34D19352335C34D1934C34D1935C34D192334C34D192335C34D70 +:2019400019352334C34D19342335C34D193ACC21FE02CA6419003ABF21FE02C26F19AF3251 +:20196000BF21FBC93ABF21FE60C26F19C35E193C32BF21C376193AB0216F260029292929E3 +:2019800029010020093AB1210F0F0F57E61F06004F097AE6E00F0F0F0F0F4FA7CAA9193EB6 +:2019A00001070DC2A119C3AB193E01B677C3EA182AB221237E4F237E572322B2213AB021D6 +:2019C0008132B0213AB1218232B121C3CE182AB2212322B221C3CE180028021C0010030829 +:2019E0000108030C0020030807FCD8022000180308011003180108071414020C0004030CFF +:201A00000104070C0C020C0004030C01040710000204000803040108070800020400080327 +:201A200004010807F8E0020800080204010402040008030800040308010403080104020856 +:201A40000108071800021800100308010C03100104070808020400080304010807080002BE +:201A6000040008030401080710F802100028032001100208000802100118030801080798DD +:201A8000E00504020405140204041402040404030C070CF80510020A0403030604030206B8 +:201AA00004040306040302060403030A070D000510020804030304040D030407D0E00302DD +:201AC000010405040A0402020904040400040704040514020C0414030C0704FC050C020452 +:201AE000040C0304070C040514020C040C0308040402080404030C0704F405040204040437 +:201B00000304070C080A040504010402020004040409040302070C080504020C0506030C19 +:201B20000504020C0506030C050402100418031007140005180210041803100704FC051095 +:201B4000020804100308071004050C020C0508030C050402100410030C0404020C040403A7 +:201B6000100714F60504020404040304070C0A0104050400040514020404180304070800A6 +:201B80000504020C0506030C0504020C0506030C05040210041803100714000504020C0562 +:201BA00006030C0504020C0506030C05040210041803100718000104050400040514020445 +:201BC0000418030408083ACC21FE02CAD61B3E0232CC21C3B6183E0032CC213E01325220C0 +:201BE0003E40325B20FBC9F51C352334C3F51C342335C3F51C3ACC21FE02CA0C1D003ABF12 +:201C0000F5C5D5E500210524060036BA00230478FE20C20D1C7CFE40C2081CE1D1C1F1C99B +:201C200000FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FFB4 +:201C4000CD001CCDB812C9FFCD001CCDB812C9FFAF325C20C9FF00FF00FF00FF00FF00FFD4 +:201C600000FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF74 +:201C8000000000000000000000000000000000000000000000000000000000000000000044 +:201CA0007777336655666666661111555522224444222255551111555555555566227777E9 +:201CC0007777336655666666661111555522224444222255551111555555555566227777C9 +:201CE0007777336655666666661111555522224444222255551111555555555566227777A9 +:201D0000777733665566666666111155552222444422225555111155555555556622777788 +:201D2000777733665566666666111155552222444422225555111155555555556622777768 +:201D4000777733665566666666111155552222444422225555111155555555556622777748 +:201D6000777733665566666666111155552222444422225555111155555555556622777728 +:201D800077771166556666666611115555222244442222555511115555555555662277772A +:201DA00077771166556666666611115555222244442222555511115555555555662277770A +:201DC0007777116655666666661111555522224444222255551111555555555566227777EA +:201DE0007777116655666666661111555522224444222255551111555555555566227777CA +:201E00007777116655666666661111555522224444222255551111555555555566227777A9 +:201E2000777722665566666666111155552222444422225555111155555555556622777778 +:201E4000777722665566666666111155552222444422225555111155555555556622777758 +:201E6000777722665566666666111155552222444422225555111155555555556611777749 +:201E8000777722665566666666111155552222444422225555111155555555556611777729 +:201EA000777722665566666666111155552222444422225555111155555555556611777709 +:201EC0007777226655666666661111555522224444222255551111555555555566117777E9 +:201EE0007777226655666666661111555522224444222255551111555555555566117777C9 +:201F0000777722665566666666111155552222444422225555111155555555556633777786 +:201F2000777722665566666666111155552222444422225555111155555555556633777766 +:201F4000777722665566666666111155552222444422225555111155555555556633777746 +:201F6000777722665566666666111155552222444422225555111155555555556633777726 +:201F8000777722665566666666111155552222444422225555111155555555556633777706 +:201FA0007777226655666666661111555522224444222255551111555555555566337777E6 +:201FC0007777226655666666661111555522224444222255551111555555555566337777C6 +:201FE0000000000000000000000000000000000000000000000000000000000000FFFF00E3 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/laser2.bin b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/laser2.bin new file mode 100644 index 00000000..85ea0d61 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/laser2.bin @@ -0,0 +1,193 @@ +  + +   + +   + +   + +   + +   + +   + +   + +   + +   + + + + + +  + + + + + +  + + + + + +  + + + + + +  + + + + + +  + + + + + +  + + + + + +  + + + + + +  + + + + + +  + + + + + +  + +   + +   + +   + +   + +   + +   + +   + +   + +     + +    + +    + +    + +    + +    + +    + +    + +    + +    + + + + + +   + + + + + +   + + + + + +   + + + + + +   + + + + + +   + + + + + +   + + + + + +   + + + + + +   + + + + + +   + + + + + +   + +    + +    + +    + +    + +    + +    + +    + +    + + \ No newline at end of file diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/laser2.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/laser2.hex new file mode 100644 index 00000000..9895c0f2 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/laser2.hex @@ -0,0 +1,34 @@ +:020000040000FA +:200000000808080808080808080808080808080808080808080808080808080808080808E0 +:200020000808080808080808080808080808080808080808080808080808080808080808C0 +:200040000808080808080808080808080808080808080808080808080808080808080808A0 +:20006000080808080808080808080808080808080808080808080808080808080808080880 +:200080000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090E0E0E0EE0 +:2000A0000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090E0E0E0EC0 +:2000C0000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090E0E0E0EA0 +:2000E0000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090E0E0E0E80 +:200100000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090E0E0E0E5F +:200120000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090E0E0E0E3F +:200140000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090E0E0E0E1F +:200160000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090E0E0E0EFF +:200180000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090E0E0E0EDF +:2001A0000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090A0A0A0ACF +:2001C0000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090A0A0A0AAF +:2001E0000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090A0A0A0A8F +:200200000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090A0A0A0A6E +:200220000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090A0A0A0A4E +:200240000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090A0A0A0A2E +:200260000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090A0A0A0A0E +:200280000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090A0A0A0AEE +:2002A0000D0B090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090A0A0A0AD0 +:2002C0000D0B090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090A0A0A0AB0 +:2002E0000D0B090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090F0D0D0D82 +:200300000D0B090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090F0D0D0D61 +:200320000D0B090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090F0D0D0D41 +:200340000D0B090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090F0D0D0D21 +:200360000D0B090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090F0D0D0D01 +:200380000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090F0D0D0DDF +:2003A0000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090F0D0D0DBF +:2003C0000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090F0D0D0D9F +:2003E0000D0D090D0D0909090D0D0D0D0B0B0B0B0E0E0E0E0C0C0C0C0A0A0B090F0D0D0D7F +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/lrescue0.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/lrescue0.hex new file mode 100644 index 00000000..bc3245c2 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/lrescue0.hex @@ -0,0 +1,513 @@ +:10000000000000C34B160000F5C5D5E5C3E70500A9 +:10001000F5C5D5E53E8032BE2021C02035CD4B0A46 +:10002000DB010FDA66003AEA20A7CA42003AEB2069 +:10003000FE09D23E00C6012732EB20CDAC0AAF321A +:10004000EA203AE920A7C260003AEF20A7C2E60EF4 +:100050003AEB20A7C26B003ABF21A7C2E60E000010 +:10006000E1D1C1F1FBC93E01C33F003A5820A7C20C +:1000700060003E01CDDC08310024FBCDA401CDBDE4 +:100080000A21133011501D0E04CD2A05D3063AEB78 +:10009000203DCD974A0E14C28901116A0BCD2A0565 +:1000A000DB01E604CA8E000699AF32EE203AEB205F +:1000B000802732EB20CDAC0ACD184C22F82022FC50 +:1000C00020CDD402CDDF02CDEA02CDC5480620CD39 +:1000D0000049CDA401CD9805CDAC4C21010122E50C +:1000E00020CDB447CD4C4CCD8F02CDE349CDD402C9 +:1000F0000000000000CDF202CDCA01CD6102CD7931 +:1001000002CD4602CDA901CD781F3A2720A7D306FC +:10011000CA0A01CD1210C223013A2820FE02D306DA +:10012000C213012129203600CD30040000002A2D01 +:10013000203A2C20FEFE010014C4850109221D2056 +:10014000CD6D0D2113203601215E207EA7C2304CDB +:100150002114207EA7C2AA04215D207EA7C26203CB +:10016000CD770CD3063A1D20FEB0DC7F023A1D206D +:10017000FEB0D4580D3A1620A7CC9D0DCD054CCD20 +:100180007B48C34801010010C911550BCD2A05DB7E +:10019000010F0FDA9D010FDAA700C38E0006983E0B +:1001A00001C3AA003E01C3AA01AF32E920C9000081 +:1001B00000000000C9C5E51A772B1B0DC2B701E18D +:1001C00001200009C105C2B501C9210224119118FD +:1001D000010318CD1B0C21052401030ACD1B0C21A2 +:1001E000043D11D818010318CDB50121C73E11F601 +:1001F0001801030ACDB5012102270E17113118D5B8 +:10020000C50608CD000AC1D10DC35B1D11EB19C590 +:100210000608CD000AC10DC20C02CD22172E000E19 +:10022000067EE680C43002110500190DC22102C904 +:10023000E5C57EE67F47235E2356234E237E67690E +:10024000CD000AC1E1C9CD22172EACC3CA4B002193 +:100250000127111718C50610CD000AC10DC25202A0 +:10026000C9211C250E0E11F319C5E50605CD000A9E +:10027000E12424C10DC26602C911131AC3A90D3AA3 +:100280001320A7C82126207EA7C03601C36D0DCD3F +:1002900022172EAE4E79A7C8211B3BC5110B1AE5BC +:1002A0000608CD000AE12525C10DC29B02C9000048 +:1002B00000C9000000C9CD8C052311F5201ABE1B12 +:1002C0002B1ACAC902D0C3CB02BED07E1213237E22 +:1002D00012C3004706C011A31A210020C3040B0655 +:1002E000C021002111A31BC3040B06C0210022C39F +:1002F000E402060121292070CD22172E40702E56CF +:1003000070C90600C3F402060121292070CD22170E +:100310002E70702E9070217020702E7C702E887040 +:10032000C90600C30903CDA401CD2103CD020321D9 +:1003300013203600CD9D4ACD14492A1D20010310FB +:10034000CD300C0E0411231AC52A1D20010210CD38 +:10035000180C3E08CDD505C10DC24803CD1949C3BF +:10036000CB05CD26030000C3A54A2EAC3500CAB08C +:1003700004CD424BC3C61E3AEF20A7C83AC620C3DD +:10038000440A00003600CD744CCD224FCD2103C36A +:10039000B91FCD22172EAE34E5CD8F02E12EA07EFF +:1003A000A7CAD4032EAE7EFE06CC0E04CDCB05CD5F +:1003B00022172EA25E2356EBCD0A4FCDA44CCDCBF7 +:1003C00005CDB54CCD22172EAB342EAF342E000602 +:1003D000AACDE402CDCB05C90000211B3D79A7C8F9 +:1003E0000025253DD306C2E103C50610CD340ACD54 +:1003F0004249000000E5CDF549CD0A4F3E10CDD56C +:1004000005E1000000000000C10DC2E903C9C521DB +:10041000142A11AD1E0E10CDB305CD004D00000005 +:100420000000000000215000CD0A4F000000C1C9AB +:10043000CD22172E2D7EFE04210625D44604114A16 +:1004400004060DC3000A21063DC93E083E003E2AAF +:10045000003E02003E2810000000000000000000E6 +:10046000000000000000003600CD020321132036FA +:1004700000CDD20D3AAE20A7C2290621010122A04B +:10048000203AA120A7D306C28104CD8316211320D0 +:100490003601211B203601CD070321162036012A03 +:1004A0009E203A9D2047C3340A00CD6704C35801FB +:1004B000CDB602CDD4020000AF32EE20CDA401CDE6 +:1004C0000203CD210321132D11634B0E0ACDB30579 +:1004D000CD974B3AE320A7C40A47CDC04CCDF84C8A +:1004E000CD864BCDCB05CDA901C37316CD8C05238D +:1004F00011F5201ABE1B2B1ACAC902D0C3CB0200A9 +:1005000000000000000000000000F378D305060A98 +:100510000E000DC2120505C21005FBC94E2346236D +:1005200079867723788677C90E021AD5CD3605D11C +:10053000130DC22A05C9CD9B0B0605D306CD000AB3 +:10054000C5AF770120000977097709C1C9CD8C05AE +:100550003AF120A7C8AF32F120E52AF220EBE17E84 +:100560008327775F237E8A277757237E23666F7AD8 +:10057000CD74057BD5F50F0F0F0FE60FCD8705F175 +:10058000E60FCD8705D1C9C61CC336053AC6200F74 +:1005900021F820D821FC20C92101240E1C06DFE50A +:1005A000C536001120001905C2A105C1E1230DC205 +:1005B0009D05C9D51ACD3605D13E0732C0203AC0B7 +:1005C000203DC2BE05130DC2B305C93E40C3D505CB +:1005D0003E80C3D50532C0203AC020A7D306C2D87A +:1005E00005C900000000003ADC20A7CA8C0EDB0120 +:1005F000E606C41606CD7C03E610060121CB20C218 +:100600000B067EA723C20B062B0600702AD92023D7 +:1006100022D920C360003E0132E120C9210000221E +:10062000CB20C9CD4208C3A0063AEF20A7C8E1C33A +:10063000620300000000003E20C3D5053E05C3D57F +:1006400005015006CD7C03E660CA55060DC244067E +:1006500005C24406C9E1C921CB2011C208061ACD42 +:10066000040B000000000000119A082117270E1744 +:10067000CD2A05211227115B1CCD0407211027CD9F +:100680000407210E270E05CD0607210E331143095D +:100690000628CD000A11B1080E1021062ACD2A0520 +:1006A0003ADC20A7CA78083ADA20FE20D27808CDB2 +:1006B0001607CD7C03E660FE40CC2F07FE20CC85DC +:1006C000073AE120A7C278083ACC20A7C2CF070199 +:1006D0003001CD2607CD1E073ADA20FE1DC2A00646 +:1006E0000605C521062A0620CDEB09CD3C0611B131 +:1006F0000821062A0E04CD2A05CD3C06C105C2E21A +:1007000006C3A0060E0B0605CD000AC5016001094F +:10071000C10DC20607C92ADD203E2AC336052ADDDF +:10072000203E1BC336050DC2260705C22607C9CDCC +:100730004106CD1E072ADD207DFE11CA6007FE0F8F +:10074000CA69077CFE33CA740724247CFE35D25460 +:1007500007C35A07CD1E07210D3622DD20C3160719 +:100760007CFE3BD27907C36F077CFE3BD27F072418 +:1007700024C35A072634C34907210F27C35A072128 +:100780000D27C35A07CD4106CD1E072ADD207DFE69 +:1007900011CAA907FE0FCABA077CFE28DAC307FEF2 +:1007A00034C2AF072633C3AF077CFE28DAB407256F +:1007B00025C35A07211127C35A077CFE28DAC90727 +:1007C000C3AF07210F3BC35A0721113BC35A07018F +:1007D000FF20CD26073ADB20FE0AD25D083ADD2055 +:1007E000FE11CAFD07FE0FCA03083ADE20FE32D210 +:1007F0000B08CD3B08C616CD4208C3A006CD3B086A +:10080000C32306CD3B08C60BC32306FE35D27808AA +:100810003ADB20A7CA31082ADF202522DF203E1B31 +:10082000CD360521DB203521CF203ADB20856F3600 +:100830001BCD1C0600000000C3A0063ADE20D62710 +:100840000FC921CF20F53ADB20856FF1772ADF2011 +:10085000CD360522DF2021DB2034C31C063ADD2003 +:10086000FE0DC278083AEE20FE32D27008C3780836 +:10087000FE36D27808C31008AF32DC20CD2009CD77 +:100880008D08C398050650211E2DC3EB092ACD20E3 +:1008900011CF203ADB204FC32A0507082B12020E86 +:1008A0001104111B1B110406081213110013080E6A +:1008B0000D0D000C041B2E2F2F2F2F2F2F2F2F2F1E +:1008C0002F2E000000001B1B1B1B1B1B1B1B1B1BBD +:1008D000000000011127073000000000325820AF4F +:1008E00032BF21C93AEF20A7C83AC620C3440A3A0A +:1008F000EF20A7CA9247C362030000000000000077 +:10090000000000E5D5110004193E1CCD3605D1E1EB +:10091000C36F05CD8C057E23666F292929297CC9E3 +:100920003ADB20A7CA3709473E0A90373F1FC62D3A +:10093000672E1E22CD20C9211E2D22CD203E0A3237 +:10094000DB20C9001F141609001E01011E001F151F +:10095000150A000000000000000000001F1515111E +:10096000001F08041F001F11110E003AEF20A7CA34 +:100970007F093A1820A7C2380FCD410AC3380F2A81 +:100980001020CDC009E603C291097DFEB5D4A409AB +:10099000232210207E0FDAAA0F0FDACB0FAF321C02 +:1009A00020C3480F2EA6C900000002010101000269 +:1009B000020202020202000000000000000000002B +:1009C0003A12203C321220C9CD2C0AC5E51AD304B4 +:1009D000DB03AE772313AFD304DB03AE77E1012053 +:1009E0000009C105C2CB09C9CD2C0AC5E5AF7723E3 +:1009F0007723E101200009C105C2EB09C9CD2C0A0A +:100A0000C51A771301200009C105C2000AC9CD2CFF +:100A10000AC5E51AD304DB03772313AFD304DB0342 +:100A200077E101200009C105C2110AC97DE607D39B +:100A300002C31F0BAFC57701200009C105C2350AEB +:100A4000C9C377030FDB02D0DB01C9DB02E604C8B0 +:100A50003A5920A7C03100240604C5CD9805C10528 +:100A6000C25A0A3E01325920CDA401FB11571C2164 +:100A700016300E04CDB305CDCB05C30B4C00000ED4 +:100A80001C211E24117F0BC32A0521F820C3960ABE +:100A900021FC20C3960A5E2356237E23666FC30380 +:100AA000090E0721013511541DC32A053AEB2021F7 +:100AB000013CC61CC3360521F420C3960ACD340B75 +:100AC000CD7F0ACD8A0ACD900ACDB70ACD2009CDB7 +:100AD0008D08CDA10AC3AC0A21BE20461AE680A823 +:100AE000C037C9322B241C16110D0A08070605044D +:100AF000030201342E27221C181513100E0D0C0BA7 +:100B0000090705FF1A77231305C2040BC9E5232340 +:100B10005E2356234E2346E1D55E2356EBD1C9C54D +:100B200006037C1F677D1F6F05C2220B7CE63FF624 +:100B30002067C1C92100243600237CFE40C2370B48 +:100B4000C906000C041B0E1504111B1B0F0B00180B +:100B50000411261B271D1B0E111B1E0F0B00180452 +:100B600011121B011413130E0D1B0E0D0B181B1D60 +:100B70000F0B001804111B1B011413130E0D1B1B6C +:100B800012020E11042B1D1B1B1B1B1B1B1B1B1BF3 +:100B90001B1B1B12020E11042B1E1B115B1CA7C872 +:100BA000E5210000C5010500093DC2A50B19EBC1F7 +:100BB000E1C9CD2C0AC5E51AD304DB032FA67723A0 +:100BC000131AD304DB032FA6772313AFD304DB035D +:100BD0002FA677E101200009C105C2B50BC9CD2CB4 +:100BE0000AC5E51AD304DB03A6CAF10B3E01325055 +:100BF00020DB03AE7723130DC2E30BAFD304DB037B +:100C0000A6CA090C3E01325020DB03AE77E1012079 +:100C10000009C105C2E10BC9CD2C0AC5E51A77232D +:100C2000130DC21D0CE101200009C105C21B0CC936 +:100C3000CD2C0AC5E5AF77230DC2350CE1012000AC +:100C400009C105C2330CC9010010D3060DC24A0CFC +:100C500005C24A0CC9CD2C0AC5E51AD304DB032F03 +:100C6000A6772313AFD304DB032FA677E10120007F +:100C700009C105C2580CC9210C207EA7C836002125 +:100C80000000220020CD22172E722256200E087E50 +:100C9000A7CA9A0CCD3D0DD2D20CCD450DC28F0CFA +:100CA000CD22172E92CDE74C0E047EA7CAB50CCDEF +:100CB0003D0DD2C90CCD450DC2AA0C0000002A067C +:100CC0002001F8FA09C3211F00CD500DDADB0CC357 +:100CD000B50CCD500DDADB0CC39A0C3A072023BEBD +:100CE000D2E60CC3B50CF53E188647F1B8DAF40C21 +:100CF00000C3B50CC34E1E00CD370DE5CD1E490611 +:100D00001311B719CDFD09CDE11DE1E50613CDFDA8 +:100D100009CDE11DC3E51E00E1E57DD6086F06188B +:100D2000CD7917E10618CD7917C3004F00000000F8 +:100D300000000000000000235E2356EBC9233A06A2 +:100D400020C608BEC92A56202323232256200DC9B7 +:100D5000F53E088647F1B8C90000003A1620A7C83A +:100D60002125207EA7C0360121292036003A2C20DB +:100D7000FEFE2A2D20010011C4990D090612CD2C6A +:100D80000AC53E01AE770000C31E4801200009C11C +:100D900005C2810DC3804F0DC901000DC9219C20E2 +:100DA0007EE610110B1AC47902CD22172E2D4E7E2D +:100DB000A7C8237EA7C4C00D2323230DC2B30DC92A +:100DC000E5C523D5CD380DD1D50608CDFD09D1C156 +:100DD000E1C92A1D207CFE3CDAF50DFED4D2F50DCA +:100DE0007DFE1BDAF50DFE20DAFB0DFE28DA4C0E37 +:100DF000FE30DA760E21AE203601C97CFE44D204E4 +:100E00000EC3F50DFE56DA420EFE84D2110EC3F566 +:100E10000DFE94DA470EFEC4D21E0EC3F50DFED4AD +:100E2000DA260EC3F50DC32F1E00CD221736002380 +:100E300023CD370D229E2078329D20000000000037 +:100E400000C92E00C3311E2E05C3311E7CFE3CD2CC +:100E5000550EC3F50DFE59DA710EFE7DD2620EC33A +:100E6000F50DFE96DA6A0EC3F50D2E140630C33E5C +:100E70001E2E0FC36C0E7CFE73D27F0EC3F50DFECB +:100E80009CDA870EC3F50D2E19C3451EAF32BE2066 +:100E9000219C20342150207EA7C4BF0E3AE920A710 +:100EA000C260003AEF20A7CA2547CDDD12215320AA +:100EB0007EFE01CC9A11CDF04CCDB64FC36000360A +:100EC000002A1D207DFEB8D20C1FFE30DAD50E217F +:100ED0005D203601C97CFE3CDACF0EFED4D2CF0EA7 +:100EE0002114203601C9215320347EE60377CDDD5D +:100EF00012CD040F3AA020A7C4C510CDAB49CD3AFE +:100F00004EC360003A5320A7CA1B0FFE01CA9A11B4 +:100F1000FE02CA5C13FE03CAC214C93A1320A7C852 +:100F2000CDAC12CD364C3A1D20FEBADA350F3A164A +:100F300020A7CA480FC36B09E6600707DAAA0F07A4 +:100F4000DACB0F211C203600CD9A0F3A1620A7CA03 +:100F5000580FCD5310C3690FCD1210C48B0F3A1D1B +:100F600020FE40DA820FCDE70F211D20CD0D0BC5ED +:100F7000D5CDB20B211B20CD1C052A1D20D1C1C30C +:100F8000DE0BCD8249CDED0FC3690FC3CB4C347E50 +:100F9000E60123233600C036FFC93A1620A7211BDD +:100FA00020C2A70F36FEC93601C93A1E20211C20D7 +:100FB000FEE0D2C60F3A1620A7C2961D3602C348DD +:100FC0000F3603C3480F3600C3480F3A1E20211CBA +:100FD00020FE30DAC60F3A1620A7C2E20F36FEC353 +:100FE000480F36FDC3480FCD1210CA1810CD34106B +:100FF000DA2B10C3ED4ECD4810211A20347EE601C5 +:10100000112C18CC0E102A23200605C3C80911275D +:1010100018C9CD410AE610C92117207EA7C3674928 +:101020002A23200605112C18C3550C211A20CDFDAA +:101030000FC3F60F2117207EA7C241103601CD73D2 +:101040004F2A23207DFE30C92A1D2001F8030922E2 +:101050002320C92117207EA7C25E10CD48100000B2 +:1010600000000000CD2010CD48100000000000005E +:101070000000219820CD1210CA9510E5211B2036C2 +:1010800002E1C3FC0F0000000000000000000000AF +:101090000000009800E523347EE601211B20C2AB4E +:1010A000103601E1347EE604C300103600C3A310FD +:1010B000CD22172EAD7E21FB19A7C4C11022A72077 +:1010C000C921031AC921A2207EA7C2D610CD8B1D2B +:1010D000CDB010CDFB10CDFB10CD22172EAD7EA7CD +:1010E000C229113AA520FE19DC0411211E203AA6BE +:1010F00020BEDA0B1121A320CD1C0521A520CD0D8A +:101100000BC3C8092100FF22A320C921010022A38B +:1011100020211D203AA520BED21E11C3F5102100AA +:101120000022A020AF32A220C921AD207EA7C23C60 +:10113000113AA520FE19DA3C11C3F5103601210041 +:101140000122A320211E203AA620BED25111C3F5B0 +:101150001021010022A320211D203AA520BED26427 +:1011600011C3F510CD22172EAD3600C31E11CD22AE +:10117000172E2D4EE52B2B2B23CD32123600CD37DB +:101180000D22A5200608CDE809E17EA7C8357EFE20 +:1011900003DA9511C92EAD3601C93A1620A7CC172E +:1011A000162129207EA7C44612CDEB48000000215D +:1011B00088207EA7C8237EA7C2001236012A8A2073 +:1011C0004E7DFE37D42112228A20CD22172E72CDD9 +:1011D0003B12C2ED112A8A2023228A20CD22172E0B +:1011E0008C7EFE04C22C12210000C36F1EE52A8AE9 +:1011F0002023228A20E1CD370D01000909228E200B +:10120000218E20CD0D0BCD550C218E207EFE40DA97 +:101210002412218C20CD1C05218E20CD0D0BC3C89E +:10122000092E27C92A8E200603CD79172189203659 +:1012300000C9110300190DC23512C979A7CA43129A +:10124000CD32127EA7C9112E20CDD80AD8212D204B +:10125000CD0D0BCD180C3A2E20FE28DC9C12FEC8BA +:10126000D4A2123A1620A7CC7612212B20CD1C0531 +:101270002127203601C92A2D200100100911F71756 +:10128000010210CD2C0AC5E51AB67723130DC288CA +:1012900012E101200009C105C28612C9212C2036A5 +:1012A00002C9212C2036FE21282034C93A1620A755 +:1012B000C83A1D20FEB8D0CD1210C2CC12210D208C +:1012C0007EA7C2C8123601C9233601C9210E207E6D +:1012D000A7C836002B36002100203601C921002086 +:1012E0007EA7C8237EA7C2F51236012A1D20010859 +:1012F0000509220620110720CDD80AD0210620CDCD +:101300000D0BCD57172106207EFEB8D24D132104B8 +:1013100020CD1C05CD901DCD2C0AC5E51AD304DBCC +:1013200003A6CA2A133E01320C20DB03AE77231337 +:10133000AFD304DB03A6CA3E133E01320C20DB030D +:10134000AE77E101200009C105C21A13C92A06209F +:101350000603CD7917210000220020C93A1620A7E4 +:10136000CC3316CD22172E407EA7C25D142E707E80 +:10137000A7C8C3271FC5E57EF5E680CABD13F1F5F2 +:101380000707223420217B19DC4914223A20F1007E +:10139000000000000000002A3420CD370D22382044 +:1013A000213820CD0D0BCDFD092139207EFEE0D462 +:1013B0004D14213620CD1C052A3820EBF5F1E12310 +:1013C00073237223C10DC275132170207EA7C82319 +:1013D0007EA7C21A1436012A72204E7DFE56D45AB8 +:1013E00014227220CD22172E7ECD3B12C207142A62 +:1013F000722023227220CD22172E8A7EFE04C24341 +:1014000014210000C3731EE52A722023227220E1FA +:10141000CD370D01000909227620217620CD0D0B54 +:10142000CD550C2176207EFE40DA3B14217420CD70 +:101430001C05217620CD0D0BC3C8092A7620060392 +:10144000CD79172171203600C9218E19C9E52A38B6 +:10145000200613CDE809E13628C92E47C9CDA514C9 +:1014600022652021F718226920CD22172E414E2314 +:10147000C5E5CD380D226720CD9B1DCDFD09216826 +:10148000207EFEEAD49814216520CD1C052A672011 +:10149000EBC3A11DC27014C9E52A6720060BCDE875 +:1014A00009E13628C9CD22172EAB7EA7210001C83D +:1014B000FE01210001C8C37B1EC9007323722300F3 +:1014C00000C93A1620A7CC3F16CD22172E567EA76C +:1014D000C2B7152E907EA7C8E5CD5915223620211A +:1014E000A119223A20E1234E23C5E57EA7CA121591 +:1014F000CD370D223820213820CD0D0BCDFD09210F +:1015000039207EFE28DC6E15213620CD1C052A38B8 +:1015100020EBC3B31DC2E914217C207EA7C8237E23 +:10152000A7C2971536012A7E204E7DFE47D4561558 +:10153000227E20CD22172E92CD3B12C289152A7E03 +:101540002023227E20CD22172E8B7EFE04C28315FF +:10155000210000C3771E2E37C9CD22172EAB7EA7E0 +:101560002100FFC8FE012100FEC8C3621FC9E52A91 +:1015700038200613CDE809E136E0C92A82200603A7 +:10158000CD7917217D203600C9E52A7E20C3BE1DF6 +:1015900001000909228220218220CD0D0BCD550C9E +:1015A0003A8220FE40DA7B15218020CD1C05218265 +:1015B00020CD0D0BC3C809CD021622652021391993 +:1015C000226920CD22172E574E23C5E5CD380D2296 +:1015D0006720216720CD0D0BCDFD092168207EFEFF +:1015E00028DCF515216520CD1C052A6720EBC3AA50 +:1015F0001DC2CA15C9E52A6720060BCDE809E136E8 +:10160000EDC9CD22172EAB7EA72100FFC8FE012118 +:1016100000FEC8C3911EC92111270E05E5219420A3 +:10162000347EA10603C22F16E111DF19C3000AE1BF +:10163000C3340A210F3B0E01E5219520C32016215A +:1016400008360E04E5219620C32016310024AFD3BE +:1016500003D30421002011A31A0600CD040B21009E +:101660002111A31B06C0D5CD040B210022D106C039 +:10167000CD040BAFD303D305CDA90100000000FBBF +:10168000C3B546CDCB0521F7182263200000002109 +:1016900039192261200606CD22172E414E23C5E5B9 +:1016A000CD380D2267202A6320C3CB1DC29E162A87 +:1016B0006320110B0019226320C5CD470CCD2217E2 +:1016C0002E574E23C5E5CD380D2267202A6120C351 +:1016D000D61DC2C4162A6120110B0019226120C137 +:1016E00005C29716CDD64FCDF11ECD22172E417EC5 +:1016F000FE0AD2F616342E577EFE0BD2FF1634CDDC +:10170000F61DCD0E17210836CD0E17210F3B06030F +:10171000C3340AEB2A6720060BC3FD090000000052 +:1017200000003AC62067C90001020300010203005D +:101730000102030001020300010203000102030091 +:101740000102030101020300010203000102030080 +:1017500001020300010203CD2C0AC5E51AD304DB04 +:10176000032FA6772313AFD304DB032FA677E10162 +:10177000200009C105C25A17C9CD2C0AC5E5AFD34F +:1017800004DB03772300AFD304DB0377E101200000 +:1017900009C105C27C17C9000000008001C003E038 +:1017A00047E047F04FF04FF85DF85DFC7FFC5FFECF +:1017B0005DFF5DFF0FFF0F011C0118013801700173 +:1017C00070017001F001F001F001F0017001700191 +:1017D0007001300138011CFF0FFF0FFF5DFE5DFC43 +:1017E0005FFC7FF85DF85DF04FF04FE047E047C0E9 +:1017F000038001000000000000000002019E03E2DF +:1018000007F806E007FC0EFC0EE007F806E2079E6C +:101810000302010000000000012735785E78DEDE5B +:10182000785E78342701003050885030305CCF5CCF +:1018300030FF7FFFFF7F3FFF7F83CFFFC1FFFFC5EB +:10184000D5D1FFC1DDC1FFF3C1D0D8FAFEFEFFFF45 +:10185000FFFFFFFFE0FFFFE0EEE0FFFFE0EEE0FF55 +:10186000FFFFFEFEFAF8C8800080D0D8FAFEFEFE28 +:10187000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE295 +:10188000EAE8FFFFE0EEE0FFFFFFFFFFFFFFFFFDE5 +:10189000E4FFFFFFFFFFFFFFFFCCFF33BFFFFFEFC2 +:1018A000FF3F8FFFFFF9FFE3E7FFEBDCFF1FDBFFED +:1018B000FFFFFFFFFBFFFFFFFFFFCFFFFFFDFFE38A +:1018C0009FFFFB03FFEF00FFD300FFFF00FFFF00C0 +:1018D000FFFF00FFFB00FF7100FFFFFF7FEF1FD93D +:1018E000F9037FFF019B7F00FE1F00FF03003F0005 +:1018F00000070000010000000000101C22422244EA +:10190000221C00000000101C3E1E3E1C00000000B7 +:101910000000081C0C1C0800000000000000080C5F +:1019200008000000000000000000080000000000A7 +:101930000000000000000000000814242212140817 +:101940000000000000081C3C1E1C080000000000F5 +:10195000081C1C1C08000000000000081C1C0800DB +:10196000000000000000000800000000000000006F +:101970000000000000000000000000000000080857 +:101980001C1E37BFBEF6F6BEBF371E1C080800007F +:10199000000008081C7E6C78EC786C7E1C0808003F +:1019A0000000000000000C1E96BCF4BC961E0C004B +:1019B0000000000040F040000000040E143A3E1DFC +:1019C0003D3E1D2E0C040000000000880120044E46 +:1019D00014BA381D39BE340C8A2C014012000002A2 +:1019E00007020000000000FC023F020001070F0197 +:1019F0000001031028502810000000000001637C43 +:101A00001318000018137C6301000000C032DEF8D8 +:101A1000DE32C00010096F7C6F0910000E2E241FEB +:101A2000070A1B0000000000008001F00FF81FDC17 +:101A30003EF81FF00FF01FE017E02728C9E89104D7 +:101A4000C1080102004450882870CF241DEF3FE2F6 +:101A5000011A123828484C888C040802320133805D +:101A6000014000008443441B24D817800F8A1FB80C +:101A70003FF83FD020DE6FC26FA26EB812E41602AC +:101A80003000000000000000000000000000000026 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000004000000B41901030061 +:101AB000000000A709000000000000000000FE0078 +:101AC0000000FB17020C000000000000000000FEF8 +:101AD000C8909717023000000000000000000001CD +:101AE000130000000802000025410000C0006070E3 +:101AF00000000000000000000000000000000000E6 +:101B00000000000000000000000000000000010BC9 +:101B100000000000004717FD000000E71901010068 +:101B2000003717FD000000E819010300002717FD2A +:101B3000000000E8190103000000000000000000A0 +:101B4000000000000000FF000000FB190108000079 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000002100000000000054 +:101B700000001B1B130008130E1B1B1B00000000A2 +:101B800011270730000000000000000000000000E6 +:101B90000100000000000000051D2F00001D2600B0 +:101BA000001D3990391803299039180331903918DC +:101BB0000339A049180428A049180430A869180559 +:101BC0002F31480D0A094D564909432C3038480D2C +:101BD000060128280120300118380118E00120E80A +:101BE0000128F00005B07058C0405080686078400F +:101BF0008890A85098683870B00005A0E0387850F8 +:101C0000B06890888040D85848409878C048604074 +:101C100048406000088158B08180A081885081A828 +:101C200040C1B0C0C1A070C190B0C1604000000010 +:101C300000000000040170700168C0019840017844 +:101C4000B000000000800000000000000000000361 +:101C50000000000000000013080B131F2444241F81 +:101C60007F494949363E414141227F4141413E7FC2 +:101C7000494949417F484848403E414145477F08DE +:101C800008087F00417F4100020101017E7F0814A6 +:101C900022417F010101017F2018207F7F1008046D +:101CA0007F3E4141413E7F484848303E4145423DAC +:101CB0007F484C4A31324949492640407F40407E66 +:101CC0000101017E7C0201027C7F020C027F631411 +:101CD00008146360100F1060434549516100000310 +:101CE000030000000000003E4549513E00217F01F5 +:101CF00000234549493142414959660C14247F0467 +:101D0000725151514E1E294949464047485060364C +:101D1000494949363149494A3C08142241000041A9 +:101D2000221408141414141422147F1422181818DE +:101D30001818080808080820404D502000007900B5 +:101D40007900000000C04040404040011C3C7860E9 +:101D50000F1412070211040308131BC2FC01210314 +:101D6000280E14C30C0221EF203601C921102C0EBD +:101D70000C119D09C32A05CDCB05C3C61E215D20CC +:101D800036002127203600233600C93601C36E11E4 +:101D9000210620C30D0B3603C3480F216720C30D56 +:101DA0000BE1CDBA14C10DC39414E1CDBA14C10D29 +:101DB000C3F115E12373237223C10DC3151523222B +:101DC0007E20E1235E2356EBC39015CD1317E1234C +:101DD00023C10DC3AC16CD1317E12323C10DC3D20C +:101DE000163E05C3D505AF321B20C93E01C3E71D12 +:101DF000215E203601C92EAA347EFE06D40E1E2195 +:101E0000532036002A5420CD0A4F211127C936000D +:101E10002EA03601C92E0006AACDE4022EAB342E28 +:101E2000B03601C3E1000000000000000000002EF9 +:101E30000AE52115000610225420E1C32A0EE521EF +:101E40001000C3371E0630E5210500C3371EE57DAF +:101E5000FE92D2651EFE7ED26A1E2E8C34E12B2BA2 +:101E60003600C3F80C2E8BC35C1E2E8AC35C1E2268 +:101E70008820C9227020C9227C20C9FE02210002CC +:101E8000C8FE03210002C8FE04210002C82100038D +:101E9000C9FE022100FEC8FE032100FDC8FE042188 +:101EA00000FEC8FE052100FDC82100FDC9010E0D80 +:101EB00014121B211C1C1B0F0E080D131200000016 +:101EC000000000000000CD22172EA07EA7CAE1006E +:101ED00036002EAA3600E52EA25E2356EBCD0A4F21 +:101EE000E1C3141F00CDEB1DCD22172E8D34C32668 +:101EF00049CD22172E8D7EFE08D4FD1EC936002E38 +:101F00007011131C0630C3040B000000FECBD2CFAF +:101F10000EC3981FE52EAE4E3600CDDA03E1C31591 +:101F20001E010310C3300CE5CD351F223620E123FE +:101F30004E23C37513CD22172EAB7EA7210001C8F7 +:101F4000FE01210001C8FE02210002C8FE0321009B +:101F500002C8210003FE04C8FE05210003C82100B9 +:101F600003C9FE022100FEC8FE032100FDC8FE04D5 +:101F70002100FEC82100FDC9CD22172EAB7EC6016F +:101F800027E60FC61C21023EC336050000000000F4 +:101F900000000000000000003A2E20F5C61A4F7C19 +:101FA000B9D2B01FF1C60B577CBADAB11FC3F01D0E +:101FB000F121C2203601C3E61F21C2207EA7C2C77D +:101FC0001FCDCB05C3920336002EB03AC32067CD98 +:101FD0002C0A0E0611E01FCDB305C3C24EC39D03EC +:101FE0000000001A1A1A3A1E20FED0D4F41F32C381 +:101FF00020C3F01D3EC0C9000000000000FFFFC06C +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/lrescue1.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/lrescue1.hex new file mode 100644 index 00000000..cd9f9d9d --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/lrescue1.hex @@ -0,0 +1,257 @@ +:10000000C33D4035C036103E013240203A1E20FE2E +:1000100090D227403EFD324820211D203EA8962345 +:1000200086324A20C338403E02324820211D203A01 +:100030001E2086D690324A203EFDC360423A4020C0 +:10004000A7C24A40214120C3034021422035C27C3F +:10005000403602237EA7C29140CDEA402144207E53 +:10006000A7C27340237EFE4DC27C4021442036014E +:10007000C37C40237EFE55C27C4036492143207E0E +:10008000A7C28A40214720CD1C05CDBA40CD0341EF +:10009000C92A452011FCFF192245207DFE25C28A70 +:1000A00040214020360021432036002336002336ED +:1000B0002521492036C02336D0C92A45204E234663 +:1000C000235E2356233A4420A7CAD4403E0132423D +:1000D00020C3DC403A4220FE02C2E6403A4320A759 +:1000E000C2E6402245202A4920C93A4920FE48DA82 +:1000F000FD403A4A20FEE0D2FD40FE2AD0214320B6 +:100100003601C9CD2C0AC5E51AD304DB03772313C6 +:100110000DC20841AFD304DB0377E101200009C120 +:1001200005C20641C9010555410105554101085A5D +:100130004101086241010A6A41010B7441010E7FCD +:100140004102108D410212AD410217CD410218F556 +:1001500041021825420000000000000000040400D5 +:1001600000000000000C0C000000000000081C1C37 +:10017000080000000000000C1E1E1E0E0000000003 +:1001800000004C1C3E3F3E1C0C2000000000000004 +:100190000000008D003C007E00FF00FF007E003E5E +:1001A000000C00C000010000000000000000000082 +:1001B000000000350479057C00FC01FE03FF01FE10 +:1001C00001FE04FC003A04000000000000000000F2 +:1001D0000000006208F808FC03FE07EC0FFF07FFB1 +:1001E0000FBE07BC0FFD07FD03F801F208A80204CB +:1001F00004000000000000000000001220C804E815 +:1002000003F403FC0FFC07780F7A27FF17FE0EF8A4 +:1002100017FC0FE80FFC05FC17B224280120000092 +:100220000000000000000000000000E101FB30FCC5 +:1002300007FC0FFE07FE2EED0EFC1FFE07FE0FFD56 +:100240000FF81FBC0FFC07F803F413811000000027 +:100250000000000000FFFFFFFFFFFFFFFFFFFFFFA9 +:10026000324720214A207EFED0D47542FE30DC7A0F +:1002700042C34A400036D0C900003630C9C9000028 +:10028000CDBD0ACD3246C396423E10CDD5051AC328 +:10029000CF4240CDD5052119281110440E15CD2A85 +:1002A000053E50CDD505CD694321902B0E07CD15C8 +:1002B000433E01CD22433E40CDD505CD8646211695 +:1002C0002E1115451AFEFFCAE842FE5BCAE242E65D +:1002D0003FD5CD3605D1CDA443133E05CDD505C3BD +:1002E000C44221142FC389423E01CD22433E50CD4A +:1002F000D5050E0721902B0610113345CD000A0DB0 +:10030000C2F742211031114345010210CD1B0C3EB2 +:1003100060CDD505C911B5440610CD000A0DC21532 +:1003200043C9F521103111C544010210CD1B0CF158 +:100330003DC8F521903311E5440610CD000AF13D8A +:10034000C8F511F5440610CD000AF13DC8F57CFE54 +:100350003DC2584326312D2D0E01CD1543F1FE1B14 +:10036000DA65433E1BF5C34A43116D4421132D0149 +:100370000408CD1B0C167021122E0600E536800EE7 +:1003800005093601E10E200915C27C43118D442177 +:10039000133C010408CD1B0C11AD44211232060898 +:1003A000CD000AC9C5E5D51AE680CAB34311054593 +:1003B000C3B643110D452190310608CD000AD1E1A5 +:1003C000C1C9CD340BCD32463E04CD2243CD694365 +:1003D000CDA0463E10CDD5050E092115301125447E +:1003E0000608CDA443CD000A3E05CDD5050DC2E0DB +:1003F000433E01CD22433E60CDD505211530112865 +:10040000450E09CD2A053E40CDD505C90F0B001874 +:100410002929291B0B140D00111B1B110412021496 +:10042000041B2929298052387E3852800000101080 +:100430007E101000009244289228449200384438DC +:100440001038443800FE1038543810FE0000000008 +:1004500000000000000018527E52180000001852E0 +:100460007E521800000018527E52180000F0FFFF64 +:100470000F080000100400002002000040020000ED +:1004800040010000800100008001000080010000A8 +:1004900080010000800200004002000040040000D3 +:1004A00020080000103000000CC0FFFF0380808394 +:1004B0004D320408F0307ADDF4F4DD7A30000000CB +:1004C0000000000000E003E603E703FF0F790F7868 +:1004D0000F6C1FEC1FEC1F6C1F780F790FFF0FE7DD +:1004E00003E603E0030E18BE6D3D3C3D6DBE180EE5 +:1004F0000000000000193A6DFAFA6D3A1900000088 +:100500000000000000797C6EE6E66E7C79707878F9 +:10051000F8F87878798F0B840092045B880D920448 +:1005200091131B028E088DFF05080607131B303040 +:10053000301BFF387CECFEB7E5F860340C0000009F +:100540000000001000B800FC05FC0FCC1F9F1FBF6F +:100550000FFD1FC83C9819F03BE07FC03FC41FFC53 +:100560000D3800CDBD0ACD32463E30CDD50521181F +:1005700025117B19010113CD1B0C211829118E198E +:10058000010113CD1B0C21152511A119010113CD5A +:100590001B0C210C27113918010110CD1B0C210F48 +:1005A00026114918010120CD1B0C211225116918B3 +:1005B000010128CD1B0CCD86462E18262C3E1ACDC7 +:1005C00036053E0ACDD5053E018467FE33DABD45CA +:1005D0000E037DFE18C2DE45111C46C30246FE1501 +:1005E000C2E945111F46C30246FE12C2F44511225C +:1005F00046C30246FE0FC2FF45112546C3024611FF +:100600002846CD2A050E07112B46CD2A057DD60397 +:100610006FFE09C2BB453E60C3D505C91B1F1C1B2D +:10062000211C1B211C1D1C1C1D211C1B0F0E080D39 +:1006300013122E07263B116946D51A3CCD3605D13B +:100640001325257DFE09CA56467CFE2AC239462E50 +:10065000092633C339467CFE2FC2394626292E0788 +:10066000117E460608CD000AC90C0D0712FF100DB9 +:100670000E100D011A0D1207FF122422241C3C42F9 +:1006800099A5A581423C21472B01472C11272E1A01 +:10069000D640C00AD644C07ED67FC0AF32ED20C956 +:1006A000262B2E471100027E19861986FE3FC26254 +:1006B00003C9ED20C9CD8042000000CD6345CDCBFC +:1006C00005CDDF02CDD402CDBD0ACDCA01CD781F44 +:1006D000CD6102CD790221BF213601CDF202CDA933 +:1006E000012127207EA7CAE146237EFE01D306C250 +:1006F000EA463A2E20FE70D306DA2F47C3F24600B0 +:10070000CDB70A3AC62032E320C9CDCB05CDBD0A0C +:100710003AE32032C620CD764B000000CD8508009C +:100720000000C357063ABF21A7C2AA0EC36000212A +:10073000292036002A2D203A2C20FEFE010014C468 +:10074000850109221D20CD6D0D2113203601CDEC30 +:10075000470000000000D3062114207EA7C2A14755 +:10076000CDD847215D207EA7C29247CD770CD30616 +:100770003A1D20FEB0DC7F023A1D20FEB0D4580D99 +:100780003A1620A7CC9D0DD306CD054CCD7B48C392 +:100790004E47CD2903CDDF02CDD402CDCB05C373A7 +:1007A00016CD67043AAE20A7C2924721AC092210A9 +:1007B00020C36047CD9805CD22172EB07EA7C8363E +:1007C000002EAB7EFE03CCCF47CD3B4AC39805CD70 +:1007D000C243CDB94DC39805CD7C03E676FE54C027 +:1007E0002EED26207EA7C82B2B3603C93A1620A74C +:1007F000C82100203601C9000000000000000000F0 +:100800003A1D20FE48D0215C207EA7C0360121067B +:1008100025060DCD340A21063D060DC3340A3A5D86 +:1008200020A7C230480000003E01CDD505C38B0D86 +:10083000E1215D20C3EF08CD00483A1620A7C8CDBE +:1008400022172EAB7EFE05D26648FE03D26F48FE0D +:1008500001D2D14B2E8D7EFE07D82EAA7EFE04D863 +:10086000213E203601C92E8D7EFE04D8C360482E5D +:100870008D7EFE05D8C36048000000CD37483A3E63 +:1008800020A7C8CD22172EAB7EFE06D2B648FE05A5 +:10089000CABB48FE04CAC04806583A1D20B8D2ACAC +:1008A00048213F2036012129203600C92140207EE1 +:1008B000A7C02B3600C90688C39A480678C39A4851 +:1008C0000668C39A48DB02E60321AC21F58677F17E +:1008D00021AC228677C900000000003A5C20A7C046 +:1008E0003A9C20E610CA0E48C330043A3F20A7C203 +:1008F0000040C93AEF20A7C83AC420C3034900000A +:10090000C3F348B032C420D303C93AC420A032C4D0 +:1009100020D303C90624C300490620C30A49CDE6F3 +:100920001D0628C3004906F7CD0A49C3180D3AC56C +:1009300020B032C520D305C93AC520A032C520D386 +:1009400005C90604CD2E493E05CDD50506FBC338A5 +:10095000493A1620A7C83A0020A7CA62490622C30E +:10096000004906FDC30A49CA744936000621CD0074 +:1009700049C3201006FECD0A49C90601CD0049C36E +:10098000481006FEC30A493A1620A7C21F4C3A9CDB +:1009900020E604C21F4C3A1D20FE30C3A34906EFD7 +:1009A000C33849DA9E490610C32E493AA020A7C28F +:1009B000B74906FCC338493A9C20E608CACE490626 +:1009C00001CD2E49219B2034E601C0C3B249060265 +:1009D000CD2E49219B2034E601C8C3B249CD8249BE +:1009E000C348103AEE20A7C0211C390628C3EB09E2 +:1009F0000000000000CD22172EAB7EA7210500C805 +:100A0000FE01211000C8FE02211500C8213000C9D6 +:100A10003AC6200FDA224A21122B112D4A0E0EC39C +:100A20002A05CD174A2112373E1DC336050F0B008C +:100A3000181B0F0B00180411261E27210F2C110B59 +:100A40001A0608CD000A115A4A0E0BCD2A05CD65AB +:100A50004A210F2ECD2805C3CB05281B1B1C1B0FBD +:100A60000E080D1312CD22172EAB7EA711804AC897 +:100A7000FE0111824AC8FE0211844AC811864AC981 +:100A80001B211D1C1D211F1CCDCB0521C620C9000B +:100A900000000000000000211028D306C90620CD68 +:100AA0003849C37D1D3AEE20A7C23C4CCD2217C366 +:100AB0006A0321C6207E0FDAE54A3622CD22172EA0 +:100AC000AC35C2284BCD584B210F393E1ECD3605D3 +:100AD000CDB602CD884A3621CD22172EAC7EA7CACC +:100AE000B304C38B4BCD22172EAC35C20E4BCD5861 +:100AF0004BCDB602CDCB0521C6203622CD22172EF6 +:100B0000AC7EA7CAB30421C6203622C38B4BCD428C +:100B10004B21C6203622CD22172EAC7EA7C28B4B8E +:100B200021C6203621C38B4BCD424B21C620362116 +:100B3000CD22172EAC7EA7C28B4B21C6203622C3F6 +:100B4000E1007E3D210127CA504B24243DC24A0BBF +:100B50000610CD340AC3CB05210F2811634B0E13A9 +:100B6000C3B30506000C041B0E1504111B0F0B006C +:100B7000180411261D273AC6200FDA864B062021BD +:100B8000C52070C30A050600C37F4BCDBD0ACD76D4 +:100B90004BCD104AC3B44B0600CD0A4900000021DA +:100BA000C22011651B0609CD040B21000022E5209F +:100BB00022EE20C9CD3B4AC3E10021E5203AC62000 +:100BC0000FD823C90000000000007E3DC84FC34F6E +:100BD000022E8D7EFE06D8C3604800CDBA4B7EA79C +:100BE000C80630CD1309B8D8CD22172EAC34CD4667 +:100BF00002CDBA4B36000610CD00493E20CDD505BA +:100C000006EFC30A49CDDB4BC3DB48AF325920CDD9 +:100C1000974BCDA901C3824CCD661D210000C9218F +:100C20003F207EA7CA9E49237EA7CA9E49C3A649E4 +:100C3000CD8403C3E100CD5149C3004ECD22172E10 +:100C4000A07EA7CAB24A3600C3674C00CDBD0ACD0C +:100C500022172EA234211B260E0411634CCD2A0527 +:100C6000C3154E0514040B2EAC7E3DCAB24ACDA46A +:100C700003C3E14CCDA40121C2207EA7C03600C32E +:100C8000AD4D21DC20360021E3203600C3B3040043 +:100C90000000000000000000000000000000000054 +:100CA00000000000CD22172EB03601C9CD104ACD6C +:100CB0003B4AC3CB05CD22172EAE4E3600C3DA0316 +:100CC000AF32E320C9000000000000CD22172EA2A1 +:100CD0007EA7CADB4C211920C38E0F211B2036FEB4 +:100CE000C9CD764BC3B24A2256203E01325A20C9A2 +:100CF0003AEF20A7C8C3874921C6203621C9000082 +:100D000011C04D21C0210606CD040BF3CD114DFBC2 +:100D1000C92AC0217EA7C8234E5F07DA564DE5CD0C +:100D20002B4DE10DC21E4D23C3144DC5D5CD694DCC +:100D3000D1C12AC221530608CD2E49D3062B7CA748 +:100D4000C815C23D4D5306F7CD38492B7CA7C815B1 +:100D5000C24B4DC3354DE52AC4212B7CA7C25A4D49 +:100D60000DC2574DE123C3144DDB0121EC200FDAF6 +:100D7000754D3600C97EA7C036FF2B7EFE09C3A87D +:100D80004D330228022202330228022202330226B5 +:100D9000021E02330226021E0222021B0216022239 +:100DA000021B021602190600D034C3AC0A11B34D5F +:100DB000C3034DC64DFF0DFF50116D4FC3034D00D2 +:100DC000814DFF0DFF5019011B011E01220126015B +:100DD00028012D0133012D012801260122011E01C8 +:100DE0001B011903000000000000000000000000CB +:100DF00000000000000000000000000000000000F3 +:100E00003A1620A7C0CD410AE610C821A421347E9D +:100E1000FE02D83600CD22172EA27EA7C8EB2139BC +:100E20004E373E99CE0096EB862777211B2BCD744B +:100E300005211B2D3E1CC3360501C3D74EAFBEC2D4 +:100E4000574E342AA82122B82021AA4E22B62021AA +:100E5000B4203618C3834E2AB620EB2AB8200608E1 +:100E6000CDC8092AB8207DFE40DAE14E000021B449 +:100E700020AFBECA7A4E35CA954E23BECA834E35C0 +:100E8000CAA14E2AB620EB2AB8202B2B0022B8206C +:100E90000608C3C80923361021B24E22B620C386E5 +:100EA0004E21BA4E22B620C3864E00C031DFFCDF91 +:100EB00031C05D5D2A3E1C3CE40C1090987B3F7B6A +:100EC0008886CDE64E36FFCDA9017EA7D306C2CADD +:100ED0004ECD2217C39D0321B220AFBEC823C33E0F +:100EE0004EAF32B220C9CD370621B220C9CD22176C +:100EF0002EA27EA7CA2010CD2010C3F60F0000003E +:100F00003A5A20A7210300C41A4F3AEF20A7C8225B +:100F1000F22021F1203601C24D05AF325A202105C1 +:100F200000C92A1D2022A821C3D40221B3203601E2 +:100F3000CDA9012B36017ED306A7C2364FCD22178D +:100F400019041E0216041E0222031E012802260393 +:100F50001E03190312060000000422011E012606CA +:100F600000000000000000000000000000404FFFF3 +:100F700011FF50CD22172EA27EA7CADD49C37A49A0 +:100F80003A1620A7C82A2D203A2C20A7F2934F7C8E +:100F9000C60467CD2C0AAF01600109770120000962 +:100FA00077012000097701200209770120000977E5 +:100FB0000120000977C93A1620A7C82A1D20EB2A6C +:100FC0002D207DD60ABBD07CC60CBAD0C612BAD8AA +:100FD0003E01321820C9CD22172EAB7EFE02D8FE6C +:100FE00006D2F34F16FC2174207221802072218CCE +:100FF0002072C916FBC3E64F00000000000000008D +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/lupinIII-1.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/lupinIII-1.hex new file mode 100644 index 00000000..3349fc53 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/lupinIII-1.hex @@ -0,0 +1,258 @@ +:020000040000FA +:20000000000000C340000000FBC9000000000000E5D5C5F5C3B10400C3CD0B414630433266 +:20002000C36F023431444141C376033245433044D1C3CC1131303043C30C013032323143DA +:20004000310024FF0600CD9704CD9F04CDA904CD0C4EFBAFD303D305CD8C00CD341ECD70C0 +:2000600000CD9600CD9100CD131FFFD306C35300DB000FD26F513E40C3B601DB000FD200A2 +:20008000503E40C3BF013EFF32DF20C9AF32DF20C93E50C3730B21092611BA00CD7B0106F6 +:2000A00017E7C9210E3111BA00010801CD7E01060411B600E7C91B0D13153C4299A5A58145 +:2000C000423C1B212928201B130008130E1B020E110F0E110013080E0D3E20C3730B211727 +:2000E0002811F4000608E72117340608E7211E2A0608E7C90F0B001804111C210F0B0018A0 +:2001000004111C2207081C12020E1104060021002470237CFE40DA1101C9CDDE002ACE201A +:2001200011C320CD3D012AD22011DC20CD3D013ADA20A7C82AD02011C620C33D0122D620BF +:20014000EB22D420C3B502FFCD1A01CD0F03CD010321012C1175010606E7CD471F21112E32 +:2001600011DD1D0608E7DF2E4322D42021103022D620C3C202010E0D14121B010801C5E508 +:200180001A77231305C28001E101200009C10DC27E01C921870411D8200602EFC92189044A +:2001A000C3960121E62046B0D30377C921E620462FA0D30377C921E52046B0D30577C9210B +:2001C000E520462FA0D30577C921C3203AD8206F2B2B22C920060311DC20AF1ABEDAE90186 +:2001E00096C0231305C2DB01C906032AC92011DC207E12231305C2F1012AD22022D6202A01 +:20020000C92022D420CDB502CD495406FFCD0E013ADB20A7211628CA1D022116340140023E +:20022000CDE5073ADB20A7C233022ACE2011C320C339022AD02011C620CD3D010E05C52113 +:200240000A2701B003CDE507CD7E4B210B29115D020612E7CD7E4BC10DC23E02C9180E143D +:200260001B0C1412131B01041B1B0B140F080DD51ACD0903D11305C26F02C921C22011C5FF +:20028000203AD8205FCDF30213230603EF21C020110300C34F033AE420A7C821D52036207A +:2002A000233616CD7B0221D8207E3D3D2ED4772ED97E2ED7772AD4207E2322D420E60FCD63 +:2002C000E3020602C52AD4207EF5E6F00F0F0F0FCDE302F1E60FCDE30221D42034C105C2AE +:2002E000C402C9C620CD19032AD620CD300321D72034C90603AF1A8E27772B1B05C2F60268 +:20030000C93AE720C62021013ECD1903C33003210137118B040606E7C9117F03A7C8E521F1 +:200320000000C5010500093DC2230319EBC1E1C9C50605D306C51A07771301200009C1054C +:20034000C23303AF770120000977097709C1C9AF77231BBAC25003BBC25003C97DE607D3C2 +:2003600002C506037C1F677D1F6F05C264037CE63FF62067C1C97E12231305C27603C91FDC +:200380002444241F7F494949363E414141227F4141413E7F494949417F484848403E41418D +:2003A00045477F0808087F00417F410000007D7D007F081422417F010101017F2018207FC9 +:2003C0007F1008047F3E4141413E7F484848303E4145423D7F484C4A3132494949264040B9 +:2003E0007F40407E0101017E7C0201027C7F020C027F631408146360100F106043454951ED +:2004000061000003030000000000000808080808122A7F2A24081422410000412214083E08 +:200420004549513E00217F0100234549493142414959660C14247F04725151514E1E29493E +:200440004946404748506036494949363149494A3C14141414140F1412071B0E0D0B181BEA +:20046000211B0F0B00180411121B011413130E0D1B211B0E111B221B0F0B00180411121B34 +:20048000011413130E0D00C52AC83602110403081313080B1306C0210040110020EFC90695 +:2004A00050110021210041EFC90650110022C3A404210020352334CD0C05CD400BCDE51D1A +:2004C000DB010FDA070521E8207EA7CAE2042B7EFE09D2DE04C6012732E720CD0103AF3210 +:2004E000E8203ADF20A7C2FE043AE420A7C2F9073AE720A7C214053AE020A7C2F907CD274F +:2005000013F1C1D1E1FBC93E01C3DF04DB000F0FD27F52C93A0220A7C2FE043E01320220FC +:20052000310024FBCD860021E0203600CD3307CD7B00CD4701210A301156040604E73AE785 +:20054000203DD3062107270616C2C907115A04E7D306DB01E604CA3E050699AF32DA203AB2 +:20056000E720802732E720CD010321C320110600CD4F03CD9504CD9F04CDA90421010122F4 +:20058000E920CD910BCD800B21E420343E20CDA3013E80CDB601CD8C00CD944BCDA30BCDDA +:2005A0004801CD5A07CD05060601CD8E1CCD364ECD964D11984C06051A04B8C2A319CDCD7F +:2005C00012CD7816CD621B211320AFBEC23906CDF20BD306DF2E487EFE18D4E305CDEE059A +:2005E000C3BE05CDE54DFE30D80601C3B81C211F207EA70606CA0106FE010605CA0106068F +:20060000042E3F70C90607C5DF211728D211062634014001CDE5073E08CD730BDF11FC0064 +:20062000211734DA2B0611F40026280608E73E08CD730BC105C20706C93600CD860006007D +:20064000CDB81CCD0C4E2140213600CD800B3ADA20A7C26D06CDC20B35CA7807CD1607CDE3 +:200660004E48CD95043E80CDB601C396053ADB200FDA8E06CDC20B35C2A906CDF1063E21C9 +:20068000CD060734CDC20BA7C2BA06C38F07CDC20B35C2D806CDF1063E22CD06073600CDC0 +:2006A000C20BA7C2CA06C38F07CD1607CD4E4821DB2034CDC20BA7CAD006CD9D01FFCD86A0 +:2006C00000CD2C07CD7B00C36206CD9301C3BD0621DB203600C3CA06CD1607CD4E4821DB92 +:2006E000203600CDC20BA7C2CA0621DB2034C3BA06CDC901CD91000600CDB81CCD2E47CD53 +:200700004E07210A30C9CD0903CD8C00CD9504CDBD4721DB20C97E3D210125CA2307243DBB +:20072000C21E07010801CDE507C391003ADB200FDA4907AF21E52077F3D305060A0E000D0B +:20074000C23F0705C23D07FBC93E20C33407210A2811BF170614E7C3D900CDA809CDCC096F +:20076000CDFB09CD3E0ACD520ACD630ACD790ACD8F0ACDB00AC3CA0ACDC901CD0C4ECD953C +:2007800004CD91000600CDB81CCD8C00CDBA47CD860021000022E42022E52022E92021011B +:2007A0000022DA20FFCD700021122D11CA170609E7CD9600CDC407CD9301FFCD3307CD7BEF +:2007C00000C3CC1F3E80C3730B117004E7DB010F0FDADB070FDA5905C33E053E010698C35D +:2007E0005C05011002AFC5E5772305C2E807E101200009C10DC2E607C9CD581FCD5908CD4C +:20080000DA0BCD9C48DF2E47347EFEFFC211082334CDF91DCD2008CD2C1FCD404EC3FE04FD +:20082000214F20347EE603A7CA3B08FE01CA4108FE02CA4A08FE03CA5308C9CDE846C3D32B +:2008400017CD1244CD414AC39019CDD245CD7C4AC3831ACDE548C3C618210420347EE60744 +:2008600077A7C8FE01CA7308FE02CA6913FE03CA2015C9CD180CC3991202240A02360A0569 +:200880002702062702052B03062B0E053603063B02053B021B24021C24021D241C1E2405A4 +:2008A0001B28011C28011B2B011C2B011B2E011C2E011B31021C31021B35011C35011B38F8 +:2008C000011C38011B3B011C3B011B3E021C3E021E3A06FF092507092E080938070C270A06 +:2008E0000C330A0F25060F3906122704123904FF18DBDBC3C3DBDB180400FFFFFFFF140066 +:20090000F203010002000C000C0002000100F2031400FFFFFFFF040060202020202020306B +:20092000303838383C7F8F07078F7F3C3838383030202020202020601008F87878F8081005 +:2009400008101F1E1E1F10080000243C3CBD7E00007EBD3C3C24000000003C42E7423C005C +:20096000081C1C14141C1C0800000000000038007C00DA10AB19010FAB1F0107AB0DB61805 +:200980007C1038000000000000000000000010004400001001010004011200000105000010 +:2009A0004410100000000000211627CDC309211633CDC309211630CDBD0921163C1108094A +:2009C000C3C60911F808010802C37E01211827CDE709211527CDE709211833CDE109211597 +:2009E00033111809C3EA091128093E05F5011001D5CD7E01D1F13DC2EC09C921122ECD1969 +:200A00000A210F2E114009CD1C0A210F2DCD2A0A210F36115009C32D0A1138093E08F5D597 +:200A2000CD7B01D1F13DC21E0AC91148093E04F5D5E5CD7B01E1D123F13DC22F0AC9211621 +:200A400029CD4D0A211635CD4D0A211E333E1DC30903210324CD5B0A21033F1158093E1878 +:200A6000C32F0A1179081AFEFFC8CDF21DD511F008CD1E0AD113C3660A11D4081AFEFFC877 +:200A8000CDF21DD5116009CD1E0AD113C37C0ADF2E007EFEFFC8A7C4A10A11040019C39220 +:200AA0000AE523235E2356EB116809CDCF1EE1C921022ECDB90A21042E1188093E04F5D577 +:200AC000CDCF1ED1F13DC2BE0AC9CD44177EA7C8FE05D4DE0A21022E116809C3BE0AFE09D1 +:200AE000DAE50A3E08D60421042ECDD80A3E04C9010E02CD5C03C5E51AD304DB032FA677FE +:200B0000231305C2F80AAFD304DB032FA677E101200009C10DC2F60AC9010C02CD5C03C5C2 +:200B2000E51AD304DB03AE77231305C2210BAFD304DB03AE77E101200009C10DC21F0BC99C +:200B4000DB00E604C83A0320A7C03100240604C53E80CDA301FFC105C24F0B3E013203207C +:200B6000CD8600FB1191042111300604E7CD9100C340003200203A0020A7D306C2760BC995 +:200B80003EDFCDAC013E5FCDBF01210000226320C9DB02E603212721F58677F12E27262256 +:200BA0008677C9CDC20B7E3DC84F21012511BA0BC5CD7B01C10DC2AD0BC90C11DFFCDF11DF +:200BC0000C00DF2E277EC9CD4417237EC93ADB200FDAD70B2621C92622C9210820AFBE3EE7 +:200BE00010CAAC0135C3A30121E9203ADB200FD023C9CDE80BAFBEC8DF21C420D2010C2EC2 +:200C0000C77E0630B8D8CDC20B34CDA30BCDE80B36002108203650C9212320AFBEC823BE78 +:200C2000C2320C23BEC22C0C34CDBF0DCD1012CDBF0D214D213601212020AFBECAB80C233F +:200C4000BECA480C35C3880D2B36003A2620A7C2590C3A2220A7CAB80C47CD7E0CDA660CE1 +:200C6000CD900CC3880D23235E2356EBCDE207211F20342E177E0F0FCD9C0CC3970DDF2E97 +:200C800000783DCA8D0C23232323C3820C7E0FC93A1F20A73A17200F0FCAA70C218841DA19 +:200CA000AF0C2EF8C3AF0C215041DAAF0C2EC0221C20211E203600C92A1A203A1720CD380A +:200CC0000E321920CD3612CD621DCD5B10D2880D211820772B7E23BECA2F0DC602BECADC0F +:200CE00011D604BECADC112A1A20110708193A1820FE03D2230D0F1100F4D2000D110C0072 +:200D000019CD61037EA7C2970D2A1A20E53A1920FE11D21B0D21CF0FC3420D21E30FD6102F +:200D2000C3420D11F4FFCA000D11000CC3000D2A1A20E52117204623237EFE11D2500D21CF +:200D4000FF0F3DC24B0D5E2356EBE92323C3420D211310D610C3420D7CFE90D2730DFE5B3A +:200D6000D26B0DFE443E02D03E01C9FE743E04D03E03C9FEC4D2800DFEAB3E06D03E05C957 +:200D8000FEDB3E08D03E07C921632036002A1C20EB2A1A20C33E532163203601CDA20DC359 +:200DA000900D211E207EA7CAB70D360011E4FF2A1C2019221C20C936FF111C00C3AF0D2AA9 +:200DC0001C20EB2A1A20010E02C31C0B010E02CD5C03C5E51AD304DB03A6CAE20D3E013207 +:200DE0000720DB03AE77231305C2D40D97D304DB03A6CAFA0D3E01320720DB03AE77E101AB +:200E0000200009C10DC2D20DC97DFE30DA220ECD61037DE61FD6070601CA2B0E04D603C382 +:200E2000190E7CFE803E09D03E08C978FE04C07CFE303E0AD03E04C90FD2090E7CFEA0DA78 +:200E4000640EFEC6DA5B0EFEE03E1DD87DFE7B3E13D07DFE4B3E18D03E1EC97DFE643E15AE +:200E6000D03E1AC9FE70D27C0EFE40DA850EFE523E1CD87DFE643E14D03E19C97DFE803E30 +:200E800012D03E17C97DFE7B3E11D07DFE4B3E16D03E1BC93E032129E922092021122077A8 +:200EA000E13A0420FE03D20816FE02D26614780F0F7CDAC70ECD2F10210A2046B8D2880D39 +:200EC000211B2077C3970DCD391021092046B8DA880DC3C00E3E01C3960EC3940E3E01210F +:200EE0002959C3990E3E0121B9E9C3990EAFC3960EC3940EC3940E3A0420FE01CA0F0F3A3B +:200F00001920FE08CA0F0F3E01212949C3990E3E01212962C3990E3A0420FE01CA2F0F3A7A +:200F20001920FE09CA2F0F3E0121E9C9C3990E3E0121B1E9C3990E3E0421C980220B20216F +:200F4000122077E13A0420FE03D24416FE02D2A21478FE017DCA6A0FCD3910210C2046B85C +:200F6000DA880D211A2077C3970DCD2F10210B2046B8D2880DC3630FAF21C998C33C0F3E5A +:200F800002C3390FAF219968C33C0FC3840F3E04216950C33C0FAFC3900F3E02C3900FAF83 +:200FA000215138C33C0FC39F0F3E04213918C33C0F2140207EFE05D2A90FAFC3AB0F21402D +:200FC000207EFE05D2CA0FC3BA0F3E02C3AB0F8E10BF10E110031110110D111711B510BC22 +:200FE000100A11331148114F1156116B117211821189119011A011A711B711BE11C511942B +:201000000ED50EDA0EDD0EED0EF10EF40EF70E170FE50E370F780F7F0F840F8B0F8E0F9637 +:201020000F9A0F9F0FA60FA90FB10FBE0FCA0F213F20463C05C23310C9213F20463D05C2D8 +:201040003D10C9214020C33210214020C33C10214120C33210214120C33C103AE420A7C89F +:20106000CD7A10E6F0C26B10373FC9060007DA751004C36D103E018037C9DB02E604C2844B +:2010800010DB01C93ADB200FDB01D0DB00C9E1CD95102E38F77CFE80D2A810FE5C2661D022 +:2010A000FE402649D02629C9FEBD26B0D8FEE026E9D026C9C9E1CD95102E18F7C3B510E1C4 +:2010C000CDC6102E50F77CFEA8DAD410FED826E9D026B1C9FE782689D0FE502661D02629DA +:2010E000C9E1CDE8102E68F77CFEA8D2FB10FE482629D8FE782659D82689C9FED826E9D08E +:2011000026B9C9E1CDE8102E80F7C30311C31011E1CDE8102E98F73A0420FE01C22C112141 +:2011200018207EFE01C22C11E1C3880DE1CDE8102EC8F7E1CD3A112629F77DFEB82EC8D0F7 +:20114000FE922E98D02E80C9E1CD3A112689F7E1CD3A1126E9F7E1CD5D112659F77DFE7BCC +:201160002E68D8FE902E80D82E98C9E1CD5D1126B9F7E1CD79112629F77DFE642E50D82E8B +:2011800068C9E1CD79112689F7E1CD791126E9F7E1CD97112661F77DFE4B2E38D82E50C9E3 +:2011A000E1CD971126B1F7E1CDAE112629F77DFE302E18D82E38C9E1CDAE112649F7E1CDDF +:2011C000AE1126C9F7E1CDAE1126E9F73A0420FE03D29815FE02D2E413221A202118207E1D +:2011E0002B77470FDA970D2E1E36003A1F20A778CA03120F0F218841DAFD112EF8221C200C +:20120000C3970D0F0F215041DAFD112EC0C3FD11211F20AFBEC83A1920211B20FE08CA2F8D +:2012200012FE09C07EFEB8D0210D2034C386007EFE5BD8C32812FE07C021E4207EA7C24B3E +:20124000122E187EFE013602CA5212CD5B10D0FE01C03A1F20FE02DA5E12E1C3880DE12A85 +:201260001A20CD580D47CD7E0CD2880D3A1F200F78D28312212220BE2E263600CA880D7715 +:20128000C3861232222021010422202021D042221C20EB2A1A20C3CC0D212020AFBEC02EBF +:2012A000E4BEC82E23BEC8CD7A10E608C8214D217EA7C82E40AFBEC0DF2E42347EFE05DAEB +:2012C000C5123606C92140213601C38600214021AFBEC8CDD81FCDBF0D21A11D2245212194 +:2012E000EB20CDF912CD0D17214021360021072036002E133600C32917E5347EFE0BDA04EC +:20130000133E01772A45213DCA1113232323C307135E2356237EEB220E20321720CD5C17A7 +:20132000D306E1DAF912C9214021AFBEC823347EFE14D8360021A01D22E220DF2E43CD4436 +:2013400013C366017E23A7C251137EA7C25113E1C9EB2AE2200E02373E99CE0096EB8627BC +:2013600077EB2B1B0DC25813C93A2720A7C8CDC1132A2C203A2920CD380E322B202128203F +:201380007EA7CA891335C3B713CD0B1D2119207E2E2BBE213120CA451436003A29200F2A95 +:2013A0002C20D2CE13CD1415322A20CDD61419CD61037EA7CADA132A2C20E5212920C33621 +:2013C0000D2A2E20EB2A2C20010C02C3F30ACDE514322A20CDF214C3AE132A2C20E53A2BFF +:2013E00020C3100D222C20212A207E2B770FDA01142E3036000F213042DAFE132E60222EF7 +:2014000020CD44177EFE062128203608DA14143606C31414C3A753347E0FD223142A2E2033 +:20142000C33014213020CD37142A2E2019222E20EB2A2C20C3190B7E0F36FF111800D036E2 +:201440000011E8FFC97EA7C2B71336FF3A29200F2A2C20DA6014CD1415212A2077C3E713FA +:20146000CDE514C359143A29200F0F7CDA8114CD4310210A2046B8D28C14212D2077C31453 +:2014800014CD491021092046B8D27A143A1220A7C299142A2C20CDE514322920322A20C3F2 +:2014A000DA1378FE017DCABB14CD4910210C2046B8DAC614212C2077C31414CD4310210B72 +:2014C0002046B8DAB4143A1220A7C299142A2C20CD1415C39914EB11080819FE0211000CAC +:2014E000C01100F4C945EB2A1A207DB83E01D03E03C9EB11080819FE0111F4FFC0110C0077 +:20150000C97E0FDA0D150F3E02D83E04C90F3E03D83E01C944EB3A1B20B83E04D03E02C9A0 +:201520003A3320A7C8CD78152A38203A3520CD380E3237202134207EA7CA401535C36E1574 +:20154000CDCD1C2119207E2E37BE213D20CAE71536003A35200F2A3820D28215CD141532AF +:201560003620CDD61419CD61037EA7CA8E152A3820E5213520C3360D2A3A20EB2A3820C3EB +:20158000C813CDE514323620CDF214C365152A3820E53A3720C3100D2238202136207E2BA0 +:2015A000770FDAB5152E3C36000F213042DAB2152E60223A202134203A4120FE06360AC2FE +:2015C000C4153605C3CB53347E0FD2D3152A3A20C3E015213C20CD37142A3A2019223A20B1 +:2015E000EB2A3820C3190B7EA7C26E1536FF3A35200F2A3820DA0216CD141521362077C33F +:201600009B15CDE514C3FB153A35200F0F7CDA2316CD4310210A2046B8D22E1621392077D5 +:20162000C3C415CD491021092046B8D21C163A1220A7C23B162A3820CDE51432352032363F +:2016400020C38E1578FE017DCA5D16CD4910210C2046B8DA681621382077C3C415CD43105E +:20166000210B2046B8DA56163A1220A7C23B162A3820CD1415C33B16210D20AFBEC836006F +:20168000CD0C4ECD800BDB000F0FD44A523E03CDB601CD4817D3063A2620A7CAA716DF2EDD +:2016A000003A2620CD4E17AFCD940C21BF1D22452121EB20CDF9122A1A20CD6103221020EC +:2016C0002A1C20EB2A1020CD7317CD2F173A2620A7CAD716CD2F17210000221F202221201F +:2016E0002126203600CDD81FCD4417DB02E608CA07177EFE02DA0D1721152036FFCD44177F +:2017000036002334C3364E7EFE08C3F5162A1C20EB2A0E20221A20CD4453CD931721DF4C77 +:201720001E4F231D7EBBC2AA49CD8C00C3364ECD441734CDCA0ACD44172B7E32C120CD962A +:2017400002C39100DF2E25C9DF2E003A22203DCA591723232323C34E17AF77C9CD6103065E +:20176000057EA7C271171180001905C26117373FC937C9CDB417D306C5E5AF772305C27B27 +:2017800017CD7E4BE101200009C10DC276173E04C3AC01CDB417D306C5E51A77231305C219 +:2017A0009A17CD7E4BE101200009C10DC296173E04C3AC01E53E04CDA301E1010E02C90F86 +:2017C0000B001804111B1E1B1F1B06000C041B0E150411214420AFBEC8CD861921432046EA +:2017E0002A4A20E57E2A45200FDA7E180FDA98180FDAA418CD7018E123BED23518EB22451E +:2018000020C39253347E0FD210182A4720C31D18214920CD27182A472019224720EB2A4599 +:2018200020C39E53C31C0B7E0F36FF111000D0360011F0FFC9232323E57E47FEFFC24B1803 +:201840001145202145400609EFE1C9224A20E605C26718780F21492036000F219042DA6485 +:201860001821B042224720E123235E2356C3FD1778A7110002CA7A181603197CEBC9CD8A98 +:2018800018E123BED23518C3FD1778A7110200CA94181E03197DEBC9CDAA18E123BEDA3505 +:2018A00018C3FD17CDB818C39B1878A71100FECAB41816FD197CEBC978A711FEFFCAC21835 +:2018C0001EFD197DEBC9215020AFBEC801AE4C16390A15BAC2AA49CD7919214320462A565C +:2018E00020E57E2A51200FDA5B190FDA67190FDA7319CD7018E123BED22219EB225120C32A +:201900006D53347E0FD20E192A5320C31B19215520CD27182A532019225320EB2A5120C383 +:201920002118232323E57E47FEFFC23619115120215140C34618225620E605C25219780FC1 +:2019400021552036000F219042DA4F1921B042225320E123235E2356C3FB18CD8A18E12388 +:20196000BED22219C3FB18CDAA18E123BEDA2219C3FB18CDB818C36A192A5320EB2A512084 +:20198000010802C3F30A2A4720EB2A4520C3801921A020AFBEC801EE402EF0032B560ABA6A +:2019A000C2A819D306C3A3192AA5203AA4203C32A420E61FC2BE197DFE82CCED192322A5D6 +:2019C000207E0FDA2D1A0FDA4A1A21000022A72021A220AFBEC2F919CD141A21A720CDCF3F +:2019E0001A21A920C3C51A21A920C3691A216F1AC921A320347EE602C9CDF119CA081ACDC7 +:201A0000E71921D543C30E1ACDE71921C84322AB20C3DB19CDF119CA231ACDE71921BB433B +:201A2000C3291ACDE71921AE4322AB20C93AAA20FEE0D2CA1921A22036013A4220A72100F6 +:201A400003C2CD19210002C3CD193AAA20FE30DACA19AF32A2203A4220A72100FDC2CD1974 +:201A60002100FEC3CD1921B920CDDB1AC3F30A010101020202010101020201010202020109 +:201A800001020221B020AFBEC82AB5203AB4203C32B420E60FC29F1A7DFE11CCCB1A2322DA +:201AA000B5207E0FDAED1A0FDA0A1B21000022B72021B220AFBEC2471BCD2E1B21B720CD5C +:201AC000CF1A21B920CDDB1AC3325421E243C94E23462379867723788677C9E523235E23AC +:201AE000562346234EE1D55E2356EBD1C93ABA20FEE0D2AB1A21B22036013A4220A721008D +:201B000002CAAE1A210003C3AE1A3ABA20FE30DAAB1AAF32B2203A4220A72100FECAAE1AFA +:201B20002100FDC3AE1A21B320347EE602C9CD261BCA3D1BCD661A21BB43C3431BCD661A9B +:201B400021AE4322BB20C9CD261BCA561BCD661A21D543C35C1BCD661A21C84322BB20C36B +:201B6000BC1A211520AFBEC83600CD0C4ECD86000600CDB81CCD9504DF2E00EB0620CDA4B8 +:201B800004E1CD9100210132012001CDE507CDD900DF2E4BE55E2356EB22C120CD9602CDF9 +:201BA000D900211030012001CDE507CDD900E1E52E435E2356EB22C120CD9602CD9100E1CA +:201BC0002E40EB2140410610EFCDC70BFE04D2121CFE03D2FE1BCD4E1CCD7449CDA74FCD27 +:201BE000F81B210F2ECD704BCDEE4AFFCD7B00CD5D1CCD9100C39605CDF61EC30C4ECD4E85 +:201C00001CCD7449CD464BCD82540000CDF81BC3EB1BF5CD2E47CD8C00F1D603FE08DA2317 +:201C20001C3E07210C27F511461CCD734BF13DC2261CCD4E1CCD7749CD464BCD6554000022 +:201C4000CDF81BC3EB1B0CD3FCDE09040000CD8C00DB000F0FD473523E09C3B601FFCDC7D6 +:201C60000BFE0ADA681C3E092E247747C5210D2D3E01CDD80A210D3011881C0606E7C1784F +:201C8000C620210D33C309032A1B1D1B202021232070CDC70BFE04D2B81CFE02D2BF1CFEAB +:201CA00001D2C61C212720702E50702EB070DF2E497026202E2370C9CDBF1C2E3370C9CDB6 +:201CC000C61C2E4470C9CDA41C2EA070C9212B207E2E37BECADC1C2E4D3600C92E297E2E97 +:201CE00035BEC2D71C2E4D7EA7C03601CDF61C2E3677E1C39B153A35200FDA041D0F3E04AD +:201D0000D83E02C90F3E01D83E03C9212B207EFE14CA171DFE15C02E297EFE03C03A1A20DB +:201D2000FE74D0E1C3B713CD2D1DC3401D7C325F20C60D325B207D326120C610325D20C991 +:201D40003A5E20215B20BED03A5F202BBED03A6020215D20BED268103A61202BBED26810E1 +:201D600037C93AE420A7C02129217E23F53DCA761D2323C36D1D7EA7CA801D35F1C3951D69 +:201D8000F13CFE0BDA951D112A21212A410614EF3E01212A21322921237EE1E1C3D00C0067 +:201DA0005098E80168280368E80398580338600180B803C8880380280150880118C801509F +:201DC000280198B80368B80180580398280180E80150B003685801C8E8039888010C1A049F +:201DE0000D041106183AE720FE093E80D2A301C3AC016F131A67131AC93AE420A7C821B040 +:201E000020AFBEC82E62BECA1D1E352EFFAFBE3E10CA181E35C3BF013610C3B6013E10CD6A +:201E2000BF01214F21AFBECA2C1E35C936FF2162203630C9CD7000CD9504CD9F04CDA9043E +:201E4000FFCD96000E290668262E04786F5E3E473CBBC26D1E16391459EB7EFE80C26D1E25 +:201E60000EED142306200C3E3602C3751E261F2EEF242D3698CD9100CDD51EC31057211038 +:201E800030114F4C0606E7CD7B01CDD900CDA300CDC407FF21E02034CD944BCD4701CD5A40 +:201EA00007CD91000601CD8E1C211320AFBEC2B61ED306C3A91E0600CDB81CCD9100CDBAF9 +:201EC0004721E0203600CD9504C39F04CD7E4B011002C37E01C30056115D4CCDCC1E2114EE +:201EE0002FCDCC1E211432CDCC1E211435CDCC1E211438C3CC1E3E01CDBF013E05CD730B49 +:201F00003E0FCDBF012100002222222222213E80C3B60121132C111F1F060CE7C3C4070885 +:201F20000D120411131B1B020E080D00DF2E49AFBEC823BECA391F35C9362021571F22E282 +:201F400020DF2E4BCD4413DF2E4B22D42021013222D620C3C2020010DB02E680C021072029 +:201F6000AFBEC836002A1A207C325E20C60F325A207D326020C610325C2021A020AFBEC222 +:201F8000BE1F2AB920CD271DDAC71F2A2C20CD271DDAC71F213320AFBECAA51F2A3820CD8B +:201FA000271DDAC71F2A5120CD271DDAC71F214420AFBEC82A4520CD271DDAC71FC92AA9FB +:201FC00020CD271DD2821F21132034C9CD47013EC0CD730BFFC35300CDF81BCD800BC30C92 +:201FE0004EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/lupinIII-2.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/lupinIII-2.hex new file mode 100644 index 00000000..659a3a46 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/lupinIII-2.hex @@ -0,0 +1,194 @@ +:020000040000FA +:2000000000000000000000000000000000000000000000000000000404036898C0410000D4 +:20002000000000000000000000040402503860420000000000020207C8D030420000000671 +:2000400004040000008029B04200EC42000000000018499042005D430000000000000000FC +:200060000000000000000000FF689800000210000000000168380000020B000000FF58E486 +:200080000000021800000000FED8D8000002200000FE00000000000000FF90D80000021BF4 +:2000A00000000000006F1A00005488AE43010D000000000000E24300003C80AE43010D00FC +:2000C0000000000000000000000000000000162A16361E3400000000C52A01000000000052 +:2000E000000000000000000000000000978800700000020201000000000001000404010062 +:2001000001001B2601001B2901001B2C01001B2F01001B3301001B3601001B3901001B3C77 +:20012000FF000000010000030001030407010B040B010C0202011402120310040603200315 +:2001400000040020000000000000FF400000000020002040C128FFEDE17FFF7FC013E0094D +:2001600078003E001C000C0006000200810387401829E0EDE07FF07F8D13C311F000780096 +:200180003C001C001C001C0000408028C1EDC77FF87FF013B80B45043B0804080304010412 +:2001A0000603F80000400029C0EDE07FF17FFF1171113F060808041004100408880770003F +:2001C0001C001C001C003C007800F000C3111D13F07FE07FE0ED18298740810302000600F4 +:2001E0000C001C003E007800E009C013FF7FE17FFFEDC12820402000700088070408041013 +:20020000041008083F067111FF11F17FE07FC0ED00290040F80006030104030404087B0862 +:200220004504B80BF013F87FC77FC1ED802800400008000400020001C0404050F1F5FFD701 +:20024000FFFFF0FDF00000000000000000FE000181418750ECF5F8DFF0FFF8FD2D01C70199 +:20026000C7012D01F8FDF0FFF8DFECF587508141000100FE000000000000F001F0FDFFFF78 +:20028000FFD7F1F54050C040000100020004000800400050D1FDDFDFDFFFD0FD000000003C +:2002A00021404750DCFDD0DFD8FFDDFD9700600000000000D0FDDFFFDFDFD1FD005000404F +:2002C00060009700DDFDD8FFD0DFDCFD47502140000C0003001981048702F89BE05FF9FFF6 +:2002E0008777E029F0003C000F000700085980290469805908B96859018168B908E980B916 +:2003000001C980E90288C8E90499C8890259988904699859022968590451682908605029F4 +:200320000439506108E93861041938E802C918E8013918C802B138C8015138B108E850B144 +:20034000016950E902B868E9019968B9028898B901C998890229C8890481C829FF0229183A +:20036000490139182908B13829015138B1022950B10169502908B96829019968B902599855 +:20038000B90469985908E96859045168E902B151E9043950B108E938B1041938E902C918C8 +:2003A000E9013918C9024938C904193849FF083868B1123C38383B1C1E2310045C341808DD +:2003C0001C1F1818191F100810231E1C3B38383C12B168380808101F1918181F1C08183494 +:2003E0005C0402020201010100020200020101000102020201010101020201020001010177 +:20040000020202020001010202020201010102000101219520AFBEC8219720347EE602F551 +:20042000217628010601CDE507F1216244CC3F44229C20219A20CD0B49219820C3CF1A21B5 +:20044000162811DD48CD7B01219844C92A9A20011B02CD6103CDE507119520219540060B60 +:20046000EFC9800081408F50D855D0FFD9FF07FDE000100010000800040008003000200068 +:2004800010002000300050289178D77DF87FE01FF917C70300000000000070408150DF5D1A +:2004A000D1FFDFFF00FDC0002000100010000800080010002000200050005000A028407910 +:2004C000C17DFF7FE11FFF17C00300000000110C451AFEFFCAE644CDF21DD511FC44CD1E2D +:2004E0000AD113C3D1441161451AFEFFC8CDF21DD5110445CD1E0AD113C3E944FFFFFFFFD0 +:20050000FFFFFFFFAA00AA00AA00AA0001241C02240E023304023804023D0303240E03339E +:2005200004033804033D03042406042D05043304043804043D03052604052D05053304056B +:200540003804053D03062604062D05063304063804063D03072D05073402073804082D04FB +:20056000FF032504042702052702042E03062E03072E02033501043402053402023A010463 +:200580003901063A01FF210726119245012002C37E0180FF81FF8380FFA08FA095BEA4A0DF +:2005A000C4A0A480948E8C9484A48C94948EA480C4A2A4BE94A28C8084A08CA094BEA4A0F3 +:2005C000C4A0A480959C8FA2FFA2839C818080FF80FF218420AFBEC83A8A20FE68CC6546B7 +:2005E000218620347EE601F5113F46CD2446F1216C46CC0446228B20218920CD0B4921879F +:2006000020C3CF1ACD0B4621A846C9113F461AFEFFC8CDF21DD511C040CD1E0AD113C30E37 +:2006200046114C461AFEFFC8CDF21DD5113746CD1E0AD113C3244610381000000000001045 +:200640002A010C3101173101153E01FF0B29011A2801132B01193A010F32011237010E38B8 +:20066000010A3A01FF210000228720C90010001070108A1009110912091209120912FF378C +:20068000093FED27EB03FF01F100F000E000E000E000C000C00180018001C00120230012F6 +:2006A000000C0008000000000000000070008A0009010902090209020902FF27093FED3764 +:2006C000EB13FF11F110F010E010E010E010C010C01180118001C001200300020004000C92 +:2006E0000002000100000000218F20AFBEC823BEC2FA4634CD1247CD0647CD1247CD06475B +:20070000219120CDCF1A2A9320112047010702C31C0B2A932001080309CD61032336AAC919 +:2007200080034104B709FC7DB70941048003FFCD7000115A471AFEFFC8CD5247D5116A4766 +:20074000F5011005D5CD7E01D1F13DC24047D1C335476F131A67131A13C90D25010D3D018B +:20076000162B01153401143B01FF0100F801000300FC07000230FE3F0002087EFE0007049E +:200780009FEF031F82E7F70FFFFFF7FB3F76EEFFFFFFCEF7FFFFFFFFFF67FF3F1E80CFE0F8 +:2007A0000F07009FFF0301003FFF000300FE3F000200FC07000100F80100CD2E473AE42084 +:2007C000A7CAD047DB000F0FD467523E01CDB60111CA481AFEFFCAE747CD5247D511FC448A +:2007E000CD1E0AD1C3D34721162811DD48CD7B01211525113E48011001CD7E0121172411BB +:200800001948011801CD7E01219520343A9B20FE41D306DA3148C30C48FFFFC1D7EFFFC14B +:20082000DDC1FFC1FDFDFFC1FFE3DDDDFFC1D5DDFFCD4C44CD9100CDF81BFFC37B00FF00BC +:2008400000FF0000FF0000FF0000FF0000FFCD8600FFCD70003E08CDA301210D2F013001C8 +:200860003E01CDE607210F2F0130013E80CDE607210D2F1E073EFFE5010103CDE607E10131 +:200880000001091DC2754811D042216C88CDCC0DCD91003E08CDAC01FFC37B003AE420A794 +:2008A000C8216320AFBECAC44823BECAB448353E01C3AC013A3F200F3608DABF48360A3EB9 +:2008C00001C3A301233600C3AF48122404132404142404152404162404172403FF70202084 +:2008E00070F8F8F870217A20AFBEC8217B20347EE601211449CC0749228020217E20CD0BF8 +:2009000049217C20C3CF1A214449C9CDDB1ACD6103C37E0130003E03FD01FB01F701FE0117 +:20092000F001F801F881F88388477840F840F040B040BE40F77FFB40FDFFFE800080000051 +:200940000000000030003E03F701FB03FD03FE03F003F803F881F88388477840F840F0405E +:20096000B040BE40FD7FFB40F7FFFE80088004800A000000CD2E47210D2711F149010B0258 +:20098000CD7E01CDD90021488822B920217A20342EB0340EF06913032B2B4EAFB9CAB2492A +:2009A0003E383D470578B9CAB249D306CD8600C3AA493A7F20D306FE90DABF49C3B249215F +:2009C0007A40117A20060AEFCDD900216520342E6F343A6520A7D306C2D2493A6F20A7D303 +:2009E00006C2D249CDD90011B02021B0400610EFC900000000101033707DE770BF78F7B732 +:200A0000A2910000010002000000201030306070E77FBF71F7B0A29000800000009013307E +:200A2000747FE771BF71F73AA21400981370747FE771BF70F730A2100008000400020004D4 +:200A400000216F20AFBEC82323347EE60221F149CC6A4A2276203A7520FE64D26E4A2174EE +:200A600020CD0B49217220C3CF1A21074AC9116F20216F40060BEFC921CE4AC9216520AF0B +:200A8000BEC823347EE60221AE4AC4784A226B203A6A20FE70DAA44A216920CD0B4921677A +:200AA00020C3CF1A116520216540060AEFC920002040C128FFEDE17FFF7FC013E0097800DF +:200AC0003E001C000C000600020000000000810387401829E0EDE07FF07F8D13C311F0001D +:200AE00078003C001C001C001C000000000021AD2C010702111D4AE5CD7E013E08CD730BB0 +:200B0000E1010B02CD7E01CD7E4B210D2E11264BCDCF1ECD834B3E40CDA301CD91003E4006 +:200B2000CDAC01C3C40701000F0018001C00460027080F05BF0DFE0FB807100219020E000D +:200B4000000000000000CDD900210F2CCD704B210F2ECD704BCD7E4B21102BCD704B21107A +:200B60002FCD704BCD7E4B21112ACD704B21113011764BC37B0100183C1E0F1E3C183E0E92 +:200B8000C3730B210F2E118C4BC3734B10380C0601163C18FFDF2E21AFBEC036013AE420B9 +:200BA000A7CAA94B3E02CDA301CD7000CDCE44CD8645CD2146013027111700C52E500693DB +:200BC000E11923EB1A04B8C2E84B1E062E001D262816001923233AB2454F7EB9C2E84B0163 +:200BE00048290AFEA2CC2A4CCD9100218420343A8A20FE69DAFC4BD306C3EF4B3AE420A71A +:200C0000CA0F4CDB000F0FD45B523E05CDB6012A892001F00809229320218F20343A9320D3 +:200C2000D306FE4ADA374CC31D4CE60F0620B01EEE26201C5412C92184401184200611EF02 +:200C4000CDF81B3E02CDAC01CD9100FFC37B000B140F080D1B82FE82FE82FE82000C0006ED +:200C6000000E80FCFFF07FC0FF008000400080FFFFFE7FFCFF7880F000C003000F0C00063B +:200C8000001C40F87FF03FC07F004000200040C07FF03FF87F1C4006060C09000600001BF0 +:200CA000000E100E380E380E380E381E381C3838007800F000E0018067007F00001B000E44 +:200CC0006C0E386E3BCE39CE39CE39CE39CE39CE39CE39CE396E3B0E380E6C1B00001B0CD6 +:200CE0004EFE7FFF3FFF7F0F4E0E0ECE7FEE7F6E0E6E0EEE7FCE7F0E0E1E0E381BFEFFCA26 +:200D0000524DFEFECA474D21F5203680237723EB21824D874F0600097E23666FC32D4D3A84 +:200D2000F520A7C821F72035C0EB2AF8207EA7CA524DFEFFCA414D12237ED3002322F8200F +:200D4000C93AF620F2074D3E0132F7203E8032F520C93EFFD300AF32F52021F3207E3D7772 +:200D6000C02B7E2377237EA7C26E4DC31F4D3AF020CDFD4CAF32F420C9AF32F1203C32F40A +:200D800020C99B4E074F4B4FA14F005380530054005500563131CDC70BFE0BD2DC4DFE0A6F +:200DA000CAE54DFE08D2EB4DFE07CAF14DFE06CAF74DFE05CAFD4DFE04CA064EFE03CAFD09 +:200DC0004DFE02CACB4D0000C3FD4D01040411000021402070237123722373C90106061126 +:200DE0000101C3D14D010605C3DF4D010505C3DF4D010405C3DF4D010404C3DF4D01040421 +:200E0000110001C3D14D010404C3DF4D21000022FC2022222122222222FA20212A4ECD39E2 +:200E20004EC35A4D02000505010003000101010001000303010021F04011F0200606EFC9A9 +:200E40003AE420A7C83A1F20A7C8213320AFBEC2824E3A4020FE05D4754E00000000000056 +:200E6000000000C35A4D21FA20AFBEC2634E3421FA40C3394E21FB20AFBEC03421244EC321 +:200E8000394E2E417EFE05DA524E2EFC7EA7C2634E3421304ECD394EC3634E0FDD01FF0711 +:200EA000D701FF07DD01FF0FDD01FF05EB01FF01E901FF07E601FF17E101FF07D701FF0FDF +:200EC000DD01FF0FE101FF07E101FF07E101FF07D901FF07D201FF07CC01FF07D201FF0709 +:200EE000D701FF07D701FF05DD01FF01D701FF05DD01FF01D701FF07DD01FF07EB01FF17DC +:200F0000E601FF08FFFF0003DD01FF03D701FF03DD01FF03D701FF02DD01FF01D702DD01DA +:200F2000FF01E602EB01FF01E903E601FF03D201FF03D901FF03D201FF03D901FF03D701CE +:200F4000FF03CC01FF04D204FFFF0001D701FF01DD01D701FF01DD0AE104E402DD09D701EC +:200F6000FF01D701FF01DD01D701FF01DD0AE104E402DD09D701FF01E101FF01E101EB01C3 +:200F8000FF0BE901E101FF02E102E40BE601E101FF01E101EB01FF0BE904E402DD0AE1FF6D +:200FA0000001FF0000000021132811B14F060FE7C90111080D061B0C041B0C0E11041B0939 +:200FC0003233424539380D0A3A313034384142303043414234343833353345303143334155 +:200FE000433031334133463230304633363038444139330D0A3A313034384242303042463C +:201000000131500AFEFFC86F030A67030A5F030A57030A03C5CD1E50C1C303500000D5E52B +:2010200077231DC22050E101800009D115C21E50C900C420380215C701140615D301140665 +:2010400018C701140618D30114061EC901140600C7020A0400D7020C040FCD0402040FCE0B +:201060000110040FD604020412CE01100400CC020A0303CB02060303D602060316D50102F1 +:201080000317D401100302C401140102D601140105C702040105CB02060106CE01100105ED +:2010A000D602060105DB02040109C5010E0109CE01100109D8010E010CC70114010CD301E9 +:2010C00014010FC5010C010FD9010C0112C701080112D901080116C901020117C801100177 +:2010E0001ED3010E0100D1020C0000DD02060010CE01100003C418020003DF18020010CE81 +:2011000001100016C702020016C801020016CA010C0016D002020016D302020016D401024B +:201120000016D6010C0016DC0202001BC40504001FC40138001DC60206001BC80202001DCD +:20114000C9012E001BCB0202001BCE0202001BD10204001BD50202001BD80202001DDA03E9 +:201160000C001BDB0202001BDE050400FF0000018B510AFEFFC86F030A67030A5F030A5709 +:20118000030A03C5CD1E50C1C3725100C420380216C801020611CA01020610CB0102060F1C +:2011A000CC0102060FCE01020610CF01020611D001020600C40938050DC7020E0410D001CF +:2011C0000E0408C60108030FC503040318CB03040317D403040316DB0304030FDD03040372 +:2011E00007C60108010DC50204010DDD02040114C9030A0117CB01040114CF03180114DB8D +:201200000204011BC405380103C501040203C703040204CE01060206CE02040206D0010278 +:201220000204D402040203D503020202DA01020204D901020206DA0102020BD2021C001238 +:20124000C406060012C7050200FF215552CD394E21222134C9040005050100216152C34D6F +:2012600052050002020100216D52C34D52060007070100217952C34D5207000D0D01003A11 +:20128000E420A7C8212221AFBEC8CD5A4D3AF020C3B60105CCF452FE05CCF752FE06CCFA11 +:2012A00052FE07CCFD52212222AFBECAB452353E80C3BF0123BECABF52353E80C3B6017308 +:2012C0002B73C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E04C91E04C91E04C91E03C957 +:2013000003EB01FF07E701FFFF00FFFF0FDD01FFE5D53A1A20E607FE02DA2253110304C3C3 +:2013200025531102042A1A20CD33533E02CD1E50D1E1C97DE607CD61030100A009C9CD1086 +:2013400053C3CC0DCD1053C36103E5D53AA022E607FE02DA5C53110303C35F531102032A4F +:20136000A022CD33533E03CD1E50D1E1C92A512022A022215820C30219FFFFFFFFFFFFFF72 +:2013800002F202F002EE02EC02EB02E902E602FFFF002A452022A022214C20C30418CD4AD3 +:2013A00053010802C31C0B3A2C20E607FE02DAB753110304C3BA531102042A2C20CD3353C6 +:2013C0003E00CD1E50213220C317143A3820E607FE02DADB53110304C3DE531102042A3827 +:2013E00020CD33533E00CD1E50213E20C3C715FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:2014000002DD02D704E108D702DD02D704E108D704DD04E602E401E601E404E102DD02D7BA +:2014200004E108D7FF0008E304E104EC04EB0CE9FF00E5D5C5CD33531102053E04CD1E50DF +:20144000C1D1E1C31C0BFFFFFFCD7B00C3C4070300110B080D061B081B0B0E15041B180E71 +:201460001409000000211328114F540613E73EB0C3730B0000000C1402071B01041313049D +:201480001109211328117654060CC36D54FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:2015000001C101E101E601E101C201E101CC01E601C901E601E401E101DF01E401EB01E4F7 +:2015200001E601E101E601E401E601E101EB01EA01D201E101E901E101EB01E901E601E453 +:2015400001E601E901E601E401E101E601EB01E601E401E601E401E101DF01E401EB01DF2E +:2015600001E101D701E601E101EB01E601E401D701C201CC01D701DF08E1FF00FFFFFFFF2C +:20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:20160000DB02E610CA105621142CC3D81E00000021142C114056CDCC1E21142FCDCC1E21B2 +:201620001432CDCC1E211435CDCC1E211438CDCC1E211132CD7E4B011802C37E0100000011 +:20164000008000C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF070007000F001F003F00E1 +:20166000008000C0FCFFFEFFFEFF0F0007000F00FFFFFFFFFFFFFEFFFEFFFCFFF8FFE0FF4B +:20168000008000C0FFFFFFFFFFFFFFFFFFE1FFE1FFF1FFFFC0FFC0FFC07F803F001F000EBB +:2016A0000000008000C000E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000001C +:2016C000008000C0FFFFFFFFFFFF80FFC0FFF0FFFCFFFF3FFF0FFF03FF01FFFFFFFFFFFF60 +:2016E00003C003C0FFFFFFFFFFFFFFFF03C003C003C003C0FFFFFFFFFFFFFFFF03C003C0E2 +:2017000003C003C0FFFFFFFFFFFFFFFF03C003C0DB02E610CA8A1ECD9100C37E1E000000C3 +:20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/p2clouds.f2 b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/p2clouds.f2 new file mode 100644 index 00000000..1a60e335 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/p2clouds.f2 differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantom2.e b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantom2.e new file mode 100644 index 00000000..8fd923b0 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantom2.e differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantom2.g b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantom2.g new file mode 100644 index 00000000..3a828704 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantom2.g differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantom2.h b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantom2.h new file mode 100644 index 00000000..990008d3 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantom2.h differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantomII.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantomII.hex new file mode 100644 index 00000000..a9feed9b --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantomII.hex @@ -0,0 +1,258 @@ +:020000040000FA +:200000003E00322B22C3DB023E01322A22C315003E02322A22F3F1CD2800C93E01322B22D0 +:20002000C338003E02C31D003A2B22FE00CA3C00473A2A22B8CA3C00FBC338003E00322BFE +:2000400022C9856FD024C90721002016005F190707075FE60F577BE6F05F19C9D1E17E4765 +:2000600023E5D5E6E0CA6C003A02204778320220CD4700220020C9CD5C00AF323B223A3B3D +:2000800022A7CA91003E0DCDD30223462B2B702B773E0CCDD3022B4690572A00207E21DB76 +:2000A0001D23CD42005EEB222522D5AF57802DC2AD005FEBD113EB4E2346C5E119EB3E0F81 +:2000C000CDD302320520E610CACB00EB2220223A3B22FE01CAFE00AF3224223A05200F3228 +:2000E0000520D2ED000604CD5601CD5C013E0ACDD3022A002077213B223601C37E00AF3242 +:200100003B223A05200F3205203A0520E610C03A05200FD21901C33701210000392227228E +:200120002A002023F9C1D1E109444DE1193B3B3B3BE5C52A2722F90608CD5601C245013ADC +:200140000520E60647CD5C013A2422B7C83E0FCDD302F68077C93A0520E608C8AFD3022AB6 +:20016000002023237EE607D3017821B001CDCB02EB7807072A25228521B801CD42006E2612 +:200180000019545D2A25227CA7CA9101D525C28C01CDAE023E0BCDD3028721D801CDCB02D9 +:2001A00019EB2A25223E20954F06002A2022EBC9000018026302630238302820181008EEB0 +:2001C0003F362D241B1209003F362D241B1209003F362D241B12090000002000400060006B +:2001E0008000A000C000E00000012001400160018001A001C001E0010002200240026002EF +:200200008002A002C002E00200032003400360038003A003C003E0031AD302DB03AE771379 +:20022000231AD302DB03AE7713231AD302DB03AE7713231AD302DB03AE7713231AD302DB59 +:2002400003AE7713231AD302DB03AE7713231AD302DB03AE771323AFD302DB03AE7709AFB1 +:20026000D302C91AD302DB03AE7713231AD302DB03AE7723231AD302DB03AE7713231AD36B +:2002800002DB03AE7713231AD302DB03AE7713231AD302DB03AE7713231AD302DB03AE77E1 +:2002A0001323AFD302DB03AE7709AFD302C93E02CDD3020F0F0FE61F5723237E0F0F0F4788 +:2002C000E6E0B25F78E61FC62457C9CD42007E23666FC92A0020CD42007EC9310024DB02A0 +:2002E000E620CA0803C36607000102030405060708090A0B0C0D0E0F100F0E0D0C0B0A0917 +:2003000008070605040302010601110000210020D304707EA8CA1B03CDD603237CFE40C2C6 +:200320001003D3042B7CFE1FCA40037EA8CA3303CDD603782F77AECA2203CDD603C32203ED +:20034000D304237CFE40CA5703782FAECA5203CDD603AF77C34003780747D20D037AB3CAE0 +:200360008603EBF91100200600210000390E10AF29DA75032F12133E1812130DC26F030522 +:20038000C26903C3BF03310024210C28E521000011E603010004AF86D304230DC29703055E +:2003A000C297033CCAB1031AE3EBC5CDEE03C1EBE3137CFE20C29303E17DFE0CCA0000D323 +:2003C00004C3BF037B914F7A984703EB36000B2B78B1C2CC03C94F7DE60179C2E303B25726 +:2003E000C3E503B35FC94848474746464545D5E5EBCD0D04CD1C04E1D113C9F51A13D5CD81 +:200400000D04CD1C0409D1F13DC8C3FB03E5213C04D641171717CD4200EBE1C93E0801E0E0 +:20042000FFF53A3D21A7CA2E041AAEC32F041A7713F1093DC2210423010001C966667E7E57 +:2004400066667E3C3E7E663E3E667E3E7E7E660606667E7E1E3E666666663E1E7E7E061E16 +:200460001E067E7E06061E1E06067E7E5C7E467606667E3C6666667E7E6666667E7E1818C4 +:2004800018187E7E1E1E1A1818187E7E4666361E0E1E36667E7E6606060606066666667E9E +:2004A0007E6642426666767E7E6E66663C7E666666667E3C06061E3E66663E1E603C7E6640 +:2004C00066667E3C6666363E66663E1E3C7E60301C067E3C1818181818187E7E3C7E6666F6 +:2004E0006666666618183C246666424244EEEEFED6D6C68266663C18183C66661818187E6C +:20050000666666667E7E0E1C38707E7E00000000000000007E7E1818181C1C187E7E067E65 +:200520007E707E7E0000003C3C0000007070707E7E767676081C3E3E3E3E3E7F790F0F0F2C +:200540000FE5CD480579E123EB2184050607F53A0E20A7CA58050608F1E60F070707CD422B +:2005600000EB1AAE77EB23E5EBD511200019D13A0E20A7C27D051AAE7711200019EBE105D6 +:20058000C26105C97E7E666666667E7E38383838383838387E7E707E7E067E7E7E7E707CC8 +:2005A0007C707E7E6666667E7E7070707E7E067E7E707E7E7E7E067E66667E7E7E7E767041 +:2005C000707070707E7E667E7E667E7E7E7E667E7E7070702109207E4F17DA0F06237EA788 +:2005E000CAF305352B3E8FB6773ABF20F60832BF20D3052109207E17D8DB01E6204779E6A0 +:2006000040CA30064FCD3006B9C823342334C9357EE60FCA29061E08BBC2F3053ABF20E615 +:20062000F732BF20D305C3F3053E7FA677C3F30521092078A7C23F063E40B677E640C93E42 +:20064000BFA677C93A0B20A7CA8406D101402611DF3FCDC403DB0247E601C26006C37F061F +:200660003A0B20D602F27F06210F20360121092F1108073E12CDFB03AF320C20C33B073E5B +:2006800001C37906DB02E601CAAC06210F203601210A2F11EF063E0ECDFB03210F20360152 +:2006A000210A2D11CD063E0DCDFB03C9210F203601210A2D11CD063E0DCDFB03210F2036C0 +:2006C00001210A2F11FD063E0BCDFB03C9544F5B53544152545B47414D4550524553535BE5 +:2006E0005C5B504C415945525B425554544F4E494E534552545B5D5B434F494E53494E53F1 +:200700004552545B434F494E494E534552545B5C5B4D4F52455B434F494E47414D455B4F08 +:20072000564552CD23003A0B20F5CDD405F1473A0B2090D304CA3B07C34C063A0C20D6017A +:2007400078FA23073A0D20E6BF320D20216307DB02E60116005F19463A0B2080320B20D15C +:20076000C3D307FFFE2BAF320B20320E20217607220620CDA1091300230000005D217221A4 +:2007800064217221005B5B6B215D21005B5B72216421005B5B5D216B21005B5B31FF23AF3B +:2007A000320920320A20320D2032BF20D30532B720CD6208CDD409CD36193ABB200F32BB23 +:2007C00020D2C707CD2300CD4406CD5108CD1308C3BA0731FF2306803A0D20B0320D20CDA4 +:2007E0006208CDD4093E0132B7203E0432BF20D3053ABB200F32BB20D2FE07CD2300CDAD00 +:200800000CCD6912CD1308CD1A14CD4A0ACD6E0BC3F107CD391BD304CDD405CDDC1BCDD47C +:2008200005D304CDC10DCDD405D304CDFC10CDBA12CD9A1BCD2115CD4308CDD405CD5012E0 +:20084000D304C9A73ABA2017D24D08EE2B32BA20C9210F203601210A2B111A073E09CDFBF3 +:2008600003C9217E082206201157213A0D2017DA7508115521010F20CDC403CDA10900009D +:2008800006122001200A0ACDA1090100120000C800C800000000000410100010050C0CCDB3 +:2008A000A10902001220004B00C8000400FD002000100010050C0CCDA109030012200096A7 +:2008C00000C800FC00FD002000100010050C0CCDA1090400120000000000000000F2000873 +:2008E00000040004050000CDA1090500120000000000000000F2000800040004050000CD89 +:20090000A1090600120000000000000000F2000800040004050000CDA109070B070001007D +:2009200001040404CDA109080B0700010001040404CDA10909080790000001000004CDA179 +:20094000090A000B010101010000555500FF00CDA10911020400FE0002CDA1091200101C89 +:20096000008000A20000000000240008000805DB02E6060707218009CD42007E32AA20C949 +:20098000453020302130212060402540264026257560452515251530907050201030203587 +:2009A00056CDC909CD4700CDC909CD4200EBCDC909474FCDC909121305C2B309D12A0620F8 +:2009C000E5232323220620E1E9E52A06207E23220620E1C911FF3F01FF23CDC403211A248A +:2009E0003AAA204FCD3C052103243A56214FCD3C052112243A57214FCD3C052A59212323F0 +:200A00002323EB210B241A4FCD3C0521DC072200203E01320220CD360A2124202200203E13 +:200A200002320220CD360A2136202200203E03320220CD360AC93E0FCD42007EEE2077E5EB +:200A4000CD770020E17EEE2077C9DB01E61021B420C2590A3600C3600A36013E01327B21F2 +:200A60003A2820473A1620B8D29E0A3A1420C6084F3A26205F3E1032A620CD990C7BFE016F +:200A800021B520C29E0A36003AB320FE02CA960A3A1820322A203EFE322C20C3A30A21B55B +:200AA0002036013A3A20473A1620B8D2E80A3A1420C6084F3A38205FCD990C7BFE0121B6D9 +:200AC00020C2E80A36003AB320FE02CAD40A3A1820323C2006023A1820A7F2DF0A06FE78DF +:200AE0003EFE323E20C3ED0A21B62036013E0332A22001162011512021B420C5D5E5CD18FB +:200B00000BE1D1C13AA2203DC832A22079C6124F7BC6125F23C3FB0A1AA7CA1E0B3D12C062 +:200B20007EA7C07DFEB4C2320B3A7B21A7C8AF327B21212D2179D604E60F0FCD42007EA7E6 +:200B4000C03E0A12133E08121B1B3EF6121B1B3A1820121B1B0A127BD64CE60F1F21402155 +:200B6000CD42000A771B1B0B0B0AC60812C92148202200203E043202203E09CDD302FE029C +:200B8000FA9C0B3E04CDD302FE10DA9C0B3A0220FE05FAB90B3AB320A7CAB90B3E0A2A0070 +:200BA00020CD4200AF77CD7700202A00200609AF772305C2B00BC3E20B3A0220D604F5C2BB +:200BC000C80B3A1820324E20CD770020F18721F90BCD42007ECDFF0B46237EB8CAE20BCDA8 +:200BE000FF0B2A0020011200092200203A02203C320220FE07C2790BC9020301010101E555 +:200C0000CD470023235E2323562A002023234E2323463E1032A620CD990CD55A48CD990C75 +:200C20007BD1A3E1C8E57E47FE01C24D0C212E217EA778C24D0C36302118203600232336BF +:200C40000021B7203600CD9A0ECD4A1278FE0247C2650C212F217EA778C2650C360BCD9AED +:200C60000ECD4A1278FE03C2790C2130217EA7C0360B78CD9A0ECD4A122A00203E09CD422F +:200C8000007EFE06FA950C0E013A0220FE04CA920C0CCD7A143602E1C9E57B1E00B9D2AB65 +:200CA0000C21A62086B9DAAB0C1E01E1C93AB720A7CA2A0D06003A4D21A7CABF0C060CDB18 +:200CC00001E60F2FF5E60C0F0F878021AE0DCD42004E23463A4D21A7CAE00C6960C3F00CB4 +:200CE0002A3921CD620D2A392119CD940D223921221720F1E60387C60621AE0D473A4D215C +:200D0000A778C2080DCD42004E23463A4D21A7CA170D6960C3270D2A3B21CD620D2A3B21D2 +:200D200019CD940D223B212219202112202200203E01320220010602117F10CDFB1AA7CA2F +:200D4000490DAF321720321820010804116F11CDFB1AA7CA5D0DAF321920321A20CD770096 +:200D600001C9CD8C0D09CD6B0DEBC97CA7F5F2740DCD8C0D7D0FE67F6F7C0F67E680B56F74 +:200D80007CE67F67F1F28B0DCD8C0DC97D2F6F7C2F6723C97CFEFFC2A20D7DFEFDC0210005 +:200DA00000C97CFE00C07DFE03C0210000C9000000FA0006000000FA0006000000FC000408 +:200DC000882124202200203E02320220CDDE0D2136202200203E03320220CDDE0DC9CD17E5 +:200DE0000E010602117F10CDFB1A0605CD9310010804116F11CDFB1A0607CD9310212D2173 +:200E00003A0220CD42007EFE02D2120ECDA80ECDA90FCD770020C93AB320FE02C83A56213C +:200E2000E6F00F0F0F0F0609FE06F2300EC604473A5120B8C0CD690E3E1032A6203A4A20FB +:200E40004F3E02CDD3025FCD990C7BA7C8232323237E3605A7FA5A0E36FB232336FC3ABABB +:200E600020FEBFDA680E3604C91148002A0020193E09CD42007EA7C03A1620473E04CDD3B2 +:200E80000290F82B2B463A142090232323233604D2950E36FC23233602C9CD47003E0DCD4E +:200EA00042003600233618C93A82204FC5210000392227222A002023F9C1D1E1097832B887 +:200EC00020E1195C2A2722F9C1D53E1032A6203AAB20A7CA3A0FCD990C7BA7CA030FD179DB +:200EE00093F53E0D2A0020CD4200F1772F3CC610CD2A0FBAF2FB0E233610C97ECD2A0F822A +:200F00002377C9D1D5CD2A0F7A814FCD990C2A00203E0DCD42007BA7CA230F3600D1799331 +:200F20002377C9D13610233610C9473AA3205787878257C2380F161478C93ABE204F3E0D5D +:200F40002A0020CD42003AB320A7C2540FD13600233610C9FE01C27B0FCD990C7BD1A77BFB +:200F6000C2730F91DA6D0F3600233610C93610233610C9912F3C77233610C9FE02C2870F69 +:200F8000D13610233610C9CD990C7BD1A77BC2A10F91D29B0F3600233610C9361023361092 +:200FA000C9360023912F3C77C93AAB20A7C82124202200203A2F21CDC70F213620220020D2 +:200FC0003A3021CDC70FC9A7C03A8020473A92209032A6202A002023234E58D5CD990C7928 +:200FE000C6104F7BA7D1C2F40F2A00203E0ACD4200361CC9D5CD990C7BA7D1CAE90F431108 +:201000000900197EFE10CAE90F237EA7CAE90F5879C6084F3AA620A71732A620CD990C3A06 +:20102000AE2057FE15DA2A1016147BA7CA69103A8020822A0020232346B8D24410110800AC +:20104000193620C93A8020477E90F53A82204723237EC6109047F1B8D2621011060019364D +:201060001CC9110600193620C93A922092472A002023237E4FC610B8DA3D103A942047230D +:20108000237E90C610473A922091D610B8DA5B10C36210A7C84F2A002078CD420078FE0761 +:2010A000C2B41079FE0123CAAF1036FCC3BF103601C3BF107E2F5F237E2F5713722B733A69 +:2010C000BA20A7F5E6034FF1FAD61078FE07CAE7100E01C3EF103AB320FE02C2E3100EFFB3 +:2010E000C3E7103EFCB14F3AB320FE02CAD11078FE052BC2FA102323232371C93AB320FE01 +:2011000002C83A1620FEC8D021A720361823360C21BF1122A4203A26204F3A2820473A14A7 +:2011200020D6045F3A1620C60857CD71113A38204F3A3A204721D91122A420CD711121A7AE +:2011400020361023361021FE1122A4203A26204F3A2820473A14205F3A162057CD7111210E +:20116000241222A4203A38204F3A3A2047CD7111C93E0432B820219811D5C5E5CDA611E185 +:20118000C1D1C2A0117886472379864F233AB8203D32B820C8C3791110000010F00000F003 +:2011A000F1EB2AA420E93AA72032A620CD990CD55A483AA82032A620CD990C7BD1A3C93E38 +:2011C00003322A20EBCDF311197DD604FAD4113EFD322A20AF322C20C93E03323C20EBCD51 +:2011E000F311197DD604FAEE113EFD323C20AF323E20C91198117B2F5F7A2F5713C93A2FA9 +:2012000021A7C03A1C20FE18C83E02CD9A0E3E0B322F213E30322E21CD4A12AF32B7203C66 +:20122000CD9A0EC93A3021A7C03A1C20FE18C83E03CD9A0E3E0B3230213E30322E21CD4AA2 +:2012400012AF32B7203CCD9A0EC93E10327D21C9217D217EA7C8350E10FE01C26112CDE083 +:2012600014FE0FC0CDD414C9B73AAB20A7C8212E2011792106027EFE1CCAA312232323231F +:201280007EFE102BC28D127EFE10CAA3121AA7C2A3123E011211F8FF191604CDAE12232394 +:2012A000CDAE12214020117A2105C27612C95E2356EBCD6B0DEB722B73C93A2E21A7CA0A8D +:2012C00013F5AF32AB20F1FE27DADD12CDE7133E0C80321C203E04321A20C30613FE25C20D +:2012E000EC123E18321C203E103220203A2E21FE01C206133E0132B720CD04143E04321C4C +:20130000201601CDD61A212E21353A2E21A7C21413CD04142124202200203E02320220CD2E +:2013200031132136202200203E03320220CD3113C9212D213A0220CD42007EA7F52A002003 +:201340003E0ACD4200F1C8FE03DA5613CDE7133E0C8077C3DC13FE02C26613361C110400DD +:20136000193610C3DC13FE01C2DC1336203A0220FE02C27C13AF327921C38013AF327A215C +:201380003E082A0020CD42003ABA200FDAAB1336FC2B2B2B2B36C82B2B3A1420A7FAA513FA +:2013A000C640C3A713D64077C3CE130FDAC01336002B2B36022B2B36202B2B3604C3CE1319 +:2013C00036002B2B36FE2B2B36202B2B36EB16013AB320A7CAD9131602CDB11A212D213A50 +:2013E0000220CD420035C906000E040FD2F013050DC2EB1378A7F2FB13C603F20014C60339 +:20140000878747C9CD9F167AD60D27571C3AAA20BAD0BBD83E0132AB20C9CD2A14CD4C14D7 +:20142000CD8914CDB414CDEF14C93AAE20FE05C23C140E10CD6E143E053231213A3121A790 +:20144000C83D323121C00E10CD7A14C921632006020E023AB320A77EC26014FE0ACC6E1487 +:20146000FE06CC7A141112001905C25114C9F53ABF20B132BF20D305F1C9F5792F4F3ABF96 +:2014800020A132BF20D305F1C93A1820A7F292142F3C473A1A20A7F29C142F3C80FE02F2EB +:2014A000A4143E020F0F0F473A3321E61FB0323321D306C90E080603162F212E217EBACC7D +:2014C000D4145F7AD608577BBACCE014160A2305C2BD14C9F53A3321B1323321D306F1C930 +:2014E000F5792F4F3A3321A1323321D306F1C90E013A5120FE0A217E21C2FE1436097EA7FE +:20150000C8350000000000007EA7CC7A147EFE08CC6E14C9C90000010101010101010101E2 +:20152000BE3AA9203CFE18CA2E1532A920C9AF32A920CD94163AAA20C6992732AA20CD94BF +:20154000163AB320FE02CA5B15212A203AAA20E601CA5715213C207E2F3C77CD9F163AAA5F +:2015600020BAC271153E0132B32021002422B120C9BBC28D153E0332B320AF32AB203E2095 +:20158000322E2032402021002422B120C93AAA20A7C03A0D20A7CA9C073A3821A7C2B5158C +:2015A000CD9F163AB920FE03F2AD1523233A562123BED237163A5621472A59215E2356EB8C +:2015C0005E2356131313131AB8D237163E01324D21C5CDA71ACDED16CD0318AF325821C1F2 +:2015E0002A59215E23562323237E32A22022A420B8D2FD15CDBA16CD2E18C31616EB232343 +:2016000023237EB8D21016CDCB16CD2E18C33716CDDC16CD2E183AA220473A5621B8DA37F6 +:20162000162AA420EB210B241A4FCD3C05210B243A56214FCD3C053A3821A7C29C07CD9F8B +:2016400016233AB920FE02C24C1623233A562146B8FA9C07C5CD9416C17832AA20CD9416A0 +:20166000CD6D163E04323821AF32B920C9210F203601210A291187163E0DCDFB031E3CCD04 +:2016800023001DC27F16C9455854454E4445445B504C4159211A243AAA204FCD3C05C9DBA4 +:2016A00002E6060707473A38214F3AB9208081218009CD42002356235EC9210F20360121CD +:2016C0000427114F173E16CDFB03C9210F2036012104271165173E13CDFB03C9210F2036B5 +:2016E000012104271178173E16CDFB03C9210F203601214428118E173E17CDFB03210F20DB +:20170000360121842911A5173E16CDFB03210F20360121C42A11BB173E0FCDFB03210F20F7 +:20172000360121013811E7173E0ECDFB03210F20360121412D11CA173E1DCDFB03C9210FCB +:2017400020360121013811F5173E0ECDFB03C9594F555B4152455B5448455B4E45575B4C83 +:201760004547454E44594F555B4152455B5448455B4E45575B414345594F555B4152455BA6 +:201780005448455B4E45575B455850455254454E5445525B594F55525B54574F5B494E4938 +:2017A0005449414C53464F525B4655545552455B47454E45524154494F4E534F465B47417D +:2017C0004D455B504C4159455253444550524553535B545249474745525B554E4445525B43 +:2017E000494E495449414C46495253545B494E495449414C5B5345434F4E445B494E49544C +:2018000049414C210F2036012102311114183E1ACDFB03C94142434445464748494A4B4CA0 +:201820004D4E4F505152535455565758595A3E04D305213B18220620CDA109000006122092 +:2018400001200A0ACDA10901001200000C007000000000000410100010050C0CCD360ACD22 +:201860007700122A5B21110400193A5621773E1432AA203E04D305D306DB01E610CA791875 +:201880001610CD1B0015C28218CD1B00CDD4053AA9203CFE18CA9E1832A920C3A918AF3206 +:2018A000A92021AA2035CADE183E0132B720D304CDAD0CDB01E610C280182A5B21110500F2 +:2018C000193A5821CD42003A1420E6F80F0F0FC640FE5BF28018FE40CA8018C3E218CD2C75 +:2018E0001AC9773A5821A7C201193E01320F20EB2110383E01CDFB03CD2D17CD3E17C31252 +:20190000193E01320F20EB2111383E01CDFB03CD1D173A5821C601325821FE02CADE188742 +:2019200087C624324E21CD770012DB01E610D304CA2A19C38018210F20360121033311F54A +:20194000193E19CDFB03210F203601214D34110E1A3E0ECDFB03210F203601218335111C46 +:201960001A3E06CDFB03210F20360121C33611221A3E03CDFB03210F20360121033811252B +:201980001A3E06CDFB033E01320E202A59215E2356232323D5E5EB2197341A4FCD3C05E1B2 +:2019A000233E01320F20EB2191353E02CDFB03E15E2356232323D5E5EB21D7351A4FCD3C22 +:2019C00005E1233E01320F20EB21D1363E02CDFB03E123232323E5EB2117371A4FCD3C051D +:2019E000E1233E01320F20EB2111383E02CDFB03AF320E20C943555252454E545B504841B4 +:201A00004E544F4D5B49495B4348414D5053494E495449414C535B53434F52454C45474533 +:201A20004E44414345455850455254AC3A56214F06032A5921EBEB5E23562323237EB9DCF1 +:201A40004B1AD878A7C805C8C3361AF5E52A5B215E2356D51313237E1223137E122B5E230B +:201A600056EBD1732372E12B2B2B2BE523235E23562A5B21EB732372E1EB73237223131307 +:201A80001A7713231A771B2A5B21EB7323722A5B2178FE03C29A1A2259215E2356EB05C280 +:201AA0009A1A225B21F1C901002611DF3FCDC403C9D52103243A56214FCD3C05D13A0D2004 +:201AC00017D2CB1A0156210A8227022103243A56214FCD3C05C9D52112243A57214FCD3CB6 +:201AE00005D13A0D2017D2F01A0157210A8227022112243A57214FCD3C05C979CDD3024FEF +:201B000078CDD302D60447A7FA171B79A7F2171B2F3C17B8D2331B7881D51E01BBD1D223AB +:201B20001B3EFFA71F477ACDD302932F3CB8DA361BAFC93E01C93E02C93AB320A7C8FE013F +:201B4000C25D1B21BE203434CD801BCD801BC021B3203432BE203C32AB20323D213AB32046 +:201B6000FE03C021BE203434CD801BCD801BC032BE2032B3203A3821A7C021B9203434C973 +:201B800006200EFF2AB1207EA9772305C2871B22B1200100C0097CB5C0C93AB320FE02C2A7 +:201BA000AE1B3A3E21EE01323E21CDC31BC9FE01C83A3E21A7CABB1BCDC31BAF323E21320B +:201BC0003D21C9210F20360121CC2611D41B3E08CDFB03C952414441525B4F4E3AAB20FE05 +:201BE00001CAF31B3AAC20A7C2F31B3AA320A7C2F31BC93AAD20FE01C2411C3E0132AE20EE +:201C000032AF203A1420C6043280203A16203D3282203294202A34212283202A36212295D6 +:201C2000202ABC202285202297203A1420C60C329220AF32AD203E0132AC2021C120222C7F +:201C4000213AB020FE15FA631CD61432A220CD0D1D3AA2203D32A220C24E1C3E1432A22059 +:201C6000C3811C3AB02032A2203AAF20A7C2811C21A32035C27C1C3E0132AD203E0532A22F +:201C800020CD0D1DCD161D21A22035C2811C217E202200203E07320220010602117F10CDA6 +:201CA000FB1AFE00CAAD1C210000228320010804116F11CDFB1AFE02C2C41C2100002285AE +:201CC000202297203AAE20FE80DAD51C2100002285202297202190202200203E083202204C +:201CE000010602117F10CDFB1AFE00CAF41C2100002295203A8620A7C032AF203AA320A79D +:201D0000C03AAD20A7C03E0432A320C9C9CD770007CD770008C93AAF20A732AC20CA621D75 +:201D20002A2C213A8020E6F877233A822077233A802047E6F8C6084F9077233A92205FE6ED +:201D4000F84791573AAE20FE017AD2521DF2521DC6080F0F0FE61F77237B90772A2C21CDD9 +:201D6000891D21AE20342A2C213E05CD4200E511D6DE197CB5E1C27C1D21C120222C213AF6 +:201D8000AE20FE16D8CD891DC97E0F0F0FE61F57237E0F0F0F47E6E0B25F78E61FC624579C +:201DA000237EE521CA1DCD42001AAE1213E12346AFB8CABE1D1AEEFF121305C2B51D237EDD +:201DC00021D31DCD42001AAE12C9C980C0E0F0F8FCFEFF0103070F1F3F7FFF04011C1F1030 +:201DE00002071E0401201F1803271E18036F1E1803B41E1002FC1E1002441F1002241F0885 +:201E000002741F0802841F80018001800180018001C003C003C183F18FFDBFFFFFFFFFC138 +:201E200083E007F00F381C0000000000001020080000000000000000000002040000004067 +:201E40002800000400000504000380025400000504000400402800000000000204000000F9 +:201E60000000000000001020080000000000000080000008022040000002000220440002D6 +:201E800000022044004A0048A00200051040A80280042144A98480042140A80200051048A7 +:201EA000A002004A000020440002002040000008020080000014004041012008028822007C +:201EC00020880A48220020501552018000A40422012008484A45929422252908484A220171 +:201EE0002000A40452018020501548220020880A88220020080240410100140000008001BB +:201F0000F00FF81FFC3FFE7FFE7FFFFF224424242814B00DE007A005800140020000000082 +:201F20000101010180008000C001C001C001C001E003F007F80FFC1FFE3FCF79E773F227A5 +:201F4000F80FD00500000000000000000000000000000000000000000000000000000000A5 +:201F6000000000000000000000000000000000000000000018003C007E00FF003C003C0018 +:201F80003C003C000018003C007E00FF003C003C003C003CFFFFFFFFFFFFFFFFFFFFFFFF14 +:201FA000000000000000000000000000000000000000000000000000000000000000000021 +:201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:201FE0000000000000000000000000000000000000000000000000000000000000000000E1 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantomIIprom.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantomIIprom.hex new file mode 100644 index 00000000..1c6c49cf --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/phantomIIprom.hex @@ -0,0 +1,66 @@ +:020000040000FA +:200000000000000000000000000000000000000000000000000000000000000000000000E0 +:200020000000000000000000000000000000000000000000000000000000000000000000C0 +:200040000000000000000000000000000000000000000000000000000000000000000000A0 +:20006000000000000000000000000000000000000000000000000000000000000000000080 +:20008000000000000000000000000000000000000000000000000000000000000000000060 +:2000A000000000000000000000000000000000000000000000000000000000000000000040 +:2000C000000000000000000000000000000000000000000000000000000000000000000020 +:2000E000000000000000000000000000000000000000000000000000000000000000000000 +:200100000000808701000000000000000000F0000000F0EF03000000000000000000FB0109 +:200120000000F8DF07000000000000000080F7030000F8DF0F000000000000000000EF038F +:200140000000F83FE00000000000000000C0EE03000080FFC00000000000000000B0F501F2 +:200160000000BCFF030000000000000000783F0000007EFF1F0000000000000000F8EF1F68 +:200180000000FFFF1F0000000000000000F8DE3F0000FFE701000000000000000060BF3FE8 +:2001A0000000FF7B1E0000000000000000C07F3F0000FEBD3F0000000000000000C0FF1E52 +:2001C00000007CDE7F000000000000000080FF0C000080BFFF0000000000000000007E00FF +:2001E0000000E0FDFF00000000000000000000000000E0FDFF000000000000000000000047 +:200200000000E0FB7F00000000000000000000000000C0F37F000000000000000000000052 +:20022000000080E11F000000000000000000000000000080070000000000000000000000B7 +:2002400000000000000000000000000000000000000000000000000000000000000000009E +:2002600000000000000000000000000000000000000000000000000000000000000000007E +:2002800000000000000000000000000000000000000000000000000000000000000000005E +:2002A00000000000000000000000000000000000000000000000000000000000000000003E +:2002C00000000000000000000000000000000000000000000000000000000000000000001E +:2002E0000000000000000000000000000000000000000000000000000000000000000000FE +:2003000000F0000000000000000000000000000000FB0100000000000000000000000000F1 +:2003200080F7030000000000000000000000000000EF030000000000000000000000000051 +:20034000C0EE0300000000000000000000000000B0F5010000000000000000000000000046 +:20036000783F0000000000000000000000000000F8EF1F00000000000000000000000000C0 +:20038000F8DE3F0000000000000000F00000000060BF3F0000000000000000FB01000000FE +:2003A000C07F3F0000000000000080F703000000C0FF1E0000000000000000EF0300000076 +:2003C00080FF0C00000000000000C0EE03000000007E0000000000000000B0F501000000BD +:2003E00000000000000000000000783F0000000000000000000000000000F8EF1F00000040 +:2004000000000000008087010000F8DE3F0000000000000000F0EF03000060BF3F0000007F +:200420000000000000F8DF070000C07F3F0000000000000000F8DF0F0000C0FF1E0000009D +:200440000000000000F83FE0000080FF0C000000000000000080FFC00000007E000000003D +:200460000000000000BCFF03000000000000000000000000007EFF1F000000000000000022 +:200480000000000000FFFF1F00000000000000000000000000FFE701000000000000000058 +:2004A0000000000000FF7B1E00000000000000000000000000FEBD3F0000000000000000AA +:2004C00000000000007CDE7F0000000000000000000000000080BFFF000000000000000005 +:2004E0000000000000E0FDFF00000000000000000000000000E0FDFF000000000000000044 +:200500000000000000E0FB7F00000000000000000000000000C0F37F00000000000000004F +:20052000000000000080E11F000000000000000000000000000080070000000000000000B4 +:2005400000000000000000000000000000000000000000000000000000000000000000009B +:2005600000000000000000000000000000000000000000000000000000000000000000007B +:2005800000000000000000000000000000000000000000000000000000000000000000005B +:2005A00000000000000000000000000000000000000000000000000000000000000000003B +:2005C00000000000000000000000000000000000000000000000000000000000000000001B +:2005E0000000000000000000000000000000000000000000000000000000000000000000FB +:2006000000000000000000000000000080870100000000000000000000000000F0EF0300F0 +:20062000000000000000000000000000F8DF0700000000000000000000000000F8DF0F00F6 +:20064000000000000000000000000000F83FE00000000000000000000000000080FFC00044 +:20066000000000000000000000000000BCFF03000000000000000000000000007EFF1F0020 +:2006800000000000F000000000000000FFFF1F0000000000FB01000000000000FFE701006A +:2006A00000000080F703000000000000FF7B1E0000000000EF03000000000000FEBD3F003C +:2006C000000000C0EE030000000000007CDE7F00000000B0F50100000000000080BFFF00AC +:2006E000000000783F00000000000000E0FDFF00000000F8EF1F000000000000E0FDFF0085 +:20070000000000F8DE3F000000000000E0FB7F0000000060BF3F000000000000C0F37F00DA +:20072000000000C07F3F00000000000080E11F00000000C0FF1E0000000000000080070057 +:2007400000000080FF0C00000000000000000000000000007E000000000000000000000090 +:20076000000000000000000000000000000000000000000000000000000000000000000079 +:20078000000000000000000000000000000000000000000000000000000000000000000059 +:2007A000000000000000000000000000000000000000000000000000000000000000000039 +:2007C000000000000000000000000000000000000000000000000000000000000000000019 +:2007E0000000000000000000000000000000000000000000000000000000000000000000F9 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/rome.cpu b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/rome.cpu new file mode 100644 index 00000000..26a3ab84 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/rome.cpu differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/romf.cpu b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/romf.cpu new file mode 100644 index 00000000..55761b0b Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/romf.cpu differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/romg.cpu b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/romg.cpu new file mode 100644 index 00000000..ca1ef588 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/romg.cpu differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/romh.cpu b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/romh.cpu new file mode 100644 index 00000000..b46c0406 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/romh.cpu differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/searthin.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/searthin.hex new file mode 100644 index 00000000..2cb4456a --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/searthin.hex @@ -0,0 +1,258 @@ +:020000040000FA +:2000000000C3D4180F141207F5C5D5E5C38C0000F5C5D5E53E8032722021C02035CD921097 +:20002000DB010FDA67003AEA20A7CA4200C3FE0B7CBAC07DBBC9000032EB20CD4719AF328F +:20004000EA203AE920A7CA82003AEF20A7C26F003AEB20A7C25D00CDBF0AC382003A93206C +:20006000A7C28200C365073E0132EA20C33F00CD40173A3220328020CD2211CD4802CD1370 +:200080000900CDC812E1D1C1F1FBC900AF3272203AE920A7CA82003AEF20A7C2A5003AC18D +:2000A000200FD28200212020CD4B02CD4101C38200CD8608E57E23666F220920220B20E1BF +:2000C0002B7EFE03C2C8003D320820FEFE3E00C2D3003C320D20C93E0232FB2132FB22C382 +:2000E000E4082A132011651B2319EBC3321A0308120F0B00182626020E0F181108060713E5 +:200100002102207EA7C23815E53A06206F3A6720677EA7E1CA360123237E2346E6FE070766 +:20012000075F160021001C19EB78A7C43B012A0B200610CDD315AF320020C921300019EBA4 +:20014000C93A6820A7C83A0020A7C03A6720673A062016023CFE37CCA1016F4605C2540194 +:20016000320620CD7A0161220B207DFE28DA71197A3204203E01320020C916007D21092023 +:2001800046234EFE0BFA9401DE0B5F78C610477B14C3830168A7C85F79C6104F7B3DC39579 +:2001A0000115CACD012106203600234E3600CDD9012105207E3CE60177AF21672066C900E2 +:2001C000210021063736012305C2C501C9E1C93E0106E0210224C3CC142346237986772312 +:2001E000788677C906C011001B210020C3321A214221C3F8012142220E0411201DD5062C53 +:20020000CD321AD10DC2FD01C93E01C31B023E01C31402AF114222C31E02AF11422132814A +:20022000200102162106283E04F5C53A8120A7C24202CD691AC1F13DC8D511E00219D1C336 +:200240002902CD7C14C335022110207EFEFFC8FEFECA810223464FB079C27702237EA7C219 +:200260008802235E2356E5EBE5216F02E3D5E9E1110C0019C34B020504C27D023D05702BC4 +:200280007711100019C34B02352B2BC38102E1237EFEFFCA3B032335C047AF3268203269E2 +:2002A000203E30326A207836052335C29B032A1A200610CD241421102011101B0610CD3268 +:2002C0001A0600CDDC193A6D20A7C03AEF20A7C8310024FBCDD719CD2E09A7CA6D16CDE79D +:2002E000187EA7CA2C033ACE20A7CA2C033A6720F50FDA3203CD0E02CD78087323722B2BA4 +:200300007000CDE401F10F3E210600D2120306203E22326720CDB60AAF32112078D3053C05 +:20032000329820CDD609CD7F1AC3F907CD7F1AC31708CD0902C3F802000000216820360141 +:20034000237EA7C3B003002B36013A1B20473AEF20A7C263033A1D200FDA81030FDA8E034B +:20036000C36F03CDC0170707DA810307DA8E03211820CD3B1ACD471ACD39143E0032122061 +:20038000C978FED9CA6F033C321B20C36F0378FE30CA6F033D321B20C36F033CE601321500 +:2003A000200707070721701C856F221820C36F03C24A032335C24A03C34603112A20CD0621 +:2003C0001AE1D0237EA7C8FE01CAFA03FE02CA0A0423FE03C22A0435CA36047EFE0FC0E527 +:2003E000CD3004CD5214E123342323353523353535233608CD3004C300143C773A1B20C6F8 +:2004000008322A20CD3004C30014CD3004D5E5C5CD5214C1E1D13A2C20856F322920CD9107 +:20042000143A6120A7C8320220C9FE05C8C33604212720C33B1ACD3004CD5214212520116E +:20044000251B0607CD321A0000000000000000000000000000002A8F202C228F203A842082 +:20046000A7C07EE601012902C26E0401E0FE218A2071232370C9E13A321B3232202A382048 +:200480007DB4C28A042B223820C91135203EF9CD50053A46203270203A5620327120CD63A9 +:2004A000053A7820A7213520C25B0511301B2130200610C3321AE13A6E20A7C03A8020FE4C +:2004C00001C01145203EEDCD50053A36203270203A5620327120CD63053A7620FE10DAE7FF +:2004E000043A481B3276203A7820A7214520C25B0511401B2140200610CD321A3A82203D3D +:20050000C208053E01326E202A7620C37E06E11155203EDBCD50053A46203270203A362072 +:20052000327120CD63053A7620FE15DA34053A581B3276203A7820A7215520C25B051150C6 +:200540001B2150200610CD321A2A7620225820C9327F20217320060BC3321A117320060B43 +:20056000C3321A2173207EE680C2C1053AC120FE043A6920CAB705A7C82336003A7020A7AD +:20058000CA8905473ACF20B8D03A7120A7CA9605473ACF20B8D0237EA7CA1B062A76204EFB +:2005A0002300227620CD2F06D0CD7A0179C607677DD60A6F227B202173207EF6807723349A +:2005C000C9117C20CD061AD0237EE601C244062334CD75063A7920C603217F20BEDAE205DA +:2005E000D60C3279203A7B20473A7E2080327B20CD6C063A7B20FE15DA12063A6120A7C8CA +:200600003A7B20FE1EDA1206FE2700D21206973215203A7320F601327320C93A1B20C60855 +:2006200067CD6F1579FE0CDAA5050E0BC3A5050D3A6720676916057EA737C07DC60B6F15CE +:20064000C23706C9217820357EFE03C26706CD750621DC1C227920217C2035352B35353E20 +:2006600006327D20C36C06A7C0C37506217920CD3B1AC39114217920CD3B1AC35214224818 +:2006800020C9E13A8020FE02C02183207EA7CA0F053A5620A7C20F05237EA7C2AB063A828B +:2006A00020FE02DA0F053601CD3C07118A20CD061AD02185207EA7C2D606218A207E232355 +:2006C00086328A20CD1012218A207EFE28DAF906FEE1D2F906C906FECDDC1923357EFE1F4F +:2006E000CA4B07FE18CA0C07A7C006EF2198207EA077E620D305000000CDDC12CDCB1421BB +:200700008320060ACD5F0706FEC3DC193E0132F1202A8D20460E0421501D114C1D1AB8CAE2 +:20072000280723130DC21D077E3287202600682929292922F220CDDC12C3F108CD4207C354 +:200740003914218720CD3B1AC3471A06102198207EB077CD7017217C1D228720C33C0711BC +:20076000831BC3321A3E01329320310024FBCD7919CDF6172113301104000E04CDF3083A92 +:20078000EB203D2110280E14C2570811CF1ACDF308DB01E604CA7F070699AF32CE203AEB0A +:2007A00020802732EB20CD471921000022F82022FC20CD2519CD2B19CDD7192101017C32C5 +:2007C000EF2022E72022E520CDE312CDEF01CDF501CDD10832FF2132FF22CDD700AF32FEAA +:2007E0002132FE22CDC001CD041921783822FC2122FC22CDE401CD7F1ACD8D08CDD6090098 +:20080000AF32C120CDCF013A67200FDA7208CD1302CDCF01CDB100CDD1190620CDFA18CDCF +:200820001816CD0A19CDF315CD88093A8220A7CAEF09CD0E17CD3509CDD808CD2C17CD5942 +:200840000ACA49080604CDFA18CD7517D306CD0418C31F0800000011BA1ACDF3080698DB5F +:20086000010F0FDA6D080FDA9807C37F073E01C39B07CD1A02C314083A0820472A0920EBE6 +:20088000C386080000003A6720672EFCC921112B11701B0E0ECDF3083A67200F3E1C2111B3 +:2008A00037D4FF083EB032C0203AC020A7C8E604C2BC08CDCA09CD3119C3BD0B0630211C78 +:2008C000263A67200FDACB08211C38CDCB14C3A908DB02E601C3E7173A8220FE0CD03EF96E +:2008E000327E20C93ACE20A7C0211C380630C3CB140E031AD5CDFF08D1130DC2F308C91127 +:20090000001EE526006F29292919EBE10608D306C339143A0920FE78D02A91207DB4C22948 +:20092000092100063E013283202B229120C9CD11162EFF7EC9CD10192B2B7EA7C80650DBDA +:20094000020700D248090630CDCA09237EB8D8CDED13347EF521012524243DC258090610EB +:2009600011601CCD3914F13CCD8B1ACD10192B2B36003EFF3299200610C3FA1821A01DFEC0 +:2009800002D823FE04D823C9CDCA093AF120A7C8AF32F120E52AF220EBE17E8327775F233A +:2009A0007E8A277757237E23666FC3AD097ACDB2097BD5F50F0F0F0FE60FCDC509F1E60F2F +:2009C000CDC509D1C9C61AC3FF083A67200F21F820D821FC20C92102243600237DE61FFE31 +:2009E0001CDAE809110600197CFE40DAD909C9CD3C0AAF32E920CDD6093A6720F5CDE40190 +:200A0000F13267203A672067E52EFE7E3C77FE01CCB319CD151800007EE12EFC77233638A0 +:200A20007C0FDA330A3E21329820CDF501CD0419C30408CDEF01CDC001C30408CD590AC243 +:200A4000520A3E3032C0203AC020A7C8CD590ACA470ACD590AC2520AC93A1520FEFFC93A60 +:200A6000EF20A7CA7C0A480608CDFA184178CD7C097E21F32036002B772B3601216220C9D8 +:200A80003E0232C120D3063ACB20A7CA850AAF32C120C9D51ACDFF08D13E0732C0203AC095 +:200AA000203DC29E0A130DC2930AC9215020C34B023E40C386193E80C3D70AE1C372003AF4 +:200AC000C1200FDABB0A0FDA68180FDAAB0AC9000000000000000032C0203AC020A7C2DA48 +:200AE0000AC921C220060CC3321AAFD303D305CD8219FBCDB10A3AEC20A72117300E04C28E +:200B0000E80B11FA1CCD930ACDB10ACD7F0C3A901FCD640E0000003AEC20A7C24A0B11959F +:200B20001ACDE20ACD800A11B01BCDE20ACD800ACDB10A11C91FCDE20ACD800ACDB10A2165 +:200B4000B733060ACDCB14CDB60ACDDD0E3AFF21A7C25D0BCDD10832FF21CD7F1ACDE4016F +:200B6000CDC001CDEF01CD1A023E0132C120CDCF01CD1816CDF10BD306CD590ACA710BAF90 +:200B8000322520CD590AC2830BAF32C120CDB10ACDD6090E0C21112C11901FCDF3083AEC42 +:200BA00020FE00C2AE0B2111333E02CDFF08CD2C0CCD501FC3C60BC5CDF308C1C9CD630CFB +:200BC000CDE408C3A9083AEC20FE00C2DA0B11D51FCDE20ACD800ACD9E1821EC207E3CE698 +:200BE0000177CDD609C3340F11AB1DCD930AC3080BCD0A19C39A193EC0C3D70A01183AEB6C +:200C000020FE99CA3E00F5DB0207D2140CF1C60127C338003A013EFE07C2230CAF32013EE1 +:200C2000C30D0C3E0732013EF1C33E00DB0207D2380C116E0FC33B0C117E0F210F2A0E1088 +:200C4000CDF308DB020F0FD8210D2811BA100E14CDF308DB0207D0210D3311F81E0608C3D1 +:200C6000391498CD1A19211C3DCD750C211C34CD750C211C2B11D01E0608D306C339141199 +:200C8000F80C21152E0640CD3914D30611380D21142E0640CD3914CDB10A11780D21122E1B +:200CA0000640CD391411B80D21112E0640CD3914CDB10A11FA0D210F2B066ACD3914D306E0 +:200CC00011730E210E2B066ACD3914CDB10A11F31F210B300E04CD930A21092911E11F0EA9 +:200CE00012CD930AC3B60A1826D80F1326F00F0E26081009262010FF003C7EC3C3C3C3C365 +:200D0000C37130000000FFFF000000000000FFFF000000FFFFC3C3C3C3C3C37E3C00000029 +:200D2000FFFFC3C3C3C3C3C3C0C0000000FFFFC3C3C3C3C3C37E3C000030380C0C0C0C0CB5 +:200D40000CF8F0000000F0F81C0C0C0C0C1CF8F0000000FCFC00000000000000000000006F +:200D6000FCFC0C0C0C0C0C0C0C0C000000FCFC0000C0C030300C0C0000FFFFC3C3C3C3C35E +:200D8000C3C0C0000000071F3870C0C070381F07000000FFFFC3C3C3C3C3C37E3C000000AA +:200DA000C0C0C0C0FFFFC0C0C0C0000000FFFF030303030303FFFF0000FCFC0C0C0C0C0CF3 +:200DC0000C0C0C000000FCFCC0C0C0C0C0C0FCFC000000FCFC0000C0C030300C0C0000008F +:200DE00000000000FCFC00000000000000FCFC000000000000FCFC005E0F0000000000C0DE +:200E0000C0C0C0FFFFC0C0C0C0000000FFFF0C0C03030000FFFF000000FFFF00000000007C +:200E200000FFFF000000071F3870C0C070381F070000003C7EC3C3C3C3C3C37130000000AB +:200E4000C0C0C0C0FFFFC0C0C0C00000003F7FC0C0C0C0C0C07F3F000000FFFF0C0C03037C +:200E60000000FFFF1E0A2AF80D4E1DCA00188123C3690E00000000000C0C0C0CFCFC0C0CB2 +:200E80000C0C000000FCFC00000000C0C0FCFC000000C0C030300C0C3030C0C0000000FCF6 +:200EA000FCC0C0C0C0C0C0FCFC00000030380C0C0C0C0C0CF8F00000000C0C0C0CFCFC0CF2 +:200EC0000C0C0C000000F0F80C0C0C0C0C0CF8F0000000FCFC00000000C0C0FCFCCDD609BA +:200EE0002116280E14118E0FCD560F0E12211429CD560F211229CD560F211029CD560F21A6 +:200F00000D291138100E12CDB70B210B29CDB70B210929CDB70B210729CDB70B210529CDD1 +:200F2000B70B21052E0608DB020700D29C1FCDF70BC3D609012718CD5618DA430FCD4418DB +:200F4000C3370F01E70CCD5618DA4714C50E18CD930AC1C3460FC5CD930AC1C9020E0C0F12 +:200F6000041308130815042626150803040E1B26020E080D26261B260211040308131C025A +:200F80000E080D122627261B02110403081313000A04260E15041126020E0C0C000D032656 +:200FA0000E050400111307260100120426000D0326141204180E141126120A080B0B261348 +:200FC0000E2612130E0F13070426040011130726080D150012080E0D262612020E110426FA +:200FE0001B1A1A260F0E080D131226050E112626262612020E1104261C1A1A260F0E080D3E +:20100000131226050E112626262612020E1104261D1A1A260F0E080D131226050E11262608 +:2010200012020E110426000D26041713110026010E0D141226050E111214020204121205D8 +:20104000140B2626000213080E0D26000600080D121326080D150003041112262608122681 +:201060001104160011030403261608130726000D260417131100260B001904112606140D88 +:2010800026050E11261D1A1A1A1A260F0E080D131226DB02E604C2D4103A213EE60FFE0FB0 +:2010A000C03AEB20F5DB0207DACE10F1C6032732EB20CD4719AF32213EC91F1A0F26020EC8 +:2010C000080D2627261D2602110403081312F1C605C3AE103E0F32213EC912140F041108C8 +:2010E0000E112626080D15000304111201CD17CDEC11CD5618D8C50E12CDF308C1C3F2103C +:20110000C2321AC5D5E53A6720672EFE3A7E1B96FEF7D217113EF8327E20E1D1C1D306C97B +:2011200000003A4023A7CA0001FA84113A9420EE08329420D3032A44230603CD24142A4464 +:201140002311FCFF19224423CD471A7DE61FFE04C27B11112000197EA7CAFF113E013215EF +:2011600020210000224623AF3240233241233A9420E6F7329420D303C30001FE03C2FF11AB +:20118000AF3241233A4623A7C29A112F32402323224423112000192246230608CDFA18AF72 +:2011A0002A4623772A442377214023357EE607CA61111120002A4623192246232A442311B3 +:2011C000E0FF19224423EB3A1B20FE30CADF112A1A20CD471A01E00109CD3000CA5C112A6B +:2011E000442336FF2A462336FFC30001C50E1A2AA71F237EFEC9CC5F070DC2F211C1C92ACA +:201200004423CD741411B31C0603CD3914C300013A4323A7C230123241233A8C20A7FA26BD +:20122000123E01C328123EFF3248233E013243233DC25512CD7212CA82123A41233C32414D +:2012400023FE04C23C073E02324323AF324223324123C33C07CD7212CA8912AF3241233A75 +:2012600042233C324223FE04C23C07AF324223C33C072A8920CD471A7DD6116F0610CDC765 +:2012800015C9AF324123C33C07AF3242233A41233C324123D607C23C073241233A4023A7B3 +:2012A000C23C073A6520B72A892011F702192244233E01324023C33C07C50E0F2A721FC3FA +:2012C000F2110000000000002A8D202C7DFE63DAD4122E54228D20C909FF0912AF324323E6 +:2012E000C342072140230640AF772305C2E912C35619C53A8220FE01CAA9134FE5CDCA09E1 +:201300007EE1814F3A642081B7E2A913E53A6720672EFE7EFE04FA1B133E03074F0600216B +:20132000AD13094E2346C52A6420CD471A7CC1E1B9FAA913B8F2A9137DA7FAA913FE37F298 +:20134000A9132BF5FE00CA7613FE0BCA7613FE16CA7613FE21CA7613FE2CCA76137E3601F9 +:20136000FE00C27613E52A64201100F01911B5130610CDD315E1F12323FE0ACAA913FE151A +:20138000CAA913FE20CAA913FE2BCAA913FE36CAA9137E3601FE00C2A9132A6420110010BA +:2013A0001911B5130610CDD315C1C35F0A33312C372A39283B0000000000000972DC720924 +:2013C0000000000000CDCB13C31317CDCA097E23666F292929297CC9E5D5110004193E1A36 +:2013E000CDFF08D1E1C3AD09040A11A04000000000C32E09000000000000000000000000F5 +:2014000000CD741400C5E51AD304DB03B6772313AFD304DB03B677E101200009C105C20572 +:2014200014C90000CD7414C5E5AF77237723E101200009C105C22714C9C51A7713012000CC +:2014400009C105C23914C9CDB60ACDD609C3DF180000CD7414C5E51AD304DB032FA67723B5 +:2014600013AFD304DB032FA677E101200009C105C25514C97DE607D302C3471AC5E57E1247 +:2014800013230DC27E14E101200009C105C27C14C9CD7414AF326120C5E51AD304DB03F5A4 +:2014A000A6CAA9143E01326120F1B6772313AFD304DB03F5A6CABD143E01326120F1B6770F +:2014C000E101200009C105C29814C9AFC57701200009C105C2CC14C93A2520FE05C8FE0274 +:2014E000C03A2920FED847D230153A0220A7C878FECED27915C606473A0920FE90D2041517 +:20150000B8D2301568CD62153A2A2067CD6F152264203E05322520CD81157EA7CA301536E7 +:2015200000CDF212CD3B1ACDD3153E10320320C93E03322520C34A1521032035C02A6420D6 +:201540000610CD24143E04322520AF32022006F7C3DC19000E00BCD49015BCD0C6100CC38B +:201560005A153A092065CD54154105DE106FC93A0A20CD5415DE1067C93E01328520C345BC +:201580001578070707808080813D6F3A672067C90CC610FA9015C93A0D20A7C2B71521A460 +:2015A0003ECDC515D006FE3E01320D20783208203A0E20320720C9212425CDC515D0CDF1D9 +:2015C00018AFC3A91506177EA7C26B162305C2C715C900CD7414E5C5E51AD304DB03772362 +:2015E00013AFD304DB0377E101200009C105C2D715E1C9CD11160100377EA7CAFF150C2376 +:2016000005C2F91579328220FE01C0216B203601C92E003A672067C93A1520FEFFC02110C1 +:20162000207E2346B0C03A2520A7C03AEF20A7CA52163A2D20A7C24816CDC017E610C83E3D +:2016400001322520322D20C9CDC017E610C0322D20C921252036012AED20237DFE7EDA63FB +:20166000162E7422ED207E321D20C937C9AFCD8B1ACD10193600CDCA092311F5201ABE1BA4 +:201680002B1ACA8B16D29816C38F16BED298167E1213237E12CD50193ACE20A7CAC916214F +:2016A000032811A61A0E14CD930A2525061B3A67200FDAB716061C78CDFF08CDB10ACDE716 +:2016C000187EA7CAC916C3ED0221182D11A61A0E0ACD930ACDB60ACDD609AF32EF20D305B8 +:2016E000CDD119C3890B310024FBAF321520CDD8140604CDFA18CD590AC2EE16CDD7192100 +:201700000127CDFA19AFCD8B1A06FBC36B19CDCA09237E11B81C21A11A0E04471AB8D22732 +:201720001723130DC21C177E32CF20C93A2520FE00C2391706FDC3DC190602C3FA180000CB +:20174000219B2035CC6D173A6820A7CA6D1721962035C02198207ED3053A8220A7CA6D17A5 +:201760002B7E2B772B36013E04329B20C93A9820E630D305C93A9520A7CAAA1721111A119D +:20178000211A3A8220BED28E172313C385171A3297202198207EE630477EE60F07FE10C267 +:2017A000A4173E01B077AF32952021992035C006EFC3DC1906EF2198207EA077D305C900F2 +:2017C0003A67200FD2CA17DB01C9DB02C91829601F1629B01D1429A11CFF0E29ED1D0C2900 +:2017E000DA100A29C21DFFC602F5DB0207DAF417F1C602C9F1C9AF32E02132E022C3D60974 +:20180000FE6EC8002184207EA7CA0707237EA7C00601C3FA18F5CDD609F121A21D0607234C +:2018200005C83DC21F18C91631001C1131401C0C31201C0731681DFF0000CD5618D8CD4C7A +:2018400018C33A18C50610CD3914C1C9C50E12CD930AC1C900000AFEFF37C86F030A670317 +:201860000A5F030A5703A7C921C22034234ECDD901473ACA20B8CA98183AC220E6042ACC40 +:2018800020C288181130001922C72021C520CD3B1AEBC3D3150000003E0132CB20C921500F +:2018A0002011C01B0610CD321A3E023280203EFF327E203E0432C1203A5520E601CAB81849 +:2018C0003A5520E601C2C0182111333E2600CDFF08C3B60A3100240600CDE601CD991C3EE9 +:2018E0000832CF20C3EA0A3A672021E7200FD023C906023A82203DC004C93A9420B0329442 +:2019000020D303C9210022C3C301CDD814C3971521E7203A67200FD823C90E1C211E2411BC +:20192000E41AC3F30821F820C3311921FC20C331195E2356237E23666FC3AD090E0721013B +:201940003511A91FC3F3083AEB2021013CC3B20921F420C33119CD5C1ACD630CCD2519CD01 +:201960002B19CD5019CD3C19C34719CDDC19C371163E01326D20C3E616CDD719CD4719C332 +:201980003C1932C120C92AA51F7EFECD3E40CAD70A0000000000000000003A1E20A7C2AC29 +:2019A00019DB01E676D672C03C321E20DB01E676FE34C9F5E53E31D303CDEC1001DA17CD48 +:2019C0003A18CDB10AAFD303D306E1F1C9000000003E0132E920C9AFC3D319003A9420A005 +:2019E000329420D303C9210127CAFA1911601C06104FCD3914793DC2EC190610CDCB147C75 +:201A0000FE35C2FA19C9217220461AE680A8C037C9322B241C16110D0A0807060504030216 +:201A200001342E27221C181513100E0D0C0B090705FF1A77231305C30011005E2356237E30 +:201A4000234E2346616FC9C506037C1F677D1F6F05C24A1A7CE63FF62067C1C921002436EA +:201A600000237CFE40C25F1AC9C5E51AB67713230DC26B1AE101200009C105C2691AC9CD5E +:201A80002E09A7C8F53D77CDE619F1210125E60FC3C50900000000FFB8FE201C109E0020AE +:201AA0001C30100B080706000C04260E15041126260F0B001804112426251B260E11261C98 +:201AC0000F0B001804111226011413130E0D260E0D0B18261B0F0B001804112626011413D1 +:201AE000130E0D262612020E1104241B252607083F12020E11042612020E1104241C25263E +:201B00000100001000000000027838783800F8000080008E02FF050C601C2030100100005D +:201B2000000000BB030010901C2830010400FFFF0000027604000000000004EE1C00000343 +:201B4000000000B604000001001D04E21C0000030000008206000001061D04D01C00000309 +:201B6000FF00C01C0000102101003000120000000F0B0018260F0B00180411241B25FC0017 +:201B800001FFFF00000020641DD0291802541D000800060000014000010000109E00201CE7 +:201BA0000003047814130821217E5C7E21C10000000001B898A01B10FF00A01B0000000025 +:201BC0000010000E05000000000007D01CC89B030000030478140B202344B8A8B8443300D5 +:201BE00000000000000000000001000001741F008000000000501C3000001C2700001C399C +:201C00000000030458E1B6E8E8B6E1580403000000000030481A2DB8FCB82D1A483000001E +:201C200000000000003344B8A8B84433000000000000E01051A3B4E8E8B4A35110E000009E +:201C40000000000C10193F94FE943F19100C00000000000000C1217E5C7E21C1000000005A +:201C600000000F1F1F1F1F7FFF7F1F1F1F1F0F00000401130307B30F2F032F4904030001BB +:201C8000400805A30A035B0F27270B4B4084114807993C7E3DBC3E7C992139230647C3E801 +:201CA000122626040011130726080D150012080E0D2626C43FC4000002102030000000009D +:201CC0000008492214814200428114224908000044AA1A88542210AA442254884A15BE3F12 +:201CE0005E2504FC0410FC1020FC2080FC8000FE0024FE1200FE0048FE900F0B00290000C0 +:201D00000107010101040B01060301010B090208020B04070A050205040607080A060A031B +:201D2000000000008000FF01FF03FF07330F330F330F330FFF0FFF0FFF0FF00FE03FF03F9C +:201D40003F4F3F8FFF07FF03FF0180000510153094979A9D05101505050510050510150566 +:201D6000100530100000000000040E5BF55B0E1C1C0E5BF55B0E04000000000020080218FE +:201D800048E1461B151B0C14620003163D9603000802512019000F0F0E1601000C0E0E0514 +:201DA00010203060504848484040400F0B0018092612130E0F0F080D0626130704261B1217 +:201DC000132626001104260E0D2613070408112616001826115E1F2108310E02CD930A21F4 +:201DE0000629115C0F0E12CD930AC3B60A26262626261600110D080D063826262626260028 +:201E0000001F2444241F0000007F494949360000003E414141220000007F4141413E0000C5 +:201E2000007F494949410000007F484848400000003E414145470000007F0808087F00000E +:201E40000000417F4100000000020101017E0000007F081422410000007F0101010100007D +:201E6000007F2018207F0000007F1008047F0000003E4141413E0000007F4848483000002C +:201E8000003E4145423D0000007F484C4A31000000324949492600000040407F40400000BF +:201EA000007E0101017E0000007C0201027C0000007F020C027F0000006314081463000022 +:201EC0000060100F106000000043454951610000003E4549513E00000000217F0100000094 +:201EE00000234549493100000042414959660000000C14247F04000000725151514E0000B2 +:201F0000001E29494946000000404748506000000036494949360000003149494A3C000093 +:201F200000081422410000000000412214080000000000000000000000141414141400003F +:201F40000022147F142200000003047804030000210A290E1211EE00CD930AC3D41D011866 +:201F6000020E0D06110013140B0013080E0D12260E0DD31D01010000010002010002010079 +:201F800060100F1060202344B8A8B84433000000080D120411132626020E080D11F81ECD88 +:201FA0003914C32E0FB10B4F1F021104030813260060100F106021217E5C7E21C1000000E4 +:201FC00000007D7D00000000000000FFB8FF801F109700801F000001D022201C1094002079 +:201FE0001C26040B040213110E020E080D26260B13032605110E0C00000808080808000048 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/searthin.zip b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/searthin.zip new file mode 100644 index 00000000..55b865a6 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/searthin.zip differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/searthina.zip b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/searthina.zip new file mode 100644 index 00000000..f598b497 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/searthina.zip differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/sivram.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/sivram.hex new file mode 100644 index 00000000..528fe6af --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/sivram.hex @@ -0,0 +1,449 @@ +:1000000000000100000000000000000000000000EF +:1000100000000000000000000000000000000000E0 +:1000200000000100000000000000000000000000CF +:1000300000000000000000000000000000000000C0 +:1000400000000100000000000000000000000000AF +:1000500000000000000000000000000000000000A0 +:10006000000001000000000000000000000000008F +:100070000000000000000000000000000000000080 +:10008000000001000000000000000000000000006F +:100090000000000000000000000000000000000060 +:1000A000000001000000000000000000000000004F +:1000B0000000000000000000000000000000000040 +:1000C000000001000000000000000000000000002F +:1000D0000000000000000000000000000000000020 +:1000E000000001000000000000000000000000000F +:1000F0000000000000000000000000000000000000 +:1001000000000100000000000000000000000000EE +:1001100000000000000000000000000000000000DF +:10012000004201000000000000000000000000008C +:10013000000000000000000000000000000032008D +:10014000004101000000000000000000000000006D +:100150000000000000000000000000000000490056 +:100160000049010000000000000000000000000045 +:100170000000000000000000000000000000490036 +:100180000059010000000000000000000000000015 +:100190000000000000000000000000000000490016 +:1001A00000660100000000000000000000000000E8 +:1001B0000000000000000000000000000000260019 +:1001C000000001000000000000000000000000002E +:1001D000000000000000000000000000000000001F +:1001E000000001000000000000000000000000000E +:1001F00000000000000000000000000000000000FF +:1002000000000100000000000000000000000000ED +:1002100000000000000000000000000000000000DE +:1002200000000100000000000000000000000000CD +:1002300000000000000000000000000000003E0080 +:1002400000000100000000000000000000000000AD +:10025000000000000000000000000000000041005D +:10026000000001000000000000000000000000008D +:10027000000000000000000000000000000041003D +:10028000000001000000000000000000000000006D +:10029000000000000000000000000000000041001D +:1002A000000001000000000000000000000000004D +:1002B00000000000000000000000402600002200B6 +:1002C000000001000000000000000000000000002D +:1002D00000000000000000000000000F000000000F +:1002E000000001000000000000000000000000000D +:1002F00000000000000000000000801F000000005F +:1003000000000100000000000000000000000000EC +:1003100000000000000000000000400F000000008E +:1003200000000100000000000000000000000000CC +:1003300000000000000000000000002F3E003E0012 +:10034000000F01000000000000000000000000009D +:1003500000000000000000000000800F4500410088 +:10036000001F01000000000000000000000000006D +:1003700000000000000000000000001F49004100D4 +:10038000001F01000000000000000000000000004D +:100390000000000000000000000040265100410065 +:1003A000001F01000000000000000000000000002D +:1003B0000000000000000000000000003E003E00C1 +:1003C000001F01000000000000000000000000000D +:1003D000000000000000000000000000000000001D +:1003E000007F01000000000000000000000000008D +:1003F000000000780078000000000000000000000D +:1004000000FF01000000FF0F0000000000000038A6 +:100410000038001D001D0019000000000000000051 +:10042000007F01000000FF1F000000000000007AB4 +:10043000007A00BE00BE003A000000003E007F00CF +:10044000001F01000000FF3F000000000000007FCF +:10045000007F006C006C006D00000000450048004B +:10046000001F01000000FF7F000000000000006D81 +:10047000006D003C003C00FA0000000049004C0008 +:10048000001F01000000FFFF00000000000000EC62 +:1004900000EC003C003C00FA0000000051004A0063 +:1004A000001F01000000FCFF00000000000000FA37 +:1004B00000FA003C003C006D000000003E003100EE +:1004C000000F01000000F8FF00000000000000FA2B +:1004D00000FA006C006C003A000000000000000010 +:1004E000000001000000F0FF00000000000000EC30 +:1004F00000EC00BE00BE001900000000000000007B +:10050000000001000000F0FF000000000000006D8E +:10051000006D001D001D0000000000000000000034 +:10052000000001000000F0FF000000000000007F5C +:10053000007F007800780000000000003E007F008F +:10054000000F01000000F0FF000000000000007A32 +:10055000007A000000000000000000004500490093 +:10056000001F01000000F0FF000000000000003844 +:1005700000380000000000000000000049004900B1 +:10058000001F01000000F0FF00000000000000005C +:1005900000000000000000000000000051004900C1 +:1005A000001F01000000F0FF00000000000000003C +:1005B0000000000000000000000000003E004100BC +:1005C000001F01000000F8FF000000000000000014 +:1005D000000000000000000000000000000000001B +:1005E000007F01000000FCFF000000000000000090 +:1005F000000000780078000000000000000000000B +:1006000000FF01000000FFFF0000000000000038B4 +:100610000038001D001D001900000000000000004F +:10062000007F01000000FFFF000000000000007AD2 +:10063000007A00BE00BE003A000000003E00080044 +:10064000001F01000000FF7F000000000000007F8D +:10065000007F006C006C006D00000000450014007D +:10066000001F01000000FF3F000000000000006DBF +:10067000006D003C003C00FA000000004900220030 +:10068000001F01000000FF1F00000000000000EC40 +:1006900000EC003C003C00FA00000000510041006A +:1006A000001F01000000FF0F00000000000000FA22 +:1006B00000FA003C003C006D000000003E0000001D +:1006C000000F01000000000000000000000000FA20 +:1006D00000FA006C006C003A00000000000000000E +:1006E000000001000000000000000000000000EC1D +:1006F00000EC00BE00BE0019000000000000000079 +:100700000000010000000000000000000000006D7B +:10071000006D001D001D0000000000000000000032 +:100720000000010000000000000000000000007F49 +:10073000007F00780078000000000000000000004A +:100740000000010000000000000000000000007A2E +:10075000007A0000000000000000000000002100FE +:100760000000010000000000000000000000003850 +:1007700000380000000000000000000000007F00C2 +:100780000000010000000000000000000000000068 +:100790000000000000000000000000000000010058 +:1007A0000000010000000000000000000000000048 +:1007B0000000000000000000000000000000000039 +:1007C0000000010000000000000000000000000028 +:1007D0000000000000000000000000000000000019 +:1007E0000000010000000000000000000000000008 +:1007F0000000007800780000000000000000000009 +:1008000000000100000000000000000000000038AF +:100810000038001D001D001900000000000000004D +:100820000000010000000000000000000000007A4D +:10083000007A00BE00BE003A000000000000000088 +:100840000000010000000000000000000000007F28 +:10085000007F006C006C006D000000000000410093 +:100860000000010000000000000000000000006D1A +:10087000006D003C003C00FA000000000000220077 +:10088000000001000000000000000000000000EC7B +:1008900000EC003C003C00FA0000000000001400E6 +:1008A000000001000000000000000000000000FA4D +:1008B00000FA003C003C006D000000000000080051 +:1008C000000001000F00000000000000000000FA1E +:1008D00000FA006C006C003A00000000000000000C +:1008E000000001001F00000000000000000000ECFC +:1008F00000EC00BE00BE0019000000000000000077 +:10090000000001001F000000000000000000006D5A +:10091000006D001D001D0000000000000000000030 +:10092000000001001F000000000000000000007F28 +:10093000007F007800780000000000000000000048 +:10094000000001001F000000000000000000007A0D +:10095000007A00000000000000000000000000001D +:10096000000001007F0000000000000000000038CF +:10097000003800000000000000000000000000003F +:1009800000000100FF000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A000000001007F00FF0F0000000000000000B9 +:1009B0000000000000000000000000000000000037 +:1009C000000001001F00FF1F0000000000000000E9 +:1009D0000000000000000000000000000000000017 +:1009E000000001001F00FF3F0000000000000000A9 +:1009F0000000007800780000000000000000000007 +:100A0000000001001F00FF7F000000000000003810 +:100A10000038001D001D001900000000000000004B +:100A2000000001001F00FFFF000000000000007A2E +:100A3000007A00BE00BE003A0000000000007F0007 +:100A4000000001000F00FCFF000000000000007F1C +:100A5000007F006C006C006D0000000000000800CA +:100A6000000001000000F8FF000000000000006D21 +:100A7000006D003C003C00FA00000000000008008F +:100A8000000001000000F0FF00000000000000EC8A +:100A900000EC003C003C00FA0000000000000800F0 +:100AA000000001000000F0FF00000000000000FA5C +:100AB00000FA003C003C006D0000000000007F00D8 +:100AC000000001000000F0FF00000000000000FA3C +:100AD00000FA006C006C003A00000000000000000A +:100AE000000001000000F0FF00000000000000EC2A +:100AF00000EC00BE00BE0019000000000000000075 +:100B0000000001000000F0FF000000000000006D88 +:100B1000006D001D001D000000000000000000002E +:100B2000000001000000F0FF000000000000007F56 +:100B3000007F007800780000000000003E00000008 +:100B4000000001000000F0FF000000000000007A3B +:100B5000007A000000000000000000004500410095 +:100B6000000001000000F8FF000000000000003855 +:100B700000380000000000000000000049007F0075 +:100B8000000001000000FCFF000000000000000069 +:100B900000000000000000000000000051004100C3 +:100BA000000001000000FFFF000000000000000046 +:100BB0000000000000000000000000003E000000F7 +:100BC000000001000000FFFF000000000000000026 +:100BD00000390000000000000000000000000000DC +:100BE000000001000000FF7F000000000000000086 +:100BF000007900780078000000000000000000008C +:100C0000000001000000FF3F00000000000000386D +:100C1000007A001D001D0019000000000000000007 +:100C2000000001000000FF1F000000000000007A2B +:100C3000006E00BE00BE003A000000003E0008004A +:100C4000000001000000FF0F000000000000007F16 +:100C500000EC006C006C006D000000004500080016 +:100C60000000010000000000000000000000006D16 +:100C700000FA003C003C00FA0000000049000800B7 +:100C8000000001000000000000000000000000EC77 +:100C900000FA003C003C00FA00000000510008008F +:100CA000000001000000000000000000000000FA49 +:100CB00000EC003C003C006D000000003E0008001D +:100CC000000001000000000000000000000000FA29 +:100CD000006E006C006C003A000000000000000094 +:100CE000000001000000000000000000000000EC17 +:100CF000007A00BE00BE00190000000000000000E5 +:100D00000000010000000000000000000000006D75 +:100D10000079001D001D0000000000000000000020 +:100D20000000010000000000000000000000007F43 +:100D30000039007800780000000000003E0032001A +:100D40000000010000000000000000000000007A28 +:100D50000000000000000000000000004500490005 +:100D6000000001000000000000000000000000384A +:100D700000000000000000000000000049004900E1 +:100D80000000010000000000000000000000000062 +:100D900000000000000000000000000051004900B9 +:100DA0000000010000000000000000000000000042 +:100DB0000000000000000000000000003E002600CF +:100DC0000000010000000000000000000000000022 +:100DD00000390000000000000000000000000000DA +:100DE0000000010000000000000000000000000002 +:100DF000007900780078000000000000000000008A +:100E000000000100000000000000000000000038A9 +:100E1000007A001D001D0019000000000000000005 +:100E20000000010000000000000000000000007A47 +:100E3000006E00BE00BE003A000000003E003E0012 +:100E40000000010000000000000000000000007F22 +:100E500000EC006C006C006D0000000045004100DB +:100E60000000010000000000000000000000006D14 +:100E700000FA003C003C00FA00000000490041007C +:100E8000000001000000000000000000000000EC75 +:100E900000FA003C003C00FA000000005100410054 +:100EA000000001000000000000000000000000FA47 +:100EB00000EC003C003C006D000000003E00220001 +:100EC000000001000000000000000000000000FA27 +:100ED000006E006C006C003A000000000000000092 +:100EE000000001000000000000000000000000EC15 +:100EF000007A00BE00BE00190000000000000000E3 +:100F00000000010000000000000000000000006D73 +:100F10000079001D001D000000000000000000001E +:100F20000000010000000000000000000000007F41 +:100F300000390078007800000000000000003E004A +:100F4000000001000000FF0F000000000000007A18 +:100F50000000000000000000000000000000410050 +:100F6000000001000000FF1F00000000000000382A +:100F70000000000000000000000000000000410030 +:100F8000000001000000FF3F000000000000000022 +:100F90000000000000000000000000000000410010 +:100FA000000001000000FF7F0000000000000000C2 +:100FB00000000000000000000000000000003E00F3 +:100FC000000001000000FFFF000000000000000022 +:100FD00000390000000000000000000000000000D8 +:100FE000000001000000FCFF000000000000000005 +:100FF0000079007800780000000000000000000088 +:10100000000001000000F8FF0000000000000038B0 +:10101000007A001D001D0019000000000000000003 +:10102000000001000000F0FF000000000000007A56 +:10103000006E00BE00BE003A0000000000007F000D +:10104000000001000000F0FF000000000000007F31 +:1010500000EC006C006C006D000000000000480017 +:10106000000001000000F0FF000000000000006D23 +:1010700000FA003C003C00FA0000000000004C00B8 +:10108000000001000000F0FF00000000000000EC84 +:1010900000FA003C003C00FA0000000000004A009A +:1010A000000001000000F0FF00000000000000FA56 +:1010B00000EC003C003C006D00000000000031002E +:1010C000000001000000F0FF00000000000000FA36 +:1010D000006E006C006C003A000000000000000090 +:1010E000000001000000F0FF00000000000000EC24 +:1010F000007A00BE00BE00190000000000000000E1 +:10110000000001000000F8FF000000000000006D7A +:101110000079001D001D000000000000000000001C +:10112000003E01000000FCFF000000000000007F06 +:1011300000390078007800000000000000007F0007 +:10114000004101000000FFFF000000000000007AE5 +:101150000000000000000000000000000000490046 +:10116000004101000000FFFF000000000000003807 +:101170000000000000000000000000000000490026 +:10118000004101000000FF7F00000000000000009F +:101190000000000000000000000000000000490006 +:1011A000002201000000FF3F0000000000000000DE +:1011B00000000000000000000000000000004100EE +:1011C000000001000000FF1F000000000000000000 +:1011D00000390000000000000000000000000000D6 +:1011E000000001000000FF0F0000000000000000F0 +:1011F0000079007800780000000000000000000086 +:1012000000000100000000000000000000000038A5 +:10121000007A001D001D0019000000000000000001 +:10122000007F010000000000000000000000007AC4 +:10123000006E00BE00BE003A00000000000000008A +:101240000048010000000000000000000000007FD6 +:1012500000EC006C006C006D00000000000000005D +:10126000004C010000000000000000000000006DC4 +:1012700000FA003C003C00FA000000000000000002 +:10128000004A01000000000000000000000000EC27 +:1012900000FA003C003C00FA0000000000000000E2 +:1012A000003101000000000000000000000000FA12 +:1012B00000EC003C003C006D00000000000000005D +:1012C000000001000000000000000000000000FA23 +:1012D000006E006C006C003A00000000000000008E +:1012E000000001000000000000000000000000EC11 +:1012F000007A00BE00BE00190000000000000000DF +:101300000000010000000000000000000000006D6F +:101310000079001D001D000000000000000000001A +:10132000007F010000000000000000000000007FBE +:101330000039007800780000000000000000320052 +:101340000049010000000000000000000000007AD9 +:101350000000000000000000000000000000490044 +:1013600000490100000000000000000000000038FB +:101370000000000000000000000000000000490024 +:101380000049010000000000000000000000000013 +:101390000000000000000000000000000000490004 +:1013A00000410100000000000000000000000000FB +:1013B0000000000000000000000000000000260007 +:1013C000000001000000000000000000000000001C +:1013D00000390000000000000000000000000000D4 +:1013E00000000100000000000000000000000000FC +:1013F0000079007800780000000000000000000084 +:1014000000000100000000000000000000000038A3 +:10141000007A001D001D00190000000000000000FF +:10142000007F010000000000000000000000007AC2 +:10143000006E00BE00BE003A0000000000003E004A +:101440000041010000000000000000000000007FDB +:1014500000EC006C006C006D00000000000041001A +:101460000041010000000000000000000000006DCD +:1014700000FA003C003C00FA0000000000004100BF +:10148000004101000000000000000000000000EC2E +:1014900000FA003C003C00FA00000000000041009F +:1014A000003E01000000000000000000000000FA03 +:1014B00000EC003C003C006D000000000000220039 +:1014C000000001000000000000000000000000FA21 +:1014D000006E006C006C003A00000000000000008C +:1014E000000001000000FF0F00000000000000EC01 +:1014F000007A00BE00BE00190000000000000000DD +:10150000000001000000FF1F000000000000006D4F +:101510000079001D001D0000000000000000000018 +:10152000000001000000FF3F000000000000007FFD +:101530000039007800780000000000003E003E0006 +:10154000004101000000FF7F000000000000007A61 +:101550000000000000000000000000004500410005 +:10156000007F01000000FFFF0000000000000038C5 +:1015700000000000000000000000000049004100E1 +:10158000004101000000FCFF00000000000000001E +:1015900000000000000000000000000051004100B9 +:1015A000000001000000F8FF000000000000000043 +:1015B0000000000000000000000000003E003E00AF +:1015C000000001000000F0FF00000000000000002B +:1015D00000390000000000000000000000000000D2 +:1015E000000001000000F0FF00000000000000000B +:1015F0000079007800780000000000000000000082 +:10160000000001000000F0FF0000000000000038B2 +:10161000007A001D001D00190000000000000000FD +:10162000004001000000F0FF000000000000007A10 +:10163000006E00BE00BE003A000000003E007F00C9 +:10164000004001000000F0FF000000000000007FEB +:1016500000EC006C006C006D0000000045004800CC +:10166000007F01000000F0FF000000000000006D9E +:1016700000FA003C003C00FA0000000049004C0069 +:10168000004001000000F0FF00000000000000EC3E +:1016900000FA003C003C00FA0000000051004A0043 +:1016A000004001000000F8FF00000000000000FA08 +:1016B00000EC003C003C006D000000003E003100EA +:1016C000000001000000FCFF00000000000000FA24 +:1016D000006E006C006C003A00000000000000008A +:1016E000000001000000FFFF00000000000000EC0F +:1016F000007A00BE00BE00190000000000000000DB +:10170000000001000000FFFF000000000000006D6D +:101710000079001D001D0000000000000000000016 +:10172000000001000000FF7F000000000000007FBB +:101730000039007800780000000000003E007F00C3 +:10174000000001000000FF3F000000000000007AE0 +:1017500000000000000000000000000045004900FB +:10176000000001000000FF1F000000000000003822 +:1017700000000000000000000000000049004900D7 +:10178000000001000000FF0F00000000000000004A +:1017900000000000000000000000000051004900AF +:1017A0000000010000000000000000000000000038 +:1017B0000000000000000000000000003E004100AA +:1017C0000000010000000000000000000000000018 +:1017D00000390000000000000000000000000000D0 +:1017E00000000100000000000000000000000000F8 +:1017F0000079007800780000000000000000000080 +:10180000000001000000000000000000000000389F +:10181000007A001D001D00190000000000000000FB +:10182000003E010000000000000000000000007AFF +:10183000006E00BE00BE003A000000003E0008003E +:101840000045010000000000000000000000007FD3 +:1018500000EC006C006C006D0000000045001400FE +:101860000049010000000000000000000000006DC1 +:1018700000FA003C003C00FA000000004900220091 +:10188000005101000000000000000000000000EC1A +:1018900000FA003C003C00FA00000000510041004A +:1018A000003E01000000000000000000002002FADD +:1018B00000EC003C003C006D000000003E00000019 +:1018C000000001000000000000000000005001FACC +:1018D000006E006C006C003A000000000000000088 +:1018E000000001000000000000000000008800EC83 +:1018F000007A00BE00BE00190000000000000000D9 +:101900000000010000000000000000000000006D69 +:101910000079001D001D0000000000000000000014 +:10192000003E010000000000000000000000007FF9 +:10193000003900780078000000000000000023005B +:101940000045010000000000000000000000007AD7 +:101950000000000000000000000000000000450042 +:1019600000490100000000000000000000000038F5 +:10197000000000000000000000000000000049001E +:101980000051010000000000000000000000000005 +:1019900000000000000000000000000000004900FE +:1019A000003E0100000000000000000000000000F8 +:1019B00000000000000000000000000000003100F6 +:1019C0000000010000000000000000000000000016 +:1019D0000000000000000000000000000000000007 +:1019E00000000100000000000000000000000000F6 +:1019F00000000000000000000000000000000000E7 +:101A000000000100000000000000000000000000D5 +:101A100000000000000000000000000000000000C6 +:101A200000000100000000000000000000000000B5 +:101A300000000000000000000000000000000000A6 +:101A40000000010000000000000000000000000095 +:101A50000000000000000000000000000000410045 +:101A60000000010000000000000000000000000075 +:101A70000000000000000000000000000000220044 +:101A80000000010000000000000000000000000055 +:101A90000000000000000000000000000000140032 +:101AA0000000010000000000000000000000000035 +:101AB000000000000000000000000000000008001E +:101AC0000000010000000000000000000000000015 +:101AD0000000000000000000000000000000000006 +:101AE00000000100000000000000000000000000F5 +:101AF00000000000000000000000000000000000E6 +:101B000000000100000000000000000000000000D4 +:101B100000000000000000000000000000000000C5 +:101B200000000100000000000000000000000000B4 +:101B300000000000000000000000000000000000A5 +:101B40000000010000000000000000000000000094 +:101B50000000000000000000000000000000000085 +:101B60000000010000000000000000000000000074 +:101B70000000000000000000000000000000000065 +:101B80000000010000000000000000000000000054 +:101B90000000000000000000000000000000000045 +:101BA0000000010000000000000000000000000034 +:101BB0000000000000000000000000000000000025 +:101BC0000000010000000000000000000000000014 +:101BD0000000000000000000000000000000000005 +:101BE00000000100000000000000000000000000F4 +:101BF00000000000000000000000000000000000E5 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceatt.e b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceatt.e new file mode 100644 index 00000000..e5002959 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceatt.e differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceatt.g b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceatt.g new file mode 100644 index 00000000..9368b825 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceatt.g differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceatt.h b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceatt.h new file mode 100644 index 00000000..9749116b Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceatt.h differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceatt.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceatt.hex new file mode 100644 index 00000000..b028dcf1 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceatt.hex @@ -0,0 +1,258 @@ +:020000040000FA +:20000000000000C3D4100000F5C5D5E5C38C0000F5C5D5E53E8032722021C02035CD5F1806 +:20002000DB010FDA67003AEA20A7CA42003AEB20FE99CA3E00CD3E1832EB20CD4711AF3253 +:20004000EA203AE920A7CA82003AEF20A7C26F003AEB20A7C25D00CDBF0AC382003A93206C +:20006000A7C28200C365073E0132EA20C33F00CD400F3A3220328020CD941ACD4802CD13FD +:200080000900E1D1C1F1FBC900000000AF3272203AE920A7CA82003AEF20A7C2A5003AC134 +:2000A000200FD28200212020CD4B02CD4101C38200CD8608E57E23666F220920220B20E1BF +:2000C0002B7EFE03C2C8003D320820FEFE3E00C2D3003C320D20C93E0232FB2132FB22C382 +:2000E000E40800000000000000000000000000000000000000000000000000000000000014 +:200100002102207EA7C2380DE53A06206F3A6720677EA7E1CA360123237E2346E6FE07076E +:20012000075F160021001419EB78A7C43B012A0B200610CDD30DAF320020C921300019EBB4 +:20014000C93A6820A7C83A0020A7C03A6720673A062016023CFE37CCA1016F4605C2540194 +:20016000320620CD7A0161220B207DFE28DA71117A3204203E01320020C916007D2109202B +:2001800046234EFE0BFA9401DE0B5F78C610477B14C3830168A7C85F79C6104F7B3DC39579 +:2001A0000115CACD012106203600234E3600CDD9012105207E3CE60177AF21672066C900E2 +:2001C000210021063736012305C2C501C9E1C93E0106E0210224C3CC0C234623798677231A +:2001E000788677C906C0110013210020C33212214221C3F8012142220E04112015D5062C6B +:20020000CD3212D10DC2FD01C93E01C31B023E01C31402AF114222C31E02AF114221328152 +:20022000200102162106283E04F5C53A8120A7C24202CD6912C1F13DC8D511E00219D1C33E +:200240002902CD7C0CC335022110207EFEFFC8FEFECA810223464FB079C27702237EA7C221 +:200260008802235E2356E5EBE5216F02E3D5E9E1110C0019C34B020504C27D023D05702BC4 +:200280007711100019C34B02352B2BC38102E1237EFEFFCA3B032335C047AF3268203269E2 +:2002A000203E30326A207836052335C29B032A1A200610CD240C2110201110130610CD3278 +:2002C000120600CDDC113A6D20A7C03AEF20A7C8310024FBCDD711CD2E09A7CA6D0ECDE7BD +:2002E000107EA7CA2C033ACE20A7CA2C033A6720F50FDA3203CD0E02CD78087323722B2BAC +:200300007000CDE401F10F3E210600D2120306203E22326720CDB60AAF32112078D3053C05 +:20032000329820CDD609CD7F12C3F907CD7F12C31708CD0902C3F802000000216820360151 +:20034000237EA7C3B003002B36013A1B20473AEF20A7C263033A1D200FDA81030FDA8E034B +:20036000C36F03CDC00F0707DA810307DA8E03211820CD3B12CD4712CD390C3E0032122081 +:20038000C978FED9CA6F033C321B20C36F0378FE30CA6F033D321B20C36F033CE601321500 +:2003A0002007070707217014856F221820C36F03C24A032335C24A03C34603112A20CD0629 +:2003C00012E1D0237EA7C8FE01CAFA03FE02CA0A0423FE03C22A0435CA36047EFE0FC0E52F +:2003E000CD3004CD520CE123342323353523353535233608CD3004C3000C3C773A1B20C608 +:2004000008322A20CD3004C3000CCD3004D5E5C5CD520CC1E1D13A2C20856F322920CD9117 +:200420000C3A6120A7C8320220C9FE05C8C33604212720C33B12CD3004CD520C2125201186 +:2004400025130607CD32122A8D202C7DFE63DA53042E54228D202A8F202C228F203A84202F +:20046000A7C07EE601012902C26E0401E0FE218A2071232370C9E13A32133232202A382050 +:200480007DB4C28A042B223820C91135203EF9CD50053A46203270203A5620327120CD63A9 +:2004A000053A7820A7213520C25B051130132130200610C33212E13A6E20A7C03A8020FE5C +:2004C00001C01145203EEDCD50053A36203270203A5620327120CD63053A7620FE10DAE7FF +:2004E000043A48133276203A7820A7214520C25B051140132140200610CD32123A82203D55 +:20050000C208053E01326E202A7620C37E06E11155203EDBCD50053A46203270203A362072 +:20052000327120CD63053A7620FE15DA34053A58133276203A7820A7215520C25B051150CE +:20054000132150200610CD32122A7620225820C9327F20217320060BC33212117320060B5B +:20056000C332122173207EE680C2C1053AC120FE043A6920CAB705A7C82336003A7020A7B5 +:20058000CA8905473ACF20B8D03A7120A7CA9605473ACF20B8D0237EA7CA1B062A76204EFB +:2005A0002300227620CD2F06D0CD7A0179C607677DD60A6F227B202173207EF6807723349A +:2005C000C9117C20CD0612D0237EE601C244062334CD75063A7920C603217F20BEDAE205E2 +:2005E000D60C3279203A7B20473A7E2080327B20CD6C063A7B20FE15DA12063A6120A7C8CA +:200600003A7B20FE1EDA1206FE2700D21206973215203A7320F601327320C93A1B20C60855 +:2006200067CD6F0D79FE0CDAA5050E0BC3A5050D3A6720676916057EA737C07DC60B6F15D6 +:20064000C23706C9217820357EFE03C26706CD750621DC14227920217C2035352B35353E28 +:2006600006327D20C36C06A7C0C37506217920CD3B12C3910C217920CD3B12C3520C224838 +:2006800020C9E13A8020FE02C02183207EA7CA0F053A5620A7C20F05237EA7C2AB063A828B +:2006A00020FE08DA0F053601CD3C07118A20CD0612D02185207EA7C2D606218A207E232357 +:2006C00086328A20CD8A19218A207EFE28DAF906FEE1D2F906C906FECDDC1123357EFE1FD6 +:2006E000CA4B07FE18CA0C07A7C006EF2198207EA077E620D305000000CD8319CDCB0C2115 +:200700008320060ACD5F0706FEC3DC113E0132F1202A8D20460E04215015114C151AB8CAFA +:20072000280723130DC21D077E3287202600682929292922F220CD8319C3F108CD4207C3A6 +:20074000390C218720CD3B12C3471206102198207EB077CD700F217C15228720C33C0711E4 +:200760008313C332123E01329320310024FBCD7911CD401921133011F3170E04CDF3083A58 +:20078000EB203D2110280E14C2570811CF12CDF308DB01E604CA7F070699AF32CE203AEB12 +:2007A00020802732EB20CD471121000022F82022FC20CD2511CD2B11CDD7112101017C32E5 +:2007C000EF2022E72022E520CD2F18CDEF01CDF501CDD10832FF2132FF22CDD700AFCDCAF1 +:2007E0001832FE22CDC001CD041121783822FC2122FC22CDE401CD7F12CD8D08CDD60900B1 +:20080000AF32C120CDCF013A67200FDA7208CD1302CDCF01CDB100CDDA180620CDFA10CDCF +:20082000180ECD0A11CDF30DCD88093A8220A7CAEF09CD0E0FCD3509CDD808CD2C0FCD596A +:200840000ACA49080604CDFA10CD750FD306CD0410C31F0800000011BA12CDF3080698DB7F +:20086000010F0FDA6D080FDA9807C37F073E01C39B07CD1A02C314083A0820472A0920EBE6 +:20088000C386080000003A6720672EFCC921112B1170130E0ECDF3083A67200F3E1C2111BB +:2008A00037D4FF083EB032C0203AC020A7C8E604C2BC08CDCA09CD3111C3A9080620211CA7 +:2008C000273A67200FDACB08211C39CDCB0CC3A908DB02E603C603C93A8220FE09D03EFBA2 +:2008E000327E20C93ACE20A7C0211C390620C3CB0C0E031AD5CDFF08D1130DC2F308C9113E +:200900000016E526006F29292919EBE10608D306C3390C3A0920FE78D02A91207DB4C22958 +:20092000092100063E013283202B229120C9CD110E2EFF7EC9CD10112B2B7EA7C80615DB25 +:2009400002E608CA48090610CDCA09237EB8D8CD2E09347EF521012524243DC258090610F5 +:20096000116014CD390CF13CCD8B12CD10112B2B36003EFF3299200610C3FA1021A015FEF0 +:2009800002D823FE04D823C9CDCA093AF120A7C8AF32F120E52AF220EBE17E8327775F233A +:2009A0007E8A277757237E23666FC3AD097ACDB2097BD5F50F0F0F0FE60FCDC509F1E60F2F +:2009C000CDC509D1C9C61AC3FF083A67200F21F820D821FC20C92102243600237DE61FFE31 +:2009E0001CDAE809110600197CFE40DAD909C9CD3C0AAF32E920CDD6093A6720F5CD5F1CFA +:200A0000F13267203A672067E52EFE7EC308197721A215233DC2130A7EE12EFC7723363872 +:200A20007C0FDA330A3E21329820CDF501CD0411C30408CDEF01CDC001C30408CD590AC24B +:200A4000520A3E3032C0203AC020A7C8CD590ACA470ACD590AC2520AC93A1520FEFFC93A60 +:200A6000EF20A7CA7C0A480608CDFA104178CD7C097E21F32036002B772B3601216220C9E0 +:200A80003E0232C120D3063ACB20A7CA850AAF32C120C9D51ACDFF08D13E0732C0203AC095 +:200AA000203DC29E0A130DC2930AC9215020C34B023E40C3D70A3E80C3D70AE1C372003AB2 +:200AC000C1200FDABB0A0FDA68100FDAAB0AC921142B0E0EC3290B32C0203AC020A7C2DADD +:200AE0000AC921C220060CC33212AFD303D305CD8211FBCDB10ACD2C19CD340BCDB10A1110 +:200B0000A01DC30B0B000000000000CDCF0ACDB10ACD1510CDB60AC34A0B2A081811150802 +:200B2000CD831BCAE601C3260BD51ACDFF08D13E0EC39B0A2118281108180E14CDF30821C0 +:200B4000162E0E08110018C3F308CDD6093AFF21A7C25D0BCDD10832FF21CD7F12CDE40175 +:200B6000CDC001CDEF01CD1A023E0132C120CDCF01CD180ECDF10BD306CD590ACA710BAF98 +:200B8000322520CD590AC2830BAF32C120CDB10ACD88110E0C21112C119017CDF3083AEC90 +:200BA00020FE00C2AE0B2111333E02CDFF08019C17CD5610CD4C10DB0207DA931801A017F2 +:200BC000CD3A10CDB60A3AEC20FE00C2DA0B11D517CDE20ACD800ACD9E1021EC207E3CE631 +:200BE0000177CDD609C3DF1011AB15CD930AC30B0BCD0A11C99A11130008130E26020E0F2E +:200C000000CD740C00C5E51AD304DB03B6772313AFD304DB03B677E101200009C105C20582 +:200C20000CC90000CD740CC5E5AF77237723E101200009C105C2270CC9C51A7713012000EC +:200C400009C105C2390CC90000000000000000000000CD740CC5E51AD304DB032FA67723C0 +:200C600013AFD304DB032FA677E101200009C105C2550CC97DE607D302C34712C5E57E125F +:200C800013230DC27E0CE101200009C105C27C0CC9CD740CAF326120C5E51AD304DB03F5C4 +:200CA000A6CAA90C3E01326120F1B6772313AFD304DB03F5A6CABD0C3E01326120F1B67727 +:200CC000E101200009C105C2980CC9AFC57701200009C105C2CC0CC93A2520FE05C8FE028C +:200CE000C03A2920FED847D2300D3A0220A7C878FECED2790DC606473A0920FE90D2040D37 +:200D0000B8D2300D68CD620D3A2A2067CD6F0D2264203E05322520CD810D7EA7CA300D3617 +:200D200000CD8C1BCD3B12CDD30D3E10320320C93E03322520C34A0D21032035C02A642053 +:200D40000610CD240C3E04322520AF32022006F7C3DC11000E00BCD4900DBCD0C6100CC3AB +:200D60005A0D3A092065CD540D4105DE106FC93A0A20CD540DDE1067C93E01328520C345DC +:200D80000D78070707808080813D6F3A672067C90CC610FA900DC93A0D20A7C2B70D21A480 +:200DA0003ECDC50DD006FE3E01320D20783208203A0E20320720C9212425CDC50DD0CDF1F1 +:200DC00010AFC3A90D06177EA7C26B0E2305C2C70DC900CD740CE5C5E51AD304DB03772392 +:200DE00013AFD304DB0377E101200009C105C2D70DE1C9CD110E0100377EA7CAFF0D0C2396 +:200E000005C2F90D79328220FE01C0216B203601C92E003A672067C93A1520FEFFC02110D1 +:200E2000207E2346B0C03A2520A7C03AEF20A7CA520E3A2D20A7C2480ECDC00FE610C83E5D +:200E400001322520322D20C9CDC00FE610C0322D20C921252036012AED20237DFE7EDA630B +:200E60000E2E7422ED207E321D20C937C9AFCD8B12CD10113600CDCA092311F5201ABE1BC4 +:200E80002B1ACA8B0ED2980EC38F0EBED2980E7E1213237E12CD50113ACE20A7CAC90E2187 +:200EA000032811A6120E14CD930A2525061B3A67200FDAB70E061C78CDFF08CDB10ACDE72E +:200EC000107EA7CAC90EC3ED0221182D11A6120E0ACD930ACDB60ACDD609AF32EF20D305D8 +:200EE000CDD111C3890B310024FBAF321520CDD80C0604CDFA10CD590AC2EE0ECDD7112130 +:200F00000127CDFA11AFCD8B1206FBC36B11CDCA09007E11B81421A1120E04471AB8D22785 +:200F20000F23130DC21C0F46C37919C93A2520FE00C2390F06FDC3DC110602C3FA100000FF +:200F4000C3A01935CC6D0F3A6820A7CA6D0F21962035C02198207ED3053A8220A7CA6D0F25 +:200F60002B7E2B772B36013E04329B20C93A9820E630D305C93A9520A7CAAA0F21111211B5 +:200F800021123A8220BED28E0F2313C3850F1A3297202198207EE630477EE60F07FE10C287 +:200FA000A40F3E01B077AF32952021992035C006EFC3DC1106EF2198207EA077D305C9000A +:200FC000DB01C90FD2CA0FDB01C9DB02C9DB02E604C83A9A20A7C03100240604CDD609056D +:200FE000C2DC0F3E01329A20CDD711FB11BC142116300E04CD930ACDB10AAF329A203293BD +:2010000020C3C90E2184207EA7CA0707237EA7C00601C3FA1021102811A3140E15CDF3086C +:201020003E0A326C2001BE15CD5610DA3710CD4410C32810CDB10A01CF15CD5610D8CD4CD5 +:2010400010C33A10C50610CD390CC1C9C53A6C204FCD930AC1C90AFEFF37C86F030A670342 +:201060000A5F030A5703A7C921C22034234ECDD901473ACA20B8CA98103AC220E6042ACC50 +:2010800020C288101130001922C72021C520CD3B12EBC3D30D0000003E0132CB20C921502F +:2010A0002011C0130610CD32123E023280203EFF327E203E0432C1203A5520E601CAB81069 +:2010C0003A5520E601C2C0102111333E2600CDFF08C3B60A3100240600CD1A0BCD27183E31 +:2010E0000832CF20C3EA0A3A672021E7200FD023C906023A82203DC004C93A9420B032944A +:2011000020D303C9210022C3C301CDD80CC3970D21E7203A67200FD823C90E1C211E2411D4 +:20112000E412C3F30821F820C3311121FC20C331115E2356237E23666FC3AD090E0721015B +:201140003511A917C3F3083AEB2021013CC3B20921F420C33111CD5C12CD1A11CD2511CD6D +:201160002B11CD5011CD3C11C34A19CDDC11C3710E3E01326D20C3E60ECDD711CD4711C377 +:201180003C1132C120C98B19C3D60921032811BE110E13C3F308000000003A1E20A7C2AC48 +:2011A00011DB01E676D672C03C321E20C93E07D3023E03D3013EFFD304DB0367AFD304DB80 +:2011C000036FC90E26020E110F0E110013080E0D283E0132E920C9AFC3D311003A9420A0CC +:2011E000329420D303C9210127CAFA1111601406104FCD390C793DC2EC110610CDCB0C7CA5 +:20120000FE35C2FA11C9217220461AE680A8C037C9322B241C16110D0A0807060504030226 +:2012200001342E27221C181513100E0D0C0B090705FF1A77231305C23212C95E2356237E3D +:20124000234E2346616FC9C506037C1F677D1F6F05C24A127CE63FF62067C1C921002436FA +:2012600000237CFE40C25F12C9C5E51AB67713230DC26B12E101200009C105C26912C9CD7E +:201280002E09A7C8F53D77CDE611F1210125E60FC3C50919280000FFB8FE2014109E002085 +:2012A00014200810060A06000C04260E15041126260F0B001804112426251B260E11261CBA +:2012C0000F0B001804111226011413130E0D260E0D0B18261B0F0B001804112626011413D9 +:2012E000130E0D262612020E1104241B252607083F12020E11042612020E1104241C252646 +:201300000100001000000000027838783800F8000080008E02FF050C60142030100100006D +:20132000000000BB03001090142830010400FFFF0000027604000000000004EE140000035B +:20134000000000B604000001001504E2140000030000008206000001061504D01400000331 +:20136000FF00C0140000102101003000120000000F0B0018260F0B00180411241B25FC0027 +:2013800001FFFF000000206415D02918025415000800060000014000010000109E00201CFF +:2013A000000304781413081A3D68FCFC683D1A00000001B898A01310FF00A0130000000043 +:2013C0000010000E05000000000007D014C89B030000030478140B193A6DFAFA6D3A190087 +:2013E000000000000000000000010000017417008000000000001C2F00001C2700001C39FD +:20140000000039797A6EECFAFAEC6E7A79390000000000781DBE6C3C3C3C6CBE1D7800009A +:2014200000000000193A6DFAFA6D3A19000000000000387A7F6DECFAFAEC6D7F7A38000030 +:201440000000000E18BE6D3D3C3D6DBE180E0000000000001A3D68FCFC683D1A00000000BE +:2014600000000F1F1F1F1F7FFF7F1F1F1F1F0F00000401130307B30F2F032F4904030001C3 +:20148000400805A30A035B0F27270B4B408411480F993C7E3DBC3E7C99271B1A260F0E08CF +:2014A0000D13122812020E110426000315000D0204261300010B04282030508013080B1380 +:2014C0000008492214814200428114224908000044AA1088542210AA442254884A15BE3F24 +:2014E0005E2504FC0410FC1020FC2080FC8000FE0024FE1200FE0048FE900F0B00290000C8 +:201500000107010101040B01060301010B090208020B04070A050205040607080A060A0323 +:20152000FF0FFF1FFF3FFF7FFFFFF0FFE0FFC0FF80FF00FF00FF00FF00FF80FFC0FFE0FFA0 +:20154000F0FFFFFFFF7FFF3FFF1FFF0F0510153094979A9D10050510151010053010101036 +:201560000515100500000000040C1E373E7C747E7E747C3E371E0C0400000000002200A553 +:201580004008983DB63C361D104862B61D98084290080000261F1A1B1A1A1B1F1A1D1A1A8F +:2015A00010203060504848484040400F0B00183E03D302CDB511EBC3AD11030411120E2CD8 +:2015C00068150C2C20140A2C4014082C0014FF0E2EE0150C2EEA150A2EF415082E9914FFC4 +:2015E0002738260C181213041118271D1A260F0E080D1312271C1A260F0E080D131200003B +:20160000001F2444241F0000007F494949360000003E414141220000007F4141413E0000CD +:20162000007F494949410000007F484848400000003E414145470000007F0808087F000016 +:201640000000417F4100000000020101017E0000007F081422410000007F01010101000085 +:20166000007F2018207F0000007F1008047F0000003E4141413E0000007F48484830000034 +:20168000003E4145423D0000007F484C4A31000000324949492600000040407F40400000C7 +:2016A000007E0101017E0000007C0201027C0000007F020C027F000000631408146300002A +:2016C0000060100F106000000043454951610000003E4549513E00000000217F010000009C +:2016E00000234549493100000042414959660000000C14247F04000000725151514E0000BA +:20170000001E29494946000000404748506000000036494949360000003149494A3C00009B +:20172000000814224100000000004122140800000000000000000000001414141414000047 +:201740000022147F142200008181FF8181FF8181241B260E11261C260F0B00180411122530 +:201760002626281B260F0B0018041126261B26020E080D260101000001000201000201008C +:2017800060100F106030181A3D68FCFC683D1A00080D120411132626020E080D0D2A50173E +:2017A0000A2A6217072AE117FF021104030813260060100F106038193A6DFAFA6D3A19005E +:2017C0000020404D50200000000000FFB8FF80171097008017000001D02220141094002076 +:2017E00014281C260F0B0018041112261C26020E080D120F141207260008080808080000E9 +:201800000F110412040D1312150803040E2606000C04122624140A25260B130304112608C5 +:201820000D1500030411122139230647C334182140230640AF772305C23518C35611DB0255 +:2018400007D258183A3C23A7C254183E01323C233AEB20C9AF323C233AEB20C60127C9DBDC +:2018600001E680C2D5183A3D23A7CACD0F3AEB20FE99CA8C18DB02073AEB20D28318C603C2 +:20188000C38518C6062732EB20CD4711AF323D23C3CD0F019C18CD3A10C3C30B0A2AA61864 +:2018A000072AB818FF00281B260F0B0018041126261C26020E080D12281C260F0B00180413 +:2018C0001112261E26020E080D12DB00E604000F0F32FE21C93E01C38D183A6720672EFE4C +:2018E0007EFE03FAE8183E03473A7E1390327E20C3D111931D70EF352A2BADF02CEF1F891E +:20190000BC39E9F2AAB2281EFE07FA0F193E063C77F53A6720672EFE7EFE03FA20193E03FB +:20192000473A7E1390327E20F1C3100A21142B0E0E1124140608CD390C0DC23119C3661A26 +:20194000AF32E02132E022C3D6093EFFE63F6FD61C672B7EFE01C27219360023347EE67F40 +:20196000FE13FA721936113E08070767AF94C60B6F343E11673E476FE93A8220E60F803202 +:20198000CF20C9AF324323C342073A4323A7C2DA193241233A8C20A7FAD0193E01C3D2194D +:2019A0002A39237DB4C2AE19210020323B232B3A3B2386323B232239237CB5C2C7193A3B77 +:2019C000232FFE17C2CD19219B20C3430FCDCD193EFF3248233E013243233DC2061ACD5661 +:2019E0001ACAFF193A41233C324123FE04C23C073E02324323AF324223324123C33C07AF0B +:201A0000324123C33C07CD561ACA231AAF3241233A42233C324223FE04C23C07AF324223E2 +:201A2000C33C07AF3242233A41233C324123D607C23C073241233A4023A7C23C073A65206A +:201A4000B70000002A892011F702192244233E01324023C33C072A8920CD47127DD6116FAA +:201A60000610CDC70DC92ACA14247C85C6086F7E2104280E1511F318FE11FA841A24240E75 +:201A800011111C1D1A13D55F16121ACDFF08D10DC2841AC93A4023A7CA801BFAF61A3A94EC +:201AA00020EE08329420D3032A44230603CD240C2A442311FCFF19224423CD47127DE61FD6 +:201AC000FE04C2ED1A112000197EA7CA721B3E01321520210000224623AF32402332412349 +:201AE0003A9420E6F7329420D303C3801BFE03C2721BAF3241233A4623A7C20C1B2F324098 +:201B00002323224423112000192246230608CDFA10AF2A4623772A442377214023357EE65E +:201B200007CAD31A1120002A4623192246232A442311E0FF19224423EB3A1B20FE30CA659F +:201B40001B2A1A20CD471201E00109CD831BCACE1A2A4623EB2A1A20CD471201400009CDB9 +:201B6000831BCACE1A2A442336FF2A462336FFC3801B2A4423CD740C11891B0603CD390C7B +:201B8000C300017CBAC07DBBC9F81FF8C53A8220FE01CA431C4FE5CDCA097EE1814F3A6411 +:201BA0002081B7E2431CE53A6720672EFE7EFE04FAB51B3E03074F060021471C094E234628 +:201BC000C52A6420CD47127CC1E1B9FA431CB8F2431C7DA7FA431CFE37F2431C2BF5FE0012 +:201BE000CA101CFE0BCA101CFE16CA101CFE21CA101CFE2CCA101C7E3601FE00C2101CE52B +:201C00002A64201100F019114F1C0610CDD30DE1F12323FE0ACA431CFE15CA431CFE20CA50 +:201C2000431CFE2BCA431CFE36CA431C7E3601FE00C2431C2A642011001019114F1C061048 +:201C4000CDD30DC1C35F0A33312C372A39283B0000000000237CFC7C23000000000000CD56 +:201C6000AE1D1AA7CA751C4F131A6F131A6713CD930AC3621CCDB10A3E14211824F5E53EF1 +:201C80000EF51100140610CD390CF13DC2811CE12BF13DC27D1CCDB10ACDAF15CD831B212D +:201CA0003E233600C2B01C233600C24C19C3B11C3421182411F41C3E14F5E51A4F131A4734 +:201CC00013D53E0EF5781F47791F4FC50610DAD71CCDCB0CC3DD1C111014CD390CC1F13DD8 +:201CE000C2C41CD1E12BF13DC2B91CCDB10ACDD609C3E4010000CC0CE803FC0FFC0FCE1C01 +:201D0000CE1CFC0FFC0FFE1F1E1E1C0EF807F003F807300318063C0F2C0D0000C97096DECD +:201D2000351A2A8919531D49E31FE18FB413182816040B0B26030E0D042604001113070B7E +:201D4000080D06111629130708122613080C0426180E142616080D101430262626262626AA +:201D6000262626262626262626260D122B0D0E1626030E26010013130B040E102B1608135F +:201D800007260E14112612140F0411060E2F050E1102041200BAC6DA847649B060F7409878 +:201DA000120F0002042600131300020A2629AFD303112D1DC95FE0D2021F599164AD11DF8F +:201DC000FFFD9FDE9EDFBDFFFDDA97DD7FD9BCDDFBF9FFD1BFB49DB7DFFBD7F6DE80FFB0D6 +:201DE000DFDDF68FF67FF5DFFFFFFF9BBD99DEBFBFF5FFFDFDB777DD9FFC9BFBFDBDFFF735 +:201E00003D2C40049D9C54557AA4C21A3511B15FD13D54E5401784BED49C539450160596AB +:201E2000DF5CD0DFC156CD307CAF54D751FE9783E77586FB8DF740D3435E19B7E54453562E +:201E4000F49EB6FEFF7BBEFFDDDDFCFDD4F5FFB7F7F5B7A7B5FD9FDDBFF5DF7956FDFDBB44 +:201E6000D7A7F4D73FC59FED1BF59CF93DBFBEC9DFF7B7FCFDD5FFFFB7F59E95FF7BF7F6C2 +:201E8000F3F5F235E816D486379C8FF55D5E85FFDD87BD97B70FAADACB1958DE5AB7208C6C +:201EA0008B879DBE93DD2E7664FD048D11D5A01E5438D39F533D0C36A293519F0AA904BBA4 +:201EC000FC859FDCBDF79F76F3BF3DFBBE6FDFDDBFEDFDF9F7BFB9FFDEAD3DB5BBDCBEB7D1 +:201EE000FDB7D4B6B7DDDFF7DFBDBDB3BE3F9FFB94F5FFF1F7D5BBBDBFFFFDF0BFF7B7BF03 +:201F0000D0B4D936D0B714960A541A5E08790032D237DB36612D9E6ED5CFD6BDD5CF501382 +:201F2000D27CC8946FDE8CADA914FEC44016F0376488659EC834749E44CED5DC0ABC05FDED +:201F4000B21F9C9797DC96F59ED9BFC57C549CD65FB8BE949DFE9EDEBFA896F4BFF156D8F3 +:201F6000977E35C4DF9FBDF3CF90F36F9690D6B7D794F40D1CF8FCE2C49954B4FF9496E6DF +:201F80004D46207FD0CAC1348B0A6C6EC82E493F8036A449CEBA3036439001AF423EE5B06A +:201FA00010B455D60EAE10F5009462F304BD41154D8F809E0793C0A6888EC496D031682876 +:201FC00096D516D00FFF7179BDFCDCDCFCF97190B1DD96D5F5BC35F49FF474703218EF8549 +:201FE000210020AFF5F12B86F57DB4C2E51FF126002F6FC9FAC6BAF07C629ED3BF8CD1FD1E +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceenc1.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceenc1.hex new file mode 100644 index 00000000..eccba9ad --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceenc1.hex @@ -0,0 +1,258 @@ +:020000040000FA +:20000000310024C3A5070000C341000000000000C34D0000000000007EB7C835AF3CC90022 +:200020003A4320F620D300C97EB7C835C037C900DB02070707C383077E12052313C238007B +:20004000C9F5AF3211202F321020F1FBC9F53AD021B7C25800F1FBC9C5D5E5AF3210202F25 +:2000600032112000000000CD04010000CD3901CD4C07CDC900E1D1C1F1FB000000C921281D +:2000800020AFCD910077213D20CD97000000C3C901772377237723772377237723772377A0 +:2000A00023C92101203EFFBECA001C23BECA0C1C23BECA031CC30F1CDB02E630FE10CA06D5 +:2000C0001C0000000000C3A200213D20DB00E680CCDC00DF214020DFCCE800C97EB736040D +:2000E000C0CD9807342B2BC93A43201FD2F7003F173243203610C92B7EB7C835233A4320E5 +:200100001FC3EF002143207ED300232323237ED304C9214901DB002FE63F85D21F01246FEB +:200120007E322020218901DB0100002FE63F85D23301246F7E322120C9CDAF04CD6F05CD8E +:200140007204CD0705CD5C05C9DADADADADADADADAC8CEDAD4DADADADA686E7A74928C807B +:2001600086C2BCB0B6989EAAA408080808080808080808080808080808625C5056383E4AED +:2001800044080E1A14322C2026C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C09398A29DB6B1A7BB +:2001A000ACC0C0C0C0BBC0C0C0606060606060606060606060606060608E897F846B707A29 +:2001C00075606060606660606031002411F03F2128200609FF213D200605FFAF32D021320C +:2001E000A0213E0A0000AF21002001E02077230DC2ED0105C2ED01112820060921F03FFF42 +:20020000113D200605FF3EFF329F202140061143200602FF7E32472023110A200605FF21B6 +:200220009007F77C323920CDB707214C061168200620FF210C0711C0220640FF3EFF324F43 +:200240002032222032C42121000122E021212E26223720210004225C23AF32DE2232EE22D7 +:2002600021832A228A21000000000000003EFF32012032D02100C369032102243EFF061B5C +:20028000772305C280022B1120003E800618197705C28E022102243E010618197705C29BC6 +:2002A00002193EFF061B772305C2A6021118032184240E07CDD9021134032198240E07CD03 +:2002C000D902115003218F240E05CD0303115A03216E250E05CDEE02C906041A7713230594 +:2002E000C2DB02D5111C0019D10DC2D902C906031A77132305C2F002D5111D0019D10DC2BB +:20030000EE02C906021A77132305C20503D5111E0019D10DC20303C91CC7793EA2288A020A +:2003200082208A029C207A0EA0202A02A2284A021CC7893EF07DD10740105B00401055000A +:200340004010D1014010510040105100407CD107A803280138012801A803E0EEEE20A22A1C +:20036000E0A26E80A226E0EEEAC3E007B7C25A042A94202290202A96202292203A0A203212 +:2003800099203A0C20329A203A0B20329B20CDAA052AB42022B0202AB62022B2203A0E2038 +:2003A00032D1203A0D2032D2202199203EDD965F219B20CD6D0421C0200E103AD12047AF4B +:2003C00080F50707E60377238257DAED031DCAED03F1E63F0DC2C003804F0707E603825756 +:2003E00079DAEE03E63F1DC2D803C3EE03F13EDD93CD5F0422D320219A203EDC965F21C077 +:20040000200E103AD22047AF80F50F0F0F0FE60CB677231DCA2304F1E63F0DC208041E006C +:20042000C32404F13EDC93CD5F0422D5200021C02011A0200610FF2AD52022B6202AD320D1 +:2004400022B4203A9920CD5F042294203A9A20CD5F042296203EFF329F20FB00C369030F4A +:200460000F0F67F61F6F7CE61FC62467C97EC68457C92A90207EE6BF772A92207EE6EF77D6 +:200480002A94207EF640772A96207EF610772AB0207EE6DF772AB2207EE6F7772AB4207E7A +:2004A000F620772AB6207EF60877AF329F20C93A9820D307D3073A4320E6FDD30021A02079 +:2004C0007ED303237ED30B237ED313237ED31B237ED343237ED34B237ED353237ED35B2304 +:2004E0007ED383237ED38B237ED393237ED39B237ED3C3237ED3CB237ED3D3237ED3DB3ACD +:200500004320F602D300C9211E203A312007D212053421322035F034237EB7CA2405352169 +:200520001E2034C93A23200F0F0FE61F112E0683D23405145F1AE607772B1A0F0F0FE60FA6 +:20054000772B1A77E671C0C31F052139207EB7C83D77E60FFE0FC07ED60677C93A2220B7B0 +:20056000C83A6B20D660D26B053E00322320C9110606210000392295213A1E204F061426A4 +:20058000041A816F29F9E13680E136801305C27F05061426041A816F29F9E13600E1360001 +:2005A0001305C293052A9521F9C9473A9920D680FAF2054F3ABF21B7CACA05792F4F21478E +:2005C000207E915FF2D305C3EB052147207E915FFAEB057ED608577BCDFC05FE08D2E10576 +:2005E00051727ECDFC0580329820C97EC60857C3D705783298203E00324720C9C680D2035A +:20060000062F3CD680C90410303C445C667078A0A7B5C4E0E7F0F704040401072034405472 +:20062000606C7488A4B0BDD0E3ECF4010101878787878B8999B80D0B130919217979797978 +:200640000E010040205020800000000080D080D0000000000000D00080110000000000003A +:200660000000000000000000000000000800B020B0200010F030F0300101020401016838D8 +:2006800000102000FF0000000000000000000000000000000B00C020C0208010F030F03090 +:2006A000010102030101683880103000FF0000000000000000000000000000000E00C020E4 +:2006C000C0200011F030F030010104020101703800114000FF0000000000000000000000E7 +:2006E000000000000E00C020C0208013F030F030010106010101783880135000FF000000BC +:20070000000000000000000000000000000000000001000101FCD0300013010000000000C6 +:20072000000100010102D0100013000000000000000100010102D0100013000000080C00B5 +:20074000000000000000000000000000214F20AFBECA6E077721122034CDB800CD74073E54 +:20076000FF324F202165207E23772B3600C93EFF326520C921A0217ED301237ED309237EE2 +:20078000D311C9E60685D28A07246F5E2356EBC90045006000750090233423E5CDA107E15B +:2007A000C9CD2D50C9DB02E630FE10CA091CFE20CA235CFBC37E00CD265CB7CAAC02C37910 +:2007C000020000000000000000000000000000000000000000000000000000000000000017 +:2007E000210000397CFE24C200007DFE00C20000D3023A9F20C36C03000000000000000002 +:200800001F241F241F241F241F241F241F241F241F241F241F241F241F241F241F241F24A8 +:200820001F241F241F241F241F241F241F241F241F241F241F241F241F241F241F241F2488 +:200840001F243F245F247F249F24BF24DF24FF241F253F255F257F259F25BF25DF25FF2560 +:200860001F263F265F267F269F26BF26DF26FF261F273F275F277F279F27BF27DF27FF2720 +:200880001F283F285F287F289F28BF28DF28FF281F293F295F297F299F29BF29DF29FF29E0 +:2008A0001F2A3F2A5F2A7F2A9F2ABF2ADF2AFF2A1F2B3F2B5F2B7F2B9F2BBF2BDF2BFF2BA0 +:2008C0001F2C3F2C5F2C7F2C9F2CBF2CDF2CFF2C1F2D3F2D5F2D7F2D9F2DBF2DDF2DFF2D60 +:2008E0001F2E3F2E5F2E7F2E9F2EBF2EDF2EFF2E1F2F3F2F5F2F7F2F9F2FBF2FDF2FFF2F20 +:200900001F303F305F307F309F30BF30DF30FF301F313F315F317F319F31BF31DF31FF31DF +:200920001F323F325F327F329F32BF32DF32FF321F333F335F337F339F33BF33DF33FF339F +:200940001F343F345F347F349F34BF34DF34FF341F353F355F357F359F35BF35DF35FF355F +:200960001F363F365F367F369F36BF36DF36FF361F373F375F377F379F37BF37DF37FF371F +:200980001F383F385F387F389F38BF38DF38FF381F393F395F397F399F39BF39DF39FF39DF +:2009A0001F3A3F3A5F3A7F3A9F3ABF3ADF3AFF3A1F3B3F3B5F3B7F3B9F3BBF3BDF3BFF3B9F +:2009C0001F3C3F3C5F3C7F3C9F3CBF3CDF3CFF3C1F3D3F3D5F3D7F3D9F3DBF3DDF3DFF3D5F +:2009E0001F3E3F3E5F3E7F3E9F3EBF3EDF3EFF3E1F3F3F3F5F3F7F3F9F3F9F3F9F3F9F3FDF +:200A00009F3F00000000000000000004040404040004000A0A0A00000000000A0A1F0A1F66 +:200A20000A0A00041E050E140F0400031308040219180002050502150916000404040000A3 +:200A40000000000402010101020400040810101008040004150E040E1504000004041F04C2 +:200A600004000000000000000402000000001F000000000000000000000400000000000049 +:200A80000000000E11111111110E000406040404040E000E11100C02011F001F10080C100D +:200AA000110E00080C0A091F0808001F010F1010110E001C02010F11110E001F10080402B8 +:200AC0000202000E11110E11110E000E11111E10080700000000000000000000000400042F +:200AE000040200080402010204080000001F001F00000002040810080402000E110804043A +:200B00000004000E11151D0D011E00040A11111F1111000F11110F11110F000E1101010150 +:200B2000110E000F11111111110F001F01010F01011F001F01010F010101001E0101011965 +:200B4000111E001111111F111111000E04040404040E001010101010110E0011090503051B +:200B60000911000101010101011F00111B15151111110011111315191111000E11111111D6 +:200B8000110E000F11110F010101000E111111150916000F11110F050911000E11010E10E1 +:200BA000110E001F040404040404001111111111110E0011111111110A04001111111515AB +:200BC0001B110011110A040A11110011110A04040404001F10080402011F001F03030303C9 +:200BE000031F0000010204081000001F18181818181F000000040A110000000000000000DF +:200C000001269E26D327C6275A28AD27DD28C128852B9B29422AB42AD82A082BD02A0C2B9A +:200C2000432B952BD92B062C542C8A2CDD2C162D442D872DC92D182E572E992ED82E162FD6 +:200C4000462F8A2FD52F11305C308730C43005314B318E31D33117329B32CD3202334333B5 +:200C60008733D0330B3455349934D03417354E358535C835113656369836CE36043747373A +:200C80008D37D6371D3859389438D03805394F399639CC39093A5C3A983AD43A103B4C3BA4 +:200CA000843BC63B083C4A3C963CDC3C193D4A3D903DC63D0C3E543E9A3ECF3E093E443F88 +:200CC0008C3FD03FCDCE0CCDCB0FCD5A0DC9219721DFC2F00C36020602219921110A207EA5 +:200CE0008080771AD61ABED2EC0C36007ECD270D110A203AD720B7CA050D1A06069090D61B +:200D00001ACD270DC91A0602D61AF321000039229521260CE6FE6FF9E17EE6FE7705C218A1 +:200D20000D2A9521F9FBC9210000F339229521260CE6FE6FF9E17EF6017705C2350D2A95D1 +:200D400021F9FBC921112D7EF6017721CD2D7EF6017721922C7EF60177C9219B21DFC03A19 +:200D60001220E60FC60F773A9921E6FE260C6F5E23561AE6FE12C92A80217DB4C87E232250 +:200D80008021FEFFC2920D210000228021AF328421C9FEC0C29D0D3EFF328421C9070FD232 +:200DA000CD0D2A822147CDC20D78E61F477DE61F8047CDC20D78E61F477DE6E0B06F228236 +:200DC00021C9E660EB26006F29292919C9D62026006F29292911020A19EB2A822106083ACA +:200DE0008421B7C2F70DCD0A0E1100FF193E0100CDA50D228221C91A2F77137DC620D2026D +:200E00000E246F05C2F70DC3E90D1A77137DC620D2140E246F05C20A0EC9CD060FCD440E76 +:200E20003A122007E60E21340E85D22E0E246F5E2356EBE97E0E890E960EA10EAE0EB90E1E +:200E4000C60ED70E3A1220E60FC03A1220E610CA650E3A2A20B7C25B0E3E0A07070711C382 +:200E600025CD470FC93A5023B7C03A3020B7C2730E3E0A0707072A37202BCD310FC93A2977 +:200E8000200F11C425CD470FC93A292007070711C525CD470FC93A28200F11C625CD470F0E +:200EA000C93A282007070711C725CD470FC93A39200F11D925CD470FC93A39200707071193 +:200EC000DA25CD470FC93A5123FE01D03A2F200F2A3720CD310FC93A5123FE02D03A2F20B4 +:200EE0000707072A372023CD310FC93A5023B7C83A5123FE05D03E0A0707072A3720232392 +:200F00002323CD310FC9CDEB0E3A5123FE04D03A2E200707072A3720232323CD310F2A377A +:200F20002023233A5123FE03D03A2E200FCD310FC9E678C680EB21020A85D23E0F246F2349 +:200F4000EB0607CD0A0EC9E678470F0F80215D0F85D2550F246FEB060ACD0A0EC91C36636F +:200F60006363636363361C10181C1010101010107E1C36636030180C06037F7E4020101817 +:200F8000306063361C30282422217F202020207F0101011F306063361C30180C061F376355 +:200FA00063361C7F4020201010080804041C3663361C366363361C1C366363767C30180C92 +:200FC00006000000000000000000003AE321FE03D0C3440D000000000000000000000000E8 +:200FE0000000000000000000000000000000000000000000000000000000000000000000F1 +:20100000000000000800080008001C001C001C001C001C001C002A0055005500000000003C +:2010200000000000200020002000700070007000700070007000A80054015401000000005E +:2010400000000000800080008000C001C001C001C001C001C001A00250055005000000003E +:2010600000000000000200020002000700070007000700070007800A40154015000000000C +:201080000000000008001C003E001C000800080008005D007F007F007F0049004100000056 +:2010A0000000000020007000F80070002000200020007401FC01FC01FC0124010401000042 +:2010C000000000008000C001E003C001800080008000D005F007F007F00790041004000049 +:2010E0000000000000020007800F00070002000200024017C01FC01FC01F401240100000B5 +:201100000000000008001C003E002A002A002A003E003E002A0014001400220055000000AA +:201120000000000020007000F800A800A800A800F800F800A800500050008800540100001A +:20114000000000008000C001E003A002A002A002E003E003A0024001400120025005000024 +:201160000000000000020007800F800A800A800A800F800F800A00050005800840150000AA +:2011800003C00007E0000DB000199800118800918900D5AB00FDBF00FDBF00D5AB009189F2 +:2011A000001188001998000DB00007E00003C0000C00031C800334C002646002442002446A +:2011C000260254AF02F4FF02F4FF0254AF0244260244200264600234C0021C80030C0003B7 +:2011E00030000C70000ED0000B90810910810810990850BD0AD0FF0BD0FF0B50BD0A10996B +:2012000008108108908109D0000B70000E30000CC00030C0013840032C4006264004224014 +:20122000642240F52A40FF2F40FF2F40F52A40642240042240062640032CC00138C000309E +:20124000000000720200150500340500420500410500370200000000000000C809005414C8 +:2012600000D01400081500041500DC08000000000000002027005051004053002054001071 +:201280005400702300000000000000809C00404501004D01805001405001C08D00000000C8 +:2012A000F00F00FE7F009FF900FE7F00F81F00E00700300C00181800C03F00F8FF017CE6DA +:2012C00003F8FF01E07F00801F00C0300060600000FF00E0FF07F0990FE0FF0780FF010082 +:2012E0007E0000C30080810100FC0380FF1FC0673E80FF1F00FE0700F801000C03000606F2 +:201300000200070002000700020000000000000004000E0004000E00040000000000000091 +:2013200008001C0008001C00080000000000000010003800100038001000000000000000BD +:20134000200070002000700020000000000000004000E0004000E0004000000000000000CD +:201360008000C0018000C00180000000000000000001800300018003000100000000000062 +:2013800000000000080008001C001C001C0014003E003E002A007F006B00490055000000A7 +:2013A00000000000200020007000700070005000F800F800A800FC01AC0124015401000091 +:2013C0000000000080008000C001C001C0014001E003E003A002F007B0069004500500008B +:2013E00000000000000200020007000700070005800F800F800AC01FC01A401240150000C7 +:20140000CDFB152A7420444D216820CD7614C93A1220E603CAB4163DCADE163DCA0817C30A +:201420003217CD6F183A1220E601CA9C18C3C718000000000000CDD0141E10CD2A15C9CD1B +:20144000D0141E10CDB715C93A1220E603CABD193DCAE719C9C35E14C36C14C3931A3A6BC6 +:2014600020FE50D83EFF32C921C30014AF21C921BE77C0C30014C5E5E57DC6136F7EB7CA1D +:2014800088143600234E2346E1CDF1141E10CD4215E1C12323E5CDF1141E10CDCD15E1CD71 +:2014A000F215C9C5E5E57DC6136F7EB7CAB5143600234E2346E1CDD0141E10CD2A15E1C1C2 +:2014C0002323E5CDD0141E10CDB715E1CDF215C97E07070707E66081D2DC14044F7E0F0FD9 +:2014E0000FE61F5F236E26002929292929162419C97EE60132F0217E0FE603070707075F40 +:201500000781D20615044F7B81D20D15044FC3DD147EE60132F0217E0FE6030707075F0773 +:201520008381D22615044FC3DD140A2FA67703230A2FA677037DC61FD23C15246F1DC22A9D +:2015400015C97BB7C83AF021B7C28F150A2FA67703230A2FA67703230A2FA677037DC61E99 +:20156000D26415246F1DC24C15C90A57B717B6777A1703230A5717B6777A1703230A17B63E +:2015800077037DC61ED28915246F1DC26A15C90A2F573717A6777A1703230A2F5717A677D0 +:2015A0007A1703230A2F17A677037DC61ED2B115246F1DC28F15C90AB67703230AB6770395 +:2015C0007DC61FD2C715246F1DC2B715C97BB7C83AF021B7C26A150AB67703230AB6770320 +:2015E000230AB677037DC61ED2EC15246F1DC2D715C95E23562B2B722B73C9216B203A2225 +:2016000020B7CA5B143A9021B7C213163A5023B7CA191636C02B3678C93A212096DA6116D6 +:20162000C60E0F0F0F0FE60F86773A7220BED2321677CDA116216A203A202096DA57160FF8 +:201640000F0FE61F867779BED24F16CD6C167778BED8CD6C1677C90F0F0FF6E08677C34690 +:20166000160F0F0F0FF6F08677C33216F5E5D521A92136023A29200F0F0F0FE60FFE07DAC5 +:2016800084163E0711991683D28C16145F237EB7C295161A77D1E1F1C92D2D1E1E0F0F08C3 +:2016A000087E0F0F0FE61E219D1985D2AF16246F46234EC93A1022B7C82A0A22444D210377 +:2016C00022110922CD8017EB2B2BCD53182313CD53182A0C22444D210022CDA314C93A307E +:2016E00022B7C82A2A22444D212322112922CD8017EB2B2BCD53182313CD53182A2C224479 +:201700004D212022CDA314C93A5022B7C82A4A22444D214322114922CD8017EB2B2BCD53B3 +:20172000182313CD53182A4C22444D214022CDA314C93A7022B7C82A6A22444D21632211E1 +:201740006922CD8017EB2B2BCD53182313CD53182A6C22444D216022CDA314C9C57EB8DCA3 +:20176000AD177E9147DA7E17CDB5173AD720B7C27E17780F0F0FE61F477E9077C1C9C1C97E +:20178000E57DC60E6F7EB7E1C2BD173A0420B7C2BD17CD5C17E5CDA116E12B1B1B1BCDA2D8 +:2017A00017C97EB8DCAD177EB9D4B517C91AFE80D82F3C12C91AFE80D02F3C12C9CDC317C8 +:2017C000C395177EB8DCAD173A6B20C618BED00600702B707DC60E6F7023702B2B2B2B46CD +:2017E0002B4EE5CDF117E17DD60C6FCD3614C1C1C97DC6076FAFBEC877234E2346C9CD04CC +:2018000018C39517E57DC60E6F7EB7C23618E17EB8DC40187EB9D80600702B707DC60E6F2C +:20182000702B2B2B462B4E7DD60C6FCD11151E08CD4215C1C1C97DC6056FEFE1C0C3171869 +:201840001AFE80D82FC605121B1B1B1AD60212131313C93A6620B7CA5F18CD63182B2BCD92 +:201860006318C97E233523C02B77231A8612C93ACF22B7CA641921C42211C222CD531823AB +:2018800013CD53182ACC22444D2ACA221ABCDA3819BDD2381921C022CDF218C93ADF22B7C8 +:2018A000C821D42211D222CD53182313CD53182ADC22444D2ADA221ABCDA1E19BDD21E1912 +:2018C00021D022CDF218C93AEF22B7C821E42211E222CD53182313CD53182AEC22444D2AB6 +:2018E000EA221ABCDA1E19BDD21E1921E022CDF218C9C5E5CD0E191E05CD2A15E1C12323B7 +:20190000E5CD0E191E05CDB715E1CDF215C97E07070707E67081D21A19044FC3DD14EB2B21 +:201920002B2BE5CD0E191E08CD2A15E12323CDF2157DC60F6F3600C9AF32C62232C9223273 +:20194000CF22EB2B2B2BCD0E191E08CD2A1521884322CC223E0432F6222AC02211FEFF1949 +:2019600022F722C921F622EFDA7319C8CD8019CDB715C9CD8019CD2A1521001322CC22C9C6 +:201980002ACC22444D21F722CD8E191E08C97E070707E63081D29919144FC3DD1410E0103C +:2019A000E010E05C9650A046AA3CB432BE28C81ED214DC0AE60AE60AE60AE60AE63A902239 +:2019C000B7C82A8A22444D218322118922CDFE17EB2B2BCD53182313CD53182A8C22444D6D +:2019E000218022CD111AC93AB022B7C82AAA22444D21A32211A922CDFE17EB2B2BCD531834 +:201A00002313CD53182AAC22444D21A022CD111AC9C5E5E57DC6136F7EB7CA231A36002342 +:201A20004E2346E1CD111522F121E1E51E08CD751A2AF121CD4215E1C12323E5CD1115225D +:201A4000F121E1E51E08CD541A2AF121CDCD15E1CDF215C923567DC6066F7EFE7FD87DC69D +:201A60000E6F3A0A207792DA721A5F1C3E08BBD05FC91E00C923567DC6086F7EFE7FD87D38 +:201A8000C60E6F7E92DA901A5F1C3E08BBD05FC91E00C9CD131B216A20116E203A0420B7BA +:201AA000C24C1B1A86773ED0BEDAE51A3E20BED2E51A1313131A2386773E40BEDAC01A777A +:201AC0003ED0BED0AF32C02132C3213EFF322220217B20BECADE1A772A7420227C20218011 +:201AE00011227420C97721C221EFC01A2F3C121313133E02123AC0212F32C021AF32D720D5 +:201B00003262202190217E2323B6C2121B3EFF32D920C921C121EFC036033EFF217B20BE03 +:201B2000CA2A1B772A7420227C2021C321343AC021B7CA371B35357EE6030721804085D26C +:201B4000431B246F5E2356EB227420C91A86773EDFBEDA831B3E01BED2831B1313131A2306 +:201B600086773AC221B7CA701B3E40BEDA701B773ED0BED03A89213D3289213EFF32D92026 +:201B8000C3C41A21FFFF226A2021A0217EE6FB7721C221EFC01AFE80DA9D1B2F3C121313A1 +:201BA000133E02123E0032C021AF32D720326220CDCE1B3E30326B203A8921C60307070740 +:201BC000326A201100012AE0211922E021C92A8A212B228A212311D0430608CD0A0EAF321F +:201BE000F421C9000000000000000000000000000000000000000000000000000000000007 +:201C0000C3751CC3C21CC3121CC3005CC31B1DC3241D0000000000003EFF324E20214D2055 +:201C20007E36FFB7CC1250AF320120CDC40CCD2214CD5514CD0048CD0A48CD0D48CD770D8D +:201C4000CD1201CD1A0ECD0044CD0744CD0050CD0350CD0650CD0950CD1648CD771DCD2483 +:201C600050CD5814CD2750CD4814CD0F14000000000000E7C9000000000000CDC40CCD2242 +:201C800014CD5514CD0048CD0D48CD770DCD1A0ECD0744CD0050CD0350CD0650CD0950CD12 +:201CA000881DCD5814CD2750CD4814CD0F14CD1A5C000000000000000000000000CD0C507D +:201CC000E7C9000000000000CDC40CCD2214CD5514CD0048CD0A48CD0D48CD770DCD1201F7 +:201CE000CD1A0ECD1550CD0044CD0744CD0050CD0350CD0650CD0950CD1648CD2450CD587D +:201D000014CD2750CD4814CD0F14CD1A5C000000000000000000000000E7C9210220AF77F6 +:201D20002F2377C9000000000000CDC40CCD2214CD5514CD0048CD0D48CD770DCD1201CD06 +:201D40001A0ECD1850CD1B50CD0044CD0744CD0050CD0350CD0650CD0950CD1648CD2450D3 +:201D6000CD5814CD4814CD0F14000000000000000000000000E7C921A0217EE6FB77DB00CE +:201D8000E680C07EF60477C9215A233EFFBEC2591ECDDC1F2190217E2323B6C0CD895A2AE5 +:201DA0005C23CD0F50225C23CA6B1ECDBE1DCD2F1ECD101ECD4E1ECD641FCD1C48C93A12F8 +:201DC00020E61FFE0FC03A2220B7C83A1220070707E60621001E85D2DB1D246F5E23561A97 +:201DE000B7C07BD6105F01081E3A1220070707E60681D2F61D044F0A6F030A670620FFC984 +:201E0000102230225022702274069C06C406EC063A1220E660C02121203A1220E680CA28CA +:201E20001E3EB034BED077C93E9035BED877C93A1220E601C02120201126201A8677FE20BB +:201E4000D2471E3E0112C9FEC0D83EFF12C921C521EFC036FF2336FFC9773EB0322120118E +:201E6000AD592198280E05CDEE02C93EFF32F12232F22232DE2232EE22CDC31ECD8C1ECDB4 +:201E80001F1FCD411FCD641FCD1C48C93A5E23B7C29A1ECD2F1ECD101EC9CDB51ECDA11E97 +:201EA000C93A1220E601C02121203E80BEC8DAB31E343435C92120203E74BEC8DAC11E3409 +:201EC0003435C93AF62221CF22B6C03A5E23B7C2E11ECD0F1FC821C521EFC0361E2336FF9E +:201EE000C93AE321FE03D2021F3EFF3260233AB122B7C03AA222FE8CD0FE60D821C62136A5 +:201F0000FFC9216023EFC036FF21C62136FFC93A1022213022B6215022B6217022B6C93A21 +:201F20005E23B7C021FFFF22E021AF32E321CD0F1FC021010022E021215E2336FF23361042 +:201F4000C9215F23EFC02B7EB7C83AE221B7C0AF7732F12232F22232DE2232EE222100063E +:201F6000225C23C92A80217DB4C02A6123CD0F50226123C0CD9E1F216323347EE601CAB5B2 +:201F80001F218000226123116059212C280E0BCDD902118C592130280E0BCDEE02C9212884 +:201FA000281113000E0B060DAF772305C2A81F190DC2A61FC921000422612321C81F2280E7 +:201FC00021214228228221C92020202020202020494E5345525420434F494EFF11BC592163 +:201FE0003B280E0BCDEE023A4120070707217C28CD310FC90000000000000000000000005D +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceenc2.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceenc2.hex new file mode 100644 index 00000000..35d56194 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/spaceenc2.hex @@ -0,0 +1,258 @@ +:020000040000FA +:2000000000000000000004003400360036000E000F006F002F00310001000000000000004F +:2000200000000000000000007000FC00F001E003400078001800B0010000000000000000FF +:20004000000000000000000200020002800F900FB007200700034001C00180000000000009 +:200060000000000000000010001F000780078007C012C012803700320000000000000000AF +:20008000884048410842C84203C00007E0000DB000199800118800918900D5AB00FDBF00B4 +:2000A000FDBF00D5AB009189001188001998000DB00007E00003C0000C00031C800334C097 +:2000C0000264600244200244260254AF02F4FF02F4FF0254AF0244260244200264600234C6 +:2000E000C0021C80030C000330000C70000ED0000B90810910810810990850BD0AD0FF0BA6 +:20010000D0FF0B50BD0A109908108108908109D0000B70000E30000CC00030C001384003C9 +:200120002C40062640042240642240F52A40FF2F40FF2F40F52A4064224004224006264089 +:20014000032CC00138C00030F800008C0000CE00007F0000390000F90100ED0300E70700A5 +:20016000E0E700C0B700809F00009C0000FE00007300003100001F00E00300300200380375 +:2001800000FC0100E40000E40700B40F009C1F00809F0300DF02007E0200700200F8030025 +:2001A000CC0100C400007C00800F00C00800E00C00F00700900300901F00D03E00707E00BA +:2001C000007E0E007C0B00F80900C00900E00F00300700100300F001003E00002300803304 +:2001E00000C01F00400E00407E0040FB00C0F90100F83900F02D00E02700002700803F00E4 +:20020000C01C00400C00C007FFFF0003C000C663008C3100F81F00800100C00300E0070006 +:20022000E00700C00300800100F81F008C3100C6630003C000FFFF00FCFF030C0003188F21 +:200240000130C600E07F00000600000F00801F00801F00000F00000600E07F0030C6001873 +:200260008F010C0003FCFF03F0FF0F30000C603C06C0180380FF01001800003C00007E00D8 +:20028000007E00003C0000180080FF01C01803603C0630000CF0FF0FC0FF3FC0003080F1F6 +:2002A0001800630C00FE0700600000F00000F80100F80100F00000600000FE0700630C802C +:2002C000F118C00030C0FF3F001F0000310000730000FE00009C00809F00C0B700E0E7006D +:2002E000E70700ED0300F901003900007F0000CE00008C0000F80000007C0000C40000CC10 +:200300000100F803007002007E0200DF02809F039C1F00B40F00E40700E40000FC0100386A +:200320000300300200E0030000F00100100300300700E00F00C00900F809007C0B007E0E9E +:20034000707E00D03E00901F00900300F00700E00C00C00800800F0000C00700400C00C052 +:200360001C00803F00002700E02700F02D00F839C0F90140FB00407E00400E00C01F0080C6 +:200380003300002300003E00080036004100220041003600080000002000D8000401880024 +:2003A0000401D80020000000800060031004200210046003800000000002800D40108008C9 +:2003C0004010800D0002000041636B7F6B63410000000000000000000000000000000000A1 +:2003E0000000000000000000000000000000000000000000000000000000000000000000FD +:20040000CDF044CD0D44C9C30F45C372443AD920B7C83AE221B7C22844AF211022BECA38CE +:2004200044213022BECA3844AF215022BECA3844217022BECA3844C93A1923B7CAA8443D1B +:200440003219237DD6106FEB2A1A232220232222237DD60C6F221A232120230620FF7BD637 +:20046000165F3A5623C602E607325623471A9012C9C9210322110D000113007E19FE2FD251 +:2004800085447EB7C0097E19FE2FD290447EB7C0097E19FE2FD29B447EB7C0097E19FE2FF6 +:2004A000D2A6447EB7C0AFC9CD0A44C02103237E34FE04DABA443E023603000000E60307FC +:2004C000070747070780216C0685D2CE44246F1118230628FF217E47F73A03233D85D2E27E +:2004E00044246F7E321823CD2A50C3F0440000002118237EB7C83523342A1E23444D211CDE +:2005000023CD3F142A1C237DD60C6F221C23C901E3210AFE02D4AF4707E60E212B4585D27B +:200520002345246F5E2356EB5059E93B458545CD45E7453946FD461747344721E021CD6BEF +:2005400047C03A2220B7C83A9021B7C021E8217E07E6063401734581D25C45044F0A6F03EC +:200560000A6722E021EB342B36FF21EB21361E233600C90004000800020001EB360021B4C0 +:200580000022E021C93A2220B7CA7B453A1022213022B6C0E521EB21EF2336FFE1C0EB3444 +:2005A0001180222100580640FFCD8C5A3A0A203D32972232B72221F122360021000022D201 +:2005C0002221F32236FF21D9227E0777C93A912221B122B6CADC45EB34C30E463A902221E8 +:2005E000B022B6C0C3374721E621EFC03E52324B22326B22360321E521344E7EFE11D20B61 +:2006000046CD154621D058CD2946C9EB34C921AA0A225423C93A0A20C6119126006F29294C +:20062000292929110B2419EBC90609FF7BC617D23346145F0DC22946C93A5423FE83D26A99 +:200640004621E521354E7EFE00CA3747CD154621405806093E00121305C256467BC617D206 +:200660006346145F0DC8CD2946C921EA21EFC03607CDD546CD96472190227E2F23B6C82198 +:20068000B0227E2F23B6C811AC2C2A5423E506081AE6E04F7EB112237BC620D29F46145F9F +:2006A00005C29046E1E511B02C06081AE63F4F7E0F0FE6C0B112131AE6F84F7E0F0FE60766 +:2006C000B112237BC61FD2CA46145F05C2AB46E12B225423C93AE5213DC84FCD154621D0AC +:2006E00058CDE546C906091AB612132305C2E7467BC617D2F746145F0DC2E546C9CD1847FD +:200700002143207EE6F37721E621EFC02143207EF60C77EB3434C9C90E10212B2C3E000676 +:2007200009772305C221477DC617D22E47246F0DC21D47C9CD184721E2213E0077237723F5 +:20074000772377237723773E38324B22326B222143207EF60C7721F322AFBECA6947772150 +:20076000D9227E071F1FE67F7700C97E23B62BC8D55E23561B722B737AB3D1C037C986476A +:200780008A478E479247040608080406080A06080A0C060A0C0E218E21EFC0360223AFBE0F +:2007A0002F77C811D04321AF2C0607CD0A0EC9C5F5D52190227E2F23B6C2D247EB2183227C +:2007C0003A6B20C60ABEDAD247EB2BCD805AD1F1C1C921B0227E2F23B6C2CE47EB21A322A9 +:2007E0003A6B20C60ABEDACE47C3C9470000000000000000000000000000000000000000E4 +:20080000CD1F48CD5C48CDFF49C9C35849C3694CC3574C000000C34C4EC3A94AC3BA4F3AFA +:200820001220E601C8CD984E3A2220B7C821C421AFBEC253483AF62221CF22B6C02BDB0079 +:20084000E640CA4A487EB7C835C97EB7C03601CDDE4BC92323BEC877CDDE4BC93ACF22B74C +:20086000C8210E222200232A0222111022CDAA49DA674B212E222200232A2222113022CDE9 +:20088000AA49DA674B214E222200232A4222115022CDAA49DA674B216E222200232A622202 +:2008A000117022CDAA49DA674B21D2222200232AD22211DF22CDC249DAD34921E2222200AA +:2008C000232AE22211EF22CDC249DAD349218E222200232A8222119022CD9549DAF64A214A +:2008E000AE222200232AA22211B022CD9549DAF64ACDF848DA2849C93AE321FE03CA0749D3 +:20090000FE04CA0749B7C921C3223AE5215747FE0ADA1649160A3A0A20C611908242571EF2 +:20092000800E0FC3B849001021000022C222CD3C493E0532E32121E6213620C93A5423C696 +:2009400007D6820F0F0FE60F672E00228621218621220023CD394CC93A2220B7C83A6B20D0 +:20096000FEC8D0D660D26A493E000F0F0F0FE60F218D4985D27849246F7E2134208677D055 +:20098000112E20218A49CD1048C9010000804020140C0806041AB7C8131AB7C0110E081986 +:2009A000EB21C322011210C3B8491AB7C811070D19EB21C322010B107A96B8D07B2B96B9EE +:2009C000D0C91AB7C811030519EB21C32201040AC3B8492A0023AF77237721000022C222BB +:2009E000C91AB7C8131AB7C0110E0819EB216B20011E18C3B8492A002336E8CD1948C93A83 +:200A00002220B7C83A4E20B7C021D3222200232AD22211DF22CD4B4BDA5C4B21E32222003F +:200A2000232AE22211EF22CD4B4BDA5C4B2103222200232A0222111022CD3A4BDA9A4A2112 +:200A400023222200232A2222113022CD3A4BDA9A4A2143222200232A4222115022CD3A4BFD +:200A6000DA9A4A2163222200232A6222117022CD3A4BDA9A4A2183222200232A82221190F2 +:200A800022CDE149DAF64921A3222200232AA22211B022CDE149DAF649C92A002336E87D67 +:200AA000C60E6F36FFCD1948C9AF32222032D92021E3217EFE02DABB4A36073EFF32D72054 +:200AC00032622021000022C22222D22222E2223E1032C22111C02121712036FE3A6A2021DF +:200AE0006E20FE78DAEF4A36FE3EFF121B12C93602AF121B12C921000022C222CD394C2AD4 +:200B00000023E523232336FFE12BE5CD294BE1114012722B732B2B2B36002B2B2B36007DBE +:200B2000C6106F3610CDC04BC9462B4E7DC6076F3EFFBEC87723712370C91AB7C811060D2A +:200B400019EB216B2001161DC3B8491AB7C811030519EB216B20011315C3B8492A0023AFA2 +:200B6000772B77CD1948C921000022C222CD394C2A00232323233EFFBECAB34B772B2B2B7B +:200B80002BE5CD294BE1110040722B732B00002B36E02B36FC2B36012B36012B7EFE80D23C +:200BA000AE4B36042B36012B3601CDC04BC936FCC3A44B7DD60E6F36D02B3600CDC04BC9E1 +:200BC00021A62136FF237EB7C2D14B3601233601C936082336043AA1217EE6EF77C92A6AAA +:200BE0002001060211C022CD204C7E32C422237E32C62221C92236FC21CF2236FF3A6B2005 +:200C00000F0F0F0FE60F211C4E85D20E4C246F7E32CB2221A1217EF6207721A3213601C964 +:200C200009EB732372237323722B7EEBCDA74D212C4E85D2374C246FC93A0120B7C02A006B +:200C4000231186217E1223137E12AF1312218621112820CD1048C9B71A86271213231A8E12 +:200C6000271213231A8E2712C93A2220B7C83A1220E601CA924CC3794C21F2227EB7CA7039 +:200C80004D3A1220E606C0EB21EE227E23B6C0EBEFC921F1227EB7CACA4C3A1220E606C0B8 +:200CA000EB21DE227E23B6C0EBEFC901164E3A3920FEAACCC74CFE00CCC74C3A8C2181D2D8 +:200CC000C34C044F0A77C90303C922F1213AF322B7CD8B4D11D2222130227EB7CA974D2F30 +:200CE00023B6C02123223A6B20D62096D8D60A472B7EFE78DA5D4DCDD24D86D84F3A6A20A5 +:200D0000C61091D8FE10D07EC6034F121B1B1223137EC60A1213131279CDBC4D21F64D85C0 +:200D2000D2244D246F137E121313260179FE80D2344D26FF3AF522B77CCA3D4D84127BC6CF +:200D4000095F3EFF122AF121CDAB4C3E1032A42121A2217EE6FD7721A5213600C9CDD24D09 +:200D60004F7E91D84F3A6A2091D0FEF0D8C3074D22F1213AF422B7CD8B4D2150227E2F23A9 +:200D8000B6C021432211E222C3E64C3EFF32F522C03E0032F522C93AB022B7C8C3DF4F3A01 +:200DA0006B20D610C3EB4CFE38D2AE4D3E38FEB7DAB54D3EB7D6380F0FE61EC9FE40D2C3FD +:200DC0004D3E40FEBFDACA4D3EBFD6400F0F0FE60FC9D57EC603CDBC4D11064E83D2E14DC2 +:200DE000145F1A57780F0F0F0FE60F0E04AF92820DC2EF4DD1C901010101020304080804CB +:200E00000302010101011010100806040202040506070840404008040201010130303030D4 +:200E20003030303840485058606870780102030502030304010102010401080108FF04FFD6 +:200E400002FF01FF03FC02FD03FB01FECD714ECDA64ECD914F3A122007E60621694E85D20E +:200E6000634E246F5E2356EBE9F54E4D4F674F904F3A1220E607C03A6B20FECFDA814E3E7D +:200E8000CFD650D2884E3E000F0F0F2FE60F4721A1217EE6F0B077C921A321EFC03AA12128 +:200EA000E6DF32A121C93A1220E601C03ADF2221EF22B6CAD64E21A4217EB7C823EFC02BAC +:200EC000357E11E54E83D2CA4E145F1A237721A2217EEE0277C9AF32A42132A52121A22173 +:200EE0007EE6FD77C90000000000000000FF0001050003000211A12101A22121A6217EB793 +:200F0000C823EFD2194F0AE60CC2154F0AF60C023608C3194F0AE6F30223EFDA264FC02BF3 +:200F2000B6C02B3600C91AE610C23B4F1AF610123AA021F60432A0213604C91AE6EF123A5D +:200F40002220B7C83AA021E6FB32A021C921A0213A2220B7CA624F3AA121E610C07EE6FB97 +:200F600077C97EF60477C921AD213A4320E608C2814F360221A0217EF60477237EF61F7737 +:200F8000C9EFD021A0217EE6FB77237EE6E077C9C911A2211AE6DF12CDA14FC81AF6201215 +:200FA000C93AEC21FEFFC03AE321FE01C8FE02C8FE03C8000000000000C93A1220E603C0F0 +:200FC00001A22121A721EF7EFE08D00AE608C2D84F0AF608023610C90AE6F7023635C93AD0 +:200FE000B122B7C021A322C39F4D0000000000000000000000000000000000000000000012 +:20100000C3E950C36051C39B50C33350C3C651C3B652C35353C3B453C38E54C3D154000007 +:2010200000C32955C3AD55C31B56C36B56C32A52C3CE563A1220E607216222110222CA6768 +:20104000501122223DCA67501142223DCA6750EB1122223DCA67501102223DCA6750EB110D +:2010600022223DCA6750C91A96D26E502F3CFE04D023131A96D27A502F3CFE04D023232300 +:201080001313131AAEE680C02323231313131AAEE680C02B2B2B7E2F3C77C93AD720B7C83F +:2010A0003A1220E603211022CABF503D213022CABF503D215022CABF50217022C3BF507E7A +:2010C0002F23B6C07DD60E6F7EFED0D2D150C616772B3A4720D6802F3CBEDAE4507EC61039 +:2010E00077C3E8507ED61077C92162207EB723CA1551DF7E114051CD3851210E2086FE1077 +:20110000D8770F0FE63EC6062B773A0E200F0FE63F320B20C93A0E20FE80D0343E0FBED238 +:20112000235177115051CD3851210E2086FE80DA34513E8077C3025183D23D51145F1AC986 +:20114000FFFCF8F4F4F4F4F4F4F4F4F4F4F4F4F40303030303030202020202020202020212 +:2011600021D8203AD720B7CA8451DF7E11B651CD3851210A2086FEB8DA7D513EB877C6089A +:20118000320C20C97E3CE60FC28D513E0F7711A651CD3851210A2086FE40D29F513E4077F1 +:2011A000C610320C20C9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE0808080808080808080802 +:2011C000080808080808CDCD51CD6252C9CD2D502190211141201AFE09DADF513E0912B7E1 +:2011E000CA06527EB7C02F772377237721FF00224820CD385521E8522280212142282282AD +:2012000021AF32FF3FC93A3E20B723C214527EB7C02F77C9237EB7C02F77CD385521255316 +:20122000228021214228228221C9213E207EB7C8DB02E604CA4F527EB71F473E001777239A +:2012400023237E8077DB02E608C87E808077C94636002323237E8077DB02E608C87E808017 +:2012600077C93A2220B7C82A4820CD0F50224820C2BF52DAA1523A9021B7C821FFFF22E0C0 +:2012800021DB00E640C0CD175CAF21902177237723773201202F32022021412035CD125044 +:2012A000C921C95222802121A2292282213E0732E321CD145CC97DB4C82B7DB4C037C92AF5 +:2012C00080217DB4C0CD865AC9205052455353204649524520425554544F4E20544F2042F2 +:2012E0004547494E202020FF20202020202020594F55204841564520435245444954202030 +:201300002020202020FF2020202020202020202020202020202020202020202020202020EE +:2013200020202020FF202020202020494E53455254205345434F4E4420434F494E20202014 +:20134000202020FFE0EE6E202AA2E06EA68022A2E0E26ECD38553EFF32222032D92032E254 +:2013600021327B202A7420227C202180112274203E2032E6213E0532E321AF32C421114470 +:2013800053218E240E05CDEE02210000222820222E20AF322A203230203E0132A0212190CC +:2013A00007F77C323920AF32DE2232EE2232F12232F222C9CDD753213520EFC0363CCDE373 +:2013C00056CD4A05C0AF3235203A2220B7C821032036002336FFC93A1220E607FE07C0CD24 +:2013E0006F5701A22121AE21EFD2F1530AE6E302C923C2F8533600C9EFC036040AEE0C02B2 +:20140000C910203040211122CD2454213122CD2454215122CD2454217122CD2454213123CA +:20142000CD2454C93EFFBEC87DD6066F36402B36D02B36012B36012B3601C9217D23EFD0FD +:2014400021A2217EE6EF77C9CD3B543A1220E60FC0CDE3562139207E3600B7C2615436AA56 +:20146000C9CD6554C9CD295C217C2379BED83478327D2321A2217EF61077C93A2220B7C01A +:20148000CDE3563A8921B7C03EFF328D21C9CD4854CDD7533A5023B7C0CD0A48CD4957CD28 +:2014A0007B543A8D21B7C83A2220B7C83EFF32502332C42132C521CD385521C75422802191 +:2014C000210C28228221C947414D45204F564552FF3A5023B7C83A1220E60FFE04C021370D +:2014E0002035215223347EFE07D821512334FE0AD8C20C55112820212E20CD1048CD155582 +:201500002A2B20222E203A2D203230203A5223FE12D8C3C901212D20112A20CD2150D811C9 +:201520002B202128200603FFC91ABED8C02B1B1ABED8C02B1B1ABEC921000022C22222D2FE +:201540002222E222AF32D920AF32182332192321032206E80EFF7021112271212322702172 +:20156000312271214322702151227121632270217122712183227021A3227021A555F722B1 +:20158000E0213E0732E321216027AF0E0447772305C28E550DC28D55AF3280213281213E96 +:2015A000FF32C521C9000440058006C0073A1220E603FE03C011A22121A921EFDAD055C82A +:2015C0001AF60112CDF45521AA21EFD0CD1948C91AE6FE12233600CDE1552180112274205C +:2015E000C9F5217B203EFFBECAF255772A7420227C20F1C921AB21EFC03602237E2FB777E6 +:20160000CDE155218011CA17563A6A20FE7821C842DA1756214841227420C93A1220E603B4 +:20162000C021CA21EFC036FF23347E07E60621635685D23656246F5E2356EB7EB7C87DD6D0 +:201640000D6F7EFE40D82323233E80BEDA59563E02BEDA5756360335C93EFEBED261563697 +:20166000FD34C910223022502270223A0120B7C0CDB6563A1823470E0CAF8105C27A564759 +:20168000211C237E90E6F8D6080F0F0FE61F5F236E2C2C2C260029292929291624192258BA +:2016A00023EBD53A2E230FCD470FD1133A2E23070707CD470FC92A5823EBD53E0A07070758 +:2016C000CD470FD13E0A07070713CD470FC92A8A2123228A2111C8430608CD0A0E3E103266 +:2016E000F421C93A5023B7C03A8C21FE03D047DB02E630FE30C8C52128201186210603FF12 +:20170000118621212E20CD1048C1DB02E6034F070707814F780780815F160021D857192341 +:2017200023118821CD2150D83A89213C3289213A8C213C328C21CD305021AE2136102336DC +:201740000021A2213E10B677C93AEF22B7C03A4322C640216B2096DA6457AF32F4223E02EC +:2017600032E922C93EFF32F4223E0432E922C921F421EFC87EE60111C843CC86572A8A21AA +:201780000608CD0A0EC911D043C900000000000000000000000000000000000000000000A0 +:2017A000000000000000000000000000000000000000000000000000000000000000000029 +:2017C000000000000000000000000000000000000000000000000000002000004000008029 +:2017E0000000300000600000200100400000800000600100500000000100000200000000C4 +:20180000C040C0400101FC0101FEC030A0125002FF000000000000000000000000000000D7 +:20182000C050C0500101FC0101FEC030A0125002FF00000000000000000000000000000097 +:20184000F8FFFFFFFFFFFFFF0F080000000000000008080000C09C01000008080000C080C3 +:2018600001000008088EE3004180E33808085114013E40144508085114412241144508083B +:201880005114412A41144508085114412241144508085114013E40144508088EE3004180DD +:2018A000E33808080000C08001000008080000C09C0100000808000000000000000808002F +:2018C00000000000000008F8FFFFFFFFFFFFFF0FF8FFFFFFFFFFFFFF0F08000000000000F8 +:2018E0000008080000C09C01000008080000C08001000008089FE30041C0E7380808411413 +:20190000013E40104508084F144122C1134508085014412A0114450808501441220114459A +:2019200008085114013E40144508088EE3004180E33808080000C08001000008080000C0DC +:201940009C01000008080000000000000008080000000000000008F8FFFFFFFFFFFFFF0FC2 +:20196000FC90314602514AC931524A4949524A4909524A490992330909124A4949124AC9D9 +:2019800031124A4902114A49FC103246352505555505557502555702355502000000DDB99D +:2019A000034588024D8902458902C5B90B37371D515109315309515109573709F0FF01101F +:2019C0000001100001100001100001100001100001100001100001100001F0FF010000008E +:2019E0000000000000000000000000000000000000000000000000000000000000000000E7 +:201A00000000000000000000000000000000000000000000000000000000000000000000C6 +:201A20000000000000000000000000000000000000000000000000000000000000000000A6 +:201A4000000000000000000000000000000000000000000000000000000000000000000086 +:201A6000000000000000000000000000000000000000000000000000000000000000000066 +:201A8000C38F5AC3995AC3CA5AC3465BC3905B3A8C21FE02D8CD835AC97EB7C823A6C07DB6 +:201AA000D6086F7EFE70D07DD6076F3A6A2096DAC05A070707E607C604477DC6046F70C904 +:201AC000070707F6F8D604C3B95ADB02E630FE30C821CB5B11E0200609FFDB02E6034F07E8 +:201AE0000707814F060021D85709CD0E5BCD035BCD035BEB36FF21E02022802121A229220B +:201B00008221C9EB362C23362023EB2323232323CD2F5B2BCD1C5B2BCD1C5BC97E07070745 +:201B200007E60FC63012137EE60FC6301213C97E07070707E60FCA3D5BC63012137EE60FB8 +:201B4000C8C6301213C92A80217DB4C0CD7A5BDA705B3E2021E020BEC8061F772305C25BF0 +:201B60005B36FF21E02022802121A229228221C93AE020FE20C0CD865AC93E34210322BE73 +:201B8000D0212322BED0214322BED0216322BEC93A0420B7CAB25B3A12200F0F0FE60E21A6 +:201BA000BB5B85D2A75B246F7E328222237E32A222C93A8C21FE01D8C3975B30D8D8D84004 +:201BC000D0D020D0D0E0C03020E020424F4E55532041542000000000000000000000000059 +:201BE0000000000000000000000000000000000000000000000000000000000000000000E5 +:201C0000F3C32E5CC6A45A09674AB7FAA3667203C1DA5410C3B35EC3B45EC3B65EC32D5C0C +:201C2000C32C5CC3585EC3B75EC3BA5EC9C900000000000000000000000011000006002163 +:201C40000020707EA84F7DE60179CA525CB35FC3545CB257782F77AE4F7DE60179CA655C19 +:201C6000B35FC3675CB257237CFE40C2425CD30221002006007004C27B5C04237CFE40C2BA +:201C8000755CD30221002006007EA84F7DE60179CA985CB35FC39A5CB25704C29F5C04238B +:201CA0007CFE40C2895CD302210020AF77237CFE40C2AB5C3E08324320D3007BB2C22B5EBB +:201CC00021DE5C22802121102D228221CD1F5EC3ED5CD302DB00E680C2D25CC3ED5C5241C8 +:201CE0004D20544553545320474F4F44FF214F5E22802121812B228221CD1F5E21000022EC +:201D00007023AF327223CD305DCD305DCD305DCD305D210040227023CD305DCD305DCD308B +:201D20005DCD785DD302DB00E640C2245DC3C901CD375DCD6A5DC92A7023444D21000011C0 +:201D400000000A5F190379B7C2425D78E607C2425DEB60692270232172237E343421045C21 +:201D600085D2655D246F4E2346C979BBC2D95D78BAC2D95DCDBE5DC9CD375D606978060088 +:201D8000094F09444DCD6A5DC93A722311800121032D19D602C2925DE53A7223D6020F47BE +:201DA0003E4890EBCDA95DE1C9D5D62026006F29292901020A09EB0608CD0A0ED1C9CD89E6 +:201DC0005D232322822121D05D228021CD1F5EC9474F4F44FF424144FFD5CD895D23232299 +:201DE000822121D55D228021CD1F5E2A822123228221EBC1780F0F0F0FCD0D5E78CD0D5EE3 +:201E0000790F0F0F0FCD0D5E79CD0D5EC9C5E60FC630FE3ADA195EC607CDA95D13C1C9CD18 +:201E2000770D2A80217CB5C21F5EC9EBF91100240640210000390E10AF29DA3E5E2F1213A1 +:201E40003E1812130DC2385E05C2325EC3D25C524F4D2054455354FFAF32D02132A0213E0A +:201E60000AD30021002001E020AF77230DC26A5E05C26A5E2100240E1ACD925E1607CDA41C +:201E80005E15C27E5E0DC2795ECD925E000000C38C5E2323061B3EFF772305C2985E3601EF +:201EA000232323C92323061C3E01772305C2AA5E2323C9C9C9C9C93E00C906100E09C9436D +:201EC0004F5059524947485420313938302C2044415645204E4545444C4500000000000061 +:201EE0000000000000000000000000000000000000000000000000000000000000000000E2 +:201F00000000000000000000000000000000000000000000000000000000000000000000C1 +:201F20000000000000000000000000000000000000000000000000000000000000000000A1 +:201F4000000000000000000000000000000000000000000000000000000000000000000081 +:201F6000000000000000000000000000000000000000000000000000000000000000000061 +:201F8000000000000000000000000000000000000000000000000000000000000000000041 +:201FA000000000000000000000000000000000000000000000000000000000000000000021 +:201FC000000000000000000000000000000000000000000000000000000000000000000001 +:201FE0000000000000000000000000000000000000000000000000000000000000000000E1 +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/yosakdon.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/yosakdon.hex new file mode 100644 index 00000000..b546ca05 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/yosakdon.hex @@ -0,0 +1,226 @@ +:020000040000FA +:20000000C3B00E00FF00FF00C3400000FF00FF00C320023A0120B7CA87023A0020C33F02B8 +:20002000210A213E010625772305C22700C3BA162A1420E5CDCC08E10602CDF402C9FF0097 +:20004000F5C5D5E53A0020B7C25100E1D1C1F1FBC93A0120B7C28F013E01320120CD990084 +:200060003E58321020210224221120AFCD63083E5832132021023F221420AFCDD5083E04B9 +:200080003218203219203EFF324520324620DB02E603C603C3A900A900060E210220AF77FE +:2000A0002305C29F00323C20C9322C20CD000CAF32A323324C20C3061906193EFF324520EF +:2000C000324620CD000CC900FF00FF003AA023E601DB01C8DB02C9110C27215120060B0EC5 +:2000E00000CD1101110E27060B0E01CD110111102B06070E02CD110111122D06050E03CD5B +:20010000110111142F06030E04CD1101C3230100003EFF772371237323721414232305C2F0 +:200120001101C9215020113A0106251A7713232323232305C22B01C3200086456B42832098 +:200140008068103F7D647822703B60381E7466563630341B322F0D0818282D16133C0F0050 +:200160000625215220C57E235E2356E5213D07012000B7CA7B01093DC37201EB06020E108F +:20018000CD7708E1C123232305C26501C920003A1320B7C24B00CDCC00E610CAEF013A023C +:2001A00020B7C2C8013A0320B7C2C8013E01C319162A11207DE680112300C2C00111E30024 +:2001C000192221207E322320CDCC00E620CAD70100320420C32216320420CDCC00E640CA3F +:2001E000E90100320520C32216320520C32216AF320320C3C80135C3AB0DCD0616C3BF0EB8 +:20020000AF320620CDF402C30303DB02E6083E14C215023E09CD001C7EB7C83E08B047C922 +:20022000F5C5D5E5213E2035DB010FDA351AAF32A623C33C0200FF00FF00FF00C31300B74D +:20024000CA87023AA323B7CA5002CDC90DC387023A1020B7CA8D023A18203D321820C287AD +:20026000023E043218202A1120E5CD4708E1112000192211207CE601CD63083A10203D3282 +:200280001020FE20DA8D02E1D1C1F1FBC93A1320B7CABD0221192035C2870236042A142060 +:2002A000E5CDCC08E1CD80042214207CE601CDD508211320353E02CC3000C3870221EE0201 +:2002C0003A0720FE05DACB0221F1020103023A06203C320620BECAE20223040DC2D502C309 +:2002E000030378FE02CA0002CDF402C30303BA3E7C5E203EF5214233E5CDCC0878E1CDD5EC +:2003000008F1C92A16202B2216207DB4C21F03215307221620210720347EFE07CA151F3A19 +:200320000820B7CA4C032A2420111824CD0E17C23B03CDB303CDB314C37103E5CDB303E181 +:20034000CDD10C222420CD500BC371033A0920B7CA62032A242011183DCD0E17CA3203C35D +:200360003B032A26202B2226207DB4C27103C30E152A11203A0420B7CA8A03110224CD0E16 +:2003800017CA0004CD9703C300043A0520B7CA000411023FC37E03E5CD4708E13A0420B7D9 +:2003A000CAA903CD8004C3AC03CD7904221120CDE015C9C5D50E18C30F07BF03C3CD1E05CE +:2003C0003A3C20B14F3A3720B7C2D3033A3A20B7CAEA03E61FFE17DAE40306043E80324D83 +:2003E00020C3EA033E02B14F0000CD0A0223CD480BCD5B143AA023E6013E20C3E117FF0099 +:200400003A0220B7CA30052A21203A1A2047FEF02F321A20CA2B043A232077232221207E2A +:200420003223207DE61FFE1CD214057EA0C246043A2320B077C330053A1A202F47C3330416 +:20044000F6F077C33005E5F5C35014000705CA5804D24C040CC34C0479FE02D26304F1E14F +:20046000C33804CD79047EB7C28904CD8004CD80047EB7C28904C35E04D511200019D1C9AB +:200480007DD6206F7CDE0067C9F1E1E5000000000000EB7BE61F2140200E040600BEDAADF0 +:2004A00004040DC21A050E30061EC3CC0478FE02DAC1040E20E601061AC2CC040614C3CCCA +:2004C000040E10E601060BC2CC0406007AD6271F80210A215F160019722129207E81277701 +:2004E000237ECE002777237ECE002777E1CDC814CD0505210A2106257EB7C230052305C2F4 +:20050000F804C3600CAF3202203E173228203E0F321A20C9CD0505C3300523C39D04010005 +:20052000003A0220B7C83E04B14FC91A771323233A0F20B72F320F20C290062A1C203A0E35 +:2005400020B7C25405CD70152B221C207DE61FFE01CA6405CDCB05C3FB05002A2120CD7111 +:2005600006CD05052A112006000E4909EBCD7605221C20C3BA05210A21060BCDF205C29D4A +:200580000513060BCDF205C29D05130607CDF205C29D05130605CDF205C29D05133A0A2005 +:2005A000B7CAA9051B3DC2A005EB7CFE26D2B3052626C9FE3ED8263EC9003E01320E203A09 +:2005C0001E202FE607321E20C3FB053A1E204711EB05FE04CADA0511EF053A0E203235202F +:2005E000CD30153A3520320E20C90090606090A040A07EB7C02305C2F205C906092A1120C8 +:200600002323007EE660C21306CD790405C20306C34406EB2A2120EBCD0E17CA09067CFE48 +:2006200034DA2906FE36DA90067EFEFFCA09062A1120E5CD4708E1CD120B3A2C203D322C3D +:2006400020C3601A2A32207DE61FFE05D25506CD6906D229062A1C207DE61FFE05D290067F +:20066000CD6906DA9006C32906FE03D8CD801AC9007DD6806F7CDE006711850606010E0916 +:20068000CD5717C900925400C600C600549200002150200E0035CAA706110500190C79FE01 +:2006A00025CAE007C39506E5237EB72F77C2BF0623235E2356EB00CD0B07E1C3ED0600E539 +:2006C0000600210A21097EB7E1CABA06237EE52346236668CD1F07E17EC340142FE601F5CB +:2006E00078E6FE47F1B0772B2BC3BA060079FE233E3EDAF7063E7D77C399060079FE173E19 +:200700007DDA06073E3E77C3990600C5D50E10AF1120007723772B190DC21307D1C1C9C52A +:20072000E5213D071120003C3DCA310719C3280700EBE106020E10CD7708C1C900000000F0 +:2007400000000000000000000000000000000300070006FD0EFE16FF1FFE1FFD1D00000015 +:200760000000000000000000000000FD1DFE1FFF1FFE16FD0E0006000700030001000000F4 +:2007800000000000000001100338077806FD0EFE16FF1FFE1FFD1D78003800100000000054 +:2007A0000000000000100038007800FD1DFE1FFF1FFE16FD0E780638071003000100000034 +:2007C0000000000000080018003D04FE0EFF1FFE0E3D041800080000000000000000000021 +:2007E0002A1F202B221F207DB4C23A083A0A203C320A20FE07CA3A08FE0521E204D20308DB +:20080000211307221F200E002151207EB7C23308237E235E2356E5D5EB000000000000CD5D +:20082000B917D1E11B722B73232323C3D71708C3AB1700232335C3280800C38015003E015F +:20084000320B20C3870200C50E09CD5008C1C900D5E5C3680AAF23772377E1190DC2510870 +:20086000D1C900C5B7119508CA6E0811B1080E090603CD7708C1C978322D203A2D2047E50A +:200880001A77231305C28008E1D511200019D10DC27B08C90001000203000683BF0FFFFFFB +:2008A0001F81BF0FFF3F06833F0203F0FF01F0000001F00013F0FFAB3F02C73F0681BF0FA5 +:2008C000C7FF1FABBF0F13FF06010002C50E18CD5008C1C900C5B7113D0906030E0AC2EC63 +:2008E00008110A090E11CD7708C1C900FE01CAE6083D3DE5215B09114800B7CA0309193D00 +:20090000C3FA08EBE10E18C3E60803000003000007002019C02161E02181FB7B01FEEF0100 +:20092000FCFF01FEEF81FD216300221B002407000801001001002001004001008001002047 +:200940006100209380210BFD7D07FEFF01FCFF07FE7D0BFD219380FF61002001400001409D +:200960000001400001400001400001C001010001010001010001010001030001030001F7EB +:20098000030101032101832101832101FF7B01FFEFF9FFFFE9FF7F09FC210900200B0020A2 +:2009A0000F00000100010100010100010100010100010100010100010100210300210300D1 +:2009C000217F807B41C0EF81E0FF01F97F01FF21013F20010F20C10300E100003100000923 +:2009E00000000900000B00000F000003400003400005400009400011400021400041C0010C +:200A0000810101010101010101010301F90701F90F01091E01093C2109F82109F02109E08B +:200A20007B09C0EF0B80FF0F007F0100200100200100201B1B1B0DC28F0BC93E08323C20B1 +:200A4000CD7708C9004000B7C8FE08D2650A21710A111000193DC2540AEB21043106010EF2 +:200A600010CD7708C9C900001120003E0177C355080000000000000001010000000000007F +:200A800000000000000000010101010000000000000000000000010101010101000000004C +:200AA00000000000010101010101010101010000000101010101010101010101010101011D +:200AC0000104040A0A0A1515151515150A0A0A04041824245A5AA5A5A5A5A5A55A5A24245D +:200AE0001800000011F00A06020E10CD5717C90000000000800088089006261208080000BB +:200B0000000008082612900688088000000000001120111D0B06020E15C33B0AC9FF010F72 +:200B2000010F000F000F000F000F000F000F0007000F000F003F001F000F000700030003AC +:200B400000030003000300007EB7C83E08B047C93A0C20FE10119D0BDA630BFE18CA6A0BBF +:200B600011CD0B3C320C20C36E0BAFC3640B0E1806023A0820B7CA7D0BCD7708C9CD880BC7 +:200B8000C9AF320C20C3A603E5212E0019EBE1E51A7723131A77E1CD7904C3330A1800700A +:200BA00000E800D80130023005200420042002100408080810082008400AE00410022004D3 +:200BC00020C240214711980AA004C004800003000E001D003B004600A60084F8850642034F +:200BE000200620082006100310060818082004200420024002800440088012601D0440085D +:200C0000CD99002143072216203E043218203219203EF0321A20210C2E221C203E04321EAF +:200C200020211307221F2021E2042226203A45203C324520324620320720320A20CDD70026 +:200C40003A0A20B7C24B0CCD6001C9470E25110500CD9B0CCDB60C3DC2540CC3C10C0000E7 +:200C6000CDAA0C2102240EE0E50619AF772305C26C0CE1CD79040DC2680CCD2C1CCD000CD4 +:200C8000AF210224221120CD63080602214233CDD508CD671BCDAA0CC3870221532047355D +:200CA00005C29F0C190DC29E0CC90603CD761AD30605C2AC0CC92140203523352335233522 +:200CC000C9CD6001CDB015C92A1120CDCC08C900003A0C20FE10DADC0CE601C03A0820B707 +:200CE000CAE70CCD8004C9CD7904C9F53E01321320CDBD03CDAA0CAF323C20321320214D51 +:200D0000207723CDE818CDC80CF1CAAB0D2102242211203A3D20B7C2F618CD6308C38702FC +:200D20000000CD8A0D2A1120CD630821A023347EE601CA5A0D213021CD6F0D3AA023FE0157 +:200D4000C24A0DAF320120C3500D216022CD820D3E20D305C38702000000216022CD6F0DEB +:200D6000213021CD820DAFD305C387020000001100200130011A7713230B790000B0C2753D +:200D80000DC9110020EBC3720D002102240EE0E50619AF772305C2930DE1CD79040DC28FAD +:200DA0000DCD671BCD2C1CC90000003AA023E601C2BB0D3E0132A123C3BE0D32A2233E0192 +:200DC00032A32332A423C3EA0F3AA323B7C83AA423B7C4360EAF32A4233A18203D32182066 +:200DE000C03E043218203AA5233D32A523CA100E2A1120E5CD631AE1CD80042211202A1419 +:200E000020E5CDCC08E1CD7904221420CD650EC9AF32A323D303CD8A0D3A3D20B7C22B0E78 +:200E2000AFD3053C320B20E1C39D0ECDEF1800C2200EE1C32B0D00CDF60F3E043218203EE7 +:200E40004832A52321142D2211202102352214203E21D3033AA023E6013E20C25F0EAFF6A2 +:200E600010D305C9007DE680113A0906030E0AC2770E1107090E11CD7B0EC9C50D131313B8 +:200E8000C27C0EC1E51A7723131A7723131A77E1CD79041B1B1B1B1B0DC2840EC9AF320084 +:200EA00020C3F00F3AA323B7CCB015C900000000310024CD2E1ACD591BCDD01CCDDB1CAF68 +:200EC000D303D305CDF319FBCD101D21192B0E0411641FCDF81C21142B0103303EFFCD6CA0 +:200EE0001C3A3F20B7C2890F21143F0669C5E5CD631AE1CD80042247203AA723B7C2890F85 +:200F0000CD251DC105C2ED0EC31F1D0006223E03118218CD9A1C000000061121542B1137AA +:200F2000193E03CD9A1CCD251D061121542E116D193E03CD9A1C3AA723B7C2890FCD101DA1 +:200F4000CDA0193AA723B7C2890FCD101DCDF319CD9015CDF61BCD561A0000000E0B21114B +:200F60002C11681FCD8E1C3AA723B7C2890F3E1232492001951FCDEE1C3AA723B7C2890F95 +:200F8000CD101DCDF319C3BF0ECDF319211330115F1F0E04CD8E1C3AA7233D2110280E14DD +:200FA000C2BF0F11001FCD8E1CDB01E604CAF31F3AA723C6992732A723CDDB1CC30C1A1114 +:200FC000EB1ECD8E1CDB010F0FDAD30F0FDAB00FC3F31F3AA723C6982732A723C3131A00E9 +:200FE00021000022A123C9C34A0DCDF319C38702E1D1C1F1C900CDE61FCD2C1CC900000005 +:20100000CDE00FCD811CCD2C1CCD671B3E01320020D306CDA40ECD3F1CCDDB1CCDD01CCDEB +:20102000591B3A0B20B7CA1114AF320B2032012032A023FB3AA723B7CAFA01C30016CA00BF +:20104000FE04CAE70647E601C3DC06110500190D7DE61FFE18D27014C3D0163A1320B7C04D +:201060003A0720FE053E02D26C143E01B047C900F1E12A2420C3E314CD05053A0D203C32D5 +:201080000D20FE05C28C14AF320D203C2104153DCA98142323C38F145E23562129207E8399 +:2010A0002777237E8A2777237ECE002777CDB314C33005AF32092032082021E2042226205D +:2010C000AF320C20C90000007B8787835F215320195E23666BCDE40AC90006080E00F1F54A +:2010E000C34C04E5CDB303E1CDE40AC3781411102B06070E02CD110111122D06050E03CD09 +:201100001101111450000001500100030000CDB3143A0220B73E01CA261532082021183F36 +:20112000222420C37103320920211824C32015233A35204F0C1A0DCA3F150F0FC33615F5EF +:201140003A3520FE03C25615F14FE60F772B79E6F07723C35815F177CD79041305C2301511 +:201160003A35203CFE04DA6B153E00323520C9013A1E2047E5AF77CD790405C27615E1C9A9 +:20118000CDBD03CD6017C3870211B023CD1419C9CD671BCDB015CD2C1CCDBB0021022FAF0C +:2011A000CD63083E02214233CDD508C93E0132020E0521A1303EFF0023CD79047723770D6E +:2011C000C2B8150E052161330023CD80043EFF7723770DC2C915C93204203E01E640CAE912 +:2011E0007DE680CD6308C9CD671B212920AF7723772377C9C80604CD7415C90CFF00FF0034 +:20120000CD0616C3890FCDD01F21A823CDED1521AE23CDED15CDCA1FC9320220320320C367 +:20122000B1013A0720CD470A3A31202F323120B7C23616C34B002A32203A3420B7C24F1685 +:20124000CDF5152B2232207DE61FFE01CA67160604112000E57EE60F0000001905C2551672 +:20126000E1CD8616C34B002A11203A0420B77CCA2A17D604C32017C32A172E0C22323E017A +:20128000323420C34B003A342032352011EB050604CD30153A3520323420C9007DE61FFE2A +:2012A00006DA60167EFEFFCA6016E12A2120CD7106CD0505C36716000000AF323420214CD4 +:2012C00036223220AF323120C38E17203C320620E5EB2A32200604CD0E17CAFC16CD7904A8 +:2012E00005C2D7162A1C203A1E2047CD0E17CA0517CD790405C2EB16E1C3DA14E1F1E1CD19 +:201300007106C36716E1F1E1C35B050000007CBAC07DBBC9BAD8C07DBBC9F1E1C367162ABA +:20132000FE24D23317C603C33317C604FE3FDA3317D603672E0CEBCD7605223220C37E16F6 +:20134000EB2137207EB7C24D172BC34F1723233E047723732372C9E5CD7708E1CD4017C989 +:201360002137207EB7CA6E172B35CC7717C92323237EB7C8C36817235E2356EB0610AF7725 +:2013800023772BCD79040DC27F17121B12C92136200606772305C29317214020360E233625 +:2013A00010233612233614C94B00002140200604352305C2B017C38015F5E5210A2106003C +:2013C000097EB7CAD317E1E5CD0B07E1F12B00CD1F07C9E1F1C9000C79FE25C20B08C3AB37 +:2013E00017C2E517AFB047214D207EB7CAF417353E04B04778D30579D303C93EFF00FF00C8 +:2014000000000E000000003C00000000FA00000000F401000000EC03000000E807000000B5 +:20142000D80F000000B03B000000704F000000608700000070060100C0DF05020C30E003F8 +:2014400004140C8003082803000010D0000000103C0000601004000060083C00000008D096 +:20146000000000FC2803000080140C0002F20C30C0052B00C03FF85A00000000AA0000008A +:2014800000CE00080000080000180000180000380000380000780000780000F80000F800EE +:2014A00010F80010F80130FC0130FC01F07C01F0FC03E0FF04E07F08E01F08DF1F10E0071F +:2014C000108007108003200000200060200060100000100000F80000800002F2C0052B3F07 +:2014E000F85A0000AA0000CE772377CDBD03C921A1237E23A6C921A1237E23B6CA220DAFE2 +:20150000210224C31A0D212920AF7723772377C34B001CC921AD23D5E506031ABEDA29193B +:20152000C2B01F2B1B05C21B19E1D1C97C445CD03C043CD05C447CBFFFFFBFFFFFBFFFFFD3 +:20154000BFFFFFBFFFFFBD07E0BD07E0BDF7FEBDF7FEBDF7FE01F0FE01F0FEBFFFFFBFFF5A +:20156000FFBFFFFFBFFFFFBFFFFFBFFFFFFFF9FFFFE7FF0180FF0100FEFFFFF9FFFFE7FF42 +:20158000FFFFFFFFFEFFFFFCFFFFFCFFFFF6FFFFFE0100FE0100FE7FF7FE7FF7FE7FF7FE13 +:2015A000211028119B1E0E15CD8E1C210D2F11B01E0E09CD8E1C21CD2A119D0B06183E0275 +:2015C000CD9A1C3E0A32492001731FCDB01CDADA19CDE819C3CB19CD121D01801FCDB01C02 +:2015E000D8CDE41CC3DD1900C506103E02CD9A1CC1C9002102243600237DE61FFE1CDA054A +:201600001A110600197CFE40DAF619C9AF323D20C300143E01323D20C300142100203600E3 +:20162000237CFE23C21E1A7DFEF0C21E1AC9CD811CCD1B1AC93AA623B7C23C023E0132A6BC +:20164000233AA723FE99CA3C02C6012732A723C33C02324C20C9CDB015018A1FCD671BC91E +:20166000C3EB0CE511001806050E1ACD7708E1E5114003C39D1A2100002B7CB5C2791AC9F4 +:20168000EB2A1120E524CD0E17E1D8E5CD8004EBCD0E17E1D83E33BCD07CFE36C9190605EA +:2016A000CDB71AE17DE680C81180011906010E0B112C19CD7708C9AF772305C2B71AC91B05 +:2016C0000E1B211E2511F31A1AD5CDD21AD113C3F91FD511301DE526006F29292919EBE1EB +:2016E0000608D306C51A771301200009C105C2E41AD1C90D020A0C041C131D1E0506210D84 +:20170000020A0C041E0D020A0C041C141D1E00214D1B5E2356237E23666F1ACD291B1B1AA2 +:20172000CD291B1B1ACD291BC9D5F50F0F0F0FE60FCD3C1BF1E60FCD3C1BD1C9C612C3D259 +:201740001A21511BC3121B21551BC3121BAA231C27AD231C2FB0231C39C3B71FCD0F1BCDC1 +:20176000411BCD471BC980C501831B0AFEFFCA801B6F030A67030AC5CDD21AC103C36B1B4A +:20178000C1C9000C25240D25250E25250F2523102623112728112823122923132A28132B4E +:2017A00023142B26152C23162D28162E23172F2817302317312717322717332417342816BD +:2017C0003524163628153724143726133824133928123A24113B24113C28103D240F3E2441 +:2017E0000E3E260D3E260C3E23FF21122E11D71E0E09CD8E1CC90608CDAC0CCDF319C93275 +:201800002A2920BCD2231C3A4C20B7C2161C3E80324C20C3C21C214F207EB7CA231C353EF9 +:2018200010B14F3E20B14F210820C9FF3E0106E021022477C501200009C105C2331CC92196 +:2018400001253A2C20C612CDD21A2101273A2C204FB7CA641C3E2ACDD21A0D79FE07D2644A +:201860001CC3511C3E1ECDD21AC90000C5E57700230DC26E1CE101200009C105C26C1CC9BD +:20188000002100243600237CFE40C2841CC91AD5CDD21AD1130DC28E1CC94FC5E51A77135A +:2018A000230DC29D1CE101200009C105C29B1CC90AFEFF37C86F030A67030A5F030A5703AE +:2018C000A7C9324F203A2C203C322C20C3161C000E0621013511591FC38E1C3AA72321013B +:2018E0003CC3291BC53A49204FCDF81CC1C9CDB01CD8CDE41CC3EE1CD51ACDD21AD13E07BA +:20190000323E203A3E203DC2031D130DC2F81CC9D3063E80323E203A3E20B7C2171DC9216B +:201920001631C30C0FD3063E05C3141D003B003B001F2444241F0000007F494949360000A2 +:20194000003E414141220000007F4141413E0000007F494949410000007F0808087F000033 +:201960000000417F41000000007F010101010000007F2018207F0000007F1008047F000073 +:20198000003E4141413E0000007F484848300000007F484C4A3100000032494949260000C0 +:2019A0000040407F40400000007E0101017E0000007C0201027C00000060100F10600000BD +:2019C000003E4549513E00000000217F010000000023454949310000004241495966000055 +:2019E000000C14247F04000000725151514E0000001E2949494600000040474850600000CF +:201A00000036494949360000003149494A3C00000008142241000000000041221408000038 +:201A2000000000000000000000141414141400000022147F14220000080808080000000037 +:201A40000020404D5020000001020408102040808040201008040201FF000000000000006C +:201A600000000000000000FF80808080808080800101010101010101003E41414547000013 +:201A80000000017F010F0000000506210D020A0C041E0D020A0C041C141D1E200D020A0C6A +:201AA000041E000310000902041E0E0001070420221E08110D0E040C111F15121E0B0A0676 +:201AC000090E0D1F14121E0B0A06090E0D1F13121E0B0A06090E0D290008041E0A10040C22 +:201AE0001E1E0B070011040C1C1E1D131E0A0C1E140B070011040C0D1E010F0E0E0A091EEC +:201B00000A0907111E130B070011040C1E1E010F0E0E0A091EAF322C20C3F6010011040C95 +:201B20001C131D1C131E0A0C1E141E0B070011040C0D1D1E1E20131E0B070011040C1E1E4D +:201B4000131E020A06091E20141E0B070011040C0D1E141E020A06090D020C0403060E0BDD +:201B60000F0D051E0B07001106090D040C0E1E020A06090A2CBD07C72B7D07842B3D07FF2E +:201B80000A2EB91E072EC31E042ECD1EFF3B003B003B003B000D2A231F0A2A351F072A479F +:201BA0001FFF0000001C2700001C2F00001C39FFE1D1EBCDDB1FC93AA023E60111AA23CA6C +:201BC000C41F1EB0212B20CDDB1FCDC01AC35C1B11AA23CD1419CD8915C90006037E122B70 +:201BE0001B05C2DD1FC921122E11D71E0E09CD8E1CC900CDDB1CC3970F0DC2C81AC9003B9E +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/yosakdona.hex b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/yosakdona.hex new file mode 100644 index 00000000..6a01e4ec --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/yosakdona.hex @@ -0,0 +1,34 @@ +:020000040000FA +:201800002A2920BCD2231C3A4C20B7C2161C3E80324C20324F20214F207EB7CA231C353EF9 +:2018200010B14F3E20B14F210820C9FF3E0106E021022477C501200009C105C2331CC92196 +:2018400001253A2C20C612CDD21A2101273A2C204FB7CA641C3E2ACDD21A0D79FE07D2644A +:201860001CC3511C3E1ECDD21AC90000C5E57700230DC26E1CE101200009C105C26C1CC9BD +:20188000002100243600237CFE40C2841CC91AD5CDD21AD1130DC28E1CC94FC5E51A77135A +:2018A000230DC29D1CE101200009C105C29B1CC90AFEFF37C86F030A67030A5F030A5703AE +:2018C000A7C92A5020AF06207D906F7CDE0067C90E0621013511591FC38E1C3AA72321019C +:2018E0003CC3291BC53A49204FCDF81CC1C9CDB01CD8CDE41CC3EE1CD51ACDD21AD13E07BA +:20190000323E203A3E203DC2031D130DC2F81CC9D3063E80323E203A3E20B7C2171DC9216B +:201920001631C30C0FD3063E05C3141D003B003B001F2444241F0000007F494949360000A2 +:20194000003E414141220000007F4141413E0000007F494949410000007F0808087F000033 +:201960000000417F41000000007F010101010000007F2018207F0000007F1008047F000073 +:20198000003E4141413E0000007F484848300000007F484C4A3100000032494949260000C0 +:2019A0000040407F40400000007E0101017E0000007C0201027C00000060100F10600000BD +:2019C000003E4549513E00000000217F010000000023454949310000004241495966000055 +:2019E000000C14247F04000000725151514E0000001E2949494600000040474850600000CF +:201A00000036494949360000003149494A3C00000008142241000000000041221408000038 +:201A2000000000000000000000141414141400000022147F14220000080808080000000037 +:201A40000020404D5020000001020408102040808040201008040201FF000000000000006C +:201A600000000000000000FF80808080808080800101010101010101003E41414547000013 +:201A80000000017F010F0000000506210D020A0C041E0D020A0C041C141D1E200D020A0C6A +:201AA000041E000310000902041E0E0001070420221E08110D0E040C111F15121E0B0A0676 +:201AC000090E0D1F14121E0B0A06090E0D1F13121E0B0A06090E0D290008041E0A10040C22 +:201AE0001E1E0B070011040C1C1E1D131E0A0C1E140B070011040C0D1E010F0E0E0A091EEC +:201B00000A0907111E130B070011040C1E1E010F0E0E0A091E0B0700111E0B070011040C29 +:201B20001C131D1C131E0A0C1E141E0B070011040C0D1D1E1E20131E0B070011040C1E1E4D +:201B4000131E020A06091E20141E0B070011040C0D1E141E020A06090D020C0403060E0BDD +:201B60000F0D051E0B07001106090D040C0E1E020A06090A2CBD07C72B7D07842B3D07FF2E +:201B80000A2EB91E072EC31E042ECD1EFF3B003B003B003B000D2A231F0A2A351F072A479F +:201BA0001FFF0000001C2700001C2F00001C39FFE1D1EBCDDB1FC93AA023E60111AA23CA6C +:201BC000C41F1EB0212B20CDDB1FCDC01AC35C1B11AA23CD1419CD8915C90006037E122B70 +:201BE0001B05C2DD1FC921122E11D71E0E09CD8E1CC900CDDB1CC3970F0DC2C81AC9003B9E +:00000001FF diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzapc b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzapc new file mode 100644 index 00000000..d6405078 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzapc differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzapd b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzapd new file mode 100644 index 00000000..800211bd Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzapd differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzape b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzape new file mode 100644 index 00000000..051c824f Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzape differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzapf b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzapf new file mode 100644 index 00000000..8152873a Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzapf differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzapg b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzapg new file mode 100644 index 00000000..d925be84 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzapg differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzaph b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzaph new file mode 100644 index 00000000..54e86ff9 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080_MiST/roms/zzzaph differ diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/Graphics.VHD b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/Graphics.VHD new file mode 100644 index 00000000..2bc251ad --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/Graphics.VHD @@ -0,0 +1,272 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.std_logic_arith.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.sprite_pkg.all; +use work.project_pkg.all; +use work.platform_pkg.all; + +entity Graphics is + port + ( + bitmap_ctl_i : in to_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); + bitmap_ctl_o : out from_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); + tilemap_ctl_i : in to_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); + tilemap_ctl_o : out from_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); + + sprite_reg_i : in to_SPRITE_REG_t; + sprite_ctl_i : in to_SPRITE_CTL_t; + sprite_ctl_o : out from_SPRITE_CTL_t; + spr0_hit : out std_logic; + + graphics_i : in to_GRAPHICS_t; + graphics_o : out from_GRAPHICS_t; + + video_i : in from_VIDEO_t; + video_o : out to_VIDEO_t + ); + +end Graphics; + +architecture SYN of Graphics is + + alias clk : std_logic is video_i.clk; + + signal from_video_ctl : from_VIDEO_CTL_t; + signal bitmap_ctl_o_s : from_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); + signal tilemap_ctl_o_s : from_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); + signal sprite_ctl_o_s : from_SPRITE_CTL_t; + signal sprite_pri : std_logic; + + signal rgb_data : RGB_t; + + signal video_o_s : to_VIDEO_t; + +begin + + -- dodgy OSD transparency... + video_o.clk <= video_o_s.clk; + video_o.rgb.r <= video_o_s.rgb.r; + video_o.rgb.g <= video_o_s.rgb.g; + video_o.rgb.b <= video_o_s.rgb.b; + video_o.hsync <= video_o_s.hsync; + video_o.vsync <= video_o_s.vsync; + video_o.hblank <= video_o_s.hblank; + video_o.vblank <= video_o_s.vblank; + + graphics_o.y <= from_video_ctl.y; + -- should this be the 'real' vblank or the 'active' vblank? + -- - use the real for now + graphics_o.hblank <= video_o_s.hblank; + graphics_o.vblank <= video_o_s.vblank; + --graphics_o.vblank <= from_video_ctl.vblank; + + pace_video_controller_inst : entity work.pace_video_controller + generic map + ( + CONFIG => PACE_VIDEO_CONTROLLER_TYPE, + DELAY => PACE_VIDEO_PIPELINE_DELAY, + H_SIZE => PACE_VIDEO_H_SIZE, + V_SIZE => PACE_VIDEO_V_SIZE, + L_CROP => PACE_VIDEO_L_CROP, + R_CROP => PACE_VIDEO_R_CROP, + H_SCALE => PACE_VIDEO_H_SCALE, + V_SCALE => PACE_VIDEO_V_SCALE, + H_SYNC_POL => PACE_VIDEO_H_SYNC_POLARITY, + V_SYNC_POL => PACE_VIDEO_V_SYNC_POLARITY, + BORDER_RGB => PACE_VIDEO_BORDER_RGB + ) + port map + ( + -- clocking etc + video_i => video_i, + + -- register interface + reg_i.h_scale => "000", + reg_i.v_scale => "000", + -- video data signals (in) + rgb_i => rgb_data, + + -- video control signals (out) + video_ctl_o => from_video_ctl, + + -- VGA signals (out) + video_o => video_o_s + ); + + pace_video_mixer_inst : entity work.pace_video_mixer + port map + ( + bitmap_ctl_o => bitmap_ctl_o_s, + tilemap_ctl_o => tilemap_ctl_o_s, + sprite_rgb => sprite_ctl_o_s.rgb, + sprite_set => sprite_ctl_o_s.set, + sprite_pri => sprite_pri, + + video_ctl_i => from_video_ctl, + graphics_i => graphics_i, + rgb_o => rgb_data + ); + + GEN_NO_BITMAPS : if PACE_VIDEO_NUM_BITMAPS = 0 generate + --bitmap_ctl_o_s <= ((others => '0'), (others => (others => '0')), '0'); + end generate GEN_NO_BITMAPS; + + GEN_BITMAP_1 : if PACE_VIDEO_NUM_BITMAPS > 0 generate + + forground_bitmapctl_inst : entity work.bitmapCtl(BITMAP_1) + generic map + ( + DELAY => PACE_VIDEO_PIPELINE_DELAY + ) + port map + ( + reset => video_i.reset, + + video_ctl => from_video_ctl, + + ctl_i => bitmap_ctl_i(1), + ctl_o => bitmap_ctl_o_s(1), + + graphics_i => graphics_i + ); + end generate GEN_BITMAP_1; + + GEN_BITMAP_2 : if PACE_VIDEO_NUM_BITMAPS > 1 generate + + forground_bitmapctl_inst : entity work.bitmapCtl(BITMAP_2) + generic map + ( + DELAY => PACE_VIDEO_PIPELINE_DELAY + ) + port map + ( + reset => video_i.reset, + + video_ctl => from_video_ctl, + + ctl_i => bitmap_ctl_i(2), + ctl_o => bitmap_ctl_o_s(2), + + graphics_i => graphics_i + ); + + end generate GEN_BITMAP_2; + + GEN_BITMAP_3 : if PACE_VIDEO_NUM_BITMAPS > 2 generate + + forground_bitmapctl_inst : entity work.bitmapCtl(BITMAP_3) + generic map + ( + DELAY => PACE_VIDEO_PIPELINE_DELAY + ) + port map + ( + reset => video_i.reset, + + video_ctl => from_video_ctl, + + ctl_i => bitmap_ctl_i(3), + ctl_o => bitmap_ctl_o_s(3), + + graphics_i => graphics_i + ); + + end generate GEN_BITMAP_3; + + bitmap_ctl_o <= bitmap_ctl_o_s; + + GEN_NO_TILEMAPS : if PACE_VIDEO_NUM_TILEMAPS = 0 generate + --tilemap_ctl_o_s(1) <= ((others => '0'), (others => '0'), (others => '0'), + -- (others => (others => '0')), '0'); + end generate GEN_NO_TILEMAPS; + + GEN_TILEMAP_1 : if PACE_VIDEO_NUM_TILEMAPS > 0 generate + + foreground_mapctl_inst : entity work.tilemapCtl(TILEMAP_1) + generic map + ( + DELAY => PACE_VIDEO_PIPELINE_DELAY + ) + port map + ( + reset => video_i.reset, + + video_ctl => from_video_ctl, + + ctl_i => tilemap_ctl_i(1), + ctl_o => tilemap_ctl_o_s(1), + + graphics_i => graphics_i + ); + + end generate GEN_TILEMAP_1; + + GEN_TILEMAP_2 : if PACE_VIDEO_NUM_TILEMAPS > 1 generate + + background_mapctl_inst : entity work.tilemapCtl(TILEMAP_2) + generic map + ( + DELAY => PACE_VIDEO_PIPELINE_DELAY + ) + port map + ( + reset => video_i.reset, + + video_ctl => from_video_ctl, + + ctl_i => tilemap_ctl_i(2), + ctl_o => tilemap_ctl_o_s(2), + + graphics_i => graphics_i + ); + + end generate GEN_TILEMAP_2; + + tilemap_ctl_o <= tilemap_ctl_o_s; + + GEN_NO_SPRITES : if PACE_VIDEO_NUM_SPRITES = 0 generate + sprite_ctl_o_s <= ((others => '0'), (others => (others => '0')), '0'); + sprite_pri <= '0'; + spr0_hit <= '0'; + end generate GEN_NO_SPRITES; + + GEN_SPRITES : if PACE_VIDEO_NUM_SPRITES > 0 generate + + sprites_inst : sprite_array + generic map + ( + N_SPRITES => PACE_VIDEO_NUM_SPRITES, + DELAY => PACE_VIDEO_PIPELINE_DELAY + ) + port map + ( + reset => video_i.reset, + + -- register interface + reg_i => sprite_reg_i, + + -- video control signals + video_ctl => from_video_ctl, + + graphics_i => graphics_i, + + row_a => sprite_ctl_o_s.a, + row_d => sprite_ctl_i.d, + + rgb => sprite_ctl_o_s.rgb, + set => sprite_ctl_o_s.set, + pri => sprite_pri, + spr0_set => spr0_hit + ); + + end generate GEN_SPRITES; + + sprite_ctl_o <= sprite_ctl_o_s; + + +end SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/InputMapper.VHDL b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/InputMapper.VHDL new file mode 100644 index 00000000..5024c699 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/InputMapper.VHDL @@ -0,0 +1,119 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.all; + +library work; +use work.pace_pkg.all; +use work.kbd_pkg.all; + +entity inputmapper is + generic + ( + NUM_DIPS : integer := 8; + NUM_INPUTS : integer := 2 + ); + port + ( + clk : in std_logic; + rst_n : in std_logic; + + -- inputs from keyboard controller + reset : in std_logic; + key_down : in std_logic; + key_up : in std_logic; + data : in std_logic_vector(7 downto 0); + -- JAMMA interface + jamma : in from_JAMMA_t; + + -- user outputs + dips : in std_logic_vector(NUM_DIPS-1 downto 0); + inputs : out from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1) + ); + end inputmapper; + +architecture SYN of inputmapper is + +begin + + latchInputs: process (clk, rst_n) + variable jamma_v : from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1); + variable keybd_v : from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1); + begin + + -- note: all inputs are active HIGH + + if rst_n = '0' then + for i in 0 to NUM_INPUTS-1 loop + jamma_v(i).d := (others => '1'); + keybd_v(i).d := (others => '0'); + end loop; + + elsif rising_edge (clk) then + + -- handle JAMMA inputs + -- enable button 3 to insert coin + jamma_v(0).d(0) := jamma.coin(1) and jamma.p(1).button(3); + jamma_v(0).d(1) := jamma.p(2).start; + jamma_v(0).d(2) := jamma.p(1).start; + jamma_v(0).d(4) := jamma.p(1).button(1); + jamma_v(1).d(4) := jamma.p(1).button(1); + jamma_v(0).d(5) := jamma.p(1).left; + jamma_v(1).d(5) := jamma.p(1).left; + jamma_v(0).d(6) := jamma.p(1).right; + jamma_v(1).d(6) := jamma.p(1).right; + + -- map the dipswitches + keybd_v(1).d(3 downto 0) := dips(3 downto 0); + keybd_v(1).d(7) := dips(7); + if (key_down or key_up) = '1' then + case data(7 downto 0) is + -- IN0 + when SCANCODE_5 => + keybd_v(0).d(0) := key_down; + when SCANCODE_2 => + keybd_v(0).d(1) := key_down; + when SCANCODE_1 => + keybd_v(0).d(2) := key_down; + when SCANCODE_LCTRL | SCANCODE_SPACE => + keybd_v(0).d(4) := key_down; + keybd_v(1).d(4) := key_down; + when SCANCODE_LEFT => + keybd_v(0).d(5) := key_down; + keybd_v(1).d(5) := key_down; + when SCANCODE_RIGHT => + keybd_v(0).d(6) := key_down; + keybd_v(1).d(6) := key_down; + -- IN1 + --when "01110101" => -- $75 = UP + --when "01110010" => -- $72 = DOWN + --when "00110111" => -- $37 = '6' + --when "00011011" => -- $1B = 'S' + -- Special keys + when SCANCODE_F3 => + keybd_v(2).d(0) := key_down; -- CPU RESET + when SCANCODE_TAB => + keybd_v(2).d(1) := key_down; -- OSD TOGGLE + when SCANCODE_F4 => + keybd_v(2).d(2) := key_down; -- video rotate + when others => + end case; + end if; -- key_down or key_up + + -- this is PS/2 reset only + if (reset = '1') then + for i in 0 to NUM_INPUTS-1 loop + keybd_v(i).d := (others =>'0'); + end loop; + end if; + end if; -- rising_edge (clk) + + -- assign outputs + for i in 0 to NUM_INPUTS-1 loop + inputs(i).d <= not jamma_v(i).d or keybd_v(i).d; + end loop; + + end process latchInputs; + +end SYN; + + diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/Inputs.VHD b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/Inputs.VHD new file mode 100644 index 00000000..4337db25 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/Inputs.VHD @@ -0,0 +1,112 @@ +Library IEEE; +Use IEEE.std_logic_1164.all; + +library work; +use work.pace_pkg.all; +use work.kbd_pkg.all; + +entity inputs is + generic + ( + NUM_DIPS : integer := 8; + NUM_INPUTS : integer := 2; + CLK_1US_DIV : natural := 30 + ); + port + ( + clk : in std_logic; + reset : in std_logic; + ps2clk : in std_logic; + ps2data : in std_logic; + jamma : in from_JAMMA_t; + + dips : in std_logic_vector(NUM_DIPS-1 downto 0); + inputs : out from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1) + ); +end entity inputs; + +architecture SYN of inputs is + + component ps2kbd + port + ( + clk : in std_logic; + rst_n : in std_logic; + tick1us : in std_logic; + ps2_clk : in std_logic; + ps2_data : in std_logic; + + reset : out std_logic; + keydown : out std_logic; + keyup : out std_logic; + scancode : out std_logic_vector(7 downto 0) + ); + end component; + + signal reset_n : std_logic; + signal tick_1us : std_logic; + signal ps2_reset : std_logic; + signal ps2_press : std_logic; + signal ps2_release : std_logic; + signal ps2_scancode : std_logic_vector(7 downto 0); + +begin + + reset_n <= not reset; + +-- ps2clk <= 'Z'; +-- ps2data <= 'Z'; + + ps2kbd_inst : ps2kbd + port map + ( + clk => clk, + rst_n => reset_n, + tick1us => tick_1us, + ps2_clk => ps2clk, + ps2_data => ps2data, + + reset => ps2_reset, + keydown => ps2_press, + keyup => ps2_release, + scancode => ps2_scancode + ); + + inputmapper_inst : entity work.inputmapper + generic map + ( + NUM_DIPS => NUM_DIPS, + NUM_INPUTS => NUM_INPUTS + ) + port map + ( + clk => clk, + rst_n => reset_n, + + reset => ps2_reset, + key_down => ps2_press, + key_up => ps2_release, + data => ps2_scancode, + jamma => jamma, + + dips => dips, + inputs => inputs + ); + + process (clk, reset) + variable count : integer range 0 to CLK_1US_DIV := 0; + begin + if reset = '1' then + count := 0; + tick_1us <= '0'; + elsif rising_edge(clk) then + tick_1us <= '0'; + count := count + 1; + if count = CLK_1US_DIV then + count := 0; + tick_1us <= '1'; + end if; + end if; + end process; + +end architecture SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/Sound.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/Sound.vhd new file mode 100644 index 00000000..6c6d9a42 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/Sound.vhd @@ -0,0 +1,116 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sound is + generic + ( + CLK_MHz : natural + ); + port + ( + sysClk : in std_logic; + reset : in std_logic; + + sndif_rd : in std_logic; + sndif_wr : in std_logic; + sndif_datai : in std_logic_vector(7 downto 0); + sndif_addr : in std_logic_vector(15 downto 0); + + snd_clk : out std_logic; + snd_data_l : out std_logic_vector(7 downto 0); + snd_data_r : out std_logic_vector(7 downto 0); + sndif_datao : out std_logic_vector(7 downto 0) + ); +end entity sound; + +architecture SYN of Sound is + + component invaders_audio + Port + ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); + end component; + +-- Signal Declarations + + -- audio module clock + signal clk_5M : std_logic; + signal clk_10M : std_logic; + + -- port latches + signal s1_r : std_logic_vector(5 downto 0); + signal s2_r : std_logic_vector(5 downto 0); + + signal snd_data_s : std_logic_vector(7 downto 0); + +begin + + sndif_datao <= X"00"; + + -- latches + process (sysClk, reset) + variable wr_r : std_logic := '0'; + begin + if reset = '1' then + wr_r := '0'; + elsif rising_edge(sysClk) then + -- latch port data on rising edge of WRITE + if sndif_wr = '1' and wr_r = '0' then + case sndif_addr(2 downto 0) is + when "011" => + s1_r <= sndif_datai(5 downto 0); + when "101" => + s2_r <= sndif_datai(5 downto 0); + when others => + end case; + end if; + wr_r := sndif_wr; + end if; + end process; + + -- apparently the audio module wants a 10MHz clock + process (sysClk, reset) + subtype count_t is integer range 0 to CLK_MHz/5; + variable count : count_t := 0; + begin + if reset = '1' then + count := 0; + clk_10M <= '0'; + clk_5M <= '0'; + elsif rising_edge(sysClk) then + clk_10M <= '0'; + clk_5M <= '0'; + if count = count_t'high/2 then + clk_10M <= '1'; + count := count + 1; + elsif count = count_t'high then + clk_10M <= '1'; + clk_5M <= '1'; + count := 0; + else + count := count + 1; + end if; + end if; + end process; + + -- can use anything suitable + snd_clk <= clk_5M; + + audio_inst : invaders_audio + port map + ( + Clk => clk_10M, + S1 => s1_r, + S2 => s2_r, + Aud => snd_data_s + ); + + snd_data_l <= snd_data_s; + snd_data_r <= snd_data_s; + +end architecture SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80.vhd new file mode 100644 index 00000000..1ea66542 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80.vhd @@ -0,0 +1,1088 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if Mode = 3 then + IStatus <= "10"; + elsif IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusA <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80_ALU.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80_MCode.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80_MCode.vhd new file mode 100644 index 00000000..a8f5fbf5 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80_MCode.vhd @@ -0,0 +1,2024 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + --I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + if mode = 3 then + MCycles <= "011"; + else + MCycles <= "101"; + end if; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80_Pack.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80_Pack.vhd new file mode 100644 index 00000000..907db408 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80_Pack.vhd @@ -0,0 +1,228 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80_Reg.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80se.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80se.vhd new file mode 100644 index 00000000..1b0cb9b5 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/T80se.vhd @@ -0,0 +1,192 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0240 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80se is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0; -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + IOWait : integer := 1 -- 0 => Single cycle I/O, 1 => Std I/O cycle + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80se; + +architecture rtl of T80se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => Mode, + IOWait => IOWait) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/Z80.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/Z80.vhd new file mode 100644 index 00000000..db1ad947 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/Z80.vhd @@ -0,0 +1,135 @@ +library IEEE; +use IEEE.std_logic_1164.all; +library work; +use work.T80_Pack.all; + +entity Z80 is port + ( + clk : in std_logic; + clk_en : in std_logic; + reset : in std_logic; + + addr : out std_logic_vector(15 downto 0); + datai : in std_logic_vector(7 downto 0); + datao : out std_logic_vector(7 downto 0); + + m1 : out std_logic; + mem_rd : out std_logic; + mem_wr : out std_logic; + io_rd : out std_logic; + io_wr : out std_logic; + + wait_n : in std_logic := '1'; + busrq_n : in std_logic := '1'; + intreq : in std_logic := '0'; + intvec : in std_logic_vector(7 downto 0); + intack : out std_logic; + nmi : in std_logic := '0' + ); +end Z80; + +architecture SYN of Z80 is + + component T80se is + generic + ( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 1 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port + ( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); + end component T80se; + + -- Signal Declarations + + signal reset_n : std_logic; + signal int_n : std_logic; + signal nmi_n : std_logic; + + signal z80_m1 : std_logic; + signal z80_memreq : std_logic; + signal z80_ioreq : std_logic; + signal z80_rd : std_logic; + signal z80_wr : std_logic; + signal z80_datai : std_logic_vector(7 downto 0); + + -- derived signals (outputs we need to read) + signal z80_memrd : std_logic; + signal z80_iord : std_logic; + signal fetch : std_logic; + + begin + + -- simple inversions + reset_n <= not reset; + int_n <= not intreq; + nmi_n <= not nmi; + + -- direct-connect (outputs we need to read) + m1 <= z80_m1; + mem_rd <= z80_memrd; + io_rd <= z80_iord; + + -- memory signals + z80_memrd <= z80_memreq nor z80_rd; + mem_wr <= z80_memreq nor z80_wr; + + -- io signals + z80_iord <= z80_ioreq nor z80_rd; + io_wr <= z80_ioreq nor z80_wr; + + -- other signals + fetch <= z80_m1 nor z80_memreq; + intack <= z80_m1 nor z80_ioreq; + + -- data in mux + z80_datai <= intvec when ((z80_memrd or z80_iord) = '0') else + datai; + + Z80_uP : T80se + generic map + ( + Mode => 0 -- Z80 + ) + port map + ( + RESET_n => reset_n, + CLK_n => clk, + CLKEN => clk_en, + WAIT_n => wait_n, + INT_n => int_n, + NMI_n => nmi_n, + BUSRQ_n => busrq_n, + M1_n => z80_m1, + MREQ_n => z80_memreq, + IORQ_n => z80_ioreq, + RD_n => z80_rd, + WR_n => z80_wr, + RFSH_n => open, + HALT_n => open, + BUSAK_n => open, + A => addr, + DI => z80_datai, + DO => datao + ); + +end architecture SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/altera_mem.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/altera_mem.vhd new file mode 100644 index 00000000..ba68be99 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/altera_mem.vhd @@ -0,0 +1,144 @@ +library IEEE; +use ieee.std_logic_1164.all; +library work; +use work.pace_pkg.all; +use work.platform_variant_pkg.all; + +ENTITY invaders_rom_0 IS + PORT + ( + address : IN STD_LOGIC_VECTOR (12 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END invaders_rom_0; + +architecture SYN of invaders_rom_0 is +begin + sprom_inst : entity work.sprom + generic map + ( + init_file => ROM_0_NAME, + --numwords_a => 8192, + widthad_a => 13 + ) + port map + ( + clock => clock, + address => address, + q => q + ); +end SYN; + +library IEEE; +use ieee.std_logic_1164.all; +library work; +use work.pace_pkg.all; +use work.platform_variant_pkg.all; + +ENTITY invaders_rom_1 IS + PORT + ( + address : IN STD_LOGIC_VECTOR (11 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END invaders_rom_1; + +architecture SYN of invaders_rom_1 is +begin + sprom_inst : entity work.sprom + generic map + ( + init_file => ROM_1_NAME, + --numwords_a => 4096, + widthad_a => 12 + ) + port map + ( + clock => clock, + address => address, + q => q + ); +end SYN; + +library IEEE; +use ieee.std_logic_1164.all; +library work; +use work.pace_pkg.all; +use work.platform_variant_pkg.all; + +ENTITY vram IS + PORT + ( + address_a : IN STD_LOGIC_VECTOR (12 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (12 DOWNTO 0); + clock_a : IN STD_LOGIC ; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (7 DOWNTO 0); + wren_a : IN STD_LOGIC := '1'; + wren_b : IN STD_LOGIC := '1'; + q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END vram; + +architecture SYN of vram is +begin + dpam_inst : entity work.dpram + generic map + ( + init_file => VRAM_NAME, + --numwords_a => 8192, + widthad_a => 13 + ) + port map + ( + clock_b => clock_b, + address_b => address_b, + data_b => data_b, + q_b => q_b, + wren_b => wren_b, + + clock_a => clock_a, + address_a => address_a, + data_a => data_a, + q_a => q_a, + wren_a => wren_a + ); +end SYN; + +library IEEE; +use ieee.std_logic_1164.all; +library work; +use work.pace_pkg.all; + +ENTITY wram IS + PORT + ( + address : IN STD_LOGIC_VECTOR (9 DOWNTO 0); + clock : IN STD_LOGIC ; + data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END wram; + +architecture SYN of wram is +begin + spram_inst : entity work.spram + generic map + ( + --numwords_a => 1024, + widthad_a => 10 + ) + port map + ( + clock => clock, + address => address, + data => data, + wren => wren, + q => q + ); +end SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/bitmapctl.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/bitmapctl.vhd new file mode 100644 index 00000000..ea55e6dc --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/bitmapctl.vhd @@ -0,0 +1,121 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.platform_pkg.all; + +-- +-- Midway 8080 Bitmap Controller +-- + +architecture BITMAP_1 of bitmapCtl is + + alias clk : std_logic is video_ctl.clk; + alias clk_ena : std_logic is video_ctl.clk_ena; + alias stb : std_logic is video_ctl.stb; + alias hblank : std_logic is video_ctl.hblank; + alias vblank : std_logic is video_ctl.vblank; + --alias x : std_logic_vector(video_ctl.x'range) is video_ctl.x; + --alias y : std_logic_vector(video_ctl.y'range) is video_ctl.y; + + alias rgb : RGB_t is ctl_o.rgb; + + signal x : std_logic_vector(video_ctl.x'range); + signal y : std_logic_vector(video_ctl.y'range); + + signal chr_x : std_logic_vector(4 downto 0); + signal chr_y : std_logic_vector(4 downto 0); + + alias rot_en : std_logic is graphics_i.bit8(0)(0); + +begin + + -- flip X,Y to rotate the screen in the opposite direction for my cabinet + x <= not video_ctl.x when rot_en = '0' else not video_ctl.y; + y <= not video_ctl.y when rot_en = '0' else 32 + video_ctl.x; + + -- cellophane coordinate system independent of video for now + chr_x <= video_ctl.x(7 downto 3) when rot_en = '0' else 1 + video_ctl.y(7 downto 3); + -- bottom line green still not right... fix it later + chr_y <= video_ctl.y(7 downto 3) when rot_en = '0' else not video_ctl.x(7 downto 3); + + -- generate pixel + process (clk) + variable bitmap_d_r : std_logic_vector(7 downto 0); + variable i : integer range 0 to 7; + variable pel : std_logic; + begin + + if rising_edge(clk) and clk_ena = '1' then + + -- 1st stage of pipeline + -- - read tile from tilemap + if stb = '1' then + ctl_o.a(12 downto 5) <= y(7 downto 0); + ctl_o.a(4 downto 0) <= x(7 downto 3); + end if; + + if rot_en = '0' then + if x(2 downto 0) = 0 then + bitmap_d_r := ctl_i.d(7 downto 0); + else + bitmap_d_r := bitmap_d_r(bitmap_d_r'left-1 downto 0) & '0'; + end if; + pel := bitmap_d_r(bitmap_d_r'left); + else + i := to_integer(unsigned(x(2 downto 0))); + pel := ctl_i.d(i); + end if; + + -- emulate the coloured cellophane overlays + rgb.r <= (others => '0'); + rgb.g <= (others => '0'); + rgb.b <= (others => '0'); + if pel = '1' then + if chr_x < 5 then + -- white + rgb.r(9 downto 0) <= (others => '1'); + rgb.g(9 downto 0) <= (others => '1'); + rgb.b(9 downto 0) <= (others => '1'); + elsif chr_x < 9 then + rgb.r(9 downto 0) <= (others => '1'); -- red + elsif chr_x < 24 then + -- white + rgb.r(9 downto 0) <= (others => '1'); + rgb.g(9 downto 0) <= (others => '1'); + rgb.b(9 downto 0) <= (others => '1'); + elsif chr_x < 31 then + rgb.g(9 downto 0) <= (others => '1'); -- green + else + if chr_y < 11 then + -- white ("CREDIT 00") + rgb.r(9 downto 0) <= (others => '1'); + rgb.g(9 downto 0) <= (others => '1'); + rgb.b(9 downto 0) <= (others => '1'); + elsif chr_y < 29 then + -- green (bases) + rgb.g(9 downto 0) <= (others => '1'); + else + -- white (ships left) + rgb.r(9 downto 0) <= (others => '1'); + rgb.g(9 downto 0) <= (others => '1'); + rgb.b(9 downto 0) <= (others => '1'); + end if; + end if; + else + null; -- black + end if; + + end if; -- rising_edge(clk) + + end process; + + -- not used/constant + ctl_o.a(15 downto 13) <= (others => '0'); + ctl_o.set <= '1'; + +end architecture BITMAP_1; + diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/bitmapctl_e.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/bitmapctl_e.vhd new file mode 100644 index 00000000..508109c8 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/bitmapctl_e.vhd @@ -0,0 +1,30 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.platform_pkg.all; +use work.project_pkg.all; + +entity bitmapCtl is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- bitmap controller signals + ctl_i : in to_BITMAP_CTL_t; + ctl_o : out from_BITMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); +end entity bitmapCtl; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/clk_div.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/clk_div.vhd new file mode 100644 index 00000000..020d6ae6 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/clk_div.vhd @@ -0,0 +1,39 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity clk_div is + generic + ( + DIVISOR : natural + ); + port + ( + clk : in std_logic; + reset : in std_logic; + + clk_en : out std_logic + ); +end clk_div; + +architecture SYN of clk_div is + +begin + + process (clk, reset) + variable count : integer range 0 to DIVISOR-1; + begin + if reset = '1' then + count := 0; + clk_en <= '0'; + elsif rising_edge(clk) then + clk_en <= '0'; + if count = DIVISOR-1 then + clk_en <= '1'; + count := 0; + else + count := count + 1; + end if; + end if; + end process; + +end SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/dpram.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/dpram.vhd new file mode 100644 index 00000000..91233996 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/dpram.vhd @@ -0,0 +1,123 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY dpram IS + GENERIC + ( + init_file : string := ""; + numwords_a : natural := 0; -- not used any more + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED"; + outdata_reg_b : string := "UNREGISTERED" + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock_a : IN STD_LOGIC ; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + wren_a : IN STD_LOGIC := '1'; + wren_b : IN STD_LOGIC := '1'; + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + COMPONENT altsyncram + GENERIC ( + address_reg_b : STRING; + clock_enable_input_a : STRING; + clock_enable_input_b : STRING; + clock_enable_output_a : STRING; + clock_enable_output_b : STRING; + indata_reg_b : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + numwords_b : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_aclr_b : STRING; + outdata_reg_a : STRING; + outdata_reg_b : STRING; + power_up_uninitialized : STRING; + widthad_a : NATURAL; + widthad_b : NATURAL; + width_a : NATURAL; + width_b : NATURAL; + width_byteena_a : NATURAL; + width_byteena_b : NATURAL; + wrcontrol_wraddress_reg_b : STRING + ); + PORT ( + wren_a : IN STD_LOGIC ; + clock0 : IN STD_LOGIC ; + wren_b : IN STD_LOGIC ; + clock1 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q_a <= sub_wire0(width_a-1 DOWNTO 0); + q_b <= sub_wire1(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "BYPASS", + clock_enable_input_b => "BYPASS", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + init_file => init_file, + intended_device_family => "Cyclone II", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + numwords_b => 2**widthad_a, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => outdata_reg_a, + outdata_reg_b => outdata_reg_b, + power_up_uninitialized => "FALSE", + widthad_a => widthad_a, + widthad_b => widthad_a, + width_a => width_a, + width_b => width_a, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + wren_a => wren_a, + clock0 => clock_a, + wren_b => wren_b, + clock1 => clock_b, + address_a => address_a, + address_b => address_b, + data_a => data_a, + data_b => data_b, + q_a => sub_wire0, + q_b => sub_wire1 + ); + +END SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/dpram_1r1w.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/dpram_1r1w.vhd new file mode 100644 index 00000000..6e9193cd --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/dpram_1r1w.vhd @@ -0,0 +1,102 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY dpram_1r1w IS + GENERIC + ( + numwords_a : natural; + widthad_a : natural; + width_a : natural := 8; + outdata_reg_b : string := "UNREGISTERED" + ); + PORT + ( + data : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + rdaddress : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + rdclock : IN STD_LOGIC ; + rdclocken : IN STD_LOGIC := '1'; + wraddress : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + wrclock : IN STD_LOGIC ; + wrclocken : IN STD_LOGIC := '1'; + wren : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END dpram_1r1w; + + +ARCHITECTURE SYN OF dpram_1r1w IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + COMPONENT altsyncram + GENERIC ( + address_reg_b : STRING; + clock_enable_input_a : STRING; + clock_enable_input_b : STRING; + clock_enable_output_b : STRING; + intended_device_family : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + numwords_b : NATURAL; + operation_mode : STRING; + outdata_aclr_b : STRING; + outdata_reg_b : STRING; + power_up_uninitialized : STRING; + widthad_a : NATURAL; + widthad_b : NATURAL; + width_a : NATURAL; + width_b : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clocken0 : IN STD_LOGIC ; + clocken1 : IN STD_LOGIC ; + wren_a : IN STD_LOGIC ; + clock0 : IN STD_LOGIC ; + clock1 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "BYPASS", + clock_enable_input_b => "BYPASS", + clock_enable_output_b => "BYPASS", + intended_device_family => "Cyclone II", + lpm_type => "altsyncram", + numwords_a => numwords_a, + numwords_b => numwords_a, + operation_mode => "DUAL_PORT", + outdata_aclr_b => "NONE", + outdata_reg_b => outdata_reg_b, + power_up_uninitialized => "FALSE", + widthad_a => widthad_a, + widthad_b => widthad_a, + width_a => width_a, + width_b => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clocken0 => wrclocken, + clocken1 => rdclocken, + wren_a => wren, + clock0 => wrclock, + clock1 => rdclock, + address_a => wraddress, + address_b => rdaddress, + data_a => data, + q_b => sub_wire0 + ); + +END SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/invaders_audio.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/custom_io.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/custom_io.vhd new file mode 100644 index 00000000..7fe8da50 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/custom_io.vhd @@ -0,0 +1,25 @@ +library ieee; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library work; +use work.target_pkg.all; +use work.platform_pkg.all; +use work.project_pkg.all; + +entity custom_io is + port + ( + project_i : out from_PROJECT_IO_t; + project_o : in to_PROJECT_IO_t; + platform_i : out from_PLATFORM_IO_t; + platform_o : in to_PLATFORM_IO_t; + target_i : out from_TARGET_IO_t; + target_o : in to_TARGET_IO_t + ); +end entity custom_io; + +architecture SYN of custom_io is + +begin +end architecture SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/keyboard.v b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/keyboard.v new file mode 100644 index 00000000..50a0376e --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/keyboard.v @@ -0,0 +1,72 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[7:0] joystick +); + +reg pressed; +reg e0; +wire [7:0] keyb_data; +wire keyb_valid; + +// PS/2 interface +ps2_intf ps2( + clk, + !reset, + + ps2_kbd_clk, + ps2_kbd_data, + + // Byte-wide data interface - only valid for one clock + // so must be latched externally if required + keyb_data, + keyb_valid +); + + + + +always @(posedge reset or posedge clk) begin + + if(reset) begin + pressed <= 1'b0; + e0 <= 1'b0; + + joystick <= 8'd0; + end else begin + if (keyb_valid) begin + if (keyb_data == 8'HE0) + e0 <=1'b1; + else if (keyb_data == 8'HF0) + pressed <= 1'b0; + else begin + case({e0, keyb_data}) + 9'H016: joystick[1] <= pressed; // 1 + 9'H01E: joystick[2] <= pressed; // 2 + + 9'H175: joystick[4] <= pressed; // arrow up + 9'H172: joystick[5] <= pressed; // arrow down + 9'H16B: joystick[6] <= pressed; // arrow left + 9'H174: joystick[7] <= pressed; // arrow right + + 9'H029: joystick[0] <= pressed; // Space +// 9'H011: joystick[1] <= pressed; // Left Alt +// 9'H00d: joystick[2] <= pressed; // Tab + 9'H076: joystick[3] <= pressed; // Escape + + endcase; + + pressed <= 1'b1; + e0 <= 1'b0; + end + end + end +end + +endmodule diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/osd.v b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/osd.v new file mode 100644 index 00000000..58cd8291 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/osd.v @@ -0,0 +1,191 @@ +// 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 pclk, + + // SPI interface + input sck, + input ss, + input sdi, + + // VGA signals coming from core + input [5:0] red_in, + input [5:0] green_in, + input [5:0] blue_in, + input hs_in, + input vs_in, + + // enable scanlines + input scanline_ena_h, + + // VGA signals going to video connector + output [5:0] red_out, + output [5:0] green_out, + output [5:0] blue_out, + output hs_out, + output vs_out +); + +parameter OSD_X_OFFSET = 10'd0; +parameter OSD_Y_OFFSET = 10'd0; +parameter OSD_COLOR = 3'd1; + +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 [7:0] sbuf; +reg [7:0] cmd; +reg [4:0] cnt; +reg [10:0] bcnt; +reg osd_enable; + +reg [7:0] osd_buffer [2047:0]; // the OSD buffer itself + +// the OSD has its own SPI interface to the io controller +always@(posedge sck, posedge ss) begin + if(ss == 1'b1) begin + cnt <= 5'd0; + bcnt <= 11'd0; + end else begin + sbuf <= { sbuf[6:0], sdi}; + + // 0:7 is command, rest payload + if(cnt < 15) + cnt <= cnt + 4'd1; + else + cnt <= 4'd8; + + if(cnt == 7) begin + cmd <= {sbuf[6:0], sdi}; + + // lower three command bits are line address + bcnt <= { sbuf[1:0], sdi, 8'h00}; + + // command 0x40: OSDCMDENABLE, OSDCMDDISABLE + if(sbuf[6:3] == 4'b0100) + osd_enable <= sdi; + end + + // command 0x20: OSDCMDWRITE + if((cmd[7:3] == 5'b00100) && (cnt == 15)) begin + osd_buffer[bcnt] <= {sbuf[6:0], sdi}; + bcnt <= bcnt + 11'd1; + end + end +end + +// ********************************************************************************* +// video timing and sync polarity anaylsis +// ********************************************************************************* + +// horizontal counter +reg [9:0] h_cnt; +reg hsD, hsD2; +reg [9:0] hs_low, hs_high; +wire hs_pol = hs_high < hs_low; +wire [9:0] h_dsp_width = hs_pol?hs_low:hs_high; +wire [9:0] h_dsp_ctr = { 1'b0, h_dsp_width[9:1] }; +reg scanline = 0; + +always @(posedge pclk) begin + // bring hsync into local clock domain + hsD <= hs_in; + hsD2 <= hsD; + + // falling edge of hs_in + if(!hsD && hsD2) begin + h_cnt <= 10'd0; + hs_high <= h_cnt; + scanline <= ~scanline; + end + + // rising edge of hs_in + else if(hsD && !hsD2) begin + h_cnt <= 10'd0; + hs_low <= h_cnt; + end + + else + h_cnt <= h_cnt + 10'd1; +end + +// vertical counter +reg [9:0] v_cnt; +reg vsD, vsD2; +reg [9:0] vs_low, vs_high; +wire vs_pol = vs_high < vs_low; +wire [9:0] v_dsp_width = vs_pol?vs_low:vs_high; +wire [9:0] v_dsp_ctr = { 1'b0, v_dsp_width[9:1] }; + +always @(posedge hs_in) begin + // bring vsync into local clock domain + vsD <= vs_in; + vsD2 <= vsD; + + // falling edge of vs_in + if(!vsD && vsD2) begin + v_cnt <= 10'd0; + vs_high <= v_cnt; + end + + // rising edge of vs_in + else if(vsD && !vsD2) begin + v_cnt <= 10'd0; + vs_low <= v_cnt; + end + + else + v_cnt <= v_cnt + 10'd1; +end + +// area in which OSD is being displayed +wire [9:0] h_osd_start = h_dsp_ctr + OSD_X_OFFSET - (OSD_WIDTH >> 1); +wire [9:0] h_osd_end = h_dsp_ctr + OSD_X_OFFSET + (OSD_WIDTH >> 1) - 1; +wire [9:0] v_osd_start = v_dsp_ctr + OSD_Y_OFFSET - (OSD_HEIGHT >> 1); +wire [9:0] v_osd_end = v_dsp_ctr + OSD_Y_OFFSET + (OSD_HEIGHT >> 1) - 1; + +reg h_osd_active, v_osd_active; +always @(posedge pclk) begin + if(hs_in != hs_pol) begin + if(h_cnt == h_osd_start) h_osd_active <= 1'b1; + if(h_cnt == h_osd_end) h_osd_active <= 1'b0; + end + if(vs_in != vs_pol) begin + if(v_cnt == v_osd_start) v_osd_active <= 1'b1; + if(v_cnt == v_osd_end) v_osd_active <= 1'b0; + end +end + +wire osd_de = osd_enable && h_osd_active && v_osd_active; + +wire [7:0] osd_hcnt = h_cnt - h_osd_start + 7'd1; // one pixel offset for osd_byte register +wire [6:0] osd_vcnt = v_cnt - v_osd_start; + +wire osd_pixel = osd_byte[osd_vcnt[3:1]]; + +reg [7:0] osd_byte; +always @(posedge pclk) + osd_byte <= osd_buffer[{osd_vcnt[6:4], osd_hcnt}]; + +wire [2:0] osd_color = OSD_COLOR; +wire [5:0] red_t = (scanline && scanline_ena_h)?{1'b0, red_in[5:1]}: red_in; +wire [5:0] green_t = (scanline && scanline_ena_h)?{1'b0, green_in[5:1]}: green_in; +wire [5:0] blue_t = (scanline && scanline_ena_h)?{1'b0, blue_in[5:1]}: blue_in; + +assign red_out = !osd_de?red_t: {osd_pixel, osd_pixel, osd_color[2], red_t[5:3] }; +assign green_out = !osd_de?green_t:{osd_pixel, osd_pixel, osd_color[1], green_t[5:3]}; +assign blue_out = !osd_de?blue_t: {osd_pixel, osd_pixel, osd_color[0], blue_t[5:3] }; + +assign hs_out = hs_in; +assign vs_out = vs_in; + +endmodule \ No newline at end of file diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/pll27.qip b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/pll27.qip new file mode 100644 index 00000000..cd28ff9e --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/pll27.qip @@ -0,0 +1,6 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.0" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll27.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll27_inst.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll27.cmp"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll27.ppf"] diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/pll27.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/pll27.vhd new file mode 100644 index 00000000..c882cf03 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/pll27.vhd @@ -0,0 +1,414 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll27.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.0.0 Build 156 04/24/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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll27 IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC + ); +END pll27; + + +ARCHITECTURE SYN OF pll27 IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire6_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire6_bv(0 DOWNTO 0) <= "0"; + sub_wire6 <= To_stdlogicvector(sub_wire6_bv); + sub_wire3 <= sub_wire0(2); + sub_wire2 <= sub_wire0(0); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c0 <= sub_wire2; + c2 <= sub_wire3; + sub_wire4 <= inclk0; + sub_wire5 <= sub_wire6(0 DOWNTO 0) & sub_wire4; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 13500, + clk0_duty_cycle => 50, + clk0_multiply_by => 7, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 20, + clk1_phase_shift => "0", + clk2_divide_by => 27, + clk2_duty_cycle => 50, + clk2_multiply_by => 40, + clk2_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll27", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire5, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "13500" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "27" +-- 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 "0.014000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "20.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "40.000000" +-- 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 "ps" +-- 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 "7" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "8" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "16" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "0.01400000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "40.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "1" +-- 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 "ns" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ns" +-- 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 "pll27.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 "13500" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "7" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "40" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..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 pll27.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll27.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll27.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll27.cmp TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll27.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll27_inst.vhd TRUE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/pll27_inst.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/pll27_inst.vhd new file mode 100644 index 00000000..fe2f2bfa --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/pll27_inst.vhd @@ -0,0 +1,6 @@ +pll27_inst : pll27 PORT MAP ( + inclk0 => inclk0_sig, + c0 => c0_sig, + c1 => c1_sig, + c2 => c2_sig + ); diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/ps2_intf.v b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/ps2_intf.v new file mode 100644 index 00000000..f128cda9 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/ps2_intf.v @@ -0,0 +1,141 @@ +// 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 + +// This is input-only for the time being +module ps2_intf #(parameter filter_length=8)( + input CLK, + input nRESET, + + // PS/2 interface (could be bi-dir) + input PS2_CLK, + input PS2_DATA, + + // Byte-wide data interface - only valid for one clock + // so must be latched externally if required + output reg [7:0] DATA, + output reg VALID, + output reg ERROR +); + + reg [filter_length-1:0] clk_filter; + + reg ps2_clk_in; + reg ps2_dat_in; + // Goes high when a clock falling edge is detected + reg clk_edge; + reg [3:0] bit_count; + reg [8:0] shiftreg; + reg parity; + // Register input signals + + always @(negedge nRESET or posedge CLK) + if (!nRESET) begin + ps2_clk_in <= 1'b1; + ps2_dat_in <= 1'b1; + clk_filter <= 8'b11111111; + clk_edge <= 1'b0; + end else begin + // Register inputs (and filter clock) + ps2_dat_in <= PS2_DATA; + clk_filter <= {PS2_CLK, clk_filter[filter_length-1:1]}; + clk_edge <= 1'b0; + + if (clk_filter) + // Filtered clock is high + ps2_clk_in <= 1'b1; + else begin + // Filter clock is low, check for edge + if (ps2_clk_in) clk_edge <= 1'b1; + ps2_clk_in <= 1'b0; + end + end + + // Shift in keyboard data + always @(negedge nRESET or posedge CLK) begin + if (!nRESET) begin + bit_count <= 4'd0; + shiftreg <= 9'd0; + parity <= 1'b0; + DATA <= 8'd0; + VALID <= 1'b0; + ERROR <= 1'b0; + end else begin + // Clear flags + VALID <= 1'b0; + ERROR <= 1'b0; + + if (clk_edge) begin + // We have a new bit from the keyboard for processing + if (bit_count == 4'd0) begin + // Idle state, check for start bit (0) only and don't + // start counting bits until we get it + parity <= 1'b0; + if (!ps2_dat_in) bit_count <= bit_count + 4'd1; // This is a start bit + end else begin + // Running. 8-bit data comes in LSb first followed by + // a single stop bit (1) + if (bit_count < 4'd10) begin + // Shift in data and parity (9 bits) + bit_count <= bit_count + 4'd1; + shiftreg <= {ps2_dat_in, shiftreg[8:1]}; + parity <= parity ^ ps2_dat_in; // Calculate parity + end else if (ps2_dat_in) begin + // Valid stop bit received + bit_count <= 4'd0; // back to idle + if (parity) begin + // Parity correct, submit data to host + DATA <= shiftreg[7:0]; + VALID <= 1'b1; + end else begin + // Error + ERROR <= 1'b1; + end + end + else begin + // Invalid stop bit + bit_count <= 4'd0; // back to idle + ERROR <= 1'b1; + end + end + end + end + end + +endmodule diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/sigma_delta_dac.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/sigma_delta_dac.vhd new file mode 100644 index 00000000..fdec465f --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/sigma_delta_dac.vhd @@ -0,0 +1,33 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sigma_delta_dac is + port + ( + clk : in std_logic; + din : in std_logic_vector(7 downto 0); + + dout : out std_logic + ); +end entity sigma_delta_dac; + +architecture SYN of sigma_delta_dac is + + signal si : unsigned(15 downto 0) := (others => '0'); + signal so : unsigned(15 downto 0) := (others => '0'); + +begin + + si(15 downto 10) <= "000000"; + si(9 downto 0) <= unsigned(so(9) & so(9) & din); + + process (clk) + begin + if rising_edge(clk) then + so <= si + so; + dout <= so(9); + end if; + end process; + +end architecture SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/target_pkg.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/target_pkg.vhd new file mode 100644 index 00000000..f66ee0a1 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/target_pkg.vhd @@ -0,0 +1,30 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +library work; +use work.pace_pkg.all; + +package target_pkg is + + -- + -- PACE constants which *MUST* be defined + -- +constant PACE_TARGET : PACETargetType := PACE_TARGET_MIST; +constant PACE_FPGA_VENDOR : PACEFpgaVendor_t := PACE_FPGA_VENDOR_ALTERA; +constant PACE_FPGA_FAMILY : PACEFpgaFamily_t := PACE_FPGA_FAMILY_CYCLONE3; + +constant PACE_CLKIN0 : natural := 27; + + -- + -- DE1-specific constants + -- + type from_TARGET_IO_t is record + not_used : std_logic; + end record; + + type to_TARGET_IO_t is record + not_used : std_logic; + end record; + + end; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/target_top.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/target_top.vhd new file mode 100644 index 00000000..f37dbf11 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/target_top.vhd @@ -0,0 +1,362 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.project_pkg.all; +use work.platform_pkg.all; +use work.target_pkg.all; + +entity target_top is + port + ( + + CLOCK_27 : in std_logic; + SPI_SCK : in std_logic; + SPI_DI : in std_logic; + SPI_SS2 : in std_logic; + SPI_SS3 : in std_logic; + SPI_SS4 : in std_logic; + SPI_DO : out std_logic; + LED : out std_logic; + CONF_DATA0 : in std_logic; + AUDIO_L : out std_logic; + AUDIO_R : out std_logic; + VGA_VS : out std_logic; -- VGA H_SYNC + VGA_HS : out std_logic; -- VGA V_SYNC + VGA_R : out std_logic_vector(5 downto 0); -- VGA Red[3:0] + VGA_G : out std_logic_vector(5 downto 0); -- VGA Green[3:0] + VGA_B : out std_logic_vector(5 downto 0) -- VGA Blue[3:0] + + ); + +end target_top; + +architecture SYN of target_top is + + signal init : std_logic := '1'; + signal clock_50 : std_logic; + signal clkrst_i : from_CLKRST_t; + signal buttons_i : from_BUTTONS_t; + signal switches_i : from_SWITCHES_t; + signal leds_o : to_LEDS_t; + signal inputs_i : from_INPUTS_t; + signal video_i : from_VIDEO_t; + signal video_o : to_VIDEO_t; + signal audio_i : from_AUDIO_t; + signal audio_o : to_AUDIO_t; + signal project_i : from_PROJECT_IO_t; + signal project_o : to_PROJECT_IO_t; + signal platform_i : from_PLATFORM_IO_t; + signal platform_o : to_PLATFORM_IO_t; + signal target_i : from_TARGET_IO_t; + signal target_o : to_TARGET_IO_t; + + signal clk_kb : std_logic; + signal joystick1 : std_logic_vector(7 downto 0); + signal joystick2 : std_logic_vector(7 downto 0); + signal switches : std_logic_vector(1 downto 0); + signal buttons : std_logic_vector(1 downto 0); + signal ps2Clk : std_logic; + signal ps2Data : std_logic; + signal kbd_joy0 : std_logic_vector(7 downto 0); + signal osd_pclk : std_logic; + signal clk8m : std_logic; + signal clk16m : std_logic; + signal scandoubler_disable : std_logic; + signal hsync_out : std_logic; + signal vsync_out : std_logic; + signal csync_out : std_logic; + signal VGA_R_O : std_logic_vector(5 downto 0); + signal VGA_G_O : std_logic_vector(5 downto 0); + signal VGA_B_O : std_logic_vector(5 downto 0); + signal VGA_HS_O : std_logic; + signal VGA_VS_O : std_logic; + signal status : std_logic_vector(7 downto 0); + signal reset : std_logic; + + + constant CONF_STR : string := "Midw.8080;;O4,Scanlines,OFF,ON;T5,Reset;V,v1.0 by Gehstock;"; + + function to_slv(s: string) return std_logic_vector is + constant ss: string(1 to s'length) := s; + variable rval: std_logic_vector(1 to 8 * s'length); + variable p: integer; + variable c: integer; + + begin + for i in ss'range loop + p := 8 * i; + c := character'pos(ss(i)); + rval(p - 7 to p) := std_logic_vector(to_unsigned(c,8)); + end loop; + return rval; + + end function; + + component user_io + generic ( STRLEN : integer := 0 ); + port ( + SPI_CLK, SPI_SS_IO, SPI_MOSI :in std_logic; + SPI_MISO : out std_logic; + conf_str : in std_logic_vector(8*STRLEN-1 downto 0); + switches : out std_logic_vector(1 downto 0); + buttons : out std_logic_vector(1 downto 0); + scandoubler_disable : out std_logic; + joystick_0 : out std_logic_vector(7 downto 0); + joystick_1 : out std_logic_vector(7 downto 0); + status : out std_logic_vector(7 downto 0); + ps2_clk : in std_logic; + ps2_kbd_clk : out std_logic; + ps2_kbd_data : out std_logic + ); + end component user_io; + + component osd + port ( + pclk, sck, ss, sdi, hs_in, vs_in, scanline_ena_h : in std_logic; + red_in, blue_in, green_in : in std_logic_vector(5 downto 0); + red_out, blue_out, green_out : out std_logic_vector(5 downto 0); + hs_out, vs_out : out std_logic + ); + end component osd; + + component keyboard + PORT( + clk : in std_logic; + reset : in std_logic; + ps2_kbd_clk : in std_logic; + ps2_kbd_data : in std_logic; + joystick : out std_logic_vector (7 downto 0) + ); + end component; + + + component pll27 + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC; + c1 : OUT STD_LOGIC; + c2 : OUT STD_LOGIC + ); + end component; + + + +begin + +LED <= '1'; + +-- OSD + osd_pclk <= clk16m when scandoubler_disable='0' else clk8m; + + -- a minimig vga->scart cable expects a composite sync signal on the VGA_HS output + -- and VCC on VGA_VS (to switch into rgb mode) + csync_out <= '1' when (hsync_out = vsync_out) else '0'; + VGA_HS <= hsync_out when scandoubler_disable='0' else csync_out; + VGA_VS <= vsync_out when scandoubler_disable='0' else '1'; + + osd_inst : osd + port map ( + pclk => osd_pclk, + sdi => SPI_DI, + sck => SPI_SCK, + ss => SPI_SS3, + red_in => VGA_R_O, + green_in => VGA_G_O, + blue_in => VGA_B_O, + hs_in => VGA_HS_O, + vs_in => VGA_VS_O, + scanline_ena_h => status(4), + red_out => VGA_R, + green_out => VGA_G, + blue_out => VGA_B, + hs_out => hsync_out, + vs_out => vsync_out + ); + + user_io_inst : user_io + generic map (STRLEN => CONF_STR'length) + port map ( + SPI_CLK => SPI_SCK, + SPI_SS_IO => CONF_DATA0, + SPI_MOSI => SPI_DI, + SPI_MISO => SPI_DO, + conf_str => to_slv(CONF_STR), + switches => switches, + buttons => buttons, + scandoubler_disable => scandoubler_disable, + joystick_1 => joystick2, + joystick_0 => joystick1, + status => status, + ps2_clk => clk_kb, + ps2_kbd_clk => ps2Clk, + ps2_kbd_data => ps2Data + ); + + u_keyboard : keyboard + port map( + clk => clock_50, + reset => reset, + ps2_kbd_clk => ps2Clk, + ps2_kbd_data => ps2Data, + joystick => kbd_joy0 +); + + +kbclk : pll27 + port map + ( + inclk0 => CLOCK_27, + c0 => clk_kb, + c1 => clk8m, + c2 => clk16m + ); + clkrst_i.clk_ref <= CLOCK_27; + + pll_27_inst : entity work.pllclk_ez + port map + ( + inclk0 => CLOCK_27, + c0 => clock_50, -- master clock + c1 => clkrst_i.clk(1) -- video clock + ); + clkrst_i.clk(0)<=clock_50; + + + -- FPGA STARTUP + -- should extend power-on reset if registers init to '0' + process (clock_50) + variable count : std_logic_vector (11 downto 0) := (others => '0'); + begin + if rising_edge(clock_50) then + if count = X"FFF" then + init <= '0'; + else + count := count + 1; + init <= '1'; + end if; + end if; + end process; + + clkrst_i.arst <= init or status(5) or buttons(1); + clkrst_i.arst_n <= not clkrst_i.arst; + + GEN_RESETS : for i in 0 to 3 generate + + process (clkrst_i.clk(i), clkrst_i.arst) + variable rst_r : std_logic_vector(2 downto 0) := (others => '0'); + begin + if clkrst_i.arst = '1' then + rst_r := (others => '1'); + elsif rising_edge(clkrst_i.clk(i)) then + rst_r := rst_r(rst_r'left-1 downto 0) & '0'; + end if; + clkrst_i.rst(i) <= rst_r(rst_r'left); + end process; + + end generate GEN_RESETS; + + + inputs_i.jamma_n.coin(1) <= not (kbd_joy0(3)) or status(2);--ESC + inputs_i.jamma_n.p(1).start <= not (kbd_joy0(3)) or status(2);--ESC + + inputs_i.jamma_n.p(1).up <= not (joystick1(3) or joystick2(3) or kbd_joy0(4)); + inputs_i.jamma_n.p(1).down <= not (joystick1(2) or joystick2(2) or kbd_joy0(5)); + inputs_i.jamma_n.p(1).left <= not (joystick1(1) or joystick2(1) or kbd_joy0(6)); + inputs_i.jamma_n.p(1).right <= not (joystick1(0) or joystick2(0) or kbd_joy0(7)); + + inputs_i.jamma_n.p(1).button(1) <= not (joystick1(4) or joystick2(4) or kbd_joy0(0)); + inputs_i.jamma_n.p(1).button(2) <= '1'; + inputs_i.jamma_n.p(1).button(3) <= '1'; + inputs_i.jamma_n.p(1).button(4) <= '1'; + inputs_i.jamma_n.p(1).button(5) <= '1'; + + inputs_i.jamma_n.p(2).up <= not (joystick1(3) or joystick2(3) or kbd_joy0(4)); + inputs_i.jamma_n.p(2).down <= not (joystick1(2) or joystick2(2) or kbd_joy0(5)); + inputs_i.jamma_n.p(2).left <= not (joystick1(1) or joystick2(1) or kbd_joy0(6)); + inputs_i.jamma_n.p(2).right <= not (joystick1(0) or joystick2(0) or kbd_joy0(7)); + + inputs_i.jamma_n.p(2).button(1) <= not (joystick1(4) or joystick2(4) or kbd_joy0(0)); + inputs_i.jamma_n.p(2).button(2) <= '1'; + inputs_i.jamma_n.p(2).button(3) <= '1'; + inputs_i.jamma_n.p(2).button(4) <= '1'; + inputs_i.jamma_n.p(2).button(5) <= '1'; + + + -- not currently wired to any inputs + inputs_i.jamma_n.coin_cnt <= (others => '1'); + inputs_i.jamma_n.coin(2) <= '1'; + inputs_i.jamma_n.service <= '1'; + inputs_i.jamma_n.tilt <= '1'; + inputs_i.jamma_n.test <= '1'; + + BLK_VIDEO : block + begin + + video_i.clk <= clkrst_i.clk(1); -- by convention + video_i.clk_ena <= '1'; + video_i.reset <= clkrst_i.rst(1); + + VGA_R_O <= video_o.rgb.r(video_o.rgb.r'left downto video_o.rgb.r'left-5); + VGA_G_O <= video_o.rgb.g(video_o.rgb.g'left downto video_o.rgb.g'left-5); + VGA_B_O <= video_o.rgb.b(video_o.rgb.b'left downto video_o.rgb.b'left-5); + VGA_HS_O <= video_o.hsync; + VGA_VS_O <= video_o.vsync; + + end block BLK_VIDEO; + + BLK_AUDIO : block + begin + + dacl : entity work.sigma_delta_dac + port map ( + clk => CLOCK_27, + din => audio_o.ldata(15 downto 8), + dout => AUDIO_L + ); + + dacr : entity work.sigma_delta_dac + port map ( + clk => CLOCK_27, + din => audio_o.rdata(15 downto 8), + dout => AUDIO_R + ); + + end block BLK_AUDIO; + + pace_inst : entity work.pace + port map + ( + -- clocks and resets + clkrst_i => clkrst_i, + + -- misc inputs and outputs + buttons_i => buttons_i, + switches_i => switches_i, + leds_o => open, + + -- controller inputs + inputs_i => inputs_i, + + -- VGA video + video_i => video_i, + video_o => video_o, + + -- sound + audio_i => audio_i, + audio_o => audio_o, + + -- custom i/o + project_i => project_i, + project_o => project_o, + platform_i => platform_i, + platform_o => platform_o, + target_i => target_i, + target_o => target_o + ); +end SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/user_io.v b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/user_io.v new file mode 100644 index 00000000..c66c515f --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/mist/user_io.v @@ -0,0 +1,411 @@ +// +// user_io.v +// +// user_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 . +// + +// parameter STRLEN and the actual length of conf_str have to match + +module user_io #(parameter STRLEN=0) ( + input [(8*STRLEN)-1:0] conf_str, + + input SPI_CLK, + input SPI_SS_IO, + output reg SPI_MISO, + input SPI_MOSI, + + 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 reg [7:0] status, + + // connection to sd card emulation + input [31:0] sd_lba, + input sd_rd, + input sd_wr, + output reg sd_ack, + input sd_conf, + input sd_sdhc, + output reg [7:0] sd_dout, + output reg sd_dout_strobe, + input [7:0] sd_din, + output reg sd_din_strobe, + + + // ps2 keyboard emulation + input ps2_clk, // 12-16khz provided by core + output ps2_kbd_clk, + output reg ps2_kbd_data, + output ps2_mouse_clk, + output reg ps2_mouse_data, + + // serial com port + input [7:0] serial_data, + input serial_strobe +); + +reg [6:0] sbuf; +reg [7:0] cmd; +reg [2:0] bit_cnt; // counts bits 0-7 0-7 ... +reg [7:0] byte_cnt; // counts bytes +reg [7:0] joystick0; +reg [7:0] joystick1; +reg [4:0] but_sw; +reg [2:0] stick_idx; + +assign buttons = but_sw[1:0]; +assign switches = but_sw[3:2]; +assign scandoubler_disable = but_sw[4]; + +// 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 }; + +// filter spi clock. the 8 bit gate delay is ~2.5ns in total +wire [7:0] spi_sck_D = { spi_sck_D[6:0], SPI_CLK } /* synthesis keep */; +wire spi_sck = (spi_sck && spi_sck_D != 8'h00) || (!spi_sck && spi_sck_D == 8'hff); + +// drive MISO only when transmitting core id +always@(negedge spi_sck or posedge SPI_SS_IO) begin + if(SPI_SS_IO == 1) begin + SPI_MISO <= 1'bZ; + end else begin + + // first byte returned is always core type, further bytes are + // command dependent + if(byte_cnt == 0) begin + SPI_MISO <= core_type[~bit_cnt]; + + end else begin + // reading serial fifo + if(cmd == 8'h1b) begin + // send alternating flag byte and data + if(byte_cnt[0]) SPI_MISO <= serial_out_status[~bit_cnt]; + else SPI_MISO <= serial_out_byte[~bit_cnt]; + end + + // reading config string + else if(cmd == 8'h14) begin + // returning a byte from string + if(byte_cnt < STRLEN + 1) + SPI_MISO <= conf_str[{STRLEN - byte_cnt,~bit_cnt}]; + else + SPI_MISO <= 1'b0; + end + + // reading sd card status + else if(cmd == 8'h16) begin + if(byte_cnt == 1) + SPI_MISO <= sd_cmd[~bit_cnt]; + else if((byte_cnt >= 2) && (byte_cnt < 6)) + SPI_MISO <= sd_lba[{5-byte_cnt, ~bit_cnt}]; + else + SPI_MISO <= 1'b0; + end + + // reading sd card write data + else if(cmd == 8'h18) + SPI_MISO <= sd_din[~bit_cnt]; + + else + SPI_MISO <= 1'b0; + end + end +end + +// ---------------- PS2 --------------------- + +// 8 byte fifos to store ps2 bytes +localparam PS2_FIFO_BITS = 3; + +// keyboard +reg [7:0] ps2_kbd_fifo [(2**PS2_FIFO_BITS)-1:0]; +reg [PS2_FIFO_BITS-1:0] ps2_kbd_wptr; +reg [PS2_FIFO_BITS-1:0] ps2_kbd_rptr; + +// ps2 transmitter state machine +reg [3:0] ps2_kbd_tx_state; +reg [7:0] ps2_kbd_tx_byte; +reg ps2_kbd_parity; + +assign ps2_kbd_clk = ps2_clk || (ps2_kbd_tx_state == 0); + +// ps2 transmitter +// Takes a byte from the FIFO and sends it in a ps2 compliant serial format. +reg ps2_kbd_r_inc; +always@(posedge ps2_clk) begin + ps2_kbd_r_inc <= 1'b0; + + if(ps2_kbd_r_inc) + ps2_kbd_rptr <= ps2_kbd_rptr + 1; + + // transmitter is idle? + if(ps2_kbd_tx_state == 0) begin + // data in fifo present? + if(ps2_kbd_wptr != ps2_kbd_rptr) begin + // load tx register from fifo + ps2_kbd_tx_byte <= ps2_kbd_fifo[ps2_kbd_rptr]; + ps2_kbd_r_inc <= 1'b1; + + // reset parity + ps2_kbd_parity <= 1'b1; + + // start transmitter + ps2_kbd_tx_state <= 4'd1; + + // put start bit on data line + ps2_kbd_data <= 1'b0; // start bit is 0 + end + end else begin + + // transmission of 8 data bits + if((ps2_kbd_tx_state >= 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'b1; // stop bit is 1 + + // advance state machine + if(ps2_kbd_tx_state < 11) + ps2_kbd_tx_state <= ps2_kbd_tx_state + 4'd1; + else + ps2_kbd_tx_state <= 4'd0; + + end +end + +// mouse +reg [7:0] ps2_mouse_fifo [(2**PS2_FIFO_BITS)-1:0]; +reg [PS2_FIFO_BITS-1:0] ps2_mouse_wptr; +reg [PS2_FIFO_BITS-1:0] ps2_mouse_rptr; + +// ps2 transmitter state machine +reg [3:0] ps2_mouse_tx_state; +reg [7:0] ps2_mouse_tx_byte; +reg ps2_mouse_parity; + +assign ps2_mouse_clk = ps2_clk || (ps2_mouse_tx_state == 0); + +// ps2 transmitter +// Takes a byte from the FIFO and sends it in a ps2 compliant serial format. +reg ps2_mouse_r_inc; +always@(posedge ps2_clk) begin + ps2_mouse_r_inc <= 1'b0; + + if(ps2_mouse_r_inc) + ps2_mouse_rptr <= ps2_mouse_rptr + 1; + + // transmitter is idle? + if(ps2_mouse_tx_state == 0) begin + // data in fifo present? + if(ps2_mouse_wptr != ps2_mouse_rptr) begin + // load tx register from fifo + ps2_mouse_tx_byte <= ps2_mouse_fifo[ps2_mouse_rptr]; + ps2_mouse_r_inc <= 1'b1; + + // reset parity + ps2_mouse_parity <= 1'b1; + + // start transmitter + ps2_mouse_tx_state <= 4'd1; + + // put start bit on data line + ps2_mouse_data <= 1'b0; // start bit is 0 + end + end else begin + + // transmission of 8 data bits + if((ps2_mouse_tx_state >= 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'b1; // stop bit is 1 + + // advance state machine + if(ps2_mouse_tx_state < 11) + ps2_mouse_tx_state <= ps2_mouse_tx_state + 4'd1; + else + ps2_mouse_tx_state <= 4'd0; + + end +end + +// fifo to receive serial data from core to be forwarded to io controller + +// 16 byte fifo to store serial bytes +localparam SERIAL_OUT_FIFO_BITS = 6; +reg [7:0] serial_out_fifo [(2**SERIAL_OUT_FIFO_BITS)-1:0]; +reg [SERIAL_OUT_FIFO_BITS-1:0] serial_out_wptr; +reg [SERIAL_OUT_FIFO_BITS-1:0] serial_out_rptr; + +wire serial_out_data_available = serial_out_wptr != serial_out_rptr; +wire [7:0] serial_out_byte = serial_out_fifo[serial_out_rptr] /* synthesis keep */; +wire [7:0] serial_out_status = { 7'b1000000, serial_out_data_available}; + +// status[0] is reset signal from io controller and is thus used to flush +// the fifo +always @(posedge serial_strobe or posedge status[0]) begin + if(status[0] == 1) begin + serial_out_wptr <= 0; + end else begin + serial_out_fifo[serial_out_wptr] <= serial_data; + serial_out_wptr <= serial_out_wptr + 1; + end +end + +always@(negedge spi_sck or posedge status[0]) begin + if(status[0] == 1) begin + serial_out_rptr <= 0; + end else begin + if((byte_cnt != 0) && (cmd == 8'h1b)) begin + // read last bit -> advance read pointer + if((bit_cnt == 7) && !byte_cnt[0] && serial_out_data_available) + serial_out_rptr <= serial_out_rptr + 1; + end + end +end + +// SPI receiver +always@(posedge spi_sck or posedge SPI_SS_IO) begin + + if(SPI_SS_IO == 1) begin + bit_cnt <= 3'd0; + byte_cnt <= 8'd0; + sd_ack <= 1'b0; + sd_dout_strobe <= 1'b0; + sd_din_strobe <= 1'b0; + end else begin + sd_dout_strobe <= 1'b0; + sd_din_strobe <= 1'b0; + + sbuf[6:0] <= { sbuf[5:0], SPI_MOSI }; + bit_cnt <= bit_cnt + 3'd1; + if((bit_cnt == 7)&&(byte_cnt != 8'd255)) + byte_cnt <= byte_cnt + 8'd1; + + // finished reading command byte + if(bit_cnt == 7) begin + if(byte_cnt == 0) begin + cmd <= { sbuf, SPI_MOSI}; + + // fetch first byte when sectore FPGA->IO command has been seen + if({ sbuf, SPI_MOSI} == 8'h18) + sd_din_strobe <= 1'b1; + + if(({ sbuf, SPI_MOSI} == 8'h17) || ({ sbuf, SPI_MOSI} == 8'h18)) + sd_ack <= 1'b1; + + end else begin + + // buttons and switches + if(cmd == 8'h01) + but_sw <= { sbuf[3:0], SPI_MOSI }; + + if(cmd == 8'h02) + joystick_0 <= { sbuf, SPI_MOSI }; + + if(cmd == 8'h03) + joystick_1 <= { sbuf, SPI_MOSI }; + + if(cmd == 8'h04) begin + // store incoming ps2 mouse bytes + ps2_mouse_fifo[ps2_mouse_wptr] <= { sbuf, SPI_MOSI }; + ps2_mouse_wptr <= ps2_mouse_wptr + 1; + end + + if(cmd == 8'h05) begin + // store incoming ps2 keyboard bytes + ps2_kbd_fifo[ps2_kbd_wptr] <= { sbuf, SPI_MOSI }; + ps2_kbd_wptr <= ps2_kbd_wptr + 1; + end + + if(cmd == 8'h15) + status <= { sbuf[6:0], SPI_MOSI }; + + // send sector IO -> FPGA + if(cmd == 8'h17) begin + // flag that download begins + sd_dout <= { sbuf, SPI_MOSI}; + sd_dout_strobe <= 1'b1; + end + + // send sector FPGA -> IO + if(cmd == 8'h18) + sd_din_strobe <= 1'b1; + + // send SD config IO -> FPGA + if(cmd == 8'h19) begin + // flag that download begins + sd_dout <= { sbuf, SPI_MOSI}; + // sd card knows data is config if sd_dout_strobe is asserted + // with sd_ack still being inactive (low) + sd_dout_strobe <= 1'b1; + end + + // joystick analog + if(cmd == 8'h1a) begin + // first byte is joystick indes + if(byte_cnt == 1) + stick_idx <= { sbuf[1:0], SPI_MOSI }; + else if(byte_cnt == 2) begin + // second byte is x axis + if(stick_idx == 0) + joystick_analog_0[15:8] <= { sbuf, SPI_MOSI }; + else if(stick_idx == 1) + joystick_analog_1[15:8] <= { sbuf, SPI_MOSI }; + end else if(byte_cnt == 3) begin + // third byte is y axis + if(stick_idx == 0) + joystick_analog_0[7:0] <= { sbuf, SPI_MOSI }; + else if(stick_idx == 1) + joystick_analog_1[7:0] <= { sbuf, SPI_MOSI }; + end + end + + end + end + end +end + +endmodule diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pace.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pace.vhd new file mode 100644 index 00000000..997095eb --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pace.vhd @@ -0,0 +1,199 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.sprite_pkg.all; +use work.platform_pkg.all; +use work.project_pkg.all; +use work.target_pkg.all; + +entity PACE is + port + ( + -- clocks and resets + clkrst_i : in from_CLKRST_t; + + -- misc I/O + buttons_i : in from_BUTTONS_t; + switches_i : in from_SWITCHES_t; + leds_o : out to_LEDS_t; + + -- controller inputs + inputs_i : in from_INPUTS_t; + + -- video + video_i : in from_VIDEO_t; + video_o : out to_VIDEO_t; + + -- audio + audio_i : in from_AUDIO_t; + audio_o : out to_AUDIO_t; + + -- custom i/o + project_i : in from_PROJECT_IO_t; + project_o : out to_PROJECT_IO_t; + platform_i : in from_PLATFORM_IO_t; + platform_o : out to_PLATFORM_IO_t; + target_i : in from_TARGET_IO_t; + target_o : out to_TARGET_IO_t + ); +end entity PACE; + +architecture SYN of PACE is + + constant CLK_1US_COUNTS : integer := + integer(PACE_CLKIN0 * PACE_CLK0_MULTIPLY_BY / PACE_CLK0_DIVIDE_BY); + + signal mapped_inputs : from_MAPPED_INPUTS_t(0 to PACE_INPUTS_NUM_BYTES-1); + + signal to_tilemap_ctl : to_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); + signal from_tilemap_ctl : from_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); + + signal to_bitmap_ctl : to_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); + signal from_bitmap_ctl : from_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); + + signal to_sprite_reg : to_SPRITE_REG_t; + signal to_sprite_ctl : to_SPRITE_CTL_t; + signal from_sprite_ctl : from_SPRITE_CTL_t; + signal spr0_hit : std_logic; + + signal to_graphics : to_GRAPHICS_t; + signal from_graphics : from_GRAPHICS_t; + + signal to_sound : to_SOUND_t; + signal from_sound : from_sound_t; + + +begin + + assert false + report "CLK0_FREQ_MHz=" & integer'image(CLK0_FREQ_MHz) & + " CLK_1US_COUNTS=" & integer'image(CLK_1US_COUNTS) + severity note; + + inputs_inst : entity work.inputs + generic map + ( + NUM_DIPS => PACE_NUM_SWITCHES, + NUM_INPUTS => PACE_INPUTS_NUM_BYTES, + CLK_1US_DIV => CLK_1US_COUNTS + ) + port map + ( + clk => clkrst_i.clk(0), + reset => clkrst_i.rst(0), + ps2clk => inputs_i.ps2_kclk, + ps2data => inputs_i.ps2_kdat, + jamma => inputs_i.jamma_n, + + dips => switches_i, + inputs => mapped_inputs + ); + + platform_inst : entity work.platform + generic map + ( + NUM_INPUT_BYTES => PACE_INPUTS_NUM_BYTES + ) + port map + ( + -- clocking and reset + clkrst_i => clkrst_i, + + -- misc inputs and outputs + buttons_i => buttons_i, + switches_i => switches_i, + leds_o => leds_o, + + -- controller inputs + inputs_i => mapped_inputs, + + -- graphics + bitmap_i => from_bitmap_ctl, + bitmap_o => to_bitmap_ctl, + + tilemap_i => from_tilemap_ctl, + tilemap_o => to_tilemap_ctl, + + sprite_reg_o => to_sprite_reg, + sprite_i => from_sprite_ctl, + sprite_o => to_sprite_ctl, + spr0_hit => spr0_hit, + + graphics_i => from_graphics, + graphics_o => to_graphics, + + -- sound + snd_i => from_sound, + snd_o => to_sound, + + -- custom i/o + project_i => project_i, + project_o => project_o, + platform_i => platform_i, + platform_o => platform_o, + target_i => target_i, + target_o => target_o + ); + + graphics_inst : entity work.Graphics + Port Map + ( + bitmap_ctl_i => to_bitmap_ctl, + bitmap_ctl_o => from_bitmap_ctl, + + tilemap_ctl_i => to_tilemap_ctl, + tilemap_ctl_o => from_tilemap_ctl, + + sprite_reg_i => to_sprite_reg, + sprite_ctl_i => to_sprite_ctl, + sprite_ctl_o => from_sprite_ctl, + spr0_hit => spr0_hit, + + graphics_i => to_graphics, + graphics_o => from_graphics, + + -- video (incl. clk) + video_i => video_i, + video_o => video_o + ); + + SOUND_BLOCK : block + signal snd_data_l : std_logic_vector(7 downto 0); + signal snd_data_r : std_logic_vector(7 downto 0); + signal snd_a : std_logic_vector(15 downto 0); + begin + + snd_a <= std_logic_vector(resize(unsigned(to_sound.a), snd_a'length)); + + sound_inst : entity work.Sound + generic map + ( + CLK_MHz => CLK0_FREQ_MHz + ) + port map + ( + sysclk => clkrst_i.clk(0), -- fudge for now + reset => clkrst_i.rst(0), + + sndif_rd => to_sound.rd, + sndif_wr => to_sound.wr, + sndif_addr => snd_a, + sndif_datai => to_sound.d, + + snd_clk => audio_o.clk, + snd_data_l => snd_data_l, + snd_data_r => snd_data_r, + sndif_datao => from_sound.d + ); + + -- route audio to both channels + audio_o.ldata <= snd_data_l & "00000000"; + audio_o.rdata <= snd_data_r & "00000000"; + + end block SOUND_BLOCK; + +end SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pace_pkg.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pace_pkg.vhd new file mode 100644 index 00000000..4f659cd8 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pace_pkg.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; + +package pace_pkg is + + -- + -- PACE constants which *MUST* be defined + -- + + type PACETargetType is + ( + PACE_TARGET_NANOBOARD_NB1, + PACE_TARGET_DE0, + PACE_TARGET_DE0_CV, -- 5CEBA4 + PACE_TARGET_DE0_NANO, -- EP4CE22 + PACE_TARGET_DE1, + PACE_TARGET_DE2, + PACE_TARGET_DE2_70, -- EP2C70 + PACE_TARGET_DE2_115, -- EP4CE115 + PACE_TARGET_P2, -- A02 build + PACE_TARGET_P2A, -- A04/A build (SRAM byte selects) + PACE_TARGET_P3M, + PACE_TARGET_S3A_700, -- Spartan 3A/N Starter Kit + PACE_TARGET_RC10, + PACE_TARGET_NX2_12, + PACE_TARGET_NEXYS_3, -- Digilent S6 board + PACE_TARGET_CYC3DEV, + PACE_TARGET_CYC5GXDEV, + PACE_TARGET_COCO3PLUS, + PACE_TARGET_S5A, + PACE_TARGET_CARTEBLANCHE_250, + PACE_TARGET_CARTEBLANCHE_500, + PACE_TARGET_BEMICRO, + PACE_TARGET_OPENEP3C16, + PACE_TARGET_MIST, + PACE_TARGET_CHAMELEON64, + PACE_TARGET_RETRORAMBLINGS_CYC3, -- Generic EP3C25 board with custom io boards + PACE_TARGET_S5A_R2_EP4C, + PACE_TARGET_S5A_R2_EP3SL, + PACE_TARGET_S5A_R2B0_EP4C, + PACE_TARGET_S5A_R2B0_EP3SL, + PACE_TARGET_S5A_R2C0_EP4C, + PACE_TARGET_S5A_R2C0_EP3SL, + PACE_TARGET_S5L_A0_EP4C, + PACE_TARGET_S5L_A0_EP3SL, + PACE_TARGET_NAVICO_ROCKY, + PACE_TARGET_NGPACE, + PACE_TARGET_S6M_A0 + ); + + type PACEFpgaVendor_t is + ( + PACE_FPGA_VENDOR_ALTERA, + PACE_FPGA_VENDOR_XILINX, + PACE_FPGA_VENDOR_LATTICE + ); + + type PACEFpgaFamily_t is + ( + PACE_FPGA_FAMILY_CYCLONE1, + PACE_FPGA_FAMILY_CYCLONE2, + PACE_FPGA_FAMILY_CYCLONE3, + PACE_FPGA_FAMILY_CYCLONE4, + PACE_FPGA_FAMILY_CYCLONE5, + PACE_FPGA_FAMILY_CYCLONE6, + PACE_FPGA_FAMILY_STRATIX_III, + PACE_FPGA_FAMILY_SPARTAN3, + PACE_FPGA_FAMILY_SPARTAN3A, + PACE_FPGA_FAMILY_SPARTAN3E + ); + + type PACEJamma_t is + ( + PACE_JAMMA_NONE, + PACE_JAMMA_MAPLE, + PACE_JAMMA_NGC, + PACE_JAMMA_PS2 + ); + + -- Types + + type ByteArrayType is array (natural range <>) of std_logic_vector(7 downto 0); + + type from_CLKRST_t is record + arst : std_logic; + arst_n : std_logic; + rst : std_logic_vector(0 to 3); + clk_ref : std_logic; --reference clock + clk : std_logic_vector(0 to 3); + end record; + + -- maximums from the DE2 target + + constant PACE_NUM_SWITCHES : natural := 18; + subtype from_SWITCHES_t is std_logic_vector(PACE_NUM_SWITCHES-1 downto 0); + + constant PACE_NUM_BUTTONS : natural := 4; + subtype from_BUTTONS_t is std_logic_vector(PACE_NUM_BUTTONS-1 downto 0); + + constant PACE_NUM_LEDS : natural := 18; + subtype to_LEDS_t is std_logic_vector(PACE_NUM_LEDS-1 downto 0); + + -- + -- JAMMA interface data structures + -- - note: all signals are active LOW + -- + + type from_JAMMA_player_t is record + start : std_logic; + up : std_logic; + down : std_logic; + left : std_logic; + right : std_logic; + button : std_logic_vector(1 to 5); + end record; + + type from_JAMMA_player_a is array (natural range <>) of from_JAMMA_player_t; + + type from_JAMMA_t is record + coin_cnt : std_logic_vector(1 to 2); + service : std_logic; + tilt : std_logic; + test : std_logic; + coin : std_logic_vector(1 to 2); + p : from_JAMMA_player_a(1 to 2); + end record; + + -- + -- INPUTS + -- + subtype analogue_in_t is std_logic_vector(9 downto 0); + type analogue_in_a is array (natural range <>) of analogue_in_t; + + type from_INPUTS_t is record + ps2_kclk : std_logic; + ps2_kdat : std_logic; + ps2_mclk : std_logic; + ps2_mdat : std_logic; + jamma_n : from_JAMMA_t; + -- up to 4 10-bit analgue inputs + analogue : analogue_in_a(1 to 4); + end record; + + type in8_t is record + d : std_logic_vector(7 downto 0); + end record; + + type from_MAPPED_INPUTS_t is array (natural range <>) of in8_t; + + -- + -- SRAM interface data structure + -- + type from_SRAM_t is record + d : std_logic_vector(31 downto 0); + end record; + + type to_SRAM_t is record + a : std_logic_vector(23 downto 0); + d : std_logic_vector(31 downto 0); + be : std_logic_vector(3 downto 0); + cs : std_logic; + oe : std_logic; + we : std_logic; + end record; + + + + -- + -- FLASH interface data structure + -- + type from_FLASH_t is record + d : std_logic_vector(15 downto 0); + end record; + + type to_FLASH_t is record + a : std_logic_vector(21 downto 0); + d : std_logic_vector(15 downto 0); + we : std_logic; + cs : std_logic; + oe : std_logic; + end record; + + + type from_AUDIO_t is record + clk : std_logic; + end record; + + type to_AUDIO_t is record + clk : std_logic; + ldata : std_logic_vector(15 downto 0); + rdata : std_logic_vector(15 downto 0); + end record; + + function NULL_TO_AUDIO return to_AUDIO_t; + + type from_SPI_t is record + din : std_logic; + end record; + + type to_SPI_t is record + clk : std_logic; + mode : std_logic; + sel : std_logic; + ena : std_logic; + dout : std_logic; + end record; + + + + type to_SERIAL_t is record + txd : std_logic; + rts : std_logic; + end record; + + + + type from_SERIAL_t is record + dcd : std_logic; + rxd : std_logic; + cts : std_logic; + end record; + + constant PACE_NUM_GPI : natural := 72; + subtype from_GP_t is std_logic_vector(PACE_NUM_GPI-1 downto 0); + constant PACE_NUM_GPO : natural := PACE_NUM_GPI; + type to_GP_t is record + d : std_logic_vector(PACE_NUM_GPO-1 downto 0); + oe : std_logic_vector(PACE_NUM_GPO-1 downto 0); + end record; + + function NULL_TO_GP return to_GP_t; + + subtype SND_A_t is std_logic_vector(7 downto 0); + subtype SND_D_t is std_logic_vector(7 downto 0); + + type to_SOUND_t is record + a : SND_A_t; + d : SND_D_t; + rd : std_logic; + wr : std_logic; + end record; + + type from_SOUND_t is record + d : SND_D_t; + end record; + + function NULL_TO_SOUND return to_SOUND_t; + + -- + -- OSD interface data structure + -- + type from_OSD_t is record + d : std_logic_vector(7 downto 0); + end record; + + + + type to_OSD_t is record + en : std_logic; + a : std_logic_vector(7 downto 0); + d : std_logic_vector(7 downto 0); + we : std_logic; + end record; + + + -- create a constant that automatically determines + -- whether this is simulation or synthesis + constant IN_SIMULATION : BOOLEAN := false + -- synthesis translate_off + or true + -- synthesis translate_on + ; + constant IN_SYNTHESIS : boolean := not IN_SIMULATION; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pace_pkg_body.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pace_pkg_body.vhd new file mode 100644 index 00000000..8cc99869 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pace_pkg_body.vhd @@ -0,0 +1,20 @@ +library work; + +package body pace_pkg is + + function NULL_TO_AUDIO return to_AUDIO_t is + begin + return ('0', (others => '0'), (others => '0')); + end NULL_TO_AUDIO; + + function NULL_TO_SOUND return to_SOUND_t is + begin + return ((others => '0'), (others => '0'), '0', '0'); + end NULL_TO_SOUND; + + function NULL_TO_GP return to_GP_t is + begin + return ((others => '0'), (others => '0')); + end NULL_TO_GP; + +end package body pace_pkg; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/platform.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/platform.vhd new file mode 100644 index 00000000..f598f001 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/platform.vhd @@ -0,0 +1,385 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library altera; +use altera.altera_europa_support_lib.to_std_logic; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.sprite_pkg.all; +use work.target_pkg.all; +use work.project_pkg.all; +use work.platform_pkg.all; +use work.platform_variant_pkg.all; + +entity platform is + generic + ( + NUM_INPUT_BYTES : integer + ); + port + ( + -- clocking and reset + clkrst_i : in from_CLKRST_t; + + -- misc I/O + buttons_i : in from_BUTTONS_t; + switches_i : in from_SWITCHES_t; + leds_o : out to_LEDS_t; + + -- controller inputs + inputs_i : in from_MAPPED_INPUTS_t(0 to NUM_INPUT_BYTES-1); + + -- graphics + + bitmap_i : in from_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); + bitmap_o : out to_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); + + tilemap_i : in from_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); + tilemap_o : out to_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); + + sprite_reg_o : out to_SPRITE_REG_t; + sprite_i : in from_SPRITE_CTL_t; + sprite_o : out to_SPRITE_CTL_t; + spr0_hit : in std_logic; + + -- various graphics information + graphics_i : in from_GRAPHICS_t; + graphics_o : out to_GRAPHICS_t; + + -- sound + snd_i : in from_SOUND_t; + snd_o : out to_SOUND_t; + + -- custom i/o + project_i : in from_PROJECT_IO_t; + project_o : out to_PROJECT_IO_t; + platform_i : in from_PLATFORM_IO_t; + platform_o : out to_PLATFORM_IO_t; + target_i : in from_TARGET_IO_t; + target_o : out to_TARGET_IO_t + ); +end entity platform; + +architecture SYN of platform is + + alias clk_sys : std_logic is clkrst_i.clk(0); + alias clk_video : std_logic is clkrst_i.clk(1); + + -- uP signals + signal clk_2M_en : std_logic; + signal cpu_a : std_logic_vector(15 downto 0); + signal cpu_d_i : std_logic_vector(7 downto 0); + signal cpu_d_o : std_logic_vector(7 downto 0); + signal cpu_mem_rd : std_logic; + signal cpu_mem_wr : std_logic; + signal cpu_io_rd : std_logic; + signal cpu_io_wr : std_logic; + signal cpu_irq : std_logic; + signal cpu_intvec : std_logic_vector(7 downto 0); + signal cpu_intack : std_logic; + alias io_addr : std_logic_vector(7 downto 0) is cpu_a(7 downto 0); + + -- ROM signals + signal rom0_cs : std_logic; + signal rom0_datao : std_logic_vector(7 downto 0); + signal rom1_cs : std_logic; + signal rom1_datao : std_logic_vector(7 downto 0); + + -- VRAM signals + signal vram_cs : std_logic; + signal vram_wr : std_logic; + signal vram_datao : std_logic_vector(7 downto 0); + + -- RAM signals + signal wram_cs : std_logic; + signal wram_wr : std_logic; + signal wram_datao : std_logic_vector(7 downto 0); + + -- IO signals + signal port_cs : std_logic_vector(5 downto 0); + signal port_wr : std_logic_vector(5 downto 2); + alias game_reset : std_logic is inputs_i(2).d(0); + signal shift_dout : std_logic_vector(7 downto 0); + + -- other signals + signal cpu_reset : std_logic; + signal cpu_mem_d_i : std_logic_vector(7 downto 0); + signal cpu_io_d_i : std_logic_vector(7 downto 0); + + signal spec_key_en : std_logic_vector(7 downto 0); + alias osd_key_en : std_logic is spec_key_en(1); + alias rot_key_en : std_logic is spec_key_en(2); + +begin + + assert false + report "CLK0_FREQ_MHz=" & integer'image(CLK0_FREQ_MHz) & + " CPU_FREQ_MHz=" & integer'image(CPU_FREQ_MHz) & + " CPU_CLK_ENA_DIV=" & integer'image(INVADERS_CPU_CLK_ENA_DIVIDE_BY) + severity note; + + cpu_reset <= clkrst_i.arst or game_reset; + + -- read mux + cpu_d_i <= cpu_mem_d_i when (cpu_mem_rd = '1') else cpu_io_d_i; + + -- memory chip selects + -- ROM0 $0000-$1FFF + rom0_cs <= '1' when cpu_a(14 downto 13) = "00" else '0'; + -- WRAM $2000-$23FF + wram_cs <= '1' when cpu_a(14 downto 10) = "01000" else '0'; + -- VRAM $2400-$3FFF + vram_cs <= '1' when cpu_a(14 downto 13) = "01" and cpu_a(12 downto 10) /= "000" else '0'; + -- ROM1 $4000-$5FFF + rom1_cs <= '1' when cpu_a(14 downto 13) = "10" else '0'; + + -- memory write enables + vram_wr <= vram_cs and cpu_mem_wr; + wram_wr <= wram_cs and cpu_mem_wr; + + -- I/O chip selects + -- inputs port 0 + port_cs(0) <= '1' when cpu_a(2 downto 0) = "000" else '0'; + -- inputs port 1 + port_cs(1) <= '1' when cpu_a(2 downto 0) = "001" else '0'; + -- number of bits to shift ($2) + port_cs(2) <= '1' when cpu_a(2 downto 0) = "010" else '0'; + -- sound reg #1 ($3) + port_cs(3) <= '1' when cpu_a(2 downto 0) = "011" else '0'; + -- shifter data ($4) + port_cs(4) <= '1' when cpu_a(2 downto 0) = "100" else '0'; + -- sound reg #2 ($5) + port_cs(5) <= '1' when cpu_a(2 downto 0) = "101" else '0'; + + -- io write enables + port_wr(2) <= port_cs(2) and cpu_io_wr; + port_wr(3) <= port_cs(3) and cpu_io_wr; + port_wr(4) <= port_cs(4) and cpu_io_wr; + port_wr(5) <= port_cs(5) and cpu_io_wr; + + -- sound interface + snd_o.rd <= (port_cs(3) or port_cs(5)) and cpu_io_rd; -- not used + snd_o.wr <= (port_cs(3) or port_cs(5)) and cpu_io_wr; + snd_o.d <= cpu_d_o; + snd_o.a <= cpu_a(snd_o.a'range); + + -- memory read mux + cpu_mem_d_i <= rom0_datao when rom0_cs = '1' else + wram_datao when wram_cs = '1' else + vram_datao when vram_cs = '1' else + rom1_datao when rom1_cs = '1' else + (others => '1'); + + -- io read mux + cpu_io_d_i <= X"40" when port_cs(0) = '1' else + inputs_i(0).d when port_cs(1) = '1' else + inputs_i(1).d when port_cs(2) = '1' else + shift_dout when port_cs(3) = '1' else + X"00"; + + -- shifter block + process (clk_sys, clkrst_i.arst) + variable shift_din : std_logic_vector(15 downto 0); + variable shift_amt : std_logic_vector(2 downto 0); + variable wr2_r : std_logic := '0'; + variable wr4_r : std_logic := '0'; + begin + if clkrst_i.arst = '1' then + wr2_r := '0'; + wr4_r := '0'; + elsif rising_edge(clk_sys) then + -- latch on rising edge of WR to port 2 (shift_amt) + if port_wr(2) = '1' and wr2_r = '0' then + shift_amt := cpu_d_o(2 downto 0); + -- latch on rising edge of WR to port 4 (shift_din) + elsif port_wr(4) = '1' and wr4_r = '0' then + shift_din := cpu_d_o & shift_din(15 downto 8); + end if; + wr2_r := port_wr(2); + wr4_r := port_wr(4); + end if; + + -- combinatorial logic + case shift_amt(2 downto 0) is + when "000" => + shift_dout <= shift_din(15 downto 8); + when "001" => + shift_dout <= shift_din(14 downto 7); + when "010" => + shift_dout <= shift_din(13 downto 6); + when "011" => + shift_dout <= shift_din(12 downto 5); + when "100" => + shift_dout <= shift_din(11 downto 4); + when "101" => + shift_dout <= shift_din(10 downto 3); + when "110" => + shift_dout <= shift_din(9 downto 2); + when "111" => + shift_dout <= shift_din(8 downto 1); + when others => + end case; + + end process; + + INT_BLOCK : block + + constant RST08 : std_logic_vector(7 downto 0) := X"CF"; + constant RST10 : std_logic_vector(7 downto 0) := X"D7"; + + begin + + process (clk_sys, cpu_reset) + subtype count_60Hz_t is integer range 0 to CLK0_FREQ_MHz * 1000000 / 60 - 1; + variable count : count_60Hz_t; + begin + if cpu_reset = '1' then + cpu_irq <= '0'; + count := 0; + elsif rising_edge(clk_sys) then + -- generate interrupt + count := count + 1; + if count = count_60Hz_t'high/2 then + cpu_irq <= '1'; + cpu_intvec <= RST08; + elsif count = count_60Hz_t'high then + count := 0; + cpu_irq <= '1'; + cpu_intvec <= RST10; + -- clear interrupt + elsif cpu_intack = '1' then + cpu_irq <= '0'; + end if; + end if; + end process; + + end block INT_BLOCK; + + -- special keys + process (clk_sys, clkrst_i.arst) + variable spec_key_r : std_logic_vector(7 downto 0); + begin + if clkrst_i.arst = '1' then + spec_key_r := (others => '0'); + osd_key_en <= '0'; + rot_key_en <= to_std_logic(INVADERS_ROTATE_VIDEO); + elsif rising_edge(clk_sys) then + for i in 0 to 7 loop + if inputs_i(2).d(i) = '1' and spec_key_r(i) = '0' then + spec_key_en <= not spec_key_en; + end if; + end loop; + spec_key_r := inputs_i(2).d; + end if; + end process; + + -- video rotate key + graphics_o.bit8(0)(0) <= rot_key_en; + + -- generate CPU clock (2MHz from 20MHz) + clk_en_inst : entity work.clk_div + generic map + ( + DIVISOR => integer(INVADERS_CPU_CLK_ENA_DIVIDE_BY) + ) + port map + ( + clk => clk_sys, + reset => clkrst_i.arst, + clk_en => clk_2M_en + ); + + U_uP : entity work.Z80 + port map + ( + clk => clk_sys, + clk_en => clk_2M_en, + reset => cpu_reset, + + addr => cpu_a, + datai => cpu_d_i, + datao => cpu_d_o, + + mem_rd => cpu_mem_rd, + mem_wr => cpu_mem_wr, + io_rd => cpu_io_rd, + io_wr => cpu_io_wr, + + intreq => cpu_irq, + intvec => cpu_intvec, + intack => cpu_intack, + nmi => '0' + ); + + + + rom0_inst : entity work.invaders_rom_0 + port map + ( + clock => clk_sys, + address => cpu_a(12 downto 0), + q => rom0_datao + ); + + + -- this should be inside the above generate + -- but this crashes Quartus v10.1SP1 + GEN_ROM1 : if ROM_1_NAME /= "" generate + rom1_inst : entity work.invaders_rom_1 + port map + ( + clock => clk_sys, + address => cpu_a(11 downto 0), + q => rom1_datao + ); + else generate + rom1_datao <= (others => '0'); + end generate GEN_ROM1; + + -- + -- *** WARNING - the contents of the VRAM are offset!!! + -- - the video won't look right!!!! + -- + + -- wren_a *MUST* be GND for CYCLONEII_SAFE_WRITE=VERIFIED_SAFE + vram_inst : entity work.vram + port map + ( + clock_b => clk_sys, + address_b => cpu_a(12 downto 0), + data_b => cpu_d_o, + q_b => vram_datao, + wren_b => vram_wr, + + clock_a => clk_video, + address_a => bitmap_i(1).a(12 downto 0), + data_a => (others => '0'), + q_a => bitmap_o(1).d(7 downto 0), + wren_a => '0' + ); + + + wram_inst : entity work.wram + port map + ( + clock => clk_sys, + address => cpu_a(9 downto 0), + data => cpu_d_o, + wren => wram_wr, + q => wram_datao + ); + + + -- unused outputs + + --graphics_o <= NULL_TO_GRAPHICS; + --tilemap_o <= NULL_TO_TILEMAP_CTL; + sprite_reg_o <= NULL_TO_SPRITE_REG; + sprite_o <= NULL_TO_SPRITE_CTL; + leds_o <= (others => '0'); + +end SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/platform_pkg.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/platform_pkg.vhd new file mode 100644 index 00000000..6fddf103 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/platform_pkg.vhd @@ -0,0 +1,39 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +library work; +use work.project_pkg.all; +use work.target_pkg.all; + +package platform_pkg is + + + constant PACE_VIDEO_NUM_BITMAPS : natural := 1; + constant PACE_VIDEO_NUM_TILEMAPS : natural := 0; + constant PACE_VIDEO_NUM_SPRITES : natural := 0; + constant PACE_VIDEO_H_SIZE : integer := 224; + constant PACE_VIDEO_V_SIZE : integer := 256; + constant PACE_VIDEO_L_CROP : integer := 0; + constant PACE_VIDEO_R_CROP : integer := 0; + constant PACE_VIDEO_PIPELINE_DELAY : integer := 3; + constant PACE_INPUTS_NUM_BYTES : integer := 3; + + -- + -- Platform-specific constants (optional) + -- + + constant CLK0_FREQ_MHz : natural := 20; + constant CPU_FREQ_MHz : natural := 2; + + constant INVADERS_CPU_CLK_ENA_DIVIDE_BY : natural := 20 / 2; + + type from_PLATFORM_IO_t is record + not_used : std_logic; + end record; + + type to_PLATFORM_IO_t is record + not_used : std_logic; + end record; + +end package; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/platform_variant_pkg.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/platform_variant_pkg.vhd new file mode 100644 index 00000000..3525ece3 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/platform_variant_pkg.vhd @@ -0,0 +1,116 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +package platform_variant_pkg is + + -- + -- Platform-variant-specific constants (optional) + -- + +--Test Area + --$0000 + constant ROM_0_NAME : string := "../roms/jatrespecter.hex"; + --$4000 + constant ROM_1_NAME : string := ""; + constant VRAM_NAME : string := "../roms/sivram.hex"; + + +--**************************WORKING******************************************************** + +-- Space Invaders +-- constant ROM_0_NAME : string := "../roms/invaders0.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := "../roms/sivram.hex"; + +-- Space Invaders 2 +-- constant ROM_0_NAME : string := "../roms/invadpt20.hex"; +-- constant ROM_1_NAME : string := "../roms/invadpt21.hex"; +-- constant VRAM_NAME : string := "../roms/sivram.hex"; + +-- Super Earth Invasion +---constant ROM_0_NAME : string := "../roms/searthin.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := ""; + +-- Lunar Rescue +-- constant ROM_0_NAME : string := "../roms/lrescue0.hex"; +-- constant ROM_1_NAME : string := "../roms/lrescue1.hex"; +-- constant VRAM_NAME : string := "../roms/sivram.hex"; + +-- Space Laser +-- constant ROM_0_NAME : string := "../roms/laser1.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := "../roms/laser2.hex"; + +-- Galaxy Wars +-- constant ROM_0_NAME : string := "../roms/galxwars0.hex"; +-- constant ROM_1_NAME : string := "../roms/galxwars1.hex"; +-- constant VRAM_NAME : string := "../roms/sivram.hex"; + +-- Space Attack II +-- constant ROM_0_NAME : string := "../roms/spaceatt.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := ""; + + + +--**************************NOT WORKING******************************************************** +--Yosaku To Donbei (set1) +-- constant ROM_0_NAME : string := "../roms/yosakdon.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := ""; + +--Yosaku To Donbei (set2) +-- constant ROM_0_NAME : string := "../roms/yosakdona.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := ""; + + +-- Ball Bomb +-- constant ROM_0_NAME : string := "../roms/bomb1.hex"; +-- constant ROM_1_NAME : string := "../roms/bomb2.hex"; +-- constant VRAM_NAME : string := "../roms/sivram.hex"; + + +--4 Player Bowling Alley +-- constant ROM_0_NAME : string := "../roms/bowler1.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := "../roms/bowler2.hex"; + +-- Gunfight(todo Controls) +-- constant ROM_0_NAME : string := "../roms/gunfight.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := ""; + +-- Boot Hill(todo Controls) +-- constant ROM_0_NAME : string := "../roms/boothill.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := "../roms/sivram.hex"; + +--Check Mate +-- constant ROM_0_NAME : string := "../roms/checkmate.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := "../roms/sivram.hex"; + +--Datsun 280 zzz +-- constant ROM_0_NAME : string := "../roms/280zzzap.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := "../roms/sivram.hex"; + +--PhantomII +-- constant ROM_0_NAME : string := "../roms/phantomII.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := "../roms/phantomIIprom.hex"; + +-- Space Encounter +-- constant ROM_0_NAME : string := "../roms/spaceenc1.hex"; +-- constant ROM_1_NAME : string := "../roms/spaceenc1.hex"; +-- constant VRAM_NAME : string := ""; + +--Jatre Spectre +-- constant ROM_0_NAME : string := "../roms/jatrespecter.hex"; +-- constant ROM_1_NAME : string := ""; +-- constant VRAM_NAME : string := "../roms/sivram.hex"; + +end; \ No newline at end of file diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pll.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pll.vhd new file mode 100644 index 00000000..366ea101 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pll.vhd @@ -0,0 +1,186 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +entity pll is + generic + ( + -- INCLK + INCLK0_INPUT_FREQUENCY : natural; + + -- CLK0 + CLK0_DIVIDE_BY : natural := 1; + CLK0_DUTY_CYCLE : natural := 50; + CLK0_MULTIPLY_BY : natural := 1; + CLK0_PHASE_SHIFT : string := "0"; + + -- CLK1 + CLK1_DIVIDE_BY : natural := 1; + CLK1_DUTY_CYCLE : natural := 50; + CLK1_MULTIPLY_BY : natural := 1; + CLK1_PHASE_SHIFT : string := "0" + ); + port + ( + inclk0 : in std_logic := '0'; + c0 : out std_logic ; + c1 : out std_logic + ); +END pll; + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (5 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + COMPONENT altpll + GENERIC ( + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_enable0 : STRING; + port_enable1 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + port_extclkena0 : STRING; + port_extclkena1 : STRING; + port_extclkena2 : STRING; + port_extclkena3 : STRING; + port_sclkout0 : STRING; + port_sclkout1 : STRING + ); + PORT ( + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + clk : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + clk0_divide_by => CLK0_DIVIDE_BY, + clk0_duty_cycle => CLK0_DUTY_CYCLE, + clk0_multiply_by => CLK0_MULTIPLY_BY, + clk0_phase_shift => CLK0_PHASE_SHIFT, + clk1_divide_by => CLK1_DIVIDE_BY, + clk1_duty_cycle => CLK1_DUTY_CYCLE, + clk1_multiply_by => CLK1_MULTIPLY_BY, + clk1_phase_shift => CLK1_PHASE_SHIFT, + compensate_clock => "CLK0", + inclk0_input_frequency => INCLK0_INPUT_FREQUENCY, + intended_device_family => "Cyclone II", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "FAST", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_enable0 => "PORT_UNUSED", + port_enable1 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + port_extclkena0 => "PORT_UNUSED", + port_extclkena1 => "PORT_UNUSED", + port_extclkena2 => "PORT_UNUSED", + port_extclkena3 => "PORT_UNUSED", + port_sclkout0 => "PORT_UNUSED", + port_sclkout1 => "PORT_UNUSED" + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pllclk_ez.qip b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pllclk_ez.qip new file mode 100644 index 00000000..26d620d6 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pllclk_ez.qip @@ -0,0 +1,5 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pllclk_ez.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pllclk_ez.cmp"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pllclk_ez.ppf"] diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pllclk_ez.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pllclk_ez.vhd new file mode 100644 index 00000000..78d02f52 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/pllclk_ez.vhd @@ -0,0 +1,399 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pllclk_ez.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pllclk_ez IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pllclk_ez; + + +ARCHITECTURE SYN OF pllclk_ez IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire6_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire6_bv(0 DOWNTO 0) <= "0"; + sub_wire6 <= To_stdlogicvector(sub_wire6_bv); + sub_wire3 <= sub_wire0(0); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + locked <= sub_wire2; + c0 <= sub_wire3; + sub_wire4 <= inclk0; + sub_wire5 <= sub_wire6(0 DOWNTO 0) & sub_wire4; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 20, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 40, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pllclk_ez", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire5, + clk => sub_wire0, + locked => sub_wire2 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "e0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "1" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "1" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "20.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "40.000000" +-- 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 "1" +-- 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "1" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "20.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "40.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 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_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: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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 "pllclk_ez.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: 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_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 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 "20" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "40" +-- Retrieval info: CONSTANT: CLK1_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_USED" +-- 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_USED" +-- 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_UNUSED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- 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: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pllclk_ez.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pllclk_ez.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pllclk_ez.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pllclk_ez.cmp TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pllclk_ez.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pllclk_ez_inst.vhd FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pllclk_ez_waveforms.html TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pllclk_ez_wave*.jpg FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/project_pkg.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/project_pkg.vhd new file mode 100644 index 00000000..f1c5289f --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/project_pkg.vhd @@ -0,0 +1,52 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; + +package project_pkg is + + -- + -- PACE constants which *MUST* be defined + -- + + constant PACE_HAS_PLL : boolean := true; + constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_VGA_800x600_60Hz; + constant PACE_CLK0_DIVIDE_BY : natural := 27; + constant PACE_CLK0_MULTIPLY_BY : natural := 20; -- 50*2/5 = 20MHz + constant PACE_CLK1_DIVIDE_BY : natural := 27; + constant PACE_CLK1_MULTIPLY_BY : natural := 40; -- 50*4/5 = 40MHz + constant PACE_VIDEO_H_SCALE : integer := 2; + constant PACE_VIDEO_V_SCALE : integer := 2; + constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '1'; -- Not currently used? + constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '1'; + constant PACE_VIDEO_BORDER_RGB : RGB_t := RGB_BLACK; + + constant PACE_HAS_OSD : boolean := false; + constant PACE_OSD_XPOS : natural := 0; + constant PACE_OSD_YPOS : natural := 0; + + -- Invaders-specific constants + + -- rotate native video (for VGA monitor) + -- - need to change H,V size in platform_pkg.vhd +-- constant INVADERS_ROTATE_VIDEO : boolean := true; + + constant INVADERS_ROM_IN_FLASH : boolean := false; + constant PACE_HAS_FLASH : boolean := false; + + constant INVADERS_USE_INTERNAL_WRAM : boolean := true; + constant PACE_HAS_SRAM : boolean := false; + constant USE_VIDEO_VBLANK_INTERRUPT : boolean := false; + + type from_PROJECT_IO_t is record + not_used : std_logic; + end record; + + type to_PROJECT_IO_t is record + not_used : std_logic; + end record; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/ps2kbd.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/ps2kbd.vhd new file mode 100644 index 00000000..6bd6983c --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/ps2kbd.vhd @@ -0,0 +1,202 @@ +-- PS/2 serial port, input only +-- +-- Version : 0242 +-- +-- 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 EXKeyDown 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.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : First KeyUp +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity ps2kbd is + port( + Rst_n : in std_logic; + Clk : in std_logic; + Tick1us : in std_logic; + PS2_Clk : in std_logic; + PS2_Data : in std_logic; + KeyDown : out std_logic; + KeyUp : out std_logic; + Reset : out std_logic; + ScanCode : out std_logic_vector(7 downto 0)); +end ps2kbd; + +architecture rtl of ps2kbd is + + signal PS2_Sample : std_logic; + signal PS2_Data_s : std_logic; + + signal RX_Bit_Cnt : unsigned(3 downto 0); + signal RX_Byte : unsigned(2 downto 0); + signal RX_ShiftReg : std_logic_vector(7 downto 0); + signal RX_KeyUp : std_logic; + signal RX_Received : std_logic; + +begin + + ScanCode <= RX_ShiftReg; + + process (Clk, Rst_n) + variable PS2_Data_r : std_logic_vector(1 downto 0); + variable PS2_Clk_r : std_logic_vector(1 downto 0); + variable PS2_Clk_State : std_logic; + begin + if Rst_n = '0' then + PS2_Sample <= '0'; + PS2_Data_s <= '0'; + PS2_Data_r := "11"; + PS2_Clk_r := "11"; + PS2_Clk_State := '1'; + elsif Clk'event and Clk = '1' then + if Tick1us = '1' then + PS2_Sample <= '0'; + + -- Deglitch + if PS2_Data_r = "00" then + PS2_Data_s <= '0'; + end if; + if PS2_Data_r = "11" then + PS2_Data_s <= '1'; + end if; + if PS2_Clk_r = "00" then + if PS2_Clk_State = '1' then + PS2_Sample <= '1'; + end if; + PS2_Clk_State := '0'; + end if; + if PS2_Clk_r = "11" then + PS2_Clk_State := '1'; + end if; + + -- Double synchronise + PS2_Data_r(1) := PS2_Data_r(0); + PS2_Clk_r(1) := PS2_Clk_r(0); + PS2_Data_r(0) := PS2_Data; + PS2_Clk_r(0) := PS2_Clk; + end if; + end if; + end process; + + process (Clk, Rst_n) + variable Cnt : integer; + begin + if Rst_n = '0' then + RX_Bit_Cnt <= (others => '0'); + RX_ShiftReg <= (others => '0'); + RX_Received <= '0'; + Cnt := 0; + elsif Clk'event and Clk = '1' then + RX_Received <= '0'; + if Tick1us = '1' then + + if PS2_Sample = '1' then + if RX_Bit_Cnt = "0000" then + if PS2_Data_s = '0' then -- Start bit + RX_Bit_Cnt <= RX_Bit_Cnt + 1; + end if; + elsif RX_Bit_Cnt = "1001" then -- Parity bit + RX_Bit_Cnt <= RX_Bit_Cnt + 1; + -- Ignoring parity + elsif RX_Bit_Cnt = "1010" then -- Stop bit + if PS2_Data_s = '1' then + RX_Received <= '1'; + end if; + RX_Bit_Cnt <= "0000"; + else + RX_Bit_Cnt <= RX_Bit_Cnt + 1; + RX_ShiftReg(6 downto 0) <= RX_ShiftReg(7 downto 1); + RX_ShiftReg(7) <= PS2_Data_s; + end if; + end if; + + -- TimeOut + if PS2_Sample = '1' then + Cnt := 0; + elsif Cnt = 127 then + RX_Bit_Cnt <= "0000"; + Cnt := 0; + else + Cnt := Cnt + 1; + end if; + end if; + end if; + end process; + + process (Clk, Rst_n) + begin + if Rst_n = '0' then + KeyDown <= '0'; + KeyUp <= '0'; + Reset <= '0'; + RX_Byte <= (others => '0'); + RX_KeyUp <= '0'; + elsif Clk'event and Clk = '1' then + KeyDown <= '0'; + KeyUp <= '0'; + Reset <= '0'; + if RX_Received = '1' then + RX_Byte <= RX_Byte + 1; + if RX_ShiftReg = x"F0" then + RX_KeyUp <= '1'; + elsif RX_ShiftReg = x"E0" then + else + RX_KeyUp <= '0'; + -- Normal key KeyDown + if RX_KeyUp = '0' then + KeyDown <= '1'; + end if; + -- Normal key KeyUp + if RX_KeyUp = '1' then + KeyUp <= '1'; + end if; + end if; + if RX_ShiftReg = x"aa" then + Reset <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/ps2kbd_pkg.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/ps2kbd_pkg.vhd new file mode 100644 index 00000000..0fc93379 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/ps2kbd_pkg.vhd @@ -0,0 +1,111 @@ +library ieee; +use ieee.std_logic_1164.all; + +package kbd_pkg is + + constant SCANCODE_BACKQUOTE : std_logic_vector(7 downto 0) := X"0E"; + constant SCANCODE_A : std_logic_vector(7 downto 0) := X"1C"; + constant SCANCODE_B : std_logic_vector(7 downto 0) := X"32"; + constant SCANCODE_C : std_logic_vector(7 downto 0) := X"21"; + constant SCANCODE_D : std_logic_vector(7 downto 0) := X"23"; + constant SCANCODE_E : std_logic_vector(7 downto 0) := X"24"; + constant SCANCODE_F : std_logic_vector(7 downto 0) := X"2B"; + constant SCANCODE_G : std_logic_vector(7 downto 0) := X"34"; + constant SCANCODE_H : std_logic_vector(7 downto 0) := X"33"; + constant SCANCODE_I : std_logic_vector(7 downto 0) := X"43"; + constant SCANCODE_J : std_logic_vector(7 downto 0) := X"3B"; + constant SCANCODE_K : std_logic_vector(7 downto 0) := X"42"; + constant SCANCODE_L : std_logic_vector(7 downto 0) := X"4B"; + constant SCANCODE_M : std_logic_vector(7 downto 0) := X"3A"; + constant SCANCODE_N : std_logic_vector(7 downto 0) := X"31"; + constant SCANCODE_O : std_logic_vector(7 downto 0) := X"44"; + constant SCANCODE_P : std_logic_vector(7 downto 0) := X"4D"; + constant SCANCODE_Q : std_logic_vector(7 downto 0) := X"15"; + constant SCANCODE_R : std_logic_vector(7 downto 0) := X"2D"; + constant SCANCODE_S : std_logic_vector(7 downto 0) := X"1B"; + constant SCANCODE_T : std_logic_vector(7 downto 0) := X"2C"; + constant SCANCODE_U : std_logic_vector(7 downto 0) := X"3C"; + constant SCANCODE_V : std_logic_vector(7 downto 0) := X"2A"; + constant SCANCODE_W : std_logic_vector(7 downto 0) := X"1D"; + constant SCANCODE_X : std_logic_vector(7 downto 0) := X"22"; + constant SCANCODE_Y : std_logic_vector(7 downto 0) := X"35"; + constant SCANCODE_Z : std_logic_vector(7 downto 0) := X"1A"; + constant SCANCODE_0 : std_logic_vector(7 downto 0) := X"45"; + constant SCANCODE_1 : std_logic_vector(7 downto 0) := X"16"; + constant SCANCODE_2 : std_logic_vector(7 downto 0) := X"1E"; + constant SCANCODE_3 : std_logic_vector(7 downto 0) := X"26"; + constant SCANCODE_4 : std_logic_vector(7 downto 0) := X"25"; + constant SCANCODE_5 : std_logic_vector(7 downto 0) := X"2E"; + constant SCANCODE_6 : std_logic_vector(7 downto 0) := X"36"; + constant SCANCODE_7 : std_logic_vector(7 downto 0) := X"3D"; + constant SCANCODE_8 : std_logic_vector(7 downto 0) := X"3E"; + constant SCANCODE_9 : std_logic_vector(7 downto 0) := X"46"; + constant SCANCODE_QUOTE : std_logic_vector(7 downto 0) := X"52"; + constant SCANCODE_SEMICOLON : std_logic_vector(7 downto 0) := X"4C"; + constant SCANCODE_COMMA : std_logic_vector(7 downto 0) := X"41"; + constant SCANCODE_MINUS : std_logic_vector(7 downto 0) := X"4E"; + constant SCANCODE_PERIOD : std_logic_vector(7 downto 0) := X"49"; + constant SCANCODE_SLASH : std_logic_vector(7 downto 0) := X"4A"; + constant SCANCODE_ENTER : std_logic_vector(7 downto 0) := X"5A"; + constant SCANCODE_HOME : std_logic_vector(7 downto 0) := X"6C"; + constant SCANCODE_INS : std_logic_vector(7 downto 0) := X"70"; -- E0 + constant SCANCODE_PGUP : std_logic_vector(7 downto 0) := X"7D"; -- E0 + constant SCANCODE_DELETE : std_logic_vector(7 downto 0) := X"71"; -- E0 + constant SCANCODE_PGDN : std_logic_vector(7 downto 0) := X"7A"; -- E0 + constant SCANCODE_UP : std_logic_vector(7 downto 0) := X"75"; -- E0 + constant SCANCODE_DOWN : std_logic_vector(7 downto 0) := X"72"; -- E0 + constant SCANCODE_LEFT : std_logic_vector(7 downto 0) := X"6B"; -- E0 + constant SCANCODE_BACKSPACE : std_logic_vector(7 downto 0) := X"66"; + constant SCANCODE_RIGHT : std_logic_vector(7 downto 0) := X"74"; -- E0 + constant SCANCODE_SPACE : std_logic_vector(7 downto 0) := X"29"; + constant SCANCODE_LSHIFT : std_logic_vector(7 downto 0) := X"12"; + constant SCANCODE_RSHIFT : std_logic_vector(7 downto 0) := X"59"; + constant SCANCODE_TAB : std_logic_vector(7 downto 0) := X"0D"; + constant SCANCODE_ESC : std_logic_vector(7 downto 0) := X"76"; + constant SCANCODE_EQUALS : std_logic_vector(7 downto 0) := X"55"; + constant SCANCODE_F1 : std_logic_vector(7 downto 0) := X"05"; + constant SCANCODE_F2 : std_logic_vector(7 downto 0) := X"06"; + constant SCANCODE_F3 : std_logic_vector(7 downto 0) := X"04"; + constant SCANCODE_F4 : std_logic_vector(7 downto 0) := X"0C"; + constant SCANCODE_F5 : std_logic_vector(7 downto 0) := X"03"; + constant SCANCODE_F6 : std_logic_vector(7 downto 0) := X"0B"; + constant SCANCODE_F7 : std_logic_vector(7 downto 0) := X"83"; + constant SCANCODE_F8 : std_logic_vector(7 downto 0) := X"0A"; + constant SCANCODE_F9 : std_logic_vector(7 downto 0) := X"01"; + constant SCANCODE_F10 : std_logic_vector(7 downto 0) := X"09"; + constant SCANCODE_F11 : std_logic_vector(7 downto 0) := X"78"; + constant SCANCODE_F12 : std_logic_vector(7 downto 0) := X"07"; + constant SCANCODE_SCROLL : std_logic_vector(7 downto 0) := X"7E"; + constant SCANCODE_CAPSLOCK : std_logic_vector(7 downto 0) := X"58"; + constant SCANCODE_BACKSLASH : std_logic_vector(7 downto 0) := X"5D"; + constant SCANCODE_NUMLOCK : std_logic_vector(7 downto 0) := X"77"; + constant SCANCODE_LCTRL : std_logic_vector(7 downto 0) := X"14"; + constant SCANCODE_LGUI : std_logic_vector(7 downto 0) := X"1F"; -- E0 + constant SCANCODE_LALT : std_logic_vector(7 downto 0) := X"11"; + constant SCANCODE_RGUI : std_logic_vector(7 downto 0) := X"27"; -- E0 + --constant SCANCODE_RALT : std_logic_vector(7 downto 0) := X"11"; + alias SCANCODE_TILDE : std_logic_vector(7 downto 0) is SCANCODE_BACKQUOTE; + constant SCANCODE_OPENBRKT : std_logic_vector(7 downto 0) := X"54"; + alias SCANCODE_OPENBRACE : std_logic_vector(7 downto 0) is SCANCODE_OPENBRKT; + constant SCANCODE_CLOSEBRKT : std_logic_vector(7 downto 0) := X"5B"; + alias SCANCODE_CLOSEBRACE : std_logic_vector(7 downto 0) is SCANCODE_CLOSEBRKT; + constant SCANCODE_END : std_logic_vector(7 downto 0) := X"69"; -- E0 + alias SCANCODE_PAD0 : std_logic_vector(7 downto 0) is SCANCODE_INS; + alias SCANCODE_PAD1 : std_logic_vector(7 downto 0) is SCANCODE_END; + alias SCANCODE_PAD2 : std_logic_vector(7 downto 0) is SCANCODE_DOWN; + alias SCANCODE_PAD3 : std_logic_vector(7 downto 0) is SCANCODE_PGDN; + alias SCANCODE_PAD4 : std_logic_vector(7 downto 0) is SCANCODE_LEFT; + constant SCANCODE_PAD5 : std_logic_vector(7 downto 0) := X"73"; + alias SCANCODE_PAD6 : std_logic_vector(7 downto 0) is SCANCODE_RIGHT; + alias SCANCODE_PAD7 : std_logic_vector(7 downto 0) is SCANCODE_HOME; + alias SCANCODE_PAD8 : std_logic_vector(7 downto 0) is SCANCODE_UP; + alias SCANCODE_PAD9 : std_logic_vector(7 downto 0) is SCANCODE_PGUP; + constant SCANCODE_PADPLUS : std_logic_vector(7 downto 0) := X"79"; + constant SCANCODE_PADMINUS : std_logic_vector(7 downto 0) := X"7B"; + constant SCANCODE_PADTIMES : std_logic_vector(7 downto 0) := X"7C"; + constant SCANCODE_PADEQUALS : std_logic_vector(7 downto 0) := X"0F"; + + type kbd_row is array (natural range <>) of std_logic_vector(7 downto 0); + type kbd_col is array (natural range <>) of std_logic_vector(7 downto 0); + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/spram.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/spram.vhd new file mode 100644 index 00000000..64bfc2b8 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/spram.vhd @@ -0,0 +1,84 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY spram IS + GENERIC + ( + init_file : string := ""; + numwords_a : natural := 0; -- not used + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + data : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END spram; + +ARCHITECTURE SYN OF spram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + COMPONENT altsyncram + GENERIC ( + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + power_up_uninitialized : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + wren_a : IN STD_LOGIC ; + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone II", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + power_up_uninitialized => "FALSE", + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + wren_a => wren, + clock0 => clock, + address_a => address, + data_a => data, + q_a => sub_wire0 + ); + +END SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/sprite_pkg.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/sprite_pkg.vhd new file mode 100644 index 00000000..ee5cf179 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/sprite_pkg.vhd @@ -0,0 +1,97 @@ +library IEEE; +use IEEE.std_logic_1164.all; +--use IEEE.numeric_std.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +library work; +use work.video_controller_pkg.all; + +package sprite_pkg is + + subtype SPRITE_N_t is std_logic_vector(11 downto 0); + subtype SPRITE_A_t is std_logic_vector(7 downto 0); + subtype SPRITE_D_t is std_logic_vector(7 downto 0); + + type from_SPRITE_REG_t is record + n : SPRITE_N_t; + x : std_logic_vector(10 downto 0); + y : std_logic_vector(10 downto 0); + xflip : std_logic; + yflip : std_logic; + colour : std_logic_vector(7 downto 0); + pri : std_logic; + end record; + + type to_SPRITE_REG_t is record + clk : std_logic; + clk_ena : std_logic; + wr : std_logic; + a : SPRITE_A_t; + d : SPRITE_D_t; + end record; + + function NULL_TO_SPRITE_REG return to_SPRITE_REG_t; + + subtype SPRITE_ROW_D_t is std_logic_vector(63 downto 0); + subtype SPRITE_ROW_A_t is std_logic_vector(15 downto 0); + + type to_SPRITE_CTL_t is record + ld : std_logic; + d : SPRITE_ROW_D_t; + end record; + + type from_SPRITE_CTL_t is record + a : SPRITE_ROW_A_t; + rgb : RGB_t; + set : std_logic; + end record; + + function NULL_TO_SPRITE_CTL return to_SPRITE_CTL_t; + + component sprite_array is + generic + ( + N_SPRITES : integer; + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- register interface + reg_i : in to_SPRITE_REG_t; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- extra data + graphics_i : in to_GRAPHICS_t; + + -- sprite data + row_a : out SPRITE_ROW_A_t; + row_d : in SPRITE_ROW_D_t; + + -- video data + rgb : out RGB_t; + set : out std_logic; + pri : out std_logic; + spr0_set : out std_logic + ); + end component sprite_array; + + function flip_row + ( + row_in : std_logic_vector; + flip : std_logic + ) + return SPRITE_ROW_D_t; + + function flip_1 + ( + d_i : std_logic_vector; + flip : std_logic + ) + return std_logic_vector; + +end package sprite_pkg; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/sprite_pkg_body.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/sprite_pkg_body.vhd new file mode 100644 index 00000000..551261b2 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/sprite_pkg_body.vhd @@ -0,0 +1,62 @@ +library work; +use work.pace_pkg.all; +--use work.sprite_pkg.all; + +package body sprite_pkg is + + function NULL_TO_SPRITE_REG return to_SPRITE_REG_t is + begin + return ('0', '0', '0', (others => '0'), (others => '0')); + end function NULL_TO_SPRITE_REG; + + function NULL_TO_SPRITE_CTL return to_SPRITE_CTL_t is + begin + return ('0', (others => '0')); + end function NULL_TO_SPRITE_CTL; + + function flip_row + ( + row_in : std_logic_vector; + flip : std_logic + ) + return std_logic_vector is + + constant HALF : natural := (row_in'length / 2) - 1; + + alias row_in_0 : std_logic_vector(row_in'length-1 downto 0) + is row_in; + variable row_out : std_logic_vector(row_in_0'range); + + begin + + if flip = '0' then + return row_in; + else + for i in 0 to HALF loop + row_out ((HALF-i)*2+1 downto (HALF-i)*2) := row_in_0(i*2+1 downto i*2); + end loop; + return row_out; + end if; + + end flip_row; + + function flip_1 + ( + d_i : std_logic_vector; + flip : std_logic + ) + return std_logic_vector is + alias d_i_0 : std_logic_vector(d_i'length-1 downto 0) is d_i; + variable d_o : std_logic_vector(d_i_0'range); + begin + if flip = '0' then + return d_i; + else + for i in d_i_0'range loop + d_o(i) := d_i_0(d_i_0'high-i); + end loop; + return d_o; + end if; + end function flip_1; + +end package body sprite_pkg; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/sprom.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/sprom.vhd new file mode 100644 index 00000000..3ec3beb7 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/sprom.vhd @@ -0,0 +1,77 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY sprom IS + GENERIC + ( + init_file : string := ""; + numwords_a : natural := 0; -- not used any more + widthad_a : natural; + width_a : natural := 8; + outdata_reg_a : string := "UNREGISTERED" + ); + PORT + ( + address : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); +END sprom; + + +ARCHITECTURE SYN OF sprom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + + COMPONENT altsyncram + GENERIC ( + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(width_a-1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => init_file, + intended_device_family => "Cyclone II", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2**widthad_a, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => outdata_reg_a, + widthad_a => widthad_a, + width_a => width_a, + width_byteena_a => 1 + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + +END SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/tilemapctl_e.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/tilemapctl_e.vhd new file mode 100644 index 00000000..68d3fd1a --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/tilemapctl_e.vhd @@ -0,0 +1,29 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.project_pkg.all; +use work.platform_pkg.all; +use work.video_controller_pkg.all; + +entity tilemapCtl is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- tilemap controller signals + ctl_i : in to_TILEMAP_CTL_t; + ctl_o : out from_TILEMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); +end entity tilemapCtl; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/video_controller.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/video_controller.vhd new file mode 100644 index 00000000..14da0c20 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/video_controller.vhd @@ -0,0 +1,455 @@ +library IEEE; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.video_controller_pkg.all; + +entity pace_video_controller is + generic + ( + CONFIG : PACEVideoController_t := PACE_VIDEO_NONE; + DELAY : integer := 1; + H_SIZE : integer; + V_SIZE : integer; + L_CROP : integer range 0 to 255; + R_CROP : integer range 0 to 255; + H_SCALE : integer; + V_SCALE : integer; + H_SYNC_POL : std_logic := '1'; + V_SYNC_POL : std_logic := '1'; + BORDER_RGB : RGB_t := RGB_BLACK + ); + port + ( + -- clocking etc + video_i : in from_VIDEO_t; + + -- register interface + reg_i : in VIDEO_REG_t; + + -- video input data + rgb_i : in RGB_t; + + -- control signals (out) + video_ctl_o : out from_VIDEO_CTL_t; + + -- video output control & data + video_o : out to_VIDEO_t + ); +end pace_video_controller; + +architecture SYN of pace_video_controller is + + constant SIM_DELAY : time := 2 ns; + + constant VIDEO_H_SIZE : integer := H_SIZE * H_SCALE; + constant VIDEO_V_SIZE : integer := V_SIZE * V_SCALE; + + subtype reg_t is integer range 0 to 2047; + + alias clk : std_logic is video_i.clk; + alias clk_ena : std_logic is video_i.clk_ena; + alias reset : std_logic is video_i.reset; + + -- registers + signal h_front_porch_r : reg_t := 0; + signal h_sync_r : reg_t := 0; + signal h_back_porch_r : reg_t := 0; + signal h_border_r : reg_t := 0; + signal h_video_r : reg_t := 0; + signal v_front_porch_r : reg_t := 0; + signal v_sync_r : reg_t := 0; + signal v_back_porch_r : reg_t := 0; + signal v_border_r : reg_t := 0; + signal v_video_r : reg_t := 0; + + signal border_rgb_r : RGB_t := ((others=>'0'), (others=>'0'), (others=>'0')); + + -- derived values + signal h_sync_start : reg_t := 0; + signal h_back_porch_start : reg_t := 0; + signal h_left_border_start : reg_t := 0; + signal h_video_start : reg_t := 0; + signal h_right_border_start : reg_t := 0; + signal h_line_end : reg_t := 0; + signal v_sync_start : reg_t := 0; + signal v_back_porch_start : reg_t := 0; + signal v_top_border_start : reg_t := 0; + signal v_video_start : reg_t := 0; + signal v_bottom_border_start : reg_t := 0; + signal v_screen_end : reg_t := 0; + + signal hsync_s : std_logic := '0'; + signal vsync_s : std_logic := '0'; + signal hactive_s : std_logic := '0'; + signal vactive_s : std_logic := '0'; + signal hblank_s : std_logic := '0'; + signal vblank_s : std_logic := '0'; + + subtype count_t is integer range 0 to 2047; + signal x_count : count_t := 0; + signal y_count : count_t := 0; + + signal x_s : unsigned(10 downto 0) := (others => '0'); + signal y_s : unsigned(10 downto 0) := (others => '0'); + + --signal extended_reset : std_logic := '1'; + alias extended_reset : std_logic is video_i.reset; + +begin + + -- registers + reg_proc: process (reset, clk) + + begin + --if reset = '1' then + case CONFIG is + + when PACE_VIDEO_VGA_240x320_60Hz => + -- P3M, clk=11.136MHz, clk_ena=5.568MHz + h_front_porch_r <= 272-240; + h_sync_r <= 5; + h_back_porch_r <= 22; + h_border_r <= (240-VIDEO_H_SIZE)/2; + v_front_porch_r <= 326-320; + v_sync_r <= 1; + v_back_porch_r <= 5; + v_border_r <= (320-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_320x480_60Hz => + -- VGA, clk=12.588MHz + --# 320x240 @ 60 Hz, 31.5 kHz hsync, 4:3 aspect ratio + --Modeline "320x240" 12.588 320 336 384 400 240 245 246 262 Doublescan + h_front_porch_r <= 16; + h_sync_r <= 48; + h_back_porch_r <= 16; + h_border_r <= (320-VIDEO_H_SIZE)/2; + v_front_porch_r <= (5*2); + v_sync_r <= (1*2); + v_back_porch_r <= (16*2); + v_border_r <= (480-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_640x480_60Hz => + -- VGA, clk=25.175MHz + h_front_porch_r <= 16; + h_sync_r <= 96; + h_back_porch_r <= 48; + h_border_r <= (640-VIDEO_H_SIZE)/2; + v_front_porch_r <= 10; + v_sync_r <= 2; + v_back_porch_r <= 33; + v_border_r <= (480-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_800x600_60Hz => + -- SVGA, clk=40MHz + h_front_porch_r <= 40; + h_sync_r <= 128; + h_back_porch_r <= 88; + h_border_r <= (800-VIDEO_H_SIZE)/2; + v_front_porch_r <= 1; + v_sync_r <= 4; + v_back_porch_r <= 23; + v_border_r <= (600-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_1024x768_60Hz => + -- XVGA, clk=65MHz + h_front_porch_r <= 24; + h_sync_r <= 136; + h_back_porch_r <= 160; + h_border_r <= (1024-VIDEO_H_SIZE)/2; + v_front_porch_r <= 3; + v_sync_r <= 6; + v_back_porch_r <= 29; + v_border_r <= (768-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_1366x768_60Hz => + -- XVGA(NAVICO ROCKY), clk=72MHz + h_front_porch_r <= 88; --64; + h_sync_r <= 44; --112; + h_back_porch_r <= 148; --248; + h_border_r <= (1366-VIDEO_H_SIZE)/2; + v_front_porch_r <= 4; --3; + v_sync_r <= 5; --6; + v_back_porch_r <= 36; --18; + v_border_r <= (768-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_1280x800_60Hz => + -- Sentinel Mode 36, clk=103.2MHz + h_front_porch_r <= 64; + h_sync_r <= 32; + h_back_porch_r <= 362-32-64; + h_border_r <= (1280-VIDEO_H_SIZE)/2; + v_front_porch_r <= 3; + v_sync_r <= 4; + v_back_porch_r <= 38-4-3; + v_border_r <= (800-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_1280x1024_60Hz => + -- SXGA, clk=108MHz + h_front_porch_r <= 48; + h_sync_r <= 112; + h_back_porch_r <= 248; + h_border_r <= (1280-VIDEO_H_SIZE)/2; + v_front_porch_r <= 1; + v_sync_r <= 3; + v_back_porch_r <= 38; + v_border_r <= (1024-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_VGA_1680x1050_60Hz => + -- WSXGA+, clk=147.14MHz + h_front_porch_r <= 104; + h_sync_r <= 184; + h_back_porch_r <= 288; + v_front_porch_r <= 1; + v_sync_r <= 3; + v_back_porch_r <= 33; + -- WSXGA+, clk=118MHz + --h_front_porch_r <= 48; + --h_sync_r <= 32; + --h_back_porch_r <= 80; + --v_front_porch_r <= 3; + --v_sync_r <= 6; + --v_back_porch_r <= 21; + h_border_r <= (1680-VIDEO_H_SIZE)/2; + v_border_r <= (1050-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_ARCADE_STD_336x240_60Hz => + -- arcade standard resolution, clk=7.16MHz + h_front_porch_r <= 34; + h_sync_r <= 34; + h_back_porch_r <= 51; + h_border_r <= (336-VIDEO_H_SIZE)/2; + v_front_porch_r <= 3; + v_sync_r <= 3; + v_back_porch_r <= 16; + v_border_r <= (240-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_ARCADE_STD_336x240_60Hz_28M64 => + -- arcade standard resolution, clk=28.64MHz + h_front_porch_r <= 4*34; + h_sync_r <= 4*34; + h_back_porch_r <= 4*51; + h_border_r <= 4*(336-VIDEO_H_SIZE)/2; + v_front_porch_r <= 3; + v_sync_r <= 3; + v_back_porch_r <= 16; + v_border_r <= (240-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_CVBS_720x288p_50Hz => + -- generic composite, clk=13.5MHz + h_front_porch_r <= (8+12); + h_sync_r <= 64; + h_back_porch_r <= (144-64-(8+12)); + h_border_r <= (720-VIDEO_H_SIZE)/2; + v_front_porch_r <= 1; + v_sync_r <= 3; + v_back_porch_r <= 20; + v_border_r <= (288-VIDEO_V_SIZE)/2; + + when PACE_VIDEO_LCM_320x240_60Hz => + -- DE1/2, clk=18MHz + h_front_porch_r <= 59; + h_sync_r <= 1; + h_back_porch_r <= 151; + h_border_r <= (320-VIDEO_H_SIZE)*3/2; + v_front_porch_r <= 8; + v_sync_r <= 1; + v_back_porch_r <= 13; + v_border_r <= (240-VIDEO_V_SIZE)/2; + + when others => + null; + end case; + + h_video_r <= VIDEO_H_SIZE; + v_video_r <= VIDEO_V_SIZE; + border_rgb_r <= BORDER_RGB; + + --end if; + end process reg_proc; + + -- register some arithmetic + init_proc: process (reset, clk, clk_ena) + begin + if reset = '1' then + null; + elsif rising_edge(clk) then + h_sync_start <= h_front_porch_r - 1; + h_back_porch_start <= h_sync_start + h_sync_r; + h_left_border_start <= h_back_porch_start + h_back_porch_r; + h_video_start <= h_left_border_start + h_border_r; + h_right_border_start <= h_video_start + h_video_r; + h_line_end <= h_right_border_start + h_border_r; + v_sync_start <= v_front_porch_r - 1; + v_back_porch_start <= v_sync_start + v_sync_r; + v_top_border_start <= v_back_porch_start + v_back_porch_r; + v_video_start <= v_top_border_start + v_border_r; + v_bottom_border_start <= v_video_start + v_video_r; + v_screen_end <= v_bottom_border_start + v_border_r; + end if; + end process init_proc; + + reset_proc: process (reset, clk) + variable count_v : integer; + begin + if reset = '1' then + --extended_reset <= '1'; + count_v := 7; + elsif rising_edge(clk) then + if count_v = 0 then + --extended_reset <= '0'; + else + count_v := count_v - 1; + end if; + end if; + end process reset_proc; + + -- video control outputs + timer_proc: process (extended_reset, clk, clk_ena) + begin + if extended_reset = '1' then + hblank_s <= '1'; + vblank_s <= '1'; + hactive_s <= '0'; + vactive_s <= '0'; + hsync_s <= not H_SYNC_POL; + x_count <= 0; + y_count <= 0; + elsif rising_edge(clk) and clk_ena = '1' then + if x_count = h_line_end then + hblank_s <= '1'; + hactive_s <= '0'; -- for 0 borders + if y_count = v_screen_end then + vblank_s <= '1'; + vactive_s <= '0'; -- for 0 borders + y_count <= 0; + else + y_s <= y_s + 1; + if y_count = v_sync_start then + vsync_s <= V_SYNC_POL; + elsif y_count = v_back_porch_start then + vsync_s <= not V_SYNC_POL; + elsif y_count = v_video_start then + vblank_s <= '0'; -- for 0 borders + vactive_s <= '1'; + y_s <= (others => '0'); + -- check the borders last in case they're 0 + elsif y_count = v_top_border_start then + vblank_s <= '0'; + elsif y_count = v_bottom_border_start then + vactive_s <= '0'; + end if; + y_count <= y_count + 1; + end if; + x_count <= 0; + else + x_s <= x_s + 1; + if x_count = h_sync_start then + hsync_s <= H_SYNC_POL; + elsif x_count = h_back_porch_start then + hsync_s <= not H_SYNC_POL; + elsif x_count = h_video_start then + hblank_s <= '0'; -- for 0 borders + hactive_s <= '1'; + x_s <= (others => '0'); + -- check the borders last in case they're 0 + elsif x_count = h_left_border_start then + hblank_s <= '0'; + elsif x_count = h_right_border_start then + hactive_s <= '0'; + end if; + x_count <= x_count + 1; + end if; + end if; -- rising_edge(clk) and clk_ena = '1' + end process timer_proc; + + -- pass-through for tile/bitmap & sprite controllers + video_ctl_o.clk <= clk; + video_ctl_o.clk_ena <= clk_ena; + + -- for video DACs and TFT output + video_o.clk <= clk; + + BLK_VIDEO_O : block + + constant PIPELINE_DELAY : natural := DELAY+1; + + -- won't synthesize correctly under ISE if these are variables + signal hactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + signal vactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + + begin + + video_o_proc: process (extended_reset, clk, clk_ena) + variable hsync_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + variable vsync_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + --variable hactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + --variable vactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + variable hblank_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + variable vblank_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); + alias hsync_v : std_logic is hsync_v_r(hsync_v_r'left); + alias vsync_v : std_logic is vsync_v_r(vsync_v_r'left); + alias hactive_v : std_logic is hactive_v_r(hactive_v_r'left); + alias vactive_v : std_logic is vactive_v_r(vactive_v_r'left); + alias hblank_v : std_logic is hblank_v_r(hblank_v_r'left); + alias vblank_v : std_logic is vblank_v_r(vblank_v_r'left); + variable stb_cnt_v : unsigned(3 downto 0); -- up to 16x scaling + begin + if extended_reset = '1' then + hsync_v_r := (others => not H_SYNC_POL); + vsync_v_r := (others => not V_SYNC_POL); + hactive_v_r <= (others => '0'); + vactive_v_r <= (others => '0'); + hblank_v_r := (others => '0'); + vblank_v_r := (others => '0'); + stb_cnt_v := (others => '1'); + elsif rising_edge(clk) and clk_ena = '1' then + + -- register control signals and handle scaling + video_ctl_o.hblank <= not hactive_s after SIM_DELAY; -- used only by the bitmap/tilemap/sprite controllers + video_ctl_o.vblank <= not vactive_s after SIM_DELAY; -- used only by the bitmap/tilemap/sprite controllers + -- handle scaling + video_ctl_o.stb <= stb_cnt_v(H_SCALE-1) after SIM_DELAY; + if hactive_s = '1' and vactive_s = '1' then + stb_cnt_v := stb_cnt_v + 2; + elsif hblank_s = '0' and vblank_s = '0' then + stb_cnt_v := (others => '1'); + end if; + video_ctl_o.x <= std_logic_vector(resize(x_s(x_s'left downto H_SCALE-1), video_ctl_o.x'length)) after SIM_DELAY; + video_ctl_o.y <= std_logic_vector(resize(y_s(y_s'left downto V_SCALE-1), video_ctl_o.y'length)) after SIM_DELAY; + + -- register video outputs + if hactive_v = '1' and vactive_v = '1' then + -- active video + if x_s(x_s'left downto H_SCALE-1) < (L_CROP + PIPELINE_DELAY) or + x_s(x_s'left downto H_SCALE-1) >= (H_SIZE - R_CROP + PIPELINE_DELAY) then + video_o.rgb <= RGB_BLACK after SIM_DELAY; + else + video_o.rgb <= rgb_i after SIM_DELAY; + end if; + elsif hblank_v = '0' and vblank_v = '0' then + -- border + video_o.rgb <= border_rgb_r after SIM_DELAY; + else + video_o.rgb.r <= (others => '0') after SIM_DELAY; + video_o.rgb.g <= (others => '0') after SIM_DELAY; + video_o.rgb.b <= (others => '0') after SIM_DELAY; + end if; + video_o.hsync <= hsync_v after SIM_DELAY; + video_o.vsync <= vsync_v after SIM_DELAY; + video_o.hblank <= hblank_v after SIM_DELAY; + video_o.vblank <= vblank_v after SIM_DELAY; + -- pipelined signals + hsync_v_r := hsync_v_r(hsync_v_r'left-1 downto 0) & hsync_s; + vsync_v_r := vsync_v_r(vsync_v_r'left-1 downto 0) & vsync_s; + hactive_v_r <= hactive_v_r(hactive_v_r'left-1 downto 0) & hactive_s; + vactive_v_r <= vactive_v_r(vactive_v_r'left-1 downto 0) & vactive_s; + hblank_v_r := hblank_v_r(hblank_v_r'left-1 downto 0) & hblank_s; + vblank_v_r := vblank_v_r(vblank_v_r'left-1 downto 0) & vblank_s; + end if; + end process video_o_proc; + + end block BLK_VIDEO_O; + +end SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/video_controller_pkg.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/video_controller_pkg.vhd new file mode 100644 index 00000000..183bfe23 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/video_controller_pkg.vhd @@ -0,0 +1,229 @@ +library IEEE; +use IEEE.std_logic_1164.all; +--use IEEE.numeric_std.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +package video_controller_pkg is + + type PACEVideoController_t is + ( + PACE_VIDEO_NONE, -- PACE video controller not used + PACE_VIDEO_VGA_240x320_60Hz, -- P3M video + PACE_VIDEO_VGA_320x480_60Hz, -- for 320x200 (12.588MHz) + PACE_VIDEO_VGA_640x480_60Hz, -- generic VGA (25.175MHz) + PACE_VIDEO_VGA_800x600_60Hz, -- generic VGA (40MHz) + PACE_VIDEO_VGA_1024x768_60Hz, -- XVGA (65MHz) + PACE_VIDEO_VGA_1366x768_60Hz, -- (NAVICO ROCKY) (72MHz) + PACE_VIDEO_VGA_1280x800_60Hz, -- Sentinel Mode 36 + PACE_VIDEO_VGA_1280x1024_60Hz, -- SXGA (108MHz) + PACE_VIDEO_VGA_1680x1050_60Hz, -- WSXGA+ (147MHz) + PACE_VIDEO_ARCADE_STD_336x240_60Hz, -- arcade std resolution (7.16MHz) + PACE_VIDEO_ARCADE_STD_336x240_60Hz_28M64, -- arcade std resolution (28.64MHz) + PACE_VIDEO_CVBS_720x288p_50Hz, -- generic composite + PACE_VIDEO_LCM_320x240_60Hz -- DE2 LCD + ); + + type PACEVideoDisplay_t is + ( + PACE_DISPLAY_NONE, + PACE_DISPLAY_VGA, + PACE_DISPLAY_CVBS, + PACE_DISPLAY_TFT + ); + + type RGB_t is record + r : std_logic_vector(9 downto 0); + g : std_logic_vector(9 downto 0); + b : std_logic_vector(9 downto 0); + end record; + + type RGB_a is array (natural range <>) of RGB_t; + + function NULL_RGB return RGB_t; + + constant RGB_BLACK : RGB_t := ((others=>'0'),(others=>'0'),(others=>'0')); + constant RGB_RED : RGB_t := ((others=>'1'),(others=>'0'),(others=>'0')); + constant RGB_GREEN : RGB_t := ((others=>'0'),(others=>'1'),(others=>'0')); + constant RGB_YELLOW : RGB_t := ((others=>'1'),(others=>'1'),(others=>'0')); + constant RGB_BLUE : RGB_t := ((others=>'0'),(others=>'0'),(others=>'1')); + constant RGB_MAGENTA : RGB_t := ((others=>'1'),(others=>'0'),(others=>'1')); + constant RGB_CYAN : RGB_t := ((others=>'0'),(others=>'1'),(others=>'1')); + constant RGB_WHITE : RGB_t := ((others=>'1'),(others=>'1'),(others=>'1')); + + type VIDEO_REG_t is record + h_scale : std_logic_vector(2 downto 0); + v_scale : std_logic_vector(2 downto 0); + end record; + + type from_VIDEO_t is record + clk : std_logic; + clk_ena : std_logic; + reset : std_logic; + end record; + + type to_VIDEO_t is record + clk : std_logic; + rgb : rgb_t; + hsync : std_logic; + vsync : std_logic; + hblank : std_logic; + vblank : std_logic; + de : std_logic; + end record; + + type from_VIDEO_CTL_t is record + clk : std_logic; + clk_ena : std_logic; + stb : std_logic; + hblank : std_logic; + vblank : std_logic; + x : std_logic_vector(10 downto 0); + y : std_logic_vector(10 downto 0); + end record; + + subtype BITMAP_D_t is std_logic_vector(23 downto 0); + subtype BITMAP_A_t is std_logic_vector(15 downto 0); + + type to_BITMAP_CTL_t is record + d : BITMAP_D_t; + end record; + + type to_BITMAP_CTL_a is array (natural range <>) of to_BITMAP_CTL_t; + + function NULL_TO_BITMAP_CTL return to_BITMAP_CTL_t; + + type from_BITMAP_CTL_t is record + a : BITMAP_A_t; + rgb : RGB_t; + set : std_logic; + end record; + + type from_BITMAP_CTL_a is array (natural range <>) of from_BITMAP_CTL_t; + + subtype TILEMAP_D_t is std_logic_vector(15 downto 0); + subtype TILEMAP_A_t is std_logic_vector(15 downto 0); + subtype TILE_A_t is std_logic_vector(16 downto 0); + subtype TILE_D_t is std_logic_vector(23 downto 0); + subtype ATTR_A_t is std_logic_vector(15 downto 0); + subtype ATTR_D_t is std_logic_vector(15 downto 0); + + type to_TILEMAP_CTL_t is record + map_d : TILEMAP_D_t; + tile_d : TILE_D_t; + attr_d : ATTR_D_t; + end record; + + type to_TILEMAP_CTL_a is array (natural range <>) of to_TILEMAP_CTL_t; + + function NULL_TO_TILEMAP_CTL return to_TILEMAP_CTL_t; + + type from_TILEMAP_CTL_t is record + map_a : TILEMAP_A_t; + tile_a : TILE_A_t; + attr_a : ATTR_A_t; + rgb : RGB_t; + set : std_logic; + end record; + + type from_TILEMAP_CTL_a is array (natural range <>) of from_TILEMAP_CTL_t; + + subtype PAL_ENTRY_t is std_logic_vector(15 downto 0); + type PAL_A_t is array (natural range <>) of PAL_ENTRY_t; + + subtype BYTE_t is std_logic_vector(7 downto 0); + type BYTE_A_t is array (natural range <>) of BYTE_t; + + subtype WORD_t is std_logic_vector(15 downto 0); + type WORD_A_t is array (natural range <>) of WORD_t; + + type to_GRAPHICS_t is record + pal : PAL_A_t(0 to 15); + -- for various uses + bit8 : BYTE_A_t(0 to 7); + bit16 : WORD_A_t(0 to 3); + -- 'native' graphics stream + hsync : std_logic; + vsync : std_logic; + rgb : RGB_t; + end record; + + function NULL_TO_GRAPHICS return to_GRAPHICS_t; + + type from_GRAPHICS_t is record + y : std_logic_vector(10 downto 0); + hblank : std_logic; + vblank : std_logic; + end record; + + component pace_video_controller is + generic + ( + CONFIG : PACEVideoController_t := PACE_VIDEO_NONE; + DELAY : integer := 1; + H_SIZE : integer; + V_SIZE : integer; + --H_SCALE : integer; + --V_SCALE : integer; + BORDER_RGB : RGB_t := RGB_BLACK + ); + port + ( + -- clocking etc + video_i : in from_VIDEO_t; + + -- register interface + reg_i : in VIDEO_REG_t; + + -- video input data + rgb_i : in RGB_t; + + -- control signals (out) + video_ctl_o : from_VIDEO_CTL_t; + + -- Outputs to video + video_o : out to_VIDEO_t + ); + end component pace_video_controller; + + component tilemapCtl is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- tilemap controller signals + ctl_i : in to_TILEMAP_CTL_t; + ctl_o : out from_TILEMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); + end component tilemapCtl; + + component bitmapCtl is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- bitmap controller signals + ctl_i : in to_BITMAP_CTL_t; + ctl_o : out from_BITMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); + end component bitmapCtl; + +end package video_controller_pkg; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/video_controller_pkg_body.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/video_controller_pkg_body.vhd new file mode 100644 index 00000000..996e5867 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/video_controller_pkg_body.vhd @@ -0,0 +1,29 @@ +library work; +--use work.pace_pkg.all; + +package body video_controller_pkg is + + function NULL_RGB return RGB_t is + begin + return (others => (others => '0')); + end NULL_RGB; + + function NULL_TO_BITMAP_CTL return to_BITMAP_CTL_t is + begin + return (others => (others => '0')); + end NULL_TO_BITMAP_CTL; + + function NULL_TO_TILEMAP_CTL return to_TILEMAP_CTL_t is + begin + return ((others => '0'), (others => '0'), (others => '0')); + end NULL_TO_TILEMAP_CTL; + + function NULL_TO_GRAPHICS return to_GRAPHICS_t is + begin + return ((others => (others => '0')), + (others => (others => '0')), + (others => (others => '0')), + '0', '0', NULL_RGB); + end NULL_TO_GRAPHICS; + +end package body video_controller_pkg; diff --git a/Arcade/Midway8080 Hardware/Midway8080_MiST/src/video_mixer.vhd b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/video_mixer.vhd new file mode 100644 index 00000000..fb4b4aa4 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080_MiST/src/video_mixer.vhd @@ -0,0 +1,66 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; +use work.pace_pkg.all; +use work.video_controller_pkg.all; +use work.sprite_pkg.all; +use work.platform_pkg.all; + +entity pace_video_mixer is + port + ( + --bitmap_rgb : in RGB_t; + --bitmap_set : in std_logic; + bitmap_ctl_o : in from_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); + tilemap_ctl_o : in from_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); + sprite_rgb : in RGB_t; + sprite_set : in std_logic; + sprite_pri : in std_logic; + + video_ctl_i : in from_VIDEO_CTL_t; + graphics_i : in to_GRAPHICS_t; + rgb_o : out RGB_t + ); +end entity pace_video_mixer; + +architecture SYN of pace_video_mixer is + signal bg_rgb : RGB_t; +begin + + GEN_BITMAPS : + if PACE_VIDEO_NUM_BITMAPS = 1 generate + bg_rgb <= bitmap_ctl_o(1).rgb; + elsif PACE_VIDEO_NUM_BITMAPS = 2 generate + bg_rgb <= bitmap_ctl_o(1).rgb when bitmap_ctl_o(1).set = '1' else + bitmap_ctl_o(2).rgb; + elsif PACE_VIDEO_NUM_BITMAPS = 3 generate + bg_rgb <= bitmap_ctl_o(1).rgb when bitmap_ctl_o(1).set = '1' else + bitmap_ctl_o(2).rgb when bitmap_ctl_o(2).set = '1' else + bitmap_ctl_o(3).rgb when bitmap_ctl_o(3).set = '1' else + (others => (others => '0')); + else generate + bg_rgb <= (others => (others => '0')); + end generate GEN_BITMAPS; + + GEN_TILEMAPS : + if PACE_VIDEO_NUM_TILEMAPS = 1 generate + rgb_o <= sprite_rgb when sprite_set = '1' and sprite_pri = '1' else + tilemap_ctl_o(1).rgb when tilemap_ctl_o(1).set = '1' else + sprite_rgb when sprite_set = '1' else + bg_rgb; + elsif PACE_VIDEO_NUM_TILEMAPS = 2 generate + rgb_o <= sprite_rgb when sprite_set = '1' and sprite_pri = '1' else + tilemap_ctl_o(1).rgb when tilemap_ctl_o(1).set = '1' else + tilemap_ctl_o(2).rgb when tilemap_ctl_o(2).set = '1' else + sprite_rgb when sprite_set = '1' else + bg_rgb; + else generate + rgb_o <= sprite_rgb when sprite_set = '1' and sprite_pri = '1' else + sprite_rgb when sprite_set = '1' else + bg_rgb; + end generate GEN_TILEMAPS; + +end architecture SYN; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/Invaders.qpf b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/Invaders.qpf new file mode 100644 index 00000000..c69f402a --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/Invaders.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 21:27:39 November 20, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:27:39 November 20, 2017" + +# Revisions + +PROJECT_REVISION = "Invaders" diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/Invaders.qsf b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/Invaders.qsf new file mode 100644 index 00000000..0f690d41 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/Invaders.qsf @@ -0,0 +1,134 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 21:27:39 November 20, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Invaders_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. +# +# -------------------------------------------------------------------------- # + +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 PLL_1 -to "pll:pll|altpll:altpll_component" + + + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name TOP_LEVEL_ENTITY Invaders_mist +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:27:39 NOVEMBER 20, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" +set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation +set_global_assignment -name VHDL_FILE rtl/invaders_audio.vhd +set_global_assignment -name VHDL_FILE rtl/invaders.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_rom_h.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_rom_e.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_rom_f.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_rom_g.vhd +set_global_assignment -name QIP_FILE rtl/WRAM.qip +set_global_assignment -name VHDL_FILE rtl/mw8080.vhd +set_global_assignment -name VHDL_FILE rtl/T8080se.vhd +set_global_assignment -name VHDL_FILE rtl/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/T80.vhd +set_global_assignment -name VHDL_FILE rtl/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/T80_Reg.vhd +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +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 SYSTEMVERILOG_FILE rtl/Invaders_mist.sv +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +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 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 USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +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" +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 +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)" +set_global_assignment -name VHDL_FILE rtl/Invaders_memory.vhd +set_global_assignment -name VHDL_FILE rtl/invaders_video.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/README.txt b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/README.txt new file mode 100644 index 00000000..a610b39a --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Space Invaders port to MiST by Gehstock +-- 09 Januar 2018 +-- +--------------------------------------------------------------------------------- +-- +-- Midway 8080 Hardware +-- Audio based on work by Paul Walsh. +-- Audio and scan converter by MikeJ. +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- F1 : Start +-- SPACE : Fire +-- RIGHT/LEFT : Movement +-- +-- Joystick support. +-- +-- +--------------------------------------------------------------------------------- + +Work in Progress + diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/Release/Invaders.rbf b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/Release/Invaders.rbf new file mode 100644 index 00000000..a5835782 Binary files /dev/null and b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/Release/Invaders.rbf differ diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/clean.bat b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/Invaders_memory.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/Invaders_memory.vhd new file mode 100644 index 00000000..665b8e96 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/Invaders_memory.vhd @@ -0,0 +1,81 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaders_memory is + port( + CLK : in std_logic;--10mhz + RWE_n : in std_logic; + AD : in std_logic_vector(15 downto 0); + RAB : in std_logic_vector(12 downto 0); + RDB : out std_logic_vector(7 downto 0); + RWD : in std_logic_vector(7 downto 0); + IB : out std_logic_vector(7 downto 0) + ); +end invaders_memory; + +architecture rtl of invaders_memory is + signal rom_data_0 : std_logic_vector(7 downto 0); + signal rom_data_1 : std_logic_vector(7 downto 0); + signal rom_data_2 : std_logic_vector(7 downto 0); + signal rom_data_3 : std_logic_vector(7 downto 0); + +begin + u_rom_h : entity work.INVADERS_ROM_H + port map ( + CLK => Clk, + ENA => '1', + ADDR => AD(10 downto 0), + DATA => rom_data_0 + ); + -- + u_rom_g : entity work.INVADERS_ROM_G + port map ( + CLK => Clk, + ENA => '1', + ADDR => AD(10 downto 0), + DATA => rom_data_1 + ); + -- + u_rom_f : entity work.INVADERS_ROM_F + port map ( + CLK => Clk, + ENA => '1', + ADDR => AD(10 downto 0), + DATA => rom_data_2 + ); + -- + u_rom_e : entity work.INVADERS_ROM_E + port map ( + CLK => Clk, + ENA => '1', + ADDR => AD(10 downto 0), + DATA => rom_data_3 + ); + -- + p_rom_data : process(AD, rom_data_0, rom_data_1, rom_data_2, rom_data_3) + begin + IB <= (others => '0'); + case AD(12 downto 11) is + when "00" => IB <= rom_data_0; + when "01" => IB <= rom_data_1; + when "10" => IB <= rom_data_2; + when "11" => IB <= rom_data_3; + when others => null; + end case; + end process; + + + rams : for i in 0 to 3 generate + u_ram : entity work.WRAM + port map ( + q => RDB((i*2)+1 downto (i*2)), + address => RAB, + clock => Clk, + data => RWD((i*2)+1 downto (i*2)), + rden => '1', + wren => not RWE_n + ); + end generate; + +end; \ No newline at end of file diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/Invaders_mist.sv b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/Invaders_mist.sv new file mode 100644 index 00000000..30306b63 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/Invaders_mist.sv @@ -0,0 +1,207 @@ +module Invaders_mist +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Space Inv.;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +wire clk_sys, clk_mist; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_sys), + .c1(clk_mist) +); + + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [7:0] audio; +wire hsync,vsync; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid; +wire hs, vs; +wire r,g,b; + +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_mist), + .ce_pix(clk_sys), + .ce_pix_actual(clk_sys), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r,r}), + .G({g,g,g}), + .B({b,b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_mist ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_mist), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +//wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +//wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +wire [12:0]RAB; +wire [15:0]AD; +wire [7:0]RDB; +wire [7:0]RWD; +wire [7:0]IB; +wire [5:0]SoundCtrl3; +wire [5:0]SoundCtrl5; +wire Rst_n_s; +wire RWE_n; +wire Video; +wire HSync; +wire VSync; + +invaderst invaderst( + .Rst_n(~(status[0] | status[6] | buttons[1])), + .Clk(clk_sys), + .ENA(), + .Coin(m_coin), + .Sel1Player(~m_start1), + .Sel2Player(~m_start2), + .Fire(~m_fire), + .MoveLeft(~m_left), + .MoveRight(~m_right), + .DIP(8'b0), + .RDB(RDB), + .IB(IB), + .RWD(RWD), + .RAB(RAB), + .AD(AD), + .SoundCtrl3(SoundCtrl3), + .SoundCtrl5(SoundCtrl5), + .Rst_n_s(Rst_n_s), + .RWE_n(RWE_n), + .Video(Video), + .HSync(HSync), + .VSync(VSync) + ); + +Invaders_memory Invaders_memory ( + .CLK(clk_sys), + .RWE_n(RWE_n), + .AD(AD), + .RAB(RAB), + .RDB(RDB), + .RWD(RWD), + .IB(IB) + ); + +invaders_audio invaders_audio ( + .Clk(clk_sys), + .S1(SoundCtrl3), + .S2(SoundCtrl5), + .Aud(audio) + ); + +invaders_video invaders_video ( + .Video(Video), + .CLK(clk_sys), + .Rst_n_s(Rst_n_s), + .HSync(HSync), + .VSync(VSync), + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs) + ); + +dac dac +( + .clk_i(clk_mist), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +endmodule diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T8080se.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T8080se.vhd new file mode 100644 index 00000000..b18b47a4 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T8080se.vhd @@ -0,0 +1,194 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- 8080 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original 8080 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- 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/t80/ +-- +-- Limitations : +-- STACK status output not supported +-- +-- File history : +-- +-- 0237 : First version +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T8080se is + generic( + Mode : integer := 2; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 0 -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T8080se; + +architecture rtl of T8080se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal INT_n : std_logic; + signal HALT_n : std_logic; + signal BUSRQ_n : std_logic; + signal BUSAK_n : std_logic; + signal DO_i : std_logic_vector(7 downto 0); + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + signal One : std_logic; + +begin + + INT_n <= not INT; + BUSRQ_n <= HOLD; + HLDA <= not BUSAK_n; + SYNC <= '1' when TState = "001" else '0'; + VAIT <= '1' when TState = "010" else '0'; + One <= '1'; + + DO(0) <= not IntCycle_n when TState = "001" else DO_i(0); -- INTA + DO(1) <= Write when TState = "001" else DO_i(1); -- WO_n + DO(2) <= DO_i(2); -- STACK not supported !!!!!!!!!! + DO(3) <= not HALT_n when TState = "001" else DO_i(3); -- HLTA + DO(4) <= IORQ and Write when TState = "001" else DO_i(4); -- OUT + DO(5) <= DO_i(5) when TState /= "001" else '1' when MCycle = "001" else '0'; -- M1 + DO(6) <= IORQ and not Write when TState = "001" else DO_i(6); -- INP + DO(7) <= not IORQ and not Write and IntCycle_n when TState = "001" else DO_i(7); -- MEMR + + u0 : T80 + generic map( + Mode => Mode, + IOWait => 0) + port map( + CEN => CLKEN, + M1_n => open, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => open, + HALT_n => HALT_n, + WAIT_n => READY, + INT_n => INT_n, + NMI_n => One, + RESET_n => RESET_n, + BUSRQ_n => One, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO_i, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n, + IntE => INTE); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + DBIN <= '0'; + WR_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK'event and CLK = '1' then + if CLKEN = '1' then + DBIN <= '0'; + WR_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and READY = '0') then + DBIN <= IntCycle_n; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and NoRead = '0' and Write = '0' then + DBIN <= '1'; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and READY = '0')) and Write = '1' then + WR_n <= '0'; + end if; + end if; + end if; + if TState = "010" and READY = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_ALU.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_ALU.vhd new file mode 100644 index 00000000..e09def1e --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_ALU.vhd @@ -0,0 +1,361 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + OverFlow_v <= Carry_v xor Carry7_v; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_MCode.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_Pack.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_Reg.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_RegX.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_RegX.vhd new file mode 100644 index 00000000..ebeee095 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/T80_RegX.vhd @@ -0,0 +1,176 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers for Xilinx Select RAM +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Removed UNISIM library and added componet declaration +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + component RAM16X1D + port( + DPO : out std_ulogic; + SPO : out std_ulogic; + A0 : in std_ulogic; + A1 : in std_ulogic; + A2 : in std_ulogic; + A3 : in std_ulogic; + D : in std_ulogic; + DPRA0 : in std_ulogic; + DPRA1 : in std_ulogic; + DPRA2 : in std_ulogic; + DPRA3 : in std_ulogic; + WCLK : in std_ulogic; + WE : in std_ulogic); + end component; + + signal ENH : std_logic; + signal ENL : std_logic; + +begin + + ENH <= CEN and WEH; + ENL <= CEN and WEL; + + bG1: for I in 0 to 7 generate + begin + Reg1H : RAM16X1D + port map( + DPO => DOBH(i), + SPO => DOAH(i), + A0 => AddrA(0), + A1 => AddrA(1), + A2 => AddrA(2), + A3 => '0', + D => DIH(i), + DPRA0 => AddrB(0), + DPRA1 => AddrB(1), + DPRA2 => AddrB(2), + DPRA3 => '0', + WCLK => Clk, + WE => ENH); + Reg1L : RAM16X1D + port map( + DPO => DOBL(i), + SPO => DOAL(i), + A0 => AddrA(0), + A1 => AddrA(1), + A2 => AddrA(2), + A3 => '0', + D => DIL(i), + DPRA0 => AddrB(0), + DPRA1 => AddrB(1), + DPRA2 => AddrB(2), + DPRA3 => '0', + WCLK => Clk, + WE => ENL); + Reg2H : RAM16X1D + port map( + DPO => DOCH(i), + SPO => open, + A0 => AddrA(0), + A1 => AddrA(1), + A2 => AddrA(2), + A3 => '0', + D => DIH(i), + DPRA0 => AddrC(0), + DPRA1 => AddrC(1), + DPRA2 => AddrC(2), + DPRA3 => '0', + WCLK => Clk, + WE => ENH); + Reg2L : RAM16X1D + port map( + DPO => DOCL(i), + SPO => open, + A0 => AddrA(0), + A1 => AddrA(1), + A2 => AddrA(2), + A3 => '0', + D => DIL(i), + DPRA0 => AddrC(0), + DPRA1 => AddrC(1), + DPRA2 => AddrC(2), + DPRA3 => '0', + WCLK => Clk, + WE => ENL); + end generate; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/WRAM.qip b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/WRAM.qip new file mode 100644 index 00000000..ba1d4355 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/WRAM.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "RAM: 1-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "WRAM.vhd"] diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/WRAM.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/WRAM.vhd new file mode 100644 index 00000000..cce6b51b --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/WRAM.vhd @@ -0,0 +1,160 @@ +-- megafunction wizard: %RAM: 1-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: WRAM.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY WRAM IS + PORT + ( + address : IN STD_LOGIC_VECTOR (12 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + rden : IN STD_LOGIC := '1'; + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (1 DOWNTO 0) + ); +END WRAM; + + +ARCHITECTURE SYN OF wram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (1 DOWNTO 0); + +BEGIN + q <= sub_wire0(1 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 8192, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "CLOCK0", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => 13, + width_a => 2, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + data_a => data, + wren_a => wren, + rden_a => rden, + q_a => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +-- Retrieval info: PRIVATE: AclrByte NUMERIC "0" +-- Retrieval info: PRIVATE: AclrData NUMERIC "0" +-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "1" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clken NUMERIC "0" +-- Retrieval info: PRIVATE: DataBusSeparated NUMERIC "1" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "" +-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8192" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +-- Retrieval info: PRIVATE: RegAddr NUMERIC "1" +-- Retrieval info: PRIVATE: RegData NUMERIC "1" +-- Retrieval info: PRIVATE: RegOutput NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: SingleClock NUMERIC "1" +-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "1" +-- Retrieval info: PRIVATE: WRCONTROL_ACLR_A NUMERIC "0" +-- Retrieval info: PRIVATE: WidthAddr NUMERIC "13" +-- Retrieval info: PRIVATE: WidthData NUMERIC "2" +-- Retrieval info: PRIVATE: rden NUMERIC "1" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "8192" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "SINGLE_PORT" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +-- Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +-- Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_A STRING "NEW_DATA_NO_NBE_READ" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "2" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: address 0 0 13 0 INPUT NODEFVAL "address[12..0]" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: data 0 0 2 0 INPUT NODEFVAL "data[1..0]" +-- Retrieval info: USED_PORT: q 0 0 2 0 OUTPUT NODEFVAL "q[1..0]" +-- Retrieval info: USED_PORT: rden 0 0 0 0 INPUT VCC "rden" +-- Retrieval info: USED_PORT: wren 0 0 0 0 INPUT NODEFVAL "wren" +-- Retrieval info: CONNECT: @address_a 0 0 13 0 address 0 0 13 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: @data_a 0 0 2 0 data 0 0 2 0 +-- Retrieval info: CONNECT: @rden_a 0 0 0 0 rden 0 0 0 0 +-- Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 2 0 @q_a 0 0 2 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL WRAM.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL WRAM.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL WRAM.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL WRAM.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL WRAM_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/build_id.tcl b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_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/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/build_id.v b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/build_id.v new file mode 100644 index 00000000..4d429cb5 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171118" +`define BUILD_TIME "195221" diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/dac.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/hq2x.sv b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_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/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders.vhd new file mode 100644 index 00000000..2bf98881 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders.vhd @@ -0,0 +1,271 @@ +-- Space Invaders core logic +-- 9.984MHz clock +-- +-- Version : 0242 +-- +-- 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.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Cleaned up reset logic +-- +-- 0300 : MikeJ tidyup for audio release + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity invaderst is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + Coin : in std_logic; + Sel1Player : in std_logic; + Sel2Player : in std_logic; + Fire : in std_logic; + MoveLeft : in std_logic; + MoveRight : in std_logic; + DIP : in std_logic_vector(8 downto 1); + RDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + RWD : out std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + AD : out std_logic_vector(15 downto 0); + SoundCtrl3 : out std_logic_vector(5 downto 0); + SoundCtrl5 : out std_logic_vector(5 downto 0); + Rst_n_s : out std_logic; + RWE_n : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic + ); +end invaderst; + +architecture rtl of invaderst is + + component mw8080 + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); + end component; + + signal GDB0 : std_logic_vector(7 downto 0); + signal GDB1 : std_logic_vector(7 downto 0); + signal GDB2 : std_logic_vector(7 downto 0); + signal S : std_logic_vector(7 downto 0); + signal GDB : std_logic_vector(7 downto 0); + signal DB : std_logic_vector(7 downto 0); + signal Sounds : std_logic_vector(7 downto 0); + signal AD_i : std_logic_vector(15 downto 0); + signal PortWr : std_logic_vector(6 downto 2); + signal EA : std_logic_vector(2 downto 0); + signal D5 : std_logic_vector(15 downto 0); + signal WD_Cnt : unsigned(7 downto 0); + signal Sample : std_logic; + signal Rst_n_s_i : std_logic; +begin + + Rst_n_s <= Rst_n_s_i; + RWD <= DB; + AD <= AD_i; + + process (Rst_n, Clk) + variable Rst_n_r : std_logic; + begin + if Rst_n = '0' then + Rst_n_r := '0'; + Rst_n_s_i <= '0'; + elsif Clk'event and Clk = '1' then + Rst_n_s_i <= Rst_n_r; + if WD_Cnt = 255 then + Rst_n_s_i <= '0'; + end if; + Rst_n_r := '1'; + end if; + end process; + + process (Rst_n_s_i, Clk) + variable Old_S0 : std_logic; + begin + if Rst_n_s_i = '0' then + WD_Cnt <= (others => '0'); + Old_S0 := '1'; + elsif Clk'event and Clk = '1' then + if Sounds(0) = '1' and Old_S0 = '0' then + WD_Cnt <= WD_Cnt + 1; + end if; + if PortWr(6) = '1' then + WD_Cnt <= (others => '0'); + end if; + Old_S0 := Sounds(0); + end if; + end process; + + u_mw8080: mw8080 + port map( + Rst_n => Rst_n_s_i, + Clk => Clk, + ENA => ENA, + RWE_n => RWE_n, + RDB => RDB, + IB => IB, + RAB => RAB, + Sounds => Sounds, + Ready => open, + GDB => GDB, + DB => DB, + AD => AD_i, + Status => open, + Systb => open, + Int => open, + Hold_n => '1', + IntE => open, + DBin_n => open, + Vait => open, + HldA => open, + Sample => Sample, + Wr => open, + Video => Video, + HSync => HSync, + VSync => VSync); + + with AD_i(9 downto 8) select + GDB <= GDB0 when "00", + GDB1 when "01", + GDB2 when "10", + S when others; + + GDB0(0) <= DIP(8); -- Unused ? + GDB0(1) <= DIP(7); + GDB0(2) <= DIP(6); -- Unused ? + GDB0(3) <= '1'; -- Unused ? + GDB0(4) <= not Fire; + GDB0(5) <= not MoveLeft; + GDB0(6) <= not MoveRight; + GDB0(7) <= DIP(5); -- Unused ? + + GDB1(0) <= not Coin;-- Active High ! + GDB1(1) <= not Sel2Player; + GDB1(2) <= not Sel1Player; + GDB1(3) <= '1'; -- Unused ? + GDB1(4) <= not Fire; + GDB1(5) <= not MoveLeft; + GDB1(6) <= not MoveRight; + GDB1(7) <= '1'; -- Unused ? + + GDB2(0) <= DIP(4); -- LSB Lives 3-6 + GDB2(1) <= DIP(3); -- MSB Lives 3-6 + GDB2(2) <= '0'; -- Tilt ? + GDB2(3) <= DIP(2); -- Bonus life at 1000 or 1500 + GDB2(4) <= not Fire; + GDB2(5) <= not MoveLeft; + GDB2(6) <= not MoveRight; + GDB2(7) <= DIP(1); -- Coin info + + PortWr(2) <= '1' when AD_i(10 downto 8) = "010" and Sample = '1' else '0'; + PortWr(3) <= '1' when AD_i(10 downto 8) = "011" and Sample = '1' else '0'; + PortWr(4) <= '1' when AD_i(10 downto 8) = "100" and Sample = '1' else '0'; + PortWr(5) <= '1' when AD_i(10 downto 8) = "101" and Sample = '1' else '0'; + PortWr(6) <= '1' when AD_i(10 downto 8) = "110" and Sample = '1' else '0'; + + process (Rst_n_s_i, Clk) + variable OldSample : std_logic; + begin + if Rst_n_s_i = '0' then + D5 <= (others => '0'); + EA <= (others => '0'); + SoundCtrl3 <= (others => '0'); + SoundCtrl5 <= (others => '0'); + OldSample := '0'; + elsif Clk'event and Clk = '1' then + if PortWr(2) = '1' then + EA <= DB(2 downto 0); + end if; + if PortWr(3) = '1' then + SoundCtrl3 <= DB(5 downto 0); + end if; + if PortWr(4) = '1' and OldSample = '0' then + D5(15 downto 8) <= DB; + D5(7 downto 0) <= D5(15 downto 8); + end if; + if PortWr(5) = '1' then + SoundCtrl5 <= DB(5 downto 0); + end if; + OldSample := Sample; + end if; + end process; + + with EA select + S <= D5(15 downto 8) when "000", + D5(14 downto 7) when "001", + D5(13 downto 6) when "010", + D5(12 downto 5) when "011", + D5(11 downto 4) when "100", + D5(10 downto 3) when "101", + D5( 9 downto 2) when "110", + D5( 8 downto 1) when others; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_audio.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_audio.vhd new file mode 100644 index 00000000..f16cf379 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_audio.vhd @@ -0,0 +1,496 @@ + +-- Version : 0300 +-- The latest version of this file can be found at: +-- http://www.fpgaarcade.com +-- minor tidy up by MikeJ +------------------------------------------------------------------------------- +-- Company: +-- Engineer: PaulWalsh +-- +-- Create Date: 08:45:29 11/04/05 +-- Design Name: +-- Module Name: Invaders Audio +-- Project Name: Space Invaders +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + + +entity invaders_audio is + Port ( + Clk : in std_logic; + S1 : in std_logic_vector(5 downto 0); + S2 : in std_logic_vector(5 downto 0); + Aud : out std_logic_vector(7 downto 0) + ); +end; + --* Port 3: (S1) + --* bit 0=UFO (repeats) + --* bit 1=Shot + --* bit 2=Base hit + --* bit 3=Invader hit + --* bit 4=Bonus base + --* + --* Port 5: (S2) + --* bit 0=Fleet movement 1 + --* bit 1=Fleet movement 2 + --* bit 2=Fleet movement 3 + --* bit 3=Fleet movement 4 + --* bit 4=UFO 2 + +architecture Behavioral of invaders_audio is + + signal ClkDiv : unsigned(10 downto 0) := (others => '0'); + signal ClkDiv2 : std_logic_vector(7 downto 0) := (others => '0'); + signal Clk7680_ena : std_logic; + signal Clk480_ena : std_logic; + signal Clk240_ena : std_logic; + signal Clk60_ena : std_logic; + + signal s1_t1 : std_logic_vector(5 downto 0); + signal s2_t1 : std_logic_vector(5 downto 0); + signal tempsum : std_logic_vector(7 downto 0); + + signal vco_cnt : std_logic_vector(3 downto 0); + + signal TriDir1 : std_logic; + signal Fnum : std_logic_vector(3 downto 0); + signal comp : std_logic; + + signal SS : std_logic; + + signal TrigSH : std_logic; + signal SHCnt : std_logic_vector(8 downto 0); + signal SH : std_logic_vector(7 downto 0); + signal SauHit : std_logic_vector(8 downto 0); + signal SHitTri : std_logic_vector(5 downto 0); + + signal TrigIH : std_logic; + signal IHDir : std_logic; + signal IHDir1 : std_logic; + signal IHCnt : std_logic_vector(8 downto 0); + signal IH : std_logic_vector(7 downto 0); + signal InHit : std_logic_vector(8 downto 0); + signal IHitTri : std_logic_vector(5 downto 0); + + signal TrigEx : std_logic; + signal Excnt : std_logic_vector(9 downto 0); + signal ExShift : std_logic_vector(15 downto 0); + signal Ex : std_logic_vector(2 downto 0); + signal Explo : std_logic; + + signal TrigMis : std_logic; + signal MisShift : std_logic_vector(15 downto 0); + signal MisCnt : std_logic_vector(8 downto 0); + signal miscnt1 : unsigned(7 downto 0); + signal Mis : std_logic_vector(2 downto 0); + signal Missile : std_logic; + + signal EnBG : std_logic; + signal BGFnum : std_logic_vector(7 downto 0); + signal BGCnum : std_logic_vector(7 downto 0); + signal bg_cnt : unsigned(7 downto 0); + signal BG : std_logic; + +begin + + -- do a crude addition of all sound samples + p_audio_mix : process + variable IHVol : std_logic_vector(6 downto 0); + variable SHVol : std_logic_vector(6 downto 0); + begin + wait until rising_edge(Clk); + + IHVol(6 downto 0) := InHit(6 downto 0) and IH(6 downto 0); + SHVol(6 downto 0) := SauHit(6 downto 0) and SH(6 downto 0); + + tempsum(7 downto 0) <= ('0' & IHVol) + ('0' & SHVol); + + Aud(7) <= tempsum (7); + Aud(6) <= tempsum (6) xor (Mis(2) and Missile) xor (Ex(2) and Explo) xor BG; + Aud(5) <= tempsum (5) xor (Mis(1) and Missile) xor (Ex(1) and Explo) xor SS; + Aud(4) <= tempsum (4) xor (Mis(0) and Missile) xor (Ex(0) and Explo); + Aud(3 downto 0) <= tempsum (3 downto 0); + + end process; + + p_clkdiv : process + begin + wait until rising_edge(Clk); + Clk7680_ena <= '0'; + if ClkDiv = 1277 then + Clk7680_ena <= '1'; + ClkDiv <= (others => '0'); + else + ClkDiv <= ClkDiv + 1; + end if; + end process; + + p_clkdiv2 : process + begin + wait until rising_edge(Clk); + Clk480_ena <= '0'; + Clk240_ena <= '0'; + Clk60_ena <= '0'; + + if (Clk7680_ena = '1') then + ClkDiv2 <= ClkDiv2 + 1; + + if (ClkDiv2(3 downto 0) = "0000") then + Clk480_ena <= '1'; + end if; + + if (ClkDiv2(4 downto 0) = "00000") then + Clk240_ena <= '1'; + end if; + + if (ClkDiv2(7 downto 0) = "00000000") then + Clk60_ena <= '1'; + end if; + + end if; + end process; + + p_delay : process + begin + wait until rising_edge(Clk); + s1_t1 <= S1; + s2_t1 <= S2; + end process; +--*************************Saucer Sound*************************************** + +-- Implement a VCOscilator: frequency is set using counter end point(Fnum) + p_saucer_vco : process + variable term : std_logic_vector(3 downto 0); + begin + wait until rising_edge(Clk); + term := 8 + Fnum; + if (S1(0) = '1') and (Clk7680_ena = '1') then + if vco_cnt = term then + + vco_cnt <= (others => '0'); + SS <= not SS; + else + vco_cnt <= vco_cnt + 1; + end if; + end if; + end process; + +-- Implement a 5.3Hz trianglular wave LFO control the Variable oscilator + -- this is 6Hz ?? 0123454321 + p_saucer_lfo : process + begin + wait until rising_edge(Clk); + if (Clk60_ena = '1') then + if Fnum = 4 then -- 5 -1 + Comp <= '1'; + elsif Fnum = 1 then -- 0 +1 + Comp <= '0'; + end if; + + if comp = '1' then + Fnum <= Fnum - 1 ; + else + Fnum <= Fnum + 1 ; + end if; + end if; + end process; + +--**********************SAUCER HIT Sound************************** + +-- Implement a 10Hz saw tooth LFO to control the Saucer Hit VCO + p_saucer_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if SHitTri = 48 then + SHitTri <= "000000"; + else + SHitTri <= SHitTri+1; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Saucer Hit 200Hz to 1kHz approx + p_saucer_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if TriDir1 = '1' then + if (SauHit +58 - SHitTri) < 190 + 256 then + SauHit <= SauHit +58 - SHitTri; + else + SauHit <= "110111110"; + TriDir1 <= '0'; + end if; + else + if (SauHit -58 + SHitTri) > 256 then + SauHit <= SauHit -58 + SHitTri; + else + SauHit <= "100000000"; + TriDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Saucer Hit Sound + p_saucer_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigSH = '1') then + SHCnt <= "100000000"; + SH <= "11111111"; + elsif (SHCnt(8) = '1') then + SHCnt <= SHCnt + "1"; + if SHCnt(7 downto 0) = x"60" then -- 96 + SH <= "01111111"; + elsif SHCnt(7 downto 0) = x"90" then -- 144 + SH <= "00111111"; + elsif SHCnt(7 downto 0) = x"C0" then -- 192 + SH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Saucer Hit Sound + p_saucer_hit : process + begin + wait until rising_edge(Clk); + if (S2(4) = '1') and (s2_t1(4) = '0') then -- rising_edge + TrigSH <= '1'; + elsif (Clk480_ena = '1') then + TrigSH <= '0'; + end if; + end process; + +--***********************Invader Hit Sound***************************** +-- Implement a 5Hz Triangular Wave LFO to control the Invaders Hit VCO + p_invader_hit_lfo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if IHitTri = 48-2 then + IHDir <= '0'; + elsif IHitTri =0+2 then + IHDir <= '1'; + end if; + + if IHDir ='1' then + IHitTri <= IHitTri + 2; + else + IHitTri <= IHitTri - 2; + end if; + end if; + end process; + +-- Implement a trianglular wave VCO for Invader Hit 700Hz to 3kHz approx + p_invader_hit_vco : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if IHDir1 = '1' then + if (InHit +10 + IHitTri) < 110 + 256 then + InHit <= InHit +10 + IHitTri; + else + InHit <= "101101110"; + IHDir1 <= '0'; + end if; + else + if (InHit -10 - IHitTri) > 256 then + InHit <= InHit -10 - IHitTri; + else + InHit <= "100000000"; + IHDir1 <= '1'; + end if; + end if; + end if; + end process; + +-- Implement the ADSR for Invader Hit Sound + p_invader_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigIH = '1') then + IHCnt <= "100000000"; + IH <= "11111111"; + elsif (IHCnt(8) = '1') then + IHCnt <= IHCnt + "1"; + if IHCnt(7 downto 0) = x"14" then -- 20 + IH <= "01111111"; + elsif IHCnt(7 downto 0) = x"1C" then -- 28 + IH <= "11111111"; + elsif IHCnt(7 downto 0) = x"30" then -- 48 + IH <= "00000000"; + end if; + end if; + end if; + end process; + + -- Implement the trigger for The Invader Hit Sound + p_invader_hit : process + begin + wait until rising_edge(Clk); + if (S1(3) = '1') and (s1_t1(3) = '0') then -- rising_edge + TrigIH <= '1'; + elsif (Clk480_ena = '1') then + TrigIH <= '0'; + end if; + end process; + +--***********************Explosion***************************** +-- Implement a Pseudo Random Noise Generator + p_explosion_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (ExShift = x"0000") then + ExShift <= "0000000010101001"; + else + ExShift(0) <= Exshift(14) xor ExShift(15); + ExShift(15 downto 1) <= ExShift (14 downto 0); + end if; + end if; + end process; + Explo <= ExShift(0); + + p_explosion_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigEx = '1') then + ExCnt <= "1000000000"; + Ex <= "100"; + elsif (ExCnt(9) = '1') then + ExCnt <= ExCnt + "1"; + if ExCnt(8 downto 0) = '0' & x"64" then -- 100 + Ex <= "010"; + elsif ExCnt(8 downto 0) = '0' & x"c8" then -- 200 + Ex <= "001"; + elsif ExCnt(8 downto 0) = '1' & x"2c" then -- 300 + Ex <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Explosion Sound + p_explosion_trig : process + begin + wait until rising_edge(Clk); + if (S1(2) = '1') and (s1_t1(2) = '0') then -- rising_edge + TrigEx <= '1'; + elsif (Clk480_ena = '1') then + TrigEx <= '0'; + end if; + end process; + +--***********************Missile***************************** +-- Implement a Pseudo Random Noise Generator + p_missile_pseudo : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if (MisShift = x"0000") then + MisShift <= "0000000010101001"; + else + MisShift(0) <= MisShift(14) xor MisShift(15); + MisShift(15 downto 1) <= MisShift (14 downto 0); + end if; + + miscnt1 <= miscnt1 + 20 + unsigned(MisShift(2 downto 0)); + if miscnt1 > 60 then + miscnt1 <= "00000000"; + Missile <= not Missile; + end if; + + end if; + end process; + +-- Implement the ADSR for The Missile Sound + p_missile_adsr : process + begin + wait until rising_edge(Clk); + if (Clk480_ena = '1') then + if (TrigMis = '1') then + MisCnt <= "100000000"; + Mis <= "100"; + elsif (MisCnt(8) = '1') then + MisCnt <= MisCnt + "1"; + if MisCnt(7 downto 0) = x"4b" then -- 75 + Mis <= "010"; + elsif MisCnt(7 downto 0) = x"70" then -- 112 + Mis <= "001"; + elsif MisCnt(7 downto 0) = x"96" then -- 150 + Mis <= "000"; + end if; + end if; + end if; + end process; + +-- Implement the trigger for The Missile Sound + p_missile_trig : process + begin + wait until rising_edge(Clk); + if (S1(1) = '1') and (s1_t1(1) = '0') then -- rising_edge + TrigMis <= '1'; + elsif (Clk480_ena = '1') then + TrigMis <= '0'; + end if; + end process; + +-- ******************************** Background invader moving tones ************************** + EnBG <= S2(0) or S2(1) or S2(2) or S2(3); + + with S2(3 downto 0) select + BGFnum <= x"66" when "0001", + x"74" when "0010", + x"7C" when "0100", + x"87" when "1000", + x"87" when others; + + with S2(3 downto 0) select + BGCnum <= x"33" when "0001", + x"3A" when "0010", + x"3E" when "0100", + x"43" when "1000", + x"43" when others; + +-- Implement a Variable Oscilator: set frequency using counter mid(Cnum) and end points(Fnum) + + p_background : process + begin + wait until rising_edge(Clk); + if (Clk7680_ena = '1') then + if EnBG = '0' then + bg_cnt <= x"00"; + BG <= '0'; + else + bg_cnt <= bg_cnt + 1; + + if bg_cnt = unsigned(BGfnum) then + bg_cnt <= x"00"; + BG <= '0'; + elsif bg_cnt=unsigned(BGCnum) then + BG <='1'; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_rom_e.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_rom_e.vhd new file mode 100644 index 00000000..b19c4624 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_rom_e.vhd @@ -0,0 +1,288 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity INVADERS_ROM_E is + port ( + CLK : in std_logic; + ENA : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of INVADERS_ROM_E is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"20",x"C3",x"C9",x"16",x"21",x"84",x"20",x"7E", -- 0x0000 + x"A7",x"CA",x"07",x"07",x"23",x"7E",x"A7",x"C0", -- 0x0008 + x"06",x"01",x"C3",x"FA",x"18",x"21",x"10",x"28", -- 0x0010 + x"11",x"A3",x"1C",x"0E",x"15",x"CD",x"F3",x"08", -- 0x0018 + x"3E",x"0A",x"32",x"6C",x"20",x"01",x"BE",x"1D", -- 0x0020 + x"CD",x"56",x"18",x"DA",x"37",x"18",x"CD",x"44", -- 0x0028 + x"18",x"C3",x"28",x"18",x"CD",x"B1",x"0A",x"01", -- 0x0030 + x"CF",x"1D",x"CD",x"56",x"18",x"D8",x"CD",x"4C", -- 0x0038 + x"18",x"C3",x"3A",x"18",x"C5",x"06",x"10",x"CD", -- 0x0040 + x"39",x"14",x"C1",x"C9",x"C5",x"3A",x"6C",x"20", -- 0x0048 + x"4F",x"CD",x"93",x"0A",x"C1",x"C9",x"0A",x"FE", -- 0x0050 + x"FF",x"37",x"C8",x"6F",x"03",x"0A",x"67",x"03", -- 0x0058 + x"0A",x"5F",x"03",x"0A",x"57",x"03",x"A7",x"C9", -- 0x0060 + x"21",x"C2",x"20",x"34",x"23",x"4E",x"CD",x"D9", -- 0x0068 + x"01",x"47",x"3A",x"CA",x"20",x"B8",x"CA",x"98", -- 0x0070 + x"18",x"3A",x"C2",x"20",x"E6",x"04",x"2A",x"CC", -- 0x0078 + x"20",x"C2",x"88",x"18",x"11",x"30",x"00",x"19", -- 0x0080 + x"22",x"C7",x"20",x"21",x"C5",x"20",x"CD",x"3B", -- 0x0088 + x"1A",x"EB",x"C3",x"D3",x"15",x"00",x"00",x"00", -- 0x0090 + x"3E",x"01",x"32",x"CB",x"20",x"C9",x"21",x"50", -- 0x0098 + x"20",x"11",x"C0",x"1B",x"06",x"10",x"CD",x"32", -- 0x00A0 + x"1A",x"3E",x"02",x"32",x"80",x"20",x"3E",x"FF", -- 0x00A8 + x"32",x"7E",x"20",x"3E",x"04",x"32",x"C1",x"20", -- 0x00B0 + x"3A",x"55",x"20",x"E6",x"01",x"CA",x"B8",x"18", -- 0x00B8 + x"3A",x"55",x"20",x"E6",x"01",x"C2",x"C0",x"18", -- 0x00C0 + x"21",x"11",x"33",x"3E",x"26",x"00",x"CD",x"FF", -- 0x00C8 + x"08",x"C3",x"B6",x"0A",x"31",x"00",x"24",x"06", -- 0x00D0 + x"00",x"CD",x"E6",x"01",x"CD",x"56",x"19",x"3E", -- 0x00D8 + x"08",x"32",x"CF",x"20",x"C3",x"EA",x"0A",x"3A", -- 0x00E0 + x"67",x"20",x"21",x"E7",x"20",x"0F",x"D0",x"23", -- 0x00E8 + x"C9",x"06",x"02",x"3A",x"82",x"20",x"3D",x"C0", -- 0x00F0 + x"04",x"C9",x"3A",x"94",x"20",x"B0",x"32",x"94", -- 0x00F8 + x"20",x"D3",x"03",x"C9",x"21",x"00",x"22",x"C3", -- 0x0100 + x"C3",x"01",x"CD",x"D8",x"14",x"C3",x"97",x"15", -- 0x0108 + x"21",x"E7",x"20",x"3A",x"67",x"20",x"0F",x"D8", -- 0x0110 + x"23",x"C9",x"0E",x"1C",x"21",x"1E",x"24",x"11", -- 0x0118 + x"E4",x"1A",x"C3",x"F3",x"08",x"21",x"F8",x"20", -- 0x0120 + x"C3",x"31",x"19",x"21",x"FC",x"20",x"C3",x"31", -- 0x0128 + x"19",x"5E",x"23",x"56",x"23",x"7E",x"23",x"66", -- 0x0130 + x"6F",x"C3",x"AD",x"09",x"0E",x"07",x"21",x"01", -- 0x0138 + x"35",x"11",x"A9",x"1F",x"C3",x"F3",x"08",x"3A", -- 0x0140 + x"EB",x"20",x"21",x"01",x"3C",x"C3",x"B2",x"09", -- 0x0148 + x"21",x"F4",x"20",x"C3",x"31",x"19",x"CD",x"5C", -- 0x0150 + x"1A",x"CD",x"1A",x"19",x"CD",x"25",x"19",x"CD", -- 0x0158 + x"2B",x"19",x"CD",x"50",x"19",x"CD",x"3C",x"19", -- 0x0160 + x"C3",x"47",x"19",x"CD",x"DC",x"19",x"C3",x"71", -- 0x0168 + x"16",x"3E",x"01",x"32",x"6D",x"20",x"C3",x"E6", -- 0x0170 + x"16",x"CD",x"D7",x"19",x"CD",x"47",x"19",x"C3", -- 0x0178 + x"3C",x"19",x"32",x"C1",x"20",x"C9",x"8B",x"19", -- 0x0180 + x"C3",x"D6",x"09",x"21",x"03",x"28",x"11",x"BE", -- 0x0188 + x"19",x"0E",x"13",x"C3",x"F3",x"08",x"00",x"00", -- 0x0190 + x"00",x"00",x"3A",x"1E",x"20",x"A7",x"C2",x"AC", -- 0x0198 + x"19",x"DB",x"01",x"E6",x"76",x"D6",x"72",x"C0", -- 0x01A0 + x"3C",x"32",x"1E",x"20",x"DB",x"01",x"E6",x"76", -- 0x01A8 + x"FE",x"34",x"C0",x"21",x"1B",x"2E",x"11",x"F7", -- 0x01B0 + x"0B",x"0E",x"09",x"C3",x"F3",x"08",x"28",x"13", -- 0x01B8 + x"00",x"08",x"13",x"0E",x"26",x"02",x"0E",x"11", -- 0x01C0 + x"0F",x"0E",x"11",x"00",x"13",x"08",x"0E",x"0D", -- 0x01C8 + x"28",x"3E",x"01",x"32",x"E9",x"20",x"C9",x"AF", -- 0x01D0 + x"C3",x"D3",x"19",x"00",x"3A",x"94",x"20",x"A0", -- 0x01D8 + x"32",x"94",x"20",x"D3",x"03",x"C9",x"21",x"01", -- 0x01E0 + x"27",x"CA",x"FA",x"19",x"11",x"60",x"1C",x"06", -- 0x01E8 + x"10",x"4F",x"CD",x"39",x"14",x"79",x"3D",x"C2", -- 0x01F0 + x"EC",x"19",x"06",x"10",x"CD",x"CB",x"14",x"7C", -- 0x01F8 + x"FE",x"35",x"C2",x"FA",x"19",x"C9",x"21",x"72", -- 0x0200 + x"20",x"46",x"1A",x"E6",x"80",x"A8",x"C0",x"37", -- 0x0208 + x"C9",x"32",x"2B",x"24",x"1C",x"16",x"11",x"0D", -- 0x0210 + x"0A",x"08",x"07",x"06",x"05",x"04",x"03",x"02", -- 0x0218 + x"01",x"34",x"2E",x"27",x"22",x"1C",x"18",x"15", -- 0x0220 + x"13",x"10",x"0E",x"0D",x"0C",x"0B",x"09",x"07", -- 0x0228 + x"05",x"FF",x"1A",x"77",x"23",x"13",x"05",x"C2", -- 0x0230 + x"32",x"1A",x"C9",x"5E",x"23",x"56",x"23",x"7E", -- 0x0238 + x"23",x"4E",x"23",x"46",x"61",x"6F",x"C9",x"C5", -- 0x0240 + x"06",x"03",x"7C",x"1F",x"67",x"7D",x"1F",x"6F", -- 0x0248 + x"05",x"C2",x"4A",x"1A",x"7C",x"E6",x"3F",x"F6", -- 0x0250 + x"20",x"67",x"C1",x"C9",x"21",x"00",x"24",x"36", -- 0x0258 + x"00",x"23",x"7C",x"FE",x"40",x"C2",x"5F",x"1A", -- 0x0260 + x"C9",x"C5",x"E5",x"1A",x"B6",x"77",x"13",x"23", -- 0x0268 + x"0D",x"C2",x"6B",x"1A",x"E1",x"01",x"20",x"00", -- 0x0270 + x"09",x"C1",x"05",x"C2",x"69",x"1A",x"C9",x"CD", -- 0x0278 + x"2E",x"09",x"A7",x"C8",x"F5",x"3D",x"77",x"CD", -- 0x0280 + x"E6",x"19",x"F1",x"21",x"01",x"25",x"E6",x"0F", -- 0x0288 + x"C3",x"C5",x"09",x"00",x"00",x"00",x"00",x"FF", -- 0x0290 + x"B8",x"FE",x"20",x"1C",x"10",x"9E",x"00",x"20", -- 0x0298 + x"1C",x"30",x"10",x"0B",x"08",x"07",x"06",x"00", -- 0x02A0 + x"0C",x"04",x"26",x"0E",x"15",x"04",x"11",x"26", -- 0x02A8 + x"26",x"0F",x"0B",x"00",x"18",x"04",x"11",x"24", -- 0x02B0 + x"26",x"25",x"1B",x"26",x"0E",x"11",x"26",x"1C", -- 0x02B8 + x"0F",x"0B",x"00",x"18",x"04",x"11",x"12",x"26", -- 0x02C0 + x"01",x"14",x"13",x"13",x"0E",x"0D",x"26",x"0E", -- 0x02C8 + x"0D",x"0B",x"18",x"26",x"1B",x"0F",x"0B",x"00", -- 0x02D0 + x"18",x"04",x"11",x"26",x"26",x"01",x"14",x"13", -- 0x02D8 + x"13",x"0E",x"0D",x"26",x"26",x"12",x"02",x"0E", -- 0x02E0 + x"11",x"04",x"24",x"1B",x"25",x"26",x"07",x"08", -- 0x02E8 + x"3F",x"12",x"02",x"0E",x"11",x"04",x"26",x"12", -- 0x02F0 + x"02",x"0E",x"11",x"04",x"24",x"1C",x"25",x"26", -- 0x02F8 + x"01",x"00",x"00",x"10",x"00",x"00",x"00",x"00", -- 0x0300 + x"02",x"78",x"38",x"78",x"38",x"00",x"F8",x"00", -- 0x0308 + x"00",x"80",x"00",x"8E",x"02",x"FF",x"05",x"0C", -- 0x0310 + x"60",x"1C",x"20",x"30",x"10",x"01",x"00",x"00", -- 0x0318 + x"00",x"00",x"00",x"BB",x"03",x"00",x"10",x"90", -- 0x0320 + x"1C",x"28",x"30",x"01",x"04",x"00",x"FF",x"FF", -- 0x0328 + x"00",x"00",x"02",x"76",x"04",x"00",x"00",x"00", -- 0x0330 + x"00",x"00",x"04",x"EE",x"1C",x"00",x"00",x"03", -- 0x0338 + x"00",x"00",x"00",x"B6",x"04",x"00",x"00",x"01", -- 0x0340 + x"00",x"1D",x"04",x"E2",x"1C",x"00",x"00",x"03", -- 0x0348 + x"00",x"00",x"00",x"82",x"06",x"00",x"00",x"01", -- 0x0350 + x"06",x"1D",x"04",x"D0",x"1C",x"00",x"00",x"03", -- 0x0358 + x"FF",x"00",x"C0",x"1C",x"00",x"00",x"10",x"21", -- 0x0360 + x"01",x"00",x"30",x"00",x"12",x"00",x"00",x"00", -- 0x0368 + x"0F",x"0B",x"00",x"18",x"26",x"0F",x"0B",x"00", -- 0x0370 + x"18",x"04",x"11",x"24",x"1B",x"25",x"FC",x"00", -- 0x0378 + x"01",x"FF",x"FF",x"00",x"00",x"00",x"20",x"64", -- 0x0380 + x"1D",x"D0",x"29",x"18",x"02",x"54",x"1D",x"00", -- 0x0388 + x"08",x"00",x"06",x"00",x"00",x"01",x"40",x"00", -- 0x0390 + x"01",x"00",x"00",x"10",x"9E",x"00",x"20",x"1C", -- 0x0398 + x"00",x"03",x"04",x"78",x"14",x"13",x"08",x"1A", -- 0x03A0 + x"3D",x"68",x"FC",x"FC",x"68",x"3D",x"1A",x"00", -- 0x03A8 + x"00",x"00",x"01",x"B8",x"98",x"A0",x"1B",x"10", -- 0x03B0 + x"FF",x"00",x"A0",x"1B",x"00",x"00",x"00",x"00", -- 0x03B8 + x"00",x"10",x"00",x"0E",x"05",x"00",x"00",x"00", -- 0x03C0 + x"00",x"00",x"07",x"D0",x"1C",x"C8",x"9B",x"03", -- 0x03C8 + x"00",x"00",x"03",x"04",x"78",x"14",x"0B",x"19", -- 0x03D0 + x"3A",x"6D",x"FA",x"FA",x"6D",x"3A",x"19",x"00", -- 0x03D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E0 + x"00",x"01",x"00",x"00",x"01",x"74",x"1F",x"00", -- 0x03E8 + x"80",x"00",x"00",x"00",x"00",x"00",x"1C",x"2F", -- 0x03F0 + x"00",x"00",x"1C",x"27",x"00",x"00",x"1C",x"39", -- 0x03F8 + x"00",x"00",x"39",x"79",x"7A",x"6E",x"EC",x"FA", -- 0x0400 + x"FA",x"EC",x"6E",x"7A",x"79",x"39",x"00",x"00", -- 0x0408 + x"00",x"00",x"00",x"78",x"1D",x"BE",x"6C",x"3C", -- 0x0410 + x"3C",x"3C",x"6C",x"BE",x"1D",x"78",x"00",x"00", -- 0x0418 + x"00",x"00",x"00",x"00",x"19",x"3A",x"6D",x"FA", -- 0x0420 + x"FA",x"6D",x"3A",x"19",x"00",x"00",x"00",x"00", -- 0x0428 + x"00",x"00",x"38",x"7A",x"7F",x"6D",x"EC",x"FA", -- 0x0430 + x"FA",x"EC",x"6D",x"7F",x"7A",x"38",x"00",x"00", -- 0x0438 + x"00",x"00",x"00",x"0E",x"18",x"BE",x"6D",x"3D", -- 0x0440 + x"3C",x"3D",x"6D",x"BE",x"18",x"0E",x"00",x"00", -- 0x0448 + x"00",x"00",x"00",x"00",x"1A",x"3D",x"68",x"FC", -- 0x0450 + x"FC",x"68",x"3D",x"1A",x"00",x"00",x"00",x"00", -- 0x0458 + x"00",x"00",x"0F",x"1F",x"1F",x"1F",x"1F",x"7F", -- 0x0460 + x"FF",x"7F",x"1F",x"1F",x"1F",x"1F",x"0F",x"00", -- 0x0468 + x"00",x"04",x"01",x"13",x"03",x"07",x"B3",x"0F", -- 0x0470 + x"2F",x"03",x"2F",x"49",x"04",x"03",x"00",x"01", -- 0x0478 + x"40",x"08",x"05",x"A3",x"0A",x"03",x"5B",x"0F", -- 0x0480 + x"27",x"27",x"0B",x"4B",x"40",x"84",x"11",x"48", -- 0x0488 + x"0F",x"99",x"3C",x"7E",x"3D",x"BC",x"3E",x"7C", -- 0x0490 + x"99",x"27",x"1B",x"1A",x"26",x"0F",x"0E",x"08", -- 0x0498 + x"0D",x"13",x"12",x"28",x"12",x"02",x"0E",x"11", -- 0x04A0 + x"04",x"26",x"00",x"03",x"15",x"00",x"0D",x"02", -- 0x04A8 + x"04",x"26",x"13",x"00",x"01",x"0B",x"04",x"28", -- 0x04B0 + x"02",x"10",x"20",x"30",x"13",x"08",x"0B",x"13", -- 0x04B8 + x"00",x"08",x"49",x"22",x"14",x"81",x"42",x"00", -- 0x04C0 + x"42",x"81",x"14",x"22",x"49",x"08",x"00",x"00", -- 0x04C8 + x"44",x"AA",x"10",x"88",x"54",x"22",x"10",x"AA", -- 0x04D0 + x"44",x"22",x"54",x"88",x"4A",x"15",x"BE",x"3F", -- 0x04D8 + x"5E",x"25",x"04",x"FC",x"04",x"10",x"FC",x"10", -- 0x04E0 + x"20",x"FC",x"20",x"80",x"FC",x"80",x"00",x"FE", -- 0x04E8 + x"00",x"24",x"FE",x"12",x"00",x"FE",x"00",x"48", -- 0x04F0 + x"FE",x"90",x"0F",x"0B",x"00",x"29",x"00",x"00", -- 0x04F8 + x"01",x"07",x"01",x"01",x"01",x"04",x"0B",x"01", -- 0x0500 + x"06",x"03",x"01",x"01",x"0B",x"09",x"02",x"08", -- 0x0508 + x"02",x"0B",x"04",x"07",x"0A",x"05",x"02",x"05", -- 0x0510 + x"04",x"06",x"07",x"08",x"0A",x"06",x"0A",x"03", -- 0x0518 + x"FF",x"0F",x"FF",x"1F",x"FF",x"3F",x"FF",x"7F", -- 0x0520 + x"FF",x"FF",x"FC",x"FF",x"F8",x"FF",x"F0",x"FF", -- 0x0528 + x"F0",x"FF",x"F0",x"FF",x"F0",x"FF",x"F0",x"FF", -- 0x0530 + x"F0",x"FF",x"F0",x"FF",x"F8",x"FF",x"FC",x"FF", -- 0x0538 + x"FF",x"FF",x"FF",x"FF",x"FF",x"7F",x"FF",x"3F", -- 0x0540 + x"FF",x"1F",x"FF",x"0F",x"05",x"10",x"15",x"30", -- 0x0548 + x"94",x"97",x"9A",x"9D",x"10",x"05",x"05",x"10", -- 0x0550 + x"15",x"10",x"10",x"05",x"30",x"10",x"10",x"10", -- 0x0558 + x"05",x"15",x"10",x"05",x"00",x"00",x"00",x"00", -- 0x0560 + x"04",x"0C",x"1E",x"37",x"3E",x"7C",x"74",x"7E", -- 0x0568 + x"7E",x"74",x"7C",x"3E",x"37",x"1E",x"0C",x"04", -- 0x0570 + x"00",x"00",x"00",x"00",x"00",x"22",x"00",x"A5", -- 0x0578 + x"40",x"08",x"98",x"3D",x"B6",x"3C",x"36",x"1D", -- 0x0580 + x"10",x"48",x"62",x"B6",x"1D",x"98",x"08",x"42", -- 0x0588 + x"90",x"08",x"00",x"00",x"26",x"1F",x"1A",x"1B", -- 0x0590 + x"1A",x"1A",x"1B",x"1F",x"1A",x"1D",x"1A",x"1A", -- 0x0598 + x"10",x"20",x"30",x"60",x"50",x"48",x"48",x"48", -- 0x05A0 + x"40",x"40",x"40",x"0F",x"0B",x"00",x"18",x"12", -- 0x05A8 + x"0F",x"00",x"02",x"04",x"26",x"26",x"08",x"0D", -- 0x05B0 + x"15",x"00",x"03",x"04",x"11",x"12",x"0E",x"2C", -- 0x05B8 + x"68",x"1D",x"0C",x"2C",x"20",x"1C",x"0A",x"2C", -- 0x05C0 + x"40",x"1C",x"08",x"2C",x"00",x"1C",x"FF",x"0E", -- 0x05C8 + x"2E",x"E0",x"1D",x"0C",x"2E",x"EA",x"1D",x"0A", -- 0x05D0 + x"2E",x"F4",x"1D",x"08",x"2E",x"99",x"1C",x"FF", -- 0x05D8 + x"27",x"38",x"26",x"0C",x"18",x"12",x"13",x"04", -- 0x05E0 + x"11",x"18",x"27",x"1D",x"1A",x"26",x"0F",x"0E", -- 0x05E8 + x"08",x"0D",x"13",x"12",x"27",x"1C",x"1A",x"26", -- 0x05F0 + x"0F",x"0E",x"08",x"0D",x"13",x"12",x"00",x"00", -- 0x05F8 + x"00",x"1F",x"24",x"44",x"24",x"1F",x"00",x"00", -- 0x0600 + x"00",x"7F",x"49",x"49",x"49",x"36",x"00",x"00", -- 0x0608 + x"00",x"3E",x"41",x"41",x"41",x"22",x"00",x"00", -- 0x0610 + x"00",x"7F",x"41",x"41",x"41",x"3E",x"00",x"00", -- 0x0618 + x"00",x"7F",x"49",x"49",x"49",x"41",x"00",x"00", -- 0x0620 + x"00",x"7F",x"48",x"48",x"48",x"40",x"00",x"00", -- 0x0628 + x"00",x"3E",x"41",x"41",x"45",x"47",x"00",x"00", -- 0x0630 + x"00",x"7F",x"08",x"08",x"08",x"7F",x"00",x"00", -- 0x0638 + x"00",x"00",x"41",x"7F",x"41",x"00",x"00",x"00", -- 0x0640 + x"00",x"02",x"01",x"01",x"01",x"7E",x"00",x"00", -- 0x0648 + x"00",x"7F",x"08",x"14",x"22",x"41",x"00",x"00", -- 0x0650 + x"00",x"7F",x"01",x"01",x"01",x"01",x"00",x"00", -- 0x0658 + x"00",x"7F",x"20",x"18",x"20",x"7F",x"00",x"00", -- 0x0660 + x"00",x"7F",x"10",x"08",x"04",x"7F",x"00",x"00", -- 0x0668 + x"00",x"3E",x"41",x"41",x"41",x"3E",x"00",x"00", -- 0x0670 + x"00",x"7F",x"48",x"48",x"48",x"30",x"00",x"00", -- 0x0678 + x"00",x"3E",x"41",x"45",x"42",x"3D",x"00",x"00", -- 0x0680 + x"00",x"7F",x"48",x"4C",x"4A",x"31",x"00",x"00", -- 0x0688 + x"00",x"32",x"49",x"49",x"49",x"26",x"00",x"00", -- 0x0690 + x"00",x"40",x"40",x"7F",x"40",x"40",x"00",x"00", -- 0x0698 + x"00",x"7E",x"01",x"01",x"01",x"7E",x"00",x"00", -- 0x06A0 + x"00",x"7C",x"02",x"01",x"02",x"7C",x"00",x"00", -- 0x06A8 + x"00",x"7F",x"02",x"0C",x"02",x"7F",x"00",x"00", -- 0x06B0 + x"00",x"63",x"14",x"08",x"14",x"63",x"00",x"00", -- 0x06B8 + x"00",x"60",x"10",x"0F",x"10",x"60",x"00",x"00", -- 0x06C0 + x"00",x"43",x"45",x"49",x"51",x"61",x"00",x"00", -- 0x06C8 + x"00",x"3E",x"45",x"49",x"51",x"3E",x"00",x"00", -- 0x06D0 + x"00",x"00",x"21",x"7F",x"01",x"00",x"00",x"00", -- 0x06D8 + x"00",x"23",x"45",x"49",x"49",x"31",x"00",x"00", -- 0x06E0 + x"00",x"42",x"41",x"49",x"59",x"66",x"00",x"00", -- 0x06E8 + x"00",x"0C",x"14",x"24",x"7F",x"04",x"00",x"00", -- 0x06F0 + x"00",x"72",x"51",x"51",x"51",x"4E",x"00",x"00", -- 0x06F8 + x"00",x"1E",x"29",x"49",x"49",x"46",x"00",x"00", -- 0x0700 + x"00",x"40",x"47",x"48",x"50",x"60",x"00",x"00", -- 0x0708 + x"00",x"36",x"49",x"49",x"49",x"36",x"00",x"00", -- 0x0710 + x"00",x"31",x"49",x"49",x"4A",x"3C",x"00",x"00", -- 0x0718 + x"00",x"08",x"14",x"22",x"41",x"00",x"00",x"00", -- 0x0720 + x"00",x"00",x"41",x"22",x"14",x"08",x"00",x"00", -- 0x0728 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0730 + x"00",x"14",x"14",x"14",x"14",x"14",x"00",x"00", -- 0x0738 + x"00",x"22",x"14",x"7F",x"14",x"22",x"00",x"00", -- 0x0740 + x"00",x"03",x"04",x"78",x"04",x"03",x"00",x"00", -- 0x0748 + x"24",x"1B",x"26",x"0E",x"11",x"26",x"1C",x"26", -- 0x0750 + x"0F",x"0B",x"00",x"18",x"04",x"11",x"12",x"25", -- 0x0758 + x"26",x"26",x"28",x"1B",x"26",x"0F",x"0B",x"00", -- 0x0760 + x"18",x"04",x"11",x"26",x"26",x"1B",x"26",x"02", -- 0x0768 + x"0E",x"08",x"0D",x"26",x"01",x"01",x"00",x"00", -- 0x0770 + x"01",x"00",x"02",x"01",x"00",x"02",x"01",x"00", -- 0x0778 + x"60",x"10",x"0F",x"10",x"60",x"30",x"18",x"1A", -- 0x0780 + x"3D",x"68",x"FC",x"FC",x"68",x"3D",x"1A",x"00", -- 0x0788 + x"08",x"0D",x"12",x"04",x"11",x"13",x"26",x"26", -- 0x0790 + x"02",x"0E",x"08",x"0D",x"0D",x"2A",x"50",x"1F", -- 0x0798 + x"0A",x"2A",x"62",x"1F",x"07",x"2A",x"E1",x"1F", -- 0x07A0 + x"FF",x"02",x"11",x"04",x"03",x"08",x"13",x"26", -- 0x07A8 + x"00",x"60",x"10",x"0F",x"10",x"60",x"38",x"19", -- 0x07B0 + x"3A",x"6D",x"FA",x"FA",x"6D",x"3A",x"19",x"00", -- 0x07B8 + x"00",x"20",x"40",x"4D",x"50",x"20",x"00",x"00", -- 0x07C0 + x"00",x"00",x"00",x"FF",x"B8",x"FF",x"80",x"1F", -- 0x07C8 + x"10",x"97",x"00",x"80",x"1F",x"00",x"00",x"01", -- 0x07D0 + x"D0",x"22",x"20",x"1C",x"10",x"94",x"00",x"20", -- 0x07D8 + x"1C",x"28",x"1C",x"26",x"0F",x"0B",x"00",x"18", -- 0x07E0 + x"04",x"11",x"12",x"26",x"1C",x"26",x"02",x"0E", -- 0x07E8 + x"08",x"0D",x"12",x"0F",x"14",x"12",x"07",x"26", -- 0x07F0 + x"00",x"08",x"08",x"08",x"08",x"08",x"00",x"00" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + DATA <= ROM(to_integer(unsigned(ADDR))); + end if; + end process; +end RTL; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_rom_f.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_rom_f.vhd new file mode 100644 index 00000000..01bf33e4 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_rom_f.vhd @@ -0,0 +1,288 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity INVADERS_ROM_F is + port ( + CLK : in std_logic; + ENA : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of INVADERS_ROM_F is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0000 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0008 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0010 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0018 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0020 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0028 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0030 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0038 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0040 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0048 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0050 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0058 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0060 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0068 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0070 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0088 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0090 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0098 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0100 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0108 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0110 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0118 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0120 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0128 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0130 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0138 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0140 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0148 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0150 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0190 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0200 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0208 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0210 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0218 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0220 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0228 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0230 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0238 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0240 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0248 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0250 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0270 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0290 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0298 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0300 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0308 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0310 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0318 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0320 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0328 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0330 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0338 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0340 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0348 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0350 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0358 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0360 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0368 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0378 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0380 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0388 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0390 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0398 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F8 + x"00",x"CD",x"74",x"14",x"00",x"C5",x"E5",x"1A", -- 0x0400 + x"D3",x"04",x"DB",x"03",x"B6",x"77",x"23",x"13", -- 0x0408 + x"AF",x"D3",x"04",x"DB",x"03",x"B6",x"77",x"E1", -- 0x0410 + x"01",x"20",x"00",x"09",x"C1",x"05",x"C2",x"05", -- 0x0418 + x"14",x"C9",x"00",x"00",x"CD",x"74",x"14",x"C5", -- 0x0420 + x"E5",x"AF",x"77",x"23",x"77",x"23",x"E1",x"01", -- 0x0428 + x"20",x"00",x"09",x"C1",x"05",x"C2",x"27",x"14", -- 0x0430 + x"C9",x"C5",x"1A",x"77",x"13",x"01",x"20",x"00", -- 0x0438 + x"09",x"C1",x"05",x"C2",x"39",x"14",x"C9",x"00", -- 0x0440 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0448 + x"00",x"00",x"CD",x"74",x"14",x"C5",x"E5",x"1A", -- 0x0450 + x"D3",x"04",x"DB",x"03",x"2F",x"A6",x"77",x"23", -- 0x0458 + x"13",x"AF",x"D3",x"04",x"DB",x"03",x"2F",x"A6", -- 0x0460 + x"77",x"E1",x"01",x"20",x"00",x"09",x"C1",x"05", -- 0x0468 + x"C2",x"55",x"14",x"C9",x"7D",x"E6",x"07",x"D3", -- 0x0470 + x"02",x"C3",x"47",x"1A",x"C5",x"E5",x"7E",x"12", -- 0x0478 + x"13",x"23",x"0D",x"C2",x"7E",x"14",x"E1",x"01", -- 0x0480 + x"20",x"00",x"09",x"C1",x"05",x"C2",x"7C",x"14", -- 0x0488 + x"C9",x"CD",x"74",x"14",x"AF",x"32",x"61",x"20", -- 0x0490 + x"C5",x"E5",x"1A",x"D3",x"04",x"DB",x"03",x"F5", -- 0x0498 + x"A6",x"CA",x"A9",x"14",x"3E",x"01",x"32",x"61", -- 0x04A0 + x"20",x"F1",x"B6",x"77",x"23",x"13",x"AF",x"D3", -- 0x04A8 + x"04",x"DB",x"03",x"F5",x"A6",x"CA",x"BD",x"14", -- 0x04B0 + x"3E",x"01",x"32",x"61",x"20",x"F1",x"B6",x"77", -- 0x04B8 + x"E1",x"01",x"20",x"00",x"09",x"C1",x"05",x"C2", -- 0x04C0 + x"98",x"14",x"C9",x"AF",x"C5",x"77",x"01",x"20", -- 0x04C8 + x"00",x"09",x"C1",x"05",x"C2",x"CC",x"14",x"C9", -- 0x04D0 + x"3A",x"25",x"20",x"FE",x"05",x"C8",x"FE",x"02", -- 0x04D8 + x"C0",x"3A",x"29",x"20",x"FE",x"D8",x"47",x"D2", -- 0x04E0 + x"30",x"15",x"3A",x"02",x"20",x"A7",x"C8",x"78", -- 0x04E8 + x"FE",x"CE",x"D2",x"79",x"15",x"C6",x"06",x"47", -- 0x04F0 + x"3A",x"09",x"20",x"FE",x"90",x"D2",x"04",x"15", -- 0x04F8 + x"B8",x"D2",x"30",x"15",x"68",x"CD",x"62",x"15", -- 0x0500 + x"3A",x"2A",x"20",x"67",x"CD",x"6F",x"15",x"22", -- 0x0508 + x"64",x"20",x"3E",x"05",x"32",x"25",x"20",x"CD", -- 0x0510 + x"81",x"15",x"7E",x"A7",x"CA",x"30",x"15",x"36", -- 0x0518 + x"00",x"CD",x"5F",x"0A",x"CD",x"3B",x"1A",x"CD", -- 0x0520 + x"D3",x"15",x"3E",x"10",x"32",x"03",x"20",x"C9", -- 0x0528 + x"3E",x"03",x"32",x"25",x"20",x"C3",x"4A",x"15", -- 0x0530 + x"21",x"03",x"20",x"35",x"C0",x"2A",x"64",x"20", -- 0x0538 + x"06",x"10",x"CD",x"24",x"14",x"3E",x"04",x"32", -- 0x0540 + x"25",x"20",x"AF",x"32",x"02",x"20",x"06",x"F7", -- 0x0548 + x"C3",x"DC",x"19",x"00",x"0E",x"00",x"BC",x"D4", -- 0x0550 + x"90",x"15",x"BC",x"D0",x"C6",x"10",x"0C",x"C3", -- 0x0558 + x"5A",x"15",x"3A",x"09",x"20",x"65",x"CD",x"54", -- 0x0560 + x"15",x"41",x"05",x"DE",x"10",x"6F",x"C9",x"3A", -- 0x0568 + x"0A",x"20",x"CD",x"54",x"15",x"DE",x"10",x"67", -- 0x0570 + x"C9",x"3E",x"01",x"32",x"85",x"20",x"C3",x"45", -- 0x0578 + x"15",x"78",x"07",x"07",x"07",x"80",x"80",x"80", -- 0x0580 + x"81",x"3D",x"6F",x"3A",x"67",x"20",x"67",x"C9", -- 0x0588 + x"0C",x"C6",x"10",x"FA",x"90",x"15",x"C9",x"3A", -- 0x0590 + x"0D",x"20",x"A7",x"C2",x"B7",x"15",x"21",x"A4", -- 0x0598 + x"3E",x"CD",x"C5",x"15",x"D0",x"06",x"FE",x"3E", -- 0x05A0 + x"01",x"32",x"0D",x"20",x"78",x"32",x"08",x"20", -- 0x05A8 + x"3A",x"0E",x"20",x"32",x"07",x"20",x"C9",x"21", -- 0x05B0 + x"24",x"25",x"CD",x"C5",x"15",x"D0",x"CD",x"F1", -- 0x05B8 + x"18",x"AF",x"C3",x"A9",x"15",x"06",x"17",x"7E", -- 0x05C0 + x"A7",x"C2",x"6B",x"16",x"23",x"05",x"C2",x"C7", -- 0x05C8 + x"15",x"C9",x"00",x"CD",x"74",x"14",x"E5",x"C5", -- 0x05D0 + x"E5",x"1A",x"D3",x"04",x"DB",x"03",x"77",x"23", -- 0x05D8 + x"13",x"AF",x"D3",x"04",x"DB",x"03",x"77",x"E1", -- 0x05E0 + x"01",x"20",x"00",x"09",x"C1",x"05",x"C2",x"D7", -- 0x05E8 + x"15",x"E1",x"C9",x"CD",x"11",x"16",x"01",x"00", -- 0x05F0 + x"37",x"7E",x"A7",x"CA",x"FF",x"15",x"0C",x"23", -- 0x05F8 + x"05",x"C2",x"F9",x"15",x"79",x"32",x"82",x"20", -- 0x0600 + x"FE",x"01",x"C0",x"21",x"6B",x"20",x"36",x"01", -- 0x0608 + x"C9",x"2E",x"00",x"3A",x"67",x"20",x"67",x"C9", -- 0x0610 + x"3A",x"15",x"20",x"FE",x"FF",x"C0",x"21",x"10", -- 0x0618 + x"20",x"7E",x"23",x"46",x"B0",x"C0",x"3A",x"25", -- 0x0620 + x"20",x"A7",x"C0",x"3A",x"EF",x"20",x"A7",x"CA", -- 0x0628 + x"52",x"16",x"3A",x"2D",x"20",x"A7",x"C2",x"48", -- 0x0630 + x"16",x"CD",x"C0",x"17",x"E6",x"10",x"C8",x"3E", -- 0x0638 + x"01",x"32",x"25",x"20",x"32",x"2D",x"20",x"C9", -- 0x0640 + x"CD",x"C0",x"17",x"E6",x"10",x"C0",x"32",x"2D", -- 0x0648 + x"20",x"C9",x"21",x"25",x"20",x"36",x"01",x"2A", -- 0x0650 + x"ED",x"20",x"23",x"7D",x"FE",x"7E",x"DA",x"63", -- 0x0658 + x"16",x"2E",x"74",x"22",x"ED",x"20",x"7E",x"32", -- 0x0660 + x"1D",x"20",x"C9",x"37",x"C9",x"AF",x"CD",x"8B", -- 0x0668 + x"1A",x"CD",x"10",x"19",x"36",x"00",x"CD",x"CA", -- 0x0670 + x"09",x"23",x"11",x"F5",x"20",x"1A",x"BE",x"1B", -- 0x0678 + x"2B",x"1A",x"CA",x"8B",x"16",x"D2",x"98",x"16", -- 0x0680 + x"C3",x"8F",x"16",x"BE",x"D2",x"98",x"16",x"7E", -- 0x0688 + x"12",x"13",x"23",x"7E",x"12",x"CD",x"50",x"19", -- 0x0690 + x"3A",x"CE",x"20",x"A7",x"CA",x"C9",x"16",x"21", -- 0x0698 + x"03",x"28",x"11",x"A6",x"1A",x"0E",x"14",x"CD", -- 0x06A0 + x"93",x"0A",x"25",x"25",x"06",x"1B",x"3A",x"67", -- 0x06A8 + x"20",x"0F",x"DA",x"B7",x"16",x"06",x"1C",x"78", -- 0x06B0 + x"CD",x"FF",x"08",x"CD",x"B1",x"0A",x"CD",x"E7", -- 0x06B8 + x"18",x"7E",x"A7",x"CA",x"C9",x"16",x"C3",x"ED", -- 0x06C0 + x"02",x"21",x"18",x"2D",x"11",x"A6",x"1A",x"0E", -- 0x06C8 + x"0A",x"CD",x"93",x"0A",x"CD",x"B6",x"0A",x"CD", -- 0x06D0 + x"D6",x"09",x"AF",x"32",x"EF",x"20",x"D3",x"05", -- 0x06D8 + x"CD",x"D1",x"19",x"C3",x"89",x"0B",x"31",x"00", -- 0x06E0 + x"24",x"FB",x"AF",x"32",x"15",x"20",x"CD",x"D8", -- 0x06E8 + x"14",x"06",x"04",x"CD",x"FA",x"18",x"CD",x"59", -- 0x06F0 + x"0A",x"C2",x"EE",x"16",x"CD",x"D7",x"19",x"21", -- 0x06F8 + x"01",x"27",x"CD",x"FA",x"19",x"AF",x"CD",x"8B", -- 0x0700 + x"1A",x"06",x"FB",x"C3",x"6B",x"19",x"CD",x"CA", -- 0x0708 + x"09",x"23",x"7E",x"11",x"B8",x"1C",x"21",x"A1", -- 0x0710 + x"1A",x"0E",x"04",x"47",x"1A",x"B8",x"D2",x"27", -- 0x0718 + x"17",x"23",x"13",x"0D",x"C2",x"1C",x"17",x"7E", -- 0x0720 + x"32",x"CF",x"20",x"C9",x"3A",x"25",x"20",x"FE", -- 0x0728 + x"00",x"C2",x"39",x"17",x"06",x"FD",x"C3",x"DC", -- 0x0730 + x"19",x"06",x"02",x"C3",x"FA",x"18",x"00",x"00", -- 0x0738 + x"21",x"9B",x"20",x"35",x"CC",x"6D",x"17",x"3A", -- 0x0740 + x"68",x"20",x"A7",x"CA",x"6D",x"17",x"21",x"96", -- 0x0748 + x"20",x"35",x"C0",x"21",x"98",x"20",x"7E",x"D3", -- 0x0750 + x"05",x"3A",x"82",x"20",x"A7",x"CA",x"6D",x"17", -- 0x0758 + x"2B",x"7E",x"2B",x"77",x"2B",x"36",x"01",x"3E", -- 0x0760 + x"04",x"32",x"9B",x"20",x"C9",x"3A",x"98",x"20", -- 0x0768 + x"E6",x"30",x"D3",x"05",x"C9",x"3A",x"95",x"20", -- 0x0770 + x"A7",x"CA",x"AA",x"17",x"21",x"11",x"1A",x"11", -- 0x0778 + x"21",x"1A",x"3A",x"82",x"20",x"BE",x"D2",x"8E", -- 0x0780 + x"17",x"23",x"13",x"C3",x"85",x"17",x"1A",x"32", -- 0x0788 + x"97",x"20",x"21",x"98",x"20",x"7E",x"E6",x"30", -- 0x0790 + x"47",x"7E",x"E6",x"0F",x"07",x"FE",x"10",x"C2", -- 0x0798 + x"A4",x"17",x"3E",x"01",x"B0",x"77",x"AF",x"32", -- 0x07A0 + x"95",x"20",x"21",x"99",x"20",x"35",x"C0",x"06", -- 0x07A8 + x"EF",x"C3",x"DC",x"19",x"06",x"EF",x"21",x"98", -- 0x07B0 + x"20",x"7E",x"A0",x"77",x"D3",x"05",x"C9",x"00", -- 0x07B8 + x"3A",x"67",x"20",x"0F",x"D2",x"CA",x"17",x"DB", -- 0x07C0 + x"01",x"C9",x"DB",x"02",x"C9",x"DB",x"02",x"E6", -- 0x07C8 + x"04",x"C8",x"3A",x"9A",x"20",x"A7",x"C0",x"31", -- 0x07D0 + x"00",x"24",x"06",x"04",x"CD",x"D6",x"09",x"05", -- 0x07D8 + x"C2",x"DC",x"17",x"3E",x"01",x"32",x"9A",x"20", -- 0x07E0 + x"CD",x"D7",x"19",x"FB",x"11",x"BC",x"1C",x"21", -- 0x07E8 + x"16",x"30",x"0E",x"04",x"CD",x"93",x"0A",x"CD", -- 0x07F0 + x"B1",x"0A",x"AF",x"32",x"9A",x"20",x"32",x"93" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + DATA <= ROM(to_integer(unsigned(ADDR))); + end if; + end process; +end RTL; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_rom_g.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_rom_g.vhd new file mode 100644 index 00000000..2cdc5141 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_rom_g.vhd @@ -0,0 +1,288 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity INVADERS_ROM_G is + port ( + CLK : in std_logic; + ENA : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of INVADERS_ROM_G is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"AF",x"32",x"C1",x"20",x"CD",x"CF",x"01",x"3A", -- 0x0000 + x"67",x"20",x"0F",x"DA",x"72",x"08",x"CD",x"13", -- 0x0008 + x"02",x"CD",x"CF",x"01",x"CD",x"B1",x"00",x"CD", -- 0x0010 + x"D1",x"19",x"06",x"20",x"CD",x"FA",x"18",x"CD", -- 0x0018 + x"18",x"16",x"CD",x"0A",x"19",x"CD",x"F3",x"15", -- 0x0020 + x"CD",x"88",x"09",x"3A",x"82",x"20",x"A7",x"CA", -- 0x0028 + x"EF",x"09",x"CD",x"0E",x"17",x"CD",x"35",x"09", -- 0x0030 + x"CD",x"D8",x"08",x"CD",x"2C",x"17",x"CD",x"59", -- 0x0038 + x"0A",x"CA",x"49",x"08",x"06",x"04",x"CD",x"FA", -- 0x0040 + x"18",x"CD",x"75",x"17",x"D3",x"06",x"CD",x"04", -- 0x0048 + x"18",x"C3",x"1F",x"08",x"00",x"00",x"00",x"11", -- 0x0050 + x"BA",x"1A",x"CD",x"F3",x"08",x"06",x"98",x"DB", -- 0x0058 + x"01",x"0F",x"0F",x"DA",x"6D",x"08",x"0F",x"DA", -- 0x0060 + x"98",x"07",x"C3",x"7F",x"07",x"3E",x"01",x"C3", -- 0x0068 + x"9B",x"07",x"CD",x"1A",x"02",x"C3",x"14",x"08", -- 0x0070 + x"3A",x"08",x"20",x"47",x"2A",x"09",x"20",x"EB", -- 0x0078 + x"C3",x"86",x"08",x"00",x"00",x"00",x"3A",x"67", -- 0x0080 + x"20",x"67",x"2E",x"FC",x"C9",x"21",x"11",x"2B", -- 0x0088 + x"11",x"70",x"1B",x"0E",x"0E",x"CD",x"F3",x"08", -- 0x0090 + x"3A",x"67",x"20",x"0F",x"3E",x"1C",x"21",x"11", -- 0x0098 + x"37",x"D4",x"FF",x"08",x"3E",x"B0",x"32",x"C0", -- 0x00A0 + x"20",x"3A",x"C0",x"20",x"A7",x"C8",x"E6",x"04", -- 0x00A8 + x"C2",x"BC",x"08",x"CD",x"CA",x"09",x"CD",x"31", -- 0x00B0 + x"19",x"C3",x"A9",x"08",x"06",x"20",x"21",x"1C", -- 0x00B8 + x"27",x"3A",x"67",x"20",x"0F",x"DA",x"CB",x"08", -- 0x00C0 + x"21",x"1C",x"39",x"CD",x"CB",x"14",x"C3",x"A9", -- 0x00C8 + x"08",x"DB",x"02",x"E6",x"03",x"C6",x"03",x"C9", -- 0x00D0 + x"3A",x"82",x"20",x"FE",x"09",x"D0",x"3E",x"FB", -- 0x00D8 + x"32",x"7E",x"20",x"C9",x"3A",x"CE",x"20",x"A7", -- 0x00E0 + x"C0",x"21",x"1C",x"39",x"06",x"20",x"C3",x"CB", -- 0x00E8 + x"14",x"0E",x"03",x"1A",x"D5",x"CD",x"FF",x"08", -- 0x00F0 + x"D1",x"13",x"0D",x"C2",x"F3",x"08",x"C9",x"11", -- 0x00F8 + x"00",x"1E",x"E5",x"26",x"00",x"6F",x"29",x"29", -- 0x0100 + x"29",x"19",x"EB",x"E1",x"06",x"08",x"D3",x"06", -- 0x0108 + x"C3",x"39",x"14",x"3A",x"09",x"20",x"FE",x"78", -- 0x0110 + x"D0",x"2A",x"91",x"20",x"7D",x"B4",x"C2",x"29", -- 0x0118 + x"09",x"21",x"00",x"06",x"3E",x"01",x"32",x"83", -- 0x0120 + x"20",x"2B",x"22",x"91",x"20",x"C9",x"CD",x"11", -- 0x0128 + x"16",x"2E",x"FF",x"7E",x"C9",x"CD",x"10",x"19", -- 0x0130 + x"2B",x"2B",x"7E",x"A7",x"C8",x"06",x"15",x"DB", -- 0x0138 + x"02",x"E6",x"08",x"CA",x"48",x"09",x"06",x"10", -- 0x0140 + x"CD",x"CA",x"09",x"23",x"7E",x"B8",x"D8",x"CD", -- 0x0148 + x"2E",x"09",x"34",x"7E",x"F5",x"21",x"01",x"25", -- 0x0150 + x"24",x"24",x"3D",x"C2",x"58",x"09",x"06",x"10", -- 0x0158 + x"11",x"60",x"1C",x"CD",x"39",x"14",x"F1",x"3C", -- 0x0160 + x"CD",x"8B",x"1A",x"CD",x"10",x"19",x"2B",x"2B", -- 0x0168 + x"36",x"00",x"3E",x"FF",x"32",x"99",x"20",x"06", -- 0x0170 + x"10",x"C3",x"FA",x"18",x"21",x"A0",x"1D",x"FE", -- 0x0178 + x"02",x"D8",x"23",x"FE",x"04",x"D8",x"23",x"C9", -- 0x0180 + x"CD",x"CA",x"09",x"3A",x"F1",x"20",x"A7",x"C8", -- 0x0188 + x"AF",x"32",x"F1",x"20",x"E5",x"2A",x"F2",x"20", -- 0x0190 + x"EB",x"E1",x"7E",x"83",x"27",x"77",x"5F",x"23", -- 0x0198 + x"7E",x"8A",x"27",x"77",x"57",x"23",x"7E",x"23", -- 0x01A0 + x"66",x"6F",x"C3",x"AD",x"09",x"7A",x"CD",x"B2", -- 0x01A8 + x"09",x"7B",x"D5",x"F5",x"0F",x"0F",x"0F",x"0F", -- 0x01B0 + x"E6",x"0F",x"CD",x"C5",x"09",x"F1",x"E6",x"0F", -- 0x01B8 + x"CD",x"C5",x"09",x"D1",x"C9",x"C6",x"1A",x"C3", -- 0x01C0 + x"FF",x"08",x"3A",x"67",x"20",x"0F",x"21",x"F8", -- 0x01C8 + x"20",x"D8",x"21",x"FC",x"20",x"C9",x"21",x"02", -- 0x01D0 + x"24",x"36",x"00",x"23",x"7D",x"E6",x"1F",x"FE", -- 0x01D8 + x"1C",x"DA",x"E8",x"09",x"11",x"06",x"00",x"19", -- 0x01E0 + x"7C",x"FE",x"40",x"DA",x"D9",x"09",x"C9",x"CD", -- 0x01E8 + x"3C",x"0A",x"AF",x"32",x"E9",x"20",x"CD",x"D6", -- 0x01F0 + x"09",x"3A",x"67",x"20",x"F5",x"CD",x"E4",x"01", -- 0x01F8 + x"F1",x"32",x"67",x"20",x"3A",x"67",x"20",x"67", -- 0x0200 + x"E5",x"2E",x"FE",x"7E",x"E6",x"07",x"3C",x"77", -- 0x0208 + x"21",x"A2",x"1D",x"23",x"3D",x"C2",x"13",x"0A", -- 0x0210 + x"7E",x"E1",x"2E",x"FC",x"77",x"23",x"36",x"38", -- 0x0218 + x"7C",x"0F",x"DA",x"33",x"0A",x"3E",x"21",x"32", -- 0x0220 + x"98",x"20",x"CD",x"F5",x"01",x"CD",x"04",x"19", -- 0x0228 + x"C3",x"04",x"08",x"CD",x"EF",x"01",x"CD",x"C0", -- 0x0230 + x"01",x"C3",x"04",x"08",x"CD",x"59",x"0A",x"C2", -- 0x0238 + x"52",x"0A",x"3E",x"30",x"32",x"C0",x"20",x"3A", -- 0x0240 + x"C0",x"20",x"A7",x"C8",x"CD",x"59",x"0A",x"CA", -- 0x0248 + x"47",x"0A",x"CD",x"59",x"0A",x"C2",x"52",x"0A", -- 0x0250 + x"C9",x"3A",x"15",x"20",x"FE",x"FF",x"C9",x"3A", -- 0x0258 + x"EF",x"20",x"A7",x"CA",x"7C",x"0A",x"48",x"06", -- 0x0260 + x"08",x"CD",x"FA",x"18",x"41",x"78",x"CD",x"7C", -- 0x0268 + x"09",x"7E",x"21",x"F3",x"20",x"36",x"00",x"2B", -- 0x0270 + x"77",x"2B",x"36",x"01",x"21",x"62",x"20",x"C9", -- 0x0278 + x"3E",x"02",x"32",x"C1",x"20",x"D3",x"06",x"3A", -- 0x0280 + x"CB",x"20",x"A7",x"CA",x"85",x"0A",x"AF",x"32", -- 0x0288 + x"C1",x"20",x"C9",x"D5",x"1A",x"CD",x"FF",x"08", -- 0x0290 + x"D1",x"3E",x"07",x"32",x"C0",x"20",x"3A",x"C0", -- 0x0298 + x"20",x"3D",x"C2",x"9E",x"0A",x"13",x"0D",x"C2", -- 0x02A0 + x"93",x"0A",x"C9",x"21",x"50",x"20",x"C3",x"4B", -- 0x02A8 + x"02",x"3E",x"40",x"C3",x"D7",x"0A",x"3E",x"80", -- 0x02B0 + x"C3",x"D7",x"0A",x"E1",x"C3",x"72",x"00",x"3A", -- 0x02B8 + x"C1",x"20",x"0F",x"DA",x"BB",x"0A",x"0F",x"DA", -- 0x02C0 + x"68",x"18",x"0F",x"DA",x"AB",x"0A",x"C9",x"21", -- 0x02C8 + x"14",x"2B",x"0E",x"0F",x"C3",x"93",x"0A",x"32", -- 0x02D0 + x"C0",x"20",x"3A",x"C0",x"20",x"A7",x"C2",x"DA", -- 0x02D8 + x"0A",x"C9",x"21",x"C2",x"20",x"06",x"0C",x"C3", -- 0x02E0 + x"32",x"1A",x"AF",x"D3",x"03",x"D3",x"05",x"CD", -- 0x02E8 + x"82",x"19",x"FB",x"CD",x"B1",x"0A",x"3A",x"EC", -- 0x02F0 + x"20",x"A7",x"21",x"17",x"30",x"0E",x"04",x"C2", -- 0x02F8 + x"E8",x"0B",x"11",x"FA",x"1C",x"CD",x"93",x"0A", -- 0x0300 + x"11",x"AF",x"1D",x"CD",x"CF",x"0A",x"CD",x"B1", -- 0x0308 + x"0A",x"CD",x"15",x"18",x"CD",x"B6",x"0A",x"3A", -- 0x0310 + x"EC",x"20",x"A7",x"C2",x"4A",x"0B",x"11",x"95", -- 0x0318 + x"1A",x"CD",x"E2",x"0A",x"CD",x"80",x"0A",x"11", -- 0x0320 + x"B0",x"1B",x"CD",x"E2",x"0A",x"CD",x"80",x"0A", -- 0x0328 + x"CD",x"B1",x"0A",x"11",x"C9",x"1F",x"CD",x"E2", -- 0x0330 + x"0A",x"CD",x"80",x"0A",x"CD",x"B1",x"0A",x"21", -- 0x0338 + x"B7",x"33",x"06",x"0A",x"CD",x"CB",x"14",x"CD", -- 0x0340 + x"B6",x"0A",x"CD",x"D6",x"09",x"3A",x"FF",x"21", -- 0x0348 + x"A7",x"C2",x"5D",x"0B",x"CD",x"D1",x"08",x"32", -- 0x0350 + x"FF",x"21",x"CD",x"7F",x"1A",x"CD",x"E4",x"01", -- 0x0358 + x"CD",x"C0",x"01",x"CD",x"EF",x"01",x"CD",x"1A", -- 0x0360 + x"02",x"3E",x"01",x"32",x"C1",x"20",x"CD",x"CF", -- 0x0368 + x"01",x"CD",x"18",x"16",x"CD",x"F1",x"0B",x"D3", -- 0x0370 + x"06",x"CD",x"59",x"0A",x"CA",x"71",x"0B",x"AF", -- 0x0378 + x"32",x"25",x"20",x"CD",x"59",x"0A",x"C2",x"83", -- 0x0380 + x"0B",x"AF",x"32",x"C1",x"20",x"CD",x"B1",x"0A", -- 0x0388 + x"CD",x"88",x"19",x"0E",x"0C",x"21",x"11",x"2C", -- 0x0390 + x"11",x"90",x"1F",x"CD",x"F3",x"08",x"3A",x"EC", -- 0x0398 + x"20",x"FE",x"00",x"C2",x"AE",x"0B",x"21",x"11", -- 0x03A0 + x"33",x"3E",x"02",x"CD",x"FF",x"08",x"01",x"9C", -- 0x03A8 + x"1F",x"CD",x"56",x"18",x"CD",x"4C",x"18",x"DB", -- 0x03B0 + x"02",x"07",x"DA",x"C3",x"0B",x"01",x"A0",x"1F", -- 0x03B8 + x"CD",x"3A",x"18",x"CD",x"B6",x"0A",x"3A",x"EC", -- 0x03C0 + x"20",x"FE",x"00",x"C2",x"DA",x"0B",x"11",x"D5", -- 0x03C8 + x"1F",x"CD",x"E2",x"0A",x"CD",x"80",x"0A",x"CD", -- 0x03D0 + x"9E",x"18",x"21",x"EC",x"20",x"7E",x"3C",x"E6", -- 0x03D8 + x"01",x"77",x"CD",x"D6",x"09",x"C3",x"DF",x"18", -- 0x03E0 + x"11",x"AB",x"1D",x"CD",x"93",x"0A",x"C3",x"0B", -- 0x03E8 + x"0B",x"CD",x"0A",x"19",x"C3",x"9A",x"19",x"13", -- 0x03F0 + x"00",x"08",x"13",x"0E",x"26",x"02",x"0E",x"0F", -- 0x03F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0400 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0408 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0410 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0418 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0420 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0428 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0430 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0438 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0440 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0448 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0450 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0458 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0460 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0468 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0470 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0478 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0480 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0488 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0490 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0498 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0500 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0510 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0518 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0520 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0530 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0538 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0540 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0550 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0558 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0560 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0570 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0580 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0588 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0590 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0608 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0610 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0620 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0628 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0630 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0638 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0640 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0648 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0650 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0658 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0660 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0668 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0670 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0678 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0688 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0690 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0698 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0700 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0708 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0710 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0718 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0720 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0728 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0730 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0738 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0740 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0748 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0750 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0758 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0760 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0768 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0770 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0778 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0780 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0788 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0790 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0798 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + DATA <= ROM(to_integer(unsigned(ADDR))); + end if; + end process; +end RTL; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_rom_h.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_rom_h.vhd new file mode 100644 index 00000000..f2f27278 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_rom_h.vhd @@ -0,0 +1,288 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity INVADERS_ROM_H is + port ( + CLK : in std_logic; + ENA : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of INVADERS_ROM_H is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"00",x"00",x"C3",x"D4",x"18",x"00",x"00", -- 0x0000 + x"F5",x"C5",x"D5",x"E5",x"C3",x"8C",x"00",x"00", -- 0x0008 + x"F5",x"C5",x"D5",x"E5",x"3E",x"80",x"32",x"72", -- 0x0010 + x"20",x"21",x"C0",x"20",x"35",x"CD",x"CD",x"17", -- 0x0018 + x"DB",x"01",x"0F",x"DA",x"67",x"00",x"3A",x"EA", -- 0x0020 + x"20",x"A7",x"CA",x"42",x"00",x"3A",x"EB",x"20", -- 0x0028 + x"FE",x"99",x"CA",x"3E",x"00",x"C6",x"01",x"27", -- 0x0030 + x"32",x"EB",x"20",x"CD",x"47",x"19",x"AF",x"32", -- 0x0038 + x"EA",x"20",x"3A",x"E9",x"20",x"A7",x"CA",x"82", -- 0x0040 + x"00",x"3A",x"EF",x"20",x"A7",x"C2",x"6F",x"00", -- 0x0048 + x"3A",x"EB",x"20",x"A7",x"C2",x"5D",x"00",x"CD", -- 0x0050 + x"BF",x"0A",x"C3",x"82",x"00",x"3A",x"93",x"20", -- 0x0058 + x"A7",x"C2",x"82",x"00",x"C3",x"65",x"07",x"3E", -- 0x0060 + x"01",x"32",x"EA",x"20",x"C3",x"3F",x"00",x"CD", -- 0x0068 + x"40",x"17",x"3A",x"32",x"20",x"32",x"80",x"20", -- 0x0070 + x"CD",x"00",x"01",x"CD",x"48",x"02",x"CD",x"13", -- 0x0078 + x"09",x"00",x"E1",x"D1",x"C1",x"F1",x"FB",x"C9", -- 0x0080 + x"00",x"00",x"00",x"00",x"AF",x"32",x"72",x"20", -- 0x0088 + x"3A",x"E9",x"20",x"A7",x"CA",x"82",x"00",x"3A", -- 0x0090 + x"EF",x"20",x"A7",x"C2",x"A5",x"00",x"3A",x"C1", -- 0x0098 + x"20",x"0F",x"D2",x"82",x"00",x"21",x"20",x"20", -- 0x00A0 + x"CD",x"4B",x"02",x"CD",x"41",x"01",x"C3",x"82", -- 0x00A8 + x"00",x"CD",x"86",x"08",x"E5",x"7E",x"23",x"66", -- 0x00B0 + x"6F",x"22",x"09",x"20",x"22",x"0B",x"20",x"E1", -- 0x00B8 + x"2B",x"7E",x"FE",x"03",x"C2",x"C8",x"00",x"3D", -- 0x00C0 + x"32",x"08",x"20",x"FE",x"FE",x"3E",x"00",x"C2", -- 0x00C8 + x"D3",x"00",x"3C",x"32",x"0D",x"20",x"C9",x"3E", -- 0x00D0 + x"02",x"32",x"FB",x"21",x"32",x"FB",x"22",x"C3", -- 0x00D8 + x"E4",x"08",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00F8 + x"21",x"02",x"20",x"7E",x"A7",x"C2",x"38",x"15", -- 0x0100 + x"E5",x"3A",x"06",x"20",x"6F",x"3A",x"67",x"20", -- 0x0108 + x"67",x"7E",x"A7",x"E1",x"CA",x"36",x"01",x"23", -- 0x0110 + x"23",x"7E",x"23",x"46",x"E6",x"FE",x"07",x"07", -- 0x0118 + x"07",x"5F",x"16",x"00",x"21",x"00",x"1C",x"19", -- 0x0120 + x"EB",x"78",x"A7",x"C4",x"3B",x"01",x"2A",x"0B", -- 0x0128 + x"20",x"06",x"10",x"CD",x"D3",x"15",x"AF",x"32", -- 0x0130 + x"00",x"20",x"C9",x"21",x"30",x"00",x"19",x"EB", -- 0x0138 + x"C9",x"3A",x"68",x"20",x"A7",x"C8",x"3A",x"00", -- 0x0140 + x"20",x"A7",x"C0",x"3A",x"67",x"20",x"67",x"3A", -- 0x0148 + x"06",x"20",x"16",x"02",x"3C",x"FE",x"37",x"CC", -- 0x0150 + x"A1",x"01",x"6F",x"46",x"05",x"C2",x"54",x"01", -- 0x0158 + x"32",x"06",x"20",x"CD",x"7A",x"01",x"61",x"22", -- 0x0160 + x"0B",x"20",x"7D",x"FE",x"28",x"DA",x"71",x"19", -- 0x0168 + x"7A",x"32",x"04",x"20",x"3E",x"01",x"32",x"00", -- 0x0170 + x"20",x"C9",x"16",x"00",x"7D",x"21",x"09",x"20", -- 0x0178 + x"46",x"23",x"4E",x"FE",x"0B",x"FA",x"94",x"01", -- 0x0180 + x"DE",x"0B",x"5F",x"78",x"C6",x"10",x"47",x"7B", -- 0x0188 + x"14",x"C3",x"83",x"01",x"68",x"A7",x"C8",x"5F", -- 0x0190 + x"79",x"C6",x"10",x"4F",x"7B",x"3D",x"C3",x"95", -- 0x0198 + x"01",x"15",x"CA",x"CD",x"01",x"21",x"06",x"20", -- 0x01A0 + x"36",x"00",x"23",x"4E",x"36",x"00",x"CD",x"D9", -- 0x01A8 + x"01",x"21",x"05",x"20",x"7E",x"3C",x"E6",x"01", -- 0x01B0 + x"77",x"AF",x"21",x"67",x"20",x"66",x"C9",x"00", -- 0x01B8 + x"21",x"00",x"21",x"06",x"37",x"36",x"01",x"23", -- 0x01C0 + x"05",x"C2",x"C5",x"01",x"C9",x"E1",x"C9",x"3E", -- 0x01C8 + x"01",x"06",x"E0",x"21",x"02",x"24",x"C3",x"CC", -- 0x01D0 + x"14",x"23",x"46",x"23",x"79",x"86",x"77",x"23", -- 0x01D8 + x"78",x"86",x"77",x"C9",x"06",x"C0",x"11",x"00", -- 0x01E0 + x"1B",x"21",x"00",x"20",x"C3",x"32",x"1A",x"21", -- 0x01E8 + x"42",x"21",x"C3",x"F8",x"01",x"21",x"42",x"22", -- 0x01F0 + x"0E",x"04",x"11",x"20",x"1D",x"D5",x"06",x"2C", -- 0x01F8 + x"CD",x"32",x"1A",x"D1",x"0D",x"C2",x"FD",x"01", -- 0x0200 + x"C9",x"3E",x"01",x"C3",x"1B",x"02",x"3E",x"01", -- 0x0208 + x"C3",x"14",x"02",x"AF",x"11",x"42",x"22",x"C3", -- 0x0210 + x"1E",x"02",x"AF",x"11",x"42",x"21",x"32",x"81", -- 0x0218 + x"20",x"01",x"02",x"16",x"21",x"06",x"28",x"3E", -- 0x0220 + x"04",x"F5",x"C5",x"3A",x"81",x"20",x"A7",x"C2", -- 0x0228 + x"42",x"02",x"CD",x"69",x"1A",x"C1",x"F1",x"3D", -- 0x0230 + x"C8",x"D5",x"11",x"E0",x"02",x"19",x"D1",x"C3", -- 0x0238 + x"29",x"02",x"CD",x"7C",x"14",x"C3",x"35",x"02", -- 0x0240 + x"21",x"10",x"20",x"7E",x"FE",x"FF",x"C8",x"FE", -- 0x0248 + x"FE",x"CA",x"81",x"02",x"23",x"46",x"4F",x"B0", -- 0x0250 + x"79",x"C2",x"77",x"02",x"23",x"7E",x"A7",x"C2", -- 0x0258 + x"88",x"02",x"23",x"5E",x"23",x"56",x"E5",x"EB", -- 0x0260 + x"E5",x"21",x"6F",x"02",x"E3",x"D5",x"E9",x"E1", -- 0x0268 + x"11",x"0C",x"00",x"19",x"C3",x"4B",x"02",x"05", -- 0x0270 + x"04",x"C2",x"7D",x"02",x"3D",x"05",x"70",x"2B", -- 0x0278 + x"77",x"11",x"10",x"00",x"19",x"C3",x"4B",x"02", -- 0x0280 + x"35",x"2B",x"2B",x"C3",x"81",x"02",x"E1",x"23", -- 0x0288 + x"7E",x"FE",x"FF",x"CA",x"3B",x"03",x"23",x"35", -- 0x0290 + x"C0",x"47",x"AF",x"32",x"68",x"20",x"32",x"69", -- 0x0298 + x"20",x"3E",x"30",x"32",x"6A",x"20",x"78",x"36", -- 0x02A0 + x"05",x"23",x"35",x"C2",x"9B",x"03",x"2A",x"1A", -- 0x02A8 + x"20",x"06",x"10",x"CD",x"24",x"14",x"21",x"10", -- 0x02B0 + x"20",x"11",x"10",x"1B",x"06",x"10",x"CD",x"32", -- 0x02B8 + x"1A",x"06",x"00",x"CD",x"DC",x"19",x"3A",x"6D", -- 0x02C0 + x"20",x"A7",x"C0",x"3A",x"EF",x"20",x"A7",x"C8", -- 0x02C8 + x"31",x"00",x"24",x"FB",x"CD",x"D7",x"19",x"CD", -- 0x02D0 + x"2E",x"09",x"A7",x"CA",x"6D",x"16",x"CD",x"E7", -- 0x02D8 + x"18",x"7E",x"A7",x"CA",x"2C",x"03",x"3A",x"CE", -- 0x02E0 + x"20",x"A7",x"CA",x"2C",x"03",x"3A",x"67",x"20", -- 0x02E8 + x"F5",x"0F",x"DA",x"32",x"03",x"CD",x"0E",x"02", -- 0x02F0 + x"CD",x"78",x"08",x"73",x"23",x"72",x"2B",x"2B", -- 0x02F8 + x"70",x"00",x"CD",x"E4",x"01",x"F1",x"0F",x"3E", -- 0x0300 + x"21",x"06",x"00",x"D2",x"12",x"03",x"06",x"20", -- 0x0308 + x"3E",x"22",x"32",x"67",x"20",x"CD",x"B6",x"0A", -- 0x0310 + x"AF",x"32",x"11",x"20",x"78",x"D3",x"05",x"3C", -- 0x0318 + x"32",x"98",x"20",x"CD",x"D6",x"09",x"CD",x"7F", -- 0x0320 + x"1A",x"C3",x"F9",x"07",x"CD",x"7F",x"1A",x"C3", -- 0x0328 + x"17",x"08",x"CD",x"09",x"02",x"C3",x"F8",x"02", -- 0x0330 + x"00",x"00",x"00",x"21",x"68",x"20",x"36",x"01", -- 0x0338 + x"23",x"7E",x"A7",x"C3",x"B0",x"03",x"00",x"2B", -- 0x0340 + x"36",x"01",x"3A",x"1B",x"20",x"47",x"3A",x"EF", -- 0x0348 + x"20",x"A7",x"C2",x"63",x"03",x"3A",x"1D",x"20", -- 0x0350 + x"0F",x"DA",x"81",x"03",x"0F",x"DA",x"8E",x"03", -- 0x0358 + x"C3",x"6F",x"03",x"CD",x"C0",x"17",x"07",x"07", -- 0x0360 + x"DA",x"81",x"03",x"07",x"DA",x"8E",x"03",x"21", -- 0x0368 + x"18",x"20",x"CD",x"3B",x"1A",x"CD",x"47",x"1A", -- 0x0370 + x"CD",x"39",x"14",x"3E",x"00",x"32",x"12",x"20", -- 0x0378 + x"C9",x"78",x"FE",x"D9",x"CA",x"6F",x"03",x"3C", -- 0x0380 + x"32",x"1B",x"20",x"C3",x"6F",x"03",x"78",x"FE", -- 0x0388 + x"30",x"CA",x"6F",x"03",x"3D",x"32",x"1B",x"20", -- 0x0390 + x"C3",x"6F",x"03",x"3C",x"E6",x"01",x"32",x"15", -- 0x0398 + x"20",x"07",x"07",x"07",x"07",x"21",x"70",x"1C", -- 0x03A0 + x"85",x"6F",x"22",x"18",x"20",x"C3",x"6F",x"03", -- 0x03A8 + x"C2",x"4A",x"03",x"23",x"35",x"C2",x"4A",x"03", -- 0x03B0 + x"C3",x"46",x"03",x"11",x"2A",x"20",x"CD",x"06", -- 0x03B8 + x"1A",x"E1",x"D0",x"23",x"7E",x"A7",x"C8",x"FE", -- 0x03C0 + x"01",x"CA",x"FA",x"03",x"FE",x"02",x"CA",x"0A", -- 0x03C8 + x"04",x"23",x"FE",x"03",x"C2",x"2A",x"04",x"35", -- 0x03D0 + x"CA",x"36",x"04",x"7E",x"FE",x"0F",x"C0",x"E5", -- 0x03D8 + x"CD",x"30",x"04",x"CD",x"52",x"14",x"E1",x"23", -- 0x03E0 + x"34",x"23",x"23",x"35",x"35",x"23",x"35",x"35", -- 0x03E8 + x"35",x"23",x"36",x"08",x"CD",x"30",x"04",x"C3", -- 0x03F0 + x"00",x"14",x"3C",x"77",x"3A",x"1B",x"20",x"C6", -- 0x03F8 + x"08",x"32",x"2A",x"20",x"CD",x"30",x"04",x"C3", -- 0x0400 + x"00",x"14",x"CD",x"30",x"04",x"D5",x"E5",x"C5", -- 0x0408 + x"CD",x"52",x"14",x"C1",x"E1",x"D1",x"3A",x"2C", -- 0x0410 + x"20",x"85",x"6F",x"32",x"29",x"20",x"CD",x"91", -- 0x0418 + x"14",x"3A",x"61",x"20",x"A7",x"C8",x"32",x"02", -- 0x0420 + x"20",x"C9",x"FE",x"05",x"C8",x"C3",x"36",x"04", -- 0x0428 + x"21",x"27",x"20",x"C3",x"3B",x"1A",x"CD",x"30", -- 0x0430 + x"04",x"CD",x"52",x"14",x"21",x"25",x"20",x"11", -- 0x0438 + x"25",x"1B",x"06",x"07",x"CD",x"32",x"1A",x"2A", -- 0x0440 + x"8D",x"20",x"2C",x"7D",x"FE",x"63",x"DA",x"53", -- 0x0448 + x"04",x"2E",x"54",x"22",x"8D",x"20",x"2A",x"8F", -- 0x0450 + x"20",x"2C",x"22",x"8F",x"20",x"3A",x"84",x"20", -- 0x0458 + x"A7",x"C0",x"7E",x"E6",x"01",x"01",x"29",x"02", -- 0x0460 + x"C2",x"6E",x"04",x"01",x"E0",x"FE",x"21",x"8A", -- 0x0468 + x"20",x"71",x"23",x"23",x"70",x"C9",x"E1",x"3A", -- 0x0470 + x"32",x"1B",x"32",x"32",x"20",x"2A",x"38",x"20", -- 0x0478 + x"7D",x"B4",x"C2",x"8A",x"04",x"2B",x"22",x"38", -- 0x0480 + x"20",x"C9",x"11",x"35",x"20",x"3E",x"F9",x"CD", -- 0x0488 + x"50",x"05",x"3A",x"46",x"20",x"32",x"70",x"20", -- 0x0490 + x"3A",x"56",x"20",x"32",x"71",x"20",x"CD",x"63", -- 0x0498 + x"05",x"3A",x"78",x"20",x"A7",x"21",x"35",x"20", -- 0x04A0 + x"C2",x"5B",x"05",x"11",x"30",x"1B",x"21",x"30", -- 0x04A8 + x"20",x"06",x"10",x"C3",x"32",x"1A",x"E1",x"3A", -- 0x04B0 + x"6E",x"20",x"A7",x"C0",x"3A",x"80",x"20",x"FE", -- 0x04B8 + x"01",x"C0",x"11",x"45",x"20",x"3E",x"ED",x"CD", -- 0x04C0 + x"50",x"05",x"3A",x"36",x"20",x"32",x"70",x"20", -- 0x04C8 + x"3A",x"56",x"20",x"32",x"71",x"20",x"CD",x"63", -- 0x04D0 + x"05",x"3A",x"76",x"20",x"FE",x"10",x"DA",x"E7", -- 0x04D8 + x"04",x"3A",x"48",x"1B",x"32",x"76",x"20",x"3A", -- 0x04E0 + x"78",x"20",x"A7",x"21",x"45",x"20",x"C2",x"5B", -- 0x04E8 + x"05",x"11",x"40",x"1B",x"21",x"40",x"20",x"06", -- 0x04F0 + x"10",x"CD",x"32",x"1A",x"3A",x"82",x"20",x"3D", -- 0x04F8 + x"C2",x"08",x"05",x"3E",x"01",x"32",x"6E",x"20", -- 0x0500 + x"2A",x"76",x"20",x"C3",x"7E",x"06",x"E1",x"11", -- 0x0508 + x"55",x"20",x"3E",x"DB",x"CD",x"50",x"05",x"3A", -- 0x0510 + x"46",x"20",x"32",x"70",x"20",x"3A",x"36",x"20", -- 0x0518 + x"32",x"71",x"20",x"CD",x"63",x"05",x"3A",x"76", -- 0x0520 + x"20",x"FE",x"15",x"DA",x"34",x"05",x"3A",x"58", -- 0x0528 + x"1B",x"32",x"76",x"20",x"3A",x"78",x"20",x"A7", -- 0x0530 + x"21",x"55",x"20",x"C2",x"5B",x"05",x"11",x"50", -- 0x0538 + x"1B",x"21",x"50",x"20",x"06",x"10",x"CD",x"32", -- 0x0540 + x"1A",x"2A",x"76",x"20",x"22",x"58",x"20",x"C9", -- 0x0548 + x"32",x"7F",x"20",x"21",x"73",x"20",x"06",x"0B", -- 0x0550 + x"C3",x"32",x"1A",x"11",x"73",x"20",x"06",x"0B", -- 0x0558 + x"C3",x"32",x"1A",x"21",x"73",x"20",x"7E",x"E6", -- 0x0560 + x"80",x"C2",x"C1",x"05",x"3A",x"C1",x"20",x"FE", -- 0x0568 + x"04",x"3A",x"69",x"20",x"CA",x"B7",x"05",x"A7", -- 0x0570 + x"C8",x"23",x"36",x"00",x"3A",x"70",x"20",x"A7", -- 0x0578 + x"CA",x"89",x"05",x"47",x"3A",x"CF",x"20",x"B8", -- 0x0580 + x"D0",x"3A",x"71",x"20",x"A7",x"CA",x"96",x"05", -- 0x0588 + x"47",x"3A",x"CF",x"20",x"B8",x"D0",x"23",x"7E", -- 0x0590 + x"A7",x"CA",x"1B",x"06",x"2A",x"76",x"20",x"4E", -- 0x0598 + x"23",x"00",x"22",x"76",x"20",x"CD",x"2F",x"06", -- 0x05A0 + x"D0",x"CD",x"7A",x"01",x"79",x"C6",x"07",x"67", -- 0x05A8 + x"7D",x"D6",x"0A",x"6F",x"22",x"7B",x"20",x"21", -- 0x05B0 + x"73",x"20",x"7E",x"F6",x"80",x"77",x"23",x"34", -- 0x05B8 + x"C9",x"11",x"7C",x"20",x"CD",x"06",x"1A",x"D0", -- 0x05C0 + x"23",x"7E",x"E6",x"01",x"C2",x"44",x"06",x"23", -- 0x05C8 + x"34",x"CD",x"75",x"06",x"3A",x"79",x"20",x"C6", -- 0x05D0 + x"03",x"21",x"7F",x"20",x"BE",x"DA",x"E2",x"05", -- 0x05D8 + x"D6",x"0C",x"32",x"79",x"20",x"3A",x"7B",x"20", -- 0x05E0 + x"47",x"3A",x"7E",x"20",x"80",x"32",x"7B",x"20", -- 0x05E8 + x"CD",x"6C",x"06",x"3A",x"7B",x"20",x"FE",x"15", -- 0x05F0 + x"DA",x"12",x"06",x"3A",x"61",x"20",x"A7",x"C8", -- 0x05F8 + x"3A",x"7B",x"20",x"FE",x"1E",x"DA",x"12",x"06", -- 0x0600 + x"FE",x"27",x"00",x"D2",x"12",x"06",x"97",x"32", -- 0x0608 + x"15",x"20",x"3A",x"73",x"20",x"F6",x"01",x"32", -- 0x0610 + x"73",x"20",x"C9",x"3A",x"1B",x"20",x"C6",x"08", -- 0x0618 + x"67",x"CD",x"6F",x"15",x"79",x"FE",x"0C",x"DA", -- 0x0620 + x"A5",x"05",x"0E",x"0B",x"C3",x"A5",x"05",x"0D", -- 0x0628 + x"3A",x"67",x"20",x"67",x"69",x"16",x"05",x"7E", -- 0x0630 + x"A7",x"37",x"C0",x"7D",x"C6",x"0B",x"6F",x"15", -- 0x0638 + x"C2",x"37",x"06",x"C9",x"21",x"78",x"20",x"35", -- 0x0640 + x"7E",x"FE",x"03",x"C2",x"67",x"06",x"CD",x"75", -- 0x0648 + x"06",x"21",x"DC",x"1C",x"22",x"79",x"20",x"21", -- 0x0650 + x"7C",x"20",x"35",x"35",x"2B",x"35",x"35",x"3E", -- 0x0658 + x"06",x"32",x"7D",x"20",x"C3",x"6C",x"06",x"A7", -- 0x0660 + x"C0",x"C3",x"75",x"06",x"21",x"79",x"20",x"CD", -- 0x0668 + x"3B",x"1A",x"C3",x"91",x"14",x"21",x"79",x"20", -- 0x0670 + x"CD",x"3B",x"1A",x"C3",x"52",x"14",x"22",x"48", -- 0x0678 + x"20",x"C9",x"E1",x"3A",x"80",x"20",x"FE",x"02", -- 0x0680 + x"C0",x"21",x"83",x"20",x"7E",x"A7",x"CA",x"0F", -- 0x0688 + x"05",x"3A",x"56",x"20",x"A7",x"C2",x"0F",x"05", -- 0x0690 + x"23",x"7E",x"A7",x"C2",x"AB",x"06",x"3A",x"82", -- 0x0698 + x"20",x"FE",x"08",x"DA",x"0F",x"05",x"36",x"01", -- 0x06A0 + x"CD",x"3C",x"07",x"11",x"8A",x"20",x"CD",x"06", -- 0x06A8 + x"1A",x"D0",x"21",x"85",x"20",x"7E",x"A7",x"C2", -- 0x06B0 + x"D6",x"06",x"21",x"8A",x"20",x"7E",x"23",x"23", -- 0x06B8 + x"86",x"32",x"8A",x"20",x"CD",x"3C",x"07",x"21", -- 0x06C0 + x"8A",x"20",x"7E",x"FE",x"28",x"DA",x"F9",x"06", -- 0x06C8 + x"FE",x"E1",x"D2",x"F9",x"06",x"C9",x"06",x"FE", -- 0x06D0 + x"CD",x"DC",x"19",x"23",x"35",x"7E",x"FE",x"1F", -- 0x06D8 + x"CA",x"4B",x"07",x"FE",x"18",x"CA",x"0C",x"07", -- 0x06E0 + x"A7",x"C0",x"06",x"EF",x"21",x"98",x"20",x"7E", -- 0x06E8 + x"A0",x"77",x"E6",x"20",x"D3",x"05",x"00",x"00", -- 0x06F0 + x"00",x"CD",x"42",x"07",x"CD",x"CB",x"14",x"21", -- 0x06F8 + x"83",x"20",x"06",x"0A",x"CD",x"5F",x"07",x"06", -- 0x0700 + x"FE",x"C3",x"DC",x"19",x"3E",x"01",x"32",x"F1", -- 0x0708 + x"20",x"2A",x"8D",x"20",x"46",x"0E",x"04",x"21", -- 0x0710 + x"50",x"1D",x"11",x"4C",x"1D",x"1A",x"B8",x"CA", -- 0x0718 + x"28",x"07",x"23",x"13",x"0D",x"C2",x"1D",x"07", -- 0x0720 + x"7E",x"32",x"87",x"20",x"26",x"00",x"68",x"29", -- 0x0728 + x"29",x"29",x"29",x"22",x"F2",x"20",x"CD",x"42", -- 0x0730 + x"07",x"C3",x"F1",x"08",x"CD",x"42",x"07",x"C3", -- 0x0738 + x"39",x"14",x"21",x"87",x"20",x"CD",x"3B",x"1A", -- 0x0740 + x"C3",x"47",x"1A",x"06",x"10",x"21",x"98",x"20", -- 0x0748 + x"7E",x"B0",x"77",x"CD",x"70",x"17",x"21",x"7C", -- 0x0750 + x"1D",x"22",x"87",x"20",x"C3",x"3C",x"07",x"11", -- 0x0758 + x"83",x"1B",x"C3",x"32",x"1A",x"3E",x"01",x"32", -- 0x0760 + x"93",x"20",x"31",x"00",x"24",x"FB",x"CD",x"79", -- 0x0768 + x"19",x"CD",x"D6",x"09",x"21",x"13",x"30",x"11", -- 0x0770 + x"F3",x"1F",x"0E",x"04",x"CD",x"F3",x"08",x"3A", -- 0x0778 + x"EB",x"20",x"3D",x"21",x"10",x"28",x"0E",x"14", -- 0x0780 + x"C2",x"57",x"08",x"11",x"CF",x"1A",x"CD",x"F3", -- 0x0788 + x"08",x"DB",x"01",x"E6",x"04",x"CA",x"7F",x"07", -- 0x0790 + x"06",x"99",x"AF",x"32",x"CE",x"20",x"3A",x"EB", -- 0x0798 + x"20",x"80",x"27",x"32",x"EB",x"20",x"CD",x"47", -- 0x07A0 + x"19",x"21",x"00",x"00",x"22",x"F8",x"20",x"22", -- 0x07A8 + x"FC",x"20",x"CD",x"25",x"19",x"CD",x"2B",x"19", -- 0x07B0 + x"CD",x"D7",x"19",x"21",x"01",x"01",x"7C",x"32", -- 0x07B8 + x"EF",x"20",x"22",x"E7",x"20",x"22",x"E5",x"20", -- 0x07C0 + x"CD",x"56",x"19",x"CD",x"EF",x"01",x"CD",x"F5", -- 0x07C8 + x"01",x"CD",x"D1",x"08",x"32",x"FF",x"21",x"32", -- 0x07D0 + x"FF",x"22",x"CD",x"D7",x"00",x"AF",x"32",x"FE", -- 0x07D8 + x"21",x"32",x"FE",x"22",x"CD",x"C0",x"01",x"CD", -- 0x07E0 + x"04",x"19",x"21",x"78",x"38",x"22",x"FC",x"21", -- 0x07E8 + x"22",x"FC",x"22",x"CD",x"E4",x"01",x"CD",x"7F", -- 0x07F0 + x"1A",x"CD",x"8D",x"08",x"CD",x"D6",x"09",x"00" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + DATA <= ROM(to_integer(unsigned(ADDR))); + end if; + end process; +end RTL; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_top.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_top.vhd new file mode 100644 index 00000000..c5e11d4a --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_top.vhd @@ -0,0 +1,319 @@ +-- Space Invaders top level for +-- ps/2 keyboard interface with sound and scan doubler MikeJ +-- +-- Version : 0300 +-- +-- 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.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Moved the PS/2 interface to ps2kbd.vhd, added the ROM from mw8080.vhd +-- +-- 0300 : MikeJ tidy up for audio release + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity invaders_top is + port( + Buttons : in std_logic_vector(5 downto 0); + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + -- + Audio : out std_logic_vector(7 downto 0); + -- + I_RESET : in std_logic; + CLK : in std_logic--10mhz + ); +end invaders_top; + +architecture rtl of invaders_top is + + signal I_RESET_L : std_logic; + signal Rst_n_s : std_logic; + + signal DIP : std_logic_vector(8 downto 1); + signal RWE_n : std_logic; + signal Video : std_logic; + signal VideoRGB : std_logic_vector(2 downto 0); + signal HSync : std_logic; + signal VSync : std_logic; + + signal AD : std_logic_vector(15 downto 0); + signal RAB : std_logic_vector(12 downto 0); + signal RDB : std_logic_vector(7 downto 0); + signal RWD : std_logic_vector(7 downto 0); + signal IB : std_logic_vector(7 downto 0); + signal SoundCtrl3 : std_logic_vector(5 downto 0); + signal SoundCtrl5 : std_logic_vector(5 downto 0); + + signal Buttons_n : std_logic_vector(5 downto 1); + signal Tick1us : std_logic; + + signal PS2_Sample : std_logic; + signal PS2_Data_s : std_logic; + signal ScanCode : std_logic_vector(7 downto 0); + signal Press : std_logic; + signal Release : std_logic; + signal Reset : std_logic; + + signal rom_data_0 : std_logic_vector(7 downto 0); + signal rom_data_1 : std_logic_vector(7 downto 0); + signal rom_data_2 : std_logic_vector(7 downto 0); + signal rom_data_3 : std_logic_vector(7 downto 0); + signal ram_we : std_logic; + -- + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + signal Overlay_G1 : boolean; + signal Overlay_G2 : boolean; + signal Overlay_R1 : boolean; + signal Overlay_G1_VCnt : boolean; + +begin + + + I_RESET_L <= not I_RESET; + + DIP <= "00000000"; + + core : entity work.invaderst + port map( + Rst_n => I_RESET_L, + Clk => Clk, + Coin => Buttons(0), + Sel1Player => not Buttons(1), + Sel2Player => not Buttons(2), + Fire => not Buttons(3), + MoveLeft => not Buttons(4), + MoveRight => not Buttons(5), + DIP => DIP, + RDB => RDB, + IB => IB, + RWD => RWD, + RAB => RAB, + AD => AD, + SoundCtrl3 => SoundCtrl3, + SoundCtrl5 => SoundCtrl5, + Rst_n_s => Rst_n_s, + RWE_n => RWE_n, + Video => Video, + HSync => HSync, + VSync => VSync + ); + -- + -- ROM + -- + u_rom_h : entity work.INVADERS_ROM_H + port map ( + CLK => Clk, + ENA => '1', + ADDR => AD(10 downto 0), + DATA => rom_data_0 + ); + -- + u_rom_g : entity work.INVADERS_ROM_G + port map ( + CLK => Clk, + ENA => '1', + ADDR => AD(10 downto 0), + DATA => rom_data_1 + ); + -- + u_rom_f : entity work.INVADERS_ROM_F + port map ( + CLK => Clk, + ENA => '1', + ADDR => AD(10 downto 0), + DATA => rom_data_2 + ); + -- + u_rom_e : entity work.INVADERS_ROM_E + port map ( + CLK => Clk, + ENA => '1', + ADDR => AD(10 downto 0), + DATA => rom_data_3 + ); + -- + p_rom_data : process(AD, rom_data_0, rom_data_1, rom_data_2, rom_data_3) + begin + IB <= (others => '0'); + case AD(12 downto 11) is + when "00" => IB <= rom_data_0; + when "01" => IB <= rom_data_1; + when "10" => IB <= rom_data_2; + when "11" => IB <= rom_data_3; + when others => null; + end case; + end process; + -- + -- SRAM + -- + ram_we <= not RWE_n; + + rams : for i in 0 to 3 generate + u_ram : entity work.WRAM + port map ( + q => RDB((i*2)+1 downto (i*2)), + address => RAB, + clock => Clk, + data => RWD((i*2)+1 downto (i*2)), + rden => '1', + wren => ram_we + ); + end generate; + -- + -- Glue + -- + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + Tick1us <= '0'; + elsif Clk'event and Clk = '1' then + Tick1us <= '0'; + if cnt = 9 then + Tick1us <= '1'; + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + Overlay_G1_VCnt <= false; + Overlay_G1 <= false; + Overlay_G2 <= false; + Overlay_R1 <= false; + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1');-- rising + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt = x"1F") then + Overlay_G1_VCnt <= true; + elsif (Vcnt = x"95") then + Overlay_G1_VCnt <= false; + end if; + end if; + + if (HCnt = x"027") and Overlay_G1_VCnt then + Overlay_G1 <= true; + elsif (HCnt = x"046") then + Overlay_G1 <= false; + end if; + + if (HCnt = x"046") then + Overlay_G2 <= true; + elsif (HCnt = x"0B6") then + Overlay_G2 <= false; + end if; + + if (HCnt = x"1A6") then + Overlay_R1 <= true; + elsif (HCnt = x"1E6") then + Overlay_R1 <= false; + end if; + + end if; + end process; + + p_video_out_comb : process(Video, Overlay_G1, Overlay_G2, Overlay_R1) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_G1 or Overlay_G2 then + VideoRGB <= "010"; + elsif Overlay_R1 then + VideoRGB <= "100"; + else + VideoRGB <= "111"; + end if; + end if; + end process; + + + O_VIDEO_R <= VideoRGB(2); + O_VIDEO_G <= VideoRGB(1); + O_VIDEO_B <= VideoRGB(0); + O_HSYNC <= not HSync; + O_VSYNC <= not VSync; + -- + -- Audio + -- + u_audio : entity work.invaders_audio + port map ( + Clk => Clk, + S1 => SoundCtrl3, + S2 => SoundCtrl5, + Aud => Audio + ); + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_video.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_video.vhd new file mode 100644 index 00000000..ed3007f7 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_video.vhd @@ -0,0 +1,126 @@ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + +entity invaders_video is + port( + Video : in std_logic; + CLK : in std_logic; + Rst_n_s : in std_logic; + HSync : in std_logic; + VSync : in std_logic; + O_VIDEO_R : out std_logic; + O_VIDEO_G : out std_logic; + O_VIDEO_B : out std_logic; + O_HSYNC : out std_logic; + O_VSYNC : out std_logic + ); +end invaders_video; + +architecture rtl of invaders_video is + + signal HCnt : std_logic_vector(11 downto 0); + signal VCnt : std_logic_vector(11 downto 0); + signal HSync_t1 : std_logic; + signal Overlay_G1 : boolean; + signal Overlay_G2 : boolean; + signal Overlay_R1 : boolean; + signal Overlay_G1_VCnt : boolean; + signal VideoRGB : std_logic_vector(2 downto 0); +begin + process (Rst_n_s, Clk) + variable cnt : unsigned(3 downto 0); + begin + if Rst_n_s = '0' then + cnt := "0000"; + elsif Clk'event and Clk = '1' then + if cnt = 9 then + cnt := "0000"; + else + cnt := cnt + 1; + end if; + end if; + end process; + + p_overlay : process(Rst_n_s, Clk) + variable HStart : boolean; + begin + if Rst_n_s = '0' then + HCnt <= (others => '0'); + VCnt <= (others => '0'); + HSync_t1 <= '0'; + Overlay_G1_VCnt <= false; + Overlay_G1 <= false; + Overlay_G2 <= false; + Overlay_R1 <= false; + elsif Clk'event and Clk = '1' then + HSync_t1 <= HSync; + HStart := (HSync_t1 = '0') and (HSync = '1'); + + if HStart then + HCnt <= (others => '0'); + else + HCnt <= HCnt + "1"; + end if; + + if (VSync = '0') then + VCnt <= (others => '0'); + elsif HStart then + VCnt <= VCnt + "1"; + end if; + + if HStart then + if (Vcnt = x"1F") then + Overlay_G1_VCnt <= true; + elsif (Vcnt = x"95") then + Overlay_G1_VCnt <= false; + end if; + end if; + + if (HCnt = x"027") and Overlay_G1_VCnt then + Overlay_G1 <= true; + elsif (HCnt = x"046") then + Overlay_G1 <= false; + end if; + + if (HCnt = x"046") then + Overlay_G2 <= true; + elsif (HCnt = x"0B6") then + Overlay_G2 <= false; + end if; + + if (HCnt = x"1A6") then + Overlay_R1 <= true; + elsif (HCnt = x"1E6") then + Overlay_R1 <= false; + end if; + + end if; + end process; + + p_video_out_comb : process(Video, Overlay_G1, Overlay_G2, Overlay_R1) + begin + if (Video = '0') then + VideoRGB <= "000"; + else + if Overlay_G1 or Overlay_G2 then + VideoRGB <= "010"; + elsif Overlay_R1 then + VideoRGB <= "100"; + else + VideoRGB <= "111"; + end if; + end if; + end process; + + + O_VIDEO_R <= VideoRGB(2); + O_VIDEO_G <= VideoRGB(1); + O_VIDEO_B <= VideoRGB(0); + O_HSYNC <= not HSync; + O_VSYNC <= not VSync; + + +end; \ No newline at end of file diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/keyboard.v b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/keyboard.v new file mode 100644 index 00000000..ba7038b6 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space +// 'h11: joystick[1] <= ~release_btn; // Left Alt +// 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/mist_io.v b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_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/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/mw8080.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/mw8080.vhd new file mode 100644 index 00000000..51d495a6 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/mw8080.vhd @@ -0,0 +1,336 @@ +-- Midway 8080 main board +-- 9.984MHz Clock +-- +-- Version : 0242 +-- +-- 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.fpgaarcade.com +-- +-- Limitations : +-- +-- File history : +-- +-- 0241 : First release +-- +-- 0242 : Removed the ROM +-- +-- 0300 : MikeJ tidyup for audio release +-- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity mw8080 is + port( + Rst_n : in std_logic; + Clk : in std_logic; + ENA : out std_logic; + RWE_n : out std_logic; + RDB : in std_logic_vector(7 downto 0); + RAB : out std_logic_vector(12 downto 0); + Sounds : out std_logic_vector(7 downto 0); + Ready : out std_logic; + GDB : in std_logic_vector(7 downto 0); + IB : in std_logic_vector(7 downto 0); + DB : out std_logic_vector(7 downto 0); + AD : out std_logic_vector(15 downto 0); + Status : out std_logic_vector(7 downto 0); + Systb : out std_logic; + Int : out std_logic; + Hold_n : in std_logic; + IntE : out std_logic; + DBin_n : out std_logic; + Vait : out std_logic; + HldA : out std_logic; + Sample : out std_logic; + Wr : out std_logic; + Video : out std_logic; + HSync : out std_logic; + VSync : out std_logic); +end mw8080; + +architecture struct of mw8080 is + + component T8080se + generic( + Mode : integer := 2; + T2Write : integer := 0); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CLKEN : in std_logic; + READY : in std_logic; + HOLD : in std_logic; + INT : in std_logic; + INTE : out std_logic; + DBIN : out std_logic; + SYNC : out std_logic; + VAIT : out std_logic; + HLDA : out std_logic; + WR_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0)); + end component; + + signal Ready_i : std_logic; + signal Hold : std_logic; + signal IntTrig : std_logic; + signal IntTrigOld : std_logic; + signal Int_i : std_logic; + signal IntE_i : std_logic; + signal DBin : std_logic; + signal Sync : std_logic; + signal Wr_n : std_logic; + signal ClkEnCnt : unsigned(2 downto 0); + signal Status_i : std_logic_vector(7 downto 0); + signal A : std_logic_vector(15 downto 0); + signal ISel : std_logic_vector(1 downto 0); + signal DI : std_logic_vector(7 downto 0); + signal DO : std_logic_vector(7 downto 0); + signal RR : std_logic_vector(9 downto 0); + + signal VidEn : std_logic; + signal CntD5 : unsigned(3 downto 0); -- Horizontal counter / 320 + signal CntE5 : unsigned(4 downto 0); -- Horizontal counter 2 + signal CntE6 : unsigned(3 downto 0); -- Vertical counter / 262 + signal CntE7 : unsigned(4 downto 0); -- Vertical counter 2 + signal Shift : std_logic_vector(7 downto 0); + +begin + ENA <= ClkEnCnt(2); + Status <= Status_i; + Ready <= Ready_i; + DB <= DO; + Systb <= Sync; + Int <= Int_i; + Hold <= not Hold_n; + IntE <= IntE_i; + DBin_n <= not DBin; + Sample <= not Wr_n and Status_i(4); + Wr <= not Wr_n; + AD <= A; + Sounds(0) <= CntE7(3); + Sounds(1) <= CntE7(2); + Sounds(2) <= CntE7(1); + Sounds(3) <= CntE7(0); + Sounds(4) <= CntE6(3); + Sounds(5) <= CntE6(2); + Sounds(6) <= CntE6(1); + Sounds(7) <= CntE6(0); + + IntTrig <= (not CntE7(2) nand CntE7(3)) nand not CntE7(4); + + ISel(0) <= Status_i(0) nor (Status_i(6) nor A(13)); + ISel(1) <= Status_i(0) nor Status_i(6); + + with ISel select + DI <= "110" & CntE7(2) & not CntE7(2) & "111" when "00", + GDB when "01", + IB when "10", + RR(7 downto 0) when others; + + RWE_n <= Wr_n or not (RR(8) xor RR(9)) or not CntD5(2); + RAB <= A(12 downto 0) when CntD5(2) = '1' else + std_logic_vector(CntE7(3 downto 0) & CntE6(3 downto 0) & CntE5(3 downto 0) & CntD5(3)); + + u_8080: T8080se + generic map ( + Mode => 2, + T2Write => 1) + port map ( + RESET_n => Rst_n, + CLK => Clk, + CLKEN => ClkEnCnt(2), + READY => Ready_i, + HOLD => Hold, + INT => Int_i, + INTE => IntE_i, + DBIN => DBin, + SYNC => Sync, + VAIT => Vait, + HLDA => HLDA, + WR_n => Wr_n, + A => A, + DI => DI, + DO => DO); + + -- Clock enables + process (Rst_n, Clk) + begin + if Rst_n = '0' then + ClkEnCnt <= "000"; + VidEn <= '0'; + elsif Clk'event and Clk = '1' then + VidEn <= not VidEn; + if ClkEnCnt = 4 then + ClkEnCnt <= "000"; + else + ClkEnCnt <= ClkEnCnt + 1; + end if; + end if; + end process; + + -- Glue + process (Rst_n, Clk) + variable OldASEL : std_logic; + begin + if Rst_n = '0' then + Status_i <= (others => '0'); + IntTrigOld <= '0'; + Int_i <= '0'; + OldASEL := '0'; + Ready_i <= '0'; + RR <= (others => '0'); + elsif Clk'event and Clk = '1' then + -- E3 + -- Interrupt + IntTrigOld <= IntTrig; + if Status_i(0) = '1' then + Int_i <= '0'; + elsif IntTrigOld = '0' and IntTrig = '1' then + Int_i <= IntE_i; + end if; + + -- D7 + -- Status register + if Sync = '1' then + Status_i <= DO; + end if; + + -- A3, C3, E3 + -- RAM register/ready logic + if Sync = '1' and A(13) = '1' then + Ready_i <= '0'; + elsif Ready_i = '1' then + Ready_i <= '1'; + else + Ready_i <= RR(9); + end if; + if Sync = '1' and A(13) = '1' then + RR <= (others => '0'); + elsif (CntD5(2) = '1' and OldASEL = '0') or -- ASEL pos edge + (CntD5(2) = '0' and OldASEL = '1' and RR(8) = '1') then -- ASEL neg edge + RR(7 downto 0) <= RDB; + RR(8) <= '1'; + RR(9) <= RR(8); + end if; + OldASEL := CntD5(2); + end if; + end process; + + -- Video counters + process (Rst_n, Clk) + begin + if Rst_n = '0' then + CntD5 <= (others => '0'); + CntE5 <= (others => '0'); + CntE6 <= (others => '0'); + CntE7 <= (others => '0'); + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + CntD5 <= CntD5 + 1; + if CntD5 = 15 then + + CntE5 <= CntE5 + 1; + if CntE5(3 downto 0) = 15 then + if CntE5(4) = '0' then + CntE5 <= "11100"; + + CntE6 <= CntE6 + 1; + if CntE6 = 15 then + + CntE7 <= CntE7 + 1; + if CntE7(3 downto 0) = 15 then + if CntE7(4) = '0' then + CntE6 <= "1010"; + CntE7 <= "11101"; + else + CntE7 <= "00010"; + end if; + end if; + end if; + end if; + else + end if; + end if; + end if; + end if; + end process; + + -- Video shift register + process (Rst_n, Clk) + begin + if Rst_n = '0' then + Shift <= (others => '0'); + Video <= '0'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE7(4) = '0' and CntE5(4) = '0' and CntD5(2 downto 0) = "011" then + Shift(7 downto 0) <= RDB(7 downto 0); + else + Shift(6 downto 0) <= Shift(7 downto 1); + Shift(7) <= '0'; + end if; + Video <= Shift(0); + end if; + end if; + end process; + + -- Sync + process (Rst_n, Clk) + begin + if Rst_n = '0' then + HSync <= '1'; + VSync <= '1'; + elsif Clk'event and Clk = '1' then + if VidEn = '1' then + if CntE5(4) = '1' and CntE5(1 downto 0) = "10" then + HSync <= '0'; + else + HSync <= '1'; + end if; + if CntE7(4) = '1' and CntE7(0) = '0' and CntE6(3 downto 2) = "11" then + VSync <= '0'; + else + VSync <= '1'; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/osd.v b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_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/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/pll.qip b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_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 VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/pll.vhd b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/pll.vhd new file mode 100644 index 00000000..b1553aeb --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/pll.vhd @@ -0,0 +1,382 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 10, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 40, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "40.000000" +-- 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 "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: MULT_FACTOR0 NUMERIC "10" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "40" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "10.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "40.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 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_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: 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: 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_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 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 "10" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "40" +-- Retrieval info: CONSTANT: CLK1_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_UNUSED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..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: 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: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/scandoubler.v b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/video_mixer.sv b/Arcade/Midway8080 Hardware/Midway8080v2_Mist/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Midway8080 Hardware/Midway8080v2_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/Arcade/Pacman Hardware/Alibaba_MiST/Alibaba.qpf b/Arcade/Pacman Hardware/Alibaba_MiST/Alibaba.qpf new file mode 100644 index 00000000..351dc40a --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/Alibaba.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Alibaba" diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/Alibaba.qsf b/Arcade/Pacman Hardware/Alibaba_MiST/Alibaba.qsf new file mode 100644 index 00000000..c56bc3c2 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/Alibaba.qsf @@ -0,0 +1,175 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 20:43:12 November 20, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Alibaba_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/pll.v +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/ROM/GFX1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/alibaba.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Alibaba.sv + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Alibaba +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Alibaba) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Alibaba) +# ------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/Alibaba.srf b/Arcade/Pacman Hardware/Alibaba_MiST/Alibaba.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/Alibaba.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/README.txt b/Arcade/Pacman Hardware/Alibaba_MiST/README.txt new file mode 100644 index 00000000..6dda9d12 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Alibaba and 40 thieves for MiST by Gehstock +-- 21 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Alibaba and 40 thieves hardware +-- Copyright (c) Sorgelig +-- Based on Pacman core: Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F1 : Start 1 player +-- F2 : Start 2 players +-- TAB : Skip the level +-- SPACE,CTRL : Action +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/Release/Alibaba.rbf b/Arcade/Pacman Hardware/Alibaba_MiST/Release/Alibaba.rbf new file mode 100644 index 00000000..7716df6d Binary files /dev/null and b/Arcade/Pacman Hardware/Alibaba_MiST/Release/Alibaba.rbf differ diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/clean.bat b/Arcade/Pacman Hardware/Alibaba_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_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/Arcade/Pacman Hardware/Alibaba_MiST/rtl/Alibaba.sv b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/Alibaba.sv new file mode 100644 index 00000000..2d38460a --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/Alibaba.sv @@ -0,0 +1,196 @@ +//============================================================================ +// Arcade: Alibaba +// +// Version for MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Alibaba +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Alibaba;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys, clk_snd; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [9:0] audio; +assign LED = 1; +wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(340), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +//wire m_bomb = kbjoy[8]; +//wire m_Serv = kbjoy[9]; +wire m_skip = kbjoy[9]; + + +alibabat alibabat +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .in0(~{1'b0, m_fire, m_coin, m_skip, m_down,m_right,m_left,m_up}), + .in1(~{1'b0, m_start2, m_start1, 5'b00000}), + + .dipsw1(8'b1_1_00_11_01), + .dipsw2(8'b11111111), + + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..2c141e86 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"33",X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"33",X"33",X"77",X"77",X"77",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"77",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"66",X"77",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"77",X"77",X"77",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"66",X"66",X"66",X"77",X"77",X"77",X"77",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"77",X"77",X"66",X"66",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"77",X"77",X"33",X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"11",X"33",X"33",X"77",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"77",X"77",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"66",X"66",X"66",X"66",X"66",X"66",X"66",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"77",X"77",X"77",X"77",X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00", + X"00",X"00",X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"03", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"11",X"11",X"FF",X"FF",X"FF",X"FF",X"88",X"88",X"CC",X"EE",X"FF",X"FF",X"77",X"11", + X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"EE",X"CC",X"88",X"88",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"11",X"77",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",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"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"66",X"66",X"66",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00", + X"33",X"BB",X"FF",X"EE",X"66",X"66",X"66",X"66",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"11",X"00",X"00",X"00",X"00",X"00",X"EE", + X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"FF",X"00",X"00",X"88",X"88",X"CC",X"EE",X"FF",X"FF", + X"00",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"EE",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33", + X"EE",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"33",X"33",X"33",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"CC",X"EE",X"FF",X"FF",X"FF", + X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"77",X"33",X"22",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"DD",X"00",X"EE",X"DD",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"DD",X"00",X"EE",X"DD",X"00",X"00", + X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"11", + X"66",X"66",X"66",X"66",X"66",X"66",X"66",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"11",X"33",X"33",X"BB",X"FF",X"EE",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"00", + X"11",X"11",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"CC",X"EE",X"FF",X"FF",X"77",X"11",X"00",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"CC",X"88",X"88",X"00",X"00",X"00",X"88",X"88", + X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"11",X"00",X"00",X"00",X"11",X"77",X"FF",X"FF",X"EE", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"88",X"88",X"88",X"88",X"FF",X"FF",X"FF",X"FF", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00",X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00", + X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00",X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00", + X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"00",X"00",X"88",X"44",X"22",X"00",X"88",X"44",X"22",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF", + X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"FF",X"77",X"33",X"33",X"33",X"33",X"33",X"33",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"33",X"33",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00",X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00", + X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00",X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00", + X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00",X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00", + X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00",X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"88",X"22",X"00",X"00",X"00",X"CC",X"EE",X"FF",X"33",X"00",X"00",X"00", + X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC",X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33", + X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"EE",X"22",X"22",X"00",X"11",X"22",X"22",X"22",X"33", + X"AA",X"AA",X"AA",X"22",X"00",X"00",X"00",X"EE",X"22",X"22",X"22",X"11",X"00",X"22",X"22",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22", + X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"33",X"FF",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00", + X"EE",X"EE",X"77",X"33",X"33",X"33",X"33",X"33",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"CC",X"CC",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"FF",X"FF", + X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"88",X"88",X"88",X"88",X"88", + X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF", + X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"CC",X"CC",X"EE",X"EE",X"77",X"33",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"88",X"88",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"11",X"11",X"11",X"11",X"11",X"77",X"FF",X"FF",X"EE",X"CC",X"88",X"88",X"00", + X"00",X"00",X"88",X"EE",X"EE",X"FF",X"FF",X"FF",X"00",X"00",X"11",X"77",X"77",X"FF",X"FF",X"FF", + X"EE",X"EE",X"88",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"11",X"00",X"00",X"00",X"00",X"00", + X"00",X"88",X"88",X"88",X"DD",X"00",X"00",X"00",X"77",X"FF",X"DD",X"88",X"88",X"88",X"CC",X"66", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"DD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"66",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"77",X"FF",X"DD",X"88", + X"00",X"00",X"00",X"00",X"00",X"77",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF", + X"CC",X"CC",X"CC",X"66",X"FF",X"FF",X"FF",X"CC",X"11",X"11",X"00",X"00",X"00",X"00",X"11",X"11", + X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00", + X"CC",X"CC",X"66",X"FF",X"FF",X"FF",X"00",X"EE",X"11",X"00",X"00",X"11",X"11",X"11",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"77", + X"EE",X"EE",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11", + X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"77",X"77",X"33",X"33",X"33",X"33",X"33",X"33", + X"FF",X"FF",X"77",X"00",X"00",X"FF",X"FF",X"FF",X"11",X"00",X"00",X"00",X"00",X"11",X"11",X"11", + X"88",X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"FF",X"FF",X"EE",X"00",X"00",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"CC",X"00",X"22",X"EE",X"22",X"00",X"00",X"88",X"77",X"00",X"00",X"FF",X"44",X"00",X"00", + X"22",X"CC",X"00",X"CC",X"22",X"22",X"22",X"44",X"88",X"77",X"00",X"88",X"DD",X"AA",X"88",X"88", + X"22",X"CC",X"00",X"CC",X"22",X"22",X"22",X"44",X"88",X"77",X"00",X"99",X"AA",X"AA",X"AA",X"EE", + X"22",X"CC",X"00",X"00",X"00",X"EE",X"00",X"00",X"88",X"77",X"00",X"CC",X"BB",X"88",X"88",X"CC", + X"00",X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"00",X"77",X"88",X"88",X"77",X"00",X"77",X"88", + X"CC",X"22",X"22",X"CC",X"00",X"22",X"EE",X"22",X"77",X"88",X"88",X"77",X"00",X"00",X"FF",X"44", + X"66",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"66",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"22",X"CC",X"00",X"22",X"22",X"AA",X"77",X"88",X"88",X"77",X"00",X"66",X"99",X"88", + X"22",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"22",X"77",X"88",X"88",X"77",X"00",X"88",X"DD",X"AA", + X"22",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"EE",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"22",X"77",X"88",X"88",X"77",X"00",X"99",X"AA",X"AA", + X"22",X"CC",X"00",X"CC",X"22",X"22",X"CC",X"00",X"88",X"77",X"00",X"77",X"88",X"88",X"77",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"07",X"0F",X"2D",X"2D",X"78",X"2D",X"00",X"00",X"00",X"04",X"06",X"06",X"07",X"07", + X"00",X"00",X"00",X"08",X"08",X"0C",X"0C",X"0C",X"00",X"0E",X"0F",X"0F",X"E1",X"A5",X"F0",X"A5", + X"2D",X"78",X"2D",X"3C",X"0F",X"07",X"03",X"00",X"07",X"07",X"06",X"06",X"04",X"00",X"00",X"00", + X"0C",X"0C",X"0C",X"08",X"08",X"00",X"00",X"00",X"A5",X"F0",X"A5",X"A5",X"0F",X"0F",X"0E",X"00", + X"00",X"00",X"00",X"04",X"06",X"06",X"07",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0E",X"0F",X"0F",X"E1",X"A5",X"F0",X"A5",X"00",X"03",X"07",X"0F",X"2D",X"2D",X"78",X"2D", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"66",X"EE",X"6E",X"08",X"08", + X"07",X"07",X"06",X"06",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A5",X"F0",X"A5",X"A5",X"0F",X"3F",X"3F",X"00",X"2D",X"78",X"2D",X"3C",X"0F",X"07",X"03",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"4C",X"4C",X"44",X"EE",X"EE",X"00", + X"00",X"77",X"FF",X"FF",X"9F",X"9F",X"FF",X"FF",X"00",X"30",X"70",X"70",X"70",X"F0",X"96",X"96", + X"00",X"22",X"22",X"EE",X"EE",X"88",X"88",X"88",X"00",X"EE",X"FF",X"FF",X"FF",X"FF",X"F9",X"F9", + X"9F",X"9F",X"FF",X"FF",X"77",X"11",X"FF",X"00",X"F0",X"70",X"70",X"70",X"30",X"77",X"77",X"77", + X"88",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"EE",X"00",X"00",X"00", + X"00",X"70",X"F0",X"F0",X"F0",X"F7",X"F7",X"F2",X"00",X"00",X"10",X"30",X"30",X"70",X"70",X"70", + X"00",X"66",X"66",X"66",X"E6",X"E6",X"80",X"88",X"00",X"C0",X"E0",X"F0",X"87",X"A5",X"A5",X"B7", + X"F2",X"F7",X"F7",X"F0",X"F0",X"F0",X"70",X"00",X"70",X"70",X"70",X"30",X"30",X"10",X"00",X"00", + X"88",X"80",X"E6",X"E6",X"66",X"66",X"66",X"00",X"B7",X"A5",X"A5",X"87",X"F0",X"E0",X"C0",X"00", + X"00",X"03",X"07",X"0F",X"2D",X"2D",X"78",X"2D",X"00",X"00",X"00",X"04",X"06",X"06",X"07",X"07", + X"00",X"00",X"00",X"08",X"08",X"0C",X"0C",X"0C",X"00",X"0E",X"0F",X"0F",X"E1",X"A5",X"F0",X"A5", + X"2D",X"78",X"2D",X"3C",X"0F",X"07",X"03",X"00",X"07",X"07",X"06",X"06",X"04",X"00",X"00",X"00", + X"0C",X"0C",X"0C",X"08",X"08",X"00",X"00",X"00",X"A5",X"F0",X"A5",X"A5",X"0F",X"0F",X"0E",X"00", + X"22",X"C4",X"48",X"BF",X"48",X"E4",X"B2",X"11",X"99",X"D5",X"72",X"30",X"63",X"F6",X"BB",X"11", + X"EE",X"AA",X"FF",X"AA",X"AA",X"FF",X"AA",X"AA",X"22",X"22",X"77",X"22",X"22",X"77",X"22",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"EE",X"00",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"EE",X"00",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",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"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE", + X"00",X"00",X"00",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",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"00",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF", + X"77",X"77",X"77",X"77",X"77",X"00",X"77",X"77",X"77",X"77",X"00",X"77",X"77",X"77",X"77",X"77", + X"77",X"77",X"77",X"77",X"77",X"00",X"77",X"77",X"77",X"77",X"00",X"77",X"77",X"77",X"77",X"77", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77", + X"77",X"77",X"77",X"77",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77",X"00",X"77",X"77",X"77", + X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"77", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE", + X"00",X"77",X"77",X"77",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77",X"77",X"00",X"77", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"77", + X"77",X"77",X"77",X"77",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF", + X"77",X"77",X"77",X"77",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77",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"00",X"FF",X"FF",X"FF",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE", + X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE", + X"00",X"77",X"77",X"77",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77",X"77",X"77",X"00",X"77", + X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"00",X"77", + 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"00",X"FF",X"FF",X"FF", + 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"00",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",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"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77",X"77",X"77",X"00",X"77", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77",X"77",X"77",X"00",X"77", + X"00",X"00",X"00",X"00",X"33",X"74",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"00",X"00",X"00",X"00",X"DD",X"DD",X"DD",X"DD", + X"00",X"DD",X"DD",X"DD",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",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"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"77", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"66",X"66",X"66",X"EE",X"6E",X"08",X"08",X"00",X"00",X"00",X"04",X"06",X"06",X"07",X"07", + X"00",X"03",X"07",X"0F",X"0D",X"2D",X"78",X"2D",X"00",X"0E",X"0F",X"0F",X"E1",X"A5",X"F0",X"A5", + X"08",X"08",X"4C",X"4C",X"44",X"EE",X"EE",X"00",X"07",X"07",X"06",X"06",X"04",X"00",X"00",X"00", + X"2D",X"78",X"2D",X"3C",X"0F",X"07",X"03",X"00",X"A5",X"F0",X"A5",X"A5",X"0F",X"3F",X"3F",X"00", + X"00",X"EE",X"EE",X"4C",X"4C",X"4C",X"08",X"08",X"00",X"00",X"00",X"04",X"06",X"06",X"07",X"07", + X"00",X"03",X"07",X"0F",X"2D",X"2D",X"78",X"2D",X"00",X"3F",X"3F",X"0F",X"E1",X"A5",X"F0",X"A5", + X"08",X"08",X"6E",X"EE",X"66",X"66",X"66",X"00",X"07",X"07",X"06",X"06",X"04",X"00",X"00",X"00", + X"2D",X"78",X"2D",X"3C",X"0F",X"07",X"03",X"00",X"A5",X"F0",X"A5",X"A5",X"0F",X"0F",X"0E",X"00", + X"00",X"22",X"22",X"6E",X"6E",X"08",X"08",X"00",X"EE",X"33",X"EE",X"00",X"00",X"11",X"11",X"11", + X"00",X"FF",X"11",X"77",X"EF",X"CF",X"DF",X"FF",X"00",X"CC",X"CF",X"9E",X"BC",X"AD",X"AD",X"AD", + X"00",X"08",X"08",X"6E",X"6E",X"22",X"22",X"00",X"11",X"11",X"11",X"00",X"00",X"EE",X"33",X"EE", + X"FF",X"DF",X"CF",X"EF",X"77",X"11",X"FF",X"00",X"AD",X"AD",X"AD",X"BC",X"9E",X"CF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"EE",X"88",X"08",X"08",X"00",X"00",X"11",X"33",X"33",X"77",X"77",X"77", + X"00",X"77",X"FF",X"FF",X"FF",X"BF",X"BF",X"FF",X"00",X"CC",X"EE",X"FF",X"FF",X"FF",X"8F",X"BC", + X"08",X"08",X"88",X"EE",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"FF",X"BF",X"BF",X"FF",X"FF",X"FF",X"77",X"00",X"BC",X"8F",X"FF",X"FF",X"FF",X"EE",X"CC",X"00", + X"00",X"20",X"A0",X"A0",X"A0",X"E0",X"E0",X"A4",X"00",X"00",X"22",X"11",X"00",X"00",X"66",X"00", + X"00",X"44",X"44",X"00",X"66",X"FF",X"FF",X"FF",X"00",X"00",X"30",X"70",X"F1",X"F3",X"F2",X"F0", + X"A4",X"E0",X"E0",X"A0",X"A0",X"A0",X"20",X"00",X"00",X"22",X"44",X"00",X"11",X"00",X"00",X"00", + X"66",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"F0",X"F2",X"73",X"71",X"70",X"30",X"00",X"00", + X"00",X"02",X"0A",X"0A",X"0A",X"0E",X"0E",X"4A",X"00",X"00",X"22",X"11",X"00",X"00",X"66",X"00", + X"00",X"44",X"44",X"00",X"66",X"FF",X"FF",X"FF",X"00",X"00",X"03",X"07",X"1E",X"3C",X"2D",X"0F", + X"4A",X"0E",X"0E",X"0A",X"0A",X"0A",X"02",X"00",X"00",X"22",X"44",X"00",X"11",X"00",X"00",X"00", + X"66",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"0F",X"2D",X"34",X"16",X"07",X"03",X"00",X"00", + X"00",X"02",X"0A",X"0A",X"0A",X"0E",X"0E",X"4E",X"00",X"00",X"22",X"11",X"00",X"00",X"66",X"00", + X"00",X"44",X"44",X"00",X"66",X"FF",X"FF",X"FF",X"00",X"00",X"03",X"07",X"0E",X"0C",X"0D",X"0F", + X"4E",X"0E",X"0E",X"0A",X"0A",X"0A",X"02",X"00",X"00",X"22",X"44",X"00",X"11",X"00",X"00",X"00", + X"66",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"0F",X"0D",X"04",X"06",X"07",X"03",X"00",X"00", + X"66",X"22",X"0E",X"4A",X"C2",X"86",X"84",X"84",X"00",X"00",X"22",X"11",X"00",X"00",X"66",X"00", + X"00",X"44",X"44",X"00",X"66",X"FF",X"FF",X"FF",X"00",X"00",X"33",X"67",X"AF",X"AF",X"AF",X"EF", + X"84",X"84",X"86",X"C2",X"4A",X"0E",X"22",X"66",X"00",X"22",X"44",X"00",X"11",X"00",X"00",X"00", + X"66",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"EF",X"AF",X"AF",X"AF",X"67",X"33",X"00",X"00", + X"00",X"00",X"00",X"08",X"3F",X"3F",X"08",X"08",X"00",X"00",X"11",X"33",X"33",X"33",X"77",X"74", + X"00",X"03",X"8F",X"8F",X"AD",X"AD",X"F8",X"AD",X"00",X"0E",X"0F",X"0F",X"E1",X"A5",X"F0",X"A5", + X"08",X"08",X"3F",X"3F",X"08",X"00",X"00",X"00",X"74",X"77",X"33",X"33",X"33",X"11",X"00",X"00", + X"AD",X"F8",X"AD",X"BC",X"8F",X"8F",X"03",X"00",X"A5",X"F0",X"A5",X"A5",X"0F",X"0F",X"0E",X"00", + X"00",X"33",X"33",X"3B",X"3F",X"3F",X"08",X"08",X"00",X"00",X"11",X"33",X"33",X"33",X"77",X"74", + X"00",X"03",X"8F",X"8F",X"AD",X"AD",X"F8",X"AD",X"00",X"0E",X"0F",X"0F",X"E1",X"A5",X"F0",X"A5", + X"08",X"08",X"3F",X"3F",X"3B",X"33",X"33",X"00",X"74",X"77",X"33",X"33",X"33",X"11",X"00",X"00", + X"AD",X"F8",X"AD",X"BC",X"8F",X"8F",X"03",X"00",X"A5",X"F0",X"A5",X"A5",X"0F",X"0F",X"0E",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"7F",X"3F",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"33",X"77",X"FF",X"FF",X"EF",X"EF", + X"3F",X"3F",X"BF",X"FF",X"FF",X"FF",X"FF",X"FF",X"10",X"10",X"10",X"30",X"30",X"21",X"30",X"30", + X"F0",X"F0",X"F0",X"F0",X"3C",X"1E",X"3C",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"77",X"77",X"77",X"11",X"11",X"DD",X"DD", + X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"FF",X"FF",X"FF",X"FC",X"FC",X"FC",X"FF", + X"FF",X"FF",X"FF",X"FF",X"F3",X"F3",X"F3",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"BF",X"3F",X"3F",X"3F",X"7F",X"FF",X"FF",X"FF",X"10",X"10",X"10",X"10",X"10",X"10",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"FF",X"EF",X"EF",X"FF",X"FF",X"77", + X"FF",X"FF",X"77",X"FF",X"FF",X"00",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77", + X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"33",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00", + X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"DD",X"DD",X"11",X"11",X"77", + X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",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"1F",X"1F",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"33",X"77",X"FF",X"FF",X"8F",X"8F", + X"1F",X"1F",X"1F",X"9F",X"FF",X"FF",X"FF",X"9F",X"10",X"10",X"10",X"30",X"30",X"21",X"30",X"30", + X"F0",X"F0",X"F0",X"F0",X"3C",X"1E",X"3C",X"F0",X"CF",X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"00",X"FF",X"FF",X"FC",X"FC",X"FC",X"FC",X"FC", + X"00",X"CC",X"EE",X"F3",X"F3",X"F3",X"F3",X"F3",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"EE", + X"66",X"EE",X"EE",X"EE",X"EE",X"00",X"EE",X"EE",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"FF",X"FF",X"FF",X"DD",X"CC",X"CC",X"CC",X"DD", + X"1F",X"1F",X"1F",X"1F",X"1F",X"FF",X"FF",X"FF",X"10",X"10",X"10",X"10",X"10",X"10",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"EF",X"CF",X"8F",X"8F",X"FF",X"FF",X"77", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"66",X"66",X"00",X"00",X"00",X"00",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"FF",X"FF",X"FF",X"EE",X"CC",X"88",X"00",X"00", + X"CC",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"CC",X"FF",X"FF",X"EE",X"FF",X"FF",X"00",X"00",X"00", + X"EE",X"DD",X"11",X"FF",X"FF",X"11",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"33", + X"00",X"00",X"11",X"77",X"FF",X"FF",X"FF",X"FF",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"CF",X"CF",X"CF",X"CF",X"CF",X"33",X"33",X"33",X"77",X"77",X"77",X"77",X"77", + X"FF",X"0F",X"9E",X"DE",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"F1",X"F1",X"1F",X"9F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"CC",X"EE",X"EE",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"7F",X"7F", + X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"8F",X"8F",X"FF",X"FF",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC", + X"CF",X"CF",X"CF",X"CF",X"CF",X"FF",X"FF",X"FF",X"77",X"77",X"77",X"77",X"77",X"33",X"33",X"33", + X"FF",X"FF",X"FF",X"FF",X"DE",X"9E",X"0F",X"FF",X"FF",X"FF",X"9F",X"1F",X"F1",X"F1",X"1F",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"33",X"11",X"11",X"11",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"77",X"11",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"7F",X"7F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF", + X"8F",X"8F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"FF", + 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"CC",X"00", + X"FF",X"FF",X"EE",X"EE",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"CF",X"CF",X"CF",X"CF",X"CF",X"FC",X"CF",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"33", + X"00",X"00",X"11",X"77",X"FF",X"CF",X"CF",X"9E",X"00",X"77",X"FF",X"FF",X"FF",X"0F",X"0F",X"F0", + X"CF",X"CF",X"CF",X"CF",X"FC",X"CF",X"CF",X"CF",X"33",X"33",X"33",X"33",X"77",X"77",X"77",X"77", + X"9E",X"9E",X"9E",X"9E",X"CF",X"CF",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"FF",X"FF", + X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"00",X"2D",X"2D",X"2D",X"2D",X"2D",X"F0",X"2D", + X"00",X"1F",X"1F",X"1F",X"1F",X"1F",X"F1",X"1F",X"00",X"88",X"88",X"88",X"88",X"88",X"FF",X"FF", + X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"2D",X"2D",X"2D",X"2D",X"F0",X"2D",X"2D",X"2D", + X"1F",X"1F",X"1F",X"1F",X"F1",X"1F",X"1F",X"1F",X"FF",X"FF",X"88",X"88",X"88",X"88",X"88",X"88", + X"CF",X"CF",X"CF",X"FC",X"CF",X"CF",X"CF",X"CF",X"77",X"77",X"77",X"77",X"33",X"33",X"33",X"33", + X"FF",X"FF",X"CF",X"CF",X"9E",X"9E",X"9E",X"9E",X"FF",X"FF",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0", + X"CF",X"FC",X"CF",X"CF",X"CF",X"CF",X"CF",X"00",X"33",X"11",X"11",X"11",X"00",X"00",X"00",X"00", + X"9E",X"CF",X"CF",X"FF",X"77",X"11",X"00",X"00",X"F0",X"0F",X"0F",X"FF",X"FF",X"FF",X"77",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"2D",X"2D",X"2D",X"F0",X"2D",X"2D",X"2D",X"2D", + X"1F",X"1F",X"1F",X"F1",X"1F",X"1F",X"1F",X"1F",X"88",X"88",X"88",X"88",X"88",X"88",X"FF",X"FF", + X"EE",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"2D",X"F0",X"2D",X"2D",X"2D",X"2D",X"2D",X"00", + X"1F",X"F1",X"1F",X"1F",X"1F",X"1F",X"1F",X"00",X"FF",X"FF",X"88",X"88",X"88",X"88",X"88",X"00", + X"00",X"AA",X"AA",X"EE",X"EE",X"88",X"88",X"88",X"00",X"00",X"11",X"33",X"23",X"67",X"77",X"77", + X"00",X"67",X"EF",X"3E",X"E3",X"E3",X"3E",X"EF",X"00",X"4B",X"4B",X"F0",X"4B",X"4B",X"F0",X"4B", + X"88",X"88",X"88",X"EE",X"EE",X"AA",X"AA",X"00",X"77",X"77",X"67",X"23",X"33",X"11",X"00",X"00", + X"EF",X"3E",X"E3",X"E3",X"3E",X"EF",X"67",X"00",X"4B",X"F0",X"4B",X"4B",X"F0",X"4B",X"4B",X"00", + X"00",X"00",X"00",X"00",X"EE",X"08",X"08",X"08",X"00",X"00",X"11",X"33",X"23",X"77",X"77",X"77", + X"00",X"77",X"FF",X"FF",X"3F",X"E3",X"AF",X"EF",X"00",X"CC",X"EE",X"FF",X"FF",X"0F",X"0F",X"6F", + X"08",X"08",X"08",X"EE",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"23",X"33",X"11",X"00",X"00", + X"EF",X"AF",X"E3",X"3F",X"FF",X"FF",X"77",X"00",X"6F",X"0F",X"0F",X"FF",X"FF",X"EE",X"CC",X"00", + X"00",X"66",X"66",X"66",X"E6",X"E6",X"08",X"08",X"00",X"00",X"10",X"30",X"30",X"70",X"70",X"70", + X"00",X"70",X"F0",X"F0",X"F0",X"F7",X"F7",X"F2",X"00",X"C0",X"E0",X"F0",X"F0",X"F0",X"87",X"B4", + X"08",X"08",X"C0",X"C0",X"40",X"EE",X"EE",X"00",X"70",X"70",X"70",X"30",X"30",X"10",X"00",X"00", + X"F2",X"F7",X"F7",X"F0",X"F0",X"F0",X"70",X"00",X"B4",X"87",X"F0",X"F0",X"F0",X"F3",X"F3",X"00", + X"00",X"EE",X"EE",X"40",X"48",X"48",X"08",X"08",X"00",X"00",X"10",X"30",X"30",X"70",X"70",X"70", + X"00",X"70",X"F0",X"F0",X"F0",X"F7",X"F7",X"F2",X"00",X"F3",X"F3",X"F0",X"87",X"B4",X"B4",X"B4", + X"08",X"08",X"6E",X"6E",X"66",X"66",X"00",X"00",X"70",X"70",X"70",X"30",X"30",X"10",X"00",X"00", + X"F2",X"F7",X"F7",X"F0",X"F0",X"F0",X"70",X"00",X"B4",X"B4",X"B4",X"87",X"F0",X"E0",X"C0",X"00", + X"00",X"66",X"66",X"66",X"6E",X"6E",X"80",X"80",X"00",X"00",X"01",X"03",X"03",X"07",X"07",X"07", + X"00",X"07",X"0F",X"0F",X"FF",X"F8",X"F8",X"FD",X"00",X"0C",X"0E",X"0F",X"8F",X"8F",X"F8",X"CB", + X"80",X"80",X"4C",X"4C",X"04",X"EE",X"EE",X"00",X"07",X"07",X"07",X"03",X"03",X"01",X"00",X"00", + X"FD",X"F8",X"F8",X"FF",X"0F",X"0F",X"07",X"00",X"CB",X"F8",X"8F",X"8F",X"0F",X"3F",X"3F",X"00", + X"00",X"EE",X"EE",X"04",X"0C",X"0C",X"80",X"80",X"00",X"00",X"01",X"03",X"03",X"07",X"07",X"07", + X"00",X"07",X"0F",X"0F",X"FF",X"F8",X"F8",X"FD",X"00",X"3F",X"3F",X"0F",X"8F",X"8F",X"F8",X"CB", + X"80",X"80",X"6E",X"6E",X"66",X"66",X"66",X"00",X"07",X"07",X"07",X"03",X"03",X"01",X"00",X"00", + X"FD",X"F8",X"F8",X"FF",X"0F",X"0F",X"07",X"00",X"CB",X"F8",X"8F",X"8F",X"0F",X"0E",X"0C",X"00", + X"00",X"66",X"66",X"66",X"E6",X"E6",X"80",X"80",X"00",X"00",X"01",X"03",X"03",X"07",X"07",X"07", + X"00",X"07",X"0F",X"0F",X"0F",X"08",X"08",X"0D",X"00",X"0C",X"0E",X"3C",X"78",X"78",X"78",X"7B", + X"80",X"80",X"84",X"84",X"04",X"EE",X"EE",X"00",X"07",X"07",X"07",X"03",X"03",X"01",X"00",X"00", + X"0D",X"08",X"08",X"0F",X"0F",X"0F",X"07",X"00",X"7B",X"78",X"78",X"78",X"3C",X"3F",X"3F",X"00", + X"00",X"EE",X"EE",X"04",X"84",X"84",X"80",X"80",X"00",X"00",X"01",X"03",X"03",X"07",X"07",X"07", + X"00",X"07",X"0F",X"0F",X"0F",X"08",X"08",X"0D",X"00",X"3F",X"3F",X"3C",X"78",X"78",X"78",X"7B", + X"80",X"80",X"E6",X"E6",X"66",X"66",X"66",X"00",X"07",X"07",X"07",X"03",X"03",X"01",X"00",X"00", + X"0D",X"08",X"08",X"0F",X"0F",X"0F",X"07",X"00",X"7B",X"78",X"78",X"78",X"3C",X"0E",X"0C",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"06",X"09",X"08",X"08",X"06",X"02",X"0C",X"00",X"02",X"02",X"0A",X"06",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"00",X"0F",X"04",X"02",X"01",X"02",X"0C",X"00",X"08",X"0E",X"08",X"08",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"06",X"09",X"09",X"09",X"06",X"02",X"0C",X"00",X"0C",X"02",X"02",X"02",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"0E",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"EE",X"88",X"88",X"88",X"00",X"30",X"70",X"70",X"70",X"F0",X"96",X"96", + X"00",X"77",X"FF",X"FF",X"9F",X"9F",X"FF",X"FF",X"00",X"EE",X"FF",X"FF",X"FF",X"FF",X"F9",X"F9", + X"88",X"EE",X"88",X"00",X"00",X"00",X"00",X"00",X"F0",X"70",X"70",X"70",X"30",X"77",X"77",X"77", + X"9F",X"9F",X"FF",X"FF",X"77",X"11",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"EE",X"00",X"00",X"00", + X"00",X"22",X"AA",X"EE",X"EE",X"88",X"88",X"88",X"00",X"30",X"70",X"70",X"70",X"F0",X"96",X"96", + X"00",X"77",X"FF",X"8F",X"CF",X"EF",X"FF",X"FF",X"00",X"EE",X"FF",X"F8",X"F8",X"F8",X"F8",X"F8", + X"88",X"EE",X"EE",X"AA",X"22",X"CC",X"CC",X"CC",X"F0",X"70",X"70",X"70",X"30",X"00",X"00",X"00", + X"EF",X"CF",X"8F",X"FF",X"77",X"11",X"00",X"00",X"F8",X"F8",X"F8",X"FF",X"EE",X"99",X"FF",X"11", + X"00",X"22",X"22",X"22",X"66",X"CC",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"30",X"21", + X"00",X"00",X"D1",X"F3",X"F3",X"E3",X"E3",X"7B",X"00",X"EE",X"FF",X"FD",X"FD",X"FD",X"FD",X"FD", + X"00",X"00",X"CC",X"66",X"22",X"22",X"22",X"00",X"21",X"30",X"10",X"10",X"10",X"00",X"00",X"00", + X"7B",X"E3",X"E3",X"F3",X"F3",X"D1",X"00",X"00",X"FD",X"FD",X"FD",X"FD",X"FD",X"FF",X"EE",X"00", + X"00",X"66",X"AA",X"EE",X"E6",X"E6",X"E6",X"E6",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"30",X"70",X"70",X"70",X"F0",X"96",X"00",X"33",X"77",X"FF",X"DF",X"9F",X"BF",X"FF", + X"E6",X"E6",X"E6",X"E6",X"EE",X"AA",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"96",X"F0",X"70",X"70",X"70",X"30",X"00",X"00",X"FF",X"BF",X"9F",X"DF",X"FF",X"77",X"33",X"00", + X"00",X"66",X"22",X"AA",X"EE",X"E6",X"E6",X"E6",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"10",X"10",X"30",X"21",X"00",X"00",X"C0",X"D1",X"F3",X"F3",X"F3",X"7B", + X"E6",X"E6",X"E6",X"EE",X"AA",X"22",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"21",X"30",X"10",X"10",X"10",X"00",X"00",X"00",X"7B",X"F3",X"F3",X"F3",X"D1",X"C0",X"00",X"00", + X"00",X"66",X"22",X"22",X"EE",X"EA",X"EA",X"EA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"70",X"70",X"F0",X"96", + X"EA",X"EA",X"EA",X"EE",X"22",X"22",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"96",X"F0",X"70",X"70",X"70",X"30",X"00",X"00", + X"00",X"00",X"60",X"E0",X"E0",X"E0",X"E0",X"2C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10", + X"2C",X"E0",X"E0",X"E0",X"E0",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"44",X"44",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"30",X"70",X"70",X"70",X"F0",X"96", + X"00",X"00",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"96",X"F0",X"70",X"70",X"70",X"30",X"00",X"00", + X"00",X"00",X"00",X"22",X"22",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"10",X"10",X"30",X"21",X"00",X"00",X"C0",X"C0",X"C0",X"F3",X"C0",X"48", + X"00",X"00",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"21",X"30",X"10",X"10",X"10",X"00",X"00",X"00",X"48",X"C0",X"F3",X"C0",X"C0",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"22",X"44",X"11",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"11",X"00",X"00",X"00",X"11",X"99",X"44",X"00",X"00", + X"00",X"22",X"11",X"88",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"22",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"22",X"22",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..17522bd2 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,32 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"03", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"05",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"07", + X"00",X"00",X"00",X"00",X"00",X"0B",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"0E",X"00",X"01",X"0C",X"0F", + X"00",X"0E",X"00",X"0B",X"00",X"0C",X"0B",X"0E",X"00",X"0C",X"0F",X"01",X"00",X"00",X"00",X"00", + X"00",X"01",X"02",X"0F",X"00",X"07",X"0C",X"02",X"00",X"09",X"06",X"0F",X"00",X"0D",X"0C",X"0F", + X"00",X"05",X"03",X"09",X"00",X"0F",X"0B",X"00",X"00",X"0E",X"00",X"0B",X"00",X"0E",X"00",X"0B", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0E",X"01",X"00",X"0F",X"0B",X"0E",X"00",X"0E",X"00",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin + data <= rom_data(to_integer(unsigned(addr))); +end architecture; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..88b2ecb3 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"66",X"EF",X"00",X"F8",X"EA",X"6F",X"00",X"3F",X"00",X"C9",X"38",X"AA",X"AF",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..641f10b9 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F3",X"C3",X"72",X"06",X"89",X"CD",X"45",X"AB",X"C3",X"B3",X"03",X"66",X"C3",X"FD",X"A6",X"11", + X"C3",X"86",X"06",X"AB",X"27",X"65",X"22",X"A7",X"C3",X"10",X"1A",X"01",X"22",X"A9",X"32",X"66", + X"C3",X"CF",X"24",X"9A",X"26",X"95",X"00",X"21",X"C3",X"2D",X"2D",X"99",X"67",X"ED",X"C9",X"6A", + X"C3",X"68",X"00",X"56",X"21",X"B7",X"23",X"10",X"C3",X"1C",X"8E",X"56",X"5E",X"DB",X"12",X"00", + X"36",X"02",X"C3",X"33",X"2D",X"03",X"01",X"01",X"00",X"02",X"00",X"04",X"01",X"02",X"01",X"03", + X"00",X"04",X"01",X"03",X"02",X"04",X"01",X"04",X"02",X"03",X"02",X"05",X"01",X"05",X"00",X"03", + X"02",X"06",X"02",X"05",X"01",X"C3",X"2D",X"20",X"11",X"90",X"4C",X"06",X"10",X"1A",X"A7",X"20", + X"0A",X"E1",X"06",X"03",X"7E",X"12",X"23",X"1C",X"10",X"FA",X"E9",X"1C",X"1C",X"1C",X"10",X"ED", + X"C9",X"CA",X"C3",X"1D",X"3A",X"00",X"4E",X"FE",X"03",X"CA",X"25",X"1E",X"C3",X"C3",X"1D",X"03", + X"03",X"03",X"02",X"05",X"02",X"03",X"03",X"06",X"02",X"05",X"02",X"03",X"03",X"06",X"02",X"05", + X"00",X"03",X"04",X"07",X"02",X"05",X"01",X"03",X"04",X"03",X"02",X"05",X"02",X"03",X"04",X"06", + X"02",X"05",X"02",X"03",X"05",X"07",X"02",X"05",X"00",X"03",X"05",X"07",X"02",X"05",X"02",X"03", + X"05",X"05",X"02",X"05",X"01",X"03",X"06",X"07",X"02",X"05",X"02",X"03",X"06",X"07",X"02",X"05", + X"02",X"03",X"06",X"08",X"02",X"05",X"02",X"03",X"06",X"A7",X"66",X"12",X"99",X"6E",X"4C",X"19", + X"4A",X"89",X"CE",X"6E",X"AA",X"9A",X"A6",X"06",X"04",X"11",X"FC",X"4D",X"21",X"22",X"4C",X"1A", + X"A7",X"CA",X"13",X"01",X"D5",X"5F",X"16",X"00",X"19",X"3A",X"C0",X"4D",X"A7",X"3E",X"00",X"20", + X"02",X"3E",X"04",X"4F",X"CD",X"25",X"01",X"79",X"0E",X"03",X"28",X"01",X"81",X"77",X"23",X"3E", + X"01",X"77",X"D1",X"13",X"05",X"C2",X"EC",X"00",X"C3",X"AD",X"8E",X"21",X"50",X"1D",X"3E",X"01", + X"32",X"1F",X"4E",X"C9",X"00",X"C5",X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E",X"A1",X"C1",X"C9", + X"20",X"04",X"3E",X"00",X"18",X"02",X"3E",X"04",X"77",X"23",X"3E",X"01",X"77",X"D1",X"13",X"05", + X"20",X"DE",X"3A",X"E4",X"4D",X"FE",X"01",X"28",X"03",X"CD",X"9E",X"84",X"C3",X"76",X"01",X"4C", + X"32",X"29",X"4C",X"C3",X"76",X"01",X"07",X"02",X"05",X"02",X"03",X"07",X"08",X"02",X"05",X"02", + X"03",X"07",X"08",X"02",X"06",X"02",X"03",X"07",X"08",X"02",X"95",X"69",X"48",X"01",X"89",X"06", + X"84",X"05",X"C9",X"45",X"49",X"0D",X"21",X"22",X"4C",X"11",X"F2",X"4E",X"01",X"0C",X"00",X"ED", + X"B0",X"21",X"32",X"4C",X"11",X"52",X"50",X"01",X"0C",X"00",X"ED",X"B0",X"CD",X"DC",X"01",X"CD", + X"A7",X"81",X"CD",X"A0",X"A1",X"3A",X"00",X"4E",X"A7",X"28",X"12",X"CD",X"9D",X"03",X"CD",X"90", + X"14",X"CD",X"1F",X"14",X"CD",X"67",X"02",X"CD",X"AD",X"02",X"CD",X"FD",X"02",X"3A",X"00",X"4E", + X"3D",X"20",X"06",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"CD",X"50",X"80",X"CD",X"5B",X"3C",X"FD", + X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"3A",X"00",X"4E",X"A7",X"28",X"08",X"3A",X"40",X"50",X"E6", + X"10",X"00",X"00",X"00",X"3E",X"01",X"32",X"C2",X"50",X"FB",X"F1",X"C9",X"21",X"84",X"4C",X"34", + X"23",X"35",X"23",X"11",X"19",X"02",X"01",X"01",X"04",X"34",X"7E",X"E6",X"0F",X"EB",X"BE",X"20", + X"13",X"0C",X"1A",X"C6",X"10",X"E6",X"F0",X"12",X"23",X"BE",X"20",X"08",X"0C",X"EB",X"36",X"00", + X"23",X"13",X"10",X"E5",X"21",X"8A",X"4C",X"71",X"2C",X"7E",X"87",X"87",X"86",X"3C",X"77",X"2C", + X"7E",X"87",X"86",X"87",X"87",X"86",X"3C",X"77",X"C9",X"06",X"A0",X"0A",X"60",X"0A",X"60",X"0A", + X"A0",X"CD",X"CD",X"4C",X"5E",X"26",X"48",X"69",X"2D",X"DC",X"6C",X"4A",X"2C",X"6E",X"4A",X"86", + X"21",X"45",X"00",X"11",X"30",X"90",X"01",X"1F",X"00",X"ED",X"B0",X"21",X"8F",X"00",X"11",X"50", + X"90",X"01",X"49",X"00",X"ED",X"B0",X"21",X"56",X"01",X"11",X"9A",X"90",X"01",X"13",X"00",X"ED", + X"B0",X"3A",X"13",X"4E",X"DD",X"21",X"30",X"90",X"C3",X"3E",X"A3",X"28",X"91",X"96",X"A5",X"6C", + X"6E",X"80",X"2D",X"EF",X"1C",X"83",X"C9",X"3A",X"6E",X"4E",X"FE",X"99",X"17",X"32",X"06",X"50", + X"1F",X"D0",X"3A",X"00",X"50",X"CD",X"BA",X"03",X"3A",X"66",X"4E",X"17",X"E6",X"0F",X"32",X"66", + X"4E",X"D6",X"0C",X"CC",X"DF",X"02",X"CB",X"00",X"3A",X"67",X"4E",X"17",X"E6",X"0F",X"32",X"67", + X"4E",X"D6",X"0C",X"C2",X"9A",X"02",X"21",X"69",X"4E",X"34",X"CB",X"00",X"3A",X"68",X"4E",X"17", + X"E6",X"0F",X"32",X"68",X"4E",X"D6",X"0C",X"C0",X"21",X"69",X"4E",X"34",X"C9",X"3A",X"69",X"4E", + X"A7",X"C8",X"47",X"3A",X"6A",X"4E",X"5F",X"FE",X"00",X"C2",X"C4",X"02",X"3E",X"01",X"32",X"07", + X"50",X"CD",X"DF",X"02",X"7B",X"FE",X"08",X"C2",X"CE",X"02",X"AF",X"32",X"07",X"50",X"1C",X"7B", + X"32",X"6A",X"4E",X"D6",X"10",X"C0",X"32",X"6A",X"4E",X"05",X"78",X"32",X"69",X"4E",X"C9",X"3A", + X"6B",X"4E",X"21",X"6C",X"4E",X"34",X"96",X"C0",X"77",X"3A",X"6D",X"4E",X"21",X"6E",X"4E",X"86", + X"27",X"D2",X"F6",X"02",X"3E",X"99",X"77",X"CD",X"83",X"86",X"C9",X"FF",X"FF",X"21",X"CE",X"4D", + X"34",X"7E",X"E6",X"0F",X"20",X"1F",X"7E",X"0F",X"0F",X"0F",X"0F",X"47",X"3A",X"D6",X"4D",X"2F", + X"B0",X"4F",X"3A",X"6E",X"4E",X"D6",X"01",X"30",X"02",X"AF",X"4F",X"28",X"01",X"79",X"32",X"05", + X"50",X"79",X"32",X"04",X"50",X"DD",X"21",X"D8",X"43",X"FD",X"21",X"C5",X"43",X"3A",X"00",X"4E", + X"FE",X"03",X"CA",X"44",X"03",X"3A",X"03",X"4E",X"FE",X"02",X"D2",X"44",X"03",X"CD",X"69",X"03", + X"CD",X"76",X"03",X"C9",X"C3",X"38",X"82",X"A7",X"3A",X"CE",X"4D",X"C2",X"59",X"03",X"CB",X"67", + X"CC",X"69",X"03",X"C4",X"83",X"03",X"C3",X"61",X"03",X"CB",X"67",X"CC",X"76",X"03",X"C4",X"90", + X"03",X"3A",X"70",X"4E",X"A7",X"CC",X"90",X"03",X"C9",X"DD",X"36",X"00",X"50",X"DD",X"36",X"01", + X"55",X"DD",X"36",X"02",X"31",X"C9",X"FD",X"36",X"00",X"50",X"FD",X"36",X"01",X"55",X"FD",X"36", + X"02",X"32",X"C9",X"DD",X"36",X"00",X"40",X"DD",X"36",X"01",X"40",X"DD",X"36",X"02",X"40",X"C9", + X"FD",X"36",X"00",X"40",X"FD",X"36",X"01",X"40",X"FD",X"36",X"02",X"40",X"C9",X"C3",X"00",X"A0", + X"C3",X"6D",X"A4",X"3A",X"EA",X"90",X"A7",X"20",X"05",X"F7",X"54",X"00",X"00",X"C9",X"F7",X"06", + X"00",X"00",X"C9",X"77",X"23",X"10",X"FC",X"C9",X"19",X"08",X"47",X"3E",X"40",X"B0",X"47",X"CB", + X"00",X"C9",X"00",X"C9",X"F1",X"00",X"F2",X"02",X"F3",X"0A",X"70",X"F4",X"02",X"80",X"F4",X"02", + X"80",X"F4",X"02",X"80",X"70",X"F4",X"01",X"60",X"F4",X"02",X"80",X"F4",X"01",X"60",X"F4",X"02", + X"80",X"70",X"F4",X"02",X"8D",X"F4",X"02",X"88",X"F4",X"02",X"8A",X"70",X"F4",X"01",X"6C",X"F4", + X"02",X"8A",X"F4",X"01",X"6A",X"F4",X"02",X"88",X"70",X"F4",X"01",X"65",X"F4",X"01",X"66",X"F4", + X"01",X"68",X"F4",X"01",X"6A",X"F4",X"01",X"68",X"F4",X"01",X"67",X"F4",X"02",X"88",X"F4",X"01", + X"68",X"F4",X"02",X"86",X"F4",X"01",X"66",X"F4",X"02",X"85",X"50",X"F4",X"02",X"81",X"F4",X"01", + X"63",X"F4",X"01",X"65",X"F4",X"01",X"66",X"F4",X"01",X"68",X"F4",X"01",X"65",X"F4",X"02",X"88", + X"F4",X"01",X"63",X"F4",X"02",X"86",X"F4",X"01",X"65",X"F4",X"02",X"81",X"70",X"F4",X"02",X"80", + X"F4",X"02",X"80",X"F4",X"02",X"80",X"70",X"F4",X"01",X"60",X"F4",X"02",X"80",X"F4",X"01",X"60", + X"F4",X"02",X"80",X"70",X"F4",X"02",X"80",X"F4",X"02",X"80",X"F4",X"02",X"80",X"50",X"F4",X"02", + X"86",X"F4",X"01",X"68",X"F4",X"01",X"6A",X"F4",X"01",X"68",X"F4",X"01",X"66",X"F4",X"02",X"88", + X"70",X"F4",X"01",X"60",X"F4",X"02",X"80",X"F4",X"01",X"60",X"F4",X"02",X"80",X"50",X"F4",X"02", + X"86",X"F4",X"01",X"68",X"F4",X"01",X"6A",X"F4",X"01",X"6C",X"F4",X"01",X"6A",X"F4",X"02",X"88", + X"F4",X"02",X"85",X"F4",X"01",X"66",X"F4",X"01",X"68",X"F4",X"01",X"6A",X"F4",X"01",X"68",X"F4", + X"01",X"67",X"F4",X"02",X"88",X"F4",X"01",X"68",X"F4",X"02",X"86",X"F4",X"01",X"66",X"F4",X"02", + X"85",X"50",X"F4",X"02",X"81",X"F4",X"01",X"63",X"F4",X"01",X"65",X"F4",X"01",X"66",X"F4",X"01", + X"68",X"F4",X"01",X"65",X"F4",X"02",X"88",X"F4",X"01",X"63",X"F4",X"02",X"86",X"F4",X"01",X"65", + X"F4",X"02",X"81",X"70",X"70",X"FF",X"18",X"29",X"99",X"06",X"80",X"94",X"05",X"01",X"CD",X"23", + X"CD",X"75",X"26",X"CD",X"7E",X"3E",X"CD",X"8A",X"05",X"C9",X"CD",X"A3",X"3F",X"3A",X"EE",X"4D", + X"A7",X"C8",X"CD",X"F9",X"31",X"AF",X"32",X"15",X"4E",X"32",X"70",X"4E",X"3E",X"01",X"32",X"14", + X"4E",X"3E",X"23",X"32",X"02",X"4E",X"C9",X"3A",X"EF",X"4D",X"A7",X"20",X"0D",X"CD",X"7E",X"26", + X"21",X"00",X"00",X"22",X"08",X"4D",X"CD",X"79",X"3F",X"C9",X"CD",X"8A",X"05",X"C9",X"32",X"02", + X"4E",X"C9",X"3A",X"4D",X"90",X"20",X"05",X"36",X"01",X"C3",X"8E",X"05",X"CD",X"17",X"10",X"CD", + X"17",X"10",X"CD",X"23",X"0E",X"CD",X"0D",X"0C",X"CD",X"D6",X"0B",X"CD",X"A5",X"05",X"CD",X"FE", + X"1E",X"CD",X"25",X"1F",X"CD",X"4C",X"1F",X"CD",X"73",X"1F",X"C9",X"21",X"A1",X"4D",X"06",X"20", + X"3A",X"32",X"4D",X"C3",X"24",X"05",X"21",X"A2",X"4D",X"06",X"22",X"3A",X"32",X"4D",X"C3",X"24", + X"05",X"21",X"A3",X"4D",X"06",X"24",X"3A",X"32",X"4D",X"C3",X"24",X"05",X"3A",X"D0",X"4D",X"47", + X"3A",X"D1",X"4D",X"80",X"FE",X"06",X"CA",X"8E",X"05",X"C3",X"2C",X"05",X"CD",X"0E",X"A2",X"C9", + X"3A",X"75",X"4E",X"81",X"4F",X"06",X"1C",X"CD",X"42",X"00",X"F7",X"4A",X"02",X"00",X"21",X"02", + X"4E",X"34",X"C9",X"3A",X"75",X"4E",X"81",X"4F",X"06",X"1C",X"CD",X"42",X"00",X"F7",X"45",X"02", + X"00",X"CD",X"8E",X"05",X"C9",X"3A",X"B5",X"4D",X"A7",X"C8",X"AF",X"32",X"B5",X"4D",X"3A",X"30", + X"4D",X"EE",X"02",X"32",X"3C",X"4D",X"47",X"21",X"FF",X"32",X"DF",X"22",X"26",X"4D",X"C9",X"05", + X"49",X"2A",X"0A",X"04",X"18",X"14",X"05",X"CD",X"14",X"01",X"48",X"29",X"68",X"28",X"01",X"69", + X"02",X"06",X"08",X"CD",X"45",X"01",X"26",X"A9",X"85",X"45",X"DE",X"01",X"23",X"45",X"99",X"01", + X"23",X"89",X"45",X"67",X"AB",X"9A",X"26",X"04",X"12",X"59",X"01",X"56",X"CD",X"84",X"6A",X"46", + X"89",X"58",X"08",X"06",X"AE",X"88",X"EE",X"56",X"15",X"08",X"9A",X"9A",X"DE",X"B7",X"12",X"30", + X"05",X"45",X"02",X"ED",X"EA",X"6A",X"85",X"16",X"89",X"04",X"16",X"89",X"08",X"18",X"99",X"56", + X"9E",X"69",X"8C",X"16",X"9E",X"4D",X"59",X"49",X"1A",X"04",X"12",X"CD",X"A1",X"2B",X"3A",X"6E", + X"4E",X"FE",X"01",X"06",X"09",X"20",X"02",X"06",X"08",X"CD",X"5E",X"2C",X"3A",X"6E",X"4E",X"FE", + X"01",X"3A",X"40",X"50",X"28",X"0C",X"CB",X"77",X"20",X"08",X"CD",X"7D",X"06",X"C3",X"49",X"06", + X"26",X"CD",X"CB",X"6F",X"C0",X"AF",X"32",X"70",X"4E",X"3A",X"6B",X"4E",X"A7",X"28",X"15",X"3A", + X"70",X"4E",X"A7",X"3A",X"6E",X"4E",X"28",X"03",X"C6",X"99",X"27",X"C6",X"99",X"27",X"32",X"6E", + X"4E",X"CD",X"A1",X"2B",X"CD",X"BD",X"0F",X"34",X"AF",X"32",X"D6",X"4D",X"3E",X"01",X"32",X"EA", + X"90",X"C9",X"3E",X"00",X"ED",X"47",X"C3",X"FE",X"A6",X"CD",X"26",X"35",X"C9",X"3E",X"01",X"32", + X"70",X"4E",X"32",X"E3",X"90",X"C9",X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"C9",X"00",X"AF", + X"32",X"13",X"4E",X"3A",X"6F",X"4E",X"32",X"14",X"4E",X"32",X"15",X"4E",X"EF",X"1A",X"00",X"F7", + X"57",X"01",X"00",X"21",X"03",X"4E",X"34",X"C9",X"CD",X"A2",X"A0",X"00",X"CD",X"6A",X"2B",X"AF", + X"32",X"03",X"4E",X"32",X"02",X"4E",X"32",X"04",X"4E",X"21",X"00",X"4E",X"34",X"C9",X"F1",X"01", + X"F2",X"03",X"F3",X"0C",X"70",X"F4",X"02",X"8D",X"F4",X"02",X"88",X"F4",X"02",X"8A",X"70",X"F4", + X"01",X"6C",X"F4",X"02",X"8A",X"F4",X"01",X"6A",X"F4",X"02",X"88",X"70",X"F4",X"02",X"8D",X"F4", + X"02",X"88",X"F4",X"02",X"8A",X"70",X"F4",X"01",X"6C",X"F4",X"02",X"8A",X"F4",X"01",X"6A",X"F4", + X"02",X"88",X"70",X"F4",X"01",X"60",X"F4",X"01",X"60",X"F4",X"01",X"60",X"F4",X"01",X"60",X"F4", + X"01",X"60",X"F4",X"01",X"60",X"F4",X"02",X"80",X"F4",X"01",X"60",X"F4",X"02",X"80",X"F4",X"01", + X"60",X"F4",X"02",X"80",X"50",X"F4",X"02",X"80",X"F4",X"01",X"60",X"F4",X"01",X"60",X"F4",X"01", + X"60",X"F4",X"01",X"60",X"F4",X"01",X"60",X"F4",X"02",X"80",X"F4",X"01",X"60",X"F4",X"02",X"80", + X"F4",X"01",X"60",X"F4",X"02",X"80",X"70",X"F4",X"02",X"8D",X"F4",X"02",X"88",X"F4",X"02",X"8A", + X"70",X"F4",X"01",X"6C",X"F4",X"02",X"8A",X"F4",X"01",X"6A",X"F4",X"02",X"88",X"70",X"F4",X"02", + X"8D",X"F4",X"02",X"88",X"F4",X"02",X"8A",X"70",X"F4",X"01",X"6C",X"F4",X"02",X"8A",X"F4",X"01", + X"6A",X"F4",X"02",X"88",X"70",X"F4",X"02",X"8D",X"F4",X"02",X"88",X"F4",X"02",X"8A",X"50",X"F4", + X"02",X"80",X"F4",X"01",X"60",X"F4",X"01",X"60",X"F4",X"01",X"60",X"F4",X"01",X"60",X"F4",X"02", + X"80",X"F4",X"02",X"80",X"F4",X"01",X"60",X"F4",X"01",X"60",X"F4",X"01",X"60",X"F4",X"01",X"60", + X"F4",X"01",X"60",X"F4",X"02",X"80",X"F4",X"01",X"60",X"F4",X"02",X"80",X"F4",X"01",X"60",X"F4", + X"02",X"80",X"50",X"F4",X"02",X"80",X"F4",X"01",X"60",X"F4",X"01",X"60",X"F4",X"01",X"60",X"F4", + X"01",X"60",X"F4",X"01",X"60",X"F4",X"02",X"80",X"F4",X"01",X"60",X"F4",X"02",X"80",X"F4",X"01", + X"60",X"F4",X"02",X"80",X"70",X"70",X"FF",X"51",X"56",X"56",X"C9",X"45",X"12",X"A6",X"EF",X"AB", + X"67",X"49",X"85",X"26",X"2D",X"CD",X"45",X"88",X"01",X"22",X"37",X"6A",X"96",X"45",X"89",X"51", + X"05",X"67",X"C8",X"C9",X"05",X"12",X"66",X"AB",X"D9",X"52",X"16",X"1E",X"1C",X"1D",X"37",X"6A", + X"88",X"55",X"C9",X"05",X"DE",X"B0",X"F0",X"8C",X"48",X"59",X"6E",X"7B",X"45",X"26",X"96",X"01", + X"CD",X"65",X"A0",X"59",X"61",X"01",X"84",X"56",X"DE",X"A9",X"51",X"69",X"08",X"61",X"05",X"56", + X"89",X"77",X"01",X"04",X"11",X"46",X"4D",X"01",X"1C",X"00",X"ED",X"B0",X"01",X"0C",X"00",X"A7", + X"ED",X"42",X"ED",X"B0",X"01",X"0C",X"00",X"A7",X"ED",X"42",X"ED",X"B0",X"01",X"0C",X"00",X"A7", + X"ED",X"42",X"ED",X"B0",X"01",X"0E",X"00",X"ED",X"B0",X"C9",X"11",X"B8",X"4D",X"01",X"03",X"00", + X"ED",X"B0",X"C9",X"14",X"1E",X"46",X"00",X"1E",X"3C",X"00",X"00",X"32",X"00",X"00",X"00",X"14", + X"0A",X"1E",X"0F",X"28",X"14",X"32",X"19",X"3C",X"1E",X"50",X"28",X"64",X"32",X"78",X"3C",X"8C", + X"46",X"C0",X"03",X"48",X"03",X"D0",X"02",X"58",X"02",X"E0",X"01",X"68",X"01",X"F0",X"00",X"78", + X"00",X"01",X"00",X"F0",X"00",X"F0",X"00",X"B4",X"00",X"21",X"09",X"4E",X"AF",X"06",X"0B",X"CF", + X"CD",X"C9",X"24",X"2A",X"73",X"4E",X"22",X"0A",X"4E",X"21",X"0A",X"4E",X"11",X"38",X"4E",X"01", + X"2E",X"00",X"ED",X"B0",X"21",X"04",X"4E",X"34",X"C9",X"3A",X"00",X"4E",X"3D",X"20",X"06",X"3E", + X"09",X"32",X"04",X"4E",X"C9",X"EF",X"11",X"00",X"00",X"00",X"00",X"EF",X"04",X"05",X"EF",X"05", + X"00",X"EF",X"10",X"00",X"EF",X"1A",X"00",X"F7",X"54",X"00",X"00",X"F7",X"54",X"06",X"00",X"3A", + X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"32",X"C1",X"50",X"C3",X"94",X"08",X"3A",X"00",X"50", + X"CB",X"67",X"C2",X"DE",X"08",X"21",X"04",X"4E",X"36",X"0E",X"EF",X"13",X"00",X"C9",X"3A",X"EF", + X"90",X"FE",X"F0",X"20",X"06",X"CD",X"DB",X"0E",X"36",X"0C",X"C9",X"CD",X"17",X"10",X"CD",X"17", + X"10",X"CD",X"DD",X"13",X"CD",X"42",X"0C",X"CD",X"23",X"0E",X"CD",X"36",X"0E",X"CD",X"C3",X"0A", + X"CD",X"D6",X"0B",X"CD",X"0D",X"0C",X"CD",X"6C",X"0E",X"C9",X"06",X"1F",X"00",X"3E",X"01",X"32", + X"12",X"4E",X"CD",X"87",X"24",X"21",X"04",X"4E",X"34",X"3A",X"14",X"4E",X"A7",X"20",X"1F",X"3A", + X"00",X"4E",X"FE",X"03",X"C2",X"3E",X"09",X"C3",X"2B",X"09",X"00",X"3A",X"09",X"4E",X"C6",X"03", + X"4F",X"06",X"1C",X"CD",X"42",X"00",X"EF",X"1C",X"05",X"F7",X"54",X"00",X"00",X"C9",X"34",X"C9", + X"CD",X"9F",X"8C",X"A7",X"28",X"06",X"3A",X"42",X"4E",X"A7",X"20",X"15",X"3A",X"14",X"4E",X"A7", + X"20",X"1A",X"CD",X"A1",X"2B",X"EF",X"1C",X"05",X"F7",X"54",X"00",X"00",X"CD",X"9C",X"3B",X"34", + X"C9",X"CD",X"A6",X"0A",X"3A",X"09",X"4E",X"EE",X"01",X"32",X"09",X"4E",X"3E",X"09",X"32",X"04", + X"4E",X"C9",X"AF",X"CD",X"F6",X"2F",X"32",X"04",X"4E",X"32",X"70",X"4E",X"32",X"09",X"4E",X"32", + X"C1",X"50",X"3E",X"01",X"32",X"00",X"4E",X"C9",X"EF",X"00",X"01",X"EF",X"01",X"01",X"EF",X"02", + X"00",X"EF",X"11",X"00",X"EF",X"13",X"00",X"EF",X"03",X"00",X"EF",X"04",X"00",X"EF",X"05",X"00", + X"EF",X"10",X"00",X"EF",X"1A",X"00",X"CD",X"14",X"3F",X"3A",X"00",X"4E",X"FE",X"03",X"28",X"06", + X"EF",X"1C",X"05",X"EF",X"1D",X"00",X"CD",X"A3",X"03",X"00",X"3A",X"00",X"4E",X"3D",X"28",X"04", + X"F7",X"54",X"06",X"00",X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"32",X"C1",X"50",X"C3", + X"94",X"08",X"3E",X"03",X"32",X"04",X"4E",X"C9",X"F7",X"54",X"00",X"00",X"21",X"04",X"4E",X"34", + X"AF",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"C9",X"F7",X"42",X"00",X"00",X"21",X"00",X"00",X"CD", + X"7E",X"26",X"22",X"08",X"4D",X"21",X"04",X"4E",X"34",X"C9",X"CD",X"EA",X"29",X"11",X"02",X"00", + X"A7",X"ED",X"52",X"C9",X"AF",X"32",X"80",X"50",X"C3",X"1B",X"06",X"CD",X"19",X"83",X"C9",X"3E", + X"01",X"21",X"00",X"00",X"22",X"A7",X"4D",X"22",X"A9",X"4D",X"22",X"FC",X"4D",X"22",X"FE",X"4D", + X"CD",X"51",X"8C",X"21",X"04",X"4E",X"C9",X"31",X"93",X"22",X"08",X"4D",X"CD",X"C1",X"A3",X"C9", + X"06",X"00",X"CD",X"5E",X"2C",X"3A",X"70",X"4E",X"A7",X"28",X"0C",X"01",X"04",X"03",X"21",X"E9", + X"43",X"11",X"86",X"4E",X"CD",X"BE",X"2A",X"01",X"04",X"03",X"21",X"FC",X"43",X"11",X"82",X"4E", + X"CD",X"BE",X"2A",X"11",X"8A",X"4E",X"CD",X"A7",X"2A",X"C9",X"3A",X"F6",X"90",X"A7",X"20",X"09", + X"3E",X"01",X"32",X"F6",X"90",X"AF",X"CD",X"66",X"8A",X"CD",X"F3",X"2C",X"C9",X"06",X"20",X"21", + X"04",X"4E",X"34",X"34",X"AF",X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"C9",X"AF",X"32",X"CC",X"4E", + X"32",X"DC",X"4E",X"06",X"07",X"21",X"0C",X"4E",X"CF",X"21",X"04",X"4E",X"34",X"21",X"13",X"4E", + X"34",X"CD",X"C9",X"24",X"2A",X"0A",X"4E",X"7E",X"FE",X"14",X"C8",X"23",X"22",X"0A",X"4E",X"C9", + X"C3",X"88",X"09",X"C3",X"D2",X"09",X"06",X"2E",X"DD",X"21",X"0A",X"4E",X"FD",X"21",X"38",X"4E", + X"DD",X"56",X"00",X"FD",X"5E",X"00",X"FD",X"72",X"00",X"DD",X"73",X"00",X"DD",X"23",X"FD",X"23", + X"10",X"EE",X"C9",X"3A",X"A4",X"4D",X"A7",X"C0",X"DD",X"21",X"00",X"4C",X"FD",X"21",X"C8",X"4D", + X"11",X"00",X"01",X"FD",X"BE",X"00",X"C2",X"D2",X"0B",X"FD",X"36",X"00",X"0E",X"3A",X"A6",X"4D", + X"A7",X"28",X"1B",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"13",X"21",X"AC",X"4E",X"CB",X"FE", + X"3E",X"09",X"DD",X"BE",X"0B",X"20",X"04",X"CB",X"BE",X"3E",X"09",X"32",X"0B",X"4C",X"3A",X"A7", + X"4D",X"A7",X"28",X"1D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"27",X"3E",X"11",X"DD",X"BE", + X"03",X"28",X"07",X"DD",X"36",X"03",X"11",X"C3",X"33",X"0B",X"DD",X"36",X"03",X"12",X"C3",X"33", + X"0B",X"3E",X"01",X"DD",X"BE",X"03",X"28",X"07",X"DD",X"36",X"03",X"01",X"C3",X"33",X"0B",X"DD", + X"36",X"03",X"01",X"3A",X"A8",X"4D",X"A7",X"28",X"1D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30", + X"27",X"3E",X"11",X"DD",X"BE",X"05",X"28",X"07",X"DD",X"36",X"05",X"11",X"C3",X"68",X"0B",X"DD", + X"36",X"05",X"12",X"C3",X"68",X"0B",X"3E",X"03",X"DD",X"BE",X"05",X"28",X"07",X"DD",X"36",X"05", + X"03",X"C3",X"68",X"0B",X"DD",X"36",X"05",X"03",X"3A",X"A9",X"4D",X"A7",X"28",X"1D",X"2A",X"CB", + X"4D",X"A7",X"ED",X"52",X"30",X"27",X"3E",X"11",X"DD",X"BE",X"07",X"28",X"07",X"DD",X"36",X"07", + X"11",X"C3",X"9D",X"0B",X"DD",X"36",X"07",X"12",X"C3",X"9D",X"0B",X"3E",X"05",X"DD",X"BE",X"07", + X"28",X"07",X"DD",X"36",X"07",X"05",X"C3",X"9D",X"0B",X"DD",X"36",X"07",X"05",X"3A",X"AA",X"4D", + X"A7",X"28",X"1D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"27",X"3E",X"11",X"DD",X"BE",X"09", + X"28",X"07",X"DD",X"36",X"09",X"11",X"C3",X"D2",X"0B",X"DD",X"36",X"09",X"12",X"C3",X"D2",X"0B", + X"3E",X"07",X"DD",X"BE",X"09",X"28",X"07",X"DD",X"36",X"09",X"07",X"C3",X"D2",X"0B",X"DD",X"36", + X"09",X"07",X"FD",X"35",X"00",X"C9",X"06",X"19",X"3A",X"02",X"4E",X"FE",X"22",X"C2",X"E2",X"0B", + X"06",X"00",X"DD",X"21",X"00",X"4C",X"3A",X"AC",X"4D",X"A7",X"CA",X"F0",X"0B",X"DD",X"70",X"03", + X"3A",X"AD",X"4D",X"A7",X"CA",X"FA",X"0B",X"DD",X"70",X"05",X"3A",X"AE",X"4D",X"A7",X"CA",X"04", + X"0C",X"DD",X"70",X"07",X"3A",X"AF",X"4D",X"A7",X"C8",X"DD",X"70",X"09",X"C9",X"C9",X"CF",X"4D", + X"34",X"3E",X"0A",X"BE",X"C0",X"36",X"00",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"15",X"21",X"2B", + X"45",X"3E",X"10",X"BE",X"20",X"02",X"3E",X"00",X"77",X"32",X"34",X"45",X"32",X"CB",X"46",X"32", + X"D4",X"46",X"C9",X"21",X"32",X"47",X"3E",X"10",X"BE",X"20",X"02",X"3E",X"00",X"77",X"32",X"78", + X"46",X"C9",X"3A",X"A4",X"4D",X"A7",X"C0",X"3A",X"94",X"4D",X"07",X"32",X"94",X"4D",X"D0",X"3A", + X"A0",X"4D",X"A7",X"C2",X"90",X"0C",X"DD",X"21",X"05",X"33",X"FD",X"21",X"00",X"4D",X"CD",X"00", + X"20",X"22",X"00",X"4D",X"3E",X"03",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3A",X"00",X"4D",X"FE", + X"64",X"C2",X"90",X"0C",X"21",X"2C",X"2E",X"22",X"0A",X"4D",X"21",X"00",X"01",X"22",X"14",X"4D", + X"22",X"1E",X"4D",X"3E",X"02",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3E",X"01",X"32",X"A0",X"4D", + X"3A",X"A1",X"4D",X"FE",X"01",X"CA",X"FB",X"0C",X"FE",X"00",X"C2",X"C1",X"0C",X"3A",X"02",X"4D", + X"FE",X"78",X"CC",X"2E",X"1F",X"FE",X"80",X"CC",X"2E",X"1F",X"3A",X"2D",X"4D",X"32",X"29",X"4D", + X"DD",X"21",X"20",X"4D",X"FD",X"21",X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"C3",X"FB", + X"0C",X"DD",X"21",X"05",X"33",X"FD",X"21",X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"3E", + X"03",X"32",X"2D",X"4D",X"32",X"29",X"4D",X"3A",X"02",X"4D",X"FE",X"64",X"C2",X"FB",X"0C",X"21", + X"2C",X"2E",X"22",X"0C",X"4D",X"21",X"00",X"01",X"22",X"16",X"4D",X"22",X"20",X"4D",X"3E",X"02", + X"32",X"29",X"4D",X"32",X"2D",X"4D",X"3E",X"01",X"32",X"A1",X"4D",X"3A",X"A2",X"4D",X"FE",X"01", + X"CA",X"93",X"0D",X"FE",X"00",X"C2",X"2C",X"0D",X"3A",X"04",X"4D",X"FE",X"78",X"CC",X"55",X"1F", + X"FE",X"80",X"CC",X"55",X"1F",X"3A",X"2E",X"4D",X"32",X"2A",X"4D",X"DD",X"21",X"22",X"4D",X"FD", + X"21",X"04",X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"C3",X"93",X"0D",X"3A",X"A2",X"4D",X"FE", + X"03",X"C2",X"59",X"0D",X"DD",X"21",X"FF",X"32",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22", + X"04",X"4D",X"AF",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3A",X"05",X"4D",X"FE",X"80",X"C2",X"93", + X"0D",X"3E",X"02",X"32",X"A2",X"4D",X"C3",X"93",X"0D",X"DD",X"21",X"05",X"33",X"FD",X"21",X"04", + X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"3E",X"03",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3A", + X"04",X"4D",X"FE",X"64",X"C2",X"93",X"0D",X"21",X"2C",X"2E",X"22",X"0E",X"4D",X"21",X"00",X"01", + X"22",X"18",X"4D",X"22",X"22",X"4D",X"3E",X"02",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3E",X"01", + X"32",X"A2",X"4D",X"3A",X"A3",X"4D",X"FE",X"01",X"C8",X"FE",X"00",X"C2",X"C0",X"0D",X"3A",X"06", + X"4D",X"FE",X"78",X"CC",X"7C",X"1F",X"FE",X"80",X"CC",X"7C",X"1F",X"3A",X"2F",X"4D",X"32",X"2B", + X"4D",X"DD",X"21",X"24",X"4D",X"FD",X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"C9", + X"3A",X"A3",X"4D",X"FE",X"03",X"C2",X"EA",X"0D",X"DD",X"21",X"03",X"33",X"FD",X"21",X"06",X"4D", + X"CD",X"00",X"20",X"22",X"06",X"4D",X"3E",X"02",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3A",X"07", + X"4D",X"FE",X"80",X"C0",X"3E",X"02",X"32",X"A3",X"4D",X"C9",X"DD",X"21",X"05",X"33",X"FD",X"21", + X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"3E",X"03",X"32",X"2B",X"4D",X"32",X"2F",X"4D", + X"3A",X"06",X"4D",X"FE",X"64",X"C0",X"21",X"2C",X"2E",X"22",X"10",X"4D",X"21",X"00",X"01",X"22", + X"1A",X"4D",X"22",X"24",X"4D",X"3E",X"02",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3E",X"01",X"32", + X"A3",X"4D",X"C9",X"21",X"C4",X"4D",X"34",X"3E",X"08",X"BE",X"C0",X"36",X"00",X"3A",X"C0",X"4D", + X"EE",X"01",X"32",X"C0",X"4D",X"C9",X"3A",X"A6",X"4D",X"A7",X"C0",X"3A",X"C1",X"4D",X"FE",X"07", + X"C8",X"87",X"2A",X"C2",X"4D",X"23",X"22",X"C2",X"4D",X"5F",X"16",X"00",X"DD",X"21",X"86",X"4D", + X"DD",X"19",X"DD",X"5E",X"00",X"DD",X"56",X"01",X"A7",X"ED",X"52",X"C0",X"CB",X"3F",X"3C",X"32", + X"C1",X"4D",X"21",X"01",X"01",X"22",X"B1",X"4D",X"22",X"B3",X"4D",X"C9",X"3A",X"00",X"4E",X"FE", + X"03",X"C0",X"3A",X"A5",X"4D",X"A7",X"20",X"04",X"CD",X"96",X"0E",X"C9",X"AF",X"32",X"9C",X"4E", + X"32",X"91",X"4E",X"32",X"AC",X"4E",X"32",X"96",X"4E",X"32",X"92",X"4E",X"32",X"F4",X"90",X"06", + X"20",X"21",X"CC",X"4E",X"CF",X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"28",X"15",X"FE",X"02",X"28", + X"11",X"FE",X"03",X"20",X"11",X"3A",X"FA",X"4D",X"A7",X"20",X"0B",X"CD",X"83",X"0E",X"CD",X"F3", + X"2C",X"C9",X"CD",X"5A",X"0A",X"C9",X"AF",X"32",X"F6",X"90",X"CD",X"E8",X"0E",X"3A",X"F5",X"90", + X"A7",X"20",X"0E",X"3A",X"EA",X"90",X"A7",X"C0",X"21",X"BC",X"4E",X"36",X"20",X"C9",X"00",X"00", + X"00",X"3A",X"9B",X"4E",X"A7",X"C0",X"AF",X"32",X"F5",X"90",X"C9",X"CD",X"91",X"3B",X"00",X"3E", + X"FA",X"CD",X"02",X"8F",X"21",X"04",X"4E",X"C9",X"3A",X"EA",X"90",X"A7",X"C0",X"3E",X"01",X"32", + X"CC",X"4E",X"32",X"DC",X"4E",X"CD",X"C1",X"2C",X"C9",X"CD",X"21",X"82",X"C9",X"00",X"14",X"06", + X"01",X"0F",X"07",X"02",X"15",X"08",X"02",X"15",X"08",X"04",X"14",X"09",X"04",X"14",X"09",X"05", + X"17",X"0A",X"05",X"17",X"0A",X"06",X"09",X"0B",X"06",X"09",X"0B",X"03",X"16",X"0C",X"03",X"16", + X"0C",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D", + X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"F5",X"ED",X"57",X"B7", + X"28",X"04",X"F1",X"C3",X"8D",X"00",X"F1",X"C3",X"30",X"3D",X"FA",X"2C",X"24",X"FE",X"70",X"CA", + X"2C",X"24",X"C3",X"25",X"24",X"21",X"A0",X"4D",X"06",X"04",X"CF",X"C9",X"3E",X"01",X"32",X"AA", + X"4D",X"C3",X"63",X"17",X"3E",X"01",X"32",X"A9",X"4D",X"C3",X"63",X"17",X"3E",X"01",X"32",X"A8", + X"4D",X"C3",X"63",X"17",X"06",X"03",X"11",X"20",X"00",X"77",X"19",X"05",X"20",X"FB",X"C9",X"3E", + X"17",X"21",X"9B",X"44",X"CD",X"74",X"0F",X"21",X"7B",X"45",X"CD",X"74",X"0F",X"21",X"5B",X"46", + X"CD",X"74",X"0F",X"21",X"3B",X"47",X"CD",X"74",X"0F",X"21",X"84",X"44",X"CD",X"74",X"0F",X"21", + X"64",X"45",X"CD",X"74",X"0F",X"21",X"44",X"46",X"CD",X"74",X"0F",X"21",X"24",X"47",X"CD",X"74", + X"0F",X"C9",X"00",X"00",X"00",X"00",X"00",X"EF",X"17",X"00",X"C3",X"5C",X"1A",X"CD",X"E5",X"2F", + X"21",X"03",X"4E",X"C9",X"CD",X"09",X"3D",X"2A",X"BD",X"4D",X"C3",X"73",X"1A",X"C5",X"CD",X"B3", + X"8D",X"C1",X"C9",X"21",X"39",X"4D",X"46",X"23",X"4E",X"C9",X"00",X"CD",X"10",X"81",X"C3",X"63", + X"17",X"CD",X"8A",X"05",X"06",X"01",X"CD",X"ED",X"23",X"C9",X"00",X"00",X"00",X"E4",X"E4",X"E4", + X"00",X"00",X"00",X"ED",X"5B",X"39",X"4D",X"CD",X"23",X"17",X"CD",X"49",X"3D",X"C9",X"81",X"CE", + X"AF",X"32",X"D4",X"4D",X"21",X"00",X"00",X"22",X"D2",X"4D",X"C9",X"EF",X"1C",X"9B",X"3A",X"00", + X"4E",X"3D",X"C8",X"EF",X"1C",X"A2",X"C9",X"CD",X"91",X"12",X"3A",X"A5",X"4D",X"A7",X"C0",X"CD", + X"66",X"10",X"CD",X"94",X"10",X"CD",X"9E",X"10",X"CD",X"A8",X"10",X"CD",X"B4",X"10",X"3A",X"A4", + X"4D",X"A7",X"CA",X"39",X"10",X"CD",X"35",X"12",X"C9",X"CD",X"01",X"32",X"CD",X"36",X"1B",X"CD", + X"AE",X"1B",X"CD",X"26",X"1C",X"CD",X"9E",X"1C",X"CD",X"DB",X"85",X"CD",X"8E",X"17",X"C9",X"2A", + X"58",X"4D",X"3A",X"1F",X"4E",X"A7",X"CA",X"3E",X"1B",X"C3",X"4F",X"1B",X"3A",X"1F",X"4E",X"A7", + X"C8",X"AF",X"32",X"1F",X"4E",X"C9",X"3A",X"AB",X"4D",X"A7",X"C8",X"3D",X"20",X"08",X"32",X"AB", + X"4D",X"3C",X"32",X"AC",X"4D",X"C9",X"3D",X"20",X"08",X"32",X"AB",X"4D",X"3C",X"32",X"AD",X"4D", + X"C9",X"3D",X"20",X"08",X"32",X"AB",X"4D",X"3C",X"32",X"AE",X"4D",X"C9",X"32",X"AF",X"4D",X"3D", + X"32",X"AB",X"4D",X"C9",X"3A",X"AC",X"4D",X"E7",X"0C",X"00",X"C0",X"10",X"D2",X"10",X"3A",X"AD", + X"4D",X"E7",X"0C",X"00",X"18",X"11",X"2A",X"11",X"3A",X"AE",X"4D",X"E7",X"0C",X"00",X"5C",X"11", + X"6E",X"11",X"8F",X"11",X"3A",X"AF",X"4D",X"E7",X"0C",X"00",X"C9",X"11",X"DB",X"11",X"FC",X"11", + X"C3",X"3C",X"86",X"2A",X"00",X"4D",X"11",X"14",X"2C",X"A7",X"ED",X"52",X"C0",X"21",X"AC",X"4D", + X"34",X"C9",X"C3",X"20",X"86",X"33",X"FD",X"21",X"00",X"4D",X"CD",X"00",X"20",X"22",X"00",X"4D", + X"3E",X"01",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3A",X"00",X"4D",X"FE",X"80",X"C0",X"21",X"2F", + X"2E",X"22",X"0A",X"4D",X"22",X"31",X"4D",X"AF",X"32",X"A0",X"4D",X"32",X"AC",X"4D",X"32",X"A7", + X"4D",X"DD",X"21",X"AC",X"4D",X"DD",X"B6",X"00",X"DD",X"B6",X"01",X"DD",X"B6",X"02",X"DD",X"B6", + X"03",X"C0",X"21",X"AC",X"4E",X"CB",X"B6",X"C9",X"C3",X"4C",X"86",X"2A",X"02",X"4D",X"11",X"14", + X"64",X"A7",X"ED",X"52",X"C0",X"21",X"AD",X"4D",X"34",X"C9",X"CD",X"CA",X"25",X"AF",X"32",X"AD", + X"4D",X"32",X"A8",X"4D",X"32",X"F1",X"90",X"C3",X"01",X"11",X"32",X"29",X"4D",X"32",X"2D",X"4D", + X"3A",X"02",X"4D",X"FE",X"80",X"C0",X"21",X"2F",X"2E",X"22",X"0C",X"4D",X"22",X"33",X"4D",X"AF", + X"32",X"A1",X"4D",X"32",X"AD",X"4D",X"32",X"A8",X"4D",X"C3",X"01",X"11",X"C3",X"5C",X"86",X"2A", + X"04",X"4D",X"11",X"14",X"D4",X"A7",X"ED",X"52",X"C0",X"21",X"AE",X"4D",X"34",X"C9",X"21",X"AE", + X"4D",X"34",X"C9",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"3E",X"01",X"32",X"2A", + X"4D",X"32",X"2E",X"4D",X"3A",X"04",X"4D",X"FE",X"80",X"C0",X"21",X"AE",X"4D",X"34",X"C9",X"CD", + X"EB",X"25",X"AF",X"32",X"AE",X"4D",X"32",X"A9",X"4D",X"32",X"F2",X"90",X"C3",X"01",X"11",X"32", + X"2A",X"4D",X"32",X"2E",X"4D",X"3A",X"05",X"4D",X"FE",X"90",X"C0",X"21",X"2F",X"30",X"22",X"0E", + X"4D",X"22",X"35",X"4D",X"3E",X"01",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"AF",X"32",X"A2",X"4D", + X"32",X"AE",X"4D",X"32",X"A9",X"4D",X"C3",X"01",X"11",X"C3",X"6C",X"86",X"2A",X"06",X"4D",X"11", + X"14",X"9C",X"A7",X"ED",X"52",X"C0",X"21",X"AF",X"4D",X"34",X"C9",X"21",X"AF",X"4D",X"34",X"C9", + X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"3E",X"01",X"32",X"2B",X"4D",X"32",X"2F", + X"4D",X"3A",X"06",X"4D",X"FE",X"80",X"C0",X"21",X"AF",X"4D",X"34",X"C9",X"CD",X"0C",X"26",X"AF", + X"32",X"AF",X"4D",X"32",X"AA",X"4D",X"32",X"F3",X"90",X"C3",X"01",X"11",X"2B",X"4D",X"32",X"2F", + X"4D",X"3A",X"07",X"4D",X"FE",X"70",X"C0",X"21",X"2F",X"2C",X"22",X"10",X"4D",X"22",X"37",X"4D", + X"3E",X"01",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"AF",X"32",X"A3",X"4D",X"32",X"AF",X"4D",X"32", + X"AA",X"4D",X"C3",X"01",X"11",X"3A",X"D1",X"4D",X"E7",X"3F",X"12",X"3F",X"12",X"0C",X"00",X"3A", + X"D1",X"4D",X"A7",X"20",X"09",X"F7",X"4A",X"03",X"00",X"21",X"D1",X"4D",X"34",X"C9",X"3A",X"A4", + X"4D",X"32",X"AB",X"4D",X"AF",X"32",X"A4",X"4D",X"32",X"D1",X"4D",X"C9",X"CD",X"6B",X"35",X"C9", + X"00",X"40",X"44",X"48",X"4C",X"50",X"54",X"58",X"5C",X"4A",X"4E",X"42",X"46",X"5A",X"5E",X"52", + X"56",X"43",X"47",X"4B",X"4F",X"53",X"57",X"5B",X"5F",X"49",X"4D",X"41",X"45",X"59",X"5D",X"51", + X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"3A",X"A5",X"4D",X"E7",X"0C",X"00",X"B7",X"12",X"B7",X"12",X"B7",X"12",X"B7",X"12",X"CB", + X"12",X"F9",X"12",X"06",X"13",X"0E",X"13",X"16",X"13",X"1E",X"13",X"26",X"13",X"2E",X"13",X"36", + X"13",X"3E",X"13",X"46",X"13",X"53",X"13",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D",X"11",X"78", + X"00",X"A7",X"ED",X"52",X"C0",X"3E",X"05",X"32",X"A5",X"4D",X"C9",X"21",X"00",X"00",X"CD",X"C2", + X"85",X"3E",X"B8",X"11",X"B4",X"00",X"4F",X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"28", + X"04",X"3E",X"01",X"81",X"4F",X"79",X"32",X"0A",X"4C",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D", + X"A7",X"ED",X"52",X"C0",X"21",X"A5",X"4D",X"34",X"C9",X"21",X"BC",X"4E",X"36",X"01",X"3E",X"B8", + X"11",X"C3",X"00",X"C3",X"D6",X"12",X"3E",X"BC",X"11",X"D2",X"00",X"C3",X"D6",X"12",X"3E",X"C0", + X"11",X"E1",X"00",X"C3",X"D6",X"12",X"3E",X"C4",X"11",X"F0",X"00",X"C3",X"D6",X"12",X"3E",X"C8", + X"11",X"FF",X"00",X"C3",X"D6",X"12",X"3E",X"CC",X"11",X"0E",X"01",X"C3",X"D6",X"12",X"3E",X"D0", + X"11",X"1D",X"01",X"C3",X"D6",X"12",X"3E",X"C8",X"11",X"2C",X"01",X"C3",X"D6",X"12",X"3E",X"C8", + X"11",X"3B",X"01",X"C3",X"D6",X"12",X"21",X"BC",X"4E",X"00",X"00",X"3E",X"C8",X"11",X"59",X"01", + X"C3",X"D6",X"12",X"3E",X"FC",X"32",X"0A",X"4C",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D",X"11", + X"B8",X"01",X"A7",X"ED",X"52",X"C0",X"21",X"14",X"4E",X"35",X"21",X"15",X"4E",X"35",X"CD",X"75", + X"26",X"CD",X"9E",X"81",X"34",X"C9",X"3A",X"13",X"4E",X"A7",X"CA",X"7C",X"85",X"C3",X"16",X"1D", + X"15",X"06",X"48",X"59",X"02",X"9A",X"26",X"45",X"C9",X"69",X"1A",X"4A",X"02",X"09",X"05",X"16", + X"48",X"16",X"49",X"1A",X"48",X"AE",X"CC",X"EF",X"58",X"40",X"49",X"26",X"49",X"5A",X"CD",X"EA", + X"62",X"01",X"CD",X"45",X"06",X"9A",X"26",X"56",X"9A",X"76",X"32",X"EA",X"59",X"A6",X"89",X"45", + X"05",X"9A",X"62",X"84",X"15",X"89",X"56",X"AE",X"9A",X"89",X"45",X"A6",X"9D",X"EA",X"7B",X"C9", + X"45",X"9A",X"62",X"59",X"AE",X"BF",X"FB",X"56",X"48",X"C9",X"95",X"6A",X"01",X"23",X"6A",X"29", + X"2E",X"C9",X"5A",X"89",X"A7",X"59",X"58",X"05",X"86",X"05",X"84",X"6E",X"F9",X"21",X"9E",X"4D", + X"3A",X"0E",X"4E",X"BE",X"CA",X"EE",X"13",X"21",X"00",X"00",X"22",X"97",X"4D",X"C9",X"2A",X"97", + X"4D",X"23",X"22",X"97",X"4D",X"ED",X"5B",X"95",X"4D",X"A7",X"ED",X"52",X"C0",X"21",X"00",X"00", + X"22",X"97",X"4D",X"3A",X"A1",X"4D",X"A7",X"F5",X"CC",X"86",X"20",X"F1",X"C8",X"3A",X"A2",X"4D", + X"A7",X"F5",X"CC",X"A9",X"20",X"F1",X"C8",X"3A",X"A3",X"4D",X"A7",X"CC",X"D1",X"20",X"C9",X"3A", + X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"C8",X"47",X"DD",X"21",X"00",X"4C",X"1E",X"08",X"0E", + X"08",X"16",X"07",X"3A",X"00",X"4D",X"83",X"DD",X"77",X"13",X"3A",X"01",X"4D",X"2F",X"82",X"DD", + X"77",X"12",X"3A",X"02",X"4D",X"83",X"DD",X"77",X"15",X"3A",X"03",X"4D",X"2F",X"82",X"DD",X"77", + X"14",X"3A",X"04",X"4D",X"83",X"DD",X"77",X"17",X"3A",X"05",X"4D",X"2F",X"81",X"DD",X"77",X"16", + X"3A",X"06",X"4D",X"83",X"DD",X"77",X"19",X"3A",X"07",X"4D",X"2F",X"81",X"DD",X"77",X"18",X"3A", + X"08",X"4D",X"83",X"DD",X"77",X"1B",X"3A",X"09",X"4D",X"2F",X"81",X"DD",X"77",X"1A",X"3A",X"D2", + X"4D",X"83",X"DD",X"77",X"1D",X"3A",X"D3",X"4D",X"2F",X"81",X"DD",X"77",X"1C",X"C3",X"FE",X"14", + X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"C0",X"47",X"1E",X"09",X"0E",X"07",X"16",X"06", + X"DD",X"21",X"00",X"4C",X"3A",X"00",X"4D",X"2F",X"83",X"DD",X"77",X"13",X"3A",X"01",X"4D",X"82", + X"DD",X"77",X"12",X"3A",X"02",X"4D",X"2F",X"83",X"DD",X"77",X"15",X"3A",X"03",X"4D",X"82",X"DD", + X"77",X"14",X"3A",X"04",X"4D",X"2F",X"83",X"DD",X"77",X"17",X"3A",X"05",X"4D",X"81",X"DD",X"77", + X"16",X"3A",X"06",X"4D",X"2F",X"83",X"DD",X"77",X"19",X"3A",X"07",X"4D",X"81",X"DD",X"77",X"18", + X"3A",X"08",X"4D",X"2F",X"83",X"DD",X"77",X"1B",X"3A",X"09",X"4D",X"81",X"DD",X"77",X"1A",X"3A", + X"D2",X"4D",X"2F",X"83",X"DD",X"77",X"1D",X"3A",X"D3",X"4D",X"81",X"DD",X"77",X"1C",X"3A",X"A5", + X"4D",X"A7",X"C2",X"4B",X"15",X"3A",X"A4",X"4D",X"A7",X"C0",X"00",X"00",X"21",X"1C",X"15",X"E5", + X"3A",X"30",X"4D",X"E7",X"9C",X"16",X"9C",X"16",X"AA",X"16",X"AA",X"16",X"78",X"A7",X"28",X"2B", + X"0E",X"01",X"3A",X"0A",X"4C",X"57",X"A1",X"20",X"05",X"7A",X"81",X"C3",X"48",X"15",X"3A",X"30", + X"4D",X"FE",X"02",X"20",X"09",X"CB",X"7A",X"28",X"12",X"7A",X"A9",X"C3",X"48",X"15",X"FE",X"03", + X"20",X"09",X"CB",X"72",X"28",X"05",X"7A",X"A9",X"32",X"0A",X"4C",X"C3",X"A0",X"89",X"C5",X"06", + X"04",X"3A",X"C0",X"4D",X"A7",X"20",X"05",X"11",X"53",X"3E",X"18",X"03",X"11",X"5B",X"3E",X"1A", + X"77",X"23",X"13",X"1A",X"77",X"23",X"13",X"05",X"20",X"F5",X"CD",X"DE",X"8B",X"CD",X"90",X"A0", + X"3E",X"09",X"32",X"0B",X"4C",X"C1",X"3A",X"A7",X"4D",X"A7",X"20",X"16",X"3A",X"E4",X"4D",X"FE", + X"01",X"20",X"0F",X"3A",X"C0",X"4D",X"21",X"08",X"01",X"A7",X"20",X"03",X"21",X"0C",X"01",X"22", + X"02",X"4C",X"3A",X"04",X"4E",X"FE",X"00",X"C3",X"B9",X"1D",X"21",X"08",X"01",X"22",X"02",X"4C", + X"78",X"A7",X"C8",X"0E",X"01",X"3A",X"02",X"4C",X"81",X"32",X"02",X"4C",X"3A",X"04",X"4C",X"81", + X"32",X"04",X"4C",X"3A",X"06",X"4C",X"81",X"32",X"06",X"4C",X"3A",X"08",X"4C",X"81",X"32",X"08", + X"4C",X"3A",X"0C",X"4C",X"81",X"32",X"0C",X"4C",X"C9",X"3A",X"0C",X"4C",X"81",X"32",X"0C",X"4C", + X"C9",X"21",X"00",X"00",X"22",X"EB",X"90",X"CD",X"7C",X"0E",X"CD",X"B0",X"86",X"A7",X"C8",X"AF", + X"32",X"E3",X"90",X"C9",X"00",X"00",X"2A",X"22",X"4C",X"ED",X"5B",X"2A",X"4C",X"ED",X"4B",X"26", + X"4C",X"22",X"2A",X"4C",X"ED",X"53",X"26",X"4C",X"ED",X"43",X"22",X"4C",X"2A",X"24",X"4C",X"ED", + X"5B",X"2C",X"4C",X"ED",X"4B",X"28",X"4C",X"22",X"2C",X"4C",X"ED",X"53",X"28",X"4C",X"ED",X"43", + X"24",X"4C",X"C9",X"DD",X"72",X"08",X"14",X"DD",X"72",X"0C",X"DD",X"36",X"0A",X"3F",X"16",X"16", + X"DD",X"72",X"05",X"DD",X"72",X"07",X"DD",X"72",X"09",X"DD",X"72",X"0D",X"C9",X"3A",X"07",X"4E", + X"A7",X"C8",X"57",X"3A",X"3A",X"4D",X"D6",X"3D",X"20",X"04",X"DD",X"36",X"0B",X"00",X"7A",X"FE", + X"0A",X"D8",X"DD",X"36",X"02",X"32",X"DD",X"36",X"03",X"1D",X"FE",X"0C",X"D8",X"DD",X"36",X"02", + X"33",X"C9",X"3A",X"08",X"4E",X"A7",X"C8",X"57",X"3A",X"3A",X"4D",X"D6",X"3D",X"20",X"04",X"DD", + X"36",X"0B",X"00",X"7A",X"FE",X"01",X"D8",X"3A",X"C0",X"4D",X"1E",X"08",X"83",X"DD",X"77",X"02", + X"7A",X"FE",X"03",X"D8",X"3A",X"01",X"4D",X"E6",X"08",X"0F",X"0F",X"0F",X"1E",X"0A",X"83",X"DD", + X"77",X"0C",X"3C",X"3C",X"DD",X"77",X"02",X"DD",X"36",X"0D",X"1E",X"C9",X"21",X"0A",X"4C",X"3A", + X"C0",X"4D",X"A7",X"20",X"02",X"71",X"C9",X"79",X"C6",X"04",X"77",X"C9",X"78",X"A7",X"20",X"03", + X"0E",X"B2",X"18",X"02",X"0E",X"B0",X"CD",X"8C",X"16",X"C9",X"78",X"A7",X"20",X"03",X"0E",X"B0", + X"18",X"02",X"0E",X"B2",X"CD",X"8C",X"16",X"C9",X"38",X"05",X"DD",X"36",X"0A",X"2F",X"C9",X"FE", + X"04",X"38",X"05",X"DD",X"36",X"0A",X"2D",X"C9",X"FE",X"02",X"38",X"05",X"DD",X"36",X"0A",X"2F", + X"C9",X"DD",X"36",X"0A",X"30",X"C9",X"3A",X"09",X"4D",X"E6",X"07",X"FE",X"06",X"38",X"08",X"1E", + X"2E",X"CB",X"FB",X"DD",X"73",X"0A",X"C9",X"FE",X"04",X"38",X"04",X"1E",X"2C",X"18",X"F2",X"FE", + X"02",X"30",X"EC",X"1E",X"30",X"18",X"EA",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"06",X"38",X"05", + X"DD",X"36",X"0A",X"30",X"C9",X"FE",X"04",X"38",X"08",X"1E",X"2F",X"CB",X"F3",X"DD",X"73",X"0A", + X"C9",X"FE",X"02",X"38",X"04",X"1E",X"2D",X"18",X"F2",X"1E",X"2F",X"18",X"EE",X"CD",X"67",X"A0", + X"01",X"89",X"56",X"3A",X"AF",X"4D",X"A7",X"20",X"09",X"2A",X"37",X"4D",X"A7",X"ED",X"52",X"CA", + X"5C",X"0F",X"05",X"3A",X"AE",X"4D",X"A7",X"20",X"09",X"2A",X"35",X"4D",X"A7",X"ED",X"52",X"CA", + X"64",X"0F",X"05",X"3A",X"AD",X"4D",X"A7",X"20",X"09",X"2A",X"33",X"4D",X"A7",X"ED",X"52",X"CA", + X"6C",X"0F",X"05",X"3A",X"AC",X"4D",X"A7",X"20",X"09",X"2A",X"31",X"4D",X"A7",X"ED",X"52",X"CA", + X"99",X"83",X"05",X"78",X"32",X"A4",X"4D",X"00",X"00",X"00",X"A7",X"C8",X"21",X"A6",X"4D",X"5F", + X"16",X"00",X"19",X"7E",X"A7",X"C8",X"AF",X"32",X"A5",X"4D",X"21",X"D0",X"4D",X"34",X"C3",X"76", + X"13",X"5A",X"2A",X"21",X"BC",X"4E",X"CB",X"DE",X"C9",X"CD",X"01",X"25",X"C9",X"00",X"3A",X"A4", + X"4D",X"A7",X"C0",X"0E",X"04",X"06",X"04",X"DD",X"21",X"08",X"4D",X"3A",X"AF",X"4D",X"A7",X"20", + X"13",X"3A",X"06",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"07",X"4D",X"DD",X"96",X"01", + X"B9",X"DA",X"5C",X"0F",X"05",X"3A",X"AE",X"4D",X"A7",X"20",X"13",X"3A",X"04",X"4D",X"DD",X"96", + X"00",X"B9",X"30",X"0A",X"3A",X"05",X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"64",X"0F",X"05",X"3A", + X"AD",X"4D",X"A7",X"20",X"13",X"3A",X"02",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"03", + X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"6C",X"0F",X"05",X"3A",X"AC",X"4D",X"A7",X"20",X"13",X"3A", + X"00",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"01",X"4D",X"DD",X"96",X"01",X"B9",X"DA", + X"99",X"83",X"05",X"C3",X"63",X"17",X"3A",X"E4",X"4D",X"FE",X"04",X"CA",X"43",X"18",X"00",X"00", + X"00",X"3A",X"FB",X"4D",X"A7",X"CA",X"2F",X"18",X"2A",X"4C",X"4D",X"29",X"22",X"4C",X"4D",X"2A", + X"4A",X"4D",X"ED",X"6A",X"22",X"4A",X"4D",X"D0",X"21",X"4C",X"4D",X"34",X"C3",X"43",X"18",X"2A", + X"48",X"4D",X"29",X"22",X"48",X"4D",X"2A",X"46",X"4D",X"ED",X"6A",X"22",X"46",X"4D",X"D0",X"21", + X"48",X"4D",X"34",X"3A",X"0E",X"4E",X"32",X"9E",X"4D",X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E", + X"A1",X"4F",X"21",X"3A",X"4D",X"7E",X"06",X"21",X"90",X"38",X"09",X"7E",X"06",X"3B",X"90",X"30", + X"03",X"C3",X"AB",X"18",X"3E",X"01",X"32",X"BF",X"4D",X"3A",X"00",X"4E",X"FE",X"01",X"CA",X"19", + X"1A",X"3A",X"04",X"4E",X"FE",X"10",X"D2",X"19",X"1A",X"79",X"A7",X"28",X"06",X"3A",X"40",X"50", + X"C3",X"86",X"18",X"3A",X"00",X"50",X"CB",X"4F",X"C2",X"99",X"18",X"2A",X"03",X"33",X"3E",X"02", + X"32",X"30",X"4D",X"22",X"1C",X"4D",X"C3",X"50",X"19",X"CB",X"57",X"C2",X"50",X"19",X"2A",X"FF", + X"32",X"AF",X"32",X"30",X"4D",X"22",X"1C",X"4D",X"C3",X"50",X"19",X"3A",X"00",X"4E",X"FE",X"01", + X"CA",X"19",X"1A",X"3A",X"04",X"4E",X"FE",X"10",X"D2",X"19",X"1A",X"C3",X"B0",X"A4",X"FF",X"3A", + X"40",X"50",X"C3",X"C8",X"18",X"3A",X"00",X"50",X"CB",X"4F",X"CA",X"C9",X"1A",X"CB",X"57",X"CA", + X"D9",X"1A",X"CB",X"47",X"CA",X"E8",X"1A",X"CB",X"5F",X"CA",X"F8",X"1A",X"2A",X"1C",X"4D",X"22", + X"26",X"4D",X"06",X"01",X"DD",X"21",X"26",X"4D",X"00",X"00",X"00",X"00",X"C3",X"11",X"88",X"E6", + X"C0",X"D6",X"C0",X"20",X"4B",X"05",X"C2",X"16",X"19",X"3A",X"30",X"4D",X"0F",X"DA",X"0B",X"19", + X"3A",X"09",X"4D",X"E6",X"07",X"FE",X"04",X"C8",X"C3",X"40",X"19",X"3A",X"08",X"4D",X"E6",X"07", + X"FE",X"04",X"C8",X"C3",X"40",X"19",X"DD",X"21",X"1C",X"4D",X"CD",X"0F",X"20",X"C3",X"F3",X"8A", + X"FF",X"FF",X"FF",X"3A",X"30",X"4D",X"0F",X"DA",X"35",X"19",X"3A",X"09",X"4D",X"E6",X"07",X"FE", + X"04",X"C8",X"C3",X"50",X"19",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"04",X"C8",X"C3",X"50",X"19", + X"2A",X"26",X"4D",X"22",X"1C",X"4D",X"05",X"CA",X"50",X"19",X"3A",X"3C",X"4D",X"32",X"30",X"4D", + X"DD",X"21",X"1C",X"4D",X"FD",X"21",X"08",X"4D",X"CD",X"00",X"20",X"3A",X"30",X"4D",X"0F",X"DA", + X"75",X"19",X"7D",X"E6",X"07",X"FE",X"04",X"CA",X"85",X"19",X"DA",X"71",X"19",X"2D",X"C3",X"85", + X"19",X"2C",X"C3",X"85",X"19",X"7C",X"E6",X"07",X"FE",X"04",X"CA",X"85",X"19",X"DA",X"84",X"19", + X"25",X"C3",X"85",X"19",X"24",X"22",X"08",X"4D",X"CD",X"18",X"20",X"22",X"39",X"4D",X"3A",X"EA", + X"90",X"A7",X"28",X"23",X"3A",X"19",X"4E",X"A7",X"28",X"1D",X"DD",X"21",X"1C",X"4D",X"FD",X"21", + X"39",X"4D",X"CD",X"0F",X"20",X"FE",X"91",X"20",X"0E",X"36",X"40",X"21",X"19",X"4E",X"35",X"CD", + X"34",X"8C",X"CD",X"FE",X"85",X"C9",X"FF",X"2A",X"39",X"4D",X"3A",X"E6",X"4D",X"A7",X"C8",X"7D", + X"06",X"25",X"90",X"38",X"19",X"3A",X"FA",X"4D",X"A7",X"C8",X"CD",X"8B",X"87",X"CD",X"5E",X"81", + X"CD",X"A7",X"82",X"AF",X"32",X"E6",X"4D",X"32",X"E7",X"4D",X"2A",X"39",X"4D",X"C9",X"3A",X"EA", + X"90",X"A7",X"28",X"06",X"3E",X"01",X"32",X"FA",X"4D",X"C9",X"3A",X"E7",X"4D",X"A7",X"3E",X"01", + X"32",X"FA",X"4D",X"C0",X"3A",X"19",X"4E",X"A7",X"C8",X"21",X"19",X"4E",X"35",X"CD",X"34",X"8C", + X"21",X"16",X"4E",X"34",X"CD",X"10",X"8C",X"3E",X"01",X"32",X"E7",X"4D",X"CD",X"30",X"A1",X"C9", + X"78",X"87",X"D7",X"5F",X"23",X"56",X"EB",X"C9",X"FF",X"21",X"1C",X"4D",X"7E",X"A7",X"CA",X"2E", + X"1A",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"38",X"1A",X"C3",X"B2",X"0F",X"3A",X"09", + X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"B2",X"0F",X"00",X"00",X"00",X"00",X"00",X"EF",X"17",X"00", + X"00",X"00",X"DD",X"21",X"26",X"4D",X"FD",X"21",X"12",X"4D",X"CD",X"00",X"20",X"22",X"12",X"4D", + X"2A",X"26",X"4D",X"22",X"1C",X"4D",X"3A",X"3C",X"4D",X"32",X"30",X"4D",X"DD",X"21",X"1C",X"4D", + X"FD",X"21",X"08",X"4D",X"CD",X"00",X"20",X"C3",X"85",X"19",X"3A",X"9D",X"4D",X"FE",X"06",X"C0", + X"C3",X"C4",X"0F",X"22",X"CB",X"4D",X"3E",X"01",X"32",X"A6",X"4D",X"32",X"A7",X"4D",X"32",X"A8", + X"4D",X"32",X"A9",X"4D",X"32",X"AA",X"4D",X"32",X"B1",X"4D",X"32",X"B2",X"4D",X"32",X"B3",X"4D", + X"32",X"B4",X"4D",X"32",X"B5",X"4D",X"AF",X"32",X"C8",X"4D",X"32",X"D0",X"4D",X"DD",X"21",X"00", + X"4C",X"DD",X"36",X"02",X"1C",X"DD",X"36",X"04",X"1C",X"DD",X"36",X"06",X"1C",X"DD",X"36",X"08", + X"1C",X"DD",X"36",X"03",X"11",X"DD",X"36",X"05",X"11",X"DD",X"36",X"07",X"11",X"DD",X"36",X"09", + X"11",X"21",X"AC",X"4E",X"CB",X"EE",X"CB",X"BE",X"C9",X"2A",X"03",X"33",X"3E",X"02",X"32",X"3C", + X"4D",X"22",X"26",X"4D",X"06",X"00",X"C3",X"E4",X"18",X"2A",X"FF",X"32",X"AF",X"32",X"3C",X"4D", + X"22",X"26",X"4D",X"06",X"00",X"C3",X"E4",X"18",X"2A",X"05",X"33",X"3E",X"03",X"32",X"3C",X"4D", + X"22",X"26",X"4D",X"06",X"00",X"C3",X"E4",X"18",X"2A",X"01",X"33",X"3E",X"01",X"32",X"3C",X"4D", + X"22",X"26",X"4D",X"06",X"00",X"C3",X"E4",X"18",X"3A",X"12",X"4E",X"A7",X"CA",X"14",X"1B",X"21", + X"9F",X"4D",X"34",X"C9",X"3A",X"A3",X"4D",X"A7",X"C0",X"3A",X"A2",X"4D",X"A7",X"CA",X"25",X"1B", + X"21",X"11",X"4E",X"34",X"C9",X"3A",X"A1",X"4D",X"A7",X"CA",X"31",X"1B",X"21",X"10",X"4E",X"34", + X"C9",X"21",X"0F",X"4E",X"34",X"C9",X"3A",X"AC",X"4D",X"A7",X"C0",X"C3",X"4F",X"10",X"29",X"22", + X"58",X"4D",X"2A",X"56",X"4D",X"ED",X"6A",X"22",X"56",X"4D",X"D0",X"21",X"58",X"4D",X"34",X"21", + X"14",X"4D",X"7E",X"A7",X"CA",X"64",X"1B",X"3A",X"00",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"6E", + X"1B",X"C3",X"99",X"1B",X"3A",X"01",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"99",X"1B",X"3A",X"A7", + X"4D",X"A7",X"28",X"05",X"EF",X"0C",X"00",X"18",X"03",X"EF",X"08",X"00",X"CD",X"01",X"84",X"DD", + X"21",X"1E",X"4D",X"FD",X"21",X"0A",X"4D",X"CD",X"00",X"20",X"22",X"0A",X"4D",X"2A",X"1E",X"4D", + X"22",X"14",X"4D",X"3A",X"2C",X"4D",X"32",X"28",X"4D",X"DD",X"21",X"14",X"4D",X"FD",X"21",X"00", + X"4D",X"CD",X"00",X"20",X"22",X"00",X"4D",X"CD",X"18",X"20",X"22",X"31",X"4D",X"C9",X"3A",X"AD", + X"4D",X"A7",X"C0",X"2A",X"64",X"4D",X"29",X"22",X"64",X"4D",X"2A",X"62",X"4D",X"ED",X"6A",X"22", + X"62",X"4D",X"D0",X"21",X"64",X"4D",X"34",X"21",X"16",X"4D",X"7E",X"A7",X"CA",X"DC",X"1B",X"3A", + X"02",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"E6",X"1B",X"C3",X"11",X"1C",X"3A",X"03",X"4D",X"E6", + X"07",X"FE",X"04",X"C2",X"11",X"1C",X"3A",X"A8",X"4D",X"A7",X"28",X"05",X"EF",X"0D",X"00",X"18", + X"03",X"EF",X"09",X"00",X"CD",X"78",X"32",X"DD",X"21",X"20",X"4D",X"FD",X"21",X"0C",X"4D",X"CD", + X"00",X"20",X"22",X"0C",X"4D",X"2A",X"20",X"4D",X"22",X"16",X"4D",X"3A",X"2D",X"4D",X"32",X"29", + X"4D",X"DD",X"21",X"16",X"4D",X"FD",X"21",X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"CD", + X"18",X"20",X"22",X"33",X"4D",X"C9",X"3A",X"AE",X"4D",X"A7",X"C0",X"2A",X"70",X"4D",X"29",X"22", + X"70",X"4D",X"2A",X"6E",X"4D",X"ED",X"6A",X"22",X"6E",X"4D",X"D0",X"21",X"70",X"4D",X"34",X"21", + X"18",X"4D",X"7E",X"A7",X"CA",X"54",X"1C",X"3A",X"04",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"5E", + X"1C",X"C3",X"89",X"1C",X"3A",X"05",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"89",X"1C",X"3A",X"A9", + X"4D",X"A7",X"28",X"05",X"EF",X"0E",X"00",X"18",X"03",X"EF",X"0A",X"00",X"CD",X"94",X"32",X"DD", + X"21",X"22",X"4D",X"FD",X"21",X"0E",X"4D",X"CD",X"00",X"20",X"22",X"0E",X"4D",X"2A",X"22",X"4D", + X"22",X"18",X"4D",X"3A",X"2E",X"4D",X"32",X"2A",X"4D",X"DD",X"21",X"18",X"4D",X"FD",X"21",X"04", + X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"CD",X"18",X"20",X"22",X"35",X"4D",X"C9",X"3A",X"AF", + X"4D",X"A7",X"C0",X"2A",X"7C",X"4D",X"29",X"22",X"7C",X"4D",X"2A",X"7A",X"4D",X"ED",X"6A",X"22", + X"7A",X"4D",X"D0",X"21",X"7C",X"4D",X"34",X"21",X"1A",X"4D",X"7E",X"A7",X"CA",X"CC",X"1C",X"3A", + X"06",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"D6",X"1C",X"C3",X"01",X"1D",X"3A",X"07",X"4D",X"E6", + X"07",X"FE",X"04",X"C2",X"01",X"1D",X"3A",X"AA",X"4D",X"A7",X"28",X"05",X"EF",X"0F",X"00",X"18", + X"03",X"EF",X"0B",X"00",X"CD",X"B0",X"32",X"DD",X"21",X"24",X"4D",X"FD",X"21",X"10",X"4D",X"CD", + X"00",X"20",X"22",X"10",X"4D",X"2A",X"24",X"4D",X"22",X"1A",X"4D",X"3A",X"2F",X"4D",X"32",X"2B", + X"4D",X"DD",X"21",X"1A",X"4D",X"FD",X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"CD", + X"18",X"20",X"22",X"37",X"4D",X"C9",X"E5",X"D5",X"C5",X"CD",X"5C",X"10",X"2A",X"1D",X"4E",X"11", + X"B0",X"1D",X"A7",X"ED",X"52",X"20",X"06",X"CD",X"1B",X"01",X"22",X"1D",X"4E",X"2A",X"1D",X"4E", + X"11",X"04",X"00",X"19",X"22",X"1D",X"4E",X"5E",X"23",X"56",X"23",X"4E",X"23",X"46",X"ED",X"53", + X"56",X"4D",X"ED",X"43",X"58",X"4D",X"C1",X"D1",X"E1",X"C3",X"7C",X"85",X"FF",X"FF",X"FF",X"FF", + X"55",X"55",X"55",X"55",X"D5",X"D5",X"55",X"55",X"55",X"55",X"D5",X"D5",X"D5",X"55",X"D5",X"55", + X"D5",X"6A",X"D5",X"6A",X"D6",X"D6",X"D6",X"D6",X"5A",X"D6",X"5A",X"D6",X"AA",X"2A",X"55",X"55", + X"AA",X"6A",X"D5",X"A6",X"AA",X"D5",X"55",X"A6",X"5A",X"5A",X"6A",X"6A",X"5A",X"D6",X"D6",X"5A", + X"B6",X"A5",X"DB",X"5A",X"AA",X"B6",X"D5",X"55",X"D6",X"5A",X"AA",X"A6",X"DD",X"D5",X"DD",X"D5", + X"55",X"55",X"AA",X"6A",X"B6",X"5A",X"A6",X"D6",X"6A",X"6D",X"D6",X"AA",X"D6",X"D6",X"D6",X"D6", + X"AA",X"B6",X"55",X"D5",X"55",X"DD",X"55",X"A6",X"AA",X"B6",X"DB",X"A6",X"D5",X"D5",X"D5",X"D5", + X"FF",X"AF",X"32",X"E0",X"90",X"32",X"EF",X"90",X"C9",X"CA",X"9A",X"15",X"3A",X"EA",X"90",X"A7", + X"C3",X"81",X"00",X"3A",X"DF",X"90",X"A7",X"CA",X"A0",X"15",X"3E",X"01",X"32",X"80",X"50",X"CD", + X"FC",X"28",X"22",X"02",X"4D",X"22",X"04",X"4D",X"22",X"06",X"4D",X"21",X"8F",X"88",X"22",X"00", + X"4D",X"21",X"74",X"80",X"22",X"08",X"4D",X"00",X"00",X"00",X"3A",X"C0",X"4D",X"21",X"08",X"01", + X"11",X"B0",X"09",X"A7",X"20",X"06",X"21",X"0C",X"01",X"11",X"B2",X"09",X"22",X"02",X"4C",X"ED", + X"53",X"0A",X"4C",X"78",X"A7",X"28",X"10",X"0E",X"01",X"3A",X"02",X"4C",X"81",X"32",X"02",X"4C", + X"3A",X"0A",X"4C",X"81",X"32",X"0A",X"4C",X"AF",X"CD",X"8F",X"0E",X"3E",X"E0",X"32",X"BC",X"4E", + X"21",X"EF",X"90",X"34",X"C9",X"21",X"00",X"00",X"22",X"02",X"4D",X"22",X"04",X"4D",X"22",X"06", + X"4D",X"21",X"8F",X"88",X"22",X"00",X"4D",X"CD",X"43",X"A4",X"00",X"00",X"3A",X"C0",X"4D",X"21", + X"80",X"01",X"A7",X"20",X"03",X"21",X"84",X"01",X"22",X"02",X"4C",X"3A",X"E6",X"90",X"A7",X"28", + X"40",X"21",X"74",X"80",X"22",X"08",X"4D",X"00",X"3A",X"C0",X"4D",X"21",X"B0",X"09",X"A7",X"20", + X"03",X"21",X"B2",X"09",X"22",X"0A",X"4C",X"21",X"9C",X"4E",X"36",X"10",X"AF",X"32",X"80",X"50", + X"21",X"E5",X"90",X"7E",X"FE",X"F0",X"20",X"18",X"21",X"00",X"00",X"22",X"E5",X"90",X"22",X"E7", + X"90",X"22",X"E9",X"90",X"22",X"08",X"4D",X"CD",X"1E",X"A4",X"3E",X"09",X"32",X"04",X"4E",X"C9", + X"34",X"78",X"A7",X"C8",X"00",X"00",X"0E",X"01",X"3A",X"02",X"4C",X"81",X"CD",X"58",X"A4",X"3A", + X"E6",X"90",X"A7",X"C8",X"3A",X"0A",X"4C",X"81",X"32",X"0A",X"4C",X"C9",X"FF",X"DD",X"75",X"06", + X"DD",X"74",X"07",X"47",X"3A",X"EA",X"90",X"A7",X"28",X"13",X"3A",X"E4",X"90",X"A7",X"20",X"0D", + X"11",X"93",X"A6",X"A7",X"ED",X"52",X"20",X"05",X"3E",X"01",X"32",X"E4",X"90",X"78",X"C9",X"C9", + X"87",X"4F",X"06",X"00",X"21",X"09",X"4D",X"09",X"7E",X"FE",X"1D",X"C2",X"E3",X"1E",X"36",X"3D", + X"C3",X"FC",X"1E",X"FE",X"3E",X"C2",X"ED",X"1E",X"36",X"1E",X"C3",X"FC",X"1E",X"06",X"21",X"90", + X"DA",X"FC",X"1E",X"7E",X"06",X"3B",X"90",X"D2",X"FC",X"1E",X"A7",X"C9",X"37",X"C9",X"3A",X"B1", + X"4D",X"A7",X"C8",X"AF",X"32",X"B1",X"4D",X"21",X"FF",X"32",X"3A",X"28",X"4D",X"EE",X"02",X"32", + X"2C",X"4D",X"47",X"DF",X"22",X"1E",X"4D",X"3A",X"02",X"4E",X"FE",X"22",X"C0",X"22",X"14",X"4D", + X"78",X"32",X"28",X"4D",X"C9",X"3A",X"B2",X"4D",X"A7",X"C8",X"AF",X"32",X"B2",X"4D",X"21",X"FF", + X"32",X"3A",X"29",X"4D",X"EE",X"02",X"32",X"2D",X"4D",X"47",X"DF",X"22",X"20",X"4D",X"3A",X"02", + X"4E",X"FE",X"22",X"C0",X"22",X"16",X"4D",X"78",X"32",X"29",X"4D",X"C9",X"3A",X"B3",X"4D",X"A7", + X"C8",X"AF",X"32",X"B3",X"4D",X"21",X"FF",X"32",X"3A",X"2A",X"4D",X"EE",X"02",X"32",X"2E",X"4D", + X"47",X"DF",X"22",X"22",X"4D",X"3A",X"02",X"4E",X"FE",X"22",X"C0",X"22",X"18",X"4D",X"78",X"32", + X"2A",X"4D",X"C9",X"3A",X"B4",X"4D",X"A7",X"C8",X"AF",X"32",X"B4",X"4D",X"21",X"FF",X"32",X"3A", + X"2B",X"4D",X"EE",X"02",X"32",X"2F",X"4D",X"47",X"DF",X"22",X"24",X"4D",X"3A",X"02",X"4E",X"FE", + X"22",X"C0",X"22",X"1A",X"4D",X"78",X"32",X"2B",X"4D",X"C9",X"3A",X"FF",X"4D",X"A7",X"28",X"1F", + X"AF",X"32",X"FF",X"4D",X"18",X"16",X"3A",X"FE",X"4D",X"A7",X"28",X"13",X"AF",X"32",X"FE",X"4D", + X"18",X"0A",X"3A",X"FD",X"4D",X"A7",X"28",X"07",X"AF",X"32",X"FD",X"4D",X"CD",X"CD",X"0F",X"C3", + X"DB",X"0F",X"3E",X"6E",X"32",X"3B",X"42",X"3E",X"01",X"32",X"3B",X"46",X"3E",X"6F",X"32",X"5B", + X"42",X"3E",X"01",X"32",X"5B",X"46",X"3E",X"40",X"32",X"5D",X"42",X"C9",X"00",X"00",X"00",X"00", + X"3A",X"E4",X"4D",X"A7",X"00",X"28",X"04",X"01",X"7C",X"31",X"C9",X"01",X"B1",X"35",X"C9",X"00", + X"00",X"21",X"D0",X"4D",X"3E",X"01",X"77",X"C3",X"7E",X"17",X"00",X"00",X"00",X"00",X"5D",X"E1", + X"FD",X"7E",X"00",X"DD",X"86",X"00",X"6F",X"FD",X"7E",X"01",X"DD",X"86",X"01",X"67",X"C9",X"CD", + X"00",X"20",X"CD",X"65",X"00",X"7E",X"A7",X"C9",X"7D",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6", + X"20",X"6F",X"7C",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6",X"1E",X"67",X"C9",X"F5",X"C5",X"7D", + X"D6",X"20",X"6F",X"7C",X"D6",X"20",X"67",X"06",X"00",X"CB",X"24",X"CB",X"24",X"CB",X"24",X"CB", + X"24",X"CB",X"10",X"CB",X"24",X"CB",X"10",X"4C",X"26",X"00",X"09",X"01",X"40",X"40",X"09",X"C1", + X"F1",X"C9",X"CD",X"65",X"00",X"11",X"00",X"04",X"19",X"C9",X"CD",X"52",X"20",X"7E",X"FE",X"1B", + X"20",X"04",X"3E",X"01",X"02",X"C9",X"AF",X"02",X"C9",X"CD",X"56",X"21",X"C9",X"45",X"26",X"89", + X"AB",X"63",X"11",X"56",X"9A",X"56",X"45",X"05",X"12",X"6A",X"59",X"DE",X"A9",X"52",X"12",X"26", + X"A9",X"DE",X"A9",X"6B",X"AF",X"C9",X"85",X"45",X"01",X"56",X"CD",X"85",X"26",X"C9",X"05",X"45", + X"6A",X"C9",X"6A",X"26",X"15",X"04",X"01",X"23",X"45",X"6A",X"89",X"CD",X"95",X"12",X"6A",X"59", + X"40",X"96",X"5A",X"41",X"04",X"56",X"9A",X"DE",X"84",X"01",X"25",X"6A",X"DE",X"CD",X"96",X"C9", + X"56",X"AE",X"96",X"5A",X"48",X"49",X"01",X"59",X"48",X"89",X"9A",X"56",X"CD",X"85",X"9A",X"C9", + X"15",X"6A",X"08",X"6A",X"04",X"56",X"9A",X"08",X"C9",X"21",X"BA",X"4D",X"3A",X"11",X"4E",X"BE", + X"D8",X"3E",X"03",X"32",X"A3",X"4D",X"C9",X"3A",X"A3",X"4D",X"A7",X"C8",X"21",X"0E",X"4E",X"3A", + X"B6",X"4D",X"A7",X"C2",X"F4",X"20",X"3E",X"40",X"96",X"47",X"3A",X"BB",X"4D",X"90",X"D8",X"3E", + X"01",X"32",X"B6",X"4D",X"3A",X"B7",X"4D",X"A7",X"C0",X"3E",X"40",X"96",X"47",X"3A",X"BC",X"4D", + X"90",X"D8",X"3E",X"01",X"32",X"B7",X"4D",X"C9",X"3A",X"06",X"4E",X"E7",X"1A",X"21",X"40",X"21", + X"4B",X"21",X"0C",X"00",X"70",X"21",X"7B",X"21",X"86",X"21",X"3A",X"3A",X"4D",X"D6",X"21",X"20", + X"0F",X"3C",X"32",X"A0",X"4D",X"32",X"B7",X"4D",X"CD",X"06",X"05",X"21",X"06",X"4E",X"34",X"C9", + X"CD",X"06",X"18",X"CD",X"06",X"18",X"CD",X"36",X"1B",X"CD",X"36",X"1B",X"CD",X"23",X"0E",X"C9", + X"3A",X"3A",X"4D",X"D6",X"1E",X"C2",X"30",X"21",X"C3",X"2B",X"21",X"3A",X"32",X"4D",X"D6",X"1E", + X"C2",X"36",X"21",X"CD",X"70",X"1A",X"AF",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"CD",X"A5",X"05", + X"22",X"1C",X"4D",X"3A",X"3C",X"4D",X"32",X"30",X"4D",X"F7",X"45",X"07",X"00",X"C3",X"2B",X"21", + X"3A",X"32",X"4D",X"D6",X"2F",X"C2",X"36",X"21",X"C3",X"2B",X"21",X"3A",X"32",X"4D",X"D6",X"3D", + X"C2",X"30",X"21",X"C3",X"2B",X"21",X"CD",X"06",X"18",X"CD",X"06",X"18",X"3A",X"3A",X"4D",X"D6", + X"3D",X"C0",X"32",X"06",X"4E",X"F7",X"45",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"3A",X"07", + X"4E",X"FD",X"21",X"D2",X"41",X"E7",X"C2",X"21",X"0C",X"00",X"E1",X"21",X"F5",X"21",X"0C",X"22", + X"1E",X"22",X"44",X"22",X"5D",X"22",X"0C",X"00",X"6A",X"22",X"0C",X"00",X"86",X"22",X"0C",X"00", + X"8D",X"22",X"3E",X"01",X"32",X"D2",X"45",X"32",X"D3",X"45",X"32",X"F2",X"45",X"32",X"F3",X"45", + X"CD",X"06",X"05",X"FD",X"36",X"00",X"60",X"FD",X"36",X"01",X"61",X"F7",X"43",X"08",X"00",X"18", + X"0F",X"3A",X"3A",X"4D",X"D6",X"2C",X"C2",X"30",X"21",X"3C",X"32",X"A0",X"4D",X"32",X"B7",X"4D", + X"21",X"07",X"4E",X"34",X"C9",X"3A",X"01",X"4D",X"FE",X"77",X"28",X"05",X"FE",X"78",X"C2",X"30", + X"21",X"21",X"84",X"20",X"22",X"4E",X"4D",X"22",X"50",X"4D",X"18",X"E4",X"3A",X"01",X"4D",X"D6", + X"78",X"C2",X"37",X"22",X"FD",X"36",X"00",X"62",X"FD",X"36",X"01",X"63",X"18",X"D2",X"3A",X"01", + X"4D",X"D6",X"7B",X"20",X"12",X"FD",X"36",X"00",X"64",X"FD",X"36",X"01",X"65",X"FD",X"36",X"20", + X"66",X"FD",X"36",X"21",X"67",X"18",X"B9",X"CD",X"06",X"18",X"CD",X"06",X"18",X"CD",X"36",X"1B", + X"CD",X"23",X"0E",X"C9",X"3A",X"01",X"4D",X"D6",X"7E",X"20",X"EC",X"FD",X"36",X"00",X"68",X"FD", + X"36",X"01",X"69",X"FD",X"36",X"20",X"6A",X"FD",X"36",X"21",X"6B",X"18",X"93",X"3A",X"01",X"4D", + X"D6",X"80",X"20",X"D3",X"F7",X"4F",X"08",X"00",X"18",X"86",X"21",X"01",X"4D",X"34",X"34",X"FD", + X"36",X"00",X"6C",X"FD",X"36",X"01",X"6D",X"FD",X"36",X"20",X"40",X"FD",X"36",X"21",X"40",X"F7", + X"4A",X"08",X"00",X"C3",X"F0",X"21",X"F7",X"54",X"08",X"00",X"C3",X"F0",X"21",X"AF",X"32",X"07", + X"4E",X"21",X"04",X"4E",X"34",X"34",X"C9",X"3A",X"08",X"4E",X"E7",X"A7",X"22",X"BE",X"22",X"0C", + X"00",X"DD",X"22",X"F5",X"22",X"FE",X"22",X"3A",X"3A",X"4D",X"D6",X"25",X"C2",X"30",X"21",X"3C", + X"32",X"A0",X"4D",X"32",X"B7",X"4D",X"CD",X"06",X"05",X"21",X"08",X"4E",X"34",X"C9",X"3A",X"01", + X"4D",X"FE",X"FF",X"28",X"05",X"FE",X"FE",X"C2",X"30",X"21",X"3C",X"3C",X"32",X"01",X"4D",X"3E", + X"01",X"32",X"B1",X"4D",X"CD",X"FE",X"1E",X"F7",X"4A",X"09",X"00",X"18",X"DC",X"3A",X"32",X"4D", + X"D6",X"2D",X"28",X"D5",X"3A",X"00",X"4D",X"32",X"D2",X"4D",X"3A",X"01",X"4D",X"D6",X"08",X"32", + X"D3",X"4D",X"C3",X"30",X"21",X"3A",X"32",X"4D",X"D6",X"1E",X"28",X"BD",X"18",X"E6",X"AF",X"32", + X"08",X"4E",X"F7",X"45",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"91",X"11",X"20",X"00",X"01", + X"24",X"09",X"71",X"19",X"10",X"FC",X"21",X"72",X"91",X"11",X"20",X"00",X"01",X"24",X"0A",X"71", + X"19",X"10",X"FC",X"F7",X"94",X"91",X"01",X"09",X"1B",X"0E",X"1F",X"18",X"24",X"0E",X"16",X"0A", + X"10",X"C9",X"07",X"07",X"07",X"02",X"02",X"03",X"03",X"04",X"04",X"05",X"05",X"00",X"00",X"03", + X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"07",X"06",X"06",X"06",X"06", + X"01",X"01",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"07",X"04",X"04",X"04",X"04",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"07",X"02",X"02",X"02",X"02",X"02",X"03",X"03",X"04",X"04",X"05",X"05",X"01",X"01",X"01",X"01", + X"01",X"01",X"21",X"89",X"82",X"35",X"C0",X"CD",X"15",X"1D",X"32",X"89",X"82",X"3A",X"03",X"82", + X"A7",X"C8",X"3A",X"08",X"80",X"A7",X"C8",X"FE",X"0A",X"38",X"0A",X"21",X"00",X"82",X"7E",X"D6", + X"01",X"DA",X"4A",X"1F",X"77",X"06",X"07",X"DD",X"21",X"20",X"82",X"DD",X"7E",X"00",X"A7",X"28", + X"42",X"DD",X"23",X"DD",X"23",X"10",X"F4",X"C9",X"3A",X"C3",X"82",X"E6",X"F8",X"0F",X"0F",X"0F", + X"47",X"2F",X"C6",X"02",X"FE",X"F0",X"38",X"01",X"AF",X"E6",X"0F",X"4F",X"78",X"FE",X"10",X"30", + X"01",X"2F",X"E6",X"0F",X"3D",X"F2",X"E9",X"1B",X"21",X"04",X"4E",X"34",X"C9",X"78",X"E7",X"F3", + X"23",X"00",X"24",X"3E",X"40",X"01",X"04",X"00",X"21",X"00",X"40",X"CF",X"0D",X"20",X"FC",X"C9", + X"3E",X"40",X"21",X"40",X"40",X"01",X"04",X"80",X"CF",X"0D",X"20",X"FC",X"C9",X"AF",X"01",X"04", + X"00",X"21",X"00",X"44",X"CF",X"0D",X"20",X"FC",X"C9",X"CD",X"C7",X"82",X"C9",X"CD",X"67",X"21", + X"01",X"23",X"65",X"21",X"04",X"90",X"C9",X"00",X"C6",X"30",X"77",X"2B",X"C9",X"C2",X"8A",X"25", + X"3A",X"EA",X"90",X"A7",X"CA",X"77",X"25",X"C3",X"83",X"25",X"CD",X"9A",X"2B",X"01",X"22",X"3A", + X"21",X"A9",X"26",X"CD",X"21",X"A3",X"C9",X"C4",X"3A",X"1C",X"4E",X"CD",X"19",X"81",X"C9",X"00", + X"3A",X"31",X"4D",X"B8",X"C9",X"3A",X"37",X"4D",X"B8",X"C9",X"3A",X"32",X"4D",X"B9",X"C9",X"3A", + X"36",X"4D",X"B9",X"C9",X"00",X"00",X"00",X"00",X"00",X"00",X"7E",X"A7",X"C8",X"CD",X"37",X"3D", + X"3E",X"90",X"CD",X"DE",X"3C",X"3E",X"01",X"CD",X"F4",X"3C",X"0D",X"C8",X"11",X"60",X"00",X"19", + X"18",X"EE",X"D4",X"42",X"ED",X"A0",X"C9",X"78",X"FE",X"00",X"C8",X"FE",X"01",X"C0",X"21",X"1D", + X"4E",X"11",X"EB",X"41",X"ED",X"A0",X"11",X"90",X"41",X"ED",X"A0",X"11",X"F1",X"41",X"ED",X"A0", + X"11",X"70",X"42",X"ED",X"A0",X"C9",X"16",X"FD",X"23",X"0D",X"20",X"EC",X"DD",X"23",X"05",X"20", + X"E5",X"21",X"2B",X"41",X"11",X"34",X"4E",X"ED",X"A0",X"21",X"34",X"41",X"ED",X"A0",X"21",X"CB", + X"42",X"ED",X"A0",X"21",X"D4",X"42",X"ED",X"A0",X"C9",X"C9",X"03",X"32",X"80",X"50",X"C9",X"E1", + X"87",X"D7",X"5F",X"23",X"56",X"EB",X"E9",X"58",X"78",X"FE",X"02",X"3E",X"1F",X"28",X"02",X"3E", + X"11",X"21",X"40",X"44",X"01",X"04",X"80",X"CF",X"0D",X"20",X"FC",X"3E",X"0F",X"06",X"40",X"21", + X"C0",X"47",X"CF",X"7B",X"FE",X"01",X"C0",X"C3",X"7F",X"0F",X"20",X"00",X"06",X"06",X"DD",X"21", + X"A0",X"45",X"DD",X"77",X"0C",X"DD",X"77",X"18",X"DD",X"19",X"10",X"F6",X"3E",X"11",X"06",X"05", + X"DD",X"21",X"40",X"44",X"DD",X"77",X"0E",X"DD",X"77",X"0F",X"DD",X"77",X"10",X"DD",X"19",X"10", + X"F3",X"06",X"05",X"DD",X"21",X"20",X"47",X"DD",X"77",X"0E",X"DD",X"77",X"0F",X"DD",X"77",X"10", + X"DD",X"19",X"10",X"F3",X"3E",X"18",X"32",X"ED",X"45",X"32",X"0D",X"46",X"C9",X"21",X"C4",X"8C", + X"22",X"08",X"4D",X"21",X"2E",X"34",X"22",X"12",X"4D",X"22",X"39",X"4D",X"21",X"00",X"01",X"22", + X"1C",X"4D",X"22",X"26",X"4D",X"3E",X"02",X"32",X"30",X"4D",X"32",X"3C",X"4D",X"C9",X"36",X"05", + X"03",X"DD",X"36",X"21",X"C5",X"21",X"53",X"3E",X"11",X"02",X"4C",X"01",X"08",X"00",X"ED",X"B0", + X"C1",X"78",X"FE",X"00",X"C3",X"2D",X"24",X"CD",X"A9",X"25",X"CD",X"CA",X"25",X"CD",X"EB",X"25", + X"CD",X"0C",X"26",X"CD",X"2D",X"26",X"CD",X"4E",X"26",X"C9",X"FE",X"01",X"CA",X"A9",X"25",X"FE", + X"02",X"CA",X"CA",X"25",X"FE",X"03",X"CA",X"EB",X"25",X"FE",X"04",X"CA",X"0C",X"26",X"FE",X"05", + X"CA",X"2D",X"26",X"FE",X"06",X"CA",X"4E",X"26",X"C9",X"21",X"14",X"2C",X"22",X"00",X"4D",X"21", + X"22",X"23",X"22",X"0A",X"4D",X"22",X"31",X"4D",X"21",X"00",X"01",X"22",X"14",X"4D",X"22",X"1E", + X"4D",X"3E",X"02",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"C9",X"21",X"14",X"64",X"22",X"02",X"4D", + X"21",X"22",X"2A",X"22",X"0C",X"4D",X"22",X"33",X"4D",X"21",X"00",X"FF",X"22",X"16",X"4D",X"22", + X"20",X"4D",X"3E",X"00",X"32",X"29",X"4D",X"32",X"2D",X"4D",X"C9",X"21",X"14",X"D4",X"22",X"04", + X"4D",X"21",X"22",X"38",X"22",X"0E",X"4D",X"22",X"35",X"4D",X"21",X"00",X"FF",X"22",X"18",X"4D", + X"22",X"22",X"4D",X"3E",X"00",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"C9",X"21",X"14",X"9C",X"22", + X"06",X"4D",X"21",X"22",X"31",X"22",X"10",X"4D",X"22",X"37",X"4D",X"21",X"00",X"01",X"22",X"1A", + X"4D",X"22",X"24",X"4D",X"3E",X"02",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"C9",X"21",X"D4",X"81", + X"22",X"08",X"4D",X"21",X"3A",X"2E",X"22",X"12",X"4D",X"22",X"39",X"4D",X"21",X"00",X"01",X"22", + X"1C",X"4D",X"22",X"26",X"4D",X"3E",X"02",X"32",X"30",X"4D",X"32",X"3C",X"4D",X"C9",X"21",X"00", + X"00",X"22",X"D2",X"4D",X"C9",X"1C",X"4D",X"22",X"26",X"4D",X"21",X"28",X"4D",X"3E",X"02",X"06", + X"09",X"CF",X"32",X"3C",X"4D",X"21",X"94",X"08",X"22",X"08",X"4D",X"21",X"32",X"1F",X"22",X"12", + X"4D",X"22",X"39",X"4D",X"C9",X"C3",X"BC",X"85",X"22",X"08",X"4D",X"22",X"D2",X"4D",X"22",X"00", + X"4D",X"22",X"02",X"4D",X"22",X"04",X"4D",X"22",X"06",X"4D",X"C9",X"3E",X"55",X"32",X"94",X"4D", + X"05",X"C8",X"3E",X"01",X"C3",X"55",X"0F",X"C9",X"3E",X"01",X"32",X"00",X"4E",X"AF",X"32",X"01", + X"4E",X"C9",X"AF",X"11",X"00",X"4D",X"21",X"00",X"4E",X"12",X"13",X"A7",X"ED",X"52",X"C2",X"A6", + X"26",X"C9",X"DD",X"21",X"36",X"41",X"3A",X"71",X"4E",X"E6",X"0F",X"C6",X"30",X"DD",X"77",X"00", + X"3A",X"71",X"4E",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"C8",X"C6",X"30",X"DD",X"77",X"20",X"C9", + X"3A",X"80",X"50",X"47",X"E6",X"03",X"C2",X"DE",X"26",X"21",X"6E",X"4E",X"36",X"FF",X"4F",X"1F", + X"CE",X"00",X"32",X"6B",X"4E",X"E6",X"02",X"A9",X"32",X"6D",X"4E",X"78",X"0F",X"0F",X"E6",X"03", + X"3C",X"FE",X"04",X"20",X"01",X"3C",X"32",X"6F",X"4E",X"78",X"0F",X"0F",X"0F",X"0F",X"E6",X"03", + X"21",X"28",X"27",X"D7",X"32",X"71",X"4E",X"78",X"07",X"2F",X"E6",X"01",X"32",X"75",X"4E",X"78", + X"07",X"07",X"2F",X"E6",X"01",X"47",X"21",X"2C",X"27",X"DF",X"22",X"73",X"4E",X"3A",X"40",X"50", + X"07",X"2F",X"E6",X"01",X"32",X"72",X"4E",X"C9",X"10",X"15",X"20",X"FF",X"68",X"00",X"7D",X"00", + X"CD",X"FB",X"83",X"20",X"1E",X"3A",X"F9",X"4D",X"A7",X"20",X"05",X"11",X"22",X"23",X"18",X"03", + X"11",X"3A",X"2D",X"3A",X"2C",X"4D",X"2A",X"0A",X"4D",X"CD",X"66",X"29",X"22",X"1E",X"4D",X"32", + X"2C",X"4D",X"C9",X"2A",X"0A",X"4D",X"ED",X"5B",X"39",X"4D",X"3A",X"2C",X"4D",X"CD",X"66",X"29", + X"22",X"1E",X"4D",X"32",X"2C",X"4D",X"C9",X"4D",X"32",X"2C",X"4D",X"C9",X"3A",X"FD",X"4D",X"A7", + X"C2",X"8E",X"27",X"C3",X"7B",X"27",X"4D",X"A7",X"00",X"20",X"13",X"11",X"3D",X"38",X"3A",X"2D", + X"4D",X"2A",X"0C",X"4D",X"CD",X"66",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"11",X"22", + X"23",X"C3",X"7E",X"27",X"4D",X"29",X"29",X"19",X"EB",X"2A",X"0C",X"4D",X"3A",X"2D",X"4D",X"CD", + X"66",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"3A",X"FE",X"4D",X"A7",X"C2",X"CB",X"27", + X"C3",X"B8",X"27",X"4D",X"A7",X"00",X"20",X"13",X"11",X"3D",X"23",X"3A",X"2E",X"4D",X"2A",X"0E", + X"4D",X"CD",X"66",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9",X"11",X"22",X"31",X"C3",X"BB", + X"27",X"39",X"4D",X"2A",X"1C",X"4D",X"29",X"19",X"7D",X"87",X"91",X"6F",X"7C",X"87",X"90",X"67", + X"EB",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD",X"66",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D", + X"C9",X"3A",X"FF",X"4D",X"A7",X"C2",X"13",X"28",X"C3",X"00",X"28",X"4D",X"A7",X"00",X"20",X"13", + X"11",X"3D",X"2A",X"3A",X"2F",X"4D",X"2A",X"10",X"4D",X"CD",X"66",X"29",X"22",X"24",X"4D",X"32", + X"2F",X"4D",X"C9",X"11",X"22",X"38",X"C3",X"03",X"28",X"10",X"4D",X"CD",X"EA",X"29",X"11",X"40", + X"00",X"A7",X"ED",X"52",X"DA",X"00",X"28",X"2A",X"10",X"4D",X"ED",X"5B",X"39",X"4D",X"3A",X"2F", + X"4D",X"CD",X"66",X"29",X"22",X"24",X"4D",X"32",X"2F",X"4D",X"C9",X"3A",X"AC",X"4D",X"A7",X"CA", + X"55",X"28",X"11",X"22",X"23",X"2A",X"0A",X"4D",X"3A",X"2C",X"4D",X"CD",X"66",X"29",X"22",X"1E", + X"4D",X"32",X"2C",X"4D",X"C9",X"2A",X"0A",X"4D",X"3A",X"2C",X"4D",X"CD",X"1E",X"29",X"22",X"1E", + X"4D",X"32",X"2C",X"4D",X"C9",X"3A",X"AD",X"4D",X"A7",X"CA",X"7F",X"28",X"11",X"21",X"2D",X"2A", + X"0C",X"4D",X"3A",X"2D",X"4D",X"CD",X"66",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"2A", + X"0C",X"4D",X"3A",X"2D",X"4D",X"CD",X"1E",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"3A", + X"AE",X"4D",X"A7",X"CA",X"A9",X"28",X"11",X"21",X"3A",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD", + X"66",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD", + X"1E",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9",X"3A",X"AF",X"4D",X"A7",X"CA",X"D3",X"28", + X"11",X"21",X"2E",X"2A",X"10",X"4D",X"3A",X"2F",X"4D",X"CD",X"66",X"29",X"22",X"24",X"4D",X"32", + X"2F",X"4D",X"C9",X"2A",X"10",X"4D",X"3A",X"2F",X"4D",X"CD",X"1E",X"29",X"22",X"24",X"4D",X"32", + X"2F",X"4D",X"C9",X"3E",X"01",X"32",X"E6",X"4D",X"CD",X"3D",X"81",X"18",X"03",X"CD",X"7F",X"0F", + X"CD",X"48",X"24",X"00",X"00",X"00",X"3E",X"72",X"CD",X"9E",X"3E",X"C9",X"3E",X"FA",X"21",X"11", + X"42",X"CD",X"DE",X"3C",X"3E",X"11",X"CD",X"F4",X"3C",X"CD",X"7B",X"3B",X"C9",X"FF",X"FF",X"FF", + X"FF",X"3A",X"3C",X"4D",X"CD",X"66",X"29",X"22",X"26",X"4D",X"32",X"3C",X"4D",X"C9",X"22",X"3E", + X"4D",X"EE",X"02",X"32",X"3D",X"4D",X"CD",X"23",X"2A",X"E6",X"03",X"21",X"3B",X"4D",X"77",X"87", + X"5F",X"16",X"00",X"DD",X"21",X"FF",X"32",X"DD",X"19",X"FD",X"21",X"3E",X"4D",X"3A",X"3D",X"4D", + X"BE",X"CA",X"57",X"29",X"CD",X"0F",X"20",X"E6",X"C0",X"D6",X"C0",X"28",X"0A",X"DD",X"6E",X"00", + X"DD",X"66",X"01",X"3A",X"3B",X"4D",X"C9",X"DD",X"23",X"DD",X"23",X"21",X"3B",X"4D",X"7E",X"3C", + X"E6",X"03",X"77",X"C3",X"3D",X"29",X"22",X"3E",X"4D",X"ED",X"53",X"40",X"4D",X"32",X"3B",X"4D", + X"EE",X"02",X"32",X"3D",X"4D",X"21",X"FF",X"FF",X"22",X"44",X"4D",X"DD",X"21",X"FF",X"32",X"FD", + X"21",X"3E",X"4D",X"21",X"C7",X"4D",X"36",X"00",X"3A",X"3D",X"4D",X"BE",X"CA",X"C6",X"29",X"CD", + X"00",X"20",X"22",X"42",X"4D",X"CD",X"65",X"00",X"7E",X"E6",X"C0",X"C3",X"35",X"89",X"27",X"DD", + X"E5",X"FD",X"E5",X"DD",X"21",X"40",X"4D",X"FD",X"21",X"42",X"4D",X"CD",X"EA",X"29",X"FD",X"E1", + X"DD",X"E1",X"EB",X"2A",X"44",X"4D",X"A7",X"ED",X"52",X"DA",X"C6",X"29",X"ED",X"53",X"44",X"4D", + X"3A",X"C7",X"4D",X"32",X"3B",X"4D",X"DD",X"23",X"DD",X"23",X"21",X"C7",X"4D",X"34",X"3E",X"04", + X"BE",X"C2",X"88",X"29",X"3A",X"3B",X"4D",X"87",X"5F",X"16",X"00",X"DD",X"21",X"FF",X"32",X"DD", + X"19",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"CB",X"3F",X"C9",X"DD",X"7E",X"00",X"FD",X"46",X"00", + X"90",X"D2",X"F9",X"29",X"78",X"DD",X"46",X"00",X"90",X"CD",X"12",X"2A",X"E5",X"DD",X"7E",X"01", + X"FD",X"46",X"01",X"90",X"D2",X"0C",X"2A",X"78",X"DD",X"46",X"01",X"90",X"CD",X"12",X"2A",X"C1", + X"09",X"C9",X"67",X"5F",X"2E",X"00",X"55",X"0E",X"08",X"29",X"D2",X"1E",X"2A",X"19",X"0D",X"C2", + X"19",X"2A",X"C9",X"2A",X"C9",X"4D",X"54",X"5D",X"29",X"29",X"19",X"23",X"7C",X"E6",X"1F",X"67", + X"7E",X"22",X"C9",X"4D",X"C9",X"11",X"40",X"40",X"21",X"C0",X"43",X"A7",X"ED",X"52",X"C8",X"1A", + X"FE",X"10",X"CA",X"53",X"2A",X"FE",X"12",X"CA",X"53",X"2A",X"FE",X"14",X"CA",X"53",X"2A",X"13", + X"C3",X"38",X"2A",X"3E",X"40",X"12",X"13",X"C3",X"38",X"2A",X"3A",X"00",X"4E",X"FE",X"01",X"C8", + X"21",X"17",X"2B",X"DF",X"EB",X"CD",X"0B",X"2B",X"7B",X"86",X"27",X"77",X"23",X"7A",X"8E",X"27", + X"77",X"5F",X"23",X"3E",X"00",X"8E",X"27",X"77",X"57",X"EB",X"29",X"29",X"29",X"29",X"3A",X"71", + X"4E",X"3D",X"BC",X"DC",X"33",X"2B",X"CD",X"AF",X"2A",X"13",X"13",X"13",X"21",X"8A",X"4E",X"06", + X"03",X"1A",X"BE",X"D8",X"20",X"05",X"1B",X"2B",X"10",X"F7",X"C9",X"CD",X"0B",X"2B",X"11",X"88", + X"4E",X"01",X"03",X"00",X"ED",X"B0",X"1B",X"01",X"04",X"03",X"21",X"F2",X"43",X"18",X"0F",X"3A", + X"09",X"4E",X"01",X"04",X"03",X"21",X"FC",X"43",X"A7",X"28",X"03",X"21",X"E9",X"43",X"1A",X"0F", + X"0F",X"0F",X"0F",X"CD",X"CE",X"2A",X"1A",X"CD",X"CE",X"2A",X"1B",X"10",X"F1",X"C9",X"E6",X"0F", + X"28",X"04",X"0E",X"00",X"18",X"07",X"79",X"A7",X"28",X"03",X"3E",X"10",X"0D",X"C3",X"28",X"24", + X"06",X"00",X"CD",X"5E",X"2C",X"AF",X"21",X"80",X"4E",X"06",X"08",X"CF",X"01",X"04",X"03",X"11", + X"82",X"4E",X"21",X"FC",X"43",X"CD",X"BE",X"2A",X"01",X"04",X"03",X"11",X"86",X"4E",X"21",X"E9", + X"43",X"3A",X"70",X"4E",X"A7",X"20",X"B7",X"0E",X"06",X"18",X"B3",X"3A",X"09",X"4E",X"21",X"80", + X"4E",X"A7",X"C8",X"21",X"84",X"4E",X"C9",X"00",X"02",X"00",X"04",X"00",X"08",X"00",X"01",X"00", + X"08",X"00",X"16",X"00",X"01",X"00",X"03",X"00",X"05",X"00",X"07",X"00",X"10",X"00",X"20",X"00", + X"30",X"00",X"50",X"13",X"6B",X"62",X"1B",X"CB",X"46",X"C0",X"CB",X"C6",X"21",X"9C",X"4E",X"CB", + X"C6",X"21",X"14",X"4E",X"34",X"21",X"15",X"4E",X"34",X"46",X"21",X"1A",X"40",X"0E",X"05",X"78", + X"A7",X"28",X"0E",X"FE",X"06",X"30",X"0A",X"3E",X"9A",X"CD",X"D1",X"83",X"2B",X"2B",X"0D",X"10", + X"F6",X"0D",X"F8",X"CD",X"7E",X"2B",X"2B",X"2B",X"18",X"F7",X"3A",X"00",X"4E",X"FE",X"01",X"C8", + X"CD",X"CD",X"2B",X"12",X"44",X"09",X"0A",X"02",X"21",X"15",X"4E",X"46",X"18",X"CC",X"3E",X"40", + X"E5",X"D5",X"77",X"23",X"77",X"11",X"1F",X"00",X"19",X"77",X"23",X"77",X"D1",X"E1",X"C9",X"E5", + X"D5",X"11",X"1F",X"00",X"77",X"3C",X"23",X"77",X"3C",X"19",X"77",X"3C",X"23",X"77",X"D1",X"E1", + X"C9",X"3A",X"6E",X"4E",X"FE",X"FF",X"20",X"05",X"06",X"02",X"C3",X"5E",X"2C",X"06",X"01",X"CD", + X"5E",X"2C",X"3A",X"6E",X"4E",X"E6",X"F0",X"28",X"09",X"0F",X"0F",X"0F",X"0F",X"C6",X"30",X"32", + X"34",X"40",X"3A",X"6E",X"4E",X"E6",X"0F",X"C6",X"30",X"32",X"33",X"40",X"C9",X"E1",X"5E",X"23", + X"56",X"23",X"4E",X"23",X"46",X"23",X"7E",X"23",X"E5",X"EB",X"11",X"20",X"00",X"E5",X"C5",X"71", + X"23",X"10",X"FC",X"C1",X"E1",X"19",X"3D",X"20",X"F4",X"C9",X"EF",X"1C",X"06",X"3A",X"13",X"4E", + X"27",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"C6",X"30",X"32",X"25",X"40",X"3A",X"13",X"4E",X"27", + X"E6",X"0F",X"C6",X"30",X"32",X"24",X"40",X"3E",X"03",X"32",X"24",X"44",X"32",X"25",X"44",X"C9", + X"67",X"23",X"23",X"10",X"EB",X"C9",X"FE",X"0A",X"30",X"0D",X"D6",X"05",X"4F",X"06",X"00",X"21", + X"08",X"3B",X"09",X"EB",X"C3",X"FC",X"2B",X"C9",X"84",X"67",X"23",X"23",X"18",X"EB",X"FE",X"13", + X"38",X"02",X"3E",X"13",X"D6",X"07",X"4F",X"06",X"00",X"21",X"08",X"3B",X"09",X"09",X"EB",X"06", + X"07",X"C3",X"FD",X"2B",X"47",X"E6",X"0F",X"C6",X"00",X"27",X"4F",X"78",X"E6",X"F0",X"28",X"0B", + X"0F",X"0F",X"0F",X"0F",X"47",X"AF",X"C6",X"16",X"27",X"10",X"FB",X"81",X"27",X"C9",X"21",X"A5", + X"36",X"DF",X"5E",X"23",X"56",X"DD",X"21",X"00",X"44",X"DD",X"19",X"DD",X"E5",X"11",X"00",X"FC", + X"DD",X"19",X"11",X"FF",X"FF",X"CB",X"7E",X"20",X"03",X"11",X"E0",X"FF",X"23",X"78",X"01",X"00", + X"00",X"87",X"38",X"28",X"7E",X"FE",X"2F",X"28",X"09",X"DD",X"77",X"00",X"23",X"DD",X"19",X"04", + X"18",X"F2",X"23",X"DD",X"E1",X"7E",X"A7",X"FA",X"A4",X"2C",X"7E",X"DD",X"77",X"00",X"23",X"DD", + X"19",X"10",X"F7",X"C9",X"DD",X"77",X"00",X"DD",X"19",X"10",X"F9",X"C9",X"7E",X"FE",X"2F",X"28", + X"0A",X"DD",X"36",X"00",X"40",X"23",X"DD",X"19",X"04",X"18",X"F1",X"23",X"04",X"ED",X"B1",X"18", + X"D2",X"21",X"C8",X"3B",X"DD",X"21",X"CC",X"4E",X"FD",X"21",X"8C",X"4E",X"CD",X"44",X"2D",X"47", + X"3A",X"CC",X"4E",X"A7",X"28",X"04",X"78",X"32",X"91",X"4E",X"21",X"CC",X"3B",X"DD",X"21",X"DC", + X"4E",X"FD",X"21",X"92",X"4E",X"CD",X"44",X"2D",X"47",X"3A",X"DC",X"4E",X"A7",X"C8",X"78",X"32", + X"96",X"4E",X"C9",X"21",X"30",X"3B",X"DD",X"21",X"9C",X"4E",X"FD",X"21",X"8C",X"4E",X"CD",X"EE", + X"2D",X"32",X"91",X"4E",X"C9",X"21",X"70",X"3B",X"DD",X"21",X"AC",X"4E",X"FD",X"21",X"92",X"4E", + X"CD",X"EE",X"2D",X"32",X"96",X"4E",X"C9",X"21",X"60",X"A1",X"DD",X"21",X"BC",X"4E",X"FD",X"21", + X"97",X"4E",X"CD",X"EE",X"2D",X"32",X"9B",X"4E",X"AF",X"32",X"90",X"4E",X"C9",X"E1",X"46",X"23", + X"4E",X"23",X"E5",X"2A",X"80",X"4C",X"70",X"2C",X"71",X"2C",X"20",X"02",X"2E",X"C0",X"22",X"80", + X"4C",X"C9",X"FF",X"FF",X"DD",X"7E",X"00",X"A7",X"CA",X"F4",X"2D",X"4F",X"06",X"08",X"1E",X"80", + X"7B",X"A1",X"20",X"05",X"CB",X"3B",X"10",X"F8",X"C9",X"DD",X"7E",X"02",X"A3",X"20",X"07",X"DD", + X"73",X"02",X"05",X"DF",X"18",X"0C",X"DD",X"35",X"0C",X"C2",X"D7",X"2D",X"DD",X"6E",X"06",X"DD", + X"66",X"07",X"7E",X"23",X"CD",X"AD",X"1E",X"00",X"00",X"00",X"FE",X"F0",X"38",X"27",X"21",X"6C", + X"2D",X"E5",X"E6",X"0F",X"E7",X"55",X"2F",X"65",X"2F",X"77",X"2F",X"89",X"2F",X"9B",X"2F",X"0C", + X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C", + X"00",X"0C",X"00",X"AD",X"2F",X"47",X"E6",X"1F",X"28",X"03",X"DD",X"70",X"0D",X"DD",X"4E",X"09", + X"DD",X"7E",X"0B",X"E6",X"08",X"28",X"02",X"0E",X"00",X"DD",X"71",X"0F",X"78",X"07",X"07",X"07", + X"E6",X"07",X"21",X"B0",X"3B",X"D7",X"DD",X"77",X"0C",X"78",X"E6",X"1F",X"28",X"09",X"E6",X"0F", + X"21",X"B8",X"3B",X"D7",X"DD",X"77",X"0E",X"DD",X"6E",X"0E",X"26",X"00",X"DD",X"7E",X"0D",X"E6", + X"10",X"28",X"02",X"3E",X"01",X"DD",X"86",X"04",X"CA",X"E8",X"2E",X"C3",X"E4",X"2E",X"DD",X"7E", + X"00",X"A7",X"20",X"27",X"DD",X"7E",X"02",X"A7",X"C8",X"DD",X"36",X"02",X"00",X"DD",X"36",X"0D", + X"00",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"0F",X"00",X"FD",X"36",X"00",X"00",X"FD",X"36",X"01", + X"00",X"FD",X"36",X"02",X"00",X"FD",X"36",X"03",X"00",X"AF",X"C9",X"4F",X"06",X"08",X"1E",X"80", + X"7B",X"A1",X"20",X"05",X"CB",X"3B",X"10",X"F8",X"C9",X"DD",X"7E",X"02",X"A3",X"20",X"3F",X"DD", + X"73",X"02",X"05",X"78",X"07",X"07",X"07",X"4F",X"06",X"00",X"E5",X"09",X"DD",X"E5",X"D1",X"13", + X"13",X"13",X"01",X"08",X"00",X"ED",X"B0",X"E1",X"DD",X"7E",X"06",X"E6",X"7F",X"DD",X"77",X"0C", + X"DD",X"7E",X"04",X"DD",X"77",X"0E",X"DD",X"7E",X"09",X"47",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F", + X"DD",X"77",X"0B",X"E6",X"08",X"20",X"07",X"DD",X"70",X"0F",X"DD",X"36",X"0D",X"00",X"DD",X"35", + X"0C",X"20",X"5A",X"DD",X"7E",X"08",X"A7",X"28",X"10",X"DD",X"35",X"08",X"20",X"0B",X"7B",X"2F", + X"DD",X"A6",X"00",X"DD",X"77",X"00",X"C3",X"EE",X"2D",X"DD",X"7E",X"06",X"E6",X"7F",X"DD",X"77", + X"0C",X"DD",X"CB",X"06",X"7E",X"28",X"16",X"DD",X"7E",X"05",X"ED",X"44",X"DD",X"77",X"05",X"DD", + X"CB",X"0D",X"46",X"DD",X"CB",X"0D",X"C6",X"28",X"24",X"DD",X"CB",X"0D",X"86",X"DD",X"7E",X"04", + X"DD",X"86",X"07",X"DD",X"77",X"04",X"DD",X"77",X"0E",X"DD",X"7E",X"09",X"DD",X"86",X"0A",X"DD", + X"77",X"09",X"47",X"DD",X"7E",X"0B",X"E6",X"08",X"20",X"03",X"DD",X"70",X"0F",X"DD",X"7E",X"0E", + X"DD",X"86",X"05",X"DD",X"77",X"0E",X"6F",X"26",X"00",X"DD",X"7E",X"03",X"E6",X"70",X"28",X"08", + X"0F",X"0F",X"0F",X"0F",X"47",X"29",X"10",X"FD",X"FD",X"75",X"00",X"7D",X"0F",X"0F",X"0F",X"0F", + X"FD",X"77",X"01",X"FD",X"74",X"02",X"7C",X"0F",X"0F",X"0F",X"0F",X"FD",X"77",X"03",X"DD",X"7E", + X"0B",X"E7",X"22",X"2F",X"26",X"2F",X"2B",X"2F",X"3C",X"2F",X"43",X"2F",X"4A",X"2F",X"4B",X"2F", + X"4C",X"2F",X"4D",X"2F",X"4E",X"2F",X"4F",X"2F",X"50",X"2F",X"51",X"2F",X"52",X"2F",X"53",X"2F", + X"54",X"2F",X"DD",X"7E",X"0F",X"C9",X"DD",X"7E",X"0F",X"18",X"09",X"3A",X"84",X"4C",X"E6",X"01", + X"DD",X"7E",X"0F",X"C0",X"E6",X"0F",X"C8",X"3D",X"DD",X"77",X"0F",X"C9",X"3A",X"84",X"4C",X"E6", + X"03",X"18",X"ED",X"3A",X"84",X"4C",X"E6",X"07",X"18",X"E6",X"C9",X"C9",X"C9",X"C9",X"C9",X"C9", + X"C9",X"C9",X"C9",X"C9",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"DD",X"77",X"06",X"23", + X"7E",X"DD",X"77",X"07",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06", + X"DD",X"74",X"07",X"DD",X"77",X"03",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD", + X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"04",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E", + X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"09",X"C9",X"DD",X"6E",X"06",X"DD",X"66", + X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"0B",X"C9",X"CD",X"7C",X"0E", + X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"21",X"1D",X"4E",X"11",X"EB",X"41", + X"ED",X"A0",X"11",X"90",X"41",X"ED",X"A0",X"11",X"F4",X"41",X"ED",X"A0",X"11",X"70",X"42",X"ED", + X"A0",X"C9",X"CD",X"41",X"32",X"C8",X"CD",X"49",X"32",X"28",X"03",X"CD",X"60",X"32",X"CD",X"6F", + X"0A",X"CD",X"F9",X"31",X"C9",X"21",X"00",X"00",X"22",X"EE",X"4D",X"22",X"EE",X"90",X"AF",X"32", + X"ED",X"90",X"CD",X"69",X"3F",X"C9",X"32",X"02",X"4E",X"32",X"03",X"4E",X"C9",X"C9",X"8B",X"1F", + X"00",X"D0",X"D2",X"D2",X"CC",X"CA",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2", + X"CC",X"CA",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"CC",X"CA",X"D2",X"D2", + X"D4",X"DA",X"FA",X"FA",X"DE",X"E4",X"0B",X"DE",X"E4",X"0B",X"DE",X"E4",X"FA",X"FA",X"DC",X"DA", + X"FA",X"FA",X"ED",X"E4",X"02",X"FC",X"FC",X"02",X"FC",X"FC",X"FC",X"FC",X"FC",X"02",X"DE",X"E4", + X"02",X"FC",X"FC",X"FC",X"FC",X"FC",X"02",X"FC",X"FC",X"02",X"DE",X"EF",X"FA",X"FA",X"DC",X"DA", + X"FA",X"03",X"E4",X"02",X"FC",X"FC",X"02",X"FC",X"FC",X"FC",X"FC",X"FC",X"02",X"ED",X"EF",X"02", + X"FC",X"FC",X"FC",X"FC",X"FC",X"02",X"FC",X"FC",X"02",X"DE",X"72",X"02",X"FA",X"DC",X"DA",X"FA", + X"02",X"EC",X"E4",X"02",X"FC",X"FC",X"05",X"FC",X"FC",X"05",X"FC",X"FC",X"05",X"FC",X"FC",X"02", + X"DE",X"C9",X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"DE",X"E4",X"02",X"FC",X"FC",X"FC",X"FC",X"FC", + X"02",X"FC",X"FC",X"02",X"FC",X"FC",X"02",X"FC",X"FC",X"02",X"FC",X"FC",X"FC",X"FC",X"FC",X"02", + X"DE",X"E4",X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"DE",X"E4",X"02",X"FC",X"FC",X"FC",X"FC",X"FC", + X"02",X"FC",X"FC",X"02",X"FC",X"FC",X"02",X"FC",X"FC",X"02",X"FC",X"FC",X"FC",X"FC",X"FC",X"02", + X"DE",X"E4",X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"DE",X"E4",X"0B",X"FC",X"FC",X"0B",X"DE",X"E4", + X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"DE",X"E4",X"02",X"FC",X"FC",X"FC",X"FC",X"FC",X"02",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"02",X"FC",X"FC",X"FC",X"FC",X"FC",X"02",X"DE",X"E4", + X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"ED",X"E4",X"02",X"FC",X"FC",X"FC",X"FC",X"FC",X"02",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"02",X"FC",X"FC",X"FC",X"FC",X"FC",X"02",X"DE",X"C8", + X"FA",X"02",X"DC",X"DA",X"FA",X"03",X"E4",X"05",X"FC",X"FC",X"05",X"72",X"72",X"05",X"FC",X"FC", + X"05",X"DE",X"72",X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"EC",X"E4",X"02",X"FC",X"FC",X"02",X"FC", + X"FC",X"02",X"EA",X"E2",X"E2",X"E2",X"E2",X"E2",X"E2",X"C2",X"02",X"FC",X"FC",X"02",X"FC",X"FC", + X"02",X"DE",X"C9",X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"DE",X"E4",X"02",X"FC",X"FC",X"05",X"E0", + X"FC",X"05",X"FC",X"C4",X"05",X"FC",X"FC",X"02",X"DE",X"E4",X"FA",X"02",X"DC",X"DA",X"FA",X"02", + X"DE",X"E4",X"02",X"FC",X"FC",X"FC",X"FC",X"FC",X"02",X"E0",X"FC",X"FC",X"FC",X"FC",X"02",X"FC", + X"C4",X"02",X"FC",X"FC",X"FC",X"FC",X"FC",X"02",X"DE",X"E4",X"FA",X"02",X"DC",X"00",X"00",X"00", + X"CD",X"19",X"83",X"06",X"10",X"7D",X"32",X"04",X"4D",X"80",X"32",X"06",X"4D",X"32",X"D2",X"4D", + X"7C",X"32",X"D3",X"4D",X"90",X"32",X"05",X"4D",X"32",X"07",X"4D",X"C9",X"00",X"00",X"00",X"00", + X"00",X"00",X"CD",X"20",X"83",X"CD",X"80",X"31",X"C9",X"DD",X"21",X"39",X"4D",X"CD",X"EA",X"29", + X"11",X"07",X"00",X"A7",X"ED",X"52",X"C9",X"CD",X"0C",X"2D",X"CD",X"50",X"80",X"C9",X"EB",X"2F", + X"CD",X"74",X"06",X"C9",X"3A",X"ED",X"4D",X"A7",X"20",X"11",X"3E",X"01",X"32",X"ED",X"4D",X"CD", + X"E9",X"0F",X"AF",X"32",X"80",X"50",X"32",X"81",X"50",X"C9",X"00",X"3A",X"EF",X"4D",X"A7",X"20", + X"04",X"CD",X"79",X"3F",X"C9",X"3A",X"EE",X"4D",X"A7",X"C0",X"CD",X"C7",X"3F",X"C9",X"CD",X"C4", + X"31",X"3A",X"EE",X"4D",X"A7",X"C8",X"CD",X"72",X"09",X"AF",X"32",X"ED",X"4D",X"CD",X"E5",X"2F", + X"C9",X"CD",X"06",X"18",X"CD",X"A9",X"83",X"C9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3A",X"ED",X"4D",X"A7",X"20",X"0C",X"3E",X"01",X"32",X"ED",X"4D",X"CD",X"E1",X"0F",X"CD",X"7E", + X"3E",X"C9",X"3A",X"EE",X"4D",X"A7",X"C0",X"CD",X"44",X"3C",X"C9",X"CD",X"10",X"32",X"3A",X"EE", + X"4D",X"A7",X"C8",X"CD",X"F9",X"31",X"CD",X"A3",X"06",X"CD",X"A0",X"3C",X"C9",X"00",X"00",X"00", + X"00",X"CD",X"FF",X"3E",X"3A",X"EE",X"4D",X"A7",X"C9",X"AF",X"32",X"E4",X"90",X"CD",X"30",X"0A", + X"CD",X"6A",X"2B",X"DD",X"21",X"D8",X"43",X"FD",X"21",X"C5",X"43",X"CD",X"69",X"03",X"CD",X"76", + X"03",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"21",X"0C",X"4D",X"CD",X"A9",X"31",X"30", + X"0E",X"3A",X"B2",X"4D",X"A7",X"C0",X"3E",X"01",X"32",X"B2",X"4D",X"CD",X"2E",X"1F",X"C9",X"AF", + X"32",X"B2",X"4D",X"C9",X"FD",X"21",X"0E",X"4D",X"CD",X"A9",X"31",X"30",X"0E",X"3A",X"B3",X"4D", + X"A7",X"C0",X"3E",X"01",X"32",X"B3",X"4D",X"CD",X"55",X"1F",X"C9",X"AF",X"32",X"B3",X"4D",X"C9", + X"FD",X"21",X"10",X"4D",X"CD",X"A9",X"31",X"30",X"0E",X"3A",X"B4",X"4D",X"A7",X"C0",X"3E",X"01", + X"32",X"B4",X"4D",X"CD",X"7C",X"1F",X"C9",X"AF",X"32",X"B4",X"4D",X"C9",X"21",X"C8",X"3B",X"3E", + X"02",X"32",X"CC",X"4E",X"C3",X"C4",X"2C",X"20",X"FC",X"24",X"10",X"F7",X"CD",X"F4",X"3A",X"32", + X"C0",X"50",X"3A",X"40",X"50",X"E6",X"10",X"CA",X"DF",X"32",X"C3",X"4B",X"23",X"32",X"C0",X"50", + X"21",X"00",X"28",X"2B",X"7C",X"B5",X"20",X"FB",X"C9",X"30",X"31",X"35",X"31",X"30",X"32",X"00", + X"FF",X"01",X"00",X"00",X"01",X"FF",X"00",X"00",X"FF",X"01",X"00",X"00",X"01",X"FF",X"00",X"55", + X"2A",X"55",X"2A",X"55",X"55",X"55",X"55",X"55",X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"25", + X"25",X"25",X"25",X"22",X"22",X"22",X"22",X"01",X"01",X"01",X"01",X"58",X"02",X"08",X"07",X"60", + X"09",X"10",X"0E",X"68",X"10",X"70",X"17",X"14",X"19",X"52",X"4A",X"A5",X"94",X"AA",X"2A",X"55", + X"55",X"55",X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"92",X"24",X"25",X"49",X"48",X"24",X"22", + X"91",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"55",X"2A",X"55",X"2A",X"55",X"55",X"55",X"55",X"AA",X"2A",X"55",X"55",X"55", + X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"48",X"24",X"22",X"91",X"21",X"44",X"44",X"08",X"58", + X"02",X"34",X"08",X"D8",X"09",X"B4",X"0F",X"58",X"11",X"08",X"16",X"34",X"17",X"55",X"55",X"55", + X"55",X"D5",X"6A",X"D5",X"6A",X"AA",X"6A",X"55",X"D5",X"55",X"55",X"55",X"55",X"AA",X"2A",X"55", + X"55",X"92",X"24",X"92",X"24",X"22",X"22",X"22",X"22",X"A4",X"01",X"54",X"06",X"F8",X"07",X"A8", + X"0C",X"D4",X"0D",X"84",X"12",X"B0",X"13",X"D5",X"6A",X"D5",X"6A",X"D6",X"5A",X"AD",X"B5",X"D6", + X"5A",X"AD",X"B5",X"D5",X"6A",X"D5",X"6A",X"AA",X"6A",X"55",X"D5",X"92",X"24",X"25",X"49",X"48", + X"24",X"22",X"91",X"A4",X"01",X"54",X"06",X"F8",X"07",X"A8",X"0C",X"D4",X"0D",X"FE",X"FF",X"FF", + X"FF",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"B6",X"6D",X"6D",X"DB",X"6D",X"6D",X"6D", + X"6D",X"D6",X"5A",X"AD",X"B5",X"25",X"25",X"25",X"25",X"92",X"24",X"92",X"24",X"2C",X"01",X"DC", + X"05",X"08",X"07",X"B8",X"0B",X"E4",X"0C",X"FE",X"FF",X"FF",X"FF",X"D5",X"6A",X"D5",X"6A",X"D5", + X"6A",X"D5",X"6A",X"B6",X"6D",X"6D",X"DB",X"6D",X"6D",X"6D",X"6D",X"D6",X"5A",X"AD",X"B5",X"48", + X"24",X"22",X"91",X"92",X"24",X"92",X"24",X"2C",X"01",X"DC",X"05",X"08",X"07",X"B8",X"0B",X"E4", + X"0C",X"FE",X"FF",X"FF",X"FF",X"00",X"D0",X"D2",X"D2",X"CC",X"CA",X"D2",X"D2",X"D2",X"D2",X"D2", + X"D2",X"D2",X"D2",X"D2",X"D2",X"CC",X"CA",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2", + X"D2",X"CC",X"CA",X"D2",X"D2",X"D4",X"DA",X"FA",X"FA",X"DE",X"E4",X"0B",X"DE",X"E4",X"0B",X"DE", + X"E4",X"FA",X"FA",X"DC",X"DA",X"FA",X"FA",X"ED",X"E4",X"02",X"EC",X"EE",X"02",X"EC",X"E8",X"E8", + X"E8",X"EE",X"02",X"DE",X"E4",X"02",X"EC",X"E8",X"E8",X"E8",X"EE",X"02",X"EC",X"EE",X"02",X"DE", + X"C8",X"FA",X"FA",X"DC",X"DA",X"FA",X"03",X"E4",X"02",X"DE",X"E4",X"02",X"ED",X"E9",X"E9",X"C0", + X"E4",X"02",X"ED",X"EF",X"02",X"DE",X"CE",X"E9",X"E9",X"EF",X"02",X"DE",X"E4",X"02",X"DE",X"72", + X"02",X"72",X"DC",X"DA",X"FA",X"02",X"EC",X"E4",X"02",X"DE",X"E4",X"05",X"DE",X"E4",X"05",X"DE", + X"E4",X"05",X"DE",X"E4",X"02",X"DE",X"C9",X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"DE",X"E4",X"02", + X"DE",X"CF",X"E8",X"E8",X"EE",X"02",X"DE",X"E4",X"02",X"EC",X"EE",X"02",X"DE",X"E4",X"02",X"EC", + X"E8",X"E8",X"C1",X"E4",X"02",X"DE",X"E4",X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"DE",X"E4",X"02", + X"ED",X"E9",X"E9",X"E9",X"EF",X"02",X"ED",X"EF",X"02",X"DE",X"E4",X"02",X"ED",X"EF",X"02",X"ED", + X"E9",X"E9",X"E9",X"EF",X"02",X"DE",X"E4",X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"DE",X"E4",X"0B", + X"DE",X"E4",X"0B",X"DE",X"E4",X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"DE",X"E4",X"02",X"EC",X"E8", + X"E8",X"E8",X"EE",X"02",X"EC",X"E8",X"E8",X"C1",X"CF",X"E8",X"E8",X"EE",X"02",X"EC",X"E8",X"E8", + X"E8",X"EE",X"02",X"DE",X"E4",X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"ED",X"E4",X"02",X"ED",X"E9", + X"E9",X"C0",X"E4",X"02",X"ED",X"E9",X"E9",X"E9",X"E9",X"E9",X"E9",X"EF",X"02",X"DE",X"CE",X"E9", + X"E9",X"EF",X"02",X"DE",X"C8",X"FA",X"02",X"DC",X"DA",X"FA",X"03",X"E4",X"05",X"DE",X"E4",X"05", + X"72",X"72",X"05",X"DE",X"E4",X"05",X"DE",X"72",X"02",X"72",X"DC",X"DA",X"FA",X"02",X"EC",X"E4", + X"02",X"EC",X"EE",X"02",X"ED",X"EF",X"02",X"EA",X"E2",X"E2",X"E2",X"E2",X"E2",X"E2",X"C2",X"02", + X"ED",X"EF",X"02",X"EC",X"EE",X"02",X"DE",X"C9",X"FA",X"02",X"DC",X"DA",X"FA",X"02",X"DE",X"E4", + X"02",X"DE",X"E4",X"05",X"E0",X"FC",X"05",X"FC",X"C4",X"05",X"DE",X"E4",X"02",X"DE",X"E4",X"FA", + X"02",X"DC",X"DA",X"FA",X"02",X"DE",X"E4",X"02",X"DE",X"D9",X"E8",X"E8",X"EE",X"02",X"E0",X"FC", + X"FC",X"FC",X"FC",X"02",X"FC",X"C4",X"02",X"EC",X"E8",X"E8",X"D7",X"E4",X"02",X"DE",X"E4",X"02", + X"FC",X"DC",X"00",X"49",X"42",X"4A",X"42",X"69",X"42",X"6A",X"42",X"86",X"42",X"87",X"42",X"88", + X"42",X"89",X"42",X"8A",X"42",X"A6",X"42",X"A7",X"42",X"A8",X"42",X"A9",X"42",X"AA",X"42",X"4F", + X"42",X"50",X"42",X"6F",X"42",X"70",X"42",X"8C",X"42",X"8D",X"42",X"8E",X"42",X"8F",X"42",X"90", + X"42",X"91",X"42",X"92",X"42",X"93",X"42",X"AC",X"42",X"AD",X"42",X"AE",X"42",X"AF",X"42",X"B0", + X"42",X"B1",X"42",X"B2",X"42",X"B3",X"42",X"CF",X"42",X"D0",X"42",X"EF",X"42",X"F0",X"42",X"0F", + X"43",X"10",X"43",X"55",X"42",X"56",X"42",X"75",X"42",X"76",X"42",X"95",X"42",X"96",X"42",X"97", + X"42",X"98",X"42",X"99",X"42",X"A5",X"42",X"A6",X"42",X"A7",X"42",X"A8",X"42",X"A9",X"42",X"E6", + X"42",X"E7",X"42",X"E8",X"42",X"E9",X"42",X"EA",X"42",X"06",X"43",X"07",X"43",X"08",X"43",X"09", + X"43",X"0A",X"43",X"26",X"43",X"27",X"43",X"46",X"43",X"47",X"43",X"66",X"43",X"67",X"43",X"EC", + X"42",X"ED",X"42",X"0C",X"43",X"0D",X"43",X"2C",X"43",X"2D",X"43",X"49",X"43",X"4A",X"43",X"4B", + X"43",X"4C",X"43",X"4D",X"43",X"69",X"43",X"6A",X"43",X"6B",X"43",X"6C",X"43",X"6D",X"43",X"F2", + X"42",X"F3",X"42",X"12",X"43",X"13",X"43",X"32",X"43",X"33",X"43",X"52",X"43",X"53",X"43",X"54", + X"43",X"55",X"43",X"56",X"43",X"62",X"43",X"63",X"43",X"64",X"43",X"65",X"43",X"F5",X"42",X"F6", + X"42",X"F7",X"42",X"F8",X"42",X"F9",X"42",X"15",X"43",X"16",X"43",X"17",X"43",X"18",X"43",X"19", + X"43",X"38",X"43",X"39",X"43",X"58",X"43",X"59",X"43",X"78",X"43",X"79",X"43",X"79",X"43",X"01", + X"01",X"04",X"01",X"01",X"01",X"13",X"37",X"23",X"37",X"32",X"37",X"41",X"37",X"5A",X"37",X"6A", + X"37",X"7A",X"37",X"86",X"37",X"9D",X"37",X"B1",X"37",X"C8",X"37",X"E9",X"37",X"FD",X"37",X"0C", + X"38",X"1A",X"38",X"28",X"38",X"36",X"38",X"44",X"38",X"52",X"38",X"60",X"38",X"6E",X"38",X"7C", + X"38",X"8A",X"38",X"41",X"8B",X"01",X"00",X"02",X"00",X"03",X"00",X"BC",X"38",X"C4",X"38",X"CE", + X"38",X"D8",X"38",X"E2",X"38",X"EC",X"38",X"F6",X"38",X"00",X"39",X"0A",X"39",X"1A",X"39",X"6F", + X"39",X"2A",X"39",X"58",X"39",X"41",X"39",X"A3",X"39",X"86",X"39",X"97",X"39",X"B0",X"39",X"BD", + X"39",X"CA",X"39",X"D3",X"39",X"E1",X"39",X"EE",X"39",X"FC",X"39",X"09",X"3A",X"1A",X"3A",X"2C", + X"3A",X"3D",X"3A",X"D4",X"83",X"48",X"49",X"47",X"48",X"40",X"53",X"43",X"4F",X"52",X"45",X"2F", + X"8F",X"2F",X"80",X"3B",X"80",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"40",X"40",X"2F",X"8F", + X"2F",X"80",X"28",X"02",X"41",X"4E",X"44",X"2F",X"81",X"80",X"4C",X"41",X"59",X"2F",X"8F",X"2F", + X"80",X"8B",X"02",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"45",X"2F",X"85",X"2F", + X"10",X"10",X"1A",X"1A",X"1A",X"1A",X"1A",X"1A",X"10",X"10",X"8B",X"02",X"50",X"4C",X"41",X"59", + X"45",X"52",X"40",X"54",X"57",X"4F",X"2F",X"85",X"2F",X"80",X"94",X"02",X"47",X"41",X"4D",X"45", + X"40",X"40",X"4F",X"56",X"45",X"52",X"2F",X"81",X"2F",X"80",X"2B",X"80",X"4C",X"45",X"56",X"45", + X"4C",X"40",X"2F",X"83",X"2F",X"90",X"EE",X"02",X"50",X"55",X"53",X"48",X"40",X"53",X"54",X"41", + X"52",X"54",X"40",X"42",X"55",X"54",X"54",X"4F",X"4E",X"2F",X"87",X"2F",X"80",X"B2",X"02",X"31", + X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"4C",X"59",X"40",X"2F",X"85",X"2F", + X"80",X"B2",X"02",X"31",X"40",X"4F",X"52",X"40",X"32",X"40",X"50",X"4C",X"41",X"59",X"45",X"52", + X"53",X"2F",X"85",X"00",X"2F",X"00",X"80",X"00",X"96",X"03",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"2F",X"82",X"2F",X"80",X"BA",X"02",X"5C",X"2F",X"28",X"29",X"2A", + X"2B",X"2C",X"2D",X"2E",X"40",X"31",X"39",X"38",X"31",X"2F",X"83",X"2F",X"80",X"AA",X"02",X"34", + X"30",X"40",X"54",X"48",X"49",X"45",X"56",X"45",X"53",X"2F",X"81",X"80",X"70",X"02",X"26",X"54", + X"48",X"49",X"45",X"56",X"45",X"53",X"26",X"2F",X"85",X"80",X"50",X"01",X"3B",X"3B",X"3B",X"32", + X"30",X"30",X"50",X"54",X"53",X"2F",X"8F",X"80",X"72",X"02",X"26",X"43",X"41",X"50",X"54",X"41", + X"49",X"4E",X"40",X"2F",X"85",X"80",X"73",X"02",X"40",X"40",X"54",X"48",X"49",X"45",X"46",X"40", + X"26",X"2F",X"85",X"80",X"53",X"01",X"3B",X"3B",X"3B",X"38",X"30",X"30",X"50",X"54",X"53",X"2F", + X"8F",X"80",X"75",X"02",X"26",X"40",X"A7",X"40",X"4D",X"41",X"4E",X"40",X"26",X"2F",X"85",X"80", + X"55",X"01",X"3B",X"3B",X"3B",X"34",X"30",X"30",X"50",X"54",X"53",X"2F",X"8F",X"80",X"77",X"02", + X"26",X"4D",X"59",X"53",X"54",X"45",X"52",X"59",X"26",X"2F",X"85",X"80",X"57",X"01",X"3B",X"3B", + X"3B",X"31",X"30",X"30",X"50",X"54",X"53",X"2F",X"8F",X"80",X"A5",X"02",X"4F",X"50",X"45",X"4E", + X"40",X"53",X"45",X"53",X"41",X"4D",X"45",X"5B",X"2F",X"81",X"80",X"4D",X"41",X"43",X"48",X"49", + X"42",X"55",X"53",X"45",X"3B",X"3B",X"2F",X"83",X"2F",X"80",X"C8",X"02",X"40",X"52",X"4F",X"4D", + X"50",X"3B",X"3B",X"3B",X"3B",X"3B",X"3B",X"3B",X"2F",X"83",X"2F",X"80",X"12",X"02",X"81",X"85", + X"2F",X"83",X"2F",X"90",X"32",X"02",X"40",X"82",X"85",X"40",X"2F",X"83",X"2F",X"90",X"32",X"02", + X"40",X"83",X"85",X"40",X"2F",X"83",X"2F",X"90",X"32",X"02",X"40",X"84",X"85",X"40",X"2F",X"83", + X"2F",X"90",X"32",X"02",X"40",X"86",X"8D",X"8E",X"2F",X"83",X"2F",X"90",X"32",X"02",X"87",X"88", + X"8D",X"8E",X"2F",X"83",X"2F",X"90",X"32",X"02",X"89",X"8A",X"8D",X"8E",X"2F",X"83",X"2F",X"90", + X"32",X"02",X"8B",X"8C",X"8D",X"8E",X"2F",X"83",X"2F",X"90",X"04",X"03",X"4D",X"45",X"4D",X"4F", + X"52",X"59",X"40",X"40",X"4F",X"4B",X"2F",X"8F",X"2F",X"80",X"04",X"03",X"42",X"41",X"44",X"40", + X"40",X"40",X"40",X"52",X"40",X"4D",X"2F",X"8F",X"2F",X"80",X"08",X"03",X"31",X"40",X"43",X"4F", + X"49",X"4E",X"40",X"40",X"31",X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"2F",X"8F",X"2F", + X"80",X"08",X"03",X"32",X"40",X"43",X"4F",X"49",X"4E",X"53",X"40",X"31",X"40",X"43",X"52",X"45", + X"44",X"49",X"54",X"40",X"2F",X"8F",X"2F",X"80",X"08",X"03",X"31",X"40",X"43",X"4F",X"49",X"4E", + X"40",X"40",X"32",X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"53",X"2F",X"8F",X"2F",X"80",X"08", + X"03",X"46",X"52",X"45",X"45",X"40",X"40",X"50",X"4C",X"41",X"59",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"2F",X"8F",X"2F",X"80",X"0A",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"4E", + X"4F",X"4E",X"45",X"2F",X"8F",X"2F",X"80",X"0A",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"2F", + X"8F",X"2F",X"80",X"0C",X"03",X"50",X"55",X"43",X"4B",X"4D",X"41",X"4E",X"2F",X"8F",X"2F",X"80", + X"0E",X"03",X"54",X"41",X"42",X"4C",X"45",X"40",X"40",X"2F",X"8F",X"2F",X"80",X"0E",X"03",X"55", + X"50",X"52",X"49",X"47",X"48",X"54",X"2F",X"8F",X"2F",X"80",X"0A",X"02",X"30",X"30",X"30",X"2F", + X"8F",X"2F",X"80",X"6B",X"01",X"26",X"41",X"4F",X"53",X"55",X"4B",X"45",X"26",X"2F",X"85",X"2F", + X"80",X"4B",X"01",X"26",X"4D",X"55",X"43",X"4B",X"59",X"26",X"2F",X"85",X"2F",X"80",X"6E",X"01", + X"26",X"47",X"55",X"5A",X"55",X"54",X"41",X"26",X"2F",X"87",X"2F",X"80",X"4E",X"01",X"26",X"4D", + X"4F",X"43",X"4B",X"59",X"26",X"2F",X"87",X"2F",X"80",X"CB",X"02",X"40",X"4B",X"49",X"4D",X"41", + X"47",X"55",X"52",X"45",X"3B",X"3B",X"2F",X"85",X"2F",X"80",X"CB",X"02",X"40",X"53",X"54",X"59", + X"4C",X"49",X"53",X"54",X"3B",X"3B",X"3B",X"3B",X"2F",X"85",X"2F",X"80",X"CE",X"02",X"40",X"4F", + X"54",X"4F",X"42",X"4F",X"4B",X"45",X"3B",X"3B",X"3B",X"2F",X"87",X"2F",X"80",X"CE",X"02",X"40", + X"43",X"52",X"59",X"42",X"41",X"42",X"59",X"3B",X"3B",X"3B",X"3B",X"2F",X"87",X"2F",X"80",X"01", + X"01",X"03",X"01",X"01",X"01",X"03",X"02",X"02",X"02",X"01",X"01",X"01",X"01",X"02",X"04",X"04", + X"04",X"06",X"02",X"02",X"02",X"02",X"04",X"02",X"04",X"04",X"04",X"06",X"02",X"02",X"02",X"02", + X"01",X"01",X"01",X"01",X"02",X"04",X"04",X"04",X"06",X"02",X"02",X"02",X"02",X"06",X"04",X"05", + X"01",X"01",X"03",X"01",X"01",X"01",X"04",X"01",X"01",X"01",X"03",X"01",X"01",X"04",X"01",X"01", + X"01",X"6C",X"05",X"01",X"01",X"01",X"18",X"04",X"04",X"18",X"05",X"01",X"01",X"01",X"17",X"02", + X"03",X"04",X"16",X"04",X"03",X"01",X"01",X"01",X"76",X"01",X"01",X"01",X"01",X"03",X"01",X"01", + X"01",X"02",X"04",X"02",X"04",X"0E",X"02",X"04",X"02",X"04",X"02",X"04",X"0B",X"01",X"01",X"01", + X"02",X"04",X"02",X"01",X"01",X"01",X"01",X"02",X"02",X"02",X"0E",X"02",X"04",X"02",X"04",X"02", + X"01",X"02",X"01",X"0A",X"01",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"03",X"01",X"01",X"03", + X"04",X"00",X"02",X"40",X"01",X"3E",X"3D",X"10",X"40",X"40",X"0E",X"3D",X"3E",X"10",X"C2",X"43", + X"01",X"3E",X"3D",X"10",X"21",X"A2",X"40",X"11",X"4F",X"3A",X"36",X"14",X"1A",X"A7",X"C8",X"13", + X"85",X"6F",X"D2",X"FA",X"3A",X"24",X"18",X"F2",X"C5",X"CD",X"D3",X"0F",X"CD",X"50",X"24",X"30", + X"13",X"CD",X"55",X"24",X"38",X"0E",X"CD",X"5A",X"24",X"38",X"09",X"CD",X"5F",X"24",X"30",X"04", + X"C1",X"C3",X"B6",X"8B",X"C1",X"C3",X"B5",X"8B",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"73",X"20",X"00",X"0C",X"00",X"0A",X"1F",X"00",X"40",X"20",X"CC",X"86",X"77",X"1C",X"0F",X"FF", + X"70",X"20",X"FB",X"15",X"00",X"00",X"0F",X"00",X"72",X"32",X"FB",X"C7",X"00",X"00",X"0F",X"00", + X"70",X"20",X"20",X"15",X"00",X"00",X"1F",X"00",X"70",X"20",X"EB",X"15",X"00",X"00",X"02",X"00", + X"36",X"48",X"08",X"88",X"00",X"00",X"06",X"00",X"24",X"00",X"06",X"08",X"00",X"00",X"0A",X"00", + X"40",X"00",X"87",X"17",X"00",X"01",X"0C",X"00",X"70",X"20",X"FF",X"3A",X"E0",X"90",X"A7",X"28", + X"04",X"21",X"00",X"00",X"C9",X"3E",X"01",X"32",X"E0",X"90",X"CD",X"66",X"A0",X"CD",X"7C",X"0E", + X"C9",X"AF",X"32",X"E0",X"90",X"32",X"EF",X"90",X"32",X"DF",X"90",X"C9",X"AF",X"32",X"E2",X"90", + X"32",X"1F",X"4D",X"21",X"00",X"00",X"22",X"EB",X"90",X"21",X"04",X"4E",X"C9",X"FF",X"FF",X"FF", + X"01",X"02",X"04",X"08",X"10",X"20",X"40",X"80",X"00",X"57",X"5C",X"61",X"67",X"6D",X"74",X"7B", + X"82",X"8A",X"92",X"9A",X"A3",X"AD",X"B8",X"C3",X"BE",X"06",X"4A",X"A6",X"C4",X"03",X"B1",X"A5", + X"FF",X"FF",X"FF",X"FF",X"F5",X"32",X"00",X"50",X"AF",X"32",X"C2",X"50",X"F3",X"C5",X"D5",X"E5", + X"DD",X"E5",X"FD",X"E5",X"21",X"8C",X"4E",X"11",X"60",X"50",X"01",X"10",X"00",X"ED",X"B0",X"3A", + X"CC",X"4E",X"A7",X"3A",X"CF",X"4E",X"20",X"03",X"3A",X"9F",X"4E",X"32",X"45",X"50",X"3A",X"DC", + X"4E",X"A7",X"3A",X"DF",X"4E",X"20",X"03",X"3A",X"AF",X"4E",X"32",X"4A",X"50",X"3A",X"EC",X"4E", + X"A7",X"3A",X"EF",X"4E",X"20",X"03",X"3A",X"BF",X"4E",X"32",X"4F",X"50",X"21",X"02",X"4C",X"11", + X"22",X"4C",X"01",X"1C",X"00",X"ED",X"B0",X"C3",X"E7",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"2A",X"EB",X"90",X"11",X"FF",X"00",X"A7",X"ED",X"52",X"28",X"08",X"2A", + X"EB",X"90",X"23",X"22",X"EB",X"90",X"C9",X"CD",X"A3",X"3F",X"C9",X"CD",X"17",X"2D",X"3A",X"EA", + X"90",X"A7",X"28",X"14",X"3E",X"02",X"32",X"CC",X"4E",X"3A",X"E4",X"90",X"A7",X"28",X"05",X"3E", + X"02",X"32",X"DC",X"4E",X"CD",X"C1",X"2C",X"C9",X"3A",X"00",X"4E",X"FE",X"03",X"D0",X"CD",X"F3", + X"2C",X"C9",X"3A",X"09",X"4E",X"A7",X"20",X"04",X"CD",X"A3",X"3F",X"C9",X"3A",X"E3",X"90",X"A7", + X"20",X"04",X"CD",X"A3",X"3F",X"C9",X"CD",X"44",X"3C",X"3E",X"01",X"32",X"EA",X"90",X"C9",X"FF", + X"06",X"01",X"CD",X"ED",X"23",X"06",X"01",X"CD",X"D7",X"24",X"06",X"00",X"CD",X"19",X"24",X"06", + X"00",X"CD",X"C9",X"24",X"06",X"00",X"CD",X"48",X"24",X"00",X"00",X"00",X"00",X"00",X"06",X"05", + X"CD",X"64",X"25",X"06",X"00",X"CD",X"E0",X"2A",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F5",X"E5", + X"D5",X"11",X"20",X"00",X"77",X"3C",X"23",X"77",X"19",X"3C",X"3C",X"77",X"3D",X"2B",X"77",X"00", + X"D1",X"E1",X"F1",X"C9",X"F5",X"E5",X"D5",X"11",X"00",X"04",X"19",X"11",X"20",X"00",X"77",X"23", + X"77",X"19",X"77",X"2B",X"77",X"D1",X"E1",X"F1",X"C9",X"21",X"16",X"4E",X"7E",X"A7",X"C8",X"35", + X"21",X"FB",X"4D",X"34",X"CD",X"00",X"8C",X"C9",X"3A",X"EA",X"90",X"A7",X"C0",X"3A",X"09",X"4E", + X"C3",X"1D",X"3F",X"00",X"01",X"0B",X"00",X"21",X"3E",X"3D",X"11",X"16",X"4E",X"ED",X"B0",X"C9", + X"3E",X"01",X"ED",X"47",X"C3",X"10",X"89",X"4F",X"23",X"5E",X"23",X"56",X"EB",X"C9",X"07",X"DD", + X"40",X"00",X"C1",X"40",X"40",X"50",X"1D",X"00",X"00",X"C3",X"45",X"83",X"A7",X"C2",X"72",X"3D", + X"3A",X"FF",X"4D",X"A7",X"C2",X"C4",X"3D",X"3A",X"16",X"4E",X"A7",X"CA",X"72",X"3D",X"3A",X"37", + X"4D",X"FE",X"3D",X"00",X"00",X"00",X"00",X"C2",X"72",X"3D",X"3E",X"06",X"32",X"FF",X"4D",X"CD", + X"BB",X"3D",X"3A",X"AE",X"4D",X"A7",X"C2",X"9B",X"3D",X"3A",X"FE",X"4D",X"A7",X"C2",X"DA",X"3D", + X"3A",X"16",X"4E",X"A7",X"CA",X"9B",X"3D",X"3A",X"35",X"4D",X"FE",X"3D",X"00",X"00",X"00",X"00", + X"C2",X"9B",X"3D",X"3E",X"04",X"32",X"FE",X"4D",X"CD",X"BB",X"3D",X"3A",X"AD",X"4D",X"A7",X"C0", + X"3A",X"FD",X"4D",X"A7",X"C2",X"F0",X"3D",X"3A",X"16",X"4E",X"A7",X"C8",X"3A",X"33",X"4D",X"FE", + X"3D",X"00",X"00",X"00",X"00",X"C0",X"3E",X"02",X"32",X"FD",X"4D",X"CD",X"73",X"87",X"CD",X"FE", + X"85",X"C9",X"DE",X"C9",X"3A",X"37",X"4D",X"FE",X"22",X"00",X"00",X"00",X"00",X"C2",X"72",X"3D", + X"AF",X"32",X"FF",X"4D",X"CD",X"D6",X"8C",X"C3",X"72",X"3D",X"3A",X"35",X"4D",X"FE",X"22",X"00", + X"00",X"00",X"00",X"C2",X"9B",X"3D",X"AF",X"32",X"FE",X"4D",X"CD",X"D6",X"8C",X"C3",X"9B",X"3D", + X"3A",X"33",X"4D",X"FE",X"22",X"00",X"00",X"00",X"00",X"C0",X"AF",X"32",X"FD",X"4D",X"CD",X"D6", + X"8C",X"C9",X"3E",X"01",X"32",X"A5",X"4D",X"32",X"E2",X"90",X"C3",X"63",X"17",X"FF",X"FF",X"FF", + X"FF",X"FF",X"21",X"19",X"4E",X"34",X"7E",X"FE",X"09",X"28",X"08",X"21",X"FB",X"4D",X"35",X"CD", + X"26",X"8C",X"C9",X"3E",X"01",X"32",X"A5",X"4D",X"32",X"FA",X"4D",X"C9",X"FA",X"4D",X"C9",X"3A", + X"E4",X"4D",X"FE",X"01",X"28",X"0F",X"FE",X"02",X"28",X"0B",X"FE",X"03",X"28",X"03",X"FE",X"04", + X"00",X"01",X"B1",X"35",X"C9",X"01",X"7C",X"31",X"C9",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C3",X"3A",X"84",X"80",X"01",X"88",X"01",X"90",X"01",X"98",X"12",X"84",X"01",X"8C",X"01",X"94", + X"01",X"9C",X"12",X"1C",X"01",X"10",X"01",X"14",X"01",X"18",X"12",X"EB",X"23",X"79",X"10",X"E5", + X"E1",X"D1",X"C9",X"16",X"FF",X"1E",X"FF",X"1D",X"20",X"FD",X"15",X"20",X"F8",X"C9",X"11",X"20", + X"00",X"21",X"40",X"40",X"3E",X"C6",X"CD",X"50",X"3E",X"D5",X"E5",X"11",X"00",X"42",X"A7",X"ED", + X"52",X"28",X"08",X"00",X"00",X"00",X"E1",X"D1",X"19",X"18",X"E9",X"E1",X"D1",X"C9",X"32",X"EB", + X"41",X"32",X"90",X"41",X"32",X"F4",X"41",X"32",X"70",X"42",X"C9",X"32",X"EB",X"45",X"32",X"90", + X"45",X"32",X"F4",X"45",X"32",X"70",X"46",X"C9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"21",X"00",X"42",X"CD",X"2F",X"3E",X"0A",X"A7",X"C8",X"FA",X"DA",X"3E",X"FE",X"72",X"CA",X"DA", + X"3E",X"5F",X"16",X"00",X"A7",X"ED",X"52",X"23",X"0B",X"0A",X"2B",X"77",X"F5",X"E5",X"11",X"E0", + X"83",X"7D",X"E6",X"1F",X"87",X"26",X"00",X"6F",X"19",X"D1",X"A7",X"ED",X"52",X"F1",X"EE",X"01", + X"77",X"EB",X"0B",X"C3",X"C6",X"3E",X"3A",X"F8",X"4D",X"A7",X"C0",X"CD",X"73",X"3E",X"C9",X"CD", + X"03",X"82",X"CD",X"75",X"26",X"21",X"00",X"00",X"22",X"08",X"4D",X"22",X"E4",X"4D",X"3E",X"11", + X"CD",X"AB",X"3E",X"C9",X"3A",X"00",X"4E",X"FE",X"03",X"C0",X"C3",X"18",X"3D",X"C6",X"03",X"4F", + X"06",X"1C",X"CD",X"42",X"00",X"C9",X"2A",X"39",X"4D",X"ED",X"5B",X"10",X"4D",X"CD",X"11",X"29", + X"C9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"01",X"32",X"F6",X"4D",X"11",X"20",X"00", + X"C9",X"2A",X"F0",X"4D",X"23",X"22",X"F0",X"4D",X"11",X"04",X"00",X"A7",X"ED",X"52",X"C9",X"22", + X"F0",X"4D",X"2A",X"F2",X"4D",X"EB",X"2A",X"F4",X"4D",X"19",X"C9",X"CD",X"50",X"3E",X"22",X"F4", + X"4D",X"EB",X"22",X"F2",X"4D",X"2A",X"F4",X"4D",X"C9",X"21",X"00",X"00",X"22",X"F0",X"4D",X"22", + X"F2",X"4D",X"22",X"F4",X"4D",X"22",X"F6",X"4D",X"C9",X"CD",X"9A",X"8E",X"A7",X"20",X"08",X"CD", + X"38",X"3F",X"21",X"40",X"40",X"18",X"07",X"CD",X"41",X"3F",X"C0",X"CD",X"4F",X"3F",X"3E",X"C6", + X"CD",X"5B",X"3F",X"11",X"00",X"42",X"A7",X"ED",X"52",X"C0",X"CD",X"69",X"3F",X"3E",X"01",X"32", + X"EF",X"4D",X"C9",X"3A",X"F6",X"4D",X"A7",X"20",X"08",X"CD",X"38",X"3F",X"21",X"E0",X"41",X"18", + X"07",X"CD",X"41",X"3F",X"C0",X"CD",X"CD",X"3F",X"3E",X"72",X"CD",X"5B",X"3F",X"11",X"40",X"40", + X"A7",X"ED",X"52",X"C0",X"CD",X"69",X"3F",X"3E",X"01",X"32",X"EE",X"4D",X"C9",X"22",X"F0",X"4D", + X"2A",X"F2",X"4D",X"EB",X"2A",X"F4",X"4D",X"ED",X"52",X"C9",X"D6",X"C0",X"C2",X"9F",X"29",X"3A", + X"ED",X"4D",X"A7",X"28",X"07",X"AF",X"32",X"ED",X"4D",X"C3",X"C6",X"29",X"11",X"00",X"04",X"19", + X"7E",X"FE",X"17",X"CA",X"9F",X"29",X"C3",X"C6",X"29",X"00",X"FF",X"30",X"8D",X"00",X"31",X"F1"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..407b9403 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,662 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 10239) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"01",X"03",X"04",X"02",X"01",X"03",X"02",X"04",X"02",X"03",X"04",X"01",X"01",X"02",X"04",X"03", + X"02",X"03",X"01",X"04",X"03",X"02",X"04",X"01",X"01",X"01",X"03",X"04",X"02",X"01",X"04",X"03", + X"03",X"02",X"01",X"04",X"04",X"02",X"03",X"01",X"02",X"01",X"03",X"04",X"03",X"01",X"04",X"02", + X"04",X"02",X"01",X"03",X"03",X"01",X"02",X"04",X"04",X"01",X"03",X"02",X"04",X"01",X"02",X"03", + X"00",X"04",X"08",X"0C",X"10",X"14",X"18",X"1C",X"20",X"24",X"28",X"2C",X"30",X"34",X"38",X"3C", + X"F5",X"E5",X"D5",X"3A",X"C0",X"50",X"E6",X"0F",X"5F",X"16",X"00",X"21",X"40",X"80",X"19",X"5E", + X"21",X"00",X"80",X"19",X"11",X"E0",X"4D",X"01",X"04",X"00",X"ED",X"B0",X"D1",X"E1",X"F1",X"C9", + X"F5",X"AF",X"32",X"80",X"50",X"00",X"00",X"00",X"F1",X"C9",X"CD",X"0F",X"20",X"FE",X"FC",X"28", + X"02",X"FE",X"FD",X"CA",X"40",X"19",X"FE",X"70",X"C3",X"F0",X"88",X"7D",X"21",X"E0",X"4D",X"FE", + X"EB",X"28",X"14",X"FE",X"90",X"20",X"03",X"23",X"18",X"0D",X"FE",X"F4",X"20",X"04",X"23",X"23", + X"18",X"05",X"FE",X"70",X"23",X"23",X"23",X"7E",X"32",X"E4",X"4D",X"3E",X"72",X"CD",X"9E",X"3E", + X"3E",X"11",X"CD",X"AB",X"3E",X"C3",X"75",X"8E",X"FF",X"FF",X"FF",X"3A",X"E6",X"4D",X"A7",X"C0", + X"3E",X"01",X"32",X"E6",X"4D",X"CD",X"3D",X"81",X"CD",X"2D",X"83",X"C9",X"3E",X"01",X"06",X"03", + X"11",X"20",X"00",X"C5",X"D5",X"E5",X"CF",X"E1",X"D1",X"C1",X"C9",X"21",X"CD",X"45",X"CD",X"CC", + X"80",X"19",X"CD",X"CC",X"80",X"19",X"CD",X"CC",X"80",X"19",X"CD",X"CC",X"80",X"C9",X"01",X"FD", + X"80",X"21",X"D0",X"41",X"CD",X"72",X"81",X"3E",X"DA",X"32",X"30",X"42",X"C9",X"DA",X"DA",X"DA", + X"CD",X"69",X"8B",X"CD",X"77",X"8D",X"CD",X"DB",X"80",X"CD",X"EE",X"80",X"C9",X"00",X"00",X"00", + X"3A",X"1C",X"4E",X"C6",X"99",X"27",X"CD",X"A8",X"85",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"C6", + X"30",X"32",X"F2",X"41",X"3A",X"1C",X"4E",X"E6",X"0F",X"C6",X"30",X"32",X"D2",X"41",X"3E",X"0F", + X"32",X"F2",X"45",X"32",X"D2",X"45",X"CD",X"B2",X"82",X"C9",X"F0",X"72",X"F1",X"3E",X"11",X"CD", + X"99",X"0F",X"01",X"3A",X"81",X"21",X"84",X"40",X"CD",X"72",X"81",X"21",X"64",X"41",X"CD",X"72", + X"81",X"21",X"44",X"42",X"CD",X"72",X"81",X"21",X"24",X"43",X"CD",X"72",X"81",X"C9",X"3E",X"17", + X"CD",X"99",X"0F",X"01",X"ED",X"0F",X"CD",X"45",X"81",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"C5",X"00",X"11",X"20",X"00",X"0A",X"77",X"19",X"03",X"0A",X"77",X"19",X"03",X"0A", + X"77",X"C1",X"C9",X"3A",X"FA",X"4D",X"A7",X"C0",X"3A",X"E6",X"4D",X"A7",X"C0",X"3E",X"01",X"32", + X"E6",X"4D",X"CD",X"3D",X"81",X"CD",X"2D",X"83",X"21",X"9C",X"4E",X"36",X"10",X"C9",X"21",X"BC", + X"4E",X"36",X"02",X"21",X"04",X"4E",X"C9",X"21",X"90",X"4C",X"3A",X"8A",X"4C",X"4F",X"06",X"10", + X"7E",X"A7",X"28",X"2F",X"E6",X"C0",X"07",X"07",X"B9",X"30",X"28",X"35",X"7E",X"E6",X"3F",X"20", + X"22",X"77",X"C5",X"E5",X"2C",X"7E",X"2C",X"46",X"21",X"E1",X"81",X"E5",X"E7",X"94",X"08",X"A3", + X"06",X"8E",X"05",X"42",X"12",X"00",X"10",X"0B",X"10",X"63",X"02",X"2B",X"21",X"F0",X"21",X"B9", + X"22",X"E1",X"C1",X"2C",X"2C",X"2C",X"10",X"C8",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"3A",X"ED",X"4D",X"A7",X"20",X"09",X"3E",X"01",X"32",X"ED",X"4D",X"CD",X"E9", + X"0F",X"C9",X"3A",X"EF",X"4D",X"A7",X"20",X"04",X"CD",X"79",X"3F",X"C9",X"C3",X"61",X"84",X"00", + X"21",X"00",X"40",X"CF",X"06",X"3F",X"21",X"C0",X"43",X"CF",X"3A",X"EE",X"4D",X"A7",X"C0",X"3E", + X"01",X"32",X"E8",X"4D",X"CD",X"82",X"3C",X"C9",X"3A",X"E8",X"4D",X"A7",X"C0",X"3A",X"09",X"4E", + X"C3",X"47",X"03",X"CD",X"3E",X"75",X"21",X"37",X"43",X"11",X"20",X"00",X"77",X"3D",X"19",X"77", + X"3E",X"05",X"32",X"37",X"47",X"32",X"57",X"47",X"CD",X"8A",X"05",X"C9",X"1F",X"C9",X"AF",X"32", + X"B1",X"4D",X"C9",X"F1",X"02",X"F2",X"03",X"F3",X"0F",X"70",X"F4",X"02",X"8D",X"F4",X"02",X"88", + X"F4",X"02",X"8A",X"70",X"F4",X"01",X"6C",X"F4",X"02",X"8A",X"F4",X"01",X"6A",X"F4",X"02",X"88", + X"70",X"F4",X"02",X"8D",X"F4",X"02",X"88",X"F4",X"02",X"8A",X"70",X"F4",X"01",X"6C",X"F4",X"02", + X"8A",X"F4",X"01",X"6A",X"F4",X"02",X"88",X"70",X"F0",X"6A",X"82",X"FF",X"21",X"BC",X"4E",X"CB", + X"AE",X"3E",X"01",X"32",X"F5",X"90",X"C9",X"3E",X"01",X"32",X"F4",X"90",X"CD",X"9C",X"82",X"CB", + X"F6",X"C9",X"3A",X"EA",X"90",X"A7",X"C0",X"CD",X"00",X"8F",X"C9",X"3E",X"01",X"32",X"80",X"50", + X"C9",X"3E",X"00",X"32",X"80",X"50",X"C9",X"3A",X"00",X"4E",X"FE",X"03",X"28",X"10",X"AF",X"32", + X"80",X"50",X"CD",X"51",X"8C",X"CD",X"00",X"81",X"3E",X"02",X"32",X"80",X"50",X"C9",X"3A",X"1C", + X"4E",X"A7",X"20",X"10",X"CD",X"C0",X"8C",X"3A",X"FB",X"4D",X"21",X"16",X"4E",X"86",X"77",X"3E", + X"40",X"32",X"1C",X"4E",X"AF",X"21",X"E0",X"4D",X"06",X"20",X"CF",X"21",X"A4",X"4D",X"06",X"0C", + X"CF",X"CD",X"00",X"81",X"CD",X"35",X"A4",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"21", + X"00",X"00",X"22",X"FC",X"4D",X"22",X"FE",X"4D",X"C9",X"CD",X"7C",X"0E",X"3E",X"20",X"32",X"04", + X"4E",X"C9",X"CD",X"6C",X"0E",X"CD",X"B0",X"0E",X"CD",X"C1",X"2C",X"C9",X"FF",X"06",X"16",X"CD", + X"5E",X"2C",X"C9",X"FF",X"3A",X"E4",X"4D",X"FE",X"01",X"28",X"08",X"DD",X"21",X"E9",X"4D",X"C9", + X"DD",X"21",X"39",X"4D",X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"28",X"06",X"3A",X"AF",X"4D",X"C3", + X"4C",X"3D",X"3A",X"AC",X"4D",X"A7",X"28",X"06",X"3A",X"AF",X"4D",X"C3",X"4C",X"3D",X"3A",X"F9", + X"4D",X"A7",X"C2",X"83",X"83",X"3A",X"16",X"4E",X"A7",X"CA",X"4C",X"83",X"2A",X"31",X"4D",X"11", + X"22",X"23",X"A7",X"ED",X"52",X"C2",X"4C",X"83",X"3E",X"08",X"32",X"F9",X"4D",X"C3",X"4C",X"83", + X"00",X"00",X"00",X"2A",X"31",X"4D",X"11",X"3A",X"2D",X"A7",X"ED",X"52",X"C2",X"4C",X"83",X"AF", + X"32",X"F9",X"4D",X"C3",X"45",X"83",X"00",X"00",X"00",X"3A",X"E4",X"4D",X"FE",X"01",X"C2",X"02", + X"3E",X"3E",X"01",X"32",X"A7",X"4D",X"C3",X"63",X"17",X"2A",X"39",X"4D",X"7D",X"06",X"23",X"90", + X"3A",X"39",X"4D",X"D8",X"06",X"25",X"90",X"D8",X"CD",X"D6",X"A0",X"C9",X"FF",X"FF",X"CD",X"FB", + X"83",X"21",X"00",X"00",X"28",X"03",X"22",X"FC",X"4D",X"22",X"FE",X"4D",X"C9",X"00",X"00",X"00", + X"00",X"E5",X"D5",X"11",X"20",X"00",X"77",X"3C",X"19",X"77",X"3C",X"3C",X"23",X"77",X"3D",X"ED", + X"52",X"77",X"D1",X"E1",X"C9",X"CD",X"17",X"2D",X"3A",X"00",X"4E",X"FE",X"03",X"D0",X"CD",X"F3", + X"2C",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3A",X"E4",X"4D",X"FE",X"01", + X"C9",X"FD",X"21",X"0A",X"4D",X"CD",X"FB",X"83",X"28",X"09",X"DD",X"21",X"E9",X"4D",X"CD",X"FA", + X"09",X"18",X"03",X"CD",X"A9",X"31",X"30",X"0E",X"3A",X"B1",X"4D",X"A7",X"C0",X"3E",X"01",X"32", + X"B1",X"4D",X"CD",X"07",X"1F",X"C9",X"AF",X"32",X"B1",X"4D",X"C9",X"F5",X"E5",X"D5",X"11",X"00", + X"04",X"3E",X"11",X"19",X"77",X"D1",X"E1",X"F1",X"77",X"C9",X"D5",X"E5",X"06",X"20",X"4F",X"CD", + X"2B",X"84",X"F5",X"E5",X"11",X"E0",X"83",X"7D",X"E6",X"1F",X"87",X"26",X"00",X"6F",X"19",X"D1", + X"A7",X"ED",X"52",X"F1",X"EE",X"01",X"CD",X"2B",X"84",X"EB",X"23",X"79",X"10",X"E1",X"E1",X"D1", + X"C9",X"3A",X"00",X"4E",X"FE",X"03",X"C2",X"2A",X"82",X"3E",X"40",X"06",X"3F",X"C3",X"20",X"82", + X"2A",X"B0",X"8F",X"22",X"86",X"4D",X"11",X"B2",X"8F",X"01",X"20",X"00",X"1A",X"FE",X"FF",X"C8", + X"FE",X"FE",X"20",X"0A",X"2A",X"86",X"4D",X"23",X"22",X"86",X"4D",X"13",X"18",X"EE",X"77",X"E5", + X"C5",X"01",X"00",X"04",X"09",X"3E",X"01",X"77",X"C1",X"E1",X"09",X"13",X"18",X"DE",X"2A",X"24", + X"4C",X"ED",X"5B",X"26",X"4C",X"ED",X"4B",X"28",X"4C",X"22",X"26",X"4C",X"ED",X"53",X"28",X"4C", + X"2A",X"2A",X"4C",X"ED",X"43",X"2A",X"4C",X"22",X"24",X"4C",X"2A",X"34",X"4C",X"ED",X"5B",X"36", + X"4C",X"ED",X"4B",X"38",X"4C",X"22",X"36",X"4C",X"ED",X"53",X"38",X"4C",X"2A",X"3A",X"4C",X"ED", + X"43",X"3A",X"4C",X"22",X"34",X"4C",X"C9",X"21",X"83",X"E3",X"22",X"02",X"4D",X"21",X"83",X"D1", + X"22",X"04",X"4D",X"21",X"83",X"BF",X"22",X"06",X"4D",X"CD",X"99",X"14",X"C9",X"21",X"97",X"D1", + X"22",X"00",X"4D",X"CD",X"99",X"14",X"C9",X"3E",X"94",X"21",X"34",X"43",X"77",X"E5",X"23",X"3C", + X"77",X"23",X"3C",X"77",X"E1",X"11",X"20",X"00",X"19",X"3C",X"77",X"23",X"3C",X"77",X"23",X"3C", + X"77",X"3E",X"01",X"21",X"34",X"47",X"11",X"20",X"00",X"01",X"00",X"03",X"E5",X"C5",X"CF",X"C1", + X"E1",X"19",X"CF",X"C9",X"3E",X"01",X"CD",X"74",X"0F",X"C9",X"01",X"5A",X"85",X"CD",X"72",X"81", + X"C9",X"E5",X"CD",X"2A",X"85",X"E1",X"11",X"00",X"04",X"19",X"CD",X"24",X"85",X"C9",X"21",X"50", + X"40",X"CD",X"31",X"85",X"C9",X"21",X"53",X"40",X"CD",X"31",X"85",X"C9",X"21",X"55",X"40",X"CD", + X"31",X"85",X"C9",X"21",X"57",X"40",X"CD",X"31",X"85",X"C9",X"53",X"54",X"50",X"AF",X"32",X"FB", + X"4D",X"21",X"00",X"00",X"22",X"A4",X"4D",X"21",X"31",X"93",X"22",X"08",X"4D",X"CD",X"99",X"14", + X"06",X"01",X"CD",X"ED",X"23",X"CD",X"B3",X"85",X"CD",X"8A",X"05",X"C9",X"21",X"FB",X"4D",X"19", + X"D5",X"E5",X"11",X"A7",X"4D",X"A7",X"ED",X"52",X"E1",X"D1",X"06",X"02",X"28",X"0A",X"06",X"00", + X"7E",X"A7",X"28",X"07",X"06",X"01",X"AF",X"77",X"CD",X"CD",X"0F",X"CD",X"10",X"81",X"CD",X"5A", + X"2A",X"CD",X"12",X"86",X"00",X"E6",X"C9",X"C9",X"32",X"1C",X"4E",X"A7",X"C0",X"3E",X"01",X"32", + X"DF",X"90",X"C9",X"CD",X"70",X"84",X"CD",X"38",X"8E",X"C9",X"FF",X"FF",X"21",X"00",X"00",X"22", + X"08",X"4D",X"22",X"02",X"4D",X"22",X"04",X"4D",X"22",X"06",X"4D",X"22",X"00",X"4D",X"22",X"F0", + X"90",X"22",X"F2",X"90",X"22",X"D2",X"4D",X"22",X"E4",X"4D",X"C9",X"3A",X"E4",X"4D",X"FE",X"01", + X"20",X"04",X"CD",X"56",X"89",X"C9",X"FE",X"02",X"20",X"07",X"CD",X"70",X"8B",X"CD",X"49",X"3D", + X"C9",X"06",X"04",X"ED",X"5B",X"39",X"4D",X"CD",X"23",X"17",X"CD",X"49",X"3D",X"C9",X"21",X"BC", + X"4E",X"CB",X"DE",X"CD",X"9C",X"82",X"C9",X"FF",X"FF",X"21",X"BC",X"4E",X"CB",X"D6",X"CD",X"9C", + X"82",X"C9",X"21",X"BC",X"4E",X"36",X"10",X"CD",X"9C",X"82",X"CD",X"17",X"2D",X"C9",X"FF",X"FF", + X"CD",X"FB",X"83",X"28",X"07",X"DD",X"21",X"01",X"33",X"C3",X"D6",X"10",X"EF",X"04",X"01",X"AF", + X"32",X"AC",X"4D",X"32",X"A7",X"4D",X"32",X"F0",X"90",X"C3",X"01",X"11",X"21",X"F0",X"90",X"7E", + X"FE",X"F0",X"28",X"02",X"34",X"C9",X"CD",X"4F",X"1B",X"C3",X"C3",X"10",X"21",X"F1",X"90",X"7E", + X"FE",X"F0",X"28",X"02",X"34",X"C9",X"CD",X"C7",X"1B",X"C3",X"1B",X"11",X"21",X"F2",X"90",X"7E", + X"FE",X"F0",X"28",X"02",X"34",X"C9",X"CD",X"3F",X"1C",X"C3",X"5F",X"11",X"21",X"F3",X"90",X"7E", + X"FE",X"F0",X"28",X"02",X"34",X"C9",X"CD",X"B7",X"1C",X"C3",X"CC",X"11",X"3A",X"E4",X"4D",X"32", + X"FF",X"90",X"C9",X"3A",X"00",X"4E",X"FE",X"03",X"D0",X"3E",X"02",X"32",X"9C",X"4E",X"C9",X"FF", + X"FF",X"FF",X"FF",X"FF",X"21",X"06",X"4C",X"06",X"04",X"1A",X"77",X"23",X"23",X"13",X"05",X"20", + X"F8",X"C9",X"21",X"07",X"4C",X"3E",X"09",X"06",X"04",X"77",X"23",X"23",X"05",X"20",X"FA",X"C9", + X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E",X"A1",X"C9",X"CD",X"3F",X"88",X"11",X"61",X"12",X"A7", + X"C8",X"11",X"65",X"12",X"C9",X"CD",X"33",X"88",X"11",X"69",X"12",X"A7",X"C8",X"11",X"6D",X"12", + X"C9",X"CD",X"57",X"88",X"11",X"71",X"12",X"A7",X"C8",X"11",X"75",X"12",X"C9",X"CD",X"4B",X"88", + X"11",X"79",X"12",X"A7",X"C8",X"11",X"7D",X"12",X"C9",X"CD",X"B0",X"86",X"20",X"22",X"3A",X"30", + X"4D",X"FE",X"00",X"20",X"04",X"CD",X"C5",X"86",X"C9",X"FE",X"01",X"20",X"04",X"CD",X"B9",X"86", + X"C9",X"FE",X"02",X"20",X"04",X"CD",X"B9",X"86",X"C9",X"FE",X"03",X"C0",X"CD",X"C5",X"86",X"C9", + X"3A",X"30",X"4D",X"FE",X"00",X"20",X"04",X"CD",X"DD",X"86",X"C9",X"FE",X"01",X"20",X"04",X"CD", + X"D1",X"86",X"C9",X"FE",X"02",X"20",X"04",X"CD",X"D1",X"86",X"C9",X"FE",X"03",X"C0",X"CD",X"DD", + X"86",X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"28",X"04",X"CD",X"9C",X"16",X"C9",X"CD",X"E9",X"86", + X"CD",X"94",X"86",X"CD",X"A2",X"86",X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"28",X"04",X"CD",X"AA", + X"16",X"C9",X"CD",X"E9",X"86",X"CD",X"94",X"86",X"CD",X"A2",X"86",X"C9",X"21",X"02",X"4C",X"CD", + X"4E",X"15",X"CD",X"32",X"87",X"CD",X"47",X"87",X"C9",X"21",X"00",X"00",X"22",X"01",X"90",X"22", + X"03",X"90",X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"28",X"08",X"FE",X"02",X"28",X"04",X"CD",X"09", + X"3D",X"C9",X"3A",X"FD",X"4D",X"A7",X"C8",X"CD",X"09",X"3D",X"C9",X"3E",X"40",X"06",X"0C",X"21", + X"45",X"41",X"CD",X"76",X"0F",X"C9",X"00",X"DD",X"21",X"26",X"4D",X"CD",X"0F",X"20",X"21",X"00", + X"90",X"FE",X"FC",X"28",X"0D",X"FE",X"FD",X"28",X"09",X"E6",X"C0",X"D6",X"C0",X"20",X"03",X"36", + X"01",X"C9",X"36",X"00",X"C9",X"0D",X"0C",X"0B",X"0A",X"09",X"6C",X"08",X"07",X"00",X"00",X"06", + X"2A",X"39",X"4D",X"7D",X"06",X"02",X"80",X"32",X"D2",X"4D",X"7C",X"32",X"D3",X"4D",X"C9",X"1E", + X"3A",X"3C",X"4D",X"FE",X"00",X"20",X"12",X"FD",X"21",X"35",X"4D",X"CD",X"97",X"87",X"7E",X"A7", + X"C0",X"FD",X"21",X"37",X"4D",X"CD",X"97",X"87",X"C9",X"FE",X"01",X"20",X"15",X"CD",X"C0",X"87", + X"FD",X"21",X"D2",X"4D",X"CD",X"97",X"87",X"7E",X"A7",X"C0",X"FD",X"21",X"37",X"4D",X"CD",X"97", + X"87",X"C9",X"FE",X"02",X"20",X"04",X"CD",X"ED",X"87",X"C9",X"FE",X"03",X"C0",X"CD",X"D7",X"87", + X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"20",X"08",X"CD",X"D0",X"87",X"3A",X"00",X"90",X"A7",X"C0", + X"FD",X"21",X"39",X"4D",X"C3",X"7A",X"80",X"AF",X"21",X"00",X"90",X"01",X"FF",X"03",X"CF",X"C3", + X"3E",X"A7",X"00",X"CD",X"69",X"87",X"3E",X"01",X"32",X"01",X"90",X"3A",X"C0",X"4D",X"C9",X"CD", + X"69",X"87",X"3E",X"01",X"32",X"02",X"90",X"3A",X"C0",X"4D",X"C9",X"CD",X"69",X"87",X"3E",X"01", + X"32",X"03",X"90",X"3A",X"C0",X"4D",X"C9",X"CD",X"69",X"87",X"3E",X"01",X"32",X"04",X"90",X"3A", + X"C0",X"4D",X"C9",X"06",X"04",X"2A",X"37",X"4D",X"A7",X"ED",X"52",X"28",X"1C",X"05",X"2A",X"35", + X"4D",X"A7",X"ED",X"52",X"28",X"13",X"05",X"2A",X"39",X"4D",X"A7",X"ED",X"52",X"28",X"0A",X"05", + X"2A",X"D2",X"4D",X"A7",X"ED",X"52",X"28",X"01",X"05",X"78",X"C9",X"3A",X"FD",X"4D",X"A7",X"3E", + X"01",X"28",X"03",X"32",X"FB",X"4D",X"32",X"FF",X"90",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"ED",X"5B",X"33",X"4D",X"CD",X"63",X"88",X"32",X"06",X"90",X"A7",X"C8",X"3E",X"01",X"32",X"A8", + X"4D",X"3E",X"02",X"32",X"A4",X"4D",X"C9",X"ED",X"5B",X"31",X"4D",X"CD",X"63",X"88",X"32",X"05", + X"90",X"A7",X"C8",X"3E",X"01",X"32",X"A7",X"4D",X"32",X"A4",X"4D",X"C9",X"00",X"00",X"00",X"3A", + X"05",X"90",X"A7",X"28",X"0B",X"AF",X"32",X"A7",X"4D",X"32",X"05",X"90",X"32",X"A4",X"4D",X"C9", + X"3A",X"06",X"90",X"A7",X"C8",X"AF",X"32",X"A8",X"4D",X"32",X"06",X"90",X"32",X"A4",X"4D",X"C9", + X"CA",X"8B",X"80",X"FE",X"90",X"CA",X"F5",X"18",X"FE",X"92",X"CA",X"F5",X"18",X"C3",X"EF",X"18", + X"A7",X"C8",X"47",X"CD",X"B0",X"86",X"20",X"04",X"CD",X"28",X"8F",X"C9",X"CD",X"46",X"8F",X"C9", + X"31",X"C0",X"4F",X"AF",X"01",X"04",X"00",X"21",X"00",X"90",X"CF",X"0D",X"20",X"FC",X"C3",X"3E", + X"A7",X"00",X"00",X"00",X"C8",X"78",X"FE",X"02",X"C8",X"FE",X"01",X"C8",X"3E",X"01",X"32",X"A4", + X"4D",X"CD",X"CF",X"88",X"C9",X"D6",X"C0",X"28",X"0A",X"7E",X"FE",X"90",X"28",X"05",X"FE",X"92", + X"C2",X"9F",X"29",X"11",X"00",X"04",X"19",X"7E",X"FE",X"16",X"CA",X"0B",X"8B",X"FE",X"17",X"CA", + X"9F",X"29",X"C3",X"C6",X"29",X"FF",X"3A",X"AC",X"4D",X"A7",X"C0",X"00",X"00",X"CD",X"B7",X"88", + X"3A",X"05",X"90",X"CD",X"00",X"89",X"A7",X"28",X"09",X"AF",X"32",X"08",X"90",X"06",X"02",X"CD", + X"9B",X"85",X"CD",X"49",X"3D",X"3A",X"AD",X"4D",X"A7",X"C0",X"00",X"00",X"CD",X"A0",X"88",X"3A", + X"06",X"90",X"CD",X"00",X"89",X"A7",X"20",X"06",X"CD",X"49",X"3D",X"C9",X"00",X"00",X"3A",X"A4", + X"4D",X"CD",X"6C",X"17",X"AF",X"32",X"FD",X"4D",X"CD",X"49",X"3D",X"C9",X"00",X"00",X"00",X"00", + X"21",X"02",X"4C",X"CD",X"4E",X"15",X"3A",X"E4",X"4D",X"FE",X"01",X"20",X"07",X"CD",X"32",X"87", + X"CD",X"47",X"87",X"C9",X"FE",X"02",X"C0",X"CD",X"E0",X"89",X"C9",X"00",X"00",X"00",X"00",X"00", + X"5E",X"23",X"56",X"23",X"4E",X"23",X"46",X"C9",X"CD",X"C0",X"89",X"ED",X"53",X"02",X"4C",X"ED", + X"43",X"06",X"4C",X"23",X"CD",X"C0",X"89",X"ED",X"53",X"08",X"4C",X"ED",X"43",X"0C",X"4C",X"C9", + X"3A",X"E4",X"4D",X"FE",X"02",X"C0",X"CD",X"B0",X"86",X"20",X"10",X"3A",X"C0",X"4D",X"21",X"10", + X"8A",X"A7",X"20",X"03",X"21",X"18",X"8A",X"CD",X"C8",X"89",X"C9",X"3A",X"C0",X"4D",X"21",X"20", + X"8A",X"A7",X"20",X"03",X"21",X"28",X"8A",X"CD",X"C8",X"89",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF", + X"68",X"01",X"60",X"01",X"64",X"01",X"6C",X"01",X"78",X"01",X"70",X"01",X"74",X"01",X"7C",X"01", + X"6B",X"01",X"63",X"01",X"67",X"01",X"6F",X"01",X"7B",X"01",X"73",X"01",X"77",X"01",X"7F",X"01", + X"3E",X"FD",X"21",X"85",X"40",X"06",X"15",X"CF",X"21",X"B9",X"40",X"11",X"20",X"00",X"06",X"18", + X"77",X"19",X"05",X"20",X"FB",X"21",X"8A",X"42",X"06",X"0A",X"CF",X"00",X"00",X"00",X"00",X"21", + X"CA",X"41",X"06",X"06",X"77",X"19",X"05",X"20",X"FB",X"21",X"AA",X"41",X"77",X"23",X"77",X"21", + X"73",X"42",X"77",X"C3",X"50",X"8B",X"AF",X"06",X"5F",X"21",X"8C",X"4E",X"CF",X"C9",X"FF",X"FF", + X"3E",X"40",X"21",X"A5",X"40",X"06",X"14",X"CF",X"21",X"A9",X"42",X"06",X"0B",X"CF",X"21",X"D8", + X"40",X"06",X"17",X"77",X"19",X"05",X"20",X"FB",X"21",X"A9",X"41",X"06",X"08",X"77",X"19",X"05", + X"20",X"FB",X"21",X"89",X"41",X"77",X"23",X"77",X"21",X"6F",X"40",X"77",X"23",X"77",X"C9",X"FF", + X"84",X"44",X"85",X"44",X"88",X"44",X"8E",X"44",X"91",X"44",X"97",X"44",X"39",X"45",X"99",X"45", + X"79",X"46",X"D9",X"46",X"99",X"47",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"06",X"0B",X"11",X"A0",X"8A",X"1A",X"6F",X"13",X"1A",X"67",X"3E",X"16",X"77",X"13",X"05",X"20", + X"F4",X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"20",X"07",X"CD",X"00",X"81",X"CD",X"3D",X"25",X"C9", + X"FE",X"02",X"C0",X"CD",X"00",X"81",X"CD",X"30",X"8A",X"CD",X"70",X"8A",X"CD",X"C0",X"8A",X"CD", + X"20",X"8D",X"C9",X"FE",X"90",X"CA",X"23",X"19",X"FE",X"92",X"CA",X"23",X"19",X"E6",X"C0",X"D6", + X"C0",X"CA",X"23",X"19",X"C3",X"50",X"19",X"FF",X"FF",X"FF",X"FF",X"DD",X"E5",X"FD",X"E5",X"00", + X"00",X"00",X"00",X"FD",X"21",X"0C",X"4D",X"CD",X"0F",X"20",X"19",X"7E",X"FD",X"E1",X"DD",X"E1", + X"FE",X"16",X"CA",X"9F",X"29",X"C3",X"C6",X"29",X"3A",X"E4",X"4D",X"21",X"00",X"00",X"FE",X"02", + X"28",X"07",X"FE",X"01",X"C0",X"22",X"FE",X"4D",X"C9",X"22",X"FE",X"4D",X"AF",X"32",X"FC",X"4D", + X"C9",X"BC",X"02",X"5C",X"40",X"53",X"45",X"47",X"41",X"40",X"31",X"39",X"38",X"32",X"2F",X"81", + X"21",X"D2",X"D2",X"22",X"4F",X"40",X"21",X"FC",X"FC",X"22",X"4F",X"43",X"22",X"6F",X"43",X"22", + X"8F",X"43",X"21",X"D3",X"D3",X"22",X"AF",X"43",X"C9",X"CD",X"A3",X"8E",X"CD",X"7F",X"0F",X"C9", + X"06",X"05",X"ED",X"5B",X"39",X"4D",X"3A",X"AF",X"4D",X"A7",X"20",X"09",X"2A",X"37",X"4D",X"A7", + X"ED",X"52",X"CA",X"B6",X"8B",X"05",X"3A",X"AE",X"4D",X"A7",X"20",X"09",X"2A",X"35",X"4D",X"A7", + X"ED",X"52",X"CA",X"B6",X"8B",X"05",X"3A",X"AD",X"4D",X"A7",X"20",X"09",X"2A",X"33",X"4D",X"A7", + X"ED",X"52",X"CA",X"B6",X"8B",X"05",X"3A",X"AC",X"4D",X"A7",X"20",X"09",X"2A",X"31",X"4D",X"A7", + X"ED",X"52",X"C3",X"6C",X"8F",X"05",X"CD",X"CD",X"8D",X"00",X"32",X"A5",X"4D",X"A7",X"C8",X"C3", + X"80",X"8E",X"CD",X"83",X"8F",X"AF",X"32",X"A5",X"4D",X"3A",X"FD",X"4D",X"A7",X"06",X"00",X"28", + X"09",X"AF",X"32",X"FD",X"4D",X"CD",X"CD",X"0F",X"06",X"01",X"CD",X"10",X"8F",X"C9",X"21",X"02", + X"4C",X"11",X"F0",X"90",X"06",X"04",X"1A",X"A7",X"28",X"06",X"FE",X"F0",X"20",X"02",X"36",X"FC", + X"23",X"23",X"13",X"05",X"20",X"F0",X"C9",X"00",X"DD",X"40",X"07",X"C1",X"40",X"40",X"FF",X"FF", + X"2A",X"17",X"4E",X"3E",X"40",X"CD",X"F4",X"3C",X"11",X"60",X"00",X"19",X"22",X"17",X"4E",X"C9", + X"2A",X"17",X"4E",X"11",X"60",X"00",X"ED",X"52",X"22",X"17",X"4E",X"3E",X"90",X"CD",X"DE",X"3C", + X"3E",X"01",X"CD",X"F4",X"3C",X"C9",X"2A",X"1A",X"4E",X"CD",X"1B",X"8C",X"11",X"60",X"00",X"19", + X"22",X"1A",X"4E",X"C9",X"2A",X"1A",X"4E",X"11",X"60",X"00",X"ED",X"52",X"3E",X"40",X"CD",X"F4", + X"3C",X"22",X"1A",X"4E",X"C9",X"21",X"FB",X"4D",X"35",X"21",X"16",X"4E",X"34",X"CD",X"10",X"8C", + X"C9",X"01",X"0B",X"00",X"CD",X"FA",X"8D",X"11",X"16",X"4E",X"ED",X"B0",X"C9",X"00",X"00",X"00", + X"00",X"7E",X"A7",X"C8",X"4F",X"23",X"5E",X"23",X"56",X"EB",X"3E",X"90",X"CD",X"DE",X"3C",X"3E", + X"01",X"CD",X"F4",X"3C",X"11",X"60",X"00",X"19",X"0D",X"20",X"EF",X"00",X"C9",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"3A",X"19",X"4E",X"A7",X"C8",X"4F",X"21",X"C1",X"40",X"CD", + X"6A",X"8C",X"C9",X"3E",X"05",X"CD",X"AB",X"3E",X"3E",X"70",X"CF",X"CD",X"BA",X"2F",X"C9",X"AF", + X"32",X"9C",X"4E",X"CD",X"41",X"8D",X"CD",X"8B",X"8E",X"32",X"80",X"50",X"CD",X"F6",X"28",X"3E", + X"11",X"CD",X"AB",X"3E",X"3A",X"70",X"4E",X"21",X"00",X"00",X"22",X"EB",X"90",X"C9",X"FF",X"FF", + X"21",X"FB",X"4D",X"7E",X"A7",X"C8",X"4F",X"2A",X"17",X"4E",X"11",X"60",X"00",X"ED",X"52",X"22", + X"17",X"4E",X"0D",X"20",X"F5",X"C9",X"CD",X"09",X"86",X"21",X"19",X"4E",X"34",X"21",X"FB",X"4D", + X"35",X"CD",X"26",X"8C",X"3A",X"19",X"4E",X"FE",X"07",X"C0",X"3E",X"01",X"32",X"A5",X"4D",X"32", + X"E2",X"90",X"CD",X"FD",X"8C",X"01",X"06",X"00",X"CD",X"54",X"8C",X"C9",X"FF",X"21",X"00",X"00", + X"22",X"A7",X"4D",X"22",X"A9",X"4D",X"21",X"E5",X"4D",X"AF",X"06",X"1B",X"CF",X"C9",X"CD",X"FD", + X"8C",X"CD",X"51",X"8C",X"21",X"04",X"4E",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"C4",X"87",X"22",X"00",X"4D",X"21",X"38",X"2E",X"22",X"0A",X"4D",X"22",X"31",X"4D",X"21", + X"00",X"FF",X"22",X"14",X"4D",X"22",X"1E",X"4D",X"3E",X"00",X"32",X"28",X"4D",X"32",X"2C",X"4D", + X"C9",X"3A",X"FB",X"4D",X"A7",X"C8",X"21",X"16",X"4E",X"86",X"77",X"3A",X"FB",X"4D",X"CD",X"C6", + X"8C",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"36",X"A6",X"E5",X"11",X"00",X"04",X"19",X"36", + X"01",X"E1",X"C9",X"FF",X"FF",X"FF",X"3A",X"FB",X"4D",X"A7",X"28",X"0B",X"21",X"16",X"4E",X"86", + X"77",X"3A",X"FB",X"4D",X"CD",X"C6",X"8C",X"21",X"16",X"4E",X"CD",X"60",X"8C",X"CD",X"D0",X"A4", + X"C9",X"CD",X"C0",X"3E",X"21",X"16",X"4E",X"CD",X"60",X"8C",X"CD",X"86",X"8C",X"3E",X"03",X"32", + X"80",X"50",X"CD",X"DB",X"80",X"CD",X"EE",X"80",X"C9",X"3A",X"FE",X"4D",X"A7",X"28",X"07",X"AF", + X"32",X"FE",X"4D",X"CD",X"B3",X"8D",X"3A",X"FF",X"4D",X"A7",X"C8",X"AF",X"32",X"FF",X"4D",X"CD", + X"B3",X"8D",X"C9",X"3A",X"A5",X"4D",X"A7",X"C0",X"21",X"FB",X"4D",X"7E",X"A7",X"C8",X"35",X"CD", + X"49",X"8C",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"9C",X"A6",X"78",X"FE",X"05", + X"20",X"02",X"3D",X"05",X"32",X"A4",X"4D",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3A",X"EA",X"90",X"A7",X"20",X"04", + X"21",X"3E",X"3D",X"C9",X"21",X"F7",X"8B",X"C9",X"CD",X"A6",X"8E",X"21",X"00",X"90",X"06",X"0F", + X"AF",X"CF",X"21",X"00",X"00",X"22",X"F0",X"90",X"22",X"F2",X"90",X"C9",X"F5",X"ED",X"57",X"B7", + X"28",X"04",X"F1",X"C3",X"D4",X"3B",X"F1",X"C3",X"30",X"3D",X"FF",X"CD",X"C2",X"1F",X"3E",X"5C", + X"32",X"9D",X"41",X"3E",X"01",X"32",X"9D",X"45",X"06",X"17",X"CD",X"5E",X"2C",X"C9",X"FF",X"FF", + X"FF",X"FF",X"CD",X"51",X"8C",X"3A",X"13",X"4E",X"A7",X"C0",X"CD",X"00",X"81",X"C9",X"FF",X"FF", + X"06",X"01",X"CD",X"ED",X"23",X"CD",X"D7",X"24",X"CD",X"B3",X"8D",X"AF",X"21",X"E0",X"4D",X"06", + X"20",X"CF",X"21",X"A4",X"4D",X"06",X"0C",X"CF",X"CD",X"81",X"8D",X"CD",X"7F",X"0F",X"CD",X"08", + X"8E",X"CD",X"77",X"25",X"C9",X"06",X"03",X"CD",X"5A",X"2A",X"CD",X"D2",X"8A",X"C3",X"40",X"19", + X"FE",X"03",X"CA",X"C2",X"8B",X"3E",X"01",X"32",X"E2",X"90",X"C9",X"AF",X"21",X"E0",X"4D",X"06", + X"20",X"CF",X"21",X"A4",X"4D",X"06",X"0C",X"CF",X"C9",X"FF",X"3E",X"01",X"32",X"80",X"50",X"3A", + X"F6",X"4D",X"C9",X"CD",X"C0",X"3E",X"3A",X"1C",X"4E",X"CD",X"19",X"81",X"C9",X"3A",X"E4",X"4D", + X"FE",X"01",X"CA",X"76",X"01",X"FE",X"02",X"28",X"06",X"CD",X"9E",X"84",X"C3",X"76",X"01",X"CD", + X"D0",X"8E",X"C3",X"76",X"01",X"AF",X"32",X"E4",X"4D",X"CD",X"CC",X"81",X"CD",X"8B",X"87",X"C9", + X"2A",X"22",X"4C",X"ED",X"5B",X"2A",X"4C",X"22",X"2A",X"4C",X"ED",X"53",X"22",X"4C",X"CD",X"64", + X"8F",X"ED",X"5B",X"3A",X"4C",X"22",X"3A",X"4C",X"ED",X"53",X"32",X"4C",X"C9",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"48",X"4D",X"7E",X"8F",X"77",X"C9",X"21",X"4C", + X"3E",X"9E",X"21",X"11",X"42",X"CD",X"DE",X"3C",X"3E",X"01",X"CD",X"F4",X"3C",X"C9",X"FF",X"FF", + X"CD",X"9E",X"85",X"CD",X"10",X"81",X"C9",X"CD",X"66",X"8D",X"CD",X"A6",X"0A",X"3A",X"09",X"4E", + X"EE",X"01",X"32",X"09",X"4E",X"C3",X"6C",X"09",X"3A",X"01",X"90",X"A7",X"28",X"07",X"78",X"FE", + X"04",X"C8",X"FE",X"03",X"C8",X"3A",X"02",X"90",X"A7",X"38",X"07",X"78",X"FE",X"02",X"C8",X"FE", + X"01",X"C8",X"CD",X"CF",X"88",X"C9",X"3A",X"03",X"90",X"A7",X"28",X"07",X"78",X"FE",X"04",X"C8", + X"FE",X"03",X"C8",X"3A",X"04",X"90",X"A7",X"28",X"07",X"78",X"FE",X"02",X"C8",X"FE",X"01",X"C8", + X"CD",X"CF",X"88",X"C9",X"21",X"32",X"4C",X"34",X"2A",X"32",X"4C",X"C9",X"CA",X"B6",X"8B",X"05", + X"2A",X"D2",X"4D",X"3E",X"10",X"95",X"ED",X"5B",X"08",X"4D",X"A7",X"ED",X"52",X"CA",X"B6",X"8B", + X"C3",X"08",X"3B",X"3E",X"01",X"32",X"A8",X"4D",X"32",X"AD",X"4D",X"C9",X"CD",X"70",X"84",X"0E", + X"03",X"3E",X"76",X"21",X"BC",X"41",X"CD",X"DE",X"3C",X"F5",X"3E",X"01",X"CD",X"F4",X"3C",X"F1", + X"06",X"04",X"80",X"11",X"40",X"00",X"19",X"0D",X"20",X"EC",X"CD",X"2B",X"8E",X"C9",X"00",X"00", + X"C4",X"40",X"16",X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"6C",X"08",X"07",X"00",X"00",X"06", + X"05",X"00",X"04",X"03",X"02",X"01",X"FE",X"2D",X"2C",X"2B",X"2A",X"29",X"28",X"6D",X"1F",X"1E", + X"1D",X"1C",X"00",X"00",X"00",X"1B",X"00",X"1A",X"19",X"18",X"17",X"FE",X"6B",X"6A",X"69",X"68", + X"67",X"66",X"65",X"64",X"63",X"62",X"61",X"00",X"00",X"60",X"3F",X"3E",X"3D",X"3C",X"2F",X"2E", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"03",X"04",X"02",X"01",X"03",X"02",X"04",X"02",X"03",X"04",X"01",X"01",X"02",X"04",X"03", + X"02",X"03",X"01",X"04",X"03",X"02",X"04",X"01",X"01",X"01",X"03",X"04",X"02",X"01",X"04",X"03", + X"03",X"02",X"01",X"04",X"04",X"02",X"03",X"01",X"02",X"01",X"03",X"04",X"03",X"01",X"04",X"02", + X"04",X"02",X"01",X"03",X"03",X"01",X"02",X"04",X"04",X"01",X"03",X"02",X"04",X"01",X"02",X"03", + X"00",X"04",X"08",X"0C",X"10",X"14",X"18",X"1C",X"20",X"24",X"28",X"2C",X"30",X"34",X"38",X"3C", + X"F5",X"E5",X"D5",X"3A",X"C0",X"50",X"E6",X"0F",X"5F",X"16",X"00",X"21",X"40",X"80",X"19",X"5E", + X"21",X"00",X"80",X"19",X"11",X"E0",X"4D",X"01",X"04",X"00",X"ED",X"B0",X"D1",X"E1",X"F1",X"C9", + X"F5",X"AF",X"32",X"80",X"50",X"00",X"00",X"00",X"F1",X"C9",X"CD",X"0F",X"20",X"FE",X"FC",X"28", + X"02",X"FE",X"FD",X"CA",X"40",X"19",X"FE",X"70",X"C3",X"F0",X"88",X"7D",X"21",X"E0",X"4D",X"FE", + X"EB",X"28",X"14",X"FE",X"90",X"20",X"03",X"23",X"18",X"0D",X"FE",X"F4",X"20",X"04",X"23",X"23", + X"18",X"05",X"FE",X"70",X"23",X"23",X"23",X"7E",X"32",X"E4",X"4D",X"3E",X"72",X"CD",X"9E",X"3E", + X"3E",X"11",X"CD",X"AB",X"3E",X"C3",X"75",X"8E",X"FF",X"FF",X"FF",X"3A",X"E6",X"4D",X"A7",X"C0", + X"3E",X"01",X"32",X"E6",X"4D",X"CD",X"3D",X"81",X"CD",X"2D",X"83",X"C9",X"3E",X"01",X"06",X"03", + X"11",X"20",X"00",X"C5",X"D5",X"E5",X"CF",X"E1",X"D1",X"C1",X"C9",X"21",X"CD",X"45",X"CD",X"CC", + X"80",X"19",X"CD",X"CC",X"80",X"19",X"CD",X"CC",X"80",X"19",X"CD",X"CC",X"80",X"C9",X"01",X"FD", + X"80",X"21",X"D0",X"41",X"CD",X"72",X"81",X"3E",X"DA",X"32",X"30",X"42",X"C9",X"DA",X"DA",X"DA", + X"CD",X"69",X"8B",X"CD",X"77",X"8D",X"CD",X"DB",X"80",X"CD",X"EE",X"80",X"C9",X"00",X"00",X"00", + X"3A",X"1C",X"4E",X"C6",X"99",X"27",X"CD",X"A8",X"85",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"C6", + X"30",X"32",X"F2",X"41",X"3A",X"1C",X"4E",X"E6",X"0F",X"C6",X"30",X"32",X"D2",X"41",X"3E",X"0F", + X"32",X"F2",X"45",X"32",X"D2",X"45",X"CD",X"B2",X"82",X"C9",X"F0",X"72",X"F1",X"3E",X"11",X"CD", + X"99",X"0F",X"01",X"3A",X"81",X"21",X"84",X"40",X"CD",X"72",X"81",X"21",X"64",X"41",X"CD",X"72", + X"81",X"21",X"44",X"42",X"CD",X"72",X"81",X"21",X"24",X"43",X"CD",X"72",X"81",X"C9",X"3E",X"17", + X"CD",X"99",X"0F",X"01",X"ED",X"0F",X"CD",X"45",X"81",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"C5",X"00",X"11",X"20",X"00",X"0A",X"77",X"19",X"03",X"0A",X"77",X"19",X"03",X"0A", + X"77",X"C1",X"C9",X"3A",X"FA",X"4D",X"A7",X"C0",X"3A",X"E6",X"4D",X"A7",X"C0",X"3E",X"01",X"32", + X"E6",X"4D",X"CD",X"3D",X"81",X"CD",X"2D",X"83",X"21",X"9C",X"4E",X"36",X"10",X"C9",X"21",X"BC", + X"4E",X"36",X"02",X"21",X"04",X"4E",X"C9",X"21",X"90",X"4C",X"3A",X"8A",X"4C",X"4F",X"06",X"10", + X"7E",X"A7",X"28",X"2F",X"E6",X"C0",X"07",X"07",X"B9",X"30",X"28",X"35",X"7E",X"E6",X"3F",X"20", + X"22",X"77",X"C5",X"E5",X"2C",X"7E",X"2C",X"46",X"21",X"E1",X"81",X"E5",X"E7",X"94",X"08",X"A3", + X"06",X"8E",X"05",X"42",X"12",X"00",X"10",X"0B",X"10",X"63",X"02",X"2B",X"21",X"F0",X"21",X"B9", + X"22",X"E1",X"C1",X"2C",X"2C",X"2C",X"10",X"C8",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"3A",X"ED",X"4D",X"A7",X"20",X"09",X"3E",X"01",X"32",X"ED",X"4D",X"CD",X"E9", + X"0F",X"C9",X"3A",X"EF",X"4D",X"A7",X"20",X"04",X"CD",X"79",X"3F",X"C9",X"C3",X"61",X"84",X"00", + X"21",X"00",X"40",X"CF",X"06",X"3F",X"21",X"C0",X"43",X"CF",X"3A",X"EE",X"4D",X"A7",X"C0",X"3E", + X"01",X"32",X"E8",X"4D",X"CD",X"82",X"3C",X"C9",X"3A",X"E8",X"4D",X"A7",X"C0",X"3A",X"09",X"4E", + X"C3",X"47",X"03",X"CD",X"3E",X"75",X"21",X"37",X"43",X"11",X"20",X"00",X"77",X"3D",X"19",X"77", + X"3E",X"05",X"32",X"37",X"47",X"32",X"57",X"47",X"CD",X"8A",X"05",X"C9",X"1F",X"C9",X"AF",X"32", + X"B1",X"4D",X"C9",X"F1",X"02",X"F2",X"03",X"F3",X"0F",X"70",X"F4",X"02",X"8D",X"F4",X"02",X"88", + X"F4",X"02",X"8A",X"70",X"F4",X"01",X"6C",X"F4",X"02",X"8A",X"F4",X"01",X"6A",X"F4",X"02",X"88", + X"70",X"F4",X"02",X"8D",X"F4",X"02",X"88",X"F4",X"02",X"8A",X"70",X"F4",X"01",X"6C",X"F4",X"02", + X"8A",X"F4",X"01",X"6A",X"F4",X"02",X"88",X"70",X"F0",X"6A",X"82",X"FF",X"21",X"BC",X"4E",X"CB", + X"AE",X"3E",X"01",X"32",X"F5",X"90",X"C9",X"3E",X"01",X"32",X"F4",X"90",X"CD",X"9C",X"82",X"CB", + X"F6",X"C9",X"3A",X"EA",X"90",X"A7",X"C0",X"CD",X"00",X"8F",X"C9",X"3E",X"01",X"32",X"80",X"50", + X"C9",X"3E",X"00",X"32",X"80",X"50",X"C9",X"3A",X"00",X"4E",X"FE",X"03",X"28",X"10",X"AF",X"32", + X"80",X"50",X"CD",X"51",X"8C",X"CD",X"00",X"81",X"3E",X"02",X"32",X"80",X"50",X"C9",X"3A",X"1C", + X"4E",X"A7",X"20",X"10",X"CD",X"C0",X"8C",X"3A",X"FB",X"4D",X"21",X"16",X"4E",X"86",X"77",X"3E", + X"40",X"32",X"1C",X"4E",X"AF",X"21",X"E0",X"4D",X"06",X"20",X"CF",X"21",X"A4",X"4D",X"06",X"0C", + X"CF",X"CD",X"00",X"81",X"CD",X"35",X"A4",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"21", + X"00",X"00",X"22",X"FC",X"4D",X"22",X"FE",X"4D",X"C9",X"CD",X"7C",X"0E",X"3E",X"20",X"32",X"04", + X"4E",X"C9",X"CD",X"6C",X"0E",X"CD",X"B0",X"0E",X"CD",X"C1",X"2C",X"C9",X"FF",X"06",X"16",X"CD", + X"5E",X"2C",X"C9",X"FF",X"3A",X"E4",X"4D",X"FE",X"01",X"28",X"08",X"DD",X"21",X"E9",X"4D",X"C9", + X"DD",X"21",X"39",X"4D",X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"28",X"06",X"3A",X"AF",X"4D",X"C3", + X"4C",X"3D",X"3A",X"AC",X"4D",X"A7",X"28",X"06",X"3A",X"AF",X"4D",X"C3",X"4C",X"3D",X"3A",X"F9", + X"4D",X"A7",X"C2",X"83",X"83",X"3A",X"16",X"4E",X"A7",X"CA",X"4C",X"83",X"2A",X"31",X"4D",X"11", + X"22",X"23",X"A7",X"ED",X"52",X"C2",X"4C",X"83",X"3E",X"08",X"32",X"F9",X"4D",X"C3",X"4C",X"83", + X"00",X"00",X"00",X"2A",X"31",X"4D",X"11",X"3A",X"2D",X"A7",X"ED",X"52",X"C2",X"4C",X"83",X"AF", + X"32",X"F9",X"4D",X"C3",X"45",X"83",X"00",X"00",X"00",X"3A",X"E4",X"4D",X"FE",X"01",X"C2",X"02", + X"3E",X"3E",X"01",X"32",X"A7",X"4D",X"C3",X"63",X"17",X"2A",X"39",X"4D",X"7D",X"06",X"23",X"90", + X"3A",X"39",X"4D",X"D8",X"06",X"25",X"90",X"D8",X"CD",X"D6",X"A0",X"C9",X"FF",X"FF",X"CD",X"FB", + X"83",X"21",X"00",X"00",X"28",X"03",X"22",X"FC",X"4D",X"22",X"FE",X"4D",X"C9",X"00",X"00",X"00", + X"00",X"E5",X"D5",X"11",X"20",X"00",X"77",X"3C",X"19",X"77",X"3C",X"3C",X"23",X"77",X"3D",X"ED", + X"52",X"77",X"D1",X"E1",X"C9",X"CD",X"17",X"2D",X"3A",X"00",X"4E",X"FE",X"03",X"D0",X"CD",X"F3", + X"2C",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3A",X"E4",X"4D",X"FE",X"01", + X"C9",X"FD",X"21",X"0A",X"4D",X"CD",X"FB",X"83",X"28",X"09",X"DD",X"21",X"E9",X"4D",X"CD",X"FA", + X"09",X"18",X"03",X"CD",X"A9",X"31",X"30",X"0E",X"3A",X"B1",X"4D",X"A7",X"C0",X"3E",X"01",X"32", + X"B1",X"4D",X"CD",X"07",X"1F",X"C9",X"AF",X"32",X"B1",X"4D",X"C9",X"F5",X"E5",X"D5",X"11",X"00", + X"04",X"3E",X"11",X"19",X"77",X"D1",X"E1",X"F1",X"77",X"C9",X"D5",X"E5",X"06",X"20",X"4F",X"CD", + X"2B",X"84",X"F5",X"E5",X"11",X"E0",X"83",X"7D",X"E6",X"1F",X"87",X"26",X"00",X"6F",X"19",X"D1", + X"A7",X"ED",X"52",X"F1",X"EE",X"01",X"CD",X"2B",X"84",X"EB",X"23",X"79",X"10",X"E1",X"E1",X"D1", + X"C9",X"3A",X"00",X"4E",X"FE",X"03",X"C2",X"2A",X"82",X"3E",X"40",X"06",X"3F",X"C3",X"20",X"82", + X"2A",X"B0",X"8F",X"22",X"86",X"4D",X"11",X"B2",X"8F",X"01",X"20",X"00",X"1A",X"FE",X"FF",X"C8", + X"FE",X"FE",X"20",X"0A",X"2A",X"86",X"4D",X"23",X"22",X"86",X"4D",X"13",X"18",X"EE",X"77",X"E5", + X"C5",X"01",X"00",X"04",X"09",X"3E",X"01",X"77",X"C1",X"E1",X"09",X"13",X"18",X"DE",X"2A",X"24", + X"4C",X"ED",X"5B",X"26",X"4C",X"ED",X"4B",X"28",X"4C",X"22",X"26",X"4C",X"ED",X"53",X"28",X"4C", + X"2A",X"2A",X"4C",X"ED",X"43",X"2A",X"4C",X"22",X"24",X"4C",X"2A",X"34",X"4C",X"ED",X"5B",X"36", + X"4C",X"ED",X"4B",X"38",X"4C",X"22",X"36",X"4C",X"ED",X"53",X"38",X"4C",X"2A",X"3A",X"4C",X"ED", + X"43",X"3A",X"4C",X"22",X"34",X"4C",X"C9",X"21",X"83",X"E3",X"22",X"02",X"4D",X"21",X"83",X"D1", + X"22",X"04",X"4D",X"21",X"83",X"BF",X"22",X"06",X"4D",X"CD",X"99",X"14",X"C9",X"21",X"97",X"D1", + X"22",X"00",X"4D",X"CD",X"99",X"14",X"C9",X"3E",X"94",X"21",X"34",X"43",X"77",X"E5",X"23",X"3C", + X"77",X"23",X"3C",X"77",X"E1",X"11",X"20",X"00",X"19",X"3C",X"77",X"23",X"3C",X"77",X"23",X"3C", + X"77",X"3E",X"01",X"21",X"34",X"47",X"11",X"20",X"00",X"01",X"00",X"03",X"E5",X"C5",X"CF",X"C1", + X"E1",X"19",X"CF",X"C9",X"3E",X"01",X"CD",X"74",X"0F",X"C9",X"01",X"5A",X"85",X"CD",X"72",X"81", + X"C9",X"E5",X"CD",X"2A",X"85",X"E1",X"11",X"00",X"04",X"19",X"CD",X"24",X"85",X"C9",X"21",X"50", + X"40",X"CD",X"31",X"85",X"C9",X"21",X"53",X"40",X"CD",X"31",X"85",X"C9",X"21",X"55",X"40",X"CD", + X"31",X"85",X"C9",X"21",X"57",X"40",X"CD",X"31",X"85",X"C9",X"53",X"54",X"50",X"AF",X"32",X"FB", + X"4D",X"21",X"00",X"00",X"22",X"A4",X"4D",X"21",X"31",X"93",X"22",X"08",X"4D",X"CD",X"99",X"14", + X"06",X"01",X"CD",X"ED",X"23",X"CD",X"B3",X"85",X"CD",X"8A",X"05",X"C9",X"21",X"FB",X"4D",X"19", + X"D5",X"E5",X"11",X"A7",X"4D",X"A7",X"ED",X"52",X"E1",X"D1",X"06",X"02",X"28",X"0A",X"06",X"00", + X"7E",X"A7",X"28",X"07",X"06",X"01",X"AF",X"77",X"CD",X"CD",X"0F",X"CD",X"10",X"81",X"CD",X"5A", + X"2A",X"CD",X"12",X"86",X"00",X"E6",X"C9",X"C9",X"32",X"1C",X"4E",X"A7",X"C0",X"3E",X"01",X"32", + X"DF",X"90",X"C9",X"CD",X"70",X"84",X"CD",X"38",X"8E",X"C9",X"FF",X"FF",X"21",X"00",X"00",X"22", + X"08",X"4D",X"22",X"02",X"4D",X"22",X"04",X"4D",X"22",X"06",X"4D",X"22",X"00",X"4D",X"22",X"F0", + X"90",X"22",X"F2",X"90",X"22",X"D2",X"4D",X"22",X"E4",X"4D",X"C9",X"3A",X"E4",X"4D",X"FE",X"01", + X"20",X"04",X"CD",X"56",X"89",X"C9",X"FE",X"02",X"20",X"07",X"CD",X"70",X"8B",X"CD",X"49",X"3D", + X"C9",X"06",X"04",X"ED",X"5B",X"39",X"4D",X"CD",X"23",X"17",X"CD",X"49",X"3D",X"C9",X"21",X"BC", + X"4E",X"CB",X"DE",X"CD",X"9C",X"82",X"C9",X"FF",X"FF",X"21",X"BC",X"4E",X"CB",X"D6",X"CD",X"9C", + X"82",X"C9",X"21",X"BC",X"4E",X"36",X"10",X"CD",X"9C",X"82",X"CD",X"17",X"2D",X"C9",X"FF",X"FF", + X"CD",X"FB",X"83",X"28",X"07",X"DD",X"21",X"01",X"33",X"C3",X"D6",X"10",X"EF",X"04",X"01",X"AF", + X"32",X"AC",X"4D",X"32",X"A7",X"4D",X"32",X"F0",X"90",X"C3",X"01",X"11",X"21",X"F0",X"90",X"7E", + X"FE",X"F0",X"28",X"02",X"34",X"C9",X"CD",X"4F",X"1B",X"C3",X"C3",X"10",X"21",X"F1",X"90",X"7E", + X"FE",X"F0",X"28",X"02",X"34",X"C9",X"CD",X"C7",X"1B",X"C3",X"1B",X"11",X"21",X"F2",X"90",X"7E", + X"FE",X"F0",X"28",X"02",X"34",X"C9",X"CD",X"3F",X"1C",X"C3",X"5F",X"11",X"21",X"F3",X"90",X"7E", + X"FE",X"F0",X"28",X"02",X"34",X"C9",X"CD",X"B7",X"1C",X"C3",X"CC",X"11",X"3A",X"E4",X"4D",X"32", + X"FF",X"90",X"C9",X"3A",X"00",X"4E",X"FE",X"03",X"D0",X"3E",X"02",X"32",X"9C",X"4E",X"C9",X"FF", + X"FF",X"FF",X"FF",X"FF",X"21",X"06",X"4C",X"06",X"04",X"1A",X"77",X"23",X"23",X"13",X"05",X"20", + X"F8",X"C9",X"21",X"07",X"4C",X"3E",X"09",X"06",X"04",X"77",X"23",X"23",X"05",X"20",X"FA",X"C9", + X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E",X"A1",X"C9",X"CD",X"3F",X"88",X"11",X"61",X"12",X"A7", + X"C8",X"11",X"65",X"12",X"C9",X"CD",X"33",X"88",X"11",X"69",X"12",X"A7",X"C8",X"11",X"6D",X"12", + X"C9",X"CD",X"57",X"88",X"11",X"71",X"12",X"A7",X"C8",X"11",X"75",X"12",X"C9",X"CD",X"4B",X"88", + X"11",X"79",X"12",X"A7",X"C8",X"11",X"7D",X"12",X"C9",X"CD",X"B0",X"86",X"20",X"22",X"3A",X"30", + X"4D",X"FE",X"00",X"20",X"04",X"CD",X"C5",X"86",X"C9",X"FE",X"01",X"20",X"04",X"CD",X"B9",X"86", + X"C9",X"FE",X"02",X"20",X"04",X"CD",X"B9",X"86",X"C9",X"FE",X"03",X"C0",X"CD",X"C5",X"86",X"C9", + X"3A",X"30",X"4D",X"FE",X"00",X"20",X"04",X"CD",X"DD",X"86",X"C9",X"FE",X"01",X"20",X"04",X"CD", + X"D1",X"86",X"C9",X"FE",X"02",X"20",X"04",X"CD",X"D1",X"86",X"C9",X"FE",X"03",X"C0",X"CD",X"DD", + X"86",X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"28",X"04",X"CD",X"9C",X"16",X"C9",X"CD",X"E9",X"86", + X"CD",X"94",X"86",X"CD",X"A2",X"86",X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"28",X"04",X"CD",X"AA", + X"16",X"C9",X"CD",X"E9",X"86",X"CD",X"94",X"86",X"CD",X"A2",X"86",X"C9",X"21",X"02",X"4C",X"CD", + X"4E",X"15",X"CD",X"32",X"87",X"CD",X"47",X"87",X"C9",X"21",X"00",X"00",X"22",X"01",X"90",X"22", + X"03",X"90",X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"28",X"08",X"FE",X"02",X"28",X"04",X"CD",X"09", + X"3D",X"C9",X"3A",X"FD",X"4D",X"A7",X"C8",X"CD",X"09",X"3D",X"C9",X"3E",X"40",X"06",X"0C",X"21", + X"45",X"41",X"CD",X"76",X"0F",X"C9",X"00",X"DD",X"21",X"26",X"4D",X"CD",X"0F",X"20",X"21",X"00", + X"90",X"FE",X"FC",X"28",X"0D",X"FE",X"FD",X"28",X"09",X"E6",X"C0",X"D6",X"C0",X"20",X"03",X"36", + X"01",X"C9",X"36",X"00",X"C9",X"0D",X"0C",X"0B",X"0A",X"09",X"6C",X"08",X"07",X"00",X"00",X"06", + X"2A",X"39",X"4D",X"7D",X"06",X"02",X"80",X"32",X"D2",X"4D",X"7C",X"32",X"D3",X"4D",X"C9",X"1E", + X"3A",X"3C",X"4D",X"FE",X"00",X"20",X"12",X"FD",X"21",X"35",X"4D",X"CD",X"97",X"87",X"7E",X"A7", + X"C0",X"FD",X"21",X"37",X"4D",X"CD",X"97",X"87",X"C9",X"FE",X"01",X"20",X"15",X"CD",X"C0",X"87", + X"FD",X"21",X"D2",X"4D",X"CD",X"97",X"87",X"7E",X"A7",X"C0",X"FD",X"21",X"37",X"4D",X"CD",X"97", + X"87",X"C9",X"FE",X"02",X"20",X"04",X"CD",X"ED",X"87",X"C9",X"FE",X"03",X"C0",X"CD",X"D7",X"87", + X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"20",X"08",X"CD",X"D0",X"87",X"3A",X"00",X"90",X"A7",X"C0", + X"FD",X"21",X"39",X"4D",X"C3",X"7A",X"80",X"AF",X"21",X"00",X"90",X"01",X"FF",X"03",X"CF",X"C3", + X"3E",X"A7",X"00",X"CD",X"69",X"87",X"3E",X"01",X"32",X"01",X"90",X"3A",X"C0",X"4D",X"C9",X"CD", + X"69",X"87",X"3E",X"01",X"32",X"02",X"90",X"3A",X"C0",X"4D",X"C9",X"CD",X"69",X"87",X"3E",X"01", + X"32",X"03",X"90",X"3A",X"C0",X"4D",X"C9",X"CD",X"69",X"87",X"3E",X"01",X"32",X"04",X"90",X"3A", + X"C0",X"4D",X"C9",X"06",X"04",X"2A",X"37",X"4D",X"A7",X"ED",X"52",X"28",X"1C",X"05",X"2A",X"35", + X"4D",X"A7",X"ED",X"52",X"28",X"13",X"05",X"2A",X"39",X"4D",X"A7",X"ED",X"52",X"28",X"0A",X"05", + X"2A",X"D2",X"4D",X"A7",X"ED",X"52",X"28",X"01",X"05",X"78",X"C9",X"3A",X"FD",X"4D",X"A7",X"3E", + X"01",X"28",X"03",X"32",X"FB",X"4D",X"32",X"FF",X"90",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"ED",X"5B",X"33",X"4D",X"CD",X"63",X"88",X"32",X"06",X"90",X"A7",X"C8",X"3E",X"01",X"32",X"A8", + X"4D",X"3E",X"02",X"32",X"A4",X"4D",X"C9",X"ED",X"5B",X"31",X"4D",X"CD",X"63",X"88",X"32",X"05", + X"90",X"A7",X"C8",X"3E",X"01",X"32",X"A7",X"4D",X"32",X"A4",X"4D",X"C9",X"00",X"00",X"00",X"3A", + X"05",X"90",X"A7",X"28",X"0B",X"AF",X"32",X"A7",X"4D",X"32",X"05",X"90",X"32",X"A4",X"4D",X"C9", + X"3A",X"06",X"90",X"A7",X"C8",X"AF",X"32",X"A8",X"4D",X"32",X"06",X"90",X"32",X"A4",X"4D",X"C9", + X"CA",X"8B",X"80",X"FE",X"90",X"CA",X"F5",X"18",X"FE",X"92",X"CA",X"F5",X"18",X"C3",X"EF",X"18", + X"A7",X"C8",X"47",X"CD",X"B0",X"86",X"20",X"04",X"CD",X"28",X"8F",X"C9",X"CD",X"46",X"8F",X"C9", + X"31",X"C0",X"4F",X"AF",X"01",X"04",X"00",X"21",X"00",X"90",X"CF",X"0D",X"20",X"FC",X"C3",X"3E", + X"A7",X"00",X"00",X"00",X"C8",X"78",X"FE",X"02",X"C8",X"FE",X"01",X"C8",X"3E",X"01",X"32",X"A4", + X"4D",X"CD",X"CF",X"88",X"C9",X"D6",X"C0",X"28",X"0A",X"7E",X"FE",X"90",X"28",X"05",X"FE",X"92", + X"C2",X"9F",X"29",X"11",X"00",X"04",X"19",X"7E",X"FE",X"16",X"CA",X"0B",X"8B",X"FE",X"17",X"CA", + X"9F",X"29",X"C3",X"C6",X"29",X"FF",X"3A",X"AC",X"4D",X"A7",X"C0",X"00",X"00",X"CD",X"B7",X"88", + X"3A",X"05",X"90",X"CD",X"00",X"89",X"A7",X"28",X"09",X"AF",X"32",X"08",X"90",X"06",X"02",X"CD", + X"9B",X"85",X"CD",X"49",X"3D",X"3A",X"AD",X"4D",X"A7",X"C0",X"00",X"00",X"CD",X"A0",X"88",X"3A", + X"06",X"90",X"CD",X"00",X"89",X"A7",X"20",X"06",X"CD",X"49",X"3D",X"C9",X"00",X"00",X"3A",X"A4", + X"4D",X"CD",X"6C",X"17",X"AF",X"32",X"FD",X"4D",X"CD",X"49",X"3D",X"C9",X"00",X"00",X"00",X"00", + X"21",X"02",X"4C",X"CD",X"4E",X"15",X"3A",X"E4",X"4D",X"FE",X"01",X"20",X"07",X"CD",X"32",X"87", + X"CD",X"47",X"87",X"C9",X"FE",X"02",X"C0",X"CD",X"E0",X"89",X"C9",X"00",X"00",X"00",X"00",X"00", + X"5E",X"23",X"56",X"23",X"4E",X"23",X"46",X"C9",X"CD",X"C0",X"89",X"ED",X"53",X"02",X"4C",X"ED", + X"43",X"06",X"4C",X"23",X"CD",X"C0",X"89",X"ED",X"53",X"08",X"4C",X"ED",X"43",X"0C",X"4C",X"C9", + X"3A",X"E4",X"4D",X"FE",X"02",X"C0",X"CD",X"B0",X"86",X"20",X"10",X"3A",X"C0",X"4D",X"21",X"10", + X"8A",X"A7",X"20",X"03",X"21",X"18",X"8A",X"CD",X"C8",X"89",X"C9",X"3A",X"C0",X"4D",X"21",X"20", + X"8A",X"A7",X"20",X"03",X"21",X"28",X"8A",X"CD",X"C8",X"89",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF", + X"68",X"01",X"60",X"01",X"64",X"01",X"6C",X"01",X"78",X"01",X"70",X"01",X"74",X"01",X"7C",X"01", + X"6B",X"01",X"63",X"01",X"67",X"01",X"6F",X"01",X"7B",X"01",X"73",X"01",X"77",X"01",X"7F",X"01", + X"3E",X"FD",X"21",X"85",X"40",X"06",X"15",X"CF",X"21",X"B9",X"40",X"11",X"20",X"00",X"06",X"18", + X"77",X"19",X"05",X"20",X"FB",X"21",X"8A",X"42",X"06",X"0A",X"CF",X"00",X"00",X"00",X"00",X"21", + X"CA",X"41",X"06",X"06",X"77",X"19",X"05",X"20",X"FB",X"21",X"AA",X"41",X"77",X"23",X"77",X"21", + X"73",X"42",X"77",X"C3",X"50",X"8B",X"AF",X"06",X"5F",X"21",X"8C",X"4E",X"CF",X"C9",X"FF",X"FF", + X"3E",X"40",X"21",X"A5",X"40",X"06",X"14",X"CF",X"21",X"A9",X"42",X"06",X"0B",X"CF",X"21",X"D8", + X"40",X"06",X"17",X"77",X"19",X"05",X"20",X"FB",X"21",X"A9",X"41",X"06",X"08",X"77",X"19",X"05", + X"20",X"FB",X"21",X"89",X"41",X"77",X"23",X"77",X"21",X"6F",X"40",X"77",X"23",X"77",X"C9",X"FF", + X"84",X"44",X"85",X"44",X"88",X"44",X"8E",X"44",X"91",X"44",X"97",X"44",X"39",X"45",X"99",X"45", + X"79",X"46",X"D9",X"46",X"99",X"47",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"06",X"0B",X"11",X"A0",X"8A",X"1A",X"6F",X"13",X"1A",X"67",X"3E",X"16",X"77",X"13",X"05",X"20", + X"F4",X"C9",X"3A",X"E4",X"4D",X"FE",X"01",X"20",X"07",X"CD",X"00",X"81",X"CD",X"3D",X"25",X"C9", + X"FE",X"02",X"C0",X"CD",X"00",X"81",X"CD",X"30",X"8A",X"CD",X"70",X"8A",X"CD",X"C0",X"8A",X"CD", + X"20",X"8D",X"C9",X"FE",X"90",X"CA",X"23",X"19",X"FE",X"92",X"CA",X"23",X"19",X"E6",X"C0",X"D6", + X"C0",X"CA",X"23",X"19",X"C3",X"50",X"19",X"FF",X"FF",X"FF",X"FF",X"DD",X"E5",X"FD",X"E5",X"00", + X"00",X"00",X"00",X"FD",X"21",X"0C",X"4D",X"CD",X"0F",X"20",X"19",X"7E",X"FD",X"E1",X"DD",X"E1", + X"FE",X"16",X"CA",X"9F",X"29",X"C3",X"C6",X"29",X"3A",X"E4",X"4D",X"21",X"00",X"00",X"FE",X"02", + X"28",X"07",X"FE",X"01",X"C0",X"22",X"FE",X"4D",X"C9",X"22",X"FE",X"4D",X"AF",X"32",X"FC",X"4D", + X"C9",X"BC",X"02",X"5C",X"40",X"53",X"45",X"47",X"41",X"40",X"31",X"39",X"38",X"32",X"2F",X"81", + X"21",X"D2",X"D2",X"22",X"4F",X"40",X"21",X"FC",X"FC",X"22",X"4F",X"43",X"22",X"6F",X"43",X"22", + X"8F",X"43",X"21",X"D3",X"D3",X"22",X"AF",X"43",X"C9",X"CD",X"A3",X"8E",X"CD",X"7F",X"0F",X"C9", + X"06",X"05",X"ED",X"5B",X"39",X"4D",X"3A",X"AF",X"4D",X"A7",X"20",X"09",X"2A",X"37",X"4D",X"A7", + X"ED",X"52",X"CA",X"B6",X"8B",X"05",X"3A",X"AE",X"4D",X"A7",X"20",X"09",X"2A",X"35",X"4D",X"A7", + X"ED",X"52",X"CA",X"B6",X"8B",X"05",X"3A",X"AD",X"4D",X"A7",X"20",X"09",X"2A",X"33",X"4D",X"A7", + X"ED",X"52",X"CA",X"B6",X"8B",X"05",X"3A",X"AC",X"4D",X"A7",X"20",X"09",X"2A",X"31",X"4D",X"A7", + X"ED",X"52",X"C3",X"6C",X"8F",X"05",X"CD",X"CD",X"8D",X"00",X"32",X"A5",X"4D",X"A7",X"C8",X"C3", + X"80",X"8E",X"CD",X"83",X"8F",X"AF",X"32",X"A5",X"4D",X"3A",X"FD",X"4D",X"A7",X"06",X"00",X"28", + X"09",X"AF",X"32",X"FD",X"4D",X"CD",X"CD",X"0F",X"06",X"01",X"CD",X"10",X"8F",X"C9",X"21",X"02", + X"4C",X"11",X"F0",X"90",X"06",X"04",X"1A",X"A7",X"28",X"06",X"FE",X"F0",X"20",X"02",X"36",X"FC", + X"23",X"23",X"13",X"05",X"20",X"F0",X"C9",X"00",X"DD",X"40",X"07",X"C1",X"40",X"40",X"FF",X"FF", + X"2A",X"17",X"4E",X"3E",X"40",X"CD",X"F4",X"3C",X"11",X"60",X"00",X"19",X"22",X"17",X"4E",X"C9", + X"2A",X"17",X"4E",X"11",X"60",X"00",X"ED",X"52",X"22",X"17",X"4E",X"3E",X"90",X"CD",X"DE",X"3C", + X"3E",X"01",X"CD",X"F4",X"3C",X"C9",X"2A",X"1A",X"4E",X"CD",X"1B",X"8C",X"11",X"60",X"00",X"19", + X"22",X"1A",X"4E",X"C9",X"2A",X"1A",X"4E",X"11",X"60",X"00",X"ED",X"52",X"3E",X"40",X"CD",X"F4", + X"3C",X"22",X"1A",X"4E",X"C9",X"21",X"FB",X"4D",X"35",X"21",X"16",X"4E",X"34",X"CD",X"10",X"8C", + X"C9",X"01",X"0B",X"00",X"CD",X"FA",X"8D",X"11",X"16",X"4E",X"ED",X"B0",X"C9",X"00",X"00",X"00", + X"00",X"7E",X"A7",X"C8",X"4F",X"23",X"5E",X"23",X"56",X"EB",X"3E",X"90",X"CD",X"DE",X"3C",X"3E", + X"01",X"CD",X"F4",X"3C",X"11",X"60",X"00",X"19",X"0D",X"20",X"EF",X"00",X"C9",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"3A",X"19",X"4E",X"A7",X"C8",X"4F",X"21",X"C1",X"40",X"CD", + X"6A",X"8C",X"C9",X"3E",X"05",X"CD",X"AB",X"3E",X"3E",X"70",X"CF",X"CD",X"BA",X"2F",X"C9",X"AF", + X"32",X"9C",X"4E",X"CD",X"41",X"8D",X"CD",X"8B",X"8E",X"32",X"80",X"50",X"CD",X"F6",X"28",X"3E", + X"11",X"CD",X"AB",X"3E",X"3A",X"70",X"4E",X"21",X"00",X"00",X"22",X"EB",X"90",X"C9",X"FF",X"FF", + X"21",X"FB",X"4D",X"7E",X"A7",X"C8",X"4F",X"2A",X"17",X"4E",X"11",X"60",X"00",X"ED",X"52",X"22", + X"17",X"4E",X"0D",X"20",X"F5",X"C9",X"CD",X"09",X"86",X"21",X"19",X"4E",X"34",X"21",X"FB",X"4D", + X"35",X"CD",X"26",X"8C",X"3A",X"19",X"4E",X"FE",X"07",X"C0",X"3E",X"01",X"32",X"A5",X"4D",X"32", + X"E2",X"90",X"CD",X"FD",X"8C",X"01",X"06",X"00",X"CD",X"54",X"8C",X"C9",X"FF",X"21",X"00",X"00", + X"22",X"A7",X"4D",X"22",X"A9",X"4D",X"21",X"E5",X"4D",X"AF",X"06",X"1B",X"CF",X"C9",X"CD",X"FD", + X"8C",X"CD",X"51",X"8C",X"21",X"04",X"4E",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"C4",X"87",X"22",X"00",X"4D",X"21",X"38",X"2E",X"22",X"0A",X"4D",X"22",X"31",X"4D",X"21", + X"00",X"FF",X"22",X"14",X"4D",X"22",X"1E",X"4D",X"3E",X"00",X"32",X"28",X"4D",X"32",X"2C",X"4D", + X"C9",X"3A",X"FB",X"4D",X"A7",X"C8",X"21",X"16",X"4E",X"86",X"77",X"3A",X"FB",X"4D",X"CD",X"C6", + X"8C",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"36",X"A6",X"E5",X"11",X"00",X"04",X"19",X"36", + X"01",X"E1",X"C9",X"FF",X"FF",X"FF",X"3A",X"FB",X"4D",X"A7",X"28",X"0B",X"21",X"16",X"4E",X"86", + X"77",X"3A",X"FB",X"4D",X"CD",X"C6",X"8C",X"21",X"16",X"4E",X"CD",X"60",X"8C",X"CD",X"D0",X"A4", + X"C9",X"CD",X"C0",X"3E",X"21",X"16",X"4E",X"CD",X"60",X"8C",X"CD",X"86",X"8C",X"3E",X"03",X"32", + X"80",X"50",X"CD",X"DB",X"80",X"CD",X"EE",X"80",X"C9",X"3A",X"FE",X"4D",X"A7",X"28",X"07",X"AF", + X"32",X"FE",X"4D",X"CD",X"B3",X"8D",X"3A",X"FF",X"4D",X"A7",X"C8",X"AF",X"32",X"FF",X"4D",X"CD", + X"B3",X"8D",X"C9",X"3A",X"A5",X"4D",X"A7",X"C0",X"21",X"FB",X"4D",X"7E",X"A7",X"C8",X"35",X"CD", + X"49",X"8C",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"9C",X"A6",X"78",X"FE",X"05", + X"20",X"02",X"3D",X"05",X"32",X"A4",X"4D",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3A",X"EA",X"90",X"A7",X"20",X"04", + X"21",X"3E",X"3D",X"C9",X"21",X"F7",X"8B",X"C9",X"CD",X"A6",X"8E",X"21",X"00",X"90",X"06",X"0F", + X"AF",X"CF",X"21",X"00",X"00",X"22",X"F0",X"90",X"22",X"F2",X"90",X"C9",X"F5",X"ED",X"57",X"B7", + X"28",X"04",X"F1",X"C3",X"D4",X"3B",X"F1",X"C3",X"30",X"3D",X"FF",X"CD",X"C2",X"1F",X"3E",X"5C", + X"32",X"9D",X"41",X"3E",X"01",X"32",X"9D",X"45",X"06",X"17",X"CD",X"5E",X"2C",X"C9",X"FF",X"FF", + X"FF",X"FF",X"CD",X"51",X"8C",X"3A",X"13",X"4E",X"A7",X"C0",X"CD",X"00",X"81",X"C9",X"FF",X"FF", + X"06",X"01",X"CD",X"ED",X"23",X"CD",X"D7",X"24",X"CD",X"B3",X"8D",X"AF",X"21",X"E0",X"4D",X"06", + X"20",X"CF",X"21",X"A4",X"4D",X"06",X"0C",X"CF",X"CD",X"81",X"8D",X"CD",X"7F",X"0F",X"CD",X"08", + X"8E",X"CD",X"77",X"25",X"C9",X"06",X"03",X"CD",X"5A",X"2A",X"CD",X"D2",X"8A",X"C3",X"40",X"19", + X"FE",X"03",X"CA",X"C2",X"8B",X"3E",X"01",X"32",X"E2",X"90",X"C9",X"AF",X"21",X"E0",X"4D",X"06", + X"20",X"CF",X"21",X"A4",X"4D",X"06",X"0C",X"CF",X"C9",X"FF",X"3E",X"01",X"32",X"80",X"50",X"3A", + X"F6",X"4D",X"C9",X"CD",X"C0",X"3E",X"3A",X"1C",X"4E",X"CD",X"19",X"81",X"C9",X"3A",X"E4",X"4D", + X"FE",X"01",X"CA",X"76",X"01",X"FE",X"02",X"28",X"06",X"CD",X"9E",X"84",X"C3",X"76",X"01",X"CD", + X"D0",X"8E",X"C3",X"76",X"01",X"AF",X"32",X"E4",X"4D",X"CD",X"CC",X"81",X"CD",X"8B",X"87",X"C9", + X"2A",X"22",X"4C",X"ED",X"5B",X"2A",X"4C",X"22",X"2A",X"4C",X"ED",X"53",X"22",X"4C",X"CD",X"64", + X"8F",X"ED",X"5B",X"3A",X"4C",X"22",X"3A",X"4C",X"ED",X"53",X"32",X"4C",X"C9",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"48",X"4D",X"7E",X"8F",X"77",X"C9",X"21",X"4C", + X"3E",X"9E",X"21",X"11",X"42",X"CD",X"DE",X"3C",X"3E",X"01",X"CD",X"F4",X"3C",X"C9",X"FF",X"FF", + X"CD",X"9E",X"85",X"CD",X"10",X"81",X"C9",X"CD",X"66",X"8D",X"CD",X"A6",X"0A",X"3A",X"09",X"4E", + X"EE",X"01",X"32",X"09",X"4E",X"C3",X"6C",X"09",X"3A",X"01",X"90",X"A7",X"28",X"07",X"78",X"FE", + X"04",X"C8",X"FE",X"03",X"C8",X"3A",X"02",X"90",X"A7",X"38",X"07",X"78",X"FE",X"02",X"C8",X"FE", + X"01",X"C8",X"CD",X"CF",X"88",X"C9",X"3A",X"03",X"90",X"A7",X"28",X"07",X"78",X"FE",X"04",X"C8", + X"FE",X"03",X"C8",X"3A",X"04",X"90",X"A7",X"28",X"07",X"78",X"FE",X"02",X"C8",X"FE",X"01",X"C8", + X"CD",X"CF",X"88",X"C9",X"21",X"32",X"4C",X"34",X"2A",X"32",X"4C",X"C9",X"CA",X"B6",X"8B",X"05", + X"2A",X"D2",X"4D",X"3E",X"10",X"95",X"ED",X"5B",X"08",X"4D",X"A7",X"ED",X"52",X"CA",X"B6",X"8B", + X"C3",X"08",X"3B",X"3E",X"01",X"32",X"A8",X"4D",X"32",X"AD",X"4D",X"C9",X"CD",X"70",X"84",X"0E", + X"03",X"3E",X"76",X"21",X"BC",X"41",X"CD",X"DE",X"3C",X"F5",X"3E",X"01",X"CD",X"F4",X"3C",X"F1", + X"06",X"04",X"80",X"11",X"40",X"00",X"19",X"0D",X"20",X"EC",X"CD",X"2B",X"8E",X"C9",X"00",X"00", + X"C4",X"40",X"16",X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"6C",X"08",X"07",X"00",X"00",X"06", + X"05",X"00",X"04",X"03",X"02",X"01",X"FE",X"2D",X"2C",X"2B",X"2A",X"29",X"28",X"6D",X"1F",X"1E", + X"1D",X"1C",X"00",X"00",X"00",X"1B",X"00",X"1A",X"19",X"18",X"17",X"FE",X"6B",X"6A",X"69",X"68", + X"67",X"66",X"65",X"64",X"63",X"62",X"61",X"00",X"00",X"60",X"3F",X"3E",X"3D",X"3C",X"2F",X"2E", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3A",X"00",X"4E",X"FE",X"03",X"C0",X"3A",X"04",X"4E",X"FE",X"09",X"28",X"0A",X"FE",X"20",X"20", + X"06",X"3E",X"01",X"32",X"80",X"50",X"C9",X"3A",X"C1",X"50",X"E6",X"01",X"28",X"30",X"3A",X"E4", + X"4D",X"A7",X"20",X"1A",X"3A",X"A5",X"4D",X"A7",X"C0",X"3A",X"1C",X"4E",X"A7",X"C8",X"3E",X"01", + X"32",X"FC",X"90",X"3E",X"70",X"CD",X"9E",X"3E",X"3E",X"05",X"CD",X"AB",X"3E",X"C9",X"FE",X"01", + X"CA",X"42",X"A1",X"FE",X"02",X"CA",X"D8",X"A3",X"FE",X"03",X"CA",X"83",X"81",X"C9",X"3A",X"FC", + X"90",X"A7",X"C8",X"AF",X"32",X"FC",X"90",X"3E",X"72",X"CD",X"9E",X"3E",X"3E",X"11",X"CD",X"AB", + X"3E",X"3A",X"A5",X"4D",X"A7",X"C0",X"3A",X"E4",X"4D",X"A7",X"C8",X"FE",X"03",X"30",X"04",X"CD", + X"F3",X"A3",X"C9",X"3A",X"F4",X"90",X"A7",X"20",X"03",X"CD",X"AC",X"82",X"AF",X"32",X"E4",X"4D", + X"32",X"E6",X"4D",X"32",X"F4",X"90",X"32",X"FA",X"4D",X"CD",X"8B",X"87",X"CD",X"5E",X"81",X"C9", + X"DD",X"21",X"00",X"4C",X"FD",X"21",X"61",X"3E",X"21",X"A7",X"4D",X"06",X"04",X"0E",X"01",X"7E", + X"A7",X"E5",X"28",X"2B",X"21",X"EF",X"90",X"59",X"16",X"00",X"19",X"7E",X"FE",X"F0",X"28",X"1F", + X"79",X"87",X"5F",X"DD",X"E5",X"FD",X"E5",X"FD",X"19",X"DD",X"19",X"FD",X"5E",X"00",X"FD",X"23", + X"FD",X"56",X"00",X"DD",X"73",X"00",X"DD",X"23",X"DD",X"72",X"00",X"FD",X"E1",X"DD",X"E1",X"E1", + X"23",X"0C",X"05",X"20",X"CA",X"C9",X"3A",X"00",X"4E",X"FE",X"01",X"C8",X"3A",X"04",X"4E",X"FE", + X"10",X"D0",X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E",X"A1",X"28",X"0C",X"3A",X"40",X"50",X"CB", + X"67",X"28",X"11",X"CD",X"FB",X"A3",X"C9",X"FF",X"3A",X"00",X"50",X"CB",X"77",X"28",X"05",X"CD", + X"FB",X"A3",X"C9",X"FF",X"3A",X"FB",X"90",X"A7",X"C0",X"3E",X"01",X"32",X"FB",X"90",X"2A",X"EB", + X"4D",X"3E",X"40",X"77",X"2A",X"39",X"4D",X"CD",X"65",X"00",X"CD",X"58",X"8D",X"22",X"EB",X"4D", + X"2A",X"39",X"4D",X"22",X"E9",X"4D",X"3A",X"F5",X"90",X"A7",X"C0",X"21",X"BC",X"4E",X"36",X"80", + X"3E",X"01",X"32",X"F5",X"90",X"C9",X"3A",X"13",X"4E",X"A7",X"C8",X"3A",X"ED",X"90",X"C3",X"DE", + X"A3",X"FF",X"21",X"9C",X"4E",X"36",X"04",X"CD",X"99",X"8D",X"2A",X"08",X"4D",X"CD",X"83",X"31", + X"C9",X"21",X"9C",X"4E",X"36",X"08",X"CD",X"99",X"8D",X"2A",X"00",X"4D",X"CD",X"83",X"31",X"C9", + X"40",X"20",X"CC",X"86",X"77",X"1C",X"0F",X"FF",X"70",X"00",X"01",X"0F",X"00",X"01",X"0C",X"00", + X"70",X"00",X"01",X"0C",X"00",X"01",X"0C",X"00",X"60",X"00",X"01",X"0C",X"00",X"01",X"0C",X"00", + X"40",X"00",X"87",X"17",X"00",X"01",X"0C",X"00",X"60",X"A0",X"CC",X"10",X"10",X"02",X"04",X"00", + X"70",X"20",X"FF",X"86",X"FE",X"1C",X"0F",X"EE",X"31",X"10",X"01",X"0C",X"00",X"01",X"0C",X"00", + X"3A",X"00",X"4E",X"E7",X"AC",X"A1",X"80",X"A2",X"00",X"A2",X"0E",X"A2",X"3A",X"01",X"4E",X"E7", + X"5E",X"A2",X"0C",X"00",X"3A",X"02",X"4E",X"E7",X"5D",X"85",X"0C",X"00",X"95",X"A2",X"0C",X"00", + X"9E",X"A2",X"0C",X"00",X"A7",X"A2",X"0C",X"00",X"AE",X"A2",X"0C",X"00",X"B4",X"A2",X"0C",X"00", + X"BD",X"A2",X"0C",X"00",X"C4",X"A2",X"0C",X"00",X"CA",X"A2",X"0C",X"00",X"D0",X"A2",X"0C",X"00", + X"D9",X"A2",X"0C",X"00",X"E0",X"A2",X"0C",X"00",X"E6",X"A2",X"0C",X"00",X"44",X"82",X"0C",X"00", + X"EF",X"A2",X"0C",X"00",X"F5",X"A2",X"0C",X"00",X"07",X"05",X"0C",X"00",X"EA",X"04",X"7C",X"05", + X"3A",X"03",X"4E",X"E7",X"0F",X"A3",X"04",X"0A",X"2B",X"32",X"8F",X"06",X"AC",X"06",X"3A",X"04", + X"4E",X"E7",X"79",X"08",X"99",X"08",X"CD",X"08",X"CD",X"08",X"0D",X"09",X"0C",X"00",X"40",X"09", + X"0C",X"00",X"EE",X"31",X"A0",X"03",X"0C",X"00",X"D2",X"09",X"D8",X"09",X"0C",X"00",X"E8",X"09", + X"0C",X"00",X"0B",X"0A",X"0C",X"00",X"02",X"0A",X"0C",X"00",X"04",X"0A",X"0C",X"00",X"06",X"0A", + X"0C",X"00",X"08",X"0A",X"0C",X"00",X"0A",X"0A",X"0C",X"00",X"0C",X"0A",X"0C",X"00",X"0E",X"0A", + X"0C",X"00",X"2C",X"0A",X"0C",X"00",X"7C",X"0A",X"A0",X"0A",X"0C",X"00",X"A3",X"0A",X"EF",X"00", + X"00",X"EF",X"06",X"00",X"EF",X"01",X"00",X"EF",X"14",X"00",X"EF",X"18",X"00",X"EF",X"04",X"00", + X"EF",X"1E",X"00",X"EF",X"07",X"00",X"21",X"01",X"4E",X"34",X"21",X"C0",X"50",X"36",X"01",X"C9", + X"CD",X"A1",X"2B",X"3A",X"6E",X"4E",X"A7",X"C3",X"BA",X"A3",X"32",X"04",X"4E",X"32",X"02",X"4E", + X"21",X"00",X"4E",X"34",X"C9",X"06",X"02",X"CD",X"5E",X"2C",X"CD",X"8A",X"05",X"C9",X"06",X"0C", + X"CD",X"5E",X"2C",X"CD",X"8A",X"05",X"C9",X"CD",X"D7",X"84",X"CD",X"8A",X"05",X"C9",X"06",X"0D", + X"CD",X"97",X"A2",X"C9",X"06",X"0E",X"CD",X"97",X"A2",X"CD",X"3E",X"85",X"C9",X"CD",X"ED",X"84", + X"CD",X"8A",X"05",X"C9",X"06",X"0F",X"CD",X"97",X"A2",X"C9",X"06",X"10",X"CD",X"97",X"A2",X"C9", + X"06",X"11",X"CD",X"97",X"A2",X"CD",X"45",X"85",X"C9",X"CD",X"F7",X"84",X"CD",X"8A",X"05",X"C9", + X"06",X"12",X"CD",X"97",X"A2",X"C9",X"06",X"13",X"CD",X"97",X"A2",X"CD",X"4C",X"85",X"C9",X"06", + X"14",X"CD",X"97",X"A2",X"C9",X"06",X"15",X"CD",X"97",X"A2",X"CD",X"53",X"85",X"C9",X"C9",X"06", + X"15",X"CD",X"97",X"A2",X"C9",X"80",X"05",X"EF",X"1C",X"11",X"0E",X"12",X"C3",X"85",X"05",X"CD", + X"A1",X"2B",X"EF",X"00",X"01",X"EF",X"01",X"00",X"EF",X"1C",X"07",X"EF",X"1C",X"0B",X"EF",X"1E", + X"00",X"21",X"03",X"4E",X"34",X"3E",X"01",X"32",X"D6",X"4D",X"3A",X"71",X"4E",X"FE",X"FF",X"C8", + X"EF",X"1C",X"0A",X"EF",X"1F",X"00",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"47",X"87", + X"87",X"80",X"80",X"5F",X"16",X"00",X"DD",X"19",X"DD",X"7E",X"00",X"87",X"47",X"87",X"87",X"4F", + X"87",X"87",X"81",X"80",X"5F",X"16",X"00",X"21",X"0F",X"33",X"19",X"CD",X"14",X"08",X"DD",X"7E", + X"01",X"32",X"B0",X"4D",X"DD",X"7E",X"02",X"47",X"87",X"80",X"5F",X"16",X"00",X"21",X"43",X"08", + X"19",X"CD",X"3A",X"08",X"DD",X"7E",X"03",X"87",X"5F",X"16",X"00",X"FD",X"21",X"4F",X"08",X"FD", + X"19",X"FD",X"6E",X"00",X"FD",X"66",X"01",X"22",X"BB",X"4D",X"DD",X"7E",X"04",X"87",X"5F",X"16", + X"00",X"FD",X"21",X"61",X"08",X"FD",X"19",X"FD",X"6E",X"00",X"FD",X"66",X"01",X"22",X"BD",X"4D", + X"DD",X"7E",X"05",X"87",X"5F",X"16",X"00",X"FD",X"21",X"73",X"08",X"FD",X"19",X"FD",X"6E",X"00", + X"FD",X"66",X"01",X"22",X"95",X"4D",X"CD",X"EA",X"2B",X"C9",X"CA",X"B4",X"A1",X"C3",X"89",X"A2", + X"FF",X"3A",X"EE",X"90",X"A7",X"20",X"0D",X"3E",X"01",X"32",X"EE",X"90",X"3E",X"00",X"32",X"F2", + X"45",X"32",X"D2",X"45",X"CD",X"D2",X"2F",X"C9",X"CD",X"51",X"A1",X"C3",X"36",X"A1",X"A7",X"C0", + X"3E",X"01",X"32",X"ED",X"90",X"21",X"DD",X"DD",X"11",X"DD",X"DD",X"22",X"56",X"4D",X"ED",X"53", + X"58",X"4D",X"C9",X"CD",X"50",X"8E",X"AF",X"32",X"ED",X"90",X"C9",X"3A",X"FB",X"90",X"A7",X"C8", + X"21",X"EC",X"90",X"7E",X"FE",X"30",X"28",X"02",X"34",X"C9",X"AF",X"32",X"EC",X"90",X"32",X"FB", + X"90",X"2A",X"EB",X"4D",X"3E",X"40",X"77",X"21",X"00",X"00",X"22",X"E9",X"4D",X"C9",X"21",X"15", + X"4E",X"35",X"21",X"00",X"00",X"22",X"EB",X"90",X"CD",X"7C",X"0E",X"3A",X"09",X"4E",X"A7",X"C8", + X"AF",X"32",X"E3",X"90",X"C9",X"3A",X"EA",X"90",X"A7",X"3E",X"02",X"20",X"02",X"3E",X"03",X"32", + X"80",X"50",X"C9",X"3A",X"E9",X"90",X"A7",X"C8",X"3A",X"C0",X"4D",X"21",X"20",X"01",X"A7",X"28", + X"03",X"21",X"24",X"01",X"22",X"0A",X"4C",X"C9",X"32",X"02",X"4C",X"3A",X"E9",X"90",X"A7",X"C8", + X"3A",X"E6",X"90",X"A7",X"C0",X"3A",X"0A",X"4C",X"81",X"32",X"0A",X"4C",X"C9",X"3A",X"00",X"4E", + X"FE",X"01",X"28",X"19",X"3A",X"E2",X"90",X"A7",X"28",X"13",X"CD",X"41",X"32",X"C8",X"AF",X"32", + X"E2",X"90",X"32",X"E4",X"90",X"CD",X"49",X"32",X"28",X"03",X"CD",X"53",X"32",X"CD",X"88",X"09", + X"CD",X"F9",X"31",X"AF",X"32",X"E4",X"90",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"79",X"A7",X"20",X"0A",X"3A",X"EA",X"90",X"A7",X"C2",X"19",X"1A",X"C3",X"C5",X"18",X"3A",X"E3", + X"90",X"A7",X"C2",X"19",X"1A",X"C3",X"BF",X"18",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CD",X"86",X"8C",X"3A",X"EA",X"90",X"A7",X"C8",X"21",X"61",X"43",X"22",X"1A",X"4E",X"C9",X"FF", + X"3A",X"EA",X"90",X"A7",X"CA",X"CA",X"8D",X"3A",X"E9",X"90",X"A7",X"20",X"36",X"2A",X"39",X"4D", + X"11",X"27",X"34",X"CD",X"11",X"29",X"2A",X"39",X"4D",X"11",X"27",X"34",X"A7",X"ED",X"52",X"20", + X"09",X"00",X"00",X"00",X"00",X"00",X"CD",X"83",X"81",X"C9",X"2A",X"39",X"4D",X"11",X"22",X"38", + X"CD",X"11",X"29",X"2A",X"39",X"4D",X"11",X"22",X"38",X"A7",X"ED",X"52",X"C0",X"3E",X"01",X"32", + X"E9",X"90",X"C9",X"3A",X"E8",X"90",X"A7",X"20",X"1E",X"2A",X"39",X"4D",X"11",X"22",X"23",X"CD", + X"11",X"29",X"2A",X"39",X"4D",X"11",X"22",X"23",X"A7",X"ED",X"52",X"C0",X"3E",X"01",X"32",X"E8", + X"90",X"C9",X"ED",X"72",X"EC",X"FF",X"FF",X"2A",X"39",X"4D",X"11",X"3A",X"25",X"CD",X"11",X"29", + X"2A",X"39",X"4D",X"11",X"3A",X"25",X"A7",X"ED",X"52",X"20",X"17",X"3E",X"01",X"32",X"E7",X"90", + X"3E",X"11",X"21",X"9B",X"44",X"CD",X"74",X"0F",X"01",X"42",X"A5",X"21",X"9B",X"40",X"CD",X"72", + X"81",X"C9",X"3A",X"E7",X"90",X"A7",X"C8",X"2A",X"39",X"4D",X"11",X"3E",X"23",X"CD",X"11",X"29", + X"2A",X"39",X"4D",X"11",X"3E",X"23",X"A7",X"ED",X"52",X"C0",X"3E",X"17",X"21",X"9B",X"44",X"CD", + X"74",X"0F",X"3E",X"DE",X"21",X"9B",X"40",X"CD",X"74",X"0F",X"01",X"0B",X"00",X"21",X"3E",X"3D", + X"11",X"16",X"4E",X"ED",X"B0",X"21",X"16",X"4E",X"CD",X"60",X"8C",X"3E",X"01",X"32",X"E6",X"90", + X"C9",X"F1",X"00",X"F2",X"02",X"F3",X"0A",X"F4",X"00",X"CD",X"F4",X"00",X"8C",X"F4",X"00",X"8D", + X"F4",X"00",X"8F",X"F4",X"00",X"8D",X"F4",X"00",X"8C",X"F4",X"00",X"8A",X"F4",X"00",X"AD",X"F4", + X"00",X"8D",X"F4",X"00",X"8A",X"F4",X"00",X"AD",X"F4",X"00",X"AD",X"F4",X"00",X"8C",X"F4",X"00", + X"8D",X"F4",X"00",X"8A",X"F4",X"00",X"88",X"F4",X"00",X"85",X"F4",X"00",X"86",X"F4",X"00",X"C8", + X"F4",X"00",X"88",X"F4",X"00",X"86",X"F4",X"00",X"85",X"F4",X"00",X"83",X"F4",X"00",X"85",X"F4", + X"00",X"86",X"F4",X"00",X"88",X"F4",X"00",X"8A",X"F4",X"00",X"C8",X"F4",X"00",X"88",X"F4",X"00", + X"8A",X"F4",X"00",X"8C",X"F4",X"00",X"8A",X"F4",X"00",X"88",X"F4",X"00",X"86",X"F4",X"00",X"85", + X"F4",X"00",X"83",X"F4",X"00",X"85",X"F4",X"00",X"83",X"F4",X"00",X"C1",X"F4",X"00",X"A1",X"30", + X"F4",X"00",X"81",X"F4",X"00",X"83",X"F4",X"00",X"A5",X"F4",X"00",X"A6",X"F4",X"00",X"C3",X"F4", + X"00",X"C8",X"F4",X"00",X"A8",X"F4",X"00",X"88",X"70",X"FF",X"F1",X"01",X"F2",X"03",X"F3",X"06", + X"F4",X"04",X"81",X"70",X"70",X"00",X"F3",X"03",X"F4",X"04",X"41",X"50",X"30",X"F4",X"04",X"41", + X"50",X"30",X"F4",X"04",X"41",X"50",X"30",X"F3",X"06",X"F4",X"04",X"81",X"70",X"70",X"00",X"F3", + X"03",X"F4",X"04",X"41",X"50",X"30",X"F4",X"04",X"41",X"50",X"30",X"F4",X"04",X"41",X"50",X"30", + X"F3",X"06",X"F4",X"04",X"81",X"70",X"70",X"00",X"F3",X"06",X"F4",X"04",X"81",X"70",X"70",X"00", + X"F3",X"06",X"F4",X"04",X"81",X"70",X"70",X"00",X"F0",X"56",X"A6",X"FF",X"3A",X"A5",X"4D",X"A7", + X"28",X"08",X"AF",X"32",X"E5",X"4D",X"32",X"E1",X"90",X"C9",X"3A",X"E5",X"4D",X"A7",X"20",X"19", + X"2A",X"39",X"4D",X"11",X"3A",X"3A",X"CD",X"11",X"29",X"2A",X"39",X"4D",X"11",X"3A",X"3A",X"A7", + X"ED",X"52",X"C0",X"3E",X"01",X"32",X"E5",X"4D",X"C9",X"2A",X"39",X"4D",X"11",X"2C",X"27",X"CD", + X"11",X"29",X"2A",X"39",X"4D",X"11",X"2C",X"27",X"A7",X"ED",X"52",X"20",X"06",X"3E",X"01",X"32", + X"E1",X"90",X"C9",X"3A",X"E1",X"90",X"A7",X"C8",X"3A",X"A9",X"4D",X"A7",X"20",X"0B",X"2A",X"39", + X"4D",X"ED",X"5B",X"0E",X"4D",X"CD",X"11",X"29",X"C9",X"AF",X"32",X"E5",X"4D",X"C9",X"21",X"C2", + X"50",X"06",X"08",X"AF",X"77",X"2C",X"10",X"FC",X"21",X"00",X"40",X"06",X"04",X"32",X"00",X"50", + X"32",X"07",X"50",X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F1",X"06",X"04",X"32",X"00", + X"50",X"AF",X"32",X"07",X"50",X"3E",X"0F",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F0",X"ED",X"56", + X"3E",X"FA",X"00",X"00",X"AF",X"32",X"07",X"50",X"3C",X"32",X"C2",X"50",X"FB",X"76",X"31",X"C0", + X"4F",X"CD",X"70",X"80",X"AF",X"21",X"C2",X"50",X"01",X"08",X"08",X"CF",X"21",X"00",X"4C",X"06", + X"BE",X"CF",X"CF",X"CF",X"CF",X"21",X"40",X"50",X"06",X"40",X"CF",X"32",X"00",X"50",X"CD",X"0D", + X"24",X"32",X"00",X"50",X"06",X"00",X"CD",X"ED",X"23",X"32",X"00",X"50",X"21",X"C0",X"4C",X"22", + X"80",X"4C",X"22",X"82",X"4C",X"3E",X"FF",X"06",X"40",X"CF",X"3E",X"01",X"32",X"C2",X"50",X"FB", + X"2A",X"82",X"4C",X"7E",X"A7",X"FA",X"80",X"A7",X"36",X"FF",X"2C",X"46",X"36",X"FF",X"2C",X"20", + X"02",X"2E",X"C0",X"22",X"82",X"4C",X"21",X"80",X"A7",X"E5",X"E7",X"ED",X"23",X"D7",X"24",X"19", + X"24",X"48",X"24",X"64",X"25",X"8B",X"26",X"0D",X"24",X"98",X"26",X"30",X"27",X"6C",X"27",X"A9", + X"27",X"F1",X"27",X"3B",X"28",X"65",X"28",X"8F",X"28",X"B9",X"28",X"30",X"02",X"A2",X"26",X"C9", + X"24",X"35",X"2A",X"D0",X"26",X"87",X"24",X"E8",X"23",X"E0",X"A4",X"E0",X"2A",X"5A",X"2A",X"6A", + X"2B",X"EA",X"2B",X"5E",X"2C",X"A1",X"2B",X"75",X"26",X"B2",X"26",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/alibaba.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/alibaba.vhd new file mode 100644 index 00000000..eeabd401 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/alibaba.vhd @@ -0,0 +1,506 @@ +-- +-- A simulation model of Alibaba and 40 thieves hardware +-- Copyright (c) Sorgelig - 2017 +-- +-- Based on Pacman core +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 006 Refactoring, 8 sprites support by Sorgelig +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity ALIBABAt is + generic( + eight_sprites : boolean := false + ); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0 : in std_logic_vector(7 downto 0); + in1 : in std_logic_vector(7 downto 0); + dipsw1 : in std_logic_vector(7 downto 0); + dipsw2 : in std_logic_vector(7 downto 0); + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of ALIBABAt is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal mcnt : std_logic_vector(7 downto 0); + signal mcnt2 : std_logic_vector(10 downto 0); + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_wr_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_int_l : std_logic := '1'; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + signal control2_reg : std_logic_vector(7 downto 0); + -- + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal hp : std_logic_vector ( 4 downto 0); + signal vp : std_logic_vector ( 4 downto 0); + signal ram_cs : std_logic; + signal ram_we : std_logic; + signal ram2_cs : std_logic; + signal ram_data : std_logic_vector(7 downto 0); + signal ram2_data : std_logic_vector(7 downto 0); + signal vram_data : std_logic_vector(7 downto 0); + signal sprite_xy_data : std_logic_vector(7 downto 0); + signal vram_addr : std_logic_vector(11 downto 0); + + signal iodec_spr_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_out2_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_sn1_l : std_logic; + signal iodec_sn2_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw1_l : std_logic; + signal iodec_dipsw2_l : std_logic; + signal iodec_myst1_l : std_logic; + signal iodec_myst2_l : std_logic; + + signal old_rd_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + +begin + +-- +-- video timing +-- +p_hvcnt : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + if hcnt = "111111111" then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + if do_hsync then + if vcnt = "111111111" then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; +end process; + +vsync <= not vcnt(8); +do_hsync <= (hcnt = "010101111"); -- 0AF + +p_sync : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + + if (hcnt = "010001111") and not eight_sprites then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") and not eight_sprites then + hblank <= '0'; -- 0EF + elsif (hcnt = "111111111") and eight_sprites then + hblank <= '1'; + elsif (hcnt = "011111111") and eight_sprites then + hblank <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; +end process; + +-- +-- cpu +-- +p_irq_req_watchdog : process + variable rising_vblank : boolean; +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + + if (control2_reg(2) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + --watchdog_reset_l <= not reset; + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + end if; +end process; + +u_cpu : entity work.T80sed +port map +( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => hcnt(0) and ena_6, + WAIT_n => sync_bus_wreq_l, + INT_n => cpu_int_l, + NMI_n => '1', + BUSRQ_n => '1', + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => cpu_wr_l, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out +); + +-- rom 0x0000 - 0x3FFF +-- syncbus 0x4000 - 0x7FFF +sync_bus_cs_l <= '0' when cpu_mreq_l = '0' and cpu_rfsh_l = '1' and cpu_addr(14) = '1' else '1'; +sync_bus_wreq_l <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '1' and cpu_rd_l = '0' else '1'; +sync_bus_stb <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '0' else '1'; +sync_bus_r_w_l <= '0' when sync_bus_stb = '0' and cpu_rd_l = '1' else '1'; + +-- +-- sync bus custom ic +-- +p_sync_bus_reg : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; +end process; + + +-- WRITE +iodec_wdr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 0) = X"5000" else '1'; +iodec_out_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 3) = X"500"&'0' else '1'; +iodec_sn1_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"504" else '1'; +iodec_spr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"505" else '1'; +iodec_sn2_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"506" else '1'; +iodec_out2_l<= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 3) = X"50C"&'0' else '1'; + +-- READ +iodec_in0_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_in1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"01" else '1'; +iodec_dipsw1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"10" else '1'; +iodec_dipsw2_l <= '1'; +iodec_myst1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 0) = X"50C0" else '1'; +iodec_myst2_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 0) = X"50C1" else '1'; + + +p_mcnt : process +begin + wait until rising_edge(clk); + mcnt <= (mcnt + "1") + ("0000000" & (in0(3) xor in0(2) xor in0(1) xor in0(0))); +end process; + +p_mcnt2 : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + old_rd_l <= cpu_rd_l; + if iodec_myst2_l = '0' and old_rd_l = '1' and cpu_rd_l = '0' then + mcnt2 <= mcnt2 + "1"; + end if; + end if; +end process; + +p_control_reg : process +begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + elsif (iodec_out_l = '0') then + control_reg(to_integer(unsigned(cpu_addr(2 downto 0)))) <= cpu_data_out(0); + end if; + end if; +end process; + +p2_control_reg : process +begin + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + + wait until rising_edge(clk); + if (ena_6 = '1') then + if (watchdog_reset_l = '0') then + control2_reg <= (others => '0'); + elsif (iodec_out2_l = '0') then + control2_reg(to_integer(unsigned(cpu_addr(2 downto 0)))) <= cpu_data_out(0); + end if; + end if; +end process; + + +cpu_data_in <= cpu_vec_reg when (cpu_iorq_l = '0') and (cpu_m1_l = '0') else + sync_bus_reg when sync_bus_wreq_l = '0' else + ram_data when ram_cs = '1' else + program_rom_dinl when cpu_addr(15 downto 14) = "00" else -- ROM at 0000 - 3fff + ram2_data when ram2_cs = '1' else -- RAM at 9000 - 9fff + program_rom_dinh when cpu_addr(15 downto 14) = "10" else -- ROM at 8000 - Bfff + "0000" & mcnt(3 downto 0) when iodec_myst1_l = '0' else + "0000000" & mcnt2(10) when iodec_myst2_l = '0' else + in0 when iodec_in0_l = '0' else + in1 when iodec_in1_l = '0' else + dipsw1 when iodec_dipsw1_l = '0' else + dipsw2 when iodec_dipsw2_l = '0' else + X"BF"; + +u_program_rom : entity work.ROM_PGM_0 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl +); + +u_program_rom1 : entity work.ROM_PGM_1 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinh +); + +ram_cs <= '1' when cpu_addr(15 downto 12) = X"4" else '0'; +ram2_cs <= '1' when cpu_addr(15 downto 12) = X"9" else '0'; +ram_we <= '1' when cpu_wr_l = '0' and cpu_mreq_l = '0' and cpu_rfsh_l = '1' else '0'; + +u_rams : work.dpram generic map (12,8) +port map +( + clock_a => clk, + enable_a => ena_6, + wren_a => ram_we and ram_cs, + address_a => cpu_addr(11 downto 0), + data_a => cpu_data_out, -- cpu only source of ram data + q_a => ram_data, + + clock_b => clk, + address_b => vram_addr(11 downto 0), + q_b => vram_data +); + +u_ram2 : work.dpram generic map (10,8) +port map +( + clock_a => clk, + enable_a => ena_6, + wren_a => ram_we and ram2_cs, + address_a => cpu_addr(9 downto 0), + data_a => cpu_data_out, + q_a => ram2_data, + + clock_b => clk, + address_b => cpu_addr(9 downto 0) +); + +-- +-- video subsystem +-- + +-- vram addr custom ic +hp <= hcnt(7 downto 3) when control2_reg(1) = '0' else not hcnt(7 downto 3); +vp <= vcnt(7 downto 3) when control2_reg(1) = '0' else not vcnt(7 downto 3); +vram_addr <= '0' & hcnt(2) & vp & hp when hcnt(8)='1' else + x"EF" & hcnt(6 downto 4) & hcnt(2) when hblank = '1' else + '0' & hcnt(2) & hp(3) & hp(3) & hp(3) & hp(3) & hp(0) & vp; + +sprite_xy_ram : work.dpram generic map (4,8) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not iodec_spr_l, + address_a => cpu_addr(3 downto 0), + data_a => cpu_data_out, + + clock_b => CLK, + address_b => vram_addr(3 downto 0), + q_b => sprite_xy_data +); + +u_video : entity work.PACMAN_VIDEO +port map +( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + vram_data => vram_data, + sprite_xy => sprite_xy_data, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control2_reg(1), + O_HBLANK => O_HBLANK, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk +); + +O_HSYNC <= hSync; +O_VSYNC <= vSync; +O_VBLANK <= vblank; + +-- +-- +-- audio subsystem +-- +u_audio : entity work.PACMAN_AUDIO +port map ( + I_HCNT => hcnt, + -- + I_AB => cpu_addr(3 downto 0), + I_DB => cpu_data_out, + -- + I_WR1_L => iodec_sn2_l, + I_WR0_L => iodec_sn1_l, + I_SOUND_ON => control2_reg(0), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk +); + +end RTL; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_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/Arcade/Pacman Hardware/Alibaba_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/build_id.v new file mode 100644 index 00000000..4238f6e6 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171120" +`define BUILD_TIME "204319" diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/dac.vhd new file mode 100644 index 00000000..47b2185e --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 10 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..fec08f5f --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) := (others => '0'); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_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/Arcade/Pacman Hardware/Alibaba_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/Alibaba_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_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/Arcade/Pacman Hardware/Alibaba_MiST/rtl/osd.v b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_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/Arcade/Pacman Hardware/Alibaba_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..d74e70a3 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector( 3 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB; + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not I_WR1_L, + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => rom3m(1), + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..1552d65b --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/pacman_video.vhd @@ -0,0 +1,279 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 004 Refactoring, 8 sprite support by Sorgelig +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VIDEO is + generic( + alt_transp : boolean := false + ); + port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + vram_data : in std_logic_vector(7 downto 0); + sprite_xy : in std_logic_vector(7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + O_HBLANK : out std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_VIDEO is + + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal sprite_data : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + signal obj_on2 : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_op_t1 : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal sprite_ram_ip : std_logic_vector(5 downto 0); + signal sprite_ram_op : std_logic_vector(5 downto 0); + signal sprite_addr : std_logic_vector(7 downto 0); + signal sprite_addr_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(5 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + +dr <= not sprite_xy when I_HBLANK = '1' else "11111111"; -- pull ups on board + +p_char_regs : process + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; +begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & not I_HBLANK); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + sprite_data <= vram_data; -- character reg + end if; +end process; + +xflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(1); +yflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(0); + +obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + +ca(12) <= char_hblank_reg; +ca(11 downto 6) <= sprite_data(7 downto 2); +ca(5) <= sprite_data(1) when char_hblank_reg = '0' else char_sum_reg(3) xor xflip; +ca(4) <= sprite_data(0) when char_hblank_reg = '0' else I_HCNT(3); +ca(3) <= I_HCNT(2) xor yflip; +ca(2) <= char_sum_reg(2) xor xflip; +ca(1) <= char_sum_reg(1) xor xflip; +ca(0) <= char_sum_reg(0) xor xflip; + +-- char roms +char_rom_5ef : entity work.GFX1 +port map +( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf +); + +p_char_shift : process +begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_buf(7 downto 4); -- load + shift_regl <= char_rom_5ef_buf(3 downto 0); + when others => null; + end case; + end if; +end process; + +shift_sel(0) <= I_HCNT(0) and I_HCNT(1) when vout_yflip = '0' else '1'; +shift_sel(1) <= '1' when vout_yflip = '0' else I_HCNT(0) and I_HCNT(1); +shift_op(0) <= shift_regl(3) when vout_yflip = '0' else shift_regl(0); +shift_op(1) <= shift_regu(3) when vout_yflip = '0' else shift_regu(0); + +p_video_out_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= vram_data(4 downto 0); -- colour reg + end if; + + if I_HCNT(3 downto 0) = "0111" and (vout_hblank='1' or I_HBLANK='1' or vout_obj_on='0') then + sprite_addr <= dr; + else + sprite_addr <= sprite_addr + "1"; + end if; + end if; +end process; + +col_rom_4a : entity work.PROM4_DST +port map +( + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a +); + +u_sprite_ram : work.dpram generic map (8,6) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => vout_obj_on_t1, + address_a => sprite_addr_t1, + data_a => sprite_ram_ip, + + clock_b => CLK, + enable_b => ENA_6, + address_b => sprite_addr, + q_b => sprite_ram_op +); + +sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "000000"; +video_op_sel <= '0' when alt_transp and (sprite_ram_reg(1 downto 0) = "00") else + '0' when not alt_transp and (sprite_ram_reg(5 downto 2) = "0000") else + '1'; + +p_sprite_ram_ip_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + sprite_addr_t1 <= sprite_addr; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + shift_op_t1 <= shift_op; + end if; +end process; + +sprite_ram_ip <= (others => '0') when vout_hblank_t1 = '0' else + sprite_ram_reg when video_op_sel = '1' else + lut_4a_t1(3 downto 0) & shift_op_t1; + +final_col <= (others => '0') when (vout_hblank = '1') or (I_VBLANK = '1') else + sprite_ram_reg(5 downto 2) when video_op_sel = '1' else + lut_4a(3 downto 0); + +-- assign video outputs from color LUT PROM +col_rom_7f : entity work.PROM7_DST +port map +( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE +); + +O_HBLANK <= vout_hblank and vout_hblank_t1; + +end architecture; diff --git a/Arcade/Pacman Hardware/Alibaba_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_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/Arcade/Pacman Hardware/Alibaba_MiST/rtl/pll.v b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/pll.v new file mode 100644 index 00000000..60297687 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 8, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "9" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "9" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Pacman Hardware/Alibaba_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/Alibaba_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/Alibaba_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/Alibaba_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/Arcade/Pacman Hardware/Crush_Roller_MiST/CrushRoller.qpf b/Arcade/Pacman Hardware/Crush_Roller_MiST/CrushRoller.qpf new file mode 100644 index 00000000..6afe5bca --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/CrushRoller.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "CrushRoller" diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/CrushRoller.qsf b/Arcade/Pacman Hardware/Crush_Roller_MiST/CrushRoller.qsf new file mode 100644 index 00000000..3fa9c38c --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/CrushRoller.qsf @@ -0,0 +1,165 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 23:14:41 November 10, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# CrushRoller_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 PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY CrushRoller +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" + +# 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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" + +# 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 ENTITY(MrTNT) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(MrTNT) +# ----------------- +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM3_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GFX1.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/pacman_vram_addr.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/CrushRoller.sv +set_global_assignment -name VERILOG_FILE rtl/build_id.v +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/README.txt b/Arcade/Pacman Hardware/Crush_Roller_MiST/README.txt new file mode 100644 index 00000000..c94994e5 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Crush Roller port to MiST by Gehstock +-- 10 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/Release/CrushRoller.rbf b/Arcade/Pacman Hardware/Crush_Roller_MiST/Release/CrushRoller.rbf new file mode 100644 index 00000000..ca2cea70 Binary files /dev/null and b/Arcade/Pacman Hardware/Crush_Roller_MiST/Release/CrushRoller.rbf differ diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/clean.bat b/Arcade/Pacman Hardware/Crush_Roller_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_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/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/CrushRoller.sv b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/CrushRoller.sv new file mode 100644 index 00000000..9a9d0e7d --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/CrushRoller.sv @@ -0,0 +1,192 @@ +//============================================================================ +// Arcade: CrushRoller +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module CrushRoller +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Cr. Roller;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(reset), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [15:0] audio; +wire hsync,vsync; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid = ce_6m; +wire hs, vs; +wire rde, rhs, rvs; +wire [2:0] r,g,rr,rg; +wire [1:0] b,rb; +wire reset = status[0] | status[6] | buttons[1]; + +video_mixer #(.LINE_LENGTH(292), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(r), + .G(g), + .B(b), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(~reset), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + + +pacman CrushRoller +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + .in0_reg(~{2'b00, m_coin, 1'b0, m_down,m_right,m_left,m_up}), + .in1_reg(~{1'b0, m_start2, m_start1, m_fire, 4'b0000}), + .dipsw_reg(8'b00_0_1_11_01), + + .RESET(reset), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(~reset), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +endmodule diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..d42caf3a --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00",X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00", + X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00",X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00", + X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"31",X"73",X"F7",X"FF",X"FE",X"FE",X"FE",X"FE",X"8E",X"8E",X"8E",X"9E",X"BD",X"BD",X"BD",X"BD", + X"80",X"E8",X"FE",X"FF",X"FA",X"FB",X"FA",X"F3",X"F0",X"FF",X"FF",X"F7",X"FF",X"FF",X"FF",X"FC", + X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"FE",X"FF",X"FF",X"F1",X"F6",X"73",X"F7",X"F7",X"BD",X"BD",X"BD",X"BD",X"9E",X"8E",X"8E",X"8E", + X"F8",X"FF",X"FC",X"FD",X"F4",X"FB",X"FC",X"FD",X"F1",X"FF",X"FF",X"F1",X"FE",X"FF",X"BB",X"BB", + X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F7",X"F7",X"F7",X"73",X"F7",X"FF",X"FD",X"D0",X"0C",X"0C",X"0C",X"0C",X"0C",X"1C",X"3D",X"1C", + X"FC",X"75",X"75",X"75",X"FC",X"C8",X"80",X"00",X"FF",X"FF",X"EE",X"BB",X"BB",X"FF",X"FE",X"E0", + X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"0F",X"0F",X"8F",X"CF",X"CF",X"CF",X"01",X"00", + X"F8",X"FF",X"FC",X"FD",X"F4",X"FB",X"FC",X"FD",X"F1",X"FF",X"FF",X"F1",X"FE",X"FF",X"FF",X"DD", + X"FC",X"76",X"76",X"76",X"FC",X"C8",X"80",X"00",X"FF",X"FF",X"EE",X"FF",X"DD",X"FF",X"FE",X"E0", + X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D",X"0F",X"07",X"03",X"03",X"03",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"10",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"00",X"00",X"00",X"10",X"70",X"B7",X"BF",X"BF",X"00",X"00",X"00",X"00",X"30",X"F0",X"93",X"13", + X"C3",X"C3",X"03",X"0B",X"0F",X"8F",X"8F",X"0F",X"00",X"50",X"F0",X"8F",X"FF",X"FF",X"FF",X"FF", + X"70",X"40",X"E0",X"60",X"C0",X"80",X"00",X"80",X"0C",X"0C",X"0C",X"0C",X"0C",X"1C",X"1C",X"0C", + X"BF",X"BF",X"CF",X"FF",X"7F",X"3F",X"DF",X"FF",X"03",X"01",X"01",X"01",X"00",X"01",X"13",X"13", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"EF",X"1F",X"FF",X"FF",X"FF",X"FF", + X"70",X"10",X"10",X"00",X"00",X"00",X"0F",X"0F",X"0C",X"0C",X"0C",X"0C",X"0C",X"0E",X"0F",X"0F", + X"DF",X"1F",X"1F",X"CF",X"EF",X"EF",X"0F",X"0F",X"13",X"01",X"C0",X"41",X"21",X"01",X"0F",X"0F", + X"8F",X"8F",X"8F",X"8F",X"0B",X"07",X"0F",X"0F",X"F3",X"B3",X"FF",X"FF",X"F7",X"07",X"03",X"0F", + X"00",X"00",X"00",X"10",X"70",X"B7",X"BF",X"BF",X"00",X"00",X"00",X"00",X"30",X"F0",X"93",X"13", + X"C3",X"C3",X"07",X"07",X"0F",X"0F",X"0F",X"0F",X"00",X"50",X"0F",X"FF",X"FF",X"FF",X"FF",X"EF", + X"FF",X"7F",X"3F",X"DF",X"FF",X"DF",X"1F",X"1F",X"01",X"00",X"01",X"13",X"13",X"13",X"01",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"8F",X"8F",X"8F",X"1F",X"FF",X"FF",X"FF",X"FF",X"73",X"33",X"FF", + X"CF",X"EF",X"EF",X"1F",X"00",X"80",X"69",X"3C",X"01",X"01",X"C1",X"40",X"20",X"10",X"0F",X"0F", + X"8F",X"0B",X"03",X"03",X"4B",X"87",X"0F",X"0F",X"FF",X"7F",X"07",X"03",X"00",X"00",X"B4",X"4B", + X"0F",X"0F",X"00",X"10",X"30",X"30",X"30",X"10",X"07",X"0F",X"0E",X"0C",X"0C",X"0C",X"0C",X"0C", + X"0F",X"0F",X"00",X"00",X"C0",X"C0",X"E0",X"E0",X"0F",X"0F",X"00",X"00",X"E0",X"F0",X"F0",X"F0", + X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"08",X"0F",X"0F",X"00",X"00",X"22",X"EE",X"BB",X"FF", + X"0F",X"0F",X"00",X"00",X"00",X"00",X"80",X"80",X"0F",X"0F",X"00",X"E0",X"F0",X"F0",X"70",X"F0", + X"10",X"10",X"10",X"00",X"00",X"40",X"E0",X"F0",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"1C", + X"E0",X"E0",X"C0",X"81",X"83",X"07",X"07",X"06",X"F0",X"F0",X"F0",X"70",X"70",X"70",X"20",X"80", + X"C0",X"E0",X"F0",X"F0",X"F0",X"C0",X"80",X"00",X"F0",X"30",X"1C",X"0E",X"1C",X"38",X"70",X"70", + X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"60",X"64", + X"F0",X"F0",X"F0",X"F0",X"F0",X"70",X"20",X"00",X"1C",X"1C",X"1C",X"1C",X"0C",X"0C",X"0C",X"0C", + X"06",X"04",X"FF",X"FF",X"20",X"70",X"F0",X"F0",X"C0",X"F1",X"F1",X"E0",X"E0",X"C0",X"90",X"30", + X"00",X"80",X"B3",X"F3",X"F1",X"E0",X"F0",X"70",X"70",X"60",X"10",X"FE",X"FE",X"76",X"D4",X"C4", + X"00",X"00",X"88",X"EE",X"77",X"33",X"CC",X"FF",X"66",X"FF",X"BB",X"CC",X"CC",X"77",X"33",X"CC", + X"03",X"03",X"47",X"CF",X"CF",X"8B",X"03",X"47",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"CC", + X"F0",X"F0",X"F0",X"A0",X"00",X"00",X"0F",X"0F",X"30",X"70",X"70",X"70",X"30",X"00",X"0F",X"0F", + X"F0",X"F1",X"F1",X"F0",X"F0",X"E0",X"C3",X"0F",X"80",X"90",X"30",X"30",X"30",X"10",X"0F",X"0F", + X"33",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"CC",X"88",X"00",X"60",X"E0",X"60",X"0F",X"0F", + X"CF",X"CF",X"CF",X"47",X"03",X"07",X"0F",X"0F",X"FF",X"33",X"00",X"00",X"00",X"00",X"0F",X"0F", + X"E0",X"E0",X"C0",X"E6",X"A2",X"11",X"11",X"00",X"F0",X"F0",X"F0",X"70",X"70",X"70",X"20",X"80", + X"C0",X"E0",X"F0",X"70",X"60",X"C0",X"80",X"00",X"F0",X"14",X"0E",X"0F",X"0F",X"0E",X"1C",X"38", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"00",X"00",X"88",X"44",X"22",X"00",X"88",X"44",X"22",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"0F",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"0F",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7", + X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"0F",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"0F", + X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00",X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00", + X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00",X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00", + X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00",X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00", + X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00",X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00", + X"71",X"71",X"71",X"71",X"71",X"71",X"71",X"71",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0B",X"0B",X"07",X"0F",X"0F",X"0F",X"00",X"00",X"01",X"00",X"00",X"01",X"0F",X"0F", + X"00",X"00",X"C0",X"C0",X"30",X"F8",X"F4",X"F3",X"00",X"00",X"3C",X"3C",X"2C",X"E0",X"D0",X"D0", + X"00",X"00",X"00",X"00",X"00",X"88",X"C0",X"E0",X"00",X"00",X"00",X"00",X"E0",X"F0",X"F1",X"FE", + X"F0",X"30",X"00",X"00",X"00",X"0F",X"0F",X"1F",X"10",X"30",X"20",X"20",X"20",X"20",X"21",X"21", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"F0",X"F1",X"0F",X"0F",X"0F",X"03",X"00",X"C0",X"E0",X"FF", + X"F7",X"F6",X"F3",X"B7",X"79",X"F0",X"70",X"10",X"F0",X"F0",X"F0",X"D0",X"D0",X"C0",X"E0",X"F0", + X"E0",X"F0",X"F8",X"F8",X"E0",X"E8",X"C4",X"00",X"FF",X"F3",X"F1",X"FF",X"FF",X"F0",X"F0",X"F0", + X"FF",X"BB",X"BF",X"33",X"33",X"00",X"80",X"C0",X"21",X"21",X"21",X"20",X"20",X"30",X"10",X"00", + X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"EE",X"CC",X"00",X"00",X"03",X"0E", + X"C0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"06",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"F0",X"F0",X"F0",X"F0",X"3C",X"0F",X"0F",X"0F",X"02",X"01",X"09",X"0F",X"07",X"03",X"03",X"03", + X"F0",X"78",X"B4",X"F3",X"FE",X"F6",X"F3",X"B3",X"F0",X"F0",X"F0",X"F0",X"D2",X"D2",X"1E",X"1E", + X"00",X"88",X"C0",X"E0",X"E0",X"F0",X"F8",X"F8",X"E0",X"F0",X"F1",X"FE",X"FF",X"F3",X"F1",X"FF", + X"0F",X"0F",X"0F",X"07",X"07",X"00",X"F0",X"F0",X"03",X"01",X"06",X"0F",X"0F",X"0F",X"F0",X"F0", + X"F9",X"F0",X"70",X"10",X"C0",X"F0",X"F0",X"F0",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"F0",X"F0", + X"E0",X"E8",X"C4",X"00",X"00",X"00",X"F0",X"F0",X"FF",X"F0",X"F0",X"F0",X"00",X"00",X"F0",X"F0", + X"00",X"00",X"C0",X"C0",X"31",X"F0",X"F0",X"F3",X"00",X"00",X"3C",X"3C",X"2C",X"E0",X"D0",X"D0", + X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"00",X"00",X"00",X"00",X"E0",X"F8",X"F0",X"FE", + X"FF",X"F7",X"F3",X"F3",X"F1",X"F0",X"70",X"60",X"F0",X"F1",X"F0",X"D0",X"D0",X"C0",X"E0",X"F0", + X"E0",X"F0",X"FA",X"FC",X"E0",X"E0",X"C0",X"00",X"FB",X"FB",X"F3",X"F7",X"FF",X"F8",X"F4",X"F2", + X"F0",X"F0",X"F0",X"F3",X"FF",X"F7",X"F3",X"F3",X"F0",X"F0",X"F0",X"F0",X"D2",X"D3",X"1E",X"1E", + X"00",X"80",X"C0",X"E0",X"E0",X"F0",X"F2",X"FC",X"E0",X"F8",X"F4",X"FE",X"FB",X"FB",X"F7",X"F7", + X"F1",X"F0",X"70",X"10",X"C0",X"F0",X"F0",X"F0",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"F0",X"F0", + X"E0",X"E0",X"C0",X"00",X"00",X"00",X"F0",X"F0",X"FF",X"F8",X"F4",X"F2",X"00",X"00",X"F0",X"F0", + X"C0",X"00",X"40",X"20",X"10",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"D2",X"D2",X"1E",X"1E",X"1E", + X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"20",X"00",X"00", + X"10",X"20",X"40",X"00",X"C0",X"F0",X"F0",X"F0",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"F0",X"F0", + X"00",X"00",X"80",X"00",X"00",X"00",X"F0",X"F0",X"20",X"10",X"00",X"00",X"00",X"00",X"F0",X"F0", + X"C0",X"00",X"00",X"00",X"00",X"00",X"30",X"40",X"F0",X"F0",X"F0",X"D2",X"D2",X"1E",X"1E",X"1E", + X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"40",X"30",X"00", + X"00",X"00",X"00",X"00",X"C0",X"F0",X"F0",X"F0",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"80",X"80",X"40",X"00",X"00",X"00",X"F0",X"F0", + X"F0",X"30",X"00",X"00",X"0F",X"0F",X"3F",X"FF",X"10",X"30",X"20",X"20",X"21",X"21",X"21",X"31", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"F0",X"E0",X"0F",X"0F",X"0F",X"03",X"10",X"C0",X"EE",X"FF", + X"11",X"11",X"3B",X"33",X"33",X"00",X"80",X"C0",X"21",X"21",X"20",X"20",X"20",X"30",X"10",X"00", + X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"55",X"11",X"33",X"00",X"00",X"00",X"03",X"0E", + X"13",X"11",X"33",X"33",X"33",X"00",X"80",X"C0",X"21",X"21",X"20",X"20",X"20",X"30",X"10",X"00", + X"0F",X"0F",X"00",X"00",X"00",X"30",X"F1",X"F7",X"0F",X"0F",X"0E",X"0C",X"0C",X"0C",X"0C",X"1C", + X"87",X"87",X"00",X"F0",X"F0",X"00",X"00",X"00",X"3C",X"78",X"70",X"30",X"10",X"C0",X"EC",X"FE", + X"0F",X"0F",X"00",X"F0",X"F0",X"70",X"F0",X"FE",X"0F",X"0F",X"00",X"F0",X"F0",X"00",X"30",X"73", + X"0F",X"0F",X"00",X"00",X"00",X"00",X"E0",X"EC",X"0F",X"0F",X"00",X"C0",X"E0",X"F0",X"F6",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3C",X"79",X"3C",X"1C",X"1C",X"1C",X"1C",X"1C", + X"80",X"B0",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FF",X"FF",X"FF",X"F7",X"F7",X"FE",X"F8",X"FE", + X"FE",X"FE",X"FE",X"FE",X"FE",X"FF",X"F8",X"FF",X"F3",X"F3",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EC",X"EC",X"EC",X"E4",X"E4",X"E4",X"E4",X"E0",X"FF",X"FF",X"FF",X"FF",X"F7",X"F0",X"F0",X"FF", + X"FF",X"F7",X"FF",X"FF",X"FF",X"F7",X"73",X"30",X"1C",X"0C",X"1C",X"79",X"78",X"0C",X"0C",X"0C", + X"FB",X"FB",X"F8",X"80",X"80",X"00",X"00",X"00",X"FF",X"F7",X"F7",X"FF",X"FE",X"FC",X"E0",X"80", + X"FF",X"FF",X"FF",X"F0",X"00",X"00",X"00",X"00",X"FF",X"FF",X"F3",X"F0",X"00",X"00",X"00",X"00", + X"E4",X"E4",X"E4",X"E4",X"E0",X"00",X"00",X"00",X"FF",X"FF",X"F0",X"80",X"00",X"00",X"00",X"00", + X"0F",X"78",X"F0",X"80",X"80",X"C0",X"00",X"00",X"0F",X"0F",X"10",X"30",X"30",X"D0",X"EC",X"FE", + X"0F",X"0F",X"00",X"F0",X"70",X"70",X"F0",X"FE",X"0F",X"C3",X"E0",X"30",X"00",X"00",X"30",X"73", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"00",X"70",X"F2",X"FF",X"F7",X"72",X"0F",X"0F",X"0E",X"0C",X"1C",X"3D",X"1C",X"0C", + X"0F",X"0F",X"00",X"E0",X"FE",X"FE",X"F1",X"1E",X"0F",X"0F",X"00",X"70",X"F1",X"FD",X"FE",X"F2", + X"0F",X"87",X"90",X"90",X"90",X"90",X"F0",X"FF",X"0F",X"F0",X"F7",X"F3",X"73",X"73",X"F3",X"FF", + X"0F",X"0F",X"C0",X"C8",X"C8",X"C0",X"80",X"80",X"0F",X"0F",X"F0",X"FF",X"FF",X"F3",X"F3",X"FB", + X"F6",X"F6",X"F6",X"F7",X"F7",X"F6",X"F6",X"F6",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"D2",X"96",X"D2",X"96",X"D2",X"96",X"D2",X"1E",X"7A",X"73",X"F3",X"FF",X"FF",X"F3",X"72",X"7A", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"80",X"00",X"00",X"00",X"E0",X"E8",X"EC",X"FF",X"FE",X"FE",X"FE",X"FE",X"FC",X"FD",X"FF", + X"72",X"F7",X"FF",X"F4",X"E0",X"00",X"00",X"00",X"0C",X"0C",X"3C",X"3C",X"0C",X"0C",X"0C",X"0C", + X"F0",X"FF",X"FE",X"E0",X"80",X"00",X"00",X"00",X"F2",X"FF",X"FD",X"FD",X"F0",X"00",X"00",X"00", + X"FC",X"F0",X"10",X"90",X"80",X"80",X"80",X"00",X"FF",X"F2",X"72",X"72",X"73",X"73",X"70",X"00", + X"EC",X"EC",X"EC",X"E4",X"E4",X"E4",X"E0",X"00",X"F7",X"F6",X"FE",X"F0",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"80",X"80",X"90",X"90",X"F0",X"FF",X"0F",X"0F",X"00",X"F0",X"F3",X"73",X"F3",X"FF", + X"0F",X"E1",X"E4",X"E4",X"E4",X"EC",X"EC",X"EC",X"0F",X"0F",X"00",X"00",X"F0",X"FE",X"FE",X"FF", + X"D0",X"90",X"D0",X"90",X"D0",X"90",X"D0",X"10",X"72",X"72",X"F3",X"FF",X"FF",X"F3",X"72",X"72", + X"EC",X"E8",X"E0",X"00",X"00",X"80",X"80",X"80",X"FF",X"FD",X"FC",X"FE",X"FE",X"FE",X"FF",X"FB", + X"FF",X"F0",X"90",X"90",X"90",X"10",X"10",X"10",X"FF",X"F3",X"73",X"73",X"70",X"00",X"00",X"00", + X"80",X"80",X"C0",X"C8",X"C8",X"C8",X"C0",X"00",X"FB",X"F3",X"F3",X"F3",X"FF",X"FF",X"F0",X"00", + X"FF",X"FF",X"FF",X"F7",X"FB",X"F3",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF", + X"FF",X"DD",X"DD",X"55",X"77",X"77",X"FF",X"FF",X"FF",X"DD",X"DD",X"DD",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"88",X"FF",X"EE",X"FF",X"88",X"FF",X"FF", + X"FF",X"F7",X"7B",X"3D",X"7B",X"7B",X"F7",X"FF",X"FF",X"FF",X"FC",X"CB",X"CB",X"ED",X"FE",X"FF", + X"FF",X"FF",X"FF",X"FB",X"F7",X"7B",X"F3",X"FF",X"FF",X"FF",X"FF",X"FD",X"FB",X"FE",X"EE",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"F4",X"F6",X"F4",X"FF",X"FF",X"FF",X"FF",X"FF",X"F2",X"FB",X"F2", + X"F4",X"FD",X"F4",X"FF",X"FF",X"FF",X"FF",X"FF",X"F2",X"F6",X"F2",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F5",X"F1",X"FF",X"F5",X"F1",X"FF",X"F5",X"F1", + X"F8",X"FA",X"FF",X"F8",X"FA",X"FF",X"F8",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"F7",X"FF",X"FF",X"FF",X"FF",X"FF",X"F1",X"F6",X"F8",X"F8",X"FC",X"FC",X"FF", + X"FF",X"F8",X"F6",X"F1",X"F1",X"F3",X"F3",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"F1",X"F1",X"F7",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"FA",X"FA",X"F9", + X"FF",X"F7",X"F1",X"F1",X"FF",X"FF",X"FF",X"FF",X"F9",X"FA",X"FA",X"FC",X"FE",X"FF",X"FF",X"FF", + X"FF",X"F3",X"F3",X"F1",X"F1",X"F6",X"F8",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"F7",X"FF",X"FF",X"FF",X"FF",X"FC",X"FC",X"F8",X"F8",X"F6",X"F1",X"FF", + X"F9",X"F5",X"F5",X"F3",X"F7",X"FF",X"FF",X"FF",X"FF",X"FE",X"F8",X"F8",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"F7",X"F3",X"F5",X"F5",X"F9",X"FF",X"FF",X"FF",X"FF",X"F8",X"F8",X"FE",X"FF", + X"FF",X"FF",X"FF",X"77",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"DD",X"EE",X"FF",X"FF", + X"FF",X"FF",X"FF",X"33",X"BB",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"CC",X"FF",X"FF",X"FF", + X"F8",X"FA",X"FF",X"F8",X"FA",X"F4",X"F0",X"F2",X"FF",X"FF",X"FF",X"FF",X"FF",X"F2",X"FB",X"F2", + X"FF",X"FF",X"FF",X"FF",X"FF",X"F4",X"F6",X"F4",X"F5",X"F1",X"FF",X"F5",X"F1",X"F2",X"F9",X"F0", + X"F0",X"F9",X"F4",X"F8",X"FA",X"FF",X"F8",X"FA",X"F2",X"F6",X"F2",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F4",X"FD",X"F4",X"FF",X"FF",X"FF",X"FF",X"FF",X"F4",X"F0",X"F2",X"F5",X"F1",X"FF",X"F5",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"CC",X"88",X"88",X"00",X"00",X"00",X"00", + X"FF",X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"FF", + X"00",X"00",X"00",X"00",X"11",X"11",X"33",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"C8",X"EC",X"FE",X"00",X"00",X"C0",X"FC",X"FF",X"FF",X"FF",X"FF", + X"FE",X"EC",X"8C",X"80",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FC",X"C0",X"00",X"00", + X"00",X"70",X"F7",X"FF",X"FF",X"3F",X"37",X"FF",X"00",X"00",X"00",X"10",X"10",X"21",X"21",X"37", + X"FF",X"37",X"3F",X"FF",X"FF",X"F7",X"70",X"00",X"73",X"21",X"21",X"10",X"10",X"00",X"00",X"00", + X"00",X"08",X"0C",X"04",X"04",X"02",X"02",X"02",X"00",X"00",X"01",X"01",X"01",X"02",X"02",X"02", + X"02",X"02",X"02",X"04",X"04",X"0C",X"08",X"00",X"02",X"02",X"02",X"01",X"01",X"01",X"00",X"00", + X"FE",X"E8",X"EC",X"FE",X"FA",X"E4",X"C4",X"C4",X"FF",X"FF",X"FF",X"FF",X"F6",X"73",X"30",X"31", + X"00",X"00",X"00",X"80",X"C8",X"EC",X"EC",X"FE",X"80",X"E8",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3F",X"7F",X"F3",X"30",X"00",X"00",X"00",X"00",X"43",X"21",X"10",X"00",X"00",X"00",X"00",X"00", + X"F0",X"1F",X"3F",X"1F",X"0F",X"3F",X"1F",X"7F",X"10",X"21",X"43",X"87",X"87",X"87",X"87",X"87", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"0F",X"CF",X"EF",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"7F",X"7F",X"3F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"EF",X"EF",X"CF",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",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"79",X"79",X"79",X"79",X"79",X"79",X"79",X"79", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"F7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"2F",X"0F",X"0F",X"0F",X"0F",X"4F",X"0F",X"0F",X"8F",X"0F",X"0F",X"1F",X"8F",X"0F",X"0F",X"2F", + X"BF",X"1F",X"6F",X"0F",X"6F",X"1F",X"1F",X"BF",X"CF",X"BF",X"9F",X"0F",X"6F",X"2F",X"0F",X"CF", + X"FF",X"FF",X"BF",X"FF",X"3F",X"DF",X"7F",X"FF",X"FF",X"AF",X"BF",X"EF",X"EF",X"BF",X"9F",X"FF", + X"FF",X"FF",X"FF",X"7F",X"FF",X"BF",X"FF",X"FF",X"FF",X"BF",X"EF",X"EF",X"FF",X"DF",X"FF",X"FF", + X"F2",X"F1",X"F2",X"F1",X"F2",X"F1",X"F2",X"F1",X"F8",X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0", + X"F2",X"F1",X"F2",X"F1",X"F2",X"F1",X"F2",X"F1",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8", + X"F1",X"F1",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"F4",X"F8",X"F4",X"F8",X"F4",X"F8",X"F4",X"F8", + X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F1",X"F4",X"F8",X"F4",X"F8",X"F4",X"F8",X"F4",X"F8", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FA",X"F5",X"FF",X"F0",X"F0",X"F0",X"F0",X"F0",X"FA",X"F5", + X"FF",X"F0",X"F0",X"F0",X"F0",X"F0",X"FA",X"F5",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FA",X"F5", + X"F5",X"FA",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F5",X"FA",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF", + X"F5",X"FA",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"F5",X"FA",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"30",X"30",X"30",X"30",X"30",X"F0",X"F0",X"FF",X"C0",X"C0",X"C0",X"C0",X"C0",X"F0",X"F0",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"0F", + X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"FF",X"C0",X"C0",X"C0",X"C0",X"C0",X"F0",X"F0",X"FF", + X"30",X"30",X"30",X"30",X"30",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"FF", + X"FF",X"F0",X"F0",X"30",X"30",X"30",X"30",X"30",X"FF",X"F0",X"F0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"0F",X"F0",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"F0",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"FF",X"F0",X"F0",X"30",X"30",X"30",X"30",X"30",X"FF",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00", + X"71",X"71",X"71",X"71",X"71",X"71",X"71",X"71",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"71",X"71",X"71",X"71",X"71",X"71",X"F1",X"F1",X"C0",X"C0",X"C0",X"C0",X"C0",X"E0",X"F0",X"F8", + X"E9",X"E9",X"E9",X"E9",X"E9",X"E9",X"E9",X"E9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F1",X"F1",X"71",X"71",X"71",X"71",X"71",X"71",X"F8",X"F0",X"E0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"71",X"71",X"71",X"71",X"71",X"71",X"F1",X"F1",X"C0",X"C0",X"C0",X"C0",X"C0",X"E0",X"F0",X"F8", + X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"F8",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"68",X"68",X"68",X"68",X"68",X"68",X"68",X"68", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"68",X"68",X"68",X"68",X"68",X"68",X"78",X"78", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"F0",X"E0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"F1",X"F0",X"70",X"30",X"30",X"30",X"30",X"30",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"C0",X"C0",X"C0",X"C0",X"C0",X"E0",X"F0",X"F8", + X"30",X"30",X"30",X"30",X"30",X"70",X"F0",X"F1",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0", + X"F1",X"F0",X"70",X"30",X"30",X"30",X"30",X"30",X"F8",X"F0",X"E0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"30",X"30",X"30",X"30",X"30",X"70",X"F0",X"F1",X"C0",X"C0",X"C0",X"C0",X"C0",X"E0",X"F0",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0", + X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",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"F7",X"F3", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"EE",X"66",X"33",X"DD",X"55",X"DD",X"BB",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"33",X"33",X"66",X"55",X"55",X"55",X"66",X"FF",X"88",X"00",X"55",X"88",X"00",X"88",X"FF", + X"66",X"EE",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88",X"FF",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"77",X"44",X"44",X"77",X"00",X"00",X"00",X"00",X"FF",X"11",X"11",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"44",X"44",X"77",X"00",X"00",X"00",X"00",X"FF",X"99",X"99",X"99",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"77",X"44",X"44",X"77",X"00",X"77",X"44",X"00",X"FF",X"11",X"11",X"FF",X"00",X"FF",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"77",X"00",X"77",X"44",X"00",X"00",X"00",X"11",X"FF",X"00",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"77",X"44",X"44",X"77",X"00",X"77",X"44",X"00",X"FF",X"11",X"11",X"FF",X"00",X"FF",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"77",X"00",X"77",X"44",X"44",X"00",X"00",X"11",X"FF",X"00",X"99",X"99",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"77",X"44",X"44",X"77",X"00",X"77",X"44",X"00",X"FF",X"11",X"11",X"FF",X"00",X"FF",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"77",X"00",X"77",X"00",X"00",X"77",X"00",X"11",X"FF",X"00",X"FF",X"88",X"88",X"88",X"00", + X"F0",X"F0",X"F0",X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FE",X"F9",X"F7",X"F7",X"F3",X"F3",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F7",X"F9",X"FE",X"FE",X"FC",X"FC",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F3",X"F5",X"F5",X"F6", + X"F0",X"F0",X"F0",X"F0",X"FE",X"FE",X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F8",X"FE",X"FE",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F6",X"F5",X"F5",X"F3",X"F1",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"77",X"44",X"44",X"77",X"00",X"77",X"44",X"00",X"FF",X"11",X"11",X"FF",X"00",X"FF",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"77",X"00",X"77",X"44",X"44",X"77",X"00",X"11",X"FF",X"00",X"FF",X"99",X"99",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"44",X"44",X"77",X"00",X"77",X"44",X"44",X"FF",X"11",X"11",X"FF",X"00",X"FF",X"11",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"00",X"44",X"44",X"44",X"77",X"00",X"77",X"FF",X"00",X"FF",X"99",X"99",X"FF",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"44",X"77",X"00",X"77",X"44",X"77",X"00",X"FF",X"11",X"FF",X"00",X"FF",X"11",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"44",X"44",X"00",X"77",X"44",X"44",X"00",X"99",X"99",X"FF",X"00",X"FF",X"99",X"99",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"44",X"77",X"00",X"77",X"44",X"77",X"00",X"FF",X"11",X"FF",X"00",X"FF",X"11",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"00",X"77",X"00",X"44",X"44",X"77",X"00",X"FF",X"44",X"44",X"00",X"FF",X"99",X"FF",X"00", + X"80",X"80",X"80",X"C0",X"C0",X"80",X"00",X"00",X"10",X"10",X"10",X"30",X"30",X"10",X"00",X"00", + X"70",X"43",X"0F",X"2F",X"4F",X"97",X"C3",X"70",X"E0",X"3C",X"0F",X"4F",X"2F",X"9E",X"3C",X"E0", + X"00",X"80",X"80",X"00",X"80",X"80",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"30",X"30", + X"A1",X"E1",X"43",X"43",X"C3",X"C3",X"F0",X"C0",X"48",X"78",X"3C",X"2C",X"3C",X"3C",X"E0",X"00", + X"00",X"00",X"00",X"C0",X"C0",X"E0",X"4C",X"4C",X"00",X"00",X"10",X"F0",X"43",X"C3",X"97",X"87", + X"00",X"00",X"80",X"C0",X"68",X"BC",X"1E",X"5E",X"00",X"00",X"00",X"60",X"60",X"70",X"C3",X"0F", + X"2C",X"2C",X"F0",X"F0",X"30",X"30",X"00",X"00",X"87",X"97",X"C3",X"43",X"F0",X"10",X"00",X"00", + X"5E",X"1E",X"BC",X"68",X"C0",X"80",X"00",X"00",X"0F",X"C3",X"70",X"C0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"01",X"01",X"11", + X"00",X"10",X"11",X"11",X"11",X"11",X"11",X"11",X"00",X"00",X"00",X"10",X"11",X"11",X"11",X"11", + X"00",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"11",X"01",X"01",X"10",X"10",X"00",X"00",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"10",X"00",X"11",X"11",X"11",X"11",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"80",X"88",X"88",X"00",X"00",X"00",X"10",X"10",X"01",X"01",X"11", + X"00",X"10",X"91",X"91",X"91",X"19",X"19",X"99",X"00",X"80",X"80",X"98",X"99",X"99",X"99",X"99", + X"88",X"98",X"98",X"90",X"10",X"00",X"00",X"00",X"11",X"01",X"01",X"10",X"10",X"00",X"00",X"00", + X"99",X"19",X"19",X"99",X"99",X"91",X"10",X"00",X"99",X"99",X"99",X"99",X"98",X"80",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"44",X"77",X"00",X"77",X"44",X"77",X"00",X"FF",X"11",X"FF",X"00",X"FF",X"11",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"44",X"77",X"00",X"77",X"44",X"77",X"00",X"FF",X"11",X"FF",X"00",X"FF",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"77",X"44",X"77",X"00",X"77",X"44",X"77",X"00",X"FF",X"11",X"FF",X"00",X"FF",X"11",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"77",X"44",X"77",X"00",X"00",X"77",X"00",X"00",X"FF",X"11",X"FF",X"00",X"00",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"01",X"01",X"01",X"00",X"10",X"30", + X"02",X"2F",X"EF",X"BB",X"FF",X"5B",X"E1",X"F0",X"00",X"00",X"00",X"08",X"8C",X"CE",X"EF",X"7F", + X"01",X"00",X"00",X"00",X"04",X"04",X"01",X"03",X"70",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"00", + X"E1",X"E1",X"D3",X"93",X"13",X"13",X"01",X"00",X"7F",X"EF",X"CE",X"CE",X"8D",X"8C",X"08",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"04",X"4E",X"EF",X"BB",X"FF",X"5F",X"34",X"70",X"00",X"00",X"00",X"80",X"8C",X"CE",X"6F",X"B7", + X"08",X"00",X"00",X"00",X"04",X"04",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"E1",X"D3",X"93",X"01",X"00",X"B7",X"6F",X"4E",X"CF",X"8C",X"8C",X"08",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"99",X"11",X"11",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"CE",X"89", + X"FF",X"EE",X"CC",X"CC",X"CC",X"44",X"00",X"00",X"FF",X"00",X"00",X"00",X"11",X"77",X"77",X"00", + X"11",X"11",X"99",X"FF",X"FF",X"FF",X"FF",X"FF",X"89",X"CE",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"44",X"44",X"CC",X"CC",X"CC",X"EE",X"FF",X"00",X"77",X"77",X"11",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"31",X"31",X"10",X"00", + X"00",X"00",X"10",X"21",X"EA",X"FB",X"F7",X"F7",X"40",X"E4",X"FE",X"76",X"46",X"EF",X"FE",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"50",X"20", + X"F7",X"F6",X"F4",X"F5",X"F1",X"71",X"30",X"C0",X"F0",X"E4",X"ED",X"EC",X"EF",X"EC",X"E1",X"00", + X"00",X"20",X"10",X"20",X"90",X"D0",X"E0",X"ED",X"00",X"00",X"00",X"10",X"10",X"00",X"10",X"31", + X"00",X"00",X"C0",X"EC",X"FC",X"F3",X"FF",X"77",X"00",X"00",X"00",X"00",X"F0",X"FF",X"FC",X"F9", + X"EC",X"EC",X"E8",X"A0",X"00",X"00",X"00",X"00",X"62",X"F7",X"73",X"30",X"00",X"00",X"00",X"00", + X"77",X"FF",X"EF",X"34",X"00",X"00",X"00",X"00",X"F3",X"F7",X"F0",X"82",X"00",X"00",X"00",X"00", + X"F0",X"70",X"B0",X"B0",X"70",X"F0",X"B0",X"70",X"F0",X"E0",X"D0",X"D0",X"E0",X"F0",X"D0",X"E0", + X"E0",X"72",X"B0",X"B0",X"30",X"B0",X"30",X"B0",X"70",X"E4",X"D0",X"D0",X"C0",X"D0",X"C0",X"D0", + X"F0",X"F0",X"B0",X"70",X"B0",X"F0",X"F0",X"F0",X"F0",X"F0",X"D0",X"E0",X"D0",X"F0",X"F0",X"F0", + X"30",X"70",X"70",X"70",X"90",X"E0",X"70",X"00",X"C0",X"E0",X"E0",X"E0",X"90",X"30",X"70",X"70", + X"F0",X"F0",X"70",X"F0",X"F0",X"70",X"30",X"80",X"F0",X"F0",X"C0",X"B0",X"B0",X"C0",X"F4",X"70", + X"F0",X"F0",X"D0",X"60",X"50",X"00",X"F0",X"F0",X"F0",X"F0",X"D0",X"E0",X"00",X"70",X"F0",X"F0", + X"A0",X"60",X"60",X"C0",X"F0",X"70",X"F0",X"F0",X"70",X"F4",X"C0",X"B0",X"B0",X"C0",X"F0",X"F0", + X"F0",X"F0",X"00",X"50",X"60",X"D0",X"F0",X"F0",X"F0",X"F0",X"70",X"00",X"E0",X"D0",X"F0",X"F0", + X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"FF",X"7F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"80",X"80",X"C0",X"80",X"40",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"30", + X"00",X"10",X"60",X"F0",X"F0",X"F3",X"F7",X"74",X"00",X"C0",X"F0",X"70",X"FC",X"FE",X"FE",X"F6", + X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"20",X"10",X"30",X"10",X"10",X"00",X"00",X"00", + X"F6",X"F7",X"F7",X"F3",X"E0",X"F0",X"30",X"00",X"E2",X"FE",X"FC",X"F0",X"F0",X"60",X"80",X"00", + X"00",X"00",X"00",X"80",X"00",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"30", + X"00",X"10",X"70",X"F0",X"70",X"B3",X"F7",X"96",X"00",X"C0",X"F0",X"F0",X"FC",X"EE",X"96",X"96", + X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"30",X"30",X"30",X"10",X"00",X"00",X"00",X"00", + X"96",X"96",X"F7",X"73",X"F0",X"F0",X"30",X"00",X"96",X"FC",X"DC",X"E0",X"F0",X"E0",X"80",X"00", + X"F0",X"F0",X"F0",X"70",X"70",X"30",X"30",X"30",X"F0",X"F0",X"F0",X"F0",X"E0",X"E0",X"C0",X"C0", + X"F0",X"E0",X"80",X"00",X"00",X"30",X"70",X"70",X"F0",X"30",X"00",X"00",X"C0",X"E0",X"A4",X"68", + X"30",X"30",X"70",X"70",X"F0",X"F0",X"F0",X"F0",X"C0",X"C0",X"C0",X"E0",X"E0",X"F0",X"F0",X"F0", + X"61",X"52",X"70",X"30",X"00",X"00",X"C0",X"F0",X"E0",X"E0",X"C0",X"00",X"00",X"10",X"20",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"B7",X"B7",X"B7",X"B7",X"B7",X"B7",X"B7",X"B7", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"B7",X"B7",X"B7",X"B7",X"B7",X"B7",X"B7",X"B7", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"A0",X"50",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"A0",X"50",X"F0",X"F0",X"F0",X"F0",X"F0",X"00", + X"A0",X"50",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"A0",X"50",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"D0",X"E0",X"D0",X"E0",X"D0",X"E0",X"D0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"70",X"70",X"70",X"F0",X"F0",X"F0",X"F0", + X"D0",X"E0",X"D0",X"E0",X"D0",X"E0",X"D0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"70",X"70",X"70",X"70", + X"00",X"80",X"80",X"80",X"88",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"10", + X"00",X"11",X"73",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"98",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F7",X"33",X"77",X"F7",X"F7",X"F3",X"00",X"00",X"FE",X"FC",X"FE",X"EE",X"EE",X"CC",X"80",X"40", + X"00",X"00",X"00",X"00",X"00",X"88",X"DC",X"EC",X"00",X"00",X"00",X"70",X"71",X"31",X"33",X"77", + X"00",X"00",X"44",X"EE",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"60",X"FB",X"FF",X"FF", + X"CC",X"CC",X"C8",X"C0",X"00",X"00",X"00",X"00",X"77",X"33",X"31",X"11",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FE",X"44",X"00",X"00",X"FF",X"FF",X"BB",X"90",X"80",X"00",X"00",X"00", + X"FF",X"77",X"77",X"33",X"33",X"33",X"77",X"99",X"FF",X"EE",X"EE",X"CC",X"CC",X"CC",X"EE",X"FF", + X"EE",X"88",X"60",X"62",X"00",X"22",X"55",X"00",X"77",X"11",X"66",X"62",X"00",X"AA",X"44",X"00", + X"11",X"33",X"FF",X"77",X"77",X"11",X"11",X"FF",X"FF",X"FF",X"CC",X"99",X"FF",X"88",X"99",X"FF", + X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"33",X"00",X"00",X"00",X"00",X"00",X"22",X"77", + X"FF",X"99",X"99",X"11",X"33",X"77",X"33",X"11",X"FF",X"FF",X"EE",X"88",X"CC",X"B9",X"B8",X"00", + X"FF",X"EE",X"22",X"11",X"00",X"44",X"22",X"44",X"FF",X"77",X"33",X"22",X"88",X"88",X"00",X"00", + X"11",X"33",X"33",X"33",X"BB",X"99",X"99",X"FF",X"00",X"B9",X"B8",X"CC",X"88",X"EE",X"FF",X"FF", + X"22",X"44",X"22",X"00",X"11",X"33",X"FF",X"FF",X"00",X"00",X"88",X"88",X"DD",X"CC",X"EE",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"31",X"71",X"73",X"F3",X"F3",X"70", + X"80",X"C0",X"E8",X"FC",X"FE",X"FC",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"00",X"00",X"80",X"80",X"00",X"00",X"10",X"30",X"71",X"F3",X"F3",X"71",X"30", + X"60",X"F0",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"80",X"C0",X"F8",X"FE",X"FE",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F3",X"72",X"70",X"20",X"00",X"00",X"00",X"00",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"E8",X"E8",X"00",X"00",X"40",X"60",X"00",X"10",X"70",X"31", + X"20",X"E0",X"F3",X"F3",X"F3",X"F7",X"FF",X"FF",X"00",X"80",X"C0",X"E8",X"FC",X"FE",X"FF",X"FF", + X"C0",X"80",X"80",X"C0",X"C0",X"80",X"00",X"00",X"31",X"71",X"70",X"30",X"10",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"F7",X"FF",X"10",X"00",X"00",X"BF",X"3F",X"FF",X"FB",X"F8",X"C0",X"00",X"00", + X"00",X"80",X"E0",X"C0",X"00",X"E0",X"FC",X"FE",X"00",X"00",X"00",X"10",X"C0",X"C4",X"80",X"10", + X"60",X"F0",X"F7",X"FF",X"F7",X"F7",X"F7",X"F7",X"00",X"80",X"D0",X"E8",X"FC",X"FE",X"FF",X"FF", + X"FE",X"7E",X"7E",X"7C",X"EC",X"E0",X"40",X"00",X"30",X"71",X"F3",X"F7",X"F3",X"71",X"30",X"10", + X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"E8",X"C0",X"FF",X"FF",X"EF",X"C7",X"F3",X"F0",X"00",X"00", + X"00",X"00",X"00",X"80",X"C8",X"EC",X"EC",X"EC",X"00",X"00",X"00",X"10",X"31",X"73",X"73",X"73", + X"00",X"10",X"71",X"97",X"BD",X"9F",X"FF",X"FF",X"00",X"80",X"E8",X"9E",X"DB",X"9F",X"FF",X"FF", + X"C8",X"C8",X"80",X"80",X"00",X"00",X"00",X"00",X"31",X"31",X"10",X"10",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"F7",X"73",X"F6",X"E0",X"FF",X"FF",X"FF",X"FF",X"FC",X"C8",X"80",X"00", + X"00",X"00",X"00",X"00",X"80",X"80",X"C8",X"EC",X"00",X"00",X"00",X"10",X"10",X"21",X"21",X"73", + X"00",X"70",X"F7",X"FF",X"FF",X"3F",X"B7",X"FF",X"00",X"00",X"C0",X"FC",X"FF",X"FF",X"FF",X"FF", + X"EC",X"FE",X"FA",X"B0",X"10",X"00",X"00",X"00",X"73",X"21",X"21",X"10",X"10",X"00",X"00",X"00", + X"FF",X"B7",X"3F",X"FF",X"FF",X"F7",X"70",X"00",X"FF",X"FF",X"FF",X"FF",X"FC",X"C0",X"00",X"00", + X"F0",X"F0",X"F0",X"78",X"3C",X"1E",X"1E",X"1E",X"F0",X"F0",X"F0",X"E1",X"C3",X"87",X"87",X"87", + X"F0",X"E1",X"87",X"0F",X"0F",X"2D",X"0F",X"0F",X"F0",X"78",X"1E",X"0F",X"0F",X"B4",X"0F",X"0F", + X"3C",X"3C",X"78",X"78",X"F0",X"F0",X"F0",X"F0",X"C3",X"C3",X"E1",X"E1",X"F0",X"F0",X"F0",X"F0", + X"0F",X"0F",X"0F",X"0F",X"0F",X"C3",X"87",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"3C",X"78",X"F0", + X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"3C",X"1E",X"F0",X"F0",X"F0",X"E1",X"E1",X"C3",X"C3",X"87", + X"F0",X"87",X"0F",X"0F",X"0F",X"0F",X"4B",X"0F",X"F0",X"F0",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F", + X"1E",X"1E",X"5A",X"78",X"F0",X"F0",X"F0",X"F0",X"87",X"C3",X"C3",X"E1",X"E1",X"F0",X"F0",X"F0", + X"0F",X"4B",X"0F",X"0F",X"0F",X"0F",X"87",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"3C",X"F0",X"F0", + X"80",X"48",X"2C",X"1E",X"1E",X"1E",X"E5",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"21",X"43",X"43",X"63",X"F7",X"F7",X"F0",X"0F",X"0F",X"0F",X"0F",X"8F",X"AF",X"EF", + X"FE",X"EC",X"EC",X"C8",X"80",X"00",X"00",X"00",X"10",X"31",X"F3",X"72",X"F1",X"10",X"30",X"10", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FD",X"F9",X"A0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"E8",X"80", + X"00",X"00",X"80",X"48",X"48",X"48",X"EC",X"EC",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"00", + X"30",X"43",X"87",X"0F",X"0F",X"2F",X"F7",X"F7",X"E0",X"1E",X"0F",X"0F",X"0F",X"9F",X"AF",X"FF", + X"FE",X"EC",X"EC",X"C8",X"80",X"C8",X"80",X"40",X"10",X"31",X"73",X"72",X"B1",X"10",X"31",X"10", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FD",X"F9",X"90",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F5",X"50", + X"00",X"00",X"00",X"80",X"C8",X"EC",X"EC",X"FE",X"10",X"21",X"43",X"87",X"87",X"87",X"87",X"87", + X"F0",X"1F",X"3F",X"1F",X"0F",X"3F",X"1F",X"7F",X"80",X"E8",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"F9",X"FD",X"FE",X"FA",X"F5",X"C8",X"C8",X"43",X"21",X"10",X"00",X"00",X"00",X"00",X"00", + X"3F",X"7F",X"F3",X"30",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"F6",X"73",X"30",X"31", + X"00",X"00",X"50",X"E4",X"FE",X"EC",X"FE",X"EC",X"00",X"00",X"10",X"21",X"43",X"87",X"87",X"87", + X"00",X"30",X"F3",X"3F",X"5F",X"3F",X"1F",X"7F",X"80",X"E8",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"E8",X"EC",X"FE",X"FA",X"A0",X"00",X"80",X"87",X"87",X"43",X"21",X"10",X"00",X"00",X"00", + X"3F",X"7F",X"3F",X"3C",X"C0",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"F6",X"73",X"30",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..dd5ebf26 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"01",X"00",X"0F",X"0B",X"03",X"00",X"0F",X"0B",X"0F", + X"00",X"0F",X"0B",X"07",X"00",X"0F",X"0B",X"05",X"00",X"0F",X"0B",X"0C",X"00",X"0F",X"0B",X"09", + X"00",X"05",X"0B",X"07",X"00",X"0B",X"01",X"09",X"00",X"05",X"0B",X"01",X"00",X"02",X"05",X"01", + X"00",X"02",X"0B",X"01",X"00",X"05",X"0B",X"09",X"00",X"0C",X"01",X"07",X"00",X"01",X"0C",X"0F", + X"00",X"0F",X"00",X"0B",X"00",X"0C",X"05",X"0F",X"00",X"0F",X"0B",X"0E",X"00",X"0F",X"0B",X"0D", + X"00",X"01",X"09",X"0F",X"00",X"09",X"0C",X"09",X"00",X"09",X"05",X"0F",X"00",X"05",X"0C",X"0F", + X"00",X"01",X"07",X"0B",X"00",X"0F",X"0B",X"00",X"00",X"0F",X"00",X"0B",X"00",X"0B",X"05",X"09", + X"00",X"0B",X"0C",X"02",X"00",X"0B",X"07",X"09",X"00",X"02",X"0B",X"00",X"00",X"02",X"0B",X"07", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"01",X"00",X"0F",X"0B",X"03",X"00",X"0F",X"0B",X"0F", + X"00",X"0F",X"0B",X"07",X"00",X"0F",X"0B",X"05",X"00",X"0F",X"0B",X"0C",X"00",X"0F",X"0B",X"09", + X"00",X"05",X"0B",X"07",X"00",X"0B",X"01",X"09",X"00",X"05",X"0B",X"01",X"00",X"02",X"05",X"01", + X"00",X"02",X"0B",X"01",X"00",X"05",X"0B",X"09",X"00",X"0C",X"01",X"07",X"00",X"01",X"0C",X"0F", + X"00",X"0F",X"00",X"0B",X"00",X"0C",X"05",X"0F",X"00",X"0F",X"0B",X"0E",X"00",X"0F",X"0B",X"0D", + X"00",X"01",X"09",X"0F",X"00",X"09",X"0C",X"09",X"00",X"09",X"05",X"0F",X"00",X"05",X"0C",X"0F", + X"00",X"01",X"07",X"0B",X"00",X"0F",X"0B",X"00",X"00",X"0F",X"00",X"0B",X"00",X"0B",X"05",X"09", + X"00",X"0B",X"0C",X"0F",X"00",X"0B",X"07",X"09",X"00",X"02",X"0B",X"00",X"00",X"02",X"0B",X"07"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..88b2ecb3 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"66",X"EF",X"00",X"F8",X"EA",X"6F",X"00",X"3F",X"00",X"C9",X"38",X"AA",X"AF",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..75dfdaa1 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"23",X"31",X"B0",X"4F",X"ED",X"56",X"18",X"79",X"A0",X"C3",X"06",X"A0",X"C3",X"09",X"A0",X"C3", + X"0F",X"0F",X"0F",X"0F",X"C9",X"C3",X"12",X"A0",X"E1",X"D1",X"C1",X"00",X"00",X"C7",X"C3",X"1E", + X"A0",X"00",X"00",X"00",X"00",X"32",X"3C",X"00",X"00",X"10",X"48",X"00",X"00",X"00",X"00",X"03", + X"E1",X"22",X"5A",X"4C",X"C9",X"00",X"00",X"18",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5", + X"D9",X"C5",X"D5",X"E5",X"08",X"F5",X"21",X"00",X"50",X"36",X"00",X"32",X"C0",X"50",X"2E",X"07", + X"36",X"01",X"CD",X"D2",X"0B",X"CD",X"DD",X"2B",X"CD",X"D6",X"13",X"CD",X"F7",X"2D",X"CD",X"00", + X"28",X"CD",X"0D",X"32",X"CD",X"50",X"10",X"3E",X"FF",X"32",X"22",X"4C",X"21",X"00",X"50",X"36", + X"01",X"F1",X"08",X"E1",X"D1",X"C1",X"D9",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"FB", + X"C9",X"21",X"07",X"50",X"36",X"00",X"2B",X"7C",X"FE",X"3F",X"32",X"C0",X"50",X"20",X"F5",X"16", + X"00",X"D9",X"21",X"00",X"40",X"36",X"00",X"23",X"7C",X"32",X"C0",X"50",X"FE",X"51",X"20",X"F5", + X"3E",X"00",X"32",X"03",X"50",X"21",X"00",X"40",X"55",X"5D",X"DD",X"21",X"B1",X"00",X"C3",X"10", + X"01",X"21",X"00",X"44",X"DD",X"21",X"BB",X"00",X"C3",X"10",X"01",X"21",X"00",X"4C",X"DD",X"21", + X"C5",X"00",X"C3",X"10",X"01",X"21",X"00",X"40",X"36",X"40",X"23",X"7C",X"FE",X"44",X"20",X"F8", + X"36",X"03",X"23",X"7C",X"FE",X"48",X"20",X"F8",X"7A",X"B3",X"CA",X"6C",X"01",X"01",X"E0",X"FF", + X"21",X"A6",X"42",X"36",X"42",X"09",X"36",X"41",X"09",X"36",X"44",X"09",X"36",X"40",X"09",X"36", + X"52",X"09",X"36",X"41",X"09",X"36",X"4D",X"09",X"36",X"40",X"DD",X"21",X"01",X"01",X"C3",X"4F", + X"01",X"09",X"53",X"DD",X"21",X"0A",X"01",X"C3",X"4F",X"01",X"16",X"FF",X"D9",X"C3",X"6C",X"01", + X"7E",X"B7",X"FD",X"21",X"18",X"01",X"20",X"2E",X"3E",X"01",X"47",X"77",X"AE",X"FD",X"21",X"23", + X"01",X"20",X"23",X"78",X"37",X"8F",X"32",X"C0",X"50",X"30",X"EF",X"23",X"7D",X"06",X"4F",X"32", + X"07",X"50",X"10",X"FB",X"B7",X"20",X"D9",X"7C",X"FE",X"44",X"28",X"08",X"FE",X"48",X"28",X"04", + X"FE",X"50",X"20",X"CC",X"DD",X"E9",X"B3",X"5F",X"7A",X"B7",X"20",X"01",X"54",X"FD",X"E9",X"09", + X"7A",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"FE",X"0A",X"38",X"02",X"C6",X"37",X"77",X"09",X"7A", + X"E6",X"0F",X"FE",X"0A",X"38",X"02",X"C6",X"37",X"77",X"09",X"DD",X"E9",X"21",X"00",X"00",X"11", + X"04",X"01",X"01",X"00",X"10",X"3E",X"FF",X"AE",X"32",X"07",X"50",X"32",X"C0",X"50",X"23",X"0D", + X"20",X"F5",X"10",X"F3",X"B7",X"FD",X"21",X"8B",X"01",X"20",X"5A",X"14",X"1D",X"20",X"E3",X"CB", + X"7A",X"20",X"08",X"D9",X"7A",X"B7",X"20",X"03",X"C3",X"27",X"02",X"21",X"00",X"20",X"10",X"FE", + X"32",X"C0",X"50",X"2D",X"20",X"F8",X"D9",X"21",X"BA",X"42",X"01",X"E0",X"FF",X"36",X"44",X"09", + X"36",X"49",X"09",X"36",X"50",X"09",X"09",X"36",X"53",X"09",X"36",X"57",X"09",X"3A",X"00",X"50", + X"57",X"DD",X"21",X"C8",X"01",X"C3",X"4F",X"01",X"3A",X"40",X"50",X"57",X"DD",X"21",X"D2",X"01", + X"18",X"F3",X"3A",X"80",X"50",X"57",X"DD",X"21",X"DC",X"01",X"18",X"E9",X"D9",X"25",X"20",X"BE", + X"C7",X"25",X"20",X"BA",X"C7",X"08",X"7A",X"87",X"CB",X"FA",X"E6",X"3F",X"D9",X"21",X"A8",X"42", + X"85",X"6F",X"30",X"01",X"24",X"01",X"E0",X"FF",X"36",X"42",X"09",X"36",X"41",X"09",X"36",X"44", + X"09",X"09",X"36",X"50",X"09",X"36",X"52",X"09",X"36",X"4F",X"09",X"36",X"4D",X"09",X"D9",X"7A", + X"D9",X"E6",X"0F",X"57",X"DD",X"21",X"1B",X"02",X"C3",X"4F",X"01",X"08",X"57",X"DD",X"21",X"24", + X"02",X"C3",X"4F",X"01",X"D9",X"FD",X"E9",X"CD",X"D7",X"2D",X"CD",X"03",X"38",X"CD",X"00",X"38", + X"CD",X"66",X"0B",X"21",X"00",X"10",X"06",X"2F",X"7D",X"32",X"C0",X"50",X"32",X"07",X"50",X"10", + X"F7",X"2B",X"7D",X"B4",X"20",X"F0",X"21",X"00",X"40",X"36",X"00",X"23",X"7C",X"FE",X"51",X"20", + X"F8",X"3E",X"03",X"CD",X"5B",X"2E",X"3E",X"40",X"CD",X"65",X"2E",X"3E",X"01",X"32",X"00",X"50", + X"3A",X"80",X"50",X"32",X"00",X"4C",X"CD",X"E7",X"1B",X"CD",X"2A",X"2E",X"3E",X"08",X"32",X"20", + X"4C",X"CD",X"A8",X"1D",X"CD",X"9F",X"1C",X"FB",X"CD",X"D7",X"2D",X"21",X"90",X"4C",X"CD",X"5F", + X"39",X"7E",X"35",X"B7",X"20",X"5C",X"34",X"21",X"20",X"4C",X"3A",X"1E",X"4C",X"B7",X"28",X"0B", + X"7E",X"E6",X"03",X"20",X"06",X"CC",X"54",X"0C",X"C3",X"86",X"03",X"AF",X"32",X"AD",X"4C",X"CB", + X"7E",X"C4",X"9F",X"03",X"21",X"20",X"4C",X"7E",X"CB",X"77",X"E5",X"C4",X"7F",X"04",X"E1",X"CB", + X"6E",X"E5",X"C4",X"24",X"04",X"E1",X"7E",X"E6",X"03",X"20",X"11",X"CB",X"5E",X"28",X"0D",X"3A", + X"AC",X"4C",X"B7",X"00",X"00",X"00",X"CD",X"75",X"05",X"F2",X"89",X"03",X"21",X"87",X"4C",X"7E", + X"35",X"B7",X"20",X"35",X"3A",X"5C",X"4C",X"FE",X"01",X"20",X"04",X"36",X"01",X"18",X"2A",X"34", + X"18",X"29",X"21",X"C4",X"4F",X"47",X"FE",X"FF",X"20",X"02",X"36",X"CC",X"E6",X"9F",X"FE",X"9F", + X"20",X"05",X"7E",X"C6",X"04",X"18",X"0F",X"78",X"E6",X"1F",X"FE",X"1F",X"20",X"7F",X"CB",X"68", + X"3E",X"DC",X"28",X"02",X"3E",X"78",X"77",X"18",X"74",X"18",X"7E",X"CD",X"52",X"1D",X"3A",X"80", + X"50",X"CB",X"6F",X"20",X"06",X"CD",X"4A",X"3B",X"CD",X"17",X"3C",X"CD",X"55",X"2D",X"CD",X"4F", + X"0A",X"CD",X"E1",X"08",X"CD",X"8F",X"08",X"CD",X"B7",X"08",X"CD",X"1B",X"18",X"CD",X"00",X"08", + X"3A",X"06",X"4E",X"FE",X"01",X"D4",X"E0",X"1A",X"CD",X"AA",X"0D",X"CD",X"5B",X"1C",X"CD",X"3F", + X"24",X"CD",X"C6",X"15",X"CD",X"86",X"39",X"CD",X"40",X"26",X"CD",X"B0",X"1B",X"CD",X"27",X"13", + X"CD",X"AA",X"14",X"CD",X"1D",X"0A",X"CD",X"81",X"09",X"CD",X"F1",X"3A",X"CD",X"93",X"2A",X"CD", + X"06",X"38",X"CD",X"7D",X"12",X"CD",X"CC",X"10",X"CD",X"75",X"10",X"CD",X"6A",X"11",X"CD",X"0A", + X"20",X"CD",X"6C",X"23",X"CD",X"B6",X"1C",X"CD",X"C0",X"19",X"CD",X"E4",X"2A",X"CD",X"97",X"2C", + X"CD",X"ED",X"2C",X"CD",X"F6",X"11",X"CD",X"BC",X"23",X"CD",X"FC",X"23",X"CD",X"4C",X"2E",X"AF", + X"32",X"22",X"4C",X"3A",X"22",X"4C",X"B7",X"32",X"C0",X"50",X"C2",X"7B",X"02",X"18",X"F4",X"3E", + X"43",X"CD",X"5B",X"2E",X"AF",X"32",X"A2",X"4C",X"CD",X"2A",X"2E",X"21",X"B0",X"4F",X"06",X"50", + X"CD",X"C5",X"2D",X"21",X"80",X"4E",X"CD",X"C5",X"2D",X"32",X"8E",X"4C",X"CD",X"6F",X"2E",X"CD", + X"00",X"10",X"CD",X"5A",X"2C",X"3E",X"80",X"32",X"CE",X"4F",X"21",X"00",X"4E",X"06",X"40",X"CD", + X"C5",X"2D",X"CD",X"38",X"22",X"3E",X"05",X"32",X"0E",X"4E",X"21",X"20",X"4C",X"7E",X"E6",X"03", + X"CB",X"BE",X"CA",X"1B",X"24",X"CD",X"B1",X"2D",X"CD",X"B9",X"2D",X"3E",X"C0",X"32",X"87",X"4C", + X"21",X"10",X"40",X"06",X"10",X"CD",X"66",X"23",X"CD",X"AC",X"21",X"CD",X"EA",X"39",X"CD",X"38", + X"22",X"3E",X"81",X"32",X"5C",X"4C",X"3E",X"C7",X"32",X"AE",X"4C",X"CD",X"D7",X"2D",X"3A",X"C0", + X"50",X"E6",X"30",X"FE",X"10",X"C9",X"3A",X"80",X"50",X"E6",X"C0",X"C8",X"00",X"00",X"21",X"12", + X"4E",X"36",X"30",X"C9",X"CB",X"AE",X"E5",X"CD",X"C6",X"12",X"21",X"B0",X"4F",X"06",X"50",X"CD", + X"C5",X"2D",X"CD",X"42",X"2F",X"CD",X"6F",X"2E",X"CD",X"00",X"10",X"CD",X"5A",X"2C",X"21",X"03", + X"4E",X"06",X"03",X"CD",X"C5",X"2D",X"34",X"23",X"77",X"23",X"77",X"32",X"10",X"4E",X"32",X"11", + X"4E",X"32",X"1B",X"4E",X"3E",X"C0",X"32",X"87",X"4C",X"CD",X"EA",X"39",X"CD",X"38",X"22",X"CD", + X"9D",X"23",X"CD",X"AC",X"21",X"01",X"3F",X"C0",X"3E",X"80",X"32",X"CE",X"4F",X"E1",X"3A",X"C1", + X"50",X"A1",X"B9",X"C9",X"3A",X"80",X"50",X"A0",X"B8",X"C8",X"00",X"00",X"C3",X"C3",X"2B",X"CB", + X"B6",X"E5",X"4E",X"3E",X"03",X"A1",X"28",X"56",X"EB",X"21",X"B0",X"4F",X"06",X"50",X"CD",X"C5", + X"2D",X"21",X"07",X"4E",X"7E",X"B7",X"28",X"12",X"E6",X"81",X"EA",X"AA",X"04",X"3A",X"12",X"4E", + X"FE",X"20",X"30",X"04",X"36",X"00",X"18",X"02",X"36",X"FF",X"21",X"1C",X"4C",X"CB",X"51",X"20", + X"16",X"35",X"20",X"0D",X"CB",X"81",X"CB",X"49",X"20",X"3C",X"C5",X"CD",X"B1",X"2D",X"C1",X"18", + X"1D",X"CB",X"49",X"20",X"31",X"18",X"62",X"23",X"35",X"20",X"0D",X"CB",X"89",X"CB",X"41",X"20", + X"36",X"C5",X"CD",X"B9",X"2D",X"C1",X"18",X"06",X"CB",X"41",X"20",X"2B",X"18",X"4B",X"CD",X"E0", + X"2D",X"3E",X"00",X"32",X"5C",X"4C",X"CB",X"D9",X"CB",X"91",X"CD",X"D7",X"2D",X"E1",X"71",X"3E", + X"81",X"32",X"AC",X"4C",X"18",X"52",X"E5",X"D5",X"C5",X"CD",X"E5",X"3B",X"CD",X"F1",X"25",X"CD", + X"B1",X"2D",X"CD",X"A9",X"2D",X"18",X"0F",X"E5",X"D5",X"C5",X"CD",X"E5",X"3B",X"CD",X"F1",X"25", + X"CD",X"B9",X"2D",X"CD",X"A1",X"2D",X"C1",X"D1",X"E1",X"3E",X"04",X"A9",X"EB",X"77",X"CD",X"6C", + X"24",X"CD",X"27",X"26",X"CD",X"61",X"3C",X"18",X"02",X"EB",X"71",X"CD",X"5A",X"2C",X"E1",X"3A", + X"00",X"50",X"CB",X"67",X"20",X"05",X"CD",X"D7",X"2D",X"18",X"08",X"CB",X"56",X"CC",X"D7",X"2D", + X"C4",X"DA",X"2D",X"3E",X"81",X"32",X"5C",X"4C",X"3E",X"8F",X"32",X"87",X"4C",X"CD",X"EA",X"39", + X"CD",X"38",X"22",X"CD",X"AC",X"21",X"CD",X"29",X"10",X"3E",X"80",X"32",X"CE",X"4F",X"0E",X"C0", + X"3A",X"C2",X"50",X"E6",X"3F",X"FE",X"2F",X"C9",X"3A",X"81",X"50",X"A1",X"B9",X"C0",X"00",X"00", + X"21",X"03",X"4E",X"35",X"C9",X"CD",X"C5",X"05",X"21",X"87",X"4C",X"36",X"C0",X"21",X"C0",X"4F", + X"7E",X"B7",X"20",X"06",X"CD",X"50",X"0D",X"C3",X"E1",X"05",X"FE",X"01",X"CA",X"05",X"06",X"FE", + X"03",X"CA",X"5D",X"06",X"FE",X"07",X"CA",X"09",X"38",X"FE",X"0F",X"CA",X"51",X"39",X"FE",X"1F", + X"C0",X"3E",X"80",X"32",X"20",X"4C",X"AF",X"32",X"C0",X"4F",X"32",X"A2",X"4C",X"32",X"C1",X"4F", + X"3A",X"C3",X"50",X"E6",X"3F",X"FE",X"3C",X"C9",X"3A",X"85",X"50",X"E6",X"C0",X"FE",X"C0",X"C8", + X"00",X"00",X"C2",X"5D",X"06",X"21",X"A2",X"4C",X"7E",X"FE",X"0A",X"D0",X"3A",X"83",X"4C",X"E6", + X"1F",X"FE",X"10",X"C0",X"7E",X"34",X"FE",X"04",X"CA",X"DF",X"0C",X"FE",X"06",X"CA",X"02",X"0D", + X"C9",X"21",X"C4",X"4F",X"36",X"FA",X"23",X"36",X"01",X"21",X"E4",X"4F",X"36",X"FF",X"23",X"36", + X"CC",X"3E",X"81",X"32",X"CE",X"4F",X"3E",X"01",X"32",X"C0",X"4F",X"3E",X"06",X"32",X"19",X"4E", + X"AF",X"32",X"06",X"4E",X"C9",X"21",X"D4",X"4F",X"36",X"44",X"CD",X"40",X"26",X"CD",X"E4",X"2A", + X"21",X"E4",X"4F",X"7E",X"FE",X"02",X"30",X"06",X"3E",X"03",X"32",X"C0",X"4F",X"C9",X"E6",X"06", + X"C0",X"7E",X"E6",X"FE",X"21",X"47",X"06",X"06",X"0B",X"BE",X"23",X"28",X"04",X"23",X"10",X"F9", + X"C9",X"7E",X"F5",X"21",X"E4",X"4F",X"CD",X"7F",X"2C",X"21",X"00",X"40",X"19",X"F1",X"2B",X"77", + X"7C",X"C6",X"04",X"67",X"36",X"01",X"C9",X"B8",X"43",X"B0",X"52",X"A8",X"55",X"A0",X"53",X"98", + X"48",X"88",X"52",X"80",X"4F",X"78",X"4C",X"70",X"4C",X"68",X"45",X"60",X"52",X"01",X"F8",X"1C", + X"21",X"53",X"40",X"CD",X"9F",X"06",X"0E",X"FF",X"23",X"CD",X"9F",X"06",X"23",X"CD",X"9F",X"06", + X"0E",X"F7",X"23",X"CD",X"9F",X"06",X"21",X"73",X"41",X"01",X"5B",X"0A",X"CD",X"9F",X"06",X"21", + X"76",X"41",X"0E",X"EE",X"CD",X"9F",X"06",X"21",X"54",X"40",X"36",X"D2",X"23",X"36",X"FC",X"21", + X"B4",X"43",X"36",X"FE",X"23",X"36",X"FD",X"3E",X"07",X"32",X"C0",X"4F",X"C3",X"DA",X"2E",X"C5", + X"E5",X"11",X"20",X"00",X"71",X"19",X"10",X"FC",X"E1",X"C1",X"C9",X"CD",X"ED",X"06",X"2A",X"80", + X"4C",X"E5",X"3A",X"82",X"4C",X"F5",X"CD",X"D2",X"06",X"CD",X"C6",X"12",X"F1",X"32",X"82",X"4C", + X"E1",X"22",X"80",X"4C",X"CD",X"4C",X"2E",X"C9",X"3A",X"06",X"4E",X"3C",X"FE",X"09",X"D8",X"3E", + X"09",X"C9",X"CD",X"C8",X"06",X"21",X"80",X"4C",X"36",X"00",X"23",X"77",X"23",X"36",X"00",X"21", + X"01",X"4E",X"86",X"27",X"77",X"D0",X"2B",X"7E",X"C6",X"01",X"27",X"77",X"C9",X"CD",X"E9",X"2D", + X"08",X"CC",X"43",X"53",X"55",X"4E",X"4F",X"42",X"40",X"40",X"40",X"C9",X"00",X"00",X"18",X"96", + X"EB",X"CD",X"E9",X"1A",X"21",X"A8",X"05",X"E3",X"E5",X"EB",X"23",X"0E",X"0A",X"C3",X"C3",X"21", + X"3A",X"2F",X"02",X"B7",X"28",X"0B",X"CD",X"26",X"15",X"38",X"0D",X"CD",X"20",X"19",X"C3",X"DE", + X"04",X"CD",X"1F",X"15",X"38",X"09",X"18",X"14",X"2A",X"3E",X"00",X"7C",X"B5",X"20",X"0D",X"2A", + X"40",X"00",X"7C",X"B5",X"28",X"22",X"CD",X"59",X"18",X"C3",X"FE",X"1B",X"7E",X"23",X"5E",X"16", + X"00",X"23",X"E5",X"21",X"9B",X"22",X"19",X"19",X"5E",X"23",X"56",X"EB",X"E3",X"CB",X"67",X"C8", + X"3A",X"52",X"00",X"B7",X"C8",X"C3",X"21",X"1B",X"06",X"04",X"AF",X"CD",X"61",X"1B",X"10",X"FB", + X"3E",X"4F",X"CD",X"30",X"1B",X"C3",X"1E",X"12",X"CD",X"AE",X"18",X"F5",X"C5",X"CD",X"E5",X"16", + X"38",X"07",X"CD",X"66",X"18",X"38",X"11",X"B6",X"57",X"C1",X"F1",X"38",X"12",X"B2",X"57",X"FE", + X"76",X"CC",X"01",X"1B",X"7A",X"C3",X"61",X"1B",X"B6",X"57",X"F1",X"F1",X"DC",X"01",X"1B",X"B2", + X"57",X"FE",X"76",X"CC",X"01",X"1B",X"78",X"CD",X"61",X"1B",X"7A",X"CD",X"61",X"1B",X"79",X"C3", + X"61",X"1B",X"CD",X"AE",X"18",X"38",X"0D",X"B6",X"CD",X"61",X"1B",X"CD",X"BB",X"16",X"CD",X"0C", + X"19",X"C3",X"61",X"1B",X"B6",X"CD",X"90",X"07",X"18",X"F1",X"CD",X"AE",X"18",X"38",X"04",X"B6", + X"C3",X"61",X"1B",X"B6",X"C3",X"90",X"07",X"CD",X"66",X"18",X"18",X"F1",X"7E",X"C3",X"61",X"1B", + X"7E",X"CD",X"61",X"1B",X"23",X"18",X"F5",X"7E",X"CD",X"61",X"1B",X"CD",X"A4",X"14",X"18",X"CE", + X"CD",X"F7",X"18",X"B6",X"CD",X"61",X"1B",X"CD",X"BB",X"16",X"CD",X"98",X"1E",X"C3",X"FE",X"1B", + X"7E",X"CD",X"61",X"1B",X"CD",X"A4",X"14",X"18",X"F1",X"CD",X"CF",X"18",X"30",X"E5",X"57",X"24", + X"21",X"E4",X"4F",X"7E",X"FE",X"88",X"28",X"09",X"23",X"7E",X"FE",X"60",X"28",X"03",X"FE",X"C0", + X"C0",X"21",X"E8",X"4F",X"CD",X"1A",X"08",X"21",X"EA",X"4F",X"E5",X"CD",X"6B",X"08",X"E1",X"79", + X"B7",X"C8",X"7D",X"D6",X"10",X"6F",X"3A",X"1B",X"4E",X"FE",X"02",X"38",X"24",X"FE",X"04",X"38", + X"0D",X"E5",X"7D",X"C6",X"10",X"6F",X"7E",X"23",X"B6",X"E6",X"07",X"E1",X"28",X"18",X"E5",X"7D", + X"C6",X"10",X"6F",X"7E",X"FE",X"88",X"20",X"02",X"23",X"7E",X"E6",X"0F",X"FE",X"08",X"E1",X"28", + X"05",X"7E",X"CD",X"FE",X"18",X"C8",X"3A",X"11",X"4E",X"B7",X"F5",X"C4",X"FD",X"3A",X"F1",X"CC", + X"73",X"0D",X"7E",X"D7",X"E6",X"0F",X"A1",X"C8",X"23",X"71",X"C9",X"11",X"E4",X"4F",X"0E",X"00", + X"1A",X"BE",X"28",X"10",X"23",X"13",X"1A",X"BE",X"C0",X"2B",X"1B",X"1A",X"96",X"07",X"0E",X"04", + X"D8",X"0E",X"02",X"C9",X"23",X"13",X"1A",X"96",X"07",X"0E",X"08",X"D8",X"0E",X"01",X"C9",X"21", + X"E8",X"4F",X"CD",X"BE",X"1A",X"20",X"1B",X"E5",X"7D",X"D6",X"10",X"6F",X"7E",X"E6",X"F0",X"5F", + X"D7",X"57",X"7E",X"E6",X"0F",X"20",X"0A",X"ED",X"5F",X"CD",X"58",X"10",X"79",X"A2",X"B3",X"23", + X"77",X"E1",X"CD",X"48",X"2D",X"18",X"DB",X"3A",X"20",X"4C",X"E6",X"07",X"C0",X"21",X"D4",X"4F", + X"7E",X"CD",X"FE",X"18",X"C8",X"7E",X"CD",X"CC",X"08",X"23",X"77",X"C9",X"E6",X"06",X"0E",X"06", + X"28",X"02",X"0E",X"09",X"ED",X"5F",X"0F",X"0F",X"06",X"0C",X"38",X"02",X"06",X"03",X"79",X"A0", + X"C9",X"21",X"EC",X"4F",X"CD",X"BE",X"1A",X"C0",X"56",X"23",X"5E",X"21",X"08",X"09",X"01",X"FF", + X"09",X"7E",X"BA",X"23",X"20",X"02",X"7E",X"BB",X"23",X"28",X"05",X"23",X"10",X"F3",X"18",X"01", + X"4E",X"21",X"DC",X"4F",X"7E",X"A1",X"77",X"C9",X"88",X"D8",X"7F",X"58",X"C0",X"DF",X"B8",X"C0", + X"BF",X"68",X"98",X"CF",X"B8",X"98",X"BF",X"88",X"78",X"6F",X"58",X"60",X"CF",X"B8",X"60",X"3F", + X"88",X"38",X"EF",X"21",X"E4",X"4F",X"7E",X"FE",X"88",X"23",X"20",X"0B",X"7E",X"2B",X"FE",X"80", + X"28",X"14",X"FE",X"D0",X"C0",X"18",X"19",X"7E",X"FE",X"60",X"C0",X"2B",X"7E",X"FE",X"60",X"28", + X"19",X"FE",X"B0",X"C0",X"18",X"1E",X"01",X"BD",X"11",X"11",X"88",X"80",X"21",X"F0",X"41",X"C9", + X"01",X"BC",X"18",X"11",X"88",X"D0",X"21",X"E7",X"41",X"C9",X"01",X"BA",X"12",X"11",X"60",X"60", + X"21",X"74",X"41",X"C9",X"01",X"B8",X"14",X"11",X"B0",X"60",X"21",X"94",X"42",X"3A",X"4F",X"50", + X"07",X"C9",X"3A",X"90",X"50",X"E6",X"C0",X"C8",X"87",X"87",X"D8",X"00",X"00",X"21",X"34",X"42", + X"C9",X"3A",X"40",X"50",X"0F",X"38",X"12",X"3A",X"83",X"4C",X"FE",X"4F",X"20",X"0B",X"CD",X"D0", + X"3A",X"28",X"06",X"00",X"00",X"32",X"03",X"4E",X"E5",X"3A",X"11",X"4E",X"B7",X"C8",X"21",X"E6", + X"4F",X"CD",X"3F",X"2C",X"CD",X"BE",X"1A",X"28",X"07",X"3A",X"83",X"4C",X"0F",X"DC",X"3F",X"2C", + X"E5",X"E5",X"E5",X"CD",X"FF",X"09",X"E1",X"11",X"E4",X"4F",X"01",X"02",X"00",X"ED",X"B0",X"3A", + X"D6",X"4F",X"32",X"D4",X"4F",X"E1",X"CD",X"26",X"09",X"28",X"02",X"E1",X"C9",X"78",X"0F",X"F5", + X"DC",X"F2",X"2E",X"F1",X"0F",X"F5",X"DC",X"E2",X"2E",X"F1",X"0F",X"F5",X"DC",X"DA",X"2E",X"F1", + X"0F",X"DC",X"FA",X"2E",X"E1",X"AF",X"77",X"23",X"77",X"32",X"C6",X"4F",X"32",X"D6",X"4F",X"32", + X"11",X"4E",X"E5",X"CD",X"D1",X"31",X"21",X"9D",X"4C",X"36",X"FF",X"23",X"34",X"E1",X"C9",X"3A", + X"83",X"4C",X"21",X"C6",X"4F",X"CB",X"56",X"28",X"0A",X"CB",X"57",X"28",X"03",X"CB",X"8E",X"C9", + X"CB",X"CE",X"C9",X"CB",X"57",X"28",X"03",X"CB",X"86",X"C9",X"CB",X"C6",X"C9",X"CD",X"23",X"09", + X"C0",X"7E",X"CD",X"B2",X"16",X"D0",X"3A",X"D4",X"4F",X"E6",X"0F",X"A0",X"C8",X"78",X"32",X"D6", + X"4F",X"79",X"32",X"11",X"4E",X"32",X"C6",X"4F",X"3E",X"03",X"32",X"C7",X"4F",X"E5",X"CD",X"C9", + X"31",X"E1",X"ED",X"53",X"E6",X"4F",X"78",X"E6",X"06",X"CA",X"2E",X"2F",X"C3",X"28",X"2F",X"21", + X"E4",X"4F",X"CD",X"BE",X"1A",X"20",X"38",X"DD",X"21",X"00",X"40",X"CD",X"7F",X"2C",X"FD",X"21", + X"00",X"44",X"DD",X"19",X"FD",X"19",X"0E",X"00",X"CD",X"94",X"0A",X"CB",X"09",X"CD",X"B4",X"0A", + X"CB",X"09",X"CD",X"D4",X"0A",X"CB",X"09",X"CD",X"F4",X"0A",X"CB",X"09",X"CD",X"40",X"0B",X"E5", + X"7D",X"D6",X"10",X"6F",X"3E",X"0F",X"A6",X"47",X"79",X"D7",X"E6",X"F0",X"B0",X"77",X"E1",X"CD", + X"48",X"2D",X"18",X"BE",X"FD",X"56",X"FE",X"FD",X"5E",X"1E",X"CD",X"27",X"0B",X"DD",X"56",X"FE", + X"DD",X"5E",X"1E",X"CD",X"B5",X"22",X"3E",X"D1",X"CD",X"E6",X"22",X"3E",X"EA",X"CD",X"E6",X"22", + X"CD",X"14",X"0B",X"C9",X"FD",X"56",X"40",X"FD",X"5E",X"3F",X"CD",X"27",X"0B",X"DD",X"56",X"40", + X"DD",X"5E",X"3F",X"CD",X"B5",X"22",X"3E",X"E1",X"CD",X"E6",X"22",X"3E",X"E5",X"CD",X"E6",X"22", + X"CD",X"14",X"0B",X"C9",X"FD",X"56",X"E0",X"FD",X"5E",X"DF",X"CD",X"27",X"0B",X"DD",X"56",X"E0", + X"DD",X"5E",X"DF",X"CD",X"B5",X"22",X"3E",X"E5",X"CD",X"E6",X"22",X"3E",X"E1",X"CD",X"E6",X"22", + X"CD",X"14",X"0B",X"C9",X"FD",X"56",X"01",X"FD",X"5E",X"21",X"CD",X"27",X"0B",X"DD",X"56",X"01", + X"DD",X"5E",X"21",X"CD",X"B5",X"22",X"3E",X"EA",X"CD",X"E6",X"22",X"3E",X"D1",X"CD",X"E6",X"22", + X"CD",X"14",X"0B",X"C9",X"7B",X"FE",X"D8",X"D8",X"FE",X"E0",X"D0",X"7A",X"FE",X"D8",X"D8",X"FE", + X"E0",X"D0",X"CB",X"E1",X"33",X"33",X"C9",X"7B",X"E6",X"1F",X"FE",X"03",X"28",X"05",X"CD",X"47", + X"1D",X"20",X"0A",X"7A",X"E6",X"1F",X"FE",X"03",X"C8",X"CD",X"47",X"1D",X"C8",X"33",X"33",X"C9", + X"06",X"00",X"7E",X"FE",X"88",X"23",X"20",X"0E",X"7E",X"FE",X"10",X"20",X"02",X"CB",X"D8",X"7E", + X"FE",X"00",X"20",X"02",X"CB",X"C0",X"2B",X"7E",X"FE",X"21",X"38",X"04",X"FE",X"F0",X"38",X"02", + X"06",X"06",X"78",X"B1",X"4F",X"C9",X"21",X"F0",X"4F",X"06",X"10",X"36",X"00",X"23",X"10",X"FB", + X"21",X"00",X"40",X"11",X"40",X"F9",X"CD",X"C5",X"0B",X"11",X"F8",X"F2",X"CD",X"C5",X"0B",X"11", + X"F2",X"F9",X"CD",X"C5",X"0B",X"11",X"F8",X"40",X"CD",X"C5",X"0B",X"7C",X"FE",X"43",X"20",X"EF", + X"7D",X"FE",X"80",X"20",X"EA",X"11",X"F2",X"F9",X"CD",X"C5",X"0B",X"11",X"F4",X"FA",X"CD",X"C5", + X"0B",X"11",X"F7",X"F1",X"CD",X"C5",X"0B",X"11",X"F8",X"F2",X"CD",X"C5",X"0B",X"3E",X"F4",X"32", + X"3D",X"40",X"32",X"FD",X"43",X"3E",X"FA",X"32",X"1D",X"40",X"3E",X"F3",X"32",X"DD",X"43",X"3E", + X"0B",X"CD",X"5B",X"2E",X"C9",X"72",X"23",X"73",X"23",X"7D",X"E6",X"1F",X"20",X"F7",X"32",X"C0", + X"50",X"C9",X"CD",X"44",X"0C",X"3A",X"00",X"4C",X"E6",X"03",X"28",X"62",X"3A",X"00",X"50",X"CB", + X"77",X"21",X"19",X"4C",X"CD",X"F7",X"0B",X"3A",X"00",X"50",X"CB",X"6F",X"21",X"1A",X"4C",X"CD", + X"F7",X"0B",X"3A",X"00",X"50",X"CB",X"7F",X"7E",X"28",X"05",X"E6",X"0F",X"C8",X"35",X"C9",X"E6", + X"0F",X"CB",X"D6",X"CB",X"8E",X"C0",X"3A",X"00",X"4C",X"E6",X"03",X"47",X"3A",X"1E",X"4C",X"05", + X"28",X"0B",X"05",X"28",X"2B",X"7E",X"C6",X"80",X"77",X"D0",X"3A",X"1E",X"4C",X"C6",X"01",X"27", + X"30",X"02",X"3E",X"99",X"32",X"1E",X"4C",X"3A",X"40",X"50",X"87",X"C9",X"3A",X"80",X"50",X"E6", + X"C0",X"C8",X"CB",X"77",X"C0",X"00",X"00",X"32",X"19",X"4E",X"32",X"1E",X"4C",X"C9",X"3E",X"97", + X"C6",X"02",X"18",X"DB",X"21",X"83",X"4C",X"7E",X"FE",X"02",X"D0",X"2F",X"32",X"07",X"50",X"0F", + X"D8",X"C3",X"B5",X"3A",X"3A",X"AE",X"4C",X"B7",X"18",X"03",X"C3",X"C4",X"1D",X"3A",X"AD",X"4C", + X"B7",X"20",X"07",X"3C",X"32",X"AD",X"4C",X"C3",X"50",X"0D",X"3A",X"1E",X"4C",X"3D",X"20",X"15", + X"CD",X"80",X"28",X"0D",X"0F",X"41",X"59",X"4C",X"4E",X"4F",X"40",X"52",X"45",X"59",X"41",X"4C", + X"50",X"40",X"01",X"18",X"14",X"CD",X"80",X"28",X"0E",X"0F",X"41",X"53",X"52",X"45",X"59",X"41", + X"4C",X"50",X"40",X"02",X"40",X"52",X"4F",X"40",X"01",X"CD",X"80",X"28",X"11",X"CC",X"40",X"4E", + X"4F",X"54",X"54",X"55",X"42",X"40",X"54",X"52",X"41",X"54",X"53",X"40",X"48",X"53",X"55",X"50", + X"CD",X"DF",X"0C",X"CD",X"02",X"0D",X"CD",X"BF",X"0C",X"3E",X"FF",X"32",X"AD",X"4C",X"C9",X"CD", + X"80",X"28",X"0C",X"47",X"41",X"52",X"45",X"4C",X"4C",X"4F",X"52",X"40",X"48",X"53",X"55",X"52", + X"43",X"21",X"47",X"45",X"11",X"20",X"00",X"06",X"0C",X"36",X"01",X"19",X"10",X"FB",X"C9",X"CD", + X"80",X"28",X"09",X"9A",X"41",X"52",X"45",X"56",X"4F",X"40",X"45",X"4D",X"41",X"47",X"21",X"9A", + X"45",X"01",X"05",X"0F",X"CD",X"9F",X"06",X"21",X"15",X"40",X"06",X"09",X"36",X"40",X"23",X"10", + X"FB",X"C9",X"CD",X"80",X"28",X"18",X"BC",X"40",X"40",X"44",X"54",X"4C",X"40",X"43",X"49",X"52", + X"54",X"43",X"45",X"4C",X"45",X"40",X"4F",X"43",X"53",X"45",X"40",X"4C",X"41",X"52",X"55",X"4B", + X"21",X"BC",X"44",X"01",X"07",X"18",X"CD",X"9F",X"06",X"21",X"E2",X"4F",X"36",X"E8",X"23",X"36", + X"30",X"21",X"C2",X"4F",X"36",X"04",X"23",X"36",X"07",X"CD",X"80",X"28",X"04",X"FB",X"42",X"01", + X"08",X"09",X"01",X"21",X"FB",X"46",X"06",X"04",X"36",X"07",X"CD",X"50",X"21",X"10",X"F9",X"C9", + X"21",X"40",X"40",X"01",X"7F",X"04",X"3E",X"40",X"C5",X"CD",X"D1",X"2D",X"C1",X"3E",X"03",X"21", + X"40",X"44",X"CD",X"D1",X"2D",X"06",X"50",X"21",X"B0",X"4F",X"CD",X"C5",X"2D",X"CD",X"1B",X"24", + X"C3",X"38",X"22",X"3A",X"1B",X"4E",X"FE",X"04",X"D8",X"3A",X"06",X"4E",X"B7",X"C8",X"E5",X"7D", + X"C6",X"11",X"6F",X"7E",X"E1",X"FE",X"60",X"C0",X"3A",X"E5",X"4F",X"FE",X"60",X"C0",X"3A",X"E4", + X"4F",X"FE",X"58",X"28",X"0C",X"FE",X"B8",X"C0",X"3A",X"94",X"42",X"FE",X"DE",X"C0",X"0E",X"04", + X"C9",X"3A",X"74",X"41",X"FE",X"DC",X"C0",X"0E",X"02",X"C9",X"3A",X"1B",X"4E",X"FE",X"05",X"D8", + X"21",X"45",X"0E",X"FE",X"07",X"38",X"0A",X"21",X"6D",X"0E",X"FE",X"09",X"38",X"03",X"21",X"95", + X"0E",X"D9",X"11",X"E4",X"4F",X"21",X"E8",X"4F",X"D9",X"E5",X"CD",X"D3",X"0D",X"E1",X"D9",X"21", + X"EA",X"4F",X"D9",X"01",X"00",X"04",X"E5",X"CD",X"F9",X"0D",X"E1",X"79",X"B7",X"20",X"08",X"3E", + X"0A",X"CD",X"52",X"21",X"10",X"F0",X"C9",X"D9",X"7D",X"D6",X"10",X"6F",X"7E",X"D7",X"E6",X"0F", + X"D9",X"A1",X"D9",X"28",X"02",X"23",X"77",X"D9",X"C9",X"D9",X"1A",X"96",X"30",X"02",X"ED",X"44", + X"FE",X"14",X"D9",X"30",X"0F",X"D9",X"23",X"13",X"1A",X"96",X"30",X"02",X"ED",X"44",X"FE",X"14", + X"2B",X"1B",X"D9",X"D8",X"5E",X"23",X"56",X"23",X"1A",X"BE",X"C0",X"23",X"7E",X"23",X"B7",X"28", + X"06",X"D9",X"BE",X"D9",X"C0",X"18",X"07",X"7E",X"D9",X"23",X"BE",X"2B",X"D9",X"C0",X"23",X"D9", + X"1A",X"D9",X"BE",X"D0",X"23",X"BE",X"D8",X"23",X"D9",X"13",X"1A",X"1B",X"D9",X"BE",X"D0",X"23", + X"BE",X"D8",X"23",X"4E",X"C9",X"94",X"42",X"DE",X"00",X"60",X"B9",X"AF",X"64",X"58",X"04",X"74", + X"41",X"DC",X"00",X"60",X"69",X"5F",X"68",X"5C",X"02",X"10",X"42",X"DB",X"88",X"00",X"8C",X"84", + X"80",X"78",X"01",X"07",X"42",X"D9",X"88",X"00",X"8C",X"84",X"D4",X"D0",X"08",X"94",X"42",X"DE", + X"00",X"60",X"BC",X"AC",X"70",X"58",X"04",X"74",X"41",X"DC",X"00",X"60",X"64",X"57",X"68",X"58", + X"02",X"10",X"42",X"DB",X"88",X"00",X"94",X"7C",X"84",X"74",X"01",X"07",X"42",X"D9",X"88",X"00", + X"94",X"7C",X"DC",X"CC",X"08",X"94",X"42",X"DE",X"00",X"60",X"C9",X"9C",X"77",X"58",X"04",X"74", + X"41",X"DC",X"00",X"60",X"78",X"48",X"68",X"48",X"02",X"10",X"42",X"DB",X"88",X"00",X"A0",X"70", + X"A0",X"70",X"01",X"07",X"42",X"D9",X"88",X"00",X"A0",X"70",X"E8",X"B0",X"08",X"1F",X"00",X"3F", + X"C0",X"2F",X"00",X"2F",X"40",X"0F",X"C0",X"0F",X"40",X"0F",X"00",X"3F",X"C0",X"0F",X"00",X"0F", + X"40",X"1C",X"00",X"3C",X"C0",X"2C",X"00",X"2C",X"40",X"0C",X"C0",X"0C",X"40",X"0C",X"00",X"3C", + X"C0",X"0C",X"00",X"0C",X"40",X"11",X"00",X"31",X"C0",X"21",X"00",X"21",X"40",X"01",X"C0",X"01", + X"40",X"01",X"00",X"31",X"C0",X"01",X"00",X"01",X"40",X"CD",X"B0",X"3E",X"3A",X"00",X"50",X"CB", + X"67",X"28",X"0A",X"21",X"AE",X"4C",X"CB",X"4E",X"20",X"03",X"3A",X"40",X"50",X"E6",X"0F",X"FE", + X"0F",X"28",X"1B",X"0F",X"38",X"05",X"CD",X"4D",X"0F",X"18",X"13",X"0F",X"38",X"05",X"CD",X"99", + X"0F",X"18",X"0B",X"0F",X"38",X"05",X"CD",X"80",X"0F",X"18",X"03",X"CD",X"35",X"0F",X"CD",X"C7", + X"3C",X"CD",X"B2",X"0F",X"C9",X"3A",X"6A",X"4E",X"B7",X"C0",X"CD",X"6B",X"0F",X"B7",X"C8",X"3D", + X"12",X"3C",X"CD",X"52",X"21",X"36",X"40",X"3E",X"10",X"32",X"6A",X"4E",X"C9",X"3A",X"6A",X"4E", + X"B7",X"C0",X"CD",X"6B",X"0F",X"FE",X"02",X"28",X"0D",X"3C",X"12",X"CD",X"52",X"21",X"36",X"41", + X"3E",X"10",X"32",X"6A",X"4E",X"C9",X"3D",X"32",X"AF",X"4C",X"C9",X"11",X"68",X"4E",X"1A",X"D6", + X"05",X"ED",X"44",X"87",X"47",X"87",X"80",X"21",X"40",X"4E",X"CD",X"52",X"21",X"13",X"1A",X"C9", + X"3A",X"6B",X"4E",X"B7",X"C0",X"CD",X"6B",X"0F",X"CD",X"52",X"21",X"7E",X"FE",X"5A",X"20",X"02", + X"36",X"40",X"34",X"3E",X"10",X"32",X"6B",X"4E",X"C9",X"3A",X"6C",X"4E",X"B7",X"C0",X"CD",X"6B", + X"0F",X"CD",X"52",X"21",X"7E",X"FE",X"41",X"20",X"02",X"36",X"5B",X"35",X"3E",X"10",X"32",X"6C", + X"4E",X"C9",X"21",X"6A",X"4E",X"06",X"03",X"7E",X"B7",X"28",X"01",X"35",X"23",X"10",X"F8",X"C9", + X"00",X"57",X"16",X"EB",X"21",X"3D",X"00",X"36",X"00",X"ED",X"53",X"43",X"02",X"ED",X"43",X"41", + X"02",X"C1",X"E1",X"11",X"41",X"02",X"E5",X"C5",X"D5",X"0E",X"04",X"23",X"1A",X"BE",X"20",X"2C", + X"13",X"0D",X"20",X"F7",X"78",X"D1",X"C1",X"D1",X"F6",X"80",X"E1",X"2B",X"2B",X"F5",X"7E",X"FE", + X"27",X"28",X"01",X"23",X"F1",X"77",X"23",X"E5",X"2A",X"27",X"02",X"2B",X"7E",X"E1",X"22",X"65", + X"21",X"6A",X"41",X"11",X"1D",X"00",X"3E",X"3F",X"0E",X"03",X"CD",X"A7",X"28",X"21",X"4A",X"42", + X"0E",X"03",X"CD",X"A7",X"28",X"21",X"CA",X"41",X"06",X"03",X"36",X"3E",X"23",X"10",X"FB",X"21", + X"2A",X"42",X"06",X"03",X"36",X"3D",X"23",X"10",X"FB",X"3E",X"1A",X"C3",X"30",X"10",X"3E",X"19", + X"21",X"6A",X"45",X"11",X"1D",X"00",X"0E",X"04",X"CD",X"A7",X"28",X"21",X"2A",X"46",X"0E",X"04", + X"C3",X"A7",X"28",X"21",X"83",X"4C",X"7E",X"B7",X"CA",X"29",X"10",X"FE",X"80",X"28",X"DF",X"C9", + X"21",X"83",X"4C",X"34",X"C0",X"23",X"34",X"C9",X"E6",X"03",X"3C",X"47",X"0E",X"11",X"CB",X"09", + X"10",X"FC",X"7E",X"B1",X"E6",X"0F",X"20",X"03",X"CB",X"01",X"C9",X"7E",X"B1",X"E6",X"0F",X"FE", + X"09",X"C0",X"CB",X"01",X"C9",X"3A",X"83",X"4C",X"E6",X"0F",X"28",X"10",X"FE",X"03",X"C0",X"CD", + X"D0",X"3A",X"C8",X"00",X"00",X"32",X"06",X"4E",X"32",X"20",X"4C",X"21",X"21",X"10",X"4E",X"11", + X"08",X"4E",X"7E",X"B7",X"28",X"03",X"35",X"28",X"0D",X"EB",X"7E",X"B7",X"C8",X"35",X"C0",X"3A", + X"06",X"4E",X"FE",X"03",X"D0",X"EB",X"AF",X"12",X"77",X"67",X"6F",X"22",X"EC",X"4F",X"22",X"CC", + X"4F",X"3D",X"32",X"07",X"4E",X"CD",X"E0",X"31",X"3A",X"84",X"50",X"E6",X"C0",X"C9",X"3A",X"C6", + X"50",X"E6",X"30",X"FE",X"30",X"C0",X"00",X"00",X"CD",X"6F",X"2E",X"35",X"21",X"03",X"4E",X"7E", + X"FE",X"01",X"D8",X"21",X"07",X"4E",X"CB",X"46",X"C0",X"36",X"01",X"23",X"3E",X"FF",X"77",X"32", + X"10",X"4E",X"CD",X"00",X"20",X"21",X"CC",X"4F",X"11",X"EC",X"4F",X"B7",X"28",X"0E",X"3D",X"28", + X"17",X"3D",X"28",X"20",X"3D",X"28",X"3C",X"3D",X"28",X"45",X"18",X"4F",X"36",X"C0",X"23",X"36", + X"07",X"EB",X"36",X"B8",X"23",X"36",X"50",X"C9",X"36",X"80",X"23",X"36",X"07",X"EB",X"36",X"48", + X"23",X"36",X"48",X"C9",X"36",X"60",X"23",X"36",X"09",X"EB",X"36",X"C8",X"23",X"36",X"D8",X"3A", + X"87",X"50",X"E6",X"C0",X"FE",X"C0",X"C9",X"3A",X"C9",X"50",X"E6",X"30",X"C8",X"FE",X"30",X"C8", + X"00",X"00",X"E1",X"36",X"A0",X"23",X"36",X"07",X"EB",X"36",X"38",X"23",X"36",X"78",X"C9",X"36", + X"40",X"23",X"36",X"16",X"EB",X"36",X"D8",X"23",X"36",X"28",X"C9",X"36",X"20",X"23",X"36",X"10", + X"EB",X"36",X"48",X"23",X"36",X"A8",X"3A",X"8F",X"50",X"E6",X"C0",X"FE",X"40",X"C9",X"3A",X"C0", + X"50",X"E6",X"30",X"C8",X"FE",X"20",X"C8",X"00",X"00",X"E5",X"3A",X"07",X"4E",X"E6",X"81",X"E8", + X"CD",X"E3",X"11",X"21",X"E4",X"4F",X"11",X"EC",X"4F",X"CD",X"A2",X"2B",X"FE",X"04",X"D0",X"79", + X"FE",X"04",X"D0",X"CD",X"00",X"20",X"01",X"09",X"CC",X"B7",X"28",X"1B",X"01",X"14",X"88",X"3D", + X"28",X"15",X"01",X"09",X"68",X"3D",X"28",X"0F",X"01",X"07",X"A8",X"3D",X"28",X"09",X"01",X"09", + X"CC",X"3D",X"28",X"03",X"01",X"19",X"24",X"21",X"CC",X"4F",X"70",X"23",X"71",X"21",X"07",X"4E", + X"CB",X"FE",X"3E",X"1F",X"23",X"77",X"32",X"10",X"4E",X"21",X"00",X"01",X"11",X"02",X"4E",X"CD", + X"29",X"3A",X"CD",X"39",X"3A",X"CD",X"F4",X"31",X"2A",X"C4",X"4F",X"E5",X"21",X"54",X"01",X"22", + X"C4",X"4F",X"3A",X"83",X"4C",X"C6",X"60",X"47",X"3A",X"83",X"4C",X"B8",X"20",X"FA",X"E1",X"22", + X"C4",X"4F",X"C9",X"3A",X"47",X"50",X"07",X"C9",X"3A",X"8E",X"50",X"E6",X"C0",X"C8",X"87",X"87", + X"D8",X"00",X"00",X"C2",X"00",X"4E",X"3A",X"83",X"4C",X"E6",X"0F",X"C0",X"3A",X"07",X"4E",X"E6", + X"03",X"E2",X"08",X"12",X"3E",X"FF",X"18",X"03",X"CD",X"00",X"20",X"21",X"83",X"4C",X"CB",X"66", + X"28",X"3D",X"E6",X"87",X"F5",X"F5",X"CC",X"E5",X"28",X"F1",X"C4",X"B8",X"28",X"F1",X"3D",X"F5", + X"F5",X"CC",X"34",X"29",X"F1",X"C4",X"10",X"29",X"F1",X"3D",X"F5",X"F5",X"CC",X"A8",X"29",X"F1", + X"C4",X"62",X"29",X"F1",X"3D",X"F5",X"F5",X"CC",X"04",X"2A",X"F1",X"C4",X"B6",X"29",X"F1",X"3D", + X"F5",X"F5",X"CC",X"66",X"2A",X"F1",X"C4",X"46",X"2A",X"F1",X"3D",X"C2",X"EC",X"22",X"C9",X"E6", + X"87",X"F5",X"C4",X"DB",X"28",X"F1",X"3D",X"F5",X"C4",X"27",X"29",X"F1",X"3D",X"F5",X"C4",X"9F", + X"29",X"F1",X"3D",X"F5",X"F5",X"CC",X"2A",X"2A",X"F1",X"C4",X"ED",X"29",X"F1",X"3D",X"F5",X"F5", + X"CC",X"7D",X"2A",X"F1",X"C4",X"5D",X"2A",X"F1",X"3D",X"C2",X"EC",X"22",X"C9",X"3A",X"81",X"4C", + X"FE",X"15",X"38",X"23",X"3A",X"83",X"4C",X"E6",X"3F",X"FE",X"13",X"20",X"1A",X"3A",X"D0",X"4C", + X"21",X"DE",X"4C",X"BE",X"20",X"0D",X"23",X"34",X"C0",X"00",X"00",X"32",X"20",X"4C",X"3E",X"01", + X"32",X"01",X"4C",X"77",X"23",X"36",X"00",X"21",X"03",X"4E",X"7E",X"FE",X"01",X"C0",X"23",X"7E", + X"FE",X"34",X"D8",X"23",X"7E",X"FE",X"02",X"D8",X"3A",X"12",X"4E",X"B7",X"C0",X"CD",X"D7",X"3B", + X"21",X"20",X"4C",X"CB",X"EE",X"C9",X"06",X"25",X"3E",X"82",X"32",X"5C",X"4C",X"C5",X"21",X"40", + X"40",X"CD",X"DE",X"12",X"C1",X"10",X"F6",X"AF",X"3E",X"81",X"32",X"5C",X"4C",X"C9",X"E5",X"C5", + X"ED",X"5F",X"CD",X"1F",X"13",X"8D",X"A0",X"20",X"21",X"7E",X"FE",X"FF",X"20",X"04",X"36",X"D7", + X"18",X"13",X"FE",X"D4",X"20",X"09",X"E5",X"7C",X"C6",X"04",X"67",X"CD",X"40",X"1D",X"E1",X"CD", + X"1F",X"13",X"20",X"06",X"35",X"3E",X"70",X"3D",X"20",X"FD",X"C1",X"7D",X"C6",X"20",X"6F",X"30", + X"01",X"24",X"7C",X"FE",X"44",X"20",X"C8",X"E1",X"23",X"7D",X"FE",X"60",X"C8",X"18",X"BF",X"D6", + X"D5",X"C8",X"3D",X"C8",X"3D",X"C8",X"C9",X"21",X"E4",X"4F",X"7E",X"E6",X"FE",X"57",X"23",X"7E", + X"E6",X"FE",X"5F",X"2B",X"E5",X"CD",X"49",X"13",X"E1",X"78",X"B7",X"28",X"07",X"E5",X"7D",X"D6", + X"30",X"6F",X"71",X"E1",X"CD",X"48",X"2D",X"18",X"E1",X"21",X"5F",X"13",X"06",X"14",X"7A",X"BE", + X"23",X"20",X"07",X"7B",X"BE",X"23",X"20",X"03",X"4E",X"C9",X"23",X"23",X"10",X"F0",X"C9",X"70", + X"98",X"00",X"70",X"C0",X"00",X"9C",X"98",X"00",X"9C",X"C0",X"00",X"88",X"4A",X"00",X"88",X"76", + X"00",X"88",X"D8",X"00",X"88",X"7A",X"00",X"5A",X"60",X"00",X"B8",X"60",X"00",X"72",X"98",X"86", + X"72",X"C0",X"86",X"9A",X"98",X"86",X"9A",X"C0",X"86",X"88",X"4C",X"89",X"88",X"74",X"89",X"88", + X"D6",X"09",X"88",X"7C",X"09",X"5C",X"60",X"06",X"B6",X"60",X"06",X"DD",X"E5",X"E3",X"CD",X"AE", + X"13",X"E3",X"DD",X"E1",X"C0",X"3A",X"B4",X"4F",X"87",X"D0",X"C8",X"33",X"33",X"C9",X"7C",X"FE", + X"41",X"28",X"13",X"FE",X"42",X"C0",X"7D",X"D6",X"08",X"C8",X"3D",X"C8",X"D6",X"04",X"C8",X"3D", + X"C8",X"D6",X"06",X"C8",X"3D",X"C9",X"7D",X"D6",X"E0",X"18",X"EC",X"4F",X"7D",X"D6",X"20",X"6F", + X"7E",X"A6",X"79",X"C8",X"A6",X"C9",X"11",X"F2",X"4F",X"D9",X"11",X"62",X"50",X"06",X"02",X"CD", + X"34",X"14",X"C4",X"5D",X"14",X"CD",X"3C",X"14",X"C4",X"5D",X"14",X"CD",X"44",X"14",X"C4",X"5D", + X"14",X"21",X"E6",X"4F",X"CD",X"5D",X"14",X"CD",X"4C",X"14",X"CC",X"5D",X"14",X"21",X"E2",X"4F", + X"CD",X"5D",X"14",X"CD",X"34",X"14",X"CC",X"5D",X"14",X"CD",X"3C",X"14",X"CC",X"5D",X"14",X"CD", + X"44",X"14",X"CC",X"5D",X"14",X"CD",X"4C",X"14",X"C4",X"5D",X"14",X"3A",X"83",X"4C",X"47",X"E6", + X"FC",X"FE",X"04",X"C0",X"78",X"2F",X"32",X"07",X"50",X"0F",X"D8",X"C3",X"B5",X"3A",X"B7",X"C8", + X"2F",X"CB",X"7F",X"C9",X"3A",X"B4",X"4F",X"21",X"E4",X"4F",X"18",X"F2",X"3A",X"B8",X"4F",X"21", + X"E8",X"4F",X"18",X"EA",X"3A",X"BA",X"4F",X"21",X"EA",X"4F",X"18",X"E2",X"21",X"EC",X"4F",X"3A", + X"CC",X"4F",X"E6",X"FC",X"FE",X"AC",X"C8",X"FE",X"B0",X"C8",X"FE",X"B4",X"C9",X"E5",X"3A",X"20", + X"4C",X"4F",X"3A",X"00",X"50",X"CB",X"67",X"20",X"02",X"CB",X"91",X"05",X"7E",X"23",X"CD",X"90", + X"14",X"12",X"13",X"7E",X"CD",X"A3",X"14",X"12",X"13",X"E1",X"7D",X"D6",X"20",X"6F",X"7E",X"CB", + X"51",X"28",X"02",X"EE",X"03",X"D9",X"12",X"13",X"D9",X"23",X"7E",X"D9",X"12",X"13",X"D9",X"C9", + X"CB",X"51",X"20",X"07",X"CB",X"78",X"20",X"01",X"3D",X"3D",X"C9",X"2F",X"C6",X"10",X"CB",X"78", + X"C0",X"3D",X"C9",X"CB",X"51",X"C8",X"2F",X"C6",X"11",X"C9",X"3A",X"B4",X"4F",X"07",X"30",X"09", + X"21",X"E4",X"4F",X"CD",X"45",X"15",X"CD",X"14",X"15",X"3A",X"B8",X"4F",X"07",X"30",X"14",X"21", + X"E8",X"4F",X"CD",X"45",X"15",X"3A",X"B4",X"4F",X"07",X"30",X"05",X"CD",X"21",X"15",X"18",X"03", + X"CD",X"14",X"15",X"3A",X"BA",X"4F",X"07",X"D0",X"3A",X"B4",X"4F",X"07",X"30",X"0E",X"3A",X"B8", + X"4F",X"07",X"38",X"1C",X"21",X"EA",X"4F",X"CD",X"45",X"15",X"18",X"35",X"3A",X"11",X"4E",X"B7", + X"3A",X"B8",X"4F",X"28",X"13",X"07",X"38",X"08",X"21",X"EA",X"4F",X"CD",X"45",X"15",X"18",X"14", + X"21",X"EA",X"4F",X"CD",X"45",X"15",X"18",X"2F",X"21",X"EA",X"4F",X"CD",X"45",X"15",X"3A",X"B8", + X"4F",X"07",X"38",X"0D",X"ED",X"43",X"C2",X"4F",X"ED",X"53",X"E2",X"4F",X"01",X"00",X"00",X"50", + X"58",X"3A",X"C6",X"4F",X"E6",X"F8",X"FE",X"B8",X"28",X"08",X"ED",X"43",X"C6",X"4F",X"ED",X"53", + X"E6",X"4F",X"01",X"00",X"00",X"50",X"58",X"3A",X"10",X"4E",X"B7",X"C0",X"ED",X"43",X"CC",X"4F", + X"ED",X"53",X"EC",X"4F",X"C9",X"11",X"00",X"00",X"42",X"4A",X"7E",X"FE",X"88",X"23",X"7E",X"20", + X"12",X"FE",X"78",X"30",X"0E",X"FE",X"4A",X"38",X"0A",X"CD",X"7E",X"15",X"1E",X"88",X"3A",X"F5", + X"45",X"47",X"C9",X"FE",X"98",X"20",X"0A",X"CD",X"9F",X"15",X"3A",X"EE",X"45",X"16",X"98",X"18", + X"F0",X"FE",X"C0",X"C0",X"CD",X"9F",X"15",X"3A",X"E9",X"45",X"16",X"C0",X"18",X"E3",X"FE",X"72", + X"30",X"41",X"FE",X"4E",X"38",X"3D",X"0E",X"B4",X"16",X"62",X"BA",X"D0",X"0E",X"94",X"15",X"BA", + X"D0",X"0E",X"AC",X"15",X"BA",X"D0",X"0E",X"95",X"15",X"BA",X"D0",X"0E",X"B5",X"15",X"C9",X"2B", + X"7E",X"FE",X"9A",X"30",X"1E",X"FE",X"76",X"38",X"1A",X"0E",X"B2",X"1E",X"8A",X"00",X"BB",X"D0", + X"0E",X"92",X"1D",X"BB",X"D0",X"0E",X"AC",X"1D",X"BB",X"D0",X"0E",X"90",X"1D",X"BB",X"D0",X"0E", + X"B0",X"1D",X"C9",X"33",X"33",X"C9",X"3A",X"01",X"4E",X"FE",X"10",X"3A",X"83",X"4C",X"E6",X"0F", + X"FE",X"03",X"20",X"0A",X"CD",X"D0",X"3A",X"28",X"05",X"00",X"00",X"32",X"20",X"4C",X"21",X"E4", + X"4F",X"7E",X"23",X"B6",X"E6",X"07",X"C0",X"2B",X"CD",X"7F",X"2C",X"7A",X"B7",X"28",X"06",X"FE", + X"03",X"28",X"08",X"18",X"0A",X"7B",X"FE",X"40",X"D8",X"18",X"04",X"7B",X"FE",X"A0",X"D0",X"DD", + X"21",X"00",X"40",X"DD",X"19",X"FD",X"21",X"00",X"44",X"FD",X"19",X"21",X"00",X"00",X"DD",X"56", + X"E0",X"DD",X"5E",X"01",X"FD",X"46",X"E0",X"FD",X"4E",X"01",X"CD",X"88",X"16",X"DD",X"2B",X"FD", + X"2B",X"DD",X"E5",X"E3",X"7D",X"FE",X"DF",X"20",X"0F",X"7C",X"FE",X"41",X"20",X"0A",X"11",X"20", + X"00",X"19",X"FD",X"19",X"E3",X"CB",X"FD",X"E3",X"E3",X"DD",X"E1",X"DD",X"56",X"E0",X"DD",X"5E", + X"FF",X"FD",X"46",X"E0",X"FD",X"4E",X"FF",X"CD",X"88",X"16",X"11",X"20",X"00",X"DD",X"19",X"FD", + X"19",X"DD",X"56",X"FF",X"DD",X"5E",X"20",X"FD",X"46",X"FF",X"FD",X"4E",X"20",X"CD",X"88",X"16", + X"DD",X"23",X"FD",X"23",X"CB",X"7D",X"28",X"09",X"CB",X"BD",X"11",X"E0",X"FF",X"DD",X"19",X"FD", + X"19",X"DD",X"56",X"20",X"DD",X"5E",X"01",X"FD",X"46",X"20",X"FD",X"4E",X"01",X"CD",X"88",X"16", + X"4D",X"55",X"21",X"05",X"4E",X"C3",X"C3",X"2A",X"24",X"CD",X"9B",X"13",X"7A",X"CD",X"B2",X"16", + X"38",X"27",X"7B",X"CD",X"B2",X"16",X"38",X"21",X"7A",X"CD",X"DD",X"22",X"20",X"06",X"7B",X"CD", + X"DD",X"22",X"28",X"43",X"78",X"CD",X"47",X"1D",X"28",X"0F",X"79",X"CD",X"47",X"1D",X"28",X"09", + X"18",X"35",X"FE",X"D8",X"3F",X"D0",X"FE",X"E0",X"C9",X"DD",X"56",X"00",X"FD",X"46",X"00",X"CD", + X"8A",X"21",X"7A",X"3C",X"20",X"07",X"78",X"CD",X"47",X"1D",X"C8",X"18",X"0A",X"7A",X"CD",X"DD", + X"22",X"20",X"0D",X"DD",X"36",X"00",X"FF",X"78",X"CD",X"6D",X"1D",X"FD",X"77",X"00",X"2C",X"C9", + X"78",X"CD",X"47",X"1D",X"C8",X"18",X"F0",X"DD",X"56",X"00",X"FD",X"46",X"00",X"CD",X"8A",X"21", + X"78",X"CD",X"47",X"1D",X"C8",X"7A",X"3C",X"28",X"09",X"78",X"CD",X"6D",X"1D",X"FD",X"77",X"00", + X"2C",X"C9",X"7C",X"CD",X"13",X"17",X"DD",X"70",X"00",X"FD",X"7E",X"00",X"CD",X"6D",X"1D",X"FD", + X"77",X"00",X"C9",X"3D",X"06",X"CD",X"C8",X"05",X"3D",X"C8",X"06",X"CE",X"3D",X"C8",X"04",X"C9", + X"21",X"20",X"4C",X"CB",X"EE",X"CD",X"C8",X"3F",X"C9",X"00",X"C4",X"AE",X"17",X"3A",X"3A",X"00", + X"B7",X"28",X"07",X"CD",X"E4",X"11",X"AF",X"32",X"3A",X"00",X"36",X"08",X"CD",X"C1",X"17",X"CD", + X"C1",X"17",X"21",X"95",X"02",X"CD",X"C4",X"17",X"3A",X"2A",X"00",X"DE",X"28",X"DE",X"08",X"38", + X"03",X"CD",X"BE",X"13",X"21",X"C1",X"02",X"CD",X"C4",X"17",X"21",X"82",X"01",X"34",X"7E",X"CD", + X"98",X"17",X"CD",X"C1",X"17",X"3A",X"89",X"02",X"B7",X"28",X"14",X"21",X"12",X"00",X"22",X"54", + X"00",X"21",X"29",X"02",X"D5",X"CD",X"5C",X"0A",X"D1",X"21",X"94",X"17",X"CD",X"C4",X"17",X"21", + X"83",X"01",X"CD",X"BE",X"17",X"21",X"D4",X"01",X"CD",X"BE",X"17",X"CD",X"C1",X"17",X"CD",X"C1", + X"17",X"C3",X"12",X"17",X"03",X"20",X"2D",X"20",X"D5",X"C5",X"16",X"00",X"06",X"64",X"CD",X"D1", + X"17",X"06",X"0A",X"CD",X"D1",X"17",X"06",X"01",X"CD",X"D1",X"17",X"C1",X"D1",X"C9",X"E5",X"21", + X"46",X"00",X"3A",X"47",X"00",X"3D",X"BE",X"D4",X"08",X"17",X"30",X"FA",X"E1",X"C9",X"CD",X"C4", + X"17",X"21",X"C7",X"02",X"7E",X"B7",X"C8",X"23",X"4E",X"F5",X"CD",X"12",X"00",X"F1",X"3D",X"18", + X"F5",X"0E",X"30",X"90",X"38",X"03",X"0C",X"18",X"FA",X"80",X"F5",X"79",X"FE",X"30",X"20",X"04", + X"7A",X"B7",X"28",X"05",X"CD",X"12",X"00",X"16",X"01",X"F1",X"C9",X"AF",X"00",X"00",X"3E",X"01", + X"18",X"02",X"3E",X"02",X"C5",X"D5",X"C5",X"4F",X"ED",X"5B",X"2D",X"02",X"2A",X"27",X"02",X"B9", + X"3E",X"01",X"32",X"04",X"50",X"21",X"D0",X"4C",X"34",X"7E",X"FE",X"3C",X"D8",X"36",X"00",X"23", + X"34",X"7E",X"FE",X"1E",X"D8",X"AF",X"77",X"32",X"04",X"50",X"C9",X"3A",X"83",X"4C",X"FE",X"01", + X"20",X"0A",X"CC",X"D0",X"3A",X"28",X"05",X"00",X"00",X"32",X"20",X"4C",X"CD",X"DD",X"18",X"CD", + X"8E",X"18",X"D5",X"3A",X"03",X"4E",X"3D",X"28",X"0E",X"3A",X"06",X"4E",X"FE",X"01",X"30",X"07", + X"3A",X"04",X"4E",X"FE",X"10",X"38",X"11",X"CD",X"B4",X"1A",X"20",X"0C",X"7E",X"CD",X"FE",X"18", + X"28",X"06",X"CD",X"D3",X"18",X"CD",X"07",X"19",X"E1",X"3A",X"03",X"4E",X"3D",X"28",X"10",X"3A", + X"06",X"4E",X"FE",X"01",X"06",X"20",X"38",X"02",X"06",X"10",X"3A",X"04",X"4E",X"B8",X"D8",X"CD", + X"B4",X"1A",X"C0",X"7E",X"CD",X"FE",X"18",X"C8",X"CD",X"D3",X"18",X"E5",X"CD",X"5C",X"19",X"E1", + X"20",X"09",X"E5",X"CD",X"61",X"19",X"E1",X"C8",X"79",X"D7",X"4F",X"C3",X"07",X"19",X"11",X"E4", + X"4F",X"21",X"E8",X"4F",X"CD",X"42",X"19",X"13",X"23",X"47",X"CD",X"42",X"19",X"80",X"47",X"2E", + X"EB",X"CD",X"42",X"19",X"2B",X"1B",X"4F",X"CD",X"42",X"19",X"81",X"1E",X"DA",X"2E",X"D8",X"B8", + X"D0",X"EB",X"3A",X"00",X"50",X"0F",X"D8",X"3A",X"55",X"50",X"07",X"C9",X"3A",X"87",X"50",X"E6", + X"C0",X"C8",X"07",X"07",X"D8",X"00",X"00",X"21",X"12",X"4E",X"3A",X"40",X"50",X"34",X"D8",X"21", + X"03",X"4E",X"35",X"E5",X"7D",X"C6",X"10",X"6F",X"CD",X"1C",X"19",X"E1",X"C9",X"21",X"EC",X"4F", + X"3A",X"DC",X"4F",X"CD",X"FE",X"18",X"C8",X"CD",X"14",X"1C",X"30",X"05",X"CD",X"34",X"1C",X"18", + X"08",X"E5",X"CD",X"6F",X"19",X"E1",X"CD",X"1F",X"19",X"2E",X"DC",X"C3",X"07",X"19",X"D7",X"E6", + X"0F",X"FE",X"06",X"C8",X"FE",X"09",X"C9",X"7E",X"D7",X"E6",X"0F",X"E5",X"CD",X"F6",X"19",X"E1", + X"47",X"79",X"A0",X"20",X"04",X"79",X"D7",X"A0",X"C8",X"23",X"77",X"C9",X"11",X"E4",X"4F",X"CD", + X"42",X"19",X"47",X"23",X"13",X"CD",X"42",X"19",X"B8",X"30",X"0B",X"CD",X"48",X"19",X"D7",X"47", + X"CD",X"51",X"19",X"B0",X"4F",X"C9",X"CD",X"51",X"19",X"D7",X"47",X"23",X"13",X"CD",X"48",X"19", + X"18",X"F1",X"1A",X"96",X"F0",X"ED",X"44",X"C9",X"1A",X"96",X"C8",X"3E",X"08",X"D8",X"3E",X"01", + X"C9",X"2B",X"1B",X"1A",X"96",X"C8",X"3E",X"04",X"D8",X"3E",X"02",X"C9",X"11",X"E8",X"4F",X"18", + X"03",X"11",X"E4",X"4F",X"21",X"EA",X"4F",X"1A",X"BE",X"C8",X"23",X"13",X"1A",X"BE",X"C9",X"CD", + X"94",X"19",X"D8",X"3A",X"8E",X"50",X"E6",X"C0",X"18",X"12",X"3A",X"FF",X"50",X"E6",X"30",X"FE", + X"30",X"20",X"09",X"00",X"00",X"ED",X"5B",X"EC",X"4F",X"32",X"03",X"4E",X"ED",X"53",X"E0",X"4F", + X"11",X"E0",X"4F",X"C9",X"11",X"E8",X"4F",X"3A",X"07",X"4E",X"E6",X"81",X"37",X"E8",X"3A",X"10", + X"4E",X"07",X"D8",X"07",X"D8",X"CD",X"00",X"20",X"87",X"21",X"B4",X"19",X"CD",X"52",X"21",X"5E", + X"23",X"56",X"AF",X"C9",X"C8",X"50",X"58",X"50",X"B8",X"D8",X"48",X"78",X"C8",X"20",X"58",X"B0", + X"3A",X"07",X"4E",X"E6",X"81",X"E8",X"3A",X"10",X"4E",X"07",X"D8",X"07",X"D8",X"CD",X"00",X"20", + X"87",X"21",X"B4",X"19",X"CD",X"52",X"21",X"11",X"EC",X"4F",X"1A",X"BE",X"C0",X"23",X"13",X"1A", + X"BE",X"C0",X"AF",X"32",X"08",X"4E",X"32",X"10",X"4E",X"67",X"6F",X"22",X"EC",X"4F",X"22",X"CC", + X"4F",X"3D",X"32",X"07",X"4E",X"C9",X"F5",X"7D",X"C6",X"10",X"6F",X"56",X"23",X"5E",X"3A",X"E4", + X"4F",X"FE",X"88",X"21",X"5A",X"1A",X"06",X"0B",X"28",X"20",X"3A",X"E5",X"4F",X"FE",X"C0",X"21", + X"8D",X"1A",X"06",X"0A",X"28",X"29",X"21",X"99",X"1A",X"06",X"09",X"FE",X"98",X"28",X"20",X"21", + X"6F",X"1A",X"06",X"08",X"FE",X"60",X"28",X"0F",X"F1",X"C9",X"3A",X"11",X"4E",X"B7",X"28",X"0F", + X"21",X"54",X"1A",X"06",X"0D",X"18",X"08",X"3A",X"11",X"4E",X"B7",X"28",X"02",X"06",X"0A",X"7A", + X"BE",X"23",X"20",X"06",X"7B",X"BE",X"23",X"28",X"07",X"2B",X"23",X"23",X"10",X"F1",X"F1",X"C9", + X"46",X"F1",X"A0",X"C9",X"88",X"78",X"0E",X"88",X"D8",X"07",X"58",X"D8",X"07",X"B8",X"D8",X"07", + X"68",X"78",X"0E",X"B8",X"78",X"0E",X"48",X"60",X"0D",X"58",X"60",X"0D",X"B8",X"60",X"0B",X"58", + X"C0",X"0D",X"B8",X"C0",X"0B",X"68",X"98",X"0D",X"B8",X"98",X"0B",X"48",X"78",X"0D",X"88",X"78", + X"07",X"B8",X"78",X"0B",X"88",X"38",X"0E",X"58",X"60",X"0D",X"B8",X"98",X"0B",X"88",X"D8",X"07", + X"58",X"98",X"0D",X"68",X"98",X"0D",X"B8",X"98",X"0B",X"68",X"78",X"0D",X"88",X"78",X"0E",X"B8", + X"78",X"0B",X"48",X"60",X"0D",X"58",X"60",X"0D",X"B8",X"60",X"0B",X"88",X"D8",X"07",X"58",X"C0", + X"0D",X"B0",X"C0",X"0B",X"E5",X"7D",X"C6",X"10",X"6F",X"CD",X"BE",X"1A",X"E1",X"C9",X"7E",X"23", + X"B6",X"2B",X"E6",X"07",X"C9",X"3A",X"06",X"4E",X"FE",X"01",X"30",X"06",X"3A",X"0F",X"4E",X"FE", + X"01",X"D8",X"79",X"E6",X"06",X"79",X"28",X"04",X"EE",X"06",X"4F",X"C9",X"EE",X"09",X"4F",X"C9", + X"3A",X"20",X"4C",X"CB",X"57",X"28",X"1F",X"3A",X"83",X"4C",X"E6",X"3F",X"FE",X"31",X"20",X"16", + X"3A",X"D0",X"4C",X"21",X"DA",X"4C",X"BE",X"20",X"09",X"23",X"34",X"20",X"09",X"00",X"00",X"22", + X"1F",X"4C",X"77",X"23",X"36",X"00",X"11",X"E4",X"4F",X"21",X"E8",X"4F",X"D5",X"CD",X"14",X"1B", + X"D1",X"21",X"EA",X"4F",X"E5",X"CD",X"33",X"1B",X"E1",X"79",X"B7",X"C8",X"7D",X"D6",X"10",X"6F", + X"7E",X"CD",X"FE",X"18",X"C8",X"7E",X"D7",X"E6",X"0F",X"57",X"A1",X"20",X"03",X"7A",X"A0",X"C8", + X"23",X"77",X"C9",X"01",X"00",X"00",X"CD",X"BE",X"1A",X"C0",X"1A",X"FE",X"50",X"38",X"1B",X"FE", + X"C0",X"30",X"31",X"13",X"1A",X"FE",X"40",X"38",X"0A",X"FE",X"D0",X"D8",X"23",X"7E",X"FE",X"40", + X"D0",X"18",X"4B",X"23",X"7E",X"FE",X"D0",X"D8",X"18",X"44",X"7E",X"FE",X"C0",X"D8",X"23",X"13", + X"1A",X"FE",X"90",X"7E",X"38",X"07",X"FE",X"B0",X"D8",X"16",X"C0",X"18",X"21",X"FE",X"B0",X"D0", + X"16",X"60",X"18",X"1A",X"7E",X"FE",X"50",X"D0",X"23",X"13",X"1A",X"FE",X"B0",X"7E",X"38",X"07", + X"FE",X"90",X"D8",X"16",X"C0",X"18",X"07",X"FE",X"90",X"D0",X"16",X"60",X"18",X"00",X"7E",X"BA", + X"0E",X"01",X"D8",X"06",X"08",X"2B",X"7E",X"07",X"0E",X"02",X"D8",X"0E",X"04",X"C9",X"2B",X"7E", + X"FE",X"88",X"0E",X"02",X"D8",X"06",X"04",X"23",X"7E",X"07",X"0E",X"01",X"D8",X"0E",X"08",X"C9", + X"21",X"E8",X"4F",X"11",X"F0",X"4F",X"1A",X"3C",X"28",X"0A",X"12",X"36",X"A0",X"D5",X"E5",X"CD", + X"CD",X"1B",X"E1",X"D1",X"13",X"1A",X"3C",X"C8",X"12",X"23",X"23",X"36",X"70",X"23",X"36",X"B0", + X"1A",X"3C",X"C0",X"7D",X"D6",X"21",X"6F",X"36",X"E0",X"23",X"36",X"07",X"7D",X"FE",X"C9",X"CA", + X"6C",X"39",X"36",X"05",X"C3",X"79",X"39",X"3A",X"80",X"50",X"F5",X"0F",X"0F",X"E6",X"03",X"06", + X"03",X"28",X"09",X"04",X"3D",X"28",X"05",X"04",X"3D",X"28",X"01",X"04",X"78",X"32",X"01",X"4C", + X"F1",X"E6",X"C0",X"FE",X"40",X"C9",X"3A",X"CC",X"50",X"E6",X"30",X"C8",X"FE",X"20",X"C8",X"00", + X"00",X"32",X"19",X"4E",X"11",X"E4",X"4F",X"3A",X"06",X"4E",X"FE",X"01",X"3F",X"D0",X"1A",X"96", + X"30",X"02",X"ED",X"44",X"FE",X"48",X"D0",X"23",X"13",X"1A",X"96",X"2B",X"1B",X"30",X"02",X"ED", + X"44",X"FE",X"48",X"C9",X"1A",X"96",X"0E",X"24",X"C8",X"23",X"13",X"1A",X"96",X"0E",X"18",X"C8", + X"2B",X"1B",X"CD",X"1C",X"19",X"79",X"06",X"09",X"A0",X"20",X"02",X"06",X"06",X"79",X"A8",X"4F", + X"06",X"90",X"A0",X"20",X"02",X"06",X"60",X"79",X"A8",X"4F",X"C9",X"21",X"E8",X"4F",X"CD",X"64", + X"1C",X"21",X"EA",X"4F",X"11",X"E4",X"4F",X"1A",X"13",X"FE",X"58",X"28",X"1A",X"FE",X"C8",X"C0", + X"1A",X"FE",X"61",X"D0",X"7E",X"FE",X"B8",X"C0",X"23",X"7E",X"FE",X"C0",X"28",X"1A",X"FE",X"98", + X"28",X"16",X"FE",X"78",X"C0",X"18",X"11",X"1A",X"FE",X"61",X"D0",X"7E",X"FE",X"48",X"C0",X"23", + X"7E",X"FE",X"78",X"28",X"03",X"FE",X"98",X"C0",X"7D",X"D6",X"10",X"6F",X"36",X"08",X"C9",X"3A", + X"C0",X"50",X"E6",X"1F",X"FE",X"1F",X"0E",X"FF",X"C9",X"06",X"3A",X"80",X"50",X"E6",X"C0",X"C8", + X"F3",X"CD",X"66",X"0B",X"18",X"FB",X"CD",X"8C",X"1D",X"FE",X"06",X"38",X"02",X"3E",X"05",X"87", + X"87",X"21",X"11",X"1D",X"CD",X"52",X"21",X"7E",X"4F",X"E5",X"C5",X"CD",X"29",X"1D",X"C1",X"E1", + X"79",X"20",X"05",X"CC",X"77",X"1D",X"18",X"0D",X"3A",X"06",X"4E",X"FE",X"05",X"38",X"05",X"E6", + X"03",X"28",X"01",X"0D",X"79",X"32",X"CE",X"4F",X"23",X"7E",X"32",X"92",X"4C",X"23",X"7E",X"32", + X"94",X"4C",X"23",X"7E",X"32",X"96",X"4C",X"3A",X"81",X"4C",X"FE",X"10",X"D8",X"3A",X"83",X"4C", + X"FE",X"09",X"C0",X"CD",X"D0",X"3A",X"C8",X"00",X"00",X"32",X"19",X"4E",X"AF",X"32",X"03",X"4E", + X"C9",X"0F",X"0E",X"0E",X"0C",X"80",X"0F",X"0F",X"0D",X"82",X"81",X"81",X"0F",X"84",X"83",X"83", + X"81",X"86",X"85",X"85",X"83",X"89",X"88",X"88",X"85",X"21",X"E4",X"4F",X"CD",X"7F",X"2C",X"21", + X"00",X"40",X"19",X"7E",X"2B",X"A6",X"F5",X"CD",X"50",X"21",X"F1",X"A6",X"23",X"A6",X"3C",X"C9", + X"7E",X"E6",X"E0",X"F6",X"03",X"77",X"C9",X"E6",X"1F",X"FE",X"06",X"C8",X"FE",X"02",X"C8",X"FE", + X"04",X"C9",X"3A",X"06",X"4E",X"FE",X"03",X"38",X"04",X"D6",X"03",X"18",X"F8",X"3C",X"FE",X"03", + X"20",X"01",X"3C",X"32",X"19",X"4E",X"FE",X"01",X"C0",X"3E",X"06",X"18",X"F6",X"E6",X"E0",X"C5", + X"47",X"3A",X"19",X"4E",X"B0",X"C1",X"C9",X"3D",X"F5",X"3A",X"80",X"50",X"CB",X"67",X"18",X"07", + X"3A",X"06",X"4E",X"FE",X"01",X"38",X"03",X"F1",X"3D",X"C9",X"F1",X"C9",X"3A",X"06",X"4E",X"FE", + X"05",X"D0",X"FE",X"02",X"D8",X"F5",X"3A",X"03",X"4E",X"B7",X"28",X"0A",X"3A",X"04",X"4E",X"FE", + X"10",X"38",X"03",X"F1",X"3C",X"C9",X"F1",X"C9",X"21",X"40",X"4E",X"0E",X"05",X"06",X"03",X"36", + X"4B",X"23",X"36",X"52",X"23",X"36",X"4C",X"23",X"23",X"23",X"23",X"0D",X"20",X"EF",X"3E",X"81", + X"32",X"AC",X"4C",X"C9",X"21",X"AE",X"4C",X"7E",X"B7",X"C8",X"CB",X"57",X"28",X"0B",X"CB",X"96", + X"E5",X"CD",X"F1",X"1D",X"E1",X"ED",X"43",X"66",X"4E",X"ED",X"4B",X"66",X"4E",X"78",X"B1",X"20", + X"03",X"36",X"00",X"C9",X"7E",X"E6",X"82",X"C2",X"52",X"3D",X"7E",X"E6",X"41",X"C2",X"6F",X"3D", + X"C9",X"11",X"00",X"4D",X"21",X"80",X"4D",X"01",X"00",X"00",X"CD",X"64",X"1E",X"38",X"09",X"CD", + X"1D",X"1E",X"78",X"B7",X"C8",X"C3",X"11",X"1E",X"CD",X"11",X"1E",X"79",X"B7",X"C8",X"C3",X"1D", + X"1E",X"11",X"80",X"4D",X"C5",X"41",X"CD",X"20",X"1E",X"78",X"C1",X"4F",X"C9",X"11",X"00",X"4D", + X"21",X"5E",X"4E",X"C5",X"06",X"03",X"36",X"40",X"23",X"10",X"FB",X"06",X"03",X"1A",X"77",X"23", + X"13",X"10",X"FA",X"C1",X"21",X"5B",X"4E",X"11",X"61",X"4E",X"CD",X"64",X"1E",X"D8",X"C8",X"7D", + X"D6",X"03",X"6F",X"7B",X"D6",X"03",X"5F",X"C5",X"06",X"06",X"1A",X"F5",X"7E",X"12",X"F1",X"77", + X"23",X"13",X"10",X"F6",X"C1",X"04",X"78",X"FE",X"05",X"C8",X"7B",X"D6",X"09",X"5F",X"7D",X"D6", + X"09",X"6F",X"18",X"D6",X"E5",X"D5",X"CD",X"6C",X"1E",X"D1",X"E1",X"C9",X"1A",X"BE",X"D8",X"C0", + X"13",X"23",X"1A",X"BE",X"D8",X"C0",X"13",X"23",X"1A",X"BE",X"C9",X"00",X"23",X"F6",X"01",X"C9", + X"E3",X"E1",X"D5",X"7E",X"23",X"E6",X"03",X"FE",X"02",X"20",X"06",X"5E",X"23",X"56",X"2B",X"18", + X"03",X"11",X"03",X"00",X"19",X"D1",X"18",X"B3",X"21",X"10",X"00",X"E5",X"3A",X"29",X"00",X"32", + X"40",X"02",X"AF",X"32",X"28",X"00",X"CD",X"AF",X"14",X"DA",X"BD",X"1F",X"CD",X"EC",X"16",X"38", + X"77",X"CD",X"57",X"16",X"CD",X"AF",X"14",X"FE",X"23",X"20",X"06",X"CD",X"CA",X"13",X"CD",X"E4", + X"15",X"D5",X"3A",X"2F",X"02",X"B7",X"20",X"07",X"CD",X"22",X"15",X"38",X"31",X"18",X"0C",X"CD", + X"26",X"15",X"30",X"4D",X"2A",X"40",X"00",X"7C",X"B5",X"28",X"23",X"CB",X"66",X"28",X"3A",X"CB", + X"5E",X"C4",X"25",X"1B",X"CD",X"59",X"18",X"D1",X"CA",X"C5",X"1F",X"3A",X"28",X"00",X"B7",X"28", + X"04",X"B9",X"C4",X"0D",X"1B",X"79",X"32",X"28",X"00",X"0E",X"01",X"C3",X"C5",X"1F",X"2A",X"3E", + X"00",X"7C",X"B5",X"28",X"0D",X"23",X"23",X"5E",X"23",X"56",X"EB",X"AF",X"47",X"4F",X"D1",X"C3", + X"C5",X"1F",X"3A",X"81",X"00",X"3D",X"C4",X"EE",X"17",X"CD",X"19",X"1B",X"21",X"00",X"00",X"18", + X"EA",X"D1",X"CD",X"20",X"19",X"C3",X"A6",X"1E",X"21",X"40",X"02",X"FE",X"30",X"38",X"0B",X"FE", + X"3A",X"30",X"07",X"7E",X"CD",X"96",X"21",X"C3",X"C5",X"1F",X"1A",X"FE",X"22",X"28",X"04",X"FE", + X"27",X"20",X"21",X"47",X"21",X"00",X"00",X"E5",X"CD",X"CA",X"13",X"B8",X"20",X"06",X"CD",X"CA", + X"13",X"B8",X"20",X"0D",X"FE",X"0D",X"20",X"05",X"CD",X"15",X"1B",X"18",X"04",X"65",X"6F",X"18", + X"E7",X"C1",X"18",X"61",X"FE",X"5E",X"20",X"20",X"7E",X"3D",X"07",X"07",X"07",X"07",X"F6",X"17", + X"4F",X"06",X"0F",X"C5",X"CD",X"CA",X"13",X"CD",X"FF",X"16",X"E5",X"21",X"2C",X"22",X"CD",X"59", + X"21",X"38",X"2C",X"7E",X"E1",X"77",X"18",X"73",X"FE",X"2B",X"28",X"6F",X"FE",X"28",X"20",X"0D", + X"3A",X"28",X"00",X"F5",X"AF",X"32",X"28",X"00",X"01",X"11",X"0D",X"18",X"5D",X"FE",X"2D",X"20", + X"05",X"01",X"18",X"0E",X"18",X"54",X"FE",X"23",X"20",X"06",X"01",X"15",X"0C",X"18",X"4B",X"E1", + X"CD",X"01",X"1B",X"18",X"46",X"CD",X"01",X"1B",X"01",X"00",X"00",X"18",X"2D",X"CD",X"01",X"1B", + X"01",X"00",X"00",X"60",X"68",X"22",X"3C",X"02",X"ED",X"43",X"3E",X"02",X"CD",X"AF",X"14",X"21", + X"39",X"22",X"CD",X"59",X"21",X"30",X"12",X"CD",X"EC",X"16",X"38",X"D9",X"CD",X"57",X"16",X"CD", + X"26",X"15",X"38",X"D1",X"CD",X"20",X"19",X"18",X"E3",X"4E",X"E1",X"7D",X"E6",X"0F",X"B9",X"30", + X"10",X"E5",X"2A",X"3C",X"02",X"E5",X"2A",X"3E",X"02",X"E5",X"C5",X"CD",X"CA",X"13",X"C3",X"32", + X"3A",X"06",X"4E",X"FE",X"06",X"D8",X"D6",X"06",X"18",X"F9",X"3A",X"07",X"4E",X"E6",X"81",X"E8", + X"CD",X"D7",X"31",X"3A",X"12",X"4E",X"FE",X"55",X"38",X"17",X"3A",X"20",X"4C",X"CB",X"57",X"C0", + X"3A",X"83",X"4C",X"E6",X"FD",X"FE",X"05",X"C0",X"CD",X"D0",X"3A",X"C8",X"00",X"00",X"32",X"12", + X"4E",X"21",X"EC",X"4F",X"7E",X"23",X"B6",X"2B",X"E6",X"07",X"C0",X"CD",X"00",X"20",X"5F",X"FE", + X"03",X"28",X"06",X"D5",X"CD",X"57",X"21",X"D1",X"D8",X"3A",X"DC",X"4F",X"CD",X"C0",X"20",X"7B", + X"87",X"87",X"81",X"87",X"21",X"6D",X"20",X"CD",X"64",X"20",X"CD",X"9D",X"20",X"21",X"12",X"4E", + X"7E",X"82",X"77",X"C9",X"85",X"6F",X"30",X"01",X"24",X"46",X"23",X"4E",X"C9",X"A7",X"A7",X"A7", + X"A7",X"A7",X"A7",X"A7",X"A7",X"A9",X"A9",X"A8",X"A8",X"A8",X"A8",X"A9",X"A9",X"AA",X"AB",X"AA", + X"AB",X"AA",X"AB",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"AE",X"AF",X"AC",X"AD",X"B8",X"B9",X"B8", + X"B9",X"B8",X"B9",X"B8",X"B9",X"B2",X"B3",X"B5",X"B4",X"B0",X"B1",X"B7",X"B6",X"21",X"EC",X"4F", + X"D5",X"C5",X"CD",X"7F",X"2C",X"21",X"00",X"40",X"19",X"C1",X"D1",X"16",X"00",X"7B",X"FE",X"03", + X"28",X"26",X"CD",X"CA",X"20",X"7D",X"C6",X"1F",X"6F",X"30",X"01",X"24",X"41",X"C3",X"CA",X"20", + X"0E",X"00",X"E6",X"0F",X"C8",X"0F",X"D8",X"0C",X"18",X"FB",X"7E",X"FE",X"FF",X"20",X"03",X"70", + X"14",X"C9",X"CD",X"74",X"21",X"D0",X"70",X"C9",X"3A",X"DC",X"4F",X"0F",X"38",X"41",X"0F",X"38", + X"2D",X"0F",X"38",X"16",X"0F",X"D0",X"2B",X"3E",X"AE",X"01",X"AC",X"BB",X"CD",X"32",X"21",X"CD", + X"50",X"21",X"3E",X"AE",X"01",X"AD",X"BD",X"C3",X"32",X"21",X"CD",X"50",X"21",X"3E",X"AC",X"01", + X"AE",X"BB",X"CD",X"32",X"21",X"2B",X"3E",X"AC",X"01",X"AF",X"BA",X"C3",X"32",X"21",X"3E",X"AD", + X"01",X"AE",X"BD",X"CD",X"32",X"21",X"2B",X"3E",X"AD",X"01",X"AF",X"BC",X"C3",X"32",X"21",X"3E", + X"AF",X"01",X"AC",X"BA",X"CD",X"32",X"21",X"CD",X"50",X"21",X"3E",X"AF",X"01",X"AD",X"BC",X"C3", + X"32",X"21",X"BE",X"20",X"02",X"70",X"C9",X"3E",X"FF",X"BE",X"C0",X"71",X"14",X"3A",X"77",X"50", + X"87",X"C9",X"10",X"03",X"00",X"E6",X"C0",X"C8",X"87",X"87",X"D8",X"00",X"00",X"14",X"77",X"C9", + X"3E",X"20",X"85",X"6F",X"D0",X"24",X"C9",X"CD",X"7F",X"2C",X"21",X"00",X"40",X"19",X"CD",X"74", + X"21",X"D8",X"2B",X"CD",X"74",X"21",X"D8",X"11",X"20",X"00",X"19",X"CD",X"74",X"21",X"D8",X"23", + X"CD",X"74",X"21",X"C9",X"7E",X"FE",X"BE",X"D0",X"FE",X"A7",X"3F",X"C9",X"7A",X"FE",X"BE",X"30", + X"06",X"FE",X"A7",X"38",X"02",X"AF",X"C9",X"F6",X"FF",X"C9",X"7A",X"CD",X"75",X"21",X"D0",X"3A", + X"12",X"4E",X"3D",X"32",X"12",X"4E",X"16",X"FF",X"DD",X"72",X"00",X"E5",X"D5",X"21",X"01",X"00", + X"11",X"02",X"4E",X"CD",X"29",X"3A",X"CD",X"C0",X"31",X"D1",X"E1",X"C9",X"3A",X"81",X"4C",X"FE", + X"20",X"38",X"1F",X"3A",X"83",X"4C",X"E6",X"3F",X"FE",X"35",X"20",X"16",X"3A",X"D0",X"4C",X"21", + X"D8",X"4C",X"BE",X"20",X"08",X"23",X"34",X"C0",X"00",X"00",X"32",X"20",X"4C",X"77",X"23",X"36", + X"00",X"00",X"21",X"12",X"40",X"06",X"0C",X"CD",X"66",X"23",X"21",X"5F",X"42",X"11",X"20",X"00", + X"06",X"07",X"36",X"F7",X"19",X"10",X"FB",X"06",X"05",X"36",X"40",X"19",X"10",X"FB",X"21",X"1D", + X"40",X"11",X"BF",X"43",X"01",X"E0",X"FF",X"3A",X"20",X"4C",X"CB",X"57",X"3A",X"1C",X"4C",X"28", + X"03",X"3A",X"1D",X"4C",X"3D",X"F8",X"C8",X"FE",X"06",X"38",X"02",X"3E",X"06",X"F5",X"36",X"C8", + X"2B",X"36",X"C9",X"2B",X"EB",X"36",X"CA",X"09",X"36",X"CB",X"09",X"EB",X"3D",X"20",X"EF",X"21", + X"BF",X"47",X"11",X"1D",X"44",X"F1",X"08",X"3E",X"01",X"77",X"09",X"77",X"09",X"EB",X"77",X"2B", + X"77",X"2B",X"EB",X"08",X"3D",X"C8",X"18",X"EE",X"CD",X"44",X"23",X"3A",X"9F",X"4C",X"B7",X"C8", + X"FE",X"06",X"38",X"02",X"3E",X"06",X"01",X"20",X"00",X"21",X"5F",X"40",X"D9",X"21",X"22",X"40", + X"11",X"02",X"40",X"36",X"C2",X"23",X"36",X"C3",X"23",X"EB",X"36",X"C4",X"23",X"36",X"C5",X"23", + X"EB",X"D9",X"36",X"C6",X"09",X"36",X"C7",X"09",X"D9",X"3D",X"20",X"E7",X"01",X"9C",X"22",X"3A", + X"9F",X"4C",X"F5",X"FE",X"13",X"38",X"02",X"3E",X"13",X"81",X"4F",X"30",X"01",X"04",X"F1",X"FE", + X"06",X"38",X"02",X"3E",X"06",X"21",X"22",X"44",X"11",X"02",X"44",X"08",X"0A",X"77",X"23",X"77", + X"23",X"EB",X"77",X"23",X"77",X"23",X"EB",X"03",X"08",X"3D",X"20",X"EF",X"C9",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"0F",X"0F",X"11",X"11",X"12",X"12",X"14",X"14",X"05", + X"05",X"05",X"05",X"05",X"05",X"CD",X"CF",X"22",X"C4",X"7C",X"21",X"C4",X"0D",X"3C",X"C0",X"53", + X"CD",X"CF",X"22",X"C4",X"7C",X"21",X"C4",X"0D",X"3C",X"C0",X"CB",X"E1",X"33",X"33",X"C9",X"7A", + X"D6",X"FC",X"C8",X"3D",X"C8",X"3D",X"C8",X"3D",X"C8",X"7A",X"FE",X"D2",X"C8",X"D6",X"CC",X"C8", + X"3D",X"C8",X"3D",X"C8",X"3D",X"C9",X"BA",X"C0",X"BB",X"C0",X"18",X"DE",X"3A",X"83",X"4C",X"D7", + X"07",X"E6",X"1C",X"CD",X"07",X"23",X"71",X"EB",X"70",X"3E",X"04",X"84",X"67",X"36",X"19",X"EB", + X"3E",X"04",X"84",X"67",X"36",X"03",X"C9",X"21",X"24",X"23",X"CD",X"52",X"21",X"56",X"23",X"5E", + X"23",X"4E",X"23",X"46",X"6A",X"16",X"40",X"62",X"7B",X"FE",X"A0",X"30",X"01",X"14",X"7D",X"FE", + X"A0",X"D0",X"24",X"C9",X"AC",X"CA",X"F2",X"B5",X"AB",X"EA",X"F9",X"B4",X"CA",X"0A",X"F7",X"B6", + X"EA",X"0B",X"F7",X"B7",X"0A",X"EC",X"F3",X"B0",X"0B",X"CC",X"FA",X"B1",X"EC",X"AC",X"F8",X"B2", + X"CC",X"AB",X"F8",X"B3",X"21",X"00",X"40",X"06",X"10",X"CD",X"66",X"23",X"2E",X"20",X"06",X"10", + X"CD",X"66",X"23",X"21",X"5F",X"40",X"11",X"20",X"00",X"36",X"40",X"19",X"06",X"0B",X"3A",X"9B", + X"41",X"77",X"19",X"10",X"FC",X"C9",X"36",X"40",X"23",X"10",X"FB",X"C9",X"21",X"16",X"4E",X"7E", + X"B7",X"C0",X"3A",X"01",X"4E",X"FE",X"10",X"D8",X"36",X"FF",X"21",X"1C",X"4C",X"3A",X"20",X"4C", + X"CB",X"57",X"28",X"01",X"23",X"34",X"CD",X"AC",X"21",X"3A",X"90",X"50",X"E6",X"C0",X"C9",X"3A", + X"D0",X"50",X"E6",X"30",X"FE",X"30",X"C0",X"00",X"00",X"FF",X"32",X"03",X"4E",X"3A",X"06",X"4E", + X"21",X"00",X"09",X"FE",X"08",X"30",X"11",X"B7",X"21",X"05",X"00",X"28",X"0B",X"47",X"7D",X"85", + X"27",X"6F",X"7C",X"8C",X"27",X"67",X"10",X"F6",X"22",X"0E",X"4E",X"C9",X"3A",X"83",X"4C",X"47", + X"E6",X"0F",X"C0",X"21",X"20",X"4C",X"7E",X"E6",X"07",X"28",X"16",X"CB",X"56",X"28",X"09",X"CB", + X"60",X"20",X"0E",X"21",X"C5",X"43",X"18",X"1F",X"CB",X"60",X"20",X"05",X"21",X"D8",X"43",X"18", + X"16",X"21",X"C5",X"43",X"36",X"50",X"23",X"36",X"55",X"23",X"36",X"02",X"2E",X"D8",X"36",X"50", + X"23",X"36",X"55",X"23",X"36",X"01",X"C9",X"06",X"03",X"C3",X"66",X"23",X"3A",X"90",X"4C",X"B7", + X"C8",X"21",X"10",X"40",X"06",X"10",X"FE",X"01",X"CA",X"66",X"23",X"3A",X"20",X"4C",X"CB",X"57", + X"3A",X"1C",X"4C",X"28",X"03",X"3A",X"1D",X"4C",X"FE",X"02",X"D0",X"21",X"1D",X"40",X"11",X"35", + X"24",X"06",X"0A",X"1A",X"77",X"2B",X"13",X"10",X"FA",X"06",X"0A",X"7C",X"C6",X"04",X"67",X"23", + X"36",X"03",X"10",X"FB",X"C9",X"47",X"41",X"4D",X"45",X"40",X"4F",X"56",X"45",X"52",X"40",X"21", + X"E4",X"4F",X"7E",X"23",X"B6",X"E6",X"07",X"2B",X"20",X"1D",X"E5",X"7D",X"D6",X"10",X"6F",X"7E", + X"D7",X"E5",X"CD",X"CB",X"13",X"E1",X"E6",X"0F",X"47",X"A6",X"E6",X"0F",X"20",X"01",X"77",X"23", + X"7E",X"2B",X"A0",X"28",X"01",X"77",X"E1",X"CD",X"48",X"2D",X"18",X"D6",X"21",X"80",X"4E",X"11", + X"00",X"4F",X"01",X"80",X"00",X"ED",X"B0",X"CD",X"81",X"24",X"CD",X"4F",X"25",X"CD",X"0B",X"25", + X"C9",X"21",X"60",X"40",X"11",X"80",X"4E",X"CD",X"74",X"21",X"30",X"12",X"47",X"CD",X"FD",X"24", + X"78",X"20",X"0B",X"36",X"FF",X"CD",X"B5",X"24",X"7D",X"E6",X"1F",X"B0",X"12",X"13",X"23",X"7D", + X"E6",X"1F",X"20",X"02",X"12",X"13",X"7D",X"FE",X"BF",X"20",X"DC",X"7C",X"FE",X"43",X"20",X"D7", + X"AF",X"12",X"13",X"12",X"C9",X"E5",X"21",X"CD",X"24",X"06",X"00",X"BE",X"28",X"04",X"04",X"23", + X"18",X"F9",X"78",X"07",X"07",X"07",X"07",X"07",X"E6",X"E0",X"47",X"E1",X"C9",X"A7",X"A7",X"A7", + X"A7",X"A7",X"A7",X"A7",X"A7",X"A8",X"A9",X"A8",X"A9",X"A8",X"A9",X"A8",X"A9",X"AA",X"AB",X"AA", + X"AB",X"AA",X"AB",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"BA",X"BB",X"BC",X"BD",X"B8",X"B9",X"B8", + X"B9",X"B8",X"B9",X"B8",X"B9",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"E5",X"3E",X"04", + X"84",X"67",X"7E",X"E1",X"CD",X"47",X"1D",X"C8",X"FE",X"03",X"C9",X"21",X"60",X"40",X"11",X"00", + X"4F",X"4D",X"1A",X"B7",X"20",X"07",X"69",X"CD",X"50",X"21",X"4D",X"18",X"0D",X"E6",X"1F",X"47", + X"7D",X"E6",X"E0",X"B0",X"6F",X"1A",X"CD",X"36",X"25",X"77",X"13",X"7C",X"FE",X"43",X"20",X"E2", + X"7D",X"FE",X"BF",X"38",X"DD",X"C9",X"E5",X"0F",X"0F",X"0F",X"0F",X"0F",X"E6",X"07",X"47",X"CD", + X"00",X"20",X"87",X"87",X"87",X"B0",X"21",X"CD",X"24",X"CD",X"52",X"21",X"7E",X"E1",X"C9",X"21", + X"40",X"40",X"11",X"40",X"44",X"1A",X"F5",X"7E",X"E5",X"21",X"8D",X"25",X"CD",X"84",X"25",X"E1", + X"20",X"09",X"CD",X"9B",X"25",X"1A",X"E6",X"1F",X"B0",X"18",X"03",X"1A",X"E6",X"1F",X"12",X"F1", + X"E6",X"E0",X"28",X"03",X"CD",X"C9",X"25",X"23",X"13",X"7D",X"FE",X"BF",X"20",X"D7",X"7C",X"FE", + X"43",X"20",X"D2",X"C9",X"46",X"23",X"BE",X"23",X"C8",X"10",X"FB",X"04",X"C9",X"0D",X"FF",X"D2", + X"FC",X"FE",X"FD",X"D1",X"E1",X"E5",X"EA",X"CC",X"CD",X"CE",X"CF",X"06",X"E0",X"D6",X"CC",X"28", + X"25",X"06",X"C0",X"3D",X"28",X"20",X"06",X"A0",X"3D",X"28",X"1B",X"06",X"80",X"3D",X"28",X"16", + X"1A",X"E6",X"1F",X"06",X"60",X"FE",X"06",X"C8",X"FE",X"02",X"C8",X"FE",X"04",X"C8",X"06",X"40", + X"FE",X"03",X"C8",X"06",X"00",X"C9",X"36",X"FF",X"C9",X"D7",X"0F",X"E6",X"07",X"47",X"05",X"05", + X"28",X"18",X"05",X"28",X"0F",X"0E",X"CF",X"05",X"28",X"09",X"0D",X"05",X"28",X"05",X"0D",X"05", + X"28",X"01",X"0D",X"71",X"1A",X"CD",X"6D",X"1D",X"12",X"C9",X"1A",X"E6",X"E0",X"F6",X"03",X"12", + X"C9",X"21",X"14",X"4E",X"3A",X"E7",X"41",X"FE",X"D8",X"28",X"0A",X"CB",X"8E",X"21",X"F0",X"41", + X"CD",X"2E",X"2F",X"18",X"08",X"CB",X"CE",X"21",X"E7",X"41",X"CD",X"2E",X"2F",X"21",X"14",X"4E", + X"3A",X"74",X"41",X"FE",X"DC",X"28",X"08",X"CB",X"86",X"21",X"94",X"42",X"C3",X"28",X"2F",X"CB", + X"C6",X"21",X"74",X"41",X"C3",X"28",X"2F",X"3A",X"14",X"4E",X"0F",X"38",X"05",X"CD",X"DA",X"2E", + X"18",X"03",X"CD",X"E2",X"2E",X"3A",X"14",X"4E",X"0F",X"0F",X"DA",X"FA",X"2E",X"C3",X"F2",X"2E", + X"3A",X"11",X"4E",X"B7",X"20",X"0C",X"11",X"CE",X"4F",X"21",X"E4",X"4F",X"01",X"A8",X"4C",X"CD", + X"79",X"26",X"11",X"92",X"4C",X"21",X"E8",X"4F",X"01",X"A9",X"4C",X"CD",X"79",X"26",X"11",X"94", + X"4C",X"21",X"EA",X"4F",X"01",X"AA",X"4C",X"CD",X"79",X"26",X"3A",X"07",X"4E",X"E6",X"81",X"E8", + X"11",X"96",X"4C",X"21",X"EC",X"4F",X"01",X"AB",X"4C",X"1A",X"07",X"30",X"0C",X"E5",X"CD",X"3F", + X"2C",X"E1",X"7E",X"23",X"B6",X"E6",X"07",X"C8",X"2B",X"E5",X"CD",X"92",X"26",X"E1",X"C8",X"C3", + X"3F",X"2C",X"1A",X"E6",X"0F",X"87",X"21",X"B4",X"26",X"CD",X"52",X"21",X"0A",X"3C",X"FE",X"10", + X"38",X"01",X"AF",X"02",X"47",X"04",X"AF",X"4F",X"37",X"17",X"CB",X"11",X"10",X"FB",X"A6",X"C0", + X"79",X"23",X"A6",X"C9",X"00",X"80",X"80",X"80",X"20",X"84",X"88",X"88",X"48",X"92",X"92",X"92", + X"2A",X"95",X"AA",X"AA",X"5A",X"DA",X"6D",X"6D",X"6D",X"DB",X"77",X"77",X"DE",X"F7",X"7F",X"7F", + X"7F",X"FF",X"FF",X"FF",X"00",X"59",X"AA",X"00",X"00",X"EF",X"25",X"04",X"0C",X"0B",X"00",X"B2", + X"7D",X"00",X"00",X"97",X"23",X"04",X"05",X"07",X"00",X"B0",X"CE",X"00",X"00",X"81",X"25",X"04", + X"05",X"17",X"00",X"B3",X"6D",X"00",X"00",X"E9",X"26",X"04",X"05",X"0F",X"00",X"B0",X"D4",X"00", + X"00",X"49",X"26",X"04",X"05",X"1F",X"00",X"B2",X"7D",X"AF",X"00",X"DF",X"26",X"14",X"0E",X"CB", + X"00",X"B0",X"CE",X"AF",X"00",X"F3",X"26",X"14",X"0E",X"CB",X"10",X"B3",X"6D",X"AF",X"00",X"11", + X"27",X"14",X"0E",X"CB",X"08",X"B0",X"D4",X"AF",X"00",X"FD",X"26",X"14",X"0E",X"CB",X"18",X"B8", + X"BB",X"AF",X"00",X"7B",X"26",X"14",X"0E",X"CB",X"20",X"B9",X"AB",X"AF",X"00",X"CD",X"24",X"14", + X"0E",X"CB",X"28",X"B9",X"B6",X"AF",X"00",X"07",X"27",X"14",X"0E",X"CB",X"38",X"B2",X"7E",X"00", + X"00",X"E1",X"24",X"14",X"06",X"ED",X"6F",X"B3",X"6E",X"00",X"00",X"17",X"26",X"14",X"06",X"ED", + X"67",X"4E",X"16",X"00",X"00",X"CB",X"26",X"14",X"0F",X"CB",X"40",X"B7",X"B6",X"00",X"00",X"8F", + X"26",X"14",X"0F",X"CB",X"C0",X"B1",X"75",X"00",X"00",X"25",X"27",X"14",X"0F",X"CB",X"80",X"80", + X"B2",X"00",X"00",X"39",X"27",X"04",X"09",X"C3",X"00",X"80",X"E4",X"00",X"00",X"75",X"27",X"04", + X"09",X"C2",X"00",X"82",X"A0",X"00",X"00",X"67",X"26",X"04",X"09",X"CA",X"00",X"80",X"CD",X"00", + X"00",X"2D",X"24",X"04",X"09",X"D2",X"00",X"7F",X"08",X"00",X"00",X"2B",X"26",X"04",X"09",X"DA", + X"00",X"81",X"29",X"00",X"00",X"AD",X"26",X"04",X"09",X"E2",X"00",X"81",X"1F",X"00",X"00",X"1B", + X"27",X"04",X"09",X"EA",X"00",X"81",X"10",X"00",X"00",X"3F",X"26",X"04",X"09",X"F2",X"00",X"80", + X"98",X"00",X"00",X"61",X"27",X"04",X"09",X"FA",X"00",X"80",X"D9",X"00",X"00",X"00",X"00",X"14", + X"09",X"E2",X"00",X"80",X"E8",X"00",X"00",X"B1",X"27",X"14",X"09",X"EA",X"00",X"80",X"B2",X"AF", + X"00",X"7F",X"27",X"14",X"10",X"18",X"00",X"81",X"6D",X"00",X"00",X"4D",X"27",X"14",X"10",X"D9", + X"21",X"83",X"4C",X"7E",X"E6",X"FE",X"FE",X"4E",X"20",X"0B",X"7E",X"2F",X"32",X"07",X"50",X"0F", + X"38",X"03",X"CD",X"00",X"18",X"21",X"1E",X"4C",X"11",X"36",X"40",X"01",X"00",X"01",X"CD",X"61", + X"28",X"21",X"80",X"4C",X"11",X"F3",X"43",X"CD",X"58",X"28",X"3A",X"87",X"4C",X"B7",X"21",X"00", + X"4E",X"3A",X"20",X"4C",X"E6",X"03",X"20",X"03",X"21",X"00",X"4D",X"3A",X"20",X"4C",X"CB",X"57", + X"20",X"0C",X"1E",X"FD",X"CD",X"58",X"28",X"21",X"80",X"4D",X"1E",X"E8",X"18",X"0A",X"1E",X"E8", + X"CD",X"58",X"28",X"21",X"00",X"4D",X"1E",X"FD",X"01",X"FF",X"03",X"CD",X"61",X"28",X"AF",X"12", + X"C9",X"7E",X"D7",X"CD",X"6E",X"28",X"7E",X"CD",X"6E",X"28",X"23",X"10",X"F4",X"C9",X"E6",X"0F", + X"CB",X"09",X"30",X"09",X"B7",X"28",X"04",X"0E",X"00",X"18",X"02",X"3E",X"40",X"12",X"1B",X"C9", + X"E1",X"46",X"23",X"5E",X"23",X"56",X"23",X"EB",X"1A",X"77",X"D5",X"11",X"20",X"00",X"19",X"D1", + X"13",X"10",X"F5",X"EB",X"E9",X"08",X"7B",X"D6",X"20",X"ED",X"44",X"47",X"08",X"77",X"3C",X"23", + X"10",X"FB",X"19",X"0D",X"20",X"EF",X"C9",X"08",X"7B",X"D6",X"20",X"ED",X"44",X"47",X"08",X"77", + X"23",X"10",X"FC",X"19",X"0D",X"20",X"F0",X"C9",X"21",X"76",X"42",X"11",X"1D",X"00",X"3E",X"0A", + X"0E",X"03",X"CD",X"95",X"28",X"21",X"76",X"46",X"3E",X"1D",X"0E",X"03",X"CD",X"A7",X"28",X"3E", + X"1F",X"32",X"78",X"46",X"32",X"98",X"46",X"32",X"B8",X"46",X"C9",X"3E",X"13",X"32",X"97",X"42", + X"3C",X"32",X"B7",X"42",X"C9",X"21",X"76",X"42",X"11",X"1E",X"00",X"3E",X"40",X"0E",X"03",X"CD", + X"A7",X"28",X"3E",X"EE",X"32",X"76",X"42",X"32",X"96",X"42",X"3E",X"F7",X"32",X"B6",X"42",X"3E", + X"1E",X"32",X"B8",X"46",X"3E",X"03",X"32",X"76",X"46",X"32",X"96",X"46",X"32",X"B6",X"46",X"C9", + X"21",X"D6",X"40",X"11",X"1D",X"00",X"3E",X"16",X"0E",X"03",X"CD",X"95",X"28",X"21",X"D6",X"44", + X"3E",X"09",X"0E",X"03",X"C3",X"A7",X"28",X"21",X"D7",X"40",X"11",X"1E",X"00",X"3E",X"1F",X"0E", + X"03",X"C3",X"95",X"28",X"21",X"D7",X"40",X"11",X"1E",X"00",X"3E",X"40",X"0E",X"03",X"CD",X"A7", + X"28",X"21",X"D8",X"40",X"36",X"F8",X"2E",X"F8",X"36",X"F8",X"21",X"17",X"41",X"36",X"FA",X"23", + X"36",X"F4",X"3E",X"03",X"21",X"D8",X"44",X"77",X"2E",X"F8",X"77",X"21",X"17",X"45",X"77",X"23", + X"77",X"C9",X"21",X"E3",X"42",X"11",X"1C",X"00",X"3E",X"25",X"0E",X"04",X"CD",X"95",X"28",X"2E", + X"43",X"36",X"F3",X"2E",X"47",X"77",X"2E",X"27",X"36",X"31",X"3E",X"1C",X"21",X"E3",X"46",X"1B", + X"0E",X"04",X"CD",X"A7",X"28",X"3E",X"03",X"21",X"E7",X"46",X"77",X"21",X"07",X"47",X"77",X"2E", + X"43",X"77",X"2E",X"04",X"36",X"0F",X"23",X"36",X"14",X"3E",X"1D",X"32",X"E5",X"46",X"C9",X"21", + X"04",X"43",X"36",X"36",X"23",X"36",X"37",X"C9",X"3E",X"F9",X"32",X"E5",X"42",X"21",X"04",X"43", + X"36",X"36",X"23",X"36",X"40",X"C9",X"21",X"50",X"40",X"36",X"5C",X"23",X"36",X"5D",X"23",X"36", + X"5E",X"21",X"6F",X"40",X"11",X"1C",X"00",X"3E",X"5F",X"0E",X"03",X"CD",X"95",X"28",X"23",X"77", + X"23",X"3C",X"77",X"23",X"3C",X"77",X"21",X"4F",X"44",X"3E",X"0D",X"0E",X"05",X"CD",X"A7",X"28", + X"21",X"6F",X"44",X"3E",X"0B",X"77",X"2E",X"8F",X"77",X"23",X"36",X"0C",X"C9",X"21",X"51",X"40", + X"11",X"1E",X"00",X"3E",X"6E",X"0E",X"02",X"CD",X"95",X"28",X"21",X"B1",X"40",X"3E",X"72",X"0E", + X"02",X"C3",X"95",X"28",X"21",X"6F",X"40",X"11",X"1E",X"00",X"3E",X"7E",X"0E",X"02",X"CD",X"95", + X"28",X"21",X"51",X"40",X"36",X"5D",X"23",X"36",X"5E",X"19",X"23",X"36",X"61",X"23",X"36",X"62", + X"21",X"B1",X"40",X"3E",X"76",X"0E",X"02",X"C3",X"95",X"28",X"3E",X"82",X"32",X"8F",X"40",X"21", + X"51",X"40",X"3E",X"6E",X"11",X"1E",X"00",X"0E",X"02",X"CD",X"95",X"28",X"21",X"B1",X"40",X"3E", + X"7A",X"0E",X"02",X"C3",X"95",X"28",X"21",X"3B",X"43",X"11",X"1C",X"00",X"0E",X"03",X"3E",X"83", + X"CD",X"95",X"28",X"21",X"3B",X"47",X"0E",X"03",X"3E",X"1B",X"C3",X"A7",X"28",X"21",X"3C",X"43", + X"36",X"8F",X"23",X"36",X"90",X"C9",X"21",X"3B",X"43",X"11",X"1C",X"00",X"0E",X"03",X"3E",X"95", + X"CD",X"95",X"28",X"21",X"3B",X"47",X"0E",X"03",X"3E",X"09",X"C3",X"A7",X"28",X"21",X"3D",X"43", + X"11",X"1E",X"00",X"3E",X"A1",X"0E",X"03",X"CD",X"95",X"28",X"21",X"5C",X"43",X"36",X"A3",X"23", + X"36",X"9B",X"C9",X"11",X"80",X"4C",X"21",X"00",X"4E",X"06",X"03",X"1A",X"BE",X"20",X"05",X"23", + X"13",X"10",X"F8",X"C9",X"D0",X"2E",X"00",X"1E",X"80",X"01",X"03",X"00",X"ED",X"B0",X"3A",X"40", + X"50",X"0F",X"0F",X"C9",X"3A",X"83",X"4C",X"FE",X"A9",X"C0",X"CD",X"D0",X"3A",X"C8",X"00",X"00", + X"ED",X"B0",X"C9",X"7E",X"81",X"77",X"FE",X"04",X"D8",X"D6",X"04",X"77",X"06",X"02",X"CD",X"DA", + X"2A",X"06",X"03",X"CD",X"DA",X"2A",X"CD",X"C0",X"31",X"C9",X"37",X"2B",X"7E",X"CE",X"00",X"27", + X"77",X"10",X"F8",X"C9",X"21",X"D4",X"4F",X"46",X"21",X"C4",X"4F",X"4E",X"78",X"E6",X"0F",X"C8", + X"78",X"0F",X"30",X"06",X"CB",X"D9",X"CB",X"81",X"18",X"19",X"0F",X"30",X"06",X"CB",X"99",X"CB", + X"C9",X"18",X"10",X"0F",X"30",X"06",X"CB",X"99",X"CB",X"89",X"18",X"07",X"0F",X"30",X"04",X"CB", + X"D9",X"CB",X"C1",X"71",X"11",X"8F",X"4C",X"1A",X"3C",X"12",X"4F",X"78",X"E6",X"09",X"20",X"3D", + X"78",X"E6",X"06",X"20",X"08",X"3A",X"D5",X"4F",X"47",X"E6",X"09",X"20",X"30",X"79",X"FE",X"04", + X"20",X"05",X"CB",X"D6",X"CB",X"86",X"C9",X"FE",X"08",X"20",X"05",X"CB",X"D6",X"CB",X"C6",X"C9", + X"FE",X"0C",X"20",X"04",X"CB",X"96",X"18",X"F5",X"FE",X"10",X"20",X"02",X"18",X"ED",X"FE",X"14", + X"20",X"02",X"18",X"DE",X"FE",X"18",X"C0",X"CB",X"96",X"CB",X"86",X"18",X"2F",X"79",X"FE",X"04", + X"20",X"05",X"CB",X"D6",X"CB",X"8E",X"C9",X"FE",X"08",X"20",X"05",X"CB",X"D6",X"CB",X"CE",X"C9", + X"FE",X"0C",X"20",X"05",X"CB",X"96",X"CB",X"CE",X"C9",X"FE",X"10",X"20",X"02",X"18",X"EC",X"FE", + X"14",X"20",X"02",X"18",X"DD",X"FE",X"18",X"C0",X"CB",X"96",X"CB",X"8E",X"AF",X"12",X"C9",X"E5", + X"D5",X"CD",X"51",X"3A",X"D1",X"E1",X"3E",X"7F",X"20",X"02",X"1A",X"96",X"13",X"23",X"F0",X"ED", + X"44",X"C9",X"CD",X"8F",X"2B",X"4F",X"18",X"F2",X"3A",X"11",X"4E",X"B7",X"C0",X"21",X"E8",X"4F", + X"06",X"02",X"11",X"E4",X"4F",X"CD",X"A2",X"2B",X"81",X"38",X"05",X"FE",X"08",X"DC",X"C3",X"2B", + X"10",X"F0",X"C9",X"E5",X"7D",X"D6",X"22",X"6F",X"CB",X"5E",X"E1",X"C0",X"3E",X"83",X"32",X"5C", + X"4C",X"3E",X"FF",X"32",X"90",X"4C",X"21",X"20",X"4C",X"CB",X"F6",X"F1",X"C9",X"11",X"1E",X"4C", + X"CD",X"23",X"2C",X"21",X"20",X"4C",X"7E",X"0F",X"D8",X"0F",X"D8",X"1A",X"B7",X"C8",X"FE",X"01", + X"3A",X"01",X"4C",X"4F",X"3A",X"40",X"50",X"28",X"1C",X"CB",X"77",X"20",X"18",X"36",X"83",X"1A", + X"3D",X"3D",X"27",X"12",X"21",X"1C",X"4C",X"71",X"23",X"71",X"AF",X"32",X"87",X"4C",X"32",X"90", + X"4C",X"32",X"5C",X"4C",X"C9",X"CB",X"6F",X"C0",X"36",X"81",X"1A",X"3D",X"27",X"12",X"21",X"1C", + X"4C",X"18",X"E6",X"21",X"83",X"4C",X"7E",X"E6",X"FE",X"FE",X"08",X"C0",X"7E",X"2F",X"32",X"07", + X"50",X"0F",X"D8",X"C3",X"B5",X"3A",X"EB",X"35",X"EB",X"C0",X"13",X"1A",X"1B",X"12",X"C9",X"E5", + X"7D",X"D6",X"10",X"6F",X"7E",X"0F",X"E1",X"23",X"30",X"01",X"34",X"2B",X"0F",X"30",X"01",X"34", + X"0F",X"30",X"01",X"35",X"0F",X"D0",X"23",X"35",X"2B",X"C9",X"CD",X"E9",X"2D",X"0C",X"C2",X"4F", + X"B4",X"83",X"F8",X"01",X"00",X"83",X"48",X"09",X"48",X"09",X"00",X"00",X"CD",X"E9",X"2D",X"0C", + X"E2",X"4F",X"00",X"00",X"88",X"18",X"00",X"00",X"A0",X"B0",X"70",X"B0",X"01",X"01",X"C9",X"7E", + X"D6",X"10",X"0F",X"0F",X"0F",X"E6",X"1F",X"57",X"23",X"7E",X"2B",X"D6",X"10",X"2F",X"06",X"03", + X"CB",X"3A",X"1F",X"10",X"FB",X"5F",X"C9",X"21",X"8C",X"4C",X"7E",X"3C",X"77",X"FE",X"08",X"D8", + X"36",X"00",X"21",X"D8",X"4F",X"CD",X"C0",X"2C",X"23",X"23",X"7D",X"FE",X"DC",X"20",X"F6",X"3A", + X"10",X"4E",X"B7",X"C8",X"CD",X"00",X"20",X"3D",X"28",X"2B",X"3D",X"28",X"19",X"3D",X"28",X"16", + X"E5",X"46",X"7D",X"D6",X"10",X"6F",X"4E",X"78",X"E6",X"06",X"79",X"20",X"04",X"EE",X"02",X"18", + X"02",X"EE",X"01",X"77",X"E1",X"C9",X"3A",X"07",X"4E",X"E6",X"81",X"E8",X"7D",X"D6",X"10",X"6F", + X"7E",X"EE",X"04",X"77",X"C9",X"21",X"CC",X"4F",X"7E",X"E6",X"FC",X"77",X"C9",X"21",X"D8",X"4F", + X"46",X"7D",X"D6",X"10",X"6F",X"7E",X"CB",X"08",X"30",X"06",X"CB",X"D7",X"CB",X"87",X"18",X"18", + X"CB",X"08",X"30",X"06",X"CB",X"97",X"CB",X"CF",X"18",X"0E",X"CB",X"08",X"30",X"04",X"E6",X"F9", + X"18",X"06",X"CB",X"08",X"30",X"02",X"F6",X"05",X"77",X"7D",X"C6",X"12",X"6F",X"FE",X"DC",X"28", + X"05",X"FE",X"DE",X"38",X"CB",X"C9",X"3A",X"10",X"4E",X"B7",X"C8",X"CD",X"00",X"20",X"FE",X"02", + X"28",X"05",X"FE",X"03",X"C8",X"18",X"B9",X"46",X"21",X"CC",X"4F",X"CB",X"48",X"20",X"06",X"CB", + X"50",X"C8",X"CB",X"8E",X"C9",X"CB",X"CE",X"C9",X"23",X"23",X"7D",X"FE",X"E6",X"28",X"F9",X"FE", + X"EE",X"D8",X"33",X"33",X"C9",X"21",X"E8",X"4F",X"06",X"02",X"11",X"E6",X"4F",X"CD",X"61",X"3A", + X"81",X"38",X"05",X"FE",X"05",X"DC",X"6B",X"2D",X"10",X"F0",X"C9",X"3A",X"C6",X"4F",X"E6",X"F8", + X"FE",X"B8",X"C0",X"E5",X"7D",X"FE",X"EA",X"3E",X"FF",X"21",X"CA",X"4F",X"28",X"09",X"CB",X"5E", + X"20",X"1D",X"32",X"EF",X"4F",X"18",X"09",X"2B",X"2B",X"CB",X"5E",X"20",X"12",X"32",X"EE",X"4F", + X"CB",X"DE",X"23",X"36",X"10",X"CD",X"EE",X"31",X"CD",X"57",X"2F",X"21",X"1B",X"4E",X"34",X"E1", + X"C9",X"21",X"00",X"4D",X"11",X"00",X"4E",X"18",X"16",X"21",X"80",X"4D",X"11",X"00",X"4E",X"18", + X"0E",X"21",X"00",X"4E",X"11",X"00",X"4D",X"18",X"06",X"21",X"00",X"4E",X"11",X"80",X"4D",X"01", + X"40",X"00",X"ED",X"B0",X"C9",X"AF",X"77",X"23",X"10",X"FC",X"C9",X"77",X"23",X"0D",X"20",X"FB", + X"C9",X"CD",X"CB",X"2D",X"10",X"FB",X"C9",X"AF",X"18",X"02",X"3E",X"01",X"32",X"03",X"50",X"C9", + X"AF",X"18",X"02",X"3E",X"01",X"32",X"01",X"50",X"C9",X"E1",X"46",X"23",X"5E",X"23",X"56",X"23", + X"7E",X"23",X"12",X"13",X"10",X"FA",X"E9",X"3A",X"20",X"4C",X"47",X"E6",X"03",X"28",X"18",X"CB", + X"50",X"3A",X"00",X"50",X"28",X"07",X"CB",X"67",X"28",X"03",X"3A",X"40",X"50",X"32",X"8D",X"4C", + X"CD",X"37",X"2F",X"79",X"32",X"D5",X"4F",X"21",X"83",X"4C",X"7E",X"E6",X"0E",X"FE",X"02",X"C0", + X"7E",X"2F",X"32",X"07",X"50",X"0F",X"D8",X"C3",X"00",X"18",X"CD",X"E9",X"2D",X"06",X"38",X"40", + X"54",X"49",X"44",X"45",X"52",X"43",X"CD",X"4C",X"2E",X"CD",X"E9",X"2D",X"03",X"D8",X"43",X"50", + X"55",X"01",X"CD",X"E9",X"2D",X"03",X"C5",X"43",X"50",X"55",X"02",X"C9",X"CD",X"E9",X"2D",X"08", + X"CC",X"43",X"45",X"52",X"4F",X"43",X"53",X"40",X"49",X"48",X"C9",X"21",X"00",X"44",X"01",X"00", + X"04",X"CD",X"D1",X"2D",X"C9",X"21",X"00",X"40",X"01",X"00",X"04",X"CD",X"D1",X"2D",X"C9",X"21", + X"00",X"30",X"11",X"40",X"40",X"01",X"C0",X"02",X"7E",X"D7",X"F6",X"F0",X"12",X"13",X"7E",X"F6", + X"F0",X"12",X"13",X"23",X"0D",X"20",X"F1",X"10",X"EF",X"CD",X"E9",X"2D",X"0A",X"C7",X"41",X"E0", + X"E1",X"E1",X"E2",X"D3",X"E3",X"E1",X"E1",X"E2",X"E3",X"CD",X"E9",X"2D",X"0A",X"27",X"42",X"E4", + X"E5",X"E5",X"E6",X"E5",X"E7",X"E5",X"E5",X"E6",X"E7",X"3E",X"D2",X"32",X"48",X"40",X"32",X"54", + X"40",X"32",X"61",X"40",X"32",X"E0",X"41",X"CD",X"F2",X"2E",X"CD",X"80",X"28",X"0A",X"73",X"41", + X"E8",X"E8",X"E8",X"E9",X"EA",X"EA",X"EB",X"E8",X"E8",X"EC",X"CD",X"80",X"28",X"0A",X"76",X"41", + X"ED",X"EE",X"EE",X"EF",X"D1",X"D1",X"ED",X"EE",X"EE",X"EE",X"21",X"94",X"42",X"11",X"DF",X"DE", + X"18",X"06",X"21",X"74",X"41",X"11",X"DD",X"DC",X"CD",X"0F",X"2F",X"72",X"23",X"CD",X"0F",X"2F", + X"73",X"C9",X"21",X"F0",X"41",X"11",X"DB",X"DA",X"18",X"06",X"21",X"E7",X"41",X"11",X"D9",X"D8", + X"CD",X"0F",X"2F",X"72",X"D5",X"11",X"20",X"00",X"19",X"D1",X"CD",X"0F",X"2F",X"73",X"C9",X"7E", + X"CD",X"1F",X"2F",X"C0",X"E5",X"21",X"05",X"4E",X"0E",X"01",X"CD",X"C3",X"2A",X"E1",X"C9",X"D6", + X"CC",X"C8",X"3D",X"C8",X"3D",X"C8",X"3D",X"C9",X"36",X"FF",X"23",X"36",X"FF",X"C9",X"36",X"FF", + X"11",X"20",X"00",X"19",X"36",X"FF",X"C9",X"06",X"04",X"0E",X"01",X"0F",X"D0",X"CB",X"21",X"10", + X"FA",X"C9",X"21",X"40",X"44",X"7E",X"E6",X"E0",X"F6",X"03",X"77",X"23",X"7C",X"FE",X"47",X"20", + X"F4",X"7D",X"FE",X"C0",X"C8",X"18",X"EE",X"2A",X"0E",X"4E",X"7C",X"FE",X"10",X"38",X"03",X"21", + X"00",X"09",X"11",X"02",X"4E",X"CD",X"29",X"3A",X"E5",X"CD",X"39",X"3A",X"22",X"0E",X"4E",X"E1", + X"CD",X"F7",X"39",X"2A",X"C4",X"4F",X"E5",X"2A",X"C6",X"4F",X"E5",X"AF",X"32",X"C7",X"4F",X"ED", + X"53",X"C4",X"4F",X"3A",X"83",X"4C",X"C6",X"60",X"47",X"3A",X"83",X"4C",X"B8",X"20",X"FA",X"E1", + X"22",X"C6",X"4F",X"E1",X"22",X"C4",X"4F",X"C9",X"00",X"8B",X"2F",X"15",X"00",X"FE",X"4E",X"B9", + X"FB",X"83",X"D5",X"95",X"2F",X"15",X"00",X"00",X"4F",X"B9",X"FB",X"83",X"C7",X"9F",X"2F",X"15", + X"00",X"7E",X"4F",X"B2",X"81",X"A7",X"30",X"6D",X"2F",X"15",X"00",X"14",X"4E",X"92",X"CE",X"7A", + X"C0",X"79",X"28",X"15",X"00",X"16",X"4E",X"A6",X"13",X"56",X"36",X"27",X"2F",X"15",X"00",X"1C", + X"4C",X"A6",X"13",X"14",X"E7",X"C7",X"2F",X"15",X"00",X"1D",X"4C",X"92",X"30",X"5C",X"A8",X"A9", + X"2F",X"15",X"00",X"9F",X"4C",X"B0",X"CB",X"98",X"08",X"55",X"2E",X"15",X"00",X"A0",X"4C",X"59", + X"EF",X"9E",X"D6",X"B9",X"2E",X"15",X"00",X"A2",X"4C",X"5C",X"4E",X"4E",X"91",X"31",X"2F",X"EF", + X"0A",X"AA",X"AA",X"A4",X"FC",X"3A",X"AA",X"A0",X"00",X"08",X"FC",X"3A",X"AA",X"AA",X"AA",X"A0", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C7",X"00",X"08",X"FF",X"FF",X"FF",X"FF",X"FF",X"C7", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"00",X"08",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7", + X"8F",X"F1",X"2F",X"F5",X"FF",X"19",X"2F",X"F7",X"00",X"08",X"FF",X"19",X"2F",X"F1",X"2F",X"F7", + X"8F",X"F7",X"8F",X"FB",X"FF",X"70",X"8F",X"F3",X"AA",X"A4",X"FF",X"70",X"8F",X"F7",X"8F",X"F7", + X"8F",X"F7",X"8F",X"FB",X"FF",X"70",X"8F",X"FF",X"FF",X"FF",X"FF",X"70",X"8F",X"F7",X"8F",X"F7", + X"8F",X"F3",X"4F",X"F6",X"FF",X"3A",X"4F",X"FF",X"FF",X"FF",X"FF",X"3A",X"4F",X"F3",X"4F",X"F7", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F1",X"2F",X"F5",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"4F",X"FB",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7", + X"8F",X"F1",X"2F",X"F5",X"FF",X"19",X"2F",X"FF",X"FF",X"F0",X"FF",X"09",X"2F",X"F1",X"2F",X"F7", + X"8F",X"F7",X"8F",X"FB",X"FF",X"70",X"8F",X"FF",X"FF",X"F0",X"FF",X"00",X"8F",X"F7",X"8F",X"F7", + X"8F",X"F7",X"8F",X"FB",X"FF",X"70",X"8F",X"F1",X"2F",X"F0",X"FF",X"00",X"8F",X"F7",X"8F",X"F7", + X"4F",X"F3",X"4F",X"F0",X"00",X"00",X"00",X"00",X"0F",X"F0",X"FF",X"0A",X"4F",X"F3",X"4F",X"F3", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"FF",X"0F",X"FF",X"FF",X"FF",X"FC", + X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"FF",X"0F",X"FF",X"FF",X"FF",X"FD", + X"2F",X"F1",X"2F",X"F0",X"00",X"00",X"00",X"00",X"0F",X"F0",X"FF",X"09",X"2F",X"F1",X"2F",X"F1", + X"8F",X"F7",X"8F",X"FB",X"FF",X"70",X"8F",X"F7",X"8F",X"F0",X"FF",X"00",X"8F",X"F7",X"8F",X"F7", + X"8F",X"F7",X"8F",X"FB",X"FF",X"70",X"8F",X"F7",X"8F",X"F0",X"FF",X"00",X"8F",X"F7",X"8F",X"F7", + X"8F",X"F3",X"4F",X"F6",X"FF",X"3A",X"4F",X"F3",X"4F",X"F0",X"FF",X"00",X"8F",X"F7",X"8F",X"F7", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"70",X"8F",X"F7",X"8F",X"F7", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3A",X"4F",X"F3",X"4F",X"F7", + X"8F",X"F1",X"99",X"92",X"FF",X"19",X"2F",X"F1",X"2F",X"F5",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7", + X"8F",X"F7",X"00",X"08",X"FF",X"3A",X"4F",X"F7",X"8F",X"FB",X"FF",X"FF",X"FF",X"FF",X"FF",X"D7", + X"8F",X"F7",X"00",X"08",X"FF",X"FF",X"FF",X"F7",X"8F",X"FB",X"FF",X"19",X"2F",X"F1",X"99",X"90", + X"8F",X"F3",X"AA",X"A4",X"FF",X"FF",X"FF",X"F3",X"4F",X"F6",X"FF",X"3A",X"4F",X"F7",X"00",X"00", + X"8F",X"FF",X"FF",X"FF",X"FF",X"19",X"2F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"00",X"00", + X"8E",X"FF",X"FF",X"FF",X"FF",X"70",X"8E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"D7",X"00",X"00", + X"09",X"99",X"99",X"92",X"ED",X"70",X"09",X"99",X"99",X"92",X"ED",X"19",X"99",X"90",X"00",X"00", + X"21",X"5E",X"4C",X"CB",X"46",X"C0",X"36",X"82",X"C9",X"21",X"5E",X"4C",X"36",X"81",X"C9",X"00", + X"00",X"21",X"5E",X"4C",X"36",X"00",X"C9",X"21",X"5D",X"4C",X"7E",X"B7",X"C0",X"36",X"82",X"C9", + X"21",X"5D",X"4C",X"36",X"00",X"23",X"23",X"36",X"81",X"C9",X"00",X"00",X"00",X"00",X"21",X"5D", + X"4C",X"36",X"81",X"C9",X"21",X"5D",X"4C",X"36",X"85",X"C9",X"21",X"83",X"4C",X"7E",X"E6",X"FE", + X"FE",X"A8",X"C0",X"7E",X"2F",X"32",X"07",X"50",X"0F",X"D8",X"C3",X"00",X"18",X"CD",X"FA",X"31", + X"3A",X"20",X"4C",X"E6",X"03",X"C8",X"21",X"5C",X"4C",X"7E",X"B7",X"28",X"05",X"CD",X"82",X"32", + X"18",X"5D",X"21",X"5D",X"4C",X"7E",X"23",X"23",X"B6",X"06",X"05",X"21",X"41",X"4C",X"CC",X"C5", + X"2D",X"21",X"5D",X"4C",X"7E",X"23",X"B6",X"21",X"46",X"4C",X"06",X"05",X"CC",X"C5",X"2D",X"21", + X"5E",X"4C",X"7E",X"B7",X"21",X"4B",X"4C",X"06",X"05",X"CC",X"C5",X"2D",X"21",X"5F",X"4C",X"7E", + X"B7",X"C4",X"14",X"34",X"21",X"5E",X"4C",X"7E",X"CB",X"47",X"20",X"04",X"B7",X"C4",X"E1",X"33", + X"21",X"5D",X"4C",X"7E",X"CB",X"47",X"20",X"05",X"CB",X"4F",X"C4",X"EC",X"33",X"21",X"5E",X"4C", + X"7E",X"CB",X"47",X"C4",X"F7",X"33",X"21",X"5D",X"4C",X"7E",X"CB",X"47",X"C4",X"02",X"34",X"C3", + X"08",X"33",X"CB",X"7F",X"CA",X"87",X"33",X"CB",X"BE",X"7E",X"E6",X"03",X"3D",X"21",X"9D",X"32", + X"28",X"2F",X"3D",X"21",X"A9",X"32",X"28",X"29",X"21",X"B5",X"32",X"18",X"24",X"01",X"01",X"00", + X"04",X"21",X"03",X"02",X"01",X"00",X"00",X"18",X"35",X"00",X"02",X"00",X"00",X"25",X"00",X"03", + X"04",X"00",X"00",X"96",X"35",X"00",X"02",X"00",X"00",X"25",X"00",X"02",X"04",X"00",X"00",X"CA", + X"35",X"11",X"50",X"4C",X"01",X"0C",X"00",X"ED",X"B0",X"CD",X"E3",X"2D",X"21",X"40",X"4C",X"06", + X"10",X"C3",X"C5",X"2D",X"AF",X"32",X"58",X"4C",X"2A",X"5A",X"4C",X"7E",X"B7",X"CA",X"14",X"33", + X"CD",X"19",X"33",X"3A",X"54",X"4C",X"CD",X"31",X"33",X"3A",X"50",X"4C",X"B7",X"28",X"14",X"23", + X"3A",X"53",X"4C",X"CD",X"31",X"33",X"3A",X"50",X"4C",X"3D",X"28",X"07",X"23",X"3A",X"52",X"4C", + X"CD",X"31",X"33",X"23",X"22",X"5A",X"4C",X"C9",X"21",X"40",X"4C",X"11",X"50",X"50",X"01",X"10", + X"00",X"ED",X"B0",X"C9",X"11",X"D4",X"32",X"D5",X"E9",X"7E",X"E5",X"E6",X"07",X"21",X"88",X"34", + X"CD",X"52",X"21",X"4E",X"E1",X"3A",X"51",X"4C",X"47",X"AF",X"81",X"10",X"FD",X"32",X"59",X"4C", + X"C9",X"E5",X"F5",X"CD",X"3D",X"33",X"F1",X"4F",X"CD",X"4D",X"33",X"E1",X"C9",X"7E",X"0F",X"0F", + X"E6",X"3E",X"21",X"90",X"34",X"CD",X"52",X"21",X"5E",X"23",X"56",X"EB",X"C9",X"11",X"4B",X"4C", + X"E6",X"03",X"C4",X"6A",X"33",X"11",X"46",X"4C",X"79",X"0F",X"0F",X"4F",X"E6",X"03",X"C4",X"6A", + X"33",X"11",X"41",X"4C",X"79",X"0F",X"0F",X"E6",X"03",X"C8",X"E5",X"3D",X"28",X"09",X"C5",X"44", + X"4D",X"09",X"3D",X"28",X"01",X"09",X"C1",X"EB",X"7B",X"D7",X"77",X"23",X"7A",X"77",X"23",X"7A", + X"D7",X"77",X"23",X"36",X"00",X"E1",X"C9",X"21",X"59",X"4C",X"7E",X"35",X"B7",X"E5",X"CC",X"D4", + X"32",X"E1",X"2B",X"7E",X"34",X"2B",X"B7",X"20",X"0A",X"E5",X"CB",X"BE",X"2B",X"CB",X"BE",X"2B", + X"CB",X"BE",X"E1",X"4F",X"7E",X"11",X"4F",X"4C",X"CD",X"BB",X"33",X"2B",X"7E",X"11",X"4A",X"4C", + X"CD",X"BB",X"33",X"2B",X"7E",X"11",X"45",X"4C",X"C3",X"BB",X"33",X"87",X"C8",X"D8",X"E5",X"21", + X"47",X"34",X"E6",X"1E",X"CD",X"52",X"21",X"7E",X"23",X"66",X"6F",X"79",X"0F",X"E6",X"7F",X"CD", + X"52",X"21",X"7E",X"B7",X"E1",X"28",X"07",X"CB",X"41",X"20",X"01",X"D7",X"12",X"C9",X"CB",X"FE", + X"C9",X"CB",X"BE",X"21",X"D0",X"34",X"11",X"6C",X"4C",X"C3",X"1F",X"34",X"CB",X"BE",X"11",X"60", + X"4C",X"21",X"DC",X"34",X"C3",X"1F",X"34",X"CB",X"BE",X"11",X"6C",X"4C",X"21",X"E8",X"34",X"C3", + X"1F",X"34",X"CB",X"BE",X"21",X"F4",X"34",X"CB",X"57",X"28",X"03",X"21",X"0C",X"35",X"11",X"60", + X"4C",X"C3",X"1F",X"34",X"CB",X"BE",X"21",X"00",X"35",X"11",X"F0",X"4C",X"C3",X"1F",X"34",X"CB", + X"7F",X"28",X"07",X"D5",X"01",X"0C",X"00",X"ED",X"B0",X"D1",X"D5",X"CD",X"38",X"34",X"CD",X"87", + X"33",X"D1",X"CD",X"38",X"34",X"C3",X"E3",X"2D",X"21",X"50",X"4C",X"06",X"0C",X"1A",X"4E",X"77", + X"79",X"12",X"23",X"13",X"10",X"F7",X"C9",X"00",X"00",X"59",X"34",X"62",X"34",X"6A",X"34",X"72", + X"34",X"7C",X"34",X"7E",X"34",X"80",X"34",X"84",X"34",X"36",X"9C",X"EF",X"EB",X"98",X"76",X"66", + X"55",X"00",X"13",X"57",X"99",X"75",X"54",X"33",X"22",X"00",X"7C",X"FF",X"EB",X"A8",X"77",X"65", + X"54",X"00",X"77",X"FF",X"77",X"FF",X"77",X"FF",X"77",X"FF",X"77",X"00",X"55",X"00",X"FF",X"00", + X"5C",X"5C",X"5C",X"00",X"12",X"23",X"34",X"00",X"01",X"02",X"04",X"06",X"08",X"0C",X"10",X"20", + X"00",X"00",X"DC",X"09",X"89",X"0A",X"2B",X"0B",X"F3",X"0B",X"88",X"0C",X"46",X"0D",X"0C",X"0E", + X"E6",X"0E",X"C9",X"0F",X"BA",X"10",X"B8",X"11",X"C6",X"12",X"E4",X"13",X"12",X"15",X"56",X"16", + X"E7",X"17",X"10",X"19",X"8C",X"1A",X"21",X"1C",X"CC",X"1D",X"93",X"1F",X"74",X"21",X"70",X"23", + X"8C",X"25",X"C7",X"27",X"25",X"2A",X"AC",X"2C",X"CF",X"2F",X"20",X"32",X"18",X"35",X"00",X"00", + X"01",X"01",X"00",X"04",X"02",X"00",X"02",X"05",X"00",X"00",X"18",X"36",X"00",X"01",X"00",X"00", + X"1C",X"04",X"04",X"00",X"00",X"00",X"40",X"36",X"01",X"01",X"00",X"0C",X"02",X"00",X"05",X"06", + X"00",X"00",X"6B",X"36",X"01",X"01",X"00",X"0C",X"20",X"06",X"05",X"00",X"00",X"00",X"94",X"36", + X"00",X"01",X"00",X"00",X"10",X"08",X"00",X"00",X"00",X"00",X"D4",X"36",X"01",X"01",X"00",X"08", + X"20",X"06",X"06",X"00",X"00",X"00",X"1C",X"37",X"00",X"3E",X"00",X"32",X"4F",X"50",X"3E",X"01", + X"32",X"4A",X"50",X"3E",X"02",X"32",X"45",X"50",X"F7",X"92",X"92",X"72",X"72",X"4C",X"4C",X"6C", + X"AC",X"74",X"B4",X"92",X"92",X"72",X"72",X"4C",X"4C",X"6C",X"AC",X"74",X"B4",X"92",X"92",X"72", + X"72",X"4C",X"4C",X"6A",X"AA",X"72",X"B2",X"34",X"34",X"72",X"B2",X"72",X"B2",X"24",X"24",X"74", + X"A4",X"74",X"A4",X"92",X"92",X"72",X"72",X"24",X"24",X"74",X"A4",X"74",X"A4",X"92",X"92",X"72", + X"72",X"24",X"24",X"74",X"A4",X"74",X"A4",X"92",X"92",X"72",X"72",X"24",X"24",X"72",X"A2",X"72", + X"A2",X"34",X"34",X"72",X"A2",X"72",X"A2",X"4C",X"4C",X"6C",X"AC",X"74",X"B4",X"F9",X"F9",X"00", + X"AF",X"21",X"5C",X"4C",X"77",X"23",X"77",X"23",X"77",X"23",X"36",X"81",X"CD",X"E0",X"2D",X"00", + X"00",X"00",X"00",X"F7",X"F9",X"F9",X"00",X"3E",X"04",X"32",X"4F",X"50",X"3E",X"06",X"32",X"4A", + X"50",X"F7",X"59",X"81",X"89",X"A9",X"59",X"81",X"89",X"A9",X"51",X"79",X"81",X"A1",X"51",X"79", + X"81",X"A1",X"59",X"81",X"89",X"A9",X"59",X"81",X"89",X"A9",X"61",X"81",X"91",X"B1",X"61",X"81", + X"91",X"B1",X"00",X"21",X"96",X"35",X"E5",X"C3",X"30",X"00",X"00",X"3E",X"06",X"32",X"45",X"50", + X"3E",X"00",X"32",X"4A",X"50",X"F7",X"B3",X"A9",X"B3",X"C1",X"B4",X"FC",X"53",X"49",X"53",X"61", + X"54",X"FC",X"B3",X"B1",X"FB",X"B1",X"C4",X"D4",X"DC",X"00",X"3E",X"01",X"32",X"51",X"4C",X"F7", + X"18",X"20",X"28",X"30",X"38",X"40",X"48",X"50",X"58",X"60",X"68",X"70",X"78",X"80",X"88",X"90", + X"98",X"A0",X"A8",X"B0",X"B8",X"C0",X"C8",X"D0",X"D8",X"E0",X"E8",X"F0",X"F8",X"00",X"3E",X"81", + X"32",X"5C",X"4C",X"CD",X"E0",X"2D",X"F7",X"F9",X"00",X"3E",X"01",X"32",X"4A",X"50",X"3E",X"02", + X"32",X"4F",X"50",X"F7",X"40",X"B8",X"58",X"B0",X"70",X"A8",X"58",X"A0",X"40",X"98",X"50",X"90", + X"68",X"88",X"80",X"80",X"68",X"78",X"50",X"70",X"00",X"21",X"5E",X"4C",X"36",X"00",X"F7",X"F9", + X"00",X"3E",X"04",X"32",X"45",X"50",X"3E",X"07",X"32",X"4A",X"50",X"F7",X"80",X"90",X"A0",X"B0", + X"C0",X"D0",X"E0",X"F0",X"E0",X"D0",X"C0",X"B0",X"A0",X"90",X"80",X"90",X"80",X"90",X"A0",X"B0", + X"C0",X"D0",X"E0",X"00",X"21",X"40",X"36",X"E5",X"C3",X"30",X"00",X"00",X"3E",X"01",X"32",X"4A", + X"50",X"3E",X"03",X"32",X"4F",X"50",X"F7",X"08",X"A8",X"18",X"98",X"28",X"88",X"38",X"78",X"48", + X"68",X"58",X"58",X"68",X"48",X"78",X"38",X"88",X"28",X"98",X"18",X"A8",X"08",X"00",X"21",X"6B", + X"36",X"E5",X"F7",X"F9",X"00",X"3E",X"01",X"32",X"45",X"50",X"3E",X"03",X"32",X"4A",X"50",X"F7", + X"40",X"B8",X"58",X"B0",X"78",X"A8",X"D8",X"A0",X"40",X"98",X"00",X"3E",X"07",X"32",X"45",X"50", + X"3E",X"04",X"32",X"4A",X"50",X"F7",X"50",X"90",X"68",X"88",X"80",X"80",X"68",X"78",X"50",X"70", + X"68",X"68",X"80",X"60",X"98",X"58",X"A8",X"50",X"98",X"48",X"80",X"40",X"00",X"21",X"5D",X"4C", + X"36",X"00",X"F7",X"F9",X"00",X"3E",X"07",X"32",X"45",X"50",X"F7",X"62",X"39",X"39",X"62",X"39", + X"39",X"99",X"99",X"89",X"89",X"7C",X"62",X"39",X"39",X"61",X"39",X"39",X"99",X"99",X"89",X"89", + X"7C",X"00",X"3E",X"07",X"32",X"45",X"50",X"F7",X"61",X"61",X"71",X"71",X"79",X"79",X"89",X"89", + X"79",X"79",X"71",X"71",X"61",X"61",X"72",X"61",X"61",X"71",X"71",X"79",X"79",X"89",X"89",X"79", + X"79",X"71",X"71",X"64",X"00",X"21",X"D4",X"36",X"E5",X"C3",X"30",X"00",X"00",X"3E",X"01",X"32", + X"45",X"50",X"3E",X"01",X"32",X"4A",X"50",X"F7",X"81",X"79",X"91",X"69",X"A1",X"59",X"B1",X"49", + X"C1",X"39",X"B1",X"49",X"A1",X"59",X"91",X"69",X"81",X"79",X"00",X"21",X"78",X"4C",X"34",X"7E", + X"FE",X"0A",X"28",X"07",X"21",X"1C",X"37",X"E5",X"C3",X"30",X"00",X"36",X"00",X"21",X"5D",X"4C", + X"36",X"00",X"F7",X"09",X"97",X"F9",X"B4",X"35",X"11",X"00",X"C6",X"12",X"F9",X"E0",X"00",X"00", + X"11",X"00",X"CD",X"12",X"B0",X"CB",X"96",X"00",X"52",X"37",X"11",X"00",X"DE",X"12",X"B0",X"CB", + X"96",X"50",X"64",X"37",X"11",X"00",X"DF",X"12",X"F9",X"DE",X"00",X"00",X"11",X"00",X"E9",X"12", + X"F9",X"DC",X"06",X"40",X"11",X"00",X"F2",X"12",X"F9",X"DC",X"0C",X"80",X"11",X"00",X"FF",X"12", + X"F9",X"E1",X"00",X"00",X"11",X"00",X"05",X"13",X"F9",X"DD",X"00",X"00",X"11",X"00",X"07",X"13", + X"F9",X"DA",X"00",X"00",X"11",X"00",X"0A",X"13",X"F9",X"DB",X"00",X"00",X"11",X"00",X"12",X"13", + X"B0",X"CB",X"98",X"21",X"6E",X"37",X"11",X"00",X"1F",X"13",X"BF",X"58",X"8D",X"35",X"CB",X"32", + X"11",X"00",X"27",X"13",X"F9",X"DB",X"00",X"00",X"11",X"00",X"2A",X"13",X"F9",X"DA",X"00",X"00", + X"11",X"00",X"44",X"13",X"BF",X"56",X"A4",X"9A",X"9C",X"34",X"11",X"00",X"49",X"13",X"F9",X"DC", + X"00",X"00",X"11",X"00",X"4E",X"13",X"F9",X"DA",X"00",X"00",X"11",X"00",X"5A",X"13",X"F9",X"DB", + X"00",X"00",X"11",X"00",X"5B",X"13",X"BF",X"56",X"59",X"56",X"D4",X"37",X"11",X"00",X"5F",X"0D", + X"C9",X"36",X"81",X"C3",X"E9",X"3E",X"C3",X"A8",X"2B",X"CD",X"3B",X"39",X"3A",X"C1",X"4F",X"B7", + X"CA",X"0A",X"39",X"CB",X"67",X"21",X"E4",X"4F",X"20",X"1B",X"CB",X"77",X"7E",X"20",X"10",X"FE", + X"50",X"28",X"2E",X"FE",X"18",X"CA",X"B2",X"38",X"FE",X"C0",X"28",X"45",X"C3",X"E8",X"38",X"B7", + X"28",X"4B",X"C3",X"E8",X"38",X"CB",X"6F",X"7E",X"20",X"0C",X"FE",X"C0",X"28",X"47",X"FE",X"58", + X"CA",X"DC",X"38",X"C3",X"E8",X"38",X"FE",X"02",X"30",X"F9",X"3E",X"0F",X"32",X"C0",X"4F",X"18", + X"F2",X"2E",X"D8",X"36",X"22",X"23",X"23",X"36",X"22",X"2E",X"E8",X"36",X"10",X"23",X"36",X"60", + X"23",X"36",X"01",X"23",X"36",X"60",X"3E",X"80",X"32",X"92",X"4C",X"32",X"94",X"4C",X"C3",X"E8", + X"38",X"2E",X"D4",X"36",X"44",X"21",X"C1",X"4F",X"CB",X"F6",X"C3",X"E8",X"38",X"21",X"C1",X"4F", + X"CB",X"E6",X"C3",X"E8",X"38",X"2E",X"D8",X"36",X"44",X"23",X"23",X"36",X"44",X"2E",X"C8",X"36", + X"E0",X"23",X"36",X"07",X"23",X"36",X"E0",X"23",X"36",X"05",X"3E",X"40",X"32",X"32",X"42",X"32", + X"52",X"42",X"E5",X"21",X"F7",X"41",X"06",X"07",X"11",X"20",X"00",X"77",X"19",X"10",X"FC",X"E1", + X"18",X"A7",X"21",X"CC",X"4F",X"36",X"C0",X"23",X"36",X"07",X"2E",X"EC",X"36",X"00",X"23",X"36", + X"60",X"2E",X"DC",X"36",X"44",X"3E",X"0D",X"32",X"96",X"4C",X"21",X"06",X"4E",X"36",X"00",X"23", + X"36",X"01",X"23",X"3E",X"FF",X"77",X"32",X"10",X"4E",X"C3",X"E8",X"38",X"2E",X"D4",X"36",X"22", + X"21",X"C1",X"4F",X"CB",X"EE",X"CD",X"94",X"3A",X"CD",X"55",X"2D",X"CD",X"C6",X"15",X"CD",X"40", + X"26",X"CD",X"1D",X"0A",X"CD",X"81",X"09",X"CD",X"6A",X"11",X"CD",X"0A",X"20",X"CD",X"27",X"13", + X"CD",X"E4",X"2A",X"CD",X"97",X"2C",X"CD",X"ED",X"2C",X"C9",X"21",X"E4",X"4F",X"36",X"10",X"23", + X"36",X"60",X"21",X"33",X"39",X"11",X"C4",X"4F",X"01",X"08",X"00",X"ED",X"B0",X"21",X"D4",X"4F", + X"36",X"22",X"3E",X"01",X"32",X"C1",X"4F",X"3E",X"0F",X"32",X"CE",X"4F",X"21",X"05",X"00",X"22", + X"0E",X"4E",X"C9",X"F8",X"01",X"00",X"00",X"E0",X"07",X"E0",X"05",X"3A",X"C8",X"4F",X"CB",X"5F", + X"28",X"04",X"AF",X"32",X"92",X"4C",X"3A",X"CA",X"4F",X"CB",X"5F",X"C8",X"AF",X"32",X"94",X"4C", + X"C9",X"21",X"C1",X"4F",X"7E",X"34",X"FE",X"80",X"D8",X"21",X"C0",X"4F",X"36",X"1F",X"C9",X"7E", + X"FE",X"04",X"D0",X"3A",X"5C",X"4C",X"FE",X"03",X"C0",X"36",X"05",X"C9",X"3E",X"19",X"21",X"2A", + X"46",X"11",X"1D",X"00",X"0E",X"04",X"C3",X"A7",X"28",X"3E",X"19",X"21",X"6A",X"45",X"11",X"1D", + X"00",X"0E",X"04",X"C3",X"A7",X"28",X"11",X"C8",X"4F",X"21",X"EE",X"4F",X"7E",X"B7",X"28",X"0E", + X"35",X"20",X"07",X"06",X"A0",X"CD",X"AE",X"39",X"18",X"04",X"AF",X"32",X"92",X"4C",X"23",X"13", + X"13",X"7E",X"B7",X"C8",X"35",X"06",X"70",X"28",X"05",X"AF",X"32",X"94",X"4C",X"C9",X"D5",X"E5", + X"23",X"23",X"36",X"00",X"E1",X"EB",X"36",X"48",X"23",X"36",X"09",X"7D",X"C6",X"1F",X"6F",X"70", + X"23",X"36",X"B0",X"7D",X"D6",X"31",X"6F",X"36",X"00",X"C6",X"20",X"6F",X"36",X"10",X"EB",X"E5", + X"CD",X"29",X"10",X"E1",X"D1",X"3A",X"48",X"50",X"07",X"C9",X"3A",X"8D",X"50",X"E6",X"C0",X"C8", + X"87",X"87",X"D8",X"00",X"00",X"21",X"12",X"4E",X"34",X"C9",X"3A",X"20",X"4C",X"E6",X"03",X"C8", + X"3A",X"06",X"4E",X"32",X"9F",X"4C",X"C9",X"16",X"01",X"7D",X"1E",X"10",X"FE",X"05",X"C8",X"1E", + X"14",X"FE",X"10",X"C8",X"1E",X"18",X"FE",X"20",X"20",X"06",X"7C",X"B7",X"C8",X"1E",X"38",X"C9", + X"1E",X"1C",X"FE",X"40",X"20",X"06",X"7C",X"B7",X"C8",X"1E",X"3C",X"C9",X"1E",X"30",X"FE",X"80", + X"C8",X"1E",X"34",X"FE",X"60",X"C8",X"1E",X"50",X"C9",X"1A",X"85",X"27",X"12",X"1B",X"1A",X"8C", + X"27",X"12",X"1B",X"1A",X"CE",X"00",X"27",X"12",X"C9",X"7D",X"32",X"0C",X"4E",X"85",X"27",X"6F", + X"7C",X"32",X"0B",X"4E",X"8C",X"27",X"67",X"3E",X"FF",X"32",X"0D",X"4E",X"D0",X"21",X"99",X"99", + X"C9",X"7D",X"D6",X"30",X"6F",X"7B",X"D6",X"30",X"5F",X"1A",X"AE",X"E6",X"80",X"C8",X"C3",X"7E", + X"3A",X"E5",X"D5",X"CD",X"76",X"3A",X"D1",X"E1",X"3E",X"7F",X"20",X"07",X"CD",X"9A",X"2B",X"4F", + X"C3",X"9A",X"2B",X"23",X"23",X"C9",X"7D",X"D6",X"10",X"6F",X"7B",X"D6",X"10",X"5F",X"1A",X"B6", + X"E6",X"0F",X"FE",X"09",X"C8",X"FE",X"06",X"C8",X"FE",X"01",X"C8",X"FE",X"02",X"C8",X"FE",X"04", + X"C8",X"FE",X"08",X"C9",X"3A",X"81",X"4C",X"FE",X"20",X"D8",X"E5",X"21",X"BC",X"42",X"11",X"20", + X"00",X"06",X"05",X"AF",X"86",X"19",X"10",X"FC",X"FE",X"65",X"E1",X"C8",X"3E",X"01",X"32",X"01", + X"4C",X"32",X"20",X"4C",X"C9",X"3E",X"01",X"32",X"04",X"50",X"21",X"D0",X"4C",X"34",X"7E",X"FE", + X"3C",X"D8",X"36",X"00",X"23",X"34",X"7E",X"FE",X"1E",X"D8",X"AF",X"77",X"32",X"04",X"50",X"C9", + X"3A",X"D1",X"4C",X"FE",X"07",X"C8",X"FE",X"0B",X"C8",X"87",X"E6",X"7E",X"21",X"BD",X"0E",X"CD", + X"52",X"21",X"3A",X"C0",X"50",X"E6",X"00",X"00",X"C9",X"23",X"3A",X"80",X"50",X"86",X"C0",X"B0", + X"C9",X"21",X"9D",X"4C",X"7E",X"B7",X"C8",X"35",X"C0",X"23",X"36",X"00",X"C9",X"E5",X"D5",X"7D", + X"C6",X"10",X"6F",X"7E",X"FE",X"88",X"28",X"06",X"56",X"21",X"32",X"3B",X"18",X"06",X"23",X"56", + X"2B",X"21",X"3E",X"3B",X"CD",X"1D",X"3B",X"D1",X"E1",X"D4",X"C5",X"1A",X"C9",X"3A",X"9E",X"4C", + X"FE",X"0A",X"38",X"02",X"3E",X"0A",X"E6",X"0E",X"CD",X"52",X"21",X"7A",X"BE",X"D8",X"23",X"BE", + X"3F",X"C9",X"18",X"FF",X"20",X"F8",X"28",X"F0",X"30",X"E8",X"40",X"D8",X"50",X"C8",X"20",X"FF", + X"30",X"FF",X"40",X"FF",X"50",X"F8",X"60",X"F0",X"6C",X"E8",X"3A",X"83",X"4C",X"E6",X"7F",X"FE", + X"75",X"C0",X"ED",X"5F",X"85",X"83",X"E6",X"03",X"CD",X"8F",X"3B",X"1A",X"CB",X"7F",X"C0",X"E6", + X"7F",X"FE",X"10",X"D0",X"E5",X"CD",X"A7",X"3B",X"E1",X"C0",X"E5",X"7C",X"C6",X"04",X"67",X"CD", + X"B4",X"3B",X"E1",X"C0",X"D5",X"E5",X"CD",X"D7",X"3B",X"D1",X"E1",X"34",X"CB",X"FE",X"EB",X"06", + X"BE",X"70",X"23",X"04",X"70",X"04",X"CD",X"50",X"21",X"2B",X"70",X"04",X"23",X"70",X"C9",X"11", + X"1E",X"4E",X"21",X"A8",X"42",X"C8",X"13",X"21",X"28",X"41",X"3D",X"C8",X"13",X"21",X"B1",X"42", + X"3D",X"C8",X"13",X"21",X"31",X"41",X"C9",X"7E",X"23",X"A6",X"F5",X"CD",X"50",X"21",X"F1",X"A6", + X"2B",X"A6",X"3C",X"C9",X"7E",X"E6",X"1F",X"FE",X"02",X"28",X"07",X"FE",X"04",X"28",X"03",X"FE", + X"06",X"C0",X"47",X"23",X"7E",X"E6",X"1F",X"B8",X"C0",X"CD",X"50",X"21",X"7E",X"E6",X"1F",X"B8", + X"C0",X"2B",X"7E",X"E6",X"1F",X"B8",X"C9",X"CD",X"E5",X"3B",X"21",X"1E",X"4E",X"06",X"04",X"CB", + X"BE",X"23",X"10",X"FB",X"C9",X"11",X"1E",X"4E",X"21",X"A8",X"42",X"CD",X"FD",X"3B",X"21",X"28", + X"41",X"CD",X"FD",X"3B",X"21",X"B1",X"42",X"CD",X"FD",X"3B",X"21",X"31",X"41",X"1A",X"13",X"87", + X"D0",X"06",X"FF",X"70",X"23",X"70",X"CD",X"50",X"21",X"70",X"2B",X"70",X"C9",X"7A",X"D6",X"BE", + X"C8",X"3D",X"C8",X"3D",X"C8",X"3D",X"C9",X"2A",X"E4",X"4F",X"7D",X"FE",X"B8",X"28",X"1B",X"FE", + X"58",X"C0",X"7C",X"FE",X"C0",X"28",X"0B",X"FE",X"78",X"C0",X"21",X"31",X"41",X"11",X"21",X"4E", + X"18",X"1E",X"21",X"28",X"41",X"11",X"1F",X"4E",X"18",X"16",X"7C",X"FE",X"C0",X"28",X"0B",X"FE", + X"78",X"C0",X"21",X"B1",X"42",X"11",X"20",X"4E",X"18",X"06",X"21",X"A8",X"42",X"11",X"1E",X"4E", + X"1A",X"07",X"D0",X"EB",X"CB",X"BE",X"EB",X"CD",X"01",X"3C",X"21",X"88",X"18",X"22",X"E4",X"4F", + X"C9",X"11",X"1E",X"4E",X"21",X"A8",X"42",X"CD",X"79",X"3C",X"21",X"28",X"41",X"CD",X"79",X"3C", + X"21",X"B1",X"42",X"CD",X"79",X"3C",X"21",X"31",X"41",X"1A",X"13",X"87",X"D0",X"C3",X"7F",X"3B", + X"3A",X"AE",X"4C",X"B7",X"28",X"06",X"CD",X"C4",X"1D",X"C3",X"86",X"03",X"3A",X"AC",X"4C",X"07", + X"38",X"0D",X"21",X"AF",X"4C",X"35",X"20",X"04",X"AF",X"32",X"AC",X"4C",X"C3",X"86",X"03",X"3E", + X"01",X"32",X"AC",X"4C",X"3E",X"FF",X"32",X"AF",X"4C",X"21",X"E0",X"4F",X"06",X"20",X"36",X"00", + X"23",X"10",X"FB",X"3E",X"03",X"CD",X"5B",X"2E",X"CD",X"50",X"0D",X"CD",X"38",X"22",X"CD",X"DD", + X"3C",X"CD",X"C7",X"3C",X"C3",X"86",X"03",X"3E",X"01",X"01",X"E0",X"FF",X"11",X"40",X"4E",X"21", + X"CB",X"42",X"F5",X"CD",X"0F",X"3D",X"F1",X"3C",X"FE",X"06",X"20",X"F6",X"C9",X"CD",X"DF",X"0C", + X"CD",X"02",X"0D",X"CD",X"80",X"28",X"0F",X"08",X"41",X"53",X"52",X"45",X"59",X"41",X"4C",X"50", + X"40",X"54",X"55",X"4F",X"40",X"52",X"41",X"46",X"21",X"08",X"45",X"06",X"0F",X"36",X"01",X"CD", + X"50",X"21",X"10",X"F9",X"21",X"CB",X"46",X"06",X"0C",X"36",X"05",X"23",X"10",X"FB",X"C9",X"E5", + X"77",X"09",X"09",X"3E",X"03",X"08",X"1A",X"77",X"13",X"09",X"08",X"3D",X"20",X"F7",X"09",X"CD", + X"26",X"3D",X"E1",X"23",X"23",X"C9",X"3E",X"03",X"08",X"1A",X"D7",X"E6",X"0F",X"20",X"15",X"09", + X"1A",X"E6",X"0F",X"20",X"14",X"09",X"13",X"08",X"3D",X"20",X"ED",X"08",X"36",X"00",X"C9",X"08", + X"1A",X"D7",X"E6",X"0F",X"77",X"09",X"1A",X"E6",X"0F",X"77",X"09",X"13",X"08",X"3D",X"20",X"EF", + X"18",X"E9",X"78",X"32",X"68",X"4E",X"B7",X"20",X"05",X"7E",X"E6",X"7D",X"77",X"C9",X"CB",X"7E", + X"20",X"2D",X"CD",X"F9",X"0E",X"3A",X"AF",X"4C",X"B7",X"C0",X"21",X"AE",X"4C",X"18",X"EA",X"79", + X"32",X"68",X"4E",X"B7",X"20",X"08",X"7E",X"E6",X"86",X"77",X"CD",X"D7",X"2D",X"C9",X"CB",X"76", + X"20",X"2D",X"CD",X"F9",X"0E",X"3A",X"AF",X"4C",X"B7",X"C0",X"21",X"AE",X"4C",X"18",X"E7",X"CB", + X"BE",X"F5",X"CD",X"D7",X"2D",X"F1",X"CD",X"D8",X"3D",X"CD",X"6B",X"0F",X"36",X"41",X"AF",X"12", + X"CD",X"80",X"28",X"07",X"84",X"41",X"01",X"52",X"45",X"59",X"41",X"4C",X"50",X"18",X"23",X"CB", + X"B6",X"F5",X"3A",X"00",X"50",X"CB",X"67",X"C4",X"DA",X"2D",X"F1",X"CD",X"D8",X"3D",X"CD",X"6B", + X"0F",X"36",X"41",X"AF",X"12",X"CD",X"80",X"28",X"07",X"84",X"41",X"02",X"52",X"45",X"59",X"41", + X"4C",X"50",X"3E",X"40",X"32",X"AF",X"4C",X"C9",X"F5",X"3E",X"03",X"CD",X"5B",X"2E",X"CD",X"50", + X"0D",X"CD",X"38",X"22",X"CD",X"E3",X"3C",X"CD",X"C7",X"3C",X"CD",X"F1",X"3D",X"F1",X"C3",X"9B", + X"3E",X"CD",X"80",X"28",X"15",X"C6",X"40",X"53",X"4C",X"41",X"49",X"54",X"49",X"4E",X"49",X"40", + X"52",X"55",X"4F",X"59",X"40",X"4E",X"47",X"49",X"53",X"40",X"4F",X"54",X"21",X"C6",X"44",X"06", + X"15",X"36",X"05",X"CD",X"50",X"21",X"10",X"F9",X"CD",X"80",X"28",X"13",X"D5",X"40",X"48",X"54", + X"49",X"57",X"40",X"4C",X"41",X"49",X"54",X"49",X"4E",X"49",X"40",X"54",X"43",X"45",X"4C",X"45", + X"53",X"CD",X"80",X"28",X"10",X"16",X"41",X"54",X"46",X"45",X"4C",X"40",X"40",X"44",X"4E",X"41", + X"40",X"40",X"54",X"48",X"47",X"49",X"52",X"CD",X"80",X"28",X"0D",X"78",X"41",X"4E",X"57",X"4F", + X"44",X"40",X"48",X"54",X"49",X"57",X"40",X"42",X"55",X"52",X"CD",X"80",X"28",X"0D",X"79",X"41", + X"50",X"55",X"40",X"48",X"54",X"49",X"57",X"40",X"45",X"54",X"49",X"52",X"57",X"21",X"D5",X"44", + X"0E",X"05",X"E5",X"06",X"13",X"36",X"05",X"CD",X"50",X"21",X"10",X"F9",X"E1",X"23",X"0D",X"20", + X"F1",X"CD",X"80",X"28",X"07",X"DB",X"41",X"00",X"04",X"40",X"45",X"4D",X"49",X"54",X"21",X"84", + X"45",X"06",X"07",X"36",X"07",X"CD",X"50",X"21",X"10",X"F9",X"C9",X"21",X"0B",X"45",X"D6",X"05", + X"ED",X"44",X"87",X"CD",X"52",X"21",X"06",X"0F",X"36",X"01",X"CD",X"50",X"21",X"10",X"F9",X"C9", + X"3A",X"83",X"4C",X"E6",X"3F",X"FE",X"17",X"C0",X"21",X"AF",X"4C",X"7E",X"D6",X"01",X"27",X"77", + X"D7",X"E6",X"0F",X"20",X"02",X"3E",X"40",X"32",X"FB",X"41",X"7E",X"E6",X"0F",X"32",X"DB",X"41", + X"C9",X"00",X"19",X"19",X"B8",X"29",X"B3",X"B0",X"C2",X"3E",X"11",X"00",X"1C",X"19",X"B8",X"29", + X"3A",X"80",X"50",X"CB",X"6F",X"C8",X"C3",X"A8",X"2B",X"3A",X"80",X"50",X"E6",X"3F",X"C0",X"3E", + X"03",X"CD",X"5B",X"2E",X"3E",X"40",X"CD",X"65",X"2E",X"CD",X"80",X"28",X"06",X"89",X"40",X"57", + X"53",X"40",X"50",X"49",X"44",X"0E",X"00",X"3A",X"80",X"50",X"E6",X"3F",X"47",X"3A",X"80",X"50", + X"A8",X"E6",X"3F",X"B1",X"FE",X"3F",X"28",X"06",X"4F",X"32",X"C0",X"50",X"18",X"EF",X"3E",X"40", + X"CD",X"65",X"2E",X"21",X"D0",X"4C",X"36",X"00",X"23",X"10",X"FB",X"CD",X"80",X"28",X"0A",X"83", + X"40",X"4B",X"48",X"43",X"40",X"4D",X"55",X"54",X"53",X"55",X"43",X"3E",X"01",X"32",X"04",X"50", + X"32",X"07",X"50",X"0E",X"04",X"32",X"C0",X"50",X"10",X"FB",X"0D",X"20",X"F8",X"AF",X"32",X"04", + X"50",X"21",X"D0",X"4C",X"77",X"23",X"77",X"23",X"77",X"21",X"D0",X"4C",X"7E",X"2F",X"32",X"07", + X"50",X"32",X"C0",X"50",X"2F",X"34",X"FE",X"78",X"20",X"08",X"36",X"00",X"23",X"34",X"7E",X"FE", + X"1E",X"C8",X"06",X"00",X"10",X"FE",X"3A",X"D0",X"4C",X"FE",X"10",X"38",X"DC",X"FE",X"6E",X"30", + X"D8",X"CD",X"D0",X"3A",X"28",X"D3",X"CD",X"80",X"28",X"05",X"85",X"40",X"52",X"52",X"4F",X"52", + X"45",X"32",X"C0",X"50",X"18",X"FB",X"CD",X"80",X"28",X"05",X"85",X"40",X"4B",X"4F",X"40",X"40", + X"40",X"18",X"EE",X"00",X"2B",X"C9",X"79",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"FE",X"0A",X"38", + X"02",X"C6",X"37",X"77",X"79",X"2B",X"E6",X"0F",X"FE",X"0A",X"38",X"02",X"C6",X"37",X"77",X"2B", + X"C9",X"3C",X"8A",X"20",X"B6",X"3F",X"11",X"00",X"CD",X"80",X"3F",X"F5",X"F3",X"3A",X"00",X"50", + X"CB",X"67",X"32",X"C0",X"50",X"28",X"F6",X"3A",X"00",X"50",X"CB",X"67",X"32",X"C0",X"50",X"20", + X"F6",X"E5",X"21",X"00",X"50",X"36",X"00",X"36",X"01",X"E1",X"F1",X"FB",X"C9",X"3F",X"11",X"00", + X"D2",X"1A",X"F9",X"DA",X"00",X"00",X"11",X"00",X"DC",X"1A",X"B8",X"29",X"BF",X"03",X"DE",X"A4"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..a715bc70 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"23",X"31",X"B0",X"4F",X"ED",X"56",X"18",X"79",X"A0",X"C3",X"06",X"A0",X"C3",X"09",X"A0",X"C3", + X"0F",X"0F",X"0F",X"0F",X"C9",X"C3",X"12",X"A0",X"E1",X"D1",X"C1",X"00",X"00",X"C7",X"C3",X"1E", + X"A0",X"00",X"00",X"00",X"00",X"32",X"3C",X"00",X"00",X"10",X"48",X"00",X"00",X"00",X"00",X"03", + X"E1",X"22",X"5A",X"4C",X"C9",X"00",X"00",X"18",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5", + X"D9",X"C5",X"D5",X"E5",X"08",X"F5",X"21",X"00",X"50",X"36",X"00",X"32",X"C0",X"50",X"2E",X"07", + X"36",X"01",X"CD",X"D2",X"0B",X"CD",X"DD",X"2B",X"CD",X"D6",X"13",X"CD",X"F7",X"2D",X"CD",X"00", + X"28",X"CD",X"0D",X"32",X"CD",X"50",X"10",X"3E",X"FF",X"32",X"22",X"4C",X"21",X"00",X"50",X"36", + X"01",X"F1",X"08",X"E1",X"D1",X"C1",X"D9",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"FB", + X"C9",X"21",X"07",X"50",X"36",X"00",X"2B",X"7C",X"FE",X"3F",X"32",X"C0",X"50",X"20",X"F5",X"16", + X"00",X"D9",X"21",X"00",X"40",X"36",X"00",X"23",X"7C",X"32",X"C0",X"50",X"FE",X"51",X"20",X"F5", + X"3E",X"00",X"32",X"03",X"50",X"21",X"00",X"40",X"55",X"5D",X"DD",X"21",X"B1",X"00",X"C3",X"10", + X"01",X"21",X"00",X"44",X"DD",X"21",X"BB",X"00",X"C3",X"10",X"01",X"21",X"00",X"4C",X"DD",X"21", + X"C5",X"00",X"C3",X"10",X"01",X"21",X"00",X"40",X"36",X"40",X"23",X"7C",X"FE",X"44",X"20",X"F8", + X"36",X"03",X"23",X"7C",X"FE",X"48",X"20",X"F8",X"7A",X"B3",X"CA",X"6C",X"01",X"01",X"E0",X"FF", + X"21",X"A6",X"42",X"36",X"42",X"09",X"36",X"41",X"09",X"36",X"44",X"09",X"36",X"40",X"09",X"36", + X"52",X"09",X"36",X"41",X"09",X"36",X"4D",X"09",X"36",X"40",X"DD",X"21",X"01",X"01",X"C3",X"4F", + X"01",X"09",X"53",X"DD",X"21",X"0A",X"01",X"C3",X"4F",X"01",X"16",X"FF",X"D9",X"C3",X"6C",X"01", + X"7E",X"B7",X"FD",X"21",X"18",X"01",X"20",X"2E",X"3E",X"01",X"47",X"77",X"AE",X"FD",X"21",X"23", + X"01",X"20",X"23",X"78",X"37",X"8F",X"32",X"C0",X"50",X"30",X"EF",X"23",X"7D",X"06",X"4F",X"32", + X"07",X"50",X"10",X"FB",X"B7",X"20",X"D9",X"7C",X"FE",X"44",X"28",X"08",X"FE",X"48",X"28",X"04", + X"FE",X"50",X"20",X"CC",X"DD",X"E9",X"B3",X"5F",X"7A",X"B7",X"20",X"01",X"54",X"FD",X"E9",X"09", + X"7A",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"FE",X"0A",X"38",X"02",X"C6",X"37",X"77",X"09",X"7A", + X"E6",X"0F",X"FE",X"0A",X"38",X"02",X"C6",X"37",X"77",X"09",X"DD",X"E9",X"21",X"00",X"00",X"11", + X"04",X"01",X"01",X"00",X"10",X"3E",X"FF",X"AE",X"32",X"07",X"50",X"32",X"C0",X"50",X"23",X"0D", + X"20",X"F5",X"10",X"F3",X"B7",X"FD",X"21",X"8B",X"01",X"20",X"5A",X"14",X"1D",X"20",X"E3",X"CB", + X"7A",X"20",X"08",X"D9",X"7A",X"B7",X"20",X"03",X"C3",X"27",X"02",X"21",X"00",X"20",X"10",X"FE", + X"32",X"C0",X"50",X"2D",X"20",X"F8",X"D9",X"21",X"BA",X"42",X"01",X"E0",X"FF",X"36",X"44",X"09", + X"36",X"49",X"09",X"36",X"50",X"09",X"09",X"36",X"53",X"09",X"36",X"57",X"09",X"3A",X"00",X"50", + X"57",X"DD",X"21",X"C8",X"01",X"C3",X"4F",X"01",X"3A",X"40",X"50",X"57",X"DD",X"21",X"D2",X"01", + X"18",X"F3",X"3A",X"80",X"50",X"57",X"DD",X"21",X"DC",X"01",X"18",X"E9",X"D9",X"25",X"20",X"BE", + X"C7",X"25",X"20",X"BA",X"C7",X"08",X"7A",X"87",X"CB",X"FA",X"E6",X"3F",X"D9",X"21",X"A8",X"42", + X"85",X"6F",X"30",X"01",X"24",X"01",X"E0",X"FF",X"36",X"42",X"09",X"36",X"41",X"09",X"36",X"44", + X"09",X"09",X"36",X"50",X"09",X"36",X"52",X"09",X"36",X"4F",X"09",X"36",X"4D",X"09",X"D9",X"7A", + X"D9",X"E6",X"0F",X"57",X"DD",X"21",X"1B",X"02",X"C3",X"4F",X"01",X"08",X"57",X"DD",X"21",X"24", + X"02",X"C3",X"4F",X"01",X"D9",X"FD",X"E9",X"CD",X"D7",X"2D",X"CD",X"03",X"38",X"CD",X"00",X"38", + X"CD",X"66",X"0B",X"21",X"00",X"10",X"06",X"2F",X"7D",X"32",X"C0",X"50",X"32",X"07",X"50",X"10", + X"F7",X"2B",X"7D",X"B4",X"20",X"F0",X"21",X"00",X"40",X"36",X"00",X"23",X"7C",X"FE",X"51",X"20", + X"F8",X"3E",X"03",X"CD",X"5B",X"2E",X"3E",X"40",X"CD",X"65",X"2E",X"3E",X"01",X"32",X"00",X"50", + X"3A",X"80",X"50",X"32",X"00",X"4C",X"CD",X"E7",X"1B",X"CD",X"2A",X"2E",X"3E",X"08",X"32",X"20", + X"4C",X"CD",X"A8",X"1D",X"CD",X"9F",X"1C",X"FB",X"CD",X"D7",X"2D",X"21",X"90",X"4C",X"CD",X"5F", + X"39",X"7E",X"35",X"B7",X"20",X"5C",X"34",X"21",X"20",X"4C",X"3A",X"1E",X"4C",X"B7",X"28",X"0B", + X"7E",X"E6",X"03",X"20",X"06",X"CC",X"54",X"0C",X"C3",X"86",X"03",X"AF",X"32",X"AD",X"4C",X"CB", + X"7E",X"C4",X"9F",X"03",X"21",X"20",X"4C",X"7E",X"CB",X"77",X"E5",X"C4",X"7F",X"04",X"E1",X"CB", + X"6E",X"E5",X"C4",X"24",X"04",X"E1",X"7E",X"E6",X"03",X"20",X"11",X"CB",X"5E",X"28",X"0D",X"3A", + X"AC",X"4C",X"B7",X"00",X"00",X"00",X"CD",X"75",X"05",X"F2",X"89",X"03",X"21",X"87",X"4C",X"7E", + X"35",X"B7",X"20",X"35",X"3A",X"5C",X"4C",X"FE",X"01",X"20",X"04",X"36",X"01",X"18",X"2A",X"34", + X"18",X"29",X"21",X"C4",X"4F",X"47",X"FE",X"FF",X"20",X"02",X"36",X"CC",X"E6",X"9F",X"FE",X"9F", + X"20",X"05",X"7E",X"C6",X"04",X"18",X"0F",X"78",X"E6",X"1F",X"FE",X"1F",X"20",X"7F",X"CB",X"68", + X"3E",X"DC",X"28",X"02",X"3E",X"78",X"77",X"18",X"74",X"18",X"7E",X"CD",X"52",X"1D",X"3A",X"80", + X"50",X"CB",X"6F",X"20",X"06",X"CD",X"4A",X"3B",X"CD",X"17",X"3C",X"CD",X"55",X"2D",X"CD",X"4F", + X"0A",X"CD",X"E1",X"08",X"CD",X"8F",X"08",X"CD",X"B7",X"08",X"CD",X"1B",X"18",X"CD",X"00",X"08", + X"3A",X"06",X"4E",X"FE",X"01",X"D4",X"E0",X"1A",X"CD",X"AA",X"0D",X"CD",X"5B",X"1C",X"CD",X"3F", + X"24",X"CD",X"C6",X"15",X"CD",X"86",X"39",X"CD",X"40",X"26",X"CD",X"B0",X"1B",X"CD",X"27",X"13", + X"CD",X"AA",X"14",X"CD",X"1D",X"0A",X"CD",X"81",X"09",X"CD",X"F1",X"3A",X"CD",X"93",X"2A",X"CD", + X"06",X"38",X"CD",X"7D",X"12",X"CD",X"CC",X"10",X"CD",X"75",X"10",X"CD",X"6A",X"11",X"CD",X"0A", + X"20",X"CD",X"6C",X"23",X"CD",X"B6",X"1C",X"CD",X"C0",X"19",X"CD",X"E4",X"2A",X"CD",X"97",X"2C", + X"CD",X"ED",X"2C",X"CD",X"F6",X"11",X"CD",X"BC",X"23",X"CD",X"FC",X"23",X"CD",X"4C",X"2E",X"AF", + X"32",X"22",X"4C",X"3A",X"22",X"4C",X"B7",X"32",X"C0",X"50",X"C2",X"7B",X"02",X"18",X"F4",X"3E", + X"43",X"CD",X"5B",X"2E",X"AF",X"32",X"A2",X"4C",X"CD",X"2A",X"2E",X"21",X"B0",X"4F",X"06",X"50", + X"CD",X"C5",X"2D",X"21",X"80",X"4E",X"CD",X"C5",X"2D",X"32",X"8E",X"4C",X"CD",X"6F",X"2E",X"CD", + X"00",X"10",X"CD",X"5A",X"2C",X"3E",X"80",X"32",X"CE",X"4F",X"21",X"00",X"4E",X"06",X"40",X"CD", + X"C5",X"2D",X"CD",X"38",X"22",X"3E",X"05",X"32",X"0E",X"4E",X"21",X"20",X"4C",X"7E",X"E6",X"03", + X"CB",X"BE",X"CA",X"1B",X"24",X"CD",X"B1",X"2D",X"CD",X"B9",X"2D",X"3E",X"C0",X"32",X"87",X"4C", + X"21",X"10",X"40",X"06",X"10",X"CD",X"66",X"23",X"CD",X"AC",X"21",X"CD",X"EA",X"39",X"CD",X"38", + X"22",X"3E",X"81",X"32",X"5C",X"4C",X"3E",X"C7",X"32",X"AE",X"4C",X"CD",X"D7",X"2D",X"3A",X"C0", + X"50",X"E6",X"30",X"FE",X"10",X"C9",X"3A",X"80",X"50",X"E6",X"C0",X"C8",X"00",X"00",X"21",X"12", + X"4E",X"36",X"30",X"C9",X"CB",X"AE",X"E5",X"CD",X"C6",X"12",X"21",X"B0",X"4F",X"06",X"50",X"CD", + X"C5",X"2D",X"CD",X"42",X"2F",X"CD",X"6F",X"2E",X"CD",X"00",X"10",X"CD",X"5A",X"2C",X"21",X"03", + X"4E",X"06",X"03",X"CD",X"C5",X"2D",X"34",X"23",X"77",X"23",X"77",X"32",X"10",X"4E",X"32",X"11", + X"4E",X"32",X"1B",X"4E",X"3E",X"C0",X"32",X"87",X"4C",X"CD",X"EA",X"39",X"CD",X"38",X"22",X"CD", + X"9D",X"23",X"CD",X"AC",X"21",X"01",X"3F",X"C0",X"3E",X"80",X"32",X"CE",X"4F",X"E1",X"3A",X"C1", + X"50",X"A1",X"B9",X"C9",X"3A",X"80",X"50",X"A0",X"B8",X"C8",X"00",X"00",X"C3",X"C3",X"2B",X"CB", + X"B6",X"E5",X"4E",X"3E",X"03",X"A1",X"28",X"56",X"EB",X"21",X"B0",X"4F",X"06",X"50",X"CD",X"C5", + X"2D",X"21",X"07",X"4E",X"7E",X"B7",X"28",X"12",X"E6",X"81",X"EA",X"AA",X"04",X"3A",X"12",X"4E", + X"FE",X"20",X"30",X"04",X"36",X"00",X"18",X"02",X"36",X"FF",X"21",X"1C",X"4C",X"CB",X"51",X"20", + X"16",X"35",X"20",X"0D",X"CB",X"81",X"CB",X"49",X"20",X"3C",X"C5",X"CD",X"B1",X"2D",X"C1",X"18", + X"1D",X"CB",X"49",X"20",X"31",X"18",X"62",X"23",X"35",X"20",X"0D",X"CB",X"89",X"CB",X"41",X"20", + X"36",X"C5",X"CD",X"B9",X"2D",X"C1",X"18",X"06",X"CB",X"41",X"20",X"2B",X"18",X"4B",X"CD",X"E0", + X"2D",X"3E",X"00",X"32",X"5C",X"4C",X"CB",X"D9",X"CB",X"91",X"CD",X"D7",X"2D",X"E1",X"71",X"3E", + X"81",X"32",X"AC",X"4C",X"18",X"52",X"E5",X"D5",X"C5",X"CD",X"E5",X"3B",X"CD",X"F1",X"25",X"CD", + X"B1",X"2D",X"CD",X"A9",X"2D",X"18",X"0F",X"E5",X"D5",X"C5",X"CD",X"E5",X"3B",X"CD",X"F1",X"25", + X"CD",X"B9",X"2D",X"CD",X"A1",X"2D",X"C1",X"D1",X"E1",X"3E",X"04",X"A9",X"EB",X"77",X"CD",X"6C", + X"24",X"CD",X"27",X"26",X"CD",X"61",X"3C",X"18",X"02",X"EB",X"71",X"CD",X"5A",X"2C",X"E1",X"3A", + X"00",X"50",X"CB",X"67",X"20",X"05",X"CD",X"D7",X"2D",X"18",X"08",X"CB",X"56",X"CC",X"D7",X"2D", + X"C4",X"DA",X"2D",X"3E",X"81",X"32",X"5C",X"4C",X"3E",X"8F",X"32",X"87",X"4C",X"CD",X"EA",X"39", + X"CD",X"38",X"22",X"CD",X"AC",X"21",X"CD",X"29",X"10",X"3E",X"80",X"32",X"CE",X"4F",X"0E",X"C0", + X"3A",X"C2",X"50",X"E6",X"3F",X"FE",X"2F",X"C9",X"3A",X"81",X"50",X"A1",X"B9",X"C0",X"00",X"00", + X"21",X"03",X"4E",X"35",X"C9",X"CD",X"C5",X"05",X"21",X"87",X"4C",X"36",X"C0",X"21",X"C0",X"4F", + X"7E",X"B7",X"20",X"06",X"CD",X"50",X"0D",X"C3",X"E1",X"05",X"FE",X"01",X"CA",X"05",X"06",X"FE", + X"03",X"CA",X"5D",X"06",X"FE",X"07",X"CA",X"09",X"38",X"FE",X"0F",X"CA",X"51",X"39",X"FE",X"1F", + X"C0",X"3E",X"80",X"32",X"20",X"4C",X"AF",X"32",X"C0",X"4F",X"32",X"A2",X"4C",X"32",X"C1",X"4F", + X"3A",X"C3",X"50",X"E6",X"3F",X"FE",X"3C",X"C9",X"3A",X"85",X"50",X"E6",X"C0",X"FE",X"C0",X"C8", + X"00",X"00",X"C2",X"5D",X"06",X"21",X"A2",X"4C",X"7E",X"FE",X"0A",X"D0",X"3A",X"83",X"4C",X"E6", + X"1F",X"FE",X"10",X"C0",X"7E",X"34",X"FE",X"04",X"CA",X"DF",X"0C",X"FE",X"06",X"CA",X"02",X"0D", + X"C9",X"21",X"C4",X"4F",X"36",X"FA",X"23",X"36",X"01",X"21",X"E4",X"4F",X"36",X"FF",X"23",X"36", + X"CC",X"3E",X"81",X"32",X"CE",X"4F",X"3E",X"01",X"32",X"C0",X"4F",X"3E",X"06",X"32",X"19",X"4E", + X"AF",X"32",X"06",X"4E",X"C9",X"21",X"D4",X"4F",X"36",X"44",X"CD",X"40",X"26",X"CD",X"E4",X"2A", + X"21",X"E4",X"4F",X"7E",X"FE",X"02",X"30",X"06",X"3E",X"03",X"32",X"C0",X"4F",X"C9",X"E6",X"06", + X"C0",X"7E",X"E6",X"FE",X"21",X"47",X"06",X"06",X"0B",X"BE",X"23",X"28",X"04",X"23",X"10",X"F9", + X"C9",X"7E",X"F5",X"21",X"E4",X"4F",X"CD",X"7F",X"2C",X"21",X"00",X"40",X"19",X"F1",X"2B",X"77", + X"7C",X"C6",X"04",X"67",X"36",X"01",X"C9",X"B8",X"43",X"B0",X"52",X"A8",X"55",X"A0",X"53",X"98", + X"48",X"88",X"52",X"80",X"4F",X"78",X"4C",X"70",X"4C",X"68",X"45",X"60",X"52",X"01",X"F8",X"1C", + X"21",X"53",X"40",X"CD",X"9F",X"06",X"0E",X"FF",X"23",X"CD",X"9F",X"06",X"23",X"CD",X"9F",X"06", + X"0E",X"F7",X"23",X"CD",X"9F",X"06",X"21",X"73",X"41",X"01",X"5B",X"0A",X"CD",X"9F",X"06",X"21", + X"76",X"41",X"0E",X"EE",X"CD",X"9F",X"06",X"21",X"54",X"40",X"36",X"D2",X"23",X"36",X"FC",X"21", + X"B4",X"43",X"36",X"FE",X"23",X"36",X"FD",X"3E",X"07",X"32",X"C0",X"4F",X"C3",X"DA",X"2E",X"C5", + X"E5",X"11",X"20",X"00",X"71",X"19",X"10",X"FC",X"E1",X"C1",X"C9",X"CD",X"ED",X"06",X"2A",X"80", + X"4C",X"E5",X"3A",X"82",X"4C",X"F5",X"CD",X"D2",X"06",X"CD",X"C6",X"12",X"F1",X"32",X"82",X"4C", + X"E1",X"22",X"80",X"4C",X"CD",X"4C",X"2E",X"C9",X"3A",X"06",X"4E",X"3C",X"FE",X"09",X"D8",X"3E", + X"09",X"C9",X"CD",X"C8",X"06",X"21",X"80",X"4C",X"36",X"00",X"23",X"77",X"23",X"36",X"00",X"21", + X"01",X"4E",X"86",X"27",X"77",X"D0",X"2B",X"7E",X"C6",X"01",X"27",X"77",X"C9",X"CD",X"E9",X"2D", + X"08",X"CC",X"43",X"53",X"55",X"4E",X"4F",X"42",X"40",X"40",X"40",X"C9",X"00",X"00",X"18",X"96", + X"EB",X"CD",X"E9",X"1A",X"21",X"A8",X"05",X"E3",X"E5",X"EB",X"23",X"0E",X"0A",X"C3",X"C3",X"21", + X"3A",X"2F",X"02",X"B7",X"28",X"0B",X"CD",X"26",X"15",X"38",X"0D",X"CD",X"20",X"19",X"C3",X"DE", + X"04",X"CD",X"1F",X"15",X"38",X"09",X"18",X"14",X"2A",X"3E",X"00",X"7C",X"B5",X"20",X"0D",X"2A", + X"40",X"00",X"7C",X"B5",X"28",X"22",X"CD",X"59",X"18",X"C3",X"FE",X"1B",X"7E",X"23",X"5E",X"16", + X"00",X"23",X"E5",X"21",X"9B",X"22",X"19",X"19",X"5E",X"23",X"56",X"EB",X"E3",X"CB",X"67",X"C8", + X"3A",X"52",X"00",X"B7",X"C8",X"C3",X"21",X"1B",X"06",X"04",X"AF",X"CD",X"61",X"1B",X"10",X"FB", + X"3E",X"4F",X"CD",X"30",X"1B",X"C3",X"1E",X"12",X"CD",X"AE",X"18",X"F5",X"C5",X"CD",X"E5",X"16", + X"38",X"07",X"CD",X"66",X"18",X"38",X"11",X"B6",X"57",X"C1",X"F1",X"38",X"12",X"B2",X"57",X"FE", + X"76",X"CC",X"01",X"1B",X"7A",X"C3",X"61",X"1B",X"B6",X"57",X"F1",X"F1",X"DC",X"01",X"1B",X"B2", + X"57",X"FE",X"76",X"CC",X"01",X"1B",X"78",X"CD",X"61",X"1B",X"7A",X"CD",X"61",X"1B",X"79",X"C3", + X"61",X"1B",X"CD",X"AE",X"18",X"38",X"0D",X"B6",X"CD",X"61",X"1B",X"CD",X"BB",X"16",X"CD",X"0C", + X"19",X"C3",X"61",X"1B",X"B6",X"CD",X"90",X"07",X"18",X"F1",X"CD",X"AE",X"18",X"38",X"04",X"B6", + X"C3",X"61",X"1B",X"B6",X"C3",X"90",X"07",X"CD",X"66",X"18",X"18",X"F1",X"7E",X"C3",X"61",X"1B", + X"7E",X"CD",X"61",X"1B",X"23",X"18",X"F5",X"7E",X"CD",X"61",X"1B",X"CD",X"A4",X"14",X"18",X"CE", + X"CD",X"F7",X"18",X"B6",X"CD",X"61",X"1B",X"CD",X"BB",X"16",X"CD",X"98",X"1E",X"C3",X"FE",X"1B", + X"7E",X"CD",X"61",X"1B",X"CD",X"A4",X"14",X"18",X"F1",X"CD",X"CF",X"18",X"30",X"E5",X"57",X"24", + X"21",X"E4",X"4F",X"7E",X"FE",X"88",X"28",X"09",X"23",X"7E",X"FE",X"60",X"28",X"03",X"FE",X"C0", + X"C0",X"21",X"E8",X"4F",X"CD",X"1A",X"08",X"21",X"EA",X"4F",X"E5",X"CD",X"6B",X"08",X"E1",X"79", + X"B7",X"C8",X"7D",X"D6",X"10",X"6F",X"3A",X"1B",X"4E",X"FE",X"02",X"38",X"24",X"FE",X"04",X"38", + X"0D",X"E5",X"7D",X"C6",X"10",X"6F",X"7E",X"23",X"B6",X"E6",X"07",X"E1",X"28",X"18",X"E5",X"7D", + X"C6",X"10",X"6F",X"7E",X"FE",X"88",X"20",X"02",X"23",X"7E",X"E6",X"0F",X"FE",X"08",X"E1",X"28", + X"05",X"7E",X"CD",X"FE",X"18",X"C8",X"3A",X"11",X"4E",X"B7",X"F5",X"C4",X"FD",X"3A",X"F1",X"CC", + X"73",X"0D",X"7E",X"D7",X"E6",X"0F",X"A1",X"C8",X"23",X"71",X"C9",X"11",X"E4",X"4F",X"0E",X"00", + X"1A",X"BE",X"28",X"10",X"23",X"13",X"1A",X"BE",X"C0",X"2B",X"1B",X"1A",X"96",X"07",X"0E",X"04", + X"D8",X"0E",X"02",X"C9",X"23",X"13",X"1A",X"96",X"07",X"0E",X"08",X"D8",X"0E",X"01",X"C9",X"21", + X"E8",X"4F",X"CD",X"BE",X"1A",X"20",X"1B",X"E5",X"7D",X"D6",X"10",X"6F",X"7E",X"E6",X"F0",X"5F", + X"D7",X"57",X"7E",X"E6",X"0F",X"20",X"0A",X"ED",X"5F",X"CD",X"58",X"10",X"79",X"A2",X"B3",X"23", + X"77",X"E1",X"CD",X"48",X"2D",X"18",X"DB",X"3A",X"20",X"4C",X"E6",X"07",X"C0",X"21",X"D4",X"4F", + X"7E",X"CD",X"FE",X"18",X"C8",X"7E",X"CD",X"CC",X"08",X"23",X"77",X"C9",X"E6",X"06",X"0E",X"06", + X"28",X"02",X"0E",X"09",X"ED",X"5F",X"0F",X"0F",X"06",X"0C",X"38",X"02",X"06",X"03",X"79",X"A0", + X"C9",X"21",X"EC",X"4F",X"CD",X"BE",X"1A",X"C0",X"56",X"23",X"5E",X"21",X"08",X"09",X"01",X"FF", + X"09",X"7E",X"BA",X"23",X"20",X"02",X"7E",X"BB",X"23",X"28",X"05",X"23",X"10",X"F3",X"18",X"01", + X"4E",X"21",X"DC",X"4F",X"7E",X"A1",X"77",X"C9",X"88",X"D8",X"7F",X"58",X"C0",X"DF",X"B8",X"C0", + X"BF",X"68",X"98",X"CF",X"B8",X"98",X"BF",X"88",X"78",X"6F",X"58",X"60",X"CF",X"B8",X"60",X"3F", + X"88",X"38",X"EF",X"21",X"E4",X"4F",X"7E",X"FE",X"88",X"23",X"20",X"0B",X"7E",X"2B",X"FE",X"80", + X"28",X"14",X"FE",X"D0",X"C0",X"18",X"19",X"7E",X"FE",X"60",X"C0",X"2B",X"7E",X"FE",X"60",X"28", + X"19",X"FE",X"B0",X"C0",X"18",X"1E",X"01",X"BD",X"11",X"11",X"88",X"80",X"21",X"F0",X"41",X"C9", + X"01",X"BC",X"18",X"11",X"88",X"D0",X"21",X"E7",X"41",X"C9",X"01",X"BA",X"12",X"11",X"60",X"60", + X"21",X"74",X"41",X"C9",X"01",X"B8",X"14",X"11",X"B0",X"60",X"21",X"94",X"42",X"3A",X"4F",X"50", + X"07",X"C9",X"3A",X"90",X"50",X"E6",X"C0",X"C8",X"87",X"87",X"D8",X"00",X"00",X"21",X"34",X"42", + X"C9",X"3A",X"40",X"50",X"0F",X"38",X"12",X"3A",X"83",X"4C",X"FE",X"4F",X"20",X"0B",X"CD",X"D0", + X"3A",X"28",X"06",X"00",X"00",X"32",X"03",X"4E",X"E5",X"3A",X"11",X"4E",X"B7",X"C8",X"21",X"E6", + X"4F",X"CD",X"3F",X"2C",X"CD",X"BE",X"1A",X"28",X"07",X"3A",X"83",X"4C",X"0F",X"DC",X"3F",X"2C", + X"E5",X"E5",X"E5",X"CD",X"FF",X"09",X"E1",X"11",X"E4",X"4F",X"01",X"02",X"00",X"ED",X"B0",X"3A", + X"D6",X"4F",X"32",X"D4",X"4F",X"E1",X"CD",X"26",X"09",X"28",X"02",X"E1",X"C9",X"78",X"0F",X"F5", + X"DC",X"F2",X"2E",X"F1",X"0F",X"F5",X"DC",X"E2",X"2E",X"F1",X"0F",X"F5",X"DC",X"DA",X"2E",X"F1", + X"0F",X"DC",X"FA",X"2E",X"E1",X"AF",X"77",X"23",X"77",X"32",X"C6",X"4F",X"32",X"D6",X"4F",X"32", + X"11",X"4E",X"E5",X"CD",X"D1",X"31",X"21",X"9D",X"4C",X"36",X"FF",X"23",X"34",X"E1",X"C9",X"3A", + X"83",X"4C",X"21",X"C6",X"4F",X"CB",X"56",X"28",X"0A",X"CB",X"57",X"28",X"03",X"CB",X"8E",X"C9", + X"CB",X"CE",X"C9",X"CB",X"57",X"28",X"03",X"CB",X"86",X"C9",X"CB",X"C6",X"C9",X"CD",X"23",X"09", + X"C0",X"7E",X"CD",X"B2",X"16",X"D0",X"3A",X"D4",X"4F",X"E6",X"0F",X"A0",X"C8",X"78",X"32",X"D6", + X"4F",X"79",X"32",X"11",X"4E",X"32",X"C6",X"4F",X"3E",X"03",X"32",X"C7",X"4F",X"E5",X"CD",X"C9", + X"31",X"E1",X"ED",X"53",X"E6",X"4F",X"78",X"E6",X"06",X"CA",X"2E",X"2F",X"C3",X"28",X"2F",X"21", + X"E4",X"4F",X"CD",X"BE",X"1A",X"20",X"38",X"DD",X"21",X"00",X"40",X"CD",X"7F",X"2C",X"FD",X"21", + X"00",X"44",X"DD",X"19",X"FD",X"19",X"0E",X"00",X"CD",X"94",X"0A",X"CB",X"09",X"CD",X"B4",X"0A", + X"CB",X"09",X"CD",X"D4",X"0A",X"CB",X"09",X"CD",X"F4",X"0A",X"CB",X"09",X"CD",X"40",X"0B",X"E5", + X"7D",X"D6",X"10",X"6F",X"3E",X"0F",X"A6",X"47",X"79",X"D7",X"E6",X"F0",X"B0",X"77",X"E1",X"CD", + X"48",X"2D",X"18",X"BE",X"FD",X"56",X"FE",X"FD",X"5E",X"1E",X"CD",X"27",X"0B",X"DD",X"56",X"FE", + X"DD",X"5E",X"1E",X"CD",X"B5",X"22",X"3E",X"D1",X"CD",X"E6",X"22",X"3E",X"EA",X"CD",X"E6",X"22", + X"CD",X"14",X"0B",X"C9",X"FD",X"56",X"40",X"FD",X"5E",X"3F",X"CD",X"27",X"0B",X"DD",X"56",X"40", + X"DD",X"5E",X"3F",X"CD",X"B5",X"22",X"3E",X"E1",X"CD",X"E6",X"22",X"3E",X"E5",X"CD",X"E6",X"22", + X"CD",X"14",X"0B",X"C9",X"FD",X"56",X"E0",X"FD",X"5E",X"DF",X"CD",X"27",X"0B",X"DD",X"56",X"E0", + X"DD",X"5E",X"DF",X"CD",X"B5",X"22",X"3E",X"E5",X"CD",X"E6",X"22",X"3E",X"E1",X"CD",X"E6",X"22", + X"CD",X"14",X"0B",X"C9",X"FD",X"56",X"01",X"FD",X"5E",X"21",X"CD",X"27",X"0B",X"DD",X"56",X"01", + X"DD",X"5E",X"21",X"CD",X"B5",X"22",X"3E",X"EA",X"CD",X"E6",X"22",X"3E",X"D1",X"CD",X"E6",X"22", + X"CD",X"14",X"0B",X"C9",X"7B",X"FE",X"D8",X"D8",X"FE",X"E0",X"D0",X"7A",X"FE",X"D8",X"D8",X"FE", + X"E0",X"D0",X"CB",X"E1",X"33",X"33",X"C9",X"7B",X"E6",X"1F",X"FE",X"03",X"28",X"05",X"CD",X"47", + X"1D",X"20",X"0A",X"7A",X"E6",X"1F",X"FE",X"03",X"C8",X"CD",X"47",X"1D",X"C8",X"33",X"33",X"C9", + X"06",X"00",X"7E",X"FE",X"88",X"23",X"20",X"0E",X"7E",X"FE",X"10",X"20",X"02",X"CB",X"D8",X"7E", + X"FE",X"00",X"20",X"02",X"CB",X"C0",X"2B",X"7E",X"FE",X"21",X"38",X"04",X"FE",X"F0",X"38",X"02", + X"06",X"06",X"78",X"B1",X"4F",X"C9",X"21",X"F0",X"4F",X"06",X"10",X"36",X"00",X"23",X"10",X"FB", + X"21",X"00",X"40",X"11",X"40",X"F9",X"CD",X"C5",X"0B",X"11",X"F8",X"F2",X"CD",X"C5",X"0B",X"11", + X"F2",X"F9",X"CD",X"C5",X"0B",X"11",X"F8",X"40",X"CD",X"C5",X"0B",X"7C",X"FE",X"43",X"20",X"EF", + X"7D",X"FE",X"80",X"20",X"EA",X"11",X"F2",X"F9",X"CD",X"C5",X"0B",X"11",X"F4",X"FA",X"CD",X"C5", + X"0B",X"11",X"F7",X"F1",X"CD",X"C5",X"0B",X"11",X"F8",X"F2",X"CD",X"C5",X"0B",X"3E",X"F4",X"32", + X"3D",X"40",X"32",X"FD",X"43",X"3E",X"FA",X"32",X"1D",X"40",X"3E",X"F3",X"32",X"DD",X"43",X"3E", + X"0B",X"CD",X"5B",X"2E",X"C9",X"72",X"23",X"73",X"23",X"7D",X"E6",X"1F",X"20",X"F7",X"32",X"C0", + X"50",X"C9",X"CD",X"44",X"0C",X"3A",X"00",X"4C",X"E6",X"03",X"28",X"62",X"3A",X"00",X"50",X"CB", + X"77",X"21",X"19",X"4C",X"CD",X"F7",X"0B",X"3A",X"00",X"50",X"CB",X"6F",X"21",X"1A",X"4C",X"CD", + X"F7",X"0B",X"3A",X"00",X"50",X"CB",X"7F",X"7E",X"28",X"05",X"E6",X"0F",X"C8",X"35",X"C9",X"E6", + X"0F",X"CB",X"D6",X"CB",X"8E",X"C0",X"3A",X"00",X"4C",X"E6",X"03",X"47",X"3A",X"1E",X"4C",X"05", + X"28",X"0B",X"05",X"28",X"2B",X"7E",X"C6",X"80",X"77",X"D0",X"3A",X"1E",X"4C",X"C6",X"01",X"27", + X"30",X"02",X"3E",X"99",X"32",X"1E",X"4C",X"3A",X"40",X"50",X"87",X"C9",X"3A",X"80",X"50",X"E6", + X"C0",X"C8",X"CB",X"77",X"C0",X"00",X"00",X"32",X"19",X"4E",X"32",X"1E",X"4C",X"C9",X"3E",X"97", + X"C6",X"02",X"18",X"DB",X"21",X"83",X"4C",X"7E",X"FE",X"02",X"D0",X"2F",X"32",X"07",X"50",X"0F", + X"D8",X"C3",X"B5",X"3A",X"3A",X"AE",X"4C",X"B7",X"18",X"03",X"C3",X"C4",X"1D",X"3A",X"AD",X"4C", + X"B7",X"20",X"07",X"3C",X"32",X"AD",X"4C",X"C3",X"50",X"0D",X"3A",X"1E",X"4C",X"3D",X"20",X"15", + X"CD",X"80",X"28",X"0D",X"0F",X"41",X"59",X"4C",X"4E",X"4F",X"40",X"52",X"45",X"59",X"41",X"4C", + X"50",X"40",X"01",X"18",X"14",X"CD",X"80",X"28",X"0E",X"0F",X"41",X"53",X"52",X"45",X"59",X"41", + X"4C",X"50",X"40",X"02",X"40",X"52",X"4F",X"40",X"01",X"CD",X"80",X"28",X"11",X"CC",X"40",X"4E", + X"4F",X"54",X"54",X"55",X"42",X"40",X"54",X"52",X"41",X"54",X"53",X"40",X"48",X"53",X"55",X"50", + X"CD",X"DF",X"0C",X"CD",X"02",X"0D",X"CD",X"BF",X"0C",X"3E",X"FF",X"32",X"AD",X"4C",X"C9",X"CD", + X"80",X"28",X"0C",X"47",X"41",X"52",X"45",X"4C",X"4C",X"4F",X"52",X"40",X"48",X"53",X"55",X"52", + X"43",X"21",X"47",X"45",X"11",X"20",X"00",X"06",X"0C",X"36",X"01",X"19",X"10",X"FB",X"C9",X"CD", + X"80",X"28",X"09",X"9A",X"41",X"52",X"45",X"56",X"4F",X"40",X"45",X"4D",X"41",X"47",X"21",X"9A", + X"45",X"01",X"05",X"0F",X"CD",X"9F",X"06",X"21",X"15",X"40",X"06",X"09",X"36",X"40",X"23",X"10", + X"FB",X"C9",X"CD",X"80",X"28",X"18",X"BC",X"40",X"40",X"44",X"54",X"4C",X"40",X"43",X"49",X"52", + X"54",X"43",X"45",X"4C",X"45",X"40",X"4F",X"43",X"53",X"45",X"40",X"4C",X"41",X"52",X"55",X"4B", + X"21",X"BC",X"44",X"01",X"07",X"18",X"CD",X"9F",X"06",X"21",X"E2",X"4F",X"36",X"E8",X"23",X"36", + X"30",X"21",X"C2",X"4F",X"36",X"04",X"23",X"36",X"07",X"CD",X"80",X"28",X"04",X"FB",X"42",X"01", + X"08",X"09",X"01",X"21",X"FB",X"46",X"06",X"04",X"36",X"07",X"CD",X"50",X"21",X"10",X"F9",X"C9", + X"21",X"40",X"40",X"01",X"7F",X"04",X"3E",X"40",X"C5",X"CD",X"D1",X"2D",X"C1",X"3E",X"03",X"21", + X"40",X"44",X"CD",X"D1",X"2D",X"06",X"50",X"21",X"B0",X"4F",X"CD",X"C5",X"2D",X"CD",X"1B",X"24", + X"C3",X"38",X"22",X"3A",X"1B",X"4E",X"FE",X"04",X"D8",X"3A",X"06",X"4E",X"B7",X"C8",X"E5",X"7D", + X"C6",X"11",X"6F",X"7E",X"E1",X"FE",X"60",X"C0",X"3A",X"E5",X"4F",X"FE",X"60",X"C0",X"3A",X"E4", + X"4F",X"FE",X"58",X"28",X"0C",X"FE",X"B8",X"C0",X"3A",X"94",X"42",X"FE",X"DE",X"C0",X"0E",X"04", + X"C9",X"3A",X"74",X"41",X"FE",X"DC",X"C0",X"0E",X"02",X"C9",X"3A",X"1B",X"4E",X"FE",X"05",X"D8", + X"21",X"45",X"0E",X"FE",X"07",X"38",X"0A",X"21",X"6D",X"0E",X"FE",X"09",X"38",X"03",X"21",X"95", + X"0E",X"D9",X"11",X"E4",X"4F",X"21",X"E8",X"4F",X"D9",X"E5",X"CD",X"D3",X"0D",X"E1",X"D9",X"21", + X"EA",X"4F",X"D9",X"01",X"00",X"04",X"E5",X"CD",X"F9",X"0D",X"E1",X"79",X"B7",X"20",X"08",X"3E", + X"0A",X"CD",X"52",X"21",X"10",X"F0",X"C9",X"D9",X"7D",X"D6",X"10",X"6F",X"7E",X"D7",X"E6",X"0F", + X"D9",X"A1",X"D9",X"28",X"02",X"23",X"77",X"D9",X"C9",X"D9",X"1A",X"96",X"30",X"02",X"ED",X"44", + X"FE",X"14",X"D9",X"30",X"0F",X"D9",X"23",X"13",X"1A",X"96",X"30",X"02",X"ED",X"44",X"FE",X"14", + X"2B",X"1B",X"D9",X"D8",X"5E",X"23",X"56",X"23",X"1A",X"BE",X"C0",X"23",X"7E",X"23",X"B7",X"28", + X"06",X"D9",X"BE",X"D9",X"C0",X"18",X"07",X"7E",X"D9",X"23",X"BE",X"2B",X"D9",X"C0",X"23",X"D9", + X"1A",X"D9",X"BE",X"D0",X"23",X"BE",X"D8",X"23",X"D9",X"13",X"1A",X"1B",X"D9",X"BE",X"D0",X"23", + X"BE",X"D8",X"23",X"4E",X"C9",X"94",X"42",X"DE",X"00",X"60",X"B9",X"AF",X"64",X"58",X"04",X"74", + X"41",X"DC",X"00",X"60",X"69",X"5F",X"68",X"5C",X"02",X"10",X"42",X"DB",X"88",X"00",X"8C",X"84", + X"80",X"78",X"01",X"07",X"42",X"D9",X"88",X"00",X"8C",X"84",X"D4",X"D0",X"08",X"94",X"42",X"DE", + X"00",X"60",X"BC",X"AC",X"70",X"58",X"04",X"74",X"41",X"DC",X"00",X"60",X"64",X"57",X"68",X"58", + X"02",X"10",X"42",X"DB",X"88",X"00",X"94",X"7C",X"84",X"74",X"01",X"07",X"42",X"D9",X"88",X"00", + X"94",X"7C",X"DC",X"CC",X"08",X"94",X"42",X"DE",X"00",X"60",X"C9",X"9C",X"77",X"58",X"04",X"74", + X"41",X"DC",X"00",X"60",X"78",X"48",X"68",X"48",X"02",X"10",X"42",X"DB",X"88",X"00",X"A0",X"70", + X"A0",X"70",X"01",X"07",X"42",X"D9",X"88",X"00",X"A0",X"70",X"E8",X"B0",X"08",X"1F",X"00",X"3F", + X"C0",X"2F",X"00",X"2F",X"40",X"0F",X"C0",X"0F",X"40",X"0F",X"00",X"3F",X"C0",X"0F",X"00",X"0F", + X"40",X"1C",X"00",X"3C",X"C0",X"2C",X"00",X"2C",X"40",X"0C",X"C0",X"0C",X"40",X"0C",X"00",X"3C", + X"C0",X"0C",X"00",X"0C",X"40",X"11",X"00",X"31",X"C0",X"21",X"00",X"21",X"40",X"01",X"C0",X"01", + X"40",X"01",X"00",X"31",X"C0",X"01",X"00",X"01",X"40",X"CD",X"B0",X"3E",X"3A",X"00",X"50",X"CB", + X"67",X"28",X"0A",X"21",X"AE",X"4C",X"CB",X"4E",X"20",X"03",X"3A",X"40",X"50",X"E6",X"0F",X"FE", + X"0F",X"28",X"1B",X"0F",X"38",X"05",X"CD",X"4D",X"0F",X"18",X"13",X"0F",X"38",X"05",X"CD",X"99", + X"0F",X"18",X"0B",X"0F",X"38",X"05",X"CD",X"80",X"0F",X"18",X"03",X"CD",X"35",X"0F",X"CD",X"C7", + X"3C",X"CD",X"B2",X"0F",X"C9",X"3A",X"6A",X"4E",X"B7",X"C0",X"CD",X"6B",X"0F",X"B7",X"C8",X"3D", + X"12",X"3C",X"CD",X"52",X"21",X"36",X"40",X"3E",X"10",X"32",X"6A",X"4E",X"C9",X"3A",X"6A",X"4E", + X"B7",X"C0",X"CD",X"6B",X"0F",X"FE",X"02",X"28",X"0D",X"3C",X"12",X"CD",X"52",X"21",X"36",X"41", + X"3E",X"10",X"32",X"6A",X"4E",X"C9",X"3D",X"32",X"AF",X"4C",X"C9",X"11",X"68",X"4E",X"1A",X"D6", + X"05",X"ED",X"44",X"87",X"47",X"87",X"80",X"21",X"40",X"4E",X"CD",X"52",X"21",X"13",X"1A",X"C9", + X"3A",X"6B",X"4E",X"B7",X"C0",X"CD",X"6B",X"0F",X"CD",X"52",X"21",X"7E",X"FE",X"5A",X"20",X"02", + X"36",X"40",X"34",X"3E",X"10",X"32",X"6B",X"4E",X"C9",X"3A",X"6C",X"4E",X"B7",X"C0",X"CD",X"6B", + X"0F",X"CD",X"52",X"21",X"7E",X"FE",X"41",X"20",X"02",X"36",X"5B",X"35",X"3E",X"10",X"32",X"6C", + X"4E",X"C9",X"21",X"6A",X"4E",X"06",X"03",X"7E",X"B7",X"28",X"01",X"35",X"23",X"10",X"F8",X"C9", + X"00",X"57",X"16",X"EB",X"21",X"3D",X"00",X"36",X"00",X"ED",X"53",X"43",X"02",X"ED",X"43",X"41", + X"02",X"C1",X"E1",X"11",X"41",X"02",X"E5",X"C5",X"D5",X"0E",X"04",X"23",X"1A",X"BE",X"20",X"2C", + X"13",X"0D",X"20",X"F7",X"78",X"D1",X"C1",X"D1",X"F6",X"80",X"E1",X"2B",X"2B",X"F5",X"7E",X"FE", + X"27",X"28",X"01",X"23",X"F1",X"77",X"23",X"E5",X"2A",X"27",X"02",X"2B",X"7E",X"E1",X"22",X"65", + X"21",X"6A",X"41",X"11",X"1D",X"00",X"3E",X"3F",X"0E",X"03",X"CD",X"A7",X"28",X"21",X"4A",X"42", + X"0E",X"03",X"CD",X"A7",X"28",X"21",X"CA",X"41",X"06",X"03",X"36",X"3E",X"23",X"10",X"FB",X"21", + X"2A",X"42",X"06",X"03",X"36",X"3D",X"23",X"10",X"FB",X"3E",X"1A",X"C3",X"30",X"10",X"3E",X"19", + X"21",X"6A",X"45",X"11",X"1D",X"00",X"0E",X"04",X"CD",X"A7",X"28",X"21",X"2A",X"46",X"0E",X"04", + X"C3",X"A7",X"28",X"21",X"83",X"4C",X"7E",X"B7",X"CA",X"29",X"10",X"FE",X"80",X"28",X"DF",X"C9", + X"21",X"83",X"4C",X"34",X"C0",X"23",X"34",X"C9",X"E6",X"03",X"3C",X"47",X"0E",X"11",X"CB",X"09", + X"10",X"FC",X"7E",X"B1",X"E6",X"0F",X"20",X"03",X"CB",X"01",X"C9",X"7E",X"B1",X"E6",X"0F",X"FE", + X"09",X"C0",X"CB",X"01",X"C9",X"3A",X"83",X"4C",X"E6",X"0F",X"28",X"10",X"FE",X"03",X"C0",X"CD", + X"D0",X"3A",X"C8",X"00",X"00",X"32",X"06",X"4E",X"32",X"20",X"4C",X"21",X"21",X"10",X"4E",X"11", + X"08",X"4E",X"7E",X"B7",X"28",X"03",X"35",X"28",X"0D",X"EB",X"7E",X"B7",X"C8",X"35",X"C0",X"3A", + X"06",X"4E",X"FE",X"03",X"D0",X"EB",X"AF",X"12",X"77",X"67",X"6F",X"22",X"EC",X"4F",X"22",X"CC", + X"4F",X"3D",X"32",X"07",X"4E",X"CD",X"E0",X"31",X"3A",X"84",X"50",X"E6",X"C0",X"C9",X"3A",X"C6", + X"50",X"E6",X"30",X"FE",X"30",X"C0",X"00",X"00",X"CD",X"6F",X"2E",X"35",X"21",X"03",X"4E",X"7E", + X"FE",X"01",X"D8",X"21",X"07",X"4E",X"CB",X"46",X"C0",X"36",X"01",X"23",X"3E",X"FF",X"77",X"32", + X"10",X"4E",X"CD",X"00",X"20",X"21",X"CC",X"4F",X"11",X"EC",X"4F",X"B7",X"28",X"0E",X"3D",X"28", + X"17",X"3D",X"28",X"20",X"3D",X"28",X"3C",X"3D",X"28",X"45",X"18",X"4F",X"36",X"C0",X"23",X"36", + X"07",X"EB",X"36",X"B8",X"23",X"36",X"50",X"C9",X"36",X"80",X"23",X"36",X"07",X"EB",X"36",X"48", + X"23",X"36",X"48",X"C9",X"36",X"60",X"23",X"36",X"09",X"EB",X"36",X"C8",X"23",X"36",X"D8",X"3A", + X"87",X"50",X"E6",X"C0",X"FE",X"C0",X"C9",X"3A",X"C9",X"50",X"E6",X"30",X"C8",X"FE",X"30",X"C8", + X"00",X"00",X"E1",X"36",X"A0",X"23",X"36",X"07",X"EB",X"36",X"38",X"23",X"36",X"78",X"C9",X"36", + X"40",X"23",X"36",X"16",X"EB",X"36",X"D8",X"23",X"36",X"28",X"C9",X"36",X"20",X"23",X"36",X"10", + X"EB",X"36",X"48",X"23",X"36",X"A8",X"3A",X"8F",X"50",X"E6",X"C0",X"FE",X"40",X"C9",X"3A",X"C0", + X"50",X"E6",X"30",X"C8",X"FE",X"20",X"C8",X"00",X"00",X"E5",X"3A",X"07",X"4E",X"E6",X"81",X"E8", + X"CD",X"E3",X"11",X"21",X"E4",X"4F",X"11",X"EC",X"4F",X"CD",X"A2",X"2B",X"FE",X"04",X"D0",X"79", + X"FE",X"04",X"D0",X"CD",X"00",X"20",X"01",X"09",X"CC",X"B7",X"28",X"1B",X"01",X"14",X"88",X"3D", + X"28",X"15",X"01",X"09",X"68",X"3D",X"28",X"0F",X"01",X"07",X"A8",X"3D",X"28",X"09",X"01",X"09", + X"CC",X"3D",X"28",X"03",X"01",X"19",X"24",X"21",X"CC",X"4F",X"70",X"23",X"71",X"21",X"07",X"4E", + X"CB",X"FE",X"3E",X"1F",X"23",X"77",X"32",X"10",X"4E",X"21",X"00",X"01",X"11",X"02",X"4E",X"CD", + X"29",X"3A",X"CD",X"39",X"3A",X"CD",X"F4",X"31",X"2A",X"C4",X"4F",X"E5",X"21",X"54",X"01",X"22", + X"C4",X"4F",X"3A",X"83",X"4C",X"C6",X"60",X"47",X"3A",X"83",X"4C",X"B8",X"20",X"FA",X"E1",X"22", + X"C4",X"4F",X"C9",X"3A",X"47",X"50",X"07",X"C9",X"3A",X"8E",X"50",X"E6",X"C0",X"C8",X"87",X"87", + X"D8",X"00",X"00",X"C2",X"00",X"4E",X"3A",X"83",X"4C",X"E6",X"0F",X"C0",X"3A",X"07",X"4E",X"E6", + X"03",X"E2",X"08",X"12",X"3E",X"FF",X"18",X"03",X"CD",X"00",X"20",X"21",X"83",X"4C",X"CB",X"66", + X"28",X"3D",X"E6",X"87",X"F5",X"F5",X"CC",X"E5",X"28",X"F1",X"C4",X"B8",X"28",X"F1",X"3D",X"F5", + X"F5",X"CC",X"34",X"29",X"F1",X"C4",X"10",X"29",X"F1",X"3D",X"F5",X"F5",X"CC",X"A8",X"29",X"F1", + X"C4",X"62",X"29",X"F1",X"3D",X"F5",X"F5",X"CC",X"04",X"2A",X"F1",X"C4",X"B6",X"29",X"F1",X"3D", + X"F5",X"F5",X"CC",X"66",X"2A",X"F1",X"C4",X"46",X"2A",X"F1",X"3D",X"C2",X"EC",X"22",X"C9",X"E6", + X"87",X"F5",X"C4",X"DB",X"28",X"F1",X"3D",X"F5",X"C4",X"27",X"29",X"F1",X"3D",X"F5",X"C4",X"9F", + X"29",X"F1",X"3D",X"F5",X"F5",X"CC",X"2A",X"2A",X"F1",X"C4",X"ED",X"29",X"F1",X"3D",X"F5",X"F5", + X"CC",X"7D",X"2A",X"F1",X"C4",X"5D",X"2A",X"F1",X"3D",X"C2",X"EC",X"22",X"C9",X"3A",X"81",X"4C", + X"FE",X"15",X"38",X"23",X"3A",X"83",X"4C",X"E6",X"3F",X"FE",X"13",X"20",X"1A",X"3A",X"D0",X"4C", + X"21",X"DE",X"4C",X"BE",X"20",X"0D",X"23",X"34",X"C0",X"00",X"00",X"32",X"20",X"4C",X"3E",X"01", + X"32",X"01",X"4C",X"77",X"23",X"36",X"00",X"21",X"03",X"4E",X"7E",X"FE",X"01",X"C0",X"23",X"7E", + X"FE",X"34",X"D8",X"23",X"7E",X"FE",X"02",X"D8",X"3A",X"12",X"4E",X"B7",X"C0",X"CD",X"D7",X"3B", + X"21",X"20",X"4C",X"CB",X"EE",X"C9",X"06",X"25",X"3E",X"82",X"32",X"5C",X"4C",X"C5",X"21",X"40", + X"40",X"CD",X"DE",X"12",X"C1",X"10",X"F6",X"AF",X"3E",X"81",X"32",X"5C",X"4C",X"C9",X"E5",X"C5", + X"ED",X"5F",X"CD",X"1F",X"13",X"8D",X"A0",X"20",X"21",X"7E",X"FE",X"FF",X"20",X"04",X"36",X"D7", + X"18",X"13",X"FE",X"D4",X"20",X"09",X"E5",X"7C",X"C6",X"04",X"67",X"CD",X"40",X"1D",X"E1",X"CD", + X"1F",X"13",X"20",X"06",X"35",X"3E",X"70",X"3D",X"20",X"FD",X"C1",X"7D",X"C6",X"20",X"6F",X"30", + X"01",X"24",X"7C",X"FE",X"44",X"20",X"C8",X"E1",X"23",X"7D",X"FE",X"60",X"C8",X"18",X"BF",X"D6", + X"D5",X"C8",X"3D",X"C8",X"3D",X"C8",X"C9",X"21",X"E4",X"4F",X"7E",X"E6",X"FE",X"57",X"23",X"7E", + X"E6",X"FE",X"5F",X"2B",X"E5",X"CD",X"49",X"13",X"E1",X"78",X"B7",X"28",X"07",X"E5",X"7D",X"D6", + X"30",X"6F",X"71",X"E1",X"CD",X"48",X"2D",X"18",X"E1",X"21",X"5F",X"13",X"06",X"14",X"7A",X"BE", + X"23",X"20",X"07",X"7B",X"BE",X"23",X"20",X"03",X"4E",X"C9",X"23",X"23",X"10",X"F0",X"C9",X"70", + X"98",X"00",X"70",X"C0",X"00",X"9C",X"98",X"00",X"9C",X"C0",X"00",X"88",X"4A",X"00",X"88",X"76", + X"00",X"88",X"D8",X"00",X"88",X"7A",X"00",X"5A",X"60",X"00",X"B8",X"60",X"00",X"72",X"98",X"86", + X"72",X"C0",X"86",X"9A",X"98",X"86",X"9A",X"C0",X"86",X"88",X"4C",X"89",X"88",X"74",X"89",X"88", + X"D6",X"09",X"88",X"7C",X"09",X"5C",X"60",X"06",X"B6",X"60",X"06",X"DD",X"E5",X"E3",X"CD",X"AE", + X"13",X"E3",X"DD",X"E1",X"C0",X"3A",X"B4",X"4F",X"87",X"D0",X"C8",X"33",X"33",X"C9",X"7C",X"FE", + X"41",X"28",X"13",X"FE",X"42",X"C0",X"7D",X"D6",X"08",X"C8",X"3D",X"C8",X"D6",X"04",X"C8",X"3D", + X"C8",X"D6",X"06",X"C8",X"3D",X"C9",X"7D",X"D6",X"E0",X"18",X"EC",X"4F",X"7D",X"D6",X"20",X"6F", + X"7E",X"A6",X"79",X"C8",X"A6",X"C9",X"11",X"F2",X"4F",X"D9",X"11",X"62",X"50",X"06",X"02",X"CD", + X"34",X"14",X"C4",X"5D",X"14",X"CD",X"3C",X"14",X"C4",X"5D",X"14",X"CD",X"44",X"14",X"C4",X"5D", + X"14",X"21",X"E6",X"4F",X"CD",X"5D",X"14",X"CD",X"4C",X"14",X"CC",X"5D",X"14",X"21",X"E2",X"4F", + X"CD",X"5D",X"14",X"CD",X"34",X"14",X"CC",X"5D",X"14",X"CD",X"3C",X"14",X"CC",X"5D",X"14",X"CD", + X"44",X"14",X"CC",X"5D",X"14",X"CD",X"4C",X"14",X"C4",X"5D",X"14",X"3A",X"83",X"4C",X"47",X"E6", + X"FC",X"FE",X"04",X"C0",X"78",X"2F",X"32",X"07",X"50",X"0F",X"D8",X"C3",X"B5",X"3A",X"B7",X"C8", + X"2F",X"CB",X"7F",X"C9",X"3A",X"B4",X"4F",X"21",X"E4",X"4F",X"18",X"F2",X"3A",X"B8",X"4F",X"21", + X"E8",X"4F",X"18",X"EA",X"3A",X"BA",X"4F",X"21",X"EA",X"4F",X"18",X"E2",X"21",X"EC",X"4F",X"3A", + X"CC",X"4F",X"E6",X"FC",X"FE",X"AC",X"C8",X"FE",X"B0",X"C8",X"FE",X"B4",X"C9",X"E5",X"3A",X"20", + X"4C",X"4F",X"3A",X"00",X"50",X"CB",X"67",X"20",X"02",X"CB",X"91",X"05",X"7E",X"23",X"CD",X"90", + X"14",X"12",X"13",X"7E",X"CD",X"A3",X"14",X"12",X"13",X"E1",X"7D",X"D6",X"20",X"6F",X"7E",X"CB", + X"51",X"28",X"02",X"EE",X"03",X"D9",X"12",X"13",X"D9",X"23",X"7E",X"D9",X"12",X"13",X"D9",X"C9", + X"CB",X"51",X"20",X"07",X"CB",X"78",X"20",X"01",X"3D",X"3D",X"C9",X"2F",X"C6",X"10",X"CB",X"78", + X"C0",X"3D",X"C9",X"CB",X"51",X"C8",X"2F",X"C6",X"11",X"C9",X"3A",X"B4",X"4F",X"07",X"30",X"09", + X"21",X"E4",X"4F",X"CD",X"45",X"15",X"CD",X"14",X"15",X"3A",X"B8",X"4F",X"07",X"30",X"14",X"21", + X"E8",X"4F",X"CD",X"45",X"15",X"3A",X"B4",X"4F",X"07",X"30",X"05",X"CD",X"21",X"15",X"18",X"03", + X"CD",X"14",X"15",X"3A",X"BA",X"4F",X"07",X"D0",X"3A",X"B4",X"4F",X"07",X"30",X"0E",X"3A",X"B8", + X"4F",X"07",X"38",X"1C",X"21",X"EA",X"4F",X"CD",X"45",X"15",X"18",X"35",X"3A",X"11",X"4E",X"B7", + X"3A",X"B8",X"4F",X"28",X"13",X"07",X"38",X"08",X"21",X"EA",X"4F",X"CD",X"45",X"15",X"18",X"14", + X"21",X"EA",X"4F",X"CD",X"45",X"15",X"18",X"2F",X"21",X"EA",X"4F",X"CD",X"45",X"15",X"3A",X"B8", + X"4F",X"07",X"38",X"0D",X"ED",X"43",X"C2",X"4F",X"ED",X"53",X"E2",X"4F",X"01",X"00",X"00",X"50", + X"58",X"3A",X"C6",X"4F",X"E6",X"F8",X"FE",X"B8",X"28",X"08",X"ED",X"43",X"C6",X"4F",X"ED",X"53", + X"E6",X"4F",X"01",X"00",X"00",X"50",X"58",X"3A",X"10",X"4E",X"B7",X"C0",X"ED",X"43",X"CC",X"4F", + X"ED",X"53",X"EC",X"4F",X"C9",X"11",X"00",X"00",X"42",X"4A",X"7E",X"FE",X"88",X"23",X"7E",X"20", + X"12",X"FE",X"78",X"30",X"0E",X"FE",X"4A",X"38",X"0A",X"CD",X"7E",X"15",X"1E",X"88",X"3A",X"F5", + X"45",X"47",X"C9",X"FE",X"98",X"20",X"0A",X"CD",X"9F",X"15",X"3A",X"EE",X"45",X"16",X"98",X"18", + X"F0",X"FE",X"C0",X"C0",X"CD",X"9F",X"15",X"3A",X"E9",X"45",X"16",X"C0",X"18",X"E3",X"FE",X"72", + X"30",X"41",X"FE",X"4E",X"38",X"3D",X"0E",X"B4",X"16",X"62",X"BA",X"D0",X"0E",X"94",X"15",X"BA", + X"D0",X"0E",X"AC",X"15",X"BA",X"D0",X"0E",X"95",X"15",X"BA",X"D0",X"0E",X"B5",X"15",X"C9",X"2B", + X"7E",X"FE",X"9A",X"30",X"1E",X"FE",X"76",X"38",X"1A",X"0E",X"B2",X"1E",X"8A",X"00",X"BB",X"D0", + X"0E",X"92",X"1D",X"BB",X"D0",X"0E",X"AC",X"1D",X"BB",X"D0",X"0E",X"90",X"1D",X"BB",X"D0",X"0E", + X"B0",X"1D",X"C9",X"33",X"33",X"C9",X"3A",X"01",X"4E",X"FE",X"10",X"3A",X"83",X"4C",X"E6",X"0F", + X"FE",X"03",X"20",X"0A",X"CD",X"D0",X"3A",X"28",X"05",X"00",X"00",X"32",X"20",X"4C",X"21",X"E4", + X"4F",X"7E",X"23",X"B6",X"E6",X"07",X"C0",X"2B",X"CD",X"7F",X"2C",X"7A",X"B7",X"28",X"06",X"FE", + X"03",X"28",X"08",X"18",X"0A",X"7B",X"FE",X"40",X"D8",X"18",X"04",X"7B",X"FE",X"A0",X"D0",X"DD", + X"21",X"00",X"40",X"DD",X"19",X"FD",X"21",X"00",X"44",X"FD",X"19",X"21",X"00",X"00",X"DD",X"56", + X"E0",X"DD",X"5E",X"01",X"FD",X"46",X"E0",X"FD",X"4E",X"01",X"CD",X"88",X"16",X"DD",X"2B",X"FD", + X"2B",X"DD",X"E5",X"E3",X"7D",X"FE",X"DF",X"20",X"0F",X"7C",X"FE",X"41",X"20",X"0A",X"11",X"20", + X"00",X"19",X"FD",X"19",X"E3",X"CB",X"FD",X"E3",X"E3",X"DD",X"E1",X"DD",X"56",X"E0",X"DD",X"5E", + X"FF",X"FD",X"46",X"E0",X"FD",X"4E",X"FF",X"CD",X"88",X"16",X"11",X"20",X"00",X"DD",X"19",X"FD", + X"19",X"DD",X"56",X"FF",X"DD",X"5E",X"20",X"FD",X"46",X"FF",X"FD",X"4E",X"20",X"CD",X"88",X"16", + X"DD",X"23",X"FD",X"23",X"CB",X"7D",X"28",X"09",X"CB",X"BD",X"11",X"E0",X"FF",X"DD",X"19",X"FD", + X"19",X"DD",X"56",X"20",X"DD",X"5E",X"01",X"FD",X"46",X"20",X"FD",X"4E",X"01",X"CD",X"88",X"16", + X"4D",X"55",X"21",X"05",X"4E",X"C3",X"C3",X"2A",X"24",X"CD",X"9B",X"13",X"7A",X"CD",X"B2",X"16", + X"38",X"27",X"7B",X"CD",X"B2",X"16",X"38",X"21",X"7A",X"CD",X"DD",X"22",X"20",X"06",X"7B",X"CD", + X"DD",X"22",X"28",X"43",X"78",X"CD",X"47",X"1D",X"28",X"0F",X"79",X"CD",X"47",X"1D",X"28",X"09", + X"18",X"35",X"FE",X"D8",X"3F",X"D0",X"FE",X"E0",X"C9",X"DD",X"56",X"00",X"FD",X"46",X"00",X"CD", + X"8A",X"21",X"7A",X"3C",X"20",X"07",X"78",X"CD",X"47",X"1D",X"C8",X"18",X"0A",X"7A",X"CD",X"DD", + X"22",X"20",X"0D",X"DD",X"36",X"00",X"FF",X"78",X"CD",X"6D",X"1D",X"FD",X"77",X"00",X"2C",X"C9", + X"78",X"CD",X"47",X"1D",X"C8",X"18",X"F0",X"DD",X"56",X"00",X"FD",X"46",X"00",X"CD",X"8A",X"21", + X"78",X"CD",X"47",X"1D",X"C8",X"7A",X"3C",X"28",X"09",X"78",X"CD",X"6D",X"1D",X"FD",X"77",X"00", + X"2C",X"C9",X"7C",X"CD",X"13",X"17",X"DD",X"70",X"00",X"FD",X"7E",X"00",X"CD",X"6D",X"1D",X"FD", + X"77",X"00",X"C9",X"3D",X"06",X"CD",X"C8",X"05",X"3D",X"C8",X"06",X"CE",X"3D",X"C8",X"04",X"C9", + X"21",X"20",X"4C",X"CB",X"EE",X"CD",X"C8",X"3F",X"C9",X"00",X"C4",X"AE",X"17",X"3A",X"3A",X"00", + X"B7",X"28",X"07",X"CD",X"E4",X"11",X"AF",X"32",X"3A",X"00",X"36",X"08",X"CD",X"C1",X"17",X"CD", + X"C1",X"17",X"21",X"95",X"02",X"CD",X"C4",X"17",X"3A",X"2A",X"00",X"DE",X"28",X"DE",X"08",X"38", + X"03",X"CD",X"BE",X"13",X"21",X"C1",X"02",X"CD",X"C4",X"17",X"21",X"82",X"01",X"34",X"7E",X"CD", + X"98",X"17",X"CD",X"C1",X"17",X"3A",X"89",X"02",X"B7",X"28",X"14",X"21",X"12",X"00",X"22",X"54", + X"00",X"21",X"29",X"02",X"D5",X"CD",X"5C",X"0A",X"D1",X"21",X"94",X"17",X"CD",X"C4",X"17",X"21", + X"83",X"01",X"CD",X"BE",X"17",X"21",X"D4",X"01",X"CD",X"BE",X"17",X"CD",X"C1",X"17",X"CD",X"C1", + X"17",X"C3",X"12",X"17",X"03",X"20",X"2D",X"20",X"D5",X"C5",X"16",X"00",X"06",X"64",X"CD",X"D1", + X"17",X"06",X"0A",X"CD",X"D1",X"17",X"06",X"01",X"CD",X"D1",X"17",X"C1",X"D1",X"C9",X"E5",X"21", + X"46",X"00",X"3A",X"47",X"00",X"3D",X"BE",X"D4",X"08",X"17",X"30",X"FA",X"E1",X"C9",X"CD",X"C4", + X"17",X"21",X"C7",X"02",X"7E",X"B7",X"C8",X"23",X"4E",X"F5",X"CD",X"12",X"00",X"F1",X"3D",X"18", + X"F5",X"0E",X"30",X"90",X"38",X"03",X"0C",X"18",X"FA",X"80",X"F5",X"79",X"FE",X"30",X"20",X"04", + X"7A",X"B7",X"28",X"05",X"CD",X"12",X"00",X"16",X"01",X"F1",X"C9",X"AF",X"00",X"00",X"3E",X"01", + X"18",X"02",X"3E",X"02",X"C5",X"D5",X"C5",X"4F",X"ED",X"5B",X"2D",X"02",X"2A",X"27",X"02",X"B9", + X"3E",X"01",X"32",X"04",X"50",X"21",X"D0",X"4C",X"34",X"7E",X"FE",X"3C",X"D8",X"36",X"00",X"23", + X"34",X"7E",X"FE",X"1E",X"D8",X"AF",X"77",X"32",X"04",X"50",X"C9",X"3A",X"83",X"4C",X"FE",X"01", + X"20",X"0A",X"CC",X"D0",X"3A",X"28",X"05",X"00",X"00",X"32",X"20",X"4C",X"CD",X"DD",X"18",X"CD", + X"8E",X"18",X"D5",X"3A",X"03",X"4E",X"3D",X"28",X"0E",X"3A",X"06",X"4E",X"FE",X"01",X"30",X"07", + X"3A",X"04",X"4E",X"FE",X"10",X"38",X"11",X"CD",X"B4",X"1A",X"20",X"0C",X"7E",X"CD",X"FE",X"18", + X"28",X"06",X"CD",X"D3",X"18",X"CD",X"07",X"19",X"E1",X"3A",X"03",X"4E",X"3D",X"28",X"10",X"3A", + X"06",X"4E",X"FE",X"01",X"06",X"20",X"38",X"02",X"06",X"10",X"3A",X"04",X"4E",X"B8",X"D8",X"CD", + X"B4",X"1A",X"C0",X"7E",X"CD",X"FE",X"18",X"C8",X"CD",X"D3",X"18",X"E5",X"CD",X"5C",X"19",X"E1", + X"20",X"09",X"E5",X"CD",X"61",X"19",X"E1",X"C8",X"79",X"D7",X"4F",X"C3",X"07",X"19",X"11",X"E4", + X"4F",X"21",X"E8",X"4F",X"CD",X"42",X"19",X"13",X"23",X"47",X"CD",X"42",X"19",X"80",X"47",X"2E", + X"EB",X"CD",X"42",X"19",X"2B",X"1B",X"4F",X"CD",X"42",X"19",X"81",X"1E",X"DA",X"2E",X"D8",X"B8", + X"D0",X"EB",X"3A",X"00",X"50",X"0F",X"D8",X"3A",X"55",X"50",X"07",X"C9",X"3A",X"87",X"50",X"E6", + X"C0",X"C8",X"07",X"07",X"D8",X"00",X"00",X"21",X"12",X"4E",X"3A",X"40",X"50",X"34",X"D8",X"21", + X"03",X"4E",X"35",X"E5",X"7D",X"C6",X"10",X"6F",X"CD",X"1C",X"19",X"E1",X"C9",X"21",X"EC",X"4F", + X"3A",X"DC",X"4F",X"CD",X"FE",X"18",X"C8",X"CD",X"14",X"1C",X"30",X"05",X"CD",X"34",X"1C",X"18", + X"08",X"E5",X"CD",X"6F",X"19",X"E1",X"CD",X"1F",X"19",X"2E",X"DC",X"C3",X"07",X"19",X"D7",X"E6", + X"0F",X"FE",X"06",X"C8",X"FE",X"09",X"C9",X"7E",X"D7",X"E6",X"0F",X"E5",X"CD",X"F6",X"19",X"E1", + X"47",X"79",X"A0",X"20",X"04",X"79",X"D7",X"A0",X"C8",X"23",X"77",X"C9",X"11",X"E4",X"4F",X"CD", + X"42",X"19",X"47",X"23",X"13",X"CD",X"42",X"19",X"B8",X"30",X"0B",X"CD",X"48",X"19",X"D7",X"47", + X"CD",X"51",X"19",X"B0",X"4F",X"C9",X"CD",X"51",X"19",X"D7",X"47",X"23",X"13",X"CD",X"48",X"19", + X"18",X"F1",X"1A",X"96",X"F0",X"ED",X"44",X"C9",X"1A",X"96",X"C8",X"3E",X"08",X"D8",X"3E",X"01", + X"C9",X"2B",X"1B",X"1A",X"96",X"C8",X"3E",X"04",X"D8",X"3E",X"02",X"C9",X"11",X"E8",X"4F",X"18", + X"03",X"11",X"E4",X"4F",X"21",X"EA",X"4F",X"1A",X"BE",X"C8",X"23",X"13",X"1A",X"BE",X"C9",X"CD", + X"94",X"19",X"D8",X"3A",X"8E",X"50",X"E6",X"C0",X"18",X"12",X"3A",X"FF",X"50",X"E6",X"30",X"FE", + X"30",X"20",X"09",X"00",X"00",X"ED",X"5B",X"EC",X"4F",X"32",X"03",X"4E",X"ED",X"53",X"E0",X"4F", + X"11",X"E0",X"4F",X"C9",X"11",X"E8",X"4F",X"3A",X"07",X"4E",X"E6",X"81",X"37",X"E8",X"3A",X"10", + X"4E",X"07",X"D8",X"07",X"D8",X"CD",X"00",X"20",X"87",X"21",X"B4",X"19",X"CD",X"52",X"21",X"5E", + X"23",X"56",X"AF",X"C9",X"C8",X"50",X"58",X"50",X"B8",X"D8",X"48",X"78",X"C8",X"20",X"58",X"B0", + X"3A",X"07",X"4E",X"E6",X"81",X"E8",X"3A",X"10",X"4E",X"07",X"D8",X"07",X"D8",X"CD",X"00",X"20", + X"87",X"21",X"B4",X"19",X"CD",X"52",X"21",X"11",X"EC",X"4F",X"1A",X"BE",X"C0",X"23",X"13",X"1A", + X"BE",X"C0",X"AF",X"32",X"08",X"4E",X"32",X"10",X"4E",X"67",X"6F",X"22",X"EC",X"4F",X"22",X"CC", + X"4F",X"3D",X"32",X"07",X"4E",X"C9",X"F5",X"7D",X"C6",X"10",X"6F",X"56",X"23",X"5E",X"3A",X"E4", + X"4F",X"FE",X"88",X"21",X"5A",X"1A",X"06",X"0B",X"28",X"20",X"3A",X"E5",X"4F",X"FE",X"C0",X"21", + X"8D",X"1A",X"06",X"0A",X"28",X"29",X"21",X"99",X"1A",X"06",X"09",X"FE",X"98",X"28",X"20",X"21", + X"6F",X"1A",X"06",X"08",X"FE",X"60",X"28",X"0F",X"F1",X"C9",X"3A",X"11",X"4E",X"B7",X"28",X"0F", + X"21",X"54",X"1A",X"06",X"0D",X"18",X"08",X"3A",X"11",X"4E",X"B7",X"28",X"02",X"06",X"0A",X"7A", + X"BE",X"23",X"20",X"06",X"7B",X"BE",X"23",X"28",X"07",X"2B",X"23",X"23",X"10",X"F1",X"F1",X"C9", + X"46",X"F1",X"A0",X"C9",X"88",X"78",X"0E",X"88",X"D8",X"07",X"58",X"D8",X"07",X"B8",X"D8",X"07", + X"68",X"78",X"0E",X"B8",X"78",X"0E",X"48",X"60",X"0D",X"58",X"60",X"0D",X"B8",X"60",X"0B",X"58", + X"C0",X"0D",X"B8",X"C0",X"0B",X"68",X"98",X"0D",X"B8",X"98",X"0B",X"48",X"78",X"0D",X"88",X"78", + X"07",X"B8",X"78",X"0B",X"88",X"38",X"0E",X"58",X"60",X"0D",X"B8",X"98",X"0B",X"88",X"D8",X"07", + X"58",X"98",X"0D",X"68",X"98",X"0D",X"B8",X"98",X"0B",X"68",X"78",X"0D",X"88",X"78",X"0E",X"B8", + X"78",X"0B",X"48",X"60",X"0D",X"58",X"60",X"0D",X"B8",X"60",X"0B",X"88",X"D8",X"07",X"58",X"C0", + X"0D",X"B0",X"C0",X"0B",X"E5",X"7D",X"C6",X"10",X"6F",X"CD",X"BE",X"1A",X"E1",X"C9",X"7E",X"23", + X"B6",X"2B",X"E6",X"07",X"C9",X"3A",X"06",X"4E",X"FE",X"01",X"30",X"06",X"3A",X"0F",X"4E",X"FE", + X"01",X"D8",X"79",X"E6",X"06",X"79",X"28",X"04",X"EE",X"06",X"4F",X"C9",X"EE",X"09",X"4F",X"C9", + X"3A",X"20",X"4C",X"CB",X"57",X"28",X"1F",X"3A",X"83",X"4C",X"E6",X"3F",X"FE",X"31",X"20",X"16", + X"3A",X"D0",X"4C",X"21",X"DA",X"4C",X"BE",X"20",X"09",X"23",X"34",X"20",X"09",X"00",X"00",X"22", + X"1F",X"4C",X"77",X"23",X"36",X"00",X"11",X"E4",X"4F",X"21",X"E8",X"4F",X"D5",X"CD",X"14",X"1B", + X"D1",X"21",X"EA",X"4F",X"E5",X"CD",X"33",X"1B",X"E1",X"79",X"B7",X"C8",X"7D",X"D6",X"10",X"6F", + X"7E",X"CD",X"FE",X"18",X"C8",X"7E",X"D7",X"E6",X"0F",X"57",X"A1",X"20",X"03",X"7A",X"A0",X"C8", + X"23",X"77",X"C9",X"01",X"00",X"00",X"CD",X"BE",X"1A",X"C0",X"1A",X"FE",X"50",X"38",X"1B",X"FE", + X"C0",X"30",X"31",X"13",X"1A",X"FE",X"40",X"38",X"0A",X"FE",X"D0",X"D8",X"23",X"7E",X"FE",X"40", + X"D0",X"18",X"4B",X"23",X"7E",X"FE",X"D0",X"D8",X"18",X"44",X"7E",X"FE",X"C0",X"D8",X"23",X"13", + X"1A",X"FE",X"90",X"7E",X"38",X"07",X"FE",X"B0",X"D8",X"16",X"C0",X"18",X"21",X"FE",X"B0",X"D0", + X"16",X"60",X"18",X"1A",X"7E",X"FE",X"50",X"D0",X"23",X"13",X"1A",X"FE",X"B0",X"7E",X"38",X"07", + X"FE",X"90",X"D8",X"16",X"C0",X"18",X"07",X"FE",X"90",X"D0",X"16",X"60",X"18",X"00",X"7E",X"BA", + X"0E",X"01",X"D8",X"06",X"08",X"2B",X"7E",X"07",X"0E",X"02",X"D8",X"0E",X"04",X"C9",X"2B",X"7E", + X"FE",X"88",X"0E",X"02",X"D8",X"06",X"04",X"23",X"7E",X"07",X"0E",X"01",X"D8",X"0E",X"08",X"C9", + X"21",X"E8",X"4F",X"11",X"F0",X"4F",X"1A",X"3C",X"28",X"0A",X"12",X"36",X"A0",X"D5",X"E5",X"CD", + X"CD",X"1B",X"E1",X"D1",X"13",X"1A",X"3C",X"C8",X"12",X"23",X"23",X"36",X"70",X"23",X"36",X"B0", + X"1A",X"3C",X"C0",X"7D",X"D6",X"21",X"6F",X"36",X"E0",X"23",X"36",X"07",X"7D",X"FE",X"C9",X"CA", + X"6C",X"39",X"36",X"05",X"C3",X"79",X"39",X"3A",X"80",X"50",X"F5",X"0F",X"0F",X"E6",X"03",X"06", + X"03",X"28",X"09",X"04",X"3D",X"28",X"05",X"04",X"3D",X"28",X"01",X"04",X"78",X"32",X"01",X"4C", + X"F1",X"E6",X"C0",X"FE",X"40",X"C9",X"3A",X"CC",X"50",X"E6",X"30",X"C8",X"FE",X"20",X"C8",X"00", + X"00",X"32",X"19",X"4E",X"11",X"E4",X"4F",X"3A",X"06",X"4E",X"FE",X"01",X"3F",X"D0",X"1A",X"96", + X"30",X"02",X"ED",X"44",X"FE",X"48",X"D0",X"23",X"13",X"1A",X"96",X"2B",X"1B",X"30",X"02",X"ED", + X"44",X"FE",X"48",X"C9",X"1A",X"96",X"0E",X"24",X"C8",X"23",X"13",X"1A",X"96",X"0E",X"18",X"C8", + X"2B",X"1B",X"CD",X"1C",X"19",X"79",X"06",X"09",X"A0",X"20",X"02",X"06",X"06",X"79",X"A8",X"4F", + X"06",X"90",X"A0",X"20",X"02",X"06",X"60",X"79",X"A8",X"4F",X"C9",X"21",X"E8",X"4F",X"CD",X"64", + X"1C",X"21",X"EA",X"4F",X"11",X"E4",X"4F",X"1A",X"13",X"FE",X"58",X"28",X"1A",X"FE",X"C8",X"C0", + X"1A",X"FE",X"61",X"D0",X"7E",X"FE",X"B8",X"C0",X"23",X"7E",X"FE",X"C0",X"28",X"1A",X"FE",X"98", + X"28",X"16",X"FE",X"78",X"C0",X"18",X"11",X"1A",X"FE",X"61",X"D0",X"7E",X"FE",X"48",X"C0",X"23", + X"7E",X"FE",X"78",X"28",X"03",X"FE",X"98",X"C0",X"7D",X"D6",X"10",X"6F",X"36",X"08",X"C9",X"3A", + X"C0",X"50",X"E6",X"1F",X"FE",X"1F",X"0E",X"FF",X"C9",X"06",X"3A",X"80",X"50",X"E6",X"C0",X"C8", + X"F3",X"CD",X"66",X"0B",X"18",X"FB",X"CD",X"8C",X"1D",X"FE",X"06",X"38",X"02",X"3E",X"05",X"87", + X"87",X"21",X"11",X"1D",X"CD",X"52",X"21",X"7E",X"4F",X"E5",X"C5",X"CD",X"29",X"1D",X"C1",X"E1", + X"79",X"20",X"05",X"CC",X"77",X"1D",X"18",X"0D",X"3A",X"06",X"4E",X"FE",X"05",X"38",X"05",X"E6", + X"03",X"28",X"01",X"0D",X"79",X"32",X"CE",X"4F",X"23",X"7E",X"32",X"92",X"4C",X"23",X"7E",X"32", + X"94",X"4C",X"23",X"7E",X"32",X"96",X"4C",X"3A",X"81",X"4C",X"FE",X"10",X"D8",X"3A",X"83",X"4C", + X"FE",X"09",X"C0",X"CD",X"D0",X"3A",X"C8",X"00",X"00",X"32",X"19",X"4E",X"AF",X"32",X"03",X"4E", + X"C9",X"0F",X"0E",X"0E",X"0C",X"80",X"0F",X"0F",X"0D",X"82",X"81",X"81",X"0F",X"84",X"83",X"83", + X"81",X"86",X"85",X"85",X"83",X"89",X"88",X"88",X"85",X"21",X"E4",X"4F",X"CD",X"7F",X"2C",X"21", + X"00",X"40",X"19",X"7E",X"2B",X"A6",X"F5",X"CD",X"50",X"21",X"F1",X"A6",X"23",X"A6",X"3C",X"C9", + X"7E",X"E6",X"E0",X"F6",X"03",X"77",X"C9",X"E6",X"1F",X"FE",X"06",X"C8",X"FE",X"02",X"C8",X"FE", + X"04",X"C9",X"3A",X"06",X"4E",X"FE",X"03",X"38",X"04",X"D6",X"03",X"18",X"F8",X"3C",X"FE",X"03", + X"20",X"01",X"3C",X"32",X"19",X"4E",X"FE",X"01",X"C0",X"3E",X"06",X"18",X"F6",X"E6",X"E0",X"C5", + X"47",X"3A",X"19",X"4E",X"B0",X"C1",X"C9",X"3D",X"F5",X"3A",X"80",X"50",X"CB",X"67",X"18",X"07", + X"3A",X"06",X"4E",X"FE",X"01",X"38",X"03",X"F1",X"3D",X"C9",X"F1",X"C9",X"3A",X"06",X"4E",X"FE", + X"05",X"D0",X"FE",X"02",X"D8",X"F5",X"3A",X"03",X"4E",X"B7",X"28",X"0A",X"3A",X"04",X"4E",X"FE", + X"10",X"38",X"03",X"F1",X"3C",X"C9",X"F1",X"C9",X"21",X"40",X"4E",X"0E",X"05",X"06",X"03",X"36", + X"4B",X"23",X"36",X"52",X"23",X"36",X"4C",X"23",X"23",X"23",X"23",X"0D",X"20",X"EF",X"3E",X"81", + X"32",X"AC",X"4C",X"C9",X"21",X"AE",X"4C",X"7E",X"B7",X"C8",X"CB",X"57",X"28",X"0B",X"CB",X"96", + X"E5",X"CD",X"F1",X"1D",X"E1",X"ED",X"43",X"66",X"4E",X"ED",X"4B",X"66",X"4E",X"78",X"B1",X"20", + X"03",X"36",X"00",X"C9",X"7E",X"E6",X"82",X"C2",X"52",X"3D",X"7E",X"E6",X"41",X"C2",X"6F",X"3D", + X"C9",X"11",X"00",X"4D",X"21",X"80",X"4D",X"01",X"00",X"00",X"CD",X"64",X"1E",X"38",X"09",X"CD", + X"1D",X"1E",X"78",X"B7",X"C8",X"C3",X"11",X"1E",X"CD",X"11",X"1E",X"79",X"B7",X"C8",X"C3",X"1D", + X"1E",X"11",X"80",X"4D",X"C5",X"41",X"CD",X"20",X"1E",X"78",X"C1",X"4F",X"C9",X"11",X"00",X"4D", + X"21",X"5E",X"4E",X"C5",X"06",X"03",X"36",X"40",X"23",X"10",X"FB",X"06",X"03",X"1A",X"77",X"23", + X"13",X"10",X"FA",X"C1",X"21",X"5B",X"4E",X"11",X"61",X"4E",X"CD",X"64",X"1E",X"D8",X"C8",X"7D", + X"D6",X"03",X"6F",X"7B",X"D6",X"03",X"5F",X"C5",X"06",X"06",X"1A",X"F5",X"7E",X"12",X"F1",X"77", + X"23",X"13",X"10",X"F6",X"C1",X"04",X"78",X"FE",X"05",X"C8",X"7B",X"D6",X"09",X"5F",X"7D",X"D6", + X"09",X"6F",X"18",X"D6",X"E5",X"D5",X"CD",X"6C",X"1E",X"D1",X"E1",X"C9",X"1A",X"BE",X"D8",X"C0", + X"13",X"23",X"1A",X"BE",X"D8",X"C0",X"13",X"23",X"1A",X"BE",X"C9",X"00",X"23",X"F6",X"01",X"C9", + X"E3",X"E1",X"D5",X"7E",X"23",X"E6",X"03",X"FE",X"02",X"20",X"06",X"5E",X"23",X"56",X"2B",X"18", + X"03",X"11",X"03",X"00",X"19",X"D1",X"18",X"B3",X"21",X"10",X"00",X"E5",X"3A",X"29",X"00",X"32", + X"40",X"02",X"AF",X"32",X"28",X"00",X"CD",X"AF",X"14",X"DA",X"BD",X"1F",X"CD",X"EC",X"16",X"38", + X"77",X"CD",X"57",X"16",X"CD",X"AF",X"14",X"FE",X"23",X"20",X"06",X"CD",X"CA",X"13",X"CD",X"E4", + X"15",X"D5",X"3A",X"2F",X"02",X"B7",X"20",X"07",X"CD",X"22",X"15",X"38",X"31",X"18",X"0C",X"CD", + X"26",X"15",X"30",X"4D",X"2A",X"40",X"00",X"7C",X"B5",X"28",X"23",X"CB",X"66",X"28",X"3A",X"CB", + X"5E",X"C4",X"25",X"1B",X"CD",X"59",X"18",X"D1",X"CA",X"C5",X"1F",X"3A",X"28",X"00",X"B7",X"28", + X"04",X"B9",X"C4",X"0D",X"1B",X"79",X"32",X"28",X"00",X"0E",X"01",X"C3",X"C5",X"1F",X"2A",X"3E", + X"00",X"7C",X"B5",X"28",X"0D",X"23",X"23",X"5E",X"23",X"56",X"EB",X"AF",X"47",X"4F",X"D1",X"C3", + X"C5",X"1F",X"3A",X"81",X"00",X"3D",X"C4",X"EE",X"17",X"CD",X"19",X"1B",X"21",X"00",X"00",X"18", + X"EA",X"D1",X"CD",X"20",X"19",X"C3",X"A6",X"1E",X"21",X"40",X"02",X"FE",X"30",X"38",X"0B",X"FE", + X"3A",X"30",X"07",X"7E",X"CD",X"96",X"21",X"C3",X"C5",X"1F",X"1A",X"FE",X"22",X"28",X"04",X"FE", + X"27",X"20",X"21",X"47",X"21",X"00",X"00",X"E5",X"CD",X"CA",X"13",X"B8",X"20",X"06",X"CD",X"CA", + X"13",X"B8",X"20",X"0D",X"FE",X"0D",X"20",X"05",X"CD",X"15",X"1B",X"18",X"04",X"65",X"6F",X"18", + X"E7",X"C1",X"18",X"61",X"FE",X"5E",X"20",X"20",X"7E",X"3D",X"07",X"07",X"07",X"07",X"F6",X"17", + X"4F",X"06",X"0F",X"C5",X"CD",X"CA",X"13",X"CD",X"FF",X"16",X"E5",X"21",X"2C",X"22",X"CD",X"59", + X"21",X"38",X"2C",X"7E",X"E1",X"77",X"18",X"73",X"FE",X"2B",X"28",X"6F",X"FE",X"28",X"20",X"0D", + X"3A",X"28",X"00",X"F5",X"AF",X"32",X"28",X"00",X"01",X"11",X"0D",X"18",X"5D",X"FE",X"2D",X"20", + X"05",X"01",X"18",X"0E",X"18",X"54",X"FE",X"23",X"20",X"06",X"01",X"15",X"0C",X"18",X"4B",X"E1", + X"CD",X"01",X"1B",X"18",X"46",X"CD",X"01",X"1B",X"01",X"00",X"00",X"18",X"2D",X"CD",X"01",X"1B", + X"01",X"00",X"00",X"60",X"68",X"22",X"3C",X"02",X"ED",X"43",X"3E",X"02",X"CD",X"AF",X"14",X"21", + X"39",X"22",X"CD",X"59",X"21",X"30",X"12",X"CD",X"EC",X"16",X"38",X"D9",X"CD",X"57",X"16",X"CD", + X"26",X"15",X"38",X"D1",X"CD",X"20",X"19",X"18",X"E3",X"4E",X"E1",X"7D",X"E6",X"0F",X"B9",X"30", + X"10",X"E5",X"2A",X"3C",X"02",X"E5",X"2A",X"3E",X"02",X"E5",X"C5",X"CD",X"CA",X"13",X"C3",X"32", + X"3A",X"06",X"4E",X"FE",X"06",X"D8",X"D6",X"06",X"18",X"F9",X"3A",X"07",X"4E",X"E6",X"81",X"E8", + X"CD",X"D7",X"31",X"3A",X"12",X"4E",X"FE",X"55",X"38",X"17",X"3A",X"20",X"4C",X"CB",X"57",X"C0", + X"3A",X"83",X"4C",X"E6",X"FD",X"FE",X"05",X"C0",X"CD",X"D0",X"3A",X"C8",X"00",X"00",X"32",X"12", + X"4E",X"21",X"EC",X"4F",X"7E",X"23",X"B6",X"2B",X"E6",X"07",X"C0",X"CD",X"00",X"20",X"5F",X"FE", + X"03",X"28",X"06",X"D5",X"CD",X"57",X"21",X"D1",X"D8",X"3A",X"DC",X"4F",X"CD",X"C0",X"20",X"7B", + X"87",X"87",X"81",X"87",X"21",X"6D",X"20",X"CD",X"64",X"20",X"CD",X"9D",X"20",X"21",X"12",X"4E", + X"7E",X"82",X"77",X"C9",X"85",X"6F",X"30",X"01",X"24",X"46",X"23",X"4E",X"C9",X"A7",X"A7",X"A7", + X"A7",X"A7",X"A7",X"A7",X"A7",X"A9",X"A9",X"A8",X"A8",X"A8",X"A8",X"A9",X"A9",X"AA",X"AB",X"AA", + X"AB",X"AA",X"AB",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"AE",X"AF",X"AC",X"AD",X"B8",X"B9",X"B8", + X"B9",X"B8",X"B9",X"B8",X"B9",X"B2",X"B3",X"B5",X"B4",X"B0",X"B1",X"B7",X"B6",X"21",X"EC",X"4F", + X"D5",X"C5",X"CD",X"7F",X"2C",X"21",X"00",X"40",X"19",X"C1",X"D1",X"16",X"00",X"7B",X"FE",X"03", + X"28",X"26",X"CD",X"CA",X"20",X"7D",X"C6",X"1F",X"6F",X"30",X"01",X"24",X"41",X"C3",X"CA",X"20", + X"0E",X"00",X"E6",X"0F",X"C8",X"0F",X"D8",X"0C",X"18",X"FB",X"7E",X"FE",X"FF",X"20",X"03",X"70", + X"14",X"C9",X"CD",X"74",X"21",X"D0",X"70",X"C9",X"3A",X"DC",X"4F",X"0F",X"38",X"41",X"0F",X"38", + X"2D",X"0F",X"38",X"16",X"0F",X"D0",X"2B",X"3E",X"AE",X"01",X"AC",X"BB",X"CD",X"32",X"21",X"CD", + X"50",X"21",X"3E",X"AE",X"01",X"AD",X"BD",X"C3",X"32",X"21",X"CD",X"50",X"21",X"3E",X"AC",X"01", + X"AE",X"BB",X"CD",X"32",X"21",X"2B",X"3E",X"AC",X"01",X"AF",X"BA",X"C3",X"32",X"21",X"3E",X"AD", + X"01",X"AE",X"BD",X"CD",X"32",X"21",X"2B",X"3E",X"AD",X"01",X"AF",X"BC",X"C3",X"32",X"21",X"3E", + X"AF",X"01",X"AC",X"BA",X"CD",X"32",X"21",X"CD",X"50",X"21",X"3E",X"AF",X"01",X"AD",X"BC",X"C3", + X"32",X"21",X"BE",X"20",X"02",X"70",X"C9",X"3E",X"FF",X"BE",X"C0",X"71",X"14",X"3A",X"77",X"50", + X"87",X"C9",X"10",X"03",X"00",X"E6",X"C0",X"C8",X"87",X"87",X"D8",X"00",X"00",X"14",X"77",X"C9", + X"3E",X"20",X"85",X"6F",X"D0",X"24",X"C9",X"CD",X"7F",X"2C",X"21",X"00",X"40",X"19",X"CD",X"74", + X"21",X"D8",X"2B",X"CD",X"74",X"21",X"D8",X"11",X"20",X"00",X"19",X"CD",X"74",X"21",X"D8",X"23", + X"CD",X"74",X"21",X"C9",X"7E",X"FE",X"BE",X"D0",X"FE",X"A7",X"3F",X"C9",X"7A",X"FE",X"BE",X"30", + X"06",X"FE",X"A7",X"38",X"02",X"AF",X"C9",X"F6",X"FF",X"C9",X"7A",X"CD",X"75",X"21",X"D0",X"3A", + X"12",X"4E",X"3D",X"32",X"12",X"4E",X"16",X"FF",X"DD",X"72",X"00",X"E5",X"D5",X"21",X"01",X"00", + X"11",X"02",X"4E",X"CD",X"29",X"3A",X"CD",X"C0",X"31",X"D1",X"E1",X"C9",X"3A",X"81",X"4C",X"FE", + X"20",X"38",X"1F",X"3A",X"83",X"4C",X"E6",X"3F",X"FE",X"35",X"20",X"16",X"3A",X"D0",X"4C",X"21", + X"D8",X"4C",X"BE",X"20",X"08",X"23",X"34",X"C0",X"00",X"00",X"32",X"20",X"4C",X"77",X"23",X"36", + X"00",X"00",X"21",X"12",X"40",X"06",X"0C",X"CD",X"66",X"23",X"21",X"5F",X"42",X"11",X"20",X"00", + X"06",X"07",X"36",X"F7",X"19",X"10",X"FB",X"06",X"05",X"36",X"40",X"19",X"10",X"FB",X"21",X"1D", + X"40",X"11",X"BF",X"43",X"01",X"E0",X"FF",X"3A",X"20",X"4C",X"CB",X"57",X"3A",X"1C",X"4C",X"28", + X"03",X"3A",X"1D",X"4C",X"3D",X"F8",X"C8",X"FE",X"06",X"38",X"02",X"3E",X"06",X"F5",X"36",X"C8", + X"2B",X"36",X"C9",X"2B",X"EB",X"36",X"CA",X"09",X"36",X"CB",X"09",X"EB",X"3D",X"20",X"EF",X"21", + X"BF",X"47",X"11",X"1D",X"44",X"F1",X"08",X"3E",X"01",X"77",X"09",X"77",X"09",X"EB",X"77",X"2B", + X"77",X"2B",X"EB",X"08",X"3D",X"C8",X"18",X"EE",X"CD",X"44",X"23",X"3A",X"9F",X"4C",X"B7",X"C8", + X"FE",X"06",X"38",X"02",X"3E",X"06",X"01",X"20",X"00",X"21",X"5F",X"40",X"D9",X"21",X"22",X"40", + X"11",X"02",X"40",X"36",X"C2",X"23",X"36",X"C3",X"23",X"EB",X"36",X"C4",X"23",X"36",X"C5",X"23", + X"EB",X"D9",X"36",X"C6",X"09",X"36",X"C7",X"09",X"D9",X"3D",X"20",X"E7",X"01",X"9C",X"22",X"3A", + X"9F",X"4C",X"F5",X"FE",X"13",X"38",X"02",X"3E",X"13",X"81",X"4F",X"30",X"01",X"04",X"F1",X"FE", + X"06",X"38",X"02",X"3E",X"06",X"21",X"22",X"44",X"11",X"02",X"44",X"08",X"0A",X"77",X"23",X"77", + X"23",X"EB",X"77",X"23",X"77",X"23",X"EB",X"03",X"08",X"3D",X"20",X"EF",X"C9",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"0F",X"0F",X"11",X"11",X"12",X"12",X"14",X"14",X"05", + X"05",X"05",X"05",X"05",X"05",X"CD",X"CF",X"22",X"C4",X"7C",X"21",X"C4",X"0D",X"3C",X"C0",X"53", + X"CD",X"CF",X"22",X"C4",X"7C",X"21",X"C4",X"0D",X"3C",X"C0",X"CB",X"E1",X"33",X"33",X"C9",X"7A", + X"D6",X"FC",X"C8",X"3D",X"C8",X"3D",X"C8",X"3D",X"C8",X"7A",X"FE",X"D2",X"C8",X"D6",X"CC",X"C8", + X"3D",X"C8",X"3D",X"C8",X"3D",X"C9",X"BA",X"C0",X"BB",X"C0",X"18",X"DE",X"3A",X"83",X"4C",X"D7", + X"07",X"E6",X"1C",X"CD",X"07",X"23",X"71",X"EB",X"70",X"3E",X"04",X"84",X"67",X"36",X"19",X"EB", + X"3E",X"04",X"84",X"67",X"36",X"03",X"C9",X"21",X"24",X"23",X"CD",X"52",X"21",X"56",X"23",X"5E", + X"23",X"4E",X"23",X"46",X"6A",X"16",X"40",X"62",X"7B",X"FE",X"A0",X"30",X"01",X"14",X"7D",X"FE", + X"A0",X"D0",X"24",X"C9",X"AC",X"CA",X"F2",X"B5",X"AB",X"EA",X"F9",X"B4",X"CA",X"0A",X"F7",X"B6", + X"EA",X"0B",X"F7",X"B7",X"0A",X"EC",X"F3",X"B0",X"0B",X"CC",X"FA",X"B1",X"EC",X"AC",X"F8",X"B2", + X"CC",X"AB",X"F8",X"B3",X"21",X"00",X"40",X"06",X"10",X"CD",X"66",X"23",X"2E",X"20",X"06",X"10", + X"CD",X"66",X"23",X"21",X"5F",X"40",X"11",X"20",X"00",X"36",X"40",X"19",X"06",X"0B",X"3A",X"9B", + X"41",X"77",X"19",X"10",X"FC",X"C9",X"36",X"40",X"23",X"10",X"FB",X"C9",X"21",X"16",X"4E",X"7E", + X"B7",X"C0",X"3A",X"01",X"4E",X"FE",X"10",X"D8",X"36",X"FF",X"21",X"1C",X"4C",X"3A",X"20",X"4C", + X"CB",X"57",X"28",X"01",X"23",X"34",X"CD",X"AC",X"21",X"3A",X"90",X"50",X"E6",X"C0",X"C9",X"3A", + X"D0",X"50",X"E6",X"30",X"FE",X"30",X"C0",X"00",X"00",X"FF",X"32",X"03",X"4E",X"3A",X"06",X"4E", + X"21",X"00",X"09",X"FE",X"08",X"30",X"11",X"B7",X"21",X"05",X"00",X"28",X"0B",X"47",X"7D",X"85", + X"27",X"6F",X"7C",X"8C",X"27",X"67",X"10",X"F6",X"22",X"0E",X"4E",X"C9",X"3A",X"83",X"4C",X"47", + X"E6",X"0F",X"C0",X"21",X"20",X"4C",X"7E",X"E6",X"07",X"28",X"16",X"CB",X"56",X"28",X"09",X"CB", + X"60",X"20",X"0E",X"21",X"C5",X"43",X"18",X"1F",X"CB",X"60",X"20",X"05",X"21",X"D8",X"43",X"18", + X"16",X"21",X"C5",X"43",X"36",X"50",X"23",X"36",X"55",X"23",X"36",X"02",X"2E",X"D8",X"36",X"50", + X"23",X"36",X"55",X"23",X"36",X"01",X"C9",X"06",X"03",X"C3",X"66",X"23",X"3A",X"90",X"4C",X"B7", + X"C8",X"21",X"10",X"40",X"06",X"10",X"FE",X"01",X"CA",X"66",X"23",X"3A",X"20",X"4C",X"CB",X"57", + X"3A",X"1C",X"4C",X"28",X"03",X"3A",X"1D",X"4C",X"FE",X"02",X"D0",X"21",X"1D",X"40",X"11",X"35", + X"24",X"06",X"0A",X"1A",X"77",X"2B",X"13",X"10",X"FA",X"06",X"0A",X"7C",X"C6",X"04",X"67",X"23", + X"36",X"03",X"10",X"FB",X"C9",X"47",X"41",X"4D",X"45",X"40",X"4F",X"56",X"45",X"52",X"40",X"21", + X"E4",X"4F",X"7E",X"23",X"B6",X"E6",X"07",X"2B",X"20",X"1D",X"E5",X"7D",X"D6",X"10",X"6F",X"7E", + X"D7",X"E5",X"CD",X"CB",X"13",X"E1",X"E6",X"0F",X"47",X"A6",X"E6",X"0F",X"20",X"01",X"77",X"23", + X"7E",X"2B",X"A0",X"28",X"01",X"77",X"E1",X"CD",X"48",X"2D",X"18",X"D6",X"21",X"80",X"4E",X"11", + X"00",X"4F",X"01",X"80",X"00",X"ED",X"B0",X"CD",X"81",X"24",X"CD",X"4F",X"25",X"CD",X"0B",X"25", + X"C9",X"21",X"60",X"40",X"11",X"80",X"4E",X"CD",X"74",X"21",X"30",X"12",X"47",X"CD",X"FD",X"24", + X"78",X"20",X"0B",X"36",X"FF",X"CD",X"B5",X"24",X"7D",X"E6",X"1F",X"B0",X"12",X"13",X"23",X"7D", + X"E6",X"1F",X"20",X"02",X"12",X"13",X"7D",X"FE",X"BF",X"20",X"DC",X"7C",X"FE",X"43",X"20",X"D7", + X"AF",X"12",X"13",X"12",X"C9",X"E5",X"21",X"CD",X"24",X"06",X"00",X"BE",X"28",X"04",X"04",X"23", + X"18",X"F9",X"78",X"07",X"07",X"07",X"07",X"07",X"E6",X"E0",X"47",X"E1",X"C9",X"A7",X"A7",X"A7", + X"A7",X"A7",X"A7",X"A7",X"A7",X"A8",X"A9",X"A8",X"A9",X"A8",X"A9",X"A8",X"A9",X"AA",X"AB",X"AA", + X"AB",X"AA",X"AB",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"BA",X"BB",X"BC",X"BD",X"B8",X"B9",X"B8", + X"B9",X"B8",X"B9",X"B8",X"B9",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"E5",X"3E",X"04", + X"84",X"67",X"7E",X"E1",X"CD",X"47",X"1D",X"C8",X"FE",X"03",X"C9",X"21",X"60",X"40",X"11",X"00", + X"4F",X"4D",X"1A",X"B7",X"20",X"07",X"69",X"CD",X"50",X"21",X"4D",X"18",X"0D",X"E6",X"1F",X"47", + X"7D",X"E6",X"E0",X"B0",X"6F",X"1A",X"CD",X"36",X"25",X"77",X"13",X"7C",X"FE",X"43",X"20",X"E2", + X"7D",X"FE",X"BF",X"38",X"DD",X"C9",X"E5",X"0F",X"0F",X"0F",X"0F",X"0F",X"E6",X"07",X"47",X"CD", + X"00",X"20",X"87",X"87",X"87",X"B0",X"21",X"CD",X"24",X"CD",X"52",X"21",X"7E",X"E1",X"C9",X"21", + X"40",X"40",X"11",X"40",X"44",X"1A",X"F5",X"7E",X"E5",X"21",X"8D",X"25",X"CD",X"84",X"25",X"E1", + X"20",X"09",X"CD",X"9B",X"25",X"1A",X"E6",X"1F",X"B0",X"18",X"03",X"1A",X"E6",X"1F",X"12",X"F1", + X"E6",X"E0",X"28",X"03",X"CD",X"C9",X"25",X"23",X"13",X"7D",X"FE",X"BF",X"20",X"D7",X"7C",X"FE", + X"43",X"20",X"D2",X"C9",X"46",X"23",X"BE",X"23",X"C8",X"10",X"FB",X"04",X"C9",X"0D",X"FF",X"D2", + X"FC",X"FE",X"FD",X"D1",X"E1",X"E5",X"EA",X"CC",X"CD",X"CE",X"CF",X"06",X"E0",X"D6",X"CC",X"28", + X"25",X"06",X"C0",X"3D",X"28",X"20",X"06",X"A0",X"3D",X"28",X"1B",X"06",X"80",X"3D",X"28",X"16", + X"1A",X"E6",X"1F",X"06",X"60",X"FE",X"06",X"C8",X"FE",X"02",X"C8",X"FE",X"04",X"C8",X"06",X"40", + X"FE",X"03",X"C8",X"06",X"00",X"C9",X"36",X"FF",X"C9",X"D7",X"0F",X"E6",X"07",X"47",X"05",X"05", + X"28",X"18",X"05",X"28",X"0F",X"0E",X"CF",X"05",X"28",X"09",X"0D",X"05",X"28",X"05",X"0D",X"05", + X"28",X"01",X"0D",X"71",X"1A",X"CD",X"6D",X"1D",X"12",X"C9",X"1A",X"E6",X"E0",X"F6",X"03",X"12", + X"C9",X"21",X"14",X"4E",X"3A",X"E7",X"41",X"FE",X"D8",X"28",X"0A",X"CB",X"8E",X"21",X"F0",X"41", + X"CD",X"2E",X"2F",X"18",X"08",X"CB",X"CE",X"21",X"E7",X"41",X"CD",X"2E",X"2F",X"21",X"14",X"4E", + X"3A",X"74",X"41",X"FE",X"DC",X"28",X"08",X"CB",X"86",X"21",X"94",X"42",X"C3",X"28",X"2F",X"CB", + X"C6",X"21",X"74",X"41",X"C3",X"28",X"2F",X"3A",X"14",X"4E",X"0F",X"38",X"05",X"CD",X"DA",X"2E", + X"18",X"03",X"CD",X"E2",X"2E",X"3A",X"14",X"4E",X"0F",X"0F",X"DA",X"FA",X"2E",X"C3",X"F2",X"2E", + X"3A",X"11",X"4E",X"B7",X"20",X"0C",X"11",X"CE",X"4F",X"21",X"E4",X"4F",X"01",X"A8",X"4C",X"CD", + X"79",X"26",X"11",X"92",X"4C",X"21",X"E8",X"4F",X"01",X"A9",X"4C",X"CD",X"79",X"26",X"11",X"94", + X"4C",X"21",X"EA",X"4F",X"01",X"AA",X"4C",X"CD",X"79",X"26",X"3A",X"07",X"4E",X"E6",X"81",X"E8", + X"11",X"96",X"4C",X"21",X"EC",X"4F",X"01",X"AB",X"4C",X"1A",X"07",X"30",X"0C",X"E5",X"CD",X"3F", + X"2C",X"E1",X"7E",X"23",X"B6",X"E6",X"07",X"C8",X"2B",X"E5",X"CD",X"92",X"26",X"E1",X"C8",X"C3", + X"3F",X"2C",X"1A",X"E6",X"0F",X"87",X"21",X"B4",X"26",X"CD",X"52",X"21",X"0A",X"3C",X"FE",X"10", + X"38",X"01",X"AF",X"02",X"47",X"04",X"AF",X"4F",X"37",X"17",X"CB",X"11",X"10",X"FB",X"A6",X"C0", + X"79",X"23",X"A6",X"C9",X"00",X"80",X"80",X"80",X"20",X"84",X"88",X"88",X"48",X"92",X"92",X"92", + X"2A",X"95",X"AA",X"AA",X"5A",X"DA",X"6D",X"6D",X"6D",X"DB",X"77",X"77",X"DE",X"F7",X"7F",X"7F", + X"7F",X"FF",X"FF",X"FF",X"00",X"59",X"AA",X"00",X"00",X"EF",X"25",X"04",X"0C",X"0B",X"00",X"B2", + X"7D",X"00",X"00",X"97",X"23",X"04",X"05",X"07",X"00",X"B0",X"CE",X"00",X"00",X"81",X"25",X"04", + X"05",X"17",X"00",X"B3",X"6D",X"00",X"00",X"E9",X"26",X"04",X"05",X"0F",X"00",X"B0",X"D4",X"00", + X"00",X"49",X"26",X"04",X"05",X"1F",X"00",X"B2",X"7D",X"AF",X"00",X"DF",X"26",X"14",X"0E",X"CB", + X"00",X"B0",X"CE",X"AF",X"00",X"F3",X"26",X"14",X"0E",X"CB",X"10",X"B3",X"6D",X"AF",X"00",X"11", + X"27",X"14",X"0E",X"CB",X"08",X"B0",X"D4",X"AF",X"00",X"FD",X"26",X"14",X"0E",X"CB",X"18",X"B8", + X"BB",X"AF",X"00",X"7B",X"26",X"14",X"0E",X"CB",X"20",X"B9",X"AB",X"AF",X"00",X"CD",X"24",X"14", + X"0E",X"CB",X"28",X"B9",X"B6",X"AF",X"00",X"07",X"27",X"14",X"0E",X"CB",X"38",X"B2",X"7E",X"00", + X"00",X"E1",X"24",X"14",X"06",X"ED",X"6F",X"B3",X"6E",X"00",X"00",X"17",X"26",X"14",X"06",X"ED", + X"67",X"4E",X"16",X"00",X"00",X"CB",X"26",X"14",X"0F",X"CB",X"40",X"B7",X"B6",X"00",X"00",X"8F", + X"26",X"14",X"0F",X"CB",X"C0",X"B1",X"75",X"00",X"00",X"25",X"27",X"14",X"0F",X"CB",X"80",X"80", + X"B2",X"00",X"00",X"39",X"27",X"04",X"09",X"C3",X"00",X"80",X"E4",X"00",X"00",X"75",X"27",X"04", + X"09",X"C2",X"00",X"82",X"A0",X"00",X"00",X"67",X"26",X"04",X"09",X"CA",X"00",X"80",X"CD",X"00", + X"00",X"2D",X"24",X"04",X"09",X"D2",X"00",X"7F",X"08",X"00",X"00",X"2B",X"26",X"04",X"09",X"DA", + X"00",X"81",X"29",X"00",X"00",X"AD",X"26",X"04",X"09",X"E2",X"00",X"81",X"1F",X"00",X"00",X"1B", + X"27",X"04",X"09",X"EA",X"00",X"81",X"10",X"00",X"00",X"3F",X"26",X"04",X"09",X"F2",X"00",X"80", + X"98",X"00",X"00",X"61",X"27",X"04",X"09",X"FA",X"00",X"80",X"D9",X"00",X"00",X"00",X"00",X"14", + X"09",X"E2",X"00",X"80",X"E8",X"00",X"00",X"B1",X"27",X"14",X"09",X"EA",X"00",X"80",X"B2",X"AF", + X"00",X"7F",X"27",X"14",X"10",X"18",X"00",X"81",X"6D",X"00",X"00",X"4D",X"27",X"14",X"10",X"D9", + X"21",X"83",X"4C",X"7E",X"E6",X"FE",X"FE",X"4E",X"20",X"0B",X"7E",X"2F",X"32",X"07",X"50",X"0F", + X"38",X"03",X"CD",X"00",X"18",X"21",X"1E",X"4C",X"11",X"36",X"40",X"01",X"00",X"01",X"CD",X"61", + X"28",X"21",X"80",X"4C",X"11",X"F3",X"43",X"CD",X"58",X"28",X"3A",X"87",X"4C",X"B7",X"21",X"00", + X"4E",X"3A",X"20",X"4C",X"E6",X"03",X"20",X"03",X"21",X"00",X"4D",X"3A",X"20",X"4C",X"CB",X"57", + X"20",X"0C",X"1E",X"FD",X"CD",X"58",X"28",X"21",X"80",X"4D",X"1E",X"E8",X"18",X"0A",X"1E",X"E8", + X"CD",X"58",X"28",X"21",X"00",X"4D",X"1E",X"FD",X"01",X"FF",X"03",X"CD",X"61",X"28",X"AF",X"12", + X"C9",X"7E",X"D7",X"CD",X"6E",X"28",X"7E",X"CD",X"6E",X"28",X"23",X"10",X"F4",X"C9",X"E6",X"0F", + X"CB",X"09",X"30",X"09",X"B7",X"28",X"04",X"0E",X"00",X"18",X"02",X"3E",X"40",X"12",X"1B",X"C9", + X"E1",X"46",X"23",X"5E",X"23",X"56",X"23",X"EB",X"1A",X"77",X"D5",X"11",X"20",X"00",X"19",X"D1", + X"13",X"10",X"F5",X"EB",X"E9",X"08",X"7B",X"D6",X"20",X"ED",X"44",X"47",X"08",X"77",X"3C",X"23", + X"10",X"FB",X"19",X"0D",X"20",X"EF",X"C9",X"08",X"7B",X"D6",X"20",X"ED",X"44",X"47",X"08",X"77", + X"23",X"10",X"FC",X"19",X"0D",X"20",X"F0",X"C9",X"21",X"76",X"42",X"11",X"1D",X"00",X"3E",X"0A", + X"0E",X"03",X"CD",X"95",X"28",X"21",X"76",X"46",X"3E",X"1D",X"0E",X"03",X"CD",X"A7",X"28",X"3E", + X"1F",X"32",X"78",X"46",X"32",X"98",X"46",X"32",X"B8",X"46",X"C9",X"3E",X"13",X"32",X"97",X"42", + X"3C",X"32",X"B7",X"42",X"C9",X"21",X"76",X"42",X"11",X"1E",X"00",X"3E",X"40",X"0E",X"03",X"CD", + X"A7",X"28",X"3E",X"EE",X"32",X"76",X"42",X"32",X"96",X"42",X"3E",X"F7",X"32",X"B6",X"42",X"3E", + X"1E",X"32",X"B8",X"46",X"3E",X"03",X"32",X"76",X"46",X"32",X"96",X"46",X"32",X"B6",X"46",X"C9", + X"21",X"D6",X"40",X"11",X"1D",X"00",X"3E",X"16",X"0E",X"03",X"CD",X"95",X"28",X"21",X"D6",X"44", + X"3E",X"09",X"0E",X"03",X"C3",X"A7",X"28",X"21",X"D7",X"40",X"11",X"1E",X"00",X"3E",X"1F",X"0E", + X"03",X"C3",X"95",X"28",X"21",X"D7",X"40",X"11",X"1E",X"00",X"3E",X"40",X"0E",X"03",X"CD",X"A7", + X"28",X"21",X"D8",X"40",X"36",X"F8",X"2E",X"F8",X"36",X"F8",X"21",X"17",X"41",X"36",X"FA",X"23", + X"36",X"F4",X"3E",X"03",X"21",X"D8",X"44",X"77",X"2E",X"F8",X"77",X"21",X"17",X"45",X"77",X"23", + X"77",X"C9",X"21",X"E3",X"42",X"11",X"1C",X"00",X"3E",X"25",X"0E",X"04",X"CD",X"95",X"28",X"2E", + X"43",X"36",X"F3",X"2E",X"47",X"77",X"2E",X"27",X"36",X"31",X"3E",X"1C",X"21",X"E3",X"46",X"1B", + X"0E",X"04",X"CD",X"A7",X"28",X"3E",X"03",X"21",X"E7",X"46",X"77",X"21",X"07",X"47",X"77",X"2E", + X"43",X"77",X"2E",X"04",X"36",X"0F",X"23",X"36",X"14",X"3E",X"1D",X"32",X"E5",X"46",X"C9",X"21", + X"04",X"43",X"36",X"36",X"23",X"36",X"37",X"C9",X"3E",X"F9",X"32",X"E5",X"42",X"21",X"04",X"43", + X"36",X"36",X"23",X"36",X"40",X"C9",X"21",X"50",X"40",X"36",X"5C",X"23",X"36",X"5D",X"23",X"36", + X"5E",X"21",X"6F",X"40",X"11",X"1C",X"00",X"3E",X"5F",X"0E",X"03",X"CD",X"95",X"28",X"23",X"77", + X"23",X"3C",X"77",X"23",X"3C",X"77",X"21",X"4F",X"44",X"3E",X"0D",X"0E",X"05",X"CD",X"A7",X"28", + X"21",X"6F",X"44",X"3E",X"0B",X"77",X"2E",X"8F",X"77",X"23",X"36",X"0C",X"C9",X"21",X"51",X"40", + X"11",X"1E",X"00",X"3E",X"6E",X"0E",X"02",X"CD",X"95",X"28",X"21",X"B1",X"40",X"3E",X"72",X"0E", + X"02",X"C3",X"95",X"28",X"21",X"6F",X"40",X"11",X"1E",X"00",X"3E",X"7E",X"0E",X"02",X"CD",X"95", + X"28",X"21",X"51",X"40",X"36",X"5D",X"23",X"36",X"5E",X"19",X"23",X"36",X"61",X"23",X"36",X"62", + X"21",X"B1",X"40",X"3E",X"76",X"0E",X"02",X"C3",X"95",X"28",X"3E",X"82",X"32",X"8F",X"40",X"21", + X"51",X"40",X"3E",X"6E",X"11",X"1E",X"00",X"0E",X"02",X"CD",X"95",X"28",X"21",X"B1",X"40",X"3E", + X"7A",X"0E",X"02",X"C3",X"95",X"28",X"21",X"3B",X"43",X"11",X"1C",X"00",X"0E",X"03",X"3E",X"83", + X"CD",X"95",X"28",X"21",X"3B",X"47",X"0E",X"03",X"3E",X"1B",X"C3",X"A7",X"28",X"21",X"3C",X"43", + X"36",X"8F",X"23",X"36",X"90",X"C9",X"21",X"3B",X"43",X"11",X"1C",X"00",X"0E",X"03",X"3E",X"95", + X"CD",X"95",X"28",X"21",X"3B",X"47",X"0E",X"03",X"3E",X"09",X"C3",X"A7",X"28",X"21",X"3D",X"43", + X"11",X"1E",X"00",X"3E",X"A1",X"0E",X"03",X"CD",X"95",X"28",X"21",X"5C",X"43",X"36",X"A3",X"23", + X"36",X"9B",X"C9",X"11",X"80",X"4C",X"21",X"00",X"4E",X"06",X"03",X"1A",X"BE",X"20",X"05",X"23", + X"13",X"10",X"F8",X"C9",X"D0",X"2E",X"00",X"1E",X"80",X"01",X"03",X"00",X"ED",X"B0",X"3A",X"40", + X"50",X"0F",X"0F",X"C9",X"3A",X"83",X"4C",X"FE",X"A9",X"C0",X"CD",X"D0",X"3A",X"C8",X"00",X"00", + X"ED",X"B0",X"C9",X"7E",X"81",X"77",X"FE",X"04",X"D8",X"D6",X"04",X"77",X"06",X"02",X"CD",X"DA", + X"2A",X"06",X"03",X"CD",X"DA",X"2A",X"CD",X"C0",X"31",X"C9",X"37",X"2B",X"7E",X"CE",X"00",X"27", + X"77",X"10",X"F8",X"C9",X"21",X"D4",X"4F",X"46",X"21",X"C4",X"4F",X"4E",X"78",X"E6",X"0F",X"C8", + X"78",X"0F",X"30",X"06",X"CB",X"D9",X"CB",X"81",X"18",X"19",X"0F",X"30",X"06",X"CB",X"99",X"CB", + X"C9",X"18",X"10",X"0F",X"30",X"06",X"CB",X"99",X"CB",X"89",X"18",X"07",X"0F",X"30",X"04",X"CB", + X"D9",X"CB",X"C1",X"71",X"11",X"8F",X"4C",X"1A",X"3C",X"12",X"4F",X"78",X"E6",X"09",X"20",X"3D", + X"78",X"E6",X"06",X"20",X"08",X"3A",X"D5",X"4F",X"47",X"E6",X"09",X"20",X"30",X"79",X"FE",X"04", + X"20",X"05",X"CB",X"D6",X"CB",X"86",X"C9",X"FE",X"08",X"20",X"05",X"CB",X"D6",X"CB",X"C6",X"C9", + X"FE",X"0C",X"20",X"04",X"CB",X"96",X"18",X"F5",X"FE",X"10",X"20",X"02",X"18",X"ED",X"FE",X"14", + X"20",X"02",X"18",X"DE",X"FE",X"18",X"C0",X"CB",X"96",X"CB",X"86",X"18",X"2F",X"79",X"FE",X"04", + X"20",X"05",X"CB",X"D6",X"CB",X"8E",X"C9",X"FE",X"08",X"20",X"05",X"CB",X"D6",X"CB",X"CE",X"C9", + X"FE",X"0C",X"20",X"05",X"CB",X"96",X"CB",X"CE",X"C9",X"FE",X"10",X"20",X"02",X"18",X"EC",X"FE", + X"14",X"20",X"02",X"18",X"DD",X"FE",X"18",X"C0",X"CB",X"96",X"CB",X"8E",X"AF",X"12",X"C9",X"E5", + X"D5",X"CD",X"51",X"3A",X"D1",X"E1",X"3E",X"7F",X"20",X"02",X"1A",X"96",X"13",X"23",X"F0",X"ED", + X"44",X"C9",X"CD",X"8F",X"2B",X"4F",X"18",X"F2",X"3A",X"11",X"4E",X"B7",X"C0",X"21",X"E8",X"4F", + X"06",X"02",X"11",X"E4",X"4F",X"CD",X"A2",X"2B",X"81",X"38",X"05",X"FE",X"08",X"DC",X"C3",X"2B", + X"10",X"F0",X"C9",X"E5",X"7D",X"D6",X"22",X"6F",X"CB",X"5E",X"E1",X"C0",X"3E",X"83",X"32",X"5C", + X"4C",X"3E",X"FF",X"32",X"90",X"4C",X"21",X"20",X"4C",X"CB",X"F6",X"F1",X"C9",X"11",X"1E",X"4C", + X"CD",X"23",X"2C",X"21",X"20",X"4C",X"7E",X"0F",X"D8",X"0F",X"D8",X"1A",X"B7",X"C8",X"FE",X"01", + X"3A",X"01",X"4C",X"4F",X"3A",X"40",X"50",X"28",X"1C",X"CB",X"77",X"20",X"18",X"36",X"83",X"1A", + X"3D",X"3D",X"27",X"12",X"21",X"1C",X"4C",X"71",X"23",X"71",X"AF",X"32",X"87",X"4C",X"32",X"90", + X"4C",X"32",X"5C",X"4C",X"C9",X"CB",X"6F",X"C0",X"36",X"81",X"1A",X"3D",X"27",X"12",X"21",X"1C", + X"4C",X"18",X"E6",X"21",X"83",X"4C",X"7E",X"E6",X"FE",X"FE",X"08",X"C0",X"7E",X"2F",X"32",X"07", + X"50",X"0F",X"D8",X"C3",X"B5",X"3A",X"EB",X"35",X"EB",X"C0",X"13",X"1A",X"1B",X"12",X"C9",X"E5", + X"7D",X"D6",X"10",X"6F",X"7E",X"0F",X"E1",X"23",X"30",X"01",X"34",X"2B",X"0F",X"30",X"01",X"34", + X"0F",X"30",X"01",X"35",X"0F",X"D0",X"23",X"35",X"2B",X"C9",X"CD",X"E9",X"2D",X"0C",X"C2",X"4F", + X"B4",X"83",X"F8",X"01",X"00",X"83",X"48",X"09",X"48",X"09",X"00",X"00",X"CD",X"E9",X"2D",X"0C", + X"E2",X"4F",X"00",X"00",X"88",X"18",X"00",X"00",X"A0",X"B0",X"70",X"B0",X"01",X"01",X"C9",X"7E", + X"D6",X"10",X"0F",X"0F",X"0F",X"E6",X"1F",X"57",X"23",X"7E",X"2B",X"D6",X"10",X"2F",X"06",X"03", + X"CB",X"3A",X"1F",X"10",X"FB",X"5F",X"C9",X"21",X"8C",X"4C",X"7E",X"3C",X"77",X"FE",X"08",X"D8", + X"36",X"00",X"21",X"D8",X"4F",X"CD",X"C0",X"2C",X"23",X"23",X"7D",X"FE",X"DC",X"20",X"F6",X"3A", + X"10",X"4E",X"B7",X"C8",X"CD",X"00",X"20",X"3D",X"28",X"2B",X"3D",X"28",X"19",X"3D",X"28",X"16", + X"E5",X"46",X"7D",X"D6",X"10",X"6F",X"4E",X"78",X"E6",X"06",X"79",X"20",X"04",X"EE",X"02",X"18", + X"02",X"EE",X"01",X"77",X"E1",X"C9",X"3A",X"07",X"4E",X"E6",X"81",X"E8",X"7D",X"D6",X"10",X"6F", + X"7E",X"EE",X"04",X"77",X"C9",X"21",X"CC",X"4F",X"7E",X"E6",X"FC",X"77",X"C9",X"21",X"D8",X"4F", + X"46",X"7D",X"D6",X"10",X"6F",X"7E",X"CB",X"08",X"30",X"06",X"CB",X"D7",X"CB",X"87",X"18",X"18", + X"CB",X"08",X"30",X"06",X"CB",X"97",X"CB",X"CF",X"18",X"0E",X"CB",X"08",X"30",X"04",X"E6",X"F9", + X"18",X"06",X"CB",X"08",X"30",X"02",X"F6",X"05",X"77",X"7D",X"C6",X"12",X"6F",X"FE",X"DC",X"28", + X"05",X"FE",X"DE",X"38",X"CB",X"C9",X"3A",X"10",X"4E",X"B7",X"C8",X"CD",X"00",X"20",X"FE",X"02", + X"28",X"05",X"FE",X"03",X"C8",X"18",X"B9",X"46",X"21",X"CC",X"4F",X"CB",X"48",X"20",X"06",X"CB", + X"50",X"C8",X"CB",X"8E",X"C9",X"CB",X"CE",X"C9",X"23",X"23",X"7D",X"FE",X"E6",X"28",X"F9",X"FE", + X"EE",X"D8",X"33",X"33",X"C9",X"21",X"E8",X"4F",X"06",X"02",X"11",X"E6",X"4F",X"CD",X"61",X"3A", + X"81",X"38",X"05",X"FE",X"05",X"DC",X"6B",X"2D",X"10",X"F0",X"C9",X"3A",X"C6",X"4F",X"E6",X"F8", + X"FE",X"B8",X"C0",X"E5",X"7D",X"FE",X"EA",X"3E",X"FF",X"21",X"CA",X"4F",X"28",X"09",X"CB",X"5E", + X"20",X"1D",X"32",X"EF",X"4F",X"18",X"09",X"2B",X"2B",X"CB",X"5E",X"20",X"12",X"32",X"EE",X"4F", + X"CB",X"DE",X"23",X"36",X"10",X"CD",X"EE",X"31",X"CD",X"57",X"2F",X"21",X"1B",X"4E",X"34",X"E1", + X"C9",X"21",X"00",X"4D",X"11",X"00",X"4E",X"18",X"16",X"21",X"80",X"4D",X"11",X"00",X"4E",X"18", + X"0E",X"21",X"00",X"4E",X"11",X"00",X"4D",X"18",X"06",X"21",X"00",X"4E",X"11",X"80",X"4D",X"01", + X"40",X"00",X"ED",X"B0",X"C9",X"AF",X"77",X"23",X"10",X"FC",X"C9",X"77",X"23",X"0D",X"20",X"FB", + X"C9",X"CD",X"CB",X"2D",X"10",X"FB",X"C9",X"AF",X"18",X"02",X"3E",X"01",X"32",X"03",X"50",X"C9", + X"AF",X"18",X"02",X"3E",X"01",X"32",X"01",X"50",X"C9",X"E1",X"46",X"23",X"5E",X"23",X"56",X"23", + X"7E",X"23",X"12",X"13",X"10",X"FA",X"E9",X"3A",X"20",X"4C",X"47",X"E6",X"03",X"28",X"18",X"CB", + X"50",X"3A",X"00",X"50",X"28",X"07",X"CB",X"67",X"28",X"03",X"3A",X"40",X"50",X"32",X"8D",X"4C", + X"CD",X"37",X"2F",X"79",X"32",X"D5",X"4F",X"21",X"83",X"4C",X"7E",X"E6",X"0E",X"FE",X"02",X"C0", + X"7E",X"2F",X"32",X"07",X"50",X"0F",X"D8",X"C3",X"00",X"18",X"CD",X"E9",X"2D",X"06",X"38",X"40", + X"54",X"49",X"44",X"45",X"52",X"43",X"CD",X"4C",X"2E",X"CD",X"E9",X"2D",X"03",X"D8",X"43",X"50", + X"55",X"01",X"CD",X"E9",X"2D",X"03",X"C5",X"43",X"50",X"55",X"02",X"C9",X"CD",X"E9",X"2D",X"08", + X"CC",X"43",X"45",X"52",X"4F",X"43",X"53",X"40",X"49",X"48",X"C9",X"21",X"00",X"44",X"01",X"00", + X"04",X"CD",X"D1",X"2D",X"C9",X"21",X"00",X"40",X"01",X"00",X"04",X"CD",X"D1",X"2D",X"C9",X"21", + X"00",X"30",X"11",X"40",X"40",X"01",X"C0",X"02",X"7E",X"D7",X"F6",X"F0",X"12",X"13",X"7E",X"F6", + X"F0",X"12",X"13",X"23",X"0D",X"20",X"F1",X"10",X"EF",X"CD",X"E9",X"2D",X"0A",X"C7",X"41",X"E0", + X"E1",X"E1",X"E2",X"D3",X"E3",X"E1",X"E1",X"E2",X"E3",X"CD",X"E9",X"2D",X"0A",X"27",X"42",X"E4", + X"E5",X"E5",X"E6",X"E5",X"E7",X"E5",X"E5",X"E6",X"E7",X"3E",X"D2",X"32",X"48",X"40",X"32",X"54", + X"40",X"32",X"61",X"40",X"32",X"E0",X"41",X"CD",X"F2",X"2E",X"CD",X"80",X"28",X"0A",X"73",X"41", + X"E8",X"E8",X"E8",X"E9",X"EA",X"EA",X"EB",X"E8",X"E8",X"EC",X"CD",X"80",X"28",X"0A",X"76",X"41", + X"ED",X"EE",X"EE",X"EF",X"D1",X"D1",X"ED",X"EE",X"EE",X"EE",X"21",X"94",X"42",X"11",X"DF",X"DE", + X"18",X"06",X"21",X"74",X"41",X"11",X"DD",X"DC",X"CD",X"0F",X"2F",X"72",X"23",X"CD",X"0F",X"2F", + X"73",X"C9",X"21",X"F0",X"41",X"11",X"DB",X"DA",X"18",X"06",X"21",X"E7",X"41",X"11",X"D9",X"D8", + X"CD",X"0F",X"2F",X"72",X"D5",X"11",X"20",X"00",X"19",X"D1",X"CD",X"0F",X"2F",X"73",X"C9",X"7E", + X"CD",X"1F",X"2F",X"C0",X"E5",X"21",X"05",X"4E",X"0E",X"01",X"CD",X"C3",X"2A",X"E1",X"C9",X"D6", + X"CC",X"C8",X"3D",X"C8",X"3D",X"C8",X"3D",X"C9",X"36",X"FF",X"23",X"36",X"FF",X"C9",X"36",X"FF", + X"11",X"20",X"00",X"19",X"36",X"FF",X"C9",X"06",X"04",X"0E",X"01",X"0F",X"D0",X"CB",X"21",X"10", + X"FA",X"C9",X"21",X"40",X"44",X"7E",X"E6",X"E0",X"F6",X"03",X"77",X"23",X"7C",X"FE",X"47",X"20", + X"F4",X"7D",X"FE",X"C0",X"C8",X"18",X"EE",X"2A",X"0E",X"4E",X"7C",X"FE",X"10",X"38",X"03",X"21", + X"00",X"09",X"11",X"02",X"4E",X"CD",X"29",X"3A",X"E5",X"CD",X"39",X"3A",X"22",X"0E",X"4E",X"E1", + X"CD",X"F7",X"39",X"2A",X"C4",X"4F",X"E5",X"2A",X"C6",X"4F",X"E5",X"AF",X"32",X"C7",X"4F",X"ED", + X"53",X"C4",X"4F",X"3A",X"83",X"4C",X"C6",X"60",X"47",X"3A",X"83",X"4C",X"B8",X"20",X"FA",X"E1", + X"22",X"C6",X"4F",X"E1",X"22",X"C4",X"4F",X"C9",X"00",X"8B",X"2F",X"15",X"00",X"FE",X"4E",X"B9", + X"FB",X"83",X"D5",X"95",X"2F",X"15",X"00",X"00",X"4F",X"B9",X"FB",X"83",X"C7",X"9F",X"2F",X"15", + X"00",X"7E",X"4F",X"B2",X"81",X"A7",X"30",X"6D",X"2F",X"15",X"00",X"14",X"4E",X"92",X"CE",X"7A", + X"C0",X"79",X"28",X"15",X"00",X"16",X"4E",X"A6",X"13",X"56",X"36",X"27",X"2F",X"15",X"00",X"1C", + X"4C",X"A6",X"13",X"14",X"E7",X"C7",X"2F",X"15",X"00",X"1D",X"4C",X"92",X"30",X"5C",X"A8",X"A9", + X"2F",X"15",X"00",X"9F",X"4C",X"B0",X"CB",X"98",X"08",X"55",X"2E",X"15",X"00",X"A0",X"4C",X"59", + X"EF",X"9E",X"D6",X"B9",X"2E",X"15",X"00",X"A2",X"4C",X"5C",X"4E",X"4E",X"91",X"31",X"2F",X"EF", + X"0A",X"AA",X"AA",X"A4",X"FC",X"3A",X"AA",X"A0",X"00",X"08",X"FC",X"3A",X"AA",X"AA",X"AA",X"A0", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C7",X"00",X"08",X"FF",X"FF",X"FF",X"FF",X"FF",X"C7", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"00",X"08",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7", + X"8F",X"F1",X"2F",X"F5",X"FF",X"19",X"2F",X"F7",X"00",X"08",X"FF",X"19",X"2F",X"F1",X"2F",X"F7", + X"8F",X"F7",X"8F",X"FB",X"FF",X"70",X"8F",X"F3",X"AA",X"A4",X"FF",X"70",X"8F",X"F7",X"8F",X"F7", + X"8F",X"F7",X"8F",X"FB",X"FF",X"70",X"8F",X"FF",X"FF",X"FF",X"FF",X"70",X"8F",X"F7",X"8F",X"F7", + X"8F",X"F3",X"4F",X"F6",X"FF",X"3A",X"4F",X"FF",X"FF",X"FF",X"FF",X"3A",X"4F",X"F3",X"4F",X"F7", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F1",X"2F",X"F5",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"4F",X"FB",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7", + X"8F",X"F1",X"2F",X"F5",X"FF",X"19",X"2F",X"FF",X"FF",X"F0",X"FF",X"09",X"2F",X"F1",X"2F",X"F7", + X"8F",X"F7",X"8F",X"FB",X"FF",X"70",X"8F",X"FF",X"FF",X"F0",X"FF",X"00",X"8F",X"F7",X"8F",X"F7", + X"8F",X"F7",X"8F",X"FB",X"FF",X"70",X"8F",X"F1",X"2F",X"F0",X"FF",X"00",X"8F",X"F7",X"8F",X"F7", + X"4F",X"F3",X"4F",X"F0",X"00",X"00",X"00",X"00",X"0F",X"F0",X"FF",X"0A",X"4F",X"F3",X"4F",X"F3", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"FF",X"0F",X"FF",X"FF",X"FF",X"FC", + X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"FF",X"0F",X"FF",X"FF",X"FF",X"FD", + X"2F",X"F1",X"2F",X"F0",X"00",X"00",X"00",X"00",X"0F",X"F0",X"FF",X"09",X"2F",X"F1",X"2F",X"F1", + X"8F",X"F7",X"8F",X"FB",X"FF",X"70",X"8F",X"F7",X"8F",X"F0",X"FF",X"00",X"8F",X"F7",X"8F",X"F7", + X"8F",X"F7",X"8F",X"FB",X"FF",X"70",X"8F",X"F7",X"8F",X"F0",X"FF",X"00",X"8F",X"F7",X"8F",X"F7", + X"8F",X"F3",X"4F",X"F6",X"FF",X"3A",X"4F",X"F3",X"4F",X"F0",X"FF",X"00",X"8F",X"F7",X"8F",X"F7", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"70",X"8F",X"F7",X"8F",X"F7", + X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3A",X"4F",X"F3",X"4F",X"F7", + X"8F",X"F1",X"99",X"92",X"FF",X"19",X"2F",X"F1",X"2F",X"F5",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7", + X"8F",X"F7",X"00",X"08",X"FF",X"3A",X"4F",X"F7",X"8F",X"FB",X"FF",X"FF",X"FF",X"FF",X"FF",X"D7", + X"8F",X"F7",X"00",X"08",X"FF",X"FF",X"FF",X"F7",X"8F",X"FB",X"FF",X"19",X"2F",X"F1",X"99",X"90", + X"8F",X"F3",X"AA",X"A4",X"FF",X"FF",X"FF",X"F3",X"4F",X"F6",X"FF",X"3A",X"4F",X"F7",X"00",X"00", + X"8F",X"FF",X"FF",X"FF",X"FF",X"19",X"2F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"00",X"00", + X"8E",X"FF",X"FF",X"FF",X"FF",X"70",X"8E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"D7",X"00",X"00", + X"09",X"99",X"99",X"92",X"ED",X"70",X"09",X"99",X"99",X"92",X"ED",X"19",X"99",X"90",X"00",X"00", + X"21",X"5E",X"4C",X"CB",X"46",X"C0",X"36",X"82",X"C9",X"21",X"5E",X"4C",X"36",X"81",X"C9",X"00", + X"00",X"21",X"5E",X"4C",X"36",X"00",X"C9",X"21",X"5D",X"4C",X"7E",X"B7",X"C0",X"36",X"82",X"C9", + X"21",X"5D",X"4C",X"36",X"00",X"23",X"23",X"36",X"81",X"C9",X"00",X"00",X"00",X"00",X"21",X"5D", + X"4C",X"36",X"81",X"C9",X"21",X"5D",X"4C",X"36",X"85",X"C9",X"21",X"83",X"4C",X"7E",X"E6",X"FE", + X"FE",X"A8",X"C0",X"7E",X"2F",X"32",X"07",X"50",X"0F",X"D8",X"C3",X"00",X"18",X"CD",X"FA",X"31", + X"3A",X"20",X"4C",X"E6",X"03",X"C8",X"21",X"5C",X"4C",X"7E",X"B7",X"28",X"05",X"CD",X"82",X"32", + X"18",X"5D",X"21",X"5D",X"4C",X"7E",X"23",X"23",X"B6",X"06",X"05",X"21",X"41",X"4C",X"CC",X"C5", + X"2D",X"21",X"5D",X"4C",X"7E",X"23",X"B6",X"21",X"46",X"4C",X"06",X"05",X"CC",X"C5",X"2D",X"21", + X"5E",X"4C",X"7E",X"B7",X"21",X"4B",X"4C",X"06",X"05",X"CC",X"C5",X"2D",X"21",X"5F",X"4C",X"7E", + X"B7",X"C4",X"14",X"34",X"21",X"5E",X"4C",X"7E",X"CB",X"47",X"20",X"04",X"B7",X"C4",X"E1",X"33", + X"21",X"5D",X"4C",X"7E",X"CB",X"47",X"20",X"05",X"CB",X"4F",X"C4",X"EC",X"33",X"21",X"5E",X"4C", + X"7E",X"CB",X"47",X"C4",X"F7",X"33",X"21",X"5D",X"4C",X"7E",X"CB",X"47",X"C4",X"02",X"34",X"C3", + X"08",X"33",X"CB",X"7F",X"CA",X"87",X"33",X"CB",X"BE",X"7E",X"E6",X"03",X"3D",X"21",X"9D",X"32", + X"28",X"2F",X"3D",X"21",X"A9",X"32",X"28",X"29",X"21",X"B5",X"32",X"18",X"24",X"01",X"01",X"00", + X"04",X"21",X"03",X"02",X"01",X"00",X"00",X"18",X"35",X"00",X"02",X"00",X"00",X"25",X"00",X"03", + X"04",X"00",X"00",X"96",X"35",X"00",X"02",X"00",X"00",X"25",X"00",X"02",X"04",X"00",X"00",X"CA", + X"35",X"11",X"50",X"4C",X"01",X"0C",X"00",X"ED",X"B0",X"CD",X"E3",X"2D",X"21",X"40",X"4C",X"06", + X"10",X"C3",X"C5",X"2D",X"AF",X"32",X"58",X"4C",X"2A",X"5A",X"4C",X"7E",X"B7",X"CA",X"14",X"33", + X"CD",X"19",X"33",X"3A",X"54",X"4C",X"CD",X"31",X"33",X"3A",X"50",X"4C",X"B7",X"28",X"14",X"23", + X"3A",X"53",X"4C",X"CD",X"31",X"33",X"3A",X"50",X"4C",X"3D",X"28",X"07",X"23",X"3A",X"52",X"4C", + X"CD",X"31",X"33",X"23",X"22",X"5A",X"4C",X"C9",X"21",X"40",X"4C",X"11",X"50",X"50",X"01",X"10", + X"00",X"ED",X"B0",X"C9",X"11",X"D4",X"32",X"D5",X"E9",X"7E",X"E5",X"E6",X"07",X"21",X"88",X"34", + X"CD",X"52",X"21",X"4E",X"E1",X"3A",X"51",X"4C",X"47",X"AF",X"81",X"10",X"FD",X"32",X"59",X"4C", + X"C9",X"E5",X"F5",X"CD",X"3D",X"33",X"F1",X"4F",X"CD",X"4D",X"33",X"E1",X"C9",X"7E",X"0F",X"0F", + X"E6",X"3E",X"21",X"90",X"34",X"CD",X"52",X"21",X"5E",X"23",X"56",X"EB",X"C9",X"11",X"4B",X"4C", + X"E6",X"03",X"C4",X"6A",X"33",X"11",X"46",X"4C",X"79",X"0F",X"0F",X"4F",X"E6",X"03",X"C4",X"6A", + X"33",X"11",X"41",X"4C",X"79",X"0F",X"0F",X"E6",X"03",X"C8",X"E5",X"3D",X"28",X"09",X"C5",X"44", + X"4D",X"09",X"3D",X"28",X"01",X"09",X"C1",X"EB",X"7B",X"D7",X"77",X"23",X"7A",X"77",X"23",X"7A", + X"D7",X"77",X"23",X"36",X"00",X"E1",X"C9",X"21",X"59",X"4C",X"7E",X"35",X"B7",X"E5",X"CC",X"D4", + X"32",X"E1",X"2B",X"7E",X"34",X"2B",X"B7",X"20",X"0A",X"E5",X"CB",X"BE",X"2B",X"CB",X"BE",X"2B", + X"CB",X"BE",X"E1",X"4F",X"7E",X"11",X"4F",X"4C",X"CD",X"BB",X"33",X"2B",X"7E",X"11",X"4A",X"4C", + X"CD",X"BB",X"33",X"2B",X"7E",X"11",X"45",X"4C",X"C3",X"BB",X"33",X"87",X"C8",X"D8",X"E5",X"21", + X"47",X"34",X"E6",X"1E",X"CD",X"52",X"21",X"7E",X"23",X"66",X"6F",X"79",X"0F",X"E6",X"7F",X"CD", + X"52",X"21",X"7E",X"B7",X"E1",X"28",X"07",X"CB",X"41",X"20",X"01",X"D7",X"12",X"C9",X"CB",X"FE", + X"C9",X"CB",X"BE",X"21",X"D0",X"34",X"11",X"6C",X"4C",X"C3",X"1F",X"34",X"CB",X"BE",X"11",X"60", + X"4C",X"21",X"DC",X"34",X"C3",X"1F",X"34",X"CB",X"BE",X"11",X"6C",X"4C",X"21",X"E8",X"34",X"C3", + X"1F",X"34",X"CB",X"BE",X"21",X"F4",X"34",X"CB",X"57",X"28",X"03",X"21",X"0C",X"35",X"11",X"60", + X"4C",X"C3",X"1F",X"34",X"CB",X"BE",X"21",X"00",X"35",X"11",X"F0",X"4C",X"C3",X"1F",X"34",X"CB", + X"7F",X"28",X"07",X"D5",X"01",X"0C",X"00",X"ED",X"B0",X"D1",X"D5",X"CD",X"38",X"34",X"CD",X"87", + X"33",X"D1",X"CD",X"38",X"34",X"C3",X"E3",X"2D",X"21",X"50",X"4C",X"06",X"0C",X"1A",X"4E",X"77", + X"79",X"12",X"23",X"13",X"10",X"F7",X"C9",X"00",X"00",X"59",X"34",X"62",X"34",X"6A",X"34",X"72", + X"34",X"7C",X"34",X"7E",X"34",X"80",X"34",X"84",X"34",X"36",X"9C",X"EF",X"EB",X"98",X"76",X"66", + X"55",X"00",X"13",X"57",X"99",X"75",X"54",X"33",X"22",X"00",X"7C",X"FF",X"EB",X"A8",X"77",X"65", + X"54",X"00",X"77",X"FF",X"77",X"FF",X"77",X"FF",X"77",X"FF",X"77",X"00",X"55",X"00",X"FF",X"00", + X"5C",X"5C",X"5C",X"00",X"12",X"23",X"34",X"00",X"01",X"02",X"04",X"06",X"08",X"0C",X"10",X"20", + X"00",X"00",X"DC",X"09",X"89",X"0A",X"2B",X"0B",X"F3",X"0B",X"88",X"0C",X"46",X"0D",X"0C",X"0E", + X"E6",X"0E",X"C9",X"0F",X"BA",X"10",X"B8",X"11",X"C6",X"12",X"E4",X"13",X"12",X"15",X"56",X"16", + X"E7",X"17",X"10",X"19",X"8C",X"1A",X"21",X"1C",X"CC",X"1D",X"93",X"1F",X"74",X"21",X"70",X"23", + X"8C",X"25",X"C7",X"27",X"25",X"2A",X"AC",X"2C",X"CF",X"2F",X"20",X"32",X"18",X"35",X"00",X"00", + X"01",X"01",X"00",X"04",X"02",X"00",X"02",X"05",X"00",X"00",X"18",X"36",X"00",X"01",X"00",X"00", + X"1C",X"04",X"04",X"00",X"00",X"00",X"40",X"36",X"01",X"01",X"00",X"0C",X"02",X"00",X"05",X"06", + X"00",X"00",X"6B",X"36",X"01",X"01",X"00",X"0C",X"20",X"06",X"05",X"00",X"00",X"00",X"94",X"36", + X"00",X"01",X"00",X"00",X"10",X"08",X"00",X"00",X"00",X"00",X"D4",X"36",X"01",X"01",X"00",X"08", + X"20",X"06",X"06",X"00",X"00",X"00",X"1C",X"37",X"00",X"3E",X"00",X"32",X"4F",X"50",X"3E",X"01", + X"32",X"4A",X"50",X"3E",X"02",X"32",X"45",X"50",X"F7",X"92",X"92",X"72",X"72",X"4C",X"4C",X"6C", + X"AC",X"74",X"B4",X"92",X"92",X"72",X"72",X"4C",X"4C",X"6C",X"AC",X"74",X"B4",X"92",X"92",X"72", + X"72",X"4C",X"4C",X"6A",X"AA",X"72",X"B2",X"34",X"34",X"72",X"B2",X"72",X"B2",X"24",X"24",X"74", + X"A4",X"74",X"A4",X"92",X"92",X"72",X"72",X"24",X"24",X"74",X"A4",X"74",X"A4",X"92",X"92",X"72", + X"72",X"24",X"24",X"74",X"A4",X"74",X"A4",X"92",X"92",X"72",X"72",X"24",X"24",X"72",X"A2",X"72", + X"A2",X"34",X"34",X"72",X"A2",X"72",X"A2",X"4C",X"4C",X"6C",X"AC",X"74",X"B4",X"F9",X"F9",X"00", + X"AF",X"21",X"5C",X"4C",X"77",X"23",X"77",X"23",X"77",X"23",X"36",X"81",X"CD",X"E0",X"2D",X"00", + X"00",X"00",X"00",X"F7",X"F9",X"F9",X"00",X"3E",X"04",X"32",X"4F",X"50",X"3E",X"06",X"32",X"4A", + X"50",X"F7",X"59",X"81",X"89",X"A9",X"59",X"81",X"89",X"A9",X"51",X"79",X"81",X"A1",X"51",X"79", + X"81",X"A1",X"59",X"81",X"89",X"A9",X"59",X"81",X"89",X"A9",X"61",X"81",X"91",X"B1",X"61",X"81", + X"91",X"B1",X"00",X"21",X"96",X"35",X"E5",X"C3",X"30",X"00",X"00",X"3E",X"06",X"32",X"45",X"50", + X"3E",X"00",X"32",X"4A",X"50",X"F7",X"B3",X"A9",X"B3",X"C1",X"B4",X"FC",X"53",X"49",X"53",X"61", + X"54",X"FC",X"B3",X"B1",X"FB",X"B1",X"C4",X"D4",X"DC",X"00",X"3E",X"01",X"32",X"51",X"4C",X"F7", + X"18",X"20",X"28",X"30",X"38",X"40",X"48",X"50",X"58",X"60",X"68",X"70",X"78",X"80",X"88",X"90", + X"98",X"A0",X"A8",X"B0",X"B8",X"C0",X"C8",X"D0",X"D8",X"E0",X"E8",X"F0",X"F8",X"00",X"3E",X"81", + X"32",X"5C",X"4C",X"CD",X"E0",X"2D",X"F7",X"F9",X"00",X"3E",X"01",X"32",X"4A",X"50",X"3E",X"02", + X"32",X"4F",X"50",X"F7",X"40",X"B8",X"58",X"B0",X"70",X"A8",X"58",X"A0",X"40",X"98",X"50",X"90", + X"68",X"88",X"80",X"80",X"68",X"78",X"50",X"70",X"00",X"21",X"5E",X"4C",X"36",X"00",X"F7",X"F9", + X"00",X"3E",X"04",X"32",X"45",X"50",X"3E",X"07",X"32",X"4A",X"50",X"F7",X"80",X"90",X"A0",X"B0", + X"C0",X"D0",X"E0",X"F0",X"E0",X"D0",X"C0",X"B0",X"A0",X"90",X"80",X"90",X"80",X"90",X"A0",X"B0", + X"C0",X"D0",X"E0",X"00",X"21",X"40",X"36",X"E5",X"C3",X"30",X"00",X"00",X"3E",X"01",X"32",X"4A", + X"50",X"3E",X"03",X"32",X"4F",X"50",X"F7",X"08",X"A8",X"18",X"98",X"28",X"88",X"38",X"78",X"48", + X"68",X"58",X"58",X"68",X"48",X"78",X"38",X"88",X"28",X"98",X"18",X"A8",X"08",X"00",X"21",X"6B", + X"36",X"E5",X"F7",X"F9",X"00",X"3E",X"01",X"32",X"45",X"50",X"3E",X"03",X"32",X"4A",X"50",X"F7", + X"40",X"B8",X"58",X"B0",X"78",X"A8",X"D8",X"A0",X"40",X"98",X"00",X"3E",X"07",X"32",X"45",X"50", + X"3E",X"04",X"32",X"4A",X"50",X"F7",X"50",X"90",X"68",X"88",X"80",X"80",X"68",X"78",X"50",X"70", + X"68",X"68",X"80",X"60",X"98",X"58",X"A8",X"50",X"98",X"48",X"80",X"40",X"00",X"21",X"5D",X"4C", + X"36",X"00",X"F7",X"F9",X"00",X"3E",X"07",X"32",X"45",X"50",X"F7",X"62",X"39",X"39",X"62",X"39", + X"39",X"99",X"99",X"89",X"89",X"7C",X"62",X"39",X"39",X"61",X"39",X"39",X"99",X"99",X"89",X"89", + X"7C",X"00",X"3E",X"07",X"32",X"45",X"50",X"F7",X"61",X"61",X"71",X"71",X"79",X"79",X"89",X"89", + X"79",X"79",X"71",X"71",X"61",X"61",X"72",X"61",X"61",X"71",X"71",X"79",X"79",X"89",X"89",X"79", + X"79",X"71",X"71",X"64",X"00",X"21",X"D4",X"36",X"E5",X"C3",X"30",X"00",X"00",X"3E",X"01",X"32", + X"45",X"50",X"3E",X"01",X"32",X"4A",X"50",X"F7",X"81",X"79",X"91",X"69",X"A1",X"59",X"B1",X"49", + X"C1",X"39",X"B1",X"49",X"A1",X"59",X"91",X"69",X"81",X"79",X"00",X"21",X"78",X"4C",X"34",X"7E", + X"FE",X"0A",X"28",X"07",X"21",X"1C",X"37",X"E5",X"C3",X"30",X"00",X"36",X"00",X"21",X"5D",X"4C", + X"36",X"00",X"F7",X"09",X"97",X"F9",X"B4",X"35",X"11",X"00",X"C6",X"12",X"F9",X"E0",X"00",X"00", + X"11",X"00",X"CD",X"12",X"B0",X"CB",X"96",X"00",X"52",X"37",X"11",X"00",X"DE",X"12",X"B0",X"CB", + X"96",X"50",X"64",X"37",X"11",X"00",X"DF",X"12",X"F9",X"DE",X"00",X"00",X"11",X"00",X"E9",X"12", + X"F9",X"DC",X"06",X"40",X"11",X"00",X"F2",X"12",X"F9",X"DC",X"0C",X"80",X"11",X"00",X"FF",X"12", + X"F9",X"E1",X"00",X"00",X"11",X"00",X"05",X"13",X"F9",X"DD",X"00",X"00",X"11",X"00",X"07",X"13", + X"F9",X"DA",X"00",X"00",X"11",X"00",X"0A",X"13",X"F9",X"DB",X"00",X"00",X"11",X"00",X"12",X"13", + X"B0",X"CB",X"98",X"21",X"6E",X"37",X"11",X"00",X"1F",X"13",X"BF",X"58",X"8D",X"35",X"CB",X"32", + X"11",X"00",X"27",X"13",X"F9",X"DB",X"00",X"00",X"11",X"00",X"2A",X"13",X"F9",X"DA",X"00",X"00", + X"11",X"00",X"44",X"13",X"BF",X"56",X"A4",X"9A",X"9C",X"34",X"11",X"00",X"49",X"13",X"F9",X"DC", + X"00",X"00",X"11",X"00",X"4E",X"13",X"F9",X"DA",X"00",X"00",X"11",X"00",X"5A",X"13",X"F9",X"DB", + X"00",X"00",X"11",X"00",X"5B",X"13",X"BF",X"56",X"59",X"56",X"D4",X"37",X"11",X"00",X"5F",X"0D", + X"C9",X"36",X"81",X"C3",X"E9",X"3E",X"C3",X"A8",X"2B",X"CD",X"3B",X"39",X"3A",X"C1",X"4F",X"B7", + X"CA",X"0A",X"39",X"CB",X"67",X"21",X"E4",X"4F",X"20",X"1B",X"CB",X"77",X"7E",X"20",X"10",X"FE", + X"50",X"28",X"2E",X"FE",X"18",X"CA",X"B2",X"38",X"FE",X"C0",X"28",X"45",X"C3",X"E8",X"38",X"B7", + X"28",X"4B",X"C3",X"E8",X"38",X"CB",X"6F",X"7E",X"20",X"0C",X"FE",X"C0",X"28",X"47",X"FE",X"58", + X"CA",X"DC",X"38",X"C3",X"E8",X"38",X"FE",X"02",X"30",X"F9",X"3E",X"0F",X"32",X"C0",X"4F",X"18", + X"F2",X"2E",X"D8",X"36",X"22",X"23",X"23",X"36",X"22",X"2E",X"E8",X"36",X"10",X"23",X"36",X"60", + X"23",X"36",X"01",X"23",X"36",X"60",X"3E",X"80",X"32",X"92",X"4C",X"32",X"94",X"4C",X"C3",X"E8", + X"38",X"2E",X"D4",X"36",X"44",X"21",X"C1",X"4F",X"CB",X"F6",X"C3",X"E8",X"38",X"21",X"C1",X"4F", + X"CB",X"E6",X"C3",X"E8",X"38",X"2E",X"D8",X"36",X"44",X"23",X"23",X"36",X"44",X"2E",X"C8",X"36", + X"E0",X"23",X"36",X"07",X"23",X"36",X"E0",X"23",X"36",X"05",X"3E",X"40",X"32",X"32",X"42",X"32", + X"52",X"42",X"E5",X"21",X"F7",X"41",X"06",X"07",X"11",X"20",X"00",X"77",X"19",X"10",X"FC",X"E1", + X"18",X"A7",X"21",X"CC",X"4F",X"36",X"C0",X"23",X"36",X"07",X"2E",X"EC",X"36",X"00",X"23",X"36", + X"60",X"2E",X"DC",X"36",X"44",X"3E",X"0D",X"32",X"96",X"4C",X"21",X"06",X"4E",X"36",X"00",X"23", + X"36",X"01",X"23",X"3E",X"FF",X"77",X"32",X"10",X"4E",X"C3",X"E8",X"38",X"2E",X"D4",X"36",X"22", + X"21",X"C1",X"4F",X"CB",X"EE",X"CD",X"94",X"3A",X"CD",X"55",X"2D",X"CD",X"C6",X"15",X"CD",X"40", + X"26",X"CD",X"1D",X"0A",X"CD",X"81",X"09",X"CD",X"6A",X"11",X"CD",X"0A",X"20",X"CD",X"27",X"13", + X"CD",X"E4",X"2A",X"CD",X"97",X"2C",X"CD",X"ED",X"2C",X"C9",X"21",X"E4",X"4F",X"36",X"10",X"23", + X"36",X"60",X"21",X"33",X"39",X"11",X"C4",X"4F",X"01",X"08",X"00",X"ED",X"B0",X"21",X"D4",X"4F", + X"36",X"22",X"3E",X"01",X"32",X"C1",X"4F",X"3E",X"0F",X"32",X"CE",X"4F",X"21",X"05",X"00",X"22", + X"0E",X"4E",X"C9",X"F8",X"01",X"00",X"00",X"E0",X"07",X"E0",X"05",X"3A",X"C8",X"4F",X"CB",X"5F", + X"28",X"04",X"AF",X"32",X"92",X"4C",X"3A",X"CA",X"4F",X"CB",X"5F",X"C8",X"AF",X"32",X"94",X"4C", + X"C9",X"21",X"C1",X"4F",X"7E",X"34",X"FE",X"80",X"D8",X"21",X"C0",X"4F",X"36",X"1F",X"C9",X"7E", + X"FE",X"04",X"D0",X"3A",X"5C",X"4C",X"FE",X"03",X"C0",X"36",X"05",X"C9",X"3E",X"19",X"21",X"2A", + X"46",X"11",X"1D",X"00",X"0E",X"04",X"C3",X"A7",X"28",X"3E",X"19",X"21",X"6A",X"45",X"11",X"1D", + X"00",X"0E",X"04",X"C3",X"A7",X"28",X"11",X"C8",X"4F",X"21",X"EE",X"4F",X"7E",X"B7",X"28",X"0E", + X"35",X"20",X"07",X"06",X"A0",X"CD",X"AE",X"39",X"18",X"04",X"AF",X"32",X"92",X"4C",X"23",X"13", + X"13",X"7E",X"B7",X"C8",X"35",X"06",X"70",X"28",X"05",X"AF",X"32",X"94",X"4C",X"C9",X"D5",X"E5", + X"23",X"23",X"36",X"00",X"E1",X"EB",X"36",X"48",X"23",X"36",X"09",X"7D",X"C6",X"1F",X"6F",X"70", + X"23",X"36",X"B0",X"7D",X"D6",X"31",X"6F",X"36",X"00",X"C6",X"20",X"6F",X"36",X"10",X"EB",X"E5", + X"CD",X"29",X"10",X"E1",X"D1",X"3A",X"48",X"50",X"07",X"C9",X"3A",X"8D",X"50",X"E6",X"C0",X"C8", + X"87",X"87",X"D8",X"00",X"00",X"21",X"12",X"4E",X"34",X"C9",X"3A",X"20",X"4C",X"E6",X"03",X"C8", + X"3A",X"06",X"4E",X"32",X"9F",X"4C",X"C9",X"16",X"01",X"7D",X"1E",X"10",X"FE",X"05",X"C8",X"1E", + X"14",X"FE",X"10",X"C8",X"1E",X"18",X"FE",X"20",X"20",X"06",X"7C",X"B7",X"C8",X"1E",X"38",X"C9", + X"1E",X"1C",X"FE",X"40",X"20",X"06",X"7C",X"B7",X"C8",X"1E",X"3C",X"C9",X"1E",X"30",X"FE",X"80", + X"C8",X"1E",X"34",X"FE",X"60",X"C8",X"1E",X"50",X"C9",X"1A",X"85",X"27",X"12",X"1B",X"1A",X"8C", + X"27",X"12",X"1B",X"1A",X"CE",X"00",X"27",X"12",X"C9",X"7D",X"32",X"0C",X"4E",X"85",X"27",X"6F", + X"7C",X"32",X"0B",X"4E",X"8C",X"27",X"67",X"3E",X"FF",X"32",X"0D",X"4E",X"D0",X"21",X"99",X"99", + X"C9",X"7D",X"D6",X"30",X"6F",X"7B",X"D6",X"30",X"5F",X"1A",X"AE",X"E6",X"80",X"C8",X"C3",X"7E", + X"3A",X"E5",X"D5",X"CD",X"76",X"3A",X"D1",X"E1",X"3E",X"7F",X"20",X"07",X"CD",X"9A",X"2B",X"4F", + X"C3",X"9A",X"2B",X"23",X"23",X"C9",X"7D",X"D6",X"10",X"6F",X"7B",X"D6",X"10",X"5F",X"1A",X"B6", + X"E6",X"0F",X"FE",X"09",X"C8",X"FE",X"06",X"C8",X"FE",X"01",X"C8",X"FE",X"02",X"C8",X"FE",X"04", + X"C8",X"FE",X"08",X"C9",X"3A",X"81",X"4C",X"FE",X"20",X"D8",X"E5",X"21",X"BC",X"42",X"11",X"20", + X"00",X"06",X"05",X"AF",X"86",X"19",X"10",X"FC",X"FE",X"65",X"E1",X"C8",X"3E",X"01",X"32",X"01", + X"4C",X"32",X"20",X"4C",X"C9",X"3E",X"01",X"32",X"04",X"50",X"21",X"D0",X"4C",X"34",X"7E",X"FE", + X"3C",X"D8",X"36",X"00",X"23",X"34",X"7E",X"FE",X"1E",X"D8",X"AF",X"77",X"32",X"04",X"50",X"C9", + X"3A",X"D1",X"4C",X"FE",X"07",X"C8",X"FE",X"0B",X"C8",X"87",X"E6",X"7E",X"21",X"BD",X"0E",X"CD", + X"52",X"21",X"3A",X"C0",X"50",X"E6",X"00",X"00",X"C9",X"23",X"3A",X"80",X"50",X"86",X"C0",X"B0", + X"C9",X"21",X"9D",X"4C",X"7E",X"B7",X"C8",X"35",X"C0",X"23",X"36",X"00",X"C9",X"E5",X"D5",X"7D", + X"C6",X"10",X"6F",X"7E",X"FE",X"88",X"28",X"06",X"56",X"21",X"32",X"3B",X"18",X"06",X"23",X"56", + X"2B",X"21",X"3E",X"3B",X"CD",X"1D",X"3B",X"D1",X"E1",X"D4",X"C5",X"1A",X"C9",X"3A",X"9E",X"4C", + X"FE",X"0A",X"38",X"02",X"3E",X"0A",X"E6",X"0E",X"CD",X"52",X"21",X"7A",X"BE",X"D8",X"23",X"BE", + X"3F",X"C9",X"18",X"FF",X"20",X"F8",X"28",X"F0",X"30",X"E8",X"40",X"D8",X"50",X"C8",X"20",X"FF", + X"30",X"FF",X"40",X"FF",X"50",X"F8",X"60",X"F0",X"6C",X"E8",X"3A",X"83",X"4C",X"E6",X"7F",X"FE", + X"75",X"C0",X"ED",X"5F",X"85",X"83",X"E6",X"03",X"CD",X"8F",X"3B",X"1A",X"CB",X"7F",X"C0",X"E6", + X"7F",X"FE",X"10",X"D0",X"E5",X"CD",X"A7",X"3B",X"E1",X"C0",X"E5",X"7C",X"C6",X"04",X"67",X"CD", + X"B4",X"3B",X"E1",X"C0",X"D5",X"E5",X"CD",X"D7",X"3B",X"D1",X"E1",X"34",X"CB",X"FE",X"EB",X"06", + X"BE",X"70",X"23",X"04",X"70",X"04",X"CD",X"50",X"21",X"2B",X"70",X"04",X"23",X"70",X"C9",X"11", + X"1E",X"4E",X"21",X"A8",X"42",X"C8",X"13",X"21",X"28",X"41",X"3D",X"C8",X"13",X"21",X"B1",X"42", + X"3D",X"C8",X"13",X"21",X"31",X"41",X"C9",X"7E",X"23",X"A6",X"F5",X"CD",X"50",X"21",X"F1",X"A6", + X"2B",X"A6",X"3C",X"C9",X"7E",X"E6",X"1F",X"FE",X"02",X"28",X"07",X"FE",X"04",X"28",X"03",X"FE", + X"06",X"C0",X"47",X"23",X"7E",X"E6",X"1F",X"B8",X"C0",X"CD",X"50",X"21",X"7E",X"E6",X"1F",X"B8", + X"C0",X"2B",X"7E",X"E6",X"1F",X"B8",X"C9",X"CD",X"E5",X"3B",X"21",X"1E",X"4E",X"06",X"04",X"CB", + X"BE",X"23",X"10",X"FB",X"C9",X"11",X"1E",X"4E",X"21",X"A8",X"42",X"CD",X"FD",X"3B",X"21",X"28", + X"41",X"CD",X"FD",X"3B",X"21",X"B1",X"42",X"CD",X"FD",X"3B",X"21",X"31",X"41",X"1A",X"13",X"87", + X"D0",X"06",X"FF",X"70",X"23",X"70",X"CD",X"50",X"21",X"70",X"2B",X"70",X"C9",X"7A",X"D6",X"BE", + X"C8",X"3D",X"C8",X"3D",X"C8",X"3D",X"C9",X"2A",X"E4",X"4F",X"7D",X"FE",X"B8",X"28",X"1B",X"FE", + X"58",X"C0",X"7C",X"FE",X"C0",X"28",X"0B",X"FE",X"78",X"C0",X"21",X"31",X"41",X"11",X"21",X"4E", + X"18",X"1E",X"21",X"28",X"41",X"11",X"1F",X"4E",X"18",X"16",X"7C",X"FE",X"C0",X"28",X"0B",X"FE", + X"78",X"C0",X"21",X"B1",X"42",X"11",X"20",X"4E",X"18",X"06",X"21",X"A8",X"42",X"11",X"1E",X"4E", + X"1A",X"07",X"D0",X"EB",X"CB",X"BE",X"EB",X"CD",X"01",X"3C",X"21",X"88",X"18",X"22",X"E4",X"4F", + X"C9",X"11",X"1E",X"4E",X"21",X"A8",X"42",X"CD",X"79",X"3C",X"21",X"28",X"41",X"CD",X"79",X"3C", + X"21",X"B1",X"42",X"CD",X"79",X"3C",X"21",X"31",X"41",X"1A",X"13",X"87",X"D0",X"C3",X"7F",X"3B", + X"3A",X"AE",X"4C",X"B7",X"28",X"06",X"CD",X"C4",X"1D",X"C3",X"86",X"03",X"3A",X"AC",X"4C",X"07", + X"38",X"0D",X"21",X"AF",X"4C",X"35",X"20",X"04",X"AF",X"32",X"AC",X"4C",X"C3",X"86",X"03",X"3E", + X"01",X"32",X"AC",X"4C",X"3E",X"FF",X"32",X"AF",X"4C",X"21",X"E0",X"4F",X"06",X"20",X"36",X"00", + X"23",X"10",X"FB",X"3E",X"03",X"CD",X"5B",X"2E",X"CD",X"50",X"0D",X"CD",X"38",X"22",X"CD",X"DD", + X"3C",X"CD",X"C7",X"3C",X"C3",X"86",X"03",X"3E",X"01",X"01",X"E0",X"FF",X"11",X"40",X"4E",X"21", + X"CB",X"42",X"F5",X"CD",X"0F",X"3D",X"F1",X"3C",X"FE",X"06",X"20",X"F6",X"C9",X"CD",X"DF",X"0C", + X"CD",X"02",X"0D",X"CD",X"80",X"28",X"0F",X"08",X"41",X"53",X"52",X"45",X"59",X"41",X"4C",X"50", + X"40",X"54",X"55",X"4F",X"40",X"52",X"41",X"46",X"21",X"08",X"45",X"06",X"0F",X"36",X"01",X"CD", + X"50",X"21",X"10",X"F9",X"21",X"CB",X"46",X"06",X"0C",X"36",X"05",X"23",X"10",X"FB",X"C9",X"E5", + X"77",X"09",X"09",X"3E",X"03",X"08",X"1A",X"77",X"13",X"09",X"08",X"3D",X"20",X"F7",X"09",X"CD", + X"26",X"3D",X"E1",X"23",X"23",X"C9",X"3E",X"03",X"08",X"1A",X"D7",X"E6",X"0F",X"20",X"15",X"09", + X"1A",X"E6",X"0F",X"20",X"14",X"09",X"13",X"08",X"3D",X"20",X"ED",X"08",X"36",X"00",X"C9",X"08", + X"1A",X"D7",X"E6",X"0F",X"77",X"09",X"1A",X"E6",X"0F",X"77",X"09",X"13",X"08",X"3D",X"20",X"EF", + X"18",X"E9",X"78",X"32",X"68",X"4E",X"B7",X"20",X"05",X"7E",X"E6",X"7D",X"77",X"C9",X"CB",X"7E", + X"20",X"2D",X"CD",X"F9",X"0E",X"3A",X"AF",X"4C",X"B7",X"C0",X"21",X"AE",X"4C",X"18",X"EA",X"79", + X"32",X"68",X"4E",X"B7",X"20",X"08",X"7E",X"E6",X"86",X"77",X"CD",X"D7",X"2D",X"C9",X"CB",X"76", + X"20",X"2D",X"CD",X"F9",X"0E",X"3A",X"AF",X"4C",X"B7",X"C0",X"21",X"AE",X"4C",X"18",X"E7",X"CB", + X"BE",X"F5",X"CD",X"D7",X"2D",X"F1",X"CD",X"D8",X"3D",X"CD",X"6B",X"0F",X"36",X"41",X"AF",X"12", + X"CD",X"80",X"28",X"07",X"84",X"41",X"01",X"52",X"45",X"59",X"41",X"4C",X"50",X"18",X"23",X"CB", + X"B6",X"F5",X"3A",X"00",X"50",X"CB",X"67",X"C4",X"DA",X"2D",X"F1",X"CD",X"D8",X"3D",X"CD",X"6B", + X"0F",X"36",X"41",X"AF",X"12",X"CD",X"80",X"28",X"07",X"84",X"41",X"02",X"52",X"45",X"59",X"41", + X"4C",X"50",X"3E",X"40",X"32",X"AF",X"4C",X"C9",X"F5",X"3E",X"03",X"CD",X"5B",X"2E",X"CD",X"50", + X"0D",X"CD",X"38",X"22",X"CD",X"E3",X"3C",X"CD",X"C7",X"3C",X"CD",X"F1",X"3D",X"F1",X"C3",X"9B", + X"3E",X"CD",X"80",X"28",X"15",X"C6",X"40",X"53",X"4C",X"41",X"49",X"54",X"49",X"4E",X"49",X"40", + X"52",X"55",X"4F",X"59",X"40",X"4E",X"47",X"49",X"53",X"40",X"4F",X"54",X"21",X"C6",X"44",X"06", + X"15",X"36",X"05",X"CD",X"50",X"21",X"10",X"F9",X"CD",X"80",X"28",X"13",X"D5",X"40",X"48",X"54", + X"49",X"57",X"40",X"4C",X"41",X"49",X"54",X"49",X"4E",X"49",X"40",X"54",X"43",X"45",X"4C",X"45", + X"53",X"CD",X"80",X"28",X"10",X"16",X"41",X"54",X"46",X"45",X"4C",X"40",X"40",X"44",X"4E",X"41", + X"40",X"40",X"54",X"48",X"47",X"49",X"52",X"CD",X"80",X"28",X"0D",X"78",X"41",X"4E",X"57",X"4F", + X"44",X"40",X"48",X"54",X"49",X"57",X"40",X"42",X"55",X"52",X"CD",X"80",X"28",X"0D",X"79",X"41", + X"50",X"55",X"40",X"48",X"54",X"49",X"57",X"40",X"45",X"54",X"49",X"52",X"57",X"21",X"D5",X"44", + X"0E",X"05",X"E5",X"06",X"13",X"36",X"05",X"CD",X"50",X"21",X"10",X"F9",X"E1",X"23",X"0D",X"20", + X"F1",X"CD",X"80",X"28",X"07",X"DB",X"41",X"00",X"04",X"40",X"45",X"4D",X"49",X"54",X"21",X"84", + X"45",X"06",X"07",X"36",X"07",X"CD",X"50",X"21",X"10",X"F9",X"C9",X"21",X"0B",X"45",X"D6",X"05", + X"ED",X"44",X"87",X"CD",X"52",X"21",X"06",X"0F",X"36",X"01",X"CD",X"50",X"21",X"10",X"F9",X"C9", + X"3A",X"83",X"4C",X"E6",X"3F",X"FE",X"17",X"C0",X"21",X"AF",X"4C",X"7E",X"D6",X"01",X"27",X"77", + X"D7",X"E6",X"0F",X"20",X"02",X"3E",X"40",X"32",X"FB",X"41",X"7E",X"E6",X"0F",X"32",X"DB",X"41", + X"C9",X"00",X"19",X"19",X"B8",X"29",X"B3",X"B0",X"C2",X"3E",X"11",X"00",X"1C",X"19",X"B8",X"29", + X"3A",X"80",X"50",X"CB",X"6F",X"C8",X"C3",X"A8",X"2B",X"3A",X"80",X"50",X"E6",X"3F",X"C0",X"3E", + X"03",X"CD",X"5B",X"2E",X"3E",X"40",X"CD",X"65",X"2E",X"CD",X"80",X"28",X"06",X"89",X"40",X"57", + X"53",X"40",X"50",X"49",X"44",X"0E",X"00",X"3A",X"80",X"50",X"E6",X"3F",X"47",X"3A",X"80",X"50", + X"A8",X"E6",X"3F",X"B1",X"FE",X"3F",X"28",X"06",X"4F",X"32",X"C0",X"50",X"18",X"EF",X"3E",X"40", + X"CD",X"65",X"2E",X"21",X"D0",X"4C",X"36",X"00",X"23",X"10",X"FB",X"CD",X"80",X"28",X"0A",X"83", + X"40",X"4B",X"48",X"43",X"40",X"4D",X"55",X"54",X"53",X"55",X"43",X"3E",X"01",X"32",X"04",X"50", + X"32",X"07",X"50",X"0E",X"04",X"32",X"C0",X"50",X"10",X"FB",X"0D",X"20",X"F8",X"AF",X"32",X"04", + X"50",X"21",X"D0",X"4C",X"77",X"23",X"77",X"23",X"77",X"21",X"D0",X"4C",X"7E",X"2F",X"32",X"07", + X"50",X"32",X"C0",X"50",X"2F",X"34",X"FE",X"78",X"20",X"08",X"36",X"00",X"23",X"34",X"7E",X"FE", + X"1E",X"C8",X"06",X"00",X"10",X"FE",X"3A",X"D0",X"4C",X"FE",X"10",X"38",X"DC",X"FE",X"6E",X"30", + X"D8",X"CD",X"D0",X"3A",X"28",X"D3",X"CD",X"80",X"28",X"05",X"85",X"40",X"52",X"52",X"4F",X"52", + X"45",X"32",X"C0",X"50",X"18",X"FB",X"CD",X"80",X"28",X"05",X"85",X"40",X"4B",X"4F",X"40",X"40", + X"40",X"18",X"EE",X"00",X"2B",X"C9",X"79",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"FE",X"0A",X"38", + X"02",X"C6",X"37",X"77",X"79",X"2B",X"E6",X"0F",X"FE",X"0A",X"38",X"02",X"C6",X"37",X"77",X"2B", + X"C9",X"3C",X"8A",X"20",X"B6",X"3F",X"11",X"00",X"CD",X"80",X"3F",X"F5",X"F3",X"3A",X"00",X"50", + X"CB",X"67",X"32",X"C0",X"50",X"28",X"F6",X"3A",X"00",X"50",X"CB",X"67",X"32",X"C0",X"50",X"20", + X"F6",X"E5",X"21",X"00",X"50",X"36",X"00",X"36",X"01",X"E1",X"F1",X"FB",X"C9",X"3F",X"11",X"00", + X"D2",X"1A",X"F9",X"DA",X"00",X"00",X"11",X"00",X"DC",X"1A",X"B8",X"29",X"BF",X"03",X"DE",X"A4"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_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/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/build_id.v new file mode 100644 index 00000000..2f3e03f0 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171116" +`define BUILD_TIME "062742" diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_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/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_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/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/osd.v b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_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/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..70300d20 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pacman.vhd @@ -0,0 +1,629 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN is +generic ( + MRTNT : std_logic := '0' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0_reg : in std_logic_vector(7 downto 0); + in1_reg : in std_logic_vector(7 downto 0); + dipsw_reg : in std_logic_vector(7 downto 0); + + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of PACMAN is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_ena : std_logic; + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal rom_data_out : std_logic_vector(7 downto 0); + signal rom_data : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal vram_addr_ab : std_logic_vector(11 downto 0); + signal ab : std_logic_vector(11 downto 0); + + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal vram_l : std_logic; + signal rams_data_out : std_logic_vector(7 downto 0); + -- more decode + signal wr0_l : std_logic; + signal wr1_l : std_logic; + signal wr2_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + +begin + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + p_sync_comb : process(hcnt, vcnt) + begin + vsync <= not vcnt(8); + do_hsync <= (hcnt = "010101111"); -- 0AF + end process; + + p_sync : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + + if (hcnt = "010010111") then -- 097 + O_HBLANK <= '1'; + elsif (hcnt = "010001111") then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") then + hblank <= '0'; -- 0EF + O_HBLANK <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + -- + -- cpu + -- + p_cpu_wait_comb : process(sync_bus_wreq_l) + begin + cpu_wait_l <= '1'; + if (sync_bus_wreq_l = '0') then + cpu_wait_l <= '0'; + end if; + end process; + + p_irq_req_watchdog : process + variable rising_vblank : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + --rising_vblank := do_hsync; -- debug + -- interrupt 8c + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + + -- simulation + -- pragma translate_off + -- synopsys translate_off + watchdog_reset_l <= not reset; -- watchdog disable + -- synopsys translate_on + -- pragma translate_on + end if; + end process; + + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + + p_cpu_ena : process(hcnt, ena_6) + begin + cpu_ena <= '0'; + if (ena_6 = '1') then + cpu_ena <= hcnt(0); + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + -- + -- primary addr decode + -- + p_mem_decode_comb : process(cpu_rfsh_l, cpu_rd_l, cpu_mreq_l, cpu_addr) + begin + -- rom 0x0000 - 0x3FFF + -- syncbus 0x4000 - 0x7FFF + + -- 7M + -- 7N + sync_bus_cs_l <= '1'; +-- program_rom_cs_l <= '1'; + + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + +-- if (cpu_addr(14) = '0') and (cpu_rd_l = '0') then +-- program_rom_cs_l <= '0'; +-- end if; + + if (cpu_addr(14) = '1') then + sync_bus_cs_l <= '0'; + end if; + + end if; + end process; + -- + -- sync bus custom ic + -- + p_sync_bus_reg : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; + end process; + + p_sync_bus_comb : process(cpu_rd_l, sync_bus_cs_l, hcnt) + begin + -- sync_bus_stb is now an active low clock enable signal + sync_bus_stb <= '1'; + sync_bus_r_w_l <= '1'; + + if (sync_bus_cs_l = '0') and (hcnt(1) = '0') then + if (cpu_rd_l = '1') then + sync_bus_r_w_l <= '0'; + end if; + sync_bus_stb <= '0'; + end if; + + sync_bus_wreq_l <= '1'; + if (sync_bus_cs_l = '0') and (hcnt(1) = '1') and (cpu_rd_l = '0') then + sync_bus_wreq_l <= '0'; + end if; + end process; + -- + -- vram addr custom ic + -- + u_vram_addr : entity work.PACMAN_VRAM_ADDR + port map ( + AB => vram_addr_ab, + H256_L => hcnt(8), + H128 => hcnt(7), + H64 => hcnt(6), + H32 => hcnt(5), + H16 => hcnt(4), + H8 => hcnt(3), + H4 => hcnt(2), + H2 => hcnt(1), + H1 => hcnt(0), + V128 => vcnt(7), + V64 => vcnt(6), + V32 => vcnt(5), + V16 => vcnt(4), + V8 => vcnt(3), + V4 => vcnt(2), + V2 => vcnt(1), + V1 => vcnt(0), + FLIP => control_reg(3) + ); + + p_ab_mux_comb : process(hcnt, cpu_addr, vram_addr_ab) + begin + --When 2H is low, the CPU controls the bus. + if (hcnt(1) = '0') then + ab <= cpu_addr(11 downto 0); + else + ab <= vram_addr_ab; + end if; + end process; + + p_vram_comb : process(hcnt, cpu_addr, sync_bus_stb) + variable a,b : std_logic; + begin + + a := not (cpu_addr(12) or sync_bus_stb); + b := hcnt(1) and hcnt(0); + vram_l <= not (a or b); + end process; + + p_io_decode_comb : process(sync_bus_r_w_l, sync_bus_stb, ab, cpu_addr) + variable sel : std_logic_vector(2 downto 0); + variable dec : std_logic_vector(7 downto 0); + variable selb : std_logic_vector(1 downto 0); + variable decb : std_logic_vector(3 downto 0); + begin + -- WRITE + + -- out_l 0x5000 - 0x503F control space + + -- wr0_l 0x5040 - 0x504F sound + -- wr1_l 0x5050 - 0x505F sound + -- wr2_l 0x5060 - 0x506F sprite + + -- 0x5080 - 0x50BF unused + + -- wdr_l 0x50C0 - 0x50FF watchdog reset + + -- READ + + -- in0_l 0x5000 - 0x503F in port 0 + -- in1_l 0x5040 - 0x507F in port 1 + -- dipsw_l 0x5080 - 0x50BF dip switches + + -- 7J + dec := "11111111"; + sel := sync_bus_r_w_l & ab(7) & ab(6); + if (cpu_addr(12) = '1') and ( sync_bus_stb = '0') then + case sel is + when "000" => dec := "11111110"; + when "001" => dec := "11111101"; + when "010" => dec := "11111011"; + when "011" => dec := "11110111"; + when "100" => dec := "11101111"; + when "101" => dec := "11011111"; + when "110" => dec := "10111111"; + when "111" => dec := "01111111"; + when others => null; + end case; + end if; + iodec_out_l <= dec(0); + iodec_wdr_l <= dec(3); + + iodec_in0_l <= dec(4); + iodec_in1_l <= dec(5); + iodec_dipsw_l <= dec(6); + + -- 7M + decb := "1111"; + selb := ab(5) & ab(4); + if (dec(1) = '0') then + case selb is + when "00" => decb := "1110"; + when "01" => decb := "1101"; + when "10" => decb := "1011"; + when "11" => decb := "0111"; + when others => null; + end case; + end if; + wr0_l <= decb(0); + wr1_l <= decb(1); + wr2_l <= decb(2); + end process; + + p_control_reg : process + variable ena : std_logic_vector(7 downto 0); + begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + ena := "00000000"; + if (iodec_out_l = '0') then + case ab(2 downto 0) is + when "000" => ena := "00000001"; + when "001" => ena := "00000010"; + when "010" => ena := "00000100"; + when "011" => ena := "00001000"; + when "100" => ena := "00010000"; + when "101" => ena := "00100000"; + when "110" => ena := "01000000"; + when "111" => ena := "10000000"; + when others => null; + end case; + end if; + + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (ena(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + p_db_mux_comb : process(hcnt, cpu_data_out, rams_data_out) + begin + -- simplified data source for video subsystem + -- only cpu or ram are sources of interest + if (hcnt(1) = '0') then + sync_bus_db <= cpu_data_out; + else + sync_bus_db <= rams_data_out; + end if; + end process; + + rom_data <= program_rom_dinl when cpu_addr(15) = '0' else program_rom_dinh; + rom_data_out <= rom_data(7 downto 6) & rom_data(3) & rom_data(4) & rom_data(5) & rom_data(2 downto 0) when MRTNT = '1' else rom_data; + + p_cpu_data_in_mux_comb : process(cpu_addr, cpu_iorq_l, cpu_m1_l, sync_bus_wreq_l, + iodec_in0_l, iodec_in1_l, iodec_dipsw_l, cpu_vec_reg, sync_bus_reg, rom_data_out, + rams_data_out, in0_reg, in1_reg, dipsw_reg) + begin + -- simplifed again + if (cpu_iorq_l = '0') and (cpu_m1_l = '0') then + cpu_data_in <= cpu_vec_reg; + elsif (sync_bus_wreq_l = '0') then + cpu_data_in <= sync_bus_reg; + else + if (cpu_addr(15 downto 14) = "00") then -- ROM at 0000 - 3fff + cpu_data_in <= rom_data_out; + elsif (cpu_addr(15 downto 13) = "100") then -- ROM at 8000 - 9fff + cpu_data_in <= rom_data_out; + else + cpu_data_in <= rams_data_out; + if (iodec_in0_l = '0') then cpu_data_in <= in0_reg; end if; + if (iodec_in1_l = '0') then cpu_data_in <= in1_reg; end if; + if (iodec_dipsw_l = '0') then cpu_data_in <= dipsw_reg; end if; + end if; + end if; + end process; + + u_rams : work.dpram generic map (12,8) + port map + ( + clk_a_i => clk, + en_a_i => ena_6, + we_i => not sync_bus_r_w_l and not vram_l, + addr_a_i => ab(11 downto 0), + data_a_i => cpu_data_out, -- cpu only source of ram data + + clk_b_i => clk, + addr_b_i => ab(11 downto 0), + data_b_o => rams_data_out + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom : entity work.ROM_PGM_0 + port map ( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom1 : entity work.ROM_PGM_1 + port map ( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinh + ); + + -- + -- video subsystem + -- + u_video : entity work.PACMAN_VIDEO + generic map ( + MRTNT => MRTNT + ) + port map ( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + I_WR2_L => wr2_l, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk + ); + + O_HSYNC <= hSync; + O_VSYNC <= vSync; + + --O_HBLANK <= hblank; + O_VBLANK <= vblank; + + -- + -- + -- audio subsystem + -- + u_audio : entity work.PACMAN_AUDIO + port map ( + I_HCNT => hcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_WR1_L => wr1_l, + I_WR0_L => wr0_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..39619ea0 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR1_L, + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => rom3m(1), + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..895304e9 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pacman_video.vhd @@ -0,0 +1,366 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_VIDEO is +generic ( + MRTNT : std_logic := '0' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); +port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + I_WR2_L : in std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic +); +end; + +architecture RTL of PACMAN_VIDEO is + + signal sprite_xy_ram_temp : std_logic_vector(7 downto 0); + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal db_reg : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_dout : std_logic_vector(7 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal cntr_ld : std_logic; + signal sprite_ram_ip : std_logic_vector(3 downto 0); + signal sprite_ram_op : std_logic_vector(3 downto 0); + signal ra : std_logic_vector(7 downto 0); + signal ra_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(3 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + + -- ram enable is low when HBLANK_L is 0 (for sprite access) or + -- 2H is low (for cpu writes) + -- we can simplify this + dr <= not sprite_xy_ram_temp when I_HBLANK = '1' else "11111111"; -- pull ups on board + + sprite_xy_ram : work.dpram generic map (4,8) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR2_L, + addr_a_i => I_AB(3 downto 0), + data_a_i => I_DB, + + clk_b_i => CLK, + addr_b_i => I_AB(3 downto 0), + data_b_o => sprite_xy_ram_temp + ); + + p_char_regs : process + variable inc : std_logic; + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; + begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + inc := (not I_HBLANK); + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & inc); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + db_reg <= I_DB; -- character reg + end if; + end process; + + p_flip_comb : process(char_hblank_reg, I_FLIP, db_reg) + begin + if (char_hblank_reg = '0') then + xflip <= I_FLIP; + yflip <= I_FLIP; + else + xflip <= db_reg(1); + yflip <= db_reg(0); + end if; + end process; + + p_char_addr_comb : process(db_reg, I_HCNT, + char_match_reg, char_sum_reg, char_hblank_reg, + xflip, yflip) + begin + obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + + ca(12) <= char_hblank_reg; + ca(11 downto 6) <= db_reg(7 downto 2); + + -- 2h, 4e + if (char_hblank_reg = '0') then + ca(5) <= db_reg(1); + ca(4) <= db_reg(0); + else + ca(5) <= char_sum_reg(3) xor xflip; + ca(4) <= I_HCNT(3); + end if; + + ca(3) <= I_HCNT(2) xor yflip; + ca(1) <= char_sum_reg(1) xor xflip; + + -- descramble ROMs for Mr TNT (swap address lines A0 and A2) + if MRTNT = '1' then + ca(2) <= char_sum_reg(0) xor xflip; + ca(0) <= char_sum_reg(2) xor xflip; + else + ca(2) <= char_sum_reg(2) xor xflip; + ca(0) <= char_sum_reg(0) xor xflip; + end if; + end process; + + + -- descramble ROMs for Mr TNT (swap data lines D4 and D6) + char_rom_5ef_dout <= char_rom_5ef_buf(7) & char_rom_5ef_buf(4) & char_rom_5ef_buf(5) & char_rom_5ef_buf(6) & char_rom_5ef_buf(3 downto 0) when MRTNT = '1' else char_rom_5ef_buf; + + -- char roms + char_rom_5ef : entity work.GFX1 + port map ( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf + ); + + p_char_shift : process + begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_dout(7 downto 4); -- load + shift_regl <= char_rom_5ef_dout(3 downto 0); + when others => null; + end case; + end if; + end process; + + p_char_shift_comb : process(I_HCNT, vout_yflip, shift_regu, shift_regl) + variable ip : std_logic; + begin + ip := I_HCNT(0) and I_HCNT(1); + if (vout_yflip = '0') then + + shift_sel(0) <= ip; + shift_sel(1) <= '1'; + shift_op(0) <= shift_regl(3); + shift_op(1) <= shift_regu(3); + else + + shift_sel(0) <= '1'; + shift_sel(1) <= ip; + shift_op(0) <= shift_regl(0); + shift_op(1) <= shift_regu(0); + end if; + end process; + + p_video_out_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= I_DB(4 downto 0); -- colour reg + end if; + end if; + end process; + + col_rom_4a : entity work.PROM4_DST + port map ( + CLK => CLK, + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a + ); + + cntr_ld <= '1' when (I_HCNT(3 downto 0) = "0111") and (vout_hblank='1' or vout_obj_on='0') else '0'; + + p_ra_cnt : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (cntr_ld = '1') then + ra <= dr; + else + ra <= ra + "1"; + end if; + end if; + end process; + + u_sprite_ram : work.dpram generic map (8,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => vout_obj_on_t1, + addr_a_i => ra_t1, + data_a_i => sprite_ram_ip, + + clk_b_i => CLK, + addr_b_i => ra, + data_b_o => sprite_ram_op + ); + + sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "0000"; + video_op_sel <= '1' when not (sprite_ram_reg = "0000") else '0'; + + p_sprite_ram_ip_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + ra_t1 <= ra; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + end if; + end process; + + p_sprite_ram_ip_comb : process(vout_hblank_t1, video_op_sel, sprite_ram_reg, lut_4a_t1) + begin + -- 3a + if (vout_hblank_t1 = '0') then + sprite_ram_ip <= (others => '0'); + else + if (video_op_sel = '1') then + sprite_ram_ip <= sprite_ram_reg; + else + sprite_ram_ip <= lut_4a_t1(3 downto 0); + end if; + end if; + end process; + + p_video_op_comb : process(vout_hblank, I_VBLANK, video_op_sel, sprite_ram_reg, lut_4a) + begin + -- 3b + if (vout_hblank = '1') or (I_VBLANK = '1') then + final_col <= (others => '0'); + else + if (video_op_sel = '1') then + final_col <= sprite_ram_reg; -- sprite + else + final_col <= lut_4a(3 downto 0); + end if; + end if; + end process; + + -- assign video outputs from color LUT PROM + col_rom_7f : entity work.PROM7_DST + port map ( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE + ); + +end architecture; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pacman_vram_addr.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pacman_vram_addr.vhd new file mode 100644 index 00000000..b26824c4 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pacman_vram_addr.vhd @@ -0,0 +1,273 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ & CarlW - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity X74_157 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end; + +architecture RTL of X74_157 is +begin + p_y_comb : process(S,G,A,B) + begin + for i in 0 to 3 loop + -- quad 2 line to 1 line mux (true logic) + if (G = '1') then + Y(i) <= '0'; + else + if (S = '0') then + Y(i) <= A(i); + else + Y(i) <= B(i); + end if; + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity X74_257 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end; + +architecture RTL of X74_257 is +signal ab : std_logic_vector (3 downto 0); +begin + + Y <= ab; -- no tristate + p_ab : process(S,A,B) + begin + for i in 0 to 3 loop + if (S = '0') then + AB(i) <= A(i); + else + AB(i) <= B(i); + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VRAM_ADDR is + port ( + AB : out std_logic_vector (11 downto 0); + H256_L : in std_logic; + H128 : in std_logic; + H64 : in std_logic; + H32 : in std_logic; + H16 : in std_logic; + H8 : in std_logic; + H4 : in std_logic; + H2 : in std_logic; + H1 : in std_logic; + V128 : in std_logic; + V64 : in std_logic; + V32 : in std_logic; + V16 : in std_logic; + V8 : in std_logic; + V4 : in std_logic; + V2 : in std_logic; + V1 : in std_logic; + FLIP : in std_logic + ); +end; + +architecture RTL of PACMAN_VRAM_ADDR is + +signal v128p : std_logic; +signal v64p : std_logic; +signal v32p : std_logic; +signal v16p : std_logic; +signal v8p : std_logic; +signal h128p : std_logic; +signal h64p : std_logic; +signal h32p : std_logic; +signal h16p : std_logic; +signal h8p : std_logic; +signal sel : std_logic; +signal y157 : std_logic_vector (11 downto 0); + +component X74_157 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end component; + +component X74_257 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end component; + +begin + p_vp_comb : process(FLIP, V8, V16, V32, V64, V128) + begin + v128p <= FLIP xor V128; + v64p <= FLIP xor V64; + v32p <= FLIP xor V32; + v16p <= FLIP xor V16; + v8p <= FLIP xor V8; + end process; + + p_hp_comb : process(FLIP, H8, H16, H32, H64, H128) + begin + H128P <= FLIP xor H128; + H64P <= FLIP xor H64; + H32P <= FLIP xor H32; + H16P <= FLIP xor H16; + H8P <= FLIP xor H8; + end process; + + p_sel : process(H16, H32, H64) + begin + sel <= not((H32 xor H16) or (H32 xor H64)); + end process; + + --p_oe257 : process(H2) + --begin + -- oe <= not(H2); + --end process; + + U6 : X74_157 + port map( + Y => y157(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => h64p, + B(0) => h64p, + A => "1111", + G => '0', + S => sel + ); + + U5 : X74_157 + port map( + Y => y157(7 downto 4), + B(3) => h64p, + B(2) => h64p, + B(1) => h8p, + B(0) => v128p, + A => "1111", + G => '0', + S => sel + ); + + U4 : X74_157 + port map( + Y => y157(3 downto 0), + B(3) => v64p, + B(2) => v32p, + B(1) => v16p, + B(0) => v8p, + A(3) => H64, + A(2) => H32, + A(1) => H16, + A(0) => H4, + G => '0', + S => sel + ); + + U3 : X74_257 + port map( + Y => AB(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => v128p, + B(0) => v64p, + A => y157(11 downto 8), + S => H256_L + ); + + U2 : X74_257 + port map( + Y => AB(7 downto 4), + B(3) => v32p, + B(2) => v16p, + B(1) => v8p, + B(0) => h128p, + A => y157(7 downto 4), + S => H256_L + ); + + U1 : X74_257 + port map( + Y => AB(3 downto 0), + B(3) => h64p, + B(2) => h32p, + B(1) => h16p, + B(0) => h8p, + A => y157(3 downto 0), + S => H256_L + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_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 VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pll.vhd b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pll.vhd new file mode 100644 index 00000000..3c952a1a --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/pll.vhd @@ -0,0 +1,365 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC ; + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + locked <= sub_wire0; + sub_wire2 <= sub_wire1(0); + c0 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 9, + clk0_duty_cycle => 50, + clk0_multiply_by => 8, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire4, + locked => sub_wire0, + clk => sub_wire1 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "9" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +-- 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 "1" +-- 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: 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_CLKENA0 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 "9" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +-- Retrieval info: CONSTANT: CLK0_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_USED" +-- 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_USED" +-- 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_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/Crush_Roller_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/Crush_Roller_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/Arcade/Pacman Hardware/DreamShopper_MiST/DreamShopper.qpf b/Arcade/Pacman Hardware/DreamShopper_MiST/DreamShopper.qpf new file mode 100644 index 00000000..23aa7cc2 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/DreamShopper.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "DreamShopper" diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/DreamShopper.qsf b/Arcade/Pacman Hardware/DreamShopper_MiST/DreamShopper.qsf new file mode 100644 index 00000000..e9246feb --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/DreamShopper.qsf @@ -0,0 +1,128 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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.2 Build 203 01/18/2017 SJ Standard Edition +# Date created = 01:53:32 April 20, 2017 +# +# -------------------------------------------------------------------------- # + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name TOP_LEVEL_ENTITY DreamShopper +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SAVE_DISK_SPACE OFF +set_global_assignment -name SMART_RECOMPILE ON +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 MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +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)" +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" + +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/osd.v +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 QIP_FILE rtl/pll.qip +set_global_assignment -name SYSTEMVERILOG_FILE rtl/ym2149.sv +set_global_assignment -name VHDL_FILE rtl/ROM/GFX1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/dreamshp_video.vhd +set_global_assignment -name VHDL_FILE rtl/dreamshp.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/DreamShopper.sv +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 USE_CONFIGURATION_DEVICE OFF +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 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 +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" +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/DreamShopper.srf b/Arcade/Pacman Hardware/DreamShopper_MiST/DreamShopper.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/DreamShopper.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/README.txt b/Arcade/Pacman Hardware/DreamShopper_MiST/README.txt new file mode 100644 index 00000000..208f5ec6 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/README.txt @@ -0,0 +1,25 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Dream Shopper for MiST by Gehstock +-- 20 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Dream Shopper hardware +-- Copyright (c) Sorgelig +-- Based on Pacman core: Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE,CTRL : Action +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/Release/DreamShopper.rbf b/Arcade/Pacman Hardware/DreamShopper_MiST/Release/DreamShopper.rbf new file mode 100644 index 00000000..da38814d Binary files /dev/null and b/Arcade/Pacman Hardware/DreamShopper_MiST/Release/DreamShopper.rbf differ diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/clean.bat b/Arcade/Pacman Hardware/DreamShopper_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_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/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/DreamShopper.sv b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/DreamShopper.sv new file mode 100644 index 00000000..fc7b983f --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/DreamShopper.sv @@ -0,0 +1,204 @@ +//============================================================================ +// Arcade: Dream Shopper +// +// Version for MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module DreamShopper +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "DreamShopper;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys, clk_snd; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + +reg ce_1m79; +always @(posedge clk_sys) begin + reg [3:0] div; + + div <= div + 1'd1; + if(div == 12) div <= 0; + ce_1m79 <= !div; +end + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [9:0] audio; +assign LED = 1; +wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(340), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +wire m_bomb = kbjoy[8]; +wire m_Serv = kbjoy[9]; + +dreamshp dreamshp +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .in0(~{2'b00, m_coin, m_fire, m_down,m_right,m_left,m_up}), + .in1(~{1'b0, m_start2, m_start1, 5'b00000}), + + .dipsw1(8'b11_00_10_0_1), + .dipsw2(8'b00000000), + + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m), + .ENA_1M79(ce_1m79) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..86fc9730 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"F0",X"F0",X"87",X"3C",X"4B",X"0F",X"0F",X"00",X"70",X"70",X"70",X"70",X"61",X"61",X"61", + X"00",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"00",X"F0",X"F0",X"78",X"3C",X"1E",X"1E",X"1E", + X"0F",X"0F",X"0F",X"0F",X"87",X"F0",X"F0",X"00",X"61",X"61",X"61",X"70",X"70",X"70",X"70",X"00", + X"68",X"2C",X"A4",X"E4",X"E8",X"E0",X"E0",X"00",X"0F",X"1E",X"1E",X"3C",X"78",X"F2",X"F0",X"00", + X"00",X"F0",X"F0",X"87",X"3C",X"4B",X"0F",X"0F",X"00",X"70",X"70",X"70",X"70",X"61",X"61",X"61", + X"00",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"00",X"F0",X"F0",X"78",X"3C",X"1E",X"1E",X"1E", + X"0F",X"0F",X"0F",X"0F",X"87",X"F0",X"F0",X"00",X"61",X"61",X"61",X"70",X"70",X"70",X"70",X"00", + X"68",X"2C",X"A4",X"E4",X"E0",X"E4",X"E0",X"00",X"0F",X"1E",X"1E",X"3C",X"79",X"F0",X"F0",X"00", + X"00",X"20",X"11",X"00",X"99",X"CB",X"BC",X"71",X"00",X"00",X"00",X"11",X"00",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"44",X"88",X"00",X"00",X"00",X"00",X"00",X"88",X"58",X"87",X"79",X"2C", + X"BC",X"0F",X"5B",X"20",X"00",X"00",X"00",X"00",X"00",X"10",X"11",X"22",X"00",X"10",X"00",X"00", + X"00",X"80",X"44",X"00",X"00",X"00",X"00",X"00",X"E9",X"96",X"E2",X"0C",X"80",X"40",X"00",X"00", + X"00",X"01",X"32",X"91",X"4B",X"CC",X"ED",X"4C",X"00",X"00",X"12",X"10",X"33",X"01",X"00",X"01", + X"00",X"00",X"A8",X"4C",X"08",X"00",X"00",X"00",X"00",X"00",X"80",X"0D",X"69",X"F2",X"CF",X"8E", + X"C1",X"DC",X"AD",X"0F",X"B2",X"01",X"00",X"00",X"01",X"12",X"11",X"32",X"01",X"50",X"00",X"00", + X"00",X"08",X"48",X"08",X"88",X"04",X"00",X"00",X"52",X"FC",X"67",X"96",X"3A",X"11",X"00",X"00", + X"11",X"20",X"C0",X"A6",X"6E",X"7B",X"2C",X"9C",X"80",X"40",X"02",X"21",X"10",X"25",X"21",X"30", + X"20",X"60",X"0E",X"C0",X"40",X"00",X"00",X"10",X"00",X"00",X"14",X"C3",X"A1",X"67",X"62",X"21", + X"0F",X"85",X"5E",X"9D",X"0E",X"C0",X"00",X"80",X"10",X"21",X"71",X"53",X"30",X"81",X"32",X"00", + X"28",X"48",X"C0",X"08",X"40",X"80",X"20",X"10",X"D2",X"07",X"E7",X"ED",X"43",X"C2",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"FF", + X"00",X"00",X"44",X"CC",X"CC",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"FF", + X"11",X"33",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"FF", + X"00",X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"48",X"00",X"00",X"00",X"08",X"0E",X"0F",X"6F",X"8F", + X"0F",X"0F",X"0F",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"60",X"60",X"00",X"00",X"00", + X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"CC",X"EE",X"FF",X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"CC",X"88", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"0C",X"0F",X"8F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"00",X"00",X"60",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"68",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"6F",X"0F",X"0F",X"0C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0C",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"60",X"60",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"48",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"8F",X"6F",X"0F",X"0E",X"08",X"00",X"00",X"00", + X"00",X"C3",X"C3",X"F0",X"F0",X"F2",X"F6",X"FE",X"00",X"04",X"12",X"16",X"16",X"34",X"70",X"30", + X"00",X"80",X"C0",X"C0",X"C0",X"0E",X"48",X"E0",X"00",X"78",X"F0",X"F0",X"F6",X"F7",X"2F",X"BD", + X"FE",X"F6",X"F2",X"F0",X"F0",X"C3",X"C3",X"00",X"30",X"70",X"34",X"16",X"16",X"12",X"04",X"00", + X"E0",X"48",X"0E",X"C0",X"C0",X"C0",X"80",X"00",X"BD",X"2F",X"F7",X"F6",X"F0",X"F0",X"78",X"00", + X"44",X"5F",X"5F",X"D7",X"5F",X"D7",X"44",X"00",X"0C",X"2D",X"3C",X"78",X"3C",X"38",X"10",X"00", + X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"C3",X"CB",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"3C",X"3D", + X"CB",X"C3",X"0F",X"0F",X"0F",X"0F",X"C3",X"CB",X"3D",X"3C",X"0F",X"0F",X"0F",X"0F",X"3C",X"3D", + X"00",X"CC",X"EE",X"11",X"11",X"33",X"EE",X"CC",X"00",X"11",X"33",X"66",X"44",X"44",X"33",X"11", + X"00",X"00",X"00",X"22",X"FF",X"FF",X"00",X"00",X"00",X"00",X"44",X"44",X"77",X"77",X"44",X"44", + X"00",X"22",X"33",X"99",X"99",X"DD",X"FF",X"66",X"00",X"66",X"77",X"77",X"55",X"55",X"44",X"44", + X"00",X"00",X"11",X"99",X"DD",X"FF",X"BB",X"11",X"00",X"22",X"66",X"44",X"44",X"44",X"77",X"33", + X"00",X"88",X"CC",X"66",X"33",X"FF",X"FF",X"00",X"00",X"11",X"11",X"11",X"11",X"77",X"77",X"11", + X"00",X"77",X"77",X"55",X"55",X"55",X"DD",X"88",X"00",X"22",X"66",X"44",X"44",X"44",X"77",X"33", + X"00",X"CC",X"EE",X"BB",X"99",X"99",X"99",X"00",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33", + X"00",X"33",X"33",X"11",X"99",X"DD",X"77",X"33",X"00",X"00",X"00",X"77",X"77",X"00",X"00",X"00", + X"00",X"66",X"FF",X"DD",X"99",X"99",X"66",X"00",X"00",X"33",X"44",X"44",X"55",X"55",X"77",X"33", + X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"EE",X"00",X"00",X"44",X"44",X"44",X"66",X"33",X"11", + X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00", + X"00",X"88",X"88",X"88",X"88",X"88",X"88",X"00",X"00",X"11",X"11",X"11",X"11",X"11",X"11",X"00", + X"00",X"00",X"88",X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CB",X"C3",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"3D",X"3C",X"0F",X"0F",X"0F",X"0F",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EE",X"33",X"11",X"99",X"DD",X"99",X"BB",X"EE",X"77",X"CC",X"88",X"99",X"BB",X"99",X"DD",X"77", + X"00",X"CC",X"EE",X"33",X"11",X"33",X"EE",X"CC",X"00",X"77",X"77",X"11",X"11",X"11",X"77",X"77", + X"00",X"FF",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00",X"77",X"77",X"44",X"44",X"44",X"77",X"33", + X"00",X"CC",X"EE",X"33",X"11",X"11",X"33",X"22",X"00",X"11",X"33",X"66",X"44",X"44",X"66",X"22", + X"00",X"FF",X"FF",X"11",X"11",X"33",X"EE",X"CC",X"00",X"77",X"77",X"44",X"44",X"66",X"33",X"11", + X"00",X"00",X"FF",X"FF",X"99",X"99",X"99",X"11",X"00",X"00",X"77",X"77",X"44",X"44",X"44",X"44", + X"00",X"FF",X"FF",X"99",X"99",X"99",X"99",X"11",X"00",X"77",X"77",X"00",X"00",X"00",X"00",X"00", + X"00",X"CC",X"EE",X"33",X"11",X"99",X"99",X"99",X"00",X"11",X"33",X"66",X"44",X"44",X"77",X"77", + X"00",X"FF",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00",X"77",X"77",X"00",X"00",X"00",X"77",X"77", + X"00",X"00",X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00",X"44",X"44",X"77",X"77",X"44",X"44", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"22",X"66",X"44",X"44",X"66",X"77",X"33", + X"00",X"FF",X"FF",X"88",X"CC",X"66",X"33",X"11",X"00",X"77",X"77",X"11",X"33",X"77",X"66",X"44", + X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"44",X"44",X"44",X"44", + X"00",X"FF",X"FF",X"EE",X"CC",X"EE",X"FF",X"FF",X"00",X"77",X"77",X"00",X"11",X"00",X"77",X"77", + X"00",X"FF",X"FF",X"EE",X"CC",X"88",X"FF",X"FF",X"00",X"77",X"77",X"00",X"11",X"33",X"77",X"77", + X"00",X"EE",X"FF",X"11",X"11",X"11",X"FF",X"EE",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33", + X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"EE",X"00",X"77",X"77",X"11",X"11",X"11",X"11",X"00", + X"F0",X"F0",X"78",X"3C",X"3C",X"78",X"F0",X"F0",X"F0",X"F0",X"E1",X"C3",X"C3",X"E1",X"F0",X"F0", + X"00",X"FF",X"FF",X"11",X"11",X"99",X"FF",X"EE",X"00",X"77",X"77",X"11",X"33",X"77",X"66",X"44", + X"00",X"66",X"FF",X"99",X"99",X"BB",X"AA",X"00",X"00",X"22",X"66",X"44",X"44",X"44",X"77",X"33", + X"00",X"00",X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00",X"00",X"00",X"77",X"77",X"00",X"00", + X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33", + X"00",X"FF",X"FF",X"88",X"00",X"88",X"FF",X"FF",X"00",X"00",X"11",X"33",X"77",X"33",X"11",X"00", + X"00",X"FF",X"FF",X"88",X"CC",X"88",X"FF",X"FF",X"00",X"11",X"77",X"33",X"11",X"33",X"77",X"11", + X"00",X"33",X"77",X"EE",X"CC",X"EE",X"77",X"33",X"00",X"66",X"77",X"33",X"11",X"33",X"77",X"66", + X"00",X"00",X"33",X"FF",X"88",X"88",X"FF",X"33",X"00",X"00",X"00",X"00",X"77",X"77",X"00",X"00", + X"00",X"11",X"11",X"99",X"DD",X"FF",X"77",X"33",X"00",X"66",X"77",X"77",X"55",X"44",X"44",X"44", + X"00",X"00",X"88",X"CC",X"66",X"33",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"66",X"00",X"00", + X"FA",X"FF",X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"33",X"66",X"CC",X"88",X"00",X"00",X"00",X"00",X"66",X"33",X"11",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00", + X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"CF",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"EF",X"EF",X"CF",X"CF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"1F",X"0F",X"2F",X"4F",X"5F", + X"0F",X"0F",X"4F",X"3F",X"0F",X"CF",X"FF",X"FF",X"CF",X"CF",X"EF",X"EF",X"FF",X"FF",X"FF",X"FF", + X"F7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"5E",X"1F",X"0F",X"0F",X"1F",X"3F",X"FF",X"FF", + X"00",X"00",X"11",X"11",X"75",X"FF",X"F7",X"FE",X"00",X"00",X"00",X"32",X"33",X"11",X"11",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"00",X"00",X"80",X"88",X"EC",X"E6",X"FA",X"FF", + X"FF",X"FD",X"77",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"EF",X"F7",X"EE",X"FB",X"CC",X"00",X"00",X"00", + X"00",X"00",X"00",X"78",X"A5",X"4B",X"B4",X"96",X"00",X"00",X"00",X"00",X"10",X"12",X"21",X"03", + X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"80",X"C0",X"84",X"48", + X"5A",X"96",X"4B",X"A5",X"96",X"0F",X"00",X"00",X"12",X"12",X"03",X"12",X"01",X"00",X"00",X"00", + X"08",X"08",X"0C",X"04",X"04",X"00",X"00",X"00",X"85",X"0E",X"84",X"0C",X"08",X"00",X"00",X"00", + X"00",X"00",X"02",X"74",X"74",X"74",X"F4",X"F4",X"00",X"00",X"00",X"02",X"32",X"32",X"32",X"32", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"F2",X"F1",X"F8",X"FC",X"77",X"00",X"00",X"00",X"32",X"33",X"11",X"00",X"00",X"00",X"00",X"00", + X"00",X"08",X"08",X"08",X"08",X"00",X"00",X"00",X"C0",X"E0",X"F8",X"E1",X"CA",X"00",X"00",X"00", + X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FF",X"F7",X"FF",X"F7",X"FF",X"F7",X"FF",X"F7", + X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"10",X"31",X"73",X"F7",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"10",X"31",X"73",X"F7", + X"00",X"00",X"00",X"00",X"80",X"C8",X"EC",X"FE",X"80",X"C8",X"EC",X"FE",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"FF",X"F7",X"FF",X"F7",X"FF",X"F7", + X"FE",X"EC",X"C8",X"80",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FE",X"EC",X"C8",X"80", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F5",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F5", + X"FF",X"FF",X"FF",X"FF",X"F7",X"73",X"31",X"10",X"F7",X"73",X"31",X"10",X"00",X"00",X"00",X"00", + X"FA",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"FA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F5",X"FA",X"F7",X"FF",X"F7",X"FF",X"F7",X"FF",X"F5", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F5",X"FF",X"F7",X"FF",X"F7",X"FF",X"F7",X"FF",X"F5", + X"F5",X"FE",X"EC",X"C8",X"80",X"00",X"00",X"00",X"F5",X"FF",X"FF",X"FF",X"FF",X"FE",X"EC",X"C8", + X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FE",X"F5",X"FF",X"F7",X"FF",X"F7",X"FF",X"F7",X"FF",X"F5", + X"FA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FA",X"FA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FA", + X"FA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FA",X"F7",X"FF",X"F7",X"FF",X"F7",X"FF",X"F7", + X"00",X"00",X"00",X"00",X"80",X"E6",X"E6",X"E6",X"C0",X"C0",X"E0",X"70",X"30",X"10",X"F0",X"30", + X"EE",X"11",X"11",X"22",X"22",X"11",X"11",X"EE",X"11",X"C3",X"C3",X"E7",X"E7",X"C3",X"C3",X"11", + X"CC",X"22",X"11",X"11",X"11",X"11",X"66",X"88",X"E0",X"B4",X"E0",X"40",X"88",X"44",X"44",X"33", + X"08",X"4C",X"E8",X"F8",X"F8",X"E8",X"4C",X"08",X"03",X"04",X"04",X"04",X"04",X"04",X"04",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC", + 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"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"00",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"00", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"44",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"33",X"11",X"00",X"00",X"00",X"00", + X"CC",X"CC",X"CC",X"CC",X"CC",X"44",X"00",X"00",X"FF",X"77",X"33",X"11",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"33",X"11",X"FF",X"77",X"33",X"11",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"3C",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"87",X"87",X"C3",X"C3", + X"0F",X"0F",X"0F",X"0F",X"1E",X"1E",X"3C",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"C3",X"C3",X"87",X"87",X"0F",X"0F",X"0F",X"0F", + X"3C",X"3C",X"1E",X"1E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"F0",X"C3",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"C3",X"F0", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07", + X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"00", + X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07", + X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"0E",X"0E",X"0D",X"0F",X"0F",X"0F",X"00",X"40",X"80",X"83",X"87",X"87",X"43",X"0F", + X"00",X"00",X"00",X"00",X"00",X"C0",X"4A",X"0F",X"00",X"00",X"00",X"00",X"0C",X"0F",X"0F",X"0F", + X"0F",X"FF",X"0F",X"0D",X"0E",X"0E",X"00",X"00",X"2F",X"53",X"87",X"87",X"83",X"80",X"40",X"00", + X"0F",X"4A",X"C0",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"30",X"25",X"0F", + X"00",X"20",X"10",X"1C",X"1E",X"1E",X"AC",X"4F",X"00",X"00",X"07",X"07",X"0B",X"0F",X"FF",X"0F", + X"0F",X"0F",X"0F",X"03",X"00",X"00",X"00",X"00",X"0F",X"25",X"30",X"00",X"00",X"00",X"00",X"00", + X"4F",X"2C",X"1E",X"1E",X"1C",X"10",X"20",X"00",X"0F",X"0F",X"0F",X"0B",X"07",X"07",X"00",X"00", + X"C1",X"2D",X"1F",X"2F",X"2F",X"2F",X"27",X"2F",X"30",X"40",X"01",X"01",X"03",X"03",X"03",X"00", + X"C0",X"20",X"08",X"08",X"0C",X"0C",X"0C",X"00",X"38",X"4B",X"8F",X"0F",X"0F",X"0F",X"0E",X"0F", + X"0F",X"0F",X"07",X"07",X"43",X"61",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0E",X"0E",X"2C",X"68",X"0C",X"08", + X"01",X"03",X"61",X"43",X"07",X"07",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"68",X"2C",X"0E",X"0E",X"0F",X"0F", + X"0F",X"07",X"0F",X"0F",X"0F",X"0F",X"2D",X"C1",X"00",X"03",X"03",X"03",X"01",X"81",X"40",X"30", + X"00",X"0C",X"0C",X"0C",X"08",X"18",X"20",X"C0",X"4F",X"4E",X"4F",X"4F",X"4F",X"8F",X"4B",X"38", + X"00",X"0F",X"6F",X"4F",X"7F",X"0F",X"7F",X"4F",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"00",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"0F",X"EF",X"AF",X"AF",X"0F",X"EF",X"2F", + X"7F",X"0F",X"7F",X"4F",X"7F",X"0F",X"0F",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"00", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"EF",X"0F",X"EF",X"2F",X"EF",X"0F",X"0F",X"00", + X"00",X"0F",X"6F",X"5F",X"4F",X"0F",X"6F",X"4F",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"00",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"0F",X"6F",X"2F",X"EF",X"0F",X"EF",X"AF", + X"7F",X"0F",X"7F",X"4F",X"7F",X"0F",X"0F",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"00", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"AF",X"0F",X"EF",X"2F",X"EF",X"0F",X"0F",X"00", + X"00",X"0F",X"0F",X"0F",X"7F",X"0F",X"7F",X"4F",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"00",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"0F",X"0F",X"4F",X"EF",X"0F",X"EF",X"2F", + X"7F",X"0F",X"7F",X"4F",X"7F",X"0F",X"0F",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"00", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"EF",X"0F",X"EF",X"2F",X"EF",X"0F",X"0F",X"00", + X"00",X"0F",X"0F",X"0F",X"69",X"4B",X"78",X"0F",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"00",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"0F",X"0F",X"0F",X"E1",X"A5",X"A5",X"0F", + X"78",X"4B",X"78",X"0F",X"0F",X"0F",X"0F",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"00", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"E1",X"2D",X"E1",X"0F",X"0F",X"0F",X"0F",X"00", + X"0F",X"0F",X"87",X"C3",X"CB",X"E9",X"ED",X"ED",X"0F",X"0F",X"F0",X"FF",X"FF",X"FF",X"F3",X"FF", + X"ED",X"ED",X"E9",X"CB",X"C3",X"87",X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"0F",X"0F", + X"FF",X"FF",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"CF",X"9E",X"3C",X"78",X"78",X"78", + X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"FF",X"FF",X"78",X"78",X"78",X"3C",X"9E",X"CF",X"FF",X"FF", + X"0F",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"0F",X"08",X"08",X"08",X"1B",X"1B",X"1B",X"1B", + X"0F",X"01",X"89",X"CD",X"CD",X"CD",X"0D",X"09",X"0F",X"00",X"37",X"37",X"FF",X"F9",X"F7",X"F9", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"0F",X"1B",X"1B",X"1B",X"1B",X"08",X"08",X"08",X"0F", + X"09",X"0D",X"CD",X"CD",X"CD",X"89",X"01",X"0F",X"FB",X"F5",X"F5",X"FF",X"37",X"37",X"00",X"0F", + X"0F",X"00",X"EE",X"7F",X"FF",X"EE",X"FF",X"FF",X"0F",X"08",X"3B",X"2A",X"2B",X"3B",X"3B",X"3B", + X"0F",X"01",X"01",X"01",X"01",X"01",X"81",X"41",X"0F",X"00",X"00",X"00",X"88",X"70",X"88",X"88", + X"FF",X"FF",X"EE",X"FF",X"FF",X"EE",X"00",X"0F",X"3B",X"3B",X"3B",X"3B",X"3B",X"3B",X"08",X"0F", + X"41",X"81",X"01",X"01",X"01",X"01",X"01",X"0F",X"88",X"88",X"F0",X"88",X"00",X"00",X"00",X"0F", + X"0F",X"44",X"E7",X"7F",X"F7",X"7F",X"EE",X"CC",X"0F",X"08",X"18",X"29",X"29",X"29",X"18",X"08", + X"0F",X"01",X"01",X"81",X"CD",X"CD",X"89",X"89",X"0F",X"00",X"08",X"98",X"FE",X"FF",X"00",X"00", + X"DD",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"0F",X"08",X"18",X"29",X"29",X"29",X"18",X"08",X"0F", + X"81",X"01",X"01",X"01",X"01",X"01",X"01",X"0F",X"88",X"C8",X"C8",X"C8",X"88",X"00",X"00",X"0F", + X"0F",X"00",X"C0",X"E6",X"EF",X"EF",X"EF",X"EF",X"0F",X"08",X"09",X"09",X"09",X"09",X"09",X"09", + X"0F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"08", + X"FC",X"F9",X"F3",X"FF",X"7F",X"3F",X"00",X"0F",X"09",X"09",X"09",X"09",X"09",X"09",X"08",X"0F", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0F",X"08",X"8C",X"EC",X"EC",X"EC",X"E8",X"00",X"0F", + X"0F",X"00",X"00",X"00",X"99",X"45",X"02",X"8D",X"0F",X"6E",X"7F",X"3B",X"08",X"08",X"08",X"08", + X"0F",X"01",X"01",X"01",X"01",X"01",X"89",X"89",X"0F",X"00",X"00",X"00",X"CC",X"37",X"0A",X"05", + X"8A",X"8D",X"46",X"45",X"33",X"00",X"00",X"0F",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"0F", + X"4D",X"45",X"4D",X"45",X"89",X"01",X"01",X"0F",X"6E",X"67",X"0A",X"05",X"0A",X"FF",X"00",X"0F", + X"0F",X"00",X"00",X"00",X"BE",X"BE",X"BF",X"C7",X"0F",X"08",X"18",X"18",X"18",X"18",X"18",X"18", + X"0F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0F",X"00",X"00",X"00",X"00",X"08",X"4C",X"EE", + X"F7",X"77",X"ED",X"E9",X"8F",X"FF",X"00",X"0F",X"18",X"18",X"19",X"19",X"19",X"19",X"08",X"0F", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0F",X"EE",X"EE",X"EE",X"EE",X"CC",X"88",X"00",X"0F", + X"0F",X"00",X"00",X"00",X"80",X"41",X"03",X"17",X"0F",X"4C",X"2A",X"19",X"08",X"08",X"08",X"08", + X"0F",X"01",X"89",X"CD",X"CD",X"CD",X"CD",X"CD",X"0F",X"00",X"13",X"17",X"3F",X"7F",X"FF",X"DF", + X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00",X"0F",X"08",X"09",X"0B",X"3B",X"3B",X"19",X"08",X"0F", + X"89",X"89",X"89",X"01",X"81",X"01",X"01",X"0F",X"EF",X"EF",X"FF",X"FF",X"EE",X"00",X"00",X"0F", + X"33",X"F3",X"F3",X"F3",X"F3",X"33",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00", + X"0F",X"1E",X"3C",X"78",X"F0",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"08", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FE",X"FE",X"FE",X"FE",X"0F",X"0F", + X"01",X"01",X"E1",X"EF",X"2F",X"27",X"27",X"27",X"00",X"00",X"F0",X"FF",X"0F",X"08",X"08",X"08", + X"27",X"2F",X"EF",X"EF",X"E3",X"EB",X"EB",X"EB",X"08",X"0F",X"FF",X"FF",X"F0",X"FF",X"0F",X"0F", + X"EB",X"EB",X"EB",X"E3",X"EF",X"EF",X"2F",X"27",X"0F",X"0F",X"FF",X"F0",X"FF",X"FF",X"0F",X"08", + X"27",X"27",X"27",X"2F",X"EF",X"E1",X"01",X"01",X"08",X"08",X"08",X"0F",X"FF",X"F0",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"F0",X"FF",X"3F",X"FF",X"F7",X"F7",X"F7",X"F7",X"F0",X"FF",X"CF",X"FF", + X"FF",X"3F",X"FF",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"CF",X"FF",X"F0",X"F7",X"F7",X"F7",X"F7", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"EE",X"FF",X"EE",X"FF",X"EE",X"FF",X"EE",X"55",X"FF",X"77",X"FF",X"77",X"FF",X"77",X"FF", + X"FF",X"EE",X"FF",X"EE",X"FF",X"EE",X"FF",X"EE",X"77",X"FF",X"77",X"FF",X"77",X"FF",X"77",X"FF", + X"FF",X"EE",X"FF",X"EE",X"FF",X"EE",X"FF",X"AA",X"77",X"FF",X"77",X"FF",X"77",X"FF",X"77",X"AA", + X"00",X"11",X"33",X"77",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"77", + X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"AE",X"AE",X"AE",X"00",X"08",X"3D",X"3D",X"3D",X"11",X"00",X"00", + X"00",X"00",X"8C",X"8F",X"CF",X"CF",X"CF",X"CF",X"00",X"00",X"00",X"00",X"08",X"0C",X"0C",X"0C", + X"AE",X"AE",X"AE",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"3D",X"3D",X"3D",X"08",X"00", + X"CF",X"CF",X"CF",X"CF",X"8F",X"8C",X"00",X"00",X"0C",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"3D",X"3D",X"3D",X"11",X"00",X"00", + X"00",X"00",X"8E",X"8F",X"CF",X"CF",X"CF",X"CF",X"00",X"00",X"00",X"08",X"4C",X"5F",X"5F",X"5F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"31",X"3D",X"3D",X"1D",X"18",X"00", + X"CF",X"CF",X"CF",X"CF",X"8F",X"8E",X"00",X"00",X"5F",X"5F",X"5F",X"4C",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"3D",X"3D",X"3D",X"11",X"11",X"11", + X"00",X"20",X"8E",X"8F",X"8F",X"CF",X"CF",X"CF",X"00",X"00",X"00",X"08",X"4C",X"5F",X"5F",X"5F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"3D",X"3D",X"3D",X"08",X"00", + X"CF",X"CF",X"CF",X"8F",X"8F",X"8E",X"20",X"00",X"5F",X"5F",X"5F",X"4C",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"00",X"08",X"3D",X"3D",X"3D",X"11",X"11",X"11", + X"00",X"00",X"8B",X"8B",X"8F",X"8F",X"8F",X"8F",X"00",X"80",X"80",X"00",X"6A",X"2F",X"2F",X"2F", + X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"3D",X"3D",X"3D",X"08",X"00", + X"8F",X"8F",X"8F",X"8F",X"8B",X"8B",X"00",X"00",X"2F",X"2F",X"2F",X"6A",X"00",X"80",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"4C",X"4C",X"4C",X"00",X"08",X"1D",X"3D",X"3D",X"3D",X"11",X"00", + X"00",X"00",X"00",X"89",X"CF",X"CF",X"CF",X"CF",X"00",X"20",X"2C",X"0C",X"3D",X"1F",X"1F",X"1F", + X"4C",X"4C",X"4C",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"3D",X"3D",X"3D",X"1D",X"08",X"00", + X"CF",X"CF",X"CF",X"CF",X"89",X"00",X"00",X"00",X"1F",X"1F",X"1F",X"3D",X"0C",X"2C",X"20",X"00", + X"00",X"80",X"80",X"00",X"88",X"AE",X"AE",X"AE",X"00",X"08",X"0C",X"3D",X"3D",X"3D",X"11",X"00", + X"00",X"00",X"00",X"CC",X"EF",X"EF",X"EF",X"EF",X"00",X"00",X"07",X"07",X"1E",X"0F",X"0F",X"0F", + X"AE",X"AE",X"AE",X"88",X"00",X"80",X"80",X"00",X"00",X"11",X"3D",X"3D",X"3D",X"0C",X"08",X"00", + X"EF",X"EF",X"EF",X"EF",X"CC",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"1E",X"07",X"07",X"00",X"00", + X"00",X"20",X"2C",X"0C",X"C4",X"5F",X"5F",X"5F",X"00",X"00",X"00",X"1D",X"0F",X"0F",X"0F",X"00", + X"00",X"00",X"00",X"EE",X"FF",X"FF",X"BB",X"33",X"00",X"00",X"01",X"03",X"0F",X"0F",X"0F",X"0F", + X"5F",X"5F",X"5F",X"C4",X"0C",X"2C",X"20",X"00",X"00",X"07",X"0F",X"0F",X"1D",X"00",X"00",X"00", + X"33",X"BB",X"FF",X"FF",X"EE",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"03",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"44",X"5F",X"D7",X"00",X"0F",X"0F",X"70",X"77",X"77",X"77",X"33", + X"00",X"00",X"00",X"CF",X"DF",X"DE",X"DE",X"DE",X"00",X"00",X"0C",X"0E",X"8F",X"8F",X"87",X"B4", + X"5F",X"5F",X"D7",X"5F",X"44",X"00",X"00",X"00",X"00",X"00",X"11",X"3D",X"3D",X"3D",X"0C",X"08", + X"CF",X"CF",X"CF",X"CF",X"FF",X"B8",X"30",X"00",X"69",X"78",X"7C",X"65",X"10",X"80",X"80",X"00", + X"08",X"08",X"08",X"08",X"44",X"5F",X"D7",X"5F",X"00",X"01",X"07",X"17",X"17",X"33",X"33",X"11", + X"00",X"0C",X"0C",X"CC",X"EF",X"EF",X"EF",X"EF",X"F1",X"F3",X"01",X"07",X"0F",X"0F",X"3C",X"69", + X"5F",X"D7",X"5F",X"44",X"C0",X"C0",X"00",X"00",X"11",X"11",X"33",X"33",X"33",X"30",X"03",X"03", + X"EF",X"EF",X"EF",X"CD",X"CC",X"80",X"0C",X"0E",X"78",X"7C",X"6D",X"1E",X"2E",X"3E",X"00",X"00", + X"00",X"00",X"08",X"08",X"C4",X"D7",X"5F",X"D7",X"00",X"00",X"00",X"19",X"1D",X"3D",X"3D",X"2C", + X"00",X"00",X"DD",X"FE",X"FE",X"FE",X"EF",X"EF",X"00",X"0F",X"8F",X"8F",X"96",X"B4",X"69",X"7C", + X"D7",X"5F",X"D7",X"C4",X"08",X"08",X"00",X"00",X"00",X"10",X"16",X"16",X"16",X"06",X"04",X"00", + X"EF",X"EF",X"EF",X"EF",X"EF",X"CC",X"00",X"00",X"7C",X"69",X"3C",X"1E",X"0F",X"FC",X"F8",X"00", + X"00",X"08",X"0C",X"0C",X"C4",X"5F",X"5F",X"D7",X"00",X"00",X"03",X"07",X"07",X"12",X"11",X"0C", + X"00",X"00",X"6E",X"7F",X"7F",X"FF",X"FF",X"FF",X"00",X"F1",X"F3",X"0F",X"1E",X"2D",X"7A",X"7A", + X"D7",X"5F",X"5F",X"C4",X"08",X"08",X"00",X"00",X"3D",X"3D",X"3D",X"19",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"CC",X"00",X"00",X"00",X"7A",X"7A",X"2D",X"1E",X"07",X"E3",X"E3",X"00", + X"00",X"00",X"00",X"00",X"C4",X"5F",X"5F",X"5F",X"00",X"00",X"00",X"19",X"1D",X"3D",X"3D",X"2C", + X"00",X"01",X"33",X"F8",X"E9",X"EF",X"EF",X"EF",X"00",X"0C",X"8E",X"8F",X"0F",X"0F",X"0F",X"0F", + X"5F",X"5F",X"5F",X"C4",X"00",X"00",X"00",X"00",X"00",X"33",X"07",X"0F",X"0F",X"0E",X"00",X"00", + X"EF",X"EF",X"EF",X"EF",X"EF",X"66",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"1E",X"0E",X"00", + X"00",X"00",X"00",X"00",X"C4",X"5F",X"5F",X"5F",X"00",X"00",X"11",X"33",X"07",X"07",X"03",X"0C", + X"00",X"00",X"FE",X"EF",X"6F",X"6F",X"6F",X"67",X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"5F",X"5F",X"5F",X"C4",X"00",X"00",X"00",X"00",X"3D",X"3D",X"3D",X"19",X"00",X"00",X"00",X"00", + X"EF",X"EF",X"EF",X"EF",X"CC",X"30",X"30",X"00",X"0F",X"0F",X"0F",X"0F",X"07",X"CE",X"C6",X"00", + X"00",X"00",X"00",X"00",X"C4",X"5F",X"5F",X"5F",X"00",X"00",X"08",X"3D",X"3D",X"3D",X"1D",X"00", + X"00",X"70",X"71",X"CD",X"EF",X"EF",X"EF",X"EF",X"00",X"8E",X"8F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"5F",X"5F",X"5F",X"C4",X"00",X"00",X"00",X"00",X"00",X"1D",X"3D",X"3D",X"3D",X"08",X"00",X"00", + X"EF",X"EF",X"EF",X"EF",X"CD",X"71",X"70",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"8F",X"8E",X"00", + X"00",X"00",X"4C",X"D7",X"5F",X"5F",X"D7",X"5F",X"00",X"00",X"11",X"10",X"10",X"12",X"03",X"33", + X"00",X"0F",X"8F",X"8F",X"87",X"87",X"0F",X"0F",X"00",X"0E",X"0F",X"1E",X"2D",X"3C",X"78",X"78", + X"5F",X"44",X"00",X"00",X"00",X"00",X"08",X"0C",X"33",X"33",X"33",X"33",X"33",X"10",X"01",X"01", + X"EF",X"FF",X"FF",X"FF",X"CC",X"C0",X"0E",X"0F",X"69",X"98",X"EE",X"FF",X"FF",X"70",X"07",X"07", + X"00",X"44",X"57",X"57",X"57",X"57",X"57",X"57",X"07",X"0F",X"96",X"B4",X"F0",X"3C",X"0F",X"0F", + X"0C",X"0E",X"C2",X"48",X"E0",X"C0",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"30",X"F8",X"E8", + X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"33",X"00", + X"0F",X"0C",X"0C",X"EE",X"FF",X"FF",X"FF",X"77",X"E8",X"00",X"01",X"03",X"83",X"83",X"83",X"00", + X"00",X"00",X"00",X"00",X"00",X"0C",X"84",X"84",X"00",X"00",X"00",X"01",X"10",X"00",X"11",X"11", + X"00",X"00",X"0E",X"0D",X"E3",X"EF",X"CF",X"CF",X"00",X"00",X"0E",X"C3",X"C3",X"3C",X"69",X"7C", + X"84",X"84",X"0C",X"00",X"00",X"00",X"00",X"00",X"11",X"01",X"10",X"10",X"01",X"00",X"00",X"00", + X"CF",X"CF",X"EF",X"E3",X"0D",X"0E",X"00",X"00",X"7C",X"69",X"3C",X"C3",X"C3",X"0E",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"31",X"03", + X"00",X"00",X"21",X"23",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"0F",X"0E",X"EF",X"E9",X"E9",X"0F", + X"80",X"80",X"84",X"0C",X"08",X"00",X"00",X"00",X"03",X"03",X"03",X"02",X"00",X"00",X"00",X"00", + X"EF",X"E9",X"E9",X"0F",X"0F",X"07",X"00",X"00",X"3C",X"7A",X"E5",X"D2",X"E1",X"03",X"00",X"00", + X"00",X"00",X"08",X"0C",X"0C",X"0C",X"04",X"08",X"00",X"00",X"01",X"03",X"03",X"03",X"02",X"01", + X"00",X"00",X"B3",X"F7",X"F7",X"FF",X"CF",X"0F",X"00",X"00",X"DC",X"FE",X"FE",X"FF",X"3F",X"0F", + X"84",X"84",X"0C",X"08",X"00",X"00",X"00",X"00",X"12",X"12",X"03",X"01",X"00",X"00",X"00",X"00", + X"87",X"B5",X"78",X"5A",X"34",X"07",X"00",X"00",X"1E",X"DA",X"E1",X"A5",X"C2",X"0E",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"0C",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"06",X"06",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"06", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"96",X"B4",X"F0",X"3C",X"0F",X"0F", + X"88",X"AE",X"AE",X"AE",X"AE",X"AE",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"30",X"F8",X"E8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"33",X"00", + X"0F",X"0C",X"0C",X"EE",X"FF",X"FF",X"FF",X"77",X"88",X"00",X"01",X"83",X"C3",X"C3",X"C3",X"00", + X"00",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00", + X"00",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00", + X"00",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00", + X"00",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"00", + X"00",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00", + X"00",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"70",X"00",X"00",X"00",X"00",X"E0",X"F0",X"F0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"E0",X"F0",X"F0",X"E0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"4A",X"0F",X"00",X"40",X"80",X"83",X"87",X"87",X"43",X"0F", + X"00",X"00",X"0E",X"0E",X"0D",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"0C",X"0F",X"0F",X"0F", + X"0F",X"4A",X"C0",X"00",X"00",X"00",X"00",X"00",X"2F",X"53",X"87",X"87",X"83",X"80",X"40",X"00", + X"0F",X"FF",X"0F",X"0D",X"0E",X"0E",X"00",X"00",X"0F",X"0F",X"0F",X"0C",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"00",X"00",X"80",X"84",X"0E",X"00",X"00",X"10",X"60",X"43",X"43",X"03",X"07", + X"00",X"00",X"07",X"0F",X"0E",X"0F",X"0F",X"0F",X"00",X"10",X"34",X"14",X"0E",X"1E",X"0F",X"0F", + X"0E",X"84",X"80",X"00",X"00",X"80",X"00",X"00",X"17",X"03",X"43",X"43",X"60",X"10",X"00",X"00", + X"8F",X"7F",X"0F",X"0E",X"0F",X"07",X"00",X"00",X"0F",X"CF",X"1E",X"0E",X"14",X"34",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"03",X"61",X"43",X"07",X"07",X"0F",X"0F",X"08",X"0C",X"68",X"2C",X"0E",X"0E",X"0F",X"0F", + X"00",X"0C",X"0C",X"0C",X"08",X"08",X"20",X"C0",X"00",X"03",X"03",X"03",X"01",X"01",X"40",X"30", + X"0F",X"07",X"0F",X"0F",X"0F",X"0F",X"2D",X"C1",X"4F",X"4E",X"4F",X"4F",X"4F",X"8F",X"4B",X"38", + X"00",X"00",X"00",X"40",X"E0",X"40",X"0C",X"00",X"00",X"00",X"00",X"20",X"70",X"00",X"03",X"00", + X"00",X"01",X"03",X"61",X"43",X"0F",X"0F",X"0F",X"00",X"08",X"0C",X"68",X"2C",X"0F",X"4F",X"4F", + X"0C",X"0C",X"0C",X"08",X"40",X"80",X"80",X"00",X"03",X"03",X"03",X"01",X"20",X"10",X"10",X"00", + X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"C1",X"00",X"4E",X"4F",X"4F",X"8F",X"8F",X"0F",X"38",X"00", + X"00",X"00",X"A0",X"70",X"20",X"C0",X"4A",X"0F",X"00",X"00",X"00",X"00",X"08",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"70",X"86",X"0C",X"0F",X"0F",X"0F", + X"0F",X"4A",X"C0",X"20",X"70",X"A0",X"00",X"00",X"EF",X"1F",X"0F",X"08",X"00",X"00",X"00",X"00", + X"0F",X"FF",X"0F",X"0F",X"00",X"00",X"00",X"00",X"0F",X"CF",X"0F",X"0C",X"86",X"70",X"00",X"00", + X"00",X"00",X"00",X"0E",X"0F",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"20",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"60",X"00",X"00",X"00", + X"01",X"03",X"07",X"0F",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"10",X"20",X"00",X"00",X"00",X"00",X"60",X"C3",X"00",X"00",X"00", + X"80",X"C0",X"80",X"40",X"40",X"48",X"48",X"80",X"10",X"30",X"10",X"20",X"20",X"21",X"21",X"10", + X"01",X"83",X"61",X"43",X"07",X"07",X"0F",X"0F",X"08",X"1C",X"68",X"2C",X"0E",X"0E",X"4F",X"4F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"0F",X"4F",X"4F",X"4F",X"4F",X"4E",X"8E",X"8E",X"8F", + X"00",X"08",X"08",X"08",X"08",X"08",X"80",X"80",X"00",X"01",X"01",X"01",X"01",X"01",X"10",X"10", + X"0F",X"0E",X"0C",X"08",X"00",X"80",X"80",X"00",X"0F",X"07",X"03",X"01",X"00",X"10",X"10",X"00", + X"C0",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"8E",X"86",X"87",X"8F",X"66",X"FF",X"F9",X"F9",X"F9",X"FF",X"67",X"63", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"80",X"FF",X"F9",X"9E",X"FE",X"FF",X"FF", + X"0F",X"0F",X"0E",X"2F",X"67",X"03",X"00",X"00",X"47",X"CF",X"CB",X"CB",X"E9",X"FF",X"66",X"00", + X"0F",X"0F",X"1F",X"0F",X"0F",X"07",X"00",X"00",X"7F",X"CF",X"3C",X"3C",X"1F",X"EE",X"FF",X"77", + X"00",X"00",X"00",X"00",X"8C",X"8E",X"86",X"EE",X"00",X"00",X"01",X"03",X"67",X"FF",X"F9",X"F9", + X"00",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"80",X"FF",X"9F",X"F8",X"FE",X"7F", + X"EE",X"FF",X"EE",X"4E",X"CE",X"06",X"00",X"00",X"F9",X"FF",X"EF",X"CB",X"CF",X"67",X"00",X"00", + X"0F",X"1F",X"2F",X"1F",X"0F",X"0F",X"07",X"00",X"C3",X"F3",X"0F",X"0F",X"0F",X"0F",X"0E",X"00", + X"00",X"00",X"00",X"00",X"8C",X"8E",X"86",X"8F",X"66",X"FF",X"F9",X"DB",X"CB",X"CF",X"47",X"03", + X"44",X"EE",X"EE",X"EF",X"4F",X"4F",X"69",X"69",X"00",X"00",X"80",X"FF",X"F9",X"9E",X"FE",X"FE", + X"8F",X"0F",X"0F",X"4E",X"CE",X"06",X"00",X"00",X"67",X"FF",X"F9",X"F9",X"F9",X"FF",X"66",X"00", + X"4F",X"2F",X"2F",X"1F",X"0F",X"0F",X"07",X"00",X"FF",X"7F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00", + X"03",X"47",X"CE",X"0C",X"8E",X"CA",X"C7",X"CF",X"00",X"61",X"47",X"47",X"47",X"43",X"03",X"03", + X"17",X"69",X"69",X"0F",X"0F",X"0F",X"0F",X"0F",X"88",X"8E",X"0F",X"0F",X"7F",X"FC",X"CF",X"F7", + X"CF",X"C7",X"CA",X"8E",X"EE",X"FF",X"EF",X"03",X"03",X"03",X"61",X"FF",X"FF",X"FF",X"61",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"17",X"F7",X"FC",X"CF",X"7F",X"0F",X"79",X"68",X"88", + X"8C",X"CE",X"8E",X"0C",X"8E",X"CA",X"C7",X"CF",X"00",X"61",X"FF",X"FF",X"FF",X"61",X"03",X"03", + X"17",X"1F",X"0F",X"0F",X"0F",X"0F",X"0F",X"4F",X"88",X"68",X"69",X"0F",X"7F",X"CF",X"FC",X"F7", + X"CF",X"C7",X"CA",X"8E",X"0C",X"8E",X"CE",X"8C",X"13",X"13",X"53",X"47",X"47",X"47",X"61",X"00", + X"EF",X"EF",X"EF",X"4F",X"4F",X"69",X"69",X"17",X"F7",X"CF",X"FC",X"7F",X"0F",X"0F",X"8E",X"88", + X"00",X"00",X"00",X"8C",X"8E",X"8E",X"8F",X"8F",X"66",X"FF",X"F9",X"F9",X"F9",X"FF",X"67",X"03", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"69",X"69",X"00",X"80",X"FF",X"9F",X"DB",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0E",X"2F",X"67",X"03",X"00",X"00",X"47",X"CF",X"CB",X"CB",X"E9",X"FF",X"66",X"00", + X"4F",X"6F",X"1F",X"0F",X"0F",X"07",X"00",X"00",X"7F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"00",X"8C",X"8E",X"8E",X"8F",X"00",X"00",X"01",X"03",X"67",X"FF",X"F9",X"F9", + X"00",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"80",X"FF",X"D3",X"9F",X"FF",X"FF", + X"8F",X"0F",X"0F",X"4E",X"CE",X"06",X"00",X"00",X"F9",X"FF",X"EF",X"CB",X"CF",X"67",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"69",X"79",X"07",X"00",X"FF",X"7F",X"0F",X"8F",X"8F",X"8F",X"0E",X"00", + X"00",X"00",X"00",X"00",X"8C",X"8E",X"8E",X"8F",X"66",X"FF",X"E9",X"CB",X"CB",X"CF",X"47",X"03", + X"00",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"FF",X"9F",X"DB",X"FF",X"FF", + X"8F",X"0F",X"0F",X"4E",X"CE",X"06",X"00",X"00",X"67",X"FF",X"F9",X"F9",X"F9",X"FF",X"66",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"61",X"71",X"FF",X"7F",X"0F",X"0F",X"8F",X"8F",X"8E",X"88", + X"03",X"47",X"CE",X"0C",X"8E",X"CE",X"CF",X"CF",X"00",X"61",X"FF",X"FF",X"FF",X"61",X"03",X"03", + X"71",X"69",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"88",X"8E",X"0F",X"0F",X"7F",X"CF",X"ED",X"F7", + X"CF",X"CF",X"CE",X"8E",X"0C",X"CE",X"47",X"03",X"03",X"03",X"43",X"47",X"47",X"47",X"61",X"00", + X"0F",X"0F",X"0F",X"69",X"69",X"4F",X"7F",X"07",X"F7",X"CF",X"ED",X"7F",X"0F",X"0F",X"8E",X"08", + X"8C",X"CE",X"8E",X"0C",X"8E",X"CE",X"CF",X"CF",X"00",X"61",X"47",X"47",X"47",X"43",X"03",X"03", + X"07",X"7F",X"4F",X"69",X"69",X"0F",X"0F",X"0F",X"08",X"8E",X"0F",X"0F",X"7F",X"ED",X"CF",X"F7", + X"CF",X"CF",X"CE",X"8E",X"0C",X"8E",X"CE",X"8C",X"03",X"03",X"61",X"FF",X"FF",X"FF",X"61",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"69",X"71",X"F7",X"ED",X"CF",X"7F",X"0F",X"0F",X"8E",X"88", + X"00",X"00",X"00",X"44",X"5F",X"D7",X"5F",X"5F",X"07",X"0F",X"78",X"77",X"77",X"FF",X"FF",X"33", + X"07",X"0F",X"0F",X"8F",X"8F",X"8F",X"8F",X"8F",X"00",X"08",X"0C",X"0F",X"0F",X"3C",X"69",X"78", + X"D7",X"5F",X"44",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"3D",X"3D",X"3D",X"1D",X"08",X"00", + X"CF",X"CF",X"CF",X"CD",X"CD",X"88",X"00",X"00",X"78",X"6D",X"18",X"0C",X"CC",X"C0",X"E0",X"C0", + X"00",X"00",X"22",X"22",X"A2",X"B7",X"F3",X"B7",X"00",X"66",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"88",X"CC",X"EE",X"EF",X"EF",X"EF",X"00",X"00",X"00",X"00",X"88",X"DC",X"FC",X"FE", + X"3F",X"7F",X"BF",X"2E",X"2A",X"22",X"00",X"00",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC", + X"FF",X"F1",X"F9",X"DD",X"CD",X"89",X"00",X"00",X"EF",X"CF",X"8F",X"0F",X"0F",X"0E",X"0C",X"00", + X"00",X"00",X"22",X"22",X"A2",X"B7",X"F3",X"B7",X"00",X"66",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"88",X"CC",X"EE",X"EF",X"EF",X"EB",X"00",X"00",X"C0",X"E0",X"A8",X"DC",X"FC",X"DC", + X"3F",X"7F",X"BF",X"2E",X"2A",X"22",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"66", + X"FB",X"F9",X"F9",X"DD",X"CC",X"88",X"00",X"00",X"EF",X"CF",X"8F",X"8F",X"0F",X"0F",X"06",X"02", + X"00",X"00",X"00",X"88",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"11",X"00",X"00",X"11",X"11", + X"00",X"00",X"00",X"FF",X"00",X"FF",X"00",X"00",X"00",X"00",X"11",X"FF",X"00",X"FF",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"11",X"00",X"00",X"11",X"11",X"00",X"00",X"00", + X"FF",X"00",X"FF",X"00",X"00",X"FF",X"00",X"00",X"FF",X"00",X"FF",X"00",X"00",X"FF",X"00",X"00", + X"E0",X"F0",X"F0",X"F0",X"E0",X"8F",X"2C",X"F8",X"08",X"14",X"3C",X"3C",X"78",X"78",X"F0",X"71", + X"C0",X"F0",X"F0",X"F0",X"F2",X"F6",X"FE",X"FE",X"07",X"1E",X"3C",X"F0",X"F3",X"F3",X"97",X"92", + X"F8",X"2C",X"8F",X"E0",X"F0",X"F0",X"F0",X"E0",X"71",X"F0",X"78",X"78",X"3C",X"3C",X"14",X"08", + X"FE",X"FE",X"F6",X"F2",X"F0",X"F0",X"F0",X"C0",X"D6",X"97",X"F3",X"F3",X"F0",X"3C",X"1E",X"07", + X"86",X"87",X"C3",X"E1",X"E8",X"8F",X"AC",X"F4",X"10",X"30",X"16",X"07",X"1E",X"78",X"30",X"10", + X"C0",X"E0",X"F0",X"F0",X"F0",X"F1",X"F3",X"F7",X"70",X"F0",X"F0",X"F0",X"F1",X"F3",X"87",X"C7", + X"F4",X"AC",X"8F",X"E8",X"E1",X"C3",X"87",X"86",X"10",X"30",X"78",X"1E",X"07",X"16",X"30",X"10", + X"F7",X"F3",X"F1",X"F0",X"F0",X"F0",X"E0",X"C0",X"C7",X"87",X"F3",X"F1",X"F0",X"F0",X"F0",X"70", + X"C0",X"68",X"F0",X"F0",X"F0",X"8F",X"2C",X"F8",X"01",X"01",X"03",X"12",X"10",X"30",X"30",X"30", + X"38",X"3C",X"78",X"F0",X"F0",X"F1",X"F7",X"FF",X"83",X"C3",X"D2",X"F0",X"F3",X"F3",X"97",X"D2", + X"F8",X"2D",X"8E",X"F0",X"F0",X"F0",X"68",X"C0",X"30",X"30",X"30",X"10",X"12",X"03",X"01",X"01", + X"FF",X"F7",X"F1",X"F0",X"F0",X"78",X"3C",X"38",X"D6",X"97",X"F3",X"F3",X"F0",X"D2",X"C3",X"83", + X"00",X"00",X"08",X"C0",X"E4",X"E0",X"C3",X"E1",X"00",X"00",X"03",X"34",X"70",X"70",X"70",X"61", + X"00",X"02",X"0C",X"E0",X"F0",X"87",X"0F",X"0F",X"00",X"00",X"00",X"20",X"B0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"E0",X"E0",X"C0",X"C0",X"00",X"00",X"30",X"30",X"70",X"70",X"78",X"78",X"34",X"12", + X"8C",X"84",X"F3",X"B7",X"B4",X"D2",X"F0",X"90",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0", + X"00",X"00",X"08",X"C0",X"E4",X"E0",X"C3",X"E1",X"00",X"01",X"03",X"34",X"70",X"70",X"30",X"30", + X"00",X"08",X"00",X"C0",X"C3",X"C3",X"C3",X"C3",X"00",X"00",X"00",X"20",X"70",X"F0",X"F0",X"78", + X"F0",X"F0",X"F0",X"E0",X"E0",X"E0",X"C0",X"80",X"30",X"30",X"70",X"70",X"78",X"78",X"2C",X"06", + X"C3",X"87",X"C3",X"F0",X"F0",X"F0",X"F0",X"00",X"3C",X"3C",X"78",X"F0",X"F0",X"D2",X"16",X"34", + X"00",X"00",X"80",X"C8",X"C0",X"86",X"C2",X"E0",X"00",X"00",X"00",X"00",X"10",X"34",X"38",X"78", + X"00",X"00",X"00",X"1E",X"96",X"C3",X"C3",X"C3",X"00",X"01",X"50",X"F0",X"F0",X"F0",X"F0",X"F0", + X"E0",X"E0",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"78",X"78",X"78",X"30",X"30",X"10",X"10",X"00", + X"F1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"F8",X"F0",X"F0",X"F0",X"F0",X"B0",X"07",X"04", + X"08",X"C0",X"E4",X"E0",X"C3",X"E1",X"F0",X"F0",X"00",X"00",X"00",X"00",X"04",X"09",X"38",X"78", + X"00",X"00",X"00",X"10",X"1E",X"0F",X"87",X"87",X"00",X"20",X"70",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"E0",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"78",X"78",X"70",X"70",X"30",X"30",X"10",X"00", + X"D2",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"00",X"F8",X"78",X"78",X"34",X"B4",X"30",X"00",X"00", + X"00",X"08",X"C0",X"E4",X"E0",X"C3",X"E1",X"F0",X"00",X"00",X"00",X"01",X"10",X"30",X"30",X"30", + X"00",X"00",X"07",X"3C",X"F0",X"F0",X"F0",X"E1",X"00",X"00",X"20",X"70",X"78",X"78",X"3C",X"3C", + X"78",X"F8",X"E0",X"E0",X"E0",X"40",X"00",X"00",X"30",X"30",X"30",X"30",X"30",X"10",X"00",X"00", + X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"7C",X"E9",X"E1",X"F0",X"F0",X"F0",X"E0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"77",X"44",X"77",X"00",X"77",X"44",X"00",X"00",X"EE",X"AA",X"EE",X"00",X"EE",X"22", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"00",X"77",X"44",X"77",X"00",X"00",X"00",X"EE",X"00",X"EE",X"22",X"EE",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..2ec6484a --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,32 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0D",X"00",X"00",X"07",X"0D",X"0B",X"0E",X"03",X"0D",X"06",X"00",X"03",X"0D",X"08",X"0D",X"01", + X"0D",X"05",X"03",X"02",X"0D",X"05",X"03",X"05",X"0B",X"07",X"02",X"03",X"0B",X"07",X"05",X"01", + X"0B",X"07",X"05",X"02",X"0B",X"07",X"03",X"05",X"00",X"0D",X"07",X"03",X"0D",X"08",X"03",X"05", + X"07",X"0F",X"07",X"01",X"00",X"03",X"0F",X"07",X"00",X"01",X"03",X"07",X"00",X"0F",X"03",X"07", + X"00",X"05",X"03",X"07",X"00",X"03",X"0F",X"07",X"00",X"05",X"09",X"03",X"00",X"01",X"09",X"03", + X"00",X"0D",X"0A",X"04",X"07",X"0F",X"05",X"08",X"00",X"0C",X"00",X"00",X"0D",X"00",X"00",X"06", + X"00",X"03",X"02",X"07",X"00",X"01",X"0A",X"03",X"00",X"07",X"02",X"0A",X"00",X"08",X"0E",X"03", + X"00",X"0E",X"05",X"01",X"00",X"0E",X"07",X"02",X"00",X"01",X"03",X"07",X"0D",X"01",X"03",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin + data <= rom_data(to_integer(unsigned(addr))); +end architecture; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..622997bc --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"C0",X"38",X"07",X"87",X"3F",X"F0",X"FF",X"27",X"14",X"1C",X"80",X"A4",X"00",X"AE",X"28"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..1a2053b0 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"31",X"F0",X"4F",X"E7",X"C3",X"B4",X"01",X"FF",X"AF",X"77",X"23",X"10",X"FC",X"C9",X"FF",X"FF", + X"D5",X"07",X"5F",X"16",X"00",X"19",X"D1",X"C9",X"E1",X"18",X"33",X"FF",X"FF",X"FF",X"FF",X"FF", + X"AF",X"32",X"00",X"50",X"32",X"C0",X"50",X"C9",X"E7",X"3E",X"01",X"32",X"00",X"50",X"C9",X"FF", + X"18",X"1C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CD",X"AA",X"01",X"0F",X"0F",X"0F",X"E6",X"1E", + X"5F",X"16",X"00",X"21",X"D4",X"01",X"19",X"5E",X"23",X"56",X"EB",X"F1",X"F5",X"E9",X"CB",X"27", + X"5F",X"16",X"00",X"19",X"5E",X"23",X"56",X"EB",X"E9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"ED",X"73",X"1C",X"48",X"31",X"90",X"4F",X"08",X"D9",X"E7", + X"DD",X"E5",X"FD",X"E5",X"CD",X"E8",X"01",X"FD",X"E1",X"DD",X"E1",X"0E",X"03",X"21",X"B0",X"4B", + X"06",X"09",X"11",X"06",X"00",X"7E",X"FE",X"01",X"23",X"20",X"1B",X"79",X"A6",X"23",X"28",X"03", + X"35",X"28",X"0C",X"19",X"10",X"EF",X"EF",X"D9",X"08",X"ED",X"7B",X"1C",X"48",X"ED",X"45",X"2B", + X"CB",X"FE",X"2B",X"36",X"03",X"23",X"23",X"18",X"EA",X"31",X"F0",X"4F",X"FB",X"0E",X"00",X"21", + X"B0",X"4B",X"06",X"09",X"11",X"08",X"00",X"7E",X"CB",X"7F",X"20",X"04",X"FE",X"02",X"30",X"06", + X"0C",X"19",X"10",X"F3",X"18",X"E7",X"F3",X"79",X"32",X"00",X"48",X"7E",X"36",X"02",X"23",X"CB", + X"BE",X"23",X"36",X"00",X"23",X"5E",X"23",X"56",X"23",X"4E",X"23",X"46",X"23",X"EB",X"FE",X"04", + X"20",X"04",X"50",X"59",X"FB",X"E9",X"F9",X"FE",X"02",X"28",X"04",X"1A",X"C1",X"18",X"01",X"F1", + X"C1",X"D1",X"E1",X"FD",X"E1",X"DD",X"E1",X"FB",X"C9",X"CD",X"9A",X"01",X"36",X"04",X"23",X"72", + X"23",X"72",X"23",X"71",X"23",X"70",X"18",X"E7",X"CD",X"9A",X"01",X"72",X"18",X"E1",X"CD",X"97", + X"01",X"7E",X"FE",X"02",X"C2",X"A9",X"00",X"23",X"7E",X"CB",X"7F",X"20",X"15",X"E6",X"40",X"4F", + X"F1",X"F5",X"E6",X"0F",X"B1",X"77",X"23",X"70",X"2B",X"2B",X"36",X"01",X"CD",X"89",X"01",X"C3", + X"A9",X"00",X"CB",X"BE",X"1E",X"06",X"19",X"7E",X"18",X"B2",X"CD",X"9A",X"01",X"CB",X"BE",X"7E", + X"B7",X"28",X"AC",X"FE",X"04",X"28",X"A8",X"1E",X"07",X"19",X"70",X"11",X"FA",X"FF",X"19",X"CB", + X"F6",X"CB",X"FE",X"FE",X"01",X"20",X"98",X"2B",X"36",X"03",X"18",X"93",X"CD",X"9A",X"01",X"7E", + X"B7",X"28",X"8C",X"CB",X"FE",X"18",X"88",X"CD",X"97",X"01",X"72",X"C3",X"A9",X"00",X"CD",X"9A", + X"01",X"1E",X"05",X"19",X"71",X"23",X"70",X"C3",X"EF",X"00",X"CD",X"97",X"01",X"23",X"CB",X"76", + X"CB",X"B6",X"1E",X"06",X"19",X"7E",X"C3",X"EC",X"00",X"01",X"03",X"00",X"09",X"EB",X"21",X"02", + X"00",X"39",X"EB",X"73",X"23",X"72",X"C9",X"3A",X"00",X"48",X"E6",X"0F",X"21",X"B0",X"4B",X"16", + X"00",X"5F",X"CB",X"23",X"CB",X"23",X"CB",X"23",X"19",X"C9",X"DD",X"E3",X"FD",X"E5",X"E5",X"D5", + X"C5",X"F5",X"DD",X"E9",X"21",X"00",X"40",X"01",X"00",X"20",X"36",X"00",X"23",X"0B",X"78",X"B1", + X"20",X"F8",X"3A",X"00",X"50",X"2F",X"CB",X"7F",X"C2",X"00",X"A7",X"3E",X"00",X"01",X"F0",X"2E", + X"FF",X"C3",X"A9",X"00",X"F9",X"00",X"08",X"01",X"0E",X"01",X"0E",X"01",X"3A",X"01",X"5C",X"01", + X"67",X"01",X"6E",X"01",X"7A",X"01",X"FF",X"FF",X"3A",X"02",X"48",X"CB",X"67",X"C0",X"3A",X"C0", + X"50",X"2F",X"32",X"1A",X"48",X"21",X"80",X"50",X"36",X"01",X"36",X"00",X"21",X"1E",X"48",X"7E", + X"CB",X"BF",X"B7",X"28",X"0B",X"3D",X"CB",X"FF",X"77",X"20",X"05",X"AF",X"77",X"32",X"07",X"50", + X"3A",X"00",X"50",X"2F",X"E6",X"A0",X"57",X"21",X"03",X"48",X"7E",X"B7",X"7A",X"16",X"A0",X"20", + X"1C",X"A2",X"CA",X"BD",X"02",X"FE",X"20",X"20",X"07",X"E5",X"21",X"1E",X"48",X"CB",X"FE",X"E1", + X"36",X"24",X"C3",X"BD",X"02",X"00",X"00",X"00",X"01",X"00",X"02",X"00",X"03",X"35",X"28",X"14", + X"4F",X"7E",X"FE",X"22",X"79",X"30",X"06",X"A2",X"C2",X"BD",X"02",X"18",X"0B",X"A2",X"C2",X"BD", + X"02",X"C3",X"00",X"00",X"A2",X"C2",X"00",X"00",X"36",X"00",X"3A",X"1E",X"48",X"CB",X"7F",X"28", + X"0A",X"3E",X"06",X"32",X"1E",X"48",X"3E",X"01",X"32",X"07",X"50",X"06",X"64",X"21",X"04",X"48", + X"4E",X"23",X"7E",X"81",X"B8",X"30",X"13",X"06",X"00",X"77",X"21",X"36",X"02",X"CB",X"21",X"09", + X"11",X"07",X"48",X"06",X"02",X"CD",X"DA",X"8F",X"18",X"08",X"05",X"70",X"21",X"09",X"09",X"22", + X"06",X"48",X"3A",X"02",X"48",X"CB",X"7F",X"20",X"15",X"3E",X"0E",X"CD",X"40",X"03",X"21",X"49", + X"42",X"DD",X"21",X"06",X"48",X"1E",X"02",X"06",X"02",X"0E",X"FF",X"CD",X"1E",X"90",X"21",X"01", + X"48",X"CB",X"7E",X"CB",X"FE",X"20",X"06",X"3E",X"00",X"01",X"F2",X"2E",X"FF",X"21",X"40",X"48", + X"DD",X"21",X"F0",X"4F",X"FD",X"21",X"60",X"50",X"06",X"08",X"CB",X"7E",X"20",X"4F",X"4E",X"0C", + X"3A",X"1B",X"48",X"57",X"CB",X"FE",X"23",X"7E",X"CB",X"42",X"28",X"09",X"EE",X"C0",X"E6",X"C0", + X"5F",X"3E",X"3F",X"A6",X"B3",X"07",X"07",X"DD",X"77",X"00",X"23",X"7E",X"CB",X"42",X"28",X"04", + X"ED",X"44",X"C6",X"10",X"D6",X"02",X"FD",X"77",X"00",X"23",X"7E",X"DD",X"77",X"01",X"23",X"7E", + X"CB",X"42",X"28",X"04",X"ED",X"44",X"C6",X"10",X"FD",X"77",X"01",X"23",X"DD",X"23",X"DD",X"23", + X"FD",X"23",X"FD",X"23",X"05",X"CA",X"68",X"03",X"0D",X"28",X"AF",X"18",X"B3",X"11",X"05",X"00", + X"19",X"DD",X"23",X"DD",X"23",X"FD",X"23",X"FD",X"23",X"10",X"9F",X"C3",X"68",X"03",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"47",X"00",X"00",X"00",X"FE",X"0E",X"20",X"09",X"3A",X"02",X"48",X"CB",X"7F",X"78",X"C0",X"18", + X"07",X"3A",X"01",X"48",X"CB",X"7F",X"78",X"C8",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"CD",X"6E", + X"04",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C9",X"C3",X"6B",X"03",X"DD",X"21",X"20",X"48",X"DD", + X"E5",X"FD",X"E1",X"DD",X"23",X"DD",X"23",X"0E",X"03",X"06",X"01",X"DD",X"CB",X"00",X"7E",X"C5", + X"DD",X"E5",X"C4",X"93",X"03",X"DD",X"E1",X"C1",X"11",X"0A",X"00",X"DD",X"19",X"CB",X"20",X"0D", + X"20",X"E9",X"C9",X"DD",X"35",X"07",X"C0",X"DD",X"7E",X"02",X"DD",X"77",X"07",X"DD",X"CB",X"00", + X"46",X"28",X"08",X"DD",X"35",X"08",X"C0",X"DD",X"CB",X"00",X"86",X"DD",X"CB",X"00",X"4E",X"28", + X"08",X"DD",X"35",X"08",X"C0",X"DD",X"CB",X"00",X"8E",X"DD",X"6E",X"05",X"DD",X"66",X"06",X"7E", + X"23",X"DD",X"75",X"05",X"DD",X"74",X"06",X"CB",X"7F",X"20",X"07",X"DD",X"77",X"09",X"CD",X"CC", + X"05",X"C9",X"FE",X"80",X"20",X"01",X"C9",X"FE",X"C0",X"20",X"0D",X"4E",X"23",X"DD",X"75",X"05", + X"DD",X"74",X"06",X"CD",X"3A",X"05",X"18",X"D1",X"FE",X"C1",X"20",X"05",X"CD",X"4B",X"05",X"18", + X"C8",X"4F",X"E6",X"F0",X"FE",X"A0",X"20",X"05",X"CD",X"88",X"05",X"18",X"BC",X"FE",X"90",X"20", + X"05",X"CD",X"75",X"05",X"18",X"B3",X"FE",X"E0",X"20",X"0C",X"EB",X"CD",X"55",X"05",X"DD",X"73", + X"05",X"DD",X"72",X"06",X"18",X"A3",X"FE",X"D0",X"20",X"0E",X"79",X"E6",X"0F",X"DD",X"77",X"08", + X"DD",X"CB",X"00",X"C6",X"CD",X"A2",X"05",X"C9",X"FE",X"B0",X"20",X"0B",X"79",X"E6",X"0F",X"DD", + X"77",X"08",X"DD",X"CB",X"00",X"CE",X"C9",X"FE",X"F0",X"20",X"FC",X"CD",X"FB",X"04",X"DD",X"CB", + X"00",X"76",X"20",X"09",X"DD",X"E5",X"E1",X"06",X"0A",X"CD",X"C6",X"05",X"C9",X"DD",X"CB",X"00", + X"FE",X"DD",X"4E",X"02",X"DD",X"6E",X"03",X"DD",X"66",X"04",X"DD",X"71",X"07",X"DD",X"75",X"05", + X"DD",X"74",X"06",X"DD",X"36",X"08",X"00",X"DD",X"36",X"09",X"00",X"C3",X"B9",X"03",X"DD",X"21", + X"90",X"9C",X"FD",X"21",X"20",X"48",X"CB",X"7F",X"28",X"09",X"E6",X"0F",X"CA",X"D5",X"04",X"47", + X"C3",X"FB",X"04",X"16",X"00",X"3D",X"CB",X"27",X"5F",X"DD",X"19",X"DD",X"6E",X"00",X"DD",X"66", + X"01",X"E5",X"DD",X"E1",X"DD",X"7E",X"00",X"E6",X"0E",X"47",X"CD",X"1F",X"06",X"E5",X"06",X"0A", + X"CD",X"C6",X"05",X"E1",X"CB",X"FE",X"DD",X"CB",X"00",X"76",X"28",X"02",X"CB",X"F6",X"23",X"DD", + X"7E",X"01",X"77",X"23",X"DD",X"7E",X"02",X"77",X"23",X"DD",X"4E",X"03",X"71",X"23",X"DD",X"46", + X"04",X"70",X"23",X"71",X"23",X"70",X"23",X"36",X"01",X"DD",X"CB",X"00",X"7E",X"C0",X"01",X"05", + X"00",X"DD",X"09",X"18",X"BF",X"21",X"20",X"48",X"06",X"20",X"CD",X"C6",X"05",X"01",X"00",X"00", + X"1E",X"07",X"CD",X"94",X"05",X"04",X"1D",X"20",X"F9",X"0E",X"FF",X"CD",X"94",X"05",X"04",X"0E", + X"00",X"1E",X"08",X"CD",X"94",X"05",X"04",X"1D",X"20",X"F9",X"C9",X"0E",X"00",X"CD",X"88",X"05", + X"78",X"FD",X"4E",X"00",X"FE",X"01",X"20",X"06",X"CB",X"81",X"CB",X"99",X"18",X"0E",X"FE",X"02", + X"20",X"06",X"CB",X"89",X"CB",X"A1",X"18",X"04",X"CB",X"91",X"CB",X"A9",X"21",X"25",X"05",X"E5", + X"C5",X"79",X"C3",X"BA",X"05",X"C5",X"CB",X"38",X"CB",X"20",X"0E",X"00",X"CD",X"94",X"05",X"04", + X"CD",X"94",X"05",X"C1",X"CD",X"1F",X"06",X"CB",X"BE",X"C9",X"C5",X"06",X"06",X"CD",X"94",X"05", + X"C1",X"C5",X"78",X"07",X"07",X"07",X"FD",X"B6",X"00",X"18",X"6F",X"C5",X"78",X"07",X"07",X"07", + X"FD",X"AE",X"00",X"18",X"65",X"C5",X"06",X"0B",X"1A",X"4F",X"13",X"CD",X"94",X"05",X"04",X"1A", + X"4F",X"13",X"CD",X"94",X"05",X"C1",X"C5",X"0E",X"10",X"CD",X"88",X"05",X"C1",X"C5",X"06",X"0D", + X"CD",X"94",X"05",X"C1",X"C9",X"0E",X"00",X"C5",X"06",X"0B",X"CD",X"94",X"05",X"04",X"CD",X"94", + X"05",X"04",X"CD",X"94",X"05",X"C1",X"18",X"00",X"C5",X"CB",X"38",X"3E",X"08",X"80",X"47",X"CD", + X"94",X"05",X"C1",X"C9",X"78",X"D3",X"07",X"79",X"D3",X"06",X"C9",X"C5",X"78",X"FD",X"B6",X"00", + X"18",X"18",X"C5",X"78",X"FD",X"4E",X"00",X"FE",X"01",X"20",X"04",X"CB",X"81",X"18",X"0A",X"FE", + X"02",X"20",X"04",X"CB",X"89",X"18",X"02",X"CB",X"91",X"79",X"FD",X"77",X"00",X"2F",X"4F",X"06", + X"07",X"CD",X"94",X"05",X"C1",X"C9",X"AF",X"77",X"23",X"10",X"FC",X"C9",X"4F",X"DD",X"7E",X"01", + X"B7",X"28",X"18",X"CB",X"7F",X"20",X"0C",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"81", + X"4F",X"18",X"08",X"5F",X"79",X"C6",X"10",X"1C",X"20",X"FB",X"4F",X"21",X"3B",X"06",X"59",X"CB", + X"3B",X"CB",X"3B",X"CB",X"3B",X"CB",X"3B",X"CB",X"23",X"16",X"00",X"19",X"5E",X"23",X"56",X"79", + X"E6",X"0F",X"6F",X"CB",X"25",X"26",X"00",X"19",X"EB",X"C5",X"CB",X"38",X"CB",X"20",X"1A",X"4F", + X"13",X"CD",X"94",X"05",X"04",X"1A",X"4F",X"CD",X"94",X"05",X"C1",X"CD",X"9B",X"05",X"C9",X"C5", + X"FD",X"E5",X"D1",X"CB",X"38",X"CB",X"20",X"48",X"06",X"00",X"21",X"35",X"06",X"09",X"4E",X"23", + X"46",X"EB",X"09",X"C1",X"C9",X"02",X"00",X"0C",X"00",X"16",X"00",X"4B",X"06",X"63",X"06",X"7B", + X"06",X"93",X"06",X"AB",X"06",X"C3",X"06",X"DB",X"06",X"F3",X"06",X"5D",X"0D",X"9C",X"0C",X"E7", + X"0B",X"3C",X"0B",X"9B",X"0A",X"02",X"0A",X"73",X"09",X"EB",X"08",X"6B",X"08",X"F2",X"07",X"80", + X"07",X"14",X"07",X"AE",X"06",X"4E",X"06",X"F4",X"05",X"9E",X"05",X"4D",X"05",X"01",X"05",X"B9", + X"04",X"75",X"04",X"35",X"04",X"F9",X"03",X"C0",X"03",X"8A",X"03",X"57",X"03",X"27",X"03",X"FA", + X"02",X"CF",X"02",X"A7",X"02",X"81",X"02",X"5D",X"02",X"3B",X"02",X"1B",X"02",X"FC",X"01",X"E0", + X"01",X"C5",X"01",X"AC",X"01",X"94",X"01",X"7D",X"01",X"68",X"01",X"53",X"01",X"40",X"01",X"2E", + X"01",X"1D",X"01",X"0D",X"01",X"FE",X"00",X"F0",X"00",X"E2",X"00",X"D6",X"00",X"CA",X"00",X"BE", + X"00",X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97",X"00",X"8F",X"00",X"87",X"00",X"7F",X"00",X"78", + X"00",X"71",X"00",X"6B",X"00",X"65",X"00",X"5F",X"00",X"5A",X"00",X"55",X"00",X"50",X"00",X"4C", + X"00",X"47",X"00",X"43",X"00",X"40",X"00",X"3C",X"00",X"39",X"00",X"35",X"00",X"32",X"00",X"30", + X"00",X"2D",X"00",X"2A",X"00",X"28",X"00",X"26",X"00",X"24",X"00",X"22",X"00",X"20",X"00",X"1E", + X"00",X"1C",X"00",X"1B",X"00",X"19",X"00",X"18",X"00",X"16",X"00",X"15",X"00",X"14",X"00",X"13", + X"00",X"12",X"00",X"11",X"00",X"10",X"00",X"0F",X"00",X"0E",X"00",X"FF",X"FF",X"FF",X"FF",X"FF", + X"1C",X"0D",X"A0",X"03",X"A1",X"01",X"A2",X"0B",X"A0",X"1C",X"01",X"A0",X"01",X"A3",X"0B",X"A4", + X"03",X"A5",X"01",X"AC",X"09",X"A4",X"01",X"A6",X"01",X"A0",X"1C",X"01",X"A0",X"01",X"A1",X"98", + X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A0",X"01",X"A1",X"98",X"01",X"A2",X"01",X"A0",X"1C",X"01", + X"A0",X"01",X"A1",X"98",X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A0",X"01",X"A1",X"98",X"01",X"A2", + X"01",X"A0",X"1C",X"01",X"A0",X"01",X"A1",X"98",X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A0",X"01", + X"A1",X"98",X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A0",X"01",X"A1",X"98",X"01",X"A2",X"01",X"A0", + X"1C",X"01",X"A0",X"01",X"A1",X"98",X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A0",X"01",X"A1",X"98", + X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A4",X"01",X"A5",X"98",X"01",X"AC",X"01",X"A4",X"1C",X"9C", + X"1C",X"9C",X"1C",X"01",X"A7",X"01",X"A8",X"98",X"01",X"A9",X"01",X"A7",X"1C",X"01",X"A0",X"01", + X"A1",X"98",X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A0",X"01",X"A1",X"98",X"01",X"A2",X"01",X"A0", + X"1C",X"01",X"A0",X"01",X"A1",X"98",X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A0",X"01",X"A1",X"98", + X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A0",X"01",X"A1",X"98",X"01",X"A2",X"01",X"A0",X"1C",X"01", + X"A0",X"01",X"A1",X"98",X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A0",X"01",X"A1",X"98",X"01",X"A2", + X"01",X"A0",X"1C",X"01",X"A0",X"01",X"A1",X"98",X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A0",X"01", + X"A1",X"98",X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A0",X"01",X"A1",X"98",X"01",X"A2",X"01",X"A0", + X"1C",X"01",X"A0",X"01",X"A1",X"98",X"01",X"A2",X"01",X"A0",X"1C",X"01",X"A0",X"01",X"AA",X"0B", + X"A7",X"03",X"A8",X"01",X"A9",X"09",X"A7",X"01",X"AB",X"01",X"A0",X"1C",X"0D",X"A0",X"03",X"A1", + X"01",X"A2",X"0B",X"A0",X"00",X"4D",X"08",X"57",X"08",X"6A",X"08",X"74",X"08",X"87",X"08",X"9A", + X"08",X"AD",X"08",X"BA",X"08",X"CD",X"08",X"E0",X"08",X"FC",X"08",X"09",X"09",X"1C",X"09",X"38", + X"09",X"4B",X"09",X"58",X"09",X"6B",X"09",X"7E",X"09",X"91",X"09",X"9E",X"09",X"20",X"AA",X"AA", + X"01",X"FF",X"10",X"01",X"01",X"10",X"FF",X"34",X"AA",X"AA",X"02",X"FE",X"04",X"02",X"FF",X"08", + X"01",X"00",X"04",X"02",X"01",X"08",X"02",X"02",X"04",X"FF",X"40",X"AA",X"AA",X"02",X"FF",X"10", + X"02",X"01",X"10",X"FF",X"28",X"AA",X"AA",X"01",X"FE",X"0A",X"01",X"FF",X"05",X"01",X"00",X"02", + X"01",X"01",X"05",X"01",X"02",X"12",X"FF",X"30",X"AA",X"AA",X"01",X"FE",X"12",X"01",X"FF",X"05", + X"01",X"00",X"02",X"01",X"01",X"05",X"01",X"02",X"12",X"FF",X"38",X"AA",X"AA",X"01",X"FE",X"12", + X"01",X"FF",X"05",X"01",X"00",X"02",X"01",X"01",X"05",X"01",X"02",X"1A",X"FF",X"50",X"AA",X"AA", + X"01",X"FF",X"26",X"01",X"00",X"04",X"01",X"01",X"26",X"FF",X"60",X"AA",X"AA",X"02",X"FF",X"0F", + X"01",X"FF",X"01",X"01",X"00",X"02",X"01",X"01",X"01",X"02",X"01",X"1F",X"FF",X"30",X"AA",X"AA", + X"01",X"FE",X"1D",X"01",X"FF",X"02",X"01",X"00",X"02",X"01",X"01",X"02",X"01",X"02",X"0D",X"FF", + X"28",X"AA",X"AA",X"01",X"FE",X"10",X"01",X"FF",X"03",X"01",X"00",X"02",X"01",X"01",X"03",X"01", + X"02",X"07",X"01",X"03",X"09",X"00",X"03",X"01",X"00",X"04",X"01",X"FF",X"50",X"AA",X"AA",X"01", + X"FF",X"26",X"01",X"00",X"04",X"01",X"01",X"26",X"FF",X"30",X"AA",X"AA",X"01",X"FE",X"12",X"01", + X"FF",X"05",X"01",X"00",X"02",X"01",X"01",X"05",X"01",X"02",X"12",X"FF",X"28",X"AA",X"AA",X"01", + X"FE",X"10",X"01",X"FF",X"03",X"01",X"00",X"02",X"01",X"01",X"03",X"01",X"02",X"07",X"01",X"03", + X"09",X"00",X"03",X"01",X"00",X"04",X"01",X"FF",X"38",X"AA",X"AA",X"01",X"FE",X"12",X"01",X"FF", + X"05",X"01",X"00",X"02",X"01",X"01",X"05",X"01",X"02",X"0A",X"FF",X"50",X"AA",X"AA",X"01",X"FF", + X"26",X"01",X"00",X"04",X"01",X"01",X"26",X"FF",X"28",X"AA",X"AA",X"01",X"FE",X"13",X"01",X"FF", + X"04",X"01",X"00",X"02",X"01",X"01",X"04",X"01",X"02",X"0B",X"FF",X"50",X"AA",X"AA",X"01",X"FE", + X"25",X"01",X"FF",X"02",X"01",X"00",X"02",X"01",X"01",X"02",X"01",X"02",X"25",X"FF",X"30",X"AA", + X"AA",X"01",X"FE",X"1B",X"01",X"FF",X"04",X"01",X"00",X"02",X"01",X"01",X"04",X"01",X"02",X"0B", + X"FF",X"50",X"AA",X"AA",X"01",X"FF",X"37",X"01",X"00",X"02",X"01",X"01",X"17",X"FF",X"50",X"AA", + X"AA",X"01",X"FF",X"26",X"01",X"00",X"04",X"01",X"01",X"26",X"FF",X"B3",X"09",X"C7",X"09",X"D5", + X"09",X"E9",X"09",X"C8",X"30",X"AA",X"AA",X"01",X"FE",X"1B",X"01",X"FF",X"04",X"01",X"00",X"02", + X"01",X"01",X"04",X"01",X"02",X"0B",X"FF",X"C8",X"50",X"AA",X"AA",X"01",X"FF",X"37",X"01",X"00", + X"02",X"01",X"01",X"17",X"FF",X"D0",X"28",X"AA",X"AA",X"01",X"FE",X"13",X"01",X"FF",X"04",X"01", + X"00",X"02",X"01",X"01",X"04",X"01",X"02",X"0B",X"FF",X"E8",X"40",X"AA",X"AA",X"02",X"FF",X"18", + X"02",X"01",X"08",X"FF",X"00",X"08",X"02",X"00",X"10",X"01",X"00",X"08",X"01",X"00",X"10",X"01", + X"00",X"08",X"04",X"00",X"08",X"04",X"00",X"08",X"01",X"00",X"08",X"01",X"00",X"08",X"04",X"00", + X"08",X"04",X"00",X"08",X"01",X"08",X"02",X"00",X"20",X"02",X"00",X"08",X"01",X"00",X"08",X"01", + X"00",X"10",X"04",X"08",X"01",X"00",X"10",X"01",X"08",X"04",X"1C",X"01",X"00",X"08",X"02",X"18", + X"01",X"18",X"02",X"00",X"08",X"02",X"08",X"08",X"00",X"08",X"08",X"00",X"08",X"08",X"00",X"10", + X"08",X"00",X"10",X"04",X"18",X"01",X"00",X"20",X"04",X"08",X"01",X"FF",X"02",X"57",X"0A",X"67", + X"0A",X"7B",X"0A",X"99",X"0A",X"AF",X"0A",X"50",X"04",X"20",X"08",X"30",X"04",X"30",X"08",X"10", + X"01",X"10",X"02",X"30",X"01",X"FF",X"08",X"30",X"02",X"40",X"01",X"30",X"02",X"30",X"01",X"20", + X"08",X"30",X"01",X"10",X"02",X"20",X"01",X"40",X"04",X"FF",X"02",X"60",X"01",X"10",X"08",X"50", + X"01",X"40",X"08",X"10",X"04",X"20",X"02",X"20",X"04",X"10",X"02",X"20",X"04",X"10",X"08",X"20", + X"04",X"20",X"08",X"10",X"04",X"30",X"01",X"FF",X"08",X"20",X"02",X"10",X"04",X"20",X"02",X"10", + X"04",X"40",X"02",X"10",X"04",X"10",X"08",X"10",X"04",X"60",X"08",X"30",X"04",X"FF",X"02",X"30", + X"08",X"30",X"04",X"FF",X"08",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"20",X"4E",X"21",X"90",X"4A",X"06",X"04",X"CF",X"FD",X"21",X"90",X"4A",X"DD",X"21",X"63", + X"48",X"DD",X"36",X"01",X"33",X"DD",X"36",X"02",X"B0",X"DD",X"36",X"03",X"01",X"DD",X"36",X"04", + X"38",X"21",X"AA",X"AA",X"22",X"91",X"4A",X"FD",X"36",X"03",X"04",X"3E",X"23",X"06",X"02",X"FF", + X"FD",X"21",X"90",X"4A",X"DD",X"21",X"63",X"48",X"FD",X"7E",X"00",X"B7",X"20",X"3B",X"DD",X"7E", + X"02",X"FE",X"B0",X"20",X"0B",X"3A",X"44",X"48",X"FE",X"4C",X"38",X"04",X"FE",X"A0",X"38",X"DB", + X"FE",X"A0",X"20",X"0A",X"DD",X"36",X"01",X"B3",X"FD",X"34",X"00",X"C3",X"2B",X"0B",X"FD",X"7E", + X"03",X"B7",X"20",X"45",X"FD",X"36",X"03",X"04",X"DD",X"7E",X"01",X"1E",X"34",X"FE",X"33",X"28", + X"02",X"1E",X"33",X"DD",X"73",X"01",X"C3",X"A9",X"0B",X"DD",X"7E",X"02",X"FE",X"B0",X"20",X"0E", + X"DD",X"36",X"01",X"33",X"DD",X"36",X"00",X"00",X"FD",X"35",X"00",X"C3",X"2B",X"0B",X"FD",X"7E", + X"03",X"B7",X"20",X"15",X"FD",X"36",X"03",X"04",X"DD",X"7E",X"01",X"1E",X"B4",X"FE",X"B3",X"28", + X"02",X"1E",X"B3",X"DD",X"73",X"01",X"C3",X"A9",X"0B",X"FD",X"35",X"03",X"2A",X"91",X"4A",X"29", + X"38",X"06",X"22",X"91",X"4A",X"C3",X"2B",X"0B",X"11",X"00",X"00",X"ED",X"5A",X"22",X"91",X"4A", + X"01",X"01",X"00",X"FD",X"CB",X"00",X"46",X"20",X"03",X"01",X"FF",X"00",X"DD",X"66",X"02",X"DD", + X"6E",X"04",X"CD",X"A5",X"91",X"DD",X"74",X"02",X"DD",X"75",X"04",X"DD",X"36",X"00",X"00",X"C3", + X"2B",X"0B",X"DD",X"36",X"01",X"33",X"DD",X"36",X"00",X"00",X"3E",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"60",X"4E",X"3E",X"90",X"32",X"98",X"4A",X"21",X"68",X"48",X"22",X"99",X"4A",X"3E",X"23", + X"06",X"01",X"FF",X"2A",X"D8",X"49",X"7D",X"B4",X"CA",X"73",X"0C",X"2B",X"22",X"D8",X"49",X"3A", + X"98",X"4A",X"B7",X"28",X"E9",X"06",X"08",X"C5",X"2A",X"99",X"4A",X"7E",X"CB",X"7F",X"20",X"2C", + X"CB",X"5F",X"20",X"28",X"FE",X"20",X"30",X"24",X"F5",X"11",X"68",X"48",X"B7",X"ED",X"52",X"7D", + X"CD",X"EA",X"91",X"CD",X"1E",X"92",X"CD",X"83",X"26",X"30",X"03",X"F1",X"18",X"0E",X"F1",X"E5", + X"E6",X"07",X"CD",X"76",X"95",X"E1",X"01",X"02",X"02",X"CD",X"5C",X"90",X"C1",X"2A",X"99",X"4A", + X"23",X"22",X"99",X"4A",X"3A",X"98",X"4A",X"3D",X"32",X"98",X"4A",X"CA",X"0E",X"0C",X"10",X"B7", + X"C3",X"0E",X"0C",X"21",X"01",X"48",X"CB",X"56",X"CB",X"96",X"3E",X"90",X"32",X"98",X"4A",X"21", + X"68",X"48",X"22",X"99",X"4A",X"3E",X"23",X"06",X"01",X"FF",X"3A",X"98",X"4A",X"B7",X"CA",X"D3", + X"0C",X"06",X"08",X"C5",X"2A",X"99",X"4A",X"3E",X"88",X"A6",X"20",X"20",X"7E",X"FE",X"20",X"30", + X"1B",X"11",X"68",X"48",X"B7",X"ED",X"52",X"7D",X"CD",X"EA",X"91",X"CD",X"1E",X"92",X"CD",X"83", + X"26",X"38",X"09",X"AF",X"1E",X"16",X"01",X"02",X"02",X"CD",X"0C",X"90",X"C1",X"2A",X"99",X"4A", + X"23",X"22",X"99",X"4A",X"3A",X"98",X"4A",X"3D",X"32",X"98",X"4A",X"CA",X"D3",X"0C",X"10",X"C3", + X"C3",X"85",X"0C",X"3E",X"60",X"FF",X"21",X"01",X"48",X"CB",X"56",X"CB",X"D6",X"21",X"FB",X"0C", + X"3A",X"AA",X"49",X"FE",X"0A",X"38",X"02",X"3E",X"0A",X"3D",X"CD",X"1D",X"94",X"ED",X"53",X"D8", + X"49",X"3E",X"13",X"FF",X"3E",X"03",X"01",X"00",X"0C",X"FF",X"C9",X"F0",X"00",X"B4",X"00",X"80", + X"00",X"B4",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"A0",X"4E",X"CD",X"3E",X"0E",X"3A",X"A6",X"49",X"CB",X"6F",X"28",X"02",X"1E",X"78",X"16", + X"3C",X"3E",X"23",X"06",X"01",X"FF",X"3A",X"01",X"48",X"E6",X"03",X"20",X"F4",X"CD",X"42",X"0D", + X"18",X"EF",X"15",X"20",X"09",X"16",X"3C",X"2A",X"94",X"49",X"23",X"22",X"94",X"49",X"1D",X"C0", + X"3A",X"A6",X"49",X"CB",X"6F",X"C2",X"D0",X"0D",X"CD",X"3E",X"0E",X"D5",X"21",X"C3",X"0D",X"11", + X"93",X"49",X"06",X"06",X"CD",X"EF",X"8F",X"1E",X"02",X"3A",X"A6",X"49",X"CB",X"67",X"20",X"28", + X"21",X"CA",X"0D",X"11",X"8E",X"49",X"06",X"06",X"CD",X"80",X"90",X"1E",X"05",X"FE",X"01",X"20", + X"17",X"21",X"A6",X"49",X"CB",X"66",X"CB",X"E6",X"2A",X"39",X"48",X"11",X"83",X"A0",X"B7",X"ED", + X"52",X"28",X"05",X"3E",X"1C",X"CD",X"40",X"03",X"21",X"FC",X"42",X"DD",X"21",X"8E",X"49",X"06", + X"06",X"0E",X"00",X"CD",X"1E",X"90",X"21",X"C4",X"0D",X"11",X"8E",X"49",X"06",X"06",X"CD",X"80", + X"90",X"D1",X"FE",X"00",X"C0",X"3A",X"A6",X"49",X"CB",X"EF",X"32",X"A6",X"49",X"C9",X"00",X"00", + X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"00",X"00", + X"1E",X"78",X"D5",X"21",X"73",X"48",X"16",X"00",X"3A",X"96",X"49",X"5F",X"B7",X"ED",X"52",X"E5", + X"06",X"0C",X"11",X"0C",X"00",X"CB",X"5E",X"20",X"31",X"19",X"10",X"F9",X"E1",X"E5",X"06",X"0C", + X"CB",X"DE",X"19",X"10",X"FB",X"E1",X"B7",X"11",X"68",X"48",X"ED",X"52",X"7D",X"CD",X"EA",X"91", + X"CD",X"1E",X"92",X"06",X"01",X"CD",X"1F",X"0E",X"3A",X"36",X"48",X"CB",X"7F",X"20",X"05",X"3E", + X"09",X"CD",X"40",X"03",X"21",X"96",X"49",X"34",X"D1",X"C9",X"E1",X"D1",X"1E",X"01",X"C9",X"E5", + X"C5",X"06",X"0C",X"E5",X"C5",X"01",X"02",X"02",X"3E",X"88",X"1E",X"03",X"CD",X"5C",X"90",X"C1", + X"E1",X"11",X"40",X"00",X"19",X"10",X"EC",X"C1",X"E1",X"2B",X"2B",X"10",X"E2",X"C9",X"D5",X"3A", + X"AA",X"49",X"FE",X"05",X"38",X"02",X"3E",X"05",X"3D",X"21",X"53",X"0E",X"16",X"00",X"5F",X"19", + X"D1",X"5E",X"C9",X"09",X"08",X"08",X"08",X"08",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"E0",X"4D",X"3A",X"AB",X"49",X"21",X"0F",X"0F",X"CD",X"10",X"94",X"11",X"8E",X"49",X"01", + X"06",X"00",X"ED",X"B0",X"CD",X"FC",X"0E",X"3E",X"23",X"06",X"01",X"FF",X"15",X"20",X"F8",X"21", + X"BE",X"0E",X"3A",X"AB",X"49",X"CD",X"1D",X"94",X"EB",X"11",X"93",X"49",X"06",X"06",X"CD",X"EF", + X"8F",X"21",X"FC",X"42",X"DD",X"21",X"8E",X"49",X"1E",X"05",X"06",X"06",X"0E",X"00",X"CD",X"1E", + X"90",X"21",X"F6",X"0E",X"11",X"8E",X"49",X"06",X"06",X"CD",X"80",X"90",X"FE",X"00",X"28",X"02", + X"18",X"C2",X"3E",X"11",X"FF",X"3E",X"01",X"01",X"0F",X"1D",X"FF",X"3E",X"60",X"FF",X"D1",X"0E", + X"D7",X"0E",X"DD",X"0E",X"E3",X"0E",X"E9",X"0E",X"EF",X"0E",X"F5",X"0E",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00", + X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"00", + X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3A",X"AB",X"49",X"21", + X"08",X"0F",X"16",X"00",X"5F",X"19",X"56",X"C9",X"03",X"03",X"03",X"03",X"03",X"02",X"03",X"00", + X"00",X"06",X"00",X"00",X"00",X"00",X"00",X"07",X"00",X"00",X"00",X"00",X"00",X"07",X"00",X"00", + X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"00", + X"00",X"00",X"00",X"00",X"01",X"05",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"5E",X"0F",X"D7",X"0F",X"38",X"10",X"B1",X"10",X"1E",X"11",X"9D",X"11",X"4C",X"12",X"14",X"40", + X"04",X"02",X"09",X"C6",X"40",X"40",X"04",X"02",X"09",X"C6",X"42",X"40",X"04",X"02",X"04",X"04", + X"41",X"40",X"04",X"02",X"04",X"84",X"42",X"40",X"04",X"0E",X"02",X"0D",X"41",X"40",X"04",X"0A", + X"02",X"44",X"41",X"40",X"03",X"02",X"0C",X"4A",X"41",X"40",X"03",X"02",X"0C",X"4A",X"42",X"40", + X"03",X"06",X"02",X"8A",X"41",X"40",X"03",X"06",X"02",X"94",X"41",X"40",X"00",X"02",X"03",X"C1", + X"41",X"40",X"00",X"02",X"02",X"D6",X"41",X"40",X"00",X"02",X"04",X"C6",X"41",X"40",X"00",X"02", + X"01",X"CC",X"41",X"40",X"00",X"02",X"02",X"CF",X"41",X"40",X"04",X"02",X"02",X"4D",X"42",X"80", + X"04",X"01",X"01",X"A7",X"41",X"81",X"04",X"01",X"01",X"8B",X"42",X"82",X"04",X"01",X"01",X"2B", + X"41",X"83",X"04",X"01",X"01",X"16",X"42",X"10",X"40",X"00",X"02",X"02",X"D6",X"41",X"40",X"00", + X"02",X"02",X"CB",X"41",X"40",X"00",X"02",X"03",X"C1",X"41",X"40",X"14",X"0E",X"02",X"04",X"41", + X"40",X"14",X"02",X"09",X"06",X"41",X"40",X"14",X"0E",X"02",X"0D",X"41",X"40",X"14",X"02",X"07", + X"86",X"42",X"40",X"05",X"02",X"02",X"4B",X"41",X"40",X"05",X"0A",X"02",X"49",X"41",X"40",X"05", + X"02",X"0B",X"4B",X"42",X"40",X"05",X"0A",X"02",X"54",X"41",X"40",X"05",X"02",X"05",X"4F",X"41", + X"80",X"04",X"01",X"01",X"0C",X"42",X"81",X"04",X"01",X"01",X"CE",X"42",X"82",X"04",X"01",X"01", + X"EE",X"40",X"83",X"04",X"01",X"01",X"B6",X"41",X"14",X"40",X"00",X"02",X"02",X"D6",X"41",X"40", + X"00",X"02",X"02",X"C8",X"41",X"40",X"00",X"02",X"03",X"C1",X"41",X"40",X"03",X"06",X"06",X"90", + X"41",X"40",X"04",X"06",X"02",X"D2",X"41",X"40",X"04",X"02",X"0A",X"4A",X"41",X"40",X"14",X"02", + X"07",X"06",X"42",X"40",X"14",X"0A",X"02",X"C6",X"40",X"40",X"14",X"02",X"07",X"C8",X"40",X"40", + X"14",X"08",X"02",X"0D",X"41",X"40",X"04",X"02",X"0A",X"4A",X"42",X"40",X"05",X"02",X"09",X"84", + X"41",X"40",X"05",X"0A",X"02",X"C4",X"41",X"40",X"05",X"02",X"09",X"C6",X"42",X"40",X"05",X"06", + X"02",X"0D",X"42",X"40",X"04",X"08",X"02",X"8A",X"41",X"80",X"04",X"01",X"01",X"65",X"41",X"81", + X"04",X"01",X"01",X"8B",X"42",X"82",X"04",X"01",X"01",X"AA",X"40",X"83",X"04",X"01",X"01",X"16", + X"42",X"12",X"40",X"03",X"06",X"06",X"D0",X"41",X"40",X"04",X"06",X"06",X"4E",X"41",X"40",X"03", + X"02",X"02",X"D0",X"41",X"40",X"02",X"06",X"06",X"C8",X"40",X"40",X"05",X"06",X"06",X"C8",X"41", + X"40",X"03",X"0A",X"06",X"44",X"41",X"40",X"05",X"03",X"02",X"C8",X"41",X"40",X"00",X"02",X"02", + X"12",X"42",X"40",X"00",X"02",X"02",X"90",X"41",X"40",X"00",X"02",X"02",X"0A",X"41",X"40",X"00", + X"02",X"02",X"0A",X"42",X"40",X"00",X"06",X"02",X"86",X"41",X"40",X"00",X"02",X"02",X"D6",X"41", + X"40",X"00",X"02",X"03",X"C1",X"41",X"80",X"04",X"01",X"01",X"25",X"41",X"81",X"04",X"01",X"01", + X"8D",X"42",X"82",X"04",X"01",X"01",X"AD",X"40",X"83",X"04",X"01",X"01",X"B5",X"41",X"15",X"40", + X"03",X"10",X"02",X"94",X"40",X"40",X"03",X"10",X"02",X"91",X"40",X"40",X"03",X"10",X"02",X"8E", + X"40",X"40",X"03",X"16",X"02",X"8A",X"40",X"40",X"03",X"18",X"02",X"87",X"40",X"40",X"03",X"14", + X"02",X"04",X"41",X"40",X"00",X"02",X"02",X"D6",X"41",X"40",X"00",X"02",X"01",X"53",X"41",X"40", + X"00",X"02",X"01",X"53",X"42",X"40",X"00",X"02",X"01",X"D0",X"40",X"40",X"00",X"02",X"01",X"D0", + X"41",X"40",X"00",X"02",X"02",X"4C",X"41",X"40",X"00",X"02",X"01",X"C9",X"41",X"40",X"00",X"02", + X"01",X"C9",X"42",X"40",X"00",X"02",X"01",X"46",X"41",X"40",X"00",X"02",X"01",X"46",X"42",X"40", + X"00",X"02",X"03",X"C1",X"41",X"80",X"04",X"01",X"01",X"86",X"42",X"81",X"04",X"01",X"01",X"2C", + X"41",X"82",X"04",X"01",X"01",X"6F",X"40",X"83",X"04",X"01",X"01",X"16",X"42",X"1D",X"FF",X"0E", + X"14",X"02",X"03",X"41",X"FF",X"0E",X"10",X"02",X"46",X"41",X"FF",X"0E",X"0E",X"02",X"09",X"41", + X"FF",X"0E",X"0E",X"02",X"CC",X"40",X"FF",X"0E",X"0E",X"02",X"8F",X"40",X"FF",X"0E",X"0C",X"02", + X"12",X"41",X"FE",X"0E",X"02",X"01",X"04",X"41",X"FE",X"0E",X"02",X"01",X"44",X"43",X"FE",X"0E", + X"02",X"01",X"47",X"41",X"FE",X"0E",X"02",X"01",X"07",X"43",X"FE",X"0E",X"02",X"01",X"0A",X"41", + X"FE",X"0E",X"02",X"01",X"8A",X"42",X"FE",X"0E",X"02",X"01",X"CD",X"40",X"FE",X"0E",X"02",X"01", + X"4D",X"42",X"FE",X"0E",X"02",X"01",X"90",X"40",X"FE",X"0E",X"02",X"01",X"10",X"42",X"FE",X"0E", + X"02",X"01",X"13",X"41",X"FE",X"0E",X"02",X"01",X"53",X"42",X"1F",X"00",X"02",X"17",X"C1",X"41", + X"FE",X"1E",X"02",X"02",X"C3",X"41",X"FE",X"1E",X"02",X"02",X"C6",X"41",X"FE",X"1E",X"02",X"02", + X"C9",X"41",X"FE",X"1E",X"02",X"02",X"CC",X"41",X"FE",X"1E",X"02",X"02",X"CF",X"41",X"FE",X"1E", + X"02",X"02",X"D2",X"41",X"80",X"04",X"01",X"01",X"05",X"42",X"81",X"04",X"01",X"01",X"0B",X"42", + X"82",X"04",X"01",X"01",X"B1",X"41",X"83",X"04",X"01",X"01",X"15",X"42",X"1F",X"FF",X"0E",X"05", + X"01",X"81",X"42",X"FF",X"0E",X"0C",X"01",X"E2",X"41",X"FF",X"0E",X"10",X"01",X"A3",X"41",X"FF", + X"0E",X"0F",X"01",X"C4",X"41",X"FF",X"0E",X"0F",X"01",X"E5",X"41",X"FF",X"0E",X"10",X"01",X"C6", + X"41",X"FF",X"0E",X"15",X"01",X"27",X"41",X"FF",X"0E",X"14",X"01",X"28",X"41",X"FF",X"0E",X"15", + X"01",X"09",X"41",X"FF",X"0E",X"15",X"01",X"EA",X"40",X"FF",X"0E",X"15",X"01",X"CB",X"40",X"FF", + X"0E",X"15",X"01",X"AC",X"40",X"FF",X"0E",X"14",X"01",X"6D",X"40",X"FF",X"0E",X"12",X"01",X"6E", + X"40",X"FF",X"0E",X"0F",X"01",X"4F",X"40",X"FF",X"0E",X"0E",X"01",X"50",X"40",X"FF",X"0E",X"0D", + X"01",X"71",X"40",X"FF",X"0E",X"0C",X"01",X"92",X"40",X"FF",X"0E",X"0D",X"01",X"B3",X"40",X"FF", + X"0E",X"0C",X"01",X"D4",X"40",X"FF",X"0E",X"09",X"01",X"55",X"41",X"FF",X"0E",X"09",X"01",X"76", + X"41",X"FE",X"0E",X"02",X"04",X"D4",X"41",X"FE",X"0E",X"02",X"06",X"0E",X"41",X"FE",X"0E",X"02", + X"06",X"08",X"42",X"FE",X"0E",X"02",X"04",X"C4",X"42",X"FE",X"0E",X"02",X"03",X"C1",X"41",X"80", + X"04",X"01",X"01",X"06",X"43",X"81",X"04",X"01",X"01",X"EB",X"41",X"82",X"04",X"01",X"01",X"F2", + X"40",X"83",X"04",X"01",X"01",X"B6",X"41",X"1C",X"99",X"03",X"FB",X"1F",X"00",X"00",X"F9",X"1F", + X"1C",X"04",X"FD",X"1E",X"D2",X"18",X"F3",X"1F",X"1D",X"1C",X"95",X"03",X"FB",X"1F",X"00",X"00", + X"F9",X"1F",X"1C",X"05",X"1F",X"1E",X"F7",X"1F",X"F4",X"1F",X"F2",X"1E",X"1D",X"1C",X"94",X"03", + X"FB",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"05",X"1F",X"1E",X"F8",X"1F",X"F5",X"1F",X"F2",X"1E", + X"1E",X"1C",X"94",X"03",X"FB",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"05",X"1F",X"1E",X"D3",X"18", + X"F6",X"1F",X"F1",X"1E",X"F0",X"1E",X"94",X"03",X"FB",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"02", + X"1F",X"1E",X"1F",X"1E",X"97",X"03",X"FB",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"02",X"1F",X"1E", + X"1E",X"1E",X"97",X"03",X"FB",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"01",X"1F",X"1E",X"98",X"03", + X"FB",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"01",X"1F",X"1E",X"98",X"03",X"FB",X"1F",X"00",X"00", + X"F9",X"1F",X"1C",X"01",X"1F",X"1E",X"98",X"03",X"FB",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"01", + X"1F",X"1E",X"98",X"03",X"FB",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"01",X"1F",X"1E",X"98",X"03", + X"FC",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"01",X"1F",X"1E",X"97",X"04",X"1F",X"1E",X"00",X"00", + X"00",X"00",X"F9",X"1F",X"1C",X"01",X"1F",X"1E",X"97",X"04",X"1F",X"1E",X"00",X"00",X"00",X"00", + X"F9",X"1F",X"1C",X"98",X"04",X"1F",X"1E",X"00",X"00",X"00",X"00",X"F9",X"1F",X"1C",X"98",X"04", + X"1F",X"1E",X"00",X"00",X"00",X"00",X"F9",X"1F",X"1C",X"98",X"04",X"1F",X"1E",X"00",X"00",X"00", + X"00",X"F9",X"1F",X"1C",X"98",X"04",X"1F",X"1E",X"00",X"00",X"00",X"00",X"F9",X"1F",X"1C",X"97", + X"05",X"FD",X"1E",X"1F",X"1E",X"00",X"00",X"00",X"00",X"F9",X"1F",X"1C",X"90",X"0C",X"FD",X"1E", + X"1F",X"1E",X"1F",X"1E",X"1F",X"1E",X"1F",X"1E",X"1F",X"1E",X"1F",X"1E",X"1F",X"1E",X"1E",X"1E", + X"FA",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"90",X"02",X"1F",X"1E",X"1E",X"1E",X"87",X"03",X"FB", + X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"90",X"0C",X"1F",X"1E",X"00",X"00",X"5F",X"19",X"3E",X"1B", + X"5F",X"1B",X"2E",X"1C",X"1D",X"1B",X"00",X"00",X"00",X"00",X"FB",X"1F",X"00",X"00",X"F9",X"1F", + X"1C",X"90",X"0C",X"1F",X"1E",X"00",X"00",X"5E",X"19",X"3F",X"1B",X"5E",X"1B",X"3D",X"1C",X"1E", + X"1B",X"00",X"00",X"00",X"00",X"FB",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"90",X"0C",X"1F",X"1E", + X"00",X"00",X"5F",X"19",X"5F",X"1B",X"3E",X"1B",X"2E",X"1C",X"2E",X"1C",X"1D",X"1B",X"00",X"00", + X"FB",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"90",X"0C",X"1F",X"1E",X"5F",X"1D",X"D2",X"1A",X"D0", + X"1D",X"3F",X"1B",X"2F",X"1C",X"2F",X"1C",X"1F",X"1B",X"1D",X"1B",X"FB",X"1F",X"00",X"00",X"F9", + X"1F",X"1C",X"90",X"0C",X"5E",X"1D",X"5E",X"1D",X"D3",X"1A",X"D1",X"1D",X"3E",X"1B",X"2F",X"1C", + X"2F",X"1C",X"1F",X"1B",X"1E",X"1B",X"FB",X"1F",X"00",X"00",X"F9",X"1F",X"1C",X"92",X"0A",X"5E", + X"19",X"5E",X"1B",X"3F",X"1B",X"3D",X"1C",X"3D",X"1C",X"1E",X"1B",X"00",X"00",X"FB",X"1F",X"00", + X"00",X"F9",X"1F",X"1C",X"99",X"03",X"FB",X"1F",X"00",X"00",X"F9",X"1F",X"00",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3A",X"A4",X"49",X"B7",X"20",X"45",X"3A",X"80",X"50",X"2F",X"E6",X"0C",X"28",X"31",X"CB",X"3F", + X"CB",X"3F",X"3D",X"21",X"22",X"91",X"CD",X"1D",X"94",X"EB",X"3A",X"A6",X"49",X"FE",X"04",X"30", + X"1E",X"CD",X"10",X"94",X"E5",X"DD",X"E1",X"21",X"38",X"41",X"1E",X"17",X"06",X"06",X"0E",X"00", + X"CD",X"1E",X"90",X"DD",X"21",X"FE",X"15",X"CD",X"0A",X"8F",X"3E",X"23",X"06",X"10",X"FF",X"DD", + X"21",X"C2",X"15",X"CD",X"0A",X"8F",X"3E",X"23",X"06",X"10",X"FF",X"21",X"00",X"4B",X"06",X"06", + X"CF",X"3E",X"01",X"32",X"01",X"4B",X"11",X"05",X"4B",X"21",X"8D",X"49",X"06",X"06",X"CD",X"EF", + X"8F",X"0E",X"00",X"06",X"05",X"11",X"01",X"4B",X"DD",X"21",X"89",X"40",X"D5",X"DD",X"E5",X"1A", + X"B9",X"28",X"40",X"C5",X"F5",X"3E",X"1B",X"CD",X"40",X"03",X"F1",X"C1",X"0E",X"FF",X"C5",X"21", + X"1B",X"16",X"CD",X"1D",X"94",X"EB",X"01",X"03",X"07",X"C5",X"DD",X"E5",X"7E",X"23",X"DD",X"77", + X"00",X"DD",X"E5",X"11",X"00",X"04",X"DD",X"19",X"DD",X"36",X"00",X"05",X"DD",X"E1",X"DD",X"23", + X"10",X"EA",X"3E",X"23",X"06",X"03",X"FF",X"DD",X"E1",X"11",X"20",X"00",X"DD",X"19",X"C1",X"0D", + X"20",X"D7",X"C1",X"DD",X"E1",X"11",X"A0",X"00",X"DD",X"19",X"D1",X"13",X"05",X"C2",X"5C",X"15", + X"3A",X"A4",X"49",X"B7",X"DD",X"21",X"E2",X"15",X"28",X"04",X"DD",X"21",X"EF",X"15",X"CD",X"0A", + X"8F",X"C9",X"00",X"0D",X"55",X"41",X"00",X"04",X"59",X"4F",X"55",X"52",X"20",X"50",X"52",X"45", + X"53",X"53",X"49",X"4E",X"47",X"07",X"B3",X"41",X"00",X"04",X"47",X"4F",X"41",X"4C",X"20",X"49", + X"53",X"00",X"00",X"06",X"E6",X"42",X"00",X"04",X"50",X"4F",X"49",X"4E",X"54",X"53",X"00",X"00", + X"08",X"66",X"42",X"00",X"04",X"54",X"4F",X"20",X"53",X"43",X"4F",X"52",X"45",X"00",X"00",X"0B", + X"5A",X"41",X"00",X"00",X"42",X"4F",X"4E",X"55",X"53",X"20",X"4C",X"49",X"56",X"45",X"53",X"06", + X"18",X"42",X"00",X"00",X"50",X"4F",X"49",X"4E",X"54",X"53",X"00",X"2F",X"16",X"44",X"16",X"59", + X"16",X"6E",X"16",X"83",X"16",X"98",X"16",X"AD",X"16",X"C2",X"16",X"D7",X"16",X"EC",X"16",X"1F", + X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"00",X"00",X"00",X"00",X"00",X"1F",X"1F",X"1F",X"1F", + X"1F",X"1F",X"1F",X"1F",X"1F",X"00",X"00",X"00",X"00",X"00",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"1F",X"1F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"1F",X"1F",X"00",X"00",X"1F",X"1F", + X"1F",X"00",X"1F",X"00",X"00",X"00",X"1F",X"1F",X"00",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"00", + X"00",X"1F",X"00",X"00",X"1F",X"1F",X"00",X"00",X"1F",X"00",X"00",X"1F",X"1F",X"1F",X"1F",X"1F", + X"1F",X"1F",X"1F",X"00",X"00",X"00",X"1F",X"1F",X"1F",X"1F",X"00",X"00",X"00",X"1F",X"00",X"00", + X"00",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"00",X"00",X"1F",X"1F",X"1F",X"1F",X"1F", + X"00",X"00",X"1F",X"00",X"00",X"1F",X"1F",X"1F",X"1F",X"1F",X"00",X"00",X"1F",X"1F",X"1F",X"1F", + X"1F",X"1F",X"1F",X"1F",X"1F",X"00",X"00",X"1F",X"00",X"00",X"1F",X"1F",X"1F",X"1F",X"1F",X"00", + X"00",X"1F",X"00",X"00",X"00",X"00",X"1F",X"1F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"1F", + X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"00", + X"00",X"1F",X"00",X"00",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"00",X"00",X"1F", + X"1F",X"1F",X"1F",X"1F",X"00",X"00",X"1F",X"00",X"00",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"11",X"0E",X"48",X"3A",X"01",X"48",X"CB",X"6F",X"28",X"03",X"11",X"14",X"48",X"06",X"1E",X"21", + X"00",X"4C",X"0E",X"01",X"C5",X"E5",X"D5",X"06",X"06",X"CD",X"80",X"90",X"D1",X"E1",X"C1",X"FE", + X"02",X"28",X"0A",X"C5",X"01",X"08",X"00",X"09",X"C1",X"0C",X"10",X"E8",X"C9",X"79",X"F5",X"FE", + X"1E",X"28",X"19",X"3E",X"1E",X"91",X"21",X"08",X"00",X"3D",X"28",X"06",X"01",X"08",X"00",X"09", + X"18",X"F7",X"E5",X"C1",X"21",X"E7",X"4C",X"11",X"EF",X"4C",X"ED",X"B8",X"F1",X"F5",X"3D",X"21", + X"00",X"4C",X"4F",X"87",X"87",X"87",X"06",X"00",X"4F",X"09",X"11",X"0E",X"48",X"3A",X"01",X"48", + X"CB",X"6F",X"28",X"03",X"11",X"14",X"48",X"EB",X"01",X"06",X"00",X"ED",X"B0",X"EB",X"3A",X"A8", + X"49",X"77",X"23",X"3A",X"A9",X"49",X"77",X"DD",X"21",X"5E",X"18",X"CD",X"0A",X"8F",X"DD",X"21", + X"7D",X"18",X"CD",X"0A",X"8F",X"3E",X"23",X"06",X"30",X"FF",X"F1",X"F5",X"21",X"00",X"01",X"22", + X"00",X"4B",X"21",X"00",X"4C",X"FE",X"0B",X"38",X"14",X"11",X"50",X"00",X"19",X"D6",X"0A",X"E5", + X"2A",X"00",X"4B",X"11",X"01",X"00",X"19",X"22",X"00",X"4B",X"E1",X"18",X"E8",X"CD",X"FA",X"17", + X"F1",X"FE",X"0B",X"38",X"04",X"D6",X"0A",X"18",X"F8",X"21",X"D6",X"44",X"3D",X"28",X"04",X"2B", + X"2B",X"18",X"F9",X"06",X"0A",X"C5",X"E5",X"06",X"13",X"36",X"05",X"CD",X"79",X"90",X"10",X"F9", + X"3E",X"23",X"06",X"10",X"FF",X"E1",X"E5",X"06",X"13",X"36",X"02",X"CD",X"79",X"90",X"10",X"F9", + X"3E",X"23",X"06",X"08",X"FF",X"E1",X"C1",X"10",X"DC",X"C9",X"E5",X"DD",X"E1",X"21",X"F6",X"40", + X"06",X"0A",X"C5",X"DD",X"E5",X"E5",X"DD",X"21",X"00",X"4B",X"1E",X"04",X"06",X"02",X"0E",X"00", + X"CD",X"1E",X"90",X"E1",X"DD",X"E1",X"DD",X"E5",X"E5",X"01",X"C0",X"00",X"09",X"1E",X"17",X"06", + X"06",X"0E",X"00",X"CD",X"1E",X"90",X"E1",X"DD",X"E1",X"DD",X"E5",X"E5",X"01",X"00",X"02",X"09", + X"01",X"06",X"00",X"DD",X"09",X"1E",X"00",X"06",X"02",X"0E",X"00",X"CD",X"1E",X"90",X"3E",X"23", + X"06",X"02",X"FF",X"11",X"01",X"4B",X"21",X"5D",X"18",X"06",X"02",X"CD",X"DA",X"8F",X"E1",X"DD", + X"E1",X"2B",X"2B",X"01",X"08",X"00",X"DD",X"09",X"C1",X"10",X"A7",X"C9",X"00",X"01",X"00",X"18", + X"9C",X"40",X"00",X"05",X"54",X"4F",X"44",X"41",X"59",X"3C",X"53",X"20",X"48",X"49",X"3B",X"53", + X"43",X"4F",X"52",X"45",X"20",X"42",X"45",X"53",X"54",X"20",X"33",X"30",X"00",X"00",X"05",X"D8", + X"40",X"00",X"04",X"4F",X"52",X"44",X"45",X"52",X"05",X"D8",X"41",X"00",X"17",X"53",X"43",X"4F", + X"52",X"45",X"05",X"D8",X"42",X"00",X"00",X"52",X"4F",X"55",X"4E",X"44",X"00",X"FF",X"FF",X"FF", + X"31",X"60",X"4F",X"3A",X"01",X"48",X"CB",X"7F",X"20",X"0F",X"3E",X"05",X"32",X"AB",X"49",X"AF", + X"32",X"E0",X"4A",X"21",X"39",X"1F",X"22",X"E2",X"4A",X"3E",X"1E",X"CD",X"40",X"03",X"DD",X"21", + X"2E",X"1F",X"CD",X"0A",X"8F",X"DD",X"21",X"16",X"1F",X"CD",X"0A",X"8F",X"3A",X"AB",X"49",X"3C", + X"C6",X"30",X"21",X"52",X"42",X"77",X"CB",X"D4",X"36",X"17",X"3E",X"23",X"06",X"40",X"FF",X"CD", + X"5B",X"35",X"21",X"50",X"0F",X"3A",X"AB",X"49",X"CD",X"1D",X"94",X"D5",X"FD",X"E1",X"FD",X"46", + X"00",X"FD",X"23",X"C5",X"FD",X"7E",X"00",X"FD",X"23",X"FD",X"5E",X"00",X"FD",X"23",X"FD",X"4E", + X"00",X"FD",X"23",X"FD",X"46",X"00",X"FD",X"23",X"FD",X"6E",X"00",X"FD",X"23",X"FD",X"66",X"00", + X"FD",X"23",X"CD",X"4A",X"90",X"C1",X"10",X"DB",X"21",X"40",X"40",X"FD",X"21",X"07",X"13",X"FD", + X"7E",X"00",X"FD",X"23",X"B7",X"28",X"37",X"4F",X"FD",X"46",X"00",X"FD",X"23",X"CB",X"78",X"CB", + X"B8",X"20",X"18",X"FD",X"7E",X"00",X"FD",X"23",X"FD",X"5E",X"00",X"FD",X"23",X"77",X"CB",X"D4", + X"73",X"CB",X"94",X"23",X"0D",X"28",X"0C",X"10",X"EA",X"18",X"DD",X"23",X"0D",X"28",X"04",X"10", + X"FA",X"18",X"D5",X"7D",X"E6",X"E0",X"6F",X"11",X"20",X"00",X"19",X"C3",X"1F",X"19",X"3E",X"04", + X"01",X"00",X"96",X"FF",X"3E",X"02",X"01",X"00",X"0B",X"FF",X"21",X"FE",X"1E",X"11",X"00",X"4B", + X"01",X"18",X"00",X"ED",X"B0",X"3A",X"AB",X"49",X"21",X"1D",X"1E",X"CD",X"16",X"94",X"11",X"02", + X"4B",X"01",X"04",X"00",X"ED",X"B0",X"21",X"E0",X"49",X"06",X"20",X"CF",X"FD",X"21",X"E0",X"49", + X"DD",X"21",X"40",X"48",X"DD",X"36",X"01",X"0E",X"DD",X"36",X"02",X"80",X"DD",X"36",X"03",X"81", + X"DD",X"36",X"04",X"F8",X"FD",X"36",X"02",X"D6",X"FD",X"36",X"03",X"D6",X"3E",X"17",X"CD",X"40", + X"03",X"3E",X"03",X"01",X"60",X"0E",X"FF",X"DD",X"36",X"00",X"00",X"3E",X"23",X"06",X"02",X"FF", + X"CD",X"A1",X"1E",X"3E",X"50",X"DD",X"BE",X"04",X"D2",X"78",X"1B",X"3A",X"1A",X"48",X"E6",X"01", + X"C4",X"6C",X"1A",X"CD",X"39",X"1E",X"30",X"DF",X"CD",X"66",X"2E",X"CD",X"24",X"94",X"21",X"1C", + X"1A",X"16",X"00",X"5F",X"19",X"7E",X"47",X"FE",X"02",X"20",X"0B",X"3E",X"F8",X"DD",X"BE",X"04", + X"78",X"20",X"03",X"3E",X"04",X"47",X"FD",X"BE",X"01",X"CA",X"3C",X"1A",X"DD",X"7E",X"02",X"E6", + X"07",X"C2",X"3C",X"1A",X"DD",X"7E",X"04",X"E6",X"07",X"C2",X"3C",X"1A",X"78",X"FE",X"04",X"20", + X"10",X"DD",X"36",X"01",X"0E",X"FD",X"36",X"01",X"04",X"C3",X"B7",X"19",X"00",X"03",X"01",X"02", + X"04",X"C5",X"CD",X"A5",X"1A",X"C1",X"C2",X"3C",X"1A",X"FD",X"70",X"01",X"78",X"21",X"74",X"1B", + X"16",X"00",X"5F",X"19",X"7E",X"DD",X"77",X"01",X"FD",X"36",X"04",X"00",X"DD",X"7E",X"02",X"E6", + X"07",X"C2",X"55",X"1A",X"DD",X"7E",X"04",X"E6",X"07",X"C2",X"55",X"1A",X"FD",X"7E",X"01",X"CD", + X"A5",X"1A",X"C2",X"5F",X"1A",X"3E",X"04",X"FD",X"BE",X"01",X"28",X"03",X"CD",X"F8",X"2D",X"3E", + X"04",X"FD",X"BE",X"01",X"28",X"03",X"CD",X"49",X"2E",X"C3",X"B7",X"19",X"DD",X"7E",X"02",X"C6", + X"F4",X"5F",X"C6",X"18",X"57",X"DD",X"7E",X"04",X"C6",X"F4",X"6F",X"C6",X"18",X"67",X"DD",X"E5", + X"DD",X"21",X"45",X"48",X"06",X"06",X"DD",X"7E",X"02",X"BB",X"38",X"0D",X"BA",X"30",X"0A",X"DD", + X"7E",X"04",X"BD",X"38",X"04",X"BC",X"DA",X"A3",X"1C",X"C5",X"01",X"05",X"00",X"DD",X"09",X"C1", + X"10",X"E4",X"DD",X"E1",X"C9",X"F5",X"47",X"3A",X"AB",X"49",X"FE",X"06",X"20",X"1E",X"CB",X"40", + X"28",X"1A",X"DD",X"7E",X"04",X"FE",X"E0",X"CA",X"CC",X"1A",X"FE",X"C0",X"CA",X"CC",X"1A",X"FE", + X"90",X"CA",X"CC",X"1A",X"FE",X"60",X"CA",X"CC",X"1A",X"B7",X"F1",X"C9",X"3A",X"AB",X"49",X"21", + X"2C",X"1B",X"FE",X"05",X"38",X"0A",X"21",X"44",X"1B",X"FE",X"05",X"28",X"03",X"21",X"5C",X"1B", + X"F1",X"CD",X"10",X"94",X"4E",X"23",X"46",X"23",X"5E",X"23",X"56",X"23",X"E5",X"D5",X"C5",X"DD", + X"66",X"02",X"DD",X"6E",X"04",X"CD",X"1E",X"92",X"C1",X"D1",X"19",X"3A",X"AB",X"49",X"FE",X"05", + X"38",X"18",X"3E",X"00",X"E5",X"B6",X"23",X"10",X"FC",X"E1",X"0D",X"28",X"05",X"11",X"20",X"00", + X"19",X"B6",X"E1",X"47",X"AE",X"C8",X"23",X"78",X"AE",X"C9",X"3E",X"FF",X"E5",X"A6",X"23",X"10", + X"FC",X"E1",X"0D",X"28",X"ED",X"11",X"20",X"00",X"19",X"A6",X"18",X"E6",X"02",X"01",X"02",X"00", + X"40",X"40",X"01",X"02",X"40",X"00",X"40",X"40",X"02",X"01",X"FF",X"FF",X"40",X"40",X"01",X"02", + X"E0",X"FF",X"40",X"40",X"02",X"01",X"00",X"00",X"1F",X"FE",X"01",X"02",X"40",X"00",X"1F",X"FE", + X"02",X"01",X"FF",X"FF",X"1F",X"FE",X"01",X"02",X"E0",X"FF",X"1F",X"FE",X"02",X"01",X"00",X"00", + X"FE",X"FE",X"01",X"02",X"40",X"00",X"FE",X"FF",X"02",X"01",X"FF",X"FF",X"FE",X"FE",X"01",X"02", + X"E0",X"FF",X"FE",X"FF",X"0C",X"08",X"0A",X"88",X"3E",X"13",X"FF",X"3E",X"23",X"06",X"02",X"FF", + X"CD",X"A1",X"1E",X"3E",X"38",X"DD",X"BE",X"04",X"28",X"0E",X"CD",X"39",X"1E",X"30",X"EC",X"CD", + X"76",X"1E",X"DD",X"36",X"00",X"00",X"18",X"E3",X"3E",X"23",X"06",X"02",X"FF",X"3E",X"90",X"DD", + X"BE",X"02",X"28",X"0E",X"CD",X"39",X"1E",X"30",X"EF",X"CD",X"8E",X"1E",X"DD",X"36",X"00",X"00", + X"18",X"E6",X"DD",X"36",X"01",X"32",X"DD",X"36",X"00",X"00",X"3E",X"23",X"06",X"01",X"FF",X"3A", + X"65",X"48",X"FE",X"A0",X"20",X"F4",X"3E",X"80",X"CD",X"40",X"03",X"3E",X"12",X"FF",X"3E",X"14", + X"FF",X"21",X"45",X"48",X"06",X"1E",X"CF",X"11",X"45",X"48",X"21",X"9E",X"1C",X"01",X"05",X"00", + X"ED",X"B0",X"11",X"E1",X"49",X"21",X"4E",X"1E",X"01",X"28",X"00",X"ED",X"B0",X"3E",X"80",X"32", + X"E0",X"49",X"3E",X"0A",X"CD",X"40",X"03",X"3E",X"23",X"06",X"02",X"FF",X"3A",X"22",X"48",X"CB", + X"7F",X"CA",X"53",X"1D",X"FD",X"21",X"E0",X"49",X"FD",X"7E",X"00",X"B7",X"CA",X"53",X"1D",X"FD", + X"35",X"00",X"FD",X"23",X"06",X"08",X"C5",X"FD",X"7E",X"02",X"B7",X"28",X"3A",X"FD",X"35",X"02", + X"11",X"05",X"00",X"FD",X"19",X"C1",X"10",X"EE",X"FD",X"7E",X"00",X"CB",X"BF",X"B7",X"20",X"21", + X"3E",X"00",X"FD",X"CB",X"00",X"7E",X"FD",X"CB",X"00",X"BE",X"20",X"06",X"FD",X"CB",X"00",X"FE", + X"3E",X"1F",X"32",X"46",X"48",X"AF",X"32",X"45",X"48",X"3E",X"0C",X"FD",X"B6",X"00",X"FD",X"77", + X"00",X"FD",X"35",X"00",X"C3",X"F7",X"1B",X"FD",X"7E",X"03",X"CB",X"BF",X"FD",X"77",X"02",X"FD", + X"7E",X"04",X"FD",X"CB",X"03",X"7E",X"28",X"12",X"FE",X"19",X"28",X"12",X"FD",X"CB",X"03",X"FE", + X"D6",X"04",X"FE",X"1D",X"20",X"14",X"D6",X"04",X"18",X"10",X"FE",X"25",X"28",X"EE",X"FD",X"CB", + X"03",X"BE",X"C6",X"04",X"FE",X"1D",X"20",X"02",X"C6",X"04",X"FD",X"77",X"04",X"FD",X"6E",X"00", + X"FD",X"66",X"01",X"1E",X"0D",X"01",X"02",X"02",X"CD",X"5C",X"90",X"C3",X"20",X"1C",X"00",X"1F", + X"98",X"10",X"30",X"3E",X"13",X"FF",X"3E",X"14",X"FF",X"21",X"45",X"48",X"06",X"1E",X"CF",X"3E", + X"80",X"CD",X"40",X"03",X"DD",X"21",X"40",X"48",X"DD",X"36",X"01",X"0F",X"3E",X"13",X"CD",X"40", + X"03",X"3E",X"23",X"06",X"01",X"FF",X"3E",X"FD",X"DD",X"BE",X"04",X"38",X"0E",X"3E",X"02",X"DD", + X"86",X"04",X"DD",X"77",X"04",X"DD",X"36",X"00",X"00",X"18",X"E6",X"21",X"8E",X"49",X"06",X"06", + X"CF",X"3E",X"14",X"CD",X"40",X"03",X"DD",X"36",X"04",X"00",X"DD",X"36",X"01",X"10",X"DD",X"36", + X"00",X"00",X"3E",X"23",X"06",X"28",X"FF",X"3E",X"14",X"CD",X"40",X"03",X"DD",X"36",X"01",X"17", + X"DD",X"36",X"00",X"00",X"3E",X"12",X"FF",X"3E",X"40",X"06",X"20",X"FF",X"3E",X"60",X"FF",X"31", + X"60",X"4F",X"3E",X"14",X"FF",X"3E",X"12",X"FF",X"3E",X"23",X"06",X"05",X"FF",X"3E",X"80",X"CD", + X"40",X"03",X"DD",X"21",X"40",X"48",X"CD",X"82",X"2A",X"21",X"8E",X"49",X"06",X"06",X"CF",X"AF", + X"5F",X"01",X"0B",X"03",X"21",X"4E",X"41",X"CD",X"4A",X"90",X"DD",X"21",X"43",X"1D",X"CD",X"0A", + X"8F",X"18",X"C1",X"00",X"09",X"6F",X"41",X"00",X"17",X"54",X"49",X"4D",X"45",X"20",X"4F",X"56", + X"45",X"52",X"00",X"21",X"00",X"40",X"01",X"00",X"04",X"7E",X"FE",X"80",X"38",X"07",X"FE",X"84", + X"30",X"03",X"CD",X"EB",X"1E",X"23",X"0B",X"79",X"B0",X"20",X"EE",X"21",X"4A",X"41",X"AF",X"5F", + X"01",X"08",X"09",X"CD",X"0C",X"90",X"FD",X"21",X"00",X"4B",X"21",X"71",X"41",X"06",X"04",X"0E", + X"00",X"C5",X"E5",X"FD",X"7E",X"00",X"B7",X"28",X"67",X"E5",X"79",X"21",X"15",X"1E",X"CD",X"1D", + X"94",X"7A",X"01",X"01",X"01",X"E1",X"E5",X"CD",X"5C",X"90",X"E1",X"11",X"20",X"00",X"19",X"FD", + X"36",X"00",X"00",X"FD",X"E5",X"DD",X"E1",X"DD",X"23",X"06",X"05",X"0E",X"00",X"1E",X"00",X"CD", + X"1E",X"90",X"06",X"06",X"3E",X"0A",X"FD",X"E5",X"FD",X"BE",X"00",X"20",X"04",X"FD",X"36",X"00", + X"00",X"FD",X"23",X"10",X"F3",X"FD",X"E1",X"FD",X"E5",X"E1",X"11",X"05",X"00",X"19",X"11",X"8D", + X"49",X"06",X"06",X"CD",X"DA",X"8F",X"21",X"BD",X"41",X"DD",X"21",X"88",X"49",X"1E",X"04",X"06", + X"06",X"0E",X"00",X"CD",X"1E",X"90",X"3E",X"23",X"06",X"08",X"FF",X"E1",X"2B",X"2B",X"18",X"01", + X"E1",X"C1",X"0C",X"11",X"06",X"00",X"FD",X"19",X"05",X"C2",X"81",X"1D",X"3A",X"AB",X"49",X"3C", + X"FE",X"07",X"38",X"01",X"AF",X"32",X"AB",X"49",X"3E",X"23",X"06",X"2D",X"FF",X"3E",X"40",X"06", + X"10",X"FF",X"3E",X"60",X"FF",X"04",X"83",X"04",X"82",X"04",X"81",X"04",X"80",X"02",X"00",X"00", + X"00",X"03",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"05",X"00",X"00",X"00",X"06",X"00",X"00", + X"00",X"07",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"2A",X"E2",X"49",X"29",X"38",X"04",X"22", + X"E2",X"49",X"C9",X"F5",X"11",X"00",X"00",X"ED",X"5A",X"22",X"E2",X"49",X"F1",X"C9",X"7A",X"40", + X"00",X"04",X"19",X"BA",X"40",X"00",X"02",X"19",X"FA",X"40",X"00",X"04",X"19",X"3A",X"41",X"00", + X"02",X"19",X"7A",X"41",X"00",X"04",X"19",X"BA",X"42",X"00",X"02",X"19",X"FA",X"42",X"00",X"04", + X"19",X"3A",X"43",X"00",X"02",X"19",X"FD",X"7E",X"01",X"E6",X"07",X"20",X"07",X"CD",X"F8",X"2D", + X"CD",X"49",X"2E",X"C9",X"DD",X"36",X"01",X"0C",X"FD",X"36",X"01",X"00",X"18",X"EF",X"FD",X"7E", + X"01",X"E6",X"07",X"FE",X"01",X"28",X"E6",X"DD",X"36",X"01",X"08",X"FD",X"36",X"01",X"01",X"18", + X"DC",X"DD",X"7E",X"02",X"67",X"E6",X"07",X"C0",X"DD",X"7E",X"04",X"6F",X"E6",X"07",X"C0",X"CD", + X"1E",X"92",X"11",X"E1",X"FF",X"19",X"0E",X"00",X"7E",X"EB",X"21",X"D1",X"1E",X"06",X"04",X"BE", + X"23",X"28",X"12",X"10",X"FA",X"0C",X"3E",X"02",X"B9",X"C8",X"EB",X"11",X"60",X"00",X"19",X"18", + X"E7",X"80",X"81",X"82",X"83",X"21",X"00",X"4B",X"4F",X"D6",X"80",X"2F",X"E6",X"03",X"D5",X"CD", + X"10",X"94",X"D1",X"36",X"01",X"EB",X"3E",X"0F",X"CD",X"40",X"03",X"3A",X"AB",X"49",X"FE",X"06", + X"3E",X"00",X"20",X"02",X"3E",X"FF",X"77",X"CB",X"D4",X"36",X"0E",X"CB",X"94",X"C9",X"00",X"0A", + X"01",X"00",X"00",X"00",X"00",X"0A",X"0A",X"08",X"00",X"00",X"00",X"0A",X"0A",X"06",X"00",X"00", + X"00",X"0A",X"0A",X"04",X"00",X"00",X"04",X"09",X"97",X"41",X"00",X"00",X"50",X"4C",X"41",X"59", + X"20",X"47",X"41",X"4D",X"45",X"03",X"D2",X"41",X"00",X"05",X"41",X"43",X"54",X"00",X"00",X"05", + X"1D",X"43",X"00",X"00",X"20",X"54",X"49",X"4D",X"45",X"00",X"0A",X"00",X"04",X"01",X"06",X"00", + X"02",X"01",X"0D",X"00",X"0D",X"01",X"05",X"00",X"04",X"01",X"05",X"00",X"03",X"01",X"0D",X"00", + X"0F",X"08",X"0F",X"00",X"28",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FD",X"21",X"80",X"4A",X"FD",X"CB",X"00",X"7E", + X"C2",X"93",X"22",X"CD",X"9A",X"2D",X"28",X"05",X"3E",X"04",X"CD",X"40",X"03",X"FD",X"CB",X"00", + X"FE",X"CD",X"A9",X"2E",X"3E",X"16",X"32",X"66",X"48",X"3A",X"E9",X"49",X"E6",X"07",X"FD",X"77", + X"02",X"FD",X"E5",X"DD",X"66",X"02",X"DD",X"6E",X"04",X"CD",X"AC",X"91",X"EB",X"21",X"68",X"48", + X"FD",X"21",X"D0",X"4A",X"06",X"90",X"7E",X"E6",X"70",X"FE",X"10",X"28",X"09",X"23",X"10",X"F6", + X"FD",X"E1",X"D1",X"C3",X"2A",X"24",X"E5",X"B7",X"ED",X"52",X"E1",X"28",X"04",X"FD",X"23",X"18", + X"EC",X"CB",X"DE",X"7E",X"E6",X"07",X"21",X"7B",X"26",X"16",X"00",X"3D",X"5F",X"19",X"5E",X"FD", + X"7E",X"00",X"FD",X"E1",X"FD",X"77",X"03",X"21",X"7F",X"26",X"06",X"00",X"4F",X"09",X"7E",X"DD", + X"66",X"02",X"DD",X"6E",X"04",X"D5",X"F5",X"CD",X"1E",X"92",X"F1",X"D1",X"01",X"02",X"02",X"CD", + X"5C",X"90",X"C9",X"FD",X"7E",X"01",X"B7",X"28",X"04",X"FD",X"35",X"01",X"C9",X"FD",X"36",X"01", + X"01",X"CD",X"C7",X"2E",X"C0",X"C1",X"21",X"01",X"48",X"CB",X"46",X"CB",X"C6",X"3E",X"23",X"06", + X"05",X"FF",X"DD",X"66",X"02",X"DD",X"6E",X"04",X"CD",X"1E",X"92",X"01",X"02",X"02",X"1E",X"16", + X"3E",X"00",X"CD",X"0C",X"90",X"FD",X"7E",X"03",X"F6",X"80",X"FD",X"77",X"00",X"FD",X"7E",X"02", + X"FD",X"77",X"06",X"FD",X"36",X"03",X"83",X"DD",X"66",X"02",X"DD",X"6E",X"04",X"CD",X"AC",X"91", + X"FD",X"75",X"04",X"FD",X"74",X"05",X"CB",X"FE",X"CB",X"9E",X"FD",X"36",X"01",X"00",X"21",X"59", + X"48",X"06",X"0F",X"CF",X"DD",X"21",X"45",X"48",X"3A",X"42",X"48",X"DD",X"77",X"02",X"3A",X"44", + X"48",X"DD",X"77",X"04",X"21",X"7B",X"26",X"FD",X"7E",X"06",X"16",X"00",X"3D",X"5F",X"19",X"7E", + X"DD",X"77",X"03",X"3E",X"02",X"CD",X"93",X"25",X"DD",X"36",X"00",X"01",X"FD",X"36",X"07",X"00", + X"CD",X"9A",X"2D",X"28",X"05",X"3E",X"81",X"CD",X"40",X"03",X"3E",X"08",X"CD",X"40",X"03",X"AF", + X"32",X"40",X"48",X"32",X"41",X"48",X"3E",X"23",X"06",X"02",X"FF",X"C3",X"3E",X"23",X"3E",X"23", + X"06",X"01",X"FF",X"FD",X"21",X"80",X"4A",X"DD",X"21",X"45",X"48",X"CD",X"54",X"23",X"DD",X"36", + X"00",X"01",X"18",X"EA",X"FD",X"CB",X"03",X"7E",X"28",X"10",X"FD",X"7E",X"03",X"CB",X"BF",X"B7", + X"20",X"05",X"CD",X"69",X"24",X"18",X"03",X"FD",X"35",X"03",X"FD",X"CB",X"01",X"7E",X"28",X"28", + X"FD",X"7E",X"02",X"B7",X"28",X"04",X"FD",X"35",X"02",X"C9",X"FD",X"CB",X"01",X"76",X"20",X"0E", + X"FD",X"CB",X"01",X"F6",X"3E",X"01",X"CD",X"93",X"25",X"FD",X"36",X"02",X"04",X"C9",X"AF",X"FD", + X"77",X"01",X"3E",X"02",X"CD",X"93",X"25",X"C9",X"CD",X"27",X"26",X"CD",X"5C",X"26",X"CA",X"2A", + X"24",X"DD",X"7E",X"04",X"FD",X"CB",X"00",X"46",X"28",X"03",X"DD",X"7E",X"02",X"E6",X"0F",X"C0", + X"DD",X"66",X"02",X"DD",X"6E",X"04",X"3A",X"96",X"49",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB", + X"27",X"C6",X"31",X"BD",X"30",X"59",X"CD",X"AC",X"91",X"FE",X"FF",X"28",X"52",X"CB",X"7F",X"28", + X"39",X"5F",X"E6",X"70",X"FE",X"40",X"CA",X"1F",X"24",X"FE",X"30",X"7B",X"CA",X"1F",X"24",X"E6", + X"07",X"B7",X"28",X"3B",X"FD",X"5E",X"06",X"BB",X"28",X"35",X"FD",X"36",X"03",X"88",X"FD",X"75", + X"04",X"FD",X"74",X"05",X"FD",X"CB",X"01",X"FE",X"FD",X"36",X"07",X"00",X"FD",X"36",X"02",X"04", + X"AF",X"CD",X"93",X"25",X"3E",X"08",X"CD",X"40",X"03",X"C9",X"CB",X"5F",X"20",X"11",X"5F",X"E6", + X"70",X"20",X"0C",X"7B",X"57",X"E6",X"07",X"FD",X"5E",X"06",X"BB",X"20",X"02",X"18",X"CB",X"FD", + X"34",X"07",X"3E",X"03",X"FD",X"BE",X"07",X"C0",X"18",X"CA",X"C1",X"21",X"45",X"48",X"06",X"0A", + X"CF",X"21",X"80",X"4A",X"06",X"08",X"CF",X"FD",X"21",X"E0",X"49",X"DD",X"21",X"40",X"48",X"FD", + X"36",X"00",X"00",X"DD",X"36",X"01",X"0E",X"DD",X"36",X"00",X"00",X"3E",X"23",X"06",X"04",X"FF", + X"21",X"01",X"48",X"CB",X"46",X"CB",X"86",X"21",X"68",X"24",X"CD",X"BA",X"2C",X"C2",X"D5",X"2C", + X"C3",X"E1",X"26",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"CB",X"03",X"BE",X"FD",X"6E",X"04", + X"FD",X"66",X"05",X"7E",X"E6",X"07",X"F5",X"11",X"68",X"48",X"B7",X"ED",X"52",X"7D",X"CD",X"EA", + X"91",X"CD",X"1E",X"92",X"CD",X"83",X"26",X"30",X"03",X"F1",X"E1",X"C9",X"E5",X"FD",X"7E",X"06", + X"5F",X"3A",X"01",X"48",X"CB",X"57",X"7B",X"28",X"05",X"CD",X"87",X"95",X"18",X"03",X"CD",X"76", + X"95",X"E1",X"01",X"02",X"02",X"CD",X"5C",X"90",X"FD",X"7E",X"06",X"3D",X"21",X"2B",X"25",X"CD", + X"17",X"94",X"5E",X"23",X"56",X"EB",X"F1",X"E5",X"3D",X"5F",X"FD",X"7E",X"06",X"3D",X"F5",X"D5", + X"D1",X"F1",X"E1",X"93",X"16",X"00",X"B7",X"CA",X"E3",X"24",X"E5",X"F5",X"D5",X"7B",X"D1",X"F1", + X"CB",X"7F",X"28",X"01",X"15",X"E1",X"87",X"5F",X"87",X"83",X"5F",X"19",X"7A",X"06",X"06",X"CB", + X"7F",X"28",X"05",X"CD",X"BA",X"2C",X"18",X"24",X"E5",X"11",X"8D",X"49",X"CD",X"EF",X"8F",X"E1", + X"11",X"13",X"48",X"3A",X"01",X"48",X"CB",X"7F",X"28",X"0C",X"CB",X"6F",X"28",X"03",X"11",X"19", + X"48",X"06",X"06",X"CD",X"EF",X"8F",X"21",X"68",X"24",X"CD",X"BA",X"2C",X"FD",X"6E",X"04",X"FD", + X"66",X"05",X"7E",X"E6",X"70",X"FE",X"10",X"20",X"06",X"FD",X"46",X"06",X"B0",X"18",X"05",X"FD", + X"7E",X"06",X"E6",X"07",X"CB",X"FF",X"77",X"CD",X"90",X"3F",X"C9",X"4A",X"25",X"5C",X"25",X"6E", + X"25",X"80",X"25",X"00",X"00",X"00",X"04",X"05",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00", + X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"02",X"00", + X"00",X"00",X"00",X"00",X"01",X"05",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00", + X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"05",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00", + X"00",X"00",X"01",X"05",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"05", + X"00",X"00",X"00",X"00",X"00",X"05",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00", + X"04",X"05",X"00",X"21",X"DF",X"25",X"B7",X"28",X"0A",X"21",X"F7",X"25",X"FE",X"01",X"28",X"03", + X"21",X"0F",X"26",X"FD",X"7E",X"00",X"CB",X"BF",X"CD",X"10",X"94",X"4E",X"23",X"46",X"23",X"7E", + X"23",X"5E",X"23",X"56",X"23",X"E5",X"DD",X"77",X"01",X"DD",X"66",X"02",X"DD",X"6E",X"04",X"CD", + X"A5",X"91",X"DD",X"74",X"02",X"DD",X"75",X"04",X"D5",X"C1",X"CD",X"A5",X"91",X"DD",X"74",X"07", + X"DD",X"75",X"09",X"E1",X"7E",X"DD",X"77",X"06",X"DD",X"7E",X"03",X"DD",X"77",X"08",X"C9",X"00", + X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"A2",X"00",X"00",X"00",X"00",X"00",X"60",X"00",X"00", + X"00",X"00",X"00",X"22",X"00",X"00",X"00",X"00",X"00",X"21",X"00",X"00",X"00",X"00",X"00",X"A3", + X"00",X"00",X"00",X"00",X"00",X"61",X"00",X"00",X"00",X"00",X"00",X"23",X"00",X"00",X"00",X"00", + X"F8",X"24",X"00",X"10",X"25",X"08",X"00",X"A6",X"F0",X"00",X"A7",X"00",X"08",X"64",X"00",X"F0", + X"65",X"F8",X"00",X"26",X"10",X"00",X"27",X"FD",X"7E",X"00",X"CB",X"BF",X"21",X"54",X"26",X"CD", + X"17",X"94",X"4E",X"23",X"46",X"DD",X"66",X"02",X"DD",X"6E",X"04",X"CD",X"A5",X"91",X"DD",X"74", + X"02",X"DD",X"75",X"04",X"DD",X"66",X"07",X"DD",X"6E",X"09",X"CD",X"A5",X"91",X"DD",X"74",X"07", + X"DD",X"75",X"09",X"C9",X"00",X"FE",X"02",X"00",X"00",X"02",X"FE",X"00",X"FD",X"7E",X"00",X"CB", + X"BF",X"21",X"73",X"26",X"CD",X"17",X"94",X"7E",X"23",X"DD",X"BE",X"02",X"C8",X"7E",X"DD",X"BE", + X"04",X"C8",X"C9",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"0D",X"0E",X"0F",X"10",X"B0", + X"B8",X"B4",X"BC",X"3A",X"96",X"49",X"B7",X"C8",X"E5",X"CB",X"27",X"67",X"7D",X"E6",X"1F",X"6F", + X"3E",X"1F",X"95",X"D6",X"06",X"D8",X"BC",X"E1",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"60",X"4F",X"3A",X"01",X"48",X"CB",X"7F",X"28",X"08",X"3A",X"A7",X"49",X"47",X"05",X"CD", + X"70",X"91",X"CD",X"B6",X"2D",X"21",X"E0",X"49",X"06",X"20",X"CF",X"CD",X"D6",X"2D",X"DD",X"21", + X"40",X"48",X"DD",X"36",X"01",X"0E",X"DD",X"36",X"02",X"80",X"DD",X"36",X"03",X"81",X"DD",X"36", + X"04",X"F0",X"3E",X"3C",X"32",X"EC",X"49",X"AF",X"32",X"E0",X"4A",X"21",X"F3",X"09",X"22",X"E2", + X"4A",X"3E",X"23",X"06",X"02",X"FF",X"FD",X"21",X"E0",X"49",X"DD",X"21",X"40",X"48",X"3A",X"96", + X"49",X"FE",X"0C",X"CA",X"65",X"2A",X"3A",X"1A",X"48",X"E6",X"01",X"C4",X"F9",X"29",X"3A",X"02", + X"48",X"CB",X"77",X"28",X"41",X"FD",X"E5",X"FD",X"21",X"A0",X"4A",X"06",X"03",X"FD",X"7E",X"00", + X"FE",X"02",X"20",X"29",X"FD",X"7E",X"03",X"C6",X"F8",X"57",X"C6",X"50",X"5F",X"DD",X"7E",X"02", + X"BA",X"38",X"1A",X"BB",X"30",X"17",X"FD",X"7E",X"04",X"C6",X"B8",X"57",X"C6",X"50",X"5F",X"DD", + X"7E",X"04",X"BA",X"38",X"08",X"BB",X"30",X"05",X"FD",X"E1",X"C3",X"65",X"2A",X"11",X"0A",X"00", + X"FD",X"19",X"10",X"C9",X"FD",X"E1",X"FD",X"CB",X"00",X"7E",X"CA",X"9B",X"27",X"FD",X"7E",X"00", + X"CB",X"BF",X"21",X"58",X"27",X"F7",X"18",X"0A",X"79",X"2B",X"08",X"22",X"79",X"2B",X"79",X"2B", + X"01",X"2B",X"DD",X"21",X"40",X"48",X"FD",X"21",X"E0",X"49",X"FD",X"CB",X"0A",X"76",X"28",X"12", + X"FD",X"7E",X"0F",X"B7",X"28",X"05",X"FD",X"35",X"0F",X"18",X"07",X"FD",X"CB",X"0A",X"B6",X"CD", + X"D6",X"2D",X"DD",X"7E",X"01",X"FD",X"77",X"05",X"DD",X"7E",X"02",X"FD",X"77",X"06",X"DD",X"7E", + X"04",X"FD",X"77",X"07",X"DD",X"36",X"00",X"00",X"C3",X"E1",X"26",X"2A",X"E2",X"49",X"29",X"38", + X"06",X"22",X"E2",X"49",X"C3",X"62",X"27",X"11",X"00",X"00",X"ED",X"5A",X"22",X"E2",X"49",X"CD", + X"66",X"2E",X"CD",X"24",X"94",X"21",X"BB",X"27",X"F7",X"18",X"0A",X"52",X"28",X"14",X"29",X"B2", + X"28",X"76",X"29",X"D6",X"29",X"3E",X"0F",X"DD",X"A6",X"02",X"C2",X"62",X"27",X"3E",X"0F",X"DD", + X"A6",X"04",X"C2",X"62",X"27",X"DD",X"66",X"02",X"DD",X"6E",X"04",X"CD",X"AC",X"91",X"FE",X"20", + X"CA",X"3E",X"2C",X"E6",X"F8",X"FE",X"30",X"CC",X"E3",X"2C",X"3A",X"01",X"48",X"CB",X"7F",X"CA", + X"62",X"27",X"21",X"00",X"50",X"CB",X"6F",X"28",X"0A",X"3A",X"80",X"50",X"CB",X"47",X"20",X"03", + X"21",X"40",X"50",X"7E",X"2F",X"E6",X"1F",X"FE",X"10",X"C2",X"62",X"27",X"DD",X"66",X"02",X"DD", + X"6E",X"04",X"CD",X"AC",X"91",X"FE",X"FF",X"CA",X"62",X"27",X"CB",X"7F",X"C2",X"62",X"27",X"CB", + X"5F",X"C2",X"62",X"27",X"FD",X"77",X"09",X"E6",X"F0",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB", + X"3F",X"FE",X"03",X"20",X"03",X"C3",X"62",X"27",X"CB",X"DE",X"CB",X"FF",X"FD",X"77",X"00",X"FD", + X"36",X"10",X"00",X"21",X"F1",X"49",X"06",X"08",X"CF",X"21",X"80",X"4A",X"06",X"08",X"CF",X"C3", + X"62",X"27",X"FD",X"7E",X"01",X"21",X"5B",X"28",X"F7",X"18",X"0A",X"6A",X"28",X"8B",X"28",X"9D", + X"28",X"8B",X"28",X"9D",X"28",X"DD",X"36",X"00",X"00",X"C9",X"DD",X"7E",X"04",X"FE",X"41",X"38", + X"07",X"CD",X"F8",X"2D",X"CD",X"49",X"2E",X"C9",X"FE",X"38",X"30",X"06",X"DD",X"36",X"04",X"FE", + X"18",X"EF",X"DD",X"7E",X"02",X"FE",X"80",X"28",X"E8",X"18",X"E9",X"3E",X"0F",X"DD",X"A6",X"02", + X"20",X"15",X"DD",X"7E",X"02",X"FE",X"30",X"38",X"0E",X"FE",X"E1",X"30",X"0A",X"DD",X"36",X"01", + X"0C",X"FD",X"36",X"01",X"00",X"18",X"C3",X"3E",X"01",X"FD",X"BE",X"01",X"CA",X"CA",X"28",X"C3", + X"2C",X"29",X"FD",X"7E",X"01",X"21",X"BB",X"28",X"F7",X"18",X"0A",X"EE",X"28",X"CA",X"28",X"EE", + X"28",X"00",X"29",X"00",X"29",X"DD",X"36",X"00",X"00",X"C9",X"DD",X"7E",X"02",X"FE",X"E0",X"30", + X"07",X"CD",X"F8",X"2D",X"CD",X"49",X"2E",X"C9",X"DD",X"7E",X"02",X"FE",X"E2",X"38",X"06",X"DD", + X"36",X"02",X"22",X"18",X"EC",X"DD",X"7E",X"04",X"FE",X"90",X"28",X"E5",X"18",X"E6",X"3E",X"0F", + X"DD",X"A6",X"04",X"20",X"15",X"DD",X"7E",X"04",X"FE",X"40",X"38",X"0E",X"FE",X"F1",X"30",X"0A", + X"DD",X"36",X"01",X"08",X"FD",X"36",X"01",X"01",X"18",X"C0",X"AF",X"FD",X"BE",X"01",X"CA",X"6A", + X"28",X"C3",X"8E",X"29",X"FD",X"7E",X"01",X"21",X"1D",X"29",X"F7",X"18",X"0A",X"50",X"29",X"62", + X"29",X"50",X"29",X"2C",X"29",X"62",X"29",X"DD",X"36",X"00",X"00",X"C9",X"DD",X"7E",X"02",X"FE", + X"31",X"38",X"07",X"CD",X"F8",X"2D",X"CD",X"49",X"2E",X"C9",X"DD",X"7E",X"02",X"FE",X"28",X"30", + X"06",X"DD",X"36",X"02",X"EE",X"18",X"EC",X"DD",X"7E",X"04",X"FE",X"90",X"28",X"E5",X"18",X"E6", + X"3E",X"0F",X"DD",X"A6",X"04",X"20",X"15",X"DD",X"7E",X"04",X"FE",X"40",X"38",X"0E",X"FE",X"F1", + X"30",X"0A",X"DD",X"36",X"01",X"88",X"FD",X"36",X"01",X"03",X"18",X"C0",X"AF",X"FD",X"BE",X"01", + X"CA",X"6A",X"28",X"C3",X"8E",X"29",X"FD",X"7E",X"01",X"21",X"7F",X"29",X"F7",X"18",X"0A",X"C1", + X"29",X"AF",X"29",X"8E",X"29",X"AF",X"29",X"C1",X"29",X"DD",X"36",X"00",X"00",X"C9",X"DD",X"7E", + X"04",X"FE",X"F8",X"38",X"06",X"DD",X"36",X"04",X"32",X"18",X"04",X"FE",X"F0",X"30",X"07",X"CD", + X"F8",X"2D",X"CD",X"49",X"2E",X"C9",X"DD",X"7E",X"02",X"FE",X"80",X"28",X"F2",X"18",X"F3",X"3E", + X"0F",X"DD",X"A6",X"02",X"20",X"15",X"DD",X"7E",X"02",X"FE",X"30",X"38",X"0E",X"FE",X"E1",X"30", + X"0A",X"DD",X"36",X"01",X"0A",X"FD",X"36",X"01",X"02",X"18",X"C3",X"3E",X"01",X"FD",X"BE",X"01", + X"CA",X"CA",X"28",X"C3",X"2C",X"29",X"3E",X"0F",X"DD",X"A6",X"02",X"20",X"10",X"3E",X"0F",X"DD", + X"A6",X"04",X"20",X"09",X"DD",X"36",X"01",X"0E",X"DD",X"36",X"00",X"00",X"C9",X"FD",X"7E",X"01", + X"DF",X"6A",X"28",X"CA",X"28",X"8E",X"29",X"2C",X"29",X"DD",X"66",X"02",X"DD",X"6E",X"04",X"3E", + X"FA",X"84",X"57",X"3E",X"06",X"84",X"5F",X"3E",X"FA",X"85",X"67",X"3E",X"06",X"85",X"6F",X"FD", + X"E5",X"DD",X"E5",X"DD",X"21",X"45",X"48",X"FD",X"21",X"27",X"4A",X"06",X"06",X"0E",X"00",X"DD", + X"7E",X"02",X"BA",X"38",X"0C",X"BB",X"30",X"09",X"DD",X"7E",X"04",X"BC",X"38",X"03",X"BD",X"38", + X"18",X"D5",X"11",X"05",X"00",X"DD",X"19",X"3E",X"04",X"B8",X"38",X"05",X"11",X"0E",X"00",X"FD", + X"19",X"D1",X"10",X"DB",X"DD",X"E1",X"FD",X"E1",X"C9",X"3E",X"04",X"B8",X"38",X"12",X"FD",X"7E", + X"00",X"FE",X"02",X"CA",X"B5",X"2A",X"FE",X"03",X"28",X"06",X"FE",X"01",X"28",X"02",X"18",X"D1", + X"DD",X"E1",X"FD",X"E1",X"C1",X"3E",X"80",X"CD",X"40",X"03",X"21",X"A4",X"2C",X"CD",X"91",X"91", + X"21",X"02",X"48",X"CB",X"6E",X"CB",X"EE",X"3E",X"23",X"06",X"05",X"FF",X"CD",X"82",X"2A",X"C3", + X"8E",X"2C",X"3E",X"02",X"CD",X"40",X"03",X"21",X"45",X"48",X"06",X"23",X"CF",X"DD",X"36",X"01", + X"0F",X"DD",X"36",X"00",X"00",X"3E",X"23",X"06",X"28",X"FF",X"DD",X"36",X"01",X"10",X"DD",X"36", + X"00",X"00",X"3E",X"23",X"06",X"30",X"FF",X"DD",X"36",X"01",X"17",X"DD",X"36",X"00",X"00",X"3E", + X"23",X"06",X"10",X"FF",X"C9",X"CD",X"9A",X"2D",X"28",X"05",X"3E",X"0C",X"CD",X"40",X"03",X"FD", + X"36",X"00",X"04",X"FD",X"36",X"01",X"40",X"FD",X"36",X"06",X"02",X"FD",X"36",X"04",X"35",X"FD", + X"21",X"27",X"4A",X"06",X"04",X"FD",X"7E",X"00",X"FE",X"02",X"28",X"11",X"11",X"0E",X"00",X"FD", + X"19",X"10",X"F2",X"CD",X"9A",X"2D",X"28",X"05",X"3E",X"84",X"CD",X"40",X"03",X"21",X"00",X"2B", + X"CD",X"BA",X"2C",X"C2",X"D5",X"2C",X"DD",X"E1",X"FD",X"E1",X"C9",X"00",X"00",X"00",X"01",X"00", + X"00",X"FD",X"21",X"F1",X"49",X"FD",X"CB",X"00",X"7E",X"20",X"31",X"CD",X"9A",X"2D",X"28",X"05", + X"3E",X"04",X"CD",X"40",X"03",X"FD",X"CB",X"00",X"FE",X"DD",X"66",X"02",X"DD",X"6E",X"04",X"E5", + X"CD",X"AC",X"91",X"CB",X"DE",X"E1",X"CD",X"1E",X"92",X"1E",X"0A",X"3E",X"01",X"01",X"02",X"02", + X"CD",X"5C",X"90",X"3E",X"16",X"32",X"66",X"48",X"CD",X"A9",X"2E",X"C9",X"FD",X"7E",X"01",X"B7", + X"28",X"04",X"FD",X"35",X"01",X"C9",X"CD",X"C7",X"2E",X"C0",X"CD",X"9A",X"2D",X"28",X"05",X"3E", + X"81",X"CD",X"40",X"03",X"DD",X"66",X"02",X"DD",X"6E",X"04",X"CD",X"AC",X"91",X"CB",X"FE",X"CB", + X"9E",X"21",X"63",X"48",X"06",X"05",X"CF",X"AF",X"DD",X"36",X"01",X"0E",X"32",X"E0",X"49",X"DD", + X"66",X"02",X"DD",X"6E",X"04",X"CD",X"6E",X"AF",X"C9",X"FD",X"21",X"F1",X"49",X"FD",X"CB",X"00", + X"7E",X"20",X"47",X"CD",X"9A",X"2D",X"28",X"05",X"3E",X"04",X"CD",X"40",X"03",X"FD",X"CB",X"00", + X"FE",X"3A",X"E9",X"49",X"E6",X"07",X"5F",X"3A",X"01",X"48",X"CB",X"57",X"7B",X"28",X"05",X"CD", + X"87",X"95",X"18",X"03",X"CD",X"76",X"95",X"57",X"D5",X"DD",X"66",X"02",X"DD",X"6E",X"04",X"E5", + X"CD",X"AC",X"91",X"CB",X"DE",X"E1",X"CD",X"1E",X"92",X"D1",X"7A",X"01",X"02",X"02",X"CD",X"5C", + X"90",X"3E",X"16",X"32",X"66",X"48",X"CD",X"A9",X"2E",X"C9",X"FD",X"7E",X"01",X"B7",X"28",X"04", + X"FD",X"35",X"01",X"C9",X"CD",X"C7",X"2E",X"C0",X"CD",X"9A",X"2D",X"28",X"05",X"3E",X"81",X"CD", + X"40",X"03",X"21",X"A3",X"49",X"34",X"DD",X"36",X"01",X"0E",X"DD",X"66",X"02",X"DD",X"6E",X"04", + X"CD",X"AC",X"91",X"CB",X"FE",X"CB",X"9E",X"CD",X"90",X"3F",X"21",X"63",X"48",X"06",X"05",X"CF", + X"AF",X"32",X"E0",X"49",X"3A",X"E9",X"49",X"E6",X"07",X"3D",X"21",X"18",X"2C",X"CD",X"1D",X"94", + X"EB",X"CD",X"BA",X"2C",X"C2",X"D5",X"2C",X"C9",X"25",X"2C",X"2B",X"2C",X"31",X"2C",X"37",X"2C", + X"00",X"00",X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"21",X"02", + X"48",X"CB",X"6E",X"CB",X"EE",X"3E",X"80",X"CD",X"40",X"03",X"3E",X"03",X"CD",X"40",X"03",X"21", + X"A4",X"2C",X"CD",X"91",X"91",X"3E",X"23",X"06",X"01",X"FF",X"21",X"A8",X"2C",X"7E",X"23",X"DD", + X"77",X"01",X"DD",X"36",X"00",X"00",X"06",X"04",X"C5",X"3E",X"23",X"06",X"04",X"FF",X"C1",X"7E", + X"23",X"FE",X"FF",X"20",X"10",X"05",X"28",X"16",X"21",X"A8",X"2C",X"78",X"FE",X"03",X"30",X"EF", + X"21",X"B1",X"2C",X"18",X"EA",X"DD",X"77",X"01",X"DD",X"36",X"00",X"00",X"18",X"DA",X"DD",X"36", + X"01",X"00",X"DD",X"36",X"00",X"00",X"3E",X"23",X"06",X"20",X"FF",X"3E",X"00",X"01",X"B8",X"32", + X"FF",X"3E",X"60",X"FF",X"15",X"16",X"17",X"FF",X"11",X"12",X"13",X"52",X"51",X"D2",X"93",X"92", + X"FF",X"14",X"15",X"16",X"55",X"54",X"95",X"96",X"D5",X"FF",X"DD",X"E5",X"CD",X"92",X"90",X"DD", + X"E1",X"21",X"CF",X"2C",X"11",X"88",X"49",X"06",X"06",X"CD",X"80",X"90",X"FE",X"01",X"C9",X"00", + X"01",X"00",X"00",X"00",X"00",X"3E",X"80",X"CD",X"40",X"03",X"3E",X"00",X"01",X"9F",X"31",X"FF", + X"3E",X"60",X"FF",X"FD",X"CB",X"0A",X"76",X"C0",X"CD",X"D6",X"0C",X"3A",X"A5",X"49",X"3C",X"32", + X"A5",X"49",X"FE",X"04",X"28",X"05",X"CD",X"B6",X"2D",X"18",X"18",X"21",X"CE",X"41",X"01",X"02", + X"02",X"1E",X"16",X"AF",X"CD",X"0C",X"90",X"3A",X"AA",X"48",X"CB",X"7F",X"20",X"05",X"E6",X"07", + X"32",X"AA",X"48",X"FD",X"E5",X"FD",X"21",X"27",X"4A",X"06",X"04",X"0E",X"00",X"FD",X"7E",X"00", + X"FE",X"03",X"28",X"04",X"FE",X"02",X"20",X"0C",X"FD",X"36",X"00",X"02",X"CD",X"0E",X"8E",X"CD", + X"FE",X"88",X"0E",X"01",X"11",X"0E",X"00",X"FD",X"19",X"10",X"E2",X"AF",X"B9",X"28",X"19",X"21", + X"86",X"2D",X"3A",X"AA",X"49",X"FE",X"0A",X"38",X"02",X"3E",X"0A",X"3D",X"CD",X"1D",X"94",X"ED", + X"53",X"25",X"4A",X"3E",X"15",X"CD",X"40",X"03",X"FD",X"E1",X"21",X"7C",X"2D",X"3A",X"AA",X"49", + X"FE",X"0A",X"38",X"02",X"3E",X"0A",X"3D",X"16",X"00",X"5F",X"19",X"7E",X"FD",X"CB",X"0A",X"F6", + X"FD",X"77",X"0F",X"FD",X"36",X"02",X"FF",X"FD",X"36",X"03",X"FF",X"C9",X"2D",X"2D",X"2D",X"2D", + X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"69",X"01",X"2D",X"01",X"2D",X"01",X"69",X"01",X"2D",X"01", + X"F0",X"00",X"2D",X"01",X"F0",X"00",X"B4",X"00",X"B4",X"00",X"2A",X"25",X"48",X"11",X"D9",X"A3", + X"B7",X"E5",X"ED",X"52",X"E1",X"C8",X"11",X"BD",X"A4",X"B7",X"E5",X"ED",X"52",X"E1",X"C8",X"11", + X"FB",X"9E",X"B7",X"ED",X"52",X"C9",X"3A",X"A5",X"49",X"FE",X"04",X"D0",X"21",X"CE",X"2D",X"CD", + X"1D",X"94",X"7B",X"5A",X"21",X"CE",X"41",X"01",X"02",X"02",X"CD",X"5C",X"90",X"C9",X"60",X"18", + X"64",X"0C",X"68",X"15",X"6C",X"15",X"21",X"EE",X"2D",X"3A",X"AA",X"49",X"FE",X"05",X"38",X"02", + X"3E",X"05",X"3D",X"CD",X"17",X"94",X"5E",X"23",X"56",X"EB",X"22",X"E2",X"49",X"C9",X"EE",X"EE", + X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"FD",X"7E",X"0E",X"CB",X"BF",X"B7",X"20",X"22", + X"3E",X"02",X"FD",X"B6",X"0E",X"FD",X"77",X"0E",X"3E",X"10",X"FD",X"CB",X"0E",X"7E",X"FD",X"CB", + X"0E",X"FE",X"28",X"06",X"3E",X"01",X"FD",X"CB",X"0E",X"BE",X"CD",X"9A",X"2D",X"28",X"03",X"CD", + X"40",X"03",X"FD",X"35",X"0E",X"21",X"41",X"2E",X"FD",X"7E",X"01",X"CD",X"17",X"94",X"4E",X"23", + X"46",X"DD",X"66",X"02",X"DD",X"6E",X"04",X"CD",X"A5",X"91",X"DD",X"74",X"02",X"DD",X"75",X"04", + X"C9",X"00",X"FE",X"02",X"00",X"00",X"02",X"FE",X"00",X"21",X"5E",X"2E",X"FD",X"7E",X"01",X"CD", + X"17",X"94",X"DD",X"7E",X"01",X"BE",X"20",X"01",X"23",X"7E",X"DD",X"77",X"01",X"C9",X"0C",X"0D", + X"08",X"09",X"0A",X"0B",X"88",X"89",X"3A",X"01",X"48",X"CB",X"7F",X"28",X"16",X"CB",X"6F",X"21", + X"00",X"50",X"28",X"0A",X"3A",X"80",X"50",X"CB",X"47",X"20",X"03",X"21",X"40",X"50",X"7E",X"2F", + X"E6",X"0F",X"C9",X"3A",X"E0",X"4A",X"B7",X"20",X"13",X"2A",X"E2",X"4A",X"23",X"22",X"E2",X"4A", + X"7E",X"B7",X"CA",X"A5",X"2E",X"32",X"E0",X"4A",X"23",X"22",X"E2",X"4A",X"21",X"E0",X"4A",X"35", + X"2A",X"E2",X"4A",X"7E",X"C9",X"C1",X"CA",X"0C",X"28",X"DD",X"7E",X"02",X"32",X"65",X"48",X"DD", + X"7E",X"04",X"32",X"67",X"48",X"3E",X"18",X"32",X"64",X"48",X"AF",X"32",X"63",X"48",X"DD",X"36", + X"01",X"01",X"FD",X"36",X"01",X"01",X"C9",X"FD",X"36",X"01",X"01",X"DD",X"34",X"01",X"3A",X"64", + X"48",X"3C",X"32",X"64",X"48",X"F5",X"AF",X"32",X"63",X"48",X"F1",X"FE",X"1F",X"C9",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"18",X"06",X"31",X"C0",X"4F",X"C3",X"32",X"2F",X"31",X"C0",X"4F",X"CD",X"D5",X"04",X"CD",X"40", + X"36",X"79",X"32",X"04",X"48",X"21",X"DD",X"38",X"11",X"00",X"4C",X"01",X"F0",X"00",X"ED",X"B0", + X"21",X"DD",X"38",X"11",X"08",X"48",X"01",X"06",X"00",X"ED",X"B0",X"EF",X"CD",X"CB",X"34",X"21", + X"E8",X"36",X"CD",X"91",X"91",X"AF",X"32",X"01",X"48",X"CD",X"14",X"36",X"CD",X"43",X"35",X"CD", + X"80",X"3A",X"CD",X"CB",X"34",X"21",X"01",X"48",X"7E",X"E6",X"80",X"77",X"23",X"36",X"00",X"CD", + X"14",X"36",X"21",X"E8",X"36",X"CD",X"91",X"91",X"CD",X"43",X"35",X"CD",X"DC",X"35",X"CD",X"6F", + X"35",X"3A",X"01",X"48",X"CB",X"7F",X"CA",X"90",X"30",X"FD",X"21",X"05",X"48",X"FD",X"7E",X"00", + X"B7",X"20",X"0D",X"E7",X"21",X"01",X"48",X"36",X"00",X"23",X"36",X"00",X"EF",X"C3",X"1C",X"2F", + X"DD",X"21",X"5A",X"37",X"CD",X"0A",X"8F",X"21",X"49",X"42",X"DD",X"21",X"06",X"48",X"1E",X"02", + X"06",X"02",X"0E",X"FF",X"CD",X"1E",X"90",X"DD",X"21",X"01",X"38",X"CD",X"0A",X"8F",X"DD",X"21", + X"18",X"38",X"CD",X"0A",X"8F",X"CD",X"40",X"36",X"FE",X"06",X"CA",X"FA",X"2F",X"DD",X"21",X"D2", + X"37",X"CD",X"0A",X"8F",X"FD",X"7E",X"00",X"FE",X"01",X"20",X"24",X"DD",X"21",X"8B",X"37",X"CD", + X"0A",X"8F",X"3E",X"23",X"06",X"01",X"FF",X"3A",X"40",X"50",X"CB",X"6F",X"20",X"E6",X"FD",X"35", + X"00",X"21",X"E3",X"36",X"11",X"07",X"48",X"06",X"02",X"CD",X"EF",X"8F",X"C3",X"74",X"30",X"DD", + X"21",X"A1",X"37",X"CD",X"0A",X"8F",X"3E",X"23",X"06",X"01",X"FF",X"3A",X"40",X"50",X"CB",X"6F", + X"28",X"DC",X"CB",X"77",X"20",X"F0",X"FD",X"35",X"00",X"FD",X"35",X"00",X"21",X"E5",X"36",X"11", + X"07",X"48",X"06",X"02",X"CD",X"EF",X"8F",X"C3",X"6D",X"30",X"FD",X"7E",X"00",X"FE",X"02",X"30", + X"0E",X"DD",X"21",X"C2",X"37",X"CD",X"0A",X"8F",X"3E",X"23",X"06",X"01",X"FF",X"18",X"EB",X"DD", + X"21",X"D2",X"37",X"CD",X"0A",X"8F",X"FD",X"7E",X"00",X"FE",X"04",X"30",X"26",X"DD",X"21",X"8B", + X"37",X"CD",X"0A",X"8F",X"3E",X"23",X"06",X"01",X"FF",X"3A",X"40",X"50",X"CB",X"6F",X"20",X"E6", + X"FD",X"35",X"00",X"FD",X"35",X"00",X"21",X"E5",X"36",X"11",X"07",X"48",X"06",X"02",X"CD",X"EF", + X"8F",X"18",X"31",X"DD",X"21",X"A1",X"37",X"CD",X"0A",X"8F",X"3E",X"23",X"06",X"01",X"FF",X"3A", + X"40",X"50",X"CB",X"6F",X"28",X"DA",X"CB",X"77",X"20",X"F0",X"FD",X"7E",X"00",X"D6",X"04",X"FD", + X"77",X"00",X"21",X"E7",X"36",X"11",X"07",X"48",X"06",X"02",X"CD",X"EF",X"8F",X"21",X"01",X"48", + X"CB",X"76",X"CB",X"F6",X"21",X"02",X"48",X"CB",X"7E",X"CB",X"FE",X"21",X"49",X"42",X"DD",X"21", + X"06",X"48",X"1E",X"02",X"06",X"02",X"0E",X"FF",X"CD",X"1E",X"90",X"3E",X"23",X"06",X"04",X"FF", + X"3A",X"01",X"48",X"CB",X"7F",X"28",X"06",X"21",X"0E",X"48",X"06",X"0C",X"CF",X"21",X"0B",X"37", + X"11",X"88",X"49",X"01",X"24",X"00",X"ED",X"B0",X"21",X"0B",X"37",X"11",X"B0",X"49",X"01",X"24", + X"00",X"ED",X"B0",X"3A",X"80",X"50",X"2F",X"E6",X"30",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB", + X"3F",X"C6",X"03",X"32",X"A7",X"49",X"32",X"CF",X"49",X"CD",X"36",X"92",X"21",X"68",X"48",X"11", + X"F8",X"48",X"01",X"90",X"00",X"ED",X"B0",X"CD",X"36",X"92",X"21",X"68",X"48",X"11",X"68",X"48", + X"FD",X"21",X"D0",X"4A",X"CD",X"9A",X"36",X"21",X"F8",X"48",X"11",X"F8",X"48",X"FD",X"21",X"F0", + X"4A",X"CD",X"9A",X"36",X"3A",X"01",X"48",X"CB",X"7F",X"20",X"16",X"21",X"41",X"38",X"11",X"68", + X"48",X"01",X"90",X"00",X"ED",X"B0",X"11",X"D0",X"4A",X"21",X"D1",X"38",X"01",X"0C",X"00",X"ED", + X"B0",X"CD",X"14",X"36",X"CD",X"43",X"35",X"CD",X"CB",X"34",X"CD",X"DC",X"35",X"CD",X"6F",X"35", + X"CD",X"F0",X"14",X"3E",X"23",X"06",X"40",X"FF",X"CD",X"5B",X"35",X"CD",X"CE",X"34",X"CD",X"5F", + X"36",X"3A",X"A4",X"49",X"B7",X"28",X"0D",X"CD",X"2D",X"95",X"CD",X"CE",X"34",X"3E",X"23",X"06", + X"40",X"FF",X"18",X"12",X"3E",X"12",X"CD",X"40",X"03",X"CD",X"D7",X"94",X"3E",X"23",X"06",X"08", + X"FF",X"3E",X"80",X"CD",X"40",X"03",X"CD",X"5B",X"35",X"CD",X"5F",X"36",X"CD",X"3D",X"94",X"21", + X"F1",X"36",X"CD",X"99",X"91",X"3A",X"01",X"48",X"CB",X"7F",X"20",X"03",X"3E",X"60",X"FF",X"DD", + X"21",X"67",X"37",X"21",X"70",X"37",X"3A",X"01",X"48",X"CB",X"6F",X"28",X"07",X"DD",X"21",X"79", + X"37",X"21",X"82",X"37",X"DD",X"E5",X"E5",X"E5",X"CD",X"0A",X"8F",X"3E",X"23",X"06",X"18",X"FF", + X"DD",X"E1",X"CD",X"0A",X"8F",X"3E",X"23",X"06",X"10",X"FF",X"E1",X"DD",X"E1",X"18",X"E5",X"31", + X"C0",X"4F",X"21",X"E8",X"36",X"CD",X"91",X"91",X"3E",X"80",X"CD",X"40",X"03",X"3E",X"16",X"CD", + X"40",X"03",X"DD",X"21",X"67",X"37",X"3A",X"01",X"48",X"CB",X"6F",X"28",X"04",X"DD",X"21",X"79", + X"37",X"CD",X"0A",X"8F",X"21",X"02",X"48",X"7E",X"E6",X"80",X"77",X"2B",X"7E",X"E6",X"F8",X"77", + X"3E",X"01",X"01",X"00",X"3A",X"FF",X"3E",X"23",X"06",X"20",X"FF",X"21",X"40",X"48",X"06",X"28", + X"CF",X"CD",X"2D",X"95",X"3E",X"23",X"06",X"01",X"FF",X"3A",X"2C",X"48",X"CB",X"7F",X"20",X"F4", + X"3E",X"23",X"06",X"20",X"FF",X"CD",X"06",X"34",X"3A",X"AA",X"49",X"3C",X"20",X"02",X"3E",X"01", + X"32",X"AA",X"49",X"21",X"88",X"49",X"06",X"06",X"CF",X"CD",X"6F",X"35",X"3E",X"11",X"FF",X"CD", + X"5B",X"35",X"CD",X"CB",X"34",X"21",X"07",X"37",X"CD",X"99",X"91",X"3E",X"30",X"FF",X"3E",X"80", + X"FF",X"F5",X"FE",X"10",X"28",X"06",X"21",X"88",X"49",X"06",X"06",X"CF",X"3A",X"01",X"48",X"CB", + X"7F",X"20",X"25",X"3E",X"23",X"06",X"40",X"FF",X"CD",X"43",X"35",X"CD",X"80",X"A5",X"3E",X"23", + X"06",X"3C",X"FF",X"DD",X"21",X"01",X"38",X"CD",X"0A",X"8F",X"3E",X"23",X"06",X"C0",X"FF",X"C3", + X"1C",X"2F",X"00",X"00",X"00",X"00",X"00",X"00",X"CD",X"6D",X"34",X"21",X"B1",X"32",X"11",X"A9", + X"49",X"06",X"02",X"CD",X"DA",X"8F",X"21",X"0B",X"37",X"11",X"88",X"49",X"01",X"1E",X"00",X"ED", + X"B0",X"3A",X"A6",X"49",X"E6",X"0F",X"32",X"A6",X"49",X"CD",X"36",X"92",X"21",X"68",X"48",X"11", + X"68",X"48",X"FD",X"21",X"D0",X"4A",X"CD",X"9A",X"36",X"F1",X"FE",X"20",X"20",X"1A",X"3A",X"A7", + X"49",X"FE",X"02",X"30",X"0B",X"21",X"B1",X"32",X"11",X"A9",X"49",X"06",X"02",X"CD",X"EF",X"8F", + X"3E",X"23",X"06",X"40",X"FF",X"C3",X"F9",X"32",X"3E",X"23",X"06",X"80",X"FF",X"C3",X"11",X"31", + X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"31",X"C0",X"4F",X"21",X"E8",X"36",X"CD",X"91", + X"91",X"3E",X"80",X"CD",X"40",X"03",X"DD",X"21",X"67",X"37",X"3A",X"01",X"48",X"CB",X"6F",X"28", + X"04",X"DD",X"21",X"79",X"37",X"CD",X"0A",X"8F",X"21",X"02",X"48",X"7E",X"E6",X"80",X"77",X"2B", + X"7E",X"E6",X"F8",X"77",X"3E",X"23",X"06",X"30",X"FF",X"3A",X"01",X"48",X"CB",X"7F",X"CA",X"03", + X"32",X"21",X"A4",X"49",X"34",X"AF",X"32",X"96",X"49",X"11",X"01",X"48",X"1A",X"E6",X"F8",X"12", + X"21",X"A7",X"49",X"1A",X"CB",X"77",X"20",X"18",X"35",X"C2",X"11",X"31",X"CD",X"14",X"35",X"CD", + X"C1",X"33",X"3E",X"23",X"06",X"20",X"FF",X"CD",X"43",X"35",X"CD",X"10",X"17",X"C3",X"32",X"2F", + X"35",X"21",X"CF",X"49",X"28",X"07",X"7E",X"B7",X"CA",X"11",X"31",X"18",X"1A",X"CD",X"14",X"35", + X"CD",X"C1",X"33",X"3E",X"23",X"06",X"20",X"FF",X"CD",X"43",X"35",X"CD",X"10",X"17",X"3A",X"CF", + X"49",X"B7",X"20",X"03",X"C3",X"32",X"2F",X"3A",X"01",X"48",X"CB",X"6F",X"CB",X"EF",X"28",X"02", + X"CB",X"AF",X"32",X"01",X"48",X"21",X"88",X"49",X"11",X"E0",X"49",X"01",X"24",X"00",X"ED",X"B0", + X"21",X"B0",X"49",X"11",X"88",X"49",X"01",X"24",X"00",X"ED",X"B0",X"21",X"E0",X"49",X"11",X"B0", + X"49",X"01",X"24",X"00",X"ED",X"B0",X"21",X"D0",X"4A",X"11",X"E0",X"49",X"01",X"10",X"00",X"ED", + X"B0",X"21",X"F0",X"4A",X"11",X"D0",X"4A",X"01",X"10",X"00",X"ED",X"B0",X"21",X"E0",X"49",X"11", + X"F0",X"4A",X"01",X"10",X"00",X"ED",X"B0",X"21",X"68",X"48",X"11",X"E0",X"49",X"01",X"90",X"00", + X"ED",X"B0",X"21",X"F8",X"48",X"11",X"68",X"48",X"01",X"90",X"00",X"ED",X"B0",X"21",X"E0",X"49", + X"11",X"F8",X"48",X"01",X"90",X"00",X"ED",X"B0",X"21",X"E0",X"49",X"06",X"90",X"CF",X"C3",X"11", + X"31",X"21",X"0E",X"48",X"11",X"14",X"48",X"06",X"06",X"CD",X"80",X"90",X"21",X"0E",X"48",X"FE", + X"02",X"38",X"03",X"21",X"14",X"48",X"E5",X"11",X"08",X"48",X"06",X"06",X"CD",X"80",X"90",X"E1", + X"FE",X"01",X"20",X"08",X"11",X"08",X"48",X"01",X"06",X"00",X"ED",X"B0",X"21",X"DF",X"41",X"DD", + X"21",X"08",X"48",X"1E",X"17",X"06",X"06",X"0E",X"00",X"CD",X"1E",X"90",X"21",X"88",X"49",X"06", + X"06",X"CF",X"CD",X"6F",X"35",X"C9",X"3E",X"1D",X"CD",X"40",X"03",X"21",X"B2",X"32",X"11",X"8E", + X"49",X"06",X"06",X"CD",X"80",X"90",X"FE",X"02",X"20",X"2A",X"21",X"B7",X"32",X"CD",X"92",X"90", + X"21",X"B7",X"32",X"11",X"93",X"49",X"06",X"06",X"CD",X"EF",X"8F",X"3A",X"FC",X"46",X"5F",X"21", + X"FC",X"42",X"DD",X"21",X"8E",X"49",X"06",X"06",X"0E",X"00",X"CD",X"1E",X"90",X"3E",X"23",X"06", + X"02",X"FF",X"18",X"C7",X"3E",X"81",X"CD",X"40",X"03",X"21",X"93",X"49",X"CD",X"92",X"90",X"21", + X"8E",X"49",X"06",X"06",X"CF",X"3A",X"FC",X"46",X"5F",X"21",X"FC",X"42",X"DD",X"21",X"8E",X"49", + X"06",X"06",X"0E",X"00",X"CD",X"1E",X"90",X"3E",X"23",X"06",X"40",X"FF",X"C9",X"3E",X"1D",X"CD", + X"40",X"03",X"21",X"B2",X"32",X"11",X"88",X"49",X"06",X"06",X"CD",X"80",X"90",X"FE",X"02",X"20", + X"28",X"21",X"B7",X"32",X"CD",X"AC",X"90",X"21",X"B7",X"32",X"11",X"8D",X"49",X"06",X"06",X"CD", + X"EF",X"8F",X"21",X"BD",X"41",X"DD",X"21",X"88",X"49",X"1E",X"04",X"06",X"06",X"0E",X"00",X"CD", + X"1E",X"90",X"3E",X"23",X"06",X"02",X"FF",X"18",X"C9",X"3E",X"81",X"CD",X"40",X"03",X"21",X"8D", + X"49",X"CD",X"AC",X"90",X"21",X"88",X"49",X"06",X"06",X"CF",X"21",X"BD",X"41",X"DD",X"21",X"88", + X"49",X"1E",X"04",X"06",X"06",X"0E",X"00",X"CD",X"1E",X"90",X"C9",X"AF",X"18",X"2A",X"3A",X"AA", + X"49",X"FE",X"09",X"38",X"04",X"D6",X"08",X"18",X"F8",X"0E",X"00",X"FE",X"03",X"38",X"05",X"0C", + X"D6",X"02",X"18",X"F7",X"79",X"81",X"4F",X"06",X"00",X"21",X"FF",X"34",X"09",X"7E",X"23",X"32", + X"05",X"50",X"7E",X"32",X"06",X"50",X"3E",X"01",X"21",X"01",X"50",X"77",X"23",X"77",X"C9",X"01", + X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"11",X"13",X"48",X"3A",X"01",X"48",X"CB",X"6F",X"C8", + X"11",X"19",X"48",X"C9",X"E5",X"D5",X"21",X"CE",X"40",X"01",X"14",X"03",X"AF",X"1E",X"00",X"CD", + X"4A",X"90",X"21",X"EF",X"40",X"06",X"12",X"1E",X"00",X"DD",X"21",X"DD",X"37",X"3A",X"01",X"48", + X"CB",X"6F",X"28",X"04",X"DD",X"21",X"EF",X"37",X"CD",X"7D",X"8F",X"D1",X"E1",X"3E",X"23",X"06", + X"40",X"FF",X"C9",X"21",X"00",X"40",X"01",X"00",X"04",X"1E",X"00",X"CD",X"02",X"8F",X"21",X"00", + X"44",X"01",X"00",X"04",X"1E",X"00",X"CD",X"02",X"8F",X"18",X"0D",X"21",X"00",X"40",X"01",X"20", + X"1C",X"1E",X"00",X"3E",X"00",X"CD",X"0C",X"90",X"21",X"40",X"48",X"06",X"28",X"CF",X"C9",X"21", + X"BF",X"40",X"DD",X"21",X"0E",X"48",X"1E",X"05",X"06",X"06",X"0E",X"00",X"CD",X"1E",X"90",X"21", + X"FF",X"42",X"DD",X"21",X"14",X"48",X"1E",X"05",X"06",X"06",X"0E",X"00",X"CD",X"1E",X"90",X"21", + X"BD",X"41",X"DD",X"21",X"88",X"49",X"1E",X"04",X"06",X"06",X"0E",X"00",X"CD",X"1E",X"90",X"21", + X"DF",X"41",X"DD",X"21",X"08",X"48",X"1E",X"17",X"06",X"06",X"0E",X"00",X"CD",X"1E",X"90",X"21", + X"FD",X"40",X"DD",X"21",X"A8",X"49",X"1E",X"02",X"06",X"02",X"0E",X"00",X"CD",X"1E",X"90",X"CD", + X"FC",X"35",X"3A",X"A6",X"49",X"CB",X"67",X"1E",X"05",X"28",X"02",X"1E",X"02",X"21",X"FC",X"42", + X"DD",X"21",X"8E",X"49",X"06",X"06",X"0E",X"00",X"CD",X"1E",X"90",X"C9",X"DD",X"21",X"2F",X"37", + X"CD",X"0A",X"8F",X"21",X"5C",X"41",X"01",X"0C",X"03",X"3E",X"51",X"1E",X"10",X"CD",X"4A",X"90", + X"21",X"7D",X"41",X"01",X"0A",X"01",X"AF",X"5F",X"CD",X"0C",X"90",X"C9",X"3A",X"A7",X"49",X"B7", + X"C8",X"47",X"3A",X"A4",X"49",X"B7",X"20",X"07",X"3A",X"AA",X"49",X"FE",X"02",X"38",X"01",X"05", + X"CD",X"70",X"91",X"C9",X"21",X"01",X"48",X"3A",X"80",X"50",X"2F",X"E6",X"03",X"CB",X"6E",X"28", + X"02",X"CB",X"D7",X"21",X"32",X"36",X"06",X"00",X"4F",X"09",X"7E",X"32",X"03",X"50",X"32",X"1B", + X"48",X"C9",X"00",X"00",X"01",X"01",X"00",X"01",X"01",X"00",X"3A",X"01",X"48",X"CB",X"6F",X"C9", + X"3A",X"80",X"50",X"2F",X"CB",X"07",X"CB",X"07",X"CB",X"07",X"E6",X"06",X"4F",X"21",X"57",X"36", + X"06",X"00",X"09",X"46",X"23",X"4E",X"C9",X"01",X"01",X"01",X"02",X"01",X"03",X"02",X"01",X"21", + X"40",X"40",X"DD",X"21",X"10",X"07",X"1E",X"02",X"CD",X"8C",X"8F",X"21",X"4E",X"40",X"1E",X"03", + X"01",X"02",X"02",X"3E",X"98",X"CD",X"5C",X"90",X"21",X"8E",X"43",X"01",X"02",X"02",X"3E",X"94", + X"CD",X"5C",X"90",X"21",X"C0",X"41",X"01",X"02",X"02",X"3E",X"9C",X"CD",X"5C",X"90",X"21",X"DA", + X"41",X"01",X"02",X"02",X"3E",X"90",X"CD",X"5C",X"90",X"C9",X"06",X"90",X"C5",X"7E",X"E6",X"70", + X"FE",X"10",X"28",X"05",X"23",X"C1",X"10",X"F4",X"C9",X"E5",X"B7",X"ED",X"52",X"7D",X"D5",X"CD", + X"EA",X"91",X"D1",X"ED",X"5F",X"E6",X"03",X"4F",X"CB",X"47",X"28",X"10",X"06",X"03",X"7C",X"FE", + X"C0",X"30",X"17",X"06",X"01",X"FE",X"60",X"38",X"11",X"41",X"18",X"0E",X"06",X"00",X"7D",X"FE", + X"D0",X"30",X"07",X"06",X"02",X"FE",X"60",X"38",X"01",X"41",X"FD",X"70",X"00",X"FD",X"23",X"E1", + X"18",X"C2",X"00",X"01",X"00",X"02",X"00",X"04",X"11",X"12",X"13",X"14",X"15",X"16",X"17",X"18", + X"FF",X"02",X"00",X"A5",X"01",X"00",X"AD",X"04",X"A0",X"26",X"06",X"00",X"80",X"05",X"00",X"86", + X"07",X"20",X"0D",X"08",X"40",X"3F",X"FF",X"01",X"A0",X"18",X"FF",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00", + X"02",X"7F",X"40",X"00",X"00",X"31",X"50",X"02",X"BF",X"42",X"00",X"00",X"32",X"50",X"02",X"9F", + X"41",X"00",X"00",X"48",X"49",X"05",X"5D",X"40",X"00",X"00",X"52",X"4F",X"55",X"4E",X"44",X"05", + X"1D",X"43",X"00",X"00",X"42",X"4F",X"4E",X"55",X"53",X"00",X"00",X"06",X"69",X"41",X"00",X"00", + X"43",X"52",X"45",X"44",X"49",X"54",X"00",X"00",X"02",X"7F",X"40",X"00",X"00",X"31",X"50",X"00", + X"00",X"02",X"7F",X"40",X"00",X"00",X"20",X"20",X"00",X"00",X"02",X"BF",X"42",X"00",X"00",X"32", + X"50",X"00",X"00",X"02",X"BF",X"42",X"00",X"00",X"20",X"20",X"00",X"00",X"0F",X"2F",X"41",X"00", + X"00",X"31",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"42",X"55",X"54",X"54",X"4F",X"4E", + X"00",X"00",X"0F",X"2F",X"41",X"00",X"00",X"31",X"20",X"4F",X"52",X"20",X"32",X"20",X"50",X"4C", + X"41",X"59",X"45",X"52",X"53",X"20",X"06",X"AD",X"41",X"00",X"05",X"42",X"55",X"54",X"54",X"4F", + X"4E",X"00",X"00",X"09",X"6F",X"41",X"00",X"00",X"4D",X"4F",X"52",X"45",X"20",X"43",X"4F",X"49", + X"4E",X"00",X"00",X"04",X"D1",X"41",X"00",X"05",X"50",X"55",X"53",X"48",X"00",X"47",X"41",X"4D", + X"45",X"20",X"4F",X"56",X"45",X"52",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"3B",X"31",X"47", + X"41",X"4D",X"45",X"20",X"4F",X"56",X"45",X"52",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"3B", + X"32",X"00",X"10",X"01",X"41",X"00",X"17",X"40",X"20",X"31",X"39",X"38",X"32",X"20",X"53",X"41", + X"4E",X"52",X"49",X"54",X"53",X"55",X"20",X"00",X"00",X"04",X"D7",X"41",X"00",X"00",X"50",X"4C", + X"41",X"59",X"0D",X"55",X"41",X"01",X"02",X"44",X"14",X"52",X"03",X"45",X"04",X"41",X"05",X"4D", + X"00",X"3B",X"05",X"53",X"05",X"48",X"05",X"4F",X"05",X"50",X"05",X"50",X"05",X"45",X"05",X"52", + X"00",X"01",X"02",X"04",X"02",X"03",X"04",X"02",X"03",X"02",X"03",X"04",X"01",X"04",X"02",X"12", + X"04",X"01",X"01",X"01",X"04",X"13",X"02",X"03",X"04",X"02",X"04",X"03",X"03",X"04",X"02",X"20", + X"01",X"03",X"04",X"04",X"03",X"03",X"14",X"02",X"04",X"03",X"40",X"04",X"03",X"14",X"01",X"03", + X"12",X"04",X"02",X"03",X"11",X"04",X"03",X"02",X"04",X"04",X"04",X"02",X"04",X"01",X"04",X"20", + X"03",X"04",X"02",X"31",X"04",X"02",X"20",X"04",X"03",X"04",X"02",X"03",X"04",X"01",X"02",X"04", + X"02",X"03",X"03",X"04",X"01",X"13",X"03",X"03",X"02",X"03",X"04",X"02",X"03",X"40",X"04",X"02", + X"03",X"04",X"02",X"04",X"03",X"40",X"02",X"04",X"11",X"02",X"03",X"04",X"14",X"01",X"04",X"02", + X"03",X"04",X"02",X"20",X"03",X"04",X"01",X"03",X"04",X"04",X"03",X"11",X"04",X"01",X"04",X"13", + X"04",X"03",X"04",X"12",X"04",X"02",X"04",X"03",X"02",X"03",X"04",X"03",X"01",X"02",X"03",X"03", + X"02",X"00",X"01",X"00",X"02",X"02",X"00",X"00",X"03",X"02",X"03",X"03",X"02",X"00",X"03",X"00", + X"00",X"00",X"00",X"00",X"03",X"00",X"02",X"08",X"00",X"00",X"00",X"00",X"03",X"00",X"02",X"07", + X"05",X"00",X"00",X"00",X"03",X"00",X"02",X"05",X"04",X"00",X"00",X"00",X"03",X"00",X"02",X"04", + X"08",X"06",X"00",X"00",X"03",X"00",X"02",X"02",X"00",X"00",X"00",X"00",X"03",X"00",X"02",X"01", + X"01",X"02",X"00",X"00",X"02",X"00",X"02",X"00",X"05",X"06",X"00",X"00",X"02",X"00",X"01",X"09", + X"08",X"08",X"00",X"00",X"02",X"00",X"01",X"09",X"08",X"00",X"00",X"00",X"02",X"00",X"01",X"08", + X"05",X"07",X"00",X"00",X"02",X"00",X"01",X"06",X"06",X"03",X"00",X"00",X"02",X"00",X"01",X"05", + X"00",X"00",X"00",X"00",X"02",X"00",X"01",X"04",X"09",X"09",X"00",X"00",X"02",X"00",X"01",X"03", + X"05",X"00",X"00",X"00",X"02",X"00",X"01",X"02",X"02",X"02",X"00",X"00",X"02",X"00",X"01",X"01", + X"05",X"09",X"00",X"00",X"02",X"00",X"01",X"00",X"04",X"02",X"00",X"00",X"02",X"00",X"00",X"09", + X"09",X"00",X"00",X"00",X"01",X"00",X"00",X"09",X"07",X"05",X"00",X"00",X"01",X"00",X"00",X"09", + X"05",X"00",X"00",X"00",X"01",X"00",X"00",X"09",X"01",X"05",X"00",X"00",X"01",X"00",X"00",X"08", + X"07",X"00",X"00",X"00",X"01",X"00",X"00",X"07",X"05",X"00",X"00",X"00",X"01",X"00",X"00",X"07", + X"06",X"05",X"00",X"00",X"01",X"00",X"00",X"07",X"03",X"00",X"00",X"00",X"01",X"00",X"00",X"06", + X"00",X"05",X"00",X"00",X"01",X"00",X"00",X"06",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"05", + X"08",X"00",X"00",X"00",X"01",X"00",X"00",X"05",X"00",X"00",X"00",X"00",X"01",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"60",X"4F",X"0E",X"0D",X"CD",X"20",X"3A",X"1E",X"10",X"3E",X"23",X"06",X"02",X"FF",X"4B", + X"D5",X"CD",X"20",X"3A",X"D1",X"7B",X"3D",X"5F",X"FE",X"0C",X"20",X"EE",X"1E",X"10",X"18",X"EA", + X"06",X"04",X"21",X"68",X"3A",X"C5",X"79",X"4E",X"23",X"46",X"23",X"5E",X"23",X"56",X"23",X"E5", + X"C5",X"E1",X"4F",X"CD",X"3B",X"3A",X"E1",X"C1",X"10",X"EB",X"C9",X"06",X"1A",X"7E",X"FE",X"03", + X"28",X"0F",X"71",X"E5",X"D5",X"16",X"00",X"CB",X"7B",X"28",X"02",X"16",X"FF",X"19",X"71",X"D1", + X"E1",X"D5",X"5A",X"16",X"00",X"CB",X"7B",X"28",X"02",X"16",X"FF",X"19",X"D1",X"0C",X"79",X"FE", + X"11",X"20",X"02",X"0E",X"0D",X"10",X"D6",X"C9",X"5A",X"44",X"01",X"20",X"9B",X"47",X"20",X"FF", + X"A1",X"47",X"FF",X"E0",X"40",X"44",X"20",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FD",X"21",X"37",X"3D",X"FD",X"6E",X"00",X"FD",X"23",X"FD",X"66",X"00",X"FD",X"23",X"FD",X"4E", + X"00",X"FD",X"23",X"FD",X"7E",X"00",X"FD",X"23",X"5F",X"E6",X"0F",X"47",X"7B",X"E6",X"F0",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"E5",X"21",X"D7",X"3A",X"CD",X"1D",X"94",X"E1",X"19", + X"FD",X"7E",X"00",X"FD",X"23",X"77",X"CB",X"D4",X"71",X"CB",X"94",X"C5",X"3E",X"23",X"06",X"02", + X"FF",X"C1",X"10",X"EB",X"FD",X"7E",X"00",X"FE",X"FF",X"28",X"14",X"FE",X"80",X"28",X"04",X"FD", + X"23",X"18",X"C0",X"FD",X"23",X"18",X"AD",X"01",X"00",X"20",X"00",X"FF",X"FF",X"E0",X"FF",X"3E", + X"51",X"1E",X"10",X"01",X"01",X"07",X"21",X"72",X"40",X"CD",X"4A",X"90",X"21",X"92",X"40",X"11", + X"98",X"40",X"0E",X"10",X"06",X"18",X"3E",X"51",X"C5",X"06",X"02",X"77",X"CB",X"D4",X"71",X"CB", + X"94",X"CD",X"79",X"90",X"EB",X"10",X"F4",X"3E",X"23",X"06",X"02",X"FF",X"C1",X"10",X"E7",X"21", + X"92",X"43",X"1E",X"10",X"3E",X"51",X"01",X"01",X"07",X"CD",X"4A",X"90",X"21",X"00",X"4B",X"06", + X"0C",X"CF",X"21",X"E0",X"49",X"06",X"20",X"CF",X"FD",X"21",X"E0",X"49",X"DD",X"21",X"40",X"48", + X"DD",X"36",X"01",X"0E",X"DD",X"36",X"02",X"10",X"DD",X"36",X"03",X"81",X"DD",X"36",X"04",X"F0", + X"DD",X"36",X"00",X"00",X"FD",X"36",X"02",X"88",X"FD",X"36",X"03",X"88",X"11",X"D3",X"45",X"ED", + X"53",X"05",X"4B",X"21",X"13",X"46",X"22",X"03",X"4B",X"3E",X"23",X"06",X"01",X"FF",X"FD",X"21", + X"E0",X"49",X"DD",X"21",X"40",X"48",X"FD",X"7E",X"00",X"FE",X"01",X"28",X"26",X"3E",X"80",X"DD", + X"BE",X"02",X"20",X"11",X"DD",X"36",X"01",X"0E",X"DD",X"36",X"00",X"00",X"FD",X"34",X"00",X"FD", + X"36",X"01",X"80",X"18",X"12",X"CD",X"39",X"1E",X"30",X"0D",X"CD",X"8E",X"1E",X"DD",X"36",X"00", + X"00",X"18",X"04",X"FD",X"35",X"01",X"C8",X"3A",X"00",X"4B",X"B7",X"28",X"07",X"3D",X"32",X"00", + X"4B",X"C3",X"20",X"3C",X"3E",X"00",X"32",X"00",X"4B",X"3A",X"01",X"4B",X"21",X"19",X"3C",X"16", + X"00",X"5F",X"19",X"7E",X"2A",X"03",X"4B",X"01",X"02",X"05",X"C5",X"E5",X"77",X"23",X"10",X"FC", + X"E1",X"C1",X"11",X"20",X"00",X"19",X"0D",X"20",X"F1",X"01",X"02",X"05",X"2A",X"05",X"4B",X"C5", + X"E5",X"77",X"23",X"10",X"FC",X"E1",X"C1",X"11",X"20",X"00",X"19",X"0D",X"20",X"F1",X"2A",X"03", + X"4B",X"11",X"40",X"00",X"19",X"22",X"03",X"4B",X"2A",X"05",X"4B",X"11",X"C0",X"FF",X"19",X"22", + X"05",X"4B",X"3A",X"02",X"4B",X"3C",X"FE",X"06",X"38",X"1A",X"11",X"D3",X"45",X"ED",X"53",X"05", + X"4B",X"21",X"13",X"46",X"22",X"03",X"4B",X"3A",X"01",X"4B",X"3C",X"FE",X"07",X"38",X"01",X"AF", + X"32",X"01",X"4B",X"AF",X"32",X"02",X"4B",X"18",X"07",X"05",X"04",X"1D",X"17",X"03",X"14",X"15", + X"3A",X"07",X"4B",X"B7",X"28",X"07",X"3D",X"32",X"07",X"4B",X"C3",X"A1",X"3C",X"3E",X"02",X"32", + X"07",X"4B",X"3E",X"10",X"CD",X"4B",X"3C",X"3A",X"08",X"4B",X"3C",X"FE",X"04",X"38",X"01",X"AF", + X"32",X"08",X"4B",X"3E",X"0E",X"CD",X"4B",X"3C",X"C3",X"A1",X"3C",X"F5",X"21",X"78",X"44",X"3A", + X"08",X"4B",X"06",X"1A",X"B7",X"28",X"07",X"05",X"3D",X"CD",X"79",X"90",X"18",X"F6",X"F1",X"0E", + X"01",X"0D",X"20",X"03",X"0E",X"04",X"77",X"05",X"28",X"05",X"CD",X"79",X"90",X"18",X"F2",X"2B", + X"06",X"06",X"0D",X"20",X"03",X"0E",X"04",X"77",X"05",X"28",X"03",X"2B",X"18",X"F4",X"11",X"E0", + X"FF",X"19",X"06",X"19",X"0D",X"20",X"03",X"0E",X"04",X"77",X"05",X"28",X"06",X"11",X"E0",X"FF", + X"19",X"18",X"F1",X"23",X"06",X"06",X"0D",X"20",X"03",X"0E",X"04",X"77",X"05",X"C8",X"23",X"18", + X"F5",X"3A",X"0A",X"4B",X"FE",X"09",X"D2",X"59",X"3B",X"3A",X"09",X"4B",X"B7",X"28",X"07",X"3D", + X"32",X"09",X"4B",X"C3",X"59",X"3B",X"3E",X"05",X"32",X"09",X"4B",X"3A",X"0B",X"4B",X"B7",X"20", + X"16",X"21",X"EB",X"3D",X"CD",X"08",X"3D",X"21",X"3A",X"3E",X"CD",X"08",X"3D",X"3A",X"0B",X"4B", + X"3C",X"32",X"0B",X"4B",X"C3",X"59",X"3B",X"3A",X"0A",X"4B",X"21",X"EB",X"3D",X"CD",X"1D",X"94", + X"EB",X"5E",X"23",X"56",X"23",X"EB",X"06",X"1B",X"7E",X"B7",X"28",X"01",X"34",X"CD",X"79",X"90", + X"10",X"F6",X"3A",X"0B",X"4B",X"3C",X"FE",X"04",X"38",X"08",X"3A",X"0A",X"4B",X"3C",X"32",X"0A", + X"4B",X"AF",X"32",X"0B",X"4B",X"C3",X"59",X"3B",X"3A",X"0A",X"4B",X"CD",X"1D",X"94",X"EB",X"5E", + X"23",X"56",X"23",X"EB",X"1A",X"FE",X"FF",X"C8",X"CB",X"7F",X"20",X"0C",X"47",X"13",X"1A",X"77", + X"CD",X"79",X"90",X"10",X"F8",X"13",X"18",X"EC",X"CB",X"BF",X"47",X"13",X"1A",X"77",X"CD",X"79", + X"90",X"10",X"FA",X"13",X"C3",X"14",X"3D",X"98",X"40",X"02",X"25",X"5C",X"7E",X"7E",X"7E",X"7F", + X"80",X"97",X"40",X"02",X"13",X"70",X"71",X"75",X"80",X"B6",X"40",X"02",X"12",X"72",X"76",X"00", + X"23",X"7E",X"76",X"77",X"80",X"D5",X"40",X"02",X"22",X"73",X"74",X"00",X"31",X"70",X"80",X"38", + X"41",X"14",X"25",X"5C",X"7E",X"78",X"7E",X"79",X"80",X"37",X"41",X"14",X"13",X"70",X"70",X"75", + X"00",X"22",X"7E",X"77",X"00",X"32",X"70",X"70",X"80",X"95",X"41",X"14",X"22",X"7C",X"79",X"80", + X"D8",X"41",X"03",X"25",X"5C",X"7E",X"78",X"7E",X"7F",X"80",X"D7",X"41",X"03",X"13",X"70",X"70", + X"7D",X"80",X"D5",X"41",X"03",X"12",X"70",X"7D",X"80",X"D3",X"41",X"03",X"13",X"70",X"70",X"7D", + X"80",X"72",X"42",X"04",X"05",X"79",X"7E",X"78",X"78",X"73",X"00",X"11",X"71",X"00",X"21",X"77", + X"80",X"B8",X"42",X"04",X"22",X"71",X"72",X"80",X"D8",X"42",X"04",X"25",X"75",X"76",X"76",X"7E", + X"79",X"80",X"75",X"42",X"04",X"12",X"70",X"70",X"80",X"12",X"43",X"05",X"05",X"79",X"7E",X"7E", + X"78",X"73",X"00",X"11",X"75",X"00",X"22",X"7A",X"72",X"80",X"54",X"43",X"05",X"03",X"77",X"7A", + X"73",X"00",X"11",X"75",X"00",X"24",X"76",X"7E",X"7E",X"79",X"FF",X"FD",X"3D",X"0A",X"3E",X"17", + X"3E",X"1C",X"3E",X"21",X"3E",X"26",X"3E",X"2B",X"3E",X"30",X"3E",X"35",X"3E",X"47",X"40",X"82", + X"84",X"01",X"8C",X"94",X"00",X"01",X"15",X"83",X"84",X"FF",X"48",X"40",X"84",X"84",X"01",X"8C", + X"8F",X"00",X"01",X"15",X"86",X"84",X"FF",X"49",X"40",X"9B",X"84",X"FF",X"4A",X"40",X"9B",X"84", + X"FF",X"4B",X"40",X"9B",X"84",X"FF",X"4C",X"40",X"9B",X"84",X"FF",X"4D",X"40",X"9B",X"84",X"FF", + X"4E",X"40",X"9B",X"84",X"FF",X"4F",X"40",X"9B",X"84",X"FF",X"4C",X"3E",X"58",X"3E",X"6A",X"3E", + X"88",X"3E",X"A7",X"3E",X"C5",X"3E",X"E3",X"3E",X"01",X"3F",X"20",X"3F",X"47",X"44",X"83",X"05", + X"94",X"00",X"04",X"03",X"05",X"03",X"05",X"FF",X"48",X"44",X"83",X"05",X"01",X"03",X"01",X"05", + X"8F",X"00",X"83",X"05",X"04",X"03",X"05",X"03",X"05",X"FF",X"49",X"44",X"08",X"05",X"03",X"05", + X"03",X"05",X"03",X"05",X"03",X"83",X"05",X"02",X"03",X"05",X"83",X"03",X"01",X"05",X"83",X"03", + X"83",X"05",X"04",X"03",X"05",X"03",X"05",X"FF",X"4A",X"44",X"0D",X"03",X"03",X"05",X"03",X"05", + X"03",X"05",X"03",X"05",X"03",X"05",X"03",X"05",X"83",X"03",X"01",X"05",X"83",X"03",X"01",X"05", + X"83",X"03",X"03",X"05",X"03",X"05",X"FF",X"4B",X"44",X"83",X"05",X"0A",X"03",X"05",X"03",X"05", + X"03",X"05",X"03",X"05",X"03",X"05",X"83",X"03",X"01",X"05",X"83",X"03",X"01",X"05",X"83",X"03", + X"03",X"05",X"05",X"03",X"FF",X"4C",X"44",X"01",X"05",X"83",X"03",X"83",X"05",X"05",X"03",X"05", + X"03",X"05",X"03",X"83",X"05",X"01",X"03",X"83",X"05",X"01",X"03",X"83",X"05",X"04",X"03",X"05", + X"03",X"05",X"FF",X"4D",X"44",X"01",X"05",X"83",X"03",X"83",X"05",X"0E",X"03",X"05",X"03",X"05", + X"03",X"05",X"03",X"05",X"03",X"05",X"03",X"05",X"03",X"05",X"83",X"03",X"03",X"05",X"03",X"05", + X"FF",X"4E",X"44",X"15",X"05",X"03",X"05",X"03",X"05",X"03",X"05",X"03",X"05",X"03",X"05",X"03", + X"05",X"03",X"05",X"03",X"05",X"03",X"05",X"03",X"05",X"83",X"03",X"03",X"05",X"03",X"05",X"FF", + X"4F",X"44",X"83",X"05",X"05",X"03",X"05",X"03",X"05",X"03",X"83",X"05",X"01",X"03",X"83",X"05", + X"01",X"03",X"83",X"05",X"01",X"03",X"83",X"05",X"01",X"03",X"83",X"05",X"FF",X"FF",X"FF",X"FF", + X"31",X"E0",X"4D",X"21",X"C0",X"4A",X"06",X"0F",X"CF",X"3E",X"23",X"06",X"01",X"FF",X"FD",X"21", + X"C0",X"4A",X"06",X"05",X"C5",X"FD",X"7E",X"00",X"B7",X"28",X"06",X"FD",X"35",X"00",X"CC",X"6B", + X"3F",X"01",X"03",X"00",X"FD",X"09",X"C1",X"10",X"EB",X"18",X"DE",X"FD",X"7E",X"01",X"CD",X"EA", + X"91",X"CD",X"1E",X"92",X"CD",X"83",X"26",X"38",X"10",X"E5",X"FD",X"7E",X"02",X"E6",X"07",X"CD", + X"87",X"95",X"E1",X"01",X"02",X"02",X"CD",X"5C",X"90",X"FD",X"E5",X"E1",X"06",X"03",X"CF",X"C9", + X"FD",X"E5",X"FD",X"21",X"C0",X"4A",X"06",X"05",X"FD",X"7E",X"00",X"B7",X"28",X"0D",X"FD",X"23", + X"FD",X"23",X"FD",X"23",X"10",X"F2",X"FD",X"E1",X"C9",X"10",X"ED",X"01",X"68",X"48",X"7E",X"B7", + X"ED",X"42",X"FD",X"36",X"00",X"12",X"FD",X"75",X"01",X"FD",X"77",X"02",X"FD",X"E1",X"C9",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..6c152cb1 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,790 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 12287) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"31",X"E0",X"4E",X"3A",X"AA",X"49",X"FE",X"03",X"30",X"03",X"3E",X"60",X"FF",X"21",X"45",X"48", + X"06",X"0A",X"CF",X"21",X"00",X"4A",X"06",X"20",X"CF",X"FD",X"21",X"00",X"4A",X"CD",X"A6",X"82", + X"FD",X"21",X"10",X"4A",X"CD",X"A6",X"82",X"29",X"FD",X"75",X"0E",X"FD",X"74",X"0F",X"3E",X"23", + X"06",X"01",X"FF",X"FD",X"21",X"00",X"4A",X"DD",X"21",X"45",X"48",X"CD",X"AB",X"85",X"3A",X"01", + X"48",X"CB",X"47",X"28",X"2E",X"DD",X"E5",X"E1",X"06",X"0A",X"CF",X"3E",X"23",X"06",X"01",X"FF", + X"3A",X"01",X"48",X"CB",X"47",X"20",X"F4",X"11",X"46",X"48",X"21",X"03",X"4A",X"01",X"04",X"00", + X"ED",X"B0",X"11",X"4B",X"48",X"21",X"13",X"4A",X"01",X"04",X"00",X"ED",X"B0",X"DD",X"36",X"00", + X"01",X"18",X"BB",X"C5",X"FD",X"7E",X"00",X"E6",X"0F",X"21",X"8C",X"80",X"E5",X"DF",X"B1",X"80", + X"CB",X"81",X"34",X"81",X"45",X"81",X"56",X"81",X"94",X"81",X"64",X"81",X"DD",X"E5",X"E1",X"23", + X"FD",X"E5",X"D1",X"13",X"13",X"13",X"01",X"04",X"00",X"ED",X"B0",X"DD",X"36",X"00",X"00",X"01", + X"05",X"00",X"DD",X"09",X"01",X"10",X"00",X"FD",X"09",X"C1",X"05",X"C2",X"73",X"80",X"C3",X"2E", + X"80",X"FD",X"6E",X"0E",X"FD",X"66",X"0F",X"7D",X"B4",X"28",X"08",X"2B",X"FD",X"75",X"0E",X"FD", + X"74",X"0F",X"C9",X"3A",X"01",X"48",X"CB",X"7F",X"20",X"05",X"3E",X"15",X"C3",X"03",X"81",X"11", + X"00",X"00",X"21",X"68",X"48",X"ED",X"5F",X"E6",X"7F",X"06",X"00",X"4F",X"09",X"7E",X"FE",X"03", + X"28",X"18",X"23",X"E5",X"01",X"F8",X"48",X"AF",X"ED",X"42",X"E1",X"20",X"F0",X"3C",X"BA",X"28", + X"06",X"14",X"21",X"68",X"48",X"18",X"E6",X"3E",X"60",X"FF",X"CB",X"DE",X"AF",X"01",X"68",X"48", + X"ED",X"42",X"7D",X"CD",X"EA",X"91",X"DD",X"36",X"01",X"18",X"DD",X"74",X"02",X"DD",X"36",X"03", + X"16",X"DD",X"75",X"04",X"DD",X"36",X"00",X"00",X"CD",X"1E",X"92",X"3E",X"29",X"1E",X"51",X"01", + X"02",X"02",X"CD",X"5C",X"90",X"FD",X"36",X"00",X"01",X"FD",X"36",X"07",X"0A",X"CD",X"A6",X"82", + X"CD",X"83",X"82",X"C9",X"FD",X"CB",X"00",X"76",X"C2",X"88",X"85",X"FD",X"7E",X"08",X"B7",X"C2", + X"46",X"82",X"C3",X"72",X"84",X"FD",X"CB",X"00",X"76",X"C2",X"88",X"85",X"FD",X"7E",X"08",X"B7", + X"C2",X"46",X"82",X"C3",X"CE",X"82",X"FD",X"CB",X"00",X"6E",X"28",X"03",X"C3",X"9E",X"85",X"CD", + X"7A",X"81",X"18",X"E1",X"FD",X"CB",X"00",X"6E",X"28",X"03",X"C3",X"9E",X"85",X"CD",X"7A",X"81", + X"FD",X"7E",X"08",X"B7",X"C2",X"46",X"82",X"C3",X"94",X"83",X"FD",X"7E",X"07",X"B7",X"20",X"10", + X"FD",X"36",X"07",X"06",X"3E",X"36",X"DD",X"BE",X"01",X"20",X"02",X"3E",X"37",X"DD",X"77",X"01", + X"FD",X"35",X"07",X"C9",X"FD",X"7E",X"07",X"B7",X"28",X"02",X"18",X"10",X"FD",X"36",X"07",X"06", + X"3E",X"37",X"DD",X"BE",X"01",X"20",X"02",X"3E",X"38",X"DD",X"77",X"01",X"FD",X"35",X"07",X"FD", + X"7E",X"08",X"B7",X"C2",X"46",X"82",X"21",X"00",X"02",X"FD",X"75",X"09",X"FD",X"74",X"0A",X"21", + X"FF",X"FF",X"FD",X"75",X"01",X"FD",X"74",X"02",X"C3",X"46",X"82",X"FD",X"7E",X"07",X"B7",X"28", + X"04",X"FD",X"35",X"07",X"C9",X"DD",X"34",X"01",X"3E",X"1E",X"DD",X"BE",X"01",X"28",X"05",X"FD", + X"36",X"07",X"0A",X"C9",X"DD",X"36",X"01",X"36",X"DD",X"36",X"03",X"51",X"DD",X"66",X"02",X"DD", + X"6E",X"04",X"E5",X"CD",X"AC",X"91",X"CB",X"9E",X"CB",X"7E",X"E1",X"20",X"0D",X"CD",X"1E",X"92", + X"01",X"02",X"02",X"1E",X"16",X"3E",X"00",X"CD",X"0C",X"90",X"DD",X"7E",X"04",X"FD",X"36",X"00", + X"03",X"FE",X"50",X"38",X"04",X"FD",X"36",X"00",X"02",X"FD",X"CB",X"00",X"FE",X"DD",X"7E",X"02", + X"FE",X"88",X"D0",X"FD",X"CB",X"00",X"BE",X"C9",X"FD",X"6E",X"01",X"FD",X"66",X"02",X"29",X"38", + X"07",X"FD",X"75",X"01",X"FD",X"74",X"02",X"C9",X"F5",X"11",X"00",X"00",X"ED",X"5A",X"FD",X"75", + X"01",X"FD",X"74",X"02",X"F1",X"C9",X"CD",X"28",X"82",X"D0",X"FD",X"4E",X"09",X"FD",X"46",X"0A", + X"DD",X"66",X"02",X"DD",X"6E",X"04",X"FD",X"CB",X"00",X"7E",X"28",X"04",X"79",X"ED",X"44",X"4F", + X"CD",X"A5",X"91",X"DD",X"74",X"02",X"DD",X"75",X"04",X"FD",X"35",X"08",X"DD",X"7E",X"04",X"FE", + X"02",X"C0",X"DD",X"E5",X"E1",X"06",X"05",X"CF",X"FD",X"E5",X"E1",X"06",X"0E",X"CF",X"DD",X"36", + X"00",X"00",X"C9",X"21",X"9A",X"82",X"3A",X"AA",X"49",X"FE",X"06",X"38",X"02",X"3E",X"06",X"3D", + X"CD",X"1D",X"94",X"FD",X"73",X"01",X"FD",X"72",X"02",X"C9",X"AA",X"AA",X"AA",X"AA",X"AA",X"AA", + X"D6",X"D6",X"AA",X"AA",X"EE",X"EE",X"3A",X"AA",X"49",X"FE",X"08",X"38",X"02",X"3E",X"08",X"3D", + X"21",X"BE",X"82",X"CD",X"1D",X"94",X"EB",X"FD",X"75",X"0E",X"FD",X"74",X"0F",X"C9",X"5A",X"02", + X"5A",X"02",X"E1",X"01",X"70",X"01",X"30",X"01",X"F0",X"00",X"B4",X"00",X"78",X"00",X"FD",X"6E", + X"0B",X"FD",X"66",X"0C",X"7D",X"B4",X"28",X"2B",X"7E",X"FE",X"FF",X"28",X"15",X"23",X"5E",X"23", + X"56",X"23",X"FD",X"77",X"09",X"FD",X"73",X"0A",X"FD",X"72",X"08",X"FD",X"75",X"0B",X"FD",X"74", + X"0C",X"C9",X"3A",X"2C",X"48",X"CB",X"7F",X"20",X"0A",X"CD",X"9A",X"2D",X"28",X"05",X"3E",X"06", + X"CD",X"40",X"03",X"FD",X"7E",X"00",X"E6",X"0F",X"FE",X"04",X"C2",X"3C",X"85",X"06",X"03",X"3A", + X"AA",X"49",X"FE",X"05",X"38",X"02",X"06",X"00",X"FD",X"7E",X"0D",X"B8",X"DA",X"B7",X"83",X"3A", + X"42",X"48",X"C6",X"F0",X"5F",X"C6",X"20",X"57",X"DD",X"7E",X"02",X"BB",X"DA",X"B7",X"83",X"BA", + X"D2",X"B7",X"83",X"DD",X"7E",X"02",X"E6",X"0F",X"CA",X"94",X"83",X"FD",X"36",X"00",X"06",X"DD", + X"5E",X"02",X"3A",X"42",X"48",X"93",X"28",X"1C",X"30",X"0B",X"DD",X"7E",X"02",X"E6",X"0F",X"FD", + X"CB",X"00",X"FE",X"18",X"1A",X"DD",X"7E",X"02",X"E6",X"0F",X"ED",X"44",X"E6",X"0F",X"FD",X"CB", + X"00",X"BE",X"18",X"0B",X"DD",X"7E",X"02",X"E6",X"0F",X"CB",X"5F",X"28",X"DD",X"18",X"E6",X"FD", + X"CB",X"00",X"EE",X"FD",X"77",X"08",X"FD",X"36",X"07",X"04",X"DD",X"36",X"01",X"36",X"21",X"01", + X"00",X"FD",X"75",X"09",X"FD",X"74",X"0A",X"21",X"00",X"00",X"FD",X"75",X"0B",X"FD",X"74",X"0C", + X"CD",X"83",X"82",X"C9",X"21",X"00",X"FF",X"FD",X"75",X"09",X"FD",X"74",X"0A",X"FD",X"36",X"08", + X"00",X"DD",X"36",X"01",X"37",X"FD",X"36",X"00",X"05",X"FD",X"36",X"07",X"06",X"CD",X"9A",X"2D", + X"C8",X"3E",X"07",X"CD",X"40",X"03",X"C9",X"06",X"05",X"3E",X"48",X"0E",X"00",X"DD",X"BE",X"04", + X"30",X"0C",X"C6",X"10",X"F5",X"79",X"C6",X"08",X"4F",X"F1",X"10",X"F1",X"0E",X"20",X"06",X"00", + X"21",X"25",X"08",X"09",X"ED",X"5F",X"E6",X"03",X"CD",X"1D",X"94",X"EB",X"06",X"00",X"7E",X"FD", + X"CB",X"00",X"7E",X"28",X"22",X"ED",X"44",X"5F",X"16",X"FF",X"E5",X"DD",X"6E",X"02",X"26",X"00", + X"19",X"7D",X"E1",X"30",X"04",X"FE",X"30",X"30",X"30",X"3E",X"01",X"B8",X"CA",X"30",X"85",X"06", + X"01",X"FD",X"CB",X"00",X"BE",X"18",X"D7",X"E5",X"DD",X"6E",X"02",X"26",X"00",X"5F",X"16",X"00", + X"19",X"7D",X"CB",X"44",X"E1",X"20",X"04",X"FE",X"E1",X"38",X"0E",X"3E",X"01",X"B8",X"CA",X"30", + X"85",X"06",X"01",X"FD",X"CB",X"00",X"FE",X"18",X"B5",X"FD",X"7E",X"00",X"E6",X"80",X"F6",X"03", + X"FD",X"77",X"00",X"FD",X"34",X"0D",X"23",X"4E",X"23",X"46",X"23",X"56",X"23",X"5E",X"23",X"7E", + X"23",X"FD",X"75",X"0B",X"FD",X"74",X"0C",X"FD",X"72",X"09",X"FD",X"73",X"0A",X"FD",X"77",X"08", + X"FD",X"71",X"01",X"FD",X"70",X"02",X"FD",X"36",X"07",X"04",X"FD",X"CB",X"00",X"F6",X"DD",X"36", + X"01",X"36",X"3A",X"2C",X"48",X"CB",X"7F",X"C0",X"CD",X"9A",X"2D",X"C8",X"3E",X"06",X"CD",X"40", + X"03",X"C9",X"FD",X"6E",X"0B",X"FD",X"66",X"0C",X"7D",X"B4",X"28",X"3A",X"7E",X"FE",X"FF",X"28", + X"15",X"23",X"5E",X"23",X"56",X"23",X"FD",X"77",X"09",X"FD",X"73",X"0A",X"FD",X"72",X"08",X"FD", + X"75",X"0B",X"FD",X"74",X"0C",X"C9",X"CD",X"9A",X"2D",X"28",X"05",X"3E",X"06",X"CD",X"40",X"03", + X"21",X"00",X"00",X"FD",X"75",X"0B",X"FD",X"74",X"0C",X"FD",X"CB",X"00",X"EE",X"FD",X"36",X"07", + X"04",X"DD",X"36",X"01",X"36",X"C9",X"21",X"AB",X"09",X"ED",X"5F",X"E6",X"03",X"CD",X"17",X"94", + X"5E",X"23",X"56",X"EB",X"7E",X"23",X"DD",X"86",X"04",X"FE",X"40",X"30",X"12",X"21",X"00",X"00", + X"FD",X"75",X"0B",X"FD",X"74",X"0C",X"FD",X"36",X"08",X"00",X"FD",X"36",X"00",X"03",X"C9",X"06", + X"00",X"7E",X"FD",X"CB",X"00",X"7E",X"28",X"26",X"ED",X"44",X"5F",X"16",X"FF",X"E5",X"DD",X"6E", + X"02",X"26",X"00",X"19",X"7D",X"E1",X"30",X"09",X"DD",X"7E",X"02",X"83",X"FE",X"30",X"D2",X"36", + X"84",X"3E",X"01",X"B8",X"28",X"2A",X"06",X"01",X"FD",X"CB",X"00",X"BE",X"18",X"D3",X"E5",X"DD", + X"6E",X"02",X"26",X"00",X"16",X"00",X"5F",X"19",X"7D",X"CB",X"44",X"E1",X"20",X"05",X"FE",X"E1", + X"DA",X"36",X"84",X"3E",X"01",X"B8",X"28",X"08",X"06",X"01",X"FD",X"CB",X"00",X"FE",X"18",X"B1", + X"21",X"36",X"85",X"C3",X"37",X"84",X"AA",X"AA",X"00",X"00",X"08",X"FF",X"ED",X"5F",X"E6",X"1F", + X"C6",X"10",X"5F",X"DD",X"7E",X"02",X"FD",X"CB",X"00",X"7E",X"FD",X"36",X"00",X"04",X"28",X"2B", + X"93",X"FE",X"30",X"38",X"2D",X"FD",X"CB",X"00",X"FE",X"DD",X"36",X"01",X"36",X"FD",X"73",X"08", + X"21",X"01",X"00",X"FD",X"75",X"09",X"FD",X"74",X"0A",X"21",X"00",X"00",X"FD",X"75",X"0B",X"FD", + X"74",X"0C",X"FD",X"CB",X"00",X"EE",X"FD",X"36",X"07",X"04",X"C9",X"83",X"38",X"D7",X"FE",X"E1", + X"30",X"D3",X"DD",X"36",X"01",X"36",X"18",X"D5",X"FD",X"35",X"07",X"C0",X"3E",X"9F",X"FD",X"A6", + X"00",X"FD",X"CB",X"00",X"76",X"FD",X"77",X"00",X"C8",X"DD",X"36",X"01",X"38",X"C9",X"FD",X"35", + X"07",X"C0",X"FD",X"CB",X"00",X"AE",X"DD",X"36",X"01",X"36",X"C9",X"3A",X"AA",X"49",X"FE",X"06", + X"38",X"02",X"3E",X"06",X"3D",X"21",X"BE",X"85",X"16",X"00",X"5F",X"19",X"46",X"C9",X"01",X"01", + X"01",X"01",X"01",X"02",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"20",X"4F",X"21",X"4A",X"48",X"06",X"14",X"CF",X"21",X"20",X"4A",X"06",X"3F",X"CF",X"CD", + X"70",X"89",X"0E",X"00",X"3A",X"AA",X"49",X"FE",X"0A",X"38",X"04",X"D6",X"09",X"18",X"F8",X"FE", + X"04",X"38",X"05",X"D6",X"03",X"0C",X"18",X"F7",X"3D",X"32",X"24",X"4A",X"79",X"32",X"23",X"4A", + X"3E",X"23",X"06",X"01",X"FF",X"CD",X"C4",X"8A",X"FD",X"21",X"27",X"4A",X"DD",X"21",X"4F",X"48", + X"CD",X"91",X"8E",X"21",X"97",X"49",X"3A",X"01",X"48",X"CB",X"47",X"28",X"30",X"DD",X"E5",X"E1", + X"06",X"14",X"CF",X"3E",X"23",X"06",X"01",X"FF",X"3A",X"01",X"48",X"CB",X"47",X"20",X"F4",X"11", + X"04",X"00",X"FD",X"19",X"11",X"4F",X"48",X"06",X"04",X"C5",X"FD",X"E5",X"E1",X"13",X"01",X"04", + X"00",X"ED",X"B0",X"01",X"0E",X"00",X"FD",X"09",X"C1",X"10",X"EE",X"18",X"B3",X"C5",X"E5",X"FD", + X"7E",X"00",X"E6",X"0F",X"B7",X"CA",X"57",X"87",X"3D",X"21",X"96",X"86",X"E5",X"DF",X"BB",X"87", + X"FD",X"87",X"FD",X"87",X"CC",X"88",X"FD",X"7E",X"00",X"B7",X"28",X"15",X"FE",X"04",X"30",X"11", + X"FD",X"7E",X"08",X"B7",X"28",X"05",X"FD",X"35",X"08",X"18",X"06",X"CD",X"29",X"89",X"CD",X"E6", + X"8B",X"DD",X"E5",X"D1",X"13",X"FD",X"E5",X"E1",X"23",X"23",X"23",X"23",X"01",X"04",X"00",X"ED", + X"B0",X"DD",X"36",X"00",X"00",X"E1",X"23",X"23",X"11",X"05",X"00",X"DD",X"19",X"11",X"0E",X"00", + X"FD",X"19",X"C1",X"05",X"C2",X"7D",X"86",X"3A",X"20",X"4A",X"B7",X"20",X"11",X"ED",X"5F",X"32", + X"20",X"4A",X"F5",X"CD",X"9A",X"2D",X"28",X"05",X"3E",X"11",X"CD",X"40",X"03",X"F1",X"3D",X"32", + X"20",X"4A",X"2A",X"25",X"4A",X"7D",X"B4",X"CA",X"30",X"86",X"2B",X"7D",X"B4",X"28",X"33",X"AF", + X"B4",X"20",X"29",X"7D",X"FE",X"40",X"30",X"24",X"E6",X"03",X"20",X"20",X"FD",X"21",X"27",X"4A", + X"06",X"05",X"3E",X"02",X"FD",X"BE",X"00",X"20",X"0C",X"3E",X"53",X"FD",X"BE",X"06",X"20",X"02", + X"3E",X"52",X"FD",X"77",X"06",X"11",X"0E",X"00",X"FD",X"19",X"10",X"E6",X"22",X"25",X"4A",X"C3", + X"30",X"86",X"FD",X"21",X"27",X"4A",X"06",X"05",X"FD",X"7E",X"00",X"FE",X"02",X"20",X"0E",X"C5", + X"3E",X"84",X"CD",X"40",X"03",X"C1",X"FD",X"36",X"00",X"03",X"CD",X"03",X"89",X"11",X"0E",X"00", + X"FD",X"19",X"10",X"E4",X"C3",X"30",X"86",X"5E",X"23",X"56",X"7B",X"B2",X"28",X"07",X"1B",X"72", + X"2B",X"73",X"C3",X"96",X"86",X"11",X"00",X"01",X"72",X"2B",X"73",X"21",X"F9",X"8D",X"3A",X"21", + X"4A",X"E6",X"03",X"CD",X"16",X"94",X"7E",X"23",X"56",X"23",X"5E",X"23",X"4E",X"FD",X"77",X"01", + X"FD",X"71",X"09",X"FD",X"72",X"05",X"FD",X"73",X"07",X"CD",X"03",X"89",X"CD",X"09",X"8E",X"CD", + X"4D",X"8E",X"3A",X"01",X"48",X"CB",X"7F",X"20",X"16",X"3A",X"21",X"4A",X"21",X"4D",X"0A",X"CD", + X"17",X"94",X"5E",X"23",X"56",X"FD",X"73",X"0A",X"FD",X"72",X"0B",X"3E",X"03",X"18",X"02",X"3E", + X"01",X"FD",X"77",X"00",X"21",X"21",X"4A",X"34",X"C3",X"96",X"86",X"FD",X"5E",X"0A",X"FD",X"56", + X"0B",X"7B",X"B2",X"28",X"07",X"1B",X"FD",X"73",X"0A",X"FD",X"72",X"0B",X"CD",X"19",X"8B",X"D0", + X"CD",X"37",X"8B",X"C2",X"DD",X"88",X"CD",X"6D",X"8D",X"5F",X"FD",X"7E",X"01",X"E6",X"03",X"CD", + X"31",X"94",X"A3",X"CA",X"04",X"8C",X"FD",X"7E",X"09",X"B7",X"C2",X"DD",X"88",X"FD",X"5E",X"0A", + X"FD",X"56",X"0B",X"7B",X"B2",X"C2",X"04",X"8C",X"FD",X"36",X"00",X"03",X"C9",X"3A",X"02",X"48", + X"CB",X"77",X"28",X"75",X"FD",X"E5",X"DD",X"E5",X"FD",X"E5",X"DD",X"E1",X"FD",X"21",X"A0",X"4A", + X"06",X"03",X"FD",X"7E",X"00",X"FE",X"02",X"C2",X"6E",X"88",X"FD",X"7E",X"03",X"C6",X"F8",X"57", + X"C6",X"50",X"5F",X"DD",X"7E",X"05",X"BA",X"DA",X"6E",X"88",X"BB",X"D2",X"6E",X"88",X"FD",X"7E", + X"04",X"C6",X"B8",X"57",X"C6",X"50",X"5F",X"DD",X"7E",X"07",X"BA",X"38",X"31",X"BB",X"30",X"2E", + X"DD",X"E1",X"FD",X"E1",X"CD",X"9A",X"2D",X"28",X"05",X"3E",X"0C",X"CD",X"40",X"03",X"FD",X"36", + X"00",X"04",X"FD",X"36",X"01",X"40",X"FD",X"36",X"06",X"03",X"FD",X"36",X"04",X"35",X"21",X"6D", + X"88",X"CD",X"BA",X"2C",X"C2",X"D5",X"2C",X"C9",X"00",X"00",X"00",X"01",X"00",X"00",X"11",X"0A", + X"00",X"FD",X"19",X"10",X"9D",X"DD",X"E1",X"FD",X"E1",X"CD",X"19",X"8B",X"D0",X"3E",X"03",X"FD", + X"BE",X"00",X"20",X"07",X"FD",X"CB",X"01",X"6E",X"C4",X"F6",X"8C",X"CD",X"37",X"8B",X"C2",X"DD", + X"88",X"3A",X"01",X"48",X"CB",X"7F",X"CA",X"9C",X"8E",X"FD",X"7E",X"00",X"E6",X"0F",X"FE",X"02", + X"1E",X"0F",X"20",X"04",X"CD",X"C4",X"8E",X"5F",X"D5",X"CD",X"B5",X"8D",X"D1",X"A3",X"5F",X"D5", + X"CD",X"94",X"8D",X"D1",X"A3",X"5F",X"FD",X"7E",X"01",X"E6",X"03",X"CD",X"31",X"94",X"A3",X"CA", + X"2C",X"8C",X"FD",X"7E",X"09",X"B7",X"CA",X"2C",X"8C",X"C3",X"DD",X"88",X"FD",X"35",X"01",X"C0", + X"DD",X"E5",X"E1",X"06",X"05",X"CF",X"FD",X"E5",X"E1",X"06",X"0E",X"CF",X"C9",X"FD",X"35",X"09", + X"21",X"89",X"8E",X"FD",X"7E",X"01",X"E6",X"03",X"CD",X"17",X"94",X"4E",X"23",X"46",X"FD",X"66", + X"05",X"FD",X"6E",X"07",X"CD",X"A5",X"91",X"FD",X"74",X"05",X"FD",X"75",X"07",X"C9",X"21",X"19", + X"89",X"18",X"03",X"21",X"21",X"89",X"FD",X"7E",X"01",X"E6",X"03",X"CD",X"1D",X"94",X"FD",X"73", + X"04",X"FD",X"72",X"06",X"FD",X"CB",X"01",X"BE",X"C9",X"30",X"53",X"AD",X"53",X"30",X"53",X"2D", + X"53",X"2B",X"52",X"A8",X"52",X"2B",X"52",X"28",X"52",X"21",X"68",X"89",X"3E",X"02",X"FD",X"BE", + X"00",X"28",X"03",X"21",X"60",X"89",X"FD",X"7E",X"01",X"E6",X"03",X"CD",X"1D",X"94",X"FD",X"CB", + X"01",X"7E",X"20",X"0E",X"7A",X"FD",X"BE",X"04",X"28",X"0E",X"FD",X"CB",X"01",X"BE",X"FD",X"34", + X"04",X"C9",X"7B",X"FD",X"BE",X"04",X"28",X"F2",X"FD",X"CB",X"01",X"FE",X"FD",X"35",X"04",X"C9", + X"2B",X"2C",X"A8",X"AA",X"2B",X"2C",X"28",X"2A",X"30",X"31",X"AD",X"AF",X"30",X"31",X"2D",X"2F", + X"3A",X"AA",X"49",X"FE",X"0A",X"38",X"02",X"3E",X"0A",X"3D",X"5F",X"87",X"83",X"5F",X"3A",X"A4", + X"49",X"FE",X"02",X"38",X"02",X"3E",X"02",X"83",X"21",X"98",X"89",X"CD",X"1D",X"94",X"EB",X"11", + X"97",X"49",X"01",X"08",X"00",X"ED",X"B0",X"C9",X"D4",X"89",X"DC",X"89",X"E4",X"89",X"EC",X"89", + X"F4",X"89",X"FC",X"89",X"04",X"8A",X"0C",X"8A",X"14",X"8A",X"1C",X"8A",X"24",X"8A",X"2C",X"8A", + X"34",X"8A",X"3C",X"8A",X"44",X"8A",X"4C",X"8A",X"54",X"8A",X"5C",X"8A",X"64",X"8A",X"6C",X"8A", + X"74",X"8A",X"7C",X"8A",X"84",X"8A",X"8C",X"8A",X"94",X"8A",X"9C",X"8A",X"A4",X"8A",X"AC",X"8A", + X"B4",X"8A",X"BC",X"8A",X"F0",X"00",X"58",X"02",X"84",X"03",X"B0",X"04",X"00",X"00",X"2C",X"01", + X"58",X"02",X"84",X"03",X"00",X"00",X"00",X"00",X"58",X"02",X"84",X"03",X"B4",X"00",X"E0",X"01", + X"D0",X"02",X"84",X"03",X"00",X"00",X"F0",X"00",X"E0",X"01",X"D0",X"02",X"00",X"00",X"00",X"00", + X"E0",X"01",X"D0",X"02",X"B4",X"00",X"2C",X"01",X"58",X"02",X"84",X"03",X"00",X"00",X"F0",X"00", + X"F0",X"00",X"58",X"02",X"00",X"00",X"00",X"00",X"F0",X"00",X"58",X"02",X"F0",X"00",X"E0",X"01", + X"D0",X"02",X"84",X"03",X"00",X"00",X"F0",X"00",X"E0",X"01",X"D0",X"02",X"00",X"00",X"00",X"00", + X"F0",X"00",X"E0",X"01",X"B4",X"00",X"68",X"01",X"D0",X"02",X"D0",X"02",X"00",X"00",X"68",X"01", + X"D0",X"02",X"84",X"03",X"00",X"00",X"00",X"00",X"68",X"01",X"D0",X"02",X"B4",X"00",X"84",X"03", + X"D0",X"05",X"08",X"07",X"00",X"00",X"2C",X"01",X"58",X"02",X"84",X"03",X"00",X"00",X"00",X"00", + X"2C",X"01",X"58",X"02",X"B4",X"00",X"E0",X"01",X"D0",X"02",X"B0",X"04",X"00",X"00",X"B4",X"00", + X"E0",X"01",X"58",X"02",X"00",X"00",X"00",X"00",X"B4",X"00",X"E0",X"01",X"B4",X"00",X"2C",X"01", + X"2C",X"01",X"2C",X"01",X"00",X"00",X"2C",X"01",X"58",X"02",X"84",X"03",X"00",X"00",X"00",X"00", + X"2C",X"01",X"58",X"02",X"B4",X"00",X"B4",X"00",X"2C",X"01",X"58",X"02",X"00",X"00",X"B4",X"00", + X"2C",X"01",X"58",X"02",X"00",X"00",X"00",X"00",X"B4",X"00",X"2C",X"01",X"00",X"00",X"00",X"00", + X"58",X"02",X"84",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"58",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"21",X"F6",X"8A",X"3A",X"AA",X"49",X"FE",X"02",X"30",X"03",X"21",X"FC", + X"8A",X"0E",X"00",X"E5",X"06",X"02",X"11",X"94",X"49",X"CD",X"80",X"90",X"E1",X"FE",X"01",X"28", + X"0E",X"0C",X"79",X"FE",X"03",X"38",X"04",X"0E",X"02",X"18",X"04",X"23",X"23",X"18",X"E4",X"79", + X"21",X"24",X"4A",X"86",X"77",X"C9",X"1E",X"00",X"28",X"00",X"3C",X"00",X"1E",X"00",X"3C",X"00", + X"3C",X"00",X"3A",X"24",X"4A",X"FE",X"04",X"38",X"02",X"3E",X"04",X"21",X"14",X"8B",X"16",X"00", + X"5F",X"19",X"7E",X"C9",X"20",X"10",X"08",X"08",X"08",X"FD",X"6E",X"02",X"FD",X"66",X"03",X"29", + X"38",X"07",X"FD",X"75",X"02",X"FD",X"74",X"03",X"C9",X"F5",X"11",X"00",X"00",X"ED",X"5A",X"FD", + X"75",X"02",X"FD",X"74",X"03",X"F1",X"C9",X"FD",X"7E",X"05",X"E6",X"0F",X"C0",X"FD",X"7E",X"07", + X"E6",X"0F",X"C0",X"C9",X"CD",X"24",X"94",X"21",X"86",X"8B",X"F5",X"FD",X"7E",X"00",X"FE",X"02", + X"28",X"03",X"21",X"B6",X"8B",X"F1",X"CD",X"16",X"94",X"FD",X"7E",X"01",X"E6",X"70",X"B6",X"FD", + X"77",X"01",X"23",X"7E",X"FD",X"77",X"04",X"3A",X"01",X"48",X"CB",X"7F",X"28",X"14",X"23",X"5E", + X"23",X"56",X"EB",X"ED",X"5F",X"E6",X"07",X"16",X"00",X"5F",X"19",X"7E",X"FD",X"77",X"09",X"CD", + X"DD",X"88",X"CD",X"E6",X"8B",X"C9",X"00",X"30",X"96",X"8B",X"01",X"AD",X"9E",X"8B",X"02",X"30", + X"A6",X"8B",X"03",X"2D",X"AE",X"8B",X"40",X"20",X"50",X"40",X"10",X"30",X"40",X"20",X"30",X"50", + X"40",X"20",X"10",X"40",X"30",X"20",X"40",X"20",X"30",X"40",X"50",X"10",X"40",X"30",X"30",X"50", + X"20",X"40",X"10",X"40",X"30",X"20",X"00",X"2B",X"C6",X"8B",X"01",X"A8",X"CE",X"8B",X"02",X"2B", + X"D6",X"8B",X"03",X"28",X"DE",X"8B",X"30",X"20",X"50",X"10",X"20",X"10",X"10",X"30",X"10",X"30", + X"40",X"20",X"10",X"30",X"20",X"10",X"30",X"20",X"10",X"40",X"50",X"10",X"20",X"10",X"20",X"10", + X"30",X"40",X"10",X"40",X"30",X"10",X"21",X"FC",X"8B",X"3A",X"AA",X"49",X"3D",X"FE",X"07",X"38", + X"02",X"3E",X"07",X"16",X"00",X"5F",X"19",X"7E",X"FD",X"77",X"08",X"C9",X"05",X"04",X"03",X"03", + X"03",X"03",X"03",X"03",X"CD",X"B5",X"8D",X"1E",X"0F",X"A3",X"5F",X"D5",X"CD",X"6D",X"8D",X"D1", + X"A3",X"5F",X"ED",X"5F",X"E6",X"03",X"CD",X"31",X"94",X"A3",X"C8",X"4F",X"3A",X"96",X"49",X"FE", + X"02",X"79",X"DA",X"44",X"8B",X"3E",X"0E",X"A3",X"C8",X"C3",X"44",X"8B",X"FD",X"7E",X"00",X"E6", + X"0F",X"FE",X"02",X"CA",X"23",X"8D",X"3A",X"E9",X"49",X"E6",X"07",X"FE",X"04",X"38",X"0E",X"FD", + X"CB",X"01",X"76",X"FD",X"CB",X"01",X"F6",X"28",X"68",X"FD",X"CB",X"01",X"B6",X"FD",X"CB",X"01", + X"46",X"28",X"13",X"1E",X"04",X"3A",X"44",X"48",X"B7",X"28",X"19",X"FD",X"BE",X"07",X"28",X"06", + X"30",X"12",X"1E",X"01",X"18",X"0E",X"1E",X"02",X"3A",X"42",X"48",X"FD",X"BE",X"05",X"28",X"E3", + X"30",X"02",X"1E",X"08",X"3A",X"44",X"48",X"FD",X"BE",X"07",X"28",X"13",X"3A",X"42",X"48",X"FD", + X"BE",X"05",X"28",X"0B",X"FD",X"CB",X"01",X"AE",X"D5",X"CD",X"09",X"8E",X"D1",X"18",X"12",X"FD", + X"CB",X"01",X"EE",X"20",X"0C",X"FD",X"36",X"0C",X"00",X"D5",X"CD",X"02",X"8B",X"FD",X"77",X"0D", + X"D1",X"D5",X"CD",X"B5",X"8D",X"D1",X"A3",X"5F",X"D5",X"CD",X"94",X"8D",X"D1",X"A3",X"C2",X"44", + X"8B",X"1E",X"0F",X"D5",X"CD",X"B5",X"8D",X"D1",X"A3",X"5F",X"D5",X"CD",X"94",X"8D",X"D1",X"A3", + X"CA",X"04",X"8C",X"5F",X"ED",X"5F",X"E6",X"07",X"47",X"ED",X"5F",X"CB",X"07",X"10",X"FC",X"E6", + X"03",X"CD",X"31",X"94",X"A3",X"C8",X"5F",X"3E",X"05",X"FD",X"CB",X"01",X"46",X"20",X"02",X"3E", + X"0A",X"A3",X"C2",X"44",X"8B",X"FD",X"CB",X"01",X"66",X"FD",X"CB",X"01",X"E6",X"C8",X"FD",X"CB", + X"01",X"A6",X"7B",X"C3",X"44",X"8B",X"FD",X"7E",X"0D",X"B7",X"28",X"04",X"FD",X"35",X"0D",X"C9", + X"FD",X"7E",X"0C",X"FE",X"03",X"C8",X"FD",X"36",X"0D",X"08",X"3C",X"FD",X"77",X"0C",X"21",X"1B", + X"8D",X"CD",X"1D",X"94",X"FD",X"73",X"02",X"FD",X"72",X"03",X"C9",X"D6",X"D6",X"EE",X"EE",X"FF", + X"FF",X"FF",X"FF",X"FD",X"CB",X"01",X"76",X"FD",X"CB",X"01",X"F6",X"FD",X"CB",X"01",X"B6",X"FD", + X"CB",X"01",X"46",X"28",X"0E",X"1E",X"01",X"3A",X"44",X"48",X"FD",X"BE",X"07",X"30",X"10",X"1E", + X"04",X"18",X"0C",X"1E",X"02",X"3A",X"42",X"48",X"FD",X"BE",X"05",X"38",X"02",X"1E",X"08",X"D5", + X"CD",X"C4",X"8E",X"D1",X"A3",X"5F",X"D5",X"CD",X"B5",X"8D",X"D1",X"A3",X"5F",X"D5",X"CD",X"94", + X"8D",X"D1",X"A3",X"C2",X"44",X"8B",X"CD",X"C4",X"8E",X"5F",X"C3",X"B3",X"8C",X"FD",X"66",X"05", + X"FD",X"6E",X"07",X"CD",X"1E",X"92",X"01",X"00",X"04",X"E5",X"F5",X"CD",X"D4",X"8D",X"F1",X"E1", + X"3E",X"02",X"BB",X"28",X"08",X"3E",X"03",X"BB",X"28",X"03",X"B7",X"18",X"01",X"3F",X"CB",X"11", + X"10",X"E7",X"79",X"C9",X"FD",X"66",X"05",X"FD",X"6E",X"07",X"CD",X"1E",X"92",X"3E",X"04",X"01", + X"00",X"04",X"E5",X"F5",X"CD",X"D4",X"8D",X"F1",X"E1",X"BB",X"CB",X"11",X"10",X"F4",X"79",X"B7", + X"C0",X"3E",X"01",X"18",X"EA",X"FD",X"66",X"05",X"FD",X"6E",X"07",X"CD",X"1E",X"92",X"01",X"00", + X"04",X"C5",X"E5",X"CD",X"D4",X"8D",X"E1",X"7B",X"FE",X"14",X"28",X"01",X"37",X"C1",X"CB",X"11", + X"10",X"EF",X"79",X"C9",X"E5",X"78",X"21",X"F1",X"8D",X"3D",X"CD",X"1D",X"94",X"E1",X"19",X"7C", + X"E6",X"03",X"F6",X"44",X"67",X"7D",X"E6",X"1F",X"FE",X"1C",X"38",X"03",X"21",X"00",X"44",X"5E", + X"C9",X"03",X"00",X"61",X"00",X"1E",X"00",X"C0",X"FF",X"03",X"00",X"30",X"10",X"01",X"10",X"00", + X"10",X"03",X"00",X"00",X"10",X"01",X"10",X"30",X"10",X"21",X"39",X"8E",X"18",X"03",X"21",X"25", + X"8E",X"3A",X"AA",X"49",X"FE",X"0A",X"38",X"02",X"3E",X"0A",X"3D",X"CD",X"1D",X"94",X"FD",X"73", + X"02",X"FD",X"72",X"03",X"C9",X"D6",X"D6",X"D6",X"D6",X"D6",X"D6",X"D6",X"D6",X"D6",X"D6",X"D6", + X"D6",X"D6",X"D6",X"D6",X"D6",X"D6",X"D6",X"D6",X"D6",X"D6",X"D6",X"6D",X"DB",X"EE",X"EE",X"D6", + X"D6",X"EE",X"EE",X"EE",X"EE",X"D6",X"D6",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"3A",X"24",X"4A", + X"FE",X"02",X"38",X"02",X"3E",X"02",X"21",X"6B",X"8E",X"CD",X"1D",X"94",X"EB",X"ED",X"5F",X"E6", + X"03",X"CD",X"1D",X"94",X"FD",X"73",X"0A",X"FD",X"72",X"0B",X"C9",X"71",X"8E",X"79",X"8E",X"81", + X"8E",X"80",X"00",X"50",X"00",X"90",X"00",X"A0",X"00",X"50",X"00",X"60",X"00",X"70",X"00",X"50", + X"00",X"30",X"00",X"50",X"00",X"20",X"00",X"40",X"00",X"00",X"FF",X"01",X"00",X"00",X"01",X"FF", + X"00",X"06",X"03",X"3A",X"AA",X"49",X"FE",X"04",X"D8",X"06",X"04",X"C9",X"FD",X"7E",X"09",X"B7", + X"C2",X"DD",X"88",X"FD",X"6E",X"0A",X"FD",X"66",X"0B",X"7E",X"FD",X"77",X"09",X"23",X"FD",X"7E", + X"01",X"E6",X"F0",X"B6",X"FD",X"77",X"01",X"23",X"FD",X"75",X"0A",X"FD",X"74",X"0B",X"CD",X"44", + X"8B",X"C3",X"DD",X"88",X"01",X"00",X"04",X"C5",X"21",X"F0",X"8E",X"05",X"78",X"CD",X"17",X"94", + X"4E",X"23",X"46",X"FD",X"66",X"05",X"FD",X"6E",X"07",X"CD",X"A5",X"91",X"3A",X"42",X"48",X"BC", + X"20",X"06",X"3A",X"44",X"48",X"BD",X"28",X"01",X"37",X"C1",X"CB",X"11",X"10",X"D9",X"79",X"C9", + X"00",X"F0",X"10",X"00",X"00",X"10",X"F0",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"1E",X"00",X"73",X"23",X"0B",X"79",X"B0",X"20",X"F9",X"C9",X"DD",X"46",X"00",X"DD",X"23",X"DD", + X"4E",X"00",X"AF",X"B9",X"C8",X"DD",X"6E",X"01",X"DD",X"66",X"02",X"DD",X"7E",X"03",X"D5",X"11", + X"04",X"00",X"DD",X"19",X"D1",X"B7",X"20",X"1F",X"DD",X"5E",X"00",X"DD",X"23",X"B8",X"20",X"08", + X"C5",X"41",X"CD",X"7D",X"8F",X"C1",X"18",X"D7",X"3E",X"23",X"FF",X"C5",X"06",X"01",X"CD",X"7D", + X"8F",X"C1",X"0D",X"20",X"F3",X"18",X"C8",X"AF",X"B8",X"20",X"11",X"41",X"C5",X"DD",X"5E",X"00", + X"DD",X"23",X"06",X"01",X"CD",X"7D",X"8F",X"C1",X"10",X"F2",X"18",X"B3",X"3E",X"23",X"FF",X"C5", + X"DD",X"5E",X"00",X"DD",X"23",X"06",X"01",X"CD",X"7D",X"8F",X"C1",X"0D",X"20",X"EE",X"18",X"9F", + X"DD",X"7E",X"00",X"77",X"CD",X"6F",X"90",X"23",X"DD",X"23",X"10",X"F4",X"C9",X"DD",X"7E",X"00", + X"77",X"CD",X"6F",X"90",X"CD",X"79",X"90",X"DD",X"23",X"10",X"F2",X"C9",X"DD",X"7E",X"00",X"DD", + X"23",X"B7",X"C8",X"CB",X"7F",X"20",X"25",X"4F",X"DD",X"46",X"00",X"DD",X"23",X"CB",X"78",X"CB", + X"B8",X"28",X"08",X"23",X"0D",X"28",X"1B",X"10",X"FA",X"18",X"ED",X"DD",X"7E",X"00",X"DD",X"23", + X"77",X"CD",X"6F",X"90",X"23",X"0D",X"28",X"0A",X"10",X"F6",X"18",X"DC",X"D5",X"CB",X"BF",X"47", + X"18",X"03",X"D5",X"06",X"01",X"11",X"20",X"00",X"7D",X"E6",X"E0",X"6F",X"19",X"10",X"FD",X"D1", + X"18",X"BA",X"06",X"01",X"CD",X"80",X"8F",X"DD",X"2B",X"C9",X"0E",X"00",X"1A",X"81",X"0E",X"00", + X"86",X"FE",X"0A",X"FA",X"E9",X"8F",X"0C",X"D6",X"0A",X"12",X"2B",X"1B",X"10",X"EE",X"C9",X"0E", + X"00",X"1A",X"91",X"F2",X"FA",X"8F",X"3E",X"09",X"18",X"02",X"0E",X"00",X"96",X"F2",X"04",X"90", + X"0E",X"01",X"C6",X"0A",X"12",X"2B",X"1B",X"10",X"E8",X"C9",X"AF",X"5F",X"E5",X"C5",X"77",X"CD", + X"6F",X"90",X"23",X"10",X"F9",X"C1",X"E1",X"CD",X"79",X"90",X"0D",X"20",X"EF",X"C9",X"DD",X"7E", + X"00",X"05",X"28",X"08",X"FE",X"00",X"20",X"03",X"B9",X"28",X"03",X"0D",X"F6",X"30",X"C5",X"D5", + X"CD",X"D2",X"8F",X"D1",X"C1",X"DD",X"23",X"78",X"B7",X"20",X"E3",X"C9",X"C5",X"E5",X"CD",X"70", + X"8F",X"E1",X"CD",X"79",X"90",X"C1",X"0D",X"20",X"F3",X"C9",X"C5",X"E5",X"77",X"CD",X"6F",X"90", + X"23",X"10",X"F9",X"E1",X"CD",X"79",X"90",X"C1",X"0D",X"20",X"EF",X"C9",X"C5",X"E5",X"77",X"CD", + X"6F",X"90",X"3C",X"23",X"10",X"F8",X"E1",X"CD",X"79",X"90",X"C1",X"0D",X"20",X"EE",X"C9",X"F5", + X"E5",X"7C",X"C6",X"04",X"67",X"73",X"E1",X"F1",X"C9",X"D5",X"11",X"20",X"00",X"19",X"D1",X"C9", + X"1A",X"BE",X"38",X"0B",X"20",X"06",X"13",X"23",X"10",X"F6",X"AF",X"C9",X"3E",X"02",X"C9",X"3E", + X"01",X"C9",X"E5",X"06",X"06",X"11",X"8D",X"49",X"CD",X"DA",X"8F",X"21",X"BD",X"41",X"06",X"06", + X"0E",X"00",X"1E",X"04",X"DD",X"21",X"88",X"49",X"CD",X"1E",X"90",X"E1",X"11",X"19",X"48",X"01", + X"14",X"48",X"3A",X"01",X"48",X"CB",X"6F",X"20",X"06",X"11",X"13",X"48",X"01",X"0E",X"48",X"CB", + X"7F",X"C8",X"C5",X"F5",X"06",X"06",X"CD",X"DA",X"8F",X"F1",X"DD",X"21",X"0E",X"48",X"21",X"BF", + X"40",X"CB",X"6F",X"28",X"07",X"DD",X"21",X"14",X"48",X"21",X"FF",X"42",X"06",X"06",X"1E",X"05", + X"CD",X"1E",X"90",X"E1",X"3A",X"A6",X"49",X"E6",X"0F",X"FE",X"04",X"D0",X"3A",X"80",X"50",X"2F", + X"E6",X"0C",X"C8",X"CB",X"3F",X"CB",X"3F",X"E5",X"21",X"22",X"91",X"3D",X"CD",X"1D",X"94",X"EB", + X"3A",X"A6",X"49",X"E6",X"0F",X"CD",X"10",X"94",X"EB",X"E1",X"06",X"06",X"CD",X"80",X"90",X"FE", + X"02",X"20",X"01",X"C9",X"21",X"A6",X"49",X"34",X"21",X"A7",X"49",X"7E",X"34",X"47",X"CD",X"70", + X"91",X"C9",X"28",X"91",X"40",X"91",X"58",X"91",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"06", + X"00",X"00",X"00",X"00",X"01",X"05",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00", + X"00",X"05",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00", + X"00",X"00",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"00",X"00",X"00",X"00",X"01",X"05", + X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"07",X"00",X"00",X"00",X"00",X"00", + X"21",X"7C",X"40",X"1E",X"01",X"0E",X"06",X"AF",X"B0",X"28",X"0D",X"3E",X"2D",X"C5",X"CD",X"D2", + X"8F",X"C1",X"0D",X"10",X"F8",X"AF",X"B9",X"C8",X"41",X"C5",X"CD",X"D2",X"8F",X"C1",X"10",X"F9", + X"C9",X"7E",X"FE",X"FF",X"C8",X"FF",X"23",X"18",X"F8",X"7E",X"FE",X"FF",X"C8",X"23",X"4E",X"23", + X"46",X"23",X"FF",X"18",X"F4",X"7D",X"80",X"6F",X"7C",X"81",X"67",X"C9",X"7C",X"FE",X"30",X"38", + X"36",X"FE",X"E1",X"30",X"32",X"06",X"0C",X"1E",X"84",X"3E",X"D0",X"BC",X"38",X"0A",X"D6",X"10", + X"57",X"7B",X"D6",X"0C",X"5F",X"7A",X"10",X"F3",X"7D",X"FE",X"40",X"38",X"1A",X"FE",X"F1",X"30", + X"16",X"06",X"0C",X"3E",X"EF",X"BD",X"38",X"07",X"1C",X"D6",X"10",X"10",X"F8",X"1E",X"00",X"21", + X"68",X"48",X"16",X"00",X"19",X"7E",X"C9",X"3E",X"FF",X"C9",X"B7",X"06",X"08",X"26",X"00",X"6F", + X"1E",X"0C",X"ED",X"6A",X"7C",X"38",X"03",X"BB",X"38",X"03",X"93",X"67",X"AF",X"3F",X"10",X"F2", + X"CB",X"15",X"CB",X"25",X"CB",X"25",X"CB",X"25",X"CB",X"25",X"7D",X"C6",X"30",X"6C",X"67",X"CB", + X"25",X"CB",X"25",X"CB",X"25",X"CB",X"25",X"3E",X"10",X"85",X"ED",X"44",X"6F",X"C9",X"7D",X"ED", + X"44",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"5F",X"3E",X"F0",X"84",X"E6",X"F8",X"26",X"00",X"6F", + X"29",X"29",X"16",X"40",X"19",X"C9",X"21",X"68",X"48",X"01",X"90",X"00",X"CD",X"00",X"8F",X"3A", + X"AA",X"49",X"FE",X"05",X"30",X"18",X"3D",X"21",X"F5",X"93",X"CD",X"1D",X"94",X"21",X"68",X"48", + X"1A",X"13",X"FE",X"FF",X"28",X"08",X"06",X"00",X"4F",X"09",X"36",X"20",X"18",X"EF",X"21",X"30", + X"93",X"3A",X"AA",X"49",X"FE",X"07",X"38",X"02",X"3E",X"07",X"3D",X"16",X"00",X"5F",X"19",X"46", + X"C5",X"CD",X"F0",X"92",X"C1",X"10",X"F9",X"3A",X"AA",X"49",X"FE",X"0A",X"38",X"02",X"3E",X"0A", + X"3D",X"21",X"37",X"93",X"CD",X"1D",X"94",X"EB",X"7E",X"B7",X"C2",X"AA",X"92",X"21",X"AA",X"48", + X"7E",X"E6",X"F0",X"28",X"0E",X"E5",X"23",X"7E",X"E6",X"F0",X"20",X"FA",X"D1",X"EB",X"4E",X"1A", + X"77",X"79",X"12",X"7E",X"E6",X"0F",X"F6",X"30",X"77",X"C9",X"4F",X"23",X"46",X"23",X"E5",X"21", + X"68",X"48",X"ED",X"5F",X"E6",X"7F",X"CB",X"27",X"5F",X"ED",X"5F",X"E6",X"3F",X"83",X"5F",X"16", + X"00",X"19",X"B7",X"E5",X"11",X"F8",X"48",X"ED",X"52",X"EB",X"E1",X"38",X"04",X"21",X"68",X"48", + X"19",X"7E",X"B7",X"28",X"15",X"23",X"23",X"23",X"23",X"23",X"E5",X"11",X"F8",X"48",X"ED",X"52", + X"E1",X"38",X"EE",X"11",X"90",X"00",X"ED",X"52",X"18",X"E7",X"71",X"10",X"C2",X"E1",X"18",X"98", + X"21",X"82",X"48",X"ED",X"5F",X"5F",X"ED",X"5F",X"83",X"5F",X"ED",X"5F",X"E6",X"07",X"B7",X"28", + X"05",X"3D",X"CB",X"03",X"18",X"F8",X"7B",X"E6",X"07",X"5F",X"ED",X"5F",X"57",X"ED",X"5F",X"E6", + X"0F",X"B7",X"28",X"05",X"3D",X"CB",X"02",X"18",X"F8",X"7A",X"E6",X"07",X"16",X"00",X"19",X"B7", + X"28",X"07",X"3D",X"11",X"0C",X"00",X"19",X"18",X"F6",X"AF",X"BE",X"20",X"C3",X"36",X"40",X"C9", + X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"4B",X"93",X"5C",X"93",X"6D",X"93",X"7E",X"93",X"8F", + X"93",X"A0",X"93",X"B1",X"93",X"C2",X"93",X"D3",X"93",X"E4",X"93",X"11",X"03",X"12",X"03",X"13", + X"03",X"14",X"03",X"01",X"0F",X"02",X"1E",X"04",X"2E",X"03",X"24",X"00",X"11",X"03",X"12",X"03", + X"13",X"03",X"14",X"04",X"01",X"0F",X"02",X"1D",X"04",X"31",X"03",X"21",X"00",X"11",X"02",X"12", + X"02",X"13",X"04",X"14",X"04",X"01",X"0E",X"02",X"20",X"04",X"2F",X"03",X"22",X"00",X"11",X"02", + X"12",X"02",X"13",X"04",X"14",X"05",X"01",X"0E",X"02",X"1E",X"04",X"2F",X"03",X"23",X"00",X"11", + X"02",X"12",X"02",X"13",X"05",X"14",X"05",X"01",X"0C",X"02",X"1C",X"04",X"31",X"03",X"24",X"00", + X"11",X"02",X"12",X"02",X"13",X"05",X"14",X"05",X"01",X"0C",X"02",X"1B",X"04",X"31",X"03",X"24", + X"00",X"11",X"02",X"12",X"02",X"13",X"05",X"14",X"05",X"01",X"0C",X"02",X"1C",X"04",X"31",X"03", + X"22",X"00",X"11",X"02",X"12",X"02",X"13",X"05",X"14",X"05",X"01",X"0C",X"02",X"1C",X"04",X"31", + X"03",X"22",X"00",X"11",X"02",X"12",X"02",X"13",X"05",X"14",X"05",X"01",X"0C",X"02",X"1C",X"04", + X"31",X"03",X"22",X"00",X"11",X"02",X"12",X"02",X"13",X"05",X"14",X"05",X"01",X"0C",X"02",X"1C", + X"04",X"31",X"03",X"22",X"00",X"FD",X"93",X"02",X"94",X"06",X"94",X"09",X"94",X"1E",X"3E",X"45", + X"72",X"FF",X"1E",X"3E",X"72",X"FF",X"3E",X"72",X"FF",X"3E",X"FF",X"5F",X"87",X"83",X"18",X"08", + X"87",X"5F",X"87",X"83",X"18",X"02",X"87",X"87",X"16",X"00",X"5F",X"19",X"C9",X"CD",X"17",X"94", + X"5E",X"23",X"56",X"C9",X"06",X"04",X"0E",X"00",X"CB",X"3F",X"38",X"03",X"0C",X"10",X"F9",X"79", + X"C9",X"0E",X"01",X"B7",X"28",X"05",X"3D",X"CB",X"21",X"18",X"F8",X"79",X"C9",X"DD",X"21",X"82", + X"40",X"01",X"0C",X"0C",X"FD",X"21",X"68",X"48",X"C5",X"DD",X"E5",X"C5",X"21",X"75",X"94",X"FD", + X"7E",X"00",X"CB",X"9F",X"FD",X"77",X"00",X"CB",X"7F",X"20",X"03",X"21",X"7F",X"94",X"4F",X"E6", + X"70",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CD",X"1D",X"94",X"EB",X"11",X"93",X"94", + X"D5",X"79",X"E6",X"07",X"E9",X"AD",X"94",X"AD",X"94",X"B2",X"94",X"AD",X"94",X"B2",X"94",X"C0", + X"94",X"C0",X"94",X"B2",X"94",X"C0",X"94",X"C0",X"94",X"A8",X"94",X"A8",X"94",X"B2",X"94",X"B6", + X"2D",X"B9",X"94",X"FD",X"23",X"DD",X"23",X"DD",X"23",X"C1",X"10",X"AF",X"DD",X"E1",X"01",X"40", + X"00",X"DD",X"09",X"C1",X"0D",X"20",X"A1",X"C9",X"CD",X"76",X"95",X"18",X"20",X"CD",X"87",X"95", + X"18",X"1B",X"3E",X"88",X"1E",X"14",X"C3",X"CD",X"94",X"3E",X"01",X"1E",X"0A",X"C3",X"CD",X"94", + X"AF",X"1E",X"16",X"01",X"02",X"02",X"DD",X"E5",X"E1",X"CD",X"4A",X"90",X"C9",X"DD",X"E5",X"E1", + X"01",X"02",X"02",X"CD",X"5C",X"90",X"C9",X"06",X"04",X"C5",X"CD",X"2D",X"95",X"3E",X"23",X"06", + X"1E",X"FF",X"06",X"90",X"21",X"68",X"48",X"C5",X"E5",X"7E",X"F5",X"B7",X"11",X"68",X"48",X"ED", + X"52",X"7D",X"CD",X"EA",X"91",X"CD",X"1E",X"92",X"F1",X"FE",X"20",X"20",X"0C",X"3E",X"88",X"1E", + X"14",X"01",X"02",X"02",X"CD",X"5C",X"90",X"18",X"14",X"E6",X"70",X"FE",X"30",X"20",X"05",X"CD", + X"B6",X"2D",X"18",X"09",X"AF",X"1E",X"16",X"01",X"02",X"02",X"CD",X"0C",X"90",X"E1",X"23",X"C1", + X"10",X"C5",X"3E",X"23",X"06",X"3C",X"FF",X"C1",X"05",X"C2",X"D9",X"94",X"C9",X"FD",X"21",X"68", + X"48",X"01",X"0C",X"0C",X"DD",X"21",X"82",X"40",X"C5",X"DD",X"E5",X"C5",X"21",X"75",X"94",X"FD", + X"7E",X"00",X"CB",X"7F",X"20",X"03",X"21",X"89",X"94",X"4F",X"E6",X"70",X"CB",X"3F",X"CB",X"3F", + X"CB",X"3F",X"CB",X"3F",X"CD",X"1D",X"94",X"EB",X"11",X"60",X"95",X"D5",X"79",X"E6",X"07",X"E9", + X"FD",X"23",X"DD",X"23",X"DD",X"23",X"C1",X"10",X"D2",X"DD",X"E1",X"11",X"40",X"00",X"DD",X"19", + X"C1",X"0D",X"C2",X"38",X"95",X"C9",X"21",X"7F",X"95",X"3D",X"CD",X"1D",X"94",X"7A",X"C9",X"0D", + X"C0",X"0E",X"C4",X"0F",X"C8",X"10",X"CC",X"F5",X"3A",X"01",X"48",X"CB",X"7F",X"20",X"04",X"3E", + X"07",X"18",X"03",X"3A",X"AA",X"49",X"FE",X"08",X"38",X"04",X"D6",X"07",X"18",X"F8",X"21",X"B3", + X"95",X"3D",X"16",X"00",X"5F",X"19",X"4E",X"21",X"BA",X"95",X"F1",X"3D",X"16",X"00",X"5F",X"19", + X"5E",X"79",X"C9",X"D8",X"E0",X"E4",X"D4",X"E8",X"EC",X"DC",X"06",X"07",X"08",X"09",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"20",X"4F",X"21",X"45",X"48",X"06",X"1E",X"CF",X"21",X"20",X"4A",X"06",X"56",X"CF",X"CD", + X"3A",X"97",X"C5",X"3A",X"AB",X"49",X"32",X"20",X"4A",X"FE",X"04",X"30",X"0D",X"ED",X"5F",X"E6", + X"03",X"FE",X"03",X"38",X"02",X"3E",X"02",X"32",X"21",X"4A",X"21",X"70",X"97",X"CD",X"4D",X"97", + X"FD",X"21",X"26",X"4A",X"C5",X"FD",X"E5",X"D1",X"01",X"04",X"00",X"ED",X"B0",X"11",X"0E",X"00", + X"FD",X"19",X"C1",X"10",X"EF",X"C1",X"C5",X"21",X"7E",X"98",X"CD",X"4D",X"97",X"FD",X"21",X"22", + X"4A",X"5E",X"23",X"56",X"23",X"FD",X"73",X"02",X"FD",X"72",X"03",X"11",X"0E",X"00",X"FD",X"19", + X"10",X"EF",X"C1",X"21",X"2C",X"99",X"CD",X"4D",X"97",X"FD",X"21",X"22",X"4A",X"5E",X"23",X"56", + X"23",X"FD",X"73",X"0A",X"FD",X"73",X"0C",X"FD",X"72",X"0B",X"FD",X"72",X"0D",X"11",X"0E",X"00", + X"FD",X"19",X"10",X"E9",X"3E",X"23",X"06",X"01",X"FF",X"FD",X"21",X"22",X"4A",X"DD",X"21",X"45", + X"48",X"CD",X"3A",X"97",X"C5",X"FD",X"36",X"00",X"03",X"FD",X"7E",X"08",X"B7",X"20",X"07",X"FD", + X"36",X"08",X"05",X"CD",X"29",X"89",X"FD",X"35",X"08",X"FD",X"7E",X"09",X"B7",X"C2",X"FC",X"96", + X"FD",X"6E",X"0C",X"FD",X"66",X"0D",X"7E",X"FE",X"FF",X"20",X"0F",X"3A",X"AB",X"49",X"FE",X"06", + X"CA",X"E7",X"96",X"FD",X"6E",X"0A",X"FD",X"66",X"0B",X"7E",X"23",X"5E",X"23",X"FD",X"75",X"0C", + X"FD",X"74",X"0D",X"FD",X"77",X"01",X"FD",X"73",X"09",X"21",X"F8",X"96",X"16",X"00",X"5F",X"19", + X"7E",X"FD",X"77",X"04",X"C3",X"FC",X"96",X"FD",X"7E",X"07",X"21",X"23",X"9C",X"FE",X"80",X"D2", + X"C9",X"96",X"21",X"CC",X"9B",X"C3",X"C9",X"96",X"2B",X"A8",X"2B",X"28",X"CD",X"19",X"8B",X"D2", + X"08",X"97",X"CD",X"DD",X"88",X"C3",X"08",X"97",X"DD",X"E5",X"D1",X"13",X"FD",X"E5",X"E1",X"23", + X"23",X"23",X"23",X"01",X"04",X"00",X"ED",X"B0",X"DD",X"36",X"00",X"00",X"11",X"0E",X"00",X"FD", + X"19",X"11",X"05",X"00",X"DD",X"19",X"C1",X"05",X"C2",X"94",X"96",X"3A",X"20",X"4A",X"B7",X"20", + X"02",X"ED",X"5F",X"3D",X"32",X"20",X"4A",X"C3",X"84",X"96",X"3A",X"AB",X"49",X"21",X"46",X"97", + X"16",X"00",X"5F",X"19",X"46",X"C9",X"05",X"05",X"05",X"05",X"06",X"06",X"06",X"3A",X"20",X"4A", + X"CD",X"1D",X"94",X"EB",X"FE",X"08",X"D0",X"3A",X"21",X"4A",X"CD",X"1D",X"94",X"EB",X"C9",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"7E",X"97",X"84",X"97",X"8A",X"97",X"90",X"97",X"36",X"98",X"4E",X"98",X"66",X"98",X"96",X"97", + X"AA",X"97",X"AA",X"97",X"BE",X"97",X"D2",X"97",X"D2",X"97",X"E6",X"97",X"FA",X"97",X"FA",X"97", + X"0E",X"98",X"22",X"98",X"22",X"98",X"28",X"B0",X"52",X"E0",X"2B",X"40",X"52",X"D0",X"A8",X"90", + X"52",X"98",X"A8",X"60",X"52",X"B0",X"28",X"A0",X"52",X"60",X"2B",X"B0",X"52",X"E0",X"28",X"40", + X"52",X"D0",X"28",X"90",X"52",X"98",X"2B",X"60",X"52",X"B0",X"2B",X"A0",X"52",X"60",X"2B",X"B0", + X"52",X"98",X"28",X"80",X"52",X"E0",X"A8",X"50",X"52",X"98",X"A8",X"80",X"52",X"60",X"2B",X"A0", + X"52",X"B8",X"28",X"B0",X"52",X"98",X"A8",X"80",X"52",X"E0",X"2B",X"50",X"52",X"98",X"A8",X"80", + X"52",X"60",X"28",X"A0",X"52",X"B8",X"2B",X"C0",X"52",X"98",X"28",X"A0",X"52",X"E0",X"2B",X"90", + X"52",X"D0",X"2B",X"60",X"52",X"B0",X"A8",X"80",X"52",X"60",X"28",X"C0",X"52",X"98",X"A8",X"A0", + X"52",X"E0",X"28",X"90",X"52",X"D0",X"A8",X"60",X"52",X"B0",X"28",X"80",X"52",X"60",X"28",X"A0", + X"52",X"E0",X"2B",X"A0",X"52",X"A0",X"A8",X"40",X"52",X"C0",X"28",X"80",X"52",X"70",X"2B",X"A0", + X"52",X"60",X"2B",X"A0",X"52",X"E0",X"28",X"A0",X"52",X"A0",X"2B",X"40",X"52",X"C0",X"2B",X"80", + X"52",X"70",X"28",X"A0",X"52",X"60",X"A8",X"50",X"52",X"E0",X"28",X"E0",X"52",X"C8",X"28",X"80", + X"52",X"B0",X"28",X"A0",X"52",X"90",X"A8",X"50",X"52",X"78",X"A8",X"40",X"52",X"60",X"28",X"E0", + X"52",X"D8",X"A8",X"60",X"52",X"C0",X"28",X"B0",X"52",X"A8",X"A8",X"40",X"52",X"90",X"28",X"90", + X"52",X"78",X"A8",X"50",X"52",X"60",X"28",X"A0",X"52",X"48",X"A8",X"30",X"52",X"70",X"28",X"88", + X"52",X"88",X"A8",X"50",X"52",X"A8",X"28",X"E8",X"52",X"C0",X"28",X"D0",X"52",X"F0",X"8C",X"98", + X"92",X"98",X"98",X"98",X"9E",X"98",X"08",X"99",X"14",X"99",X"20",X"99",X"A4",X"98",X"AE",X"98", + X"B8",X"98",X"C2",X"98",X"CC",X"98",X"D6",X"98",X"E0",X"98",X"E0",X"98",X"EA",X"98",X"F4",X"98", + X"F4",X"98",X"FE",X"98",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE", + X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"FF",X"FF",X"EE",X"EE",X"EE",X"EE", + X"EE",X"EE",X"FF",X"FF",X"FF",X"FF",X"EE",X"EE",X"D6",X"D6",X"EE",X"EE",X"FF",X"FF",X"FF",X"FF", + X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"FF",X"FF",X"EE",X"EE",X"FF",X"FF",X"EE",X"EE",X"EE",X"EE", + X"FF",X"FF",X"EE",X"EE",X"FF",X"FF",X"EE",X"EE",X"FF",X"FF",X"EE",X"EE",X"EE",X"EE",X"FF",X"FF", + X"FF",X"FF",X"EE",X"EE",X"FF",X"FF",X"D6",X"D6",X"EE",X"EE",X"AA",X"AA",X"FF",X"FF",X"FF",X"FF", + X"EE",X"EE",X"D6",X"D6",X"FF",X"FF",X"AA",X"AA",X"EE",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EE",X"EE",X"D6",X"D6",X"FF",X"FF",X"D6",X"D6",X"AA",X"AA",X"FF",X"FF",X"AA",X"AA",X"EE",X"EE", + X"AA",X"AA",X"AA",X"AA",X"AA",X"AA",X"EE",X"EE",X"AA",X"AA",X"D6",X"D6",X"3A",X"99",X"40",X"99", + X"46",X"99",X"4C",X"99",X"4E",X"9B",X"7E",X"9B",X"C0",X"9B",X"52",X"99",X"5C",X"99",X"5C",X"99", + X"F4",X"99",X"FE",X"99",X"FE",X"99",X"6A",X"9A",X"74",X"9A",X"74",X"9A",X"E0",X"9A",X"EA",X"9A", + X"EA",X"9A",X"66",X"99",X"77",X"99",X"88",X"99",X"9B",X"99",X"A4",X"99",X"AD",X"99",X"BE",X"99", + X"CF",X"99",X"E2",X"99",X"EB",X"99",X"03",X"60",X"00",X"10",X"03",X"10",X"00",X"38",X"01",X"80", + X"02",X"38",X"03",X"10",X"02",X"10",X"FF",X"00",X"38",X"01",X"80",X"02",X"38",X"03",X"10",X"02", + X"10",X"03",X"60",X"00",X"10",X"03",X"10",X"FF",X"01",X"30",X"02",X"38",X"03",X"10",X"02",X"10", + X"03",X"60",X"00",X"10",X"03",X"10",X"00",X"38",X"01",X"50",X"FF",X"01",X"40",X"00",X"50",X"03", + X"40",X"02",X"50",X"FF",X"03",X"40",X"02",X"50",X"01",X"40",X"00",X"50",X"FF",X"00",X"10",X"01", + X"10",X"00",X"38",X"03",X"80",X"02",X"38",X"01",X"10",X"02",X"10",X"01",X"60",X"FF",X"01",X"10", + X"02",X"10",X"01",X"60",X"00",X"10",X"01",X"10",X"00",X"38",X"03",X"80",X"02",X"38",X"FF",X"03", + X"50",X"02",X"38",X"01",X"10",X"02",X"10",X"01",X"60",X"00",X"10",X"01",X"10",X"00",X"38",X"03", + X"30",X"FF",X"00",X"50",X"01",X"40",X"02",X"50",X"03",X"40",X"FF",X"02",X"50",X"03",X"40",X"00", + X"50",X"01",X"40",X"FF",X"08",X"9A",X"11",X"9A",X"1C",X"9A",X"25",X"9A",X"30",X"9A",X"39",X"9A", + X"42",X"9A",X"4D",X"9A",X"56",X"9A",X"61",X"9A",X"02",X"48",X"03",X"60",X"00",X"48",X"01",X"60", + X"FF",X"03",X"30",X"00",X"48",X"01",X"60",X"02",X"48",X"03",X"30",X"FF",X"01",X"60",X"02",X"48", + X"03",X"60",X"00",X"48",X"FF",X"03",X"20",X"02",X"58",X"01",X"40",X"00",X"58",X"03",X"20",X"FF", + X"00",X"58",X"03",X"40",X"02",X"58",X"01",X"40",X"FF",X"03",X"60",X"02",X"48",X"01",X"60",X"00", + X"48",X"FF",X"01",X"30",X"00",X"48",X"03",X"60",X"02",X"48",X"01",X"30",X"FF",X"02",X"48",X"01", + X"60",X"00",X"48",X"03",X"60",X"FF",X"01",X"20",X"02",X"58",X"03",X"40",X"00",X"58",X"01",X"20", + X"FF",X"03",X"40",X"00",X"58",X"01",X"40",X"02",X"58",X"FF",X"7E",X"9A",X"87",X"9A",X"92",X"9A", + X"9B",X"9A",X"A4",X"9A",X"AF",X"9A",X"B8",X"9A",X"C3",X"9A",X"CC",X"9A",X"D5",X"9A",X"02",X"48", + X"03",X"50",X"00",X"48",X"01",X"50",X"FF",X"03",X"30",X"00",X"48",X"01",X"50",X"02",X"48",X"03", + X"20",X"FF",X"00",X"38",X"03",X"50",X"02",X"38",X"01",X"50",X"FF",X"00",X"40",X"01",X"40",X"02", + X"40",X"03",X"40",X"FF",X"01",X"10",X"02",X"20",X"03",X"20",X"00",X"20",X"01",X"10",X"FF",X"03", + X"50",X"02",X"48",X"01",X"50",X"00",X"48",X"FF",X"01",X"20",X"00",X"48",X"03",X"50",X"02",X"48", + X"01",X"30",X"FF",X"03",X"50",X"00",X"38",X"01",X"50",X"02",X"38",X"FF",X"01",X"40",X"00",X"40", + X"03",X"40",X"02",X"40",X"FF",X"03",X"10",X"02",X"20",X"01",X"20",X"00",X"20",X"03",X"10",X"FF", + X"F4",X"9A",X"FD",X"9A",X"06",X"9B",X"0F",X"9B",X"18",X"9B",X"21",X"9B",X"2A",X"9B",X"33",X"9B", + X"3C",X"9B",X"45",X"9B",X"03",X"40",X"00",X"20",X"01",X"40",X"02",X"20",X"FF",X"02",X"20",X"03", + X"20",X"00",X"20",X"01",X"20",X"FF",X"01",X"20",X"00",X"20",X"03",X"20",X"02",X"20",X"FF",X"03", + X"20",X"02",X"20",X"01",X"20",X"00",X"20",X"FF",X"02",X"20",X"03",X"20",X"00",X"20",X"01",X"20", + X"FF",X"00",X"20",X"03",X"40",X"02",X"20",X"01",X"40",X"FF",X"03",X"20",X"02",X"20",X"01",X"20", + X"00",X"20",X"FF",X"00",X"20",X"01",X"20",X"02",X"20",X"03",X"20",X"FF",X"02",X"20",X"03",X"20", + X"00",X"20",X"01",X"20",X"FF",X"03",X"20",X"02",X"20",X"01",X"20",X"00",X"20",X"FF",X"5A",X"9B", + X"5F",X"9B",X"64",X"9B",X"6B",X"9B",X"70",X"9B",X"77",X"9B",X"01",X"90",X"03",X"90",X"FF",X"03", + X"B0",X"01",X"B0",X"FF",X"03",X"50",X"01",X"A0",X"03",X"50",X"FF",X"03",X"70",X"01",X"70",X"FF", + X"01",X"50",X"03",X"70",X"01",X"20",X"FF",X"01",X"60",X"03",X"70",X"01",X"10",X"FF",X"8A",X"9B", + X"93",X"9B",X"9C",X"9B",X"A5",X"9B",X"AE",X"9B",X"B7",X"9B",X"03",X"90",X"02",X"08",X"01",X"90", + X"00",X"08",X"FF",X"01",X"70",X"02",X"08",X"03",X"70",X"00",X"08",X"FF",X"03",X"60",X"02",X"08", + X"01",X"60",X"00",X"08",X"FF",X"01",X"60",X"02",X"08",X"03",X"60",X"00",X"08",X"FF",X"03",X"60", + X"02",X"08",X"01",X"60",X"00",X"08",X"FF",X"01",X"50",X"02",X"08",X"03",X"50",X"00",X"08",X"FF", + X"CC",X"9B",X"E0",X"9B",X"EC",X"9B",X"47",X"9C",X"3B",X"9C",X"23",X"9C",X"03",X"38",X"02",X"08", + X"01",X"28",X"02",X"08",X"03",X"50",X"02",X"08",X"01",X"40",X"02",X"08",X"03",X"50",X"02",X"08", + X"01",X"50",X"02",X"08",X"03",X"60",X"02",X"08",X"01",X"68",X"02",X"08",X"03",X"60",X"02",X"08", + X"01",X"90",X"02",X"08",X"03",X"78",X"02",X"08",X"01",X"98",X"02",X"08",X"03",X"88",X"02",X"08", + X"01",X"98",X"02",X"08",X"03",X"90",X"02",X"08",X"01",X"90",X"02",X"08",X"03",X"60",X"02",X"08", + X"01",X"60",X"02",X"08",X"03",X"68",X"02",X"08",X"01",X"58",X"02",X"08",X"03",X"28",X"02",X"08", + X"01",X"20",X"FF",X"03",X"20",X"00",X"08",X"01",X"28",X"00",X"08",X"03",X"58",X"00",X"08",X"01", + X"68",X"00",X"08",X"03",X"60",X"00",X"08",X"01",X"60",X"00",X"08",X"03",X"90",X"00",X"08",X"01", + X"90",X"00",X"08",X"03",X"98",X"00",X"08",X"01",X"88",X"00",X"08",X"03",X"98",X"00",X"08",X"01", + X"78",X"00",X"08",X"03",X"90",X"00",X"08",X"01",X"60",X"00",X"08",X"03",X"68",X"00",X"08",X"01", + X"60",X"00",X"08",X"03",X"50",X"00",X"08",X"01",X"50",X"00",X"08",X"03",X"40",X"00",X"08",X"01", + X"50",X"00",X"08",X"03",X"28",X"00",X"08",X"01",X"38",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CE",X"9C",X"DA",X"9C",X"1C",X"9D",X"A0",X"9D",X"AD",X"9D",X"AD",X"9D",X"D0",X"9D",X"FB",X"9D", + X"0A",X"9E",X"18",X"9E",X"63",X"9E",X"63",X"9E",X"7A",X"9E",X"C6",X"9E",X"F6",X"9E",X"05",X"9F", + X"11",X"9F",X"24",X"9F",X"00",X"A0",X"68",X"A0",X"7E",X"A0",X"96",X"A0",X"1C",X"A1",X"D4",X"A3", + X"E2",X"A3",X"F9",X"A3",X"07",X"A4",X"25",X"A4",X"5C",X"A4",X"69",X"A4",X"B3",X"A4",X"81",X"01", + X"01",X"D3",X"9C",X"E8",X"09",X"05",X"40",X"37",X"39",X"FF",X"01",X"00",X"04",X"E4",X"9C",X"82", + X"00",X"04",X"00",X"9D",X"EA",X"10",X"05",X"51",X"50",X"4B",X"4A",X"49",X"48",X"47",X"46",X"45", + X"B5",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"90",X"D4",X"E8",X"21",X"10",X"25",X"B6",X"FF", + X"EA",X"10",X"05",X"45",X"43",X"41",X"3B",X"39",X"37",X"35",X"33",X"31",X"B5",X"4A",X"50",X"52", + X"54",X"56",X"58",X"5A",X"90",X"D4",X"E8",X"21",X"10",X"30",X"B6",X"FF",X"01",X"00",X"02",X"26", + X"9D",X"82",X"00",X"03",X"63",X"9D",X"AD",X"58",X"57",X"56",X"55",X"54",X"53",X"55",X"54",X"53", + X"52",X"51",X"50",X"52",X"51",X"50",X"49",X"48",X"47",X"49",X"48",X"47",X"46",X"45",X"44",X"46", + X"45",X"44",X"43",X"42",X"41",X"43",X"42",X"41",X"40",X"39",X"38",X"40",X"39",X"38",X"37",X"36", + X"35",X"37",X"36",X"35",X"34",X"33",X"32",X"34",X"33",X"32",X"31",X"30",X"29",X"31",X"30",X"29", + X"28",X"27",X"FF",X"AD",X"55",X"54",X"53",X"52",X"51",X"50",X"52",X"51",X"50",X"4B",X"4A",X"50", + X"4B",X"4A",X"49",X"48",X"47",X"46",X"48",X"47",X"46",X"45",X"44",X"46",X"45",X"44",X"43",X"42", + X"44",X"43",X"42",X"41",X"40",X"42",X"41",X"40",X"3B",X"3A",X"39",X"3B",X"3A",X"39",X"38",X"37", + X"39",X"E9",X"07",X"30",X"C0",X"07",X"59",X"5A",X"5B",X"60",X"61",X"62",X"63",X"64",X"65",X"FF", + X"C1",X"01",X"03",X"A5",X"9D",X"E8",X"06",X"06",X"C0",X"40",X"0F",X"D1",X"FF",X"82",X"00",X"03", + X"B2",X"9D",X"E8",X"18",X"10",X"C0",X"1F",X"10",X"B6",X"C1",X"AF",X"19",X"14",X"18",X"12",X"17", + X"1A",X"14",X"17",X"1A",X"15",X"21",X"19",X"15",X"18",X"1B",X"16",X"19",X"14",X"17",X"1B",X"FF", + X"82",X"00",X"05",X"D5",X"9D",X"AD",X"C0",X"1F",X"39",X"4A",X"4B",X"50",X"51",X"52",X"53",X"54", + X"B5",X"50",X"4B",X"4A",X"39",X"38",X"37",X"36",X"35",X"34",X"33",X"32",X"31",X"30",X"2B",X"2A", + X"29",X"28",X"27",X"26",X"25",X"24",X"23",X"22",X"21",X"20",X"FF",X"84",X"01",X"03",X"00",X"9E", + X"E8",X"04",X"06",X"34",X"50",X"45",X"42",X"36",X"32",X"FF",X"84",X"00",X"03",X"0F",X"9E",X"B3", + X"E8",X"05",X"01",X"C0",X"28",X"50",X"B9",X"FF",X"01",X"00",X"04",X"27",X"9E",X"02",X"00",X"04", + X"3B",X"9E",X"84",X"00",X"04",X"4F",X"9E",X"AD",X"40",X"B3",X"50",X"B3",X"4B",X"B3",X"49",X"B3", + X"47",X"B3",X"45",X"B3",X"44",X"B3",X"42",X"B3",X"40",X"B6",X"FF",X"AD",X"37",X"B3",X"47",X"B3", + X"45",X"B3",X"44",X"B3",X"42",X"B3",X"40",X"B3",X"3B",X"B3",X"39",X"B3",X"37",X"B6",X"FF",X"AD", + X"34",X"B3",X"44",X"B3",X"42",X"B3",X"40",X"B3",X"3B",X"B3",X"39",X"B3",X"37",X"B3",X"35",X"B3", + X"34",X"B6",X"FF",X"82",X"00",X"03",X"68",X"9E",X"E8",X"05",X"09",X"3B",X"3A",X"39",X"38",X"37", + X"36",X"B5",X"35",X"34",X"33",X"32",X"31",X"30",X"B3",X"FF",X"82",X"00",X"02",X"7F",X"9E",X"AD", + X"58",X"57",X"56",X"55",X"54",X"53",X"55",X"54",X"53",X"52",X"51",X"50",X"52",X"51",X"50",X"49", + X"48",X"47",X"49",X"48",X"47",X"46",X"45",X"44",X"46",X"45",X"44",X"43",X"42",X"41",X"43",X"42", + X"41",X"40",X"39",X"38",X"40",X"39",X"38",X"37",X"36",X"35",X"37",X"36",X"35",X"34",X"33",X"32", + X"34",X"33",X"32",X"31",X"30",X"29",X"31",X"30",X"29",X"28",X"27",X"FF",X"40",X"B7",X"D1",X"40", + X"B7",X"D1",X"40",X"B7",X"D9",X"FF",X"01",X"00",X"05",X"D5",X"9E",X"02",X"00",X"05",X"E0",X"9E", + X"84",X"00",X"05",X"EB",X"9E",X"E9",X"10",X"20",X"5B",X"50",X"53",X"58",X"BF",X"56",X"57",X"FF", + X"E9",X"10",X"20",X"46",X"42",X"48",X"45",X"BF",X"40",X"49",X"FF",X"E9",X"10",X"20",X"60",X"68", + X"63",X"66",X"BF",X"69",X"67",X"FF",X"81",X"01",X"03",X"FB",X"9E",X"E8",X"10",X"10",X"54",X"50", + X"54",X"50",X"54",X"50",X"FF",X"81",X"01",X"01",X"0A",X"9F",X"E8",X"09",X"05",X"35",X"32",X"33", + X"FF",X"82",X"01",X"01",X"16",X"9F",X"AE",X"30",X"19",X"20",X"24",X"34",X"1A",X"21",X"26",X"37", + X"1B",X"22",X"28",X"FF",X"01",X"01",X"04",X"33",X"9F",X"02",X"00",X"04",X"84",X"9F",X"84",X"01", + X"04",X"BC",X"9F",X"AD",X"40",X"D1",X"40",X"D1",X"40",X"D1",X"42",X"D1",X"42",X"D1",X"42",X"D1", + X"39",X"D1",X"39",X"D1",X"39",X"D1",X"39",X"D1",X"3A",X"D1",X"39",X"D1",X"35",X"D1",X"35",X"D1", + X"35",X"D1",X"35",X"D1",X"34",X"D1",X"32",X"D1",X"30",X"BA",X"D1",X"30",X"D1",X"32",X"D1",X"34", + X"D1",X"35",X"D1",X"37",X"D1",X"39",X"D1",X"3A",X"D1",X"D2",X"37",X"D1",X"40",X"B4",X"D1",X"40", + X"D1",X"42",X"D1",X"40",X"D1",X"3A",X"D1",X"39",X"D1",X"37",X"D1",X"35",X"D1",X"D2",X"37",X"D1", + X"35",X"B4",X"D1",X"FF",X"AE",X"25",X"B4",X"D1",X"29",X"B4",X"D1",X"30",X"B4",X"D1",X"27",X"B4", + X"D1",X"25",X"B4",X"D1",X"24",X"B4",X"D1",X"22",X"B4",X"D1",X"20",X"B4",X"D1",X"20",X"B4",X"D1", + X"22",X"B4",X"D1",X"24",X"B4",X"D1",X"20",X"B4",X"D1",X"20",X"D1",X"D2",X"1A",X"D1",X"19",X"D1", + X"D2",X"17",X"D1",X"15",X"D1",X"D2",X"20",X"D1",X"15",X"B4",X"D1",X"FF",X"AC",X"D4",X"30",X"D5", + X"30",X"D5",X"30",X"D5",X"30",X"D1",X"D4",X"30",X"D5",X"32",X"D1",X"30",X"D1",X"2A",X"D1",X"29", + X"D1",X"27",X"D1",X"27",X"D1",X"2B",X"D1",X"32",X"D1",X"34",X"D1",X"35",X"D1",X"37",X"D1",X"39", + X"D1",X"3A",X"D1",X"40",X"D1",X"D2",X"42",X"D1",X"40",X"B4",X"D1",X"44",X"D1",X"42",X"D1",X"40", + X"D1",X"3A",X"D1",X"39",X"D1",X"37",X"D1",X"35",X"D1",X"D2",X"30",X"D1",X"35",X"B4",X"D1",X"FF", + X"D7",X"FF",X"DF",X"5F",X"F7",X"D7",X"FF",X"FF",X"39",X"F7",X"AD",X"5F",X"57",X"57",X"57",X"57", + X"53",X"57",X"57",X"53",X"57",X"57",X"57",X"57",X"57",X"57",X"4F",X"5F",X"47",X"5F",X"5F",X"47", + X"47",X"47",X"57",X"47",X"47",X"57",X"47",X"57",X"57",X"47",X"57",X"57",X"57",X"39",X"3F",X"D7", + X"39",X"3B",X"37",X"36",X"35",X"37",X"36",X"35",X"FF",X"AD",X"55",X"54",X"53",X"52",X"51",X"57", + X"53",X"57",X"57",X"4B",X"4B",X"57",X"4B",X"4F",X"4B",X"5F",X"47",X"47",X"5F",X"47",X"47",X"47", + X"47",X"47",X"47",X"57",X"43",X"57",X"57",X"57",X"57",X"57",X"57",X"57",X"57",X"57",X"3B",X"3A", + X"39",X"3B",X"3A",X"39",X"38",X"37",X"39",X"FF",X"57",X"D7",X"57",X"72",X"A7",X"D7",X"D7",X"57", + X"78",X"A7",X"E8",X"27",X"5F",X"27",X"B3",X"FF",X"E8",X"21",X"08",X"30",X"B3",X"FF",X"C4",X"01", + X"01",X"83",X"A0",X"AF",X"33",X"30",X"34",X"31",X"35",X"32",X"36",X"33",X"37",X"34",X"38",X"35", + X"39",X"36",X"3A",X"37",X"3B",X"FF",X"57",X"DF",X"57",X"A7",X"A7",X"D7",X"57",X"57",X"DE",X"E7", + X"AD",X"57",X"47",X"47",X"D1",X"47",X"57",X"37",X"D1",X"47",X"47",X"57",X"D1",X"57",X"47",X"D1", + X"57",X"47",X"D1",X"57",X"47",X"47",X"D1",X"47",X"57",X"37",X"D1",X"47",X"47",X"57",X"D1",X"57", + X"47",X"D1",X"57",X"47",X"D1",X"57",X"47",X"47",X"D1",X"47",X"57",X"37",X"D1",X"47",X"47",X"57", + X"D1",X"57",X"47",X"D1",X"57",X"47",X"D1",X"A7",X"E9",X"15",X"15",X"57",X"BF",X"FF",X"AD",X"40", + X"47",X"44",X"D1",X"44",X"40",X"37",X"D1",X"47",X"44",X"40",X"D1",X"50",X"47",X"D1",X"50",X"47", + X"D1",X"40",X"47",X"44",X"D1",X"44",X"40",X"37",X"D1",X"47",X"44",X"40",X"D1",X"50",X"47",X"D1", + X"50",X"47",X"D1",X"40",X"47",X"44",X"D1",X"44",X"40",X"37",X"D1",X"47",X"44",X"40",X"D1",X"50", + X"47",X"D1",X"50",X"47",X"D1",X"A0",X"E9",X"15",X"15",X"50",X"BF",X"FF",X"42",X"00",X"03",X"26", + X"A1",X"C4",X"00",X"03",X"3B",X"A2",X"AB",X"37",X"B2",X"D1",X"37",X"B2",X"D1",X"37",X"B2",X"D1", + X"39",X"B2",X"D1",X"3B",X"B2",X"D1",X"39",X"B2",X"D1",X"37",X"B2",X"D1",X"37",X"B2",X"D1",X"34", + X"B2",X"D1",X"37",X"B2",X"D1",X"37",X"B2",X"D1",X"34",X"B2",X"D1",X"32",X"BA",X"D5",X"37",X"B2", + X"D1",X"37",X"B2",X"D1",X"37",X"B2",X"D1",X"39",X"B2",X"D1",X"3B",X"B2",X"D1",X"39",X"B2",X"D1", + X"37",X"B2",X"D1",X"37",X"B2",X"D1",X"44",X"B2",X"D1",X"44",X"B2",X"D1",X"44",X"B2",X"D1",X"44", + X"B2",X"D1",X"42",X"BA",X"D5",X"3B",X"B2",X"D1",X"3B",X"B2",X"D1",X"3B",X"B2",X"D1",X"3B",X"B2", + X"D1",X"3B",X"B2",X"D1",X"39",X"B2",X"D1",X"37",X"B2",X"D1",X"37",X"B2",X"D1",X"32",X"B2",X"D1", + X"37",X"B2",X"D1",X"37",X"B2",X"D1",X"39",X"B2",X"D1",X"3B",X"BA",X"D5",X"44",X"B6",X"D1",X"44", + X"B2",X"D1",X"44",X"B2",X"D1",X"42",X"B3",X"37",X"B2",X"D1",X"37",X"B3",X"37",X"B2",X"D1",X"39", + X"B2",X"D1",X"40",X"B2",X"D1",X"3B",X"B2",X"D1",X"39",X"B2",X"D1",X"37",X"BA",X"D5",X"42",X"B2", + X"D1",X"42",X"B2",X"D1",X"42",X"B6",X"D1",X"42",X"B2",X"D1",X"42",X"B2",X"D1",X"42",X"B6",X"D1", + X"44",X"B6",X"D1",X"44",X"B2",X"D1",X"44",X"B3",X"42",X"BA",X"D5",X"44",X"B6",X"D1",X"44",X"B2", + X"D1",X"44",X"B2",X"D1",X"42",X"B2",X"D1",X"42",X"B2",X"D1",X"42",X"B2",X"D1",X"3B",X"B2",X"D1", + X"39",X"B2",X"D1",X"39",X"B2",X"D1",X"39",X"B2",X"D1",X"39",X"B2",X"D1",X"42",X"BA",X"D5",X"42", + X"B2",X"D1",X"42",X"B2",X"D1",X"42",X"B6",X"D1",X"42",X"B2",X"D1",X"42",X"B2",X"D1",X"42",X"B6", + X"D1",X"44",X"B6",X"D1",X"44",X"B2",X"D1",X"44",X"B3",X"42",X"BA",X"D5",X"44",X"B6",X"D1",X"44", + X"B2",X"D1",X"44",X"B2",X"D1",X"42",X"B6",X"D1",X"3B",X"B2",X"D1",X"3B",X"B2",X"D1",X"39",X"B6", + X"D1",X"3B",X"B2",X"D1",X"39",X"B2",X"D1",X"37",X"BA",X"D5",X"FF",X"AA",X"27",X"B2",X"D1",X"3B", + X"D1",X"42",X"D1",X"22",X"B2",X"D1",X"3B",X"D1",X"42",X"D1",X"27",X"B2",X"D1",X"3B",X"D1",X"42", + X"D1",X"22",X"B2",X"D1",X"3B",X"D1",X"42",X"D1",X"27",X"B2",X"D1",X"40",X"D1",X"44",X"D1",X"24", + X"B2",X"D1",X"40",X"D1",X"44",X"D1",X"22",X"B2",X"D1",X"3B",X"D1",X"42",X"D1",X"22",X"B2",X"D1", + X"3B",X"D1",X"42",X"D1",X"27",X"B2",X"D1",X"3B",X"D1",X"42",X"D1",X"22",X"B2",X"D1",X"3B",X"D1", + X"42",X"D1",X"27",X"B2",X"D1",X"3B",X"D1",X"42",X"D1",X"22",X"B2",X"D1",X"3B",X"D1",X"42",X"D1", + X"27",X"B2",X"D1",X"40",X"D1",X"44",X"D1",X"24",X"B2",X"D1",X"40",X"D1",X"44",X"D1",X"22",X"B2", + X"D1",X"3B",X"D1",X"42",X"D1",X"22",X"B2",X"D1",X"3B",X"D1",X"42",X"D1",X"27",X"B2",X"D1",X"3B", + X"D1",X"42",X"D1",X"22",X"B2",X"D1",X"3B",X"D1",X"42",X"D1",X"27",X"B2",X"D1",X"3B",X"D1",X"42", + X"D1",X"22",X"B2",X"D1",X"3B",X"D1",X"42",X"D1",X"27",X"B2",X"D1",X"40",X"D1",X"44",X"D1",X"24", + X"B2",X"D1",X"40",X"D1",X"44",X"D1",X"22",X"B2",X"D1",X"3B",X"D1",X"42",X"D1",X"22",X"B2",X"D1", + X"3B",X"D1",X"42",X"D1",X"27",X"B2",X"D1",X"40",X"D1",X"44",X"D1",X"24",X"B2",X"D1",X"40",X"D1", + X"44",X"D1",X"22",X"B2",X"D1",X"3B",X"D1",X"42",X"D1",X"22",X"B2",X"D1",X"3B",X"D1",X"42",X"D1", + X"22",X"B2",X"D1",X"39",X"D1",X"40",X"D1",X"24",X"B2",X"D1",X"25",X"B2",X"D1",X"27",X"B2",X"D1", + X"22",X"B2",X"D1",X"24",X"B2",X"D1",X"25",X"B2",X"D1",X"27",X"B2",X"D1",X"2B",X"B2",X"D1",X"32", + X"B2",X"D1",X"2B",X"B2",X"D1",X"27",X"B2",X"D1",X"2B",X"B2",X"D1",X"32",X"B2",X"D1",X"2B",X"B2", + X"D1",X"34",X"B2",X"D1",X"30",X"B2",X"D1",X"27",X"B2",X"D1",X"34",X"B2",X"D1",X"27",X"B2",X"D1", + X"2B",X"B2",X"D1",X"32",X"B2",X"D1",X"2B",X"B2",X"D1",X"34",X"B2",X"D1",X"32",X"B2",X"D1",X"30", + X"B2",X"D1",X"34",X"B2",X"D1",X"32",X"B2",X"D1",X"30",X"B2",X"D1",X"2B",X"B2",X"D1",X"32",X"B2", + X"D1",X"39",X"B2",X"D1",X"2B",X"B2",X"D1",X"30",X"B2",X"D1",X"31",X"B2",X"D1",X"32",X"B2",X"D1", + X"22",X"B2",X"D1",X"24",X"B2",X"D1",X"26",X"B2",X"D1",X"27",X"B2",X"D1",X"2B",X"B2",X"D1",X"32", + X"B2",X"D1",X"2B",X"B2",X"D1",X"27",X"B2",X"D1",X"2B",X"B2",X"D1",X"32",X"B2",X"D1",X"2B",X"B2", + X"D1",X"34",X"B2",X"D1",X"30",X"B2",X"D1",X"27",X"B2",X"D1",X"34",X"B2",X"D1",X"27",X"B2",X"D1", + X"2B",X"B2",X"D1",X"32",X"B2",X"D1",X"2B",X"B2",X"D1",X"34",X"B2",X"D1",X"32",X"B2",X"D1",X"30", + X"B2",X"D1",X"34",X"B2",X"D1",X"32",X"B2",X"D1",X"30",X"B2",X"D1",X"2B",X"B2",X"D1",X"32",X"B2", + X"D1",X"39",X"B2",X"D1",X"22",X"B2",X"D1",X"24",X"B2",X"D1",X"26",X"B2",X"D1",X"27",X"B2",X"D5", + X"22",X"B6",X"D1",X"FF",X"C1",X"00",X"02",X"D9",X"A3",X"E8",X"01",X"01",X"C0",X"02",X"BF",X"90", + X"C1",X"FF",X"81",X"00",X"04",X"E7",X"A3",X"E8",X"10",X"05",X"C0",X"05",X"60",X"90",X"C1",X"D1", + X"E9",X"10",X"25",X"C0",X"05",X"63",X"BF",X"B8",X"FF",X"C1",X"00",X"03",X"FE",X"A3",X"B2",X"E8", + X"10",X"02",X"C0",X"10",X"68",X"B9",X"FF",X"02",X"00",X"04",X"11",X"A4",X"84",X"00",X"04",X"1B", + X"A4",X"E9",X"10",X"20",X"5B",X"56",X"53",X"57",X"BF",X"B6",X"FF",X"E9",X"10",X"20",X"66",X"62", + X"68",X"61",X"BF",X"B6",X"FF",X"81",X"00",X"03",X"2A",X"A4",X"AD",X"51",X"4A",X"D1",X"51",X"4A", + X"51",X"4A",X"D1",X"51",X"4A",X"D1",X"51",X"4A",X"51",X"4A",X"D1",X"51",X"4A",X"D1",X"51",X"4A", + X"51",X"4A",X"D1",X"51",X"4A",X"D1",X"51",X"4A",X"51",X"4A",X"D1",X"51",X"4A",X"D1",X"51",X"4A", + X"51",X"4A",X"D1",X"51",X"4A",X"D1",X"51",X"4A",X"51",X"4A",X"D1",X"FF",X"C1",X"00",X"03",X"61", + X"A4",X"AB",X"50",X"54",X"D1",X"50",X"54",X"D1",X"FF",X"02",X"01",X"02",X"73",X"A4",X"84",X"01", + X"02",X"93",X"A4",X"AD",X"37",X"B2",X"D1",X"36",X"B2",X"D1",X"37",X"B2",X"D1",X"39",X"B2",X"D1", + X"3B",X"B2",X"D1",X"39",X"B2",X"D1",X"3B",X"B2",X"D1",X"40",X"B2",X"D1",X"42",X"BD",X"D1",X"32", + X"BD",X"D1",X"FF",X"AD",X"34",X"B2",X"D1",X"33",X"B2",X"D1",X"34",X"B2",X"D1",X"36",X"B2",X"D1", + X"37",X"B2",X"D1",X"36",X"B2",X"D1",X"37",X"B2",X"D1",X"37",X"B2",X"D1",X"39",X"BD",X"D1",X"29", + X"BD",X"D1",X"FF",X"01",X"00",X"03",X"BD",X"A4",X"82",X"00",X"03",X"C6",X"A4",X"E9",X"20",X"20", + X"C0",X"15",X"BF",X"90",X"C1",X"FF",X"E9",X"20",X"20",X"C0",X"15",X"BF",X"90",X"C1",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"A0",X"4D",X"21",X"00",X"4B",X"06",X"02",X"CF",X"3E",X"23",X"06",X"04",X"FF",X"3E",X"10", + X"CD",X"27",X"A5",X"3A",X"00",X"4B",X"3C",X"FE",X"04",X"38",X"01",X"AF",X"32",X"00",X"4B",X"3E", + X"0E",X"CD",X"27",X"A5",X"C3",X"09",X"A5",X"F5",X"21",X"5E",X"45",X"3A",X"00",X"4B",X"06",X"0C", + X"B7",X"28",X"07",X"05",X"3D",X"CD",X"79",X"90",X"18",X"F6",X"F1",X"0E",X"01",X"0D",X"20",X"03", + X"0E",X"04",X"77",X"05",X"28",X"05",X"CD",X"79",X"90",X"18",X"F2",X"2B",X"06",X"02",X"0D",X"20", + X"03",X"0E",X"04",X"77",X"05",X"28",X"03",X"2B",X"18",X"F4",X"11",X"E0",X"FF",X"19",X"06",X"0B", + X"0D",X"20",X"03",X"0E",X"04",X"77",X"05",X"28",X"06",X"11",X"E0",X"FF",X"19",X"18",X"F1",X"23", + X"06",X"02",X"0D",X"20",X"03",X"0E",X"04",X"77",X"05",X"C8",X"23",X"18",X"F5",X"FF",X"FF",X"FF", + X"DD",X"21",X"D4",X"A5",X"CD",X"0A",X"8F",X"DD",X"21",X"F6",X"40",X"FD",X"21",X"F0",X"A5",X"06", + X"09",X"C5",X"DD",X"E5",X"E1",X"FD",X"7E",X"00",X"FD",X"5E",X"01",X"01",X"02",X"02",X"CD",X"5C", + X"90",X"DD",X"E5",X"E1",X"11",X"40",X"00",X"19",X"3E",X"3A",X"1E",X"00",X"01",X"04",X"01",X"CD", + X"4A",X"90",X"DD",X"E5",X"FD",X"6E",X"02",X"FD",X"66",X"03",X"E5",X"DD",X"E1",X"CD",X"0A",X"8F", + X"3E",X"23",X"06",X"08",X"FF",X"11",X"04",X"00",X"FD",X"19",X"DD",X"E1",X"DD",X"2B",X"DD",X"2B", + X"C1",X"10",X"BE",X"C9",X"00",X"05",X"BC",X"41",X"01",X"02",X"44",X"14",X"52",X"03",X"45",X"04", + X"41",X"05",X"4D",X"07",X"9A",X"41",X"00",X"05",X"53",X"48",X"4F",X"50",X"50",X"45",X"52",X"00", + X"B8",X"0D",X"14",X"A6",X"B8",X"0E",X"26",X"A6",X"B8",X"0F",X"38",X"A6",X"B8",X"10",X"4A",X"A6", + X"C0",X"0D",X"5C",X"A6",X"C4",X"0E",X"6A",X"A6",X"C8",X"0F",X"78",X"A6",X"CC",X"10",X"86",X"A6", + X"01",X"0A",X"94",X"A6",X"04",X"0B",X"D6",X"41",X"00",X"02",X"4D",X"49",X"53",X"54",X"45",X"52", + X"59",X"20",X"50",X"54",X"53",X"00",X"04",X"0B",X"D4",X"41",X"00",X"03",X"4D",X"49",X"53",X"54", + X"45",X"52",X"59",X"20",X"50",X"54",X"53",X"00",X"04",X"0B",X"D2",X"41",X"00",X"04",X"4D",X"49", + X"53",X"54",X"45",X"52",X"59",X"20",X"50",X"54",X"53",X"00",X"04",X"0B",X"D0",X"41",X"00",X"05", + X"4D",X"49",X"53",X"54",X"45",X"52",X"59",X"20",X"50",X"54",X"53",X"00",X"04",X"07",X"CE",X"41", + X"00",X"02",X"35",X"30",X"30",X"20",X"50",X"54",X"53",X"00",X"04",X"07",X"CC",X"41",X"00",X"03", + X"32",X"35",X"30",X"20",X"50",X"54",X"53",X"00",X"04",X"07",X"CA",X"41",X"00",X"04",X"31",X"30", + X"30",X"20",X"50",X"54",X"53",X"00",X"04",X"07",X"C8",X"41",X"00",X"05",X"20",X"35",X"30",X"20", + X"50",X"54",X"53",X"00",X"04",X"04",X"C6",X"41",X"00",X"04",X"42",X"4F",X"4D",X"42",X"00",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"C0",X"4F",X"AF",X"32",X"C0",X"50",X"1E",X"00",X"21",X"00",X"40",X"01",X"00",X"10",X"73", + X"23",X"0D",X"20",X"FB",X"AF",X"32",X"C0",X"50",X"10",X"F5",X"21",X"00",X"40",X"01",X"00",X"10", + X"7E",X"BB",X"20",X"15",X"23",X"0D",X"20",X"F8",X"AF",X"32",X"C0",X"50",X"10",X"F2",X"3E",X"11", + X"83",X"5F",X"E6",X"0F",X"20",X"D3",X"C3",X"60",X"A7",X"AF",X"32",X"C0",X"50",X"DD",X"21",X"78", + X"A7",X"7C",X"FE",X"48",X"38",X"04",X"DD",X"21",X"8A",X"A7",X"CD",X"0A",X"8F",X"AF",X"32",X"C0", + X"50",X"01",X"00",X"00",X"0D",X"20",X"FD",X"AF",X"32",X"C0",X"50",X"10",X"F7",X"C3",X"03",X"A7", + X"21",X"02",X"48",X"CB",X"66",X"CB",X"E6",X"EF",X"CD",X"07",X"AC",X"DD",X"21",X"9C",X"A7",X"CD", + X"0A",X"8F",X"CD",X"11",X"AC",X"C3",X"AF",X"A7",X"00",X"0B",X"4F",X"41",X"00",X"00",X"52",X"41", + X"4D",X"20",X"45",X"52",X"52",X"4F",X"52",X"3B",X"31",X"00",X"00",X"0B",X"4F",X"41",X"00",X"00", + X"52",X"41",X"4D",X"20",X"45",X"52",X"52",X"4F",X"52",X"3B",X"32",X"00",X"00",X"0C",X"4F",X"41", + X"00",X"05",X"52",X"41",X"4D",X"20",X"43",X"48",X"45",X"43",X"4B",X"20",X"4F",X"4B",X"00",X"CD", + X"07",X"AC",X"DD",X"21",X"1F",X"A8",X"CD",X"0A",X"8F",X"DD",X"21",X"95",X"41",X"21",X"00",X"00", + X"11",X"2F",X"A8",X"AF",X"01",X"00",X"10",X"86",X"23",X"0D",X"20",X"FB",X"10",X"F9",X"47",X"1A", + X"B8",X"CD",X"ED",X"A7",X"DD",X"2B",X"DD",X"2B",X"13",X"7C",X"FE",X"B0",X"28",X"09",X"FE",X"40", + X"20",X"E1",X"21",X"00",X"80",X"18",X"DC",X"CD",X"11",X"AC",X"C3",X"47",X"A8",X"06",X"08",X"E5", + X"D5",X"DD",X"E5",X"E1",X"11",X"37",X"A8",X"28",X"03",X"11",X"3F",X"A8",X"1A",X"77",X"13",X"CD", + X"79",X"90",X"10",X"F8",X"E1",X"E5",X"01",X"2F",X"A8",X"B7",X"ED",X"42",X"7D",X"3C",X"F6",X"30", + X"DD",X"E5",X"11",X"80",X"00",X"DD",X"19",X"DD",X"77",X"00",X"DD",X"E1",X"D1",X"E1",X"C9",X"00", + X"09",X"9A",X"41",X"00",X"17",X"52",X"4F",X"4D",X"20",X"43",X"48",X"45",X"43",X"4B",X"00",X"FE", + X"74",X"94",X"D1",X"2F",X"7D",X"00",X"42",X"52",X"4F",X"4D",X"3B",X"20",X"20",X"4F",X"4B",X"52", + X"4F",X"4D",X"3B",X"20",X"42",X"41",X"44",X"CD",X"07",X"AC",X"DD",X"21",X"49",X"A9",X"CD",X"0A", + X"8F",X"DD",X"21",X"04",X"AA",X"CD",X"0A",X"8F",X"3A",X"00",X"50",X"2F",X"E6",X"BF",X"21",X"DC", + X"44",X"CD",X"F4",X"A8",X"3A",X"40",X"50",X"2F",X"E6",X"7F",X"FE",X"60",X"CA",X"0E",X"A9",X"21", + X"3C",X"46",X"CD",X"F4",X"A8",X"3A",X"80",X"50",X"2F",X"21",X"0F",X"45",X"06",X"08",X"1E",X"00", + X"CB",X"3F",X"30",X"02",X"1E",X"04",X"73",X"CD",X"79",X"90",X"CD",X"79",X"90",X"10",X"EF",X"3A", + X"80",X"50",X"2F",X"CB",X"47",X"DD",X"21",X"DA",X"AB",X"20",X"04",X"DD",X"21",X"E9",X"AB",X"F5", + X"CD",X"0A",X"8F",X"F1",X"F5",X"E6",X"02",X"CB",X"3F",X"32",X"03",X"50",X"F1",X"F5",X"E6",X"0C", + X"CB",X"3F",X"CB",X"3F",X"21",X"76",X"AA",X"CD",X"1D",X"94",X"D5",X"DD",X"E1",X"CD",X"0A",X"8F", + X"F1",X"F5",X"E6",X"30",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6",X"33",X"21",X"65", + X"42",X"77",X"CB",X"D4",X"36",X"14",X"F1",X"E6",X"C0",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"21",X"76",X"AB",X"CD",X"1D",X"94",X"D5",X"DD",X"E1",X"CD",X"0A", + X"8F",X"C3",X"58",X"A8",X"06",X"08",X"E5",X"C5",X"1E",X"00",X"CB",X"3F",X"30",X"02",X"1E",X"04", + X"06",X"09",X"73",X"CD",X"79",X"90",X"10",X"FA",X"C1",X"E1",X"2B",X"10",X"E9",X"C9",X"21",X"00", + X"40",X"1E",X"16",X"3E",X"00",X"01",X"20",X"20",X"CD",X"4A",X"90",X"3E",X"01",X"32",X"02",X"50", + X"32",X"01",X"50",X"3A",X"00",X"50",X"2F",X"E6",X"0F",X"28",X"F8",X"11",X"00",X"00",X"FE",X"01", + X"28",X"11",X"11",X"01",X"00",X"FE",X"02",X"28",X"0A",X"11",X"00",X"01",X"FE",X"04",X"28",X"03", + X"11",X"01",X"01",X"ED",X"53",X"05",X"50",X"18",X"DA",X"00",X"0E",X"3E",X"41",X"00",X"17",X"43", + X"4F",X"4E",X"54",X"52",X"4F",X"4C",X"45",X"52",X"20",X"54",X"45",X"53",X"54",X"11",X"DC",X"40", + X"00",X"00",X"50",X"31",X"3A",X"3A",X"55",X"50",X"20",X"20",X"20",X"20",X"20",X"50",X"32",X"3A", + X"3A",X"55",X"50",X"13",X"DB",X"40",X"00",X"00",X"50",X"31",X"3A",X"3A",X"4C",X"45",X"46",X"54", + X"20",X"20",X"20",X"50",X"32",X"3A",X"3A",X"4C",X"45",X"46",X"54",X"14",X"DA",X"40",X"00",X"00", + X"50",X"31",X"3A",X"3A",X"52",X"49",X"47",X"48",X"54",X"20",X"20",X"50",X"32",X"3A",X"3A",X"52", + X"49",X"47",X"48",X"54",X"13",X"D9",X"40",X"00",X"00",X"50",X"31",X"3A",X"3A",X"44",X"4F",X"57", + X"4E",X"20",X"20",X"20",X"50",X"32",X"3A",X"3A",X"44",X"4F",X"57",X"4E",X"13",X"D8",X"40",X"00", + X"00",X"50",X"31",X"3A",X"3A",X"50",X"55",X"53",X"48",X"20",X"20",X"20",X"50",X"32",X"3A",X"3A", + X"50",X"55",X"53",X"48",X"11",X"17",X"41",X"00",X"00",X"43",X"4F",X"49",X"4E",X"20",X"20",X"20", + X"20",X"20",X"31",X"50",X"3A",X"53",X"54",X"41",X"52",X"54",X"08",X"36",X"42",X"00",X"00",X"32", + X"50",X"3A",X"53",X"54",X"41",X"52",X"54",X"07",X"F5",X"40",X"00",X"00",X"53",X"45",X"52",X"56", + X"49",X"43",X"45",X"00",X"00",X"0B",X"71",X"41",X"00",X"17",X"44",X"49",X"50",X"3B",X"53",X"57", + X"20",X"54",X"45",X"53",X"54",X"0F",X"0F",X"41",X"00",X"00",X"31",X"20",X"32",X"20",X"33",X"20", + X"34",X"20",X"35",X"20",X"36",X"20",X"37",X"20",X"38",X"0E",X"AC",X"40",X"00",X"00",X"47",X"41", + X"4D",X"45",X"20",X"53",X"54",X"59",X"4C",X"45",X"3A",X"3A",X"3A",X"3A",X"0E",X"AA",X"40",X"00", + X"00",X"42",X"4F",X"4E",X"55",X"53",X"20",X"4C",X"49",X"56",X"45",X"53",X"3A",X"3A",X"3A",X"0E", + X"A5",X"40",X"00",X"00",X"43",X"48",X"41",X"52",X"4C",X"45",X"59",X"20",X"4F",X"57",X"4E",X"3A", + X"3A",X"3A",X"0E",X"A3",X"40",X"00",X"00",X"43",X"52",X"45",X"44",X"49",X"54",X"3A",X"3A",X"3A", + X"3A",X"3A",X"3A",X"3A",X"3A",X"00",X"7E",X"AA",X"BC",X"AA",X"FA",X"AA",X"38",X"AB",X"00",X"0A", + X"6A",X"42",X"00",X"04",X"4E",X"4F",X"20",X"42",X"4F",X"4E",X"55",X"53",X"20",X"20",X"0A",X"69", + X"42",X"00",X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"0A",X"68",X"42", + X"00",X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"0A",X"67",X"42",X"00", + X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"00",X"0A",X"6A",X"42", + X"00",X"05",X"31",X"53",X"54",X"20",X"20",X"33",X"30",X"30",X"30",X"30",X"0A",X"69",X"42",X"00", + X"04",X"32",X"4E",X"44",X"20",X"20",X"36",X"30",X"30",X"30",X"30",X"0A",X"68",X"42",X"00",X"17", + X"33",X"52",X"44",X"20",X"31",X"35",X"30",X"30",X"30",X"30",X"0A",X"67",X"42",X"00",X"02",X"34", + X"54",X"48",X"20",X"32",X"35",X"30",X"30",X"30",X"30",X"00",X"00",X"0A",X"6A",X"42",X"00",X"05", + X"31",X"53",X"54",X"20",X"20",X"35",X"30",X"30",X"30",X"30",X"0A",X"69",X"42",X"00",X"04",X"32", + X"4E",X"44",X"20",X"31",X"30",X"30",X"30",X"30",X"30",X"0A",X"68",X"42",X"00",X"17",X"33",X"52", + X"44",X"20",X"32",X"30",X"30",X"30",X"30",X"30",X"0A",X"67",X"42",X"00",X"02",X"34",X"54",X"48", + X"20",X"35",X"30",X"30",X"30",X"30",X"30",X"00",X"00",X"0A",X"6A",X"42",X"00",X"05",X"31",X"53", + X"54",X"20",X"20",X"37",X"30",X"30",X"30",X"30",X"0A",X"69",X"42",X"00",X"04",X"32",X"4E",X"44", + X"20",X"31",X"35",X"30",X"30",X"30",X"30",X"0A",X"68",X"42",X"00",X"17",X"33",X"52",X"44",X"20", + X"33",X"30",X"30",X"30",X"30",X"30",X"0A",X"67",X"42",X"00",X"02",X"34",X"54",X"48",X"20",X"37", + X"30",X"30",X"30",X"30",X"30",X"00",X"7E",X"AB",X"95",X"AB",X"AC",X"AB",X"C3",X"AB",X"00",X"10", + X"C3",X"41",X"00",X"05",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"31",X"20",X"43",X"52",X"45", + X"44",X"49",X"54",X"20",X"00",X"00",X"10",X"C3",X"41",X"00",X"05",X"31",X"20",X"43",X"4F",X"49", + X"4E",X"20",X"32",X"20",X"43",X"52",X"45",X"44",X"49",X"54",X"20",X"00",X"00",X"10",X"C3",X"41", + X"00",X"05",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"33",X"20",X"43",X"52",X"45",X"44",X"49", + X"54",X"20",X"00",X"00",X"10",X"C3",X"41",X"00",X"05",X"32",X"20",X"43",X"4F",X"49",X"4E",X"53", + X"20",X"31",X"20",X"43",X"52",X"45",X"44",X"49",X"54",X"00",X"00",X"08",X"6C",X"42",X"00",X"04", + X"54",X"41",X"42",X"4C",X"45",X"20",X"20",X"20",X"00",X"00",X"08",X"6C",X"42",X"00",X"04",X"55", + X"50",X"20",X"52",X"49",X"47",X"48",X"54",X"00",X"00",X"08",X"6A",X"42",X"00",X"04",X"4E",X"4F", + X"20",X"42",X"4F",X"4E",X"55",X"53",X"00",X"21",X"00",X"40",X"01",X"00",X"08",X"CD",X"00",X"8F", + X"C9",X"3E",X"05",X"01",X"FF",X"FF",X"0D",X"20",X"FD",X"05",X"20",X"FA",X"3D",X"20",X"F4",X"C9", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"20",X"4E",X"21",X"A0",X"4A",X"06",X"1E",X"CF",X"3E",X"23",X"06",X"01",X"FF",X"FD",X"21", + X"A0",X"4A",X"06",X"03",X"C5",X"FD",X"7E",X"00",X"B7",X"C4",X"26",X"AD",X"01",X"0A",X"00",X"FD", + X"09",X"C1",X"10",X"F0",X"18",X"E3",X"FE",X"01",X"C2",X"DB",X"AD",X"FD",X"35",X"05",X"C2",X"50", + X"AD",X"FD",X"34",X"00",X"FD",X"36",X"06",X"00",X"FD",X"36",X"07",X"00",X"FD",X"66",X"01",X"FD", + X"6E",X"02",X"CD",X"1E",X"92",X"01",X"02",X"02",X"3E",X"09",X"1E",X"0B",X"CD",X"5C",X"90",X"C9", + X"FD",X"7E",X"07",X"CB",X"BF",X"B7",X"28",X"06",X"FD",X"35",X"07",X"C3",X"A3",X"AD",X"3E",X"02", + X"FD",X"B6",X"07",X"FD",X"77",X"07",X"FD",X"66",X"03",X"FD",X"6E",X"04",X"CD",X"1E",X"92",X"1E", + X"0D",X"FD",X"CB",X"07",X"7E",X"FD",X"CB",X"07",X"FE",X"28",X"06",X"FD",X"CB",X"07",X"BE",X"1E", + X"10",X"01",X"05",X"05",X"C5",X"E5",X"C5",X"E5",X"3E",X"88",X"01",X"02",X"02",X"CD",X"5C",X"90", + X"E1",X"23",X"23",X"C1",X"10",X"F0",X"E1",X"01",X"40",X"00",X"09",X"C1",X"0D",X"C2",X"84",X"AD", + X"C3",X"BF",X"AD",X"FD",X"7E",X"06",X"CB",X"BF",X"B7",X"28",X"04",X"FD",X"35",X"06",X"C9",X"3E", + X"04",X"FD",X"B6",X"06",X"CB",X"7F",X"CB",X"FF",X"28",X"02",X"CB",X"BF",X"FD",X"77",X"06",X"FD", + X"66",X"01",X"FD",X"6E",X"02",X"CD",X"1E",X"92",X"3E",X"01",X"FD",X"CB",X"06",X"7E",X"28",X"02", + X"3E",X"05",X"01",X"02",X"02",X"1E",X"0A",X"CD",X"5C",X"90",X"C9",X"3A",X"02",X"48",X"CB",X"77", + X"CB",X"F7",X"20",X"0C",X"32",X"02",X"48",X"CB",X"6F",X"20",X"05",X"3E",X"1F",X"CD",X"40",X"03", + X"FD",X"7E",X"06",X"B7",X"28",X"06",X"FD",X"35",X"06",X"C3",X"1A",X"AE",X"FD",X"36",X"06",X"03", + X"FD",X"66",X"01",X"FD",X"6E",X"02",X"CD",X"1E",X"92",X"7E",X"FE",X"11",X"20",X"02",X"3E",X"05", + X"C6",X"04",X"1E",X"0B",X"01",X"02",X"02",X"CD",X"5C",X"90",X"FD",X"7E",X"07",X"B7",X"28",X"04", + X"FD",X"35",X"07",X"C9",X"FD",X"36",X"07",X"03",X"FD",X"66",X"01",X"FD",X"6E",X"02",X"CD",X"1E", + X"92",X"E5",X"E5",X"FD",X"7E",X"08",X"3D",X"CB",X"7F",X"28",X"02",X"3E",X"03",X"CD",X"56",X"AF", + X"E1",X"19",X"3E",X"05",X"CD",X"BC",X"AF",X"FD",X"7E",X"08",X"CD",X"56",X"AF",X"E1",X"19",X"3E", + X"02",X"CD",X"BC",X"AF",X"FD",X"7E",X"08",X"3C",X"FD",X"77",X"08",X"FE",X"04",X"D8",X"FD",X"36", + X"08",X"00",X"FD",X"34",X"09",X"3E",X"04",X"FD",X"BE",X"09",X"C0",X"FD",X"E5",X"FD",X"66",X"01", + X"FD",X"6E",X"02",X"CD",X"AC",X"91",X"36",X"20",X"FD",X"66",X"03",X"FD",X"6E",X"04",X"E5",X"CD", + X"AC",X"91",X"E5",X"FD",X"E1",X"E1",X"CD",X"1E",X"92",X"E5",X"DD",X"E1",X"01",X"05",X"05",X"C5", + X"FD",X"E5",X"DD",X"E5",X"C5",X"DD",X"E5",X"E1",X"CD",X"83",X"26",X"30",X"0C",X"3E",X"88",X"1E", + X"03",X"01",X"02",X"02",X"CD",X"5C",X"90",X"18",X"24",X"FD",X"CB",X"00",X"9E",X"21",X"0C",X"AF", + X"FD",X"7E",X"00",X"CB",X"7F",X"28",X"03",X"21",X"16",X"AF",X"E6",X"70",X"CB",X"3F",X"CB",X"3F", + X"CB",X"3F",X"CB",X"3F",X"CD",X"1D",X"94",X"EB",X"11",X"CD",X"AE",X"D5",X"E9",X"FD",X"23",X"DD", + X"23",X"DD",X"23",X"C1",X"10",X"BE",X"DD",X"E1",X"11",X"40",X"00",X"DD",X"19",X"FD",X"E1",X"11", + X"0C",X"00",X"FD",X"19",X"C1",X"0D",X"20",X"A7",X"FD",X"E1",X"FD",X"E5",X"E1",X"06",X"0A",X"CF", + X"FD",X"E5",X"FD",X"21",X"A0",X"4A",X"06",X"03",X"FD",X"7E",X"00",X"B7",X"20",X"0B",X"FD",X"23", + X"10",X"F6",X"21",X"02",X"48",X"CB",X"76",X"CB",X"B6",X"FD",X"E1",X"C9",X"20",X"AF",X"20",X"AF", + X"34",X"AF",X"B6",X"2D",X"27",X"AF",X"44",X"AF",X"44",X"AF",X"34",X"AF",X"44",X"AF",X"34",X"AF", + X"3A",X"01",X"48",X"CB",X"57",X"20",X"13",X"DD",X"E5",X"E1",X"AF",X"1E",X"16",X"01",X"02",X"02", + X"CD",X"4A",X"90",X"C9",X"1E",X"14",X"3E",X"88",X"18",X"12",X"FD",X"7E",X"00",X"E6",X"07",X"CD", + X"76",X"95",X"18",X"08",X"FD",X"7E",X"00",X"E6",X"07",X"CD",X"87",X"95",X"DD",X"E5",X"E1",X"01", + X"02",X"02",X"CD",X"5C",X"90",X"C9",X"21",X"62",X"AF",X"CD",X"0B",X"94",X"46",X"23",X"5E",X"23", + X"56",X"C9",X"04",X"DF",X"FF",X"06",X"BE",X"FF",X"08",X"9D",X"FF",X"0A",X"7C",X"FF",X"3E",X"18", + X"CD",X"40",X"03",X"FD",X"21",X"A0",X"4A",X"06",X"03",X"C5",X"FD",X"7E",X"00",X"B7",X"20",X"33", + X"FD",X"34",X"00",X"FD",X"74",X"01",X"FD",X"75",X"02",X"3E",X"40",X"FD",X"77",X"05",X"01",X"E0", + X"20",X"CD",X"A5",X"91",X"FD",X"74",X"03",X"FD",X"75",X"04",X"CD",X"AC",X"91",X"01",X"05",X"05", + X"C5",X"E5",X"CB",X"DE",X"23",X"10",X"FB",X"E1",X"01",X"0C",X"00",X"09",X"C1",X"0D",X"C2",X"A0", + X"AF",X"C1",X"C9",X"01",X"0A",X"00",X"FD",X"09",X"C1",X"10",X"BE",X"C9",X"C5",X"CD",X"E6",X"AF", + X"23",X"10",X"FA",X"2B",X"C1",X"C5",X"11",X"20",X"00",X"CD",X"E6",X"AF",X"19",X"10",X"FA",X"C1", + X"C5",X"B7",X"ED",X"52",X"CD",X"E6",X"AF",X"2B",X"10",X"FA",X"C1",X"23",X"11",X"E0",X"FF",X"CD", + X"E6",X"AF",X"19",X"10",X"FA",X"C9",X"36",X"1F",X"CB",X"D4",X"77",X"CB",X"94",X"C9",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_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/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/build_id.v new file mode 100644 index 00000000..6953fec4 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171120" +`define BUILD_TIME "164851" diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/dac.vhd new file mode 100644 index 00000000..47b2185e --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 10 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..fec08f5f --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) := (others => '0'); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/dreamshp.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/dreamshp.vhd new file mode 100644 index 00000000..31e82bb2 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/dreamshp.vhd @@ -0,0 +1,477 @@ +-- +-- A simulation model of Dream Shopper hardware +-- Copyright (c) Sorgelig - 2017 +-- +-- Based on Pacman core +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity DREAMSHP is + generic( + eight_sprites : boolean := true + ); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(9 downto 0); + -- + in0 : in std_logic_vector(7 downto 0); + in1 : in std_logic_vector(7 downto 0); + dipsw1 : in std_logic_vector(7 downto 0); + dipsw2 : in std_logic_vector(7 downto 0); + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic; + ENA_1M79 : in std_logic + ); +end; + +architecture RTL of DREAMSHP is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_wr_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_nmi_l : std_logic := '1'; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal hp : std_logic_vector ( 4 downto 0); + signal vp : std_logic_vector ( 4 downto 0); + signal ram_cs : std_logic; + signal ram_data : std_logic_vector(7 downto 0); + signal vram_data : std_logic_vector(7 downto 0); + signal sprite_xy_data : std_logic_vector(7 downto 0); + signal vram_addr : std_logic_vector(11 downto 0); + + signal iodec_spr_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw1_l : std_logic; + signal iodec_dipsw2_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + + signal sn_we : std_logic; + signal wav1,wav2,wav3 : std_logic_vector(7 downto 0); + + component ym2149 is port + ( + CLK : in std_logic; + CE : in std_logic; + RESET : in std_logic; + BDIR : in std_logic; + BC : in std_logic; + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + CHANNEL_A: out std_logic_vector(7 downto 0); + CHANNEL_B: out std_logic_vector(7 downto 0); + CHANNEL_C: out std_logic_vector(7 downto 0); + + SEL : in std_logic; + MODE : in std_logic; + IOA_in : in std_logic_vector(7 downto 0); + IOA_out : out std_logic_vector(7 downto 0); + + IOB_in : in std_logic_vector(7 downto 0); + IOB_out : out std_logic_vector(7 downto 0) + ); + end component; + +begin + +-- +-- video timing +-- +p_hvcnt : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + if hcnt = "111111111" then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + if do_hsync then + if vcnt = "111111111" then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; +end process; + +vsync <= not vcnt(8); +do_hsync <= (hcnt = "010101111"); -- 0AF + +p_sync : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + + if (hcnt = "010001111") and not eight_sprites then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") and not eight_sprites then + hblank <= '0'; -- 0EF + elsif (hcnt = "111111111") and eight_sprites then + hblank <= '1'; + elsif (hcnt = "011111111") and eight_sprites then + hblank <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; +end process; + +-- +-- cpu +-- +p_irq_req_watchdog : process + variable rising_vblank : boolean; +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + + if (control_reg(0) = '0') then + cpu_nmi_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_nmi_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + --watchdog_reset_l <= not reset; + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + end if; +end process; + +u_cpu : entity work.T80sed +port map +( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => hcnt(0) and ena_6, + WAIT_n => sync_bus_wreq_l, + INT_n => '1', + NMI_n => cpu_nmi_l, + BUSRQ_n => '1', + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => cpu_wr_l, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out +); + +-- rom 0x0000 - 0x3FFF +-- syncbus 0x4000 - 0x7FFF +sync_bus_cs_l <= '0' when cpu_mreq_l = '0' and cpu_rfsh_l = '1' and cpu_addr(14) = '1' else '1'; +sync_bus_wreq_l <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '1' and cpu_rd_l = '0' else '1'; +sync_bus_stb <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '0' else '1'; +sync_bus_r_w_l <= '0' when sync_bus_stb = '0' and cpu_rd_l = '1' else '1'; + +-- +-- sync bus custom ic +-- +p_sync_bus_reg : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; +end process; + + +-- WRITE +-- out_l 0x5000 - 0x503F control space +-- spr_l 0x5040 - 0x507F sprite +-- wdr_l 0x50C0 - 0x50FF watchdog reset +iodec_out_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_spr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"01" else '1'; +iodec_wdr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +-- READ +-- in0_l 0x5000 - 0x503F in port 0 +-- in1_l 0x5040 - 0x507F in port 1 +-- dipsw_l 0x5080 - 0x50BF dip switches +iodec_in0_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_in1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"01" else '1'; +iodec_dipsw1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"10" else '1'; +iodec_dipsw2_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +p_control_reg : process +begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + elsif (iodec_out_l = '0') then + control_reg(to_integer(unsigned(cpu_addr(2 downto 0)))) <= cpu_data_out(0); + end if; + end if; +end process; + +cpu_data_in <= cpu_vec_reg when (cpu_iorq_l = '0') and (cpu_m1_l = '0') else + sync_bus_reg when sync_bus_wreq_l = '0' else + program_rom_dinl when cpu_addr(15 downto 14) = "00" else -- ROM at 0000 - 3fff + program_rom_dinh when cpu_addr(15 downto 14) = "10" else -- ROM at 8000 - bfff + in0 when iodec_in0_l = '0' else + in1 when iodec_in1_l = '0' else + dipsw1 when iodec_dipsw1_l = '0' else + dipsw2 when iodec_dipsw2_l = '0' else + ram_data; + +u_program_rom : entity work.ROM_PGM_0 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl +); + +u_program_rom1 : entity work.ROM_PGM_1 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinh +); + +ram_cs <= '1' when cpu_addr(15 downto 12) = X"4" else '0'; + +u_rams : work.dpram generic map (12,8) +port map +( + clock_a => clk, + enable_a => ena_6, + wren_a => not sync_bus_r_w_l and ram_cs, + address_a => cpu_addr(11 downto 0), + data_a => cpu_data_out, -- cpu only source of ram data + q_a => ram_data, + + clock_b => clk, + address_b => vram_addr(11 downto 0), + q_b => vram_data +); + +-- +-- video subsystem +-- + +-- vram addr custom ic +hp <= hcnt(7 downto 3) when control_reg(3) = '0' else not hcnt(7 downto 3); +vp <= vcnt(7 downto 3) when control_reg(3) = '0' else not vcnt(7 downto 3); +vram_addr <= '0' & hcnt(2) & vp & hp when hcnt(8)='1' else + x"FF" & hcnt(6 downto 4) & hcnt(2) when hblank = '1' else + '0' & hcnt(2) & hp(3) & hp(3) & hp(3) & hp(3) & hp(0) & vp; + +sprite_xy_ram : work.dpram generic map (4,8) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not iodec_spr_l, + address_a => cpu_addr(3 downto 0), + data_a => cpu_data_out, + + clock_b => CLK, + address_b => vram_addr(3 downto 0), + q_b => sprite_xy_data +); + +u_video : entity work.DREAMSHP_VIDEO +port map +( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + vram_data => vram_data, + sprite_xy => sprite_xy_data, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + O_HBLANK => O_HBLANK, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk +); + +O_HSYNC <= hSync; +O_VSYNC <= vSync; +O_VBLANK <= vblank; + +-- +-- +-- audio subsystem +-- +sn_we <= '1' when cpu_wr_l = '0' and cpu_iorq_l = '0' and cpu_addr(7 downto 1) = "0000011" else '0'; + +sn : ym2149 +port map +( + CLK => clk, + CE => ENA_1M79, + RESET => reset, + BDIR => sn_we, + BC => cpu_addr(0), + DI => cpu_data_out, + DO => open, + CHANNEL_A=> wav1, + CHANNEL_B=> wav2, + CHANNEL_C=> wav3, + + SEL => '0', + MODE => '0', + IOA_in => (others => '0'), + IOA_out => open, + + IOB_in => (others => '0'), + IOB_out => open +); + +O_AUDIO <= ("00" & wav1) + ("00" & wav2) + ("00" & wav3); + +end RTL; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/dreamshp_video.vhd b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/dreamshp_video.vhd new file mode 100644 index 00000000..b03047bf --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/dreamshp_video.vhd @@ -0,0 +1,278 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity DREAMSHP_VIDEO is + generic( + alt_transp : boolean := true + ); + port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + vram_data : in std_logic_vector(7 downto 0); + sprite_xy : in std_logic_vector(7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + O_HBLANK : out std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of DREAMSHP_VIDEO is + + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal sprite_data : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + signal obj_on2 : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_op_t1 : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal sprite_ram_ip : std_logic_vector(5 downto 0); + signal sprite_ram_op : std_logic_vector(5 downto 0); + signal sprite_addr : std_logic_vector(7 downto 0); + signal sprite_addr_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(5 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + +dr <= not sprite_xy when I_HBLANK = '1' else "11111111"; -- pull ups on board + +p_char_regs : process + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; +begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & not I_HBLANK); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + sprite_data <= vram_data; -- character reg + end if; +end process; + +xflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(1); +yflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(0); + +obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + +ca(12) <= char_hblank_reg; +ca(11 downto 6) <= sprite_data(7 downto 2); +ca(5) <= sprite_data(1) when char_hblank_reg = '0' else char_sum_reg(3) xor xflip; +ca(4) <= sprite_data(0) when char_hblank_reg = '0' else I_HCNT(3); +ca(3) <= I_HCNT(2) xor yflip; +ca(2) <= char_sum_reg(2) xor xflip; +ca(1) <= char_sum_reg(1) xor xflip; +ca(0) <= char_sum_reg(0) xor xflip; + +-- char roms +char_rom_5ef : entity work.GFX1 +port map +( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf +); + +p_char_shift : process +begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_buf(7 downto 4); -- load + shift_regl <= char_rom_5ef_buf(3 downto 0); + when others => null; + end case; + end if; +end process; + +shift_sel(0) <= I_HCNT(0) and I_HCNT(1) when vout_yflip = '0' else '1'; +shift_sel(1) <= '1' when vout_yflip = '0' else I_HCNT(0) and I_HCNT(1); +shift_op(0) <= shift_regl(3) when vout_yflip = '0' else shift_regl(0); +shift_op(1) <= shift_regu(3) when vout_yflip = '0' else shift_regu(0); + +p_video_out_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= vram_data(4 downto 0); -- colour reg + end if; + + if I_HCNT(3 downto 0) = "0111" and (vout_hblank='1' or I_HBLANK='1' or vout_obj_on='0') then + sprite_addr <= dr; + else + sprite_addr <= sprite_addr + "1"; + end if; + end if; +end process; + +col_rom_4a : entity work.PROM4_DST +port map +( + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a +); + +u_sprite_ram : work.dpram generic map (8,6) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => vout_obj_on_t1, + address_a => sprite_addr_t1, + data_a => sprite_ram_ip, + + clock_b => CLK, + enable_b => ENA_6, + address_b => sprite_addr, + q_b => sprite_ram_op +); + +sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "000000"; +video_op_sel <= '0' when alt_transp and (sprite_ram_reg(1 downto 0) = "00") else + '0' when not alt_transp and (sprite_ram_reg(5 downto 2) = "0000") else + '1'; + +p_sprite_ram_ip_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + sprite_addr_t1 <= sprite_addr; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + shift_op_t1 <= shift_op; + end if; +end process; + +sprite_ram_ip <= (others => '0') when vout_hblank_t1 = '0' else + sprite_ram_reg when video_op_sel = '1' else + lut_4a_t1(3 downto 0) & shift_op_t1; + +final_col <= (others => '0') when (vout_hblank = '1') or (I_VBLANK = '1') else + sprite_ram_reg(5 downto 2) when video_op_sel = '1' else + lut_4a(3 downto 0); + +-- assign video outputs from color LUT PROM +col_rom_7f : entity work.PROM7_DST +port map +( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE +); + +O_HBLANK <= vout_hblank and vout_hblank_t1; + +end architecture; diff --git a/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_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/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_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/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/osd.v b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_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/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_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/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/pll.v b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/pll.v new file mode 100644 index 00000000..60297687 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 8, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "9" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "9" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_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/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ym2149.sv b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ym2149.sv new file mode 100644 index 00000000..a8b47c46 --- /dev/null +++ b/Arcade/Pacman Hardware/DreamShopper_MiST/rtl/ym2149.sv @@ -0,0 +1,295 @@ + + +module ym2149 +( + input CLK, // Global clock + input CE, // PSG Clock enable + input RESET, // Chip RESET (set all Registers to '0', active hi) + input BDIR, // Bus Direction (0 - read , 1 - write) + input BC, // Bus control + input [7:0] DI, // Data In + output [7:0] DO, // Data Out + output [7:0] CHANNEL_A, // PSG Output channel A + output [7:0] CHANNEL_B, // PSG Output channel B + output [7:0] CHANNEL_C, // PSG Output channel C + + input SEL, + input MODE, + + input [7:0] IOA_in, + output [7:0] IOA_out, + + input [7:0] IOB_in, + output [7:0] IOB_out +); + +assign IOA_out = ymreg[14]; +assign IOB_out = ymreg[15]; + +reg ena_div; +reg ena_div_noise; +reg [3:0] addr; +reg [7:0] ymreg[16]; +reg env_ena; +reg [4:0] env_vol; + +wire [7:0] volTableAy[16] = + '{8'h00, 8'h03, 8'h04, 8'h06, + 8'h0a, 8'h0f, 8'h15, 8'h22, + 8'h28, 8'h41, 8'h5b, 8'h72, + 8'h90, 8'hb5, 8'hd7, 8'hff + }; + +wire [7:0] volTableYm[32] = + '{8'h00, 8'h01, 8'h01, 8'h02, + 8'h02, 8'h03, 8'h03, 8'h04, + 8'h06, 8'h07, 8'h09, 8'h0a, + 8'h0c, 8'h0e, 8'h11, 8'h13, + 8'h17, 8'h1b, 8'h20, 8'h25, + 8'h2c, 8'h35, 8'h3e, 8'h47, + 8'h54, 8'h66, 8'h77, 8'h88, + 8'ha1, 8'hc0, 8'he0, 8'hff + }; + +// Read from AY +assign DO = dout; +reg [7:0] dout; +always_comb begin + case(addr) + 0: dout = ymreg[0]; + 1: dout = {4'b0000, ymreg[1][3:0]}; + 2: dout = ymreg[2]; + 3: dout = {4'b0000, ymreg[3][3:0]}; + 4: dout = ymreg[4]; + 5: dout = {4'b0000, ymreg[5][3:0]}; + 6: dout = {3'b000, ymreg[6][4:0]}; + 7: dout = ymreg[7]; + 8: dout = {3'b000, ymreg[8][4:0]}; + 9: dout = {3'b000, ymreg[9][4:0]}; + 10: dout = {3'b000, ymreg[10][4:0]}; + 11: dout = ymreg[11]; + 12: dout = ymreg[12]; + 13: dout = {4'b0000, ymreg[13][3:0]}; + 14: dout = (ymreg[7][6] ? ymreg[14] : IOA_in); + 15: dout = (ymreg[7][7] ? ymreg[15] : IOB_in); + endcase +end + +// p_divider +always @(posedge CLK) begin + reg [3:0] cnt_div; + reg noise_div; + + if(CE) begin + ena_div <= 0; + ena_div_noise <= 0; + if(!cnt_div) begin + cnt_div <= {SEL, 3'b111}; + ena_div <= 1; + + noise_div <= (~noise_div); + if (noise_div) ena_div_noise <= 1; + end else begin + cnt_div <= cnt_div - 1'b1; + end + end +end + + +reg [16:0] poly17; +wire [4:0] noise_gen_comp = ymreg[6][4:0] ? ymreg[6][4:0] - 1'd1 : 5'd0; + +// p_noise_gen +always @(posedge CLK) begin + reg [4:0] noise_gen_cnt; + + if(CE) begin + if (ena_div_noise) begin + if (noise_gen_cnt >= noise_gen_comp) begin + noise_gen_cnt <= 0; + poly17 <= {(poly17[0] ^ poly17[2] ^ !poly17), poly17[16:1]}; + end else begin + noise_gen_cnt <= noise_gen_cnt + 1'd1; + end + end + end +end + +wire [11:0] tone_gen_freq[1:3]; +assign tone_gen_freq[1] = {ymreg[1][3:0], ymreg[0]}; +assign tone_gen_freq[2] = {ymreg[3][3:0], ymreg[2]}; +assign tone_gen_freq[3] = {ymreg[5][3:0], ymreg[4]}; + +wire [11:0] tone_gen_comp[1:3]; +assign tone_gen_comp[1] = tone_gen_freq[1] ? tone_gen_freq[1] - 1'd1 : 12'd0; +assign tone_gen_comp[2] = tone_gen_freq[2] ? tone_gen_freq[2] - 1'd1 : 12'd0; +assign tone_gen_comp[3] = tone_gen_freq[3] ? tone_gen_freq[3] - 1'd1 : 12'd0; + +reg [3:1] tone_gen_op; + +//p_tone_gens +always @(posedge CLK) begin + integer i; + reg [11:0] tone_gen_cnt[1:3]; + + if(CE) begin + // looks like real chips count up - we need to get the Exact behaviour .. + + for (i = 1; i <= 3; i = i + 1) begin + if(ena_div) begin + if (tone_gen_cnt[i] >= tone_gen_comp[i]) begin + tone_gen_cnt[i] <= 0; + tone_gen_op[i] <= (~tone_gen_op[i]); + end else begin + tone_gen_cnt[i] <= tone_gen_cnt[i] + 1'd1; + end + end + end + end +end + +wire [15:0] env_gen_comp = {ymreg[12], ymreg[11]} ? {ymreg[12], ymreg[11]} - 1'd1 : 16'd0; + +//p_envelope_freq +always @(posedge CLK) begin + reg [15:0] env_gen_cnt; + + if(CE) begin + env_ena <= 0; + if(ena_div) begin + if (env_gen_cnt >= env_gen_comp) begin + env_gen_cnt <= 0; + env_ena <= 1; + end else begin + env_gen_cnt <= (env_gen_cnt + 1'd1); + end + end + end +end + +wire is_bot = (env_vol == 5'b00000); +wire is_bot_p1 = (env_vol == 5'b00001); +wire is_top_m1 = (env_vol == 5'b11110); +wire is_top = (env_vol == 5'b11111); + +always @(posedge CLK) begin + reg old_BDIR; + reg env_reset; + reg env_hold; + reg env_inc; + + // envelope shapes + // C AtAlH + // 0 0 x x \___ + // + // 0 1 x x /___ + // + // 1 0 0 0 \\\\ + // + // 1 0 0 1 \___ + // + // 1 0 1 0 \/\/ + // ___ + // 1 0 1 1 \ + // + // 1 1 0 0 //// + // ___ + // 1 1 0 1 / + // + // 1 1 1 0 /\/\ + // + // 1 1 1 1 /___ + + if(RESET) begin + ymreg[0] <= 0; + ymreg[1] <= 0; + ymreg[2] <= 0; + ymreg[3] <= 0; + ymreg[4] <= 0; + ymreg[5] <= 0; + ymreg[6] <= 0; + ymreg[7] <= 255; + ymreg[8] <= 0; + ymreg[9] <= 0; + ymreg[10] <= 0; + ymreg[11] <= 0; + ymreg[12] <= 0; + ymreg[13] <= 0; + ymreg[14] <= 0; + ymreg[15] <= 0; + addr <= 0; + env_vol <= 0; + end else begin + old_BDIR <= BDIR; + if(~old_BDIR & BDIR) begin + if(BC) addr <= DI[3:0]; + else begin + ymreg[addr] <= DI; + env_reset <= (addr == 13); + end + end + end + + if(CE) begin + if(env_reset) begin + env_reset <= 0; + // load initial state + if(!ymreg[13][2]) begin // attack + env_vol <= 5'b11111; + env_inc <= 0; // -1 + end else begin + env_vol <= 5'b00000; + env_inc <= 1; // +1 + end + env_hold <= 0; + end else begin + + if (env_ena) begin + if (!env_hold) begin + if (env_inc) env_vol <= (env_vol + 5'b00001); + else env_vol <= (env_vol + 5'b11111); + end + + // envelope shape control. + if(!ymreg[13][3]) begin + if(!env_inc) begin // down + if(is_bot_p1) env_hold <= 1; + end else if (is_top) env_hold <= 1; + end else if(ymreg[13][0]) begin // hold = 1 + if(!env_inc) begin // down + if(ymreg[13][1]) begin // alt + if(is_bot) env_hold <= 1; + end else if(is_bot_p1) env_hold <= 1; + end else if(ymreg[13][1]) begin // alt + if(is_top) env_hold <= 1; + end else if(is_top_m1) env_hold <= 1; + end else if(ymreg[13][1]) begin // alternate + if(env_inc == 1'b0) begin // down + if(is_bot_p1) env_hold <= 1; + if(is_bot) begin + env_hold <= 0; + env_inc <= 1; + end + end else begin + if(is_top_m1) env_hold <= 1; + if(is_top) begin + env_hold <= 0; + env_inc <= 0; + end + end + end + end + end + end +end + +wire [4:0] A = ~((ymreg[7][0] | tone_gen_op[1]) & (ymreg[7][3] | poly17[0])) ? 5'd0 : ymreg[8][4] ? env_vol[4:0] : { ymreg[8][3:0], ymreg[8][3]}; +wire [4:0] B = ~((ymreg[7][1] | tone_gen_op[2]) & (ymreg[7][4] | poly17[0])) ? 5'd0 : ymreg[9][4] ? env_vol[4:0] : { ymreg[9][3:0], ymreg[9][3]}; +wire [4:0] C = ~((ymreg[7][2] | tone_gen_op[3]) & (ymreg[7][5] | poly17[0])) ? 5'd0 : ymreg[10][4] ? env_vol[4:0] : {ymreg[10][3:0], ymreg[10][3]}; + +assign CHANNEL_A = MODE ? volTableAy[A[4:1]] : volTableYm[A]; +assign CHANNEL_B = MODE ? volTableAy[B[4:1]] : volTableYm[B]; +assign CHANNEL_C = MODE ? volTableAy[C[4:1]] : volTableYm[C]; + + +endmodule diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/Eeekk.qpf b/Arcade/Pacman Hardware/Eeekk_MiST/Eeekk.qpf new file mode 100644 index 00000000..0d807731 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/Eeekk.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Eeekk" diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/Eeekk.qsf b/Arcade/Pacman Hardware/Eeekk_MiST/Eeekk.qsf new file mode 100644 index 00000000..9d756332 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/Eeekk.qsf @@ -0,0 +1,175 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 20:43:12 November 20, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Eeekk_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/pll.v +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/ROM/GFX1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/eeekk.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Eeekk.sv + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Eeekk +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Alibaba) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Alibaba) +# ------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/Eeekk.srf b/Arcade/Pacman Hardware/Eeekk_MiST/Eeekk.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/Eeekk.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/README.txt b/Arcade/Pacman Hardware/Eeekk_MiST/README.txt new file mode 100644 index 00000000..9c4f1cac --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/README.txt @@ -0,0 +1,24 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Eeekk! for MiST by Gehstock +-- 21 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F1 : Start 1 player +-- F2 : Start 2 players +-- SPACE,CTRL : Punch (also starts 2 player mode!) +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/Release/Eeekk.rbf b/Arcade/Pacman Hardware/Eeekk_MiST/Release/Eeekk.rbf new file mode 100644 index 00000000..41ea328a Binary files /dev/null and b/Arcade/Pacman Hardware/Eeekk_MiST/Release/Eeekk.rbf differ diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/clean.bat b/Arcade/Pacman Hardware/Eeekk_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_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/Arcade/Pacman Hardware/Eeekk_MiST/rtl/Eeekk.sv b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/Eeekk.sv new file mode 100644 index 00000000..4d1149a1 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/Eeekk.sv @@ -0,0 +1,196 @@ +//============================================================================ +// Arcade: Eeekk! +// +// Version for MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Eeekk +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Eeekk;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys, clk_snd; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [7:0] audio; +assign LED = 1; +//wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(340), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +//wire m_bomb = kbjoy[8]; +//wire m_Serv = kbjoy[9]; +//wire m_skip = kbjoy[9]; + + +eeekkt eeekkt +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .in0(~{2'b00, m_coin, 1'b0, m_down,m_right,m_left,m_up}), + .in1(~{1'b0, m_start2|m_fire, m_start1, 5'b00000}), + + .dipsw1(8'b1_1_1_100_00), + .dipsw2(8'b11111111), + + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..72d0990f --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"0F",X"0B",X"0E",X"0B",X"0F",X"01",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F", + X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"CC",X"FF",X"FF",X"F3",X"F0",X"F0",X"F3",X"F3",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0", + X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3", + X"00",X"00",X"00",X"FF",X"FF",X"FF",X"F0",X"F0",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"F0",X"F0", + X"F0",X"F0",X"F3",X"FF",X"FF",X"CC",X"88",X"88",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F3",X"F3", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"0C",X"00",X"0E",X"0F",X"0F",X"00",X"0C",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0F", + X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"FC",X"FC",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0",X"11",X"11",X"33",X"FF",X"FF",X"FC",X"F0",X"F0", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11", + X"F0",X"F0",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"F0",X"F0",X"FF",X"FF",X"FF",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"FC",X"FC",X"F0",X"F0",X"FC",X"FF",X"FF",X"33",X"11",X"11", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"10",X"00",X"00",X"00",X"00",X"00",X"F0",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"87",X"C3",X"C3",X"C3",X"C0",X"00",X"00",X"E1",X"F0",X"F0",X"30",X"10",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"0F",X"0F",X"00",X"00",X"00",X"F8",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00", + X"87",X"87",X"87",X"87",X"87",X"87",X"87",X"FF",X"87",X"87",X"87",X"87",X"87",X"87",X"87",X"FF", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"0F", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0", + X"00",X"00",X"00",X"00",X"00",X"10",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"F0", + X"00",X"00",X"C0",X"C3",X"C3",X"C3",X"87",X"0F",X"00",X"00",X"00",X"10",X"30",X"F0",X"F0",X"E1", + X"00",X"00",X"00",X"0F",X"0F",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"F8", + X"FF",X"87",X"87",X"87",X"87",X"87",X"87",X"87",X"FF",X"87",X"87",X"87",X"87",X"87",X"87",X"87", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"0F",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8", + X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"DD",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"77",X"33",X"00",X"00",X"00", + X"F0",X"F0",X"70",X"70",X"30",X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"70",X"70",X"30",X"30",X"10",X"10", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"10",X"10",X"30",X"30",X"70",X"70",X"F0",X"F0", + X"10",X"10",X"30",X"30",X"70",X"70",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0E",X"0C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0F",X"00",X"00",X"00",X"00",X"0C",X"0E",X"0F",X"0F", + X"F0",X"F0",X"F0",X"F0",X"F0",X"70",X"30",X"10",X"F0",X"70",X"30",X"10",X"00",X"00",X"00",X"00", + X"00",X"88",X"88",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"33",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"30",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"10",X"30",X"70",X"F0", + X"EE",X"FF",X"11",X"99",X"55",X"FF",X"EE",X"00",X"33",X"77",X"55",X"44",X"44",X"77",X"33",X"00", + X"00",X"00",X"11",X"FF",X"FF",X"11",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"22",X"00",X"00", + X"33",X"99",X"99",X"DD",X"FF",X"77",X"33",X"00",X"33",X"77",X"55",X"44",X"44",X"66",X"22",X"00", + X"66",X"FF",X"99",X"99",X"11",X"33",X"22",X"00",X"33",X"77",X"44",X"44",X"44",X"66",X"22",X"00", + X"55",X"FF",X"FF",X"55",X"44",X"CC",X"CC",X"00",X"00",X"77",X"77",X"66",X"33",X"11",X"00",X"00", + X"66",X"FF",X"99",X"99",X"99",X"BB",X"AA",X"00",X"44",X"44",X"44",X"44",X"44",X"77",X"77",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"EE",X"00",X"22",X"66",X"44",X"44",X"44",X"77",X"33",X"00", + X"00",X"00",X"88",X"FF",X"77",X"00",X"00",X"00",X"66",X"77",X"55",X"44",X"44",X"44",X"66",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"EE",X"FF",X"99",X"99",X"99",X"BB",X"22",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"00",X"00",X"00",X"BB",X"BB",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00", + X"0F",X"08",X"00",X"00",X"00",X"00",X"08",X"0F",X"0F",X"0F",X"0E",X"0C",X"0C",X"0E",X"0F",X"0F", + X"88",X"88",X"88",X"FF",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"77",X"33",X"11",X"00",X"00", + X"99",X"AA",X"CC",X"FF",X"CC",X"AA",X"99",X"00",X"44",X"22",X"11",X"77",X"11",X"22",X"44",X"00", + X"88",X"CC",X"EE",X"FF",X"88",X"88",X"88",X"00",X"00",X"11",X"33",X"77",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"11",X"15",X"15",X"19",X"22",X"CC",X"33",X"44",X"88",X"8A",X"8A",X"89",X"44",X"33", + X"00",X"FF",X"FF",X"44",X"44",X"FF",X"FF",X"00",X"00",X"11",X"33",X"66",X"66",X"33",X"11",X"00", + X"66",X"FF",X"99",X"99",X"FF",X"FF",X"11",X"00",X"33",X"77",X"44",X"44",X"77",X"77",X"44",X"00", + X"22",X"33",X"11",X"11",X"33",X"EE",X"CC",X"00",X"22",X"66",X"44",X"44",X"66",X"33",X"11",X"00", + X"EE",X"FF",X"11",X"11",X"FF",X"FF",X"11",X"00",X"33",X"77",X"44",X"44",X"77",X"77",X"44",X"00", + X"33",X"11",X"DD",X"99",X"FF",X"FF",X"11",X"00",X"66",X"44",X"55",X"44",X"77",X"77",X"44",X"00", + X"00",X"00",X"CC",X"99",X"FF",X"FF",X"11",X"00",X"66",X"44",X"55",X"44",X"77",X"77",X"44",X"00", + X"FF",X"FF",X"99",X"11",X"33",X"EE",X"CC",X"00",X"22",X"66",X"44",X"44",X"66",X"33",X"11",X"00", + X"00",X"FF",X"FF",X"88",X"88",X"FF",X"FF",X"00",X"00",X"77",X"77",X"00",X"00",X"77",X"77",X"00", + X"00",X"00",X"11",X"FF",X"FF",X"11",X"00",X"00",X"00",X"00",X"44",X"77",X"77",X"44",X"00",X"00", + X"00",X"00",X"EE",X"FF",X"11",X"77",X"66",X"00",X"44",X"44",X"77",X"77",X"44",X"44",X"00",X"00", + X"11",X"33",X"EE",X"CC",X"FF",X"FF",X"11",X"00",X"66",X"77",X"11",X"00",X"77",X"77",X"44",X"00", + X"33",X"11",X"11",X"11",X"FF",X"FF",X"11",X"00",X"00",X"00",X"00",X"44",X"77",X"77",X"44",X"00", + X"FF",X"FF",X"88",X"CC",X"88",X"FF",X"FF",X"00",X"77",X"77",X"33",X"11",X"33",X"77",X"77",X"00", + X"FF",X"FF",X"CC",X"88",X"00",X"FF",X"FF",X"00",X"77",X"77",X"00",X"11",X"33",X"77",X"77",X"00", + X"CC",X"EE",X"33",X"11",X"33",X"EE",X"CC",X"00",X"11",X"33",X"66",X"44",X"66",X"33",X"11",X"00", + X"00",X"88",X"88",X"99",X"FF",X"FF",X"11",X"00",X"33",X"77",X"44",X"44",X"77",X"77",X"44",X"00", + X"DD",X"EE",X"55",X"11",X"11",X"FF",X"EE",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"11",X"BB",X"EE",X"CC",X"FF",X"FF",X"11",X"00",X"33",X"77",X"44",X"44",X"77",X"77",X"44",X"00", + X"66",X"FF",X"99",X"99",X"99",X"BB",X"22",X"00",X"22",X"66",X"44",X"44",X"44",X"77",X"33",X"00", + X"00",X"00",X"11",X"FF",X"FF",X"11",X"00",X"00",X"00",X"66",X"44",X"77",X"77",X"44",X"66",X"00", + X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00",X"77",X"77",X"00",X"00",X"77",X"77",X"00", + X"88",X"CC",X"66",X"33",X"66",X"CC",X"88",X"00",X"77",X"77",X"00",X"00",X"00",X"77",X"77",X"00", + X"CC",X"FF",X"33",X"EE",X"33",X"FF",X"CC",X"00",X"77",X"77",X"00",X"11",X"00",X"77",X"77",X"00", + X"11",X"33",X"66",X"CC",X"66",X"33",X"11",X"00",X"44",X"66",X"33",X"11",X"33",X"66",X"44",X"00", + X"00",X"00",X"99",X"FF",X"FF",X"99",X"00",X"00",X"00",X"77",X"77",X"00",X"00",X"77",X"77",X"00", + X"33",X"11",X"99",X"99",X"DD",X"77",X"33",X"00",X"66",X"77",X"55",X"44",X"44",X"44",X"66",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"77", + X"FF",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"FF",X"77",X"03",X"03",X"03",X"03",X"03",X"03",X"77", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"11",X"22",X"11",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F", + X"FB",X"66",X"44",X"88",X"99",X"00",X"00",X"00",X"00",X"11",X"22",X"CC",X"00",X"11",X"00",X"00", + X"00",X"88",X"44",X"22",X"22",X"66",X"FB",X"FF",X"00",X"00",X"00",X"00",X"CC",X"33",X"00",X"0F", + X"00",X"88",X"77",X"00",X"CC",X"00",X"00",X"00",X"FB",X"66",X"AA",X"99",X"44",X"44",X"00",X"00", + X"00",X"00",X"44",X"88",X"00",X"FF",X"00",X"00",X"00",X"44",X"88",X"99",X"AA",X"66",X"FB",X"FF", + X"FB",X"66",X"22",X"22",X"11",X"11",X"00",X"00",X"00",X"11",X"22",X"22",X"11",X"00",X"00",X"00", + X"00",X"99",X"11",X"22",X"AA",X"66",X"FB",X"FF",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"0F", + X"22",X"AA",X"44",X"00",X"00",X"CC",X"00",X"00",X"FB",X"66",X"AA",X"22",X"99",X"44",X"00",X"00", + X"00",X"00",X"CC",X"00",X"44",X"AA",X"11",X"00",X"00",X"00",X"00",X"99",X"22",X"66",X"FB",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"88",X"00",X"00", + X"66",X"6E",X"E6",X"E6",X"6E",X"66",X"EE",X"EE",X"A5",X"D2",X"3C",X"03",X"92",X"69",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"44",X"33",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"44",X"88",X"00",X"00", + X"22",X"33",X"44",X"88",X"11",X"66",X"88",X"0F",X"1D",X"2E",X"2E",X"0C",X"1D",X"2E",X"1D",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"44",X"0C",X"2E",X"2E",X"2E",X"1D",X"1D",X"0C",X"1D", + X"00",X"00",X"04",X"22",X"FB",X"F0",X"9F",X"AA",X"00",X"00",X"46",X"11",X"30",X"17",X"10",X"04", + X"00",X"00",X"00",X"03",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"01",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"03",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"01",X"00",X"00",X"00",X"00", + X"26",X"9B",X"F0",X"F5",X"D5",X"04",X"00",X"00",X"76",X"33",X"97",X"70",X"11",X"02",X"00",X"00", + X"44",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"1D",X"0C",X"1D",X"1D",X"2E",X"2E",X"2E",X"0C", + X"0F",X"CC",X"33",X"00",X"CC",X"22",X"11",X"22",X"0F",X"1D",X"2E",X"1D",X"2E",X"2E",X"2E",X"1D", + X"00",X"00",X"00",X"00",X"00",X"88",X"77",X"0F",X"00",X"00",X"88",X"44",X"AA",X"11",X"66",X"0F", + X"00",X"88",X"04",X"02",X"B3",X"E1",X"0F",X"4C",X"00",X"00",X"8C",X"31",X"00",X"11",X"71",X"18", + X"00",X"00",X"00",X"00",X"00",X"48",X"F0",X"F0",X"00",X"00",X"00",X"C0",X"E1",X"D3",X"A7",X"5E", + X"00",X"88",X"66",X"99",X"03",X"0F",X"0F",X"0F",X"2E",X"1D",X"0C",X"0C",X"1D",X"2E",X"0F",X"0F", + X"0F",X"0F",X"0F",X"03",X"44",X"88",X"00",X"00",X"0F",X"0F",X"0C",X"2E",X"1D",X"0C",X"3F",X"0C", + X"F0",X"F8",X"C4",X"00",X"00",X"00",X"00",X"00",X"F9",X"F4",X"F2",X"F1",X"C0",X"00",X"00",X"00", + X"C6",X"8F",X"D3",X"16",X"64",X"88",X"00",X"00",X"44",X"1F",X"30",X"61",X"88",X"00",X"11",X"00", + X"0F",X"33",X"CC",X"00",X"00",X"00",X"00",X"00",X"0F",X"11",X"00",X"FF",X"44",X"88",X"00",X"00", + X"3F",X"FF",X"FF",X"FF",X"B8",X"30",X"30",X"10",X"31",X"31",X"73",X"73",X"F7",X"C0",X"00",X"00", + X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"E7",X"F7",X"F7",X"73",X"73",X"31",X"31",X"31", + X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"31",X"31",X"31",X"73",X"73",X"F7",X"F7",X"E7", + X"10",X"30",X"30",X"B8",X"FF",X"FF",X"FF",X"3F",X"00",X"00",X"C0",X"F7",X"73",X"73",X"31",X"31", + X"08",X"08",X"08",X"08",X"F0",X"00",X"00",X"00",X"EF",X"EF",X"EF",X"EF",X"F0",X"00",X"80",X"00", + X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"EF",X"EF",X"EF",X"EF",X"0F",X"EF",X"EF",X"EF", + X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"EF",X"EF",X"EF",X"0F",X"EF",X"EF",X"EF",X"EF", + X"00",X"00",X"00",X"F0",X"08",X"08",X"08",X"08",X"00",X"80",X"00",X"F0",X"EF",X"EF",X"EF",X"EF", + X"10",X"10",X"10",X"10",X"30",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"FC",X"FE",X"76",X"10",X"10",X"00",X"E0",X"76",X"77",X"11",X"00",X"00",X"00", + X"0C",X"0C",X"0C",X"0C",X"0C",X"3C",X"00",X"00",X"3F",X"3F",X"3F",X"B7",X"87",X"87",X"80",X"00", + X"00",X"00",X"00",X"30",X"C0",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"80",X"F0",X"0F",X"0F",X"3F", + X"00",X"FF",X"00",X"00",X"11",X"EE",X"00",X"00",X"88",X"FF",X"44",X"44",X"22",X"11",X"00",X"00", + X"00",X"00",X"EE",X"11",X"00",X"00",X"FF",X"00",X"00",X"00",X"11",X"22",X"44",X"44",X"FF",X"88", + X"44",X"44",X"44",X"CC",X"77",X"00",X"00",X"00",X"60",X"E8",X"60",X"71",X"E8",X"60",X"00",X"00", + X"00",X"00",X"00",X"77",X"CC",X"44",X"44",X"44",X"00",X"00",X"60",X"E8",X"71",X"60",X"E8",X"60", + X"00",X"1E",X"10",X"10",X"1E",X"10",X"08",X"07",X"08",X"0F",X"04",X"04",X"07",X"02",X"01",X"00", + X"07",X"08",X"10",X"1E",X"10",X"10",X"1E",X"00",X"00",X"01",X"02",X"07",X"04",X"04",X"0F",X"08", + X"78",X"3C",X"B4",X"96",X"D2",X"C3",X"E1",X"69",X"F0",X"B4",X"B4",X"1E",X"5A",X"4B",X"E1",X"E9", + X"78",X"3C",X"B4",X"96",X"D2",X"C3",X"E1",X"69",X"F8",X"B4",X"B4",X"1E",X"5A",X"4B",X"E1",X"E1", + X"FE",X"FC",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"F1",X"70",X"70",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"F0",X"F0",X"F0",X"FC",X"FE",X"00",X"00",X"00",X"00",X"30",X"70",X"70",X"F1", + X"00",X"00",X"88",X"EE",X"33",X"00",X"00",X"00",X"E2",X"E2",X"73",X"E2",X"E2",X"22",X"22",X"00", + X"00",X"00",X"00",X"33",X"EE",X"88",X"00",X"00",X"00",X"22",X"22",X"E2",X"E2",X"73",X"E2",X"E2", + X"00",X"0F",X"00",X"0F",X"00",X"03",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"0F", + X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F1",X"00",X"30",X"3C",X"30",X"3C",X"30",X"3C",X"30",X"00", + X"F1",X"F1",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"30",X"3C",X"30",X"3C",X"30",X"3C",X"30",X"3C", + X"E1",X"E1",X"E1",X"F0",X"F0",X"FF",X"F0",X"00",X"5E",X"5E",X"5E",X"DE",X"FE",X"FF",X"FE",X"00", + X"F0",X"FF",X"F0",X"F0",X"E1",X"E1",X"E1",X"E1",X"FE",X"FF",X"FE",X"DE",X"5E",X"5E",X"5E",X"5E", + X"FF",X"FF",X"F3",X"30",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"30",X"F3",X"FF",X"FF",X"EF",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"FF",X"FF",X"FF",X"F0",X"00",X"00",X"00",X"00",X"BF",X"BF",X"FF",X"FF",X"F0",X"00",X"00",X"00", + X"00",X"00",X"00",X"F0",X"FF",X"FF",X"FF",X"3F",X"00",X"00",X"F0",X"FF",X"FF",X"BF",X"BF",X"0F", + X"FE",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"F0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"F0",X"FE",X"FE",X"00",X"00",X"00",X"00",X"F0",X"FF",X"FF",X"FF", + X"93",X"93",X"93",X"93",X"93",X"93",X"F0",X"00",X"DD",X"88",X"00",X"00",X"00",X"00",X"30",X"00", + X"00",X"F0",X"91",X"F7",X"F7",X"83",X"B3",X"80",X"00",X"30",X"00",X"00",X"00",X"88",X"DD",X"FF", + X"00",X"0F",X"07",X"FF",X"BF",X"FF",X"F0",X"00",X"2C",X"2C",X"2C",X"2C",X"2C",X"2C",X"F0",X"00", + X"00",X"F0",X"0F",X"B3",X"C0",X"60",X"30",X"07",X"00",X"F0",X"2C",X"3C",X"2C",X"2C",X"2C",X"EC", + X"EC",X"EC",X"2C",X"2C",X"EC",X"2C",X"F0",X"00",X"B3",X"B3",X"80",X"80",X"91",X"83",X"F0",X"00", + X"00",X"F0",X"EC",X"2C",X"EC",X"E0",X"2C",X"EC",X"00",X"F0",X"91",X"81",X"B3",X"90",X"83",X"91", + X"FC",X"76",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"64",X"FC",X"FC",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"22",X"22",X"55",X"88",X"00",X"00",X"00",X"E6",X"EE",X"CC",X"88",X"77",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"44",X"00",X"00",X"00",X"00",X"20",X"71",X"71",X"F3", + X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"33",X"11",X"88",X"CC",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"06",X"07",X"8F",X"07",X"00",X"00",X"00",X"00",X"00",X"88",X"33",X"CC", + X"32",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"22",X"76",X"76",X"76",X"76",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AA",X"44",X"AA",X"33",X"11",X"00",X"00",X"00",X"CC",X"88",X"88",X"77",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"11",X"22",X"99",X"00",X"00",X"00",X"C4",X"E6",X"E6",X"E6",X"C4", + X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"22",X"44",X"00",X"00",X"00",X"00",X"00", + X"00",X"F0",X"0C",X"0C",X"0C",X"0C",X"F0",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"33", + X"1F",X"0C",X"F0",X"8C",X"44",X"F0",X"00",X"00",X"04",X"00",X"F0",X"01",X"00",X"F0",X"00",X"00", + X"00",X"00",X"00",X"F0",X"00",X"0C",X"F0",X"0E",X"00",X"00",X"00",X"F0",X"02",X"03",X"F0",X"07", + X"80",X"70",X"00",X"80",X"70",X"00",X"00",X"00",X"70",X"20",X"10",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"70",X"80",X"00",X"70",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"20", + X"1F",X"0E",X"F0",X"0C",X"00",X"F0",X"00",X"00",X"00",X"01",X"F0",X"13",X"11",X"F0",X"00",X"00", + X"00",X"00",X"0C",X"F0",X"0C",X"0C",X"F0",X"0E",X"00",X"00",X"00",X"F0",X"01",X"03",X"F0",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"3C",X"2C",X"2C",X"0C",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C",X"2C",X"2C",X"3C", + X"78",X"70",X"70",X"30",X"00",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"02",X"04",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"04",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"04",X"02",X"00",X"08",X"04",X"02",X"01",X"00",X"00",X"00", + X"13",X"0B",X"09",X"18",X"F0",X"00",X"00",X"00",X"6B",X"6B",X"73",X"71",X"70",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"F0",X"36",X"17",X"13",X"00",X"00",X"00",X"00",X"70",X"60",X"43",X"6B", + X"C8",X"C8",X"C8",X"C0",X"F0",X"00",X"00",X"00",X"F7",X"F7",X"F7",X"F3",X"F0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"F0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"F0",X"A0",X"F0",X"F3", + X"1D",X"15",X"04",X"16",X"F0",X"00",X"00",X"00",X"6A",X"6A",X"73",X"71",X"70",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"F0",X"3A",X"3B",X"19",X"00",X"00",X"00",X"00",X"70",X"61",X"40",X"6A", + X"00",X"00",X"CC",X"3C",X"88",X"00",X"00",X"00",X"11",X"00",X"00",X"33",X"00",X"00",X"00",X"00", + X"00",X"00",X"CC",X"3C",X"CC",X"00",X"88",X"78",X"00",X"00",X"00",X"11",X"00",X"00",X"13",X"67", + X"02",X"01",X"88",X"CF",X"88",X"00",X"00",X"00",X"11",X"00",X"00",X"F0",X"00",X"00",X"00",X"00", + X"00",X"00",X"88",X"CF",X"88",X"01",X"02",X"8F",X"00",X"00",X"00",X"F0",X"00",X"00",X"11",X"F1", + X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"3C",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"0F", + X"00",X"00",X"00",X"7C",X"88",X"00",X"00",X"00",X"47",X"00",X"33",X"47",X"11",X"00",X"00",X"00", + X"00",X"00",X"08",X"7C",X"88",X"00",X"00",X"78",X"00",X"00",X"01",X"13",X"11",X"00",X"11",X"EF", + X"01",X"23",X"01",X"89",X"01",X"01",X"00",X"00",X"11",X"00",X"44",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"81",X"41",X"21",X"89",X"01",X"20",X"20",X"10",X"00",X"00",X"00",X"00",X"22", + X"F0",X"5A",X"1E",X"8F",X"CE",X"3F",X"DD",X"00",X"CF",X"8F",X"FF",X"EF",X"DF",X"77",X"23",X"00", + X"00",X"DF",X"6F",X"8E",X"FC",X"1E",X"B4",X"78",X"00",X"33",X"47",X"FF",X"FF",X"8F",X"EF",X"0F", + X"23",X"01",X"45",X"01",X"89",X"01",X"00",X"00",X"44",X"11",X"00",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"81",X"41",X"21",X"01",X"01",X"20",X"20",X"10",X"00",X"00",X"00",X"00",X"00", + X"C3",X"E1",X"87",X"DE",X"9E",X"68",X"1F",X"00",X"CF",X"78",X"DF",X"FF",X"FF",X"47",X"33",X"00", + X"00",X"C0",X"79",X"BC",X"1E",X"C3",X"68",X"1E",X"00",X"12",X"77",X"FF",X"FE",X"F8",X"DE",X"EF", + X"F1",X"F0",X"F0",X"78",X"3C",X"3C",X"78",X"0F",X"78",X"78",X"78",X"69",X"4B",X"4B",X"69",X"0F", + X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"78",X"78",X"78",X"78",X"78",X"78",X"78", + X"6F",X"EF",X"EF",X"6F",X"EF",X"E1",X"E1",X"0F",X"BF",X"FF",X"F1",X"F3",X"F3",X"F0",X"F0",X"0F", + X"0F",X"E1",X"E1",X"EF",X"EF",X"6F",X"EF",X"EF",X"0F",X"F0",X"F0",X"F0",X"F7",X"F7",X"F1",X"FF", + X"B5",X"5A",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"69",X"1E",X"3C",X"3C",X"78",X"78",X"78",X"0F", + X"0F",X"E1",X"D2",X"D2",X"B4",X"87",X"78",X"F0",X"0F",X"78",X"78",X"78",X"78",X"5A",X"5A",X"69", + X"67",X"EF",X"EF",X"67",X"EF",X"E1",X"E1",X"0F",X"BB",X"FF",X"F1",X"F3",X"F3",X"F0",X"F0",X"0F", + X"0F",X"E1",X"E1",X"EF",X"EF",X"67",X"EF",X"EF",X"0F",X"78",X"F0",X"F0",X"F7",X"F7",X"F1",X"FF", + X"00",X"01",X"0C",X"03",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00", + X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"0D",X"06",X"00",X"10",X"10",X"00",X"0C",X"02",X"01",X"02",X"0C",X"00",X"00",X"00", + X"04",X"03",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00", + X"00",X"08",X"04",X"02",X"01",X"01",X"01",X"02",X"20",X"00",X"40",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"11",X"00",X"79",X"71",X"79",X"51",X"91",X"11",X"00",X"80", + X"EE",X"CF",X"EE",X"EE",X"EE",X"EE",X"FF",X"FF",X"11",X"11",X"11",X"11",X"FF",X"FF",X"FB",X"71", + X"00",X"11",X"77",X"FF",X"FF",X"FF",X"FF",X"EE",X"00",X"00",X"11",X"1F",X"1F",X"1F",X"1F",X"1F", + X"EE",X"EE",X"EE",X"CC",X"CC",X"C8",X"70",X"10",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"00", + X"6E",X"6E",X"E6",X"6E",X"6E",X"66",X"EE",X"EE",X"69",X"1E",X"0B",X"01",X"2D",X"07",X"FF",X"FF", + X"10",X"70",X"C8",X"CC",X"CC",X"EE",X"EE",X"66",X"00",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"03", + X"00",X"0D",X"07",X"08",X"00",X"00",X"00",X"00",X"00",X"01",X"06",X"00",X"03",X"00",X"00",X"00", + X"03",X"0C",X"00",X"09",X"06",X"10",X"10",X"00",X"00",X"0D",X"03",X"0C",X"00",X"00",X"00",X"00", + X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"08",X"04",X"02",X"01",X"01",X"01",X"02",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C1",X"E3",X"C1",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"C8",X"F8",X"F8",X"98",X"88",X"88",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11", + X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"1D",X"1F",X"1F",X"1F",X"1D",X"11",X"11",X"11", + X"88",X"88",X"98",X"F8",X"F8",X"C8",X"88",X"88",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11", + X"00",X"00",X"00",X"C0",X"F0",X"10",X"00",X"00",X"00",X"00",X"00",X"10",X"F0",X"F0",X"00",X"00", + X"00",X"00",X"10",X"F0",X"C0",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"10",X"00",X"00",X"00", + X"00",X"C0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"80",X"A0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"C0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"30",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"E0",X"E0",X"E0",X"C0", + X"E0",X"E0",X"E0",X"C0",X"C0",X"C0",X"80",X"80",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"70", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"70", + X"76",X"FE",X"FC",X"FC",X"EF",X"44",X"00",X"00",X"01",X"01",X"03",X"0F",X"03",X"01",X"01",X"00", + X"30",X"28",X"2C",X"0F",X"0F",X"06",X"00",X"00",X"87",X"C3",X"C3",X"0D",X"1D",X"17",X"03",X"11", + X"00",X"00",X"88",X"88",X"88",X"00",X"00",X"00",X"80",X"80",X"33",X"33",X"33",X"91",X"91",X"81", + X"F8",X"F8",X"F8",X"8F",X"0F",X"0F",X"00",X"00",X"F8",X"8F",X"0F",X"0F",X"0F",X"0F",X"00",X"00", + X"20",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"80",X"E0",X"E0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"06",X"0F",X"0F",X"2C",X"28",X"00",X"00",X"01",X"01",X"03",X"0F",X"03",X"01", + X"00",X"00",X"00",X"44",X"EF",X"E9",X"F8",X"FC",X"11",X"11",X"03",X"17",X"1D",X"C1",X"87",X"87", + X"30",X"00",X"00",X"00",X"88",X"88",X"88",X"00",X"01",X"00",X"00",X"00",X"10",X"10",X"30",X"20", + X"30",X"70",X"F0",X"F0",X"F0",X"D0",X"40",X"60",X"07",X"03",X"91",X"91",X"F3",X"F3",X"F3",X"40", + X"00",X"00",X"00",X"00",X"06",X"0F",X"0F",X"2C",X"00",X"00",X"01",X"01",X"03",X"0F",X"03",X"01", + X"00",X"00",X"00",X"44",X"EF",X"E9",X"F8",X"FC",X"11",X"03",X"17",X"1D",X"59",X"C1",X"87",X"87", + X"28",X"30",X"00",X"00",X"88",X"88",X"88",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"30",X"70",X"70",X"F0",X"F0",X"F0",X"90",X"07",X"83",X"91",X"D1",X"F3",X"F3",X"71",X"20", + X"00",X"80",X"C0",X"C0",X"1C",X"3C",X"08",X"08",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"0F", + X"76",X"47",X"03",X"01",X"30",X"ED",X"77",X"DD",X"E0",X"F0",X"78",X"78",X"80",X"C3",X"4B",X"0F", + X"08",X"3C",X"1C",X"E0",X"C0",X"80",X"00",X"00",X"03",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"77",X"ED",X"30",X"01",X"03",X"47",X"76",X"00",X"4B",X"C3",X"80",X"38",X"78",X"F0",X"E0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"00",X"33",X"77",X"66",X"7F",X"FF",X"00",X"00",X"CC",X"88",X"00",X"00",X"00",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"66",X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"33",X"66",X"77",X"66",X"7F",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"66",X"77",X"66",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"7F",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"11",X"00",X"00",X"00", + X"7F",X"66",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0F",X"01",X"0F",X"00",X"0F",X"01",X"00",X"00",X"11",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"7F",X"FF",X"00",X"00",X"01",X"01",X"01",X"00",X"01",X"CD", + X"0F",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"11",X"00",X"00",X"00", + X"7F",X"66",X"EE",X"CC",X"88",X"00",X"00",X"00",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0F",X"01",X"0F",X"00",X"0F",X"01",X"00",X"00",X"11",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"7F",X"FF",X"00",X"00",X"01",X"01",X"01",X"00",X"01",X"CD", + X"0F",X"00",X"0D",X"05",X"07",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"11",X"00",X"00",X"00", + X"7F",X"66",X"EE",X"CC",X"88",X"00",X"00",X"00",X"01",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"0F",X"01",X"0F",X"00",X"0F",X"01",X"00",X"00",X"11",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"7F",X"FF",X"00",X"00",X"01",X"01",X"01",X"00",X"01",X"CD", + X"0F",X"00",X"0F",X"05",X"05",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"11",X"00",X"00",X"00", + X"7F",X"66",X"EE",X"CC",X"88",X"00",X"00",X"00",X"01",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"0F",X"01",X"0F",X"00",X"0F",X"01",X"00",X"00",X"11",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"7F",X"FF",X"00",X"00",X"01",X"01",X"01",X"00",X"01",X"CD", + X"0F",X"00",X"0F",X"04",X"0C",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"11",X"00",X"00",X"00", + X"7F",X"66",X"EE",X"CC",X"88",X"00",X"00",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"00",X"00", + X"00",X"00",X"0F",X"01",X"0F",X"00",X"0F",X"01",X"00",X"00",X"11",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"7F",X"FF",X"00",X"00",X"01",X"01",X"01",X"00",X"01",X"CD", + X"0F",X"00",X"07",X"05",X"0D",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"11",X"00",X"00",X"00", + X"7F",X"66",X"EE",X"CC",X"88",X"00",X"00",X"00",X"01",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"0F",X"01",X"0F",X"00",X"0F",X"01",X"00",X"00",X"11",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"7F",X"FF",X"00",X"00",X"01",X"01",X"01",X"00",X"01",X"CD", + X"0F",X"00",X"07",X"05",X"0F",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"11",X"00",X"00",X"00", + X"7F",X"66",X"EE",X"CC",X"88",X"00",X"00",X"00",X"01",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"0F",X"01",X"0F",X"00",X"0F",X"01",X"00",X"00",X"11",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"7F",X"FF",X"00",X"00",X"01",X"01",X"01",X"00",X"01",X"CD", + X"0F",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"11",X"00",X"00",X"00", + X"7F",X"66",X"EE",X"CC",X"88",X"00",X"00",X"00",X"01",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"0F",X"01",X"0F",X"00",X"0F",X"01",X"00",X"00",X"11",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"7F",X"FF",X"00",X"00",X"01",X"01",X"01",X"00",X"01",X"CD", + X"0F",X"00",X"0F",X"05",X"0F",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"11",X"00",X"00",X"00", + X"7F",X"66",X"EE",X"CC",X"88",X"00",X"00",X"00",X"01",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"0F",X"01",X"0F",X"00",X"0F",X"01",X"00",X"00",X"11",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"7F",X"FF",X"00",X"00",X"01",X"01",X"01",X"00",X"01",X"CD", + X"0F",X"00",X"0F",X"04",X"0C",X"00",X"00",X"00",X"11",X"22",X"00",X"00",X"11",X"00",X"00",X"00", + X"7F",X"66",X"EE",X"CC",X"88",X"00",X"00",X"00",X"01",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"0F",X"01",X"0F",X"00",X"0F",X"01",X"0F",X"00",X"00",X"11",X"00",X"00",X"22",X"11",X"11", + X"00",X"00",X"88",X"CC",X"EE",X"66",X"7F",X"FF",X"00",X"01",X"01",X"01",X"00",X"01",X"01",X"CD", + X"00",X"0F",X"01",X"0F",X"00",X"0F",X"00",X"00",X"11",X"22",X"00",X"00",X"11",X"00",X"00",X"00", + X"7F",X"66",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0E",X"00",X"00",X"22",X"11",X"11",X"77",X"FF",X"77", + X"00",X"00",X"00",X"01",X"07",X"0F",X"09",X"0F",X"06",X"0E",X"0C",X"08",X"0E",X"07",X"0B",X"07", + X"0F",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"11",X"11",X"22",X"00",X"00",X"00", + X"09",X"0F",X"07",X"01",X"00",X"00",X"00",X"00",X"0B",X"07",X"0E",X"08",X"0C",X"0E",X"06",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"0E",X"22",X"11",X"11",X"77",X"FF",X"77",X"FF",X"77", + X"00",X"01",X"07",X"0F",X"09",X"0F",X"09",X"0F",X"06",X"0E",X"08",X"0E",X"0B",X"0B",X"07",X"0F", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"22",X"00",X"00",X"00",X"00",X"00", + X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"08",X"0C",X"06",X"06",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"0E",X"22",X"11",X"11",X"77",X"FF",X"77",X"FF",X"77", + X"00",X"00",X"01",X"0F",X"09",X"0F",X"09",X"0F",X"00",X"06",X"0E",X"08",X"0E",X"07",X"07",X"0F", + X"06",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"22",X"00",X"00",X"00",X"00",X"00", + X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"08",X"0E",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"0F",X"0E",X"00",X"00",X"22",X"11",X"11",X"77",X"FF",X"77", + X"01",X"01",X"00",X"01",X"07",X"0F",X"09",X"0F",X"0C",X"0C",X"08",X"08",X"0E",X"0F",X"0F",X"03", + X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"11",X"11",X"22",X"00",X"00",X"00", + X"09",X"0F",X"07",X"01",X"00",X"01",X"01",X"00",X"0F",X"0F",X"0E",X"08",X"08",X"0C",X"0C",X"00", + X"00",X"00",X"00",X"02",X"01",X"03",X"0F",X"0E",X"00",X"00",X"22",X"11",X"11",X"77",X"FF",X"77", + X"0E",X"0F",X"07",X"01",X"07",X"0F",X"09",X"0F",X"00",X"00",X"08",X"08",X"0C",X"0F",X"0B",X"01", + X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"11",X"11",X"22",X"00",X"00",X"00", + X"09",X"0F",X"07",X"01",X"07",X"0F",X"0E",X"00",X"0B",X"0F",X"0C",X"08",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"99",X"FF",X"77",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"32",X"76",X"77",X"00",X"00",X"00",X"00",X"FF",X"E6",X"44",X"EC", + X"77",X"FF",X"99",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"76",X"32",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"E6",X"FF",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"EE",X"EE",X"EE",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"32",X"76",X"77",X"32",X"10",X"00",X"00",X"FF",X"D5",X"64",X"CC",X"55",X"F7", + X"FF",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"FF",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"32",X"77",X"76",X"32",X"00",X"00",X"00",X"F7",X"55",X"CC",X"64",X"D5",X"FF", + X"FF",X"77",X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"FF",X"EE",X"EE",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"32",X"77",X"76",X"32",X"11",X"00",X"00",X"F7",X"55",X"EC",X"44",X"D5",X"FF", + X"FF",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"EE",X"EE",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"74",X"EC",X"FF",X"00",X"00",X"00",X"00",X"FF",X"DD",X"88",X"C8", + X"EE",X"EE",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EC",X"74",X"11",X"00",X"00",X"00",X"00",X"00",X"88",X"DD",X"FF",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"FF",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"74",X"EC",X"FF",X"00",X"44",X"EE",X"44",X"FF",X"DD",X"88",X"98", + X"EE",X"FF",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EC",X"74",X"11",X"00",X"00",X"00",X"00",X"00",X"88",X"DD",X"FF",X"22",X"77",X"22",X"00",X"00", + X"00",X"00",X"88",X"00",X"99",X"FF",X"77",X"E6",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"32",X"76",X"77",X"00",X"11",X"33",X"11",X"FF",X"E6",X"44",X"CC", + X"66",X"EE",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"76",X"32",X"00",X"00",X"11",X"00",X"00",X"00",X"44",X"E6",X"FF",X"88",X"CC",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"CC",X"AA",X"11",X"31",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"FF",X"00",X"00",X"00",X"00",X"33",X"F9",X"D9",X"FF", + X"11",X"AA",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"D9",X"F9",X"33",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"33",X"74",X"DC",X"FF",X"00",X"00",X"00",X"00",X"CC",X"FF",X"99",X"B8", + X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"DC",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"99",X"FF",X"CC",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"E2",X"B3",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"FF",X"77",X"77",X"00",X"44",X"EE",X"44",X"FF",X"BB",X"11",X"91", + X"B3",X"E2",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"FF",X"88",X"00",X"00",X"00",X"00",X"00",X"11",X"BB",X"FF",X"22",X"77",X"22",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0E",X"00",X"00",X"00",X"00",X"11",X"71",X"F1",X"F1", + X"00",X"00",X"00",X"01",X"07",X"0F",X"09",X"0F",X"06",X"0E",X"0C",X"08",X"0E",X"07",X"0B",X"07", + X"0F",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"73",X"55",X"88",X"88",X"00",X"00",X"00", + X"09",X"0F",X"07",X"01",X"00",X"00",X"00",X"00",X"0B",X"07",X"0E",X"08",X"0C",X"0E",X"06",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"0E",X"00",X"00",X"11",X"71",X"F1",X"F1",X"F1",X"73", + X"00",X"01",X"07",X"0F",X"09",X"0F",X"09",X"0F",X"06",X"0E",X"08",X"0E",X"0B",X"0B",X"07",X"0F", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"88",X"88",X"00",X"00",X"00",X"00",X"00", + X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"08",X"0C",X"06",X"06",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"0E",X"00",X"00",X"11",X"71",X"F1",X"F1",X"F1",X"73", + X"00",X"00",X"01",X"0F",X"09",X"0F",X"09",X"0F",X"00",X"06",X"0E",X"08",X"0E",X"07",X"07",X"0F", + X"06",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"55",X"88",X"88",X"00",X"00",X"00",X"00",X"00", + X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"08",X"0E",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"0F",X"0E",X"00",X"00",X"88",X"88",X"55",X"73",X"F1",X"F1", + X"01",X"01",X"00",X"01",X"07",X"0F",X"09",X"0F",X"0C",X"0C",X"08",X"08",X"0E",X"0F",X"0F",X"03", + X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"71",X"11",X"00",X"00",X"00",X"00",X"00", + X"09",X"0F",X"07",X"01",X"00",X"01",X"01",X"00",X"0F",X"0F",X"0E",X"08",X"08",X"0C",X"0C",X"00", + X"00",X"00",X"00",X"02",X"01",X"03",X"0F",X"0E",X"00",X"00",X"88",X"88",X"55",X"73",X"F1",X"F1", + X"0E",X"0F",X"07",X"01",X"07",X"0F",X"09",X"0F",X"00",X"00",X"08",X"08",X"0C",X"0F",X"0B",X"01", + X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"71",X"11",X"00",X"00",X"00",X"00",X"00", + X"09",X"0F",X"07",X"01",X"07",X"0F",X"0E",X"00",X"0B",X"0F",X"0C",X"08",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"60",X"70",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"11", + X"00",X"00",X"00",X"CC",X"22",X"10",X"FC",X"30",X"00",X"00",X"00",X"00",X"2C",X"38",X"E0",X"E0", + X"F0",X"30",X"60",X"60",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00", + X"10",X"66",X"88",X"00",X"00",X"00",X"00",X"00",X"38",X"2C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"00",X"00",X"00",X"33",X"44",X"00",X"33",X"44", + X"00",X"00",X"00",X"00",X"8B",X"42",X"F0",X"F0",X"00",X"00",X"00",X"00",X"80",X"F0",X"90",X"90", + X"C0",X"C0",X"60",X"60",X"30",X"10",X"00",X"00",X"00",X"00",X"11",X"22",X"22",X"00",X"00",X"00", + X"42",X"8B",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"33",X"00",X"77",X"00",X"00", + X"00",X"00",X"00",X"8B",X"42",X"F0",X"F0",X"42",X"00",X"00",X"00",X"80",X"F0",X"90",X"90",X"F0", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"8B",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"B0",X"30",X"30",X"20",X"20",X"20",X"00",X"00", + X"00",X"00",X"00",X"C0",X"60",X"70",X"F0",X"70",X"11",X"00",X"00",X"22",X"11",X"00",X"11",X"00", + X"88",X"44",X"22",X"10",X"FC",X"30",X"10",X"EE",X"00",X"00",X"2C",X"38",X"E0",X"E0",X"38",X"2C", + X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"20",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"10",X"00",X"00",X"00",X"60",X"30",X"10",X"2C",X"38", + X"60",X"60",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"11",X"00",X"00",X"00",X"00", + X"30",X"FC",X"10",X"EE",X"00",X"00",X"00",X"00",X"E0",X"E0",X"38",X"2C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"44",X"22",X"11",X"00",X"FE", + X"00",X"00",X"00",X"00",X"00",X"16",X"94",X"F0",X"00",X"00",X"40",X"E0",X"40",X"60",X"F0",X"30", + X"F0",X"90",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"33",X"44",X"00",X"00",X"00",X"00", + X"F0",X"94",X"16",X"00",X"00",X"00",X"00",X"00",X"30",X"F0",X"60",X"20",X"70",X"20",X"00",X"00", + X"00",X"00",X"00",X"80",X"00",X"00",X"90",X"F0",X"00",X"00",X"00",X"00",X"00",X"77",X"88",X"10", + X"00",X"00",X"00",X"00",X"00",X"16",X"94",X"F0",X"00",X"00",X"10",X"30",X"10",X"30",X"F0",X"30", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"00",X"77",X"00",X"00",X"00",X"00",X"00", + X"F0",X"94",X"16",X"00",X"00",X"00",X"00",X"00",X"30",X"F0",X"60",X"40",X"E0",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"48",X"60",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"66",X"11",X"10",X"F3",X"00",X"00",X"00",X"00",X"00",X"ED",X"E1",X"F0", + X"F0",X"60",X"48",X"00",X"00",X"00",X"00",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F4",X"10",X"00",X"77",X"00",X"00",X"00",X"00",X"F8",X"E1",X"ED",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"00",X"00",X"80",X"F0",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"44", + X"00",X"00",X"00",X"00",X"00",X"8B",X"42",X"F0",X"00",X"00",X"00",X"70",X"40",X"E0",X"F0",X"90", + X"C0",X"80",X"00",X"00",X"80",X"00",X"00",X"00",X"33",X"00",X"33",X"00",X"00",X"00",X"00",X"00", + X"F0",X"42",X"8B",X"00",X"00",X"00",X"00",X"00",X"90",X"F0",X"E0",X"40",X"70",X"00",X"00",X"00", + X"00",X"00",X"88",X"44",X"22",X"2A",X"48",X"E0",X"00",X"00",X"00",X"20",X"30",X"30",X"10",X"10", + X"00",X"00",X"10",X"00",X"00",X"80",X"F0",X"E0",X"00",X"80",X"C0",X"80",X"C0",X"E1",X"E0",X"70", + X"F1",X"D1",X"D5",X"55",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"30",X"30",X"20",X"70",X"20",X"00",X"00",X"70",X"C1",X"43",X"00",X"00",X"33",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0E",X"00",X"00",X"00",X"10",X"10",X"F0",X"F0",X"F2", + X"00",X"00",X"00",X"01",X"07",X"0F",X"09",X"0F",X"06",X"0E",X"0C",X"08",X"0E",X"07",X"0B",X"07", + X"0F",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"10",X"10",X"00",X"00",X"00",X"00", + X"09",X"0F",X"07",X"01",X"00",X"00",X"00",X"00",X"0B",X"07",X"0E",X"08",X"0C",X"0E",X"06",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"0E",X"00",X"10",X"10",X"F0",X"F0",X"F2",X"F0",X"F0", + X"00",X"01",X"07",X"0F",X"09",X"0F",X"09",X"0F",X"06",X"0E",X"08",X"0E",X"0B",X"0B",X"07",X"0F", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"08",X"0C",X"06",X"06",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"0E",X"00",X"10",X"10",X"F0",X"F0",X"F2",X"F0",X"F0", + X"00",X"00",X"01",X"0F",X"09",X"0F",X"09",X"0F",X"00",X"06",X"0E",X"08",X"0E",X"07",X"07",X"0F", + X"06",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"08",X"0E",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"0F",X"0E",X"00",X"00",X"00",X"10",X"10",X"F0",X"F0",X"F2", + X"01",X"01",X"00",X"01",X"07",X"0F",X"09",X"0F",X"0C",X"0C",X"08",X"08",X"0E",X"0F",X"0F",X"03", + X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"10",X"10",X"00",X"00",X"00",X"00", + X"09",X"0F",X"07",X"01",X"00",X"01",X"01",X"00",X"0F",X"0F",X"0E",X"08",X"08",X"0C",X"0C",X"00", + X"00",X"00",X"00",X"02",X"01",X"03",X"0F",X"0E",X"00",X"00",X"00",X"10",X"10",X"F0",X"F0",X"F2", + X"0E",X"0F",X"07",X"01",X"07",X"0F",X"09",X"0F",X"00",X"00",X"08",X"08",X"0C",X"0F",X"0B",X"01", + X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"10",X"10",X"00",X"00",X"00",X"00", + X"09",X"0F",X"07",X"01",X"07",X"0F",X"0E",X"00",X"0B",X"0F",X"0C",X"08",X"08",X"00",X"00",X"00", + X"00",X"00",X"CC",X"00",X"08",X"0C",X"15",X"B7",X"00",X"00",X"00",X"00",X"00",X"30",X"20",X"30", + X"00",X"00",X"00",X"00",X"00",X"80",X"F7",X"80",X"00",X"33",X"33",X"22",X"03",X"07",X"0C",X"18", + X"04",X"37",X"15",X"0C",X"08",X"00",X"CC",X"88",X"00",X"30",X"20",X"30",X"00",X"00",X"00",X"00", + X"00",X"80",X"F7",X"80",X"00",X"00",X"00",X"00",X"08",X"68",X"0C",X"07",X"03",X"22",X"33",X"11", + X"00",X"66",X"CC",X"00",X"08",X"0C",X"04",X"95",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00", + X"00",X"00",X"00",X"00",X"C0",X"62",X"D1",X"00",X"00",X"00",X"11",X"33",X"03",X"07",X"0E",X"1C", + X"37",X"04",X"37",X"1D",X"08",X"00",X"88",X"00",X"30",X"20",X"30",X"00",X"00",X"00",X"00",X"00", + X"80",X"C4",X"B3",X"00",X"00",X"00",X"00",X"00",X"0C",X"3C",X"0E",X"07",X"03",X"22",X"77",X"66", + X"00",X"00",X"00",X"00",X"08",X"0C",X"2E",X"2E",X"00",X"00",X"00",X"00",X"00",X"30",X"20",X"30", + X"00",X"00",X"00",X"00",X"00",X"80",X"F7",X"80",X"33",X"66",X"66",X"22",X"03",X"07",X"0C",X"1C", + X"0C",X"2E",X"2E",X"0C",X"08",X"00",X"00",X"00",X"00",X"30",X"20",X"30",X"00",X"00",X"00",X"00", + X"00",X"80",X"F7",X"80",X"00",X"00",X"00",X"00",X"0C",X"2C",X"0C",X"07",X"03",X"22",X"77",X"66", + X"00",X"88",X"CC",X"00",X"08",X"1D",X"3F",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"B3",X"C4",X"00",X"11",X"33",X"22",X"03",X"07",X"0C",X"18", + X"3F",X"1D",X"0C",X"0C",X"08",X"00",X"00",X"00",X"30",X"00",X"10",X"10",X"10",X"00",X"00",X"00", + X"80",X"00",X"D1",X"62",X"C0",X"00",X"00",X"11",X"08",X"68",X"0C",X"07",X"03",X"22",X"EE",X"CC", + X"00",X"88",X"CC",X"00",X"08",X"1D",X"3F",X"84",X"00",X"00",X"00",X"00",X"00",X"70",X"50",X"70", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"33",X"22",X"22",X"03",X"07",X"0F",X"18", + X"04",X"04",X"3F",X"1D",X"08",X"00",X"44",X"CC",X"00",X"70",X"50",X"70",X"00",X"00",X"00",X"00", + X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"08",X"68",X"0F",X"07",X"03",X"22",X"33",X"11", + X"00",X"00",X"00",X"00",X"08",X"0C",X"15",X"B7",X"00",X"00",X"00",X"00",X"70",X"50",X"70",X"00", + X"00",X"22",X"33",X"00",X"00",X"CC",X"33",X"00",X"44",X"66",X"FF",X"22",X"03",X"07",X"0C",X"18", + X"04",X"37",X"15",X"0C",X"08",X"00",X"00",X"CC",X"00",X"00",X"30",X"20",X"30",X"00",X"00",X"00", + X"00",X"00",X"B3",X"C4",X"80",X"00",X"00",X"00",X"08",X"68",X"0C",X"07",X"03",X"EE",X"33",X"FF", + X"88",X"00",X"00",X"00",X"08",X"0C",X"15",X"B7",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"20", + X"11",X"11",X"00",X"00",X"00",X"00",X"B3",X"C4",X"11",X"FF",X"22",X"22",X"03",X"06",X"0C",X"18", + X"04",X"37",X"15",X"0C",X"08",X"00",X"00",X"00",X"30",X"20",X"30",X"00",X"00",X"00",X"00",X"00", + X"80",X"C4",X"B3",X"00",X"00",X"33",X"11",X"77",X"08",X"68",X"0C",X"06",X"03",X"22",X"22",X"EE", + X"00",X"00",X"00",X"00",X"08",X"2E",X"2E",X"0C",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"33",X"00",X"11",X"00",X"00",X"C0",X"73",X"C0",X"CC",X"44",X"EE",X"22",X"03",X"07",X"0D",X"68", + X"04",X"0C",X"2E",X"2E",X"08",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"00",X"00",X"00", + X"00",X"C0",X"73",X"C0",X"00",X"00",X"33",X"77",X"08",X"38",X"0D",X"07",X"03",X"22",X"EE",X"88", + X"00",X"00",X"CC",X"00",X"00",X"08",X"19",X"6E",X"00",X"00",X"00",X"00",X"00",X"30",X"20",X"30", + X"00",X"00",X"00",X"00",X"00",X"80",X"E7",X"81",X"00",X"33",X"33",X"66",X"07",X"0F",X"08",X"C0", + X"08",X"6E",X"19",X"08",X"00",X"00",X"CC",X"00",X"00",X"30",X"20",X"30",X"00",X"00",X"00",X"00", + X"01",X"81",X"E7",X"80",X"00",X"00",X"00",X"00",X"00",X"30",X"08",X"0F",X"07",X"66",X"33",X"11", + X"00",X"00",X"E0",X"A0",X"E0",X"44",X"88",X"00",X"11",X"00",X"00",X"00",X"00",X"11",X"11",X"00", + X"CC",X"77",X"33",X"22",X"03",X"02",X"8E",X"14",X"88",X"88",X"00",X"00",X"0C",X"06",X"06",X"97", + X"00",X"00",X"CC",X"44",X"44",X"70",X"50",X"70",X"00",X"33",X"22",X"00",X"00",X"00",X"00",X"00", + X"04",X"9C",X"16",X"03",X"00",X"00",X"11",X"33",X"06",X"06",X"17",X"0C",X"88",X"88",X"FF",X"88", + X"70",X"50",X"50",X"D0",X"00",X"F0",X"10",X"F0",X"08",X"0F",X"0F",X"08",X"08",X"00",X"00",X"0F", + X"00",X"0E",X"0E",X"02",X"02",X"0E",X"00",X"0C",X"54",X"54",X"54",X"54",X"CC",X"DC",X"DC",X"DC", + X"00",X"C0",X"40",X"F0",X"00",X"50",X"50",X"F0",X"09",X"09",X"0D",X"03",X"08",X"0F",X"0F",X"08", + X"19",X"19",X"19",X"1D",X"33",X"3B",X"3B",X"33",X"CC",X"DC",X"DC",X"DC",X"CC",X"DC",X"DC",X"DC", + X"EF",X"13",X"15",X"19",X"99",X"99",X"99",X"99",X"F7",X"C8",X"A8",X"98",X"99",X"99",X"99",X"99", + X"FF",X"00",X"00",X"FF",X"80",X"40",X"31",X"32",X"FF",X"00",X"00",X"FF",X"01",X"02",X"8C",X"4C", + X"99",X"99",X"99",X"99",X"91",X"51",X"31",X"FE",X"99",X"99",X"99",X"99",X"89",X"8A",X"8C",X"7F", + X"23",X"13",X"04",X"08",X"FF",X"00",X"00",X"FF",X"C4",X"C8",X"20",X"10",X"FF",X"00",X"00",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..8001b50d --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,32 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"00",X"02",X"02",X"02",X"00",X"0D",X"0D",X"0D", + X"00",X"09",X"0C",X"03",X"00",X"05",X"02",X"0B",X"00",X"02",X"06",X"04",X"00",X"0F",X"0D",X"05", + X"00",X"0D",X"0C",X"06",X"00",X"02",X"0C",X"07",X"00",X"07",X"0F",X"09",X"00",X"01",X"0A",X"0C", + X"00",X"01",X"0A",X"08",X"00",X"08",X"07",X"0E",X"00",X"07",X"0C",X"0A",X"00",X"07",X"0F",X"01", + X"00",X"07",X"03",X"06",X"00",X"05",X"0C",X"0A",X"00",X"0D",X"0E",X"01",X"00",X"02",X"08",X"01", + X"00",X"02",X"06",X"01",X"00",X"05",X"01",X"0A",X"00",X"08",X"06",X"0A",X"00",X"06",X"07",X"04", + X"00",X"06",X"0F",X"01",X"00",X"07",X"0A",X"0F",X"00",X"05",X"07",X"09",X"00",X"0F",X"08",X"05", + X"00",X"02",X"0F",X"01",X"00",X"0F",X"0C",X"08",X"00",X"02",X"0C",X"08",X"00",X"0D",X"0C",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin + data <= rom_data(to_integer(unsigned(addr))); +end architecture; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..9c147a6a --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"AC",X"47",X"38",X"1F",X"37",X"3F",X"FF",X"B6",X"E8",X"1D",X"9F",X"27",X"86",X"F8",X"C8"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..84a48830 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"01",X"53",X"A3",X"BF",X"B5",X"A3",X"3D",X"B5",X"10",X"9F",X"0E",X"A1",X"D7",X"37",X"88",X"E9", + X"AF",X"10",X"F9",X"5C",X"64",X"BB",X"10",X"FF",X"98",X"7D",X"D2",X"07",X"37",X"7D",X"17",X"77", + X"37",X"40",X"03",X"36",X"EC",X"22",X"B5",X"34",X"5F",X"27",X"E0",X"98",X"13",X"98",X"5D",X"53", + X"A3",X"9B",X"B5",X"E6",X"19",X"03",X"9F",X"F8",X"45",X"5D",X"55",X"4D",X"A2",X"C2",X"FC",X"4B", + X"38",X"08",X"BF",X"10",X"FB",X"54",X"B2",X"09",X"55",X"33",X"34",X"57",X"E1",X"29",X"98",X"41", + X"A2",X"41",X"C7",X"DB",X"DB",X"45",X"A2",X"0A",X"FC",X"4B",X"AE",X"AB",X"A2",X"6E",X"FC",X"4B", + X"AE",X"F6",X"E0",X"C6",X"18",X"F8",X"AF",X"BB",X"79",X"FF",X"5C",X"44",X"BF",X"E2",X"69",X"73", + X"79",X"EB",X"BB",X"9B",X"8B",X"E0",X"71",X"B6",X"71",X"24",X"4C",X"FD",X"B6",X"9E",X"E0",X"5C", + X"44",X"BF",X"E0",X"BB",X"9B",X"8B",X"E0",X"BB",X"9B",X"8B",X"05",X"C6",X"AF",X"59",X"A2",X"2A", + X"FC",X"4B",X"AF",X"87",X"A2",X"0F",X"F8",X"4B",X"AE",X"8A",X"D9",X"8F",X"BA",X"D8",X"8B",X"8B", + X"F0",X"8B",X"F1",X"8B",X"E0",X"69",X"DA",X"8B",X"5D",X"4D",X"55",X"C6",X"D0",X"DB",X"DB",X"1B", + X"DB",X"DB",X"F3",X"BF",X"D0",X"8F",X"BA",X"8A",X"96",X"15",X"08",X"9F",X"BB",X"DF",X"5C",X"52", + X"FF",X"0D",X"1D",X"B7",X"14",X"8F",X"DB",X"FC",X"C7",X"8B",X"E3",X"BF",X"8B",X"C7",X"AF",X"9B", + X"5C",X"80",X"C2",X"5C",X"F7",X"BE",X"5C",X"E3",X"9F",X"10",X"9F",X"1F",X"15",X"1D",X"41",X"F3", + X"FD",X"B5",X"E6",X"F3",X"FD",X"B5",X"10",X"FD",X"05",X"00",X"1C",X"A2",X"2A",X"FC",X"4B",X"AF", + X"75",X"8F",X"21",X"D8",X"53",X"FB",X"FE",X"C1",X"8B",X"B7",X"64",X"B6",X"3C",X"5D",X"D9",X"60", + X"FD",X"A6",X"93",X"A2",X"2D",X"DC",X"60",X"9B",X"FA",X"A4",X"AE",X"BE",X"60",X"BB",X"FA",X"BF", + X"AE",X"BB",X"FA",X"E6",X"A4",X"1F",X"1D",X"B3",X"93",X"8B",X"E0",X"B3",X"93",X"8B",X"1C",X"45", + X"5D",X"FB",X"40",X"A2",X"DE",X"FC",X"18",X"C1",X"AF",X"BB",X"FB",X"42",X"5C",X"96",X"BB",X"2F", + X"A3",X"DE",X"FC",X"1D",X"05",X"1C",X"45",X"4D",X"A2",X"4A",X"FC",X"4B",X"AF",X"96",X"5C",X"B0", + X"9F",X"A2",X"BF",X"B5",X"69",X"B7",X"38",X"91",X"97",X"A2",X"0A",X"FC",X"4B",X"AF",X"BE",X"A2", + X"BD",X"B5",X"69",X"B7",X"38",X"91",X"97",X"0D",X"05",X"1C",X"A2",X"DA",X"FC",X"4B",X"AE",X"EE", + X"A2",X"BF",X"B5",X"18",X"C8",X"3D",X"53",X"A3",X"DA",X"FC",X"E6",X"A3",X"97",X"FC",X"5C",X"63", + X"DB",X"E2",X"BF",X"5C",X"A6",X"BA",X"8F",X"A2",X"FC",X"E0",X"60",X"16",X"3C",X"79",X"9F",X"CB", + X"C1",X"E2",X"DA",X"A3",X"FE",X"FC",X"E2",X"9F",X"A3",X"DB",X"B5",X"1C",X"8F",X"FE",X"FC",X"C7", + X"3D",X"E3",X"9F",X"A2",X"BF",X"B5",X"18",X"C8",X"3C",X"53",X"A3",X"DB",X"B5",X"E6",X"A3",X"DA", + X"FC",X"1C",X"5C",X"79",X"9E",X"5C",X"63",X"DB",X"E2",X"BE",X"5C",X"A6",X"BA",X"5C",X"A6",X"9B", + X"19",X"BB",X"82",X"A3",X"16",X"FC",X"A3",X"4F",X"F8",X"A3",X"DA",X"FC",X"A3",X"B3",X"FC",X"8F", + X"F8",X"FC",X"E3",X"91",X"8B",X"E3",X"9C",X"8B",X"E3",X"FD",X"8B",X"E3",X"BF",X"8B",X"E3",X"9F", + X"8B",X"E3",X"BF",X"A2",X"BD",X"B5",X"18",X"C0",X"E2",X"9F",X"AE",X"9F",X"53",X"A3",X"0A",X"FC", + X"19",X"28",X"C2",X"45",X"69",X"25",X"DA",X"DA",X"DA",X"DA",X"D9",X"05",X"69",X"DA",X"D8",X"1C", + X"45",X"A2",X"37",X"FC",X"B6",X"FF",X"45",X"A2",X"FF",X"DC",X"5D",X"D9",X"A2",X"0A",X"FC",X"4B", + X"AE",X"DA",X"A4",X"FB",X"BF",X"60",X"9F",X"AE",X"9F",X"FF",X"A4",X"A3",X"9B",X"B5",X"A3",X"6E", + X"FC",X"1D",X"05",X"1C",X"A2",X"37",X"FC",X"B6",X"9B",X"A2",X"FF",X"DC",X"5D",X"D9",X"A2",X"0A", + X"FC",X"4B",X"AE",X"92",X"A4",X"60",X"9F",X"AE",X"F3",X"A2",X"BD",X"B5",X"D9",X"69",X"DA",X"D8", + X"A4",X"69",X"B7",X"DB",X"07",X"D8",X"A2",X"BF",X"B5",X"69",X"3F",X"DA",X"07",X"1D",X"1C",X"A2", + X"BF",X"B5",X"69",X"DA",X"D8",X"A2",X"BD",X"B5",X"69",X"AD",X"B6",X"25",X"5C",X"D5",X"BB",X"FB", + X"F2",X"5C",X"9E",X"9B",X"1C",X"5C",X"8C",X"BB",X"5C",X"A0",X"BB",X"5C",X"4E",X"BB",X"1C",X"5C", + X"1A",X"BB",X"5C",X"76",X"BB",X"5C",X"23",X"BB",X"1C",X"8F",X"39",X"99",X"9F",X"9F",X"F6",X"5C", + X"26",X"BB",X"8F",X"29",X"99",X"9F",X"9F",X"F6",X"B6",X"E2",X"8F",X"BB",X"BD",X"9F",X"9F",X"F6", + X"5C",X"26",X"BB",X"8F",X"AB",X"BD",X"9F",X"9F",X"F6",X"B6",X"CE",X"8F",X"39",X"D9",X"9F",X"9F", + X"F6",X"5C",X"26",X"BB",X"8F",X"29",X"D9",X"9F",X"9F",X"F6",X"B6",X"F6",X"8F",X"BB",X"FD",X"9F", + X"9F",X"F6",X"5C",X"26",X"BB",X"8F",X"AB",X"FD",X"9F",X"9F",X"F6",X"B6",X"9A",X"8F",X"BD",X"BD", + X"B6",X"9B",X"8F",X"BD",X"FD",X"9F",X"FF",X"3F",X"C1",X"8B",X"B7",X"64",X"A3",X"3D",X"B5",X"DE", + X"AF",X"61",X"1C",X"FB",X"E6",X"5C",X"0D",X"BB",X"E2",X"9F",X"A3",X"BF",X"B5",X"00",X"A2",X"BE", + X"FC",X"4B",X"AF",X"05",X"A3",X"3D",X"B5",X"E6",X"A3",X"BE",X"FC",X"B7",X"2C",X"DE",X"AF",X"09", + X"1C",X"45",X"A2",X"A2",X"FC",X"4B",X"AF",X"BB",X"05",X"1C",X"87",X"25",X"D8",X"53",X"A3",X"B7", + X"FC",X"A3",X"C2",X"FC",X"E6",X"A3",X"BF",X"B5",X"00",X"19",X"F5",X"B2",X"5D",X"FA",X"BF",X"DE", + X"AF",X"44",X"A3",X"3D",X"B5",X"B7",X"24",X"1D",X"1C",X"45",X"5D",X"A4",X"A3",X"DB",X"FC",X"E2", + X"9F",X"A3",X"BF",X"B5",X"00",X"A3",X"3D",X"B5",X"A2",X"DB",X"FC",X"4B",X"AF",X"05",X"1D",X"05", + X"1C",X"45",X"E2",X"9F",X"A3",X"BE",X"FC",X"E2",X"9F",X"A3",X"BF",X"B5",X"00",X"A3",X"3D",X"B5", + X"A2",X"BE",X"FC",X"4B",X"AF",X"05",X"05",X"1C",X"4D",X"8F",X"BC",X"9B",X"5F",X"C8",X"E2",X"BF", + X"7F",X"C9",X"F9",X"5C",X"9E",X"9B",X"0D",X"1C",X"9F",X"40",X"40",X"A1",X"6A",X"34",X"E6",X"F5", + X"40",X"74",X"4D",X"8F",X"BC",X"9B",X"5F",X"C8",X"E2",X"BF",X"7E",X"C9",X"F8",X"18",X"86",X"8F", + X"38",X"F8",X"5C",X"CC",X"9B",X"5C",X"CC",X"9B",X"DE",X"AF",X"65",X"0D",X"1C",X"FB",X"9B",X"5D", + X"A4",X"4C",X"FD",X"79",X"FB",X"A3",X"C6",X"D8",X"4D",X"F9",X"8B",X"F8",X"8B",X"8B",X"5C",X"B9", + X"AB",X"0D",X"97",X"9A",X"BF",X"96",X"1D",X"B7",X"69",X"5C",X"8F",X"9B",X"1C",X"55",X"E2",X"9F", + X"A3",X"FB",X"FC",X"B2",X"5C",X"4B",X"9B",X"93",X"B2",X"5C",X"4B",X"9B",X"93",X"53",X"A3",X"FB", + X"FC",X"B2",X"5C",X"4B",X"9B",X"15",X"1C",X"5D",X"5C",X"09",X"9F",X"A4",X"5C",X"47",X"9B",X"84", + X"5C",X"47",X"9B",X"1D",X"1C",X"55",X"D0",X"A2",X"FB",X"FC",X"D1",X"4B",X"AE",X"9E",X"80",X"4B", + X"E2",X"BF",X"AF",X"9B",X"F2",X"35",X"A0",X"A3",X"FB",X"FC",X"80",X"79",X"A7",X"15",X"55",X"C1", + X"4D",X"97",X"BF",X"FF",X"96",X"A2",X"BF",X"FC",X"C1",X"0D",X"A2",X"4F",X"F8",X"4B",X"97",X"40", + X"40",X"AE",X"9B",X"97",X"2D",X"40",X"96",X"15",X"1C",X"5D",X"55",X"5C",X"09",X"9F",X"A4",X"60", + X"BA",X"F3",X"A7",X"A6",X"BB",X"F3",X"C3",X"3B",X"5C",X"78",X"9B",X"84",X"60",X"BA",X"F3",X"A7", + X"A6",X"BB",X"F3",X"C3",X"3B",X"5C",X"78",X"9B",X"15",X"1D",X"1C",X"84",X"C0",X"08",X"10",X"2A", + X"87",X"63",X"75",X"0B",X"5C",X"9B",X"97",X"53",X"74",X"86",X"C0",X"72",X"F7",X"29",X"72",X"FF", + X"2D",X"72",X"B5",X"34",X"6E",X"72",X"35",X"2D",X"72",X"15",X"2D",X"4D",X"77",X"97",X"94",X"5C", + X"2E",X"A3",X"4A",X"03",X"9F",X"C1",X"96",X"B7",X"64",X"1C",X"45",X"F8",X"1F",X"C1",X"05",X"96", + X"B7",X"24",X"1C",X"5D",X"9F",X"9F",X"BF",X"B6",X"FF",X"5D",X"9F",X"2D",X"40",X"4C",X"99",X"BB", + X"FC",X"45",X"AB",X"FF",X"FC",X"5D",X"FA",X"A3",X"01",X"4C",X"BD",X"78",X"4D",X"8F",X"35",X"00", + X"1D",X"60",X"40",X"AE",X"D7",X"C1",X"5D",X"4D",X"9F",X"BF",X"FF",X"9E",X"A2",X"BF",X"FC",X"C1", + X"0D",X"1D",X"93",X"4C",X"98",X"BB",X"FC",X"9E",X"B6",X"10",X"93",X"FA",X"F7",X"01",X"4C",X"BD", + X"78",X"6D",X"50",X"8F",X"35",X"00",X"60",X"40",X"AF",X"9B",X"05",X"1D",X"1C",X"60",X"60",X"AF", + X"9E",X"AA",X"FF",X"FC",X"8B",X"AB",X"FF",X"FC",X"B6",X"02",X"A3",X"BF",X"FC",X"B6",X"63",X"A4", + X"BE",X"B6",X"DB",X"F9",X"A4",X"BE",X"8B",X"F8",X"8B",X"08",X"B2",X"93",X"60",X"AF",X"AE",X"9F", + X"C1",X"5D",X"4D",X"9F",X"BF",X"FF",X"9E",X"B2",X"93",X"4B",X"AE",X"9F",X"C1",X"0D",X"8A",X"1D", + X"B7",X"2C",X"BE",X"D9",X"BE",X"5D",X"E2",X"2D",X"3F",X"FB",X"40",X"D8",X"9E",X"1D",X"DE",X"AF", + X"14",X"1C",X"4D",X"01",X"97",X"0D",X"ED",X"9F",X"FF",X"9E",X"4C",X"AC",X"57",X"90",X"65",X"98", + X"27",X"91",X"55",X"4F",X"4D",X"97",X"9B",X"DF",X"8F",X"32",X"B9",X"5C",X"9C",X"FF",X"A2",X"9F", + X"FC",X"A3",X"BF",X"FC",X"53",X"A3",X"FB",X"FC",X"A2",X"A2",X"FC",X"8F",X"22",X"9D",X"5C",X"4B", + X"9B",X"0D",X"1C",X"8A",X"45",X"11",X"30",X"05",X"25",X"1D",X"24",X"8A",X"8A",X"A2",X"FF",X"DC", + X"60",X"9F",X"AF",X"BE",X"8F",X"44",X"99",X"97",X"56",X"FC",X"B6",X"FB",X"8F",X"49",X"99",X"97", + X"2F",X"FC",X"53",X"A3",X"4F",X"F8",X"5C",X"5E",X"9B",X"E2",X"9F",X"A3",X"4F",X"F8",X"1C",X"45", + X"55",X"4D",X"45",X"A2",X"B7",X"FC",X"60",X"9F",X"38",X"ED",X"DF",X"97",X"52",X"FC",X"8F",X"4B", + X"FC",X"A2",X"FF",X"DC",X"60",X"9F",X"AE",X"FB",X"97",X"2B",X"FC",X"8F",X"0E",X"FC",X"05",X"4D", + X"C8",X"B2",X"1F",X"CB",X"B3",X"92",X"B2",X"3E",X"CB",X"B3",X"92",X"B2",X"5E",X"CB",X"B3",X"0D", + X"5C",X"8C",X"DF",X"45",X"05",X"0D",X"15",X"05",X"1C",X"A2",X"36",X"FC",X"D8",X"B2",X"06",X"34", + X"E0",X"4B",X"3C",X"8A",X"E7",X"5C",X"1F",X"DF",X"E2",X"F7",X"5C",X"A6",X"BA",X"8B",X"E3",X"BF", + X"1C",X"A2",X"FF",X"DC",X"60",X"9F",X"AF",X"FE",X"4D",X"9F",X"6B",X"FC",X"97",X"50",X"40",X"8F", + X"D6",X"BD",X"B6",X"BA",X"4D",X"9F",X"2E",X"FC",X"97",X"0D",X"40",X"8F",X"BB",X"BD",X"A2",X"4A", + X"FC",X"4B",X"AF",X"EB",X"BA",X"4B",X"AE",X"AB",X"60",X"9E",X"A6",X"BB",X"E2",X"BE",X"D9",X"E3", + X"9F",X"55",X"97",X"AF",X"BF",X"96",X"E2",X"9E",X"C1",X"4D",X"97",X"BF",X"FF",X"96",X"E6",X"C1", + X"97",X"2D",X"40",X"96",X"C1",X"0D",X"15",X"96",X"B7",X"4D",X"0D",X"1C",X"A2",X"FF",X"DC",X"60", + X"9F",X"AF",X"9A",X"8F",X"0F",X"99",X"97",X"3B",X"99",X"9F",X"DB",X"DC",X"B6",X"9E",X"8F",X"1D", + X"BD",X"97",X"3B",X"BD",X"9F",X"BA",X"DC",X"55",X"97",X"65",X"DF",X"5C",X"9C",X"FF",X"0D",X"BA", + X"5C",X"4B",X"9B",X"1C",X"2D",X"05",X"20",X"05",X"2D",X"8A",X"8A",X"55",X"4D",X"97",X"9E",X"FB", + X"8F",X"A9",X"B9",X"5C",X"9C",X"FF",X"0D",X"15",X"1C",X"8A",X"58",X"65",X"45",X"45",X"45",X"45", + X"45",X"45",X"41",X"8A",X"AA",X"61",X"8A",X"51",X"05",X"05",X"05",X"19",X"19",X"57",X"8A",X"58", + X"69",X"8A",X"AA",X"6D",X"4D",X"4D",X"4D",X"4D",X"4D",X"4D",X"49",X"8A",X"8A",X"45",X"01",X"10", + X"49",X"0D",X"05",X"0F",X"41",X"DF",X"69",X"A8",X"E9",X"F4",X"83",X"DB",X"F5",X"26",X"E6",X"F3", + X"C2",X"AC",X"F3",X"7A",X"AC",X"10",X"F3",X"00",X"8F",X"7B",X"F8",X"E3",X"FB",X"8B",X"E3",X"DB", + X"8B",X"E3",X"EF",X"8B",X"E3",X"2C",X"FB",X"DE",X"5C",X"63",X"FB",X"B7",X"00",X"97",X"57",X"FB", + X"8F",X"B9",X"9D",X"FB",X"9A",X"5D",X"4D",X"5C",X"63",X"FB",X"0D",X"FB",X"9B",X"B2",X"C1",X"55", + X"4D",X"97",X"BF",X"FF",X"96",X"E3",X"DB",X"0D",X"15",X"93",X"8B",X"B7",X"25",X"9F",X"D6",X"BF", + X"9E",X"4D",X"5C",X"63",X"FB",X"0D",X"1D",X"B7",X"74",X"53",X"A3",X"C2",X"FC",X"A3",X"2A",X"FC", + X"0D",X"15",X"1D",X"05",X"1C",X"61",X"41",X"40",X"EF",X"EF",X"EF",X"EF",X"8F",X"20",X"EF",X"98", + X"20",X"EF",X"98",X"20",X"EF",X"DD",X"20",X"EF",X"DD",X"20",X"8B",X"DD",X"04",X"AB",X"EF",X"24", + X"BF",X"EE",X"44",X"BF",X"00",X"64",X"8F",X"7B",X"F8",X"E0",X"68",X"FF",X"C1",X"8B",X"8B",X"E0", + X"79",X"FF",X"C1",X"5C",X"8F",X"9B",X"5C",X"8F",X"9B",X"1C",X"97",X"75",X"FB",X"8F",X"EF",X"BD", + X"5C",X"99",X"FF",X"1C",X"8A",X"40",X"29",X"09",X"1D",X"24",X"15",X"30",X"09",X"34",X"30",X"09", + X"11",X"77",X"10",X"09",X"34",X"05",X"77",X"66",X"7E",X"5E",X"56",X"77",X"35",X"8A",X"8A",X"4C", + X"D0",X"69",X"9B",X"E6",X"A3",X"9E",X"FC",X"1C",X"97",X"9A",X"DB",X"8F",X"A9",X"B9",X"5C",X"9C", + X"FF",X"97",X"9D",X"D8",X"8F",X"99",X"B9",X"5C",X"5E",X"9B",X"1C",X"8A",X"58",X"65",X"45",X"45", + X"45",X"45",X"45",X"45",X"41",X"8A",X"AA",X"61",X"75",X"75",X"75",X"75",X"75",X"75",X"69",X"8A", + X"AA",X"6D",X"4D",X"4D",X"4D",X"4D",X"4D",X"4D",X"49",X"8A",X"5D",X"8A",X"8A",X"8F",X"C0",X"F8", + X"C7",X"3D",X"A2",X"E0",X"F8",X"A3",X"C0",X"F8",X"A2",X"4A",X"FC",X"4B",X"3D",X"A2",X"B7",X"FC", + X"4B",X"3D",X"FB",X"9F",X"5C",X"E0",X"DB",X"8F",X"9D",X"D8",X"E0",X"8B",X"63",X"AF",X"DF",X"E2", + X"9F",X"A3",X"2F",X"F8",X"4D",X"97",X"9D",X"D8",X"8F",X"99",X"B9",X"5C",X"5E",X"9B",X"0D",X"8A", + X"E0",X"4B",X"3D",X"E2",X"9A",X"5C",X"A6",X"BA",X"1C",X"53",X"8F",X"9D",X"D8",X"4C",X"C9",X"8B", + X"4C",X"C9",X"8B",X"4C",X"C9",X"F8",X"8A",X"F9",X"8A",X"E0",X"5C",X"CA",X"DF",X"1C",X"97",X"B9", + X"D8",X"B2",X"37",X"CB",X"B3",X"92",X"B2",X"70",X"BF",X"CB",X"B3",X"60",X"9B",X"34",X"53",X"B3", + X"93",X"B3",X"1C",X"05",X"1A",X"41",X"8B",X"8A",X"E6",X"F3",X"DD",X"B5",X"F3",X"FD",X"B5",X"F0", + X"D0",X"05",X"80",X"E1",X"FD",X"D4",X"15",X"F5",X"23",X"CC",X"F3",X"3D",X"B5",X"FF",X"37",X"15", + X"D4",X"A6",X"2B",X"C2",X"8B",X"1E",X"45",X"5D",X"4D",X"01",X"10",X"73",X"57",X"89",X"2D",X"98", + X"F6",X"2A",X"E0",X"46",X"51",X"53",X"53",X"B7",X"51",X"98",X"D2",X"98",X"D2",X"00",X"53",X"C1", + X"8B",X"B7",X"64",X"8F",X"58",X"FC",X"97",X"B5",X"B5",X"9F",X"B7",X"BF",X"4C",X"27",X"8F",X"58", + X"FC",X"97",X"BD",X"B5",X"9F",X"B7",X"BF",X"4C",X"27",X"E2",X"FF",X"A3",X"B8",X"B5",X"E2",X"DF", + X"A3",X"DD",X"B5",X"A3",X"D8",X"B5",X"8F",X"43",X"FC",X"FB",X"FE",X"53",X"C1",X"8B",X"B7",X"64", + X"A3",X"9F",X"B5",X"E6",X"A3",X"9F",X"B5",X"0D",X"1D",X"05",X"1C",X"98",X"45",X"98",X"03",X"0D", + X"00",X"19",X"B7",X"C3",X"FB",X"9B",X"97",X"64",X"40",X"8F",X"42",X"FC",X"E0",X"4B",X"7D",X"CF", + X"BE",X"96",X"B7",X"24",X"1C",X"10",X"ED",X"85",X"84",X"87",X"3E",X"4E",X"72",X"71",X"0D",X"53", + X"53",X"87",X"98",X"1B",X"F0",X"8B",X"F1",X"10",X"88",X"F0",X"05",X"80",X"10",X"AF",X"80",X"69", + X"2D",X"DB",X"DB",X"DB",X"8F",X"D8",X"BE",X"D0",X"DB",X"1B",X"F3",X"BF",X"D0",X"96",X"0C",X"19", + X"88",X"BE",X"19",X"5E",X"BE",X"19",X"27",X"BE",X"19",X"0D",X"BE",X"19",X"93",X"9E",X"19",X"AC", + X"BE",X"19",X"8C",X"BE",X"19",X"1E",X"9E",X"0D",X"15",X"1D",X"1C",X"0D",X"5C",X"97",X"9A",X"69", + X"D2",X"8B",X"45",X"5C",X"97",X"9A",X"D9",X"05",X"8B",X"4D",X"5C",X"55",X"9E",X"DB",X"F3",X"BF", + X"D0",X"8F",X"58",X"FC",X"96",X"A5",X"8B",X"E3",X"BF",X"15",X"19",X"C3",X"BE",X"0D",X"5C",X"97", + X"9A",X"69",X"D2",X"8B",X"45",X"5C",X"97",X"9A",X"D8",X"8B",X"5C",X"97",X"9A",X"D9",X"05",X"8B", + X"4D",X"DB",X"F3",X"BF",X"D0",X"8F",X"19",X"FC",X"96",X"85",X"8B",X"A5",X"15",X"19",X"C3",X"BE", + X"0D",X"5C",X"97",X"9A",X"69",X"D2",X"8B",X"45",X"5C",X"97",X"9A",X"D8",X"8B",X"5C",X"97",X"9A", + X"D9",X"05",X"8B",X"4D",X"45",X"DB",X"F3",X"BF",X"D0",X"8F",X"58",X"FC",X"96",X"4D",X"E0",X"8B", + X"E8",X"C9",X"9E",X"FD",X"DC",X"0D",X"A5",X"8B",X"85",X"05",X"5C",X"55",X"9E",X"15",X"19",X"C3", + X"BE",X"0D",X"5C",X"97",X"9A",X"69",X"D2",X"8B",X"45",X"5C",X"97",X"9A",X"D9",X"05",X"8B",X"4D", + X"DB",X"F3",X"BF",X"D0",X"8F",X"58",X"FC",X"96",X"E0",X"26",X"AE",X"97",X"0D",X"5C",X"97",X"9A", + X"D0",X"8B",X"5C",X"97",X"9A",X"D1",X"0D",X"81",X"8B",X"A1",X"19",X"C9",X"BE",X"15",X"93",X"93", + X"19",X"C3",X"BE",X"0D",X"5C",X"97",X"9A",X"69",X"D2",X"8B",X"45",X"5C",X"97",X"9A",X"D9",X"8B", + X"5C",X"97",X"9A",X"D8",X"05",X"8B",X"4D",X"45",X"DB",X"F3",X"BF",X"D0",X"8F",X"58",X"FC",X"96", + X"53",X"62",X"AE",X"FB",X"C7",X"05",X"15",X"19",X"C3",X"BE",X"A4",X"69",X"2D",X"DB",X"DB",X"DB", + X"DB",X"F3",X"BF",X"D0",X"8F",X"19",X"FC",X"96",X"F0",X"8B",X"F1",X"05",X"4D",X"DB",X"55",X"F3", + X"BF",X"D0",X"8F",X"58",X"FC",X"96",X"15",X"B2",X"C1",X"93",X"A4",X"69",X"D2",X"A3",X"9F",X"DC", + X"84",X"DB",X"55",X"F3",X"BF",X"D0",X"8F",X"58",X"FC",X"96",X"15",X"B2",X"93",X"D9",X"84",X"5C", + X"55",X"9E",X"FE",X"A5",X"8B",X"E3",X"BF",X"8B",X"A2",X"9F",X"DC",X"C6",X"A3",X"9F",X"DC",X"AF", + X"28",X"0D",X"A1",X"8A",X"81",X"15",X"19",X"C3",X"BE",X"0D",X"0D",X"A2",X"BB",X"DC",X"DB",X"DB", + X"F3",X"BF",X"D0",X"8F",X"43",X"FC",X"96",X"F9",X"8B",X"F8",X"84",X"DB",X"F3",X"BF",X"D0",X"A2", + X"BB",X"DC",X"45",X"E6",X"D9",X"DB",X"3F",X"45",X"FB",X"BF",X"5C",X"55",X"9E",X"8F",X"58",X"FC", + X"05",X"DB",X"D0",X"F3",X"BF",X"96",X"A1",X"8B",X"A1",X"05",X"DB",X"DB",X"D0",X"8F",X"43",X"FC", + X"96",X"E3",X"BF",X"19",X"C9",X"BE",X"97",X"BF",X"BF",X"4C",X"91",X"03",X"FC",X"97",X"9B",X"DF", + X"4C",X"91",X"47",X"FC",X"1C",X"60",X"DE",X"35",X"45",X"5D",X"4D",X"55",X"97",X"F2",X"BA",X"DB", + X"1B",X"D0",X"A0",X"78",X"BF",X"D1",X"B2",X"C9",X"93",X"B2",X"C8",X"53",X"15",X"0C",X"71",X"DF", + X"71",X"DF",X"C6",X"B6",X"DB",X"79",X"DF",X"79",X"DF",X"E6",X"79",X"FF",X"EB",X"B5",X"79",X"B5", + X"C8",X"A5",X"B6",X"F3",X"79",X"BB",X"79",X"9B",X"79",X"BB",X"79",X"FF",X"79",X"BB",X"EB",X"B5", + X"79",X"B5",X"C8",X"A4",X"5C",X"09",X"9F",X"85",X"8B",X"A5",X"0D",X"1D",X"05",X"1C",X"BA",X"FA", + X"BA",X"FE",X"9E",X"20",X"9E",X"04",X"BA",X"BA",X"BA",X"BE",X"9E",X"41",X"BA",X"FB",X"BA",X"FF", + X"9E",X"45",X"9E",X"68",X"9E",X"25",X"9E",X"21",X"45",X"5D",X"55",X"4D",X"45",X"A2",X"B7",X"FC", + X"60",X"9F",X"AF",X"BA",X"A2",X"97",X"FC",X"60",X"9F",X"AE",X"9B",X"05",X"B6",X"99",X"05",X"A3", + X"9B",X"DC",X"D8",X"DB",X"DB",X"F3",X"BF",X"D0",X"8F",X"0E",X"BA",X"96",X"4D",X"8B",X"8B",X"F9", + X"8B",X"E0",X"5D",X"4D",X"DB",X"DB",X"F3",X"BF",X"D0",X"8F",X"43",X"FC",X"96",X"E0",X"26",X"A6", + X"DB",X"AF",X"9E",X"8B",X"E0",X"06",X"AE",X"FF",X"E2",X"9F",X"B6",X"9F",X"53",X"0D",X"1D",X"4B", + X"0D",X"AE",X"FA",X"F0",X"8B",X"F1",X"8B",X"8B",X"E0",X"5C",X"73",X"BA",X"E2",X"9F",X"A3",X"9F", + X"B5",X"0D",X"15",X"1D",X"05",X"1C",X"55",X"DB",X"DB",X"F3",X"BF",X"D0",X"8F",X"43",X"FC",X"96", + X"A5",X"8B",X"85",X"8B",X"15",X"81",X"8B",X"A1",X"1C",X"B2",X"9A",X"9F",X"BF",X"90",X"9A",X"BB", + X"BB",X"31",X"9A",X"BB",X"9F",X"9C",X"FE",X"BB",X"BF",X"C6",X"DE",X"BB",X"BF",X"DB",X"FA",X"BB", + X"BF",X"83",X"FA",X"BB",X"BF",X"E0",X"FA",X"BB",X"BF",X"59",X"FA",X"BB",X"BF",X"BE",X"DA",X"BB", + X"BF",X"98",X"DA",X"BB",X"BF",X"E9",X"DA",X"FB",X"BF",X"A0",X"DA",X"FF",X"BF",X"03",X"DA",X"9B", + X"BF",X"71",X"DA",X"9B",X"BF",X"BF",X"B7",X"BB",X"BF",X"D7",X"B7",X"9F",X"BF",X"CB",X"B7",X"9B", + X"9F",X"CD",X"B7",X"BB",X"9F",X"2E",X"B7",X"9F",X"9F",X"31",X"B7",X"BB",X"BB",X"41",X"B7",X"BB", + X"BB",X"92",X"97",X"9F",X"BB",X"98",X"DA",X"9B",X"BF",X"9D",X"97",X"DF",X"BF",X"A0",X"DA",X"FF", + X"BF",X"55",X"10",X"88",X"A0",X"10",X"AF",X"80",X"15",X"1C",X"D9",X"F8",X"DD",X"F9",X"F9",X"FD", + X"F8",X"CD",X"F5",X"ED",X"FD",X"F8",X"BD",X"FD",X"CD",X"9D",X"FD",X"D9",X"BF",X"B0",X"EB",X"D8", + X"B5",X"FD",X"02",X"B7",X"FD",X"EF",X"D8",X"E9",X"F8",X"DD",X"F9",X"CD",X"F9",X"FD",X"F8",X"ED", + X"EC",X"BD",X"FD",X"CD",X"9D",X"FD",X"F9",X"AD",X"FD",X"CD",X"8D",X"FD",X"F9",X"BF",X"B0",X"9D", + X"D8",X"B5",X"FD",X"DD",X"B7",X"ED",X"C6",X"D8",X"E9",X"FD",X"3F",X"DC",X"C8",X"EC",X"FD",X"FB", + X"87",X"D8",X"F4",X"C0",X"C5",X"FD",X"45",X"B9",X"C9",X"87",X"FD",X"AB",X"D8",X"B4",X"FD",X"02", + X"B6",X"FD",X"AB",X"D8",X"3F",X"9B",X"FC",X"BF",X"9F",X"BF",X"BF",X"9B",X"FD",X"BF",X"9F",X"BF", + X"BF",X"AE",X"FC",X"BF",X"BB",X"BF",X"BF",X"9B",X"FD",X"BF",X"9F",X"BF",X"BF",X"9B",X"E6",X"BF", + X"9F",X"BF",X"BF",X"9B",X"86",X"BF",X"9F",X"BF",X"BF",X"9B",X"A3",X"BF",X"9F",X"BF",X"BF",X"96", + X"A7",X"BF",X"BB",X"BF",X"BF",X"96",X"A3",X"BF",X"96",X"BF",X"BF",X"9B",X"FC",X"BF",X"9F",X"BF", + X"BF",X"9B",X"FD",X"BF",X"9F",X"BF",X"BF",X"96",X"FC",X"BF",X"FF",X"BF",X"BF",X"BA",X"86",X"BF", + X"BB",X"BF",X"BF",X"BA",X"E6",X"BF",X"BB",X"BF",X"BF",X"BA",X"A7",X"BF",X"BB",X"BF",X"BF",X"AE", + X"A3",X"BF",X"E9",X"C8",X"DF",X"2E",X"D8",X"C1",X"C0",X"E5",X"FD",X"D8",X"FD",X"65",X"FB",X"ED", + X"A7",X"FD",X"04",X"D8",X"81",X"FD",X"02",X"83",X"FD",X"04",X"D8",X"3F",X"9B",X"36",X"BF",X"9F", + X"BF",X"BF",X"9B",X"3E",X"BF",X"9F",X"BF",X"BF",X"AE",X"36",X"BF",X"BB",X"BF",X"BF",X"9B",X"3E", + X"BF",X"9F",X"BF",X"BF",X"9B",X"A4",X"BF",X"9F",X"BF",X"BF",X"9B",X"A1",X"BF",X"9F",X"BF",X"BF", + X"9B",X"CD",X"BF",X"9F",X"BF",X"BF",X"96",X"AD",X"BF",X"BB",X"BF",X"BF",X"96",X"CD",X"BF",X"96", + X"BF",X"BF",X"9B",X"36",X"BF",X"9F",X"BF",X"BF",X"9B",X"3E",X"BF",X"9F",X"BF",X"BF",X"96",X"36", + X"BF",X"FF",X"BF",X"BF",X"BA",X"A1",X"BF",X"BB",X"BF",X"BF",X"BA",X"A4",X"BF",X"BB",X"BF",X"BF", + X"BA",X"AD",X"BF",X"BB",X"BF",X"BF",X"AE",X"CD",X"BF",X"D9",X"E8",X"FF",X"8F",X"EC",X"E1",X"BC", + X"D1",X"FD",X"F9",X"FD",X"F8",X"FD",X"51",X"F9",X"FD",X"93",X"FD",X"A1",X"EC",X"A1",X"FD",X"02", + X"A3",X"FD",X"A1",X"EC",X"3F",X"9B",X"B9",X"9F",X"9B",X"F1",X"9F",X"9B",X"A8",X"9F",X"9B",X"3F", + X"9F",X"9B",X"73",X"9F",X"9B",X"6A",X"9F",X"9B",X"3C",X"9F",X"9B",X"2D",X"9F",X"9B",X"BF",X"BB", + X"9B",X"AF",X"BB",X"9B",X"E6",X"BB",X"9B",X"AD",X"BB",X"9B",X"7F",X"BB",X"9B",X"6E",X"BB",X"9B", + X"75",X"BB",X"9B",X"BF",X"9B",X"9B",X"EE",X"9B",X"9B",X"F4",X"9B",X"9B",X"75",X"BB",X"9B",X"BF", + X"9B",X"9B",X"EE",X"9B",X"9B",X"6E",X"BB",X"9B",X"75",X"BB",X"9B",X"BF",X"9B",X"9B",X"7F",X"BB", + X"9B",X"6E",X"BB",X"9B",X"75",X"BB",X"9B",X"AD",X"BB",X"9B",X"7F",X"BB",X"9B",X"6E",X"BB",X"9B", + X"75",X"BB",X"9B",X"BF",X"9B",X"9B",X"EE",X"9B",X"9B",X"F4",X"9B",X"9B",X"37",X"9B",X"9B",X"3D", + X"9B",X"9B",X"BF",X"FF",X"9B",X"BD",X"FF",X"9B",X"A4",X"FF",X"9B",X"3D",X"FF",X"9B",X"BE",X"DF", + X"9B",X"B4",X"DF",X"9B",X"2E",X"DF",X"9B",X"BF",X"FB",X"9B",X"B4",X"FB",X"9B",X"B4",X"DF",X"9B", + X"2E",X"DF",X"9B",X"BF",X"FB",X"9B",X"BE",X"DF",X"9B",X"B4",X"DF",X"9B",X"2E",X"DF",X"9B",X"3D", + X"FF",X"9B",X"BE",X"DF",X"9B",X"B4",X"DF",X"9B",X"A4",X"FF",X"9B",X"3D",X"FF",X"9B",X"BE",X"DF", + X"9B",X"B4",X"DF",X"9B",X"2E",X"DF",X"9B",X"BF",X"FB",X"9B",X"B4",X"FB",X"9B",X"26",X"FB",X"9B", + X"AF",X"DB",X"9B",X"3F",X"DB",X"9B",X"BF",X"BE",X"9B",X"3F",X"BE",X"9B",X"25",X"BE",X"9B",X"3F", + X"9E",X"9B",X"B7",X"BA",X"9B",X"27",X"BA",X"9B",X"B5",X"9A",X"9B",X"BF",X"FE",X"D9",X"C8",X"F9", + X"FD",X"F8",X"CD",X"FF",X"94",X"CC",X"E1",X"F2",X"D1",X"FD",X"51",X"F9",X"FD",X"93",X"FD",X"B8", + X"CC",X"A1",X"FD",X"02",X"A3",X"FD",X"B8",X"CC",X"3F",X"9F",X"73",X"9B",X"FF",X"BF",X"BF",X"9F", + X"3C",X"9B",X"FF",X"BF",X"BF",X"9F",X"ED",X"9B",X"FF",X"BF",X"BF",X"9F",X"73",X"BB",X"FF",X"BF", + X"BF",X"9F",X"3C",X"BB",X"FF",X"BF",X"BF",X"9F",X"ED",X"BB",X"FF",X"BF",X"BF",X"9F",X"73",X"9F", + X"FF",X"BF",X"BF",X"9F",X"3C",X"9F",X"FF",X"BF",X"BF",X"9F",X"ED",X"9F",X"FF",X"BF",X"BF",X"9F", + X"73",X"BF",X"FF",X"BF",X"BF",X"9F",X"3C",X"BF",X"FF",X"BF",X"BF",X"9F",X"ED",X"BF",X"FF",X"BF", + X"BF",X"9F",X"A4",X"9F",X"9B",X"BF",X"BF",X"9F",X"2F",X"9F",X"9B",X"BF",X"BF",X"9F",X"98",X"9F", + X"9B",X"BF",X"BF",X"9F",X"A4",X"BF",X"9B",X"BF",X"BF",X"9F",X"2F",X"BF",X"9B",X"BF",X"BF",X"9F", + X"98",X"BF",X"9F",X"B0",X"9F",X"BB",X"BF",X"BF",X"9F",X"A4",X"9F",X"BB",X"BF",X"BF",X"9F",X"A3", + X"9F",X"BB",X"BF",X"BF",X"9F",X"B0",X"BF",X"BB",X"BF",X"BF",X"9F",X"A4",X"BF",X"BB",X"BF",X"BF", + X"9F",X"A3",X"BF",X"BB",X"BF",X"BF",X"9F",X"E6",X"9F",X"9F",X"BF",X"BF",X"9F",X"B5",X"9F",X"9F", + X"BF",X"BF",X"9F",X"F2",X"9F",X"9F",X"BF",X"BF",X"9F",X"E6",X"BF",X"9F",X"BF",X"BF",X"9F",X"B5", + X"BF",X"9F",X"BF",X"BF",X"9F",X"F2",X"BF",X"D9",X"EC",X"E9",X"EC",X"F8",X"CD",X"D8",X"ED",X"DD", + X"FD",X"F9",X"FD",X"CD",X"FD",X"FD",X"F7",X"ED",X"F7",X"F5",X"D5",X"B5",X"FD",X"02",X"BD",X"FD", + X"ED",X"AD",X"FD",X"D9",X"B7",X"FD",X"D0",X"E8",X"99",X"FD",X"02",X"A9",X"FD",X"02",X"AB",X"FD", + X"C5",X"E8",X"3F",X"D9",X"C8",X"E9",X"C8",X"DC",X"C8",X"D1",X"D9",X"F9",X"FD",X"F8",X"C9",X"D8", + X"C9",X"EC",X"CD",X"FD",X"F7",X"DD",X"FD",X"ED",X"D7",X"CD",X"FD",X"C9",X"F3",X"FC",X"FD",X"F5", + X"D5",X"B5",X"FD",X"02",X"BD",X"7D",X"02",X"AD",X"7D",X"02",X"89",X"7D",X"02",X"B7",X"FD",X"95", + X"E8",X"91",X"FD",X"02",X"93",X"FD",X"99",X"E8",X"FD",X"7D",X"DD",X"D9",X"B5",X"FD",X"DD",X"AD", + X"FD",X"F8",X"89",X"FD",X"F8",X"B7",X"CD",X"AE",X"E8",X"E9",X"FD",X"DC",X"FD",X"3F",X"D9",X"EC", + X"DD",X"DD",X"F9",X"FD",X"F8",X"E9",X"E9",X"EC",X"CD",X"DD",X"D8",X"CD",X"DC",X"EC",X"FC",X"DD", + X"EC",X"ED",X"F5",X"E0",X"D1",X"CD",X"FD",X"FF",X"B5",X"FD",X"2E",X"ED",X"DF",X"C9",X"FB",X"BD", + X"FD",X"E9",X"AD",X"FD",X"E9",X"89",X"FD",X"E9",X"B5",X"FD",X"DD",X"B7",X"E0",X"40",X"E8",X"99", + X"7D",X"22",X"A9",X"7D",X"22",X"9C",X"7D",X"22",X"B5",X"FD",X"CD",X"91",X"FD",X"02",X"93",X"FD", + X"74",X"E8",X"E9",X"FD",X"DC",X"FD",X"3F",X"D9",X"C9",X"FD",X"FD",X"DD",X"FC",X"F9",X"FD",X"F8", + X"CD",X"ED",X"ED",X"CD",X"FD",X"E9",X"C9",X"D8",X"CD",X"C9",X"C8",X"FC",X"FD",X"DC",X"C9",X"EC", + X"CD",X"F5",X"82",X"BD",X"FD",X"FC",X"AD",X"FD",X"ED",X"89",X"FD",X"06",X"B5",X"FD",X"02",X"B7", + X"FD",X"1B",X"E8",X"9D",X"FD",X"26",X"8D",X"FD",X"36",X"BC",X"FD",X"ED",X"B5",X"FD",X"DD",X"B7", + X"82",X"13",X"E8",X"E9",X"FD",X"DC",X"FD",X"3F",X"D9",X"F8",X"FD",X"7F",X"DD",X"FD",X"F9",X"FD", + X"F8",X"CD",X"E9",X"F8",X"ED",X"7A",X"CD",X"FD",X"D8",X"CD",X"DC",X"F8",X"C9",X"67",X"FC",X"FD", + X"EC",X"CD",X"D1",X"DB",X"F5",X"F8",X"B5",X"FD",X"02",X"BD",X"FD",X"06",X"AD",X"FD",X"06",X"89", + X"FD",X"06",X"B7",X"FD",X"EB",X"C8",X"BD",X"FD",X"E5",X"AD",X"FD",X"E5",X"89",X"FD",X"E5",X"91", + X"FD",X"02",X"93",X"FD",X"EF",X"C8",X"E9",X"FD",X"DC",X"FD",X"3F",X"D9",X"E8",X"FD",X"FD",X"DD", + X"DD",X"F9",X"FD",X"F8",X"FD",X"BD",X"FD",X"F7",X"BF",X"37",X"85",X"C8",X"FD",X"FD",X"9D",X"FD", + X"D9",X"9F",X"C9",X"85",X"C8",X"3F",X"D9",X"CD",X"FD",X"C9",X"DD",X"C9",X"F9",X"DD",X"F8",X"FD", + X"F5",X"CD",X"B5",X"FD",X"02",X"B7",X"FD",X"B3",X"C8",X"3F",X"FD",X"FF",X"DD",X"DD",X"F9",X"DD", + X"F8",X"CD",X"D9",X"F8",X"F5",X"CC",X"BD",X"FD",X"F5",X"B5",X"FD",X"02",X"B7",X"FD",X"69",X"C8", + X"9D",X"FD",X"DD",X"F5",X"D9",X"9F",X"D9",X"69",X"C8",X"F5",X"E4",X"DD",X"DD",X"FD",X"3F",X"BD", + X"FD",X"36",X"B5",X"FD",X"02",X"B7",X"FD",X"40",X"C8",X"9D",X"FD",X"02",X"F5",X"02",X"9F",X"FD", + X"40",X"C8",X"3F",X"D9",X"E8",X"F8",X"ED",X"D1",X"F9",X"F9",X"FD",X"DD",X"DD",X"FD",X"CF",X"F5", + X"E5",X"B5",X"FD",X"02",X"BD",X"FD",X"37",X"99",X"7D",X"02",X"B7",X"FD",X"1D",X"C8",X"91",X"FD", + X"02",X"93",X"FD",X"46",X"C8",X"3F",X"D9",X"C8",X"F8",X"CD",X"D1",X"F9",X"F5",X"E9",X"FD",X"3D", + X"DD",X"DD",X"F9",X"FD",X"B5",X"FD",X"02",X"B7",X"FD",X"2F",X"C8",X"B5",X"FD",X"DD",X"99",X"FD", + X"02",X"BD",X"FD",X"E9",X"B7",X"E9",X"1A",X"C8",X"91",X"FD",X"02",X"93",X"FD",X"24",X"C8",X"3F", + X"FD",X"BF",X"DD",X"ED",X"F9",X"FD",X"D9",X"D8",X"F8",X"F9",X"BD",X"FD",X"ED",X"99",X"7D",X"02", + X"BF",X"77",X"F8",X"F5",X"3F",X"FD",X"80",X"DD",X"FD",X"F9",X"FD",X"D9",X"C8",X"F8",X"FD",X"B8", + X"FD",X"DD",X"BA",X"C8",X"C0",X"F5",X"3F",X"E9",X"F8",X"D8",X"FD",X"DF",X"9D",X"F5",X"C1",X"EC", + X"E5",X"FD",X"65",X"FB",X"ED",X"A7",X"FD",X"F3",X"F5",X"81",X"FD",X"02",X"83",X"FD",X"F3",X"F5", + X"3F",X"BB",X"A4",X"BF",X"9F",X"BF",X"BF",X"BB",X"36",X"BF",X"9F",X"BF",X"BF",X"BB",X"47",X"BF", + X"9F",X"BF",X"BF",X"FB",X"2D",X"9F",X"FB",X"BF",X"BF",X"FF",X"73",X"9F",X"BB",X"BF",X"BF",X"BA", + X"2D",X"9F",X"B3",X"BF",X"BF",X"CD",X"DD",X"D8",X"FD",X"E9",X"DD",X"ED",X"7D",X"D5",X"F8",X"95", + X"FD",X"02",X"AD",X"FD",X"03",X"A9",X"7D",X"FD",X"98",X"FD",X"DD",X"97",X"FD",X"8A",X"F5",X"E9", + X"DD",X"ED",X"7F",X"95",X"FD",X"DD",X"AD",X"FD",X"03",X"A9",X"7D",X"FD",X"98",X"FD",X"DD",X"97", + X"F8",X"59",X"F5",X"E9",X"DD",X"ED",X"3D",X"95",X"FD",X"02",X"AD",X"FD",X"03",X"A9",X"7D",X"FD", + X"98",X"FD",X"DD",X"97",X"FD",X"41",X"F5",X"3F",X"E9",X"CD",X"ED",X"D9",X"CD",X"CD",X"D8",X"CD", + X"D5",X"C9",X"95",X"FD",X"02",X"A9",X"7D",X"FD",X"AD",X"7D",X"ED",X"8D",X"7D",X"02",X"97",X"FD", + X"73",X"F5",X"D8",X"ED",X"95",X"FD",X"DD",X"A9",X"7D",X"02",X"AD",X"FD",X"7A",X"97",X"FC",X"2D", + X"F5",X"3F",X"DC",X"EC",X"EC",X"F9",X"C9",X"3D",X"FC",X"FD",X"F1",X"F3",X"B1",X"FD",X"02",X"89", + X"FD",X"ED",X"BC",X"F5",X"FD",X"B3",X"FD",X"24",X"F5",X"B1",X"FD",X"DD",X"89",X"3D",X"02",X"BC", + X"FD",X"02",X"B3",X"F3",X"1E",X"F5",X"3F",X"FC",X"FD",X"EC",X"CD",X"F1",X"CD",X"C9",X"E0",X"C5", + X"F8",X"DC",X"C8",X"89",X"FD",X"32",X"9C",X"FD",X"02",X"85",X"FD",X"02",X"87",X"FD",X"D9",X"D5", + X"B1",X"FD",X"02",X"89",X"FD",X"BF",X"B3",X"FD",X"02",X"F5",X"3F",X"C9",X"7D",X"FC",X"DD",X"DC", + X"CD",X"EC",X"FD",X"F1",X"CD",X"89",X"BD",X"FD",X"B1",X"FD",X"02",X"B3",X"FD",X"CF",X"D5",X"FC", + X"FC",X"C9",X"7D",X"89",X"FD",X"F9",X"BC",X"3D",X"02",X"B1",X"FD",X"DD",X"B3",X"F4",X"D3",X"D5", + X"3F",X"D9",X"FD",X"3F",X"4D",X"8F",X"91",X"97",X"97",X"1A",X"9E",X"9F",X"F3",X"D3",X"10",X"ED", + X"91",X"59",X"65",X"10",X"F7",X"C0",X"72",X"4A",X"2D",X"72",X"FB",X"2D",X"6E",X"72",X"CB",X"2D", + X"72",X"75",X"34",X"72",X"65",X"0D",X"98",X"44",X"5C",X"61",X"9F",X"5C",X"63",X"DB",X"00",X"FB", + X"9F",X"5D",X"97",X"0E",X"97",X"5C",X"F0",X"96",X"97",X"CF",X"A2",X"8F",X"3A",X"99",X"5C",X"9C", + X"FF",X"97",X"26",X"97",X"8F",X"98",X"B9",X"5C",X"9C",X"FF",X"97",X"14",X"97",X"8F",X"25",X"B9", + X"5C",X"9C",X"FF",X"FB",X"BE",X"8F",X"41",X"F9",X"E3",X"BF",X"8A",X"B7",X"00",X"8B",X"1D",X"B4", + X"D6",X"F3",X"BF",X"96",X"F5",X"D4",X"19",X"E0",X"B3",X"8A",X"79",X"25",X"1D",X"15",X"01",X"29", + X"09",X"10",X"24",X"1D",X"11",X"10",X"8A",X"8A",X"25",X"05",X"10",X"1D",X"30",X"05",X"25",X"77", + X"24",X"05",X"10",X"24",X"6B",X"8A",X"AA",X"24",X"09",X"77",X"05",X"3C",X"05",X"11",X"04",X"24", + X"05",X"77",X"24",X"05",X"10",X"24",X"6B",X"8A",X"8A",X"8A",X"51",X"6A",X"77",X"56",X"77",X"77", + X"11",X"04",X"30",X"30",X"05",X"29",X"24",X"77",X"10",X"05",X"24",X"24",X"1D",X"29",X"01",X"10", + X"8A",X"AA",X"6A",X"77",X"72",X"77",X"77",X"10",X"24",X"15",X"24",X"1D",X"11",X"77",X"30",X"15", + X"0D",X"8A",X"AA",X"6A",X"77",X"52",X"77",X"77",X"05",X"34",X"30",X"09",X"0D",X"10",X"8A",X"AA", + X"6A",X"77",X"66",X"77",X"77",X"11",X"09",X"29",X"20",X"05",X"30",X"01",X"05",X"29",X"11",X"05", + X"8A",X"AA",X"6A",X"77",X"46",X"77",X"77",X"2D",X"05",X"20",X"05",X"2D",X"10",X"8A",X"AA",X"6A", + X"77",X"62",X"77",X"77",X"10",X"09",X"04",X"29",X"25",X"10",X"8A",X"AA",X"6A",X"77",X"42",X"77", + X"77",X"31",X"04",X"24",X"24",X"09",X"29",X"10",X"8A",X"AA",X"6A",X"77",X"7E",X"77",X"77",X"05", + X"3C",X"1D",X"24",X"8A",X"8A",X"DF",X"8A",X"A4",X"4B",X"AF",X"8B",X"FB",X"BE",X"8F",X"41",X"F9", + X"B6",X"F6",X"A3",X"3D",X"B5",X"A2",X"BF",X"B5",X"D4",X"F5",X"18",X"D9",X"AE",X"49",X"18",X"D0", + X"AF",X"D3",X"FF",X"8B",X"A4",X"60",X"9E",X"AF",X"DF",X"FB",X"9F",X"8F",X"25",X"F9",X"53",X"B3", + X"E3",X"FF",X"5D",X"FB",X"A5",X"5C",X"64",X"BB",X"1D",X"A2",X"BD",X"B5",X"18",X"C1",X"AF",X"31", + X"A4",X"60",X"9F",X"38",X"48",X"B3",X"60",X"BB",X"38",X"A2",X"F7",X"60",X"9B",X"38",X"DE",X"D7", + X"60",X"FF",X"38",X"77",X"D7",X"60",X"DF",X"38",X"6A",X"D7",X"60",X"FB",X"38",X"D3",X"D3",X"60", + X"DB",X"38",X"FF",X"B6",X"60",X"BE",X"AE",X"60",X"5C",X"62",X"B3",X"19",X"85",X"97",X"45",X"5D", + X"97",X"71",X"B3",X"8F",X"DB",X"BD",X"5C",X"99",X"FF",X"A2",X"BD",X"B5",X"A3",X"3D",X"B5",X"18", + X"C1",X"AF",X"61",X"1D",X"05",X"1C",X"8A",X"5D",X"24",X"1D",X"3C",X"05",X"77",X"09",X"24",X"8A", + X"55",X"77",X"3D",X"11",X"29",X"04",X"34",X"8A",X"5D",X"77",X"24",X"1D",X"3D",X"8A",X"8A",X"5D", + X"53",X"5C",X"FC",X"BB",X"E2",X"9E",X"5C",X"23",X"BB",X"5C",X"00",X"DF",X"97",X"4F",X"93",X"8F", + X"6B",X"B9",X"5C",X"9C",X"FF",X"97",X"71",X"B3",X"8F",X"DB",X"BD",X"5C",X"99",X"FF",X"97",X"63", + X"93",X"8F",X"37",X"99",X"5C",X"99",X"FF",X"97",X"3D",X"93",X"8F",X"A5",X"B9",X"5C",X"9C",X"FF", + X"97",X"75",X"93",X"8F",X"23",X"B9",X"5C",X"9C",X"FF",X"97",X"20",X"93",X"8F",X"47",X"B9",X"5C", + X"9C",X"FF",X"A2",X"BD",X"B5",X"69",X"3F",X"8F",X"7C",X"B9",X"97",X"B6",X"F7",X"AE",X"9B",X"97", + X"8E",X"F7",X"5C",X"9C",X"FF",X"A3",X"3D",X"B5",X"A2",X"3F",X"B5",X"69",X"C2",X"D8",X"8F",X"B5", + X"99",X"FB",X"FB",X"DA",X"97",X"FA",X"F7",X"A7",X"9B",X"97",X"93",X"F7",X"4D",X"5C",X"9C",X"FF", + X"0D",X"8B",X"B7",X"48",X"84",X"69",X"9B",X"68",X"9B",X"79",X"83",X"A3",X"27",X"B9",X"84",X"69", + X"F6",X"68",X"F6",X"DA",X"DA",X"D8",X"79",X"87",X"A3",X"33",X"BD",X"FE",X"9D",X"8F",X"83",X"B9", + X"E3",X"90",X"8F",X"93",X"B9",X"97",X"2D",X"40",X"E2",X"D4",X"5C",X"C7",X"FF",X"E2",X"BE",X"17", + X"AE",X"FB",X"D9",X"E2",X"F4",X"5C",X"C7",X"FF",X"E3",X"F0",X"A2",X"BD",X"B5",X"18",X"C1",X"AF", + X"17",X"1D",X"19",X"85",X"97",X"8A",X"79",X"11",X"09",X"29",X"21",X"1D",X"01",X"04",X"30",X"15", + X"24",X"1D",X"09",X"29",X"8A",X"8A",X"8A",X"61",X"56",X"72",X"52",X"66",X"46",X"62",X"8A",X"8A", + X"8A",X"5D",X"2D",X"1D",X"20",X"05",X"10",X"77",X"34",X"05",X"30",X"77",X"11",X"30",X"05",X"25", + X"1D",X"24",X"8A",X"8A",X"25",X"1D",X"21",X"21",X"1D",X"11",X"04",X"2D",X"24",X"1C",X"77",X"2D", + X"05",X"20",X"05",X"2D",X"8A",X"AA",X"05",X"15",X"10",X"1C",X"77",X"77",X"77",X"77",X"77",X"77", + X"77",X"77",X"77",X"77",X"3D",X"15",X"30",X"25",X"8A",X"8A",X"15",X"24",X"24",X"30",X"15",X"11", + X"24",X"77",X"0D",X"09",X"25",X"05",X"77",X"10",X"09",X"04",X"29",X"25",X"8A",X"8A",X"09",X"29", + X"77",X"8A",X"8A",X"09",X"21",X"21",X"8A",X"8A",X"8A",X"65",X"77",X"24",X"15",X"31",X"2D",X"05", + X"77",X"0D",X"09",X"25",X"05",X"2D",X"77",X"8A",X"8A",X"8A",X"65",X"04",X"34",X"30",X"1D",X"01", + X"3D",X"24",X"77",X"0D",X"09",X"25",X"05",X"2D",X"8A",X"8A",X"5D",X"97",X"4B",X"F7",X"5C",X"F0", + X"96",X"8F",X"BF",X"BD",X"97",X"27",X"FC",X"5C",X"48",X"F7",X"8F",X"BF",X"FD",X"93",X"5C",X"48", + X"F7",X"8F",X"BF",X"FC",X"93",X"5C",X"48",X"F7",X"9F",X"27",X"FC",X"E2",X"9B",X"8F",X"A5",X"99", + X"97",X"43",X"F7",X"45",X"4D",X"5C",X"9C",X"FF",X"55",X"97",X"55",X"F7",X"BA",X"69",X"DA",X"AE", + X"9B",X"97",X"29",X"F7",X"5C",X"9C",X"FF",X"97",X"BD",X"40",X"96",X"15",X"5C",X"9C",X"FF",X"55", + X"97",X"55",X"F7",X"BA",X"69",X"25",X"AE",X"9B",X"97",X"29",X"F7",X"5C",X"9C",X"FF",X"15",X"0D", + X"8B",X"8B",X"05",X"9B",X"C6",X"AF",X"7C",X"97",X"71",X"B3",X"8F",X"DB",X"BD",X"5C",X"99",X"FF", + X"5C",X"62",X"B3",X"1D",X"19",X"85",X"97",X"8A",X"79",X"10",X"24",X"15",X"24",X"1D",X"11",X"77", + X"30",X"15",X"0D",X"8A",X"5D",X"8A",X"8A",X"66",X"19",X"77",X"8A",X"8A",X"66",X"29",X"77",X"8A", + X"8A",X"66",X"2D",X"77",X"8A",X"8A",X"66",X"34",X"77",X"8A",X"8A",X"66",X"0D",X"77",X"8A",X"8A", + X"66",X"30",X"77",X"8A",X"8A",X"8A",X"65",X"09",X"19",X"77",X"77",X"77",X"77",X"77",X"8A",X"5D", + X"8A",X"8A",X"8A",X"71",X"29",X"09",X"24",X"77",X"09",X"19",X"77",X"8A",X"5D",X"8A",X"8A",X"53", + X"9F",X"FF",X"BF",X"4D",X"5D",X"45",X"F8",X"C1",X"6A",X"08",X"63",X"C1",X"08",X"85",X"05",X"8B", + X"B7",X"01",X"1D",X"DE",X"AF",X"68",X"0D",X"C6",X"60",X"60",X"AF",X"6D",X"1C",X"5D",X"97",X"B5", + X"D7",X"5C",X"F0",X"96",X"8F",X"BF",X"AF",X"9F",X"D2",X"60",X"5C",X"CC",X"D7",X"45",X"8F",X"BF", + X"BF",X"9F",X"AF",X"BF",X"5C",X"CC",X"D7",X"9F",X"60",X"C2",X"97",X"8D",X"D7",X"8F",X"37",X"B9", + X"5C",X"E1",X"D7",X"9F",X"40",X"C2",X"97",X"E9",X"D7",X"8F",X"13",X"B9",X"05",X"5C",X"E1",X"D7", + X"97",X"71",X"B3",X"8F",X"DB",X"BD",X"5C",X"99",X"FF",X"5C",X"62",X"B3",X"1D",X"19",X"85",X"97", + X"8A",X"79",X"05",X"34",X"30",X"09",X"0D",X"77",X"11",X"3D",X"05",X"11",X"19",X"8A",X"5D",X"8A", + X"8A",X"04",X"72",X"77",X"8A",X"8A",X"8A",X"5D",X"04",X"52",X"77",X"8A",X"8A",X"53",X"7B",X"8B", + X"B7",X"64",X"DE",X"AF",X"04",X"1C",X"45",X"5C",X"9C",X"FF",X"BA",X"1D",X"97",X"55",X"F7",X"26", + X"AE",X"FF",X"97",X"29",X"F7",X"A4",X"45",X"5C",X"9C",X"FF",X"E2",X"9F",X"A3",X"BF",X"FC",X"05", + X"5C",X"0C",X"9B",X"1C",X"5D",X"5C",X"00",X"DF",X"E2",X"9E",X"5C",X"23",X"BB",X"E2",X"D2",X"5C", + X"4E",X"BB",X"FB",X"F2",X"5C",X"9E",X"9B",X"5C",X"62",X"B3",X"1D",X"19",X"85",X"97",X"5D",X"53", + X"A3",X"FB",X"FC",X"97",X"6A",X"FC",X"8F",X"4E",X"FC",X"E6",X"B3",X"C1",X"55",X"4D",X"97",X"4F", + X"F3",X"5C",X"F0",X"96",X"97",X"CF",X"A2",X"8F",X"3A",X"99",X"5C",X"9C",X"FF",X"97",X"67",X"F3", + X"8F",X"98",X"B9",X"5C",X"9C",X"FF",X"97",X"75",X"F3",X"8F",X"55",X"B9",X"5C",X"9C",X"FF",X"97", + X"60",X"F3",X"8F",X"DF",X"BD",X"5C",X"99",X"FF",X"0D",X"15",X"B2",X"4D",X"8F",X"57",X"9D",X"5C", + X"4B",X"9B",X"0D",X"FB",X"A5",X"5C",X"64",X"BB",X"A3",X"3D",X"B5",X"A2",X"BD",X"B5",X"18",X"C1", + X"AE",X"EE",X"A2",X"BF",X"B5",X"18",X"D9",X"AE",X"FB",X"18",X"D0",X"AE",X"B7",X"B6",X"0C",X"E7", + X"B2",X"79",X"9F",X"CB",X"60",X"AF",X"AF",X"BB",X"53",X"C1",X"B3",X"B6",X"5C",X"C7",X"B2",X"71", + X"9F",X"CB",X"60",X"16",X"AF",X"DF",X"E2",X"93",X"C1",X"E2",X"96",X"B3",X"B6",X"66",X"B2",X"A3", + X"DB",X"DC",X"E0",X"A3",X"FB",X"DC",X"4B",X"38",X"0F",X"F3",X"60",X"9F",X"AE",X"B6",X"C6",X"D9", + X"A2",X"3F",X"B5",X"69",X"F6",X"68",X"F6",X"DA",X"DA",X"E6",X"D8",X"E2",X"9F",X"1F",X"B7",X"44", + X"60",X"B7",X"A6",X"BB",X"E2",X"DA",X"A3",X"BE",X"DC",X"53",X"A3",X"2F",X"F8",X"A3",X"76",X"FC", + X"A3",X"B7",X"FC",X"E6",X"A3",X"FF",X"DC",X"A3",X"BD",X"FC",X"A3",X"82",X"FC",X"55",X"4D",X"5C", + X"56",X"EF",X"5C",X"00",X"DF",X"97",X"71",X"B3",X"8F",X"DB",X"BD",X"5C",X"99",X"FF",X"97",X"0D", + X"F3",X"8F",X"CF",X"BD",X"5C",X"99",X"FF",X"A3",X"3D",X"B5",X"A2",X"BD",X"B5",X"18",X"C1",X"AE", + X"9A",X"A2",X"BF",X"B5",X"CA",X"69",X"DA",X"AE",X"68",X"5C",X"C0",X"8A",X"0D",X"15",X"19",X"66", + X"D7",X"1D",X"19",X"85",X"97",X"8A",X"79",X"2D",X"05",X"20",X"05",X"2D",X"77",X"11",X"3D",X"05", + X"11",X"19",X"8A",X"8A",X"2D",X"05",X"20",X"05",X"2D",X"77",X"29",X"04",X"0D",X"31",X"05",X"30", + X"6B",X"8A",X"AA",X"24",X"09",X"77",X"10",X"05",X"24",X"04",X"34",X"77",X"2D",X"05",X"20",X"05", + X"2D",X"6B",X"8A",X"8A",X"8A",X"51",X"2D",X"05",X"20",X"05",X"2D",X"77",X"29",X"09",X"7A",X"8A", + X"8A",X"8A",X"5D",X"1C",X"15",X"2D",X"34",X"77",X"09",X"24",X"8A",X"65",X"77",X"19",X"11",X"1D", + X"24",X"10",X"1C",X"09",X"39",X"8A",X"5D",X"77",X"05",X"20",X"09",X"0D",X"8A",X"8A",X"8A",X"59", + X"24",X"1D",X"3C",X"05",X"77",X"09",X"24",X"77",X"76",X"77",X"2D",X"05",X"20",X"05",X"2D",X"77", + X"34",X"04",X"24",X"05",X"10",X"8A",X"8A",X"5D",X"5C",X"63",X"DB",X"97",X"6A",X"FC",X"8F",X"4E", + X"FC",X"53",X"A3",X"FB",X"FC",X"E6",X"B3",X"C1",X"55",X"4D",X"97",X"0A",X"D3",X"5C",X"F0",X"96", + X"97",X"CF",X"A2",X"8F",X"3A",X"99",X"5C",X"9C",X"FF",X"97",X"22",X"D3",X"8F",X"98",X"B9",X"5C", + X"9C",X"FF",X"97",X"74",X"D3",X"8F",X"55",X"B9",X"5C",X"9C",X"FF",X"97",X"0C",X"D3",X"8F",X"9B", + X"BD",X"5C",X"99",X"FF",X"0D",X"15",X"B2",X"4D",X"8F",X"57",X"9D",X"5C",X"4B",X"9B",X"0D",X"FB", + X"A5",X"5C",X"64",X"BB",X"A3",X"3D",X"B5",X"A2",X"BD",X"B5",X"18",X"C1",X"AE",X"EE",X"A2",X"BF", + X"B5",X"18",X"D9",X"AE",X"FB",X"18",X"D0",X"AE",X"B7",X"B6",X"0C",X"E7",X"B2",X"79",X"9F",X"CB", + X"60",X"EF",X"AF",X"BB",X"53",X"C1",X"B3",X"B6",X"5C",X"C7",X"B2",X"71",X"9F",X"CB",X"60",X"16", + X"AF",X"DF",X"E2",X"D3",X"C1",X"E2",X"8B",X"B3",X"B6",X"66",X"E0",X"4B",X"AE",X"FB",X"C6",X"5C", + X"A6",X"BA",X"B6",X"23",X"5C",X"63",X"DB",X"1D",X"19",X"85",X"97",X"8A",X"79",X"10",X"09",X"04", + X"29",X"25",X"77",X"11",X"3D",X"05",X"11",X"19",X"8A",X"8A",X"10",X"09",X"04",X"29",X"25",X"77", + X"29",X"04",X"0D",X"31",X"05",X"30",X"6B",X"8A",X"AA",X"24",X"09",X"77",X"05",X"3C",X"05",X"11", + X"04",X"24",X"05",X"77",X"10",X"09",X"04",X"29",X"25",X"6B",X"8A",X"8A",X"8A",X"51",X"10",X"09", + X"04",X"29",X"25",X"77",X"29",X"09",X"7A",X"8A",X"8A",X"8A",X"59",X"24",X"1D",X"3C",X"05",X"77", + X"09",X"24",X"77",X"76",X"77",X"25",X"29",X"04",X"09",X"10",X"77",X"05",X"24",X"04",X"11",X"05", + X"3C",X"05",X"8A",X"8A",X"5D",X"97",X"3A",X"B6",X"5C",X"F0",X"96",X"97",X"32",X"B6",X"8F",X"B8", + X"99",X"5C",X"9C",X"FF",X"97",X"4D",X"B6",X"8F",X"B5",X"99",X"5C",X"9C",X"FF",X"97",X"FA",X"96", + X"8F",X"B7",X"9D",X"5C",X"9C",X"FF",X"97",X"71",X"B3",X"8F",X"DB",X"BD",X"5C",X"99",X"FF",X"53", + X"A3",X"B0",X"B5",X"FB",X"FF",X"97",X"7B",X"B6",X"8F",X"F1",X"B5",X"B2",X"C1",X"93",X"8B",X"B7", + X"20",X"A2",X"BD",X"B5",X"D0",X"CA",X"69",X"DA",X"D8",X"A2",X"BF",X"B5",X"D1",X"CA",X"69",X"DA", + X"D9",X"18",X"A8",X"AF",X"BB",X"18",X"2D",X"18",X"A0",X"AF",X"BB",X"18",X"0D",X"A4",X"07",X"E2", + X"BA",X"AF",X"9F",X"53",X"A3",X"B0",X"B5",X"A3",X"3D",X"B5",X"A4",X"8F",X"B5",X"D9",X"5C",X"BD", + X"96",X"84",X"8F",X"B7",X"DD",X"5C",X"BD",X"96",X"A2",X"BD",X"B5",X"18",X"C1",X"AF",X"39",X"5C", + X"63",X"DB",X"1D",X"19",X"85",X"97",X"BB",X"9F",X"BF",X"BF",X"8A",X"79",X"31",X"04",X"24",X"24", + X"09",X"29",X"77",X"11",X"3D",X"05",X"11",X"19",X"8A",X"8A",X"8A",X"5D",X"77",X"77",X"77",X"25", + X"05",X"34",X"30",X"05",X"10",X"10",X"05",X"25",X"77",X"31",X"04",X"24",X"24",X"09",X"29",X"10", + X"8A",X"AA",X"77",X"77",X"77",X"15",X"30",X"05",X"77",X"3D",X"1D",X"01",X"3D",X"2D",X"1D",X"01", + X"3D",X"24",X"05",X"25",X"6B",X"8A",X"AA",X"8A",X"AA",X"8A",X"71",X"34",X"2D",X"15",X"1C",X"05", + X"30",X"77",X"56",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"34",X"2D",X"15",X"1C",X"05", + X"30",X"77",X"72",X"8A",X"8A",X"8A",X"69",X"04",X"34",X"8A",X"AA",X"8A",X"AA",X"2D",X"05",X"21", + X"24",X"8A",X"AA",X"8A",X"AA",X"30",X"1D",X"01",X"3D",X"24",X"8A",X"AA",X"8A",X"AA",X"25",X"09", + X"00",X"29",X"8A",X"AA",X"8A",X"AA",X"11",X"09",X"1D",X"29",X"1D",X"29",X"8A",X"8A",X"8A",X"69", + X"77",X"77",X"77",X"77",X"04",X"34",X"8A",X"AA",X"8A",X"AA",X"77",X"77",X"2D",X"05",X"21",X"24", + X"8A",X"AA",X"8A",X"AA",X"77",X"30",X"1D",X"01",X"3D",X"24",X"8A",X"AA",X"8A",X"AA",X"77",X"77", + X"25",X"09",X"00",X"29",X"8A",X"AA",X"8A",X"AA",X"77",X"34",X"04",X"29",X"11",X"3D",X"8A",X"8A", + X"5D",X"FB",X"DF",X"DA",X"45",X"5D",X"E2",X"FA",X"A7",X"BB",X"E2",X"BE",X"97",X"2D",X"40",X"FB", + X"FB",X"5C",X"C7",X"FF",X"97",X"39",X"BF",X"96",X"1D",X"05",X"B7",X"49",X"1D",X"1C",X"53",X"55", + X"A3",X"B7",X"FC",X"5C",X"FC",X"BB",X"5C",X"00",X"DF",X"15",X"8F",X"7B",X"B9",X"5C",X"9C",X"FF", + X"1C",X"FA",X"BA",X"01",X"4C",X"BD",X"7A",X"F5",X"34",X"A3",X"6C",X"AB",X"6C",X"49",X"49",X"A1", + X"71",X"72",X"FC",X"2D",X"72",X"BB",X"75",X"8F",X"35",X"2A",X"B7",X"34",X"E1",X"13",X"E9",X"13", + X"F1",X"13",X"7F",X"CD",X"35",X"57",X"6E",X"2D",X"02",X"72",X"E3",X"2D",X"8F",X"35",X"19",X"FD", + X"97",X"A2",X"82",X"FC",X"A3",X"C6",X"FC",X"60",X"9F",X"AE",X"FF",X"E0",X"A3",X"2E",X"FC",X"A2", + X"99",X"FC",X"FB",X"DB",X"60",X"9F",X"AE",X"BA",X"10",X"ED",X"7A",X"A2",X"46",X"A0",X"37",X"01", + X"98",X"5F",X"53",X"00",X"8F",X"76",X"FC",X"C1",X"8B",X"B7",X"64",X"E6",X"A3",X"4B",X"FC",X"A3", + X"0E",X"FC",X"A2",X"99",X"FC",X"4B",X"AF",X"BA",X"FB",X"FB",X"8F",X"FB",X"DC",X"E3",X"9F",X"8B", + X"B7",X"00",X"8F",X"6B",X"FC",X"A2",X"FF",X"DC",X"60",X"9F",X"AE",X"BB",X"8B",X"8B",X"C7",X"5C", + X"56",X"EF",X"A3",X"3D",X"B5",X"A2",X"FD",X"FC",X"4B",X"AE",X"DF",X"E2",X"9F",X"5C",X"A6",X"9B", + X"5C",X"C0",X"8A",X"53",X"A3",X"FD",X"FC",X"A2",X"2F",X"F8",X"60",X"9F",X"AE",X"CA",X"53",X"5C", + X"D5",X"BB",X"A2",X"FF",X"DC",X"9F",X"9A",X"DC",X"8F",X"9E",X"DC",X"60",X"9F",X"AF",X"FB",X"9F", + X"BE",X"DC",X"8F",X"FB",X"DC",X"E0",X"E7",X"8B",X"E0",X"79",X"9F",X"CB",X"C1",X"A2",X"3F",X"B5", + X"69",X"F6",X"68",X"F6",X"DA",X"DA",X"E6",X"D1",X"BA",X"3B",X"BB",X"B6",X"23",X"5C",X"40",X"B2", + X"A2",X"E2",X"FC",X"60",X"9F",X"AF",X"12",X"5C",X"5C",X"E3",X"5C",X"47",X"92",X"A2",X"A2",X"FC", + X"4B",X"38",X"BB",X"82",X"53",X"A3",X"B7",X"FC",X"E6",X"A3",X"97",X"FC",X"A3",X"FF",X"DC",X"5C", + X"61",X"9F",X"53",X"5C",X"D5",X"BB",X"5C",X"CE",X"FB",X"97",X"75",X"B2",X"8F",X"CA",X"B9",X"5C", + X"9C",X"FF",X"8F",X"A2",X"FC",X"E0",X"4D",X"97",X"69",X"B2",X"8F",X"A5",X"B9",X"60",X"9F",X"AE", + X"FB",X"97",X"25",X"B2",X"8F",X"27",X"B9",X"5C",X"9C",X"FF",X"0D",X"A2",X"BD",X"B5",X"D9",X"18", + X"AC",X"FA",X"9F",X"AE",X"BA",X"E0",X"60",X"BB",X"A6",X"CF",X"18",X"A5",X"AF",X"8F",X"FE",X"E0", + X"17",X"CB",X"C1",X"84",X"A3",X"82",X"FC",X"A3",X"B3",X"FC",X"5C",X"63",X"DB",X"E2",X"9F",X"5C", + X"A6",X"BA",X"E2",X"BB",X"5C",X"A6",X"BA",X"E2",X"9F",X"A3",X"FD",X"FC",X"19",X"85",X"96",X"A3", + X"3D",X"B5",X"A2",X"9F",X"FC",X"E6",X"60",X"B7",X"A6",X"BB",X"E2",X"9F",X"A3",X"9F",X"FC",X"5C", + X"6D",X"FF",X"B6",X"0F",X"8A",X"5D",X"34",X"30",X"05",X"10",X"10",X"8A",X"AA",X"8A",X"AA",X"10", + X"24",X"15",X"30",X"24",X"8A",X"8A",X"56",X"77",X"34",X"2D",X"15",X"1C",X"05",X"30",X"8A",X"8A", + X"56",X"77",X"09",X"30",X"77",X"72",X"77",X"34",X"2D",X"15",X"1C",X"05",X"30",X"8A",X"8A",X"53", + X"5C",X"D5",X"BB",X"A3",X"2F",X"F8",X"8F",X"FF",X"DC",X"E6",X"62",X"97",X"6B",X"FC",X"AE",X"9B", + X"97",X"2E",X"FC",X"B2",X"4B",X"AE",X"BD",X"A2",X"C6",X"FC",X"60",X"BB",X"AE",X"DF",X"53",X"A3", + X"E2",X"FC",X"1C",X"E0",X"68",X"9B",X"C1",X"5C",X"61",X"9F",X"E2",X"9B",X"5C",X"A6",X"BA",X"45", + X"53",X"A3",X"E2",X"FC",X"4D",X"5C",X"D5",X"BB",X"97",X"72",X"92",X"8F",X"C8",X"B9",X"5C",X"9C", + X"FF",X"0D",X"E0",X"60",X"BB",X"E2",X"A3",X"AE",X"9F",X"C6",X"A3",X"37",X"9D",X"FB",X"67",X"5C", + X"9E",X"9B",X"05",X"5C",X"A6",X"9B",X"1C",X"4D",X"97",X"5B",X"92",X"8F",X"C8",X"B9",X"5C",X"9C", + X"FF",X"0D",X"E2",X"9F",X"62",X"E2",X"A3",X"39",X"88",X"92",X"C6",X"A3",X"37",X"9D",X"E2",X"BE", + X"5C",X"A6",X"BA",X"5C",X"A6",X"9B",X"A2",X"C6",X"FC",X"C6",X"A3",X"C6",X"FC",X"60",X"9F",X"AE", + X"2B",X"E2",X"9F",X"A3",X"E2",X"FC",X"1C",X"8A",X"71",X"01",X"15",X"0D",X"05",X"77",X"09",X"20", + X"05",X"30",X"8A",X"AA",X"34",X"2D",X"15",X"1C",X"05",X"30",X"77",X"77",X"8A",X"8A",X"8A",X"65", + X"01",X"05",X"24",X"77",X"30",X"05",X"15",X"25",X"1C",X"8A",X"AA",X"34",X"2D",X"15",X"1C",X"05", + X"30",X"77",X"77",X"8A",X"8A",X"53",X"5C",X"D5",X"BB",X"E6",X"A3",X"FF",X"DC",X"5C",X"61",X"9F", + X"A2",X"A2",X"FC",X"4B",X"AF",X"A2",X"97",X"F5",X"F6",X"8F",X"FA",X"99",X"5C",X"9C",X"FF",X"5C", + X"CE",X"FB",X"E2",X"AF",X"A3",X"17",X"FC",X"8F",X"B6",X"B9",X"5C",X"E3",X"86",X"FB",X"E6",X"E2", + X"DB",X"A3",X"9F",X"FC",X"5C",X"6D",X"FF",X"A2",X"A2",X"FC",X"4B",X"AF",X"93",X"5C",X"8F",X"9B", + X"B7",X"45",X"A2",X"17",X"FC",X"4B",X"AE",X"98",X"71",X"9F",X"CB",X"A3",X"17",X"FC",X"B6",X"51", + X"53",X"5C",X"D5",X"BB",X"5C",X"CE",X"FB",X"97",X"5E",X"F6",X"8F",X"A8",X"99",X"5C",X"9C",X"FF", + X"E2",X"D7",X"A3",X"17",X"FC",X"8F",X"B6",X"B9",X"5C",X"E3",X"86",X"FB",X"E6",X"E2",X"DB",X"A3", + X"9F",X"FC",X"5C",X"6D",X"FF",X"A2",X"BF",X"B5",X"18",X"D8",X"AE",X"D3",X"18",X"D1",X"AE",X"AF", + X"5C",X"8F",X"9B",X"B7",X"25",X"A2",X"17",X"FC",X"4B",X"AE",X"BE",X"71",X"9F",X"CB",X"A3",X"17", + X"FC",X"B6",X"31",X"53",X"A3",X"99",X"FC",X"5C",X"63",X"DB",X"E2",X"BA",X"5C",X"A6",X"BA",X"1C", + X"E2",X"9F",X"B6",X"25",X"8A",X"4D",X"1D",X"29",X"10",X"05",X"30",X"24",X"77",X"11",X"09",X"1D", + X"29",X"77",X"31",X"05",X"21",X"09",X"30",X"05",X"8A",X"AA",X"77",X"77",X"24",X"1D",X"0D",X"05", + X"77",X"1D",X"10",X"77",X"04",X"34",X"77",X"24",X"09",X"8A",X"AA",X"77",X"77",X"11",X"09",X"29", + X"24",X"1D",X"29",X"04",X"05",X"77",X"01",X"15",X"0D",X"05",X"6B",X"8A",X"8A",X"8A",X"71",X"77", + X"04",X"10",X"05",X"77",X"39",X"09",X"1C",X"10",X"24",X"1D",X"11",X"19",X"77",X"24",X"09",X"77", + X"10",X"05",X"2D",X"05",X"11",X"24",X"8A",X"AA",X"8A",X"AA",X"8A",X"55",X"10",X"24",X"15",X"30", + X"24",X"77",X"15",X"24",X"77",X"8A",X"7D",X"6E",X"77",X"77",X"77",X"6A",X"77",X"77",X"8A",X"55", + X"11",X"09",X"29",X"24",X"1D",X"29",X"04",X"05",X"8A",X"AA",X"2D",X"05",X"20",X"05",X"2D",X"77", + X"56",X"77",X"77",X"8A",X"7D",X"6E",X"77",X"77",X"77",X"6A",X"77",X"8A",X"55",X"2D",X"15",X"10", + X"24",X"77",X"01",X"15",X"0D",X"05",X"8A",X"8A",X"93",X"B2",X"4D",X"EB",X"BF",X"C8",X"69",X"3F", + X"AE",X"9F",X"CF",X"96",X"08",X"0D",X"19",X"29",X"D6",X"4D",X"8B",X"8B",X"E3",X"BF",X"0D",X"1C", + X"53",X"FA",X"ED",X"01",X"4C",X"B5",X"72",X"4A",X"09",X"8F",X"3C",X"2A",X"6E",X"59",X"58",X"53", + X"53",X"93",X"53",X"93",X"5F",X"CD",X"34",X"60",X"75",X"08",X"57",X"C3",X"29",X"5C",X"54",X"7D", + X"75",X"5C",X"8F",X"3C",X"00",X"18",X"E1",X"7D",X"31",X"EA",X"E0",X"4B",X"8A",X"39",X"50",X"D6", + X"A2",X"E6",X"D8",X"60",X"9B",X"31",X"87",X"F2",X"4D",X"8A",X"8A",X"E3",X"BF",X"5C",X"B9",X"AB", + X"0D",X"A2",X"BD",X"D8",X"4B",X"3D",X"8B",X"8B",X"C7",X"3D",X"A2",X"3F",X"F8",X"C1",X"8A",X"E3", + X"3F",X"8A",X"A2",X"E6",X"D8",X"60",X"BB",X"AE",X"CF",X"E3",X"8B",X"8A",X"E3",X"B5",X"8A",X"E3", + X"FE",X"8A",X"E3",X"DB",X"8A",X"E3",X"2D",X"8A",X"FB",X"AF",X"A2",X"B7",X"FC",X"4B",X"AF",X"BE", + X"4C",X"D0",X"18",X"D1",X"AE",X"BB",X"FB",X"68",X"A5",X"8A",X"E3",X"FB",X"B6",X"B0",X"A2",X"2B", + X"F8",X"E6",X"A3",X"2B",X"F8",X"60",X"9A",X"A6",X"9E",X"8B",X"E3",X"BF",X"8A",X"8A",X"8A",X"19", + X"CE",X"F2",X"E3",X"8B",X"8A",X"E3",X"43",X"8A",X"E3",X"B7",X"8A",X"E3",X"93",X"8A",X"A2",X"B7", + X"FC",X"4B",X"E2",X"AC",X"FA",X"9B",X"AF",X"AA",X"A2",X"2E",X"F8",X"D9",X"4C",X"D0",X"69",X"DB", + X"AF",X"9F",X"E6",X"18",X"D1",X"AE",X"BB",X"61",X"24",X"3F",X"60",X"9F",X"21",X"19",X"D6",X"E2", + X"DF",X"B6",X"FB",X"60",X"FB",X"A6",X"BB",X"E2",X"9F",X"D8",X"DB",X"DB",X"1F",X"DB",X"DB",X"DB", + X"79",X"25",X"C1",X"8A",X"E3",X"7B",X"8A",X"85",X"8A",X"E3",X"BF",X"9F",X"DB",X"BF",X"9E",X"F1", + X"8A",X"F0",X"B2",X"60",X"40",X"38",X"04",X"F6",X"60",X"60",X"38",X"2C",X"F6",X"60",X"44",X"4D", + X"93",X"B2",X"AE",X"9E",X"92",X"8B",X"8B",X"18",X"E1",X"38",X"FD",X"F2",X"B2",X"0D",X"8A",X"C1", + X"8A",X"8A",X"93",X"B2",X"45",X"7B",X"C1",X"8A",X"93",X"B2",X"7B",X"C1",X"8A",X"8A",X"05",X"7B", + X"60",X"AE",X"AE",X"8B",X"18",X"C0",X"AF",X"CF",X"C1",X"93",X"8B",X"8B",X"B2",X"7B",X"D9",X"93", + X"8B",X"B2",X"7B",X"D8",X"93",X"8B",X"8B",X"4D",X"8B",X"81",X"8B",X"A1",X"0D",X"5C",X"B9",X"AB", + X"1C",X"8A",X"8A",X"E3",X"BF",X"B6",X"61",X"8B",X"E7",X"8A",X"53",X"B6",X"10",X"8B",X"C7",X"8A", + X"E2",X"EF",X"B6",X"75",X"55",X"4D",X"E0",X"A3",X"E2",X"D8",X"A2",X"B7",X"FC",X"4B",X"AE",X"9E", + X"5C",X"76",X"82",X"A2",X"C3",X"FC",X"D8",X"B6",X"D8",X"A2",X"E6",X"D8",X"4B",X"AF",X"D9",X"5C", + X"D2",X"9F",X"A2",X"DE",X"FC",X"D8",X"E2",X"40",X"A3",X"DE",X"FC",X"84",X"CA",X"45",X"A2",X"61", + X"C7",X"C6",X"C6",X"D8",X"05",X"18",X"C1",X"AE",X"B3",X"D9",X"97",X"24",X"40",X"96",X"E0",X"97", + X"BE",X"BF",X"96",X"4B",X"A4",X"AF",X"FF",X"18",X"14",X"B6",X"D6",X"69",X"DA",X"AE",X"96",X"18", + X"15",X"D9",X"69",X"FB",X"AE",X"FB",X"18",X"D1",X"AE",X"FA",X"B6",X"FB",X"18",X"1C",X"18",X"BD", + X"AE",X"FB",X"18",X"1D",X"B6",X"BB",X"FA",X"3F",X"0D",X"4D",X"A2",X"E6",X"D8",X"4B",X"38",X"7D", + X"AF",X"97",X"20",X"40",X"96",X"F0",X"8B",X"F1",X"FB",X"DE",X"5C",X"7C",X"8F",X"4B",X"38",X"AC", + X"D2",X"FB",X"DE",X"5C",X"79",X"8F",X"4B",X"38",X"AC",X"D2",X"8B",X"8B",X"8B",X"8B",X"8B",X"FB", + X"FF",X"5C",X"7C",X"8F",X"4B",X"AE",X"F7",X"FB",X"FF",X"5C",X"79",X"8F",X"4B",X"AE",X"FE",X"E0", + X"60",X"3F",X"AE",X"DB",X"E2",X"9F",X"A3",X"2F",X"F8",X"B6",X"C4",X"A2",X"4A",X"F8",X"60",X"3E", + X"AF",X"E1",X"4D",X"A2",X"E6",X"D8",X"60",X"9F",X"AF",X"9A",X"9F",X"C5",X"BF",X"53",X"5C",X"CA", + X"DF",X"E2",X"FA",X"B6",X"B8",X"60",X"BB",X"AF",X"A7",X"A2",X"0B",X"F8",X"E6",X"A3",X"0B",X"F8", + X"60",X"BA",X"AF",X"B2",X"E2",X"D7",X"5C",X"A6",X"BA",X"A2",X"FF",X"DC",X"60",X"9F",X"9F",X"6B", + X"FC",X"AE",X"9B",X"9F",X"2E",X"FC",X"BA",X"E6",X"BB",X"5C",X"1F",X"DF",X"E2",X"B7",X"D9",X"FA", + X"BF",X"53",X"5C",X"CA",X"DF",X"E2",X"DE",X"B6",X"F3",X"9F",X"BF",X"BB",X"53",X"5C",X"CA",X"DF", + X"A2",X"DD",X"D8",X"68",X"9F",X"4B",X"A3",X"DD",X"D8",X"E2",X"FE",X"AE",X"BB",X"E2",X"96",X"5C", + X"A6",X"BA",X"5C",X"E6",X"EA",X"0D",X"FA",X"3D",X"07",X"C1",X"5C",X"31",X"EA",X"1D",X"1D",X"1D", + X"9F",X"00",X"40",X"9E",X"93",X"19",X"9B",X"F2",X"0D",X"4D",X"5C",X"74",X"8F",X"A2",X"E6",X"D8", + X"60",X"9F",X"38",X"5E",X"8F",X"0D",X"4D",X"E0",X"60",X"37",X"39",X"40",X"D2",X"84",X"60",X"37", + X"38",X"5E",X"8F",X"FB",X"DF",X"5C",X"E0",X"DB",X"8B",X"8B",X"E8",X"EB",X"DC",X"E0",X"E3",X"BF", + X"69",X"D2",X"C6",X"8B",X"F9",X"0D",X"4D",X"97",X"04",X"40",X"96",X"D1",X"E0",X"D0",X"DB",X"DB", + X"1B",X"4C",X"FD",X"D0",X"EB",X"BF",X"AC",X"8E",X"8E",X"A0",X"F3",X"40",X"96",X"97",X"9A",X"FD", + X"96",X"5D",X"4D",X"D0",X"DB",X"1B",X"F3",X"BF",X"D0",X"8F",X"88",X"EF",X"96",X"F9",X"F3",X"BF", + X"B4",X"8B",X"F8",X"0D",X"4D",X"A2",X"2D",X"DC",X"C1",X"8A",X"B7",X"64",X"55",X"97",X"2D",X"40", + X"96",X"15",X"96",X"99",X"DE",X"AF",X"05",X"0D",X"97",X"BF",X"64",X"96",X"08",X"8F",X"36",X"DC", + X"4D",X"E0",X"4B",X"AE",X"F3",X"8B",X"8B",X"E0",X"02",X"AF",X"DF",X"8B",X"E0",X"22",X"AE",X"DB", + X"0D",X"8B",X"8B",X"8B",X"8B",X"B6",X"0C",X"8A",X"8A",X"E3",X"40",X"0D",X"1D",X"0D",X"4D",X"97", + X"24",X"40",X"96",X"E0",X"4B",X"39",X"16",X"AF",X"8B",X"84",X"69",X"2F",X"60",X"2F",X"AF",X"CF", + X"F9",X"A2",X"2E",X"F8",X"37",X"60",X"40",X"AE",X"FB",X"60",X"9F",X"18",X"1D",X"AF",X"F7",X"8B", + X"F9",X"A2",X"0E",X"F8",X"37",X"18",X"C0",X"AE",X"BB",X"4C",X"FD",X"D9",X"A2",X"5F",X"F8",X"26", + X"31",X"5E",X"8F",X"FA",X"37",X"84",X"60",X"37",X"39",X"7D",X"AF",X"0D",X"4D",X"97",X"20",X"40", + X"96",X"F9",X"8A",X"E0",X"C6",X"D0",X"DB",X"1B",X"DB",X"1B",X"DB",X"F3",X"BF",X"D0",X"8F",X"B7", + X"DC",X"96",X"8B",X"E0",X"8B",X"4B",X"AE",X"9D",X"37",X"18",X"C0",X"AE",X"BB",X"4C",X"FD",X"60", + X"9E",X"A7",X"48",X"8A",X"F1",X"8A",X"E0",X"18",X"C0",X"AF",X"EA",X"4B",X"AE",X"8A",X"AB",X"F9", + X"D8",X"D4",X"55",X"C6",X"D0",X"DB",X"1B",X"F3",X"BF",X"D0",X"8F",X"A8",X"EF",X"96",X"E0",X"15", + X"3B",X"37",X"18",X"C0",X"AE",X"BB",X"4C",X"FD",X"60",X"FF",X"A7",X"DE",X"AA",X"F9",X"D8",X"18", + X"60",X"0D",X"4D",X"8B",X"8B",X"81",X"19",X"5E",X"8F",X"0D",X"4D",X"E0",X"D8",X"69",X"7B",X"60", + X"7B",X"AF",X"F7",X"A2",X"B7",X"FC",X"4B",X"AF",X"A2",X"4C",X"D0",X"69",X"C2",X"60",X"9B",X"A7", + X"A3",X"84",X"68",X"9F",X"D8",X"B6",X"EE",X"4C",X"D0",X"69",X"C2",X"60",X"AF",X"FA",X"7B",X"A6", + X"AB",X"FE",X"B6",X"D2",X"0D",X"4D",X"A2",X"E6",X"D8",X"4B",X"AF",X"FA",X"97",X"24",X"40",X"96", + X"E0",X"4B",X"AF",X"FB",X"84",X"60",X"3E",X"38",X"5E",X"8F",X"0D",X"4D",X"84",X"69",X"7B",X"60", + X"7B",X"AF",X"B8",X"97",X"24",X"40",X"96",X"E0",X"4B",X"39",X"5E",X"8F",X"8B",X"8B",X"E0",X"79", + X"BE",X"D9",X"8A",X"E0",X"18",X"9D",X"AF",X"FF",X"C6",X"38",X"B2",X"8F",X"C6",X"D0",X"DB",X"1B", + X"DB",X"F3",X"BF",X"D0",X"8F",X"B4",X"DC",X"96",X"E0",X"8B",X"4B",X"AE",X"DE",X"37",X"18",X"C0", + X"AE",X"BB",X"4C",X"FD",X"60",X"DB",X"A7",X"25",X"B6",X"81",X"A2",X"E6",X"D8",X"4B",X"AE",X"88", + X"4C",X"D0",X"69",X"C2",X"60",X"AF",X"FA",X"7F",X"A6",X"F7",X"FE",X"B6",X"97",X"0D",X"4D",X"97", + X"24",X"40",X"96",X"84",X"69",X"7B",X"60",X"7F",X"AF",X"95",X"E0",X"4B",X"AF",X"A2",X"0D",X"4D", + X"97",X"20",X"40",X"96",X"E0",X"79",X"BE",X"18",X"9D",X"AE",X"BB",X"71",X"B7",X"D9",X"8A",X"E0", + X"C6",X"D0",X"DB",X"1B",X"DB",X"F3",X"BF",X"D0",X"8F",X"A4",X"DC",X"96",X"E0",X"8B",X"4B",X"AE", + X"EE",X"37",X"18",X"C0",X"AE",X"BB",X"4C",X"FD",X"60",X"FF",X"A7",X"25",X"A2",X"E6",X"D8",X"4B", + X"AE",X"96",X"84",X"68",X"9F",X"D8",X"B6",X"D7",X"A2",X"E6",X"D8",X"4B",X"AF",X"DE",X"E0",X"60", + X"FF",X"FA",X"7B",X"AE",X"BE",X"60",X"EF",X"FA",X"5B",X"AE",X"BB",X"FA",X"3F",X"0D",X"84",X"A3", + X"C2",X"D8",X"A2",X"E2",X"D8",X"06",X"15",X"B2",X"38",X"44",X"D6",X"85",X"4D",X"A2",X"E6",X"D8", + X"DB",X"F3",X"BF",X"D0",X"8F",X"7E",X"AB",X"96",X"F0",X"8B",X"F1",X"84",X"5C",X"90",X"AB",X"DB", + X"EB",X"BF",X"C8",X"96",X"F0",X"8B",X"F1",X"5C",X"7F",X"AB",X"0D",X"8A",X"A1",X"8A",X"81",X"0D", + X"92",X"E2",X"44",X"19",X"09",X"D6",X"A2",X"2A",X"F8",X"33",X"B6",X"FF",X"A2",X"0E",X"F8",X"13", + X"18",X"C0",X"AE",X"BB",X"4C",X"FD",X"26",X"E2",X"BF",X"35",X"E6",X"1C",X"A2",X"B7",X"FC",X"4B", + X"3D",X"F8",X"8B",X"C7",X"3D",X"A2",X"3F",X"F8",X"D0",X"4C",X"D0",X"69",X"C2",X"60",X"B7",X"A7", + X"9F",X"F6",X"81",X"8A",X"A2",X"E6",X"D8",X"60",X"9F",X"AE",X"FB",X"60",X"BB",X"AE",X"A3",X"B6", + X"AB",X"A2",X"0E",X"F8",X"D9",X"A2",X"67",X"F8",X"97",X"BF",X"BF",X"FA",X"7F",X"26",X"A6",X"BB", + X"FE",X"F7",X"A2",X"2A",X"F8",X"D9",X"A2",X"47",X"F8",X"26",X"A7",X"9F",X"F6",X"80",X"2A",X"3D", + X"18",X"1C",X"1C",X"FA",X"2F",X"4C",X"D0",X"69",X"FE",X"3D",X"FA",X"37",X"4C",X"D0",X"69",X"FB", + X"3D",X"E0",X"69",X"9F",X"FA",X"7B",X"07",X"D8",X"4C",X"D0",X"69",X"DB",X"3D",X"84",X"68",X"9F", + X"D8",X"1C",X"4D",X"A2",X"C6",X"D8",X"DB",X"DB",X"D0",X"F3",X"BF",X"8F",X"7B",X"F8",X"96",X"15", + X"B2",X"C1",X"8B",X"92",X"B2",X"C1",X"8B",X"A5",X"8B",X"85",X"1C",X"5D",X"FB",X"9E",X"18",X"C1", + X"AF",X"B6",X"DF",X"18",X"C8",X"AF",X"F3",X"DF",X"DF",X"18",X"C9",X"AF",X"DE",X"DF",X"18",X"D0", + X"AF",X"BE",X"DF",X"18",X"D1",X"AE",X"9B",X"69",X"9B",X"D9",X"A4",X"1D",X"1C",X"18",X"D9",X"AF", + X"04",X"DF",X"B6",X"61",X"E2",X"40",X"22",X"3D",X"B6",X"60",X"40",X"40",X"72",X"AB",X"DE",X"8B", + X"AD",X"8B",X"62",X"8B",X"62",X"8B",X"62",X"8B",X"62",X"8B",X"62",X"8B",X"62",X"8B",X"07",X"AB", + X"39",X"AB",X"11",X"AB",X"50",X"AB",X"08",X"AB",X"41",X"AB",X"3A",X"AB",X"3A",X"AB",X"3A",X"3A", + X"AB",X"F9",X"BF",X"BB",X"BF",X"BF",X"B8",X"BF",X"BB",X"60",X"BF",X"F8",X"BF",X"BB",X"44",X"BF", + X"60",X"25",X"FD",X"BF",X"60",X"BF",X"BF",X"BC",X"BF",X"60",X"BB",X"BF",X"FC",X"BF",X"60",X"9B", + X"BF",X"60",X"25",X"B5",X"64",X"BF",X"BF",X"BF",X"FD",X"64",X"BF",X"BF",X"BF",X"60",X"45",X"B5", + X"FF",X"BF",X"BF",X"BF",X"FD",X"FF",X"BF",X"BF",X"BF",X"60",X"45",X"FD",X"BF",X"BF",X"BF",X"BF", + X"F9",X"BF",X"BF",X"BF",X"BF",X"60",X"45",X"F5",X"BF",X"BF",X"BF",X"BF",X"F9",X"BF",X"BF",X"BF", + X"BF",X"F1",X"BF",X"BF",X"BF",X"BF",X"FD",X"BF",X"BF",X"BF",X"BF",X"60",X"08",X"AF",X"8B",X"EE", + X"8B",X"A6",X"8B",X"FD",X"8B",X"B5",X"8B",X"3A",X"AB",X"3A",X"AB",X"3A",X"AB",X"3A",X"3A",X"AB", + X"FB",X"FF",X"FF",X"BF",X"BF",X"BA",X"FF",X"FF",X"BF",X"BF",X"60",X"45",X"FF",X"64",X"64",X"BF", + X"BF",X"BE",X"64",X"64",X"BF",X"BF",X"60",X"45",X"FB",X"64",X"FF",X"BF",X"BF",X"BA",X"64",X"FF", + X"BF",X"BF",X"60",X"45",X"FF",X"FF",X"64",X"BF",X"BF",X"BE",X"FF",X"64",X"BF",X"BF",X"60",X"45", + X"FE",X"BF",X"BF",X"BF",X"BF",X"FA",X"BF",X"BF",X"BF",X"BF",X"60",X"45",X"00",X"19",X"1A",X"CF", + X"81",X"8B",X"7F",X"8B",X"57",X"8B",X"6B",X"8B",X"43",X"8B",X"3A",X"AB",X"3A",X"AB",X"3A",X"AB", + X"3A",X"3A",X"AB",X"B3",X"BF",X"BB",X"BF",X"BE",X"F3",X"BF",X"BB",X"BF",X"9E",X"B2",X"BF",X"FF", + X"BF",X"BA",X"60",X"25",X"B7",X"BF",X"60",X"BF",X"BE",X"F7",X"BF",X"60",X"BF",X"DB",X"B6",X"BF", + X"64",X"BF",X"9E",X"60",X"25",X"B7",X"64",X"BF",X"BF",X"FB",X"F7",X"64",X"BF",X"BF",X"DB",X"B6", + X"64",X"BF",X"BF",X"BE",X"60",X"45",X"B7",X"FF",X"BF",X"BF",X"BE",X"F7",X"FF",X"BF",X"BF",X"DB", + X"B6",X"FF",X"BF",X"BF",X"FB",X"60",X"45",X"B7",X"BF",X"BF",X"BF",X"BE",X"60",X"20",X"31",X"8B", + X"2C",X"8B",X"60",X"8B",X"BA",X"EF",X"89",X"EF",X"3A",X"AB",X"F3",X"EF",X"CB",X"EF",X"F9",X"EF", + X"3A",X"AB",X"B0",X"BF",X"9B",X"BF",X"BF",X"F0",X"BF",X"9B",X"BF",X"BF",X"A9",X"BF",X"BB",X"BF", + X"BF",X"E9",X"BF",X"BB",X"BF",X"BF",X"60",X"08",X"B4",X"BF",X"44",X"BF",X"BF",X"F4",X"BF",X"44", + X"BF",X"BF",X"AD",X"BF",X"60",X"BF",X"BF",X"ED",X"BF",X"60",X"BF",X"BF",X"60",X"08",X"B4",X"64", + X"BF",X"BF",X"BF",X"AC",X"64",X"BF",X"BF",X"BF",X"60",X"45",X"B4",X"FF",X"BF",X"BF",X"BF",X"AC", + X"FF",X"BF",X"BF",X"BF",X"60",X"45",X"B4",X"BF",X"BF",X"BF",X"BF",X"EC",X"BF",X"BF",X"BF",X"BF", + X"A5",X"BF",X"BF",X"BF",X"BF",X"60",X"25",X"E5",X"64",X"BF",X"BF",X"BF",X"44",X"E5",X"20",X"BF", + X"BF",X"BF",X"44",X"E5",X"24",X"BF",X"BF",X"BF",X"44",X"E5",X"61",X"BF",X"BF",X"BF",X"44",X"E5", + X"65",X"BF",X"BF",X"BF",X"60",X"F2",X"A4",X"FF",X"BF",X"BF",X"BF",X"44",X"A4",X"FB",X"BF",X"BF", + X"BF",X"44",X"A4",X"BE",X"BF",X"BF",X"BF",X"44",X"A4",X"BA",X"BF",X"BF",X"BF",X"44",X"A4",X"FE", + X"BF",X"BF",X"BF",X"B4",X"BF",X"BF",X"BF",X"BF",X"60",X"20",X"BF",X"BB",X"BB",X"BF",X"BB",X"BB", + X"24",X"BB",X"FF",X"FF",X"9F",X"9F",X"64",X"9B",X"9B",X"BF",X"9B",X"BB",X"BF",X"BB",X"BB",X"BF", + X"9B",X"BB",X"BF",X"BB",X"BB",X"BF",X"9B",X"BB",X"BF",X"9B",X"BB",X"BF",X"9B",X"BB",X"BF",X"BB", + X"BB",X"64",X"FF",X"9B",X"BF",X"FF",X"BB",X"BF",X"FF",X"BB",X"BF",X"9B",X"BB",X"53",X"5C",X"D5", + X"BB",X"5C",X"D0",X"BB",X"FB",X"F2",X"5C",X"9E",X"9B",X"01",X"10",X"C8",X"41",X"DF",X"69",X"A8", + X"DD",X"F9",X"C0",X"83",X"DB",X"F5",X"26",X"F3",X"0D",X"A8",X"F3",X"72",X"A8",X"E6",X"DB",X"83", + X"E2",X"CD",X"DB",X"83",X"DF",X"26",X"C6",X"FB",X"F6",X"AC",X"0E",X"B4",X"00",X"A2",X"FF",X"DC", + X"60",X"9F",X"9F",X"BD",X"FC",X"97",X"0B",X"FC",X"8F",X"FB",X"DC",X"AE",X"9E",X"9F",X"9D",X"FC", + X"97",X"6F",X"FC",X"8F",X"9E",X"DC",X"B2",X"A3",X"4F",X"FC",X"BA",X"A3",X"B9",X"FC",X"4B",X"AF", + X"97",X"9F",X"CC",X"F8",X"A2",X"FF",X"DC",X"60",X"9F",X"AE",X"9B",X"9F",X"E5",X"F8",X"BA",X"A3", + X"2B",X"F8",X"E0",X"60",X"F7",X"AF",X"97",X"A2",X"B7",X"FC",X"4B",X"E0",X"AF",X"BA",X"A2",X"4F", + X"FC",X"E6",X"A3",X"4F",X"FC",X"E2",X"9F",X"C1",X"97",X"5C",X"CA",X"C6",X"DB",X"EB",X"BF",X"C8", + X"96",X"E0",X"8B",X"E9",X"C8",X"5C",X"E8",X"8A",X"A3",X"2D",X"DC",X"79",X"F6",X"A3",X"50",X"DC", + X"4D",X"5C",X"23",X"BB",X"19",X"3D",X"CA",X"EF",X"B6",X"2D",X"40",X"CD",X"99",X"EF",X"F7",X"2D", + X"40",X"EF",X"99",X"EF",X"B7",X"2D",X"40",X"09",X"B9",X"EF",X"FE",X"2D",X"40",X"2B",X"B9",X"EF", + X"BA",X"2D",X"40",X"1F",X"B9",X"EF",X"BE",X"2D",X"40",X"AD",X"B9",X"AB",X"FF",X"42",X"40",X"4F", + X"99",X"EB",X"FF",X"C2",X"BF",X"DD",X"BD",X"8B",X"FF",X"42",X"40",X"5F",X"99",X"CF",X"FF",X"C2", + X"BF",X"CD",X"BD",X"EE",X"BB",X"50",X"40",X"0F",X"B9",X"CA",X"BB",X"D2",X"BF",X"9D",X"9D",X"8A", + X"58",X"4B",X"67",X"67",X"67",X"67",X"67",X"67",X"6F",X"8A",X"8A",X"A2",X"BA",X"FC",X"D9",X"A2", + X"9A",X"FC",X"97",X"2D",X"40",X"8F",X"7B",X"99",X"5D",X"45",X"01",X"10",X"3C",X"7A",X"82",X"46", + X"4E",X"49",X"49",X"01",X"98",X"8D",X"00",X"05",X"5C",X"C7",X"FF",X"9F",X"DD",X"9B",X"9E",X"1D", + X"B7",X"69",X"E2",X"AA",X"A3",X"42",X"99",X"E2",X"8A",X"A3",X"D0",X"BD",X"E2",X"82",X"97",X"2D", + X"40",X"8F",X"52",X"99",X"FB",X"B2",X"5C",X"C7",X"FF",X"8F",X"E3",X"CF",X"FB",X"FE",X"5D",X"8B", + X"E0",X"8B",X"F9",X"8B",X"F0",X"8B",X"F1",X"8B",X"F8",X"8B",X"4D",X"E9",X"8C",X"5D",X"4D",X"5C", + X"C7",X"FF",X"0D",X"9F",X"BF",X"FF",X"9E",X"1D",X"E2",X"92",X"5C",X"C7",X"FF",X"0D",X"1D",X"B7", + X"54",X"97",X"C0",X"CF",X"8F",X"6C",X"99",X"5C",X"99",X"FF",X"E2",X"EF",X"A3",X"78",X"99",X"A3", + X"15",X"99",X"E2",X"97",X"A3",X"78",X"D9",X"A3",X"15",X"D9",X"0D",X"8B",X"FB",X"DF",X"97",X"BA", + X"D8",X"4C",X"91",X"80",X"F8",X"97",X"36",X"DC",X"4C",X"91",X"73",X"DC",X"97",X"3C",X"F8",X"4C", + X"91",X"14",X"DC",X"A2",X"FF",X"DC",X"60",X"9F",X"97",X"E8",X"F8",X"AE",X"9B",X"97",X"C5",X"F8", + X"4C",X"91",X"10",X"DC",X"97",X"2A",X"99",X"5D",X"55",X"E2",X"68",X"A3",X"DE",X"DC",X"A4",X"A3", + X"FE",X"DC",X"4D",X"C6",X"D8",X"DB",X"1F",X"DB",X"45",X"FB",X"BF",X"D8",X"8F",X"B4",X"DC",X"9E", + X"AB",X"F1",X"DC",X"8F",X"A4",X"DC",X"9E",X"AB",X"E1",X"DC",X"A2",X"FE",X"DC",X"C6",X"D8",X"05", + X"1F",X"DB",X"D8",X"A2",X"FF",X"DC",X"60",X"9F",X"8F",X"0D",X"DC",X"AE",X"9B",X"8F",X"CB",X"F8", + X"9E",X"AB",X"54",X"DC",X"8F",X"B7",X"DC",X"9E",X"AB",X"FA",X"DC",X"0D",X"5C",X"E8",X"8A",X"8B", + X"DB",X"DB",X"DB",X"DB",X"FB",X"FF",X"5C",X"52",X"CB",X"5C",X"E8",X"8A",X"8B",X"FB",X"BE",X"5C", + X"52",X"CB",X"5C",X"E8",X"8A",X"8B",X"FB",X"BE",X"5C",X"52",X"CB",X"5C",X"E8",X"8A",X"8B",X"FB", + X"BE",X"5C",X"52",X"CB",X"4D",X"53",X"AA",X"F1",X"DC",X"C1",X"AA",X"E1",X"DC",X"C1",X"AA",X"FA", + X"DC",X"8B",X"C1",X"0D",X"15",X"93",X"93",X"93",X"93",X"93",X"1D",X"DF",X"39",X"C3",X"EB",X"AA", + X"73",X"DC",X"E3",X"BF",X"8F",X"4B",X"F8",X"53",X"C1",X"8B",X"E6",X"C1",X"8B",X"E3",X"69",X"8B", + X"E3",X"B6",X"8B",X"E3",X"BA",X"8B",X"E3",X"FF",X"8B",X"E3",X"08",X"8B",X"E3",X"AB",X"8B",X"E3", + X"3F",X"A2",X"FF",X"DC",X"60",X"9F",X"97",X"0B",X"FC",X"8F",X"BE",X"DC",X"AE",X"FB",X"97",X"6F", + X"FC",X"8F",X"9A",X"DC",X"A2",X"4F",X"FC",X"B3",X"E0",X"60",X"B7",X"A6",X"BA",X"A2",X"B7",X"FC", + X"4B",X"E0",X"AF",X"9B",X"E2",X"DA",X"C1",X"97",X"24",X"C7",X"C6",X"DB",X"EB",X"BF",X"C8",X"96", + X"E0",X"8B",X"E9",X"C8",X"A2",X"4F",X"FC",X"4B",X"E0",X"AE",X"9F",X"53",X"9F",X"C4",X"F8",X"BB", + X"8B",X"E0",X"9B",X"BB",X"9B",X"BB",X"8B",X"E0",X"9B",X"BB",X"8B",X"E0",X"9B",X"BB",X"A3",X"02", + X"F8",X"8B",X"E0",X"9B",X"BB",X"8B",X"E0",X"9B",X"BB",X"A3",X"79",X"F8",X"8B",X"E0",X"9B",X"BB", + X"8B",X"E0",X"9B",X"BB",X"A2",X"4F",X"FC",X"4B",X"AE",X"FF",X"8F",X"E0",X"F8",X"C7",X"A2",X"B7", + X"FC",X"4B",X"AF",X"A2",X"E2",X"9F",X"A3",X"BF",X"FC",X"5C",X"F7",X"DF",X"5C",X"3E",X"DF",X"5C", + X"11",X"DF",X"A2",X"82",X"FC",X"60",X"BB",X"AF",X"9E",X"5C",X"F6",X"DF",X"5C",X"77",X"DF",X"5C", + X"70",X"DF",X"E2",X"FF",X"A3",X"BF",X"FC",X"5C",X"7C",X"DF",X"A2",X"4A",X"FC",X"4B",X"AF",X"FA", + X"8F",X"9D",X"D8",X"E3",X"BB",X"8B",X"E3",X"B5",X"8B",X"E3",X"BF",X"5C",X"24",X"FB",X"1C",X"AA", + X"14",X"DC",X"55",X"97",X"BE",X"BF",X"96",X"E3",X"BF",X"8B",X"8B",X"8B",X"15",X"B6",X"C8",X"5D", + X"55",X"DB",X"31",X"15",X"AE",X"45",X"5C",X"E8",X"8A",X"8B",X"4D",X"18",X"C0",X"AE",X"89",X"18", + X"42",X"45",X"A2",X"B9",X"FC",X"4B",X"AF",X"DA",X"AA",X"10",X"DC",X"E0",X"8B",X"AB",X"10",X"DC", + X"18",X"C1",X"AF",X"18",X"4B",X"AE",X"3C",X"8F",X"72",X"F8",X"E7",X"8F",X"52",X"F8",X"E7",X"AA", + X"14",X"DC",X"A2",X"FE",X"DC",X"D8",X"DB",X"DB",X"1F",X"DB",X"DB",X"DB",X"79",X"25",X"D9",X"E3", + X"BF",X"8B",X"85",X"8B",X"A2",X"DE",X"DC",X"C1",X"8B",X"A5",X"8B",X"A2",X"2D",X"DC",X"60",X"9B", + X"FB",X"D3",X"AE",X"BE",X"60",X"BB",X"FB",X"DE",X"AE",X"BB",X"FB",X"B7",X"A5",X"8B",X"E3",X"B6", + X"8B",X"E3",X"89",X"8B",X"E3",X"EF",X"8B",X"E3",X"3F",X"8B",X"E3",X"BA",X"8B",X"8B",X"AB",X"14", + X"DC",X"05",X"18",X"C1",X"AE",X"9A",X"18",X"43",X"AA",X"E1",X"DC",X"5C",X"04",X"AE",X"AB",X"E1", + X"DC",X"4B",X"38",X"58",X"AE",X"60",X"F2",X"AF",X"93",X"45",X"93",X"A2",X"FE",X"DC",X"60",X"9F", + X"E2",X"BE",X"AF",X"BB",X"E2",X"82",X"B3",X"92",X"05",X"19",X"42",X"AE",X"60",X"D2",X"AF",X"D2", + X"D9",X"8F",X"0F",X"F8",X"E7",X"AA",X"80",X"F8",X"A2",X"FE",X"DC",X"C1",X"8B",X"A2",X"DE",X"DC", + X"C1",X"8B",X"81",X"8B",X"A1",X"8B",X"E3",X"9F",X"8B",X"AB",X"80",X"F8",X"A4",X"B6",X"AD",X"60", + X"B3",X"AF",X"9A",X"AA",X"F1",X"DC",X"5C",X"04",X"AE",X"AB",X"F1",X"DC",X"B6",X"95",X"FA",X"BF", + X"60",X"B3",X"A7",X"BB",X"18",X"1D",X"60",X"9A",X"A6",X"FB",X"60",X"D7",X"A7",X"BB",X"18",X"1C", + X"18",X"9D",X"AE",X"D6",X"D9",X"A2",X"B9",X"FC",X"4B",X"AF",X"FE",X"AA",X"54",X"DC",X"E0",X"8B", + X"8B",X"AB",X"54",X"DC",X"4B",X"AE",X"B1",X"A4",X"AA",X"FA",X"DC",X"5C",X"41",X"AE",X"AB",X"FA", + X"DC",X"18",X"9C",X"AE",X"B2",X"45",X"71",X"9A",X"FB",X"BF",X"D8",X"8F",X"9F",X"8E",X"9E",X"F9", + X"AA",X"73",X"DC",X"A5",X"8B",X"C1",X"8B",X"81",X"8B",X"A1",X"8B",X"AB",X"73",X"DC",X"05",X"8F", + X"BE",X"8E",X"C6",X"DB",X"FB",X"BF",X"D8",X"9E",X"E0",X"8B",X"E9",X"C8",X"5C",X"0B",X"FF",X"0D", + X"05",X"15",X"4D",X"8F",X"2D",X"40",X"96",X"08",X"0D",X"45",X"A2",X"DE",X"DC",X"71",X"BE",X"A3", + X"DE",X"DC",X"05",X"1D",X"DF",X"39",X"52",X"CB",X"1C",X"AA",X"FA",X"DC",X"E3",X"BF",X"8B",X"E3", + X"40",X"8B",X"AB",X"FA",X"DC",X"B6",X"34",X"C1",X"8B",X"45",X"A2",X"DE",X"DC",X"C1",X"8B",X"05", + X"1C",X"D5",X"40",X"D5",X"D5",X"9B",X"B8",X"97",X"F9",X"8E",X"B5",X"8E",X"B0",X"8E",X"EC",X"8E", + X"A5",X"8E",X"7F",X"8E",X"33",X"8E",X"76",X"8E",X"2A",X"8E",X"67",X"8E",X"39",X"8E",X"35",X"8E", + X"70",X"8E",X"2C",X"8E",X"BB",X"AA",X"F7",X"AA",X"EB",X"AA",X"E7",X"AA",X"F0",X"AA",X"AC",X"AA", + X"A1",X"AA",X"3E",X"AA",X"72",X"AA",X"2A",X"AA",X"63",X"AA",X"39",X"AA",X"78",X"AA",X"30",X"AA", + X"69",X"AA",X"64",X"AA",X"BE",X"8A",X"BB",X"BB",X"7A",X"9A",X"7E",X"9A",X"5A",X"9A",X"5E",X"9A", + X"BB",X"BB",X"3A",X"9A",X"3E",X"FE",X"1A",X"9A",X"1E",X"FE",X"BB",X"FF",X"7F",X"9A",X"3F",X"FE", + X"5F",X"9A",X"1F",X"FE",X"7B",X"9A",X"3B",X"FE",X"5B",X"9A",X"1B",X"FE",X"9F",X"9F",X"47",X"9A", + X"9B",X"9B",X"65",X"97",X"05",X"97",X"BF",X"BF",X"BF",X"BF",X"21",X"97",X"25",X"B2",X"45",X"97", + X"01",X"97",X"BF",X"BF",X"9B",X"BB",X"2E",X"FF",X"6B",X"F2",X"6F",X"9E",X"0E",X"BE",X"4B",X"FA", + X"4F",X"9E",X"BB",X"BB",X"33",X"92",X"37",X"DF",X"13",X"92",X"17",X"DF",X"9B",X"BB",X"2B",X"FA", + X"2F",X"FA",X"72",X"FA",X"0B",X"FA",X"0F",X"FA",X"52",X"FA",X"BB",X"BB",X"73",X"97",X"77",X"D6", + X"53",X"97",X"57",X"D6",X"9B",X"BB",X"76",X"FA",X"32",X"97",X"36",X"97",X"56",X"FA",X"12",X"97", + X"16",X"97",X"9B",X"BB",X"7C",X"97",X"38",X"B2",X"3C",X"D3",X"5C",X"97",X"18",X"B2",X"1C",X"D3", + X"9B",X"BB",X"7D",X"FE",X"39",X"96",X"3D",X"96",X"5D",X"FE",X"19",X"96",X"1D",X"96",X"BB",X"BB", + X"31",X"F7",X"35",X"DE",X"11",X"F7",X"15",X"DE",X"FF",X"9B",X"0C",X"93",X"69",X"DA",X"09",X"DA", + X"2D",X"DA",X"28",X"F7",X"49",X"F6",X"6D",X"B3",X"0D",X"DA",X"08",X"93",X"2C",X"B3",X"4D",X"B3", + X"29",X"B3",X"FF",X"BB",X"BF",X"BF",X"BF",X"BF",X"30",X"B6",X"34",X"B6",X"BF",X"BF",X"BF",X"BF", + X"10",X"B6",X"14",X"B6",X"FF",X"BB",X"62",X"DB",X"66",X"F6",X"22",X"D3",X"26",X"D3",X"42",X"DB", + X"46",X"F6",X"02",X"D3",X"06",X"D3",X"9B",X"BB",X"6A",X"FF",X"6E",X"FF",X"2A",X"FF",X"4A",X"FF", + X"4E",X"FF",X"0A",X"FF",X"DF",X"FF",X"F7",X"D7",X"93",X"97",X"B3",X"97",X"97",X"97",X"B7",X"BF", + X"D3",X"D7",X"F3",X"D7",X"D7",X"9A",X"D7",X"9A",X"D7",X"9A",X"D3",X"D7",X"F2",X"D7",X"D6",X"9A", + X"D6",X"9A",X"D6",X"9A",X"F6",X"D7",X"92",X"97",X"B2",X"97",X"96",X"97",X"B6",X"BF",X"FF",X"9F", + X"AF",X"BF",X"AF",X"BF",X"A0",X"BF",X"A1",X"FB",X"FF",X"9F",X"AF",X"BF",X"AF",X"BF",X"C4",X"BF", + X"C5",X"FB",X"DF",X"BB",X"BB",X"BF",X"BB",X"BF",X"BB",X"BF",X"A4",X"BF",X"A5",X"BF",X"AF",X"BF", + X"AF",X"BF",X"AF",X"BF",X"AF",X"BF",X"85",X"BF",X"DF",X"BB",X"AF",X"BF",X"AF",X"BF",X"AF",X"BF", + X"AF",X"BF",X"E1",X"BF",X"9B",X"BF",X"9B",X"BF",X"9B",X"BF",X"C0",X"BF",X"C1",X"BF",X"DF",X"9F", + X"E5",X"BF",X"E5",X"BF",X"E5",X"BF",X"E5",X"BF",X"E4",X"BF",X"DF",X"9F",X"81",X"BF",X"81",X"BF", + X"81",X"BF",X"81",X"BF",X"80",X"BF",X"DF",X"9F",X"9B",X"BF",X"9B",X"BF",X"9B",X"BF",X"9B",X"BF", + X"9A",X"BF",X"DF",X"9F",X"BB",X"BF",X"BB",X"BF",X"BB",X"BF",X"BB",X"BF",X"BA",X"BF",X"DF",X"9F", + X"E5",X"BF",X"E5",X"BF",X"E5",X"BF",X"E5",X"BF",X"E5",X"BF",X"DF",X"9F",X"81",X"BF",X"81",X"BF", + X"81",X"BF",X"81",X"BF",X"81",X"BF",X"DF",X"BB",X"9B",X"BF",X"9B",X"BF",X"9B",X"BF",X"9B",X"BF", + X"9A",X"BF",X"BB",X"BF",X"BB",X"BF",X"BB",X"BF",X"BB",X"BF",X"BA",X"BF",X"DF",X"9F",X"BF",X"BF", + X"BF",X"BF",X"BF",X"BF",X"BF",X"BF",X"BE",X"BF",X"DF",X"BB",X"BF",X"BF",X"BF",X"BF",X"BF",X"BF", + X"ED",X"F3",X"BE",X"BF",X"BF",X"BF",X"BF",X"BF",X"BF",X"BF",X"CD",X"F3",X"CC",X"BF",X"BF",X"BF", + X"BF",X"BF",X"E8",X"F3",X"E9",X"F3",X"BE",X"BF",X"BF",X"BF",X"BF",X"BF",X"C8",X"F3",X"C9",X"F3", + X"CC",X"BF",X"BF",X"BF",X"BF",X"BF",X"AC",X"F3",X"AD",X"F3",X"BE",X"BF",X"BF",X"BF",X"BF",X"BF", + X"8C",X"F3",X"8D",X"F3",X"CC",X"BF",X"BF",X"BF",X"A8",X"F3",X"A9",X"F3",X"BF",X"BF",X"BE",X"BF", + X"BF",X"BF",X"88",X"F3",X"89",X"F3",X"BB",X"F3",X"CC",X"BF",X"BF",X"BF",X"ED",X"F3",X"BF",X"BF", + X"BF",X"BF",X"BE",X"BF",X"BF",X"BF",X"CD",X"F3",X"BB",X"F3",X"BB",X"F3",X"CC",X"BF",X"5D",X"FA", + X"E6",X"01",X"4C",X"A4",X"8F",X"3E",X"68",X"5F",X"CD",X"35",X"8F",X"35",X"00",X"1D",X"1C",X"01", + X"10",X"0A",X"F2",X"86",X"A8",X"F3",X"E8",X"AC",X"41",X"F3",X"7A",X"AC",X"E6",X"F3",X"C2",X"AC", + X"10",X"62",X"00",X"FB",X"F2",X"5C",X"9E",X"9B",X"53",X"45",X"8F",X"36",X"DC",X"4D",X"E0",X"4B", + X"AE",X"83",X"DB",X"C1",X"A7",X"AE",X"8B",X"E0",X"60",X"40",X"AE",X"AB",X"8B",X"F0",X"8B",X"F1", + X"DB",X"FB",X"BF",X"D8",X"8F",X"9C",X"CA",X"9E",X"E0",X"8B",X"E9",X"C8",X"F9",X"8B",X"5D",X"55", + X"F8",X"8B",X"F9",X"8B",X"E0",X"08",X"9E",X"6A",X"C1",X"08",X"15",X"1D",X"B7",X"48",X"0D",X"8B", + X"8B",X"8B",X"8B",X"B6",X"3C",X"0D",X"A2",X"52",X"F8",X"A3",X"3D",X"B5",X"4B",X"38",X"81",X"CE", + X"A2",X"BD",X"D8",X"E6",X"69",X"9B",X"A3",X"BD",X"D8",X"A2",X"76",X"FC",X"4B",X"AE",X"9B",X"5C", + X"0A",X"C2",X"53",X"A3",X"C6",X"D8",X"A3",X"E6",X"D8",X"C6",X"A3",X"DE",X"FC",X"5C",X"BF",X"D6", + X"A2",X"4A",X"F8",X"D8",X"60",X"3E",X"E2",X"DA",X"AE",X"9E",X"84",X"69",X"7F",X"60",X"7F",X"E2", + X"B7",X"AF",X"9B",X"5C",X"A6",X"BA",X"A2",X"B7",X"FC",X"4B",X"AF",X"DA",X"5C",X"CE",X"DB",X"A2", + X"2F",X"F8",X"4B",X"E2",X"DB",X"A3",X"FD",X"D8",X"7D",X"38",X"CE",X"A2",X"B7",X"FC",X"4B",X"AE", + X"FB",X"A2",X"BD",X"D8",X"4B",X"AE",X"EC",X"A2",X"0F",X"F8",X"4B",X"AE",X"E9",X"D9",X"8F",X"BA", + X"D8",X"4D",X"A2",X"2E",X"F8",X"F8",X"06",X"AF",X"D2",X"A2",X"0E",X"F8",X"8B",X"F8",X"17",X"18", + X"C0",X"AE",X"BB",X"4C",X"FD",X"60",X"9B",X"A7",X"DA",X"8B",X"8B",X"8B",X"E0",X"69",X"DA",X"60", + X"DF",X"AF",X"DF",X"E2",X"9F",X"A3",X"2F",X"F8",X"0D",X"8B",X"8B",X"8B",X"8B",X"FA",X"BF",X"A2", + X"B7",X"FC",X"4B",X"AF",X"B7",X"A2",X"BD",X"D8",X"4B",X"AF",X"CF",X"4C",X"D0",X"69",X"C2",X"60", + X"FF",X"A7",X"BB",X"FA",X"3F",X"E0",X"0E",X"C1",X"69",X"DA",X"E6",X"FA",X"BF",X"18",X"E0",X"AE", + X"FF",X"FA",X"3F",X"71",X"BB",X"4B",X"38",X"8C",X"CE",X"60",X"FB",X"38",X"E8",X"CE",X"07",X"C1", + X"8B",X"B7",X"72",X"E2",X"9F",X"A3",X"C6",X"D8",X"A3",X"E6",X"D8",X"5C",X"BF",X"D6",X"A2",X"2F", + X"F8",X"4B",X"E2",X"FB",X"A3",X"FD",X"D8",X"7D",X"38",X"CE",X"A2",X"C2",X"D8",X"4B",X"AE",X"9E", + X"18",X"C1",X"AF",X"DF",X"E2",X"F3",X"5C",X"A6",X"BA",X"E2",X"BB",X"A3",X"C6",X"D8",X"A3",X"E6", + X"D8",X"5C",X"BF",X"D6",X"A2",X"C2",X"D8",X"4B",X"AE",X"9E",X"18",X"C1",X"AF",X"DF",X"E2",X"93", + X"5C",X"A6",X"BA",X"05",X"68",X"9F",X"45",X"D0",X"DB",X"1B",X"79",X"9B",X"D1",X"F2",X"9B",X"FB", + X"9B",X"5D",X"55",X"80",X"A3",X"C6",X"D8",X"A0",X"A3",X"E6",X"D8",X"5C",X"BF",X"D6",X"A2",X"C2", + X"D8",X"69",X"25",X"D8",X"60",X"2F",X"E2",X"97",X"AE",X"DB",X"84",X"60",X"37",X"E2",X"B3",X"AF", + X"9B",X"5C",X"A6",X"BA",X"15",X"1D",X"F7",X"F6",X"B7",X"51",X"A2",X"2F",X"F8",X"4B",X"E2",X"DF", + X"A3",X"FD",X"D8",X"7D",X"38",X"CE",X"A2",X"B7",X"FC",X"4B",X"AF",X"BE",X"E2",X"9E",X"A3",X"BF", + X"FC",X"5C",X"DE",X"DF",X"FB",X"9E",X"5C",X"AA",X"EA",X"A3",X"3D",X"B5",X"B7",X"24",X"5C",X"8F", + X"9B",X"05",X"19",X"16",X"8A",X"D4",X"C5",X"D2",X"49",X"41",X"CC",X"85",X"CC",X"68",X"37",X"CC", + X"0B",X"58",X"6A",X"13",X"22",X"3B",X"7D",X"72",X"37",X"1E",X"36",X"A4",X"5F",X"22",X"B5",X"34", + X"27",X"A9",X"94",X"1E",X"6C",X"E1",X"4A",X"41",X"8D",X"E2",X"9F",X"19",X"52",X"EE",X"E2",X"5F", + X"19",X"52",X"EE",X"05",X"53",X"A3",X"C2",X"FC",X"E6",X"A3",X"2A",X"FC",X"8F",X"DB",X"DC",X"A2", + X"FF",X"DC",X"60",X"9F",X"AE",X"9B",X"8F",X"BA",X"DC",X"F1",X"53",X"D8",X"4C",X"C8",X"D0",X"E0", + X"D9",X"A1",X"80",X"5C",X"CA",X"DF",X"5C",X"8C",X"DB",X"A2",X"B7",X"FC",X"4B",X"AF",X"BE",X"E2", + X"9E",X"A3",X"BF",X"FC",X"5C",X"DE",X"DF",X"5C",X"63",X"DB",X"E2",X"FF",X"5C",X"A6",X"BA",X"5C", + X"A6",X"9B",X"53",X"A3",X"2F",X"F8",X"A2",X"FF",X"DC",X"8F",X"BD",X"FC",X"60",X"9F",X"AE",X"9B", + X"8F",X"9D",X"FC",X"E3",X"9F",X"53",X"A3",X"2A",X"FC",X"1C",X"A2",X"72",X"F8",X"4B",X"3C",X"05", + X"05",X"5C",X"63",X"DB",X"A2",X"FD",X"D8",X"5C",X"A6",X"BA",X"5C",X"B1",X"9B",X"53",X"A3",X"C2", + X"FC",X"E6",X"A3",X"2A",X"FC",X"A3",X"2F",X"F8",X"A2",X"FF",X"DC",X"8F",X"BD",X"FC",X"97",X"0D", + X"DC",X"9F",X"CC",X"F8",X"60",X"9F",X"AE",X"9E",X"8F",X"9D",X"FC",X"97",X"CB",X"F8",X"9F",X"E5", + X"F8",X"E3",X"BF",X"5D",X"8F",X"B7",X"DC",X"FB",X"F9",X"E0",X"B3",X"8B",X"93",X"B7",X"20",X"15", + X"A2",X"2B",X"F8",X"B3",X"93",X"8F",X"35",X"F8",X"FB",X"FB",X"E0",X"B3",X"5D",X"9F",X"9A",X"BF", + X"9E",X"1D",X"93",X"B7",X"45",X"53",X"A3",X"2A",X"FC",X"1C",X"A2",X"C4",X"F8",X"4B",X"3C",X"8F", + X"FA",X"FC",X"C7",X"3D",X"A2",X"C4",X"F8",X"C1",X"5C",X"8F",X"9B",X"1C",X"A2",X"E6",X"D8",X"60", + X"BB",X"AE",X"88",X"60",X"9F",X"AE",X"90",X"4D",X"E0",X"60",X"37",X"AF",X"9E",X"4D",X"8B",X"8B", + X"E8",X"EB",X"DC",X"18",X"62",X"0D",X"97",X"20",X"40",X"96",X"F9",X"A2",X"0E",X"F8",X"26",X"FB", + X"BF",X"A6",X"9F",X"FF",X"8B",X"8B",X"8B",X"E3",X"E4",X"E2",X"9B",X"18",X"BD",X"AE",X"BB",X"4C", + X"FD",X"D8",X"A2",X"E6",X"D8",X"71",X"9B",X"D0",X"DB",X"DB",X"1B",X"F3",X"BF",X"D0",X"8F",X"BC", + X"D8",X"96",X"08",X"E2",X"E4",X"B3",X"93",X"E2",X"FA",X"B3",X"93",X"84",X"B3",X"93",X"53",X"B3", + X"93",X"B3",X"93",X"0D",X"8A",X"A1",X"8A",X"81",X"8F",X"72",X"F8",X"C7",X"8F",X"A5",X"D8",X"E7", + X"A4",X"1C",X"8B",X"A2",X"3B",X"F8",X"C1",X"FB",X"FE",X"97",X"E9",X"D8",X"B6",X"FA",X"8B",X"E3", + X"F7",X"A2",X"0B",X"F8",X"DB",X"DB",X"79",X"B6",X"D9",X"97",X"88",X"D8",X"8A",X"8A",X"A4",X"B3", + X"93",X"53",X"B3",X"93",X"B3",X"93",X"B3",X"93",X"E2",X"FE",X"B3",X"93",X"A1",X"8A",X"81",X"8A", + X"A5",X"1C",X"4D",X"A2",X"E6",X"D8",X"60",X"BB",X"AE",X"DC",X"60",X"9F",X"AE",X"E3",X"8A",X"F1", + X"8A",X"F0",X"92",X"92",X"92",X"92",X"B2",X"71",X"BB",X"B3",X"92",X"81",X"8B",X"A1",X"8A",X"8A", + X"8A",X"8A",X"69",X"3F",X"AE",X"F6",X"E0",X"60",X"AF",X"A7",X"D3",X"53",X"8B",X"8B",X"C1",X"8B", + X"8B",X"8B",X"C1",X"8F",X"52",X"F8",X"C7",X"8F",X"A5",X"D8",X"C7",X"AF",X"DF",X"E2",X"B6",X"5C", + X"A6",X"BA",X"0D",X"1C",X"5C",X"86",X"CA",X"AF",X"04",X"E3",X"BA",X"8A",X"E3",X"3F",X"8A",X"97", + X"B5",X"8B",X"A1",X"8A",X"81",X"B6",X"08",X"5C",X"86",X"CA",X"AF",X"69",X"A2",X"7F",X"F8",X"C1", + X"8A",X"53",X"C1",X"8A",X"8A",X"8A",X"C1",X"B6",X"14",X"8A",X"F1",X"8A",X"F0",X"92",X"92",X"92", + X"92",X"92",X"81",X"8B",X"A1",X"8B",X"8B",X"C7",X"1C",X"D4",X"CA",X"ED",X"CA",X"88",X"CA",X"A4", + X"CA",X"3E",X"CA",X"0F",X"CA",X"2E",X"CA",X"ED",X"CA",X"26",X"CA",X"66",X"CA",X"BB",X"60",X"40", + X"FB",X"70",X"40",X"FB",X"BB",X"40",X"40",X"FF",X"50",X"40",X"FF",X"FF",X"BF",X"BF",X"FF",X"2D", + X"40",X"FF",X"40",X"40",X"FF",X"50",X"40",X"FF",X"DF",X"44",X"40",X"FE",X"46",X"40",X"FE",X"60", + X"40",X"FA",X"62",X"40",X"BA",X"2D",X"40",X"7B",X"BE",X"44",X"40",X"FF",X"54",X"40",X"FF",X"60", + X"40",X"FF",X"70",X"40",X"FF",X"44",X"9B",X"D3",X"54",X"9B",X"D3",X"60",X"9B",X"D3",X"70",X"9B", + X"D3",X"BB",X"60",X"40",X"FE",X"70",X"40",X"FE",X"DF",X"60",X"40",X"B2",X"70",X"40",X"B2",X"40", + X"40",X"F2",X"50",X"40",X"F2",X"BF",X"BF",X"B2",X"9F",X"44",X"40",X"9A",X"9F",X"44",X"40",X"9A", + X"01",X"8F",X"D4",X"CA",X"97",X"F3",X"D9",X"9F",X"B7",X"C2",X"19",X"4B",X"E3",X"C6",X"A7",X"E0", + X"A7",X"1D",X"A7",X"BE",X"87",X"D8",X"87",X"32",X"87",X"28",X"87",X"83",X"A3",X"1F",X"A3",X"78", + X"A3",X"F2",X"83",X"E8",X"83",X"3D",X"83",X"97",X"E7",X"89",X"E7",X"07",X"E7",X"BB",X"C7",X"D8", + X"C7",X"52",X"C7",X"00",X"CA",X"98",X"1A",X"0D",X"19",X"0F",X"96",X"17",X"3B",X"7A",X"5B",X"07", + X"D7",X"5C",X"31",X"16",X"13",X"56",X"77",X"33",X"7A",X"7B",X"50",X"12",X"32",X"1F",X"53",X"73", + X"27",X"32",X"59",X"9B",X"17",X"72",X"35",X"3E",X"5F",X"18",X"12",X"32",X"32",X"5A",X"17",X"31", + X"FF",X"32",X"52",X"1F",X"72",X"35",X"7E",X"7B",X"18",X"12",X"32",X"36",X"77",X"37",X"1B",X"36", + X"1C",X"7E",X"1F",X"7A",X"32",X"77",X"DF",X"23",X"BF",X"BB",X"16",X"7B",X"7A",X"13",X"5F",X"18", + X"56",X"73",X"36",X"1F",X"B7",X"93",X"03",X"7F",X"1C",X"7E",X"7F",X"18",X"3A",X"3D",X"B6",X"32", + X"3D",X"5A",X"32",X"51",X"FB",X"72",X"35",X"7E",X"7B",X"18",X"3A",X"32",X"36",X"1B",X"35",X"BB", + X"03",X"32",X"1C",X"7E",X"7B",X"18",X"12",X"16",X"77",X"32",X"36",X"32",X"92",X"F7",X"33",X"74", + X"7E",X"5F",X"18",X"3A",X"32",X"3F",X"13",X"2F",X"77",X"B3",X"11",X"32",X"1C",X"7E",X"33",X"5F", + X"18",X"3A",X"17",X"27",X"57",X"3D",X"97",X"73",X"52",X"1F",X"72",X"35",X"7E",X"7F",X"18",X"12", + X"B3",X"16",X"32",X"1F",X"DB",X"5A",X"43",X"3B",X"72",X"35",X"7E",X"1F",X"7A",X"D3",X"76",X"5A", + X"BF",X"27",X"32",X"15",X"1B",X"7A",X"5F",X"50",X"56",X"77",X"31",X"73",X"32",X"16",X"DB",X"5A", + X"03",X"57",X"1C",X"3E",X"7F",X"18",X"12",X"B2",X"7F",X"17",X"33",X"27",X"32",X"03",X"DF",X"74", + X"7E",X"17",X"7F",X"7A",X"7F",X"16",X"5F",X"5A",X"30",X"3B",X"5A",X"FB",X"57",X"1B",X"7A",X"5F", + X"50",X"3A",X"32",X"3F",X"DB",X"7C",X"73",X"72",X"35",X"3A",X"11",X"32",X"74",X"3E",X"7B",X"18", + X"3A",X"96",X"75",X"1F",X"32",X"07",X"77",X"57",X"03",X"97",X"1C",X"7E",X"7F",X"18",X"56",X"B2", + X"5B",X"D3",X"5C",X"B6",X"3F",X"32",X"9B",X"77",X"33",X"1C",X"7E",X"1F",X"7A",X"32",X"1F",X"17", + X"5A",X"30",X"BB",X"5A",X"33",X"15",X"32",X"7A",X"13",X"7F",X"18",X"56",X"BF",X"DB",X"57",X"3D", + X"5A",X"1F",X"43",X"B6",X"72",X"35",X"7E",X"7B",X"18",X"3A",X"32",X"3F",X"7B",X"11",X"5A",X"77", + X"1B",X"12",X"F7",X"1C",X"7E",X"7F",X"18",X"12",X"3D",X"BB",X"17",X"1D",X"5A",X"7F",X"33",X"03", + X"32",X"1C",X"7E",X"7B",X"18",X"3A",X"32",X"77",X"DF",X"75",X"5A",X"3F",X"11",X"DF",X"1C",X"7E", + X"7F",X"18",X"12",X"75",X"73",X"53",X"1D",X"5A",X"17",X"77",X"83",X"77",X"32",X"1C",X"7E",X"33", + X"7F",X"18",X"12",X"F7",X"5B",X"57",X"23",X"DA",X"53",X"43",X"5B",X"72",X"35",X"7E",X"5F",X"7A", + X"DA",X"32",X"3B",X"5C",X"1F",X"A3",X"5A",X"32",X"5C",X"55",X"32",X"5A",X"7A",X"7B",X"50",X"12", + X"16",X"32",X"F3",X"32",X"23",X"5A",X"B6",X"5B",X"17",X"72",X"35",X"3E",X"1F",X"7A",X"32",X"3B", + X"5C",X"3F",X"A3",X"5A",X"32",X"5C",X"15",X"B2",X"7A",X"5F",X"50",X"12",X"7B",X"23",X"7B",X"B2", + X"2B",X"5A",X"77",X"77",X"DB",X"13",X"33",X"72",X"35",X"3E",X"17",X"7F",X"18",X"56",X"F7",X"DB", + X"5A",X"B2",X"3F",X"5A",X"73",X"11",X"D7",X"74",X"7E",X"7B",X"18",X"12",X"32",X"3B",X"53",X"5A", + X"47",X"5A",X"1B",X"93",X"5B",X"1C",X"3A",X"1E",X"7E",X"7B",X"18",X"3A",X"17",X"15",X"32",X"5A", + X"1D",X"5A",X"7F",X"36",X"4A",X"FF",X"72",X"35",X"3A",X"1E",X"7E",X"7B",X"18",X"12",X"32",X"32", + X"3B",X"5A",X"2F",X"5A",X"93",X"49",X"77",X"33",X"1C",X"3A",X"1E",X"7E",X"7B",X"18",X"3A",X"1F", + X"75",X"32",X"5A",X"B6",X"5F",X"5A",X"93",X"FB",X"74",X"7E",X"13",X"5F",X"18",X"56",X"5B",X"16", + X"5A",X"93",X"57",X"77",X"33",X"52",X"17",X"72",X"35",X"7E",X"5F",X"7A",X"5A",X"32",X"7F",X"1C", + X"56",X"F7",X"5A",X"36",X"47",X"3B",X"B3",X"7A",X"7F",X"7A",X"53",X"F6",X"FF",X"5A",X"32",X"22", + X"1C",X"56",X"5A",X"55",X"DF",X"53",X"7A",X"7F",X"7A",X"D7",X"0F",X"73",X"73",X"77",X"34",X"5A", + X"32",X"9D",X"1C",X"56",X"5A",X"7A",X"7F",X"50",X"12",X"F7",X"7B",X"BF",X"15",X"1B",X"5A",X"11", + X"32",X"74",X"3E",X"33",X"7B",X"18",X"56",X"16",X"3F",X"BF",X"31",X"5A",X"F3",X"5B",X"36",X"72", + X"35",X"7E",X"7B",X"18",X"3A",X"BB",X"BB",X"32",X"5C",X"5A",X"BB",X"32",X"5A",X"5C",X"9B",X"32", + X"53",X"1C",X"7E",X"7F",X"7A",X"32",X"74",X"1B",X"5C",X"32",X"14",X"5A",X"32",X"5C",X"14",X"5B", + X"32",X"7A",X"7B",X"50",X"3A",X"9F",X"BB",X"32",X"5C",X"5A",X"BB",X"32",X"5A",X"5C",X"9B",X"32", + X"FF",X"1C",X"3E",X"5F",X"18",X"12",X"7B",X"77",X"32",X"34",X"5A",X"32",X"83",X"77",X"93",X"74", + X"7E",X"17",X"7F",X"18",X"56",X"B3",X"93",X"5A",X"39",X"5C",X"5A",X"D7",X"43",X"17",X"72",X"35", + X"7E",X"7F",X"7A",X"32",X"74",X"5C",X"5B",X"32",X"14",X"5C",X"32",X"5B",X"14",X"5C",X"32",X"7A", + X"5F",X"50",X"12",X"9B",X"07",X"32",X"5A",X"39",X"1F",X"5C",X"32",X"03",X"F3",X"74",X"3E",X"7F", + X"7A",X"5A",X"9F",X"7F",X"DF",X"5C",X"31",X"32",X"5B",X"14",X"5C",X"32",X"7A",X"5F",X"50",X"56", + X"3B",X"0B",X"5A",X"5A",X"77",X"5A",X"30",X"5A",X"33",X"32",X"12",X"FB",X"1C",X"3E",X"13",X"7B", + X"18",X"12",X"16",X"32",X"9B",X"1F",X"3D",X"5A",X"D3",X"4B",X"73",X"33",X"72",X"35",X"7E",X"3B", + X"7A",X"5A",X"A9",X"1C",X"56",X"5B",X"5A",X"DB",X"BB",X"32",X"5B",X"5A",X"8F",X"DB",X"5C",X"5A", + X"7A",X"7F",X"7A",X"32",X"36",X"32",X"75",X"5C",X"32",X"16",X"32",X"7A",X"7B",X"50",X"12",X"32", + X"2F",X"5C",X"32",X"BC",X"F7",X"5A",X"77",X"32",X"83",X"5C",X"32",X"74",X"3E",X"7F",X"7A",X"32", + X"30",X"5A",X"77",X"5F",X"84",X"72",X"35",X"56",X"FB",X"36",X"14",X"5A",X"32",X"7A",X"33",X"5F", + X"18",X"12",X"5A",X"74",X"5A",X"5A",X"93",X"2B",X"77",X"B3",X"5A",X"C3",X"5A",X"5A",X"72",X"35", + X"7E",X"7B",X"18",X"12",X"B2",X"32",X"5C",X"5A",X"9F",X"13",X"5A",X"5C",X"51",X"32",X"72",X"35", + X"7E",X"5B",X"18",X"56",X"77",X"32",X"76",X"5C",X"B2",X"14",X"5C",X"32",X"5C",X"01",X"77",X"B2", + X"74",X"7E",X"7B",X"18",X"12",X"32",X"36",X"57",X"96",X"F3",X"32",X"5C",X"51",X"32",X"72",X"35", + X"7E",X"5F",X"18",X"56",X"5F",X"32",X"36",X"7B",X"77",X"1B",X"03",X"32",X"74",X"7E",X"17",X"1F", + X"7A",X"5A",X"11",X"13",X"77",X"33",X"65",X"1C",X"56",X"1F",X"56",X"5A",X"BB",X"7A",X"7B",X"50", + X"12",X"32",X"46",X"77",X"5C",X"BF",X"5F",X"23",X"32",X"5C",X"83",X"5A",X"32",X"74",X"3E",X"7B", + X"18",X"3A",X"53",X"F7",X"32",X"D7",X"C7",X"5C",X"1B",X"5A",X"32",X"1B",X"FF",X"1C",X"7E",X"7B", + X"18",X"12",X"32",X"2B",X"3F",X"5C",X"17",X"AF",X"73",X"5A",X"32",X"D0",X"1C",X"56",X"DB",X"72", + X"35",X"7E",X"7F",X"7A",X"7B",X"BB",X"32",X"5C",X"BB",X"31",X"32",X"36",X"87",X"5C",X"32",X"7A", + X"13",X"5F",X"18",X"56",X"7B",X"32",X"DA",X"5B",X"1D",X"5A",X"96",X"5A",X"11",X"13",X"74",X"7E", + X"5F",X"18",X"3A",X"5A",X"23",X"32",X"5C",X"BB",X"32",X"5C",X"32",X"0B",X"77",X"33",X"1C",X"7E", + X"7B",X"18",X"12",X"32",X"56",X"5C",X"96",X"5A",X"55",X"32",X"5C",X"32",X"52",X"5A",X"77",X"1C", + X"7E",X"5F",X"18",X"3A",X"32",X"56",X"DF",X"5C",X"32",X"76",X"5C",X"D3",X"83",X"1B",X"32",X"74", + X"7E",X"7B",X"18",X"12",X"53",X"34",X"7F",X"17",X"F7",X"32",X"57",X"59",X"73",X"97",X"72",X"35", + X"7E",X"33",X"7B",X"18",X"3A",X"17",X"F6",X"17",X"FF",X"5C",X"14",X"D3",X"5C",X"DF",X"10",X"5C", + X"DB",X"1C",X"7E",X"7B",X"18",X"3A",X"16",X"BB",X"32",X"5C",X"32",X"2F",X"5C",X"32",X"83",X"5C", + X"32",X"74",X"7E",X"5B",X"18",X"56",X"77",X"32",X"76",X"5C",X"32",X"14",X"5C",X"32",X"5C",X"51", + X"32",X"72",X"35",X"7E",X"7B",X"18",X"12",X"32",X"2F",X"5C",X"32",X"A3",X"5C",X"32",X"5C",X"9B", + X"32",X"F3",X"1C",X"7E",X"7F",X"7A",X"32",X"14",X"5A",X"32",X"5A",X"55",X"32",X"5A",X"32",X"56", + X"5A",X"B6",X"7A",X"17",X"7F",X"18",X"56",X"B2",X"5A",X"5A",X"5A",X"1D",X"DA",X"5A",X"5A",X"03", + X"5A",X"74",X"7E",X"7B",X"18",X"12",X"32",X"47",X"5C",X"53",X"1B",X"5D",X"D3",X"1C",X"56",X"B6", + X"03",X"32",X"74",X"7E",X"7F",X"7A",X"32",X"14",X"5C",X"32",X"5C",X"75",X"32",X"32",X"54",X"5C", + X"5A",X"5A",X"7A",X"7B",X"50",X"12",X"32",X"2F",X"5C",X"32",X"31",X"93",X"33",X"83",X"5C",X"32", + X"74",X"3E",X"5F",X"18",X"12",X"32",X"76",X"5C",X"DF",X"BF",X"3F",X"32",X"83",X"5C",X"B2",X"74", + X"7E",X"13",X"5F",X"7A",X"BF",X"5A",X"28",X"72",X"35",X"3A",X"16",X"57",X"55",X"17",X"5A",X"5A", + X"16",X"93",X"7A",X"7B",X"50",X"12",X"32",X"67",X"5A",X"5B",X"A3",X"5C",X"32",X"5C",X"D3",X"32", + X"77",X"1C",X"3E",X"7B",X"18",X"12",X"32",X"2F",X"5C",X"32",X"A3",X"5C",X"32",X"D7",X"19",X"5C", + X"B6",X"1C",X"7E",X"7B",X"18",X"12",X"32",X"2F",X"5C",X"32",X"B2",X"7F",X"9F",X"3B",X"03",X"32", + X"74",X"7E",X"7B",X"18",X"12",X"32",X"66",X"1C",X"56",X"DF",X"96",X"53",X"5F",X"1B",X"03",X"32", + X"74",X"7E",X"33",X"7B",X"18",X"3A",X"BF",X"A3",X"5B",X"5C",X"36",X"BF",X"B6",X"5C",X"59",X"73", + X"53",X"72",X"35",X"7E",X"1F",X"7A",X"32",X"16",X"32",X"5C",X"75",X"32",X"32",X"55",X"5C",X"BF", + X"7A",X"7B",X"50",X"3A",X"5A",X"AB",X"5A",X"5A",X"5A",X"5A",X"AB",X"5A",X"DA",X"5A",X"5A",X"83", + X"5A",X"32",X"74",X"3E",X"7F",X"7A",X"32",X"34",X"5C",X"1F",X"87",X"F7",X"13",X"7F",X"0F",X"77", + X"33",X"7A",X"3B",X"7A",X"3B",X"14",X"5C",X"32",X"9B",X"32",X"7B",X"7B",X"16",X"5F",X"7A",X"17", + X"7F",X"18",X"3A",X"E7",X"73",X"D3",X"17",X"2B",X"7F",X"5C",X"5A",X"8B",X"DA",X"5A",X"5A",X"1C", + X"7E",X"7F",X"7A",X"32",X"15",X"5C",X"32",X"76",X"5C",X"32",X"14",X"5C",X"32",X"7A",X"7F",X"7A", + X"D7",X"A3",X"5C",X"32",X"5C",X"BB",X"32",X"5C",X"32",X"47",X"D7",X"17",X"7A",X"5F",X"7A",X"9F", + X"72",X"A1",X"35",X"3A",X"32",X"5C",X"D5",X"77",X"32",X"33",X"5C",X"55",X"16",X"36",X"7A",X"7B", + X"50",X"3A",X"7B",X"23",X"32",X"5C",X"BB",X"32",X"5A",X"B6",X"83",X"5A",X"32",X"74",X"3E",X"13", + X"5F",X"7A",X"5A",X"BF",X"10",X"5C",X"D3",X"73",X"72",X"A9",X"35",X"3A",X"DB",X"5C",X"3B",X"55", + X"7F",X"5A",X"7A",X"7B",X"50",X"3A",X"16",X"03",X"32",X"1C",X"56",X"D1",X"77",X"32",X"77",X"72", + X"35",X"81",X"56",X"77",X"32",X"74",X"3E",X"5F",X"18",X"56",X"32",X"76",X"5C",X"57",X"A3",X"97", + X"32",X"5C",X"9B",X"32",X"33",X"1C",X"7E",X"7B",X"18",X"12",X"32",X"2F",X"5C",X"32",X"AF",X"5C", + X"77",X"93",X"83",X"33",X"32",X"74",X"7E",X"5F",X"7A",X"5A",X"32",X"16",X"32",X"5C",X"75",X"32", + X"7B",X"54",X"BF",X"5F",X"5A",X"7A",X"3B",X"1F",X"D2",X"E3",X"CB",X"E3",X"CA",X"E3",X"C3",X"E3", + X"C2",X"E3",X"D9",X"E3",X"D8",X"E3",X"D1",X"E3",X"D0",X"E3",X"C9",X"E3",X"C8",X"E3",X"C1",X"E3", + X"C0",X"E3",X"5B",X"E3",X"5A",X"E3",X"53",X"E3",X"52",X"E3",X"10",X"F3",X"19",X"2B",X"9F",X"FF", + X"F3",X"DA",X"25",X"BD",X"B7",X"BE",X"FF",X"DF",X"D7",X"FA",X"2D",X"E6",X"AF",X"BA",X"FF",X"FB", + X"F7",X"DE",X"35",X"A6",X"A7",X"FE",X"FF",X"DB",X"93",X"FE",X"3D",X"E7",X"BD",X"FA",X"FF",X"BE", + X"B3",X"9A",X"27",X"A7",X"B5",X"B7",X"FF",X"9E",X"97",X"BA",X"2F",X"EE",X"AD",X"F7",X"DF",X"BA", + X"B7",X"9E",X"37",X"AE",X"A5",X"B6",X"DF",X"9A",X"DA",X"BE",X"3F",X"EB",X"3F",X"F6",X"DF",X"DE", + X"FA",X"DB",X"A5",X"EF",X"37",X"AF",X"DF",X"DA",X"DE",X"FB",X"AD",X"AB",X"2F",X"EF",X"DF",X"B3", + X"FE",X"FB",X"B5",X"AF",X"27",X"AE",X"FB",X"F3",X"9A",X"FB",X"BD",X"F2",X"3D",X"EE",X"FB",X"F2", + X"BA",X"DF",X"A7",X"F6",X"35",X"A7",X"FB",X"CE",X"9E",X"DF",X"AF",X"B2",X"2D",X"E7",X"FB",X"B0", + X"BE",X"DF",X"B7",X"B6",X"25",X"A6",X"DB",X"9B",X"3F",X"9F",X"D8",X"96",X"E7",X"BA",X"FF",X"DF", + X"3F",X"9F",X"BC",X"B6",X"EE",X"DF",X"FF",X"55",X"08",X"8F",X"BF",X"BF",X"B2",X"55",X"F3",X"BF", + X"D0",X"96",X"15",X"92",X"B7",X"61",X"E2",X"FB",X"A3",X"3D",X"B5",X"A3",X"BA",X"FC",X"E6",X"E6", + X"A3",X"9A",X"FC",X"DE",X"AF",X"69",X"15",X"96",X"E4",X"69",X"C2",X"C9",X"0C",X"A2",X"82",X"FC", + X"60",X"9F",X"AE",X"EB",X"54",X"8F",X"32",X"FC",X"8F",X"2B",X"FC",X"97",X"B8",X"FC",X"FB",X"9B", + X"E0",X"B3",X"8A",X"92",X"B7",X"20",X"5C",X"6E",X"86",X"A2",X"53",X"FC",X"4B",X"AF",X"BE",X"5C", + X"CF",X"C3",X"5C",X"EE",X"C3",X"B6",X"FB",X"5C",X"EE",X"C3",X"5C",X"CF",X"C3",X"A2",X"32",X"FC", + X"60",X"9F",X"3D",X"53",X"A3",X"32",X"FC",X"5C",X"37",X"A2",X"FB",X"67",X"5C",X"9E",X"9B",X"1C", + X"A2",X"BA",X"FC",X"D9",X"97",X"98",X"FC",X"E0",X"B3",X"8B",X"93",X"B7",X"20",X"5C",X"A2",X"C3", + X"53",X"5C",X"FC",X"BB",X"1C",X"8F",X"56",X"FC",X"E2",X"9F",X"B6",X"DF",X"8F",X"2F",X"FC",X"E2", + X"BB",X"A3",X"37",X"FC",X"5C",X"25",X"9F",X"19",X"31",X"FF",X"A2",X"16",X"FC",X"60",X"BA",X"AE", + X"FF",X"E6",X"A3",X"16",X"FC",X"54",X"8F",X"7F",X"FC",X"8F",X"98",X"FC",X"97",X"BC",X"FC",X"FB", + X"9B",X"E0",X"B3",X"8B",X"93",X"B7",X"20",X"5C",X"6E",X"86",X"A2",X"53",X"FC",X"4B",X"3C",X"01", + X"10",X"CD",X"F2",X"03",X"C7",X"89",X"F2",X"23",X"C7",X"75",X"F3",X"70",X"AC",X"D5",X"48",X"AC", + X"29",X"F9",X"89",X"DA",X"A2",X"F1",X"D0",X"F5",X"32",X"41",X"F1",X"D0",X"F1",X"D0",X"F1",X"10", + X"F3",X"00",X"5C",X"1E",X"C3",X"5C",X"91",X"86",X"1C",X"53",X"5C",X"FC",X"BB",X"E2",X"9E",X"5C", + X"A6",X"BA",X"FB",X"E6",X"5C",X"9E",X"9B",X"5C",X"CE",X"FB",X"A3",X"33",X"FC",X"97",X"21",X"86", + X"8F",X"7B",X"B9",X"5C",X"9C",X"FF",X"A2",X"37",X"FC",X"60",X"9F",X"E2",X"A3",X"AF",X"9F",X"C6", + X"A3",X"5B",X"9D",X"E2",X"9E",X"5C",X"A6",X"9B",X"97",X"CF",X"A2",X"8F",X"2A",X"99",X"5C",X"9C", + X"FF",X"97",X"CD",X"A2",X"8F",X"88",X"B9",X"5C",X"9C",X"FF",X"97",X"F6",X"A2",X"8F",X"B1",X"B9", + X"5C",X"9C",X"FF",X"97",X"DE",X"A2",X"8F",X"30",X"B9",X"5C",X"9C",X"FF",X"E2",X"A7",X"A3",X"17", + X"FC",X"5C",X"83",X"86",X"E2",X"F7",X"A3",X"13",X"FC",X"97",X"73",X"FC",X"E2",X"9F",X"A3",X"57", + X"FC",X"E2",X"9D",X"B3",X"5C",X"DE",X"86",X"FB",X"E6",X"A3",X"BE",X"FC",X"5C",X"4D",X"A6",X"A2", + X"33",X"FC",X"60",X"9F",X"3C",X"5C",X"F7",X"BB",X"18",X"C1",X"AF",X"82",X"A2",X"57",X"FC",X"69", + X"9F",X"E2",X"BA",X"AE",X"BB",X"E2",X"D3",X"5C",X"A6",X"BA",X"A2",X"57",X"FC",X"8F",X"1E",X"FC", + X"5F",X"C8",X"E4",X"78",X"BF",X"C9",X"B2",X"C1",X"A2",X"57",X"FC",X"60",X"9B",X"3C",X"E6",X"A3", + X"57",X"FC",X"5C",X"F7",X"BB",X"18",X"C1",X"AF",X"9A",X"5C",X"4D",X"A6",X"A2",X"33",X"FC",X"60", + X"9F",X"3C",X"B6",X"68",X"5C",X"DE",X"86",X"5C",X"F7",X"BB",X"18",X"D0",X"AF",X"9A",X"B2",X"C6", + X"60",X"82",X"AF",X"BB",X"E2",X"B0",X"B3",X"B6",X"DA",X"5C",X"F7",X"BB",X"18",X"D9",X"AF",X"76", + X"B2",X"E6",X"60",X"90",X"AF",X"BB",X"E2",X"E6",X"B3",X"5C",X"DE",X"86",X"A2",X"13",X"FC",X"60", + X"FB",X"A6",X"DF",X"C6",X"C6",X"A3",X"13",X"FC",X"A3",X"77",X"FC",X"5C",X"F7",X"BB",X"A3",X"3D", + X"B5",X"18",X"D0",X"AE",X"FE",X"18",X"D9",X"AE",X"BE",X"E2",X"F7",X"A3",X"13",X"FC",X"19",X"64", + X"C3",X"A2",X"BE",X"FC",X"4B",X"AF",X"20",X"E2",X"9F",X"A3",X"BE",X"FC",X"B7",X"93",X"FB",X"E6", + X"A2",X"17",X"FC",X"71",X"9F",X"CB",X"A3",X"17",X"FC",X"5C",X"83",X"86",X"A2",X"17",X"FC",X"4B", + X"3C",X"8F",X"77",X"FC",X"C7",X"AF",X"7D",X"A2",X"13",X"FC",X"60",X"FB",X"A6",X"DF",X"C6",X"C6", + X"A3",X"13",X"FC",X"C1",X"5C",X"F7",X"BB",X"18",X"D0",X"AF",X"9A",X"B2",X"C6",X"60",X"82",X"AF", + X"BB",X"E2",X"B0",X"B3",X"B6",X"BE",X"B2",X"E6",X"60",X"90",X"AF",X"BB",X"E2",X"E6",X"B3",X"5C", + X"DE",X"86",X"19",X"80",X"A6",X"A2",X"BE",X"FC",X"A3",X"3D",X"B5",X"4B",X"AF",X"41",X"E2",X"9F", + X"A3",X"BE",X"FC",X"B7",X"D3",X"FB",X"E6",X"A2",X"17",X"FC",X"71",X"9F",X"CB",X"A3",X"17",X"FC", + X"5C",X"83",X"86",X"4B",X"AE",X"9F",X"1C",X"E2",X"9F",X"A3",X"33",X"FC",X"1C",X"45",X"5D",X"4D", + X"8F",X"B1",X"B9",X"A2",X"57",X"FC",X"60",X"BB",X"AF",X"9B",X"8F",X"B3",X"B9",X"60",X"9B",X"AF", + X"9B",X"8F",X"31",X"9D",X"E2",X"DE",X"A3",X"BF",X"FC",X"A2",X"73",X"FC",X"5C",X"78",X"9B",X"0D", + X"1D",X"05",X"1C",X"8F",X"B0",X"9D",X"45",X"53",X"A3",X"FB",X"FC",X"A2",X"12",X"FC",X"E6",X"60", + X"DA",X"A6",X"BB",X"E2",X"9F",X"A3",X"12",X"FC",X"A3",X"BF",X"FC",X"A2",X"17",X"FC",X"5C",X"4B", + X"9B",X"05",X"1C",X"9F",X"BA",X"BA",X"54",X"8F",X"F8",X"FC",X"8F",X"91",X"FC",X"97",X"F5",X"FC", + X"A3",X"3D",X"B5",X"5D",X"FB",X"FB",X"4D",X"8F",X"DD",X"FC",X"B2",X"C1",X"93",X"8B",X"B7",X"20", + X"0D",X"92",X"5C",X"6E",X"86",X"A2",X"53",X"FC",X"60",X"9F",X"AF",X"D6",X"FB",X"FB",X"E0",X"B3", + X"8A",X"92",X"B7",X"20",X"8B",X"93",X"FB",X"FB",X"55",X"97",X"DD",X"FC",X"B2",X"C1",X"93",X"8B", + X"B7",X"20",X"15",X"8A",X"93",X"93",X"93",X"93",X"93",X"93",X"55",X"97",X"FB",X"BF",X"96",X"54", + X"96",X"15",X"1D",X"B7",X"02",X"FB",X"BA",X"DE",X"39",X"F1",X"86",X"1C",X"45",X"55",X"4D",X"8F", + X"FB",X"FC",X"53",X"C1",X"A3",X"53",X"FC",X"97",X"B8",X"FC",X"B2",X"54",X"73",X"DF",X"CB",X"45", + X"4B",X"AE",X"9B",X"E2",X"9F",X"C1",X"05",X"92",X"B2",X"54",X"72",X"FF",X"CB",X"45",X"4B",X"AE", + X"9B",X"E2",X"9F",X"C1",X"05",X"92",X"B2",X"54",X"72",X"9B",X"CB",X"45",X"4B",X"AE",X"9B",X"E2", + X"9F",X"C1",X"05",X"A6",X"9E",X"E0",X"4B",X"AE",X"DF",X"E2",X"9F",X"A3",X"53",X"FC",X"0D",X"15", + X"05",X"1C",X"8A",X"65",X"01",X"30",X"05",X"15",X"24",X"77",X"10",X"11",X"09",X"30",X"05",X"8A", + X"AA",X"34",X"2D",X"15",X"1C",X"05",X"30",X"77",X"77",X"77",X"57",X"8A",X"8A",X"8A",X"41",X"24", + X"1D",X"0D",X"05",X"77",X"2D",X"05",X"21",X"24",X"8A",X"4D",X"8A",X"8A",X"8A",X"5D",X"08",X"77", + X"08",X"77",X"08",X"8A",X"8A",X"8A",X"5D",X"0D",X"09",X"20",X"05",X"77",X"39",X"09",X"1C",X"10", + X"24",X"1D",X"11",X"19",X"77",X"8A",X"71",X"04",X"34",X"77",X"8A",X"5D",X"09",X"30",X"77",X"8A", + X"7D",X"25",X"09",X"00",X"29",X"8A",X"5D",X"8A",X"AA",X"24",X"09",X"77",X"10",X"05",X"2D",X"05", + X"11",X"24",X"77",X"8A",X"AA",X"3D",X"1D",X"24",X"77",X"8A",X"65",X"34",X"04",X"29",X"11",X"3D", + X"77",X"8A",X"5D",X"8A",X"8A",X"2D",X"05",X"24",X"24",X"05",X"30",X"10",X"6B",X"8A",X"AA",X"24", + X"09",X"77",X"05",X"29",X"24",X"05",X"30",X"77",X"1D",X"29",X"1D",X"24",X"1D",X"15",X"2D",X"10", + X"6B",X"8A",X"8A",X"8A",X"4D",X"05",X"3C",X"09",X"30",X"11",X"1D",X"10",X"24",X"10",X"8A",X"8A", + X"53",X"5C",X"D5",X"BB",X"5C",X"CE",X"FB",X"97",X"1B",X"A2",X"8F",X"E9",X"B9",X"5C",X"9C",X"FF", + X"9F",X"9F",X"BA",X"97",X"95",X"FC",X"8F",X"9E",X"99",X"4D",X"5C",X"39",X"A2",X"8F",X"FB",X"BF", + X"96",X"08",X"0D",X"8B",X"8B",X"A2",X"16",X"FC",X"06",X"3C",X"84",X"79",X"9F",X"CB",X"D8",X"B7", + X"2C",X"1C",X"5D",X"55",X"E2",X"9F",X"A3",X"FB",X"FC",X"E6",X"A3",X"BF",X"FC",X"84",X"5C",X"4B", + X"9B",X"E2",X"EA",X"5C",X"78",X"9B",X"9F",X"3D",X"40",X"9E",X"E2",X"9F",X"A3",X"FB",X"FC",X"E2", + X"9E",X"A3",X"BF",X"FC",X"5C",X"5E",X"9B",X"9F",X"AD",X"40",X"9E",X"E2",X"FF",X"A3",X"BF",X"FC", + X"FB",X"9B",X"92",X"B2",X"5C",X"78",X"9B",X"5D",X"9F",X"BD",X"BF",X"9E",X"1D",X"B7",X"01",X"15", + X"1D",X"1C",X"E2",X"9F",X"A3",X"B7",X"FC",X"A3",X"FF",X"DC",X"5C",X"61",X"9F",X"A2",X"3F",X"B5", + X"18",X"C8",X"E2",X"9F",X"AE",X"9F",X"53",X"A3",X"97",X"FC",X"9F",X"F7",X"BF",X"F3",X"9F",X"E2", + X"B7",X"5C",X"C6",X"82",X"9F",X"9F",X"9F",X"D1",X"E2",X"97",X"5C",X"C6",X"82",X"5C",X"37",X"A2", + X"5C",X"38",X"FB",X"5C",X"1D",X"C6",X"FA",X"BE",X"5C",X"19",X"BB",X"B6",X"54",X"A3",X"BE",X"DC", + X"A0",X"A3",X"76",X"FC",X"E2",X"9F",X"8F",X"FF",X"DC",X"C1",X"8B",X"A5",X"8B",X"85",X"A3",X"BD", + X"FC",X"A3",X"B9",X"FC",X"5C",X"56",X"EF",X"01",X"10",X"B1",X"98",X"24",X"2A",X"C0",X"46",X"51", + X"98",X"0F",X"98",X"D7",X"00",X"53",X"8F",X"93",X"FC",X"97",X"FF",X"BF",X"C1",X"96",X"B7",X"64", + X"5C",X"00",X"DF",X"5C",X"38",X"FB",X"53",X"A3",X"4F",X"F8",X"E2",X"BA",X"A3",X"BF",X"FC",X"5C", + X"F7",X"DF",X"5C",X"11",X"DF",X"A2",X"B3",X"FC",X"60",X"9F",X"AE",X"FB",X"5C",X"F6",X"DF",X"5C", + X"70",X"DF",X"E2",X"9F",X"A3",X"4F",X"F8",X"5C",X"C0",X"8A",X"53",X"1C",X"45",X"5D",X"4D",X"A2", + X"E6",X"D8",X"DB",X"DB",X"FB",X"BF",X"D8",X"8F",X"93",X"FC",X"9E",X"E0",X"4B",X"AF",X"9C",X"4D", + X"A2",X"DF",X"DC",X"4B",X"8F",X"DB",X"E6",X"AE",X"9E",X"60",X"9F",X"8F",X"69",X"E6",X"AE",X"BB", + X"B6",X"60",X"18",X"96",X"9E",X"F8",X"8B",X"F9",X"0D",X"4D",X"8B",X"8B",X"85",X"8B",X"A5",X"0D", + X"4D",X"8B",X"8B",X"F8",X"8B",X"F9",X"0D",X"01",X"10",X"53",X"F8",X"80",X"10",X"3C",X"00",X"80", + X"4B",X"AE",X"66",X"4D",X"E6",X"C1",X"9B",X"8B",X"01",X"10",X"53",X"F8",X"80",X"10",X"3C",X"00", + X"80",X"C1",X"9B",X"8B",X"85",X"8B",X"A5",X"0D",X"C7",X"AE",X"55",X"8B",X"E0",X"A3",X"C3",X"FC", + X"5C",X"0D",X"BB",X"0D",X"1D",X"05",X"1C",X"96",X"E6",X"A9",X"E6",X"88",X"E6",X"E4",X"E6",X"13", + X"E6",X"27",X"E6",X"59",X"E6",X"31",X"E6",X"54",X"E6",X"CD",X"7D",X"ED",X"4D",X"F9",X"7D",X"CD", + X"7C",X"F9",X"7D",X"F2",X"6D",X"DD",X"7D",X"CD",X"7C",X"F9",X"7D",X"F5",X"6D",X"D9",X"7D",X"CD", + X"7C",X"F9",X"7D",X"CC",X"6D",X"DD",X"7D",X"CD",X"7C",X"F9",X"7D",X"FB",X"6D",X"E5",X"49",X"ED", + X"4D",X"F8",X"7D",X"F9",X"4D",X"FC",X"7D",X"E8",X"4D",X"F8",X"7D",X"F5",X"4D",X"F8",X"7D",X"FC", + X"7C",X"CD",X"7D",X"F4",X"4D",X"F8",X"49",X"D9",X"7D",X"E0",X"6D",X"C8",X"7C",X"D8",X"7D",X"F3", + X"6D",X"FD",X"C1",X"69",X"C9",X"6D",X"F9",X"6D",X"F9",X"69",X"FD",X"F8",X"4D",X"C8",X"6D",X"F1", + X"4D",X"CC",X"6D",X"F9",X"7D",X"D4",X"6D",X"F8",X"49",X"F3",X"4D",X"FD",X"C9",X"4D",X"CD",X"6D", + X"C8",X"75",X"CD",X"7D",X"F3",X"6D",X"C8",X"75",X"CD",X"7D",X"F7",X"4D",X"DC",X"6D",X"D4",X"4D", + X"CD",X"7F",X"FD",X"CD",X"7D",X"E9",X"6D",X"C8",X"4D",X"C8",X"75",X"CD",X"7D",X"D0",X"6D",X"F8", + X"49",X"FC",X"6D",X"F9",X"7D",X"DB",X"4D",X"C4",X"6D",X"F8",X"69",X"F9",X"7D",X"F3",X"6D",X"FD", + X"DC",X"6D",X"C8",X"75",X"CD",X"7D",X"F8",X"4D",X"C8",X"75",X"CD",X"7D",X"EF",X"4D",X"E0",X"6D", + X"C5",X"4D",X"CF",X"6D",X"CD",X"5F",X"FD",X"DC",X"7D",X"F5",X"6D",X"F5",X"4D",X"C8",X"75",X"F3", + X"4D",X"FD",X"E9",X"7D",X"F5",X"6D",X"F5",X"4D",X"CC",X"75",X"F3",X"7D",X"FD",X"D9",X"7D",X"F5", + X"6D",X"F5",X"4D",X"F3",X"75",X"FD",X"24",X"E6",X"8E",X"C6",X"A3",X"C6",X"C2",X"C6",X"F5",X"C6", + X"C8",X"C6",X"7B",X"C6",X"53",X"C6",X"27",X"C6",X"CD",X"7D",X"FF",X"4D",X"FC",X"7C",X"FC",X"7D", + X"F5",X"4D",X"FC",X"7C",X"FC",X"7D",X"F5",X"4D",X"FC",X"7C",X"FC",X"7D",X"C5",X"4D",X"F8",X"49", + X"F4",X"6D",X"F8",X"49",X"DC",X"6D",X"CD",X"7D",X"FC",X"7C",X"FC",X"7D",X"F5",X"6D",X"D8",X"7C", + X"C9",X"7D",X"C4",X"6D",X"F8",X"49",X"B5",X"4D",X"FD",X"E4",X"69",X"FC",X"6D",X"C9",X"49",X"F8", + X"4D",X"FD",X"DF",X"6D",X"C5",X"4D",X"CD",X"7D",X"E0",X"4D",X"F8",X"49",X"B5",X"6D",X"FD",X"ED", + X"4D",X"C8",X"75",X"CD",X"7D",X"FE",X"4D",X"C8",X"75",X"CD",X"7D",X"D3",X"6D",X"DC",X"7D",X"F1", + X"4D",X"CD",X"7F",X"FD",X"CD",X"7D",X"C8",X"75",X"CD",X"7D",X"C8",X"6D",X"F4",X"4D",X"F8",X"49", + X"CD",X"6D",X"C8",X"75",X"CD",X"7D",X"D0",X"4D",X"E1",X"6D",X"F8",X"69",X"B5",X"4D",X"FD",X"FF", + X"6D",X"CD",X"7D",X"FF",X"4D",X"C8",X"75",X"CD",X"7D",X"ED",X"4D",X"F8",X"69",X"E5",X"6D",X"E5", + X"4D",X"F8",X"49",X"B5",X"6D",X"FD",X"CD",X"4D",X"E0",X"6D",X"CD",X"7D",X"CD",X"4D",X"C8",X"75", + X"CD",X"7D",X"D1",X"4D",X"B5",X"75",X"FD",X"D8",X"7D",X"DC",X"4D",X"C8",X"75",X"D8",X"7D",X"E8", + X"6D",X"DD",X"7F",X"E9",X"6D",X"E9",X"4D",X"ED",X"5F",X"F8",X"4D",X"E6",X"6D",X"B5",X"4D",X"FD", + X"F9",X"7D",X"E8",X"6D",X"F5",X"4D",X"F9",X"7D",X"ED",X"6D",X"F8",X"4D",X"F9",X"7D",X"B5",X"6D", + X"FD",X"8F",X"62",X"99",X"97",X"74",X"C6",X"5C",X"9C",X"FF",X"A2",X"3F",X"B5",X"69",X"F6",X"68", + X"F6",X"DA",X"DA",X"79",X"A3",X"8F",X"62",X"9D",X"5C",X"78",X"9B",X"1C",X"8A",X"55",X"31",X"09", + X"29",X"04",X"10",X"77",X"10",X"1D",X"25",X"29",X"05",X"1C",X"77",X"15",X"24",X"77",X"76",X"76", + X"76",X"76",X"76",X"77",X"34",X"09",X"1D",X"29",X"24",X"10",X"8A",X"8A",X"71",X"B9",X"EF",X"E2", + X"B6",X"71",X"B9",X"B8",X"E2",X"F3",X"71",X"B9",X"A0",X"E2",X"86",X"73",X"B9",X"0A",X"E2",X"8A", + X"71",X"B9",X"11",X"E2",X"B6",X"71",X"B9",X"DB",X"C2",X"B6",X"71",X"B9",X"AA",X"C2",X"B5",X"71", + X"B9",X"B8",X"C2",X"40",X"10",X"1D",X"25",X"29",X"05",X"1C",X"43",X"10",X"77",X"00",X"15",X"24", + X"11",X"3D",X"1D",X"29",X"01",X"8A",X"AA",X"24",X"3D",X"05",X"77",X"00",X"1D",X"24",X"11",X"3D", + X"43",X"10",X"77",X"3D",X"09",X"04",X"10",X"05",X"8A",X"8A",X"6B",X"6B",X"6B",X"77",X"00",X"3D", + X"1D",X"2D",X"05",X"77",X"10",X"3D",X"05",X"43",X"10",X"8A",X"AA",X"77",X"01",X"09",X"29",X"05", + X"77",X"24",X"09",X"77",X"24",X"3D",X"05",X"8A",X"AA",X"77",X"00",X"1D",X"24",X"11",X"3D",X"05", + X"10",X"43",X"77",X"31",X"15",X"2D",X"2D",X"6B",X"8A",X"8A",X"3D",X"05",X"2D",X"34",X"77",X"10", + X"1D",X"25",X"29",X"05",X"1C",X"77",X"34",X"04",X"29",X"11",X"3D",X"8A",X"AA",X"09",X"04",X"24", + X"77",X"15",X"2D",X"2D",X"77",X"09",X"21",X"77",X"24",X"3D",X"05",X"8A",X"AA",X"01",X"09",X"31", + X"2D",X"1D",X"29",X"43",X"10",X"77",X"6B",X"6B",X"6B",X"8A",X"8A",X"31",X"05",X"21",X"09",X"30", + X"05",X"77",X"24",X"3D",X"05",X"1C",X"8A",X"AA",X"25",X"05",X"10",X"24",X"30",X"09",X"1C",X"77", + X"24",X"3D",X"05",X"8A",X"AA",X"21",X"04",X"30",X"29",X"1D",X"10",X"3D",X"1D",X"29",X"01",X"10", + X"6B",X"8A",X"8A",X"31",X"05",X"00",X"15",X"30",X"05",X"77",X"09",X"21",X"77",X"05",X"05",X"30", + X"1D",X"05",X"8A",X"AA",X"10",X"34",X"1D",X"25",X"05",X"30",X"10",X"6B",X"77",X"77",X"77",X"24", + X"3D",X"05",X"1C",X"8A",X"AA",X"15",X"30",X"05",X"77",X"20",X"05",X"30",X"1C",X"77",X"25",X"05", + X"15",X"25",X"2D",X"1C",X"57",X"8A",X"8A",X"34",X"04",X"29",X"11",X"3D",X"77",X"09",X"04",X"24", + X"77",X"31",X"15",X"24",X"10",X"8A",X"AA",X"21",X"09",X"30",X"77",X"31",X"09",X"29",X"04",X"10", + X"77",X"34",X"09",X"1D",X"29",X"24",X"10",X"6B",X"8A",X"8A",X"31",X"04",X"24",X"77",X"00",X"15", + X"24",X"11",X"3D",X"77",X"09",X"04",X"24",X"6B",X"8A",X"AA",X"24",X"3D",X"05",X"1C",X"77",X"11", + X"15",X"29",X"77",X"19",X"1D",X"2D",X"2D",X"57",X"8A",X"8A",X"34",X"04",X"29",X"11",X"3D",X"77", + X"00",X"1D",X"24",X"11",X"3D",X"77",X"24",X"09",X"8A",X"AA",X"10",X"2D",X"09",X"00",X"77",X"3D", + X"05",X"30",X"77",X"30",X"05",X"2D",X"05",X"29",X"24",X"4F",X"8A",X"AA",X"2D",X"05",X"10",X"10", + X"77",X"34",X"04",X"30",X"10",X"04",X"1D",X"24",X"6B",X"8A",X"8A",X"AA",X"47",X"FC",X"F8",X"8B", + X"FB",X"BF",X"4D",X"AA",X"03",X"FC",X"9E",X"AB",X"03",X"FC",X"1D",X"4C",X"99",X"47",X"FC",X"A4", + X"60",X"B7",X"39",X"48",X"FB",X"84",X"60",X"AF",X"39",X"48",X"FB",X"97",X"BE",X"E8",X"96",X"E4", + X"69",X"C2",X"C9",X"5C",X"79",X"9E",X"5C",X"48",X"FB",X"15",X"0C",X"45",X"55",X"4D",X"8F",X"6B", + X"F8",X"53",X"62",X"AE",X"9B",X"C7",X"B6",X"EA",X"8F",X"6F",X"F8",X"53",X"E7",X"18",X"F9",X"AE", + X"BB",X"E2",X"DF",X"A3",X"BF",X"FC",X"AA",X"A6",X"FC",X"F0",X"8B",X"F1",X"8B",X"55",X"F0",X"8B", + X"F1",X"8B",X"A2",X"BF",X"FC",X"4B",X"E0",X"AF",X"FB",X"8B",X"AB",X"A6",X"FC",X"E2",X"DF",X"A3", + X"6B",X"F8",X"0D",X"5C",X"9C",X"FF",X"0D",X"15",X"05",X"1C",X"97",X"F1",X"BB",X"8F",X"80",X"C2", + X"9F",X"DA",X"40",X"10",X"C8",X"19",X"51",X"C9",X"19",X"73",X"DB",X"BF",X"98",X"D6",X"30",X"77"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..f3b27c53 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"05",X"02",X"00",X"01",X"03",X"06",X"04",X"07",X"08",X"09",X"0B",X"0A",X"0C",X"0E",X"0D",X"08", + X"0B",X"0F",X"0A",X"10",X"3C",X"80",X"5C",X"81",X"A6",X"82",X"8C",X"83",X"B2",X"84",X"F6",X"85", + X"BE",X"86",X"02",X"88",X"28",X"89",X"8E",X"8A",X"C6",X"8B",X"44",X"8D",X"AC",X"8E",X"F6",X"8F", + X"FE",X"90",X"10",X"92",X"7A",X"93",X"7A",X"93",X"7A",X"93",X"7A",X"93",X"01",X"05",X"0F",X"17", + X"3B",X"17",X"01",X"14",X"0F",X"17",X"3B",X"17",X"00",X"01",X"05",X"38",X"17",X"3A",X"17",X"01", + X"07",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"0B",X"38",X"17",X"3A",X"17",X"38",X"17",X"00", + X"01",X"05",X"0F",X"17",X"3B",X"17",X"01",X"14",X"0F",X"17",X"3B",X"17",X"00",X"01",X"05",X"0F", + X"17",X"3B",X"17",X"01",X"14",X"0F",X"17",X"3B",X"17",X"00",X"01",X"05",X"0F",X"17",X"3B",X"17", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"3A",X"17",X"38", + X"17",X"01",X"07",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"3A", + X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"3A",X"17",X"01",X"0D",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"01",X"07",X"38",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"38",X"17",X"3A", + X"17",X"01",X"03",X"38",X"17",X"01",X"07",X"0F",X"17",X"01",X"06",X"38",X"17",X"3A",X"17",X"01", + X"04",X"38",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06", + X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01", + X"05",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"01",X"04",X"0F",X"17",X"01",X"04",X"38", + X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F", + X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"06",X"38",X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01", + X"03",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F", + X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17", + X"3B",X"17",X"01",X"02",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01", + X"0A",X"38",X"17",X"01",X"04",X"0F",X"17",X"01",X"07",X"38",X"17",X"3A",X"17",X"01",X"03",X"38", + X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"02",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"05",X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"01",X"04", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"38",X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"01", + X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"01",X"08",X"38",X"17",X"00",X"01",X"08", + X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B", + X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0A", + X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F", + X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01", + X"0A",X"38",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"09",X"38",X"17",X"0F",X"17",X"01",X"07",X"38",X"17",X"3A",X"17",X"01",X"06",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01",X"11",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"06",X"38",X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"08",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"06", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"0F",X"17", + X"3B",X"17",X"01",X"08",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"0F",X"17",X"01", + X"06",X"38",X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"3A",X"17",X"01",X"08",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0F",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"14",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01", + X"09",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01", + X"04",X"38",X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"14",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"14",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"0F",X"17",X"3B",X"17",X"01",X"10", + X"0F",X"17",X"3B",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"38",X"17",X"3A",X"17",X"01", + X"05",X"38",X"17",X"01",X"07",X"0F",X"17",X"01",X"04",X"38",X"17",X"3A",X"17",X"01",X"06",X"38", + X"17",X"00",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"04",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38", + X"17",X"3A",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"01",X"0B",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"09",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"01",X"05",X"0F",X"17",X"01", + X"06",X"38",X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17", + X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17", + X"00",X"FF",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"08",X"38",X"17",X"3A",X"17",X"38",X"17",X"01",X"08",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F", + X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"08", + X"0F",X"17",X"3B",X"17",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B", + X"17",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"05", + X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"05",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"01",X"04",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"03",X"38", + X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"10", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"09", + X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"38",X"17",X"3A", + X"17",X"38",X"17",X"01",X"07",X"0F",X"17",X"01",X"06",X"38",X"17",X"3A",X"17",X"01",X"03",X"38", + X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"09",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"04", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"0A",X"38",X"17",X"01", + X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"01",X"08",X"38",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B", + X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"10", + X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38", + X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"01",X"0D",X"38",X"17",X"00",X"01",X"0B",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"01",X"05", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"07",X"38",X"17",X"0F",X"17",X"01",X"09",X"38",X"17",X"3A", + X"17",X"01",X"06",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"11",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01",X"11",X"0F",X"17",X"3B",X"17", + X"01",X"04",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"38",X"17",X"0F",X"17",X"01",X"0D",X"38", + X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"05",X"38",X"17",X"00",X"01",X"16",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"16",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17", + X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"38",X"17",X"0F",X"17",X"01",X"05",X"38", + X"17",X"3A",X"17",X"01",X"0C",X"38",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"0F",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"04", + X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"38",X"17",X"3A", + X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"01",X"04",X"0F",X"17",X"01", + X"02",X"38",X"17",X"3A",X"17",X"01",X"09",X"38",X"17",X"00",X"01",X"04",X"0F",X"17",X"3B",X"17", + X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17", + X"01",X"05",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0A",X"38", + X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"04",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00", + X"01",X"0C",X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0C",X"0F", + X"17",X"3B",X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"08",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F", + X"17",X"01",X"07",X"38",X"17",X"01",X"02",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"03",X"38", + X"17",X"0F",X"17",X"01",X"06",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0E", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"07", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"05",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A", + X"17",X"01",X"03",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"09",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17", + X"00",X"FF",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"0F", + X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01", + X"08",X"38",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"10", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"08",X"38",X"17",X"0F", + X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01", + X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F", + X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"0F",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"01",X"07",X"38", + X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"05",X"38",X"17",X"3A",X"17",X"01", + X"09",X"38",X"17",X"00",X"01",X"12",X"0F",X"17",X"3B",X"17",X"00",X"01",X"12",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"02",X"38", + X"17",X"01",X"02",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01", + X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38", + X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"10", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"01",X"04",X"0F",X"17",X"01",X"0B",X"38", + X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17", + X"3B",X"17",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B", + X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"01",X"02",X"3B",X"17", + X"01",X"0C",X"0F",X"17",X"3B",X"17",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38", + X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"02",X"38", + X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"05",X"38",X"17",X"0F", + X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"16", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"16",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"0C", + X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"38",X"17",X"3A", + X"17",X"38",X"17",X"01",X"05",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A", + X"17",X"01",X"06",X"38",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"04", + X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"38",X"17",X"3A", + X"17",X"01",X"08",X"38",X"17",X"0F",X"17",X"01",X"0A",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A", + X"17",X"38",X"17",X"00",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04", + X"0F",X"17",X"3B",X"17",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"06",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"04",X"38",X"17",X"3A",X"17",X"38", + X"17",X"01",X"02",X"0F",X"17",X"01",X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"06",X"38", + X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01", + X"0A",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A", + X"17",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17", + X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A", + X"17",X"01",X"06",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38", + X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"06", + X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B", + X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"0C", + X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0F",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"01",X"04",X"0F", + X"17",X"38",X"17",X"3A",X"17",X"01",X"09",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0F",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17", + X"01",X"07",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38", + X"17",X"01",X"03",X"0F",X"17",X"01",X"05",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"0A",X"0F",X"17",X"3B",X"17", + X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"01",X"0F",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"01",X"02",X"3B",X"17",X"01",X"08",X"0F",X"17", + X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"0F",X"17",X"01", + X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"01",X"04",X"0F", + X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"09",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"09",X"0F",X"17", + X"3B",X"17",X"01",X"05",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38", + X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"00",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"16",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01", + X"16",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"16",X"0F",X"17", + X"3B",X"17",X"00",X"FF",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01", + X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"01",X"03",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01", + X"03",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"05",X"0F",X"17",X"3B",X"17",X"01",X"0F",X"0F",X"17",X"3B",X"17", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38", + X"17",X"01",X"03",X"0F",X"17",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F", + X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"38",X"17",X"00", + X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"0F", + X"17",X"3B",X"17",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"05",X"0F",X"17",X"3B",X"17",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"05",X"38", + X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"01", + X"02",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01", + X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17", + X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"09",X"38",X"17",X"3A",X"17",X"38",X"17",X"01",X"05",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01", + X"0A",X"38",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09", + X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"03",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38", + X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F", + X"17",X"38",X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"00", + X"01",X"03",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03", + X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"01",X"08",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"05",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A", + X"17",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A", + X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"0B",X"0F",X"17", + X"3B",X"17",X"01",X"08",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"01", + X"08",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"01",X"08",X"0F",X"17", + X"3B",X"17",X"01",X"05",X"0F",X"17",X"3B",X"17",X"00",X"01",X"07",X"38",X"17",X"0F",X"17",X"38", + X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"01",X"05",X"0F",X"17",X"01",X"04",X"38",X"17",X"01", + X"02",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"1A",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"1A",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"16", + X"0F",X"17",X"01",X"02",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"01",X"02",X"0F", + X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F", + X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"16",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B", + X"17",X"01",X"16",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"16", + X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"12",X"0F",X"17",X"3B",X"17",X"00",X"01",X"07",X"38", + X"17",X"0F",X"17",X"38",X"17",X"01",X"03",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F", + X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"12",X"0F",X"17",X"3B",X"17",X"00",X"01",X"12",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"07",X"38",X"17",X"3A", + X"17",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F", + X"17",X"01",X"05",X"38",X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0D",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38", + X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"01",X"03",X"0F", + X"17",X"01",X"07",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"05",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"01",X"03",X"38", + X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"01", + X"02",X"0F",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"09", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01", + X"06",X"38",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"05",X"38",X"17",X"00",X"01",X"09", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38", + X"17",X"01",X"04",X"38",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"01",X"02",X"3B",X"17", + X"00",X"01",X"03",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38", + X"17",X"01",X"03",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38", + X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38", + X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"38", + X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"07",X"38",X"17",X"0F",X"17",X"01", + X"03",X"38",X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"00",X"FF", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38", + X"17",X"3A",X"17",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"38", + X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"04",X"38", + X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B", + X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"04", + X"0F",X"17",X"3B",X"17",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"07",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"01",X"02",X"0F", + X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"01", + X"08",X"38",X"17",X"00",X"01",X"07",X"0F",X"17",X"3B",X"17",X"01",X"0B",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"07",X"0F",X"17",X"3B",X"17",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"0B",X"0F",X"17",X"3B",X"17", + X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"01", + X"02",X"0F",X"17",X"01",X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F", + X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"03",X"38",X"17",X"01",X"03",X"0F", + X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17", + X"01",X"0A",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"05",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F", + X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01", + X"03",X"38",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"0E",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0E",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"01",X"03",X"0F",X"17",X"3B",X"17", + X"01",X"03",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"38",X"17",X"01",X"02",X"0F",X"17",X"01", + X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38", + X"17",X"3A",X"17",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"06",X"38",X"17",X"00",X"01",X"0A", + X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0A",X"0F",X"17",X"3B", + X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"01",X"07", + X"0F",X"17",X"3B",X"17",X"01",X"03",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0D",X"38",X"17",X"01", + X"03",X"0F",X"17",X"01",X"06",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"03",X"38", + X"17",X"00",X"01",X"16",X"0F",X"17",X"3B",X"17",X"00",X"01",X"16",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"12",X"0F",X"17",X"3B",X"17",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38", + X"17",X"01",X"03",X"0F",X"17",X"01",X"06",X"38",X"17",X"0F",X"17",X"38",X"17",X"01",X"02",X"0F", + X"17",X"01",X"04",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"00",X"01",X"03",X"0F",X"17", + X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01", + X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17", + X"3B",X"17",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"15",X"70",X"12",X"74",X"0F",X"78",X"15",X"7C",X"15",X"80", + X"15",X"84",X"0F",X"88",X"03",X"8C",X"17",X"90",X"15",X"94",X"16",X"98",X"0F",X"9C",X"07",X"A0", + X"17",X"A4",X"0F",X"A8",X"03",X"AC",X"15",X"B0",X"18",X"B4",X"17",X"B8",X"16",X"BC",X"16",X"95", + X"76",X"95",X"26",X"95",X"36",X"95",X"86",X"95",X"56",X"95",X"96",X"95",X"46",X"95",X"B6",X"95", + X"A6",X"95",X"66",X"95",X"C6",X"95",X"D6",X"95",X"F6",X"95",X"E6",X"95",X"B6",X"95",X"66",X"95", + X"06",X"96",X"C6",X"95",X"16",X"96",X"34",X"18",X"07",X"A8",X"34",X"18",X"87",X"A8",X"34",X"18", + X"07",X"88",X"34",X"18",X"8F",X"48",X"34",X"18",X"8F",X"A8",X"34",X"18",X"8F",X"88",X"34",X"18", + X"27",X"68",X"34",X"18",X"08",X"48",X"34",X"18",X"AF",X"A8",X"34",X"18",X"3F",X"88",X"34",X"18", + X"87",X"68",X"34",X"18",X"67",X"28",X"34",X"18",X"97",X"88",X"34",X"18",X"B7",X"68",X"34",X"18", + X"6F",X"48",X"34",X"18",X"97",X"28",X"34",X"18",X"B7",X"A8",X"34",X"18",X"3F",X"88",X"34",X"18", + X"97",X"68",X"34",X"18",X"2F",X"48",X"34",X"18",X"9F",X"88",X"34",X"18",X"1F",X"68",X"34",X"18", + X"9F",X"48",X"34",X"18",X"BF",X"28",X"34",X"18",X"97",X"A8",X"34",X"18",X"07",X"88",X"34",X"18", + X"C7",X"68",X"34",X"18",X"3F",X"48",X"34",X"18",X"C7",X"A8",X"34",X"18",X"3F",X"88",X"34",X"18", + X"4F",X"68",X"34",X"18",X"87",X"48",X"34",X"18",X"5F",X"88",X"34",X"18",X"27",X"68",X"34",X"18", + X"C7",X"48",X"34",X"18",X"27",X"48",X"34",X"18",X"57",X"A8",X"34",X"18",X"8F",X"88",X"34",X"18", + X"77",X"68",X"34",X"18",X"4F",X"48",X"34",X"18",X"AF",X"88",X"34",X"18",X"27",X"88",X"34",X"18", + X"B7",X"48",X"34",X"18",X"27",X"48",X"34",X"18",X"AF",X"88",X"34",X"18",X"1F",X"68",X"34",X"18", + X"AF",X"48",X"34",X"18",X"CF",X"28",X"34",X"18",X"6F",X"A8",X"34",X"18",X"27",X"68",X"34",X"18", + X"27",X"48",X"34",X"18",X"3F",X"28",X"34",X"18",X"9F",X"A8",X"34",X"18",X"47",X"88",X"34",X"18", + X"7F",X"68",X"34",X"18",X"2F",X"48",X"34",X"18",X"27",X"88",X"34",X"18",X"27",X"48",X"34",X"18", + X"5F",X"48",X"34",X"18",X"27",X"28",X"34",X"18",X"9F",X"A8",X"34",X"18",X"1F",X"88",X"34",X"18", + X"B7",X"88",X"34",X"18",X"67",X"48",X"34",X"18",X"9F",X"A8",X"34",X"18",X"37",X"68",X"34",X"18", + X"97",X"68",X"34",X"18",X"77",X"48",X"4E",X"96",X"11",X"98",X"8B",X"96",X"D7",X"96",X"58",X"98", + X"74",X"97",X"A4",X"98",X"23",X"97",X"46",X"99",X"F5",X"98",X"C0",X"97",X"97",X"99",X"E8",X"99", + X"8A",X"9A",X"39",X"9A",X"7D",X"9B",X"CE",X"9B",X"DB",X"9A",X"1F",X"9C",X"2C",X"9B",X"01",X"25", + X"41",X"15",X"70",X"01",X"35",X"41",X"15",X"70",X"01",X"B9",X"41",X"15",X"70",X"01",X"28",X"42", + X"15",X"70",X"01",X"39",X"42",X"15",X"70",X"01",X"A1",X"42",X"15",X"70",X"01",X"B9",X"42",X"15", + X"70",X"01",X"29",X"43",X"15",X"70",X"00",X"58",X"41",X"0F",X"30",X"00",X"CE",X"41",X"0F",X"30", + X"00",X"4E",X"42",X"0F",X"30",X"00",X"57",X"43",X"0F",X"30",X"FF",X"01",X"20",X"41",X"0F",X"78", + X"01",X"2A",X"41",X"0F",X"78",X"01",X"2F",X"41",X"0F",X"78",X"01",X"A0",X"41",X"0F",X"78",X"01", + X"2D",X"42",X"0F",X"78",X"01",X"A8",X"42",X"0F",X"78",X"01",X"B3",X"42",X"0F",X"78",X"01",X"21", + X"43",X"0F",X"78",X"00",X"48",X"41",X"0F",X"30",X"00",X"55",X"41",X"0F",X"30",X"00",X"58",X"41", + X"0F",X"30",X"00",X"4A",X"42",X"0F",X"30",X"00",X"4E",X"43",X"0F",X"30",X"00",X"51",X"43",X"0F", + X"30",X"00",X"54",X"43",X"0F",X"30",X"FF",X"01",X"25",X"41",X"15",X"7C",X"01",X"31",X"41",X"15", + X"7C",X"01",X"A3",X"41",X"15",X"7C",X"01",X"AD",X"41",X"15",X"7C",X"01",X"B2",X"41",X"15",X"7C", + X"01",X"2A",X"42",X"15",X"7C",X"01",X"AA",X"42",X"15",X"7C",X"01",X"B0",X"42",X"15",X"7C",X"00", + X"44",X"41",X"0F",X"30",X"00",X"44",X"42",X"0F",X"30",X"00",X"C5",X"42",X"0F",X"30",X"00",X"D6", + X"42",X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"55",X"43",X"0F",X"30",X"00",X"58",X"43", + X"0F",X"30",X"FF",X"01",X"21",X"41",X"03",X"8C",X"01",X"35",X"41",X"03",X"8C",X"01",X"A4",X"41", + X"03",X"8C",X"01",X"AF",X"41",X"03",X"8C",X"01",X"34",X"42",X"03",X"8C",X"01",X"A1",X"42",X"03", + X"8C",X"01",X"B9",X"42",X"03",X"8C",X"01",X"28",X"43",X"03",X"8C",X"00",X"C7",X"41",X"0F",X"30", + X"00",X"44",X"42",X"0F",X"30",X"00",X"49",X"42",X"0F",X"30",X"00",X"4F",X"42",X"0F",X"30",X"00", + X"4B",X"43",X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"56",X"43",X"0F",X"30",X"00",X"59", + X"43",X"0F",X"30",X"FF",X"01",X"2A",X"41",X"15",X"84",X"01",X"34",X"41",X"15",X"84",X"01",X"A1", + X"41",X"15",X"84",X"01",X"B6",X"41",X"15",X"84",X"01",X"29",X"42",X"15",X"84",X"01",X"AB",X"42", + X"15",X"84",X"01",X"B8",X"42",X"15",X"84",X"01",X"26",X"43",X"15",X"84",X"00",X"C6",X"41",X"0F", + X"30",X"00",X"58",X"42",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"4F",X"43",X"0F",X"30", + X"00",X"50",X"43",X"0F",X"30",X"00",X"53",X"43",X"0F",X"30",X"00",X"56",X"43",X"0F",X"30",X"FF", + X"01",X"28",X"41",X"16",X"98",X"01",X"31",X"41",X"16",X"98",X"01",X"B1",X"41",X"16",X"98",X"01", + X"2A",X"42",X"16",X"98",X"01",X"2F",X"42",X"16",X"98",X"01",X"A5",X"42",X"16",X"98",X"01",X"B9", + X"42",X"16",X"98",X"01",X"21",X"43",X"16",X"98",X"00",X"C4",X"42",X"0F",X"30",X"00",X"C7",X"42", + X"0F",X"30",X"00",X"D3",X"42",X"0F",X"30",X"00",X"D6",X"42",X"0F",X"30",X"00",X"44",X"43",X"0F", + X"30",X"00",X"47",X"43",X"0F",X"30",X"00",X"4B",X"43",X"0F",X"30",X"00",X"4F",X"43",X"0F",X"30", + X"FF",X"01",X"21",X"41",X"12",X"74",X"01",X"A3",X"41",X"12",X"74",X"01",X"AB",X"41",X"12",X"74", + X"01",X"B9",X"41",X"12",X"74",X"01",X"28",X"42",X"12",X"74",X"01",X"A1",X"42",X"12",X"74",X"01", + X"B9",X"42",X"12",X"74",X"01",X"29",X"43",X"12",X"74",X"00",X"CE",X"41",X"0F",X"30",X"00",X"D3", + X"41",X"0F",X"30",X"00",X"CD",X"42",X"0F",X"30",X"00",X"D2",X"42",X"0F",X"30",X"00",X"4C",X"43", + X"0F",X"30",X"00",X"55",X"43",X"0F",X"30",X"FF",X"01",X"2A",X"41",X"15",X"80",X"01",X"2F",X"41", + X"15",X"80",X"01",X"33",X"41",X"15",X"80",X"01",X"B1",X"41",X"15",X"80",X"01",X"2D",X"42",X"15", + X"80",X"01",X"39",X"42",X"15",X"80",X"01",X"A4",X"42",X"15",X"80",X"01",X"2F",X"43",X"15",X"80", + X"00",X"45",X"41",X"0F",X"30",X"00",X"48",X"41",X"0F",X"30",X"00",X"C6",X"41",X"0F",X"30",X"00", + X"52",X"42",X"0F",X"30",X"00",X"D4",X"42",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"53", + X"43",X"0F",X"30",X"FF",X"01",X"21",X"41",X"0F",X"88",X"01",X"33",X"41",X"0F",X"88",X"01",X"A5", + X"41",X"0F",X"88",X"01",X"B5",X"41",X"0F",X"88",X"01",X"35",X"42",X"0F",X"88",X"01",X"AB",X"42", + X"0F",X"88",X"01",X"B0",X"42",X"0F",X"88",X"01",X"24",X"43",X"0F",X"88",X"00",X"45",X"41",X"0F", + X"30",X"00",X"C4",X"42",X"0F",X"30",X"00",X"C7",X"42",X"0F",X"30",X"00",X"D6",X"42",X"0F",X"30", + X"00",X"47",X"43",X"0F",X"30",X"00",X"4D",X"43",X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00", + X"56",X"43",X"0F",X"30",X"FF",X"01",X"20",X"41",X"15",X"94",X"01",X"32",X"41",X"15",X"94",X"01", + X"A1",X"41",X"15",X"94",X"01",X"AA",X"41",X"15",X"94",X"01",X"28",X"42",X"15",X"94",X"01",X"35", + X"42",X"15",X"94",X"01",X"A0",X"42",X"15",X"94",X"01",X"B5",X"42",X"15",X"94",X"00",X"46",X"41", + X"0F",X"30",X"00",X"49",X"41",X"0F",X"30",X"00",X"50",X"41",X"0F",X"30",X"00",X"55",X"41",X"0F", + X"30",X"00",X"D8",X"41",X"0F",X"30",X"00",X"44",X"42",X"0F",X"30",X"00",X"4B",X"42",X"0F",X"30", + X"00",X"C8",X"42",X"0F",X"30",X"FF",X"01",X"21",X"41",X"17",X"90",X"01",X"32",X"41",X"17",X"90", + X"01",X"26",X"42",X"17",X"90",X"01",X"36",X"42",X"17",X"90",X"01",X"A0",X"42",X"17",X"90",X"01", + X"B0",X"42",X"17",X"90",X"01",X"21",X"43",X"17",X"90",X"01",X"31",X"43",X"17",X"90",X"00",X"55", + X"41",X"0F",X"30",X"00",X"58",X"41",X"0F",X"30",X"00",X"55",X"42",X"0F",X"30",X"00",X"44",X"43", + X"0F",X"30",X"00",X"4A",X"43",X"0F",X"30",X"00",X"4D",X"43",X"0F",X"30",X"00",X"50",X"43",X"0F", + X"30",X"00",X"53",X"43",X"0F",X"30",X"FF",X"01",X"2B",X"41",X"0F",X"9C",X"01",X"39",X"41",X"0F", + X"9C",X"01",X"A5",X"41",X"0F",X"9C",X"01",X"AF",X"41",X"0F",X"9C",X"01",X"20",X"42",X"0F",X"9C", + X"01",X"36",X"42",X"0F",X"9C",X"01",X"A5",X"42",X"0F",X"9C",X"01",X"2B",X"43",X"0F",X"9C",X"00", + X"54",X"41",X"0F",X"30",X"00",X"57",X"41",X"0F",X"30",X"00",X"44",X"43",X"0F",X"30",X"00",X"47", + X"43",X"0F",X"30",X"00",X"4A",X"43",X"0F",X"30",X"00",X"4D",X"43",X"0F",X"30",X"00",X"50",X"43", + X"0F",X"30",X"00",X"53",X"43",X"0F",X"30",X"FF",X"01",X"24",X"41",X"07",X"A0",X"01",X"33",X"41", + X"07",X"A0",X"01",X"39",X"41",X"07",X"A0",X"01",X"A8",X"41",X"07",X"A0",X"01",X"B9",X"41",X"07", + X"A0",X"01",X"20",X"42",X"07",X"A0",X"01",X"AE",X"42",X"07",X"A0",X"01",X"24",X"43",X"07",X"A0", + X"00",X"55",X"41",X"0F",X"30",X"00",X"CA",X"41",X"0F",X"30",X"00",X"43",X"42",X"0F",X"30",X"00", + X"C7",X"42",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"4E",X"43",X"0F",X"30",X"00",X"50", + X"43",X"0F",X"30",X"00",X"52",X"43",X"0F",X"30",X"FF",X"01",X"25",X"41",X"0F",X"A8",X"01",X"39", + X"41",X"0F",X"A8",X"01",X"A0",X"41",X"0F",X"A8",X"01",X"B9",X"41",X"0F",X"A8",X"01",X"38",X"42", + X"0F",X"A8",X"01",X"AB",X"42",X"0F",X"A8",X"01",X"B8",X"42",X"0F",X"A8",X"01",X"22",X"43",X"0F", + X"A8",X"00",X"C7",X"41",X"0F",X"30",X"00",X"D8",X"41",X"0F",X"30",X"00",X"49",X"42",X"0F",X"30", + X"00",X"D2",X"42",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"4F",X"43",X"0F",X"30",X"00", + X"53",X"43",X"0F",X"30",X"00",X"56",X"43",X"0F",X"30",X"FF",X"01",X"39",X"41",X"17",X"A4",X"01", + X"B6",X"41",X"17",X"A4",X"01",X"2E",X"42",X"17",X"A4",X"01",X"39",X"42",X"17",X"A4",X"01",X"A0", + X"42",X"17",X"A4",X"01",X"B0",X"42",X"17",X"A4",X"01",X"B9",X"42",X"17",X"A4",X"01",X"21",X"43", + X"17",X"A4",X"00",X"4F",X"41",X"0F",X"30",X"00",X"50",X"41",X"0F",X"30",X"00",X"55",X"41",X"0F", + X"30",X"00",X"CE",X"41",X"0F",X"30",X"00",X"44",X"43",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30", + X"00",X"4F",X"43",X"0F",X"30",X"00",X"51",X"43",X"0F",X"30",X"FF",X"01",X"28",X"41",X"18",X"B4", + X"01",X"32",X"41",X"18",X"B4",X"01",X"AD",X"41",X"18",X"B4",X"01",X"2B",X"42",X"18",X"B4",X"01", + X"2E",X"42",X"18",X"B4",X"01",X"A5",X"42",X"18",X"B4",X"01",X"B4",X"42",X"18",X"B4",X"01",X"22", + X"43",X"18",X"B4",X"00",X"D6",X"41",X"0F",X"30",X"00",X"46",X"43",X"0F",X"30",X"00",X"49",X"43", + X"0F",X"30",X"00",X"51",X"43",X"0F",X"30",X"00",X"52",X"43",X"0F",X"30",X"00",X"55",X"43",X"0F", + X"30",X"00",X"58",X"43",X"0F",X"30",X"00",X"59",X"43",X"0F",X"30",X"FF",X"01",X"21",X"41",X"16", + X"BC",X"01",X"39",X"41",X"16",X"BC",X"01",X"A4",X"41",X"16",X"BC",X"01",X"B8",X"41",X"16",X"BC", + X"01",X"21",X"42",X"16",X"BC",X"01",X"39",X"42",X"16",X"BC",X"01",X"AD",X"42",X"16",X"BC",X"01", + X"2D",X"43",X"16",X"BC",X"00",X"C8",X"41",X"0F",X"30",X"00",X"D7",X"41",X"0F",X"30",X"00",X"CC", + X"42",X"0F",X"30",X"00",X"4B",X"43",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"4F",X"43", + X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"51",X"43",X"0F",X"30",X"FF",X"01",X"21",X"41", + X"03",X"AC",X"01",X"32",X"41",X"03",X"AC",X"01",X"26",X"42",X"03",X"AC",X"01",X"36",X"42",X"03", + X"AC",X"01",X"A0",X"42",X"03",X"AC",X"01",X"B0",X"42",X"03",X"AC",X"01",X"21",X"43",X"03",X"AC", + X"01",X"31",X"43",X"03",X"AC",X"00",X"55",X"41",X"0F",X"30",X"00",X"58",X"41",X"0F",X"30",X"00", + X"55",X"42",X"0F",X"30",X"00",X"44",X"43",X"0F",X"30",X"00",X"4A",X"43",X"0F",X"30",X"00",X"4D", + X"43",X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"53",X"43",X"0F",X"30",X"FF",X"01",X"28", + X"41",X"15",X"B0",X"01",X"31",X"41",X"15",X"B0",X"01",X"B1",X"41",X"15",X"B0",X"01",X"2A",X"42", + X"15",X"B0",X"01",X"2F",X"42",X"15",X"B0",X"01",X"A5",X"42",X"15",X"B0",X"01",X"B9",X"42",X"15", + X"B0",X"01",X"21",X"43",X"15",X"B0",X"00",X"C4",X"42",X"0F",X"30",X"00",X"C7",X"42",X"0F",X"30", + X"00",X"D3",X"42",X"0F",X"30",X"00",X"D6",X"42",X"0F",X"30",X"00",X"44",X"43",X"0F",X"30",X"00", + X"47",X"43",X"0F",X"30",X"00",X"4B",X"43",X"0F",X"30",X"00",X"4F",X"43",X"0F",X"30",X"FF",X"01", + X"2B",X"41",X"17",X"B8",X"01",X"39",X"41",X"17",X"B8",X"01",X"A5",X"41",X"17",X"B8",X"01",X"AF", + X"41",X"17",X"B8",X"01",X"20",X"42",X"17",X"B8",X"01",X"36",X"42",X"17",X"B8",X"01",X"A5",X"42", + X"17",X"B8",X"01",X"2B",X"43",X"17",X"B8",X"00",X"54",X"41",X"0F",X"30",X"00",X"57",X"41",X"0F", + X"30",X"00",X"44",X"43",X"0F",X"30",X"00",X"47",X"43",X"0F",X"30",X"00",X"4A",X"43",X"0F",X"30", + X"00",X"4D",X"43",X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"53",X"43",X"0F",X"30",X"FF", + X"2C",X"9D",X"E2",X"9C",X"98",X"9C",X"BD",X"9C",X"07",X"9D",X"76",X"9D",X"51",X"9D",X"9B",X"9D", + X"C0",X"9D",X"E5",X"9D",X"2F",X"9E",X"0A",X"9E",X"54",X"9E",X"9E",X"9E",X"79",X"9E",X"C0",X"9D", + X"2F",X"9E",X"C3",X"9E",X"0A",X"9E",X"E8",X"9E",X"08",X"00",X"21",X"43",X"FF",X"40",X"00",X"A8", + X"42",X"98",X"00",X"B3",X"42",X"FF",X"68",X"00",X"2D",X"42",X"FF",X"00",X"00",X"A0",X"41",X"FF", + X"00",X"00",X"20",X"41",X"50",X"00",X"2A",X"41",X"78",X"00",X"2F",X"41",X"FF",X"FF",X"50",X"00", + X"AA",X"42",X"80",X"00",X"B0",X"42",X"FF",X"50",X"00",X"2A",X"42",X"FF",X"18",X"00",X"A3",X"41", + X"68",X"00",X"AD",X"41",X"90",X"00",X"B2",X"41",X"FF",X"28",X"00",X"25",X"41",X"88",X"00",X"31", + X"41",X"FF",X"48",X"00",X"29",X"43",X"FF",X"08",X"00",X"A1",X"42",X"C8",X"00",X"B9",X"42",X"FF", + X"40",X"00",X"28",X"42",X"FF",X"18",X"00",X"A3",X"41",X"58",X"00",X"AB",X"41",X"C8",X"00",X"B9", + X"41",X"FF",X"08",X"00",X"21",X"41",X"FF",X"78",X"00",X"2F",X"43",X"FF",X"20",X"00",X"A4",X"42", + X"FF",X"68",X"00",X"2D",X"42",X"C8",X"00",X"39",X"42",X"FF",X"88",X"00",X"B1",X"41",X"FF",X"50", + X"00",X"2A",X"41",X"78",X"00",X"2F",X"41",X"98",X"00",X"33",X"41",X"FF",X"48",X"00",X"29",X"43", + X"FF",X"08",X"00",X"A1",X"42",X"C8",X"00",X"B9",X"42",X"FF",X"40",X"00",X"28",X"42",X"C8",X"00", + X"39",X"42",X"FF",X"C8",X"00",X"B9",X"41",X"FF",X"28",X"00",X"25",X"41",X"A8",X"00",X"35",X"41", + X"FF",X"20",X"00",X"24",X"43",X"FF",X"58",X"00",X"AB",X"42",X"80",X"00",X"B0",X"42",X"FF",X"A8", + X"00",X"35",X"42",X"FF",X"28",X"00",X"A5",X"41",X"A8",X"00",X"B5",X"41",X"FF",X"08",X"00",X"21", + X"41",X"98",X"00",X"33",X"41",X"FF",X"30",X"00",X"26",X"43",X"FF",X"58",X"00",X"AB",X"42",X"C0", + X"00",X"B8",X"42",X"FF",X"48",X"00",X"29",X"42",X"FF",X"08",X"00",X"A1",X"41",X"B0",X"00",X"B6", + X"41",X"FF",X"50",X"00",X"2A",X"41",X"A0",X"00",X"34",X"41",X"FF",X"40",X"00",X"28",X"43",X"FF", + X"08",X"00",X"A1",X"42",X"C8",X"00",X"B9",X"42",X"FF",X"A0",X"00",X"34",X"42",X"FF",X"20",X"00", + X"A4",X"41",X"78",X"00",X"AF",X"41",X"FF",X"08",X"00",X"21",X"41",X"A8",X"00",X"35",X"41",X"FF", + X"08",X"00",X"21",X"43",X"88",X"00",X"31",X"43",X"FF",X"00",X"00",X"A0",X"42",X"80",X"00",X"B0", + X"42",X"FF",X"30",X"00",X"26",X"42",X"B0",X"00",X"36",X"42",X"FF",X"FF",X"08",X"00",X"21",X"41", + X"90",X"00",X"32",X"41",X"FF",X"FF",X"00",X"00",X"A0",X"42",X"A8",X"00",X"B5",X"42",X"FF",X"40", + X"00",X"28",X"42",X"A8",X"00",X"35",X"42",X"FF",X"08",X"00",X"A1",X"41",X"50",X"00",X"AA",X"41", + X"FF",X"00",X"00",X"20",X"41",X"90",X"00",X"32",X"41",X"FF",X"58",X"00",X"2B",X"43",X"FF",X"28", + X"00",X"A5",X"42",X"FF",X"00",X"00",X"20",X"42",X"B0",X"00",X"36",X"42",X"FF",X"28",X"00",X"A5", + X"41",X"78",X"00",X"AF",X"41",X"FF",X"58",X"00",X"2B",X"41",X"C8",X"00",X"39",X"41",X"FF",X"08", + X"00",X"21",X"43",X"FF",X"28",X"00",X"A5",X"42",X"C8",X"00",X"B9",X"42",X"FF",X"50",X"00",X"2A", + X"42",X"78",X"00",X"2F",X"42",X"FF",X"88",X"00",X"B1",X"41",X"FF",X"40",X"00",X"28",X"41",X"88", + X"00",X"31",X"41",X"FF",X"20",X"00",X"24",X"43",X"FF",X"70",X"00",X"AE",X"42",X"FF",X"00",X"00", + X"20",X"42",X"FF",X"40",X"00",X"A8",X"41",X"C8",X"00",X"B9",X"41",X"FF",X"20",X"00",X"24",X"41", + X"98",X"00",X"33",X"41",X"C8",X"00",X"39",X"41",X"FF",X"10",X"00",X"22",X"43",X"FF",X"58",X"00", + X"AB",X"42",X"C0",X"00",X"B8",X"42",X"FF",X"C0",X"00",X"38",X"42",X"FF",X"00",X"00",X"A0",X"41", + X"C8",X"00",X"B9",X"41",X"FF",X"28",X"00",X"25",X"41",X"C8",X"00",X"39",X"41",X"FF",X"08",X"00", + X"21",X"43",X"FF",X"00",X"00",X"A0",X"42",X"80",X"00",X"B0",X"42",X"C8",X"00",X"B9",X"42",X"FF", + X"70",X"00",X"2E",X"42",X"C8",X"00",X"39",X"42",X"FF",X"B0",X"00",X"B6",X"41",X"FF",X"C8",X"00", + X"39",X"41",X"FF",X"10",X"00",X"22",X"43",X"FF",X"28",X"00",X"A5",X"42",X"A0",X"00",X"B4",X"42", + X"FF",X"58",X"00",X"2B",X"42",X"70",X"00",X"2E",X"42",X"FF",X"68",X"00",X"AD",X"41",X"FF",X"40", + X"00",X"28",X"41",X"90",X"00",X"32",X"41",X"FF",X"68",X"00",X"2D",X"43",X"FF",X"68",X"00",X"AD", + X"42",X"FF",X"08",X"00",X"21",X"42",X"C8",X"00",X"39",X"42",X"FF",X"20",X"00",X"A4",X"41",X"C0", + X"00",X"B8",X"41",X"FF",X"08",X"00",X"21",X"41",X"C8",X"00",X"39",X"41",X"FF",X"89",X"9F",X"5F", + X"9F",X"35",X"9F",X"4A",X"9F",X"74",X"9F",X"B3",X"9F",X"9E",X"9F",X"C8",X"9F",X"DD",X"9F",X"F2", + X"9F",X"1C",X"A0",X"07",X"A0",X"31",X"A0",X"5B",X"A0",X"46",X"A0",X"DD",X"9F",X"1C",X"A0",X"70", + X"A0",X"07",X"A0",X"85",X"A0",X"FF",X"07",X"33",X"08",X"4C",X"FF",X"27",X"43",X"06",X"4C",X"FF", + X"8F",X"02",X"04",X"4C",X"FF",X"8F",X"53",X"02",X"4C",X"FF",X"67",X"02",X"08",X"4C",X"FF",X"FF", + X"87",X"02",X"06",X"4C",X"FF",X"40",X"63",X"04",X"4C",X"FF",X"AF",X"02",X"02",X"4C",X"FF",X"FF", + X"3F",X"02",X"08",X"4C",X"FF",X"C7",X"53",X"06",X"4C",X"FF",X"08",X"63",X"04",X"4C",X"FF",X"97", + X"02",X"02",X"4C",X"FF",X"FF",X"87",X"02",X"08",X"4C",X"FF",X"4F",X"33",X"06",X"4C",X"FF",X"3F", + X"02",X"04",X"4C",X"FF",X"C7",X"43",X"02",X"4C",X"FF",X"FF",X"8F",X"02",X"08",X"4C",X"FF",X"FF", + X"07",X"53",X"06",X"4C",X"FF",X"87",X"02",X"04",X"4C",X"07",X"63",X"02",X"4C",X"FF",X"FF",X"27", + X"02",X"08",X"4C",X"CF",X"33",X"06",X"4C",X"FF",X"27",X"43",X"04",X"4C",X"FF",X"5F",X"02",X"02", + X"4C",X"FF",X"FF",X"FF",X"2F",X"43",X"08",X"4C",X"FF",X"97",X"02",X"06",X"4C",X"FF",X"3F",X"53", + X"04",X"4C",X"FF",X"B7",X"02",X"02",X"4C",X"FF",X"97",X"02",X"08",X"4C",X"FF",X"6F",X"02",X"06", + X"4C",X"FF",X"B7",X"33",X"04",X"4C",X"FF",X"97",X"43",X"02",X"4C",X"FF",X"FF",X"FF",X"27",X"43", + X"08",X"4C",X"B7",X"02",X"06",X"4C",X"FF",X"FF",X"27",X"33",X"04",X"4C",X"AF",X"63",X"02",X"4C", + X"FF",X"FF",X"FF",X"4F",X"02",X"08",X"4C",X"FF",X"77",X"63",X"06",X"4C",X"FF",X"8F",X"33",X"04", + X"4C",X"FF",X"57",X"02",X"02",X"4C",X"FF",X"CF",X"02",X"08",X"4C",X"FF",X"AF",X"02",X"06",X"4C", + X"FF",X"1F",X"02",X"04",X"4C",X"FF",X"AF",X"43",X"02",X"4C",X"FF",X"FF",X"BF",X"02",X"08",X"4C", + X"FF",X"9F",X"33",X"06",X"4C",X"FF",X"1F",X"43",X"04",X"4C",X"FF",X"9F",X"02",X"02",X"4C",X"FF", + X"FF",X"3F",X"02",X"08",X"4C",X"FF",X"27",X"02",X"06",X"4C",X"FF",X"27",X"02",X"04",X"4C",X"FF", + X"FF",X"6F",X"63",X"02",X"4C",X"FF",X"FF",X"2F",X"02",X"08",X"4C",X"FF",X"7F",X"02",X"06",X"4C", + X"FF",X"47",X"53",X"04",X"4C",X"FF",X"9F",X"02",X"02",X"4C",X"FF",X"27",X"63",X"08",X"4C",X"FF", + X"5F",X"02",X"06",X"4C",X"27",X"53",X"04",X"4C",X"FF",X"FF",X"27",X"02",X"02",X"4C",X"FF",X"FF", + X"FF",X"67",X"43",X"08",X"4C",X"FF",X"FF",X"B7",X"63",X"06",X"4C",X"1F",X"63",X"04",X"4C",X"FF", + X"9F",X"63",X"02",X"4C",X"FF",X"FF",X"77",X"43",X"08",X"4C",X"FF",X"97",X"43",X"06",X"4C",X"37", + X"43",X"04",X"4C",X"FF",X"FF",X"9F",X"63",X"02",X"4C",X"FF",X"10",X"00",X"20",X"00",X"30",X"00", + X"50",X"00",X"00",X"01",X"00",X"02",X"00",X"03",X"00",X"05",X"00",X"10",X"00",X"20",X"00",X"30", + X"00",X"50",X"56",X"A1",X"18",X"A1",X"DA",X"A0",X"F9",X"A0",X"37",X"A1",X"8A",X"A1",X"6B",X"A1", + X"A9",X"A1",X"BE",X"A1",X"DD",X"A1",X"11",X"A2",X"F2",X"A1",X"30",X"A2",X"6E",X"A2",X"4F",X"A2", + X"BE",X"A1",X"11",X"A2",X"83",X"A2",X"F2",X"A1",X"F2",X"A1",X"F8",X"17",X"28",X"40",X"01",X"01", + X"02",X"0A",X"4C",X"02",X"F8",X"18",X"48",X"C8",X"01",X"02",X"03",X"0C",X"4C",X"03",X"F8",X"17", + X"68",X"C8",X"01",X"01",X"02",X"0E",X"4C",X"02",X"FF",X"F8",X"17",X"28",X"50",X"01",X"01",X"02", + X"0A",X"4C",X"02",X"F8",X"17",X"48",X"C8",X"01",X"01",X"02",X"0C",X"4C",X"02",X"F8",X"17",X"68", + X"C8",X"01",X"01",X"02",X"0E",X"4C",X"02",X"FF",X"F8",X"17",X"28",X"08",X"00",X"01",X"02",X"0A", + X"4C",X"02",X"F8",X"18",X"68",X"08",X"00",X"02",X"03",X"0C",X"4C",X"03",X"F8",X"17",X"A8",X"C8", + X"01",X"01",X"03",X"0E",X"4C",X"03",X"FF",X"F8",X"17",X"28",X"08",X"00",X"01",X"02",X"0A",X"4C", + X"02",X"F8",X"18",X"48",X"C8",X"01",X"02",X"03",X"0C",X"4C",X"03",X"F8",X"18",X"88",X"C8",X"00", + X"02",X"03",X"0E",X"4C",X"03",X"FF",X"F8",X"17",X"68",X"04",X"00",X"01",X"02",X"0A",X"4C",X"02", + X"F8",X"17",X"A8",X"00",X"01",X"01",X"02",X"0C",X"4C",X"02",X"FF",X"F8",X"17",X"28",X"40",X"01", + X"01",X"02",X"0A",X"4C",X"02",X"F8",X"18",X"68",X"C8",X"01",X"02",X"03",X"0C",X"4C",X"03",X"F8", + X"17",X"A8",X"B0",X"01",X"01",X"02",X"0E",X"4C",X"02",X"FF",X"F8",X"18",X"28",X"C0",X"01",X"02", + X"03",X"0A",X"4C",X"03",X"F8",X"17",X"A8",X"20",X"01",X"01",X"02",X"0C",X"4C",X"02",X"F8",X"18", + X"A8",X"C8",X"01",X"02",X"03",X"0E",X"4C",X"03",X"FF",X"F8",X"17",X"28",X"C0",X"00",X"01",X"02", + X"0A",X"4C",X"02",X"F8",X"18",X"A8",X"C8",X"01",X"02",X"03",X"0C",X"4C",X"03",X"FF",X"F8",X"1D", + X"28",X"B8",X"01",X"02",X"02",X"0A",X"4C",X"02",X"F8",X"1D",X"68",X"50",X"01",X"02",X"02",X"0C", + X"4C",X"02",X"F8",X"18",X"A8",X"78",X"01",X"02",X"03",X"0E",X"4C",X"03",X"FF",X"F8",X"17",X"48", + X"78",X"01",X"01",X"02",X"0A",X"4C",X"02",X"F8",X"17",X"A8",X"B0",X"00",X"01",X"02",X"0C",X"4C", + X"02",X"FF",X"F8",X"17",X"28",X"A8",X"00",X"01",X"02",X"0A",X"4C",X"02",X"F8",X"17",X"68",X"80", + X"01",X"01",X"02",X"0C",X"4C",X"02",X"F8",X"17",X"A8",X"20",X"00",X"01",X"02",X"0E",X"4C",X"02", + X"FF",X"F8",X"18",X"28",X"98",X"01",X"02",X"03",X"0A",X"4C",X"03",X"F8",X"17",X"88",X"20",X"01", + X"01",X"02",X"0C",X"4C",X"02",X"F8",X"1D",X"A8",X"C8",X"00",X"02",X"02",X"0E",X"4C",X"02",X"FF", + X"F8",X"18",X"28",X"A8",X"01",X"02",X"03",X"0A",X"4C",X"03",X"F8",X"17",X"48",X"98",X"01",X"01", + X"02",X"0C",X"4C",X"02",X"F8",X"17",X"88",X"B0",X"00",X"01",X"02",X"0E",X"4C",X"02",X"FF",X"F8", + X"18",X"28",X"C0",X"01",X"02",X"03",X"0A",X"4C",X"03",X"F8",X"17",X"68",X"00",X"01",X"01",X"02", + X"0C",X"4C",X"02",X"F8",X"17",X"A8",X"10",X"00",X"01",X"02",X"0E",X"4C",X"02",X"FF",X"F8",X"18", + X"28",X"B8",X"01",X"02",X"03",X"0A",X"4C",X"03",X"F8",X"17",X"A8",X"28",X"00",X"01",X"02",X"0C", + X"4C",X"02",X"FF",X"F8",X"18",X"28",X"C8",X"01",X"02",X"02",X"0A",X"4C",X"02",X"F8",X"1D",X"68", + X"C0",X"01",X"02",X"02",X"0C",X"4C",X"02",X"F8",X"18",X"A8",X"30",X"01",X"02",X"03",X"0E",X"4C", + X"02",X"FF",X"F8",X"17",X"28",X"30",X"00",X"01",X"02",X"0A",X"4C",X"02",X"F8",X"17",X"28",X"A0", + X"00",X"01",X"02",X"0C",X"4C",X"02",X"F8",X"17",X"A8",X"40",X"00",X"01",X"02",X"0E",X"4C",X"02", + X"FF",X"F5",X"A2",X"EF",X"A2",X"E9",X"A2",X"EC",X"A2",X"F2",X"A2",X"FB",X"A2",X"F8",X"A2",X"FE", + X"A2",X"01",X"A3",X"04",X"A3",X"0A",X"A3",X"07",X"A3",X"0D",X"A3",X"13",X"A3",X"10",X"A3",X"01", + X"A3",X"0A",X"A3",X"16",X"A3",X"07",X"A3",X"19",X"A3",X"01",X"07",X"40",X"01",X"06",X"40",X"01", + X"06",X"30",X"01",X"05",X"30",X"01",X"05",X"40",X"01",X"05",X"30",X"01",X"06",X"30",X"01",X"06", + X"40",X"01",X"05",X"30",X"01",X"05",X"30",X"01",X"04",X"30",X"01",X"04",X"30",X"01",X"04",X"30", + X"01",X"04",X"30",X"01",X"04",X"30",X"01",X"02",X"40",X"01",X"02",X"30",X"34",X"A3",X"3A",X"A3", + X"55",X"A3",X"37",X"A3",X"43",X"A3",X"3D",X"A3",X"40",X"A3",X"46",X"A3",X"49",X"A3",X"4C",X"A3", + X"4F",X"A3",X"52",X"A3",X"02",X"02",X"01",X"07",X"03",X"04",X"07",X"04",X"03",X"00",X"04",X"01", + X"07",X"06",X"03",X"02",X"02",X"02",X"06",X"03",X"02",X"03",X"06",X"00",X"04",X"05",X"01",X"01", + X"06",X"06",X"01",X"06",X"06",X"00",X"03",X"06",X"70",X"A3",X"7C",X"A3",X"B2",X"A3",X"76",X"A3", + X"8E",X"A3",X"82",X"A3",X"88",X"A3",X"94",X"A3",X"9A",X"A3",X"A0",X"A3",X"A6",X"A3",X"AC",X"A3", + X"B8",X"A3",X"42",X"A4",X"B5",X"A4",X"BF",X"A4",X"BB",X"A5",X"8D",X"A6",X"5F",X"A7",X"DD",X"A7", + X"46",X"A8",X"AF",X"A8",X"EB",X"A8",X"1D",X"A9",X"4F",X"A9",X"85",X"A9",X"8F",X"A9",X"99",X"A9", + X"6B",X"AA",X"75",X"AA",X"7F",X"AA",X"91",X"AA",X"9B",X"AA",X"A5",X"AA",X"95",X"AB",X"5D",X"AC", + X"FD",X"AC",X"DB",X"AD",X"E5",X"AD",X"4E",X"AE",X"A8",X"AE",X"F3",X"AE",X"3E",X"AF",X"BC",X"AF", + X"11",X"B0",X"98",X"B0",X"0A",X"B1",X"69",X"B1",X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A", + X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04", + X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00", + X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A", + X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04", + X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00", + X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A", + X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04", + X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04",X"FF",X"00",X"00",X"00", + X"00",X"00",X"03",X"0A",X"06",X"0C",X"05",X"05",X"00",X"00",X"00",X"00",X"03",X"0A",X"06",X"0C", + X"05",X"05",X"00",X"00",X"00",X"00",X"04",X"0A",X"06",X"0C",X"05",X"04",X"00",X"00",X"00",X"00", + X"03",X"0A",X"06",X"0C",X"05",X"05",X"00",X"00",X"00",X"00",X"03",X"0A",X"06",X"0C",X"05",X"05", + X"00",X"00",X"00",X"00",X"04",X"0A",X"06",X"0C",X"05",X"04",X"00",X"00",X"00",X"00",X"03",X"0A", + X"06",X"0C",X"05",X"05",X"00",X"00",X"00",X"00",X"03",X"0A",X"06",X"0C",X"05",X"05",X"00",X"00", + X"00",X"00",X"04",X"0A",X"06",X"0C",X"05",X"04",X"00",X"00",X"00",X"00",X"03",X"0A",X"06",X"0C", + X"05",X"05",X"00",X"00",X"00",X"00",X"03",X"0A",X"06",X"0C",X"05",X"05",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"3C",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"06", + X"0A",X"01",X"06",X"0C",X"05",X"06",X"0A",X"01",X"08",X"0B",X"05",X"06",X"0A",X"03",X"03",X"0A", + X"05",X"06",X"0A",X"04",X"05",X"09",X"05",X"06",X"0A",X"04",X"04",X"08",X"05",X"06",X"09",X"00", + X"02",X"07",X"05",X"06",X"09",X"0F",X"0A",X"06",X"05",X"06",X"09",X"05",X"0A",X"05",X"05",X"06", + X"09",X"02",X"05",X"04",X"05",X"06",X"09",X"00",X"04",X"03",X"05",X"06",X"08",X"05",X"03",X"02", + X"05",X"06",X"08",X"00",X"04",X"01",X"05",X"06",X"08",X"03",X"05",X"00",X"05",X"06",X"07",X"00", + X"00",X"0F",X"04",X"06",X"07",X"09",X"0A",X"0E",X"04",X"06",X"06",X"00",X"00",X"0D",X"04",X"06", + X"05",X"03",X"03",X"0C",X"04",X"06",X"05",X"00",X"00",X"0B",X"04",X"06",X"05",X"06",X"0E",X"0A", + X"04",X"06",X"05",X"00",X"00",X"09",X"04",X"06",X"05",X"03",X"0D",X"08",X"04",X"06",X"05",X"00", + X"0E",X"07",X"04",X"06",X"04",X"01",X"0F",X"06",X"04",X"06",X"04",X"00",X"07",X"05",X"04",X"06", + X"04",X"02",X"03",X"04",X"04",X"06",X"04",X"05",X"06",X"03",X"04",X"06",X"04",X"09",X"09",X"02", + X"04",X"06",X"03",X"08",X"06",X"01",X"04",X"06",X"03",X"07",X"02",X"00",X"04",X"06",X"03",X"07", + X"07",X"0F",X"03",X"06",X"03",X"07",X"0D",X"0E",X"03",X"06",X"03",X"08",X"0B",X"0D",X"03",X"06", + X"03",X"09",X"0A",X"0C",X"03",X"06",X"03",X"08",X"09",X"0B",X"03",X"06",X"02",X"0B",X"09",X"0A", + X"03",X"06",X"02",X"0A",X"0A",X"09",X"03",X"06",X"02",X"09",X"0A",X"08",X"03",X"05",X"01",X"06", + X"0B",X"07",X"03",X"06",X"01",X"03",X"0D",X"06",X"03",X"05",X"01",X"02",X"08",X"05",X"03",X"06", + X"01",X"0F",X"00",X"04",X"03",X"FF",X"00",X"00",X"00",X"00",X"00",X"07",X"0A",X"07",X"0C",X"05", + X"06",X"0A",X"08",X"0B",X"05",X"06",X"0A",X"04",X"0A",X"05",X"05",X"0A",X"05",X"09",X"05",X"07", + X"0A",X"05",X"08",X"05",X"06",X"09",X"02",X"07",X"05",X"06",X"09",X"0B",X"06",X"05",X"05",X"09", + X"0A",X"05",X"05",X"07",X"09",X"06",X"04",X"05",X"06",X"09",X"03",X"04",X"05",X"06",X"08",X"04", + X"02",X"05",X"05",X"08",X"05",X"01",X"05",X"07",X"08",X"06",X"00",X"05",X"06",X"07",X"02",X"0F", + X"04",X"06",X"07",X"0B",X"0E",X"04",X"05",X"03",X"08",X"0D",X"04",X"07",X"02",X"04",X"0C",X"04", + X"06",X"02",X"01",X"0B",X"04",X"06",X"02",X"0F",X"0A",X"04",X"05",X"02",X"0F",X"09",X"04",X"07", + X"02",X"0E",X"08",X"04",X"06",X"02",X"08",X"07",X"04",X"06",X"02",X"00",X"07",X"04",X"05",X"02", + X"09",X"05",X"04",X"07",X"02",X"04",X"04",X"04",X"06",X"02",X"0B",X"03",X"04",X"06",X"02",X"0A", + X"02",X"04",X"05",X"02",X"05",X"01",X"04",X"07",X"02",X"03",X"00",X"04",X"06",X"02",X"04",X"0F", + X"03",X"05",X"02",X"0E",X"0E",X"03",X"05",X"02",X"0A",X"0D",X"03",X"07",X"02",X"0B",X"0C",X"03", + X"06",X"02",X"0A",X"0B",X"03",X"05",X"02",X"0A",X"0A",X"03",X"05",X"02",X"0A",X"09",X"03",X"07", + X"02",X"0B",X"08",X"03",X"06",X"01",X"0B",X"07",X"03",X"05",X"01",X"0E",X"06",X"03",X"05",X"01", + X"09",X"05",X"03",X"07",X"01",X"01",X"04",X"03",X"FF",X"00",X"00",X"00",X"00",X"08",X"0A",X"05", + X"0C",X"05",X"06",X"0A",X"08",X"0B",X"05",X"05",X"0A",X"02",X"0A",X"05",X"05",X"0A",X"05",X"09", + X"05",X"08",X"0A",X"03",X"08",X"05",X"06",X"09",X"02",X"07",X"05",X"05",X"09",X"09",X"06",X"05", + X"05",X"09",X"0A",X"05",X"05",X"08",X"09",X"03",X"04",X"05",X"06",X"09",X"03",X"03",X"05",X"05", + X"08",X"02",X"02",X"05",X"05",X"08",X"01",X"01",X"05",X"08",X"08",X"04",X"00",X"05",X"06",X"07", + X"06",X"0F",X"04",X"05",X"07",X"09",X"0E",X"04",X"05",X"06",X"06",X"0D",X"04",X"08",X"05",X"02", + X"0C",X"04",X"06",X"05",X"06",X"0B",X"04",X"05",X"05",X"0D",X"0A",X"04",X"05",X"05",X"0C",X"09", + X"04",X"08",X"05",X"0C",X"08",X"04",X"06",X"05",X"0D",X"07",X"04",X"05",X"04",X"0E",X"06",X"04", + X"05",X"04",X"09",X"05",X"04",X"08",X"04",X"02",X"04",X"04",X"05",X"04",X"05",X"03",X"04",X"05", + X"04",X"08",X"02",X"04",X"05",X"04",X"05",X"01",X"04",X"08",X"04",X"01",X"00",X"04",X"05",X"03", + X"08",X"0F",X"03",X"05",X"03",X"0C",X"0E",X"03",X"05",X"03",X"04",X"0D",X"03",X"08",X"03",X"09", + X"0C",X"03",X"05",X"02",X"01",X"09",X"03",X"05",X"02",X"08",X"08",X"03",X"05",X"02",X"08",X"07", + X"03",X"08",X"02",X"09",X"06",X"03",X"05",X"01",X"03",X"05",X"03",X"05",X"01",X"0C",X"04",X"03", + X"05",X"01",X"0D",X"02",X"03",X"08",X"01",X"0F",X"01",X"03",X"FF",X"00",X"00",X"00",X"00",X"01", + X"05",X"0D",X"04",X"03",X"01",X"01",X"06",X"0C",X"08",X"00",X"01",X"01",X"06",X"0C",X"08",X"0D", + X"00",X"01",X"07",X"06",X"0B",X"0B",X"00",X"01",X"07",X"0A",X"02",X"0B",X"00",X"01",X"08",X"09", + X"04",X"0C",X"00",X"01",X"09",X"0C",X"08",X"0E",X"00",X"01",X"0B",X"0C",X"0B",X"0F",X"00",X"01", + X"0D",X"0D",X"04",X"03",X"01",X"01",X"0F",X"04",X"09",X"06",X"01",X"01",X"0D",X"04",X"04",X"03", + X"01",X"01",X"0B",X"0C",X"0B",X"0F",X"00",X"01",X"09",X"0C",X"08",X"0E",X"00",X"01",X"07",X"09", + X"04",X"0C",X"00",X"01",X"05",X"0A",X"02",X"0B",X"00",X"01",X"04",X"06",X"0B",X"0B",X"00",X"01", + X"03",X"04",X"09",X"0A",X"00",X"01",X"03",X"04",X"04",X"0A",X"00",X"01",X"02",X"0C",X"0B",X"09", + X"00",X"01",X"01",X"0C",X"08",X"09",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"01",X"05",X"05", + X"0F",X"00",X"01",X"05",X"09",X"0C",X"00",X"01",X"06",X"09",X"09",X"00",X"01",X"06",X"0C",X"07", + X"00",X"01",X"08",X"03",X"07",X"00",X"01",X"09",X"05",X"08",X"00",X"01",X"0A",X"09",X"09",X"00", + X"01",X"0C",X"0C",X"0B",X"00",X"01",X"0D",X"05",X"0F",X"00",X"01",X"0F",X"0A",X"02",X"01",X"01", + X"0D",X"05",X"0F",X"00",X"01",X"0B",X"0C",X"0B",X"00",X"01",X"09",X"09",X"09",X"00",X"01",X"07", + X"05",X"08",X"00",X"01",X"05",X"03",X"07",X"00",X"01",X"04",X"0C",X"07",X"00",X"01",X"03",X"0A", + X"06",X"00",X"01",X"03",X"05",X"05",X"00",X"01",X"02",X"0C",X"04",X"00",X"01",X"01",X"0C",X"03", + X"00",X"FF",X"00",X"00",X"00",X"00",X"01",X"05",X"03",X"01",X"01",X"01",X"05",X"07",X"0E",X"00", + X"01",X"06",X"07",X"0B",X"00",X"01",X"07",X"0A",X"09",X"00",X"01",X"08",X"01",X"09",X"00",X"01", + X"09",X"03",X"0A",X"00",X"01",X"0A",X"07",X"0B",X"00",X"01",X"0C",X"0A",X"0D",X"00",X"01",X"0D", + X"03",X"01",X"01",X"01",X"0F",X"08",X"04",X"01",X"01",X"0D",X"03",X"01",X"01",X"01",X"0B",X"0A", + X"0D",X"00",X"01",X"09",X"07",X"0B",X"00",X"01",X"07",X"03",X"0A",X"00",X"01",X"05",X"01",X"09", + X"00",X"01",X"04",X"0A",X"09",X"00",X"01",X"03",X"08",X"08",X"00",X"01",X"03",X"03",X"08",X"00", + X"01",X"02",X"0A",X"07",X"00",X"01",X"01",X"07",X"07",X"00",X"FF",X"00",X"00",X"00",X"00",X"03", + X"05",X"02",X"03",X"0E",X"02",X"03",X"05",X"03",X"03",X"0A",X"03",X"03",X"05",X"05",X"03",X"05", + X"04",X"03",X"05",X"02",X"03",X"0E",X"02",X"03",X"05",X"03",X"03",X"0A",X"03",X"03",X"05",X"05", + X"03",X"05",X"04",X"03",X"05",X"02",X"03",X"0E",X"02",X"03",X"05",X"03",X"03",X"0A",X"03",X"03", + X"05",X"05",X"03",X"05",X"04",X"FF",X"00",X"00",X"00",X"00",X"00",X"04",X"05",X"06",X"0C",X"05", + X"02",X"05",X"06",X"04",X"07",X"03",X"05",X"06",X"0A",X"08",X"04",X"05",X"06",X"0C",X"05",X"02", + X"05",X"06",X"04",X"07",X"03",X"05",X"06",X"0A",X"08",X"04",X"05",X"06",X"0C",X"05",X"02",X"05", + X"06",X"04",X"07",X"03",X"05",X"06",X"0A",X"08",X"FF",X"00",X"00",X"00",X"00",X"03",X"0A",X"0C", + X"05",X"00",X"03",X"0A",X"04",X"07",X"00",X"03",X"0A",X"0A",X"08",X"00",X"03",X"0A",X"0C",X"05", + X"00",X"03",X"0A",X"04",X"07",X"00",X"03",X"0A",X"0A",X"08",X"00",X"03",X"0A",X"0C",X"05",X"00", + X"03",X"0A",X"04",X"07",X"00",X"03",X"0A",X"0A",X"08",X"00",X"FF",X"00",X"00",X"00",X"00",X"04", + X"0A",X"08",X"01",X"07",X"01",X"01",X"0A",X"06",X"01",X"08",X"01",X"04",X"0A",X"0F",X"00",X"0D", + X"01",X"01",X"0A",X"0C",X"05",X"0E",X"01",X"04",X"0A",X"0B",X"09",X"02",X"02",X"01",X"0A",X"0D", + X"06",X"03",X"02",X"04",X"0A",X"02",X"03",X"0E",X"02",X"01",X"0A",X"02",X"04",X"0F",X"02",X"FF", + X"00",X"00",X"00",X"00",X"00",X"14",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"14", + X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"02",X"01",X"06",X"0C",X"05",X"00",X"02", + X"01",X"06",X"0C",X"05",X"00",X"02",X"02",X"06",X"0C",X"05",X"00",X"02",X"02",X"06",X"0C",X"05", + X"00",X"02",X"03",X"06",X"0C",X"05",X"00",X"02",X"03",X"06",X"0C",X"05",X"00",X"02",X"04",X"06", + X"0C",X"05",X"00",X"02",X"04",X"06",X"0C",X"05",X"00",X"02",X"05",X"06",X"0C",X"05",X"00",X"02", + X"05",X"06",X"0C",X"05",X"00",X"02",X"06",X"06",X"0C",X"05",X"00",X"02",X"06",X"06",X"0C",X"05", + X"00",X"02",X"07",X"06",X"0C",X"05",X"00",X"02",X"07",X"06",X"0C",X"05",X"00",X"02",X"08",X"06", + X"0C",X"05",X"00",X"02",X"08",X"06",X"0C",X"05",X"00",X"02",X"09",X"06",X"0C",X"05",X"00",X"02", + X"09",X"06",X"0C",X"05",X"00",X"02",X"0A",X"06",X"0C",X"05",X"00",X"02",X"0A",X"06",X"0C",X"05", + X"00",X"02",X"0B",X"06",X"0C",X"05",X"00",X"02",X"0B",X"06",X"0C",X"05",X"00",X"02",X"0C",X"06", + X"0C",X"05",X"00",X"02",X"0C",X"06",X"0C",X"05",X"00",X"02",X"0D",X"06",X"0C",X"05",X"00",X"02", + X"0D",X"06",X"0C",X"05",X"00",X"02",X"0E",X"06",X"0C",X"05",X"00",X"02",X"0E",X"06",X"0C",X"05", + X"00",X"02",X"0F",X"06",X"0C",X"05",X"00",X"02",X"0F",X"06",X"0C",X"05",X"00",X"02",X"0F",X"06", + X"0C",X"05",X"00",X"02",X"0F",X"06",X"0C",X"05",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"10", + X"0F",X"0E",X"01",X"06",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"53",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"53",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"03", + X"08",X"03",X"0D",X"0E",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00", + X"00",X"06",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"06",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0F",X"00",X"0D",X"01",X"15",X"00",X"00",X"00",X"00", + X"00",X"0B",X"0F",X"0F",X"00",X"0D",X"01",X"15",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0F", + X"00",X"0D",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B",X"0E",X"09",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0F",X"00",X"0D",X"01",X"09",X"00",X"00",X"00",X"00", + X"00",X"0B",X"0F",X"03",X"0D",X"0E",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B", + X"09",X"02",X"02",X"15",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B",X"09",X"02",X"02",X"09", + X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B",X"09",X"02",X"02",X"01",X"00",X"00",X"00",X"00", + X"00",X"1F",X"0F",X"0F",X"00",X"0D",X"01",X"21",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B", + X"0E",X"09",X"01",X"15",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B",X"0E",X"09",X"01",X"09", + X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0F",X"00",X"0D",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"0B",X"0F",X"03",X"0D",X"0E",X"01",X"15",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0F", + X"00",X"0D",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B",X"0E",X"09",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"08",X"01",X"07",X"01",X"11",X"00",X"00",X"00",X"00", + X"00",X"04",X"0F",X"09",X"09",X"0B",X"02",X"0C",X"0F",X"02",X"03",X"0E",X"02",X"10",X"00",X"00", + X"00",X"00",X"00",X"0F",X"0F",X"08",X"01",X"07",X"01",X"10",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"01",X"07",X"01",X"15",X"00",X"00",X"00",X"00",X"0B", + X"0F",X"01",X"07",X"01",X"15",X"00",X"00",X"00",X"00",X"0B",X"0F",X"01",X"07",X"01",X"09",X"00", + X"00",X"00",X"00",X"0B",X"0F",X"0C",X"05",X"01",X"01",X"00",X"00",X"00",X"00",X"0B",X"0F",X"01", + X"07",X"01",X"09",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0E",X"09",X"01",X"01",X"00",X"00",X"00", + X"00",X"0B",X"0F",X"00",X"0D",X"01",X"15",X"00",X"00",X"00",X"00",X"0B",X"0F",X"00",X"0D",X"01", + X"09",X"00",X"00",X"00",X"00",X"0B",X"0F",X"00",X"0D",X"01",X"01",X"00",X"00",X"00",X"00",X"1F", + X"0F",X"01",X"07",X"01",X"21",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0C",X"05",X"01",X"15",X"00", + X"00",X"00",X"00",X"0B",X"0F",X"0C",X"05",X"01",X"09",X"00",X"00",X"00",X"00",X"0B",X"0F",X"01", + X"07",X"01",X"01",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0E",X"09",X"01",X"15",X"00",X"00",X"00", + X"00",X"0B",X"0F",X"01",X"07",X"01",X"09",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0C",X"05",X"01", + X"01",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"04", + X"0F",X"00",X"00",X"00",X"0C",X"0F",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"0F",X"0F", + X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"0F",X"06",X"08", + X"0B",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"0A",X"08",X"00",X"11",X"00",X"00",X"00", + X"00",X"0F",X"06",X"08",X"0B",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"0A",X"08",X"00", + X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"08",X"0B",X"00",X"11",X"00",X"00",X"00",X"00",X"0F", + X"06",X"0A",X"08",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"08",X"0B",X"00",X"11",X"00", + X"00",X"00",X"00",X"0F",X"06",X"0A",X"08",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"0F", + X"0C",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"0A",X"08",X"00",X"11",X"00",X"00",X"00", + X"00",X"0F",X"06",X"0B",X"09",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"0E",X"0A",X"00", + X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"08",X"0B",X"00",X"11",X"00",X"00",X"00",X"00",X"0F", + X"06",X"0A",X"08",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"08",X"0B",X"00",X"01",X"00", + X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"03",X"0C",X"08", + X"01",X"07",X"01",X"01",X"0A",X"08",X"01",X"07",X"01",X"01",X"08",X"08",X"01",X"07",X"01",X"01", + X"06",X"08",X"01",X"07",X"01",X"01",X"04",X"08",X"01",X"07",X"01",X"01",X"02",X"08",X"01",X"07", + X"01",X"02",X"00",X"00",X"00",X"00",X"00",X"02",X"0C",X"0C",X"06",X"03",X"01",X"01",X"0A",X"0C", + X"06",X"03",X"01",X"01",X"08",X"0C",X"06",X"03",X"01",X"01",X"06",X"0C",X"06",X"03",X"01",X"02", + X"0C",X"0D",X"04",X"01",X"01",X"01",X"0A",X"0D",X"04",X"01",X"01",X"01",X"08",X"0D",X"04",X"01", + X"01",X"01",X"06",X"0D",X"04",X"01",X"01",X"03",X"0C",X"0C",X"08",X"0E",X"00",X"01",X"0A",X"0C", + X"08",X"0E",X"00",X"01",X"08",X"0C",X"08",X"0E",X"00",X"01",X"06",X"0C",X"08",X"0E",X"00",X"01", + X"04",X"0C",X"08",X"0E",X"00",X"01",X"02",X"0C",X"08",X"0E",X"00",X"02",X"00",X"00",X"00",X"00", + X"00",X"03",X"0C",X"05",X"0F",X"0C",X"00",X"01",X"0A",X"05",X"0F",X"0C",X"00",X"01",X"08",X"05", + X"0F",X"0C",X"00",X"01",X"06",X"05",X"0F",X"0C",X"00",X"01",X"04",X"05",X"0F",X"0C",X"00",X"01", + X"02",X"05",X"0F",X"0C",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"02",X"0C",X"0C",X"08",X"0B", + X"00",X"02",X"0A",X"0C",X"08",X"0B",X"00",X"02",X"08",X"0C",X"08",X"0B",X"00",X"02",X"06",X"0C", + X"08",X"0B",X"00",X"02",X"04",X"0C",X"08",X"0B",X"00",X"02",X"02",X"0C",X"08",X"0B",X"00",X"08", + X"01",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"3C",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"06",X"05",X"0B",X"07",X"00",X"02",X"04",X"0B",X"07",X"00",X"02", + X"03",X"0B",X"07",X"00",X"02",X"02",X"0B",X"07",X"00",X"08",X"01",X"0B",X"07",X"00",X"06",X"05", + X"0A",X"08",X"00",X"02",X"04",X"0A",X"08",X"00",X"02",X"03",X"0A",X"08",X"00",X"02",X"02",X"0A", + X"08",X"00",X"08",X"01",X"0A",X"08",X"00",X"02",X"05",X"0C",X"05",X"00",X"02",X"05",X"0C",X"05", + X"00",X"02",X"04",X"0C",X"05",X"00",X"02",X"04",X"0C",X"05",X"00",X"02",X"03",X"0C",X"05",X"00", + X"02",X"03",X"0C",X"05",X"00",X"02",X"02",X"0C",X"05",X"00",X"02",X"02",X"0C",X"05",X"00",X"02", + X"01",X"0C",X"05",X"00",X"02",X"01",X"0C",X"05",X"00",X"FF",X"00",X"00",X"00",X"00",X"0C",X"0D", + X"0C",X"08",X"0B",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"07",X"0D",X"07",X"0A",X"08",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"07",X"0D",X"07",X"0A",X"08",X"00",X"01",X"00",X"00",X"00", + X"00",X"00",X"0F",X"0D",X"06",X"0B",X"09",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"0D", + X"07",X"0A",X"08",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"0C",X"0D",X"07",X"0E",X"0A",X"00", + X"04",X"00",X"00",X"00",X"00",X"00",X"10",X"0D",X"0C",X"08",X"0B",X"00",X"20",X"00",X"00",X"00", + X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"0C",X"0D",X"01",X"07",X"01",X"04",X"00",X"00", + X"00",X"00",X"07",X"0D",X"04",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"07",X"0D",X"04",X"01", + X"01",X"01",X"00",X"00",X"00",X"00",X"0F",X"0D",X"06",X"03",X"01",X"01",X"00",X"00",X"00",X"00", + X"0F",X"0D",X"04",X"01",X"01",X"11",X"00",X"00",X"00",X"00",X"0C",X"0D",X"0C",X"05",X"01",X"04", + X"00",X"00",X"00",X"00",X"10",X"0D",X"01",X"07",X"01",X"20",X"00",X"00",X"00",X"00",X"FF",X"00", + X"00",X"00",X"00",X"0C",X"0D",X"08",X"0B",X"00",X"04",X"00",X"00",X"00",X"00",X"07",X"0D",X"0A", + X"08",X"00",X"01",X"00",X"00",X"00",X"00",X"07",X"0D",X"0A",X"08",X"00",X"01",X"00",X"00",X"00", + X"00",X"0F",X"0D",X"0B",X"09",X"00",X"01",X"00",X"00",X"00",X"00",X"0F",X"0D",X"0A",X"08",X"00", + X"11",X"00",X"00",X"00",X"00",X"0C",X"0D",X"09",X"0B",X"02",X"04",X"00",X"00",X"00",X"00",X"10", + X"0D",X"03",X"0E",X"02",X"20",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"10",X"0F", + X"08",X"01",X"07",X"01",X"10",X"00",X"00",X"00",X"00",X"00",X"10",X"0F",X"0F",X"00",X"0D",X"01", + X"10",X"00",X"00",X"00",X"00",X"00",X"08",X"0F",X"0B",X"09",X"02",X"02",X"08",X"00",X"00",X"00", + X"00",X"00",X"08",X"0F",X"0F",X"00",X"0D",X"01",X"08",X"00",X"00",X"00",X"00",X"00",X"10",X"0F", + X"08",X"01",X"07",X"01",X"10",X"00",X"00",X"00",X"00",X"00",X"08",X"0F",X"07",X"0D",X"06",X"02", + X"08",X"00",X"00",X"00",X"00",X"00",X"08",X"0F",X"0B",X"09",X"02",X"02",X"08",X"00",X"00",X"00", + X"00",X"00",X"08",X"0F",X"07",X"0D",X"06",X"02",X"08",X"00",X"00",X"00",X"00",X"00",X"08",X"0F", + X"09",X"09",X"0B",X"02",X"08",X"00",X"00",X"00",X"00",X"00",X"20",X"0F",X"02",X"03",X"0E",X"02", + X"50",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"10",X"08",X"04",X"01", + X"01",X"10",X"00",X"00",X"00",X"00",X"10",X"08",X"01",X"07",X"01",X"10",X"00",X"00",X"00",X"00", + X"08",X"08",X"00",X"0D",X"01",X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"01",X"07",X"01",X"08", + X"00",X"00",X"00",X"00",X"10",X"08",X"04",X"01",X"01",X"10",X"00",X"00",X"00",X"00",X"10",X"08", + X"0D",X"0E",X"01",X"10",X"00",X"00",X"00",X"00",X"10",X"08",X"0D",X"0E",X"01",X"10",X"00",X"00", + X"00",X"00",X"20",X"08",X"00",X"0D",X"01",X"50",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00", + X"00",X"08",X"08",X"08",X"0B",X"00",X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"04",X"01",X"01", + X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"0B",X"00",X"08",X"00",X"00",X"00",X"00",X"08", + X"08",X"04",X"01",X"01",X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"0B",X"00",X"08",X"00", + X"00",X"00",X"00",X"08",X"08",X"04",X"01",X"01",X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"08", + X"0B",X"00",X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"04",X"01",X"01",X"08",X"00",X"00",X"00", + X"00",X"08",X"08",X"08",X"0B",X"00",X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"04",X"01",X"01", + X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"06",X"03",X"01",X"08",X"00",X"00",X"00",X"00",X"08", + X"08",X"0A",X"08",X"00",X"08",X"00",X"00",X"00",X"00",X"20",X"08",X"08",X"0B",X"00",X"50",X"00", + X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"1F",X"0E",X"02",X"03",X"0E",X"02",X"01",X"00", + X"00",X"00",X"00",X"00",X"0B",X"0E",X"09",X"09",X"0B",X"02",X"01",X"00",X"00",X"00",X"00",X"00", + X"1F",X"0E",X"07",X"02",X"09",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"0B",X"0E",X"07",X"0D", + X"06",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"0A",X"0E",X"0B",X"09",X"02",X"02",X"02",X"00", + X"00",X"00",X"00",X"00",X"0A",X"0E",X"03",X"0D",X"0E",X"01",X"02",X"00",X"00",X"00",X"00",X"00", + X"0A",X"0E",X"0F",X"00",X"0D",X"01",X"02",X"00",X"00",X"00",X"00",X"00",X"0A",X"0E",X"0B",X"0E", + X"09",X"01",X"02",X"00",X"00",X"00",X"00",X"00",X"0B",X"0E",X"08",X"01",X"07",X"01",X"50",X"00", + X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"1F",X"06",X"09",X"02",X"02",X"01", + X"00",X"00",X"00",X"00",X"0B",X"06",X"09",X"02",X"02",X"01",X"00",X"00",X"00",X"00",X"1F",X"06", + X"09",X"02",X"02",X"01",X"00",X"00",X"00",X"00",X"0B",X"06",X"0D",X"0E",X"01",X"01",X"00",X"00", + X"00",X"00",X"0A",X"06",X"0E",X"09",X"01",X"02",X"00",X"00",X"00",X"00",X"0A",X"06",X"0E",X"09", + X"01",X"02",X"00",X"00",X"00",X"00",X"0A",X"06",X"09",X"04",X"01",X"02",X"00",X"00",X"00",X"00", + X"0A",X"06",X"0C",X"05",X"01",X"02",X"00",X"00",X"00",X"00",X"0B",X"06",X"01",X"07",X"01",X"50", + X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"1F",X"06",X"08",X"0B",X"00",X"01",X"00", + X"00",X"00",X"00",X"0B",X"06",X"0F",X"0C",X"00",X"01",X"00",X"00",X"00",X"00",X"1F",X"06",X"08", + X"0E",X"00",X"01",X"00",X"00",X"00",X"00",X"0B",X"06",X"06",X"0F",X"00",X"01",X"00",X"00",X"00", + X"00",X"0A",X"06",X"04",X"01",X"01",X"02",X"00",X"00",X"00",X"00",X"0A",X"06",X"06",X"03",X"01", + X"02",X"00",X"00",X"00",X"00",X"0A",X"06",X"09",X"04",X"01",X"02",X"00",X"00",X"00",X"00",X"0A", + X"06",X"0C",X"05",X"01",X"02",X"00",X"00",X"00",X"00",X"0B",X"06",X"01",X"07",X"01",X"50",X"00", + X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"32",X"C0",X"50",X"DD",X"21",X"52",X"B3",X"DD", + X"6E",X"00",X"DD",X"7E",X"01",X"67",X"B5",X"CA",X"B0",X"B2",X"DD",X"4E",X"02",X"DD",X"46",X"03", + X"54",X"5D",X"36",X"0F",X"13",X"0B",X"ED",X"B0",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"DD",X"4E", + X"02",X"DD",X"46",X"03",X"0B",X"32",X"C0",X"50",X"3E",X"55",X"77",X"BE",X"20",X"3E",X"3E",X"AA", + X"77",X"BE",X"20",X"38",X"78",X"D9",X"47",X"D9",X"79",X"D9",X"4F",X"D9",X"7C",X"D9",X"67",X"D9", + X"7D",X"D9",X"6F",X"CB",X"28",X"CB",X"19",X"78",X"B1",X"28",X"08",X"23",X"54",X"5D",X"36",X"0F", + X"13",X"ED",X"B0",X"D9",X"3E",X"AA",X"BE",X"20",X"0D",X"23",X"0B",X"78",X"B1",X"20",X"C6",X"11", + X"04",X"00",X"DD",X"19",X"18",X"99",X"EB",X"21",X"94",X"B3",X"18",X"04",X"EB",X"21",X"83",X"B3", + X"D9",X"01",X"FF",X"03",X"21",X"00",X"40",X"11",X"01",X"40",X"36",X"0F",X"ED",X"B0",X"01",X"FF", + X"03",X"21",X"00",X"44",X"11",X"01",X"44",X"36",X"0F",X"ED",X"B0",X"32",X"C0",X"50",X"D9",X"7A", + X"D9",X"67",X"D9",X"7B",X"D9",X"6F",X"D9",X"11",X"8A",X"41",X"06",X"11",X"7E",X"12",X"23",X"13", + X"10",X"FA",X"D9",X"0E",X"04",X"11",X"9B",X"41",X"06",X"04",X"AF",X"CB",X"25",X"CB",X"14",X"CB", + X"17",X"10",X"F8",X"13",X"FE",X"0A",X"38",X"02",X"C6",X"06",X"12",X"0D",X"20",X"EA",X"01",X"FF", + X"7F",X"32",X"C0",X"50",X"DD",X"CB",X"00",X"46",X"DD",X"CB",X"00",X"46",X"DD",X"CB",X"00",X"46", + X"DD",X"CB",X"00",X"46",X"DD",X"CB",X"00",X"46",X"0B",X"78",X"B1",X"20",X"E4",X"C3",X"00",X"00", + X"01",X"FF",X"03",X"21",X"00",X"40",X"11",X"00",X"40",X"13",X"36",X"0F",X"ED",X"B0",X"01",X"FF", + X"03",X"21",X"00",X"44",X"11",X"01",X"44",X"36",X"0F",X"ED",X"B0",X"06",X"0C",X"11",X"8A",X"41", + X"21",X"6B",X"B3",X"7E",X"12",X"13",X"23",X"10",X"FA",X"06",X"08",X"21",X"00",X"00",X"11",X"60", + X"B3",X"0E",X"00",X"32",X"C0",X"50",X"79",X"86",X"4F",X"2C",X"20",X"F7",X"24",X"7C",X"E6",X"0F", + X"20",X"F1",X"1A",X"B9",X"20",X"3A",X"13",X"7C",X"FE",X"40",X"20",X"02",X"26",X"80",X"10",X"E1", + X"11",X"CA",X"41",X"06",X"0C",X"21",X"77",X"B3",X"7E",X"12",X"13",X"23",X"10",X"FA",X"01",X"FF", + X"7F",X"32",X"C0",X"50",X"DD",X"CB",X"00",X"46",X"DD",X"CB",X"00",X"46",X"DD",X"CB",X"00",X"46", + X"DD",X"CB",X"00",X"46",X"DD",X"CB",X"00",X"46",X"0B",X"78",X"B1",X"20",X"E4",X"C3",X"A4",X"06", + X"7C",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"FE",X"0A",X"38",X"02",X"C6",X"06",X"08",X"11",X"CA", + X"41",X"21",X"A5",X"B3",X"06",X"13",X"7E",X"12",X"23",X"13",X"10",X"FA",X"13",X"08",X"12",X"C3", + X"91",X"B2",X"00",X"4C",X"00",X"04",X"00",X"40",X"00",X"04",X"00",X"44",X"00",X"04",X"00",X"00", + X"3A",X"9C",X"D3",X"E9",X"90",X"1A",X"5C",X"00",X"4A",X"FF",X"FF",X"21",X"10",X"1C",X"0A",X"12", + X"17",X"14",X"12",X"1A",X"0A",X"1E",X"1A",X"21",X"1E",X"1C",X"0A",X"12",X"17",X"14",X"12",X"1A", + X"0A",X"1E",X"1A",X"21",X"10",X"1C",X"0A",X"12",X"17",X"14",X"12",X"1A",X"0A",X"26",X"21",X"18", + X"23",X"14",X"0A",X"0A",X"21",X"10",X"1C",X"0A",X"12",X"17",X"14",X"12",X"1A",X"0A",X"11",X"21", + X"18",X"13",X"16",X"14",X"0A",X"21",X"1E",X"1C",X"0A",X"12",X"17",X"14",X"12",X"1A",X"0A",X"14", + X"21",X"21",X"1E",X"21",X"0A",X"21",X"1E",X"1C",X"D1",X"E9",X"11",X"B1",X"3B",X"A4",X"85",X"93", + X"56",X"FF",X"C7",X"2D",X"F8",X"30",X"20",X"9A",X"C1",X"59",X"92",X"69",X"9F",X"E9",X"03",X"DB", + X"17",X"C3",X"BB",X"94",X"FC",X"19",X"45",X"FF",X"79",X"2B",X"FE",X"FC",X"24",X"B3",X"EB",X"21", + X"9F",X"E4",X"34",X"E8",X"BB",X"DC",X"AC",X"9E",X"B1",X"3B",X"20",X"81",X"F8",X"A3",X"A9",X"00", + X"98",X"F5",X"B0",X"E4",X"0F",X"2B",X"30",X"7D",X"BA",X"83",X"4C",X"79",X"FA",X"19",X"A9",X"31", + X"A6",X"09",X"1E",X"21",X"20",X"B1",X"24",X"A9",X"23",X"91",X"16",X"6A",X"DA",X"7B",X"36",X"51", + X"30",X"AB",X"0F",X"B3",X"69",X"20",X"36",X"81",X"0F",X"C1",X"A0",X"0D",X"64",X"61",X"72",X"71", + X"74",X"35",X"39",X"18",X"29",X"C1",X"19",X"A7",X"23",X"50",X"F1",X"55",X"09",X"34",X"67",X"30", + X"86",X"2C",X"41",X"6C",X"52",X"67",X"41",X"B7",X"07",X"30",X"79",X"05",X"CF",X"20",X"C7",X"41", + X"31",X"21",X"14",X"E1",X"20",X"5A",X"00",X"A0",X"B4",X"8B",X"50",X"00",X"9D",X"34",X"60",X"25", + X"A0",X"B0",X"2C",X"02",X"12",X"71",X"4D",X"20",X"BB",X"E2",X"A3",X"09",X"B1",X"00",X"5D",X"B5", + X"83",X"36",X"52",X"08",X"71",X"10",X"28",X"3C",X"A4",X"55",X"45",X"C1",X"30",X"95",X"19",X"AE", + X"49",X"68",X"61",X"F0",X"20",X"35",X"26",X"B0",X"71",X"E3",X"81",X"28",X"80",X"3D",X"5B",X"08", + X"CC",X"1F",X"A1",X"FE",X"6F",X"F4",X"4B",X"5F",X"A4",X"8F",X"FC",X"DC",X"3F",X"FB",X"97",X"FB", + X"42",X"1E",X"AE",X"BA",X"D7",X"57",X"9F",X"7A",X"BC",X"E3",X"FE",X"1E",X"5F",X"CD",X"8A",X"C8", + X"D3",X"23",X"FE",X"26",X"0B",X"B2",X"94",X"DC",X"CA",X"0A",X"B3",X"FE",X"56",X"A3",X"E2",X"F4", + X"F6",X"CD",X"56",X"87",X"5C",X"76",X"D4",X"B8",X"D4",X"AF",X"DF",X"F4",X"B4",X"5F",X"42",X"FD", + X"EB",X"F1",X"AB",X"07",X"D5",X"D5",X"3C",X"72",X"9B",X"FF",X"BA",X"71",X"BB",X"7F",X"75",X"37", + X"55",X"3D",X"54",X"9C",X"DF",X"53",X"6F",X"F6",X"67",X"0A",X"BC",X"4B",X"4D",X"2D",X"95",X"96", + X"BD",X"B9",X"1C",X"6D",X"96",X"F7",X"BD",X"5F",X"7D",X"77",X"9F",X"0A",X"DB",X"56",X"92",X"DE", + X"FF",X"59",X"FF",X"4B",X"57",X"E6",X"95",X"B3",X"7A",X"F3",X"49",X"52",X"2E",X"55",X"6E",X"93", + X"B9",X"05",X"7B",X"0C",X"48",X"BC",X"E0",X"BE",X"51",X"CD",X"29",X"11",X"D9",X"E9",X"01",X"70", + X"04",X"70",X"05",X"81",X"A1",X"99",X"59",X"B4",X"A0",X"6A",X"10",X"31",X"43",X"71",X"AC",X"2A", + X"33",X"05",X"89",X"B7",X"B1",X"31",X"1F",X"63",X"08",X"25",X"73",X"A9",X"30",X"30",X"7F",X"81", + X"8D",X"14",X"AB",X"02",X"91",X"73",X"1B",X"71",X"85",X"EA",X"0E",X"28",X"55",X"58",X"39",X"50", + X"94",X"11",X"05",X"E0",X"DC",X"0A",X"20",X"03",X"10",X"46",X"14",X"10",X"C1",X"C0",X"E8",X"1B", + X"2A",X"A9",X"A4",X"E1",X"D2",X"19",X"87",X"01",X"A0",X"80",X"25",X"26",X"73",X"D8",X"73",X"A8", + X"41",X"65",X"E4",X"30",X"A0",X"20",X"89",X"B1",X"30",X"A0",X"88",X"52",X"6A",X"25",X"38",X"25", + X"E0",X"22",X"44",X"B5",X"60",X"8C",X"9C",X"5C",X"B2",X"84",X"43",X"05",X"A2",X"34",X"05",X"28", + X"4A",X"3F",X"69",X"D3",X"3E",X"DF",X"D3",X"4C",X"CD",X"D0",X"3F",X"DA",X"5F",X"5E",X"BE",X"F7", + X"67",X"D3",X"2F",X"ED",X"D3",X"5C",X"9A",X"ED",X"52",X"C6",X"56",X"FF",X"76",X"DC",X"BB",X"EF", + X"C7",X"9F",X"EC",X"CA",X"7D",X"1E",X"79",X"F4",X"8A",X"02",X"3C",X"D7",X"BF",X"76",X"B8",X"54", + X"E9",X"E9",X"FC",X"02",X"66",X"FF",X"FC",X"E0",X"AA",X"AD",X"9E",X"F8",X"EB",X"1F",X"C9",X"77", + X"98",X"F7",X"3F",X"8F",X"E6",X"55",X"AA",X"93",X"4C",X"6F",X"DF",X"D9",X"93",X"CB",X"7C",X"3F", + X"B5",X"97",X"2E",X"83",X"CF",X"FF",X"F5",X"CE",X"E5",X"1F",X"7B",X"3B",X"77",X"D6",X"C2",X"4F", + X"7F",X"0C",X"BE",X"EF",X"BB",X"67",X"DF",X"EE",X"5A",X"AF",X"1F",X"3E",X"37",X"FF",X"C6",X"5E", + X"DF",X"EF",X"BF",X"D7",X"92",X"6F",X"D5",X"7F",X"FE",X"EE",X"6B",X"D9",X"77",X"4F",X"DE",X"6B", + X"DE",X"D3",X"87",X"5E",X"A6",X"D7",X"04",X"46",X"5A",X"44",X"2E",X"80",X"26",X"76",X"69",X"2F", + X"D6",X"FB",X"C7",X"07",X"16",X"05",X"96",X"45",X"4B",X"E2",X"CF",X"04",X"0C",X"AC",X"2F",X"5E", + X"D1",X"32",X"9F",X"C3",X"BE",X"26",X"2F",X"6A",X"62",X"36",X"C2",X"02",X"76",X"E7",X"0F",X"BE", + X"97",X"2E",X"DE",X"2D",X"1F",X"4F",X"A3",X"DF",X"6B",X"5F",X"0F",X"8B",X"C2",X"42",X"27",X"05", + X"2C",X"81",X"01",X"2E",X"86",X"0C",X"4E",X"EB",X"65",X"04",X"56",X"5E",X"16",X"89",X"82",X"A2", + X"74",X"C4",X"3A",X"97",X"8E",X"B8",X"47",X"3E",X"24",X"C1",X"AB",X"26",X"0B",X"AC",X"E7",X"32", + X"21",X"7E",X"42",X"57",X"82",X"A3",X"5B",X"05",X"1F",X"CA",X"03",X"EF",X"A6",X"04",X"80",X"46", + X"92",X"2E",X"86",X"02",X"B3",X"4A",X"4B",X"0F",X"E7",X"AB",X"80",X"9E",X"2A",X"56",X"87",X"4D", + X"B0",X"79",X"75",X"5C",X"A3",X"2C",X"11",X"CF",X"7E",X"D9",X"72",X"B9",X"D8",X"3D",X"BE",X"E8", + X"B1",X"F5",X"79",X"F1",X"78",X"B0",X"F8",X"A0",X"D2",X"39",X"F9",X"F8",X"3C",X"72",X"FC",X"E1", + X"C9",X"E9",X"B1",X"DE",X"B1",X"C4",X"AD",X"B9",X"2B",X"60",X"D3",X"C8",X"EC",X"B5",X"FB",X"F9", + X"70",X"69",X"1A",X"FD",X"7D",X"DB",X"A9",X"39",X"9D",X"29",X"BA",X"B1",X"00",X"BD",X"3E",X"99", + X"74",X"F0",X"23",X"A9",X"BB",X"34",X"8B",X"F5",X"F0",X"B5",X"68",X"F0",X"53",X"30",X"F1",X"E7", + X"A7",X"82",X"FD",X"31",X"B8",X"82",X"D0",X"FF",X"EE",X"D0",X"1A",X"A0",X"F1",X"6D",X"ED",X"F1", + X"18",X"E7",X"D8",X"F2",X"A1",X"A5",X"FE",X"ED",X"FB",X"D0",X"D9",X"F9",X"F8",X"BB",X"7C",X"4B", + X"75",X"85",X"74",X"20",X"25",X"66",X"95",X"79",X"69",X"69",X"DF",X"A8",X"31",X"31",X"31",X"DB", + X"26",X"5B",X"71",X"6F",X"8E",X"16",X"C6",X"63",X"23",X"27",X"43",X"53",X"96",X"46",X"07",X"D6", + X"58",X"EE",X"CE",X"C4",X"42",X"43",X"04",X"45",X"4F",X"42",X"15",X"46",X"DF",X"07",X"37",X"24", + X"22",X"6A",X"56",X"41",X"05",X"17",X"D1",X"0F",X"02",X"0B",X"46",X"ED",X"E1",X"AF",X"04",X"D7", + X"27",X"0E",X"02",X"96",X"17",X"0F",X"07",X"4F",X"0E",X"EC",X"D5",X"4F",X"4A",X"E7",X"E5",X"37", + X"8A",X"4C",X"8B",X"8D",X"26",X"F5",X"6A",X"15",X"E7",X"97",X"17",X"2E",X"94",X"EB",X"89",X"42", + X"1C",X"8F",X"06",X"8C",X"2F",X"50",X"37",X"FE",X"2A",X"8F",X"B1",X"05",X"CF",X"10",X"7E",X"E9", + X"06",X"C7",X"62",X"2F",X"9C",X"56",X"CE",X"6D",X"77",X"0F",X"D2",X"22",X"9B",X"3E",X"2E",X"8B", + X"76",X"DF",X"92",X"8E",X"44",X"4F",X"D0",X"0E",X"0B",X"AE",X"54",X"5A",X"48",X"56",X"40",X"47", + X"7E",X"88",X"7D",X"B8",X"92",X"3A",X"FB",X"E8",X"71",X"FF",X"58",X"F9",X"85",X"E9",X"91",X"F7", + X"AC",X"C5",X"20",X"2F",X"CB",X"F0",X"5C",X"70",X"70",X"BA",X"51",X"B9",X"11",X"A1",X"AC",X"B2", + X"BD",X"59",X"35",X"58",X"EB",X"21",X"B9",X"B0",X"AC",X"FA",X"C9",X"7D",X"29",X"6A",X"39",X"59", + X"8C",X"58",X"B4",X"21",X"C0",X"F1",X"76",X"BB",X"F1",X"69",X"5B",X"C8",X"D8",X"79",X"9C",X"F4", + X"0E",X"2A",X"A9",X"7F",X"35",X"39",X"C9",X"28",X"B7",X"F2",X"38",X"78",X"9A",X"BA",X"E1",X"39", + X"FD",X"A0",X"A9",X"65",X"FC",X"B9",X"E1",X"1C",X"39",X"D1",X"E1",X"B5",X"85",X"F0",X"C4",X"73", + X"AE",X"F8",X"37",X"B1",X"78",X"90",X"B1",X"51",X"7F",X"21",X"A8",X"76",X"D9",X"BC",X"FD",X"B8", + X"EC",X"48",X"3D",X"B7",X"B4",X"99",X"82",X"18",X"FA",X"B1",X"5B",X"7B",X"39",X"8D",X"A9",X"FD", + X"DF",X"E6",X"FF",X"5E",X"42",X"F7",X"7B",X"CB",X"E7",X"FF",X"F7",X"CF",X"DD",X"AF",X"D7",X"DE", + X"47",X"6F",X"CF",X"9F",X"67",X"F5",X"1B",X"AD",X"63",X"47",X"DF",X"BF",X"C5",X"FD",X"DF",X"CD", + X"EB",X"F7",X"87",X"9F",X"DF",X"F3",X"1F",X"FB",X"FF",X"EF",X"FF",X"F5",X"EF",X"9B",X"6F",X"9E", + X"89",X"6F",X"B4",X"AE",X"F3",X"AB",X"F5",X"9F",X"5B",X"7B",X"4B",X"BF",X"EF",X"7F",X"EF",X"DF", + X"FF",X"FC",X"1B",X"FD",X"FD",X"EE",X"48",X"FE",X"DF",X"FA",X"E3",X"17",X"77",X"9D",X"7F",X"D5", + X"F9",X"DD",X"E4",X"D9",X"FA",X"FC",X"D3",X"CD",X"CF",X"AC",X"EB",X"EF",X"CB",X"8F",X"FD",X"F3", + X"F7",X"F3",X"C3",X"5F",X"CF",X"DC",X"CA",X"DF",X"DA",X"7F",X"FB",X"9F",X"FF",X"B6",X"AF",X"FF", + X"FF",X"FA",X"DD",X"FD",X"E3",X"D5",X"B7",X"6E",X"D7",X"9D",X"9C",X"E7",X"4B",X"49",X"FE",X"FF", + X"5A",X"19",X"20",X"70",X"37",X"30",X"C0",X"66",X"90",X"38",X"20",X"20",X"A0",X"C9",X"80",X"00", + X"0A",X"84",X"04",X"1A",X"0C",X"B2",X"08",X"18",X"00",X"49",X"E4",X"52",X"5C",X"75",X"0C",X"10", + X"30",X"28",X"D7",X"12",X"1A",X"40",X"02",X"A2",X"00",X"90",X"88",X"24",X"10",X"E8",X"78",X"C8", + X"82",X"08",X"20",X"00",X"8C",X"21",X"01",X"48",X"99",X"AA",X"EC",X"31",X"46",X"26",X"70",X"CC", + X"05",X"80",X"B8",X"63",X"C1",X"18",X"00",X"30",X"32",X"00",X"10",X"00",X"A1",X"23",X"22",X"04", + X"0A",X"C4",X"67",X"00",X"89",X"15",X"00",X"82",X"62",X"80",X"A2",X"50",X"00",X"3E",X"20",X"A3", + X"32",X"CC",X"2F",X"3C",X"80",X"10",X"81",X"A5",X"01",X"18",X"03",X"75",X"41",X"51",X"56",X"28", + X"04",X"A0",X"3D",X"6A",X"21",X"54",X"D5",X"15",X"3A",X"9A",X"A3",X"18",X"19",X"98",X"32",X"B0", + X"F7",X"FD",X"EF",X"4B",X"DA",X"5F",X"A3",X"DB",X"FF",X"EB",X"FB",X"DF",X"C7",X"EE",X"C7",X"F7", + X"FD",X"BF",X"C9",X"C7",X"63",X"9F",X"F5",X"FF",X"6F",X"1A",X"FE",X"DE",X"7F",X"5F",X"FD",X"FF", + X"F9",X"95",X"F9",X"EB",X"81",X"3B",X"5D",X"D3",X"DF",X"A3",X"E7",X"CF",X"BE",X"AF",X"8F",X"7E", + X"34",X"B5",X"1D",X"CB",X"69",X"6F",X"F1",X"93",X"B4",X"EF",X"E7",X"0D",X"FF",X"3D",X"DB",X"AE", + X"33",X"BB",X"6F",X"5F",X"05",X"83",X"E7",X"9F",X"FB",X"E6",X"BB",X"D1",X"E5",X"D9",X"D7",X"A7", + X"BF",X"FB",X"7F",X"ED",X"5F",X"7D",X"13",X"D7",X"CC",X"FB",X"DC",X"97",X"FF",X"BD",X"75",X"7F", + X"C6",X"16",X"FA",X"C8",X"EE",X"E8",X"A3",X"E7",X"FD",X"A7",X"C6",X"0F",X"E3",X"D4",X"EB",X"04", + X"D1",X"1B",X"C8",X"17",X"C5",X"9F",X"A7",X"77",X"D8",X"A8",X"DF",X"9E",X"3F",X"DB",X"F2",X"FF", + X"00",X"D1",X"C1",X"28",X"1C",X"18",X"00",X"92",X"60",X"20",X"01",X"6A",X"20",X"C0",X"23",X"1A", + X"AB",X"5A",X"D0",X"B2",X"1B",X"10",X"91",X"D1",X"D8",X"02",X"44",X"B0",X"82",X"02",X"6C",X"80", + X"22",X"BC",X"B2",X"38",X"78",X"01",X"20",X"80",X"02",X"9C",X"34",X"A0",X"80",X"30",X"8D",X"A4", + X"52",X"10",X"24",X"D4",X"C8",X"80",X"B0",X"06",X"1C",X"00",X"54",X"40",X"E4",X"68",X"04",X"48", + X"09",X"28",X"01",X"40",X"4A",X"0B",X"EA",X"C0",X"20",X"35",X"80",X"C4",X"13",X"10",X"84",X"9A", + X"C7",X"82",X"34",X"31",X"95",X"38",X"18",X"2A",X"1C",X"DC",X"92",X"A3",X"98",X"00",X"2C",X"7D", + X"96",X"A4",X"B0",X"38",X"27",X"A2",X"C1",X"20",X"94",X"AD",X"0B",X"82",X"1C",X"A1",X"08",X"00", + X"A8",X"81",X"20",X"05",X"20",X"A8",X"A4",X"A8",X"27",X"88",X"02",X"88",X"48",X"CB",X"32",X"80", + X"9F",X"FC",X"74",X"A8",X"D9",X"F9",X"C9",X"FD",X"FB",X"3F",X"FB",X"E8",X"F5",X"F8",X"B8",X"99", + X"58",X"F9",X"E8",X"6B",X"D3",X"2B",X"7B",X"DE",X"D9",X"FB",X"30",X"F9",X"16",X"7B",X"F9",X"7D", + X"F0",X"D9",X"7C",X"FB",X"D9",X"71",X"51",X"BA",X"CD",X"F1",X"FC",X"FB",X"FB",X"F7",X"F9",X"F9", + X"DA",X"E6",X"F8",X"79",X"44",X"AB",X"99",X"58",X"78",X"F5",X"FD",X"E9",X"F9",X"1A",X"9A",X"F5", + X"FC",X"F1",X"FB",X"7A",X"77",X"B8",X"51",X"31",X"39",X"9B",X"A9",X"F5",X"70",X"79",X"93",X"FD", + X"39",X"6B",X"DB",X"F1",X"BA",X"B9",X"D9",X"F6",X"9F",X"FC",X"F9",X"E9",X"F1",X"B8",X"DE",X"F9", + X"E9",X"3C",X"B9",X"B1",X"79",X"F9",X"71",X"B1",X"F2",X"79",X"FC",X"EF",X"F8",X"69",X"E1",X"31", + X"ED",X"B8",X"99",X"B0",X"E9",X"F3",X"29",X"FB",X"F8",X"FB",X"71",X"BA",X"F9",X"B8",X"3D",X"19", + X"06",X"03",X"06",X"C4",X"62",X"2C",X"50",X"86",X"12",X"5C",X"06",X"87",X"07",X"48",X"04",X"60", + X"46",X"D6",X"9F",X"5C",X"44",X"D7",X"A4",X"C7",X"42",X"23",X"8A",X"06",X"07",X"2C",X"21",X"02", + X"08",X"42",X"97",X"2F",X"87",X"10",X"45",X"5A",X"8C",X"0C",X"14",X"44",X"04",X"06",X"A7",X"E0", + X"86",X"A1",X"46",X"26",X"02",X"06",X"47",X"2B",X"83",X"4E",X"E6",X"AC",X"B2",X"84",X"56",X"97", + X"44",X"04",X"AC",X"46",X"0E",X"42",X"66",X"86",X"06",X"A5",X"46",X"1E",X"46",X"D6",X"86",X"06", + X"02",X"42",X"16",X"01",X"21",X"06",X"3B",X"46",X"12",X"42",X"D6",X"06",X"A3",X"0F",X"77",X"86", + X"42",X"16",X"86",X"86",X"0A",X"8B",X"05",X"37",X"2D",X"F2",X"C4",X"0E",X"3E",X"D7",X"87",X"06", + X"C4",X"46",X"85",X"8E",X"4A",X"B0",X"03",X"E6",X"0F",X"C6",X"86",X"D6",X"42",X"08",X"8F",X"65", + X"3F",X"ED",X"69",X"F9",X"59",X"AB",X"7D",X"B5",X"70",X"FD",X"FD",X"BB",X"3F",X"35",X"39",X"EB", + X"7E",X"F8",X"BB",X"7C",X"F1",X"F9",X"FD",X"FD",X"ED",X"F9",X"F9",X"61",X"B9",X"DA",X"D0",X"FF", + X"6D",X"71",X"3F",X"BB",X"D8",X"F5",X"C9",X"68",X"3D",X"F7",X"40",X"F1",X"F8",X"EC",X"A0",X"A8", + X"67",X"B9",X"DE",X"7F",X"98",X"3C",X"DE",X"E9",X"79",X"89",X"3B",X"B0",X"E9",X"F9",X"88",X"F9", + X"F0",X"B7",X"FC",X"E8",X"D8",X"F5",X"B6",X"FD",X"B9",X"F0",X"DC",X"52",X"59",X"B9",X"D9",X"E3", + X"D5",X"F9",X"11",X"B1",X"F9",X"F5",X"E9",X"F8",X"FC",X"79",X"39",X"FB",X"FD",X"B1",X"A0",X"7F", + X"39",X"FF",X"B5",X"F8",X"33",X"FB",X"D3",X"F8",X"F9",X"EB",X"E9",X"79",X"BD",X"7B",X"F9",X"A0", + X"D4",X"B7",X"F8",X"F8",X"19",X"51",X"48",X"7A",X"E1",X"B1",X"DC",X"E8",X"30",X"D9",X"74",X"39", + X"23",X"0E",X"08",X"94",X"06",X"6C",X"32",X"06",X"86",X"86",X"63",X"A6",X"C7",X"84",X"CD",X"C8", + X"32",X"0F",X"8D",X"0E",X"41",X"0C",X"66",X"06",X"E6",X"02",X"88",X"46",X"44",X"77",X"8E",X"A4", + X"9E",X"46",X"5E",X"0A",X"6E",X"87",X"82",X"88",X"02",X"1C",X"8D",X"9D",X"02",X"97",X"6A",X"66", + X"F3",X"A4",X"03",X"81",X"46",X"9A",X"1E",X"34",X"05",X"BD",X"43",X"02",X"03",X"8A",X"A7",X"CC", + X"02",X"5C",X"2E",X"0A",X"07",X"57",X"14",X"C4",X"08",X"0E",X"26",X"A8",X"6F",X"C6",X"03",X"0E", + X"92",X"0E",X"A1",X"26",X"37",X"8A",X"86",X"0E",X"02",X"66",X"C1",X"85",X"42",X"52",X"8C",X"66", + X"86",X"86",X"46",X"0E",X"86",X"E7",X"9E",X"1E",X"C6",X"0B",X"08",X"C6",X"46",X"C6",X"0C",X"44", + X"40",X"84",X"17",X"85",X"46",X"67",X"46",X"8C",X"46",X"67",X"8D",X"95",X"4E",X"C5",X"40",X"06", + X"7B",X"BF",X"FD",X"77",X"DF",X"FF",X"27",X"72",X"FE",X"4E",X"7F",X"DB",X"9B",X"67",X"1F",X"F7", + X"DF",X"BD",X"AF",X"FE",X"F5",X"F5",X"CC",X"36",X"F3",X"FD",X"53",X"6D",X"EF",X"D8",X"BE",X"D5", + X"BF",X"AB",X"1D",X"F2",X"CB",X"BC",X"FC",X"BD",X"6D",X"03",X"FF",X"BF",X"93",X"FF",X"AF",X"FB", + X"A3",X"4F",X"C6",X"7D",X"DB",X"79",X"F5",X"7B",X"7D",X"EB",X"FD",X"EB",X"CD",X"A1",X"F1",X"0E", + X"D2",X"D5",X"AE",X"EB",X"FC",X"EE",X"8D",X"A9",X"FF",X"DF",X"1F",X"F4",X"E2",X"DD",X"36",X"F7", + X"7F",X"13",X"7D",X"AD",X"F6",X"0E",X"DF",X"CF",X"F7",X"64",X"C3",X"7B",X"F5",X"BE",X"EB",X"39", + X"AE",X"9F",X"FE",X"EB",X"FD",X"9B",X"56",X"85",X"EB",X"7F",X"59",X"1F",X"3E",X"62",X"C0",X"5F", + X"7B",X"ED",X"DF",X"F6",X"65",X"79",X"2B",X"FE",X"E7",X"CF",X"7F",X"ED",X"1D",X"FF",X"AF",X"57", + X"88",X"64",X"4B",X"22",X"C0",X"10",X"A4",X"10",X"19",X"22",X"7A",X"AE",X"0A",X"26",X"A0",X"B4", + X"18",X"4D",X"B8",X"81",X"29",X"88",X"31",X"70",X"A0",X"F6",X"00",X"14",X"10",X"F0",X"10",X"70", + X"86",X"80",X"12",X"3E",X"52",X"02",X"B6",X"C9",X"08",X"C0",X"A0",X"70",X"52",X"D8",X"00",X"20", + X"12",X"08",X"50",X"0D",X"02",X"20",X"8C",X"F3",X"28",X"80",X"90",X"80",X"90",X"16",X"78",X"92", + X"20",X"22",X"24",X"58",X"2A",X"4D",X"2D",X"85",X"10",X"30",X"01",X"39",X"00",X"00",X"09",X"33", + X"3F",X"99",X"B0",X"80",X"42",X"72",X"42",X"00",X"11",X"22",X"23",X"A1",X"04",X"08",X"92",X"A3", + X"B1",X"15",X"10",X"5A",X"A8",X"0A",X"40",X"92",X"A5",X"C4",X"92",X"1B",X"20",X"A0",X"00",X"30", + X"42",X"59",X"F2",X"1C",X"0C",X"D0",X"C6",X"CA",X"B0",X"AA",X"1A",X"19",X"5A",X"84",X"BF",X"3D", + X"7D",X"3F",X"EF",X"4D",X"9D",X"99",X"67",X"5B",X"67",X"EB",X"7D",X"D9",X"4D",X"FF",X"D5",X"3D", + X"9F",X"B4",X"9F",X"C7",X"1D",X"49",X"7D",X"B6",X"A7",X"3E",X"CF",X"AB",X"45",X"EF",X"DD",X"EF", + X"FF",X"7D",X"C7",X"BB",X"63",X"E7",X"F3",X"BF",X"6F",X"F6",X"EF",X"DF",X"DB",X"DB",X"A7",X"DF", + X"FB",X"BE",X"AD",X"4B",X"1B",X"5A",X"FF",X"DF",X"3F",X"E7",X"DF",X"87",X"BF",X"ED",X"FD",X"F7", + X"CF",X"D5",X"FF",X"EB",X"B3",X"F1",X"FF",X"83",X"E5",X"D9",X"DE",X"EC",X"EB",X"CD",X"FF",X"33", + X"D7",X"CD",X"79",X"B7",X"F7",X"DE",X"CE",X"EF",X"6B",X"A7",X"BD",X"FE",X"FF",X"E3",X"F6",X"9F", + X"B3",X"FC",X"6B",X"D3",X"79",X"F2",X"D9",X"CF",X"AB",X"8F",X"E7",X"BB",X"F9",X"EE",X"BF",X"B5", + X"E7",X"8A",X"B3",X"FB",X"3E",X"6F",X"6F",X"6C",X"56",X"EF",X"EB",X"CB",X"D3",X"81",X"F5",X"B1", + X"60",X"6B",X"4A",X"98",X"10",X"A8",X"E9",X"28",X"98",X"1D",X"98",X"A0",X"08",X"BC",X"1A",X"8D", + X"86",X"38",X"5D",X"01",X"60",X"A8",X"A2",X"16",X"02",X"64",X"00",X"00",X"A7",X"91",X"03",X"00", + X"70",X"3A",X"00",X"30",X"18",X"25",X"02",X"90",X"50",X"06",X"80",X"88",X"52",X"80",X"10",X"00", + X"E8",X"ED",X"A2",X"12",X"00",X"23",X"A4",X"0B",X"84",X"C4",X"80",X"60",X"20",X"82",X"20",X"0C", + X"88",X"CE",X"2B",X"3E",X"80",X"B7",X"01",X"44",X"10",X"22",X"90",X"03",X"23",X"88",X"11",X"03", + X"81",X"42",X"00",X"39",X"18",X"DA",X"5A",X"36",X"78",X"80",X"48",X"00",X"84",X"0E",X"20",X"00", + X"16",X"82",X"66",X"81",X"30",X"14",X"08",X"10",X"84",X"01",X"51",X"A8",X"09",X"04",X"B3",X"00", + X"4C",X"41",X"40",X"20",X"16",X"C0",X"5A",X"D0",X"02",X"92",X"02",X"19",X"48",X"02",X"80",X"0C", + X"F9",X"99",X"D5",X"79",X"F0",X"79",X"E8",X"B3",X"97",X"6B",X"39",X"FF",X"FF",X"F9",X"B9",X"3A", + X"F1",X"79",X"B3",X"A9",X"A0",X"E9",X"7A",X"B1",X"95",X"30",X"A9",X"9D",X"F9",X"30",X"FD",X"72", + X"5C",X"FC",X"B1",X"F2",X"B9",X"F9",X"59",X"C9",X"73",X"BB",X"3A",X"FA",X"DB",X"98",X"F2",X"D5", + X"51",X"E8",X"7D",X"FB",X"F9",X"5D",X"F9",X"FF",X"32",X"75",X"FE",X"71",X"B1",X"68",X"F4",X"B9", + X"FF",X"F9",X"FD",X"B9",X"B1",X"BA",X"59",X"B9",X"BE",X"E8",X"B8",X"F1",X"F7",X"B8",X"F1",X"49", + X"6D",X"F1",X"9E",X"35",X"E1",X"78",X"E0",X"F9",X"B9",X"F9",X"B0",X"BC",X"D4",X"61",X"63",X"59", + X"F0",X"87",X"D9",X"B9",X"58",X"72",X"D8",X"EB",X"8A",X"F1",X"35",X"33",X"B5",X"79",X"79",X"FD", + X"D0",X"6D",X"39",X"F9",X"FF",X"F9",X"54",X"F9",X"7B",X"F9",X"FB",X"E9",X"AD",X"F8",X"79",X"F0", + X"77",X"07",X"30",X"5D",X"8F",X"C7",X"A5",X"07",X"04",X"A7",X"8D",X"44",X"86",X"C6",X"A0",X"45", + X"18",X"07",X"D4",X"7F",X"1F",X"03",X"04",X"05",X"07",X"4E",X"66",X"05",X"6E",X"06",X"06",X"4E", + X"07",X"2E",X"47",X"46",X"06",X"26",X"06",X"46",X"76",X"06",X"02",X"01",X"97",X"D3",X"C6",X"87", + X"A2",X"87",X"00",X"2A",X"37",X"32",X"A4",X"87",X"66",X"76",X"41",X"1E",X"7E",X"63",X"14",X"89", + X"BE",X"06",X"0F",X"53",X"CA",X"8E",X"06",X"02",X"46",X"26",X"07",X"87",X"4F",X"44",X"04",X"0A", + X"96",X"EC",X"10",X"4E",X"0A",X"0C",X"A6",X"A6",X"0E",X"4F",X"C7",X"86",X"02",X"8E",X"06",X"AC", + X"D6",X"00",X"9B",X"23",X"45",X"2E",X"0C",X"67",X"07",X"22",X"83",X"43",X"62",X"C7",X"0C",X"0E", + X"87",X"06",X"14",X"66",X"BD",X"16",X"E7",X"0E",X"8F",X"06",X"64",X"0F",X"86",X"0F",X"06",X"86", + X"FF",X"D1",X"99",X"78",X"5D",X"69",X"F9",X"71",X"DB",X"71",X"3B",X"9B",X"ED",X"7D",X"F8",X"79", + X"9C",X"F9",X"DB",X"F6",X"EB",X"41",X"77",X"43",X"D9",X"59",X"FB",X"33",X"FF",X"F5",X"B9",X"39", + X"A8",X"C9",X"31",X"A3",X"5D",X"B4",X"71",X"69",X"78",X"7B",X"BE",X"FD",X"78",X"BD",X"73",X"39", + X"F4",X"F9",X"BC",X"B1",X"F9",X"64",X"22",X"3C",X"9B",X"5A",X"B9",X"74",X"5C",X"99",X"6B",X"F9", + X"7F",X"90",X"F9",X"78",X"F8",X"B9",X"3B",X"B1",X"39",X"F9",X"6F",X"F8",X"DE",X"FF",X"B1",X"D8", + X"A9",X"96",X"E8",X"DA",X"F5",X"7A",X"A4",X"39",X"B9",X"F9",X"DD",X"4B",X"DB",X"FA",X"D8",X"7B", + X"F5",X"C1",X"B9",X"FC",X"D8",X"79",X"9E",X"90",X"E9",X"50",X"34",X"99",X"A1",X"59",X"FD",X"69", + X"A1",X"FB",X"1B",X"B8",X"77",X"B9",X"14",X"1B",X"27",X"48",X"FF",X"08",X"F8",X"EB",X"B0",X"F8", + X"B9",X"66",X"03",X"46",X"0F",X"47",X"75",X"C6",X"47",X"02",X"07",X"02",X"0C",X"24",X"2F",X"02", + X"8C",X"43",X"82",X"D5",X"2A",X"0F",X"9C",X"02",X"28",X"0C",X"03",X"8D",X"36",X"04",X"23",X"86", + X"42",X"D2",X"A4",X"46",X"CF",X"8C",X"76",X"96",X"C7",X"05",X"86",X"80",X"5B",X"66",X"46",X"0E", + X"16",X"4C",X"4E",X"46",X"52",X"07",X"A7",X"C5",X"03",X"0F",X"44",X"A3",X"0E",X"46",X"46",X"64", + X"0E",X"27",X"26",X"0B",X"07",X"4E",X"82",X"C6",X"07",X"06",X"D6",X"46",X"4E",X"C2",X"A4",X"06", + X"07",X"47",X"17",X"87",X"58",X"15",X"57",X"07",X"44",X"97",X"0C",X"42",X"04",X"86",X"06",X"57", + X"03",X"44",X"06",X"46",X"D2",X"0E",X"0F",X"43",X"47",X"56",X"AC",X"4C",X"06",X"06",X"37",X"86", + X"06",X"56",X"B4",X"07",X"6E",X"28",X"54",X"07",X"C6",X"86",X"07",X"83",X"1E",X"88",X"46",X"AD"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_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/Arcade/Pacman Hardware/Eeekk_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/build_id.v new file mode 100644 index 00000000..f6567fae --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171122" +`define BUILD_TIME "114527" diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..fec08f5f --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) := (others => '0'); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/eeekk.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/eeekk.vhd new file mode 100644 index 00000000..677f5d5a --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/eeekk.vhd @@ -0,0 +1,488 @@ +-- +-- A simulation model of Eeekk! hardware +-- Copyright (c) Sorgelig - 2017 +-- +-- Based on Pacman core +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 006 Refactoring, 8 sprites support by Sorgelig +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity EEEKKt is + generic( + eight_sprites : boolean := false + ); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0 : in std_logic_vector(7 downto 0); + in1 : in std_logic_vector(7 downto 0); + dipsw1 : in std_logic_vector(7 downto 0); + dipsw2 : in std_logic_vector(7 downto 0); + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of EEEKKt is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_int_l : std_logic := '1'; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal rom_x,rom_d : std_logic_vector(7 downto 0); + signal dcnt : std_logic_vector(1 downto 0); + signal old_rd_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal hp : std_logic_vector ( 4 downto 0); + signal vp : std_logic_vector ( 4 downto 0); + signal ram_cs : std_logic; + signal ram_data : std_logic_vector(7 downto 0); + signal vram_data : std_logic_vector(7 downto 0); + signal sprite_xy_data : std_logic_vector(7 downto 0); + signal vram_addr : std_logic_vector(11 downto 0); + + signal iodec_spr_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_sn1_l : std_logic; + signal iodec_sn2_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw1_l : std_logic; + signal iodec_dipsw2_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + + signal sn_we : std_logic; + signal wav1,wav2,wav3 : std_logic_vector(7 downto 0); + + component ym2149 is port + ( + CLK : in std_logic; + CE : in std_logic; + RESET : in std_logic; + BDIR : in std_logic; + BC : in std_logic; + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + CHANNEL_A: out std_logic_vector(7 downto 0); + CHANNEL_B: out std_logic_vector(7 downto 0); + CHANNEL_C: out std_logic_vector(7 downto 0); + + SEL : in std_logic; + MODE : in std_logic; + IOA_in : in std_logic_vector(7 downto 0); + IOA_out : out std_logic_vector(7 downto 0); + + IOB_in : in std_logic_vector(7 downto 0); + IOB_out : out std_logic_vector(7 downto 0) + ); + end component; + +begin + +-- +-- video timing +-- +p_hvcnt : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + if hcnt = "111111111" then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + if do_hsync then + if vcnt = "111111111" then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; +end process; + +vsync <= not vcnt(8); +do_hsync <= (hcnt = "010101111"); -- 0AF + +p_sync : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + + if (hcnt = "010001111") and not eight_sprites then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") and not eight_sprites then + hblank <= '0'; -- 0EF + elsif (hcnt = "111111111") and eight_sprites then + hblank <= '1'; + elsif (hcnt = "011111111") and eight_sprites then + hblank <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; +end process; + +-- +-- cpu +-- +p_irq_req_watchdog : process + variable rising_vblank : boolean; +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + --watchdog_reset_l <= not reset; + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + end if; +end process; + +u_cpu : entity work.T80sed +port map +( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => hcnt(0) and ena_6, + WAIT_n => sync_bus_wreq_l, + INT_n => cpu_int_l, + NMI_n => '1', + BUSRQ_n => '1', + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out +); + +-- rom 0x0000 - 0x3FFF +-- syncbus 0x4000 - 0x7FFF +sync_bus_cs_l <= '0' when cpu_mreq_l = '0' and cpu_rfsh_l = '1' and cpu_addr(14) = '1' else '1'; +sync_bus_wreq_l <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '1' and cpu_rd_l = '0' else '1'; +sync_bus_stb <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '0' else '1'; +sync_bus_r_w_l <= '0' when sync_bus_stb = '0' and cpu_rd_l = '1' else '1'; + +-- +-- sync bus custom ic +-- +p_sync_bus_reg : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; +end process; + + +-- WRITE +-- out_l 0x5000 - 0x503F control space +-- sn1_l 0x5040 - 0x504F sound +-- sn2_l 0x5050 - 0x505F sound +-- spr_l 0x5060 - 0x506F sprite +-- wdr_l 0x50C0 - 0x50FF watchdog reset +iodec_out_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_sn1_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"4" else '1'; +iodec_sn2_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"5" else '1'; +iodec_spr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"6" else '1'; +iodec_wdr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +-- READ +-- in0_l 0x5000 - 0x503F in port 0 +-- in1_l 0x5040 - 0x507F in port 1 +-- dipsw_l 0x5080 - 0x50BF dip switches +iodec_in0_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_in1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"01" else '1'; +iodec_dipsw1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"10" else '1'; +iodec_dipsw2_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +p_control_reg : process +begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + elsif (iodec_out_l = '0') then + control_reg(to_integer(unsigned(cpu_addr(2 downto 0)))) <= cpu_data_out(0); + end if; + end if; +end process; + +p_decrypt : process +begin + wait until rising_edge(clk); + if watchdog_reset_l = '0' then + dcnt <= "01"; + else + old_rd_l <= cpu_rd_l; + if old_rd_l = '1' and cpu_rd_l = '0' and cpu_iorq_l = '0' and cpu_m1_l = '1' then + if cpu_addr(0) = '1' then + dcnt <= dcnt - "1"; + else + dcnt <= dcnt + "1"; + end if; + end if; + end if; +end process; + +rom_d <= not rom_x(7) & not rom_x(6) & rom_x(1) & not rom_x(3) & not rom_x(0) & not rom_x(4) & not rom_x(2) & not rom_x(5) when dcnt = "00" else + not rom_x(7) & not rom_x(1) & not rom_x(4) & not rom_x(3) & not rom_x(0) & rom_x(6) & not rom_x(2) & not rom_x(5) when dcnt = "01" else + rom_x(7) & not rom_x(6) & rom_x(1) & not rom_x(0) & rom_x(3) & not rom_x(4) & not rom_x(2) & not rom_x(5) when dcnt = "10" else + rom_x(7) & not rom_x(1) & not rom_x(4) & not rom_x(0) & rom_x(3) & rom_x(6) & not rom_x(2) & not rom_x(5); + +cpu_data_in <= cpu_vec_reg when (cpu_iorq_l = '0') and (cpu_m1_l = '0') else + sync_bus_reg when sync_bus_wreq_l = '0' else + rom_d when cpu_addr(14) = '0' else + in0 when iodec_in0_l = '0' else + in1 when iodec_in1_l = '0' else + dipsw1 when iodec_dipsw1_l = '0' else + dipsw2 when iodec_dipsw2_l = '0' else + ram_data; + +u_program_rom : entity work.ROM_PGM_0 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => rom_x +); + +ram_cs <= '1' when cpu_addr(15 downto 12) = X"4" else '0'; + +u_rams : work.dpram generic map (12,8) +port map +( + clock_a => clk, + enable_a => ena_6, + wren_a => not sync_bus_r_w_l and ram_cs, + address_a => cpu_addr(11 downto 0), + data_a => cpu_data_out, -- cpu only source of ram data + q_a => ram_data, + + clock_b => clk, + address_b => vram_addr(11 downto 0), + q_b => vram_data +); + +-- +-- video subsystem +-- + +-- vram addr custom ic +hp <= hcnt(7 downto 3) when control_reg(3) = '0' else not hcnt(7 downto 3); +vp <= vcnt(7 downto 3) when control_reg(3) = '0' else not vcnt(7 downto 3); +vram_addr <= '0' & hcnt(2) & vp & hp when hcnt(8)='1' else + x"FF" & hcnt(6 downto 4) & hcnt(2) when hblank = '1' else + '0' & hcnt(2) & hp(3) & hp(3) & hp(3) & hp(3) & hp(0) & vp; + +sprite_xy_ram : work.dpram generic map (4,8) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not iodec_spr_l, + address_a => cpu_addr(3 downto 0), + data_a => cpu_data_out, + + clock_b => CLK, + address_b => vram_addr(3 downto 0), + q_b => sprite_xy_data +); + +u_video : entity work.PACMAN_VIDEO +port map +( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + vram_data => vram_data, + sprite_xy => sprite_xy_data, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + O_HBLANK => O_HBLANK, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk +); + +O_HSYNC <= hSync; +O_VSYNC <= vSync; +O_VBLANK <= vblank; + +-- +-- +-- audio subsystem +-- +u_audio : entity work.PACMAN_AUDIO +port map ( + I_HCNT => hcnt, + -- + I_AB => cpu_addr(11 downto 0), + I_DB => cpu_data_out, + -- + I_WR1_L => iodec_sn2_l, + I_WR0_L => iodec_sn1_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk +); + +end RTL; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_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/Arcade/Pacman Hardware/Eeekk_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/Eeekk_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_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/Arcade/Pacman Hardware/Eeekk_MiST/rtl/osd.v b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_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/Arcade/Pacman Hardware/Eeekk_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..91313469 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not I_WR1_L, + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => rom3m(1), + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..1552d65b --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/pacman_video.vhd @@ -0,0 +1,279 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 004 Refactoring, 8 sprite support by Sorgelig +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VIDEO is + generic( + alt_transp : boolean := false + ); + port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + vram_data : in std_logic_vector(7 downto 0); + sprite_xy : in std_logic_vector(7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + O_HBLANK : out std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_VIDEO is + + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal sprite_data : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + signal obj_on2 : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_op_t1 : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal sprite_ram_ip : std_logic_vector(5 downto 0); + signal sprite_ram_op : std_logic_vector(5 downto 0); + signal sprite_addr : std_logic_vector(7 downto 0); + signal sprite_addr_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(5 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + +dr <= not sprite_xy when I_HBLANK = '1' else "11111111"; -- pull ups on board + +p_char_regs : process + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; +begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & not I_HBLANK); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + sprite_data <= vram_data; -- character reg + end if; +end process; + +xflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(1); +yflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(0); + +obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + +ca(12) <= char_hblank_reg; +ca(11 downto 6) <= sprite_data(7 downto 2); +ca(5) <= sprite_data(1) when char_hblank_reg = '0' else char_sum_reg(3) xor xflip; +ca(4) <= sprite_data(0) when char_hblank_reg = '0' else I_HCNT(3); +ca(3) <= I_HCNT(2) xor yflip; +ca(2) <= char_sum_reg(2) xor xflip; +ca(1) <= char_sum_reg(1) xor xflip; +ca(0) <= char_sum_reg(0) xor xflip; + +-- char roms +char_rom_5ef : entity work.GFX1 +port map +( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf +); + +p_char_shift : process +begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_buf(7 downto 4); -- load + shift_regl <= char_rom_5ef_buf(3 downto 0); + when others => null; + end case; + end if; +end process; + +shift_sel(0) <= I_HCNT(0) and I_HCNT(1) when vout_yflip = '0' else '1'; +shift_sel(1) <= '1' when vout_yflip = '0' else I_HCNT(0) and I_HCNT(1); +shift_op(0) <= shift_regl(3) when vout_yflip = '0' else shift_regl(0); +shift_op(1) <= shift_regu(3) when vout_yflip = '0' else shift_regu(0); + +p_video_out_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= vram_data(4 downto 0); -- colour reg + end if; + + if I_HCNT(3 downto 0) = "0111" and (vout_hblank='1' or I_HBLANK='1' or vout_obj_on='0') then + sprite_addr <= dr; + else + sprite_addr <= sprite_addr + "1"; + end if; + end if; +end process; + +col_rom_4a : entity work.PROM4_DST +port map +( + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a +); + +u_sprite_ram : work.dpram generic map (8,6) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => vout_obj_on_t1, + address_a => sprite_addr_t1, + data_a => sprite_ram_ip, + + clock_b => CLK, + enable_b => ENA_6, + address_b => sprite_addr, + q_b => sprite_ram_op +); + +sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "000000"; +video_op_sel <= '0' when alt_transp and (sprite_ram_reg(1 downto 0) = "00") else + '0' when not alt_transp and (sprite_ram_reg(5 downto 2) = "0000") else + '1'; + +p_sprite_ram_ip_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + sprite_addr_t1 <= sprite_addr; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + shift_op_t1 <= shift_op; + end if; +end process; + +sprite_ram_ip <= (others => '0') when vout_hblank_t1 = '0' else + sprite_ram_reg when video_op_sel = '1' else + lut_4a_t1(3 downto 0) & shift_op_t1; + +final_col <= (others => '0') when (vout_hblank = '1') or (I_VBLANK = '1') else + sprite_ram_reg(5 downto 2) when video_op_sel = '1' else + lut_4a(3 downto 0); + +-- assign video outputs from color LUT PROM +col_rom_7f : entity work.PROM7_DST +port map +( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE +); + +O_HBLANK <= vout_hblank and vout_hblank_t1; + +end architecture; diff --git a/Arcade/Pacman Hardware/Eeekk_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_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/Arcade/Pacman Hardware/Eeekk_MiST/rtl/pll.v b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/pll.v new file mode 100644 index 00000000..60297687 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 8, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "9" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "9" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Pacman Hardware/Eeekk_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/Eeekk_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/Eeekk_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/Eeekk_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/Arcade/Pacman Hardware/Eyes_MiST/Eyes.qpf b/Arcade/Pacman Hardware/Eyes_MiST/Eyes.qpf new file mode 100644 index 00000000..7e8e0030 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/Eyes.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Eyes" diff --git a/Arcade/Pacman Hardware/Eyes_MiST/Eyes.qsf b/Arcade/Pacman Hardware/Eyes_MiST/Eyes.qsf new file mode 100644 index 00000000..0a241769 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/Eyes.qsf @@ -0,0 +1,169 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 23:14:41 November 10, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Eyes_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 PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Eyes +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# 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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" + +# 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 ENTITY(MrTNT) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(MrTNT) +# ----------------- +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM3_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GFX1.vhd +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Eyes.sv +set_global_assignment -name VHDL_FILE rtl/pacman_vram_addr.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_rom_descrambler.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VHDL_FILE rtl/sega_decode.vhd +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/Eyes_MiST/README.txt b/Arcade/Pacman Hardware/Eyes_MiST/README.txt new file mode 100644 index 00000000..e5ec503a --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/README.txt @@ -0,0 +1,24 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Eyes port to MiST by Gehstock +-- 10 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE : Fire +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/Eyes_MiST/Release/Eyes.rbf b/Arcade/Pacman Hardware/Eyes_MiST/Release/Eyes.rbf new file mode 100644 index 00000000..29cb8547 Binary files /dev/null and b/Arcade/Pacman Hardware/Eyes_MiST/Release/Eyes.rbf differ diff --git a/Arcade/Pacman Hardware/Eyes_MiST/clean.bat b/Arcade/Pacman Hardware/Eyes_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_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/Arcade/Pacman Hardware/Eyes_MiST/rtl/Eyes.sv b/Arcade/Pacman Hardware/Eyes_MiST/rtl/Eyes.sv new file mode 100644 index 00000000..8c1ac366 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/Eyes.sv @@ -0,0 +1,192 @@ +//============================================================================ +// Arcade: Pengo +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Eyes +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Eyes;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [7:0] audio; +wire hsync,vsync; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid = ce_6m; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(292), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + + +pacman eyes +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .in0_reg(~{2'b00, m_coin, 1'b0, m_down,m_right,m_left,m_up}), + .in1_reg(~{1'b0, m_start2, m_start1, m_fire, 4'b0000}), + + .dipsw_reg(8'b0_1_11_00_11), + + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +endmodule diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..7822e810 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"9C",X"63",X"41",X"9C",X"BE",X"BE",X"41",X"00",X"41",X"14",X"36",X"41",X"63",X"63",X"14",X"00", + X"41",X"41",X"FF",X"00",X"41",X"41",X"FF",X"00",X"00",X"22",X"77",X"00",X"00",X"00",X"77",X"00", + X"41",X"FF",X"DD",X"63",X"C9",X"77",X"DD",X"00",X"63",X"14",X"55",X"22",X"77",X"36",X"14",X"00", + X"36",X"C9",X"C9",X"22",X"FF",X"63",X"C9",X"00",X"14",X"14",X"77",X"00",X"36",X"14",X"55",X"00", + X"14",X"14",X"FF",X"9C",X"FF",X"9C",X"14",X"00",X"00",X"63",X"77",X"00",X"77",X"41",X"36",X"00", + X"BE",X"41",X"41",X"22",X"FF",X"63",X"41",X"00",X"00",X"55",X"55",X"77",X"55",X"77",X"55",X"00", + X"36",X"C9",X"C9",X"BE",X"FF",X"FF",X"C9",X"00",X"00",X"36",X"14",X"41",X"14",X"63",X"14",X"00", + X"00",X"77",X"88",X"00",X"00",X"00",X"FF",X"00",X"36",X"14",X"55",X"36",X"77",X"36",X"14",X"00", + X"36",X"C9",X"DD",X"36",X"77",X"C9",X"DD",X"00",X"00",X"55",X"14",X"63",X"63",X"77",X"14",X"00", + X"9C",X"C9",X"EB",X"00",X"BE",X"C9",X"C9",X"00",X"63",X"14",X"14",X"63",X"77",X"77",X"14",X"00", + X"62",X"00",X"00",X"00",X"41",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"41",X"00",X"00",X"00",X"62",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"94",X"00",X"00",X"00",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"94", + X"62",X"62",X"63",X"63",X"63",X"63",X"62",X"62",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"94",X"94",X"9C",X"9C",X"9C",X"9C",X"94",X"94", + X"F6",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"F6",X"00",X"00",X"00",X"FF",X"00",X"00",X"00", + X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"F6",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"F6", + X"08",X"01",X"02",X"0C",X"0C",X"02",X"01",X"08",X"01",X"08",X"04",X"03",X"03",X"04",X"08",X"01", + X"08",X"81",X"02",X"0C",X"0C",X"02",X"81",X"08",X"01",X"48",X"04",X"03",X"03",X"04",X"48",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"08",X"31",X"9A",X"84",X"84",X"9A",X"31",X"08",X"01",X"38",X"65",X"42",X"42",X"65",X"38",X"01", + X"9C",X"4F",X"B1",X"2E",X"B2",X"4F",X"4F",X"9C",X"63",X"8F",X"F8",X"17",X"74",X"8F",X"8F",X"63", + X"9C",X"F1",X"4F",X"2E",X"2E",X"4F",X"F1",X"9C",X"63",X"F8",X"8F",X"17",X"17",X"8F",X"F8",X"63", + X"9C",X"4F",X"4F",X"B2",X"2E",X"F1",X"4F",X"9C",X"63",X"8F",X"8F",X"74",X"17",X"F8",X"8F",X"63", + X"00",X"84",X"08",X"00",X"00",X"08",X"84",X"00",X"00",X"42",X"01",X"00",X"00",X"01",X"42",X"00", + X"00",X"86",X"08",X"08",X"08",X"08",X"86",X"00",X"00",X"46",X"01",X"01",X"01",X"01",X"46",X"00", + X"08",X"87",X"08",X"08",X"08",X"08",X"87",X"08",X"01",X"4E",X"01",X"01",X"01",X"01",X"4E",X"01", + X"02",X"C8",X"04",X"22",X"02",X"14",X"78",X"22",X"14",X"B1",X"22",X"04",X"14",X"02",X"C1",X"04", + X"20",X"49",X"10",X"02",X"20",X"04",X"F7",X"02",X"04",X"FE",X"02",X"10",X"04",X"20",X"89",X"10", + X"22",X"81",X"14",X"20",X"22",X"10",X"8F",X"20",X"10",X"4F",X"20",X"14",X"10",X"22",X"48",X"14", + X"08",X"B1",X"92",X"84",X"84",X"92",X"B1",X"08",X"01",X"78",X"64",X"42",X"42",X"64",X"78",X"01", + X"00",X"92",X"84",X"08",X"08",X"84",X"92",X"00",X"00",X"64",X"42",X"01",X"01",X"42",X"64",X"00", + X"00",X"84",X"08",X"00",X"00",X"08",X"84",X"00",X"00",X"42",X"01",X"00",X"00",X"01",X"42",X"00", + X"00",X"04",X"08",X"00",X"00",X"08",X"04",X"00",X"00",X"02",X"01",X"00",X"00",X"01",X"02",X"00", + X"00",X"02",X"04",X"08",X"08",X"04",X"02",X"00",X"00",X"04",X"02",X"01",X"01",X"02",X"04",X"00", + X"08",X"01",X"02",X"04",X"04",X"02",X"01",X"08",X"01",X"08",X"04",X"02",X"02",X"04",X"08",X"01", + X"08",X"B1",X"92",X"84",X"84",X"92",X"B1",X"08",X"01",X"78",X"64",X"42",X"42",X"64",X"78",X"01", + X"08",X"B1",X"9E",X"8C",X"8C",X"9E",X"B1",X"08",X"01",X"78",X"67",X"43",X"43",X"67",X"78",X"01", + X"08",X"BF",X"92",X"84",X"84",X"92",X"BF",X"08",X"01",X"7F",X"64",X"42",X"42",X"64",X"7F",X"01", + X"0C",X"B9",X"B1",X"92",X"92",X"B1",X"B9",X"0C",X"03",X"79",X"78",X"64",X"64",X"78",X"79",X"03", + X"0C",X"B5",X"BD",X"92",X"92",X"BD",X"B5",X"0C",X"03",X"7A",X"7B",X"64",X"64",X"7B",X"7A",X"03", + X"0C",X"B3",X"B3",X"9E",X"9E",X"B3",X"B3",X"0C",X"03",X"7C",X"7C",X"67",X"67",X"7C",X"7C",X"03", + X"00",X"00",X"36",X"36",X"36",X"36",X"00",X"00",X"00",X"00",X"36",X"36",X"36",X"36",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"88",X"36",X"22",X"88",X"9C",X"9C",X"22",X"00",X"63",X"88",X"9C",X"63",X"77",X"77",X"88",X"00", + X"22",X"22",X"BE",X"00",X"22",X"22",X"BE",X"00",X"00",X"14",X"FF",X"00",X"00",X"00",X"FF",X"00", + X"22",X"BE",X"AA",X"36",X"22",X"BE",X"AA",X"00",X"36",X"C9",X"EB",X"14",X"FF",X"9C",X"C9",X"00", + X"9C",X"22",X"22",X"14",X"BE",X"36",X"22",X"00",X"88",X"C9",X"FF",X"00",X"DD",X"88",X"EB",X"00", + X"88",X"88",X"BE",X"88",X"BE",X"88",X"88",X"00",X"00",X"36",X"FF",X"41",X"FF",X"63",X"9C",X"00", + X"9C",X"22",X"22",X"14",X"BE",X"36",X"22",X"00",X"41",X"AA",X"AA",X"BE",X"EB",X"BE",X"AA",X"00", + X"9C",X"22",X"22",X"9C",X"BE",X"BE",X"22",X"00",X"00",X"DD",X"C9",X"63",X"C9",X"77",X"C9",X"00", + X"00",X"BE",X"00",X"00",X"00",X"00",X"BE",X"00",X"9C",X"88",X"EB",X"9C",X"BE",X"9C",X"C9",X"00", + X"9C",X"22",X"AA",X"9C",X"BE",X"22",X"AA",X"00",X"00",X"EB",X"C9",X"36",X"36",X"FF",X"C9",X"00", + X"88",X"22",X"36",X"00",X"9C",X"22",X"22",X"00",X"77",X"C9",X"C9",X"36",X"FF",X"FF",X"C9",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"BE",X"88",X"88",X"BE",X"BE",X"BE",X"88",X"00",X"63",X"9C",X"9C",X"63",X"77",X"77",X"88",X"00", + X"9C",X"22",X"22",X"BE",X"BE",X"BE",X"22",X"00",X"36",X"C9",X"C9",X"FF",X"FF",X"FF",X"C9",X"00", + X"14",X"36",X"22",X"88",X"36",X"9C",X"22",X"00",X"14",X"9C",X"88",X"63",X"9C",X"77",X"88",X"00", + X"88",X"22",X"36",X"BE",X"9C",X"BE",X"22",X"00",X"63",X"88",X"9C",X"FF",X"77",X"FF",X"88",X"00", + X"22",X"BE",X"22",X"00",X"22",X"BE",X"22",X"00",X"88",X"FF",X"C9",X"00",X"C9",X"FF",X"C9",X"00", + X"00",X"00",X"00",X"BE",X"00",X"BE",X"00",X"00",X"88",X"C9",X"C9",X"FF",X"C9",X"FF",X"C9",X"00", + X"BE",X"36",X"22",X"88",X"BE",X"9C",X"22",X"00",X"C9",X"9C",X"C9",X"63",X"C9",X"77",X"88",X"00", + X"BE",X"00",X"00",X"BE",X"BE",X"BE",X"00",X"00",X"FF",X"41",X"41",X"FF",X"FF",X"FF",X"41",X"00", + X"22",X"22",X"BE",X"00",X"22",X"22",X"BE",X"00",X"88",X"88",X"FF",X"00",X"88",X"88",X"FF",X"00", + X"9C",X"22",X"22",X"14",X"BE",X"36",X"22",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00",X"00", + X"22",X"88",X"BE",X"BE",X"36",X"BE",X"9C",X"00",X"88",X"41",X"36",X"FF",X"9C",X"FF",X"63",X"00", + X"22",X"BE",X"22",X"00",X"22",X"BE",X"22",X"00",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00", + X"BE",X"00",X"00",X"BE",X"BE",X"BE",X"88",X"00",X"FF",X"77",X"77",X"FF",X"FF",X"FF",X"63",X"00", + X"BE",X"00",X"9C",X"BE",X"BE",X"BE",X"88",X"00",X"FF",X"77",X"41",X"FF",X"FF",X"FF",X"63",X"00", + X"9C",X"22",X"22",X"9C",X"BE",X"BE",X"22",X"00",X"77",X"88",X"88",X"77",X"FF",X"FF",X"88",X"00", + X"00",X"88",X"88",X"BE",X"88",X"BE",X"88",X"00",X"77",X"88",X"88",X"FF",X"FF",X"FF",X"88",X"00", + X"AA",X"22",X"BE",X"9C",X"9C",X"BE",X"AA",X"00",X"77",X"88",X"88",X"77",X"FF",X"FF",X"88",X"00", + X"22",X"88",X"BE",X"BE",X"36",X"BE",X"9C",X"00",X"77",X"88",X"C9",X"FF",X"FF",X"FF",X"88",X"00", + X"9C",X"22",X"22",X"14",X"BE",X"36",X"22",X"00",X"00",X"C9",X"DD",X"36",X"55",X"FF",X"C9",X"00", + X"00",X"00",X"BE",X"00",X"00",X"00",X"BE",X"00",X"88",X"88",X"FF",X"00",X"88",X"88",X"FF",X"00", + X"9C",X"22",X"22",X"9C",X"BE",X"BE",X"22",X"00",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00", + X"00",X"9C",X"9C",X"00",X"88",X"88",X"BE",X"00",X"FF",X"41",X"41",X"FF",X"FF",X"FF",X"00",X"00", + X"BE",X"9C",X"9C",X"BE",X"BE",X"BE",X"88",X"00",X"FF",X"41",X"41",X"FF",X"FF",X"FF",X"63",X"00", + X"36",X"9C",X"9C",X"36",X"BE",X"BE",X"88",X"00",X"9C",X"77",X"77",X"9C",X"BE",X"BE",X"63",X"00", + X"00",X"00",X"BE",X"00",X"00",X"00",X"BE",X"00",X"BE",X"FF",X"41",X"00",X"FF",X"BE",X"41",X"00", + X"22",X"BE",X"22",X"36",X"22",X"BE",X"AA",X"00",X"9C",X"C9",X"FF",X"88",X"BE",X"88",X"EB",X"00", + X"BD",X"50",X"4A",X"18",X"C8",X"09",X"90",X"50",X"41",X"27",X"50",X"4E",X"19",X"00",X"01",X"00", + X"BD",X"50",X"4A",X"D8",X"C8",X"09",X"90",X"37",X"41",X"27",X"37",X"4E",X"D9",X"00",X"01",X"00", + X"BD",X"50",X"4A",X"10",X"C8",X"09",X"90",X"50",X"41",X"67",X"50",X"4E",X"11",X"00",X"01",X"00", + X"BD",X"34",X"09",X"53",X"C8",X"41",X"52",X"34",X"01",X"FF",X"00",X"C8",X"37",X"BD",X"4E",X"09", + X"00",X"88",X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"41",X"00",X"00",X"00",X"00",X"41",X"00", + X"9C",X"22",X"01",X"22",X"22",X"41",X"1C",X"9C",X"63",X"23",X"88",X"14",X"14",X"08",X"14",X"63", + X"4C",X"47",X"B5",X"4A",X"0B",X"7E",X"C5",X"B8",X"34",X"09",X"9E",X"0A",X"78",X"DC",X"48",X"B5", + X"C5",X"34",X"0A",X"9E",X"47",X"78",X"B9",X"48",X"B3",X"B3",X"B3",X"B3",X"6F",X"6F",X"6F",X"6F", + X"9E",X"02",X"63",X"00",X"00",X"90",X"04",X"67",X"00",X"22",X"22",X"00",X"41",X"63",X"22",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"14",X"9C",X"88",X"00",X"14",X"14",X"00", + X"10",X"92",X"C8",X"41",X"BD",X"17",X"09",X"93",X"17",X"4E",X"64",X"BD",X"01",X"01",X"00",X"C8", + X"4A",X"9A",X"50",X"41",X"90",X"17",X"09",X"9B",X"17",X"4E",X"64",X"BD",X"01",X"05",X"00",X"C8", + X"02",X"88",X"C9",X"55",X"14",X"88",X"89",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"14",X"89",X"41",X"22",X"AA",X"C9",X"41",X"04", + X"00",X"FC",X"C8",X"41",X"BD",X"34",X"09",X"DA",X"13",X"09",X"05",X"10",X"B5",X"02",X"42",X"41", + X"03",X"00",X"01",X"10",X"10",X"4E",X"6C",X"BD",X"C8",X"09",X"90",X"14",X"4A",X"02",X"50",X"41", + X"00",X"22",X"00",X"41",X"00",X"22",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"04",X"14",X"00",X"88",X"00",X"14",X"00",X"FF",X"86",X"88",X"41",X"88",X"41",X"8A",X"FF", + X"06",X"AF",X"BD",X"24",X"00",X"4A",X"C8",X"10",X"6A",X"00",X"34",X"23",X"99",X"08",X"FE",X"09", + X"F1",X"10",X"41",X"21",X"67",X"01",X"24",X"00",X"BD",X"50",X"4A",X"12",X"C8",X"09",X"90",X"35", + X"41",X"FF",X"35",X"4E",X"13",X"00",X"01",X"00",X"BD",X"62",X"09",X"73",X"C8",X"0A",X"5B",X"35", + X"0A",X"72",X"35",X"0A",X"13",X"35",X"09",X"32",X"35",X"0A",X"8D",X"35",X"09",X"5E",X"62",X"0A", + X"76",X"35",X"09",X"1D",X"35",X"0A",X"5D",X"35",X"09",X"C1",X"62",X"0A",X"D7",X"35",X"0A",X"79", + X"35",X"0A",X"C0",X"35",X"09",X"80",X"35",X"09",X"21",X"35",X"0A",X"C4",X"63",X"0A",X"AC",X"35", + X"00",X"FF",X"1C",X"89",X"00",X"41",X"00",X"41",X"00",X"88",X"63",X"88",X"00",X"89",X"14",X"FF", + X"22",X"00",X"00",X"00",X"9C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00", + X"35",X"09",X"D1",X"63",X"0A",X"E7",X"35",X"0A",X"FD",X"35",X"0A",X"FC",X"35",X"09",X"9D",X"35", + X"0A",X"D1",X"35",X"0A",X"BC",X"63",X"09",X"60",X"36",X"09",X"00",X"36",X"0A",X"47",X"36",X"0A", + X"00",X"14",X"00",X"41",X"00",X"AA",X"00",X"41",X"00",X"02",X"00",X"C9",X"00",X"14",X"00",X"89", + X"49",X"00",X"22",X"00",X"C9",X"00",X"04",X"00",X"88",X"00",X"55",X"00",X"88",X"00",X"22",X"00", + X"34",X"BE",X"00",X"09",X"FE",X"23",X"92",X"F3",X"34",X"4A",X"8E",X"50",X"B3",X"01",X"AF",X"09", + X"F4",X"B5",X"B3",X"47",X"34",X"BF",X"86",X"4A",X"90",X"B5",X"6E",X"46",X"50",X"9A",X"10",X"6E", + X"00",X"00",X"00",X"9C",X"00",X"00",X"00",X"22",X"00",X"00",X"00",X"63",X"00",X"00",X"00",X"22", + X"41",X"14",X"15",X"00",X"49",X"9C",X"14",X"00",X"22",X"14",X"81",X"00",X"2A",X"63",X"88",X"00", + X"B5",X"65",X"47",X"09",X"D0",X"17",X"41",X"B6",X"20",X"04",X"01",X"D0",X"6E",X"B5",X"06",X"47", + X"41",X"B7",X"14",X"6E",X"A2",X"20",X"09",X"01",X"06",X"47",X"B5",X"0E",X"04",X"41",X"D0",X"16", + X"09",X"01",X"20",X"04",X"D4",X"06",X"6E",X"B5",X"D0",X"14",X"41",X"D6",X"47",X"09",X"9F",X"20", + X"6E",X"B5",X"06",X"47",X"01",X"D0",X"04",X"41",X"A9",X"20",X"09",X"01",X"16",X"6E",X"D1",X"06", + X"04",X"41",X"D0",X"15",X"B5",X"A3",X"47",X"09",X"D0",X"06",X"6E",X"B5",X"20",X"04",X"01",X"D0", + X"47",X"09",X"34",X"20",X"41",X"D5",X"17",X"6E",X"01",X"D0",X"04",X"41",X"06",X"47",X"B5",X"25", + X"16",X"6E",X"B6",X"06",X"09",X"01",X"20",X"04",X"B5",X"3E",X"47",X"09",X"D0",X"14",X"41",X"D6", + X"20",X"04",X"01",X"D0",X"6E",X"B5",X"06",X"47",X"41",X"D3",X"16",X"6E",X"B7",X"20",X"09",X"01", + X"06",X"47",X"B5",X"37",X"04",X"41",X"D0",X"15",X"09",X"01",X"20",X"04",X"D2",X"06",X"6E",X"B5", + X"D0",X"16",X"41",X"B5",X"47",X"09",X"49",X"20",X"6E",X"B5",X"06",X"47",X"01",X"D0",X"04",X"41", + X"52",X"20",X"09",X"01",X"15",X"6E",X"B6",X"06",X"04",X"41",X"D0",X"17",X"B5",X"43",X"47",X"09", + X"D4",X"06",X"6E",X"B5",X"20",X"04",X"01",X"D0",X"47",X"09",X"D4",X"20",X"41",X"D2",X"14",X"6E", + X"01",X"D0",X"04",X"41",X"06",X"47",X"B5",X"45",X"16",X"6E",X"B5",X"06",X"09",X"01",X"20",X"04", + X"B5",X"E8",X"47",X"09",X"D0",X"16",X"41",X"D3",X"20",X"04",X"01",X"D0",X"6E",X"B5",X"06",X"47", + X"41",X"D5",X"15",X"6E",X"E0",X"20",X"09",X"01",X"06",X"47",X"B5",X"72",X"04",X"41",X"D0",X"17", + X"09",X"01",X"20",X"04",X"B7",X"06",X"6E",X"B5",X"D0",X"20",X"93",X"03",X"47",X"01",X"F3",X"05", + X"07",X"40",X"26",X"66",X"21",X"60",X"27",X"42",X"03",X"37",X"07",X"09",X"05",X"11",X"41",X"93", + X"08",X"04",X"01",X"EA",X"6E",X"B5",X"06",X"47",X"6E",X"47",X"B5",X"0E",X"20",X"41",X"80",X"12", + X"09",X"01",X"08",X"04",X"93",X"06",X"6E",X"B5",X"EA",X"B5",X"6E",X"47",X"47",X"80",X"20",X"41", + X"B7",X"08",X"09",X"01",X"12",X"6E",X"93",X"06",X"04",X"6E",X"EA",X"B5",X"B5",X"20",X"47",X"80", + X"47",X"09",X"A2",X"08",X"41",X"93",X"10",X"6E",X"01",X"EA",X"04",X"6E",X"06",X"47",X"B5",X"20", + X"B5",X"45",X"47",X"09",X"80",X"12",X"41",X"93",X"08",X"04",X"01",X"EA",X"6E",X"B5",X"06",X"47", + X"6E",X"47",X"B5",X"65",X"20",X"41",X"80",X"13",X"09",X"01",X"08",X"04",X"93",X"06",X"6E",X"B5", + X"EA",X"B5",X"6E",X"47",X"47",X"80",X"20",X"41",X"D4",X"08",X"09",X"01",X"10",X"6E",X"93",X"06", + X"04",X"6E",X"EA",X"B5",X"B5",X"20",X"47",X"80",X"47",X"09",X"A9",X"08",X"41",X"93",X"12",X"6E", + X"01",X"EA",X"04",X"6E",X"06",X"47",X"B5",X"20",X"B5",X"72",X"47",X"09",X"80",X"13",X"41",X"93", + X"08",X"04",X"01",X"EA",X"6E",X"B5",X"06",X"47",X"6E",X"47",X"B5",X"5F",X"20",X"41",X"80",X"10", + X"09",X"01",X"08",X"04",X"93",X"06",X"6E",X"B5",X"EA",X"B5",X"6E",X"47",X"47",X"80",X"20",X"41", + X"A3",X"08",X"09",X"01",X"11",X"6E",X"93",X"06",X"04",X"6E",X"EA",X"B5",X"B5",X"20",X"47",X"80", + X"47",X"09",X"34",X"08",X"41",X"93",X"13",X"6E",X"01",X"EA",X"04",X"6E",X"06",X"47",X"B5",X"20", + X"B5",X"25",X"47",X"09",X"80",X"12",X"41",X"93",X"08",X"04",X"01",X"EA",X"6E",X"B5",X"06",X"47", + X"6E",X"47",X"B5",X"E8",X"20",X"41",X"80",X"12",X"09",X"01",X"08",X"04",X"93",X"06",X"6E",X"B5", + X"EA",X"B5",X"6E",X"47",X"47",X"80",X"20",X"41",X"49",X"08",X"09",X"01",X"12",X"6E",X"93",X"06", + X"04",X"6E",X"EA",X"B5",X"B5",X"20",X"47",X"80",X"47",X"09",X"9F",X"08",X"41",X"93",X"10",X"6E", + X"01",X"EA",X"04",X"6E",X"06",X"47",X"B5",X"20",X"B5",X"E0",X"47",X"09",X"80",X"11",X"41",X"93", + X"08",X"04",X"01",X"EA",X"6E",X"B5",X"06",X"47",X"6E",X"47",X"B5",X"3E",X"20",X"41",X"80",X"10", + X"09",X"01",X"08",X"04",X"93",X"06",X"6E",X"B5",X"EA",X"B5",X"6E",X"47",X"47",X"80",X"20",X"41", + X"43",X"08",X"09",X"01",X"13",X"6E",X"93",X"06",X"04",X"6E",X"EA",X"B5",X"B5",X"20",X"47",X"80", + X"47",X"09",X"52",X"08",X"41",X"93",X"11",X"6E",X"01",X"EA",X"04",X"6E",X"06",X"47",X"B5",X"40", + X"B5",X"E3",X"47",X"09",X"80",X"10",X"41",X"97",X"08",X"27",X"01",X"EA",X"6E",X"B5",X"06",X"47", + X"6E",X"47",X"B5",X"7D",X"20",X"41",X"80",X"10",X"09",X"01",X"08",X"41",X"D6",X"06",X"6E",X"B5", + X"EA",X"B5",X"6E",X"47",X"47",X"4C",X"01",X"09",X"F3",X"92",X"B3",X"23",X"34",X"BE",X"3E",X"B5", + X"73",X"B5",X"6E",X"47",X"42",X"4C",X"07",X"09",X"F3",X"92",X"B3",X"23",X"34",X"BE",X"3E",X"6E", + X"10",X"41",X"9A",X"14",X"B5",X"10",X"46",X"09",X"D7",X"06",X"6E",X"B5",X"20",X"64",X"43",X"D0", + X"47",X"09",X"87",X"20",X"41",X"F1",X"16",X"6E",X"24",X"D0",X"05",X"41",X"06",X"47",X"B5",X"52", + X"14",X"6E",X"F0",X"06",X"09",X"07",X"20",X"64",X"B5",X"70",X"47",X"09",X"D0",X"14",X"41",X"F1", + X"20",X"64",X"03",X"D0",X"6E",X"B5",X"06",X"47",X"41",X"F2",X"14",X"6E",X"73",X"20",X"09",X"03", + X"06",X"47",X"B5",X"92",X"64",X"41",X"D0",X"10",X"09",X"01",X"08",X"43",X"F9",X"06",X"6E",X"B5", + X"EA",X"11",X"41",X"24",X"47",X"09",X"31",X"09",X"6E",X"B5",X"06",X"47",X"20",X"EA",X"24",X"41", + X"44",X"09",X"09",X"01",X"11",X"6E",X"3C",X"06",X"40",X"41",X"EA",X"10",X"B5",X"D6",X"47",X"09", + X"7C",X"06",X"6E",X"B5",X"09",X"45",X"01",X"EA",X"47",X"FE",X"99",X"08",X"6A",X"01",X"34",X"27", + X"41",X"C1",X"11",X"6E",X"61",X"09",X"09",X"01",X"06",X"47",X"B5",X"08",X"27",X"60",X"EA",X"FE", + X"02",X"61",X"27",X"09",X"08",X"11",X"41",X"88",X"09",X"27",X"01",X"EA",X"6E",X"B5",X"06",X"47", + X"60",X"11",X"41",X"AF",X"25",X"09",X"61",X"09",X"6E",X"B5",X"06",X"47",X"01",X"EA",X"27",X"41", + X"E4",X"09",X"09",X"01",X"10",X"6E",X"EE",X"06",X"61",X"6A",X"EA",X"34",X"B5",X"BB",X"47",X"FE", + X"00",X"7C",X"27",X"09",X"08",X"11",X"41",X"D7",X"09",X"06",X"01",X"EA",X"6E",X"B5",X"06",X"47", + X"60",X"08",X"FE",X"41",X"4B",X"27",X"01",X"7C",X"11",X"6E",X"F5",X"06",X"09",X"01",X"09",X"06", + X"B5",X"08",X"47",X"02",X"EA",X"FE",X"60",X"08",X"27",X"09",X"7C",X"09",X"41",X"9B",X"11",X"6E", + X"01",X"EA",X"05",X"60",X"06",X"47",X"B5",X"25",X"41",X"B8",X"11",X"6E",X"7C",X"09",X"09",X"01", + X"06",X"47",X"B5",X"92",X"05",X"6E",X"EA",X"4A",X"1E",X"4A",X"6E",X"34",X"11",X"AA",X"7C",X"6E", + X"6B",X"6E",X"AB",X"4A",X"4A",X"44",X"34",X"AC",X"34",X"AD",X"21",X"6E",X"6E",X"34",X"4A",X"04", + X"B5",X"4A",X"47",X"34",X"4C",X"AA",X"AF",X"09",X"F3",X"08",X"B3",X"B5",X"34",X"10",X"3E",X"F6", + X"0B",X"B5",X"D2",X"0B",X"B5",X"9E",X"0B",X"B5",X"D6",X"0B",X"B5",X"4A",X"0B",X"AF",X"BA",X"75", + X"35",X"4A",X"78",X"35",X"4A",X"C3",X"35",X"4A",X"AE",X"35",X"4A",X"9C",X"35",X"4A",X"B1",X"35", + X"4A",X"FA",X"35",X"4A",X"FF",X"47",X"B5",X"90",X"50",X"B3",X"F3",X"08",X"09",X"3E",X"34",X"26", + X"09",X"36",X"34",X"02",X"F4",X"08",X"B3",X"60",X"B6",X"8C",X"A6",X"B5",X"B3",X"07",X"93",X"BF", + X"47",X"B3",X"F3",X"B3",X"09",X"9E",X"34",X"AE",X"09",X"A6",X"34",X"C6",X"F4",X"B3",X"B3",X"B3", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"34",X"4E",X"37",X"BD",X"01",X"FF",X"00",X"C8",X"6E",X"50",X"4A",X"F5",X"FF",X"09",X"01",X"34", + X"FF",X"08",X"9C",X"BE",X"BE",X"9C",X"08",X"FF",X"FF",X"01",X"63",X"77",X"77",X"63",X"01",X"FF", + X"BE",X"08",X"88",X"9C",X"9C",X"88",X"08",X"BE",X"77",X"01",X"41",X"63",X"63",X"41",X"01",X"77", + X"88",X"08",X"88",X"88",X"88",X"88",X"08",X"88",X"41",X"01",X"41",X"41",X"41",X"41",X"01",X"41", + X"15",X"2C",X"15",X"1F",X"59",X"13",X"53",X"50",X"59",X"18",X"19",X"20",X"52",X"54",X"17",X"61", + X"69",X"19",X"62",X"19",X"68",X"17",X"14",X"54",X"52",X"54",X"58",X"13",X"15",X"15",X"20",X"18", + X"53",X"4A",X"11",X"34",X"54",X"98",X"52",X"6A",X"9B",X"0F",X"D6",X"9B",X"34",X"4A",X"01",X"34", + X"09",X"9E",X"34",X"B8",X"F4",X"6A",X"B3",X"34",X"4A",X"43",X"34",X"6A",X"BC",X"00",X"B5",X"99", + X"34",X"0C",X"00",X"B5",X"FE",X"25",X"B2",X"02",X"47",X"FE",X"0C",X"48",X"93",X"04",X"25",X"29", + X"41",X"BD",X"11",X"6E",X"26",X"67",X"09",X"01",X"06",X"47",X"B5",X"40",X"41",X"41",X"EA",X"12", + X"09",X"01",X"67",X"02",X"FE",X"06",X"6E",X"B5",X"EA",X"11",X"41",X"9A",X"47",X"09",X"5A",X"67", + X"6E",X"B5",X"06",X"47",X"01",X"EA",X"23",X"60",X"C4",X"09",X"C0",X"08",X"41",X"00",X"10",X"6E", + X"01",X"EA",X"61",X"60",X"06",X"47",X"B5",X"85",X"6A",X"5F",X"50",X"4B",X"10",X"08",X"B3",X"6A", + X"99",X"28",X"FE",X"6A",X"34",X"45",X"00",X"98",X"34",X"0D",X"04",X"04",X"FE",X"D6",X"68",X"4A", + X"98",X"34",X"6A",X"02",X"34",X"D6",X"9B",X"0F",X"4A",X"F4",X"34",X"B3",X"9B",X"34",X"09",X"8E", + X"6A",X"BC",X"34",X"4A",X"B8",X"34",X"4A",X"BD",X"34",X"B5",X"43",X"00",X"B5",X"0C",X"00",X"93", + X"A6",X"50",X"4A",X"F3",X"24",X"09",X"90",X"34",X"B3",X"93",X"08",X"24",X"5E",X"75",X"03",X"B3", + X"CE",X"AF",X"4C",X"BE",X"93",X"09",X"24",X"34",X"41",X"05",X"34",X"5F",X"BF",X"00",X"01",X"BD", + X"C8",X"4A",X"DD",X"34",X"4A",X"DE",X"34",X"6E",X"10",X"41",X"9C",X"13",X"09",X"9D",X"13",X"01", + X"05",X"C8",X"5F",X"DE",X"00",X"09",X"BD",X"13",X"41",X"05",X"13",X"5F",X"DF",X"00",X"01",X"BD", + X"C8",X"13",X"4A",X"DE",X"AF",X"4A",X"9C",X"13",X"B5",X"02",X"0B",X"09",X"9A",X"0C",X"B5",X"F5", + X"34",X"F4",X"B6",X"B3",X"B3",X"34",X"09",X"1E",X"28",X"6E",X"60",X"4A",X"02",X"00",X"62",X"03", + X"50",X"41",X"29",X"11",X"B5",X"50",X"47",X"09",X"61",X"06",X"6E",X"B5",X"08",X"25",X"01",X"EA", + X"47",X"4C",X"03",X"09",X"6E",X"47",X"B5",X"F4",X"34",X"BC",X"BE",X"6D",X"B3",X"34",X"6A",X"4A", + X"BC",X"09",X"6E",X"10",X"34",X"46",X"10",X"41",X"47",X"00",X"01",X"BD",X"10",X"5F",X"20",X"C8", + X"B5",X"DE",X"00",X"93",X"43",X"0B",X"B5",X"0C",X"26",X"B3",X"F4",X"08",X"09",X"1E",X"34",X"D6", + X"B3",X"6A",X"28",X"34",X"3E",X"F4",X"E8",X"B3",X"7F",X"29",X"4F",X"41",X"08",X"47",X"B5",X"50", + X"11",X"6E",X"0E",X"06",X"09",X"01",X"08",X"25",X"B5",X"03",X"47",X"4C",X"EA",X"B5",X"6E",X"47", + X"09",X"AE",X"34",X"BD",X"F4",X"6A",X"B3",X"34",X"6D",X"6E",X"BD",X"09",X"4A",X"10",X"34",X"02", + X"10",X"01",X"03",X"00",X"41",X"20",X"10",X"5F",X"BD",X"00",X"B5",X"FE",X"C8",X"B5",X"0C",X"0B", + X"60",X"4A",X"6E",X"50",X"4A",X"03",X"01",X"60",X"92",X"09",X"29",X"34",X"B5",X"F4",X"47",X"B3", + X"1E",X"40",X"A0",X"09",X"08",X"11",X"41",X"4B",X"08",X"41",X"01",X"EA",X"6E",X"B5",X"06",X"47", + X"09",X"96",X"35",X"01",X"75",X"6E",X"B3",X"B5",X"4C",X"34",X"09",X"3E",X"47",X"B3",X"F4",X"28", + X"CC",X"B5",X"A3",X"0B",X"93",X"9E",X"25",X"09",X"F5",X"28",X"B3",X"B3",X"34",X"43",X"36",X"A6", + X"09",X"96",X"35",X"90",X"FF",X"4A",X"B3",X"50",X"6A",X"00",X"35",X"DE",X"FF",X"08",X"FE",X"60", + X"05",X"4C",X"02",X"09",X"6E",X"47",X"B5",X"9C",X"35",X"BA",X"96",X"B5",X"B3",X"0B",X"B5",X"FA", + X"47",X"B3",X"F4",X"28",X"09",X"36",X"34",X"DB",X"B3",X"B5",X"6E",X"47",X"A6",X"4C",X"01",X"B5", + X"BF",X"34",X"09",X"56",X"47",X"B3",X"F4",X"08",X"27",X"B5",X"BE",X"47",X"B5",X"BF",X"0B",X"09", + X"F4",X"08",X"B3",X"60",X"34",X"21",X"76",X"67",X"B3",X"0C",X"B5",X"BA",X"C6",X"60",X"26",X"B3", + X"E6",X"B3",X"F5",X"09",X"09",X"B6",X"34",X"F4",X"34",X"05",X"3E",X"22",X"B3",X"B5",X"08",X"0C", + X"60",X"0C",X"B5",X"A5",X"C2",X"60",X"06",X"6A",X"DC",X"08",X"FE",X"09",X"34",X"2E",X"00",X"F4", + X"34",X"2F",X"3E",X"BD",X"B3",X"6A",X"08",X"34",X"FE",X"B5",X"08",X"47",X"00",X"29",X"36",X"41", + X"C0",X"08",X"09",X"01",X"11",X"6E",X"14",X"06",X"21",X"6E",X"EA",X"B5",X"B5",X"02",X"47",X"4C", + X"47",X"09",X"D3",X"34",X"B5",X"F3",X"43",X"B3",X"DE",X"D6",X"7C",X"4A",X"93",X"01",X"07",X"DC", + X"34",X"6A",X"F9",X"34",X"93",X"BC",X"25",X"FE",X"00",X"F4",X"0D",X"B3",X"08",X"34",X"09",X"1E", + X"08",X"47",X"B5",X"D8",X"B2",X"41",X"29",X"10",X"09",X"01",X"08",X"44",X"35",X"06",X"6E",X"B5", + X"EA",X"B5",X"6E",X"47",X"47",X"4C",X"03",X"93",X"CC",X"0B",X"B5",X"A9",X"25",X"93",X"FA",X"25", + X"B5",X"A9",X"0B",X"2A",X"DA",X"25",X"93",X"D7",X"34",X"00",X"F5",X"F5",X"BB",X"00",X"09",X"61", + X"F5",X"86",X"01",X"17",X"7E",X"02",X"F5",X"9E",X"27",X"B3",X"5F",X"B3",X"F5",X"68",X"02",X"68", + X"B3",X"F5",X"B3",X"00",X"68",X"7E",X"68",X"09",X"4C",X"B5",X"B3",X"47",X"27",X"C5",X"0F",X"76", + X"0B",X"10",X"BB",X"10",X"56",X"27",X"B9",X"27",X"11",X"51",X"31",X"71",X"27",X"27",X"27",X"27", + X"B1",X"C0",X"7E",X"5F",X"F5",X"F5",X"04",X"04",X"B1",X"80",X"7E",X"5F",X"F5",X"F5",X"04",X"04", + X"B1",X"80",X"7E",X"5F",X"F5",X"F5",X"03",X"03",X"B1",X"C0",X"7E",X"5F",X"F5",X"F5",X"03",X"03", + X"B1",X"BB",X"8C",X"09",X"2A",X"F5",X"34",X"00",X"00",X"01",X"61",X"34",X"F5",X"00",X"BB",X"4F", + X"6F",X"F5",X"12",X"00",X"BD",X"7E",X"9D",X"09",X"84",X"B5",X"B3",X"47",X"27",X"C5",X"0F",X"76", + X"0B",X"54",X"BB",X"C0",X"56",X"40",X"B9",X"27",X"D3",X"3D",X"1B",X"80",X"27",X"40",X"40",X"40", + X"F5",X"8A",X"03",X"F5",X"7E",X"34",X"4A",X"7E",X"04",X"B5",X"8B",X"40",X"4A",X"BA",X"34",X"F5", + X"7E",X"50",X"42",X"FE",X"06",X"34",X"6A",X"00",X"08",X"34",X"6A",X"00",X"47",X"FE",X"51",X"08", + X"47",X"34",X"09",X"9D",X"91",X"21",X"52",X"D1",X"43",X"4E",X"05",X"BD",X"01",X"FF",X"00",X"C8", + X"B1",X"43",X"7E",X"60",X"F5",X"42",X"06",X"B9",X"F5",X"08",X"06",X"61",X"7E",X"00",X"09",X"BB", + X"42",X"42",X"F6",X"F5",X"60",X"41",X"B5",X"7E",X"03",X"34",X"4A",X"7E",X"C0",X"F5",X"8A",X"04", + X"4A",X"BA",X"34",X"6A",X"8B",X"40",X"B5",X"50",X"34",X"4A",X"00",X"50",X"FE",X"6A",X"28",X"34", + X"B3",X"05",X"F5",X"6D",X"0F",X"80",X"16",X"91",X"FD",X"FD",X"52",X"FD",X"09",X"21",X"34",X"5B", + X"CC",X"EE",X"11",X"11",X"33",X"EE",X"CC",X"00",X"11",X"33",X"66",X"44",X"44",X"33",X"11",X"00", + X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00",X"00",X"00",X"77",X"77",X"22",X"00",X"00",X"00", + X"11",X"99",X"DD",X"DD",X"FF",X"77",X"33",X"00",X"33",X"77",X"55",X"44",X"44",X"66",X"22",X"00", + X"66",X"FF",X"99",X"99",X"99",X"33",X"22",X"00",X"44",X"66",X"77",X"55",X"44",X"44",X"00",X"00", + X"00",X"92",X"08",X"B1",X"00",X"92",X"84",X"B1",X"00",X"64",X"01",X"78",X"00",X"64",X"42",X"78", + X"03",X"C1",X"B2",X"9C",X"6C",X"80",X"D1",X"BE",X"0C",X"C8",X"74",X"63",X"93",X"40",X"E8",X"77", + X"B1",X"84",X"92",X"00",X"B1",X"08",X"92",X"00",X"78",X"42",X"64",X"00",X"78",X"01",X"64",X"00", + X"FF",X"F1",X"F7",X"6C",X"F7",X"F0",X"F3",X"03",X"FF",X"F8",X"FE",X"93",X"FE",X"F0",X"FC",X"0C", + X"00",X"92",X"08",X"B1",X"00",X"92",X"84",X"B1",X"00",X"25",X"01",X"39",X"00",X"25",X"42",X"39", + X"03",X"63",X"F3",X"00",X"6C",X"41",X"FF",X"36",X"0C",X"FE",X"F8",X"FF",X"93",X"FF",X"FC",X"FF", + X"B1",X"84",X"92",X"00",X"B1",X"08",X"92",X"00",X"39",X"42",X"25",X"00",X"39",X"01",X"25",X"00", + X"36",X"FF",X"41",X"6C",X"00",X"F3",X"63",X"03",X"FF",X"FC",X"FF",X"93",X"FF",X"F8",X"FE",X"0C", + X"00",X"9A",X"08",X"21",X"00",X"16",X"84",X"A9",X"00",X"64",X"01",X"78",X"00",X"64",X"42",X"78", + X"03",X"93",X"F0",X"0F",X"6C",X"87",X"93",X"0F",X"0C",X"0C",X"6C",X"00",X"93",X"08",X"6F",X"41", + X"A9",X"84",X"16",X"00",X"21",X"08",X"9A",X"00",X"78",X"42",X"64",X"00",X"78",X"01",X"64",X"00", + X"0F",X"93",X"87",X"6C",X"0F",X"F0",X"93",X"03",X"41",X"6F",X"08",X"93",X"00",X"6C",X"0C",X"0C", + X"00",X"92",X"08",X"B1",X"00",X"92",X"84",X"B1",X"00",X"64",X"01",X"78",X"00",X"64",X"42",X"78", + X"03",X"0F",X"93",X"0F",X"6C",X"0F",X"0F",X"0F",X"0C",X"8E",X"78",X"0F",X"93",X"8E",X"6C",X"0F", + X"B1",X"84",X"92",X"00",X"B1",X"08",X"92",X"00",X"78",X"42",X"64",X"00",X"78",X"01",X"64",X"00", + X"0F",X"0F",X"0F",X"6C",X"0F",X"93",X"0F",X"03",X"0F",X"6C",X"8E",X"93",X"0F",X"78",X"8E",X"0C", + X"00",X"92",X"08",X"B1",X"00",X"92",X"84",X"B1",X"00",X"64",X"01",X"78",X"00",X"64",X"42",X"78", + X"03",X"B6",X"F0",X"88",X"6C",X"94",X"F3",X"C9",X"0C",X"76",X"F0",X"41",X"93",X"62",X"FC",X"C9", + X"B1",X"84",X"92",X"00",X"B1",X"08",X"92",X"00",X"78",X"42",X"64",X"00",X"78",X"01",X"64",X"00", + X"C9",X"F3",X"94",X"6C",X"88",X"F0",X"B6",X"03",X"C9",X"FC",X"62",X"93",X"41",X"F0",X"76",X"0C", + X"00",X"B0",X"80",X"F0",X"00",X"B0",X"90",X"F0",X"00",X"02",X"01",X"0A",X"00",X"06",X"00",X"0A", + X"43",X"49",X"2C",X"0C",X"4E",X"0C",X"59",X"06",X"90",X"C8",X"70",X"63",X"F0",X"40",X"E8",X"77", + X"F0",X"90",X"B0",X"00",X"F0",X"80",X"B0",X"00",X"0B",X"0B",X"0D",X"03",X"05",X"07",X"0B",X"00", + X"47",X"0D",X"0B",X"01",X"03",X"0B",X"09",X"00",X"FF",X"78",X"FE",X"6C",X"FE",X"6C",X"7C",X"18", + X"00",X"B0",X"80",X"FC",X"00",X"B8",X"90",X"FC",X"00",X"03",X"00",X"0F",X"00",X"07",X"00",X"07", + X"00",X"0C",X"03",X"00",X"01",X"08",X"4F",X"36",X"08",X"FF",X"FC",X"63",X"78",X"77",X"FE",X"63", + X"FC",X"90",X"B8",X"00",X"FC",X"80",X"B0",X"00",X"0D",X"00",X"07",X"00",X"0F",X"00",X"03",X"00", + X"36",X"4F",X"08",X"01",X"00",X"03",X"0C",X"00",X"63",X"FE",X"77",X"78",X"63",X"FC",X"FF",X"08", + X"00",X"B8",X"80",X"60",X"00",X"34",X"90",X"E8",X"00",X"03",X"00",X"0E",X"00",X"07",X"00",X"07", + X"00",X"0D",X"03",X"4F",X"01",X"03",X"0E",X"4F",X"0C",X"9C",X"7C",X"00",X"78",X"88",X"FF",X"41", + X"E8",X"90",X"34",X"00",X"60",X"80",X"B8",X"00",X"0D",X"00",X"07",X"00",X"0E",X"00",X"03",X"00", + X"4F",X"0F",X"03",X"01",X"4F",X"03",X"0D",X"00",X"41",X"FF",X"88",X"78",X"00",X"7C",X"9C",X"0C", + X"00",X"B0",X"80",X"F8",X"00",X"B8",X"90",X"F8",X"00",X"03",X"00",X"0E",X"00",X"07",X"01",X"0F", + X"01",X"0E",X"47",X"0C",X"03",X"0C",X"4F",X"4D",X"90",X"77",X"FC",X"41",X"F0",X"63",X"FE",X"C9", + X"F8",X"90",X"B8",X"00",X"F8",X"80",X"B0",X"00",X"0D",X"01",X"07",X"00",X"0E",X"00",X"03",X"00", + X"4D",X"4F",X"0C",X"03",X"0C",X"47",X"0E",X"01",X"C9",X"FE",X"63",X"F0",X"41",X"FC",X"77",X"90", + X"15",X"2C",X"15",X"1F",X"59",X"13",X"53",X"50",X"59",X"18",X"19",X"20",X"52",X"54",X"17",X"61", + X"69",X"19",X"62",X"19",X"68",X"17",X"14",X"54",X"52",X"54",X"58",X"13",X"15",X"15",X"20",X"18", + X"53",X"84",X"11",X"EF",X"54",X"C2",X"52",X"08",X"01",X"12",X"34",X"7F",X"7F",X"34",X"12",X"01", + X"0C",X"C2",X"E1",X"E9",X"E9",X"E1",X"C2",X"0C",X"03",X"34",X"78",X"79",X"79",X"78",X"34",X"03", + X"0C",X"C2",X"ED",X"E5",X"E5",X"ED",X"C2",X"0C",X"03",X"34",X"7B",X"7A",X"7A",X"7B",X"34",X"03", + X"0C",X"CE",X"E3",X"E3",X"E3",X"E3",X"CE",X"0C",X"03",X"37",X"7C",X"7C",X"7C",X"7C",X"37",X"03", + X"00",X"66",X"66",X"00",X"00",X"66",X"66",X"00",X"00",X"66",X"66",X"00",X"00",X"66",X"66",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00",X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00", + X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00",X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00", + X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00",X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00", + X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00",X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00", + X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00",X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00", + X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00",X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00", + X"ED",X"98",X"1A",X"C0",X"50",X"09",X"48",X"50",X"11",X"49",X"50",X"01",X"27",X"00",X"1E",X"00", + X"ED",X"98",X"1A",X"C0",X"50",X"09",X"D8",X"67",X"11",X"D9",X"67",X"01",X"27",X"00",X"1E",X"00", + X"ED",X"98",X"1A",X"C0",X"50",X"09",X"40",X"50",X"11",X"41",X"50",X"01",X"37",X"00",X"1E",X"00", + X"ED",X"98",X"09",X"52",X"64",X"11",X"53",X"64",X"01",X"67",X"00",X"1E",X"FF",X"ED",X"98",X"09", + X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00", + X"CC",X"22",X"01",X"4C",X"22",X"11",X"22",X"CC",X"33",X"44",X"88",X"44",X"23",X"08",X"44",X"33", + X"1C",X"0B",X"E5",X"95",X"17",X"7E",X"1A",X"E8",X"64",X"78",X"CE",X"18",X"09",X"DC",X"0A",X"E5", + X"95",X"17",X"0A",X"E9",X"64",X"78",X"CE",X"18",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F", + X"CE",X"00",X"33",X"04",X"02",X"C0",X"00",X"37",X"00",X"11",X"22",X"22",X"22",X"33",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"44",X"44",X"44",X"88",X"00", + X"40",X"ED",X"98",X"09",X"C2",X"47",X"11",X"C3",X"47",X"01",X"34",X"00",X"1E",X"01",X"ED",X"98", + X"1A",X"C0",X"50",X"09",X"CA",X"47",X"11",X"CB",X"47",X"01",X"34",X"00",X"1E",X"05",X"ED",X"98", + X"02",X"44",X"99",X"89",X"88",X"88",X"55",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"AA",X"11",X"11",X"89",X"99",X"22",X"04", + X"00",X"ED",X"98",X"09",X"FC",X"64",X"11",X"DA",X"43",X"E5",X"05",X"12",X"09",X"02",X"40",X"11", + X"03",X"40",X"01",X"3C",X"00",X"1E",X"40",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"02",X"44",X"11", + X"00",X"00",X"00",X"02",X"22",X"22",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"88",X"44",X"44",X"04",X"00",X"00",X"00",X"FF",X"88",X"88",X"8A",X"86",X"11",X"11",X"FF", + X"06",X"00",X"ED",X"98",X"AF",X"1A",X"24",X"40",X"3A",X"C9",X"64",X"FE",X"00",X"08",X"23",X"09", + X"F1",X"37",X"11",X"24",X"40",X"01",X"21",X"00",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"42",X"65", + X"11",X"43",X"65",X"01",X"FF",X"00",X"1E",X"00",X"ED",X"98",X"09",X"5B",X"32",X"0A",X"73",X"65", + X"0A",X"43",X"65",X"09",X"72",X"65",X"0A",X"62",X"65",X"09",X"8D",X"32",X"0A",X"5E",X"65",X"0A", + X"76",X"65",X"09",X"5D",X"65",X"0A",X"4D",X"65",X"09",X"D7",X"32",X"0A",X"91",X"65",X"0A",X"79", + X"65",X"09",X"90",X"65",X"0A",X"80",X"65",X"09",X"21",X"33",X"0A",X"AC",X"65",X"0A",X"94",X"65", + X"00",X"00",X"4C",X"00",X"FF",X"11",X"89",X"11",X"00",X"00",X"33",X"44",X"88",X"89",X"88",X"FF", + X"22",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"65",X"0A",X"D1",X"65",X"09",X"B7",X"33",X"0A",X"FD",X"65",X"0A",X"CD",X"65",X"09",X"FC",X"65", + X"0A",X"EC",X"65",X"09",X"D1",X"33",X"0A",X"30",X"66",X"0A",X"00",X"66",X"09",X"17",X"66",X"0A", + X"00",X"00",X"00",X"00",X"44",X"AA",X"11",X"11",X"00",X"00",X"00",X"00",X"02",X"44",X"99",X"89", + X"19",X"99",X"22",X"04",X"00",X"00",X"00",X"00",X"88",X"88",X"55",X"22",X"00",X"00",X"00",X"00", + X"64",X"FE",X"00",X"C2",X"EE",X"23",X"09",X"F3",X"64",X"E3",X"8E",X"AF",X"1A",X"01",X"50",X"09", + X"F4",X"64",X"E3",X"86",X"E5",X"EF",X"17",X"1A",X"C0",X"50",X"3E",X"40",X"E5",X"CA",X"16",X"3E", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"22", + X"11",X"19",X"45",X"44",X"44",X"CC",X"00",X"00",X"22",X"2A",X"81",X"88",X"44",X"33",X"00",X"00", + X"E5",X"D0",X"17",X"11",X"35",X"47",X"09",X"E6",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17", + X"11",X"A2",X"44",X"09",X"E7",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17",X"11",X"0E",X"46", + X"09",X"D4",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17",X"11",X"CF",X"44",X"09",X"D6",X"20", + X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17",X"11",X"A9",X"46",X"09",X"D1",X"20",X"3E",X"01",X"06", + X"04",X"E5",X"D0",X"17",X"11",X"A3",X"45",X"09",X"D0",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0", + X"17",X"11",X"64",X"47",X"09",X"D5",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17",X"11",X"25", + X"46",X"09",X"E6",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17",X"11",X"6E",X"44",X"09",X"D6", + X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17",X"11",X"E7",X"46",X"09",X"D3",X"20",X"3E",X"01", + X"06",X"04",X"E5",X"D0",X"17",X"11",X"67",X"45",X"09",X"D2",X"20",X"3E",X"01",X"06",X"04",X"E5", + X"D0",X"17",X"11",X"19",X"46",X"09",X"E5",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17",X"11", + X"52",X"45",X"09",X"E6",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17",X"11",X"13",X"47",X"09", + X"D4",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17",X"11",X"D4",X"44",X"09",X"D2",X"20",X"3E", + X"01",X"06",X"04",X"E5",X"D0",X"17",X"11",X"15",X"46",X"09",X"E5",X"20",X"3E",X"01",X"06",X"04", + X"E5",X"D0",X"17",X"11",X"B8",X"46",X"09",X"D3",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17", + X"11",X"B0",X"45",X"09",X"D5",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17",X"11",X"72",X"47", + X"09",X"E7",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D0",X"17",X"C3",X"F3",X"20",X"01",X"03",X"05", + X"07",X"21",X"26",X"27",X"10",X"30",X"36",X"12",X"03",X"05",X"07",X"11",X"67",X"41",X"09",X"C3", + X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80",X"17",X"11",X"0E",X"42", + X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80",X"17",X"11", + X"E7",X"42",X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80", + X"17",X"11",X"A2",X"40",X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20", + X"E5",X"80",X"17",X"11",X"15",X"42",X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17", + X"3E",X"20",X"E5",X"80",X"17",X"11",X"35",X"43",X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5", + X"BA",X"17",X"3E",X"20",X"E5",X"80",X"17",X"11",X"D4",X"40",X"09",X"C3",X"08",X"3E",X"01",X"06", + X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80",X"17",X"11",X"A9",X"42",X"09",X"C3",X"08",X"3E", + X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80",X"17",X"11",X"72",X"43",X"09",X"C3", + X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80",X"17",X"11",X"5F",X"40", + X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80",X"17",X"11", + X"A3",X"41",X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80", + X"17",X"11",X"64",X"43",X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20", + X"E5",X"80",X"17",X"11",X"25",X"42",X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17", + X"3E",X"20",X"E5",X"80",X"17",X"11",X"B8",X"42",X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5", + X"BA",X"17",X"3E",X"20",X"E5",X"80",X"17",X"11",X"19",X"42",X"09",X"C3",X"08",X"3E",X"01",X"06", + X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80",X"17",X"11",X"CF",X"40",X"09",X"C3",X"08",X"3E", + X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80",X"17",X"11",X"B0",X"41",X"09",X"C3", + X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80",X"17",X"11",X"6E",X"40", + X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80",X"17",X"11", + X"13",X"43",X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"20",X"E5",X"80", + X"17",X"11",X"52",X"41",X"09",X"C3",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BA",X"17",X"3E",X"10", + X"E5",X"80",X"17",X"11",X"B3",X"40",X"09",X"C7",X"08",X"3E",X"01",X"06",X"27",X"E5",X"BA",X"17", + X"3E",X"20",X"E5",X"80",X"17",X"11",X"7D",X"40",X"09",X"D6",X"08",X"3E",X"01",X"06",X"11",X"E5", + X"BA",X"17",X"3E",X"01",X"E5",X"1C",X"17",X"09",X"F3",X"64",X"E3",X"6E",X"C2",X"EE",X"23",X"E5", + X"73",X"12",X"3E",X"07",X"E5",X"1C",X"17",X"09",X"F3",X"64",X"E3",X"6E",X"C2",X"EE",X"23",X"3E", + X"40",X"E5",X"CA",X"16",X"11",X"40",X"44",X"09",X"D7",X"20",X"3E",X"13",X"06",X"34",X"E5",X"D0", + X"17",X"11",X"87",X"46",X"09",X"F1",X"20",X"3E",X"24",X"06",X"05",X"E5",X"D0",X"17",X"11",X"52", + X"44",X"09",X"F0",X"20",X"3E",X"07",X"06",X"34",X"E5",X"D0",X"17",X"11",X"70",X"44",X"09",X"F1", + X"20",X"3E",X"03",X"06",X"34",X"E5",X"D0",X"17",X"11",X"73",X"44",X"09",X"F2",X"20",X"3E",X"03", + X"06",X"34",X"E5",X"D0",X"17",X"11",X"C2",X"40",X"09",X"F9",X"08",X"3E",X"01",X"06",X"13",X"E5", + X"BA",X"17",X"11",X"61",X"41",X"09",X"24",X"09",X"3E",X"20",X"06",X"24",X"E5",X"BA",X"17",X"11", + X"14",X"41",X"09",X"6C",X"09",X"3E",X"01",X"06",X"10",X"E5",X"BA",X"17",X"11",X"D6",X"40",X"09", + X"7C",X"09",X"3E",X"01",X"06",X"15",X"E5",X"BA",X"17",X"3A",X"C9",X"64",X"FE",X"01",X"08",X"27", + X"11",X"31",X"41",X"09",X"91",X"09",X"3E",X"01",X"06",X"27",X"E5",X"BA",X"17",X"30",X"08",X"FE", + X"02",X"08",X"27",X"11",X"31",X"41",X"09",X"88",X"09",X"3E",X"01",X"06",X"27",X"E5",X"BA",X"17", + X"30",X"25",X"11",X"31",X"41",X"09",X"AF",X"09",X"3E",X"01",X"06",X"27",X"E5",X"BA",X"17",X"11", + X"B4",X"40",X"09",X"BE",X"09",X"3E",X"01",X"06",X"31",X"E5",X"BA",X"17",X"3A",X"EB",X"64",X"FE", + X"00",X"08",X"27",X"11",X"7C",X"41",X"09",X"D7",X"09",X"3E",X"01",X"06",X"06",X"E5",X"BA",X"17", + X"30",X"1B",X"FE",X"01",X"08",X"27",X"11",X"7C",X"41",X"09",X"F5",X"09",X"3E",X"01",X"06",X"06", + X"E5",X"BA",X"17",X"30",X"08",X"FE",X"02",X"08",X"27",X"11",X"7C",X"41",X"09",X"CB",X"09",X"3E", + X"01",X"06",X"05",X"E5",X"BA",X"17",X"30",X"25",X"11",X"7C",X"41",X"09",X"E8",X"09",X"3E",X"01", + X"06",X"05",X"E5",X"BA",X"17",X"3E",X"C2",X"1A",X"4E",X"41",X"3E",X"7C",X"1A",X"AA",X"64",X"3E", + X"3B",X"1A",X"AB",X"64",X"3E",X"14",X"1A",X"AC",X"64",X"3E",X"21",X"1A",X"AD",X"64",X"3E",X"04", + X"E5",X"1C",X"17",X"AF",X"1A",X"AA",X"64",X"09",X"F3",X"64",X"E3",X"6E",X"08",X"40",X"E5",X"F6", + X"0B",X"E5",X"D2",X"0B",X"E5",X"CE",X"0B",X"E5",X"D6",X"0B",X"E5",X"EA",X"0B",X"AF",X"1A",X"75", + X"65",X"1A",X"78",X"65",X"1A",X"93",X"65",X"1A",X"AE",X"65",X"1A",X"E1",X"65",X"1A",X"CC",X"65", + X"1A",X"FF",X"65",X"E5",X"FA",X"17",X"1A",X"C0",X"50",X"09",X"F3",X"64",X"E3",X"6E",X"08",X"26", + X"09",X"F4",X"64",X"E3",X"66",X"08",X"02",X"30",X"E6",X"E3",X"A6",X"C3",X"8C",X"07",X"E5",X"EF", + X"17",X"09",X"F3",X"64",X"E3",X"CE",X"E3",X"AE",X"09",X"F4",X"64",X"E3",X"A6",X"E3",X"96",X"E3", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"64",X"01",X"67",X"00",X"1E",X"FF",X"ED",X"98",X"3E",X"FF",X"1A",X"01",X"50",X"09",X"F5",X"64", + X"FF",X"EE",X"CC",X"08",X"08",X"CC",X"EE",X"FF",X"FF",X"77",X"33",X"01",X"01",X"33",X"77",X"FF", + X"EE",X"CC",X"88",X"08",X"08",X"88",X"CC",X"EE",X"77",X"33",X"11",X"01",X"01",X"11",X"33",X"77", + X"88",X"88",X"88",X"08",X"08",X"88",X"88",X"88",X"11",X"11",X"11",X"01",X"01",X"11",X"11",X"11", + X"45",X"59",X"45",X"53",X"2C",X"43",X"4F",X"50",X"59",X"52",X"49",X"47",X"48",X"54",X"20",X"31", + X"39",X"38",X"32",X"44",X"49",X"47",X"49",X"54",X"52",X"45",X"58",X"20",X"54",X"45",X"43",X"48", + X"53",X"54",X"41",X"52",X"1A",X"C8",X"64",X"3A",X"CB",X"64",X"D6",X"01",X"0F",X"1A",X"CB",X"64", + X"09",X"F4",X"64",X"E3",X"CE",X"3A",X"E8",X"64",X"1A",X"EC",X"64",X"E5",X"13",X"00",X"3A",X"C9", + X"64",X"FE",X"00",X"E2",X"0C",X"25",X"E5",X"02",X"17",X"C3",X"0C",X"25",X"FE",X"04",X"18",X"29", + X"11",X"26",X"41",X"09",X"ED",X"37",X"3E",X"01",X"06",X"11",X"E5",X"BA",X"17",X"11",X"10",X"42", + X"09",X"FE",X"37",X"3E",X"01",X"06",X"02",X"E5",X"BA",X"17",X"11",X"5A",X"41",X"09",X"CA",X"37", + X"3E",X"01",X"06",X"23",X"E5",X"BA",X"17",X"30",X"94",X"11",X"90",X"40",X"09",X"00",X"08",X"3E", + X"01",X"06",X"31",X"E5",X"BA",X"17",X"30",X"85",X"3A",X"40",X"50",X"E3",X"5F",X"08",X"1B",X"3A", + X"C9",X"64",X"FE",X"00",X"28",X"15",X"3A",X"C8",X"64",X"FE",X"04",X"38",X"0D",X"D6",X"04",X"1A", + X"C8",X"64",X"3A",X"CB",X"64",X"D6",X"02",X"0F",X"1A",X"CB",X"64",X"09",X"F4",X"64",X"E3",X"8E", + X"3A",X"E8",X"64",X"1A",X"EC",X"64",X"1A",X"ED",X"64",X"E5",X"13",X"00",X"E5",X"0C",X"00",X"C3", + X"A6",X"24",X"1A",X"C0",X"50",X"09",X"F3",X"64",X"E3",X"5E",X"08",X"03",X"C3",X"75",X"24",X"E3", + X"9E",X"C3",X"1C",X"24",X"AF",X"09",X"EE",X"64",X"11",X"EF",X"64",X"01",X"05",X"00",X"5F",X"ED", + X"98",X"1A",X"DD",X"64",X"1A",X"DE",X"64",X"3E",X"40",X"09",X"CC",X"43",X"11",X"CD",X"43",X"01", + X"05",X"00",X"5F",X"ED",X"98",X"09",X"DE",X"43",X"11",X"DF",X"43",X"01",X"05",X"00",X"5F",X"ED", + X"98",X"AF",X"1A",X"CC",X"43",X"1A",X"DE",X"43",X"E5",X"CA",X"0B",X"E5",X"02",X"0C",X"09",X"F5", + X"64",X"E3",X"E6",X"09",X"F4",X"64",X"E3",X"4E",X"28",X"02",X"30",X"32",X"3E",X"00",X"1A",X"03", + X"50",X"E5",X"29",X"17",X"11",X"50",X"41",X"09",X"31",X"08",X"3E",X"01",X"06",X"25",X"E5",X"BA", + X"17",X"3E",X"03",X"E5",X"1C",X"17",X"09",X"F4",X"64",X"E3",X"EE",X"3A",X"EC",X"64",X"3D",X"1A", + X"EC",X"64",X"3E",X"40",X"09",X"16",X"40",X"11",X"17",X"40",X"01",X"20",X"00",X"5F",X"ED",X"98", + X"E5",X"13",X"00",X"E5",X"DE",X"0B",X"C3",X"0C",X"26",X"09",X"F4",X"64",X"E3",X"4E",X"08",X"D6", + X"E3",X"6E",X"28",X"B8",X"3A",X"F4",X"64",X"E3",X"7F",X"08",X"1F",X"E5",X"29",X"17",X"11",X"50", + X"41",X"09",X"0E",X"08",X"3E",X"01",X"06",X"25",X"E5",X"BA",X"17",X"3E",X"03",X"E5",X"1C",X"17", + X"09",X"F4",X"64",X"E3",X"AE",X"3A",X"ED",X"64",X"3D",X"1A",X"ED",X"64",X"3E",X"40",X"09",X"02", + X"40",X"11",X"03",X"40",X"01",X"20",X"00",X"5F",X"ED",X"98",X"E5",X"0C",X"00",X"E5",X"FE",X"0B", + X"30",X"1A",X"3E",X"01",X"1A",X"03",X"50",X"30",X"C2",X"E5",X"29",X"17",X"09",X"F4",X"64",X"E3", + X"4E",X"08",X"A0",X"11",X"10",X"41",X"09",X"1B",X"08",X"3E",X"01",X"06",X"11",X"E5",X"BA",X"17", + X"09",X"75",X"65",X"E3",X"C6",X"3E",X"01",X"E5",X"1C",X"17",X"09",X"F4",X"64",X"E3",X"6E",X"28", + X"9C",X"C3",X"A3",X"25",X"E5",X"CE",X"0B",X"09",X"F5",X"64",X"E3",X"66",X"28",X"13",X"E3",X"A6", + X"09",X"FF",X"65",X"E3",X"C6",X"1A",X"C0",X"50",X"3A",X"FF",X"65",X"FE",X"00",X"08",X"DE",X"30", + X"05",X"3E",X"02",X"E5",X"1C",X"17",X"09",X"CC",X"65",X"E3",X"C6",X"E5",X"EA",X"0B",X"E5",X"FA", + X"17",X"09",X"F4",X"64",X"E3",X"66",X"28",X"DB",X"E3",X"A6",X"3E",X"01",X"E5",X"1C",X"17",X"E5", + X"EF",X"17",X"09",X"F4",X"64",X"E3",X"56",X"08",X"27",X"E5",X"EE",X"0B",X"E5",X"EF",X"17",X"09", + X"F4",X"64",X"E3",X"76",X"08",X"21",X"30",X"37",X"E3",X"96",X"E5",X"26",X"0C",X"30",X"EA",X"E3", + X"B6",X"09",X"F5",X"64",X"E3",X"E6",X"09",X"F4",X"64",X"E3",X"6E",X"08",X"05",X"E5",X"22",X"0C", + X"30",X"92",X"E5",X"06",X"0C",X"30",X"A5",X"3A",X"DC",X"64",X"FE",X"00",X"08",X"2E",X"09",X"F4", + X"64",X"E3",X"6E",X"08",X"2F",X"3A",X"ED",X"64",X"FE",X"00",X"08",X"66",X"E5",X"29",X"17",X"11", + X"90",X"41",X"09",X"44",X"08",X"3E",X"01",X"06",X"21",X"E5",X"BA",X"17",X"3E",X"02",X"E5",X"1C", + X"17",X"E5",X"D3",X"13",X"09",X"F3",X"64",X"E3",X"DE",X"C3",X"7C",X"07",X"D6",X"01",X"1A",X"DC", + X"64",X"C3",X"F9",X"25",X"3A",X"EC",X"64",X"FE",X"00",X"08",X"0D",X"09",X"F4",X"64",X"E3",X"4E", + X"08",X"E2",X"E5",X"29",X"17",X"11",X"D8",X"40",X"09",X"65",X"08",X"3E",X"01",X"06",X"14",X"E5", + X"BA",X"17",X"3E",X"03",X"E5",X"1C",X"17",X"C3",X"9C",X"25",X"E5",X"FA",X"0B",X"C3",X"A9",X"25", + X"E5",X"DA",X"0B",X"C3",X"A9",X"25",X"2A",X"D7",X"64",X"EB",X"F5",X"09",X"00",X"00",X"F5",X"31", + X"F5",X"7E",X"01",X"F5",X"86",X"02",X"47",X"CE",X"27",X"F5",X"5F",X"02",X"E3",X"38",X"E3",X"38", + X"E3",X"38",X"E3",X"38",X"F5",X"7E",X"00",X"09",X"1C",X"27",X"E3",X"0F",X"E5",X"95",X"17",X"76", + X"0B",X"56",X"EB",X"E9",X"40",X"27",X"40",X"27",X"41",X"27",X"61",X"27",X"51",X"27",X"71",X"27", + X"E1",X"F5",X"7E",X"04",X"90",X"F5",X"5F",X"04",X"E1",X"F5",X"7E",X"04",X"80",X"F5",X"5F",X"04", + X"E1",X"F5",X"7E",X"03",X"80",X"F5",X"5F",X"03",X"E1",X"F5",X"7E",X"03",X"90",X"F5",X"5F",X"03", + X"E1",X"2A",X"8C",X"64",X"EB",X"F5",X"09",X"00",X"00",X"F5",X"31",X"EB",X"01",X"00",X"64",X"1F", + X"3F",X"ED",X"42",X"CD",X"F5",X"7E",X"00",X"09",X"84",X"27",X"E3",X"0F",X"E5",X"95",X"17",X"76", + X"0B",X"56",X"EB",X"E9",X"54",X"10",X"90",X"27",X"D3",X"27",X"4B",X"10",X"6D",X"10",X"80",X"10", + X"F5",X"7E",X"03",X"1A",X"8A",X"64",X"F5",X"7E",X"04",X"1A",X"8B",X"64",X"E5",X"EA",X"10",X"F5", + X"7E",X"06",X"12",X"3A",X"50",X"64",X"FE",X"00",X"08",X"17",X"3A",X"51",X"64",X"FE",X"00",X"08", + X"17",X"C1",X"09",X"52",X"64",X"21",X"CD",X"D1",X"13",X"01",X"05",X"00",X"1E",X"FF",X"ED",X"98", + X"E1",X"F5",X"7E",X"06",X"13",X"12",X"30",X"E9",X"F5",X"7E",X"06",X"09",X"08",X"00",X"31",X"EB", + X"12",X"30",X"F6",X"E5",X"12",X"11",X"F5",X"7E",X"03",X"90",X"1A",X"8A",X"64",X"F5",X"7E",X"04", + X"1A",X"8B",X"64",X"E5",X"EA",X"10",X"3A",X"50",X"64",X"FE",X"00",X"28",X"1A",X"3A",X"50",X"64", + X"E3",X"0F",X"F5",X"46",X"05",X"80",X"3D",X"C1",X"FD",X"09",X"52",X"64",X"FD",X"21",X"FD",X"5B"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..11fc466e --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"03", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"05",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"07", + X"00",X"00",X"00",X"00",X"00",X"0B",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"0E",X"00",X"01",X"0C",X"0F", + X"00",X"05",X"0C",X"01",X"00",X"0C",X"0B",X"0E",X"00",X"0C",X"0F",X"01",X"00",X"00",X"00",X"00", + X"00",X"01",X"02",X"0F",X"00",X"07",X"0C",X"02",X"00",X"09",X"06",X"0F",X"00",X"0D",X"0C",X"0F", + X"00",X"05",X"03",X"09",X"00",X"0F",X"0B",X"00",X"00",X"05",X"0C",X"0B",X"00",X"05",X"0C",X"0B", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0E",X"01",X"00",X"0F",X"0B",X"0E",X"00",X"0E",X"00",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..88b2ecb3 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"66",X"EF",X"00",X"F8",X"EA",X"6F",X"00",X"3F",X"00",X"C9",X"38",X"AA",X"AF",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..1e48b947 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"DB",X"AF",X"06",X"20",X"09",X"00",X"50",X"5F",X"0B",X"10",X"FC",X"ED",X"56",X"19",X"D9",X"67", + X"C3",X"C7",X"02",X"3A",X"EC",X"64",X"FE",X"00",X"E0",X"47",X"3E",X"30",X"09",X"35",X"40",X"5F", + X"2B",X"10",X"FC",X"E1",X"3A",X"ED",X"64",X"FE",X"00",X"E0",X"47",X"3E",X"30",X"09",X"02",X"40", + X"5F",X"0B",X"10",X"FC",X"E1",X"B6",X"25",X"66",X"20",X"F1",X"F5",X"CD",X"FD",X"CD",X"AF",X"1A", + X"00",X"50",X"2A",X"52",X"64",X"3A",X"54",X"64",X"5F",X"2A",X"55",X"64",X"3A",X"57",X"64",X"5F", + X"2A",X"72",X"64",X"3A",X"74",X"64",X"5F",X"2A",X"75",X"64",X"3A",X"77",X"64",X"5F",X"2A",X"4A", + X"64",X"3A",X"4C",X"64",X"5F",X"2A",X"4D",X"64",X"3A",X"4F",X"64",X"5F",X"2A",X"6A",X"64",X"3A", + X"6C",X"64",X"5F",X"2A",X"6D",X"64",X"3A",X"6F",X"64",X"5F",X"2A",X"5A",X"64",X"3A",X"5C",X"64", + X"5F",X"2A",X"5D",X"64",X"3A",X"5F",X"64",X"5F",X"2A",X"7A",X"64",X"3A",X"7C",X"64",X"5F",X"2A", + X"7D",X"64",X"3A",X"7F",X"64",X"5F",X"2A",X"82",X"64",X"3A",X"84",X"64",X"5F",X"2A",X"85",X"64", + X"3A",X"87",X"64",X"5F",X"2A",X"A2",X"64",X"3A",X"A4",X"64",X"5F",X"2A",X"A5",X"64",X"3A",X"A7", + X"64",X"5F",X"2A",X"92",X"64",X"3A",X"94",X"64",X"5F",X"2A",X"95",X"64",X"3A",X"97",X"64",X"5F", + X"2A",X"B2",X"64",X"3A",X"B4",X"64",X"5F",X"2A",X"B5",X"64",X"3A",X"B7",X"64",X"5F",X"09",X"F4", + X"64",X"E3",X"7E",X"28",X"19",X"E3",X"6E",X"08",X"2D",X"06",X"06",X"09",X"AA",X"64",X"11",X"4A", + X"50",X"3E",X"06",X"26",X"02",X"ED",X"88",X"ED",X"88",X"E5",X"B0",X"17",X"10",X"DB",X"06",X"06", + X"09",X"AC",X"64",X"11",X"DA",X"67",X"3E",X"06",X"26",X"02",X"ED",X"88",X"ED",X"88",X"E5",X"B0", + X"17",X"10",X"DB",X"C3",X"7E",X"01",X"ED",X"73",X"AA",X"64",X"E5",X"2A",X"11",X"ED",X"53",X"4A", + X"50",X"ED",X"73",X"9A",X"64",X"E5",X"2A",X"11",X"ED",X"53",X"4C",X"50",X"ED",X"73",X"BA",X"64", + X"E5",X"2A",X"11",X"ED",X"53",X"4E",X"50",X"ED",X"73",X"C2",X"64",X"E5",X"2A",X"11",X"ED",X"53", + X"68",X"50",X"ED",X"73",X"E2",X"64",X"E5",X"2A",X"11",X"ED",X"53",X"6A",X"50",X"ED",X"73",X"D2", + X"64",X"E5",X"2A",X"11",X"ED",X"53",X"6C",X"50",X"2A",X"AC",X"64",X"E5",X"43",X"11",X"0A",X"DA", + X"67",X"2A",X"9C",X"64",X"E5",X"43",X"11",X"0A",X"DC",X"67",X"2A",X"BC",X"64",X"E5",X"43",X"11", + X"0A",X"DE",X"67",X"2A",X"C4",X"64",X"E5",X"43",X"11",X"0A",X"F8",X"67",X"2A",X"E4",X"64",X"E5", + X"43",X"11",X"0A",X"FA",X"67",X"2A",X"D4",X"64",X"E5",X"43",X"11",X"0A",X"FC",X"67",X"2A",X"F1", + X"64",X"0B",X"0A",X"F1",X"64",X"7E",X"FE",X"FF",X"08",X"06",X"09",X"15",X"0C",X"0A",X"F1",X"64", + X"09",X"F3",X"64",X"E3",X"46",X"08",X"56",X"3A",X"00",X"50",X"E3",X"6F",X"E2",X"2A",X"02",X"E3", + X"A6",X"E3",X"56",X"08",X"3D",X"3A",X"00",X"50",X"E3",X"7F",X"E2",X"38",X"02",X"3A",X"F6",X"64", + X"FE",X"06",X"28",X"07",X"3C",X"1A",X"F6",X"64",X"C3",X"3D",X"02",X"AF",X"1A",X"F6",X"64",X"E3", + X"76",X"08",X"22",X"3A",X"F7",X"64",X"FE",X"00",X"08",X"23",X"C3",X"3D",X"02",X"AF",X"1A",X"07", + X"50",X"E3",X"B6",X"30",X"68",X"3D",X"1A",X"F7",X"64",X"3E",X"01",X"1A",X"07",X"50",X"E3",X"F6", + X"30",X"73",X"3A",X"00",X"50",X"E3",X"7F",X"28",X"C4",X"E3",X"96",X"30",X"10",X"3A",X"00",X"50", + X"E3",X"6F",X"28",X"AD",X"E3",X"86",X"3A",X"F7",X"64",X"3C",X"1A",X"F7",X"64",X"3A",X"C8",X"64", + X"FE",X"14",X"18",X"32",X"47",X"3A",X"CA",X"64",X"80",X"1A",X"C8",X"64",X"E3",X"3F",X"06",X"00", + X"80",X"0F",X"1A",X"CB",X"64",X"E5",X"05",X"17",X"E3",X"4E",X"08",X"02",X"E3",X"EE",X"3A",X"42", + X"65",X"E3",X"C7",X"1A",X"42",X"65",X"E3",X"DE",X"30",X"83",X"E3",X"66",X"08",X"05",X"E3",X"E6", + X"C3",X"89",X"01",X"E3",X"C6",X"C3",X"B7",X"01",X"E3",X"D6",X"C3",X"AD",X"01",X"00",X"09",X"F4", + X"64",X"E3",X"46",X"28",X"16",X"E5",X"2A",X"30",X"09",X"F4",X"64",X"E3",X"7E",X"28",X"04",X"E3", + X"6E",X"28",X"05",X"E5",X"22",X"30",X"30",X"03",X"E5",X"32",X"30",X"3A",X"CD",X"64",X"3C",X"1A", + X"CD",X"64",X"3A",X"CC",X"64",X"3C",X"1A",X"CC",X"64",X"FE",X"3C",X"08",X"23",X"AF",X"1A",X"CC", + X"64",X"3A",X"CE",X"64",X"3C",X"1A",X"CE",X"64",X"09",X"F3",X"64",X"E3",X"BE",X"3A",X"00",X"50", + X"E3",X"5F",X"08",X"1D",X"AF",X"1A",X"01",X"50",X"09",X"4A",X"50",X"06",X"24",X"1E",X"00",X"0B", + X"10",X"FB",X"3E",X"40",X"E5",X"CD",X"16",X"3E",X"01",X"E5",X"DD",X"16",X"11",X"D0",X"41",X"09", + X"C2",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"06",X"FF",X"09",X"FF",X"FF",X"2B",X"7D", + X"BC",X"1A",X"C0",X"50",X"08",X"F8",X"10",X"DB",X"5E",X"FB",X"3E",X"01",X"1A",X"00",X"50",X"FD", + X"C9",X"F5",X"C9",X"F1",X"20",X"ED",X"65",X"3A",X"00",X"50",X"E3",X"4F",X"C2",X"95",X"05",X"AF", + X"06",X"20",X"09",X"00",X"50",X"5F",X"0B",X"10",X"FC",X"3E",X"00",X"1A",X"03",X"50",X"19",X"D9", + X"67",X"E5",X"DA",X"17",X"DB",X"20",X"AF",X"20",X"09",X"00",X"40",X"E5",X"16",X"05",X"20",X"E3", + X"47",X"28",X"02",X"E3",X"D7",X"E3",X"67",X"28",X"02",X"E3",X"F7",X"20",X"09",X"00",X"44",X"E5", + X"16",X"05",X"20",X"E3",X"47",X"28",X"02",X"E3",X"CF",X"E3",X"67",X"28",X"02",X"E3",X"EF",X"20", + X"19",X"FD",X"43",X"09",X"00",X"64",X"E5",X"16",X"05",X"20",X"E3",X"47",X"28",X"02",X"E3",X"DF", + X"E3",X"67",X"28",X"02",X"E3",X"FF",X"20",X"3E",X"01",X"E5",X"DD",X"16",X"09",X"00",X"40",X"11", + X"01",X"40",X"01",X"FE",X"03",X"1E",X"40",X"ED",X"98",X"11",X"4E",X"41",X"09",X"D8",X"09",X"3E", + X"01",X"06",X"23",X"E5",X"BD",X"17",X"11",X"A2",X"40",X"09",X"FB",X"09",X"3E",X"01",X"06",X"30", + X"E5",X"BD",X"17",X"11",X"EC",X"40",X"09",X"13",X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17", + X"11",X"ED",X"40",X"09",X"0F",X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11",X"EE",X"40", + X"09",X"3B",X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11",X"EF",X"40",X"09",X"67",X"0A", + X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11",X"93",X"40",X"09",X"F7",X"0A",X"3E",X"01",X"06", + X"30",X"E5",X"BD",X"17",X"11",X"DD",X"40",X"09",X"4B",X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD", + X"17",X"11",X"DE",X"40",X"09",X"5F",X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11",X"DF", + X"40",X"09",X"A3",X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11",X"F8",X"40",X"09",X"B7", + X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11",X"F9",X"40",X"09",X"9B",X"0A",X"3E",X"01", + X"06",X"14",X"E5",X"BD",X"17",X"11",X"FA",X"40",X"09",X"C7",X"0A",X"3E",X"01",X"06",X"14",X"E5", + X"BD",X"17",X"20",X"1A",X"32",X"66",X"20",X"3A",X"32",X"66",X"E3",X"57",X"28",X"25",X"11",X"DD", + X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A",X"32",X"66",X"E3",X"77", + X"28",X"25",X"11",X"DE",X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A", + X"32",X"66",X"E3",X"4F",X"28",X"25",X"11",X"DF",X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04", + X"E5",X"BD",X"17",X"3A",X"32",X"66",X"E3",X"6F",X"28",X"25",X"11",X"F8",X"40",X"09",X"F3",X"0A", + X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A",X"32",X"66",X"E3",X"5F",X"28",X"25",X"11",X"F9", + X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A",X"32",X"66",X"E3",X"7F", + X"28",X"25",X"11",X"FA",X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"36", + X"00",X"09",X"00",X"00",X"E5",X"FD",X"04",X"18",X"02",X"E3",X"C3",X"09",X"00",X"10",X"E5",X"FD", + X"04",X"18",X"02",X"E3",X"E3",X"09",X"00",X"08",X"E5",X"FD",X"04",X"18",X"02",X"E3",X"D3",X"09", + X"00",X"18",X"E5",X"FD",X"04",X"18",X"02",X"E3",X"F3",X"3A",X"32",X"66",X"FE",X"00",X"28",X"02", + X"3E",X"80",X"9B",X"1A",X"32",X"66",X"E3",X"47",X"28",X"25",X"11",X"EC",X"40",X"09",X"F3",X"0A", + X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A",X"32",X"66",X"E3",X"67",X"28",X"25",X"11",X"ED", + X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A",X"32",X"66",X"E3",X"57", + X"28",X"25",X"11",X"EE",X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A", + X"32",X"66",X"E3",X"77",X"28",X"25",X"11",X"EF",X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04", + X"E5",X"BD",X"17",X"3A",X"32",X"66",X"FE",X"00",X"08",X"26",X"FB",X"3E",X"01",X"1A",X"00",X"50", + X"3E",X"02",X"E5",X"1F",X"17",X"C3",X"F1",X"02",X"1A",X"C0",X"50",X"30",X"FB",X"01",X"00",X"10", + X"AF",X"1A",X"C0",X"50",X"86",X"0B",X"57",X"23",X"79",X"98",X"7A",X"08",X"DF",X"FE",X"FF",X"28", + X"02",X"1F",X"E1",X"1F",X"3F",X"E1",X"20",X"CE",X"FC",X"20",X"CD",X"3E",X"11",X"E5",X"1D",X"05", + X"C9",X"CD",X"3E",X"0A",X"E5",X"1D",X"05",X"C9",X"CD",X"3E",X"44",X"E5",X"1D",X"05",X"C9",X"3E", + X"A0",X"E5",X"1D",X"05",X"E1",X"1A",X"C0",X"50",X"CD",X"CD",X"D1",X"13",X"01",X"FF",X"03",X"5F", + X"ED",X"98",X"C9",X"01",X"00",X"04",X"BE",X"C4",X"53",X"05",X"0B",X"77",X"23",X"79",X"98",X"7B", + X"08",X"DC",X"E1",X"77",X"7E",X"CE",X"27",X"57",X"7B",X"CE",X"27",X"BA",X"28",X"04",X"20",X"E3", + X"E7",X"20",X"7E",X"CE",X"D8",X"57",X"7B",X"CE",X"D8",X"BA",X"E0",X"20",X"E3",X"C7",X"20",X"7B", + X"E1",X"45",X"71",X"45",X"53",X"2C",X"43",X"67",X"50",X"71",X"52",X"61",X"47",X"60",X"54",X"08", + X"19",X"39",X"38",X"1A",X"44",X"61",X"47",X"61",X"54",X"52",X"45",X"70",X"08",X"54",X"45",X"43", + X"60",X"53",X"54",X"41",X"52",X"1A",X"C0",X"50",X"09",X"00",X"40",X"11",X"01",X"40",X"01",X"FE", + X"07",X"1E",X"40",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"00",X"64",X"11",X"01",X"64",X"01",X"FE", + X"03",X"1E",X"00",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"48",X"50",X"11",X"49",X"50",X"01",X"27", + X"00",X"1E",X"00",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"D8",X"67",X"11",X"D9",X"67",X"01",X"27", + X"00",X"1E",X"00",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"40",X"50",X"11",X"41",X"50",X"01",X"37", + X"00",X"1E",X"00",X"ED",X"98",X"09",X"52",X"64",X"11",X"53",X"64",X"01",X"67",X"00",X"1E",X"FF", + X"ED",X"98",X"09",X"15",X"0C",X"0A",X"F1",X"64",X"3A",X"80",X"50",X"47",X"CE",X"03",X"1A",X"C9", + X"64",X"09",X"79",X"0B",X"E5",X"B0",X"17",X"7E",X"1A",X"CA",X"64",X"78",X"CE",X"24",X"E3",X"3F", + X"E3",X"3F",X"09",X"1F",X"0B",X"E5",X"B0",X"17",X"7E",X"1A",X"E8",X"64",X"78",X"CE",X"18",X"09", + X"DF",X"0A",X"E5",X"B0",X"17",X"0A",X"E9",X"64",X"78",X"CE",X"18",X"E3",X"3F",X"E3",X"3F",X"E3", + X"3F",X"E3",X"3F",X"1A",X"EB",X"64",X"78",X"E3",X"5F",X"08",X"05",X"09",X"F4",X"64",X"E3",X"FE", + X"FB",X"3E",X"01",X"1A",X"00",X"50",X"E5",X"F5",X"0B",X"09",X"C2",X"43",X"11",X"C3",X"43",X"01", + X"3C",X"00",X"1E",X"40",X"ED",X"98",X"09",X"C2",X"47",X"11",X"C3",X"47",X"01",X"34",X"00",X"1E", + X"01",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"CA",X"47",X"11",X"CB",X"47",X"01",X"34",X"00",X"1E", + X"05",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"BC",X"37",X"11",X"C3",X"43",X"01",X"32",X"00",X"ED", + X"98",X"AF",X"1A",X"CC",X"43",X"1A",X"ED",X"43",X"1A",X"DE",X"43",X"09",X"7D",X"0B",X"11",X"DF", + X"64",X"01",X"3C",X"00",X"ED",X"98",X"09",X"FC",X"64",X"11",X"DA",X"43",X"E5",X"20",X"12",X"09", + X"02",X"40",X"11",X"03",X"40",X"01",X"3C",X"00",X"1E",X"40",X"ED",X"98",X"1A",X"C0",X"50",X"09", + X"02",X"44",X"11",X"03",X"44",X"01",X"34",X"00",X"1E",X"16",X"ED",X"98",X"09",X"0A",X"44",X"11", + X"0B",X"44",X"01",X"34",X"00",X"1E",X"11",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"D6",X"37",X"11", + X"27",X"40",X"01",X"06",X"00",X"ED",X"98",X"AF",X"1A",X"24",X"40",X"3A",X"C9",X"64",X"FE",X"00", + X"08",X"23",X"09",X"F4",X"37",X"11",X"24",X"40",X"01",X"21",X"00",X"ED",X"98",X"1A",X"C0",X"50", + X"09",X"42",X"65",X"11",X"43",X"65",X"01",X"FF",X"00",X"1E",X"00",X"ED",X"98",X"09",X"5E",X"32", + X"0A",X"73",X"65",X"0A",X"43",X"65",X"09",X"72",X"65",X"0A",X"62",X"65",X"09",X"A8",X"32",X"0A", + X"5E",X"65",X"0A",X"76",X"65",X"09",X"5D",X"65",X"0A",X"4D",X"65",X"09",X"F2",X"32",X"0A",X"91", + X"65",X"0A",X"79",X"65",X"09",X"90",X"65",X"0A",X"80",X"65",X"09",X"24",X"33",X"0A",X"AC",X"65", + X"0A",X"94",X"65",X"09",X"AB",X"65",X"0A",X"B3",X"65",X"09",X"3E",X"33",X"0A",X"C7",X"65",X"0A", + X"AF",X"65",X"09",X"C6",X"65",X"0A",X"9E",X"65",X"09",X"58",X"33",X"0A",X"CA",X"65",X"0A",X"E2", + X"65",X"09",X"C9",X"65",X"0A",X"D1",X"65",X"09",X"8A",X"33",X"0A",X"FD",X"65",X"0A",X"CD",X"65", + X"09",X"FC",X"65",X"0A",X"EC",X"65",X"09",X"D4",X"33",X"0A",X"30",X"66",X"0A",X"00",X"66",X"09", + X"17",X"66",X"0A",X"07",X"66",X"06",X"08",X"09",X"40",X"50",X"1E",X"00",X"0B",X"10",X"FB",X"3E", + X"00",X"1A",X"03",X"50",X"09",X"F4",X"64",X"E3",X"EE",X"3A",X"C9",X"64",X"FE",X"00",X"E2",X"D9", + X"23",X"3A",X"C8",X"64",X"FE",X"00",X"C2",X"D9",X"23",X"09",X"F3",X"64",X"E3",X"8E",X"AF",X"1A", + X"01",X"50",X"09",X"F4",X"64",X"E3",X"86",X"E5",X"DA",X"17",X"1A",X"C0",X"50",X"3E",X"40",X"E5", + X"CD",X"16",X"3E",X"50",X"E5",X"DD",X"16",X"11",X"CB",X"40",X"09",X"EA",X"08",X"3E",X"01",X"06", + X"12",X"E5",X"BD",X"17",X"3E",X"1A",X"E5",X"83",X"17",X"11",X"5F",X"44",X"09",X"D0",X"20",X"3E", + X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"35",X"47",X"09",X"D1",X"20",X"3E",X"01",X"06",X"04", + X"E5",X"D3",X"17",X"11",X"A2",X"44",X"09",X"D2",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17", + X"11",X"0E",X"46",X"09",X"D7",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"CF",X"44", + X"09",X"F1",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"A9",X"46",X"09",X"D4",X"20", + X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"A3",X"45",X"09",X"D3",X"20",X"3E",X"01",X"06", + X"04",X"E5",X"D3",X"17",X"11",X"64",X"47",X"09",X"F0",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3", + X"17",X"11",X"25",X"46",X"09",X"D1",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"6E", + X"44",X"09",X"F1",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"E7",X"46",X"09",X"D6", + X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"67",X"45",X"09",X"D5",X"20",X"3E",X"01", + X"06",X"04",X"E5",X"D3",X"17",X"11",X"19",X"46",X"09",X"D0",X"20",X"3E",X"01",X"06",X"04",X"E5", + X"D3",X"17",X"11",X"52",X"45",X"09",X"D1",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11", + X"13",X"47",X"09",X"D7",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"D4",X"44",X"09", + X"D5",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"15",X"46",X"09",X"D0",X"20",X"3E", + X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"B8",X"46",X"09",X"D6",X"20",X"3E",X"01",X"06",X"04", + X"E5",X"D3",X"17",X"11",X"B0",X"45",X"09",X"F0",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17", + X"11",X"72",X"47",X"09",X"D2",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"C3",X"F6",X"20", + X"01",X"03",X"05",X"07",X"21",X"26",X"27",X"10",X"30",X"36",X"12",X"03",X"05",X"07",X"11",X"67", + X"41",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17", + X"11",X"0E",X"42",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5", + X"83",X"17",X"11",X"E7",X"42",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E", + X"20",X"E5",X"83",X"17",X"11",X"A2",X"40",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD", + X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"15",X"42",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04", + X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"35",X"43",X"09",X"C6",X"08",X"3E",X"01", + X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"D4",X"40",X"09",X"C6",X"08", + X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"A9",X"42",X"09", + X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"72", + X"43",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17", + X"11",X"5F",X"40",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5", + X"83",X"17",X"11",X"A3",X"41",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E", + X"20",X"E5",X"83",X"17",X"11",X"64",X"43",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD", + X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"25",X"42",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04", + X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"B8",X"42",X"09",X"C6",X"08",X"3E",X"01", + X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"19",X"42",X"09",X"C6",X"08", + X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"CF",X"40",X"09", + X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"B0", + X"41",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17", + X"11",X"6E",X"40",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5", + X"83",X"17",X"11",X"13",X"43",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E", + X"20",X"E5",X"83",X"17",X"11",X"52",X"41",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD", + X"17",X"3E",X"10",X"E5",X"83",X"17",X"11",X"B3",X"40",X"09",X"E2",X"08",X"3E",X"01",X"06",X"27", + X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"7D",X"40",X"09",X"F1",X"08",X"3E",X"01", + X"06",X"11",X"E5",X"BD",X"17",X"3E",X"01",X"E5",X"1F",X"17",X"09",X"F3",X"64",X"E3",X"6E",X"C2", + X"D9",X"23",X"E5",X"76",X"12",X"3E",X"07",X"E5",X"1F",X"17",X"09",X"F3",X"64",X"E3",X"6E",X"C2", + X"D9",X"23",X"3E",X"40",X"E5",X"CD",X"16",X"11",X"40",X"44",X"09",X"F2",X"20",X"3E",X"13",X"06", + X"34",X"E5",X"D3",X"17",X"11",X"87",X"46",X"09",X"F4",X"20",X"3E",X"24",X"06",X"05",X"E5",X"D3", + X"17",X"11",X"52",X"44",X"09",X"F3",X"20",X"3E",X"07",X"06",X"34",X"E5",X"D3",X"17",X"11",X"70", + X"44",X"09",X"F4",X"20",X"3E",X"03",X"06",X"34",X"E5",X"D3",X"17",X"11",X"73",X"44",X"09",X"F5", + X"20",X"3E",X"03",X"06",X"34",X"E5",X"D3",X"17",X"11",X"C2",X"40",X"09",X"FC",X"08",X"3E",X"01", + X"06",X"13",X"E5",X"BD",X"17",X"11",X"61",X"41",X"09",X"27",X"09",X"3E",X"20",X"06",X"24",X"E5", + X"BD",X"17",X"11",X"14",X"41",X"09",X"6F",X"09",X"3E",X"01",X"06",X"10",X"E5",X"BD",X"17",X"11", + X"D6",X"40",X"09",X"7F",X"09",X"3E",X"01",X"06",X"15",X"E5",X"BD",X"17",X"3A",X"C9",X"64",X"FE", + X"01",X"08",X"27",X"11",X"31",X"41",X"09",X"94",X"09",X"3E",X"01",X"06",X"27",X"E5",X"BD",X"17", + X"30",X"08",X"FE",X"02",X"08",X"27",X"11",X"31",X"41",X"09",X"8B",X"09",X"3E",X"01",X"06",X"27", + X"E5",X"BD",X"17",X"30",X"25",X"11",X"31",X"41",X"09",X"9A",X"09",X"3E",X"01",X"06",X"27",X"E5", + X"BD",X"17",X"11",X"B4",X"40",X"09",X"C1",X"09",X"3E",X"01",X"06",X"31",X"E5",X"BD",X"17",X"3A", + X"EB",X"64",X"FE",X"00",X"08",X"27",X"11",X"7C",X"41",X"09",X"F2",X"09",X"3E",X"01",X"06",X"06", + X"E5",X"BD",X"17",X"30",X"1B",X"FE",X"01",X"08",X"27",X"11",X"7C",X"41",X"09",X"C8",X"09",X"3E", + X"01",X"06",X"06",X"E5",X"BD",X"17",X"30",X"08",X"FE",X"02",X"08",X"27",X"11",X"7C",X"41",X"09", + X"CE",X"09",X"3E",X"01",X"06",X"05",X"E5",X"BD",X"17",X"30",X"25",X"11",X"7C",X"41",X"09",X"EB", + X"09",X"3E",X"01",X"06",X"05",X"E5",X"BD",X"17",X"3E",X"C2",X"1A",X"4E",X"41",X"3E",X"7C",X"1A", + X"AA",X"64",X"3E",X"3B",X"1A",X"AB",X"64",X"3E",X"14",X"1A",X"AC",X"64",X"3E",X"21",X"1A",X"AD", + X"64",X"3E",X"04",X"E5",X"1F",X"17",X"AF",X"1A",X"AA",X"64",X"09",X"F3",X"64",X"E3",X"6E",X"08", + X"40",X"E5",X"C9",X"0B",X"E5",X"D5",X"0B",X"E5",X"E9",X"0B",X"E5",X"F1",X"0B",X"E5",X"ED",X"0B", + X"AF",X"1A",X"75",X"65",X"1A",X"78",X"65",X"1A",X"93",X"65",X"1A",X"AE",X"65",X"1A",X"E1",X"65", + X"1A",X"CC",X"65",X"1A",X"FF",X"65",X"E5",X"FD",X"17",X"1A",X"C0",X"50",X"09",X"F3",X"64",X"E3", + X"6E",X"08",X"26",X"09",X"F4",X"64",X"E3",X"66",X"08",X"02",X"30",X"E6",X"E3",X"A6",X"C3",X"8F", + X"07",X"E5",X"DA",X"17",X"09",X"F3",X"64",X"E3",X"CE",X"E3",X"AE",X"09",X"F4",X"64",X"E3",X"A6", + X"E3",X"96",X"E3",X"B6",X"09",X"F5",X"64",X"E3",X"96",X"09",X"F4",X"64",X"E3",X"C6",X"09",X"52", + X"64",X"11",X"53",X"64",X"01",X"67",X"00",X"1E",X"FF",X"ED",X"98",X"3E",X"FF",X"1A",X"01",X"50", + X"09",X"F5",X"64",X"E3",X"56",X"08",X"27",X"3A",X"41",X"65",X"3C",X"1A",X"41",X"65",X"FE",X"14", + X"08",X"04",X"E3",X"D6",X"E3",X"F6",X"00",X"1A",X"C0",X"50",X"3E",X"40",X"E5",X"CD",X"16",X"3E", + X"01",X"E5",X"DD",X"16",X"3A",X"C9",X"64",X"FE",X"00",X"E2",X"E4",X"24",X"3A",X"C8",X"64",X"FE", + X"02",X"18",X"64",X"11",X"58",X"41",X"09",X"CD",X"37",X"3E",X"01",X"06",X"23",X"E5",X"BD",X"17", + X"3A",X"40",X"50",X"E3",X"6F",X"08",X"5C",X"3A",X"C9",X"64",X"FE",X"00",X"28",X"15",X"3A",X"C8", + X"64",X"FE",X"02",X"38",X"4E",X"D6",X"02",X"1A",X"C8",X"64",X"3A",X"CB",X"64",X"D6",X"01",X"0F", + X"1A",X"CB",X"64",X"09",X"F4",X"64",X"E3",X"CE",X"3A",X"E8",X"64",X"1A",X"EC",X"64",X"E5",X"13", + X"00",X"3A",X"C9",X"64",X"FE",X"00",X"E2",X"0F",X"25",X"E5",X"05",X"17",X"C3",X"0F",X"25",X"FE", + X"04",X"18",X"29",X"11",X"26",X"41",X"09",X"D8",X"37",X"3E",X"01",X"06",X"11",X"E5",X"BD",X"17", + X"11",X"10",X"42",X"09",X"01",X"08",X"3E",X"01",X"06",X"02",X"E5",X"BD",X"17",X"11",X"5A",X"41", + X"09",X"CD",X"37",X"3E",X"01",X"06",X"23",X"E5",X"BD",X"17",X"30",X"94",X"11",X"90",X"40",X"09", + X"03",X"08",X"3E",X"01",X"06",X"31",X"E5",X"BD",X"17",X"30",X"85",X"3A",X"40",X"50",X"E3",X"5F", + X"08",X"1B",X"3A",X"C9",X"64",X"FE",X"00",X"28",X"15",X"3A",X"C8",X"64",X"FE",X"04",X"38",X"0D", + X"D6",X"04",X"1A",X"C8",X"64",X"3A",X"CB",X"64",X"D6",X"02",X"0F",X"1A",X"CB",X"64",X"09",X"F4", + X"64",X"E3",X"8E",X"3A",X"E8",X"64",X"1A",X"EC",X"64",X"1A",X"ED",X"64",X"E5",X"13",X"00",X"E5", + X"0C",X"00",X"C3",X"91",X"24",X"1A",X"C0",X"50",X"09",X"F3",X"64",X"E3",X"5E",X"08",X"03",X"C3", + X"48",X"24",X"E3",X"9E",X"C3",X"1F",X"24",X"AF",X"09",X"EE",X"64",X"11",X"EF",X"64",X"01",X"05", + X"00",X"5F",X"ED",X"98",X"1A",X"DD",X"64",X"1A",X"DE",X"64",X"3E",X"40",X"09",X"CC",X"43",X"11", + X"CD",X"43",X"01",X"05",X"00",X"5F",X"ED",X"98",X"09",X"DE",X"43",X"11",X"DF",X"43",X"01",X"05", + X"00",X"5F",X"ED",X"98",X"AF",X"1A",X"CC",X"43",X"1A",X"DE",X"43",X"E5",X"CD",X"0B",X"E5",X"05", + X"0C",X"09",X"F5",X"64",X"E3",X"E6",X"09",X"F4",X"64",X"E3",X"4E",X"28",X"02",X"30",X"32",X"3E", + X"00",X"1A",X"03",X"50",X"E5",X"2C",X"17",X"11",X"50",X"41",X"09",X"34",X"08",X"3E",X"01",X"06", + X"25",X"E5",X"BD",X"17",X"3E",X"03",X"E5",X"1F",X"17",X"09",X"F4",X"64",X"E3",X"EE",X"3A",X"EC", + X"64",X"3D",X"1A",X"EC",X"64",X"3E",X"40",X"09",X"16",X"40",X"11",X"17",X"40",X"01",X"20",X"00", + X"5F",X"ED",X"98",X"E5",X"13",X"00",X"E5",X"F9",X"0B",X"C3",X"0F",X"26",X"09",X"F4",X"64",X"E3", + X"4E",X"08",X"D6",X"E3",X"6E",X"28",X"B8",X"3A",X"F4",X"64",X"E3",X"7F",X"08",X"1F",X"E5",X"2C", + X"17",X"11",X"50",X"41",X"09",X"29",X"08",X"3E",X"01",X"06",X"25",X"E5",X"BD",X"17",X"3E",X"03", + X"E5",X"1F",X"17",X"09",X"F4",X"64",X"E3",X"AE",X"3A",X"ED",X"64",X"3D",X"1A",X"ED",X"64",X"3E", + X"40",X"09",X"02",X"40",X"11",X"03",X"40",X"01",X"20",X"00",X"5F",X"ED",X"98",X"E5",X"0C",X"00", + X"E5",X"01",X"0C",X"30",X"1A",X"3E",X"01",X"1A",X"03",X"50",X"30",X"C2",X"E5",X"2C",X"17",X"09", + X"F4",X"64",X"E3",X"4E",X"08",X"A0",X"11",X"10",X"41",X"09",X"1E",X"08",X"3E",X"01",X"06",X"11", + X"E5",X"BD",X"17",X"09",X"75",X"65",X"E3",X"C6",X"3E",X"01",X"E5",X"1F",X"17",X"09",X"F4",X"64", + X"E3",X"6E",X"28",X"9C",X"C3",X"A6",X"25",X"E5",X"E9",X"0B",X"09",X"F5",X"64",X"E3",X"66",X"28", + X"13",X"E3",X"A6",X"09",X"FF",X"65",X"E3",X"C6",X"1A",X"C0",X"50",X"3A",X"FF",X"65",X"FE",X"00", + X"08",X"DE",X"30",X"05",X"3E",X"02",X"E5",X"1F",X"17",X"09",X"CC",X"65",X"E3",X"C6",X"E5",X"ED", + X"0B",X"E5",X"FD",X"17",X"09",X"F4",X"64",X"E3",X"66",X"28",X"DB",X"E3",X"A6",X"3E",X"01",X"E5", + X"1F",X"17",X"E5",X"DA",X"17",X"09",X"F4",X"64",X"E3",X"56",X"08",X"27",X"E5",X"D9",X"0B",X"E5", + X"DA",X"17",X"09",X"F4",X"64",X"E3",X"76",X"08",X"21",X"30",X"37",X"E3",X"96",X"E5",X"11",X"0C", + X"30",X"EA",X"E3",X"B6",X"09",X"F5",X"64",X"E3",X"E6",X"09",X"F4",X"64",X"E3",X"6E",X"08",X"05", + X"E5",X"25",X"0C",X"30",X"92",X"E5",X"21",X"0C",X"30",X"A5",X"3A",X"DC",X"64",X"FE",X"00",X"08", + X"2E",X"09",X"F4",X"64",X"E3",X"6E",X"08",X"2F",X"3A",X"ED",X"64",X"FE",X"00",X"08",X"66",X"E5", + X"2C",X"17",X"11",X"90",X"41",X"09",X"47",X"08",X"3E",X"01",X"06",X"21",X"E5",X"BD",X"17",X"3E", + X"02",X"E5",X"1F",X"17",X"E5",X"D6",X"13",X"09",X"F3",X"64",X"E3",X"DE",X"C3",X"7F",X"07",X"D6", + X"01",X"1A",X"DC",X"64",X"C3",X"FC",X"25",X"3A",X"EC",X"64",X"FE",X"00",X"08",X"0D",X"09",X"F4", + X"64",X"E3",X"4E",X"08",X"E2",X"E5",X"2C",X"17",X"11",X"D8",X"40",X"09",X"50",X"08",X"3E",X"01", + X"06",X"14",X"E5",X"BD",X"17",X"3E",X"03",X"E5",X"1F",X"17",X"C3",X"9F",X"25",X"E5",X"FD",X"0B", + X"C3",X"AC",X"25",X"E5",X"DD",X"0B",X"C3",X"AC",X"25",X"2A",X"D7",X"64",X"EB",X"F5",X"09",X"00", + X"00",X"F5",X"31",X"F5",X"7E",X"01",X"F5",X"86",X"02",X"47",X"CE",X"27",X"F5",X"5F",X"02",X"E3", + X"38",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"F5",X"7E",X"00",X"09",X"1F",X"27",X"E3",X"0F",X"E5", + X"B0",X"17",X"76",X"0B",X"56",X"EB",X"E9",X"43",X"27",X"43",X"27",X"44",X"27",X"64",X"27",X"54", + X"27",X"74",X"27",X"E1",X"F5",X"7E",X"04",X"90",X"F5",X"5F",X"04",X"E1",X"F5",X"7E",X"04",X"80", + X"F5",X"5F",X"04",X"E1",X"F5",X"7E",X"03",X"80",X"F5",X"5F",X"03",X"E1",X"F5",X"7E",X"03",X"90", + X"F5",X"5F",X"03",X"E1",X"2A",X"8C",X"64",X"EB",X"F5",X"09",X"00",X"00",X"F5",X"31",X"EB",X"01", + X"00",X"64",X"1F",X"3F",X"ED",X"42",X"CD",X"F5",X"7E",X"00",X"09",X"87",X"27",X"E3",X"0F",X"E5", + X"B0",X"17",X"76",X"0B",X"56",X"EB",X"E9",X"57",X"10",X"93",X"27",X"D6",X"27",X"4E",X"10",X"58", + X"10",X"83",X"10",X"F5",X"7E",X"03",X"1A",X"8A",X"64",X"F5",X"7E",X"04",X"1A",X"8B",X"64",X"E5", + X"ED",X"10",X"F5",X"7E",X"06",X"12",X"3A",X"50",X"64",X"FE",X"00",X"08",X"17",X"3A",X"51",X"64", + X"FE",X"00",X"08",X"17",X"C1",X"09",X"52",X"64",X"21",X"CD",X"D1",X"13",X"01",X"05",X"00",X"1E", + X"FF",X"ED",X"98",X"E1",X"F5",X"7E",X"06",X"13",X"12",X"30",X"E9",X"F5",X"7E",X"06",X"09",X"08", + X"00",X"31",X"EB",X"12",X"30",X"F6",X"E5",X"15",X"11",X"F5",X"7E",X"03",X"90",X"1A",X"8A",X"64", + X"F5",X"7E",X"04",X"1A",X"8B",X"64",X"E5",X"ED",X"10",X"3A",X"50",X"64",X"FE",X"00",X"28",X"1A", + X"3A",X"50",X"64",X"E3",X"0F",X"F5",X"46",X"05",X"80",X"3D",X"C1",X"FD",X"09",X"52",X"64",X"FD", + X"21",X"FD",X"5B",X"00",X"FD",X"5A",X"01",X"FD",X"5F",X"02",X"3C",X"13",X"FD",X"5B",X"03",X"FD", + X"5A",X"04",X"FD",X"5F",X"05",X"3A",X"8A",X"64",X"F5",X"5F",X"03",X"3A",X"8B",X"64",X"F5",X"5F", + X"04",X"E1",X"3A",X"51",X"64",X"FE",X"00",X"E2",X"A4",X"10",X"3A",X"51",X"64",X"E3",X"0F",X"C6", + X"27",X"F5",X"46",X"05",X"80",X"C1",X"FD",X"09",X"52",X"64",X"FD",X"21",X"FD",X"5B",X"00",X"FD", + X"5A",X"01",X"FD",X"5F",X"02",X"3C",X"09",X"08",X"00",X"31",X"EB",X"FD",X"5B",X"03",X"FD",X"5A", + X"04",X"FD",X"5F",X"05",X"C3",X"15",X"10",X"F5",X"7E",X"03",X"1A",X"8A",X"64",X"F5",X"7E",X"04", + X"1A",X"8B",X"64",X"C3",X"CE",X"27",X"E5",X"15",X"11",X"F5",X"7E",X"03",X"80",X"C3",X"F5",X"27", + X"E5",X"15",X"11",X"F5",X"7E",X"04",X"90",X"1A",X"8B",X"64",X"F5",X"7E",X"03",X"1A",X"8A",X"64", + X"C3",X"CE",X"27",X"E5",X"15",X"11",X"F5",X"7E",X"04",X"80",X"30",X"EB",X"F5",X"7E",X"05",X"C1", + X"FD",X"09",X"52",X"64",X"FD",X"21",X"FD",X"5B",X"00",X"FD",X"5A",X"01",X"FD",X"5F",X"02",X"3A", + X"8A",X"64",X"F5",X"5F",X"03",X"3A",X"8B",X"64",X"F5",X"5F",X"04",X"F5",X"7E",X"00",X"09",X"C0", + X"10",X"E3",X"0F",X"E5",X"B0",X"17",X"D5",X"76",X"0B",X"56",X"EB",X"D1",X"F5",X"7E",X"06",X"E9", + X"E4",X"10",X"E4",X"10",X"E5",X"10",X"F0",X"10",X"F3",X"10",X"CA",X"10",X"E1",X"13",X"FD",X"5B", + X"03",X"FD",X"5A",X"04",X"FD",X"5F",X"05",X"E1",X"33",X"30",X"DB",X"09",X"08",X"00",X"31",X"EB", + X"30",X"EC",X"EB",X"11",X"08",X"00",X"1F",X"3F",X"ED",X"52",X"EB",X"30",X"C9",X"3A",X"8A",X"64", + X"CE",X"07",X"1A",X"50",X"64",X"3A",X"8B",X"64",X"CE",X"07",X"1A",X"51",X"64",X"3A",X"8A",X"64", + X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"57",X"3A",X"8B",X"64",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F", + X"77",X"E5",X"C7",X"16",X"E1",X"F5",X"7E",X"01",X"F5",X"86",X"02",X"47",X"CE",X"27",X"F5",X"5F", + X"02",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E1",X"D5",X"1F",X"3F",X"09",X"26",X"01", + X"16",X"00",X"ED",X"52",X"7D",X"1F",X"3F",X"09",X"10",X"01",X"D1",X"72",X"16",X"00",X"ED",X"52", + X"55",X"77",X"E1",X"7D",X"EE",X"03",X"6F",X"E1",X"09",X"F4",X"64",X"E3",X"46",X"E0",X"E3",X"6E", + X"28",X"43",X"09",X"EE",X"64",X"7B",X"86",X"0F",X"5F",X"0B",X"7A",X"A6",X"0F",X"5F",X"0B",X"3E", + X"00",X"A6",X"0F",X"5F",X"38",X"02",X"30",X"1A",X"09",X"F4",X"64",X"E3",X"6E",X"28",X"13",X"09", + X"DE",X"43",X"11",X"DF",X"43",X"01",X"05",X"00",X"1E",X"40",X"ED",X"98",X"AF",X"1A",X"DE",X"43", + X"30",X"30",X"09",X"CC",X"43",X"11",X"CD",X"43",X"01",X"05",X"00",X"1E",X"40",X"ED",X"98",X"AF", + X"1A",X"CC",X"43",X"30",X"05",X"09",X"D9",X"64",X"30",X"BB",X"09",X"F4",X"64",X"E3",X"6E",X"28", + X"74",X"09",X"D8",X"64",X"11",X"FB",X"43",X"3A",X"DD",X"64",X"DD",X"E5",X"20",X"12",X"0B",X"0B", + X"0B",X"EB",X"2A",X"E9",X"64",X"D9",X"FE",X"04",X"D0",X"E3",X"0F",X"E3",X"0F",X"3C",X"3C",X"E5", + X"B0",X"17",X"E5",X"A4",X"13",X"D0",X"3A",X"DC",X"64",X"3C",X"1A",X"DC",X"64",X"09",X"75",X"65", + X"E3",X"C6",X"09",X"F4",X"64",X"E3",X"6E",X"28",X"12",X"3A",X"DD",X"64",X"3C",X"1A",X"DD",X"64", + X"3A",X"EC",X"64",X"3C",X"1A",X"EC",X"64",X"E5",X"13",X"00",X"E1",X"3A",X"DE",X"64",X"3C",X"1A", + X"DE",X"64",X"3A",X"ED",X"64",X"3C",X"1A",X"ED",X"64",X"E5",X"0C",X"00",X"E1",X"09",X"DB",X"64", + X"11",X"E9",X"43",X"3A",X"DE",X"64",X"30",X"8A",X"3E",X"03",X"DD",X"7E",X"CE",X"D8",X"E3",X"3F", + X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"47",X"3A",X"F4",X"64",X"E3",X"5F",X"28",X"0A",X"78",X"12", + X"33",X"7E",X"CE",X"27",X"47",X"3A",X"F4",X"64",X"E3",X"5F",X"1A",X"F4",X"64",X"28",X"08",X"78", + X"12",X"2B",X"33",X"D9",X"3D",X"08",X"D3",X"3A",X"F4",X"64",X"E3",X"9F",X"1A",X"F4",X"64",X"E1", + X"78",X"FE",X"00",X"28",X"F3",X"3A",X"F4",X"64",X"E3",X"DF",X"1A",X"F4",X"64",X"30",X"E7",X"78", + X"FE",X"00",X"28",X"F5",X"3A",X"F4",X"64",X"E3",X"DF",X"1A",X"F4",X"64",X"30",X"D1",X"09",X"F5", + X"64",X"E3",X"76",X"28",X"2C",X"E3",X"B6",X"09",X"40",X"40",X"E5",X"83",X"12",X"FE",X"09",X"08", + X"24",X"09",X"40",X"44",X"E5",X"83",X"12",X"FE",X"98",X"08",X"02",X"30",X"14",X"AF",X"1A",X"C9", + X"64",X"30",X"26",X"AF",X"11",X"80",X"03",X"86",X"0B",X"33",X"47",X"7A",X"9B",X"78",X"08",X"DF", + X"E1",X"00",X"3E",X"40",X"E5",X"CD",X"16",X"3E",X"05",X"E5",X"DD",X"16",X"11",X"29",X"45",X"09", + X"D0",X"12",X"3E",X"15",X"06",X"23",X"E5",X"D3",X"17",X"11",X"45",X"41",X"09",X"4C",X"08",X"3E", + X"01",X"06",X"24",X"E5",X"BD",X"17",X"09",X"3C",X"0B",X"11",X"E2",X"42",X"01",X"FF",X"21",X"ED", + X"88",X"13",X"10",X"FB",X"AF",X"12",X"E5",X"EA",X"17",X"3E",X"01",X"12",X"E5",X"D1",X"12",X"E1", + X"01",X"09",X"DF",X"64",X"11",X"6A",X"42",X"E5",X"11",X"13",X"11",X"6C",X"42",X"E5",X"11",X"13", + X"11",X"6E",X"42",X"E5",X"11",X"13",X"11",X"58",X"42",X"E5",X"11",X"13",X"11",X"5A",X"42",X"E5", + X"11",X"13",X"11",X"5C",X"42",X"E5",X"11",X"13",X"11",X"5E",X"42",X"E5",X"11",X"13",X"11",X"78", + X"42",X"E5",X"11",X"13",X"11",X"7A",X"42",X"E5",X"11",X"13",X"11",X"7C",X"42",X"E5",X"11",X"13", + X"E1",X"06",X"03",X"26",X"27",X"3E",X"09",X"ED",X"88",X"E5",X"99",X"17",X"10",X"DF",X"0B",X"0B", + X"3E",X"40",X"E5",X"99",X"17",X"E5",X"2E",X"13",X"3E",X"04",X"E5",X"B0",X"17",X"E1",X"3E",X"03", + X"DD",X"7E",X"CE",X"D8",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"47",X"3A",X"F4",X"64", + X"E3",X"5F",X"28",X"2A",X"78",X"12",X"3E",X"08",X"E5",X"99",X"17",X"7E",X"CE",X"27",X"47",X"3A", + X"F4",X"64",X"E3",X"5F",X"1A",X"F4",X"64",X"28",X"0C",X"78",X"12",X"2B",X"3E",X"08",X"E5",X"99", + X"17",X"D9",X"3D",X"08",X"E3",X"3A",X"F4",X"64",X"E3",X"9F",X"1A",X"F4",X"64",X"E1",X"78",X"FE", + X"00",X"28",X"D3",X"3A",X"F4",X"64",X"E3",X"DF",X"1A",X"F4",X"64",X"30",X"C7",X"78",X"FE",X"00", + X"28",X"F1",X"3A",X"F4",X"64",X"E3",X"DF",X"1A",X"F4",X"64",X"30",X"E5",X"06",X"03",X"32",X"BE", + X"38",X"20",X"08",X"26",X"2B",X"33",X"10",X"DE",X"30",X"06",X"E5",X"8F",X"13",X"1F",X"3F",X"E1", + X"1F",X"E1",X"E5",X"8F",X"13",X"1F",X"E1",X"78",X"FE",X"00",X"E0",X"2B",X"33",X"3D",X"08",X"FB", + X"E1",X"6E",X"45",X"71",X"45",X"53",X"2C",X"43",X"67",X"50",X"71",X"52",X"61",X"47",X"60",X"54", + X"08",X"19",X"39",X"38",X"1A",X"44",X"61",X"47",X"61",X"54",X"52",X"45",X"70",X"08",X"54",X"45", + X"43",X"60",X"53",X"54",X"41",X"52",X"09",X"F4",X"64",X"E3",X"EE",X"09",X"EE",X"64",X"11",X"39", + X"65",X"01",X"03",X"00",X"ED",X"98",X"E5",X"00",X"14",X"09",X"F4",X"64",X"E3",X"4E",X"C0",X"E3", + X"AE",X"09",X"D9",X"64",X"11",X"39",X"65",X"01",X"03",X"00",X"ED",X"98",X"E5",X"00",X"14",X"E1", + X"01",X"00",X"22",X"09",X"1D",X"65",X"11",X"3B",X"65",X"2B",X"2B",X"2B",X"C5",X"E5",X"A4",X"13", + X"C1",X"18",X"22",X"3E",X"06",X"81",X"67",X"10",X"ED",X"2B",X"2B",X"30",X"20",X"79",X"FE",X"00", + X"E0",X"0B",X"0B",X"0B",X"0B",X"C5",X"CD",X"06",X"00",X"09",X"1A",X"65",X"11",X"38",X"65",X"ED", + X"B8",X"3E",X"40",X"E5",X"CD",X"16",X"09",X"F4",X"64",X"E3",X"6E",X"08",X"33",X"11",X"4A",X"41", + X"09",X"2C",X"08",X"3E",X"01",X"06",X"22",X"E5",X"BD",X"17",X"09",X"F4",X"64",X"E3",X"7E",X"28", + X"31",X"3E",X"01",X"1A",X"03",X"50",X"30",X"12",X"11",X"4A",X"41",X"09",X"37",X"08",X"3E",X"01", + X"06",X"22",X"E5",X"BD",X"17",X"3E",X"00",X"1A",X"03",X"50",X"11",X"40",X"44",X"09",X"C3",X"16", + X"3E",X"23",X"06",X"34",X"E5",X"D3",X"17",X"11",X"64",X"44",X"09",X"C4",X"16",X"3E",X"03",X"06", + X"34",X"E5",X"D3",X"17",X"11",X"51",X"44",X"09",X"C5",X"16",X"3E",X"10",X"06",X"34",X"E5",X"D3", + X"17",X"11",X"50",X"44",X"09",X"C6",X"16",X"3E",X"02",X"06",X"34",X"E5",X"D3",X"17",X"D1",X"D5", + X"3E",X"40",X"D5",X"C9",X"13",X"01",X"03",X"00",X"5F",X"ED",X"98",X"1E",X"00",X"01",X"02",X"00", + X"ED",X"98",X"D1",X"C1",X"D5",X"78",X"09",X"B9",X"0B",X"E3",X"0F",X"E5",X"B0",X"17",X"66",X"0B", + X"46",X"C5",X"09",X"80",X"04",X"21",X"26",X"01",X"06",X"27",X"59",X"3E",X"08",X"E5",X"8F",X"17", + X"10",X"F8",X"11",X"C3",X"40",X"09",X"58",X"08",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11", + X"8D",X"41",X"09",X"84",X"08",X"3E",X"01",X"06",X"07",X"E5",X"BD",X"17",X"11",X"8F",X"40",X"09", + X"A3",X"08",X"3E",X"01",X"06",X"16",X"E5",X"BD",X"17",X"11",X"A8",X"40",X"09",X"89",X"08",X"3E", + X"01",X"06",X"16",X"E5",X"BD",X"17",X"11",X"69",X"42",X"09",X"9F",X"08",X"3E",X"01",X"06",X"20", + X"E5",X"BD",X"17",X"11",X"64",X"40",X"09",X"BF",X"08",X"3E",X"03",X"06",X"01",X"E5",X"BD",X"17", + X"11",X"A5",X"40",X"09",X"77",X"0B",X"3E",X"01",X"06",X"32",X"E5",X"BD",X"17",X"3E",X"01",X"11", + X"AD",X"47",X"12",X"AF",X"1A",X"3D",X"65",X"1A",X"3E",X"65",X"09",X"AD",X"47",X"0A",X"3F",X"65", + X"11",X"59",X"41",X"09",X"4C",X"08",X"3E",X"01",X"06",X"24",X"E5",X"BD",X"17",X"09",X"3C",X"0B", + X"11",X"DC",X"42",X"01",X"21",X"00",X"ED",X"98",X"AF",X"12",X"E5",X"EA",X"17",X"3E",X"01",X"12", + X"09",X"DF",X"64",X"11",X"94",X"42",X"E5",X"11",X"13",X"11",X"95",X"42",X"E5",X"11",X"13",X"11", + X"96",X"42",X"E5",X"11",X"13",X"11",X"97",X"42",X"E5",X"11",X"13",X"11",X"B0",X"42",X"E5",X"11", + X"13",X"11",X"B1",X"42",X"E5",X"11",X"13",X"11",X"B2",X"42",X"E5",X"11",X"13",X"11",X"B3",X"42", + X"E5",X"11",X"13",X"11",X"B4",X"42",X"E5",X"11",X"13",X"11",X"B5",X"42",X"E5",X"11",X"13",X"3A", + X"3C",X"65",X"E3",X"67",X"E2",X"2B",X"16",X"E3",X"57",X"E2",X"4B",X"16",X"3A",X"3C",X"65",X"E3", + X"4F",X"C2",X"8C",X"16",X"3A",X"3D",X"65",X"FE",X"33",X"28",X"37",X"09",X"45",X"0B",X"E5",X"B0", + X"17",X"7E",X"C9",X"D1",X"12",X"13",X"5F",X"3E",X"08",X"E5",X"8F",X"17",X"D5",X"CD",X"3A",X"3E", + X"65",X"3C",X"1A",X"3E",X"65",X"FE",X"03",X"C2",X"9F",X"16",X"09",X"E5",X"0B",X"3A",X"3E",X"65", + X"E5",X"B0",X"17",X"7E",X"C9",X"D1",X"CD",X"E5",X"B5",X"17",X"09",X"39",X"65",X"01",X"03",X"00", + X"ED",X"98",X"3A",X"3E",X"65",X"FE",X"00",X"28",X"0D",X"09",X"D1",X"0B",X"E5",X"B0",X"17",X"7E", + X"D1",X"E5",X"99",X"17",X"09",X"3B",X"65",X"E5",X"2E",X"13",X"09",X"FC",X"64",X"11",X"DA",X"43", + X"E5",X"20",X"12",X"09",X"F5",X"64",X"E3",X"86",X"3E",X"01",X"E5",X"1F",X"17",X"E1",X"D1",X"3E", + X"80",X"E5",X"99",X"17",X"3E",X"08",X"E5",X"99",X"17",X"30",X"F1",X"3A",X"3D",X"65",X"FE",X"00", + X"E2",X"AC",X"15",X"3D",X"1A",X"3D",X"65",X"FE",X"32",X"28",X"14",X"3E",X"05",X"2A",X"3F",X"65", + X"5F",X"3E",X"08",X"E5",X"B0",X"17",X"0A",X"3F",X"65",X"3E",X"01",X"5F",X"C3",X"AC",X"15",X"3D", + X"1A",X"3D",X"65",X"3E",X"05",X"2A",X"3F",X"65",X"2B",X"5F",X"0B",X"5F",X"0B",X"5F",X"2B",X"3E", + X"40",X"30",X"C8",X"3A",X"3D",X"65",X"FE",X"33",X"E2",X"AC",X"15",X"3C",X"1A",X"3D",X"65",X"FE", + X"32",X"28",X"14",X"3E",X"05",X"2A",X"3F",X"65",X"5F",X"3E",X"08",X"E5",X"8F",X"17",X"0A",X"3F", + X"65",X"3E",X"01",X"5F",X"C3",X"AC",X"15",X"3C",X"1A",X"3D",X"65",X"3E",X"05",X"2A",X"3F",X"65", + X"5F",X"3E",X"40",X"E5",X"8F",X"17",X"0A",X"3F",X"65",X"3E",X"01",X"2B",X"5F",X"0B",X"5F",X"0B", + X"5F",X"C3",X"AC",X"15",X"3E",X"20",X"E5",X"83",X"17",X"1A",X"C0",X"50",X"06",X"14",X"E5",X"67", + X"17",X"F2",X"F2",X"15",X"C3",X"B7",X"15",X"3A",X"3C",X"65",X"E3",X"4F",X"1A",X"C0",X"50",X"28", + X"DE",X"30",X"CE",X"07",X"05",X"05",X"01",X"D5",X"AF",X"E3",X"0B",X"17",X"E3",X"0B",X"17",X"E3", + X"0B",X"17",X"E3",X"0B",X"17",X"E3",X"0B",X"17",X"57",X"EB",X"01",X"40",X"40",X"21",X"06",X"00", + X"D1",X"62",X"21",X"EB",X"E1",X"09",X"40",X"40",X"11",X"41",X"40",X"01",X"7F",X"03",X"5F",X"ED", + X"98",X"1A",X"C0",X"50",X"E1",X"09",X"40",X"44",X"11",X"41",X"44",X"01",X"7F",X"03",X"5F",X"ED", + X"98",X"1A",X"C0",X"50",X"E1",X"3A",X"C9",X"64",X"FE",X"00",X"E0",X"3A",X"CB",X"64",X"CE",X"D8", + X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"FE",X"00",X"28",X"24",X"1A",X"25",X"40",X"3A", + X"CB",X"64",X"CE",X"27",X"1A",X"24",X"40",X"E1",X"3E",X"40",X"30",X"D8",X"3E",X"35",X"E5",X"DD", + X"16",X"3E",X"40",X"E5",X"CD",X"16",X"E1",X"47",X"AF",X"1A",X"CC",X"64",X"1A",X"CE",X"64",X"3A", + X"CE",X"64",X"B8",X"E0",X"09",X"F3",X"64",X"E3",X"6E",X"C0",X"1A",X"C0",X"50",X"30",X"D8",X"3A", + X"F5",X"64",X"E3",X"47",X"28",X"25",X"3A",X"CF",X"64",X"47",X"3A",X"CE",X"64",X"B8",X"18",X"31", + X"1F",X"3F",X"E1",X"78",X"1A",X"CF",X"64",X"3A",X"F5",X"64",X"E3",X"C7",X"1A",X"F5",X"64",X"AF", + X"1A",X"CE",X"64",X"1A",X"CC",X"64",X"1F",X"3F",X"E1",X"3A",X"F5",X"64",X"E3",X"87",X"1A",X"F5", + X"64",X"1F",X"E1",X"47",X"AF",X"1A",X"CD",X"64",X"3A",X"CD",X"64",X"B8",X"E0",X"09",X"F3",X"64", + X"E3",X"6E",X"C0",X"1A",X"C0",X"50",X"30",X"D8",X"85",X"6F",X"D0",X"0C",X"E1",X"83",X"77",X"D0", + X"14",X"E1",X"81",X"67",X"D0",X"04",X"E1",X"D5",X"16",X"00",X"77",X"1F",X"3F",X"ED",X"52",X"D1", + X"E1",X"CD",X"EB",X"16",X"00",X"77",X"1F",X"3F",X"ED",X"52",X"EB",X"C9",X"E1",X"1A",X"8E",X"64", + X"D5",X"3A",X"8E",X"64",X"67",X"ED",X"88",X"79",X"FE",X"00",X"08",X"F9",X"D1",X"E5",X"EA",X"17", + X"10",X"EE",X"E1",X"1A",X"8E",X"64",X"D5",X"3A",X"8E",X"64",X"67",X"ED",X"88",X"2B",X"79",X"FE", + X"00",X"08",X"F8",X"D1",X"E5",X"EA",X"17",X"10",X"ED",X"E1",X"CD",X"09",X"08",X"00",X"31",X"EB", + X"C9",X"E1",X"09",X"8F",X"64",X"06",X"2F",X"1E",X"00",X"0B",X"10",X"FB",X"E1",X"09",X"F3",X"64", + X"E3",X"FE",X"E3",X"7E",X"E0",X"1A",X"C0",X"50",X"30",X"F8",X"3A",X"00",X"50",X"CE",X"27",X"47", + X"3A",X"40",X"50",X"CE",X"D8",X"98",X"1A",X"3C",X"65",X"E1",X"3A",X"40",X"50",X"47",X"CE",X"27", + X"E3",X"78",X"28",X"02",X"E3",X"CF",X"1A",X"3C",X"65",X"E1",X"F5",X"09",X"42",X"65",X"F5",X"E3", + X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28",X"10",X"E5",X"4B",X"31",X"FD",X"09", + X"51",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"45",X"50",X"F5",X"09",X"75",X"65",X"F5", + X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28",X"10",X"E5",X"4B",X"31",X"FD", + X"09",X"51",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"45",X"50",X"F5",X"09",X"78",X"65", + X"F5",X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28",X"10",X"E5",X"4B",X"31", + X"FD",X"09",X"51",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"45",X"50",X"F5",X"09",X"93", + X"65",X"F5",X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28",X"10",X"E5",X"4B", + X"31",X"FD",X"09",X"56",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"62",X"50",X"F5",X"09", + X"AE",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28",X"10",X"E5", + X"4B",X"31",X"FD",X"09",X"56",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"62",X"50",X"F5", + X"09",X"E1",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28",X"10", + X"E5",X"4B",X"31",X"FD",X"09",X"56",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"62",X"50", + X"F5",X"09",X"CC",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28", + X"10",X"E5",X"4B",X"31",X"FD",X"09",X"73",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"67", + X"50",X"F5",X"09",X"FF",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56", + X"E0",X"E5",X"4B",X"31",X"FD",X"09",X"73",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"67", + X"50",X"E1",X"F5",X"7E",X"03",X"FD",X"5F",X"00",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F", + X"FD",X"5F",X"01",X"F5",X"7E",X"04",X"FD",X"5F",X"02",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3", + X"3F",X"FD",X"5F",X"03",X"F5",X"7E",X"05",X"FD",X"5F",X"04",X"E1",X"E5",X"1F",X"32",X"F5",X"E3", + X"00",X"D6",X"E1",X"F5",X"E3",X"00",X"66",X"C2",X"1F",X"32",X"F5",X"6E",X"01",X"F5",X"4E",X"02", + X"7E",X"E3",X"0F",X"11",X"81",X"31",X"E5",X"B5",X"17",X"0B",X"CD",X"32",X"6F",X"13",X"32",X"4F", + X"E9",X"B3",X"31",X"B7",X"31",X"AD",X"31",X"9E",X"31",X"E4",X"31",X"F1",X"31",X"DB",X"31",X"24", + X"32",X"2E",X"32",X"1E",X"32",X"55",X"32",X"49",X"32",X"6D",X"32",X"C9",X"C3",X"58",X"31",X"C9", + X"7E",X"F5",X"5F",X"03",X"0B",X"7E",X"0B",X"F5",X"5F",X"04",X"C3",X"58",X"31",X"C9",X"7E",X"F5", + X"5F",X"05",X"0B",X"C3",X"58",X"31",X"C9",X"7E",X"F5",X"46",X"03",X"80",X"F5",X"5F",X"03",X"0B", + X"7E",X"0B",X"F5",X"46",X"04",X"A0",X"F5",X"5F",X"04",X"C3",X"58",X"31",X"C9",X"7E",X"F5",X"46", + X"05",X"80",X"F5",X"5F",X"05",X"0B",X"C3",X"58",X"31",X"C9",X"7E",X"F5",X"BE",X"07",X"28",X"23", + X"F5",X"1C",X"07",X"2B",X"F5",X"5D",X"01",X"F5",X"5C",X"02",X"E1",X"F5",X"1E",X"07",X"00",X"0B", + X"C3",X"58",X"31",X"F5",X"6E",X"20",X"F5",X"4E",X"21",X"D1",X"D5",X"2B",X"5A",X"2B",X"5B",X"2B", + X"1E",X"00",X"F5",X"5D",X"20",X"F5",X"5C",X"21",X"C9",X"C3",X"58",X"31",X"D1",X"32",X"F5",X"6E", + X"20",X"F5",X"4E",X"21",X"BE",X"28",X"21",X"1C",X"0B",X"76",X"0B",X"56",X"EB",X"C3",X"58",X"31", + X"0B",X"0B",X"0B",X"F5",X"5D",X"20",X"F5",X"5C",X"21",X"13",X"EB",X"C3",X"58",X"31",X"C9",X"76", + X"0B",X"56",X"EB",X"C3",X"58",X"31",X"C9",X"F5",X"CD",X"F5",X"CD",X"C9",X"D1",X"13",X"1E",X"00", + X"01",X"30",X"00",X"ED",X"98",X"32",X"F5",X"5F",X"01",X"13",X"32",X"F5",X"5F",X"02",X"F5",X"5D", + X"20",X"F5",X"5C",X"21",X"E1",X"C9",X"F5",X"5D",X"01",X"F5",X"5C",X"02",X"F5",X"1E",X"00",X"00", + X"E1",X"C9",X"76",X"0B",X"56",X"EB",X"1E",X"06",X"13",X"EB",X"C3",X"58",X"31",X"C9",X"7E",X"F5", + X"5F",X"06",X"0B",X"C3",X"58",X"31",X"23",X"75",X"65",X"23",X"78",X"65",X"24",X"02",X"01",X"43", + X"00",X"02",X"20",X"05",X"04",X"01",X"54",X"00",X"05",X"04",X"01",X"4B",X"00",X"05",X"04",X"01", + X"85",X"00",X"05",X"04",X"01",X"8F",X"00",X"05",X"04",X"01",X"C7",X"00",X"05",X"04",X"01",X"24", + X"01",X"05",X"04",X"21",X"1E",X"00",X"C3",X"74",X"23",X"42",X"65",X"23",X"78",X"65",X"01",X"D8", + X"00",X"24",X"02",X"06",X"02",X"20",X"05",X"03",X"02",X"00",X"05",X"03",X"07",X"27",X"21",X"29", + X"21",X"3E",X"00",X"E5",X"3B",X"36",X"9D",X"E2",X"D9",X"32",X"36",X"32",X"01",X"75",X"13",X"E5", + X"99",X"15",X"2A",X"90",X"20",X"65",X"06",X"00",X"E5",X"94",X"23",X"42",X"65",X"23",X"75",X"65", + X"01",X"C8",X"00",X"24",X"04",X"02",X"06",X"06",X"01",X"C8",X"00",X"05",X"04",X"01",X"40",X"00", + X"05",X"02",X"04",X"FF",X"07",X"05",X"21",X"20",X"C2",X"AE",X"32",X"2A",X"05",X"00",X"44",X"65", + X"11",X"4E",X"07",X"E5",X"FF",X"25",X"3E",X"01",X"11",X"05",X"00",X"E5",X"23",X"AE",X"65",X"01", + X"FF",X"00",X"24",X"04",X"02",X"20",X"06",X"06",X"03",X"22",X"00",X"05",X"01",X"07",X"06",X"06", + X"03",X"DE",X"FF",X"05",X"01",X"07",X"06",X"04",X"FF",X"07",X"06",X"21",X"1B",X"33",X"09",X"A7", + X"07",X"1E",X"08",X"2A",X"21",X"00",X"44",X"65",X"11",X"93",X"07",X"E5",X"FF",X"25",X"23",X"93", + X"65",X"01",X"80",X"00",X"24",X"05",X"02",X"27",X"06",X"05",X"03",X"03",X"C8",X"00",X"07",X"07", + X"21",X"04",X"FE",X"1A",X"F2",X"75",X"33",X"E5",X"16",X"27",X"C3",X"4E",X"33",X"E5",X"F6",X"15", + X"E5",X"F6",X"15",X"E5",X"F6",X"15",X"01",X"4E",X"07",X"E5",X"03",X"27",X"01",X"4E",X"07",X"E5", + X"23",X"93",X"65",X"23",X"AE",X"65",X"23",X"CC",X"65",X"01",X"80",X"00",X"24",X"04",X"02",X"23", + X"06",X"06",X"03",X"22",X"00",X"05",X"01",X"07",X"06",X"06",X"03",X"DE",X"FF",X"05",X"02",X"07", + X"06",X"04",X"FF",X"07",X"22",X"21",X"44",X"65",X"11",X"A9",X"07",X"E5",X"FF",X"25",X"3E",X"01", + X"11",X"23",X"24",X"02",X"02",X"07",X"01",X"00",X"FF",X"05",X"01",X"03",X"FF",X"88",X"20",X"A9", + X"33",X"11",X"D4",X"04",X"E5",X"18",X"36",X"9D",X"E2",X"C6",X"33",X"2A",X"D4",X"04",X"44",X"65", + X"11",X"BE",X"07",X"E5",X"FF",X"25",X"3E",X"01",X"11",X"D4",X"04",X"E5",X"18",X"36",X"9D",X"C2", + X"D7",X"33",X"09",X"D4",X"23",X"CC",X"65",X"24",X"02",X"01",X"43",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"54",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"4B",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"85",X"00", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"4B",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"54",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"4B",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"85",X"00", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"8F",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"C7",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"8F",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"85",X"00", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"4B",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"85",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"8F",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"C7",X"00", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"8F",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"85",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"4B",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"8F",X"00", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"C7",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"24",X"01",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"50",X"01",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"24",X"01", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"C7",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"8F",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"C7",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"24",X"01", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"05",X"36",X"21",X"05",X"D6",X"01",X"B7", + X"DD",X"E5",X"E2",X"23",X"D6",X"06",X"D6",X"01",X"B7",X"C1",X"60",X"99",X"37",X"D2",X"61",X"35", + X"01",X"48",X"07",X"E5",X"CC",X"33",X"C3",X"8E",X"35",X"E5",X"E2",X"23",X"D6",X"01",X"D6",X"01", + X"B7",X"DD",X"E5",X"E2",X"23",X"D6",X"07",X"D6",X"01",X"B7",X"C1",X"60",X"99",X"37",X"D2",X"B0", + X"35",X"E5",X"D2",X"23",X"CE",X"03",X"FE",X"03",X"C2",X"5C",X"35",X"01",X"4A",X"07",X"E5",X"CC", + X"33",X"C3",X"95",X"35",X"E5",X"D2",X"23",X"CE",X"80",X"FE",X"00",X"E2",X"85",X"35",X"2A",X"D4", + X"04",X"0B",X"0A",X"D4",X"04",X"E5",X"D6",X"23",X"67",X"06",X"00",X"09",X"48",X"05",X"21",X"21", + X"44",X"65",X"E5",X"CC",X"33",X"C3",X"8E",X"35",X"E5",X"E2",X"23",X"FE",X"21",X"C2",X"8E",X"35", + X"01",X"4C",X"07",X"E5",X"CC",X"33",X"C3",X"07",X"35",X"E1",X"69",X"48",X"66",X"0B",X"46",X"32", + X"81",X"6F",X"13",X"32",X"A0",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"85",X"6F",X"13", + X"32",X"A4",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"8D",X"6F",X"13",X"32",X"8C",X"4F", + X"E1",X"44",X"65",X"09",X"00",X"00",X"3E",X"10",X"DD",X"29",X"EB",X"97",X"29",X"EB",X"A5",X"91", + X"6F",X"7C",X"B0",X"4F",X"13",X"D2",X"EA",X"35",X"21",X"33",X"D9",X"3D",X"C2",X"F0",X"35",X"E1", + X"76",X"0B",X"56",X"EB",X"29",X"CD",X"29",X"29",X"C1",X"21",X"E1",X"44",X"65",X"09",X"00",X"00", + X"3E",X"10",X"29",X"EB",X"29",X"EB",X"D2",X"22",X"36",X"21",X"3D",X"C2",X"02",X"36",X"E1",X"77", + X"16",X"00",X"7B",X"95",X"6F",X"7A",X"B4",X"4F",X"E1",X"67",X"06",X"00",X"7B",X"91",X"6F",X"7A", + X"B0",X"4F",X"E1",X"69",X"48",X"66",X"0B",X"46",X"32",X"91",X"6F",X"13",X"32",X"B0",X"4F",X"E1", + X"6F",X"0E",X"00",X"32",X"95",X"6F",X"13",X"32",X"B4",X"4F",X"E1",X"77",X"16",X"00",X"7B",X"96", + X"77",X"7A",X"0B",X"B6",X"57",X"EB",X"E1",X"00",X"04",X"3E",X"7F",X"8E",X"1A",X"CC",X"05",X"01", + X"CB",X"05",X"E5",X"F1",X"21",X"2A",X"62",X"04",X"2B",X"0A",X"62",X"04",X"11",X"01",X"00",X"2A", + X"EB",X"05",X"31",X"0A",X"EB",X"05",X"D2",X"3A",X"36",X"E1",X"E5",X"D9",X"10",X"DD",X"E5",X"4A", + X"15",X"C1",X"60",X"99",X"37",X"D2",X"83",X"36",X"26",X"07",X"E5",X"F2",X"0E",X"09",X"00",X"00", + X"0A",X"43",X"04",X"2A",X"43",X"04",X"7C",X"67",X"3E",X"7F",X"B9",X"D2",X"93",X"36",X"26",X"21", + X"E5",X"F2",X"0E",X"E5",X"BB",X"0E",X"3E",X"00",X"11",X"43",X"04",X"E5",X"1F",X"3D",X"9D",X"C2", + X"8B",X"36",X"E1",X"2A",X"43",X"04",X"44",X"65",X"E5",X"4B",X"1C",X"E5",X"B7",X"2A",X"E1",X"E5", + X"D9",X"10",X"01",X"42",X"04",X"E5",X"11",X"22",X"E1",X"E5",X"D9",X"10",X"01",X"42",X"04",X"E5", + X"FC",X"21",X"E1",X"3A",X"E5",X"05",X"37",X"D2",X"D0",X"36",X"26",X"27",X"E5",X"F2",X"0E",X"E1", + X"3A",X"36",X"05",X"D6",X"00",X"C6",X"FF",X"B7",X"09",X"6F",X"06",X"9E",X"37",X"D2",X"EA",X"36", + X"09",X"36",X"05",X"1E",X"00",X"26",X"0A",X"E5",X"F2",X"0E",X"09",X"BF",X"05",X"1E",X"00",X"E5", + X"3F",X"1C",X"E5",X"FA",X"0C",X"E5",X"CF",X"11",X"37",X"F2",X"2A",X"37",X"E5",X"D9",X"10",X"3A", + X"60",X"04",X"D6",X"00",X"D6",X"01",X"B7",X"DD",X"3A",X"47",X"04",X"CE",X"D9",X"D6",X"00",X"C6", + X"FF",X"B7",X"C1",X"60",X"99",X"37",X"D2",X"09",X"37",X"26",X"70",X"E5",X"F2",X"0E",X"C3",X"2A", + X"37",X"E5",X"BB",X"0E",X"09",X"42",X"04",X"0A",X"C9",X"05",X"2A",X"C9",X"05",X"44",X"65",X"E5", + X"83",X"2A",X"E5",X"65",X"0D",X"E1",X"E5",X"D9",X"10",X"E5",X"1A",X"11",X"01",X"61",X"04",X"E5", + X"02",X"12",X"3A",X"61",X"04",X"FE",X"20",X"C2",X"67",X"37",X"26",X"07",X"E5",X"69",X"19",X"E5", + X"52",X"19",X"FE",X"07",X"E2",X"74",X"37",X"26",X"02",X"E5",X"F2",X"0E",X"2A",X"43",X"04",X"44", + X"65",X"E5",X"B7",X"19",X"2A",X"60",X"04",X"65",X"E5",X"59",X"19",X"3A",X"47",X"04",X"CE",X"FD", + X"1A",X"47",X"04",X"2A",X"47",X"04",X"65",X"E5",X"6D",X"19",X"E5",X"BB",X"0E",X"E1",X"E5",X"DE", + X"10",X"2A",X"62",X"04",X"7C",X"67",X"3E",X"7F",X"B9",X"D2",X"97",X"37",X"26",X"35",X"E5",X"F2", + X"0E",X"09",X"00",X"00",X"0A",X"62",X"04",X"E5",X"2D",X"11",X"3A",X"42",X"04",X"FE",X"05",X"C2", + X"F5",X"37",X"E5",X"4A",X"15",X"09",X"B7",X"00",X"8E",X"37",X"D2",X"D5",X"37",X"2A",X"45",X"04", + X"44",X"65",X"E5",X"DB",X"1A",X"3A",X"47",X"04",X"CE",X"DF",X"DE",X"01",X"1A",X"40",X"52",X"45", + X"71",X"41",X"64",X"50",X"40",X"45",X"52",X"67",X"43",X"53",X"50",X"67",X"54",X"40",X"19",X"40", + X"52",X"45",X"71",X"41",X"64",X"50",X"54",X"61",X"44",X"45",X"52",X"43",X"71",X"41",X"64",X"50", + X"45",X"45",X"52",X"46",X"40",X"66",X"61",X"67",X"43",X"40",X"54",X"52",X"45",X"53",X"66",X"61", + X"52",X"45",X"71",X"41",X"64",X"50",X"40",X"45",X"66",X"67",X"40",X"54",X"43",X"45",X"64",X"45", + X"53",X"52",X"67",X"53",X"52",X"45",X"71",X"41",X"64",X"50",X"40",X"67",X"57",X"54",X"40",X"52", + X"67",X"40",X"45",X"66",X"67",X"40",X"54",X"43",X"45",X"64",X"45",X"53",X"50",X"55",X"40",X"45", + X"66",X"67",X"40",X"52",X"45",X"71",X"41",X"64",X"50",X"50",X"55",X"40",X"67",X"57",X"54",X"40", + X"52",X"45",X"71",X"41",X"64",X"50",X"66",X"61",X"41",X"47",X"41",X"40",X"52",X"45",X"71",X"41", + X"64",X"50",X"40",X"45",X"65",X"41",X"53",X"52",X"45",X"56",X"67",X"40",X"45",X"65",X"41",X"47", + X"52",X"45",X"56",X"67",X"40",X"45",X"65",X"41",X"47",X"40",X"45",X"66",X"67",X"40",X"52",X"45", + X"71",X"41",X"64",X"50",X"45",X"65",X"41",X"46",X"40",X"46",X"67",X"40",X"64",X"64",X"41",X"60", + X"45",X"60",X"54",X"40",X"66",X"61",X"40",X"53",X"61",X"40",X"45",X"52",X"67",X"43",X"53",X"40", + X"52",X"55",X"67",X"71",X"66",X"45",X"54",X"40",X"50",X"67",X"54",X"54",X"43",X"45",X"64",X"45", + X"53",X"40",X"67",X"54",X"40",X"63",X"43",X"61",X"54",X"53",X"71",X"67",X"62",X"40",X"45",X"53", + X"55",X"66",X"67",X"54",X"54",X"55",X"42",X"40",X"45",X"52",X"61",X"46",X"40",X"44",X"66",X"41", + X"40",X"52",X"45",X"54",X"54",X"45",X"64",X"54",X"66",X"61",X"52",X"50",X"40",X"67",X"54",X"45", + X"66",X"44",X"65",X"41",X"64",X"53",X"53",X"45",X"71",X"45",X"1A",X"38",X"39",X"19",X"40",X"40", + X"54",X"60",X"47",X"61",X"52",X"71",X"50",X"67",X"43",X"52",X"41",X"54",X"53",X"60",X"43",X"45", + X"54",X"40",X"70",X"45",X"52",X"54",X"61",X"47",X"61",X"44",X"53",X"54",X"66",X"45",X"53",X"45", + X"52",X"50",X"40",X"40",X"41",X"64",X"67",X"77",X"63",X"43",X"67",X"52",X"45",X"64",X"42",X"41", + X"54",X"40",X"45",X"43",X"66",X"41",X"56",X"44",X"41",X"40",X"45",X"52",X"67",X"43",X"53",X"18", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"1D",X"18",X"1D",X"18",X"1D",X"18",X"1D",X"18", + X"1A",X"1D",X"1F",X"18",X"1A",X"1D",X"1F",X"19",X"19",X"19",X"19",X"1A",X"1A",X"1A",X"1A",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"18", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"19", + X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"38",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"19",X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"38",X"45", + X"52",X"67",X"43",X"53",X"40",X"45",X"56",X"61",X"64",X"41",X"40",X"71",X"41",X"54",X"53",X"44", + X"66",X"67",X"43",X"45",X"53",X"40",X"52",X"45",X"50",X"40",X"53",X"54",X"66",X"61",X"67",X"50", + X"40",X"18",X"1D",X"40",X"40",X"71",X"41",X"64",X"50",X"40",X"19",X"40",X"53",X"66",X"61",X"67", + X"43",X"40",X"1A",X"53",X"71",X"41",X"64",X"50",X"40",X"1A",X"40",X"40",X"66",X"61",X"67",X"43", + X"40",X"19",X"40",X"71",X"41",X"64",X"50",X"40",X"19",X"40",X"40",X"66",X"61",X"67",X"43",X"40", + X"19",X"53",X"54",X"66",X"61",X"67",X"50",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"71", + X"52",X"45",X"56",X"45",X"40",X"53",X"55",X"66",X"67",X"42",X"18",X"18",X"18",X"1D",X"1A",X"19", + X"18",X"18",X"18",X"18",X"18",X"19",X"18",X"18",X"18",X"1D",X"1F",X"18",X"18",X"18",X"18",X"1D", + X"53",X"43",X"61",X"54",X"53",X"67",X"66",X"47",X"41",X"61",X"44",X"66",X"67",X"61",X"54",X"61", + X"44",X"66",X"67",X"43",X"40",X"40",X"66",X"67",X"61",X"54",X"41",X"43",X"67",X"64",X"40",X"40", + X"65",X"67",X"52",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"44",X"1F", + X"40",X"40",X"40",X"40",X"40",X"40",X"19",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"46",X"1F",X"40",X"40",X"40",X"40",X"40",X"40",X"1A",X"44",X"67",X"67",X"47",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"60",X"1F",X"40",X"40",X"40",X"40",X"40",X"40",X"1B",X"44", + X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"62",X"1F",X"40",X"40",X"40",X"40", + X"40",X"40",X"1C",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"60",X"1C", + X"40",X"40",X"40",X"40",X"40",X"40",X"19",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"64",X"1C",X"40",X"40",X"40",X"40",X"40",X"40",X"1A",X"44",X"67",X"67",X"47",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"62",X"1C",X"40",X"40",X"40",X"40",X"40",X"40",X"1B",X"44", + X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"65",X"1C",X"40",X"40",X"40",X"40", + X"40",X"40",X"1C",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"63",X"1C", + X"40",X"40",X"40",X"40",X"40",X"40",X"1D",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"66",X"1C",X"40",X"40",X"40",X"40",X"40",X"40",X"1E",X"44",X"41",X"42",X"40",X"66", + X"67",X"61",X"54",X"61",X"44",X"66",X"67",X"43",X"40",X"40",X"66",X"67",X"61",X"54",X"41",X"43", + X"67",X"64",X"40",X"40",X"65",X"41",X"52",X"00",X"50",X"12",X"00",X"00",X"00",X"0D",X"00",X"00", + X"50",X"1F",X"00",X"00",X"00",X"50",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"08",X"00",X"00", + X"00",X"18",X"00",X"00",X"00",X"40",X"00",X"00",X"50",X"07",X"00",X"00",X"00",X"15",X"00",X"00", + X"50",X"0A",X"00",X"00",X"00",X"18",X"00",X"00",X"00",X"05",X"00",X"00",X"00",X"10",X"00",X"00", + X"00",X"15",X"00",X"00",X"00",X"08",X"00",X"05",X"04",X"03",X"02",X"00",X"01",X"02",X"03",X"04", + X"05",X"06",X"07",X"20",X"21",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"60",X"61",X"62",X"63", + X"64",X"65",X"66",X"67",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"70",X"71",X"72",X"72", + X"71",X"70",X"57",X"56",X"55",X"54",X"53",X"52",X"51",X"50",X"67",X"66",X"65",X"64",X"63",X"62", + X"61",X"60",X"47",X"46",X"45",X"44",X"43",X"42",X"41",X"00",X"01",X"04",X"02",X"64",X"52",X"53", + X"40",X"4D",X"02",X"65",X"43",X"53",X"80",X"11",X"02",X"62",X"65",X"53",X"08",X"4B",X"01",X"42", + X"67",X"40",X"80",X"31",X"01",X"62",X"53",X"40",X"18",X"96",X"00",X"62",X"46",X"53",X"48",X"82", + X"00",X"46",X"53",X"65",X"50",X"5F",X"00",X"43",X"53",X"65",X"10",X"5C",X"00",X"43",X"44",X"40", + X"58",X"68",X"00",X"60",X"44",X"43",X"90",X"52",X"00",X"94",X"42",X"95",X"42",X"96",X"42",X"97", + X"42",X"B0",X"42",X"B1",X"42",X"B2",X"42",X"B3",X"42",X"B4",X"42",X"B5",X"42",X"03",X"02",X"01", + X"00",X"00",X"80",X"48",X"40",X"E5",X"17",X"0C",X"E1",X"E5",X"36",X"0C",X"E1",X"E5",X"9B",X"0C", + X"E1",X"E5",X"9C",X"0C",X"E1",X"E5",X"C0",X"0C",X"E1",X"E5",X"32",X"0D",X"E1",X"E5",X"72",X"2C", + X"E1",X"E5",X"0F",X"3A",X"E1",X"E5",X"28",X"3A",X"E1",X"E5",X"29",X"3A",X"E1",X"E5",X"3C",X"3A", + X"E1",X"E5",X"3D",X"3A",X"E1",X"E5",X"50",X"3A",X"E1",X"E5",X"51",X"3A",X"E1",X"E5",X"7B",X"3A", + X"E1",X"E5",X"8D",X"3A",X"E1",X"00",X"FF",X"09",X"6A",X"0C",X"0A",X"62",X"67",X"E1",X"3E",X"10", + X"1A",X"D0",X"64",X"3E",X"08",X"1A",X"60",X"67",X"3A",X"61",X"67",X"FE",X"06",X"C2",X"AC",X"0C", + X"AF",X"1A",X"61",X"67",X"3A",X"3C",X"65",X"EE",X"10",X"1A",X"3C",X"65",X"2A",X"62",X"67",X"7E", + X"FE",X"00",X"28",X"26",X"0B",X"46",X"3A",X"D2",X"64",X"B8",X"28",X"14",X"2B",X"0A",X"62",X"67", + X"30",X"17",X"0B",X"46",X"3A",X"D3",X"64",X"B8",X"28",X"06",X"2B",X"0A",X"62",X"67",X"30",X"21", + X"0B",X"7E",X"1A",X"3C",X"65",X"0B",X"0A",X"62",X"67",X"E1",X"01",X"6B",X"26",X"00",X"14",X"23", + X"01",X"EB",X"07",X"00",X"9C",X"25",X"01",X"D3",X"07",X"00",X"E4",X"25",X"01",X"BB",X"07",X"00", + X"FC",X"25",X"01",X"53",X"26",X"00",X"E4",X"25",X"01",X"3B",X"26",X"00",X"9C",X"25",X"01",X"0B", + X"26",X"00",X"44",X"23",X"01",X"53",X"26",X"00",X"14",X"23",X"01",X"BB",X"07",X"00",X"44",X"23", + X"01",X"D3",X"07",X"00",X"FC",X"25",X"01",X"8B",X"26",X"00",X"74",X"25",X"3C",X"1A",X"61",X"67", + X"C3",X"3C",X"0C",X"E1",X"09",X"51",X"66",X"0A",X"C9",X"66",X"09",X"CE",X"66",X"0A",X"1E",X"67", + X"09",X"DA",X"1F",X"11",X"51",X"66",X"01",X"60",X"00",X"ED",X"98",X"09",X"DA",X"1F",X"11",X"B1", + X"66",X"01",X"60",X"00",X"ED",X"98",X"AF",X"1A",X"3C",X"67",X"1A",X"3D",X"67",X"1A",X"3E",X"67", + X"3A",X"34",X"66",X"E3",X"A7",X"1A",X"34",X"66",X"3E",X"31",X"1A",X"38",X"67",X"1A",X"39",X"67", + X"1A",X"3A",X"67",X"1A",X"3B",X"67",X"AF",X"1A",X"3F",X"67",X"1A",X"CB",X"66",X"09",X"11",X"39", + X"11",X"CE",X"66",X"01",X"28",X"00",X"ED",X"98",X"09",X"11",X"39",X"11",X"26",X"67",X"01",X"28", + X"00",X"ED",X"98",X"09",X"51",X"66",X"0A",X"C9",X"66",X"E1",X"09",X"8F",X"0D",X"11",X"8F",X"64", + X"01",X"18",X"00",X"ED",X"98",X"3A",X"3E",X"67",X"FE",X"02",X"18",X"04",X"AF",X"1A",X"BA",X"64", + X"09",X"2F",X"66",X"11",X"18",X"66",X"01",X"17",X"00",X"1E",X"00",X"ED",X"98",X"09",X"39",X"39", + X"0A",X"37",X"66",X"09",X"94",X"39",X"0A",X"09",X"66",X"09",X"FB",X"39",X"0A",X"0B",X"66",X"09", + X"13",X"3A",X"0A",X"0D",X"66",X"3E",X"80",X"1A",X"2D",X"66",X"3E",X"08",X"1A",X"67",X"66",X"3E", + X"40",X"1A",X"06",X"64",X"1A",X"26",X"64",X"1A",X"16",X"64",X"1A",X"36",X"64",X"1A",X"0E",X"64", + X"1A",X"2E",X"64",X"1A",X"1E",X"64",X"1A",X"3E",X"64",X"1A",X"46",X"64",X"1A",X"66",X"64",X"3E", + X"48",X"1A",X"05",X"64",X"1A",X"25",X"64",X"1A",X"15",X"64",X"1A",X"35",X"64",X"1A",X"0D",X"64", + X"1A",X"2D",X"64",X"1A",X"1D",X"64",X"1A",X"3D",X"64",X"1A",X"45",X"64",X"1A",X"65",X"64",X"09", + X"2C",X"01",X"0A",X"46",X"67",X"30",X"18",X"03",X"00",X"00",X"0B",X"44",X"14",X"21",X"23",X"03", + X"00",X"00",X"0B",X"B4",X"14",X"21",X"23",X"04",X"00",X"00",X"87",X"14",X"14",X"21",X"F9",X"03", + X"00",X"00",X"EB",X"44",X"14",X"21",X"00",X"03",X"00",X"00",X"EB",X"B4",X"14",X"21",X"00",X"05", + X"00",X"00",X"87",X"FC",X"0D",X"14",X"D8",X"3E",X"40",X"E5",X"CD",X"16",X"11",X"82",X"40",X"09", + X"5D",X"2B",X"3E",X"34",X"06",X"02",X"E5",X"BD",X"17",X"11",X"CA",X"40",X"09",X"5D",X"2B",X"3E", + X"34",X"06",X"02",X"E5",X"BD",X"17",X"11",X"42",X"41",X"09",X"5D",X"2B",X"3E",X"34",X"06",X"02", + X"E5",X"BD",X"17",X"11",X"8A",X"41",X"09",X"F5",X"2B",X"3E",X"34",X"06",X"01",X"E5",X"BD",X"17", + X"11",X"C2",X"41",X"09",X"F9",X"2B",X"3E",X"34",X"06",X"01",X"E5",X"BD",X"17",X"11",X"CA",X"41", + X"09",X"F9",X"2B",X"3E",X"34",X"06",X"01",X"E5",X"BD",X"17",X"11",X"02",X"42",X"09",X"F9",X"2B", + X"3E",X"34",X"06",X"01",X"E5",X"BD",X"17",X"11",X"0A",X"42",X"09",X"F9",X"2B",X"3E",X"34",X"06", + X"01",X"E5",X"BD",X"17",X"11",X"42",X"42",X"09",X"15",X"2C",X"3E",X"34",X"06",X"01",X"E5",X"BD", + X"17",X"11",X"82",X"42",X"09",X"5D",X"2B",X"3E",X"34",X"06",X"02",X"E5",X"BD",X"17",X"11",X"CA", + X"42",X"09",X"5D",X"2B",X"3E",X"34",X"06",X"02",X"E5",X"BD",X"17",X"11",X"42",X"43",X"09",X"5D", + X"2B",X"3E",X"34",X"06",X"02",X"E5",X"BD",X"17",X"11",X"20",X"41",X"09",X"AD",X"2B",X"3E",X"10", + X"06",X"03",X"E5",X"BD",X"17",X"11",X"A8",X"42",X"09",X"AD",X"2B",X"3E",X"10",X"06",X"03",X"E5", + X"BD",X"17",X"11",X"41",X"40",X"09",X"19",X"2C",X"3E",X"36",X"06",X"01",X"E5",X"D3",X"17",X"11", + X"7F",X"40",X"09",X"1A",X"2C",X"3E",X"01",X"06",X"32",X"E5",X"D3",X"17",X"11",X"89",X"43",X"09", + X"1B",X"2C",X"3E",X"36",X"06",X"01",X"E5",X"D3",X"17",X"11",X"48",X"40",X"09",X"1C",X"2C",X"3E", + X"01",X"06",X"32",X"E5",X"D3",X"17",X"3E",X"24",X"1A",X"40",X"40",X"3E",X"22",X"1A",X"77",X"40", + X"3E",X"23",X"1A",X"BF",X"43",X"3E",X"25",X"1A",X"88",X"43",X"AF",X"1A",X"3F",X"67",X"1A",X"CB", + X"66",X"1A",X"50",X"66",X"3A",X"3E",X"67",X"09",X"DC",X"0E",X"E3",X"0F",X"E5",X"B0",X"17",X"76", + X"0B",X"56",X"EB",X"E9",X"04",X"0F",X"5A",X"0F",X"C8",X"0F",X"45",X"28",X"AA",X"28",X"27",X"29", + X"5C",X"29",X"F1",X"29",X"09",X"00",X"01",X"0A",X"47",X"66",X"09",X"00",X"05",X"0A",X"65",X"66", + X"3E",X"05",X"E5",X"DD",X"16",X"3E",X"12",X"1A",X"CD",X"66",X"3E",X"C2",X"1A",X"CC",X"66",X"3E", + X"01",X"1A",X"A8",X"64",X"3E",X"03",X"1A",X"98",X"64",X"3E",X"05",X"1A",X"B8",X"64",X"3E",X"07", + X"1A",X"C0",X"64",X"3E",X"21",X"1A",X"E0",X"64",X"3E",X"FF",X"1A",X"45",X"67",X"3E",X"18",X"1A", + X"60",X"67",X"AF",X"1A",X"BA",X"64",X"09",X"34",X"66",X"E3",X"A6",X"09",X"39",X"66",X"E3",X"C6", + X"11",X"E7",X"41",X"09",X"6C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"BD",X"17",X"11",X"E7",X"45", + X"09",X"5C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E",X"01",X"1A",X"2F",X"46",X"C3", + X"3B",X"2A",X"09",X"00",X"02",X"0A",X"47",X"66",X"09",X"50",X"07",X"0A",X"65",X"66",X"3E",X"01", + X"E5",X"DD",X"16",X"3E",X"12",X"1A",X"CD",X"66",X"3E",X"0D",X"1A",X"CC",X"66",X"3E",X"02",X"1A", + X"A8",X"64",X"3E",X"04",X"1A",X"98",X"64",X"3E",X"06",X"1A",X"B8",X"64",X"3E",X"20",X"1A",X"C0", + X"64",X"3E",X"22",X"1A",X"E0",X"64",X"3E",X"EF",X"1A",X"45",X"67",X"3E",X"15",X"1A",X"60",X"67", + X"AF",X"1A",X"BA",X"64",X"09",X"34",X"66",X"E3",X"A6",X"09",X"39",X"66",X"E3",X"C6",X"11",X"E7", + X"41",X"09",X"6C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"BD",X"17",X"11",X"E7",X"45",X"09",X"5C", + X"2B",X"3E",X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E",X"01",X"1A",X"27",X"46",X"C3",X"3B",X"2A", + X"09",X"00",X"03",X"0A",X"47",X"66",X"09",X"00",X"10",X"0A",X"65",X"66",X"3E",X"10",X"E5",X"DD", + X"16",X"3E",X"12",X"1A",X"CD",X"66",X"3E",X"0A",X"1A",X"CC",X"66",X"3E",X"03",X"1A",X"A8",X"64", + X"3E",X"05",X"1A",X"98",X"64",X"3E",X"07",X"1A",X"B8",X"64",X"3E",X"21",X"1A",X"C0",X"64",X"3E", + X"23",X"1A",X"E0",X"64",X"3E",X"F7",X"1A",X"45",X"67",X"3E",X"08",X"1A",X"60",X"67",X"09",X"34", + X"66",X"E3",X"E6",X"11",X"E7",X"41",X"09",X"6C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"BD",X"17", + X"11",X"E7",X"45",X"09",X"5C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E",X"01",X"1A", + X"EF",X"45",X"C3",X"3B",X"2A",X"09",X"00",X"04",X"0A",X"47",X"66",X"09",X"50",X"12",X"0A",X"65", + X"66",X"3E",X"35",X"E5",X"DD",X"16",X"3E",X"12",X"1A",X"CD",X"66",X"3E",X"28",X"1A",X"CC",X"66", + X"3E",X"04",X"1A",X"A8",X"64",X"3E",X"06",X"1A",X"98",X"64",X"3E",X"20",X"1A",X"B8",X"64",X"3E", + X"22",X"1A",X"C0",X"64",X"3E",X"24",X"1A",X"E0",X"64",X"3E",X"E7",X"1A",X"45",X"67",X"3E",X"10", + X"1A",X"60",X"67",X"09",X"34",X"66",X"E3",X"E6",X"11",X"E7",X"41",X"09",X"6C",X"2B",X"3E",X"02", + X"06",X"04",X"E5",X"BD",X"17",X"11",X"E7",X"45",X"09",X"5C",X"2B",X"3E",X"02",X"06",X"04",X"E5", + X"D3",X"17",X"3E",X"01",X"1A",X"E7",X"45",X"C3",X"3B",X"2A",X"09",X"00",X"05",X"0A",X"47",X"66", + X"09",X"00",X"15",X"0A",X"65",X"66",X"3E",X"21",X"E5",X"DD",X"16",X"3E",X"32",X"1A",X"CD",X"66", + X"3E",X"37",X"1A",X"CC",X"66",X"3E",X"05",X"1A",X"A8",X"64",X"3E",X"07",X"1A",X"98",X"64",X"3E", + X"21",X"1A",X"B8",X"64",X"3E",X"23",X"1A",X"C0",X"64",X"3E",X"25",X"1A",X"E0",X"64",X"3E",X"BF", + X"1A",X"45",X"67",X"3E",X"06",X"1A",X"60",X"67",X"09",X"34",X"66",X"E3",X"E6",X"11",X"E7",X"41", + X"09",X"6C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"BD",X"17",X"11",X"E7",X"45",X"09",X"5C",X"2B", + X"3E",X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E",X"01",X"1A",X"18",X"46",X"C3",X"3B",X"2A",X"09", + X"00",X"06",X"0A",X"47",X"66",X"09",X"50",X"17",X"0A",X"65",X"66",X"3E",X"01",X"E5",X"DD",X"16", + X"3E",X"32",X"1A",X"CD",X"66",X"3E",X"34",X"1A",X"CC",X"66",X"3E",X"06",X"1A",X"A8",X"64",X"3E", + X"20",X"1A",X"98",X"64",X"3E",X"22",X"1A",X"B8",X"64",X"3E",X"24",X"1A",X"C0",X"64",X"3E",X"26", + X"1A",X"E0",X"64",X"3E",X"BF",X"1A",X"45",X"67",X"3E",X"01",X"1A",X"60",X"67",X"09",X"34",X"66", + X"E3",X"E6",X"11",X"E7",X"41",X"09",X"6C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"BD",X"17",X"11", + X"E7",X"45",X"09",X"5C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E",X"01",X"1A",X"10", + X"46",X"C3",X"3B",X"2A",X"09",X"00",X"07",X"0A",X"47",X"66",X"09",X"00",X"08",X"0A",X"65",X"66", + X"3E",X"05",X"E5",X"DD",X"16",X"3E",X"21",X"1A",X"CD",X"66",X"3E",X"31",X"1A",X"CC",X"66",X"3E", + X"07",X"1A",X"A8",X"64",X"3E",X"21",X"1A",X"98",X"64",X"3E",X"23",X"1A",X"B8",X"64",X"3E",X"25", + X"1A",X"C0",X"64",X"3E",X"27",X"1A",X"E0",X"64",X"3E",X"BF",X"1A",X"45",X"67",X"3E",X"01",X"1A", + X"60",X"67",X"09",X"34",X"66",X"E3",X"E6",X"11",X"E7",X"41",X"09",X"6C",X"2B",X"3E",X"02",X"06", + X"04",X"E5",X"BD",X"17",X"11",X"E7",X"45",X"09",X"5C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"D3", + X"17",X"3E",X"01",X"1A",X"D8",X"45",X"C3",X"3B",X"2A",X"09",X"00",X"20",X"0A",X"47",X"66",X"09", + X"50",X"0A",X"0A",X"65",X"66",X"3E",X"10",X"E5",X"DD",X"16",X"3E",X"37",X"1A",X"CD",X"66",X"3E", + X"2B",X"1A",X"CC",X"66",X"3E",X"20",X"1A",X"A8",X"64",X"3E",X"22",X"1A",X"98",X"64",X"3E",X"24", + X"1A",X"B8",X"64",X"3E",X"26",X"1A",X"C0",X"64",X"3E",X"10",X"1A",X"E0",X"64",X"3E",X"BF",X"1A", + X"45",X"67",X"3E",X"01",X"1A",X"60",X"67",X"09",X"34",X"66",X"E3",X"E6",X"11",X"E7",X"41",X"09", + X"6C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"BD",X"17",X"11",X"E7",X"45",X"09",X"5C",X"2B",X"3E", + X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E",X"01",X"1A",X"D0",X"45",X"11",X"49",X"44",X"09",X"CD", + X"66",X"3E",X"36",X"06",X"01",X"E5",X"D3",X"17",X"11",X"C1",X"44",X"09",X"CD",X"66",X"3E",X"36", + X"06",X"01",X"E5",X"D3",X"17",X"11",X"09",X"45",X"09",X"CD",X"66",X"3E",X"07",X"06",X"01",X"E5", + X"D3",X"17",X"11",X"2D",X"45",X"09",X"CD",X"66",X"3E",X"06",X"06",X"01",X"E5",X"D3",X"17",X"11", + X"38",X"45",X"09",X"CD",X"66",X"3E",X"07",X"06",X"01",X"E5",X"D3",X"17",X"11",X"81",X"45",X"09", + X"CD",X"66",X"3E",X"36",X"06",X"01",X"E5",X"D3",X"17",X"11",X"49",X"46",X"09",X"CD",X"66",X"3E", + X"36",X"06",X"01",X"E5",X"D3",X"17",X"11",X"C1",X"46",X"09",X"CD",X"66",X"3E",X"07",X"06",X"01", + X"E5",X"D3",X"17",X"11",X"E5",X"46",X"09",X"CD",X"66",X"3E",X"06",X"06",X"01",X"E5",X"D3",X"17", + X"11",X"F0",X"46",X"09",X"CD",X"66",X"3E",X"07",X"06",X"01",X"E5",X"D3",X"17",X"11",X"09",X"47", + X"09",X"CD",X"66",X"3E",X"36",X"06",X"01",X"E5",X"D3",X"17",X"11",X"81",X"47",X"09",X"CD",X"66", + X"3E",X"36",X"06",X"01",X"E5",X"D3",X"17",X"11",X"49",X"44",X"09",X"CD",X"66",X"3E",X"01",X"06", + X"32",X"E5",X"D3",X"17",X"11",X"84",X"45",X"09",X"CD",X"66",X"3E",X"01",X"06",X"20",X"E5",X"D3", + X"17",X"11",X"4F",X"44",X"09",X"CD",X"66",X"3E",X"01",X"06",X"32",X"E5",X"D3",X"17",X"11",X"6A", + X"44",X"09",X"CD",X"66",X"3E",X"01",X"06",X"32",X"E5",X"D3",X"17",X"11",X"6D",X"44",X"09",X"CD", + X"66",X"3E",X"01",X"06",X"32",X"E5",X"D3",X"17",X"11",X"5A",X"44",X"09",X"CD",X"66",X"3E",X"01", + X"06",X"32",X"E5",X"D3",X"17",X"11",X"5D",X"44",X"09",X"CD",X"66",X"3E",X"01",X"06",X"32",X"E5", + X"D3",X"17",X"11",X"78",X"44",X"09",X"CD",X"66",X"3E",X"01",X"06",X"32",X"E5",X"D3",X"17",X"11", + X"B3",X"45",X"09",X"CD",X"66",X"3E",X"01",X"06",X"20",X"E5",X"D3",X"17",X"11",X"7E",X"44",X"09", + X"CD",X"66",X"3E",X"01",X"06",X"32",X"E5",X"D3",X"17",X"3A",X"CC",X"66",X"1A",X"38",X"67",X"1A", + X"39",X"67",X"1A",X"3A",X"67",X"1A",X"3B",X"67",X"E5",X"55",X"1D",X"E1",X"04",X"20",X"03",X"07", + X"02",X"06",X"01",X"05",X"21",X"23",X"11",X"11",X"11",X"25",X"40",X"23",X"25",X"40",X"23",X"25", + X"40",X"23",X"11",X"11",X"25",X"40",X"23",X"25",X"40",X"23",X"25",X"40",X"23",X"11",X"11",X"11", + X"25",X"22",X"10",X"10",X"10",X"24",X"40",X"22",X"24",X"40",X"22",X"24",X"40",X"22",X"10",X"10", + X"24",X"40",X"22",X"24",X"40",X"22",X"24",X"40",X"22",X"10",X"10",X"10",X"24",X"26",X"27",X"40", + X"26",X"27",X"40",X"22",X"10",X"10",X"24",X"40",X"26",X"27",X"40",X"26",X"27",X"26",X"27",X"40", + X"26",X"27",X"40",X"40",X"40",X"40",X"40",X"40",X"26",X"27",X"40",X"26",X"27",X"26",X"27",X"40", + X"26",X"27",X"40",X"23",X"11",X"11",X"25",X"40",X"26",X"27",X"40",X"26",X"27",X"23",X"25",X"40", + X"23",X"25",X"40",X"23",X"25",X"40",X"23",X"25",X"40",X"23",X"11",X"11",X"25",X"40",X"23",X"25", + X"40",X"23",X"25",X"40",X"23",X"25",X"40",X"23",X"25",X"26",X"27",X"40",X"26",X"27",X"40",X"26", + X"27",X"40",X"26",X"27",X"40",X"26",X"27",X"26",X"27",X"40",X"26",X"27",X"40",X"26",X"27",X"40", + X"26",X"27",X"40",X"26",X"27",X"22",X"24",X"40",X"22",X"24",X"40",X"22",X"24",X"40",X"22",X"24", + X"40",X"22",X"10",X"10",X"24",X"40",X"22",X"24",X"40",X"22",X"24",X"40",X"22",X"24",X"40",X"22", + X"24",X"10",X"26",X"11",X"27",X"45",X"71",X"45",X"53",X"2C",X"43",X"67",X"50",X"71",X"52",X"61", + X"47",X"60",X"54",X"08",X"19",X"39",X"38",X"1A",X"44",X"61",X"47",X"61",X"54",X"52",X"45",X"70", + X"08",X"54",X"45",X"43",X"60",X"53",X"54",X"41",X"52",X"4D",X"09",X"45",X"66",X"E3",X"46",X"C2", + X"D9",X"19",X"09",X"00",X"00",X"0A",X"61",X"66",X"09",X"E7",X"64",X"0A",X"D7",X"64",X"F5",X"09", + X"E7",X"64",X"F5",X"7E",X"07",X"FE",X"80",X"D2",X"CC",X"2C",X"2A",X"0B",X"66",X"E3",X"0F",X"E5", + X"B0",X"17",X"0A",X"0F",X"66",X"3A",X"3C",X"65",X"CE",X"27",X"47",X"FE",X"27",X"28",X"0B",X"3E", + X"10",X"1A",X"D0",X"64",X"78",X"E3",X"47",X"08",X"0A",X"2A",X"0F",X"66",X"46",X"F5",X"7E",X"04", + X"B8",X"E2",X"66",X"2D",X"F5",X"1E",X"00",X"02",X"F5",X"1E",X"05",X"35",X"E5",X"21",X"27",X"C3", + X"66",X"2D",X"F5",X"7E",X"00",X"FE",X"03",X"28",X"06",X"30",X"F6",X"E3",X"77",X"08",X"32",X"2A", + X"0F",X"66",X"0B",X"46",X"F5",X"7E",X"04",X"B8",X"E2",X"66",X"2D",X"F5",X"1E",X"00",X"03",X"F5", + X"1E",X"05",X"09",X"E5",X"21",X"27",X"C3",X"66",X"2D",X"F5",X"46",X"04",X"E5",X"81",X"1A",X"18", + X"D1",X"C3",X"6E",X"2C",X"CE",X"27",X"2A",X"0D",X"66",X"E3",X"0F",X"E5",X"B0",X"17",X"0A",X"0F", + X"66",X"3A",X"3C",X"65",X"CE",X"27",X"47",X"FE",X"27",X"28",X"0B",X"3E",X"10",X"1A",X"D0",X"64", + X"78",X"E3",X"67",X"08",X"0A",X"2A",X"0F",X"66",X"46",X"F5",X"7E",X"03",X"B8",X"E2",X"66",X"2D", + X"F5",X"1E",X"00",X"05",X"F5",X"1E",X"05",X"31",X"E5",X"21",X"27",X"C3",X"66",X"2D",X"F5",X"7E", + X"00",X"FE",X"04",X"28",X"06",X"30",X"F6",X"E3",X"57",X"08",X"30",X"2A",X"0F",X"66",X"0B",X"46", + X"F5",X"7E",X"03",X"B8",X"28",X"30",X"F5",X"1E",X"00",X"04",X"F5",X"1E",X"05",X"33",X"E5",X"21", + X"27",X"30",X"23",X"F5",X"46",X"03",X"E5",X"81",X"1A",X"18",X"D3",X"C3",X"6E",X"2C",X"3E",X"DB", + X"F5",X"46",X"03",X"90",X"1A",X"43",X"66",X"F5",X"7E",X"04",X"D6",X"24",X"1A",X"44",X"66",X"09", + X"E7",X"64",X"0A",X"35",X"66",X"09",X"8F",X"0D",X"F5",X"09",X"8F",X"64",X"FD",X"09",X"2F",X"66", + X"FD",X"E3",X"02",X"46",X"28",X"25",X"11",X"40",X"67",X"E5",X"E8",X"1A",X"09",X"33",X"66",X"E3", + X"86",X"30",X"32",X"09",X"8F",X"64",X"0A",X"D7",X"64",X"E5",X"79",X"1D",X"3E",X"DB",X"F5",X"46", + X"03",X"90",X"1A",X"2F",X"66",X"F5",X"7E",X"04",X"D6",X"24",X"1A",X"18",X"66",X"09",X"19",X"66", + X"F5",X"09",X"28",X"64",X"FD",X"09",X"8F",X"64",X"E5",X"79",X"1B",X"09",X"AF",X"0D",X"F5",X"09", + X"AF",X"64",X"FD",X"09",X"1B",X"66",X"FD",X"E3",X"02",X"46",X"28",X"25",X"11",X"41",X"67",X"E5", + X"E8",X"1A",X"09",X"33",X"66",X"E3",X"86",X"30",X"32",X"09",X"AF",X"64",X"0A",X"D7",X"64",X"E5", + X"79",X"1D",X"3E",X"DB",X"F5",X"46",X"03",X"90",X"1A",X"1B",X"66",X"F5",X"7E",X"04",X"D6",X"24", + X"1A",X"1C",X"66",X"09",X"1D",X"66",X"F5",X"09",X"18",X"64",X"FD",X"09",X"AF",X"64",X"E5",X"79", + X"1B",X"3A",X"34",X"66",X"E3",X"67",X"28",X"46",X"09",X"9F",X"0D",X"F5",X"09",X"9F",X"64",X"FD", + X"09",X"1F",X"66",X"FD",X"E3",X"02",X"46",X"28",X"25",X"11",X"42",X"67",X"E5",X"E8",X"1A",X"09", + X"33",X"66",X"E3",X"86",X"30",X"32",X"09",X"9F",X"64",X"0A",X"D7",X"64",X"E5",X"79",X"1D",X"3E", + X"DB",X"F5",X"46",X"03",X"90",X"1A",X"1F",X"66",X"F5",X"7E",X"04",X"D6",X"24",X"1A",X"38",X"66", + X"09",X"39",X"66",X"F5",X"09",X"38",X"64",X"FD",X"09",X"9F",X"64",X"E5",X"79",X"1B",X"09",X"BF", + X"0D",X"F5",X"09",X"BF",X"64",X"FD",X"09",X"3B",X"66",X"FD",X"E3",X"02",X"46",X"28",X"25",X"11", + X"43",X"67",X"E5",X"E8",X"1A",X"09",X"33",X"66",X"E3",X"86",X"30",X"32",X"09",X"BF",X"64",X"0A", + X"D7",X"64",X"E5",X"79",X"1D",X"3E",X"DB",X"F5",X"46",X"03",X"90",X"1A",X"3B",X"66",X"F5",X"7E", + X"04",X"D6",X"24",X"1A",X"3C",X"66",X"09",X"3D",X"66",X"F5",X"09",X"40",X"64",X"FD",X"09",X"BF", + X"64",X"E5",X"79",X"1B",X"09",X"C7",X"0D",X"F5",X"09",X"C7",X"64",X"FD",X"09",X"3F",X"66",X"FD", + X"E3",X"02",X"46",X"28",X"25",X"11",X"44",X"67",X"E5",X"E8",X"1A",X"09",X"33",X"66",X"E3",X"86", + X"30",X"32",X"09",X"C7",X"64",X"0A",X"D7",X"64",X"E5",X"79",X"1D",X"3E",X"DB",X"F5",X"46",X"03", + X"90",X"1A",X"3F",X"66",X"F5",X"7E",X"04",X"D6",X"24",X"1A",X"40",X"66",X"09",X"41",X"66",X"F5", + X"09",X"60",X"64",X"FD",X"09",X"C7",X"64",X"E5",X"79",X"1B",X"09",X"33",X"66",X"E3",X"56",X"C2", + X"38",X"18",X"3A",X"3C",X"65",X"E3",X"4F",X"C2",X"9F",X"2F",X"F5",X"09",X"00",X"64",X"F5",X"E3", + X"06",X"7E",X"28",X"17",X"F5",X"09",X"20",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"25",X"F5",X"09", + X"10",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"03",X"C3",X"9F",X"2F",X"F5",X"E3",X"06",X"FE",X"E3", + X"D6",X"3A",X"E7",X"64",X"F5",X"5F",X"00",X"3A",X"2D",X"66",X"F5",X"5F",X"01",X"3A",X"E7",X"64", + X"FE",X"02",X"28",X"26",X"FE",X"03",X"28",X"0F",X"3A",X"44",X"66",X"CE",X"F8",X"F5",X"5F",X"03", + X"30",X"3B",X"3A",X"44",X"66",X"CE",X"F8",X"F5",X"5F",X"03",X"3A",X"D6",X"64",X"CE",X"27",X"E3", + X"0F",X"2A",X"0B",X"66",X"E5",X"B0",X"17",X"7E",X"D6",X"24",X"F5",X"5F",X"07",X"30",X"0F",X"3A", + X"44",X"66",X"CE",X"F8",X"F5",X"5F",X"03",X"3A",X"D6",X"64",X"CE",X"27",X"E3",X"0F",X"2A",X"0B", + X"66",X"E5",X"B0",X"17",X"0B",X"7E",X"D6",X"24",X"F5",X"5F",X"07",X"30",X"21",X"3A",X"E7",X"64", + X"FE",X"04",X"28",X"24",X"30",X"29",X"3A",X"43",X"66",X"CE",X"F8",X"F5",X"5F",X"04",X"30",X"3B", + X"3A",X"43",X"66",X"CE",X"F8",X"F5",X"5F",X"04",X"3A",X"D6",X"64",X"CE",X"27",X"E3",X"0F",X"2A", + X"0D",X"66",X"E5",X"B0",X"17",X"0B",X"3E",X"DB",X"46",X"90",X"F5",X"5F",X"07",X"30",X"34",X"3A", + X"43",X"66",X"CE",X"F8",X"F5",X"5F",X"04",X"3A",X"D6",X"64",X"CE",X"27",X"E3",X"0F",X"2A",X"0D", + X"66",X"E5",X"B0",X"17",X"3E",X"DB",X"46",X"90",X"F5",X"5F",X"07",X"3A",X"75",X"65",X"FE",X"00", + X"08",X"05",X"09",X"78",X"65",X"E3",X"C6",X"F5",X"09",X"00",X"64",X"F5",X"E3",X"06",X"7E",X"28", + X"27",X"E5",X"79",X"1F",X"E5",X"57",X"18",X"09",X"00",X"64",X"0A",X"8C",X"64",X"E5",X"4C",X"27", + X"F5",X"09",X"20",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"27",X"E5",X"79",X"1F",X"E5",X"57",X"18", + X"09",X"20",X"64",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09",X"10",X"64",X"F5",X"E3",X"06", + X"7E",X"28",X"27",X"E5",X"79",X"1F",X"E5",X"57",X"18",X"09",X"10",X"64",X"0A",X"8C",X"64",X"E5", + X"4C",X"27",X"F5",X"09",X"30",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"27",X"E5",X"79",X"1F",X"E5", + X"57",X"18",X"09",X"30",X"64",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09",X"08",X"64",X"F5", + X"E3",X"06",X"7E",X"E2",X"22",X"19",X"E5",X"79",X"1F",X"E5",X"57",X"18",X"09",X"08",X"64",X"0A", + X"8C",X"64",X"E5",X"4C",X"27",X"C3",X"22",X"19",X"3A",X"2E",X"66",X"FE",X"20",X"08",X"11",X"3A", + X"3C",X"65",X"E3",X"4F",X"E2",X"9F",X"2F",X"E3",X"96",X"AF",X"1A",X"2E",X"66",X"C3",X"9F",X"2F", + X"3C",X"1A",X"2E",X"66",X"C3",X"9F",X"2F",X"F5",X"7E",X"00",X"FE",X"04",X"18",X"12",X"F5",X"7E", + X"03",X"F5",X"BE",X"07",X"08",X"27",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"30",X"05", + X"F5",X"7E",X"04",X"30",X"EC",X"09",X"19",X"66",X"E3",X"46",X"08",X"07",X"2B",X"E5",X"D6",X"18", + X"F4",X"BB",X"18",X"09",X"1D",X"66",X"E3",X"46",X"08",X"07",X"2B",X"E5",X"D6",X"18",X"F4",X"BB", + X"18",X"09",X"39",X"66",X"E3",X"46",X"08",X"07",X"2B",X"E5",X"D6",X"18",X"F4",X"BB",X"18",X"09", + X"3D",X"66",X"E3",X"46",X"08",X"07",X"2B",X"E5",X"D6",X"18",X"F4",X"BB",X"18",X"09",X"41",X"66", + X"E3",X"46",X"C0",X"2B",X"E5",X"D6",X"18",X"F4",X"BB",X"18",X"E1",X"E3",X"C6",X"09",X"93",X"65", + X"E3",X"C6",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"2A",X"47",X"66",X"ED",X"73",X"61", + X"66",X"31",X"0A",X"61",X"66",X"E1",X"F5",X"7E",X"03",X"46",X"B8",X"38",X"31",X"90",X"FE",X"22", + X"18",X"11",X"F5",X"7E",X"04",X"2B",X"46",X"B8",X"38",X"16",X"90",X"FE",X"22",X"18",X"04",X"0B", + X"0B",X"1F",X"E1",X"1F",X"3F",X"E1",X"67",X"78",X"41",X"90",X"FE",X"22",X"38",X"CC",X"30",X"DB", + X"67",X"78",X"41",X"90",X"FE",X"22",X"38",X"CF",X"30",X"E9",X"00",X"E5",X"55",X"1D",X"2A",X"46", + X"67",X"2B",X"0A",X"46",X"67",X"7D",X"9C",X"28",X"02",X"30",X"55",X"3A",X"60",X"67",X"FE",X"04", + X"38",X"05",X"D6",X"03",X"1A",X"60",X"67",X"3A",X"A8",X"64",X"3C",X"FE",X"21",X"18",X"03",X"1A", + X"A8",X"64",X"3A",X"98",X"64",X"3C",X"FE",X"22",X"18",X"03",X"1A",X"98",X"64",X"3A",X"B8",X"64", + X"3C",X"FE",X"23",X"18",X"03",X"1A",X"B8",X"64",X"3A",X"C0",X"64",X"3C",X"FE",X"25",X"18",X"03", + X"1A",X"C0",X"64",X"3A",X"E0",X"64",X"3C",X"FE",X"10",X"18",X"03",X"1A",X"E0",X"64",X"09",X"2C", + X"01",X"0A",X"46",X"67",X"3A",X"45",X"67",X"D6",X"08",X"FE",X"0D",X"38",X"03",X"1A",X"45",X"67", + X"00",X"09",X"D7",X"38",X"3A",X"3E",X"67",X"E5",X"B0",X"17",X"46",X"3A",X"3F",X"67",X"3C",X"1A", + X"3F",X"67",X"B8",X"C2",X"AD",X"19",X"AF",X"1A",X"3F",X"67",X"3A",X"CB",X"66",X"47",X"3A",X"CC", + X"66",X"80",X"1A",X"38",X"67",X"1A",X"39",X"67",X"1A",X"3A",X"67",X"1A",X"3B",X"67",X"78",X"FE", + X"02",X"28",X"06",X"3C",X"1A",X"CB",X"66",X"30",X"04",X"AF",X"1A",X"CB",X"66",X"00",X"2A",X"61", + X"66",X"EB",X"09",X"00",X"00",X"3A",X"63",X"66",X"3C",X"1A",X"63",X"66",X"FE",X"24",X"08",X"07", + X"AF",X"1A",X"63",X"66",X"09",X"10",X"00",X"31",X"EB",X"E5",X"60",X"11",X"AF",X"06",X"28",X"2A", + X"1E",X"67",X"9E",X"0B",X"10",X"FC",X"FE",X"00",X"C0",X"E5",X"FD",X"17",X"E5",X"A0",X"1C",X"09", + X"F4",X"64",X"E3",X"E6",X"E3",X"F6",X"E5",X"55",X"1D",X"09",X"CC",X"65",X"E3",X"E6",X"C3",X"1F", + X"1A",X"3A",X"F4",X"64",X"E3",X"B7",X"1A",X"F4",X"64",X"E3",X"66",X"28",X"0E",X"3A",X"46",X"66", + X"FE",X"04",X"08",X"32",X"AF",X"1A",X"46",X"66",X"3A",X"E7",X"64",X"FE",X"23",X"28",X"73",X"3C", + X"1A",X"E7",X"64",X"09",X"6D",X"1B",X"E5",X"B0",X"17",X"7E",X"1A",X"D4",X"64",X"E1",X"3C",X"1A", + X"46",X"66",X"E1",X"E3",X"E6",X"E5",X"FD",X"17",X"E5",X"A0",X"1C",X"E5",X"55",X"1D",X"3E",X"07", + X"1A",X"D4",X"64",X"AF",X"1A",X"E7",X"64",X"AF",X"09",X"19",X"66",X"E3",X"46",X"28",X"03",X"1A", + X"AA",X"64",X"09",X"1D",X"66",X"E3",X"46",X"28",X"03",X"1A",X"9A",X"64",X"09",X"39",X"66",X"E3", + X"46",X"28",X"03",X"1A",X"BA",X"64",X"09",X"3D",X"66",X"E3",X"46",X"28",X"03",X"1A",X"C2",X"64", + X"09",X"41",X"66",X"E3",X"46",X"E0",X"1A",X"E2",X"64",X"E1",X"AF",X"1A",X"D2",X"64",X"09",X"2F", + X"66",X"11",X"18",X"66",X"01",X"17",X"00",X"1E",X"00",X"ED",X"98",X"09",X"F4",X"64",X"E3",X"E6", + X"E1",X"2A",X"37",X"66",X"F5",X"7E",X"07",X"FE",X"80",X"38",X"03",X"2A",X"09",X"66",X"CE",X"27", + X"E3",X"0F",X"E3",X"0F",X"E5",X"B0",X"17",X"7E",X"DD",X"0B",X"76",X"0B",X"56",X"EB",X"7E",X"B8", + X"28",X"25",X"0B",X"0B",X"D9",X"3D",X"DD",X"28",X"02",X"30",X"DB",X"D9",X"1F",X"3F",X"E1",X"D9", + X"2B",X"7E",X"DD",X"2A",X"0B",X"66",X"FE",X"80",X"38",X"03",X"2A",X"0D",X"66",X"CE",X"27",X"E3", + X"0F",X"E5",X"B0",X"17",X"3A",X"3C",X"65",X"E3",X"67",X"28",X"15",X"E3",X"47",X"28",X"05",X"0B", + X"E3",X"57",X"28",X"24",X"7E",X"F5",X"BE",X"04",X"28",X"D1",X"D9",X"F5",X"5F",X"07",X"1F",X"E1", + X"7E",X"F5",X"BE",X"03",X"28",X"C5",X"30",X"DA",X"FD",X"E3",X"02",X"66",X"08",X"52",X"FD",X"E3", + X"02",X"56",X"28",X"0E",X"FD",X"7E",X"03",X"FE",X"04",X"08",X"32",X"FD",X"1E",X"03",X"00",X"F5", + X"7E",X"00",X"FE",X"23",X"28",X"19",X"3C",X"F5",X"5F",X"00",X"09",X"6D",X"1B",X"E5",X"B0",X"17", + X"7E",X"F5",X"5F",X"05",X"E1",X"3C",X"FD",X"5F",X"03",X"E1",X"F5",X"1E",X"05",X"07",X"F5",X"1E", + X"06",X"17",X"F5",X"7E",X"01",X"12",X"F5",X"1E",X"01",X"00",X"F5",X"1E",X"00",X"00",X"FD",X"1E", + X"03",X"00",X"FD",X"E3",X"02",X"D6",X"E1",X"FD",X"E3",X"02",X"E6",X"F5",X"1E",X"03",X"00",X"E1", + X"FD",X"46",X"03",X"3A",X"45",X"67",X"B8",X"28",X"05",X"04",X"FD",X"58",X"03",X"E1",X"FD",X"1E", + X"00",X"00",X"FD",X"1E",X"01",X"00",X"FD",X"1E",X"02",X"00",X"FD",X"1E",X"03",X"00",X"D5",X"F5", + X"CD",X"D1",X"01",X"20",X"00",X"ED",X"98",X"D1",X"32",X"F5",X"5F",X"01",X"E1",X"07",X"25",X"05", + X"21",X"07",X"25",X"05",X"21",X"07",X"25",X"05",X"21",X"F5",X"E3",X"06",X"7E",X"28",X"1C",X"F5", + X"7E",X"00",X"FE",X"04",X"18",X"28",X"F5",X"7E",X"03",X"F5",X"BE",X"07",X"08",X"27",X"F5",X"1E", + X"00",X"01",X"F5",X"E3",X"06",X"BE",X"3A",X"50",X"66",X"3D",X"1A",X"50",X"66",X"09",X"44",X"66", + X"E5",X"D6",X"18",X"F2",X"80",X"1C",X"F5",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"E1",X"F5",X"7E", + X"04",X"30",X"D6",X"E3",X"46",X"C0",X"3A",X"33",X"66",X"E3",X"47",X"28",X"3A",X"0B",X"7E",X"3D", + X"5F",X"FE",X"00",X"C0",X"3A",X"60",X"67",X"5F",X"2B",X"3A",X"50",X"66",X"FE",X"03",X"E0",X"3C", + X"1A",X"50",X"66",X"F5",X"E3",X"06",X"FE",X"FD",X"7E",X"00",X"F5",X"5F",X"00",X"3A",X"67",X"66", + X"F5",X"5F",X"01",X"2B",X"FD",X"7E",X"00",X"FE",X"02",X"28",X"12",X"FE",X"03",X"28",X"2A",X"7E", + X"CE",X"F8",X"F5",X"5F",X"03",X"30",X"3F",X"3A",X"60",X"67",X"0B",X"5F",X"E1",X"CD",X"7E",X"CE", + X"F8",X"F5",X"5F",X"03",X"FD",X"7E",X"07",X"CE",X"27",X"E3",X"0F",X"2A",X"0B",X"66",X"E5",X"B0", + X"17",X"7E",X"D6",X"24",X"F5",X"5F",X"07",X"30",X"0F",X"CD",X"7E",X"CE",X"F8",X"F5",X"5F",X"03", + X"FD",X"7E",X"07",X"CE",X"27",X"E3",X"0F",X"2A",X"0B",X"66",X"E5",X"B0",X"17",X"0B",X"7E",X"D6", + X"24",X"F5",X"5F",X"07",X"30",X"22",X"2B",X"FD",X"7E",X"00",X"FE",X"04",X"28",X"23",X"30",X"0D", + X"C9",X"2B",X"7E",X"CE",X"F8",X"F5",X"5F",X"04",X"E1",X"7E",X"CE",X"F8",X"F5",X"5F",X"04",X"FD", + X"7E",X"07",X"CE",X"27",X"E3",X"0F",X"2A",X"0D",X"66",X"E5",X"B0",X"17",X"0B",X"3E",X"DB",X"46", + X"90",X"F5",X"5F",X"07",X"E1",X"7E",X"CE",X"F8",X"F5",X"5F",X"04",X"FD",X"7E",X"07",X"CE",X"27", + X"E3",X"0F",X"2A",X"0D",X"66",X"E5",X"B0",X"17",X"3E",X"DB",X"46",X"90",X"F5",X"5F",X"07",X"E1", + X"E3",X"C6",X"09",X"E1",X"65",X"E3",X"C6",X"E1",X"F5",X"09",X"00",X"64",X"F5",X"E3",X"06",X"7E", + X"28",X"27",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"F5",X"0A",X"8C",X"64",X"E5",X"4C", + X"27",X"F5",X"09",X"20",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"27",X"F5",X"1E",X"00",X"01",X"F5", + X"E3",X"06",X"BE",X"F5",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09",X"10",X"64",X"F5",X"E3", + X"06",X"7E",X"28",X"27",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"F5",X"0A",X"8C",X"64", + X"E5",X"4C",X"27",X"F5",X"09",X"28",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"27",X"F5",X"1E",X"00", + X"01",X"F5",X"E3",X"06",X"BE",X"F5",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09",X"18",X"64", + X"F5",X"E3",X"06",X"7E",X"28",X"27",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"F5",X"0A", + X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09",X"38",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"27",X"F5", + X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"F5",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09", + X"40",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"27",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE", + X"F5",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09",X"60",X"64",X"F5",X"E3",X"06",X"7E",X"28", + X"27",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"F5",X"0A",X"8C",X"64",X"E5",X"4C",X"27", + X"AF",X"1A",X"50",X"66",X"E1",X"2A",X"C9",X"66",X"3A",X"38",X"67",X"06",X"04",X"E5",X"3A",X"38", + X"3A",X"39",X"67",X"06",X"24",X"E5",X"3A",X"38",X"3A",X"3A",X"67",X"06",X"10",X"E5",X"3A",X"38", + X"3A",X"3B",X"67",X"06",X"04",X"E5",X"3A",X"38",X"E1",X"09",X"33",X"66",X"E3",X"86",X"E3",X"A6", + X"2A",X"35",X"66",X"EB",X"FD",X"09",X"00",X"00",X"FD",X"31",X"2A",X"D7",X"64",X"EB",X"F5",X"09", + X"00",X"00",X"F5",X"31",X"F5",X"7E",X"07",X"FE",X"80",X"D2",X"58",X"1E",X"F5",X"46",X"04",X"FD", + X"7E",X"04",X"B8",X"F2",X"3B",X"1E",X"F5",X"7E",X"07",X"FD",X"46",X"07",X"B8",X"E2",X"01",X"1E", + X"E5",X"44",X"1F",X"09",X"33",X"66",X"E3",X"66",X"C4",X"0B",X"1E",X"2A",X"29",X"66",X"7E",X"FD", + X"46",X"04",X"2A",X"2B",X"66",X"DD",X"30",X"07",X"0B",X"0B",X"D9",X"3D",X"DD",X"28",X"20",X"7E", + X"B8",X"28",X"06",X"18",X"DB",X"30",X"02",X"2B",X"2B",X"D9",X"F5",X"46",X"04",X"7E",X"B8",X"28", + X"32",X"38",X"24",X"F5",X"1E",X"00",X"03",X"F5",X"1E",X"05",X"25",X"E5",X"21",X"27",X"E1",X"F5", + X"1E",X"00",X"02",X"F5",X"1E",X"05",X"21",X"E5",X"21",X"27",X"E1",X"2B",X"7E",X"F5",X"5F",X"07", + X"E1",X"09",X"33",X"66",X"E3",X"C6",X"F5",X"1E",X"00",X"03",X"F5",X"1E",X"05",X"25",X"E5",X"21", + X"27",X"E1",X"09",X"33",X"66",X"E3",X"C6",X"F5",X"1E",X"00",X"02",X"F5",X"1E",X"05",X"21",X"E5", + X"21",X"27",X"E1",X"FD",X"7E",X"03",X"F5",X"46",X"03",X"B8",X"38",X"22",X"90",X"FE",X"21",X"D0", + X"09",X"33",X"66",X"E3",X"C6",X"E1",X"67",X"78",X"41",X"30",X"D9",X"F5",X"7E",X"07",X"FD",X"46", + X"07",X"B8",X"E2",X"12",X"1E",X"E5",X"44",X"1F",X"09",X"33",X"66",X"E3",X"66",X"C4",X"0B",X"1E", + X"2A",X"29",X"66",X"7E",X"FD",X"46",X"04",X"2A",X"2B",X"66",X"DD",X"30",X"07",X"0B",X"0B",X"D9", + X"3D",X"DD",X"28",X"07",X"7E",X"B8",X"E2",X"F1",X"1D",X"18",X"DA",X"2B",X"2B",X"C3",X"F1",X"1D", + X"F5",X"46",X"03",X"FD",X"7E",X"03",X"B8",X"F2",X"27",X"1F",X"F5",X"7E",X"07",X"FD",X"46",X"07", + X"B8",X"E2",X"D5",X"1E",X"E5",X"44",X"1F",X"09",X"33",X"66",X"E3",X"66",X"C4",X"DF",X"1E",X"2A", + X"29",X"66",X"7E",X"FD",X"46",X"03",X"2A",X"2B",X"66",X"DD",X"30",X"07",X"0B",X"0B",X"D9",X"3D", + X"DD",X"28",X"20",X"7E",X"B8",X"28",X"06",X"18",X"DB",X"30",X"02",X"2B",X"2B",X"D9",X"F5",X"46", + X"03",X"7E",X"B8",X"28",X"32",X"38",X"24",X"F5",X"1E",X"00",X"04",X"F5",X"1E",X"05",X"07",X"E5", + X"21",X"27",X"E1",X"F5",X"1E",X"00",X"05",X"F5",X"1E",X"05",X"05",X"E5",X"21",X"27",X"E1",X"2B", + X"7E",X"F5",X"5F",X"07",X"E1",X"09",X"33",X"66",X"E3",X"C6",X"F5",X"1E",X"00",X"04",X"F5",X"1E", + X"05",X"07",X"E5",X"21",X"27",X"E1",X"09",X"33",X"66",X"E3",X"C6",X"F5",X"1E",X"00",X"05",X"F5", + X"1E",X"05",X"05",X"E5",X"21",X"27",X"E1",X"FD",X"7E",X"04",X"F5",X"46",X"04",X"B8",X"38",X"22", + X"90",X"FE",X"21",X"D0",X"09",X"33",X"66",X"E3",X"C6",X"E1",X"67",X"78",X"41",X"30",X"D9",X"F5", + X"7E",X"07",X"FD",X"46",X"07",X"B8",X"E2",X"CE",X"1E",X"E5",X"44",X"1F",X"09",X"33",X"66",X"E3", + X"66",X"C4",X"DF",X"1E",X"2A",X"29",X"66",X"7E",X"FD",X"46",X"03",X"2A",X"2B",X"66",X"DD",X"30", + X"07",X"0B",X"0B",X"D9",X"3D",X"DD",X"28",X"07",X"7E",X"B8",X"E2",X"AD",X"1E",X"18",X"DA",X"2B", + X"2B",X"C3",X"AD",X"1E",X"2A",X"37",X"66",X"F5",X"7E",X"07",X"FE",X"80",X"38",X"03",X"2A",X"09", + X"66",X"CE",X"27",X"E3",X"0F",X"E3",X"0F",X"E5",X"B0",X"17",X"0A",X"29",X"66",X"46",X"FD",X"7E", + X"07",X"0B",X"76",X"0B",X"56",X"EB",X"0A",X"2B",X"66",X"2B",X"66",X"B9",X"28",X"05",X"0B",X"0B", + X"10",X"F8",X"E1",X"09",X"33",X"66",X"E3",X"E6",X"E1",X"06",X"22",X"F5",X"7E",X"03",X"09",X"F7", + X"38",X"BE",X"28",X"06",X"0B",X"10",X"FA",X"C3",X"D9",X"1F",X"78",X"3E",X"22",X"90",X"2A",X"1E", + X"67",X"E3",X"0F",X"E3",X"0F",X"E5",X"B0",X"17",X"F5",X"7E",X"04",X"46",X"B8",X"28",X"12",X"0B", + X"46",X"B8",X"28",X"25",X"0B",X"46",X"B8",X"28",X"20",X"0B",X"46",X"B8",X"28",X"03",X"C3",X"D9", + X"1F",X"1E",X"00",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"1F",X"3F",X"ED",X"73",X"1E", + X"67",X"ED",X"52",X"EB",X"09",X"E9",X"38",X"31",X"7E",X"2A",X"C9",X"66",X"E3",X"0F",X"E5",X"B0", + X"17",X"76",X"1E",X"FF",X"0B",X"56",X"1E",X"FF",X"EB",X"1E",X"40",X"2A",X"65",X"66",X"ED",X"73", + X"61",X"66",X"31",X"0A",X"61",X"66",X"09",X"AE",X"65",X"E3",X"C6",X"09",X"2C",X"01",X"0A",X"46", + X"67",X"E1",X"A5",X"41",X"92",X"41",X"5A",X"42",X"6D",X"42",X"87",X"41",X"2A",X"41",X"E5",X"40", + X"D2",X"40",X"1D",X"41",X"B0",X"41",X"78",X"42",X"D5",X"42",X"1A",X"43",X"2D",X"43",X"E2",X"42", + X"4F",X"42",X"81",X"41",X"0C",X"41",X"C7",X"40",X"6A",X"40",X"5D",X"40",X"F0",X"40",X"3B",X"41", + X"B6",X"41",X"7E",X"42",X"F3",X"42",X"38",X"43",X"95",X"43",X"A2",X"43",X"0F",X"43",X"C4",X"42", + X"49",X"42",X"49",X"40",X"7E",X"40",X"B6",X"43",X"81",X"43",X"76",X"0B",X"56",X"12",X"0B",X"10", + X"F9",X"E1",X"11",X"E7",X"45",X"09",X"5C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E", + X"21",X"1A",X"64",X"67",X"AF",X"1A",X"AA",X"64",X"1A",X"9A",X"64",X"1A",X"BA",X"64",X"1A",X"C2", + X"64",X"1A",X"E2",X"64",X"1A",X"D2",X"64",X"3E",X"02",X"1A",X"65",X"67",X"3E",X"20",X"1A",X"66", + X"67",X"1A",X"50",X"67",X"3E",X"20",X"1A",X"67",X"67",X"1A",X"53",X"67",X"3E",X"16",X"1A",X"51", + X"67",X"1A",X"55",X"67",X"3E",X"12",X"1A",X"52",X"67",X"1A",X"54",X"67",X"ED",X"73",X"66",X"67", + X"E5",X"E0",X"38",X"ED",X"73",X"50",X"67",X"E5",X"E0",X"38",X"ED",X"73",X"52",X"67",X"E5",X"E0", + X"38",X"ED",X"73",X"54",X"67",X"E5",X"E0",X"38",X"3A",X"65",X"67",X"C6",X"02",X"1A",X"65",X"67", + X"06",X"20",X"09",X"66",X"67",X"1D",X"0B",X"10",X"FC",X"3E",X"05",X"E5",X"83",X"17",X"3A",X"64", + X"67",X"3D",X"1A",X"64",X"67",X"08",X"C5",X"E1",X"E5",X"C7",X"16",X"09",X"D6",X"38",X"3A",X"65", + X"67",X"47",X"E5",X"D3",X"17",X"E1",X"2E",X"05",X"04",X"03",X"22",X"06",X"03",X"22",X"05",X"20", + X"08",X"38",X"50",X"68",X"90",X"A8",X"C0",X"F0",X"D8",X"08",X"10",X"37",X"0B",X"11",X"36",X"00", + X"00",X"12",X"04",X"27",X"35",X"13",X"05",X"26",X"34",X"06",X"00",X"03",X"25",X"07",X"01",X"02", + X"24",X"14",X"20",X"23",X"33",X"15",X"21",X"22",X"32",X"16",X"31",X"00",X"00",X"09",X"17",X"30", + X"0A",X"20",X"50",X"A0",X"D0",X"38",X"88",X"00",X"00",X"08",X"50",X"A0",X"B8",X"20",X"38",X"88", + X"D0",X"08",X"50",X"A0",X"B8",X"08",X"50",X"A0",X"B8",X"20",X"38",X"88",X"D0",X"08",X"50",X"A0", + X"B8",X"38",X"88",X"00",X"00",X"20",X"50",X"A0",X"D0",X"20",X"69",X"39",X"00",X"20",X"69",X"39", + X"00",X"02",X"79",X"39",X"00",X"02",X"7D",X"39",X"00",X"02",X"69",X"39",X"00",X"22",X"81",X"39", + X"00",X"22",X"81",X"39",X"00",X"02",X"79",X"39",X"00",X"02",X"7D",X"39",X"00",X"02",X"69",X"39", + X"00",X"20",X"69",X"39",X"00",X"20",X"69",X"39",X"D8",X"FC",X"DA",X"E4",X"DB",X"9C",X"DC",X"B4", + X"DD",X"5C",X"DE",X"74",X"DF",X"44",X"F9",X"14",X"DF",X"44",X"F9",X"14",X"DC",X"B4",X"DD",X"5C", + X"D8",X"FC",X"D9",X"CC",X"DA",X"E4",X"DB",X"9C",X"DC",X"B4",X"DD",X"5C",X"DE",X"74",X"DF",X"44", + X"F8",X"2C",X"F9",X"14",X"20",X"BC",X"39",X"00",X"02",X"E4",X"39",X"00",X"20",X"BC",X"39",X"00", + X"06",X"D0",X"39",X"00",X"20",X"F4",X"39",X"00",X"20",X"F4",X"39",X"00",X"06",X"D0",X"39",X"00", + X"20",X"EC",X"39",X"00",X"02",X"E4",X"39",X"00",X"20",X"EC",X"39",X"00",X"EB",X"01",X"D3",X"04", + X"BB",X"05",X"8B",X"06",X"6B",X"21",X"53",X"22",X"3B",X"23",X"0B",X"05",X"8B",X"06",X"6B",X"00", + X"EB",X"01",X"D3",X"05",X"8B",X"06",X"6B",X"22",X"3B",X"23",X"0B",X"00",X"EB",X"01",X"D3",X"03", + X"BB",X"05",X"8B",X"06",X"6B",X"20",X"53",X"22",X"3B",X"23",X"0B",X"00",X"EB",X"01",X"D3",X"02", + X"BB",X"05",X"8B",X"06",X"6B",X"07",X"53",X"22",X"3B",X"23",X"0B",X"14",X"FC",X"14",X"FC",X"14", + X"44",X"5C",X"B4",X"E4",X"FC",X"14",X"FC",X"14",X"FC",X"14",X"44",X"5C",X"B4",X"E4",X"FC",X"14", + X"FC",X"14",X"FC",X"0B",X"EB",X"6B",X"8B",X"0B",X"EB",X"0B",X"EB",X"0B",X"EB",X"0B",X"EB",X"0B", + X"EB",X"0B",X"EB",X"6B",X"8B",X"0B",X"EB",X"E1",X"E1",X"09",X"51",X"66",X"0A",X"C9",X"66",X"09", + X"CE",X"66",X"0A",X"1E",X"67",X"3A",X"3C",X"67",X"1A",X"3E",X"67",X"E1",X"E1",X"09",X"B1",X"66", + X"0A",X"C9",X"66",X"09",X"26",X"67",X"0A",X"1E",X"67",X"3A",X"3D",X"67",X"1A",X"3E",X"67",X"E1", + X"E1",X"09",X"DA",X"1F",X"11",X"51",X"66",X"01",X"60",X"00",X"ED",X"98",X"09",X"11",X"39",X"11", + X"CE",X"66",X"01",X"28",X"00",X"ED",X"98",X"3A",X"3C",X"67",X"3C",X"FE",X"20",X"08",X"02",X"3E", + X"07",X"1A",X"3C",X"67",X"1A",X"3E",X"67",X"E5",X"42",X"38",X"E1",X"09",X"DA",X"1F",X"11",X"B1", + X"66",X"01",X"60",X"00",X"ED",X"98",X"09",X"11",X"39",X"11",X"26",X"67",X"01",X"28",X"00",X"ED", + X"98",X"3A",X"3D",X"67",X"3C",X"FE",X"20",X"08",X"02",X"3E",X"07",X"1A",X"3D",X"67",X"1A",X"3E", + X"67",X"E5",X"42",X"38",X"E1",X"E1",X"45",X"71",X"45",X"53",X"2C",X"43",X"67",X"50",X"71",X"52", + X"61",X"47",X"60",X"54",X"08",X"19",X"39",X"38",X"1A",X"44",X"61",X"47",X"61",X"54",X"52",X"45", + X"70",X"08",X"54",X"45",X"43",X"60",X"53",X"54",X"41",X"52",X"6F",X"81",X"23",X"FD",X"90",X"07", + X"01",X"23",X"2C",X"3A",X"22",X"FD",X"93",X"09",X"02",X"9B",X"1B",X"06",X"20",X"03",X"23",X"FC", + X"92",X"07",X"02",X"23",X"2C",X"28",X"23",X"FC",X"6F",X"37",X"29",X"06",X"01",X"03",X"23",X"F4", + X"A0",X"09",X"02",X"93",X"31",X"06",X"20",X"03",X"23",X"F5",X"E5",X"09",X"02",X"A7",X"86",X"06", + X"21",X"03",X"25",X"20",X"01",X"20",X"02",X"85",X"D2",X"23",X"2C",X"E7",X"23",X"08",X"81",X"23", + X"DF",X"84",X"20",X"01",X"03",X"02",X"FE",X"84",X"20",X"02",X"03",X"23",X"DC",X"86",X"20",X"03", + X"03",X"01",X"FB",X"23",X"DB",X"84",X"20",X"04",X"03",X"23",X"F8",X"84",X"20",X"05",X"03",X"02", + X"ED",X"84",X"20",X"06",X"03",X"23",X"FE",X"84",X"20",X"07",X"03",X"23",X"FA",X"84",X"20",X"20", + X"03",X"23",X"FB",X"86",X"20",X"21",X"03",X"01",X"FB",X"07",X"05",X"23",X"28",X"BF",X"23",X"FE", + X"A5",X"20",X"22",X"07",X"07",X"22",X"29",X"6F",X"21",X"FD",X"04",X"01",X"18",X"23",X"FB",X"85", + X"20",X"23",X"01",X"58",X"23",X"FA",X"85",X"20",X"24",X"01",X"69",X"02",X"99",X"A0",X"02",X"BA", + X"6A",X"20",X"25",X"01",X"77",X"02",X"8D",X"4B",X"23",X"29",X"76",X"05",X"2C",X"85",X"01",X"86", + X"01",X"03",X"05",X"25",X"86",X"20",X"26",X"07",X"07",X"03",X"07",X"06",X"07",X"07",X"02",X"A4", + X"62",X"20",X"27",X"03",X"22",X"DE",X"84",X"23",X"DD",X"41",X"03",X"25",X"20",X"23",X"FD",X"84", + X"07",X"01",X"03",X"23",X"FC",X"1D",X"07",X"02",X"03",X"23",X"2B",X"87",X"02",X"DC",X"92",X"3D", + X"01",X"A2",X"23",X"2D",X"A4",X"02",X"EB",X"A1",X"3D",X"13",X"00",X"07",X"04",X"07",X"20",X"03", + X"21",X"FC",X"04",X"23",X"F6",X"92",X"09",X"23",X"08",X"81",X"23",X"F9",X"86",X"20",X"07",X"06", + X"22",X"03",X"02",X"20",X"2C",X"01",X"79",X"23",X"F7",X"A1",X"02",X"C6",X"0C",X"06",X"23",X"03", + X"01",X"1B",X"23",X"C8",X"C5",X"09",X"23",X"08",X"81",X"23",X"DF",X"88",X"23",X"2C",X"12",X"23", + X"28",X"27",X"23",X"DE",X"87",X"37",X"07",X"01",X"89",X"01",X"06",X"37",X"F3",X"02",X"8B",X"7A", + X"23",X"29",X"5F",X"3D",X"07",X"04",X"06",X"01",X"03",X"01",X"13",X"23",X"F9",X"96",X"37",X"06", + X"23",X"2C",X"4F",X"23",X"28",X"4C",X"23",X"DE",X"49",X"23",X"29",X"76",X"07",X"03",X"06",X"24", + X"03",X"25",X"20",X"02",X"3C",X"54",X"09",X"01",X"68",X"23",X"C9",X"A9",X"09",X"23",X"28",X"62", + X"22",X"DE",X"91",X"37",X"D3",X"02",X"6B",X"42",X"23",X"29",X"3F",X"23",X"2C",X"3C",X"23",X"DF", + X"39",X"01",X"41",X"23",X"29",X"1C",X"23",X"2C",X"19",X"22",X"DF",X"84",X"02",X"13",X"2B",X"09", + X"01",X"63",X"01",X"0E",X"23",X"CA",X"9A",X"23",X"08",X"81",X"23",X"FA",X"A4",X"23",X"2C",X"5B", + X"37",X"EB",X"23",X"FE",X"6E",X"06",X"01",X"03",X"23",X"F9",X"A3",X"23",X"2C",X"4D",X"23",X"F9", + X"4A",X"37",X"20",X"01",X"59",X"23",X"28",X"73",X"23",X"F8",X"70",X"23",X"29",X"55",X"23",X"2C", + X"52",X"37",X"CB",X"02",X"05",X"75",X"01",X"76",X"23",X"CB",X"A2",X"02",X"15",X"45",X"3D",X"07", + X"03",X"06",X"25",X"03",X"04",X"00",X"00",X"00",X"00",X"69",X"48",X"66",X"0B",X"46",X"32",X"81", + X"6F",X"13",X"32",X"A0",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"85",X"6F",X"13",X"32", + X"A4",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"8D",X"6F",X"13",X"32",X"8C",X"4F",X"E1", + X"44",X"65",X"09",X"00",X"00",X"3E",X"10",X"DD",X"29",X"EB",X"97",X"29",X"EB",X"A5",X"91",X"6F", + X"7C",X"B0",X"4F",X"13",X"D2",X"F1",X"3C",X"21",X"33",X"D9",X"3D",X"C2",X"C7",X"3C",X"E1",X"76", + X"0B",X"56",X"EB",X"29",X"CD",X"29",X"29",X"C1",X"21",X"E1",X"44",X"65",X"09",X"00",X"00",X"3E", + X"10",X"29",X"EB",X"29",X"EB",X"D2",X"F9",X"3C",X"21",X"3D",X"C2",X"D9",X"3C",X"E1",X"71",X"50", + X"EB",X"97",X"95",X"6F",X"3E",X"00",X"B4",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"9D", + X"6F",X"13",X"32",X"9C",X"4F",X"E1",X"77",X"16",X"00",X"7B",X"95",X"6F",X"7A",X"B4",X"4F",X"E1", + X"67",X"06",X"00",X"7B",X"91",X"6F",X"7A",X"B0",X"4F",X"E1",X"69",X"48",X"66",X"0B",X"46",X"32", + X"91",X"6F",X"13",X"32",X"B0",X"4F",X"E1",X"6F",X"0E",X"00",X"32",X"95",X"6F",X"13",X"32",X"B4", + X"4F",X"E1",X"77",X"16",X"00",X"7B",X"96",X"77",X"7A",X"0B",X"B6",X"57",X"EB",X"E1",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"93",X"1B",X"93",X"1B",X"F1",X"13",X"9D",X"0C",X"93",X"1B",X"EC",X"2E",X"48",X"2F", + X"00",X"00",X"F1",X"13",X"9D",X"0C",X"65",X"0E",X"FF",X"7F",X"2F",X"03",X"BA",X"06",X"00",X"04", + X"FC",X"03",X"76",X"03",X"8F",X"03",X"D5",X"03",X"A0",X"27",X"AD",X"03",X"EA",X"03",X"DF",X"03", + X"A2",X"03",X"1C",X"03",X"E7",X"03",X"4D",X"03",X"92",X"03",X"CA",X"03",X"56",X"03",X"06",X"03", + X"F2",X"92",X"03",X"DA",X"20",X"D2",X"67",X"70",X"A2",X"03",X"F2",X"A8",X"C4",X"52",X"67",X"57", + X"AD",X"03",X"85",X"C7",X"66",X"61",X"66",X"52",X"41",X"57",X"1C",X"03",X"97",X"E5",X"52",X"54", + X"A0",X"27",X"96",X"10",X"C5",X"64",X"54",X"61",X"54",X"CE",X"27",X"A3",X"E5",X"71",X"53",X"0B", + X"00",X"96",X"40",X"C2",X"55",X"53",X"4D",X"03",X"F2",X"90",X"C7",X"66",X"61",X"52",X"54",X"53", + X"D5",X"03",X"95",X"C5",X"64",X"54",X"61",X"54",X"53",X"06",X"03",X"A4",X"E4",X"52",X"53",X"8F", + X"03",X"F1",X"38",X"C1",X"52",X"53",X"1A",X"00",X"F1",X"28",X"C5",X"43",X"41",X"50",X"53",X"F1", + X"27",X"A1",X"D0",X"53",X"78",X"00",X"F8",X"18",X"C1",X"64",X"53",X"4A",X"00",X"F1",X"08",X"D2", + X"60",X"53",X"81",X"00",X"B7",X"E4",X"60",X"53",X"51",X"00",X"B6",X"D4",X"45",X"53",X"76",X"03", + X"F0",X"C0",X"C7",X"45",X"53",X"94",X"00",X"B2",X"E6",X"67",X"61",X"54",X"43",X"45",X"53",X"2A", + X"00",X"8A",X"00",X"C6",X"43",X"53",X"8F",X"27",X"D1",X"1F",X"D2",X"41",X"64",X"41",X"43",X"53", + X"EA",X"03",X"8F",X"C3",X"42",X"53",X"A5",X"00",X"F4",X"B0",X"42",X"D4",X"53",X"52",X"B2",X"00", + X"F7",X"C4",X"52",X"52",X"70",X"00",X"D2",X"4F",X"C1",X"43",X"52",X"52",X"B8",X"00",X"D1",X"27", + X"C3",X"52",X"52",X"42",X"00",X"F1",X"20",X"C1",X"52",X"52",X"C2",X"00",X"D1",X"37",X"D2",X"52", + X"CD",X"00",X"F1",X"30",X"C4",X"64",X"52",X"F6",X"00",X"D2",X"6F",X"C1",X"43",X"64",X"52",X"B3", + X"27",X"D1",X"07",X"C3",X"64",X"52",X"59",X"00",X"F1",X"00",X"C1",X"64",X"52",X"DA",X"00",X"D1", + X"17",X"E4",X"52",X"20",X"01",X"F1",X"10",X"E6",X"54",X"45",X"52",X"D0",X"00",X"D2",X"45",X"E1", + X"54",X"45",X"52",X"6B",X"00",X"D2",X"65",X"D4",X"45",X"52",X"15",X"01",X"D7",X"E1",X"C5",X"65", + X"55",X"53",X"45",X"52",X"01",X"01",X"8D",X"C5",X"56",X"52",X"45",X"53",X"45",X"52",X"86",X"00", + X"8C",X"01",X"D3",X"45",X"52",X"D6",X"00",X"F0",X"80",X"D4",X"41",X"45",X"50",X"45",X"52",X"40", + X"01",X"A7",X"D2",X"27",X"01",X"DB",X"E0",X"53",X"55",X"50",X"51",X"01",X"F6",X"C5",X"D0",X"67", + X"50",X"2C",X"01",X"F6",X"C1",X"E7",X"50",X"0D",X"01",X"DA",X"08",X"C5",X"50",X"F9",X"00",X"DA", + X"28",X"C5",X"47",X"41",X"50",X"E7",X"03",X"A0",X"30",X"D0",X"4B",X"01",X"DA",X"18",X"E1",X"54", + X"55",X"67",X"5F",X"01",X"D2",X"8B",X"C4",X"54",X"55",X"67",X"CA",X"03",X"D2",X"AB",X"D4",X"55", + X"67",X"A4",X"01",X"C9",X"41",X"D2",X"61",X"54",X"67",X"74",X"01",X"D2",X"9B",X"D2",X"44",X"54", + X"67",X"7C",X"01",X"D2",X"BB",X"C7",X"52",X"67",X"E0",X"00",X"81",X"D2",X"67",X"69",X"01",X"F2", + X"98",X"F2",X"66",X"99",X"00",X"DA",X"00",X"D0",X"67",X"66",X"63",X"00",X"D1",X"00",X"D4",X"53", + X"61",X"64",X"67",X"66",X"88",X"00",X"87",X"C7",X"45",X"66",X"47",X"01",X"D2",X"44",X"D2",X"60", + X"43",X"66",X"8B",X"01",X"B4",X"C3",X"66",X"C6",X"01",X"DA",X"10",X"C5",X"65",X"41",X"66",X"D4", + X"01",X"AB",X"C4",X"67",X"65",X"F1",X"01",X"B5",X"C7",X"45",X"65",X"9D",X"01",X"96",X"D8",X"C5", + X"65",X"55",X"01",X"96",X"FF",X"E7",X"52",X"43",X"41",X"65",X"BC",X"01",X"91",X"E5",X"93",X"01", + X"DA",X"38",X"E7",X"64",X"E4",X"01",X"B1",X"D4",X"53",X"61",X"64",X"6F",X"01",X"86",X"D2",X"61", + X"44",X"64",X"DB",X"01",X"D2",X"98",X"E1",X"44",X"64",X"8F",X"00",X"D2",X"88",X"D2",X"44",X"44", + X"64",X"CF",X"01",X"D2",X"B8",X"C4",X"44",X"64",X"06",X"02",X"D2",X"A8",X"C4",X"64",X"14",X"02", + X"D0",X"E4",X"33",X"02",X"DD",X"05",X"D2",X"62",X"35",X"01",X"D3",X"30",X"D0",X"62",X"1C",X"02", + X"D5",X"C3",X"F1",X"61",X"18",X"02",X"FC",X"08",X"F0",X"61",X"AA",X"01",X"FD",X"08",X"C5",X"47"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..9c1d550f --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"DB",X"AF",X"06",X"20",X"09",X"00",X"50",X"5F",X"0B",X"10",X"FC",X"ED",X"56",X"19",X"D9",X"67", + X"C3",X"C7",X"02",X"3A",X"EC",X"64",X"FE",X"00",X"E0",X"47",X"3E",X"30",X"09",X"35",X"40",X"5F", + X"2B",X"10",X"FC",X"E1",X"3A",X"ED",X"64",X"FE",X"00",X"E0",X"47",X"3E",X"30",X"09",X"02",X"40", + X"5F",X"0B",X"10",X"FC",X"E1",X"B6",X"25",X"66",X"20",X"F1",X"F5",X"CD",X"FD",X"CD",X"AF",X"1A", + X"00",X"50",X"2A",X"52",X"64",X"3A",X"54",X"64",X"5F",X"2A",X"55",X"64",X"3A",X"57",X"64",X"5F", + X"2A",X"72",X"64",X"3A",X"74",X"64",X"5F",X"2A",X"75",X"64",X"3A",X"77",X"64",X"5F",X"2A",X"4A", + X"64",X"3A",X"4C",X"64",X"5F",X"2A",X"4D",X"64",X"3A",X"4F",X"64",X"5F",X"2A",X"6A",X"64",X"3A", + X"6C",X"64",X"5F",X"2A",X"6D",X"64",X"3A",X"6F",X"64",X"5F",X"2A",X"5A",X"64",X"3A",X"5C",X"64", + X"5F",X"2A",X"5D",X"64",X"3A",X"5F",X"64",X"5F",X"2A",X"7A",X"64",X"3A",X"7C",X"64",X"5F",X"2A", + X"7D",X"64",X"3A",X"7F",X"64",X"5F",X"2A",X"82",X"64",X"3A",X"84",X"64",X"5F",X"2A",X"85",X"64", + X"3A",X"87",X"64",X"5F",X"2A",X"A2",X"64",X"3A",X"A4",X"64",X"5F",X"2A",X"A5",X"64",X"3A",X"A7", + X"64",X"5F",X"2A",X"92",X"64",X"3A",X"94",X"64",X"5F",X"2A",X"95",X"64",X"3A",X"97",X"64",X"5F", + X"2A",X"B2",X"64",X"3A",X"B4",X"64",X"5F",X"2A",X"B5",X"64",X"3A",X"B7",X"64",X"5F",X"09",X"F4", + X"64",X"E3",X"7E",X"28",X"19",X"E3",X"6E",X"08",X"2D",X"06",X"06",X"09",X"AA",X"64",X"11",X"4A", + X"50",X"3E",X"06",X"26",X"02",X"ED",X"88",X"ED",X"88",X"E5",X"B0",X"17",X"10",X"DB",X"06",X"06", + X"09",X"AC",X"64",X"11",X"DA",X"67",X"3E",X"06",X"26",X"02",X"ED",X"88",X"ED",X"88",X"E5",X"B0", + X"17",X"10",X"DB",X"C3",X"7E",X"01",X"ED",X"73",X"AA",X"64",X"E5",X"2A",X"11",X"ED",X"53",X"4A", + X"50",X"ED",X"73",X"9A",X"64",X"E5",X"2A",X"11",X"ED",X"53",X"4C",X"50",X"ED",X"73",X"BA",X"64", + X"E5",X"2A",X"11",X"ED",X"53",X"4E",X"50",X"ED",X"73",X"C2",X"64",X"E5",X"2A",X"11",X"ED",X"53", + X"68",X"50",X"ED",X"73",X"E2",X"64",X"E5",X"2A",X"11",X"ED",X"53",X"6A",X"50",X"ED",X"73",X"D2", + X"64",X"E5",X"2A",X"11",X"ED",X"53",X"6C",X"50",X"2A",X"AC",X"64",X"E5",X"43",X"11",X"0A",X"DA", + X"67",X"2A",X"9C",X"64",X"E5",X"43",X"11",X"0A",X"DC",X"67",X"2A",X"BC",X"64",X"E5",X"43",X"11", + X"0A",X"DE",X"67",X"2A",X"C4",X"64",X"E5",X"43",X"11",X"0A",X"F8",X"67",X"2A",X"E4",X"64",X"E5", + X"43",X"11",X"0A",X"FA",X"67",X"2A",X"D4",X"64",X"E5",X"43",X"11",X"0A",X"FC",X"67",X"2A",X"F1", + X"64",X"0B",X"0A",X"F1",X"64",X"7E",X"FE",X"FF",X"08",X"06",X"09",X"15",X"0C",X"0A",X"F1",X"64", + X"09",X"F3",X"64",X"E3",X"46",X"08",X"56",X"3A",X"00",X"50",X"E3",X"6F",X"E2",X"2A",X"02",X"E3", + X"A6",X"E3",X"56",X"08",X"3D",X"3A",X"00",X"50",X"E3",X"7F",X"E2",X"38",X"02",X"3A",X"F6",X"64", + X"FE",X"06",X"28",X"07",X"3C",X"1A",X"F6",X"64",X"C3",X"3D",X"02",X"AF",X"1A",X"F6",X"64",X"E3", + X"76",X"08",X"22",X"3A",X"F7",X"64",X"FE",X"00",X"08",X"23",X"C3",X"3D",X"02",X"AF",X"1A",X"07", + X"50",X"E3",X"B6",X"30",X"68",X"3D",X"1A",X"F7",X"64",X"3E",X"01",X"1A",X"07",X"50",X"E3",X"F6", + X"30",X"73",X"3A",X"00",X"50",X"E3",X"7F",X"28",X"C4",X"E3",X"96",X"30",X"10",X"3A",X"00",X"50", + X"E3",X"6F",X"28",X"AD",X"E3",X"86",X"3A",X"F7",X"64",X"3C",X"1A",X"F7",X"64",X"3A",X"C8",X"64", + X"FE",X"14",X"18",X"32",X"47",X"3A",X"CA",X"64",X"80",X"1A",X"C8",X"64",X"E3",X"3F",X"06",X"00", + X"80",X"0F",X"1A",X"CB",X"64",X"E5",X"05",X"17",X"E3",X"4E",X"08",X"02",X"E3",X"EE",X"3A",X"42", + X"65",X"E3",X"C7",X"1A",X"42",X"65",X"E3",X"DE",X"30",X"83",X"E3",X"66",X"08",X"05",X"E3",X"E6", + X"C3",X"89",X"01",X"E3",X"C6",X"C3",X"B7",X"01",X"E3",X"D6",X"C3",X"AD",X"01",X"00",X"09",X"F4", + X"64",X"E3",X"46",X"28",X"16",X"E5",X"2A",X"30",X"09",X"F4",X"64",X"E3",X"7E",X"28",X"04",X"E3", + X"6E",X"28",X"05",X"E5",X"22",X"30",X"30",X"03",X"E5",X"32",X"30",X"3A",X"CD",X"64",X"3C",X"1A", + X"CD",X"64",X"3A",X"CC",X"64",X"3C",X"1A",X"CC",X"64",X"FE",X"3C",X"08",X"23",X"AF",X"1A",X"CC", + X"64",X"3A",X"CE",X"64",X"3C",X"1A",X"CE",X"64",X"09",X"F3",X"64",X"E3",X"BE",X"3A",X"00",X"50", + X"E3",X"5F",X"08",X"1D",X"AF",X"1A",X"01",X"50",X"09",X"4A",X"50",X"06",X"24",X"1E",X"00",X"0B", + X"10",X"FB",X"3E",X"40",X"E5",X"CD",X"16",X"3E",X"01",X"E5",X"DD",X"16",X"11",X"D0",X"41",X"09", + X"C2",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"06",X"FF",X"09",X"FF",X"FF",X"2B",X"7D", + X"BC",X"1A",X"C0",X"50",X"08",X"F8",X"10",X"DB",X"5E",X"FB",X"3E",X"01",X"1A",X"00",X"50",X"FD", + X"C9",X"F5",X"C9",X"F1",X"20",X"ED",X"65",X"3A",X"00",X"50",X"E3",X"4F",X"C2",X"95",X"05",X"AF", + X"06",X"20",X"09",X"00",X"50",X"5F",X"0B",X"10",X"FC",X"3E",X"00",X"1A",X"03",X"50",X"19",X"D9", + X"67",X"E5",X"DA",X"17",X"DB",X"20",X"AF",X"20",X"09",X"00",X"40",X"E5",X"16",X"05",X"20",X"E3", + X"47",X"28",X"02",X"E3",X"D7",X"E3",X"67",X"28",X"02",X"E3",X"F7",X"20",X"09",X"00",X"44",X"E5", + X"16",X"05",X"20",X"E3",X"47",X"28",X"02",X"E3",X"CF",X"E3",X"67",X"28",X"02",X"E3",X"EF",X"20", + X"19",X"FD",X"43",X"09",X"00",X"64",X"E5",X"16",X"05",X"20",X"E3",X"47",X"28",X"02",X"E3",X"DF", + X"E3",X"67",X"28",X"02",X"E3",X"FF",X"20",X"3E",X"01",X"E5",X"DD",X"16",X"09",X"00",X"40",X"11", + X"01",X"40",X"01",X"FE",X"03",X"1E",X"40",X"ED",X"98",X"11",X"4E",X"41",X"09",X"D8",X"09",X"3E", + X"01",X"06",X"23",X"E5",X"BD",X"17",X"11",X"A2",X"40",X"09",X"FB",X"09",X"3E",X"01",X"06",X"30", + X"E5",X"BD",X"17",X"11",X"EC",X"40",X"09",X"13",X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17", + X"11",X"ED",X"40",X"09",X"0F",X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11",X"EE",X"40", + X"09",X"3B",X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11",X"EF",X"40",X"09",X"67",X"0A", + X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11",X"93",X"40",X"09",X"F7",X"0A",X"3E",X"01",X"06", + X"30",X"E5",X"BD",X"17",X"11",X"DD",X"40",X"09",X"4B",X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD", + X"17",X"11",X"DE",X"40",X"09",X"5F",X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11",X"DF", + X"40",X"09",X"A3",X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11",X"F8",X"40",X"09",X"B7", + X"0A",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11",X"F9",X"40",X"09",X"9B",X"0A",X"3E",X"01", + X"06",X"14",X"E5",X"BD",X"17",X"11",X"FA",X"40",X"09",X"C7",X"0A",X"3E",X"01",X"06",X"14",X"E5", + X"BD",X"17",X"20",X"1A",X"32",X"66",X"20",X"3A",X"32",X"66",X"E3",X"57",X"28",X"25",X"11",X"DD", + X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A",X"32",X"66",X"E3",X"77", + X"28",X"25",X"11",X"DE",X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A", + X"32",X"66",X"E3",X"4F",X"28",X"25",X"11",X"DF",X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04", + X"E5",X"BD",X"17",X"3A",X"32",X"66",X"E3",X"6F",X"28",X"25",X"11",X"F8",X"40",X"09",X"F3",X"0A", + X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A",X"32",X"66",X"E3",X"5F",X"28",X"25",X"11",X"F9", + X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A",X"32",X"66",X"E3",X"7F", + X"28",X"25",X"11",X"FA",X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"36", + X"00",X"09",X"00",X"00",X"E5",X"FD",X"04",X"18",X"02",X"E3",X"C3",X"09",X"00",X"10",X"E5",X"FD", + X"04",X"18",X"02",X"E3",X"E3",X"09",X"00",X"08",X"E5",X"FD",X"04",X"18",X"02",X"E3",X"D3",X"09", + X"00",X"18",X"E5",X"FD",X"04",X"18",X"02",X"E3",X"F3",X"3A",X"32",X"66",X"FE",X"00",X"28",X"02", + X"3E",X"80",X"9B",X"1A",X"32",X"66",X"E3",X"47",X"28",X"25",X"11",X"EC",X"40",X"09",X"F3",X"0A", + X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A",X"32",X"66",X"E3",X"67",X"28",X"25",X"11",X"ED", + X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A",X"32",X"66",X"E3",X"57", + X"28",X"25",X"11",X"EE",X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3A", + X"32",X"66",X"E3",X"77",X"28",X"25",X"11",X"EF",X"40",X"09",X"F3",X"0A",X"3E",X"01",X"06",X"04", + X"E5",X"BD",X"17",X"3A",X"32",X"66",X"FE",X"00",X"08",X"26",X"FB",X"3E",X"01",X"1A",X"00",X"50", + X"3E",X"02",X"E5",X"1F",X"17",X"C3",X"F1",X"02",X"1A",X"C0",X"50",X"30",X"FB",X"01",X"00",X"10", + X"AF",X"1A",X"C0",X"50",X"86",X"0B",X"57",X"23",X"79",X"98",X"7A",X"08",X"DF",X"FE",X"FF",X"28", + X"02",X"1F",X"E1",X"1F",X"3F",X"E1",X"20",X"CE",X"FC",X"20",X"CD",X"3E",X"11",X"E5",X"1D",X"05", + X"C9",X"CD",X"3E",X"0A",X"E5",X"1D",X"05",X"C9",X"CD",X"3E",X"44",X"E5",X"1D",X"05",X"C9",X"3E", + X"A0",X"E5",X"1D",X"05",X"E1",X"1A",X"C0",X"50",X"CD",X"CD",X"D1",X"13",X"01",X"FF",X"03",X"5F", + X"ED",X"98",X"C9",X"01",X"00",X"04",X"BE",X"C4",X"53",X"05",X"0B",X"77",X"23",X"79",X"98",X"7B", + X"08",X"DC",X"E1",X"77",X"7E",X"CE",X"27",X"57",X"7B",X"CE",X"27",X"BA",X"28",X"04",X"20",X"E3", + X"E7",X"20",X"7E",X"CE",X"D8",X"57",X"7B",X"CE",X"D8",X"BA",X"E0",X"20",X"E3",X"C7",X"20",X"7B", + X"E1",X"45",X"71",X"45",X"53",X"2C",X"43",X"67",X"50",X"71",X"52",X"61",X"47",X"60",X"54",X"08", + X"19",X"39",X"38",X"1A",X"44",X"61",X"47",X"61",X"54",X"52",X"45",X"70",X"08",X"54",X"45",X"43", + X"60",X"53",X"54",X"41",X"52",X"1A",X"C0",X"50",X"09",X"00",X"40",X"11",X"01",X"40",X"01",X"FE", + X"07",X"1E",X"40",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"00",X"64",X"11",X"01",X"64",X"01",X"FE", + X"03",X"1E",X"00",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"48",X"50",X"11",X"49",X"50",X"01",X"27", + X"00",X"1E",X"00",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"D8",X"67",X"11",X"D9",X"67",X"01",X"27", + X"00",X"1E",X"00",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"40",X"50",X"11",X"41",X"50",X"01",X"37", + X"00",X"1E",X"00",X"ED",X"98",X"09",X"52",X"64",X"11",X"53",X"64",X"01",X"67",X"00",X"1E",X"FF", + X"ED",X"98",X"09",X"15",X"0C",X"0A",X"F1",X"64",X"3A",X"80",X"50",X"47",X"CE",X"03",X"1A",X"C9", + X"64",X"09",X"79",X"0B",X"E5",X"B0",X"17",X"7E",X"1A",X"CA",X"64",X"78",X"CE",X"24",X"E3",X"3F", + X"E3",X"3F",X"09",X"1F",X"0B",X"E5",X"B0",X"17",X"7E",X"1A",X"E8",X"64",X"78",X"CE",X"18",X"09", + X"DF",X"0A",X"E5",X"B0",X"17",X"0A",X"E9",X"64",X"78",X"CE",X"18",X"E3",X"3F",X"E3",X"3F",X"E3", + X"3F",X"E3",X"3F",X"1A",X"EB",X"64",X"78",X"E3",X"5F",X"08",X"05",X"09",X"F4",X"64",X"E3",X"FE", + X"FB",X"3E",X"01",X"1A",X"00",X"50",X"E5",X"F5",X"0B",X"09",X"C2",X"43",X"11",X"C3",X"43",X"01", + X"3C",X"00",X"1E",X"40",X"ED",X"98",X"09",X"C2",X"47",X"11",X"C3",X"47",X"01",X"34",X"00",X"1E", + X"01",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"CA",X"47",X"11",X"CB",X"47",X"01",X"34",X"00",X"1E", + X"05",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"BC",X"37",X"11",X"C3",X"43",X"01",X"32",X"00",X"ED", + X"98",X"AF",X"1A",X"CC",X"43",X"1A",X"ED",X"43",X"1A",X"DE",X"43",X"09",X"7D",X"0B",X"11",X"DF", + X"64",X"01",X"3C",X"00",X"ED",X"98",X"09",X"FC",X"64",X"11",X"DA",X"43",X"E5",X"20",X"12",X"09", + X"02",X"40",X"11",X"03",X"40",X"01",X"3C",X"00",X"1E",X"40",X"ED",X"98",X"1A",X"C0",X"50",X"09", + X"02",X"44",X"11",X"03",X"44",X"01",X"34",X"00",X"1E",X"16",X"ED",X"98",X"09",X"0A",X"44",X"11", + X"0B",X"44",X"01",X"34",X"00",X"1E",X"11",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"D6",X"37",X"11", + X"27",X"40",X"01",X"06",X"00",X"ED",X"98",X"AF",X"1A",X"24",X"40",X"3A",X"C9",X"64",X"FE",X"00", + X"08",X"23",X"09",X"F4",X"37",X"11",X"24",X"40",X"01",X"21",X"00",X"ED",X"98",X"1A",X"C0",X"50", + X"09",X"42",X"65",X"11",X"43",X"65",X"01",X"FF",X"00",X"1E",X"00",X"ED",X"98",X"09",X"5E",X"32", + X"0A",X"73",X"65",X"0A",X"43",X"65",X"09",X"72",X"65",X"0A",X"62",X"65",X"09",X"A8",X"32",X"0A", + X"5E",X"65",X"0A",X"76",X"65",X"09",X"5D",X"65",X"0A",X"4D",X"65",X"09",X"F2",X"32",X"0A",X"91", + X"65",X"0A",X"79",X"65",X"09",X"90",X"65",X"0A",X"80",X"65",X"09",X"24",X"33",X"0A",X"AC",X"65", + X"0A",X"94",X"65",X"09",X"AB",X"65",X"0A",X"B3",X"65",X"09",X"3E",X"33",X"0A",X"C7",X"65",X"0A", + X"AF",X"65",X"09",X"C6",X"65",X"0A",X"9E",X"65",X"09",X"58",X"33",X"0A",X"CA",X"65",X"0A",X"E2", + X"65",X"09",X"C9",X"65",X"0A",X"D1",X"65",X"09",X"8A",X"33",X"0A",X"FD",X"65",X"0A",X"CD",X"65", + X"09",X"FC",X"65",X"0A",X"EC",X"65",X"09",X"D4",X"33",X"0A",X"30",X"66",X"0A",X"00",X"66",X"09", + X"17",X"66",X"0A",X"07",X"66",X"06",X"08",X"09",X"40",X"50",X"1E",X"00",X"0B",X"10",X"FB",X"3E", + X"00",X"1A",X"03",X"50",X"09",X"F4",X"64",X"E3",X"EE",X"3A",X"C9",X"64",X"FE",X"00",X"E2",X"D9", + X"23",X"3A",X"C8",X"64",X"FE",X"00",X"C2",X"D9",X"23",X"09",X"F3",X"64",X"E3",X"8E",X"AF",X"1A", + X"01",X"50",X"09",X"F4",X"64",X"E3",X"86",X"E5",X"DA",X"17",X"1A",X"C0",X"50",X"3E",X"40",X"E5", + X"CD",X"16",X"3E",X"50",X"E5",X"DD",X"16",X"11",X"CB",X"40",X"09",X"EA",X"08",X"3E",X"01",X"06", + X"12",X"E5",X"BD",X"17",X"3E",X"1A",X"E5",X"83",X"17",X"11",X"5F",X"44",X"09",X"D0",X"20",X"3E", + X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"35",X"47",X"09",X"D1",X"20",X"3E",X"01",X"06",X"04", + X"E5",X"D3",X"17",X"11",X"A2",X"44",X"09",X"D2",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17", + X"11",X"0E",X"46",X"09",X"D7",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"CF",X"44", + X"09",X"F1",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"A9",X"46",X"09",X"D4",X"20", + X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"A3",X"45",X"09",X"D3",X"20",X"3E",X"01",X"06", + X"04",X"E5",X"D3",X"17",X"11",X"64",X"47",X"09",X"F0",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3", + X"17",X"11",X"25",X"46",X"09",X"D1",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"6E", + X"44",X"09",X"F1",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"E7",X"46",X"09",X"D6", + X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"67",X"45",X"09",X"D5",X"20",X"3E",X"01", + X"06",X"04",X"E5",X"D3",X"17",X"11",X"19",X"46",X"09",X"D0",X"20",X"3E",X"01",X"06",X"04",X"E5", + X"D3",X"17",X"11",X"52",X"45",X"09",X"D1",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11", + X"13",X"47",X"09",X"D7",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"D4",X"44",X"09", + X"D5",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"15",X"46",X"09",X"D0",X"20",X"3E", + X"01",X"06",X"04",X"E5",X"D3",X"17",X"11",X"B8",X"46",X"09",X"D6",X"20",X"3E",X"01",X"06",X"04", + X"E5",X"D3",X"17",X"11",X"B0",X"45",X"09",X"F0",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17", + X"11",X"72",X"47",X"09",X"D2",X"20",X"3E",X"01",X"06",X"04",X"E5",X"D3",X"17",X"C3",X"F6",X"20", + X"01",X"03",X"05",X"07",X"21",X"26",X"27",X"10",X"30",X"36",X"12",X"03",X"05",X"07",X"11",X"67", + X"41",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17", + X"11",X"0E",X"42",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5", + X"83",X"17",X"11",X"E7",X"42",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E", + X"20",X"E5",X"83",X"17",X"11",X"A2",X"40",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD", + X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"15",X"42",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04", + X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"35",X"43",X"09",X"C6",X"08",X"3E",X"01", + X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"D4",X"40",X"09",X"C6",X"08", + X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"A9",X"42",X"09", + X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"72", + X"43",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17", + X"11",X"5F",X"40",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5", + X"83",X"17",X"11",X"A3",X"41",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E", + X"20",X"E5",X"83",X"17",X"11",X"64",X"43",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD", + X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"25",X"42",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04", + X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"B8",X"42",X"09",X"C6",X"08",X"3E",X"01", + X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"19",X"42",X"09",X"C6",X"08", + X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"CF",X"40",X"09", + X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"B0", + X"41",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17", + X"11",X"6E",X"40",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E",X"20",X"E5", + X"83",X"17",X"11",X"13",X"43",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD",X"17",X"3E", + X"20",X"E5",X"83",X"17",X"11",X"52",X"41",X"09",X"C6",X"08",X"3E",X"01",X"06",X"04",X"E5",X"BD", + X"17",X"3E",X"10",X"E5",X"83",X"17",X"11",X"B3",X"40",X"09",X"E2",X"08",X"3E",X"01",X"06",X"27", + X"E5",X"BD",X"17",X"3E",X"20",X"E5",X"83",X"17",X"11",X"7D",X"40",X"09",X"F1",X"08",X"3E",X"01", + X"06",X"11",X"E5",X"BD",X"17",X"3E",X"01",X"E5",X"1F",X"17",X"09",X"F3",X"64",X"E3",X"6E",X"C2", + X"D9",X"23",X"E5",X"76",X"12",X"3E",X"07",X"E5",X"1F",X"17",X"09",X"F3",X"64",X"E3",X"6E",X"C2", + X"D9",X"23",X"3E",X"40",X"E5",X"CD",X"16",X"11",X"40",X"44",X"09",X"F2",X"20",X"3E",X"13",X"06", + X"34",X"E5",X"D3",X"17",X"11",X"87",X"46",X"09",X"F4",X"20",X"3E",X"24",X"06",X"05",X"E5",X"D3", + X"17",X"11",X"52",X"44",X"09",X"F3",X"20",X"3E",X"07",X"06",X"34",X"E5",X"D3",X"17",X"11",X"70", + X"44",X"09",X"F4",X"20",X"3E",X"03",X"06",X"34",X"E5",X"D3",X"17",X"11",X"73",X"44",X"09",X"F5", + X"20",X"3E",X"03",X"06",X"34",X"E5",X"D3",X"17",X"11",X"C2",X"40",X"09",X"FC",X"08",X"3E",X"01", + X"06",X"13",X"E5",X"BD",X"17",X"11",X"61",X"41",X"09",X"27",X"09",X"3E",X"20",X"06",X"24",X"E5", + X"BD",X"17",X"11",X"14",X"41",X"09",X"6F",X"09",X"3E",X"01",X"06",X"10",X"E5",X"BD",X"17",X"11", + X"D6",X"40",X"09",X"7F",X"09",X"3E",X"01",X"06",X"15",X"E5",X"BD",X"17",X"3A",X"C9",X"64",X"FE", + X"01",X"08",X"27",X"11",X"31",X"41",X"09",X"94",X"09",X"3E",X"01",X"06",X"27",X"E5",X"BD",X"17", + X"30",X"08",X"FE",X"02",X"08",X"27",X"11",X"31",X"41",X"09",X"8B",X"09",X"3E",X"01",X"06",X"27", + X"E5",X"BD",X"17",X"30",X"25",X"11",X"31",X"41",X"09",X"9A",X"09",X"3E",X"01",X"06",X"27",X"E5", + X"BD",X"17",X"11",X"B4",X"40",X"09",X"C1",X"09",X"3E",X"01",X"06",X"31",X"E5",X"BD",X"17",X"3A", + X"EB",X"64",X"FE",X"00",X"08",X"27",X"11",X"7C",X"41",X"09",X"F2",X"09",X"3E",X"01",X"06",X"06", + X"E5",X"BD",X"17",X"30",X"1B",X"FE",X"01",X"08",X"27",X"11",X"7C",X"41",X"09",X"C8",X"09",X"3E", + X"01",X"06",X"06",X"E5",X"BD",X"17",X"30",X"08",X"FE",X"02",X"08",X"27",X"11",X"7C",X"41",X"09", + X"CE",X"09",X"3E",X"01",X"06",X"05",X"E5",X"BD",X"17",X"30",X"25",X"11",X"7C",X"41",X"09",X"EB", + X"09",X"3E",X"01",X"06",X"05",X"E5",X"BD",X"17",X"3E",X"C2",X"1A",X"4E",X"41",X"3E",X"7C",X"1A", + X"AA",X"64",X"3E",X"3B",X"1A",X"AB",X"64",X"3E",X"14",X"1A",X"AC",X"64",X"3E",X"21",X"1A",X"AD", + X"64",X"3E",X"04",X"E5",X"1F",X"17",X"AF",X"1A",X"AA",X"64",X"09",X"F3",X"64",X"E3",X"6E",X"08", + X"40",X"E5",X"C9",X"0B",X"E5",X"D5",X"0B",X"E5",X"E9",X"0B",X"E5",X"F1",X"0B",X"E5",X"ED",X"0B", + X"AF",X"1A",X"75",X"65",X"1A",X"78",X"65",X"1A",X"93",X"65",X"1A",X"AE",X"65",X"1A",X"E1",X"65", + X"1A",X"CC",X"65",X"1A",X"FF",X"65",X"E5",X"FD",X"17",X"1A",X"C0",X"50",X"09",X"F3",X"64",X"E3", + X"6E",X"08",X"26",X"09",X"F4",X"64",X"E3",X"66",X"08",X"02",X"30",X"E6",X"E3",X"A6",X"C3",X"8F", + X"07",X"E5",X"DA",X"17",X"09",X"F3",X"64",X"E3",X"CE",X"E3",X"AE",X"09",X"F4",X"64",X"E3",X"A6", + X"E3",X"96",X"E3",X"B6",X"09",X"F5",X"64",X"E3",X"96",X"09",X"F4",X"64",X"E3",X"C6",X"09",X"52", + X"64",X"11",X"53",X"64",X"01",X"67",X"00",X"1E",X"FF",X"ED",X"98",X"3E",X"FF",X"1A",X"01",X"50", + X"09",X"F5",X"64",X"E3",X"56",X"08",X"27",X"3A",X"41",X"65",X"3C",X"1A",X"41",X"65",X"FE",X"14", + X"08",X"04",X"E3",X"D6",X"E3",X"F6",X"00",X"1A",X"C0",X"50",X"3E",X"40",X"E5",X"CD",X"16",X"3E", + X"01",X"E5",X"DD",X"16",X"3A",X"C9",X"64",X"FE",X"00",X"E2",X"E4",X"24",X"3A",X"C8",X"64",X"FE", + X"02",X"18",X"64",X"11",X"58",X"41",X"09",X"CD",X"37",X"3E",X"01",X"06",X"23",X"E5",X"BD",X"17", + X"3A",X"40",X"50",X"E3",X"6F",X"08",X"5C",X"3A",X"C9",X"64",X"FE",X"00",X"28",X"15",X"3A",X"C8", + X"64",X"FE",X"02",X"38",X"4E",X"D6",X"02",X"1A",X"C8",X"64",X"3A",X"CB",X"64",X"D6",X"01",X"0F", + X"1A",X"CB",X"64",X"09",X"F4",X"64",X"E3",X"CE",X"3A",X"E8",X"64",X"1A",X"EC",X"64",X"E5",X"13", + X"00",X"3A",X"C9",X"64",X"FE",X"00",X"E2",X"0F",X"25",X"E5",X"05",X"17",X"C3",X"0F",X"25",X"FE", + X"04",X"18",X"29",X"11",X"26",X"41",X"09",X"D8",X"37",X"3E",X"01",X"06",X"11",X"E5",X"BD",X"17", + X"11",X"10",X"42",X"09",X"01",X"08",X"3E",X"01",X"06",X"02",X"E5",X"BD",X"17",X"11",X"5A",X"41", + X"09",X"CD",X"37",X"3E",X"01",X"06",X"23",X"E5",X"BD",X"17",X"30",X"94",X"11",X"90",X"40",X"09", + X"03",X"08",X"3E",X"01",X"06",X"31",X"E5",X"BD",X"17",X"30",X"85",X"3A",X"40",X"50",X"E3",X"5F", + X"08",X"1B",X"3A",X"C9",X"64",X"FE",X"00",X"28",X"15",X"3A",X"C8",X"64",X"FE",X"04",X"38",X"0D", + X"D6",X"04",X"1A",X"C8",X"64",X"3A",X"CB",X"64",X"D6",X"02",X"0F",X"1A",X"CB",X"64",X"09",X"F4", + X"64",X"E3",X"8E",X"3A",X"E8",X"64",X"1A",X"EC",X"64",X"1A",X"ED",X"64",X"E5",X"13",X"00",X"E5", + X"0C",X"00",X"C3",X"91",X"24",X"1A",X"C0",X"50",X"09",X"F3",X"64",X"E3",X"5E",X"08",X"03",X"C3", + X"48",X"24",X"E3",X"9E",X"C3",X"1F",X"24",X"AF",X"09",X"EE",X"64",X"11",X"EF",X"64",X"01",X"05", + X"00",X"5F",X"ED",X"98",X"1A",X"DD",X"64",X"1A",X"DE",X"64",X"3E",X"40",X"09",X"CC",X"43",X"11", + X"CD",X"43",X"01",X"05",X"00",X"5F",X"ED",X"98",X"09",X"DE",X"43",X"11",X"DF",X"43",X"01",X"05", + X"00",X"5F",X"ED",X"98",X"AF",X"1A",X"CC",X"43",X"1A",X"DE",X"43",X"E5",X"CD",X"0B",X"E5",X"05", + X"0C",X"09",X"F5",X"64",X"E3",X"E6",X"09",X"F4",X"64",X"E3",X"4E",X"28",X"02",X"30",X"32",X"3E", + X"00",X"1A",X"03",X"50",X"E5",X"2C",X"17",X"11",X"50",X"41",X"09",X"34",X"08",X"3E",X"01",X"06", + X"25",X"E5",X"BD",X"17",X"3E",X"03",X"E5",X"1F",X"17",X"09",X"F4",X"64",X"E3",X"EE",X"3A",X"EC", + X"64",X"3D",X"1A",X"EC",X"64",X"3E",X"40",X"09",X"16",X"40",X"11",X"17",X"40",X"01",X"20",X"00", + X"5F",X"ED",X"98",X"E5",X"13",X"00",X"E5",X"F9",X"0B",X"C3",X"0F",X"26",X"09",X"F4",X"64",X"E3", + X"4E",X"08",X"D6",X"E3",X"6E",X"28",X"B8",X"3A",X"F4",X"64",X"E3",X"7F",X"08",X"1F",X"E5",X"2C", + X"17",X"11",X"50",X"41",X"09",X"29",X"08",X"3E",X"01",X"06",X"25",X"E5",X"BD",X"17",X"3E",X"03", + X"E5",X"1F",X"17",X"09",X"F4",X"64",X"E3",X"AE",X"3A",X"ED",X"64",X"3D",X"1A",X"ED",X"64",X"3E", + X"40",X"09",X"02",X"40",X"11",X"03",X"40",X"01",X"20",X"00",X"5F",X"ED",X"98",X"E5",X"0C",X"00", + X"E5",X"01",X"0C",X"30",X"1A",X"3E",X"01",X"1A",X"03",X"50",X"30",X"C2",X"E5",X"2C",X"17",X"09", + X"F4",X"64",X"E3",X"4E",X"08",X"A0",X"11",X"10",X"41",X"09",X"1E",X"08",X"3E",X"01",X"06",X"11", + X"E5",X"BD",X"17",X"09",X"75",X"65",X"E3",X"C6",X"3E",X"01",X"E5",X"1F",X"17",X"09",X"F4",X"64", + X"E3",X"6E",X"28",X"9C",X"C3",X"A6",X"25",X"E5",X"E9",X"0B",X"09",X"F5",X"64",X"E3",X"66",X"28", + X"13",X"E3",X"A6",X"09",X"FF",X"65",X"E3",X"C6",X"1A",X"C0",X"50",X"3A",X"FF",X"65",X"FE",X"00", + X"08",X"DE",X"30",X"05",X"3E",X"02",X"E5",X"1F",X"17",X"09",X"CC",X"65",X"E3",X"C6",X"E5",X"ED", + X"0B",X"E5",X"FD",X"17",X"09",X"F4",X"64",X"E3",X"66",X"28",X"DB",X"E3",X"A6",X"3E",X"01",X"E5", + X"1F",X"17",X"E5",X"DA",X"17",X"09",X"F4",X"64",X"E3",X"56",X"08",X"27",X"E5",X"D9",X"0B",X"E5", + X"DA",X"17",X"09",X"F4",X"64",X"E3",X"76",X"08",X"21",X"30",X"37",X"E3",X"96",X"E5",X"11",X"0C", + X"30",X"EA",X"E3",X"B6",X"09",X"F5",X"64",X"E3",X"E6",X"09",X"F4",X"64",X"E3",X"6E",X"08",X"05", + X"E5",X"25",X"0C",X"30",X"92",X"E5",X"21",X"0C",X"30",X"A5",X"3A",X"DC",X"64",X"FE",X"00",X"08", + X"2E",X"09",X"F4",X"64",X"E3",X"6E",X"08",X"2F",X"3A",X"ED",X"64",X"FE",X"00",X"08",X"66",X"E5", + X"2C",X"17",X"11",X"90",X"41",X"09",X"47",X"08",X"3E",X"01",X"06",X"21",X"E5",X"BD",X"17",X"3E", + X"02",X"E5",X"1F",X"17",X"E5",X"D6",X"13",X"09",X"F3",X"64",X"E3",X"DE",X"C3",X"7F",X"07",X"D6", + X"01",X"1A",X"DC",X"64",X"C3",X"FC",X"25",X"3A",X"EC",X"64",X"FE",X"00",X"08",X"0D",X"09",X"F4", + X"64",X"E3",X"4E",X"08",X"E2",X"E5",X"2C",X"17",X"11",X"D8",X"40",X"09",X"50",X"08",X"3E",X"01", + X"06",X"14",X"E5",X"BD",X"17",X"3E",X"03",X"E5",X"1F",X"17",X"C3",X"9F",X"25",X"E5",X"FD",X"0B", + X"C3",X"AC",X"25",X"E5",X"DD",X"0B",X"C3",X"AC",X"25",X"2A",X"D7",X"64",X"EB",X"F5",X"09",X"00", + X"00",X"F5",X"31",X"F5",X"7E",X"01",X"F5",X"86",X"02",X"47",X"CE",X"27",X"F5",X"5F",X"02",X"E3", + X"38",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"F5",X"7E",X"00",X"09",X"1F",X"27",X"E3",X"0F",X"E5", + X"B0",X"17",X"76",X"0B",X"56",X"EB",X"E9",X"43",X"27",X"43",X"27",X"44",X"27",X"64",X"27",X"54", + X"27",X"74",X"27",X"E1",X"F5",X"7E",X"04",X"90",X"F5",X"5F",X"04",X"E1",X"F5",X"7E",X"04",X"80", + X"F5",X"5F",X"04",X"E1",X"F5",X"7E",X"03",X"80",X"F5",X"5F",X"03",X"E1",X"F5",X"7E",X"03",X"90", + X"F5",X"5F",X"03",X"E1",X"2A",X"8C",X"64",X"EB",X"F5",X"09",X"00",X"00",X"F5",X"31",X"EB",X"01", + X"00",X"64",X"1F",X"3F",X"ED",X"42",X"CD",X"F5",X"7E",X"00",X"09",X"87",X"27",X"E3",X"0F",X"E5", + X"B0",X"17",X"76",X"0B",X"56",X"EB",X"E9",X"57",X"10",X"93",X"27",X"D6",X"27",X"4E",X"10",X"58", + X"10",X"83",X"10",X"F5",X"7E",X"03",X"1A",X"8A",X"64",X"F5",X"7E",X"04",X"1A",X"8B",X"64",X"E5", + X"ED",X"10",X"F5",X"7E",X"06",X"12",X"3A",X"50",X"64",X"FE",X"00",X"08",X"17",X"3A",X"51",X"64", + X"FE",X"00",X"08",X"17",X"C1",X"09",X"52",X"64",X"21",X"CD",X"D1",X"13",X"01",X"05",X"00",X"1E", + X"FF",X"ED",X"98",X"E1",X"F5",X"7E",X"06",X"13",X"12",X"30",X"E9",X"F5",X"7E",X"06",X"09",X"08", + X"00",X"31",X"EB",X"12",X"30",X"F6",X"E5",X"15",X"11",X"F5",X"7E",X"03",X"90",X"1A",X"8A",X"64", + X"F5",X"7E",X"04",X"1A",X"8B",X"64",X"E5",X"ED",X"10",X"3A",X"50",X"64",X"FE",X"00",X"28",X"1A", + X"3A",X"50",X"64",X"E3",X"0F",X"F5",X"46",X"05",X"80",X"3D",X"C1",X"FD",X"09",X"52",X"64",X"FD", + X"21",X"FD",X"5B",X"00",X"FD",X"5A",X"01",X"FD",X"5F",X"02",X"3C",X"13",X"FD",X"5B",X"03",X"FD", + X"5A",X"04",X"FD",X"5F",X"05",X"3A",X"8A",X"64",X"F5",X"5F",X"03",X"3A",X"8B",X"64",X"F5",X"5F", + X"04",X"E1",X"3A",X"51",X"64",X"FE",X"00",X"E2",X"A4",X"10",X"3A",X"51",X"64",X"E3",X"0F",X"C6", + X"27",X"F5",X"46",X"05",X"80",X"C1",X"FD",X"09",X"52",X"64",X"FD",X"21",X"FD",X"5B",X"00",X"FD", + X"5A",X"01",X"FD",X"5F",X"02",X"3C",X"09",X"08",X"00",X"31",X"EB",X"FD",X"5B",X"03",X"FD",X"5A", + X"04",X"FD",X"5F",X"05",X"C3",X"15",X"10",X"F5",X"7E",X"03",X"1A",X"8A",X"64",X"F5",X"7E",X"04", + X"1A",X"8B",X"64",X"C3",X"CE",X"27",X"E5",X"15",X"11",X"F5",X"7E",X"03",X"80",X"C3",X"F5",X"27", + X"E5",X"15",X"11",X"F5",X"7E",X"04",X"90",X"1A",X"8B",X"64",X"F5",X"7E",X"03",X"1A",X"8A",X"64", + X"C3",X"CE",X"27",X"E5",X"15",X"11",X"F5",X"7E",X"04",X"80",X"30",X"EB",X"F5",X"7E",X"05",X"C1", + X"FD",X"09",X"52",X"64",X"FD",X"21",X"FD",X"5B",X"00",X"FD",X"5A",X"01",X"FD",X"5F",X"02",X"3A", + X"8A",X"64",X"F5",X"5F",X"03",X"3A",X"8B",X"64",X"F5",X"5F",X"04",X"F5",X"7E",X"00",X"09",X"C0", + X"10",X"E3",X"0F",X"E5",X"B0",X"17",X"D5",X"76",X"0B",X"56",X"EB",X"D1",X"F5",X"7E",X"06",X"E9", + X"E4",X"10",X"E4",X"10",X"E5",X"10",X"F0",X"10",X"F3",X"10",X"CA",X"10",X"E1",X"13",X"FD",X"5B", + X"03",X"FD",X"5A",X"04",X"FD",X"5F",X"05",X"E1",X"33",X"30",X"DB",X"09",X"08",X"00",X"31",X"EB", + X"30",X"EC",X"EB",X"11",X"08",X"00",X"1F",X"3F",X"ED",X"52",X"EB",X"30",X"C9",X"3A",X"8A",X"64", + X"CE",X"07",X"1A",X"50",X"64",X"3A",X"8B",X"64",X"CE",X"07",X"1A",X"51",X"64",X"3A",X"8A",X"64", + X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"57",X"3A",X"8B",X"64",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F", + X"77",X"E5",X"C7",X"16",X"E1",X"F5",X"7E",X"01",X"F5",X"86",X"02",X"47",X"CE",X"27",X"F5",X"5F", + X"02",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E1",X"D5",X"1F",X"3F",X"09",X"26",X"01", + X"16",X"00",X"ED",X"52",X"7D",X"1F",X"3F",X"09",X"10",X"01",X"D1",X"72",X"16",X"00",X"ED",X"52", + X"55",X"77",X"E1",X"7D",X"EE",X"03",X"6F",X"E1",X"09",X"F4",X"64",X"E3",X"46",X"E0",X"E3",X"6E", + X"28",X"43",X"09",X"EE",X"64",X"7B",X"86",X"0F",X"5F",X"0B",X"7A",X"A6",X"0F",X"5F",X"0B",X"3E", + X"00",X"A6",X"0F",X"5F",X"38",X"02",X"30",X"1A",X"09",X"F4",X"64",X"E3",X"6E",X"28",X"13",X"09", + X"DE",X"43",X"11",X"DF",X"43",X"01",X"05",X"00",X"1E",X"40",X"ED",X"98",X"AF",X"1A",X"DE",X"43", + X"30",X"30",X"09",X"CC",X"43",X"11",X"CD",X"43",X"01",X"05",X"00",X"1E",X"40",X"ED",X"98",X"AF", + X"1A",X"CC",X"43",X"30",X"05",X"09",X"D9",X"64",X"30",X"BB",X"09",X"F4",X"64",X"E3",X"6E",X"28", + X"74",X"09",X"D8",X"64",X"11",X"FB",X"43",X"3A",X"DD",X"64",X"DD",X"E5",X"20",X"12",X"0B",X"0B", + X"0B",X"EB",X"2A",X"E9",X"64",X"D9",X"FE",X"04",X"D0",X"E3",X"0F",X"E3",X"0F",X"3C",X"3C",X"E5", + X"B0",X"17",X"E5",X"A4",X"13",X"D0",X"3A",X"DC",X"64",X"3C",X"1A",X"DC",X"64",X"09",X"75",X"65", + X"E3",X"C6",X"09",X"F4",X"64",X"E3",X"6E",X"28",X"12",X"3A",X"DD",X"64",X"3C",X"1A",X"DD",X"64", + X"3A",X"EC",X"64",X"3C",X"1A",X"EC",X"64",X"E5",X"13",X"00",X"E1",X"3A",X"DE",X"64",X"3C",X"1A", + X"DE",X"64",X"3A",X"ED",X"64",X"3C",X"1A",X"ED",X"64",X"E5",X"0C",X"00",X"E1",X"09",X"DB",X"64", + X"11",X"E9",X"43",X"3A",X"DE",X"64",X"30",X"8A",X"3E",X"03",X"DD",X"7E",X"CE",X"D8",X"E3",X"3F", + X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"47",X"3A",X"F4",X"64",X"E3",X"5F",X"28",X"0A",X"78",X"12", + X"33",X"7E",X"CE",X"27",X"47",X"3A",X"F4",X"64",X"E3",X"5F",X"1A",X"F4",X"64",X"28",X"08",X"78", + X"12",X"2B",X"33",X"D9",X"3D",X"08",X"D3",X"3A",X"F4",X"64",X"E3",X"9F",X"1A",X"F4",X"64",X"E1", + X"78",X"FE",X"00",X"28",X"F3",X"3A",X"F4",X"64",X"E3",X"DF",X"1A",X"F4",X"64",X"30",X"E7",X"78", + X"FE",X"00",X"28",X"F5",X"3A",X"F4",X"64",X"E3",X"DF",X"1A",X"F4",X"64",X"30",X"D1",X"09",X"F5", + X"64",X"E3",X"76",X"28",X"2C",X"E3",X"B6",X"09",X"40",X"40",X"E5",X"83",X"12",X"FE",X"09",X"08", + X"24",X"09",X"40",X"44",X"E5",X"83",X"12",X"FE",X"98",X"08",X"02",X"30",X"14",X"AF",X"1A",X"C9", + X"64",X"30",X"26",X"AF",X"11",X"80",X"03",X"86",X"0B",X"33",X"47",X"7A",X"9B",X"78",X"08",X"DF", + X"E1",X"00",X"3E",X"40",X"E5",X"CD",X"16",X"3E",X"05",X"E5",X"DD",X"16",X"11",X"29",X"45",X"09", + X"D0",X"12",X"3E",X"15",X"06",X"23",X"E5",X"D3",X"17",X"11",X"45",X"41",X"09",X"4C",X"08",X"3E", + X"01",X"06",X"24",X"E5",X"BD",X"17",X"09",X"3C",X"0B",X"11",X"E2",X"42",X"01",X"FF",X"21",X"ED", + X"88",X"13",X"10",X"FB",X"AF",X"12",X"E5",X"EA",X"17",X"3E",X"01",X"12",X"E5",X"D1",X"12",X"E1", + X"01",X"09",X"DF",X"64",X"11",X"6A",X"42",X"E5",X"11",X"13",X"11",X"6C",X"42",X"E5",X"11",X"13", + X"11",X"6E",X"42",X"E5",X"11",X"13",X"11",X"58",X"42",X"E5",X"11",X"13",X"11",X"5A",X"42",X"E5", + X"11",X"13",X"11",X"5C",X"42",X"E5",X"11",X"13",X"11",X"5E",X"42",X"E5",X"11",X"13",X"11",X"78", + X"42",X"E5",X"11",X"13",X"11",X"7A",X"42",X"E5",X"11",X"13",X"11",X"7C",X"42",X"E5",X"11",X"13", + X"E1",X"06",X"03",X"26",X"27",X"3E",X"09",X"ED",X"88",X"E5",X"99",X"17",X"10",X"DF",X"0B",X"0B", + X"3E",X"40",X"E5",X"99",X"17",X"E5",X"2E",X"13",X"3E",X"04",X"E5",X"B0",X"17",X"E1",X"3E",X"03", + X"DD",X"7E",X"CE",X"D8",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"47",X"3A",X"F4",X"64", + X"E3",X"5F",X"28",X"2A",X"78",X"12",X"3E",X"08",X"E5",X"99",X"17",X"7E",X"CE",X"27",X"47",X"3A", + X"F4",X"64",X"E3",X"5F",X"1A",X"F4",X"64",X"28",X"0C",X"78",X"12",X"2B",X"3E",X"08",X"E5",X"99", + X"17",X"D9",X"3D",X"08",X"E3",X"3A",X"F4",X"64",X"E3",X"9F",X"1A",X"F4",X"64",X"E1",X"78",X"FE", + X"00",X"28",X"D3",X"3A",X"F4",X"64",X"E3",X"DF",X"1A",X"F4",X"64",X"30",X"C7",X"78",X"FE",X"00", + X"28",X"F1",X"3A",X"F4",X"64",X"E3",X"DF",X"1A",X"F4",X"64",X"30",X"E5",X"06",X"03",X"32",X"BE", + X"38",X"20",X"08",X"26",X"2B",X"33",X"10",X"DE",X"30",X"06",X"E5",X"8F",X"13",X"1F",X"3F",X"E1", + X"1F",X"E1",X"E5",X"8F",X"13",X"1F",X"E1",X"78",X"FE",X"00",X"E0",X"2B",X"33",X"3D",X"08",X"FB", + X"E1",X"6E",X"45",X"71",X"45",X"53",X"2C",X"43",X"67",X"50",X"71",X"52",X"61",X"47",X"60",X"54", + X"08",X"19",X"39",X"38",X"1A",X"44",X"61",X"47",X"61",X"54",X"52",X"45",X"70",X"08",X"54",X"45", + X"43",X"60",X"53",X"54",X"41",X"52",X"09",X"F4",X"64",X"E3",X"EE",X"09",X"EE",X"64",X"11",X"39", + X"65",X"01",X"03",X"00",X"ED",X"98",X"E5",X"00",X"14",X"09",X"F4",X"64",X"E3",X"4E",X"C0",X"E3", + X"AE",X"09",X"D9",X"64",X"11",X"39",X"65",X"01",X"03",X"00",X"ED",X"98",X"E5",X"00",X"14",X"E1", + X"01",X"00",X"22",X"09",X"1D",X"65",X"11",X"3B",X"65",X"2B",X"2B",X"2B",X"C5",X"E5",X"A4",X"13", + X"C1",X"18",X"22",X"3E",X"06",X"81",X"67",X"10",X"ED",X"2B",X"2B",X"30",X"20",X"79",X"FE",X"00", + X"E0",X"0B",X"0B",X"0B",X"0B",X"C5",X"CD",X"06",X"00",X"09",X"1A",X"65",X"11",X"38",X"65",X"ED", + X"B8",X"3E",X"40",X"E5",X"CD",X"16",X"09",X"F4",X"64",X"E3",X"6E",X"08",X"33",X"11",X"4A",X"41", + X"09",X"2C",X"08",X"3E",X"01",X"06",X"22",X"E5",X"BD",X"17",X"09",X"F4",X"64",X"E3",X"7E",X"28", + X"31",X"3E",X"01",X"1A",X"03",X"50",X"30",X"12",X"11",X"4A",X"41",X"09",X"37",X"08",X"3E",X"01", + X"06",X"22",X"E5",X"BD",X"17",X"3E",X"00",X"1A",X"03",X"50",X"11",X"40",X"44",X"09",X"C3",X"16", + X"3E",X"23",X"06",X"34",X"E5",X"D3",X"17",X"11",X"64",X"44",X"09",X"C4",X"16",X"3E",X"03",X"06", + X"34",X"E5",X"D3",X"17",X"11",X"51",X"44",X"09",X"C5",X"16",X"3E",X"10",X"06",X"34",X"E5",X"D3", + X"17",X"11",X"50",X"44",X"09",X"C6",X"16",X"3E",X"02",X"06",X"34",X"E5",X"D3",X"17",X"D1",X"D5", + X"3E",X"40",X"D5",X"C9",X"13",X"01",X"03",X"00",X"5F",X"ED",X"98",X"1E",X"00",X"01",X"02",X"00", + X"ED",X"98",X"D1",X"C1",X"D5",X"78",X"09",X"B9",X"0B",X"E3",X"0F",X"E5",X"B0",X"17",X"66",X"0B", + X"46",X"C5",X"09",X"80",X"04",X"21",X"26",X"01",X"06",X"27",X"59",X"3E",X"08",X"E5",X"8F",X"17", + X"10",X"F8",X"11",X"C3",X"40",X"09",X"58",X"08",X"3E",X"01",X"06",X"14",X"E5",X"BD",X"17",X"11", + X"8D",X"41",X"09",X"84",X"08",X"3E",X"01",X"06",X"07",X"E5",X"BD",X"17",X"11",X"8F",X"40",X"09", + X"A3",X"08",X"3E",X"01",X"06",X"16",X"E5",X"BD",X"17",X"11",X"A8",X"40",X"09",X"89",X"08",X"3E", + X"01",X"06",X"16",X"E5",X"BD",X"17",X"11",X"69",X"42",X"09",X"9F",X"08",X"3E",X"01",X"06",X"20", + X"E5",X"BD",X"17",X"11",X"64",X"40",X"09",X"BF",X"08",X"3E",X"03",X"06",X"01",X"E5",X"BD",X"17", + X"11",X"A5",X"40",X"09",X"77",X"0B",X"3E",X"01",X"06",X"32",X"E5",X"BD",X"17",X"3E",X"01",X"11", + X"AD",X"47",X"12",X"AF",X"1A",X"3D",X"65",X"1A",X"3E",X"65",X"09",X"AD",X"47",X"0A",X"3F",X"65", + X"11",X"59",X"41",X"09",X"4C",X"08",X"3E",X"01",X"06",X"24",X"E5",X"BD",X"17",X"09",X"3C",X"0B", + X"11",X"DC",X"42",X"01",X"21",X"00",X"ED",X"98",X"AF",X"12",X"E5",X"EA",X"17",X"3E",X"01",X"12", + X"09",X"DF",X"64",X"11",X"94",X"42",X"E5",X"11",X"13",X"11",X"95",X"42",X"E5",X"11",X"13",X"11", + X"96",X"42",X"E5",X"11",X"13",X"11",X"97",X"42",X"E5",X"11",X"13",X"11",X"B0",X"42",X"E5",X"11", + X"13",X"11",X"B1",X"42",X"E5",X"11",X"13",X"11",X"B2",X"42",X"E5",X"11",X"13",X"11",X"B3",X"42", + X"E5",X"11",X"13",X"11",X"B4",X"42",X"E5",X"11",X"13",X"11",X"B5",X"42",X"E5",X"11",X"13",X"3A", + X"3C",X"65",X"E3",X"67",X"E2",X"2B",X"16",X"E3",X"57",X"E2",X"4B",X"16",X"3A",X"3C",X"65",X"E3", + X"4F",X"C2",X"8C",X"16",X"3A",X"3D",X"65",X"FE",X"33",X"28",X"37",X"09",X"45",X"0B",X"E5",X"B0", + X"17",X"7E",X"C9",X"D1",X"12",X"13",X"5F",X"3E",X"08",X"E5",X"8F",X"17",X"D5",X"CD",X"3A",X"3E", + X"65",X"3C",X"1A",X"3E",X"65",X"FE",X"03",X"C2",X"9F",X"16",X"09",X"E5",X"0B",X"3A",X"3E",X"65", + X"E5",X"B0",X"17",X"7E",X"C9",X"D1",X"CD",X"E5",X"B5",X"17",X"09",X"39",X"65",X"01",X"03",X"00", + X"ED",X"98",X"3A",X"3E",X"65",X"FE",X"00",X"28",X"0D",X"09",X"D1",X"0B",X"E5",X"B0",X"17",X"7E", + X"D1",X"E5",X"99",X"17",X"09",X"3B",X"65",X"E5",X"2E",X"13",X"09",X"FC",X"64",X"11",X"DA",X"43", + X"E5",X"20",X"12",X"09",X"F5",X"64",X"E3",X"86",X"3E",X"01",X"E5",X"1F",X"17",X"E1",X"D1",X"3E", + X"80",X"E5",X"99",X"17",X"3E",X"08",X"E5",X"99",X"17",X"30",X"F1",X"3A",X"3D",X"65",X"FE",X"00", + X"E2",X"AC",X"15",X"3D",X"1A",X"3D",X"65",X"FE",X"32",X"28",X"14",X"3E",X"05",X"2A",X"3F",X"65", + X"5F",X"3E",X"08",X"E5",X"B0",X"17",X"0A",X"3F",X"65",X"3E",X"01",X"5F",X"C3",X"AC",X"15",X"3D", + X"1A",X"3D",X"65",X"3E",X"05",X"2A",X"3F",X"65",X"2B",X"5F",X"0B",X"5F",X"0B",X"5F",X"2B",X"3E", + X"40",X"30",X"C8",X"3A",X"3D",X"65",X"FE",X"33",X"E2",X"AC",X"15",X"3C",X"1A",X"3D",X"65",X"FE", + X"32",X"28",X"14",X"3E",X"05",X"2A",X"3F",X"65",X"5F",X"3E",X"08",X"E5",X"8F",X"17",X"0A",X"3F", + X"65",X"3E",X"01",X"5F",X"C3",X"AC",X"15",X"3C",X"1A",X"3D",X"65",X"3E",X"05",X"2A",X"3F",X"65", + X"5F",X"3E",X"40",X"E5",X"8F",X"17",X"0A",X"3F",X"65",X"3E",X"01",X"2B",X"5F",X"0B",X"5F",X"0B", + X"5F",X"C3",X"AC",X"15",X"3E",X"20",X"E5",X"83",X"17",X"1A",X"C0",X"50",X"06",X"14",X"E5",X"67", + X"17",X"F2",X"F2",X"15",X"C3",X"B7",X"15",X"3A",X"3C",X"65",X"E3",X"4F",X"1A",X"C0",X"50",X"28", + X"DE",X"30",X"CE",X"07",X"05",X"05",X"01",X"D5",X"AF",X"E3",X"0B",X"17",X"E3",X"0B",X"17",X"E3", + X"0B",X"17",X"E3",X"0B",X"17",X"E3",X"0B",X"17",X"57",X"EB",X"01",X"40",X"40",X"21",X"06",X"00", + X"D1",X"62",X"21",X"EB",X"E1",X"09",X"40",X"40",X"11",X"41",X"40",X"01",X"7F",X"03",X"5F",X"ED", + X"98",X"1A",X"C0",X"50",X"E1",X"09",X"40",X"44",X"11",X"41",X"44",X"01",X"7F",X"03",X"5F",X"ED", + X"98",X"1A",X"C0",X"50",X"E1",X"3A",X"C9",X"64",X"FE",X"00",X"E0",X"3A",X"CB",X"64",X"CE",X"D8", + X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"FE",X"00",X"28",X"24",X"1A",X"25",X"40",X"3A", + X"CB",X"64",X"CE",X"27",X"1A",X"24",X"40",X"E1",X"3E",X"40",X"30",X"D8",X"3E",X"35",X"E5",X"DD", + X"16",X"3E",X"40",X"E5",X"CD",X"16",X"E1",X"47",X"AF",X"1A",X"CC",X"64",X"1A",X"CE",X"64",X"3A", + X"CE",X"64",X"B8",X"E0",X"09",X"F3",X"64",X"E3",X"6E",X"C0",X"1A",X"C0",X"50",X"30",X"D8",X"3A", + X"F5",X"64",X"E3",X"47",X"28",X"25",X"3A",X"CF",X"64",X"47",X"3A",X"CE",X"64",X"B8",X"18",X"31", + X"1F",X"3F",X"E1",X"78",X"1A",X"CF",X"64",X"3A",X"F5",X"64",X"E3",X"C7",X"1A",X"F5",X"64",X"AF", + X"1A",X"CE",X"64",X"1A",X"CC",X"64",X"1F",X"3F",X"E1",X"3A",X"F5",X"64",X"E3",X"87",X"1A",X"F5", + X"64",X"1F",X"E1",X"47",X"AF",X"1A",X"CD",X"64",X"3A",X"CD",X"64",X"B8",X"E0",X"09",X"F3",X"64", + X"E3",X"6E",X"C0",X"1A",X"C0",X"50",X"30",X"D8",X"85",X"6F",X"D0",X"0C",X"E1",X"83",X"77",X"D0", + X"14",X"E1",X"81",X"67",X"D0",X"04",X"E1",X"D5",X"16",X"00",X"77",X"1F",X"3F",X"ED",X"52",X"D1", + X"E1",X"CD",X"EB",X"16",X"00",X"77",X"1F",X"3F",X"ED",X"52",X"EB",X"C9",X"E1",X"1A",X"8E",X"64", + X"D5",X"3A",X"8E",X"64",X"67",X"ED",X"88",X"79",X"FE",X"00",X"08",X"F9",X"D1",X"E5",X"EA",X"17", + X"10",X"EE",X"E1",X"1A",X"8E",X"64",X"D5",X"3A",X"8E",X"64",X"67",X"ED",X"88",X"2B",X"79",X"FE", + X"00",X"08",X"F8",X"D1",X"E5",X"EA",X"17",X"10",X"ED",X"E1",X"CD",X"09",X"08",X"00",X"31",X"EB", + X"C9",X"E1",X"09",X"8F",X"64",X"06",X"2F",X"1E",X"00",X"0B",X"10",X"FB",X"E1",X"09",X"F3",X"64", + X"E3",X"FE",X"E3",X"7E",X"E0",X"1A",X"C0",X"50",X"30",X"F8",X"3A",X"00",X"50",X"CE",X"27",X"47", + X"3A",X"40",X"50",X"CE",X"D8",X"98",X"1A",X"3C",X"65",X"E1",X"3A",X"40",X"50",X"47",X"CE",X"27", + X"E3",X"78",X"28",X"02",X"E3",X"CF",X"1A",X"3C",X"65",X"E1",X"F5",X"09",X"42",X"65",X"F5",X"E3", + X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28",X"10",X"E5",X"4B",X"31",X"FD",X"09", + X"51",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"45",X"50",X"F5",X"09",X"75",X"65",X"F5", + X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28",X"10",X"E5",X"4B",X"31",X"FD", + X"09",X"51",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"45",X"50",X"F5",X"09",X"78",X"65", + X"F5",X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28",X"10",X"E5",X"4B",X"31", + X"FD",X"09",X"51",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"45",X"50",X"F5",X"09",X"93", + X"65",X"F5",X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28",X"10",X"E5",X"4B", + X"31",X"FD",X"09",X"56",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"62",X"50",X"F5",X"09", + X"AE",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28",X"10",X"E5", + X"4B",X"31",X"FD",X"09",X"56",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"62",X"50",X"F5", + X"09",X"E1",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28",X"10", + X"E5",X"4B",X"31",X"FD",X"09",X"56",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"62",X"50", + X"F5",X"09",X"CC",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56",X"28", + X"10",X"E5",X"4B",X"31",X"FD",X"09",X"73",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"67", + X"50",X"F5",X"09",X"FF",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"73",X"31",X"F5",X"E3",X"00",X"56", + X"E0",X"E5",X"4B",X"31",X"FD",X"09",X"73",X"50",X"E5",X"1A",X"31",X"F5",X"7E",X"06",X"1A",X"67", + X"50",X"E1",X"F5",X"7E",X"03",X"FD",X"5F",X"00",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F", + X"FD",X"5F",X"01",X"F5",X"7E",X"04",X"FD",X"5F",X"02",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3", + X"3F",X"FD",X"5F",X"03",X"F5",X"7E",X"05",X"FD",X"5F",X"04",X"E1",X"E5",X"1F",X"32",X"F5",X"E3", + X"00",X"D6",X"E1",X"F5",X"E3",X"00",X"66",X"C2",X"1F",X"32",X"F5",X"6E",X"01",X"F5",X"4E",X"02", + X"7E",X"E3",X"0F",X"11",X"81",X"31",X"E5",X"B5",X"17",X"0B",X"CD",X"32",X"6F",X"13",X"32",X"4F", + X"E9",X"B3",X"31",X"B7",X"31",X"AD",X"31",X"9E",X"31",X"E4",X"31",X"F1",X"31",X"DB",X"31",X"24", + X"32",X"2E",X"32",X"1E",X"32",X"55",X"32",X"49",X"32",X"6D",X"32",X"C9",X"C3",X"58",X"31",X"C9", + X"7E",X"F5",X"5F",X"03",X"0B",X"7E",X"0B",X"F5",X"5F",X"04",X"C3",X"58",X"31",X"C9",X"7E",X"F5", + X"5F",X"05",X"0B",X"C3",X"58",X"31",X"C9",X"7E",X"F5",X"46",X"03",X"80",X"F5",X"5F",X"03",X"0B", + X"7E",X"0B",X"F5",X"46",X"04",X"A0",X"F5",X"5F",X"04",X"C3",X"58",X"31",X"C9",X"7E",X"F5",X"46", + X"05",X"80",X"F5",X"5F",X"05",X"0B",X"C3",X"58",X"31",X"C9",X"7E",X"F5",X"BE",X"07",X"28",X"23", + X"F5",X"1C",X"07",X"2B",X"F5",X"5D",X"01",X"F5",X"5C",X"02",X"E1",X"F5",X"1E",X"07",X"00",X"0B", + X"C3",X"58",X"31",X"F5",X"6E",X"20",X"F5",X"4E",X"21",X"D1",X"D5",X"2B",X"5A",X"2B",X"5B",X"2B", + X"1E",X"00",X"F5",X"5D",X"20",X"F5",X"5C",X"21",X"C9",X"C3",X"58",X"31",X"D1",X"32",X"F5",X"6E", + X"20",X"F5",X"4E",X"21",X"BE",X"28",X"21",X"1C",X"0B",X"76",X"0B",X"56",X"EB",X"C3",X"58",X"31", + X"0B",X"0B",X"0B",X"F5",X"5D",X"20",X"F5",X"5C",X"21",X"13",X"EB",X"C3",X"58",X"31",X"C9",X"76", + X"0B",X"56",X"EB",X"C3",X"58",X"31",X"C9",X"F5",X"CD",X"F5",X"CD",X"C9",X"D1",X"13",X"1E",X"00", + X"01",X"30",X"00",X"ED",X"98",X"32",X"F5",X"5F",X"01",X"13",X"32",X"F5",X"5F",X"02",X"F5",X"5D", + X"20",X"F5",X"5C",X"21",X"E1",X"C9",X"F5",X"5D",X"01",X"F5",X"5C",X"02",X"F5",X"1E",X"00",X"00", + X"E1",X"C9",X"76",X"0B",X"56",X"EB",X"1E",X"06",X"13",X"EB",X"C3",X"58",X"31",X"C9",X"7E",X"F5", + X"5F",X"06",X"0B",X"C3",X"58",X"31",X"23",X"75",X"65",X"23",X"78",X"65",X"24",X"02",X"01",X"43", + X"00",X"02",X"20",X"05",X"04",X"01",X"54",X"00",X"05",X"04",X"01",X"4B",X"00",X"05",X"04",X"01", + X"85",X"00",X"05",X"04",X"01",X"8F",X"00",X"05",X"04",X"01",X"C7",X"00",X"05",X"04",X"01",X"24", + X"01",X"05",X"04",X"21",X"1E",X"00",X"C3",X"74",X"23",X"42",X"65",X"23",X"78",X"65",X"01",X"D8", + X"00",X"24",X"02",X"06",X"02",X"20",X"05",X"03",X"02",X"00",X"05",X"03",X"07",X"27",X"21",X"29", + X"21",X"3E",X"00",X"E5",X"3B",X"36",X"9D",X"E2",X"D9",X"32",X"36",X"32",X"01",X"75",X"13",X"E5", + X"99",X"15",X"2A",X"90",X"20",X"65",X"06",X"00",X"E5",X"94",X"23",X"42",X"65",X"23",X"75",X"65", + X"01",X"C8",X"00",X"24",X"04",X"02",X"06",X"06",X"01",X"C8",X"00",X"05",X"04",X"01",X"40",X"00", + X"05",X"02",X"04",X"FF",X"07",X"05",X"21",X"20",X"C2",X"AE",X"32",X"2A",X"05",X"00",X"44",X"65", + X"11",X"4E",X"07",X"E5",X"FF",X"25",X"3E",X"01",X"11",X"05",X"00",X"E5",X"23",X"AE",X"65",X"01", + X"FF",X"00",X"24",X"04",X"02",X"20",X"06",X"06",X"03",X"22",X"00",X"05",X"01",X"07",X"06",X"06", + X"03",X"DE",X"FF",X"05",X"01",X"07",X"06",X"04",X"FF",X"07",X"06",X"21",X"1B",X"33",X"09",X"A7", + X"07",X"1E",X"08",X"2A",X"21",X"00",X"44",X"65",X"11",X"93",X"07",X"E5",X"FF",X"25",X"23",X"93", + X"65",X"01",X"80",X"00",X"24",X"05",X"02",X"27",X"06",X"05",X"03",X"03",X"C8",X"00",X"07",X"07", + X"21",X"04",X"FE",X"1A",X"F2",X"75",X"33",X"E5",X"16",X"27",X"C3",X"4E",X"33",X"E5",X"F6",X"15", + X"E5",X"F6",X"15",X"E5",X"F6",X"15",X"01",X"4E",X"07",X"E5",X"03",X"27",X"01",X"4E",X"07",X"E5", + X"23",X"93",X"65",X"23",X"AE",X"65",X"23",X"CC",X"65",X"01",X"80",X"00",X"24",X"04",X"02",X"23", + X"06",X"06",X"03",X"22",X"00",X"05",X"01",X"07",X"06",X"06",X"03",X"DE",X"FF",X"05",X"02",X"07", + X"06",X"04",X"FF",X"07",X"22",X"21",X"44",X"65",X"11",X"A9",X"07",X"E5",X"FF",X"25",X"3E",X"01", + X"11",X"23",X"24",X"02",X"02",X"07",X"01",X"00",X"FF",X"05",X"01",X"03",X"FF",X"88",X"20",X"A9", + X"33",X"11",X"D4",X"04",X"E5",X"18",X"36",X"9D",X"E2",X"C6",X"33",X"2A",X"D4",X"04",X"44",X"65", + X"11",X"BE",X"07",X"E5",X"FF",X"25",X"3E",X"01",X"11",X"D4",X"04",X"E5",X"18",X"36",X"9D",X"C2", + X"D7",X"33",X"09",X"D4",X"23",X"CC",X"65",X"24",X"02",X"01",X"43",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"54",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"4B",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"85",X"00", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"4B",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"54",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"4B",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"85",X"00", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"8F",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"C7",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"8F",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"85",X"00", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"4B",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"85",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"8F",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"C7",X"00", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"8F",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"85",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"4B",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"8F",X"00", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"C7",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"24",X"01",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"50",X"01",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"24",X"01", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"C7",X"00",X"02",X"03",X"06",X"04", + X"03",X"05",X"01",X"07",X"03",X"01",X"8F",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07", + X"03",X"01",X"C7",X"00",X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"01",X"24",X"01", + X"02",X"03",X"06",X"04",X"03",X"05",X"01",X"07",X"03",X"05",X"36",X"21",X"05",X"D6",X"01",X"B7", + X"DD",X"E5",X"E2",X"23",X"D6",X"06",X"D6",X"01",X"B7",X"C1",X"60",X"99",X"37",X"D2",X"61",X"35", + X"01",X"48",X"07",X"E5",X"CC",X"33",X"C3",X"8E",X"35",X"E5",X"E2",X"23",X"D6",X"01",X"D6",X"01", + X"B7",X"DD",X"E5",X"E2",X"23",X"D6",X"07",X"D6",X"01",X"B7",X"C1",X"60",X"99",X"37",X"D2",X"B0", + X"35",X"E5",X"D2",X"23",X"CE",X"03",X"FE",X"03",X"C2",X"5C",X"35",X"01",X"4A",X"07",X"E5",X"CC", + X"33",X"C3",X"95",X"35",X"E5",X"D2",X"23",X"CE",X"80",X"FE",X"00",X"E2",X"85",X"35",X"2A",X"D4", + X"04",X"0B",X"0A",X"D4",X"04",X"E5",X"D6",X"23",X"67",X"06",X"00",X"09",X"48",X"05",X"21",X"21", + X"44",X"65",X"E5",X"CC",X"33",X"C3",X"8E",X"35",X"E5",X"E2",X"23",X"FE",X"21",X"C2",X"8E",X"35", + X"01",X"4C",X"07",X"E5",X"CC",X"33",X"C3",X"07",X"35",X"E1",X"69",X"48",X"66",X"0B",X"46",X"32", + X"81",X"6F",X"13",X"32",X"A0",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"85",X"6F",X"13", + X"32",X"A4",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"8D",X"6F",X"13",X"32",X"8C",X"4F", + X"E1",X"44",X"65",X"09",X"00",X"00",X"3E",X"10",X"DD",X"29",X"EB",X"97",X"29",X"EB",X"A5",X"91", + X"6F",X"7C",X"B0",X"4F",X"13",X"D2",X"EA",X"35",X"21",X"33",X"D9",X"3D",X"C2",X"F0",X"35",X"E1", + X"76",X"0B",X"56",X"EB",X"29",X"CD",X"29",X"29",X"C1",X"21",X"E1",X"44",X"65",X"09",X"00",X"00", + X"3E",X"10",X"29",X"EB",X"29",X"EB",X"D2",X"22",X"36",X"21",X"3D",X"C2",X"02",X"36",X"E1",X"77", + X"16",X"00",X"7B",X"95",X"6F",X"7A",X"B4",X"4F",X"E1",X"67",X"06",X"00",X"7B",X"91",X"6F",X"7A", + X"B0",X"4F",X"E1",X"69",X"48",X"66",X"0B",X"46",X"32",X"91",X"6F",X"13",X"32",X"B0",X"4F",X"E1", + X"6F",X"0E",X"00",X"32",X"95",X"6F",X"13",X"32",X"B4",X"4F",X"E1",X"77",X"16",X"00",X"7B",X"96", + X"77",X"7A",X"0B",X"B6",X"57",X"EB",X"E1",X"00",X"04",X"3E",X"7F",X"8E",X"1A",X"CC",X"05",X"01", + X"CB",X"05",X"E5",X"F1",X"21",X"2A",X"62",X"04",X"2B",X"0A",X"62",X"04",X"11",X"01",X"00",X"2A", + X"EB",X"05",X"31",X"0A",X"EB",X"05",X"D2",X"3A",X"36",X"E1",X"E5",X"D9",X"10",X"DD",X"E5",X"4A", + X"15",X"C1",X"60",X"99",X"37",X"D2",X"83",X"36",X"26",X"07",X"E5",X"F2",X"0E",X"09",X"00",X"00", + X"0A",X"43",X"04",X"2A",X"43",X"04",X"7C",X"67",X"3E",X"7F",X"B9",X"D2",X"93",X"36",X"26",X"21", + X"E5",X"F2",X"0E",X"E5",X"BB",X"0E",X"3E",X"00",X"11",X"43",X"04",X"E5",X"1F",X"3D",X"9D",X"C2", + X"8B",X"36",X"E1",X"2A",X"43",X"04",X"44",X"65",X"E5",X"4B",X"1C",X"E5",X"B7",X"2A",X"E1",X"E5", + X"D9",X"10",X"01",X"42",X"04",X"E5",X"11",X"22",X"E1",X"E5",X"D9",X"10",X"01",X"42",X"04",X"E5", + X"FC",X"21",X"E1",X"3A",X"E5",X"05",X"37",X"D2",X"D0",X"36",X"26",X"27",X"E5",X"F2",X"0E",X"E1", + X"3A",X"36",X"05",X"D6",X"00",X"C6",X"FF",X"B7",X"09",X"6F",X"06",X"9E",X"37",X"D2",X"EA",X"36", + X"09",X"36",X"05",X"1E",X"00",X"26",X"0A",X"E5",X"F2",X"0E",X"09",X"BF",X"05",X"1E",X"00",X"E5", + X"3F",X"1C",X"E5",X"FA",X"0C",X"E5",X"CF",X"11",X"37",X"F2",X"2A",X"37",X"E5",X"D9",X"10",X"3A", + X"60",X"04",X"D6",X"00",X"D6",X"01",X"B7",X"DD",X"3A",X"47",X"04",X"CE",X"D9",X"D6",X"00",X"C6", + X"FF",X"B7",X"C1",X"60",X"99",X"37",X"D2",X"09",X"37",X"26",X"70",X"E5",X"F2",X"0E",X"C3",X"2A", + X"37",X"E5",X"BB",X"0E",X"09",X"42",X"04",X"0A",X"C9",X"05",X"2A",X"C9",X"05",X"44",X"65",X"E5", + X"83",X"2A",X"E5",X"65",X"0D",X"E1",X"E5",X"D9",X"10",X"E5",X"1A",X"11",X"01",X"61",X"04",X"E5", + X"02",X"12",X"3A",X"61",X"04",X"FE",X"20",X"C2",X"67",X"37",X"26",X"07",X"E5",X"69",X"19",X"E5", + X"52",X"19",X"FE",X"07",X"E2",X"74",X"37",X"26",X"02",X"E5",X"F2",X"0E",X"2A",X"43",X"04",X"44", + X"65",X"E5",X"B7",X"19",X"2A",X"60",X"04",X"65",X"E5",X"59",X"19",X"3A",X"47",X"04",X"CE",X"FD", + X"1A",X"47",X"04",X"2A",X"47",X"04",X"65",X"E5",X"6D",X"19",X"E5",X"BB",X"0E",X"E1",X"E5",X"DE", + X"10",X"2A",X"62",X"04",X"7C",X"67",X"3E",X"7F",X"B9",X"D2",X"97",X"37",X"26",X"35",X"E5",X"F2", + X"0E",X"09",X"00",X"00",X"0A",X"62",X"04",X"E5",X"2D",X"11",X"3A",X"42",X"04",X"FE",X"05",X"C2", + X"F5",X"37",X"E5",X"4A",X"15",X"09",X"B7",X"00",X"8E",X"37",X"D2",X"D5",X"37",X"2A",X"45",X"04", + X"44",X"65",X"E5",X"DB",X"1A",X"3A",X"47",X"04",X"CE",X"DF",X"DE",X"01",X"1A",X"40",X"52",X"45", + X"71",X"41",X"64",X"50",X"40",X"45",X"52",X"67",X"43",X"53",X"50",X"67",X"54",X"40",X"19",X"40", + X"52",X"45",X"71",X"41",X"64",X"50",X"54",X"61",X"44",X"45",X"52",X"43",X"71",X"41",X"64",X"50", + X"45",X"45",X"52",X"46",X"40",X"66",X"61",X"67",X"43",X"40",X"54",X"52",X"45",X"53",X"66",X"61", + X"52",X"45",X"71",X"41",X"64",X"50",X"40",X"45",X"66",X"67",X"40",X"54",X"43",X"45",X"64",X"45", + X"53",X"52",X"67",X"53",X"52",X"45",X"71",X"41",X"64",X"50",X"40",X"67",X"57",X"54",X"40",X"52", + X"67",X"40",X"45",X"66",X"67",X"40",X"54",X"43",X"45",X"64",X"45",X"53",X"50",X"55",X"40",X"45", + X"66",X"67",X"40",X"52",X"45",X"71",X"41",X"64",X"50",X"50",X"55",X"40",X"67",X"57",X"54",X"40", + X"52",X"45",X"71",X"41",X"64",X"50",X"66",X"61",X"41",X"47",X"41",X"40",X"52",X"45",X"71",X"41", + X"64",X"50",X"40",X"45",X"65",X"41",X"53",X"52",X"45",X"56",X"67",X"40",X"45",X"65",X"41",X"47", + X"52",X"45",X"56",X"67",X"40",X"45",X"65",X"41",X"47",X"40",X"45",X"66",X"67",X"40",X"52",X"45", + X"71",X"41",X"64",X"50",X"45",X"65",X"41",X"46",X"40",X"46",X"67",X"40",X"64",X"64",X"41",X"60", + X"45",X"60",X"54",X"40",X"66",X"61",X"40",X"53",X"61",X"40",X"45",X"52",X"67",X"43",X"53",X"40", + X"52",X"55",X"67",X"71",X"66",X"45",X"54",X"40",X"50",X"67",X"54",X"54",X"43",X"45",X"64",X"45", + X"53",X"40",X"67",X"54",X"40",X"63",X"43",X"61",X"54",X"53",X"71",X"67",X"62",X"40",X"45",X"53", + X"55",X"66",X"67",X"54",X"54",X"55",X"42",X"40",X"45",X"52",X"61",X"46",X"40",X"44",X"66",X"41", + X"40",X"52",X"45",X"54",X"54",X"45",X"64",X"54",X"66",X"61",X"52",X"50",X"40",X"67",X"54",X"45", + X"66",X"44",X"65",X"41",X"64",X"53",X"53",X"45",X"71",X"45",X"1A",X"38",X"39",X"19",X"40",X"40", + X"54",X"60",X"47",X"61",X"52",X"71",X"50",X"67",X"43",X"52",X"41",X"54",X"53",X"60",X"43",X"45", + X"54",X"40",X"70",X"45",X"52",X"54",X"61",X"47",X"61",X"44",X"53",X"54",X"66",X"45",X"53",X"45", + X"52",X"50",X"40",X"40",X"41",X"64",X"67",X"77",X"63",X"43",X"67",X"52",X"45",X"64",X"42",X"41", + X"54",X"40",X"45",X"43",X"66",X"41",X"56",X"44",X"41",X"40",X"45",X"52",X"67",X"43",X"53",X"18", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"1D",X"18",X"1D",X"18",X"1D",X"18",X"1D",X"18", + X"1A",X"1D",X"1F",X"18",X"1A",X"1D",X"1F",X"19",X"19",X"19",X"19",X"1A",X"1A",X"1A",X"1A",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"18", + X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"19", + X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"38",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"19",X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"38",X"45", + X"52",X"67",X"43",X"53",X"40",X"45",X"56",X"61",X"64",X"41",X"40",X"71",X"41",X"54",X"53",X"44", + X"66",X"67",X"43",X"45",X"53",X"40",X"52",X"45",X"50",X"40",X"53",X"54",X"66",X"61",X"67",X"50", + X"40",X"18",X"1D",X"40",X"40",X"71",X"41",X"64",X"50",X"40",X"19",X"40",X"53",X"66",X"61",X"67", + X"43",X"40",X"1A",X"53",X"71",X"41",X"64",X"50",X"40",X"1A",X"40",X"40",X"66",X"61",X"67",X"43", + X"40",X"19",X"40",X"71",X"41",X"64",X"50",X"40",X"19",X"40",X"40",X"66",X"61",X"67",X"43",X"40", + X"19",X"53",X"54",X"66",X"61",X"67",X"50",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"71", + X"52",X"45",X"56",X"45",X"40",X"53",X"55",X"66",X"67",X"42",X"18",X"18",X"18",X"1D",X"1A",X"19", + X"18",X"18",X"18",X"18",X"18",X"19",X"18",X"18",X"18",X"1D",X"1F",X"18",X"18",X"18",X"18",X"1D", + X"53",X"43",X"61",X"54",X"53",X"67",X"66",X"47",X"41",X"61",X"44",X"66",X"67",X"61",X"54",X"61", + X"44",X"66",X"67",X"43",X"40",X"40",X"66",X"67",X"61",X"54",X"41",X"43",X"67",X"64",X"40",X"40", + X"65",X"67",X"52",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"44",X"1F", + X"40",X"40",X"40",X"40",X"40",X"40",X"19",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"46",X"1F",X"40",X"40",X"40",X"40",X"40",X"40",X"1A",X"44",X"67",X"67",X"47",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"60",X"1F",X"40",X"40",X"40",X"40",X"40",X"40",X"1B",X"44", + X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"62",X"1F",X"40",X"40",X"40",X"40", + X"40",X"40",X"1C",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"60",X"1C", + X"40",X"40",X"40",X"40",X"40",X"40",X"19",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"64",X"1C",X"40",X"40",X"40",X"40",X"40",X"40",X"1A",X"44",X"67",X"67",X"47",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"62",X"1C",X"40",X"40",X"40",X"40",X"40",X"40",X"1B",X"44", + X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"65",X"1C",X"40",X"40",X"40",X"40", + X"40",X"40",X"1C",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"63",X"1C", + X"40",X"40",X"40",X"40",X"40",X"40",X"1D",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"66",X"1C",X"40",X"40",X"40",X"40",X"40",X"40",X"1E",X"44",X"41",X"42",X"40",X"66", + X"67",X"61",X"54",X"61",X"44",X"66",X"67",X"43",X"40",X"40",X"66",X"67",X"61",X"54",X"41",X"43", + X"67",X"64",X"40",X"40",X"65",X"41",X"52",X"00",X"50",X"12",X"00",X"00",X"00",X"0D",X"00",X"00", + X"50",X"1F",X"00",X"00",X"00",X"50",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"08",X"00",X"00", + X"00",X"18",X"00",X"00",X"00",X"40",X"00",X"00",X"50",X"07",X"00",X"00",X"00",X"15",X"00",X"00", + X"50",X"0A",X"00",X"00",X"00",X"18",X"00",X"00",X"00",X"05",X"00",X"00",X"00",X"10",X"00",X"00", + X"00",X"15",X"00",X"00",X"00",X"08",X"00",X"05",X"04",X"03",X"02",X"00",X"01",X"02",X"03",X"04", + X"05",X"06",X"07",X"20",X"21",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"60",X"61",X"62",X"63", + X"64",X"65",X"66",X"67",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"70",X"71",X"72",X"72", + X"71",X"70",X"57",X"56",X"55",X"54",X"53",X"52",X"51",X"50",X"67",X"66",X"65",X"64",X"63",X"62", + X"61",X"60",X"47",X"46",X"45",X"44",X"43",X"42",X"41",X"00",X"01",X"04",X"02",X"64",X"52",X"53", + X"40",X"4D",X"02",X"65",X"43",X"53",X"80",X"11",X"02",X"62",X"65",X"53",X"08",X"4B",X"01",X"42", + X"67",X"40",X"80",X"31",X"01",X"62",X"53",X"40",X"18",X"96",X"00",X"62",X"46",X"53",X"48",X"82", + X"00",X"46",X"53",X"65",X"50",X"5F",X"00",X"43",X"53",X"65",X"10",X"5C",X"00",X"43",X"44",X"40", + X"58",X"68",X"00",X"60",X"44",X"43",X"90",X"52",X"00",X"94",X"42",X"95",X"42",X"96",X"42",X"97", + X"42",X"B0",X"42",X"B1",X"42",X"B2",X"42",X"B3",X"42",X"B4",X"42",X"B5",X"42",X"03",X"02",X"01", + X"00",X"00",X"80",X"48",X"40",X"E5",X"17",X"0C",X"E1",X"E5",X"36",X"0C",X"E1",X"E5",X"9B",X"0C", + X"E1",X"E5",X"9C",X"0C",X"E1",X"E5",X"C0",X"0C",X"E1",X"E5",X"32",X"0D",X"E1",X"E5",X"72",X"2C", + X"E1",X"E5",X"0F",X"3A",X"E1",X"E5",X"28",X"3A",X"E1",X"E5",X"29",X"3A",X"E1",X"E5",X"3C",X"3A", + X"E1",X"E5",X"3D",X"3A",X"E1",X"E5",X"50",X"3A",X"E1",X"E5",X"51",X"3A",X"E1",X"E5",X"7B",X"3A", + X"E1",X"E5",X"8D",X"3A",X"E1",X"00",X"FF",X"09",X"6A",X"0C",X"0A",X"62",X"67",X"E1",X"3E",X"10", + X"1A",X"D0",X"64",X"3E",X"08",X"1A",X"60",X"67",X"3A",X"61",X"67",X"FE",X"06",X"C2",X"AC",X"0C", + X"AF",X"1A",X"61",X"67",X"3A",X"3C",X"65",X"EE",X"10",X"1A",X"3C",X"65",X"2A",X"62",X"67",X"7E", + X"FE",X"00",X"28",X"26",X"0B",X"46",X"3A",X"D2",X"64",X"B8",X"28",X"14",X"2B",X"0A",X"62",X"67", + X"30",X"17",X"0B",X"46",X"3A",X"D3",X"64",X"B8",X"28",X"06",X"2B",X"0A",X"62",X"67",X"30",X"21", + X"0B",X"7E",X"1A",X"3C",X"65",X"0B",X"0A",X"62",X"67",X"E1",X"01",X"6B",X"26",X"00",X"14",X"23", + X"01",X"EB",X"07",X"00",X"9C",X"25",X"01",X"D3",X"07",X"00",X"E4",X"25",X"01",X"BB",X"07",X"00", + X"FC",X"25",X"01",X"53",X"26",X"00",X"E4",X"25",X"01",X"3B",X"26",X"00",X"9C",X"25",X"01",X"0B", + X"26",X"00",X"44",X"23",X"01",X"53",X"26",X"00",X"14",X"23",X"01",X"BB",X"07",X"00",X"44",X"23", + X"01",X"D3",X"07",X"00",X"FC",X"25",X"01",X"8B",X"26",X"00",X"74",X"25",X"3C",X"1A",X"61",X"67", + X"C3",X"3C",X"0C",X"E1",X"09",X"51",X"66",X"0A",X"C9",X"66",X"09",X"CE",X"66",X"0A",X"1E",X"67", + X"09",X"DA",X"1F",X"11",X"51",X"66",X"01",X"60",X"00",X"ED",X"98",X"09",X"DA",X"1F",X"11",X"B1", + X"66",X"01",X"60",X"00",X"ED",X"98",X"AF",X"1A",X"3C",X"67",X"1A",X"3D",X"67",X"1A",X"3E",X"67", + X"3A",X"34",X"66",X"E3",X"A7",X"1A",X"34",X"66",X"3E",X"31",X"1A",X"38",X"67",X"1A",X"39",X"67", + X"1A",X"3A",X"67",X"1A",X"3B",X"67",X"AF",X"1A",X"3F",X"67",X"1A",X"CB",X"66",X"09",X"11",X"39", + X"11",X"CE",X"66",X"01",X"28",X"00",X"ED",X"98",X"09",X"11",X"39",X"11",X"26",X"67",X"01",X"28", + X"00",X"ED",X"98",X"09",X"51",X"66",X"0A",X"C9",X"66",X"E1",X"09",X"8F",X"0D",X"11",X"8F",X"64", + X"01",X"18",X"00",X"ED",X"98",X"3A",X"3E",X"67",X"FE",X"02",X"18",X"04",X"AF",X"1A",X"BA",X"64", + X"09",X"2F",X"66",X"11",X"18",X"66",X"01",X"17",X"00",X"1E",X"00",X"ED",X"98",X"09",X"39",X"39", + X"0A",X"37",X"66",X"09",X"94",X"39",X"0A",X"09",X"66",X"09",X"FB",X"39",X"0A",X"0B",X"66",X"09", + X"13",X"3A",X"0A",X"0D",X"66",X"3E",X"80",X"1A",X"2D",X"66",X"3E",X"08",X"1A",X"67",X"66",X"3E", + X"40",X"1A",X"06",X"64",X"1A",X"26",X"64",X"1A",X"16",X"64",X"1A",X"36",X"64",X"1A",X"0E",X"64", + X"1A",X"2E",X"64",X"1A",X"1E",X"64",X"1A",X"3E",X"64",X"1A",X"46",X"64",X"1A",X"66",X"64",X"3E", + X"48",X"1A",X"05",X"64",X"1A",X"25",X"64",X"1A",X"15",X"64",X"1A",X"35",X"64",X"1A",X"0D",X"64", + X"1A",X"2D",X"64",X"1A",X"1D",X"64",X"1A",X"3D",X"64",X"1A",X"45",X"64",X"1A",X"65",X"64",X"09", + X"2C",X"01",X"0A",X"46",X"67",X"30",X"18",X"03",X"00",X"00",X"0B",X"44",X"14",X"21",X"23",X"03", + X"00",X"00",X"0B",X"B4",X"14",X"21",X"23",X"04",X"00",X"00",X"87",X"14",X"14",X"21",X"F9",X"03", + X"00",X"00",X"EB",X"44",X"14",X"21",X"00",X"03",X"00",X"00",X"EB",X"B4",X"14",X"21",X"00",X"05", + X"00",X"00",X"87",X"FC",X"0D",X"14",X"D8",X"3E",X"40",X"E5",X"CD",X"16",X"11",X"82",X"40",X"09", + X"5D",X"2B",X"3E",X"34",X"06",X"02",X"E5",X"BD",X"17",X"11",X"CA",X"40",X"09",X"5D",X"2B",X"3E", + X"34",X"06",X"02",X"E5",X"BD",X"17",X"11",X"42",X"41",X"09",X"5D",X"2B",X"3E",X"34",X"06",X"02", + X"E5",X"BD",X"17",X"11",X"8A",X"41",X"09",X"F5",X"2B",X"3E",X"34",X"06",X"01",X"E5",X"BD",X"17", + X"11",X"C2",X"41",X"09",X"F9",X"2B",X"3E",X"34",X"06",X"01",X"E5",X"BD",X"17",X"11",X"CA",X"41", + X"09",X"F9",X"2B",X"3E",X"34",X"06",X"01",X"E5",X"BD",X"17",X"11",X"02",X"42",X"09",X"F9",X"2B", + X"3E",X"34",X"06",X"01",X"E5",X"BD",X"17",X"11",X"0A",X"42",X"09",X"F9",X"2B",X"3E",X"34",X"06", + X"01",X"E5",X"BD",X"17",X"11",X"42",X"42",X"09",X"15",X"2C",X"3E",X"34",X"06",X"01",X"E5",X"BD", + X"17",X"11",X"82",X"42",X"09",X"5D",X"2B",X"3E",X"34",X"06",X"02",X"E5",X"BD",X"17",X"11",X"CA", + X"42",X"09",X"5D",X"2B",X"3E",X"34",X"06",X"02",X"E5",X"BD",X"17",X"11",X"42",X"43",X"09",X"5D", + X"2B",X"3E",X"34",X"06",X"02",X"E5",X"BD",X"17",X"11",X"20",X"41",X"09",X"AD",X"2B",X"3E",X"10", + X"06",X"03",X"E5",X"BD",X"17",X"11",X"A8",X"42",X"09",X"AD",X"2B",X"3E",X"10",X"06",X"03",X"E5", + X"BD",X"17",X"11",X"41",X"40",X"09",X"19",X"2C",X"3E",X"36",X"06",X"01",X"E5",X"D3",X"17",X"11", + X"7F",X"40",X"09",X"1A",X"2C",X"3E",X"01",X"06",X"32",X"E5",X"D3",X"17",X"11",X"89",X"43",X"09", + X"1B",X"2C",X"3E",X"36",X"06",X"01",X"E5",X"D3",X"17",X"11",X"48",X"40",X"09",X"1C",X"2C",X"3E", + X"01",X"06",X"32",X"E5",X"D3",X"17",X"3E",X"24",X"1A",X"40",X"40",X"3E",X"22",X"1A",X"77",X"40", + X"3E",X"23",X"1A",X"BF",X"43",X"3E",X"25",X"1A",X"88",X"43",X"AF",X"1A",X"3F",X"67",X"1A",X"CB", + X"66",X"1A",X"50",X"66",X"3A",X"3E",X"67",X"09",X"DC",X"0E",X"E3",X"0F",X"E5",X"B0",X"17",X"76", + X"0B",X"56",X"EB",X"E9",X"04",X"0F",X"5A",X"0F",X"C8",X"0F",X"45",X"28",X"AA",X"28",X"27",X"29", + X"5C",X"29",X"F1",X"29",X"09",X"00",X"01",X"0A",X"47",X"66",X"09",X"00",X"05",X"0A",X"65",X"66", + X"3E",X"05",X"E5",X"DD",X"16",X"3E",X"12",X"1A",X"CD",X"66",X"3E",X"C2",X"1A",X"CC",X"66",X"3E", + X"01",X"1A",X"A8",X"64",X"3E",X"03",X"1A",X"98",X"64",X"3E",X"05",X"1A",X"B8",X"64",X"3E",X"07", + X"1A",X"C0",X"64",X"3E",X"21",X"1A",X"E0",X"64",X"3E",X"FF",X"1A",X"45",X"67",X"3E",X"18",X"1A", + X"60",X"67",X"AF",X"1A",X"BA",X"64",X"09",X"34",X"66",X"E3",X"A6",X"09",X"39",X"66",X"E3",X"C6", + X"11",X"E7",X"41",X"09",X"6C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"BD",X"17",X"11",X"E7",X"45", + X"09",X"5C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E",X"01",X"1A",X"2F",X"46",X"C3", + X"3B",X"2A",X"09",X"00",X"02",X"0A",X"47",X"66",X"09",X"50",X"07",X"0A",X"65",X"66",X"3E",X"01", + X"E5",X"DD",X"16",X"3E",X"12",X"1A",X"CD",X"66",X"3E",X"0D",X"1A",X"CC",X"66",X"3E",X"02",X"1A", + X"A8",X"64",X"3E",X"04",X"1A",X"98",X"64",X"3E",X"06",X"1A",X"B8",X"64",X"3E",X"20",X"1A",X"C0", + X"64",X"3E",X"22",X"1A",X"E0",X"64",X"3E",X"EF",X"1A",X"45",X"67",X"3E",X"15",X"1A",X"60",X"67", + X"AF",X"1A",X"BA",X"64",X"09",X"34",X"66",X"E3",X"A6",X"09",X"39",X"66",X"E3",X"C6",X"11",X"E7", + X"41",X"09",X"6C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"BD",X"17",X"11",X"E7",X"45",X"09",X"5C", + X"2B",X"3E",X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E",X"01",X"1A",X"27",X"46",X"C3",X"3B",X"2A", + X"09",X"00",X"03",X"0A",X"47",X"66",X"09",X"00",X"10",X"0A",X"65",X"66",X"3E",X"10",X"E5",X"DD", + X"16",X"3E",X"12",X"1A",X"CD",X"66",X"3E",X"0A",X"1A",X"CC",X"66",X"3E",X"03",X"1A",X"A8",X"64", + X"3E",X"05",X"1A",X"98",X"64",X"3E",X"07",X"1A",X"B8",X"64",X"3E",X"21",X"1A",X"C0",X"64",X"3E", + X"23",X"1A",X"E0",X"64",X"3E",X"F7",X"1A",X"45",X"67",X"3E",X"08",X"1A",X"60",X"67",X"09",X"34", + X"66",X"E3",X"E6",X"11",X"E7",X"41",X"09",X"6C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"BD",X"17", + X"11",X"E7",X"45",X"09",X"5C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E",X"01",X"1A", + X"EF",X"45",X"C3",X"3B",X"2A",X"09",X"00",X"04",X"0A",X"47",X"66",X"09",X"50",X"12",X"0A",X"65", + X"66",X"3E",X"35",X"E5",X"DD",X"16",X"3E",X"12",X"1A",X"CD",X"66",X"3E",X"28",X"1A",X"CC",X"66", + X"3E",X"04",X"1A",X"A8",X"64",X"3E",X"06",X"1A",X"98",X"64",X"3E",X"20",X"1A",X"B8",X"64",X"3E", + X"22",X"1A",X"C0",X"64",X"3E",X"24",X"1A",X"E0",X"64",X"3E",X"E7",X"1A",X"45",X"67",X"3E",X"10", + X"1A",X"60",X"67",X"09",X"34",X"66",X"E3",X"E6",X"11",X"E7",X"41",X"09",X"6C",X"2B",X"3E",X"02", + X"06",X"04",X"E5",X"BD",X"17",X"11",X"E7",X"45",X"09",X"5C",X"2B",X"3E",X"02",X"06",X"04",X"E5", + X"D3",X"17",X"3E",X"01",X"1A",X"E7",X"45",X"C3",X"3B",X"2A",X"09",X"00",X"05",X"0A",X"47",X"66", + X"09",X"00",X"15",X"0A",X"65",X"66",X"3E",X"21",X"E5",X"DD",X"16",X"3E",X"32",X"1A",X"CD",X"66", + X"3E",X"37",X"1A",X"CC",X"66",X"3E",X"05",X"1A",X"A8",X"64",X"3E",X"07",X"1A",X"98",X"64",X"3E", + X"21",X"1A",X"B8",X"64",X"3E",X"23",X"1A",X"C0",X"64",X"3E",X"25",X"1A",X"E0",X"64",X"3E",X"BF", + X"1A",X"45",X"67",X"3E",X"06",X"1A",X"60",X"67",X"09",X"34",X"66",X"E3",X"E6",X"11",X"E7",X"41", + X"09",X"6C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"BD",X"17",X"11",X"E7",X"45",X"09",X"5C",X"2B", + X"3E",X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E",X"01",X"1A",X"18",X"46",X"C3",X"3B",X"2A",X"09", + X"00",X"06",X"0A",X"47",X"66",X"09",X"50",X"17",X"0A",X"65",X"66",X"3E",X"01",X"E5",X"DD",X"16", + X"3E",X"32",X"1A",X"CD",X"66",X"3E",X"34",X"1A",X"CC",X"66",X"3E",X"06",X"1A",X"A8",X"64",X"3E", + X"20",X"1A",X"98",X"64",X"3E",X"22",X"1A",X"B8",X"64",X"3E",X"24",X"1A",X"C0",X"64",X"3E",X"26", + X"1A",X"E0",X"64",X"3E",X"BF",X"1A",X"45",X"67",X"3E",X"01",X"1A",X"60",X"67",X"09",X"34",X"66", + X"E3",X"E6",X"11",X"E7",X"41",X"09",X"6C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"BD",X"17",X"11", + X"E7",X"45",X"09",X"5C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E",X"01",X"1A",X"10", + X"46",X"C3",X"3B",X"2A",X"09",X"00",X"07",X"0A",X"47",X"66",X"09",X"00",X"08",X"0A",X"65",X"66", + X"3E",X"05",X"E5",X"DD",X"16",X"3E",X"21",X"1A",X"CD",X"66",X"3E",X"31",X"1A",X"CC",X"66",X"3E", + X"07",X"1A",X"A8",X"64",X"3E",X"21",X"1A",X"98",X"64",X"3E",X"23",X"1A",X"B8",X"64",X"3E",X"25", + X"1A",X"C0",X"64",X"3E",X"27",X"1A",X"E0",X"64",X"3E",X"BF",X"1A",X"45",X"67",X"3E",X"01",X"1A", + X"60",X"67",X"09",X"34",X"66",X"E3",X"E6",X"11",X"E7",X"41",X"09",X"6C",X"2B",X"3E",X"02",X"06", + X"04",X"E5",X"BD",X"17",X"11",X"E7",X"45",X"09",X"5C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"D3", + X"17",X"3E",X"01",X"1A",X"D8",X"45",X"C3",X"3B",X"2A",X"09",X"00",X"20",X"0A",X"47",X"66",X"09", + X"50",X"0A",X"0A",X"65",X"66",X"3E",X"10",X"E5",X"DD",X"16",X"3E",X"37",X"1A",X"CD",X"66",X"3E", + X"2B",X"1A",X"CC",X"66",X"3E",X"20",X"1A",X"A8",X"64",X"3E",X"22",X"1A",X"98",X"64",X"3E",X"24", + X"1A",X"B8",X"64",X"3E",X"26",X"1A",X"C0",X"64",X"3E",X"10",X"1A",X"E0",X"64",X"3E",X"BF",X"1A", + X"45",X"67",X"3E",X"01",X"1A",X"60",X"67",X"09",X"34",X"66",X"E3",X"E6",X"11",X"E7",X"41",X"09", + X"6C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"BD",X"17",X"11",X"E7",X"45",X"09",X"5C",X"2B",X"3E", + X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E",X"01",X"1A",X"D0",X"45",X"11",X"49",X"44",X"09",X"CD", + X"66",X"3E",X"36",X"06",X"01",X"E5",X"D3",X"17",X"11",X"C1",X"44",X"09",X"CD",X"66",X"3E",X"36", + X"06",X"01",X"E5",X"D3",X"17",X"11",X"09",X"45",X"09",X"CD",X"66",X"3E",X"07",X"06",X"01",X"E5", + X"D3",X"17",X"11",X"2D",X"45",X"09",X"CD",X"66",X"3E",X"06",X"06",X"01",X"E5",X"D3",X"17",X"11", + X"38",X"45",X"09",X"CD",X"66",X"3E",X"07",X"06",X"01",X"E5",X"D3",X"17",X"11",X"81",X"45",X"09", + X"CD",X"66",X"3E",X"36",X"06",X"01",X"E5",X"D3",X"17",X"11",X"49",X"46",X"09",X"CD",X"66",X"3E", + X"36",X"06",X"01",X"E5",X"D3",X"17",X"11",X"C1",X"46",X"09",X"CD",X"66",X"3E",X"07",X"06",X"01", + X"E5",X"D3",X"17",X"11",X"E5",X"46",X"09",X"CD",X"66",X"3E",X"06",X"06",X"01",X"E5",X"D3",X"17", + X"11",X"F0",X"46",X"09",X"CD",X"66",X"3E",X"07",X"06",X"01",X"E5",X"D3",X"17",X"11",X"09",X"47", + X"09",X"CD",X"66",X"3E",X"36",X"06",X"01",X"E5",X"D3",X"17",X"11",X"81",X"47",X"09",X"CD",X"66", + X"3E",X"36",X"06",X"01",X"E5",X"D3",X"17",X"11",X"49",X"44",X"09",X"CD",X"66",X"3E",X"01",X"06", + X"32",X"E5",X"D3",X"17",X"11",X"84",X"45",X"09",X"CD",X"66",X"3E",X"01",X"06",X"20",X"E5",X"D3", + X"17",X"11",X"4F",X"44",X"09",X"CD",X"66",X"3E",X"01",X"06",X"32",X"E5",X"D3",X"17",X"11",X"6A", + X"44",X"09",X"CD",X"66",X"3E",X"01",X"06",X"32",X"E5",X"D3",X"17",X"11",X"6D",X"44",X"09",X"CD", + X"66",X"3E",X"01",X"06",X"32",X"E5",X"D3",X"17",X"11",X"5A",X"44",X"09",X"CD",X"66",X"3E",X"01", + X"06",X"32",X"E5",X"D3",X"17",X"11",X"5D",X"44",X"09",X"CD",X"66",X"3E",X"01",X"06",X"32",X"E5", + X"D3",X"17",X"11",X"78",X"44",X"09",X"CD",X"66",X"3E",X"01",X"06",X"32",X"E5",X"D3",X"17",X"11", + X"B3",X"45",X"09",X"CD",X"66",X"3E",X"01",X"06",X"20",X"E5",X"D3",X"17",X"11",X"7E",X"44",X"09", + X"CD",X"66",X"3E",X"01",X"06",X"32",X"E5",X"D3",X"17",X"3A",X"CC",X"66",X"1A",X"38",X"67",X"1A", + X"39",X"67",X"1A",X"3A",X"67",X"1A",X"3B",X"67",X"E5",X"55",X"1D",X"E1",X"04",X"20",X"03",X"07", + X"02",X"06",X"01",X"05",X"21",X"23",X"11",X"11",X"11",X"25",X"40",X"23",X"25",X"40",X"23",X"25", + X"40",X"23",X"11",X"11",X"25",X"40",X"23",X"25",X"40",X"23",X"25",X"40",X"23",X"11",X"11",X"11", + X"25",X"22",X"10",X"10",X"10",X"24",X"40",X"22",X"24",X"40",X"22",X"24",X"40",X"22",X"10",X"10", + X"24",X"40",X"22",X"24",X"40",X"22",X"24",X"40",X"22",X"10",X"10",X"10",X"24",X"26",X"27",X"40", + X"26",X"27",X"40",X"22",X"10",X"10",X"24",X"40",X"26",X"27",X"40",X"26",X"27",X"26",X"27",X"40", + X"26",X"27",X"40",X"40",X"40",X"40",X"40",X"40",X"26",X"27",X"40",X"26",X"27",X"26",X"27",X"40", + X"26",X"27",X"40",X"23",X"11",X"11",X"25",X"40",X"26",X"27",X"40",X"26",X"27",X"23",X"25",X"40", + X"23",X"25",X"40",X"23",X"25",X"40",X"23",X"25",X"40",X"23",X"11",X"11",X"25",X"40",X"23",X"25", + X"40",X"23",X"25",X"40",X"23",X"25",X"40",X"23",X"25",X"26",X"27",X"40",X"26",X"27",X"40",X"26", + X"27",X"40",X"26",X"27",X"40",X"26",X"27",X"26",X"27",X"40",X"26",X"27",X"40",X"26",X"27",X"40", + X"26",X"27",X"40",X"26",X"27",X"22",X"24",X"40",X"22",X"24",X"40",X"22",X"24",X"40",X"22",X"24", + X"40",X"22",X"10",X"10",X"24",X"40",X"22",X"24",X"40",X"22",X"24",X"40",X"22",X"24",X"40",X"22", + X"24",X"10",X"26",X"11",X"27",X"45",X"71",X"45",X"53",X"2C",X"43",X"67",X"50",X"71",X"52",X"61", + X"47",X"60",X"54",X"08",X"19",X"39",X"38",X"1A",X"44",X"61",X"47",X"61",X"54",X"52",X"45",X"70", + X"08",X"54",X"45",X"43",X"60",X"53",X"54",X"41",X"52",X"4D",X"09",X"45",X"66",X"E3",X"46",X"C2", + X"D9",X"19",X"09",X"00",X"00",X"0A",X"61",X"66",X"09",X"E7",X"64",X"0A",X"D7",X"64",X"F5",X"09", + X"E7",X"64",X"F5",X"7E",X"07",X"FE",X"80",X"D2",X"CC",X"2C",X"2A",X"0B",X"66",X"E3",X"0F",X"E5", + X"B0",X"17",X"0A",X"0F",X"66",X"3A",X"3C",X"65",X"CE",X"27",X"47",X"FE",X"27",X"28",X"0B",X"3E", + X"10",X"1A",X"D0",X"64",X"78",X"E3",X"47",X"08",X"0A",X"2A",X"0F",X"66",X"46",X"F5",X"7E",X"04", + X"B8",X"E2",X"66",X"2D",X"F5",X"1E",X"00",X"02",X"F5",X"1E",X"05",X"35",X"E5",X"21",X"27",X"C3", + X"66",X"2D",X"F5",X"7E",X"00",X"FE",X"03",X"28",X"06",X"30",X"F6",X"E3",X"77",X"08",X"32",X"2A", + X"0F",X"66",X"0B",X"46",X"F5",X"7E",X"04",X"B8",X"E2",X"66",X"2D",X"F5",X"1E",X"00",X"03",X"F5", + X"1E",X"05",X"09",X"E5",X"21",X"27",X"C3",X"66",X"2D",X"F5",X"46",X"04",X"E5",X"81",X"1A",X"18", + X"D1",X"C3",X"6E",X"2C",X"CE",X"27",X"2A",X"0D",X"66",X"E3",X"0F",X"E5",X"B0",X"17",X"0A",X"0F", + X"66",X"3A",X"3C",X"65",X"CE",X"27",X"47",X"FE",X"27",X"28",X"0B",X"3E",X"10",X"1A",X"D0",X"64", + X"78",X"E3",X"67",X"08",X"0A",X"2A",X"0F",X"66",X"46",X"F5",X"7E",X"03",X"B8",X"E2",X"66",X"2D", + X"F5",X"1E",X"00",X"05",X"F5",X"1E",X"05",X"31",X"E5",X"21",X"27",X"C3",X"66",X"2D",X"F5",X"7E", + X"00",X"FE",X"04",X"28",X"06",X"30",X"F6",X"E3",X"57",X"08",X"30",X"2A",X"0F",X"66",X"0B",X"46", + X"F5",X"7E",X"03",X"B8",X"28",X"30",X"F5",X"1E",X"00",X"04",X"F5",X"1E",X"05",X"33",X"E5",X"21", + X"27",X"30",X"23",X"F5",X"46",X"03",X"E5",X"81",X"1A",X"18",X"D3",X"C3",X"6E",X"2C",X"3E",X"DB", + X"F5",X"46",X"03",X"90",X"1A",X"43",X"66",X"F5",X"7E",X"04",X"D6",X"24",X"1A",X"44",X"66",X"09", + X"E7",X"64",X"0A",X"35",X"66",X"09",X"8F",X"0D",X"F5",X"09",X"8F",X"64",X"FD",X"09",X"2F",X"66", + X"FD",X"E3",X"02",X"46",X"28",X"25",X"11",X"40",X"67",X"E5",X"E8",X"1A",X"09",X"33",X"66",X"E3", + X"86",X"30",X"32",X"09",X"8F",X"64",X"0A",X"D7",X"64",X"E5",X"79",X"1D",X"3E",X"DB",X"F5",X"46", + X"03",X"90",X"1A",X"2F",X"66",X"F5",X"7E",X"04",X"D6",X"24",X"1A",X"18",X"66",X"09",X"19",X"66", + X"F5",X"09",X"28",X"64",X"FD",X"09",X"8F",X"64",X"E5",X"79",X"1B",X"09",X"AF",X"0D",X"F5",X"09", + X"AF",X"64",X"FD",X"09",X"1B",X"66",X"FD",X"E3",X"02",X"46",X"28",X"25",X"11",X"41",X"67",X"E5", + X"E8",X"1A",X"09",X"33",X"66",X"E3",X"86",X"30",X"32",X"09",X"AF",X"64",X"0A",X"D7",X"64",X"E5", + X"79",X"1D",X"3E",X"DB",X"F5",X"46",X"03",X"90",X"1A",X"1B",X"66",X"F5",X"7E",X"04",X"D6",X"24", + X"1A",X"1C",X"66",X"09",X"1D",X"66",X"F5",X"09",X"18",X"64",X"FD",X"09",X"AF",X"64",X"E5",X"79", + X"1B",X"3A",X"34",X"66",X"E3",X"67",X"28",X"46",X"09",X"9F",X"0D",X"F5",X"09",X"9F",X"64",X"FD", + X"09",X"1F",X"66",X"FD",X"E3",X"02",X"46",X"28",X"25",X"11",X"42",X"67",X"E5",X"E8",X"1A",X"09", + X"33",X"66",X"E3",X"86",X"30",X"32",X"09",X"9F",X"64",X"0A",X"D7",X"64",X"E5",X"79",X"1D",X"3E", + X"DB",X"F5",X"46",X"03",X"90",X"1A",X"1F",X"66",X"F5",X"7E",X"04",X"D6",X"24",X"1A",X"38",X"66", + X"09",X"39",X"66",X"F5",X"09",X"38",X"64",X"FD",X"09",X"9F",X"64",X"E5",X"79",X"1B",X"09",X"BF", + X"0D",X"F5",X"09",X"BF",X"64",X"FD",X"09",X"3B",X"66",X"FD",X"E3",X"02",X"46",X"28",X"25",X"11", + X"43",X"67",X"E5",X"E8",X"1A",X"09",X"33",X"66",X"E3",X"86",X"30",X"32",X"09",X"BF",X"64",X"0A", + X"D7",X"64",X"E5",X"79",X"1D",X"3E",X"DB",X"F5",X"46",X"03",X"90",X"1A",X"3B",X"66",X"F5",X"7E", + X"04",X"D6",X"24",X"1A",X"3C",X"66",X"09",X"3D",X"66",X"F5",X"09",X"40",X"64",X"FD",X"09",X"BF", + X"64",X"E5",X"79",X"1B",X"09",X"C7",X"0D",X"F5",X"09",X"C7",X"64",X"FD",X"09",X"3F",X"66",X"FD", + X"E3",X"02",X"46",X"28",X"25",X"11",X"44",X"67",X"E5",X"E8",X"1A",X"09",X"33",X"66",X"E3",X"86", + X"30",X"32",X"09",X"C7",X"64",X"0A",X"D7",X"64",X"E5",X"79",X"1D",X"3E",X"DB",X"F5",X"46",X"03", + X"90",X"1A",X"3F",X"66",X"F5",X"7E",X"04",X"D6",X"24",X"1A",X"40",X"66",X"09",X"41",X"66",X"F5", + X"09",X"60",X"64",X"FD",X"09",X"C7",X"64",X"E5",X"79",X"1B",X"09",X"33",X"66",X"E3",X"56",X"C2", + X"38",X"18",X"3A",X"3C",X"65",X"E3",X"4F",X"C2",X"9F",X"2F",X"F5",X"09",X"00",X"64",X"F5",X"E3", + X"06",X"7E",X"28",X"17",X"F5",X"09",X"20",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"25",X"F5",X"09", + X"10",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"03",X"C3",X"9F",X"2F",X"F5",X"E3",X"06",X"FE",X"E3", + X"D6",X"3A",X"E7",X"64",X"F5",X"5F",X"00",X"3A",X"2D",X"66",X"F5",X"5F",X"01",X"3A",X"E7",X"64", + X"FE",X"02",X"28",X"26",X"FE",X"03",X"28",X"0F",X"3A",X"44",X"66",X"CE",X"F8",X"F5",X"5F",X"03", + X"30",X"3B",X"3A",X"44",X"66",X"CE",X"F8",X"F5",X"5F",X"03",X"3A",X"D6",X"64",X"CE",X"27",X"E3", + X"0F",X"2A",X"0B",X"66",X"E5",X"B0",X"17",X"7E",X"D6",X"24",X"F5",X"5F",X"07",X"30",X"0F",X"3A", + X"44",X"66",X"CE",X"F8",X"F5",X"5F",X"03",X"3A",X"D6",X"64",X"CE",X"27",X"E3",X"0F",X"2A",X"0B", + X"66",X"E5",X"B0",X"17",X"0B",X"7E",X"D6",X"24",X"F5",X"5F",X"07",X"30",X"21",X"3A",X"E7",X"64", + X"FE",X"04",X"28",X"24",X"30",X"29",X"3A",X"43",X"66",X"CE",X"F8",X"F5",X"5F",X"04",X"30",X"3B", + X"3A",X"43",X"66",X"CE",X"F8",X"F5",X"5F",X"04",X"3A",X"D6",X"64",X"CE",X"27",X"E3",X"0F",X"2A", + X"0D",X"66",X"E5",X"B0",X"17",X"0B",X"3E",X"DB",X"46",X"90",X"F5",X"5F",X"07",X"30",X"34",X"3A", + X"43",X"66",X"CE",X"F8",X"F5",X"5F",X"04",X"3A",X"D6",X"64",X"CE",X"27",X"E3",X"0F",X"2A",X"0D", + X"66",X"E5",X"B0",X"17",X"3E",X"DB",X"46",X"90",X"F5",X"5F",X"07",X"3A",X"75",X"65",X"FE",X"00", + X"08",X"05",X"09",X"78",X"65",X"E3",X"C6",X"F5",X"09",X"00",X"64",X"F5",X"E3",X"06",X"7E",X"28", + X"27",X"E5",X"79",X"1F",X"E5",X"57",X"18",X"09",X"00",X"64",X"0A",X"8C",X"64",X"E5",X"4C",X"27", + X"F5",X"09",X"20",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"27",X"E5",X"79",X"1F",X"E5",X"57",X"18", + X"09",X"20",X"64",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09",X"10",X"64",X"F5",X"E3",X"06", + X"7E",X"28",X"27",X"E5",X"79",X"1F",X"E5",X"57",X"18",X"09",X"10",X"64",X"0A",X"8C",X"64",X"E5", + X"4C",X"27",X"F5",X"09",X"30",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"27",X"E5",X"79",X"1F",X"E5", + X"57",X"18",X"09",X"30",X"64",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09",X"08",X"64",X"F5", + X"E3",X"06",X"7E",X"E2",X"22",X"19",X"E5",X"79",X"1F",X"E5",X"57",X"18",X"09",X"08",X"64",X"0A", + X"8C",X"64",X"E5",X"4C",X"27",X"C3",X"22",X"19",X"3A",X"2E",X"66",X"FE",X"20",X"08",X"11",X"3A", + X"3C",X"65",X"E3",X"4F",X"E2",X"9F",X"2F",X"E3",X"96",X"AF",X"1A",X"2E",X"66",X"C3",X"9F",X"2F", + X"3C",X"1A",X"2E",X"66",X"C3",X"9F",X"2F",X"F5",X"7E",X"00",X"FE",X"04",X"18",X"12",X"F5",X"7E", + X"03",X"F5",X"BE",X"07",X"08",X"27",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"30",X"05", + X"F5",X"7E",X"04",X"30",X"EC",X"09",X"19",X"66",X"E3",X"46",X"08",X"07",X"2B",X"E5",X"D6",X"18", + X"F4",X"BB",X"18",X"09",X"1D",X"66",X"E3",X"46",X"08",X"07",X"2B",X"E5",X"D6",X"18",X"F4",X"BB", + X"18",X"09",X"39",X"66",X"E3",X"46",X"08",X"07",X"2B",X"E5",X"D6",X"18",X"F4",X"BB",X"18",X"09", + X"3D",X"66",X"E3",X"46",X"08",X"07",X"2B",X"E5",X"D6",X"18",X"F4",X"BB",X"18",X"09",X"41",X"66", + X"E3",X"46",X"C0",X"2B",X"E5",X"D6",X"18",X"F4",X"BB",X"18",X"E1",X"E3",X"C6",X"09",X"93",X"65", + X"E3",X"C6",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"2A",X"47",X"66",X"ED",X"73",X"61", + X"66",X"31",X"0A",X"61",X"66",X"E1",X"F5",X"7E",X"03",X"46",X"B8",X"38",X"31",X"90",X"FE",X"22", + X"18",X"11",X"F5",X"7E",X"04",X"2B",X"46",X"B8",X"38",X"16",X"90",X"FE",X"22",X"18",X"04",X"0B", + X"0B",X"1F",X"E1",X"1F",X"3F",X"E1",X"67",X"78",X"41",X"90",X"FE",X"22",X"38",X"CC",X"30",X"DB", + X"67",X"78",X"41",X"90",X"FE",X"22",X"38",X"CF",X"30",X"E9",X"00",X"E5",X"55",X"1D",X"2A",X"46", + X"67",X"2B",X"0A",X"46",X"67",X"7D",X"9C",X"28",X"02",X"30",X"55",X"3A",X"60",X"67",X"FE",X"04", + X"38",X"05",X"D6",X"03",X"1A",X"60",X"67",X"3A",X"A8",X"64",X"3C",X"FE",X"21",X"18",X"03",X"1A", + X"A8",X"64",X"3A",X"98",X"64",X"3C",X"FE",X"22",X"18",X"03",X"1A",X"98",X"64",X"3A",X"B8",X"64", + X"3C",X"FE",X"23",X"18",X"03",X"1A",X"B8",X"64",X"3A",X"C0",X"64",X"3C",X"FE",X"25",X"18",X"03", + X"1A",X"C0",X"64",X"3A",X"E0",X"64",X"3C",X"FE",X"10",X"18",X"03",X"1A",X"E0",X"64",X"09",X"2C", + X"01",X"0A",X"46",X"67",X"3A",X"45",X"67",X"D6",X"08",X"FE",X"0D",X"38",X"03",X"1A",X"45",X"67", + X"00",X"09",X"D7",X"38",X"3A",X"3E",X"67",X"E5",X"B0",X"17",X"46",X"3A",X"3F",X"67",X"3C",X"1A", + X"3F",X"67",X"B8",X"C2",X"AD",X"19",X"AF",X"1A",X"3F",X"67",X"3A",X"CB",X"66",X"47",X"3A",X"CC", + X"66",X"80",X"1A",X"38",X"67",X"1A",X"39",X"67",X"1A",X"3A",X"67",X"1A",X"3B",X"67",X"78",X"FE", + X"02",X"28",X"06",X"3C",X"1A",X"CB",X"66",X"30",X"04",X"AF",X"1A",X"CB",X"66",X"00",X"2A",X"61", + X"66",X"EB",X"09",X"00",X"00",X"3A",X"63",X"66",X"3C",X"1A",X"63",X"66",X"FE",X"24",X"08",X"07", + X"AF",X"1A",X"63",X"66",X"09",X"10",X"00",X"31",X"EB",X"E5",X"60",X"11",X"AF",X"06",X"28",X"2A", + X"1E",X"67",X"9E",X"0B",X"10",X"FC",X"FE",X"00",X"C0",X"E5",X"FD",X"17",X"E5",X"A0",X"1C",X"09", + X"F4",X"64",X"E3",X"E6",X"E3",X"F6",X"E5",X"55",X"1D",X"09",X"CC",X"65",X"E3",X"E6",X"C3",X"1F", + X"1A",X"3A",X"F4",X"64",X"E3",X"B7",X"1A",X"F4",X"64",X"E3",X"66",X"28",X"0E",X"3A",X"46",X"66", + X"FE",X"04",X"08",X"32",X"AF",X"1A",X"46",X"66",X"3A",X"E7",X"64",X"FE",X"23",X"28",X"73",X"3C", + X"1A",X"E7",X"64",X"09",X"6D",X"1B",X"E5",X"B0",X"17",X"7E",X"1A",X"D4",X"64",X"E1",X"3C",X"1A", + X"46",X"66",X"E1",X"E3",X"E6",X"E5",X"FD",X"17",X"E5",X"A0",X"1C",X"E5",X"55",X"1D",X"3E",X"07", + X"1A",X"D4",X"64",X"AF",X"1A",X"E7",X"64",X"AF",X"09",X"19",X"66",X"E3",X"46",X"28",X"03",X"1A", + X"AA",X"64",X"09",X"1D",X"66",X"E3",X"46",X"28",X"03",X"1A",X"9A",X"64",X"09",X"39",X"66",X"E3", + X"46",X"28",X"03",X"1A",X"BA",X"64",X"09",X"3D",X"66",X"E3",X"46",X"28",X"03",X"1A",X"C2",X"64", + X"09",X"41",X"66",X"E3",X"46",X"E0",X"1A",X"E2",X"64",X"E1",X"AF",X"1A",X"D2",X"64",X"09",X"2F", + X"66",X"11",X"18",X"66",X"01",X"17",X"00",X"1E",X"00",X"ED",X"98",X"09",X"F4",X"64",X"E3",X"E6", + X"E1",X"2A",X"37",X"66",X"F5",X"7E",X"07",X"FE",X"80",X"38",X"03",X"2A",X"09",X"66",X"CE",X"27", + X"E3",X"0F",X"E3",X"0F",X"E5",X"B0",X"17",X"7E",X"DD",X"0B",X"76",X"0B",X"56",X"EB",X"7E",X"B8", + X"28",X"25",X"0B",X"0B",X"D9",X"3D",X"DD",X"28",X"02",X"30",X"DB",X"D9",X"1F",X"3F",X"E1",X"D9", + X"2B",X"7E",X"DD",X"2A",X"0B",X"66",X"FE",X"80",X"38",X"03",X"2A",X"0D",X"66",X"CE",X"27",X"E3", + X"0F",X"E5",X"B0",X"17",X"3A",X"3C",X"65",X"E3",X"67",X"28",X"15",X"E3",X"47",X"28",X"05",X"0B", + X"E3",X"57",X"28",X"24",X"7E",X"F5",X"BE",X"04",X"28",X"D1",X"D9",X"F5",X"5F",X"07",X"1F",X"E1", + X"7E",X"F5",X"BE",X"03",X"28",X"C5",X"30",X"DA",X"FD",X"E3",X"02",X"66",X"08",X"52",X"FD",X"E3", + X"02",X"56",X"28",X"0E",X"FD",X"7E",X"03",X"FE",X"04",X"08",X"32",X"FD",X"1E",X"03",X"00",X"F5", + X"7E",X"00",X"FE",X"23",X"28",X"19",X"3C",X"F5",X"5F",X"00",X"09",X"6D",X"1B",X"E5",X"B0",X"17", + X"7E",X"F5",X"5F",X"05",X"E1",X"3C",X"FD",X"5F",X"03",X"E1",X"F5",X"1E",X"05",X"07",X"F5",X"1E", + X"06",X"17",X"F5",X"7E",X"01",X"12",X"F5",X"1E",X"01",X"00",X"F5",X"1E",X"00",X"00",X"FD",X"1E", + X"03",X"00",X"FD",X"E3",X"02",X"D6",X"E1",X"FD",X"E3",X"02",X"E6",X"F5",X"1E",X"03",X"00",X"E1", + X"FD",X"46",X"03",X"3A",X"45",X"67",X"B8",X"28",X"05",X"04",X"FD",X"58",X"03",X"E1",X"FD",X"1E", + X"00",X"00",X"FD",X"1E",X"01",X"00",X"FD",X"1E",X"02",X"00",X"FD",X"1E",X"03",X"00",X"D5",X"F5", + X"CD",X"D1",X"01",X"20",X"00",X"ED",X"98",X"D1",X"32",X"F5",X"5F",X"01",X"E1",X"07",X"25",X"05", + X"21",X"07",X"25",X"05",X"21",X"07",X"25",X"05",X"21",X"F5",X"E3",X"06",X"7E",X"28",X"1C",X"F5", + X"7E",X"00",X"FE",X"04",X"18",X"28",X"F5",X"7E",X"03",X"F5",X"BE",X"07",X"08",X"27",X"F5",X"1E", + X"00",X"01",X"F5",X"E3",X"06",X"BE",X"3A",X"50",X"66",X"3D",X"1A",X"50",X"66",X"09",X"44",X"66", + X"E5",X"D6",X"18",X"F2",X"80",X"1C",X"F5",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"E1",X"F5",X"7E", + X"04",X"30",X"D6",X"E3",X"46",X"C0",X"3A",X"33",X"66",X"E3",X"47",X"28",X"3A",X"0B",X"7E",X"3D", + X"5F",X"FE",X"00",X"C0",X"3A",X"60",X"67",X"5F",X"2B",X"3A",X"50",X"66",X"FE",X"03",X"E0",X"3C", + X"1A",X"50",X"66",X"F5",X"E3",X"06",X"FE",X"FD",X"7E",X"00",X"F5",X"5F",X"00",X"3A",X"67",X"66", + X"F5",X"5F",X"01",X"2B",X"FD",X"7E",X"00",X"FE",X"02",X"28",X"12",X"FE",X"03",X"28",X"2A",X"7E", + X"CE",X"F8",X"F5",X"5F",X"03",X"30",X"3F",X"3A",X"60",X"67",X"0B",X"5F",X"E1",X"CD",X"7E",X"CE", + X"F8",X"F5",X"5F",X"03",X"FD",X"7E",X"07",X"CE",X"27",X"E3",X"0F",X"2A",X"0B",X"66",X"E5",X"B0", + X"17",X"7E",X"D6",X"24",X"F5",X"5F",X"07",X"30",X"0F",X"CD",X"7E",X"CE",X"F8",X"F5",X"5F",X"03", + X"FD",X"7E",X"07",X"CE",X"27",X"E3",X"0F",X"2A",X"0B",X"66",X"E5",X"B0",X"17",X"0B",X"7E",X"D6", + X"24",X"F5",X"5F",X"07",X"30",X"22",X"2B",X"FD",X"7E",X"00",X"FE",X"04",X"28",X"23",X"30",X"0D", + X"C9",X"2B",X"7E",X"CE",X"F8",X"F5",X"5F",X"04",X"E1",X"7E",X"CE",X"F8",X"F5",X"5F",X"04",X"FD", + X"7E",X"07",X"CE",X"27",X"E3",X"0F",X"2A",X"0D",X"66",X"E5",X"B0",X"17",X"0B",X"3E",X"DB",X"46", + X"90",X"F5",X"5F",X"07",X"E1",X"7E",X"CE",X"F8",X"F5",X"5F",X"04",X"FD",X"7E",X"07",X"CE",X"27", + X"E3",X"0F",X"2A",X"0D",X"66",X"E5",X"B0",X"17",X"3E",X"DB",X"46",X"90",X"F5",X"5F",X"07",X"E1", + X"E3",X"C6",X"09",X"E1",X"65",X"E3",X"C6",X"E1",X"F5",X"09",X"00",X"64",X"F5",X"E3",X"06",X"7E", + X"28",X"27",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"F5",X"0A",X"8C",X"64",X"E5",X"4C", + X"27",X"F5",X"09",X"20",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"27",X"F5",X"1E",X"00",X"01",X"F5", + X"E3",X"06",X"BE",X"F5",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09",X"10",X"64",X"F5",X"E3", + X"06",X"7E",X"28",X"27",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"F5",X"0A",X"8C",X"64", + X"E5",X"4C",X"27",X"F5",X"09",X"28",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"27",X"F5",X"1E",X"00", + X"01",X"F5",X"E3",X"06",X"BE",X"F5",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09",X"18",X"64", + X"F5",X"E3",X"06",X"7E",X"28",X"27",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"F5",X"0A", + X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09",X"38",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"27",X"F5", + X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"F5",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09", + X"40",X"64",X"F5",X"E3",X"06",X"7E",X"28",X"27",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE", + X"F5",X"0A",X"8C",X"64",X"E5",X"4C",X"27",X"F5",X"09",X"60",X"64",X"F5",X"E3",X"06",X"7E",X"28", + X"27",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"F5",X"0A",X"8C",X"64",X"E5",X"4C",X"27", + X"AF",X"1A",X"50",X"66",X"E1",X"2A",X"C9",X"66",X"3A",X"38",X"67",X"06",X"04",X"E5",X"3A",X"38", + X"3A",X"39",X"67",X"06",X"24",X"E5",X"3A",X"38",X"3A",X"3A",X"67",X"06",X"10",X"E5",X"3A",X"38", + X"3A",X"3B",X"67",X"06",X"04",X"E5",X"3A",X"38",X"E1",X"09",X"33",X"66",X"E3",X"86",X"E3",X"A6", + X"2A",X"35",X"66",X"EB",X"FD",X"09",X"00",X"00",X"FD",X"31",X"2A",X"D7",X"64",X"EB",X"F5",X"09", + X"00",X"00",X"F5",X"31",X"F5",X"7E",X"07",X"FE",X"80",X"D2",X"58",X"1E",X"F5",X"46",X"04",X"FD", + X"7E",X"04",X"B8",X"F2",X"3B",X"1E",X"F5",X"7E",X"07",X"FD",X"46",X"07",X"B8",X"E2",X"01",X"1E", + X"E5",X"44",X"1F",X"09",X"33",X"66",X"E3",X"66",X"C4",X"0B",X"1E",X"2A",X"29",X"66",X"7E",X"FD", + X"46",X"04",X"2A",X"2B",X"66",X"DD",X"30",X"07",X"0B",X"0B",X"D9",X"3D",X"DD",X"28",X"20",X"7E", + X"B8",X"28",X"06",X"18",X"DB",X"30",X"02",X"2B",X"2B",X"D9",X"F5",X"46",X"04",X"7E",X"B8",X"28", + X"32",X"38",X"24",X"F5",X"1E",X"00",X"03",X"F5",X"1E",X"05",X"25",X"E5",X"21",X"27",X"E1",X"F5", + X"1E",X"00",X"02",X"F5",X"1E",X"05",X"21",X"E5",X"21",X"27",X"E1",X"2B",X"7E",X"F5",X"5F",X"07", + X"E1",X"09",X"33",X"66",X"E3",X"C6",X"F5",X"1E",X"00",X"03",X"F5",X"1E",X"05",X"25",X"E5",X"21", + X"27",X"E1",X"09",X"33",X"66",X"E3",X"C6",X"F5",X"1E",X"00",X"02",X"F5",X"1E",X"05",X"21",X"E5", + X"21",X"27",X"E1",X"FD",X"7E",X"03",X"F5",X"46",X"03",X"B8",X"38",X"22",X"90",X"FE",X"21",X"D0", + X"09",X"33",X"66",X"E3",X"C6",X"E1",X"67",X"78",X"41",X"30",X"D9",X"F5",X"7E",X"07",X"FD",X"46", + X"07",X"B8",X"E2",X"12",X"1E",X"E5",X"44",X"1F",X"09",X"33",X"66",X"E3",X"66",X"C4",X"0B",X"1E", + X"2A",X"29",X"66",X"7E",X"FD",X"46",X"04",X"2A",X"2B",X"66",X"DD",X"30",X"07",X"0B",X"0B",X"D9", + X"3D",X"DD",X"28",X"07",X"7E",X"B8",X"E2",X"F1",X"1D",X"18",X"DA",X"2B",X"2B",X"C3",X"F1",X"1D", + X"F5",X"46",X"03",X"FD",X"7E",X"03",X"B8",X"F2",X"27",X"1F",X"F5",X"7E",X"07",X"FD",X"46",X"07", + X"B8",X"E2",X"D5",X"1E",X"E5",X"44",X"1F",X"09",X"33",X"66",X"E3",X"66",X"C4",X"DF",X"1E",X"2A", + X"29",X"66",X"7E",X"FD",X"46",X"03",X"2A",X"2B",X"66",X"DD",X"30",X"07",X"0B",X"0B",X"D9",X"3D", + X"DD",X"28",X"20",X"7E",X"B8",X"28",X"06",X"18",X"DB",X"30",X"02",X"2B",X"2B",X"D9",X"F5",X"46", + X"03",X"7E",X"B8",X"28",X"32",X"38",X"24",X"F5",X"1E",X"00",X"04",X"F5",X"1E",X"05",X"07",X"E5", + X"21",X"27",X"E1",X"F5",X"1E",X"00",X"05",X"F5",X"1E",X"05",X"05",X"E5",X"21",X"27",X"E1",X"2B", + X"7E",X"F5",X"5F",X"07",X"E1",X"09",X"33",X"66",X"E3",X"C6",X"F5",X"1E",X"00",X"04",X"F5",X"1E", + X"05",X"07",X"E5",X"21",X"27",X"E1",X"09",X"33",X"66",X"E3",X"C6",X"F5",X"1E",X"00",X"05",X"F5", + X"1E",X"05",X"05",X"E5",X"21",X"27",X"E1",X"FD",X"7E",X"04",X"F5",X"46",X"04",X"B8",X"38",X"22", + X"90",X"FE",X"21",X"D0",X"09",X"33",X"66",X"E3",X"C6",X"E1",X"67",X"78",X"41",X"30",X"D9",X"F5", + X"7E",X"07",X"FD",X"46",X"07",X"B8",X"E2",X"CE",X"1E",X"E5",X"44",X"1F",X"09",X"33",X"66",X"E3", + X"66",X"C4",X"DF",X"1E",X"2A",X"29",X"66",X"7E",X"FD",X"46",X"03",X"2A",X"2B",X"66",X"DD",X"30", + X"07",X"0B",X"0B",X"D9",X"3D",X"DD",X"28",X"07",X"7E",X"B8",X"E2",X"AD",X"1E",X"18",X"DA",X"2B", + X"2B",X"C3",X"AD",X"1E",X"2A",X"37",X"66",X"F5",X"7E",X"07",X"FE",X"80",X"38",X"03",X"2A",X"09", + X"66",X"CE",X"27",X"E3",X"0F",X"E3",X"0F",X"E5",X"B0",X"17",X"0A",X"29",X"66",X"46",X"FD",X"7E", + X"07",X"0B",X"76",X"0B",X"56",X"EB",X"0A",X"2B",X"66",X"2B",X"66",X"B9",X"28",X"05",X"0B",X"0B", + X"10",X"F8",X"E1",X"09",X"33",X"66",X"E3",X"E6",X"E1",X"06",X"22",X"F5",X"7E",X"03",X"09",X"F7", + X"38",X"BE",X"28",X"06",X"0B",X"10",X"FA",X"C3",X"D9",X"1F",X"78",X"3E",X"22",X"90",X"2A",X"1E", + X"67",X"E3",X"0F",X"E3",X"0F",X"E5",X"B0",X"17",X"F5",X"7E",X"04",X"46",X"B8",X"28",X"12",X"0B", + X"46",X"B8",X"28",X"25",X"0B",X"46",X"B8",X"28",X"20",X"0B",X"46",X"B8",X"28",X"03",X"C3",X"D9", + X"1F",X"1E",X"00",X"F5",X"1E",X"00",X"01",X"F5",X"E3",X"06",X"BE",X"1F",X"3F",X"ED",X"73",X"1E", + X"67",X"ED",X"52",X"EB",X"09",X"E9",X"38",X"31",X"7E",X"2A",X"C9",X"66",X"E3",X"0F",X"E5",X"B0", + X"17",X"76",X"1E",X"FF",X"0B",X"56",X"1E",X"FF",X"EB",X"1E",X"40",X"2A",X"65",X"66",X"ED",X"73", + X"61",X"66",X"31",X"0A",X"61",X"66",X"09",X"AE",X"65",X"E3",X"C6",X"09",X"2C",X"01",X"0A",X"46", + X"67",X"E1",X"A5",X"41",X"92",X"41",X"5A",X"42",X"6D",X"42",X"87",X"41",X"2A",X"41",X"E5",X"40", + X"D2",X"40",X"1D",X"41",X"B0",X"41",X"78",X"42",X"D5",X"42",X"1A",X"43",X"2D",X"43",X"E2",X"42", + X"4F",X"42",X"81",X"41",X"0C",X"41",X"C7",X"40",X"6A",X"40",X"5D",X"40",X"F0",X"40",X"3B",X"41", + X"B6",X"41",X"7E",X"42",X"F3",X"42",X"38",X"43",X"95",X"43",X"A2",X"43",X"0F",X"43",X"C4",X"42", + X"49",X"42",X"49",X"40",X"7E",X"40",X"B6",X"43",X"81",X"43",X"76",X"0B",X"56",X"12",X"0B",X"10", + X"F9",X"E1",X"11",X"E7",X"45",X"09",X"5C",X"2B",X"3E",X"02",X"06",X"04",X"E5",X"D3",X"17",X"3E", + X"21",X"1A",X"64",X"67",X"AF",X"1A",X"AA",X"64",X"1A",X"9A",X"64",X"1A",X"BA",X"64",X"1A",X"C2", + X"64",X"1A",X"E2",X"64",X"1A",X"D2",X"64",X"3E",X"02",X"1A",X"65",X"67",X"3E",X"20",X"1A",X"66", + X"67",X"1A",X"50",X"67",X"3E",X"20",X"1A",X"67",X"67",X"1A",X"53",X"67",X"3E",X"16",X"1A",X"51", + X"67",X"1A",X"55",X"67",X"3E",X"12",X"1A",X"52",X"67",X"1A",X"54",X"67",X"ED",X"73",X"66",X"67", + X"E5",X"E0",X"38",X"ED",X"73",X"50",X"67",X"E5",X"E0",X"38",X"ED",X"73",X"52",X"67",X"E5",X"E0", + X"38",X"ED",X"73",X"54",X"67",X"E5",X"E0",X"38",X"3A",X"65",X"67",X"C6",X"02",X"1A",X"65",X"67", + X"06",X"20",X"09",X"66",X"67",X"1D",X"0B",X"10",X"FC",X"3E",X"05",X"E5",X"83",X"17",X"3A",X"64", + X"67",X"3D",X"1A",X"64",X"67",X"08",X"C5",X"E1",X"E5",X"C7",X"16",X"09",X"D6",X"38",X"3A",X"65", + X"67",X"47",X"E5",X"D3",X"17",X"E1",X"2E",X"05",X"04",X"03",X"22",X"06",X"03",X"22",X"05",X"20", + X"08",X"38",X"50",X"68",X"90",X"A8",X"C0",X"F0",X"D8",X"08",X"10",X"37",X"0B",X"11",X"36",X"00", + X"00",X"12",X"04",X"27",X"35",X"13",X"05",X"26",X"34",X"06",X"00",X"03",X"25",X"07",X"01",X"02", + X"24",X"14",X"20",X"23",X"33",X"15",X"21",X"22",X"32",X"16",X"31",X"00",X"00",X"09",X"17",X"30", + X"0A",X"20",X"50",X"A0",X"D0",X"38",X"88",X"00",X"00",X"08",X"50",X"A0",X"B8",X"20",X"38",X"88", + X"D0",X"08",X"50",X"A0",X"B8",X"08",X"50",X"A0",X"B8",X"20",X"38",X"88",X"D0",X"08",X"50",X"A0", + X"B8",X"38",X"88",X"00",X"00",X"20",X"50",X"A0",X"D0",X"20",X"69",X"39",X"00",X"20",X"69",X"39", + X"00",X"02",X"79",X"39",X"00",X"02",X"7D",X"39",X"00",X"02",X"69",X"39",X"00",X"22",X"81",X"39", + X"00",X"22",X"81",X"39",X"00",X"02",X"79",X"39",X"00",X"02",X"7D",X"39",X"00",X"02",X"69",X"39", + X"00",X"20",X"69",X"39",X"00",X"20",X"69",X"39",X"D8",X"FC",X"DA",X"E4",X"DB",X"9C",X"DC",X"B4", + X"DD",X"5C",X"DE",X"74",X"DF",X"44",X"F9",X"14",X"DF",X"44",X"F9",X"14",X"DC",X"B4",X"DD",X"5C", + X"D8",X"FC",X"D9",X"CC",X"DA",X"E4",X"DB",X"9C",X"DC",X"B4",X"DD",X"5C",X"DE",X"74",X"DF",X"44", + X"F8",X"2C",X"F9",X"14",X"20",X"BC",X"39",X"00",X"02",X"E4",X"39",X"00",X"20",X"BC",X"39",X"00", + X"06",X"D0",X"39",X"00",X"20",X"F4",X"39",X"00",X"20",X"F4",X"39",X"00",X"06",X"D0",X"39",X"00", + X"20",X"EC",X"39",X"00",X"02",X"E4",X"39",X"00",X"20",X"EC",X"39",X"00",X"EB",X"01",X"D3",X"04", + X"BB",X"05",X"8B",X"06",X"6B",X"21",X"53",X"22",X"3B",X"23",X"0B",X"05",X"8B",X"06",X"6B",X"00", + X"EB",X"01",X"D3",X"05",X"8B",X"06",X"6B",X"22",X"3B",X"23",X"0B",X"00",X"EB",X"01",X"D3",X"03", + X"BB",X"05",X"8B",X"06",X"6B",X"20",X"53",X"22",X"3B",X"23",X"0B",X"00",X"EB",X"01",X"D3",X"02", + X"BB",X"05",X"8B",X"06",X"6B",X"07",X"53",X"22",X"3B",X"23",X"0B",X"14",X"FC",X"14",X"FC",X"14", + X"44",X"5C",X"B4",X"E4",X"FC",X"14",X"FC",X"14",X"FC",X"14",X"44",X"5C",X"B4",X"E4",X"FC",X"14", + X"FC",X"14",X"FC",X"0B",X"EB",X"6B",X"8B",X"0B",X"EB",X"0B",X"EB",X"0B",X"EB",X"0B",X"EB",X"0B", + X"EB",X"0B",X"EB",X"6B",X"8B",X"0B",X"EB",X"E1",X"E1",X"09",X"51",X"66",X"0A",X"C9",X"66",X"09", + X"CE",X"66",X"0A",X"1E",X"67",X"3A",X"3C",X"67",X"1A",X"3E",X"67",X"E1",X"E1",X"09",X"B1",X"66", + X"0A",X"C9",X"66",X"09",X"26",X"67",X"0A",X"1E",X"67",X"3A",X"3D",X"67",X"1A",X"3E",X"67",X"E1", + X"E1",X"09",X"DA",X"1F",X"11",X"51",X"66",X"01",X"60",X"00",X"ED",X"98",X"09",X"11",X"39",X"11", + X"CE",X"66",X"01",X"28",X"00",X"ED",X"98",X"3A",X"3C",X"67",X"3C",X"FE",X"20",X"08",X"02",X"3E", + X"07",X"1A",X"3C",X"67",X"1A",X"3E",X"67",X"E5",X"42",X"38",X"E1",X"09",X"DA",X"1F",X"11",X"B1", + X"66",X"01",X"60",X"00",X"ED",X"98",X"09",X"11",X"39",X"11",X"26",X"67",X"01",X"28",X"00",X"ED", + X"98",X"3A",X"3D",X"67",X"3C",X"FE",X"20",X"08",X"02",X"3E",X"07",X"1A",X"3D",X"67",X"1A",X"3E", + X"67",X"E5",X"42",X"38",X"E1",X"E1",X"45",X"71",X"45",X"53",X"2C",X"43",X"67",X"50",X"71",X"52", + X"61",X"47",X"60",X"54",X"08",X"19",X"39",X"38",X"1A",X"44",X"61",X"47",X"61",X"54",X"52",X"45", + X"70",X"08",X"54",X"45",X"43",X"60",X"53",X"54",X"41",X"52",X"6F",X"81",X"23",X"FD",X"90",X"07", + X"01",X"23",X"2C",X"3A",X"22",X"FD",X"93",X"09",X"02",X"9B",X"1B",X"06",X"20",X"03",X"23",X"FC", + X"92",X"07",X"02",X"23",X"2C",X"28",X"23",X"FC",X"6F",X"37",X"29",X"06",X"01",X"03",X"23",X"F4", + X"A0",X"09",X"02",X"93",X"31",X"06",X"20",X"03",X"23",X"F5",X"E5",X"09",X"02",X"A7",X"86",X"06", + X"21",X"03",X"25",X"20",X"01",X"20",X"02",X"85",X"D2",X"23",X"2C",X"E7",X"23",X"08",X"81",X"23", + X"DF",X"84",X"20",X"01",X"03",X"02",X"FE",X"84",X"20",X"02",X"03",X"23",X"DC",X"86",X"20",X"03", + X"03",X"01",X"FB",X"23",X"DB",X"84",X"20",X"04",X"03",X"23",X"F8",X"84",X"20",X"05",X"03",X"02", + X"ED",X"84",X"20",X"06",X"03",X"23",X"FE",X"84",X"20",X"07",X"03",X"23",X"FA",X"84",X"20",X"20", + X"03",X"23",X"FB",X"86",X"20",X"21",X"03",X"01",X"FB",X"07",X"05",X"23",X"28",X"BF",X"23",X"FE", + X"A5",X"20",X"22",X"07",X"07",X"22",X"29",X"6F",X"21",X"FD",X"04",X"01",X"18",X"23",X"FB",X"85", + X"20",X"23",X"01",X"58",X"23",X"FA",X"85",X"20",X"24",X"01",X"69",X"02",X"99",X"A0",X"02",X"BA", + X"6A",X"20",X"25",X"01",X"77",X"02",X"8D",X"4B",X"23",X"29",X"76",X"05",X"2C",X"85",X"01",X"86", + X"01",X"03",X"05",X"25",X"86",X"20",X"26",X"07",X"07",X"03",X"07",X"06",X"07",X"07",X"02",X"A4", + X"62",X"20",X"27",X"03",X"22",X"DE",X"84",X"23",X"DD",X"41",X"03",X"25",X"20",X"23",X"FD",X"84", + X"07",X"01",X"03",X"23",X"FC",X"1D",X"07",X"02",X"03",X"23",X"2B",X"87",X"02",X"DC",X"92",X"3D", + X"01",X"A2",X"23",X"2D",X"A4",X"02",X"EB",X"A1",X"3D",X"13",X"00",X"07",X"04",X"07",X"20",X"03", + X"21",X"FC",X"04",X"23",X"F6",X"92",X"09",X"23",X"08",X"81",X"23",X"F9",X"86",X"20",X"07",X"06", + X"22",X"03",X"02",X"20",X"2C",X"01",X"79",X"23",X"F7",X"A1",X"02",X"C6",X"0C",X"06",X"23",X"03", + X"01",X"1B",X"23",X"C8",X"C5",X"09",X"23",X"08",X"81",X"23",X"DF",X"88",X"23",X"2C",X"12",X"23", + X"28",X"27",X"23",X"DE",X"87",X"37",X"07",X"01",X"89",X"01",X"06",X"37",X"F3",X"02",X"8B",X"7A", + X"23",X"29",X"5F",X"3D",X"07",X"04",X"06",X"01",X"03",X"01",X"13",X"23",X"F9",X"96",X"37",X"06", + X"23",X"2C",X"4F",X"23",X"28",X"4C",X"23",X"DE",X"49",X"23",X"29",X"76",X"07",X"03",X"06",X"24", + X"03",X"25",X"20",X"02",X"3C",X"54",X"09",X"01",X"68",X"23",X"C9",X"A9",X"09",X"23",X"28",X"62", + X"22",X"DE",X"91",X"37",X"D3",X"02",X"6B",X"42",X"23",X"29",X"3F",X"23",X"2C",X"3C",X"23",X"DF", + X"39",X"01",X"41",X"23",X"29",X"1C",X"23",X"2C",X"19",X"22",X"DF",X"84",X"02",X"13",X"2B",X"09", + X"01",X"63",X"01",X"0E",X"23",X"CA",X"9A",X"23",X"08",X"81",X"23",X"FA",X"A4",X"23",X"2C",X"5B", + X"37",X"EB",X"23",X"FE",X"6E",X"06",X"01",X"03",X"23",X"F9",X"A3",X"23",X"2C",X"4D",X"23",X"F9", + X"4A",X"37",X"20",X"01",X"59",X"23",X"28",X"73",X"23",X"F8",X"70",X"23",X"29",X"55",X"23",X"2C", + X"52",X"37",X"CB",X"02",X"05",X"75",X"01",X"76",X"23",X"CB",X"A2",X"02",X"15",X"45",X"3D",X"07", + X"03",X"06",X"25",X"03",X"04",X"00",X"00",X"00",X"00",X"69",X"48",X"66",X"0B",X"46",X"32",X"81", + X"6F",X"13",X"32",X"A0",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"85",X"6F",X"13",X"32", + X"A4",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"8D",X"6F",X"13",X"32",X"8C",X"4F",X"E1", + X"44",X"65",X"09",X"00",X"00",X"3E",X"10",X"DD",X"29",X"EB",X"97",X"29",X"EB",X"A5",X"91",X"6F", + X"7C",X"B0",X"4F",X"13",X"D2",X"F1",X"3C",X"21",X"33",X"D9",X"3D",X"C2",X"C7",X"3C",X"E1",X"76", + X"0B",X"56",X"EB",X"29",X"CD",X"29",X"29",X"C1",X"21",X"E1",X"44",X"65",X"09",X"00",X"00",X"3E", + X"10",X"29",X"EB",X"29",X"EB",X"D2",X"F9",X"3C",X"21",X"3D",X"C2",X"D9",X"3C",X"E1",X"71",X"50", + X"EB",X"97",X"95",X"6F",X"3E",X"00",X"B4",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"9D", + X"6F",X"13",X"32",X"9C",X"4F",X"E1",X"77",X"16",X"00",X"7B",X"95",X"6F",X"7A",X"B4",X"4F",X"E1", + X"67",X"06",X"00",X"7B",X"91",X"6F",X"7A",X"B0",X"4F",X"E1",X"69",X"48",X"66",X"0B",X"46",X"32", + X"91",X"6F",X"13",X"32",X"B0",X"4F",X"E1",X"6F",X"0E",X"00",X"32",X"95",X"6F",X"13",X"32",X"B4", + X"4F",X"E1",X"77",X"16",X"00",X"7B",X"96",X"77",X"7A",X"0B",X"B6",X"57",X"EB",X"E1",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"93",X"1B",X"93",X"1B",X"F1",X"13",X"9D",X"0C",X"93",X"1B",X"EC",X"2E",X"48",X"2F", + X"00",X"00",X"F1",X"13",X"9D",X"0C",X"65",X"0E",X"FF",X"7F",X"2F",X"03",X"BA",X"06",X"00",X"04", + X"FC",X"03",X"76",X"03",X"8F",X"03",X"D5",X"03",X"A0",X"27",X"AD",X"03",X"EA",X"03",X"DF",X"03", + X"A2",X"03",X"1C",X"03",X"E7",X"03",X"4D",X"03",X"92",X"03",X"CA",X"03",X"56",X"03",X"06",X"03", + X"F2",X"92",X"03",X"DA",X"20",X"D2",X"67",X"70",X"A2",X"03",X"F2",X"A8",X"C4",X"52",X"67",X"57", + X"AD",X"03",X"85",X"C7",X"66",X"61",X"66",X"52",X"41",X"57",X"1C",X"03",X"97",X"E5",X"52",X"54", + X"A0",X"27",X"96",X"10",X"C5",X"64",X"54",X"61",X"54",X"CE",X"27",X"A3",X"E5",X"71",X"53",X"0B", + X"00",X"96",X"40",X"C2",X"55",X"53",X"4D",X"03",X"F2",X"90",X"C7",X"66",X"61",X"52",X"54",X"53", + X"D5",X"03",X"95",X"C5",X"64",X"54",X"61",X"54",X"53",X"06",X"03",X"A4",X"E4",X"52",X"53",X"8F", + X"03",X"F1",X"38",X"C1",X"52",X"53",X"1A",X"00",X"F1",X"28",X"C5",X"43",X"41",X"50",X"53",X"F1", + X"27",X"A1",X"D0",X"53",X"78",X"00",X"F8",X"18",X"C1",X"64",X"53",X"4A",X"00",X"F1",X"08",X"D2", + X"60",X"53",X"81",X"00",X"B7",X"E4",X"60",X"53",X"51",X"00",X"B6",X"D4",X"45",X"53",X"76",X"03", + X"F0",X"C0",X"C7",X"45",X"53",X"94",X"00",X"B2",X"E6",X"67",X"61",X"54",X"43",X"45",X"53",X"2A", + X"00",X"8A",X"00",X"C6",X"43",X"53",X"8F",X"27",X"D1",X"1F",X"D2",X"41",X"64",X"41",X"43",X"53", + X"EA",X"03",X"8F",X"C3",X"42",X"53",X"A5",X"00",X"F4",X"B0",X"42",X"D4",X"53",X"52",X"B2",X"00", + X"F7",X"C4",X"52",X"52",X"70",X"00",X"D2",X"4F",X"C1",X"43",X"52",X"52",X"B8",X"00",X"D1",X"27", + X"C3",X"52",X"52",X"42",X"00",X"F1",X"20",X"C1",X"52",X"52",X"C2",X"00",X"D1",X"37",X"D2",X"52", + X"CD",X"00",X"F1",X"30",X"C4",X"64",X"52",X"F6",X"00",X"D2",X"6F",X"C1",X"43",X"64",X"52",X"B3", + X"27",X"D1",X"07",X"C3",X"64",X"52",X"59",X"00",X"F1",X"00",X"C1",X"64",X"52",X"DA",X"00",X"D1", + X"17",X"E4",X"52",X"20",X"01",X"F1",X"10",X"E6",X"54",X"45",X"52",X"D0",X"00",X"D2",X"45",X"E1", + X"54",X"45",X"52",X"6B",X"00",X"D2",X"65",X"D4",X"45",X"52",X"15",X"01",X"D7",X"E1",X"C5",X"65", + X"55",X"53",X"45",X"52",X"01",X"01",X"8D",X"C5",X"56",X"52",X"45",X"53",X"45",X"52",X"86",X"00", + X"8C",X"01",X"D3",X"45",X"52",X"D6",X"00",X"F0",X"80",X"D4",X"41",X"45",X"50",X"45",X"52",X"40", + X"01",X"A7",X"D2",X"27",X"01",X"DB",X"E0",X"53",X"55",X"50",X"51",X"01",X"F6",X"C5",X"D0",X"67", + X"50",X"2C",X"01",X"F6",X"C1",X"E7",X"50",X"0D",X"01",X"DA",X"08",X"C5",X"50",X"F9",X"00",X"DA", + X"28",X"C5",X"47",X"41",X"50",X"E7",X"03",X"A0",X"30",X"D0",X"4B",X"01",X"DA",X"18",X"E1",X"54", + X"55",X"67",X"5F",X"01",X"D2",X"8B",X"C4",X"54",X"55",X"67",X"CA",X"03",X"D2",X"AB",X"D4",X"55", + X"67",X"A4",X"01",X"C9",X"41",X"D2",X"61",X"54",X"67",X"74",X"01",X"D2",X"9B",X"D2",X"44",X"54", + X"67",X"7C",X"01",X"D2",X"BB",X"C7",X"52",X"67",X"E0",X"00",X"81",X"D2",X"67",X"69",X"01",X"F2", + X"98",X"F2",X"66",X"99",X"00",X"DA",X"00",X"D0",X"67",X"66",X"63",X"00",X"D1",X"00",X"D4",X"53", + X"61",X"64",X"67",X"66",X"88",X"00",X"87",X"C7",X"45",X"66",X"47",X"01",X"D2",X"44",X"D2",X"60", + X"43",X"66",X"8B",X"01",X"B4",X"C3",X"66",X"C6",X"01",X"DA",X"10",X"C5",X"65",X"41",X"66",X"D4", + X"01",X"AB",X"C4",X"67",X"65",X"F1",X"01",X"B5",X"C7",X"45",X"65",X"9D",X"01",X"96",X"D8",X"C5", + X"65",X"55",X"01",X"96",X"FF",X"E7",X"52",X"43",X"41",X"65",X"BC",X"01",X"91",X"E5",X"93",X"01", + X"DA",X"38",X"E7",X"64",X"E4",X"01",X"B1",X"D4",X"53",X"61",X"64",X"6F",X"01",X"86",X"D2",X"61", + X"44",X"64",X"DB",X"01",X"D2",X"98",X"E1",X"44",X"64",X"8F",X"00",X"D2",X"88",X"D2",X"44",X"44", + X"64",X"CF",X"01",X"D2",X"B8",X"C4",X"44",X"64",X"06",X"02",X"D2",X"A8",X"C4",X"64",X"14",X"02", + X"D0",X"E4",X"33",X"02",X"DD",X"05",X"D2",X"62",X"35",X"01",X"D3",X"30",X"D0",X"62",X"1C",X"02", + X"D5",X"C3",X"F1",X"61",X"18",X"02",X"FC",X"08",X"F0",X"61",X"AA",X"01",X"FD",X"08",X"C5",X"47"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/Eyes_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_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/Arcade/Pacman Hardware/Eyes_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/Eyes_MiST/rtl/build_id.v new file mode 100644 index 00000000..81e50658 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171120" +`define BUILD_TIME "221924" diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/Eyes_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_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/Arcade/Pacman Hardware/Eyes_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/Eyes_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/Eyes_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/Eyes_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_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/Arcade/Pacman Hardware/Eyes_MiST/rtl/osd.v b/Arcade/Pacman Hardware/Eyes_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_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/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..9b976d32 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman.vhd @@ -0,0 +1,629 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN is +generic ( + MRTNT : std_logic := '1' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0_reg : in std_logic_vector(7 downto 0); + in1_reg : in std_logic_vector(7 downto 0); + dipsw_reg : in std_logic_vector(7 downto 0); + + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of PACMAN is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_ena : std_logic; + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal rom_data_out : std_logic_vector(7 downto 0); + signal rom_data : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal vram_addr_ab : std_logic_vector(11 downto 0); + signal ab : std_logic_vector(11 downto 0); + + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal vram_l : std_logic; + signal rams_data_out : std_logic_vector(7 downto 0); + -- more decode + signal wr0_l : std_logic; + signal wr1_l : std_logic; + signal wr2_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + +begin + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + p_sync_comb : process(hcnt, vcnt) + begin + vsync <= not vcnt(8); + do_hsync <= (hcnt = "010101111"); -- 0AF + end process; + + p_sync : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + + if (hcnt = "010010111") then -- 097 + O_HBLANK <= '1'; + elsif (hcnt = "010001111") then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") then + hblank <= '0'; -- 0EF + O_HBLANK <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + -- + -- cpu + -- + p_cpu_wait_comb : process(sync_bus_wreq_l) + begin + cpu_wait_l <= '1'; + if (sync_bus_wreq_l = '0') then + cpu_wait_l <= '0'; + end if; + end process; + + p_irq_req_watchdog : process + variable rising_vblank : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + --rising_vblank := do_hsync; -- debug + -- interrupt 8c + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + + -- simulation + -- pragma translate_off + -- synopsys translate_off + watchdog_reset_l <= not reset; -- watchdog disable + -- synopsys translate_on + -- pragma translate_on + end if; + end process; + + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + + p_cpu_ena : process(hcnt, ena_6) + begin + cpu_ena <= '0'; + if (ena_6 = '1') then + cpu_ena <= hcnt(0); + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + -- + -- primary addr decode + -- + p_mem_decode_comb : process(cpu_rfsh_l, cpu_rd_l, cpu_mreq_l, cpu_addr) + begin + -- rom 0x0000 - 0x3FFF + -- syncbus 0x4000 - 0x7FFF + + -- 7M + -- 7N + sync_bus_cs_l <= '1'; +-- program_rom_cs_l <= '1'; + + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + +-- if (cpu_addr(14) = '0') and (cpu_rd_l = '0') then +-- program_rom_cs_l <= '0'; +-- end if; + + if (cpu_addr(14) = '1') then + sync_bus_cs_l <= '0'; + end if; + + end if; + end process; + -- + -- sync bus custom ic + -- + p_sync_bus_reg : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; + end process; + + p_sync_bus_comb : process(cpu_rd_l, sync_bus_cs_l, hcnt) + begin + -- sync_bus_stb is now an active low clock enable signal + sync_bus_stb <= '1'; + sync_bus_r_w_l <= '1'; + + if (sync_bus_cs_l = '0') and (hcnt(1) = '0') then + if (cpu_rd_l = '1') then + sync_bus_r_w_l <= '0'; + end if; + sync_bus_stb <= '0'; + end if; + + sync_bus_wreq_l <= '1'; + if (sync_bus_cs_l = '0') and (hcnt(1) = '1') and (cpu_rd_l = '0') then + sync_bus_wreq_l <= '0'; + end if; + end process; + -- + -- vram addr custom ic + -- + u_vram_addr : entity work.PACMAN_VRAM_ADDR + port map ( + AB => vram_addr_ab, + H256_L => hcnt(8), + H128 => hcnt(7), + H64 => hcnt(6), + H32 => hcnt(5), + H16 => hcnt(4), + H8 => hcnt(3), + H4 => hcnt(2), + H2 => hcnt(1), + H1 => hcnt(0), + V128 => vcnt(7), + V64 => vcnt(6), + V32 => vcnt(5), + V16 => vcnt(4), + V8 => vcnt(3), + V4 => vcnt(2), + V2 => vcnt(1), + V1 => vcnt(0), + FLIP => control_reg(3) + ); + + p_ab_mux_comb : process(hcnt, cpu_addr, vram_addr_ab) + begin + --When 2H is low, the CPU controls the bus. + if (hcnt(1) = '0') then + ab <= cpu_addr(11 downto 0); + else + ab <= vram_addr_ab; + end if; + end process; + + p_vram_comb : process(hcnt, cpu_addr, sync_bus_stb) + variable a,b : std_logic; + begin + + a := not (cpu_addr(12) or sync_bus_stb); + b := hcnt(1) and hcnt(0); + vram_l <= not (a or b); + end process; + + p_io_decode_comb : process(sync_bus_r_w_l, sync_bus_stb, ab, cpu_addr) + variable sel : std_logic_vector(2 downto 0); + variable dec : std_logic_vector(7 downto 0); + variable selb : std_logic_vector(1 downto 0); + variable decb : std_logic_vector(3 downto 0); + begin + -- WRITE + + -- out_l 0x5000 - 0x503F control space + + -- wr0_l 0x5040 - 0x504F sound + -- wr1_l 0x5050 - 0x505F sound + -- wr2_l 0x5060 - 0x506F sprite + + -- 0x5080 - 0x50BF unused + + -- wdr_l 0x50C0 - 0x50FF watchdog reset + + -- READ + + -- in0_l 0x5000 - 0x503F in port 0 + -- in1_l 0x5040 - 0x507F in port 1 + -- dipsw_l 0x5080 - 0x50BF dip switches + + -- 7J + dec := "11111111"; + sel := sync_bus_r_w_l & ab(7) & ab(6); + if (cpu_addr(12) = '1') and ( sync_bus_stb = '0') then + case sel is + when "000" => dec := "11111110"; + when "001" => dec := "11111101"; + when "010" => dec := "11111011"; + when "011" => dec := "11110111"; + when "100" => dec := "11101111"; + when "101" => dec := "11011111"; + when "110" => dec := "10111111"; + when "111" => dec := "01111111"; + when others => null; + end case; + end if; + iodec_out_l <= dec(0); + iodec_wdr_l <= dec(3); + + iodec_in0_l <= dec(4); + iodec_in1_l <= dec(5); + iodec_dipsw_l <= dec(6); + + -- 7M + decb := "1111"; + selb := ab(5) & ab(4); + if (dec(1) = '0') then + case selb is + when "00" => decb := "1110"; + when "01" => decb := "1101"; + when "10" => decb := "1011"; + when "11" => decb := "0111"; + when others => null; + end case; + end if; + wr0_l <= decb(0); + wr1_l <= decb(1); + wr2_l <= decb(2); + end process; + + p_control_reg : process + variable ena : std_logic_vector(7 downto 0); + begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + ena := "00000000"; + if (iodec_out_l = '0') then + case ab(2 downto 0) is + when "000" => ena := "00000001"; + when "001" => ena := "00000010"; + when "010" => ena := "00000100"; + when "011" => ena := "00001000"; + when "100" => ena := "00010000"; + when "101" => ena := "00100000"; + when "110" => ena := "01000000"; + when "111" => ena := "10000000"; + when others => null; + end case; + end if; + + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (ena(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + p_db_mux_comb : process(hcnt, cpu_data_out, rams_data_out) + begin + -- simplified data source for video subsystem + -- only cpu or ram are sources of interest + if (hcnt(1) = '0') then + sync_bus_db <= cpu_data_out; + else + sync_bus_db <= rams_data_out; + end if; + end process; + + rom_data <= program_rom_dinl when cpu_addr(15) = '0' else program_rom_dinh; + rom_data_out <= rom_data(7 downto 6) & rom_data(3) & rom_data(4) & rom_data(5) & rom_data(2 downto 0) when MRTNT = '1' else rom_data; + + p_cpu_data_in_mux_comb : process(cpu_addr, cpu_iorq_l, cpu_m1_l, sync_bus_wreq_l, + iodec_in0_l, iodec_in1_l, iodec_dipsw_l, cpu_vec_reg, sync_bus_reg, rom_data_out, + rams_data_out, in0_reg, in1_reg, dipsw_reg) + begin + -- simplifed again + if (cpu_iorq_l = '0') and (cpu_m1_l = '0') then + cpu_data_in <= cpu_vec_reg; + elsif (sync_bus_wreq_l = '0') then + cpu_data_in <= sync_bus_reg; + else + if (cpu_addr(15 downto 14) = "00") then -- ROM at 0000 - 3fff + cpu_data_in <= rom_data_out; + elsif (cpu_addr(15 downto 13) = "100") then -- ROM at 8000 - 9fff + cpu_data_in <= rom_data_out; + else + cpu_data_in <= rams_data_out; + if (iodec_in0_l = '0') then cpu_data_in <= in0_reg; end if; + if (iodec_in1_l = '0') then cpu_data_in <= in1_reg; end if; + if (iodec_dipsw_l = '0') then cpu_data_in <= dipsw_reg; end if; + end if; + end if; + end process; + + u_rams : work.dpram generic map (12,8) + port map + ( + clk_a_i => clk, + en_a_i => ena_6, + we_i => not sync_bus_r_w_l and not vram_l, + addr_a_i => ab(11 downto 0), + data_a_i => cpu_data_out, -- cpu only source of ram data + + clk_b_i => clk, + addr_b_i => ab(11 downto 0), + data_b_o => rams_data_out + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom : entity work.ROM_PGM_0 + port map ( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom1 : entity work.ROM_PGM_1 + port map ( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinh + ); + + -- + -- video subsystem + -- + u_video : entity work.PACMAN_VIDEO + generic map ( + MRTNT => MRTNT + ) + port map ( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + I_WR2_L => wr2_l, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk + ); + + O_HSYNC <= hSync; + O_VSYNC <= vSync; + + --O_HBLANK <= hblank; + O_VBLANK <= vblank; + + -- + -- + -- audio subsystem + -- + u_audio : entity work.PACMAN_AUDIO + port map ( + I_HCNT => hcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_WR1_L => wr1_l, + I_WR0_L => wr0_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..39619ea0 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR1_L, + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => rom3m(1), + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman_rom_descrambler.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman_rom_descrambler.vhd new file mode 100644 index 00000000..d5e5f484 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman_rom_descrambler.vhd @@ -0,0 +1,479 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) d18c7db (gmail) - May 2013 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- + + +-- The following comments and source code in the comments are from MAME source code and are +-- included here to help make sense of the logic used in the VHDL address mapper and descrambler +-- +--/************************************ +-- * +-- * Ms. Pac-Man +-- * +-- ************************************/ +-- +--/* +-- Ms. Pac-Man has an auxiliary PCB with ribbon cable that plugs into the Z-80 CPU socket of a Pac-Man main PCB. Also the +-- graphics ROMs at 5E, 5F on the main board are replaced. +-- +-- The aux board contains three ROMs (two 2532 at U6, U7 and one 2716 at U5), a Z-80, and four PAL/HAL logic chips. +-- +-- The aux board logic decodes the Z-80 address and determines whether to enable the main board ROMs (containing Pac-Man +-- code) or the aux board ROMs (containing Ms. Pac-Man code). Normally the Pac-Man ROMs reside at address 0x0000-0x3fff +-- and are mirrored at 0x8000-0xbfff (Z-80 A15 is not used in Pac-Man). The aux board logic modifies the address map and +-- enables the aux board ROMs for addresses 0x3000-0x3fff and 0x8000-0x97ff. Furthermore there are forty 8-byte "patch" +-- regions which reside in the 0x0000-0x2fff address range. Any access to these patch addresses will disable the Pac-Man +-- ROMs and enable the aux board ROM. Aux board ROM addresses 0x8000-0x81ef are mapped onto the patch regions. These +-- patches typically insert jumps to new code above 0x8000. +-- +-- The aux board logic also acts as a software protection circuit which inhibits dumping of the ROMs (e.g., using a +-- microprocessor emulator system). There are several "trap" address regions which enable and disable the decode +-- functions. In order to properly operate as Ms. Pac-Man you must access one of the "latch set" trap addresses. This +-- enables the decode. If a "latch clear" address is accessed then decode is disabled and all you get is Pac-Man. For +-- more info see U.S. Patent 4,525,599 "Software protection methods and apparatus". +-- +-- The trap regions are 8 bytes in length starting on the following addresses: +-- +-- latch clear, decode disable +-- 0x0038 +-- 0x03b0 +-- 0x1600 +-- 0x2120 +-- 0x3ff0 +-- 0x8000 +-- 0x97f0 +-- +-- latch set, decode enable +-- 0x3ff8 +-- +-- Any memory access will trigger the trap behavior: instruction fetch, data read, data write. The latch clear addresses +-- should never be accessed during normal Ms. Pac-Man operation, so when the circuitry detects an access it clears the +-- latch and prevents any further dumping of the aux board ROMs. +-- +-- The Pac-Man self-test code does a checksum of the ROM 0x0000-0x2fff. This works because the checksum routine walks the +-- ROM starting from the low address and hits the latch clear trap at 0x0038 prior to encountering any of the patch +-- regions. The decode stays disabled for the rest of the checksum routine, and thus the checksum is calculated for the +-- Pac-Man ROMs with no patches applied. +-- +-- During normal operation every VBLANK (60.6Hz) interrupt will fetch its interrupt vector from the 0x3ff8 trap region, so +-- the latch is continually being enabled. +-- +-- In a further attempt to thwart copying, the aux board ROMs have a simple encryption scheme: their address and data +-- lines are bit flipped (i.e., wired in a nonstandard fashion). The specific bit flips were selected to minimize the +-- vias required to lay out the aux PCB. +--*/ + +-- +--static void mspacman_install_patches(UINT8 *ROM) +--{ +-- int i; +-- +-- /* copy forty 8-byte patches into Pac-Man code */ +-- for (i = 0; i < 8; i++) +-- { +-- ROM[0x0410+i] = ROM[0x8008+i]; +-- ROM[0x08E0+i] = ROM[0x81D8+i]; +-- ROM[0x0A30+i] = ROM[0x8118+i]; +-- ROM[0x0BD0+i] = ROM[0x80D8+i]; +-- ROM[0x0C20+i] = ROM[0x8120+i]; +-- ROM[0x0E58+i] = ROM[0x8168+i]; +-- ROM[0x0EA8+i] = ROM[0x8198+i]; +-- +-- ROM[0x1000+i] = ROM[0x8020+i]; +-- ROM[0x1008+i] = ROM[0x8010+i]; +-- ROM[0x1288+i] = ROM[0x8098+i]; +-- ROM[0x1348+i] = ROM[0x8048+i]; +-- ROM[0x1688+i] = ROM[0x8088+i]; +-- ROM[0x16B0+i] = ROM[0x8188+i]; +-- ROM[0x16D8+i] = ROM[0x80C8+i]; +-- ROM[0x16F8+i] = ROM[0x81C8+i]; +-- ROM[0x19A8+i] = ROM[0x80A8+i]; +-- ROM[0x19B8+i] = ROM[0x81A8+i]; +-- +-- ROM[0x2060+i] = ROM[0x8148+i]; +-- ROM[0x2108+i] = ROM[0x8018+i]; +-- ROM[0x21A0+i] = ROM[0x81A0+i]; +-- ROM[0x2298+i] = ROM[0x80A0+i]; +-- ROM[0x23E0+i] = ROM[0x80E8+i]; +-- ROM[0x2418+i] = ROM[0x8000+i]; +-- ROM[0x2448+i] = ROM[0x8058+i]; +-- ROM[0x2470+i] = ROM[0x8140+i]; +-- ROM[0x2488+i] = ROM[0x8080+i]; +-- ROM[0x24B0+i] = ROM[0x8180+i]; +-- ROM[0x24D8+i] = ROM[0x80C0+i]; +-- ROM[0x24F8+i] = ROM[0x81C0+i]; +-- ROM[0x2748+i] = ROM[0x8050+i]; +-- ROM[0x2780+i] = ROM[0x8090+i]; +-- ROM[0x27B8+i] = ROM[0x8190+i]; +-- ROM[0x2800+i] = ROM[0x8028+i]; +-- ROM[0x2B20+i] = ROM[0x8100+i]; +-- ROM[0x2B30+i] = ROM[0x8110+i]; +-- ROM[0x2BF0+i] = ROM[0x81D0+i]; +-- ROM[0x2CC0+i] = ROM[0x80D0+i]; +-- ROM[0x2CD8+i] = ROM[0x80E0+i]; +-- ROM[0x2CF0+i] = ROM[0x81E0+i]; +-- ROM[0x2D60+i] = ROM[0x8160+i]; +-- } +--} +-- +--DRIVER_INIT_MEMBER(pacman_state,mspacman) +--{ +-- int i; +-- UINT8 *ROM, *DROM; +-- +-- /* CPU ROMs */ +-- +-- /* Pac-Man code is in low bank */ +-- ROM = machine().root_device().memregion("maincpu")->base(); +-- +-- /* decrypted Ms. Pac-Man code is in high bank */ +-- DROM = &machine().root_device().memregion("maincpu")->base()[0x10000]; +-- +-- /* copy ROMs into decrypted bank */ +-- for (i = 0; i < 0x1000; i++) +-- { +-- DROM[0x0000+i] = ROM[0x0000+i]; /* pacman.6e */ +-- DROM[0x1000+i] = ROM[0x1000+i]; /* pacman.6f */ +-- DROM[0x2000+i] = ROM[0x2000+i]; /* pacman.6h */ +-- DROM[0x3000+i] = BITSWAP8(ROM[0xb000+BITSWAP16(i,15,14,13,12,11,3,7,9,10,8,6,5,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt u7 */ +-- } +-- for (i = 0; i < 0x800; i++) +-- { +-- DROM[0x8000+i] = BITSWAP8(ROM[0x8000+BITSWAP16(i,15,14,13,12,11,8,7,5,9,10,6,3,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt u5 */ +-- DROM[0x8800+i] = BITSWAP8(ROM[0x9800+BITSWAP16(i,15,14,13,12,11,3,7,9,10,8,6,5,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt half of u6 */ +-- DROM[0x9000+i] = BITSWAP8(ROM[0x9000+BITSWAP16(i,15,14,13,12,11,3,7,9,10,8,6,5,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt half of u6 */ +--// 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 +-- DROM[0x9800+i] = ROM[0x1800+i]; /* mirror of pacman.6f high */ +-- } +-- for (i = 0; i < 0x1000; i++) +-- { +-- DROM[0xa000+i] = ROM[0x2000+i]; /* mirror of pacman.6h */ +-- DROM[0xb000+i] = ROM[0x3000+i]; /* mirror of pacman.6j */ +-- } +-- /* install patches into decrypted bank */ +-- mspacman_install_patches(DROM); +-- +-- /* mirror Pac-Man ROMs into upper addresses of normal bank */ +-- for (i = 0; i < 0x1000; i++) +-- { +-- ROM[0x8000+i] = ROM[0x0000+i]; +-- ROM[0x9000+i] = ROM[0x1000+i]; +-- ROM[0xa000+i] = ROM[0x2000+i]; +-- ROM[0xb000+i] = ROM[0x3000+i]; +-- } +-- +-- /* initialize the banks */ +-- machine().root_device().membank("bank1")->configure_entries(0, 2, &ROM[0x00000], 0x10000); +-- machine().root_device().membank("bank1")->set_entry(1); +--} +-- +--ROM_START( puckmana ) +-- ROM_REGION( 0x10000, "maincpu", 0 ) +-- ROM_LOAD( "pacman.6e", 0x0000, 0x1000, CRC(c1e6ab10) SHA1(e87e059c5be45753f7e9f33dff851f16d6751181) ) +-- ROM_LOAD( "pacman.6f", 0x1000, 0x1000, CRC(1a6fb2d4) SHA1(674d3a7f00d8be5e38b1fdc208ebef5a92d38329) ) +-- ROM_LOAD( "pacman.6h", 0x2000, 0x1000, CRC(bcdd1beb) SHA1(8e47e8c2c4d6117d174cdac150392042d3e0a881) ) +-- ROM_LOAD( "prg7", 0x3000, 0x0800, CRC(b6289b26) SHA1(d249fa9cdde774d5fee7258147cd25fa3f4dc2b3) ) +-- ROM_LOAD( "prg8", 0x3800, 0x0800, CRC(17a88c13) SHA1(eb462de79f49b7aa8adb0cc6d31535b10550c0ce) ) +-- +--ROM_START( mspacman ) +-- ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code+64k for decrypted code */ +-- ROM_LOAD( "pacman.6e", 0x0000, 0x1000, CRC(c1e6ab10) SHA1(e87e059c5be45753f7e9f33dff851f16d6751181) ) +-- ROM_LOAD( "pacman.6f", 0x1000, 0x1000, CRC(1a6fb2d4) SHA1(674d3a7f00d8be5e38b1fdc208ebef5a92d38329) ) +-- ROM_LOAD( "pacman.6h", 0x2000, 0x1000, CRC(bcdd1beb) SHA1(8e47e8c2c4d6117d174cdac150392042d3e0a881) ) +-- ROM_LOAD( "pacman.6j", 0x3000, 0x1000, CRC(817d94e3) SHA1(d4a70d56bb01d27d094d73db8667ffb00ca69cb9) ) +-- +-- ROM_LOAD( "u5", 0x8000, 0x0800, CRC(f45fbbcd) SHA1(b26cc1c8ee18e9b1daa97956d2159b954703a0ec) ) +-- ROM_LOAD( "u6", 0x9000, 0x1000, CRC(a90e7000) SHA1(e4df96f1db753533f7d770aa62ae1973349ea4cf) ) +-- ROM_LOAD( "u7", 0xb000, 0x1000, CRC(c82cd714) SHA1(1d8ac7ad03db2dc4c8c18ade466e12032673f874) ) +-- +-- +--Normally the Pac-Man ROMs reside at address 0x0000-0x3fff and are mirrored at 0x8000-0xbfff (Z-80 A15 is not used in Pac-Man). +--The aux board logic modifies the address map and enables the aux board ROMs for addresses 0x3000-0x3fff and 0x8000-0x97ff. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity rom_descrambler is + generic ( + -- only set one of these + PENGO : std_logic := '0'; -- set to 1 when using Pengo ROMs, 0 otherwise + PACMAN : std_logic := '1'; -- set to 1 for all other Pacman hardware games + -- only set one of these when PACMAN is set + MRTNT : std_logic := '0'; -- set to 1 when using Mr TNT ROMs, 0 otherwise + LIZWIZ : std_logic := '0'; -- set to 1 when using Lizard Wizard ROMs, 0 otherwise + MSPACMAN : std_logic := '0' -- set to 1 when using Ms Pacman ROMs, 0 otherwise + ); + port ( + CLK : in std_logic; + ENA : in std_logic; + -- + cpu_m1_l : in std_logic; + addr : in std_logic_vector(15 downto 0); + data : out std_logic_vector( 7 downto 0) + ); + +end rom_descrambler; + +architecture rtl of rom_descrambler is + signal overlay_on : std_logic := '0'; + signal sega_dec_ena : std_logic; + signal rom_patched : std_logic_vector(15 downto 0); + signal rom_addr : std_logic_vector(15 downto 0); + signal rom_lo : std_logic_vector( 7 downto 0); + signal rom_hi : std_logic_vector( 7 downto 0); + signal rom_data_in : std_logic_vector( 7 downto 0); + signal rom_data_out : std_logic_vector( 7 downto 0); + signal sega_dec : std_logic_vector( 7 downto 0); +begin + -- ROM at 0000 - 3FFF + u_program_rom0 : entity work.ROM_PGM_0 + port map ( + CLK => CLK, + ADDR => rom_addr(13 downto 0), + DATA => rom_lo + ); + + -- ROM at 8000 - BFFF (Liz Wiz) + u_program_rom1 : entity work.ROM_PGM_1 + port map ( + CLK => CLK, + ADDR => rom_addr(13 downto 0), + DATA => rom_hi + ); + + -- Sega ROM descrambler adapted from MAME segacrpt.c source code + u_sega_decode : entity work.sega_decode + port map ( + I_CK => clk, + I_DEC => sega_dec_ena, -- passthrough when low + I_A(6) => cpu_m1_l, + I_A(5) => rom_addr(12), + I_A(4) => rom_addr(8), + I_A(3) => rom_addr(4), + I_A(2) => rom_addr(0), + I_A(1) => rom_data_in(5), + I_A(0) => rom_data_in(3), + I_D => rom_data_in, + O_D => sega_dec + ); + + sega_dec_ena <= PENGO and (not rom_addr(15)); + +-- The trap regions are 8 bytes in length starting on the following addresses: +-- +-- latch clear, decode disable +-- 0x0038 +-- 0x03b0 +-- 0x1600 +-- 0x2120 +-- 0x3ff0 +-- 0x8000 +-- 0x97f0 +-- +-- latch set, decode enable +-- 0x3ff8 + p_overlay : process + variable trap_addr : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + trap_addr := addr(15 downto 3) & "000"; + if trap_addr = x"3ff8" then + overlay_on <= '1'; + elsif + trap_addr = x"0038" or + trap_addr = x"03b0" or + trap_addr = x"1600" or + trap_addr = x"2120" or + trap_addr = x"3ff0" or + trap_addr = x"8000" or + trap_addr = x"97f0" + then + overlay_on <= '0'; + end if; + end process; + + p_decoder_comb : process(clk, rom_addr, addr, rom_data_in, rom_data_out, rom_patched, rom_hi, rom_lo, overlay_on, sega_dec) + variable patch_addr : std_logic_vector(15 downto 0); + begin + rom_addr <= addr; + rom_patched <= addr; + data <= rom_data_out; + + -- default is unscrambled data + rom_data_out <= rom_data_in ; + + -- mux ROMs to same data bus + -- ignore A15 so that Pacman ROMs 0000-3FFF mirror in high mem at 8000-BFFF + if rom_addr(14) = '0' then + rom_data_in <= rom_lo; + else + rom_data_in <= rom_hi; + end if; + + -- Mr TNT program ROMs have data lines D3 and D5 swapped + -- Mr TNT video ROMs have data lines D4 and D6 and address lines A0 and A2 swapped + if MRTNT = '1' then + rom_data_out <= rom_data_in(7 downto 6) & rom_data_in(3) & rom_data_in(4) & rom_data_in(5) & rom_data_in(2 downto 0); + end if; + + if PENGO = '1' then + -- ROM at 0000 - 7fff (Pengo) + if rom_addr(15) = '0' then + rom_data_out <= sega_dec; + end if; + end if; + + if MSPACMAN = '1' and overlay_on = '1' then + -- forty 8-byte patches into Pac-Man code + -- If the CPU address presented falls in a patch range, substitute it with patched address + -- OH THE HUMANITY!!! + patch_addr := addr(15 downto 3) & "000"; + case patch_addr is + when x"0410" => rom_patched <= x"800" & '1' & addr(2 downto 0); -- ROM[0x0410+i] = ROM[0x8008+i] + when x"08E0" => rom_patched <= x"81D" & '1' & addr(2 downto 0); -- ROM[0x08E0+i] = ROM[0x81D8+i] + when x"0A30" => rom_patched <= x"811" & '1' & addr(2 downto 0); -- ROM[0x0A30+i] = ROM[0x8118+i] + when x"0BD0" => rom_patched <= x"80D" & '1' & addr(2 downto 0); -- ROM[0x0BD0+i] = ROM[0x80D8+i] + when x"0C20" => rom_patched <= x"812" & '0' & addr(2 downto 0); -- ROM[0x0C20+i] = ROM[0x8120+i] + when x"0E58" => rom_patched <= x"816" & '1' & addr(2 downto 0); -- ROM[0x0E58+i] = ROM[0x8168+i] + when x"0EA8" => rom_patched <= x"819" & '1' & addr(2 downto 0); -- ROM[0x0EA8+i] = ROM[0x8198+i] + + when x"1000" => rom_patched <= x"802" & '0' & addr(2 downto 0); -- ROM[0x1000+i] = ROM[0x8020+i] + when x"1008" => rom_patched <= x"801" & '0' & addr(2 downto 0); -- ROM[0x1008+i] = ROM[0x8010+i] + when x"1288" => rom_patched <= x"809" & '1' & addr(2 downto 0); -- ROM[0x1288+i] = ROM[0x8098+i] + when x"1348" => rom_patched <= x"804" & '1' & addr(2 downto 0); -- ROM[0x1348+i] = ROM[0x8048+i] + when x"1688" => rom_patched <= x"808" & '1' & addr(2 downto 0); -- ROM[0x1688+i] = ROM[0x8088+i] + when x"16B0" => rom_patched <= x"818" & '1' & addr(2 downto 0); -- ROM[0x16B0+i] = ROM[0x8188+i] + when x"16D8" => rom_patched <= x"80C" & '1' & addr(2 downto 0); -- ROM[0x16D8+i] = ROM[0x80C8+i] + when x"16F8" => rom_patched <= x"81C" & '1' & addr(2 downto 0); -- ROM[0x16F8+i] = ROM[0x81C8+i] + when x"19A8" => rom_patched <= x"80A" & '1' & addr(2 downto 0); -- ROM[0x19A8+i] = ROM[0x80A8+i] + when x"19B8" => rom_patched <= x"81A" & '1' & addr(2 downto 0); -- ROM[0x19B8+i] = ROM[0x81A8+i] + + when x"2060" => rom_patched <= x"814" & '1' & addr(2 downto 0); -- ROM[0x2060+i] = ROM[0x8148+i] + when x"2108" => rom_patched <= x"801" & '1' & addr(2 downto 0); -- ROM[0x2108+i] = ROM[0x8018+i] + when x"21A0" => rom_patched <= x"81A" & '0' & addr(2 downto 0); -- ROM[0x21A0+i] = ROM[0x81A0+i] + when x"2298" => rom_patched <= x"80A" & '0' & addr(2 downto 0); -- ROM[0x2298+i] = ROM[0x80A0+i] + when x"23E0" => rom_patched <= x"80E" & '1' & addr(2 downto 0); -- ROM[0x23E0+i] = ROM[0x80E8+i] + when x"2418" => rom_patched <= x"800" & '0' & addr(2 downto 0); -- ROM[0x2418+i] = ROM[0x8000+i] + when x"2448" => rom_patched <= x"805" & '1' & addr(2 downto 0); -- ROM[0x2448+i] = ROM[0x8058+i] + when x"2470" => rom_patched <= x"814" & '0' & addr(2 downto 0); -- ROM[0x2470+i] = ROM[0x8140+i] + when x"2488" => rom_patched <= x"808" & '0' & addr(2 downto 0); -- ROM[0x2488+i] = ROM[0x8080+i] + when x"24B0" => rom_patched <= x"818" & '0' & addr(2 downto 0); -- ROM[0x24B0+i] = ROM[0x8180+i] + when x"24D8" => rom_patched <= x"80C" & '0' & addr(2 downto 0); -- ROM[0x24D8+i] = ROM[0x80C0+i] + when x"24F8" => rom_patched <= x"81C" & '0' & addr(2 downto 0); -- ROM[0x24F8+i] = ROM[0x81C0+i] + when x"2748" => rom_patched <= x"805" & '0' & addr(2 downto 0); -- ROM[0x2748+i] = ROM[0x8050+i] + when x"2780" => rom_patched <= x"809" & '0' & addr(2 downto 0); -- ROM[0x2780+i] = ROM[0x8090+i] + when x"27B8" => rom_patched <= x"819" & '0' & addr(2 downto 0); -- ROM[0x27B8+i] = ROM[0x8190+i] + when x"2800" => rom_patched <= x"802" & '1' & addr(2 downto 0); -- ROM[0x2800+i] = ROM[0x8028+i] + when x"2B20" => rom_patched <= x"810" & '0' & addr(2 downto 0); -- ROM[0x2B20+i] = ROM[0x8100+i] + when x"2B30" => rom_patched <= x"811" & '0' & addr(2 downto 0); -- ROM[0x2B30+i] = ROM[0x8110+i] + when x"2BF0" => rom_patched <= x"81D" & '0' & addr(2 downto 0); -- ROM[0x2BF0+i] = ROM[0x81D0+i] + when x"2CC0" => rom_patched <= x"80D" & '0' & addr(2 downto 0); -- ROM[0x2CC0+i] = ROM[0x80D0+i] + when x"2CD8" => rom_patched <= x"80E" & '0' & addr(2 downto 0); -- ROM[0x2CD8+i] = ROM[0x80E0+i] + when x"2CF0" => rom_patched <= x"81E" & '0' & addr(2 downto 0); -- ROM[0x2CF0+i] = ROM[0x81E0+i] + when x"2D60" => rom_patched <= x"816" & '0' & addr(2 downto 0); -- ROM[0x2D60+i] = ROM[0x8160+i] + when others => rom_patched <= addr; + end case; + +-- Pacman ROMs +-- 0x0000-0x0FFF = 0x0000-0x0FFF; /* pacman.6e */ +-- 0x1000-0x1FFF = 0x1000-0x1FFF; /* pacman.6f */ +-- 0x2000-0x2FFF = 0x2000-0x2FFF; /* pacman.6h */ +-- 0x3000-0x3FFF = 0x3000-0x3FFF; /* pacman.6j */ + +-- ROM mirror (easy just ignore A15) +-- 0x8000-0x8FFF = 0x0000-0x0FFF; /* mirror of pacman.6e */ +-- 0x9000-0x9FFF = 0x1000-0x1FFF; /* mirror of pacman.6f */ +-- 0xA000-0xAFFF = 0x2000-0x2FFF; /* mirror of pacman.6h */ +-- 0xB000-0xBFFF = 0x3000-0x3FFF; /* mirror of pacman.6j */ + +-- Ms Pacman overlays + +-- no xlate +-- 0x8000-0x87FF = 0x8000-0x87FF (physical ROM hi 0000-07FF); /* decrypt u5 */ +-- 0x9000-0x97FF = 0x9000-0x97FF (physical ROM hi 1000-17FF); /* decrypt half of u6 */ + +-- xlate addr +-- 0x3000-0x3FFF = 0xB000-0xBFFF (physical ROM hi 2000-2FFF); /* decrypt u7 */ + +-- xlate addr +-- 0x8800-0x8FFF = 0x9800-0x9FFF (physical ROM hi 1800-1FFF); /* decrypt half of u6 */ + +-- ROM hi mem map +-- u5 2K 0000-07FF (0x8000-0x87FF) +-- u5 2K 0800-0FFF N/A +-- u6b 2K 1000-17FF (0x9000-0x97FF) +-- u6t 2K 1800-1FFF (0x8800-0x8FFF) +-- u7 4K 2000-2FFF (0x3000-0x3FFF) + + -- If the new patched address falls in certain Ms Pacman ranges, swap in ROM overlays and descramble address and data + -- high address bits are not scrambled so we know for sure this only accesses ROM hi after address translation + case rom_patched(15 downto 11) is + + -- addr = 0x3000-0x37FF, xlate to 0xB000-0xB7FF (physical ROM hi 2000-27FF), decrypt half of u7 + when "00110" => + rom_addr <= x"2" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x3800-0x3FFF, xlate to 0xB800-0xBFFF (physical ROM hi 2800-2FFF), decrypt half of u7 + when "00111" => + rom_addr <= x"2" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x8000-0x87FF, no xlate (physical ROM hi 0000-07FF), decrypt u5 + when "10000" => + rom_addr <= x"0" & rom_patched(11) & rom_patched(8) & rom_patched(7) & rom_patched(5) & rom_patched(9) & rom_patched(10) & rom_patched(6) & rom_patched(3) & rom_patched(4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x8800-0x8FFF, xlate to 0x9800-0x9FFF (physical ROM hi 1800-1FFF), decrypt half of u6 + when "10001" => + rom_addr <= x"1" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x9000-0x97FF, no xlate (physical ROM hi 1000-17FF), decrypt half of u6 + when "10010" => + rom_addr <= x"1" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- catch all default action + when others => null; + rom_addr <= rom_patched; + rom_data_out <= rom_data_in; + end case; + end if; + end process; + +end rtl; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..895304e9 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman_video.vhd @@ -0,0 +1,366 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_VIDEO is +generic ( + MRTNT : std_logic := '0' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); +port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + I_WR2_L : in std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic +); +end; + +architecture RTL of PACMAN_VIDEO is + + signal sprite_xy_ram_temp : std_logic_vector(7 downto 0); + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal db_reg : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_dout : std_logic_vector(7 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal cntr_ld : std_logic; + signal sprite_ram_ip : std_logic_vector(3 downto 0); + signal sprite_ram_op : std_logic_vector(3 downto 0); + signal ra : std_logic_vector(7 downto 0); + signal ra_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(3 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + + -- ram enable is low when HBLANK_L is 0 (for sprite access) or + -- 2H is low (for cpu writes) + -- we can simplify this + dr <= not sprite_xy_ram_temp when I_HBLANK = '1' else "11111111"; -- pull ups on board + + sprite_xy_ram : work.dpram generic map (4,8) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR2_L, + addr_a_i => I_AB(3 downto 0), + data_a_i => I_DB, + + clk_b_i => CLK, + addr_b_i => I_AB(3 downto 0), + data_b_o => sprite_xy_ram_temp + ); + + p_char_regs : process + variable inc : std_logic; + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; + begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + inc := (not I_HBLANK); + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & inc); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + db_reg <= I_DB; -- character reg + end if; + end process; + + p_flip_comb : process(char_hblank_reg, I_FLIP, db_reg) + begin + if (char_hblank_reg = '0') then + xflip <= I_FLIP; + yflip <= I_FLIP; + else + xflip <= db_reg(1); + yflip <= db_reg(0); + end if; + end process; + + p_char_addr_comb : process(db_reg, I_HCNT, + char_match_reg, char_sum_reg, char_hblank_reg, + xflip, yflip) + begin + obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + + ca(12) <= char_hblank_reg; + ca(11 downto 6) <= db_reg(7 downto 2); + + -- 2h, 4e + if (char_hblank_reg = '0') then + ca(5) <= db_reg(1); + ca(4) <= db_reg(0); + else + ca(5) <= char_sum_reg(3) xor xflip; + ca(4) <= I_HCNT(3); + end if; + + ca(3) <= I_HCNT(2) xor yflip; + ca(1) <= char_sum_reg(1) xor xflip; + + -- descramble ROMs for Mr TNT (swap address lines A0 and A2) + if MRTNT = '1' then + ca(2) <= char_sum_reg(0) xor xflip; + ca(0) <= char_sum_reg(2) xor xflip; + else + ca(2) <= char_sum_reg(2) xor xflip; + ca(0) <= char_sum_reg(0) xor xflip; + end if; + end process; + + + -- descramble ROMs for Mr TNT (swap data lines D4 and D6) + char_rom_5ef_dout <= char_rom_5ef_buf(7) & char_rom_5ef_buf(4) & char_rom_5ef_buf(5) & char_rom_5ef_buf(6) & char_rom_5ef_buf(3 downto 0) when MRTNT = '1' else char_rom_5ef_buf; + + -- char roms + char_rom_5ef : entity work.GFX1 + port map ( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf + ); + + p_char_shift : process + begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_dout(7 downto 4); -- load + shift_regl <= char_rom_5ef_dout(3 downto 0); + when others => null; + end case; + end if; + end process; + + p_char_shift_comb : process(I_HCNT, vout_yflip, shift_regu, shift_regl) + variable ip : std_logic; + begin + ip := I_HCNT(0) and I_HCNT(1); + if (vout_yflip = '0') then + + shift_sel(0) <= ip; + shift_sel(1) <= '1'; + shift_op(0) <= shift_regl(3); + shift_op(1) <= shift_regu(3); + else + + shift_sel(0) <= '1'; + shift_sel(1) <= ip; + shift_op(0) <= shift_regl(0); + shift_op(1) <= shift_regu(0); + end if; + end process; + + p_video_out_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= I_DB(4 downto 0); -- colour reg + end if; + end if; + end process; + + col_rom_4a : entity work.PROM4_DST + port map ( + CLK => CLK, + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a + ); + + cntr_ld <= '1' when (I_HCNT(3 downto 0) = "0111") and (vout_hblank='1' or vout_obj_on='0') else '0'; + + p_ra_cnt : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (cntr_ld = '1') then + ra <= dr; + else + ra <= ra + "1"; + end if; + end if; + end process; + + u_sprite_ram : work.dpram generic map (8,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => vout_obj_on_t1, + addr_a_i => ra_t1, + data_a_i => sprite_ram_ip, + + clk_b_i => CLK, + addr_b_i => ra, + data_b_o => sprite_ram_op + ); + + sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "0000"; + video_op_sel <= '1' when not (sprite_ram_reg = "0000") else '0'; + + p_sprite_ram_ip_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + ra_t1 <= ra; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + end if; + end process; + + p_sprite_ram_ip_comb : process(vout_hblank_t1, video_op_sel, sprite_ram_reg, lut_4a_t1) + begin + -- 3a + if (vout_hblank_t1 = '0') then + sprite_ram_ip <= (others => '0'); + else + if (video_op_sel = '1') then + sprite_ram_ip <= sprite_ram_reg; + else + sprite_ram_ip <= lut_4a_t1(3 downto 0); + end if; + end if; + end process; + + p_video_op_comb : process(vout_hblank, I_VBLANK, video_op_sel, sprite_ram_reg, lut_4a) + begin + -- 3b + if (vout_hblank = '1') or (I_VBLANK = '1') then + final_col <= (others => '0'); + else + if (video_op_sel = '1') then + final_col <= sprite_ram_reg; -- sprite + else + final_col <= lut_4a(3 downto 0); + end if; + end if; + end process; + + -- assign video outputs from color LUT PROM + col_rom_7f : entity work.PROM7_DST + port map ( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE + ); + +end architecture; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman_vram_addr.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman_vram_addr.vhd new file mode 100644 index 00000000..b26824c4 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pacman_vram_addr.vhd @@ -0,0 +1,273 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ & CarlW - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity X74_157 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end; + +architecture RTL of X74_157 is +begin + p_y_comb : process(S,G,A,B) + begin + for i in 0 to 3 loop + -- quad 2 line to 1 line mux (true logic) + if (G = '1') then + Y(i) <= '0'; + else + if (S = '0') then + Y(i) <= A(i); + else + Y(i) <= B(i); + end if; + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity X74_257 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end; + +architecture RTL of X74_257 is +signal ab : std_logic_vector (3 downto 0); +begin + + Y <= ab; -- no tristate + p_ab : process(S,A,B) + begin + for i in 0 to 3 loop + if (S = '0') then + AB(i) <= A(i); + else + AB(i) <= B(i); + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VRAM_ADDR is + port ( + AB : out std_logic_vector (11 downto 0); + H256_L : in std_logic; + H128 : in std_logic; + H64 : in std_logic; + H32 : in std_logic; + H16 : in std_logic; + H8 : in std_logic; + H4 : in std_logic; + H2 : in std_logic; + H1 : in std_logic; + V128 : in std_logic; + V64 : in std_logic; + V32 : in std_logic; + V16 : in std_logic; + V8 : in std_logic; + V4 : in std_logic; + V2 : in std_logic; + V1 : in std_logic; + FLIP : in std_logic + ); +end; + +architecture RTL of PACMAN_VRAM_ADDR is + +signal v128p : std_logic; +signal v64p : std_logic; +signal v32p : std_logic; +signal v16p : std_logic; +signal v8p : std_logic; +signal h128p : std_logic; +signal h64p : std_logic; +signal h32p : std_logic; +signal h16p : std_logic; +signal h8p : std_logic; +signal sel : std_logic; +signal y157 : std_logic_vector (11 downto 0); + +component X74_157 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end component; + +component X74_257 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end component; + +begin + p_vp_comb : process(FLIP, V8, V16, V32, V64, V128) + begin + v128p <= FLIP xor V128; + v64p <= FLIP xor V64; + v32p <= FLIP xor V32; + v16p <= FLIP xor V16; + v8p <= FLIP xor V8; + end process; + + p_hp_comb : process(FLIP, H8, H16, H32, H64, H128) + begin + H128P <= FLIP xor H128; + H64P <= FLIP xor H64; + H32P <= FLIP xor H32; + H16P <= FLIP xor H16; + H8P <= FLIP xor H8; + end process; + + p_sel : process(H16, H32, H64) + begin + sel <= not((H32 xor H16) or (H32 xor H64)); + end process; + + --p_oe257 : process(H2) + --begin + -- oe <= not(H2); + --end process; + + U6 : X74_157 + port map( + Y => y157(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => h64p, + B(0) => h64p, + A => "1111", + G => '0', + S => sel + ); + + U5 : X74_157 + port map( + Y => y157(7 downto 4), + B(3) => h64p, + B(2) => h64p, + B(1) => h8p, + B(0) => v128p, + A => "1111", + G => '0', + S => sel + ); + + U4 : X74_157 + port map( + Y => y157(3 downto 0), + B(3) => v64p, + B(2) => v32p, + B(1) => v16p, + B(0) => v8p, + A(3) => H64, + A(2) => H32, + A(1) => H16, + A(0) => H4, + G => '0', + S => sel + ); + + U3 : X74_257 + port map( + Y => AB(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => v128p, + B(0) => v64p, + A => y157(11 downto 8), + S => H256_L + ); + + U2 : X74_257 + port map( + Y => AB(7 downto 4), + B(3) => v32p, + B(2) => v16p, + B(1) => v8p, + B(0) => h128p, + A => y157(7 downto 4), + S => H256_L + ); + + U1 : X74_257 + port map( + Y => AB(3 downto 0), + B(3) => h64p, + B(2) => h32p, + B(1) => h16p, + B(0) => h8p, + A => y157(3 downto 0), + S => H256_L + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_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 VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/pll.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pll.vhd new file mode 100644 index 00000000..3c952a1a --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/pll.vhd @@ -0,0 +1,365 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC ; + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + locked <= sub_wire0; + sub_wire2 <= sub_wire1(0); + c0 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 9, + clk0_duty_cycle => 50, + clk0_multiply_by => 8, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire4, + locked => sub_wire0, + clk => sub_wire1 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "9" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +-- 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 "1" +-- 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: 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_CLKENA0 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 "9" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +-- Retrieval info: CONSTANT: CLK0_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_USED" +-- 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_USED" +-- 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_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/Eyes_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/Eyes_MiST/rtl/sega_decode.vhd b/Arcade/Pacman Hardware/Eyes_MiST/rtl/sega_decode.vhd new file mode 100644 index 00000000..8ae8141d --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_MiST/rtl/sega_decode.vhd @@ -0,0 +1,191 @@ +------------------------------------------------------------------------------- +-- Pengo decode table +-- /* opcode (M1=0) data (M1=1) address */ +-- /* 0 1 2 3 0 1 2 3 A12 A8 A4 A0 */ +-- { 0xa0,0x80,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...0 */ +-- { 0x28,0xa8,0x08,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...0...1 */ +-- { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...0...1...0 */ +-- { 0x08,0x28,0x88,0xa8 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...1 */ +-- { 0x08,0x00,0x88,0x80 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...1...0...0 */ +-- { 0xa0,0x80,0x20,0x00 }, { 0x08,0x00,0x88,0x80 }, /* ...0...1...0...1 */ +-- { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...1...0 */ +-- { 0xa0,0x80,0x20,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...0...1...1...1 */ +-- { 0x88,0x80,0x08,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...0...0 */ +-- { 0x88,0x80,0x08,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...1...0...0...1 */ +-- { 0x08,0x28,0x88,0xa8 }, { 0x08,0x28,0x88,0xa8 }, /* ...1...0...1...0 */ +-- { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...1...1 */ +-- { 0x08,0x00,0x88,0x80 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...0 */ +-- { 0x00,0x08,0x20,0x28 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...1 */ +-- { 0x08,0x28,0x88,0xa8 }, { 0x08,0x28,0x88,0xa8 }, /* ...1...1...1...0 */ +-- { 0x08,0x00,0x88,0x80 }, { 0xa0,0x80,0x20,0x00 } /* ...1...1...1...1 */ +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity sega_decode is + port ( + I_DEC : in std_logic; + I_CK : in std_logic; + -- + I_A : in std_logic_vector(6 downto 0); + I_D : in std_logic_vector(7 downto 0); + O_D : out std_logic_vector(7 downto 0) + ); + +end sega_decode; + +architecture rtl of sega_decode is + signal sel : std_logic_vector(6 downto 0); + signal val : std_logic_vector(2 downto 0); +begin + p_decoder : process + begin + wait until rising_edge(I_CK); + if (I_DEC = '0') then + O_D <= I_D; -- passthough + else + sel <= I_A xor ("00000" & I_D(7) & I_D(7)); + O_D(7) <= I_D(7) xor val(2); + O_D(6) <= I_D(6); + O_D(5) <= I_D(7) xor val(1); + O_D(4) <= I_D(4); + O_D(3) <= I_D(7) xor val(0); + O_D(2) <= I_D(2); + O_D(1) <= I_D(1); + O_D(0) <= I_D(0); + case sel is -- M1 A12 A8 A4 A0 D5 D3 + when "0000000" => val <= "110"; + when "0000001" => val <= "100"; + when "0000010" => val <= "111"; + when "0000011" => val <= "101"; + when "0000100" => val <= "011"; + when "0000101" => val <= "111"; + when "0000110" => val <= "001"; + when "0000111" => val <= "101"; + when "0001000" => val <= "110"; + when "0001001" => val <= "100"; + when "0001010" => val <= "010"; + when "0001011" => val <= "000"; + when "0001100" => val <= "001"; + when "0001101" => val <= "011"; + when "0001110" => val <= "101"; + when "0001111" => val <= "111"; + when "0010000" => val <= "001"; + when "0010001" => val <= "000"; + when "0010010" => val <= "101"; + when "0010011" => val <= "100"; + when "0010100" => val <= "110"; + when "0010101" => val <= "100"; + when "0010110" => val <= "010"; + when "0010111" => val <= "000"; + when "0011000" => val <= "110"; + when "0011001" => val <= "100"; + when "0011010" => val <= "010"; + when "0011011" => val <= "000"; + when "0011100" => val <= "110"; + when "0011101" => val <= "100"; + when "0011110" => val <= "010"; + when "0011111" => val <= "000"; + when "0100000" => val <= "101"; + when "0100001" => val <= "100"; + when "0100010" => val <= "001"; + when "0100011" => val <= "000"; + when "0100100" => val <= "101"; + when "0100101" => val <= "100"; + when "0100110" => val <= "001"; + when "0100111" => val <= "000"; + when "0101000" => val <= "001"; + when "0101001" => val <= "011"; + when "0101010" => val <= "101"; + when "0101011" => val <= "111"; + when "0101100" => val <= "110"; + when "0101101" => val <= "100"; + when "0101110" => val <= "111"; + when "0101111" => val <= "101"; + when "0110000" => val <= "001"; + when "0110001" => val <= "000"; + when "0110010" => val <= "101"; + when "0110011" => val <= "100"; + when "0110100" => val <= "000"; + when "0110101" => val <= "001"; + when "0110110" => val <= "010"; + when "0110111" => val <= "011"; + when "0111000" => val <= "001"; + when "0111001" => val <= "011"; + when "0111010" => val <= "101"; + when "0111011" => val <= "111"; + when "0111100" => val <= "001"; + when "0111101" => val <= "000"; + when "0111110" => val <= "101"; + when "0111111" => val <= "100"; + when "1000000" => val <= "011"; + when "1000001" => val <= "111"; + when "1000010" => val <= "001"; + when "1000011" => val <= "101"; + when "1000100" => val <= "110"; + when "1000101" => val <= "100"; + when "1000110" => val <= "111"; + when "1000111" => val <= "101"; + when "1001000" => val <= "110"; + when "1001001" => val <= "100"; + when "1001010" => val <= "010"; + when "1001011" => val <= "000"; + when "1001100" => val <= "110"; + when "1001101" => val <= "100"; + when "1001110" => val <= "111"; + when "1001111" => val <= "101"; + when "1010000" => val <= "011"; + when "1010001" => val <= "111"; + when "1010010" => val <= "001"; + when "1010011" => val <= "101"; + when "1010100" => val <= "001"; + when "1010101" => val <= "000"; + when "1010110" => val <= "101"; + when "1010111" => val <= "100"; + when "1011000" => val <= "110"; + when "1011001" => val <= "100"; + when "1011010" => val <= "010"; + when "1011011" => val <= "000"; + when "1011100" => val <= "000"; + when "1011101" => val <= "001"; + when "1011110" => val <= "010"; + when "1011111" => val <= "011"; + when "1100000" => val <= "110"; + when "1100001" => val <= "100"; + when "1100010" => val <= "010"; + when "1100011" => val <= "000"; + when "1100100" => val <= "000"; + when "1100101" => val <= "001"; + when "1100110" => val <= "010"; + when "1100111" => val <= "011"; + when "1101000" => val <= "001"; + when "1101001" => val <= "011"; + when "1101010" => val <= "101"; + when "1101011" => val <= "111"; + when "1101100" => val <= "110"; + when "1101101" => val <= "100"; + when "1101110" => val <= "010"; + when "1101111" => val <= "000"; + when "1110000" => val <= "101"; + when "1110001" => val <= "100"; + when "1110010" => val <= "001"; + when "1110011" => val <= "000"; + when "1110100" => val <= "101"; + when "1110101" => val <= "100"; + when "1110110" => val <= "001"; + when "1110111" => val <= "000"; + when "1111000" => val <= "001"; + when "1111001" => val <= "011"; + when "1111010" => val <= "101"; + when "1111011" => val <= "111"; + when "1111100" => val <= "110"; + when "1111101" => val <= "100"; + when "1111110" => val <= "010"; + when "1111111" => val <= "000"; + when others => null; + end case; + end if; + end process; +end rtl; diff --git a/Arcade/Pacman Hardware/Eyes_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/Eyes_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/Eyes_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/Arcade/Pacman Hardware/Gorkans_MiST/Gorkans.qpf b/Arcade/Pacman Hardware/Gorkans_MiST/Gorkans.qpf new file mode 100644 index 00000000..9705f206 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/Gorkans.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Gorkans" diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/Gorkans.qsf b/Arcade/Pacman Hardware/Gorkans_MiST/Gorkans.qsf new file mode 100644 index 00000000..c0468a5c --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/Gorkans.qsf @@ -0,0 +1,175 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 20:43:12 November 20, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Gorkans_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/pll.v +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/ROM/GFX1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Gorkans.sv + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Gorkans +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Alibaba) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Alibaba) +# ------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/Gorkans.srf b/Arcade/Pacman Hardware/Gorkans_MiST/Gorkans.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/Gorkans.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/README.txt b/Arcade/Pacman Hardware/Gorkans_MiST/README.txt new file mode 100644 index 00000000..1d5f4e4c --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/README.txt @@ -0,0 +1,24 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Gorkans for MiST by Gehstock +-- 21 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F1 : Start 1 player +-- F2 : Start 2 players +-- SPACE,CTRL : Slowdown +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/Release/Gorkans.rbf b/Arcade/Pacman Hardware/Gorkans_MiST/Release/Gorkans.rbf new file mode 100644 index 00000000..9edb814a Binary files /dev/null and b/Arcade/Pacman Hardware/Gorkans_MiST/Release/Gorkans.rbf differ diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/clean.bat b/Arcade/Pacman Hardware/Gorkans_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_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/Arcade/Pacman Hardware/Gorkans_MiST/rtl/Gorkans.sv b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/Gorkans.sv new file mode 100644 index 00000000..eb1b781e --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/Gorkans.sv @@ -0,0 +1,196 @@ +//============================================================================ +// Arcade: Gorkans +// +// Version for MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Gorkans +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Gorkans;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys, clk_snd; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [7:0] audio; +assign LED = 1; +//wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(340), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +//wire m_bomb = kbjoy[8]; +//wire m_Serv = kbjoy[9]; +//wire m_skip = kbjoy[9]; + + +pacman gorkans +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .in0(~{2'b00, m_coin, 1'b0, m_down,m_right,m_left,m_up}), + .in1(~{1'b0, m_start2, m_start1, m_fire, 4'b0000}), + + .dipsw1(8'b1_1_11_00_11), + .dipsw2(8'b11111111), + + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..c4a2de4f --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"CC",X"EE",X"11",X"11",X"33",X"EE",X"CC",X"00",X"11",X"33",X"66",X"44",X"44",X"33",X"11",X"00", + X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00",X"00",X"00",X"77",X"77",X"22",X"00",X"00",X"00", + X"11",X"99",X"DD",X"DD",X"FF",X"77",X"33",X"00",X"33",X"77",X"55",X"44",X"44",X"66",X"22",X"00", + X"66",X"FF",X"99",X"99",X"99",X"33",X"22",X"00",X"44",X"66",X"77",X"55",X"44",X"44",X"00",X"00", + X"44",X"FF",X"FF",X"44",X"44",X"CC",X"CC",X"00",X"00",X"77",X"77",X"66",X"33",X"11",X"00",X"00", + X"EE",X"FF",X"11",X"11",X"11",X"33",X"22",X"00",X"00",X"55",X"55",X"55",X"55",X"77",X"77",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"EE",X"00",X"00",X"44",X"44",X"44",X"66",X"33",X"11",X"00", + X"00",X"00",X"88",X"FF",X"77",X"00",X"00",X"00",X"66",X"77",X"55",X"44",X"44",X"66",X"66",X"00", + X"66",X"77",X"DD",X"DD",X"99",X"99",X"66",X"00",X"00",X"33",X"44",X"44",X"55",X"77",X"33",X"00", + X"CC",X"EE",X"BB",X"99",X"99",X"99",X"00",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"F0",X"F0",X"F0",X"FF",X"FF",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"FF",X"FF",X"F1",X"F1",X"F1", + X"F0",X"F0",X"F0",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F1",X"F1", + X"F0",X"F0",X"F0",X"FF",X"FF",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F1",X"F1",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"F1",X"F1",X"F1", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"FF",X"FF",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1", + X"F0",X"F0",X"F0",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"F0",X"F0",X"F0", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"26",X"79",X"5B",X"5B",X"79",X"26",X"00",X"00",X"00",X"11",X"77",X"77",X"11",X"00",X"00", + X"00",X"66",X"66",X"00",X"00",X"66",X"66",X"00",X"00",X"66",X"66",X"00",X"00",X"66",X"66",X"00", + X"FC",X"F2",X"F1",X"F5",X"F5",X"F9",X"F2",X"FC",X"F3",X"F4",X"F8",X"FA",X"FA",X"F9",X"F4",X"F3", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"EF",X"00",X"EF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"EF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"EF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"EF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00",X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00", + X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00",X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00", + X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00",X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00", + X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00",X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00", + X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00",X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00", + X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00",X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00", + X"00",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"48",X"50",X"11",X"49",X"50",X"01",X"27",X"00",X"1E", + X"00",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"D8",X"67",X"11",X"D9",X"67",X"01",X"27",X"00",X"1E", + X"00",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"40",X"50",X"11",X"41",X"50",X"01",X"37",X"00",X"1E", + X"00",X"ED",X"98",X"09",X"24",X"64",X"11",X"25",X"64",X"01",X"67",X"00",X"1E",X"FF",X"ED",X"98", + X"3C",X"DE",X"EF",X"6F",X"6F",X"EF",X"DE",X"3C",X"C3",X"B7",X"7F",X"6F",X"6F",X"7F",X"B7",X"C3", + X"3C",X"DE",X"2F",X"2F",X"2F",X"2F",X"DE",X"3C",X"C3",X"B7",X"4F",X"4F",X"4F",X"4F",X"B7",X"C3", + X"3C",X"1E",X"0F",X"0F",X"0F",X"0F",X"1E",X"3C",X"C3",X"87",X"0F",X"0F",X"0F",X"0F",X"87",X"C3", + X"F0",X"F8",X"FC",X"7F",X"7F",X"FC",X"F8",X"F0",X"F1",X"F3",X"E7",X"CF",X"CF",X"E7",X"F3",X"F1", + X"F0",X"F0",X"F0",X"FF",X"FF",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"FF",X"FF",X"F1",X"F1",X"F1", + X"F0",X"F0",X"F0",X"2D",X"2D",X"F0",X"F0",X"F0",X"F0",X"96",X"69",X"78",X"78",X"78",X"B4",X"F0", + X"00",X"04",X"01",X"0A",X"00",X"04",X"01",X"00",X"00",X"02",X"08",X"00",X"02",X"09",X"04",X"01", + X"F0",X"F0",X"F0",X"78",X"78",X"F0",X"F0",X"78",X"C3",X"E1",X"E1",X"C3",X"C3",X"E1",X"E1",X"E1", + X"B4",X"D2",X"B4",X"78",X"78",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E1",X"E1",X"D2",X"B4",X"D2", + X"F0",X"F0",X"F0",X"78",X"78",X"A5",X"D2",X"F0",X"F0",X"B4",X"5A",X"E1",X"E1",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"78",X"78",X"F0",X"F0",X"F0",X"F0",X"F0",X"E1",X"D2",X"D2",X"E1",X"F0",X"F0", + X"F0",X"F0",X"78",X"B4",X"B4",X"78",X"F0",X"F0",X"F0",X"E1",X"D2",X"B4",X"B4",X"D2",X"E1",X"F0", + X"F0",X"78",X"B4",X"D2",X"D2",X"B4",X"78",X"F0",X"E1",X"D2",X"B4",X"78",X"78",X"B4",X"D2",X"E1", + X"B4",X"B4",X"C3",X"F0",X"F0",X"C3",X"B4",X"B4",X"D2",X"D2",X"3C",X"F0",X"F0",X"3C",X"D2",X"D2", + X"78",X"78",X"B4",X"C3",X"C3",X"B4",X"78",X"78",X"E1",X"E1",X"D2",X"3C",X"3C",X"D2",X"E1",X"E1", + X"78",X"78",X"78",X"87",X"87",X"78",X"78",X"78",X"E1",X"E1",X"E1",X"1E",X"1E",X"E1",X"E1",X"E1", + X"F0",X"F0",X"78",X"3C",X"3C",X"78",X"F0",X"F0",X"1E",X"87",X"C3",X"E1",X"E1",X"C3",X"87",X"1E", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1", + X"87",X"1E",X"3C",X"78",X"78",X"3C",X"1E",X"87",X"F0",X"F0",X"E1",X"C3",X"C3",X"E1",X"F0",X"F0", + X"3C",X"D2",X"E1",X"E1",X"E1",X"E1",X"D2",X"3C",X"C3",X"B4",X"78",X"78",X"78",X"78",X"B4",X"C3", + X"F0",X"F0",X"1E",X"E1",X"E1",X"1E",X"F0",X"F0",X"F0",X"F0",X"87",X"78",X"78",X"87",X"F0",X"F0", + X"F0",X"F0",X"C3",X"2D",X"2D",X"C3",X"F0",X"F0",X"F0",X"F0",X"3C",X"4B",X"4B",X"3C",X"F0",X"F0", + X"F0",X"78",X"B4",X"3C",X"3C",X"B4",X"78",X"F0",X"F0",X"E1",X"D2",X"C3",X"C3",X"D2",X"E1",X"F0", + X"F0",X"B4",X"D2",X"5A",X"5A",X"D2",X"B4",X"F0",X"F0",X"D2",X"B4",X"A5",X"A5",X"B4",X"D2",X"F0", + X"96",X"E1",X"E1",X"69",X"69",X"E1",X"E1",X"96",X"96",X"78",X"78",X"69",X"69",X"78",X"78",X"96", + X"78",X"78",X"D2",X"E1",X"E1",X"D2",X"78",X"78",X"E1",X"E1",X"B4",X"78",X"78",X"B4",X"E1",X"E1", + X"96",X"69",X"69",X"F0",X"F0",X"78",X"78",X"F0",X"F0",X"E1",X"E1",X"F0",X"F0",X"69",X"69",X"96", + X"F0",X"F0",X"78",X"78",X"78",X"69",X"E1",X"96",X"96",X"78",X"69",X"E1",X"E1",X"E1",X"F0",X"F0", + X"F0",X"F0",X"1E",X"E1",X"E1",X"1E",X"F0",X"F0",X"F0",X"F0",X"87",X"78",X"78",X"87",X"F0",X"F0", + X"F0",X"1E",X"E1",X"E1",X"E1",X"E1",X"1E",X"F0",X"F0",X"87",X"78",X"78",X"78",X"78",X"87",X"F0", + X"1E",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"1E",X"87",X"78",X"78",X"78",X"78",X"78",X"78",X"87", + X"F0",X"F0",X"78",X"3C",X"3C",X"78",X"F0",X"F0",X"F0",X"F0",X"E1",X"C3",X"C3",X"E1",X"F0",X"F0", + X"F0",X"78",X"3C",X"1E",X"1E",X"3C",X"78",X"F0",X"F0",X"E1",X"C3",X"87",X"87",X"C3",X"E1",X"F0", + X"78",X"3C",X"1E",X"0F",X"0F",X"1E",X"3C",X"78",X"E1",X"C3",X"87",X"0F",X"0F",X"87",X"C3",X"E1", + X"96",X"C3",X"E1",X"F0",X"F0",X"E1",X"C3",X"96",X"96",X"3C",X"78",X"F0",X"F0",X"78",X"3C",X"96", + X"1E",X"87",X"C3",X"E1",X"E1",X"C3",X"87",X"1E",X"87",X"1E",X"3C",X"78",X"78",X"3C",X"1E",X"87", + X"3C",X"0F",X"87",X"C3",X"C3",X"87",X"0F",X"3C",X"87",X"0F",X"1E",X"3C",X"3C",X"1E",X"0F",X"87", + X"C3",X"E1",X"B4",X"F0",X"F0",X"B4",X"E1",X"C3",X"3C",X"78",X"D2",X"F0",X"F0",X"D2",X"78",X"3C", + X"F0",X"96",X"D2",X"78",X"78",X"D2",X"96",X"F0",X"F0",X"96",X"B4",X"E1",X"E1",X"B4",X"96",X"F0", + X"F0",X"F0",X"3C",X"3C",X"3C",X"3C",X"F0",X"F0",X"F0",X"F0",X"C3",X"C3",X"C3",X"C3",X"F0",X"F0", + X"F0",X"F0",X"D2",X"0F",X"0F",X"D2",X"F0",X"F0",X"F0",X"F0",X"B4",X"0F",X"0F",X"B4",X"F0",X"F0", + X"F0",X"F0",X"F0",X"78",X"78",X"87",X"87",X"96",X"96",X"1E",X"1E",X"E1",X"E1",X"F0",X"F0",X"F0", + X"96",X"87",X"87",X"78",X"78",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E1",X"E1",X"1E",X"1E",X"96", + X"E0",X"D0",X"B0",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"D0",X"B0",X"70", + X"F1",X"F3",X"F7",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"F1",X"F3",X"F7",X"FF", + X"F0",X"F0",X"F0",X"F0",X"F8",X"FC",X"FE",X"FF",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"F0",X"F0",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"F0",X"F0",X"F0", + X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"F3",X"F1",X"FF",X"F7",X"F3",X"F1",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FE",X"FC",X"F8",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"F8", + X"FC",X"FC",X"FC",X"FC",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"30",X"30",X"30",X"30",X"FC",X"FC",X"FC",X"FC",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"30",X"30",X"30",X"30", + X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"FC",X"FC",X"FC",X"FC",X"30",X"30",X"30",X"30", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30", + X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"30",X"30",X"30",X"30",X"FC",X"FC",X"FC",X"FC",X"30",X"30",X"30",X"30",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"30",X"30",X"30",X"30",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"30",X"30",X"30",X"30",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"FC",X"FC",X"FC",X"FC", + X"FC",X"FC",X"FC",X"FC",X"30",X"30",X"30",X"30",X"FC",X"FC",X"FC",X"FC",X"30",X"30",X"30",X"30", + X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30", + X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"06",X"06",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"06",X"06",X"00",X"00",X"00",X"00",X"06",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"06",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"00",X"00", + X"06",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06", + X"00",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"00", + X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C",X"00", + X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0C",X"0C",X"00",X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"00", + X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"22", + X"C0",X"E0",X"F4",X"F8",X"F8",X"F4",X"E0",X"C0",X"30",X"70",X"F2",X"F1",X"F1",X"F2",X"70",X"30", + X"47",X"4F",X"52",X"4B",X"41",X"4E",X"53",X"2C",X"43",X"4F",X"50",X"59",X"52",X"49",X"47",X"48", + X"54",X"20",X"31",X"39",X"38",X"33",X"54",X"45",X"43",X"48",X"53",X"54",X"41",X"52",X"20",X"49", + X"4E",X"43",X"1A",X"04",X"65",X"E5",X"AC",X"38",X"E5",X"E1",X"38",X"09",X"97",X"64",X"E3",X"E6", + X"09",X"96",X"64",X"E3",X"4E",X"28",X"02",X"30",X"32",X"3E",X"00",X"1A",X"03",X"50",X"E5",X"66", + X"15",X"11",X"50",X"41",X"09",X"DD",X"30",X"3E",X"01",X"06",X"25",X"E5",X"F7",X"15",X"3E",X"03", + X"E5",X"71",X"15",X"09",X"96",X"64",X"E3",X"EE",X"3A",X"8E",X"64",X"3D",X"1A",X"8E",X"64",X"3E", + X"40",X"09",X"16",X"40",X"11",X"17",X"40",X"01",X"20",X"00",X"5F",X"ED",X"98",X"E5",X"13",X"00", + X"3A",X"FF",X"64",X"1A",X"03",X"65",X"3A",X"00",X"65",X"1A",X"04",X"65",X"E5",X"21",X"39",X"C3", + X"B2",X"23",X"09",X"96",X"64",X"E3",X"4E",X"08",X"E2",X"E3",X"6E",X"28",X"AC",X"3A",X"96",X"64", + X"E3",X"7F",X"08",X"43",X"E5",X"66",X"15",X"11",X"50",X"41",X"09",X"02",X"31",X"3E",X"01",X"06", + X"25",X"E5",X"F7",X"15",X"3E",X"03",X"E5",X"71",X"15",X"09",X"96",X"64",X"E3",X"AE",X"3A",X"8F", + X"64",X"3D",X"1A",X"8F",X"64",X"3E",X"40",X"09",X"02",X"40",X"11",X"03",X"40",X"01",X"20",X"00", + X"5F",X"ED",X"98",X"E5",X"0C",X"00",X"3A",X"01",X"65",X"1A",X"03",X"65",X"3A",X"02",X"65",X"1A", + X"04",X"65",X"E5",X"11",X"39",X"30",X"1B",X"3E",X"01",X"1A",X"03",X"50",X"30",X"9E",X"E5",X"66", + X"15",X"09",X"96",X"64",X"E3",X"4E",X"C2",X"E8",X"22",X"11",X"10",X"41",X"09",X"27",X"31",X"3E", + X"01",X"06",X"11",X"E5",X"F7",X"15",X"09",X"08",X"65",X"E3",X"C6",X"3E",X"01",X"E5",X"71",X"15", + X"09",X"96",X"64",X"E3",X"6E",X"28",X"8F",X"C3",X"E8",X"22",X"E5",X"EF",X"26",X"09",X"97",X"64", + X"E3",X"66",X"28",X"13",X"E3",X"A6",X"09",X"C2",X"65",X"E3",X"C6",X"1A",X"C0",X"50",X"3A",X"C2", + X"65",X"FE",X"00",X"08",X"DE",X"30",X"05",X"3E",X"02",X"E5",X"71",X"15",X"E5",X"C5",X"33",X"ED", + X"73",X"AE",X"64",X"7B",X"9A",X"28",X"21",X"09",X"00",X"00",X"0A",X"AE",X"64",X"E5",X"73",X"27", + X"1A",X"C0",X"50",X"E5",X"37",X"16",X"09",X"96",X"64",X"E3",X"66",X"28",X"F7",X"E3",X"A6",X"E5", + X"14",X"16",X"09",X"96",X"64",X"E3",X"56",X"08",X"27",X"E5",X"33",X"39",X"E5",X"14",X"16",X"09", + X"96",X"64",X"E3",X"76",X"08",X"21",X"30",X"4F",X"E3",X"96",X"E5",X"32",X"39",X"30",X"EA",X"E3", + X"B6",X"09",X"97",X"64",X"E3",X"E6",X"09",X"96",X"64",X"E3",X"6E",X"08",X"29",X"3A",X"01",X"65", + X"3C",X"FE",X"24",X"08",X"02",X"3E",X"23",X"1A",X"01",X"65",X"1A",X"03",X"65",X"3A",X"02",X"65", + X"3C",X"FE",X"31",X"08",X"02",X"3E",X"30",X"1A",X"02",X"65",X"1A",X"04",X"65",X"E5",X"34",X"39", + X"E5",X"31",X"39",X"C3",X"B2",X"23",X"3A",X"FF",X"64",X"3C",X"FE",X"24",X"08",X"02",X"3E",X"23", + X"1A",X"FF",X"64",X"1A",X"03",X"65",X"3A",X"00",X"65",X"3C",X"FE",X"31",X"08",X"02",X"3E",X"30", + X"1A",X"00",X"65",X"1A",X"04",X"65",X"E5",X"34",X"39",X"E5",X"30",X"39",X"C3",X"B2",X"23",X"3A", + X"98",X"64",X"FE",X"00",X"08",X"2E",X"09",X"96",X"64",X"E3",X"6E",X"08",X"2F",X"3A",X"8F",X"64", + X"FE",X"00",X"08",X"66",X"E5",X"66",X"15",X"11",X"90",X"41",X"09",X"08",X"31",X"3E",X"01",X"06", + X"21",X"E5",X"F7",X"15",X"3E",X"02",X"E5",X"71",X"15",X"E5",X"F8",X"11",X"09",X"95",X"64",X"E3", + X"DE",X"C3",X"7D",X"07",X"D6",X"01",X"1A",X"98",X"64",X"C3",X"6E",X"23",X"3A",X"8E",X"64",X"FE", + X"00",X"08",X"0D",X"09",X"96",X"64",X"E3",X"4E",X"08",X"E2",X"E5",X"66",X"15",X"11",X"D8",X"40", + X"09",X"29",X"31",X"3E",X"01",X"06",X"14",X"E5",X"F7",X"15",X"3E",X"03",X"E5",X"71",X"15",X"C3", + X"35",X"23",X"E5",X"10",X"39",X"C3",X"12",X"23",X"E5",X"20",X"39",X"C3",X"12",X"23",X"2A",X"91", + X"64",X"EB",X"F5",X"09",X"00",X"00",X"F5",X"31",X"F5",X"7E",X"01",X"F5",X"86",X"02",X"47",X"CE", + X"27",X"F5",X"5F",X"02",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"F5",X"7E",X"00",X"09", + X"FC",X"24",X"E3",X"0F",X"E5",X"BA",X"15",X"76",X"0B",X"56",X"EB",X"E9",X"20",X"25",X"20",X"25", + X"21",X"25",X"11",X"25",X"31",X"25",X"09",X"25",X"E1",X"F5",X"7E",X"04",X"90",X"F5",X"5F",X"04", + X"E1",X"F5",X"7E",X"04",X"80",X"F5",X"5F",X"04",X"E1",X"F5",X"7E",X"03",X"80",X"F5",X"5F",X"03", + X"E1",X"F5",X"7E",X"03",X"90",X"F5",X"5F",X"03",X"E1",X"2A",X"76",X"64",X"EB",X"F5",X"09",X"00", + X"00",X"F5",X"31",X"EB",X"01",X"00",X"64",X"1F",X"3F",X"ED",X"42",X"CD",X"F5",X"7E",X"00",X"09", + X"64",X"25",X"E3",X"0F",X"E5",X"BA",X"15",X"76",X"0B",X"56",X"EB",X"E9",X"34",X"26",X"70",X"25", + X"B3",X"25",X"2B",X"26",X"1D",X"26",X"60",X"26",X"F5",X"7E",X"03",X"1A",X"74",X"64",X"F5",X"7E", + X"04",X"1A",X"75",X"64",X"E5",X"9A",X"26",X"F5",X"7E",X"06",X"12",X"3A",X"22",X"64",X"FE",X"00", + X"08",X"17",X"3A",X"23",X"64",X"FE",X"00",X"08",X"17",X"C1",X"09",X"24",X"64",X"21",X"CD",X"D1", + X"13",X"01",X"05",X"00",X"1E",X"FF",X"ED",X"98",X"E1",X"F5",X"7E",X"06",X"13",X"12",X"30",X"E9", + X"F5",X"7E",X"06",X"09",X"08",X"00",X"31",X"EB",X"12",X"30",X"F6",X"E5",X"F2",X"26",X"F5",X"7E", + X"03",X"90",X"1A",X"74",X"64",X"F5",X"7E",X"04",X"1A",X"75",X"64",X"E5",X"9A",X"26",X"3A",X"22", + X"64",X"FE",X"00",X"28",X"1A",X"3A",X"22",X"64",X"E3",X"0F",X"F5",X"46",X"05",X"80",X"3D",X"C1", + X"FD",X"09",X"24",X"64",X"FD",X"21",X"FD",X"5B",X"00",X"FD",X"5A",X"01",X"FD",X"5F",X"02",X"3C", + X"13",X"FD",X"5B",X"03",X"FD",X"5A",X"04",X"FD",X"5F",X"05",X"3A",X"74",X"64",X"F5",X"5F",X"03", + X"3A",X"75",X"64",X"F5",X"5F",X"04",X"E1",X"3A",X"23",X"64",X"FE",X"00",X"E2",X"51",X"26",X"3A", + X"23",X"64",X"E3",X"0F",X"C6",X"27",X"F5",X"46",X"05",X"80",X"C1",X"FD",X"09",X"24",X"64",X"FD", + X"21",X"FD",X"5B",X"00",X"FD",X"5A",X"01",X"FD",X"5F",X"02",X"3C",X"09",X"08",X"00",X"31",X"EB", + X"FD",X"5B",X"03",X"FD",X"5A",X"04",X"FD",X"5F",X"05",X"C3",X"F2",X"25",X"F5",X"7E",X"03",X"1A", + X"74",X"64",X"F5",X"7E",X"04",X"1A",X"75",X"64",X"C3",X"AB",X"25",X"E5",X"F2",X"26",X"F5",X"7E", + X"03",X"80",X"C3",X"8A",X"25",X"E5",X"F2",X"26",X"F5",X"7E",X"04",X"90",X"1A",X"75",X"64",X"F5", + X"7E",X"03",X"1A",X"74",X"64",X"C3",X"AB",X"25",X"E5",X"F2",X"26",X"F5",X"7E",X"04",X"80",X"30", + X"EB",X"F5",X"7E",X"05",X"C1",X"FD",X"09",X"24",X"64",X"FD",X"21",X"FD",X"5B",X"00",X"FD",X"5A", + X"01",X"FD",X"5F",X"02",X"3A",X"74",X"64",X"F5",X"5F",X"03",X"3A",X"75",X"64",X"F5",X"5F",X"04", + X"F5",X"7E",X"00",X"09",X"85",X"26",X"E3",X"0F",X"E5",X"BA",X"15",X"D5",X"76",X"0B",X"56",X"EB", + X"D1",X"F5",X"7E",X"06",X"E9",X"91",X"26",X"91",X"26",X"92",X"26",X"B5",X"26",X"88",X"26",X"8F", + X"26",X"E1",X"13",X"FD",X"5B",X"03",X"FD",X"5A",X"04",X"FD",X"5F",X"05",X"E1",X"33",X"30",X"DB", + X"09",X"08",X"00",X"31",X"EB",X"30",X"EC",X"EB",X"11",X"08",X"00",X"1F",X"3F",X"ED",X"52",X"EB", + X"30",X"C9",X"3A",X"74",X"64",X"CE",X"07",X"1A",X"22",X"64",X"3A",X"75",X"64",X"CE",X"07",X"1A", + X"23",X"64",X"3A",X"74",X"64",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"57",X"3A",X"75",X"64",X"E3", + X"3F",X"E3",X"3F",X"E3",X"3F",X"77",X"E5",X"E9",X"14",X"E1",X"F5",X"7E",X"01",X"F5",X"86",X"02", + X"47",X"CE",X"27",X"F5",X"5F",X"02",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E1",X"3A", + X"03",X"65",X"09",X"FD",X"26",X"E3",X"0F",X"E3",X"0F",X"E5",X"BA",X"15",X"E9",X"E5",X"E2",X"29", + X"E1",X"E5",X"0B",X"2A",X"E1",X"E5",X"7C",X"2A",X"E1",X"E5",X"D5",X"2A",X"E1",X"E5",X"2E",X"2B", + X"E1",X"E5",X"87",X"2B",X"E1",X"E5",X"C8",X"2B",X"E1",X"E5",X"1E",X"2C",X"E1",X"E5",X"A4",X"2C", + X"E1",X"E5",X"CD",X"2C",X"E1",X"E5",X"3E",X"2D",X"E1",X"E5",X"A2",X"2D",X"E1",X"E5",X"D6",X"2D", + X"E1",X"E5",X"D7",X"2D",X"E1",X"E5",X"F0",X"2D",X"E1",X"E5",X"F1",X"2D",X"E1",X"D5",X"1F",X"3F", + X"09",X"26",X"01",X"16",X"00",X"ED",X"52",X"7D",X"1F",X"3F",X"09",X"10",X"01",X"D1",X"72",X"16", + X"00",X"ED",X"52",X"55",X"77",X"E1",X"7D",X"EE",X"03",X"6F",X"E1",X"09",X"96",X"64",X"E3",X"46", + X"E0",X"E3",X"6E",X"28",X"43",X"09",X"A8",X"64",X"7B",X"86",X"0F",X"5F",X"0B",X"7A",X"A6",X"0F", + X"5F",X"0B",X"3E",X"00",X"A6",X"0F",X"5F",X"38",X"02",X"30",X"1A",X"09",X"96",X"64",X"E3",X"6E", + X"28",X"13",X"09",X"DE",X"43",X"11",X"DF",X"43",X"01",X"05",X"00",X"1E",X"40",X"ED",X"98",X"AF", + X"1A",X"DE",X"43",X"30",X"30",X"09",X"CC",X"43",X"11",X"CD",X"43",X"01",X"05",X"00",X"1E",X"40", + X"ED",X"98",X"AF",X"1A",X"CC",X"43",X"30",X"05",X"09",X"AB",X"64",X"30",X"BB",X"09",X"96",X"64", + X"E3",X"6E",X"28",X"74",X"09",X"AA",X"64",X"11",X"FB",X"43",X"3A",X"99",X"64",X"DD",X"E5",X"33", + X"10",X"0B",X"0B",X"0B",X"EB",X"2A",X"8B",X"64",X"D9",X"FE",X"04",X"D0",X"E3",X"0F",X"E3",X"0F", + X"3C",X"3C",X"E5",X"BA",X"15",X"E5",X"98",X"11",X"D0",X"3A",X"98",X"64",X"3C",X"1A",X"98",X"64", + X"09",X"08",X"65",X"E3",X"C6",X"09",X"96",X"64",X"E3",X"6E",X"28",X"12",X"3A",X"99",X"64",X"3C", + X"1A",X"99",X"64",X"3A",X"8E",X"64",X"3C",X"1A",X"8E",X"64",X"E5",X"13",X"00",X"E1",X"3A",X"9A", + X"9C",X"63",X"41",X"9C",X"BE",X"BE",X"41",X"00",X"41",X"14",X"36",X"41",X"63",X"63",X"14",X"00", + X"41",X"41",X"FF",X"00",X"41",X"41",X"FF",X"00",X"00",X"22",X"77",X"00",X"00",X"00",X"77",X"00", + X"41",X"FF",X"DD",X"63",X"C9",X"77",X"DD",X"00",X"63",X"14",X"55",X"22",X"77",X"36",X"14",X"00", + X"36",X"C9",X"C9",X"22",X"FF",X"63",X"C9",X"00",X"14",X"14",X"77",X"00",X"36",X"14",X"55",X"00", + X"00",X"00",X"88",X"CC",X"66",X"22",X"33",X"FF",X"00",X"00",X"11",X"33",X"66",X"00",X"00",X"77", + X"33",X"EE",X"88",X"00",X"00",X"00",X"00",X"FF",X"CC",X"77",X"11",X"00",X"00",X"00",X"00",X"FF", + X"EE",X"00",X"00",X"66",X"CC",X"88",X"00",X"00",X"FF",X"CC",X"44",X"66",X"33",X"11",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"88",X"EE",X"33",X"FF",X"00",X"00",X"00",X"00",X"11",X"77",X"CC", + X"00",X"00",X"00",X"88",X"88",X"CC",X"44",X"44",X"00",X"00",X"33",X"77",X"55",X"44",X"44",X"66", + X"00",X"33",X"11",X"88",X"CC",X"EE",X"77",X"33",X"00",X"00",X"EE",X"33",X"00",X"00",X"00",X"88", + X"66",X"22",X"22",X"AA",X"EE",X"CC",X"00",X"00",X"22",X"22",X"33",X"11",X"11",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"CC",X"77",X"00",X"00",X"CC",X"EE",X"77",X"33",X"11",X"77",X"CC",X"00", + X"00",X"00",X"00",X"88",X"88",X"CC",X"44",X"66",X"00",X"00",X"00",X"11",X"11",X"33",X"22",X"66", + X"77",X"DD",X"99",X"99",X"11",X"11",X"11",X"11",X"00",X"99",X"99",X"99",X"88",X"88",X"88",X"88", + X"66",X"44",X"CC",X"88",X"88",X"00",X"00",X"00",X"66",X"22",X"33",X"11",X"11",X"00",X"00",X"00", + X"11",X"11",X"11",X"11",X"99",X"99",X"99",X"44",X"88",X"88",X"88",X"88",X"99",X"99",X"BB",X"EE", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"CC",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"11", + X"00",X"00",X"33",X"66",X"EE",X"00",X"00",X"FF",X"00",X"00",X"CC",X"66",X"77",X"11",X"00",X"FF", + X"88",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"33",X"33",X"11",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"88",X"EE",X"66",X"33",X"00",X"00",X"FF",X"00",X"00",X"77",X"66",X"CC",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"44",X"44",X"00",X"00",X"00",X"00",X"00",X"11",X"22",X"22", + X"00",X"00",X"33",X"00",X"88",X"44",X"22",X"11",X"00",X"00",X"CC",X"33",X"00",X"00",X"00",X"00", + X"44",X"44",X"88",X"00",X"00",X"00",X"00",X"00",X"22",X"22",X"11",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"CC",X"33",X"00",X"00",X"88",X"44",X"22",X"11",X"00",X"CC",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"44",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"22", + X"00",X"00",X"33",X"FF",X"DD",X"99",X"11",X"11",X"00",X"00",X"00",X"33",X"99",X"99",X"88",X"88", + X"44",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"22",X"33",X"11",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"99",X"99",X"DD",X"00",X"00",X"00",X"88",X"88",X"99",X"BB",X"FF",X"CC",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00", + X"00",X"00",X"00",X"33",X"66",X"CC",X"00",X"FF",X"00",X"00",X"00",X"CC",X"66",X"33",X"11",X"FF", + X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"88",X"CC",X"66",X"33",X"00",X"00",X"00",X"FF",X"00",X"33",X"66",X"CC",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"99",X"CC",X"AA",X"99",X"00",X"00",X"00",X"00",X"CC",X"66",X"33",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"CC",X"66",X"33",X"00",X"00",X"00",X"00",X"99",X"55",X"33",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11", + X"00",X"00",X"00",X"33",X"77",X"DD",X"99",X"11",X"00",X"00",X"00",X"22",X"AA",X"BB",X"99",X"88", + X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"99",X"DD",X"55",X"44",X"00",X"00",X"00",X"88",X"99",X"BB",X"AA",X"CC",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"33",X"EE",X"00",X"77",X"00",X"00",X"00",X"00",X"CC",X"66",X"33",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"CC",X"66",X"33",X"00",X"00",X"00",X"00",X"EE",X"00",X"77",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"44",X"AA",X"99",X"00",X"00",X"00",X"00",X"CC",X"22",X"11",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"44",X"33",X"00",X"00",X"00",X"00",X"99",X"55",X"22",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"33",X"55",X"55",X"99",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"99", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"99",X"55",X"55",X"00",X"00",X"00",X"00",X"00",X"99",X"AA",X"AA",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"77",X"00",X"33",X"00",X"00",X"00",X"00",X"00",X"CC",X"22",X"EE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"44",X"33",X"00",X"00",X"00",X"00",X"00",X"CC",X"00",X"EE",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"44",X"66",X"55",X"00",X"00",X"00",X"00",X"00",X"88",X"44",X"22", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"22",X"11",X"00",X"00",X"00",X"00",X"00",X"AA",X"66",X"22",X"88",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"77",X"55",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"55",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"AA",X"EE",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"88",X"CC",X"EE",X"EE",X"FF",X"FF",X"00",X"00",X"11",X"33",X"77",X"77",X"FF",X"FF", + X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"EE",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"77",X"77",X"33",X"11",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC", + X"00",X"00",X"88",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"11",X"11",X"11",X"33",X"33",X"33", + X"FB",X"F8",X"FB",X"FF",X"FC",X"FB",X"FC",X"FF",X"FB",X"F1",X"FF",X"FF",X"F3",X"FD",X"F3",X"FF", + X"CC",X"CC",X"88",X"88",X"88",X"00",X"00",X"00",X"33",X"33",X"11",X"11",X"11",X"00",X"00",X"00", + X"FC",X"FB",X"FC",X"FF",X"FC",X"FB",X"FC",X"00",X"F3",X"FD",X"F3",X"FF",X"F3",X"FD",X"F3",X"00", + X"00",X"00",X"88",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"11",X"11",X"11",X"33",X"33",X"33", + X"F9",X"FA",X"FB",X"FB",X"FF",X"FC",X"FB",X"FC",X"FB",X"FD",X"F5",X"FB",X"FF",X"F3",X"FD",X"F3", + X"CC",X"CC",X"CC",X"88",X"88",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"11",X"00",X"00", + X"FF",X"FC",X"FB",X"FC",X"FF",X"FC",X"FB",X"FC",X"FF",X"F3",X"FD",X"F3",X"FF",X"F3",X"FD",X"F3", + X"00",X"00",X"88",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"11",X"11",X"11",X"33",X"33",X"33", + X"FF",X"FE",X"FE",X"F8",X"FE",X"FC",X"FB",X"FC",X"FF",X"F7",X"FB",X"F1",X"FF",X"F3",X"FD",X"F3", + X"CC",X"CC",X"CC",X"88",X"88",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"11",X"00",X"00", + X"FF",X"FC",X"FB",X"FC",X"FF",X"FC",X"FB",X"FC",X"FF",X"F3",X"FD",X"F3",X"FF",X"F3",X"FD",X"F3", + X"00",X"00",X"88",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"11",X"11",X"11",X"33",X"33",X"33", + X"FC",X"FB",X"FB",X"FC",X"FF",X"FC",X"FB",X"FC",X"FB",X"F5",X"F5",X"FB",X"FF",X"F3",X"FD",X"F3", + X"CC",X"CC",X"CC",X"88",X"88",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"11",X"00",X"00", + X"FF",X"FC",X"FB",X"FC",X"FF",X"FC",X"FB",X"FC",X"FF",X"F3",X"FD",X"F3",X"FF",X"F3",X"FD",X"F3", + X"00",X"00",X"00",X"00",X"88",X"CC",X"EE",X"FF",X"00",X"00",X"00",X"00",X"32",X"76",X"EF",X"CF", + X"00",X"00",X"02",X"70",X"67",X"91",X"08",X"0C",X"00",X"00",X"22",X"33",X"19",X"0C",X"37",X"37", + X"FF",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"8F",X"EF",X"76",X"32",X"00",X"00",X"00",X"00", + X"0C",X"08",X"91",X"E7",X"70",X"02",X"00",X"00",X"37",X"37",X"0C",X"19",X"33",X"22",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"00",X"00", + X"11",X"33",X"77",X"FF",X"BB",X"33",X"07",X"0C",X"88",X"CC",X"EE",X"FF",X"DD",X"CC",X"0E",X"03", + X"80",X"84",X"80",X"00",X"00",X"00",X"00",X"00",X"10",X"12",X"10",X"00",X"00",X"00",X"00",X"00", + X"4C",X"88",X"89",X"C3",X"C3",X"EF",X"77",X"33",X"23",X"11",X"19",X"3C",X"3C",X"7F",X"EE",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"EE",X"00",X"00",X"11",X"33",X"76",X"BA",X"AB",X"CF", + X"00",X"00",X"8A",X"70",X"E7",X"91",X"08",X"0C",X"00",X"00",X"00",X"00",X"08",X"2E",X"37",X"37", + X"EE",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"CF",X"AB",X"BA",X"76",X"33",X"11",X"00",X"00", + X"0C",X"08",X"91",X"E7",X"70",X"8A",X"00",X"00",X"37",X"37",X"2E",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"33",X"33",X"77",X"07",X"0C",X"00",X"88",X"88",X"CC",X"CC",X"EE",X"0E",X"03", + X"80",X"84",X"80",X"44",X"CC",X"88",X"00",X"00",X"10",X"12",X"10",X"22",X"33",X"11",X"00",X"00", + X"4C",X"88",X"89",X"C3",X"C3",X"EF",X"99",X"77",X"23",X"11",X"19",X"3C",X"3C",X"7F",X"99",X"EE", + X"47",X"4F",X"52",X"4B",X"41",X"4E",X"53",X"2C",X"43",X"4F",X"50",X"59",X"52",X"49",X"47",X"48", + X"54",X"20",X"31",X"39",X"38",X"33",X"54",X"45",X"43",X"48",X"53",X"54",X"41",X"52",X"20",X"49", + X"4E",X"43",X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"93",X"93",X"B1",X"B1",X"B1",X"B1",X"93",X"B1", + X"E4",X"78",X"E4",X"F0",X"D2",X"F0",X"78",X"F0",X"F0",X"B1",X"F0",X"E4",X"F0",X"D2",X"B1",X"D2", + X"F0",X"78",X"F0",X"D2",X"F0",X"A5",X"78",X"F0",X"F0",X"B1",X"5A",X"F0",X"E4",X"F0",X"B1",X"F0", + X"F0",X"78",X"F0",X"F0",X"F0",X"F0",X"78",X"F0",X"F0",X"D2",X"B1",X"F0",X"F0",X"B1",X"D2",X"F0", + X"F0",X"E4",X"78",X"F0",X"F0",X"78",X"E4",X"F0",X"F0",X"E4",X"D2",X"B1",X"B1",X"D2",X"E4",X"F0", + X"F0",X"D2",X"E4",X"78",X"78",X"E4",X"D2",X"F0",X"B1",X"78",X"E4",X"D2",X"D2",X"E4",X"78",X"B1", + X"E4",X"F0",X"93",X"E4",X"E4",X"93",X"F0",X"E4",X"D2",X"F0",X"6C",X"D2",X"D2",X"6C",X"F0",X"D2", + X"78",X"93",X"E4",X"78",X"78",X"E4",X"93",X"78",X"B1",X"6C",X"D2",X"B1",X"B1",X"D2",X"6C",X"B1", + X"78",X"87",X"78",X"78",X"78",X"78",X"87",X"78",X"B1",X"4E",X"B1",X"B1",X"B1",X"B1",X"4E",X"B1", + X"F0",X"6C",X"78",X"F0",X"F0",X"78",X"6C",X"F0",X"4E",X"B1",X"93",X"87",X"87",X"93",X"B1",X"4E", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"B1",X"B1",X"B1",X"B1",X"B1",X"B1",X"B1",X"B1", + X"87",X"78",X"6C",X"4E",X"4E",X"6C",X"78",X"87",X"F0",X"93",X"B1",X"F0",X"F0",X"B1",X"93",X"F0", + X"6C",X"B1",X"B1",X"D2",X"D2",X"B1",X"B1",X"6C",X"93",X"78",X"78",X"E4",X"E4",X"78",X"78",X"93", + X"F0",X"B1",X"4E",X"F0",X"F0",X"4E",X"B1",X"F0",X"F0",X"78",X"87",X"F0",X"F0",X"87",X"78",X"F0", + X"F0",X"2D",X"93",X"F0",X"F0",X"93",X"2D",X"F0",X"F0",X"1B",X"6C",X"F0",X"F0",X"6C",X"1B",X"F0", + X"F0",X"6C",X"E4",X"78",X"78",X"E4",X"6C",X"F0",X"F0",X"93",X"D2",X"B1",X"B1",X"D2",X"93",X"F0", + X"F0",X"5A",X"D2",X"E4",X"E4",X"D2",X"5A",X"F0",X"F0",X"A5",X"E4",X"D2",X"D2",X"E4",X"A5",X"F0", + X"C6",X"39",X"B1",X"B1",X"B1",X"B1",X"39",X"C6",X"C6",X"39",X"78",X"78",X"78",X"78",X"39",X"C6", + X"78",X"B1",X"D2",X"78",X"78",X"D2",X"B1",X"78",X"B1",X"78",X"E4",X"B1",X"B1",X"E4",X"78",X"B1", + X"C6",X"F0",X"39",X"78",X"39",X"78",X"F0",X"F0",X"F0",X"F0",X"B1",X"39",X"B1",X"39",X"F0",X"C6", + X"F0",X"78",X"78",X"B1",X"F0",X"39",X"78",X"C6",X"C6",X"B1",X"39",X"F0",X"78",X"B1",X"B1",X"F0", + X"F0",X"B1",X"4E",X"F0",X"F0",X"4E",X"B1",X"F0",X"F0",X"78",X"87",X"F0",X"F0",X"87",X"78",X"F0", + X"F0",X"B1",X"B1",X"4E",X"4E",X"B1",X"B1",X"F0",X"F0",X"78",X"78",X"87",X"87",X"78",X"78",X"F0", + X"4E",X"B1",X"B1",X"B1",X"B1",X"B1",X"B1",X"4E",X"87",X"78",X"78",X"78",X"78",X"78",X"78",X"87", + X"F0",X"6C",X"78",X"F0",X"F0",X"78",X"6C",X"F0",X"F0",X"93",X"B1",X"F0",X"F0",X"B1",X"93",X"F0", + X"F0",X"4E",X"6C",X"78",X"78",X"6C",X"4E",X"F0",X"F0",X"87",X"93",X"B1",X"B1",X"93",X"87",X"F0", + X"78",X"0F",X"4E",X"6C",X"6C",X"4E",X"0F",X"78",X"B1",X"0F",X"87",X"93",X"93",X"87",X"0F",X"B1", + X"C6",X"F0",X"B1",X"93",X"93",X"B1",X"F0",X"C6",X"C6",X"F0",X"78",X"6C",X"6C",X"78",X"F0",X"C6", + X"4E",X"B1",X"93",X"87",X"87",X"93",X"B1",X"4E",X"87",X"78",X"6C",X"4E",X"4E",X"6C",X"78",X"87", + X"6C",X"93",X"87",X"0F",X"0F",X"87",X"93",X"6C",X"87",X"6C",X"4E",X"0F",X"0F",X"4E",X"6C",X"87", + X"93",X"F0",X"E4",X"B1",X"B1",X"E4",X"F0",X"93",X"6C",X"F0",X"D2",X"78",X"78",X"D2",X"F0",X"6C", + X"F0",X"78",X"D2",X"C6",X"C6",X"D2",X"78",X"F0",X"F0",X"B1",X"E4",X"C6",X"C6",X"E4",X"B1",X"F0", + X"F0",X"6C",X"6C",X"F0",X"F0",X"6C",X"6C",X"F0",X"F0",X"93",X"93",X"F0",X"F0",X"93",X"93",X"F0", + X"F0",X"0F",X"D2",X"F0",X"F0",X"D2",X"0F",X"F0",X"F0",X"0F",X"E4",X"F0",X"F0",X"E4",X"0F",X"F0", + X"F0",X"78",X"F0",X"87",X"F0",X"87",X"78",X"C6",X"C6",X"B1",X"4E",X"F0",X"4E",X"F0",X"B1",X"F0", + X"C6",X"78",X"87",X"F0",X"87",X"F0",X"78",X"F0",X"F0",X"B1",X"F0",X"4E",X"F0",X"4E",X"B1",X"C6", + X"B0",X"F0",X"E0",X"F0",X"D0",X"F0",X"70",X"F0",X"F0",X"B0",X"F0",X"E0",X"F0",X"D0",X"F0",X"70", + X"F1",X"FF",X"F7",X"FF",X"F3",X"FF",X"FF",X"FF",X"F0",X"F1",X"F0",X"F7",X"F0",X"F3",X"F0",X"FF", + X"F0",X"F8",X"F0",X"FE",X"F0",X"FC",X"F0",X"FF",X"F8",X"FF",X"FE",X"FF",X"FC",X"FF",X"FF",X"FF", + X"F0",X"00",X"F0",X"F0",X"F0",X"F0",X"00",X"F0",X"F0",X"00",X"F0",X"F0",X"F0",X"F0",X"00",X"F0", + X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"F3",X"FF",X"F7",X"FF",X"F1",X"FF",X"F0",X"F3",X"F0",X"F7",X"F0",X"F1",X"F0", + X"FF",X"F0",X"FC",X"F0",X"FE",X"F0",X"F8",X"F0",X"FF",X"FF",X"FF",X"FC",X"FF",X"FE",X"FF",X"F8", + X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC", + X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC", + X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60",X"FC",X"60", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"00",X"00",X"06",X"00",X"00",X"00",X"06",X"06",X"00",X"00",X"00",X"06",X"00",X"00",X"00", + X"00",X"06",X"00",X"00",X"00",X"06",X"00",X"00",X"00",X"00",X"06",X"00",X"00",X"00",X"06",X"00", + X"00",X"00",X"06",X"00",X"00",X"00",X"06",X"00",X"00",X"06",X"00",X"00",X"00",X"06",X"00",X"00", + X"06",X"00",X"00",X"00",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"00",X"00",X"00",X"06", + X"00",X"00",X"0C",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"03",X"00",X"00", + X"00",X"00",X"03",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"0C",X"00",X"00", + X"00",X"00",X"00",X"03",X"00",X"03",X"00",X"00",X"00",X"00",X"0C",X"00",X"0C",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"00",X"0C",X"00",X"00",X"00",X"00",X"03",X"00",X"03",X"00",X"00",X"00", + X"14",X"14",X"14",X"14",X"14",X"14",X"14",X"14",X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"22", + X"90",X"F8",X"F4",X"B0",X"B0",X"F4",X"F8",X"90",X"60",X"F1",X"F2",X"70",X"70",X"F2",X"F1",X"60", + X"17",X"11",X"52",X"53",X"1F",X"1E",X"1B",X"2C",X"13",X"52",X"50",X"17",X"1F",X"19",X"59",X"18", + X"54",X"68",X"61",X"54",X"20",X"63",X"69",X"15",X"13",X"11",X"53",X"20",X"18",X"52",X"54",X"19", + X"1E",X"35",X"4A",X"AC",X"13",X"B5",X"04",X"68",X"B5",X"C7",X"68",X"B3",X"B1",X"34",X"09",X"B6", + X"09",X"1E",X"34",X"02",X"C6",X"28",X"B3",X"60",X"62",X"03",X"00",X"B5",X"6E",X"50",X"4A",X"36", + X"45",X"09",X"50",X"60",X"41",X"DD",X"11",X"6E",X"01",X"F7",X"25",X"6E",X"06",X"45",X"B5",X"03", + X"B5",X"C6",X"45",X"B3",X"71",X"34",X"09",X"BE",X"6A",X"4A",X"34",X"34",X"8E",X"8E",X"6D",X"6E", + X"10",X"41",X"46",X"10",X"09",X"47",X"10",X"01",X"20",X"C8",X"5F",X"43",X"00",X"B5",X"BD",X"00", + X"6A",X"03",X"34",X"6A",X"FF",X"35",X"4A",X"00",X"35",X"B5",X"04",X"69",X"4A",X"21",X"35",X"93", + X"E2",X"34",X"09",X"1E",X"23",X"B3",X"C6",X"08",X"B2",X"AC",X"3E",X"C6",X"B3",X"6A",X"28",X"34", + X"B3",X"B5",X"08",X"45",X"7F",X"36",X"13",X"41",X"50",X"61",X"09",X"01",X"11",X"6E",X"02",X"06", + X"25",X"6E",X"F7",X"B5",X"B5",X"03",X"45",X"71",X"45",X"B3",X"C6",X"6A",X"09",X"AE",X"34",X"8F", + X"34",X"34",X"4A",X"10",X"6D",X"6E",X"8F",X"09",X"02",X"10",X"41",X"20",X"10",X"01",X"03",X"00", + X"5F",X"0C",X"C8",X"6A",X"BD",X"00",X"B5",X"01",X"35",X"6A",X"03",X"35",X"4A",X"02",X"35",X"4A", + X"04",X"69",X"B5",X"4B",X"35",X"60",X"41",X"6E",X"01",X"60",X"03",X"B5",X"4A",X"CE",X"50",X"36", + X"45",X"B3",X"C6",X"92",X"09",X"1E",X"34",X"B8",X"22",X"09",X"40",X"61",X"41",X"27",X"11",X"6E", + X"01",X"F7",X"41",X"09",X"06",X"45",X"B5",X"08",X"35",X"01",X"96",X"71",X"B3",X"B5",X"6E",X"45", + X"09",X"3E",X"34",X"8F",X"C6",X"28",X"B3",X"93",X"B8",X"26",X"B5",X"C7",X"22",X"09",X"BF",X"34", + X"B3",X"B3",X"28",X"09",X"36",X"A6",X"43",X"92",X"35",X"90",X"96",X"6A",X"B3",X"50",X"4A",X"92", + X"35",X"DE",X"00",X"05",X"FE",X"60",X"08",X"6E",X"02",X"B5",X"71",X"63",X"B5",X"95",X"45",X"BD", + X"73",X"CA",X"34",X"21",X"AE",X"28",X"7B",X"09",X"00",X"34",X"0A",X"73",X"00",X"B5",X"AE",X"27", + X"4A",X"67",X"50",X"09",X"90",X"46",X"B5",X"C6",X"34",X"F7",X"36",X"A6",X"B3",X"B3",X"28",X"B5", + X"44",X"34",X"09",X"56",X"46",X"B3",X"C6",X"08",X"27",X"B5",X"63",X"46",X"B5",X"44",X"69",X"09", + X"C6",X"08",X"B3",X"60",X"34",X"21",X"76",X"1F",X"B3",X"69",X"B5",X"BA",X"C6",X"60",X"62",X"B3", + X"E6",X"B3",X"C7",X"09",X"09",X"B6",X"34",X"C6",X"34",X"29",X"3E",X"01",X"B3",X"6A",X"08",X"35", + X"6C",X"02",X"24",X"23",X"FE",X"6E",X"08",X"4A",X"01",X"35",X"4A",X"02",X"35",X"6A",X"03",X"35", + X"6C",X"02",X"61",X"60",X"FE",X"6E",X"08",X"4A",X"02",X"35",X"4A",X"64",X"35",X"B5",X"04",X"69", + X"B5",X"E2",X"69",X"6A",X"61",X"23",X"93",X"FF",X"34",X"08",X"FE",X"6E",X"6C",X"02",X"24",X"23", + X"4A",X"03",X"34",X"6A",X"FF",X"35",X"4A",X"00",X"35",X"08",X"FE",X"6E",X"6C",X"02",X"61",X"60", + X"4A",X"04",X"35",X"B5",X"00",X"35",X"4A",X"64",X"69",X"93",X"60",X"23",X"B5",X"E2",X"69",X"6A", + X"C8",X"08",X"FE",X"09",X"34",X"2E",X"00",X"C6",X"34",X"2F",X"3E",X"8F",X"B3",X"6A",X"08",X"34", + X"FE",X"B5",X"08",X"45",X"00",X"36",X"36",X"41",X"C0",X"61",X"09",X"01",X"11",X"6E",X"08",X"06", + X"21",X"6E",X"F7",X"B5",X"B5",X"02",X"45",X"71",X"45",X"09",X"F8",X"34",X"B5",X"C5",X"41",X"B3", + X"DE",X"D6",X"7D",X"4A",X"93",X"01",X"07",X"C8",X"34",X"6A",X"3E",X"34",X"93",X"8E",X"23",X"FE", + X"00",X"C6",X"0D",X"B3",X"08",X"34",X"09",X"1E",X"08",X"45",X"B5",X"D8",X"B2",X"41",X"36",X"10", + X"09",X"01",X"61",X"44",X"29",X"06",X"6E",X"B5",X"F7",X"B5",X"6E",X"45",X"45",X"71",X"03",X"93", + X"65",X"69",X"B5",X"42",X"23",X"93",X"40",X"23",X"B5",X"42",X"69",X"2A",X"20",X"23",X"93",X"C1", + X"34",X"00",X"F5",X"F5",X"BB",X"00",X"09",X"61",X"F5",X"86",X"01",X"17",X"7E",X"02",X"F5",X"9E", + X"27",X"B3",X"5F",X"B3",X"F5",X"68",X"02",X"68",X"B3",X"F5",X"B3",X"00",X"68",X"7E",X"68",X"09", + X"FC",X"B5",X"B3",X"45",X"24",X"EA",X"0F",X"76",X"0B",X"20",X"BB",X"20",X"56",X"25",X"B9",X"25", + X"21",X"61",X"41",X"09",X"25",X"25",X"25",X"25",X"B1",X"C0",X"7E",X"5F",X"F5",X"F5",X"04",X"04", + X"B1",X"80",X"7E",X"5F",X"F5",X"F5",X"04",X"04",X"B1",X"80",X"7E",X"5F",X"F5",X"F5",X"03",X"03", + X"B1",X"C0",X"7E",X"5F",X"F5",X"F5",X"03",X"03",X"B1",X"BB",X"76",X"09",X"2A",X"F5",X"34",X"00", + X"00",X"01",X"61",X"34",X"F5",X"00",X"BB",X"4F",X"6F",X"F5",X"12",X"00",X"BD",X"7E",X"9D",X"09", + X"34",X"B5",X"B3",X"45",X"25",X"EA",X"0F",X"76",X"0B",X"64",X"BB",X"70",X"56",X"26",X"B9",X"25", + X"E3",X"4D",X"2B",X"30",X"25",X"26",X"26",X"26",X"F5",X"74",X"03",X"F5",X"7E",X"34",X"4A",X"7E", + X"04",X"B5",X"75",X"26",X"4A",X"CA",X"34",X"F5",X"7E",X"22",X"42",X"FE",X"06",X"34",X"6A",X"00", + X"08",X"34",X"6A",X"00",X"47",X"FE",X"23",X"08",X"47",X"34",X"09",X"9D",X"91",X"21",X"24",X"D1", + X"43",X"4E",X"05",X"BD",X"01",X"FF",X"00",X"C8",X"B1",X"43",X"7E",X"60",X"F5",X"42",X"06",X"B9", + X"F5",X"08",X"06",X"61",X"7E",X"00",X"09",X"BB",X"42",X"F2",X"F6",X"F5",X"60",X"26",X"B5",X"7E", + X"03",X"34",X"4A",X"7E",X"C0",X"F5",X"74",X"04",X"4A",X"CA",X"34",X"6A",X"75",X"26",X"B5",X"22", + X"34",X"4A",X"00",X"22",X"FE",X"6A",X"28",X"34",X"B3",X"05",X"F5",X"6D",X"0F",X"80",X"16",X"91", + X"FD",X"FD",X"24",X"FD",X"09",X"21",X"34",X"5B",X"00",X"FD",X"5A",X"02",X"FD",X"5F",X"01",X"6C", + X"43",X"FD",X"5B",X"04",X"FD",X"5A",X"03",X"FD",X"5F",X"34",X"6A",X"5F",X"05",X"F5",X"74",X"03", + X"6A",X"5F",X"34",X"B1",X"75",X"04",X"F5",X"6A",X"23",X"B2",X"FE",X"26",X"34",X"51",X"00",X"6A", + X"23",X"96",X"B3",X"F5",X"34",X"27",X"0F",X"16",X"05",X"09",X"91",X"34",X"80",X"24",X"FD",X"FD", + X"21",X"FD",X"5B",X"01",X"FD",X"5A",X"00",X"FD",X"5F",X"08",X"6C",X"61",X"02",X"00",X"09",X"BB", + X"FD",X"5A",X"03",X"FD",X"5B",X"04",X"FD",X"5F",X"05",X"F5",X"F2",X"03",X"93",X"7E",X"25",X"4A", + X"74",X"04",X"F5",X"75",X"34",X"4A",X"7E",X"34",X"93",X"F2",X"25",X"F5",X"AB",X"26",X"B5",X"7E", + X"03",X"25",X"93",X"F2",X"80",X"B5",X"8A",X"26",X"F5",X"4A",X"04",X"34",X"7E",X"75",X"C0",X"F5", + X"7E",X"34",X"4A",X"AB",X"03",X"93",X"74",X"25",X"B5",X"7E",X"26",X"80",X"F2",X"04",X"F5",X"60", + X"BB",X"91",X"7E",X"09",X"F5",X"FD",X"05",X"24",X"34",X"5B",X"21",X"FD",X"FD",X"00",X"FD",X"5A", + X"01",X"6A",X"5F",X"34",X"FD",X"74",X"02",X"F5",X"5F",X"34",X"6A",X"5F",X"03",X"F5",X"75",X"04", + X"F5",X"85",X"00",X"B3",X"7E",X"26",X"09",X"0F",X"B5",X"76",X"45",X"56",X"EA",X"0B",X"D5",X"BB", + X"D1",X"B9",X"7E",X"26",X"F5",X"C1",X"06",X"C1",X"26",X"26",X"26",X"26",X"C2",X"88",X"E5",X"8F", + X"26",X"5B",X"43",X"FD",X"B1",X"03",X"FD",X"5A",X"04",X"B1",X"5F",X"60",X"FD",X"63",X"05",X"DB", + X"09",X"BB",X"00",X"BC",X"08",X"60",X"61",X"BB",X"41",X"6F",X"00",X"52",X"08",X"BD",X"4F",X"BB", + X"60",X"34",X"6A",X"07",X"99",X"9E",X"74",X"4A",X"22",X"34",X"6A",X"07",X"34",X"9E",X"75",X"4A", + X"23",X"34",X"6A",X"6F",X"34",X"B3",X"74",X"B3",X"6F",X"6A",X"6F",X"34",X"B3",X"75",X"57",X"B3", + X"6F",X"6F",X"6F",X"B5",X"B3",X"77",X"B3",X"B9",X"44",X"01",X"F5",X"86",X"B1",X"F5",X"7E",X"02", + X"17",X"5F",X"27",X"B3",X"9E",X"02",X"F5",X"68",X"B3",X"B3",X"B3",X"B1",X"68",X"68",X"68",X"6A", + X"03",X"26",X"09",X"0F",X"35",X"B3",X"FD",X"B3",X"0F",X"B9",X"EA",X"B2",X"B5",X"B5",X"45",X"29", + X"B1",X"B1",X"0B",X"7C",X"B5",X"B5",X"2A",X"2A",X"B1",X"B1",X"D5",X"2E",X"B5",X"B5",X"2A",X"2B", + X"B1",X"B1",X"87",X"98",X"B5",X"B5",X"2B",X"2B",X"B1",X"B1",X"4E",X"A4",X"B5",X"B5",X"2C",X"2C", + X"B1",X"B1",X"9D",X"6E",X"B5",X"B5",X"2C",X"2D",X"B1",X"B1",X"A2",X"D6",X"B5",X"B5",X"2D",X"2D", + X"B1",X"B1",X"D7",X"F0",X"B5",X"B5",X"2D",X"2D",X"B1",X"B1",X"F1",X"4F",X"B5",X"D5",X"2D",X"6F", + X"09",X"00",X"01",X"52",X"26",X"BD",X"46",X"7D",X"4F",X"01",X"09",X"72",X"6F",X"D1",X"40",X"46", + X"00",X"77",X"52",X"7D",X"BD",X"B1",X"55",X"BE",X"03",X"C6",X"B1",X"B3",X"3F",X"34",X"09",X"16", + X"B0",X"13",X"3E",X"A8",X"B3",X"09",X"28",X"34",X"7B",X"0B",X"0F",X"A6",X"86",X"7A",X"5F",X"0F", + X"5F",X"A6",X"6E",X"5F",X"0B",X"0F",X"00",X"68",X"02",X"C6",X"4A",X"B3",X"60",X"34",X"09",X"3E", + X"28",X"13",X"09",X"DF",X"43",X"41",X"DE",X"13",X"01",X"10",X"00",X"C8",X"05",X"BD",X"4E",X"AF", + X"4A",X"60",X"13",X"9C",X"DE",X"09",X"60",X"13",X"41",X"05",X"13",X"4E",X"9D",X"00",X"01",X"10", + X"BD",X"9C",X"AF",X"60",X"C8",X"13",X"4A",X"05",X"09",X"EB",X"34",X"C6",X"AB",X"09",X"60",X"34", + X"B3",X"09",X"28",X"34",X"3E",X"AA",X"74",X"41",X"FB",X"34",X"6A",X"B5",X"13",X"DD",X"C9",X"63", + X"40",X"BB",X"0B",X"8B",X"0B",X"2A",X"0B",X"34",X"D9",X"B3",X"04",X"B3",X"FE",X"0F",X"D0",X"0F", + X"6C",X"45",X"B5",X"C8",X"6C",X"B5",X"EA",X"41",X"D0",X"6C",X"C8",X"C8",X"6A",X"4A",X"34",X"34", + X"09",X"96",X"35",X"C6",X"08",X"09",X"B3",X"34",X"B3",X"6A",X"28",X"34",X"3E",X"C9",X"42",X"6C", + X"4A",X"8E",X"34",X"6C",X"C9",X"34",X"6A",X"4A",X"8E",X"00",X"B5",X"6A",X"34",X"B1",X"43",X"CA"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..17522bd2 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,32 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"03", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"05",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"07", + X"00",X"00",X"00",X"00",X"00",X"0B",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"0E",X"00",X"01",X"0C",X"0F", + X"00",X"0E",X"00",X"0B",X"00",X"0C",X"0B",X"0E",X"00",X"0C",X"0F",X"01",X"00",X"00",X"00",X"00", + X"00",X"01",X"02",X"0F",X"00",X"07",X"0C",X"02",X"00",X"09",X"06",X"0F",X"00",X"0D",X"0C",X"0F", + X"00",X"05",X"03",X"09",X"00",X"0F",X"0B",X"00",X"00",X"0E",X"00",X"0B",X"00",X"0E",X"00",X"0B", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0E",X"01",X"00",X"0F",X"0B",X"0E",X"00",X"0E",X"00",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin + data <= rom_data(to_integer(unsigned(addr))); +end architecture; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..88b2ecb3 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"66",X"EF",X"00",X"F8",X"EA",X"6F",X"00",X"3F",X"00",X"C9",X"38",X"AA",X"AF",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..374e887f --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F3",X"AF",X"06",X"08",X"21",X"00",X"50",X"77",X"23",X"10",X"FC",X"ED",X"56",X"31",X"F1",X"4F", + X"C3",X"00",X"3F",X"3A",X"A6",X"4C",X"FE",X"00",X"C8",X"47",X"3E",X"18",X"21",X"1D",X"40",X"77", + X"2B",X"10",X"FC",X"C9",X"3A",X"A7",X"4C",X"FE",X"00",X"C8",X"47",X"3E",X"18",X"21",X"02",X"40", + X"77",X"23",X"10",X"FC",X"C9",X"D6",X"FF",X"00",X"08",X"D9",X"DD",X"E5",X"FD",X"E5",X"AF",X"32", + X"00",X"50",X"2A",X"0C",X"4C",X"3A",X"0E",X"4C",X"77",X"2A",X"0F",X"4C",X"3A",X"11",X"4C",X"77", + X"2A",X"14",X"4C",X"3A",X"16",X"4C",X"77",X"2A",X"17",X"4C",X"3A",X"19",X"4C",X"77",X"2A",X"1C", + X"4C",X"3A",X"1E",X"4C",X"77",X"2A",X"1F",X"4C",X"3A",X"21",X"4C",X"77",X"2A",X"24",X"4C",X"3A", + X"26",X"4C",X"77",X"2A",X"27",X"4C",X"3A",X"29",X"4C",X"77",X"2A",X"2C",X"4C",X"3A",X"2E",X"4C", + X"77",X"2A",X"2F",X"4C",X"3A",X"31",X"4C",X"77",X"2A",X"34",X"4C",X"3A",X"36",X"4C",X"77",X"2A", + X"37",X"4C",X"3A",X"39",X"4C",X"77",X"2A",X"3C",X"4C",X"3A",X"3E",X"4C",X"77",X"2A",X"3F",X"4C", + X"3A",X"41",X"4C",X"77",X"2A",X"44",X"4C",X"3A",X"46",X"4C",X"77",X"2A",X"47",X"4C",X"3A",X"49", + X"4C",X"77",X"2A",X"4C",X"4C",X"3A",X"4E",X"4C",X"77",X"2A",X"4F",X"4C",X"3A",X"51",X"4C",X"77", + X"2A",X"54",X"4C",X"3A",X"56",X"4C",X"77",X"2A",X"57",X"4C",X"3A",X"59",X"4C",X"77",X"21",X"96", + X"4C",X"CB",X"7E",X"28",X"31",X"CB",X"6E",X"20",X"2D",X"06",X"06",X"21",X"64",X"4C",X"11",X"62", + X"50",X"3E",X"06",X"0E",X"02",X"ED",X"A0",X"ED",X"A0",X"CD",X"BA",X"15",X"10",X"F3",X"06",X"06", + X"21",X"66",X"4C",X"11",X"F2",X"4F",X"3E",X"06",X"0E",X"02",X"ED",X"A0",X"ED",X"A0",X"CD",X"BA", + X"15",X"10",X"F3",X"C3",X"7E",X"01",X"ED",X"5B",X"64",X"4C",X"CD",X"3D",X"0F",X"ED",X"53",X"62", + X"50",X"ED",X"5B",X"6C",X"4C",X"CD",X"3D",X"0F",X"ED",X"53",X"64",X"50",X"ED",X"5B",X"74",X"4C", + X"CD",X"3D",X"0F",X"ED",X"53",X"66",X"50",X"ED",X"5B",X"7C",X"4C",X"CD",X"3D",X"0F",X"ED",X"53", + X"68",X"50",X"ED",X"5B",X"84",X"4C",X"CD",X"3D",X"0F",X"ED",X"53",X"6A",X"50",X"ED",X"5B",X"8C", + X"4C",X"CD",X"3D",X"0F",X"ED",X"53",X"6C",X"50",X"2A",X"66",X"4C",X"CD",X"56",X"0F",X"22",X"F2", + X"4F",X"2A",X"6E",X"4C",X"CD",X"56",X"0F",X"22",X"F4",X"4F",X"2A",X"76",X"4C",X"CD",X"56",X"0F", + X"22",X"F6",X"4F",X"2A",X"7E",X"4C",X"CD",X"56",X"0F",X"22",X"F8",X"4F",X"2A",X"86",X"4C",X"CD", + X"56",X"0F",X"22",X"FA",X"4F",X"2A",X"8E",X"4C",X"CD",X"56",X"0F",X"22",X"FC",X"4F",X"2A",X"93", + X"4C",X"23",X"22",X"93",X"4C",X"7E",X"FE",X"FF",X"20",X"06",X"21",X"DB",X"3C",X"22",X"93",X"4C", + X"21",X"95",X"4C",X"CB",X"46",X"20",X"56",X"3A",X"00",X"50",X"CB",X"6F",X"CA",X"2A",X"02",X"CB", + X"8E",X"CB",X"56",X"20",X"3D",X"3A",X"00",X"50",X"CB",X"7F",X"CA",X"38",X"02",X"3A",X"98",X"4C", + X"FE",X"06",X"28",X"07",X"3C",X"32",X"98",X"4C",X"C3",X"3D",X"02",X"AF",X"32",X"98",X"4C",X"CB", + X"5E",X"20",X"0A",X"3A",X"99",X"4C",X"FE",X"00",X"20",X"0B",X"C3",X"3D",X"02",X"AF",X"32",X"07", + X"50",X"CB",X"9E",X"18",X"68",X"3D",X"32",X"99",X"4C",X"3E",X"01",X"32",X"07",X"50",X"CB",X"DE", + X"18",X"5B",X"3A",X"00",X"50",X"CB",X"7F",X"28",X"C4",X"CB",X"96",X"18",X"10",X"3A",X"00",X"50", + X"CB",X"6F",X"28",X"AD",X"CB",X"86",X"3A",X"99",X"4C",X"3C",X"32",X"99",X"4C",X"3A",X"9A",X"4C", + X"FE",X"14",X"30",X"1A",X"47",X"3A",X"9C",X"4C",X"80",X"32",X"9A",X"4C",X"CB",X"3F",X"06",X"00", + X"80",X"27",X"32",X"9D",X"4C",X"CD",X"27",X"15",X"CB",X"66",X"20",X"02",X"CB",X"EE",X"3A",X"05", + X"4D",X"CB",X"C7",X"32",X"05",X"4D",X"CB",X"F6",X"18",X"83",X"CB",X"4E",X"20",X"05",X"CB",X"CE", + X"C3",X"A1",X"01",X"CB",X"C6",X"C3",X"9F",X"01",X"CB",X"D6",X"C3",X"AD",X"01",X"00",X"21",X"96", + X"4C",X"CB",X"46",X"28",X"16",X"CD",X"49",X"16",X"21",X"96",X"4C",X"CB",X"7E",X"28",X"04",X"CB", + X"6E",X"28",X"05",X"CD",X"29",X"16",X"18",X"03",X"CD",X"39",X"16",X"3A",X"9F",X"4C",X"3C",X"32", + X"9F",X"4C",X"3A",X"9E",X"4C",X"3C",X"32",X"9E",X"4C",X"FE",X"3C",X"20",X"0B",X"AF",X"32",X"9E", + X"4C",X"3A",X"A0",X"4C",X"3C",X"32",X"A0",X"4C",X"21",X"95",X"4C",X"CB",X"BE",X"3A",X"00",X"50", + X"CB",X"77",X"20",X"35",X"AF",X"32",X"01",X"50",X"21",X"62",X"50",X"06",X"0C",X"36",X"00",X"23", + X"10",X"FB",X"3E",X"40",X"CD",X"07",X"15",X"3E",X"09",X"CD",X"17",X"15",X"11",X"D0",X"41",X"21", + X"9C",X"19",X"3E",X"01",X"06",X"04",X"CD",X"DF",X"15",X"06",X"FF",X"21",X"FF",X"FF",X"2B",X"7D", + X"BC",X"32",X"C0",X"50",X"20",X"F8",X"10",X"F3",X"76",X"FB",X"3E",X"01",X"32",X"00",X"50",X"FD", + X"E1",X"DD",X"E1",X"D9",X"08",X"ED",X"4D",X"3A",X"00",X"50",X"CB",X"67",X"C2",X"93",X"05",X"AF", + X"06",X"08",X"21",X"00",X"50",X"77",X"23",X"10",X"FC",X"3E",X"00",X"32",X"03",X"50",X"31",X"F1", + X"4F",X"CD",X"14",X"16",X"F3",X"08",X"AF",X"08",X"21",X"00",X"40",X"CD",X"16",X"05",X"08",X"CB", + X"47",X"28",X"02",X"CB",X"D7",X"CB",X"4F",X"28",X"02",X"CB",X"DF",X"08",X"21",X"00",X"44",X"CD", + X"16",X"05",X"08",X"CB",X"47",X"28",X"02",X"CB",X"E7",X"CB",X"4F",X"28",X"02",X"CB",X"EF",X"08", + X"31",X"FD",X"43",X"21",X"00",X"4C",X"CD",X"16",X"05",X"08",X"CB",X"47",X"28",X"02",X"CB",X"F7", + X"CB",X"4F",X"28",X"02",X"CB",X"FF",X"08",X"3E",X"01",X"CD",X"17",X"15",X"21",X"00",X"40",X"11", + X"01",X"40",X"01",X"FE",X"03",X"36",X"40",X"ED",X"B0",X"11",X"66",X"41",X"21",X"60",X"1A",X"3E", + X"01",X"06",X"0B",X"CD",X"DF",X"15",X"11",X"8A",X"40",X"21",X"6B",X"1A",X"3E",X"01",X"06",X"18", + X"CD",X"DF",X"15",X"11",X"EC",X"40",X"21",X"83",X"1A",X"3E",X"01",X"06",X"14",X"CD",X"DF",X"15", + X"11",X"ED",X"40",X"21",X"97",X"1A",X"3E",X"01",X"06",X"14",X"CD",X"DF",X"15",X"11",X"EE",X"40", + X"21",X"AB",X"1A",X"3E",X"01",X"06",X"14",X"CD",X"DF",X"15",X"11",X"EF",X"40",X"21",X"BF",X"1A", + X"3E",X"01",X"06",X"14",X"CD",X"DF",X"15",X"11",X"93",X"40",X"21",X"4F",X"1B",X"3E",X"01",X"06", + X"18",X"CD",X"DF",X"15",X"11",X"F5",X"40",X"21",X"D3",X"1A",X"3E",X"01",X"06",X"14",X"CD",X"DF", + X"15",X"11",X"F6",X"40",X"21",X"E7",X"1A",X"3E",X"01",X"06",X"14",X"CD",X"DF",X"15",X"11",X"F7", + X"40",X"21",X"FB",X"1A",X"3E",X"01",X"06",X"14",X"CD",X"DF",X"15",X"11",X"F8",X"40",X"21",X"0F", + X"1B",X"3E",X"01",X"06",X"14",X"CD",X"DF",X"15",X"11",X"F9",X"40",X"21",X"23",X"1B",X"3E",X"01", + X"06",X"14",X"CD",X"DF",X"15",X"11",X"FA",X"40",X"21",X"37",X"1B",X"3E",X"01",X"06",X"14",X"CD", + X"DF",X"15",X"08",X"32",X"FE",X"4C",X"08",X"3A",X"FE",X"4C",X"CB",X"57",X"28",X"0D",X"11",X"F5", + X"40",X"21",X"4B",X"1B",X"3E",X"01",X"06",X"04",X"CD",X"DF",X"15",X"3A",X"FE",X"4C",X"CB",X"5F", + X"28",X"0D",X"11",X"F6",X"40",X"21",X"4B",X"1B",X"3E",X"01",X"06",X"04",X"CD",X"DF",X"15",X"3A", + X"FE",X"4C",X"CB",X"67",X"28",X"0D",X"11",X"F7",X"40",X"21",X"4B",X"1B",X"3E",X"01",X"06",X"04", + X"CD",X"DF",X"15",X"3A",X"FE",X"4C",X"CB",X"6F",X"28",X"0D",X"11",X"F8",X"40",X"21",X"4B",X"1B", + X"3E",X"01",X"06",X"04",X"CD",X"DF",X"15",X"3A",X"FE",X"4C",X"CB",X"77",X"28",X"0D",X"11",X"F9", + X"40",X"21",X"4B",X"1B",X"3E",X"01",X"06",X"04",X"CD",X"DF",X"15",X"3A",X"FE",X"4C",X"CB",X"7F", + X"28",X"0D",X"11",X"FA",X"40",X"21",X"4B",X"1B",X"3E",X"01",X"06",X"04",X"CD",X"DF",X"15",X"1E", + X"00",X"21",X"00",X"00",X"CD",X"FD",X"04",X"30",X"02",X"CB",X"C3",X"21",X"00",X"10",X"CD",X"FD", + X"04",X"30",X"02",X"CB",X"CB",X"21",X"00",X"20",X"CD",X"FD",X"04",X"30",X"02",X"CB",X"D3",X"21", + X"00",X"30",X"CD",X"FD",X"04",X"30",X"02",X"CB",X"DB",X"3A",X"FE",X"4C",X"FE",X"00",X"28",X"02", + X"3E",X"80",X"B3",X"32",X"FE",X"4C",X"CB",X"47",X"28",X"0D",X"11",X"EC",X"40",X"21",X"4B",X"1B", + X"3E",X"01",X"06",X"04",X"CD",X"DF",X"15",X"3A",X"FE",X"4C",X"CB",X"4F",X"28",X"0D",X"11",X"ED", + X"40",X"21",X"4B",X"1B",X"3E",X"01",X"06",X"04",X"CD",X"DF",X"15",X"3A",X"FE",X"4C",X"CB",X"57", + X"28",X"0D",X"11",X"EE",X"40",X"21",X"4B",X"1B",X"3E",X"01",X"06",X"04",X"CD",X"DF",X"15",X"3A", + X"FE",X"4C",X"CB",X"5F",X"28",X"0D",X"11",X"EF",X"40",X"21",X"4B",X"1B",X"3E",X"01",X"06",X"04", + X"CD",X"DF",X"15",X"3A",X"FE",X"4C",X"FE",X"00",X"20",X"0E",X"FB",X"3E",X"01",X"32",X"00",X"50", + X"3E",X"02",X"CD",X"59",X"15",X"C3",X"D9",X"02",X"32",X"C0",X"50",X"18",X"FB",X"01",X"00",X"10", + X"AF",X"32",X"C0",X"50",X"86",X"23",X"57",X"0B",X"79",X"B0",X"7A",X"20",X"F7",X"FE",X"FF",X"28", + X"02",X"37",X"C9",X"37",X"3F",X"C9",X"08",X"E6",X"FC",X"08",X"E5",X"3E",X"11",X"CD",X"35",X"05", + X"E1",X"E5",X"3E",X"22",X"CD",X"35",X"05",X"E1",X"E5",X"3E",X"44",X"CD",X"35",X"05",X"E1",X"3E", + X"88",X"CD",X"35",X"05",X"C9",X"32",X"C0",X"50",X"E5",X"E5",X"D1",X"13",X"01",X"FF",X"03",X"77", + X"ED",X"B0",X"E1",X"01",X"00",X"04",X"BE",X"C4",X"53",X"05",X"23",X"5F",X"0B",X"79",X"B0",X"7B", + X"20",X"F4",X"C9",X"5F",X"7E",X"E6",X"0F",X"57",X"7B",X"E6",X"0F",X"BA",X"28",X"04",X"08",X"CB", + X"CF",X"08",X"7E",X"E6",X"F0",X"57",X"7B",X"E6",X"F0",X"BA",X"C8",X"08",X"CB",X"C7",X"08",X"7B", + X"C9",X"47",X"4F",X"52",X"4B",X"41",X"4E",X"53",X"2C",X"43",X"4F",X"50",X"59",X"52",X"49",X"47", + X"48",X"54",X"20",X"31",X"39",X"38",X"33",X"54",X"45",X"43",X"48",X"53",X"54",X"41",X"52",X"20", + X"49",X"4E",X"43",X"32",X"C0",X"50",X"21",X"00",X"40",X"11",X"01",X"40",X"01",X"FE",X"07",X"36", + X"40",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"00",X"4C",X"11",X"01",X"4C",X"01",X"FE",X"03",X"36", + X"00",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"60",X"50",X"11",X"61",X"50",X"01",X"0F",X"00",X"36", + X"00",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"F0",X"4F",X"11",X"F1",X"4F",X"01",X"0F",X"00",X"36", + X"00",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"40",X"50",X"11",X"41",X"50",X"01",X"1F",X"00",X"36", + X"00",X"ED",X"B0",X"21",X"0C",X"4C",X"11",X"0D",X"4C",X"01",X"4F",X"00",X"36",X"FF",X"ED",X"B0", + X"21",X"DB",X"3C",X"22",X"93",X"4C",X"3A",X"80",X"50",X"47",X"E6",X"03",X"32",X"9B",X"4C",X"21", + X"A5",X"1B",X"CD",X"BA",X"15",X"7E",X"32",X"9C",X"4C",X"78",X"E6",X"0C",X"CB",X"3F",X"CB",X"3F", + X"21",X"D7",X"3C",X"CD",X"BA",X"15",X"7E",X"32",X"A2",X"4C",X"78",X"E6",X"30",X"21",X"97",X"3C", + X"CD",X"BA",X"15",X"22",X"A3",X"4C",X"78",X"E6",X"30",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB", + X"3F",X"32",X"A5",X"4C",X"78",X"CB",X"77",X"20",X"05",X"21",X"96",X"4C",X"CB",X"FE",X"FB",X"3E", + X"01",X"32",X"00",X"50",X"CD",X"9A",X"38",X"21",X"C2",X"43",X"11",X"C3",X"43",X"01",X"3C",X"00", + X"36",X"40",X"ED",X"B0",X"21",X"C2",X"47",X"11",X"C3",X"47",X"01",X"1C",X"00",X"36",X"05",X"ED", + X"B0",X"32",X"C0",X"50",X"21",X"E2",X"47",X"11",X"E3",X"47",X"01",X"1C",X"00",X"36",X"09",X"ED", + X"B0",X"32",X"C0",X"50",X"21",X"95",X"18",X"11",X"C3",X"43",X"01",X"1A",X"00",X"ED",X"B0",X"AF", + X"32",X"E4",X"43",X"32",X"ED",X"43",X"32",X"F6",X"43",X"21",X"F0",X"3C",X"11",X"B3",X"4C",X"01", + X"3C",X"00",X"ED",X"B0",X"21",X"B8",X"4C",X"11",X"F2",X"43",X"CD",X"1B",X"10",X"21",X"02",X"40", + X"11",X"03",X"40",X"01",X"3C",X"00",X"36",X"40",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"02",X"44", + X"11",X"03",X"44",X"01",X"1C",X"00",X"36",X"01",X"ED",X"B0",X"21",X"22",X"44",X"11",X"23",X"44", + X"01",X"1C",X"00",X"36",X"11",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"AF",X"18",X"11",X"0F",X"40", + X"01",X"06",X"00",X"ED",X"B0",X"AF",X"32",X"0C",X"40",X"3A",X"9B",X"4C",X"FE",X"00",X"20",X"0B", + X"21",X"B5",X"18",X"11",X"0C",X"40",X"01",X"09",X"00",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"05", + X"4D",X"11",X"06",X"4D",X"01",X"FF",X"00",X"36",X"00",X"ED",X"B0",X"21",X"FE",X"39",X"22",X"1E", + X"4D",X"22",X"06",X"4D",X"21",X"1D",X"4D",X"22",X"0D",X"4D",X"21",X"2C",X"3A",X"22",X"39",X"4D", + X"22",X"21",X"4D",X"21",X"38",X"4D",X"22",X"28",X"4D",X"21",X"43",X"3A",X"22",X"54",X"4D",X"22", + X"3C",X"4D",X"21",X"53",X"4D",X"22",X"43",X"4D",X"21",X"66",X"3A",X"22",X"6F",X"4D",X"22",X"57", + X"4D",X"21",X"6E",X"4D",X"22",X"5E",X"4D",X"21",X"92",X"3A",X"22",X"8A",X"4D",X"22",X"72",X"4D", + X"21",X"89",X"4D",X"22",X"79",X"4D",X"21",X"AB",X"3A",X"22",X"A5",X"4D",X"22",X"8D",X"4D",X"21", + X"A4",X"4D",X"22",X"94",X"4D",X"21",X"C4",X"3A",X"22",X"C0",X"4D",X"22",X"A8",X"4D",X"21",X"BF", + X"4D",X"22",X"AF",X"4D",X"21",X"DD",X"3A",X"22",X"DB",X"4D",X"22",X"C3",X"4D",X"21",X"DA",X"4D", + X"22",X"CA",X"4D",X"06",X"20",X"21",X"40",X"50",X"36",X"00",X"23",X"10",X"FB",X"3E",X"00",X"32", + X"03",X"50",X"21",X"96",X"4C",X"CB",X"EE",X"3A",X"9B",X"4C",X"FE",X"00",X"CA",X"38",X"09",X"3A", + X"9A",X"4C",X"FE",X"00",X"C2",X"38",X"09",X"21",X"95",X"4C",X"CB",X"A6",X"AF",X"32",X"01",X"50", + X"21",X"96",X"4C",X"CB",X"86",X"CD",X"14",X"16",X"32",X"C0",X"50",X"CD",X"DC",X"35",X"21",X"95", + X"4C",X"CB",X"6E",X"C2",X"38",X"09",X"CD",X"71",X"10",X"3E",X"07",X"CD",X"59",X"15",X"21",X"95", + X"4C",X"CB",X"6E",X"C2",X"38",X"09",X"3E",X"40",X"CD",X"07",X"15",X"11",X"44",X"44",X"21",X"2C", + X"3D",X"3E",X"01",X"06",X"1C",X"CD",X"F5",X"15",X"11",X"49",X"44",X"21",X"2E",X"3D",X"3E",X"03", + X"06",X"1C",X"CD",X"F5",X"15",X"11",X"50",X"44",X"21",X"2D",X"3D",X"3E",X"03",X"06",X"1C",X"CD", + X"F5",X"15",X"11",X"58",X"44",X"21",X"2E",X"3D",X"3E",X"03",X"06",X"1C",X"CD",X"F5",X"15",X"11", + X"5B",X"44",X"21",X"2F",X"3D",X"3E",X"03",X"06",X"1C",X"CD",X"F5",X"15",X"11",X"C4",X"40",X"21", + X"A0",X"19",X"3E",X"01",X"06",X"15",X"CD",X"DF",X"15",X"11",X"C9",X"40",X"21",X"B5",X"19",X"3E", + X"01",X"06",X"14",X"CD",X"DF",X"15",X"11",X"AB",X"40",X"21",X"C9",X"19",X"3E",X"01",X"06",X"17", + X"CD",X"DF",X"15",X"11",X"B0",X"40",X"21",X"E0",X"19",X"3E",X"01",X"06",X"16",X"CD",X"DF",X"15", + X"11",X"52",X"41",X"21",X"F6",X"19",X"3E",X"01",X"06",X"0C",X"CD",X"DF",X"15",X"3A",X"9B",X"4C", + X"FE",X"01",X"20",X"0F",X"11",X"19",X"41",X"21",X"02",X"1A",X"3E",X"01",X"06",X"0F",X"CD",X"DF", + X"15",X"18",X"20",X"FE",X"02",X"20",X"0F",X"11",X"19",X"41",X"21",X"11",X"1A",X"3E",X"01",X"06", + X"0F",X"CD",X"DF",X"15",X"18",X"0D",X"11",X"19",X"41",X"21",X"20",X"1A",X"3E",X"01",X"06",X"0F", + X"CD",X"DF",X"15",X"11",X"9C",X"40",X"21",X"2F",X"1A",X"3E",X"01",X"06",X"19",X"CD",X"DF",X"15", + X"3A",X"A5",X"4C",X"FE",X"00",X"20",X"0F",X"11",X"7C",X"41",X"21",X"48",X"1A",X"3E",X"01",X"06", + X"06",X"CD",X"DF",X"15",X"18",X"33",X"FE",X"01",X"20",X"0F",X"11",X"7C",X"41",X"21",X"4E",X"1A", + X"3E",X"01",X"06",X"06",X"CD",X"DF",X"15",X"18",X"20",X"FE",X"02",X"20",X"0F",X"11",X"7C",X"41", + X"21",X"54",X"1A",X"3E",X"01",X"06",X"06",X"CD",X"DF",X"15",X"18",X"0D",X"11",X"7C",X"41",X"21", + X"5A",X"1A",X"3E",X"01",X"06",X"06",X"CD",X"DF",X"15",X"3E",X"08",X"CD",X"59",X"15",X"21",X"95", + X"4C",X"CB",X"6E",X"20",X"53",X"CD",X"9B",X"38",X"AF",X"32",X"FF",X"4C",X"32",X"01",X"4D",X"32", + X"03",X"4D",X"32",X"00",X"4D",X"32",X"02",X"4D",X"32",X"04",X"4D",X"CD",X"BD",X"38",X"CD",X"EF", + X"0E",X"CD",X"CA",X"38",X"CD",X"C5",X"1B",X"AF",X"32",X"20",X"4D",X"32",X"3B",X"4D",X"32",X"56", + X"4D",X"32",X"71",X"4D",X"32",X"8C",X"4D",X"32",X"A7",X"4D",X"32",X"C2",X"4D",X"CD",X"1F",X"16", + X"32",X"C0",X"50",X"21",X"95",X"4C",X"CB",X"6E",X"20",X"0E",X"21",X"96",X"4C",X"CB",X"4E",X"20", + X"02",X"18",X"CE",X"CB",X"8E",X"C3",X"A5",X"07",X"CD",X"14",X"16",X"21",X"95",X"4C",X"CB",X"E6", + X"CB",X"AE",X"21",X"96",X"4C",X"CB",X"8E",X"CB",X"96",X"CB",X"9E",X"21",X"97",X"4C",X"CB",X"96", + X"21",X"96",X"4C",X"CB",X"C6",X"21",X"0C",X"4C",X"11",X"0D",X"4C",X"01",X"4F",X"00",X"36",X"FF", + X"ED",X"B0",X"3E",X"FF",X"32",X"01",X"50",X"21",X"97",X"4C",X"CB",X"56",X"20",X"0F",X"3A",X"FD", + X"4C",X"3C",X"32",X"FD",X"4C",X"FE",X"0A",X"20",X"04",X"CB",X"D6",X"CB",X"DE",X"00",X"32",X"C0", + X"50",X"3E",X"40",X"CD",X"07",X"15",X"3E",X"03",X"CD",X"17",X"15",X"3A",X"9B",X"4C",X"FE",X"00", + X"CA",X"13",X"0A",X"3A",X"9A",X"4C",X"FE",X"02",X"30",X"4C",X"11",X"70",X"41",X"21",X"BE",X"18", + X"3E",X"01",X"06",X"0B",X"CD",X"DF",X"15",X"3A",X"40",X"50",X"CB",X"6F",X"20",X"74",X"3A",X"9B", + X"4C",X"FE",X"00",X"28",X"15",X"3A",X"9A",X"4C",X"FE",X"02",X"38",X"66",X"D6",X"02",X"32",X"9A", + X"4C",X"3A",X"9D",X"4C",X"D6",X"01",X"27",X"32",X"9D",X"4C",X"21",X"96",X"4C",X"CB",X"E6",X"3A", + X"A2",X"4C",X"32",X"A6",X"4C",X"CD",X"13",X"00",X"3A",X"9B",X"4C",X"FE",X"00",X"CA",X"6E",X"0A", + X"CD",X"27",X"15",X"C3",X"6E",X"0A",X"FE",X"04",X"30",X"29",X"11",X"0E",X"41",X"21",X"C9",X"18", + X"3E",X"01",X"06",X"11",X"CD",X"DF",X"15",X"11",X"10",X"42",X"21",X"DA",X"18",X"3E",X"01",X"06", + X"02",X"CD",X"DF",X"15",X"11",X"72",X"41",X"21",X"BE",X"18",X"3E",X"01",X"06",X"0B",X"CD",X"DF", + X"15",X"18",X"94",X"11",X"90",X"40",X"21",X"DC",X"18",X"3E",X"01",X"06",X"19",X"CD",X"DF",X"15", + X"18",X"85",X"3A",X"40",X"50",X"CB",X"77",X"20",X"33",X"3A",X"9B",X"4C",X"FE",X"00",X"28",X"15", + X"3A",X"9A",X"4C",X"FE",X"04",X"38",X"25",X"D6",X"04",X"32",X"9A",X"4C",X"3A",X"9D",X"4C",X"D6", + X"02",X"27",X"32",X"9D",X"4C",X"21",X"96",X"4C",X"CB",X"A6",X"3A",X"A2",X"4C",X"32",X"A6",X"4C", + X"32",X"A7",X"4C",X"CD",X"13",X"00",X"CD",X"24",X"00",X"C3",X"D8",X"09",X"32",X"C0",X"50",X"21", + X"95",X"4C",X"CB",X"76",X"20",X"03",X"C3",X"A7",X"09",X"CB",X"B6",X"C3",X"7E",X"09",X"AF",X"21", + X"A8",X"4C",X"11",X"A9",X"4C",X"01",X"05",X"00",X"77",X"ED",X"B0",X"32",X"B1",X"4C",X"32",X"B2", + X"4C",X"3E",X"40",X"21",X"E4",X"43",X"11",X"E5",X"43",X"01",X"05",X"00",X"77",X"ED",X"B0",X"21", + X"F6",X"43",X"11",X"F7",X"43",X"01",X"05",X"00",X"77",X"ED",X"B0",X"AF",X"32",X"E4",X"43",X"32", + X"F6",X"43",X"AF",X"32",X"FF",X"4C",X"32",X"01",X"4D",X"32",X"03",X"4D",X"32",X"00",X"4D",X"32", + X"02",X"4D",X"32",X"04",X"4D",X"CD",X"AC",X"38",X"CD",X"C9",X"38",X"21",X"97",X"4C",X"CB",X"CE", + X"21",X"96",X"4C",X"CB",X"66",X"28",X"02",X"18",X"1A",X"3E",X"00",X"32",X"03",X"50",X"CD",X"4E", + X"15",X"11",X"50",X"41",X"21",X"F5",X"18",X"3E",X"01",X"06",X"0D",X"CD",X"DF",X"15",X"3E",X"03", + X"CD",X"59",X"15",X"21",X"96",X"4C",X"CB",X"EE",X"3A",X"A6",X"4C",X"3D",X"32",X"A6",X"4C",X"3E", + X"40",X"21",X"16",X"40",X"11",X"17",X"40",X"01",X"08",X"00",X"77",X"ED",X"B0",X"CD",X"13",X"00", + X"3A",X"FF",X"4C",X"32",X"03",X"4D",X"3A",X"00",X"4D",X"32",X"04",X"4D",X"CD",X"09",X"39",X"C3", + X"9A",X"0B",X"21",X"96",X"4C",X"CB",X"66",X"20",X"CA",X"CB",X"6E",X"28",X"AC",X"3A",X"96",X"4C", + X"CB",X"7F",X"20",X"43",X"CD",X"4E",X"15",X"11",X"50",X"41",X"21",X"02",X"19",X"3E",X"01",X"06", + X"0D",X"CD",X"DF",X"15",X"3E",X"03",X"CD",X"59",X"15",X"21",X"96",X"4C",X"CB",X"AE",X"3A",X"A7", + X"4C",X"3D",X"32",X"A7",X"4C",X"3E",X"40",X"21",X"02",X"40",X"11",X"03",X"40",X"01",X"08",X"00", + X"77",X"ED",X"B0",X"CD",X"24",X"00",X"3A",X"01",X"4D",X"32",X"03",X"4D",X"3A",X"02",X"4D",X"32", + X"04",X"4D",X"CD",X"11",X"39",X"18",X"33",X"3E",X"01",X"32",X"03",X"50",X"18",X"B6",X"CD",X"4E", + X"15",X"21",X"96",X"4C",X"CB",X"66",X"C2",X"E8",X"0A",X"11",X"10",X"41",X"21",X"0F",X"19",X"3E", + X"01",X"06",X"11",X"CD",X"DF",X"15",X"21",X"20",X"4D",X"CB",X"C6",X"3E",X"01",X"CD",X"59",X"15", + X"21",X"96",X"4C",X"CB",X"6E",X"28",X"A7",X"C3",X"E8",X"0A",X"CD",X"EF",X"0E",X"21",X"97",X"4C", + X"CB",X"4E",X"28",X"13",X"CB",X"8E",X"21",X"C2",X"4D",X"CB",X"C6",X"32",X"C0",X"50",X"3A",X"C2", + X"4D",X"FE",X"00",X"20",X"F6",X"18",X"05",X"3E",X"02",X"CD",X"59",X"15",X"CD",X"C5",X"1B",X"ED", + X"5B",X"AE",X"4C",X"7B",X"B2",X"28",X"09",X"21",X"00",X"00",X"22",X"AE",X"4C",X"CD",X"5B",X"0F", + X"32",X"C0",X"50",X"CD",X"1F",X"16",X"21",X"96",X"4C",X"CB",X"4E",X"28",X"DF",X"CB",X"8E",X"CD", + X"14",X"16",X"21",X"96",X"4C",X"CB",X"56",X"20",X"0F",X"CD",X"1B",X"39",X"CD",X"14",X"16",X"21", + X"96",X"4C",X"CB",X"5E",X"20",X"09",X"18",X"67",X"CB",X"96",X"CD",X"1A",X"39",X"18",X"EA",X"CB", + X"9E",X"21",X"97",X"4C",X"CB",X"CE",X"21",X"96",X"4C",X"CB",X"6E",X"20",X"29",X"3A",X"01",X"4D", + X"3C",X"FE",X"0C",X"20",X"02",X"3E",X"0B",X"32",X"01",X"4D",X"32",X"03",X"4D",X"3A",X"02",X"4D", + X"3C",X"FE",X"19",X"20",X"02",X"3E",X"18",X"32",X"02",X"4D",X"32",X"04",X"4D",X"CD",X"1C",X"39", + X"CD",X"19",X"39",X"C3",X"9A",X"0B",X"3A",X"FF",X"4C",X"3C",X"FE",X"0C",X"20",X"02",X"3E",X"0B", + X"32",X"FF",X"4C",X"32",X"03",X"4D",X"3A",X"00",X"4D",X"3C",X"FE",X"19",X"20",X"02",X"3E",X"18", + X"32",X"00",X"4D",X"32",X"04",X"4D",X"CD",X"1C",X"39",X"CD",X"18",X"39",X"C3",X"9A",X"0B",X"3A", + X"B0",X"4C",X"FE",X"00",X"20",X"2E",X"21",X"96",X"4C",X"CB",X"6E",X"20",X"2F",X"3A",X"A7",X"4C", + X"FE",X"00",X"20",X"4E",X"CD",X"4E",X"15",X"11",X"90",X"41",X"21",X"20",X"19",X"3E",X"01",X"06", + X"09",X"CD",X"DF",X"15",X"3E",X"02",X"CD",X"59",X"15",X"CD",X"F8",X"11",X"21",X"95",X"4C",X"CB", + X"F6",X"C3",X"7D",X"07",X"D6",X"01",X"32",X"B0",X"4C",X"C3",X"6E",X"0B",X"3A",X"A6",X"4C",X"FE", + X"00",X"20",X"25",X"21",X"96",X"4C",X"CB",X"66",X"20",X"CA",X"CD",X"4E",X"15",X"11",X"F0",X"40", + X"21",X"29",X"19",X"3E",X"01",X"06",X"14",X"CD",X"DF",X"15",X"3E",X"03",X"CD",X"59",X"15",X"C3", + X"1D",X"0B",X"CD",X"10",X"39",X"C3",X"12",X"0B",X"CD",X"08",X"39",X"C3",X"12",X"0B",X"2A",X"91", + X"4C",X"EB",X"DD",X"21",X"00",X"00",X"DD",X"19",X"DD",X"7E",X"01",X"DD",X"86",X"02",X"47",X"E6", + X"0F",X"DD",X"77",X"02",X"CB",X"38",X"CB",X"38",X"CB",X"38",X"CB",X"38",X"DD",X"7E",X"00",X"21", + X"FC",X"0C",X"CB",X"27",X"CD",X"BA",X"15",X"5E",X"23",X"56",X"EB",X"E9",X"08",X"0D",X"08",X"0D", + X"09",X"0D",X"11",X"0D",X"19",X"0D",X"21",X"0D",X"C9",X"DD",X"7E",X"04",X"90",X"DD",X"77",X"04", + X"C9",X"DD",X"7E",X"04",X"80",X"DD",X"77",X"04",X"C9",X"DD",X"7E",X"03",X"80",X"DD",X"77",X"03", + X"C9",X"DD",X"7E",X"03",X"90",X"DD",X"77",X"03",X"C9",X"2A",X"5E",X"4C",X"EB",X"DD",X"21",X"00", + X"00",X"DD",X"19",X"EB",X"01",X"00",X"4C",X"37",X"3F",X"ED",X"42",X"E5",X"DD",X"7E",X"00",X"21", + X"4C",X"0D",X"CB",X"27",X"CD",X"BA",X"15",X"5E",X"23",X"56",X"EB",X"E9",X"1C",X"0E",X"58",X"0D", + X"9B",X"0D",X"2B",X"0E",X"35",X"0E",X"48",X"0E",X"DD",X"7E",X"03",X"32",X"5C",X"4C",X"DD",X"7E", + X"04",X"32",X"5D",X"4C",X"CD",X"B2",X"0E",X"DD",X"7E",X"06",X"12",X"3A",X"0A",X"4C",X"FE",X"00", + X"20",X"17",X"3A",X"0B",X"4C",X"FE",X"00",X"20",X"17",X"C1",X"21",X"0C",X"4C",X"09",X"E5",X"D1", + X"13",X"01",X"05",X"00",X"36",X"FF",X"ED",X"B0",X"C9",X"DD",X"7E",X"06",X"13",X"12",X"18",X"E9", + X"DD",X"7E",X"06",X"21",X"20",X"00",X"19",X"EB",X"12",X"18",X"DE",X"CD",X"DA",X"0E",X"DD",X"7E", + X"03",X"90",X"32",X"5C",X"4C",X"DD",X"7E",X"04",X"32",X"5D",X"4C",X"CD",X"B2",X"0E",X"3A",X"0A", + X"4C",X"FE",X"00",X"28",X"32",X"3A",X"0A",X"4C",X"CB",X"27",X"DD",X"46",X"05",X"80",X"3D",X"C1", + X"FD",X"21",X"0C",X"4C",X"FD",X"09",X"FD",X"73",X"00",X"FD",X"72",X"01",X"FD",X"77",X"02",X"3C", + X"13",X"FD",X"73",X"03",X"FD",X"72",X"04",X"FD",X"77",X"05",X"3A",X"5C",X"4C",X"DD",X"77",X"03", + X"3A",X"5D",X"4C",X"DD",X"77",X"04",X"C9",X"3A",X"0B",X"4C",X"FE",X"00",X"CA",X"51",X"0E",X"3A", + X"0B",X"4C",X"CB",X"27",X"C6",X"0F",X"DD",X"46",X"05",X"80",X"C1",X"FD",X"21",X"0C",X"4C",X"FD", + X"09",X"FD",X"73",X"00",X"FD",X"72",X"01",X"FD",X"77",X"02",X"3C",X"21",X"20",X"00",X"19",X"EB", + X"FD",X"73",X"03",X"FD",X"72",X"04",X"FD",X"77",X"05",X"C3",X"DA",X"0D",X"DD",X"7E",X"03",X"32", + X"5C",X"4C",X"DD",X"7E",X"04",X"32",X"5D",X"4C",X"C3",X"AB",X"0D",X"CD",X"DA",X"0E",X"DD",X"7E", + X"03",X"80",X"C3",X"A2",X"0D",X"CD",X"DA",X"0E",X"DD",X"7E",X"04",X"90",X"32",X"5D",X"4C",X"DD", + X"7E",X"03",X"32",X"5C",X"4C",X"C3",X"AB",X"0D",X"CD",X"DA",X"0E",X"DD",X"7E",X"04",X"80",X"18", + X"EB",X"DD",X"7E",X"05",X"C1",X"FD",X"21",X"0C",X"4C",X"FD",X"09",X"FD",X"73",X"00",X"FD",X"72", + X"01",X"FD",X"77",X"02",X"3A",X"5C",X"4C",X"DD",X"77",X"03",X"3A",X"5D",X"4C",X"DD",X"77",X"04", + X"DD",X"7E",X"00",X"21",X"85",X"0E",X"CB",X"27",X"CD",X"BA",X"15",X"D5",X"5E",X"23",X"56",X"EB", + X"D1",X"DD",X"7E",X"06",X"E9",X"91",X"0E",X"91",X"0E",X"92",X"0E",X"9D",X"0E",X"A0",X"0E",X"A7", + X"0E",X"C9",X"13",X"FD",X"73",X"03",X"FD",X"72",X"04",X"FD",X"77",X"05",X"C9",X"1B",X"18",X"F3", + X"21",X"20",X"00",X"19",X"EB",X"18",X"EC",X"EB",X"11",X"20",X"00",X"37",X"3F",X"ED",X"52",X"EB", + X"18",X"E1",X"3A",X"5C",X"4C",X"E6",X"07",X"32",X"0A",X"4C",X"3A",X"5D",X"4C",X"E6",X"07",X"32", + X"0B",X"4C",X"3A",X"5C",X"4C",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"57",X"3A",X"5D",X"4C",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"5F",X"CD",X"E9",X"14",X"C9",X"DD",X"7E",X"01",X"DD",X"86",X"02", + X"47",X"E6",X"0F",X"DD",X"77",X"02",X"CB",X"38",X"CB",X"38",X"CB",X"38",X"CB",X"38",X"C9",X"3A", + X"03",X"4D",X"21",X"FD",X"0E",X"CB",X"27",X"CB",X"27",X"CD",X"BA",X"15",X"E9",X"CD",X"CA",X"29", + X"C9",X"CD",X"23",X"2A",X"C9",X"CD",X"7C",X"2A",X"C9",X"CD",X"D5",X"2A",X"C9",X"CD",X"2E",X"2B", + X"C9",X"CD",X"87",X"2B",X"C9",X"CD",X"E0",X"2B",X"C9",X"CD",X"36",X"2C",X"C9",X"CD",X"8C",X"2C", + X"C9",X"CD",X"E5",X"2C",X"C9",X"CD",X"3E",X"2D",X"C9",X"CD",X"8A",X"2D",X"C9",X"CD",X"D6",X"2D", + X"C9",X"CD",X"D7",X"2D",X"C9",X"CD",X"D8",X"2D",X"C9",X"CD",X"D9",X"2D",X"C9",X"D5",X"37",X"3F", + X"21",X"0E",X"01",X"16",X"00",X"ED",X"52",X"7D",X"37",X"3F",X"21",X"10",X"01",X"D1",X"5A",X"16", + X"00",X"ED",X"52",X"55",X"5F",X"C9",X"7D",X"EE",X"03",X"6F",X"C9",X"21",X"96",X"4C",X"CB",X"46", + X"C8",X"CB",X"6E",X"28",X"43",X"21",X"A8",X"4C",X"7B",X"86",X"27",X"77",X"23",X"7A",X"8E",X"27", + X"77",X"23",X"3E",X"00",X"8E",X"27",X"77",X"38",X"02",X"18",X"32",X"21",X"96",X"4C",X"CB",X"6E", + X"28",X"13",X"21",X"F6",X"43",X"11",X"F7",X"43",X"01",X"05",X"00",X"36",X"40",X"ED",X"B0",X"AF", + X"32",X"F6",X"43",X"18",X"18",X"21",X"E4",X"43",X"11",X"E5",X"43",X"01",X"05",X"00",X"36",X"40", + X"ED",X"B0",X"AF",X"32",X"E4",X"43",X"18",X"05",X"21",X"AB",X"4C",X"18",X"BB",X"21",X"96",X"4C", + X"CB",X"6E",X"28",X"5C",X"21",X"AA",X"4C",X"11",X"FB",X"43",X"3A",X"B1",X"4C",X"F5",X"CD",X"1B", + X"10",X"23",X"23",X"23",X"EB",X"2A",X"A3",X"4C",X"F1",X"FE",X"04",X"D0",X"CB",X"27",X"CB",X"27", + X"3C",X"3C",X"CD",X"BA",X"15",X"CD",X"B0",X"11",X"D0",X"3A",X"B0",X"4C",X"3C",X"32",X"B0",X"4C", + X"21",X"20",X"4D",X"CB",X"C6",X"21",X"96",X"4C",X"CB",X"6E",X"28",X"12",X"3A",X"B1",X"4C",X"3C", + X"32",X"B1",X"4C",X"3A",X"A6",X"4C",X"3C",X"32",X"A6",X"4C",X"CD",X"13",X"00",X"C9",X"3A",X"B2", + X"4C",X"3C",X"32",X"B2",X"4C",X"3A",X"A7",X"4C",X"3C",X"32",X"A7",X"4C",X"CD",X"24",X"00",X"C9", + X"21",X"AD",X"4C",X"11",X"E9",X"43",X"3A",X"B2",X"4C",X"18",X"A2",X"3E",X"03",X"F5",X"7E",X"E6", + X"F0",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"47",X"3A",X"96",X"4C",X"CB",X"77",X"28", + X"22",X"78",X"12",X"1B",X"7E",X"E6",X"0F",X"47",X"3A",X"96",X"4C",X"CB",X"77",X"32",X"96",X"4C", + X"28",X"20",X"78",X"12",X"2B",X"1B",X"F1",X"3D",X"20",X"D3",X"3A",X"96",X"4C",X"CB",X"B7",X"32", + X"96",X"4C",X"C9",X"78",X"FE",X"00",X"28",X"DB",X"3A",X"96",X"4C",X"CB",X"F7",X"32",X"96",X"4C", + X"18",X"CF",X"78",X"FE",X"00",X"28",X"DD",X"3A",X"96",X"4C",X"CB",X"F7",X"32",X"96",X"4C",X"18", + X"D1",X"21",X"97",X"4C",X"CB",X"5E",X"28",X"3D",X"CB",X"9E",X"21",X"40",X"40",X"CD",X"A7",X"10", + X"FE",X"DC",X"20",X"1C",X"21",X"40",X"44",X"CD",X"A7",X"10",X"FE",X"DD",X"20",X"12",X"47",X"E6", + X"F0",X"32",X"51",X"4F",X"78",X"32",X"50",X"4F",X"3A",X"51",X"4F",X"B8",X"20",X"02",X"18",X"15", + X"3E",X"40",X"CD",X"07",X"15",X"F3",X"C9",X"AF",X"11",X"80",X"03",X"86",X"23",X"1B",X"47",X"7A", + X"B3",X"78",X"20",X"F7",X"C9",X"00",X"3E",X"40",X"CD",X"07",X"15",X"3E",X"09",X"CD",X"17",X"15", + X"11",X"29",X"45",X"21",X"F4",X"10",X"3E",X"15",X"06",X"0B",X"CD",X"F5",X"15",X"11",X"45",X"41", + X"21",X"3D",X"19",X"3E",X"01",X"06",X"0C",X"CD",X"DF",X"15",X"21",X"68",X"1B",X"11",X"CA",X"42", + X"01",X"FF",X"09",X"ED",X"A0",X"13",X"10",X"FB",X"AF",X"12",X"CD",X"0C",X"16",X"3E",X"01",X"12", + X"CD",X"F5",X"10",X"C9",X"03",X"21",X"B3",X"4C",X"11",X"6A",X"42",X"CD",X"35",X"11",X"11",X"6C", + X"42",X"CD",X"35",X"11",X"11",X"6E",X"42",X"CD",X"35",X"11",X"11",X"70",X"42",X"CD",X"35",X"11", + X"11",X"72",X"42",X"CD",X"35",X"11",X"11",X"74",X"42",X"CD",X"35",X"11",X"11",X"76",X"42",X"CD", + X"35",X"11",X"11",X"78",X"42",X"CD",X"35",X"11",X"11",X"7A",X"42",X"CD",X"35",X"11",X"11",X"7C", + X"42",X"CD",X"35",X"11",X"C9",X"06",X"03",X"0E",X"0F",X"3E",X"21",X"ED",X"A0",X"CD",X"D3",X"15", + X"10",X"F7",X"23",X"23",X"3E",X"40",X"CD",X"D3",X"15",X"CD",X"52",X"11",X"3E",X"04",X"CD",X"BA", + X"15",X"C9",X"3E",X"03",X"F5",X"7E",X"E6",X"F0",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F", + X"47",X"3A",X"96",X"4C",X"CB",X"77",X"28",X"2A",X"78",X"12",X"3E",X"20",X"CD",X"D3",X"15",X"7E", + X"E6",X"0F",X"47",X"3A",X"96",X"4C",X"CB",X"77",X"32",X"96",X"4C",X"28",X"24",X"78",X"12",X"2B", + X"3E",X"20",X"CD",X"D3",X"15",X"F1",X"3D",X"20",X"CB",X"3A",X"96",X"4C",X"CB",X"B7",X"32",X"96", + X"4C",X"C9",X"78",X"FE",X"00",X"28",X"D3",X"3A",X"96",X"4C",X"CB",X"F7",X"32",X"96",X"4C",X"18", + X"C7",X"78",X"FE",X"00",X"28",X"D9",X"3A",X"96",X"4C",X"CB",X"F7",X"32",X"96",X"4C",X"18",X"CD", + X"06",X"03",X"1A",X"BE",X"38",X"08",X"20",X"0E",X"2B",X"1B",X"10",X"F6",X"18",X"06",X"CD",X"CB", + X"11",X"37",X"3F",X"C9",X"37",X"C9",X"CD",X"CB",X"11",X"37",X"C9",X"78",X"FE",X"00",X"C8",X"2B", + X"1B",X"3D",X"20",X"FB",X"C9",X"DE",X"47",X"4F",X"52",X"4B",X"41",X"4E",X"53",X"2C",X"43",X"4F", + X"50",X"59",X"52",X"49",X"47",X"48",X"54",X"20",X"31",X"39",X"38",X"33",X"54",X"45",X"43",X"48", + X"53",X"54",X"41",X"52",X"20",X"49",X"4E",X"43",X"21",X"96",X"4C",X"CB",X"EE",X"21",X"A8",X"4C", + X"11",X"F5",X"4C",X"01",X"03",X"00",X"ED",X"B0",X"CD",X"22",X"12",X"21",X"96",X"4C",X"CB",X"66", + X"C0",X"CB",X"AE",X"21",X"AB",X"4C",X"11",X"F5",X"4C",X"01",X"03",X"00",X"ED",X"B0",X"CD",X"22", + X"12",X"C9",X"01",X"00",X"0A",X"21",X"F1",X"4C",X"11",X"F7",X"4C",X"2B",X"2B",X"2B",X"C5",X"CD", + X"B0",X"11",X"C1",X"30",X"0A",X"3E",X"06",X"81",X"4F",X"10",X"ED",X"2B",X"2B",X"18",X"08",X"79", + X"FE",X"00",X"C8",X"23",X"23",X"23",X"23",X"C5",X"E5",X"06",X"00",X"21",X"EE",X"4C",X"11",X"F4", + X"4C",X"ED",X"B8",X"3E",X"40",X"CD",X"07",X"15",X"21",X"96",X"4C",X"CB",X"6E",X"20",X"1B",X"11", + X"62",X"41",X"21",X"05",X"19",X"3E",X"01",X"06",X"0A",X"CD",X"DF",X"15",X"21",X"96",X"4C",X"CB", + X"7E",X"28",X"19",X"3E",X"01",X"32",X"03",X"50",X"18",X"12",X"11",X"62",X"41",X"21",X"F8",X"18", + X"3E",X"01",X"06",X"0A",X"CD",X"DF",X"15",X"3E",X"00",X"32",X"03",X"50",X"11",X"40",X"44",X"21", + X"E5",X"14",X"3E",X"0B",X"06",X"1C",X"CD",X"F5",X"15",X"11",X"4C",X"44",X"21",X"E6",X"14",X"3E", + X"03",X"06",X"1C",X"CD",X"F5",X"15",X"11",X"51",X"44",X"21",X"E7",X"14",X"3E",X"10",X"06",X"1C", + X"CD",X"F5",X"15",X"11",X"50",X"44",X"21",X"E8",X"14",X"3E",X"02",X"06",X"1C",X"CD",X"F5",X"15", + X"D1",X"D5",X"3E",X"40",X"D5",X"E1",X"13",X"01",X"03",X"00",X"77",X"ED",X"B0",X"36",X"00",X"01", + X"02",X"00",X"ED",X"B0",X"D1",X"C1",X"D5",X"78",X"21",X"A9",X"1B",X"CB",X"27",X"CD",X"BA",X"15", + X"4E",X"23",X"46",X"C5",X"21",X"80",X"04",X"09",X"0E",X"01",X"06",X"0F",X"71",X"3E",X"20",X"CD", + X"C9",X"15",X"10",X"F8",X"11",X"C3",X"40",X"21",X"49",X"19",X"3E",X"01",X"06",X"14",X"CD",X"DF", + X"15",X"11",X"A5",X"41",X"21",X"5D",X"19",X"3E",X"01",X"06",X"07",X"CD",X"DF",X"15",X"11",X"A7", + X"40",X"21",X"64",X"19",X"3E",X"01",X"06",X"16",X"CD",X"DF",X"15",X"11",X"88",X"40",X"21",X"7A", + X"19",X"3E",X"01",X"06",X"17",X"CD",X"DF",X"15",X"11",X"69",X"42",X"21",X"91",X"19",X"3E",X"01", + X"06",X"08",X"CD",X"DF",X"15",X"11",X"4C",X"40",X"21",X"99",X"19",X"3E",X"03",X"06",X"01",X"CD", + X"DF",X"15",X"11",X"8D",X"40",X"21",X"8B",X"1B",X"3E",X"01",X"06",X"1A",X"CD",X"DF",X"15",X"3E", + X"01",X"11",X"AD",X"47",X"12",X"AF",X"32",X"F9",X"4C",X"32",X"FA",X"4C",X"21",X"AD",X"47",X"22", + X"FB",X"4C",X"11",X"71",X"41",X"21",X"3D",X"19",X"3E",X"01",X"06",X"0C",X"CD",X"DF",X"15",X"21", + X"68",X"1B",X"11",X"F4",X"42",X"01",X"09",X"00",X"ED",X"B0",X"AF",X"12",X"CD",X"0C",X"16",X"3E", + X"01",X"12",X"21",X"B3",X"4C",X"11",X"94",X"42",X"CD",X"35",X"11",X"11",X"95",X"42",X"CD",X"35", + X"11",X"11",X"96",X"42",X"CD",X"35",X"11",X"11",X"97",X"42",X"CD",X"35",X"11",X"11",X"98",X"42", + X"CD",X"35",X"11",X"11",X"99",X"42",X"CD",X"35",X"11",X"11",X"9A",X"42",X"CD",X"35",X"11",X"11", + X"9B",X"42",X"CD",X"35",X"11",X"11",X"9C",X"42",X"CD",X"35",X"11",X"11",X"9D",X"42",X"CD",X"35", + X"11",X"3A",X"F8",X"4C",X"CB",X"4F",X"CA",X"4D",X"14",X"CB",X"57",X"CA",X"85",X"14",X"3A",X"F8", + X"4C",X"CB",X"67",X"C2",X"C6",X"14",X"3A",X"F9",X"4C",X"FE",X"1B",X"28",X"1F",X"21",X"71",X"1B", + X"CD",X"BA",X"15",X"7E",X"E1",X"D1",X"12",X"13",X"77",X"3E",X"20",X"CD",X"C9",X"15",X"D5",X"E5", + X"3A",X"FA",X"4C",X"3C",X"32",X"FA",X"4C",X"FE",X"03",X"C2",X"D9",X"14",X"21",X"BD",X"1B",X"3A", + X"FA",X"4C",X"CD",X"BA",X"15",X"7E",X"E1",X"D1",X"E5",X"CD",X"BF",X"15",X"21",X"F5",X"4C",X"01", + X"03",X"00",X"ED",X"B0",X"3A",X"FA",X"4C",X"FE",X"00",X"28",X"25",X"21",X"C1",X"1B",X"CD",X"BA", + X"15",X"7E",X"D1",X"CD",X"D3",X"15",X"21",X"F7",X"4C",X"CD",X"52",X"11",X"21",X"B8",X"4C",X"11", + X"F2",X"43",X"CD",X"1B",X"10",X"21",X"97",X"4C",X"CB",X"86",X"3E",X"01",X"CD",X"59",X"15",X"C9", + X"D1",X"3E",X"80",X"CD",X"D3",X"15",X"3E",X"20",X"CD",X"D3",X"15",X"18",X"D9",X"3A",X"F9",X"4C", + X"FE",X"00",X"CA",X"CE",X"13",X"3D",X"32",X"F9",X"4C",X"FE",X"1A",X"28",X"14",X"3E",X"05",X"2A", + X"FB",X"4C",X"77",X"3E",X"20",X"CD",X"BA",X"15",X"22",X"FB",X"4C",X"3E",X"01",X"77",X"C3",X"CE", + X"13",X"3D",X"32",X"F9",X"4C",X"3E",X"05",X"2A",X"FB",X"4C",X"2B",X"77",X"23",X"77",X"23",X"77", + X"2B",X"3E",X"40",X"18",X"E0",X"3A",X"F9",X"4C",X"FE",X"1B",X"CA",X"CE",X"13",X"3C",X"32",X"F9", + X"4C",X"FE",X"1A",X"28",X"14",X"3E",X"05",X"2A",X"FB",X"4C",X"77",X"3E",X"20",X"CD",X"C9",X"15", + X"22",X"FB",X"4C",X"3E",X"01",X"77",X"C3",X"CE",X"13",X"3C",X"32",X"F9",X"4C",X"3E",X"05",X"2A", + X"FB",X"4C",X"77",X"3E",X"40",X"CD",X"C9",X"15",X"22",X"FB",X"4C",X"3E",X"01",X"2B",X"77",X"23", + X"77",X"23",X"77",X"C3",X"CE",X"13",X"3E",X"08",X"CD",X"A5",X"15",X"32",X"C0",X"50",X"06",X"14", + X"CD",X"71",X"15",X"DA",X"FC",X"13",X"C3",X"C1",X"13",X"3A",X"F8",X"4C",X"CB",X"67",X"32",X"C0", + X"50",X"28",X"F6",X"18",X"E6",X"09",X"05",X"10",X"01",X"D5",X"AF",X"CB",X"23",X"17",X"CB",X"23", + X"17",X"CB",X"23",X"17",X"CB",X"23",X"17",X"CB",X"23",X"17",X"57",X"EB",X"01",X"40",X"40",X"09", + X"06",X"00",X"D1",X"4A",X"09",X"EB",X"C9",X"21",X"40",X"40",X"11",X"41",X"40",X"01",X"7F",X"03", + X"77",X"ED",X"B0",X"32",X"C0",X"50",X"C9",X"21",X"40",X"44",X"11",X"41",X"44",X"01",X"7F",X"03", + X"77",X"ED",X"B0",X"32",X"C0",X"50",X"C9",X"3A",X"9B",X"4C",X"FE",X"00",X"C8",X"3A",X"9D",X"4C", + X"E6",X"F0",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"FE",X"00",X"28",X"0C",X"32",X"0D", + X"40",X"3A",X"9D",X"4C",X"E6",X"0F",X"32",X"0C",X"40",X"C9",X"3E",X"40",X"18",X"F0",X"3E",X"09", + X"CD",X"17",X"15",X"3E",X"40",X"CD",X"07",X"15",X"C9",X"47",X"AF",X"32",X"9E",X"4C",X"32",X"A0", + X"4C",X"3A",X"A0",X"4C",X"B8",X"C8",X"21",X"95",X"4C",X"CB",X"6E",X"C0",X"32",X"C0",X"50",X"18", + X"F0",X"3A",X"97",X"4C",X"CB",X"47",X"28",X"0D",X"3A",X"A1",X"4C",X"47",X"3A",X"A0",X"4C",X"B8", + X"30",X"19",X"37",X"3F",X"C9",X"78",X"32",X"A1",X"4C",X"3A",X"97",X"4C",X"CB",X"C7",X"32",X"97", + X"4C",X"AF",X"32",X"A0",X"4C",X"32",X"9E",X"4C",X"37",X"3F",X"C9",X"3A",X"97",X"4C",X"CB",X"87", + X"32",X"97",X"4C",X"37",X"C9",X"47",X"AF",X"32",X"9F",X"4C",X"3A",X"9F",X"4C",X"B8",X"C8",X"21", + X"95",X"4C",X"CB",X"6E",X"C0",X"32",X"C0",X"50",X"18",X"F0",X"85",X"6F",X"D0",X"24",X"C9",X"83", + X"5F",X"D0",X"14",X"C9",X"81",X"4F",X"D0",X"04",X"C9",X"D5",X"16",X"00",X"5F",X"37",X"3F",X"ED", + X"52",X"D1",X"C9",X"E5",X"EB",X"16",X"00",X"5F",X"37",X"3F",X"ED",X"52",X"EB",X"E1",X"C9",X"32", + X"60",X"4C",X"D5",X"3A",X"60",X"4C",X"4F",X"ED",X"A0",X"79",X"FE",X"00",X"20",X"F9",X"D1",X"CD", + X"0C",X"16",X"10",X"EE",X"C9",X"32",X"60",X"4C",X"D5",X"3A",X"60",X"4C",X"4F",X"ED",X"A0",X"2B", + X"79",X"FE",X"00",X"20",X"F8",X"D1",X"CD",X"0C",X"16",X"10",X"ED",X"C9",X"E5",X"21",X"20",X"00", + X"19",X"EB",X"E1",X"C9",X"21",X"61",X"4C",X"06",X"2F",X"36",X"00",X"23",X"10",X"FB",X"C9",X"21", + X"95",X"4C",X"CB",X"FE",X"CB",X"7E",X"C8",X"18",X"FB",X"3A",X"00",X"50",X"E6",X"0F",X"47",X"3A", + X"40",X"50",X"E6",X"F0",X"B0",X"32",X"F8",X"4C",X"C9",X"3A",X"40",X"50",X"47",X"E6",X"0F",X"CB", + X"78",X"28",X"02",X"CB",X"E7",X"32",X"F8",X"4C",X"C9",X"DD",X"21",X"05",X"4D",X"DD",X"CB",X"00", + X"46",X"C4",X"7A",X"17",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"82",X"17",X"FD",X"21",X"51", + X"50",X"CD",X"51",X"17",X"DD",X"7E",X"06",X"32",X"45",X"50",X"DD",X"21",X"20",X"4D",X"DD",X"CB", + X"00",X"46",X"C4",X"7A",X"17",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"82",X"17",X"FD",X"21", + X"51",X"50",X"CD",X"51",X"17",X"DD",X"7E",X"06",X"32",X"45",X"50",X"DD",X"21",X"3B",X"4D",X"DD", + X"CB",X"00",X"46",X"C4",X"7A",X"17",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"82",X"17",X"FD", + X"21",X"51",X"50",X"CD",X"51",X"17",X"DD",X"7E",X"06",X"32",X"45",X"50",X"DD",X"21",X"56",X"4D", + X"DD",X"CB",X"00",X"46",X"C4",X"7A",X"17",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"82",X"17", + X"FD",X"21",X"56",X"50",X"CD",X"51",X"17",X"DD",X"7E",X"06",X"32",X"4A",X"50",X"DD",X"21",X"71", + X"4D",X"DD",X"CB",X"00",X"46",X"C4",X"7A",X"17",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"82", + X"17",X"FD",X"21",X"56",X"50",X"CD",X"51",X"17",X"DD",X"7E",X"06",X"32",X"4A",X"50",X"DD",X"21", + X"8C",X"4D",X"DD",X"CB",X"00",X"46",X"C4",X"7A",X"17",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD", + X"82",X"17",X"FD",X"21",X"56",X"50",X"CD",X"51",X"17",X"DD",X"7E",X"06",X"32",X"4A",X"50",X"DD", + X"21",X"A7",X"4D",X"DD",X"CB",X"00",X"46",X"C4",X"7A",X"17",X"DD",X"CB",X"00",X"56",X"28",X"10", + X"CD",X"82",X"17",X"FD",X"21",X"5B",X"50",X"CD",X"51",X"17",X"DD",X"7E",X"06",X"32",X"4F",X"50", + X"DD",X"21",X"C2",X"4D",X"DD",X"CB",X"00",X"46",X"C4",X"7A",X"17",X"DD",X"CB",X"00",X"56",X"C8", + X"CD",X"82",X"17",X"FD",X"21",X"5B",X"50",X"CD",X"51",X"17",X"DD",X"7E",X"06",X"32",X"4F",X"50", + X"C9",X"DD",X"7E",X"03",X"FD",X"77",X"00",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"FD", + X"77",X"01",X"DD",X"7E",X"04",X"FD",X"77",X"02",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F", + X"FD",X"77",X"03",X"DD",X"7E",X"05",X"FD",X"77",X"04",X"C9",X"CD",X"56",X"18",X"DD",X"CB",X"00", + X"D6",X"C9",X"DD",X"CB",X"00",X"4E",X"C2",X"56",X"18",X"DD",X"6E",X"01",X"DD",X"66",X"02",X"7E", + X"CB",X"27",X"11",X"A0",X"17",X"CD",X"BF",X"15",X"23",X"E5",X"1A",X"6F",X"13",X"1A",X"67",X"E9", + X"BA",X"17",X"BE",X"17",X"CC",X"17",X"D5",X"17",X"EB",X"17",X"F8",X"17",X"12",X"18",X"2B",X"18", + X"4D",X"18",X"55",X"18",X"74",X"18",X"80",X"18",X"8C",X"18",X"E1",X"C3",X"8F",X"17",X"E1",X"7E", + X"DD",X"77",X"03",X"23",X"7E",X"23",X"DD",X"77",X"04",X"C3",X"8F",X"17",X"E1",X"7E",X"DD",X"77", + X"05",X"23",X"C3",X"8F",X"17",X"E1",X"7E",X"DD",X"46",X"03",X"80",X"DD",X"77",X"03",X"23",X"7E", + X"23",X"DD",X"46",X"04",X"88",X"DD",X"77",X"04",X"C3",X"8F",X"17",X"E1",X"7E",X"DD",X"46",X"05", + X"80",X"DD",X"77",X"05",X"23",X"C3",X"8F",X"17",X"E1",X"DD",X"7E",X"07",X"BE",X"30",X"0B",X"DD", + X"34",X"07",X"2B",X"DD",X"75",X"01",X"DD",X"74",X"02",X"C9",X"DD",X"36",X"07",X"00",X"23",X"C3", + X"8F",X"17",X"DD",X"6E",X"08",X"DD",X"66",X"09",X"D1",X"D5",X"2B",X"72",X"2B",X"73",X"2B",X"36", + X"00",X"DD",X"75",X"08",X"DD",X"74",X"09",X"E1",X"C3",X"8F",X"17",X"D1",X"1A",X"DD",X"6E",X"08", + X"DD",X"66",X"09",X"BE",X"28",X"09",X"34",X"23",X"5E",X"23",X"56",X"EB",X"C3",X"8F",X"17",X"23", + X"23",X"23",X"DD",X"75",X"08",X"DD",X"74",X"09",X"13",X"EB",X"C3",X"8F",X"17",X"E1",X"5E",X"23", + X"56",X"EB",X"C3",X"8F",X"17",X"E1",X"DD",X"E5",X"DD",X"E5",X"E1",X"D1",X"13",X"36",X"00",X"01", + X"18",X"00",X"ED",X"B0",X"1A",X"DD",X"77",X"01",X"13",X"1A",X"DD",X"77",X"02",X"DD",X"75",X"08", + X"DD",X"74",X"09",X"C9",X"E1",X"DD",X"75",X"01",X"DD",X"74",X"02",X"DD",X"36",X"00",X"00",X"C9", + X"E1",X"5E",X"23",X"56",X"EB",X"36",X"06",X"13",X"EB",X"C3",X"8F",X"17",X"E1",X"7E",X"DD",X"77", + X"06",X"23",X"C3",X"8F",X"17",X"32",X"40",X"52",X"45",X"59",X"41",X"4C",X"50",X"40",X"45",X"52", + X"4F",X"43",X"53",X"50",X"4F",X"54",X"40",X"31",X"40",X"52",X"45",X"59",X"41",X"4C",X"50",X"54", + X"49",X"44",X"45",X"52",X"43",X"59",X"41",X"4C",X"50",X"45",X"45",X"52",X"46",X"40",X"4E",X"49", + X"4F",X"43",X"40",X"54",X"52",X"45",X"53",X"4E",X"49",X"52",X"45",X"59",X"41",X"4C",X"50",X"40", + X"45",X"4E",X"4F",X"40",X"54",X"43",X"45",X"4C",X"45",X"53",X"52",X"4F",X"53",X"52",X"45",X"59", + X"41",X"4C",X"50",X"40",X"4F",X"57",X"54",X"40",X"52",X"4F",X"40",X"45",X"4E",X"4F",X"40",X"54", + X"43",X"45",X"4C",X"45",X"53",X"50",X"55",X"40",X"45",X"4E",X"4F",X"40",X"52",X"45",X"59",X"41", + X"4C",X"50",X"50",X"55",X"40",X"4F",X"57",X"54",X"40",X"52",X"45",X"59",X"41",X"4C",X"50",X"4E", + X"49",X"41",X"47",X"41",X"40",X"52",X"45",X"59",X"41",X"4C",X"50",X"40",X"45",X"4D",X"41",X"53", + X"52",X"45",X"56",X"4F",X"40",X"45",X"4D",X"41",X"47",X"52",X"45",X"56",X"4F",X"40",X"45",X"4D", + X"41",X"47",X"40",X"45",X"4E",X"4F",X"40",X"52",X"45",X"59",X"41",X"4C",X"50",X"45",X"4D",X"41", + X"46",X"40",X"46",X"4F",X"40",X"4C",X"4C",X"41",X"48",X"45",X"48",X"54",X"40",X"4E",X"49",X"40", + X"53",X"49",X"40",X"45",X"52",X"4F",X"43",X"53",X"40",X"52",X"55",X"4F",X"59",X"4E",X"45",X"54", + X"40",X"50",X"4F",X"54",X"54",X"43",X"45",X"4C",X"45",X"53",X"40",X"4F",X"54",X"40",X"4B",X"43", + X"49",X"54",X"53",X"59",X"4F",X"4A",X"40",X"45",X"53",X"55",X"4E",X"4F",X"54",X"54",X"55",X"42", + X"40",X"44",X"45",X"45",X"50",X"53",X"40",X"44",X"4E",X"41",X"40",X"52",X"45",X"54",X"54",X"45", + X"4C",X"54",X"4E",X"49",X"52",X"50",X"40",X"4F",X"54",X"45",X"4E",X"44",X"4D",X"41",X"4C",X"53", + X"45",X"43",X"4E",X"41",X"56",X"44",X"41",X"40",X"45",X"52",X"4F",X"43",X"53",X"40",X"53",X"4E", + X"41",X"4B",X"52",X"4F",X"47",X"45",X"52",X"4F",X"43",X"53",X"40",X"40",X"53",X"4E",X"4F",X"49", + X"54",X"43",X"45",X"53",X"52",X"45",X"54",X"4E",X"49",X"52",X"45",X"42",X"4D",X"55",X"4E",X"40", + X"45",X"53",X"41",X"42",X"40",X"58",X"40",X"53",X"54",X"4E",X"49",X"4F",X"50",X"40",X"30",X"31", + X"40",X"53",X"45",X"52",X"4F",X"43",X"40",X"52",X"41",X"45",X"4C",X"43",X"55",X"4E",X"40",X"4E", + X"41",X"4B",X"52",X"4F",X"47",X"40",X"64",X"64",X"64",X"64",X"40",X"40",X"40",X"45",X"52",X"4F", + X"43",X"53",X"40",X"59",X"41",X"4C",X"50",X"40",X"31",X"40",X"53",X"4E",X"49",X"4F",X"43",X"40", + X"32",X"53",X"59",X"41",X"4C",X"50",X"40",X"32",X"40",X"40",X"4E",X"49",X"4F",X"43",X"40",X"31", + X"40",X"59",X"41",X"4C",X"50",X"40",X"31",X"40",X"40",X"4E",X"49",X"4F",X"43",X"40",X"31",X"53", + X"54",X"4E",X"49",X"4F",X"50",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"59",X"52",X"45", + X"56",X"45",X"40",X"53",X"55",X"4E",X"4F",X"42",X"30",X"30",X"30",X"30",X"35",X"31",X"30",X"30", + X"30",X"35",X"32",X"31",X"30",X"30",X"30",X"30",X"30",X"31",X"40",X"30",X"30",X"30",X"35",X"37", + X"53",X"43",X"49",X"54",X"53",X"4F",X"4E",X"47",X"41",X"49",X"44",X"4E",X"4F",X"49",X"54",X"49", + X"44",X"4E",X"4F",X"43",X"40",X"40",X"4E",X"4F",X"49",X"54",X"41",X"43",X"4F",X"4C",X"40",X"40", + X"4D",X"4F",X"52",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"44",X"37", + X"40",X"40",X"40",X"40",X"40",X"40",X"31",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"46",X"37",X"40",X"40",X"40",X"40",X"40",X"40",X"32",X"44",X"4F",X"4F",X"47",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"48",X"37",X"40",X"40",X"40",X"40",X"40",X"40",X"33",X"44", + X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4A",X"37",X"40",X"40",X"40",X"40", + X"40",X"40",X"34",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"48",X"34", + X"40",X"40",X"40",X"40",X"40",X"40",X"31",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"4C",X"34",X"40",X"40",X"40",X"40",X"40",X"40",X"32",X"44",X"4F",X"4F",X"47",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"4A",X"34",X"40",X"40",X"40",X"40",X"40",X"40",X"33",X"44", + X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4D",X"34",X"40",X"40",X"40",X"40", + X"40",X"40",X"34",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4B",X"34", + X"40",X"40",X"40",X"40",X"40",X"40",X"35",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"4E",X"34",X"40",X"40",X"40",X"40",X"40",X"40",X"36",X"44",X"41",X"42",X"40",X"4E", + X"4F",X"49",X"54",X"49",X"44",X"4E",X"4F",X"43",X"40",X"40",X"4E",X"4F",X"49",X"54",X"41",X"43", + X"4F",X"4C",X"40",X"40",X"4D",X"41",X"52",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08", + X"09",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F", + X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59",X"5A",X"5A",X"59",X"58",X"57",X"56", + X"55",X"54",X"53",X"52",X"51",X"50",X"4F",X"4E",X"4D",X"4C",X"4B",X"4A",X"49",X"48",X"47",X"46", + X"45",X"44",X"43",X"42",X"41",X"00",X"01",X"04",X"02",X"94",X"42",X"95",X"42",X"96",X"42",X"97", + X"42",X"98",X"42",X"99",X"42",X"9A",X"42",X"9B",X"42",X"9C",X"42",X"9D",X"42",X"03",X"02",X"01", + X"00",X"00",X"80",X"60",X"40",X"21",X"DD",X"4D",X"CB",X"46",X"C2",X"5B",X"1C",X"CB",X"C6",X"11", + X"CE",X"44",X"21",X"9B",X"4E",X"3E",X"05",X"06",X"14",X"CD",X"F5",X"15",X"06",X"14",X"21",X"37", + X"4E",X"11",X"CE",X"40",X"C5",X"01",X"05",X"00",X"ED",X"B0",X"3E",X"1B",X"CD",X"BF",X"15",X"C1", + X"10",X"F2",X"2A",X"9D",X"4E",X"23",X"7E",X"2B",X"FE",X"00",X"20",X"1F",X"2A",X"2F",X"4E",X"06", + X"10",X"3A",X"34",X"4E",X"5E",X"23",X"56",X"12",X"CD",X"10",X"1C",X"23",X"10",X"F3",X"18",X"41", + X"E5",X"21",X"00",X"04",X"19",X"3A",X"E2",X"4E",X"77",X"E1",X"C9",X"06",X"10",X"5E",X"23",X"56", + X"7A",X"FE",X"00",X"28",X"11",X"3A",X"34",X"4E",X"12",X"CD",X"10",X"1C",X"3A",X"2A",X"4E",X"3C", + X"32",X"2A",X"4E",X"23",X"10",X"E7",X"3A",X"2A",X"4E",X"47",X"3E",X"10",X"90",X"32",X"29",X"4E", + X"AF",X"32",X"2A",X"4E",X"2A",X"9D",X"4E",X"E5",X"D1",X"13",X"01",X"1F",X"00",X"36",X"00",X"ED", + X"B0",X"3E",X"3C",X"CD",X"A5",X"15",X"21",X"71",X"4D",X"CB",X"C6",X"00",X"3E",X"04",X"32",X"15", + X"4E",X"3A",X"31",X"4E",X"32",X"16",X"4E",X"21",X"74",X"27",X"11",X"17",X"4E",X"01",X"04",X"00", + X"ED",X"B0",X"FD",X"21",X"89",X"4C",X"FD",X"7E",X"07",X"E6",X"E0",X"47",X"3A",X"F8",X"4C",X"E6", + X"1F",X"B0",X"FD",X"77",X"07",X"2A",X"11",X"4E",X"22",X"0F",X"4E",X"21",X"F8",X"4D",X"CD",X"A7", + X"1F",X"3A",X"E4",X"4E",X"FD",X"BE",X"05",X"28",X"12",X"3A",X"90",X"4C",X"CB",X"77",X"28",X"0B", + X"21",X"A7",X"4D",X"CB",X"C6",X"FD",X"7E",X"05",X"32",X"E4",X"4E",X"21",X"00",X"00",X"22",X"0F", + X"4E",X"3A",X"13",X"4E",X"32",X"15",X"4E",X"3A",X"14",X"4E",X"32",X"16",X"4E",X"21",X"78",X"27", + X"11",X"17",X"4E",X"01",X"04",X"00",X"ED",X"B0",X"3A",X"1B",X"4E",X"FE",X"B5",X"28",X"25",X"FE", + X"3C",X"28",X"0A",X"FE",X"78",X"28",X"0D",X"FE",X"B4",X"28",X"10",X"18",X"13",X"21",X"70",X"4C", + X"CB",X"F6",X"18",X"0C",X"21",X"78",X"4C",X"CB",X"F6",X"18",X"05",X"21",X"80",X"4C",X"CB",X"F6", + X"3C",X"32",X"1B",X"4E",X"00",X"DD",X"21",X"89",X"4C",X"FD",X"21",X"61",X"4C",X"CD",X"CD",X"27", + X"CD",X"7B",X"28",X"DD",X"21",X"89",X"4C",X"21",X"FB",X"4D",X"CD",X"A7",X"1F",X"DD",X"21",X"89", + X"4C",X"FD",X"21",X"69",X"4C",X"CD",X"CD",X"27",X"CD",X"AB",X"28",X"DD",X"21",X"89",X"4C",X"21", + X"FE",X"4D",X"CD",X"A7",X"1F",X"DD",X"21",X"89",X"4C",X"FD",X"21",X"71",X"4C",X"CD",X"CD",X"27", + X"CD",X"CD",X"28",X"DD",X"21",X"89",X"4C",X"21",X"01",X"4E",X"CD",X"A7",X"1F",X"DD",X"21",X"89", + X"4C",X"FD",X"21",X"79",X"4C",X"CD",X"CD",X"27",X"21",X"04",X"4E",X"CD",X"A7",X"1F",X"3A",X"33", + X"4E",X"3C",X"32",X"33",X"4E",X"FE",X"04",X"20",X"2C",X"AF",X"32",X"33",X"4E",X"3A",X"32",X"4E", + X"FE",X"02",X"28",X"1E",X"3C",X"32",X"32",X"4E",X"47",X"3A",X"34",X"4E",X"80",X"4F",X"2A",X"2F", + X"4E",X"06",X"10",X"5E",X"23",X"56",X"23",X"1A",X"FE",X"66",X"38",X"02",X"79",X"12",X"10",X"F3", + X"18",X"03",X"AF",X"18",X"E0",X"00",X"3A",X"84",X"4C",X"FE",X"00",X"28",X"51",X"3A",X"2B",X"4E", + X"3C",X"32",X"2B",X"4E",X"FE",X"03",X"C2",X"DE",X"1D",X"AF",X"32",X"2B",X"4E",X"3A",X"2C",X"4E", + X"3C",X"32",X"2C",X"4E",X"FE",X"07",X"30",X"19",X"3A",X"84",X"4C",X"FE",X"01",X"28",X"0A",X"32", + X"2E",X"4E",X"3E",X"01",X"32",X"84",X"4C",X"18",X"25",X"3A",X"2E",X"4E",X"32",X"84",X"4C",X"18", + X"1D",X"FE",X"14",X"28",X"0D",X"3A",X"2D",X"4E",X"32",X"86",X"4C",X"3E",X"07",X"32",X"87",X"4C", + X"18",X"0C",X"AF",X"32",X"2C",X"4E",X"32",X"84",X"4C",X"3E",X"09",X"32",X"87",X"4C",X"3A",X"26", + X"4E",X"FE",X"04",X"20",X"22",X"AF",X"32",X"26",X"4E",X"3A",X"30",X"40",X"47",X"3A",X"2F",X"40", + X"4F",X"3A",X"27",X"4E",X"32",X"30",X"40",X"3A",X"28",X"4E",X"32",X"2F",X"40",X"78",X"32",X"27", + X"4E",X"79",X"32",X"28",X"4E",X"18",X"04",X"3C",X"32",X"26",X"4E",X"3A",X"29",X"4E",X"FE",X"FF", + X"CA",X"79",X"1E",X"FE",X"10",X"C2",X"9E",X"1E",X"21",X"A7",X"4D",X"CB",X"CE",X"21",X"8C",X"4D", + X"CB",X"C6",X"3E",X"5A",X"CD",X"A5",X"15",X"CD",X"14",X"16",X"11",X"4E",X"40",X"21",X"4E",X"1F", + X"3E",X"05",X"06",X"1C",X"CD",X"F5",X"15",X"11",X"4E",X"44",X"21",X"A6",X"1F",X"3E",X"05",X"06", + X"1C",X"CD",X"F5",X"15",X"11",X"2F",X"41",X"21",X"6A",X"1F",X"3E",X"01",X"06",X"0F",X"CD",X"DF", + X"15",X"11",X"71",X"40",X"21",X"4F",X"1F",X"3E",X"01",X"06",X"1B",X"CD",X"DF",X"15",X"3E",X"B4", + X"CD",X"A5",X"15",X"AF",X"32",X"62",X"4C",X"32",X"6A",X"4C",X"32",X"72",X"4C",X"32",X"7A",X"4C", + X"32",X"82",X"4C",X"32",X"8A",X"4C",X"C3",X"3A",X"1F",X"AF",X"32",X"62",X"4C",X"32",X"6A",X"4C", + X"32",X"72",X"4C",X"32",X"7A",X"4C",X"32",X"82",X"4C",X"32",X"8A",X"4C",X"21",X"71",X"4D",X"CB", + X"CE",X"21",X"A7",X"4D",X"CB",X"CE",X"21",X"3B",X"4D",X"CB",X"CE",X"C3",X"33",X"1F",X"3A",X"90", + X"4C",X"CB",X"6F",X"C2",X"4D",X"1F",X"CB",X"77",X"20",X"10",X"21",X"96",X"4C",X"CB",X"CE",X"3E", + X"40",X"32",X"2F",X"40",X"32",X"30",X"40",X"C3",X"4D",X"1F",X"3A",X"68",X"4C",X"47",X"3A",X"70", + X"4C",X"B0",X"47",X"3A",X"78",X"4C",X"B0",X"47",X"3A",X"80",X"4C",X"B0",X"47",X"3A",X"88",X"4C", + X"B0",X"CB",X"77",X"C2",X"4D",X"1F",X"47",X"AF",X"32",X"8A",X"4C",X"21",X"71",X"4D",X"CB",X"CE", + X"21",X"A7",X"4D",X"CB",X"CE",X"CB",X"68",X"20",X"64",X"21",X"00",X"00",X"22",X"E0",X"4E",X"3E", + X"5A",X"CD",X"A5",X"15",X"3A",X"34",X"4E",X"47",X"3A",X"32",X"4E",X"80",X"32",X"9F",X"4E",X"01", + X"80",X"03",X"21",X"40",X"40",X"3A",X"9F",X"4E",X"ED",X"B1",X"78",X"B1",X"28",X"21",X"2B",X"36", + X"0A",X"C5",X"E5",X"11",X"00",X"04",X"19",X"3A",X"40",X"44",X"77",X"11",X"00",X"10",X"CD",X"5B", + X"0F",X"21",X"8C",X"4D",X"CB",X"C6",X"3E",X"0F",X"CD",X"A5",X"15",X"E1",X"C1",X"18",X"D6",X"AF", + X"32",X"84",X"4C",X"3A",X"84",X"4C",X"FE",X"00",X"20",X"13",X"21",X"96",X"4C",X"CB",X"DE",X"CB", + X"CE",X"AF",X"32",X"1B",X"4E",X"3E",X"40",X"32",X"2F",X"40",X"32",X"30",X"40",X"C9",X"40",X"44", + X"45",X"59",X"4F",X"52",X"54",X"53",X"45",X"44",X"40",X"45",X"52",X"4F",X"43",X"40",X"52",X"41", + X"45",X"4C",X"43",X"55",X"4E",X"40",X"54",X"53",X"41",X"4C",X"53",X"4E",X"4F",X"49",X"54",X"41", + X"4C",X"55",X"54",X"41",X"52",X"47",X"4E",X"4F",X"43",X"45",X"48",X"54",X"40",X"48",X"54",X"49", + X"57",X"40",X"44",X"45",X"44",X"49",X"4C",X"4C",X"4F",X"43",X"40",X"55",X"4F",X"59",X"4C",X"4C", + X"41",X"57",X"40",X"54",X"4E",X"45",X"4D",X"4E",X"49",X"41",X"54",X"4E",X"4F",X"43",X"40",X"52", + X"41",X"45",X"4C",X"43",X"55",X"4E",X"09",X"DD",X"2A",X"F6",X"4D",X"FD",X"CB",X"07",X"6E",X"C2", + X"06",X"24",X"FD",X"CB",X"07",X"76",X"C8",X"7E",X"CB",X"BF",X"CB",X"B7",X"FE",X"03",X"CA",X"7B", + X"23",X"3C",X"47",X"7E",X"E6",X"C0",X"B0",X"77",X"3E",X"F3",X"FD",X"46",X"03",X"90",X"32",X"5D", + X"4C",X"FD",X"7E",X"04",X"D6",X"0C",X"32",X"5C",X"4C",X"E5",X"CD",X"B2",X"0E",X"E1",X"3A",X"0A", + X"4C",X"FE",X"00",X"C2",X"5C",X"23",X"3A",X"0B",X"4C",X"FE",X"00",X"C2",X"5C",X"23",X"CB",X"76", + X"C2",X"54",X"23",X"CB",X"F6",X"1A",X"32",X"0A",X"4E",X"D5",X"1B",X"1A",X"32",X"0B",X"4E",X"13", + X"13",X"1A",X"32",X"0C",X"4E",X"3E",X"21",X"CD",X"D3",X"15",X"1A",X"32",X"0D",X"4E",X"3E",X"40", + X"CD",X"BF",X"15",X"1A",X"32",X"0E",X"4E",X"D1",X"CB",X"7E",X"C2",X"F3",X"20",X"3A",X"9C",X"4E", + X"FE",X"00",X"CA",X"F3",X"20",X"FE",X"01",X"28",X"02",X"18",X"56",X"3A",X"90",X"4C",X"CB",X"47", + X"28",X"07",X"CB",X"5F",X"28",X"27",X"CB",X"B6",X"C9",X"FD",X"46",X"00",X"FD",X"36",X"00",X"02", + X"3A",X"18",X"4E",X"FD",X"77",X"05",X"AF",X"32",X"9C",X"4E",X"78",X"FE",X"04",X"28",X"07",X"DD", + X"7E",X"02",X"12",X"C3",X"BF",X"22",X"DD",X"7E",X"03",X"12",X"C3",X"BF",X"22",X"FD",X"46",X"00", + X"FD",X"36",X"00",X"03",X"3A",X"17",X"4E",X"FD",X"77",X"05",X"AF",X"32",X"9C",X"4E",X"78",X"FE", + X"04",X"28",X"07",X"DD",X"7E",X"04",X"12",X"C3",X"BF",X"22",X"DD",X"7E",X"05",X"12",X"C3",X"BF", + X"22",X"3A",X"90",X"4C",X"CB",X"4F",X"28",X"07",X"CB",X"57",X"28",X"27",X"CB",X"B6",X"C9",X"FD", + X"46",X"00",X"FD",X"36",X"00",X"05",X"3A",X"19",X"4E",X"FD",X"77",X"05",X"AF",X"32",X"9C",X"4E", + X"78",X"FE",X"02",X"28",X"07",X"DD",X"7E",X"03",X"12",X"C3",X"95",X"21",X"DD",X"7E",X"05",X"12", + X"C3",X"95",X"21",X"FD",X"46",X"00",X"FD",X"36",X"00",X"04",X"3A",X"1A",X"4E",X"FD",X"77",X"05", + X"AF",X"32",X"9C",X"4E",X"78",X"FE",X"02",X"28",X"07",X"DD",X"7E",X"02",X"12",X"C3",X"95",X"21", + X"DD",X"7E",X"04",X"12",X"C3",X"95",X"21",X"AF",X"32",X"9C",X"4E",X"C3",X"BF",X"22",X"AF",X"32", + X"9C",X"4E",X"C3",X"BF",X"22",X"AF",X"32",X"9C",X"4E",X"C3",X"95",X"21",X"AF",X"32",X"9C",X"4E", + X"C3",X"95",X"21",X"FD",X"7E",X"00",X"FE",X"02",X"CA",X"2A",X"22",X"FE",X"03",X"CA",X"2A",X"22", + X"FD",X"CB",X"07",X"46",X"20",X"2F",X"3A",X"0A",X"4E",X"DD",X"BE",X"01",X"CA",X"17",X"21",X"FE", + X"66",X"DA",X"A6",X"21",X"CD",X"45",X"29",X"CD",X"BA",X"29",X"FD",X"7E",X"00",X"FE",X"05",X"28", + X"0A",X"DD",X"7E",X"03",X"32",X"0A",X"4E",X"12",X"C3",X"05",X"22",X"DD",X"7E",X"02",X"32",X"0A", + X"4E",X"12",X"C3",X"05",X"22",X"FD",X"CB",X"07",X"5E",X"CA",X"5A",X"21",X"3A",X"0A",X"4E",X"DD", + X"BE",X"01",X"CA",X"4D",X"21",X"FE",X"66",X"DA",X"A6",X"21",X"CD",X"45",X"29",X"CD",X"BA",X"29", + X"DD",X"7E",X"07",X"32",X"0A",X"4E",X"12",X"C3",X"D7",X"21",X"3A",X"0A",X"4E",X"DD",X"BE",X"01", + X"28",X"08",X"FE",X"66",X"DA",X"A6",X"21",X"CD",X"45",X"29",X"CD",X"BA",X"29",X"FD",X"7E",X"00", + X"FE",X"05",X"28",X"29",X"DD",X"7E",X"05",X"32",X"0A",X"4E",X"12",X"3A",X"17",X"4E",X"FD",X"77", + X"05",X"FD",X"36",X"00",X"03",X"3A",X"0C",X"4E",X"DD",X"BE",X"00",X"CA",X"AF",X"25",X"C3",X"FC", + X"25",X"FD",X"CB",X"07",X"FE",X"FD",X"22",X"91",X"4C",X"CD",X"CE",X"0C",X"C9",X"DD",X"7E",X"04", + X"32",X"0A",X"4E",X"12",X"18",X"D5",X"FD",X"7E",X"00",X"FE",X"05",X"28",X"11",X"3A",X"0A",X"4E", + X"DD",X"BE",X"02",X"20",X"13",X"DD",X"7E",X"08",X"32",X"0A",X"4E",X"12",X"18",X"BD",X"3A",X"0A", + X"4E",X"DD",X"BE",X"03",X"20",X"02",X"18",X"ED",X"3A",X"0A",X"4E",X"DD",X"BE",X"06",X"20",X"1F", + X"DD",X"7E",X"08",X"32",X"0A",X"4E",X"12",X"FD",X"7E",X"00",X"FE",X"05",X"28",X"0C",X"3A",X"0D", + X"4E",X"DD",X"BE",X"00",X"CA",X"99",X"25",X"C3",X"95",X"21",X"3A",X"0E",X"4E",X"18",X"F2",X"FD", + X"7E",X"00",X"FE",X"05",X"28",X"25",X"3A",X"0A",X"4E",X"DD",X"BE",X"04",X"20",X"27",X"DD",X"7E", + X"08",X"32",X"0A",X"4E",X"12",X"3A",X"18",X"4E",X"FD",X"77",X"05",X"FD",X"36",X"00",X"02",X"3A", + X"0B",X"4E",X"DD",X"BE",X"00",X"CA",X"69",X"25",X"C3",X"DF",X"25",X"3A",X"0A",X"4E",X"DD",X"BE", + X"05",X"20",X"02",X"18",X"D9",X"FD",X"CB",X"07",X"EE",X"C9",X"FD",X"CB",X"07",X"56",X"20",X"2F", + X"3A",X"0A",X"4E",X"DD",X"BE",X"01",X"CA",X"41",X"22",X"FE",X"66",X"DA",X"D0",X"22",X"CD",X"45", + X"29",X"CD",X"BA",X"29",X"FD",X"7E",X"00",X"FE",X"03",X"28",X"0A",X"DD",X"7E",X"04",X"32",X"0A", + X"4E",X"12",X"C3",X"2F",X"23",X"DD",X"7E",X"02",X"32",X"0A",X"4E",X"12",X"C3",X"2F",X"23",X"FD", + X"CB",X"07",X"4E",X"CA",X"84",X"22",X"3A",X"0A",X"4E",X"DD",X"BE",X"01",X"CA",X"77",X"22",X"FE", + X"66",X"DA",X"D0",X"22",X"CD",X"45",X"29",X"CD",X"BA",X"29",X"DD",X"7E",X"06",X"32",X"0A",X"4E", + X"12",X"C3",X"01",X"23",X"3A",X"0A",X"4E",X"DD",X"BE",X"01",X"28",X"08",X"FE",X"66",X"DA",X"D0", + X"22",X"CD",X"45",X"29",X"CD",X"BA",X"29",X"FD",X"7E",X"00",X"FE",X"03",X"28",X"29",X"DD",X"7E", + X"05",X"32",X"0A",X"4E",X"12",X"3A",X"19",X"4E",X"FD",X"77",X"05",X"FD",X"36",X"00",X"05",X"3A", + X"0E",X"4E",X"DD",X"BE",X"00",X"CA",X"5F",X"26",X"C3",X"AC",X"26",X"FD",X"CB",X"07",X"FE",X"FD", + X"22",X"91",X"4C",X"CD",X"CE",X"0C",X"C9",X"DD",X"7E",X"03",X"32",X"0A",X"4E",X"12",X"18",X"D5", + X"FD",X"7E",X"00",X"FE",X"03",X"28",X"11",X"3A",X"0A",X"4E",X"DD",X"BE",X"02",X"20",X"13",X"DD", + X"7E",X"08",X"32",X"0A",X"4E",X"12",X"18",X"BD",X"3A",X"0A",X"4E",X"DD",X"BE",X"04",X"20",X"02", + X"18",X"ED",X"3A",X"0A",X"4E",X"DD",X"BE",X"07",X"20",X"1F",X"DD",X"7E",X"08",X"32",X"0A",X"4E", + X"12",X"FD",X"7E",X"00",X"FE",X"03",X"28",X"0C",X"3A",X"0B",X"4E",X"DD",X"BE",X"00",X"CA",X"49", + X"26",X"C3",X"BF",X"22",X"3A",X"0C",X"4E",X"18",X"F2",X"FD",X"7E",X"00",X"FE",X"03",X"28",X"25", + X"3A",X"0A",X"4E",X"DD",X"BE",X"03",X"20",X"27",X"DD",X"7E",X"08",X"32",X"0A",X"4E",X"12",X"3A", + X"1A",X"4E",X"FD",X"77",X"05",X"FD",X"36",X"00",X"04",X"3A",X"0D",X"4E",X"DD",X"BE",X"00",X"CA", + X"19",X"26",X"C3",X"8F",X"26",X"3A",X"0A",X"4E",X"DD",X"BE",X"05",X"20",X"02",X"18",X"D9",X"FD", + X"CB",X"07",X"EE",X"C9",X"FD",X"22",X"91",X"4C",X"CD",X"CE",X"0C",X"C9",X"CB",X"B6",X"CB",X"7E", + X"20",X"F2",X"3A",X"9C",X"4E",X"FE",X"00",X"28",X"EB",X"FE",X"03",X"CA",X"D7",X"20",X"FE",X"04", + X"CA",X"DE",X"20",X"FE",X"05",X"CA",X"E5",X"20",X"C3",X"EC",X"20",X"3E",X"C0",X"A6",X"77",X"CB", + X"7F",X"20",X"2A",X"FD",X"7E",X"01",X"FE",X"00",X"C8",X"FD",X"CB",X"07",X"66",X"C2",X"C4",X"23", + X"FD",X"7E",X"01",X"06",X"02",X"B8",X"CA",X"C8",X"1F",X"D6",X"02",X"FE",X"04",X"38",X"06",X"FD", + X"77",X"01",X"C3",X"C8",X"1F",X"3E",X"02",X"FD",X"77",X"01",X"C3",X"C8",X"1F",X"FD",X"CB",X"07", + X"7E",X"20",X"32",X"3A",X"16",X"4E",X"FD",X"46",X"01",X"B8",X"CA",X"C8",X"1F",X"04",X"FD",X"70", + X"01",X"C3",X"C8",X"1F",X"3A",X"31",X"4E",X"FD",X"46",X"01",X"B8",X"CA",X"C8",X"1F",X"90",X"FE", + X"02",X"38",X"09",X"78",X"C6",X"02",X"FD",X"77",X"01",X"C3",X"C8",X"1F",X"3A",X"31",X"4E",X"FD", + X"77",X"01",X"C3",X"C8",X"1F",X"FD",X"CB",X"07",X"BE",X"FD",X"7E",X"01",X"FE",X"00",X"28",X"C3", + X"3A",X"15",X"4E",X"FD",X"77",X"01",X"3A",X"8C",X"4D",X"FE",X"00",X"20",X"B6",X"E5",X"21",X"71", + X"4D",X"CB",X"C6",X"E1",X"18",X"AD",X"23",X"7E",X"FE",X"02",X"20",X"1D",X"36",X"00",X"23",X"7E", + X"FE",X"00",X"28",X"17",X"FE",X"28",X"CA",X"69",X"27",X"34",X"21",X"7C",X"27",X"CD",X"BA",X"15", + X"7E",X"FD",X"77",X"05",X"FD",X"36",X"06",X"01",X"C9",X"34",X"C9",X"34",X"2B",X"2B",X"FD",X"CB", + X"07",X"B6",X"CB",X"7E",X"28",X"35",X"3A",X"14",X"4E",X"FE",X"0D",X"D2",X"45",X"24",X"C6",X"04", + X"32",X"14",X"4E",X"18",X"05",X"3E",X"10",X"32",X"14",X"4E",X"3A",X"13",X"4E",X"FE",X"0D",X"30", + X"07",X"C6",X"04",X"32",X"13",X"4E",X"18",X"05",X"3E",X"10",X"32",X"13",X"4E",X"3A",X"20",X"4D", + X"FE",X"00",X"20",X"B6",X"21",X"3B",X"4D",X"CB",X"C6",X"18",X"AF",X"21",X"56",X"4D",X"CB",X"C6", + X"21",X"68",X"4C",X"CB",X"B6",X"21",X"70",X"4C",X"CB",X"B6",X"21",X"78",X"4C",X"CB",X"B6",X"21", + X"80",X"4C",X"CB",X"B6",X"21",X"88",X"4C",X"CB",X"B6",X"21",X"90",X"4C",X"CB",X"AE",X"CB",X"B6", + X"3E",X"B5",X"32",X"1B",X"4E",X"2A",X"9D",X"4E",X"E5",X"E5",X"D1",X"13",X"01",X"1F",X"00",X"36", + X"00",X"ED",X"B0",X"D1",X"3A",X"34",X"4E",X"47",X"3A",X"32",X"4E",X"80",X"32",X"9F",X"4E",X"01", + X"80",X"03",X"21",X"40",X"40",X"3A",X"9F",X"4E",X"ED",X"B1",X"78",X"B1",X"28",X"0A",X"2B",X"EB", + X"73",X"23",X"72",X"23",X"EB",X"23",X"18",X"ED",X"3E",X"07",X"32",X"8F",X"4C",X"AF",X"32",X"64", + X"4C",X"32",X"6C",X"4C",X"32",X"74",X"4C",X"32",X"7C",X"4C",X"32",X"84",X"4C",X"21",X"A4",X"27", + X"7E",X"FE",X"FF",X"28",X"0D",X"32",X"8E",X"4C",X"23",X"E5",X"3E",X"02",X"CD",X"A5",X"15",X"E1", + X"18",X"EE",X"AF",X"32",X"8C",X"4C",X"3A",X"E3",X"4E",X"CB",X"47",X"CA",X"39",X"25",X"AF",X"32", + X"E3",X"4E",X"11",X"4E",X"40",X"21",X"4E",X"1F",X"3E",X"05",X"06",X"1C",X"CD",X"F5",X"15",X"11", + X"4E",X"44",X"21",X"A6",X"1F",X"3E",X"05",X"06",X"1C",X"CD",X"F5",X"15",X"CD",X"14",X"16",X"11", + X"CF",X"40",X"21",X"79",X"1F",X"3E",X"01",X"06",X"15",X"CD",X"DF",X"15",X"11",X"91",X"40",X"21", + X"8E",X"1F",X"3E",X"01",X"06",X"18",X"CD",X"DF",X"15",X"3E",X"B4",X"CD",X"A5",X"15",X"21",X"90", + X"4C",X"CB",X"AE",X"C9",X"21",X"61",X"4C",X"22",X"91",X"4C",X"CD",X"CE",X"0C",X"21",X"69",X"4C", + X"22",X"91",X"4C",X"CD",X"CE",X"0C",X"21",X"71",X"4C",X"22",X"91",X"4C",X"CD",X"CE",X"0C",X"21", + X"79",X"4C",X"22",X"91",X"4C",X"CD",X"CE",X"0C",X"C9",X"CB",X"7E",X"C2",X"25",X"22",X"3A",X"0A", + X"4E",X"DD",X"BE",X"08",X"CA",X"FC",X"26",X"DD",X"BE",X"03",X"20",X"11",X"3A",X"1A",X"4E",X"FD", + X"77",X"05",X"FD",X"36",X"00",X"04",X"DD",X"7E",X"07",X"12",X"C3",X"95",X"21",X"3A",X"19",X"4E", + X"FD",X"77",X"05",X"FD",X"36",X"00",X"05",X"18",X"ED",X"CB",X"7E",X"C2",X"25",X"22",X"3A",X"0A", + X"4E",X"DD",X"BE",X"08",X"CA",X"FC",X"26",X"3E",X"01",X"32",X"9C",X"4E",X"CB",X"B6",X"C9",X"CB", + X"7E",X"C2",X"25",X"22",X"3A",X"0A",X"4E",X"DD",X"BE",X"08",X"CA",X"FC",X"26",X"DD",X"BE",X"05", + X"20",X"11",X"3A",X"1A",X"4E",X"FD",X"77",X"05",X"FD",X"36",X"00",X"04",X"DD",X"7E",X"07",X"12", + X"C3",X"95",X"21",X"3A",X"19",X"4E",X"FD",X"77",X"05",X"FD",X"36",X"00",X"05",X"18",X"ED",X"CB", + X"7E",X"C2",X"91",X"21",X"3A",X"0A",X"4E",X"DD",X"BE",X"08",X"C2",X"95",X"21",X"FD",X"CB",X"07", + X"46",X"CA",X"95",X"21",X"3E",X"03",X"32",X"9C",X"4E",X"C3",X"95",X"21",X"CB",X"7E",X"C2",X"91", + X"21",X"3A",X"0A",X"4E",X"DD",X"BE",X"08",X"C2",X"95",X"21",X"FD",X"CB",X"07",X"5E",X"CA",X"95", + X"21",X"3E",X"04",X"32",X"9C",X"4E",X"C3",X"95",X"21",X"CB",X"7E",X"C2",X"4F",X"23",X"3A",X"0A", + X"4E",X"DD",X"BE",X"08",X"CA",X"FC",X"26",X"DD",X"BE",X"04",X"20",X"11",X"3A",X"18",X"4E",X"FD", + X"77",X"05",X"FD",X"36",X"00",X"02",X"DD",X"7E",X"06",X"12",X"C3",X"BF",X"22",X"3A",X"17",X"4E", + X"FD",X"77",X"05",X"FD",X"36",X"00",X"03",X"18",X"ED",X"CB",X"7E",X"C2",X"4F",X"23",X"3A",X"0A", + X"4E",X"DD",X"BE",X"08",X"CA",X"FC",X"26",X"3E",X"02",X"32",X"9C",X"4E",X"CB",X"B6",X"C9",X"CB", + X"7E",X"C2",X"4F",X"23",X"3A",X"0A",X"4E",X"DD",X"BE",X"08",X"CA",X"FC",X"26",X"DD",X"BE",X"05", + X"20",X"11",X"3A",X"18",X"4E",X"FD",X"77",X"05",X"FD",X"36",X"00",X"02",X"DD",X"7E",X"06",X"12", + X"C3",X"BF",X"22",X"3A",X"17",X"4E",X"FD",X"77",X"05",X"FD",X"36",X"00",X"03",X"18",X"ED",X"CB", + X"7E",X"C2",X"BB",X"22",X"3A",X"0A",X"4E",X"DD",X"BE",X"08",X"C2",X"BF",X"22",X"FD",X"CB",X"07", + X"56",X"CA",X"BF",X"22",X"3E",X"05",X"32",X"9C",X"4E",X"C3",X"BF",X"22",X"CB",X"7E",X"C2",X"BB", + X"22",X"3A",X"0A",X"4E",X"DD",X"BE",X"08",X"C2",X"BF",X"22",X"FD",X"CB",X"07",X"4E",X"CA",X"BF", + X"22",X"3E",X"06",X"32",X"9C",X"4E",X"C3",X"BF",X"22",X"FD",X"7E",X"07",X"47",X"FD",X"7E",X"00", + X"FE",X"02",X"28",X"10",X"FE",X"03",X"28",X"14",X"FE",X"05",X"28",X"18",X"CB",X"48",X"CA",X"90", + X"23",X"C3",X"B3",X"23",X"CB",X"58",X"CA",X"90",X"23",X"C3",X"B3",X"23",X"CB",X"40",X"CA",X"90", + X"23",X"C3",X"B3",X"23",X"CB",X"50",X"CA",X"90",X"23",X"C3",X"B3",X"23",X"FD",X"CB",X"07",X"EE", + X"CB",X"7E",X"C0",X"21",X"E3",X"4E",X"CB",X"C6",X"C9",X"05",X"20",X"00",X"E0",X"70",X"42",X"09", + X"00",X"05",X"20",X"00",X"F0",X"70",X"3E",X"09",X"00",X"05",X"20",X"00",X"DF",X"60",X"3A",X"09", + X"00",X"05",X"20",X"00",X"EF",X"60",X"36",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"20",X"00",X"02",X"70",X"2E",X"09", + X"00",X"04",X"20",X"00",X"12",X"70",X"2A",X"09",X"00",X"04",X"20",X"00",X"01",X"60",X"26",X"09", + X"00",X"04",X"20",X"00",X"11",X"60",X"22",X"09",X"00",X"04",X"20",X"00",X"FA",X"80",X"32",X"09", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"36",X"00",X"FD",X"CB",X"07",X"AE",X"FD", + X"36",X"03",X"00",X"C9",X"5D",X"5C",X"60",X"62",X"5D",X"5C",X"60",X"62",X"04",X"08",X"0C",X"09", + X"04",X"08",X"0C",X"09",X"10",X"14",X"18",X"15",X"10",X"14",X"18",X"15",X"1C",X"20",X"24",X"21", + X"1C",X"20",X"24",X"21",X"28",X"2C",X"30",X"2D",X"28",X"2C",X"30",X"2D",X"34",X"38",X"3C",X"39", + X"34",X"38",X"3C",X"39",X"04",X"08",X"0C",X"09",X"04",X"08",X"0C",X"09",X"10",X"14",X"18",X"15", + X"10",X"14",X"18",X"15",X"1C",X"20",X"24",X"21",X"1C",X"20",X"24",X"21",X"28",X"2C",X"30",X"2D", + X"28",X"2C",X"30",X"2D",X"34",X"38",X"3C",X"39",X"34",X"38",X"3C",X"39",X"FF",X"FD",X"CB",X"07", + X"76",X"C8",X"FD",X"7E",X"00",X"FE",X"04",X"DA",X"3E",X"28",X"DD",X"7E",X"03",X"FD",X"BE",X"03", + X"DA",X"2B",X"28",X"CA",X"3E",X"28",X"FD",X"7E",X"00",X"FE",X"05",X"CA",X"5D",X"28",X"FD",X"7E", + X"07",X"F6",X"1F",X"E6",X"FB",X"FD",X"77",X"07",X"DD",X"7E",X"03",X"FD",X"46",X"03",X"90",X"FE", + X"05",X"38",X"05",X"FE",X"FB",X"30",X"01",X"C9",X"DD",X"7E",X"04",X"FD",X"46",X"04",X"90",X"FE", + X"05",X"38",X"05",X"FE",X"FB",X"30",X"01",X"C9",X"DD",X"CB",X"07",X"EE",X"FD",X"CB",X"07",X"EE", + X"C9",X"FD",X"7E",X"03",X"DD",X"BE",X"03",X"38",X"C5",X"18",X"07",X"FD",X"7E",X"00",X"FE",X"04", + X"28",X"2B",X"FD",X"7E",X"07",X"F6",X"1F",X"E6",X"FD",X"FD",X"77",X"07",X"18",X"BA",X"DD",X"7E", + X"04",X"FD",X"BE",X"04",X"38",X"21",X"CA",X"DA",X"27",X"FD",X"7E",X"00",X"FE",X"02",X"28",X"D1", + X"FD",X"7E",X"07",X"F6",X"1F",X"E6",X"F7",X"FD",X"77",X"07",X"C3",X"F8",X"27",X"FD",X"7E",X"04", + X"DD",X"BE",X"04",X"38",X"EB",X"18",X"07",X"FD",X"7E",X"00",X"FE",X"03",X"28",X"B3",X"FD",X"7E", + X"07",X"F6",X"1F",X"E6",X"FE",X"FD",X"77",X"07",X"C3",X"F8",X"27",X"FD",X"7E",X"03",X"FE",X"00", + X"C8",X"DD",X"21",X"69",X"4C",X"DD",X"7E",X"03",X"FE",X"00",X"28",X"03",X"CD",X"E1",X"28",X"DD", + X"21",X"71",X"4C",X"DD",X"7E",X"03",X"FE",X"00",X"28",X"03",X"CD",X"E1",X"28",X"DD",X"21",X"79", + X"4C",X"DD",X"7E",X"03",X"FE",X"00",X"C8",X"CD",X"E1",X"28",X"C9",X"FD",X"7E",X"03",X"FE",X"00", + X"C8",X"DD",X"21",X"71",X"4C",X"DD",X"7E",X"03",X"FE",X"00",X"28",X"03",X"CD",X"E1",X"28",X"DD", + X"21",X"79",X"4C",X"DD",X"7E",X"03",X"FE",X"00",X"C8",X"CD",X"E1",X"28",X"C9",X"FD",X"7E",X"03", + X"FE",X"00",X"C8",X"DD",X"21",X"79",X"4C",X"DD",X"7E",X"03",X"FE",X"00",X"C8",X"CD",X"E1",X"28", + X"C9",X"DD",X"7E",X"00",X"FD",X"86",X"00",X"FE",X"05",X"28",X"05",X"FE",X"09",X"28",X"2A",X"C9", + X"DD",X"7E",X"04",X"FD",X"96",X"04",X"DD",X"7E",X"00",X"FA",X"14",X"29",X"FE",X"02",X"C0",X"DD", + X"7E",X"07",X"F6",X"0F",X"EE",X"04",X"DD",X"77",X"07",X"FD",X"7E",X"07",X"F6",X"0F",X"EE",X"02", + X"FD",X"77",X"07",X"C9",X"FE",X"03",X"C0",X"18",X"E6",X"DD",X"7E",X"03",X"FD",X"96",X"03",X"DD", + X"7E",X"00",X"FA",X"40",X"29",X"DD",X"7E",X"00",X"FE",X"05",X"C0",X"DD",X"7E",X"07",X"F6",X"0F", + X"EE",X"01",X"DD",X"77",X"07",X"FD",X"7E",X"07",X"F6",X"0F",X"EE",X"08",X"FD",X"77",X"07",X"C9", + X"FE",X"04",X"C0",X"18",X"E6",X"3A",X"29",X"4E",X"3C",X"32",X"29",X"4E",X"E5",X"21",X"00",X"04", + X"19",X"3A",X"40",X"44",X"77",X"E1",X"CB",X"7E",X"20",X"48",X"2A",X"93",X"4C",X"7E",X"21",X"AE", + X"29",X"CD",X"BA",X"15",X"7E",X"32",X"2D",X"4E",X"3E",X"40",X"32",X"86",X"4C",X"AF",X"32",X"2B", + X"4E",X"32",X"2C",X"4E",X"3A",X"8C",X"4C",X"32",X"84",X"4C",X"3A",X"8D",X"4C",X"32",X"85",X"4C", + X"D5",X"23",X"5E",X"23",X"56",X"2A",X"AE",X"4C",X"19",X"22",X"AE",X"4C",X"D1",X"21",X"8C",X"4D", + X"CB",X"C6",X"AF",X"32",X"2B",X"4E",X"3A",X"29",X"4E",X"FE",X"10",X"C0",X"3E",X"FF",X"32",X"29", + X"4E",X"C9",X"3A",X"29",X"4E",X"FE",X"10",X"C0",X"EB",X"22",X"E0",X"4E",X"EB",X"C9",X"44",X"00", + X"10",X"48",X"00",X"20",X"4C",X"00",X"40",X"50",X"00",X"80",X"D5",X"E5",X"2A",X"0F",X"4E",X"ED", + X"5B",X"AE",X"4C",X"19",X"22",X"AE",X"4C",X"E1",X"D1",X"C9",X"DD",X"21",X"16",X"32",X"DD",X"22", + X"F6",X"4D",X"21",X"84",X"33",X"3E",X"1A",X"CD",X"BD",X"2E",X"CD",X"D1",X"34",X"3E",X"0E",X"32", + X"E2",X"4E",X"3E",X"81",X"21",X"FD",X"2D",X"CD",X"EF",X"30",X"21",X"10",X"00",X"22",X"11",X"4E", + X"3E",X"04",X"32",X"13",X"4E",X"3E",X"08",X"32",X"14",X"4E",X"3E",X"10",X"32",X"31",X"4E",X"21", + X"F6",X"30",X"CD",X"28",X"2F",X"CD",X"31",X"2F",X"11",X"6F",X"41",X"21",X"D6",X"2F",X"3E",X"01", + X"06",X"0B",X"CD",X"DF",X"15",X"11",X"11",X"41",X"21",X"E1",X"2F",X"3E",X"01",X"06",X"11",X"CD", + X"DF",X"15",X"C9",X"DD",X"21",X"16",X"32",X"DD",X"22",X"F6",X"4D",X"21",X"84",X"33",X"3E",X"1A", + X"CD",X"BD",X"2E",X"CD",X"D1",X"34",X"3E",X"0E",X"32",X"E2",X"4E",X"3E",X"87",X"21",X"FD",X"2D", + X"CD",X"EF",X"30",X"21",X"20",X"00",X"22",X"11",X"4E",X"3E",X"05",X"32",X"13",X"4E",X"3E",X"0A", + X"32",X"14",X"4E",X"3E",X"10",X"32",X"31",X"4E",X"21",X"F6",X"30",X"CD",X"28",X"2F",X"CD",X"31", + X"2F",X"11",X"6F",X"41",X"21",X"D6",X"2F",X"3E",X"01",X"06",X"0B",X"CD",X"DF",X"15",X"11",X"11", + X"41",X"21",X"F2",X"2F",X"3E",X"01",X"06",X"10",X"CD",X"DF",X"15",X"C9",X"DD",X"21",X"1F",X"32", + X"DD",X"22",X"F6",X"4D",X"21",X"7A",X"32",X"3E",X"19",X"CD",X"BD",X"2E",X"CD",X"2A",X"35",X"3E", + X"0E",X"32",X"E2",X"4E",X"3E",X"75",X"21",X"1D",X"2E",X"CD",X"EF",X"30",X"21",X"30",X"00",X"22", + X"11",X"4E",X"3E",X"07",X"32",X"13",X"4E",X"3E",X"0C",X"32",X"14",X"4E",X"3E",X"0F",X"32",X"31", + X"4E",X"21",X"26",X"31",X"CD",X"28",X"2F",X"CD",X"31",X"2F",X"11",X"6F",X"41",X"21",X"02",X"30", + X"3E",X"01",X"06",X"0B",X"CD",X"DF",X"15",X"11",X"31",X"41",X"21",X"0D",X"30",X"3E",X"01",X"06", + X"0F",X"CD",X"DF",X"15",X"C9",X"DD",X"21",X"1F",X"32",X"DD",X"22",X"F6",X"4D",X"21",X"7A",X"32", + X"3E",X"19",X"CD",X"BD",X"2E",X"CD",X"2A",X"35",X"3E",X"0E",X"32",X"E2",X"4E",X"3E",X"78",X"21", + X"1D",X"2E",X"CD",X"EF",X"30",X"21",X"40",X"00",X"22",X"11",X"4E",X"3E",X"09",X"32",X"13",X"4E", + X"3E",X"0D",X"32",X"14",X"4E",X"3E",X"0F",X"32",X"31",X"4E",X"21",X"26",X"31",X"CD",X"28",X"2F", + X"CD",X"31",X"2F",X"11",X"6F",X"41",X"21",X"02",X"30",X"3E",X"01",X"06",X"0B",X"CD",X"DF",X"15", + X"11",X"31",X"41",X"21",X"1C",X"30",X"3E",X"01",X"06",X"0E",X"CD",X"DF",X"15",X"C9",X"DD",X"21", + X"1F",X"32",X"DD",X"22",X"F6",X"4D",X"21",X"11",X"33",X"3E",X"1A",X"CD",X"BD",X"2E",X"CD",X"53", + X"35",X"3E",X"10",X"32",X"E2",X"4E",X"3E",X"72",X"21",X"3D",X"2E",X"CD",X"EF",X"30",X"21",X"50", + X"00",X"22",X"11",X"4E",X"3E",X"0A",X"32",X"13",X"4E",X"3E",X"0E",X"32",X"14",X"4E",X"3E",X"0F", + X"32",X"31",X"4E",X"21",X"56",X"31",X"CD",X"28",X"2F",X"CD",X"31",X"2F",X"11",X"8F",X"41",X"21", + X"2A",X"30",X"3E",X"01",X"06",X"09",X"CD",X"DF",X"15",X"11",X"F1",X"40",X"21",X"33",X"30",X"3E", + X"01",X"06",X"12",X"CD",X"DF",X"15",X"C9",X"DD",X"21",X"1F",X"32",X"DD",X"22",X"F6",X"4D",X"21", + X"11",X"33",X"3E",X"1A",X"CD",X"BD",X"2E",X"CD",X"53",X"35",X"3E",X"10",X"32",X"E2",X"4E",X"3E", + X"6F",X"21",X"3D",X"2E",X"CD",X"EF",X"30",X"21",X"60",X"00",X"22",X"11",X"4E",X"3E",X"0B",X"32", + X"13",X"4E",X"3E",X"0E",X"32",X"14",X"4E",X"3E",X"0F",X"32",X"31",X"4E",X"21",X"56",X"31",X"CD", + X"28",X"2F",X"CD",X"31",X"2F",X"11",X"8F",X"41",X"21",X"2A",X"30",X"3E",X"01",X"06",X"09",X"CD", + X"DF",X"15",X"11",X"11",X"41",X"21",X"45",X"30",X"3E",X"01",X"06",X"11",X"CD",X"DF",X"15",X"C9", + X"DD",X"21",X"1F",X"32",X"DD",X"22",X"F6",X"4D",X"21",X"AF",X"34",X"3E",X"1A",X"CD",X"BD",X"2E", + X"3E",X"0E",X"32",X"E2",X"4E",X"3E",X"84",X"21",X"5D",X"2E",X"CD",X"EF",X"30",X"21",X"70",X"00", + X"22",X"11",X"4E",X"3E",X"0C",X"32",X"13",X"4E",X"3E",X"0F",X"32",X"14",X"4E",X"3E",X"0F",X"32", + X"31",X"4E",X"21",X"86",X"31",X"CD",X"28",X"2F",X"CD",X"31",X"2F",X"11",X"4F",X"41",X"21",X"56", + X"30",X"3E",X"01",X"06",X"0C",X"CD",X"DF",X"15",X"11",X"11",X"41",X"21",X"62",X"30",X"3E",X"01", + X"06",X"10",X"CD",X"DF",X"15",X"C9",X"DD",X"21",X"1F",X"32",X"DD",X"22",X"F6",X"4D",X"21",X"AF", + X"34",X"3E",X"1A",X"CD",X"BD",X"2E",X"3E",X"0E",X"32",X"E2",X"4E",X"3E",X"6C",X"21",X"5D",X"2E", + X"CD",X"EF",X"30",X"21",X"80",X"00",X"22",X"11",X"4E",X"3E",X"0D",X"32",X"13",X"4E",X"3E",X"10", + X"32",X"14",X"4E",X"3E",X"0F",X"32",X"31",X"4E",X"21",X"86",X"31",X"CD",X"28",X"2F",X"CD",X"31", + X"2F",X"11",X"4F",X"41",X"21",X"56",X"30",X"3E",X"01",X"06",X"0C",X"CD",X"DF",X"15",X"11",X"31", + X"41",X"21",X"72",X"30",X"3E",X"01",X"06",X"0F",X"CD",X"DF",X"15",X"C9",X"DD",X"21",X"1F",X"32", + X"DD",X"22",X"F6",X"4D",X"21",X"51",X"34",X"3E",X"19",X"CD",X"BD",X"2E",X"CD",X"A0",X"35",X"3E", + X"10",X"32",X"E2",X"4E",X"3E",X"75",X"21",X"7D",X"2E",X"CD",X"EF",X"30",X"21",X"90",X"00",X"22", + X"11",X"4E",X"3E",X"0E",X"32",X"13",X"4E",X"3E",X"10",X"32",X"14",X"4E",X"3E",X"0E",X"32",X"31", + X"4E",X"21",X"B6",X"31",X"CD",X"28",X"2F",X"CD",X"31",X"2F",X"11",X"6F",X"41",X"21",X"81",X"30", + X"3E",X"01",X"06",X"0A",X"CD",X"DF",X"15",X"11",X"11",X"41",X"21",X"8B",X"30",X"3E",X"01",X"06", + X"11",X"CD",X"DF",X"15",X"C9",X"DD",X"21",X"1F",X"32",X"DD",X"22",X"F6",X"4D",X"21",X"51",X"34", + X"3E",X"19",X"CD",X"BD",X"2E",X"CD",X"A0",X"35",X"3E",X"10",X"32",X"E2",X"4E",X"3E",X"7B",X"21", + X"7D",X"2E",X"CD",X"EF",X"30",X"21",X"00",X"01",X"22",X"11",X"4E",X"3E",X"0F",X"32",X"13",X"4E", + X"3E",X"10",X"32",X"14",X"4E",X"3E",X"0E",X"32",X"31",X"4E",X"21",X"B6",X"31",X"CD",X"28",X"2F", + X"CD",X"31",X"2F",X"11",X"6F",X"41",X"21",X"81",X"30",X"3E",X"01",X"06",X"0A",X"CD",X"DF",X"15", + X"11",X"11",X"41",X"21",X"9C",X"30",X"3E",X"01",X"06",X"10",X"CD",X"DF",X"15",X"C9",X"DD",X"21", + X"16",X"32",X"DD",X"22",X"F6",X"4D",X"21",X"28",X"32",X"3E",X"1A",X"CD",X"BD",X"2E",X"CD",X"C1", + X"35",X"3E",X"10",X"32",X"E2",X"4E",X"3E",X"7E",X"21",X"9D",X"2E",X"CD",X"EF",X"30",X"21",X"10", + X"01",X"22",X"11",X"4E",X"3E",X"10",X"32",X"13",X"4E",X"3E",X"10",X"32",X"14",X"4E",X"3E",X"0D", + X"32",X"31",X"4E",X"21",X"E6",X"31",X"CD",X"28",X"2F",X"CD",X"31",X"2F",X"11",X"70",X"41",X"21", + X"AC",X"30",X"3E",X"01",X"06",X"0B",X"CD",X"DF",X"15",X"C9",X"DD",X"21",X"16",X"32",X"DD",X"22", + X"F6",X"4D",X"21",X"28",X"32",X"3E",X"1A",X"CD",X"BD",X"2E",X"CD",X"C1",X"35",X"3E",X"10",X"32", + X"E2",X"4E",X"3E",X"66",X"21",X"9D",X"2E",X"CD",X"EF",X"30",X"21",X"20",X"01",X"22",X"11",X"4E", + X"3E",X"10",X"32",X"13",X"4E",X"3E",X"10",X"32",X"14",X"4E",X"3E",X"0C",X"32",X"31",X"4E",X"21", + X"E6",X"31",X"CD",X"28",X"2F",X"CD",X"31",X"2F",X"11",X"70",X"41",X"21",X"AC",X"30",X"3E",X"01", + X"06",X"0B",X"CD",X"DF",X"15",X"C9",X"C9",X"C9",X"C9",X"C9",X"61",X"47",X"4F",X"52",X"4B",X"41", + X"4E",X"53",X"2C",X"43",X"4F",X"50",X"59",X"52",X"49",X"47",X"48",X"54",X"20",X"31",X"39",X"38", + X"33",X"54",X"45",X"43",X"48",X"53",X"54",X"41",X"52",X"20",X"49",X"4E",X"43",X"A3",X"40",X"BC", + X"40",X"8C",X"41",X"93",X"41",X"6C",X"42",X"73",X"42",X"43",X"43",X"5C",X"43",X"8B",X"40",X"94", + X"40",X"A4",X"41",X"BB",X"41",X"44",X"42",X"5B",X"42",X"6B",X"43",X"74",X"43",X"AC",X"40",X"B3", + X"40",X"29",X"41",X"36",X"41",X"C9",X"42",X"D6",X"42",X"4C",X"43",X"53",X"43",X"23",X"41",X"3C", + X"41",X"8D",X"41",X"92",X"41",X"6D",X"42",X"72",X"42",X"C3",X"42",X"DC",X"42",X"CD",X"40",X"D2", + X"40",X"46",X"41",X"59",X"41",X"A6",X"42",X"B9",X"42",X"2D",X"43",X"32",X"43",X"A3",X"40",X"BC", + X"40",X"8A",X"41",X"95",X"41",X"6A",X"42",X"75",X"42",X"43",X"43",X"5C",X"43",X"AB",X"40",X"B4", + X"40",X"2C",X"41",X"33",X"41",X"CC",X"42",X"D3",X"42",X"4B",X"43",X"54",X"43",X"CD",X"41",X"D2", + X"41",X"88",X"41",X"97",X"41",X"68",X"42",X"77",X"42",X"2D",X"42",X"32",X"42",X"C5",X"40",X"DA", + X"40",X"8B",X"41",X"94",X"41",X"6B",X"42",X"74",X"42",X"25",X"43",X"3A",X"43",X"EC",X"40",X"F3", + X"40",X"28",X"41",X"37",X"41",X"C8",X"42",X"D7",X"42",X"0C",X"43",X"13",X"43",X"C4",X"40",X"DB", + X"40",X"2C",X"41",X"33",X"41",X"CC",X"42",X"D3",X"42",X"24",X"43",X"3B",X"43",X"89",X"40",X"96", + X"40",X"A8",X"41",X"B7",X"41",X"48",X"42",X"57",X"42",X"69",X"43",X"76",X"43",X"E5",X"CD",X"17", + X"15",X"11",X"40",X"40",X"E1",X"D5",X"11",X"DF",X"4D",X"ED",X"A0",X"ED",X"A0",X"ED",X"A0",X"7E", + X"FE",X"0F",X"38",X"F5",X"ED",X"A0",X"2B",X"D1",X"E5",X"21",X"DF",X"4D",X"23",X"46",X"DD",X"7E", + X"00",X"12",X"13",X"10",X"FC",X"7E",X"23",X"86",X"2B",X"77",X"23",X"23",X"7E",X"FE",X"F0",X"30", + X"18",X"12",X"13",X"23",X"46",X"DD",X"7E",X"01",X"12",X"13",X"10",X"FC",X"7E",X"23",X"86",X"2B", + X"77",X"23",X"23",X"7E",X"12",X"13",X"C3",X"DC",X"2E",X"21",X"DF",X"4D",X"3A",X"F5",X"4D",X"3C", + X"32",X"F5",X"4D",X"FE",X"1C",X"28",X"0B",X"7E",X"3D",X"77",X"FE",X"F1",X"D2",X"DC",X"2E",X"C3", + X"C4",X"2E",X"E1",X"AF",X"32",X"F5",X"4D",X"C9",X"11",X"61",X"4C",X"01",X"30",X"00",X"ED",X"B0", + X"C9",X"21",X"F8",X"4D",X"11",X"F9",X"4D",X"36",X"00",X"01",X"11",X"00",X"ED",X"B0",X"21",X"FB", + X"4D",X"CB",X"FE",X"21",X"FE",X"4D",X"CB",X"FE",X"21",X"01",X"4E",X"CB",X"FE",X"21",X"04",X"4E", + X"CB",X"FE",X"21",X"07",X"4E",X"CB",X"FE",X"AF",X"32",X"1B",X"4E",X"32",X"29",X"4E",X"32",X"2B", + X"4E",X"32",X"32",X"4E",X"32",X"33",X"4E",X"21",X"00",X"00",X"22",X"AE",X"4C",X"3A",X"04",X"4D", + X"17",X"21",X"B7",X"30",X"CD",X"BA",X"15",X"7E",X"32",X"30",X"40",X"23",X"7E",X"32",X"2F",X"40", + X"3E",X"01",X"32",X"30",X"44",X"32",X"2F",X"44",X"3E",X"40",X"32",X"27",X"4E",X"32",X"28",X"4E", + X"AF",X"32",X"E4",X"4E",X"21",X"DD",X"4D",X"CB",X"86",X"AF",X"32",X"9C",X"4E",X"06",X"14",X"21", + X"CE",X"40",X"11",X"37",X"4E",X"C5",X"01",X"05",X"00",X"ED",X"B0",X"3E",X"1B",X"CD",X"BA",X"15", + X"C1",X"10",X"F2",X"3A",X"40",X"44",X"32",X"9B",X"4E",X"11",X"CE",X"40",X"21",X"D5",X"2F",X"3E", + X"05",X"06",X"14",X"CD",X"F5",X"15",X"11",X"CE",X"44",X"21",X"D4",X"2F",X"3E",X"05",X"06",X"14", + X"CD",X"F5",X"15",X"C9",X"09",X"40",X"45",X"53",X"41",X"42",X"40",X"44",X"49",X"4F",X"52",X"55", + X"51",X"47",X"47",X"49",X"4F",X"52",X"4B",X"40",X"4F",X"54",X"40",X"53",X"45",X"56",X"41",X"57", + X"40",X"32",X"47",X"47",X"49",X"4F",X"52",X"4B",X"40",X"4F",X"54",X"40",X"45",X"56",X"41",X"57", + X"40",X"31",X"45",X"53",X"41",X"42",X"40",X"47",X"47",X"49",X"4F",X"52",X"4B",X"4E",X"55",X"52", + X"44",X"40",X"4F",X"54",X"40",X"53",X"45",X"56",X"41",X"57",X"40",X"32",X"4E",X"55",X"52",X"44", + X"40",X"4F",X"54",X"40",X"45",X"56",X"41",X"57",X"40",X"31",X"45",X"53",X"41",X"42",X"40",X"4E", + X"55",X"52",X"44",X"50",X"4C",X"4F",X"54",X"52",X"45",X"47",X"40",X"4F",X"54",X"40",X"53",X"45", + X"56",X"41",X"57",X"40",X"32",X"50",X"4C",X"4F",X"54",X"52",X"45",X"47",X"40",X"4F",X"54",X"40", + X"45",X"56",X"41",X"57",X"40",X"31",X"45",X"53",X"41",X"42",X"40",X"50",X"4C",X"4F",X"54",X"52", + X"45",X"47",X"44",X"49",X"55",X"52",X"50",X"40",X"4F",X"54",X"40",X"53",X"45",X"56",X"41",X"57", + X"40",X"32",X"44",X"49",X"55",X"52",X"50",X"40",X"4F",X"54",X"40",X"45",X"56",X"41",X"57",X"40", + X"31",X"45",X"53",X"41",X"42",X"40",X"44",X"49",X"55",X"52",X"50",X"4E",X"41",X"4B",X"52",X"4F", + X"47",X"40",X"4F",X"54",X"40",X"53",X"45",X"56",X"41",X"57",X"40",X"32",X"4E",X"41",X"4B",X"52", + X"4F",X"47",X"40",X"4F",X"54",X"40",X"45",X"56",X"41",X"57",X"40",X"31",X"45",X"53",X"41",X"42", + X"40",X"4E",X"41",X"4B",X"52",X"4F",X"47",X"40",X"01",X"40",X"02",X"40",X"03",X"40",X"04",X"40", + X"05",X"40",X"06",X"40",X"07",X"40",X"08",X"40",X"09",X"01",X"00",X"01",X"01",X"01",X"02",X"01", + X"03",X"01",X"04",X"01",X"05",X"01",X"06",X"01",X"07",X"01",X"08",X"01",X"09",X"02",X"00",X"02", + X"01",X"02",X"02",X"02",X"03",X"02",X"04",X"02",X"05",X"02",X"06",X"02",X"07",X"02",X"08",X"32", + X"34",X"4E",X"22",X"2F",X"4E",X"C9",X"03",X"02",X"00",X"3B",X"14",X"5D",X"07",X"5F",X"03",X"02", + X"00",X"63",X"14",X"5D",X"07",X"1F",X"03",X"02",X"00",X"AB",X"14",X"5D",X"07",X"1F",X"03",X"02", + X"00",X"D3",X"14",X"5D",X"07",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"00",X"02",X"04", + X"00",X"8B",X"E4",X"5C",X"01",X"40",X"04",X"02",X"00",X"5B",X"3C",X"62",X"07",X"5F",X"03",X"02", + X"00",X"D3",X"5C",X"5D",X"07",X"1F",X"02",X"02",X"00",X"3B",X"B4",X"5C",X"07",X"1F",X"05",X"02", + X"00",X"B3",X"D4",X"60",X"07",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"00",X"02",X"04", + X"00",X"8B",X"FC",X"5C",X"01",X"40",X"04",X"02",X"00",X"23",X"84",X"62",X"07",X"5F",X"03",X"02", + X"00",X"73",X"24",X"5D",X"07",X"1F",X"03",X"02",X"00",X"9B",X"24",X"5D",X"07",X"1F",X"05",X"02", + X"00",X"EB",X"84",X"60",X"07",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"00",X"02",X"04", + X"00",X"8B",X"EC",X"5C",X"01",X"40",X"04",X"02",X"00",X"23",X"94",X"62",X"07",X"5F",X"04",X"02", + X"00",X"23",X"7C",X"62",X"07",X"1F",X"05",X"02",X"00",X"EB",X"7C",X"60",X"07",X"1F",X"05",X"02", + X"00",X"EB",X"94",X"60",X"07",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"00",X"02",X"04", + X"00",X"8B",X"FC",X"5C",X"01",X"40",X"04",X"02",X"00",X"23",X"D4",X"62",X"07",X"5F",X"04",X"02", + X"00",X"23",X"3C",X"62",X"07",X"1F",X"05",X"02",X"00",X"EB",X"3C",X"60",X"07",X"1F",X"05",X"02", + X"00",X"EB",X"D4",X"60",X"07",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"00",X"02",X"04", + X"00",X"8B",X"E4",X"5C",X"01",X"40",X"02",X"02",X"00",X"43",X"FC",X"5C",X"07",X"5F",X"02",X"02", + X"00",X"5B",X"FC",X"5C",X"07",X"1F",X"02",X"02",X"00",X"B3",X"FC",X"5C",X"07",X"1F",X"02",X"02", + X"00",X"CB",X"FC",X"5C",X"07",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"00",X"02",X"04", + X"00",X"8B",X"DC",X"5C",X"01",X"40",X"65",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"14",X"65", + X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"16",X"F1",X"20",X"00",X"F4",X"04",X"FF",X"0B",X"06", + X"02",X"0D",X"08",X"FE",X"0B",X"06",X"02",X"0D",X"04",X"FF",X"F4",X"01",X"00",X"0A",X"1C",X"00", + X"0A",X"01",X"00",X"F4",X"01",X"01",X"0C",X"1C",X"FE",X"0E",X"01",X"01",X"F2",X"05",X"00",X"0A", + X"14",X"00",X"0A",X"05",X"00",X"F4",X"04",X"FF",X"0B",X"16",X"02",X"0D",X"04",X"FF",X"F4",X"01", + X"00",X"0A",X"1C",X"00",X"0A",X"01",X"00",X"F4",X"01",X"01",X"0C",X"0C",X"FE",X"0E",X"02",X"02", + X"0C",X"0C",X"FE",X"0E",X"01",X"01",X"F1",X"20",X"00",X"FF",X"F1",X"20",X"00",X"F3",X"07",X"01", + X"0C",X"10",X"FE",X"0E",X"07",X"01",X"F1",X"0A",X"00",X"0A",X"0A",X"00",X"0A",X"0A",X"00",X"F1", + X"09",X"00",X"0B",X"0C",X"00",X"0D",X"09",X"00",X"F2",X"01",X"00",X"0A",X"02",X"01",X"0D",X"03", + X"FE",X"0B",X"0E",X"02",X"0D",X"03",X"FE",X"0B",X"02",X"01",X"0A",X"01",X"00",X"F4",X"01",X"00", + X"0A",X"1C",X"00",X"0A",X"01",X"00",X"F2",X"01",X"00",X"0A",X"0C",X"FF",X"0E",X"02",X"02",X"0C", + X"0C",X"FF",X"0A",X"01",X"00",X"F2",X"01",X"00",X"0A",X"0B",X"01",X"0D",X"04",X"FE",X"0B",X"0B", + X"01",X"0A",X"01",X"00",X"F4",X"01",X"00",X"0A",X"1C",X"00",X"0A",X"01",X"00",X"F2",X"01",X"00", + X"0A",X"03",X"FF",X"0E",X"01",X"02",X"0C",X"10",X"FE",X"0E",X"01",X"02",X"0C",X"03",X"FF",X"0A", + X"01",X"00",X"F1",X"09",X"00",X"0C",X"0C",X"00",X"0E",X"09",X"00",X"F1",X"0A",X"00",X"0A",X"0A", + X"00",X"0A",X"0A",X"00",X"F3",X"09",X"FF",X"0B",X"0C",X"02",X"0D",X"09",X"FF",X"F1",X"20",X"00", + X"FF",X"F1",X"20",X"00",X"F4",X"01",X"00",X"0A",X"02",X"01",X"0D",X"08",X"FE",X"0B",X"04",X"02", + X"0D",X"08",X"FE",X"0B",X"02",X"01",X"0A",X"01",X"00",X"F1",X"02",X"00",X"0C",X"1A",X"00",X"0E", + X"02",X"00",X"F5",X"03",X"00",X"0A",X"18",X"00",X"0A",X"03",X"00",X"F3",X"03",X"00",X"0A",X"0A", + X"FF",X"0E",X"02",X"02",X"0C",X"0A",X"FF",X"0A",X"03",X"00",X"F3",X"03",X"00",X"0A",X"08",X"01", + X"0D",X"06",X"FE",X"0B",X"08",X"01",X"0A",X"03",X"00",X"F5",X"03",X"00",X"0A",X"18",X"00",X"0A", + X"03",X"00",X"F1",X"02",X"00",X"0B",X"1A",X"00",X"0D",X"02",X"00",X"F4",X"01",X"00",X"0A",X"05", + X"FF",X"0E",X"02",X"02",X"0C",X"0A",X"FE",X"0E",X"02",X"02",X"0C",X"05",X"FF",X"0A",X"01",X"00", + X"F1",X"20",X"00",X"FF",X"F1",X"20",X"00",X"F3",X"03",X"FF",X"0B",X"08",X"02",X"0D",X"06",X"FE", + X"0B",X"08",X"02",X"0D",X"03",X"FF",X"F1",X"01",X"00",X"0A",X"1C",X"00",X"0A",X"01",X"00",X"F2", + X"01",X"00",X"0A",X"04",X"FF",X"0E",X"02",X"02",X"0C",X"0C",X"FE",X"0E",X"02",X"02",X"0C",X"04", + X"FF",X"0A",X"01",X"00",X"F2",X"01",X"00",X"0A",X"03",X"01",X"0D",X"04",X"FE",X"0B",X"0A",X"02", + X"0D",X"04",X"FE",X"0B",X"03",X"01",X"0A",X"01",X"00",X"F1",X"01",X"00",X"0A",X"1C",X"00",X"0A", + X"01",X"00",X"F2",X"01",X"01",X"0C",X"1C",X"FE",X"0E",X"01",X"01",X"F2",X"03",X"01",X"0C",X"0A", + X"FE",X"0E",X"02",X"02",X"0C",X"0A",X"FE",X"0E",X"03",X"01",X"F2",X"04",X"FF",X"0B",X"08",X"02", + X"0D",X"04",X"FE",X"0B",X"08",X"02",X"0D",X"04",X"FF",X"F2",X"02",X"FF",X"0B",X"1A",X"02",X"0D", + X"02",X"FF",X"F1",X"01",X"00",X"0A",X"1C",X"00",X"0A",X"01",X"00",X"F2",X"01",X"00",X"0A",X"04", + X"FF",X"0E",X"02",X"02",X"0C",X"0C",X"FE",X"0E",X"02",X"02",X"0C",X"04",X"FF",X"0A",X"01",X"00", + X"F2",X"01",X"00",X"0A",X"03",X"01",X"0D",X"04",X"FE",X"0B",X"0A",X"02",X"0D",X"04",X"FE",X"0B", + X"03",X"01",X"0A",X"01",X"00",X"F1",X"01",X"00",X"0A",X"1C",X"00",X"0A",X"01",X"00",X"F3",X"01", + X"01",X"0C",X"0C",X"FE",X"0E",X"02",X"02",X"0C",X"0C",X"FE",X"0E",X"01",X"01",X"F1",X"20",X"00", + X"FF",X"F1",X"20",X"00",X"F3",X"05",X"FF",X"0B",X"01",X"02",X"0D",X"06",X"FE",X"0B",X"02",X"02", + X"0D",X"06",X"FE",X"0B",X"01",X"02",X"0D",X"05",X"FF",X"F1",X"02",X"00",X"0B",X"1A",X"00",X"0D", + X"02",X"00",X"F3",X"01",X"01",X"0C",X"1C",X"FE",X"0E",X"01",X"01",X"FC",X"04",X"00",X"0A",X"16", + X"00",X"0A",X"04",X"00",X"F3",X"03",X"FF",X"0B",X"18",X"02",X"0D",X"03",X"FF",X"F1",X"02",X"00", + X"0C",X"1A",X"00",X"0E",X"02",X"00",X"F3",X"03",X"01",X"0C",X"05",X"FE",X"0E",X"02",X"02",X"0C", + X"06",X"FE",X"0E",X"02",X"02",X"0C",X"05",X"FE",X"0E",X"03",X"01",X"F1",X"20",X"00",X"FF",X"F1", + X"20",X"00",X"FB",X"0B",X"FF",X"0B",X"08",X"02",X"0D",X"0B",X"FF",X"F4",X"01",X"00",X"0A",X"1C", + X"00",X"0A",X"01",X"00",X"FB",X"01",X"01",X"0C",X"1C",X"FE",X"0E",X"01",X"01",X"F1",X"20",X"00", + X"FF",X"3E",X"0E",X"32",X"C7",X"40",X"32",X"D7",X"40",X"32",X"AF",X"41",X"32",X"87",X"42",X"32", + X"97",X"42",X"32",X"2F",X"43",X"3E",X"0C",X"32",X"C8",X"40",X"32",X"D8",X"40",X"32",X"B0",X"41", + X"32",X"88",X"42",X"32",X"98",X"42",X"32",X"30",X"43",X"3E",X"0D",X"32",X"CF",X"40",X"32",X"67", + X"41",X"32",X"77",X"41",X"32",X"4F",X"42",X"32",X"27",X"43",X"32",X"37",X"43",X"3E",X"0B",X"32", + X"D0",X"40",X"32",X"68",X"41",X"32",X"78",X"41",X"32",X"50",X"42",X"32",X"28",X"43",X"32",X"38", + X"43",X"3E",X"0A",X"32",X"FB",X"41",X"32",X"1B",X"42",X"C9",X"3E",X"0E",X"32",X"AF",X"41",X"3E", + X"0C",X"32",X"B0",X"41",X"3E",X"0D",X"32",X"4F",X"42",X"3E",X"0B",X"32",X"50",X"42",X"3E",X"0C", + X"32",X"E1",X"42",X"3E",X"0B",X"32",X"01",X"41",X"3E",X"0D",X"32",X"1E",X"41",X"3E",X"0E",X"32", + X"FE",X"42",X"C9",X"3E",X"0D",X"32",X"E8",X"40",X"32",X"F6",X"40",X"32",X"6F",X"42",X"3E",X"0B", + X"32",X"E9",X"40",X"32",X"F7",X"40",X"32",X"70",X"42",X"3E",X"0E",X"32",X"8F",X"41",X"32",X"08", + X"43",X"32",X"16",X"43",X"3E",X"0C",X"32",X"90",X"41",X"32",X"09",X"43",X"32",X"17",X"43",X"3E", + X"0C",X"32",X"81",X"43",X"32",X"C1",X"40",X"3E",X"0B",X"32",X"21",X"43",X"32",X"61",X"40",X"3E", + X"0E",X"32",X"9E",X"43",X"32",X"DE",X"40",X"3E",X"0D",X"32",X"3E",X"43",X"32",X"7E",X"40",X"C9", + X"3E",X"0D",X"32",X"CA",X"40",X"32",X"D4",X"40",X"3E",X"0B",X"32",X"CB",X"40",X"32",X"D5",X"40", + X"3E",X"0E",X"32",X"2A",X"43",X"32",X"34",X"43",X"3E",X"0C",X"32",X"2B",X"43",X"32",X"35",X"43", + X"C9",X"3E",X"0D",X"32",X"EF",X"40",X"3E",X"0B",X"32",X"F0",X"40",X"32",X"05",X"42",X"3E",X"0C", + X"32",X"E5",X"41",X"32",X"10",X"43",X"3E",X"0E",X"32",X"0F",X"43",X"C9",X"3E",X"40",X"CD",X"07", + X"15",X"3E",X"01",X"CD",X"17",X"15",X"11",X"4D",X"44",X"21",X"47",X"37",X"3E",X"06",X"06",X"1C", + X"CD",X"F5",X"15",X"11",X"C1",X"40",X"21",X"7B",X"37",X"3E",X"01",X"06",X"14",X"CD",X"DF",X"15", + X"11",X"C2",X"40",X"21",X"8F",X"37",X"3E",X"01",X"06",X"14",X"CD",X"DF",X"15",X"11",X"C3",X"40", + X"21",X"A3",X"37",X"3E",X"01",X"06",X"14",X"CD",X"DF",X"15",X"11",X"C4",X"40",X"21",X"8F",X"37", + X"3E",X"01",X"06",X"14",X"CD",X"DF",X"15",X"11",X"C5",X"40",X"21",X"7B",X"37",X"3E",X"01",X"06", + X"14",X"CD",X"DF",X"15",X"11",X"47",X"40",X"21",X"B7",X"37",X"3E",X"01",X"06",X"1C",X"CD",X"F5", + X"15",X"11",X"49",X"40",X"21",X"B7",X"37",X"3E",X"01",X"06",X"1C",X"CD",X"F5",X"15",X"11",X"4B", + X"40",X"21",X"B8",X"37",X"3E",X"01",X"06",X"1C",X"CD",X"F5",X"15",X"11",X"4D",X"40",X"21",X"B9", + X"37",X"3E",X"01",X"06",X"1C",X"CD",X"DF",X"15",X"11",X"4E",X"40",X"21",X"D5",X"37",X"3E",X"01", + X"06",X"1C",X"CD",X"DF",X"15",X"11",X"4F",X"40",X"21",X"F1",X"37",X"3E",X"01",X"06",X"1C",X"CD", + X"DF",X"15",X"11",X"50",X"40",X"21",X"0D",X"38",X"3E",X"01",X"06",X"1C",X"CD",X"DF",X"15",X"11", + X"51",X"40",X"21",X"29",X"38",X"3E",X"01",X"06",X"1C",X"CD",X"DF",X"15",X"11",X"52",X"40",X"21", + X"45",X"38",X"3E",X"01",X"06",X"1C",X"CD",X"DF",X"15",X"11",X"54",X"40",X"21",X"B8",X"37",X"3E", + X"01",X"06",X"1C",X"CD",X"F5",X"15",X"11",X"56",X"40",X"21",X"B7",X"37",X"3E",X"01",X"06",X"1C", + X"CD",X"F5",X"15",X"11",X"58",X"40",X"21",X"B7",X"37",X"3E",X"01",X"06",X"1C",X"CD",X"F5",X"15", + X"11",X"7A",X"40",X"21",X"61",X"38",X"3E",X"01",X"06",X"13",X"CD",X"DF",X"15",X"11",X"7B",X"40", + X"21",X"74",X"38",X"3E",X"01",X"06",X"13",X"CD",X"DF",X"15",X"11",X"7C",X"40",X"21",X"87",X"38", + X"3E",X"01",X"06",X"13",X"CD",X"DF",X"15",X"3E",X"0E",X"32",X"7C",X"46",X"11",X"7D",X"40",X"21", + X"74",X"38",X"3E",X"01",X"06",X"13",X"CD",X"DF",X"15",X"11",X"7E",X"40",X"21",X"61",X"38",X"3E", + X"01",X"06",X"13",X"CD",X"DF",X"15",X"AF",X"32",X"E6",X"4E",X"3E",X"9F",X"32",X"E7",X"4E",X"3E", + X"A3",X"32",X"E8",X"4E",X"11",X"E7",X"4E",X"CD",X"48",X"37",X"11",X"E8",X"4E",X"CD",X"48",X"37", + X"3E",X"01",X"CD",X"A5",X"15",X"3A",X"E6",X"4E",X"FE",X"B0",X"C8",X"3C",X"32",X"E6",X"4E",X"21", + X"95",X"4C",X"CB",X"6E",X"C0",X"18",X"DD",X"03",X"1A",X"FE",X"A2",X"28",X"1C",X"FE",X"A6",X"28", + X"21",X"C6",X"01",X"12",X"5F",X"D6",X"01",X"57",X"21",X"40",X"40",X"01",X"80",X"03",X"7A",X"ED", + X"B1",X"78",X"B1",X"C8",X"2B",X"73",X"23",X"18",X"F5",X"3E",X"9F",X"12",X"5F",X"3E",X"A2",X"57", + X"18",X"E6",X"3E",X"A3",X"12",X"5F",X"3E",X"A6",X"57",X"18",X"DD",X"A8",X"9F",X"9F",X"9F",X"9F", + X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"A8",X"A3", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"A3",X"A3",X"40",X"53",X"54",X"4E",X"45",X"53",X"45",X"52",X"50",X"40",X"5A",X"45", + X"48",X"43",X"4E",X"41",X"53",X"40",X"A3",X"A7",X"9F",X"94",X"93",X"92",X"9E",X"93",X"9E",X"9E", + X"93",X"9E",X"94",X"93",X"92",X"9E",X"9D",X"9E",X"93",X"9E",X"94",X"93",X"92",X"9E",X"94",X"93", + X"92",X"9E",X"94",X"93",X"92",X"96",X"9E",X"93",X"9E",X"93",X"9E",X"94",X"93",X"9E",X"93",X"9E", + X"93",X"9E",X"95",X"9E",X"93",X"9E",X"93",X"9E",X"93",X"9E",X"93",X"9E",X"93",X"9E",X"93",X"9E", + X"93",X"9E",X"97",X"93",X"9E",X"93",X"9E",X"93",X"93",X"9E",X"93",X"9E",X"93",X"9E",X"93",X"95", + X"93",X"9E",X"93",X"9E",X"93",X"9E",X"93",X"9E",X"93",X"9E",X"9E",X"9E",X"93",X"93",X"98",X"9E", + X"9E",X"93",X"93",X"9E",X"93",X"9E",X"93",X"93",X"93",X"9E",X"99",X"96",X"93",X"9E",X"98",X"93", + X"93",X"9E",X"93",X"9E",X"93",X"9E",X"93",X"96",X"93",X"93",X"9E",X"94",X"9E",X"93",X"96",X"9E", + X"93",X"9E",X"93",X"9E",X"93",X"9E",X"9B",X"9E",X"93",X"9E",X"9A",X"9E",X"93",X"9E",X"93",X"9E", + X"93",X"9E",X"93",X"9E",X"93",X"9C",X"93",X"96",X"9E",X"93",X"9E",X"9E",X"93",X"9E",X"93",X"9E", + X"93",X"94",X"9D",X"9E",X"93",X"9E",X"9B",X"9E",X"93",X"9E",X"9C",X"93",X"96",X"9E",X"9C",X"93", + X"96",X"A8",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F", + X"9F",X"9F",X"9F",X"A8",X"A3",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"A3",X"A3",X"40",X"52",X"41",X"54",X"53",X"48",X"43",X"45", + X"54",X"40",X"33",X"38",X"39",X"31",X"40",X"1A",X"40",X"A3",X"C9",X"21",X"A0",X"4E",X"22",X"9D", + X"4E",X"11",X"A1",X"4E",X"01",X"3F",X"00",X"36",X"00",X"ED",X"B0",X"C9",X"21",X"A0",X"4E",X"22", + X"9D",X"4E",X"11",X"A1",X"4E",X"01",X"3F",X"00",X"36",X"00",X"ED",X"B0",X"C9",X"21",X"8F",X"39", + X"22",X"35",X"4E",X"3E",X"EF",X"32",X"F8",X"4C",X"C9",X"C9",X"2A",X"35",X"4E",X"E5",X"21",X"8F", + X"39",X"7D",X"E1",X"BD",X"CC",X"02",X"39",X"7E",X"FE",X"00",X"28",X"0E",X"23",X"46",X"3A",X"8C", + X"4C",X"B8",X"28",X"14",X"2B",X"22",X"35",X"4E",X"18",X"17",X"23",X"46",X"3A",X"8D",X"4C",X"B8", + X"28",X"06",X"2B",X"22",X"35",X"4E",X"18",X"09",X"23",X"7E",X"32",X"F8",X"4C",X"23",X"22",X"35", + X"4E",X"C9",X"3E",X"FF",X"32",X"F8",X"4C",X"C9",X"C9",X"21",X"A0",X"4E",X"22",X"9D",X"4E",X"C9", + X"C9",X"21",X"C0",X"4E",X"22",X"9D",X"4E",X"C9",X"C9",X"C9",X"C9",X"C9",X"3E",X"09",X"32",X"1C", + X"4E",X"3E",X"02",X"32",X"1D",X"4E",X"3E",X"08",X"32",X"1E",X"4E",X"32",X"20",X"4E",X"32",X"1F", + X"4E",X"32",X"23",X"4E",X"3E",X"16",X"32",X"21",X"4E",X"32",X"25",X"4E",X"3E",X"12",X"32",X"22", + X"4E",X"32",X"24",X"4E",X"ED",X"5B",X"1E",X"4E",X"CD",X"80",X"39",X"ED",X"5B",X"20",X"4E",X"CD", + X"80",X"39",X"ED",X"5B",X"22",X"4E",X"CD",X"80",X"39",X"ED",X"5B",X"24",X"4E",X"CD",X"80",X"39", + X"3A",X"1D",X"4E",X"C6",X"02",X"32",X"1D",X"4E",X"06",X"08",X"21",X"1E",X"4E",X"35",X"23",X"10", + X"FC",X"3E",X"05",X"CD",X"A5",X"15",X"3A",X"1C",X"4E",X"3D",X"32",X"1C",X"4E",X"20",X"C5",X"C9", + X"CD",X"E9",X"14",X"21",X"8E",X"39",X"3A",X"1D",X"4E",X"47",X"CD",X"F5",X"15",X"C9",X"62",X"00", + X"A4",X"FB",X"01",X"E3",X"F7",X"00",X"EC",X"FD",X"01",X"9B",X"FE",X"00",X"DC",X"FD",X"01",X"73", + X"F7",X"00",X"EC",X"FD",X"01",X"2B",X"FE",X"00",X"A4",X"FB",X"01",X"6B",X"FE",X"00",X"64",X"FD", + X"01",X"2B",X"FE",X"00",X"24",X"FB",X"01",X"73",X"F7",X"01",X"72",X"FF",X"01",X"4B",X"F7",X"00", + X"94",X"FB",X"01",X"5B",X"F7",X"01",X"5C",X"FF",X"01",X"93",X"F7",X"01",X"94",X"FF",X"01",X"83", + X"FE",X"01",X"82",X"FF",X"01",X"6B",X"FF",X"01",X"6B",X"FE",X"01",X"6A",X"FF",X"00",X"34",X"FB", + X"00",X"33",X"FF",X"00",X"2C",X"FB",X"00",X"2D",X"FF",X"01",X"8B",X"F7",X"01",X"8C",X"FF",X"00", + X"5C",X"FD",X"00",X"5D",X"FF",X"00",X"64",X"FD",X"00",X"63",X"FF",X"01",X"9B",X"FE",X"0B",X"20", + X"4D",X"0B",X"3B",X"4D",X"0C",X"02",X"01",X"43",X"00",X"02",X"08",X"05",X"04",X"01",X"54",X"00", + X"05",X"04",X"01",X"32",X"00",X"05",X"04",X"01",X"85",X"00",X"05",X"04",X"01",X"A7",X"00",X"05", + X"04",X"01",X"64",X"00",X"05",X"04",X"01",X"0B",X"01",X"05",X"04",X"09",X"0B",X"05",X"4D",X"0B", + X"3B",X"4D",X"01",X"F0",X"00",X"0C",X"02",X"06",X"02",X"08",X"05",X"03",X"02",X"00",X"05",X"03", + X"07",X"0F",X"09",X"0B",X"05",X"4D",X"0C",X"04",X"01",X"A0",X"00",X"02",X"0F",X"06",X"06",X"03", + X"10",X"00",X"05",X"01",X"07",X"07",X"06",X"03",X"EF",X"FF",X"05",X"01",X"07",X"07",X"04",X"FF", + X"03",X"40",X"00",X"07",X"0A",X"09",X"0B",X"3B",X"4D",X"0B",X"71",X"4D",X"0B",X"8C",X"4D",X"0B", + X"A7",X"4D",X"0C",X"02",X"01",X"80",X"00",X"02",X"0F",X"06",X"06",X"03",X"10",X"00",X"05",X"01", + X"07",X"07",X"06",X"03",X"EF",X"FF",X"05",X"01",X"07",X"07",X"04",X"FF",X"03",X"FA",X"FF",X"07", + X"0F",X"09",X"0C",X"02",X"01",X"40",X"00",X"02",X"0F",X"06",X"06",X"03",X"06",X"00",X"05",X"01", + X"07",X"0F",X"04",X"FF",X"07",X"0A",X"05",X"01",X"08",X"A6",X"3A",X"0B",X"71",X"4D",X"0C",X"04", + X"02",X"0F",X"01",X"40",X"00",X"06",X"06",X"03",X"10",X"00",X"05",X"01",X"07",X"0A",X"03",X"80", + X"FF",X"07",X"04",X"09",X"0C",X"02",X"01",X"40",X"00",X"02",X"0F",X"06",X"06",X"03",X"06",X"00", + X"05",X"01",X"07",X"0F",X"04",X"FF",X"07",X"0A",X"05",X"01",X"08",X"D8",X"3A",X"0B",X"A7",X"4D", + X"0C",X"07",X"01",X"95",X"00",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"95", + X"00",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"C7",X"00",X"02",X"0F",X"06", + X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"95",X"00",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE", + X"07",X"02",X"01",X"C7",X"00",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"EC", + X"00",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"C7",X"00",X"02",X"0F",X"06", + X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"EC",X"00",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE", + X"07",X"02",X"01",X"2A",X"01",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"EC", + X"00",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"2A",X"01",X"02",X"0F",X"06", + X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"8E",X"01",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE", + X"07",X"02",X"01",X"2A",X"01",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"8E", + X"01",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"D8",X"01",X"02",X"0F",X"06", + X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"C0",X"01",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE", + X"07",X"02",X"01",X"8E",X"01",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"64", + X"01",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"2A",X"01",X"02",X"0F",X"06", + X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"64",X"01",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE", + X"07",X"02",X"01",X"8E",X"01",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"04",X"05",X"08", + X"01",X"95",X"00",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"95",X"00",X"02", + X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"C7",X"00",X"02",X"0F",X"06",X"05",X"02", + X"04",X"FE",X"07",X"02",X"01",X"95",X"00",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02", + X"01",X"C7",X"00",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"EC",X"00",X"02", + X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"C7",X"00",X"02",X"0F",X"06",X"05",X"02", + X"04",X"FE",X"07",X"02",X"01",X"EC",X"00",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02", + X"01",X"2A",X"01",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"EC",X"00",X"02", + X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"2A",X"01",X"02",X"0F",X"06",X"05",X"02", + X"04",X"FE",X"07",X"02",X"01",X"64",X"01",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02", + X"01",X"2A",X"01",X"02",X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"64",X"01",X"02", + X"0F",X"06",X"05",X"02",X"04",X"FE",X"07",X"02",X"01",X"64",X"01",X"02",X"0F",X"06",X"05",X"02", + X"04",X"FE",X"07",X"06",X"05",X"0C",X"09",X"00",X"00",X"15",X"00",X"00",X"00",X"30",X"00",X"00", + X"00",X"45",X"00",X"00",X"00",X"60",X"00",X"00",X"50",X"12",X"00",X"00",X"00",X"25",X"00",X"00", + X"50",X"37",X"00",X"00",X"00",X"50",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"20",X"00",X"00", + X"00",X"30",X"00",X"00",X"00",X"40",X"00",X"00",X"50",X"07",X"00",X"00",X"00",X"15",X"00",X"00", + X"50",X"22",X"00",X"00",X"00",X"30",X"00",X"05",X"04",X"03",X"02",X"00",X"03",X"06",X"09",X"00", + X"03",X"00",X"00",X"06",X"03",X"00",X"03",X"00",X"00",X"06",X"03",X"00",X"00",X"09",X"00",X"FF", + X"4C",X"52",X"53",X"50",X"42",X"03",X"4D",X"43",X"53",X"60",X"17",X"03",X"4A",X"4D",X"53",X"20", + X"85",X"02",X"42",X"4F",X"40",X"90",X"76",X"02",X"4A",X"53",X"40",X"50",X"31",X"02",X"4A",X"46", + X"53",X"90",X"10",X"02",X"46",X"53",X"4D",X"00",X"05",X"02",X"43",X"53",X"4D",X"60",X"01",X"02", + X"43",X"44",X"40",X"80",X"98",X"01",X"48",X"44",X"43",X"40",X"86",X"01",X"07",X"10",X"03",X"12", + X"96",X"47",X"4F",X"52",X"4B",X"41",X"4E",X"53",X"2C",X"43",X"4F",X"50",X"59",X"52",X"49",X"47", + X"48",X"54",X"20",X"31",X"39",X"38",X"33",X"54",X"45",X"43",X"48",X"53",X"54",X"41",X"52",X"20", + X"49",X"4E",X"43",X"00",X"FF",X"00",X"FF",X"00",X"FB",X"00",X"E3",X"00",X"FF",X"00",X"FF",X"00", + X"3E",X"00",X"3E",X"00",X"FF",X"00",X"FF",X"00",X"3E",X"00",X"3E",X"00",X"FF",X"00",X"FF",X"00", + X"02",X"00",X"CB",X"00",X"FF",X"00",X"FF",X"00",X"DA",X"00",X"F3",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"3A",X"80",X"50",X"E6",X"80",X"FE",X"80",X"28",X"03",X"C3",X"FF",X"FF",X"C3",X"C7",X"02",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..f07cb2ca --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,15 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is +begin + data <= X"FF"; +end architecture; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_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/Arcade/Pacman Hardware/Gorkans_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/build_id.v new file mode 100644 index 00000000..8a430b5b --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171122" +`define BUILD_TIME "101343" diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..fec08f5f --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) := (others => '0'); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_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/Arcade/Pacman Hardware/Gorkans_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/Gorkans_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_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/Arcade/Pacman Hardware/Gorkans_MiST/rtl/osd.v b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_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/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..24d19966 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pacman.vhd @@ -0,0 +1,469 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- Copyright (c) Sorgelig - 2017 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 006 Refactoring, 8 sprites support by Sorgelig +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN is + generic( + eight_sprites : boolean := false + ); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0 : in std_logic_vector(7 downto 0); + in1 : in std_logic_vector(7 downto 0); + dipsw1 : in std_logic_vector(7 downto 0); + dipsw2 : in std_logic_vector(7 downto 0); + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of PACMAN is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_int_l : std_logic := '1'; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal hp : std_logic_vector ( 4 downto 0); + signal vp : std_logic_vector ( 4 downto 0); + signal ram_cs : std_logic; + signal ram_data : std_logic_vector(7 downto 0); + signal vram_data : std_logic_vector(7 downto 0); + signal sprite_xy_data : std_logic_vector(7 downto 0); + signal vram_addr : std_logic_vector(11 downto 0); + + signal iodec_spr_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_sn1_l : std_logic; + signal iodec_sn2_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw1_l : std_logic; + signal iodec_dipsw2_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + + signal sn_we : std_logic; + signal wav1,wav2,wav3 : std_logic_vector(7 downto 0); + + component ym2149 is port + ( + CLK : in std_logic; + CE : in std_logic; + RESET : in std_logic; + BDIR : in std_logic; + BC : in std_logic; + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + CHANNEL_A: out std_logic_vector(7 downto 0); + CHANNEL_B: out std_logic_vector(7 downto 0); + CHANNEL_C: out std_logic_vector(7 downto 0); + + SEL : in std_logic; + MODE : in std_logic; + IOA_in : in std_logic_vector(7 downto 0); + IOA_out : out std_logic_vector(7 downto 0); + + IOB_in : in std_logic_vector(7 downto 0); + IOB_out : out std_logic_vector(7 downto 0) + ); + end component; + +begin + +-- +-- video timing +-- +p_hvcnt : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + if hcnt = "111111111" then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + if do_hsync then + if vcnt = "111111111" then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; +end process; + +vsync <= not vcnt(8); +do_hsync <= (hcnt = "010101111"); -- 0AF + +p_sync : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + + if (hcnt = "010001111") and not eight_sprites then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") and not eight_sprites then + hblank <= '0'; -- 0EF + elsif (hcnt = "111111111") and eight_sprites then + hblank <= '1'; + elsif (hcnt = "011111111") and eight_sprites then + hblank <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; +end process; + +-- +-- cpu +-- +p_irq_req_watchdog : process + variable rising_vblank : boolean; +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + --watchdog_reset_l <= not reset; + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + end if; +end process; + +u_cpu : entity work.T80sed +port map +( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => hcnt(0) and ena_6, + WAIT_n => sync_bus_wreq_l, + INT_n => cpu_int_l, + NMI_n => '1', + BUSRQ_n => '1', + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out +); + +-- rom 0x0000 - 0x3FFF +-- syncbus 0x4000 - 0x7FFF +sync_bus_cs_l <= '0' when cpu_mreq_l = '0' and cpu_rfsh_l = '1' and cpu_addr(14) = '1' else '1'; +sync_bus_wreq_l <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '1' and cpu_rd_l = '0' else '1'; +sync_bus_stb <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '0' else '1'; +sync_bus_r_w_l <= '0' when sync_bus_stb = '0' and cpu_rd_l = '1' else '1'; + +-- +-- sync bus custom ic +-- +p_sync_bus_reg : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; +end process; + + +-- WRITE +-- out_l 0x5000 - 0x503F control space +-- sn1_l 0x5040 - 0x504F sound +-- sn2_l 0x5050 - 0x505F sound +-- spr_l 0x5060 - 0x506F sprite +-- wdr_l 0x50C0 - 0x50FF watchdog reset +iodec_out_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_sn1_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"4" else '1'; +iodec_sn2_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"5" else '1'; +iodec_spr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"6" else '1'; +iodec_wdr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +-- READ +-- in0_l 0x5000 - 0x503F in port 0 +-- in1_l 0x5040 - 0x507F in port 1 +-- dipsw_l 0x5080 - 0x50BF dip switches +iodec_in0_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_in1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"01" else '1'; +iodec_dipsw1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"10" else '1'; +iodec_dipsw2_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +p_control_reg : process +begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + elsif (iodec_out_l = '0') then + control_reg(to_integer(unsigned(cpu_addr(2 downto 0)))) <= cpu_data_out(0); + end if; + end if; +end process; + +cpu_data_in <= cpu_vec_reg when (cpu_iorq_l = '0') and (cpu_m1_l = '0') else + sync_bus_reg when sync_bus_wreq_l = '0' else + program_rom_dinl when cpu_addr(15 downto 14) = "00" else -- ROM at 0000 - 3fff + program_rom_dinh when cpu_addr(15 downto 14) = "10" else -- ROM at 8000 - bfff + in0 when iodec_in0_l = '0' else + in1 when iodec_in1_l = '0' else + dipsw1 when iodec_dipsw1_l = '0' else + dipsw2 when iodec_dipsw2_l = '0' else + ram_data; + +u_program_rom : entity work.ROM_PGM_0 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl +); + +u_program_rom1 : entity work.ROM_PGM_1 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinh +); + +ram_cs <= '1' when cpu_addr(15 downto 12) = X"4" else '0'; + +u_rams : work.dpram generic map (12,8) +port map +( + clock_a => clk, + enable_a => ena_6, + wren_a => not sync_bus_r_w_l and ram_cs, + address_a => cpu_addr(11 downto 0), + data_a => cpu_data_out, -- cpu only source of ram data + q_a => ram_data, + + clock_b => clk, + address_b => vram_addr(11 downto 0), + q_b => vram_data +); + +-- +-- video subsystem +-- + +-- vram addr custom ic +hp <= hcnt(7 downto 3) when control_reg(3) = '0' else not hcnt(7 downto 3); +vp <= vcnt(7 downto 3) when control_reg(3) = '0' else not vcnt(7 downto 3); +vram_addr <= '0' & hcnt(2) & vp & hp when hcnt(8)='1' else + x"FF" & hcnt(6 downto 4) & hcnt(2) when hblank = '1' else + '0' & hcnt(2) & hp(3) & hp(3) & hp(3) & hp(3) & hp(0) & vp; + +sprite_xy_ram : work.dpram generic map (4,8) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not iodec_spr_l, + address_a => cpu_addr(3 downto 0), + data_a => cpu_data_out, + + clock_b => CLK, + address_b => vram_addr(3 downto 0), + q_b => sprite_xy_data +); + +u_video : entity work.PACMAN_VIDEO +port map +( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + vram_data => vram_data, + sprite_xy => sprite_xy_data, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + O_HBLANK => O_HBLANK, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk +); + +O_HSYNC <= hSync; +O_VSYNC <= vSync; +O_VBLANK <= vblank; + +-- +-- +-- audio subsystem +-- +u_audio : entity work.PACMAN_AUDIO +port map ( + I_HCNT => hcnt, + -- + I_AB => cpu_addr(11 downto 0), + I_DB => cpu_data_out, + -- + I_WR1_L => iodec_sn2_l, + I_WR0_L => iodec_sn1_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk +); + +end RTL; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..91313469 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not I_WR1_L, + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => rom3m(1), + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..1552d65b --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pacman_video.vhd @@ -0,0 +1,279 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 004 Refactoring, 8 sprite support by Sorgelig +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VIDEO is + generic( + alt_transp : boolean := false + ); + port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + vram_data : in std_logic_vector(7 downto 0); + sprite_xy : in std_logic_vector(7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + O_HBLANK : out std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_VIDEO is + + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal sprite_data : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + signal obj_on2 : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_op_t1 : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal sprite_ram_ip : std_logic_vector(5 downto 0); + signal sprite_ram_op : std_logic_vector(5 downto 0); + signal sprite_addr : std_logic_vector(7 downto 0); + signal sprite_addr_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(5 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + +dr <= not sprite_xy when I_HBLANK = '1' else "11111111"; -- pull ups on board + +p_char_regs : process + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; +begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & not I_HBLANK); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + sprite_data <= vram_data; -- character reg + end if; +end process; + +xflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(1); +yflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(0); + +obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + +ca(12) <= char_hblank_reg; +ca(11 downto 6) <= sprite_data(7 downto 2); +ca(5) <= sprite_data(1) when char_hblank_reg = '0' else char_sum_reg(3) xor xflip; +ca(4) <= sprite_data(0) when char_hblank_reg = '0' else I_HCNT(3); +ca(3) <= I_HCNT(2) xor yflip; +ca(2) <= char_sum_reg(2) xor xflip; +ca(1) <= char_sum_reg(1) xor xflip; +ca(0) <= char_sum_reg(0) xor xflip; + +-- char roms +char_rom_5ef : entity work.GFX1 +port map +( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf +); + +p_char_shift : process +begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_buf(7 downto 4); -- load + shift_regl <= char_rom_5ef_buf(3 downto 0); + when others => null; + end case; + end if; +end process; + +shift_sel(0) <= I_HCNT(0) and I_HCNT(1) when vout_yflip = '0' else '1'; +shift_sel(1) <= '1' when vout_yflip = '0' else I_HCNT(0) and I_HCNT(1); +shift_op(0) <= shift_regl(3) when vout_yflip = '0' else shift_regl(0); +shift_op(1) <= shift_regu(3) when vout_yflip = '0' else shift_regu(0); + +p_video_out_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= vram_data(4 downto 0); -- colour reg + end if; + + if I_HCNT(3 downto 0) = "0111" and (vout_hblank='1' or I_HBLANK='1' or vout_obj_on='0') then + sprite_addr <= dr; + else + sprite_addr <= sprite_addr + "1"; + end if; + end if; +end process; + +col_rom_4a : entity work.PROM4_DST +port map +( + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a +); + +u_sprite_ram : work.dpram generic map (8,6) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => vout_obj_on_t1, + address_a => sprite_addr_t1, + data_a => sprite_ram_ip, + + clock_b => CLK, + enable_b => ENA_6, + address_b => sprite_addr, + q_b => sprite_ram_op +); + +sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "000000"; +video_op_sel <= '0' when alt_transp and (sprite_ram_reg(1 downto 0) = "00") else + '0' when not alt_transp and (sprite_ram_reg(5 downto 2) = "0000") else + '1'; + +p_sprite_ram_ip_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + sprite_addr_t1 <= sprite_addr; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + shift_op_t1 <= shift_op; + end if; +end process; + +sprite_ram_ip <= (others => '0') when vout_hblank_t1 = '0' else + sprite_ram_reg when video_op_sel = '1' else + lut_4a_t1(3 downto 0) & shift_op_t1; + +final_col <= (others => '0') when (vout_hblank = '1') or (I_VBLANK = '1') else + sprite_ram_reg(5 downto 2) when video_op_sel = '1' else + lut_4a(3 downto 0); + +-- assign video outputs from color LUT PROM +col_rom_7f : entity work.PROM7_DST +port map +( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE +); + +O_HBLANK <= vout_hblank and vout_hblank_t1; + +end architecture; diff --git a/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_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/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pll.v b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pll.v new file mode 100644 index 00000000..60297687 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 8, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "9" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "9" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Pacman Hardware/Gorkans_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/Gorkans_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/Gorkans_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/Gorkans_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/Arcade/Pacman Hardware/Lizard_Wizard_MiST/LizardWizard.qpf b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/LizardWizard.qpf new file mode 100644 index 00000000..9dca993d --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/LizardWizard.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "LizardWizard" diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/LizardWizard.qsf b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/LizardWizard.qsf new file mode 100644 index 00000000..96599caf --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/LizardWizard.qsf @@ -0,0 +1,164 @@ +# -------------------------------------------------------------------------- # +# +# 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:32:21 November 16, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# LizardWizard_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 PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/pacman_vram_addr.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/LizardWizard.sv +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/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM3_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GFX1.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd + +# 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 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 LizardWizard + +# 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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" + +# 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 ENTITY(LizardWizard) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(LizardWizard) +# ------------------------ +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/README.txt b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/README.txt new file mode 100644 index 00000000..481e4e1b --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Lizzard Wizzard port to MiST by Gehstock +-- 10 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/Release/LizardWizard.rbf b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/Release/LizardWizard.rbf new file mode 100644 index 00000000..fadf4eb4 Binary files /dev/null and b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/Release/LizardWizard.rbf differ diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/clean.bat b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_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/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/LizardWizard.sv b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/LizardWizard.sv new file mode 100644 index 00000000..45bd82bd --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/LizardWizard.sv @@ -0,0 +1,192 @@ +//============================================================================ +// Arcade: LizardWizard +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module LizardWizard +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Liz. Wizard;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(reset), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [15:0] audio; +wire hsync,vsync; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid = ce_6m; +wire hs, vs; +wire rde, rhs, rvs; +wire [2:0] r,g,rr,rg; +wire [1:0] b,rb; +wire reset = status[0] | status[6] | buttons[1]; + +video_mixer #(.LINE_LENGTH(292), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(r), + .G(g), + .B(b), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(~reset), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + + +pacman LizardWizard +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + .in0_reg(~{2'b00, m_coin, 1'b0, m_down,m_right,m_left,m_up}), + .in1_reg(~{1'b0, m_start2, m_start1, m_fire, 4'b0000}), + .dipsw_reg(8'b0_1_11_00_11), + + .RESET(reset), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(~reset), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +endmodule diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..491ed13a --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"CC",X"EE",X"11",X"11",X"33",X"EE",X"CC",X"00",X"11",X"33",X"66",X"44",X"44",X"33",X"11",X"00", + X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00",X"00",X"00",X"77",X"77",X"22",X"00",X"00",X"00", + X"11",X"99",X"DD",X"DD",X"FF",X"77",X"33",X"00",X"33",X"77",X"55",X"44",X"44",X"66",X"22",X"00", + X"66",X"FF",X"99",X"99",X"99",X"33",X"22",X"00",X"44",X"66",X"77",X"55",X"44",X"44",X"00",X"00", + X"44",X"FF",X"FF",X"44",X"44",X"CC",X"CC",X"00",X"00",X"77",X"77",X"66",X"33",X"11",X"00",X"00", + X"EE",X"FF",X"11",X"11",X"11",X"33",X"22",X"00",X"00",X"55",X"55",X"55",X"55",X"77",X"77",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"EE",X"00",X"00",X"44",X"44",X"44",X"66",X"33",X"11",X"00", + X"00",X"00",X"88",X"FF",X"77",X"00",X"00",X"00",X"66",X"77",X"55",X"44",X"44",X"66",X"66",X"00", + X"66",X"77",X"DD",X"DD",X"99",X"99",X"66",X"00",X"00",X"33",X"44",X"44",X"55",X"77",X"33",X"00", + X"CC",X"EE",X"BB",X"99",X"99",X"99",X"00",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"10",X"00",X"30",X"70",X"F0",X"70",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"C3",X"E1",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"87",X"C3", + X"00",X"00",X"00",X"01",X"01",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00", + X"F0",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"70",X"3C",X"0F",X"1F",X"3F",X"3F",X"1F",X"0F", + X"0F",X"0F",X"8F",X"CF",X"EF",X"FF",X"FF",X"FF",X"E3",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"03",X"03",X"01",X"03",X"0F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"7F",X"7F",X"FF",X"3F",X"3F",X"3F",X"1F", + X"FF",X"FF",X"FF",X"FC",X"F8",X"F8",X"F8",X"F8",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"07",X"03",X"03",X"01",X"07",X"07",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC",X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33", + X"7F",X"7F",X"7F",X"7E",X"3C",X"78",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1E",X"F0", + X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"FC",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"30",X"32",X"77",X"70",X"F0",X"F0",X"10",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"E1",X"C3",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E1", + X"77",X"77",X"77",X"EF",X"CF",X"0F",X"8F",X"CF",X"00",X"00",X"00",X"00",X"11",X"11",X"77",X"77", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"E9",X"CF",X"8F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF",X"FF",X"77",X"11",X"11",X"11", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"E9",X"CF",X"8F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"FC",X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"10",X"30",X"70",X"F0",X"F0", + X"87",X"C3",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"EE",X"CC",X"00",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"30",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"10",X"10",X"00",X"30",X"70",X"F0", + X"F0",X"F0",X"87",X"0F",X"87",X"87",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"E0",X"00",X"01",X"83",X"00",X"FE",X"F0",X"F0",X"F0",X"E0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"33",X"00",X"84",X"86",X"FF",X"FF",X"FF",X"00",X"00",X"0E",X"0E",X"78", + X"FF",X"FF",X"FF",X"CC",X"00",X"00",X"0F",X"E1",X"FF",X"FF",X"FF",X"FF",X"88",X"00",X"00",X"03", + X"00",X"00",X"07",X"0F",X"0F",X"0E",X"00",X"F0",X"EE",X"CC",X"88",X"00",X"01",X"0F",X"0C",X"10", + X"07",X"0F",X"69",X"F0",X"C3",X"87",X"87",X"0F",X"00",X"07",X"0F",X"3C",X"78",X"70",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"70",X"30",X"00",X"00",X"70",X"30",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"07",X"00",X"60",X"F0",X"F0",X"F0",X"EE",X"CC",X"CC",X"EE",X"CC",X"88",X"10",X"F0", + X"00",X"70",X"30",X"00",X"C0",X"F0",X"F0",X"F0",X"00",X"00",X"E0",X"F0",X"30",X"30",X"30",X"10", + X"0C",X"00",X"C1",X"C3",X"C3",X"E1",X"E1",X"F0",X"0F",X"1F",X"F0",X"F0",X"10",X"C0",X"F0",X"F0", + X"00",X"03",X"0F",X"78",X"30",X"00",X"00",X"08",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"0F",X"0F", + X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00",X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00", + X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00",X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00", + X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"00",X"00",X"00",X"01",X"0F",X"88",X"00",X"00",X"00",X"10",X"10",X"D0",X"C3",X"33",X"00",X"00", + X"FE",X"FA",X"EC",X"C0",X"00",X"00",X"00",X"00",X"80",X"30",X"C4",X"10",X"00",X"00",X"00",X"00", + X"FC",X"F5",X"EE",X"40",X"00",X"00",X"00",X"00",X"00",X"54",X"A8",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"E8",X"FE",X"F4",X"00",X"00",X"00",X"00",X"00",X"50",X"11",X"FD", + X"00",X"00",X"00",X"00",X"60",X"F6",X"F9",X"F6",X"00",X"00",X"00",X"00",X"44",X"91",X"00",X"71", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00",X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00", + X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00",X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00", + X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00",X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00", + X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00",X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00", + X"0F",X"0F",X"F0",X"F0",X"00",X"80",X"00",X"00",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"3C",X"F0",X"F0",X"F0",X"30",X"10",X"00",X"00", + X"11",X"33",X"33",X"00",X"00",X"33",X"77",X"33",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"FF",X"FF",X"FF",X"FF",X"33",X"FF",X"FF",X"FF", + X"F0",X"70",X"70",X"30",X"30",X"30",X"10",X"00",X"00",X"CC",X"EE",X"EE",X"FF",X"FF",X"FF",X"CC", + X"F0",X"F0",X"F0",X"C0",X"00",X"F0",X"F0",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00", + X"C0",X"F0",X"F0",X"E0",X"00",X"10",X"F0",X"87",X"1E",X"1E",X"F0",X"70",X"00",X"F0",X"F0",X"F0", + X"00",X"30",X"F0",X"87",X"0F",X"0F",X"87",X"3C",X"00",X"00",X"30",X"70",X"30",X"10",X"F0",X"0F", + X"00",X"00",X"00",X"F0",X"96",X"0F",X"0F",X"F0",X"00",X"00",X"F0",X"F0",X"3C",X"0F",X"E1",X"F0", + X"84",X"07",X"F0",X"F0",X"F0",X"F0",X"70",X"30",X"98",X"00",X"30",X"70",X"70",X"70",X"00",X"CC", + X"0F",X"00",X"0C",X"0F",X"0F",X"0F",X"87",X"F0",X"0C",X"08",X"0F",X"E1",X"C3",X"F0",X"F0",X"F0", + X"87",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"C3",X"F0",X"F0",X"70",X"F0",X"1E",X"0F",X"3C",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"1E", + X"00",X"0E",X"E0",X"F0",X"F0",X"F0",X"F0",X"10",X"CC",X"01",X"01",X"03",X"30",X"30",X"00",X"88", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"80",X"30",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C3",X"F0",X"F0",X"F0",X"F0",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"3C",X"96",X"C3",X"E1",X"F0",X"F0",X"1E",X"87",X"E1",X"F0",X"F0",X"3C",X"F0",X"F0", + X"F0",X"F0",X"0F",X"1E",X"3C",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"C3",X"87",X"0F",X"3C",X"F0", + X"33",X"33",X"11",X"00",X"00",X"00",X"00",X"11",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"FF",X"FF",X"FF",X"77",X"11",X"33",X"77",X"FF", + X"00",X"FF",X"FF",X"FF",X"00",X"00",X"30",X"70",X"FF",X"FF",X"FF",X"FF",X"EE",X"EE",X"FF",X"EE", + X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"C0",X"00",X"00",X"FF",X"FF",X"00",X"00",X"E0",X"F0", + X"F0",X"10",X"00",X"30",X"00",X"00",X"00",X"F0",X"F0",X"00",X"00",X"00",X"EE",X"00",X"00",X"10", + X"F0",X"10",X"F0",X"F0",X"F0",X"F0",X"70",X"80",X"F0",X"C0",X"10",X"E0",X"70",X"10",X"00",X"10", + X"00",X"20",X"E0",X"D1",X"D1",X"D1",X"B3",X"80",X"00",X"00",X"00",X"10",X"70",X"30",X"30",X"00", + X"FF",X"FF",X"FF",X"FF",X"EE",X"CC",X"88",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77", + X"70",X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"F0",X"EE",X"CC",X"CC",X"10",X"10",X"10",X"21",X"E1", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"1E",X"1E", + X"F0",X"F0",X"E1",X"C3",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"E0",X"E0",X"F0",X"F0",X"3C",X"1E",X"0F",X"0F",X"F0",X"F0",X"78",X"1E",X"0F",X"0F",X"0F",X"C3", + X"F0",X"70",X"F0",X"F0",X"F0",X"C3",X"0F",X"0F",X"70",X"00",X"F0",X"F0",X"F0",X"F0",X"78",X"0F", + X"40",X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"08",X"0F",X"0F",X"07",X"61",X"E1",X"C3", + X"0F",X"07",X"00",X"80",X"C0",X"F0",X"F0",X"F0",X"0F",X"00",X"C0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"07",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"FF",X"0E",X"08",X"03",X"0F",X"07",X"00",X"EE",X"FF", + X"0F",X"01",X"C0",X"3C",X"F0",X"E1",X"00",X"00",X"0C",X"78",X"3C",X"0F",X"F0",X"1C",X"00",X"CC", + X"F0",X"3C",X"1E",X"0F",X"0F",X"0F",X"07",X"07",X"0F",X"0F",X"00",X"0E",X"0F",X"0F",X"00",X"88", + X"0F",X"0F",X"0F",X"0F",X"0F",X"87",X"C3",X"F0",X"0F",X"0F",X"0F",X"0F",X"C3",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"88",X"FF",X"FF",X"FF",X"FF",X"CC",X"FF",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"01",X"00",X"00",X"88",X"CC",X"0F",X"07",X"01",X"00",X"00",X"88",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"80",X"00",X"00",X"88",X"00",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"40",X"00",X"00",X"44",X"00",X"40",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"20",X"00",X"00",X"22",X"00",X"20",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"10",X"00",X"00",X"11",X"00",X"10",X"10", + X"88",X"80",X"00",X"00",X"88",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"40",X"00",X"00",X"44",X"00",X"40",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"20",X"00",X"00",X"22",X"00",X"20",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"10",X"00",X"00",X"11",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"E8",X"E4",X"EC",X"E0",X"C0",X"00",X"00",X"10",X"30",X"30",X"30",X"10",X"00",X"00", + X"00",X"E0",X"F4",X"F2",X"F6",X"F0",X"60",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"70",X"F2",X"F1",X"F3",X"70",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"00", + X"00",X"30",X"71",X"70",X"71",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C8",X"C8",X"C0",X"80",X"00", + X"00",X"10",X"30",X"30",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E8",X"E4",X"EC",X"E0",X"C0",X"00", + X"00",X"00",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"F4",X"F2",X"F6",X"F0",X"60",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"70",X"F2",X"F1",X"F3",X"70",X"30",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"C0",X"C8",X"C8",X"C0",X"80",X"00",X"00",X"30",X"71",X"70",X"71",X"30",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"E8",X"E4",X"EC",X"E0",X"C0",X"00",X"00",X"10",X"30",X"30",X"30",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C0",X"E8",X"E4",X"EC",X"E0",X"00",X"00",X"00",X"10",X"30",X"30",X"30",X"10", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"E8",X"E4",X"EC",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30", + X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"E8",X"E4",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30", + X"EC",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E8",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30", + X"E4",X"EC",X"E0",X"C0",X"00",X"00",X"00",X"00",X"30",X"30",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10", + X"E8",X"E4",X"EC",X"E0",X"C0",X"00",X"00",X"00",X"30",X"30",X"30",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"E8",X"E4",X"EC",X"E0",X"C0",X"00",X"00",X"10",X"30",X"30",X"30",X"10",X"00",X"00",X"00", + X"80",X"F9",X"FE",X"F4",X"FE",X"FA",X"EC",X"C0",X"30",X"50",X"11",X"FD",X"91",X"30",X"C4",X"10", + X"80",X"E8",X"F4",X"FF",X"F5",X"FE",X"FA",X"A0",X"00",X"64",X"91",X"98",X"33",X"D1",X"10",X"00", + X"60",X"F6",X"F9",X"F6",X"FC",X"F5",X"FE",X"40",X"00",X"22",X"99",X"B3",X"B9",X"44",X"30",X"00", + X"0C",X"02",X"01",X"11",X"F7",X"81",X"02",X"0C",X"03",X"04",X"18",X"58",X"78",X"38",X"04",X"03", + X"0C",X"02",X"01",X"10",X"F8",X"89",X"02",X"0C",X"03",X"04",X"19",X"5D",X"7F",X"3B",X"04",X"03", + X"0E",X"01",X"88",X"88",X"FC",X"CC",X"01",X"0E",X"01",X"02",X"04",X"26",X"37",X"15",X"02",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"80",X"80",X"08",X"00",X"00", + X"0F",X"00",X"44",X"44",X"FE",X"EE",X"00",X"0F",X"00",X"01",X"02",X"13",X"13",X"02",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"04",X"40",X"C0",X"04",X"08",X"00", + X"07",X"08",X"22",X"AA",X"FF",X"77",X"08",X"07",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"04",X"02",X"20",X"E0",X"02",X"04",X"08", + X"03",X"04",X"19",X"5D",X"7F",X"3B",X"04",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"01",X"10",X"F8",X"89",X"02",X"0C", + X"01",X"02",X"04",X"26",X"37",X"15",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"80",X"80",X"08",X"00",X"00",X"0E",X"01",X"88",X"88",X"FC",X"CC",X"01",X"0E", + X"00",X"01",X"02",X"13",X"13",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"08",X"04",X"40",X"C0",X"04",X"08",X"00",X"0F",X"00",X"44",X"44",X"FE",X"EE",X"00",X"0F", + X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"04",X"02",X"20",X"E0",X"02",X"04",X"08",X"07",X"08",X"22",X"AA",X"FF",X"77",X"08",X"07", + X"00",X"00",X"88",X"F8",X"10",X"00",X"00",X"00",X"00",X"00",X"33",X"FF",X"DD",X"11",X"00",X"00", + X"00",X"00",X"00",X"10",X"F8",X"88",X"00",X"00",X"00",X"00",X"11",X"DD",X"FF",X"33",X"00",X"00", + X"00",X"0C",X"02",X"01",X"10",X"F8",X"89",X"02",X"00",X"03",X"04",X"19",X"5D",X"7F",X"3B",X"04", + X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0C",X"02",X"01",X"10",X"F8",X"89",X"00",X"00",X"03",X"04",X"19",X"5D",X"7F",X"3B", + X"02",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"02",X"01",X"10",X"F8",X"00",X"00",X"00",X"03",X"04",X"19",X"5D",X"7F", + X"89",X"02",X"0C",X"00",X"00",X"00",X"00",X"00",X"3B",X"04",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0C",X"02",X"01",X"10",X"00",X"00",X"00",X"00",X"03",X"04",X"19",X"5D", + X"F8",X"89",X"02",X"0C",X"00",X"00",X"00",X"00",X"7F",X"3B",X"04",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"03",X"04",X"19", + X"10",X"F8",X"89",X"02",X"0C",X"00",X"00",X"00",X"5D",X"7F",X"3B",X"04",X"03",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04", + X"01",X"10",X"F8",X"89",X"02",X"0C",X"00",X"00",X"19",X"5D",X"7F",X"3B",X"04",X"03",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"02",X"01",X"10",X"F8",X"89",X"02",X"0C",X"00",X"04",X"19",X"5D",X"7F",X"3B",X"04",X"03",X"00", + X"60",X"F7",X"EC",X"EA",X"F5",X"72",X"66",X"60",X"00",X"11",X"64",X"10",X"22",X"10",X"00",X"00", + X"64",X"F9",X"F7",X"FE",X"FA",X"F7",X"FD",X"62",X"74",X"51",X"80",X"64",X"33",X"20",X"C4",X"00", + X"62",X"F9",X"FA",X"F7",X"F4",X"FE",X"FB",X"64",X"88",X"20",X"A2",X"D8",X"00",X"F3",X"22",X"00", + X"60",X"F6",X"F9",X"76",X"FC",X"F5",X"FE",X"62",X"33",X"40",X"BB",X"80",X"A8",X"44",X"30",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1E",X"1E",X"2C",X"2C",X"48",X"48",X"48",X"48", + X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"80",X"80",X"0F",X"0F",X"0F",X"0F",X"1E",X"1E",X"3C",X"3C", + X"C0",X"E0",X"68",X"68",X"68",X"48",X"48",X"48",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"3C",X"3C",X"68",X"68",X"68",X"48",X"C0",X"C0",X"F0",X"78",X"69",X"2D",X"2D",X"2D",X"0F",X"0F", + X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"FC",X"FC",X"F8",X"F8",X"F8",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0", + X"F3",X"F3",X"F3",X"F3",X"71",X"70",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"48",X"48",X"68",X"2C",X"3C",X"3C",X"3C",X"3C", + X"80",X"C0",X"C0",X"68",X"68",X"68",X"3C",X"3C",X"1E",X"0F",X"0F",X"2D",X"2D",X"69",X"78",X"F0", + X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"FC",X"FC", + X"F0",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"30",X"70",X"71",X"F3",X"F3",X"F3",X"F3",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"BB",X"30",X"30",X"33",X"33",X"30",X"30",X"FF",X"11",X"11",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"30",X"30",X"33",X"33",X"B8",X"FC",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"FF", + X"00",X"00",X"00",X"05",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"0A",X"00",X"00",X"00", + X"AA",X"22",X"C5",X"E0",X"E0",X"C5",X"22",X"AA",X"88",X"55",X"75",X"F0",X"F0",X"75",X"55",X"88", + X"00",X"00",X"00",X"05",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"0A",X"00",X"00",X"00", + X"00",X"33",X"EE",X"CC",X"CC",X"EE",X"33",X"00",X"22",X"33",X"33",X"FF",X"FF",X"33",X"33",X"22", + X"00",X"30",X"E0",X"C0",X"C0",X"E0",X"30",X"00",X"20",X"30",X"30",X"F0",X"F0",X"30",X"30",X"20", + X"30",X"30",X"33",X"33",X"30",X"30",X"33",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"BB",X"30",X"30",X"33",X"33",X"30",X"30",X"FF",X"11",X"11",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"30",X"30",X"33",X"33",X"B8",X"FC",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"FF", + X"00",X"00",X"00",X"05",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"0A",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01", + X"00",X"00",X"02",X"03",X"01",X"0B",X"0F",X"07",X"0E",X"07",X"87",X"C3",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"00",X"0E",X"1A",X"30",X"00",X"0B",X"0B",X"1C",X"3C",X"78",X"F0",X"E1",X"A1", + X"1E",X"78",X"F0",X"E1",X"E1",X"F0",X"F0",X"B4",X"09",X"00",X"80",X"08",X"09",X"0F",X"87",X"0C", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01", + X"00",X"00",X"02",X"03",X"01",X"0B",X"0F",X"07",X"0E",X"07",X"87",X"C3",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"00",X"0E",X"1A",X"30",X"00",X"0B",X"0B",X"0D",X"0F",X"0F",X"1E",X"12",X"10", + X"1E",X"1E",X"3C",X"78",X"F0",X"F0",X"F0",X"5A",X"09",X"00",X"80",X"08",X"09",X"0F",X"87",X"84", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01", + X"00",X"00",X"02",X"03",X"01",X"0B",X"0F",X"07",X"0E",X"07",X"87",X"C3",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"00",X"0E",X"1A",X"30",X"00",X"0B",X"0B",X"0D",X"0F",X"0F",X"0F",X"03",X"01", + X"1E",X"1E",X"1E",X"1E",X"1E",X"3C",X"78",X"3C",X"09",X"80",X"80",X"C0",X"C1",X"C3",X"C3",X"68", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01", + X"00",X"00",X"02",X"03",X"01",X"0B",X"0F",X"07",X"0E",X"07",X"87",X"C3",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"00",X"0E",X"92",X"B0",X"80",X"0B",X"0B",X"0D",X"0F",X"0F",X"0F",X"03",X"01", + X"1E",X"1E",X"0F",X"0F",X"1E",X"3C",X"78",X"2D",X"09",X"C0",X"C0",X"E0",X"F0",X"F0",X"B4",X"A4", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01", + X"00",X"00",X"02",X"03",X"01",X"0B",X"0F",X"07",X"0E",X"07",X"87",X"C3",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"C0",X"F0",X"F0",X"50",X"00",X"0B",X"0B",X"0D",X"0F",X"0F",X"0F",X"03",X"01", + X"1E",X"1E",X"0F",X"0F",X"1E",X"3C",X"78",X"1E",X"09",X"C0",X"F0",X"F0",X"F0",X"F0",X"D2",X"58", + X"08",X"08",X"08",X"0C",X"0C",X"0C",X"0E",X"06",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01", + X"01",X"01",X"01",X"01",X"00",X"0B",X"0F",X"07",X"F6",X"ED",X"6B",X"6B",X"0F",X"0F",X"0F",X"0F", + X"8E",X"0E",X"0E",X"0C",X"00",X"0E",X"1A",X"30",X"0B",X"0B",X"1C",X"3C",X"78",X"F0",X"E1",X"A1", + X"1E",X"78",X"F0",X"E1",X"E1",X"F0",X"F0",X"B4",X"0F",X"07",X"83",X"09",X"08",X"0C",X"87",X"0F", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01", + X"00",X"00",X"02",X"03",X"01",X"0B",X"0F",X"07",X"0E",X"07",X"87",X"C3",X"4B",X"0F",X"0F",X"0F", + X"0C",X"66",X"EE",X"88",X"0E",X"1A",X"30",X"00",X"0B",X"0B",X"1C",X"3C",X"78",X"F0",X"E1",X"A1", + X"1E",X"78",X"F0",X"E1",X"E1",X"F0",X"F0",X"B4",X"19",X"91",X"F3",X"7B",X"09",X"0F",X"87",X"0C", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01", + X"00",X"00",X"02",X"03",X"01",X"0B",X"0F",X"07",X"0E",X"07",X"87",X"C3",X"4B",X"0F",X"0F",X"0F", + X"0C",X"66",X"EE",X"88",X"0E",X"1A",X"30",X"00",X"0B",X"0B",X"0D",X"0F",X"0F",X"1E",X"12",X"10", + X"1E",X"1E",X"3C",X"78",X"F0",X"F0",X"F0",X"5A",X"19",X"91",X"F3",X"7B",X"09",X"0F",X"87",X"84", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01", + X"00",X"00",X"02",X"03",X"01",X"0B",X"0F",X"07",X"0E",X"07",X"87",X"C3",X"4B",X"0F",X"0F",X"0F", + X"0C",X"66",X"EE",X"88",X"0E",X"1A",X"30",X"00",X"0B",X"0B",X"0D",X"0F",X"0F",X"0F",X"03",X"01", + X"1E",X"1E",X"1E",X"1E",X"1E",X"3C",X"78",X"3C",X"19",X"91",X"F3",X"F3",X"C1",X"C3",X"C3",X"68", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01", + X"00",X"00",X"02",X"03",X"01",X"0B",X"0F",X"07",X"0E",X"07",X"87",X"C3",X"4B",X"0F",X"0F",X"0F", + X"0C",X"66",X"EE",X"88",X"0E",X"92",X"B0",X"80",X"0B",X"0B",X"0D",X"0F",X"0F",X"0F",X"03",X"01", + X"1E",X"1E",X"0F",X"0F",X"1E",X"3C",X"78",X"2D",X"19",X"D1",X"F3",X"F1",X"F0",X"F0",X"B4",X"A4", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01", + X"00",X"00",X"02",X"03",X"01",X"0B",X"0F",X"07",X"0E",X"07",X"87",X"C3",X"4B",X"0F",X"0F",X"0F", + X"0C",X"66",X"EE",X"C0",X"F0",X"F0",X"50",X"00",X"0B",X"0B",X"0D",X"0F",X"0F",X"0F",X"03",X"01", + X"1E",X"1E",X"0F",X"0F",X"1E",X"3C",X"78",X"1E",X"19",X"D1",X"F0",X"F0",X"F0",X"F0",X"D2",X"58", + X"08",X"08",X"08",X"0C",X"0C",X"0C",X"0E",X"06",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"01", + X"01",X"01",X"01",X"01",X"00",X"0B",X"0F",X"07",X"F6",X"ED",X"6B",X"6B",X"0F",X"0F",X"0F",X"0F", + X"8E",X"0E",X"0E",X"6E",X"EE",X"8E",X"1A",X"30",X"0B",X"0B",X"1C",X"3C",X"78",X"F0",X"E1",X"A1", + X"1E",X"78",X"F0",X"E1",X"E1",X"F0",X"F0",X"B4",X"0F",X"17",X"D3",X"59",X"7B",X"3F",X"87",X"0F", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"60",X"10",X"10",X"61",X"41",X"01",X"00",X"01", + X"00",X"EE",X"FF",X"45",X"45",X"0B",X"0F",X"07",X"0E",X"07",X"8F",X"CB",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"00",X"0E",X"1A",X"30",X"00",X"0B",X"0B",X"1E",X"3C",X"78",X"F0",X"E1",X"A1", + X"1E",X"78",X"F0",X"E1",X"E1",X"F0",X"F0",X"B4",X"09",X"00",X"80",X"08",X"09",X"0F",X"87",X"0C", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"60",X"10",X"10",X"61",X"41",X"01",X"00",X"01", + X"00",X"EE",X"FF",X"45",X"45",X"0B",X"0F",X"07",X"0E",X"07",X"8F",X"CB",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"00",X"0E",X"1A",X"30",X"00",X"0B",X"0B",X"0D",X"0F",X"0F",X"1E",X"12",X"10", + X"1E",X"1E",X"3C",X"78",X"F0",X"F0",X"F0",X"5A",X"09",X"00",X"80",X"08",X"09",X"0F",X"87",X"84", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"60",X"10",X"10",X"61",X"41",X"01",X"00",X"01", + X"00",X"EE",X"FF",X"45",X"45",X"0B",X"0F",X"07",X"0E",X"07",X"8F",X"CB",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"00",X"0E",X"1A",X"30",X"00",X"0B",X"0B",X"0D",X"0F",X"0F",X"0F",X"03",X"01", + X"1E",X"1E",X"1E",X"1E",X"1E",X"3C",X"78",X"3C",X"09",X"80",X"80",X"C0",X"C1",X"C3",X"C3",X"68", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"10",X"70",X"41",X"01",X"01",X"00",X"01", + X"00",X"EE",X"FF",X"45",X"45",X"0B",X"0F",X"07",X"0E",X"07",X"8F",X"CB",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"00",X"0E",X"92",X"B0",X"80",X"0B",X"0B",X"0D",X"0F",X"0F",X"0F",X"03",X"01", + X"1E",X"1E",X"0F",X"0F",X"1E",X"3C",X"78",X"2D",X"09",X"C0",X"C0",X"E0",X"F0",X"F0",X"B4",X"A4", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"10",X"70",X"41",X"01",X"01",X"00",X"01", + X"00",X"EE",X"FF",X"45",X"45",X"0B",X"0F",X"07",X"0E",X"07",X"8F",X"CB",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"C0",X"F0",X"F0",X"50",X"00",X"0B",X"0B",X"0D",X"0F",X"0F",X"0F",X"03",X"01", + X"1E",X"1E",X"0F",X"0F",X"1E",X"3C",X"78",X"1E",X"09",X"C0",X"F0",X"F0",X"F0",X"F0",X"D2",X"58", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"60",X"10",X"10",X"61",X"41",X"01",X"00",X"01", + X"00",X"EE",X"FF",X"45",X"45",X"0B",X"0F",X"07",X"0E",X"07",X"8F",X"CB",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"C0",X"F0",X"F0",X"50",X"00",X"0B",X"0B",X"0D",X"0F",X"0F",X"0F",X"03",X"01", + X"1E",X"1E",X"0F",X"0F",X"1E",X"3C",X"78",X"1E",X"09",X"C0",X"F0",X"F0",X"F0",X"F0",X"D2",X"58", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"60",X"10",X"10",X"61",X"41",X"01",X"00",X"01", + X"00",X"EE",X"FF",X"45",X"45",X"0B",X"0F",X"07",X"0E",X"07",X"8F",X"CB",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"00",X"0E",X"92",X"B0",X"80",X"0B",X"0B",X"0D",X"0F",X"0F",X"0F",X"03",X"01", + X"1E",X"1E",X"0F",X"0F",X"1E",X"3C",X"78",X"2D",X"09",X"C0",X"C0",X"E0",X"F0",X"F0",X"B4",X"A4", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"10",X"70",X"41",X"01",X"01",X"00",X"01", + X"00",X"EE",X"FF",X"45",X"45",X"0B",X"0F",X"07",X"0E",X"07",X"8F",X"CB",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"00",X"0E",X"1A",X"30",X"00",X"0B",X"0B",X"0D",X"0F",X"0F",X"0F",X"03",X"01", + X"1E",X"1E",X"1E",X"1E",X"1E",X"3C",X"78",X"3C",X"09",X"80",X"80",X"C0",X"C1",X"C3",X"C3",X"68", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"10",X"70",X"41",X"01",X"01",X"00",X"01", + X"00",X"EE",X"FF",X"45",X"45",X"0B",X"0F",X"07",X"0E",X"07",X"8F",X"CB",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"00",X"0E",X"1A",X"30",X"00",X"0B",X"0B",X"0D",X"0F",X"0F",X"1E",X"12",X"10", + X"1E",X"1E",X"3C",X"78",X"F0",X"F0",X"F0",X"5A",X"09",X"00",X"80",X"08",X"09",X"0F",X"87",X"84", + X"00",X"00",X"08",X"0C",X"04",X"8F",X"0F",X"0E",X"00",X"10",X"70",X"41",X"01",X"01",X"00",X"01", + X"00",X"EE",X"FF",X"45",X"45",X"0B",X"0F",X"07",X"0E",X"07",X"8F",X"CB",X"4B",X"0F",X"0F",X"0F", + X"0C",X"00",X"00",X"00",X"0E",X"1A",X"30",X"00",X"0B",X"0B",X"1E",X"3C",X"78",X"F0",X"E1",X"A1", + X"1E",X"78",X"F0",X"E1",X"E1",X"F0",X"F0",X"B4",X"09",X"00",X"80",X"08",X"09",X"0F",X"87",X"0C", + X"08",X"08",X"08",X"0C",X"0C",X"0C",X"0E",X"06",X"60",X"10",X"10",X"61",X"41",X"01",X"00",X"01", + X"01",X"EF",X"EF",X"45",X"00",X"0B",X"0F",X"07",X"F6",X"ED",X"6B",X"6B",X"0F",X"0F",X"0F",X"0F", + X"8E",X"0E",X"0E",X"0C",X"00",X"0E",X"1A",X"30",X"0B",X"0B",X"1C",X"3C",X"78",X"F0",X"E1",X"A1", + X"1E",X"78",X"F0",X"E1",X"E1",X"F0",X"F0",X"B4",X"0F",X"07",X"83",X"09",X"08",X"0C",X"87",X"0F", + X"08",X"08",X"08",X"0C",X"0C",X"0C",X"0E",X"06",X"00",X"10",X"70",X"41",X"01",X"01",X"00",X"01", + X"01",X"EF",X"EF",X"45",X"00",X"0B",X"0F",X"07",X"F6",X"ED",X"6B",X"6B",X"0F",X"0F",X"0F",X"0F", + X"8E",X"0E",X"0E",X"0C",X"00",X"0E",X"1A",X"30",X"0B",X"0B",X"1C",X"3C",X"78",X"F0",X"E1",X"A1", + X"1E",X"78",X"F0",X"E1",X"E1",X"F0",X"F0",X"B4",X"0F",X"07",X"83",X"09",X"08",X"0C",X"87",X"0F", + X"88",X"88",X"8A",X"09",X"0F",X"87",X"86",X"C2",X"30",X"F3",X"30",X"00",X"00",X"0F",X"0F",X"08", + X"76",X"76",X"76",X"00",X"05",X"2F",X"2F",X"22",X"FD",X"FD",X"FD",X"C1",X"0C",X"1E",X"1C",X"50", + X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C8",X"62",X"40",X"C8",X"62",X"40",X"C8",X"62", + X"88",X"88",X"8A",X"09",X"0F",X"87",X"86",X"C2",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"08", + X"76",X"76",X"76",X"00",X"05",X"2F",X"2F",X"22",X"FD",X"FD",X"FD",X"C1",X"0C",X"1E",X"1C",X"50", + X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C8",X"62",X"40",X"C8",X"62",X"40",X"C8", + X"88",X"88",X"8A",X"09",X"0F",X"87",X"86",X"C2",X"30",X"F3",X"30",X"00",X"00",X"0F",X"0F",X"08", + X"73",X"73",X"73",X"00",X"05",X"2F",X"2F",X"22",X"F6",X"F6",X"F6",X"C1",X"0C",X"1E",X"1C",X"50", + X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"62",X"40",X"C8",X"62",X"40",X"C8",X"62",X"40", + X"88",X"88",X"8A",X"09",X"0F",X"87",X"86",X"C2",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"08", + X"76",X"76",X"76",X"00",X"05",X"2F",X"2F",X"22",X"FD",X"FD",X"FD",X"C1",X"0C",X"1E",X"1C",X"50", + X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C8",X"62",X"40",X"C8",X"62",X"40",X"C8",X"62", + X"80",X"80",X"82",X"09",X"0F",X"87",X"86",X"C2",X"30",X"F3",X"30",X"00",X"00",X"0F",X"0F",X"08", + X"75",X"75",X"75",X"00",X"05",X"2F",X"2F",X"22",X"FB",X"FB",X"FB",X"C1",X"0C",X"1E",X"1C",X"50", + X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C8",X"62",X"40",X"C8",X"62",X"40",X"C8", + X"88",X"88",X"8A",X"09",X"0F",X"87",X"86",X"C2",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"08", + X"76",X"76",X"76",X"00",X"05",X"2F",X"2F",X"22",X"FD",X"FD",X"FD",X"C1",X"0C",X"1E",X"1C",X"50", + X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"62",X"40",X"C8",X"62",X"40",X"C8",X"62",X"40", + X"88",X"88",X"8A",X"09",X"0F",X"87",X"86",X"C2",X"30",X"F3",X"30",X"00",X"00",X"0F",X"0F",X"08", + X"76",X"76",X"76",X"00",X"05",X"2F",X"2F",X"22",X"FD",X"FD",X"FD",X"C1",X"0C",X"1E",X"1C",X"50", + X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"10",X"FE",X"88",X"00",X"00",X"00", + X"00",X"00",X"C0",X"F0",X"B0",X"80",X"00",X"00",X"C8",X"62",X"40",X"C8",X"62",X"40",X"C8",X"62", + X"88",X"88",X"8A",X"09",X"0F",X"87",X"86",X"C2",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"08", + X"76",X"76",X"76",X"00",X"05",X"2F",X"2F",X"22",X"FD",X"FD",X"FD",X"C1",X"0C",X"1E",X"1C",X"50", + X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"10",X"FE",X"88",X"00",X"00",X"00", + X"00",X"00",X"C0",X"F0",X"B0",X"80",X"00",X"00",X"40",X"C8",X"62",X"40",X"C8",X"62",X"40",X"C8", + X"88",X"88",X"8A",X"09",X"0F",X"87",X"86",X"C2",X"30",X"F3",X"30",X"00",X"00",X"0F",X"0F",X"08", + X"76",X"76",X"76",X"00",X"05",X"2F",X"2F",X"22",X"FD",X"FD",X"FD",X"C1",X"0C",X"1E",X"1C",X"50", + X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"10",X"FE",X"88",X"00",X"00",X"00", + X"00",X"00",X"C0",X"F0",X"B0",X"80",X"00",X"00",X"62",X"40",X"C8",X"62",X"40",X"C8",X"62",X"40", + X"88",X"88",X"8A",X"09",X"0F",X"87",X"86",X"C2",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"08", + X"76",X"76",X"76",X"00",X"05",X"2F",X"2F",X"22",X"FD",X"FD",X"FD",X"C1",X"0C",X"1E",X"1C",X"50", + X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"10",X"FE",X"88",X"00",X"00",X"00", + X"00",X"00",X"C0",X"F0",X"B0",X"80",X"00",X"00",X"C8",X"62",X"40",X"C8",X"62",X"40",X"C8",X"62", + X"88",X"88",X"8A",X"09",X"0F",X"87",X"86",X"C2",X"30",X"F3",X"30",X"00",X"00",X"0F",X"0F",X"08", + X"76",X"76",X"76",X"00",X"05",X"2F",X"2F",X"22",X"FD",X"FD",X"FD",X"C1",X"0C",X"1E",X"1C",X"50", + X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"10",X"FE",X"88",X"00",X"00",X"00", + X"00",X"00",X"C0",X"F0",X"B0",X"80",X"00",X"00",X"40",X"C8",X"62",X"40",X"C8",X"62",X"40",X"C8", + X"88",X"88",X"8A",X"09",X"0F",X"87",X"86",X"C2",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"08", + X"76",X"76",X"76",X"00",X"05",X"2F",X"2F",X"22",X"FD",X"FD",X"FD",X"C1",X"0C",X"1E",X"1C",X"50", + X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"10",X"FE",X"88",X"00",X"00",X"00", + X"00",X"00",X"C0",X"F0",X"B0",X"80",X"00",X"00",X"62",X"40",X"C8",X"62",X"40",X"C8",X"62",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"00",X"00",X"11",X"00",X"80",X"50",X"00",X"22",X"00",X"00",X"00",X"00",X"20",X"44",X"00",X"99", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"54",X"80",X"00",X"11",X"00",X"00",X"00",X"00",X"40",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00", + X"00",X"20",X"00",X"89",X"73",X"1C",X"75",X"FB",X"00",X"00",X"00",X"95",X"C0",X"EC",X"C3",X"B2", + X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"30",X"00",X"00",X"00",X"00", + X"F9",X"EE",X"52",X"1A",X"00",X"00",X"00",X"00",X"E7",X"E8",X"06",X"48",X"15",X"80",X"00",X"00", + X"00",X"44",X"00",X"00",X"10",X"00",X"00",X"40",X"00",X"22",X"00",X"01",X"00",X"41",X"01",X"03", + X"00",X"00",X"0A",X"0B",X"0E",X"6C",X"F3",X"59",X"00",X"80",X"2C",X"0C",X"86",X"9F",X"C3",X"CF", + X"00",X"00",X"00",X"22",X"80",X"00",X"44",X"00",X"03",X"10",X"01",X"00",X"80",X"00",X"00",X"00", + X"F6",X"5E",X"2D",X"4B",X"02",X"88",X"00",X"00",X"46",X"86",X"8B",X"0E",X"08",X"04",X"00",X"80", + X"00",X"00",X"28",X"08",X"04",X"48",X"2E",X"0C",X"00",X"10",X"01",X"00",X"24",X"03",X"03",X"07", + X"11",X"03",X"0D",X"0F",X"4F",X"1E",X"C4",X"3E",X"0C",X"C5",X"0B",X"2B",X"9E",X"0F",X"43",X"8B", + X"04",X"06",X"0E",X"84",X"00",X"88",X"80",X"00",X"07",X"01",X"02",X"07",X"23",X"16",X"01",X"00", + X"2C",X"0E",X"B4",X"0F",X"07",X"2D",X"0E",X"CB",X"63",X"8B",X"4B",X"06",X"1F",X"9F",X"0D",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"55",X"77",X"00",X"77",X"44",X"77",X"00",X"44",X"44",X"CC",X"00",X"CC",X"44",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"44",X"77",X"00",X"77",X"44",X"77",X"00",X"CC",X"44",X"CC",X"00",X"CC",X"44",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"55",X"55",X"00",X"55",X"55",X"77",X"00",X"44",X"44",X"CC",X"00",X"CC",X"44",X"44",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"44",X"77",X"00",X"77",X"44",X"77",X"00",X"CC",X"44",X"CC",X"00",X"CC",X"44",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"55",X"55",X"00",X"77",X"44",X"77",X"00",X"44",X"44",X"CC",X"00",X"CC",X"44",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"44",X"77",X"00",X"77",X"44",X"77",X"00",X"CC",X"44",X"CC",X"00",X"CC",X"44",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"77",X"44",X"00",X"77",X"44",X"77",X"00",X"88",X"CC",X"00",X"00",X"CC",X"44",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"44",X"77",X"00",X"77",X"44",X"77",X"00",X"CC",X"44",X"CC",X"00",X"CC",X"44",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"44",X"77",X"44",X"00",X"77",X"44",X"00",X"00",X"88",X"CC",X"00",X"00",X"CC",X"44", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"00",X"77",X"44",X"77",X"00",X"00",X"00",X"CC",X"00",X"CC",X"44",X"CC",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"22",X"3A",X"70",X"00",X"00",X"00",X"00",X"44",X"22",X"EA",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"3A",X"44",X"55",X"00",X"00",X"00",X"00",X"F0",X"EA",X"AA",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"55",X"44",X"3A",X"70",X"00",X"00",X"00",X"00",X"11",X"AA",X"EA",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"3A",X"22",X"11",X"00",X"00",X"00",X"00",X"F0",X"EA",X"22",X"44",X"00",X"00",X"00",X"00", + X"F0",X"3B",X"63",X"E5",X"3B",X"30",X"88",X"41",X"38",X"33",X"3A",X"08",X"D1",X"3B",X"78",X"28", + X"C4",X"40",X"40",X"E5",X"63",X"05",X"3B",X"C4",X"BE",X"E5",X"38",X"40",X"E4",X"C4",X"F0",X"41", + X"30",X"5F",X"0A",X"3B",X"9C",X"E5",X"B2",X"89",X"3B",X"30",X"0C",X"B1",X"30",X"60",X"59",X"3B", + X"20",X"FE",X"38",X"6B",X"5D",X"C4",X"40",X"88",X"6B",X"63",X"3B",X"3A",X"04",X"F6",X"19",X"78", + X"0A",X"3B",X"00",X"21",X"1E",X"89",X"00",X"89",X"0C",X"B1",X"00",X"89",X"59",X"3B",X"00",X"89", + X"38",X"00",X"89",X"89",X"40",X"00",X"89",X"89",X"3B",X"00",X"89",X"89",X"19",X"75",X"89",X"C8", + X"E5",X"40",X"00",X"89",X"41",X"3B",X"60",X"61",X"08",X"38",X"14",X"29",X"28",X"F0",X"68",X"69", + X"3A",X"F0",X"80",X"A8",X"08",X"00",X"C0",X"89",X"3A",X"00",X"88",X"E0",X"00",X"00",X"89",X"89", + X"89",X"89",X"04",X"89",X"F0",X"F0",X"89",X"89",X"89",X"F0",X"89",X"89",X"F0",X"F0",X"89",X"4C", + X"F0",X"A9",X"24",X"EA",X"A1",X"89",X"64",X"AB",X"E8",X"E1",X"2C",X"A3",X"89",X"89",X"6C",X"E3", + X"F0",X"89",X"89",X"05",X"89",X"89",X"0C",X"45",X"89",X"89",X"F0",X"0D",X"89",X"89",X"44",X"4D", + X"89",X"89",X"25",X"EB",X"89",X"F0",X"65",X"0E",X"89",X"89",X"2D",X"06",X"F0",X"E9",X"6D",X"46", + X"4E",X"F0",X"AF",X"89",X"81",X"26",X"EF",X"50",X"F0",X"81",X"E7",X"18",X"07",X"2E",X"10",X"29", + X"67",X"8F",X"89",X"89",X"86",X"CF",X"80",X"A8",X"6F",X"C7",X"89",X"C8",X"8E",X"A6",X"88",X"E0", + X"0F",X"66",X"60",X"61",X"4F",X"27",X"21",X"89",X"47",X"6E",X"68",X"69",X"C1",X"2F",X"89",X"89", + X"C6",X"AE",X"C0",X"89",X"CE",X"EE",X"89",X"89",X"C1",X"E6",X"89",X"89",X"87",X"A7",X"89",X"89", + X"41",X"49",X"00",X"61",X"41",X"48",X"48",X"68",X"41",X"41",X"41",X"28",X"09",X"14",X"E0",X"BD", + X"FF",X"27",X"08",X"01",X"68",X"21",X"00",X"49",X"49",X"63",X"A2",X"FF",X"28",X"41",X"40",X"09", + X"08",X"FF",X"00",X"63",X"80",X"40",X"08",X"40",X"48",X"49",X"09",X"21",X"00",X"01",X"49",X"41", + X"68",X"40",X"20",X"08",X"63",X"08",X"09",X"00",X"8A",X"69",X"41",X"A2",X"68",X"00",X"40",X"40", + X"20",X"40",X"09",X"00",X"09",X"09",X"01",X"20",X"41",X"08",X"40",X"40",X"40",X"21",X"FF",X"41", + X"20",X"49",X"49",X"09",X"09",X"08",X"08",X"01",X"41",X"40",X"09",X"40",X"40",X"A2",X"A2",X"FF", + X"01",X"08",X"49",X"09",X"49",X"00",X"08",X"01",X"FF",X"4A",X"09",X"40",X"09",X"40",X"4A",X"FF", + X"01",X"00",X"00",X"49",X"49",X"20",X"20",X"08",X"FF",X"40",X"40",X"09",X"09",X"41",X"41",X"07", + X"00",X"49",X"FF",X"6B",X"20",X"41",X"09",X"40",X"40",X"09",X"49",X"00",X"41",X"08",X"40",X"20", + X"41",X"2E",X"FF",X"40",X"40",X"40",X"09",X"41",X"09",X"00",X"49",X"20",X"01",X"20",X"49",X"09", + X"09",X"2E",X"08",X"41",X"01",X"40",X"21",X"40",X"40",X"00",X"09",X"09",X"FF",X"20",X"08",X"01", + X"FF",X"41",X"40",X"40",X"09",X"40",X"2E",X"FF",X"49",X"09",X"08",X"01",X"08",X"01",X"00",X"49", + X"09",X"40",X"40",X"00",X"6B",X"FF",X"FF",X"20",X"08",X"01",X"01",X"40",X"00",X"49",X"49",X"41", + X"40",X"09",X"49",X"09",X"41",X"C7",X"08",X"01",X"20",X"08",X"09",X"40",X"09",X"00",X"AF",X"FF", + X"40",X"09",X"09",X"09",X"41",X"2E",X"08",X"01",X"20",X"08",X"41",X"40",X"09",X"00",X"AF",X"FF", + X"40",X"40",X"00",X"49",X"FF",X"41",X"20",X"40",X"01",X"20",X"40",X"09",X"49",X"09",X"41",X"08", + X"BA",X"DA",X"69",X"28",X"DA",X"DB",X"28",X"28",X"93",X"DA",X"69",X"69",X"DA",X"D3",X"28",X"28", + X"F0",X"F0",X"28",X"F0",X"F0",X"F0",X"F0",X"F0",X"93",X"D2",X"69",X"DA",X"F0",X"F0",X"F0",X"F0", + X"9A",X"D3",X"28",X"28",X"9A",X"F0",X"28",X"28",X"B2",X"9B",X"69",X"69",X"B2",X"F0",X"28",X"28", + X"F0",X"F0",X"F0",X"F0",X"F0",X"69",X"F0",X"F0",X"DA",X"9A",X"B2",X"D2",X"F0",X"69",X"F0",X"F0", + X"F0",X"28",X"C3",X"0B",X"B3",X"28",X"23",X"0B",X"BA",X"69",X"0B",X"C3",X"FA",X"28",X"C4",X"23", + X"28",X"69",X"23",X"02",X"28",X"8C",X"C3",X"0B",X"69",X"69",X"0B",X"23",X"28",X"02",X"0B",X"C3", + X"FA",X"28",X"02",X"CC",X"28",X"28",X"02",X"02",X"F2",X"69",X"02",X"02",X"28",X"28",X"23",X"02", + X"28",X"02",X"23",X"0B",X"69",X"23",X"02",X"8D",X"69",X"02",X"85",X"23",X"69",X"0B",X"02",X"02", + X"02",X"02",X"0B",X"C3",X"23",X"02",X"AC",X"23",X"02",X"02",X"23",X"0B",X"0B",X"23",X"02",X"84", + X"CD",X"23",X"0B",X"23",X"02",X"02",X"0B",X"C3",X"02",X"A4",X"C3",X"0B",X"02",X"02",X"23",X"0B", + X"C3",X"0B",X"02",X"8C",X"23",X"0B",X"23",X"02",X"0B",X"C3",X"02",X"02",X"C5",X"23",X"0B",X"23", + X"23",X"02",X"8C",X"23",X"C3",X"0B",X"02",X"8C",X"0B",X"23",X"8C",X"C4",X"0B",X"C3",X"02",X"02", + X"02",X"02",X"23",X"0B",X"0B",X"23",X"8C",X"40",X"23",X"02",X"C5",X"23",X"C3",X"0B",X"02",X"40", + X"8C",X"8D",X"40",X"40",X"02",X"02",X"40",X"40",X"02",X"8C",X"40",X"40",X"23",X"02",X"40",X"40", + X"0B",X"C3",X"02",X"40",X"CC",X"23",X"0B",X"40",X"23",X"0B",X"23",X"40",X"8C",X"85",X"C3",X"40", + X"0B",X"23",X"40",X"40",X"0B",X"C3",X"40",X"40",X"C3",X"0B",X"40",X"40",X"23",X"0B",X"40",X"A0", + X"69",X"09",X"08",X"01",X"00",X"49",X"00",X"49",X"08",X"08",X"A2",X"FF",X"08",X"21",X"40",X"48", + X"79",X"20",X"20",X"08",X"21",X"09",X"09",X"00",X"28",X"41",X"41",X"86",X"40",X"40",X"40",X"40", + X"41",X"09",X"20",X"08",X"A0",X"20",X"09",X"00",X"48",X"40",X"41",X"86",X"00",X"08",X"40",X"40", + X"08",X"01",X"01",X"20",X"00",X"49",X"49",X"09",X"A2",X"FF",X"FF",X"41",X"40",X"48",X"48",X"40", + X"01",X"20",X"20",X"08",X"49",X"09",X"09",X"00",X"FF",X"41",X"41",X"99",X"48",X"40",X"40",X"40", + X"08",X"01",X"01",X"20",X"00",X"49",X"49",X"09",X"19",X"FF",X"FF",X"41",X"40",X"48",X"48",X"40", + X"08",X"01",X"01",X"20",X"00",X"49",X"49",X"09",X"19",X"FF",X"FF",X"41",X"40",X"48",X"48",X"40", + X"20",X"08",X"08",X"01",X"09",X"00",X"00",X"49",X"41",X"99",X"C7",X"FF",X"40",X"40",X"40",X"48", + X"08",X"01",X"01",X"20",X"00",X"49",X"49",X"09",X"C7",X"FF",X"FF",X"41",X"40",X"48",X"48",X"40", + X"20",X"08",X"08",X"01",X"09",X"00",X"00",X"49",X"41",X"99",X"9C",X"FF",X"40",X"40",X"40",X"48", + X"20",X"08",X"08",X"01",X"09",X"00",X"00",X"49",X"41",X"99",X"9C",X"FF",X"40",X"40",X"40",X"48", + X"01",X"20",X"20",X"08",X"49",X"09",X"09",X"00",X"FF",X"41",X"41",X"5B",X"48",X"40",X"40",X"40", + X"20",X"08",X"08",X"01",X"09",X"00",X"00",X"49",X"41",X"5B",X"19",X"FF",X"40",X"40",X"40",X"48", + X"01",X"20",X"20",X"08",X"49",X"09",X"09",X"00",X"FF",X"41",X"41",X"5D",X"48",X"40",X"40",X"40", + X"01",X"20",X"20",X"08",X"49",X"09",X"09",X"00",X"FF",X"41",X"41",X"5D",X"48",X"40",X"40",X"40", + X"08",X"01",X"01",X"20",X"00",X"49",X"49",X"09",X"19",X"FF",X"FF",X"41",X"40",X"48",X"48",X"40"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..aabaa143 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"01",X"0C",X"0F",X"00",X"05",X"03",X"09",X"00",X"07",X"02",X"08", + X"00",X"0D",X"06",X"0E",X"00",X"0B",X"01",X"0A",X"00",X"04",X"03",X"09",X"00",X"06",X"04",X"09", + X"00",X"0B",X"09",X"04",X"00",X"0A",X"04",X"09",X"00",X"0D",X"01",X"06",X"00",X"05",X"03",X"00", + X"00",X"05",X"01",X"02",X"00",X"05",X"07",X"02",X"00",X"05",X"03",X"0D",X"00",X"03",X"05",X"01", + X"00",X"05",X"07",X"01",X"00",X"00",X"04",X"09",X"00",X"05",X"04",X"09",X"01",X"05",X"04",X"09", + X"00",X"01",X"04",X"09",X"0D",X"0D",X"04",X"09",X"02",X"02",X"04",X"09",X"01",X"0A",X"04",X"09", + X"00",X"02",X"08",X"0F",X"00",X"0B",X"0A",X"0F",X"00",X"05",X"04",X"03",X"00",X"0A",X"0A",X"0A", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..85afc9ad --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"62",X"85",X"2F",X"07",X"1D",X"28",X"8C",X"C7",X"3F",X"F8",X"C9",X"AC",X"18",X"38",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..b384853d --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"31",X"F1",X"4F",X"C3",X"59",X"00",X"21",X"16",X"40",X"11",X"17",X"40",X"01",X"08",X"00",X"36", + X"40",X"ED",X"B0",X"3A",X"A1",X"4D",X"FE",X"00",X"C8",X"47",X"3E",X"3A",X"21",X"1D",X"40",X"77", + X"2B",X"10",X"FC",X"C9",X"00",X"08",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"08",X"0A",X"21",X"02",X"40",X"11",X"03", + X"40",X"01",X"08",X"00",X"36",X"40",X"ED",X"B0",X"3A",X"A2",X"4D",X"FE",X"00",X"C8",X"47",X"3E", + X"3A",X"21",X"02",X"40",X"77",X"23",X"10",X"FC",X"C9",X"AF",X"06",X"08",X"21",X"00",X"50",X"77", + X"23",X"10",X"FC",X"3A",X"00",X"50",X"CB",X"67",X"C2",X"57",X"03",X"AF",X"06",X"08",X"21",X"00", + X"50",X"77",X"23",X"10",X"FC",X"C3",X"95",X"00",X"06",X"03",X"0E",X"0F",X"3E",X"21",X"ED",X"A0", + X"CD",X"52",X"16",X"10",X"F7",X"23",X"23",X"3E",X"40",X"CD",X"52",X"16",X"CD",X"9C",X"11",X"3E", + X"04",X"CD",X"E3",X"15",X"C9",X"3E",X"00",X"32",X"03",X"50",X"31",X"F1",X"4F",X"CD",X"24",X"12", + X"F3",X"08",X"AF",X"08",X"21",X"00",X"40",X"CD",X"D2",X"02",X"08",X"CB",X"47",X"28",X"02",X"CB", + X"D7",X"CB",X"4F",X"28",X"02",X"CB",X"DF",X"08",X"21",X"00",X"44",X"CD",X"D2",X"02",X"08",X"CB", + X"47",X"28",X"02",X"CB",X"E7",X"CB",X"4F",X"28",X"02",X"CB",X"EF",X"08",X"31",X"FD",X"43",X"21", + X"00",X"4C",X"CD",X"D2",X"02",X"08",X"CB",X"47",X"28",X"02",X"CB",X"F7",X"CB",X"4F",X"28",X"02", + X"CB",X"FF",X"08",X"3E",X"01",X"CD",X"55",X"15",X"21",X"00",X"40",X"11",X"01",X"40",X"01",X"FE", + X"03",X"36",X"40",X"ED",X"B0",X"11",X"66",X"41",X"21",X"ED",X"1B",X"3E",X"01",X"06",X"0B",X"CD", + X"66",X"16",X"11",X"8A",X"40",X"21",X"F8",X"1B",X"3E",X"01",X"06",X"18",X"CD",X"66",X"16",X"11", + X"EC",X"40",X"21",X"10",X"1C",X"3E",X"01",X"06",X"14",X"CD",X"66",X"16",X"11",X"ED",X"40",X"21", + X"24",X"1C",X"3E",X"01",X"06",X"14",X"CD",X"66",X"16",X"11",X"EE",X"40",X"21",X"38",X"1C",X"3E", + X"01",X"06",X"14",X"CD",X"66",X"16",X"11",X"EF",X"40",X"21",X"4C",X"1C",X"3E",X"01",X"06",X"14", + X"CD",X"66",X"16",X"11",X"93",X"40",X"21",X"DC",X"1C",X"3E",X"01",X"06",X"18",X"CD",X"66",X"16", + X"11",X"F5",X"40",X"21",X"60",X"1C",X"3E",X"01",X"06",X"14",X"CD",X"66",X"16",X"11",X"F6",X"40", + X"21",X"74",X"1C",X"3E",X"01",X"06",X"14",X"CD",X"66",X"16",X"11",X"F7",X"40",X"21",X"88",X"1C", + X"3E",X"01",X"06",X"14",X"CD",X"66",X"16",X"11",X"F8",X"40",X"21",X"9C",X"1C",X"3E",X"01",X"06", + X"14",X"CD",X"66",X"16",X"11",X"F9",X"40",X"21",X"B0",X"1C",X"3E",X"01",X"06",X"14",X"CD",X"66", + X"16",X"11",X"FA",X"40",X"21",X"C4",X"1C",X"3E",X"01",X"06",X"14",X"CD",X"66",X"16",X"08",X"32", + X"FB",X"4D",X"08",X"3A",X"FB",X"4D",X"CB",X"57",X"28",X"0D",X"11",X"F5",X"40",X"21",X"D8",X"1C", + X"3E",X"01",X"06",X"04",X"CD",X"66",X"16",X"3A",X"FB",X"4D",X"CB",X"5F",X"28",X"0D",X"11",X"F6", + X"40",X"21",X"D8",X"1C",X"3E",X"01",X"06",X"04",X"CD",X"66",X"16",X"3A",X"FB",X"4D",X"CB",X"67", + X"28",X"0D",X"11",X"F7",X"40",X"21",X"D8",X"1C",X"3E",X"01",X"06",X"04",X"CD",X"66",X"16",X"3A", + X"FB",X"4D",X"CB",X"6F",X"28",X"0D",X"11",X"F8",X"40",X"21",X"D8",X"1C",X"3E",X"01",X"06",X"04", + X"CD",X"66",X"16",X"3A",X"FB",X"4D",X"CB",X"77",X"28",X"0D",X"11",X"F9",X"40",X"21",X"D8",X"1C", + X"3E",X"01",X"06",X"04",X"CD",X"66",X"16",X"3A",X"FB",X"4D",X"CB",X"7F",X"28",X"0D",X"11",X"FA", + X"40",X"21",X"D8",X"1C",X"3E",X"01",X"06",X"04",X"CD",X"66",X"16",X"1E",X"00",X"21",X"00",X"00", + X"CD",X"B9",X"02",X"30",X"02",X"CB",X"C3",X"21",X"00",X"10",X"CD",X"B9",X"02",X"30",X"02",X"CB", + X"CB",X"21",X"00",X"20",X"CD",X"B9",X"02",X"30",X"02",X"CB",X"D3",X"21",X"00",X"30",X"CD",X"B9", + X"02",X"30",X"02",X"CB",X"DB",X"3A",X"FB",X"4D",X"FE",X"00",X"28",X"02",X"3E",X"80",X"B3",X"32", + X"FB",X"4D",X"CB",X"47",X"28",X"0D",X"11",X"EC",X"40",X"21",X"D8",X"1C",X"3E",X"01",X"06",X"04", + X"CD",X"66",X"16",X"3A",X"FB",X"4D",X"CB",X"4F",X"28",X"0D",X"11",X"ED",X"40",X"21",X"D8",X"1C", + X"3E",X"01",X"06",X"04",X"CD",X"66",X"16",X"3A",X"FB",X"4D",X"CB",X"57",X"28",X"0D",X"11",X"EE", + X"40",X"21",X"D8",X"1C",X"3E",X"01",X"06",X"04",X"CD",X"66",X"16",X"3A",X"FB",X"4D",X"CB",X"5F", + X"28",X"0D",X"11",X"EF",X"40",X"21",X"D8",X"1C",X"3E",X"01",X"06",X"04",X"CD",X"66",X"16",X"3A", + X"FB",X"4D",X"FE",X"00",X"20",X"0E",X"FB",X"3E",X"01",X"32",X"00",X"50",X"3E",X"02",X"CD",X"70", + X"15",X"C3",X"95",X"00",X"32",X"C0",X"50",X"18",X"FB",X"01",X"00",X"10",X"AF",X"32",X"C0",X"50", + X"86",X"23",X"57",X"0B",X"79",X"B0",X"7A",X"20",X"F7",X"FE",X"FF",X"28",X"02",X"37",X"C9",X"37", + X"3F",X"C9",X"08",X"E6",X"FC",X"08",X"E5",X"3E",X"11",X"CD",X"F1",X"02",X"E1",X"E5",X"3E",X"22", + X"CD",X"F1",X"02",X"E1",X"E5",X"3E",X"44",X"CD",X"F1",X"02",X"E1",X"3E",X"88",X"CD",X"F1",X"02", + X"C9",X"32",X"C0",X"50",X"E5",X"E5",X"D1",X"13",X"01",X"FF",X"03",X"77",X"ED",X"B0",X"E1",X"01", + X"00",X"04",X"BE",X"C4",X"0F",X"03",X"23",X"5F",X"0B",X"79",X"B0",X"7B",X"20",X"F4",X"C9",X"5F", + X"7E",X"E6",X"0F",X"57",X"7B",X"E6",X"0F",X"BA",X"28",X"04",X"08",X"CB",X"CF",X"08",X"7E",X"E6", + X"F0",X"57",X"7B",X"E6",X"F0",X"BA",X"C8",X"08",X"CB",X"C7",X"08",X"7B",X"C9",X"0B",X"4C",X"49", + X"5A",X"41",X"52",X"44",X"20",X"57",X"49",X"5A",X"41",X"52",X"44",X"2C",X"43",X"4F",X"50",X"59", + X"52",X"49",X"47",X"48",X"54",X"20",X"31",X"39",X"38",X"35",X"54",X"45",X"43",X"48",X"53",X"54", + X"41",X"52",X"20",X"49",X"4E",X"43",X"2E",X"32",X"C0",X"50",X"21",X"00",X"40",X"11",X"01",X"40", + X"01",X"FE",X"07",X"36",X"40",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"00",X"4C",X"11",X"01",X"4C", + X"01",X"FE",X"03",X"36",X"00",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"60",X"50",X"11",X"61",X"50", + X"01",X"0F",X"00",X"36",X"00",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"F0",X"4F",X"11",X"F1",X"4F", + X"01",X"0F",X"00",X"36",X"00",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"40",X"50",X"11",X"41",X"50", + X"01",X"1F",X"00",X"36",X"00",X"ED",X"B0",X"21",X"A2",X"4C",X"11",X"A3",X"4C",X"01",X"4F",X"00", + X"36",X"FF",X"ED",X"B0",X"21",X"CB",X"8B",X"22",X"8E",X"4D",X"3A",X"80",X"50",X"47",X"E6",X"03", + X"32",X"96",X"4D",X"21",X"66",X"1D",X"CD",X"E3",X"15",X"7E",X"32",X"97",X"4D",X"78",X"E6",X"0C", + X"CB",X"3F",X"CB",X"3F",X"21",X"C7",X"8B",X"CD",X"E3",X"15",X"7E",X"32",X"9D",X"4D",X"78",X"E6", + X"30",X"21",X"87",X"8B",X"CD",X"E3",X"15",X"22",X"9E",X"4D",X"78",X"E6",X"30",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"32",X"A0",X"4D",X"78",X"CB",X"77",X"20",X"05",X"21",X"91",X"4D", + X"CB",X"FE",X"ED",X"56",X"FB",X"3E",X"01",X"32",X"00",X"50",X"CD",X"80",X"8A",X"21",X"C2",X"43", + X"11",X"C3",X"43",X"01",X"3C",X"00",X"36",X"40",X"ED",X"B0",X"21",X"C2",X"47",X"11",X"C3",X"47", + X"01",X"1C",X"00",X"36",X"1A",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"E2",X"47",X"11",X"E3",X"47", + X"01",X"1C",X"00",X"36",X"1B",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"9A",X"1A",X"11",X"C3",X"43", + X"01",X"1A",X"00",X"ED",X"B0",X"AF",X"32",X"E4",X"43",X"32",X"ED",X"43",X"32",X"F6",X"43",X"21", + X"D4",X"8B",X"11",X"AF",X"4D",X"01",X"3C",X"00",X"ED",X"B0",X"21",X"B4",X"4D",X"11",X"F2",X"43", + X"CD",X"ED",X"15",X"C3",X"7E",X"04",X"DD",X"7E",X"04",X"80",X"FD",X"96",X"04",X"CB",X"20",X"04", + X"B8",X"D0",X"DD",X"7E",X"05",X"81",X"FD",X"96",X"05",X"CB",X"21",X"0C",X"B9",X"C9",X"21",X"02", + X"40",X"11",X"03",X"40",X"01",X"3C",X"00",X"36",X"40",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"02", + X"44",X"11",X"03",X"44",X"01",X"1C",X"00",X"36",X"01",X"ED",X"B0",X"21",X"02",X"44",X"11",X"03", + X"44",X"01",X"09",X"00",X"36",X"09",X"ED",X"B0",X"21",X"15",X"44",X"11",X"16",X"44",X"01",X"09", + X"00",X"36",X"08",X"ED",X"B0",X"21",X"22",X"44",X"11",X"23",X"44",X"01",X"1C",X"00",X"36",X"18", + X"ED",X"B0",X"32",X"C0",X"50",X"21",X"B4",X"1A",X"11",X"0F",X"40",X"01",X"06",X"00",X"ED",X"B0", + X"AF",X"32",X"0C",X"40",X"3A",X"96",X"4D",X"FE",X"00",X"20",X"0B",X"21",X"BA",X"1A",X"11",X"0C", + X"40",X"01",X"09",X"00",X"ED",X"B0",X"32",X"C0",X"50",X"21",X"02",X"4E",X"11",X"03",X"4E",X"01", + X"F2",X"00",X"36",X"00",X"ED",X"B0",X"21",X"6C",X"8C",X"22",X"1B",X"4E",X"22",X"03",X"4E",X"21", + X"1A",X"4E",X"22",X"0A",X"4E",X"21",X"9A",X"8C",X"22",X"36",X"4E",X"22",X"1E",X"4E",X"21",X"35", + X"4E",X"22",X"25",X"4E",X"21",X"B1",X"8C",X"22",X"51",X"4E",X"22",X"39",X"4E",X"21",X"50",X"4E", + X"22",X"40",X"4E",X"21",X"C9",X"8C",X"22",X"6C",X"4E",X"22",X"54",X"4E",X"21",X"6B",X"4E",X"22", + X"5B",X"4E",X"21",X"FB",X"8C",X"22",X"87",X"4E",X"22",X"6F",X"4E",X"21",X"86",X"4E",X"22",X"76", + X"4E",X"21",X"16",X"8D",X"22",X"A2",X"4E",X"22",X"8A",X"4E",X"21",X"A1",X"4E",X"22",X"91",X"4E", + X"21",X"2C",X"8D",X"22",X"BD",X"4E",X"22",X"A5",X"4E",X"21",X"BC",X"4E",X"22",X"AC",X"4E",X"21", + X"FC",X"8E",X"22",X"D8",X"4E",X"22",X"C0",X"4E",X"21",X"D7",X"4E",X"22",X"C7",X"4E",X"21",X"14", + X"8F",X"22",X"F3",X"4E",X"22",X"DB",X"4E",X"21",X"F2",X"4E",X"22",X"E2",X"4E",X"06",X"20",X"21", + X"40",X"50",X"36",X"00",X"23",X"10",X"FB",X"21",X"91",X"4D",X"CB",X"EE",X"3A",X"96",X"4D",X"FE", + X"00",X"CA",X"EE",X"06",X"3A",X"95",X"4D",X"FE",X"00",X"C2",X"EE",X"06",X"21",X"90",X"4D",X"CB", + X"A6",X"AF",X"32",X"01",X"50",X"21",X"91",X"4D",X"CB",X"86",X"CD",X"24",X"12",X"32",X"C0",X"50", + X"CD",X"69",X"90",X"21",X"90",X"4D",X"CB",X"6E",X"C2",X"EE",X"06",X"CD",X"5D",X"11",X"3E",X"07", + X"CD",X"70",X"15",X"21",X"90",X"4D",X"CB",X"6E",X"C2",X"EE",X"06",X"3E",X"40",X"CD",X"45",X"15", + X"11",X"44",X"44",X"21",X"10",X"8C",X"3E",X"01",X"06",X"1C",X"CD",X"7C",X"16",X"11",X"59",X"44", + X"21",X"12",X"8C",X"3E",X"01",X"06",X"1C",X"CD",X"7C",X"16",X"11",X"5C",X"44",X"21",X"11",X"8C", + X"3E",X"01",X"06",X"1C",X"CD",X"7C",X"16",X"11",X"44",X"41",X"21",X"83",X"1B",X"3E",X"01",X"06", + X"0C",X"CD",X"66",X"16",X"CD",X"C9",X"8A",X"3A",X"96",X"4D",X"FE",X"01",X"20",X"0F",X"11",X"19", + X"41",X"21",X"8F",X"1B",X"3E",X"01",X"06",X"0F",X"CD",X"66",X"16",X"18",X"20",X"FE",X"02",X"20", + X"0F",X"11",X"19",X"41",X"21",X"9E",X"1B",X"3E",X"01",X"06",X"0F",X"CD",X"66",X"16",X"18",X"0D", + X"11",X"19",X"41",X"21",X"AD",X"1B",X"3E",X"01",X"06",X"0F",X"CD",X"66",X"16",X"11",X"9C",X"40", + X"21",X"BC",X"1B",X"3E",X"01",X"06",X"19",X"CD",X"66",X"16",X"3A",X"A0",X"4D",X"FE",X"00",X"20", + X"0F",X"11",X"7C",X"41",X"21",X"D5",X"1B",X"3E",X"01",X"06",X"06",X"CD",X"66",X"16",X"18",X"33", + X"FE",X"01",X"20",X"0F",X"11",X"7C",X"41",X"21",X"DB",X"1B",X"3E",X"01",X"06",X"06",X"CD",X"66", + X"16",X"18",X"20",X"FE",X"02",X"20",X"0F",X"11",X"7C",X"41",X"21",X"E1",X"1B",X"3E",X"01",X"06", + X"06",X"CD",X"66",X"16",X"18",X"0D",X"11",X"7C",X"41",X"21",X"E7",X"1B",X"3E",X"01",X"06",X"06", + X"CD",X"66",X"16",X"3E",X"0D",X"CD",X"70",X"15",X"21",X"90",X"4D",X"CB",X"6E",X"20",X"4F",X"CD", + X"81",X"8A",X"3E",X"0B",X"32",X"FC",X"4D",X"21",X"13",X"8C",X"22",X"FD",X"4D",X"CD",X"9D",X"8A", + X"21",X"91",X"4D",X"CB",X"EE",X"CD",X"07",X"10",X"CD",X"D2",X"17",X"CD",X"86",X"1D",X"AF",X"32", + X"1D",X"4E",X"32",X"38",X"4E",X"32",X"53",X"4E",X"32",X"6E",X"4E",X"32",X"89",X"4E",X"32",X"A4", + X"4E",X"32",X"BF",X"4E",X"32",X"DA",X"4E",X"CD",X"C4",X"15",X"32",X"C0",X"50",X"21",X"90",X"4D", + X"CB",X"6E",X"20",X"0A",X"21",X"91",X"4D",X"CB",X"6E",X"CA",X"AA",X"05",X"18",X"CA",X"CD",X"24", + X"12",X"21",X"90",X"4D",X"CB",X"E6",X"CB",X"AE",X"21",X"91",X"4D",X"CB",X"AE",X"CB",X"9E",X"CB", + X"C6",X"21",X"A2",X"4C",X"11",X"A3",X"4C",X"01",X"4F",X"00",X"36",X"FF",X"ED",X"B0",X"3E",X"FF", + X"32",X"01",X"50",X"32",X"C0",X"50",X"3E",X"40",X"CD",X"45",X"15",X"3E",X"1B",X"CD",X"55",X"15", + X"3A",X"96",X"4D",X"FE",X"00",X"CA",X"B4",X"07",X"3A",X"95",X"4D",X"FE",X"02",X"30",X"55",X"11", + X"78",X"41",X"21",X"C3",X"1A",X"3E",X"01",X"06",X"0B",X"CD",X"66",X"16",X"CD",X"C9",X"8A",X"3A", + X"40",X"50",X"CB",X"6F",X"C2",X"C7",X"07",X"3A",X"96",X"4D",X"FE",X"00",X"28",X"15",X"3A",X"95", + X"4D",X"FE",X"02",X"38",X"72",X"D6",X"02",X"32",X"95",X"4D",X"3A",X"98",X"4D",X"D6",X"01",X"27", + X"32",X"98",X"4D",X"21",X"91",X"4D",X"CB",X"E6",X"3A",X"9D",X"4D",X"32",X"A1",X"4D",X"CD",X"06", + X"00",X"21",X"91",X"4D",X"CB",X"EE",X"3A",X"96",X"4D",X"FE",X"00",X"CA",X"0F",X"08",X"CD",X"36", + X"11",X"C3",X"0F",X"08",X"FE",X"04",X"30",X"2C",X"11",X"18",X"41",X"21",X"CE",X"1A",X"3E",X"01", + X"06",X"11",X"CD",X"66",X"16",X"11",X"1A",X"42",X"21",X"DF",X"1A",X"3E",X"01",X"06",X"02",X"CD", + X"66",X"16",X"11",X"7C",X"41",X"21",X"C3",X"1A",X"3E",X"01",X"06",X"0B",X"CD",X"66",X"16",X"CD", + X"C9",X"8A",X"18",X"8B",X"11",X"9A",X"40",X"21",X"E1",X"1A",X"3E",X"01",X"06",X"19",X"CD",X"66", + X"16",X"CD",X"C9",X"8A",X"C3",X"3F",X"07",X"3A",X"40",X"50",X"CB",X"77",X"20",X"2F",X"3A",X"96", + X"4D",X"FE",X"00",X"28",X"15",X"3A",X"95",X"4D",X"FE",X"04",X"38",X"21",X"D6",X"04",X"32",X"95", + X"4D",X"3A",X"98",X"4D",X"D6",X"02",X"27",X"32",X"98",X"4D",X"21",X"91",X"4D",X"CB",X"A6",X"3A", + X"9D",X"4D",X"32",X"A2",X"4D",X"CB",X"CE",X"CD",X"3B",X"00",X"C3",X"68",X"07",X"32",X"C0",X"50", + X"21",X"90",X"4D",X"CB",X"76",X"20",X"03",X"C3",X"3F",X"07",X"CB",X"B6",X"C3",X"13",X"07",X"AF", + X"21",X"A3",X"4D",X"11",X"A4",X"4D",X"01",X"09",X"00",X"77",X"ED",X"B0",X"32",X"AD",X"4D",X"32", + X"AE",X"4D",X"3E",X"40",X"21",X"E4",X"43",X"11",X"E5",X"43",X"01",X"05",X"00",X"77",X"ED",X"B0", + X"21",X"F6",X"43",X"11",X"F7",X"43",X"01",X"05",X"00",X"77",X"ED",X"B0",X"AF",X"32",X"E4",X"43", + X"32",X"F6",X"43",X"AF",X"32",X"FC",X"4D",X"CD",X"A3",X"8A",X"21",X"DA",X"4E",X"CB",X"C6",X"21", + X"91",X"4D",X"CB",X"66",X"20",X"0A",X"3A",X"A2",X"4D",X"3D",X"32",X"A2",X"4D",X"CD",X"3B",X"00", + X"3A",X"A1",X"4D",X"3D",X"32",X"A1",X"4D",X"CD",X"06",X"00",X"CD",X"07",X"10",X"CD",X"57",X"85", + X"32",X"C0",X"50",X"3A",X"DA",X"4E",X"FE",X"00",X"20",X"F6",X"CD",X"86",X"1D",X"21",X"92",X"4D", + X"CB",X"66",X"28",X"13",X"CB",X"A6",X"ED",X"5B",X"A9",X"4D",X"7B",X"B2",X"28",X"1C",X"21",X"00", + X"00",X"22",X"A9",X"4D",X"C3",X"A7",X"08",X"CB",X"E6",X"ED",X"5B",X"AB",X"4D",X"7B",X"B2",X"28", + X"09",X"21",X"00",X"00",X"22",X"AB",X"4D",X"CD",X"7A",X"10",X"32",X"C0",X"50",X"CD",X"C4",X"15", + X"21",X"91",X"4D",X"CB",X"6E",X"C2",X"D6",X"09",X"CB",X"4E",X"C2",X"D6",X"09",X"CD",X"CD",X"89", + X"CD",X"24",X"12",X"ED",X"5B",X"A9",X"4D",X"7B",X"B2",X"28",X"0E",X"21",X"00",X"00",X"22",X"A9", + X"4D",X"21",X"92",X"4D",X"CB",X"A6",X"CD",X"7A",X"10",X"ED",X"5B",X"AB",X"4D",X"7B",X"B2",X"28", + X"0E",X"21",X"00",X"00",X"22",X"AB",X"4D",X"21",X"92",X"4D",X"CB",X"E6",X"CD",X"7A",X"10",X"DD", + X"21",X"00",X"4E",X"21",X"91",X"4D",X"CB",X"6E",X"20",X"0A",X"3A",X"A1",X"4D",X"B7",X"20",X"04", + X"DD",X"CB",X"00",X"C6",X"CB",X"4E",X"20",X"0E",X"CB",X"66",X"20",X"0A",X"3A",X"A2",X"4D",X"B7", + X"20",X"04",X"DD",X"CB",X"00",X"CE",X"DD",X"7E",X"00",X"B7",X"28",X"69",X"CD",X"65",X"15",X"11", + X"6F",X"41",X"21",X"C3",X"1A",X"3E",X"01",X"06",X"0B",X"CD",X"66",X"16",X"11",X"31",X"41",X"21", + X"F4",X"1C",X"3E",X"01",X"06",X"0F",X"CD",X"66",X"16",X"DD",X"7E",X"00",X"FE",X"03",X"28",X"20", + X"CB",X"47",X"28",X"0F",X"11",X"6D",X"41",X"21",X"FD",X"1A",X"3E",X"01",X"06",X"0A",X"CD",X"66", + X"16",X"18",X"0D",X"11",X"6D",X"41",X"21",X"0A",X"1B",X"3E",X"01",X"06",X"0A",X"CD",X"66",X"16", + X"3E",X"02",X"CD",X"CE",X"15",X"DD",X"7E",X"01",X"3C",X"DD",X"77",X"01",X"FE",X"96",X"20",X"0D", + X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"00",X"CD",X"65",X"15",X"18",X"08",X"DD",X"7E",X"00", + X"B7",X"20",X"DD",X"18",X"EB",X"21",X"91",X"4D",X"CB",X"6E",X"20",X"13",X"3A",X"A1",X"4D",X"FE", + X"00",X"28",X"0C",X"3D",X"32",X"A1",X"4D",X"CD",X"06",X"00",X"21",X"91",X"4D",X"CB",X"EE",X"CB", + X"4E",X"20",X"13",X"3A",X"A2",X"4D",X"FE",X"00",X"28",X"34",X"3D",X"32",X"A2",X"4D",X"CD",X"3B", + X"00",X"21",X"91",X"4D",X"CB",X"CE",X"CB",X"5E",X"CA",X"6A",X"08",X"CB",X"9E",X"21",X"92",X"4D", + X"CB",X"CE",X"3A",X"FC",X"4D",X"FE",X"0F",X"28",X"04",X"3C",X"32",X"FC",X"4D",X"CD",X"CE",X"89", + X"CD",X"CC",X"89",X"C3",X"6A",X"08",X"CB",X"5E",X"C2",X"BD",X"08",X"C3",X"7A",X"08",X"CB",X"6E", + X"C2",X"B6",X"09",X"CD",X"65",X"15",X"11",X"90",X"41",X"21",X"14",X"1B",X"3E",X"01",X"06",X"09", + X"CD",X"66",X"16",X"3E",X"02",X"CD",X"70",X"15",X"CD",X"38",X"12",X"21",X"90",X"4D",X"CB",X"F6", + X"21",X"91",X"4D",X"CB",X"9E",X"C3",X"87",X"05",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5", + X"AF",X"32",X"00",X"50",X"2A",X"8E",X"4D",X"23",X"22",X"8E",X"4D",X"7E",X"FE",X"FF",X"C2",X"27", + X"0A",X"21",X"CB",X"8B",X"22",X"8E",X"4D",X"2A",X"A2",X"4C",X"3A",X"A4",X"4C",X"77",X"2A",X"A5", + X"4C",X"3A",X"A7",X"4C",X"77",X"2A",X"AA",X"4C",X"3A",X"AC",X"4C",X"77",X"2A",X"AD",X"4C",X"3A", + X"AF",X"4C",X"77",X"2A",X"B2",X"4C",X"3A",X"B4",X"4C",X"77",X"2A",X"B5",X"4C",X"3A",X"B7",X"4C", + X"77",X"2A",X"BA",X"4C",X"3A",X"BC",X"4C",X"77",X"2A",X"BD",X"4C",X"3A",X"BF",X"4C",X"77",X"2A", + X"C2",X"4C",X"3A",X"C4",X"4C",X"77",X"2A",X"C5",X"4C",X"3A",X"C7",X"4C",X"77",X"2A",X"CA",X"4C", + X"3A",X"CC",X"4C",X"77",X"2A",X"CD",X"4C",X"3A",X"CF",X"4C",X"77",X"2A",X"D2",X"4C",X"3A",X"D4", + X"4C",X"77",X"2A",X"D5",X"4C",X"3A",X"D7",X"4C",X"77",X"2A",X"DA",X"4C",X"3A",X"DC",X"4C",X"77", + X"2A",X"DD",X"4C",X"3A",X"DF",X"4C",X"77",X"2A",X"E2",X"4C",X"3A",X"E4",X"4C",X"77",X"2A",X"E5", + X"4C",X"3A",X"E7",X"4C",X"77",X"2A",X"EA",X"4C",X"3A",X"EC",X"4C",X"77",X"2A",X"ED",X"4C",X"3A", + X"EF",X"4C",X"77",X"ED",X"5B",X"FD",X"4C",X"CD",X"F8",X"0D",X"ED",X"53",X"62",X"50",X"ED",X"5B", + X"15",X"4D",X"CD",X"F8",X"0D",X"ED",X"53",X"64",X"50",X"ED",X"5B",X"2D",X"4D",X"CD",X"F8",X"0D", + X"ED",X"53",X"66",X"50",X"ED",X"5B",X"45",X"4D",X"CD",X"F8",X"0D",X"ED",X"53",X"68",X"50",X"ED", + X"5B",X"5D",X"4D",X"CD",X"F8",X"0D",X"ED",X"53",X"6A",X"50",X"ED",X"5B",X"75",X"4D",X"CD",X"F8", + X"0D",X"ED",X"53",X"6C",X"50",X"2A",X"FF",X"4C",X"CD",X"11",X"0E",X"22",X"F2",X"4F",X"2A",X"17", + X"4D",X"CD",X"11",X"0E",X"22",X"F4",X"4F",X"2A",X"2F",X"4D",X"CD",X"11",X"0E",X"22",X"F6",X"4F", + X"2A",X"47",X"4D",X"CD",X"11",X"0E",X"22",X"F8",X"4F",X"2A",X"5F",X"4D",X"CD",X"11",X"0E",X"22", + X"FA",X"4F",X"2A",X"77",X"4D",X"CD",X"11",X"0E",X"22",X"FC",X"4F",X"21",X"90",X"4D",X"CB",X"46", + X"20",X"58",X"3A",X"00",X"50",X"CB",X"6F",X"CA",X"FB",X"0B",X"CB",X"8E",X"CB",X"56",X"20",X"3F", + X"3A",X"00",X"50",X"CB",X"7F",X"CA",X"09",X"0C",X"3A",X"93",X"4D",X"FE",X"06",X"28",X"07",X"3C", + X"32",X"93",X"4D",X"C3",X"0E",X"0C",X"AF",X"32",X"93",X"4D",X"CB",X"5E",X"20",X"0A",X"3A",X"94", + X"4D",X"FE",X"00",X"20",X"0C",X"C3",X"0E",X"0C",X"AF",X"32",X"07",X"50",X"CB",X"9E",X"C3",X"0E", + X"0C",X"3D",X"32",X"94",X"4D",X"3E",X"01",X"32",X"07",X"50",X"CB",X"DE",X"C3",X"0E",X"0C",X"3A", + X"00",X"50",X"CB",X"7F",X"28",X"C2",X"CB",X"96",X"18",X"10",X"3A",X"00",X"50",X"CB",X"6F",X"28", + X"AB",X"CB",X"86",X"3A",X"94",X"4D",X"3C",X"32",X"94",X"4D",X"3A",X"00",X"4E",X"B7",X"28",X"2A", + X"CB",X"47",X"28",X"0D",X"CB",X"87",X"32",X"00",X"4E",X"3E",X"02",X"32",X"A1",X"4D",X"CD",X"06", + X"00",X"3A",X"00",X"4E",X"CB",X"4F",X"28",X"36",X"CB",X"8F",X"32",X"00",X"4E",X"3E",X"02",X"32", + X"A2",X"4D",X"CD",X"3B",X"00",X"21",X"90",X"4D",X"18",X"24",X"21",X"90",X"4D",X"3A",X"95",X"4D", + X"FE",X"14",X"30",X"1A",X"47",X"3A",X"97",X"4D",X"80",X"32",X"95",X"4D",X"CB",X"3F",X"06",X"00", + X"80",X"27",X"32",X"98",X"4D",X"CD",X"36",X"11",X"CB",X"66",X"20",X"02",X"CB",X"EE",X"3A",X"02", + X"4E",X"CB",X"C7",X"32",X"02",X"4E",X"CB",X"F6",X"C3",X"48",X"0B",X"CB",X"4E",X"20",X"05",X"CB", + X"CE",X"C3",X"3C",X"0B",X"CB",X"C6",X"C3",X"3A",X"0B",X"CB",X"D6",X"C3",X"48",X"0B",X"00",X"21", + X"91",X"4D",X"CB",X"46",X"28",X"09",X"CD",X"35",X"18",X"CD",X"15",X"18",X"CD",X"25",X"18",X"3A", + X"9A",X"4D",X"3C",X"32",X"9A",X"4D",X"3A",X"99",X"4D",X"3C",X"32",X"99",X"4D",X"FE",X"3C",X"20", + X"0B",X"AF",X"32",X"99",X"4D",X"3A",X"9B",X"4D",X"3C",X"32",X"9B",X"4D",X"21",X"90",X"4D",X"CB", + X"BE",X"3A",X"00",X"50",X"CB",X"77",X"20",X"35",X"AF",X"32",X"01",X"50",X"21",X"62",X"50",X"06", + X"0C",X"36",X"00",X"23",X"10",X"FB",X"3E",X"40",X"CD",X"45",X"15",X"3E",X"02",X"CD",X"55",X"15", + X"11",X"D0",X"41",X"21",X"7F",X"1B",X"3E",X"01",X"06",X"04",X"CD",X"66",X"16",X"06",X"FF",X"21", + X"FF",X"FF",X"2B",X"7D",X"BC",X"32",X"C0",X"50",X"20",X"F8",X"10",X"F3",X"76",X"FB",X"3E",X"01", + X"32",X"00",X"50",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"ED",X"4D",X"DD",X"2A",X"89", + X"4D",X"DD",X"7E",X"00",X"CB",X"27",X"21",X"E4",X"0C",X"CD",X"E3",X"15",X"23",X"7E",X"32",X"8B", + X"4D",X"2B",X"DD",X"7E",X"03",X"32",X"8C",X"4D",X"DD",X"7E",X"05",X"32",X"8D",X"4D",X"7E",X"FE", + X"00",X"28",X"0F",X"CD",X"24",X"0D",X"3A",X"8C",X"4D",X"DD",X"77",X"03",X"3A",X"8D",X"4D",X"DD", + X"77",X"05",X"DD",X"7E",X"02",X"32",X"8C",X"4D",X"DD",X"7E",X"04",X"32",X"8D",X"4D",X"3A",X"8B", + X"4D",X"FE",X"00",X"C8",X"CD",X"24",X"0D",X"3A",X"8C",X"4D",X"DD",X"77",X"02",X"3A",X"8D",X"4D", + X"DD",X"77",X"04",X"C9",X"04",X"00",X"04",X"06",X"04",X"0A",X"04",X"0E",X"04",X"02",X"10",X"02", + X"0C",X"02",X"08",X"02",X"00",X"02",X"06",X"02",X"0A",X"02",X"0E",X"02",X"02",X"02",X"02",X"0E", + X"02",X"0A",X"02",X"06",X"02",X"00",X"02",X"08",X"02",X"0C",X"02",X"10",X"02",X"04",X"0E",X"04", + X"0A",X"04",X"06",X"04",X"00",X"04",X"08",X"04",X"0C",X"04",X"10",X"04",X"04",X"04",X"04",X"10", + X"04",X"0C",X"04",X"08",X"11",X"44",X"0D",X"CD",X"E8",X"15",X"1A",X"6F",X"13",X"1A",X"67",X"E9", + X"3A",X"8C",X"4D",X"80",X"47",X"E6",X"0F",X"32",X"8C",X"4D",X"CB",X"38",X"CB",X"38",X"CB",X"38", + X"CB",X"38",X"3A",X"8D",X"4D",X"C9",X"56",X"0D",X"61",X"0D",X"6C",X"0D",X"7B",X"0D",X"8A",X"0D", + X"97",X"0D",X"A4",X"0D",X"BA",X"0D",X"DD",X"46",X"01",X"CD",X"30",X"0D",X"80",X"32",X"8D",X"4D", + X"C9",X"DD",X"46",X"01",X"CD",X"30",X"0D",X"90",X"32",X"8D",X"4D",X"C9",X"DD",X"46",X"01",X"CB", + X"38",X"CB",X"38",X"CD",X"30",X"0D",X"80",X"32",X"8D",X"4D",X"C9",X"DD",X"46",X"01",X"CB",X"38", + X"CB",X"38",X"CD",X"30",X"0D",X"90",X"32",X"8D",X"4D",X"C9",X"DD",X"46",X"01",X"CB",X"38",X"CD", + X"30",X"0D",X"80",X"32",X"8D",X"4D",X"C9",X"DD",X"46",X"01",X"CB",X"38",X"CD",X"30",X"0D",X"90", + X"32",X"8D",X"4D",X"C9",X"DD",X"46",X"01",X"CB",X"38",X"CB",X"38",X"DD",X"7E",X"01",X"CB",X"3F", + X"80",X"47",X"CD",X"30",X"0D",X"80",X"32",X"8D",X"4D",X"C9",X"DD",X"46",X"01",X"CB",X"38",X"CB", + X"38",X"DD",X"7E",X"01",X"CB",X"3F",X"80",X"47",X"CD",X"30",X"0D",X"90",X"32",X"8D",X"4D",X"C9", + X"3A",X"F2",X"4C",X"E6",X"07",X"32",X"A0",X"4C",X"3A",X"F3",X"4C",X"E6",X"07",X"32",X"A1",X"4C", + X"3A",X"F2",X"4C",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"57",X"3A",X"F3",X"4C",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"5F",X"CD",X"58",X"10",X"C9",X"D5",X"37",X"3F",X"21",X"0E",X"01",X"16",X"00", + X"ED",X"52",X"7D",X"37",X"3F",X"21",X"10",X"01",X"D1",X"5A",X"16",X"00",X"ED",X"52",X"55",X"5F", + X"C9",X"7D",X"EE",X"03",X"6F",X"C9",X"2A",X"F4",X"4C",X"EB",X"DD",X"21",X"00",X"00",X"DD",X"19", + X"EB",X"01",X"00",X"4C",X"37",X"3F",X"ED",X"42",X"CB",X"3C",X"CB",X"1D",X"E5",X"DD",X"7E",X"00", + X"21",X"3D",X"0E",X"CB",X"27",X"CD",X"E3",X"15",X"5E",X"23",X"56",X"EB",X"E9",X"0F",X"0F",X"49", + X"0E",X"8E",X"0E",X"1E",X"0F",X"28",X"0F",X"3B",X"0F",X"F3",X"DD",X"7E",X"04",X"32",X"F2",X"4C", + X"DD",X"7E",X"03",X"32",X"F3",X"4C",X"CD",X"D0",X"0D",X"DD",X"7E",X"06",X"12",X"3A",X"A0",X"4C", + X"FE",X"00",X"20",X"18",X"3A",X"A1",X"4C",X"FE",X"00",X"20",X"18",X"C1",X"21",X"A2",X"4C",X"09", + X"E5",X"D1",X"13",X"01",X"05",X"00",X"36",X"FF",X"ED",X"B0",X"FB",X"C9",X"DD",X"7E",X"06",X"13", + X"12",X"18",X"E8",X"DD",X"7E",X"06",X"21",X"20",X"00",X"19",X"EB",X"12",X"18",X"DD",X"CD",X"B2", + X"0F",X"DD",X"7E",X"04",X"90",X"32",X"F2",X"4C",X"DD",X"7E",X"03",X"32",X"F3",X"4C",X"CD",X"D0", + X"0D",X"3A",X"A0",X"4C",X"FE",X"00",X"28",X"32",X"3A",X"A0",X"4C",X"CB",X"27",X"DD",X"46",X"05", + X"80",X"3D",X"C1",X"FD",X"21",X"A2",X"4C",X"FD",X"09",X"FD",X"73",X"00",X"FD",X"72",X"01",X"FD", + X"77",X"02",X"3C",X"13",X"FD",X"73",X"03",X"FD",X"72",X"04",X"FD",X"77",X"05",X"3A",X"F2",X"4C", + X"DD",X"77",X"04",X"3A",X"F3",X"4C",X"DD",X"77",X"03",X"C9",X"3A",X"A1",X"4C",X"FE",X"00",X"CA", + X"44",X"0F",X"3A",X"A1",X"4C",X"CB",X"27",X"C6",X"0F",X"DD",X"46",X"05",X"80",X"C1",X"FD",X"21", + X"A2",X"4C",X"FD",X"09",X"FD",X"73",X"00",X"FD",X"72",X"01",X"FD",X"77",X"02",X"3C",X"21",X"20", + X"00",X"19",X"EB",X"FD",X"73",X"03",X"FD",X"72",X"04",X"FD",X"77",X"05",X"C3",X"CD",X"0E",X"DD", + X"7E",X"04",X"32",X"F2",X"4C",X"DD",X"7E",X"03",X"32",X"F3",X"4C",X"C3",X"9E",X"0E",X"CD",X"B2", + X"0F",X"DD",X"7E",X"04",X"80",X"C3",X"95",X"0E",X"CD",X"B2",X"0F",X"DD",X"7E",X"03",X"90",X"32", + X"F3",X"4C",X"DD",X"7E",X"04",X"32",X"F2",X"4C",X"C3",X"9E",X"0E",X"CD",X"B2",X"0F",X"DD",X"7E", + X"03",X"80",X"18",X"EB",X"DD",X"7E",X"05",X"C1",X"FD",X"21",X"A2",X"4C",X"FD",X"09",X"FD",X"73", + X"00",X"FD",X"72",X"01",X"FD",X"77",X"02",X"3A",X"F2",X"4C",X"DD",X"77",X"04",X"3A",X"F3",X"4C", + X"DD",X"77",X"03",X"DD",X"7E",X"00",X"21",X"78",X"0F",X"CB",X"27",X"CD",X"E3",X"15",X"D5",X"5E", + X"23",X"56",X"EB",X"D1",X"DD",X"7E",X"06",X"E9",X"A5",X"0F",X"84",X"0F",X"85",X"0F",X"90",X"0F", + X"93",X"0F",X"9A",X"0F",X"C9",X"13",X"FD",X"73",X"03",X"FD",X"72",X"04",X"FD",X"77",X"05",X"C9", + X"1B",X"18",X"F3",X"21",X"20",X"00",X"19",X"EB",X"18",X"EC",X"EB",X"11",X"20",X"00",X"37",X"3F", + X"ED",X"52",X"EB",X"18",X"E1",X"FD",X"36",X"03",X"FF",X"FD",X"36",X"04",X"FF",X"FD",X"36",X"05", + X"FF",X"C9",X"DD",X"7E",X"01",X"DD",X"86",X"02",X"47",X"E6",X"0F",X"DD",X"77",X"02",X"CB",X"38", + X"CB",X"38",X"CB",X"38",X"CB",X"38",X"C9",X"21",X"AF",X"4D",X"11",X"6A",X"42",X"CD",X"78",X"00", + X"11",X"6C",X"42",X"CD",X"78",X"00",X"11",X"6E",X"42",X"CD",X"78",X"00",X"11",X"70",X"42",X"CD", + X"78",X"00",X"11",X"72",X"42",X"CD",X"78",X"00",X"11",X"74",X"42",X"CD",X"78",X"00",X"11",X"76", + X"42",X"CD",X"78",X"00",X"11",X"78",X"42",X"CD",X"78",X"00",X"11",X"7A",X"42",X"CD",X"78",X"00", + X"11",X"7C",X"42",X"CD",X"78",X"00",X"C9",X"CD",X"00",X"80",X"3A",X"FC",X"4D",X"21",X"18",X"10", + X"CB",X"27",X"CB",X"27",X"CD",X"E3",X"15",X"E9",X"CD",X"5A",X"81",X"C9",X"CD",X"96",X"81",X"C9", + X"CD",X"CB",X"81",X"C9",X"CD",X"05",X"82",X"C9",X"CD",X"A1",X"82",X"C9",X"CD",X"78",X"83",X"C9", + X"CD",X"B2",X"83",X"C9",X"CD",X"E4",X"83",X"C9",X"CD",X"1A",X"84",X"C9",X"CD",X"40",X"84",X"C9", + X"CD",X"55",X"84",X"C9",X"CD",X"88",X"84",X"C9",X"CD",X"C9",X"84",X"C9",X"CD",X"F1",X"84",X"C9", + X"CD",X"24",X"85",X"C9",X"CD",X"40",X"85",X"C9",X"D5",X"AF",X"CB",X"23",X"17",X"CB",X"23",X"17", + X"CB",X"23",X"17",X"CB",X"23",X"17",X"CB",X"23",X"17",X"57",X"EB",X"01",X"40",X"40",X"09",X"06", + X"00",X"D1",X"4A",X"09",X"EB",X"ED",X"53",X"F6",X"4C",X"C9",X"21",X"91",X"4D",X"CB",X"46",X"C8", + X"21",X"92",X"4D",X"CB",X"66",X"20",X"43",X"21",X"A3",X"4D",X"7B",X"86",X"27",X"77",X"23",X"7A", + X"8E",X"27",X"77",X"23",X"3E",X"00",X"8E",X"27",X"77",X"38",X"02",X"18",X"32",X"21",X"92",X"4D", + X"CB",X"66",X"20",X"13",X"21",X"F6",X"43",X"11",X"F7",X"43",X"01",X"05",X"00",X"36",X"40",X"ED", + X"B0",X"AF",X"32",X"F6",X"43",X"18",X"18",X"21",X"E4",X"43",X"11",X"E5",X"43",X"01",X"05",X"00", + X"36",X"40",X"ED",X"B0",X"AF",X"32",X"E4",X"43",X"18",X"05",X"21",X"A6",X"4D",X"18",X"BB",X"21", + X"92",X"4D",X"CB",X"66",X"20",X"55",X"21",X"A5",X"4D",X"11",X"FB",X"43",X"3A",X"AD",X"4D",X"F5", + X"CD",X"ED",X"15",X"23",X"23",X"23",X"EB",X"2A",X"9E",X"4D",X"F1",X"FE",X"04",X"D0",X"CB",X"27", + X"CB",X"27",X"3C",X"3C",X"CD",X"E3",X"15",X"CD",X"03",X"1D",X"D0",X"21",X"1D",X"4E",X"CB",X"C6", + X"21",X"92",X"4D",X"CB",X"66",X"20",X"12",X"3A",X"AD",X"4D",X"3C",X"32",X"AD",X"4D",X"3A",X"A1", + X"4D",X"3C",X"32",X"A1",X"4D",X"CD",X"06",X"00",X"C9",X"3A",X"AE",X"4D",X"3C",X"32",X"AE",X"4D", + X"3A",X"A2",X"4D",X"3C",X"32",X"A2",X"4D",X"CD",X"3B",X"00",X"C9",X"21",X"A8",X"4D",X"11",X"E9", + X"43",X"3A",X"AE",X"4D",X"18",X"A9",X"3A",X"96",X"4D",X"FE",X"00",X"C8",X"3A",X"98",X"4D",X"E6", + X"F0",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"FE",X"00",X"28",X"0C",X"32",X"0D",X"40", + X"3A",X"98",X"4D",X"E6",X"0F",X"32",X"0C",X"40",X"C9",X"3E",X"40",X"18",X"F0",X"3E",X"40",X"CD", + X"45",X"15",X"3E",X"02",X"CD",X"55",X"15",X"11",X"29",X"45",X"21",X"9B",X"11",X"3E",X"15",X"06", + X"0B",X"CD",X"7C",X"16",X"11",X"05",X"41",X"21",X"1D",X"1B",X"3E",X"01",X"06",X"10",X"CD",X"66", + X"16",X"21",X"29",X"1D",X"11",X"CA",X"42",X"01",X"FF",X"09",X"ED",X"A0",X"13",X"10",X"FB",X"AF", + X"12",X"CD",X"88",X"15",X"3E",X"01",X"12",X"CD",X"C7",X"0F",X"C9",X"18",X"3E",X"03",X"F5",X"7E", + X"E6",X"F0",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"47",X"3A",X"91",X"4D",X"CB",X"77", + X"28",X"2A",X"78",X"12",X"3E",X"20",X"CD",X"52",X"16",X"7E",X"E6",X"0F",X"47",X"3A",X"91",X"4D", + X"CB",X"77",X"32",X"91",X"4D",X"28",X"24",X"78",X"12",X"2B",X"3E",X"20",X"CD",X"52",X"16",X"F1", + X"3D",X"20",X"CB",X"3A",X"91",X"4D",X"CB",X"B7",X"32",X"91",X"4D",X"C9",X"78",X"FE",X"00",X"28", + X"D3",X"3A",X"91",X"4D",X"CB",X"F7",X"32",X"91",X"4D",X"18",X"C7",X"78",X"FE",X"00",X"28",X"D9", + X"3A",X"91",X"4D",X"CB",X"F7",X"32",X"91",X"4D",X"18",X"CD",X"05",X"4C",X"49",X"5A",X"41",X"52", + X"44",X"20",X"57",X"49",X"5A",X"41",X"52",X"44",X"2C",X"43",X"4F",X"50",X"59",X"52",X"49",X"47", + X"48",X"54",X"20",X"31",X"39",X"38",X"35",X"54",X"45",X"43",X"48",X"53",X"54",X"41",X"52",X"20", + X"49",X"4E",X"43",X"2E",X"21",X"F9",X"4C",X"11",X"10",X"00",X"3E",X"06",X"06",X"08",X"36",X"00", + X"23",X"10",X"FB",X"3D",X"C8",X"19",X"18",X"F4",X"21",X"92",X"4D",X"CB",X"A6",X"21",X"A3",X"4D", + X"11",X"F1",X"4D",X"01",X"03",X"00",X"ED",X"B0",X"3A",X"F5",X"4D",X"32",X"F4",X"4D",X"CD",X"71", + X"12",X"21",X"91",X"4D",X"CB",X"66",X"C0",X"21",X"92",X"4D",X"CB",X"E6",X"21",X"A6",X"4D",X"11", + X"F1",X"4D",X"01",X"03",X"00",X"ED",X"B0",X"3A",X"F6",X"4D",X"32",X"F4",X"4D",X"CD",X"71",X"12", + X"C9",X"01",X"00",X"0A",X"21",X"ED",X"4D",X"11",X"F3",X"4D",X"2B",X"2B",X"2B",X"C5",X"CD",X"03", + X"1D",X"C1",X"30",X"0A",X"3E",X"06",X"81",X"4F",X"10",X"ED",X"2B",X"2B",X"18",X"08",X"79",X"FE", + X"00",X"C8",X"23",X"23",X"23",X"23",X"C5",X"E5",X"06",X"00",X"21",X"EA",X"4D",X"11",X"F0",X"4D", + X"ED",X"B8",X"3E",X"40",X"CD",X"45",X"15",X"21",X"92",X"4D",X"CB",X"66",X"28",X"0F",X"11",X"62", + X"41",X"21",X"0A",X"1B",X"3E",X"01",X"06",X"0A",X"CD",X"66",X"16",X"18",X"0D",X"11",X"62",X"41", + X"21",X"FD",X"1A",X"3E",X"01",X"06",X"0A",X"CD",X"66",X"16",X"11",X"40",X"44",X"21",X"41",X"15", + X"3E",X"0B",X"06",X"1C",X"CD",X"7C",X"16",X"11",X"4C",X"44",X"21",X"42",X"15",X"3E",X"03",X"06", + X"1C",X"CD",X"7C",X"16",X"11",X"51",X"44",X"21",X"43",X"15",X"3E",X"10",X"06",X"1C",X"CD",X"7C", + X"16",X"11",X"50",X"44",X"21",X"44",X"15",X"3E",X"02",X"06",X"1C",X"CD",X"7C",X"16",X"D1",X"D5", + X"3E",X"40",X"D5",X"E1",X"13",X"01",X"03",X"00",X"77",X"ED",X"B0",X"36",X"00",X"01",X"02",X"00", + X"ED",X"B0",X"D1",X"C1",X"D5",X"78",X"21",X"6A",X"1D",X"CB",X"27",X"CD",X"E3",X"15",X"4E",X"23", + X"46",X"C5",X"21",X"80",X"04",X"09",X"0E",X"1A",X"06",X"0F",X"71",X"3E",X"20",X"CD",X"48",X"16", + X"10",X"F8",X"11",X"C3",X"40",X"21",X"2D",X"1B",X"3E",X"01",X"06",X"14",X"CD",X"66",X"16",X"11", + X"A5",X"41",X"21",X"41",X"1B",X"3E",X"01",X"06",X"07",X"CD",X"66",X"16",X"11",X"A7",X"40",X"21", + X"48",X"1B",X"3E",X"01",X"06",X"16",X"CD",X"66",X"16",X"11",X"A8",X"40",X"21",X"5E",X"1B",X"3E", + X"01",X"06",X"16",X"CD",X"66",X"16",X"11",X"69",X"42",X"21",X"74",X"1B",X"3E",X"01",X"06",X"08", + X"CD",X"66",X"16",X"11",X"4C",X"40",X"21",X"7C",X"1B",X"3E",X"03",X"06",X"01",X"CD",X"66",X"16", + X"11",X"8D",X"40",X"21",X"4C",X"1D",X"3E",X"01",X"06",X"1A",X"CD",X"66",X"16",X"3E",X"1A",X"11", + X"AD",X"47",X"12",X"AF",X"32",X"F7",X"4D",X"32",X"F8",X"4D",X"21",X"AD",X"47",X"22",X"F9",X"4D", + X"11",X"31",X"41",X"21",X"1D",X"1B",X"3E",X"01",X"06",X"10",X"CD",X"66",X"16",X"21",X"29",X"1D", + X"11",X"F4",X"42",X"01",X"09",X"00",X"ED",X"B0",X"AF",X"12",X"CD",X"88",X"15",X"3E",X"01",X"12", + X"21",X"AF",X"4D",X"11",X"94",X"42",X"CD",X"78",X"00",X"11",X"95",X"42",X"CD",X"78",X"00",X"11", + X"96",X"42",X"CD",X"78",X"00",X"11",X"97",X"42",X"CD",X"78",X"00",X"11",X"98",X"42",X"CD",X"78", + X"00",X"11",X"99",X"42",X"CD",X"78",X"00",X"11",X"9A",X"42",X"CD",X"78",X"00",X"11",X"9B",X"42", + X"CD",X"78",X"00",X"11",X"9C",X"42",X"CD",X"78",X"00",X"11",X"9D",X"42",X"CD",X"78",X"00",X"3A", + X"F5",X"4D",X"21",X"92",X"4D",X"CB",X"66",X"28",X"03",X"3A",X"F6",X"4D",X"CB",X"4F",X"CA",X"9F", + X"14",X"CB",X"57",X"CA",X"D7",X"14",X"3A",X"F5",X"4D",X"21",X"92",X"4D",X"CB",X"66",X"28",X"03", + X"3A",X"F6",X"4D",X"CB",X"67",X"C2",X"18",X"15",X"3A",X"F7",X"4D",X"FE",X"1B",X"28",X"1F",X"21", + X"32",X"1D",X"CD",X"E3",X"15",X"7E",X"E1",X"D1",X"12",X"13",X"77",X"3E",X"20",X"CD",X"48",X"16", + X"D5",X"E5",X"3A",X"F8",X"4D",X"3C",X"32",X"F8",X"4D",X"FE",X"03",X"C2",X"2B",X"15",X"21",X"7E", + X"1D",X"3A",X"F8",X"4D",X"CD",X"E3",X"15",X"7E",X"E1",X"D1",X"E5",X"CD",X"E8",X"15",X"21",X"F1", + X"4D",X"01",X"03",X"00",X"ED",X"B0",X"3A",X"F8",X"4D",X"FE",X"00",X"28",X"25",X"21",X"82",X"1D", + X"CD",X"E3",X"15",X"7E",X"D1",X"CD",X"52",X"16",X"21",X"F3",X"4D",X"CD",X"9C",X"11",X"21",X"B4", + X"4D",X"11",X"F2",X"43",X"CD",X"ED",X"15",X"21",X"92",X"4D",X"CB",X"86",X"3E",X"01",X"CD",X"70", + X"15",X"C9",X"D1",X"3E",X"80",X"CD",X"52",X"16",X"3E",X"20",X"CD",X"52",X"16",X"18",X"D9",X"3A", + X"F7",X"4D",X"FE",X"00",X"CA",X"16",X"14",X"3D",X"32",X"F7",X"4D",X"FE",X"1A",X"28",X"14",X"3E", + X"1B",X"2A",X"F9",X"4D",X"77",X"3E",X"20",X"CD",X"E3",X"15",X"22",X"F9",X"4D",X"3E",X"1A",X"77", + X"C3",X"16",X"14",X"3D",X"32",X"F7",X"4D",X"3E",X"1B",X"2A",X"F9",X"4D",X"2B",X"77",X"23",X"77", + X"23",X"77",X"2B",X"3E",X"40",X"18",X"E0",X"3A",X"F7",X"4D",X"FE",X"1B",X"CA",X"16",X"14",X"3C", + X"32",X"F7",X"4D",X"FE",X"1A",X"28",X"14",X"3E",X"1B",X"2A",X"F9",X"4D",X"77",X"3E",X"20",X"CD", + X"48",X"16",X"22",X"F9",X"4D",X"3E",X"1A",X"77",X"C3",X"16",X"14",X"3C",X"32",X"F7",X"4D",X"3E", + X"1B",X"2A",X"F9",X"4D",X"77",X"3E",X"40",X"CD",X"48",X"16",X"22",X"F9",X"4D",X"3E",X"1A",X"2B", + X"77",X"23",X"77",X"23",X"77",X"C3",X"16",X"14",X"3E",X"08",X"CD",X"CE",X"15",X"32",X"C0",X"50", + X"06",X"14",X"CD",X"90",X"15",X"DA",X"4E",X"14",X"C3",X"FF",X"13",X"3A",X"F5",X"4D",X"21",X"92", + X"4D",X"CB",X"66",X"28",X"03",X"3A",X"F6",X"4D",X"CB",X"67",X"32",X"C0",X"50",X"28",X"EC",X"18", + X"DC",X"02",X"1B",X"18",X"1A",X"21",X"40",X"40",X"11",X"41",X"40",X"01",X"7F",X"03",X"77",X"ED", + X"B0",X"32",X"C0",X"50",X"C9",X"21",X"40",X"44",X"11",X"41",X"44",X"01",X"7F",X"03",X"77",X"ED", + X"B0",X"32",X"C0",X"50",X"C9",X"3E",X"02",X"CD",X"55",X"15",X"3E",X"40",X"CD",X"45",X"15",X"C9", + X"47",X"AF",X"32",X"99",X"4D",X"32",X"9B",X"4D",X"3A",X"9B",X"4D",X"B8",X"C8",X"21",X"90",X"4D", + X"CB",X"6E",X"C0",X"32",X"C0",X"50",X"18",X"F0",X"E5",X"21",X"20",X"00",X"19",X"EB",X"E1",X"C9", + X"3A",X"92",X"4D",X"CB",X"47",X"28",X"0D",X"3A",X"9C",X"4D",X"47",X"3A",X"9B",X"4D",X"B8",X"30", + X"19",X"37",X"3F",X"C9",X"78",X"32",X"9C",X"4D",X"3A",X"92",X"4D",X"CB",X"C7",X"32",X"92",X"4D", + X"AF",X"32",X"9B",X"4D",X"32",X"99",X"4D",X"37",X"3F",X"C9",X"3A",X"92",X"4D",X"CB",X"87",X"32", + X"92",X"4D",X"37",X"C9",X"21",X"90",X"4D",X"CB",X"FE",X"CB",X"7E",X"C8",X"18",X"FB",X"47",X"AF", + X"32",X"9A",X"4D",X"3A",X"9A",X"4D",X"B8",X"C8",X"21",X"90",X"4D",X"CB",X"6E",X"C0",X"32",X"C0", + X"50",X"18",X"F0",X"85",X"6F",X"D0",X"24",X"C9",X"83",X"5F",X"D0",X"14",X"C9",X"3E",X"03",X"F5", + X"7E",X"E6",X"F0",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"47",X"3A",X"91",X"4D",X"CB", + X"77",X"28",X"22",X"78",X"12",X"1B",X"7E",X"E6",X"0F",X"47",X"3A",X"91",X"4D",X"CB",X"77",X"32", + X"91",X"4D",X"28",X"20",X"78",X"12",X"2B",X"1B",X"F1",X"3D",X"20",X"D3",X"3A",X"91",X"4D",X"CB", + X"B7",X"32",X"91",X"4D",X"C9",X"78",X"FE",X"00",X"28",X"DB",X"3A",X"91",X"4D",X"CB",X"F7",X"32", + X"91",X"4D",X"18",X"CF",X"78",X"FE",X"00",X"28",X"DD",X"3A",X"91",X"4D",X"CB",X"F7",X"32",X"91", + X"4D",X"18",X"D1",X"81",X"4F",X"D0",X"04",X"C9",X"D5",X"16",X"00",X"5F",X"37",X"3F",X"ED",X"52", + X"D1",X"C9",X"E5",X"EB",X"16",X"00",X"5F",X"37",X"3F",X"ED",X"52",X"EB",X"E1",X"C9",X"CD",X"5B", + X"1A",X"DD",X"CB",X"00",X"D6",X"C9",X"32",X"F8",X"4C",X"D5",X"3A",X"F8",X"4C",X"4F",X"ED",X"A0", + X"79",X"FE",X"00",X"20",X"F9",X"D1",X"CD",X"88",X"15",X"10",X"EE",X"C9",X"32",X"F8",X"4C",X"D5", + X"3A",X"F8",X"4C",X"4F",X"ED",X"A0",X"2B",X"79",X"FE",X"00",X"20",X"F8",X"D1",X"CD",X"88",X"15", + X"10",X"ED",X"C9",X"DD",X"7E",X"05",X"FD",X"96",X"05",X"B8",X"DA",X"E5",X"16",X"57",X"3E",X"FF", + X"90",X"47",X"7A",X"B8",X"D2",X"E5",X"16",X"DD",X"7E",X"04",X"FD",X"96",X"04",X"B9",X"DA",X"0F", + X"17",X"57",X"3E",X"FF",X"91",X"4F",X"7A",X"B9",X"D2",X"0F",X"17",X"FD",X"7E",X"05",X"DD",X"BE", + X"05",X"D2",X"24",X"17",X"FD",X"7E",X"04",X"DD",X"BE",X"04",X"D2",X"2C",X"17",X"3A",X"FF",X"4D", + X"21",X"DD",X"16",X"CB",X"27",X"CD",X"E3",X"15",X"5E",X"23",X"56",X"EB",X"E9",X"A9",X"17",X"82", + X"17",X"34",X"17",X"5B",X"17",X"DD",X"7E",X"04",X"FD",X"96",X"04",X"B9",X"38",X"18",X"57",X"3E", + X"FF",X"91",X"4F",X"7A",X"B9",X"30",X"0F",X"DD",X"7E",X"04",X"FD",X"BE",X"04",X"38",X"0A",X"DD", + X"36",X"00",X"18",X"3E",X"02",X"C9",X"3E",X"01",X"C9",X"DD",X"36",X"00",X"08",X"18",X"F4",X"DD", + X"7E",X"05",X"FD",X"BE",X"05",X"38",X"07",X"DD",X"36",X"00",X"00",X"3E",X"03",X"C9",X"DD",X"36", + X"00",X"10",X"18",X"F7",X"21",X"FF",X"4D",X"CB",X"C6",X"C3",X"C4",X"16",X"21",X"FF",X"4D",X"CB", + X"CE",X"C3",X"CD",X"16",X"FD",X"7E",X"04",X"DD",X"96",X"04",X"47",X"DD",X"7E",X"05",X"FD",X"96", + X"05",X"B8",X"28",X"09",X"38",X"0E",X"DD",X"36",X"00",X"02",X"C3",X"CD",X"17",X"DD",X"36",X"00", + X"04",X"C3",X"CD",X"17",X"DD",X"36",X"00",X"06",X"C3",X"CD",X"17",X"FD",X"7E",X"04",X"DD",X"96", + X"04",X"47",X"FD",X"7E",X"05",X"DD",X"96",X"05",X"B8",X"28",X"09",X"38",X"0E",X"DD",X"36",X"00", + X"0E",X"C3",X"CD",X"17",X"DD",X"36",X"00",X"0C",X"C3",X"CD",X"17",X"DD",X"36",X"00",X"0A",X"C3", + X"CD",X"17",X"DD",X"7E",X"04",X"FD",X"96",X"04",X"47",X"FD",X"7E",X"05",X"DD",X"96",X"05",X"B8", + X"28",X"09",X"38",X"0E",X"DD",X"36",X"00",X"12",X"C3",X"CD",X"17",X"DD",X"36",X"00",X"14",X"C3", + X"CD",X"17",X"DD",X"36",X"00",X"16",X"C3",X"CD",X"17",X"DD",X"7E",X"04",X"FD",X"96",X"04",X"47", + X"DD",X"7E",X"05",X"FD",X"96",X"05",X"B8",X"28",X"09",X"38",X"0E",X"DD",X"36",X"00",X"1E",X"C3", + X"CD",X"17",X"DD",X"36",X"00",X"1C",X"C3",X"CD",X"17",X"DD",X"36",X"00",X"1A",X"AF",X"32",X"FF", + X"4D",X"C9",X"2A",X"FD",X"4D",X"E5",X"21",X"13",X"8C",X"7D",X"E1",X"BD",X"CC",X"0F",X"18",X"7E", + X"FE",X"00",X"CA",X"F5",X"17",X"23",X"46",X"3A",X"75",X"4D",X"B8",X"CA",X"05",X"18",X"2B",X"22", + X"FD",X"4D",X"C3",X"0E",X"18",X"23",X"46",X"3A",X"76",X"4D",X"B8",X"CA",X"05",X"18",X"2B",X"22", + X"FD",X"4D",X"C3",X"0E",X"18",X"23",X"7E",X"32",X"F5",X"4D",X"23",X"22",X"FD",X"4D",X"C9",X"3E", + X"FF",X"32",X"F5",X"4D",X"C9",X"3A",X"00",X"50",X"E6",X"0F",X"47",X"3A",X"40",X"50",X"E6",X"F0", + X"B0",X"32",X"F5",X"4D",X"C9",X"3A",X"40",X"50",X"47",X"E6",X"0F",X"CB",X"78",X"28",X"02",X"CB", + X"E7",X"32",X"F6",X"4D",X"C9",X"DD",X"21",X"02",X"4E",X"DD",X"CB",X"00",X"46",X"C4",X"5E",X"16", + X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD",X"21",X"51",X"50",X"CD",X"5E",X"19", + X"DD",X"7E",X"06",X"32",X"45",X"50",X"DD",X"21",X"1D",X"4E",X"DD",X"CB",X"00",X"46",X"C4",X"5E", + X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD",X"21",X"51",X"50",X"CD",X"5E", + X"19",X"DD",X"7E",X"06",X"32",X"45",X"50",X"DD",X"21",X"38",X"4E",X"DD",X"CB",X"00",X"46",X"C4", + X"5E",X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD",X"21",X"51",X"50",X"CD", + X"5E",X"19",X"DD",X"7E",X"06",X"32",X"45",X"50",X"DD",X"21",X"53",X"4E",X"DD",X"CB",X"00",X"46", + X"C4",X"5E",X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD",X"21",X"56",X"50", + X"CD",X"5E",X"19",X"DD",X"7E",X"06",X"32",X"4A",X"50",X"DD",X"21",X"6E",X"4E",X"DD",X"CB",X"00", + X"46",X"C4",X"5E",X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD",X"21",X"56", + X"50",X"CD",X"5E",X"19",X"DD",X"7E",X"06",X"32",X"4A",X"50",X"DD",X"21",X"89",X"4E",X"DD",X"CB", + X"00",X"46",X"C4",X"5E",X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD",X"21", + X"56",X"50",X"CD",X"5E",X"19",X"DD",X"7E",X"06",X"32",X"4A",X"50",X"DD",X"21",X"A4",X"4E",X"DD", + X"CB",X"00",X"46",X"C4",X"5E",X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD", + X"21",X"5B",X"50",X"CD",X"5E",X"19",X"DD",X"7E",X"06",X"32",X"4F",X"50",X"DD",X"21",X"BF",X"4E", + X"DD",X"CB",X"00",X"46",X"C4",X"5E",X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19", + X"FD",X"21",X"5B",X"50",X"CD",X"5E",X"19",X"DD",X"7E",X"06",X"32",X"4F",X"50",X"DD",X"21",X"DA", + X"4E",X"DD",X"CB",X"00",X"46",X"C4",X"5E",X"16",X"DD",X"CB",X"00",X"56",X"C8",X"CD",X"87",X"19", + X"FD",X"21",X"5B",X"50",X"CD",X"5E",X"19",X"DD",X"7E",X"06",X"32",X"4F",X"50",X"C9",X"DD",X"7E", + X"03",X"FD",X"77",X"00",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"FD",X"77",X"01",X"DD", + X"7E",X"04",X"FD",X"77",X"02",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"FD",X"77",X"03", + X"DD",X"7E",X"05",X"FD",X"77",X"04",X"C9",X"DD",X"CB",X"00",X"4E",X"C2",X"5B",X"1A",X"DD",X"6E", + X"01",X"DD",X"66",X"02",X"7E",X"CB",X"27",X"11",X"A5",X"19",X"CD",X"E8",X"15",X"23",X"E5",X"1A", + X"6F",X"13",X"1A",X"67",X"E9",X"BF",X"19",X"C3",X"19",X"D1",X"19",X"DA",X"19",X"F0",X"19",X"FD", + X"19",X"17",X"1A",X"30",X"1A",X"52",X"1A",X"5A",X"1A",X"79",X"1A",X"85",X"1A",X"91",X"1A",X"E1", + X"C3",X"94",X"19",X"E1",X"7E",X"DD",X"77",X"03",X"23",X"7E",X"23",X"DD",X"77",X"04",X"C3",X"94", + X"19",X"E1",X"7E",X"DD",X"77",X"05",X"23",X"C3",X"94",X"19",X"E1",X"7E",X"DD",X"46",X"03",X"80", + X"DD",X"77",X"03",X"23",X"7E",X"23",X"DD",X"46",X"04",X"88",X"DD",X"77",X"04",X"C3",X"94",X"19", + X"E1",X"7E",X"DD",X"46",X"05",X"80",X"DD",X"77",X"05",X"23",X"C3",X"94",X"19",X"E1",X"DD",X"7E", + X"07",X"BE",X"30",X"0B",X"DD",X"34",X"07",X"2B",X"DD",X"75",X"01",X"DD",X"74",X"02",X"C9",X"DD", + X"36",X"07",X"00",X"23",X"C3",X"94",X"19",X"DD",X"6E",X"08",X"DD",X"66",X"09",X"D1",X"D5",X"2B", + X"72",X"2B",X"73",X"2B",X"36",X"00",X"DD",X"75",X"08",X"DD",X"74",X"09",X"E1",X"C3",X"94",X"19", + X"D1",X"1A",X"DD",X"6E",X"08",X"DD",X"66",X"09",X"BE",X"28",X"09",X"34",X"23",X"5E",X"23",X"56", + X"EB",X"C3",X"94",X"19",X"23",X"23",X"23",X"DD",X"75",X"08",X"DD",X"74",X"09",X"13",X"EB",X"C3", + X"94",X"19",X"E1",X"5E",X"23",X"56",X"EB",X"C3",X"94",X"19",X"E1",X"DD",X"E5",X"DD",X"E5",X"E1", + X"D1",X"13",X"36",X"00",X"01",X"18",X"00",X"ED",X"B0",X"1A",X"DD",X"77",X"01",X"13",X"1A",X"DD", + X"77",X"02",X"DD",X"75",X"08",X"DD",X"74",X"09",X"C9",X"E1",X"DD",X"75",X"01",X"DD",X"74",X"02", + X"DD",X"36",X"00",X"00",X"C9",X"E1",X"5E",X"23",X"56",X"EB",X"36",X"06",X"13",X"EB",X"C3",X"94", + X"19",X"E1",X"7E",X"DD",X"77",X"06",X"23",X"C3",X"94",X"19",X"32",X"40",X"52",X"45",X"59",X"41", + X"4C",X"50",X"40",X"45",X"52",X"4F",X"43",X"53",X"50",X"4F",X"54",X"40",X"31",X"40",X"52",X"45", + X"59",X"41",X"4C",X"50",X"54",X"49",X"44",X"45",X"52",X"43",X"59",X"41",X"4C",X"50",X"45",X"45", + X"52",X"46",X"40",X"4E",X"49",X"4F",X"43",X"40",X"54",X"52",X"45",X"53",X"4E",X"49",X"52",X"45", + X"59",X"41",X"4C",X"50",X"40",X"45",X"4E",X"4F",X"40",X"54",X"43",X"45",X"4C",X"45",X"53",X"52", + X"4F",X"53",X"52",X"45",X"59",X"41",X"4C",X"50",X"40",X"4F",X"57",X"54",X"40",X"52",X"4F",X"40", + X"45",X"4E",X"4F",X"40",X"54",X"43",X"45",X"4C",X"45",X"53",X"50",X"55",X"40",X"45",X"4E",X"4F", + X"40",X"52",X"45",X"59",X"41",X"4C",X"50",X"50",X"55",X"40",X"4F",X"57",X"54",X"40",X"52",X"45", + X"59",X"41",X"4C",X"50",X"52",X"45",X"56",X"4F",X"40",X"45",X"4D",X"41",X"47",X"59",X"52",X"44", + X"52",X"41",X"5A",X"49",X"57",X"40",X"46",X"4F",X"40",X"4C",X"4C",X"41",X"48",X"45",X"48",X"54", + X"40",X"4E",X"49",X"40",X"53",X"49",X"40",X"45",X"52",X"4F",X"43",X"53",X"40",X"52",X"55",X"4F", + X"59",X"4E",X"45",X"54",X"40",X"50",X"4F",X"54",X"54",X"43",X"45",X"4C",X"45",X"53",X"40",X"4F", + X"54",X"40",X"4B",X"43",X"49",X"54",X"53",X"59",X"4F",X"4A",X"40",X"45",X"53",X"55",X"4E",X"4F", + X"54",X"54",X"55",X"42",X"40",X"45",X"52",X"49",X"46",X"40",X"44",X"4E",X"41",X"40",X"52",X"45", + X"54",X"54",X"45",X"4C",X"54",X"4E",X"49",X"52",X"50",X"40",X"4F",X"54",X"45",X"4E",X"44",X"4D", + X"41",X"4C",X"53",X"53",X"4E",X"4F",X"49",X"54",X"43",X"55",X"52",X"54",X"53",X"4E",X"49",X"40", + X"59",X"41",X"4C",X"50",X"40",X"31",X"40",X"53",X"4E",X"49",X"4F",X"43",X"40",X"32",X"53",X"59", + X"41",X"4C",X"50",X"40",X"32",X"40",X"40",X"4E",X"49",X"4F",X"43",X"40",X"31",X"40",X"59",X"41", + X"4C",X"50",X"40",X"31",X"40",X"40",X"4E",X"49",X"4F",X"43",X"40",X"31",X"53",X"54",X"4E",X"49", + X"4F",X"50",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"59",X"52",X"45",X"56",X"45",X"40", + X"53",X"55",X"4E",X"4F",X"42",X"30",X"30",X"30",X"30",X"35",X"31",X"30",X"30",X"30",X"35",X"32", + X"31",X"30",X"30",X"30",X"30",X"30",X"31",X"40",X"30",X"30",X"30",X"35",X"37",X"53",X"43",X"49", + X"54",X"53",X"4F",X"4E",X"47",X"41",X"49",X"44",X"4E",X"4F",X"49",X"54",X"49",X"44",X"4E",X"4F", + X"43",X"40",X"40",X"4E",X"4F",X"49",X"54",X"41",X"43",X"4F",X"4C",X"40",X"40",X"4D",X"4F",X"52", + X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"44",X"37",X"40",X"40",X"40", + X"40",X"40",X"40",X"31",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"46", + X"37",X"40",X"40",X"40",X"40",X"40",X"40",X"32",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"48",X"37",X"40",X"40",X"40",X"40",X"40",X"40",X"33",X"44",X"4F",X"4F",X"47", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4A",X"37",X"40",X"40",X"40",X"40",X"40",X"40",X"34", + X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"48",X"34",X"40",X"40",X"40", + X"40",X"40",X"40",X"31",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4C", + X"34",X"40",X"40",X"40",X"40",X"40",X"40",X"32",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"4A",X"34",X"40",X"40",X"40",X"40",X"40",X"40",X"33",X"44",X"4F",X"4F",X"47", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4D",X"34",X"40",X"40",X"40",X"40",X"40",X"40",X"34", + X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4B",X"34",X"40",X"40",X"40", + X"40",X"40",X"40",X"35",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4E", + X"34",X"40",X"40",X"40",X"40",X"40",X"40",X"36",X"44",X"41",X"42",X"40",X"4E",X"4F",X"49",X"54", + X"49",X"44",X"4E",X"4F",X"43",X"40",X"40",X"4E",X"4F",X"49",X"54",X"41",X"43",X"4F",X"4C",X"40", + X"40",X"4D",X"41",X"52",X"4E",X"45",X"4D",X"40",X"41",X"52",X"54",X"58",X"45",X"40",X"32",X"40", + X"52",X"4F",X"46",X"06",X"03",X"1A",X"BE",X"38",X"08",X"20",X"0E",X"2B",X"1B",X"10",X"F6",X"18", + X"06",X"CD",X"1E",X"1D",X"37",X"3F",X"C9",X"37",X"C9",X"CD",X"1E",X"1D",X"37",X"C9",X"78",X"FE", + X"00",X"C8",X"2B",X"1B",X"3D",X"20",X"FB",X"C9",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07", + X"08",X"09",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E", + X"4F",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59",X"5A",X"5A",X"59",X"58",X"57", + X"56",X"55",X"54",X"53",X"52",X"51",X"50",X"4F",X"4E",X"4D",X"4C",X"4B",X"4A",X"49",X"48",X"47", + X"46",X"45",X"44",X"43",X"42",X"41",X"00",X"01",X"04",X"02",X"94",X"42",X"95",X"42",X"96",X"42", + X"97",X"42",X"98",X"42",X"99",X"42",X"9A",X"42",X"9B",X"42",X"9C",X"42",X"9D",X"42",X"03",X"02", + X"01",X"00",X"00",X"80",X"60",X"40",X"3A",X"FD",X"4E",X"A7",X"20",X"15",X"21",X"BF",X"4E",X"CB", + X"56",X"28",X"0E",X"3A",X"2A",X"4F",X"3C",X"32",X"2A",X"4F",X"20",X"05",X"CB",X"CE",X"C3",X"11", + X"31",X"3A",X"0B",X"4F",X"A7",X"C2",X"8C",X"30",X"21",X"09",X"4F",X"CB",X"7E",X"20",X"0E",X"35", + X"20",X"0B",X"3A",X"53",X"4E",X"A7",X"28",X"05",X"CB",X"CF",X"32",X"53",X"4E",X"3A",X"77",X"4D", + X"FE",X"78",X"DA",X"CA",X"1D",X"FE",X"90",X"DA",X"D7",X"1D",X"3A",X"5F",X"4D",X"FE",X"78",X"DA", + X"0A",X"1E",X"FE",X"90",X"D2",X"0A",X"1E",X"3A",X"FE",X"4E",X"FE",X"01",X"C2",X"17",X"1E",X"3A", + X"39",X"43",X"FE",X"E4",X"DA",X"F9",X"1D",X"3E",X"DD",X"32",X"39",X"43",X"32",X"F9",X"40",X"3C", + X"32",X"19",X"43",X"32",X"D9",X"40",X"C3",X"17",X"1E",X"3E",X"E4",X"32",X"39",X"43",X"32",X"19", + X"43",X"32",X"F9",X"40",X"32",X"D9",X"40",X"C3",X"17",X"1E",X"3A",X"39",X"43",X"FE",X"9A",X"CA", + X"17",X"1E",X"3E",X"9A",X"C3",X"FB",X"1D",X"3A",X"80",X"4C",X"A7",X"CA",X"36",X"1E",X"DD",X"21", + X"80",X"4C",X"21",X"A4",X"1E",X"3A",X"81",X"4C",X"A7",X"CA",X"58",X"1E",X"CD",X"6D",X"1E",X"DD", + X"22",X"F4",X"4C",X"CD",X"16",X"0E",X"3A",X"90",X"4C",X"A7",X"CA",X"39",X"20",X"21",X"BC",X"1E", + X"DD",X"21",X"90",X"4C",X"3A",X"91",X"4C",X"A7",X"CA",X"58",X"1E",X"CD",X"6D",X"1E",X"DD",X"22", + X"F4",X"4C",X"CD",X"16",X"0E",X"C3",X"39",X"20",X"DD",X"36",X"01",X"10",X"DD",X"36",X"05",X"AE", + X"DD",X"7E",X"09",X"CB",X"27",X"CD",X"E3",X"15",X"5E",X"23",X"56",X"EB",X"E9",X"DD",X"7E",X"04", + X"DD",X"96",X"08",X"C0",X"DD",X"7E",X"03",X"DD",X"96",X"07",X"CA",X"8A",X"1E",X"DA",X"85",X"1E", + X"DD",X"36",X"00",X"04",X"C9",X"DD",X"36",X"00",X"05",X"C9",X"DD",X"36",X"00",X"00",X"DD",X"36", + X"01",X"00",X"2A",X"8E",X"4D",X"CB",X"46",X"CA",X"9F",X"1E",X"DD",X"36",X"05",X"BE",X"C9",X"DD", + X"36",X"05",X"BD",X"C9",X"D4",X"1E",X"E3",X"1E",X"F2",X"1E",X"01",X"1F",X"10",X"1F",X"1F",X"1F", + X"2E",X"1F",X"3D",X"1F",X"4C",X"1F",X"5B",X"1F",X"6A",X"1F",X"79",X"1F",X"88",X"1F",X"97",X"1F", + X"A6",X"1F",X"B5",X"1F",X"C4",X"1F",X"D3",X"1F",X"E2",X"1F",X"F1",X"1F",X"00",X"20",X"0F",X"20", + X"1E",X"20",X"2D",X"20",X"DD",X"36",X"07",X"D0",X"DD",X"36",X"08",X"F8",X"DD",X"36",X"09",X"01", + X"C3",X"36",X"1E",X"DD",X"36",X"07",X"98",X"DD",X"36",X"08",X"E8",X"DD",X"36",X"09",X"02",X"C3", + X"36",X"1E",X"DD",X"36",X"07",X"C8",X"DD",X"36",X"08",X"E8",X"DD",X"36",X"09",X"03",X"C3",X"36", + X"1E",X"DD",X"36",X"07",X"D0",X"DD",X"36",X"08",X"E0",X"DD",X"36",X"09",X"04",X"C3",X"36",X"1E", + X"DD",X"36",X"07",X"A0",X"DD",X"36",X"08",X"E0",X"DD",X"36",X"09",X"05",X"C3",X"36",X"1E",X"DD", + X"36",X"07",X"A0",X"DD",X"36",X"08",X"F8",X"DD",X"36",X"09",X"06",X"C3",X"36",X"1E",X"DD",X"36", + X"07",X"D8",X"DD",X"36",X"08",X"F0",X"DD",X"36",X"09",X"07",X"C3",X"36",X"1E",X"DD",X"36",X"07", + X"B8",X"DD",X"36",X"08",X"F8",X"DD",X"36",X"09",X"08",X"C3",X"36",X"1E",X"DD",X"36",X"07",X"A8", + X"DD",X"36",X"08",X"F0",X"DD",X"36",X"09",X"09",X"C3",X"36",X"1E",X"DD",X"36",X"07",X"C8",X"DD", + X"36",X"08",X"F0",X"DD",X"36",X"09",X"0A",X"C3",X"36",X"1E",X"DD",X"36",X"07",X"B0",X"DD",X"36", + X"08",X"E8",X"DD",X"36",X"09",X"0B",X"C3",X"36",X"1E",X"DD",X"36",X"07",X"B8",X"DD",X"36",X"08", + X"E0",X"DD",X"36",X"09",X"0B",X"C3",X"36",X"1E",X"DD",X"36",X"07",X"08",X"DD",X"36",X"08",X"F8", + X"DD",X"36",X"09",X"01",X"C3",X"39",X"20",X"DD",X"36",X"07",X"40",X"DD",X"36",X"08",X"E8",X"DD", + X"36",X"09",X"02",X"C3",X"39",X"20",X"DD",X"36",X"07",X"10",X"DD",X"36",X"08",X"E8",X"DD",X"36", + X"09",X"03",X"C3",X"39",X"20",X"DD",X"36",X"07",X"08",X"DD",X"36",X"08",X"E0",X"DD",X"36",X"09", + X"04",X"C3",X"39",X"20",X"DD",X"36",X"07",X"38",X"DD",X"36",X"08",X"E0",X"DD",X"36",X"09",X"05", + X"C3",X"39",X"20",X"DD",X"36",X"07",X"38",X"DD",X"36",X"08",X"F8",X"DD",X"36",X"09",X"06",X"C3", + X"39",X"20",X"DD",X"36",X"07",X"00",X"DD",X"36",X"08",X"F0",X"DD",X"36",X"09",X"07",X"C3",X"39", + X"20",X"DD",X"36",X"07",X"20",X"DD",X"36",X"08",X"F8",X"DD",X"36",X"09",X"08",X"C3",X"39",X"20", + X"DD",X"36",X"07",X"30",X"DD",X"36",X"08",X"F0",X"DD",X"36",X"09",X"09",X"C3",X"39",X"20",X"DD", + X"36",X"07",X"10",X"DD",X"36",X"08",X"F0",X"DD",X"36",X"09",X"0A",X"C3",X"39",X"20",X"DD",X"36", + X"07",X"28",X"DD",X"36",X"08",X"E8",X"DD",X"36",X"09",X"0B",X"C3",X"39",X"20",X"DD",X"36",X"07", + X"20",X"DD",X"36",X"08",X"E0",X"DD",X"36",X"09",X"0B",X"3A",X"91",X"4D",X"CB",X"6F",X"28",X"16", + X"DD",X"21",X"71",X"4D",X"AF",X"32",X"22",X"4F",X"3A",X"F5",X"4D",X"32",X"23",X"4F",X"CD",X"D2", + X"2F",X"3A",X"0B",X"4F",X"A7",X"C0",X"3A",X"91",X"4D",X"CB",X"4F",X"28",X"17",X"DD",X"21",X"59", + X"4D",X"3E",X"01",X"32",X"22",X"4F",X"3A",X"F6",X"4D",X"32",X"23",X"4F",X"CD",X"D2",X"2F",X"3A", + X"0B",X"4F",X"A7",X"C0",X"21",X"FF",X"4E",X"34",X"20",X"43",X"21",X"00",X"4F",X"34",X"46",X"3A", + X"08",X"4F",X"B8",X"20",X"38",X"21",X"FF",X"4E",X"35",X"35",X"23",X"35",X"3A",X"24",X"4D",X"FE", + X"50",X"38",X"2A",X"CB",X"7F",X"20",X"22",X"DD",X"21",X"11",X"4D",X"CD",X"71",X"26",X"3A",X"15", + X"4D",X"A7",X"28",X"19",X"DD",X"36",X"13",X"0A",X"3A",X"17",X"4D",X"C6",X"18",X"32",X"17",X"4D", + X"21",X"BF",X"4E",X"CB",X"C6",X"DD",X"21",X"59",X"4D",X"AF",X"32",X"00",X"4F",X"3A",X"FF",X"4E", + X"CB",X"47",X"28",X"04",X"DD",X"21",X"71",X"4D",X"DD",X"7E",X"0B",X"32",X"FD",X"4C",X"DD",X"7E", + X"0C",X"32",X"FE",X"4C",X"DD",X"7E",X"0D",X"32",X"FF",X"4C",X"21",X"FE",X"4E",X"35",X"20",X"06", + X"36",X"06",X"21",X"01",X"4F",X"34",X"3A",X"25",X"4F",X"A7",X"C2",X"E2",X"2C",X"21",X"FA",X"4E", + X"35",X"C2",X"10",X"21",X"DD",X"21",X"41",X"4D",X"2B",X"7E",X"3C",X"E6",X"F3",X"77",X"3A",X"54", + X"4D",X"FE",X"20",X"D2",X"EA",X"21",X"CD",X"8E",X"2A",X"DD",X"36",X"0F",X"01",X"C3",X"D2",X"22", + X"7E",X"FE",X"02",X"CA",X"9F",X"22",X"DA",X"D4",X"21",X"FE",X"BF",X"CA",X"7B",X"21",X"FE",X"BC", + X"CA",X"9F",X"22",X"FE",X"04",X"30",X"32",X"3A",X"24",X"4D",X"FE",X"20",X"D2",X"59",X"21",X"DD", + X"21",X"11",X"4D",X"CD",X"8E",X"2A",X"DD",X"36",X"0F",X"01",X"DD",X"36",X"01",X"18",X"DD",X"36", + X"08",X"50",X"3A",X"15",X"4D",X"FE",X"01",X"C2",X"D2",X"22",X"DD",X"36",X"00",X"18",X"DD",X"36", + X"04",X"FF",X"DD",X"36",X"06",X"24",X"C3",X"D2",X"22",X"3A",X"2D",X"4D",X"A7",X"C2",X"6A",X"21", + X"DD",X"21",X"29",X"4D",X"CD",X"71",X"26",X"C3",X"EA",X"21",X"3A",X"45",X"4D",X"A7",X"C2",X"EA", + X"21",X"DD",X"21",X"41",X"4D",X"CD",X"71",X"26",X"C3",X"EA",X"21",X"3A",X"91",X"4D",X"CB",X"6F", + X"28",X"3B",X"3A",X"79",X"4D",X"E6",X"30",X"C2",X"BD",X"21",X"DD",X"21",X"71",X"4D",X"FD",X"21", + X"29",X"4D",X"01",X"30",X"50",X"CD",X"66",X"04",X"DA",X"B5",X"21",X"FD",X"21",X"41",X"4D",X"01", + X"30",X"50",X"CD",X"66",X"04",X"DA",X"B5",X"21",X"DD",X"36",X"06",X"74",X"DD",X"CB",X"08",X"E6", + X"21",X"A4",X"4E",X"CB",X"C6",X"3E",X"C0",X"32",X"FA",X"4E",X"C3",X"D2",X"22",X"3A",X"91",X"4D", + X"CB",X"4F",X"CA",X"EA",X"21",X"3A",X"61",X"4D",X"E6",X"30",X"C2",X"EA",X"21",X"DD",X"21",X"59", + X"4D",X"C3",X"8E",X"21",X"DD",X"21",X"29",X"4D",X"3A",X"3C",X"4D",X"FE",X"20",X"D2",X"EA",X"21", + X"CD",X"8E",X"2A",X"DD",X"36",X"0F",X"01",X"C3",X"D2",X"22",X"DD",X"21",X"29",X"4D",X"3A",X"3C", + X"4D",X"FE",X"20",X"D2",X"FD",X"21",X"21",X"38",X"4D",X"35",X"CA",X"F8",X"23",X"DD",X"21",X"41", + X"4D",X"3A",X"54",X"4D",X"FE",X"20",X"D2",X"10",X"22",X"21",X"50",X"4D",X"35",X"CA",X"F8",X"23", + X"DD",X"21",X"11",X"4D",X"3A",X"24",X"4D",X"FE",X"20",X"D2",X"23",X"22",X"21",X"20",X"4D",X"35", + X"CA",X"F8",X"23",X"DD",X"21",X"29",X"4D",X"3A",X"3C",X"4D",X"CB",X"7F",X"C2",X"D2",X"22",X"FE", + X"40",X"D2",X"3B",X"22",X"21",X"31",X"4D",X"35",X"CA",X"BB",X"24",X"DD",X"21",X"41",X"4D",X"3A", + X"54",X"4D",X"CB",X"7F",X"C2",X"D2",X"22",X"FE",X"40",X"D2",X"53",X"22",X"21",X"49",X"4D",X"35", + X"CA",X"BB",X"24",X"DD",X"21",X"11",X"4D",X"3A",X"24",X"4D",X"CB",X"7F",X"C2",X"D2",X"22",X"FE", + X"40",X"D2",X"D2",X"22",X"21",X"19",X"4D",X"35",X"CA",X"BB",X"24",X"C3",X"D2",X"22",X"91",X"4C", + X"49",X"5A",X"41",X"52",X"44",X"20",X"57",X"49",X"5A",X"41",X"52",X"44",X"2C",X"43",X"4F",X"50", + X"59",X"52",X"49",X"47",X"48",X"54",X"20",X"31",X"39",X"38",X"35",X"54",X"45",X"43",X"48",X"53", + X"54",X"41",X"52",X"20",X"49",X"4E",X"43",X"2E",X"DD",X"21",X"29",X"4D",X"C3",X"B6",X"22",X"3A", + X"3C",X"4D",X"E6",X"70",X"FE",X"50",X"28",X"F0",X"3A",X"54",X"4D",X"E6",X"70",X"FE",X"50",X"C2", + X"EA",X"21",X"DD",X"21",X"41",X"4D",X"DD",X"36",X"13",X"0A",X"DD",X"36",X"0F",X"08",X"DD",X"36", + X"01",X"10",X"DD",X"7E",X"04",X"FE",X"01",X"20",X"04",X"DD",X"36",X"04",X"FF",X"3E",X"18",X"32", + X"FA",X"4E",X"3A",X"FD",X"4E",X"FE",X"32",X"D4",X"DD",X"2C",X"FE",X"01",X"CA",X"BB",X"23",X"D2", + X"A3",X"23",X"3A",X"77",X"4D",X"FE",X"90",X"30",X"05",X"FE",X"78",X"D2",X"A3",X"23",X"3A",X"5F", + X"4D",X"FE",X"90",X"30",X"05",X"FE",X"78",X"D2",X"A3",X"23",X"3E",X"80",X"32",X"19",X"4D",X"32", + X"31",X"4D",X"32",X"49",X"4D",X"3A",X"3C",X"4D",X"CB",X"7F",X"C2",X"A3",X"23",X"3A",X"54",X"4D", + X"CB",X"7F",X"C2",X"A3",X"23",X"3A",X"24",X"4D",X"CB",X"7F",X"C2",X"A3",X"23",X"3A",X"3C",X"4D", + X"FE",X"40",X"30",X"09",X"AF",X"32",X"2A",X"4D",X"3E",X"5A",X"32",X"3C",X"4D",X"3A",X"54",X"4D", + X"FE",X"40",X"30",X"09",X"AF",X"32",X"42",X"4D",X"3E",X"5A",X"32",X"54",X"4D",X"3A",X"24",X"4D", + X"FE",X"40",X"30",X"09",X"AF",X"32",X"12",X"4D",X"3E",X"5A",X"32",X"24",X"4D",X"3A",X"76",X"4D", + X"FE",X"C9",X"30",X"4F",X"3A",X"5E",X"4D",X"FE",X"C9",X"30",X"48",X"3A",X"79",X"4D",X"CB",X"7F", + X"28",X"41",X"E6",X"CF",X"32",X"79",X"4D",X"AF",X"32",X"FA",X"4E",X"3A",X"61",X"4D",X"CB",X"7F", + X"28",X"31",X"E6",X"CF",X"32",X"61",X"4D",X"AF",X"32",X"5A",X"4D",X"32",X"72",X"4D",X"3A",X"53", + X"4E",X"CB",X"4F",X"20",X"03",X"A7",X"20",X"1B",X"3A",X"81",X"4C",X"A7",X"20",X"15",X"3A",X"91", + X"4C",X"A7",X"20",X"0F",X"3A",X"7E",X"4D",X"FE",X"90",X"20",X"08",X"3A",X"66",X"4D",X"FE",X"90", + X"CA",X"61",X"30",X"DD",X"21",X"29",X"4D",X"CD",X"79",X"25",X"DD",X"21",X"41",X"4D",X"CD",X"79", + X"25",X"DD",X"21",X"11",X"4D",X"CD",X"79",X"25",X"C3",X"4A",X"2C",X"3A",X"3C",X"4D",X"47",X"E6", + X"0F",X"FE",X"0A",X"30",X"13",X"78",X"E6",X"70",X"FE",X"30",X"28",X"0C",X"78",X"E6",X"F0",X"F6", + X"0A",X"32",X"3C",X"4D",X"AF",X"32",X"F8",X"4E",X"3A",X"54",X"4D",X"47",X"E6",X"0F",X"FE",X"0A", + X"30",X"C1",X"78",X"E6",X"70",X"FE",X"30",X"28",X"BA",X"78",X"E6",X"F0",X"F6",X"0A",X"32",X"54", + X"4D",X"AF",X"32",X"F8",X"4E",X"C3",X"A3",X"23",X"DD",X"7E",X"10",X"DD",X"77",X"0F",X"DD",X"7E", + X"13",X"E6",X"0F",X"FE",X"0E",X"CA",X"0E",X"24",X"D2",X"58",X"24",X"C3",X"23",X"22",X"FD",X"21", + X"71",X"4D",X"FD",X"CB",X"08",X"66",X"CA",X"58",X"24",X"01",X"00",X"00",X"CD",X"93",X"16",X"3A", + X"FC",X"4D",X"FE",X"00",X"30",X"15",X"DD",X"7E",X"07",X"FE",X"08",X"28",X"0E",X"DD",X"7E",X"00", + X"C6",X"10",X"FE",X"20",X"38",X"02",X"D6",X"20",X"DD",X"77",X"00",X"DD",X"7E",X"00",X"FE",X"10", + X"CA",X"D2",X"22",X"D2",X"51",X"24",X"A7",X"CA",X"D2",X"22",X"DD",X"CB",X"06",X"CE",X"C3",X"D2", + X"22",X"DD",X"CB",X"06",X"8E",X"C3",X"D2",X"22",X"FD",X"21",X"59",X"4D",X"FD",X"CB",X"08",X"66", + X"CA",X"9B",X"24",X"01",X"00",X"00",X"CD",X"93",X"16",X"3A",X"FC",X"4D",X"FE",X"00",X"30",X"15", + X"DD",X"7E",X"07",X"FE",X"08",X"28",X"0E",X"DD",X"7E",X"00",X"C6",X"10",X"FE",X"20",X"38",X"02", + X"D6",X"20",X"DD",X"77",X"00",X"DD",X"7E",X"00",X"FE",X"10",X"CA",X"D2",X"22",X"D2",X"A6",X"24", + X"A7",X"CA",X"D2",X"22",X"DD",X"CB",X"06",X"CE",X"C3",X"D2",X"22",X"3A",X"79",X"4D",X"CB",X"67", + X"C2",X"0E",X"24",X"C3",X"D2",X"22",X"DD",X"CB",X"06",X"8E",X"C3",X"D2",X"22",X"DD",X"CB",X"07", + X"5E",X"CA",X"23",X"22",X"DD",X"36",X"08",X"01",X"C3",X"D2",X"22",X"DD",X"36",X"08",X"03",X"DD", + X"7E",X"05",X"E6",X"07",X"C2",X"AD",X"24",X"DD",X"7E",X"04",X"47",X"3E",X"F0",X"90",X"32",X"F3", + X"4C",X"DD",X"7E",X"05",X"D6",X"10",X"32",X"F2",X"4C",X"CD",X"D0",X"0D",X"21",X"20",X"00",X"19", + X"DD",X"7E",X"06",X"CB",X"4F",X"3A",X"A1",X"4C",X"C2",X"F6",X"24",X"FE",X"04",X"D2",X"AD",X"24", + X"11",X"20",X"00",X"C3",X"FE",X"24",X"FE",X"05",X"DA",X"AD",X"24",X"11",X"E0",X"FF",X"DD",X"7E", + X"0D",X"A7",X"C2",X"0E",X"25",X"3A",X"F7",X"4E",X"DD",X"77",X"08",X"C3",X"D2",X"22",X"47",X"4F", + X"DD",X"75",X"09",X"DD",X"74",X"0A",X"19",X"7E",X"FE",X"9A",X"C2",X"6B",X"25",X"10",X"F7",X"DD", + X"71",X"11",X"3A",X"F7",X"4E",X"DD",X"77",X"08",X"DD",X"36",X"01",X"00",X"DD",X"36",X"0B",X"CD", + X"DD",X"CB",X"13",X"FE",X"DD",X"7E",X"06",X"FE",X"18",X"DA",X"4B",X"25",X"FE",X"30",X"DA",X"59", + X"25",X"E6",X"03",X"C6",X"58",X"DD",X"77",X"06",X"C3",X"D2",X"22",X"E6",X"03",X"C6",X"14",X"DD", + X"77",X"06",X"DD",X"CB",X"13",X"E6",X"C3",X"D2",X"22",X"E6",X"03",X"C6",X"2C",X"DD",X"77",X"06", + X"DD",X"36",X"08",X"55",X"DD",X"CB",X"13",X"E6",X"C3",X"D2",X"22",X"FE",X"CD",X"DA",X"D2",X"22", + X"79",X"90",X"CA",X"D2",X"22",X"4F",X"C3",X"1F",X"25",X"DD",X"7E",X"13",X"E6",X"70",X"FE",X"10", + X"CA",X"13",X"27",X"DA",X"EA",X"27",X"FE",X"30",X"CA",X"94",X"25",X"DA",X"D6",X"26",X"FE",X"40", + X"CA",X"33",X"26",X"C9",X"3A",X"FE",X"4E",X"FE",X"01",X"C2",X"13",X"2A",X"DD",X"36",X"01",X"10", + X"DD",X"7E",X"0D",X"FE",X"07",X"30",X"06",X"DD",X"34",X"0D",X"DD",X"34",X"0D",X"3E",X"F0",X"DD", + X"86",X"10",X"FE",X"0F",X"38",X"03",X"DD",X"77",X"10",X"3E",X"02",X"32",X"FA",X"4E",X"DD",X"7E", + X"06",X"D6",X"14",X"DD",X"77",X"06",X"DD",X"7E",X"13",X"E6",X"0F",X"FE",X"04",X"DD",X"36",X"13", + X"0A",X"CA",X"07",X"26",X"D2",X"10",X"26",X"FE",X"02",X"CA",X"F5",X"25",X"D2",X"FE",X"25",X"A7", + X"C2",X"EC",X"25",X"21",X"00",X"4C",X"CD",X"96",X"3A",X"C3",X"13",X"2A",X"21",X"10",X"4C",X"CD", + X"96",X"3A",X"C3",X"13",X"2A",X"21",X"20",X"4C",X"CD",X"96",X"3A",X"C3",X"13",X"2A",X"21",X"30", + X"4C",X"CD",X"96",X"3A",X"C3",X"13",X"2A",X"21",X"40",X"4C",X"CD",X"96",X"3A",X"C3",X"13",X"2A", + X"FE",X"06",X"CA",X"21",X"26",X"D2",X"2A",X"26",X"21",X"50",X"4C",X"CD",X"96",X"3A",X"C3",X"13", + X"2A",X"21",X"60",X"4C",X"CD",X"96",X"3A",X"C3",X"13",X"2A",X"21",X"70",X"4C",X"CD",X"96",X"3A", + X"C3",X"13",X"2A",X"DD",X"CB",X"13",X"7E",X"C2",X"61",X"26",X"CD",X"41",X"26",X"D0",X"C3",X"71", + X"26",X"DD",X"7E",X"05",X"FE",X"05",X"D8",X"3A",X"FE",X"4E",X"FE",X"01",X"C0",X"DD",X"7E",X"06", + X"47",X"E6",X"FC",X"4F",X"04",X"78",X"E6",X"03",X"81",X"DD",X"77",X"06",X"DD",X"36",X"01",X"20", + X"C9",X"DD",X"7E",X"0B",X"FE",X"9A",X"CA",X"1B",X"27",X"3E",X"D0",X"DD",X"77",X"0B",X"C3",X"7A", + X"27",X"DD",X"36",X"01",X"00",X"2A",X"8E",X"4D",X"7E",X"E6",X"07",X"FE",X"02",X"CA",X"BE",X"26", + X"DA",X"CA",X"26",X"FE",X"03",X"CA",X"B2",X"26",X"11",X"91",X"40",X"21",X"01",X"88",X"01",X"18", + X"0C",X"1A",X"FE",X"D3",X"C0",X"DD",X"71",X"00",X"DD",X"75",X"04",X"DD",X"74",X"05",X"DD",X"70", + X"06",X"DD",X"36",X"0F",X"01",X"DD",X"7E",X"13",X"E6",X"70",X"FE",X"60",X"C8",X"DD",X"36",X"13", + X"5A",X"C9",X"11",X"51",X"43",X"21",X"0F",X"88",X"01",X"08",X"0E",X"C3",X"91",X"26",X"11",X"87", + X"40",X"21",X"01",X"38",X"01",X"18",X"0C",X"C3",X"91",X"26",X"11",X"47",X"43",X"21",X"0F",X"38", + X"01",X"08",X"0E",X"C3",X"91",X"26",X"DD",X"7E",X"05",X"FE",X"11",X"D2",X"0C",X"27",X"DD",X"7E", + X"06",X"E6",X"03",X"C6",X"20",X"DD",X"77",X"06",X"DD",X"36",X"00",X"10",X"DD",X"36",X"01",X"15", + X"DD",X"36",X"07",X"14",X"DD",X"36",X"0D",X"07",X"3E",X"02",X"32",X"FA",X"4E",X"DD",X"36",X"10", + X"0F",X"DD",X"36",X"12",X"00",X"DD",X"36",X"13",X"0A",X"C3",X"13",X"2A",X"DD",X"CB",X"13",X"7E", + X"CA",X"F3",X"27",X"DD",X"7E",X"0B",X"FE",X"9A",X"C2",X"7A",X"27",X"DD",X"35",X"11",X"FA",X"43", + X"27",X"DD",X"6E",X"09",X"DD",X"66",X"0A",X"DD",X"CB",X"06",X"4E",X"CA",X"3D",X"27",X"01",X"20", + X"00",X"36",X"9A",X"09",X"DD",X"75",X"09",X"DD",X"74",X"0A",X"C3",X"13",X"2A",X"01",X"E0",X"FF", + X"C3",X"31",X"27",X"DD",X"7E",X"06",X"D6",X"0C",X"DD",X"77",X"06",X"DD",X"36",X"0F",X"01",X"DD", + X"36",X"01",X"10",X"FE",X"30",X"DD",X"CB",X"13",X"BE",X"D2",X"13",X"2A",X"DD",X"CB",X"13",X"A6", + X"FE",X"18",X"DA",X"88",X"28",X"DD",X"CB",X"07",X"5E",X"C2",X"73",X"27",X"DD",X"36",X"01",X"15", + X"C3",X"13",X"2A",X"DD",X"36",X"01",X"18",X"C3",X"13",X"2A",X"DD",X"7E",X"11",X"47",X"DD",X"7E", + X"0C",X"90",X"DD",X"6E",X"09",X"DD",X"66",X"0A",X"CA",X"B4",X"27",X"DD",X"34",X"0C",X"DD",X"CB", + X"06",X"4E",X"DD",X"7E",X"0B",X"CA",X"A6",X"27",X"01",X"E0",X"FF",X"09",X"77",X"DD",X"75",X"09", + X"DD",X"74",X"0A",X"C3",X"13",X"2A",X"01",X"20",X"00",X"09",X"77",X"DD",X"75",X"09",X"DD",X"74", + X"0A",X"C3",X"13",X"2A",X"DD",X"7E",X"0B",X"FE",X"D0",X"CA",X"DF",X"27",X"DD",X"34",X"0B",X"DD", + X"CB",X"06",X"4E",X"CA",X"D9",X"27",X"11",X"20",X"00",X"19",X"10",X"FD",X"DD",X"75",X"09",X"DD", + X"74",X"0A",X"DD",X"36",X"0C",X"00",X"C3",X"13",X"2A",X"11",X"E0",X"FF",X"C3",X"C9",X"27",X"DD", + X"36",X"0B",X"9A",X"DD",X"36",X"0C",X"00",X"C3",X"13",X"2A",X"CD",X"B1",X"3A",X"D2",X"F3",X"27", + X"DD",X"34",X"12",X"3A",X"FE",X"4E",X"FE",X"06",X"28",X"05",X"FE",X"03",X"C2",X"88",X"28",X"DD", + X"7E",X"06",X"47",X"E6",X"FC",X"FE",X"58",X"DA",X"21",X"28",X"FE",X"5C",X"C2",X"18",X"28",X"78", + X"C6",X"FC",X"DD",X"77",X"06",X"C3",X"13",X"2A",X"78",X"C6",X"04",X"DD",X"77",X"06",X"C3",X"13", + X"2A",X"DD",X"CB",X"12",X"46",X"CA",X"5C",X"28",X"DD",X"35",X"05",X"78",X"E6",X"FC",X"FE",X"30", + X"DA",X"3D",X"28",X"C2",X"0F",X"28",X"DD",X"CB",X"12",X"86",X"C3",X"18",X"28",X"FE",X"18",X"CA", + X"4F",X"28",X"A7",X"CA",X"4F",X"28",X"78",X"C6",X"FC",X"DD",X"77",X"06",X"C3",X"88",X"28",X"DD", + X"CB",X"12",X"86",X"78",X"C6",X"04",X"DD",X"77",X"06",X"C3",X"88",X"28",X"DD",X"34",X"05",X"78", + X"E6",X"FC",X"FE",X"10",X"DA",X"53",X"28",X"CA",X"7E",X"28",X"FE",X"28",X"DA",X"53",X"28",X"CA", + X"7E",X"28",X"FE",X"54",X"DA",X"18",X"28",X"DD",X"CB",X"12",X"C6",X"C3",X"0F",X"28",X"DD",X"CB", + X"12",X"C6",X"78",X"C6",X"FC",X"DD",X"77",X"06",X"DD",X"7E",X"13",X"FE",X"20",X"D2",X"13",X"2A", + X"E6",X"0F",X"FE",X"0A",X"D2",X"13",X"2A",X"4F",X"FE",X"03",X"CA",X"2A",X"29",X"D2",X"AE",X"28", + X"FE",X"01",X"CA",X"30",X"29",X"D2",X"24",X"29",X"21",X"03",X"4C",X"C3",X"15",X"29",X"FE",X"06", + X"CA",X"36",X"29",X"D2",X"3C",X"29",X"FE",X"04",X"CA",X"12",X"29",X"21",X"53",X"4C",X"C3",X"15", + X"29",X"3E",X"F0",X"DD",X"86",X"05",X"47",X"DD",X"CB",X"06",X"4E",X"C2",X"42",X"29",X"AF",X"DD", + X"96",X"04",X"BB",X"CA",X"07",X"29",X"DA",X"F0",X"28",X"78",X"C6",X"05",X"92",X"DA",X"52",X"29", + X"FE",X"0A",X"DA",X"47",X"29",X"DD",X"36",X"00",X"04",X"DD",X"CB",X"06",X"CE",X"C3",X"13",X"2A", + X"78",X"C6",X"05",X"92",X"DA",X"68",X"29",X"FE",X"0A",X"DA",X"5D",X"29",X"DD",X"36",X"00",X"1C", + X"DD",X"CB",X"06",X"8E",X"C3",X"13",X"2A",X"78",X"BA",X"DA",X"73",X"29",X"C2",X"7A",X"29",X"C3", + X"81",X"29",X"21",X"43",X"4C",X"5E",X"23",X"56",X"23",X"7E",X"FE",X"AD",X"DA",X"C1",X"28",X"3E", + X"F8",X"C3",X"C3",X"28",X"21",X"23",X"4C",X"C3",X"15",X"29",X"21",X"33",X"4C",X"C3",X"15",X"29", + X"21",X"13",X"4C",X"C3",X"15",X"29",X"21",X"63",X"4C",X"C3",X"15",X"29",X"21",X"73",X"4C",X"C3", + X"15",X"29",X"3E",X"E8",X"C3",X"CF",X"28",X"DD",X"36",X"00",X"08",X"DD",X"CB",X"06",X"CE",X"C3", + X"13",X"2A",X"DD",X"36",X"00",X"0C",X"DD",X"CB",X"06",X"CE",X"C3",X"13",X"2A",X"DD",X"36",X"00", + X"18",X"DD",X"CB",X"06",X"8E",X"C3",X"13",X"2A",X"DD",X"36",X"00",X"14",X"DD",X"CB",X"06",X"8E", + X"C3",X"13",X"2A",X"DD",X"36",X"00",X"10",X"C3",X"13",X"2A",X"DD",X"36",X"00",X"00",X"C3",X"13", + X"2A",X"7E",X"FE",X"AD",X"DA",X"FD",X"29",X"21",X"F8",X"4E",X"79",X"FE",X"03",X"CA",X"A3",X"29", + X"D2",X"BB",X"29",X"FE",X"01",X"CA",X"AB",X"29",X"D2",X"B3",X"29",X"CB",X"86",X"21",X"00",X"4C", + X"C3",X"E5",X"29",X"CB",X"9E",X"21",X"30",X"4C",X"C3",X"E5",X"29",X"CB",X"8E",X"21",X"10",X"4C", + X"C3",X"E5",X"29",X"CB",X"96",X"21",X"20",X"4C",X"C3",X"E5",X"29",X"FE",X"06",X"CA",X"D0",X"29", + X"D2",X"D8",X"29",X"FE",X"04",X"CA",X"E0",X"29",X"CB",X"AE",X"21",X"50",X"4C",X"C3",X"E5",X"29", + X"CB",X"B6",X"21",X"60",X"4C",X"C3",X"E5",X"29",X"CB",X"BE",X"21",X"70",X"4C",X"C3",X"E5",X"29", + X"CB",X"A6",X"21",X"40",X"4C",X"CD",X"96",X"3A",X"DD",X"36",X"00",X"00",X"DD",X"7E",X"06",X"E6", + X"03",X"C6",X"38",X"DD",X"77",X"06",X"DD",X"36",X"13",X"2A",X"C3",X"13",X"2A",X"DD",X"7E",X"06", + X"E6",X"03",X"C6",X"14",X"DD",X"77",X"06",X"DD",X"CB",X"13",X"E6",X"DD",X"CB",X"13",X"EE",X"DD", + X"36",X"01",X"00",X"DD",X"7E",X"13",X"E6",X"70",X"FE",X"40",X"D0",X"3A",X"79",X"4D",X"E6",X"30", + X"FE",X"10",X"20",X"54",X"FD",X"21",X"71",X"4D",X"01",X"08",X"08",X"CD",X"66",X"04",X"30",X"48", + X"FD",X"7E",X"08",X"E6",X"C0",X"F6",X"26",X"FD",X"77",X"08",X"FD",X"36",X"00",X"10",X"CD",X"F4", + X"2A",X"DD",X"7E",X"13",X"E6",X"80",X"F6",X"4A",X"DD",X"77",X"13",X"DD",X"36",X"01",X"20",X"DD", + X"36",X"00",X"10",X"FD",X"7E",X"04",X"FD",X"77",X"0B",X"FD",X"7E",X"05",X"FD",X"77",X"0C",X"FD", + X"36",X"0D",X"98",X"FD",X"36",X"17",X"90",X"21",X"53",X"4E",X"CB",X"C6",X"DD",X"7E",X"07",X"FE", + X"08",X"C0",X"21",X"A4",X"4E",X"CB",X"C6",X"C9",X"3A",X"61",X"4D",X"E6",X"30",X"FE",X"10",X"C0", + X"FD",X"21",X"59",X"4D",X"01",X"08",X"08",X"CD",X"66",X"04",X"D0",X"C3",X"30",X"2A",X"3A",X"79", + X"4D",X"CB",X"67",X"C2",X"B3",X"2A",X"3A",X"61",X"4D",X"CB",X"67",X"C2",X"B3",X"2A",X"3E",X"C0", + X"32",X"FA",X"4E",X"DD",X"CB",X"06",X"4E",X"20",X"05",X"DD",X"36",X"00",X"1C",X"C9",X"DD",X"36", + X"00",X"04",X"C9",X"DD",X"7E",X"06",X"FE",X"18",X"D2",X"21",X"2C",X"3A",X"F9",X"4E",X"CB",X"47", + X"CA",X"21",X"2C",X"3A",X"F8",X"4E",X"FE",X"10",X"DA",X"DD",X"2A",X"CB",X"7F",X"C2",X"60",X"2B", + X"CB",X"77",X"C2",X"73",X"2B",X"CB",X"6F",X"C2",X"86",X"2B",X"C3",X"99",X"2B",X"CB",X"5F",X"C2", + X"AC",X"2B",X"CB",X"57",X"C2",X"BF",X"2B",X"CB",X"4F",X"C2",X"D2",X"2B",X"CB",X"47",X"C2",X"E5", + X"2B",X"C3",X"21",X"2C",X"DD",X"7E",X"13",X"E6",X"0F",X"FE",X"0A",X"D0",X"FE",X"03",X"CA",X"45", + X"2B",X"D2",X"15",X"2B",X"FE",X"01",X"CA",X"57",X"2B",X"D2",X"4E",X"2B",X"3A",X"F8",X"4E",X"CB", + X"C7",X"32",X"F8",X"4E",X"C9",X"FE",X"06",X"CA",X"33",X"2B",X"D2",X"2A",X"2B",X"FE",X"04",X"28", + X"1B",X"3A",X"F8",X"4E",X"CB",X"EF",X"32",X"F8",X"4E",X"C9",X"3A",X"F8",X"4E",X"CB",X"FF",X"32", + X"F8",X"4E",X"C9",X"3A",X"F8",X"4E",X"CB",X"F7",X"32",X"F8",X"4E",X"C9",X"3A",X"F8",X"4E",X"CB", + X"E7",X"32",X"F8",X"4E",X"C9",X"3A",X"F8",X"4E",X"CB",X"DF",X"32",X"F8",X"4E",X"C9",X"3A",X"F8", + X"4E",X"CB",X"D7",X"32",X"F8",X"4E",X"C9",X"3A",X"F8",X"4E",X"CB",X"CF",X"32",X"F8",X"4E",X"C9", + X"3A",X"73",X"4C",X"57",X"1E",X"07",X"CD",X"F8",X"2B",X"D0",X"3A",X"F8",X"4E",X"CB",X"BF",X"32", + X"F8",X"4E",X"C9",X"3A",X"63",X"4C",X"57",X"1E",X"06",X"CD",X"F8",X"2B",X"D0",X"3A",X"F8",X"4E", + X"CB",X"B7",X"32",X"F8",X"4E",X"C9",X"3A",X"53",X"4C",X"57",X"1E",X"05",X"CD",X"F8",X"2B",X"D0", + X"3A",X"F8",X"4E",X"CB",X"AF",X"32",X"F8",X"4E",X"C9",X"3A",X"43",X"4C",X"57",X"1E",X"04",X"CD", + X"F8",X"2B",X"D0",X"3A",X"F8",X"4E",X"CB",X"A7",X"32",X"F8",X"4E",X"C9",X"3A",X"33",X"4C",X"57", + X"1E",X"03",X"CD",X"F8",X"2B",X"D0",X"3A",X"F8",X"4E",X"CB",X"9F",X"32",X"F8",X"4E",X"C9",X"3A", + X"23",X"4C",X"57",X"1E",X"02",X"CD",X"F8",X"2B",X"D0",X"3A",X"F8",X"4E",X"CB",X"97",X"32",X"F8", + X"4E",X"C9",X"3A",X"13",X"4C",X"57",X"1E",X"01",X"CD",X"F8",X"2B",X"D0",X"3A",X"F8",X"4E",X"CB", + X"8F",X"32",X"F8",X"4E",X"C9",X"3A",X"03",X"4C",X"57",X"1E",X"00",X"CD",X"F8",X"2B",X"D0",X"3A", + X"F8",X"4E",X"CB",X"87",X"32",X"F8",X"4E",X"C9",X"DD",X"7E",X"04",X"FE",X"E4",X"D2",X"21",X"2C", + X"47",X"3E",X"E4",X"90",X"4F",X"7A",X"B9",X"38",X"0A",X"47",X"79",X"C6",X"20",X"B8",X"38",X"03", + X"C3",X"21",X"2C",X"CD",X"F4",X"2A",X"DD",X"7E",X"13",X"E6",X"F0",X"83",X"DD",X"77",X"13",X"37", + X"C9",X"CD",X"F4",X"2A",X"3A",X"F9",X"4E",X"E6",X"0F",X"FE",X"02",X"DA",X"3F",X"2C",X"3A",X"91", + X"4D",X"CB",X"4F",X"CA",X"3F",X"2C",X"DD",X"7E",X"13",X"F6",X"0F",X"DD",X"77",X"13",X"C9",X"DD", + X"7E",X"13",X"E6",X"F0",X"F6",X"0E",X"DD",X"77",X"13",X"C9",X"21",X"29",X"4D",X"22",X"89",X"4D", + X"CD",X"8D",X"0C",X"21",X"41",X"4D",X"22",X"89",X"4D",X"CD",X"8D",X"0C",X"21",X"11",X"4D",X"22", + X"89",X"4D",X"CD",X"8D",X"0C",X"3A",X"29",X"4F",X"A7",X"20",X"39",X"DD",X"21",X"00",X"4C",X"CD", + X"E1",X"3B",X"DD",X"21",X"10",X"4C",X"CD",X"E1",X"3B",X"DD",X"21",X"20",X"4C",X"CD",X"E1",X"3B", + X"DD",X"21",X"30",X"4C",X"CD",X"E1",X"3B",X"DD",X"21",X"40",X"4C",X"CD",X"E1",X"3B",X"DD",X"21", + X"50",X"4C",X"CD",X"E1",X"3B",X"DD",X"21",X"60",X"4C",X"CD",X"E1",X"3B",X"DD",X"21",X"70",X"4C", + X"CD",X"E1",X"3B",X"C9",X"DD",X"21",X"00",X"4C",X"CD",X"25",X"93",X"DD",X"21",X"10",X"4C",X"CD", + X"25",X"93",X"DD",X"21",X"20",X"4C",X"CD",X"25",X"93",X"DD",X"21",X"30",X"4C",X"CD",X"25",X"93", + X"DD",X"21",X"40",X"4C",X"CD",X"25",X"93",X"DD",X"21",X"50",X"4C",X"CD",X"25",X"93",X"DD",X"21", + X"60",X"4C",X"CD",X"25",X"93",X"DD",X"21",X"70",X"4C",X"CD",X"25",X"93",X"C9",X"AF",X"32",X"FD", + X"4E",X"C9",X"3A",X"FD",X"4E",X"FE",X"32",X"D4",X"DD",X"2C",X"A7",X"C2",X"35",X"2D",X"21",X"61", + X"40",X"01",X"A0",X"00",X"7E",X"FE",X"9A",X"20",X"3C",X"09",X"7D",X"FE",X"21",X"20",X"F5",X"3A", + X"79",X"4D",X"CB",X"7F",X"CA",X"35",X"2D",X"E6",X"CF",X"32",X"79",X"4D",X"3A",X"61",X"4D",X"CB", + X"7F",X"CA",X"35",X"2D",X"E6",X"CF",X"32",X"61",X"4D",X"AF",X"32",X"5A",X"4D",X"32",X"72",X"4D", + X"3A",X"53",X"4E",X"A7",X"20",X"0F",X"3A",X"7E",X"4D",X"FE",X"90",X"20",X"08",X"3A",X"66",X"4D", + X"FE",X"90",X"CA",X"61",X"30",X"21",X"61",X"40",X"01",X"A0",X"00",X"E5",X"CD",X"A9",X"2F",X"E1", + X"09",X"7D",X"FE",X"21",X"20",X"F5",X"3A",X"26",X"4F",X"A7",X"C0",X"DD",X"21",X"29",X"4D",X"3A", + X"34",X"4D",X"A7",X"28",X"08",X"3A",X"2E",X"4D",X"FE",X"D4",X"D2",X"88",X"2D",X"CD",X"FA",X"2D", + X"DD",X"21",X"41",X"4D",X"3A",X"4C",X"4D",X"A7",X"28",X"08",X"3A",X"46",X"4D",X"FE",X"D4",X"D2", + X"88",X"2D",X"CD",X"FA",X"2D",X"21",X"29",X"4D",X"22",X"89",X"4D",X"CD",X"8D",X"0C",X"21",X"41", + X"4D",X"22",X"89",X"4D",X"CD",X"8D",X"0C",X"C9",X"3A",X"79",X"4D",X"CB",X"7F",X"C8",X"3A",X"61", + X"4D",X"CB",X"7F",X"C8",X"DD",X"E5",X"CD",X"93",X"31",X"DD",X"E1",X"3E",X"01",X"32",X"26",X"4F", + X"01",X"00",X"04",X"DD",X"6E",X"09",X"DD",X"66",X"0A",X"09",X"06",X"18",X"77",X"2B",X"10",X"FC", + X"FE",X"08",X"28",X"0A",X"F5",X"3E",X"0C",X"CD",X"CE",X"15",X"F1",X"3C",X"18",X"E2",X"21",X"59", + X"4D",X"36",X"10",X"23",X"36",X"20",X"21",X"71",X"4D",X"36",X"10",X"23",X"36",X"20",X"3E",X"B6", + X"32",X"61",X"4D",X"32",X"79",X"4D",X"3E",X"90",X"32",X"2F",X"4D",X"32",X"47",X"4D",X"CD",X"75", + X"2D",X"21",X"53",X"4E",X"CB",X"C6",X"21",X"61",X"40",X"01",X"A0",X"00",X"7E",X"FE",X"9A",X"28", + X"02",X"36",X"E1",X"09",X"7D",X"FE",X"21",X"20",X"F3",X"C9",X"DD",X"CB",X"0B",X"46",X"CA",X"AE", + X"2E",X"DD",X"7E",X"05",X"47",X"FE",X"14",X"20",X"51",X"DD",X"6E",X"09",X"DD",X"66",X"0A",X"7E", + X"FE",X"9A",X"28",X"11",X"FE",X"DF",X"28",X"20",X"DD",X"36",X"0B",X"00",X"DD",X"36",X"04",X"00", + X"DD",X"36",X"05",X"F0",X"C9",X"3A",X"FC",X"4E",X"A7",X"28",X"F1",X"3D",X"32",X"FC",X"4E",X"DD", + X"36",X"05",X"15",X"36",X"DF",X"C3",X"4C",X"2E",X"78",X"C6",X"08",X"47",X"23",X"7E",X"FE",X"DF", + X"28",X"F6",X"2D",X"DD",X"75",X"09",X"DD",X"74",X"0A",X"DD",X"70",X"05",X"DD",X"36",X"06",X"B8", + X"3A",X"FB",X"4E",X"DD",X"77",X"01",X"DD",X"36",X"0B",X"01",X"DD",X"7E",X"08",X"A7",X"28",X"3B", + X"3A",X"FE",X"4E",X"FE",X"01",X"20",X"12",X"DD",X"7E",X"06",X"FE",X"BC",X"28",X"07",X"DD",X"36", + X"06",X"BC",X"C3",X"79",X"2E",X"DD",X"36",X"06",X"B8",X"DD",X"7E",X"05",X"D6",X"0C",X"32",X"F2", + X"4C",X"DD",X"46",X"04",X"3E",X"F3",X"90",X"32",X"F3",X"4C",X"CD",X"D0",X"0D",X"1A",X"FE",X"DF", + X"C8",X"3E",X"DF",X"12",X"DD",X"35",X"08",X"DD",X"34",X"09",X"C9",X"DD",X"6E",X"09",X"DD",X"66", + X"0A",X"36",X"E0",X"DD",X"36",X"01",X"00",X"DD",X"36",X"06",X"90",X"C3",X"18",X"2E",X"DD",X"E5", + X"DD",X"21",X"29",X"4D",X"FD",X"21",X"41",X"4D",X"2A",X"8E",X"4D",X"7E",X"E6",X"07",X"3D",X"28", + X"3F",X"FE",X"02",X"28",X"73",X"DA",X"70",X"2F",X"DD",X"CB",X"0B",X"46",X"20",X"14",X"DD",X"36", + X"04",X"73",X"DD",X"36",X"05",X"14",X"DD",X"36",X"08",X"06",X"DD",X"36",X"09",X"41",X"DD",X"36", + X"0A",X"42",X"FD",X"CB",X"0B",X"46",X"C2",X"A4",X"2F",X"FD",X"36",X"04",X"9B",X"FD",X"36",X"05", + X"14",X"FD",X"36",X"08",X"04",X"FD",X"36",X"09",X"A1",X"FD",X"36",X"0A",X"41",X"C3",X"A4",X"2F", + X"DD",X"CB",X"0B",X"46",X"20",X"14",X"DD",X"36",X"04",X"23",X"DD",X"36",X"05",X"14",X"DD",X"36", + X"08",X"0A",X"DD",X"36",X"09",X"81",X"DD",X"36",X"0A",X"43",X"FD",X"CB",X"0B",X"46",X"C2",X"A4", + X"2F",X"FD",X"36",X"04",X"9B",X"FD",X"36",X"05",X"14",X"FD",X"36",X"08",X"03",X"FD",X"36",X"09", + X"A1",X"FD",X"36",X"0A",X"41",X"C3",X"A4",X"2F",X"DD",X"CB",X"0B",X"46",X"20",X"14",X"DD",X"36", + X"04",X"4B",X"DD",X"36",X"05",X"14",X"DD",X"36",X"08",X"08",X"DD",X"36",X"09",X"E1",X"DD",X"36", + X"0A",X"42",X"FD",X"CB",X"0B",X"46",X"C2",X"A4",X"2F",X"FD",X"36",X"04",X"C3",X"FD",X"36",X"05", + X"14",X"FD",X"36",X"08",X"05",X"FD",X"36",X"09",X"01",X"FD",X"36",X"0A",X"41",X"C3",X"A4",X"2F", + X"DD",X"CB",X"0B",X"46",X"20",X"14",X"DD",X"36",X"04",X"73",X"DD",X"36",X"05",X"14",X"DD",X"36", + X"08",X"03",X"DD",X"36",X"09",X"41",X"DD",X"36",X"0A",X"42",X"FD",X"CB",X"0B",X"46",X"20",X"14", + X"FD",X"36",X"04",X"EB",X"FD",X"36",X"05",X"14",X"FD",X"36",X"08",X"07",X"FD",X"36",X"09",X"61", + X"FD",X"36",X"0A",X"40",X"DD",X"E1",X"C3",X"01",X"2E",X"7E",X"FE",X"9A",X"C8",X"FE",X"DF",X"C8", + X"FE",X"AD",X"38",X"1B",X"23",X"7E",X"FE",X"E0",X"28",X"12",X"FE",X"AA",X"38",X"0E",X"FE",X"AD", + X"30",X"F2",X"FE",X"AC",X"28",X"03",X"3C",X"77",X"C9",X"36",X"9A",X"2B",X"36",X"AA",X"C9",X"36", + X"9A",X"C9",X"3A",X"21",X"4F",X"A7",X"20",X"53",X"DD",X"7E",X"08",X"47",X"E6",X"30",X"FE",X"10", + X"CA",X"DA",X"31",X"DA",X"D1",X"35",X"CB",X"78",X"CA",X"71",X"36",X"CD",X"41",X"26",X"D2",X"CA", + X"35",X"DD",X"36",X"01",X"00",X"DD",X"36",X"05",X"00",X"DD",X"36",X"06",X"90",X"DD",X"36",X"08", + X"C6",X"DD",X"36",X"0D",X"90",X"3A",X"22",X"4F",X"A7",X"3A",X"91",X"4D",X"20",X"0C",X"CB",X"4F", + X"28",X"14",X"CB",X"AF",X"32",X"91",X"4D",X"C3",X"D1",X"35",X"CB",X"6F",X"28",X"08",X"CB",X"8F", + X"32",X"91",X"4D",X"C3",X"D1",X"35",X"3E",X"01",X"32",X"21",X"4F",X"3A",X"61",X"4D",X"CB",X"7F", + X"CA",X"71",X"36",X"3A",X"79",X"4D",X"CB",X"7F",X"CA",X"71",X"36",X"3A",X"3C",X"4D",X"CB",X"7F", + X"C2",X"D1",X"35",X"3A",X"54",X"4D",X"CB",X"7F",X"C2",X"D1",X"35",X"3A",X"24",X"4D",X"CB",X"7F", + X"C2",X"D1",X"35",X"3A",X"81",X"4C",X"A7",X"C2",X"D1",X"35",X"3A",X"90",X"4C",X"A7",X"C2",X"D1", + X"35",X"3A",X"25",X"4F",X"A7",X"28",X"16",X"3A",X"29",X"4F",X"A7",X"20",X"10",X"21",X"61",X"40", + X"01",X"A0",X"00",X"7E",X"FE",X"9A",X"C0",X"09",X"7D",X"FE",X"21",X"20",X"F6",X"CD",X"93",X"31", + X"3A",X"25",X"4F",X"A7",X"C2",X"1D",X"31",X"3E",X"40",X"CD",X"CE",X"15",X"3A",X"89",X"4E",X"32", + X"0B",X"4F",X"CB",X"4F",X"20",X"02",X"A7",X"C0",X"3E",X"90",X"32",X"FF",X"4C",X"DD",X"21",X"F9", + X"4C",X"DD",X"36",X"04",X"1C",X"DD",X"36",X"05",X"0C",X"01",X"00",X"10",X"11",X"E4",X"FF",X"21", + X"C0",X"43",X"2B",X"3A",X"FE",X"4C",X"C6",X"F8",X"32",X"FE",X"4C",X"7E",X"FE",X"BD",X"30",X"1B", + X"7D",X"E6",X"0F",X"FE",X"0C",X"20",X"EB",X"7D",X"FE",X"5C",X"28",X"40",X"19",X"DD",X"36",X"05", + X"0C",X"DD",X"7E",X"04",X"C6",X"08",X"DD",X"77",X"04",X"18",X"D7",X"3E",X"15",X"77",X"32",X"0B", + X"4F",X"21",X"24",X"4F",X"CB",X"6E",X"E5",X"28",X"07",X"2A",X"A9",X"4D",X"09",X"22",X"A9",X"4D", + X"E1",X"CB",X"4E",X"28",X"07",X"2A",X"AB",X"4D",X"09",X"22",X"AB",X"4D",X"3E",X"03",X"CD",X"CE", + X"15",X"3E",X"B0",X"32",X"FF",X"4C",X"21",X"89",X"4E",X"CB",X"C6",X"C9",X"7C",X"FE",X"40",X"20", + X"BB",X"3A",X"30",X"4D",X"32",X"27",X"4F",X"3A",X"48",X"4D",X"32",X"28",X"4F",X"21",X"91",X"4D", + X"3A",X"21",X"4F",X"A7",X"28",X"04",X"CB",X"8E",X"CB",X"AE",X"3A",X"FD",X"4E",X"FE",X"32",X"D4", + X"DD",X"2C",X"32",X"0A",X"4F",X"A7",X"20",X"02",X"CB",X"DE",X"F5",X"21",X"00",X"4C",X"CD",X"96", + X"3A",X"21",X"10",X"4C",X"CD",X"96",X"3A",X"21",X"20",X"4C",X"CD",X"96",X"3A",X"21",X"30",X"4C", + X"CD",X"96",X"3A",X"21",X"40",X"4C",X"CD",X"96",X"3A",X"21",X"50",X"4C",X"CD",X"96",X"3A",X"21", + X"60",X"4C",X"CD",X"96",X"3A",X"21",X"70",X"4C",X"CD",X"96",X"3A",X"21",X"80",X"4C",X"CD",X"96", + X"3A",X"21",X"90",X"4C",X"CD",X"96",X"3A",X"F1",X"32",X"FD",X"4E",X"3E",X"90",X"32",X"FF",X"4C", + X"32",X"17",X"4D",X"32",X"2F",X"4D",X"32",X"47",X"4D",X"32",X"5F",X"4D",X"32",X"77",X"4D",X"32", + X"0B",X"4F",X"C9",X"3A",X"6E",X"4E",X"A7",X"28",X"05",X"CB",X"CF",X"32",X"6E",X"4E",X"3A",X"BF", + X"4E",X"A7",X"28",X"05",X"CB",X"CF",X"32",X"BF",X"4E",X"21",X"A4",X"4E",X"CB",X"CE",X"3E",X"90", + X"32",X"FF",X"4C",X"3E",X"02",X"CD",X"CE",X"15",X"3E",X"9A",X"32",X"85",X"4C",X"32",X"95",X"4C", + X"AF",X"32",X"84",X"4C",X"32",X"94",X"4C",X"21",X"80",X"4C",X"22",X"F4",X"4C",X"CD",X"16",X"0E", + X"21",X"90",X"4C",X"22",X"F4",X"4C",X"CD",X"16",X"0E",X"C9",X"CD",X"B1",X"3A",X"3A",X"23",X"4F", + X"F6",X"F8",X"D6",X"FA",X"CB",X"27",X"21",X"F1",X"31",X"CD",X"E3",X"15",X"5E",X"23",X"56",X"EB", + X"E9",X"70",X"33",X"FD",X"32",X"36",X"33",X"27",X"32",X"AA",X"33",X"5A",X"34",X"8B",X"4C",X"49", + X"5A",X"41",X"52",X"44",X"20",X"57",X"49",X"5A",X"41",X"52",X"44",X"2C",X"43",X"4F",X"50",X"59", + X"52",X"49",X"47",X"48",X"54",X"20",X"31",X"39",X"38",X"35",X"54",X"45",X"43",X"48",X"53",X"54", + X"41",X"52",X"20",X"49",X"4E",X"43",X"2E",X"DD",X"7E",X"06",X"FE",X"78",X"38",X"07",X"16",X"8E", + X"1E",X"7E",X"C3",X"39",X"32",X"16",X"76",X"1E",X"66",X"06",X"F8",X"0E",X"04",X"CD",X"D1",X"34", + X"CA",X"26",X"35",X"DD",X"35",X"0A",X"C2",X"26",X"35",X"DD",X"7E",X"00",X"0E",X"18",X"16",X"14", + X"1E",X"0C",X"FE",X"10",X"28",X"19",X"30",X"31",X"A7",X"C2",X"C4",X"32",X"DD",X"7E",X"01",X"A7", + X"28",X"1F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"81",X"DD",X"77",X"00",X"C3",X"ED",X"32",X"DD", + X"7E",X"01",X"A7",X"28",X"0C",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"47",X"79",X"90",X"C3",X"69", + X"32",X"DD",X"36",X"01",X"08",X"79",X"C3",X"69",X"32",X"BA",X"28",X"61",X"47",X"3A",X"23",X"4F", + X"CB",X"5F",X"78",X"20",X"0B",X"FE",X"19",X"38",X"07",X"DD",X"36",X"00",X"18",X"C3",X"ED",X"32", + X"3D",X"C3",X"69",X"32",X"BB",X"28",X"C2",X"47",X"3A",X"23",X"4F",X"CB",X"5F",X"78",X"20",X"0B", + X"FE",X"08",X"30",X"07",X"DD",X"36",X"00",X"08",X"C3",X"ED",X"32",X"3C",X"C3",X"69",X"32",X"3E", + X"18",X"C3",X"DB",X"32",X"47",X"3E",X"20",X"90",X"47",X"3A",X"23",X"4F",X"CB",X"5F",X"78",X"20", + X"0A",X"FE",X"19",X"30",X"EA",X"FE",X"08",X"30",X"02",X"3E",X"08",X"DD",X"77",X"00",X"DD",X"7E", + X"01",X"A7",X"CA",X"22",X"35",X"D6",X"08",X"DD",X"77",X"01",X"C3",X"22",X"35",X"DD",X"7E",X"01", + X"FE",X"20",X"CA",X"22",X"35",X"C6",X"08",X"DD",X"77",X"01",X"C3",X"22",X"35",X"DD",X"7E",X"06", + X"FE",X"78",X"38",X"07",X"16",X"8C",X"1E",X"7C",X"C3",X"0F",X"33",X"16",X"74",X"1E",X"64",X"06", + X"F8",X"0E",X"02",X"CD",X"D1",X"34",X"CA",X"26",X"35",X"DD",X"35",X"0A",X"C2",X"26",X"35",X"DD", + X"7E",X"00",X"0E",X"08",X"16",X"14",X"1E",X"0C",X"FE",X"10",X"CA",X"5C",X"32",X"30",X"95",X"A7", + X"CA",X"6F",X"32",X"C3",X"A4",X"32",X"DD",X"7E",X"06",X"FE",X"78",X"38",X"07",X"16",X"7A",X"1E", + X"8E",X"C3",X"48",X"33",X"16",X"62",X"1E",X"76",X"06",X"04",X"0E",X"03",X"CD",X"D1",X"34",X"CA", + X"26",X"35",X"DD",X"35",X"0A",X"C2",X"26",X"35",X"DD",X"7E",X"00",X"0E",X"18",X"16",X"04",X"1E", + X"1C",X"FE",X"10",X"CA",X"6F",X"32",X"D2",X"A4",X"32",X"A7",X"CA",X"5C",X"32",X"C3",X"A4",X"32", + X"DD",X"7E",X"06",X"FE",X"78",X"38",X"07",X"16",X"78",X"1E",X"8C",X"C3",X"82",X"33",X"16",X"60", + X"1E",X"74",X"06",X"04",X"0E",X"01",X"CD",X"D1",X"34",X"CA",X"26",X"35",X"DD",X"35",X"0A",X"C2", + X"26",X"35",X"DD",X"7E",X"00",X"0E",X"08",X"16",X"04",X"1E",X"1C",X"FE",X"10",X"CA",X"5C",X"32", + X"D2",X"C4",X"32",X"A7",X"CA",X"6F",X"32",X"C3",X"89",X"32",X"DD",X"7E",X"06",X"FE",X"78",X"38", + X"13",X"CB",X"4F",X"CA",X"BD",X"33",X"16",X"7A",X"1E",X"8E",X"C3",X"D3",X"33",X"16",X"78",X"1E", + X"8C",X"C3",X"D3",X"33",X"CB",X"4F",X"28",X"07",X"16",X"62",X"1E",X"76",X"C3",X"D3",X"33",X"16", + X"60",X"1E",X"74",X"06",X"04",X"0E",X"05",X"CD",X"D1",X"34",X"CA",X"26",X"35",X"DD",X"35",X"0A", + X"C2",X"26",X"35",X"DD",X"7E",X"00",X"0E",X"00",X"16",X"10",X"1E",X"00",X"FE",X"10",X"28",X"24", + X"30",X"2C",X"A7",X"C2",X"42",X"34",X"DD",X"7E",X"01",X"FE",X"20",X"CA",X"22",X"35",X"C6",X"08", + X"DD",X"77",X"01",X"C3",X"22",X"35",X"DD",X"7E",X"01",X"06",X"08",X"90",X"38",X"06",X"DD",X"77", + X"01",X"C3",X"22",X"35",X"DD",X"36",X"01",X"08",X"DD",X"73",X"00",X"C3",X"22",X"35",X"FE",X"18", + X"28",X"F2",X"DA",X"39",X"34",X"06",X"18",X"DD",X"71",X"00",X"90",X"CB",X"27",X"CB",X"27",X"CB", + X"27",X"D6",X"08",X"DD",X"77",X"01",X"C3",X"22",X"35",X"47",X"3E",X"18",X"DD",X"72",X"00",X"C3", + X"2A",X"34",X"FE",X"08",X"28",X"CE",X"D2",X"52",X"34",X"47",X"3E",X"08",X"DD",X"71",X"00",X"C3", + X"2A",X"34",X"06",X"08",X"DD",X"72",X"00",X"C3",X"2A",X"34",X"DD",X"7E",X"06",X"FE",X"78",X"38", + X"13",X"CB",X"4F",X"CA",X"6D",X"34",X"16",X"8E",X"1E",X"7E",X"C3",X"83",X"34",X"16",X"8C",X"1E", + X"7C",X"C3",X"83",X"34",X"CB",X"4F",X"28",X"07",X"16",X"76",X"1E",X"66",X"C3",X"83",X"34",X"16", + X"74",X"1E",X"64",X"06",X"F8",X"0E",X"06",X"CD",X"D1",X"34",X"CA",X"26",X"35",X"DD",X"35",X"0A", + X"C2",X"26",X"35",X"DD",X"7E",X"00",X"0E",X"00",X"16",X"10",X"1E",X"10",X"FE",X"10",X"CA",X"BA", + X"34",X"D2",X"1E",X"34",X"A7",X"20",X"9B",X"3A",X"23",X"4F",X"CB",X"5F",X"C2",X"06",X"34",X"DD", + X"36",X"00",X"10",X"DD",X"36",X"01",X"10",X"C3",X"22",X"35",X"3A",X"23",X"4F",X"CB",X"5F",X"C2", + X"F6",X"33",X"DD",X"7E",X"01",X"FE",X"10",X"D2",X"F6",X"33",X"DD",X"36",X"01",X"10",X"C3",X"22", + X"35",X"DD",X"7E",X"08",X"E6",X"0F",X"B9",X"CA",X"07",X"35",X"21",X"6E",X"4E",X"CB",X"41",X"28", + X"0B",X"3A",X"53",X"4E",X"A7",X"20",X"0B",X"CB",X"C6",X"C3",X"F2",X"34",X"7E",X"A7",X"28",X"02", + X"CB",X"CE",X"DD",X"7E",X"08",X"E6",X"F0",X"81",X"DD",X"77",X"08",X"DD",X"72",X"06",X"DD",X"36", + X"09",X"01",X"DD",X"36",X"0A",X"01",X"C9",X"DD",X"35",X"09",X"C2",X"20",X"35",X"DD",X"36",X"09", + X"05",X"DD",X"7E",X"06",X"BB",X"28",X"05",X"80",X"DD",X"77",X"06",X"C9",X"DD",X"72",X"06",X"C9", + X"AF",X"C9",X"DD",X"36",X"0A",X"02",X"DD",X"46",X"04",X"3E",X"F7",X"90",X"32",X"F3",X"4C",X"DD", + X"7E",X"05",X"D6",X"08",X"32",X"F2",X"4C",X"CD",X"D0",X"0D",X"EB",X"3A",X"25",X"4F",X"A7",X"20", + X"76",X"7E",X"FE",X"AA",X"DA",X"B7",X"35",X"FE",X"AD",X"DA",X"88",X"35",X"FE",X"D1",X"D2",X"B7", + X"35",X"FE",X"CD",X"D2",X"94",X"35",X"DD",X"7E",X"06",X"FE",X"78",X"D2",X"B7",X"35",X"E6",X"03", + X"C6",X"7C",X"DD",X"77",X"06",X"3A",X"29",X"4F",X"A7",X"20",X"14",X"DD",X"7E",X"04",X"D6",X"07", + X"6F",X"DD",X"7E",X"05",X"C6",X"08",X"67",X"06",X"01",X"CD",X"D3",X"38",X"C3",X"B7",X"35",X"36", + X"9A",X"21",X"FD",X"4E",X"35",X"C3",X"B7",X"35",X"3A",X"29",X"4F",X"A7",X"28",X"06",X"3A",X"FD", + X"4E",X"A7",X"28",X"23",X"DD",X"36",X"00",X"10",X"DD",X"7E",X"08",X"E6",X"C0",X"F6",X"26",X"DD", + X"77",X"08",X"DD",X"7E",X"04",X"DD",X"77",X"0B",X"DD",X"7E",X"05",X"DD",X"77",X"0C",X"DD",X"36", + X"0D",X"98",X"21",X"53",X"4E",X"CB",X"C6",X"DD",X"CB",X"08",X"7E",X"CA",X"71",X"36",X"3A",X"23", + X"4F",X"E6",X"10",X"CA",X"05",X"36",X"DD",X"CB",X"08",X"F6",X"DD",X"22",X"89",X"4D",X"CD",X"8D", + X"0C",X"3A",X"FE",X"4E",X"FE",X"01",X"C0",X"DD",X"7E",X"0D",X"FE",X"90",X"C8",X"FE",X"94",X"28", + X"18",X"FE",X"A0",X"CA",X"FE",X"35",X"D2",X"EF",X"35",X"C6",X"04",X"DD",X"77",X"0D",X"C9",X"3A", + X"01",X"4F",X"FE",X"08",X"D8",X"DD",X"36",X"17",X"90",X"DD",X"36",X"0D",X"90",X"C9",X"DD",X"7E", + X"17",X"DD",X"77",X"0D",X"C9",X"DD",X"CB",X"08",X"76",X"CA",X"CA",X"35",X"DD",X"CB",X"08",X"B6", + X"DD",X"36",X"16",X"00",X"DD",X"CB",X"08",X"BE",X"DD",X"36",X"11",X"00",X"3A",X"1D",X"4E",X"A7", + X"20",X"05",X"21",X"38",X"4E",X"CB",X"C6",X"DD",X"CB",X"06",X"4E",X"CA",X"3A",X"36",X"DD",X"CB", + X"16",X"FE",X"DD",X"7E",X"04",X"D6",X"10",X"C3",X"42",X"36",X"DD",X"CB",X"16",X"BE",X"DD",X"7E", + X"04",X"3C",X"DD",X"77",X"12",X"47",X"3E",X"F0",X"90",X"32",X"F3",X"4C",X"DD",X"7E",X"05",X"C6", + X"06",X"DD",X"77",X"13",X"D6",X"10",X"32",X"F2",X"4C",X"CD",X"D0",X"0D",X"DD",X"73",X"14",X"DD", + X"72",X"15",X"3A",X"A0",X"4C",X"C6",X"83",X"DD",X"77",X"10",X"EB",X"01",X"00",X"00",X"C3",X"D1", + X"36",X"DD",X"7E",X"10",X"FE",X"9A",X"C2",X"C0",X"36",X"01",X"20",X"00",X"DD",X"7E",X"11",X"3D", + X"FA",X"AC",X"36",X"DD",X"77",X"11",X"DD",X"6E",X"0E",X"DD",X"66",X"0F",X"DD",X"CB",X"16",X"7E", + X"20",X"16",X"37",X"3F",X"ED",X"42",X"DD",X"75",X"0E",X"DD",X"74",X"0F",X"36",X"9A",X"DD",X"CB", + X"11",X"46",X"C2",X"79",X"36",X"C3",X"CA",X"35",X"09",X"C3",X"96",X"36",X"DD",X"7E",X"16",X"E6", + X"0F",X"28",X"06",X"DD",X"35",X"16",X"C3",X"18",X"36",X"DD",X"CB",X"08",X"FE",X"C3",X"CA",X"35", + X"DD",X"7E",X"11",X"FE",X"06",X"CA",X"80",X"37",X"DD",X"6E",X"0E",X"DD",X"66",X"0F",X"01",X"20", + X"00",X"DD",X"CB",X"16",X"7E",X"20",X"09",X"37",X"3F",X"ED",X"42",X"0E",X"08",X"C3",X"E3",X"36", + X"09",X"0E",X"F8",X"DD",X"7E",X"12",X"FE",X"11",X"DA",X"80",X"37",X"FE",X"F1",X"D2",X"80",X"37", + X"DD",X"75",X"0E",X"DD",X"74",X"0F",X"DD",X"6E",X"12",X"DD",X"66",X"13",X"3E",X"10",X"85",X"5F", + X"54",X"3A",X"3C",X"4D",X"E6",X"70",X"FE",X"40",X"30",X"10",X"2A",X"2D",X"4D",X"7B",X"95",X"FE", + X"11",X"30",X"07",X"7A",X"94",X"FE",X"11",X"DA",X"AD",X"37",X"3A",X"54",X"4D",X"E6",X"70",X"FE", + X"40",X"30",X"10",X"2A",X"45",X"4D",X"7B",X"95",X"FE",X"11",X"30",X"07",X"7A",X"94",X"FE",X"11", + X"DA",X"B6",X"37",X"3A",X"24",X"4D",X"E6",X"70",X"FE",X"40",X"30",X"0F",X"2A",X"15",X"4D",X"7B", + X"95",X"FE",X"11",X"30",X"06",X"7A",X"94",X"FE",X"11",X"38",X"74",X"DD",X"6E",X"0E",X"DD",X"66", + X"0F",X"7E",X"FE",X"9A",X"CA",X"37",X"38",X"E5",X"47",X"21",X"53",X"4E",X"7E",X"A7",X"20",X"07", + X"CB",X"C6",X"3E",X"0D",X"32",X"09",X"4F",X"78",X"E1",X"FE",X"E0",X"CA",X"55",X"38",X"FE",X"AD", + X"D2",X"5F",X"38",X"FE",X"AA",X"D2",X"80",X"38",X"FE",X"8B",X"D2",X"B5",X"38",X"C3",X"5F",X"38", + X"DD",X"6E",X"14",X"DD",X"66",X"15",X"DD",X"75",X"0E",X"DD",X"74",X"0F",X"DD",X"36",X"10",X"9A", + X"01",X"00",X"00",X"C3",X"7C",X"36",X"3A",X"22",X"4F",X"A7",X"C2",X"A5",X"37",X"2A",X"A9",X"4D", + X"19",X"22",X"A9",X"4D",X"C9",X"2A",X"AB",X"4D",X"19",X"22",X"AB",X"4D",X"C9",X"DD",X"E5",X"DD", + X"21",X"29",X"4D",X"C3",X"CA",X"37",X"DD",X"E5",X"DD",X"21",X"41",X"4D",X"C3",X"CA",X"37",X"DD", + X"E5",X"DD",X"21",X"11",X"4D",X"21",X"A4",X"4E",X"CB",X"C6",X"3A",X"25",X"4F",X"A7",X"C2",X"00", + X"38",X"CD",X"F4",X"2A",X"DD",X"7E",X"13",X"E6",X"80",X"F6",X"4A",X"DD",X"77",X"13",X"DD",X"36", + X"01",X"20",X"DD",X"36",X"00",X"10",X"21",X"53",X"4E",X"CB",X"C6",X"11",X"00",X"01",X"DD",X"E1", + X"DD",X"36",X"17",X"B4",X"CD",X"96",X"37",X"AF",X"32",X"01",X"4F",X"3E",X"98",X"C3",X"61",X"38", + X"DD",X"36",X"01",X"00",X"DD",X"36",X"04",X"00",X"DD",X"36",X"05",X"F0",X"DD",X"36",X"06",X"90", + X"DD",X"36",X"0B",X"00",X"DD",X"6E",X"09",X"DD",X"66",X"0A",X"CD",X"26",X"38",X"DD",X"E1",X"DD", + X"36",X"17",X"B0",X"C3",X"F4",X"37",X"36",X"AA",X"7D",X"E6",X"E0",X"3C",X"6F",X"36",X"E1",X"21", + X"FD",X"4E",X"35",X"11",X"00",X"10",X"C9",X"DD",X"7E",X"10",X"DD",X"6E",X"0E",X"DD",X"66",X"0F", + X"77",X"DD",X"7E",X"12",X"81",X"DD",X"77",X"12",X"DD",X"34",X"11",X"DD",X"CB",X"11",X"46",X"C2", + X"C8",X"36",X"C3",X"CA",X"35",X"CD",X"26",X"38",X"DD",X"36",X"17",X"B0",X"C3",X"F4",X"37",X"3E", + X"94",X"DD",X"77",X"0D",X"3E",X"06",X"32",X"FE",X"4E",X"DD",X"6E",X"12",X"DD",X"66",X"13",X"7C", + X"D6",X"08",X"67",X"7D",X"C6",X"08",X"6F",X"DD",X"75",X"0B",X"DD",X"74",X"0C",X"C3",X"80",X"37", + X"3A",X"25",X"4F",X"A7",X"C2",X"80",X"37",X"3A",X"29",X"4F",X"A7",X"C2",X"AC",X"38",X"11",X"00", + X"25",X"CD",X"96",X"37",X"06",X"01",X"DD",X"6E",X"12",X"DD",X"66",X"13",X"CD",X"D3",X"38",X"AF", + X"32",X"01",X"4F",X"DD",X"36",X"17",X"A8",X"3E",X"98",X"C3",X"61",X"38",X"DD",X"7E",X"10",X"77", + X"3E",X"98",X"C3",X"61",X"38",X"11",X"00",X"20",X"CD",X"96",X"37",X"06",X"00",X"DD",X"6E",X"12", + X"DD",X"66",X"13",X"CD",X"D3",X"38",X"AF",X"32",X"01",X"4F",X"DD",X"36",X"17",X"AC",X"3E",X"98", + X"C3",X"61",X"38",X"7D",X"FE",X"81",X"D2",X"32",X"39",X"FE",X"79",X"38",X"43",X"7C",X"FE",X"A8", + X"DA",X"13",X"39",X"3A",X"63",X"4C",X"FE",X"78",X"30",X"08",X"3A",X"60",X"4C",X"FE",X"02",X"D2", + X"8C",X"39",X"3A",X"43",X"4C",X"FE",X"78",X"30",X"08",X"3A",X"40",X"4C",X"FE",X"02",X"D2",X"A9", + X"39",X"3A",X"23",X"4C",X"FE",X"78",X"30",X"08",X"3A",X"20",X"4C",X"FE",X"02",X"D2",X"C6",X"39", + X"C3",X"E3",X"39",X"FE",X"78",X"D2",X"F2",X"38",X"FE",X"50",X"D2",X"01",X"39",X"C3",X"E3",X"39", + X"7C",X"FE",X"A8",X"30",X"67",X"FE",X"78",X"D2",X"A9",X"39",X"FE",X"50",X"D2",X"C6",X"39",X"C3", + X"E3",X"39",X"FE",X"89",X"30",X"43",X"7C",X"FE",X"90",X"DA",X"6C",X"39",X"3A",X"73",X"4C",X"FE", + X"61",X"38",X"08",X"3A",X"70",X"4C",X"FE",X"02",X"D2",X"00",X"3A",X"3A",X"53",X"4C",X"FE",X"61", + X"38",X"08",X"3A",X"50",X"4C",X"FE",X"02",X"D2",X"1D",X"3A",X"3A",X"33",X"4C",X"FE",X"61",X"38", + X"08",X"3A",X"30",X"4C",X"FE",X"02",X"D2",X"3A",X"3A",X"C3",X"57",X"3A",X"FE",X"70",X"D2",X"4B", + X"39",X"FE",X"48",X"D2",X"5A",X"39",X"C3",X"57",X"3A",X"7C",X"FE",X"90",X"D2",X"00",X"3A",X"FE", + X"70",X"D2",X"1D",X"3A",X"FE",X"48",X"D2",X"3A",X"3A",X"C3",X"57",X"3A",X"78",X"FE",X"01",X"38", + X"0C",X"21",X"F8",X"4E",X"CB",X"76",X"20",X"0C",X"0E",X"06",X"CD",X"74",X"3A",X"21",X"60",X"4C", + X"CD",X"96",X"3A",X"C9",X"CB",X"B6",X"C3",X"9D",X"39",X"78",X"FE",X"01",X"38",X"0C",X"21",X"F8", + X"4E",X"CB",X"66",X"20",X"0C",X"0E",X"04",X"CD",X"74",X"3A",X"21",X"40",X"4C",X"CD",X"96",X"3A", + X"C9",X"CB",X"A6",X"C3",X"BA",X"39",X"78",X"FE",X"01",X"38",X"0C",X"21",X"F8",X"4E",X"CB",X"56", + X"20",X"0C",X"0E",X"02",X"CD",X"74",X"3A",X"21",X"20",X"4C",X"CD",X"96",X"3A",X"C9",X"CB",X"96", + X"C3",X"D7",X"39",X"78",X"FE",X"01",X"38",X"0C",X"21",X"F8",X"4E",X"CB",X"46",X"20",X"0C",X"0E", + X"00",X"CD",X"74",X"3A",X"21",X"00",X"4C",X"CD",X"96",X"3A",X"C9",X"CB",X"86",X"C3",X"F4",X"39", + X"78",X"FE",X"01",X"38",X"0C",X"21",X"F8",X"4E",X"CB",X"7E",X"20",X"0C",X"0E",X"07",X"CD",X"74", + X"3A",X"21",X"70",X"4C",X"CD",X"96",X"3A",X"C9",X"CB",X"BE",X"C3",X"11",X"3A",X"78",X"FE",X"01", + X"38",X"0C",X"21",X"F8",X"4E",X"CB",X"6E",X"20",X"0C",X"0E",X"05",X"CD",X"74",X"3A",X"21",X"50", + X"4C",X"CD",X"96",X"3A",X"C9",X"CB",X"AE",X"C3",X"2E",X"3A",X"78",X"FE",X"01",X"38",X"0C",X"21", + X"F8",X"4E",X"CB",X"5E",X"20",X"0C",X"0E",X"03",X"CD",X"74",X"3A",X"21",X"30",X"4C",X"CD",X"96", + X"3A",X"C9",X"CB",X"9E",X"C3",X"4B",X"3A",X"78",X"FE",X"01",X"38",X"0C",X"21",X"F8",X"4E",X"CB", + X"4E",X"20",X"0C",X"0E",X"01",X"CD",X"74",X"3A",X"21",X"10",X"4C",X"CD",X"96",X"3A",X"C9",X"CB", + X"8E",X"C3",X"68",X"3A",X"3E",X"02",X"32",X"FA",X"4E",X"3A",X"3C",X"4D",X"47",X"E6",X"0F",X"B9", + X"20",X"09",X"78",X"E6",X"F0",X"F6",X"0A",X"32",X"3C",X"4D",X"C9",X"3A",X"54",X"4D",X"E6",X"F0", + X"F6",X"0A",X"32",X"54",X"4D",X"C9",X"36",X"01",X"22",X"F4",X"4C",X"DD",X"E5",X"CD",X"16",X"0E", + X"DD",X"E1",X"AF",X"2A",X"F4",X"4C",X"23",X"23",X"23",X"77",X"23",X"77",X"21",X"FD",X"4E",X"35", + X"C9",X"DD",X"7E",X"05",X"FE",X"11",X"DA",X"0F",X"3B",X"FE",X"CC",X"D2",X"44",X"3B",X"DD",X"7E", + X"04",X"FE",X"20",X"DA",X"CD",X"3A",X"FE",X"F1",X"D2",X"F9",X"3A",X"3F",X"C9",X"DD",X"7E",X"00", + X"FE",X"11",X"38",X"F7",X"47",X"DD",X"7E",X"06",X"FE",X"60",X"DA",X"E2",X"3A",X"DD",X"36",X"04", + X"20",X"C9",X"3E",X"20",X"90",X"DD",X"77",X"00",X"DD",X"CB",X"06",X"4E",X"CA",X"F4",X"3A",X"DD", + X"CB",X"06",X"8E",X"C9",X"DD",X"CB",X"06",X"CE",X"C9",X"DD",X"7E",X"00",X"A7",X"C8",X"FE",X"10", + X"D0",X"47",X"DD",X"7E",X"06",X"FE",X"60",X"DA",X"E2",X"3A",X"DD",X"36",X"04",X"F0",X"C9",X"DD", + X"7E",X"00",X"47",X"FE",X"11",X"38",X"10",X"FE",X"18",X"CA",X"BE",X"3A",X"3F",X"D0",X"3E",X"30", + X"90",X"DD",X"77",X"00",X"C3",X"33",X"3B",X"FE",X"08",X"CA",X"BE",X"3A",X"D0",X"3E",X"10",X"90", + X"DD",X"77",X"00",X"DD",X"7E",X"06",X"FE",X"60",X"D8",X"DD",X"7E",X"01",X"D6",X"09",X"D8",X"3C", + X"DD",X"77",X"01",X"C9",X"DD",X"7E",X"06",X"FE",X"78",X"DA",X"C8",X"3B",X"4F",X"CB",X"4F",X"C2", + X"C3",X"3B",X"AF",X"DD",X"86",X"04",X"47",X"FE",X"48",X"30",X"0E",X"FE",X"31",X"38",X"69",X"FE", + X"3D",X"21",X"80",X"4C",X"38",X"22",X"C3",X"83",X"3B",X"78",X"FE",X"C1",X"38",X"5A",X"FE",X"D8", + X"30",X"56",X"FE",X"CD",X"21",X"90",X"4C",X"38",X"05",X"06",X"20",X"C3",X"8A",X"3B",X"06",X"28", + X"C3",X"8A",X"3B",X"06",X"B0",X"C3",X"8A",X"3B",X"06",X"B8",X"7E",X"A7",X"20",X"3A",X"79",X"D6", + X"18",X"DD",X"77",X"06",X"36",X"03",X"23",X"23",X"23",X"70",X"23",X"36",X"C8",X"11",X"00",X"30", + X"CD",X"96",X"37",X"3E",X"02",X"32",X"FE",X"4E",X"32",X"01",X"4F",X"DD",X"7E",X"04",X"DD",X"77", + X"0B",X"DD",X"7E",X"05",X"DD",X"77",X"0C",X"DD",X"36",X"0D",X"A4",X"21",X"89",X"4E",X"CB",X"C6", + X"C3",X"C8",X"3B",X"3E",X"F8",X"C3",X"53",X"3B",X"DD",X"7E",X"00",X"47",X"FE",X"11",X"38",X"08", + X"FE",X"18",X"CA",X"BE",X"3A",X"C3",X"1D",X"3B",X"FE",X"08",X"CA",X"BE",X"3A",X"3F",X"C3",X"2C", + X"3B",X"DD",X"22",X"F4",X"4C",X"DD",X"7E",X"00",X"FE",X"01",X"CA",X"D2",X"3C",X"D2",X"1B",X"3C", + X"DD",X"35",X"0D",X"C0",X"DD",X"36",X"0D",X"05",X"DD",X"7E",X"05",X"FE",X"AC",X"C2",X"08",X"3C", + X"DD",X"36",X"05",X"AA",X"CD",X"16",X"0E",X"C9",X"FE",X"AE",X"30",X"07",X"DD",X"34",X"05",X"CD", + X"16",X"0E",X"C9",X"DD",X"36",X"05",X"AD",X"CD",X"16",X"0E",X"C9",X"DD",X"7E",X"04",X"E6",X"07", + X"C2",X"C4",X"3C",X"DD",X"7E",X"03",X"E6",X"07",X"C2",X"C4",X"3C",X"DD",X"35",X"0D",X"C2",X"7D", + X"3C",X"DD",X"7E",X"05",X"FE",X"8B",X"C2",X"3D",X"3C",X"DD",X"36",X"05",X"AA",X"DD",X"36",X"0D", + X"05",X"DD",X"36",X"00",X"00",X"CD",X"16",X"0E",X"2A",X"F4",X"4C",X"7D",X"21",X"F8",X"4E",X"FE", + X"40",X"28",X"0F",X"D2",X"6E",X"3C",X"FE",X"20",X"28",X"0E",X"30",X"09",X"A7",X"20",X"0C",X"CB", + X"C6",X"C9",X"CB",X"E6",X"C9",X"CB",X"DE",X"C9",X"CB",X"D6",X"C9",X"CB",X"CE",X"C9",X"FE",X"60", + X"28",X"05",X"30",X"06",X"CB",X"EE",X"C9",X"CB",X"F6",X"C9",X"CB",X"FE",X"C9",X"DD",X"7E",X"04", + X"47",X"DD",X"7E",X"08",X"B8",X"C2",X"C4",X"3C",X"DD",X"7E",X"03",X"47",X"DD",X"7E",X"07",X"B8", + X"C2",X"C4",X"3C",X"DD",X"6E",X"09",X"DD",X"66",X"0A",X"7E",X"DD",X"77",X"00",X"23",X"7E",X"DD", + X"77",X"01",X"23",X"7E",X"DD",X"77",X"07",X"23",X"7E",X"DD",X"77",X"08",X"23",X"7E",X"23",X"FE", + X"01",X"C2",X"C8",X"3C",X"7E",X"DD",X"77",X"09",X"23",X"7E",X"DD",X"77",X"0A",X"2A",X"8E",X"4D", + X"7E",X"DD",X"77",X"0D",X"CD",X"16",X"0E",X"C9",X"DD",X"75",X"09",X"DD",X"74",X"0A",X"CD",X"16", + X"0E",X"C9",X"2A",X"F4",X"4C",X"CB",X"65",X"28",X"42",X"21",X"1F",X"4C",X"35",X"C0",X"35",X"3A", + X"FC",X"4E",X"A7",X"C8",X"DD",X"36",X"03",X"68",X"DD",X"36",X"04",X"D0",X"3D",X"32",X"FC",X"4E", + X"DD",X"6E",X"0B",X"DD",X"66",X"0C",X"DD",X"75",X"09",X"DD",X"74",X"0A",X"DD",X"36",X"0D",X"00", + X"EB",X"2A",X"8E",X"4D",X"46",X"EB",X"3A",X"FB",X"4E",X"B8",X"DA",X"14",X"3D",X"DD",X"36",X"05", + X"8B",X"C3",X"99",X"3C",X"DD",X"36",X"05",X"AE",X"C3",X"99",X"3C",X"21",X"0F",X"4C",X"35",X"C0", + X"35",X"3A",X"FC",X"4E",X"A7",X"C8",X"DD",X"36",X"03",X"70",X"DD",X"36",X"04",X"D0",X"C3",X"EC", + X"3C",X"02",X"20",X"70",X"60",X"00",X"02",X"10",X"70",X"08",X"00",X"05",X"08",X"78",X"08",X"00", + X"05",X"08",X"C0",X"08",X"00",X"03",X"08",X"C0",X"18",X"00",X"04",X"08",X"A0",X"18",X"00",X"03", + X"08",X"A0",X"38",X"00",X"04",X"08",X"78",X"38",X"00",X"02",X"08",X"78",X"08",X"01",X"40",X"3D", + X"02",X"20",X"68",X"60",X"00",X"02",X"10",X"68",X"10",X"00",X"04",X"08",X"60",X"10",X"00",X"04", + X"08",X"40",X"10",X"00",X"02",X"08",X"40",X"08",X"00",X"04",X"08",X"10",X"08",X"00",X"03",X"08", + X"10",X"18",X"00",X"05",X"08",X"30",X"18",X"00",X"03",X"08",X"30",X"30",X"00",X"05",X"08",X"60", + X"30",X"00",X"02",X"08",X"60",X"10",X"01",X"6F",X"3D",X"02",X"20",X"70",X"60",X"00",X"02",X"10", + X"70",X"50",X"00",X"05",X"08",X"78",X"50",X"00",X"05",X"08",X"A8",X"50",X"00",X"03",X"08",X"A8", + X"60",X"00",X"05",X"08",X"D0",X"60",X"00",X"02",X"08",X"D0",X"48",X"00",X"04",X"08",X"90",X"48", + X"00",X"02",X"08",X"90",X"40",X"00",X"04",X"08",X"78",X"40",X"00",X"03",X"08",X"78",X"50",X"01", + X"A8",X"3D",X"02",X"20",X"68",X"50",X"00",X"02",X"10",X"68",X"38",X"00",X"04",X"08",X"60",X"38", + X"00",X"04",X"08",X"38",X"38",X"00",X"03",X"08",X"38",X"48",X"00",X"04",X"08",X"08",X"48",X"00", + X"03",X"08",X"08",X"58",X"00",X"05",X"08",X"18",X"58",X"00",X"02",X"08",X"18",X"48",X"00",X"05", + X"08",X"28",X"48",X"00",X"03",X"08",X"28",X"58",X"00",X"05",X"08",X"40",X"58",X"00",X"02",X"08", + X"40",X"48",X"00",X"05",X"08",X"60",X"48",X"00",X"02",X"08",X"60",X"38",X"01",X"E1",X"3D",X"02", + X"20",X"70",X"88",X"00",X"02",X"10",X"70",X"70",X"00",X"05",X"08",X"78",X"70",X"00",X"05",X"08", + X"80",X"70",X"00",X"02",X"08",X"80",X"68",X"00",X"05",X"08",X"A8",X"68",X"00",X"03",X"08",X"A8", + X"80",X"00",X"04",X"08",X"98",X"80",X"00",X"03",X"08",X"98",X"90",X"00",X"04",X"08",X"88",X"90", + X"00",X"02",X"08",X"88",X"88",X"00",X"04",X"08",X"78",X"88",X"00",X"02",X"08",X"78",X"70",X"01", + X"2E",X"3E",X"02",X"20",X"68",X"78",X"00",X"02",X"10",X"68",X"60",X"00",X"04",X"08",X"60",X"60", + X"00",X"03",X"08",X"60",X"78",X"00",X"04",X"08",X"38",X"78",X"00",X"02",X"08",X"38",X"70",X"00", + X"04",X"08",X"28",X"70",X"00",X"02",X"08",X"28",X"68",X"00",X"04",X"08",X"10",X"68",X"00",X"02", + X"08",X"10",X"60",X"00",X"05",X"08",X"60",X"60",X"01",X"71",X"3E",X"02",X"20",X"70",X"A8",X"00", + X"02",X"10",X"70",X"98",X"00",X"05",X"08",X"78",X"98",X"00",X"05",X"08",X"A8",X"98",X"00",X"03", + X"08",X"A8",X"B0",X"00",X"05",X"08",X"D0",X"B0",X"00",X"02",X"08",X"D0",X"98",X"00",X"04",X"08", + X"90",X"98",X"00",X"03",X"08",X"90",X"B0",X"00",X"04",X"08",X"78",X"B0",X"00",X"02",X"08",X"78", + X"98",X"01",X"AA",X"3E",X"02",X"20",X"68",X"98",X"00",X"02",X"10",X"68",X"80",X"00",X"04",X"08", + X"60",X"80",X"00",X"04",X"08",X"38",X"80",X"00",X"03",X"08",X"38",X"90",X"00",X"04",X"08",X"28", + X"90",X"00",X"03",X"08",X"28",X"98",X"00",X"04",X"08",X"08",X"98",X"00",X"03",X"08",X"08",X"B0", + X"00",X"05",X"08",X"60",X"B0",X"00",X"02",X"08",X"60",X"A0",X"00",X"04",X"08",X"30",X"A0",X"00", + X"02",X"08",X"30",X"98",X"00",X"05",X"08",X"60",X"98",X"00",X"02",X"08",X"60",X"80",X"01",X"E3", + X"3E",X"3E",X"9A",X"CD",X"45",X"15",X"3E",X"02",X"CD",X"55",X"15",X"21",X"6C",X"88",X"11",X"F9", + X"4C",X"01",X"07",X"00",X"ED",X"B0",X"21",X"84",X"88",X"11",X"11",X"4D",X"01",X"14",X"00",X"ED", + X"B0",X"3A",X"29",X"4D",X"21",X"84",X"88",X"11",X"29",X"4D",X"01",X"14",X"00",X"ED",X"B0",X"32", + X"29",X"4D",X"3A",X"27",X"4F",X"32",X"29",X"4D",X"3A",X"41",X"4D",X"21",X"84",X"88",X"11",X"41", + X"4D",X"01",X"14",X"00",X"ED",X"B0",X"32",X"41",X"4D",X"3A",X"28",X"4F",X"32",X"41",X"4D",X"21", + X"6C",X"88",X"11",X"59",X"4D",X"01",X"18",X"00",X"ED",X"B0",X"21",X"6C",X"88",X"11",X"71",X"4D", + X"01",X"18",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11",X"00",X"4C",X"01",X"10",X"00",X"ED",X"B0", + X"21",X"58",X"85",X"11",X"10",X"4C",X"01",X"10",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11",X"20", + X"4C",X"01",X"10",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11",X"30",X"4C",X"01",X"10",X"00",X"ED", + X"B0",X"21",X"58",X"85",X"11",X"40",X"4C",X"01",X"10",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11", + X"50",X"4C",X"01",X"10",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11",X"60",X"4C",X"01",X"10",X"00", + X"ED",X"B0",X"21",X"58",X"85",X"11",X"70",X"4C",X"01",X"10",X"00",X"ED",X"B0",X"21",X"58",X"85", + X"11",X"80",X"4C",X"01",X"10",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11",X"90",X"4C",X"01",X"10", + X"00",X"ED",X"B0",X"3E",X"FF",X"32",X"09",X"4F",X"3E",X"D0",X"32",X"59",X"4D",X"3E",X"09",X"32"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..c5abd4b0 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 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 prom of ROM_PGM_1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"3E",X"9A",X"CD",X"45",X"15",X"3E",X"02",X"CD",X"55",X"15",X"21",X"6C",X"88",X"11",X"F9",X"4C", + X"01",X"07",X"00",X"ED",X"B0",X"21",X"84",X"88",X"11",X"11",X"4D",X"01",X"14",X"00",X"ED",X"B0", + X"3A",X"36",X"4D",X"21",X"84",X"88",X"11",X"29",X"4D",X"01",X"14",X"00",X"ED",X"B0",X"32",X"36", + X"4D",X"3A",X"27",X"4F",X"32",X"30",X"4D",X"3A",X"4E",X"4D",X"21",X"84",X"88",X"11",X"41",X"4D", + X"01",X"14",X"00",X"ED",X"B0",X"32",X"4E",X"4D",X"3A",X"28",X"4F",X"32",X"48",X"4D",X"21",X"6C", + X"88",X"11",X"59",X"4D",X"01",X"18",X"00",X"ED",X"B0",X"21",X"6C",X"88",X"11",X"71",X"4D",X"01", + X"18",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11",X"00",X"4C",X"01",X"10",X"00",X"ED",X"B0",X"21", + X"58",X"85",X"11",X"10",X"4C",X"01",X"10",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11",X"20",X"4C", + X"01",X"10",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11",X"30",X"4C",X"01",X"10",X"00",X"ED",X"B0", + X"21",X"58",X"85",X"11",X"40",X"4C",X"01",X"10",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11",X"50", + X"4C",X"01",X"10",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11",X"60",X"4C",X"01",X"10",X"00",X"ED", + X"B0",X"21",X"58",X"85",X"11",X"70",X"4C",X"01",X"10",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11", + X"80",X"4C",X"01",X"10",X"00",X"ED",X"B0",X"21",X"58",X"85",X"11",X"90",X"4C",X"01",X"10",X"00", + X"ED",X"B0",X"3E",X"FF",X"32",X"09",X"4F",X"3E",X"D0",X"32",X"5D",X"4D",X"3E",X"09",X"32",X"60", + X"4D",X"3D",X"32",X"1E",X"4D",X"3E",X"14",X"32",X"00",X"4D",X"3E",X"06",X"32",X"FE",X"4E",X"3E", + X"05",X"32",X"08",X"4F",X"AF",X"32",X"80",X"4C",X"32",X"90",X"4C",X"32",X"F8",X"4E",X"32",X"F9", + X"4E",X"32",X"FA",X"4E",X"32",X"F9",X"4C",X"32",X"FF",X"4E",X"32",X"00",X"4F",X"32",X"0B",X"4F", + X"32",X"21",X"4F",X"32",X"25",X"4F",X"32",X"26",X"4F",X"32",X"29",X"4F",X"32",X"2A",X"4F",X"3C", + X"32",X"0F",X"4C",X"3A",X"91",X"4D",X"32",X"24",X"4F",X"21",X"31",X"3D",X"22",X"0B",X"4C",X"21", + X"60",X"3D",X"22",X"1B",X"4C",X"21",X"99",X"3D",X"22",X"2B",X"4C",X"21",X"D2",X"3D",X"22",X"3B", + X"4C",X"21",X"1F",X"3E",X"22",X"4B",X"4C",X"21",X"62",X"3E",X"22",X"5B",X"4C",X"21",X"9B",X"3E", + X"22",X"6B",X"4C",X"21",X"D4",X"3E",X"22",X"7B",X"4C",X"C9",X"11",X"8B",X"41",X"21",X"5C",X"87", + X"3E",X"01",X"06",X"09",X"CD",X"66",X"16",X"CD",X"4B",X"89",X"06",X"06",X"CD",X"06",X"89",X"CD", + X"9C",X"89",X"CD",X"98",X"88",X"CD",X"B3",X"88",X"3E",X"0C",X"32",X"FB",X"4E",X"3A",X"0A",X"4F", + X"A7",X"20",X"02",X"3E",X"0A",X"32",X"FD",X"4E",X"32",X"FC",X"4E",X"3E",X"6A",X"32",X"54",X"4D", + X"3E",X"80",X"32",X"39",X"4D",X"C9",X"11",X"8B",X"41",X"21",X"65",X"87",X"3E",X"01",X"06",X"09", + X"CD",X"66",X"16",X"CD",X"04",X"89",X"CD",X"9C",X"89",X"CD",X"98",X"88",X"CD",X"E9",X"88",X"06", + X"03",X"CD",X"B7",X"89",X"3A",X"0A",X"4F",X"A7",X"20",X"02",X"3E",X"0A",X"32",X"FD",X"4E",X"32", + X"FC",X"4E",X"3E",X"40",X"32",X"39",X"4D",X"32",X"51",X"4D",X"C9",X"11",X"8B",X"41",X"21",X"6E", + X"87",X"3E",X"01",X"06",X"09",X"CD",X"66",X"16",X"CD",X"4B",X"89",X"CD",X"73",X"89",X"06",X"06", + X"CD",X"06",X"89",X"CD",X"9C",X"89",X"CD",X"B3",X"88",X"CD",X"CE",X"88",X"06",X"04",X"CD",X"B7", + X"89",X"3E",X"0A",X"32",X"FB",X"4E",X"3A",X"0A",X"4F",X"A7",X"20",X"02",X"3E",X"0E",X"32",X"FD", + X"4E",X"32",X"FC",X"4E",X"C9",X"11",X"8B",X"41",X"21",X"77",X"87",X"3E",X"01",X"06",X"09",X"CD", + X"66",X"16",X"11",X"51",X"41",X"21",X"45",X"88",X"3E",X"03",X"06",X"0D",X"CD",X"66",X"16",X"06", + X"06",X"CD",X"06",X"89",X"CD",X"9C",X"89",X"3A",X"91",X"4D",X"47",X"CB",X"68",X"3E",X"0C",X"28", + X"06",X"CB",X"48",X"28",X"02",X"3E",X"11",X"32",X"FB",X"4E",X"3A",X"0A",X"4F",X"A7",X"20",X"02", + X"3E",X"0F",X"32",X"FD",X"4E",X"32",X"FC",X"4E",X"3E",X"0A",X"32",X"3C",X"4D",X"32",X"54",X"4D", + X"3E",X"10",X"32",X"29",X"4D",X"32",X"41",X"4D",X"3E",X"09",X"32",X"25",X"4F",X"32",X"30",X"4D", + X"32",X"48",X"4D",X"21",X"A4",X"4E",X"CB",X"C6",X"11",X"40",X"40",X"21",X"F0",X"86",X"3E",X"01", + X"06",X"1C",X"CD",X"66",X"16",X"11",X"40",X"44",X"21",X"5B",X"87",X"3E",X"01",X"06",X"1C",X"CD", + X"7C",X"16",X"21",X"91",X"4D",X"E5",X"CB",X"6E",X"28",X"09",X"21",X"77",X"4D",X"36",X"74",X"23", + X"23",X"CB",X"E6",X"E1",X"CB",X"4E",X"C8",X"21",X"5F",X"4D",X"36",X"74",X"23",X"23",X"CB",X"E6", + X"C9",X"11",X"8B",X"41",X"21",X"80",X"87",X"3E",X"01",X"06",X"09",X"CD",X"66",X"16",X"CD",X"73", + X"89",X"CD",X"81",X"89",X"06",X"06",X"CD",X"06",X"89",X"06",X"04",X"C5",X"CD",X"9C",X"89",X"CD", + X"98",X"88",X"CD",X"B3",X"88",X"CD",X"CE",X"88",X"CD",X"E9",X"88",X"C1",X"11",X"10",X"00",X"21", + X"01",X"4C",X"E5",X"36",X"58",X"23",X"36",X"40",X"23",X"36",X"AC",X"23",X"36",X"01",X"E1",X"19", + X"10",X"F0",X"11",X"20",X"00",X"21",X"23",X"42",X"CD",X"5F",X"83",X"21",X"EB",X"40",X"CD",X"5F", + X"83",X"21",X"CC",X"42",X"CD",X"5F",X"83",X"21",X"52",X"42",X"CD",X"5F",X"83",X"21",X"F3",X"40", + X"CD",X"5F",X"83",X"3E",X"30",X"32",X"39",X"4D",X"32",X"F7",X"4E",X"3E",X"6A",X"32",X"54",X"4D", + X"3A",X"0A",X"4F",X"A7",X"20",X"02",X"3E",X"09",X"32",X"FD",X"4E",X"32",X"FC",X"4E",X"32",X"29", + X"4F",X"21",X"44",X"42",X"36",X"AE",X"3D",X"C8",X"21",X"A8",X"40",X"36",X"AE",X"3D",X"C8",X"21", + X"48",X"43",X"36",X"AE",X"3D",X"C8",X"21",X"2C",X"41",X"36",X"AE",X"3D",X"C8",X"21",X"14",X"41", + X"36",X"AE",X"3D",X"C8",X"21",X"ED",X"42",X"36",X"AE",X"3D",X"C8",X"21",X"73",X"42",X"36",X"AE", + X"3D",X"C8",X"21",X"72",X"43",X"36",X"AE",X"3D",X"C8",X"21",X"92",X"40",X"36",X"AE",X"C9",X"E5", + X"36",X"D8",X"19",X"36",X"D3",X"19",X"36",X"D2",X"19",X"36",X"D1",X"E1",X"01",X"00",X"04",X"09", + X"06",X"04",X"36",X"0F",X"19",X"10",X"FB",X"C9",X"11",X"8B",X"41",X"21",X"89",X"87",X"3E",X"01", + X"06",X"09",X"CD",X"66",X"16",X"CD",X"04",X"89",X"CD",X"9C",X"89",X"CD",X"B3",X"88",X"CD",X"CE", + X"88",X"CD",X"E9",X"88",X"06",X"05",X"CD",X"B7",X"89",X"3A",X"0A",X"4F",X"A7",X"20",X"02",X"3E", + X"18",X"32",X"FD",X"4E",X"32",X"FC",X"4E",X"3E",X"0C",X"32",X"FB",X"4E",X"3E",X"03",X"32",X"08", + X"4F",X"C9",X"11",X"8B",X"41",X"21",X"92",X"87",X"3E",X"01",X"06",X"09",X"CD",X"66",X"16",X"CD", + X"04",X"89",X"CD",X"9C",X"89",X"3A",X"91",X"4D",X"47",X"CB",X"68",X"3E",X"0E",X"28",X"06",X"CB", + X"48",X"28",X"02",X"3E",X"13",X"32",X"FB",X"4E",X"3A",X"0A",X"4F",X"A7",X"C2",X"42",X"82",X"3E", + X"14",X"C3",X"42",X"82",X"11",X"8B",X"41",X"21",X"9B",X"87",X"3E",X"01",X"06",X"09",X"CD",X"66", + X"16",X"CD",X"04",X"89",X"CD",X"9C",X"89",X"CD",X"CE",X"88",X"CD",X"E9",X"88",X"AF",X"32",X"FB", + X"4E",X"3E",X"02",X"32",X"08",X"4F",X"06",X"06",X"CD",X"B7",X"89",X"3A",X"0A",X"4F",X"A7",X"20", + X"02",X"3E",X"12",X"32",X"FD",X"4E",X"32",X"FC",X"4E",X"C9",X"11",X"8B",X"41",X"21",X"A4",X"87", + X"3E",X"01",X"06",X"09",X"CD",X"66",X"16",X"CD",X"04",X"89",X"CD",X"9C",X"89",X"3A",X"91",X"4D", + X"47",X"CB",X"68",X"3E",X"10",X"28",X"9E",X"CB",X"48",X"28",X"9A",X"3E",X"13",X"C3",X"D5",X"83", + X"11",X"8B",X"41",X"21",X"AD",X"87",X"3E",X"01",X"06",X"09",X"CD",X"66",X"16",X"CD",X"04",X"89", + X"06",X"07",X"C3",X"BB",X"82",X"11",X"8B",X"41",X"21",X"B6",X"87",X"3E",X"01",X"06",X"09",X"CD", + X"66",X"16",X"CD",X"04",X"89",X"CD",X"9C",X"89",X"CD",X"98",X"88",X"CD",X"B3",X"88",X"CD",X"CE", + X"88",X"CD",X"E9",X"88",X"3E",X"0A",X"32",X"FB",X"4E",X"3A",X"0A",X"4F",X"A7",X"20",X"02",X"3E", + X"18",X"32",X"FD",X"4E",X"32",X"FC",X"4E",X"C9",X"3A",X"91",X"4D",X"CB",X"47",X"28",X"18",X"11", + X"8B",X"41",X"21",X"BF",X"87",X"3E",X"01",X"06",X"09",X"CD",X"66",X"16",X"CD",X"04",X"89",X"CD", + X"CE",X"88",X"CD",X"E9",X"88",X"18",X"05",X"3E",X"09",X"CD",X"55",X"15",X"CD",X"9C",X"89",X"CD", + X"98",X"88",X"CD",X"B3",X"88",X"3E",X"0A",X"32",X"FB",X"4E",X"3A",X"0A",X"4F",X"A7",X"20",X"02", + X"3E",X"18",X"32",X"FD",X"4E",X"32",X"FC",X"4E",X"C9",X"11",X"8B",X"41",X"21",X"C8",X"87",X"3E", + X"01",X"06",X"09",X"CD",X"66",X"16",X"CD",X"04",X"89",X"CD",X"9C",X"89",X"3A",X"91",X"4D",X"47", + X"CB",X"68",X"3E",X"12",X"CA",X"D5",X"83",X"CB",X"48",X"CA",X"D5",X"83",X"3E",X"15",X"C3",X"D5", + X"83",X"11",X"8B",X"41",X"21",X"D1",X"87",X"3E",X"01",X"06",X"09",X"CD",X"66",X"16",X"CD",X"04", + X"89",X"CD",X"9C",X"89",X"CD",X"98",X"88",X"CD",X"B3",X"88",X"CD",X"CE",X"88",X"CD",X"E9",X"88", + X"3E",X"0A",X"32",X"FB",X"4E",X"3A",X"0A",X"4F",X"A7",X"20",X"02",X"3E",X"24",X"32",X"FD",X"4E", + X"32",X"FC",X"4E",X"C9",X"11",X"8B",X"41",X"21",X"DA",X"87",X"3E",X"01",X"06",X"09",X"CD",X"66", + X"16",X"CD",X"04",X"89",X"CD",X"9C",X"89",X"CD",X"04",X"85",X"3E",X"02",X"32",X"08",X"4F",X"C9", + X"11",X"8B",X"41",X"21",X"E3",X"87",X"3E",X"01",X"06",X"09",X"CD",X"66",X"16",X"CD",X"04",X"89", + X"CD",X"9C",X"89",X"CD",X"04",X"85",X"C9",X"C9",X"01",X"00",X"00",X"00",X"00",X"AE",X"9A",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A0",X"0A",X"0B",X"0C",X"15",X"15",X"15",X"15",X"0D", + X"0E",X"0F",X"15",X"15",X"15",X"15",X"10",X"11",X"12",X"15",X"15",X"15",X"15",X"13",X"19",X"1A", + X"15",X"15",X"15",X"15",X"9A",X"9A",X"9A",X"15",X"15",X"15",X"15",X"9A",X"9A",X"9A",X"15",X"15", + X"15",X"15",X"9A",X"1B",X"1C",X"15",X"15",X"15",X"15",X"9A",X"1D",X"1E",X"15",X"15",X"15",X"15", + X"9A",X"1F",X"20",X"15",X"15",X"15",X"15",X"9A",X"21",X"22",X"15",X"15",X"15",X"23",X"24",X"25", + X"26",X"27",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"5B",X"5C",X"5D",X"5E",X"5F",X"60", + X"61",X"62",X"63",X"9A",X"14",X"64",X"65",X"66",X"67",X"16",X"9A",X"14",X"68",X"69",X"6A",X"6B", + X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"16",X"73",X"74",X"75",X"76",X"77",X"78",X"79",X"7A", + X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"0A",X"0B",X"0C",X"15",X"15",X"81",X"82",X"0D",X"0E",X"0F", + X"15",X"15",X"15",X"15",X"10",X"11",X"12",X"15",X"15",X"15",X"15",X"13",X"19",X"1A",X"15",X"15", + X"15",X"15",X"9A",X"9A",X"9A",X"15",X"15",X"15",X"15",X"9A",X"9A",X"9A",X"15",X"15",X"15",X"15", + X"9A",X"1B",X"1C",X"15",X"15",X"15",X"15",X"9A",X"1D",X"1E",X"15",X"15",X"15",X"15",X"9A",X"1F", + X"20",X"15",X"15",X"15",X"15",X"9A",X"21",X"22",X"15",X"15",X"15",X"15",X"03",X"03",X"03",X"15", + X"15",X"15",X"15",X"03",X"03",X"03",X"15",X"15",X"15",X"15",X"03",X"03",X"03",X"15",X"15",X"15", + X"15",X"03",X"03",X"03",X"15",X"15",X"15",X"15",X"11",X"16",X"16",X"15",X"15",X"15",X"15",X"11", + X"16",X"16",X"15",X"15",X"15",X"15",X"09",X"03",X"03",X"15",X"15",X"15",X"15",X"09",X"03",X"03", + X"15",X"15",X"15",X"15",X"09",X"03",X"03",X"15",X"15",X"15",X"15",X"09",X"03",X"03",X"15",X"15", + X"15",X"0E",X"03",X"03",X"0D",X"0E",X"0E",X"0E",X"0E",X"03",X"0C",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"09",X"17",X"0F",X"0F",X"0F",X"0F",X"0F",X"09",X"17", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"10",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"10",X"03",X"0D",X"0E",X"0E",X"0E",X"0F",X"03",X"03",X"03",X"15",X"15",X"0E", + X"0E",X"03",X"03",X"03",X"15",X"15",X"15",X"15",X"03",X"03",X"03",X"15",X"15",X"15",X"15",X"03", + X"03",X"03",X"15",X"15",X"15",X"15",X"11",X"16",X"16",X"15",X"15",X"15",X"15",X"11",X"16",X"16", + X"15",X"15",X"15",X"15",X"09",X"03",X"03",X"15",X"15",X"15",X"15",X"09",X"03",X"03",X"15",X"15", + X"15",X"15",X"09",X"03",X"03",X"15",X"15",X"15",X"15",X"09",X"03",X"03",X"15",X"15",X"15",X"15", + X"D9",X"D4",X"D3",X"D3",X"D2",X"D3",X"D3",X"D1",X"D8",X"D2",X"D2",X"D3",X"D1",X"D8",X"D3",X"D3", + X"D2",X"D3",X"D9",X"D4",X"D3",X"D3",X"D1",X"D8",X"D1",X"D8",X"D3",X"D3",X"D7",X"D6",X"D6",X"D5", + X"9A",X"9A",X"9A",X"D4",X"9A",X"9A",X"9A",X"D3",X"9A",X"9A",X"9A",X"D2",X"9A",X"9A",X"9A",X"D1", + X"0F",X"0F",X"0F",X"0F",X"09",X"09",X"09",X"0F",X"09",X"09",X"09",X"0F",X"09",X"09",X"09",X"0F", + X"09",X"09",X"09",X"0F",X"9A",X"9A",X"9A",X"D8",X"9A",X"9A",X"9A",X"D3",X"9A",X"9A",X"9A",X"D2", + X"9A",X"9A",X"9A",X"D9",X"DC",X"DB",X"DB",X"DA",X"09",X"09",X"09",X"0F",X"09",X"09",X"09",X"0F", + X"09",X"09",X"09",X"0F",X"09",X"09",X"09",X"0F",X"0F",X"0F",X"0F",X"0F",X"31",X"40",X"40",X"40", + X"4C",X"45",X"56",X"45",X"4C",X"32",X"40",X"40",X"40",X"4C",X"45",X"56",X"45",X"4C",X"33",X"40", + X"40",X"40",X"4C",X"45",X"56",X"45",X"4C",X"34",X"40",X"40",X"40",X"4C",X"45",X"56",X"45",X"4C", + X"35",X"40",X"40",X"40",X"4C",X"45",X"56",X"45",X"4C",X"36",X"40",X"40",X"40",X"4C",X"45",X"56", + X"45",X"4C",X"37",X"40",X"40",X"40",X"4C",X"45",X"56",X"45",X"4C",X"38",X"40",X"40",X"40",X"4C", + X"45",X"56",X"45",X"4C",X"39",X"40",X"40",X"40",X"4C",X"45",X"56",X"45",X"4C",X"30",X"31",X"40", + X"40",X"4C",X"45",X"56",X"45",X"4C",X"31",X"31",X"40",X"40",X"4C",X"45",X"56",X"45",X"4C",X"32", + X"31",X"40",X"40",X"4C",X"45",X"56",X"45",X"4C",X"33",X"31",X"40",X"40",X"4C",X"45",X"56",X"45", + X"4C",X"34",X"31",X"40",X"40",X"4C",X"45",X"56",X"45",X"4C",X"35",X"31",X"40",X"40",X"4C",X"45", + X"56",X"45",X"4C",X"36",X"31",X"40",X"40",X"4C",X"45",X"56",X"45",X"4C",X"02",X"02",X"02",X"02", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02", + X"02",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"1B",X"1B",X"1B",X"1B",X"1B",X"1B", + X"1B",X"1B",X"1B",X"45",X"4C",X"50",X"4F",X"45",X"50",X"40",X"45",X"55",X"43",X"53",X"45",X"52", + X"53",X"4B",X"43",X"4F",X"52",X"40",X"54",X"4F",X"4F",X"48",X"53",X"53",X"4C",X"4C",X"41",X"42", + X"45",X"52",X"49",X"46",X"40",X"44",X"4E",X"41",X"53",X"4E",X"4F",X"47",X"41",X"52",X"44",X"40", + X"44",X"49",X"4F",X"56",X"41",X"53",X"40",X"53",X"52",X"59",X"52",X"4F",X"45",X"45",X"44",X"48", + X"54",X"59",X"54",X"41",X"50",X"40",X"52",X"53",X"45",X"43",X"40",X"52",X"40",X"54",X"4F",X"48", + X"4F",X"46",X"43",X"4F",X"45",X"55",X"48",X"42",X"4F",X"53",X"40",X"54",X"10",X"00",X"00",X"00", + X"40",X"C8",X"90",X"08",X"C6",X"03",X"02",X"00",X"00",X"90",X"00",X"00",X"9A",X"00",X"00",X"00", + X"00",X"00",X"00",X"90",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0F",X"00",X"01",X"5A",X"11",X"24",X"43",X"21",X"34",X"87",X"3E",X"04", + X"06",X"05",X"CD",X"66",X"16",X"11",X"24",X"47",X"21",X"48",X"87",X"3E",X"04",X"06",X"05",X"CD", + X"66",X"16",X"C9",X"11",X"44",X"40",X"21",X"0C",X"87",X"3E",X"04",X"06",X"05",X"CD",X"66",X"16", + X"11",X"44",X"44",X"21",X"20",X"87",X"3E",X"04",X"06",X"05",X"CD",X"66",X"16",X"C9",X"11",X"2E", + X"43",X"21",X"34",X"87",X"3E",X"04",X"06",X"05",X"CD",X"66",X"16",X"11",X"2E",X"47",X"21",X"48", + X"87",X"3E",X"04",X"06",X"05",X"CD",X"66",X"16",X"C9",X"11",X"4E",X"40",X"21",X"0C",X"87",X"3E", + X"04",X"06",X"05",X"CD",X"66",X"16",X"11",X"4E",X"44",X"21",X"20",X"87",X"3E",X"04",X"06",X"05", + X"CD",X"66",X"16",X"C9",X"06",X"03",X"C5",X"11",X"8B",X"45",X"21",X"EC",X"87",X"3E",X"01",X"06", + X"09",X"CD",X"66",X"16",X"3E",X"0A",X"CD",X"CE",X"15",X"11",X"8B",X"45",X"21",X"01",X"88",X"3E", + X"01",X"06",X"09",X"CD",X"66",X"16",X"3E",X"0A",X"CD",X"CE",X"15",X"11",X"8B",X"45",X"21",X"0A", + X"88",X"3E",X"01",X"06",X"09",X"CD",X"66",X"16",X"3E",X"0A",X"CD",X"CE",X"15",X"C1",X"10",X"C6", + X"3E",X"9A",X"CD",X"45",X"15",X"3E",X"09",X"CD",X"55",X"15",X"C9",X"11",X"73",X"41",X"21",X"20", + X"88",X"3E",X"01",X"06",X"0B",X"CD",X"66",X"16",X"11",X"55",X"41",X"21",X"2B",X"88",X"3E",X"01", + X"06",X"0D",X"CD",X"66",X"16",X"11",X"59",X"41",X"21",X"38",X"88",X"3E",X"01",X"06",X"0D",X"CD", + X"66",X"16",X"C9",X"11",X"4F",X"41",X"21",X"13",X"88",X"3E",X"01",X"06",X"0D",X"CD",X"66",X"16", + X"C9",X"11",X"56",X"41",X"21",X"38",X"88",X"3E",X"01",X"06",X"0D",X"CD",X"66",X"16",X"11",X"58", + X"41",X"21",X"2B",X"88",X"3E",X"01",X"06",X"0D",X"CD",X"66",X"16",X"C9",X"11",X"59",X"40",X"21", + X"68",X"85",X"3E",X"07",X"06",X"1C",X"CD",X"66",X"16",X"11",X"59",X"44",X"21",X"2C",X"86",X"3E", + X"07",X"06",X"1C",X"CD",X"66",X"16",X"C9",X"3A",X"36",X"4D",X"B8",X"30",X"04",X"78",X"32",X"36", + X"4D",X"3A",X"4E",X"4D",X"B8",X"D0",X"78",X"32",X"4E",X"4D",X"C9",X"32",X"C9",X"C9",X"3E",X"E2", + X"01",X"16",X"08",X"18",X"05",X"3E",X"40",X"01",X"00",X"00",X"32",X"FE",X"4E",X"21",X"40",X"40", + X"AF",X"32",X"03",X"4F",X"11",X"BF",X"43",X"7D",X"FE",X"ED",X"28",X"0B",X"FE",X"C0",X"20",X"0C", + X"7C",X"FE",X"43",X"28",X"5B",X"18",X"05",X"7C",X"FE",X"41",X"28",X"4C",X"C5",X"46",X"3A",X"FE", + X"4E",X"B8",X"C1",X"28",X"4B",X"CD",X"62",X"8A",X"3A",X"02",X"4F",X"3C",X"32",X"02",X"4F",X"E6", + X"07",X"20",X"09",X"C5",X"E5",X"3E",X"01",X"CD",X"CE",X"15",X"E1",X"C1",X"3A",X"03",X"4F",X"FE", + X"02",X"28",X"15",X"30",X"1F",X"A7",X"28",X"04",X"23",X"1B",X"18",X"BB",X"C5",X"01",X"20",X"00", + X"09",X"EB",X"ED",X"42",X"C1",X"EB",X"18",X"AF",X"C5",X"EB",X"01",X"20",X"00",X"09",X"EB",X"ED", + X"42",X"C1",X"18",X"A3",X"2B",X"13",X"18",X"9F",X"3A",X"FE",X"4E",X"FE",X"40",X"20",X"86",X"C9", + X"3A",X"03",X"4F",X"3C",X"E6",X"03",X"32",X"03",X"4F",X"2A",X"04",X"4F",X"ED",X"5B",X"06",X"4F", + X"18",X"A6",X"77",X"22",X"04",X"4F",X"F5",X"78",X"CD",X"75",X"8A",X"F1",X"77",X"22",X"06",X"4F", + X"79",X"CD",X"75",X"8A",X"C9",X"C5",X"01",X"00",X"04",X"09",X"77",X"ED",X"42",X"C1",X"EB",X"C9", + X"C9",X"21",X"CC",X"8B",X"22",X"8E",X"4D",X"3E",X"12",X"32",X"0A",X"4F",X"3E",X"04",X"32",X"36", + X"4D",X"32",X"4E",X"4D",X"3E",X"07",X"32",X"27",X"4F",X"32",X"28",X"4F",X"C9",X"3E",X"FF",X"32", + X"F5",X"4D",X"C9",X"AF",X"32",X"36",X"4D",X"32",X"4E",X"4D",X"32",X"FF",X"4E",X"32",X"00",X"4F", + X"32",X"0A",X"4F",X"CD",X"55",X"15",X"3E",X"15",X"CD",X"45",X"15",X"3E",X"07",X"32",X"27",X"4F", + X"32",X"28",X"4F",X"3E",X"D0",X"32",X"F7",X"4E",X"C9",X"11",X"47",X"40",X"21",X"83",X"92",X"3E", + X"02",X"06",X"1B",X"CD",X"66",X"16",X"11",X"47",X"44",X"21",X"84",X"8B",X"3E",X"02",X"06",X"1B", + X"CD",X"7C",X"16",X"11",X"4B",X"40",X"21",X"B9",X"92",X"3E",X"04",X"06",X"1B",X"CD",X"66",X"16", + X"11",X"4B",X"44",X"21",X"85",X"8B",X"3E",X"04",X"06",X"1B",X"CD",X"7C",X"16",X"11",X"51",X"40", + X"21",X"18",X"8B",X"3E",X"04",X"06",X"1B",X"CD",X"66",X"16",X"11",X"51",X"44",X"21",X"86",X"8B", + X"3E",X"04",X"06",X"1B",X"CD",X"7C",X"16",X"C9",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"54",X"4C",X"40",X"48",X"45",X"4C",X"55",X"43",X"4E",X"49",X"4F",X"41",X"41",X"57",X"59", + X"45",X"4C",X"40",X"40",X"40",X"50",X"53",X"54",X"45",X"40",X"44",X"53",X"53",X"4F",X"52",X"4E", + X"49",X"54",X"41",X"49",X"52",X"40",X"5A",X"41",X"41",X"44",X"49",X"47",X"40",X"45",X"4C",X"41", + X"45",X"55",X"40",X"40",X"4C",X"43",X"45",X"4D",X"50",X"53",X"48",X"45",X"4F",X"45",X"54",X"48", + X"45",X"52",X"40",X"54",X"50",X"40",X"52",X"40",X"40",X"45",X"4F",X"45",X"45",X"42",X"40",X"56", + X"48",X"40",X"53",X"41",X"54",X"54",X"55",X"4C",X"40",X"53",X"46",X"53",X"53",X"55",X"59",X"4E", + X"41",X"4D",X"5A",X"45",X"1A",X"02",X"18",X"00",X"00",X"15",X"00",X"00",X"00",X"30",X"00",X"00", + X"00",X"45",X"00",X"00",X"00",X"60",X"00",X"00",X"50",X"12",X"00",X"00",X"00",X"25",X"00",X"00", + X"50",X"37",X"00",X"00",X"00",X"50",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"20",X"00",X"00", + X"00",X"30",X"00",X"00",X"00",X"40",X"00",X"00",X"50",X"07",X"00",X"00",X"00",X"15",X"00",X"00", + X"50",X"22",X"00",X"00",X"00",X"30",X"00",X"05",X"04",X"03",X"02",X"01",X"02",X"03",X"04",X"09", + X"0A",X"0B",X"0C",X"FF",X"4D",X"49",X"43",X"50",X"42",X"03",X"4C",X"4C",X"44",X"60",X"17",X"03", + X"4C",X"52",X"53",X"20",X"85",X"02",X"42",X"49",X"4C",X"90",X"76",X"02",X"41",X"4E",X"47",X"50", + X"31",X"02",X"42",X"55",X"42",X"90",X"10",X"02",X"44",X"4F",X"43",X"00",X"05",X"02",X"46",X"4C", + X"4F",X"60",X"01",X"02",X"4A",X"52",X"46",X"80",X"98",X"01",X"52",X"41",X"59",X"40",X"86",X"01", + X"1B",X"18",X"1A",X"00",X"C7",X"FA",X"00",X"A0",X"FE",X"00",X"9B",X"EE",X"00",X"8B",X"FE",X"00", + X"6B",X"EE",X"00",X"5D",X"FC",X"00",X"17",X"EB",X"00",X"15",X"FF",X"00",X"33",X"EB",X"00",X"81", + X"FB",X"00",X"A3",X"EB",X"01",X"D2",X"FA",X"00",X"C5",X"FE",X"00",X"8C",X"FD",X"00",X"80",X"FF", + X"00",X"CA",X"FC",X"00",X"C1",X"EC",X"00",X"A9",X"FE",X"00",X"6E",X"EE",X"00",X"26",X"FC",X"00", + X"1C",X"EC",X"00",X"19",X"FD",X"00",X"6B",X"FF",X"00",X"9A",X"FB",X"00",X"CA",X"FA",X"00",X"91", + X"EE",X"00",X"2E",X"FD",X"00",X"50",X"FF",X"00",X"C9",X"FB",X"00",X"15",X"0B",X"1D",X"4E",X"0B", + X"38",X"4E",X"0C",X"02",X"01",X"43",X"00",X"02",X"08",X"05",X"04",X"01",X"54",X"00",X"05",X"04", + X"01",X"32",X"00",X"05",X"04",X"01",X"85",X"00",X"05",X"04",X"01",X"A7",X"00",X"05",X"04",X"01", + X"64",X"00",X"05",X"04",X"01",X"0B",X"01",X"05",X"04",X"09",X"0B",X"02",X"4E",X"0B",X"38",X"4E", + X"01",X"F0",X"00",X"0C",X"02",X"06",X"02",X"0F",X"05",X"03",X"02",X"00",X"05",X"03",X"07",X"0F", + X"09",X"0C",X"07",X"02",X"0F",X"01",X"00",X"01",X"06",X"06",X"05",X"01",X"03",X"F0",X"FF",X"07", + X"06",X"03",X"50",X"00",X"04",X"FE",X"07",X"06",X"09",X"0B",X"6E",X"4E",X"0B",X"89",X"4E",X"0C", + X"02",X"01",X"40",X"00",X"02",X"0F",X"06",X"05",X"01",X"03",X"F0",X"FF",X"07",X"02",X"05",X"03", + X"01",X"70",X"00",X"06",X"05",X"01",X"03",X"F0",X"FF",X"07",X"06",X"02",X"08",X"01",X"00",X"0A", + X"0C",X"06",X"06",X"05",X"02",X"03",X"E0",X"FF",X"07",X"38",X"09",X"0C",X"06",X"01",X"60",X"00", + X"02",X"0C",X"06",X"06",X"06",X"05",X"01",X"03",X"10",X"00",X"07",X"06",X"03",X"A0",X"FF",X"07", + X"02",X"04",X"FF",X"07",X"0B",X"09",X"0B",X"53",X"4E",X"0B",X"6E",X"4E",X"0C",X"06",X"02",X"0F", + X"01",X"00",X"00",X"06",X"03",X"1A",X"00",X"05",X"01",X"07",X"0E",X"09",X"0B",X"BF",X"4E",X"0C", + X"02",X"06",X"01",X"58",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"01",X"58", + X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"02",X"01",X"05",X"0C",X"01",X"43", + X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"07",X"02",X"01",X"58",X"00",X"02", + X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"01",X"43",X"00",X"02",X"08",X"06",X"05",X"02", + X"04",X"FF",X"07",X"05",X"01",X"58",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05", + X"01",X"64",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"06",X"01",X"69",X"00", + X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"01",X"69",X"00",X"02",X"08",X"06",X"05", + X"02",X"04",X"FF",X"07",X"05",X"02",X"01",X"05",X"0C",X"01",X"4F",X"00",X"02",X"08",X"06",X"05", + X"02",X"04",X"FF",X"07",X"05",X"07",X"02",X"01",X"69",X"00",X"02",X"08",X"06",X"05",X"02",X"04", + X"FF",X"07",X"05",X"01",X"4F",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"01", + X"69",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"01",X"76",X"00",X"02",X"08", + X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"06",X"01",X"7D",X"00",X"02",X"08",X"06",X"05",X"02", + X"04",X"FF",X"07",X"05",X"01",X"7D",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05", + X"02",X"01",X"05",X"0C",X"01",X"5E",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05", + X"07",X"02",X"01",X"7D",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"01",X"5E", + X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"01",X"76",X"00",X"02",X"08",X"06", + X"05",X"02",X"04",X"FF",X"07",X"05",X"01",X"5E",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF", + X"07",X"05",X"06",X"01",X"70",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"01", + X"70",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"02",X"01",X"05",X"0C",X"01", + X"54",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"07",X"02",X"01",X"70",X"00", + X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"01",X"54",X"00",X"02",X"08",X"06",X"05", + X"02",X"04",X"FF",X"07",X"05",X"01",X"69",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07", + X"05",X"01",X"54",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"06",X"01",X"64", + X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"01",X"64",X"00",X"02",X"08",X"06", + X"05",X"02",X"04",X"FF",X"07",X"05",X"02",X"01",X"05",X"0C",X"01",X"4B",X"00",X"02",X"08",X"06", + X"05",X"02",X"04",X"FF",X"07",X"05",X"07",X"02",X"01",X"64",X"00",X"02",X"08",X"06",X"05",X"02", + X"04",X"FF",X"07",X"05",X"01",X"4B",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05", + X"01",X"5E",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"01",X"4B",X"00",X"02", + X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"05",X"08",X"31",X"8D",X"09",X"0B",X"A4",X"4E",X"0C", + X"02",X"02",X"0F",X"01",X"00",X"01",X"06",X"03",X"18",X"00",X"05",X"01",X"07",X"0C",X"05",X"02", + X"08",X"03",X"8F",X"09",X"0C",X"02",X"01",X"58",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF", + X"07",X"03",X"01",X"58",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"70", + X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"70",X"00",X"02",X"08",X"06", + X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"85",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF", + X"07",X"03",X"01",X"85",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"95", + X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"95",X"00",X"02",X"08",X"06", + X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"76",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF", + X"07",X"03",X"01",X"76",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"95", + X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"95",X"00",X"02",X"08",X"06", + X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"B1",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF", + X"07",X"03",X"01",X"B1",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"C7", + X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"C7",X"00",X"02",X"08",X"06", + X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"85",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF", + X"07",X"03",X"01",X"85",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"A7", + X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"A7",X"00",X"02",X"08",X"06", + X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"C7",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF", + X"07",X"03",X"01",X"C7",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"E0", + X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"C7",X"00",X"02",X"08",X"06", + X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"0B",X"01",X"02",X"08",X"06",X"05",X"02",X"04",X"FF", + X"07",X"03",X"01",X"C7",X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"E0", + X"00",X"02",X"08",X"06",X"05",X"02",X"04",X"FF",X"07",X"03",X"01",X"B1",X"00",X"02",X"08",X"06", + X"05",X"02",X"04",X"FF",X"07",X"06",X"05",X"0C",X"09",X"3E",X"88",X"32",X"0C",X"4F",X"3E",X"9A", + X"CD",X"45",X"15",X"3E",X"08",X"CD",X"55",X"15",X"CD",X"9C",X"89",X"CD",X"98",X"88",X"CD",X"B3", + X"88",X"11",X"24",X"41",X"21",X"75",X"92",X"3E",X"01",X"06",X"0E",X"CD",X"66",X"16",X"11",X"24", + X"45",X"21",X"EC",X"87",X"3E",X"01",X"06",X"0E",X"CD",X"66",X"16",X"3E",X"3C",X"CD",X"CE",X"15", + X"11",X"09",X"43",X"21",X"47",X"92",X"3E",X"04",X"06",X"04",X"CD",X"66",X"16",X"11",X"0F",X"43", + X"21",X"57",X"92",X"3E",X"04",X"06",X"04",X"CD",X"66",X"16",X"11",X"89",X"40",X"21",X"F7",X"91", + X"3E",X"04",X"06",X"14",X"CD",X"66",X"16",X"11",X"8F",X"40",X"21",X"F7",X"91",X"3E",X"04",X"06", + X"14",X"CD",X"66",X"16",X"11",X"37",X"41",X"21",X"67",X"92",X"3E",X"01",X"06",X"0E",X"CD",X"66", + X"16",X"11",X"37",X"45",X"21",X"EC",X"87",X"3E",X"01",X"06",X"0E",X"CD",X"66",X"16",X"3A",X"90", + X"4D",X"CB",X"6F",X"C0",X"21",X"10",X"4F",X"34",X"21",X"0D",X"4F",X"3A",X"0C",X"43",X"FE",X"AB", + X"38",X"0C",X"28",X"14",X"36",X"AA",X"23",X"36",X"AB",X"23",X"36",X"AC",X"18",X"12",X"36",X"AB", + X"23",X"36",X"AC",X"23",X"36",X"AA",X"18",X"08",X"36",X"AC",X"23",X"36",X"AA",X"23",X"36",X"AB", + X"11",X"09",X"43",X"21",X"47",X"92",X"CD",X"EC",X"91",X"11",X"8F",X"41",X"21",X"17",X"92",X"CD", + X"94",X"91",X"11",X"0F",X"43",X"21",X"57",X"92",X"CD",X"94",X"91",X"11",X"89",X"40",X"21",X"F7", + X"91",X"CD",X"EC",X"91",X"11",X"0F",X"41",X"21",X"07",X"92",X"CD",X"94",X"91",X"11",X"89",X"42", + X"21",X"37",X"92",X"CD",X"94",X"91",X"11",X"8F",X"40",X"21",X"F7",X"91",X"CD",X"EC",X"91",X"11", + X"09",X"41",X"21",X"07",X"92",X"CD",X"94",X"91",X"11",X"0F",X"42",X"21",X"27",X"92",X"CD",X"94", + X"91",X"11",X"89",X"41",X"21",X"17",X"92",X"CD",X"EC",X"91",X"11",X"8F",X"42",X"21",X"37",X"92", + X"CD",X"94",X"91",X"11",X"09",X"42",X"21",X"27",X"92",X"CD",X"94",X"91",X"21",X"0C",X"4F",X"34", + X"C2",X"EE",X"90",X"C9",X"D5",X"11",X"11",X"4F",X"D5",X"06",X"10",X"7E",X"FE",X"9A",X"28",X"3E", + X"FE",X"3F",X"30",X"17",X"4F",X"3A",X"10",X"4F",X"CB",X"47",X"79",X"28",X"31",X"FE",X"3C",X"28", + X"19",X"38",X"13",X"FE",X"3E",X"28",X"1B",X"3E",X"3E",X"18",X"23",X"FE",X"AB",X"38",X"17",X"28", + X"1A",X"3A",X"0F",X"4F",X"18",X"18",X"3E",X"3C",X"18",X"14",X"3E",X"3B",X"18",X"10",X"3E",X"3E", + X"18",X"0C",X"3E",X"3D",X"18",X"08",X"3A",X"0D",X"4F",X"18",X"03",X"3A",X"0E",X"4F",X"12",X"13", + X"23",X"10",X"B8",X"E1",X"D1",X"3E",X"04",X"47",X"CD",X"66",X"16",X"C9",X"3E",X"01",X"E5",X"CD", + X"CE",X"15",X"E1",X"CD",X"94",X"91",X"C9",X"9A",X"AA",X"AB",X"9A",X"AC",X"9A",X"9A",X"AA",X"AB", + X"AC",X"AA",X"AB",X"9A",X"9A",X"9A",X"9A",X"9A",X"AA",X"9A",X"AC",X"AB",X"9A",X"AC",X"9A",X"AA", + X"AC",X"AB",X"AA",X"9A",X"9A",X"9A",X"9A",X"9A",X"AA",X"AC",X"AB",X"AB",X"9A",X"AA",X"9A",X"9A", + X"AC",X"AB",X"AA",X"9A",X"9A",X"9A",X"9A",X"AA",X"3E",X"9A",X"AB",X"AC",X"3C",X"3D",X"AA",X"AB", + X"9A",X"3B",X"AC",X"9A",X"9A",X"9A",X"9A",X"AA",X"9A",X"9A",X"AA",X"AC",X"AB",X"AA",X"AB",X"AB", + X"9A",X"9A",X"AC",X"9A",X"9A",X"9A",X"9A",X"9A",X"9A",X"9A",X"AA",X"9A",X"9A",X"9A",X"AB",X"9A", + X"9A",X"9A",X"AC",X"AA",X"AC",X"AA",X"AB",X"AA",X"AC",X"AB",X"3E",X"9A",X"9A",X"3D",X"3C",X"9A", + X"9A",X"3B",X"3D",X"AB",X"AC",X"AA",X"3B",X"52",X"41",X"54",X"53",X"48",X"43",X"45",X"54",X"40", + X"35",X"38",X"39",X"31",X"18",X"53",X"54",X"4E",X"45",X"53",X"45",X"52",X"50",X"40",X"40",X"4E", + X"4E",X"55",X"53",X"54",X"40",X"48",X"40",X"47",X"40",X"55",X"40",X"41",X"53",X"43",X"55",X"40", + X"46",X"45",X"59",X"4C",X"5A",X"50",X"40",X"4F",X"54",X"45",X"45",X"50",X"4E",X"40",X"41",X"45", + X"4C",X"48",X"50",X"54",X"40",X"40",X"45",X"45",X"48",X"45",X"54",X"52",X"40",X"46",X"4E",X"40", + X"49",X"50",X"48",X"4C",X"54",X"45",X"49",X"48",X"57",X"40",X"4C",X"40",X"40",X"40",X"4C",X"40", + X"40",X"40",X"49",X"40",X"45",X"45",X"57",X"45",X"52",X"48",X"40",X"42",X"49",X"54",X"59",X"40", + X"46",X"40",X"45",X"44",X"40",X"54",X"48",X"4E",X"52",X"4F",X"54",X"41",X"4F",X"4F",X"40",X"40", + X"46",X"48",X"52",X"53",X"40",X"53",X"4F",X"45",X"53",X"40",X"40",X"4D",X"44",X"54",X"53",X"41", + X"52",X"53",X"4B",X"4C",X"41",X"55",X"43",X"46",X"5A",X"4D",X"4F",X"40",X"49",X"40",X"52",X"4F", + X"4C",X"55",X"40",X"54",X"40",X"4F",X"47",X"4E",X"59",X"59",X"4E",X"49",X"42",X"40",X"49",X"40", + X"40",X"54",X"54",X"54",X"4E",X"53",X"50",X"53",X"45",X"52",X"55",X"52",X"54",X"49",X"52",X"55", + X"41",X"46",X"45",X"42",X"45",X"DD",X"22",X"F4",X"4C",X"DD",X"CB",X"04",X"46",X"C8",X"DD",X"6E", + X"01",X"DD",X"66",X"02",X"7E",X"FE",X"8B",X"30",X"04",X"FE",X"83",X"30",X"1C",X"3A",X"FE",X"4E", + X"FE",X"03",X"28",X"03",X"FE",X"06",X"C0",X"DD",X"34",X"03",X"DD",X"7E",X"03",X"FE",X"AC",X"DD", + X"6E",X"01",X"DD",X"66",X"02",X"30",X"11",X"77",X"C9",X"36",X"9A",X"DD",X"36",X"01",X"58",X"DD", + X"36",X"02",X"40",X"DD",X"36",X"03",X"AC",X"C9",X"36",X"9A",X"23",X"7D",X"E6",X"1F",X"FE",X"1A", + X"30",X"5C",X"7E",X"FE",X"9A",X"20",X"11",X"DD",X"36",X"00",X"01",X"36",X"AA",X"DD",X"75",X"01", + X"DD",X"74",X"02",X"DD",X"36",X"03",X"AA",X"C9",X"FE",X"D1",X"38",X"42",X"FE",X"DD",X"30",X"3E", + X"DD",X"7E",X"00",X"FE",X"01",X"28",X"18",X"38",X"0B",X"01",X"DF",X"FF",X"09",X"DD",X"36",X"00", + X"02",X"C3",X"7B",X"93",X"01",X"1F",X"00",X"09",X"DD",X"36",X"00",X"00",X"C3",X"7B",X"93",X"7D", + X"E6",X"1F",X"FE",X"07",X"28",X"10",X"FE",X"11",X"28",X"0C",X"EB",X"2A",X"8E",X"4D",X"CB",X"46", + X"EB",X"28",X"E1",X"C3",X"99",X"93",X"7C",X"FE",X"42",X"38",X"D9",X"C3",X"99",X"93",X"21",X"06", + X"4C",X"35",X"C0",X"36",X"0C",X"2A",X"8E",X"4D",X"7E",X"FE",X"09",X"28",X"20",X"38",X"4E",X"FE", + X"0B",X"28",X"32",X"30",X"52",X"3A",X"05",X"4C",X"FE",X"04",X"C8",X"DD",X"36",X"01",X"A0",X"DD", + X"36",X"02",X"41",X"DD",X"36",X"03",X"A9",X"3E",X"04",X"32",X"05",X"4C",X"C9",X"3A",X"05",X"4C", + X"FE",X"06",X"C8",X"DD",X"36",X"01",X"60",X"DD",X"36",X"02",X"40",X"DD",X"36",X"03",X"A9",X"3E", + X"06",X"32",X"05",X"4C",X"C9",X"3A",X"05",X"4C",X"FE",X"02",X"C8",X"DD",X"36",X"01",X"E0",X"DD", + X"36",X"02",X"42",X"DD",X"36",X"03",X"A9",X"3E",X"02",X"32",X"05",X"4C",X"C9",X"FE",X"02",X"28", + X"1E",X"38",X"34",X"FE",X"03",X"20",X"DE",X"3A",X"05",X"4C",X"FE",X"05",X"C8",X"DD",X"36",X"01", + X"00",X"DD",X"36",X"02",X"41",X"DD",X"36",X"03",X"A9",X"3E",X"05",X"32",X"05",X"4C",X"C9",X"3A", + X"05",X"4C",X"FE",X"03",X"C8",X"DD",X"36",X"01",X"40",X"DD",X"36",X"02",X"42",X"DD",X"36",X"03", + X"A9",X"3E",X"03",X"32",X"05",X"4C",X"C9",X"3A",X"05",X"4C",X"FE",X"01",X"C8",X"DD",X"36",X"01", + X"80",X"DD",X"36",X"02",X"43",X"DD",X"36",X"03",X"A9",X"3E",X"01",X"32",X"05",X"4C",X"C9",X"4C", + X"FF",X"11",X"F2",X"43",X"CD",X"ED",X"15",X"21",X"92",X"4D",X"CB",X"86",X"3E",X"01",X"CD",X"70", + X"15",X"C9",X"D1",X"3E",X"80",X"CD",X"52",X"16",X"3E",X"20",X"CD",X"52",X"16",X"18",X"D9",X"3A", + X"F7",X"4D",X"FE",X"00",X"CA",X"16",X"14",X"3D",X"32",X"F7",X"4D",X"FE",X"1A",X"28",X"14",X"3E", + X"1B",X"2A",X"F9",X"4D",X"77",X"3E",X"20",X"CD",X"E3",X"15",X"22",X"F9",X"4D",X"3E",X"1A",X"77", + X"C3",X"16",X"14",X"3D",X"32",X"F7",X"4D",X"3E",X"1B",X"2A",X"F9",X"4D",X"2B",X"77",X"23",X"77", + X"23",X"77",X"2B",X"3E",X"40",X"18",X"E0",X"3A",X"F7",X"4D",X"FE",X"1B",X"CA",X"16",X"14",X"3C", + X"32",X"F7",X"4D",X"FE",X"1A",X"28",X"14",X"3E",X"1B",X"2A",X"F9",X"4D",X"77",X"3E",X"20",X"CD", + X"48",X"16",X"22",X"F9",X"4D",X"3E",X"1A",X"77",X"C3",X"16",X"14",X"3C",X"32",X"F7",X"4D",X"3E", + X"1B",X"2A",X"F9",X"4D",X"77",X"3E",X"40",X"CD",X"48",X"16",X"22",X"F9",X"4D",X"3E",X"1A",X"2B", + X"77",X"23",X"77",X"23",X"77",X"C3",X"16",X"14",X"3E",X"08",X"CD",X"CE",X"15",X"32",X"C0",X"50", + X"06",X"14",X"CD",X"90",X"15",X"DA",X"4E",X"14",X"C3",X"FF",X"13",X"3A",X"F5",X"4D",X"21",X"92", + X"4D",X"CB",X"66",X"28",X"03",X"3A",X"F6",X"4D",X"CB",X"67",X"32",X"C0",X"50",X"28",X"EC",X"18", + X"DC",X"02",X"1B",X"18",X"1A",X"21",X"40",X"40",X"11",X"41",X"40",X"01",X"7F",X"03",X"77",X"ED", + X"B0",X"32",X"C0",X"50",X"C9",X"21",X"40",X"44",X"11",X"41",X"44",X"01",X"7F",X"03",X"77",X"ED", + X"B0",X"32",X"C0",X"50",X"C9",X"3E",X"02",X"CD",X"55",X"15",X"3E",X"40",X"CD",X"45",X"15",X"C9", + X"47",X"AF",X"32",X"99",X"4D",X"32",X"9B",X"4D",X"3A",X"9B",X"4D",X"B8",X"C8",X"21",X"90",X"4D", + X"CB",X"6E",X"C0",X"32",X"C0",X"50",X"18",X"F0",X"E5",X"21",X"20",X"00",X"19",X"EB",X"E1",X"C9", + X"3A",X"92",X"4D",X"CB",X"47",X"28",X"0D",X"3A",X"9C",X"4D",X"47",X"3A",X"9B",X"4D",X"B8",X"30", + X"19",X"37",X"3F",X"C9",X"78",X"32",X"9C",X"4D",X"3A",X"92",X"4D",X"CB",X"C7",X"32",X"92",X"4D", + X"AF",X"32",X"9B",X"4D",X"32",X"99",X"4D",X"37",X"3F",X"C9",X"3A",X"92",X"4D",X"CB",X"87",X"32", + X"92",X"4D",X"37",X"C9",X"21",X"90",X"4D",X"CB",X"FE",X"CB",X"7E",X"C8",X"18",X"FB",X"47",X"AF", + X"32",X"9A",X"4D",X"3A",X"9A",X"4D",X"B8",X"C8",X"21",X"90",X"4D",X"CB",X"6E",X"C0",X"32",X"C0", + X"50",X"18",X"F0",X"85",X"6F",X"D0",X"24",X"C9",X"83",X"5F",X"D0",X"14",X"C9",X"3E",X"03",X"F5", + X"7E",X"E6",X"F0",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"47",X"3A",X"91",X"4D",X"CB", + X"77",X"28",X"22",X"78",X"12",X"1B",X"7E",X"E6",X"0F",X"47",X"3A",X"91",X"4D",X"CB",X"77",X"32", + X"91",X"4D",X"28",X"20",X"78",X"12",X"2B",X"1B",X"F1",X"3D",X"20",X"D3",X"3A",X"91",X"4D",X"CB", + X"B7",X"32",X"91",X"4D",X"C9",X"78",X"FE",X"00",X"28",X"DB",X"3A",X"91",X"4D",X"CB",X"F7",X"32", + X"91",X"4D",X"18",X"CF",X"78",X"FE",X"00",X"28",X"DD",X"3A",X"91",X"4D",X"CB",X"F7",X"32",X"91", + X"4D",X"18",X"D1",X"81",X"4F",X"D0",X"04",X"C9",X"D5",X"16",X"00",X"5F",X"37",X"3F",X"ED",X"52", + X"D1",X"C9",X"E5",X"EB",X"16",X"00",X"5F",X"37",X"3F",X"ED",X"52",X"EB",X"E1",X"C9",X"CD",X"5B", + X"1A",X"DD",X"CB",X"00",X"D6",X"C9",X"32",X"F8",X"4C",X"D5",X"3A",X"F8",X"4C",X"4F",X"ED",X"A0", + X"79",X"FE",X"00",X"20",X"F9",X"D1",X"CD",X"88",X"15",X"10",X"EE",X"C9",X"32",X"F8",X"4C",X"D5", + X"3A",X"F8",X"4C",X"4F",X"ED",X"A0",X"2B",X"79",X"FE",X"00",X"20",X"F8",X"D1",X"CD",X"88",X"15", + X"10",X"ED",X"C9",X"DD",X"7E",X"05",X"FD",X"96",X"05",X"B8",X"DA",X"E5",X"16",X"57",X"3E",X"FF", + X"90",X"47",X"7A",X"B8",X"D2",X"E5",X"16",X"DD",X"7E",X"04",X"FD",X"96",X"04",X"B9",X"DA",X"0F", + X"17",X"57",X"3E",X"FF",X"91",X"4F",X"7A",X"B9",X"D2",X"0F",X"17",X"FD",X"7E",X"05",X"DD",X"BE", + X"05",X"D2",X"24",X"17",X"FD",X"7E",X"04",X"DD",X"BE",X"04",X"D2",X"2C",X"17",X"3A",X"FF",X"4D", + X"21",X"DD",X"16",X"CB",X"27",X"CD",X"E3",X"15",X"5E",X"23",X"56",X"EB",X"E9",X"A9",X"17",X"82", + X"17",X"34",X"17",X"5B",X"17",X"DD",X"7E",X"04",X"FD",X"96",X"04",X"B9",X"38",X"18",X"57",X"3E", + X"FF",X"91",X"4F",X"7A",X"B9",X"30",X"0F",X"DD",X"7E",X"04",X"FD",X"BE",X"04",X"38",X"0A",X"DD", + X"36",X"00",X"18",X"3E",X"02",X"C9",X"3E",X"01",X"C9",X"DD",X"36",X"00",X"08",X"18",X"F4",X"DD", + X"7E",X"05",X"FD",X"BE",X"05",X"38",X"07",X"DD",X"36",X"00",X"00",X"3E",X"03",X"C9",X"DD",X"36", + X"00",X"10",X"18",X"F7",X"21",X"FF",X"4D",X"CB",X"C6",X"C3",X"C4",X"16",X"21",X"FF",X"4D",X"CB", + X"CE",X"C3",X"CD",X"16",X"FD",X"7E",X"04",X"DD",X"96",X"04",X"47",X"DD",X"7E",X"05",X"FD",X"96", + X"05",X"B8",X"28",X"09",X"38",X"0E",X"DD",X"36",X"00",X"02",X"C3",X"CD",X"17",X"DD",X"36",X"00", + X"04",X"C3",X"CD",X"17",X"DD",X"36",X"00",X"06",X"C3",X"CD",X"17",X"FD",X"7E",X"04",X"DD",X"96", + X"04",X"47",X"FD",X"7E",X"05",X"DD",X"96",X"05",X"B8",X"28",X"09",X"38",X"0E",X"DD",X"36",X"00", + X"0E",X"C3",X"CD",X"17",X"DD",X"36",X"00",X"0C",X"C3",X"CD",X"17",X"DD",X"36",X"00",X"0A",X"C3", + X"CD",X"17",X"DD",X"7E",X"04",X"FD",X"96",X"04",X"47",X"FD",X"7E",X"05",X"DD",X"96",X"05",X"B8", + X"28",X"09",X"38",X"0E",X"DD",X"36",X"00",X"12",X"C3",X"CD",X"17",X"DD",X"36",X"00",X"14",X"C3", + X"CD",X"17",X"DD",X"36",X"00",X"16",X"C3",X"CD",X"17",X"DD",X"7E",X"04",X"FD",X"96",X"04",X"47", + X"DD",X"7E",X"05",X"FD",X"96",X"05",X"B8",X"28",X"09",X"38",X"0E",X"DD",X"36",X"00",X"1E",X"C3", + X"CD",X"17",X"DD",X"36",X"00",X"1C",X"C3",X"CD",X"17",X"DD",X"36",X"00",X"1A",X"AF",X"32",X"FF", + X"4D",X"C9",X"2A",X"FD",X"4D",X"E5",X"21",X"13",X"8C",X"7D",X"E1",X"BD",X"CC",X"0F",X"18",X"7E", + X"FE",X"00",X"CA",X"F5",X"17",X"23",X"46",X"3A",X"75",X"4D",X"B8",X"CA",X"05",X"18",X"2B",X"22", + X"FD",X"4D",X"C3",X"0E",X"18",X"23",X"46",X"3A",X"76",X"4D",X"B8",X"CA",X"05",X"18",X"2B",X"22", + X"FD",X"4D",X"C3",X"0E",X"18",X"23",X"7E",X"32",X"F5",X"4D",X"23",X"22",X"FD",X"4D",X"C9",X"3E", + X"FF",X"32",X"F5",X"4D",X"C9",X"3A",X"00",X"50",X"E6",X"0F",X"47",X"3A",X"40",X"50",X"E6",X"F0", + X"B0",X"32",X"F5",X"4D",X"C9",X"3A",X"40",X"50",X"47",X"E6",X"0F",X"CB",X"78",X"28",X"02",X"CB", + X"E7",X"32",X"F6",X"4D",X"C9",X"DD",X"21",X"02",X"4E",X"DD",X"CB",X"00",X"46",X"C4",X"5E",X"16", + X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD",X"21",X"51",X"50",X"CD",X"5E",X"19", + X"DD",X"7E",X"06",X"32",X"45",X"50",X"DD",X"21",X"1D",X"4E",X"DD",X"CB",X"00",X"46",X"C4",X"5E", + X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD",X"21",X"51",X"50",X"CD",X"5E", + X"19",X"DD",X"7E",X"06",X"32",X"45",X"50",X"DD",X"21",X"38",X"4E",X"DD",X"CB",X"00",X"46",X"C4", + X"5E",X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD",X"21",X"51",X"50",X"CD", + X"5E",X"19",X"DD",X"7E",X"06",X"32",X"45",X"50",X"DD",X"21",X"53",X"4E",X"DD",X"CB",X"00",X"46", + X"C4",X"5E",X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD",X"21",X"56",X"50", + X"CD",X"5E",X"19",X"DD",X"7E",X"06",X"32",X"4A",X"50",X"DD",X"21",X"6E",X"4E",X"DD",X"CB",X"00", + X"46",X"C4",X"5E",X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD",X"21",X"56", + X"50",X"CD",X"5E",X"19",X"DD",X"7E",X"06",X"32",X"4A",X"50",X"DD",X"21",X"89",X"4E",X"DD",X"CB", + X"00",X"46",X"C4",X"5E",X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD",X"21", + X"56",X"50",X"CD",X"5E",X"19",X"DD",X"7E",X"06",X"32",X"4A",X"50",X"DD",X"21",X"A4",X"4E",X"DD", + X"CB",X"00",X"46",X"C4",X"5E",X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19",X"FD", + X"21",X"5B",X"50",X"CD",X"5E",X"19",X"DD",X"7E",X"06",X"32",X"4F",X"50",X"DD",X"21",X"BF",X"4E", + X"DD",X"CB",X"00",X"46",X"C4",X"5E",X"16",X"DD",X"CB",X"00",X"56",X"28",X"10",X"CD",X"87",X"19", + X"FD",X"21",X"5B",X"50",X"CD",X"5E",X"19",X"DD",X"7E",X"06",X"32",X"4F",X"50",X"DD",X"21",X"DA", + X"4E",X"DD",X"CB",X"00",X"46",X"C4",X"5E",X"16",X"DD",X"CB",X"00",X"56",X"C8",X"CD",X"87",X"19", + X"FD",X"21",X"5B",X"50",X"CD",X"5E",X"19",X"DD",X"7E",X"06",X"32",X"4F",X"50",X"C9",X"DD",X"7E", + X"03",X"FD",X"77",X"00",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"FD",X"77",X"01",X"DD", + X"7E",X"04",X"FD",X"77",X"02",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"FD",X"77",X"03", + X"DD",X"7E",X"05",X"FD",X"77",X"04",X"C9",X"DD",X"CB",X"00",X"4E",X"C2",X"5B",X"1A",X"DD",X"6E", + X"01",X"DD",X"66",X"02",X"7E",X"CB",X"27",X"11",X"A5",X"19",X"CD",X"E8",X"15",X"23",X"E5",X"1A", + X"6F",X"13",X"1A",X"67",X"E9",X"BF",X"19",X"C3",X"19",X"D1",X"19",X"DA",X"19",X"F0",X"19",X"FD", + X"19",X"17",X"1A",X"30",X"1A",X"52",X"1A",X"5A",X"1A",X"79",X"1A",X"85",X"1A",X"91",X"1A",X"E1", + X"C3",X"94",X"19",X"E1",X"7E",X"DD",X"77",X"03",X"23",X"7E",X"23",X"DD",X"77",X"04",X"C3",X"94", + X"19",X"E1",X"7E",X"DD",X"77",X"05",X"23",X"C3",X"94",X"19",X"E1",X"7E",X"DD",X"46",X"03",X"80", + X"DD",X"77",X"03",X"23",X"7E",X"23",X"DD",X"46",X"04",X"88",X"DD",X"77",X"04",X"C3",X"94",X"19", + X"E1",X"7E",X"DD",X"46",X"05",X"80",X"DD",X"77",X"05",X"23",X"C3",X"94",X"19",X"E1",X"DD",X"7E", + X"07",X"BE",X"30",X"0B",X"DD",X"34",X"07",X"2B",X"DD",X"75",X"01",X"DD",X"74",X"02",X"C9",X"DD", + X"36",X"07",X"00",X"23",X"C3",X"94",X"19",X"DD",X"6E",X"08",X"DD",X"66",X"09",X"D1",X"D5",X"2B", + X"72",X"2B",X"73",X"2B",X"36",X"00",X"DD",X"75",X"08",X"DD",X"74",X"09",X"E1",X"C3",X"94",X"19", + X"D1",X"1A",X"DD",X"6E",X"08",X"DD",X"66",X"09",X"BE",X"28",X"09",X"34",X"23",X"5E",X"23",X"56", + X"EB",X"C3",X"94",X"19",X"23",X"23",X"23",X"DD",X"75",X"08",X"DD",X"74",X"09",X"13",X"EB",X"C3", + X"94",X"19",X"E1",X"5E",X"23",X"56",X"EB",X"C3",X"94",X"19",X"E1",X"DD",X"E5",X"DD",X"E5",X"E1", + X"D1",X"13",X"36",X"00",X"01",X"18",X"00",X"ED",X"B0",X"1A",X"DD",X"77",X"01",X"13",X"1A",X"DD", + X"77",X"02",X"DD",X"75",X"08",X"DD",X"74",X"09",X"C9",X"E1",X"DD",X"75",X"01",X"DD",X"74",X"02", + X"DD",X"36",X"00",X"00",X"C9",X"E1",X"5E",X"23",X"56",X"EB",X"36",X"06",X"13",X"EB",X"C3",X"94", + X"19",X"E1",X"7E",X"DD",X"77",X"06",X"23",X"C3",X"94",X"19",X"32",X"40",X"52",X"45",X"59",X"41", + X"4C",X"50",X"40",X"45",X"52",X"4F",X"43",X"53",X"50",X"4F",X"54",X"40",X"31",X"40",X"52",X"45", + X"59",X"41",X"4C",X"50",X"54",X"49",X"44",X"45",X"52",X"43",X"59",X"41",X"4C",X"50",X"45",X"45", + X"52",X"46",X"40",X"4E",X"49",X"4F",X"43",X"40",X"54",X"52",X"45",X"53",X"4E",X"49",X"52",X"45", + X"59",X"41",X"4C",X"50",X"40",X"45",X"4E",X"4F",X"40",X"54",X"43",X"45",X"4C",X"45",X"53",X"52", + X"4F",X"53",X"52",X"45",X"59",X"41",X"4C",X"50",X"40",X"4F",X"57",X"54",X"40",X"52",X"4F",X"40", + X"45",X"4E",X"4F",X"40",X"54",X"43",X"45",X"4C",X"45",X"53",X"50",X"55",X"40",X"45",X"4E",X"4F", + X"40",X"52",X"45",X"59",X"41",X"4C",X"50",X"50",X"55",X"40",X"4F",X"57",X"54",X"40",X"52",X"45", + X"59",X"41",X"4C",X"50",X"52",X"45",X"56",X"4F",X"40",X"45",X"4D",X"41",X"47",X"59",X"52",X"44", + X"52",X"41",X"5A",X"49",X"57",X"40",X"46",X"4F",X"40",X"4C",X"4C",X"41",X"48",X"45",X"48",X"54", + X"40",X"4E",X"49",X"40",X"53",X"49",X"40",X"45",X"52",X"4F",X"43",X"53",X"40",X"52",X"55",X"4F", + X"59",X"4E",X"45",X"54",X"40",X"50",X"4F",X"54",X"54",X"43",X"45",X"4C",X"45",X"53",X"40",X"4F", + X"54",X"40",X"4B",X"43",X"49",X"54",X"53",X"59",X"4F",X"4A",X"40",X"45",X"53",X"55",X"4E",X"4F", + X"54",X"54",X"55",X"42",X"40",X"45",X"52",X"49",X"46",X"40",X"44",X"4E",X"41",X"40",X"52",X"45", + X"54",X"54",X"45",X"4C",X"54",X"4E",X"49",X"52",X"50",X"40",X"4F",X"54",X"45",X"4E",X"44",X"4D", + X"41",X"4C",X"53",X"53",X"4E",X"4F",X"49",X"54",X"43",X"55",X"52",X"54",X"53",X"4E",X"49",X"40", + X"59",X"41",X"4C",X"50",X"40",X"31",X"40",X"53",X"4E",X"49",X"4F",X"43",X"40",X"32",X"53",X"59", + X"41",X"4C",X"50",X"40",X"32",X"40",X"40",X"4E",X"49",X"4F",X"43",X"40",X"31",X"40",X"59",X"41", + X"4C",X"50",X"40",X"31",X"40",X"40",X"4E",X"49",X"4F",X"43",X"40",X"31",X"53",X"54",X"4E",X"49", + X"4F",X"50",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"59",X"52",X"45",X"56",X"45",X"40", + X"53",X"55",X"4E",X"4F",X"42",X"30",X"30",X"30",X"30",X"35",X"31",X"30",X"30",X"30",X"35",X"32", + X"31",X"30",X"30",X"30",X"30",X"30",X"31",X"40",X"30",X"30",X"30",X"35",X"37",X"53",X"43",X"49", + X"54",X"53",X"4F",X"4E",X"47",X"41",X"49",X"44",X"4E",X"4F",X"49",X"54",X"49",X"44",X"4E",X"4F", + X"43",X"40",X"40",X"4E",X"4F",X"49",X"54",X"41",X"43",X"4F",X"4C",X"40",X"40",X"4D",X"4F",X"52", + X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"44",X"37",X"40",X"40",X"40", + X"40",X"40",X"40",X"31",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"46", + X"37",X"40",X"40",X"40",X"40",X"40",X"40",X"32",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"48",X"37",X"40",X"40",X"40",X"40",X"40",X"40",X"33",X"44",X"4F",X"4F",X"47", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4A",X"37",X"40",X"40",X"40",X"40",X"40",X"40",X"34", + X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"48",X"34",X"40",X"40",X"40", + X"40",X"40",X"40",X"31",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4C", + X"34",X"40",X"40",X"40",X"40",X"40",X"40",X"32",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"4A",X"34",X"40",X"40",X"40",X"40",X"40",X"40",X"33",X"44",X"4F",X"4F",X"47", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4D",X"34",X"40",X"40",X"40",X"40",X"40",X"40",X"34", + X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4B",X"34",X"40",X"40",X"40", + X"40",X"40",X"40",X"35",X"44",X"4F",X"4F",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"4E", + X"34",X"40",X"40",X"40",X"40",X"40",X"40",X"36",X"44",X"41",X"42",X"40",X"4E",X"4F",X"49",X"54", + X"49",X"44",X"4E",X"4F",X"43",X"40",X"40",X"4E",X"4F",X"49",X"54",X"41",X"43",X"4F",X"4C",X"40", + X"40",X"4D",X"41",X"52",X"4E",X"45",X"4D",X"40",X"41",X"52",X"54",X"58",X"45",X"40",X"32",X"40", + X"52",X"4F",X"46",X"06",X"03",X"1A",X"BE",X"38",X"08",X"20",X"0E",X"2B",X"1B",X"10",X"F6",X"18", + X"06",X"CD",X"1E",X"1D",X"37",X"3F",X"C9",X"37",X"C9",X"CD",X"1E",X"1D",X"37",X"C9",X"78",X"FE", + X"00",X"C8",X"2B",X"1B",X"3D",X"20",X"FB",X"C9",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07", + X"08",X"09",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E", + X"4F",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59",X"5A",X"5A",X"59",X"58",X"57", + X"56",X"55",X"54",X"53",X"52",X"51",X"50",X"4F",X"4E",X"4D",X"4C",X"4B",X"4A",X"49",X"48",X"47", + X"46",X"45",X"44",X"43",X"42",X"41",X"00",X"01",X"04",X"02",X"94",X"42",X"95",X"42",X"96",X"42", + X"97",X"42",X"98",X"42",X"99",X"42",X"9A",X"42",X"9B",X"42",X"9C",X"42",X"9D",X"42",X"03",X"02", + X"01",X"00",X"00",X"80",X"60",X"40",X"3A",X"FD",X"4E",X"A7",X"20",X"15",X"21",X"BF",X"4E",X"CB", + X"56",X"28",X"0E",X"3A",X"2A",X"4F",X"3C",X"32",X"2A",X"4F",X"20",X"05",X"CB",X"CE",X"C3",X"11", + X"31",X"3A",X"0B",X"4F",X"A7",X"C2",X"8C",X"30",X"21",X"09",X"4F",X"CB",X"7E",X"20",X"0E",X"35", + X"20",X"0B",X"3A",X"53",X"4E",X"A7",X"28",X"05",X"CB",X"CF",X"32",X"53",X"4E",X"3A",X"77",X"4D", + X"FE",X"78",X"DA",X"CA",X"1D",X"FE",X"90",X"DA",X"D7",X"1D",X"3A",X"5F",X"4D",X"FE",X"78",X"DA", + X"0A",X"1E",X"FE",X"90",X"D2",X"0A",X"1E",X"3A",X"FE",X"4E",X"FE",X"01",X"C2",X"17",X"1E",X"3A", + X"39",X"43",X"FE",X"E4",X"DA",X"F9",X"1D",X"3E",X"DD",X"32",X"39",X"43",X"32",X"F9",X"40",X"3C", + X"32",X"19",X"43",X"32",X"D9",X"40",X"C3",X"17",X"1E",X"3E",X"E4",X"32",X"39",X"43",X"32",X"19", + X"43",X"32",X"F9",X"40",X"32",X"D9",X"40",X"C3",X"17",X"1E",X"3A",X"39",X"43",X"FE",X"9A",X"CA", + X"17",X"1E",X"3E",X"9A",X"C3",X"FB",X"1D",X"3A",X"80",X"4C",X"A7",X"CA",X"36",X"1E",X"DD",X"21", + X"80",X"4C",X"21",X"A4",X"1E",X"3A",X"81",X"4C",X"A7",X"CA",X"58",X"1E",X"CD",X"6D",X"1E",X"DD", + X"22",X"F4",X"4C",X"CD",X"16",X"0E",X"3A",X"90",X"4C",X"A7",X"CA",X"39",X"20",X"21",X"BC",X"1E", + X"DD",X"21",X"90",X"4C",X"3A",X"91",X"4C",X"A7",X"CA",X"58",X"1E",X"CD",X"6D",X"1E",X"DD",X"22", + X"F4",X"4C",X"CD",X"16",X"0E",X"C3",X"39",X"20",X"DD",X"36",X"01",X"10",X"DD",X"36",X"05",X"AE", + X"DD",X"7E",X"09",X"CB",X"27",X"CD",X"E3",X"15",X"5E",X"23",X"56",X"EB",X"E9",X"DD",X"7E",X"04", + X"DD",X"96",X"08",X"C0",X"DD",X"7E",X"03",X"DD",X"96",X"07",X"CA",X"8A",X"1E",X"DA",X"85",X"1E", + X"DD",X"36",X"00",X"04",X"C9",X"DD",X"36",X"00",X"05",X"C9",X"DD",X"36",X"00",X"00",X"DD",X"36", + X"01",X"00",X"2A",X"8E",X"4D",X"CB",X"46",X"CA",X"9F",X"1E",X"DD",X"36",X"05",X"BE",X"C9",X"DD", + X"36",X"05",X"BD",X"C9",X"D4",X"1E",X"E3",X"1E",X"F2",X"1E",X"01",X"1F",X"10",X"1F",X"1F",X"1F", + X"2E",X"1F",X"3D",X"1F",X"4C",X"1F",X"5B",X"1F",X"6A",X"1F",X"79",X"1F",X"88",X"1F",X"97",X"1F", + X"A6",X"1F",X"B5",X"1F",X"C4",X"1F",X"D3",X"1F",X"E2",X"1F",X"F1",X"1F",X"00",X"20",X"0F",X"20", + X"1E",X"20",X"2D",X"20",X"DD",X"36",X"07",X"D0",X"DD",X"36",X"08",X"F8",X"DD",X"36",X"09",X"01", + X"C3",X"36",X"1E",X"DD",X"36",X"07",X"98",X"DD",X"36",X"08",X"E8",X"DD",X"36",X"09",X"02",X"C3", + X"36",X"1E",X"DD",X"36",X"07",X"C8",X"DD",X"36",X"08",X"E8",X"DD",X"36",X"09",X"03",X"C3",X"36", + X"1E",X"DD",X"36",X"07",X"D0",X"DD",X"36",X"08",X"E0",X"DD",X"36",X"09",X"04",X"C3",X"36",X"1E", + X"DD",X"36",X"07",X"A0",X"DD",X"36",X"08",X"E0",X"DD",X"36",X"09",X"05",X"C3",X"36",X"1E",X"DD", + X"36",X"07",X"A0",X"DD",X"36",X"08",X"F8",X"DD",X"36",X"09",X"06",X"C3",X"36",X"1E",X"DD",X"36", + X"07",X"D8",X"DD",X"36",X"08",X"F0",X"DD",X"36",X"09",X"07",X"C3",X"36",X"1E",X"DD",X"36",X"07", + X"B8",X"DD",X"36",X"08",X"F8",X"DD",X"36",X"09",X"08",X"C3",X"36",X"1E",X"DD",X"36",X"07",X"A8", + X"DD",X"36",X"08",X"F0",X"DD",X"36",X"09",X"09",X"C3",X"36",X"1E",X"DD",X"36",X"07",X"C8",X"DD", + X"36",X"08",X"F0",X"DD",X"36",X"09",X"0A",X"C3",X"36",X"1E",X"DD",X"36",X"07",X"B0",X"DD",X"36", + X"08",X"E8",X"DD",X"36",X"09",X"0B",X"C3",X"36",X"1E",X"DD",X"36",X"07",X"B8",X"DD",X"36",X"08", + X"E0",X"DD",X"36",X"09",X"0B",X"C3",X"36",X"1E",X"DD",X"36",X"07",X"08",X"DD",X"36",X"08",X"F8", + X"DD",X"36",X"09",X"01",X"C3",X"39",X"20",X"DD",X"36",X"07",X"40",X"DD",X"36",X"08",X"E8",X"DD", + X"36",X"09",X"02",X"C3",X"39",X"20",X"DD",X"36",X"07",X"10",X"DD",X"36",X"08",X"E8",X"DD",X"36", + X"09",X"03",X"C3",X"39",X"20",X"DD",X"36",X"07",X"08",X"DD",X"36",X"08",X"E0",X"DD",X"36",X"09", + X"04",X"C3",X"39",X"20",X"DD",X"36",X"07",X"38",X"DD",X"36",X"08",X"E0",X"DD",X"36",X"09",X"05", + X"C3",X"39",X"20",X"DD",X"36",X"07",X"38",X"DD",X"36",X"08",X"F8",X"DD",X"36",X"09",X"06",X"C3", + X"39",X"20",X"DD",X"36",X"07",X"00",X"DD",X"36",X"08",X"F0",X"DD",X"36",X"09",X"07",X"C3",X"39", + X"20",X"DD",X"36",X"07",X"20",X"DD",X"36",X"7D",X"F8",X"DD",X"36",X"09",X"08",X"C3",X"39",X"0A"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_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/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/build_id.v new file mode 100644 index 00000000..7ec8a835 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171116" +`define BUILD_TIME "063224" diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_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/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_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/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/osd.v b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_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/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..8325fe34 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pacman.vhd @@ -0,0 +1,629 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN is +generic ( + MRTNT : std_logic := '0' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0_reg : in std_logic_vector(7 downto 0); + in1_reg : in std_logic_vector(7 downto 0); + dipsw_reg : in std_logic_vector(7 downto 0); + + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of PACMAN is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_ena : std_logic; + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal rom_data_out : std_logic_vector(7 downto 0); + signal rom_data : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal vram_addr_ab : std_logic_vector(11 downto 0); + signal ab : std_logic_vector(11 downto 0); + + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal vram_l : std_logic; + signal rams_data_out : std_logic_vector(7 downto 0); + -- more decode + signal wr0_l : std_logic; + signal wr1_l : std_logic; + signal wr2_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + +begin + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + p_sync_comb : process(hcnt, vcnt) + begin + vsync <= not vcnt(8); + do_hsync <= (hcnt = "010101111"); -- 0AF + end process; + + p_sync : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + + if (hcnt = "010010111") then -- 097 + O_HBLANK <= '1'; + elsif (hcnt = "010001111") then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") then + hblank <= '0'; -- 0EF + O_HBLANK <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + -- + -- cpu + -- + p_cpu_wait_comb : process(sync_bus_wreq_l) + begin + cpu_wait_l <= '1'; + if (sync_bus_wreq_l = '0') then + cpu_wait_l <= '0'; + end if; + end process; + + p_irq_req_watchdog : process + variable rising_vblank : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + --rising_vblank := do_hsync; -- debug + -- interrupt 8c + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + + -- simulation + -- pragma translate_off + -- synopsys translate_off + watchdog_reset_l <= not reset; -- watchdog disable + -- synopsys translate_on + -- pragma translate_on + end if; + end process; + + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + + p_cpu_ena : process(hcnt, ena_6) + begin + cpu_ena <= '0'; + if (ena_6 = '1') then + cpu_ena <= hcnt(0); + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + -- + -- primary addr decode + -- + p_mem_decode_comb : process(cpu_rfsh_l, cpu_rd_l, cpu_mreq_l, cpu_addr) + begin + -- rom 0x0000 - 0x3FFF + -- syncbus 0x4000 - 0x7FFF + + -- 7M + -- 7N + sync_bus_cs_l <= '1'; +-- program_rom_cs_l <= '1'; + + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + +-- if (cpu_addr(14) = '0') and (cpu_rd_l = '0') then +-- program_rom_cs_l <= '0'; +-- end if; + + if (cpu_addr(14) = '1') then + sync_bus_cs_l <= '0'; + end if; + + end if; + end process; + -- + -- sync bus custom ic + -- + p_sync_bus_reg : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; + end process; + + p_sync_bus_comb : process(cpu_rd_l, sync_bus_cs_l, hcnt) + begin + -- sync_bus_stb is now an active low clock enable signal + sync_bus_stb <= '1'; + sync_bus_r_w_l <= '1'; + + if (sync_bus_cs_l = '0') and (hcnt(1) = '0') then + if (cpu_rd_l = '1') then + sync_bus_r_w_l <= '0'; + end if; + sync_bus_stb <= '0'; + end if; + + sync_bus_wreq_l <= '1'; + if (sync_bus_cs_l = '0') and (hcnt(1) = '1') and (cpu_rd_l = '0') then + sync_bus_wreq_l <= '0'; + end if; + end process; + -- + -- vram addr custom ic + -- + u_vram_addr : entity work.PACMAN_VRAM_ADDR + port map ( + AB => vram_addr_ab, + H256_L => hcnt(8), + H128 => hcnt(7), + H64 => hcnt(6), + H32 => hcnt(5), + H16 => hcnt(4), + H8 => hcnt(3), + H4 => hcnt(2), + H2 => hcnt(1), + H1 => hcnt(0), + V128 => vcnt(7), + V64 => vcnt(6), + V32 => vcnt(5), + V16 => vcnt(4), + V8 => vcnt(3), + V4 => vcnt(2), + V2 => vcnt(1), + V1 => vcnt(0), + FLIP => control_reg(3) + ); + + p_ab_mux_comb : process(hcnt, cpu_addr, vram_addr_ab) + begin + --When 2H is low, the CPU controls the bus. + if (hcnt(1) = '0') then + ab <= cpu_addr(11 downto 0); + else + ab <= vram_addr_ab; + end if; + end process; + + p_vram_comb : process(hcnt, cpu_addr, sync_bus_stb) + variable a,b : std_logic; + begin + + a := not (cpu_addr(12) or sync_bus_stb); + b := hcnt(1) and hcnt(0); + vram_l <= not (a or b); + end process; + + p_io_decode_comb : process(sync_bus_r_w_l, sync_bus_stb, ab, cpu_addr) + variable sel : std_logic_vector(2 downto 0); + variable dec : std_logic_vector(7 downto 0); + variable selb : std_logic_vector(1 downto 0); + variable decb : std_logic_vector(3 downto 0); + begin + -- WRITE + + -- out_l 0x5000 - 0x503F control space + + -- wr0_l 0x5040 - 0x504F sound + -- wr1_l 0x5050 - 0x505F sound + -- wr2_l 0x5060 - 0x506F sprite + + -- 0x5080 - 0x50BF unused + + -- wdr_l 0x50C0 - 0x50FF watchdog reset + + -- READ + + -- in0_l 0x5000 - 0x503F in port 0 + -- in1_l 0x5040 - 0x507F in port 1 + -- dipsw_l 0x5080 - 0x50BF dip switches + + -- 7J + dec := "11111111"; + sel := sync_bus_r_w_l & ab(7) & ab(6); + if (cpu_addr(12) = '1') and ( sync_bus_stb = '0') then + case sel is + when "000" => dec := "11111110"; + when "001" => dec := "11111101"; + when "010" => dec := "11111011"; + when "011" => dec := "11110111"; + when "100" => dec := "11101111"; + when "101" => dec := "11011111"; + when "110" => dec := "10111111"; + when "111" => dec := "01111111"; + when others => null; + end case; + end if; + iodec_out_l <= dec(0); + iodec_wdr_l <= dec(3); + + iodec_in0_l <= dec(4); + iodec_in1_l <= dec(5); + iodec_dipsw_l <= dec(6); + + -- 7M + decb := "1111"; + selb := ab(5) & ab(4); + if (dec(1) = '0') then + case selb is + when "00" => decb := "1110"; + when "01" => decb := "1101"; + when "10" => decb := "1011"; + when "11" => decb := "0111"; + when others => null; + end case; + end if; + wr0_l <= decb(0); + wr1_l <= decb(1); + wr2_l <= decb(2); + end process; + + p_control_reg : process + variable ena : std_logic_vector(7 downto 0); + begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + ena := "00000000"; + if (iodec_out_l = '0') then + case ab(2 downto 0) is + when "000" => ena := "00000001"; + when "001" => ena := "00000010"; + when "010" => ena := "00000100"; + when "011" => ena := "00001000"; + when "100" => ena := "00010000"; + when "101" => ena := "00100000"; + when "110" => ena := "01000000"; + when "111" => ena := "10000000"; + when others => null; + end case; + end if; + + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (ena(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + p_db_mux_comb : process(hcnt, cpu_data_out, rams_data_out) + begin + -- simplified data source for video subsystem + -- only cpu or ram are sources of interest + if (hcnt(1) = '0') then + sync_bus_db <= cpu_data_out; + else + sync_bus_db <= rams_data_out; + end if; + end process; + + rom_data <= program_rom_dinl when cpu_addr(15) = '0' else program_rom_dinh; + rom_data_out <= rom_data(7 downto 6) & rom_data(3) & rom_data(4) & rom_data(5) & rom_data(2 downto 0) when MRTNT = '1' else rom_data; + + p_cpu_data_in_mux_comb : process(cpu_addr, cpu_iorq_l, cpu_m1_l, sync_bus_wreq_l, + iodec_in0_l, iodec_in1_l, iodec_dipsw_l, cpu_vec_reg, sync_bus_reg, rom_data_out, + rams_data_out, in0_reg, in1_reg, dipsw_reg) + begin + -- simplifed again + if (cpu_iorq_l = '0') and (cpu_m1_l = '0') then + cpu_data_in <= cpu_vec_reg; + elsif (sync_bus_wreq_l = '0') then + cpu_data_in <= sync_bus_reg; + else + if (cpu_addr(15 downto 14) = "00") then -- ROM at 0000 - 3fff + cpu_data_in <= rom_data_out; + elsif (cpu_addr(15 downto 13) = "100") then -- ROM at 8000 - 9fff + cpu_data_in <= rom_data_out; + else + cpu_data_in <= rams_data_out; + if (iodec_in0_l = '0') then cpu_data_in <= in0_reg; end if; + if (iodec_in1_l = '0') then cpu_data_in <= in1_reg; end if; + if (iodec_dipsw_l = '0') then cpu_data_in <= dipsw_reg; end if; + end if; + end if; + end process; + + u_rams : work.dpram generic map (12,8) + port map + ( + clk_a_i => clk, + en_a_i => ena_6, + we_i => not sync_bus_r_w_l and not vram_l, + addr_a_i => ab(11 downto 0), + data_a_i => cpu_data_out, -- cpu only source of ram data + + clk_b_i => clk, + addr_b_i => ab(11 downto 0), + data_b_o => rams_data_out + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom : entity work.ROM_PGM_0 + port map ( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom1 : entity work.ROM_PGM_1 + port map ( + CLK => clk, + ADDR => cpu_addr(12 downto 0), + DATA => program_rom_dinh + ); + + -- + -- video subsystem + -- + u_video : entity work.PACMAN_VIDEO + generic map ( + MRTNT => MRTNT + ) + port map ( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + I_WR2_L => wr2_l, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk + ); + + O_HSYNC <= hSync; + O_VSYNC <= vSync; + + --O_HBLANK <= hblank; + O_VBLANK <= vblank; + + -- + -- + -- audio subsystem + -- + u_audio : entity work.PACMAN_AUDIO + port map ( + I_HCNT => hcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_WR1_L => wr1_l, + I_WR0_L => wr0_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..39619ea0 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR1_L, + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => rom3m(1), + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..895304e9 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pacman_video.vhd @@ -0,0 +1,366 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_VIDEO is +generic ( + MRTNT : std_logic := '0' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); +port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + I_WR2_L : in std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic +); +end; + +architecture RTL of PACMAN_VIDEO is + + signal sprite_xy_ram_temp : std_logic_vector(7 downto 0); + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal db_reg : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_dout : std_logic_vector(7 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal cntr_ld : std_logic; + signal sprite_ram_ip : std_logic_vector(3 downto 0); + signal sprite_ram_op : std_logic_vector(3 downto 0); + signal ra : std_logic_vector(7 downto 0); + signal ra_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(3 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + + -- ram enable is low when HBLANK_L is 0 (for sprite access) or + -- 2H is low (for cpu writes) + -- we can simplify this + dr <= not sprite_xy_ram_temp when I_HBLANK = '1' else "11111111"; -- pull ups on board + + sprite_xy_ram : work.dpram generic map (4,8) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR2_L, + addr_a_i => I_AB(3 downto 0), + data_a_i => I_DB, + + clk_b_i => CLK, + addr_b_i => I_AB(3 downto 0), + data_b_o => sprite_xy_ram_temp + ); + + p_char_regs : process + variable inc : std_logic; + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; + begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + inc := (not I_HBLANK); + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & inc); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + db_reg <= I_DB; -- character reg + end if; + end process; + + p_flip_comb : process(char_hblank_reg, I_FLIP, db_reg) + begin + if (char_hblank_reg = '0') then + xflip <= I_FLIP; + yflip <= I_FLIP; + else + xflip <= db_reg(1); + yflip <= db_reg(0); + end if; + end process; + + p_char_addr_comb : process(db_reg, I_HCNT, + char_match_reg, char_sum_reg, char_hblank_reg, + xflip, yflip) + begin + obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + + ca(12) <= char_hblank_reg; + ca(11 downto 6) <= db_reg(7 downto 2); + + -- 2h, 4e + if (char_hblank_reg = '0') then + ca(5) <= db_reg(1); + ca(4) <= db_reg(0); + else + ca(5) <= char_sum_reg(3) xor xflip; + ca(4) <= I_HCNT(3); + end if; + + ca(3) <= I_HCNT(2) xor yflip; + ca(1) <= char_sum_reg(1) xor xflip; + + -- descramble ROMs for Mr TNT (swap address lines A0 and A2) + if MRTNT = '1' then + ca(2) <= char_sum_reg(0) xor xflip; + ca(0) <= char_sum_reg(2) xor xflip; + else + ca(2) <= char_sum_reg(2) xor xflip; + ca(0) <= char_sum_reg(0) xor xflip; + end if; + end process; + + + -- descramble ROMs for Mr TNT (swap data lines D4 and D6) + char_rom_5ef_dout <= char_rom_5ef_buf(7) & char_rom_5ef_buf(4) & char_rom_5ef_buf(5) & char_rom_5ef_buf(6) & char_rom_5ef_buf(3 downto 0) when MRTNT = '1' else char_rom_5ef_buf; + + -- char roms + char_rom_5ef : entity work.GFX1 + port map ( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf + ); + + p_char_shift : process + begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_dout(7 downto 4); -- load + shift_regl <= char_rom_5ef_dout(3 downto 0); + when others => null; + end case; + end if; + end process; + + p_char_shift_comb : process(I_HCNT, vout_yflip, shift_regu, shift_regl) + variable ip : std_logic; + begin + ip := I_HCNT(0) and I_HCNT(1); + if (vout_yflip = '0') then + + shift_sel(0) <= ip; + shift_sel(1) <= '1'; + shift_op(0) <= shift_regl(3); + shift_op(1) <= shift_regu(3); + else + + shift_sel(0) <= '1'; + shift_sel(1) <= ip; + shift_op(0) <= shift_regl(0); + shift_op(1) <= shift_regu(0); + end if; + end process; + + p_video_out_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= I_DB(4 downto 0); -- colour reg + end if; + end if; + end process; + + col_rom_4a : entity work.PROM4_DST + port map ( + CLK => CLK, + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a + ); + + cntr_ld <= '1' when (I_HCNT(3 downto 0) = "0111") and (vout_hblank='1' or vout_obj_on='0') else '0'; + + p_ra_cnt : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (cntr_ld = '1') then + ra <= dr; + else + ra <= ra + "1"; + end if; + end if; + end process; + + u_sprite_ram : work.dpram generic map (8,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => vout_obj_on_t1, + addr_a_i => ra_t1, + data_a_i => sprite_ram_ip, + + clk_b_i => CLK, + addr_b_i => ra, + data_b_o => sprite_ram_op + ); + + sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "0000"; + video_op_sel <= '1' when not (sprite_ram_reg = "0000") else '0'; + + p_sprite_ram_ip_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + ra_t1 <= ra; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + end if; + end process; + + p_sprite_ram_ip_comb : process(vout_hblank_t1, video_op_sel, sprite_ram_reg, lut_4a_t1) + begin + -- 3a + if (vout_hblank_t1 = '0') then + sprite_ram_ip <= (others => '0'); + else + if (video_op_sel = '1') then + sprite_ram_ip <= sprite_ram_reg; + else + sprite_ram_ip <= lut_4a_t1(3 downto 0); + end if; + end if; + end process; + + p_video_op_comb : process(vout_hblank, I_VBLANK, video_op_sel, sprite_ram_reg, lut_4a) + begin + -- 3b + if (vout_hblank = '1') or (I_VBLANK = '1') then + final_col <= (others => '0'); + else + if (video_op_sel = '1') then + final_col <= sprite_ram_reg; -- sprite + else + final_col <= lut_4a(3 downto 0); + end if; + end if; + end process; + + -- assign video outputs from color LUT PROM + col_rom_7f : entity work.PROM7_DST + port map ( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE + ); + +end architecture; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pacman_vram_addr.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pacman_vram_addr.vhd new file mode 100644 index 00000000..b26824c4 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pacman_vram_addr.vhd @@ -0,0 +1,273 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ & CarlW - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity X74_157 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end; + +architecture RTL of X74_157 is +begin + p_y_comb : process(S,G,A,B) + begin + for i in 0 to 3 loop + -- quad 2 line to 1 line mux (true logic) + if (G = '1') then + Y(i) <= '0'; + else + if (S = '0') then + Y(i) <= A(i); + else + Y(i) <= B(i); + end if; + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity X74_257 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end; + +architecture RTL of X74_257 is +signal ab : std_logic_vector (3 downto 0); +begin + + Y <= ab; -- no tristate + p_ab : process(S,A,B) + begin + for i in 0 to 3 loop + if (S = '0') then + AB(i) <= A(i); + else + AB(i) <= B(i); + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VRAM_ADDR is + port ( + AB : out std_logic_vector (11 downto 0); + H256_L : in std_logic; + H128 : in std_logic; + H64 : in std_logic; + H32 : in std_logic; + H16 : in std_logic; + H8 : in std_logic; + H4 : in std_logic; + H2 : in std_logic; + H1 : in std_logic; + V128 : in std_logic; + V64 : in std_logic; + V32 : in std_logic; + V16 : in std_logic; + V8 : in std_logic; + V4 : in std_logic; + V2 : in std_logic; + V1 : in std_logic; + FLIP : in std_logic + ); +end; + +architecture RTL of PACMAN_VRAM_ADDR is + +signal v128p : std_logic; +signal v64p : std_logic; +signal v32p : std_logic; +signal v16p : std_logic; +signal v8p : std_logic; +signal h128p : std_logic; +signal h64p : std_logic; +signal h32p : std_logic; +signal h16p : std_logic; +signal h8p : std_logic; +signal sel : std_logic; +signal y157 : std_logic_vector (11 downto 0); + +component X74_157 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end component; + +component X74_257 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end component; + +begin + p_vp_comb : process(FLIP, V8, V16, V32, V64, V128) + begin + v128p <= FLIP xor V128; + v64p <= FLIP xor V64; + v32p <= FLIP xor V32; + v16p <= FLIP xor V16; + v8p <= FLIP xor V8; + end process; + + p_hp_comb : process(FLIP, H8, H16, H32, H64, H128) + begin + H128P <= FLIP xor H128; + H64P <= FLIP xor H64; + H32P <= FLIP xor H32; + H16P <= FLIP xor H16; + H8P <= FLIP xor H8; + end process; + + p_sel : process(H16, H32, H64) + begin + sel <= not((H32 xor H16) or (H32 xor H64)); + end process; + + --p_oe257 : process(H2) + --begin + -- oe <= not(H2); + --end process; + + U6 : X74_157 + port map( + Y => y157(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => h64p, + B(0) => h64p, + A => "1111", + G => '0', + S => sel + ); + + U5 : X74_157 + port map( + Y => y157(7 downto 4), + B(3) => h64p, + B(2) => h64p, + B(1) => h8p, + B(0) => v128p, + A => "1111", + G => '0', + S => sel + ); + + U4 : X74_157 + port map( + Y => y157(3 downto 0), + B(3) => v64p, + B(2) => v32p, + B(1) => v16p, + B(0) => v8p, + A(3) => H64, + A(2) => H32, + A(1) => H16, + A(0) => H4, + G => '0', + S => sel + ); + + U3 : X74_257 + port map( + Y => AB(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => v128p, + B(0) => v64p, + A => y157(11 downto 8), + S => H256_L + ); + + U2 : X74_257 + port map( + Y => AB(7 downto 4), + B(3) => v32p, + B(2) => v16p, + B(1) => v8p, + B(0) => h128p, + A => y157(7 downto 4), + S => H256_L + ); + + U1 : X74_257 + port map( + Y => AB(3 downto 0), + B(3) => h64p, + B(2) => h32p, + B(1) => h16p, + B(0) => h8p, + A => y157(3 downto 0), + S => H256_L + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_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 VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pll.vhd b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pll.vhd new file mode 100644 index 00000000..3c952a1a --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/pll.vhd @@ -0,0 +1,365 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC ; + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + locked <= sub_wire0; + sub_wire2 <= sub_wire1(0); + c0 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 9, + clk0_duty_cycle => 50, + clk0_multiply_by => 8, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire4, + locked => sub_wire0, + clk => sub_wire1 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "9" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +-- 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 "1" +-- 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: 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_CLKENA0 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 "9" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +-- Retrieval info: CONSTANT: CLK0_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_USED" +-- 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_USED" +-- 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_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/Lizard_Wizard_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/Lizard_Wizard_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/Arcade/Pacman Hardware/ManiacMiner_MiST/ManiacMiner.qpf b/Arcade/Pacman Hardware/ManiacMiner_MiST/ManiacMiner.qpf new file mode 100644 index 00000000..9494ecc3 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/ManiacMiner.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "ManiacMiner" diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/ManiacMiner.qsf b/Arcade/Pacman Hardware/ManiacMiner_MiST/ManiacMiner.qsf new file mode 100644 index 00000000..ac408316 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/ManiacMiner.qsf @@ -0,0 +1,172 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 23:11:01 November 12, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# ManiacMiner_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 PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom7_dst.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom4_dst.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom3_dst.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/prom1_dst.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/gfx1.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/pacman_vram_addr.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_rom_descrambler.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/ManiacMiner.sv +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/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VHDL_FILE rtl/sega_decode.vhd +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY ManiacMiner +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# 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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(ManiacMiner) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(ManiacMiner) +# ----------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/README.txt b/Arcade/Pacman Hardware/ManiacMiner_MiST/README.txt new file mode 100644 index 00000000..894c6c9e --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/README.txt @@ -0,0 +1,22 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Pacmanic Miner port to MiST by Gehstock +-- 10 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/Release/ManiacMiner.rbf b/Arcade/Pacman Hardware/ManiacMiner_MiST/Release/ManiacMiner.rbf new file mode 100644 index 00000000..ab3090f2 Binary files /dev/null and b/Arcade/Pacman Hardware/ManiacMiner_MiST/Release/ManiacMiner.rbf differ diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/clean.bat b/Arcade/Pacman Hardware/ManiacMiner_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_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/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ManiacMiner.sv b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ManiacMiner.sv new file mode 100644 index 00000000..53e42f31 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ManiacMiner.sv @@ -0,0 +1,198 @@ +//============================================================================ +// Arcade: ManiacMiner +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module ManiacMiner +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "M.Miner;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", +// "T5,Music;", +// "T6,Sound FX;", + "T7,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(reset), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [7:0] audio; +wire hsync,vsync; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid = ce_6m; +wire hs, vs; +wire rde, rhs, rvs; +wire [2:0] r,g,rr,rg; +wire [1:0] b,rb; +wire reset = status[0] | status[7] | buttons[1]; + +video_mixer #(.LINE_LENGTH(292), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(r), + .G(g), + .B(b), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(~reset), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +wire m_jump = kbjoy[8] | m_up; +wire m_fx ;//= status[6]; +wire m_music = kbjoy[9]; + +PACMAN_MACHINE mminer +( + .video_r(r), + .video_g(g), + .video_b(b), + .hsync(hs), + .vsync(vs), + .h_blank(hblank), + .v_blank(vblank), + + .audio(audio), +// .in0_reg(~{2'b00, m_coin, 1'b0, m_down,m_right,m_left,m_up}), +// .in1_reg(~{1'b0, m_start2, m_start1, m_fire, 4'b0000}), + .in0_reg(~{2'b00, m_coin, 1'b0, m_down, m_right, m_left, m_up}), + .in1_reg(~{1'b0, m_start2, m_start1, m_fire, m_fx, m_jump, 1'b0, m_music}), + .dipsw1_reg(8'b0_1_00_11_01), + + .RESET(reset), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(~reset), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +endmodule diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..aed0a451 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,2077 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity ROM_PGM_0 is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(13 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of ROM_PGM_0 is + + + type ROM_ARRAY is array(0 to 16383) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"C3",x"01",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x0000 + x"77",x"23",x"10",x"FC",x"C9",x"00",x"00",x"00", -- 0x0008 + x"85",x"6F",x"8C",x"95",x"67",x"7E",x"C9",x"00", -- 0x0010 + x"78",x"87",x"D7",x"5F",x"23",x"56",x"EB",x"C9", -- 0x0018 + x"E1",x"87",x"D7",x"5F",x"23",x"56",x"EB",x"E9", -- 0x0020 + x"ED",x"B0",x"AF",x"32",x"C0",x"50",x"C9",x"00", -- 0x0028 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0030 + x"C3",x"68",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0038 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0040 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0048 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0050 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0058 + x"00",x"00",x"00",x"00",x"00",x"00",x"ED",x"45", -- 0x0060 + x"F3",x"F5",x"DD",x"E5",x"E5",x"D5",x"C5",x"AF", -- 0x0068 + x"32",x"00",x"50",x"32",x"C0",x"50",x"2A",x"00", -- 0x0070 + x"4C",x"23",x"22",x"00",x"4C",x"3E",x"00",x"B7", -- 0x0078 + x"C2",x"EE",x"00",x"21",x"53",x"4C",x"11",x"F2", -- 0x0080 + x"4F",x"01",x"0C",x"00",x"EF",x"11",x"04",x"00", -- 0x0088 + x"19",x"11",x"62",x"50",x"01",x"0C",x"00",x"EF", -- 0x0090 + x"3A",x"1B",x"4C",x"3C",x"32",x"1B",x"4C",x"E6", -- 0x0098 + x"01",x"28",x"1C",x"2A",x"51",x"4C",x"ED",x"5B", -- 0x00A0 + x"61",x"4C",x"22",x"FA",x"4F",x"ED",x"53",x"6A", -- 0x00A8 + x"50",x"2A",x"5F",x"4C",x"ED",x"5B",x"6F",x"4C", -- 0x00B0 + x"22",x"FC",x"4F",x"ED",x"53",x"6C",x"50",x"3A", -- 0x00B8 + x"50",x"4C",x"B7",x"28",x"14",x"AF",x"32",x"1C", -- 0x00C0 + x"4C",x"AF",x"32",x"50",x"4C",x"CD",x"DD",x"0C", -- 0x00C8 + x"CD",x"DC",x"0C",x"CD",x"B7",x"0C",x"CD",x"92", -- 0x00D0 + x"07",x"CD",x"AF",x"12",x"AF",x"32",x"C0",x"50", -- 0x00D8 + x"3E",x"01",x"32",x"00",x"50",x"C1",x"D1",x"E1", -- 0x00E0 + x"DD",x"E1",x"F1",x"FB",x"ED",x"4D",x"21",x"51", -- 0x00E8 + x"4C",x"11",x"F0",x"4F",x"01",x"10",x"00",x"EF", -- 0x00F0 + x"11",x"60",x"50",x"01",x"10",x"00",x"EF",x"18", -- 0x00F8 + x"BE",x"F3",x"31",x"F0",x"4F",x"ED",x"56",x"3E", -- 0x0100 + x"FF",x"D3",x"00",x"AF",x"21",x"00",x"50",x"01", -- 0x0108 + x"08",x"08",x"CF",x"AF",x"32",x"C0",x"50",x"21", -- 0x0110 + x"00",x"4C",x"06",x"BE",x"CF",x"CF",x"CF",x"CF", -- 0x0118 + x"3E",x"0F",x"32",x"4C",x"4C",x"32",x"4D",x"4C", -- 0x0120 + x"21",x"0D",x"4C",x"11",x"0E",x"4C",x"01",x"0C", -- 0x0128 + x"00",x"36",x"30",x"EF",x"AF",x"12",x"32",x"13", -- 0x0130 + x"4C",x"21",x"CE",x"FA",x"22",x"02",x"4C",x"21", -- 0x0138 + x"40",x"50",x"06",x"40",x"CF",x"3E",x"01",x"32", -- 0x0140 + x"00",x"50",x"FB",x"AF",x"32",x"C0",x"50",x"32", -- 0x0148 + x"48",x"4C",x"32",x"49",x"4C",x"32",x"4A",x"4C", -- 0x0150 + x"3E",x"01",x"32",x"1D",x"4C",x"3E",x"68",x"32", -- 0x0158 + x"1E",x"4C",x"3E",x"00",x"32",x"1F",x"4C",x"3E", -- 0x0160 + x"01",x"32",x"20",x"4C",x"AF",x"32",x"24",x"4C", -- 0x0168 + x"32",x"22",x"4C",x"3E",x"FF",x"32",x"25",x"4C", -- 0x0170 + x"AF",x"32",x"50",x"4C",x"32",x"48",x"4C",x"32", -- 0x0178 + x"49",x"4C",x"32",x"4A",x"4C",x"3E",x"01",x"CD", -- 0x0180 + x"A2",x"12",x"CD",x"24",x"0F",x"3A",x"0B",x"4C", -- 0x0188 + x"B7",x"20",x"14",x"21",x"D9",x"11",x"11",x"BC", -- 0x0190 + x"43",x"0E",x"01",x"CD",x"93",x"0B",x"CD",x"83", -- 0x0198 + x"0B",x"3A",x"0B",x"4C",x"B7",x"28",x"F7",x"21", -- 0x01A0 + x"BD",x"11",x"11",x"BC",x"43",x"0E",x"01",x"CD", -- 0x01A8 + x"93",x"0B",x"CD",x"83",x"0B",x"3A",x"09",x"4C", -- 0x01B0 + x"E6",x"20",x"28",x"F6",x"3A",x"0B",x"4C",x"3D", -- 0x01B8 + x"32",x"0B",x"4C",x"3E",x"02",x"CD",x"A2",x"12", -- 0x01C0 + x"3E",x"00",x"32",x"2F",x"4C",x"3E",x"05",x"32", -- 0x01C8 + x"27",x"4C",x"21",x"0D",x"4C",x"11",x"0E",x"4C", -- 0x01D0 + x"01",x"05",x"00",x"36",x"30",x"EF",x"AF",x"12", -- 0x01D8 + x"3A",x"2F",x"4C",x"CD",x"1B",x"0D",x"AF",x"32", -- 0x01E0 + x"24",x"4C",x"CD",x"E2",x"26",x"AF",x"32",x"2B", -- 0x01E8 + x"4C",x"3A",x"30",x"4C",x"3C",x"32",x"30",x"4C", -- 0x01F0 + x"3E",x"01",x"32",x"0A",x"4C",x"CD",x"83",x"0B", -- 0x01F8 + x"CD",x"83",x"0B",x"CD",x"83",x"0B",x"AF",x"32", -- 0x0200 + x"0A",x"4C",x"CD",x"83",x"0B",x"3A",x"2E",x"4C", -- 0x0208 + x"3C",x"FE",x"06",x"38",x"0F",x"CD",x"3C",x"0B", -- 0x0210 + x"3A",x"39",x"4C",x"B7",x"20",x"05",x"3E",x"02", -- 0x0218 + x"32",x"2B",x"4C",x"AF",x"32",x"2E",x"4C",x"3A", -- 0x0220 + x"31",x"4C",x"32",x"33",x"4C",x"3A",x"32",x"4C", -- 0x0228 + x"32",x"34",x"4C",x"3A",x"04",x"4C",x"32",x"31", -- 0x0230 + x"4C",x"3A",x"05",x"4C",x"32",x"32",x"4C",x"ED", -- 0x0238 + x"5B",x"1D",x"4C",x"7A",x"C6",x"10",x"57",x"CD", -- 0x0240 + x"4B",x"0C",x"20",x"0E",x"ED",x"5B",x"1D",x"4C", -- 0x0248 + x"1C",x"7A",x"C6",x"10",x"57",x"CD",x"4B",x"0C", -- 0x0250 + x"28",x"41",x"3A",x"2C",x"4C",x"FE",x"00",x"28", -- 0x0258 + x"1E",x"3A",x"1F",x"4C",x"E6",x"02",x"28",x"08", -- 0x0260 + x"3A",x"31",x"4C",x"2F",x"E6",x"02",x"20",x"0D", -- 0x0268 + x"3A",x"31",x"4C",x"E6",x"FB",x"F6",x"02",x"32", -- 0x0270 + x"31",x"4C",x"32",x"26",x"4C",x"18",x"1C",x"3A", -- 0x0278 + x"1F",x"4C",x"E6",x"02",x"20",x"08",x"3A",x"31", -- 0x0280 + x"4C",x"2F",x"E6",x"04",x"20",x"0D",x"3A",x"31", -- 0x0288 + x"4C",x"E6",x"FD",x"F6",x"04",x"32",x"31",x"4C", -- 0x0290 + x"32",x"26",x"4C",x"3A",x"24",x"4C",x"B7",x"28", -- 0x0298 + x"06",x"3A",x"25",x"4C",x"32",x"31",x"4C",x"3A", -- 0x02A0 + x"31",x"4C",x"CB",x"4F",x"20",x"6F",x"F6",x"04", -- 0x02A8 + x"32",x"31",x"4C",x"32",x"26",x"4C",x"32",x"25", -- 0x02B0 + x"4C",x"3A",x"1F",x"4C",x"CB",x"4F",x"20",x"10", -- 0x02B8 + x"3A",x"31",x"4C",x"F6",x"02",x"32",x"31",x"4C", -- 0x02C0 + x"32",x"26",x"4C",x"32",x"25",x"4C",x"18",x"45", -- 0x02C8 + x"D6",x"04",x"E6",x"0F",x"32",x"1F",x"4C",x"FE", -- 0x02D0 + x"0E",x"20",x"3A",x"ED",x"5B",x"1D",x"4C",x"1D", -- 0x02D8 + x"CD",x"3A",x"0C",x"20",x"2B",x"ED",x"5B",x"1D", -- 0x02E0 + x"4C",x"1D",x"7A",x"C6",x"08",x"57",x"CD",x"3A", -- 0x02E8 + x"0C",x"20",x"1D",x"ED",x"5B",x"1D",x"4C",x"1D", -- 0x02F0 + x"7A",x"C6",x"0F",x"57",x"CD",x"3A",x"0C",x"20", -- 0x02F8 + x"0F",x"3A",x"1D",x"4C",x"3D",x"32",x"1D",x"4C", -- 0x0300 + x"FE",x"FF",x"20",x"11",x"3C",x"32",x"1D",x"4C", -- 0x0308 + x"3E",x"02",x"32",x"1F",x"4C",x"3A",x"1F",x"4C", -- 0x0310 + x"F6",x"02",x"32",x"1F",x"4C",x"3A",x"31",x"4C", -- 0x0318 + x"CB",x"57",x"20",x"70",x"F6",x"02",x"32",x"31", -- 0x0320 + x"4C",x"32",x"26",x"4C",x"32",x"25",x"4C",x"3A", -- 0x0328 + x"1F",x"4C",x"CB",x"4F",x"28",x"10",x"3A",x"31", -- 0x0330 + x"4C",x"F6",x"04",x"32",x"31",x"4C",x"32",x"26", -- 0x0338 + x"4C",x"32",x"25",x"4C",x"18",x"46",x"C6",x"04", -- 0x0340 + x"E6",x"0F",x"32",x"1F",x"4C",x"20",x"3D",x"ED", -- 0x0348 + x"5B",x"1D",x"4C",x"1C",x"1C",x"CD",x"3A",x"0C", -- 0x0350 + x"20",x"2D",x"ED",x"5B",x"1D",x"4C",x"1C",x"1C", -- 0x0358 + x"7A",x"C6",x"08",x"57",x"CD",x"3A",x"0C",x"20", -- 0x0360 + x"1E",x"ED",x"5B",x"1D",x"4C",x"1C",x"1C",x"7A", -- 0x0368 + x"C6",x"0F",x"57",x"CD",x"3A",x"0C",x"20",x"0F", -- 0x0370 + x"3A",x"1D",x"4C",x"3C",x"FE",x"1B",x"32",x"1D", -- 0x0378 + x"4C",x"20",x"11",x"3D",x"32",x"1D",x"4C",x"3E", -- 0x0380 + x"0C",x"32",x"1F",x"4C",x"3A",x"1F",x"4C",x"E6", -- 0x0388 + x"FD",x"32",x"1F",x"4C",x"3A",x"32",x"4C",x"CB", -- 0x0390 + x"57",x"20",x"25",x"3A",x"24",x"4C",x"B7",x"20", -- 0x0398 + x"1F",x"AF",x"32",x"23",x"4C",x"3E",x"01",x"32", -- 0x03A0 + x"24",x"4C",x"3E",x"FC",x"32",x"22",x"4C",x"3A", -- 0x03A8 + x"1E",x"4C",x"32",x"28",x"4C",x"3A",x"31",x"4C", -- 0x03B0 + x"32",x"25",x"4C",x"3E",x"01",x"32",x"2A",x"4C", -- 0x03B8 + x"3A",x"24",x"4C",x"B7",x"CA",x"BB",x"04",x"3C", -- 0x03C0 + x"32",x"24",x"4C",x"ED",x"5B",x"22",x"4C",x"3A", -- 0x03C8 + x"1E",x"4C",x"83",x"32",x"1E",x"4C",x"3A",x"24", -- 0x03D0 + x"4C",x"E6",x"01",x"28",x"0D",x"7B",x"CB",x"7F", -- 0x03D8 + x"20",x"04",x"FE",x"04",x"30",x"04",x"3C",x"32", -- 0x03E0 + x"22",x"4C",x"3A",x"22",x"4C",x"CB",x"7F",x"C2", -- 0x03E8 + x"53",x"04",x"FE",x"03",x"38",x"5D",x"ED",x"5B", -- 0x03F0 + x"1D",x"4C",x"7A",x"C6",x"10",x"57",x"CD",x"1B", -- 0x03F8 + x"0C",x"28",x"20",x"AF",x"32",x"22",x"4C",x"32", -- 0x0400 + x"24",x"4C",x"3A",x"1E",x"4C",x"E6",x"F8",x"32", -- 0x0408 + x"1E",x"4C",x"3A",x"28",x"4C",x"C6",x"18",x"5F", -- 0x0410 + x"3A",x"1E",x"4C",x"BB",x"38",x"05",x"3E",x"02", -- 0x0418 + x"32",x"2B",x"4C",x"ED",x"5B",x"1D",x"4C",x"1C", -- 0x0420 + x"7A",x"C6",x"10",x"57",x"CD",x"1B",x"0C",x"28", -- 0x0428 + x"20",x"AF",x"32",x"22",x"4C",x"32",x"24",x"4C", -- 0x0430 + x"3A",x"1E",x"4C",x"E6",x"F8",x"32",x"1E",x"4C", -- 0x0438 + x"3A",x"28",x"4C",x"C6",x"18",x"5F",x"3A",x"1E", -- 0x0440 + x"4C",x"BB",x"38",x"05",x"3E",x"02",x"32",x"2B", -- 0x0448 + x"4C",x"18",x"56",x"ED",x"5B",x"1D",x"4C",x"15", -- 0x0450 + x"CD",x"3A",x"0C",x"20",x"0B",x"ED",x"5B",x"1D", -- 0x0458 + x"4C",x"1C",x"15",x"CD",x"3A",x"0C",x"28",x"41", -- 0x0460 + x"3A",x"22",x"4C",x"CB",x"7F",x"28",x"3A",x"AF", -- 0x0468 + x"32",x"22",x"4C",x"3E",x"FF",x"32",x"25",x"4C", -- 0x0470 + x"32",x"26",x"4C",x"3A",x"1E",x"4C",x"3D",x"E6", -- 0x0478 + x"78",x"C6",x"08",x"32",x"1E",x"4C",x"ED",x"5B", -- 0x0480 + x"1D",x"4C",x"7A",x"C6",x"10",x"57",x"D5",x"CD", -- 0x0488 + x"1B",x"0C",x"D1",x"20",x"06",x"1C",x"CD",x"1B", -- 0x0490 + x"0C",x"28",x"0E",x"AF",x"32",x"24",x"4C",x"32", -- 0x0498 + x"22",x"4C",x"3E",x"FF",x"32",x"25",x"4C",x"18", -- 0x04A0 + x"43",x"3A",x"23",x"4C",x"3C",x"32",x"23",x"4C", -- 0x04A8 + x"FE",x"11",x"38",x"38",x"3E",x"FF",x"32",x"25", -- 0x04B0 + x"4C",x"18",x"31",x"3A",x"24",x"4C",x"B7",x"20", -- 0x04B8 + x"2B",x"ED",x"5B",x"1D",x"4C",x"7A",x"C6",x"10", -- 0x04C0 + x"57",x"D5",x"CD",x"1B",x"0C",x"D1",x"20",x"1C", -- 0x04C8 + x"1C",x"CD",x"1B",x"0C",x"20",x"16",x"AF",x"32", -- 0x04D0 + x"22",x"4C",x"3E",x"FF",x"32",x"25",x"4C",x"3E", -- 0x04D8 + x"01",x"32",x"24",x"4C",x"3A",x"1E",x"4C",x"C6", -- 0x04E0 + x"10",x"32",x"28",x"4C",x"ED",x"5B",x"1D",x"4C", -- 0x04E8 + x"CB",x"23",x"CB",x"23",x"CB",x"23",x"ED",x"4B", -- 0x04F0 + x"1F",x"4C",x"D5",x"79",x"E6",x"0C",x"1F",x"D1", -- 0x04F8 + x"83",x"32",x"29",x"4C",x"ED",x"5B",x"1D",x"4C", -- 0x0500 + x"CB",x"23",x"CB",x"23",x"CB",x"23",x"ED",x"4B", -- 0x0508 + x"1F",x"4C",x"CB",x"49",x"28",x"04",x"79",x"EE", -- 0x0510 + x"0C",x"4F",x"3E",x"00",x"CD",x"D5",x"0B",x"DD", -- 0x0518 + x"21",x"71",x"4C",x"06",x"01",x"3A",x"41",x"4C", -- 0x0520 + x"B7",x"28",x"21",x"4F",x"C5",x"DD",x"5E",x"01", -- 0x0528 + x"CB",x"23",x"CB",x"23",x"CB",x"23",x"DD",x"56", -- 0x0530 + x"02",x"DD",x"4E",x"00",x"78",x"06",x"01",x"CD", -- 0x0538 + x"D5",x"0B",x"C1",x"11",x"07",x"00",x"DD",x"19", -- 0x0540 + x"04",x"0D",x"20",x"E0",x"DD",x"21",x"8D",x"4C", -- 0x0548 + x"3A",x"42",x"4C",x"B7",x"28",x"21",x"4F",x"C5", -- 0x0550 + x"DD",x"5E",x"01",x"CB",x"23",x"CB",x"23",x"CB", -- 0x0558 + x"23",x"DD",x"56",x"02",x"DD",x"4E",x"00",x"78", -- 0x0560 + x"06",x"01",x"CD",x"D5",x"0B",x"C1",x"11",x"07", -- 0x0568 + x"00",x"DD",x"19",x"04",x"0D",x"20",x"E0",x"78", -- 0x0570 + x"FE",x"08",x"28",x"0C",x"11",x"F0",x"F0",x"DD", -- 0x0578 + x"4E",x"00",x"CD",x"D5",x"0B",x"04",x"18",x"EF", -- 0x0580 + x"3E",x"01",x"32",x"50",x"4C",x"3A",x"24",x"4C", -- 0x0588 + x"B7",x"20",x"43",x"ED",x"5B",x"1D",x"4C",x"7A", -- 0x0590 + x"C6",x"10",x"57",x"CD",x"0F",x"0C",x"FE",x"68", -- 0x0598 + x"38",x"12",x"FE",x"A0",x"30",x"0E",x"3C",x"77", -- 0x05A0 + x"E6",x"07",x"20",x"08",x"36",x"03",x"CB",x"D4", -- 0x05A8 + x"3A",x"36",x"4C",x"77",x"ED",x"5B",x"1D",x"4C", -- 0x05B0 + x"1C",x"7A",x"C6",x"10",x"57",x"CD",x"0F",x"0C", -- 0x05B8 + x"FE",x"68",x"38",x"12",x"FE",x"A0",x"30",x"0E", -- 0x05C0 + x"3C",x"77",x"E6",x"07",x"20",x"08",x"36",x"03", -- 0x05C8 + x"CB",x"D4",x"3A",x"36",x"4C",x"77",x"ED",x"5B", -- 0x05D0 + x"1D",x"4C",x"CD",x"7A",x"0A",x"1C",x"CD",x"7A", -- 0x05D8 + x"0A",x"7A",x"C6",x"08",x"57",x"CD",x"7A",x"0A", -- 0x05E0 + x"1D",x"CD",x"7A",x"0A",x"7A",x"C6",x"07",x"57", -- 0x05E8 + x"CD",x"7A",x"0A",x"1C",x"CD",x"7A",x"0A",x"DD", -- 0x05F0 + x"21",x"71",x"4C",x"3A",x"41",x"4C",x"B7",x"28", -- 0x05F8 + x"61",x"47",x"DD",x"7E",x"03",x"DD",x"86",x"06", -- 0x0600 + x"DD",x"77",x"03",x"1F",x"1F",x"1F",x"DD",x"77", -- 0x0608 + x"01",x"DD",x"7E",x"03",x"DD",x"BE",x"04",x"38", -- 0x0610 + x"05",x"DD",x"BE",x"05",x"38",x"08",x"DD",x"7E", -- 0x0618 + x"06",x"2F",x"3C",x"DD",x"77",x"06",x"DD",x"7E", -- 0x0620 + x"03",x"E6",x"06",x"87",x"4F",x"DD",x"7E",x"00", -- 0x0628 + x"E6",x"F0",x"B1",x"DD",x"77",x"00",x"DD",x"CB", -- 0x0630 + x"06",x"7E",x"28",x"08",x"DD",x"7E",x"00",x"EE", -- 0x0638 + x"0E",x"DD",x"77",x"00",x"DD",x"5E",x"03",x"DD", -- 0x0640 + x"56",x"02",x"2A",x"1D",x"4C",x"3A",x"29",x"4C", -- 0x0648 + x"6F",x"CD",x"FA",x"09",x"38",x"05",x"3E",x"02", -- 0x0650 + x"32",x"2B",x"4C",x"11",x"07",x"00",x"DD",x"19", -- 0x0658 + x"10",x"A0",x"DD",x"21",x"8D",x"4C",x"3A",x"42", -- 0x0660 + x"4C",x"B7",x"CA",x"2C",x"07",x"47",x"DD",x"7E", -- 0x0668 + x"06",x"B7",x"28",x"11",x"3A",x"2F",x"4C",x"FE", -- 0x0670 + x"07",x"28",x"04",x"FE",x"0B",x"20",x"06",x"11", -- 0x0678 + x"0E",x"0A",x"CD",x"26",x"0A",x"DD",x"7E",x"02", -- 0x0680 + x"DD",x"86",x"06",x"DD",x"77",x"02",x"DD",x"BE", -- 0x0688 + x"04",x"38",x"05",x"DD",x"BE",x"05",x"38",x"4A", -- 0x0690 + x"DD",x"7E",x"06",x"2F",x"3C",x"DD",x"77",x"06", -- 0x0698 + x"3A",x"2F",x"4C",x"FE",x"07",x"28",x"37",x"FE", -- 0x06A0 + x"0B",x"28",x"33",x"FE",x"0D",x"28",x"13",x"FE", -- 0x06A8 + x"04",x"28",x"02",x"18",x"2D",x"3A",x"3C",x"4C", -- 0x06B0 + x"B7",x"20",x"27",x"3E",x"00",x"DD",x"77",x"06", -- 0x06B8 + x"18",x"20",x"DD",x"7E",x"03",x"C6",x"40",x"DD", -- 0x06C0 + x"77",x"03",x"1F",x"1F",x"1F",x"DD",x"77",x"01", -- 0x06C8 + x"AF",x"DD",x"77",x"02",x"DD",x"7E",x"06",x"2F", -- 0x06D0 + x"3C",x"DD",x"77",x"06",x"18",x"04",x"AF",x"32", -- 0x06D8 + x"42",x"4C",x"3A",x"30",x"4C",x"E6",x"03",x"20", -- 0x06E0 + x"23",x"DD",x"7E",x"00",x"FE",x"20",x"38",x"1C", -- 0x06E8 + x"FE",x"A0",x"38",x"13",x"C6",x"04",x"DD",x"77", -- 0x06F0 + x"00",x"E6",x"0C",x"FE",x"00",x"20",x"0D",x"DD", -- 0x06F8 + x"7E",x"00",x"D6",x"10",x"DD",x"77",x"00",x"EE", -- 0x0700 + x"04",x"DD",x"77",x"00",x"DD",x"5E",x"03",x"DD", -- 0x0708 + x"56",x"02",x"2A",x"1D",x"4C",x"3A",x"29",x"4C", -- 0x0710 + x"6F",x"CD",x"FA",x"09",x"38",x"05",x"3E",x"02", -- 0x0718 + x"32",x"2B",x"4C",x"11",x"07",x"00",x"DD",x"19", -- 0x0720 + x"05",x"C2",x"6E",x"06",x"3A",x"07",x"4C",x"E6", -- 0x0728 + x"20",x"28",x"0A",x"3A",x"05",x"4C",x"E6",x"60", -- 0x0730 + x"20",x"03",x"C3",x"58",x"01",x"3A",x"2B",x"4C", -- 0x0738 + x"B7",x"CA",x"ED",x"01",x"FE",x"01",x"28",x"1C", -- 0x0740 + x"3E",x"40",x"32",x"4E",x"4C",x"3A",x"27",x"4C", -- 0x0748 + x"3D",x"32",x"27",x"4C",x"C2",x"E0",x"01",x"AF", -- 0x0750 + x"32",x"47",x"4C",x"32",x"24",x"4C",x"CD",x"19", -- 0x0758 + x"09",x"C3",x"58",x"01",x"AF",x"32",x"24",x"4C", -- 0x0760 + x"3A",x"39",x"4C",x"B7",x"28",x"11",x"32",x"4A", -- 0x0768 + x"4C",x"CD",x"83",x"0B",x"CD",x"3C",x"0B",x"11", -- 0x0770 + x"14",x"0A",x"CD",x"26",x"0A",x"18",x"E5",x"3A", -- 0x0778 + x"2F",x"4C",x"3C",x"32",x"2F",x"4C",x"FE",x"14", -- 0x0780 + x"DA",x"E0",x"01",x"AF",x"32",x"2F",x"4C",x"C3", -- 0x0788 + x"E0",x"01",x"3A",x"2F",x"4C",x"FE",x"12",x"C0", -- 0x0790 + x"11",x"14",x"00",x"CD",x"6D",x"0B",x"CB",x"D4", -- 0x0798 + x"11",x"14",x"00",x"7E",x"FE",x"18",x"20",x"34", -- 0x07A0 + x"7E",x"FE",x"18",x"20",x"24",x"36",x"0F",x"2C", -- 0x07A8 + x"14",x"18",x"F5",x"01",x"E1",x"FF",x"09",x"15", -- 0x07B0 + x"1D",x"7E",x"FE",x"18",x"28",x"EA",x"18",x"1C", -- 0x07B8 + x"7E",x"FE",x"18",x"20",x"EE",x"36",x"0F",x"01", -- 0x07C0 + x"20",x"00",x"09",x"1D",x"FA",x"DC",x"07",x"18", -- 0x07C8 + x"EF",x"01",x"1F",x"00",x"09",x"15",x"1D",x"7E", -- 0x07D0 + x"FE",x"18",x"28",x"E9",x"21",x"A4",x"47",x"36", -- 0x07D8 + x"0F",x"2E",x"84",x"36",x"0F",x"DD",x"21",x"71", -- 0x07E0 + x"4C",x"3A",x"41",x"4C",x"B7",x"28",x"31",x"47", -- 0x07E8 + x"DD",x"5E",x"03",x"DD",x"56",x"02",x"CB",x"3B", -- 0x07F0 + x"CB",x"3B",x"CB",x"3B",x"CB",x"3A",x"CB",x"3A", -- 0x07F8 + x"CB",x"3A",x"CD",x"6D",x"0B",x"CB",x"D4",x"CD", -- 0x0800 + x"0B",x"09",x"2C",x"CD",x"0B",x"09",x"11",x"E0", -- 0x0808 + x"FF",x"19",x"CD",x"0B",x"09",x"2D",x"CD",x"0B", -- 0x0810 + x"09",x"11",x"07",x"00",x"DD",x"19",x"10",x"D0", -- 0x0818 + x"DD",x"21",x"8D",x"4C",x"3A",x"42",x"4C",x"B7", -- 0x0820 + x"CA",x"5E",x"08",x"47",x"DD",x"5E",x"03",x"DD", -- 0x0828 + x"56",x"02",x"CB",x"3B",x"CB",x"3B",x"CB",x"3B", -- 0x0830 + x"CB",x"3A",x"CB",x"3A",x"CB",x"3A",x"CD",x"6D", -- 0x0838 + x"0B",x"CB",x"D4",x"CD",x"0B",x"09",x"2C",x"CD", -- 0x0840 + x"0B",x"09",x"11",x"E0",x"FF",x"19",x"CD",x"0B", -- 0x0848 + x"09",x"2D",x"CD",x"0B",x"09",x"11",x"07",x"00", -- 0x0850 + x"DD",x"19",x"05",x"C2",x"2C",x"08",x"3A",x"2F", -- 0x0858 + x"4C",x"FE",x"12",x"C0",x"11",x"14",x"00",x"CD", -- 0x0860 + x"6D",x"0B",x"CB",x"D4",x"11",x"14",x"00",x"01", -- 0x0868 + x"20",x"00",x"7E",x"FE",x"16",x"28",x"13",x"FE", -- 0x0870 + x"0F",x"20",x"16",x"36",x"18",x"2C",x"14",x"18", -- 0x0878 + x"F1",x"7E",x"FE",x"16",x"28",x"F5",x"FE",x"0F", -- 0x0880 + x"20",x"07",x"36",x"18",x"09",x"1D",x"F2",x"81", -- 0x0888 + x"08",x"DD",x"21",x"71",x"4C",x"3A",x"41",x"4C", -- 0x0890 + x"B7",x"28",x"31",x"47",x"DD",x"5E",x"03",x"DD", -- 0x0898 + x"56",x"02",x"CB",x"3B",x"CB",x"3B",x"CB",x"3B", -- 0x08A0 + x"CB",x"3A",x"CB",x"3A",x"CB",x"3A",x"CD",x"6D", -- 0x08A8 + x"0B",x"CB",x"D4",x"CD",x"12",x"09",x"2C",x"CD", -- 0x08B0 + x"12",x"09",x"11",x"E0",x"FF",x"19",x"CD",x"12", -- 0x08B8 + x"09",x"2D",x"CD",x"12",x"09",x"11",x"07",x"00", -- 0x08C0 + x"DD",x"19",x"10",x"D0",x"DD",x"21",x"8D",x"4C", -- 0x08C8 + x"3A",x"42",x"4C",x"B7",x"CA",x"0A",x"09",x"47", -- 0x08D0 + x"DD",x"5E",x"03",x"DD",x"56",x"02",x"CB",x"3B", -- 0x08D8 + x"CB",x"3B",x"CB",x"3B",x"CB",x"3A",x"CB",x"3A", -- 0x08E0 + x"CB",x"3A",x"CD",x"6D",x"0B",x"CB",x"D4",x"CD", -- 0x08E8 + x"12",x"09",x"2C",x"CD",x"12",x"09",x"11",x"E0", -- 0x08F0 + x"FF",x"19",x"CD",x"12",x"09",x"2D",x"CD",x"12", -- 0x08F8 + x"09",x"11",x"07",x"00",x"DD",x"19",x"05",x"C2", -- 0x0900 + x"D8",x"08",x"C9",x"7E",x"FE",x"0F",x"C0",x"36", -- 0x0908 + x"16",x"C9",x"7E",x"FE",x"18",x"C8",x"36",x"0F", -- 0x0910 + x"C9",x"AF",x"32",x"50",x"4C",x"CD",x"83",x"0B", -- 0x0918 + x"11",x"00",x"00",x"06",x"1C",x"D5",x"C5",x"CD", -- 0x0920 + x"6D",x"0B",x"06",x"10",x"AF",x"36",x"03",x"CB", -- 0x0928 + x"D4",x"77",x"CB",x"94",x"2C",x"10",x"F6",x"C1", -- 0x0930 + x"D1",x"1C",x"10",x"E9",x"CD",x"CB",x"0E",x"3E", -- 0x0938 + x"60",x"32",x"1E",x"4C",x"CD",x"83",x"0B",x"ED", -- 0x0940 + x"5F",x"11",x"00",x"00",x"06",x"1C",x"D5",x"C5", -- 0x0948 + x"F5",x"CD",x"6D",x"0B",x"F1",x"06",x"10",x"CB", -- 0x0950 + x"D4",x"77",x"2C",x"10",x"FA",x"C1",x"D1",x"1C", -- 0x0958 + x"10",x"EC",x"21",x"20",x"46",x"3A",x"1E",x"4C", -- 0x0960 + x"47",x"3E",x"60",x"90",x"1F",x"1F",x"1F",x"E6", -- 0x0968 + x"1F",x"3C",x"47",x"3E",x"01",x"77",x"2C",x"10", -- 0x0970 + x"FC",x"ED",x"4B",x"1E",x"4C",x"3E",x"61",x"91", -- 0x0978 + x"1F",x"1F",x"1F",x"E6",x"1F",x"57",x"1E",x"0C", -- 0x0980 + x"CD",x"6D",x"0B",x"36",x"17",x"CB",x"D4",x"36", -- 0x0988 + x"01",x"11",x"5D",x"70",x"01",x"14",x"01",x"3E", -- 0x0990 + x"02",x"CD",x"D5",x"0B",x"11",x"60",x"60",x"01", -- 0x0998 + x"00",x"01",x"3E",x"01",x"CD",x"D5",x"0B",x"11", -- 0x09A0 + x"5E",x"00",x"ED",x"4B",x"1E",x"4C",x"3E",x"61", -- 0x09A8 + x"91",x"57",x"01",x"18",x"01",x"3E",x"00",x"CD", -- 0x09B0 + x"D5",x"0B",x"3A",x"1E",x"4C",x"3D",x"32",x"1E", -- 0x09B8 + x"4C",x"F5",x"CB",x"3F",x"CB",x"3F",x"32",x"4A", -- 0x09C0 + x"4C",x"F1",x"C2",x"44",x"09",x"11",x"00",x"00", -- 0x09C8 + x"06",x"1C",x"AF",x"D5",x"C5",x"F5",x"CD",x"6D", -- 0x09D0 + x"0B",x"F1",x"06",x"10",x"CB",x"D4",x"77",x"2C", -- 0x09D8 + x"10",x"FA",x"C1",x"D1",x"1C",x"10",x"EC",x"21", -- 0x09E0 + x"20",x"46",x"06",x"0C",x"3E",x"01",x"77",x"2C", -- 0x09E8 + x"10",x"FC",x"06",x"FA",x"CD",x"83",x"0B",x"10", -- 0x09F0 + x"FB",x"C9",x"7D",x"C6",x"06",x"BB",x"D8",x"7B", -- 0x09F8 + x"C6",x"06",x"BD",x"D8",x"7C",x"C6",x"0F",x"BA", -- 0x0A00 + x"D8",x"7A",x"C6",x"0F",x"BC",x"C9",x"00",x"00", -- 0x0A08 + x"01",x"00",x"00",x"00",x"08",x"00",x"00",x"00", -- 0x0A10 + x"00",x"00",x"00",x"00",x"01",x"00",x"00",x"00", -- 0x0A18 + x"00",x"05",x"02",x"00",x"00",x"00",x"E5",x"C5", -- 0x0A20 + x"21",x"12",x"4C",x"01",x"00",x"06",x"1A",x"86", -- 0x0A28 + x"81",x"77",x"0E",x"00",x"FE",x"3A",x"38",x"04", -- 0x0A30 + x"D6",x"0A",x"77",x"0C",x"2B",x"13",x"10",x"EE", -- 0x0A38 + x"21",x"0D",x"4C",x"11",x"14",x"4C",x"06",x"06", -- 0x0A40 + x"1A",x"BE",x"28",x"0E",x"30",x"10",x"21",x"0D", -- 0x0A48 + x"4C",x"11",x"14",x"4C",x"01",x"06",x"00",x"EF", -- 0x0A50 + x"18",x"04",x"23",x"13",x"10",x"EA",x"CD",x"AE", -- 0x0A58 + x"0E",x"C1",x"E1",x"C9",x"CD",x"83",x"0B",x"3A", -- 0x0A60 + x"40",x"50",x"E6",x"20",x"20",x"F6",x"C9",x"CD", -- 0x0A68 + x"83",x"0B",x"3A",x"40",x"50",x"E6",x"20",x"28", -- 0x0A70 + x"F6",x"C9",x"D5",x"CD",x"0F",x"0C",x"D1",x"FE", -- 0x0A78 + x"18",x"D8",x"FE",x"20",x"DA",x"10",x"0B",x"FE", -- 0x0A80 + x"30",x"D8",x"FE",x"40",x"DA",x"10",x"0B",x"FE", -- 0x0A88 + x"FE",x"D2",x"16",x"0B",x"FE",x"DE",x"38",x"05", -- 0x0A90 + x"FE",x"E0",x"DA",x"16",x"0B",x"FE",x"44",x"28", -- 0x0A98 + x"42",x"FE",x"45",x"28",x"3E",x"FE",x"46",x"C0", -- 0x0AA0 + x"36",x"47",x"7B",x"FE",x"11",x"38",x"23",x"3A", -- 0x0AA8 + x"8D",x"4C",x"C6",x"08",x"32",x"8D",x"4C",x"3E", -- 0x0AB0 + x"04",x"32",x"93",x"4C",x"E5",x"D5",x"21",x"E2", -- 0x0AB8 + x"41",x"AF",x"77",x"11",x"E0",x"FF",x"19",x"77", -- 0x0AC0 + x"CB",x"D4",x"77",x"AF",x"ED",x"52",x"77",x"D1", -- 0x0AC8 + x"E1",x"C9",x"E5",x"D5",x"21",x"AB",x"41",x"AF", -- 0x0AD0 + x"77",x"2C",x"77",x"CB",x"D4",x"77",x"2D",x"77", -- 0x0AD8 + x"D1",x"E1",x"C9",x"36",x"03",x"CB",x"D4",x"3A", -- 0x0AE0 + x"36",x"4C",x"77",x"3A",x"3C",x"4C",x"3D",x"32", -- 0x0AE8 + x"3C",x"4C",x"D5",x"11",x"1A",x"0A",x"CD",x"26", -- 0x0AF0 + x"0A",x"D1",x"3E",x"02",x"32",x"4F",x"4C",x"3A", -- 0x0AF8 + x"2F",x"4C",x"FE",x"04",x"C0",x"3A",x"3C",x"4C", -- 0x0B00 + x"B7",x"C0",x"3E",x"01",x"32",x"93",x"4C",x"C9", -- 0x0B08 + x"3E",x"02",x"32",x"2B",x"4C",x"C9",x"3A",x"3C", -- 0x0B10 + x"4C",x"B7",x"C0",x"D5",x"3A",x"29",x"4C",x"C6", -- 0x0B18 + x"05",x"1F",x"1F",x"1F",x"E6",x"1F",x"5F",x"3A", -- 0x0B20 + x"1E",x"4C",x"C6",x"08",x"57",x"CD",x"0F",x"0C", -- 0x0B28 + x"D1",x"E6",x"DE",x"FE",x"DE",x"C0",x"3E",x"01", -- 0x0B30 + x"32",x"2B",x"4C",x"C9",x"3A",x"39",x"4C",x"B7", -- 0x0B38 + x"28",x"25",x"3D",x"32",x"39",x"4C",x"1F",x"1F", -- 0x0B40 + x"1F",x"E6",x"1F",x"C6",x"04",x"5F",x"16",x"11", -- 0x0B48 + x"CD",x"6D",x"0B",x"3A",x"39",x"4C",x"E6",x"07", -- 0x0B50 + x"C6",x"60",x"77",x"E6",x"07",x"FE",x"07",x"C0", -- 0x0B58 + x"11",x"E0",x"FF",x"19",x"36",x"A0",x"C9",x"21", -- 0x0B60 + x"31",x"43",x"36",x"A0",x"C9",x"7A",x"C6",x"A0", -- 0x0B68 + x"6F",x"26",x"43",x"7B",x"11",x"E0",x"FF",x"B7", -- 0x0B70 + x"C8",x"1F",x"30",x"01",x"19",x"EB",x"29",x"EB", -- 0x0B78 + x"C3",x"77",x"0B",x"E5",x"2A",x"00",x"4C",x"AF", -- 0x0B80 + x"32",x"C0",x"50",x"3A",x"00",x"4C",x"BD",x"28", -- 0x0B88 + x"F6",x"E1",x"C9",x"7E",x"23",x"B7",x"C8",x"C6", -- 0x0B90 + x"80",x"12",x"CB",x"D2",x"79",x"12",x"7B",x"D6", -- 0x0B98 + x"20",x"5F",x"CB",x"92",x"7A",x"DE",x"00",x"57", -- 0x0BA0 + x"C3",x"93",x"0B",x"7C",x"CD",x"B0",x"0B",x"7D", -- 0x0BA8 + x"F5",x"1F",x"1F",x"1F",x"1F",x"CD",x"B9",x"0B", -- 0x0BB0 + x"F1",x"E6",x"0F",x"FE",x"0A",x"38",x"02",x"C6", -- 0x0BB8 + x"07",x"C6",x"B0",x"E5",x"D5",x"F5",x"CD",x"6D", -- 0x0BC0 + x"0B",x"F1",x"77",x"CB",x"D4",x"36",x"12",x"CB", -- 0x0BC8 + x"94",x"D1",x"1C",x"E1",x"C9",x"F5",x"3E",x"F0", -- 0x0BD0 + x"BA",x"20",x"03",x"BB",x"28",x"2C",x"F1",x"3C", -- 0x0BD8 + x"D5",x"ED",x"5B",x"1C",x"4C",x"BB",x"38",x"03", -- 0x0BE0 + x"32",x"1C",x"4C",x"E6",x"07",x"87",x"5F",x"16", -- 0x0BE8 + x"00",x"21",x"51",x"4C",x"19",x"D1",x"71",x"23", -- 0x0BF0 + x"70",x"23",x"D5",x"11",x"0E",x"00",x"19",x"D1", -- 0x0BF8 + x"3E",x"EE",x"93",x"77",x"23",x"3E",x"00",x"92", -- 0x0C00 + x"77",x"C9",x"F1",x"3C",x"D5",x"18",x"DC",x"7A", -- 0x0C08 + x"1F",x"1F",x"1F",x"E6",x"1F",x"57",x"CD",x"6D", -- 0x0C10 + x"0B",x"7E",x"C9",x"CD",x"0F",x"0C",x"FE",x"05", -- 0x0C18 + x"38",x"14",x"FE",x"18",x"38",x"12",x"FE",x"20", -- 0x0C20 + x"38",x"0C",x"FE",x"30",x"38",x"0A",x"FE",x"48", -- 0x0C28 + x"38",x"04",x"FE",x"A0",x"38",x"02",x"AF",x"C9", -- 0x0C30 + x"B7",x"C9",x"CD",x"0F",x"0C",x"FE",x"20",x"38", -- 0x0C38 + x"04",x"FE",x"30",x"38",x"02",x"AF",x"C9",x"3E", -- 0x0C40 + x"01",x"B7",x"C9",x"CD",x"0F",x"0C",x"FE",x"48", -- 0x0C48 + x"38",x"04",x"FE",x"60",x"38",x"02",x"AF",x"C9", -- 0x0C50 + x"3E",x"01",x"B7",x"C9",x"32",x"36",x"4C",x"F5", -- 0x0C58 + x"AF",x"32",x"50",x"4C",x"CD",x"83",x"0B",x"F1", -- 0x0C60 + x"F3",x"E5",x"D5",x"C5",x"F5",x"21",x"00",x"40", -- 0x0C68 + x"11",x"01",x"40",x"01",x"00",x"04",x"36",x"03", -- 0x0C70 + x"ED",x"B0",x"01",x"40",x"00",x"36",x"00",x"ED", -- 0x0C78 + x"B0",x"01",x"80",x"03",x"77",x"ED",x"B0",x"36", -- 0x0C80 + x"00",x"01",x"3F",x"00",x"ED",x"B0",x"FB",x"CD", -- 0x0C88 + x"83",x"0B",x"F3",x"11",x"00",x"10",x"06",x"10", -- 0x0C90 + x"D5",x"C5",x"CD",x"6D",x"0B",x"11",x"E0",x"FF", -- 0x0C98 + x"CB",x"D4",x"06",x"20",x"36",x"00",x"19",x"10", -- 0x0CA0 + x"FB",x"C1",x"D1",x"14",x"10",x"EA",x"CD",x"69", -- 0x0CA8 + x"12",x"F1",x"C1",x"D1",x"E1",x"FB",x"C9",x"3A", -- 0x0CB0 + x"3C",x"4C",x"B7",x"C0",x"ED",x"5F",x"21",x"D8", -- 0x0CB8 + x"0C",x"E6",x"03",x"5F",x"16",x"00",x"19",x"7E", -- 0x0CC0 + x"2A",x"3F",x"4C",x"CB",x"D4",x"77",x"2C",x"77", -- 0x0CC8 + x"11",x"E0",x"FF",x"19",x"77",x"2D",x"77",x"C9", -- 0x0CD0 + x"09",x"11",x"14",x"17",x"C9",x"DD",x"2A",x"37", -- 0x0CD8 + x"4C",x"DD",x"7E",x"02",x"B7",x"C8",x"47",x"DD", -- 0x0CE0 + x"5E",x"00",x"DD",x"56",x"01",x"CD",x"6D",x"0B", -- 0x0CE8 + x"DD",x"7E",x"05",x"32",x"2C",x"4C",x"FE",x"00", -- 0x0CF0 + x"3A",x"30",x"4C",x"28",x"01",x"2F",x"E6",x"07", -- 0x0CF8 + x"DD",x"86",x"03",x"DD",x"4E",x"04",x"C3",x"09", -- 0x0D00 + x"0D",x"11",x"E0",x"FF",x"18",x"03",x"11",x"01", -- 0x0D08 + x"00",x"77",x"CB",x"D4",x"71",x"CB",x"94",x"19", -- 0x0D10 + x"10",x"F7",x"C9",x"6F",x"26",x"00",x"29",x"11", -- 0x0D18 + x"84",x"17",x"19",x"5E",x"23",x"56",x"D5",x"DD", -- 0x0D20 + x"E1",x"DD",x"7E",x"00",x"DD",x"23",x"CD",x"5C", -- 0x0D28 + x"0C",x"DD",x"5E",x"00",x"DD",x"56",x"01",x"CD", -- 0x0D30 + x"6D",x"0B",x"DD",x"7E",x"02",x"B7",x"28",x"1C", -- 0x0D38 + x"47",x"CB",x"B8",x"E6",x"80",x"DD",x"7E",x"03", -- 0x0D40 + x"DD",x"4E",x"04",x"11",x"05",x"00",x"DD",x"19", -- 0x0D48 + x"28",x"05",x"CD",x"0E",x"0D",x"18",x"DA",x"CD", -- 0x0D50 + x"09",x"0D",x"18",x"D5",x"22",x"3F",x"4C",x"36", -- 0x0D58 + x"DE",x"2C",x"36",x"FE",x"CB",x"D4",x"36",x"09", -- 0x0D60 + x"2D",x"36",x"09",x"CB",x"94",x"11",x"E0",x"FF", -- 0x0D68 + x"19",x"36",x"DF",x"2C",x"36",x"FF",x"CB",x"D4", -- 0x0D70 + x"36",x"09",x"2D",x"36",x"09",x"DD",x"7E",x"03", -- 0x0D78 + x"DD",x"4E",x"04",x"DD",x"46",x"05",x"11",x"06", -- 0x0D80 + x"00",x"DD",x"19",x"B7",x"28",x"16",x"F5",x"DD", -- 0x0D88 + x"5E",x"00",x"DD",x"56",x"01",x"DD",x"23",x"DD", -- 0x0D90 + x"23",x"CD",x"6D",x"0B",x"71",x"CB",x"D4",x"70", -- 0x0D98 + x"F1",x"3D",x"20",x"EA",x"DD",x"7E",x"00",x"DD", -- 0x0DA0 + x"4E",x"01",x"DD",x"46",x"02",x"11",x"03",x"00", -- 0x0DA8 + x"DD",x"19",x"B7",x"28",x"16",x"F5",x"DD",x"5E", -- 0x0DB0 + x"00",x"DD",x"56",x"01",x"DD",x"23",x"DD",x"23", -- 0x0DB8 + x"CD",x"6D",x"0B",x"71",x"CB",x"D4",x"70",x"F1", -- 0x0DC0 + x"3D",x"20",x"EA",x"21",x"B0",x"43",x"11",x"E0", -- 0x0DC8 + x"FF",x"06",x"1C",x"36",x"A0",x"CB",x"D4",x"36", -- 0x0DD0 + x"09",x"CB",x"94",x"19",x"10",x"F5",x"DD",x"5E", -- 0x0DD8 + x"00",x"DD",x"23",x"16",x"10",x"CD",x"6D",x"0B", -- 0x0DE0 + x"EB",x"DD",x"E5",x"E1",x"0E",x"09",x"CD",x"93", -- 0x0DE8 + x"0B",x"22",x"37",x"4C",x"11",x"06",x"00",x"19", -- 0x0DF0 + x"7E",x"32",x"1D",x"4C",x"FE",x"10",x"07",x"17", -- 0x0DF8 + x"E6",x"02",x"32",x"1F",x"4C",x"23",x"7E",x"87", -- 0x0E00 + x"87",x"87",x"32",x"1E",x"4C",x"23",x"3E",x"01", -- 0x0E08 + x"32",x"20",x"4C",x"AF",x"32",x"24",x"4C",x"32", -- 0x0E10 + x"22",x"4C",x"3E",x"FF",x"32",x"25",x"4C",x"22", -- 0x0E18 + x"3D",x"4C",x"7E",x"47",x"32",x"3C",x"4C",x"23", -- 0x0E20 + x"7E",x"32",x"3A",x"4C",x"23",x"7E",x"32",x"3B", -- 0x0E28 + x"4C",x"23",x"5E",x"23",x"56",x"23",x"E5",x"CD", -- 0x0E30 + x"6D",x"0B",x"3A",x"3A",x"4C",x"77",x"CB",x"D4", -- 0x0E38 + x"3A",x"3B",x"4C",x"77",x"E1",x"10",x"EB",x"7E", -- 0x0E40 + x"23",x"47",x"1F",x"1F",x"1F",x"1F",x"E6",x"07", -- 0x0E48 + x"32",x"41",x"4C",x"78",x"E6",x"07",x"32",x"42", -- 0x0E50 + x"4C",x"3A",x"41",x"4C",x"06",x"00",x"4F",x"87", -- 0x0E58 + x"81",x"87",x"81",x"4F",x"28",x"04",x"11",x"71", -- 0x0E60 + x"4C",x"EF",x"3A",x"42",x"4C",x"06",x"00",x"4F", -- 0x0E68 + x"87",x"81",x"87",x"81",x"4F",x"28",x"04",x"11", -- 0x0E70 + x"8D",x"4C",x"EF",x"21",x"1F",x"28",x"11",x"B1", -- 0x0E78 + x"43",x"0E",x"01",x"CD",x"93",x"0B",x"0E",x"05", -- 0x0E80 + x"CD",x"93",x"0B",x"3E",x"BF",x"32",x"39",x"4C", -- 0x0E88 + x"11",x"00",x"14",x"CD",x"6D",x"0B",x"3A",x"27", -- 0x0E90 + x"4C",x"47",x"11",x"C0",x"FF",x"36",x"DB",x"CB", -- 0x0E98 + x"D4",x"36",x"01",x"2C",x"36",x"01",x"CB",x"94", -- 0x0EA0 + x"36",x"FB",x"2D",x"19",x"10",x"EF",x"21",x"3D", -- 0x0EA8 + x"28",x"11",x"B3",x"43",x"0E",x"19",x"CD",x"93", -- 0x0EB0 + x"0B",x"21",x"14",x"4C",x"CD",x"93",x"0B",x"21", -- 0x0EB8 + x"46",x"28",x"CD",x"93",x"0B",x"21",x"0D",x"4C", -- 0x0EC0 + x"C3",x"93",x"0B",x"06",x"08",x"11",x"F0",x"F0", -- 0x0EC8 + x"3E",x"08",x"90",x"CD",x"D5",x"0B",x"10",x"F5", -- 0x0ED0 + x"C9",x"E5",x"CD",x"6D",x"0B",x"EB",x"E1",x"E5", -- 0x0ED8 + x"D5",x"C5",x"7D",x"2C",x"12",x"CB",x"D2",x"7C", -- 0x0EE0 + x"12",x"CB",x"92",x"3E",x"E0",x"83",x"5F",x"7A", -- 0x0EE8 + x"CE",x"FF",x"57",x"0D",x"20",x"EC",x"C1",x"D1", -- 0x0EF0 + x"E1",x"13",x"7D",x"C6",x"20",x"6F",x"10",x"DF", -- 0x0EF8 + x"C9",x"E5",x"CD",x"6D",x"0B",x"EB",x"E1",x"E5", -- 0x0F00 + x"D5",x"C5",x"7D",x"12",x"CB",x"D2",x"7C",x"12", -- 0x0F08 + x"CB",x"92",x"3E",x"E0",x"83",x"5F",x"7A",x"CE", -- 0x0F10 + x"FF",x"57",x"0D",x"20",x"ED",x"C1",x"D1",x"E1", -- 0x0F18 + x"13",x"10",x"E4",x"C9",x"AF",x"CD",x"5C",x"0C", -- 0x0F20 + x"21",x"50",x"0F",x"16",x"04",x"0E",x"17",x"1E", -- 0x0F28 + x"00",x"06",x"1B",x"7E",x"23",x"E6",x"01",x"28", -- 0x0F30 + x"0D",x"E5",x"D5",x"CD",x"6D",x"0B",x"36",x"A0", -- 0x0F38 + x"CB",x"D4",x"36",x"09",x"D1",x"E1",x"1C",x"10", -- 0x0F40 + x"EA",x"14",x"0D",x"20",x"E2",x"C3",x"CB",x"0E", -- 0x0F48 + x"30",x"30",x"30",x"30",x"30",x"31",x"31",x"31", -- 0x0F50 + x"31",x"30",x"30",x"30",x"31",x"31",x"31",x"30", -- 0x0F58 + x"30",x"30",x"31",x"31",x"31",x"30",x"30",x"30", -- 0x0F60 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0F68 + x"31",x"30",x"30",x"30",x"31",x"30",x"31",x"30", -- 0x0F70 + x"30",x"30",x"31",x"30",x"31",x"30",x"30",x"30", -- 0x0F78 + x"31",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0F80 + x"30",x"30",x"30",x"31",x"31",x"31",x"31",x"30", -- 0x0F88 + x"30",x"31",x"31",x"31",x"31",x"31",x"30",x"31", -- 0x0F90 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0F98 + x"30",x"30",x"30",x"30",x"30",x"30",x"31",x"30", -- 0x0FA0 + x"30",x"30",x"30",x"30",x"31",x"30",x"30",x"30", -- 0x0FA8 + x"31",x"30",x"31",x"30",x"30",x"30",x"31",x"30", -- 0x0FB0 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0FB8 + x"30",x"31",x"30",x"30",x"30",x"30",x"30",x"31", -- 0x0FC0 + x"30",x"30",x"30",x"31",x"30",x"30",x"31",x"31", -- 0x0FC8 + x"31",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0FD0 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0FD8 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0FE0 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0FE8 + x"30",x"30",x"31",x"30",x"30",x"30",x"31",x"30", -- 0x0FF0 + x"30",x"31",x"31",x"31",x"30",x"30",x"31",x"30", -- 0x0FF8 + x"30",x"30",x"31",x"30",x"31",x"31",x"31",x"30", -- 0x1000 + x"30",x"31",x"31",x"31",x"30",x"31",x"31",x"30", -- 0x1008 + x"31",x"31",x"30",x"31",x"30",x"30",x"30",x"31", -- 0x1010 + x"30",x"31",x"31",x"30",x"30",x"31",x"30",x"30", -- 0x1018 + x"31",x"30",x"30",x"31",x"30",x"30",x"30",x"31", -- 0x1020 + x"31",x"30",x"31",x"30",x"31",x"30",x"31",x"31", -- 0x1028 + x"31",x"31",x"31",x"30",x"31",x"30",x"31",x"30", -- 0x1030 + x"31",x"30",x"30",x"31",x"30",x"30",x"31",x"30", -- 0x1038 + x"30",x"30",x"30",x"31",x"30",x"30",x"30",x"31", -- 0x1040 + x"30",x"31",x"30",x"30",x"30",x"31",x"30",x"31", -- 0x1048 + x"30",x"30",x"31",x"31",x"30",x"30",x"31",x"30", -- 0x1050 + x"30",x"31",x"30",x"30",x"30",x"31",x"31",x"30", -- 0x1058 + x"30",x"30",x"31",x"30",x"31",x"30",x"30",x"30", -- 0x1060 + x"31",x"30",x"31",x"30",x"30",x"30",x"31",x"30", -- 0x1068 + x"31",x"31",x"31",x"30",x"30",x"31",x"31",x"31", -- 0x1070 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1078 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1080 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1088 + x"30",x"30",x"30",x"30",x"31",x"30",x"30",x"30", -- 0x1090 + x"31",x"30",x"31",x"31",x"31",x"30",x"31",x"30", -- 0x1098 + x"30",x"30",x"31",x"30",x"31",x"31",x"31",x"31", -- 0x10A0 + x"31",x"30",x"31",x"31",x"31",x"31",x"30",x"31", -- 0x10A8 + x"31",x"30",x"31",x"31",x"30",x"30",x"31",x"30", -- 0x10B0 + x"30",x"31",x"31",x"30",x"30",x"31",x"30",x"31", -- 0x10B8 + x"30",x"30",x"30",x"30",x"30",x"31",x"30",x"30", -- 0x10C0 + x"30",x"31",x"31",x"30",x"31",x"30",x"31",x"30", -- 0x10C8 + x"30",x"31",x"30",x"30",x"31",x"30",x"31",x"30", -- 0x10D0 + x"31",x"30",x"31",x"31",x"30",x"30",x"30",x"30", -- 0x10D8 + x"31",x"31",x"31",x"31",x"30",x"31",x"30",x"30", -- 0x10E0 + x"30",x"31",x"30",x"30",x"31",x"30",x"30",x"31", -- 0x10E8 + x"30",x"30",x"31",x"31",x"30",x"31",x"30",x"30", -- 0x10F0 + x"30",x"30",x"30",x"31",x"30",x"30",x"31",x"30", -- 0x10F8 + x"31",x"30",x"30",x"30",x"31",x"30",x"31",x"31", -- 0x1100 + x"31",x"30",x"31",x"30",x"30",x"30",x"31",x"30", -- 0x1108 + x"31",x"31",x"31",x"31",x"31",x"30",x"31",x"30", -- 0x1110 + x"30",x"30",x"31",x"30",x"30",x"30",x"30",x"30", -- 0x1118 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1120 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1128 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1130 + x"30",x"30",x"30",x"31",x"30",x"30",x"30",x"31", -- 0x1138 + x"30",x"30",x"31",x"31",x"31",x"30",x"30",x"31", -- 0x1140 + x"30",x"30",x"30",x"31",x"30",x"30",x"30",x"30", -- 0x1148 + x"30",x"30",x"30",x"30",x"30",x"30",x"31",x"31", -- 0x1150 + x"30",x"31",x"31",x"30",x"31",x"30",x"30",x"30", -- 0x1158 + x"31",x"30",x"31",x"31",x"30",x"30",x"31",x"30", -- 0x1160 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1168 + x"30",x"31",x"30",x"31",x"30",x"31",x"30",x"31", -- 0x1170 + x"31",x"31",x"31",x"31",x"30",x"31",x"30",x"31", -- 0x1178 + x"30",x"31",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1180 + x"30",x"30",x"30",x"30",x"31",x"30",x"30",x"30", -- 0x1188 + x"31",x"30",x"31",x"30",x"30",x"30",x"31",x"30", -- 0x1190 + x"31",x"30",x"30",x"31",x"31",x"30",x"30",x"30", -- 0x1198 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"31", -- 0x11A0 + x"30",x"30",x"30",x"31",x"30",x"31",x"30",x"30", -- 0x11A8 + x"30",x"31",x"30",x"31",x"30",x"30",x"30",x"31", -- 0x11B0 + x"30",x"30",x"30",x"30",x"30",x"20",x"20",x"20", -- 0x11B8 + x"20",x"50",x"72",x"65",x"73",x"73",x"20",x"53", -- 0x11C0 + x"74",x"61",x"72",x"74",x"20",x"54",x"6F",x"20", -- 0x11C8 + x"50",x"6C",x"61",x"79",x"20",x"20",x"20",x"20", -- 0x11D0 + x"00",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x11D8 + x"20",x"49",x"6E",x"73",x"65",x"72",x"74",x"20", -- 0x11E0 + x"43",x"6F",x"69",x"6E",x"20",x"20",x"20",x"20", -- 0x11E8 + x"20",x"20",x"20",x"20",x"00",x"1E",x"00",x"D6", -- 0x11F0 + x"0A",x"38",x"03",x"1C",x"18",x"F9",x"C6",x"0A", -- 0x11F8 + x"C9",x"3A",x"0A",x"4C",x"B7",x"C0",x"3A",x"00", -- 0x1200 + x"50",x"32",x"04",x"4C",x"2F",x"5F",x"3A",x"06", -- 0x1208 + x"4C",x"57",x"2F",x"A3",x"32",x"07",x"4C",x"7B", -- 0x1210 + x"32",x"06",x"4C",x"3A",x"40",x"50",x"32",x"05", -- 0x1218 + x"4C",x"2F",x"5F",x"3A",x"08",x"4C",x"57",x"2F", -- 0x1220 + x"A3",x"32",x"09",x"4C",x"7B",x"32",x"08",x"4C", -- 0x1228 + x"3A",x"09",x"4C",x"E6",x"01",x"28",x"08",x"3A", -- 0x1230 + x"4C",x"4C",x"EE",x"0F",x"32",x"4C",x"4C",x"3A", -- 0x1238 + x"09",x"4C",x"E6",x"08",x"28",x"08",x"3A",x"4D", -- 0x1240 + x"4C",x"EE",x"0F",x"32",x"4D",x"4C",x"3A",x"07", -- 0x1248 + x"4C",x"E6",x"20",x"28",x"13",x"3A",x"0B",x"4C", -- 0x1250 + x"FE",x"63",x"28",x"0C",x"3C",x"32",x"0B",x"4C", -- 0x1258 + x"CD",x"69",x"12",x"3E",x"01",x"32",x"0C",x"4C", -- 0x1260 + x"C9",x"11",x"99",x"12",x"21",x"FD",x"43",x"1A", -- 0x1268 + x"13",x"B7",x"28",x"0C",x"C6",x"80",x"77",x"CB", -- 0x1270 + x"D4",x"36",x"19",x"CB",x"94",x"2D",x"18",x"EF", -- 0x1278 + x"3A",x"0B",x"4C",x"CD",x"F5",x"11",x"57",x"7B", -- 0x1280 + x"C6",x"B0",x"77",x"CB",x"D4",x"36",x"19",x"2D", -- 0x1288 + x"36",x"19",x"CB",x"94",x"7A",x"C6",x"B0",x"77", -- 0x1290 + x"C9",x"43",x"72",x"65",x"64",x"69",x"74",x"73", -- 0x1298 + x"20",x"00",x"32",x"47",x"4C",x"AF",x"32",x"46", -- 0x12A0 + x"4C",x"3E",x"01",x"32",x"4B",x"4C",x"C9",x"CD", -- 0x12A8 + x"01",x"12",x"3A",x"47",x"4C",x"B7",x"CA",x"A1", -- 0x12B0 + x"13",x"3A",x"4B",x"4C",x"D6",x"04",x"32",x"4B", -- 0x12B8 + x"4C",x"D2",x"10",x"13",x"3A",x"47",x"4C",x"87", -- 0x12C0 + x"5F",x"16",x"00",x"21",x"4F",x"14",x"19",x"5E", -- 0x12C8 + x"23",x"56",x"EB",x"3A",x"46",x"4C",x"5F",x"3C", -- 0x12D0 + x"32",x"46",x"4C",x"16",x"00",x"19",x"19",x"19", -- 0x12D8 + x"7E",x"FE",x"FF",x"CA",x"A1",x"13",x"B7",x"20", -- 0x12E0 + x"14",x"3C",x"32",x"46",x"4C",x"3A",x"47",x"4C", -- 0x12E8 + x"87",x"5F",x"16",x"00",x"21",x"4F",x"14",x"19", -- 0x12F0 + x"5E",x"23",x"56",x"EB",x"7E",x"32",x"4B",x"4C", -- 0x12F8 + x"23",x"7E",x"CD",x"FD",x"13",x"32",x"48",x"4C", -- 0x1300 + x"23",x"7E",x"CD",x"FD",x"13",x"32",x"49",x"4C", -- 0x1308 + x"3A",x"24",x"4C",x"B7",x"28",x"16",x"3A",x"2A", -- 0x1310 + x"4C",x"3C",x"32",x"2A",x"4C",x"1F",x"1F",x"E6", -- 0x1318 + x"3F",x"5F",x"16",x"00",x"21",x"AE",x"13",x"19", -- 0x1320 + x"7E",x"32",x"4A",x"4C",x"3A",x"4F",x"4C",x"B7", -- 0x1328 + x"28",x"10",x"C6",x"02",x"32",x"4F",x"4C",x"32", -- 0x1330 + x"4A",x"4C",x"FE",x"40",x"38",x"04",x"AF",x"32", -- 0x1338 + x"4F",x"4C",x"3A",x"0C",x"4C",x"B7",x"28",x"10", -- 0x1340 + x"C6",x"01",x"32",x"0C",x"4C",x"32",x"4A",x"4C", -- 0x1348 + x"FE",x"20",x"38",x"04",x"AF",x"32",x"0C",x"4C", -- 0x1350 + x"3A",x"4E",x"4C",x"B7",x"28",x"08",x"D6",x"04", -- 0x1358 + x"32",x"4E",x"4C",x"32",x"4A",x"4C",x"DD",x"21", -- 0x1360 + x"45",x"50",x"DD",x"36",x"00",x"01",x"ED",x"4B", -- 0x1368 + x"4C",x"4C",x"3A",x"48",x"4C",x"CD",x"16",x"14", -- 0x1370 + x"DD",x"21",x"4A",x"50",x"DD",x"36",x"00",x"03", -- 0x1378 + x"ED",x"4B",x"4C",x"4C",x"3A",x"49",x"4C",x"CD", -- 0x1380 + x"16",x"14",x"DD",x"21",x"4F",x"50",x"DD",x"36", -- 0x1388 + x"00",x"01",x"ED",x"4B",x"4D",x"4C",x"3A",x"4A", -- 0x1390 + x"4C",x"CD",x"16",x"14",x"AF",x"32",x"4A",x"4C", -- 0x1398 + x"C9",x"AF",x"32",x"48",x"4C",x"32",x"49",x"4C", -- 0x13A0 + x"32",x"47",x"4C",x"C3",x"10",x"13",x"04",x"09", -- 0x13A8 + x"0B",x"0D",x"0F",x"11",x"13",x"15",x"16",x"15", -- 0x13B0 + x"13",x"11",x"0F",x"0D",x"0B",x"09",x"09",x"08", -- 0x13B8 + x"08",x"07",x"07",x"06",x"06",x"05",x"05",x"04", -- 0x13C0 + x"04",x"04",x"03",x"03",x"03",x"03",x"02",x"02", -- 0x13C8 + x"02",x"02",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x13D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13F0 + x"00",x"00",x"00",x"00",x"00",x"FE",x"FF",x"C8", -- 0x13F8 + x"B7",x"C8",x"E5",x"D5",x"5F",x"21",x"44",x"16", -- 0x1400 + x"16",x"00",x"BE",x"28",x"05",x"23",x"23",x"14", -- 0x1408 + x"18",x"F8",x"7A",x"D1",x"E1",x"C9",x"E5",x"D5", -- 0x1410 + x"B7",x"28",x"2D",x"87",x"5F",x"16",x"00",x"21", -- 0x1418 + x"AC",x"16",x"19",x"5E",x"23",x"56",x"7B",x"DD", -- 0x1420 + x"77",x"0C",x"1F",x"1F",x"1F",x"1F",x"DD",x"77", -- 0x1428 + x"0D",x"7A",x"DD",x"77",x"0E",x"1F",x"1F",x"1F", -- 0x1430 + x"1F",x"DD",x"77",x"0F",x"79",x"DD",x"77",x"10", -- 0x1438 + x"3E",x"01",x"32",x"01",x"50",x"D1",x"E1",x"C9", -- 0x1440 + x"DD",x"36",x"10",x"00",x"D1",x"E1",x"C9",x"00", -- 0x1448 + x"00",x"55",x"14",x"81",x"15",x"50",x"80",x"80", -- 0x1450 + x"50",x"66",x"66",x"50",x"56",x"56",x"32",x"56", -- 0x1458 + x"56",x"32",x"AB",x"CB",x"32",x"2B",x"33",x"32", -- 0x1460 + x"2B",x"33",x"32",x"AB",x"CB",x"32",x"33",x"40", -- 0x1468 + x"32",x"33",x"40",x"32",x"AB",x"CB",x"32",x"80", -- 0x1470 + x"80",x"32",x"80",x"80",x"32",x"66",x"66",x"32", -- 0x1478 + x"56",x"56",x"32",x"60",x"56",x"32",x"AB",x"C0", -- 0x1480 + x"32",x"2B",x"30",x"32",x"2B",x"30",x"32",x"AB", -- 0x1488 + x"C0",x"32",x"30",x"44",x"32",x"30",x"44",x"32", -- 0x1490 + x"AB",x"C0",x"32",x"88",x"88",x"32",x"88",x"88", -- 0x1498 + x"32",x"72",x"72",x"32",x"4C",x"4C",x"32",x"4C", -- 0x14A0 + x"4C",x"32",x"AB",x"C0",x"32",x"26",x"30",x"32", -- 0x14A8 + x"26",x"30",x"32",x"AB",x"C0",x"32",x"30",x"44", -- 0x14B0 + x"32",x"30",x"44",x"32",x"AB",x"C0",x"32",x"88", -- 0x14B8 + x"88",x"32",x"88",x"88",x"32",x"72",x"72",x"32", -- 0x14C0 + x"4C",x"4C",x"32",x"4C",x"4C",x"32",x"AB",x"CB", -- 0x14C8 + x"32",x"26",x"33",x"32",x"26",x"33",x"32",x"AB", -- 0x14D0 + x"CB",x"32",x"33",x"40",x"32",x"33",x"40",x"32", -- 0x14D8 + x"AB",x"CB",x"32",x"80",x"80",x"32",x"80",x"80", -- 0x14E0 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"40", -- 0x14E8 + x"40",x"32",x"80",x"AB",x"32",x"20",x"2B",x"32", -- 0x14F0 + x"20",x"2B",x"32",x"80",x"AB",x"32",x"2B",x"33", -- 0x14F8 + x"32",x"2B",x"33",x"32",x"80",x"AB",x"32",x"80", -- 0x1500 + x"80",x"32",x"80",x"80",x"32",x"66",x"66",x"32", -- 0x1508 + x"56",x"56",x"32",x"40",x"40",x"32",x"80",x"98", -- 0x1510 + x"32",x"20",x"26",x"32",x"20",x"26",x"32",x"80", -- 0x1518 + x"98",x"32",x"26",x"30",x"32",x"26",x"30",x"32", -- 0x1520 + x"00",x"00",x"32",x"72",x"72",x"32",x"72",x"72", -- 0x1528 + x"32",x"60",x"60",x"32",x"4C",x"4C",x"32",x"4C", -- 0x1530 + x"98",x"32",x"4C",x"4C",x"32",x"4C",x"4C",x"32", -- 0x1538 + x"4C",x"98",x"32",x"5B",x"5B",x"32",x"56",x"56", -- 0x1540 + x"32",x"33",x"CB",x"32",x"33",x"33",x"32",x"33", -- 0x1548 + x"33",x"32",x"33",x"CB",x"32",x"40",x"40",x"32", -- 0x1550 + x"66",x"66",x"64",x"66",x"66",x"32",x"72",x"72", -- 0x1558 + x"64",x"4C",x"4C",x"32",x"56",x"56",x"32",x"80", -- 0x1560 + x"CB",x"19",x"80",x"00",x"19",x"80",x"80",x"32", -- 0x1568 + x"80",x"CB",x"FA",x"00",x"00",x"FA",x"00",x"00", -- 0x1570 + x"FA",x"00",x"00",x"FA",x"00",x"00",x"00",x"00", -- 0x1578 + x"00",x"32",x"80",x"80",x"32",x"72",x"72",x"32", -- 0x1580 + x"66",x"66",x"32",x"60",x"60",x"32",x"56",x"56", -- 0x1588 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"56", -- 0x1590 + x"56",x"32",x"51",x"51",x"32",x"60",x"60",x"32", -- 0x1598 + x"51",x"51",x"32",x"51",x"51",x"32",x"56",x"56", -- 0x15A0 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"56", -- 0x15A8 + x"56",x"32",x"80",x"80",x"32",x"72",x"72",x"32", -- 0x15B0 + x"66",x"66",x"32",x"60",x"60",x"32",x"56",x"56", -- 0x15B8 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"56", -- 0x15C0 + x"56",x"32",x"51",x"51",x"32",x"60",x"60",x"32", -- 0x15C8 + x"51",x"51",x"32",x"51",x"51",x"32",x"56",x"56", -- 0x15D0 + x"32",x"56",x"56",x"32",x"56",x"56",x"32",x"56", -- 0x15D8 + x"56",x"32",x"80",x"80",x"32",x"72",x"72",x"32", -- 0x15E0 + x"66",x"66",x"32",x"60",x"60",x"32",x"56",x"56", -- 0x15E8 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"56", -- 0x15F0 + x"56",x"32",x"51",x"51",x"32",x"60",x"60",x"32", -- 0x15F8 + x"51",x"51",x"32",x"51",x"51",x"32",x"56",x"56", -- 0x1600 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"56", -- 0x1608 + x"56",x"32",x"80",x"80",x"32",x"72",x"72",x"32", -- 0x1610 + x"66",x"66",x"32",x"60",x"60",x"32",x"56",x"56", -- 0x1618 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"40", -- 0x1620 + x"40",x"32",x"56",x"56",x"32",x"66",x"66",x"32", -- 0x1628 + x"80",x"80",x"32",x"66",x"66",x"32",x"56",x"56", -- 0x1630 + x"32",x"56",x"56",x"32",x"56",x"56",x"32",x"56", -- 0x1638 + x"56",x"00",x"00",x"00",x"00",x"24",x"FF",x"24", -- 0x1640 + x"F2",x"04",x"E6",x"25",x"D8",x"05",x"CB",x"26", -- 0x1648 + x"C0",x"27",x"B4",x"07",x"AB",x"28",x"A2",x"08", -- 0x1650 + x"98",x"29",x"90",x"09",x"88",x"2A",x"80",x"2B", -- 0x1658 + x"79",x"0B",x"72",x"2C",x"6C",x"0C",x"66",x"2D", -- 0x1660 + x"60",x"2E",x"5B",x"0E",x"56",x"2F",x"51",x"0F", -- 0x1668 + x"4C",x"30",x"48",x"10",x"44",x"31",x"40",x"32", -- 0x1670 + x"3C",x"12",x"39",x"33",x"36",x"13",x"33",x"34", -- 0x1678 + x"30",x"35",x"2D",x"15",x"2B",x"36",x"28",x"16", -- 0x1680 + x"26",x"37",x"24",x"17",x"22",x"38",x"20",x"39", -- 0x1688 + x"1F",x"19",x"1D",x"3A",x"1B",x"1A",x"19",x"3B", -- 0x1690 + x"18",x"3C",x"17",x"1C",x"16",x"3D",x"14",x"1D", -- 0x1698 + x"13",x"3E",x"12",x"1E",x"11",x"3F",x"10",x"2B", -- 0x16A0 + x"01",x"01",x"01",x"01",x"57",x"00",x"5C",x"00", -- 0x16A8 + x"62",x"00",x"6A",x"00",x"6F",x"00",x"75",x"00", -- 0x16B0 + x"7D",x"00",x"85",x"00",x"8E",x"00",x"96",x"00", -- 0x16B8 + x"9E",x"00",x"A6",x"00",x"AE",x"00",x"B9",x"00", -- 0x16C0 + x"C4",x"00",x"D5",x"00",x"DF",x"00",x"EA",x"00", -- 0x16C8 + x"FB",x"00",x"0B",x"01",x"1C",x"01",x"2C",x"01", -- 0x16D0 + x"3C",x"01",x"4D",x"01",x"5D",x"01",x"73",x"01", -- 0x16D8 + x"89",x"01",x"AA",x"01",x"BF",x"01",x"D5",x"01", -- 0x16E0 + x"F6",x"01",x"17",x"02",x"38",x"02",x"58",x"02", -- 0x16E8 + x"79",x"02",x"9A",x"02",x"BA",x"02",x"E6",x"02", -- 0x16F0 + x"12",x"03",x"54",x"03",x"7E",x"03",x"AA",x"03", -- 0x16F8 + x"EC",x"03",x"2E",x"04",x"70",x"04",x"B0",x"04", -- 0x1700 + x"F2",x"04",x"34",x"05",x"74",x"05",x"CC",x"05", -- 0x1708 + x"24",x"06",x"A8",x"06",x"FC",x"06",x"54",x"07", -- 0x1710 + x"D8",x"07",x"5C",x"08",x"E0",x"08",x"60",x"09", -- 0x1718 + x"E4",x"09",x"68",x"0A",x"E8",x"0A",x"98",x"0B", -- 0x1720 + x"48",x"0C",x"50",x"0D",x"F8",x"0D",x"A8",x"0E", -- 0x1728 + x"B0",x"0F",x"B8",x"10",x"C0",x"11",x"C0",x"12", -- 0x1730 + x"C8",x"13",x"D0",x"14",x"E8",x"0A",x"98",x"0B", -- 0x1738 + x"48",x"0C",x"50",x"0D",x"F8",x"0D",x"A8",x"0E", -- 0x1740 + x"B0",x"0F",x"B8",x"10",x"C0",x"11",x"C0",x"12", -- 0x1748 + x"C8",x"13",x"D0",x"14",x"E8",x"0A",x"98",x"0B", -- 0x1750 + x"48",x"0C",x"50",x"0D",x"F8",x"0D",x"A8",x"0E", -- 0x1758 + x"B0",x"0F",x"B8",x"10",x"C0",x"11",x"C0",x"12", -- 0x1760 + x"C8",x"13",x"D0",x"14",x"E8",x"0A",x"98",x"0B", -- 0x1768 + x"48",x"0C",x"50",x"0D",x"F8",x"0D",x"A8",x"0E", -- 0x1770 + x"B0",x"0F",x"B8",x"10",x"C0",x"11",x"C0",x"12", -- 0x1778 + x"C8",x"13",x"D0",x"14",x"AC",x"17",x"30",x"18", -- 0x1780 + x"D3",x"18",x"67",x"19",x"1F",x"1A",x"C9",x"1A", -- 0x1788 + x"71",x"1B",x"2F",x"1C",x"13",x"1D",x"CC",x"1D", -- 0x1790 + x"A0",x"1E",x"77",x"1F",x"59",x"20",x"13",x"21", -- 0x1798 + x"FA",x"21",x"AF",x"22",x"68",x"23",x"3E",x"24", -- 0x17A0 + x"F2",x"24",x"A6",x"25",x"00",x"00",x"05",x"1C", -- 0x17A8 + x"08",x"01",x"0C",x"05",x"04",x"80",x"01",x"11", -- 0x17B0 + x"05",x"04",x"80",x"01",x"00",x"07",x"03",x"08", -- 0x17B8 + x"01",x"11",x"08",x"03",x"20",x"09",x"00",x"09", -- 0x17C0 + x"04",x"08",x"01",x"08",x"09",x"10",x"58",x"0F", -- 0x17C8 + x"1A",x"0A",x"02",x"08",x"01",x"14",x"0C",x"03", -- 0x17D0 + x"20",x"09",x"17",x"0C",x"03",x"80",x"01",x"1A", -- 0x17D8 + x"0C",x"02",x"08",x"01",x"04",x"0D",x"10",x"08", -- 0x17E0 + x"01",x"00",x"0F",x"1C",x"08",x"01",x"1A",x"0D", -- 0x17E8 + x"00",x"04",x"30",x"0F",x"17",x"04",x"1B",x"04", -- 0x17F0 + x"15",x"08",x"0C",x"0C",x"02",x"38",x"05",x"0B", -- 0x17F8 + x"00",x"10",x"00",x"07",x"43",x"45",x"4E",x"54", -- 0x1800 + x"52",x"41",x"4C",x"20",x"43",x"41",x"56",x"45", -- 0x1808 + x"52",x"4E",x"00",x"08",x"09",x"10",x"58",x"0F", -- 0x1810 + x"00",x"01",x"0D",x"05",x"45",x"07",x"09",x"00", -- 0x1818 + x"10",x"01",x"19",x"00",x"18",x"04",x"1B",x"06", -- 0x1820 + x"10",x"28",x"08",x"38",x"40",x"40",x"7E",x"01", -- 0x1828 + x"01",x"10",x"00",x"0C",x"20",x"09",x"12",x"03", -- 0x1830 + x"03",x"88",x"01",x"15",x"03",x"01",x"09",x"01", -- 0x1838 + x"00",x"05",x"12",x"09",x"01",x"12",x"06",x"02", -- 0x1840 + x"09",x"01",x"00",x"07",x"01",x"09",x"01",x"01", -- 0x1848 + x"07",x"04",x"88",x"01",x"08",x"09",x"07",x"09", -- 0x1850 + x"01",x"11",x"0A",x"04",x"88",x"01",x"0D",x"0C", -- 0x1858 + x"03",x"09",x"01",x"07",x"0D",x"03",x"88",x"01", -- 0x1860 + x"00",x"0F",x"1C",x"09",x"01",x"16",x"06",x"87", -- 0x1868 + x"20",x"09",x"19",x"05",x"88",x"20",x"09",x"17", -- 0x1870 + x"06",x"02",x"88",x"01",x"17",x"08",x"02",x"88", -- 0x1878 + x"01",x"17",x"09",x"02",x"88",x"01",x"17",x"0A", -- 0x1880 + x"02",x"88",x"01",x"17",x"0B",x"02",x"88",x"01", -- 0x1888 + x"17",x"0C",x"02",x"88",x"01",x"1A",x"0D",x"00", -- 0x1890 + x"00",x"31",x"07",x"01",x"39",x"05",x"1B",x"01", -- 0x1898 + x"08",x"54",x"48",x"45",x"20",x"43",x"4F",x"4C", -- 0x18A0 + x"44",x"20",x"52",x"4F",x"4F",x"4D",x"00",x"02", -- 0x18A8 + x"0B",x"04",x"58",x"14",x"01",x"01",x"0D",x"05", -- 0x18B0 + x"44",x"07",x"02",x"09",x"07",x"01",x"15",x"01", -- 0x18B8 + x"18",x"07",x"11",x"0C",x"20",x"30",x"10",x"18", -- 0x18C0 + x"80",x"08",x"80",x"FF",x"30",x"13",x"68",x"98", -- 0x18C8 + x"58",x"D4",x"FF",x"00",x"09",x"00",x"01",x"1C", -- 0x18D0 + x"03",x"11",x"00",x"01",x"1B",x"03",x"11",x"01", -- 0x18D8 + x"01",x"1C",x"03",x"1A",x"00",x"01",x"1C",x"03", -- 0x18E0 + x"00",x"05",x"04",x"0A",x"05",x"04",x"05",x"18", -- 0x18E8 + x"98",x"05",x"00",x"07",x"05",x"0A",x"05",x"19", -- 0x18F0 + x"07",x"03",x"0A",x"05",x"00",x"08",x"83",x"1B", -- 0x18F8 + x"03",x"00",x"0B",x"01",x"1C",x"03",x"05",x"09", -- 0x1900 + x"06",x"48",x"01",x"17",x"0A",x"05",x"0A",x"05", -- 0x1908 + x"0C",x"0B",x"05",x"0A",x"05",x"04",x"0C",x"06", -- 0x1910 + x"0A",x"05",x"13",x"0D",x"09",x"0A",x"05",x"00", -- 0x1918 + x"0F",x"1C",x"0A",x"05",x"1A",x"08",x"00",x"00", -- 0x1920 + x"1B",x"07",x"00",x"1C",x"05",x"08",x"54",x"48", -- 0x1928 + x"45",x"20",x"4D",x"45",x"4E",x"41",x"47",x"45", -- 0x1930 + x"52",x"49",x"45",x"00",x"05",x"09",x"06",x"48", -- 0x1938 + x"01",x"00",x"01",x"0D",x"05",x"45",x"1B",x"05", -- 0x1940 + x"00",x"0D",x"00",x"15",x"00",x"12",x"06",x"19", -- 0x1948 + x"06",x"30",x"40",x"13",x"68",x"A0",x"08",x"D0", -- 0x1950 + x"FF",x"40",x"10",x"18",x"50",x"08",x"68",x"FF", -- 0x1958 + x"40",x"12",x"18",x"90",x"78",x"D0",x"01",x"00", -- 0x1960 + x"06",x"00",x"01",x"1C",x"03",x"0D",x"00",x"0F", -- 0x1968 + x"20",x"05",x"12",x"03",x"05",x"0A",x"07",x"19", -- 0x1970 + x"04",x"03",x"0A",x"07",x"00",x"05",x"01",x"0A", -- 0x1978 + x"07",x"06",x"05",x"01",x"0A",x"07",x"10",x"05", -- 0x1980 + x"01",x"0A",x"07",x"0B",x"06",x"02",x"0A",x"07", -- 0x1988 + x"14",x"06",x"03",x"0A",x"07",x"00",x"07",x"03", -- 0x1990 + x"98",x"14",x"06",x"08",x"02",x"0A",x"07",x"18", -- 0x1998 + x"08",x"04",x"0A",x"07",x"11",x"09",x"03",x"0A", -- 0x19A0 + x"07",x"00",x"0A",x"03",x"48",x"05",x"1B",x"0A", -- 0x19A8 + x"01",x"0A",x"07",x"0B",x"0B",x"03",x"0A",x"07", -- 0x19B0 + x"15",x"0B",x"03",x"0A",x"07",x"05",x"0C",x"02", -- 0x19B8 + x"0A",x"07",x"16",x"0C",x"01",x"1C",x"03",x"19", -- 0x19C0 + x"0C",x"03",x"0A",x"07",x"11",x"0D",x"02",x"0A", -- 0x19C8 + x"07",x"00",x"0F",x"1C",x"0A",x"07",x"1A",x"01", -- 0x19D0 + x"00",x"00",x"1B",x"07",x"00",x"1C",x"05",x"01", -- 0x19D8 + x"41",x"42",x"41",x"4E",x"44",x"4F",x"4E",x"45", -- 0x19E0 + x"44",x"20",x"55",x"52",x"41",x"4E",x"49",x"55", -- 0x19E8 + x"4D",x"20",x"57",x"4F",x"52",x"4B",x"49",x"4E", -- 0x19F0 + x"47",x"53",x"00",x"00",x"0A",x"03",x"48",x"05", -- 0x19F8 + x"01",x"1A",x"0D",x"05",x"45",x"1B",x"00",x"00", -- 0x1A00 + x"0B",x"01",x"16",x"01",x"0F",x"07",x"19",x"07", -- 0x1A08 + x"20",x"50",x"08",x"68",x"08",x"08",x"60",x"01", -- 0x1A10 + x"50",x"28",x"68",x"28",x"20",x"78",x"01",x"09", -- 0x1A18 + x"12",x"00",x"01",x"3A",x"01",x"00",x"05",x"0C", -- 0x1A20 + x"0C",x"0F",x"10",x"05",x"04",x"68",x"0F",x"14", -- 0x1A28 + x"05",x"05",x"0C",x"0F",x"1A",x"06",x"02",x"0C", -- 0x1A30 + x"0F",x"10",x"08",x"09",x"48",x"01",x"03",x"09", -- 0x1A38 + x"09",x"0C",x"0F",x"00",x"0B",x"02",x"68",x"0F", -- 0x1A40 + x"02",x"0B",x"0A",x"0C",x"0F",x"10",x"0B",x"06", -- 0x1A48 + x"0C",x"0F",x"1B",x"0B",x"01",x"0C",x"0F",x"00", -- 0x1A50 + x"0D",x"02",x"0C",x"0F",x"00",x"0F",x"1C",x"0C", -- 0x1A58 + x"0F",x"07",x"0C",x"83",x"23",x"0F",x"0C",x"0D", -- 0x1A60 + x"82",x"23",x"0F",x"0F",x"0D",x"82",x"23",x"0F", -- 0x1A68 + x"10",x"0E",x"06",x"23",x"0F",x"07",x"0F",x"0F", -- 0x1A70 + x"23",x"0F",x"0D",x"0D",x"00",x"05",x"33",x"09", -- 0x1A78 + x"14",x"07",x"17",x"04",x"04",x"0E",x"16",x"0E", -- 0x1A80 + x"17",x"0E",x"01",x"3A",x"01",x"12",x"00",x"08", -- 0x1A88 + x"45",x"55",x"47",x"45",x"4E",x"45",x"27",x"53", -- 0x1A90 + x"20",x"4C",x"41",x"49",x"52",x"00",x"10",x"08", -- 0x1A98 + x"09",x"48",x"01",x"00",x"00",x"03",x"05",x"44", -- 0x1AA0 + x"09",x"1B",x"01",x"1A",x"07",x"09",x"06",x"08", -- 0x1AA8 + x"0C",x"06",x"0C",x"21",x"60",x"50",x"18",x"50", -- 0x1AB0 + x"08",x"50",x"FF",x"60",x"20",x"38",x"20",x"20", -- 0x1AB8 + x"50",x"01",x"1C",x"0D",x"08",x"68",x"08",x"58", -- 0x1AC0 + x"01",x"00",x"14",x"04",x"01",x"3B",x"07",x"07", -- 0x1AC8 + x"05",x"03",x"0D",x"0F",x"0E",x"05",x"02",x"0D", -- 0x1AD0 + x"0F",x"14",x"05",x"05",x"0D",x"0F",x"02",x"06", -- 0x1AD8 + x"02",x"0D",x"0F",x"0F",x"06",x"82",x"24",x"09", -- 0x1AE0 + x"1A",x"06",x"02",x"0D",x"0F",x"15",x"08",x"04", -- 0x1AE8 + x"0D",x"0F",x"00",x"09",x"02",x"0D",x"0F",x"06", -- 0x1AF0 + x"0A",x"09",x"0D",x"0F",x"0F",x"0A",x"83",x"24", -- 0x1AF8 + x"09",x"10",x"0A",x"08",x"0D",x"0F",x"10",x"0B", -- 0x1B00 + x"01",x"3B",x"07",x"02",x"0C",x"01",x"34",x"03", -- 0x1B08 + x"1A",x"0C",x"02",x"0D",x"0F",x"02",x"0D",x"04", -- 0x1B10 + x"58",x"0F",x"15",x"0D",x"02",x"0D",x"0F",x"00", -- 0x1B18 + x"0F",x"1C",x"0D",x"0F",x"1A",x"00",x"00",x"00", -- 0x1B20 + x"33",x"01",x"00",x"3A",x"01",x"06",x"50",x"52", -- 0x1B28 + x"4F",x"43",x"45",x"53",x"53",x"49",x"4E",x"47", -- 0x1B30 + x"20",x"50",x"4C",x"41",x"4E",x"54",x"00",x"02", -- 0x1B38 + x"0D",x"04",x"58",x"0F",x"00",x"0F",x"03",x"05", -- 0x1B40 + x"45",x"1B",x"00",x"0A",x"0B",x"0B",x"0E",x"06", -- 0x1B48 + x"10",x"06",x"1B",x"07",x"40",x"70",x"30",x"40", -- 0x1B50 + x"30",x"30",x"60",x"01",x"70",x"70",x"40",x"70", -- 0x1B58 + x"70",x"A0",x"01",x"70",x"38",x"68",x"38",x"38", -- 0x1B60 + x"98",x"01",x"70",x"B8",x"68",x"B8",x"B8",x"D8", -- 0x1B68 + x"01",x"00",x"0D",x"00",x"0F",x"25",x"05",x"0E", -- 0x1B70 + x"03",x"02",x"0B",x"09",x"10",x"03",x"8A",x"25", -- 0x1B78 + x"05",x"11",x"03",x"0B",x"90",x"01",x"11",x"04", -- 0x1B80 + x"0B",x"90",x"01",x"06",x"05",x"04",x"58",x"0F", -- 0x1B88 + x"0D",x"05",x"03",x"0B",x"09",x"11",x"05",x"0B", -- 0x1B90 + x"90",x"01",x"00",x"06",x"03",x"0B",x"09",x"11", -- 0x1B98 + x"06",x"0B",x"90",x"01",x"11",x"07",x"0B",x"90", -- 0x1BA0 + x"01",x"00",x"08",x"01",x"0B",x"09",x"11",x"08", -- 0x1BA8 + x"0B",x"90",x"01",x"0D",x"09",x"03",x"0B",x"09", -- 0x1BB0 + x"11",x"09",x"0B",x"90",x"01",x"01",x"0A",x"0A", -- 0x1BB8 + x"0B",x"09",x"11",x"0A",x"0B",x"90",x"01",x"11", -- 0x1BC0 + x"0B",x"0B",x"90",x"01",x"0D",x"0C",x"03",x"25", -- 0x1BC8 + x"05",x"11",x"0C",x"0B",x"90",x"01",x"08",x"0D", -- 0x1BD0 + x"03",x"0B",x"09",x"0D",x"0D",x"82",x"25",x"05", -- 0x1BD8 + x"00",x"0F",x"1C",x"0B",x"09",x"0D",x"0F",x"0F", -- 0x1BE0 + x"25",x"05",x"0E",x"0D",x"00",x"00",x"34",x"01", -- 0x1BE8 + x"04",x"18",x"09",x"19",x"05",x"16",x"08",x"19", -- 0x1BF0 + x"0A",x"16",x"0C",x"0B",x"54",x"48",x"45",x"20", -- 0x1BF8 + x"56",x"41",x"54",x"00",x"06",x"05",x"04",x"58", -- 0x1C00 + x"0F",x"01",x"00",x"0D",x"05",x"45",x"1B",x"1B", -- 0x1C08 + x"03",x"13",x"06",x"18",x"07",x"12",x"0A",x"1B", -- 0x1C10 + x"0B",x"30",x"80",x"70",x"08",x"70",x"70",x"D0", -- 0x1C18 + x"01",x"80",x"08",x"40",x"08",x"08",x"50",x"01", -- 0x1C20 + x"80",x"80",x"68",x"80",x"80",x"D0",x"01",x"00", -- 0x1C28 + x"01",x"00",x"01",x"3C",x"09",x"09",x"00",x"01", -- 0x1C30 + x"3C",x"09",x"13",x"00",x"82",x"26",x"09",x"10", -- 0x1C38 + x"00",x"8F",x"26",x"09",x"0E",x"02",x"02",x"08", -- 0x1C40 + x"01",x"1A",x"02",x"02",x"08",x"01",x"00",x"05", -- 0x1C48 + x"03",x"08",x"01",x"08",x"05",x"06",x"08",x"01", -- 0x1C50 + x"11",x"05",x"02",x"08",x"01",x"14",x"06",x"02", -- 0x1C58 + x"08",x"01",x"1B",x"06",x"01",x"08",x"01",x"01", -- 0x1C60 + x"07",x"03",x"08",x"01",x"18",x"07",x"01",x"08", -- 0x1C68 + x"01",x"07",x"08",x"03",x"08",x"01",x"11",x"09", -- 0x1C70 + x"03",x"08",x"01",x"00",x"0A",x"01",x"08",x"01", -- 0x1C78 + x"0B",x"0A",x"03",x"08",x"01",x"18",x"0A",x"03", -- 0x1C80 + x"08",x"01",x"08",x"0B",x"02",x"08",x"01",x"03", -- 0x1C88 + x"0C",x"02",x"08",x"01",x"15",x"0C",x"04",x"08", -- 0x1C90 + x"01",x"0A",x"0D",x"02",x"58",x"0F",x"0D",x"0D", -- 0x1C98 + x"82",x"26",x"09",x"11",x"0D",x"02",x"08",x"01", -- 0x1CA0 + x"15",x"0E",x"01",x"30",x"0F",x"00",x"0F",x"1C", -- 0x1CA8 + x"08",x"01",x"05",x"00",x"01",x"46",x"0F",x"11", -- 0x1CB0 + x"00",x"01",x"46",x"0F",x"0E",x"0D",x"00",x"00", -- 0x1CB8 + x"33",x"01",x"00",x"3A",x"01",x"00",x"4D",x"49", -- 0x1CC0 + x"4E",x"45",x"52",x"20",x"57",x"49",x"4C",x"4C", -- 0x1CC8 + x"59",x"20",x"4D",x"45",x"45",x"54",x"53",x"20", -- 0x1CD0 + x"4B",x"4F",x"4E",x"47",x"20",x"42",x"45",x"41", -- 0x1CD8 + x"53",x"54",x"00",x"0A",x"0D",x"03",x"58",x"0F", -- 0x1CE0 + x"00",x"00",x"0D",x"04",x"45",x"1B",x"0C",x"02", -- 0x1CE8 + x"0D",x"06",x"01",x"08",x"1A",x"0D",x"31",x"A0", -- 0x1CF0 + x"44",x"68",x"44",x"00",x"48",x"FF",x"A0",x"68", -- 0x1CF8 + x"58",x"68",x"54",x"74",x"01",x"A0",x"88",x"38", -- 0x1D00 + x"88",x"88",x"98",x"01",x"90",x"0E",x"00",x"70", -- 0x1D08 + x"00",x"68",x"00",x"00",x"02",x"00",x"01",x"27", -- 0x1D10 + x"09",x"00",x"05",x"04",x"0B",x"09",x"06",x"05", -- 0x1D18 + x"02",x"0B",x"09",x"0A",x"05",x"08",x"0B",x"09", -- 0x1D20 + x"14",x"05",x"02",x"0B",x"09",x"18",x"05",x"02", -- 0x1D28 + x"0B",x"09",x"1A",x"07",x"02",x"0B",x"09",x"02", -- 0x1D30 + x"08",x"02",x"0B",x"09",x"06",x"08",x"02",x"0B", -- 0x1D38 + x"09",x"0A",x"08",x"08",x"58",x"0F",x"14",x"09", -- 0x1D40 + x"02",x"0B",x"09",x"18",x"09",x"02",x"0B",x"09", -- 0x1D48 + x"00",x"0A",x"02",x"0B",x"09",x"02",x"0C",x"02", -- 0x1D50 + x"0B",x"09",x"06",x"0C",x"02",x"0B",x"09",x"0A", -- 0x1D58 + x"0C",x"08",x"0B",x"09",x"14",x"0C",x"02",x"0B", -- 0x1D60 + x"09",x"18",x"0C",x"02",x"0B",x"09",x"1A",x"0D", -- 0x1D68 + x"02",x"0B",x"09",x"00",x"0F",x"1C",x"0B",x"09", -- 0x1D70 + x"00",x"00",x"00",x"00",x"33",x"01",x"00",x"3A", -- 0x1D78 + x"01",x"06",x"57",x"41",x"43",x"4B",x"59",x"20", -- 0x1D80 + x"41",x"4D",x"4F",x"45",x"42",x"41",x"54",x"52", -- 0x1D88 + x"4F",x"4E",x"53",x"00",x"0A",x"08",x"08",x"58", -- 0x1D90 + x"0F",x"01",x"00",x"0D",x"01",x"45",x"1B",x"10", -- 0x1D98 + x"01",x"24",x"C0",x"58",x"18",x"58",x"58",x"80", -- 0x1DA0 + x"01",x"C0",x"58",x"50",x"58",x"58",x"80",x"01", -- 0x1DA8 + x"B0",x"04",x"08",x"20",x"04",x"68",x"01",x"B0", -- 0x1DB0 + x"08",x"08",x"40",x"04",x"68",x"02",x"B0",x"12", -- 0x1DB8 + x"08",x"90",x"04",x"68",x"01",x"B0",x"16",x"08", -- 0x1DC0 + x"B0",x"04",x"68",x"02",x"00",x"0C",x"00",x"03", -- 0x1DC8 + x"0E",x"0F",x"0F",x"00",x"8C",x"28",x"09",x"14", -- 0x1DD0 + x"00",x"08",x"0E",x"0F",x"00",x"02",x"06",x"0E", -- 0x1DD8 + x"0F",x"1A",x"02",x"02",x"0E",x"0F",x"10",x"04", -- 0x1DE0 + x"04",x"0E",x"0F",x"07",x"05",x"01",x"0E",x"0F", -- 0x1DE8 + x"08",x"05",x"07",x"78",x"01",x"16",x"05",x"06", -- 0x1DF0 + x"0E",x"0F",x"00",x"06",x"04",x"0E",x"0F",x"10", -- 0x1DF8 + x"07",x"07",x"0E",x"0F",x"17",x"07",x"03",x"78", -- 0x1E00 + x"01",x"00",x"08",x"05",x"0E",x"0F",x"08",x"09", -- 0x1E08 + x"07",x"0E",x"0F",x"1A",x"09",x"02",x"0E",x"0F", -- 0x1E10 + x"00",x"0A",x"04",x"0E",x"0F",x"04",x"0A",x"02", -- 0x1E18 + x"78",x"01",x"10",x"0A",x"07",x"0E",x"0F",x"17", -- 0x1E20 + x"0B",x"03",x"78",x"01",x"07",x"0C",x"0A",x"13", -- 0x1E28 + x"05",x"00",x"0D",x"03",x"0E",x"0F",x"19",x"0D", -- 0x1E30 + x"03",x"0E",x"0F",x"00",x"0F",x"1C",x"13",x"05", -- 0x1E38 + x"0B",x"0D",x"00",x"08",x"37",x"0F",x"0A",x"00", -- 0x1E40 + x"11",x"00",x"13",x"00",x"14",x"01",x"02",x"03", -- 0x1E48 + x"00",x"09",x"1B",x"0A",x"16",x"0B",x"00",x"3B", -- 0x1E50 + x"01",x"05",x"54",x"48",x"45",x"20",x"45",x"4E", -- 0x1E58 + x"44",x"4F",x"52",x"49",x"41",x"4E",x"20",x"46", -- 0x1E60 + x"4F",x"52",x"45",x"53",x"54",x"00",x"02",x"0D", -- 0x1E68 + x"00",x"58",x"0F",x"00",x"00",x"04",x"05",x"45", -- 0x1E70 + x"1B",x"0D",x"01",x"1B",x"01",x"14",x"02",x"0B", -- 0x1E78 + x"06",x"11",x"08",x"40",x"D0",x"40",x"38",x"40", -- 0x1E80 + x"40",x"68",x"01",x"D0",x"38",x"50",x"38",x"38", -- 0x1E88 + x"68",x"01",x"D0",x"18",x"68",x"18",x"18",x"B8", -- 0x1E90 + x"01",x"D0",x"80",x"28",x"80",x"80",x"A0",x"01", -- 0x1E98 + x"00",x"00",x"00",x"06",x"2A",x"07",x"00",x"03", -- 0x1EA0 + x"04",x"0F",x"01",x"04",x"05",x"06",x"0F",x"01", -- 0x1EA8 + x"0E",x"05",x"02",x"0F",x"01",x"10",x"05",x"05", -- 0x1EB0 + x"14",x"05",x"15",x"05",x"02",x"0F",x"01",x"1A", -- 0x1EB8 + x"06",x"02",x"0F",x"01",x"00",x"08",x"02",x"0F", -- 0x1EC0 + x"01",x"04",x"08",x"02",x"80",x"09",x"1A",x"08", -- 0x1EC8 + x"02",x"0F",x"01",x"0A",x"09",x"07",x"0F",x"01", -- 0x1ED0 + x"19",x"0A",x"01",x"0F",x"01",x"05",x"0B",x"03", -- 0x1ED8 + x"80",x"10",x"08",x"0B",x"01",x"0F",x"01",x"19", -- 0x1EE0 + x"0C",x"03",x"0F",x"01",x"00",x"0D",x"02",x"0F", -- 0x1EE8 + x"01",x"14",x"0D",x"03",x"0F",x"01",x"00",x"0F", -- 0x1EF0 + x"1C",x"0F",x"0F",x"00",x"01",x"00",x"04",x"1A", -- 0x1EF8 + x"09",x"10",x"01",x"15",x"09",x"10",x"0B",x"0B", -- 0x1F00 + x"0C",x"07",x"1B",x"01",x"10",x"00",x"15",x"06", -- 0x1F08 + x"15",x"07",x"15",x"08",x"0B",x"0A",x"0B",x"0B", -- 0x1F10 + x"10",x"0A",x"01",x"41",x"54",x"54",x"41",x"43", -- 0x1F18 + x"4B",x"20",x"4F",x"46",x"20",x"54",x"48",x"45", -- 0x1F20 + x"20",x"4D",x"55",x"54",x"41",x"4E",x"54",x"20", -- 0x1F28 + x"50",x"48",x"4F",x"4E",x"45",x"53",x"00",x"04", -- 0x1F30 + x"08",x"02",x"50",x"09",x"00",x"02",x"01",x"05", -- 0x1F38 + x"45",x"1B",x"15",x"00",x"1B",x"01",x"00",x"04", -- 0x1F40 + x"11",x"06",x"1B",x"0D",x"24",x"F0",x"70",x"18", -- 0x1F48 + x"70",x"70",x"A8",x"01",x"F0",x"20",x"68",x"20", -- 0x1F50 + x"20",x"90",x"01",x"E0",x"02",x"20",x"10",x"20", -- 0x1F58 + x"68",x"02",x"E0",x"0B",x"02",x"58",x"02",x"38", -- 0x1F60 + x"01",x"E0",x"12",x"30",x"90",x"30",x"68",x"01", -- 0x1F68 + x"E0",x"17",x"02",x"B8",x"02",x"68",x"FD",x"00", -- 0x1F70 + x"05",x"00",x"01",x"46",x"07",x"10",x"00",x"01", -- 0x1F78 + x"25",x"07",x"11",x"00",x"01",x"46",x"07",x"14", -- 0x1F80 + x"00",x"01",x"25",x"07",x"0E",x"02",x"02",x"80", -- 0x1F88 + x"01",x"00",x"05",x"03",x"08",x"01",x"08",x"05", -- 0x1F90 + x"05",x"80",x"01",x"0D",x"05",x"85",x"25",x"07", -- 0x1F98 + x"10",x"05",x"8B",x"25",x"07",x"11",x"05",x"04", -- 0x1FA0 + x"80",x"01",x"15",x"05",x"02",x"08",x"01",x"1B", -- 0x1FA8 + x"06",x"01",x"08",x"01",x"05",x"07",x"02",x"08", -- 0x1FB0 + x"01",x"02",x"08",x"01",x"08",x"01",x"16",x"08", -- 0x1FB8 + x"06",x"08",x"0F",x"09",x"09",x"04",x"08",x"01", -- 0x1FC0 + x"05",x"0A",x"01",x"08",x"01",x"11",x"0A",x"03", -- 0x1FC8 + x"08",x"01",x"16",x"0B",x"02",x"08",x"01",x"00", -- 0x1FD0 + x"0C",x"06",x"08",x"01",x"0A",x"0D",x"03",x"08", -- 0x1FD8 + x"01",x"0D",x"0D",x"83",x"25",x"07",x"11",x"0D", -- 0x1FE0 + x"08",x"50",x"09",x"00",x"0F",x"0D",x"08",x"01", -- 0x1FE8 + x"0D",x"0F",x"03",x"08",x"01",x"11",x"0F",x"0B", -- 0x1FF0 + x"08",x"01",x"0E",x"0D",x"00",x"02",x"30",x"0F", -- 0x1FF8 + x"14",x"0C",x"19",x"0C",x"02",x"3C",x"05",x"01", -- 0x2000 + x"00",x"09",x"00",x"00",x"52",x"45",x"54",x"55", -- 0x2008 + x"52",x"4E",x"20",x"4F",x"46",x"20",x"41",x"4C", -- 0x2010 + x"49",x"45",x"4E",x"20",x"4B",x"4F",x"4E",x"47", -- 0x2018 + x"20",x"42",x"45",x"41",x"53",x"54",x"00",x"11", -- 0x2020 + x"0D",x"09",x"50",x"09",x"01",x"00",x"0D",x"05", -- 0x2028 + x"45",x"1B",x"0E",x"03",x"17",x"05",x"01",x"06", -- 0x2030 + x"0F",x"07",x"1A",x"0D",x"31",x"A0",x"40",x"68", -- 0x2038 + x"40",x"00",x"40",x"FF",x"A0",x"50",x"58",x"50", -- 0x2040 + x"50",x"70",x"01",x"A0",x"B0",x"30",x"B0",x"B0", -- 0x2048 + x"C8",x"01",x"90",x"0E",x"00",x"70",x"00",x"70", -- 0x2050 + x"00",x"00",x"00",x"00",x"1C",x"27",x"09",x"02", -- 0x2058 + x"01",x"8E",x"16",x"09",x"06",x"03",x"12",x"05", -- 0x2060 + x"05",x"1A",x"03",x"02",x"05",x"05",x"06",x"06", -- 0x2068 + x"02",x"05",x"05",x"0A",x"06",x"04",x"05",x"05", -- 0x2070 + x"10",x"06",x"05",x"05",x"05",x"17",x"06",x"02", -- 0x2078 + x"05",x"05",x"1B",x"06",x"01",x"05",x"05",x"06", -- 0x2080 + x"09",x"05",x"05",x"05",x"0D",x"09",x"03",x"05", -- 0x2088 + x"05",x"13",x"09",x"03",x"05",x"05",x"18",x"09", -- 0x2090 + x"04",x"05",x"05",x"06",x"0C",x"03",x"05",x"05", -- 0x2098 + x"0B",x"0C",x"03",x"05",x"05",x"10",x"0C",x"04", -- 0x20A0 + x"05",x"05",x"16",x"0C",x"02",x"05",x"05",x"1A", -- 0x20A8 + x"0C",x"02",x"05",x"05",x"00",x"0F",x"02",x"05", -- 0x20B0 + x"05",x"02",x"0F",x"18",x"58",x"0F",x"1A",x"0F", -- 0x20B8 + x"02",x"05",x"05",x"00",x"0D",x"00",x"00",x"33", -- 0x20C0 + x"01",x"00",x"3A",x"01",x"08",x"4F",x"52",x"45", -- 0x20C8 + x"20",x"52",x"45",x"46",x"49",x"4E",x"45",x"52", -- 0x20D0 + x"59",x"00",x"02",x"0F",x"18",x"58",x"0F",x"01", -- 0x20D8 + x"1A",x"0D",x"05",x"45",x"1B",x"18",x"03",x"09", -- 0x20E0 + x"06",x"12",x"09",x"17",x"09",x"0A",x"0C",x"41", -- 0x20E8 + x"C0",x"30",x"08",x"30",x"30",x"D0",x"02",x"C0", -- 0x20F0 + x"80",x"20",x"80",x"30",x"D0",x"01",x"C0",x"88", -- 0x20F8 + x"38",x"88",x"30",x"D0",x"FE",x"C0",x"98",x"50", -- 0x2100 + x"98",x"30",x"D0",x"01",x"B0",x"04",x"38",x"20", -- 0x2108 + x"08",x"68",x"02",x"01",x"0E",x"05",x"01",x"06", -- 0x2110 + x"05",x"0F",x"05",x"01",x"07",x"05",x"02",x"06", -- 0x2118 + x"01",x"06",x"05",x"03",x"06",x"01",x"07",x"05", -- 0x2120 + x"0A",x"06",x"01",x"06",x"05",x"0B",x"06",x"01", -- 0x2128 + x"07",x"05",x"12",x"06",x"01",x"06",x"05",x"13", -- 0x2130 + x"06",x"01",x"07",x"05",x"1A",x"06",x"01",x"06", -- 0x2138 + x"05",x"1B",x"06",x"01",x"07",x"05",x"06",x"07", -- 0x2140 + x"01",x"06",x"05",x"07",x"07",x"01",x"07",x"05", -- 0x2148 + x"16",x"07",x"01",x"06",x"05",x"17",x"07",x"01", -- 0x2150 + x"07",x"05",x"04",x"09",x"01",x"06",x"05",x"05", -- 0x2158 + x"09",x"01",x"07",x"05",x"0C",x"09",x"01",x"06", -- 0x2160 + x"05",x"0D",x"09",x"01",x"07",x"05",x"14",x"09", -- 0x2168 + x"01",x"06",x"05",x"15",x"09",x"01",x"07",x"05", -- 0x2170 + x"1A",x"09",x"01",x"06",x"05",x"1B",x"09",x"01", -- 0x2178 + x"07",x"05",x"00",x"0B",x"01",x"06",x"05",x"01", -- 0x2180 + x"0B",x"01",x"07",x"05",x"08",x"0B",x"01",x"06", -- 0x2188 + x"05",x"09",x"0B",x"01",x"07",x"05",x"0E",x"0B", -- 0x2190 + x"06",x"58",x"0F",x"18",x"0B",x"01",x"06",x"05", -- 0x2198 + x"19",x"0B",x"01",x"07",x"05",x"06",x"0D",x"01", -- 0x21A0 + x"06",x"05",x"07",x"0D",x"01",x"07",x"05",x"00", -- 0x21A8 + x"0F",x"1C",x"29",x"05",x"0E",x"00",x"00",x"00", -- 0x21B0 + x"33",x"01",x"00",x"3A",x"01",x"05",x"53",x"4B", -- 0x21B8 + x"59",x"4C",x"41",x"42",x"20",x"4C",x"41",x"4E", -- 0x21C0 + x"44",x"49",x"4E",x"47",x"20",x"42",x"41",x"59", -- 0x21C8 + x"00",x"0E",x"0B",x"06",x"58",x"0F",x"00",x"1A", -- 0x21D0 + x"0D",x"04",x"44",x"01",x"16",x"02",x"0F",x"07", -- 0x21D8 + x"1A",x"07",x"02",x"08",x"03",x"E0",x"00",x"20", -- 0x21E0 + x"00",x"00",x"48",x"04",x"E0",x"0A",x"00",x"50", -- 0x21E8 + x"00",x"20",x"01",x"E0",x"14",x"10",x"A0",x"00", -- 0x21F0 + x"38",x"03",x"00",x"04",x"00",x"18",x"2A",x"07", -- 0x21F8 + x"1A",x"01",x"8E",x"15",x"07",x"1B",x"01",x"8E", -- 0x2200 + x"15",x"07",x"06",x"03",x"0F",x"50",x"05",x"15", -- 0x2208 + x"03",x"05",x"0F",x"01",x"06",x"04",x"01",x"1B", -- 0x2210 + x"01",x"06",x"05",x"01",x"1A",x"09",x"19",x"04", -- 0x2218 + x"86",x"1B",x"01",x"19",x"0A",x"01",x"1A",x"09", -- 0x2220 + x"00",x"05",x"04",x"0F",x"01",x"15",x"06",x"02", -- 0x2228 + x"0F",x"01",x"05",x"07",x"01",x"80",x"10",x"0A", -- 0x2230 + x"07",x"02",x"0F",x"01",x"02",x"08",x"02",x"0F", -- 0x2238 + x"01",x"10",x"08",x"02",x"0F",x"01",x"16",x"09", -- 0x2240 + x"02",x"0F",x"01",x"00",x"0A",x"02",x"0F",x"01", -- 0x2248 + x"0A",x"0A",x"02",x"0F",x"01",x"10",x"0B",x"02", -- 0x2250 + x"0F",x"01",x"04",x"0C",x"02",x"0F",x"01",x"15", -- 0x2258 + x"0C",x"02",x"0F",x"01",x"0A",x"0D",x"02",x"0F", -- 0x2260 + x"01",x"00",x"0F",x"1C",x"0F",x"01",x"00",x"03", -- 0x2268 + x"00",x"00",x"33",x"01",x"00",x"3A",x"01",x"0A", -- 0x2270 + x"54",x"48",x"45",x"20",x"42",x"41",x"4E",x"4B", -- 0x2278 + x"00",x"06",x"03",x"0F",x"50",x"05",x"00",x"01", -- 0x2280 + x"0D",x"03",x"45",x"1B",x"16",x"02",x"0A",x"06", -- 0x2288 + x"18",x"0E",x"13",x"C0",x"78",x"68",x"78",x"78", -- 0x2290 + x"88",x"01",x"E0",x"07",x"28",x"38",x"24",x"68", -- 0x2298 + x"02",x"E0",x"0D",x"40",x"68",x"24",x"68",x"01", -- 0x22A0 + x"E0",x"12",x"50",x"90",x"20",x"68",x"FD",x"00", -- 0x22A8 + x"00",x"05",x"01",x"08",x"01",x"05",x"05",x"01", -- 0x22B0 + x"08",x"01",x"14",x"05",x"02",x"08",x"01",x"03", -- 0x22B8 + x"07",x"01",x"08",x"01",x"16",x"07",x"06",x"08", -- 0x22C0 + x"01",x"0A",x"05",x"84",x"2B",x"17",x"0D",x"05", -- 0x22C8 + x"84",x"2B",x"17",x"0E",x"06",x"83",x"2B",x"17", -- 0x22D0 + x"0F",x"07",x"82",x"2B",x"17",x"10",x"08",x"81", -- 0x22D8 + x"2B",x"17",x"00",x"09",x"02",x"80",x"01",x"02", -- 0x22E0 + x"09",x"18",x"50",x"09",x"09",x"0B",x"02",x"2B", -- 0x22E8 + x"17",x"0B",x"0B",x"02",x"08",x"01",x"0B",x"0B", -- 0x22F0 + x"02",x"08",x"01",x"19",x"0B",x"01",x"08",x"01", -- 0x22F8 + x"00",x"0C",x"09",x"08",x"01",x"13",x"0D",x"01", -- 0x2300 + x"08",x"01",x"19",x"0D",x"01",x"08",x"01",x"16", -- 0x2308 + x"0E",x"03",x"36",x"0F",x"00",x"0F",x"1C",x"08", -- 0x2310 + x"01",x"0B",x"05",x"00",x"00",x"33",x"01",x"00", -- 0x2318 + x"3A",x"01",x"04",x"54",x"48",x"45",x"20",x"53", -- 0x2320 + x"49",x"58",x"54",x"45",x"45",x"4E",x"54",x"48", -- 0x2328 + x"20",x"43",x"41",x"56",x"45",x"52",x"4E",x"00", -- 0x2330 + x"02",x"09",x"18",x"50",x"09",x"00",x"01",x"0D", -- 0x2338 + x"04",x"45",x"1B",x"00",x"00",x"1B",x"02",x"0C", -- 0x2340 + x"07",x"10",x"0A",x"40",x"20",x"B0",x"28",x"B0", -- 0x2348 + x"B0",x"D0",x"01",x"20",x"88",x"38",x"88",x"88", -- 0x2350 + x"A0",x"01",x"20",x"10",x"50",x"10",x"02",x"38", -- 0x2358 + x"01",x"20",x"50",x"68",x"50",x"02",x"88",x"01", -- 0x2360 + x"00",x"00",x"05",x"1C",x"90",x"05",x"00",x"06", -- 0x2368 + x"1C",x"90",x"05",x"00",x"07",x"1C",x"90",x"05", -- 0x2370 + x"00",x"08",x"1C",x"90",x"05",x"00",x"09",x"1C", -- 0x2378 + x"90",x"05",x"00",x"0A",x"1C",x"90",x"05",x"00", -- 0x2380 + x"0B",x"1C",x"90",x"05",x"00",x"0C",x"1C",x"90", -- 0x2388 + x"05",x"02",x"08",x"85",x"00",x"00",x"03",x"08", -- 0x2390 + x"85",x"00",x"00",x"08",x"05",x"88",x"00",x"00", -- 0x2398 + x"09",x"05",x"88",x"00",x"00",x"11",x"05",x"85", -- 0x23A0 + x"00",x"00",x"12",x"05",x"85",x"00",x"00",x"18", -- 0x23A8 + x"05",x"88",x"00",x"00",x"19",x"05",x"88",x"00", -- 0x23B0 + x"00",x"0C",x"08",x"05",x"58",x"0F",x"00",x"05", -- 0x23B8 + x"02",x"11",x"05",x"1A",x"05",x"02",x"11",x"05", -- 0x23C0 + x"18",x"0E",x"04",x"11",x"05",x"00",x"0F",x"1C", -- 0x23C8 + x"11",x"05",x"1A",x"01",x"00",x"06",x"32",x"07", -- 0x23D0 + x"05",x"04",x"07",x"04",x"0B",x"04",x"0E",x"04", -- 0x23D8 + x"14",x"04",x"16",x"04",x"04",x"3E",x"05",x"02", -- 0x23E0 + x"06",x"17",x"07",x"14",x"0A",x"07",x"0B",x"08", -- 0x23E8 + x"54",x"48",x"45",x"20",x"57",x"41",x"52",x"45", -- 0x23F0 + x"48",x"4F",x"55",x"53",x"45",x"00",x"0C",x"08", -- 0x23F8 + x"05",x"58",x"0F",x"01",x"00",x"03",x"05",x"45", -- 0x2400 + x"1B",x"16",x"05",x"0D",x"07",x"00",x"09",x"11", -- 0x2408 + x"0A",x"17",x"0B",x"24",x"70",x"20",x"68",x"20", -- 0x2410 + x"20",x"30",x"01",x"70",x"50",x"68",x"50",x"50", -- 0x2418 + x"B0",x"01",x"40",x"02",x"40",x"10",x"40",x"68", -- 0x2420 + x"02",x"40",x"08",x"40",x"40",x"00",x"68",x"FD", -- 0x2428 + x"40",x"11",x"30",x"88",x"00",x"40",x"01",x"40", -- 0x2430 + x"18",x"00",x"C0",x"00",x"60",x"04",x"00",x"19", -- 0x2438 + x"00",x"01",x"2D",x"09",x"02",x"05",x"1A",x"08", -- 0x2440 + x"01",x"00",x"07",x"02",x"08",x"01",x"0B",x"08", -- 0x2448 + x"11",x"08",x"01",x"02",x"09",x"07",x"08",x"01", -- 0x2450 + x"1B",x"0A",x"01",x"08",x"01",x"02",x"0C",x"1A", -- 0x2458 + x"08",x"01",x"00",x"0D",x"02",x"08",x"01",x"04", -- 0x2460 + x"05",x"88",x"00",x"00",x"05",x"05",x"88",x"00", -- 0x2468 + x"00",x"09",x"05",x"88",x"00",x"00",x"0A",x"05", -- 0x2470 + x"88",x"00",x"00",x"13",x"05",x"88",x"00",x"00", -- 0x2478 + x"14",x"05",x"88",x"00",x"00",x"18",x"05",x"88", -- 0x2480 + x"00",x"00",x"19",x"05",x"88",x"00",x"00",x"00", -- 0x2488 + x"0F",x"1C",x"08",x"01",x"1A",x"00",x"00",x"00", -- 0x2490 + x"34",x"01",x"00",x"3B",x"01",x"04",x"4F",x"4D", -- 0x2498 + x"4F",x"45",x"42",x"41",x"54",x"52",x"4F",x"4E", -- 0x24A0 + x"53",x"27",x"20",x"52",x"45",x"56",x"45",x"4E", -- 0x24A8 + x"47",x"45",x"00",x"02",x"0D",x"00",x"58",x"0F", -- 0x24B0 + x"00",x"1A",x"0D",x"01",x"45",x"1B",x"0F",x"01", -- 0x24B8 + x"34",x"C0",x"58",x"30",x"58",x"58",x"88",x"02", -- 0x24C0 + x"C0",x"78",x"50",x"78",x"58",x"88",x"01",x"C0", -- 0x24C8 + x"70",x"68",x"70",x"58",x"88",x"FE",x"B0",x"04", -- 0x24D0 + x"68",x"20",x"05",x"68",x"FC",x"B0",x"09",x"48", -- 0x24D8 + x"48",x"05",x"68",x"02",x"B0",x"13",x"48",x"98", -- 0x24E0 + x"05",x"68",x"04",x"B0",x"18",x"28",x"C0",x"05", -- 0x24E8 + x"68",x"01",x"0F",x"00",x"00",x"02",x"20",x"09", -- 0x24F0 + x"02",x"05",x"01",x"12",x"15",x"07",x"05",x"06", -- 0x24F8 + x"12",x"15",x"15",x"05",x"07",x"12",x"15",x"11", -- 0x2500 + x"07",x"02",x"12",x"15",x"00",x"08",x"01",x"12", -- 0x2508 + x"15",x"0B",x"08",x"03",x"12",x"15",x"15",x"08", -- 0x2510 + x"07",x"12",x"15",x"11",x"0A",x"01",x"12",x"15", -- 0x2518 + x"00",x"0B",x"03",x"12",x"15",x"0C",x"0C",x"05", -- 0x2520 + x"12",x"15",x"15",x"0B",x"07",x"12",x"15",x"00", -- 0x2528 + x"0E",x"02",x"20",x"09",x"00",x"0F",x"02",x"20", -- 0x2530 + x"09",x"02",x"0F",x"1A",x"12",x"15",x"14",x"0F", -- 0x2538 + x"01",x"20",x"09",x"00",x"01",x"00",x"00",x"33", -- 0x2540 + x"01",x"00",x"3A",x"01",x"04",x"53",x"4F",x"4C", -- 0x2548 + x"41",x"52",x"20",x"50",x"4F",x"57",x"45",x"52", -- 0x2550 + x"20",x"47",x"45",x"4E",x"45",x"52",x"41",x"54", -- 0x2558 + x"4F",x"52",x"00",x"05",x"0C",x"04",x"58",x"0F", -- 0x2560 + x"00",x"0C",x"0A",x"03",x"44",x"0F",x"1B",x"01", -- 0x2568 + x"00",x"05",x"1B",x"0C",x"43",x"70",x"B8",x"18", -- 0x2570 + x"B8",x"A0",x"D0",x"02",x"70",x"D0",x"30",x"D0", -- 0x2578 + x"98",x"D0",x"FE",x"70",x"C8",x"48",x"C8",x"98", -- 0x2580 + x"D0",x"FF",x"70",x"78",x"68",x"78",x"60",x"D0", -- 0x2588 + x"02",x"E0",x"03",x"58",x"18",x"04",x"68",x"03", -- 0x2590 + x"E0",x"09",x"38",x"48",x"30",x"68",x"FE",x"E0", -- 0x2598 + x"0E",x"48",x"70",x"02",x"50",x"FF",x"00",x"00", -- 0x25A0 + x"00",x"05",x"03",x"0F",x"00",x"01",x"05",x"03", -- 0x25A8 + x"0F",x"00",x"02",x"04",x"03",x"0F",x"02",x"02", -- 0x25B0 + x"84",x"28",x"09",x"05",x"00",x"17",x"01",x"01", -- 0x25B8 + x"05",x"01",x"17",x"01",x"01",x"04",x"02",x"18", -- 0x25C0 + x"01",x"01",x"17",x"02",x"05",x"04",x"01",x"17", -- 0x25C8 + x"03",x"05",x"04",x"01",x"00",x"03",x"83",x"01", -- 0x25D0 + x"01",x"01",x"03",x"83",x"01",x"01",x"03",x"03", -- 0x25D8 + x"0C",x"01",x"01",x"03",x"04",x"03",x"01",x"01", -- 0x25E0 + x"06",x"04",x"01",x"3F",x"09",x"05",x"05",x"01", -- 0x25E8 + x"3F",x"09",x"07",x"04",x"02",x"2E",x"09",x"06", -- 0x25F0 + x"05",x"04",x"2E",x"09",x"09",x"04",x"01",x"1F", -- 0x25F8 + x"09",x"0A",x"05",x"01",x"1F",x"09",x"13",x"00", -- 0x2600 + x"01",x"3F",x"09",x"14",x"00",x"02",x"2E",x"09", -- 0x2608 + x"16",x"00",x"01",x"1F",x"09",x"13",x"01",x"82", -- 0x2610 + x"2E",x"0F",x"14",x"01",x"82",x"1E",x"01",x"15", -- 0x2618 + x"01",x"82",x"1E",x"01",x"16",x"01",x"82",x"2E", -- 0x2620 + x"0F",x"13",x"03",x"04",x"2E",x"0F",x"0A",x"04", -- 0x2628 + x"03",x"01",x"01",x"03",x"05",x"02",x"01",x"01", -- 0x2630 + x"0B",x"05",x"01",x"01",x"01",x"1A",x"08",x"02", -- 0x2638 + x"08",x"01",x"18",x"0A",x"01",x"80",x"01",x"19", -- 0x2640 + x"0B",x"01",x"08",x"01",x"00",x"0C",x"01",x"08", -- 0x2648 + x"01",x"03",x"0D",x"01",x"08",x"01",x"00",x"0F", -- 0x2650 + x"1C",x"08",x"01",x"0F",x"04",x"0D",x"24",x"15", -- 0x2658 + x"0D",x"05",x"03",x"24",x"15",x"12",x"05",x"83", -- 0x2660 + x"24",x"15",x"0D",x"06",x"03",x"24",x"15",x"00", -- 0x2668 + x"06",x"04",x"24",x"15",x"00",x"07",x"10",x"24", -- 0x2670 + x"15",x"04",x"06",x"03",x"03",x"0F",x"07",x"06", -- 0x2678 + x"02",x"01",x"01",x"09",x"06",x"04",x"03",x"0F", -- 0x2680 + x"0C",x"05",x"01",x"03",x"0F",x"10",x"05",x"00", -- 0x2688 + x"06",x"31",x"05",x"0D",x"04",x"0E",x"04",x"0F", -- 0x2690 + x"03",x"10",x"03",x"11",x"03",x"12",x"03",x"04", -- 0x2698 + x"1A",x"05",x"06",x"0B",x"09",x"0B",x"0E",x"0B", -- 0x26A0 + x"12",x"0B",x"06",x"54",x"48",x"45",x"20",x"46", -- 0x26A8 + x"49",x"4E",x"41",x"4C",x"20",x"42",x"41",x"52", -- 0x26B0 + x"52",x"49",x"45",x"52",x"00",x"00",x"0A",x"14", -- 0x26B8 + x"58",x"0F",x"01",x"19",x"0D",x"05",x"45",x"1B", -- 0x26C0 + x"14",x"05",x"1B",x"06",x"07",x"0B",x"0B",x"0B", -- 0x26C8 + x"10",x"0B",x"11",x"70",x"38",x"68",x"38",x"20", -- 0x26D0 + x"98",x"02",x"E0",x"15",x"30",x"A8",x"28",x"68", -- 0x26D8 + x"01",x"00",x"21",x"07",x"27",x"16",x"16",x"0E", -- 0x26E0 + x"0A",x"1E",x"00",x"06",x"1C",x"7E",x"23",x"E5", -- 0x26E8 + x"D5",x"F5",x"CD",x"6D",x"0B",x"F1",x"C6",x"80", -- 0x26F0 + x"77",x"CB",x"D4",x"36",x"1B",x"D1",x"E1",x"1C", -- 0x26F8 + x"10",x"EB",x"14",x"0D",x"20",x"E3",x"C9",x"20", -- 0x2700 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2708 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2710 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2718 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"50", -- 0x2720 + x"41",x"43",x"2D",x"4D",x"41",x"4E",x"49",x"43", -- 0x2728 + x"2D",x"4D",x"49",x"4E",x"45",x"52",x"2D",x"4D", -- 0x2730 + x"41",x"4E",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2738 + x"57",x"52",x"49",x"54",x"54",x"45",x"4E",x"20", -- 0x2740 + x"42",x"59",x"20",x"4A",x"49",x"4D",x"20",x"42", -- 0x2748 + x"41",x"47",x"4C",x"45",x"59",x"20",x"46",x"4F", -- 0x2750 + x"52",x"20",x"20",x"20",x"20",x"50",x"41",x"43", -- 0x2758 + x"4D",x"41",x"4E",x"20",x"41",x"52",x"43",x"41", -- 0x2760 + x"44",x"45",x"20",x"48",x"41",x"52",x"44",x"57", -- 0x2768 + x"41",x"52",x"45",x"2E",x"20",x"20",x"20",x"20", -- 0x2770 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2778 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2780 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2788 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2790 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2798 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x27A0 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x27A8 + x"20",x"20",x"4A",x"55",x"4D",x"50",x"20",x"3D", -- 0x27B0 + x"20",x"4A",x"4F",x"59",x"20",x"32",x"20",x"2D", -- 0x27B8 + x"3E",x"20",x"52",x"49",x"47",x"48",x"54",x"20", -- 0x27C0 + x"20",x"20",x"20",x"20",x"4D",x"55",x"53",x"49", -- 0x27C8 + x"43",x"20",x"4F",x"4E",x"2F",x"4F",x"46",x"46", -- 0x27D0 + x"20",x"3D",x"20",x"4A",x"4F",x"59",x"20",x"32", -- 0x27D8 + x"20",x"2D",x"3E",x"20",x"55",x"50",x"20",x"20", -- 0x27E0 + x"46",x"58",x"20",x"4F",x"4E",x"2F",x"4F",x"46", -- 0x27E8 + x"46",x"20",x"3D",x"20",x"4A",x"4F",x"59",x"20", -- 0x27F0 + x"32",x"20",x"2D",x"3E",x"20",x"44",x"4F",x"57", -- 0x27F8 + x"4E",x"2E",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2800 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2808 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2810 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"41", -- 0x2818 + x"49",x"52",x"20",x"E7",x"E7",x"E7",x"E7",x"E7", -- 0x2820 + x"E7",x"00",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7", -- 0x2828 + x"E7",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7", -- 0x2830 + x"E7",x"E7",x"E7",x"E7",x"00",x"48",x"49",x"53", -- 0x2838 + x"43",x"4F",x"52",x"45",x"20",x"00",x"20",x"20", -- 0x2840 + x"53",x"43",x"4F",x"52",x"45",x"20",x"00",x"00", -- 0x2848 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2850 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2858 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2860 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2868 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2870 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2878 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2880 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2888 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2890 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2898 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2900 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2908 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2910 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2918 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2920 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2928 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2930 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2938 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2940 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2948 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2950 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2958 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2960 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2968 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2970 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2978 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2980 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2988 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2990 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2998 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2ED0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2ED8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3000 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3008 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3010 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3018 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3020 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3028 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3030 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3038 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3040 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3048 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3050 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3058 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3060 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3068 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3070 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3080 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3088 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3090 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3098 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3100 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3108 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3110 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3118 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3120 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3128 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3130 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3138 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3140 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3148 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3150 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3190 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3200 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3208 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3210 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3218 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3220 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3228 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3230 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3238 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3240 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3248 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3250 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3270 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3290 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3298 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3300 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3308 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3310 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3318 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3320 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3328 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3330 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3338 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3340 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3348 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3350 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3358 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3360 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3368 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3378 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3380 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3388 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3390 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3398 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3400 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3408 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3410 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3418 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3420 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3428 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3430 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3438 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3440 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3448 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3450 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3458 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3460 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3468 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3470 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3478 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3480 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3488 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3490 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3498 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3500 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3510 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3518 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3520 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3530 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3538 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3540 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3550 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3558 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3560 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3570 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3580 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3588 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3590 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3608 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3610 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3620 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3628 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3630 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3638 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3640 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3648 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3650 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3658 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3660 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3668 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3670 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3678 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3688 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3690 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3698 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3700 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3708 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3710 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3718 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3720 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3728 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3730 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3738 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3740 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3748 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3750 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3758 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3760 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3768 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3770 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3778 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3780 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3788 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3790 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3798 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3800 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3808 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3810 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3818 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3820 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3828 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3830 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3838 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3840 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3848 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3850 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3858 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3860 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3868 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3870 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3878 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3880 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3888 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3890 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3898 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3900 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3908 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3910 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3918 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3920 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3928 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3930 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3938 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3940 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3948 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3950 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3958 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3960 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3968 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3970 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3978 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3980 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3988 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3990 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3998 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3ED0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3ED8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x3FF8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..11395aeb --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,2077 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity ROM_PGM_1 is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(13 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of ROM_PGM_1 is + + + type ROM_ARRAY is array(0 to 16383) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"C3",x"01",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x0000 + x"77",x"23",x"10",x"FC",x"C9",x"00",x"00",x"00", -- 0x0008 + x"85",x"6F",x"8C",x"95",x"67",x"7E",x"C9",x"00", -- 0x0010 + x"78",x"87",x"D7",x"5F",x"23",x"56",x"EB",x"C9", -- 0x0018 + x"E1",x"87",x"D7",x"5F",x"23",x"56",x"EB",x"E9", -- 0x0020 + x"ED",x"B0",x"AF",x"32",x"C0",x"50",x"C9",x"00", -- 0x0028 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0030 + x"C3",x"68",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0038 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0040 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0048 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0050 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0058 + x"00",x"00",x"00",x"00",x"00",x"00",x"ED",x"45", -- 0x0060 + x"F3",x"F5",x"DD",x"E5",x"E5",x"D5",x"C5",x"AF", -- 0x0068 + x"32",x"00",x"50",x"32",x"C0",x"50",x"2A",x"00", -- 0x0070 + x"4C",x"23",x"22",x"00",x"4C",x"3E",x"00",x"B7", -- 0x0078 + x"C2",x"EE",x"00",x"21",x"53",x"4C",x"11",x"F2", -- 0x0080 + x"4F",x"01",x"0C",x"00",x"EF",x"11",x"04",x"00", -- 0x0088 + x"19",x"11",x"62",x"50",x"01",x"0C",x"00",x"EF", -- 0x0090 + x"3A",x"1B",x"4C",x"3C",x"32",x"1B",x"4C",x"E6", -- 0x0098 + x"01",x"28",x"1C",x"2A",x"51",x"4C",x"ED",x"5B", -- 0x00A0 + x"61",x"4C",x"22",x"FA",x"4F",x"ED",x"53",x"6A", -- 0x00A8 + x"50",x"2A",x"5F",x"4C",x"ED",x"5B",x"6F",x"4C", -- 0x00B0 + x"22",x"FC",x"4F",x"ED",x"53",x"6C",x"50",x"3A", -- 0x00B8 + x"50",x"4C",x"B7",x"28",x"14",x"AF",x"32",x"1C", -- 0x00C0 + x"4C",x"AF",x"32",x"50",x"4C",x"CD",x"DD",x"0C", -- 0x00C8 + x"CD",x"DC",x"0C",x"CD",x"B7",x"0C",x"CD",x"92", -- 0x00D0 + x"07",x"CD",x"AF",x"12",x"AF",x"32",x"C0",x"50", -- 0x00D8 + x"3E",x"01",x"32",x"00",x"50",x"C1",x"D1",x"E1", -- 0x00E0 + x"DD",x"E1",x"F1",x"FB",x"ED",x"4D",x"21",x"51", -- 0x00E8 + x"4C",x"11",x"F0",x"4F",x"01",x"10",x"00",x"EF", -- 0x00F0 + x"11",x"60",x"50",x"01",x"10",x"00",x"EF",x"18", -- 0x00F8 + x"BE",x"F3",x"31",x"F0",x"4F",x"ED",x"56",x"3E", -- 0x0100 + x"FF",x"D3",x"00",x"AF",x"21",x"00",x"50",x"01", -- 0x0108 + x"08",x"08",x"CF",x"AF",x"32",x"C0",x"50",x"21", -- 0x0110 + x"00",x"4C",x"06",x"BE",x"CF",x"CF",x"CF",x"CF", -- 0x0118 + x"3E",x"0F",x"32",x"4C",x"4C",x"32",x"4D",x"4C", -- 0x0120 + x"21",x"0D",x"4C",x"11",x"0E",x"4C",x"01",x"0C", -- 0x0128 + x"00",x"36",x"30",x"EF",x"AF",x"12",x"32",x"13", -- 0x0130 + x"4C",x"21",x"CE",x"FA",x"22",x"02",x"4C",x"21", -- 0x0138 + x"40",x"50",x"06",x"40",x"CF",x"3E",x"01",x"32", -- 0x0140 + x"00",x"50",x"FB",x"AF",x"32",x"C0",x"50",x"32", -- 0x0148 + x"48",x"4C",x"32",x"49",x"4C",x"32",x"4A",x"4C", -- 0x0150 + x"3E",x"01",x"32",x"1D",x"4C",x"3E",x"68",x"32", -- 0x0158 + x"1E",x"4C",x"3E",x"00",x"32",x"1F",x"4C",x"3E", -- 0x0160 + x"01",x"32",x"20",x"4C",x"AF",x"32",x"24",x"4C", -- 0x0168 + x"32",x"22",x"4C",x"3E",x"FF",x"32",x"25",x"4C", -- 0x0170 + x"AF",x"32",x"50",x"4C",x"32",x"48",x"4C",x"32", -- 0x0178 + x"49",x"4C",x"32",x"4A",x"4C",x"3E",x"01",x"CD", -- 0x0180 + x"A2",x"12",x"CD",x"24",x"0F",x"3A",x"0B",x"4C", -- 0x0188 + x"B7",x"20",x"14",x"21",x"D9",x"11",x"11",x"BC", -- 0x0190 + x"43",x"0E",x"01",x"CD",x"93",x"0B",x"CD",x"83", -- 0x0198 + x"0B",x"3A",x"0B",x"4C",x"B7",x"28",x"F7",x"21", -- 0x01A0 + x"BD",x"11",x"11",x"BC",x"43",x"0E",x"01",x"CD", -- 0x01A8 + x"93",x"0B",x"CD",x"83",x"0B",x"3A",x"09",x"4C", -- 0x01B0 + x"E6",x"20",x"28",x"F6",x"3A",x"0B",x"4C",x"3D", -- 0x01B8 + x"32",x"0B",x"4C",x"3E",x"02",x"CD",x"A2",x"12", -- 0x01C0 + x"3E",x"00",x"32",x"2F",x"4C",x"3E",x"05",x"32", -- 0x01C8 + x"27",x"4C",x"21",x"0D",x"4C",x"11",x"0E",x"4C", -- 0x01D0 + x"01",x"05",x"00",x"36",x"30",x"EF",x"AF",x"12", -- 0x01D8 + x"3A",x"2F",x"4C",x"CD",x"1B",x"0D",x"AF",x"32", -- 0x01E0 + x"24",x"4C",x"CD",x"E2",x"26",x"AF",x"32",x"2B", -- 0x01E8 + x"4C",x"3A",x"30",x"4C",x"3C",x"32",x"30",x"4C", -- 0x01F0 + x"3E",x"01",x"32",x"0A",x"4C",x"CD",x"83",x"0B", -- 0x01F8 + x"CD",x"83",x"0B",x"CD",x"83",x"0B",x"AF",x"32", -- 0x0200 + x"0A",x"4C",x"CD",x"83",x"0B",x"3A",x"2E",x"4C", -- 0x0208 + x"3C",x"FE",x"06",x"38",x"0F",x"CD",x"3C",x"0B", -- 0x0210 + x"3A",x"39",x"4C",x"B7",x"20",x"05",x"3E",x"02", -- 0x0218 + x"32",x"2B",x"4C",x"AF",x"32",x"2E",x"4C",x"3A", -- 0x0220 + x"31",x"4C",x"32",x"33",x"4C",x"3A",x"32",x"4C", -- 0x0228 + x"32",x"34",x"4C",x"3A",x"04",x"4C",x"32",x"31", -- 0x0230 + x"4C",x"3A",x"05",x"4C",x"32",x"32",x"4C",x"ED", -- 0x0238 + x"5B",x"1D",x"4C",x"7A",x"C6",x"10",x"57",x"CD", -- 0x0240 + x"4B",x"0C",x"20",x"0E",x"ED",x"5B",x"1D",x"4C", -- 0x0248 + x"1C",x"7A",x"C6",x"10",x"57",x"CD",x"4B",x"0C", -- 0x0250 + x"28",x"41",x"3A",x"2C",x"4C",x"FE",x"00",x"28", -- 0x0258 + x"1E",x"3A",x"1F",x"4C",x"E6",x"02",x"28",x"08", -- 0x0260 + x"3A",x"31",x"4C",x"2F",x"E6",x"02",x"20",x"0D", -- 0x0268 + x"3A",x"31",x"4C",x"E6",x"FB",x"F6",x"02",x"32", -- 0x0270 + x"31",x"4C",x"32",x"26",x"4C",x"18",x"1C",x"3A", -- 0x0278 + x"1F",x"4C",x"E6",x"02",x"20",x"08",x"3A",x"31", -- 0x0280 + x"4C",x"2F",x"E6",x"04",x"20",x"0D",x"3A",x"31", -- 0x0288 + x"4C",x"E6",x"FD",x"F6",x"04",x"32",x"31",x"4C", -- 0x0290 + x"32",x"26",x"4C",x"3A",x"24",x"4C",x"B7",x"28", -- 0x0298 + x"06",x"3A",x"25",x"4C",x"32",x"31",x"4C",x"3A", -- 0x02A0 + x"31",x"4C",x"CB",x"4F",x"20",x"6F",x"F6",x"04", -- 0x02A8 + x"32",x"31",x"4C",x"32",x"26",x"4C",x"32",x"25", -- 0x02B0 + x"4C",x"3A",x"1F",x"4C",x"CB",x"4F",x"20",x"10", -- 0x02B8 + x"3A",x"31",x"4C",x"F6",x"02",x"32",x"31",x"4C", -- 0x02C0 + x"32",x"26",x"4C",x"32",x"25",x"4C",x"18",x"45", -- 0x02C8 + x"D6",x"04",x"E6",x"0F",x"32",x"1F",x"4C",x"FE", -- 0x02D0 + x"0E",x"20",x"3A",x"ED",x"5B",x"1D",x"4C",x"1D", -- 0x02D8 + x"CD",x"3A",x"0C",x"20",x"2B",x"ED",x"5B",x"1D", -- 0x02E0 + x"4C",x"1D",x"7A",x"C6",x"08",x"57",x"CD",x"3A", -- 0x02E8 + x"0C",x"20",x"1D",x"ED",x"5B",x"1D",x"4C",x"1D", -- 0x02F0 + x"7A",x"C6",x"0F",x"57",x"CD",x"3A",x"0C",x"20", -- 0x02F8 + x"0F",x"3A",x"1D",x"4C",x"3D",x"32",x"1D",x"4C", -- 0x0300 + x"FE",x"FF",x"20",x"11",x"3C",x"32",x"1D",x"4C", -- 0x0308 + x"3E",x"02",x"32",x"1F",x"4C",x"3A",x"1F",x"4C", -- 0x0310 + x"F6",x"02",x"32",x"1F",x"4C",x"3A",x"31",x"4C", -- 0x0318 + x"CB",x"57",x"20",x"70",x"F6",x"02",x"32",x"31", -- 0x0320 + x"4C",x"32",x"26",x"4C",x"32",x"25",x"4C",x"3A", -- 0x0328 + x"1F",x"4C",x"CB",x"4F",x"28",x"10",x"3A",x"31", -- 0x0330 + x"4C",x"F6",x"04",x"32",x"31",x"4C",x"32",x"26", -- 0x0338 + x"4C",x"32",x"25",x"4C",x"18",x"46",x"C6",x"04", -- 0x0340 + x"E6",x"0F",x"32",x"1F",x"4C",x"20",x"3D",x"ED", -- 0x0348 + x"5B",x"1D",x"4C",x"1C",x"1C",x"CD",x"3A",x"0C", -- 0x0350 + x"20",x"2D",x"ED",x"5B",x"1D",x"4C",x"1C",x"1C", -- 0x0358 + x"7A",x"C6",x"08",x"57",x"CD",x"3A",x"0C",x"20", -- 0x0360 + x"1E",x"ED",x"5B",x"1D",x"4C",x"1C",x"1C",x"7A", -- 0x0368 + x"C6",x"0F",x"57",x"CD",x"3A",x"0C",x"20",x"0F", -- 0x0370 + x"3A",x"1D",x"4C",x"3C",x"FE",x"1B",x"32",x"1D", -- 0x0378 + x"4C",x"20",x"11",x"3D",x"32",x"1D",x"4C",x"3E", -- 0x0380 + x"0C",x"32",x"1F",x"4C",x"3A",x"1F",x"4C",x"E6", -- 0x0388 + x"FD",x"32",x"1F",x"4C",x"3A",x"32",x"4C",x"CB", -- 0x0390 + x"57",x"20",x"25",x"3A",x"24",x"4C",x"B7",x"20", -- 0x0398 + x"1F",x"AF",x"32",x"23",x"4C",x"3E",x"01",x"32", -- 0x03A0 + x"24",x"4C",x"3E",x"FC",x"32",x"22",x"4C",x"3A", -- 0x03A8 + x"1E",x"4C",x"32",x"28",x"4C",x"3A",x"31",x"4C", -- 0x03B0 + x"32",x"25",x"4C",x"3E",x"01",x"32",x"2A",x"4C", -- 0x03B8 + x"3A",x"24",x"4C",x"B7",x"CA",x"BB",x"04",x"3C", -- 0x03C0 + x"32",x"24",x"4C",x"ED",x"5B",x"22",x"4C",x"3A", -- 0x03C8 + x"1E",x"4C",x"83",x"32",x"1E",x"4C",x"3A",x"24", -- 0x03D0 + x"4C",x"E6",x"01",x"28",x"0D",x"7B",x"CB",x"7F", -- 0x03D8 + x"20",x"04",x"FE",x"04",x"30",x"04",x"3C",x"32", -- 0x03E0 + x"22",x"4C",x"3A",x"22",x"4C",x"CB",x"7F",x"C2", -- 0x03E8 + x"53",x"04",x"FE",x"03",x"38",x"5D",x"ED",x"5B", -- 0x03F0 + x"1D",x"4C",x"7A",x"C6",x"10",x"57",x"CD",x"1B", -- 0x03F8 + x"0C",x"28",x"20",x"AF",x"32",x"22",x"4C",x"32", -- 0x0400 + x"24",x"4C",x"3A",x"1E",x"4C",x"E6",x"F8",x"32", -- 0x0408 + x"1E",x"4C",x"3A",x"28",x"4C",x"C6",x"18",x"5F", -- 0x0410 + x"3A",x"1E",x"4C",x"BB",x"38",x"05",x"3E",x"02", -- 0x0418 + x"32",x"2B",x"4C",x"ED",x"5B",x"1D",x"4C",x"1C", -- 0x0420 + x"7A",x"C6",x"10",x"57",x"CD",x"1B",x"0C",x"28", -- 0x0428 + x"20",x"AF",x"32",x"22",x"4C",x"32",x"24",x"4C", -- 0x0430 + x"3A",x"1E",x"4C",x"E6",x"F8",x"32",x"1E",x"4C", -- 0x0438 + x"3A",x"28",x"4C",x"C6",x"18",x"5F",x"3A",x"1E", -- 0x0440 + x"4C",x"BB",x"38",x"05",x"3E",x"02",x"32",x"2B", -- 0x0448 + x"4C",x"18",x"56",x"ED",x"5B",x"1D",x"4C",x"15", -- 0x0450 + x"CD",x"3A",x"0C",x"20",x"0B",x"ED",x"5B",x"1D", -- 0x0458 + x"4C",x"1C",x"15",x"CD",x"3A",x"0C",x"28",x"41", -- 0x0460 + x"3A",x"22",x"4C",x"CB",x"7F",x"28",x"3A",x"AF", -- 0x0468 + x"32",x"22",x"4C",x"3E",x"FF",x"32",x"25",x"4C", -- 0x0470 + x"32",x"26",x"4C",x"3A",x"1E",x"4C",x"3D",x"E6", -- 0x0478 + x"78",x"C6",x"08",x"32",x"1E",x"4C",x"ED",x"5B", -- 0x0480 + x"1D",x"4C",x"7A",x"C6",x"10",x"57",x"D5",x"CD", -- 0x0488 + x"1B",x"0C",x"D1",x"20",x"06",x"1C",x"CD",x"1B", -- 0x0490 + x"0C",x"28",x"0E",x"AF",x"32",x"24",x"4C",x"32", -- 0x0498 + x"22",x"4C",x"3E",x"FF",x"32",x"25",x"4C",x"18", -- 0x04A0 + x"43",x"3A",x"23",x"4C",x"3C",x"32",x"23",x"4C", -- 0x04A8 + x"FE",x"11",x"38",x"38",x"3E",x"FF",x"32",x"25", -- 0x04B0 + x"4C",x"18",x"31",x"3A",x"24",x"4C",x"B7",x"20", -- 0x04B8 + x"2B",x"ED",x"5B",x"1D",x"4C",x"7A",x"C6",x"10", -- 0x04C0 + x"57",x"D5",x"CD",x"1B",x"0C",x"D1",x"20",x"1C", -- 0x04C8 + x"1C",x"CD",x"1B",x"0C",x"20",x"16",x"AF",x"32", -- 0x04D0 + x"22",x"4C",x"3E",x"FF",x"32",x"25",x"4C",x"3E", -- 0x04D8 + x"01",x"32",x"24",x"4C",x"3A",x"1E",x"4C",x"C6", -- 0x04E0 + x"10",x"32",x"28",x"4C",x"ED",x"5B",x"1D",x"4C", -- 0x04E8 + x"CB",x"23",x"CB",x"23",x"CB",x"23",x"ED",x"4B", -- 0x04F0 + x"1F",x"4C",x"D5",x"79",x"E6",x"0C",x"1F",x"D1", -- 0x04F8 + x"83",x"32",x"29",x"4C",x"ED",x"5B",x"1D",x"4C", -- 0x0500 + x"CB",x"23",x"CB",x"23",x"CB",x"23",x"ED",x"4B", -- 0x0508 + x"1F",x"4C",x"CB",x"49",x"28",x"04",x"79",x"EE", -- 0x0510 + x"0C",x"4F",x"3E",x"00",x"CD",x"D5",x"0B",x"DD", -- 0x0518 + x"21",x"71",x"4C",x"06",x"01",x"3A",x"41",x"4C", -- 0x0520 + x"B7",x"28",x"21",x"4F",x"C5",x"DD",x"5E",x"01", -- 0x0528 + x"CB",x"23",x"CB",x"23",x"CB",x"23",x"DD",x"56", -- 0x0530 + x"02",x"DD",x"4E",x"00",x"78",x"06",x"01",x"CD", -- 0x0538 + x"D5",x"0B",x"C1",x"11",x"07",x"00",x"DD",x"19", -- 0x0540 + x"04",x"0D",x"20",x"E0",x"DD",x"21",x"8D",x"4C", -- 0x0548 + x"3A",x"42",x"4C",x"B7",x"28",x"21",x"4F",x"C5", -- 0x0550 + x"DD",x"5E",x"01",x"CB",x"23",x"CB",x"23",x"CB", -- 0x0558 + x"23",x"DD",x"56",x"02",x"DD",x"4E",x"00",x"78", -- 0x0560 + x"06",x"01",x"CD",x"D5",x"0B",x"C1",x"11",x"07", -- 0x0568 + x"00",x"DD",x"19",x"04",x"0D",x"20",x"E0",x"78", -- 0x0570 + x"FE",x"08",x"28",x"0C",x"11",x"F0",x"F0",x"DD", -- 0x0578 + x"4E",x"00",x"CD",x"D5",x"0B",x"04",x"18",x"EF", -- 0x0580 + x"3E",x"01",x"32",x"50",x"4C",x"3A",x"24",x"4C", -- 0x0588 + x"B7",x"20",x"43",x"ED",x"5B",x"1D",x"4C",x"7A", -- 0x0590 + x"C6",x"10",x"57",x"CD",x"0F",x"0C",x"FE",x"68", -- 0x0598 + x"38",x"12",x"FE",x"A0",x"30",x"0E",x"3C",x"77", -- 0x05A0 + x"E6",x"07",x"20",x"08",x"36",x"03",x"CB",x"D4", -- 0x05A8 + x"3A",x"36",x"4C",x"77",x"ED",x"5B",x"1D",x"4C", -- 0x05B0 + x"1C",x"7A",x"C6",x"10",x"57",x"CD",x"0F",x"0C", -- 0x05B8 + x"FE",x"68",x"38",x"12",x"FE",x"A0",x"30",x"0E", -- 0x05C0 + x"3C",x"77",x"E6",x"07",x"20",x"08",x"36",x"03", -- 0x05C8 + x"CB",x"D4",x"3A",x"36",x"4C",x"77",x"ED",x"5B", -- 0x05D0 + x"1D",x"4C",x"CD",x"7A",x"0A",x"1C",x"CD",x"7A", -- 0x05D8 + x"0A",x"7A",x"C6",x"08",x"57",x"CD",x"7A",x"0A", -- 0x05E0 + x"1D",x"CD",x"7A",x"0A",x"7A",x"C6",x"07",x"57", -- 0x05E8 + x"CD",x"7A",x"0A",x"1C",x"CD",x"7A",x"0A",x"DD", -- 0x05F0 + x"21",x"71",x"4C",x"3A",x"41",x"4C",x"B7",x"28", -- 0x05F8 + x"61",x"47",x"DD",x"7E",x"03",x"DD",x"86",x"06", -- 0x0600 + x"DD",x"77",x"03",x"1F",x"1F",x"1F",x"DD",x"77", -- 0x0608 + x"01",x"DD",x"7E",x"03",x"DD",x"BE",x"04",x"38", -- 0x0610 + x"05",x"DD",x"BE",x"05",x"38",x"08",x"DD",x"7E", -- 0x0618 + x"06",x"2F",x"3C",x"DD",x"77",x"06",x"DD",x"7E", -- 0x0620 + x"03",x"E6",x"06",x"87",x"4F",x"DD",x"7E",x"00", -- 0x0628 + x"E6",x"F0",x"B1",x"DD",x"77",x"00",x"DD",x"CB", -- 0x0630 + x"06",x"7E",x"28",x"08",x"DD",x"7E",x"00",x"EE", -- 0x0638 + x"0E",x"DD",x"77",x"00",x"DD",x"5E",x"03",x"DD", -- 0x0640 + x"56",x"02",x"2A",x"1D",x"4C",x"3A",x"29",x"4C", -- 0x0648 + x"6F",x"CD",x"FA",x"09",x"38",x"05",x"3E",x"02", -- 0x0650 + x"32",x"2B",x"4C",x"11",x"07",x"00",x"DD",x"19", -- 0x0658 + x"10",x"A0",x"DD",x"21",x"8D",x"4C",x"3A",x"42", -- 0x0660 + x"4C",x"B7",x"CA",x"2C",x"07",x"47",x"DD",x"7E", -- 0x0668 + x"06",x"B7",x"28",x"11",x"3A",x"2F",x"4C",x"FE", -- 0x0670 + x"07",x"28",x"04",x"FE",x"0B",x"20",x"06",x"11", -- 0x0678 + x"0E",x"0A",x"CD",x"26",x"0A",x"DD",x"7E",x"02", -- 0x0680 + x"DD",x"86",x"06",x"DD",x"77",x"02",x"DD",x"BE", -- 0x0688 + x"04",x"38",x"05",x"DD",x"BE",x"05",x"38",x"4A", -- 0x0690 + x"DD",x"7E",x"06",x"2F",x"3C",x"DD",x"77",x"06", -- 0x0698 + x"3A",x"2F",x"4C",x"FE",x"07",x"28",x"37",x"FE", -- 0x06A0 + x"0B",x"28",x"33",x"FE",x"0D",x"28",x"13",x"FE", -- 0x06A8 + x"04",x"28",x"02",x"18",x"2D",x"3A",x"3C",x"4C", -- 0x06B0 + x"B7",x"20",x"27",x"3E",x"00",x"DD",x"77",x"06", -- 0x06B8 + x"18",x"20",x"DD",x"7E",x"03",x"C6",x"40",x"DD", -- 0x06C0 + x"77",x"03",x"1F",x"1F",x"1F",x"DD",x"77",x"01", -- 0x06C8 + x"AF",x"DD",x"77",x"02",x"DD",x"7E",x"06",x"2F", -- 0x06D0 + x"3C",x"DD",x"77",x"06",x"18",x"04",x"AF",x"32", -- 0x06D8 + x"42",x"4C",x"3A",x"30",x"4C",x"E6",x"03",x"20", -- 0x06E0 + x"23",x"DD",x"7E",x"00",x"FE",x"20",x"38",x"1C", -- 0x06E8 + x"FE",x"A0",x"38",x"13",x"C6",x"04",x"DD",x"77", -- 0x06F0 + x"00",x"E6",x"0C",x"FE",x"00",x"20",x"0D",x"DD", -- 0x06F8 + x"7E",x"00",x"D6",x"10",x"DD",x"77",x"00",x"EE", -- 0x0700 + x"04",x"DD",x"77",x"00",x"DD",x"5E",x"03",x"DD", -- 0x0708 + x"56",x"02",x"2A",x"1D",x"4C",x"3A",x"29",x"4C", -- 0x0710 + x"6F",x"CD",x"FA",x"09",x"38",x"05",x"3E",x"02", -- 0x0718 + x"32",x"2B",x"4C",x"11",x"07",x"00",x"DD",x"19", -- 0x0720 + x"05",x"C2",x"6E",x"06",x"3A",x"07",x"4C",x"E6", -- 0x0728 + x"20",x"28",x"0A",x"3A",x"05",x"4C",x"E6",x"60", -- 0x0730 + x"20",x"03",x"C3",x"58",x"01",x"3A",x"2B",x"4C", -- 0x0738 + x"B7",x"CA",x"ED",x"01",x"FE",x"01",x"28",x"1C", -- 0x0740 + x"3E",x"40",x"32",x"4E",x"4C",x"3A",x"27",x"4C", -- 0x0748 + x"3D",x"32",x"27",x"4C",x"C2",x"E0",x"01",x"AF", -- 0x0750 + x"32",x"47",x"4C",x"32",x"24",x"4C",x"CD",x"19", -- 0x0758 + x"09",x"C3",x"58",x"01",x"AF",x"32",x"24",x"4C", -- 0x0760 + x"3A",x"39",x"4C",x"B7",x"28",x"11",x"32",x"4A", -- 0x0768 + x"4C",x"CD",x"83",x"0B",x"CD",x"3C",x"0B",x"11", -- 0x0770 + x"14",x"0A",x"CD",x"26",x"0A",x"18",x"E5",x"3A", -- 0x0778 + x"2F",x"4C",x"3C",x"32",x"2F",x"4C",x"FE",x"14", -- 0x0780 + x"DA",x"E0",x"01",x"AF",x"32",x"2F",x"4C",x"C3", -- 0x0788 + x"E0",x"01",x"3A",x"2F",x"4C",x"FE",x"12",x"C0", -- 0x0790 + x"11",x"14",x"00",x"CD",x"6D",x"0B",x"CB",x"D4", -- 0x0798 + x"11",x"14",x"00",x"7E",x"FE",x"18",x"20",x"34", -- 0x07A0 + x"7E",x"FE",x"18",x"20",x"24",x"36",x"0F",x"2C", -- 0x07A8 + x"14",x"18",x"F5",x"01",x"E1",x"FF",x"09",x"15", -- 0x07B0 + x"1D",x"7E",x"FE",x"18",x"28",x"EA",x"18",x"1C", -- 0x07B8 + x"7E",x"FE",x"18",x"20",x"EE",x"36",x"0F",x"01", -- 0x07C0 + x"20",x"00",x"09",x"1D",x"FA",x"DC",x"07",x"18", -- 0x07C8 + x"EF",x"01",x"1F",x"00",x"09",x"15",x"1D",x"7E", -- 0x07D0 + x"FE",x"18",x"28",x"E9",x"21",x"A4",x"47",x"36", -- 0x07D8 + x"0F",x"2E",x"84",x"36",x"0F",x"DD",x"21",x"71", -- 0x07E0 + x"4C",x"3A",x"41",x"4C",x"B7",x"28",x"31",x"47", -- 0x07E8 + x"DD",x"5E",x"03",x"DD",x"56",x"02",x"CB",x"3B", -- 0x07F0 + x"CB",x"3B",x"CB",x"3B",x"CB",x"3A",x"CB",x"3A", -- 0x07F8 + x"CB",x"3A",x"CD",x"6D",x"0B",x"CB",x"D4",x"CD", -- 0x0800 + x"0B",x"09",x"2C",x"CD",x"0B",x"09",x"11",x"E0", -- 0x0808 + x"FF",x"19",x"CD",x"0B",x"09",x"2D",x"CD",x"0B", -- 0x0810 + x"09",x"11",x"07",x"00",x"DD",x"19",x"10",x"D0", -- 0x0818 + x"DD",x"21",x"8D",x"4C",x"3A",x"42",x"4C",x"B7", -- 0x0820 + x"CA",x"5E",x"08",x"47",x"DD",x"5E",x"03",x"DD", -- 0x0828 + x"56",x"02",x"CB",x"3B",x"CB",x"3B",x"CB",x"3B", -- 0x0830 + x"CB",x"3A",x"CB",x"3A",x"CB",x"3A",x"CD",x"6D", -- 0x0838 + x"0B",x"CB",x"D4",x"CD",x"0B",x"09",x"2C",x"CD", -- 0x0840 + x"0B",x"09",x"11",x"E0",x"FF",x"19",x"CD",x"0B", -- 0x0848 + x"09",x"2D",x"CD",x"0B",x"09",x"11",x"07",x"00", -- 0x0850 + x"DD",x"19",x"05",x"C2",x"2C",x"08",x"3A",x"2F", -- 0x0858 + x"4C",x"FE",x"12",x"C0",x"11",x"14",x"00",x"CD", -- 0x0860 + x"6D",x"0B",x"CB",x"D4",x"11",x"14",x"00",x"01", -- 0x0868 + x"20",x"00",x"7E",x"FE",x"16",x"28",x"13",x"FE", -- 0x0870 + x"0F",x"20",x"16",x"36",x"18",x"2C",x"14",x"18", -- 0x0878 + x"F1",x"7E",x"FE",x"16",x"28",x"F5",x"FE",x"0F", -- 0x0880 + x"20",x"07",x"36",x"18",x"09",x"1D",x"F2",x"81", -- 0x0888 + x"08",x"DD",x"21",x"71",x"4C",x"3A",x"41",x"4C", -- 0x0890 + x"B7",x"28",x"31",x"47",x"DD",x"5E",x"03",x"DD", -- 0x0898 + x"56",x"02",x"CB",x"3B",x"CB",x"3B",x"CB",x"3B", -- 0x08A0 + x"CB",x"3A",x"CB",x"3A",x"CB",x"3A",x"CD",x"6D", -- 0x08A8 + x"0B",x"CB",x"D4",x"CD",x"12",x"09",x"2C",x"CD", -- 0x08B0 + x"12",x"09",x"11",x"E0",x"FF",x"19",x"CD",x"12", -- 0x08B8 + x"09",x"2D",x"CD",x"12",x"09",x"11",x"07",x"00", -- 0x08C0 + x"DD",x"19",x"10",x"D0",x"DD",x"21",x"8D",x"4C", -- 0x08C8 + x"3A",x"42",x"4C",x"B7",x"CA",x"0A",x"09",x"47", -- 0x08D0 + x"DD",x"5E",x"03",x"DD",x"56",x"02",x"CB",x"3B", -- 0x08D8 + x"CB",x"3B",x"CB",x"3B",x"CB",x"3A",x"CB",x"3A", -- 0x08E0 + x"CB",x"3A",x"CD",x"6D",x"0B",x"CB",x"D4",x"CD", -- 0x08E8 + x"12",x"09",x"2C",x"CD",x"12",x"09",x"11",x"E0", -- 0x08F0 + x"FF",x"19",x"CD",x"12",x"09",x"2D",x"CD",x"12", -- 0x08F8 + x"09",x"11",x"07",x"00",x"DD",x"19",x"05",x"C2", -- 0x0900 + x"D8",x"08",x"C9",x"7E",x"FE",x"0F",x"C0",x"36", -- 0x0908 + x"16",x"C9",x"7E",x"FE",x"18",x"C8",x"36",x"0F", -- 0x0910 + x"C9",x"AF",x"32",x"50",x"4C",x"CD",x"83",x"0B", -- 0x0918 + x"11",x"00",x"00",x"06",x"1C",x"D5",x"C5",x"CD", -- 0x0920 + x"6D",x"0B",x"06",x"10",x"AF",x"36",x"03",x"CB", -- 0x0928 + x"D4",x"77",x"CB",x"94",x"2C",x"10",x"F6",x"C1", -- 0x0930 + x"D1",x"1C",x"10",x"E9",x"CD",x"CB",x"0E",x"3E", -- 0x0938 + x"60",x"32",x"1E",x"4C",x"CD",x"83",x"0B",x"ED", -- 0x0940 + x"5F",x"11",x"00",x"00",x"06",x"1C",x"D5",x"C5", -- 0x0948 + x"F5",x"CD",x"6D",x"0B",x"F1",x"06",x"10",x"CB", -- 0x0950 + x"D4",x"77",x"2C",x"10",x"FA",x"C1",x"D1",x"1C", -- 0x0958 + x"10",x"EC",x"21",x"20",x"46",x"3A",x"1E",x"4C", -- 0x0960 + x"47",x"3E",x"60",x"90",x"1F",x"1F",x"1F",x"E6", -- 0x0968 + x"1F",x"3C",x"47",x"3E",x"01",x"77",x"2C",x"10", -- 0x0970 + x"FC",x"ED",x"4B",x"1E",x"4C",x"3E",x"61",x"91", -- 0x0978 + x"1F",x"1F",x"1F",x"E6",x"1F",x"57",x"1E",x"0C", -- 0x0980 + x"CD",x"6D",x"0B",x"36",x"17",x"CB",x"D4",x"36", -- 0x0988 + x"01",x"11",x"5D",x"70",x"01",x"14",x"01",x"3E", -- 0x0990 + x"02",x"CD",x"D5",x"0B",x"11",x"60",x"60",x"01", -- 0x0998 + x"00",x"01",x"3E",x"01",x"CD",x"D5",x"0B",x"11", -- 0x09A0 + x"5E",x"00",x"ED",x"4B",x"1E",x"4C",x"3E",x"61", -- 0x09A8 + x"91",x"57",x"01",x"18",x"01",x"3E",x"00",x"CD", -- 0x09B0 + x"D5",x"0B",x"3A",x"1E",x"4C",x"3D",x"32",x"1E", -- 0x09B8 + x"4C",x"F5",x"CB",x"3F",x"CB",x"3F",x"32",x"4A", -- 0x09C0 + x"4C",x"F1",x"C2",x"44",x"09",x"11",x"00",x"00", -- 0x09C8 + x"06",x"1C",x"AF",x"D5",x"C5",x"F5",x"CD",x"6D", -- 0x09D0 + x"0B",x"F1",x"06",x"10",x"CB",x"D4",x"77",x"2C", -- 0x09D8 + x"10",x"FA",x"C1",x"D1",x"1C",x"10",x"EC",x"21", -- 0x09E0 + x"20",x"46",x"06",x"0C",x"3E",x"01",x"77",x"2C", -- 0x09E8 + x"10",x"FC",x"06",x"FA",x"CD",x"83",x"0B",x"10", -- 0x09F0 + x"FB",x"C9",x"7D",x"C6",x"06",x"BB",x"D8",x"7B", -- 0x09F8 + x"C6",x"06",x"BD",x"D8",x"7C",x"C6",x"0F",x"BA", -- 0x0A00 + x"D8",x"7A",x"C6",x"0F",x"BC",x"C9",x"00",x"00", -- 0x0A08 + x"01",x"00",x"00",x"00",x"08",x"00",x"00",x"00", -- 0x0A10 + x"00",x"00",x"00",x"00",x"01",x"00",x"00",x"00", -- 0x0A18 + x"00",x"05",x"02",x"00",x"00",x"00",x"E5",x"C5", -- 0x0A20 + x"21",x"12",x"4C",x"01",x"00",x"06",x"1A",x"86", -- 0x0A28 + x"81",x"77",x"0E",x"00",x"FE",x"3A",x"38",x"04", -- 0x0A30 + x"D6",x"0A",x"77",x"0C",x"2B",x"13",x"10",x"EE", -- 0x0A38 + x"21",x"0D",x"4C",x"11",x"14",x"4C",x"06",x"06", -- 0x0A40 + x"1A",x"BE",x"28",x"0E",x"30",x"10",x"21",x"0D", -- 0x0A48 + x"4C",x"11",x"14",x"4C",x"01",x"06",x"00",x"EF", -- 0x0A50 + x"18",x"04",x"23",x"13",x"10",x"EA",x"CD",x"AE", -- 0x0A58 + x"0E",x"C1",x"E1",x"C9",x"CD",x"83",x"0B",x"3A", -- 0x0A60 + x"40",x"50",x"E6",x"20",x"20",x"F6",x"C9",x"CD", -- 0x0A68 + x"83",x"0B",x"3A",x"40",x"50",x"E6",x"20",x"28", -- 0x0A70 + x"F6",x"C9",x"D5",x"CD",x"0F",x"0C",x"D1",x"FE", -- 0x0A78 + x"18",x"D8",x"FE",x"20",x"DA",x"10",x"0B",x"FE", -- 0x0A80 + x"30",x"D8",x"FE",x"40",x"DA",x"10",x"0B",x"FE", -- 0x0A88 + x"FE",x"D2",x"16",x"0B",x"FE",x"DE",x"38",x"05", -- 0x0A90 + x"FE",x"E0",x"DA",x"16",x"0B",x"FE",x"44",x"28", -- 0x0A98 + x"42",x"FE",x"45",x"28",x"3E",x"FE",x"46",x"C0", -- 0x0AA0 + x"36",x"47",x"7B",x"FE",x"11",x"38",x"23",x"3A", -- 0x0AA8 + x"8D",x"4C",x"C6",x"08",x"32",x"8D",x"4C",x"3E", -- 0x0AB0 + x"04",x"32",x"93",x"4C",x"E5",x"D5",x"21",x"E2", -- 0x0AB8 + x"41",x"AF",x"77",x"11",x"E0",x"FF",x"19",x"77", -- 0x0AC0 + x"CB",x"D4",x"77",x"AF",x"ED",x"52",x"77",x"D1", -- 0x0AC8 + x"E1",x"C9",x"E5",x"D5",x"21",x"AB",x"41",x"AF", -- 0x0AD0 + x"77",x"2C",x"77",x"CB",x"D4",x"77",x"2D",x"77", -- 0x0AD8 + x"D1",x"E1",x"C9",x"36",x"03",x"CB",x"D4",x"3A", -- 0x0AE0 + x"36",x"4C",x"77",x"3A",x"3C",x"4C",x"3D",x"32", -- 0x0AE8 + x"3C",x"4C",x"D5",x"11",x"1A",x"0A",x"CD",x"26", -- 0x0AF0 + x"0A",x"D1",x"3E",x"02",x"32",x"4F",x"4C",x"3A", -- 0x0AF8 + x"2F",x"4C",x"FE",x"04",x"C0",x"3A",x"3C",x"4C", -- 0x0B00 + x"B7",x"C0",x"3E",x"01",x"32",x"93",x"4C",x"C9", -- 0x0B08 + x"3E",x"02",x"32",x"2B",x"4C",x"C9",x"3A",x"3C", -- 0x0B10 + x"4C",x"B7",x"C0",x"D5",x"3A",x"29",x"4C",x"C6", -- 0x0B18 + x"05",x"1F",x"1F",x"1F",x"E6",x"1F",x"5F",x"3A", -- 0x0B20 + x"1E",x"4C",x"C6",x"08",x"57",x"CD",x"0F",x"0C", -- 0x0B28 + x"D1",x"E6",x"DE",x"FE",x"DE",x"C0",x"3E",x"01", -- 0x0B30 + x"32",x"2B",x"4C",x"C9",x"3A",x"39",x"4C",x"B7", -- 0x0B38 + x"28",x"25",x"3D",x"32",x"39",x"4C",x"1F",x"1F", -- 0x0B40 + x"1F",x"E6",x"1F",x"C6",x"04",x"5F",x"16",x"11", -- 0x0B48 + x"CD",x"6D",x"0B",x"3A",x"39",x"4C",x"E6",x"07", -- 0x0B50 + x"C6",x"60",x"77",x"E6",x"07",x"FE",x"07",x"C0", -- 0x0B58 + x"11",x"E0",x"FF",x"19",x"36",x"A0",x"C9",x"21", -- 0x0B60 + x"31",x"43",x"36",x"A0",x"C9",x"7A",x"C6",x"A0", -- 0x0B68 + x"6F",x"26",x"43",x"7B",x"11",x"E0",x"FF",x"B7", -- 0x0B70 + x"C8",x"1F",x"30",x"01",x"19",x"EB",x"29",x"EB", -- 0x0B78 + x"C3",x"77",x"0B",x"E5",x"2A",x"00",x"4C",x"AF", -- 0x0B80 + x"32",x"C0",x"50",x"3A",x"00",x"4C",x"BD",x"28", -- 0x0B88 + x"F6",x"E1",x"C9",x"7E",x"23",x"B7",x"C8",x"C6", -- 0x0B90 + x"80",x"12",x"CB",x"D2",x"79",x"12",x"7B",x"D6", -- 0x0B98 + x"20",x"5F",x"CB",x"92",x"7A",x"DE",x"00",x"57", -- 0x0BA0 + x"C3",x"93",x"0B",x"7C",x"CD",x"B0",x"0B",x"7D", -- 0x0BA8 + x"F5",x"1F",x"1F",x"1F",x"1F",x"CD",x"B9",x"0B", -- 0x0BB0 + x"F1",x"E6",x"0F",x"FE",x"0A",x"38",x"02",x"C6", -- 0x0BB8 + x"07",x"C6",x"B0",x"E5",x"D5",x"F5",x"CD",x"6D", -- 0x0BC0 + x"0B",x"F1",x"77",x"CB",x"D4",x"36",x"12",x"CB", -- 0x0BC8 + x"94",x"D1",x"1C",x"E1",x"C9",x"F5",x"3E",x"F0", -- 0x0BD0 + x"BA",x"20",x"03",x"BB",x"28",x"2C",x"F1",x"3C", -- 0x0BD8 + x"D5",x"ED",x"5B",x"1C",x"4C",x"BB",x"38",x"03", -- 0x0BE0 + x"32",x"1C",x"4C",x"E6",x"07",x"87",x"5F",x"16", -- 0x0BE8 + x"00",x"21",x"51",x"4C",x"19",x"D1",x"71",x"23", -- 0x0BF0 + x"70",x"23",x"D5",x"11",x"0E",x"00",x"19",x"D1", -- 0x0BF8 + x"3E",x"EE",x"93",x"77",x"23",x"3E",x"00",x"92", -- 0x0C00 + x"77",x"C9",x"F1",x"3C",x"D5",x"18",x"DC",x"7A", -- 0x0C08 + x"1F",x"1F",x"1F",x"E6",x"1F",x"57",x"CD",x"6D", -- 0x0C10 + x"0B",x"7E",x"C9",x"CD",x"0F",x"0C",x"FE",x"05", -- 0x0C18 + x"38",x"14",x"FE",x"18",x"38",x"12",x"FE",x"20", -- 0x0C20 + x"38",x"0C",x"FE",x"30",x"38",x"0A",x"FE",x"48", -- 0x0C28 + x"38",x"04",x"FE",x"A0",x"38",x"02",x"AF",x"C9", -- 0x0C30 + x"B7",x"C9",x"CD",x"0F",x"0C",x"FE",x"20",x"38", -- 0x0C38 + x"04",x"FE",x"30",x"38",x"02",x"AF",x"C9",x"3E", -- 0x0C40 + x"01",x"B7",x"C9",x"CD",x"0F",x"0C",x"FE",x"48", -- 0x0C48 + x"38",x"04",x"FE",x"60",x"38",x"02",x"AF",x"C9", -- 0x0C50 + x"3E",x"01",x"B7",x"C9",x"32",x"36",x"4C",x"F5", -- 0x0C58 + x"AF",x"32",x"50",x"4C",x"CD",x"83",x"0B",x"F1", -- 0x0C60 + x"F3",x"E5",x"D5",x"C5",x"F5",x"21",x"00",x"40", -- 0x0C68 + x"11",x"01",x"40",x"01",x"00",x"04",x"36",x"03", -- 0x0C70 + x"ED",x"B0",x"01",x"40",x"00",x"36",x"00",x"ED", -- 0x0C78 + x"B0",x"01",x"80",x"03",x"77",x"ED",x"B0",x"36", -- 0x0C80 + x"00",x"01",x"3F",x"00",x"ED",x"B0",x"FB",x"CD", -- 0x0C88 + x"83",x"0B",x"F3",x"11",x"00",x"10",x"06",x"10", -- 0x0C90 + x"D5",x"C5",x"CD",x"6D",x"0B",x"11",x"E0",x"FF", -- 0x0C98 + x"CB",x"D4",x"06",x"20",x"36",x"00",x"19",x"10", -- 0x0CA0 + x"FB",x"C1",x"D1",x"14",x"10",x"EA",x"CD",x"69", -- 0x0CA8 + x"12",x"F1",x"C1",x"D1",x"E1",x"FB",x"C9",x"3A", -- 0x0CB0 + x"3C",x"4C",x"B7",x"C0",x"ED",x"5F",x"21",x"D8", -- 0x0CB8 + x"0C",x"E6",x"03",x"5F",x"16",x"00",x"19",x"7E", -- 0x0CC0 + x"2A",x"3F",x"4C",x"CB",x"D4",x"77",x"2C",x"77", -- 0x0CC8 + x"11",x"E0",x"FF",x"19",x"77",x"2D",x"77",x"C9", -- 0x0CD0 + x"09",x"11",x"14",x"17",x"C9",x"DD",x"2A",x"37", -- 0x0CD8 + x"4C",x"DD",x"7E",x"02",x"B7",x"C8",x"47",x"DD", -- 0x0CE0 + x"5E",x"00",x"DD",x"56",x"01",x"CD",x"6D",x"0B", -- 0x0CE8 + x"DD",x"7E",x"05",x"32",x"2C",x"4C",x"FE",x"00", -- 0x0CF0 + x"3A",x"30",x"4C",x"28",x"01",x"2F",x"E6",x"07", -- 0x0CF8 + x"DD",x"86",x"03",x"DD",x"4E",x"04",x"C3",x"09", -- 0x0D00 + x"0D",x"11",x"E0",x"FF",x"18",x"03",x"11",x"01", -- 0x0D08 + x"00",x"77",x"CB",x"D4",x"71",x"CB",x"94",x"19", -- 0x0D10 + x"10",x"F7",x"C9",x"6F",x"26",x"00",x"29",x"11", -- 0x0D18 + x"84",x"17",x"19",x"5E",x"23",x"56",x"D5",x"DD", -- 0x0D20 + x"E1",x"DD",x"7E",x"00",x"DD",x"23",x"CD",x"5C", -- 0x0D28 + x"0C",x"DD",x"5E",x"00",x"DD",x"56",x"01",x"CD", -- 0x0D30 + x"6D",x"0B",x"DD",x"7E",x"02",x"B7",x"28",x"1C", -- 0x0D38 + x"47",x"CB",x"B8",x"E6",x"80",x"DD",x"7E",x"03", -- 0x0D40 + x"DD",x"4E",x"04",x"11",x"05",x"00",x"DD",x"19", -- 0x0D48 + x"28",x"05",x"CD",x"0E",x"0D",x"18",x"DA",x"CD", -- 0x0D50 + x"09",x"0D",x"18",x"D5",x"22",x"3F",x"4C",x"36", -- 0x0D58 + x"DE",x"2C",x"36",x"FE",x"CB",x"D4",x"36",x"09", -- 0x0D60 + x"2D",x"36",x"09",x"CB",x"94",x"11",x"E0",x"FF", -- 0x0D68 + x"19",x"36",x"DF",x"2C",x"36",x"FF",x"CB",x"D4", -- 0x0D70 + x"36",x"09",x"2D",x"36",x"09",x"DD",x"7E",x"03", -- 0x0D78 + x"DD",x"4E",x"04",x"DD",x"46",x"05",x"11",x"06", -- 0x0D80 + x"00",x"DD",x"19",x"B7",x"28",x"16",x"F5",x"DD", -- 0x0D88 + x"5E",x"00",x"DD",x"56",x"01",x"DD",x"23",x"DD", -- 0x0D90 + x"23",x"CD",x"6D",x"0B",x"71",x"CB",x"D4",x"70", -- 0x0D98 + x"F1",x"3D",x"20",x"EA",x"DD",x"7E",x"00",x"DD", -- 0x0DA0 + x"4E",x"01",x"DD",x"46",x"02",x"11",x"03",x"00", -- 0x0DA8 + x"DD",x"19",x"B7",x"28",x"16",x"F5",x"DD",x"5E", -- 0x0DB0 + x"00",x"DD",x"56",x"01",x"DD",x"23",x"DD",x"23", -- 0x0DB8 + x"CD",x"6D",x"0B",x"71",x"CB",x"D4",x"70",x"F1", -- 0x0DC0 + x"3D",x"20",x"EA",x"21",x"B0",x"43",x"11",x"E0", -- 0x0DC8 + x"FF",x"06",x"1C",x"36",x"A0",x"CB",x"D4",x"36", -- 0x0DD0 + x"09",x"CB",x"94",x"19",x"10",x"F5",x"DD",x"5E", -- 0x0DD8 + x"00",x"DD",x"23",x"16",x"10",x"CD",x"6D",x"0B", -- 0x0DE0 + x"EB",x"DD",x"E5",x"E1",x"0E",x"09",x"CD",x"93", -- 0x0DE8 + x"0B",x"22",x"37",x"4C",x"11",x"06",x"00",x"19", -- 0x0DF0 + x"7E",x"32",x"1D",x"4C",x"FE",x"10",x"07",x"17", -- 0x0DF8 + x"E6",x"02",x"32",x"1F",x"4C",x"23",x"7E",x"87", -- 0x0E00 + x"87",x"87",x"32",x"1E",x"4C",x"23",x"3E",x"01", -- 0x0E08 + x"32",x"20",x"4C",x"AF",x"32",x"24",x"4C",x"32", -- 0x0E10 + x"22",x"4C",x"3E",x"FF",x"32",x"25",x"4C",x"22", -- 0x0E18 + x"3D",x"4C",x"7E",x"47",x"32",x"3C",x"4C",x"23", -- 0x0E20 + x"7E",x"32",x"3A",x"4C",x"23",x"7E",x"32",x"3B", -- 0x0E28 + x"4C",x"23",x"5E",x"23",x"56",x"23",x"E5",x"CD", -- 0x0E30 + x"6D",x"0B",x"3A",x"3A",x"4C",x"77",x"CB",x"D4", -- 0x0E38 + x"3A",x"3B",x"4C",x"77",x"E1",x"10",x"EB",x"7E", -- 0x0E40 + x"23",x"47",x"1F",x"1F",x"1F",x"1F",x"E6",x"07", -- 0x0E48 + x"32",x"41",x"4C",x"78",x"E6",x"07",x"32",x"42", -- 0x0E50 + x"4C",x"3A",x"41",x"4C",x"06",x"00",x"4F",x"87", -- 0x0E58 + x"81",x"87",x"81",x"4F",x"28",x"04",x"11",x"71", -- 0x0E60 + x"4C",x"EF",x"3A",x"42",x"4C",x"06",x"00",x"4F", -- 0x0E68 + x"87",x"81",x"87",x"81",x"4F",x"28",x"04",x"11", -- 0x0E70 + x"8D",x"4C",x"EF",x"21",x"1F",x"28",x"11",x"B1", -- 0x0E78 + x"43",x"0E",x"01",x"CD",x"93",x"0B",x"0E",x"05", -- 0x0E80 + x"CD",x"93",x"0B",x"3E",x"BF",x"32",x"39",x"4C", -- 0x0E88 + x"11",x"00",x"14",x"CD",x"6D",x"0B",x"3A",x"27", -- 0x0E90 + x"4C",x"47",x"11",x"C0",x"FF",x"36",x"DB",x"CB", -- 0x0E98 + x"D4",x"36",x"01",x"2C",x"36",x"01",x"CB",x"94", -- 0x0EA0 + x"36",x"FB",x"2D",x"19",x"10",x"EF",x"21",x"3D", -- 0x0EA8 + x"28",x"11",x"B3",x"43",x"0E",x"19",x"CD",x"93", -- 0x0EB0 + x"0B",x"21",x"14",x"4C",x"CD",x"93",x"0B",x"21", -- 0x0EB8 + x"46",x"28",x"CD",x"93",x"0B",x"21",x"0D",x"4C", -- 0x0EC0 + x"C3",x"93",x"0B",x"06",x"08",x"11",x"F0",x"F0", -- 0x0EC8 + x"3E",x"08",x"90",x"CD",x"D5",x"0B",x"10",x"F5", -- 0x0ED0 + x"C9",x"E5",x"CD",x"6D",x"0B",x"EB",x"E1",x"E5", -- 0x0ED8 + x"D5",x"C5",x"7D",x"2C",x"12",x"CB",x"D2",x"7C", -- 0x0EE0 + x"12",x"CB",x"92",x"3E",x"E0",x"83",x"5F",x"7A", -- 0x0EE8 + x"CE",x"FF",x"57",x"0D",x"20",x"EC",x"C1",x"D1", -- 0x0EF0 + x"E1",x"13",x"7D",x"C6",x"20",x"6F",x"10",x"DF", -- 0x0EF8 + x"C9",x"E5",x"CD",x"6D",x"0B",x"EB",x"E1",x"E5", -- 0x0F00 + x"D5",x"C5",x"7D",x"12",x"CB",x"D2",x"7C",x"12", -- 0x0F08 + x"CB",x"92",x"3E",x"E0",x"83",x"5F",x"7A",x"CE", -- 0x0F10 + x"FF",x"57",x"0D",x"20",x"ED",x"C1",x"D1",x"E1", -- 0x0F18 + x"13",x"10",x"E4",x"C9",x"AF",x"CD",x"5C",x"0C", -- 0x0F20 + x"21",x"50",x"0F",x"16",x"04",x"0E",x"17",x"1E", -- 0x0F28 + x"00",x"06",x"1B",x"7E",x"23",x"E6",x"01",x"28", -- 0x0F30 + x"0D",x"E5",x"D5",x"CD",x"6D",x"0B",x"36",x"A0", -- 0x0F38 + x"CB",x"D4",x"36",x"09",x"D1",x"E1",x"1C",x"10", -- 0x0F40 + x"EA",x"14",x"0D",x"20",x"E2",x"C3",x"CB",x"0E", -- 0x0F48 + x"30",x"30",x"30",x"30",x"30",x"31",x"31",x"31", -- 0x0F50 + x"31",x"30",x"30",x"30",x"31",x"31",x"31",x"30", -- 0x0F58 + x"30",x"30",x"31",x"31",x"31",x"30",x"30",x"30", -- 0x0F60 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0F68 + x"31",x"30",x"30",x"30",x"31",x"30",x"31",x"30", -- 0x0F70 + x"30",x"30",x"31",x"30",x"31",x"30",x"30",x"30", -- 0x0F78 + x"31",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0F80 + x"30",x"30",x"30",x"31",x"31",x"31",x"31",x"30", -- 0x0F88 + x"30",x"31",x"31",x"31",x"31",x"31",x"30",x"31", -- 0x0F90 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0F98 + x"30",x"30",x"30",x"30",x"30",x"30",x"31",x"30", -- 0x0FA0 + x"30",x"30",x"30",x"30",x"31",x"30",x"30",x"30", -- 0x0FA8 + x"31",x"30",x"31",x"30",x"30",x"30",x"31",x"30", -- 0x0FB0 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0FB8 + x"30",x"31",x"30",x"30",x"30",x"30",x"30",x"31", -- 0x0FC0 + x"30",x"30",x"30",x"31",x"30",x"30",x"31",x"31", -- 0x0FC8 + x"31",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0FD0 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0FD8 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0FE0 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0FE8 + x"30",x"30",x"31",x"30",x"30",x"30",x"31",x"30", -- 0x0FF0 + x"30",x"31",x"31",x"31",x"30",x"30",x"31",x"30", -- 0x0FF8 + x"30",x"30",x"31",x"30",x"31",x"31",x"31",x"30", -- 0x1000 + x"30",x"31",x"31",x"31",x"30",x"31",x"31",x"30", -- 0x1008 + x"31",x"31",x"30",x"31",x"30",x"30",x"30",x"31", -- 0x1010 + x"30",x"31",x"31",x"30",x"30",x"31",x"30",x"30", -- 0x1018 + x"31",x"30",x"30",x"31",x"30",x"30",x"30",x"31", -- 0x1020 + x"31",x"30",x"31",x"30",x"31",x"30",x"31",x"31", -- 0x1028 + x"31",x"31",x"31",x"30",x"31",x"30",x"31",x"30", -- 0x1030 + x"31",x"30",x"30",x"31",x"30",x"30",x"31",x"30", -- 0x1038 + x"30",x"30",x"30",x"31",x"30",x"30",x"30",x"31", -- 0x1040 + x"30",x"31",x"30",x"30",x"30",x"31",x"30",x"31", -- 0x1048 + x"30",x"30",x"31",x"31",x"30",x"30",x"31",x"30", -- 0x1050 + x"30",x"31",x"30",x"30",x"30",x"31",x"31",x"30", -- 0x1058 + x"30",x"30",x"31",x"30",x"31",x"30",x"30",x"30", -- 0x1060 + x"31",x"30",x"31",x"30",x"30",x"30",x"31",x"30", -- 0x1068 + x"31",x"31",x"31",x"30",x"30",x"31",x"31",x"31", -- 0x1070 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1078 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1080 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1088 + x"30",x"30",x"30",x"30",x"31",x"30",x"30",x"30", -- 0x1090 + x"31",x"30",x"31",x"31",x"31",x"30",x"31",x"30", -- 0x1098 + x"30",x"30",x"31",x"30",x"31",x"31",x"31",x"31", -- 0x10A0 + x"31",x"30",x"31",x"31",x"31",x"31",x"30",x"31", -- 0x10A8 + x"31",x"30",x"31",x"31",x"30",x"30",x"31",x"30", -- 0x10B0 + x"30",x"31",x"31",x"30",x"30",x"31",x"30",x"31", -- 0x10B8 + x"30",x"30",x"30",x"30",x"30",x"31",x"30",x"30", -- 0x10C0 + x"30",x"31",x"31",x"30",x"31",x"30",x"31",x"30", -- 0x10C8 + x"30",x"31",x"30",x"30",x"31",x"30",x"31",x"30", -- 0x10D0 + x"31",x"30",x"31",x"31",x"30",x"30",x"30",x"30", -- 0x10D8 + x"31",x"31",x"31",x"31",x"30",x"31",x"30",x"30", -- 0x10E0 + x"30",x"31",x"30",x"30",x"31",x"30",x"30",x"31", -- 0x10E8 + x"30",x"30",x"31",x"31",x"30",x"31",x"30",x"30", -- 0x10F0 + x"30",x"30",x"30",x"31",x"30",x"30",x"31",x"30", -- 0x10F8 + x"31",x"30",x"30",x"30",x"31",x"30",x"31",x"31", -- 0x1100 + x"31",x"30",x"31",x"30",x"30",x"30",x"31",x"30", -- 0x1108 + x"31",x"31",x"31",x"31",x"31",x"30",x"31",x"30", -- 0x1110 + x"30",x"30",x"31",x"30",x"30",x"30",x"30",x"30", -- 0x1118 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1120 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1128 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1130 + x"30",x"30",x"30",x"31",x"30",x"30",x"30",x"31", -- 0x1138 + x"30",x"30",x"31",x"31",x"31",x"30",x"30",x"31", -- 0x1140 + x"30",x"30",x"30",x"31",x"30",x"30",x"30",x"30", -- 0x1148 + x"30",x"30",x"30",x"30",x"30",x"30",x"31",x"31", -- 0x1150 + x"30",x"31",x"31",x"30",x"31",x"30",x"30",x"30", -- 0x1158 + x"31",x"30",x"31",x"31",x"30",x"30",x"31",x"30", -- 0x1160 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1168 + x"30",x"31",x"30",x"31",x"30",x"31",x"30",x"31", -- 0x1170 + x"31",x"31",x"31",x"31",x"30",x"31",x"30",x"31", -- 0x1178 + x"30",x"31",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x1180 + x"30",x"30",x"30",x"30",x"31",x"30",x"30",x"30", -- 0x1188 + x"31",x"30",x"31",x"30",x"30",x"30",x"31",x"30", -- 0x1190 + x"31",x"30",x"30",x"31",x"31",x"30",x"30",x"30", -- 0x1198 + x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"31", -- 0x11A0 + x"30",x"30",x"30",x"31",x"30",x"31",x"30",x"30", -- 0x11A8 + x"30",x"31",x"30",x"31",x"30",x"30",x"30",x"31", -- 0x11B0 + x"30",x"30",x"30",x"30",x"30",x"20",x"20",x"20", -- 0x11B8 + x"20",x"50",x"72",x"65",x"73",x"73",x"20",x"53", -- 0x11C0 + x"74",x"61",x"72",x"74",x"20",x"54",x"6F",x"20", -- 0x11C8 + x"50",x"6C",x"61",x"79",x"20",x"20",x"20",x"20", -- 0x11D0 + x"00",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x11D8 + x"20",x"49",x"6E",x"73",x"65",x"72",x"74",x"20", -- 0x11E0 + x"43",x"6F",x"69",x"6E",x"20",x"20",x"20",x"20", -- 0x11E8 + x"20",x"20",x"20",x"20",x"00",x"1E",x"00",x"D6", -- 0x11F0 + x"0A",x"38",x"03",x"1C",x"18",x"F9",x"C6",x"0A", -- 0x11F8 + x"C9",x"3A",x"0A",x"4C",x"B7",x"C0",x"3A",x"00", -- 0x1200 + x"50",x"32",x"04",x"4C",x"2F",x"5F",x"3A",x"06", -- 0x1208 + x"4C",x"57",x"2F",x"A3",x"32",x"07",x"4C",x"7B", -- 0x1210 + x"32",x"06",x"4C",x"3A",x"40",x"50",x"32",x"05", -- 0x1218 + x"4C",x"2F",x"5F",x"3A",x"08",x"4C",x"57",x"2F", -- 0x1220 + x"A3",x"32",x"09",x"4C",x"7B",x"32",x"08",x"4C", -- 0x1228 + x"3A",x"09",x"4C",x"E6",x"01",x"28",x"08",x"3A", -- 0x1230 + x"4C",x"4C",x"EE",x"0F",x"32",x"4C",x"4C",x"3A", -- 0x1238 + x"09",x"4C",x"E6",x"08",x"28",x"08",x"3A",x"4D", -- 0x1240 + x"4C",x"EE",x"0F",x"32",x"4D",x"4C",x"3A",x"07", -- 0x1248 + x"4C",x"E6",x"20",x"28",x"13",x"3A",x"0B",x"4C", -- 0x1250 + x"FE",x"63",x"28",x"0C",x"3C",x"32",x"0B",x"4C", -- 0x1258 + x"CD",x"69",x"12",x"3E",x"01",x"32",x"0C",x"4C", -- 0x1260 + x"C9",x"11",x"99",x"12",x"21",x"FD",x"43",x"1A", -- 0x1268 + x"13",x"B7",x"28",x"0C",x"C6",x"80",x"77",x"CB", -- 0x1270 + x"D4",x"36",x"19",x"CB",x"94",x"2D",x"18",x"EF", -- 0x1278 + x"3A",x"0B",x"4C",x"CD",x"F5",x"11",x"57",x"7B", -- 0x1280 + x"C6",x"B0",x"77",x"CB",x"D4",x"36",x"19",x"2D", -- 0x1288 + x"36",x"19",x"CB",x"94",x"7A",x"C6",x"B0",x"77", -- 0x1290 + x"C9",x"43",x"72",x"65",x"64",x"69",x"74",x"73", -- 0x1298 + x"20",x"00",x"32",x"47",x"4C",x"AF",x"32",x"46", -- 0x12A0 + x"4C",x"3E",x"01",x"32",x"4B",x"4C",x"C9",x"CD", -- 0x12A8 + x"01",x"12",x"3A",x"47",x"4C",x"B7",x"CA",x"A1", -- 0x12B0 + x"13",x"3A",x"4B",x"4C",x"D6",x"04",x"32",x"4B", -- 0x12B8 + x"4C",x"D2",x"10",x"13",x"3A",x"47",x"4C",x"87", -- 0x12C0 + x"5F",x"16",x"00",x"21",x"4F",x"14",x"19",x"5E", -- 0x12C8 + x"23",x"56",x"EB",x"3A",x"46",x"4C",x"5F",x"3C", -- 0x12D0 + x"32",x"46",x"4C",x"16",x"00",x"19",x"19",x"19", -- 0x12D8 + x"7E",x"FE",x"FF",x"CA",x"A1",x"13",x"B7",x"20", -- 0x12E0 + x"14",x"3C",x"32",x"46",x"4C",x"3A",x"47",x"4C", -- 0x12E8 + x"87",x"5F",x"16",x"00",x"21",x"4F",x"14",x"19", -- 0x12F0 + x"5E",x"23",x"56",x"EB",x"7E",x"32",x"4B",x"4C", -- 0x12F8 + x"23",x"7E",x"CD",x"FD",x"13",x"32",x"48",x"4C", -- 0x1300 + x"23",x"7E",x"CD",x"FD",x"13",x"32",x"49",x"4C", -- 0x1308 + x"3A",x"24",x"4C",x"B7",x"28",x"16",x"3A",x"2A", -- 0x1310 + x"4C",x"3C",x"32",x"2A",x"4C",x"1F",x"1F",x"E6", -- 0x1318 + x"3F",x"5F",x"16",x"00",x"21",x"AE",x"13",x"19", -- 0x1320 + x"7E",x"32",x"4A",x"4C",x"3A",x"4F",x"4C",x"B7", -- 0x1328 + x"28",x"10",x"C6",x"02",x"32",x"4F",x"4C",x"32", -- 0x1330 + x"4A",x"4C",x"FE",x"40",x"38",x"04",x"AF",x"32", -- 0x1338 + x"4F",x"4C",x"3A",x"0C",x"4C",x"B7",x"28",x"10", -- 0x1340 + x"C6",x"01",x"32",x"0C",x"4C",x"32",x"4A",x"4C", -- 0x1348 + x"FE",x"20",x"38",x"04",x"AF",x"32",x"0C",x"4C", -- 0x1350 + x"3A",x"4E",x"4C",x"B7",x"28",x"08",x"D6",x"04", -- 0x1358 + x"32",x"4E",x"4C",x"32",x"4A",x"4C",x"DD",x"21", -- 0x1360 + x"45",x"50",x"DD",x"36",x"00",x"01",x"ED",x"4B", -- 0x1368 + x"4C",x"4C",x"3A",x"48",x"4C",x"CD",x"16",x"14", -- 0x1370 + x"DD",x"21",x"4A",x"50",x"DD",x"36",x"00",x"03", -- 0x1378 + x"ED",x"4B",x"4C",x"4C",x"3A",x"49",x"4C",x"CD", -- 0x1380 + x"16",x"14",x"DD",x"21",x"4F",x"50",x"DD",x"36", -- 0x1388 + x"00",x"01",x"ED",x"4B",x"4D",x"4C",x"3A",x"4A", -- 0x1390 + x"4C",x"CD",x"16",x"14",x"AF",x"32",x"4A",x"4C", -- 0x1398 + x"C9",x"AF",x"32",x"48",x"4C",x"32",x"49",x"4C", -- 0x13A0 + x"32",x"47",x"4C",x"C3",x"10",x"13",x"04",x"09", -- 0x13A8 + x"0B",x"0D",x"0F",x"11",x"13",x"15",x"16",x"15", -- 0x13B0 + x"13",x"11",x"0F",x"0D",x"0B",x"09",x"09",x"08", -- 0x13B8 + x"08",x"07",x"07",x"06",x"06",x"05",x"05",x"04", -- 0x13C0 + x"04",x"04",x"03",x"03",x"03",x"03",x"02",x"02", -- 0x13C8 + x"02",x"02",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x13D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13F0 + x"00",x"00",x"00",x"00",x"00",x"FE",x"FF",x"C8", -- 0x13F8 + x"B7",x"C8",x"E5",x"D5",x"5F",x"21",x"44",x"16", -- 0x1400 + x"16",x"00",x"BE",x"28",x"05",x"23",x"23",x"14", -- 0x1408 + x"18",x"F8",x"7A",x"D1",x"E1",x"C9",x"E5",x"D5", -- 0x1410 + x"B7",x"28",x"2D",x"87",x"5F",x"16",x"00",x"21", -- 0x1418 + x"AC",x"16",x"19",x"5E",x"23",x"56",x"7B",x"DD", -- 0x1420 + x"77",x"0C",x"1F",x"1F",x"1F",x"1F",x"DD",x"77", -- 0x1428 + x"0D",x"7A",x"DD",x"77",x"0E",x"1F",x"1F",x"1F", -- 0x1430 + x"1F",x"DD",x"77",x"0F",x"79",x"DD",x"77",x"10", -- 0x1438 + x"3E",x"01",x"32",x"01",x"50",x"D1",x"E1",x"C9", -- 0x1440 + x"DD",x"36",x"10",x"00",x"D1",x"E1",x"C9",x"00", -- 0x1448 + x"00",x"55",x"14",x"81",x"15",x"50",x"80",x"80", -- 0x1450 + x"50",x"66",x"66",x"50",x"56",x"56",x"32",x"56", -- 0x1458 + x"56",x"32",x"AB",x"CB",x"32",x"2B",x"33",x"32", -- 0x1460 + x"2B",x"33",x"32",x"AB",x"CB",x"32",x"33",x"40", -- 0x1468 + x"32",x"33",x"40",x"32",x"AB",x"CB",x"32",x"80", -- 0x1470 + x"80",x"32",x"80",x"80",x"32",x"66",x"66",x"32", -- 0x1478 + x"56",x"56",x"32",x"60",x"56",x"32",x"AB",x"C0", -- 0x1480 + x"32",x"2B",x"30",x"32",x"2B",x"30",x"32",x"AB", -- 0x1488 + x"C0",x"32",x"30",x"44",x"32",x"30",x"44",x"32", -- 0x1490 + x"AB",x"C0",x"32",x"88",x"88",x"32",x"88",x"88", -- 0x1498 + x"32",x"72",x"72",x"32",x"4C",x"4C",x"32",x"4C", -- 0x14A0 + x"4C",x"32",x"AB",x"C0",x"32",x"26",x"30",x"32", -- 0x14A8 + x"26",x"30",x"32",x"AB",x"C0",x"32",x"30",x"44", -- 0x14B0 + x"32",x"30",x"44",x"32",x"AB",x"C0",x"32",x"88", -- 0x14B8 + x"88",x"32",x"88",x"88",x"32",x"72",x"72",x"32", -- 0x14C0 + x"4C",x"4C",x"32",x"4C",x"4C",x"32",x"AB",x"CB", -- 0x14C8 + x"32",x"26",x"33",x"32",x"26",x"33",x"32",x"AB", -- 0x14D0 + x"CB",x"32",x"33",x"40",x"32",x"33",x"40",x"32", -- 0x14D8 + x"AB",x"CB",x"32",x"80",x"80",x"32",x"80",x"80", -- 0x14E0 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"40", -- 0x14E8 + x"40",x"32",x"80",x"AB",x"32",x"20",x"2B",x"32", -- 0x14F0 + x"20",x"2B",x"32",x"80",x"AB",x"32",x"2B",x"33", -- 0x14F8 + x"32",x"2B",x"33",x"32",x"80",x"AB",x"32",x"80", -- 0x1500 + x"80",x"32",x"80",x"80",x"32",x"66",x"66",x"32", -- 0x1508 + x"56",x"56",x"32",x"40",x"40",x"32",x"80",x"98", -- 0x1510 + x"32",x"20",x"26",x"32",x"20",x"26",x"32",x"80", -- 0x1518 + x"98",x"32",x"26",x"30",x"32",x"26",x"30",x"32", -- 0x1520 + x"00",x"00",x"32",x"72",x"72",x"32",x"72",x"72", -- 0x1528 + x"32",x"60",x"60",x"32",x"4C",x"4C",x"32",x"4C", -- 0x1530 + x"98",x"32",x"4C",x"4C",x"32",x"4C",x"4C",x"32", -- 0x1538 + x"4C",x"98",x"32",x"5B",x"5B",x"32",x"56",x"56", -- 0x1540 + x"32",x"33",x"CB",x"32",x"33",x"33",x"32",x"33", -- 0x1548 + x"33",x"32",x"33",x"CB",x"32",x"40",x"40",x"32", -- 0x1550 + x"66",x"66",x"64",x"66",x"66",x"32",x"72",x"72", -- 0x1558 + x"64",x"4C",x"4C",x"32",x"56",x"56",x"32",x"80", -- 0x1560 + x"CB",x"19",x"80",x"00",x"19",x"80",x"80",x"32", -- 0x1568 + x"80",x"CB",x"FA",x"00",x"00",x"FA",x"00",x"00", -- 0x1570 + x"FA",x"00",x"00",x"FA",x"00",x"00",x"00",x"00", -- 0x1578 + x"00",x"32",x"80",x"80",x"32",x"72",x"72",x"32", -- 0x1580 + x"66",x"66",x"32",x"60",x"60",x"32",x"56",x"56", -- 0x1588 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"56", -- 0x1590 + x"56",x"32",x"51",x"51",x"32",x"60",x"60",x"32", -- 0x1598 + x"51",x"51",x"32",x"51",x"51",x"32",x"56",x"56", -- 0x15A0 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"56", -- 0x15A8 + x"56",x"32",x"80",x"80",x"32",x"72",x"72",x"32", -- 0x15B0 + x"66",x"66",x"32",x"60",x"60",x"32",x"56",x"56", -- 0x15B8 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"56", -- 0x15C0 + x"56",x"32",x"51",x"51",x"32",x"60",x"60",x"32", -- 0x15C8 + x"51",x"51",x"32",x"51",x"51",x"32",x"56",x"56", -- 0x15D0 + x"32",x"56",x"56",x"32",x"56",x"56",x"32",x"56", -- 0x15D8 + x"56",x"32",x"80",x"80",x"32",x"72",x"72",x"32", -- 0x15E0 + x"66",x"66",x"32",x"60",x"60",x"32",x"56",x"56", -- 0x15E8 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"56", -- 0x15F0 + x"56",x"32",x"51",x"51",x"32",x"60",x"60",x"32", -- 0x15F8 + x"51",x"51",x"32",x"51",x"51",x"32",x"56",x"56", -- 0x1600 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"56", -- 0x1608 + x"56",x"32",x"80",x"80",x"32",x"72",x"72",x"32", -- 0x1610 + x"66",x"66",x"32",x"60",x"60",x"32",x"56",x"56", -- 0x1618 + x"32",x"66",x"66",x"32",x"56",x"56",x"32",x"40", -- 0x1620 + x"40",x"32",x"56",x"56",x"32",x"66",x"66",x"32", -- 0x1628 + x"80",x"80",x"32",x"66",x"66",x"32",x"56",x"56", -- 0x1630 + x"32",x"56",x"56",x"32",x"56",x"56",x"32",x"56", -- 0x1638 + x"56",x"00",x"00",x"00",x"00",x"24",x"FF",x"24", -- 0x1640 + x"F2",x"04",x"E6",x"25",x"D8",x"05",x"CB",x"26", -- 0x1648 + x"C0",x"27",x"B4",x"07",x"AB",x"28",x"A2",x"08", -- 0x1650 + x"98",x"29",x"90",x"09",x"88",x"2A",x"80",x"2B", -- 0x1658 + x"79",x"0B",x"72",x"2C",x"6C",x"0C",x"66",x"2D", -- 0x1660 + x"60",x"2E",x"5B",x"0E",x"56",x"2F",x"51",x"0F", -- 0x1668 + x"4C",x"30",x"48",x"10",x"44",x"31",x"40",x"32", -- 0x1670 + x"3C",x"12",x"39",x"33",x"36",x"13",x"33",x"34", -- 0x1678 + x"30",x"35",x"2D",x"15",x"2B",x"36",x"28",x"16", -- 0x1680 + x"26",x"37",x"24",x"17",x"22",x"38",x"20",x"39", -- 0x1688 + x"1F",x"19",x"1D",x"3A",x"1B",x"1A",x"19",x"3B", -- 0x1690 + x"18",x"3C",x"17",x"1C",x"16",x"3D",x"14",x"1D", -- 0x1698 + x"13",x"3E",x"12",x"1E",x"11",x"3F",x"10",x"2B", -- 0x16A0 + x"01",x"01",x"01",x"01",x"57",x"00",x"5C",x"00", -- 0x16A8 + x"62",x"00",x"6A",x"00",x"6F",x"00",x"75",x"00", -- 0x16B0 + x"7D",x"00",x"85",x"00",x"8E",x"00",x"96",x"00", -- 0x16B8 + x"9E",x"00",x"A6",x"00",x"AE",x"00",x"B9",x"00", -- 0x16C0 + x"C4",x"00",x"D5",x"00",x"DF",x"00",x"EA",x"00", -- 0x16C8 + x"FB",x"00",x"0B",x"01",x"1C",x"01",x"2C",x"01", -- 0x16D0 + x"3C",x"01",x"4D",x"01",x"5D",x"01",x"73",x"01", -- 0x16D8 + x"89",x"01",x"AA",x"01",x"BF",x"01",x"D5",x"01", -- 0x16E0 + x"F6",x"01",x"17",x"02",x"38",x"02",x"58",x"02", -- 0x16E8 + x"79",x"02",x"9A",x"02",x"BA",x"02",x"E6",x"02", -- 0x16F0 + x"12",x"03",x"54",x"03",x"7E",x"03",x"AA",x"03", -- 0x16F8 + x"EC",x"03",x"2E",x"04",x"70",x"04",x"B0",x"04", -- 0x1700 + x"F2",x"04",x"34",x"05",x"74",x"05",x"CC",x"05", -- 0x1708 + x"24",x"06",x"A8",x"06",x"FC",x"06",x"54",x"07", -- 0x1710 + x"D8",x"07",x"5C",x"08",x"E0",x"08",x"60",x"09", -- 0x1718 + x"E4",x"09",x"68",x"0A",x"E8",x"0A",x"98",x"0B", -- 0x1720 + x"48",x"0C",x"50",x"0D",x"F8",x"0D",x"A8",x"0E", -- 0x1728 + x"B0",x"0F",x"B8",x"10",x"C0",x"11",x"C0",x"12", -- 0x1730 + x"C8",x"13",x"D0",x"14",x"E8",x"0A",x"98",x"0B", -- 0x1738 + x"48",x"0C",x"50",x"0D",x"F8",x"0D",x"A8",x"0E", -- 0x1740 + x"B0",x"0F",x"B8",x"10",x"C0",x"11",x"C0",x"12", -- 0x1748 + x"C8",x"13",x"D0",x"14",x"E8",x"0A",x"98",x"0B", -- 0x1750 + x"48",x"0C",x"50",x"0D",x"F8",x"0D",x"A8",x"0E", -- 0x1758 + x"B0",x"0F",x"B8",x"10",x"C0",x"11",x"C0",x"12", -- 0x1760 + x"C8",x"13",x"D0",x"14",x"E8",x"0A",x"98",x"0B", -- 0x1768 + x"48",x"0C",x"50",x"0D",x"F8",x"0D",x"A8",x"0E", -- 0x1770 + x"B0",x"0F",x"B8",x"10",x"C0",x"11",x"C0",x"12", -- 0x1778 + x"C8",x"13",x"D0",x"14",x"AC",x"17",x"30",x"18", -- 0x1780 + x"D3",x"18",x"67",x"19",x"1F",x"1A",x"C9",x"1A", -- 0x1788 + x"71",x"1B",x"2F",x"1C",x"13",x"1D",x"CC",x"1D", -- 0x1790 + x"A0",x"1E",x"77",x"1F",x"59",x"20",x"13",x"21", -- 0x1798 + x"FA",x"21",x"AF",x"22",x"68",x"23",x"3E",x"24", -- 0x17A0 + x"F2",x"24",x"A6",x"25",x"00",x"00",x"05",x"1C", -- 0x17A8 + x"08",x"01",x"0C",x"05",x"04",x"80",x"01",x"11", -- 0x17B0 + x"05",x"04",x"80",x"01",x"00",x"07",x"03",x"08", -- 0x17B8 + x"01",x"11",x"08",x"03",x"20",x"09",x"00",x"09", -- 0x17C0 + x"04",x"08",x"01",x"08",x"09",x"10",x"58",x"0F", -- 0x17C8 + x"1A",x"0A",x"02",x"08",x"01",x"14",x"0C",x"03", -- 0x17D0 + x"20",x"09",x"17",x"0C",x"03",x"80",x"01",x"1A", -- 0x17D8 + x"0C",x"02",x"08",x"01",x"04",x"0D",x"10",x"08", -- 0x17E0 + x"01",x"00",x"0F",x"1C",x"08",x"01",x"1A",x"0D", -- 0x17E8 + x"00",x"04",x"30",x"0F",x"17",x"04",x"1B",x"04", -- 0x17F0 + x"15",x"08",x"0C",x"0C",x"02",x"38",x"05",x"0B", -- 0x17F8 + x"00",x"10",x"00",x"07",x"43",x"45",x"4E",x"54", -- 0x1800 + x"52",x"41",x"4C",x"20",x"43",x"41",x"56",x"45", -- 0x1808 + x"52",x"4E",x"00",x"08",x"09",x"10",x"58",x"0F", -- 0x1810 + x"00",x"01",x"0D",x"05",x"45",x"07",x"09",x"00", -- 0x1818 + x"10",x"01",x"19",x"00",x"18",x"04",x"1B",x"06", -- 0x1820 + x"10",x"28",x"08",x"38",x"40",x"40",x"7E",x"01", -- 0x1828 + x"01",x"10",x"00",x"0C",x"20",x"09",x"12",x"03", -- 0x1830 + x"03",x"88",x"01",x"15",x"03",x"01",x"09",x"01", -- 0x1838 + x"00",x"05",x"12",x"09",x"01",x"12",x"06",x"02", -- 0x1840 + x"09",x"01",x"00",x"07",x"01",x"09",x"01",x"01", -- 0x1848 + x"07",x"04",x"88",x"01",x"08",x"09",x"07",x"09", -- 0x1850 + x"01",x"11",x"0A",x"04",x"88",x"01",x"0D",x"0C", -- 0x1858 + x"03",x"09",x"01",x"07",x"0D",x"03",x"88",x"01", -- 0x1860 + x"00",x"0F",x"1C",x"09",x"01",x"16",x"06",x"87", -- 0x1868 + x"20",x"09",x"19",x"05",x"88",x"20",x"09",x"17", -- 0x1870 + x"06",x"02",x"88",x"01",x"17",x"08",x"02",x"88", -- 0x1878 + x"01",x"17",x"09",x"02",x"88",x"01",x"17",x"0A", -- 0x1880 + x"02",x"88",x"01",x"17",x"0B",x"02",x"88",x"01", -- 0x1888 + x"17",x"0C",x"02",x"88",x"01",x"1A",x"0D",x"00", -- 0x1890 + x"00",x"31",x"07",x"01",x"39",x"05",x"1B",x"01", -- 0x1898 + x"08",x"54",x"48",x"45",x"20",x"43",x"4F",x"4C", -- 0x18A0 + x"44",x"20",x"52",x"4F",x"4F",x"4D",x"00",x"02", -- 0x18A8 + x"0B",x"04",x"58",x"14",x"01",x"01",x"0D",x"05", -- 0x18B0 + x"44",x"07",x"02",x"09",x"07",x"01",x"15",x"01", -- 0x18B8 + x"18",x"07",x"11",x"0C",x"20",x"30",x"10",x"18", -- 0x18C0 + x"80",x"08",x"80",x"FF",x"30",x"13",x"68",x"98", -- 0x18C8 + x"58",x"D4",x"FF",x"00",x"09",x"00",x"01",x"1C", -- 0x18D0 + x"03",x"11",x"00",x"01",x"1B",x"03",x"11",x"01", -- 0x18D8 + x"01",x"1C",x"03",x"1A",x"00",x"01",x"1C",x"03", -- 0x18E0 + x"00",x"05",x"04",x"0A",x"05",x"04",x"05",x"18", -- 0x18E8 + x"98",x"05",x"00",x"07",x"05",x"0A",x"05",x"19", -- 0x18F0 + x"07",x"03",x"0A",x"05",x"00",x"08",x"83",x"1B", -- 0x18F8 + x"03",x"00",x"0B",x"01",x"1C",x"03",x"05",x"09", -- 0x1900 + x"06",x"48",x"01",x"17",x"0A",x"05",x"0A",x"05", -- 0x1908 + x"0C",x"0B",x"05",x"0A",x"05",x"04",x"0C",x"06", -- 0x1910 + x"0A",x"05",x"13",x"0D",x"09",x"0A",x"05",x"00", -- 0x1918 + x"0F",x"1C",x"0A",x"05",x"1A",x"08",x"00",x"00", -- 0x1920 + x"1B",x"07",x"00",x"1C",x"05",x"08",x"54",x"48", -- 0x1928 + x"45",x"20",x"4D",x"45",x"4E",x"41",x"47",x"45", -- 0x1930 + x"52",x"49",x"45",x"00",x"05",x"09",x"06",x"48", -- 0x1938 + x"01",x"00",x"01",x"0D",x"05",x"45",x"1B",x"05", -- 0x1940 + x"00",x"0D",x"00",x"15",x"00",x"12",x"06",x"19", -- 0x1948 + x"06",x"30",x"40",x"13",x"68",x"A0",x"08",x"D0", -- 0x1950 + x"FF",x"40",x"10",x"18",x"50",x"08",x"68",x"FF", -- 0x1958 + x"40",x"12",x"18",x"90",x"78",x"D0",x"01",x"00", -- 0x1960 + x"06",x"00",x"01",x"1C",x"03",x"0D",x"00",x"0F", -- 0x1968 + x"20",x"05",x"12",x"03",x"05",x"0A",x"07",x"19", -- 0x1970 + x"04",x"03",x"0A",x"07",x"00",x"05",x"01",x"0A", -- 0x1978 + x"07",x"06",x"05",x"01",x"0A",x"07",x"10",x"05", -- 0x1980 + x"01",x"0A",x"07",x"0B",x"06",x"02",x"0A",x"07", -- 0x1988 + x"14",x"06",x"03",x"0A",x"07",x"00",x"07",x"03", -- 0x1990 + x"98",x"14",x"06",x"08",x"02",x"0A",x"07",x"18", -- 0x1998 + x"08",x"04",x"0A",x"07",x"11",x"09",x"03",x"0A", -- 0x19A0 + x"07",x"00",x"0A",x"03",x"48",x"05",x"1B",x"0A", -- 0x19A8 + x"01",x"0A",x"07",x"0B",x"0B",x"03",x"0A",x"07", -- 0x19B0 + x"15",x"0B",x"03",x"0A",x"07",x"05",x"0C",x"02", -- 0x19B8 + x"0A",x"07",x"16",x"0C",x"01",x"1C",x"03",x"19", -- 0x19C0 + x"0C",x"03",x"0A",x"07",x"11",x"0D",x"02",x"0A", -- 0x19C8 + x"07",x"00",x"0F",x"1C",x"0A",x"07",x"1A",x"01", -- 0x19D0 + x"00",x"00",x"1B",x"07",x"00",x"1C",x"05",x"01", -- 0x19D8 + x"41",x"42",x"41",x"4E",x"44",x"4F",x"4E",x"45", -- 0x19E0 + x"44",x"20",x"55",x"52",x"41",x"4E",x"49",x"55", -- 0x19E8 + x"4D",x"20",x"57",x"4F",x"52",x"4B",x"49",x"4E", -- 0x19F0 + x"47",x"53",x"00",x"00",x"0A",x"03",x"48",x"05", -- 0x19F8 + x"01",x"1A",x"0D",x"05",x"45",x"1B",x"00",x"00", -- 0x1A00 + x"0B",x"01",x"16",x"01",x"0F",x"07",x"19",x"07", -- 0x1A08 + x"20",x"50",x"08",x"68",x"08",x"08",x"60",x"01", -- 0x1A10 + x"50",x"28",x"68",x"28",x"20",x"78",x"01",x"09", -- 0x1A18 + x"12",x"00",x"01",x"3A",x"01",x"00",x"05",x"0C", -- 0x1A20 + x"0C",x"0F",x"10",x"05",x"04",x"68",x"0F",x"14", -- 0x1A28 + x"05",x"05",x"0C",x"0F",x"1A",x"06",x"02",x"0C", -- 0x1A30 + x"0F",x"10",x"08",x"09",x"48",x"01",x"03",x"09", -- 0x1A38 + x"09",x"0C",x"0F",x"00",x"0B",x"02",x"68",x"0F", -- 0x1A40 + x"02",x"0B",x"0A",x"0C",x"0F",x"10",x"0B",x"06", -- 0x1A48 + x"0C",x"0F",x"1B",x"0B",x"01",x"0C",x"0F",x"00", -- 0x1A50 + x"0D",x"02",x"0C",x"0F",x"00",x"0F",x"1C",x"0C", -- 0x1A58 + x"0F",x"07",x"0C",x"83",x"23",x"0F",x"0C",x"0D", -- 0x1A60 + x"82",x"23",x"0F",x"0F",x"0D",x"82",x"23",x"0F", -- 0x1A68 + x"10",x"0E",x"06",x"23",x"0F",x"07",x"0F",x"0F", -- 0x1A70 + x"23",x"0F",x"0D",x"0D",x"00",x"05",x"33",x"09", -- 0x1A78 + x"14",x"07",x"17",x"04",x"04",x"0E",x"16",x"0E", -- 0x1A80 + x"17",x"0E",x"01",x"3A",x"01",x"12",x"00",x"08", -- 0x1A88 + x"45",x"55",x"47",x"45",x"4E",x"45",x"27",x"53", -- 0x1A90 + x"20",x"4C",x"41",x"49",x"52",x"00",x"10",x"08", -- 0x1A98 + x"09",x"48",x"01",x"00",x"00",x"03",x"05",x"44", -- 0x1AA0 + x"09",x"1B",x"01",x"1A",x"07",x"09",x"06",x"08", -- 0x1AA8 + x"0C",x"06",x"0C",x"21",x"60",x"50",x"18",x"50", -- 0x1AB0 + x"08",x"50",x"FF",x"60",x"20",x"38",x"20",x"20", -- 0x1AB8 + x"50",x"01",x"1C",x"0D",x"08",x"68",x"08",x"58", -- 0x1AC0 + x"01",x"00",x"14",x"04",x"01",x"3B",x"07",x"07", -- 0x1AC8 + x"05",x"03",x"0D",x"0F",x"0E",x"05",x"02",x"0D", -- 0x1AD0 + x"0F",x"14",x"05",x"05",x"0D",x"0F",x"02",x"06", -- 0x1AD8 + x"02",x"0D",x"0F",x"0F",x"06",x"82",x"24",x"09", -- 0x1AE0 + x"1A",x"06",x"02",x"0D",x"0F",x"15",x"08",x"04", -- 0x1AE8 + x"0D",x"0F",x"00",x"09",x"02",x"0D",x"0F",x"06", -- 0x1AF0 + x"0A",x"09",x"0D",x"0F",x"0F",x"0A",x"83",x"24", -- 0x1AF8 + x"09",x"10",x"0A",x"08",x"0D",x"0F",x"10",x"0B", -- 0x1B00 + x"01",x"3B",x"07",x"02",x"0C",x"01",x"34",x"03", -- 0x1B08 + x"1A",x"0C",x"02",x"0D",x"0F",x"02",x"0D",x"04", -- 0x1B10 + x"58",x"0F",x"15",x"0D",x"02",x"0D",x"0F",x"00", -- 0x1B18 + x"0F",x"1C",x"0D",x"0F",x"1A",x"00",x"00",x"00", -- 0x1B20 + x"33",x"01",x"00",x"3A",x"01",x"06",x"50",x"52", -- 0x1B28 + x"4F",x"43",x"45",x"53",x"53",x"49",x"4E",x"47", -- 0x1B30 + x"20",x"50",x"4C",x"41",x"4E",x"54",x"00",x"02", -- 0x1B38 + x"0D",x"04",x"58",x"0F",x"00",x"0F",x"03",x"05", -- 0x1B40 + x"45",x"1B",x"00",x"0A",x"0B",x"0B",x"0E",x"06", -- 0x1B48 + x"10",x"06",x"1B",x"07",x"40",x"70",x"30",x"40", -- 0x1B50 + x"30",x"30",x"60",x"01",x"70",x"70",x"40",x"70", -- 0x1B58 + x"70",x"A0",x"01",x"70",x"38",x"68",x"38",x"38", -- 0x1B60 + x"98",x"01",x"70",x"B8",x"68",x"B8",x"B8",x"D8", -- 0x1B68 + x"01",x"00",x"0D",x"00",x"0F",x"25",x"05",x"0E", -- 0x1B70 + x"03",x"02",x"0B",x"09",x"10",x"03",x"8A",x"25", -- 0x1B78 + x"05",x"11",x"03",x"0B",x"90",x"01",x"11",x"04", -- 0x1B80 + x"0B",x"90",x"01",x"06",x"05",x"04",x"58",x"0F", -- 0x1B88 + x"0D",x"05",x"03",x"0B",x"09",x"11",x"05",x"0B", -- 0x1B90 + x"90",x"01",x"00",x"06",x"03",x"0B",x"09",x"11", -- 0x1B98 + x"06",x"0B",x"90",x"01",x"11",x"07",x"0B",x"90", -- 0x1BA0 + x"01",x"00",x"08",x"01",x"0B",x"09",x"11",x"08", -- 0x1BA8 + x"0B",x"90",x"01",x"0D",x"09",x"03",x"0B",x"09", -- 0x1BB0 + x"11",x"09",x"0B",x"90",x"01",x"01",x"0A",x"0A", -- 0x1BB8 + x"0B",x"09",x"11",x"0A",x"0B",x"90",x"01",x"11", -- 0x1BC0 + x"0B",x"0B",x"90",x"01",x"0D",x"0C",x"03",x"25", -- 0x1BC8 + x"05",x"11",x"0C",x"0B",x"90",x"01",x"08",x"0D", -- 0x1BD0 + x"03",x"0B",x"09",x"0D",x"0D",x"82",x"25",x"05", -- 0x1BD8 + x"00",x"0F",x"1C",x"0B",x"09",x"0D",x"0F",x"0F", -- 0x1BE0 + x"25",x"05",x"0E",x"0D",x"00",x"00",x"34",x"01", -- 0x1BE8 + x"04",x"18",x"09",x"19",x"05",x"16",x"08",x"19", -- 0x1BF0 + x"0A",x"16",x"0C",x"0B",x"54",x"48",x"45",x"20", -- 0x1BF8 + x"56",x"41",x"54",x"00",x"06",x"05",x"04",x"58", -- 0x1C00 + x"0F",x"01",x"00",x"0D",x"05",x"45",x"1B",x"1B", -- 0x1C08 + x"03",x"13",x"06",x"18",x"07",x"12",x"0A",x"1B", -- 0x1C10 + x"0B",x"30",x"80",x"70",x"08",x"70",x"70",x"D0", -- 0x1C18 + x"01",x"80",x"08",x"40",x"08",x"08",x"50",x"01", -- 0x1C20 + x"80",x"80",x"68",x"80",x"80",x"D0",x"01",x"00", -- 0x1C28 + x"01",x"00",x"01",x"3C",x"09",x"09",x"00",x"01", -- 0x1C30 + x"3C",x"09",x"13",x"00",x"82",x"26",x"09",x"10", -- 0x1C38 + x"00",x"8F",x"26",x"09",x"0E",x"02",x"02",x"08", -- 0x1C40 + x"01",x"1A",x"02",x"02",x"08",x"01",x"00",x"05", -- 0x1C48 + x"03",x"08",x"01",x"08",x"05",x"06",x"08",x"01", -- 0x1C50 + x"11",x"05",x"02",x"08",x"01",x"14",x"06",x"02", -- 0x1C58 + x"08",x"01",x"1B",x"06",x"01",x"08",x"01",x"01", -- 0x1C60 + x"07",x"03",x"08",x"01",x"18",x"07",x"01",x"08", -- 0x1C68 + x"01",x"07",x"08",x"03",x"08",x"01",x"11",x"09", -- 0x1C70 + x"03",x"08",x"01",x"00",x"0A",x"01",x"08",x"01", -- 0x1C78 + x"0B",x"0A",x"03",x"08",x"01",x"18",x"0A",x"03", -- 0x1C80 + x"08",x"01",x"08",x"0B",x"02",x"08",x"01",x"03", -- 0x1C88 + x"0C",x"02",x"08",x"01",x"15",x"0C",x"04",x"08", -- 0x1C90 + x"01",x"0A",x"0D",x"02",x"58",x"0F",x"0D",x"0D", -- 0x1C98 + x"82",x"26",x"09",x"11",x"0D",x"02",x"08",x"01", -- 0x1CA0 + x"15",x"0E",x"01",x"30",x"0F",x"00",x"0F",x"1C", -- 0x1CA8 + x"08",x"01",x"05",x"00",x"01",x"46",x"0F",x"11", -- 0x1CB0 + x"00",x"01",x"46",x"0F",x"0E",x"0D",x"00",x"00", -- 0x1CB8 + x"33",x"01",x"00",x"3A",x"01",x"00",x"4D",x"49", -- 0x1CC0 + x"4E",x"45",x"52",x"20",x"57",x"49",x"4C",x"4C", -- 0x1CC8 + x"59",x"20",x"4D",x"45",x"45",x"54",x"53",x"20", -- 0x1CD0 + x"4B",x"4F",x"4E",x"47",x"20",x"42",x"45",x"41", -- 0x1CD8 + x"53",x"54",x"00",x"0A",x"0D",x"03",x"58",x"0F", -- 0x1CE0 + x"00",x"00",x"0D",x"04",x"45",x"1B",x"0C",x"02", -- 0x1CE8 + x"0D",x"06",x"01",x"08",x"1A",x"0D",x"31",x"A0", -- 0x1CF0 + x"44",x"68",x"44",x"00",x"48",x"FF",x"A0",x"68", -- 0x1CF8 + x"58",x"68",x"54",x"74",x"01",x"A0",x"88",x"38", -- 0x1D00 + x"88",x"88",x"98",x"01",x"90",x"0E",x"00",x"70", -- 0x1D08 + x"00",x"68",x"00",x"00",x"02",x"00",x"01",x"27", -- 0x1D10 + x"09",x"00",x"05",x"04",x"0B",x"09",x"06",x"05", -- 0x1D18 + x"02",x"0B",x"09",x"0A",x"05",x"08",x"0B",x"09", -- 0x1D20 + x"14",x"05",x"02",x"0B",x"09",x"18",x"05",x"02", -- 0x1D28 + x"0B",x"09",x"1A",x"07",x"02",x"0B",x"09",x"02", -- 0x1D30 + x"08",x"02",x"0B",x"09",x"06",x"08",x"02",x"0B", -- 0x1D38 + x"09",x"0A",x"08",x"08",x"58",x"0F",x"14",x"09", -- 0x1D40 + x"02",x"0B",x"09",x"18",x"09",x"02",x"0B",x"09", -- 0x1D48 + x"00",x"0A",x"02",x"0B",x"09",x"02",x"0C",x"02", -- 0x1D50 + x"0B",x"09",x"06",x"0C",x"02",x"0B",x"09",x"0A", -- 0x1D58 + x"0C",x"08",x"0B",x"09",x"14",x"0C",x"02",x"0B", -- 0x1D60 + x"09",x"18",x"0C",x"02",x"0B",x"09",x"1A",x"0D", -- 0x1D68 + x"02",x"0B",x"09",x"00",x"0F",x"1C",x"0B",x"09", -- 0x1D70 + x"00",x"00",x"00",x"00",x"33",x"01",x"00",x"3A", -- 0x1D78 + x"01",x"06",x"57",x"41",x"43",x"4B",x"59",x"20", -- 0x1D80 + x"41",x"4D",x"4F",x"45",x"42",x"41",x"54",x"52", -- 0x1D88 + x"4F",x"4E",x"53",x"00",x"0A",x"08",x"08",x"58", -- 0x1D90 + x"0F",x"01",x"00",x"0D",x"01",x"45",x"1B",x"10", -- 0x1D98 + x"01",x"24",x"C0",x"58",x"18",x"58",x"58",x"80", -- 0x1DA0 + x"01",x"C0",x"58",x"50",x"58",x"58",x"80",x"01", -- 0x1DA8 + x"B0",x"04",x"08",x"20",x"04",x"68",x"01",x"B0", -- 0x1DB0 + x"08",x"08",x"40",x"04",x"68",x"02",x"B0",x"12", -- 0x1DB8 + x"08",x"90",x"04",x"68",x"01",x"B0",x"16",x"08", -- 0x1DC0 + x"B0",x"04",x"68",x"02",x"00",x"0C",x"00",x"03", -- 0x1DC8 + x"0E",x"0F",x"0F",x"00",x"8C",x"28",x"09",x"14", -- 0x1DD0 + x"00",x"08",x"0E",x"0F",x"00",x"02",x"06",x"0E", -- 0x1DD8 + x"0F",x"1A",x"02",x"02",x"0E",x"0F",x"10",x"04", -- 0x1DE0 + x"04",x"0E",x"0F",x"07",x"05",x"01",x"0E",x"0F", -- 0x1DE8 + x"08",x"05",x"07",x"78",x"01",x"16",x"05",x"06", -- 0x1DF0 + x"0E",x"0F",x"00",x"06",x"04",x"0E",x"0F",x"10", -- 0x1DF8 + x"07",x"07",x"0E",x"0F",x"17",x"07",x"03",x"78", -- 0x1E00 + x"01",x"00",x"08",x"05",x"0E",x"0F",x"08",x"09", -- 0x1E08 + x"07",x"0E",x"0F",x"1A",x"09",x"02",x"0E",x"0F", -- 0x1E10 + x"00",x"0A",x"04",x"0E",x"0F",x"04",x"0A",x"02", -- 0x1E18 + x"78",x"01",x"10",x"0A",x"07",x"0E",x"0F",x"17", -- 0x1E20 + x"0B",x"03",x"78",x"01",x"07",x"0C",x"0A",x"13", -- 0x1E28 + x"05",x"00",x"0D",x"03",x"0E",x"0F",x"19",x"0D", -- 0x1E30 + x"03",x"0E",x"0F",x"00",x"0F",x"1C",x"13",x"05", -- 0x1E38 + x"0B",x"0D",x"00",x"08",x"37",x"0F",x"0A",x"00", -- 0x1E40 + x"11",x"00",x"13",x"00",x"14",x"01",x"02",x"03", -- 0x1E48 + x"00",x"09",x"1B",x"0A",x"16",x"0B",x"00",x"3B", -- 0x1E50 + x"01",x"05",x"54",x"48",x"45",x"20",x"45",x"4E", -- 0x1E58 + x"44",x"4F",x"52",x"49",x"41",x"4E",x"20",x"46", -- 0x1E60 + x"4F",x"52",x"45",x"53",x"54",x"00",x"02",x"0D", -- 0x1E68 + x"00",x"58",x"0F",x"00",x"00",x"04",x"05",x"45", -- 0x1E70 + x"1B",x"0D",x"01",x"1B",x"01",x"14",x"02",x"0B", -- 0x1E78 + x"06",x"11",x"08",x"40",x"D0",x"40",x"38",x"40", -- 0x1E80 + x"40",x"68",x"01",x"D0",x"38",x"50",x"38",x"38", -- 0x1E88 + x"68",x"01",x"D0",x"18",x"68",x"18",x"18",x"B8", -- 0x1E90 + x"01",x"D0",x"80",x"28",x"80",x"80",x"A0",x"01", -- 0x1E98 + x"00",x"00",x"00",x"06",x"2A",x"07",x"00",x"03", -- 0x1EA0 + x"04",x"0F",x"01",x"04",x"05",x"06",x"0F",x"01", -- 0x1EA8 + x"0E",x"05",x"02",x"0F",x"01",x"10",x"05",x"05", -- 0x1EB0 + x"14",x"05",x"15",x"05",x"02",x"0F",x"01",x"1A", -- 0x1EB8 + x"06",x"02",x"0F",x"01",x"00",x"08",x"02",x"0F", -- 0x1EC0 + x"01",x"04",x"08",x"02",x"80",x"09",x"1A",x"08", -- 0x1EC8 + x"02",x"0F",x"01",x"0A",x"09",x"07",x"0F",x"01", -- 0x1ED0 + x"19",x"0A",x"01",x"0F",x"01",x"05",x"0B",x"03", -- 0x1ED8 + x"80",x"10",x"08",x"0B",x"01",x"0F",x"01",x"19", -- 0x1EE0 + x"0C",x"03",x"0F",x"01",x"00",x"0D",x"02",x"0F", -- 0x1EE8 + x"01",x"14",x"0D",x"03",x"0F",x"01",x"00",x"0F", -- 0x1EF0 + x"1C",x"0F",x"0F",x"00",x"01",x"00",x"04",x"1A", -- 0x1EF8 + x"09",x"10",x"01",x"15",x"09",x"10",x"0B",x"0B", -- 0x1F00 + x"0C",x"07",x"1B",x"01",x"10",x"00",x"15",x"06", -- 0x1F08 + x"15",x"07",x"15",x"08",x"0B",x"0A",x"0B",x"0B", -- 0x1F10 + x"10",x"0A",x"01",x"41",x"54",x"54",x"41",x"43", -- 0x1F18 + x"4B",x"20",x"4F",x"46",x"20",x"54",x"48",x"45", -- 0x1F20 + x"20",x"4D",x"55",x"54",x"41",x"4E",x"54",x"20", -- 0x1F28 + x"50",x"48",x"4F",x"4E",x"45",x"53",x"00",x"04", -- 0x1F30 + x"08",x"02",x"50",x"09",x"00",x"02",x"01",x"05", -- 0x1F38 + x"45",x"1B",x"15",x"00",x"1B",x"01",x"00",x"04", -- 0x1F40 + x"11",x"06",x"1B",x"0D",x"24",x"F0",x"70",x"18", -- 0x1F48 + x"70",x"70",x"A8",x"01",x"F0",x"20",x"68",x"20", -- 0x1F50 + x"20",x"90",x"01",x"E0",x"02",x"20",x"10",x"20", -- 0x1F58 + x"68",x"02",x"E0",x"0B",x"02",x"58",x"02",x"38", -- 0x1F60 + x"01",x"E0",x"12",x"30",x"90",x"30",x"68",x"01", -- 0x1F68 + x"E0",x"17",x"02",x"B8",x"02",x"68",x"FD",x"00", -- 0x1F70 + x"05",x"00",x"01",x"46",x"07",x"10",x"00",x"01", -- 0x1F78 + x"25",x"07",x"11",x"00",x"01",x"46",x"07",x"14", -- 0x1F80 + x"00",x"01",x"25",x"07",x"0E",x"02",x"02",x"80", -- 0x1F88 + x"01",x"00",x"05",x"03",x"08",x"01",x"08",x"05", -- 0x1F90 + x"05",x"80",x"01",x"0D",x"05",x"85",x"25",x"07", -- 0x1F98 + x"10",x"05",x"8B",x"25",x"07",x"11",x"05",x"04", -- 0x1FA0 + x"80",x"01",x"15",x"05",x"02",x"08",x"01",x"1B", -- 0x1FA8 + x"06",x"01",x"08",x"01",x"05",x"07",x"02",x"08", -- 0x1FB0 + x"01",x"02",x"08",x"01",x"08",x"01",x"16",x"08", -- 0x1FB8 + x"06",x"08",x"0F",x"09",x"09",x"04",x"08",x"01", -- 0x1FC0 + x"05",x"0A",x"01",x"08",x"01",x"11",x"0A",x"03", -- 0x1FC8 + x"08",x"01",x"16",x"0B",x"02",x"08",x"01",x"00", -- 0x1FD0 + x"0C",x"06",x"08",x"01",x"0A",x"0D",x"03",x"08", -- 0x1FD8 + x"01",x"0D",x"0D",x"83",x"25",x"07",x"11",x"0D", -- 0x1FE0 + x"08",x"50",x"09",x"00",x"0F",x"0D",x"08",x"01", -- 0x1FE8 + x"0D",x"0F",x"03",x"08",x"01",x"11",x"0F",x"0B", -- 0x1FF0 + x"08",x"01",x"0E",x"0D",x"00",x"02",x"30",x"0F", -- 0x1FF8 + x"14",x"0C",x"19",x"0C",x"02",x"3C",x"05",x"01", -- 0x2000 + x"00",x"09",x"00",x"00",x"52",x"45",x"54",x"55", -- 0x2008 + x"52",x"4E",x"20",x"4F",x"46",x"20",x"41",x"4C", -- 0x2010 + x"49",x"45",x"4E",x"20",x"4B",x"4F",x"4E",x"47", -- 0x2018 + x"20",x"42",x"45",x"41",x"53",x"54",x"00",x"11", -- 0x2020 + x"0D",x"09",x"50",x"09",x"01",x"00",x"0D",x"05", -- 0x2028 + x"45",x"1B",x"0E",x"03",x"17",x"05",x"01",x"06", -- 0x2030 + x"0F",x"07",x"1A",x"0D",x"31",x"A0",x"40",x"68", -- 0x2038 + x"40",x"00",x"40",x"FF",x"A0",x"50",x"58",x"50", -- 0x2040 + x"50",x"70",x"01",x"A0",x"B0",x"30",x"B0",x"B0", -- 0x2048 + x"C8",x"01",x"90",x"0E",x"00",x"70",x"00",x"70", -- 0x2050 + x"00",x"00",x"00",x"00",x"1C",x"27",x"09",x"02", -- 0x2058 + x"01",x"8E",x"16",x"09",x"06",x"03",x"12",x"05", -- 0x2060 + x"05",x"1A",x"03",x"02",x"05",x"05",x"06",x"06", -- 0x2068 + x"02",x"05",x"05",x"0A",x"06",x"04",x"05",x"05", -- 0x2070 + x"10",x"06",x"05",x"05",x"05",x"17",x"06",x"02", -- 0x2078 + x"05",x"05",x"1B",x"06",x"01",x"05",x"05",x"06", -- 0x2080 + x"09",x"05",x"05",x"05",x"0D",x"09",x"03",x"05", -- 0x2088 + x"05",x"13",x"09",x"03",x"05",x"05",x"18",x"09", -- 0x2090 + x"04",x"05",x"05",x"06",x"0C",x"03",x"05",x"05", -- 0x2098 + x"0B",x"0C",x"03",x"05",x"05",x"10",x"0C",x"04", -- 0x20A0 + x"05",x"05",x"16",x"0C",x"02",x"05",x"05",x"1A", -- 0x20A8 + x"0C",x"02",x"05",x"05",x"00",x"0F",x"02",x"05", -- 0x20B0 + x"05",x"02",x"0F",x"18",x"58",x"0F",x"1A",x"0F", -- 0x20B8 + x"02",x"05",x"05",x"00",x"0D",x"00",x"00",x"33", -- 0x20C0 + x"01",x"00",x"3A",x"01",x"08",x"4F",x"52",x"45", -- 0x20C8 + x"20",x"52",x"45",x"46",x"49",x"4E",x"45",x"52", -- 0x20D0 + x"59",x"00",x"02",x"0F",x"18",x"58",x"0F",x"01", -- 0x20D8 + x"1A",x"0D",x"05",x"45",x"1B",x"18",x"03",x"09", -- 0x20E0 + x"06",x"12",x"09",x"17",x"09",x"0A",x"0C",x"41", -- 0x20E8 + x"C0",x"30",x"08",x"30",x"30",x"D0",x"02",x"C0", -- 0x20F0 + x"80",x"20",x"80",x"30",x"D0",x"01",x"C0",x"88", -- 0x20F8 + x"38",x"88",x"30",x"D0",x"FE",x"C0",x"98",x"50", -- 0x2100 + x"98",x"30",x"D0",x"01",x"B0",x"04",x"38",x"20", -- 0x2108 + x"08",x"68",x"02",x"01",x"0E",x"05",x"01",x"06", -- 0x2110 + x"05",x"0F",x"05",x"01",x"07",x"05",x"02",x"06", -- 0x2118 + x"01",x"06",x"05",x"03",x"06",x"01",x"07",x"05", -- 0x2120 + x"0A",x"06",x"01",x"06",x"05",x"0B",x"06",x"01", -- 0x2128 + x"07",x"05",x"12",x"06",x"01",x"06",x"05",x"13", -- 0x2130 + x"06",x"01",x"07",x"05",x"1A",x"06",x"01",x"06", -- 0x2138 + x"05",x"1B",x"06",x"01",x"07",x"05",x"06",x"07", -- 0x2140 + x"01",x"06",x"05",x"07",x"07",x"01",x"07",x"05", -- 0x2148 + x"16",x"07",x"01",x"06",x"05",x"17",x"07",x"01", -- 0x2150 + x"07",x"05",x"04",x"09",x"01",x"06",x"05",x"05", -- 0x2158 + x"09",x"01",x"07",x"05",x"0C",x"09",x"01",x"06", -- 0x2160 + x"05",x"0D",x"09",x"01",x"07",x"05",x"14",x"09", -- 0x2168 + x"01",x"06",x"05",x"15",x"09",x"01",x"07",x"05", -- 0x2170 + x"1A",x"09",x"01",x"06",x"05",x"1B",x"09",x"01", -- 0x2178 + x"07",x"05",x"00",x"0B",x"01",x"06",x"05",x"01", -- 0x2180 + x"0B",x"01",x"07",x"05",x"08",x"0B",x"01",x"06", -- 0x2188 + x"05",x"09",x"0B",x"01",x"07",x"05",x"0E",x"0B", -- 0x2190 + x"06",x"58",x"0F",x"18",x"0B",x"01",x"06",x"05", -- 0x2198 + x"19",x"0B",x"01",x"07",x"05",x"06",x"0D",x"01", -- 0x21A0 + x"06",x"05",x"07",x"0D",x"01",x"07",x"05",x"00", -- 0x21A8 + x"0F",x"1C",x"29",x"05",x"0E",x"00",x"00",x"00", -- 0x21B0 + x"33",x"01",x"00",x"3A",x"01",x"05",x"53",x"4B", -- 0x21B8 + x"59",x"4C",x"41",x"42",x"20",x"4C",x"41",x"4E", -- 0x21C0 + x"44",x"49",x"4E",x"47",x"20",x"42",x"41",x"59", -- 0x21C8 + x"00",x"0E",x"0B",x"06",x"58",x"0F",x"00",x"1A", -- 0x21D0 + x"0D",x"04",x"44",x"01",x"16",x"02",x"0F",x"07", -- 0x21D8 + x"1A",x"07",x"02",x"08",x"03",x"E0",x"00",x"20", -- 0x21E0 + x"00",x"00",x"48",x"04",x"E0",x"0A",x"00",x"50", -- 0x21E8 + x"00",x"20",x"01",x"E0",x"14",x"10",x"A0",x"00", -- 0x21F0 + x"38",x"03",x"00",x"04",x"00",x"18",x"2A",x"07", -- 0x21F8 + x"1A",x"01",x"8E",x"15",x"07",x"1B",x"01",x"8E", -- 0x2200 + x"15",x"07",x"06",x"03",x"0F",x"50",x"05",x"15", -- 0x2208 + x"03",x"05",x"0F",x"01",x"06",x"04",x"01",x"1B", -- 0x2210 + x"01",x"06",x"05",x"01",x"1A",x"09",x"19",x"04", -- 0x2218 + x"86",x"1B",x"01",x"19",x"0A",x"01",x"1A",x"09", -- 0x2220 + x"00",x"05",x"04",x"0F",x"01",x"15",x"06",x"02", -- 0x2228 + x"0F",x"01",x"05",x"07",x"01",x"80",x"10",x"0A", -- 0x2230 + x"07",x"02",x"0F",x"01",x"02",x"08",x"02",x"0F", -- 0x2238 + x"01",x"10",x"08",x"02",x"0F",x"01",x"16",x"09", -- 0x2240 + x"02",x"0F",x"01",x"00",x"0A",x"02",x"0F",x"01", -- 0x2248 + x"0A",x"0A",x"02",x"0F",x"01",x"10",x"0B",x"02", -- 0x2250 + x"0F",x"01",x"04",x"0C",x"02",x"0F",x"01",x"15", -- 0x2258 + x"0C",x"02",x"0F",x"01",x"0A",x"0D",x"02",x"0F", -- 0x2260 + x"01",x"00",x"0F",x"1C",x"0F",x"01",x"00",x"03", -- 0x2268 + x"00",x"00",x"33",x"01",x"00",x"3A",x"01",x"0A", -- 0x2270 + x"54",x"48",x"45",x"20",x"42",x"41",x"4E",x"4B", -- 0x2278 + x"00",x"06",x"03",x"0F",x"50",x"05",x"00",x"01", -- 0x2280 + x"0D",x"03",x"45",x"1B",x"16",x"02",x"0A",x"06", -- 0x2288 + x"18",x"0E",x"13",x"C0",x"78",x"68",x"78",x"78", -- 0x2290 + x"88",x"01",x"E0",x"07",x"28",x"38",x"24",x"68", -- 0x2298 + x"02",x"E0",x"0D",x"40",x"68",x"24",x"68",x"01", -- 0x22A0 + x"E0",x"12",x"50",x"90",x"20",x"68",x"FD",x"00", -- 0x22A8 + x"00",x"05",x"01",x"08",x"01",x"05",x"05",x"01", -- 0x22B0 + x"08",x"01",x"14",x"05",x"02",x"08",x"01",x"03", -- 0x22B8 + x"07",x"01",x"08",x"01",x"16",x"07",x"06",x"08", -- 0x22C0 + x"01",x"0A",x"05",x"84",x"2B",x"17",x"0D",x"05", -- 0x22C8 + x"84",x"2B",x"17",x"0E",x"06",x"83",x"2B",x"17", -- 0x22D0 + x"0F",x"07",x"82",x"2B",x"17",x"10",x"08",x"81", -- 0x22D8 + x"2B",x"17",x"00",x"09",x"02",x"80",x"01",x"02", -- 0x22E0 + x"09",x"18",x"50",x"09",x"09",x"0B",x"02",x"2B", -- 0x22E8 + x"17",x"0B",x"0B",x"02",x"08",x"01",x"0B",x"0B", -- 0x22F0 + x"02",x"08",x"01",x"19",x"0B",x"01",x"08",x"01", -- 0x22F8 + x"00",x"0C",x"09",x"08",x"01",x"13",x"0D",x"01", -- 0x2300 + x"08",x"01",x"19",x"0D",x"01",x"08",x"01",x"16", -- 0x2308 + x"0E",x"03",x"36",x"0F",x"00",x"0F",x"1C",x"08", -- 0x2310 + x"01",x"0B",x"05",x"00",x"00",x"33",x"01",x"00", -- 0x2318 + x"3A",x"01",x"04",x"54",x"48",x"45",x"20",x"53", -- 0x2320 + x"49",x"58",x"54",x"45",x"45",x"4E",x"54",x"48", -- 0x2328 + x"20",x"43",x"41",x"56",x"45",x"52",x"4E",x"00", -- 0x2330 + x"02",x"09",x"18",x"50",x"09",x"00",x"01",x"0D", -- 0x2338 + x"04",x"45",x"1B",x"00",x"00",x"1B",x"02",x"0C", -- 0x2340 + x"07",x"10",x"0A",x"40",x"20",x"B0",x"28",x"B0", -- 0x2348 + x"B0",x"D0",x"01",x"20",x"88",x"38",x"88",x"88", -- 0x2350 + x"A0",x"01",x"20",x"10",x"50",x"10",x"02",x"38", -- 0x2358 + x"01",x"20",x"50",x"68",x"50",x"02",x"88",x"01", -- 0x2360 + x"00",x"00",x"05",x"1C",x"90",x"05",x"00",x"06", -- 0x2368 + x"1C",x"90",x"05",x"00",x"07",x"1C",x"90",x"05", -- 0x2370 + x"00",x"08",x"1C",x"90",x"05",x"00",x"09",x"1C", -- 0x2378 + x"90",x"05",x"00",x"0A",x"1C",x"90",x"05",x"00", -- 0x2380 + x"0B",x"1C",x"90",x"05",x"00",x"0C",x"1C",x"90", -- 0x2388 + x"05",x"02",x"08",x"85",x"00",x"00",x"03",x"08", -- 0x2390 + x"85",x"00",x"00",x"08",x"05",x"88",x"00",x"00", -- 0x2398 + x"09",x"05",x"88",x"00",x"00",x"11",x"05",x"85", -- 0x23A0 + x"00",x"00",x"12",x"05",x"85",x"00",x"00",x"18", -- 0x23A8 + x"05",x"88",x"00",x"00",x"19",x"05",x"88",x"00", -- 0x23B0 + x"00",x"0C",x"08",x"05",x"58",x"0F",x"00",x"05", -- 0x23B8 + x"02",x"11",x"05",x"1A",x"05",x"02",x"11",x"05", -- 0x23C0 + x"18",x"0E",x"04",x"11",x"05",x"00",x"0F",x"1C", -- 0x23C8 + x"11",x"05",x"1A",x"01",x"00",x"06",x"32",x"07", -- 0x23D0 + x"05",x"04",x"07",x"04",x"0B",x"04",x"0E",x"04", -- 0x23D8 + x"14",x"04",x"16",x"04",x"04",x"3E",x"05",x"02", -- 0x23E0 + x"06",x"17",x"07",x"14",x"0A",x"07",x"0B",x"08", -- 0x23E8 + x"54",x"48",x"45",x"20",x"57",x"41",x"52",x"45", -- 0x23F0 + x"48",x"4F",x"55",x"53",x"45",x"00",x"0C",x"08", -- 0x23F8 + x"05",x"58",x"0F",x"01",x"00",x"03",x"05",x"45", -- 0x2400 + x"1B",x"16",x"05",x"0D",x"07",x"00",x"09",x"11", -- 0x2408 + x"0A",x"17",x"0B",x"24",x"70",x"20",x"68",x"20", -- 0x2410 + x"20",x"30",x"01",x"70",x"50",x"68",x"50",x"50", -- 0x2418 + x"B0",x"01",x"40",x"02",x"40",x"10",x"40",x"68", -- 0x2420 + x"02",x"40",x"08",x"40",x"40",x"00",x"68",x"FD", -- 0x2428 + x"40",x"11",x"30",x"88",x"00",x"40",x"01",x"40", -- 0x2430 + x"18",x"00",x"C0",x"00",x"60",x"04",x"00",x"19", -- 0x2438 + x"00",x"01",x"2D",x"09",x"02",x"05",x"1A",x"08", -- 0x2440 + x"01",x"00",x"07",x"02",x"08",x"01",x"0B",x"08", -- 0x2448 + x"11",x"08",x"01",x"02",x"09",x"07",x"08",x"01", -- 0x2450 + x"1B",x"0A",x"01",x"08",x"01",x"02",x"0C",x"1A", -- 0x2458 + x"08",x"01",x"00",x"0D",x"02",x"08",x"01",x"04", -- 0x2460 + x"05",x"88",x"00",x"00",x"05",x"05",x"88",x"00", -- 0x2468 + x"00",x"09",x"05",x"88",x"00",x"00",x"0A",x"05", -- 0x2470 + x"88",x"00",x"00",x"13",x"05",x"88",x"00",x"00", -- 0x2478 + x"14",x"05",x"88",x"00",x"00",x"18",x"05",x"88", -- 0x2480 + x"00",x"00",x"19",x"05",x"88",x"00",x"00",x"00", -- 0x2488 + x"0F",x"1C",x"08",x"01",x"1A",x"00",x"00",x"00", -- 0x2490 + x"34",x"01",x"00",x"3B",x"01",x"04",x"4F",x"4D", -- 0x2498 + x"4F",x"45",x"42",x"41",x"54",x"52",x"4F",x"4E", -- 0x24A0 + x"53",x"27",x"20",x"52",x"45",x"56",x"45",x"4E", -- 0x24A8 + x"47",x"45",x"00",x"02",x"0D",x"00",x"58",x"0F", -- 0x24B0 + x"00",x"1A",x"0D",x"01",x"45",x"1B",x"0F",x"01", -- 0x24B8 + x"34",x"C0",x"58",x"30",x"58",x"58",x"88",x"02", -- 0x24C0 + x"C0",x"78",x"50",x"78",x"58",x"88",x"01",x"C0", -- 0x24C8 + x"70",x"68",x"70",x"58",x"88",x"FE",x"B0",x"04", -- 0x24D0 + x"68",x"20",x"05",x"68",x"FC",x"B0",x"09",x"48", -- 0x24D8 + x"48",x"05",x"68",x"02",x"B0",x"13",x"48",x"98", -- 0x24E0 + x"05",x"68",x"04",x"B0",x"18",x"28",x"C0",x"05", -- 0x24E8 + x"68",x"01",x"0F",x"00",x"00",x"02",x"20",x"09", -- 0x24F0 + x"02",x"05",x"01",x"12",x"15",x"07",x"05",x"06", -- 0x24F8 + x"12",x"15",x"15",x"05",x"07",x"12",x"15",x"11", -- 0x2500 + x"07",x"02",x"12",x"15",x"00",x"08",x"01",x"12", -- 0x2508 + x"15",x"0B",x"08",x"03",x"12",x"15",x"15",x"08", -- 0x2510 + x"07",x"12",x"15",x"11",x"0A",x"01",x"12",x"15", -- 0x2518 + x"00",x"0B",x"03",x"12",x"15",x"0C",x"0C",x"05", -- 0x2520 + x"12",x"15",x"15",x"0B",x"07",x"12",x"15",x"00", -- 0x2528 + x"0E",x"02",x"20",x"09",x"00",x"0F",x"02",x"20", -- 0x2530 + x"09",x"02",x"0F",x"1A",x"12",x"15",x"14",x"0F", -- 0x2538 + x"01",x"20",x"09",x"00",x"01",x"00",x"00",x"33", -- 0x2540 + x"01",x"00",x"3A",x"01",x"04",x"53",x"4F",x"4C", -- 0x2548 + x"41",x"52",x"20",x"50",x"4F",x"57",x"45",x"52", -- 0x2550 + x"20",x"47",x"45",x"4E",x"45",x"52",x"41",x"54", -- 0x2558 + x"4F",x"52",x"00",x"05",x"0C",x"04",x"58",x"0F", -- 0x2560 + x"00",x"0C",x"0A",x"03",x"44",x"0F",x"1B",x"01", -- 0x2568 + x"00",x"05",x"1B",x"0C",x"43",x"70",x"B8",x"18", -- 0x2570 + x"B8",x"A0",x"D0",x"02",x"70",x"D0",x"30",x"D0", -- 0x2578 + x"98",x"D0",x"FE",x"70",x"C8",x"48",x"C8",x"98", -- 0x2580 + x"D0",x"FF",x"70",x"78",x"68",x"78",x"60",x"D0", -- 0x2588 + x"02",x"E0",x"03",x"58",x"18",x"04",x"68",x"03", -- 0x2590 + x"E0",x"09",x"38",x"48",x"30",x"68",x"FE",x"E0", -- 0x2598 + x"0E",x"48",x"70",x"02",x"50",x"FF",x"00",x"00", -- 0x25A0 + x"00",x"05",x"03",x"0F",x"00",x"01",x"05",x"03", -- 0x25A8 + x"0F",x"00",x"02",x"04",x"03",x"0F",x"02",x"02", -- 0x25B0 + x"84",x"28",x"09",x"05",x"00",x"17",x"01",x"01", -- 0x25B8 + x"05",x"01",x"17",x"01",x"01",x"04",x"02",x"18", -- 0x25C0 + x"01",x"01",x"17",x"02",x"05",x"04",x"01",x"17", -- 0x25C8 + x"03",x"05",x"04",x"01",x"00",x"03",x"83",x"01", -- 0x25D0 + x"01",x"01",x"03",x"83",x"01",x"01",x"03",x"03", -- 0x25D8 + x"0C",x"01",x"01",x"03",x"04",x"03",x"01",x"01", -- 0x25E0 + x"06",x"04",x"01",x"3F",x"09",x"05",x"05",x"01", -- 0x25E8 + x"3F",x"09",x"07",x"04",x"02",x"2E",x"09",x"06", -- 0x25F0 + x"05",x"04",x"2E",x"09",x"09",x"04",x"01",x"1F", -- 0x25F8 + x"09",x"0A",x"05",x"01",x"1F",x"09",x"13",x"00", -- 0x2600 + x"01",x"3F",x"09",x"14",x"00",x"02",x"2E",x"09", -- 0x2608 + x"16",x"00",x"01",x"1F",x"09",x"13",x"01",x"82", -- 0x2610 + x"2E",x"0F",x"14",x"01",x"82",x"1E",x"01",x"15", -- 0x2618 + x"01",x"82",x"1E",x"01",x"16",x"01",x"82",x"2E", -- 0x2620 + x"0F",x"13",x"03",x"04",x"2E",x"0F",x"0A",x"04", -- 0x2628 + x"03",x"01",x"01",x"03",x"05",x"02",x"01",x"01", -- 0x2630 + x"0B",x"05",x"01",x"01",x"01",x"1A",x"08",x"02", -- 0x2638 + x"08",x"01",x"18",x"0A",x"01",x"80",x"01",x"19", -- 0x2640 + x"0B",x"01",x"08",x"01",x"00",x"0C",x"01",x"08", -- 0x2648 + x"01",x"03",x"0D",x"01",x"08",x"01",x"00",x"0F", -- 0x2650 + x"1C",x"08",x"01",x"0F",x"04",x"0D",x"24",x"15", -- 0x2658 + x"0D",x"05",x"03",x"24",x"15",x"12",x"05",x"83", -- 0x2660 + x"24",x"15",x"0D",x"06",x"03",x"24",x"15",x"00", -- 0x2668 + x"06",x"04",x"24",x"15",x"00",x"07",x"10",x"24", -- 0x2670 + x"15",x"04",x"06",x"03",x"03",x"0F",x"07",x"06", -- 0x2678 + x"02",x"01",x"01",x"09",x"06",x"04",x"03",x"0F", -- 0x2680 + x"0C",x"05",x"01",x"03",x"0F",x"10",x"05",x"00", -- 0x2688 + x"06",x"31",x"05",x"0D",x"04",x"0E",x"04",x"0F", -- 0x2690 + x"03",x"10",x"03",x"11",x"03",x"12",x"03",x"04", -- 0x2698 + x"1A",x"05",x"06",x"0B",x"09",x"0B",x"0E",x"0B", -- 0x26A0 + x"12",x"0B",x"06",x"54",x"48",x"45",x"20",x"46", -- 0x26A8 + x"49",x"4E",x"41",x"4C",x"20",x"42",x"41",x"52", -- 0x26B0 + x"52",x"49",x"45",x"52",x"00",x"00",x"0A",x"14", -- 0x26B8 + x"58",x"0F",x"01",x"19",x"0D",x"05",x"45",x"1B", -- 0x26C0 + x"14",x"05",x"1B",x"06",x"07",x"0B",x"0B",x"0B", -- 0x26C8 + x"10",x"0B",x"11",x"70",x"38",x"68",x"38",x"20", -- 0x26D0 + x"98",x"02",x"E0",x"15",x"30",x"A8",x"28",x"68", -- 0x26D8 + x"01",x"00",x"21",x"07",x"27",x"16",x"16",x"0E", -- 0x26E0 + x"0A",x"1E",x"00",x"06",x"1C",x"7E",x"23",x"E5", -- 0x26E8 + x"D5",x"F5",x"CD",x"6D",x"0B",x"F1",x"C6",x"80", -- 0x26F0 + x"77",x"CB",x"D4",x"36",x"1B",x"D1",x"E1",x"1C", -- 0x26F8 + x"10",x"EB",x"14",x"0D",x"20",x"E3",x"C9",x"20", -- 0x2700 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2708 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2710 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2718 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"50", -- 0x2720 + x"41",x"43",x"2D",x"4D",x"41",x"4E",x"49",x"43", -- 0x2728 + x"2D",x"4D",x"49",x"4E",x"45",x"52",x"2D",x"4D", -- 0x2730 + x"41",x"4E",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2738 + x"57",x"52",x"49",x"54",x"54",x"45",x"4E",x"20", -- 0x2740 + x"42",x"59",x"20",x"4A",x"49",x"4D",x"20",x"42", -- 0x2748 + x"41",x"47",x"4C",x"45",x"59",x"20",x"46",x"4F", -- 0x2750 + x"52",x"20",x"20",x"20",x"20",x"50",x"41",x"43", -- 0x2758 + x"4D",x"41",x"4E",x"20",x"41",x"52",x"43",x"41", -- 0x2760 + x"44",x"45",x"20",x"48",x"41",x"52",x"44",x"57", -- 0x2768 + x"41",x"52",x"45",x"2E",x"20",x"20",x"20",x"20", -- 0x2770 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2778 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2780 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2788 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2790 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2798 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x27A0 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x27A8 + x"20",x"20",x"4A",x"55",x"4D",x"50",x"20",x"3D", -- 0x27B0 + x"20",x"4A",x"4F",x"59",x"20",x"32",x"20",x"2D", -- 0x27B8 + x"3E",x"20",x"52",x"49",x"47",x"48",x"54",x"20", -- 0x27C0 + x"20",x"20",x"20",x"20",x"4D",x"55",x"53",x"49", -- 0x27C8 + x"43",x"20",x"4F",x"4E",x"2F",x"4F",x"46",x"46", -- 0x27D0 + x"20",x"3D",x"20",x"4A",x"4F",x"59",x"20",x"32", -- 0x27D8 + x"20",x"2D",x"3E",x"20",x"55",x"50",x"20",x"20", -- 0x27E0 + x"46",x"58",x"20",x"4F",x"4E",x"2F",x"4F",x"46", -- 0x27E8 + x"46",x"20",x"3D",x"20",x"4A",x"4F",x"59",x"20", -- 0x27F0 + x"32",x"20",x"2D",x"3E",x"20",x"44",x"4F",x"57", -- 0x27F8 + x"4E",x"2E",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2800 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2808 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x2810 + x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"41", -- 0x2818 + x"49",x"52",x"20",x"E7",x"E7",x"E7",x"E7",x"E7", -- 0x2820 + x"E7",x"00",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7", -- 0x2828 + x"E7",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7", -- 0x2830 + x"E7",x"E7",x"E7",x"E7",x"00",x"48",x"49",x"53", -- 0x2838 + x"43",x"4F",x"52",x"45",x"20",x"00",x"20",x"20", -- 0x2840 + x"53",x"43",x"4F",x"52",x"45",x"20",x"00",x"00", -- 0x2848 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2850 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2858 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2860 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2868 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2870 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2878 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2880 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2888 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2890 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2898 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2900 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2908 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2910 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2918 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2920 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2928 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2930 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2938 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2940 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2948 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2950 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2958 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2960 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2968 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2970 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2978 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2980 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2988 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2990 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2998 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2ED0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2ED8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3000 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3008 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3010 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3018 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3020 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3028 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3030 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3038 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3040 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3048 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3050 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3058 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3060 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3068 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3070 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3080 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3088 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3090 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3098 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3100 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3108 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3110 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3118 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3120 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3128 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3130 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3138 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3140 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3148 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3150 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3190 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3200 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3208 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3210 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3218 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3220 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3228 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3230 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3238 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3240 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3248 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3250 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3270 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3290 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3298 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3300 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3308 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3310 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3318 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3320 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3328 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3330 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3338 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3340 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3348 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3350 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3358 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3360 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3368 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3378 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3380 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3388 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3390 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3398 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3400 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3408 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3410 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3418 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3420 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3428 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3430 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3438 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3440 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3448 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3450 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3458 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3460 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3468 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3470 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3478 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3480 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3488 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3490 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3498 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3500 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3510 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3518 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3520 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3530 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3538 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3540 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3550 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3558 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3560 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3570 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3580 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3588 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3590 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3608 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3610 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3620 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3628 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3630 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3638 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3640 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3648 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3650 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3658 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3660 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3668 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3670 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3678 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3688 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3690 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3698 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3700 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3708 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3710 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3718 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3720 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3728 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3730 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3738 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3740 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3748 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3750 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3758 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3760 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3768 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3770 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3778 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3780 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3788 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3790 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3798 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3800 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3808 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3810 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3818 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3820 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3828 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3830 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3838 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3840 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3848 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3850 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3858 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3860 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3868 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3870 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3878 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3880 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3888 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3890 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3898 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3900 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3908 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3910 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3918 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3920 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3928 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3930 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3938 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3940 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3948 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3950 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3958 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3960 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3968 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3970 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3978 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3980 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3988 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3990 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3998 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3ED0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3ED8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x3FF8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/gfx1.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/gfx1.vhd new file mode 100644 index 00000000..e2802758 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/gfx1.vhd @@ -0,0 +1,2077 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity GFX1 is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(13 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of GFX1 is + + + type ROM_ARRAY is array(0 to 16383) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0000 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0008 + x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0", -- 0x0010 + x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0", -- 0x0018 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0020 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0028 + x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0", -- 0x0030 + x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0", -- 0x0038 + x"F0",x"0F",x"0F",x"F0",x"F0",x"0F",x"0F",x"F0", -- 0x0040 + x"C3",x"0F",x"0F",x"C3",x"C3",x"0F",x"0F",x"C3", -- 0x0048 + x"33",x"33",x"BB",x"77",x"33",x"33",x"BB",x"77", -- 0x0050 + x"EE",x"DD",x"CC",x"CC",x"EE",x"DD",x"CC",x"CC", -- 0x0058 + x"F0",x"F0",x"F0",x"F8",x"FC",x"FF",x"FF",x"F0", -- 0x0060 + x"FC",x"FE",x"FD",x"FC",x"FC",x"FF",x"FF",x"FC", -- 0x0068 + x"F0",x"FF",x"FF",x"FC",x"F8",x"F0",x"F0",x"F0", -- 0x0070 + x"FC",x"FF",x"FF",x"FC",x"FC",x"FD",x"FE",x"FC", -- 0x0078 + x"88",x"00",x"88",x"00",x"00",x"00",x"CC",x"88", -- 0x0080 + x"EE",x"FF",x"DD",x"FF",x"EE",x"DD",x"FF",x"EE", -- 0x0088 + x"78",x"F0",x"78",x"F0",x"F0",x"F0",x"3C",x"78", -- 0x0090 + x"1E",x"0F",x"0F",x"0F",x"1E",x"2D",x"0F",x"1E", -- 0x0098 + x"66",x"AA",x"AA",x"66",x"66",x"AA",x"AA",x"66", -- 0x00A0 + x"DD",x"EE",x"EE",x"DD",x"DD",x"EE",x"EE",x"DD", -- 0x00A8 + x"88",x"00",x"88",x"00",x"00",x"00",x"CC",x"88", -- 0x00B0 + x"EE",x"FF",x"DD",x"FF",x"EE",x"DD",x"FF",x"EE", -- 0x00B8 + x"87",x"0F",x"87",x"0F",x"0F",x"0F",x"C3",x"87", -- 0x00C0 + x"E1",x"F0",x"D2",x"F0",x"E1",x"D2",x"F0",x"E1", -- 0x00C8 + x"C0",x"A0",x"A0",x"C0",x"C0",x"A0",x"A0",x"C0", -- 0x00D0 + x"F0",x"C0",x"C0",x"F0",x"F0",x"C0",x"C0",x"F0", -- 0x00D8 + x"00",x"00",x"80",x"F0",x"00",x"00",x"00",x"00", -- 0x00E0 + x"60",x"70",x"F0",x"F0",x"D0",x"E0",x"E0",x"60", -- 0x00E8 + x"80",x"00",x"80",x"00",x"00",x"00",x"C0",x"80", -- 0x00F0 + x"E0",x"F0",x"D0",x"F0",x"E0",x"D0",x"F0",x"E0", -- 0x00F8 + x"F8",x"F0",x"F8",x"F0",x"F0",x"F0",x"FC",x"F8", -- 0x0100 + x"FE",x"FF",x"FD",x"FF",x"FE",x"FD",x"FF",x"FE", -- 0x0108 + x"80",x"00",x"80",x"00",x"00",x"00",x"C0",x"80", -- 0x0110 + x"E0",x"F0",x"D0",x"F0",x"E0",x"D0",x"F0",x"E0", -- 0x0118 + x"70",x"F0",x"70",x"F0",x"F0",x"F0",x"30",x"70", -- 0x0120 + x"10",x"00",x"20",x"00",x"10",x"20",x"00",x"10", -- 0x0128 + x"00",x"AA",x"00",x"44",x"88",x"44",x"00",x"AA", -- 0x0130 + x"DD",x"EE",x"DD",x"EE",x"CC",x"DD",x"FF",x"EE", -- 0x0138 + x"00",x"88",x"00",x"88",x"00",x"88",x"00",x"88", -- 0x0140 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0148 + x"00",x"00",x"00",x"FF",x"FF",x"00",x"00",x"00", -- 0x0150 + x"CC",x"CC",x"CC",x"FF",x"FF",x"CC",x"CC",x"CC", -- 0x0158 + x"FF",x"00",x"00",x"00",x"00",x"00",x"00",x"FF", -- 0x0160 + x"FF",x"88",x"88",x"88",x"88",x"88",x"88",x"FF", -- 0x0168 + x"0F",x"5A",x"A5",x"5A",x"A5",x"5A",x"A5",x"0F", -- 0x0170 + x"0F",x"5A",x"A5",x"5A",x"A5",x"5A",x"A5",x"0F", -- 0x0178 + x"F2",x"F4",x"FF",x"FC",x"FC",x"FF",x"F4",x"F2", -- 0x0180 + x"F9",x"F5",x"FA",x"F3",x"F3",x"FA",x"F5",x"F9", -- 0x0188 + x"00",x"44",x"55",x"AA",x"FF",x"AA",x"55",x"44", -- 0x0190 + x"00",x"00",x"11",x"00",x"FF",x"00",x"11",x"00", -- 0x0198 + x"00",x"99",x"AA",x"44",x"FF",x"44",x"AA",x"99", -- 0x01A0 + x"00",x"22",x"22",x"11",x"FF",x"11",x"22",x"22", -- 0x01A8 + x"00",x"00",x"00",x"00",x"FF",x"00",x"00",x"00", -- 0x01B0 + x"00",x"00",x"00",x"00",x"FF",x"00",x"00",x"00", -- 0x01B8 + x"00",x"22",x"66",x"99",x"88",x"99",x"66",x"22", -- 0x01C0 + x"00",x"55",x"55",x"22",x"FF",x"22",x"55",x"55", -- 0x01C8 + x"00",x"00",x"00",x"00",x"F0",x"00",x"00",x"00", -- 0x01D0 + x"00",x"00",x"00",x"00",x"F0",x"00",x"00",x"00", -- 0x01D8 + x"00",x"0E",x"0E",x"0E",x"0E",x"0E",x"0E",x"00", -- 0x01E0 + x"00",x"07",x"07",x"07",x"07",x"07",x"07",x"00", -- 0x01E8 + x"1F",x"3F",x"7F",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x01F0 + x"0F",x"0F",x"0F",x"0F",x"1F",x"3F",x"7F",x"FF", -- 0x01F8 + x"F5",x"FD",x"F5",x"F7",x"F5",x"FD",x"F5",x"F7", -- 0x0200 + x"F5",x"FD",x"F5",x"F7",x"F5",x"FD",x"F5",x"F7", -- 0x0208 + x"FF",x"F2",x"F4",x"F8",x"F8",x"F4",x"F2",x"FF", -- 0x0210 + x"FF",x"F4",x"F2",x"F1",x"F1",x"F2",x"F4",x"FF", -- 0x0218 + x"FA",x"F2",x"FA",x"F8",x"FA",x"F2",x"FA",x"F8", -- 0x0220 + x"FA",x"F2",x"FA",x"F8",x"FA",x"F2",x"FA",x"F8", -- 0x0228 + x"5F",x"DF",x"5F",x"7F",x"5F",x"DF",x"5F",x"7F", -- 0x0230 + x"7F",x"DF",x"5F",x"7F",x"5F",x"DF",x"5F",x"7F", -- 0x0238 + x"FE",x"FB",x"FB",x"FE",x"FE",x"FB",x"FB",x"FE", -- 0x0240 + x"FE",x"FB",x"FB",x"FE",x"FE",x"FB",x"FB",x"FE", -- 0x0248 + x"F5",x"FD",x"F5",x"F7",x"F5",x"FD",x"F5",x"F7", -- 0x0250 + x"F5",x"FD",x"F5",x"F7",x"F5",x"FD",x"F5",x"F7", -- 0x0258 + x"FA",x"F2",x"FA",x"F8",x"FA",x"F2",x"FA",x"F8", -- 0x0260 + x"FA",x"F2",x"FA",x"F8",x"FA",x"F2",x"FA",x"F8", -- 0x0268 + x"F0",x"FF",x"F0",x"FF",x"FF",x"F0",x"FF",x"F0", -- 0x0270 + x"F0",x"FF",x"F0",x"FF",x"FF",x"F0",x"FF",x"F0", -- 0x0278 + x"F0",x"F7",x"F8",x"F7",x"F8",x"F3",x"FC",x"F0", -- 0x0280 + x"F0",x"FF",x"F0",x"FE",x"F1",x"F0",x"FF",x"F0", -- 0x0288 + x"FF",x"EE",x"CC",x"88",x"88",x"44",x"22",x"11", -- 0x0290 + x"77",x"BB",x"DD",x"EE",x"FF",x"EE",x"CC",x"88", -- 0x0298 + x"F5",x"FA",x"F5",x"FA",x"F5",x"FA",x"F5",x"FA", -- 0x02A0 + x"F5",x"FA",x"F5",x"FA",x"F5",x"FA",x"F5",x"FA", -- 0x02A8 + x"F9",x"F9",x"F9",x"FF",x"FA",x"FA",x"FF",x"F9", -- 0x02B0 + x"FF",x"F2",x"F2",x"FF",x"F4",x"F4",x"FF",x"F4", -- 0x02B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x02C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x02C8 + x"FF",x"F9",x"F9",x"F9",x"F9",x"F9",x"F9",x"FF", -- 0x02D0 + x"FF",x"F9",x"F9",x"F9",x"F9",x"F9",x"F9",x"FF", -- 0x02D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x02E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x02E8 + x"FF",x"F2",x"F4",x"F8",x"F8",x"F4",x"F2",x"FF", -- 0x02F0 + x"FF",x"F4",x"F2",x"F1",x"F1",x"F2",x"F4",x"FF", -- 0x02F8 + x"80",x"40",x"C0",x"20",x"F0",x"80",x"60",x"40", -- 0x0300 + x"10",x"00",x"A0",x"40",x"30",x"40",x"90",x"20", -- 0x0308 + x"F8",x"F4",x"FC",x"F2",x"FF",x"F8",x"F6",x"F4", -- 0x0310 + x"F1",x"F0",x"FA",x"F4",x"F3",x"F4",x"F9",x"F2", -- 0x0318 + x"88",x"44",x"CC",x"22",x"FF",x"88",x"66",x"44", -- 0x0320 + x"11",x"00",x"AA",x"44",x"33",x"44",x"99",x"22", -- 0x0328 + x"F8",x"F4",x"FC",x"F2",x"FF",x"F8",x"F6",x"F4", -- 0x0330 + x"F1",x"F0",x"FA",x"F4",x"F3",x"F4",x"F9",x"F2", -- 0x0338 + x"88",x"44",x"CC",x"22",x"FF",x"88",x"66",x"44", -- 0x0340 + x"11",x"00",x"AA",x"44",x"33",x"44",x"99",x"22", -- 0x0348 + x"87",x"4B",x"C3",x"2D",x"F0",x"87",x"69",x"4B", -- 0x0350 + x"1E",x"0F",x"A5",x"4B",x"3C",x"4B",x"96",x"2D", -- 0x0358 + x"10",x"F0",x"F0",x"70",x"10",x"F0",x"F0",x"70", -- 0x0360 + x"00",x"00",x"F0",x"00",x"00",x"00",x"F0",x"00", -- 0x0368 + x"30",x"50",x"50",x"60",x"80",x"E0",x"90",x"60", -- 0x0370 + x"20",x"50",x"20",x"A0",x"70",x"40",x"A0",x"40", -- 0x0378 + x"00",x"00",x"CC",x"FF",x"00",x"00",x"CC",x"00", -- 0x0380 + x"88",x"EE",x"FF",x"FF",x"FF",x"FF",x"FF",x"CC", -- 0x0388 + x"F0",x"F0",x"FC",x"FF",x"F0",x"F0",x"FC",x"F0", -- 0x0390 + x"F8",x"FE",x"FF",x"FF",x"FE",x"FD",x"FF",x"FC", -- 0x0398 + x"FF",x"FF",x"FF",x"F0",x"F7",x"FF",x"FF",x"FF", -- 0x03A0 + x"FF",x"F7",x"F1",x"F0",x"F0",x"F3",x"F7",x"FF", -- 0x03A8 + x"CC",x"88",x"DD",x"77",x"77",x"DD",x"88",x"CC", -- 0x03B0 + x"33",x"11",x"BB",x"EE",x"EE",x"BB",x"11",x"33", -- 0x03B8 + x"00",x"00",x"00",x"FF",x"88",x"00",x"00",x"00", -- 0x03C0 + x"00",x"88",x"EE",x"FF",x"FF",x"CC",x"88",x"00", -- 0x03C8 + x"F0",x"F0",x"F0",x"FF",x"F8",x"F0",x"F0",x"F0", -- 0x03D0 + x"F0",x"F8",x"FE",x"FF",x"FF",x"FC",x"F8",x"F0", -- 0x03D8 + x"FA",x"F4",x"F0",x"F9",x"FA",x"F1",x"F8",x"F4", -- 0x03E0 + x"FA",x"F1",x"F8",x"FD",x"F9",x"FC",x"F0",x"F9", -- 0x03E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"7F",x"3F",x"1F", -- 0x03F0 + x"FF",x"7F",x"3F",x"1F",x"0F",x"0F",x"0F",x"0F", -- 0x03F8 + x"F2",x"FF",x"F6",x"F2",x"FF",x"F6",x"F2",x"FF", -- 0x0400 + x"F9",x"FF",x"FB",x"F9",x"FF",x"FB",x"F9",x"FF", -- 0x0408 + x"FF",x"F6",x"F2",x"FF",x"F6",x"F2",x"FF",x"F6", -- 0x0410 + x"FF",x"FB",x"F9",x"FF",x"FB",x"F9",x"FF",x"FB", -- 0x0418 + x"F9",x"FF",x"FB",x"F9",x"FF",x"FB",x"F9",x"FF", -- 0x0420 + x"F4",x"FF",x"FD",x"F4",x"FF",x"FD",x"F4",x"FF", -- 0x0428 + x"FF",x"FB",x"F9",x"FF",x"FB",x"F9",x"FF",x"FB", -- 0x0430 + x"FF",x"FD",x"F4",x"FF",x"FD",x"F4",x"FF",x"FD", -- 0x0438 + x"F0",x"F2",x"F5",x"FA",x"F0",x"F8",x"F8",x"F0", -- 0x0440 + x"F0",x"F0",x"F0",x"F6",x"F9",x"F8",x"F4",x"F3", -- 0x0448 + x"00",x"22",x"55",x"AA",x"00",x"88",x"88",x"00", -- 0x0450 + x"00",x"00",x"00",x"66",x"99",x"88",x"44",x"33", -- 0x0458 + x"00",x"00",x"88",x"88",x"CC",x"BB",x"33",x"00", -- 0x0460 + x"EE",x"99",x"88",x"88",x"88",x"88",x"99",x"EE", -- 0x0468 + x"00",x"33",x"BB",x"CC",x"88",x"88",x"00",x"00", -- 0x0470 + x"EE",x"99",x"88",x"88",x"88",x"88",x"99",x"EE", -- 0x0478 + x"00",x"88",x"88",x"00",x"00",x"88",x"88",x"00", -- 0x0480 + x"88",x"55",x"11",x"66",x"22",x"FF",x"BB",x"CC", -- 0x0488 + x"00",x"88",x"88",x"00",x"00",x"88",x"88",x"00", -- 0x0490 + x"88",x"DD",x"33",x"66",x"22",x"77",x"99",x"CC", -- 0x0498 + x"00",x"88",x"88",x"00",x"00",x"88",x"88",x"00", -- 0x04A0 + x"88",x"FF",x"BB",x"66",x"22",x"55",x"11",x"CC", -- 0x04A8 + x"00",x"88",x"88",x"00",x"00",x"88",x"88",x"00", -- 0x04B0 + x"AA",x"FF",x"BB",x"EE",x"00",x"55",x"11",x"44", -- 0x04B8 + x"00",x"88",x"88",x"00",x"00",x"88",x"88",x"00", -- 0x04C0 + x"AA",x"FF",x"BB",x"CC",x"88",x"55",x"11",x"66", -- 0x04C8 + x"00",x"88",x"88",x"00",x"00",x"88",x"88",x"00", -- 0x04D0 + x"22",x"77",x"99",x"CC",x"88",x"DD",x"33",x"66", -- 0x04D8 + x"00",x"88",x"88",x"00",x"00",x"88",x"88",x"00", -- 0x04E0 + x"22",x"55",x"11",x"CC",x"88",x"FF",x"BB",x"66", -- 0x04E8 + x"00",x"88",x"88",x"00",x"00",x"88",x"88",x"00", -- 0x04F0 + x"00",x"55",x"11",x"44",x"AA",x"FF",x"BB",x"EE", -- 0x04F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0500 + x"00",x"AA",x"EE",x"EE",x"AA",x"AA",x"EE",x"EE", -- 0x0508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0510 + x"44",x"AA",x"AA",x"EE",x"EE",x"AA",x"AA",x"EE", -- 0x0518 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0520 + x"44",x"EE",x"AA",x"AA",x"EE",x"EE",x"AA",x"AA", -- 0x0528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0530 + x"00",x"EE",x"EE",x"AA",x"AA",x"EE",x"EE",x"AA", -- 0x0538 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0540 + x"00",x"AA",x"EE",x"EE",x"AA",x"AA",x"EE",x"EE", -- 0x0548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0550 + x"44",x"AA",x"AA",x"EE",x"EE",x"AA",x"AA",x"EE", -- 0x0558 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0560 + x"44",x"EE",x"AA",x"AA",x"EE",x"EE",x"AA",x"AA", -- 0x0568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0570 + x"00",x"EE",x"EE",x"AA",x"AA",x"EE",x"EE",x"AA", -- 0x0578 + x"60",x"20",x"20",x"60",x"60",x"20",x"20",x"60", -- 0x0580 + x"00",x"50",x"50",x"00",x"A0",x"F0",x"F0",x"A0", -- 0x0588 + x"60",x"20",x"20",x"60",x"60",x"20",x"20",x"60", -- 0x0590 + x"80",x"50",x"50",x"20",x"20",x"F0",x"F0",x"80", -- 0x0598 + x"60",x"20",x"20",x"60",x"60",x"20",x"20",x"60", -- 0x05A0 + x"80",x"D0",x"70",x"20",x"20",x"70",x"D0",x"80", -- 0x05A8 + x"60",x"20",x"20",x"60",x"60",x"20",x"20",x"60", -- 0x05B0 + x"80",x"F0",x"F0",x"20",x"20",x"50",x"50",x"80", -- 0x05B8 + x"60",x"20",x"20",x"60",x"60",x"20",x"20",x"60", -- 0x05C0 + x"A0",x"F0",x"F0",x"A0",x"00",x"50",x"50",x"00", -- 0x05C8 + x"60",x"20",x"20",x"60",x"60",x"20",x"20",x"60", -- 0x05D0 + x"20",x"F0",x"F0",x"80",x"80",x"50",x"50",x"20", -- 0x05D8 + x"60",x"20",x"20",x"60",x"60",x"20",x"20",x"60", -- 0x05E0 + x"20",x"70",x"D0",x"80",x"80",x"D0",x"70",x"20", -- 0x05E8 + x"60",x"20",x"20",x"60",x"60",x"20",x"20",x"60", -- 0x05F0 + x"20",x"50",x"50",x"80",x"80",x"F0",x"F0",x"20", -- 0x05F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"3F", -- 0x0600 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"CF", -- 0x0608 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"3F",x"3F", -- 0x0610 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"CF",x"CF", -- 0x0618 + x"FF",x"FF",x"FF",x"FF",x"FF",x"3F",x"3F",x"3F", -- 0x0620 + x"FF",x"FF",x"FF",x"FF",x"FF",x"CF",x"CF",x"CF", -- 0x0628 + x"FF",x"FF",x"FF",x"FF",x"3F",x"3F",x"3F",x"3F", -- 0x0630 + x"FF",x"FF",x"FF",x"FF",x"CF",x"CF",x"CF",x"CF", -- 0x0638 + x"FF",x"FF",x"FF",x"3F",x"3F",x"3F",x"3F",x"3F", -- 0x0640 + x"FF",x"FF",x"FF",x"CF",x"CF",x"CF",x"CF",x"CF", -- 0x0648 + x"FF",x"FF",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F", -- 0x0650 + x"FF",x"FF",x"CF",x"CF",x"CF",x"CF",x"CF",x"CF", -- 0x0658 + x"FF",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F", -- 0x0660 + x"FF",x"CF",x"CF",x"CF",x"CF",x"CF",x"CF",x"CF", -- 0x0668 + x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F", -- 0x0670 + x"CF",x"CF",x"CF",x"CF",x"CF",x"CF",x"CF",x"CF", -- 0x0678 + x"0F",x"87",x"0F",x"2D",x"87",x"4B",x"87",x"0F", -- 0x0680 + x"E1",x"C3",x"B4",x"C3",x"C3",x"B4",x"C3",x"E1", -- 0x0688 + x"0F",x"4B",x"87",x"1E",x"4B",x"A5",x"4B",x"0F", -- 0x0690 + x"78",x"69",x"5A",x"69",x"69",x"5A",x"69",x"78", -- 0x0698 + x"87",x"2D",x"C3",x"0F",x"2D",x"D2",x"2D",x"87", -- 0x06A0 + x"3C",x"3C",x"2D",x"3C",x"3C",x"2D",x"3C",x"3C", -- 0x06A8 + x"C3",x"96",x"69",x"87",x"96",x"69",x"96",x"C3", -- 0x06B0 + x"1E",x"1E",x"1E",x"1E",x"1E",x"1E",x"1E",x"1E", -- 0x06B8 + x"E1",x"C3",x"B4",x"C3",x"C3",x"B4",x"C3",x"E1", -- 0x06C0 + x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x06C8 + x"78",x"69",x"5A",x"69",x"69",x"5A",x"69",x"78", -- 0x06D0 + x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x06D8 + x"3C",x"3C",x"2D",x"3C",x"3C",x"2D",x"3C",x"3C", -- 0x06E0 + x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x06E8 + x"1E",x"1E",x"1E",x"1E",x"1E",x"1E",x"1E",x"1E", -- 0x06F0 + x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x06F8 + x"88",x"88",x"88",x"EE",x"88",x"88",x"88",x"88", -- 0x0700 + x"77",x"77",x"FF",x"EE",x"EE",x"EE",x"EE",x"FF", -- 0x0708 + x"CC",x"CC",x"CC",x"77",x"44",x"44",x"44",x"CC", -- 0x0710 + x"33",x"33",x"77",x"77",x"77",x"77",x"77",x"77", -- 0x0718 + x"EE",x"EE",x"EE",x"BB",x"AA",x"AA",x"AA",x"EE", -- 0x0720 + x"11",x"11",x"33",x"33",x"33",x"33",x"33",x"33", -- 0x0728 + x"FF",x"FF",x"FF",x"DD",x"DD",x"DD",x"DD",x"FF", -- 0x0730 + x"00",x"00",x"11",x"11",x"11",x"11",x"11",x"11", -- 0x0738 + x"77",x"77",x"FF",x"EE",x"EE",x"EE",x"EE",x"FF", -- 0x0740 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0748 + x"33",x"33",x"77",x"77",x"77",x"77",x"77",x"77", -- 0x0750 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0758 + x"11",x"11",x"33",x"33",x"33",x"33",x"33",x"33", -- 0x0760 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0768 + x"00",x"00",x"11",x"11",x"11",x"11",x"11",x"11", -- 0x0770 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0778 + x"00",x"00",x"00",x"EE",x"00",x"00",x"00",x"00", -- 0x0780 + x"66",x"66",x"FF",x"DD",x"CC",x"CC",x"CC",x"EE", -- 0x0788 + x"00",x"00",x"88",x"FF",x"00",x"00",x"00",x"00", -- 0x0790 + x"33",x"33",x"77",x"66",x"66",x"66",x"66",x"77", -- 0x0798 + x"88",x"88",x"CC",x"77",x"00",x"00",x"00",x"88", -- 0x07A0 + x"11",x"11",x"33",x"33",x"33",x"33",x"33",x"33", -- 0x07A8 + x"CC",x"CC",x"EE",x"BB",x"88",x"88",x"88",x"CC", -- 0x07B0 + x"00",x"00",x"11",x"11",x"11",x"11",x"11",x"11", -- 0x07B8 + x"66",x"66",x"FF",x"DD",x"CC",x"CC",x"CC",x"EE", -- 0x07C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07C8 + x"33",x"33",x"77",x"66",x"66",x"66",x"66",x"77", -- 0x07D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07D8 + x"11",x"11",x"33",x"33",x"33",x"33",x"33",x"33", -- 0x07E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E8 + x"00",x"00",x"11",x"11",x"11",x"11",x"11",x"11", -- 0x07F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F8 + x"00",x"88",x"00",x"22",x"88",x"44",x"88",x"00", -- 0x0800 + x"EE",x"CC",x"BB",x"CC",x"CC",x"BB",x"CC",x"EE", -- 0x0808 + x"00",x"44",x"88",x"11",x"44",x"AA",x"44",x"00", -- 0x0810 + x"77",x"66",x"55",x"66",x"66",x"55",x"66",x"77", -- 0x0818 + x"88",x"22",x"CC",x"00",x"22",x"DD",x"22",x"88", -- 0x0820 + x"33",x"33",x"22",x"33",x"33",x"22",x"33",x"33", -- 0x0828 + x"CC",x"99",x"66",x"88",x"99",x"66",x"99",x"CC", -- 0x0830 + x"11",x"11",x"11",x"11",x"11",x"11",x"11",x"11", -- 0x0838 + x"EE",x"CC",x"BB",x"CC",x"CC",x"BB",x"CC",x"EE", -- 0x0840 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0848 + x"77",x"66",x"55",x"66",x"66",x"55",x"66",x"77", -- 0x0850 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0858 + x"33",x"33",x"22",x"33",x"33",x"22",x"33",x"33", -- 0x0860 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0868 + x"11",x"11",x"11",x"11",x"11",x"11",x"11",x"11", -- 0x0870 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0878 + x"F0",x"78",x"F0",x"D2",x"78",x"B4",x"78",x"F0", -- 0x0880 + x"1E",x"3C",x"4B",x"3C",x"3C",x"4B",x"3C",x"1E", -- 0x0888 + x"F0",x"B4",x"78",x"E1",x"B4",x"5A",x"B4",x"F0", -- 0x0890 + x"87",x"96",x"A5",x"96",x"96",x"A5",x"96",x"87", -- 0x0898 + x"78",x"D2",x"3C",x"F0",x"D2",x"2D",x"D2",x"78", -- 0x08A0 + x"C3",x"C3",x"D2",x"C3",x"C3",x"D2",x"C3",x"C3", -- 0x08A8 + x"3C",x"69",x"96",x"78",x"69",x"96",x"69",x"3C", -- 0x08B0 + x"E1",x"E1",x"E1",x"E1",x"E1",x"E1",x"E1",x"E1", -- 0x08B8 + x"1E",x"3C",x"4B",x"3C",x"3C",x"4B",x"3C",x"1E", -- 0x08C0 + x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0", -- 0x08C8 + x"87",x"96",x"A5",x"96",x"96",x"A5",x"96",x"87", -- 0x08D0 + x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0", -- 0x08D8 + x"C3",x"C3",x"D2",x"C3",x"C3",x"D2",x"C3",x"C3", -- 0x08E0 + x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0", -- 0x08E8 + x"E1",x"E1",x"E1",x"E1",x"E1",x"E1",x"E1",x"E1", -- 0x08F0 + x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0", -- 0x08F8 + x"AA",x"55",x"AA",x"55",x"AA",x"55",x"AA",x"55", -- 0x0900 + x"AA",x"DD",x"AA",x"DD",x"AA",x"DD",x"AA",x"DD", -- 0x0908 + x"55",x"AA",x"55",x"AA",x"55",x"AA",x"55",x"AA", -- 0x0910 + x"55",x"66",x"55",x"66",x"55",x"66",x"55",x"66", -- 0x0918 + x"AA",x"55",x"AA",x"55",x"AA",x"55",x"AA",x"55", -- 0x0920 + x"22",x"33",x"22",x"33",x"22",x"33",x"22",x"33", -- 0x0928 + x"55",x"AA",x"55",x"AA",x"55",x"AA",x"55",x"AA", -- 0x0930 + x"11",x"11",x"11",x"11",x"11",x"11",x"11",x"11", -- 0x0938 + x"AA",x"DD",x"AA",x"DD",x"AA",x"DD",x"AA",x"DD", -- 0x0940 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0948 + x"55",x"66",x"55",x"66",x"55",x"66",x"55",x"66", -- 0x0950 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0958 + x"22",x"33",x"22",x"33",x"22",x"33",x"22",x"33", -- 0x0960 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0968 + x"11",x"11",x"11",x"11",x"11",x"11",x"11",x"11", -- 0x0970 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0978 + x"00",x"AA",x"00",x"66",x"44",x"22",x"AA",x"22", -- 0x0980 + x"DD",x"EE",x"EE",x"DD",x"DD",x"EE",x"EE",x"DD", -- 0x0988 + x"88",x"55",x"00",x"BB",x"AA",x"11",x"55",x"99", -- 0x0990 + x"66",x"77",x"77",x"66",x"66",x"77",x"77",x"66", -- 0x0998 + x"44",x"AA",x"88",x"55",x"55",x"88",x"AA",x"44", -- 0x09A0 + x"33",x"33",x"33",x"33",x"33",x"33",x"33",x"33", -- 0x09A8 + x"AA",x"DD",x"CC",x"AA",x"AA",x"CC",x"DD",x"AA", -- 0x09B0 + x"11",x"11",x"11",x"11",x"11",x"11",x"11",x"11", -- 0x09B8 + x"DD",x"EE",x"EE",x"DD",x"DD",x"EE",x"EE",x"DD", -- 0x09C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09C8 + x"66",x"77",x"77",x"66",x"66",x"77",x"77",x"66", -- 0x09D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09D8 + x"33",x"33",x"33",x"33",x"33",x"33",x"33",x"33", -- 0x09E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09E8 + x"11",x"11",x"11",x"11",x"11",x"11",x"11",x"11", -- 0x09F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0A00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0A08 + x"FF",x"FF",x"FF",x"FF",x"5F",x"FF",x"FF",x"FF", -- 0x0A10 + x"FF",x"FF",x"FF",x"FF",x"8F",x"FF",x"FF",x"FF", -- 0x0A18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0A20 + x"FF",x"FF",x"9F",x"FF",x"FF",x"9F",x"FF",x"FF", -- 0x0A28 + x"FF",x"BF",x"1F",x"BF",x"BF",x"1F",x"BF",x"FF", -- 0x0A30 + x"FF",x"DF",x"8F",x"DF",x"DF",x"8F",x"DF",x"FF", -- 0x0A38 + x"FF",x"1F",x"5F",x"0F",x"5F",x"5F",x"FF",x"FF", -- 0x0A40 + x"FF",x"DF",x"DF",x"8F",x"DF",x"CF",x"FF",x"FF", -- 0x0A48 + x"FF",x"9F",x"9F",x"FF",x"7F",x"BF",x"DF",x"FF", -- 0x0A50 + x"FF",x"BF",x"DF",x"EF",x"FF",x"9F",x"9F",x"FF", -- 0x0A58 + x"FF",x"5F",x"BF",x"5F",x"DF",x"5F",x"BF",x"FF", -- 0x0A60 + x"FF",x"FF",x"FF",x"DF",x"AF",x"DF",x"FF",x"FF", -- 0x0A68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0A70 + x"FF",x"FF",x"FF",x"BF",x"DF",x"FF",x"FF",x"FF", -- 0x0A78 + x"FF",x"FF",x"DF",x"3F",x"FF",x"FF",x"FF",x"FF", -- 0x0A80 + x"FF",x"FF",x"BF",x"CF",x"FF",x"FF",x"FF",x"FF", -- 0x0A88 + x"FF",x"FF",x"FF",x"FF",x"3F",x"DF",x"FF",x"FF", -- 0x0A90 + x"FF",x"FF",x"FF",x"FF",x"CF",x"BF",x"FF",x"FF", -- 0x0A98 + x"FF",x"7F",x"5F",x"3F",x"5F",x"7F",x"FF",x"FF", -- 0x0AA0 + x"FF",x"FF",x"DF",x"EF",x"DF",x"FF",x"FF",x"FF", -- 0x0AA8 + x"FF",x"7F",x"7F",x"1F",x"7F",x"7F",x"FF",x"FF", -- 0x0AB0 + x"FF",x"FF",x"FF",x"CF",x"FF",x"FF",x"FF",x"FF", -- 0x0AB8 + x"FF",x"FF",x"FF",x"9F",x"EF",x"FF",x"FF",x"FF", -- 0x0AC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0AC8 + x"FF",x"7F",x"7F",x"7F",x"7F",x"7F",x"FF",x"FF", -- 0x0AD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0AD8 + x"FF",x"FF",x"FF",x"9F",x"9F",x"FF",x"FF",x"FF", -- 0x0AE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0AE8 + x"FF",x"FF",x"FF",x"7F",x"BF",x"DF",x"FF",x"FF", -- 0x0AF0 + x"FF",x"DF",x"EF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0AF8 + x"FF",x"3F",x"DF",x"DF",x"5F",x"9F",x"3F",x"FF", -- 0x0B00 + x"FF",x"CF",x"9F",x"AF",x"BF",x"BF",x"CF",x"FF", -- 0x0B08 + x"FF",x"DF",x"DF",x"1F",x"DF",x"DF",x"FF",x"FF", -- 0x0B10 + x"FF",x"FF",x"FF",x"8F",x"BF",x"DF",x"FF",x"FF", -- 0x0B18 + x"FF",x"DF",x"5F",x"5F",x"5F",x"5F",x"9F",x"FF", -- 0x0B20 + x"FF",x"CF",x"BF",x"BF",x"BF",x"BF",x"DF",x"FF", -- 0x0B28 + x"FF",x"3F",x"DF",x"DF",x"DF",x"DF",x"BF",x"FF", -- 0x0B30 + x"FF",x"DF",x"AF",x"AF",x"BF",x"BF",x"DF",x"FF", -- 0x0B38 + x"FF",x"BF",x"BF",x"1F",x"BF",x"BF",x"3F",x"FF", -- 0x0B40 + x"FF",x"FF",x"FF",x"8F",x"DF",x"EF",x"FF",x"FF", -- 0x0B48 + x"FF",x"3F",x"DF",x"DF",x"DF",x"DF",x"BF",x"FF", -- 0x0B50 + x"FF",x"BF",x"AF",x"AF",x"AF",x"AF",x"8F",x"FF", -- 0x0B58 + x"FF",x"3F",x"DF",x"DF",x"DF",x"DF",x"3F",x"FF", -- 0x0B60 + x"FF",x"FF",x"AF",x"AF",x"AF",x"AF",x"CF",x"FF", -- 0x0B68 + x"FF",x"FF",x"FF",x"7F",x"9F",x"FF",x"FF",x"FF", -- 0x0B70 + x"FF",x"9F",x"AF",x"BF",x"BF",x"BF",x"BF",x"FF", -- 0x0B78 + x"FF",x"3F",x"DF",x"DF",x"DF",x"DF",x"3F",x"FF", -- 0x0B80 + x"FF",x"DF",x"AF",x"AF",x"AF",x"AF",x"DF",x"FF", -- 0x0B88 + x"FF",x"3F",x"5F",x"5F",x"5F",x"5F",x"FF",x"FF", -- 0x0B90 + x"FF",x"CF",x"BF",x"BF",x"BF",x"BF",x"CF",x"FF", -- 0x0B98 + x"FF",x"FF",x"FF",x"FF",x"DF",x"FF",x"FF",x"FF", -- 0x0BA0 + x"FF",x"FF",x"FF",x"FF",x"EF",x"FF",x"FF",x"FF", -- 0x0BA8 + x"FF",x"FF",x"FF",x"FF",x"9F",x"EF",x"FF",x"FF", -- 0x0BB0 + x"FF",x"FF",x"FF",x"FF",x"DF",x"FF",x"FF",x"FF", -- 0x0BB8 + x"FF",x"FF",x"DF",x"BF",x"7F",x"FF",x"FF",x"FF", -- 0x0BC0 + x"FF",x"FF",x"DF",x"EF",x"FF",x"FF",x"FF",x"FF", -- 0x0BC8 + x"FF",x"BF",x"BF",x"BF",x"BF",x"BF",x"FF",x"FF", -- 0x0BD0 + x"FF",x"EF",x"EF",x"EF",x"EF",x"EF",x"FF",x"FF", -- 0x0BD8 + x"FF",x"FF",x"7F",x"BF",x"DF",x"FF",x"FF",x"FF", -- 0x0BE0 + x"FF",x"FF",x"FF",x"EF",x"DF",x"FF",x"FF",x"FF", -- 0x0BE8 + x"FF",x"FF",x"FF",x"5F",x"FF",x"FF",x"FF",x"FF", -- 0x0BF0 + x"FF",x"DF",x"AF",x"BF",x"BF",x"BF",x"DF",x"FF", -- 0x0BF8 + x"FF",x"7F",x"5F",x"5F",x"5F",x"DF",x"3F",x"FF", -- 0x0C00 + x"FF",x"CF",x"AF",x"9F",x"AF",x"BF",x"CF",x"FF", -- 0x0C08 + x"FF",x"1F",x"7F",x"7F",x"7F",x"7F",x"1F",x"FF", -- 0x0C10 + x"FF",x"CF",x"BF",x"BF",x"BF",x"BF",x"CF",x"FF", -- 0x0C18 + x"FF",x"3F",x"DF",x"DF",x"DF",x"DF",x"1F",x"FF", -- 0x0C20 + x"FF",x"DF",x"AF",x"AF",x"AF",x"AF",x"8F",x"FF", -- 0x0C28 + x"FF",x"BF",x"DF",x"DF",x"DF",x"DF",x"3F",x"FF", -- 0x0C30 + x"FF",x"DF",x"BF",x"BF",x"BF",x"BF",x"CF",x"FF", -- 0x0C38 + x"FF",x"7F",x"BF",x"DF",x"DF",x"DF",x"1F",x"FF", -- 0x0C40 + x"FF",x"EF",x"DF",x"BF",x"BF",x"BF",x"8F",x"FF", -- 0x0C48 + x"FF",x"DF",x"DF",x"DF",x"DF",x"DF",x"1F",x"FF", -- 0x0C50 + x"FF",x"BF",x"AF",x"AF",x"AF",x"AF",x"8F",x"FF", -- 0x0C58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"1F",x"FF", -- 0x0C60 + x"FF",x"BF",x"AF",x"AF",x"AF",x"AF",x"8F",x"FF", -- 0x0C68 + x"FF",x"3F",x"5F",x"5F",x"DF",x"DF",x"3F",x"FF", -- 0x0C70 + x"FF",x"DF",x"BF",x"BF",x"BF",x"BF",x"CF",x"FF", -- 0x0C78 + x"FF",x"1F",x"FF",x"FF",x"FF",x"FF",x"1F",x"FF", -- 0x0C80 + x"FF",x"8F",x"EF",x"EF",x"EF",x"EF",x"8F",x"FF", -- 0x0C88 + x"FF",x"DF",x"DF",x"1F",x"DF",x"DF",x"FF",x"FF", -- 0x0C90 + x"FF",x"BF",x"BF",x"8F",x"BF",x"BF",x"FF",x"FF", -- 0x0C98 + x"FF",x"3F",x"DF",x"DF",x"DF",x"DF",x"3F",x"FF", -- 0x0CA0 + x"FF",x"8F",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0CA8 + x"FF",x"DF",x"BF",x"7F",x"FF",x"FF",x"1F",x"FF", -- 0x0CB0 + x"FF",x"FF",x"BF",x"DF",x"EF",x"EF",x"8F",x"FF", -- 0x0CB8 + x"FF",x"DF",x"DF",x"DF",x"DF",x"DF",x"1F",x"FF", -- 0x0CC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"8F",x"FF", -- 0x0CC8 + x"FF",x"1F",x"FF",x"FF",x"FF",x"FF",x"1F",x"FF", -- 0x0CD0 + x"FF",x"8F",x"DF",x"EF",x"EF",x"DF",x"8F",x"FF", -- 0x0CD8 + x"FF",x"1F",x"BF",x"7F",x"FF",x"FF",x"1F",x"FF", -- 0x0CE0 + x"FF",x"8F",x"FF",x"FF",x"EF",x"DF",x"8F",x"FF", -- 0x0CE8 + x"FF",x"3F",x"DF",x"DF",x"DF",x"DF",x"3F",x"FF", -- 0x0CF0 + x"FF",x"CF",x"BF",x"BF",x"BF",x"BF",x"CF",x"FF", -- 0x0CF8 + x"FF",x"FF",x"7F",x"7F",x"7F",x"7F",x"1F",x"FF", -- 0x0D00 + x"FF",x"CF",x"BF",x"BF",x"BF",x"BF",x"8F",x"FF", -- 0x0D08 + x"FF",x"3F",x"DF",x"9F",x"5F",x"DF",x"3F",x"FF", -- 0x0D10 + x"FF",x"CF",x"BF",x"BF",x"BF",x"BF",x"CF",x"FF", -- 0x0D18 + x"FF",x"DF",x"3F",x"7F",x"7F",x"7F",x"1F",x"FF", -- 0x0D20 + x"FF",x"CF",x"BF",x"BF",x"BF",x"BF",x"8F",x"FF", -- 0x0D28 + x"FF",x"3F",x"DF",x"DF",x"DF",x"DF",x"BF",x"FF", -- 0x0D30 + x"FF",x"FF",x"AF",x"AF",x"AF",x"AF",x"DF",x"FF", -- 0x0D38 + x"FF",x"FF",x"FF",x"FF",x"1F",x"FF",x"FF",x"FF", -- 0x0D40 + x"FF",x"BF",x"BF",x"BF",x"8F",x"BF",x"BF",x"BF", -- 0x0D48 + x"FF",x"3F",x"DF",x"DF",x"DF",x"DF",x"3F",x"FF", -- 0x0D50 + x"FF",x"8F",x"FF",x"FF",x"FF",x"FF",x"8F",x"FF", -- 0x0D58 + x"FF",x"7F",x"BF",x"DF",x"DF",x"BF",x"7F",x"FF", -- 0x0D60 + x"FF",x"8F",x"FF",x"FF",x"FF",x"FF",x"8F",x"FF", -- 0x0D68 + x"FF",x"3F",x"DF",x"BF",x"BF",x"DF",x"3F",x"FF", -- 0x0D70 + x"FF",x"8F",x"FF",x"FF",x"FF",x"FF",x"8F",x"FF", -- 0x0D78 + x"FF",x"DF",x"BF",x"7F",x"7F",x"BF",x"DF",x"FF", -- 0x0D80 + x"FF",x"BF",x"DF",x"EF",x"EF",x"DF",x"BF",x"FF", -- 0x0D88 + x"FF",x"FF",x"FF",x"FF",x"1F",x"FF",x"FF",x"FF", -- 0x0D90 + x"FF",x"BF",x"DF",x"EF",x"FF",x"EF",x"DF",x"BF", -- 0x0D98 + x"FF",x"DF",x"DF",x"DF",x"5F",x"9F",x"DF",x"FF", -- 0x0DA0 + x"FF",x"BF",x"9F",x"AF",x"BF",x"BF",x"BF",x"FF", -- 0x0DA8 + x"00",x"08",x"0D",x"0F",x"0F",x"0D",x"00",x"00", -- 0x0DB0 + x"00",x"0C",x"0F",x"06",x"07",x"07",x"02",x"00", -- 0x0DB8 + x"FF",x"FF",x"DF",x"BF",x"7F",x"FF",x"FF",x"FF", -- 0x0DC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"EF",x"DF",x"FF", -- 0x0DC8 + x"FF",x"FF",x"FF",x"FF",x"1F",x"DF",x"DF",x"FF", -- 0x0DD0 + x"FF",x"FF",x"FF",x"FF",x"8F",x"BF",x"BF",x"FF", -- 0x0DD8 + x"2F",x"FF",x"6F",x"2F",x"FF",x"6F",x"2F",x"FF", -- 0x0DE0 + x"9F",x"FF",x"BF",x"9F",x"FF",x"BF",x"9F",x"FF", -- 0x0DE8 + x"FF",x"6F",x"2F",x"FF",x"6F",x"2F",x"FF",x"6F", -- 0x0DF0 + x"FF",x"BF",x"9F",x"FF",x"BF",x"9F",x"FF",x"BF", -- 0x0DF8 + x"FF",x"DF",x"DF",x"DF",x"DF",x"1F",x"DF",x"FF", -- 0x0E00 + x"FF",x"DF",x"BF",x"AF",x"AF",x"CF",x"EF",x"FF", -- 0x0E08 + x"FF",x"FF",x"1F",x"5F",x"5F",x"5F",x"BF",x"FF", -- 0x0E10 + x"FF",x"FF",x"EF",x"DF",x"DF",x"DF",x"FF",x"FF", -- 0x0E18 + x"FF",x"3F",x"DF",x"DF",x"DF",x"1F",x"FF",x"FF", -- 0x0E20 + x"FF",x"FF",x"EF",x"EF",x"EF",x"8F",x"FF",x"FF", -- 0x0E28 + x"FF",x"FF",x"DF",x"DF",x"DF",x"3F",x"FF",x"FF", -- 0x0E30 + x"FF",x"FF",x"DF",x"DF",x"DF",x"EF",x"FF",x"FF", -- 0x0E38 + x"FF",x"FF",x"1F",x"DF",x"DF",x"DF",x"3F",x"FF", -- 0x0E40 + x"FF",x"FF",x"8F",x"EF",x"EF",x"EF",x"FF",x"FF", -- 0x0E48 + x"FF",x"FF",x"DF",x"5F",x"5F",x"5F",x"3F",x"FF", -- 0x0E50 + x"FF",x"FF",x"EF",x"DF",x"DF",x"DF",x"EF",x"FF", -- 0x0E58 + x"FF",x"FF",x"FF",x"FF",x"1F",x"FF",x"FF",x"FF", -- 0x0E60 + x"FF",x"FF",x"BF",x"AF",x"CF",x"FF",x"FF",x"FF", -- 0x0E68 + x"FF",x"FF",x"1F",x"AF",x"AF",x"AF",x"7F",x"FF", -- 0x0E70 + x"FF",x"FF",x"CF",x"DF",x"DF",x"DF",x"EF",x"FF", -- 0x0E78 + x"FF",x"FF",x"1F",x"FF",x"FF",x"FF",x"1F",x"FF", -- 0x0E80 + x"FF",x"FF",x"FF",x"EF",x"EF",x"EF",x"8F",x"FF", -- 0x0E88 + x"FF",x"FF",x"FF",x"DF",x"1F",x"DF",x"FF",x"FF", -- 0x0E90 + x"FF",x"FF",x"FF",x"FF",x"AF",x"EF",x"FF",x"FF", -- 0x0E98 + x"FF",x"FF",x"1F",x"EF",x"EF",x"DF",x"FF",x"FF", -- 0x0EA0 + x"FF",x"FF",x"AF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0EA8 + x"FF",x"FF",x"DF",x"BF",x"7F",x"1F",x"FF",x"FF", -- 0x0EB0 + x"FF",x"FF",x"FF",x"DF",x"EF",x"8F",x"FF",x"FF", -- 0x0EB8 + x"FF",x"FF",x"DF",x"DF",x"3F",x"FF",x"FF",x"FF", -- 0x0EC0 + x"FF",x"FF",x"FF",x"FF",x"8F",x"FF",x"FF",x"FF", -- 0x0EC8 + x"FF",x"FF",x"1F",x"FF",x"1F",x"FF",x"1F",x"FF", -- 0x0ED0 + x"FF",x"FF",x"EF",x"DF",x"EF",x"DF",x"CF",x"FF", -- 0x0ED8 + x"FF",x"FF",x"1F",x"FF",x"FF",x"FF",x"1F",x"FF", -- 0x0EE0 + x"FF",x"FF",x"EF",x"DF",x"DF",x"DF",x"CF",x"FF", -- 0x0EE8 + x"FF",x"FF",x"3F",x"DF",x"DF",x"DF",x"3F",x"FF", -- 0x0EF0 + x"FF",x"FF",x"EF",x"DF",x"DF",x"DF",x"EF",x"FF", -- 0x0EF8 + x"FF",x"FF",x"7F",x"BF",x"BF",x"BF",x"0F",x"FF", -- 0x0F00 + x"FF",x"FF",x"EF",x"DF",x"DF",x"DF",x"CF",x"FF", -- 0x0F08 + x"FF",x"EF",x"0F",x"BF",x"BF",x"BF",x"7F",x"FF", -- 0x0F10 + x"FF",x"FF",x"CF",x"DF",x"DF",x"DF",x"EF",x"FF", -- 0x0F18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"1F",x"FF",x"FF", -- 0x0F20 + x"FF",x"FF",x"DF",x"DF",x"DF",x"EF",x"FF",x"FF", -- 0x0F28 + x"FF",x"FF",x"BF",x"5F",x"5F",x"5F",x"DF",x"FF", -- 0x0F30 + x"FF",x"FF",x"FF",x"DF",x"DF",x"DF",x"EF",x"FF", -- 0x0F38 + x"FF",x"FF",x"DF",x"DF",x"3F",x"FF",x"FF",x"FF", -- 0x0F40 + x"FF",x"FF",x"FF",x"DF",x"8F",x"DF",x"FF",x"FF", -- 0x0F48 + x"FF",x"FF",x"3F",x"DF",x"DF",x"DF",x"3F",x"FF", -- 0x0F50 + x"FF",x"FF",x"CF",x"FF",x"FF",x"FF",x"CF",x"FF", -- 0x0F58 + x"FF",x"FF",x"FF",x"3F",x"DF",x"3F",x"FF",x"FF", -- 0x0F60 + x"FF",x"FF",x"CF",x"FF",x"FF",x"FF",x"CF",x"FF", -- 0x0F68 + x"FF",x"FF",x"3F",x"DF",x"3F",x"DF",x"3F",x"FF", -- 0x0F70 + x"FF",x"FF",x"CF",x"FF",x"EF",x"FF",x"CF",x"FF", -- 0x0F78 + x"FF",x"FF",x"DF",x"BF",x"7F",x"BF",x"DF",x"FF", -- 0x0F80 + x"FF",x"FF",x"DF",x"EF",x"FF",x"EF",x"DF",x"FF", -- 0x0F88 + x"FF",x"FF",x"1F",x"AF",x"AF",x"AF",x"7F",x"FF", -- 0x0F90 + x"FF",x"FF",x"CF",x"FF",x"FF",x"FF",x"CF",x"FF", -- 0x0F98 + x"FF",x"FF",x"DF",x"DF",x"5F",x"9F",x"DF",x"FF", -- 0x0FA0 + x"FF",x"FF",x"DF",x"CF",x"DF",x"DF",x"DF",x"FF", -- 0x0FA8 + x"01",x"07",x"0F",x"0A",x"0D",x"0F",x"07",x"00", -- 0x0FB0 + x"03",x"0F",x"0E",x"0D",x"0F",x"0F",x"0F",x"03", -- 0x0FB8 + x"FF",x"FF",x"FF",x"1F",x"FF",x"FF",x"FF",x"FF", -- 0x0FC0 + x"FF",x"FF",x"FF",x"8F",x"FF",x"FF",x"FF",x"FF", -- 0x0FC8 + x"3F",x"DF",x"EF",x"AF",x"AF",x"6F",x"DF",x"3F", -- 0x0FD0 + x"CF",x"BF",x"7F",x"5F",x"5F",x"6F",x"BF",x"CF", -- 0x0FD8 + x"9F",x"FF",x"BF",x"9F",x"FF",x"BF",x"9F",x"FF", -- 0x0FE0 + x"4F",x"FF",x"DF",x"4F",x"FF",x"DF",x"4F",x"FF", -- 0x0FE8 + x"FF",x"BF",x"9F",x"FF",x"BF",x"9F",x"FF",x"BF", -- 0x0FF0 + x"FF",x"DF",x"4F",x"FF",x"DF",x"4F",x"FF",x"DF", -- 0x0FF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1000 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1008 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1010 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1018 + x"01",x"07",x"0F",x"0A",x"0D",x"0F",x"07",x"00", -- 0x1020 + x"00",x"0C",x"0F",x"06",x"07",x"07",x"02",x"00", -- 0x1028 + x"00",x"08",x"0D",x"0F",x"0F",x"0D",x"00",x"00", -- 0x1030 + x"03",x"0F",x"0E",x"0D",x"0F",x"0F",x"0F",x"03", -- 0x1038 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1040 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"0C", -- 0x1048 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"08", -- 0x1050 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"0F", -- 0x1058 + x"09",x"0F",x"0F",x"08",x"00",x"00",x"00",x"00", -- 0x1060 + x"0F",x"06",x"07",x"07",x"02",x"00",x"00",x"00", -- 0x1068 + x"0D",x"0F",x"0F",x"0D",x"00",x"00",x"00",x"00", -- 0x1070 + x"0F",x"0E",x"01",x"0F",x"0F",x"00",x"00",x"00", -- 0x1078 + x"00",x"00",x"00",x"00",x"01",x"07",x"0F",x"0A", -- 0x1080 + x"00",x"00",x"00",x"00",x"00",x"0C",x"0F",x"06", -- 0x1088 + x"00",x"00",x"00",x"00",x"00",x"08",x"0D",x"0F", -- 0x1090 + x"00",x"00",x"00",x"00",x"03",x"0F",x"0E",x"0D", -- 0x1098 + x"0D",x"0F",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x10A0 + x"07",x"07",x"02",x"00",x"00",x"00",x"00",x"00", -- 0x10A8 + x"0F",x"0D",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x10B0 + x"0F",x"0F",x"0F",x"03",x"00",x"00",x"00",x"00", -- 0x10B8 + x"00",x"06",x"03",x"0E",x"0C",x"08",x"0C",x"0D", -- 0x10C0 + x"00",x"00",x"00",x"0C",x"0F",x"06",x"07",x"07", -- 0x10C8 + x"00",x"00",x"00",x"08",x"0D",x"0F",x"0F",x"0D", -- 0x10D0 + x"00",x"03",x"07",x"0E",x"0F",x"0F",x"0F",x"0F", -- 0x10D8 + x"07",x"03",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x10E0 + x"02",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x10E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x10F0 + x"0E",x"07",x"03",x"00",x"00",x"00",x"00",x"00", -- 0x10F8 + x"08",x"04",x"06",x"06",x"06",x"06",x"06",x"06", -- 0x1100 + x"05",x"05",x"03",x"01",x"01",x"0B",x"07",x"0B", -- 0x1108 + x"05",x"05",x"06",x"0C",x"0C",x"0E",x"0B",x"0B", -- 0x1110 + x"00",x"01",x"02",x"02",x"02",x"02",x"02",x"02", -- 0x1118 + x"0F",x"04",x"04",x"06",x"0E",x"06",x"0C",x"00", -- 0x1120 + x"07",x"0B",x"06",x"02",x"03",x"01",x"01",x"00", -- 0x1128 + x"07",x"0F",x"07",x"07",x"0F",x"0B",x"0A",x"0A", -- 0x1130 + x"07",x"01",x"01",x"03",x"02",x"03",x"01",x"00", -- 0x1138 + x"00",x"00",x"0F",x"00",x"0F",x"00",x"0F",x"00", -- 0x1140 + x"0B",x"0C",x"0D",x"0C",x"0B",x"08",x"0F",x"08", -- 0x1148 + x"00",x"08",x"03",x"04",x"09",x"00",x"0F",x"00", -- 0x1150 + x"00",x"00",x"0F",x"00",x"0F",x"00",x"0F",x"00", -- 0x1158 + x"00",x"0F",x"00",x"0F",x"00",x"0F",x"00",x"00", -- 0x1160 + x"08",x"0F",x"08",x"0B",x"0C",x"0D",x"0C",x"0B", -- 0x1168 + x"00",x"0F",x"00",x"09",x"04",x"03",x"08",x"00", -- 0x1170 + x"00",x"0F",x"00",x"0F",x"00",x"0F",x"00",x"00", -- 0x1178 + x"01",x"0F",x"E1",x"E1",x"E1",x"E1",x"69",x"E1", -- 0x1180 + x"00",x"00",x"00",x"00",x"00",x"00",x"0E",x"4A", -- 0x1188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"07", -- 0x1190 + x"00",x"00",x"01",x"12",x"12",x"03",x"34",x"5A", -- 0x1198 + x"E1",x"E1",x"0F",x"E1",x"E1",x"E1",x"0F",x"01", -- 0x11A0 + x"87",x"5A",x"96",x"4B",x"86",x"0E",x"00",x"00", -- 0x11A8 + x"3C",x"B4",x"B4",x"3C",x"07",x"00",x"00",x"00", -- 0x11B0 + x"69",x"B4",x"F0",x"E1",x"69",x"16",x"01",x"00", -- 0x11B8 + x"00",x"08",x"00",x"00",x"01",x"09",x"0F",x"08", -- 0x11C0 + x"00",x"00",x"00",x"03",x"07",x"07",x"0F",x"0F", -- 0x11C8 + x"01",x"02",x"0B",x"08",x"07",x"07",x"07",x"0A", -- 0x11D0 + x"0F",x"00",x"08",x"0E",x"07",x"05",x"06",x"0E", -- 0x11D8 + x"08",x"0F",x"09",x"01",x"00",x"00",x"08",x"00", -- 0x11E0 + x"0F",x"0F",x"07",x"07",x"03",x"00",x"00",x"00", -- 0x11E8 + x"0A",x"07",x"07",x"07",x"08",x"0B",x"02",x"01", -- 0x11F0 + x"0E",x"06",x"05",x"07",x"0E",x"08",x"00",x"0F", -- 0x11F8 + x"00",x"00",x"00",x"00",x"00",x"08",x"04",x"0E", -- 0x1200 + x"00",x"00",x"00",x"00",x"00",x"0F",x"06",x"06", -- 0x1208 + x"00",x"00",x"00",x"00",x"00",x"00",x"02",x"06", -- 0x1210 + x"00",x"00",x"00",x"00",x"00",x"00",x"08",x"0C", -- 0x1218 + x"0D",x"08",x"00",x"08",x"0D",x"0E",x"04",x"08", -- 0x1220 + x"0F",x"09",x"09",x"0F",x"0E",x"04",x"00",x"00", -- 0x1228 + x"0E",x"0F",x"0F",x"0F",x"0F",x"02",x"07",x"0A", -- 0x1230 + x"0D",x"0F",x"0F",x"0F",x"0D",x"00",x"00",x"08", -- 0x1238 + x"00",x"00",x"00",x"00",x"02",x"02",x"0F",x"0D", -- 0x1240 + x"00",x"00",x"0F",x"06",x"06",x"06",x"0F",x"09", -- 0x1248 + x"00",x"00",x"00",x"00",x"03",x"07",x"0F",x"0F", -- 0x1250 + x"00",x"00",x"00",x"00",x"08",x"0C",x"0C",x"0F", -- 0x1258 + x"00",x"0D",x"0F",x"02",x"02",x"00",x"00",x"00", -- 0x1260 + x"09",x"0F",x"0E",x"04",x"00",x"01",x"00",x"00", -- 0x1268 + x"0F",x"0F",x"0F",x"02",x"0F",x"02",x"00",x"00", -- 0x1270 + x"0F",x"0F",x"0C",x"00",x"08",x"04",x"00",x"00", -- 0x1278 + x"00",x"00",x"00",x"00",x"01",x"0F",x"09",x"00", -- 0x1280 + x"00",x"0F",x"06",x"06",x"0F",x"09",x"09",x"0F", -- 0x1288 + x"00",x"00",x"02",x"06",x"0E",x"0F",x"0F",x"0F", -- 0x1290 + x"00",x"00",x"08",x"0C",x"0C",x"0F",x"0D",x"09", -- 0x1298 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x12A0 + x"0E",x"04",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x12A8 + x"0F",x"02",x"07",x"0A",x"00",x"00",x"00",x"00", -- 0x12B0 + x"04",x"00",x"00",x"08",x"00",x"00",x"00",x"00", -- 0x12B8 + x"02",x"02",x"0F",x"0D",x"00",x"00",x"06",x"00", -- 0x12C0 + x"0F",x"06",x"0F",x"09",x"09",x"0F",x"0E",x"04", -- 0x12C8 + x"04",x"04",x"0E",x"0F",x"0F",x"0F",x"0F",x"02", -- 0x12D0 + x"04",x"04",x"0C",x"0F",x"0D",x"09",x"04",x"00", -- 0x12D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x12E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x12E8 + x"02",x"02",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x12F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x12F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1300 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"01", -- 0x1308 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1310 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1318 + x"08",x"05",x"05",x"07",x"0D",x"0C",x"08",x"04", -- 0x1320 + x"02",x"07",x"0D",x"0F",x"07",x"00",x"00",x"00", -- 0x1328 + x"09",x"06",x"01",x"0B",x"0F",x"0F",x"00",x"00", -- 0x1330 + x"0F",x"00",x"08",x"0E",x"00",x"0F",x"0F",x"00", -- 0x1338 + x"00",x"00",x"00",x"00",x"00",x"00",x"0A",x"05", -- 0x1340 + x"00",x"00",x"00",x"00",x"01",x"01",x"02",x"07", -- 0x1348 + x"00",x"00",x"00",x"00",x"00",x"00",x"09",x"07", -- 0x1350 + x"00",x"00",x"00",x"00",x"00",x"00",x"0F",x"00", -- 0x1358 + x"07",x"05",x"0F",x"0D",x"08",x"04",x"00",x"00", -- 0x1360 + x"0D",x"0F",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x1368 + x"03",x"0A",x"0F",x"0F",x"00",x"00",x"00",x"00", -- 0x1370 + x"0C",x"0E",x"02",x"0D",x"0F",x"00",x"00",x"00", -- 0x1378 + x"00",x"00",x"00",x"04",x"0A",x"05",x"07",x"05", -- 0x1380 + x"00",x"00",x"01",x"01",x"02",x"07",x"0D",x"0F", -- 0x1388 + x"00",x"00",x"00",x"00",x"09",x"06",x"01",x"0B", -- 0x1390 + x"00",x"00",x"00",x"00",x"0F",x"00",x"08",x"0E", -- 0x1398 + x"0D",x"0F",x"09",x"04",x"00",x"00",x"00",x"00", -- 0x13A0 + x"07",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13A8 + x"0F",x"0F",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13B0 + x"00",x"0F",x"0F",x"00",x"00",x"00",x"00",x"00", -- 0x13B8 + x"00",x"00",x"0A",x"05",x"07",x"05",x"0F",x"0D", -- 0x13C0 + x"01",x"01",x"02",x"07",x"0D",x"0F",x"07",x"00", -- 0x13C8 + x"00",x"00",x"09",x"06",x"01",x"0B",x"0F",x"0F", -- 0x13D0 + x"00",x"00",x"0F",x"00",x"0E",x"08",x"00",x"0F", -- 0x13D8 + x"08",x"04",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13F0 + x"0F",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x13F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1400 + x"00",x"00",x"00",x"00",x"00",x"00",x"02",x"06", -- 0x1408 + x"00",x"00",x"00",x"00",x"00",x"00",x"06",x"0F", -- 0x1410 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1418 + x"00",x"00",x"01",x"0E",x"01",x"00",x"00",x"00", -- 0x1420 + x"0B",x"0F",x"06",x"00",x"00",x"00",x"00",x"00", -- 0x1428 + x"09",x"03",x"02",x"02",x"02",x"03",x"01",x"03", -- 0x1430 + x"0E",x"07",x"03",x"07",x"03",x"07",x"0A",x"04", -- 0x1438 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1440 + x"00",x"00",x"00",x"00",x"02",x"06",x"0B",x"0F", -- 0x1448 + x"00",x"00",x"00",x"00",x"06",x"0F",x"09",x"03", -- 0x1450 + x"00",x"00",x"00",x"00",x"00",x"00",x"0E",x"0F", -- 0x1458 + x"0A",x"04",x"0A",x"00",x"08",x"00",x"00",x"00", -- 0x1460 + x"06",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1468 + x"02",x"02",x"02",x"03",x"01",x"03",x"00",x"00", -- 0x1470 + x"02",x"01",x"02",x"09",x"0E",x"04",x"00",x"00", -- 0x1478 + x"00",x"00",x"00",x"00",x"00",x"00",x"04",x"08", -- 0x1480 + x"00",x"00",x"02",x"06",x"0B",x"0F",x"06",x"00", -- 0x1488 + x"00",x"00",x"06",x"0F",x"09",x"03",x"02",x"02", -- 0x1490 + x"00",x"00",x"00",x"00",x"0E",x"07",x"03",x"07", -- 0x1498 + x"04",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x14A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x14A8 + x"02",x"03",x"00",x"01",x"00",x"00",x"00",x"00", -- 0x14B0 + x"03",x"07",x"0A",x"04",x"00",x"00",x"00",x"00", -- 0x14B8 + x"00",x"00",x"00",x"00",x"02",x"0C",x"02",x"00", -- 0x14C0 + x"02",x"06",x"0B",x"0F",x"06",x"01",x"00",x"00", -- 0x14C8 + x"06",x"0F",x"09",x"06",x"0A",x"04",x"0A",x"05", -- 0x14D0 + x"00",x"00",x"0E",x"0F",x"07",x"07",x"07",x"07", -- 0x14D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x14E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x14E8 + x"01",x"03",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x14F0 + x"0E",x"04",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x14F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"07",x"0E", -- 0x1500 + x"00",x"00",x"00",x"00",x"00",x"00",x"03",x"07", -- 0x1508 + x"00",x"00",x"00",x"00",x"00",x"00",x"08",x"0C", -- 0x1510 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x1518 + x"0C",x"0E",x"0F",x"0F",x"07",x"03",x"0E",x"02", -- 0x1520 + x"0F",x"0F",x"08",x"04",x"03",x"00",x"00",x"00", -- 0x1528 + x"0F",x"0E",x"02",x"04",x"08",x"00",x"00",x"00", -- 0x1530 + x"0F",x"0B",x"0F",x"00",x"00",x"00",x"00",x"00", -- 0x1538 + x"00",x"00",x"00",x"00",x"07",x"0E",x"0C",x"0E", -- 0x1540 + x"00",x"00",x"00",x"00",x"03",x"04",x"0F",x"0F", -- 0x1548 + x"00",x"00",x"00",x"00",x"08",x"04",x"0F",x"0E", -- 0x1550 + x"00",x"00",x"00",x"00",x"00",x"01",x"0F",x"0B", -- 0x1558 + x"0F",x"0F",x"07",x"07",x"03",x"0E",x"02",x"00", -- 0x1560 + x"0B",x"04",x"03",x"00",x"00",x"00",x"00",x"00", -- 0x1568 + x"0A",x"04",x"08",x"00",x"00",x"00",x"00",x"00", -- 0x1570 + x"0F",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1578 + x"00",x"00",x"07",x"0E",x"0C",x"0E",x"0F",x"0F", -- 0x1580 + x"00",x"00",x"03",x"04",x"08",x"0F",x"0F",x"07", -- 0x1588 + x"00",x"00",x"08",x"04",x"03",x"0E",x"0E",x"0C", -- 0x1590 + x"00",x"00",x"00",x"01",x"0F",x"0B",x"0F",x"01", -- 0x1598 + x"0F",x"07",x"07",x"03",x"02",x"0E",x"02",x"00", -- 0x15A0 + x"03",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x15A8 + x"08",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x15B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x15B8 + x"07",x"0E",x"0C",x"0E",x"0F",x"0F",x"07",x"07", -- 0x15C0 + x"03",x"07",x"0C",x"08",x"0C",x"07",x"03",x"00", -- 0x15C8 + x"08",x"0C",x"07",x"02",x"06",x"0C",x"08",x"00", -- 0x15D0 + x"00",x"01",x"0F",x"0B",x"0F",x"00",x"00",x"00", -- 0x15D8 + x"03",x"03",x"0E",x"02",x"00",x"00",x"00",x"00", -- 0x15E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x15E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x15F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x15F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"08", -- 0x1600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1608 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"01", -- 0x1610 + x"00",x"00",x"00",x"00",x"00",x"00",x"0E",x"0F", -- 0x1618 + x"0F",x"0F",x"0F",x"07",x"0F",x"0C",x"0F",x"07", -- 0x1620 + x"00",x"00",x"00",x"00",x"00",x"00",x"0F",x"0F", -- 0x1628 + x"01",x"01",x"01",x"01",x"01",x"00",x"0F",x"0F", -- 0x1630 + x"0F",x"0F",x"0F",x"0F",x"0E",x"04",x"0C",x"0C", -- 0x1638 + x"00",x"00",x"00",x"00",x"00",x"08",x"0F",x"0F", -- 0x1640 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1648 + x"00",x"00",x"00",x"00",x"00",x"08",x"04",x"04", -- 0x1650 + x"00",x"00",x"00",x"00",x"0E",x"0F",x"0F",x"0F", -- 0x1658 + x"0F",x"07",x"0F",x"0C",x"0F",x"07",x"00",x"00", -- 0x1660 + x"00",x"00",x"00",x"00",x"0F",x"0F",x"00",x"00", -- 0x1668 + x"02",x"02",x"01",x"00",x"0F",x"0F",x"00",x"00", -- 0x1670 + x"0F",x"0F",x"0E",x"04",x"0C",x"0C",x"00",x"00", -- 0x1678 + x"00",x"00",x"00",x"08",x"0F",x"0F",x"0F",x"07", -- 0x1680 + x"00",x"00",x"00",x"00",x"00",x"02",x"01",x"00", -- 0x1688 + x"00",x"00",x"00",x"00",x"00",x"00",x"08",x"06", -- 0x1690 + x"00",x"00",x"0E",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x1698 + x"0F",x"0C",x"0F",x"07",x"00",x"00",x"00",x"00", -- 0x16A0 + x"00",x"00",x"0F",x"0F",x"00",x"00",x"00",x"00", -- 0x16A8 + x"01",x"00",x"0F",x"0F",x"00",x"00",x"00",x"00", -- 0x16B0 + x"0E",x"04",x"0C",x"0C",x"00",x"00",x"00",x"00", -- 0x16B8 + x"00",x"08",x"0F",x"0F",x"0F",x"07",x"0F",x"0C", -- 0x16C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x16C8 + x"00",x"08",x"04",x"04",x"02",x"02",x"01",x"00", -- 0x16D0 + x"0E",x"0F",x"0F",x"0F",x"0F",x"0F",x"0E",x"04", -- 0x16D8 + x"0F",x"07",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x16E0 + x"0F",x"0F",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x16E8 + x"0F",x"0F",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x16F0 + x"0C",x"0C",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x16F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1700 + x"00",x"00",x"00",x"00",x"00",x"02",x"06",x"07", -- 0x1708 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x1710 + x"00",x"00",x"00",x"00",x"00",x"08",x"0C",x"0C", -- 0x1718 + x"01",x"0F",x"01",x"0F",x"01",x"00",x"00",x"00", -- 0x1720 + x"0F",x"0F",x"0C",x"0C",x"0F",x"07",x"07",x"01", -- 0x1728 + x"01",x"0B",x"0B",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x1730 + x"0E",x"0F",x"0E",x"0F",x"0E",x"0C",x"0C",x"00", -- 0x1738 + x"00",x"00",x"00",x"00",x"00",x"00",x"04",x"0C", -- 0x1740 + x"00",x"00",x"00",x"01",x"07",x"07",x"0F",x"0C", -- 0x1748 + x"00",x"00",x"00",x"0B",x"0B",x"0B",x"0B",x"0B", -- 0x1750 + x"00",x"00",x"00",x"00",x"0C",x"0C",x"0E",x"0F", -- 0x1758 + x"04",x"0C",x"04",x"00",x"00",x"00",x"00",x"00", -- 0x1760 + x"0C",x"0F",x"0F",x"07",x"07",x"01",x"00",x"00", -- 0x1768 + x"0B",x"0F",x"0F",x"0F",x"0F",x"0F",x"00",x"00", -- 0x1770 + x"0E",x"0F",x"0E",x"0C",x"0C",x"00",x"00",x"00", -- 0x1778 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1780 + x"00",x"02",x"06",x"07",x"0F",x"0F",x"0C",x"0C", -- 0x1788 + x"00",x"00",x"00",x"01",x"01",x"0B",x"0B",x"0F", -- 0x1790 + x"00",x"08",x"0C",x"0C",x"0F",x"0F",x"0F",x"0F", -- 0x1798 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x17A0 + x"0F",x"07",x"07",x"01",x"00",x"00",x"00",x"00", -- 0x17A8 + x"0F",x"0F",x"0F",x"0F",x"00",x"00",x"00",x"00", -- 0x17B0 + x"0F",x"0C",x"0C",x"00",x"00",x"00",x"00",x"00", -- 0x17B8 + x"00",x"00",x"04",x"0C",x"04",x"0C",x"04",x"00", -- 0x17C0 + x"04",x"06",x"0F",x"0F",x"09",x"09",x"0F",x"07", -- 0x17C8 + x"00",x"00",x"01",x"01",x"0B",x"0F",x"0F",x"0F", -- 0x17D0 + x"04",x"0C",x"0E",x"0F",x"0E",x"0F",x"0E",x"0C", -- 0x17D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x17E0 + x"07",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x17E8 + x"0F",x"0F",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x17F0 + x"0C",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x17F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1800 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"03", -- 0x1808 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1810 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1818 + x"02",x"04",x"08",x"00",x"00",x"00",x"0C",x"02", -- 0x1820 + x"01",x"03",x"05",x"0F",x"0C",x"00",x"00",x"00", -- 0x1828 + x"01",x"02",x"0F",x"0F",x"07",x"00",x"00",x"00", -- 0x1830 + x"00",x"07",x"0F",x"0F",x"0E",x"0F",x"01",x"00", -- 0x1838 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"0D", -- 0x1840 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1848 + x"00",x"00",x"00",x"00",x"00",x"0C",x"04",x"0E", -- 0x1850 + x"00",x"00",x"00",x"00",x"00",x"00",x"04",x"09", -- 0x1858 + x"0E",x"0E",x"08",x"0C",x"06",x"02",x"01",x"00", -- 0x1860 + x"01",x"03",x"03",x"00",x"00",x"00",x"00",x"00", -- 0x1868 + x"07",x"0F",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x1870 + x"0F",x"0F",x"0F",x"03",x"00",x"00",x"00",x"00", -- 0x1878 + x"00",x"00",x"00",x"01",x"01",x"07",x"0F",x"0F", -- 0x1880 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1888 + x"00",x"00",x"00",x"03",x"01",x"03",x"05",x"0F", -- 0x1890 + x"00",x"00",x"00",x"00",x"01",x"0A",x"0F",x"0F", -- 0x1898 + x"0E",x"0F",x"03",x"01",x"01",x"01",x"00",x"00", -- 0x18A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x18A8 + x"0C",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x18B0 + x"07",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x18B8 + x"00",x"00",x"02",x"0A",x"0C",x"0C",x"08",x"0C", -- 0x18C0 + x"00",x"00",x"00",x"00",x"01",x"03",x"03",x"00", -- 0x18C8 + x"00",x"0C",x"04",x"0E",x"07",x"0F",x"01",x"00", -- 0x18D0 + x"00",x"00",x"04",x"09",x"0F",x"0F",x"0F",x"03", -- 0x18D8 + x"0E",x"02",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x18E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x18E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x18F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x18F8 + x"00",x"00",x"08",x"00",x"09",x"0D",x"07",x"00", -- 0x1900 + x"00",x"00",x"00",x"0C",x"06",x"07",x"0B",x"0E", -- 0x1908 + x"00",x"00",x"00",x"00",x"01",x"0B",x"07",x"0B", -- 0x1910 + x"00",x"03",x"06",x"0C",x"08",x"09",x"0F",x"0E", -- 0x1918 + x"00",x"07",x"0D",x"09",x"00",x"08",x"00",x"00", -- 0x1920 + x"0E",x"0B",x"07",x"06",x"0C",x"00",x"00",x"00", -- 0x1928 + x"0B",x"07",x"0B",x"01",x"00",x"00",x"00",x"00", -- 0x1930 + x"0E",x"0F",x"09",x"08",x"0C",x"06",x"03",x"00", -- 0x1938 + x"00",x"00",x"01",x"01",x"07",x"0C",x"08",x"00", -- 0x1940 + x"00",x"00",x"00",x"00",x"0E",x"07",x"0B",x"0E", -- 0x1948 + x"00",x"00",x"00",x"01",x"01",x"09",x"07",x"0B", -- 0x1950 + x"07",x"0D",x"0C",x"08",x"08",x"0D",x"0F",x"0F", -- 0x1958 + x"00",x"08",x"0C",x"07",x"01",x"01",x"00",x"00", -- 0x1960 + x"0E",x"0B",x"07",x"0E",x"00",x"00",x"00",x"00", -- 0x1968 + x"0B",x"07",x"09",x"01",x"01",x"00",x"00",x"00", -- 0x1970 + x"0F",x"0F",x"0D",x"08",x"08",x"0C",x"0D",x"07", -- 0x1978 + x"00",x"00",x"00",x"00",x"07",x"0E",x"0D",x"07", -- 0x1980 + x"00",x"01",x"01",x"08",x"0A",x"0F",x"05",x"00", -- 0x1988 + x"00",x"04",x"0E",x"03",x"01",x"07",x"0F",x"0F", -- 0x1990 + x"00",x"00",x"00",x"00",x"08",x"0D",x"0E",x"0D", -- 0x1998 + x"07",x"0D",x"0E",x"07",x"00",x"00",x"00",x"00", -- 0x19A0 + x"00",x"05",x"0F",x"0A",x"08",x"01",x"01",x"00", -- 0x19A8 + x"0F",x"0F",x"07",x"01",x"03",x"0E",x"04",x"00", -- 0x19B0 + x"0D",x"0E",x"0D",x"08",x"00",x"00",x"00",x"00", -- 0x19B8 + x"00",x"00",x"00",x"08",x"06",x"0E",x"0D",x"07", -- 0x19C0 + x"00",x"08",x"08",x"0C",x"06",x"03",x"01",x"00", -- 0x19C8 + x"00",x"0A",x"0F",x"01",x"00",x"07",x"0F",x"0F", -- 0x19D0 + x"00",x"00",x"00",x"08",x"0C",x"0D",x"0E",x"0D", -- 0x19D8 + x"07",x"0D",x"0E",x"06",x"08",x"00",x"00",x"00", -- 0x19E0 + x"00",x"01",x"03",x"06",x"0C",x"08",x"08",x"00", -- 0x19E8 + x"0F",x"0F",x"07",x"00",x"01",x"0F",x"0A",x"00", -- 0x19F0 + x"0D",x"0E",x"0D",x"0C",x"08",x"00",x"00",x"00", -- 0x19F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"0C", -- 0x1A00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"02", -- 0x1A08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"08", -- 0x1A10 + x"00",x"00",x"00",x"00",x"00",x"00",x"03",x"0C", -- 0x1A18 + x"02",x"02",x"01",x"0D",x"02",x"02",x"0C",x"00", -- 0x1A20 + x"05",x"00",x"05",x"0A",x"00",x"01",x"00",x"00", -- 0x1A28 + x"05",x"01",x"02",x"0A",x"01",x"05",x"0A",x"00", -- 0x1A30 + x"00",x"00",x"0D",x"02",x"00",x"00",x"0C",x"03", -- 0x1A38 + x"00",x"00",x"00",x"00",x"00",x"0C",x"02",x"02", -- 0x1A40 + x"00",x"00",x"00",x"00",x"00",x"05",x"02",x"00", -- 0x1A48 + x"00",x"00",x"00",x"00",x"00",x"04",x"09",x"01", -- 0x1A50 + x"00",x"00",x"00",x"00",x"03",x"0C",x"04",x"02", -- 0x1A58 + x"01",x"01",x"02",x"0A",x"0C",x"00",x"00",x"00", -- 0x1A60 + x"05",x"0A",x"00",x"02",x"05",x"00",x"00",x"00", -- 0x1A68 + x"02",x"0A",x"01",x"09",x"04",x"00",x"00",x"00", -- 0x1A70 + x"01",x"02",x"01",x"00",x"0C",x"03",x"00",x"00", -- 0x1A78 + x"00",x"00",x"00",x"0C",x"02",x"02",x"01",x"01", -- 0x1A80 + x"00",x"00",x"01",x"02",x"00",x"05",x"0A",x"00", -- 0x1A88 + x"00",x"00",x"04",x"0A",x"01",x"01",x"0A",x"02", -- 0x1A90 + x"00",x"00",x"03",x"0C",x"01",x"01",x"02",x"01", -- 0x1A98 + x"02",x"02",x"0C",x"00",x"00",x"00",x"00",x"00", -- 0x1AA0 + x"00",x"05",x"02",x"00",x"00",x"00",x"00",x"00", -- 0x1AA8 + x"01",x"05",x"08",x"00",x"00",x"00",x"00",x"00", -- 0x1AB0 + x"02",x"02",x"0C",x"03",x"00",x"00",x"00",x"00", -- 0x1AB8 + x"00",x"0C",x"02",x"06",x"09",x"01",x"02",x"02", -- 0x1AC0 + x"00",x"05",x"0A",x"00",x"00",x"05",x"0A",x"00", -- 0x1AC8 + x"00",x"04",x"09",x"01",x"02",x"02",x"09",x"01", -- 0x1AD0 + x"03",x"0C",x"00",x"00",x"02",x"05",x"08",x"00", -- 0x1AD8 + x"0C",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1AE0 + x"05",x"02",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1AE8 + x"04",x"0A",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1AF0 + x"0C",x"03",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1AF8 + x"00",x"0C",x"08",x"01",x"03",x"0C",x"00",x"0F", -- 0x1B00 + x"00",x"01",x"00",x"04",x"02",x"0D",x"07",x"00", -- 0x1B08 + x"01",x"0A",x"0A",x"0A",x"05",x"03",x"0F",x"0F", -- 0x1B10 + x"06",x"04",x"0D",x"05",x"06",x"0F",x"0E",x"0F", -- 0x1B18 + x"04",x"03",x"09",x"04",x"03",x"09",x"0C",x"00", -- 0x1B20 + x"03",x"0C",x"04",x"09",x"05",x"01",x"00",x"00", -- 0x1B28 + x"0F",x"07",x"0B",x"02",x"02",x"0A",x"0A",x"03", -- 0x1B30 + x"0E",x"0F",x"0C",x"02",x"09",x"09",x"0C",x"06", -- 0x1B38 + x"00",x"00",x"08",x"02",x"06",x"08",x"03",x"0F", -- 0x1B40 + x"00",x"00",x"01",x"00",x"01",x"05",x"03",x"00", -- 0x1B48 + x"00",x"00",x"0B",x"0A",x"05",x"03",x"0F",x"0F", -- 0x1B50 + x"00",x"02",x"05",x"05",x"06",x"0F",x"0E",x"0F", -- 0x1B58 + x"04",x"06",x"08",x"06",x"02",x"08",x"00",x"00", -- 0x1B60 + x"07",x"02",x"04",x"00",x"01",x"01",x"00",x"00", -- 0x1B68 + x"0F",x"07",x"0B",x"0A",x"0A",x"02",x"00",x"00", -- 0x1B70 + x"0E",x"0F",x"0C",x"0A",x"09",x"0D",x"04",x"00", -- 0x1B78 + x"00",x"00",x"00",x"00",x"04",x"0C",x"02",x"0E", -- 0x1B80 + x"00",x"00",x"00",x"00",x"00",x"03",x"01",x"00", -- 0x1B88 + x"00",x"00",x"00",x"09",x"05",x"03",x"0F",x"0F", -- 0x1B90 + x"00",x"00",x"00",x"05",x"06",x"0F",x"0E",x"0F", -- 0x1B98 + x"08",x"04",x"08",x"04",x"00",x"00",x"00",x"00", -- 0x1BA0 + x"01",x"02",x"00",x"01",x"00",x"00",x"00",x"00", -- 0x1BA8 + x"0F",x"07",x"0B",x"02",x"02",x"00",x"00",x"00", -- 0x1BB0 + x"0E",x"0F",x"0E",x"0A",x"0D",x"00",x"00",x"00", -- 0x1BB8 + x"00",x"00",x"08",x"02",x"06",x"08",x"03",x"0F", -- 0x1BC0 + x"00",x"00",x"01",x"00",x"01",x"05",x"03",x"00", -- 0x1BC8 + x"00",x"00",x"0B",x"0A",x"05",x"03",x"0F",x"0F", -- 0x1BD0 + x"00",x"02",x"05",x"05",x"06",x"0F",x"0E",x"0F", -- 0x1BD8 + x"04",x"06",x"08",x"06",x"02",x"08",x"00",x"00", -- 0x1BE0 + x"07",x"02",x"04",x"00",x"01",x"01",x"00",x"00", -- 0x1BE8 + x"0F",x"07",x"0B",x"0A",x"0A",x"02",x"00",x"00", -- 0x1BF0 + x"0E",x"0F",x"0C",x"0A",x"09",x"0D",x"04",x"00", -- 0x1BF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"06",x"0D", -- 0x1C00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C10 + x"00",x"00",x"00",x"00",x"00",x"00",x"02",x"02", -- 0x1C18 + x"0B",x"06",x"00",x"00",x"06",x"0B",x"0D",x"06", -- 0x1C20 + x"00",x"00",x"0F",x"0F",x"00",x"00",x"00",x"00", -- 0x1C28 + x"00",x"00",x"0F",x"0F",x"00",x"00",x"00",x"00", -- 0x1C30 + x"02",x"02",x"0F",x"0F",x"02",x"02",x"02",x"02", -- 0x1C38 + x"00",x"00",x"00",x"00",x"06",x"09",x"0F",x"06", -- 0x1C40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C50 + x"00",x"00",x"00",x"00",x"02",x"02",x"02",x"02", -- 0x1C58 + x"00",x"00",x"06",x"0B",x"0B",x"06",x"00",x"00", -- 0x1C60 + x"0F",x"0F",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C68 + x"0F",x"0F",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1C70 + x"0F",x"0F",x"02",x"02",x"02",x"02",x"00",x"00", -- 0x1C78 + x"00",x"00",x"06",x"0B",x"0D",x"06",x"00",x"00", -- 0x1C80 + x"00",x"00",x"00",x"00",x"00",x"00",x"0F",x"0F", -- 0x1C88 + x"00",x"00",x"00",x"00",x"00",x"00",x"0F",x"0F", -- 0x1C90 + x"00",x"00",x"02",x"02",x"02",x"02",x"0F",x"0F", -- 0x1C98 + x"06",x"0D",x"0B",x"06",x"00",x"00",x"00",x"00", -- 0x1CA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CB0 + x"02",x"02",x"02",x"02",x"00",x"00",x"00",x"00", -- 0x1CB8 + x"06",x"09",x"0F",x"06",x"00",x"00",x"06",x"0B", -- 0x1CC0 + x"00",x"00",x"00",x"00",x"0F",x"0F",x"00",x"00", -- 0x1CC8 + x"00",x"00",x"00",x"00",x"0F",x"0F",x"00",x"00", -- 0x1CD0 + x"02",x"02",x"02",x"02",x"0F",x"0F",x"02",x"02", -- 0x1CD8 + x"0B",x"06",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CF0 + x"02",x"02",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1CF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1D00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1D08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1D10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1D18 + x"01",x"07",x"0F",x"0A",x"0D",x"0F",x"07",x"00", -- 0x1D20 + x"00",x"00",x"03",x"02",x"0F",x"0B",x"0E",x"00", -- 0x1D28 + x"00",x"0C",x"0D",x"0F",x"0F",x"0D",x"00",x"00", -- 0x1D30 + x"03",x"0F",x"0E",x"0D",x"0F",x"0F",x"0F",x"03", -- 0x1D38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1D40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1D48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"0C", -- 0x1D50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"0F", -- 0x1D58 + x"09",x"0F",x"0F",x"08",x"00",x"00",x"00",x"00", -- 0x1D60 + x"03",x"02",x"0F",x"0B",x"0E",x"00",x"00",x"00", -- 0x1D68 + x"0D",x"0F",x"0F",x"0D",x"00",x"00",x"00",x"00", -- 0x1D70 + x"0F",x"0E",x"01",x"0F",x"0F",x"00",x"00",x"00", -- 0x1D78 + x"00",x"00",x"00",x"00",x"01",x"07",x"0F",x"0A", -- 0x1D80 + x"00",x"00",x"00",x"00",x"00",x"00",x"03",x"02", -- 0x1D88 + x"00",x"00",x"00",x"00",x"00",x"0C",x"0D",x"0F", -- 0x1D90 + x"00",x"00",x"00",x"00",x"03",x"0F",x"0E",x"0D", -- 0x1D98 + x"0D",x"0F",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x1DA0 + x"0F",x"0B",x"0E",x"00",x"00",x"00",x"00",x"00", -- 0x1DA8 + x"0F",x"0D",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1DB0 + x"0F",x"0F",x"0F",x"03",x"00",x"00",x"00",x"00", -- 0x1DB8 + x"00",x"06",x"03",x"0E",x"0C",x"08",x"0C",x"0D", -- 0x1DC0 + x"00",x"00",x"00",x"00",x"03",x"02",x"0F",x"0B", -- 0x1DC8 + x"00",x"00",x"00",x"0C",x"0D",x"0F",x"0F",x"0D", -- 0x1DD0 + x"00",x"03",x"07",x"0E",x"0F",x"0F",x"0F",x"0F", -- 0x1DD8 + x"07",x"03",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1DE0 + x"0E",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1DE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1DF0 + x"0E",x"07",x"03",x"00",x"00",x"00",x"00",x"00", -- 0x1DF8 + x"00",x"00",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x1E00 + x"00",x"01",x"03",x"02",x"02",x"02",x"03",x"03", -- 0x1E08 + x"0C",x"0C",x"0C",x"00",x"0E",x"03",x"0B",x"0B", -- 0x1E10 + x"00",x"00",x"00",x"03",x"0F",x"09",x"06",x"06", -- 0x1E18 + x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"00",x"00", -- 0x1E20 + x"03",x"03",x"02",x"02",x"02",x"03",x"01",x"00", -- 0x1E28 + x"0B",x"0B",x"03",x"0E",x"00",x"0C",x"0C",x"0C", -- 0x1E30 + x"06",x"06",x"09",x"0F",x"03",x"00",x"00",x"00", -- 0x1E38 + x"00",x"00",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x1E40 + x"00",x"01",x"01",x"02",x"02",x"02",x"07",x"07", -- 0x1E48 + x"0E",x"0E",x"0E",x"00",x"0E",x"03",x"0B",x"03", -- 0x1E50 + x"00",x"00",x"00",x"03",x"0F",x"09",x"06",x"06", -- 0x1E58 + x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"00",x"00", -- 0x1E60 + x"07",x"07",x"0E",x"0E",x"0E",x"0F",x"07",x"00", -- 0x1E68 + x"03",x"03",x"03",x"0E",x"00",x"00",x"00",x"00", -- 0x1E70 + x"06",x"06",x"09",x"0F",x"03",x"00",x"00",x"00", -- 0x1E78 + x"00",x"00",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x1E80 + x"00",x"01",x"03",x"02",x"02",x"02",x"03",x"03", -- 0x1E88 + x"0C",x"0C",x"0C",x"00",x"0E",x"03",x"0B",x"0B", -- 0x1E90 + x"00",x"00",x"00",x"03",x"0F",x"09",x"06",x"06", -- 0x1E98 + x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"00",x"00", -- 0x1EA0 + x"03",x"03",x"02",x"02",x"02",x"03",x"01",x"00", -- 0x1EA8 + x"0B",x"0B",x"03",x"0E",x"00",x"0C",x"0C",x"0C", -- 0x1EB0 + x"06",x"06",x"09",x"0F",x"03",x"00",x"00",x"00", -- 0x1EB8 + x"00",x"00",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x1EC0 + x"00",x"07",x"0F",x"0E",x"0E",x"0E",x"07",x"07", -- 0x1EC8 + x"00",x"00",x"00",x"00",x"0E",x"03",x"03",x"03", -- 0x1ED0 + x"00",x"00",x"00",x"03",x"0F",x"09",x"06",x"06", -- 0x1ED8 + x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"00",x"00", -- 0x1EE0 + x"07",x"07",x"02",x"02",x"02",x"01",x"01",x"00", -- 0x1EE8 + x"03",x"0B",x"03",x"0E",x"00",x"0E",x"0E",x"0E", -- 0x1EF0 + x"06",x"06",x"09",x"0F",x"03",x"00",x"00",x"00", -- 0x1EF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"0C",x"0E", -- 0x1F00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x1F08 + x"00",x"00",x"00",x"00",x"00",x"00",x"0C",x"02", -- 0x1F10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1F18 + x"0C",x"0D",x"0D",x"0D",x"0C",x"0D",x"0E",x"04", -- 0x1F20 + x"02",x"04",x"0F",x"0B",x"04",x"02",x"01",x"00", -- 0x1F28 + x"01",x"00",x"0F",x"0F",x"00",x"01",x"02",x"0C", -- 0x1F30 + x"02",x"0A",x"0F",x"05",x"0A",x"02",x"01",x"00", -- 0x1F38 + x"00",x"00",x"00",x"00",x"04",x"0E",x"0D",x"0C", -- 0x1F40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"03", -- 0x1F48 + x"00",x"00",x"00",x"00",x"00",x"00",x"0C",x"03", -- 0x1F50 + x"00",x"00",x"00",x"00",x"00",x"01",x"02",x"02", -- 0x1F58 + x"0D",x"0D",x"0D",x"0C",x"0E",x"0C",x"00",x"00", -- 0x1F60 + x"0F",x"0D",x"03",x"00",x"00",x"00",x"00",x"00", -- 0x1F68 + x"0F",x"0E",x"03",x"0C",x"00",x"00",x"00",x"00", -- 0x1F70 + x"0D",x"0F",x"02",x"02",x"00",x"00",x"00",x"00", -- 0x1F78 + x"00",x"00",x"08",x"0E",x"0D",x"0D",x"0C",x"0D", -- 0x1F80 + x"00",x"00",x"00",x"00",x"00",x"00",x"0F",x"0F", -- 0x1F88 + x"00",x"00",x"00",x"00",x"00",x"00",x"03",x"0F", -- 0x1F90 + x"00",x"00",x"00",x"01",x"02",x"00",x"0F",x"0F", -- 0x1F98 + x"0D",x"0D",x"0C",x"0C",x"00",x"00",x"00",x"00", -- 0x1FA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1FA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1FB0 + x"02",x"00",x"01",x"00",x"00",x"00",x"00",x"00", -- 0x1FB8 + x"0C",x"0C",x"0D",x"0D",x"0D",x"0C",x"0D",x"0D", -- 0x1FC0 + x"00",x"00",x"03",x"04",x"0B",x"0F",x"04",x"03", -- 0x1FC8 + x"00",x"0C",x"03",x"00",x"0F",x"0F",x"00",x"03", -- 0x1FD0 + x"00",x"01",x"00",x"0A",x"07",x"0F",x"08",x"02", -- 0x1FD8 + x"0E",x"08",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1FE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1FE8 + x"0C",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1FF0 + x"01",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x1FF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2000 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2008 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2010 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2018 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2020 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2028 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2030 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2038 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2040 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2048 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2050 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2058 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2060 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2068 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2070 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2080 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2088 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2090 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2098 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x20F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2100 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2108 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2110 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2118 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2120 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2128 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2130 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2138 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2140 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2148 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2150 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2190 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x21F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2200 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2208 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2210 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2218 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2220 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2228 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2230 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2238 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2240 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2248 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2250 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2270 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2290 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2298 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x22A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x22A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x22B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x22B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x22C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x22C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x22D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x22D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x22E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x22E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x22F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x22F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2300 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2308 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2310 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2318 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2320 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2328 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2330 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2338 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2340 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2348 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2350 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2358 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2360 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2368 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2378 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2380 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2388 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2390 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2398 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x23A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x23A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x23B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x23B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x23C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x23C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x23D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x23D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x23E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x23E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x23F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x23F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2400 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2408 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2410 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2418 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2420 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2428 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2430 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2438 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2440 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2448 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2450 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2458 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2460 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2468 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2470 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2478 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2480 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2488 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2490 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2498 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x24F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2500 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2510 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2518 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2520 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2530 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2538 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2540 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2550 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2558 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2560 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2570 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2580 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2588 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2590 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x25F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2608 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2610 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2620 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2628 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2630 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2638 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2640 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2648 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2650 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2658 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2660 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2668 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2670 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2678 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2688 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2690 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2698 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x26A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x26A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x26B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x26B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x26C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x26C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x26D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x26D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x26E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x26E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x26F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x26F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2700 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2708 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2710 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2718 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2720 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2728 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2730 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2738 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2740 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2748 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2750 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2758 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2760 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2768 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2770 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2778 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2780 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2788 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2790 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2798 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x27A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x27A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x27B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x27B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x27C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x27C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x27D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x27D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x27E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x27E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x27F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x27F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2800 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2808 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2810 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2818 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2820 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2828 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2830 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2838 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2840 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2848 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2850 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2858 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2860 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2868 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2870 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2878 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2880 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2888 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2890 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2898 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x28F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2900 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2908 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2910 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2918 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2920 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2928 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2930 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2938 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2940 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2948 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2950 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2958 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2960 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2968 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2970 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2978 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2980 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2988 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2990 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2998 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x29F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2A98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2AF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2B98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2BF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2C98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2CF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2D98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2DF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2E98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2ED0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2ED8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2EF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2F98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x2FF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3000 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3008 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3010 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3018 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3020 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3028 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3030 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3038 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3040 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3048 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3050 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3058 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3060 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3068 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3070 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3080 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3088 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3090 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3098 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3100 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3108 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3110 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3118 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3120 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3128 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3130 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3138 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3140 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3148 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3150 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3190 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3200 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3208 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3210 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3218 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3220 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3228 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3230 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3238 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3240 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3248 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3250 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3270 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3290 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3298 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3300 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3308 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3310 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3318 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3320 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3328 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3330 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3338 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3340 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3348 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3350 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3358 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3360 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3368 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3378 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3380 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3388 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3390 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3398 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3400 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3408 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3410 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3418 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3420 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3428 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3430 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3438 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3440 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3448 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3450 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3458 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3460 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3468 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3470 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3478 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3480 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3488 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3490 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3498 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3500 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3510 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3518 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3520 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3530 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3538 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3540 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3550 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3558 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3560 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3570 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3580 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3588 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3590 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3608 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3610 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3620 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3628 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3630 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3638 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3640 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3648 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3650 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3658 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3660 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3668 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3670 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3678 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3688 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3690 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3698 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3700 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3708 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3710 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3718 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3720 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3728 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3730 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3738 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3740 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3748 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3750 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3758 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3760 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3768 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3770 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3778 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3780 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3788 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3790 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3798 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3800 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3808 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3810 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3818 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3820 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3828 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3830 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3838 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3840 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3848 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3850 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3858 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3860 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3868 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3870 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3878 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3880 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3888 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3890 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3898 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3900 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3908 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3910 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3918 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3920 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3928 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3930 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3938 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3940 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3948 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3950 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3958 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3960 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3968 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3970 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3978 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3980 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3988 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3990 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3998 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3ED0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3ED8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x3FF8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/prom1_dst.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/prom1_dst.vhd new file mode 100644 index 00000000..5a7d9423 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/prom1_dst.vhd @@ -0,0 +1,61 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PROM1_DST is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(7 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of PROM1_DST is + + + type ROM_ARRAY is array(0 to 255) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"07",x"09",x"0A",x"0B",x"0C",x"0D",x"0D",x"0E", -- 0x0000 + x"0E",x"0E",x"0D",x"0D",x"0C",x"0B",x"0A",x"09", -- 0x0008 + x"07",x"05",x"04",x"03",x"02",x"01",x"01",x"00", -- 0x0010 + x"00",x"00",x"01",x"01",x"02",x"03",x"04",x"05", -- 0x0018 + x"07",x"0C",x"0E",x"0E",x"0D",x"0B",x"09",x"0A", -- 0x0020 + x"0B",x"0B",x"0A",x"09",x"06",x"04",x"03",x"05", -- 0x0028 + x"07",x"09",x"0B",x"0A",x"08",x"05",x"04",x"03", -- 0x0030 + x"03",x"04",x"05",x"03",x"01",x"00",x"00",x"02", -- 0x0038 + x"07",x"0A",x"0C",x"0D",x"0E",x"0D",x"0C",x"0A", -- 0x0040 + x"07",x"04",x"02",x"01",x"00",x"01",x"02",x"04", -- 0x0048 + x"07",x"0B",x"0D",x"0E",x"0D",x"0B",x"07",x"03", -- 0x0050 + x"01",x"00",x"01",x"03",x"07",x"0E",x"07",x"00", -- 0x0058 + x"07",x"0D",x"0B",x"08",x"0B",x"0D",x"09",x"06", -- 0x0060 + x"0B",x"0E",x"0C",x"07",x"09",x"0A",x"06",x"02", -- 0x0068 + x"07",x"0C",x"08",x"04",x"05",x"07",x"02",x"00", -- 0x0070 + x"03",x"08",x"05",x"01",x"03",x"06",x"03",x"01", -- 0x0078 + x"00",x"08",x"0F",x"07",x"01",x"08",x"0E",x"07", -- 0x0080 + x"02",x"08",x"0D",x"07",x"03",x"08",x"0C",x"07", -- 0x0088 + x"04",x"08",x"0B",x"07",x"05",x"08",x"0A",x"07", -- 0x0090 + x"06",x"08",x"09",x"07",x"07",x"08",x"08",x"07", -- 0x0098 + x"07",x"08",x"06",x"09",x"05",x"0A",x"04",x"0B", -- 0x00A0 + x"03",x"0C",x"02",x"0D",x"01",x"0E",x"00",x"0F", -- 0x00A8 + x"00",x"0F",x"01",x"0E",x"02",x"0D",x"03",x"0C", -- 0x00B0 + x"04",x"0B",x"05",x"0A",x"06",x"09",x"07",x"08", -- 0x00B8 + x"00",x"01",x"02",x"03",x"04",x"05",x"06",x"07", -- 0x00C0 + x"08",x"09",x"0A",x"0B",x"0C",x"0D",x"0E",x"0F", -- 0x00C8 + x"0F",x"0E",x"0D",x"0C",x"0B",x"0A",x"09",x"08", -- 0x00D0 + x"07",x"06",x"05",x"04",x"03",x"02",x"01",x"00", -- 0x00D8 + x"00",x"01",x"02",x"03",x"04",x"05",x"06",x"07", -- 0x00E0 + x"08",x"09",x"0A",x"0B",x"0C",x"0D",x"0E",x"0F", -- 0x00E8 + x"00",x"01",x"02",x"03",x"04",x"05",x"06",x"07", -- 0x00F0 + x"08",x"09",x"0A",x"0B",x"0C",x"0D",x"0E",x"0F" -- 0x00F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/prom3_dst.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/prom3_dst.vhd new file mode 100644 index 00000000..b14b4860 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/prom3_dst.vhd @@ -0,0 +1,43 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PROM3_DST is + port ( + ADDR : in std_logic_vector(6 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of PROM3_DST is + + + type ROM_ARRAY is array(0 to 127) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"0F",x"0D",x"0F",x"0F",x"0F",x"0D",x"0F",x"0F", -- 0x0000 + x"0F",x"0D",x"0F",x"0F",x"0F",x"0D",x"0F",x"0F", -- 0x0008 + x"0F",x"0D",x"0F",x"0F",x"0F",x"0D",x"0F",x"0F", -- 0x0010 + x"0F",x"0D",x"0F",x"0F",x"0F",x"0D",x"0F",x"0F", -- 0x0018 + x"0F",x"0D",x"0F",x"0F",x"0F",x"0D",x"0F",x"0F", -- 0x0020 + x"0F",x"0D",x"0F",x"0F",x"0F",x"0D",x"0F",x"0F", -- 0x0028 + x"0F",x"0D",x"0F",x"0F",x"0F",x"0D",x"0F",x"0F", -- 0x0030 + x"0F",x"0D",x"0F",x"0F",x"0F",x"0D",x"0F",x"0F", -- 0x0038 + x"07",x"0F",x"0E",x"0D",x"0F",x"0F",x"0E",x"0D", -- 0x0040 + x"0F",x"0F",x"0E",x"0D",x"0F",x"0F",x"0E",x"0D", -- 0x0048 + x"0F",x"0F",x"0E",x"0D",x"0F",x"0F",x"0F",x"0B", -- 0x0050 + x"07",x"0F",x"0E",x"0D",x"0F",x"0F",x"0E",x"0D", -- 0x0058 + x"0F",x"0F",x"0E",x"0D",x"0F",x"0F",x"0E",x"0D", -- 0x0060 + x"0F",x"0F",x"0F",x"0B",x"07",x"0F",x"0E",x"0D", -- 0x0068 + x"0F",x"0F",x"0E",x"0D",x"0F",x"0F",x"0E",x"0D", -- 0x0070 + x"0F",x"0F",x"0E",x"0D",x"0F",x"0F",x"0F",x"0B" -- 0x0078 + ); + +begin + + p_rom : process(ADDR) + begin + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/prom4_dst.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/prom4_dst.vhd new file mode 100644 index 00000000..5cae9812 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/prom4_dst.vhd @@ -0,0 +1,155 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PROM4_DST is + port ( + ADDR : in std_logic_vector(9 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of PROM4_DST is + + + type ROM_ARRAY is array(0 to 1023) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"00",x"00",x"00",x"00",x"0F",x"0B",x"01", -- 0x0000 + x"00",x"00",x"00",x"00",x"00",x"0F",x"0B",x"03", -- 0x0008 + x"00",x"00",x"00",x"00",x"00",x"0F",x"0B",x"05", -- 0x0010 + x"00",x"00",x"00",x"00",x"00",x"0F",x"0B",x"07", -- 0x0018 + x"00",x"00",x"00",x"00",x"00",x"0B",x"01",x"09", -- 0x0020 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0028 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0030 + x"00",x"0F",x"00",x"0E",x"00",x"01",x"0C",x"0F", -- 0x0038 + x"00",x"0E",x"00",x"0B",x"00",x"0C",x"0B",x"0E", -- 0x0040 + x"00",x"0C",x"0F",x"01",x"00",x"00",x"00",x"00", -- 0x0048 + x"00",x"01",x"02",x"0F",x"00",x"07",x"0C",x"02", -- 0x0050 + x"00",x"09",x"06",x"0F",x"00",x"0D",x"0C",x"0F", -- 0x0058 + x"00",x"05",x"03",x"09",x"00",x"0F",x"0B",x"00", -- 0x0060 + x"00",x"0E",x"00",x"0B",x"00",x"0E",x"00",x"0B", -- 0x0068 + x"00",x"00",x"00",x"00",x"00",x"0F",x"0E",x"01", -- 0x0070 + x"00",x"0F",x"0B",x"0E",x"00",x"0E",x"00",x"0F", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0088 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0090 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0098 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0100 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0108 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0110 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0118 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0120 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0128 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0130 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0138 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0140 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0148 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0150 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0190 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0200 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0208 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0210 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0218 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0220 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0228 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0230 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0238 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0240 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0248 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0250 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0270 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0290 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0298 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0300 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0308 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0310 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0318 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0320 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0328 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0330 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0338 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0340 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0348 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0350 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0358 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0360 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0368 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0378 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0380 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0388 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0390 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0398 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x03F8 + ); + +begin + + p_rom : process(ADDR) + begin + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/prom7_dst.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/prom7_dst.vhd new file mode 100644 index 00000000..05520377 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/ROM/prom7_dst.vhd @@ -0,0 +1,33 @@ +-- generated with romgen v3.0 by MikeJ +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PROM7_DST is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(4 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of PROM7_DST is + + + type ROM_ARRAY is array(0 to 31) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"00",x"07",x"66",x"EF",x"00",x"F8",x"EA",x"6F", -- 0x0000 + x"00",x"3F",x"00",x"C9",x"38",x"AA",x"AF",x"F6", -- 0x0008 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0010 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x0018 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_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/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/build_id.v new file mode 100644 index 00000000..159d6521 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171112" +`define BUILD_TIME "231105" diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_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/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/keyboard.v new file mode 100644 index 00000000..8556280d --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/keyboard.v @@ -0,0 +1,83 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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) + 'h29: joystick[0] <= ~release_btn; // Space + 'h16: joystick[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + 'h76: joystick[3] <= ~release_btn; // Escape + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + + 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/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_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/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/osd.v b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_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/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..d68aba42 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman.vhd @@ -0,0 +1,552 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_MACHINE is + generic ( + -- only set one of these + PENGO : std_logic := '0'; -- set to 1 when using Pengo ROMs, 0 otherwise + PACMAN : std_logic := '1'; -- set to 1 for all other Pacman hardware games + -- only set one of these when PACMAN is set + MRTNT : std_logic := '0'; -- set to 1 when using Mr TNT ROMs, 0 otherwise + LIZWIZ : std_logic := '0'; -- set to 1 when using Lizard Wizard ROMs, 0 otherwise + MSPACMAN : std_logic := '0'; -- set to 1 when using Ms Pacman ROMs, 0 otherwise + MMINER : std_logic := '1' -- set to 1 when using Maniac Miner ROMs, 0 otherwise + ); + port ( + clk : in std_logic; + ena_6 : in std_logic; + reset : in std_logic; + + -- video + video_r : out std_logic_vector(2 downto 0); + video_g : out std_logic_vector(2 downto 0); + video_b : out std_logic_vector(1 downto 0); + hsync : out std_logic; + vsync : out std_logic; + v_blank : out std_logic; + h_blank : out std_logic; + + -- audio + audio : out std_logic_vector(7 downto 0); + + -- controls + in0_reg : in std_logic_vector( 7 downto 0); + in1_reg : in std_logic_vector( 7 downto 0); + dipsw1_reg : in std_logic_vector( 7 downto 0); + dipsw2_reg : in std_logic_vector( 7 downto 0) + ); + end; + +architecture RTL of PACMAN_MACHINE is + + -- timing + signal hcnt : std_logic_vector( 8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector( 8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean := true; + signal hblank : std_logic; + signal vblank : std_logic; +-- signal comp_sync_l : std_logic; + + -- cpu + signal cpu_ena : std_logic; + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector( 7 downto 0); + signal cpu_data_in : std_logic_vector( 7 downto 0); + + signal program_rom : std_logic_vector( 7 downto 0); + signal program_rom_dinl : std_logic_vector( 7 downto 0); + signal program_rom_dinh : std_logic_vector( 7 downto 0); + signal program_rom_bufl : std_logic_vector( 7 downto 0); + signal program_rom_bufh : std_logic_vector( 7 downto 0); + signal program_rom_din : std_logic_vector( 7 downto 0); + signal rom_to_dec : std_logic_vector( 7 downto 0); + signal rom_from_dec : std_logic_vector( 7 downto 0); +-- signal program_rom_cs_l : std_logic; + + signal control_reg : std_logic_vector( 7 downto 0); + -- + signal vram_addr_ab : std_logic_vector(11 downto 0); + signal ab : std_logic_vector(11 downto 0); + + signal sync_bus_reg : std_logic_vector( 7 downto 0); + signal sync_bus_db : std_logic_vector( 7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + signal sync_bus_cs_l : std_logic; + + signal cpu_vec_reg : std_logic_vector( 7 downto 0) := (others => '0'); + signal ps_reg : std_logic_vector( 2 downto 0); + + signal vram_l : std_logic; + signal rams_data_out : std_logic_vector( 7 downto 0); + -- more decode + signal wr0_l : std_logic; + signal wr1_l : std_logic; + signal wr2_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw1_l : std_logic; + signal iodec_dipsw2_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector( 3 downto 0); + signal watchdog_reset_l : std_logic; + +begin + + v_blank <= vblank; + h_blank <= hblank; + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + vsync <= not vcnt(8); + do_hsync <= true when (hcnt = "010101111") else false; -- 0AF + + p_sync : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + + if (hcnt = "010001111") then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") then + hblank <= '0'; -- 0EF + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + + -- + -- cpu + -- + p_cpu_wait_comb : process(sync_bus_wreq_l) + begin + cpu_wait_l <= '1'; + if (sync_bus_wreq_l = '0') then + cpu_wait_l <= '0'; + end if; + end process; + + p_irq_req_watchdog : process + variable rising_vblank : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + --rising_vblank := do_hsync; -- debug + -- interrupt 8c + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + + -- simulation + -- pragma translate_off + -- synopsys translate_off +-- watchdog_reset_l <= not reset; -- watchdog disable + -- synopsys translate_on + -- pragma translate_on + end if; + end process; + + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + + p_cpu_ena : process(hcnt, ena_6) + begin + cpu_ena <= '0'; + if (ena_6 = '1') then + cpu_ena <= hcnt(0); + end if; + end process; + + -- + -- primary addr decode + -- + p_mem_decode_comb : process(cpu_rfsh_l, cpu_rd_l, cpu_mreq_l, cpu_addr) + begin + -- rom 0x0000 - 0x3FFF + -- syncbus 0x4000 - 0x7FFF + -- 7M + -- 7N + sync_bus_cs_l <= '1'; + -- program_rom_cs_l <= '1'; + + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + + -- if (cpu_addr(14) = '0') and (cpu_rd_l = '0') then + -- program_rom_cs_l <= '0'; + -- end if; + + if (PENGO = '1' and cpu_addr(15) = '1') or (PACMAN = '1' and cpu_addr(14) = '1') then + sync_bus_cs_l <= '0'; + end if; + + end if; + end process; + + -- + -- sync bus custom ic + -- + p_sync_bus_reg : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; + end process; + + p_sync_bus_comb : process(cpu_rd_l, sync_bus_cs_l, hcnt) + begin + -- sync_bus_stb is now an active low clock enable signal + sync_bus_stb <= '1'; + sync_bus_r_w_l <= '1'; + + if (sync_bus_cs_l = '0') and (hcnt(1) = '0') then + if (cpu_rd_l = '1') then + sync_bus_r_w_l <= '0'; + end if; + sync_bus_stb <= '0'; + end if; + + sync_bus_wreq_l <= '1'; + if (sync_bus_cs_l = '0') and (hcnt(1) = '1') and (cpu_rd_l = '0') then + sync_bus_wreq_l <= '0'; + end if; + end process; + + -- + -- vram addresser custom ic + -- + u_vram_addr : entity work.PACMAN_VRAM_ADDR + port map ( + AB => vram_addr_ab, + H => hcnt, + V => vcnt(7 downto 0), + FLIP => control_reg(3) + ); + + --When 2H is low, the CPU controls the bus. + ab <= cpu_addr(11 downto 0) when hcnt(1) = '0' else vram_addr_ab; + + -- vram_l <= not ((not (cpu_addr(12) or sync_bus_stb)) or (hcnt(1) and hcnt(0))); + vram_l <= ( (cpu_addr(12) or sync_bus_stb) and not (hcnt(1) and hcnt(0)) ); + + -- PENGO PACMAN + + -- WRITE + -- wr0_l 0x9000 - 0x900F voice 1,2,3 waveform wr0_l 0x5040 - 0x504F sound + -- wr1_l 0x9010 - 0x901F x50 wr voice 1,2,3 freq/vol wr1_l 0x5050 - 0x505F sound + -- wr2_l 0x9020 - 0x902F sprites wr2_l 0x5060 - 0x506F sprite + -- 0x5080 - 0x50BF unused + -- out_l 0x9040 - 0x904F control space out_l 0x5000 - 0x503F control space + -- wdr_l 0x9070 - 0x907F watchdog reset wdr_l 0x50C0 - 0x50FF watchdog reset + + -- READ + -- dipsw2_l 0x9000 - 0x903F dip switch 2 + -- dipsw1_l 0x9040 - 0x907F dip switch 1 dipsw1_l 0x5080 - 0x50BF dip switches + -- in1_l 0x9080 - 0x90BF in port 1 in1_l 0x5040 - 0x507F in port 1 + -- in0_l 0x90C0 - 0x90FF in port 0 in0_l 0x5000 - 0x503F in port 0 + + -- writes <------------- PENGO -------------> <------------- PACMAN ------------> + wr0_l <= '0' when sync_bus_r_w_l='0' and ( (PACMAN='0' and ab(7 downto 4)=x"0") or (PACMAN='1' and ab(7 downto 4)=x"4") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- wr voice 1,2,3 waveform + wr1_l <= '0' when sync_bus_r_w_l='0' and ( (PACMAN='0' and ab(7 downto 4)=x"1") or (PACMAN='1' and ab(7 downto 4)=x"5") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- wr voice 1,2,3 freq/vol + wr2_l <= '0' when sync_bus_r_w_l='0' and ( (PACMAN='0' and ab(7 downto 4)=x"2") or (PACMAN='1' and ab(7 downto 4)=x"6") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- wr sprites + iodec_out_l <= '0' when sync_bus_r_w_l='0' and ( (PACMAN='0' and ab(7 downto 4)=x"4") or (PACMAN='1' and ab(7 downto 6)="00") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- wr control space + iodec_wdr_l <= '0' when sync_bus_r_w_l='0' and ( (PACMAN='0' and ab(7 downto 4)=x"7") or (PACMAN='1' and ab(7 downto 6)="11") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- wr watchdog reset + + -- reads + iodec_dipsw2_l <= '0' when sync_bus_r_w_l='1' and ( (PACMAN='0' and ab(7 downto 6)="00") or (PACMAN='1' and ab(7 downto 6)="11") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- rd in dip sw2 + iodec_dipsw1_l <= '0' when sync_bus_r_w_l='1' and ( (PACMAN='0' and ab(7 downto 6)="01") or (PACMAN='1' and ab(7 downto 6)="10") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- rd in dip sw1 + iodec_in1_l <= '0' when sync_bus_r_w_l='1' and ( (PACMAN='0' and ab(7 downto 6)="10") or (PACMAN='1' and ab(7 downto 6)="01") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- rd in port 1 + iodec_in0_l <= '0' when sync_bus_r_w_l='1' and ( (PACMAN='0' and ab(7 downto 6)="11") or (PACMAN='1' and ab(7 downto 6)="00") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- rd in port 0 + + ps_reg <= control_reg(7) & control_reg(6) & control_reg(2) when PENGO = '1' else "000"; + + p_control_reg : process + variable ena : std_logic_vector(7 downto 0); + begin + + wait until rising_edge(clk); + if (ena_6 = '1') then + ena := "00000000"; + -- 8 bit addressable latch 7K (made into register) + + -- PENGO PACMAN + -- 0 Interrupt ena Interrupt ena + -- 1 Sound ena Sound ena + -- 2 PS1 Not used + -- 3 Flip Flip + -- 4 Coin 1 meter 1 player start lamp + -- 5 Coin 2 meter 2 player start lamp + -- 6 PS2 Coin lockout + -- 7 PS3 Coin counter + if (iodec_out_l = '0') then + case ab(2 downto 0) is + when "000" => ena := "00000001"; + when "001" => ena := "00000010"; + when "010" => ena := "00000100"; + when "011" => ena := "00001000"; + when "100" => ena := "00010000"; + when "101" => ena := "00100000"; + when "110" => ena := "01000000"; + when "111" => ena := "10000000"; + when others => null; + end case; + end if; + + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (ena(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + -- simplified data source for video subsystem + -- only cpu or ram are sources of interest + sync_bus_db <= cpu_data_out when hcnt(1) = '0' else rams_data_out; + + -- address decoder + cpu_data_in <= cpu_vec_reg when (cpu_iorq_l = '0') and (cpu_m1_l = '0') else + sync_bus_reg when (sync_bus_wreq_l = '0') else + program_rom when (PENGO = '1' and cpu_addr(15) = '0') else -- ROM at 0000 - 7fff (Pengo descrambler) + program_rom when (PACMAN = '1' and cpu_addr(15 downto 14) = "00") else -- ROM at 0000 - 3fff and 8000 - bfff + program_rom when (PACMAN = '1' and cpu_addr(15 downto 13) = "100") else -- ROM at 8000 - 9fff (LizWiz) + in0_reg when (iodec_in0_l = '0') else + in1_reg when (iodec_in1_l = '0') else + dipsw1_reg when (iodec_dipsw1_l = '0') else + -- dipsw2_reg when (iodec_dipsw2_l = '0') else + rams_data_out; + + u_adec : entity work.rom_descrambler + generic map ( + PENGO => PENGO, + PACMAN => PACMAN, + MRTNT => MRTNT, + LIZWIZ => LIZWIZ, + MSPACMAN => MSPACMAN, + MMINER => MMINER + ) + port map ( + CLK => clk, + ENA => ena_6, + cpu_m1_l => cpu_m1_l, + addr => cpu_addr, + data => program_rom + ); + + u_rams : work.dpram generic map (12,8) + port map + ( + clk_a_i => clk, + en_a_i => ena_6, + we_i => not sync_bus_r_w_l and not vram_l, + addr_a_i => ab, + data_a_i => cpu_data_out, -- cpu only source of ram data + + clk_b_i => clk, + addr_b_i => ab, + data_b_o => rams_data_out + ); + + -- + -- video subsystem + -- + u_video : entity work.PACMAN_VIDEO + generic map ( + MRTNT => MRTNT + ) + port map ( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + I_PS => ps_reg, + I_WR2_L => wr2_l, + -- + O_RED => video_r, + O_GREEN => video_g, + O_BLUE => video_b, + -- + ENA_6 => ena_6, + CLK => clk + ); + + -- + -- + -- audio subsystem + -- + u_audio : entity work.PACMAN_AUDIO + port map ( + I_HCNT => hcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_WR1_L => wr1_l, + I_WR0_L => wr0_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => audio, + ENA_6 => ena_6, + CLK => clk + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..39619ea0 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR1_L, + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => rom3m(1), + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman_rom_descrambler.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman_rom_descrambler.vhd new file mode 100644 index 00000000..9f0db0a6 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman_rom_descrambler.vhd @@ -0,0 +1,480 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) d18c7db (gmail) - May 2013 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- + + +-- The following comments and source code in the comments are from MAME source code and are +-- included here to help make sense of the logic used in the VHDL address mapper and descrambler +-- +--/************************************ +-- * +-- * Ms. Pac-Man +-- * +-- ************************************/ +-- +--/* +-- Ms. Pac-Man has an auxiliary PCB with ribbon cable that plugs into the Z-80 CPU socket of a Pac-Man main PCB. Also the +-- graphics ROMs at 5E, 5F on the main board are replaced. +-- +-- The aux board contains three ROMs (two 2532 at U6, U7 and one 2716 at U5), a Z-80, and four PAL/HAL logic chips. +-- +-- The aux board logic decodes the Z-80 address and determines whether to enable the main board ROMs (containing Pac-Man +-- code) or the aux board ROMs (containing Ms. Pac-Man code). Normally the Pac-Man ROMs reside at address 0x0000-0x3fff +-- and are mirrored at 0x8000-0xbfff (Z-80 A15 is not used in Pac-Man). The aux board logic modifies the address map and +-- enables the aux board ROMs for addresses 0x3000-0x3fff and 0x8000-0x97ff. Furthermore there are forty 8-byte "patch" +-- regions which reside in the 0x0000-0x2fff address range. Any access to these patch addresses will disable the Pac-Man +-- ROMs and enable the aux board ROM. Aux board ROM addresses 0x8000-0x81ef are mapped onto the patch regions. These +-- patches typically insert jumps to new code above 0x8000. +-- +-- The aux board logic also acts as a software protection circuit which inhibits dumping of the ROMs (e.g., using a +-- microprocessor emulator system). There are several "trap" address regions which enable and disable the decode +-- functions. In order to properly operate as Ms. Pac-Man you must access one of the "latch set" trap addresses. This +-- enables the decode. If a "latch clear" address is accessed then decode is disabled and all you get is Pac-Man. For +-- more info see U.S. Patent 4,525,599 "Software protection methods and apparatus". +-- +-- The trap regions are 8 bytes in length starting on the following addresses: +-- +-- latch clear, decode disable +-- 0x0038 +-- 0x03b0 +-- 0x1600 +-- 0x2120 +-- 0x3ff0 +-- 0x8000 +-- 0x97f0 +-- +-- latch set, decode enable +-- 0x3ff8 +-- +-- Any memory access will trigger the trap behavior: instruction fetch, data read, data write. The latch clear addresses +-- should never be accessed during normal Ms. Pac-Man operation, so when the circuitry detects an access it clears the +-- latch and prevents any further dumping of the aux board ROMs. +-- +-- The Pac-Man self-test code does a checksum of the ROM 0x0000-0x2fff. This works because the checksum routine walks the +-- ROM starting from the low address and hits the latch clear trap at 0x0038 prior to encountering any of the patch +-- regions. The decode stays disabled for the rest of the checksum routine, and thus the checksum is calculated for the +-- Pac-Man ROMs with no patches applied. +-- +-- During normal operation every VBLANK (60.6Hz) interrupt will fetch its interrupt vector from the 0x3ff8 trap region, so +-- the latch is continually being enabled. +-- +-- In a further attempt to thwart copying, the aux board ROMs have a simple encryption scheme: their address and data +-- lines are bit flipped (i.e., wired in a nonstandard fashion). The specific bit flips were selected to minimize the +-- vias required to lay out the aux PCB. +--*/ + +-- +--static void mspacman_install_patches(UINT8 *ROM) +--{ +-- int i; +-- +-- /* copy forty 8-byte patches into Pac-Man code */ +-- for (i = 0; i < 8; i++) +-- { +-- ROM[0x0410+i] = ROM[0x8008+i]; +-- ROM[0x08E0+i] = ROM[0x81D8+i]; +-- ROM[0x0A30+i] = ROM[0x8118+i]; +-- ROM[0x0BD0+i] = ROM[0x80D8+i]; +-- ROM[0x0C20+i] = ROM[0x8120+i]; +-- ROM[0x0E58+i] = ROM[0x8168+i]; +-- ROM[0x0EA8+i] = ROM[0x8198+i]; +-- +-- ROM[0x1000+i] = ROM[0x8020+i]; +-- ROM[0x1008+i] = ROM[0x8010+i]; +-- ROM[0x1288+i] = ROM[0x8098+i]; +-- ROM[0x1348+i] = ROM[0x8048+i]; +-- ROM[0x1688+i] = ROM[0x8088+i]; +-- ROM[0x16B0+i] = ROM[0x8188+i]; +-- ROM[0x16D8+i] = ROM[0x80C8+i]; +-- ROM[0x16F8+i] = ROM[0x81C8+i]; +-- ROM[0x19A8+i] = ROM[0x80A8+i]; +-- ROM[0x19B8+i] = ROM[0x81A8+i]; +-- +-- ROM[0x2060+i] = ROM[0x8148+i]; +-- ROM[0x2108+i] = ROM[0x8018+i]; +-- ROM[0x21A0+i] = ROM[0x81A0+i]; +-- ROM[0x2298+i] = ROM[0x80A0+i]; +-- ROM[0x23E0+i] = ROM[0x80E8+i]; +-- ROM[0x2418+i] = ROM[0x8000+i]; +-- ROM[0x2448+i] = ROM[0x8058+i]; +-- ROM[0x2470+i] = ROM[0x8140+i]; +-- ROM[0x2488+i] = ROM[0x8080+i]; +-- ROM[0x24B0+i] = ROM[0x8180+i]; +-- ROM[0x24D8+i] = ROM[0x80C0+i]; +-- ROM[0x24F8+i] = ROM[0x81C0+i]; +-- ROM[0x2748+i] = ROM[0x8050+i]; +-- ROM[0x2780+i] = ROM[0x8090+i]; +-- ROM[0x27B8+i] = ROM[0x8190+i]; +-- ROM[0x2800+i] = ROM[0x8028+i]; +-- ROM[0x2B20+i] = ROM[0x8100+i]; +-- ROM[0x2B30+i] = ROM[0x8110+i]; +-- ROM[0x2BF0+i] = ROM[0x81D0+i]; +-- ROM[0x2CC0+i] = ROM[0x80D0+i]; +-- ROM[0x2CD8+i] = ROM[0x80E0+i]; +-- ROM[0x2CF0+i] = ROM[0x81E0+i]; +-- ROM[0x2D60+i] = ROM[0x8160+i]; +-- } +--} +-- +--DRIVER_INIT_MEMBER(pacman_state,mspacman) +--{ +-- int i; +-- UINT8 *ROM, *DROM; +-- +-- /* CPU ROMs */ +-- +-- /* Pac-Man code is in low bank */ +-- ROM = machine().root_device().memregion("maincpu")->base(); +-- +-- /* decrypted Ms. Pac-Man code is in high bank */ +-- DROM = &machine().root_device().memregion("maincpu")->base()[0x10000]; +-- +-- /* copy ROMs into decrypted bank */ +-- for (i = 0; i < 0x1000; i++) +-- { +-- DROM[0x0000+i] = ROM[0x0000+i]; /* pacman.6e */ +-- DROM[0x1000+i] = ROM[0x1000+i]; /* pacman.6f */ +-- DROM[0x2000+i] = ROM[0x2000+i]; /* pacman.6h */ +-- DROM[0x3000+i] = BITSWAP8(ROM[0xb000+BITSWAP16(i,15,14,13,12,11,3,7,9,10,8,6,5,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt u7 */ +-- } +-- for (i = 0; i < 0x800; i++) +-- { +-- DROM[0x8000+i] = BITSWAP8(ROM[0x8000+BITSWAP16(i,15,14,13,12,11,8,7,5,9,10,6,3,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt u5 */ +-- DROM[0x8800+i] = BITSWAP8(ROM[0x9800+BITSWAP16(i,15,14,13,12,11,3,7,9,10,8,6,5,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt half of u6 */ +-- DROM[0x9000+i] = BITSWAP8(ROM[0x9000+BITSWAP16(i,15,14,13,12,11,3,7,9,10,8,6,5,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt half of u6 */ +--// 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 +-- DROM[0x9800+i] = ROM[0x1800+i]; /* mirror of pacman.6f high */ +-- } +-- for (i = 0; i < 0x1000; i++) +-- { +-- DROM[0xa000+i] = ROM[0x2000+i]; /* mirror of pacman.6h */ +-- DROM[0xb000+i] = ROM[0x3000+i]; /* mirror of pacman.6j */ +-- } +-- /* install patches into decrypted bank */ +-- mspacman_install_patches(DROM); +-- +-- /* mirror Pac-Man ROMs into upper addresses of normal bank */ +-- for (i = 0; i < 0x1000; i++) +-- { +-- ROM[0x8000+i] = ROM[0x0000+i]; +-- ROM[0x9000+i] = ROM[0x1000+i]; +-- ROM[0xa000+i] = ROM[0x2000+i]; +-- ROM[0xb000+i] = ROM[0x3000+i]; +-- } +-- +-- /* initialize the banks */ +-- machine().root_device().membank("bank1")->configure_entries(0, 2, &ROM[0x00000], 0x10000); +-- machine().root_device().membank("bank1")->set_entry(1); +--} +-- +--ROM_START( puckmana ) +-- ROM_REGION( 0x10000, "maincpu", 0 ) +-- ROM_LOAD( "pacman.6e", 0x0000, 0x1000, CRC(c1e6ab10) SHA1(e87e059c5be45753f7e9f33dff851f16d6751181) ) +-- ROM_LOAD( "pacman.6f", 0x1000, 0x1000, CRC(1a6fb2d4) SHA1(674d3a7f00d8be5e38b1fdc208ebef5a92d38329) ) +-- ROM_LOAD( "pacman.6h", 0x2000, 0x1000, CRC(bcdd1beb) SHA1(8e47e8c2c4d6117d174cdac150392042d3e0a881) ) +-- ROM_LOAD( "prg7", 0x3000, 0x0800, CRC(b6289b26) SHA1(d249fa9cdde774d5fee7258147cd25fa3f4dc2b3) ) +-- ROM_LOAD( "prg8", 0x3800, 0x0800, CRC(17a88c13) SHA1(eb462de79f49b7aa8adb0cc6d31535b10550c0ce) ) +-- +--ROM_START( mspacman ) +-- ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code+64k for decrypted code */ +-- ROM_LOAD( "pacman.6e", 0x0000, 0x1000, CRC(c1e6ab10) SHA1(e87e059c5be45753f7e9f33dff851f16d6751181) ) +-- ROM_LOAD( "pacman.6f", 0x1000, 0x1000, CRC(1a6fb2d4) SHA1(674d3a7f00d8be5e38b1fdc208ebef5a92d38329) ) +-- ROM_LOAD( "pacman.6h", 0x2000, 0x1000, CRC(bcdd1beb) SHA1(8e47e8c2c4d6117d174cdac150392042d3e0a881) ) +-- ROM_LOAD( "pacman.6j", 0x3000, 0x1000, CRC(817d94e3) SHA1(d4a70d56bb01d27d094d73db8667ffb00ca69cb9) ) +-- +-- ROM_LOAD( "u5", 0x8000, 0x0800, CRC(f45fbbcd) SHA1(b26cc1c8ee18e9b1daa97956d2159b954703a0ec) ) +-- ROM_LOAD( "u6", 0x9000, 0x1000, CRC(a90e7000) SHA1(e4df96f1db753533f7d770aa62ae1973349ea4cf) ) +-- ROM_LOAD( "u7", 0xb000, 0x1000, CRC(c82cd714) SHA1(1d8ac7ad03db2dc4c8c18ade466e12032673f874) ) +-- +-- +--Normally the Pac-Man ROMs reside at address 0x0000-0x3fff and are mirrored at 0x8000-0xbfff (Z-80 A15 is not used in Pac-Man). +--The aux board logic modifies the address map and enables the aux board ROMs for addresses 0x3000-0x3fff and 0x8000-0x97ff. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity rom_descrambler is + generic ( + -- only set one of these + PENGO : std_logic := '0'; -- set to 1 when using Pengo ROMs, 0 otherwise + PACMAN : std_logic := '1'; -- set to 1 for all other Pacman hardware games + -- only set one of these when PACMAN is set + MRTNT : std_logic := '0'; -- set to 1 when using Mr TNT ROMs, 0 otherwise + LIZWIZ : std_logic := '0'; -- set to 1 when using Lizard Wizard ROMs, 0 otherwise + MSPACMAN : std_logic := '0'; -- set to 1 when using Ms Pacman ROMs, 0 otherwise + MMINER : std_logic := '1' -- set to 1 when using Maniac Miner ROMs, 0 otherwise + ); + port ( + CLK : in std_logic; + ENA : in std_logic; + -- + cpu_m1_l : in std_logic; + addr : in std_logic_vector(15 downto 0); + data : out std_logic_vector( 7 downto 0) + ); + +end rom_descrambler; + +architecture rtl of rom_descrambler is + signal overlay_on : std_logic := '0'; + signal sega_dec_ena : std_logic; + signal rom_patched : std_logic_vector(15 downto 0); + signal rom_addr : std_logic_vector(15 downto 0); + signal rom_lo : std_logic_vector( 7 downto 0); + signal rom_hi : std_logic_vector( 7 downto 0); + signal rom_data_in : std_logic_vector( 7 downto 0); + signal rom_data_out : std_logic_vector( 7 downto 0); + signal sega_dec : std_logic_vector( 7 downto 0); +begin + -- ROM at 0000 - 3FFF + u_program_rom0 : entity work.ROM_PGM_0 + port map ( + CLK => CLK, + ADDR => rom_addr(13 downto 0), + DATA => rom_lo + ); + + -- ROM at 8000 - BFFF (Liz Wiz) +-- u_program_rom1 : entity work.ROM_PGM_1 +-- port map ( +-- CLK => CLK, +-- ADDR => rom_addr(13 downto 0), +-- DATA => rom_hi +-- ); + + -- Sega ROM descrambler adapted from MAME segacrpt.c source code + u_sega_decode : entity work.sega_decode + port map ( + I_CK => clk, + I_DEC => sega_dec_ena, -- passthrough when low + I_A(6) => cpu_m1_l, + I_A(5) => rom_addr(12), + I_A(4) => rom_addr(8), + I_A(3) => rom_addr(4), + I_A(2) => rom_addr(0), + I_A(1) => rom_data_in(5), + I_A(0) => rom_data_in(3), + I_D => rom_data_in, + O_D => sega_dec + ); + + sega_dec_ena <= PENGO and (not rom_addr(15)); + +-- The trap regions are 8 bytes in length starting on the following addresses: +-- +-- latch clear, decode disable +-- 0x0038 +-- 0x03b0 +-- 0x1600 +-- 0x2120 +-- 0x3ff0 +-- 0x8000 +-- 0x97f0 +-- +-- latch set, decode enable +-- 0x3ff8 + p_overlay : process + variable trap_addr : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + trap_addr := addr(15 downto 3) & "000"; + if trap_addr = x"3ff8" then + overlay_on <= '1'; + elsif + trap_addr = x"0038" or + trap_addr = x"03b0" or + trap_addr = x"1600" or + trap_addr = x"2120" or + trap_addr = x"3ff0" or + trap_addr = x"8000" or + trap_addr = x"97f0" + then + overlay_on <= '0'; + end if; + end process; + + p_decoder_comb : process(clk, rom_addr, addr, rom_data_in, rom_data_out, rom_patched, rom_hi, rom_lo, overlay_on, sega_dec) + variable patch_addr : std_logic_vector(15 downto 0); + begin + rom_addr <= addr; + rom_patched <= addr; + data <= rom_data_out; + + -- default is unscrambled data + rom_data_out <= rom_data_in ; + + -- mux ROMs to same data bus + -- ignore A15 so that Pacman ROMs 0000-3FFF mirror in high mem at 8000-BFFF + if rom_addr(14) = '0' then + rom_data_in <= rom_lo; + else + rom_data_in <= rom_hi; + end if; + + -- Mr TNT program ROMs have data lines D3 and D5 swapped + -- Mr TNT video ROMs have data lines D4 and D6 and address lines A0 and A2 swapped + if MRTNT = '1' then + rom_data_out <= rom_data_in(7 downto 6) & rom_data_in(3) & rom_data_in(4) & rom_data_in(5) & rom_data_in(2 downto 0); + end if; + + if PENGO = '1' then + -- ROM at 0000 - 7fff (Pengo) + if rom_addr(15) = '0' then + rom_data_out <= sega_dec; + end if; + end if; + + if MSPACMAN = '1' and overlay_on = '1' then + -- forty 8-byte patches into Pac-Man code + -- If the CPU address presented falls in a patch range, substitute it with patched address + -- OH THE HUMANITY!!! + patch_addr := addr(15 downto 3) & "000"; + case patch_addr is + when x"0410" => rom_patched <= x"800" & '1' & addr(2 downto 0); -- ROM[0x0410+i] = ROM[0x8008+i] + when x"08E0" => rom_patched <= x"81D" & '1' & addr(2 downto 0); -- ROM[0x08E0+i] = ROM[0x81D8+i] + when x"0A30" => rom_patched <= x"811" & '1' & addr(2 downto 0); -- ROM[0x0A30+i] = ROM[0x8118+i] + when x"0BD0" => rom_patched <= x"80D" & '1' & addr(2 downto 0); -- ROM[0x0BD0+i] = ROM[0x80D8+i] + when x"0C20" => rom_patched <= x"812" & '0' & addr(2 downto 0); -- ROM[0x0C20+i] = ROM[0x8120+i] + when x"0E58" => rom_patched <= x"816" & '1' & addr(2 downto 0); -- ROM[0x0E58+i] = ROM[0x8168+i] + when x"0EA8" => rom_patched <= x"819" & '1' & addr(2 downto 0); -- ROM[0x0EA8+i] = ROM[0x8198+i] + + when x"1000" => rom_patched <= x"802" & '0' & addr(2 downto 0); -- ROM[0x1000+i] = ROM[0x8020+i] + when x"1008" => rom_patched <= x"801" & '0' & addr(2 downto 0); -- ROM[0x1008+i] = ROM[0x8010+i] + when x"1288" => rom_patched <= x"809" & '1' & addr(2 downto 0); -- ROM[0x1288+i] = ROM[0x8098+i] + when x"1348" => rom_patched <= x"804" & '1' & addr(2 downto 0); -- ROM[0x1348+i] = ROM[0x8048+i] + when x"1688" => rom_patched <= x"808" & '1' & addr(2 downto 0); -- ROM[0x1688+i] = ROM[0x8088+i] + when x"16B0" => rom_patched <= x"818" & '1' & addr(2 downto 0); -- ROM[0x16B0+i] = ROM[0x8188+i] + when x"16D8" => rom_patched <= x"80C" & '1' & addr(2 downto 0); -- ROM[0x16D8+i] = ROM[0x80C8+i] + when x"16F8" => rom_patched <= x"81C" & '1' & addr(2 downto 0); -- ROM[0x16F8+i] = ROM[0x81C8+i] + when x"19A8" => rom_patched <= x"80A" & '1' & addr(2 downto 0); -- ROM[0x19A8+i] = ROM[0x80A8+i] + when x"19B8" => rom_patched <= x"81A" & '1' & addr(2 downto 0); -- ROM[0x19B8+i] = ROM[0x81A8+i] + + when x"2060" => rom_patched <= x"814" & '1' & addr(2 downto 0); -- ROM[0x2060+i] = ROM[0x8148+i] + when x"2108" => rom_patched <= x"801" & '1' & addr(2 downto 0); -- ROM[0x2108+i] = ROM[0x8018+i] + when x"21A0" => rom_patched <= x"81A" & '0' & addr(2 downto 0); -- ROM[0x21A0+i] = ROM[0x81A0+i] + when x"2298" => rom_patched <= x"80A" & '0' & addr(2 downto 0); -- ROM[0x2298+i] = ROM[0x80A0+i] + when x"23E0" => rom_patched <= x"80E" & '1' & addr(2 downto 0); -- ROM[0x23E0+i] = ROM[0x80E8+i] + when x"2418" => rom_patched <= x"800" & '0' & addr(2 downto 0); -- ROM[0x2418+i] = ROM[0x8000+i] + when x"2448" => rom_patched <= x"805" & '1' & addr(2 downto 0); -- ROM[0x2448+i] = ROM[0x8058+i] + when x"2470" => rom_patched <= x"814" & '0' & addr(2 downto 0); -- ROM[0x2470+i] = ROM[0x8140+i] + when x"2488" => rom_patched <= x"808" & '0' & addr(2 downto 0); -- ROM[0x2488+i] = ROM[0x8080+i] + when x"24B0" => rom_patched <= x"818" & '0' & addr(2 downto 0); -- ROM[0x24B0+i] = ROM[0x8180+i] + when x"24D8" => rom_patched <= x"80C" & '0' & addr(2 downto 0); -- ROM[0x24D8+i] = ROM[0x80C0+i] + when x"24F8" => rom_patched <= x"81C" & '0' & addr(2 downto 0); -- ROM[0x24F8+i] = ROM[0x81C0+i] + when x"2748" => rom_patched <= x"805" & '0' & addr(2 downto 0); -- ROM[0x2748+i] = ROM[0x8050+i] + when x"2780" => rom_patched <= x"809" & '0' & addr(2 downto 0); -- ROM[0x2780+i] = ROM[0x8090+i] + when x"27B8" => rom_patched <= x"819" & '0' & addr(2 downto 0); -- ROM[0x27B8+i] = ROM[0x8190+i] + when x"2800" => rom_patched <= x"802" & '1' & addr(2 downto 0); -- ROM[0x2800+i] = ROM[0x8028+i] + when x"2B20" => rom_patched <= x"810" & '0' & addr(2 downto 0); -- ROM[0x2B20+i] = ROM[0x8100+i] + when x"2B30" => rom_patched <= x"811" & '0' & addr(2 downto 0); -- ROM[0x2B30+i] = ROM[0x8110+i] + when x"2BF0" => rom_patched <= x"81D" & '0' & addr(2 downto 0); -- ROM[0x2BF0+i] = ROM[0x81D0+i] + when x"2CC0" => rom_patched <= x"80D" & '0' & addr(2 downto 0); -- ROM[0x2CC0+i] = ROM[0x80D0+i] + when x"2CD8" => rom_patched <= x"80E" & '0' & addr(2 downto 0); -- ROM[0x2CD8+i] = ROM[0x80E0+i] + when x"2CF0" => rom_patched <= x"81E" & '0' & addr(2 downto 0); -- ROM[0x2CF0+i] = ROM[0x81E0+i] + when x"2D60" => rom_patched <= x"816" & '0' & addr(2 downto 0); -- ROM[0x2D60+i] = ROM[0x8160+i] + when others => rom_patched <= addr; + end case; + +-- Pacman ROMs +-- 0x0000-0x0FFF = 0x0000-0x0FFF; /* pacman.6e */ +-- 0x1000-0x1FFF = 0x1000-0x1FFF; /* pacman.6f */ +-- 0x2000-0x2FFF = 0x2000-0x2FFF; /* pacman.6h */ +-- 0x3000-0x3FFF = 0x3000-0x3FFF; /* pacman.6j */ + +-- ROM mirror (easy just ignore A15) +-- 0x8000-0x8FFF = 0x0000-0x0FFF; /* mirror of pacman.6e */ +-- 0x9000-0x9FFF = 0x1000-0x1FFF; /* mirror of pacman.6f */ +-- 0xA000-0xAFFF = 0x2000-0x2FFF; /* mirror of pacman.6h */ +-- 0xB000-0xBFFF = 0x3000-0x3FFF; /* mirror of pacman.6j */ + +-- Ms Pacman overlays + +-- no xlate +-- 0x8000-0x87FF = 0x8000-0x87FF (physical ROM hi 0000-07FF); /* decrypt u5 */ +-- 0x9000-0x97FF = 0x9000-0x97FF (physical ROM hi 1000-17FF); /* decrypt half of u6 */ + +-- xlate addr +-- 0x3000-0x3FFF = 0xB000-0xBFFF (physical ROM hi 2000-2FFF); /* decrypt u7 */ + +-- xlate addr +-- 0x8800-0x8FFF = 0x9800-0x9FFF (physical ROM hi 1800-1FFF); /* decrypt half of u6 */ + +-- ROM hi mem map +-- u5 2K 0000-07FF (0x8000-0x87FF) +-- u5 2K 0800-0FFF N/A +-- u6b 2K 1000-17FF (0x9000-0x97FF) +-- u6t 2K 1800-1FFF (0x8800-0x8FFF) +-- u7 4K 2000-2FFF (0x3000-0x3FFF) + + -- If the new patched address falls in certain Ms Pacman ranges, swap in ROM overlays and descramble address and data + -- high address bits are not scrambled so we know for sure this only accesses ROM hi after address translation + case rom_patched(15 downto 11) is + + -- addr = 0x3000-0x37FF, xlate to 0xB000-0xB7FF (physical ROM hi 2000-27FF), decrypt half of u7 + when "00110" => + rom_addr <= x"2" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x3800-0x3FFF, xlate to 0xB800-0xBFFF (physical ROM hi 2800-2FFF), decrypt half of u7 + when "00111" => + rom_addr <= x"2" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x8000-0x87FF, no xlate (physical ROM hi 0000-07FF), decrypt u5 + when "10000" => + rom_addr <= x"0" & rom_patched(11) & rom_patched(8) & rom_patched(7) & rom_patched(5) & rom_patched(9) & rom_patched(10) & rom_patched(6) & rom_patched(3) & rom_patched(4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x8800-0x8FFF, xlate to 0x9800-0x9FFF (physical ROM hi 1800-1FFF), decrypt half of u6 + when "10001" => + rom_addr <= x"1" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x9000-0x97FF, no xlate (physical ROM hi 1000-17FF), decrypt half of u6 + when "10010" => + rom_addr <= x"1" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- catch all default action + when others => null; + rom_addr <= rom_patched; + rom_data_out <= rom_data_in; + end case; + end if; + end process; + +end rtl; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..ec6bcb54 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman_video.vhd @@ -0,0 +1,371 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_VIDEO is +generic ( + MRTNT : std_logic := '1' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); +port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + I_PS : in std_logic_vector( 2 downto 0); + I_WR2_L : in std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic +); +end; + +architecture RTL of PACMAN_VIDEO is + + signal sprite_xy_ram_temp : std_logic_vector(7 downto 0); + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal db_reg : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + + signal ca : std_logic_vector(13 downto 0); + signal char_rom_5ef_dout : std_logic_vector(7 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal cntr_ld : std_logic; + signal sprite_ram_ip : std_logic_vector(3 downto 0); + signal sprite_ram_op : std_logic_vector(3 downto 0); + signal ra : std_logic_vector(7 downto 0); + signal ra_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(3 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + + -- ram enable is low when HBLANK_L is 0 (for sprite access) or + -- 2H is low (for cpu writes) + -- we can simplify this + dr <= not sprite_xy_ram_temp when I_HBLANK = '1' else "11111111"; -- pull ups on board + + sprite_xy_ram : work.dpram generic map (4,8) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR2_L, + addr_a_i => I_AB(3 downto 0), + data_a_i => I_DB, + + clk_b_i => CLK, + addr_b_i => I_AB(3 downto 0), + data_b_o => sprite_xy_ram_temp + ); + + p_char_regs : process + variable inc : std_logic; + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; + begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + inc := (not I_HBLANK); + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & inc); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + db_reg <= I_DB; -- character reg + end if; + end process; + + p_flip_comb : process(char_hblank_reg, I_FLIP, db_reg) + begin + if (char_hblank_reg = '0') then + xflip <= I_FLIP; + yflip <= I_FLIP; + else + xflip <= db_reg(1); + yflip <= db_reg(0); + end if; + end process; + + p_char_addr_comb : process(db_reg, I_HCNT, I_PS(2), + char_match_reg, char_sum_reg, char_hblank_reg, + xflip, yflip) + begin + obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + + ca(13) <= I_PS(2); + ca(12) <= char_hblank_reg; + ca(11 downto 6) <= db_reg(7 downto 2); + + -- 2h, 4e + if (char_hblank_reg = '0') then + ca(5) <= db_reg(1); + ca(4) <= db_reg(0); + else + ca(5) <= char_sum_reg(3) xor xflip; + ca(4) <= I_HCNT(3); + end if; + + ca(3) <= I_HCNT(2) xor yflip; + ca(1) <= char_sum_reg(1) xor xflip; + + -- descramble ROMs for Mr TNT (swap address lines A0 and A2) + if MRTNT = '1' then + ca(2) <= char_sum_reg(0) xor xflip; + ca(0) <= char_sum_reg(2) xor xflip; + else + ca(2) <= char_sum_reg(2) xor xflip; + ca(0) <= char_sum_reg(0) xor xflip; + end if; + end process; + + + -- descramble ROMs for Mr TNT (swap data lines D4 and D6) + char_rom_5ef_dout <= char_rom_5ef_buf(7) & char_rom_5ef_buf(4) & char_rom_5ef_buf(5) & char_rom_5ef_buf(6) & char_rom_5ef_buf(3 downto 0) when MRTNT = '1' else char_rom_5ef_buf; + + -- char roms + char_rom_5ef : entity work.GFX1 + port map ( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf + ); + + p_char_shift : process + begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_dout(7 downto 4); -- load + shift_regl <= char_rom_5ef_dout(3 downto 0); + when others => null; + end case; + end if; + end process; + + p_char_shift_comb : process(I_HCNT, vout_yflip, shift_regu, shift_regl) + variable ip : std_logic; + begin + ip := I_HCNT(0) and I_HCNT(1); + if (vout_yflip = '0') then + + shift_sel(0) <= ip; + shift_sel(1) <= '1'; + shift_op(0) <= shift_regl(3); + shift_op(1) <= shift_regu(3); + else + + shift_sel(0) <= '1'; + shift_sel(1) <= ip; + shift_op(0) <= shift_regl(0); + shift_op(1) <= shift_regu(0); + end if; + end process; + + p_video_out_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= I_DB(4 downto 0); -- colour reg + end if; + end if; + end process; + + col_rom_4a : entity work.PROM4_DST + port map ( + -- CLK => CLK, + ADDR(9) => '0', + ADDR(8) => I_PS(1), + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a + ); + + cntr_ld <= '1' when (I_HCNT(3 downto 0) = "0111") and (vout_hblank='1' or vout_obj_on='0') else '0'; + + p_ra_cnt : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (cntr_ld = '1') then + ra <= dr; + else + ra <= ra + "1"; + end if; + end if; + end process; + + u_sprite_ram : work.dpram generic map (8,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => vout_obj_on_t1, + addr_a_i => ra_t1, + data_a_i => sprite_ram_ip, + + clk_b_i => CLK, + addr_b_i => ra, + data_b_o => sprite_ram_op + ); + + sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "0000"; + video_op_sel <= '1' when not (sprite_ram_reg = "0000") else '0'; + + p_sprite_ram_ip_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + ra_t1 <= ra; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + end if; + end process; + + p_sprite_ram_ip_comb : process(vout_hblank_t1, video_op_sel, sprite_ram_reg, lut_4a_t1) + begin + -- 3a + if (vout_hblank_t1 = '0') then + sprite_ram_ip <= (others => '0'); + else + if (video_op_sel = '1') then + sprite_ram_ip <= sprite_ram_reg; + else + sprite_ram_ip <= lut_4a_t1(3 downto 0); + end if; + end if; + end process; + + p_video_op_comb : process(vout_hblank, I_VBLANK, video_op_sel, sprite_ram_reg, lut_4a) + begin + -- 3b + if (vout_hblank = '1') or (I_VBLANK = '1') then + final_col <= (others => '0'); + else + if (video_op_sel = '1') then + final_col <= sprite_ram_reg; -- sprite + else + final_col <= lut_4a(3 downto 0); + end if; + end if; + end process; + + -- assign video outputs from color LUT PROM + col_rom_7f : entity work.PROM7_DST + port map ( + CLK => CLK, + ADDR(4) => I_PS(0), + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE + ); + +end architecture; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman_vram_addr.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman_vram_addr.vhd new file mode 100644 index 00000000..33b9febe --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pacman_vram_addr.vhd @@ -0,0 +1,73 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ & CarlW - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VRAM_ADDR is +port ( + AB : out std_logic_vector (11 downto 0); + H : in std_logic_vector ( 8 downto 0); -- H256_L H128 H64 H32 H16 H8 H4 H2 H1 + V : in std_logic_vector ( 7 downto 0); -- V128 V64 v32 V16 V8 V4 V2 V1 + FLIP : in std_logic +); +end; + +architecture RTL of PACMAN_VRAM_ADDR is + signal sel : std_logic; + signal y157_bus : std_logic_vector (11 downto 0); + signal y257_bus : std_logic_vector (11 downto 0); + signal hp : std_logic_vector ( 4 downto 0); + signal vp : std_logic_vector ( 4 downto 0); +begin + hp <= H(7 downto 3) xor (FLIP & FLIP & FLIP & FLIP & FLIP); + vp <= V(7 downto 3) xor (FLIP & FLIP & FLIP & FLIP & FLIP); + + sel <= not ( (H(5) xor H(4)) or (H(5) xor H(6)) ); + y157_bus <= '0' & H(2) & hp(3) & hp(3) & hp(3) & hp(3) & hp(0) & vp when sel='1' else x"FF" & H(6 downto 4) & H(2); + y257_bus <= y157_bus when H(8)='0' else '0' & H(2) & vp & hp; + AB <= y257_bus when H(1) = '1' else (others => 'Z'); + +end RTL; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_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 VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pll.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pll.vhd new file mode 100644 index 00000000..3c952a1a --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/pll.vhd @@ -0,0 +1,365 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC ; + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + locked <= sub_wire0; + sub_wire2 <= sub_wire1(0); + c0 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 9, + clk0_duty_cycle => 50, + clk0_multiply_by => 8, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire4, + locked => sub_wire0, + clk => sub_wire1 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "9" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +-- 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 "1" +-- 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: 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_CLKENA0 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 "9" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +-- Retrieval info: CONSTANT: CLK0_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_USED" +-- 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_USED" +-- 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_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/sega_decode.vhd b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/sega_decode.vhd new file mode 100644 index 00000000..8ae8141d --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/sega_decode.vhd @@ -0,0 +1,191 @@ +------------------------------------------------------------------------------- +-- Pengo decode table +-- /* opcode (M1=0) data (M1=1) address */ +-- /* 0 1 2 3 0 1 2 3 A12 A8 A4 A0 */ +-- { 0xa0,0x80,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...0 */ +-- { 0x28,0xa8,0x08,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...0...1 */ +-- { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...0...1...0 */ +-- { 0x08,0x28,0x88,0xa8 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...1 */ +-- { 0x08,0x00,0x88,0x80 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...1...0...0 */ +-- { 0xa0,0x80,0x20,0x00 }, { 0x08,0x00,0x88,0x80 }, /* ...0...1...0...1 */ +-- { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...1...0 */ +-- { 0xa0,0x80,0x20,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...0...1...1...1 */ +-- { 0x88,0x80,0x08,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...0...0 */ +-- { 0x88,0x80,0x08,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...1...0...0...1 */ +-- { 0x08,0x28,0x88,0xa8 }, { 0x08,0x28,0x88,0xa8 }, /* ...1...0...1...0 */ +-- { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...1...1 */ +-- { 0x08,0x00,0x88,0x80 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...0 */ +-- { 0x00,0x08,0x20,0x28 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...1 */ +-- { 0x08,0x28,0x88,0xa8 }, { 0x08,0x28,0x88,0xa8 }, /* ...1...1...1...0 */ +-- { 0x08,0x00,0x88,0x80 }, { 0xa0,0x80,0x20,0x00 } /* ...1...1...1...1 */ +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity sega_decode is + port ( + I_DEC : in std_logic; + I_CK : in std_logic; + -- + I_A : in std_logic_vector(6 downto 0); + I_D : in std_logic_vector(7 downto 0); + O_D : out std_logic_vector(7 downto 0) + ); + +end sega_decode; + +architecture rtl of sega_decode is + signal sel : std_logic_vector(6 downto 0); + signal val : std_logic_vector(2 downto 0); +begin + p_decoder : process + begin + wait until rising_edge(I_CK); + if (I_DEC = '0') then + O_D <= I_D; -- passthough + else + sel <= I_A xor ("00000" & I_D(7) & I_D(7)); + O_D(7) <= I_D(7) xor val(2); + O_D(6) <= I_D(6); + O_D(5) <= I_D(7) xor val(1); + O_D(4) <= I_D(4); + O_D(3) <= I_D(7) xor val(0); + O_D(2) <= I_D(2); + O_D(1) <= I_D(1); + O_D(0) <= I_D(0); + case sel is -- M1 A12 A8 A4 A0 D5 D3 + when "0000000" => val <= "110"; + when "0000001" => val <= "100"; + when "0000010" => val <= "111"; + when "0000011" => val <= "101"; + when "0000100" => val <= "011"; + when "0000101" => val <= "111"; + when "0000110" => val <= "001"; + when "0000111" => val <= "101"; + when "0001000" => val <= "110"; + when "0001001" => val <= "100"; + when "0001010" => val <= "010"; + when "0001011" => val <= "000"; + when "0001100" => val <= "001"; + when "0001101" => val <= "011"; + when "0001110" => val <= "101"; + when "0001111" => val <= "111"; + when "0010000" => val <= "001"; + when "0010001" => val <= "000"; + when "0010010" => val <= "101"; + when "0010011" => val <= "100"; + when "0010100" => val <= "110"; + when "0010101" => val <= "100"; + when "0010110" => val <= "010"; + when "0010111" => val <= "000"; + when "0011000" => val <= "110"; + when "0011001" => val <= "100"; + when "0011010" => val <= "010"; + when "0011011" => val <= "000"; + when "0011100" => val <= "110"; + when "0011101" => val <= "100"; + when "0011110" => val <= "010"; + when "0011111" => val <= "000"; + when "0100000" => val <= "101"; + when "0100001" => val <= "100"; + when "0100010" => val <= "001"; + when "0100011" => val <= "000"; + when "0100100" => val <= "101"; + when "0100101" => val <= "100"; + when "0100110" => val <= "001"; + when "0100111" => val <= "000"; + when "0101000" => val <= "001"; + when "0101001" => val <= "011"; + when "0101010" => val <= "101"; + when "0101011" => val <= "111"; + when "0101100" => val <= "110"; + when "0101101" => val <= "100"; + when "0101110" => val <= "111"; + when "0101111" => val <= "101"; + when "0110000" => val <= "001"; + when "0110001" => val <= "000"; + when "0110010" => val <= "101"; + when "0110011" => val <= "100"; + when "0110100" => val <= "000"; + when "0110101" => val <= "001"; + when "0110110" => val <= "010"; + when "0110111" => val <= "011"; + when "0111000" => val <= "001"; + when "0111001" => val <= "011"; + when "0111010" => val <= "101"; + when "0111011" => val <= "111"; + when "0111100" => val <= "001"; + when "0111101" => val <= "000"; + when "0111110" => val <= "101"; + when "0111111" => val <= "100"; + when "1000000" => val <= "011"; + when "1000001" => val <= "111"; + when "1000010" => val <= "001"; + when "1000011" => val <= "101"; + when "1000100" => val <= "110"; + when "1000101" => val <= "100"; + when "1000110" => val <= "111"; + when "1000111" => val <= "101"; + when "1001000" => val <= "110"; + when "1001001" => val <= "100"; + when "1001010" => val <= "010"; + when "1001011" => val <= "000"; + when "1001100" => val <= "110"; + when "1001101" => val <= "100"; + when "1001110" => val <= "111"; + when "1001111" => val <= "101"; + when "1010000" => val <= "011"; + when "1010001" => val <= "111"; + when "1010010" => val <= "001"; + when "1010011" => val <= "101"; + when "1010100" => val <= "001"; + when "1010101" => val <= "000"; + when "1010110" => val <= "101"; + when "1010111" => val <= "100"; + when "1011000" => val <= "110"; + when "1011001" => val <= "100"; + when "1011010" => val <= "010"; + when "1011011" => val <= "000"; + when "1011100" => val <= "000"; + when "1011101" => val <= "001"; + when "1011110" => val <= "010"; + when "1011111" => val <= "011"; + when "1100000" => val <= "110"; + when "1100001" => val <= "100"; + when "1100010" => val <= "010"; + when "1100011" => val <= "000"; + when "1100100" => val <= "000"; + when "1100101" => val <= "001"; + when "1100110" => val <= "010"; + when "1100111" => val <= "011"; + when "1101000" => val <= "001"; + when "1101001" => val <= "011"; + when "1101010" => val <= "101"; + when "1101011" => val <= "111"; + when "1101100" => val <= "110"; + when "1101101" => val <= "100"; + when "1101110" => val <= "010"; + when "1101111" => val <= "000"; + when "1110000" => val <= "101"; + when "1110001" => val <= "100"; + when "1110010" => val <= "001"; + when "1110011" => val <= "000"; + when "1110100" => val <= "101"; + when "1110101" => val <= "100"; + when "1110110" => val <= "001"; + when "1110111" => val <= "000"; + when "1111000" => val <= "001"; + when "1111001" => val <= "011"; + when "1111010" => val <= "101"; + when "1111011" => val <= "111"; + when "1111100" => val <= "110"; + when "1111101" => val <= "100"; + when "1111110" => val <= "010"; + when "1111111" => val <= "000"; + when others => null; + end case; + end if; + end process; +end rtl; diff --git a/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/ManiacMiner_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/ManiacMiner_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/Arcade/Pacman Hardware/MrTNT_MiST/MrTNT.qpf b/Arcade/Pacman Hardware/MrTNT_MiST/MrTNT.qpf new file mode 100644 index 00000000..11f72dde --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/MrTNT.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "MrTNT" diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/MrTNT.qsf b/Arcade/Pacman Hardware/MrTNT_MiST/MrTNT.qsf new file mode 100644 index 00000000..d2244a4a --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/MrTNT.qsf @@ -0,0 +1,164 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 23:14:41 November 10, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# MrTNT_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 PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY MrTNT +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# 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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" + +# 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 ENTITY(MrTNT) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(MrTNT) +# ----------------- +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/pacman_vram_addr.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/MrTNT.sv +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/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM3_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GFX1.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/README.txt b/Arcade/Pacman Hardware/MrTNT_MiST/README.txt new file mode 100644 index 00000000..d59b2005 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Mr.TNT port to MiST by Gehstock +-- 10 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/Release/MrTNT.rbf b/Arcade/Pacman Hardware/MrTNT_MiST/Release/MrTNT.rbf new file mode 100644 index 00000000..e91c94f3 Binary files /dev/null and b/Arcade/Pacman Hardware/MrTNT_MiST/Release/MrTNT.rbf differ diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/clean.bat b/Arcade/Pacman Hardware/MrTNT_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_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/Arcade/Pacman Hardware/MrTNT_MiST/rtl/MrTNT.sv b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/MrTNT.sv new file mode 100644 index 00000000..b93c50bd --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/MrTNT.sv @@ -0,0 +1,190 @@ +//============================================================================ +// Arcade: Mr.TNT +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module MrTNT +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "MR. TNT;;", + "O2,Joystick Control,Normal,Upright;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [7:0] audio; +wire hsync,vsync; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid = ce_6m; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(292), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(r), + .G(g), + .B(b), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(~reset), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_down = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[7] | joystick_0[0] | joystick_1[0]; +wire m_left = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_right = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[4] | joystick_0[3] | joystick_1[3]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4];//btn_fire | joy[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + + +pacman mrtnt +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + .in0_reg(~{2'b00, m_coin, 1'b0, m_down,m_right,m_left,m_up}), + .in1_reg(~{1'b0, m_start2, m_start1, m_fire, 4'b0000}), + .dipsw_reg(8'b0_1_11_00_11), + + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +endmodule diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..ca003047 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"9C",X"63",X"41",X"9C",X"BE",X"BE",X"41",X"00",X"41",X"14",X"36",X"41",X"63",X"63",X"14",X"00", + X"41",X"41",X"FF",X"00",X"41",X"41",X"FF",X"00",X"00",X"22",X"77",X"00",X"00",X"00",X"77",X"00", + X"41",X"FF",X"DD",X"63",X"C9",X"77",X"DD",X"00",X"63",X"14",X"55",X"22",X"77",X"36",X"14",X"00", + X"36",X"C9",X"C9",X"22",X"FF",X"63",X"C9",X"00",X"14",X"14",X"77",X"00",X"36",X"14",X"55",X"00", + X"14",X"14",X"FF",X"9C",X"FF",X"9C",X"14",X"00",X"00",X"63",X"77",X"00",X"77",X"41",X"36",X"00", + X"BE",X"41",X"41",X"22",X"FF",X"63",X"41",X"00",X"00",X"55",X"55",X"77",X"55",X"77",X"55",X"00", + X"36",X"C9",X"C9",X"BE",X"FF",X"FF",X"C9",X"00",X"00",X"36",X"14",X"41",X"14",X"63",X"14",X"00", + X"00",X"77",X"88",X"00",X"00",X"00",X"FF",X"00",X"36",X"14",X"55",X"36",X"77",X"36",X"14",X"00", + X"36",X"C9",X"DD",X"36",X"77",X"C9",X"DD",X"00",X"00",X"55",X"14",X"63",X"63",X"77",X"14",X"00", + X"9C",X"C9",X"EB",X"00",X"BE",X"C9",X"C9",X"00",X"63",X"14",X"14",X"63",X"77",X"77",X"14",X"00", + X"F0",X"FF",X"F0",X"F0",X"F0",X"F0",X"FF",X"F0",X"F1",X"FF",X"F1",X"F1",X"F1",X"F1",X"FF",X"F1", + X"F0",X"FF",X"F0",X"F0",X"F0",X"F0",X"FF",X"F0",X"F0",X"F1",X"F0",X"F1",X"F0",X"F1",X"F1",X"F1", + X"F0",X"FF",X"F0",X"F0",X"F0",X"F0",X"FF",X"F0",X"F1",X"F1",X"F1",X"F0",X"F1",X"F0",X"F1",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"F0",X"F1",X"F0",X"F1",X"FF",X"F1", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"FF",X"F1",X"F0",X"F1",X"F0",X"FF",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1", + X"F0",X"FF",X"F0",X"F0",X"F0",X"F0",X"FF",X"F0",X"F0",X"FF",X"F0",X"F0",X"F0",X"F0",X"FF",X"F0", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"90",X"F0",X"F8",X"B8",X"B8",X"F8",X"F0",X"90",X"60",X"F0",X"B2",X"32",X"32",X"B2",X"F0",X"60", + X"00",X"00",X"36",X"36",X"36",X"36",X"00",X"00",X"00",X"00",X"36",X"36",X"36",X"36",X"00",X"00", + X"FC",X"F5",X"F1",X"F2",X"F2",X"F9",X"F5",X"FC",X"F3",X"FA",X"F8",X"F4",X"F4",X"F9",X"FA",X"F3", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"BF",X"FF",X"BF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"BF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"BF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"BF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"88",X"36",X"22",X"88",X"9C",X"9C",X"22",X"00",X"63",X"88",X"9C",X"63",X"77",X"77",X"88",X"00", + X"22",X"22",X"BE",X"00",X"22",X"22",X"BE",X"00",X"00",X"14",X"FF",X"00",X"00",X"00",X"FF",X"00", + X"22",X"BE",X"AA",X"36",X"22",X"BE",X"AA",X"00",X"36",X"C9",X"EB",X"14",X"FF",X"9C",X"C9",X"00", + X"9C",X"22",X"22",X"14",X"BE",X"36",X"22",X"00",X"88",X"C9",X"FF",X"00",X"DD",X"88",X"EB",X"00", + X"88",X"88",X"BE",X"88",X"BE",X"88",X"88",X"00",X"00",X"36",X"FF",X"41",X"FF",X"63",X"9C",X"00", + X"9C",X"22",X"22",X"14",X"BE",X"36",X"22",X"00",X"41",X"AA",X"AA",X"BE",X"EB",X"BE",X"AA",X"00", + X"9C",X"22",X"22",X"9C",X"BE",X"BE",X"22",X"00",X"00",X"DD",X"C9",X"63",X"C9",X"77",X"C9",X"00", + X"00",X"BE",X"00",X"00",X"00",X"00",X"BE",X"00",X"9C",X"88",X"EB",X"9C",X"BE",X"9C",X"C9",X"00", + X"9C",X"22",X"AA",X"9C",X"BE",X"22",X"AA",X"00",X"00",X"EB",X"C9",X"36",X"36",X"FF",X"C9",X"00", + X"88",X"22",X"36",X"00",X"9C",X"22",X"22",X"00",X"77",X"C9",X"C9",X"36",X"FF",X"FF",X"C9",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"BE",X"88",X"88",X"BE",X"BE",X"BE",X"88",X"00",X"63",X"9C",X"9C",X"63",X"77",X"77",X"88",X"00", + X"9C",X"22",X"22",X"BE",X"BE",X"BE",X"22",X"00",X"36",X"C9",X"C9",X"FF",X"FF",X"FF",X"C9",X"00", + X"14",X"36",X"22",X"88",X"36",X"9C",X"22",X"00",X"14",X"9C",X"88",X"63",X"9C",X"77",X"88",X"00", + X"88",X"22",X"36",X"BE",X"9C",X"BE",X"22",X"00",X"63",X"88",X"9C",X"FF",X"77",X"FF",X"88",X"00", + X"22",X"BE",X"22",X"00",X"22",X"BE",X"22",X"00",X"88",X"FF",X"C9",X"00",X"C9",X"FF",X"C9",X"00", + X"00",X"00",X"00",X"BE",X"00",X"BE",X"00",X"00",X"88",X"C9",X"C9",X"FF",X"C9",X"FF",X"C9",X"00", + X"BE",X"36",X"22",X"88",X"BE",X"9C",X"22",X"00",X"C9",X"9C",X"C9",X"63",X"C9",X"77",X"88",X"00", + X"BE",X"00",X"00",X"BE",X"BE",X"BE",X"00",X"00",X"FF",X"41",X"41",X"FF",X"FF",X"FF",X"41",X"00", + X"22",X"22",X"BE",X"00",X"22",X"22",X"BE",X"00",X"88",X"88",X"FF",X"00",X"88",X"88",X"FF",X"00", + X"9C",X"22",X"22",X"14",X"BE",X"36",X"22",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00",X"00", + X"22",X"88",X"BE",X"BE",X"36",X"BE",X"9C",X"00",X"88",X"41",X"36",X"FF",X"9C",X"FF",X"63",X"00", + X"22",X"BE",X"22",X"00",X"22",X"BE",X"22",X"00",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00", + X"BE",X"00",X"00",X"BE",X"BE",X"BE",X"88",X"00",X"FF",X"77",X"77",X"FF",X"FF",X"FF",X"63",X"00", + X"BE",X"00",X"9C",X"BE",X"BE",X"BE",X"88",X"00",X"FF",X"77",X"41",X"FF",X"FF",X"FF",X"63",X"00", + X"9C",X"22",X"22",X"9C",X"BE",X"BE",X"22",X"00",X"77",X"88",X"88",X"77",X"FF",X"FF",X"88",X"00", + X"00",X"88",X"88",X"BE",X"88",X"BE",X"88",X"00",X"77",X"88",X"88",X"FF",X"FF",X"FF",X"88",X"00", + X"AA",X"22",X"BE",X"9C",X"9C",X"BE",X"AA",X"00",X"77",X"88",X"88",X"77",X"FF",X"FF",X"88",X"00", + X"22",X"88",X"BE",X"BE",X"36",X"BE",X"9C",X"00",X"77",X"88",X"C9",X"FF",X"FF",X"FF",X"88",X"00", + X"9C",X"22",X"22",X"14",X"BE",X"36",X"22",X"00",X"00",X"C9",X"DD",X"36",X"55",X"FF",X"C9",X"00", + X"00",X"00",X"BE",X"00",X"00",X"00",X"BE",X"00",X"88",X"88",X"FF",X"00",X"88",X"88",X"FF",X"00", + X"9C",X"22",X"22",X"9C",X"BE",X"BE",X"22",X"00",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00", + X"00",X"9C",X"9C",X"00",X"88",X"88",X"BE",X"00",X"FF",X"41",X"41",X"FF",X"FF",X"FF",X"00",X"00", + X"BE",X"9C",X"9C",X"BE",X"BE",X"BE",X"88",X"00",X"FF",X"41",X"41",X"FF",X"FF",X"FF",X"63",X"00", + X"36",X"9C",X"9C",X"36",X"BE",X"BE",X"88",X"00",X"9C",X"77",X"77",X"9C",X"BE",X"BE",X"63",X"00", + X"00",X"00",X"BE",X"00",X"00",X"00",X"BE",X"00",X"BE",X"FF",X"41",X"00",X"FF",X"BE",X"41",X"00", + X"22",X"BE",X"22",X"36",X"22",X"BE",X"AA",X"00",X"9C",X"C9",X"FF",X"88",X"BE",X"88",X"EB",X"00", + X"C0",X"50",X"09",X"48",X"50",X"11",X"49",X"50",X"01",X"27",X"00",X"1E",X"00",X"ED",X"98",X"1A", + X"C0",X"50",X"09",X"D8",X"67",X"11",X"D9",X"67",X"01",X"27",X"00",X"1E",X"00",X"ED",X"98",X"1A", + X"C0",X"50",X"09",X"40",X"50",X"11",X"41",X"50",X"01",X"37",X"00",X"1E",X"00",X"ED",X"98",X"09", + X"24",X"64",X"11",X"25",X"64",X"01",X"67",X"00",X"1E",X"FF",X"ED",X"98",X"09",X"7B",X"38",X"0A", + X"6C",X"3F",X"BF",X"DE",X"DE",X"BF",X"3F",X"6C",X"93",X"3F",X"7F",X"E7",X"E7",X"7F",X"3F",X"93", + X"6C",X"2F",X"2F",X"DE",X"DE",X"2F",X"2F",X"6C",X"93",X"1F",X"1F",X"E7",X"E7",X"1F",X"1F",X"93", + X"6C",X"0F",X"0F",X"4E",X"4E",X"0F",X"0F",X"6C",X"93",X"0F",X"0F",X"87",X"87",X"0F",X"0F",X"93", + X"F0",X"7F",X"FC",X"F8",X"F8",X"FC",X"7F",X"F0",X"F1",X"9F",X"B7",X"F3",X"F3",X"B7",X"9F",X"F1", + X"F0",X"FF",X"F0",X"F0",X"F0",X"F0",X"FF",X"F0",X"F1",X"FF",X"F1",X"F1",X"F1",X"F1",X"FF",X"F1", + X"F0",X"2D",X"F0",X"F0",X"F0",X"F0",X"2D",X"F0",X"F0",X"78",X"39",X"E4",X"C6",X"78",X"78",X"F0", + X"6C",X"01",X"01",X"82",X"82",X"01",X"01",X"6C",X"93",X"08",X"08",X"84",X"84",X"08",X"08",X"93", + X"F0",X"78",X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"93",X"93",X"B1",X"B1",X"B1",X"B1",X"93",X"B1", + X"E4",X"78",X"E4",X"F0",X"D2",X"F0",X"78",X"F0",X"F0",X"B1",X"F0",X"E4",X"F0",X"D2",X"B1",X"D2", + X"F0",X"78",X"F0",X"D2",X"F0",X"A5",X"78",X"F0",X"F0",X"B1",X"5A",X"F0",X"E4",X"F0",X"B1",X"F0", + X"F0",X"78",X"F0",X"F0",X"F0",X"F0",X"78",X"F0",X"F0",X"D2",X"B1",X"F0",X"F0",X"B1",X"D2",X"F0", + X"F0",X"E4",X"78",X"F0",X"F0",X"78",X"E4",X"F0",X"F0",X"E4",X"D2",X"B1",X"B1",X"D2",X"E4",X"F0", + X"F0",X"D2",X"E4",X"78",X"78",X"E4",X"D2",X"F0",X"B1",X"78",X"E4",X"D2",X"D2",X"E4",X"78",X"B1", + X"E4",X"F0",X"93",X"E4",X"E4",X"93",X"F0",X"E4",X"D2",X"F0",X"6C",X"D2",X"D2",X"6C",X"F0",X"D2", + X"78",X"93",X"E4",X"78",X"78",X"E4",X"93",X"78",X"B1",X"6C",X"D2",X"B1",X"B1",X"D2",X"6C",X"B1", + X"78",X"87",X"78",X"78",X"78",X"78",X"87",X"78",X"B1",X"4E",X"B1",X"B1",X"B1",X"B1",X"4E",X"B1", + X"F0",X"6C",X"78",X"F0",X"F0",X"78",X"6C",X"F0",X"4E",X"B1",X"93",X"87",X"87",X"93",X"B1",X"4E", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"B1",X"B1",X"B1",X"B1",X"B1",X"B1",X"B1",X"B1", + X"87",X"78",X"6C",X"4E",X"4E",X"6C",X"78",X"87",X"F0",X"93",X"B1",X"F0",X"F0",X"B1",X"93",X"F0", + X"6C",X"B1",X"B1",X"D2",X"D2",X"B1",X"B1",X"6C",X"93",X"78",X"78",X"E4",X"E4",X"78",X"78",X"93", + X"F0",X"B1",X"4E",X"F0",X"F0",X"4E",X"B1",X"F0",X"F0",X"78",X"87",X"F0",X"F0",X"87",X"78",X"F0", + X"F0",X"2D",X"93",X"F0",X"F0",X"93",X"2D",X"F0",X"F0",X"1B",X"6C",X"F0",X"F0",X"6C",X"1B",X"F0", + X"F0",X"6C",X"E4",X"78",X"78",X"E4",X"6C",X"F0",X"F0",X"93",X"D2",X"B1",X"B1",X"D2",X"93",X"F0", + X"F0",X"5A",X"D2",X"E4",X"E4",X"D2",X"5A",X"F0",X"F0",X"A5",X"E4",X"D2",X"D2",X"E4",X"A5",X"F0", + X"C6",X"39",X"B1",X"B1",X"B1",X"B1",X"39",X"C6",X"C6",X"39",X"78",X"78",X"78",X"78",X"39",X"C6", + X"78",X"B1",X"D2",X"78",X"78",X"D2",X"B1",X"78",X"B1",X"78",X"E4",X"B1",X"B1",X"E4",X"78",X"B1", + X"C6",X"F0",X"39",X"78",X"39",X"78",X"F0",X"F0",X"F0",X"F0",X"B1",X"39",X"B1",X"39",X"F0",X"C6", + X"F0",X"78",X"78",X"B1",X"F0",X"39",X"78",X"C6",X"C6",X"B1",X"39",X"F0",X"78",X"B1",X"B1",X"F0", + X"F0",X"B1",X"4E",X"F0",X"F0",X"4E",X"B1",X"F0",X"F0",X"78",X"87",X"F0",X"F0",X"87",X"78",X"F0", + X"F0",X"B1",X"B1",X"4E",X"4E",X"B1",X"B1",X"F0",X"F0",X"78",X"78",X"87",X"87",X"78",X"78",X"F0", + X"4E",X"B1",X"B1",X"B1",X"B1",X"B1",X"B1",X"4E",X"87",X"78",X"78",X"78",X"78",X"78",X"78",X"87", + X"F0",X"6C",X"78",X"F0",X"F0",X"78",X"6C",X"F0",X"F0",X"93",X"B1",X"F0",X"F0",X"B1",X"93",X"F0", + X"F0",X"4E",X"6C",X"78",X"78",X"6C",X"4E",X"F0",X"F0",X"87",X"93",X"B1",X"B1",X"93",X"87",X"F0", + X"78",X"0F",X"4E",X"6C",X"6C",X"4E",X"0F",X"78",X"B1",X"0F",X"87",X"93",X"93",X"87",X"0F",X"B1", + X"C6",X"F0",X"B1",X"93",X"93",X"B1",X"F0",X"C6",X"C6",X"F0",X"78",X"6C",X"6C",X"78",X"F0",X"C6", + X"4E",X"B1",X"93",X"87",X"87",X"93",X"B1",X"4E",X"87",X"78",X"6C",X"4E",X"4E",X"6C",X"78",X"87", + X"6C",X"93",X"87",X"0F",X"0F",X"87",X"93",X"6C",X"87",X"6C",X"4E",X"0F",X"0F",X"4E",X"6C",X"87", + X"93",X"F0",X"E4",X"B1",X"B1",X"E4",X"F0",X"93",X"6C",X"F0",X"D2",X"78",X"78",X"D2",X"F0",X"6C", + X"F0",X"78",X"D2",X"C6",X"C6",X"D2",X"78",X"F0",X"F0",X"B1",X"E4",X"C6",X"C6",X"E4",X"B1",X"F0", + X"F0",X"6C",X"6C",X"F0",X"F0",X"6C",X"6C",X"F0",X"F0",X"93",X"93",X"F0",X"F0",X"93",X"93",X"F0", + X"F0",X"0F",X"D2",X"F0",X"F0",X"D2",X"0F",X"F0",X"F0",X"0F",X"E4",X"F0",X"F0",X"E4",X"0F",X"F0", + X"F0",X"78",X"F0",X"87",X"F0",X"87",X"78",X"C6",X"C6",X"B1",X"4E",X"F0",X"4E",X"F0",X"B1",X"F0", + X"C6",X"78",X"87",X"F0",X"87",X"F0",X"78",X"F0",X"F0",X"B1",X"F0",X"4E",X"F0",X"4E",X"B1",X"C6", + X"B0",X"F0",X"E0",X"F0",X"D0",X"F0",X"70",X"F0",X"F0",X"B0",X"F0",X"E0",X"F0",X"D0",X"F0",X"70", + X"F1",X"FF",X"F7",X"FF",X"F3",X"FF",X"FF",X"FF",X"F0",X"F1",X"F0",X"F7",X"F0",X"F3",X"F0",X"FF", + X"F0",X"F8",X"F0",X"FE",X"F0",X"FC",X"F0",X"FF",X"F8",X"FF",X"FE",X"FF",X"FC",X"FF",X"FF",X"FF", + X"F0",X"00",X"F0",X"F0",X"F0",X"F0",X"00",X"F0",X"F0",X"00",X"F0",X"F0",X"F0",X"F0",X"00",X"F0", + X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"F3",X"FF",X"F7",X"FF",X"F1",X"FF",X"F0",X"F3",X"F0",X"F7",X"F0",X"F1",X"F0", + X"FF",X"F0",X"FC",X"F0",X"FE",X"F0",X"F8",X"F0",X"FF",X"FF",X"FF",X"FC",X"FF",X"FE",X"FF",X"F8", + X"1D",X"1E",X"20",X"2C",X"52",X"54",X"54",X"13",X"1F",X"19",X"59",X"18",X"50",X"17",X"52",X"54", + X"20",X"63",X"69",X"15",X"61",X"54",X"68",X"1C",X"1B",X"1E",X"20",X"16",X"1F",X"13",X"19",X"E3", + X"CE",X"E3",X"AE",X"09",X"96",X"64",X"E3",X"A6",X"E3",X"96",X"E3",X"B6",X"09",X"97",X"64",X"E3", + X"96",X"09",X"96",X"64",X"E3",X"C6",X"09",X"24",X"64",X"11",X"25",X"64",X"01",X"67",X"00",X"1E", + X"FF",X"ED",X"98",X"3E",X"FF",X"1A",X"01",X"50",X"09",X"97",X"64",X"E3",X"56",X"08",X"27",X"3A", + X"FD",X"64",X"3C",X"1A",X"FD",X"64",X"FE",X"14",X"08",X"04",X"E3",X"D6",X"E3",X"F6",X"00",X"1A", + X"C0",X"50",X"3E",X"40",X"E5",X"FD",X"14",X"3E",X"03",X"E5",X"25",X"15",X"3A",X"B3",X"64",X"FE", + X"00",X"E2",X"14",X"22",X"3A",X"B2",X"64",X"FE",X"02",X"18",X"64",X"11",X"58",X"41",X"09",X"9C", + X"30",X"3E",X"01",X"06",X"23",X"E5",X"D5",X"15",X"3A",X"40",X"50",X"E3",X"6F",X"08",X"5C",X"3A", + X"B3",X"64",X"FE",X"00",X"28",X"15",X"3A",X"B2",X"64",X"FE",X"02",X"38",X"4E",X"D6",X"02",X"1A", + X"B2",X"64",X"3A",X"B5",X"64",X"D6",X"01",X"0F",X"1A",X"B5",X"64",X"09",X"96",X"64",X"E3",X"CE", + X"3A",X"8A",X"64",X"1A",X"8E",X"64",X"E5",X"13",X"00",X"3A",X"B3",X"64",X"FE",X"00",X"E2",X"6F", + X"22",X"E5",X"35",X"15",X"C3",X"6F",X"22",X"FE",X"04",X"18",X"29",X"11",X"26",X"41",X"09",X"BF", + X"30",X"3E",X"01",X"06",X"11",X"E5",X"D5",X"15",X"11",X"10",X"42",X"09",X"D0",X"30",X"3E",X"01", + X"06",X"02",X"E5",X"D5",X"15",X"11",X"5A",X"41",X"09",X"9C",X"30",X"3E",X"01",X"06",X"23",X"E5", + X"D5",X"15",X"30",X"94",X"11",X"90",X"40",X"09",X"D2",X"30",X"3E",X"01",X"06",X"31",X"E5",X"D5", + X"15",X"30",X"85",X"3A",X"40",X"50",X"E3",X"5F",X"08",X"1B",X"3A",X"B3",X"64",X"FE",X"00",X"28", + X"15",X"3A",X"B2",X"64",X"FE",X"04",X"38",X"0D",X"D6",X"04",X"1A",X"B2",X"64",X"3A",X"B5",X"64", + X"D6",X"02",X"0F",X"1A",X"B5",X"64",X"09",X"96",X"64",X"E3",X"8E",X"3A",X"8A",X"64",X"1A",X"8E", + X"64",X"1A",X"8F",X"64",X"E5",X"13",X"00",X"E5",X"0C",X"00",X"C3",X"F1",X"21",X"1A",X"C0",X"50", + X"09",X"95",X"64",X"E3",X"5E",X"08",X"03",X"C3",X"A8",X"21",X"E3",X"9E",X"C3",X"7F",X"21",X"AF", + X"09",X"A8",X"64",X"11",X"A9",X"64",X"01",X"05",X"00",X"5F",X"ED",X"98",X"1A",X"99",X"64",X"1A", + X"9A",X"64",X"3E",X"40",X"09",X"CC",X"43",X"11",X"CD",X"43",X"01",X"05",X"00",X"5F",X"ED",X"98", + X"09",X"DE",X"43",X"11",X"DF",X"43",X"01",X"05",X"00",X"5F",X"ED",X"98",X"AF",X"1A",X"CC",X"43", + X"1A",X"DE",X"43",X"AF",X"1A",X"FF",X"64",X"1A",X"01",X"65",X"1A",X"03",X"65",X"1A",X"00",X"65", + X"1A",X"02",X"65",X"1A",X"04",X"65",X"E5",X"ED",X"1A",X"E5",X"FA",X"1A",X"09",X"97",X"64",X"E3", + X"E6",X"09",X"96",X"64",X"E3",X"4E",X"28",X"02",X"30",X"32",X"3E",X"00",X"1A",X"03",X"50",X"E5", + X"44",X"15",X"11",X"50",X"41",X"09",X"EB",X"30",X"3E",X"01",X"06",X"25",X"E5",X"D5",X"15",X"3E", + X"03",X"E5",X"67",X"15",X"09",X"96",X"64",X"E3",X"EE",X"3A",X"8E",X"64",X"3D",X"1A",X"8E",X"64", + X"3E",X"40",X"09",X"16",X"40",X"11",X"17",X"40",X"01",X"20",X"00",X"5F",X"ED",X"98",X"E5",X"13", + X"00",X"3A",X"FF",X"64",X"1A",X"03",X"65",X"3A",X"00",X"65",X"1A",X"04",X"65",X"E5",X"39",X"1B", + X"C3",X"B3",X"23",X"09",X"96",X"64",X"E3",X"4E",X"08",X"E2",X"E3",X"6E",X"28",X"AC",X"3A",X"96", + X"64",X"E3",X"7F",X"08",X"43",X"E5",X"44",X"15",X"11",X"50",X"41",X"09",X"F8",X"30",X"3E",X"01", + X"06",X"25",X"E5",X"D5",X"15",X"3E",X"03",X"E5",X"67",X"15",X"09",X"96",X"64",X"E3",X"AE",X"3A", + X"8F",X"64",X"3D",X"1A",X"8F",X"64",X"3E",X"40",X"09",X"02",X"40",X"11",X"03",X"40",X"01",X"20", + X"00",X"5F",X"ED",X"98",X"E5",X"0C",X"00",X"3A",X"01",X"65",X"1A",X"03",X"65",X"3A",X"02",X"65", + X"1A",X"04",X"65",X"E5",X"3B",X"1B",X"30",X"1B",X"3E",X"01",X"1A",X"03",X"50",X"30",X"9E",X"E5", + X"44",X"15",X"09",X"96",X"64",X"E3",X"4E",X"C2",X"E9",X"22",X"11",X"10",X"41",X"09",X"05",X"31", + X"3E",X"01",X"06",X"11",X"E5",X"D5",X"15",X"09",X"08",X"65",X"E3",X"C6",X"3E",X"01",X"E5",X"67", + X"15",X"09",X"96",X"64",X"E3",X"6E",X"28",X"8F",X"C3",X"E9",X"22",X"E5",X"FA",X"26",X"09",X"97", + X"64",X"E3",X"66",X"28",X"13",X"E3",X"A6",X"09",X"C2",X"65",X"E3",X"C6",X"1A",X"C0",X"50",X"3A", + X"C2",X"65",X"FE",X"00",X"08",X"DE",X"30",X"05",X"3E",X"02",X"E5",X"67",X"15",X"09",X"8F",X"65", + X"E3",X"C6",X"09",X"59",X"65",X"E3",X"C6",X"E5",X"BC",X"33",X"ED",X"73",X"AE",X"64",X"7B",X"9A", + X"28",X"21",X"09",X"00",X"00",X"0A",X"AE",X"64",X"E5",X"4E",X"27",X"1A",X"C0",X"50",X"E5",X"15", + X"16",X"09",X"96",X"64",X"E3",X"66",X"28",X"F7",X"E3",X"A6",X"E5",X"22",X"16",X"09",X"96",X"64", + X"E3",X"56",X"08",X"27",X"E5",X"3F",X"1B",X"E5",X"22",X"16",X"09",X"96",X"64",X"E3",X"76",X"08", + X"21",X"30",X"4F",X"E3",X"96",X"E5",X"3E",X"1B",X"30",X"EA",X"E3",X"B6",X"09",X"97",X"64",X"E3", + X"E6",X"09",X"96",X"64",X"E3",X"6E",X"08",X"29",X"3A",X"01",X"65",X"3C",X"FE",X"24",X"08",X"02", + X"3E",X"23",X"1A",X"01",X"65",X"1A",X"03",X"65",X"3A",X"02",X"65",X"3C",X"FE",X"31",X"08",X"02", + X"3E",X"30",X"1A",X"02",X"65",X"1A",X"04",X"65",X"E5",X"40",X"1B",X"E5",X"3D",X"1B",X"C3",X"B3", + X"23",X"3A",X"FF",X"64",X"3C",X"FE",X"24",X"08",X"02",X"3E",X"23",X"1A",X"FF",X"64",X"1A",X"03", + X"65",X"3A",X"00",X"65",X"3C",X"FE",X"31",X"08",X"02",X"3E",X"30",X"1A",X"00",X"65",X"1A",X"04", + X"65",X"E5",X"40",X"1B",X"E5",X"3C",X"1B",X"C3",X"B3",X"23",X"3A",X"98",X"64",X"FE",X"00",X"08", + X"2E",X"09",X"96",X"64",X"E3",X"6E",X"08",X"2F",X"3A",X"8F",X"64",X"FE",X"00",X"08",X"66",X"E5", + X"44",X"15",X"11",X"90",X"41",X"09",X"16",X"31",X"3E",X"01",X"06",X"21",X"E5",X"D5",X"15",X"3E", + X"02",X"E5",X"67",X"15",X"E5",X"EE",X"11",X"09",X"95",X"64",X"E3",X"DE",X"C3",X"79",X"07",X"D6", + X"01",X"1A",X"98",X"64",X"C3",X"6F",X"23",X"3A",X"8E",X"64",X"FE",X"00",X"08",X"0D",X"09",X"96", + X"64",X"E3",X"4E",X"08",X"E2",X"E5",X"44",X"15",X"11",X"D8",X"40",X"09",X"37",X"31",X"3E",X"01", + X"06",X"14",X"E5",X"D5",X"15",X"3E",X"03",X"E5",X"67",X"15",X"C3",X"36",X"23",X"E5",X"3A",X"1B", + X"C3",X"13",X"23",X"E5",X"38",X"1B",X"C3",X"13",X"23",X"2A",X"91",X"64",X"EB",X"F5",X"09",X"00", + X"00",X"F5",X"31",X"F5",X"7E",X"01",X"F5",X"86",X"02",X"47",X"CE",X"27",X"F5",X"5F",X"02",X"E3", + X"38",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"F5",X"7E",X"00",X"09",X"07",X"25",X"E3",X"0F",X"E5", + X"98",X"15",X"76",X"0B",X"56",X"EB",X"E9",X"13",X"25",X"13",X"25",X"14",X"25",X"34",X"25",X"0C", + X"25",X"2C",X"25",X"E1",X"F5",X"7E",X"04",X"90",X"F5",X"5F",X"04",X"E1",X"F5",X"7E",X"04",X"80", + X"F5",X"5F",X"04",X"E1",X"F5",X"7E",X"03",X"80",X"F5",X"5F",X"03",X"E1",X"F5",X"7E",X"03",X"90", + X"F5",X"5F",X"03",X"E1",X"2A",X"76",X"64",X"EB",X"F5",X"09",X"00",X"00",X"F5",X"31",X"EB",X"01", + X"00",X"64",X"1F",X"3F",X"ED",X"42",X"CD",X"F5",X"7E",X"00",X"09",X"57",X"25",X"E3",X"0F",X"E5", + X"98",X"15",X"76",X"0B",X"56",X"EB",X"E9",X"0F",X"26",X"4B",X"25",X"8E",X"25",X"1E",X"26",X"40", + X"26",X"53",X"26",X"F5",X"7E",X"03",X"1A",X"74",X"64",X"F5",X"7E",X"04",X"1A",X"75",X"64",X"E5", + X"BD",X"26",X"F5",X"7E",X"06",X"12",X"3A",X"22",X"64",X"FE",X"00",X"08",X"17",X"3A",X"23",X"64", + X"FE",X"00",X"08",X"17",X"C1",X"09",X"24",X"64",X"21",X"CD",X"D1",X"13",X"01",X"05",X"00",X"1E", + X"FF",X"ED",X"98",X"E1",X"F5",X"7E",X"06",X"13",X"12",X"30",X"E9",X"F5",X"7E",X"06",X"09",X"08", + X"00",X"31",X"EB",X"12",X"30",X"F6",X"E5",X"CD",X"26",X"F5",X"7E",X"03",X"90",X"1A",X"74",X"64", + X"F5",X"7E",X"04",X"1A",X"75",X"64",X"E5",X"BD",X"26",X"3A",X"22",X"64",X"FE",X"00",X"28",X"1A", + X"3A",X"22",X"64",X"E3",X"0F",X"F5",X"46",X"05",X"80",X"3D",X"C1",X"FD",X"09",X"24",X"64",X"FD", + X"21",X"FD",X"5B",X"00",X"FD",X"5A",X"01",X"FD",X"5F",X"02",X"3C",X"13",X"FD",X"5B",X"03",X"FD", + X"5A",X"04",X"FD",X"5F",X"05",X"3A",X"74",X"64",X"F5",X"5F",X"03",X"3A",X"75",X"64",X"F5",X"5F", + X"04",X"E1",X"3A",X"23",X"64",X"FE",X"00",X"E2",X"74",X"26",X"3A",X"23",X"64",X"E3",X"0F",X"C6", + X"27",X"F5",X"46",X"05",X"80",X"C1",X"FD",X"09",X"24",X"64",X"FD",X"21",X"FD",X"5B",X"00",X"FD", + X"5A",X"01",X"FD",X"5F",X"02",X"3C",X"09",X"08",X"00",X"31",X"EB",X"FD",X"5B",X"03",X"FD",X"5A", + X"04",X"FD",X"5F",X"05",X"C3",X"CD",X"25",X"F5",X"7E",X"03",X"1A",X"74",X"64",X"F5",X"7E",X"04", + X"1A",X"75",X"64",X"C3",X"9E",X"25",X"E5",X"CD",X"26",X"F5",X"7E",X"03",X"80",X"C3",X"AD",X"25", + X"E5",X"CD",X"26",X"F5",X"7E",X"04",X"90",X"1A",X"75",X"64",X"F5",X"7E",X"03",X"1A",X"74",X"64", + X"C3",X"9E",X"25",X"E5",X"CD",X"26",X"F5",X"7E",X"04",X"80",X"30",X"EB",X"F5",X"7E",X"05",X"C1", + X"FD",X"09",X"24",X"64",X"FD",X"21",X"FD",X"5B",X"00",X"FD",X"5A",X"01",X"FD",X"5F",X"02",X"3A", + X"74",X"64",X"F5",X"5F",X"03",X"3A",X"75",X"64",X"F5",X"5F",X"04",X"F5",X"7E",X"00",X"09",X"90", + X"26",X"E3",X"0F",X"E5",X"98",X"15",X"D5",X"76",X"0B",X"56",X"EB",X"D1",X"F5",X"7E",X"06",X"E9", + X"B4",X"26",X"B4",X"26",X"B5",X"26",X"A8",X"26",X"AB",X"26",X"9A",X"26",X"E1",X"13",X"FD",X"5B", + X"03",X"FD",X"5A",X"04",X"FD",X"5F",X"05",X"E1",X"33",X"30",X"DB",X"09",X"08",X"00",X"31",X"EB", + X"30",X"EC",X"EB",X"11",X"08",X"00",X"1F",X"3F",X"ED",X"52",X"EB",X"30",X"C9",X"3A",X"74",X"64", + X"CE",X"07",X"1A",X"22",X"64",X"3A",X"75",X"64",X"CE",X"07",X"1A",X"23",X"64",X"3A",X"74",X"64", + X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"57",X"3A",X"75",X"64",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F", + X"77",X"E5",X"F7",X"14",X"E1",X"F5",X"7E",X"01",X"F5",X"86",X"02",X"47",X"CE",X"27",X"F5",X"5F", + X"02",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E1",X"3A",X"03",X"65",X"09",X"20",X"27", + X"E3",X"0F",X"E3",X"0F",X"E5",X"98",X"15",X"E9",X"E5",X"12",X"0F",X"E1",X"E5",X"64",X"0F",X"E1", + X"E5",X"86",X"0F",X"E1",X"E5",X"C0",X"0F",X"E1",X"E5",X"FA",X"0F",X"E1",X"E5",X"1C",X"28",X"E1", + X"E5",X"6E",X"28",X"E1",X"E5",X"A8",X"28",X"E1",X"E5",X"CA",X"28",X"E1",X"E5",X"34",X"29",X"E1", + X"E5",X"56",X"29",X"E1",X"E5",X"90",X"29",X"E1",X"E5",X"E2",X"29",X"E1",X"E5",X"E3",X"29",X"E1", + X"E5",X"E4",X"29",X"E1",X"E5",X"E5",X"29",X"E1",X"D5",X"1F",X"3F",X"09",X"26",X"01",X"16",X"00", + X"ED",X"52",X"7D",X"1F",X"3F",X"09",X"10",X"01",X"D1",X"72",X"16",X"00",X"ED",X"52",X"55",X"77", + X"E1",X"7D",X"EE",X"03",X"6F",X"E1",X"09",X"96",X"64",X"E3",X"46",X"E0",X"E3",X"6E",X"28",X"43", + X"09",X"A8",X"64",X"7B",X"86",X"0F",X"5F",X"0B",X"7A",X"A6",X"0F",X"5F",X"0B",X"3E",X"00",X"A6", + X"0F",X"5F",X"38",X"02",X"30",X"1A",X"09",X"96",X"64",X"E3",X"6E",X"28",X"13",X"09",X"DE",X"43", + X"11",X"DF",X"43",X"01",X"05",X"00",X"1E",X"40",X"ED",X"98",X"AF",X"1A",X"DE",X"43",X"30",X"30", + X"09",X"CC",X"43",X"11",X"CD",X"43",X"01",X"05",X"00",X"1E",X"40",X"ED",X"98",X"AF",X"1A",X"CC", + X"43",X"30",X"05",X"09",X"AB",X"64",X"30",X"BB",X"09",X"96",X"64",X"E3",X"6E",X"28",X"74",X"09", + X"AA",X"64",X"11",X"FB",X"43",X"3A",X"99",X"64",X"DD",X"E5",X"0E",X"10",X"0B",X"0B",X"0B",X"EB", + X"2A",X"8B",X"64",X"D9",X"FE",X"04",X"D0",X"E3",X"0F",X"E3",X"0F",X"3C",X"3C",X"E5",X"98",X"15", + X"E5",X"AA",X"11",X"D0",X"3A",X"98",X"64",X"3C",X"1A",X"98",X"64",X"09",X"08",X"65",X"E3",X"C6", + X"09",X"96",X"64",X"E3",X"6E",X"28",X"12",X"3A",X"99",X"64",X"3C",X"1A",X"99",X"64",X"3A",X"8E", + X"DB",X"09",X"06",X"50",X"AF",X"00",X"20",X"5F",X"0B",X"56",X"FC",X"D9",X"40",X"49",X"BD",X"37", + X"93",X"8E",X"02",X"FE",X"97",X"34",X"6A",X"00",X"B0",X"09",X"6E",X"10",X"17",X"65",X"60",X"5F", + X"2B",X"6A",X"FC",X"34",X"40",X"8F",X"B1",X"FE",X"00",X"60",X"17",X"02",X"B0",X"09",X"6E",X"10", + X"5F",X"B1",X"40",X"00",X"0B",X"9B",X"FC",X"00",X"20",X"FD",X"F5",X"AF",X"F1",X"9D",X"9D",X"4A", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"63",X"00",X"00",X"00",X"FF",X"00",X"63",X"00",X"9C",X"00",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"63",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"9C",X"00",X"63",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"41",X"00",X"63",X"00",X"41",X"00",X"63",X"00",X"88",X"00",X"9C",X"00",X"88",X"00",X"9C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"36",X"00",X"9C",X"00",X"36",X"00",X"9C",X"00",X"36",X"00",X"63",X"00",X"36",X"00",X"63",X"00", + X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"40", + X"00",X"F0",X"00",X"F0",X"00",X"F0",X"60",X"F0",X"00",X"76",X"00",X"F0",X"00",X"F0",X"22",X"62", + X"80",X"00",X"80",X"00",X"80",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"40",X"00",X"00",X"00", + X"F0",X"60",X"F0",X"00",X"F0",X"00",X"F0",X"00",X"76",X"90",X"F0",X"00",X"F0",X"00",X"F0",X"00", + X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"40", + X"00",X"F0",X"00",X"F0",X"00",X"F0",X"60",X"F0",X"00",X"F0",X"00",X"B6",X"00",X"94",X"90",X"F0", + X"80",X"00",X"80",X"00",X"80",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"40",X"00",X"00",X"00", + X"F0",X"60",X"F0",X"00",X"F0",X"00",X"F0",X"00",X"F0",X"90",X"B6",X"00",X"94",X"00",X"F0",X"00", + X"00",X"00",X"00",X"80",X"00",X"80",X"00",X"80",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"40", + X"00",X"F0",X"00",X"F0",X"00",X"F0",X"60",X"F0",X"00",X"F0",X"00",X"76",X"00",X"62",X"90",X"F0", + X"80",X"00",X"80",X"00",X"80",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"40",X"00",X"00",X"00", + X"F0",X"60",X"F0",X"00",X"F0",X"00",X"F0",X"00",X"F0",X"90",X"62",X"00",X"76",X"00",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"41",X"00",X"00",X"00",X"63",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"9C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"63",X"00",X"00",X"00",X"41",X"00",X"00",X"00",X"9C",X"00",X"00",X"00",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"41",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"41",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"70",X"00",X"10",X"00",X"70",X"90",X"F3",X"90",X"F1",X"90",X"F3",X"B2",X"F0", + X"00",X"63",X"00",X"FE",X"00",X"FF",X"41",X"F0",X"00",X"F0",X"00",X"E0",X"00",X"F0",X"90",X"E0", + X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"40",X"B0",X"70",X"90",X"60",X"90",X"F0",X"90", + X"70",X"40",X"F0",X"00",X"70",X"00",X"F0",X"00",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"B2",X"F0",X"F1",X"F0",X"F3",X"F0",X"F0",X"F0", + X"41",X"F0",X"FE",X"70",X"63",X"70",X"F0",X"70",X"F0",X"E0",X"E0",X"F0",X"F0",X"F0",X"E0",X"F0", + X"70",X"00",X"10",X"00",X"70",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"70",X"70",X"70",X"10",X"70",X"70",X"70",X"00",X"F0",X"90",X"F0",X"00",X"F0",X"00",X"F0",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"B0",X"00",X"20",X"00",X"B0", + X"00",X"F0",X"00",X"F0",X"00",X"F0",X"60",X"F0",X"00",X"B0",X"B0",X"B0",X"20",X"B0",X"B0",X"B0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0", + X"78",X"6C",X"4E",X"F0",X"6C",X"78",X"6C",X"F0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0",X"B0", + X"F0",X"F0",X"F0",X"B1",X"F0",X"F0",X"F0",X"B1",X"B1",X"0F",X"87",X"0F",X"93",X"0F",X"87",X"0E", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"B0",X"03",X"20",X"0F",X"B0",X"0F",X"01",X"0E", + X"93",X"6C",X"0F",X"00",X"87",X"08",X"4E",X"00",X"2C",X"B0",X"B0",X"20",X"38",X"B0",X"B0",X"00", + X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"0F",X"00",X"01",X"00",X"03",X"00",X"03",X"00",X"03", + X"00",X"0E",X"00",X"0F",X"00",X"0E",X"06",X"0F",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"70",X"00",X"10",X"00",X"70",X"90",X"F0",X"40",X"F0",X"F0",X"90",X"F0",X"F0", + X"00",X"70",X"70",X"40",X"10",X"70",X"70",X"00",X"00",X"90",X"00",X"90",X"00",X"00",X"90",X"D0", + X"70",X"40",X"60",X"00",X"00",X"60",X"60",X"40",X"00",X"F0",X"10",X"F3",X"F0",X"F1",X"F0",X"B2", + X"00",X"F0",X"70",X"63",X"30",X"FE",X"F0",X"41",X"70",X"80",X"F0",X"F0",X"70",X"80",X"00",X"F0", + X"70",X"40",X"70",X"70",X"60",X"60",X"00",X"70",X"90",X"F0",X"90",X"60",X"90",X"70",X"0E",X"40", + X"00",X"F0",X"00",X"F0",X"00",X"F0",X"40",X"F0",X"F0",X"F0",X"B0",X"B0",X"B0",X"B0",X"90",X"A0", + X"50",X"00",X"10",X"00",X"50",X"00",X"00",X"00",X"F0",X"B2",X"F3",X"90",X"F1",X"90",X"F3",X"00", + X"F0",X"41",X"FF",X"00",X"FE",X"00",X"63",X"00",X"E0",X"90",X"F0",X"00",X"E0",X"00",X"F0",X"00", + X"D0",X"F0",X"F0",X"F0",X"F0",X"90",X"60",X"60",X"00",X"00",X"00",X"D0",X"00",X"00",X"00",X"D0", + X"00",X"B0",X"00",X"F0",X"00",X"90",X"60",X"F0",X"00",X"00",X"F0",X"F0",X"60",X"60",X"90",X"F0", + X"60",X"C0",X"B0",X"F0",X"F0",X"B0",X"40",X"F0",X"00",X"60",X"90",X"F0",X"F0",X"B0",X"F0",X"B0", + X"60",X"F0",X"00",X"F0",X"F0",X"90",X"F0",X"00",X"B0",X"F0",X"F0",X"60",X"00",X"F0",X"B0",X"00", + X"60",X"70",X"00",X"F0",X"40",X"60",X"F0",X"F0",X"60",X"B0",X"F0",X"40",X"F0",X"F0",X"00",X"B0", + X"F0",X"60",X"F0",X"B0",X"80",X"80",X"70",X"70",X"00",X"80",X"00",X"00",X"00",X"00",X"80",X"F0", + X"00",X"60",X"B0",X"90",X"90",X"F0",X"F0",X"90",X"70",X"00",X"60",X"00",X"90",X"00",X"00",X"00", + X"C0",X"60",X"F0",X"00",X"B0",X"00",X"40",X"00",X"F0",X"90",X"B0",X"60",X"70",X"F0",X"F0",X"00", + X"00",X"88",X"88",X"9C",X"00",X"9C",X"88",X"9C",X"00",X"41",X"41",X"63",X"00",X"63",X"41",X"63", + X"FB",X"FC",X"FB",X"FC",X"F8",X"FB",X"FF",X"FF",X"FB",X"F3",X"FF",X"F3",X"F1",X"FD",X"FF",X"FF", + X"9C",X"88",X"88",X"00",X"9C",X"00",X"88",X"00",X"63",X"41",X"41",X"00",X"63",X"00",X"41",X"00", + X"FC",X"FC",X"FC",X"FC",X"FB",X"FB",X"FF",X"00",X"F3",X"F3",X"F3",X"F3",X"FD",X"FD",X"FF",X"00", + X"00",X"88",X"88",X"9C",X"00",X"9C",X"88",X"9C",X"00",X"41",X"41",X"63",X"00",X"63",X"41",X"63", + X"F9",X"FF",X"FB",X"FB",X"FA",X"FC",X"FB",X"FC",X"FB",X"FF",X"F5",X"FD",X"FD",X"F3",X"FB",X"F3", + X"9C",X"88",X"9C",X"00",X"9C",X"88",X"88",X"00",X"63",X"41",X"63",X"00",X"63",X"41",X"41",X"00", + X"FF",X"FF",X"FB",X"FB",X"FC",X"FC",X"FC",X"FC",X"FF",X"FF",X"FD",X"FD",X"F3",X"F3",X"F3",X"F3", + X"00",X"88",X"88",X"9C",X"00",X"9C",X"88",X"9C",X"00",X"41",X"41",X"63",X"00",X"63",X"41",X"63", + X"FF",X"FE",X"FE",X"FB",X"FE",X"FC",X"F8",X"FC",X"FF",X"FF",X"FB",X"FD",X"F7",X"F3",X"F1",X"F3", + X"9C",X"88",X"9C",X"00",X"9C",X"88",X"88",X"00",X"63",X"41",X"63",X"00",X"63",X"41",X"41",X"00", + X"FF",X"FF",X"FB",X"FB",X"FC",X"FC",X"FC",X"FC",X"FF",X"FF",X"FD",X"FD",X"F3",X"F3",X"F3",X"F3", + X"00",X"88",X"88",X"9C",X"00",X"9C",X"88",X"9C",X"00",X"41",X"41",X"63",X"00",X"63",X"41",X"63", + X"FC",X"FF",X"FB",X"FB",X"FB",X"FC",X"FC",X"FC",X"FB",X"FF",X"F5",X"FD",X"F5",X"F3",X"FB",X"F3", + X"9C",X"88",X"9C",X"00",X"9C",X"88",X"88",X"00",X"63",X"41",X"63",X"00",X"63",X"41",X"41",X"00", + X"FF",X"FF",X"FB",X"FB",X"FC",X"FC",X"FC",X"FC",X"FF",X"FF",X"FD",X"FD",X"F3",X"F3",X"F3",X"F3", + X"1D",X"1E",X"20",X"2C",X"52",X"54",X"54",X"13",X"1F",X"19",X"59",X"18",X"50",X"17",X"52",X"54", + X"20",X"63",X"69",X"15",X"61",X"54",X"68",X"1C",X"1B",X"1E",X"20",X"20",X"1F",X"13",X"19",X"B3", + X"B7",X"D8",X"7E",X"7B",X"20",X"57",X"9E",X"9E",X"D8",X"B3",X"B0",X"20",X"EA",X"97",X"20",X"7B", + X"B1",X"54",X"52",X"54",X"35",X"36",X"08",X"2C",X"13",X"52",X"50",X"17",X"37",X"31",X"71",X"30", + X"54",X"68",X"49",X"54",X"08",X"4B",X"69",X"15",X"34",X"31",X"37",X"13",X"33",X"36",X"08",X"4A", + X"90",X"10",X"09",X"01",X"50",X"41",X"00",X"10",X"01",X"10",X"07",X"C8",X"FE",X"BD",X"4E",X"4A", + X"90",X"34",X"09",X"01",X"50",X"41",X"00",X"34",X"01",X"00",X"03",X"C8",X"FE",X"BD",X"4E",X"4A", + X"90",X"50",X"09",X"19",X"50",X"41",X"18",X"50",X"01",X"00",X"00",X"C8",X"27",X"BD",X"4E",X"4A", + X"90",X"37",X"09",X"D9",X"50",X"41",X"D8",X"37",X"01",X"00",X"00",X"C8",X"27",X"BD",X"4E",X"4A", + X"90",X"50",X"09",X"11",X"50",X"41",X"10",X"50",X"01",X"00",X"00",X"C8",X"67",X"BD",X"4E",X"09", + X"24",X"34",X"41",X"37",X"34",X"01",X"25",X"00",X"4E",X"09",X"BD",X"68",X"FF",X"7B",X"C8",X"0A", + X"C3",X"50",X"6A",X"9E",X"34",X"17",X"80",X"03",X"4A",X"E4",X"34",X"B5",X"E3",X"63",X"09",X"C8", + X"45",X"34",X"4A",X"9E",X"7E",X"78",X"E4",X"24",X"B3",X"09",X"B3",X"68",X"6F",X"5F",X"6F",X"B5", + X"C8",X"8A",X"7E",X"78",X"45",X"34",X"4A",X"9E",X"48",X"B5",X"4F",X"45",X"09",X"C8",X"68",X"0A", + X"8B",X"48",X"78",X"6F",X"34",X"B3",X"9E",X"B3",X"6F",X"6F",X"6F",X"8D",X"B3",X"4A",X"B3",X"34", + X"78",X"05",X"5F",X"C6",X"B3",X"09",X"08",X"34",X"B3",X"01",X"FB",X"00",X"FE",X"4A",X"6E",X"50", + X"B5",X"92",X"4A",X"41",X"BB",X"13",X"09",X"93",X"13",X"4E",X"6C",X"BD",X"01",X"10",X"00",X"C8", + X"09",X"93",X"17",X"01",X"92",X"17",X"41",X"64",X"00",X"C8",X"05",X"90",X"4E",X"4A",X"BD",X"50", + X"09",X"9B",X"17",X"01",X"9A",X"17",X"41",X"64",X"00",X"C8",X"21",X"90",X"4E",X"4A",X"BD",X"50", + X"09",X"93",X"60",X"01",X"A3",X"13",X"41",X"62",X"00",X"4A",X"C8",X"13",X"BD",X"9C",X"AF",X"4A", + X"BD",X"13",X"4A",X"C0",X"13",X"09",X"DE",X"68",X"41",X"6C",X"34",X"BD",X"CB",X"00",X"01",X"C8", + X"09",X"DA",X"34",X"B5",X"E8",X"13",X"41",X"0E",X"40",X"41",X"02",X"10",X"09",X"03",X"10",X"01", + X"6C",X"BD",X"4E",X"4A",X"00",X"C8",X"10",X"90",X"50",X"41",X"02",X"14",X"09",X"03",X"14",X"01", + X"64",X"BD",X"4E",X"09",X"00",X"C8",X"21",X"0A",X"14",X"01",X"0B",X"00",X"41",X"64",X"14",X"4E", + X"41",X"90",X"C8",X"09",X"BD",X"50",X"4A",X"8D",X"60",X"01",X"27",X"00",X"41",X"06",X"10",X"BD", + X"C8",X"10",X"4A",X"E3",X"AF",X"6A",X"24",X"34",X"FE",X"09",X"08",X"60",X"00",X"AB",X"23",X"41", + X"24",X"00",X"01",X"C8",X"10",X"BD",X"21",X"4A",X"90",X"35",X"09",X"06",X"50",X"41",X"05",X"35", + X"01",X"00",X"00",X"C8",X"FF",X"BD",X"4E",X"09",X"12",X"35",X"0A",X"06",X"4C",X"0A",X"66",X"35", + X"09",X"25",X"35",X"09",X"65",X"35",X"0A",X"58",X"4C",X"0A",X"69",X"35",X"0A",X"09",X"35",X"09", + X"68",X"35",X"0A",X"87",X"35",X"09",X"28",X"4C",X"0A",X"6C",X"35",X"09",X"54",X"35",X"0A",X"53", + X"35",X"09",X"13",X"4C",X"0A",X"E9",X"35",X"0A",X"3F",X"35",X"0A",X"3E",X"35",X"09",X"57",X"35", + X"0A",X"1E",X"35",X"0A",X"76",X"4D",X"09",X"A2",X"35",X"09",X"5A",X"35",X"0A",X"A1",X"35",X"0A", + X"79",X"4D",X"09",X"8D",X"35",X"0A",X"E0",X"35",X"0A",X"8C",X"35",X"0A",X"A5",X"35",X"09",X"C4", + X"35",X"0A",X"D2",X"35",X"09",X"90",X"4E",X"0A",X"A8",X"35",X"09",X"AF",X"35",X"0A",X"EF",X"35", + X"09",X"F3",X"4E",X"0A",X"9F",X"35",X"0A",X"93",X"35",X"0A",X"F2",X"35",X"09",X"B2",X"35",X"06", + X"08",X"4E",X"10",X"0B",X"09",X"00",X"50",X"40",X"FB",X"03",X"00",X"09",X"6E",X"50",X"4A",X"C6", + X"34",X"E3",X"BE",X"FE",X"B3",X"34",X"6A",X"00",X"B2",X"E2",X"21",X"FE",X"69",X"34",X"6A",X"00", + X"92",X"C5",X"21",X"B3",X"69",X"34",X"09",X"8E",X"AF",X"09",X"01",X"34",X"4A",X"C6",X"50",X"B3", + X"86",X"4A",X"22",X"50",X"B5",X"90",X"46",X"B5",X"E8",X"B5",X"6E",X"45",X"48",X"37",X"01",X"09", + X"C5",X"92",X"B3",X"21",X"34",X"69",X"3E",X"B5",X"7C",X"B5",X"6E",X"45",X"40",X"37",X"07",X"09", + X"C5",X"92",X"B3",X"21",X"34",X"69",X"3E",X"6E",X"10",X"41",X"FD",X"14",X"B5",X"14",X"44",X"09", + X"B4",X"06",X"6E",X"B5",X"68",X"64",X"01",X"BB",X"45",X"09",X"31",X"68",X"41",X"B6",X"14",X"6E", + X"03",X"BB",X"64",X"41",X"06",X"45",X"B5",X"50",X"14",X"6E",X"B5",X"06",X"09",X"03",X"68",X"64", + X"B5",X"70",X"45",X"09",X"BB",X"14",X"41",X"B6",X"68",X"64",X"03",X"BB",X"6E",X"B5",X"06",X"45", + X"41",X"B7",X"14",X"6E",X"73",X"68",X"09",X"03",X"06",X"45",X"B5",X"94",X"64",X"41",X"BB",X"10", + X"09",X"01",X"61",X"44",X"C6",X"06",X"6E",X"B5",X"D5",X"10",X"41",X"AB",X"45",X"09",X"B1",X"61", + X"6E",X"B5",X"06",X"45",X"01",X"D5",X"44",X"41",X"A3",X"61",X"09",X"01",X"10",X"6E",X"EF",X"06", + X"60",X"41",X"D5",X"10",X"B5",X"C8",X"45",X"09",X"D7",X"06",X"6E",X"B5",X"61",X"46",X"01",X"D5", + X"45",X"09",X"52",X"61",X"41",X"BD",X"11",X"6E",X"01",X"D5",X"24",X"6A",X"06",X"45",X"B5",X"E3", + X"34",X"27",X"01",X"61",X"FE",X"41",X"08",X"11",X"09",X"01",X"61",X"27",X"F9",X"06",X"6E",X"B5", + X"D5",X"FE",X"60",X"08",X"45",X"02",X"08",X"27",X"41",X"20",X"11",X"6E",X"61",X"62",X"09",X"01", + X"06",X"45",X"B5",X"25",X"27",X"60",X"D5",X"41",X"61",X"62",X"09",X"01",X"11",X"6E",X"47",X"06", + X"27",X"41",X"D5",X"10",X"B5",X"E4",X"45",X"09",X"0E",X"06",X"6E",X"B5",X"62",X"61",X"01",X"D5", + X"45",X"FE",X"8D",X"08",X"6A",X"00",X"34",X"27",X"41",X"6F",X"11",X"6E",X"7C",X"62",X"09",X"01", + X"06",X"45",X"B5",X"4B",X"06",X"60",X"D5",X"FE",X"01",X"7C",X"27",X"09",X"08",X"11",X"41",X"15", + X"62",X"06",X"01",X"D5",X"6E",X"B5",X"06",X"45",X"60",X"08",X"FE",X"41",X"08",X"27",X"02",X"7C", + X"11",X"6E",X"33",X"06",X"09",X"01",X"62",X"06",X"B5",X"25",X"45",X"7C",X"D5",X"41",X"60",X"11", + X"09",X"01",X"62",X"06",X"51",X"06",X"6E",X"B5",X"D5",X"B5",X"6E",X"45",X"45",X"37",X"04",X"09", + X"C5",X"08",X"B3",X"B5",X"34",X"53",X"3E",X"BC",X"4A",X"34",X"4A",X"01",X"AF",X"4A",X"FF",X"35", + X"4A",X"00",X"35",X"4A",X"03",X"35",X"4A",X"02",X"35",X"B5",X"04",X"4A",X"4A",X"BE",X"35",X"B5", + X"FA",X"4A",X"B5",X"EC",X"26",X"B5",X"FB",X"63",X"AF",X"4A",X"08",X"35",X"4A",X"6B",X"35",X"4A", + X"56",X"35",X"4A",X"A4",X"35",X"4A",X"59",X"35",X"4A",X"92",X"35",X"B5",X"8F",X"35",X"4A",X"45", + X"46",X"09",X"90",X"34",X"4A",X"C5",X"50",X"B3",X"3E",X"C6",X"26",X"B3",X"08",X"34",X"09",X"36", + X"08",X"B3",X"60",X"93",X"02",X"A6",X"B6",X"89",X"07",X"09",X"22",X"34",X"B5",X"C5",X"46",X"B3", + X"9E",X"C6",X"AE",X"B3",X"B3",X"34",X"09",X"A6",X"B3",X"09",X"B3",X"34",X"C6",X"C7",X"E6",X"B3", + X"C6",X"B3",X"C6",X"09",X"09",X"96",X"34",X"24",X"34",X"01",X"25",X"00",X"41",X"37",X"34",X"4E", + X"FF",X"FF",X"C8",X"01",X"BD",X"4A",X"6E",X"50",X"09",X"56",X"34",X"27",X"C7",X"08",X"B3",X"6A", + X"FD",X"FD",X"6C",X"FE",X"34",X"34",X"4A",X"44",X"08",X"B3",X"B3",X"00",X"04",X"F6",X"D6",X"4A", + X"90",X"B5",X"6E",X"44",X"50",X"FD",X"10",X"6E",X"03",X"6A",X"25",X"34",X"B5",X"E3",X"45",X"FE", + X"00",X"6A",X"44",X"34",X"B2",X"E2",X"22",X"FE",X"02",X"58",X"34",X"09",X"48",X"11",X"41",X"CC", + X"60",X"23",X"01",X"D5",X"6E",X"B5",X"06",X"45",X"6A",X"3F",X"50",X"5C",X"10",X"08",X"B3",X"6A", + X"E3",X"28",X"FE",X"6A",X"34",X"45",X"00",X"E2",X"34",X"1E",X"02",X"02",X"FE",X"D6",X"68",X"4A", + X"E2",X"34",X"6A",X"01",X"34",X"D6",X"E5",X"0F",X"4A",X"C6",X"34",X"B3",X"E5",X"34",X"09",X"9E", + X"6A",X"8E",X"34",X"B5",X"8A",X"34",X"4A",X"43",X"00",X"FE",X"E3",X"B2",X"6A",X"00",X"34",X"3F", + X"22",X"93",X"65",X"22",X"B5",X"3F",X"45",X"FE",X"04",X"26",X"29",X"09",X"48",X"11",X"41",X"EF", + X"60",X"41",X"01",X"D5",X"6E",X"B5",X"06",X"45",X"41",X"D0",X"12",X"6E",X"40",X"60",X"09",X"01", + X"06",X"45",X"B5",X"5A",X"02",X"41",X"D5",X"11",X"09",X"01",X"60",X"23",X"CC",X"06",X"6E",X"B5", + X"D5",X"41",X"60",X"10",X"45",X"C0",X"C4",X"09",X"D2",X"06",X"6E",X"B5",X"60",X"61",X"01",X"D5", + X"45",X"10",X"85",X"B3",X"60",X"50",X"6A",X"5F",X"08",X"34",X"6A",X"00",X"4B",X"FE",X"E3",X"28", + X"45",X"FE",X"E2",X"68",X"6A",X"04",X"34",X"0D",X"D6",X"34",X"4A",X"E5",X"04",X"6A",X"E2",X"34", + X"D6",X"E5",X"0F",X"09",X"02",X"34",X"4A",X"C6",X"34",X"8A",X"8E",X"4A",X"B3",X"34",X"6A",X"8E", + X"34",X"B5",X"8F",X"00",X"4A",X"43",X"34",X"B5",X"0C",X"21",X"93",X"90",X"00",X"4A",X"F1",X"50", + X"09",X"5E",X"34",X"03",X"C5",X"08",X"B3",X"93",X"A8",X"93",X"B3",X"21",X"21",X"7F",X"CE",X"AF", + X"09",X"A9",X"34",X"01",X"A8",X"34",X"41",X"05",X"00",X"4A",X"BD",X"34",X"5F",X"C9",X"C8",X"4A", + X"CA",X"09",X"6E",X"13",X"34",X"9C",X"10",X"41",X"9D",X"00",X"01",X"BD",X"13",X"5F",X"05",X"C8", + X"09",X"DF",X"13",X"01",X"DE",X"13",X"41",X"05",X"00",X"AF",X"BD",X"9C",X"5F",X"4A",X"C8",X"13", + X"4A",X"4A",X"13",X"34",X"DE",X"FF",X"AF",X"4A",X"01",X"35",X"4A",X"00",X"35",X"4A",X"03",X"35", + X"4A",X"04",X"35",X"B5",X"02",X"35",X"4A",X"BD",X"4A",X"09",X"FA",X"34",X"B5",X"C7",X"4A",X"B3", + X"B6",X"B3",X"C6",X"28",X"09",X"1E",X"34",X"02",X"60",X"4A",X"6E",X"50",X"62",X"03",X"00",X"B5", + X"14",X"11",X"41",X"BB",X"45",X"09",X"50",X"60",X"6E",X"B5",X"06",X"45",X"01",X"D5",X"25",X"6E", + X"03",X"09",X"37",X"34",X"B5",X"C6",X"45",X"B3",X"BE",X"6D",X"8E",X"8E",X"6A",X"4A",X"34",X"34", + X"6E",X"10",X"09",X"47",X"10",X"41",X"46",X"10",X"01",X"BD",X"00",X"B5",X"20",X"C8",X"5F",X"43", + X"00",X"4A",X"FF",X"35",X"6A",X"03",X"34",X"6A",X"00",X"35",X"4A",X"69",X"35",X"B5",X"04",X"4B", + X"93",X"C6",X"23",X"B3",X"E3",X"34",X"09",X"1E",X"08",X"28",X"B3",X"6A",X"B2",X"AC",X"3E",X"C6", + X"34",X"13",X"7F",X"14",X"B3",X"B5",X"08",X"45",X"41",X"F8",X"11",X"6E",X"50",X"60",X"09",X"01", + X"06",X"45",X"B5",X"03",X"25",X"6E",X"D5",X"B5",X"37",X"34",X"09",X"AE",X"45",X"B3",X"C6",X"6A", + X"8F",X"8F",X"6D",X"6E",X"34",X"34",X"4A",X"10",X"09",X"03",X"10",X"01",X"02",X"10",X"41",X"20", + X"00",X"B5",X"BD",X"00",X"5F",X"0C",X"C8",X"6A",X"01",X"35",X"4A",X"02",X"35",X"6A",X"03",X"35", + X"4A",X"6B",X"35",X"60",X"04",X"4B",X"B5",X"4B",X"6E",X"50",X"4A",X"CE",X"01",X"60",X"03",X"B5", + X"14",X"34",X"09",X"1E",X"45",X"B3",X"C6",X"92",X"B9",X"11",X"41",X"05",X"22",X"09",X"40",X"61", + X"6E",X"B5",X"06",X"45",X"01",X"D5",X"41",X"09",X"08",X"6E",X"B3",X"B5",X"35",X"01",X"96",X"37", + X"45",X"B3",X"C6",X"28",X"09",X"3E",X"34",X"8F",X"93",X"FA",X"22",X"09",X"B9",X"26",X"B5",X"C7", + X"34",X"43",X"36",X"A6",X"B3",X"B3",X"28",X"09",X"92",X"4A",X"B3",X"50",X"35",X"90",X"96",X"6A", + X"92",X"08",X"FE",X"60",X"35",X"DE",X"00",X"05",X"6E",X"45",X"B5",X"8F",X"02",X"09",X"37",X"35", + X"B3",X"35",X"09",X"96",X"96",X"B3",X"59",X"B5",X"EC",X"AE",X"BD",X"7B",X"63",X"34",X"73",X"CA", + X"28",X"00",X"09",X"AE",X"21",X"0A",X"00",X"34",X"B5",X"90",X"27",X"B5",X"1E",X"50",X"4A",X"45", + X"46",X"B3",X"C6",X"28",X"09",X"36",X"34",X"F7",X"B3",X"46",X"B5",X"C6",X"A6",X"09",X"22",X"34", + X"B3",X"B5",X"08",X"4B",X"56",X"6F",X"27",X"B5",X"22",X"34",X"09",X"76",X"46",X"B3",X"C6",X"08", + X"21",X"C6",X"1F",X"6E",X"60",X"B5",X"B3",X"4B",X"60",X"09",X"B3",X"34",X"BA",X"C7",X"E6",X"B3", + X"B6",X"B3",X"C6",X"08",X"09",X"3E",X"34",X"29",X"6A",X"FE",X"35",X"08",X"01",X"24",X"6C",X"02", + X"6E",X"35",X"4A",X"03",X"23",X"4A",X"01",X"35",X"6A",X"FE",X"35",X"08",X"02",X"61",X"6C",X"02", + X"6E",X"35",X"4A",X"04",X"60",X"4A",X"02",X"35",X"B5",X"6D",X"4B",X"93",X"10",X"4B",X"B5",X"E3", + X"23",X"6C",X"FF",X"24",X"6A",X"FE",X"34",X"08",X"02",X"FF",X"23",X"4A",X"6E",X"34",X"4A",X"03", + X"35",X"6C",X"00",X"61",X"6A",X"FE",X"35",X"08",X"02",X"00",X"60",X"4A",X"6E",X"35",X"4A",X"04", + X"35",X"B5",X"10",X"4B",X"B5",X"6C",X"4B",X"93",X"E3",X"34",X"6A",X"00",X"23",X"FE",X"C8",X"08", + X"2E",X"B3",X"C6",X"08",X"09",X"3E",X"34",X"2F",X"6A",X"00",X"34",X"36",X"8F",X"08",X"FE",X"B5", + X"14",X"11",X"41",X"46",X"45",X"09",X"C0",X"61",X"6E",X"B5",X"06",X"45",X"01",X"D5",X"21",X"6E", + X"02",X"B5",X"37",X"41",X"B5",X"BE",X"45",X"09",X"C5",X"93",X"B3",X"07",X"34",X"79",X"DE",X"D6", + X"01",X"93",X"C8",X"23",X"4A",X"3F",X"34",X"6A",X"8E",X"08",X"FE",X"09",X"34",X"0D",X"00",X"C6", + X"34",X"B2",X"1E",X"14",X"B3",X"B5",X"08",X"45",X"41",X"67",X"10",X"6E",X"D8",X"61",X"09",X"01", + X"06",X"45",X"B5",X"03",X"44",X"6E",X"D5",X"B5",X"37",X"23",X"93",X"6A",X"45",X"B5",X"66",X"4B", + X"93",X"68",X"23",X"93",X"43",X"4B",X"B5",X"43",X"23",X"BB",X"C1",X"09",X"2A",X"F5",X"34",X"00", + X"00",X"7E",X"61",X"F5",X"F5",X"01",X"F5",X"86",X"02",X"F5",X"9E",X"02",X"17",X"5F",X"27",X"B3", + X"68",X"68",X"68",X"68",X"B3",X"B3",X"B3",X"F5",X"7E",X"25",X"09",X"0F",X"00",X"B3",X"07",X"B5", + X"C8",X"56",X"76",X"B9",X"45",X"BB",X"0B",X"43",X"25",X"25",X"25",X"25",X"43",X"64",X"44",X"0C", + X"25",X"F5",X"25",X"04",X"2C",X"7E",X"B1",X"C0",X"F5",X"F5",X"04",X"04",X"5F",X"7E",X"B1",X"80", + X"F5",X"F5",X"04",X"03",X"5F",X"7E",X"B1",X"80",X"F5",X"F5",X"03",X"03",X"5F",X"7E",X"B1",X"C0", + X"F5",X"2A",X"03",X"34",X"5F",X"76",X"B1",X"BB",X"F5",X"F5",X"00",X"BB",X"09",X"61",X"00",X"01", + X"00",X"BD",X"4F",X"9D",X"34",X"12",X"6F",X"F5",X"7E",X"25",X"09",X"0F",X"00",X"B3",X"57",X"B5", + X"C8",X"56",X"76",X"B9",X"45",X"BB",X"0B",X"0F",X"26",X"25",X"25",X"26",X"1B",X"4E",X"8E",X"10", + X"26",X"7E",X"26",X"4A",X"53",X"03",X"F5",X"74",X"34",X"4A",X"7E",X"34",X"F5",X"75",X"04",X"B5", + X"ED",X"06",X"F5",X"6A",X"26",X"42",X"7E",X"22",X"34",X"47",X"00",X"23",X"FE",X"6A",X"08",X"34", + X"FE",X"91",X"08",X"24",X"00",X"09",X"47",X"34",X"21",X"01",X"D1",X"00",X"9D",X"05",X"43",X"4E", + X"FF",X"F5",X"C8",X"06",X"BD",X"7E",X"B1",X"43",X"42",X"7E",X"B9",X"09",X"60",X"06",X"F5",X"08", + X"00",X"60",X"BB",X"B5",X"61",X"F6",X"42",X"9D",X"26",X"C0",X"7E",X"74",X"F5",X"4A",X"03",X"34", + X"F5",X"75",X"04",X"B5",X"7E",X"34",X"4A",X"ED",X"26",X"FE",X"22",X"28",X"6A",X"00",X"34",X"4A", + X"6A",X"0F",X"34",X"16",X"22",X"F5",X"B3",X"05",X"80",X"09",X"91",X"34",X"6D",X"24",X"FD",X"FD", + X"21",X"FD",X"5B",X"01",X"FD",X"5A",X"00",X"FD",X"5F",X"FD",X"6C",X"03",X"02",X"5B",X"43",X"FD", + X"5A",X"05",X"FD",X"74",X"04",X"6A",X"5F",X"34",X"F5",X"75",X"03",X"F5",X"5F",X"34",X"6A",X"5F", + X"04",X"34",X"6A",X"00",X"B1",X"FE",X"23",X"B2",X"74",X"34",X"6A",X"0F",X"26",X"B3",X"23",X"96", + X"27",X"80",X"16",X"FD",X"F5",X"91",X"05",X"09",X"24",X"FD",X"FD",X"00",X"34",X"5B",X"21",X"FD", + X"5A",X"02",X"FD",X"09",X"01",X"6C",X"5F",X"08",X"00",X"5B",X"BB",X"FD",X"61",X"03",X"FD",X"5A", + X"04",X"93",X"5F",X"25",X"FD",X"9D",X"05",X"F5",X"7E",X"34",X"4A",X"7E",X"03",X"F5",X"74",X"04", + X"4A",X"CE",X"34",X"B5",X"75",X"25",X"93",X"9D",X"26",X"80",X"7E",X"AD",X"F5",X"93",X"03",X"25", + X"B5",X"7E",X"26",X"C0",X"9D",X"04",X"F5",X"4A",X"75",X"03",X"F5",X"74",X"34",X"4A",X"7E",X"34", + X"93",X"9D",X"25",X"F5",X"CE",X"26",X"B5",X"7E",X"04",X"F5",X"60",X"05",X"80",X"7E",X"BB",X"91", + X"FD",X"FD",X"24",X"FD",X"09",X"21",X"34",X"5B",X"00",X"FD",X"5A",X"02",X"FD",X"5F",X"01",X"6A", + X"74",X"03",X"F5",X"75",X"34",X"6A",X"5F",X"34",X"F5",X"7E",X"04",X"09",X"5F",X"00",X"F5",X"C0", + X"26",X"C8",X"0F",X"D5",X"B3",X"45",X"B5",X"76",X"0B",X"F5",X"BB",X"06",X"56",X"7E",X"D1",X"B9", + X"E4",X"E5",X"E4",X"A8",X"26",X"26",X"26",X"26",X"AB",X"B1",X"CA",X"FD",X"26",X"43",X"26",X"5B", + X"03",X"FD",X"5A",X"05",X"FD",X"5F",X"04",X"B1",X"63",X"08",X"DB",X"61",X"60",X"00",X"09",X"BB", + X"60",X"08",X"BB",X"4F",X"BC",X"00",X"41",X"6F",X"BD",X"99",X"BB",X"74",X"52",X"6A",X"60",X"34", + X"9E",X"34",X"4A",X"75",X"07",X"6A",X"22",X"34",X"9E",X"34",X"4A",X"74",X"07",X"6A",X"23",X"34", + X"B3",X"B3",X"B3",X"57",X"6F",X"6F",X"6F",X"6A",X"75",X"B3",X"B3",X"B3",X"34",X"6F",X"6F",X"6F", + X"77",X"B1",X"F7",X"7E",X"B5",X"F5",X"44",X"01",X"F5",X"9E",X"02",X"F5",X"86",X"27",X"17",X"5F", + X"02",X"68",X"68",X"68",X"B3",X"B3",X"B3",X"B3",X"68",X"35",X"6A",X"20",X"B1",X"09",X"03",X"27", + X"B3",X"B5",X"B3",X"45",X"0F",X"C8",X"0F",X"B9",X"B5",X"B5",X"0F",X"0F",X"42",X"34",X"B1",X"B1", + X"B5",X"B5",X"0F",X"0F",X"86",X"90",X"B1",X"B1",X"B5",X"B5",X"0F",X"28",X"FA",X"4C",X"B1",X"B1", + X"B5",X"B5",X"28",X"28",X"3E",X"A8",X"B1",X"B1",X"B5",X"B5",X"28",X"29",X"9A",X"64",X"B1",X"B1", + X"B5",X"B5",X"29",X"29",X"56",X"C0",X"B1",X"B1",X"B5",X"B5",X"29",X"29",X"B2",X"B3",X"B1",X"B1", + X"B5",X"B5",X"29",X"29",X"B4",X"B5",X"B1",X"B1",X"D5",X"26",X"6F",X"46",X"4F",X"01",X"09",X"00", + X"BD",X"6F",X"7D",X"40",X"52",X"09",X"4F",X"01",X"D1",X"BD",X"46",X"55",X"72",X"52",X"00",X"77", + X"B1",X"3F",X"BE",X"09",X"7D",X"B1",X"03",X"C6",X"34",X"B3",X"16",X"28",X"B3",X"3E",X"B0",X"13", + X"09",X"86",X"34",X"5F",X"A8",X"0F",X"7B",X"0B",X"7A",X"0B",X"0F",X"00",X"A6",X"6E",X"5F",X"A6", + X"0F",X"60",X"68",X"09",X"5F",X"4A",X"02",X"C6",X"34",X"43",X"3E",X"DE",X"B3",X"09",X"28",X"13", + X"41",X"05",X"13",X"4E",X"DF",X"00",X"01",X"10",X"BD",X"DE",X"AF",X"60",X"C8",X"13",X"4A",X"60", + X"09",X"9D",X"13",X"01",X"9C",X"13",X"41",X"05",X"00",X"C8",X"10",X"4A",X"4E",X"AF",X"BD",X"9C", + X"13",X"AB",X"05",X"60",X"60",X"34",X"09",X"EB",X"09",X"3E",X"34",X"74",X"C6",X"28",X"B3",X"09", + X"AA",X"13",X"41",X"C9",X"34",X"6A",X"FB",X"34",X"DD",X"0B",X"0E",X"0B",X"B5",X"0B",X"40",X"BB", + X"2A",X"FE",X"34",X"D0",X"8B",X"04",X"D9",X"B3",X"0F",X"6C",X"0F",X"C8",X"B3",X"B5",X"6C",X"45", + X"B5",X"6A",X"41",X"34",X"AA",X"C8",X"D0",X"6C",X"4A",X"08",X"34",X"B3",X"C8",X"35",X"09",X"96", + X"09",X"3E",X"34",X"42",X"C6",X"28",X"B3",X"6A",X"C9",X"C9",X"6C",X"6A",X"34",X"34",X"4A",X"8E"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..4bfa195f --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"03", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"05",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"07", + X"00",X"00",X"00",X"00",X"00",X"0B",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"0E",X"00",X"01",X"0C",X"0F", + X"00",X"0E",X"00",X"0B",X"00",X"0C",X"0B",X"0E",X"00",X"0C",X"0F",X"01",X"00",X"00",X"00",X"00", + X"00",X"01",X"02",X"0F",X"00",X"07",X"0C",X"02",X"00",X"09",X"06",X"0F",X"00",X"0D",X"0C",X"0F", + X"00",X"05",X"03",X"09",X"00",X"0F",X"0B",X"00",X"00",X"0E",X"00",X"0B",X"00",X"0E",X"00",X"0B", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0E",X"01",X"00",X"0F",X"0B",X"0E",X"00",X"0E",X"00",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..88b2ecb3 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"66",X"EF",X"00",X"F8",X"EA",X"6F",X"00",X"3F",X"00",X"C9",X"38",X"AA",X"AF",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..e0dd3c1e --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"DB",X"AF",X"06",X"20",X"09",X"00",X"50",X"5F",X"0B",X"10",X"FC",X"ED",X"56",X"19",X"D9",X"67", + X"C3",X"C7",X"02",X"3A",X"8E",X"64",X"FE",X"00",X"E0",X"47",X"3E",X"30",X"09",X"35",X"40",X"5F", + X"2B",X"10",X"FC",X"E1",X"3A",X"8F",X"64",X"FE",X"00",X"E0",X"47",X"3E",X"30",X"09",X"02",X"40", + X"5F",X"0B",X"10",X"FC",X"E1",X"40",X"00",X"00",X"20",X"F1",X"F5",X"CD",X"FD",X"CD",X"AF",X"1A", + X"00",X"50",X"2A",X"24",X"64",X"3A",X"26",X"64",X"5F",X"2A",X"27",X"64",X"3A",X"11",X"64",X"5F", + X"2A",X"14",X"64",X"3A",X"16",X"64",X"5F",X"2A",X"17",X"64",X"3A",X"31",X"64",X"5F",X"2A",X"34", + X"64",X"3A",X"36",X"64",X"5F",X"2A",X"37",X"64",X"3A",X"09",X"64",X"5F",X"2A",X"0C",X"64",X"3A", + X"0E",X"64",X"5F",X"2A",X"0F",X"64",X"3A",X"29",X"64",X"5F",X"2A",X"2C",X"64",X"3A",X"2E",X"64", + X"5F",X"2A",X"2F",X"64",X"3A",X"19",X"64",X"5F",X"2A",X"1C",X"64",X"3A",X"1E",X"64",X"5F",X"2A", + X"1F",X"64",X"3A",X"39",X"64",X"5F",X"2A",X"3C",X"64",X"3A",X"3E",X"64",X"5F",X"2A",X"3F",X"64", + X"3A",X"41",X"64",X"5F",X"2A",X"44",X"64",X"3A",X"46",X"64",X"5F",X"2A",X"47",X"64",X"3A",X"61", + X"64",X"5F",X"2A",X"64",X"64",X"3A",X"66",X"64",X"5F",X"2A",X"67",X"64",X"3A",X"51",X"64",X"5F", + X"2A",X"54",X"64",X"3A",X"56",X"64",X"5F",X"2A",X"57",X"64",X"3A",X"71",X"64",X"5F",X"09",X"96", + X"64",X"E3",X"7E",X"28",X"19",X"E3",X"6E",X"08",X"2D",X"06",X"06",X"09",X"4C",X"64",X"11",X"4A", + X"50",X"3E",X"06",X"26",X"02",X"ED",X"88",X"ED",X"88",X"E5",X"98",X"15",X"10",X"DB",X"06",X"06", + X"09",X"4E",X"64",X"11",X"DA",X"67",X"3E",X"06",X"26",X"02",X"ED",X"88",X"ED",X"88",X"E5",X"98", + X"15",X"10",X"DB",X"C3",X"7E",X"01",X"ED",X"73",X"4C",X"64",X"E5",X"60",X"27",X"ED",X"53",X"4A", + X"50",X"ED",X"73",X"6C",X"64",X"E5",X"60",X"27",X"ED",X"53",X"4C",X"50",X"ED",X"73",X"5C",X"64", + X"E5",X"60",X"27",X"ED",X"53",X"4E",X"50",X"ED",X"73",X"7C",X"64",X"E5",X"60",X"27",X"ED",X"53", + X"68",X"50",X"ED",X"73",X"84",X"64",X"E5",X"60",X"27",X"ED",X"53",X"6A",X"50",X"ED",X"73",X"A4", + X"64",X"E5",X"60",X"27",X"ED",X"53",X"6C",X"50",X"2A",X"4E",X"64",X"E5",X"49",X"27",X"0A",X"DA", + X"67",X"2A",X"6E",X"64",X"E5",X"49",X"27",X"0A",X"DC",X"67",X"2A",X"5E",X"64",X"E5",X"49",X"27", + X"0A",X"DE",X"67",X"2A",X"7E",X"64",X"E5",X"49",X"27",X"0A",X"F8",X"67",X"2A",X"86",X"64",X"E5", + X"49",X"27",X"0A",X"FA",X"67",X"2A",X"A6",X"64",X"E5",X"49",X"27",X"0A",X"FC",X"67",X"2A",X"93", + X"64",X"0B",X"0A",X"93",X"64",X"7E",X"FE",X"FF",X"08",X"06",X"09",X"8D",X"39",X"0A",X"93",X"64", + X"09",X"95",X"64",X"E3",X"46",X"08",X"56",X"3A",X"00",X"50",X"E3",X"6F",X"E2",X"2A",X"02",X"E3", + X"A6",X"E3",X"56",X"08",X"3D",X"3A",X"00",X"50",X"E3",X"7F",X"E2",X"38",X"02",X"3A",X"B0",X"64", + X"FE",X"06",X"28",X"07",X"3C",X"1A",X"B0",X"64",X"C3",X"3D",X"02",X"AF",X"1A",X"B0",X"64",X"E3", + X"76",X"08",X"22",X"3A",X"B1",X"64",X"FE",X"00",X"08",X"23",X"C3",X"3D",X"02",X"AF",X"1A",X"07", + X"50",X"E3",X"B6",X"30",X"68",X"3D",X"1A",X"B1",X"64",X"3E",X"01",X"1A",X"07",X"50",X"E3",X"F6", + X"30",X"73",X"3A",X"00",X"50",X"E3",X"7F",X"28",X"C4",X"E3",X"96",X"30",X"10",X"3A",X"00",X"50", + X"E3",X"6F",X"28",X"AD",X"E3",X"86",X"3A",X"B1",X"64",X"3C",X"1A",X"B1",X"64",X"3A",X"B2",X"64", + X"FE",X"14",X"18",X"32",X"47",X"3A",X"B4",X"64",X"80",X"1A",X"B2",X"64",X"E3",X"3F",X"06",X"00", + X"80",X"0F",X"1A",X"B5",X"64",X"E5",X"35",X"15",X"E3",X"4E",X"08",X"02",X"E3",X"EE",X"3A",X"05", + X"65",X"E3",X"C7",X"1A",X"05",X"65",X"E3",X"DE",X"30",X"83",X"E3",X"66",X"08",X"05",X"E3",X"E6", + X"C3",X"89",X"01",X"E3",X"C6",X"C3",X"B7",X"01",X"E3",X"D6",X"C3",X"AD",X"01",X"00",X"09",X"96", + X"64",X"E3",X"46",X"28",X"16",X"E5",X"3F",X"16",X"09",X"96",X"64",X"E3",X"7E",X"28",X"04",X"E3", + X"6E",X"28",X"05",X"E5",X"37",X"16",X"30",X"03",X"E5",X"2F",X"16",X"3A",X"B7",X"64",X"3C",X"1A", + X"B7",X"64",X"3A",X"B6",X"64",X"3C",X"1A",X"B6",X"64",X"FE",X"3C",X"08",X"23",X"AF",X"1A",X"B6", + X"64",X"3A",X"88",X"64",X"3C",X"1A",X"88",X"64",X"09",X"95",X"64",X"E3",X"BE",X"3A",X"00",X"50", + X"E3",X"5F",X"08",X"1D",X"AF",X"1A",X"01",X"50",X"09",X"4A",X"50",X"06",X"24",X"1E",X"00",X"0B", + X"10",X"FB",X"3E",X"40",X"E5",X"FD",X"14",X"3E",X"21",X"E5",X"25",X"15",X"11",X"D0",X"41",X"09", + X"92",X"31",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"06",X"FF",X"09",X"FF",X"FF",X"2B",X"7D", + X"BC",X"1A",X"C0",X"50",X"08",X"F8",X"10",X"DB",X"5E",X"FB",X"3E",X"01",X"1A",X"00",X"50",X"FD", + X"C9",X"F5",X"C9",X"F1",X"20",X"ED",X"65",X"3A",X"00",X"50",X"E3",X"4F",X"C2",X"A7",X"05",X"AF", + X"06",X"20",X"09",X"00",X"50",X"5F",X"0B",X"10",X"FC",X"3E",X"00",X"1A",X"03",X"50",X"19",X"D9", + X"67",X"E5",X"22",X"16",X"DB",X"20",X"AF",X"20",X"09",X"00",X"40",X"E5",X"16",X"05",X"20",X"E3", + X"47",X"28",X"02",X"E3",X"D7",X"E3",X"67",X"28",X"02",X"E3",X"F7",X"20",X"09",X"00",X"44",X"E5", + X"16",X"05",X"20",X"E3",X"47",X"28",X"02",X"E3",X"CF",X"E3",X"67",X"28",X"02",X"E3",X"EF",X"20", + X"19",X"FD",X"43",X"09",X"00",X"64",X"E5",X"16",X"05",X"20",X"E3",X"47",X"28",X"02",X"E3",X"DF", + X"E3",X"67",X"28",X"02",X"E3",X"FF",X"20",X"3E",X"01",X"E5",X"25",X"15",X"09",X"00",X"40",X"11", + X"01",X"40",X"01",X"FE",X"03",X"1E",X"40",X"ED",X"98",X"11",X"4E",X"41",X"09",X"57",X"32",X"3E", + X"01",X"06",X"23",X"E5",X"D5",X"15",X"11",X"A2",X"40",X"09",X"4A",X"32",X"3E",X"01",X"06",X"30", + X"E5",X"D5",X"15",X"11",X"EC",X"40",X"09",X"7A",X"32",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15", + X"11",X"ED",X"40",X"09",X"A6",X"32",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"EE",X"40", + X"09",X"8A",X"32",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"EF",X"40",X"09",X"9E",X"32", + X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"93",X"40",X"09",X"46",X"33",X"3E",X"01",X"06", + X"30",X"E5",X"D5",X"15",X"11",X"DD",X"40",X"09",X"E2",X"32",X"3E",X"01",X"06",X"14",X"E5",X"D5", + X"15",X"11",X"DE",X"40",X"09",X"F6",X"32",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"DF", + X"40",X"09",X"DA",X"32",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"F8",X"40",X"09",X"06", + X"33",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"F9",X"40",X"09",X"32",X"33",X"3E",X"01", + X"06",X"14",X"E5",X"D5",X"15",X"11",X"FA",X"40",X"09",X"2E",X"33",X"3E",X"01",X"06",X"14",X"E5", + X"D5",X"15",X"20",X"1A",X"FE",X"64",X"20",X"3A",X"FE",X"64",X"E3",X"57",X"28",X"25",X"11",X"DD", + X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"E3",X"77", + X"28",X"25",X"11",X"DE",X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A", + X"FE",X"64",X"E3",X"4F",X"28",X"25",X"11",X"DF",X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04", + X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"E3",X"6F",X"28",X"25",X"11",X"F8",X"40",X"09",X"42",X"33", + X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"E3",X"5F",X"28",X"25",X"11",X"F9", + X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"E3",X"7F", + X"28",X"25",X"11",X"FA",X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"36", + X"00",X"09",X"00",X"00",X"E5",X"FD",X"04",X"18",X"02",X"E3",X"C3",X"09",X"00",X"10",X"E5",X"FD", + X"04",X"18",X"02",X"E3",X"E3",X"09",X"00",X"08",X"E5",X"FD",X"04",X"18",X"02",X"E3",X"D3",X"09", + X"00",X"18",X"E5",X"FD",X"04",X"18",X"02",X"E3",X"F3",X"3A",X"FE",X"64",X"FE",X"00",X"28",X"02", + X"3E",X"80",X"9B",X"1A",X"FE",X"64",X"E3",X"47",X"28",X"25",X"11",X"EC",X"40",X"09",X"42",X"33", + X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"E3",X"67",X"28",X"25",X"11",X"ED", + X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"E3",X"57", + X"28",X"25",X"11",X"EE",X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A", + X"FE",X"64",X"E3",X"77",X"28",X"25",X"11",X"EF",X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04", + X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"FE",X"00",X"08",X"26",X"FB",X"3E",X"01",X"1A",X"00",X"50", + X"3E",X"02",X"E5",X"67",X"15",X"C3",X"F1",X"02",X"1A",X"C0",X"50",X"30",X"FB",X"01",X"00",X"10", + X"AF",X"1A",X"C0",X"50",X"86",X"0B",X"57",X"23",X"79",X"98",X"7A",X"08",X"DF",X"FE",X"FF",X"28", + X"02",X"1F",X"E1",X"1F",X"3F",X"E1",X"20",X"CE",X"FC",X"20",X"CD",X"3E",X"11",X"E5",X"1D",X"05", + X"C9",X"CD",X"3E",X"0A",X"E5",X"1D",X"05",X"C9",X"CD",X"3E",X"44",X"E5",X"1D",X"05",X"C9",X"3E", + X"A0",X"E5",X"1D",X"05",X"E1",X"1A",X"C0",X"50",X"CD",X"CD",X"D1",X"13",X"01",X"FF",X"03",X"5F", + X"ED",X"98",X"C9",X"01",X"00",X"04",X"BE",X"C4",X"53",X"05",X"0B",X"77",X"23",X"79",X"98",X"7B", + X"08",X"DC",X"E1",X"77",X"7E",X"CE",X"27",X"57",X"7B",X"CE",X"27",X"BA",X"28",X"04",X"20",X"E3", + X"E7",X"20",X"7E",X"CE",X"D8",X"57",X"7B",X"CE",X"D8",X"BA",X"E0",X"20",X"E3",X"C7",X"20",X"7B", + X"E1",X"65",X"52",X"08",X"54",X"66",X"54",X"2C",X"43",X"67",X"50",X"71",X"52",X"61",X"47",X"60", + X"54",X"08",X"19",X"39",X"38",X"1B",X"54",X"45",X"64",X"63",X"67",X"08",X"61",X"66",X"43",X"1A", + X"C0",X"50",X"09",X"00",X"40",X"11",X"01",X"40",X"01",X"FE",X"07",X"1E",X"40",X"ED",X"98",X"1A", + X"C0",X"50",X"09",X"00",X"64",X"11",X"01",X"64",X"01",X"FE",X"03",X"1E",X"00",X"ED",X"98",X"1A", + X"C0",X"50",X"09",X"48",X"50",X"11",X"49",X"50",X"01",X"27",X"00",X"1E",X"00",X"ED",X"98",X"1A", + X"C0",X"50",X"09",X"D8",X"67",X"11",X"D9",X"67",X"01",X"27",X"00",X"1E",X"00",X"ED",X"98",X"1A", + X"C0",X"50",X"09",X"40",X"50",X"11",X"41",X"50",X"01",X"37",X"00",X"1E",X"00",X"ED",X"98",X"09", + X"24",X"64",X"11",X"25",X"64",X"01",X"67",X"00",X"1E",X"FF",X"ED",X"98",X"09",X"8D",X"39",X"0A", + X"93",X"64",X"3A",X"80",X"50",X"47",X"CE",X"03",X"1A",X"B3",X"64",X"09",X"B4",X"33",X"E5",X"98", + X"15",X"7E",X"1A",X"B4",X"64",X"78",X"CE",X"24",X"E3",X"3F",X"E3",X"3F",X"09",X"89",X"39",X"E5", + X"98",X"15",X"7E",X"1A",X"8A",X"64",X"78",X"CE",X"18",X"09",X"49",X"39",X"E5",X"98",X"15",X"0A", + X"8B",X"64",X"78",X"CE",X"18",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"1A",X"8D",X"64", + X"78",X"E3",X"5F",X"08",X"05",X"09",X"96",X"64",X"E3",X"FE",X"FB",X"3E",X"01",X"1A",X"00",X"50", + X"E5",X"04",X"1C",X"09",X"C2",X"43",X"11",X"C3",X"43",X"01",X"3C",X"00",X"1E",X"40",X"ED",X"98", + X"09",X"C2",X"47",X"11",X"C3",X"47",X"01",X"34",X"00",X"1E",X"05",X"ED",X"98",X"1A",X"C0",X"50", + X"09",X"CA",X"47",X"11",X"CB",X"47",X"01",X"34",X"00",X"1E",X"21",X"ED",X"98",X"1A",X"C0",X"50", + X"09",X"A3",X"30",X"11",X"C3",X"43",X"01",X"32",X"00",X"ED",X"98",X"AF",X"1A",X"CC",X"43",X"1A", + X"ED",X"43",X"1A",X"DE",X"43",X"09",X"BA",X"39",X"11",X"9B",X"64",X"01",X"3C",X"00",X"ED",X"98", + X"09",X"B8",X"64",X"11",X"DA",X"43",X"E5",X"0E",X"10",X"09",X"02",X"40",X"11",X"03",X"40",X"01", + X"3C",X"00",X"1E",X"40",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"02",X"44",X"11",X"03",X"44",X"01", + X"34",X"00",X"1E",X"21",X"ED",X"98",X"09",X"0A",X"44",X"11",X"0B",X"44",X"01",X"34",X"00",X"1E", + X"11",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"8D",X"30",X"11",X"27",X"40",X"01",X"06",X"00",X"ED", + X"98",X"AF",X"1A",X"24",X"40",X"3A",X"B3",X"64",X"FE",X"00",X"08",X"23",X"09",X"AB",X"30",X"11", + X"24",X"40",X"01",X"21",X"00",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"05",X"65",X"11",X"06",X"65", + X"01",X"FF",X"00",X"1E",X"00",X"ED",X"98",X"09",X"5C",X"1D",X"0A",X"36",X"65",X"0A",X"06",X"65", + X"09",X"35",X"65",X"0A",X"25",X"65",X"09",X"8A",X"1D",X"0A",X"39",X"65",X"0A",X"09",X"65",X"09", + X"38",X"65",X"0A",X"28",X"65",X"09",X"B9",X"1D",X"0A",X"54",X"65",X"0A",X"3C",X"65",X"09",X"53", + X"65",X"0A",X"43",X"65",X"09",X"EB",X"1D",X"0A",X"6F",X"65",X"0A",X"57",X"65",X"09",X"6E",X"65", + X"0A",X"76",X"65",X"09",X"B0",X"1E",X"0A",X"A2",X"65",X"0A",X"5A",X"65",X"09",X"A1",X"65",X"0A", + X"79",X"65",X"09",X"E2",X"1E",X"0A",X"8D",X"65",X"0A",X"A5",X"65",X"09",X"8C",X"65",X"0A",X"94", + X"65",X"09",X"04",X"38",X"0A",X"C0",X"65",X"0A",X"A8",X"65",X"09",X"BF",X"65",X"0A",X"AF",X"65", + X"09",X"31",X"38",X"0A",X"F3",X"65",X"0A",X"C3",X"65",X"09",X"F2",X"65",X"0A",X"E2",X"65",X"06", + X"08",X"09",X"40",X"50",X"1E",X"00",X"0B",X"10",X"FB",X"3E",X"00",X"1A",X"03",X"50",X"09",X"96", + X"64",X"E3",X"EE",X"3A",X"B3",X"64",X"FE",X"00",X"E2",X"39",X"21",X"3A",X"B2",X"64",X"FE",X"00", + X"C2",X"39",X"21",X"09",X"95",X"64",X"E3",X"8E",X"AF",X"1A",X"01",X"50",X"09",X"96",X"64",X"E3", + X"86",X"E5",X"22",X"16",X"1A",X"C0",X"50",X"E5",X"D1",X"19",X"3E",X"01",X"E5",X"67",X"15",X"09", + X"95",X"64",X"E3",X"6E",X"C2",X"39",X"21",X"E5",X"7C",X"10",X"3E",X"07",X"E5",X"67",X"15",X"09", + X"95",X"64",X"E3",X"6E",X"C2",X"39",X"21",X"3E",X"40",X"E5",X"FD",X"14",X"11",X"44",X"44",X"09", + X"DE",X"39",X"3E",X"01",X"06",X"34",X"E5",X"EB",X"15",X"11",X"61",X"44",X"09",X"F8",X"39",X"3E", + X"03",X"06",X"34",X"E5",X"EB",X"15",X"11",X"50",X"44",X"09",X"DF",X"39",X"3E",X"03",X"06",X"34", + X"E5",X"EB",X"15",X"11",X"70",X"44",X"09",X"F8",X"39",X"3E",X"03",X"06",X"34",X"E5",X"EB",X"15", + X"11",X"73",X"44",X"09",X"F9",X"39",X"3E",X"03",X"06",X"34",X"E5",X"EB",X"15",X"11",X"C4",X"40", + X"09",X"96",X"31",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"E1",X"40",X"09",X"AB",X"31", + X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"A3",X"40",X"09",X"BF",X"31",X"3E",X"01",X"06", + X"30",X"E5",X"D5",X"15",X"11",X"98",X"40",X"09",X"D7",X"31",X"3E",X"01",X"06",X"16",X"E5",X"D5", + X"15",X"11",X"52",X"41",X"09",X"ED",X"31",X"3E",X"01",X"06",X"24",X"E5",X"D5",X"15",X"3A",X"B3", + X"64",X"FE",X"01",X"08",X"27",X"11",X"31",X"41",X"09",X"F9",X"31",X"3E",X"01",X"06",X"27",X"E5", + X"D5",X"15",X"30",X"08",X"FE",X"02",X"08",X"27",X"11",X"31",X"41",X"09",X"20",X"32",X"3E",X"01", + X"06",X"27",X"E5",X"D5",X"15",X"30",X"25",X"11",X"31",X"41",X"09",X"17",X"32",X"3E",X"01",X"06", + X"27",X"E5",X"D5",X"15",X"11",X"B4",X"40",X"09",X"0E",X"32",X"3E",X"01",X"06",X"31",X"E5",X"D5", + X"15",X"3A",X"8D",X"64",X"FE",X"00",X"08",X"27",X"11",X"7C",X"41",X"09",X"3F",X"32",X"3E",X"01", + X"06",X"06",X"E5",X"D5",X"15",X"30",X"1B",X"FE",X"01",X"08",X"27",X"11",X"7C",X"41",X"09",X"45", + X"32",X"3E",X"01",X"06",X"06",X"E5",X"D5",X"15",X"30",X"08",X"FE",X"02",X"08",X"27",X"11",X"7C", + X"41",X"09",X"63",X"32",X"3E",X"01",X"06",X"06",X"E5",X"D5",X"15",X"30",X"25",X"11",X"7C",X"41", + X"09",X"51",X"32",X"3E",X"01",X"06",X"06",X"E5",X"D5",X"15",X"3E",X"04",X"E5",X"67",X"15",X"09", + X"95",X"64",X"E3",X"6E",X"08",X"53",X"E5",X"05",X"1C",X"AF",X"1A",X"FF",X"64",X"1A",X"01",X"65", + X"1A",X"03",X"65",X"1A",X"00",X"65",X"1A",X"02",X"65",X"1A",X"04",X"65",X"E5",X"07",X"1C",X"E5", + X"FA",X"26",X"E5",X"14",X"1C",X"E5",X"BC",X"33",X"AF",X"1A",X"08",X"65",X"1A",X"3B",X"65",X"1A", + X"56",X"65",X"1A",X"59",X"65",X"1A",X"A4",X"65",X"1A",X"8F",X"65",X"1A",X"C2",X"65",X"E5",X"15", + X"16",X"1A",X"C0",X"50",X"09",X"95",X"64",X"E3",X"6E",X"08",X"26",X"09",X"96",X"64",X"E3",X"66", + X"08",X"02",X"30",X"E6",X"E3",X"A6",X"C3",X"89",X"07",X"E5",X"22",X"16",X"09",X"95",X"64",X"E3", + X"CE",X"E3",X"AE",X"09",X"96",X"64",X"E3",X"A6",X"E3",X"96",X"E3",X"B6",X"09",X"97",X"64",X"E3", + X"96",X"09",X"96",X"64",X"E3",X"C6",X"09",X"24",X"64",X"11",X"25",X"64",X"01",X"67",X"00",X"1E", + X"FF",X"ED",X"98",X"3E",X"FF",X"1A",X"01",X"50",X"09",X"97",X"64",X"E3",X"56",X"08",X"27",X"3A", + X"FD",X"64",X"3C",X"1A",X"FD",X"64",X"FE",X"14",X"08",X"04",X"E3",X"D6",X"E3",X"F6",X"00",X"1A", + X"C0",X"50",X"3E",X"40",X"E5",X"FD",X"14",X"3E",X"03",X"E5",X"25",X"15",X"3A",X"B3",X"64",X"FE", + X"00",X"E2",X"14",X"22",X"3A",X"B2",X"64",X"FE",X"02",X"18",X"64",X"11",X"58",X"41",X"09",X"9C", + X"30",X"3E",X"01",X"06",X"23",X"E5",X"D5",X"15",X"3A",X"40",X"50",X"E3",X"6F",X"08",X"5C",X"3A", + X"B3",X"64",X"FE",X"00",X"28",X"15",X"3A",X"B2",X"64",X"FE",X"02",X"38",X"4E",X"D6",X"02",X"1A", + X"B2",X"64",X"3A",X"B5",X"64",X"D6",X"01",X"0F",X"1A",X"B5",X"64",X"09",X"96",X"64",X"E3",X"CE", + X"3A",X"8A",X"64",X"1A",X"8E",X"64",X"E5",X"13",X"00",X"3A",X"B3",X"64",X"FE",X"00",X"E2",X"6F", + X"22",X"E5",X"35",X"15",X"C3",X"6F",X"22",X"FE",X"04",X"18",X"29",X"11",X"26",X"41",X"09",X"BF", + X"30",X"3E",X"01",X"06",X"11",X"E5",X"D5",X"15",X"11",X"10",X"42",X"09",X"D0",X"30",X"3E",X"01", + X"06",X"02",X"E5",X"D5",X"15",X"11",X"5A",X"41",X"09",X"9C",X"30",X"3E",X"01",X"06",X"23",X"E5", + X"D5",X"15",X"30",X"94",X"11",X"90",X"40",X"09",X"D2",X"30",X"3E",X"01",X"06",X"31",X"E5",X"D5", + X"15",X"30",X"85",X"3A",X"40",X"50",X"E3",X"5F",X"08",X"1B",X"3A",X"B3",X"64",X"FE",X"00",X"28", + X"15",X"3A",X"B2",X"64",X"FE",X"04",X"38",X"0D",X"D6",X"04",X"1A",X"B2",X"64",X"3A",X"B5",X"64", + X"D6",X"02",X"0F",X"1A",X"B5",X"64",X"09",X"96",X"64",X"E3",X"8E",X"3A",X"8A",X"64",X"1A",X"8E", + X"64",X"1A",X"8F",X"64",X"E5",X"13",X"00",X"E5",X"0C",X"00",X"C3",X"F1",X"21",X"1A",X"C0",X"50", + X"09",X"95",X"64",X"E3",X"5E",X"08",X"03",X"C3",X"A8",X"21",X"E3",X"9E",X"C3",X"7F",X"21",X"AF", + X"09",X"A8",X"64",X"11",X"A9",X"64",X"01",X"05",X"00",X"5F",X"ED",X"98",X"1A",X"99",X"64",X"1A", + X"9A",X"64",X"3E",X"40",X"09",X"CC",X"43",X"11",X"CD",X"43",X"01",X"05",X"00",X"5F",X"ED",X"98", + X"09",X"DE",X"43",X"11",X"DF",X"43",X"01",X"05",X"00",X"5F",X"ED",X"98",X"AF",X"1A",X"CC",X"43", + X"1A",X"DE",X"43",X"AF",X"1A",X"FF",X"64",X"1A",X"01",X"65",X"1A",X"03",X"65",X"1A",X"00",X"65", + X"1A",X"02",X"65",X"1A",X"04",X"65",X"E5",X"06",X"1C",X"E5",X"13",X"1C",X"09",X"97",X"64",X"E3", + X"E6",X"09",X"96",X"64",X"E3",X"4E",X"28",X"02",X"30",X"32",X"3E",X"00",X"1A",X"03",X"50",X"E5", + X"44",X"15",X"11",X"50",X"41",X"09",X"EB",X"30",X"3E",X"01",X"06",X"25",X"E5",X"D5",X"15",X"3E", + X"03",X"E5",X"67",X"15",X"09",X"96",X"64",X"E3",X"EE",X"3A",X"8E",X"64",X"3D",X"1A",X"8E",X"64", + X"3E",X"40",X"09",X"16",X"40",X"11",X"17",X"40",X"01",X"20",X"00",X"5F",X"ED",X"98",X"E5",X"13", + X"00",X"3A",X"FF",X"64",X"1A",X"03",X"65",X"3A",X"00",X"65",X"1A",X"04",X"65",X"E5",X"6B",X"1C", + X"C3",X"B3",X"23",X"09",X"96",X"64",X"E3",X"4E",X"08",X"E2",X"E3",X"6E",X"28",X"AC",X"3A",X"96", + X"64",X"E3",X"7F",X"08",X"43",X"E5",X"44",X"15",X"11",X"50",X"41",X"09",X"F8",X"30",X"3E",X"01", + X"06",X"25",X"E5",X"D5",X"15",X"3E",X"03",X"E5",X"67",X"15",X"09",X"96",X"64",X"E3",X"AE",X"3A", + X"8F",X"64",X"3D",X"1A",X"8F",X"64",X"3E",X"40",X"09",X"02",X"40",X"11",X"03",X"40",X"01",X"20", + X"00",X"5F",X"ED",X"98",X"E5",X"0C",X"00",X"3A",X"01",X"65",X"1A",X"03",X"65",X"3A",X"02",X"65", + X"1A",X"04",X"65",X"E5",X"6D",X"1C",X"30",X"1B",X"3E",X"01",X"1A",X"03",X"50",X"30",X"9E",X"E5", + X"44",X"15",X"09",X"96",X"64",X"E3",X"4E",X"C2",X"E9",X"22",X"11",X"10",X"41",X"09",X"05",X"31", + X"3E",X"01",X"06",X"11",X"E5",X"D5",X"15",X"09",X"08",X"65",X"E3",X"C6",X"3E",X"01",X"E5",X"67", + X"15",X"09",X"96",X"64",X"E3",X"6E",X"28",X"8F",X"C3",X"E9",X"22",X"E5",X"FA",X"26",X"09",X"97", + X"64",X"E3",X"66",X"28",X"13",X"E3",X"A6",X"09",X"C2",X"65",X"E3",X"C6",X"1A",X"C0",X"50",X"3A", + X"C2",X"65",X"FE",X"00",X"08",X"DE",X"30",X"05",X"3E",X"02",X"E5",X"67",X"15",X"09",X"8F",X"65", + X"E3",X"C6",X"09",X"59",X"65",X"E3",X"C6",X"E5",X"BC",X"33",X"ED",X"73",X"AE",X"64",X"7B",X"9A", + X"28",X"21",X"09",X"00",X"00",X"0A",X"AE",X"64",X"E5",X"4E",X"27",X"1A",X"C0",X"50",X"E5",X"15", + X"16",X"09",X"96",X"64",X"E3",X"66",X"28",X"F7",X"E3",X"A6",X"E5",X"22",X"16",X"09",X"96",X"64", + X"E3",X"56",X"08",X"27",X"E5",X"59",X"1C",X"E5",X"22",X"16",X"09",X"96",X"64",X"E3",X"76",X"08", + X"21",X"30",X"4F",X"E3",X"96",X"E5",X"58",X"1C",X"30",X"EA",X"E3",X"B6",X"09",X"97",X"64",X"E3", + X"E6",X"09",X"96",X"64",X"E3",X"6E",X"08",X"29",X"3A",X"01",X"65",X"3C",X"FE",X"24",X"08",X"02", + X"3E",X"23",X"1A",X"01",X"65",X"1A",X"03",X"65",X"3A",X"02",X"65",X"3C",X"FE",X"31",X"08",X"02", + X"3E",X"30",X"1A",X"02",X"65",X"1A",X"04",X"65",X"E5",X"5A",X"1C",X"E5",X"6F",X"1C",X"C3",X"B3", + X"23",X"3A",X"FF",X"64",X"3C",X"FE",X"24",X"08",X"02",X"3E",X"23",X"1A",X"FF",X"64",X"1A",X"03", + X"65",X"3A",X"00",X"65",X"3C",X"FE",X"31",X"08",X"02",X"3E",X"30",X"1A",X"00",X"65",X"1A",X"04", + X"65",X"E5",X"5A",X"1C",X"E5",X"6E",X"1C",X"C3",X"B3",X"23",X"3A",X"98",X"64",X"FE",X"00",X"08", + X"2E",X"09",X"96",X"64",X"E3",X"6E",X"08",X"2F",X"3A",X"8F",X"64",X"FE",X"00",X"08",X"66",X"E5", + X"44",X"15",X"11",X"90",X"41",X"09",X"16",X"31",X"3E",X"01",X"06",X"21",X"E5",X"D5",X"15",X"3E", + X"02",X"E5",X"67",X"15",X"E5",X"EE",X"11",X"09",X"95",X"64",X"E3",X"DE",X"C3",X"79",X"07",X"D6", + X"01",X"1A",X"98",X"64",X"C3",X"6F",X"23",X"3A",X"8E",X"64",X"FE",X"00",X"08",X"0D",X"09",X"96", + X"64",X"E3",X"4E",X"08",X"E2",X"E5",X"44",X"15",X"11",X"D8",X"40",X"09",X"37",X"31",X"3E",X"01", + X"06",X"14",X"E5",X"D5",X"15",X"3E",X"03",X"E5",X"67",X"15",X"C3",X"36",X"23",X"E5",X"6C",X"1C", + X"C3",X"13",X"23",X"E5",X"6A",X"1C",X"C3",X"13",X"23",X"2A",X"91",X"64",X"EB",X"F5",X"09",X"00", + X"00",X"F5",X"31",X"F5",X"7E",X"01",X"F5",X"86",X"02",X"47",X"CE",X"27",X"F5",X"5F",X"02",X"E3", + X"38",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"F5",X"7E",X"00",X"09",X"07",X"25",X"E3",X"0F",X"E5", + X"98",X"15",X"76",X"0B",X"56",X"EB",X"E9",X"13",X"25",X"13",X"25",X"14",X"25",X"34",X"25",X"0C", + X"25",X"2C",X"25",X"E1",X"F5",X"7E",X"04",X"90",X"F5",X"5F",X"04",X"E1",X"F5",X"7E",X"04",X"80", + X"F5",X"5F",X"04",X"E1",X"F5",X"7E",X"03",X"80",X"F5",X"5F",X"03",X"E1",X"F5",X"7E",X"03",X"90", + X"F5",X"5F",X"03",X"E1",X"2A",X"76",X"64",X"EB",X"F5",X"09",X"00",X"00",X"F5",X"31",X"EB",X"01", + X"00",X"64",X"1F",X"3F",X"ED",X"42",X"CD",X"F5",X"7E",X"00",X"09",X"57",X"25",X"E3",X"0F",X"E5", + X"98",X"15",X"76",X"0B",X"56",X"EB",X"E9",X"0F",X"26",X"4B",X"25",X"8E",X"25",X"1E",X"26",X"40", + X"26",X"53",X"26",X"F5",X"7E",X"03",X"1A",X"74",X"64",X"F5",X"7E",X"04",X"1A",X"75",X"64",X"E5", + X"BD",X"26",X"F5",X"7E",X"06",X"12",X"3A",X"22",X"64",X"FE",X"00",X"08",X"17",X"3A",X"23",X"64", + X"FE",X"00",X"08",X"17",X"C1",X"09",X"24",X"64",X"21",X"CD",X"D1",X"13",X"01",X"05",X"00",X"1E", + X"FF",X"ED",X"98",X"E1",X"F5",X"7E",X"06",X"13",X"12",X"30",X"E9",X"F5",X"7E",X"06",X"09",X"08", + X"00",X"31",X"EB",X"12",X"30",X"F6",X"E5",X"CD",X"26",X"F5",X"7E",X"03",X"90",X"1A",X"74",X"64", + X"F5",X"7E",X"04",X"1A",X"75",X"64",X"E5",X"BD",X"26",X"3A",X"22",X"64",X"FE",X"00",X"28",X"1A", + X"3A",X"22",X"64",X"E3",X"0F",X"F5",X"46",X"05",X"80",X"3D",X"C1",X"FD",X"09",X"24",X"64",X"FD", + X"21",X"FD",X"5B",X"00",X"FD",X"5A",X"01",X"FD",X"5F",X"02",X"3C",X"13",X"FD",X"5B",X"03",X"FD", + X"5A",X"04",X"FD",X"5F",X"05",X"3A",X"74",X"64",X"F5",X"5F",X"03",X"3A",X"75",X"64",X"F5",X"5F", + X"04",X"E1",X"3A",X"23",X"64",X"FE",X"00",X"E2",X"74",X"26",X"3A",X"23",X"64",X"E3",X"0F",X"C6", + X"27",X"F5",X"46",X"05",X"80",X"C1",X"FD",X"09",X"24",X"64",X"FD",X"21",X"FD",X"5B",X"00",X"FD", + X"5A",X"01",X"FD",X"5F",X"02",X"3C",X"09",X"08",X"00",X"31",X"EB",X"FD",X"5B",X"03",X"FD",X"5A", + X"04",X"FD",X"5F",X"05",X"C3",X"CD",X"25",X"F5",X"7E",X"03",X"1A",X"74",X"64",X"F5",X"7E",X"04", + X"1A",X"75",X"64",X"C3",X"9E",X"25",X"E5",X"CD",X"26",X"F5",X"7E",X"03",X"80",X"C3",X"AD",X"25", + X"E5",X"CD",X"26",X"F5",X"7E",X"04",X"90",X"1A",X"75",X"64",X"F5",X"7E",X"03",X"1A",X"74",X"64", + X"C3",X"9E",X"25",X"E5",X"CD",X"26",X"F5",X"7E",X"04",X"80",X"30",X"EB",X"F5",X"7E",X"05",X"C1", + X"FD",X"09",X"24",X"64",X"FD",X"21",X"FD",X"5B",X"00",X"FD",X"5A",X"01",X"FD",X"5F",X"02",X"3A", + X"74",X"64",X"F5",X"5F",X"03",X"3A",X"75",X"64",X"F5",X"5F",X"04",X"F5",X"7E",X"00",X"09",X"90", + X"26",X"E3",X"0F",X"E5",X"98",X"15",X"D5",X"76",X"0B",X"56",X"EB",X"D1",X"F5",X"7E",X"06",X"E9", + X"B4",X"26",X"B4",X"26",X"B5",X"26",X"A8",X"26",X"AB",X"26",X"9A",X"26",X"E1",X"13",X"FD",X"5B", + X"03",X"FD",X"5A",X"04",X"FD",X"5F",X"05",X"E1",X"33",X"30",X"DB",X"09",X"08",X"00",X"31",X"EB", + X"30",X"EC",X"EB",X"11",X"08",X"00",X"1F",X"3F",X"ED",X"52",X"EB",X"30",X"C9",X"3A",X"74",X"64", + X"CE",X"07",X"1A",X"22",X"64",X"3A",X"75",X"64",X"CE",X"07",X"1A",X"23",X"64",X"3A",X"74",X"64", + X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"57",X"3A",X"75",X"64",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F", + X"77",X"E5",X"F7",X"14",X"E1",X"F5",X"7E",X"01",X"F5",X"86",X"02",X"47",X"CE",X"27",X"F5",X"5F", + X"02",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E1",X"3A",X"03",X"65",X"09",X"20",X"27", + X"E3",X"0F",X"E3",X"0F",X"E5",X"98",X"15",X"E9",X"E5",X"2B",X"28",X"E1",X"E5",X"4D",X"28",X"E1", + X"E5",X"B7",X"28",X"E1",X"E5",X"F1",X"28",X"E1",X"E5",X"13",X"29",X"E1",X"E5",X"65",X"29",X"E1", + X"E5",X"87",X"29",X"E1",X"E5",X"C1",X"29",X"E1",X"E5",X"FB",X"29",X"E1",X"E5",X"1D",X"2A",X"E1", + X"E5",X"6F",X"2A",X"E1",X"E5",X"A9",X"2A",X"E1",X"E5",X"CB",X"2A",X"E1",X"E5",X"CC",X"2A",X"E1", + X"E5",X"CD",X"2A",X"E1",X"E5",X"CE",X"2A",X"E1",X"D5",X"1F",X"3F",X"09",X"26",X"01",X"16",X"00", + X"ED",X"52",X"7D",X"1F",X"3F",X"09",X"10",X"01",X"D1",X"72",X"16",X"00",X"ED",X"52",X"55",X"77", + X"E1",X"7D",X"EE",X"03",X"6F",X"E1",X"09",X"96",X"64",X"E3",X"46",X"E0",X"E3",X"6E",X"28",X"43", + X"09",X"A8",X"64",X"7B",X"86",X"0F",X"5F",X"0B",X"7A",X"A6",X"0F",X"5F",X"0B",X"3E",X"00",X"A6", + X"0F",X"5F",X"38",X"02",X"30",X"1A",X"09",X"96",X"64",X"E3",X"6E",X"28",X"13",X"09",X"DE",X"43", + X"11",X"DF",X"43",X"01",X"05",X"00",X"1E",X"40",X"ED",X"98",X"AF",X"1A",X"DE",X"43",X"30",X"30", + X"09",X"CC",X"43",X"11",X"CD",X"43",X"01",X"05",X"00",X"1E",X"40",X"ED",X"98",X"AF",X"1A",X"CC", + X"43",X"30",X"05",X"09",X"AB",X"64",X"30",X"BB",X"09",X"96",X"64",X"E3",X"6E",X"28",X"74",X"09", + X"AA",X"64",X"11",X"FB",X"43",X"3A",X"99",X"64",X"DD",X"E5",X"0E",X"10",X"0B",X"0B",X"0B",X"EB", + X"2A",X"8B",X"64",X"D9",X"FE",X"04",X"D0",X"E3",X"0F",X"E3",X"0F",X"3C",X"3C",X"E5",X"98",X"15", + X"E5",X"AA",X"11",X"D0",X"3A",X"98",X"64",X"3C",X"1A",X"98",X"64",X"09",X"08",X"65",X"E3",X"C6", + X"09",X"96",X"64",X"E3",X"6E",X"28",X"12",X"3A",X"99",X"64",X"3C",X"1A",X"99",X"64",X"3A",X"8E", + X"64",X"3C",X"1A",X"8E",X"64",X"E5",X"13",X"00",X"E1",X"3A",X"9A",X"64",X"3C",X"1A",X"9A",X"64", + X"3A",X"8F",X"64",X"3C",X"1A",X"8F",X"64",X"E5",X"0C",X"00",X"E1",X"09",X"AD",X"64",X"11",X"E9", + X"43",X"3A",X"9A",X"64",X"30",X"8A",X"3E",X"03",X"DD",X"7E",X"CE",X"D8",X"E3",X"3F",X"E3",X"3F", + X"E3",X"3F",X"E3",X"3F",X"47",X"3A",X"96",X"64",X"E3",X"5F",X"28",X"0A",X"78",X"12",X"33",X"7E", + X"CE",X"27",X"47",X"3A",X"96",X"64",X"E3",X"5F",X"1A",X"96",X"64",X"28",X"08",X"78",X"12",X"2B", + X"33",X"D9",X"3D",X"08",X"D3",X"3A",X"96",X"64",X"E3",X"9F",X"1A",X"96",X"64",X"E1",X"78",X"FE", + X"00",X"28",X"F3",X"3A",X"96",X"64",X"E3",X"DF",X"1A",X"96",X"64",X"30",X"E7",X"78",X"FE",X"00", + X"28",X"F5",X"3A",X"96",X"64",X"E3",X"DF",X"1A",X"96",X"64",X"30",X"D1",X"09",X"97",X"64",X"E3", + X"76",X"28",X"2C",X"E3",X"B6",X"09",X"40",X"40",X"E5",X"89",X"10",X"FE",X"3A",X"08",X"24",X"09", + X"40",X"44",X"E5",X"89",X"10",X"FE",X"B4",X"08",X"02",X"30",X"14",X"AF",X"1A",X"B3",X"64",X"30", + X"26",X"AF",X"11",X"80",X"03",X"86",X"0B",X"33",X"47",X"7A",X"9B",X"78",X"08",X"DF",X"E1",X"00", + X"3E",X"40",X"E5",X"FD",X"14",X"3E",X"21",X"E5",X"25",X"15",X"11",X"29",X"45",X"09",X"EE",X"10", + X"3E",X"15",X"06",X"23",X"E5",X"EB",X"15",X"11",X"45",X"41",X"09",X"1B",X"31",X"3E",X"01",X"06", + X"24",X"E5",X"D5",X"15",X"09",X"77",X"33",X"11",X"E2",X"42",X"01",X"FF",X"21",X"ED",X"88",X"13", + X"10",X"FB",X"AF",X"12",X"E5",X"02",X"16",X"3E",X"01",X"12",X"E5",X"EF",X"10",X"E1",X"03",X"09", + X"9B",X"64",X"11",X"6A",X"42",X"E5",X"2F",X"11",X"11",X"6C",X"42",X"E5",X"2F",X"11",X"11",X"6E", + X"42",X"E5",X"2F",X"11",X"11",X"58",X"42",X"E5",X"2F",X"11",X"11",X"5A",X"42",X"E5",X"2F",X"11", + X"11",X"5C",X"42",X"E5",X"2F",X"11",X"11",X"5E",X"42",X"E5",X"2F",X"11",X"11",X"78",X"42",X"E5", + X"2F",X"11",X"11",X"7A",X"42",X"E5",X"2F",X"11",X"11",X"7C",X"42",X"E5",X"2F",X"11",X"E1",X"06", + X"03",X"26",X"27",X"3E",X"09",X"ED",X"88",X"E5",X"E1",X"15",X"10",X"DF",X"0B",X"0B",X"3E",X"40", + X"E5",X"E1",X"15",X"E5",X"64",X"11",X"3E",X"04",X"E5",X"98",X"15",X"E1",X"3E",X"03",X"DD",X"7E", + X"CE",X"D8",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"47",X"3A",X"96",X"64",X"E3",X"5F", + X"28",X"2A",X"78",X"12",X"3E",X"08",X"E5",X"E1",X"15",X"7E",X"CE",X"27",X"47",X"3A",X"96",X"64", + X"E3",X"5F",X"1A",X"96",X"64",X"28",X"0C",X"78",X"12",X"2B",X"3E",X"08",X"E5",X"E1",X"15",X"D9", + X"3D",X"08",X"E3",X"3A",X"96",X"64",X"E3",X"9F",X"1A",X"96",X"64",X"E1",X"78",X"FE",X"00",X"28", + X"D3",X"3A",X"96",X"64",X"E3",X"DF",X"1A",X"96",X"64",X"30",X"C7",X"78",X"FE",X"00",X"28",X"F1", + X"3A",X"96",X"64",X"E3",X"DF",X"1A",X"96",X"64",X"30",X"E5",X"06",X"03",X"32",X"BE",X"38",X"20", + X"08",X"26",X"2B",X"33",X"10",X"DE",X"30",X"06",X"E5",X"C5",X"11",X"1F",X"3F",X"E1",X"1F",X"E1", + X"E5",X"C5",X"11",X"1F",X"E1",X"78",X"FE",X"00",X"E0",X"2B",X"33",X"3D",X"08",X"FB",X"E1",X"63", + X"65",X"52",X"08",X"54",X"66",X"54",X"2C",X"43",X"67",X"50",X"71",X"52",X"61",X"47",X"60",X"54", + X"08",X"19",X"39",X"38",X"1B",X"54",X"45",X"64",X"63",X"67",X"08",X"61",X"66",X"43",X"09",X"96", + X"64",X"E3",X"EE",X"09",X"A8",X"64",X"11",X"DD",X"64",X"01",X"03",X"00",X"ED",X"98",X"E5",X"30", + X"12",X"09",X"96",X"64",X"E3",X"4E",X"C0",X"E3",X"AE",X"09",X"AB",X"64",X"11",X"DD",X"64",X"01", + X"03",X"00",X"ED",X"98",X"E5",X"30",X"12",X"E1",X"01",X"00",X"22",X"09",X"D9",X"64",X"11",X"DF", + X"64",X"2B",X"2B",X"2B",X"C5",X"E5",X"AA",X"11",X"C1",X"18",X"22",X"3E",X"06",X"81",X"67",X"10", + X"ED",X"2B",X"2B",X"30",X"20",X"79",X"FE",X"00",X"E0",X"0B",X"0B",X"0B",X"0B",X"C5",X"CD",X"06", + X"00",X"09",X"EE",X"64",X"11",X"DC",X"64",X"ED",X"B8",X"3E",X"40",X"E5",X"FD",X"14",X"09",X"96", + X"64",X"E3",X"6E",X"08",X"33",X"11",X"4A",X"41",X"09",X"FB",X"30",X"3E",X"01",X"06",X"22",X"E5", + X"D5",X"15",X"09",X"96",X"64",X"E3",X"7E",X"28",X"31",X"3E",X"01",X"1A",X"03",X"50",X"30",X"12", + X"11",X"4A",X"41",X"09",X"EE",X"30",X"3E",X"01",X"06",X"22",X"E5",X"D5",X"15",X"3E",X"00",X"1A", + X"03",X"50",X"11",X"40",X"44",X"09",X"F3",X"14",X"3E",X"23",X"06",X"34",X"E5",X"EB",X"15",X"11", + X"64",X"44",X"09",X"F4",X"14",X"3E",X"03",X"06",X"34",X"E5",X"EB",X"15",X"11",X"51",X"44",X"09", + X"F5",X"14",X"3E",X"10",X"06",X"34",X"E5",X"EB",X"15",X"11",X"50",X"44",X"09",X"F6",X"14",X"3E", + X"02",X"06",X"34",X"E5",X"EB",X"15",X"D1",X"D5",X"3E",X"40",X"D5",X"C9",X"13",X"01",X"03",X"00", + X"5F",X"ED",X"98",X"1E",X"00",X"01",X"02",X"00",X"ED",X"98",X"D1",X"C1",X"D5",X"78",X"09",X"88", + X"33",X"E3",X"0F",X"E5",X"98",X"15",X"66",X"0B",X"46",X"C5",X"09",X"80",X"04",X"21",X"26",X"01", + X"06",X"27",X"59",X"3E",X"08",X"E5",X"BF",X"15",X"10",X"F8",X"11",X"C3",X"40",X"09",X"3F",X"31", + X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"8D",X"41",X"09",X"53",X"31",X"3E",X"01",X"06", + X"07",X"E5",X"D5",X"15",X"11",X"8F",X"40",X"09",X"72",X"31",X"3E",X"01",X"06",X"16",X"E5",X"D5", + X"15",X"11",X"A0",X"40",X"09",X"58",X"31",X"3E",X"01",X"06",X"17",X"E5",X"D5",X"15",X"11",X"69", + X"42",X"09",X"87",X"31",X"3E",X"01",X"06",X"20",X"E5",X"D5",X"15",X"11",X"64",X"40",X"09",X"A7", + X"31",X"3E",X"03",X"06",X"01",X"E5",X"D5",X"15",X"11",X"A5",X"40",X"09",X"82",X"33",X"3E",X"01", + X"06",X"32",X"E5",X"D5",X"15",X"3E",X"01",X"11",X"AD",X"47",X"12",X"AF",X"1A",X"F9",X"64",X"1A", + X"FA",X"64",X"09",X"AD",X"47",X"0A",X"FB",X"64",X"11",X"59",X"41",X"09",X"1B",X"31",X"3E",X"01", + X"06",X"24",X"E5",X"D5",X"15",X"09",X"77",X"33",X"11",X"DC",X"42",X"01",X"21",X"00",X"ED",X"98", + X"AF",X"12",X"E5",X"02",X"16",X"3E",X"01",X"12",X"09",X"9B",X"64",X"11",X"94",X"42",X"E5",X"2F", + X"11",X"11",X"95",X"42",X"E5",X"2F",X"11",X"11",X"96",X"42",X"E5",X"2F",X"11",X"11",X"97",X"42", + X"E5",X"2F",X"11",X"11",X"B0",X"42",X"E5",X"2F",X"11",X"11",X"B1",X"42",X"E5",X"2F",X"11",X"11", + X"B2",X"42",X"E5",X"2F",X"11",X"11",X"B3",X"42",X"E5",X"2F",X"11",X"11",X"B4",X"42",X"E5",X"2F", + X"11",X"11",X"B5",X"42",X"E5",X"2F",X"11",X"3A",X"F8",X"64",X"E3",X"67",X"E2",X"43",X"14",X"E3", + X"57",X"E2",X"7B",X"14",X"3A",X"F8",X"64",X"E3",X"4F",X"C2",X"BC",X"14",X"3A",X"F9",X"64",X"FE", + X"33",X"28",X"37",X"09",X"68",X"33",X"E5",X"98",X"15",X"7E",X"C9",X"D1",X"12",X"13",X"5F",X"3E", + X"08",X"E5",X"BF",X"15",X"D5",X"CD",X"3A",X"FA",X"64",X"3C",X"1A",X"FA",X"64",X"FE",X"03",X"C2", + X"E7",X"14",X"09",X"9C",X"33",X"3A",X"FA",X"64",X"E5",X"98",X"15",X"7E",X"C9",X"D1",X"CD",X"E5", + X"9D",X"15",X"09",X"DD",X"64",X"01",X"03",X"00",X"ED",X"98",X"3A",X"FA",X"64",X"FE",X"00",X"28", + X"0D",X"09",X"B8",X"33",X"E5",X"98",X"15",X"7E",X"D1",X"E5",X"E1",X"15",X"09",X"DF",X"64",X"E5", + X"64",X"11",X"09",X"B8",X"64",X"11",X"DA",X"43",X"E5",X"0E",X"10",X"09",X"97",X"64",X"E3",X"86", + X"3E",X"01",X"E5",X"67",X"15",X"E1",X"D1",X"3E",X"80",X"E5",X"E1",X"15",X"3E",X"08",X"E5",X"E1", + X"15",X"30",X"F1",X"3A",X"F9",X"64",X"FE",X"00",X"E2",X"C4",X"13",X"3D",X"1A",X"F9",X"64",X"FE", + X"32",X"28",X"14",X"3E",X"05",X"2A",X"FB",X"64",X"5F",X"3E",X"08",X"E5",X"98",X"15",X"0A",X"FB", + X"64",X"3E",X"01",X"5F",X"C3",X"C4",X"13",X"3D",X"1A",X"F9",X"64",X"3E",X"05",X"2A",X"FB",X"64", + X"2B",X"5F",X"0B",X"5F",X"0B",X"5F",X"2B",X"3E",X"40",X"30",X"C8",X"3A",X"F9",X"64",X"FE",X"33", + X"E2",X"C4",X"13",X"3C",X"1A",X"F9",X"64",X"FE",X"32",X"28",X"14",X"3E",X"05",X"2A",X"FB",X"64", + X"5F",X"3E",X"08",X"E5",X"BF",X"15",X"0A",X"FB",X"64",X"3E",X"01",X"5F",X"C3",X"C4",X"13",X"3C", + X"1A",X"F9",X"64",X"3E",X"05",X"2A",X"FB",X"64",X"5F",X"3E",X"40",X"E5",X"BF",X"15",X"0A",X"FB", + X"64",X"3E",X"01",X"2B",X"5F",X"0B",X"5F",X"0B",X"5F",X"C3",X"C4",X"13",X"3E",X"20",X"E5",X"B3", + X"15",X"1A",X"C0",X"50",X"06",X"14",X"E5",X"4F",X"15",X"F2",X"DA",X"13",X"C3",X"9F",X"13",X"3A", + X"F8",X"64",X"E3",X"4F",X"1A",X"C0",X"50",X"28",X"DE",X"30",X"CE",X"21",X"05",X"10",X"01",X"D5", + X"AF",X"E3",X"0B",X"17",X"E3",X"0B",X"17",X"E3",X"0B",X"17",X"E3",X"0B",X"17",X"E3",X"0B",X"17", + X"57",X"EB",X"01",X"40",X"40",X"21",X"06",X"00",X"D1",X"62",X"21",X"EB",X"E1",X"09",X"40",X"40", + X"11",X"41",X"40",X"01",X"7F",X"03",X"5F",X"ED",X"98",X"1A",X"C0",X"50",X"E1",X"09",X"40",X"44", + X"11",X"41",X"44",X"01",X"7F",X"03",X"5F",X"ED",X"98",X"1A",X"C0",X"50",X"E1",X"3A",X"B3",X"64", + X"FE",X"00",X"E0",X"3A",X"B5",X"64",X"CE",X"D8",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F", + X"FE",X"00",X"28",X"24",X"1A",X"25",X"40",X"3A",X"B5",X"64",X"CE",X"27",X"1A",X"24",X"40",X"E1", + X"3E",X"40",X"30",X"D8",X"3E",X"21",X"E5",X"25",X"15",X"3E",X"40",X"E5",X"FD",X"14",X"E1",X"47", + X"AF",X"1A",X"B6",X"64",X"1A",X"88",X"64",X"3A",X"88",X"64",X"B8",X"E0",X"09",X"95",X"64",X"E3", + X"6E",X"C0",X"1A",X"C0",X"50",X"30",X"D8",X"3A",X"97",X"64",X"E3",X"47",X"28",X"25",X"3A",X"89", + X"64",X"47",X"3A",X"88",X"64",X"B8",X"18",X"31",X"1F",X"3F",X"E1",X"78",X"1A",X"89",X"64",X"3A", + X"97",X"64",X"E3",X"C7",X"1A",X"97",X"64",X"AF",X"1A",X"88",X"64",X"1A",X"B6",X"64",X"1F",X"3F", + X"E1",X"3A",X"97",X"64",X"E3",X"87",X"1A",X"97",X"64",X"1F",X"E1",X"47",X"AF",X"1A",X"B7",X"64", + X"3A",X"B7",X"64",X"B8",X"E0",X"09",X"95",X"64",X"E3",X"6E",X"C0",X"1A",X"C0",X"50",X"30",X"D8", + X"85",X"6F",X"D0",X"0C",X"E1",X"83",X"77",X"D0",X"14",X"E1",X"81",X"67",X"D0",X"04",X"E1",X"D5", + X"16",X"00",X"77",X"1F",X"3F",X"ED",X"52",X"D1",X"E1",X"CD",X"EB",X"16",X"00",X"77",X"1F",X"3F", + X"ED",X"52",X"EB",X"C9",X"E1",X"1A",X"48",X"64",X"D5",X"3A",X"48",X"64",X"67",X"ED",X"88",X"79", + X"FE",X"00",X"08",X"F9",X"D1",X"E5",X"02",X"16",X"10",X"EE",X"E1",X"1A",X"48",X"64",X"D5",X"3A", + X"48",X"64",X"67",X"ED",X"88",X"2B",X"79",X"FE",X"00",X"08",X"F8",X"D1",X"E5",X"02",X"16",X"10", + X"ED",X"E1",X"CD",X"09",X"08",X"00",X"31",X"EB",X"C9",X"E1",X"09",X"49",X"64",X"06",X"2F",X"1E", + X"00",X"0B",X"10",X"FB",X"E1",X"09",X"95",X"64",X"E3",X"FE",X"E3",X"7E",X"E0",X"30",X"FB",X"3A", + X"00",X"50",X"CE",X"27",X"47",X"3A",X"40",X"50",X"CE",X"D8",X"98",X"1A",X"F8",X"64",X"E1",X"3A", + X"40",X"50",X"47",X"CE",X"27",X"E3",X"78",X"28",X"02",X"E3",X"CF",X"1A",X"F8",X"64",X"E1",X"F5", + X"09",X"05",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17",X"F5",X"E3",X"00",X"56",X"28",X"10", + X"E5",X"78",X"17",X"FD",X"09",X"51",X"50",X"E5",X"47",X"17",X"F5",X"7E",X"06",X"1A",X"45",X"50", + X"F5",X"09",X"08",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17",X"F5",X"E3",X"00",X"56",X"28", + X"10",X"E5",X"78",X"17",X"FD",X"09",X"51",X"50",X"E5",X"47",X"17",X"F5",X"7E",X"06",X"1A",X"45", + X"50",X"F5",X"09",X"3B",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17",X"F5",X"E3",X"00",X"56", + X"28",X"10",X"E5",X"78",X"17",X"FD",X"09",X"51",X"50",X"E5",X"47",X"17",X"F5",X"7E",X"06",X"1A", + X"45",X"50",X"F5",X"09",X"56",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17",X"F5",X"E3",X"00", + X"56",X"28",X"10",X"E5",X"78",X"17",X"FD",X"09",X"56",X"50",X"E5",X"47",X"17",X"F5",X"7E",X"06", + X"1A",X"62",X"50",X"F5",X"09",X"59",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17",X"F5",X"E3", + X"00",X"56",X"28",X"10",X"E5",X"78",X"17",X"FD",X"09",X"56",X"50",X"E5",X"47",X"17",X"F5",X"7E", + X"06",X"1A",X"62",X"50",X"F5",X"09",X"A4",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17",X"F5", + X"E3",X"00",X"56",X"28",X"10",X"E5",X"78",X"17",X"FD",X"09",X"56",X"50",X"E5",X"47",X"17",X"F5", + X"7E",X"06",X"1A",X"62",X"50",X"F5",X"09",X"8F",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17", + X"F5",X"E3",X"00",X"56",X"28",X"10",X"E5",X"78",X"17",X"FD",X"09",X"73",X"50",X"E5",X"47",X"17", + X"F5",X"7E",X"06",X"1A",X"67",X"50",X"F5",X"09",X"C2",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58", + X"17",X"F5",X"E3",X"00",X"56",X"E0",X"E5",X"78",X"17",X"FD",X"09",X"73",X"50",X"E5",X"47",X"17", + X"F5",X"7E",X"06",X"1A",X"67",X"50",X"E1",X"F5",X"7E",X"03",X"FD",X"5F",X"00",X"E3",X"3F",X"E3", + X"3F",X"E3",X"3F",X"E3",X"3F",X"FD",X"5F",X"01",X"F5",X"7E",X"04",X"FD",X"5F",X"02",X"E3",X"3F", + X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"FD",X"5F",X"03",X"F5",X"7E",X"05",X"FD",X"5F",X"04",X"E1", + X"E5",X"64",X"30",X"F5",X"E3",X"00",X"D6",X"E1",X"F5",X"E3",X"00",X"66",X"C2",X"64",X"30",X"F5", + X"6E",X"01",X"F5",X"4E",X"02",X"7E",X"E3",X"0F",X"11",X"96",X"17",X"E5",X"9D",X"15",X"0B",X"CD", + X"32",X"6F",X"13",X"32",X"4F",X"E9",X"98",X"17",X"9C",X"17",X"C2",X"17",X"E3",X"17",X"C9",X"17", + X"EE",X"17",X"20",X"30",X"09",X"30",X"43",X"30",X"63",X"30",X"6A",X"30",X"5E",X"30",X"82",X"30", + X"C9",X"C3",X"85",X"17",X"C9",X"7E",X"F5",X"5F",X"03",X"0B",X"7E",X"0B",X"F5",X"5F",X"04",X"C3", + X"85",X"17",X"C9",X"7E",X"F5",X"5F",X"05",X"0B",X"C3",X"85",X"17",X"C9",X"7E",X"F5",X"46",X"03", + X"80",X"F5",X"5F",X"03",X"0B",X"7E",X"0B",X"F5",X"46",X"04",X"A0",X"F5",X"5F",X"04",X"C3",X"85", + X"17",X"C9",X"7E",X"F5",X"46",X"05",X"80",X"F5",X"5F",X"05",X"0B",X"C3",X"85",X"17",X"C9",X"7E", + X"F5",X"BE",X"07",X"28",X"23",X"F5",X"1C",X"07",X"2B",X"F5",X"5D",X"01",X"F5",X"5C",X"02",X"E1", + X"F5",X"1E",X"07",X"00",X"0B",X"C3",X"85",X"17",X"F5",X"6E",X"20",X"F5",X"4E",X"21",X"D1",X"D5", + X"2B",X"5A",X"2B",X"5B",X"2B",X"1E",X"00",X"F5",X"5D",X"20",X"F5",X"5C",X"21",X"C9",X"C3",X"85", + X"17",X"D1",X"32",X"F5",X"6E",X"20",X"F5",X"4E",X"21",X"BE",X"28",X"21",X"1C",X"0B",X"76",X"0B", + X"56",X"EB",X"C3",X"85",X"17",X"0B",X"0B",X"0B",X"F5",X"5D",X"20",X"F5",X"5C",X"21",X"13",X"EB", + X"C3",X"85",X"17",X"C9",X"76",X"0B",X"56",X"EB",X"C3",X"85",X"17",X"C9",X"F5",X"CD",X"F5",X"CD", + X"C9",X"D1",X"13",X"1E",X"00",X"01",X"30",X"00",X"ED",X"98",X"32",X"F5",X"5F",X"01",X"13",X"32", + X"F5",X"5F",X"02",X"F5",X"5D",X"20",X"F5",X"5C",X"21",X"E1",X"C9",X"F5",X"5D",X"01",X"F5",X"5C", + X"02",X"F5",X"1E",X"00",X"00",X"E1",X"C9",X"76",X"0B",X"56",X"EB",X"1E",X"06",X"13",X"EB",X"C3", + X"85",X"17",X"C9",X"7E",X"F5",X"5F",X"06",X"0B",X"C3",X"85",X"17",X"1A",X"40",X"52",X"45",X"71", + X"41",X"64",X"50",X"40",X"45",X"52",X"67",X"43",X"53",X"50",X"67",X"54",X"40",X"19",X"40",X"52", + X"45",X"71",X"41",X"64",X"50",X"54",X"61",X"44",X"45",X"52",X"43",X"71",X"41",X"64",X"50",X"45", + X"45",X"52",X"46",X"40",X"66",X"61",X"67",X"43",X"40",X"54",X"52",X"45",X"53",X"66",X"61",X"52", + X"45",X"71",X"41",X"64",X"50",X"40",X"45",X"66",X"67",X"40",X"54",X"43",X"45",X"64",X"45",X"53", + X"52",X"67",X"53",X"52",X"45",X"71",X"41",X"64",X"50",X"40",X"67",X"57",X"54",X"40",X"52",X"67", + X"40",X"45",X"66",X"67",X"40",X"54",X"43",X"45",X"64",X"45",X"53",X"50",X"55",X"40",X"45",X"66", + X"67",X"40",X"52",X"45",X"71",X"41",X"64",X"50",X"50",X"55",X"40",X"67",X"57",X"54",X"40",X"52", + X"45",X"71",X"41",X"64",X"50",X"66",X"61",X"41",X"47",X"41",X"40",X"52",X"45",X"71",X"41",X"64", + X"50",X"40",X"45",X"65",X"41",X"53",X"52",X"45",X"56",X"67",X"40",X"45",X"65",X"41",X"47",X"52", + X"45",X"56",X"67",X"40",X"45",X"65",X"41",X"47",X"40",X"45",X"66",X"67",X"40",X"52",X"45",X"71", + X"41",X"64",X"50",X"45",X"65",X"41",X"46",X"40",X"46",X"67",X"40",X"64",X"64",X"41",X"60",X"45", + X"60",X"54",X"40",X"66",X"61",X"40",X"53",X"61",X"40",X"45",X"52",X"67",X"43",X"53",X"40",X"52", + X"55",X"67",X"71",X"66",X"45",X"54",X"40",X"50",X"67",X"54",X"54",X"43",X"45",X"64",X"45",X"53", + X"40",X"67",X"54",X"40",X"63",X"43",X"61",X"54",X"53",X"71",X"67",X"62",X"40",X"45",X"53",X"55", + X"66",X"67",X"54",X"54",X"55",X"42",X"40",X"44",X"45",X"45",X"50",X"53",X"40",X"44",X"66",X"41", + X"40",X"52",X"45",X"54",X"54",X"45",X"64",X"54",X"66",X"61",X"52",X"50",X"40",X"67",X"54",X"45", + X"66",X"44",X"65",X"41",X"64",X"53",X"45",X"43",X"66",X"41",X"56",X"44",X"41",X"40",X"45",X"52", + X"67",X"43",X"53",X"40",X"54",X"66",X"54",X"40",X"52",X"65",X"40",X"45",X"52",X"67",X"43",X"53", + X"40",X"40",X"53",X"66",X"67",X"61",X"54",X"43",X"45",X"53",X"52",X"45",X"54",X"66",X"61",X"52", + X"45",X"42",X"65",X"55",X"66",X"40",X"45",X"65",X"41",X"52",X"46",X"40",X"70",X"40",X"53",X"54", + X"66",X"61",X"67",X"50",X"40",X"18",X"19",X"53",X"66",X"67",X"61",X"54",X"43",X"45",X"53",X"52", + X"45",X"54",X"66",X"61",X"40",X"40",X"64",X"41",X"61",X"43",X"45",X"50",X"53",X"4C",X"4C",X"4C", + X"4C",X"40",X"40",X"40",X"45",X"52",X"67",X"43",X"53",X"40",X"71",X"41",X"64",X"50",X"40",X"19", + X"40",X"53",X"66",X"61",X"67",X"43",X"40",X"1A",X"53",X"71",X"41",X"64",X"50",X"40",X"1A",X"40", + X"40",X"66",X"61",X"67",X"43",X"40",X"19",X"40",X"71",X"41",X"64",X"50",X"40",X"19",X"40",X"40", + X"66",X"61",X"67",X"43",X"40",X"19",X"53",X"54",X"66",X"61",X"67",X"50",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"71",X"52",X"45",X"56",X"45",X"40",X"53",X"55",X"66",X"67",X"42",X"18", + X"18",X"18",X"18",X"1D",X"19",X"18",X"18",X"18",X"1D",X"1A",X"19",X"18",X"18",X"18",X"18",X"18", + X"19",X"40",X"18",X"18",X"18",X"1D",X"1F",X"53",X"43",X"61",X"54",X"53",X"67",X"66",X"47",X"41", + X"61",X"44",X"66",X"67",X"61",X"54",X"61",X"44",X"66",X"67",X"43",X"40",X"40",X"66",X"67",X"61", + X"54",X"41",X"43",X"67",X"64",X"40",X"40",X"65",X"67",X"52",X"44",X"67",X"67",X"47",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"44",X"1F",X"40",X"40",X"40",X"40",X"40",X"40",X"19",X"44",X"67", + X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"46",X"1F",X"40",X"40",X"40",X"40",X"40", + X"40",X"1A",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"60",X"1F",X"40", + X"40",X"40",X"40",X"40",X"40",X"1B",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"62",X"1F",X"40",X"40",X"40",X"40",X"40",X"40",X"1C",X"44",X"67",X"67",X"47",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"60",X"1C",X"40",X"40",X"40",X"40",X"40",X"40",X"19",X"44",X"67", + X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"64",X"1C",X"40",X"40",X"40",X"40",X"40", + X"40",X"1A",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"62",X"1C",X"40", + X"40",X"40",X"40",X"40",X"40",X"1B",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"65",X"1C",X"40",X"40",X"40",X"40",X"40",X"40",X"1C",X"44",X"67",X"67",X"47",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"63",X"1C",X"40",X"40",X"40",X"40",X"40",X"40",X"1D",X"44",X"67", + X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"66",X"1C",X"40",X"40",X"40",X"40",X"40", + X"40",X"1E",X"44",X"41",X"42",X"40",X"66",X"67",X"61",X"54",X"61",X"44",X"66",X"67",X"43",X"40", + X"40",X"66",X"67",X"61",X"54",X"41",X"43",X"67",X"64",X"40",X"40",X"65",X"41",X"52",X"00",X"01", + X"02",X"03",X"04",X"05",X"06",X"07",X"20",X"21",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"60", + X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"70", + X"71",X"72",X"72",X"71",X"70",X"57",X"56",X"55",X"54",X"53",X"52",X"51",X"50",X"67",X"66",X"65", + X"64",X"63",X"62",X"61",X"60",X"47",X"46",X"45",X"44",X"43",X"42",X"41",X"00",X"01",X"04",X"02", + X"94",X"42",X"95",X"42",X"96",X"42",X"97",X"42",X"B0",X"42",X"B1",X"42",X"B2",X"42",X"B3",X"42", + X"B4",X"42",X"B5",X"42",X"03",X"02",X"01",X"00",X"00",X"80",X"48",X"40",X"09",X"F5",X"65",X"E3", + X"46",X"08",X"11",X"E3",X"C6",X"3A",X"2C",X"66",X"2A",X"0F",X"66",X"06",X"10",X"76",X"0B",X"56", + X"12",X"0B",X"10",X"F9",X"00",X"3E",X"04",X"1A",X"15",X"66",X"3A",X"29",X"66",X"1A",X"16",X"66", + X"09",X"DA",X"0E",X"11",X"17",X"66",X"01",X"04",X"00",X"ED",X"98",X"FD",X"09",X"A1",X"64",X"FD", + X"7E",X"07",X"CE",X"C8",X"47",X"3A",X"F8",X"64",X"CE",X"37",X"98",X"FD",X"5F",X"07",X"2A",X"11", + X"66",X"0A",X"27",X"66",X"09",X"F8",X"65",X"E5",X"3F",X"37",X"09",X"00",X"00",X"0A",X"27",X"66", + X"3A",X"13",X"66",X"1A",X"15",X"66",X"3A",X"14",X"66",X"1A",X"16",X"66",X"09",X"DE",X"0E",X"11", + X"17",X"66",X"01",X"04",X"00",X"ED",X"98",X"3A",X"33",X"66",X"FE",X"9D",X"28",X"0D",X"FE",X"3C", + X"28",X"22",X"FE",X"78",X"28",X"25",X"FE",X"9C",X"28",X"10",X"30",X"13",X"09",X"58",X"64",X"E3", + X"DE",X"30",X"24",X"09",X"78",X"64",X"E3",X"DE",X"30",X"05",X"09",X"80",X"64",X"E3",X"DE",X"3C", + X"1A",X"33",X"66",X"00",X"F5",X"09",X"A1",X"64",X"FD",X"09",X"49",X"64",X"E5",X"22",X"0F",X"09", + X"FB",X"65",X"E5",X"3F",X"37",X"F5",X"09",X"A1",X"64",X"FD",X"09",X"69",X"64",X"E5",X"22",X"0F", + X"09",X"FE",X"65",X"E5",X"3F",X"37",X"F5",X"09",X"A1",X"64",X"FD",X"09",X"59",X"64",X"E5",X"22", + X"0F",X"09",X"01",X"66",X"E5",X"3F",X"37",X"F5",X"09",X"A1",X"64",X"FD",X"09",X"79",X"64",X"E5", + X"22",X"0F",X"09",X"04",X"66",X"E5",X"3F",X"37",X"F5",X"09",X"A1",X"64",X"FD",X"09",X"81",X"64", + X"E5",X"22",X"0F",X"09",X"07",X"66",X"E5",X"3F",X"37",X"3A",X"2B",X"66",X"3C",X"1A",X"2B",X"66", + X"FE",X"04",X"08",X"2C",X"AF",X"1A",X"2B",X"66",X"3A",X"2A",X"66",X"47",X"FE",X"02",X"28",X"35", + X"3C",X"1A",X"2A",X"66",X"3A",X"2C",X"66",X"80",X"67",X"2A",X"0F",X"66",X"06",X"10",X"76",X"0B", + X"56",X"0B",X"32",X"FE",X"4E",X"38",X"02",X"79",X"12",X"10",X"DB",X"30",X"03",X"AF",X"30",X"C9", + X"00",X"3A",X"84",X"64",X"FE",X"00",X"28",X"12",X"3A",X"0E",X"66",X"3C",X"1A",X"0E",X"66",X"FE", + X"1A",X"08",X"07",X"AF",X"1A",X"84",X"64",X"1A",X"0E",X"66",X"3A",X"0A",X"66",X"FE",X"04",X"08", + X"0A",X"AF",X"1A",X"0A",X"66",X"3A",X"18",X"40",X"47",X"3A",X"2F",X"40",X"67",X"3A",X"0B",X"66", + X"1A",X"18",X"40",X"3A",X"0C",X"66",X"1A",X"2F",X"40",X"78",X"1A",X"0B",X"66",X"79",X"1A",X"0C", + X"66",X"30",X"04",X"3C",X"1A",X"0A",X"66",X"3A",X"0D",X"66",X"FE",X"FF",X"E2",X"26",X"36",X"FE", + X"10",X"C2",X"29",X"36",X"3C",X"1A",X"0D",X"66",X"3A",X"4C",X"64",X"1A",X"2F",X"66",X"3A",X"6C", + X"64",X"1A",X"18",X"66",X"3A",X"5C",X"64",X"1A",X"19",X"66",X"3A",X"7C",X"64",X"1A",X"1A",X"66", + X"3A",X"84",X"64",X"1A",X"1B",X"66",X"3A",X"A4",X"64",X"1A",X"1C",X"66",X"AF",X"1A",X"4C",X"64", + X"1A",X"6C",X"64",X"1A",X"5C",X"64",X"1A",X"7C",X"64",X"1A",X"84",X"64",X"1A",X"A4",X"64",X"06", + X"34",X"09",X"66",X"40",X"11",X"1D",X"66",X"C5",X"01",X"05",X"00",X"ED",X"98",X"3E",X"33",X"E5", + X"98",X"15",X"C1",X"10",X"DA",X"3A",X"40",X"44",X"1A",X"C1",X"66",X"11",X"66",X"40",X"09",X"CB", + X"36",X"3E",X"05",X"06",X"34",X"E5",X"EB",X"15",X"11",X"66",X"44",X"09",X"3E",X"37",X"3E",X"05", + X"06",X"34",X"E5",X"EB",X"15",X"11",X"6F",X"40",X"09",X"CC",X"36",X"3E",X"01",X"06",X"32",X"E5", + X"D5",X"15",X"11",X"11",X"41",X"09",X"FE",X"36",X"3E",X"01",X"06",X"10",X"E5",X"D5",X"15",X"3E", + X"78",X"E5",X"B3",X"15",X"11",X"66",X"44",X"09",X"C1",X"66",X"3E",X"05",X"06",X"34",X"E5",X"EB", + X"15",X"06",X"34",X"09",X"1D",X"66",X"11",X"66",X"40",X"C5",X"01",X"05",X"00",X"ED",X"98",X"3E", + X"33",X"E5",X"9D",X"15",X"C1",X"10",X"DA",X"3A",X"2F",X"66",X"1A",X"4C",X"64",X"3A",X"18",X"66", + X"1A",X"6C",X"64",X"3A",X"19",X"66",X"1A",X"5C",X"64",X"3A",X"1A",X"66",X"1A",X"7C",X"64",X"3A", + X"1B",X"66",X"1A",X"84",X"64",X"3A",X"1C",X"66",X"1A",X"A4",X"64",X"C3",X"29",X"36",X"AF",X"1A", + X"4A",X"64",X"1A",X"6A",X"64",X"1A",X"5A",X"64",X"1A",X"7A",X"64",X"1A",X"82",X"64",X"1A",X"A2", + X"64",X"09",X"59",X"65",X"E3",X"E6",X"C3",X"E0",X"36",X"3A",X"90",X"64",X"E3",X"6F",X"C2",X"CA", + X"36",X"E3",X"5F",X"08",X"10",X"09",X"96",X"64",X"E3",X"E6",X"3E",X"40",X"1A",X"2F",X"40",X"1A", + X"18",X"40",X"C3",X"CA",X"36",X"3A",X"68",X"64",X"47",X"3A",X"58",X"64",X"98",X"47",X"3A",X"78", + X"64",X"98",X"47",X"3A",X"80",X"64",X"98",X"47",X"3A",X"A0",X"64",X"98",X"E3",X"5F",X"C2",X"CA", + X"36",X"47",X"AF",X"1A",X"A2",X"64",X"09",X"59",X"65",X"E3",X"E6",X"09",X"A4",X"65",X"E3",X"E6", + X"E3",X"68",X"08",X"6E",X"AF",X"1A",X"A4",X"64",X"3A",X"40",X"44",X"1A",X"C1",X"66",X"11",X"66", + X"40",X"09",X"CB",X"36",X"3E",X"05",X"06",X"34",X"E5",X"EB",X"15",X"11",X"66",X"44",X"09",X"3E", + X"37",X"3E",X"05",X"06",X"34",X"E5",X"EB",X"15",X"11",X"2F",X"41",X"09",X"26",X"37",X"3E",X"01", + X"06",X"27",X"E5",X"D5",X"15",X"11",X"D1",X"40",X"09",X"35",X"37",X"3E",X"01",X"06",X"14",X"E5", + X"D5",X"15",X"3E",X"78",X"E5",X"B3",X"15",X"11",X"66",X"44",X"09",X"C1",X"66",X"3E",X"05",X"06", + X"34",X"E5",X"EB",X"15",X"AF",X"1A",X"84",X"64",X"3A",X"84",X"64",X"FE",X"00",X"08",X"13",X"09", + X"96",X"64",X"E3",X"F6",X"E3",X"E6",X"AF",X"1A",X"33",X"66",X"3E",X"40",X"1A",X"2F",X"40",X"1A", + X"18",X"40",X"E1",X"40",X"45",X"53",X"55",X"46",X"40",X"71",X"42",X"40",X"44",X"45",X"66",X"52", + X"55",X"42",X"40",X"54",X"45",X"47",X"52",X"41",X"54",X"40",X"54",X"53",X"41",X"64",X"66",X"55", + X"52",X"40",X"54",X"53",X"55",X"65",X"40",X"55",X"67",X"71",X"40",X"57",X"67",X"66",X"53",X"66", + X"67",X"61",X"54",X"41",X"64",X"55",X"54",X"41",X"52",X"47",X"66",X"67",X"43",X"54",X"55",X"67", + X"40",X"44",X"45",X"66",X"52",X"55",X"42",X"40",X"53",X"45",X"53",X"55",X"46",X"40",X"64",X"64", + X"41",X"71",X"52",X"52",X"67",X"53",X"44",X"66",X"45",X"40",X"44",X"41",X"45",X"44",X"21",X"F5", + X"2A",X"DE",X"65",X"FD",X"E3",X"07",X"6E",X"C2",X"5B",X"0B",X"FD",X"E3",X"07",X"5E",X"E0",X"7E", + X"E3",X"BF",X"E3",X"9F",X"FE",X"03",X"E2",X"0F",X"0B",X"3C",X"47",X"7E",X"CE",X"C0",X"98",X"5F", + X"3E",X"DB",X"FD",X"46",X"03",X"90",X"1A",X"75",X"64",X"FD",X"7E",X"04",X"D6",X"24",X"1A",X"74", + X"64",X"CD",X"E5",X"BD",X"26",X"C9",X"3A",X"22",X"64",X"FE",X"00",X"C2",X"20",X"0B",X"3A",X"23", + X"64",X"FE",X"00",X"C2",X"20",X"0B",X"E3",X"5E",X"C2",X"00",X"0B",X"E3",X"DE",X"32",X"1A",X"22", + X"66",X"D5",X"33",X"32",X"1A",X"23",X"66",X"13",X"13",X"32",X"1A",X"24",X"66",X"3E",X"09",X"E5", + X"E1",X"15",X"32",X"1A",X"25",X"66",X"3E",X"40",X"E5",X"9D",X"15",X"32",X"1A",X"26",X"66",X"D1", + X"E3",X"7E",X"C2",X"B7",X"08",X"3A",X"C2",X"66",X"FE",X"00",X"E2",X"B7",X"08",X"FE",X"01",X"28", + X"02",X"30",X"56",X"3A",X"90",X"64",X"E3",X"47",X"28",X"07",X"E3",X"77",X"28",X"0F",X"E3",X"9E", + X"E1",X"FD",X"46",X"00",X"FD",X"1E",X"00",X"02",X"3A",X"30",X"66",X"FD",X"5F",X"05",X"AF",X"1A", + X"C2",X"66",X"78",X"FE",X"04",X"28",X"07",X"F5",X"7E",X"02",X"12",X"C3",X"6B",X"0A",X"F5",X"7E", + X"03",X"12",X"C3",X"6B",X"0A",X"FD",X"46",X"00",X"FD",X"1E",X"00",X"03",X"3A",X"17",X"66",X"FD", + X"5F",X"05",X"AF",X"1A",X"C2",X"66",X"78",X"FE",X"04",X"28",X"07",X"F5",X"7E",X"04",X"12",X"C3", + X"6B",X"0A",X"F5",X"7E",X"05",X"12",X"C3",X"6B",X"0A",X"3A",X"90",X"64",X"E3",X"67",X"28",X"07", + X"E3",X"57",X"28",X"0F",X"E3",X"9E",X"E1",X"FD",X"46",X"00",X"FD",X"1E",X"00",X"05",X"3A",X"31", + X"66",X"FD",X"5F",X"05",X"AF",X"1A",X"C2",X"66",X"78",X"FE",X"02",X"28",X"07",X"F5",X"7E",X"03", + X"12",X"C3",X"41",X"09",X"F5",X"7E",X"05",X"12",X"C3",X"41",X"09",X"FD",X"46",X"00",X"FD",X"1E", + X"00",X"04",X"3A",X"32",X"66",X"FD",X"5F",X"05",X"AF",X"1A",X"C2",X"66",X"78",X"FE",X"02",X"28", + X"07",X"F5",X"7E",X"02",X"12",X"C3",X"41",X"09",X"F5",X"7E",X"04",X"12",X"C3",X"41",X"09",X"FD", + X"E3",X"07",X"46",X"C0",X"AF",X"1A",X"C2",X"66",X"C3",X"6B",X"0A",X"FD",X"E3",X"07",X"76",X"C0", + X"AF",X"1A",X"C2",X"66",X"C3",X"6B",X"0A",X"FD",X"E3",X"07",X"56",X"C0",X"AF",X"1A",X"C2",X"66", + X"C3",X"41",X"09",X"FD",X"E3",X"07",X"66",X"C0",X"AF",X"1A",X"C2",X"66",X"C3",X"41",X"09",X"FD", + X"7E",X"00",X"FE",X"02",X"E2",X"D6",X"09",X"FE",X"03",X"E2",X"D6",X"09",X"FD",X"E3",X"07",X"46", + X"08",X"2F",X"3A",X"22",X"66",X"F5",X"BE",X"01",X"E2",X"C3",X"08",X"FE",X"4E",X"F2",X"52",X"09", + X"E5",X"E1",X"0F",X"E5",X"33",X"28",X"FD",X"7E",X"00",X"FE",X"05",X"28",X"22",X"F5",X"7E",X"03", + X"1A",X"22",X"66",X"12",X"C3",X"99",X"09",X"F5",X"7E",X"02",X"1A",X"22",X"66",X"12",X"C3",X"99", + X"09",X"FD",X"E3",X"07",X"76",X"E2",X"06",X"09",X"3A",X"22",X"66",X"F5",X"BE",X"01",X"E2",X"F9", + X"08",X"FE",X"4E",X"F2",X"52",X"09",X"E5",X"E1",X"0F",X"E5",X"33",X"28",X"F5",X"7E",X"07",X"1A", + X"22",X"66",X"12",X"C3",X"83",X"09",X"3A",X"22",X"66",X"F5",X"BE",X"01",X"28",X"20",X"FE",X"4E", + X"F2",X"52",X"09",X"E5",X"E1",X"0F",X"E5",X"33",X"28",X"FD",X"7E",X"00",X"FE",X"05",X"28",X"29", + X"F5",X"7E",X"05",X"1A",X"22",X"66",X"12",X"3A",X"17",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00", + X"03",X"3A",X"24",X"66",X"F5",X"BE",X"00",X"E2",X"EC",X"0C",X"C3",X"39",X"0D",X"FD",X"E3",X"07", + X"FE",X"FD",X"0A",X"91",X"64",X"E5",X"F1",X"24",X"E1",X"F5",X"7E",X"04",X"1A",X"22",X"66",X"12", + X"30",X"D5",X"FD",X"7E",X"00",X"FE",X"05",X"28",X"11",X"3A",X"22",X"66",X"F5",X"BE",X"02",X"08", + X"13",X"F5",X"7E",X"20",X"1A",X"22",X"66",X"12",X"30",X"BD",X"3A",X"22",X"66",X"F5",X"BE",X"03", + X"08",X"02",X"30",X"ED",X"3A",X"22",X"66",X"F5",X"BE",X"06",X"08",X"37",X"F5",X"7E",X"20",X"1A", + X"22",X"66",X"12",X"FD",X"7E",X"00",X"FE",X"05",X"28",X"24",X"3A",X"25",X"66",X"F5",X"BE",X"00", + X"E2",X"D6",X"0C",X"C3",X"41",X"09",X"3A",X"26",X"66",X"30",X"DA",X"FD",X"7E",X"00",X"FE",X"05", + X"28",X"0D",X"3A",X"22",X"66",X"F5",X"BE",X"04",X"08",X"0F",X"F5",X"7E",X"20",X"1A",X"22",X"66", + X"12",X"3A",X"30",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00",X"02",X"3A",X"23",X"66",X"F5",X"BE", + X"00",X"E2",X"8E",X"0C",X"C3",X"34",X"0D",X"3A",X"22",X"66",X"F5",X"BE",X"05",X"08",X"02",X"30", + X"F1",X"FD",X"E3",X"07",X"EE",X"E1",X"FD",X"E3",X"07",X"56",X"08",X"2F",X"3A",X"22",X"66",X"F5", + X"BE",X"01",X"E2",X"ED",X"09",X"FE",X"4E",X"F2",X"7C",X"0A",X"E5",X"E1",X"0F",X"E5",X"33",X"28", + X"FD",X"7E",X"00",X"FE",X"03",X"28",X"22",X"F5",X"7E",X"04",X"1A",X"22",X"66",X"12",X"C3",X"F3", + X"0A",X"F5",X"7E",X"02",X"1A",X"22",X"66",X"12",X"C3",X"F3",X"0A",X"FD",X"E3",X"07",X"66",X"E2", + X"18",X"0A",X"3A",X"22",X"66",X"F5",X"BE",X"01",X"E2",X"0B",X"0A",X"FE",X"4E",X"F2",X"7C",X"0A", + X"E5",X"E1",X"0F",X"E5",X"33",X"28",X"F5",X"7E",X"06",X"1A",X"22",X"66",X"12",X"C3",X"AD",X"0A", + X"3A",X"22",X"66",X"F5",X"BE",X"01",X"28",X"20",X"FE",X"4E",X"F2",X"7C",X"0A",X"E5",X"E1",X"0F", + X"E5",X"33",X"28",X"FD",X"7E",X"00",X"FE",X"03",X"28",X"29",X"F5",X"7E",X"05",X"1A",X"22",X"66", + X"12",X"3A",X"31",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00",X"05",X"3A",X"26",X"66",X"F5",X"BE", + X"00",X"E2",X"B4",X"0D",X"C3",X"E9",X"0D",X"FD",X"E3",X"07",X"FE",X"FD",X"0A",X"91",X"64",X"E5", + X"F1",X"24",X"E1",X"F5",X"7E",X"03",X"1A",X"22",X"66",X"12",X"30",X"D5",X"FD",X"7E",X"00",X"FE", + X"03",X"28",X"11",X"3A",X"22",X"66",X"F5",X"BE",X"02",X"08",X"13",X"F5",X"7E",X"20",X"1A",X"22", + X"66",X"12",X"30",X"BD",X"3A",X"22",X"66",X"F5",X"BE",X"04",X"08",X"02",X"30",X"ED",X"3A",X"22", + X"66",X"F5",X"BE",X"07",X"08",X"37",X"F5",X"7E",X"20",X"1A",X"22",X"66",X"12",X"FD",X"7E",X"00", + X"FE",X"03",X"28",X"24",X"3A",X"23",X"66",X"F5",X"BE",X"00",X"E2",X"86",X"0D",X"C3",X"6B",X"0A", + X"3A",X"24",X"66",X"30",X"DA",X"FD",X"7E",X"00",X"FE",X"03",X"28",X"0D",X"3A",X"22",X"66",X"F5", + X"BE",X"03",X"08",X"0F",X"F5",X"7E",X"20",X"1A",X"22",X"66",X"12",X"3A",X"32",X"66",X"FD",X"5F", + X"05",X"FD",X"1E",X"00",X"04",X"3A",X"25",X"66",X"F5",X"BE",X"00",X"E2",X"56",X"0D",X"C3",X"E4", + X"0D",X"3A",X"22",X"66",X"F5",X"BE",X"05",X"08",X"02",X"30",X"F1",X"FD",X"E3",X"07",X"EE",X"E1", + X"FD",X"0A",X"91",X"64",X"E5",X"F1",X"24",X"E1",X"E3",X"9E",X"E3",X"7E",X"08",X"DA",X"3A",X"C2", + X"66",X"FE",X"00",X"28",X"EB",X"FE",X"03",X"E2",X"6F",X"08",X"FE",X"04",X"E2",X"7B",X"08",X"FE", + X"05",X"E2",X"87",X"08",X"C3",X"93",X"08",X"3E",X"C0",X"8E",X"5F",X"E3",X"7F",X"08",X"36",X"FD", + X"7E",X"01",X"FE",X"00",X"E0",X"FD",X"E3",X"07",X"4E",X"C2",X"56",X"0B",X"3A",X"15",X"66",X"FD", + X"46",X"01",X"B8",X"E2",X"48",X"37",X"05",X"FD",X"58",X"01",X"C3",X"48",X"37",X"E5",X"B8",X"0F", + X"FD",X"E3",X"07",X"7E",X"08",X"11",X"3A",X"16",X"66",X"FD",X"46",X"01",X"B8",X"E2",X"48",X"37", + X"04",X"FD",X"58",X"01",X"C3",X"48",X"37",X"FD",X"E3",X"07",X"BE",X"3A",X"15",X"66",X"FD",X"5F", + X"01",X"30",X"CB",X"0B",X"7E",X"FE",X"02",X"08",X"31",X"1E",X"00",X"0B",X"7E",X"FE",X"00",X"28", + X"13",X"FE",X"27",X"E2",X"CF",X"0E",X"1C",X"09",X"FA",X"0E",X"E5",X"98",X"15",X"7E",X"FD",X"5F", + X"05",X"E1",X"1C",X"E1",X"1C",X"2B",X"2B",X"FD",X"E3",X"07",X"9E",X"E3",X"7E",X"28",X"26",X"3A", + X"08",X"65",X"FE",X"00",X"08",X"C9",X"09",X"3B",X"65",X"E3",X"C6",X"30",X"F2",X"09",X"56",X"65", + X"E3",X"C6",X"09",X"68",X"64",X"E3",X"9E",X"09",X"58",X"64",X"E3",X"9E",X"09",X"78",X"64",X"E3", + X"9E",X"09",X"80",X"64",X"E3",X"9E",X"09",X"A0",X"64",X"E3",X"9E",X"09",X"90",X"64",X"E3",X"AE", + X"E3",X"9E",X"3E",X"9D",X"1A",X"33",X"66",X"E5",X"22",X"16",X"3E",X"17",X"E5",X"FD",X"14",X"3E", + X"14",X"E5",X"25",X"15",X"3E",X"02",X"E5",X"B3",X"15",X"3E",X"14",X"E5",X"FD",X"14",X"3E",X"03", + X"E5",X"B3",X"15",X"3E",X"17",X"E5",X"FD",X"14",X"3E",X"02",X"E5",X"B3",X"15",X"3E",X"14",X"E5", + X"FD",X"14",X"3E",X"03",X"E5",X"B3",X"15",X"3E",X"17",X"E5",X"FD",X"14",X"3E",X"02",X"E5",X"B3", + X"15",X"3E",X"14",X"E5",X"FD",X"14",X"09",X"96",X"64",X"E3",X"46",X"E0",X"3E",X"90",X"E5",X"B3", + X"15",X"C3",X"78",X"0C",X"09",X"87",X"0E",X"E5",X"19",X"2C",X"3E",X"01",X"E5",X"B3",X"15",X"E5", + X"81",X"0C",X"3A",X"4C",X"64",X"FE",X"00",X"08",X"D9",X"3A",X"98",X"64",X"FE",X"00",X"08",X"10", + X"3A",X"8E",X"64",X"FE",X"00",X"08",X"21",X"3A",X"8F",X"64",X"FE",X"00",X"08",X"02",X"30",X"28", + X"09",X"A4",X"65",X"E3",X"C6",X"3E",X"18",X"E5",X"B3",X"15",X"09",X"9F",X"0E",X"E5",X"19",X"2C", + X"3E",X"01",X"E5",X"B3",X"15",X"E5",X"81",X"0C",X"09",X"81",X"64",X"0A",X"91",X"64",X"E5",X"F1", + X"24",X"3A",X"4C",X"64",X"FE",X"EC",X"08",X"E8",X"E5",X"22",X"16",X"09",X"90",X"64",X"E3",X"AE", + X"E1",X"09",X"49",X"64",X"0A",X"91",X"64",X"E5",X"F1",X"24",X"09",X"69",X"64",X"0A",X"91",X"64", + X"E5",X"F1",X"24",X"09",X"59",X"64",X"0A",X"91",X"64",X"E5",X"F1",X"24",X"09",X"79",X"64",X"0A", + X"91",X"64",X"E5",X"F1",X"24",X"E1",X"E3",X"7E",X"C2",X"D1",X"09",X"3A",X"22",X"66",X"F5",X"BE", + X"20",X"E2",X"39",X"0E",X"F5",X"BE",X"03",X"08",X"11",X"3A",X"32",X"66",X"FD",X"5F",X"05",X"FD", + X"1E",X"00",X"04",X"F5",X"7E",X"07",X"12",X"C3",X"41",X"09",X"3A",X"31",X"66",X"FD",X"5F",X"05", + X"FD",X"1E",X"00",X"05",X"30",X"ED",X"E3",X"7E",X"C2",X"D1",X"09",X"3A",X"22",X"66",X"F5",X"BE", + X"20",X"E2",X"39",X"0E",X"3E",X"01",X"1A",X"C2",X"66",X"E3",X"9E",X"E1",X"E3",X"7E",X"C2",X"D1", + X"09",X"3A",X"22",X"66",X"F5",X"BE",X"20",X"E2",X"39",X"0E",X"F5",X"BE",X"05",X"08",X"11",X"3A", + X"32",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00",X"04",X"F5",X"7E",X"07",X"12",X"C3",X"41",X"09", + X"3A",X"31",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00",X"05",X"30",X"ED",X"E3",X"7E",X"C2",X"3D", + X"09",X"3A",X"22",X"66",X"F5",X"BE",X"20",X"C2",X"41",X"09",X"FD",X"E3",X"07",X"46",X"E2",X"41", + X"09",X"3E",X"03",X"1A",X"C2",X"66",X"C3",X"41",X"09",X"E3",X"7E",X"C2",X"3D",X"09",X"3A",X"22", + X"66",X"F5",X"BE",X"20",X"C2",X"41",X"09",X"FD",X"E3",X"07",X"76",X"E2",X"41",X"09",X"3E",X"04", + X"1A",X"C2",X"66",X"C3",X"41",X"09",X"E3",X"7E",X"C2",X"FB",X"0A",X"3A",X"22",X"66",X"F5",X"BE", + X"20",X"E2",X"39",X"0E",X"F5",X"BE",X"04",X"08",X"11",X"3A",X"30",X"66",X"FD",X"5F",X"05",X"FD", + X"1E",X"00",X"02",X"F5",X"7E",X"06",X"12",X"C3",X"6B",X"0A",X"3A",X"17",X"66",X"FD",X"5F",X"05", + X"FD",X"1E",X"00",X"03",X"30",X"ED",X"E3",X"7E",X"C2",X"FB",X"0A",X"3A",X"22",X"66",X"F5",X"BE", + X"20",X"E2",X"39",X"0E",X"3E",X"02",X"1A",X"C2",X"66",X"E3",X"9E",X"E1",X"E3",X"7E",X"C2",X"FB", + X"0A",X"3A",X"22",X"66",X"F5",X"BE",X"20",X"E2",X"39",X"0E",X"F5",X"BE",X"05",X"08",X"11",X"3A", + X"30",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00",X"02",X"F5",X"7E",X"06",X"12",X"C3",X"6B",X"0A", + X"3A",X"17",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00",X"03",X"30",X"ED",X"E3",X"7E",X"C2",X"4F", + X"0A",X"3A",X"22",X"66",X"F5",X"BE",X"20",X"C2",X"6B",X"0A",X"FD",X"E3",X"07",X"56",X"E2",X"6B", + X"0A",X"3E",X"05",X"1A",X"C2",X"66",X"C3",X"6B",X"0A",X"E3",X"7E",X"C2",X"4F",X"0A",X"3A",X"22", + X"66",X"F5",X"BE",X"20",X"C2",X"6B",X"0A",X"FD",X"E3",X"07",X"66",X"E2",X"6B",X"0A",X"3E",X"06", + X"1A",X"C2",X"66",X"C3",X"6B",X"0A",X"FD",X"7E",X"07",X"47",X"FD",X"7E",X"00",X"FE",X"02",X"28", + X"10",X"FE",X"03",X"28",X"14",X"FE",X"05",X"28",X"30",X"E3",X"60",X"E2",X"3C",X"0B",X"C3",X"56", + X"0B",X"E3",X"70",X"E2",X"3C",X"0B",X"C3",X"56",X"0B",X"E3",X"40",X"E2",X"3C",X"0B",X"C3",X"56", + X"0B",X"E3",X"50",X"E2",X"3C",X"0B",X"C3",X"56",X"0B",X"11",X"2E",X"41",X"09",X"CB",X"36",X"3E", + X"05",X"06",X"26",X"E5",X"EB",X"15",X"11",X"2E",X"45",X"09",X"3E",X"37",X"3E",X"05",X"06",X"26", + X"E5",X"EB",X"15",X"AF",X"1A",X"4C",X"64",X"1A",X"6C",X"64",X"1A",X"5C",X"64",X"1A",X"7C",X"64", + X"1A",X"84",X"64",X"11",X"E7",X"41",X"09",X"19",X"37",X"3E",X"01",X"06",X"05",X"E5",X"D5",X"15", + X"11",X"91",X"41",X"09",X"1E",X"37",X"3E",X"01",X"06",X"20",X"E5",X"D5",X"15",X"3E",X"78",X"E5", + X"B3",X"15",X"FD",X"E3",X"07",X"EE",X"E1",X"05",X"08",X"00",X"C8",X"58",X"42",X"21",X"00",X"05", + X"08",X"00",X"D8",X"58",X"3E",X"21",X"00",X"05",X"08",X"00",X"F7",X"48",X"3A",X"21",X"00",X"05", + X"08",X"00",X"EF",X"48",X"1E",X"21",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"08",X"00",X"02",X"58",X"2E",X"21",X"00",X"04", + X"08",X"00",X"12",X"58",X"2A",X"21",X"00",X"04",X"08",X"00",X"01",X"48",X"0E",X"21",X"00",X"04", + X"08",X"00",X"11",X"48",X"0A",X"21",X"00",X"04",X"08",X"00",X"FA",X"80",X"1A",X"21",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1E",X"00",X"FD",X"E3",X"07",X"AE",X"FD",X"1E",X"03", + X"00",X"E1",X"14",X"10",X"24",X"26",X"30",X"30",X"30",X"30",X"30",X"34",X"30",X"34",X"30",X"34", + X"30",X"34",X"30",X"34",X"30",X"34",X"30",X"34",X"30",X"34",X"FD",X"E3",X"07",X"5E",X"E0",X"FD", + X"7E",X"00",X"FE",X"04",X"F2",X"7B",X"0F",X"F5",X"7E",X"03",X"FD",X"BE",X"03",X"F2",X"68",X"0F", + X"E2",X"7B",X"0F",X"FD",X"7E",X"00",X"FE",X"05",X"E2",X"B2",X"0F",X"FD",X"7E",X"07",X"DE",X"37", + X"CE",X"FB",X"FD",X"5F",X"07",X"F5",X"7E",X"03",X"FD",X"46",X"03",X"90",X"FE",X"05",X"38",X"05", + X"FE",X"FB",X"18",X"01",X"E1",X"F5",X"7E",X"04",X"FD",X"46",X"04",X"90",X"FE",X"05",X"38",X"05", + X"FE",X"FB",X"18",X"01",X"E1",X"F5",X"E3",X"07",X"EE",X"FD",X"E3",X"07",X"EE",X"E1",X"FD",X"7E", + X"03",X"F5",X"BE",X"03",X"38",X"C5",X"30",X"07",X"FD",X"7E",X"00",X"FE",X"04",X"28",X"2B",X"FD", + X"7E",X"07",X"DE",X"37",X"CE",X"FD",X"FD",X"5F",X"07",X"30",X"BA",X"F5",X"7E",X"04",X"FD",X"BE", + X"04",X"38",X"09",X"E2",X"17",X"0F",X"FD",X"7E",X"00",X"FE",X"02",X"28",X"D1",X"FD",X"7E",X"07", + X"DE",X"37",X"CE",X"DF",X"FD",X"5F",X"07",X"C3",X"1D",X"0F",X"FD",X"7E",X"04",X"F5",X"BE",X"04", + X"38",X"EB",X"30",X"07",X"FD",X"7E",X"00",X"FE",X"03",X"28",X"9B",X"FD",X"7E",X"07",X"DE",X"37", + X"CE",X"FE",X"FD",X"5F",X"07",X"C3",X"1D",X"0F",X"FD",X"7E",X"05",X"FE",X"30",X"28",X"05",X"FD", + X"1E",X"05",X"30",X"E1",X"FD",X"1E",X"05",X"34",X"E1",X"3A",X"0D",X"66",X"3C",X"1A",X"0D",X"66", + X"E3",X"7E",X"C0",X"2A",X"93",X"64",X"7E",X"09",X"27",X"28",X"E5",X"98",X"15",X"7E",X"1A",X"86", + X"64",X"3A",X"A4",X"64",X"1A",X"84",X"64",X"3A",X"A5",X"64",X"1A",X"85",X"64",X"D5",X"0B",X"76", + X"0B",X"56",X"2A",X"AE",X"64",X"31",X"0A",X"AE",X"64",X"D1",X"09",X"8F",X"65",X"E3",X"C6",X"AF", + X"1A",X"0E",X"66",X"3A",X"0D",X"66",X"FE",X"10",X"C0",X"3E",X"FF",X"1A",X"0D",X"66",X"E1",X"44", + X"00",X"10",X"60",X"00",X"08",X"64",X"00",X"40",X"50",X"00",X"80",X"D5",X"CD",X"2A",X"27",X"66", + X"ED",X"73",X"AE",X"64",X"31",X"0A",X"AE",X"64",X"C9",X"D1",X"E1",X"F5",X"09",X"FC",X"2D",X"F5", + X"0A",X"DE",X"65",X"09",X"6A",X"2F",X"3E",X"32",X"E5",X"C6",X"2B",X"E5",X"9F",X"18",X"3E",X"84", + X"09",X"06",X"2B",X"E5",X"D5",X"2C",X"09",X"10",X"00",X"0A",X"11",X"66",X"3E",X"02",X"1A",X"13", + X"66",X"3E",X"05",X"1A",X"14",X"66",X"3E",X"26",X"1A",X"29",X"66",X"09",X"F4",X"2C",X"E5",X"19", + X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE",X"65",X"09",X"48",X"2E", + X"3E",X"31",X"E5",X"C6",X"2B",X"E5",X"10",X"19",X"3E",X"87",X"09",X"0E",X"2B",X"E5",X"D5",X"2C", + X"09",X"08",X"00",X"0A",X"11",X"66",X"3E",X"04",X"1A",X"13",X"66",X"3E",X"07",X"1A",X"14",X"66", + X"3E",X"26",X"1A",X"29",X"66",X"09",X"24",X"2D",X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5", + X"09",X"05",X"2E",X"F5",X"0A",X"DE",X"65",X"09",X"DF",X"2E",X"3E",X"11",X"E5",X"C6",X"2B",X"E5", + X"39",X"19",X"3E",X"6C",X"09",X"46",X"2B",X"E5",X"D5",X"2C",X"09",X"18",X"00",X"0A",X"11",X"66", + X"3E",X"06",X"1A",X"13",X"66",X"3E",X"21",X"1A",X"14",X"66",X"3E",X"26",X"1A",X"29",X"66",X"09", + X"3C",X"2D",X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE", + X"65",X"09",X"95",X"18",X"3E",X"26",X"E5",X"C6",X"2B",X"E5",X"86",X"19",X"3E",X"78",X"09",X"4E", + X"2B",X"E5",X"D5",X"2C",X"09",X"40",X"00",X"0A",X"11",X"66",X"3E",X"20",X"1A",X"13",X"66",X"3E", + X"24",X"1A",X"14",X"66",X"3E",X"27",X"1A",X"29",X"66",X"09",X"6C",X"2D",X"E5",X"19",X"2C",X"E5", + X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE",X"65",X"09",X"1F",X"18",X"3E",X"37", + X"E5",X"C6",X"2B",X"E5",X"95",X"19",X"3E",X"5A",X"09",X"86",X"2B",X"E5",X"D5",X"2C",X"09",X"50", + X"00",X"0A",X"11",X"66",X"3E",X"20",X"1A",X"13",X"66",X"3E",X"24",X"1A",X"14",X"66",X"3E",X"27", + X"1A",X"29",X"66",X"09",X"B4",X"2D",X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"FC", + X"2D",X"F5",X"0A",X"DE",X"65",X"09",X"26",X"2E",X"3E",X"32",X"E5",X"C6",X"2B",X"E5",X"9E",X"19", + X"3E",X"6F",X"09",X"8E",X"2B",X"E5",X"D5",X"2C",X"09",X"48",X"00",X"0A",X"11",X"66",X"3E",X"20", + X"1A",X"13",X"66",X"3E",X"24",X"1A",X"14",X"66",X"3E",X"27",X"1A",X"29",X"66",X"09",X"E4",X"2D", + X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE",X"65",X"09", + X"6A",X"2F",X"3E",X"31",X"E5",X"C6",X"2B",X"E5",X"9F",X"18",X"3E",X"81",X"09",X"06",X"2B",X"E5", + X"D5",X"2C",X"09",X"58",X"00",X"0A",X"11",X"66",X"3E",X"20",X"1A",X"13",X"66",X"3E",X"24",X"1A", + X"14",X"66",X"3E",X"27",X"1A",X"29",X"66",X"09",X"F4",X"2C",X"E5",X"19",X"2C",X"E5",X"3A",X"2C", + X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE",X"65",X"09",X"48",X"2E",X"3E",X"11",X"E5",X"C6", + X"2B",X"E5",X"10",X"19",X"3E",X"5D",X"09",X"0E",X"2B",X"E5",X"D5",X"2C",X"09",X"80",X"00",X"0A", + X"11",X"66",X"3E",X"21",X"1A",X"13",X"66",X"3E",X"25",X"1A",X"14",X"66",X"3E",X"27",X"1A",X"29", + X"66",X"09",X"24",X"2D",X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5", + X"0A",X"DE",X"65",X"09",X"DF",X"2E",X"3E",X"26",X"E5",X"C6",X"2B",X"E5",X"39",X"19",X"3E",X"69", + X"09",X"46",X"2B",X"E5",X"D5",X"2C",X"09",X"90",X"00",X"0A",X"11",X"66",X"3E",X"21",X"1A",X"13", + X"66",X"3E",X"25",X"1A",X"14",X"66",X"3E",X"27",X"1A",X"29",X"66",X"09",X"3C",X"2D",X"E5",X"19", + X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE",X"65",X"09",X"95",X"18", + X"3E",X"37",X"E5",X"C6",X"2B",X"E5",X"86",X"19",X"3E",X"7B",X"09",X"4E",X"2B",X"E5",X"D5",X"2C", + X"09",X"00",X"01",X"0A",X"11",X"66",X"3E",X"22",X"1A",X"13",X"66",X"3E",X"26",X"1A",X"14",X"66", + X"3E",X"27",X"1A",X"29",X"66",X"09",X"6C",X"2D",X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5", + X"09",X"FC",X"2D",X"F5",X"0A",X"DE",X"65",X"09",X"1F",X"18",X"3E",X"32",X"E5",X"C6",X"2B",X"E5", + X"95",X"19",X"3E",X"7E",X"09",X"86",X"2B",X"E5",X"D5",X"2C",X"09",X"10",X"01",X"0A",X"11",X"66", + X"3E",X"24",X"1A",X"13",X"66",X"3E",X"27",X"1A",X"14",X"66",X"3E",X"26",X"1A",X"29",X"66",X"09", + X"B4",X"2D",X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE", + X"65",X"09",X"26",X"2E",X"3E",X"31",X"E5",X"C6",X"2B",X"E5",X"9E",X"19",X"3E",X"4E",X"09",X"8E", + X"2B",X"E5",X"D5",X"2C",X"09",X"08",X"01",X"0A",X"11",X"66",X"3E",X"25",X"1A",X"13",X"66",X"3E", + X"10",X"1A",X"14",X"66",X"3E",X"26",X"1A",X"29",X"66",X"09",X"E4",X"2D",X"E5",X"19",X"2C",X"E5", + X"3A",X"2C",X"E1",X"E1",X"E1",X"E1",X"E1",X"27",X"65",X"52",X"08",X"54",X"66",X"54",X"2C",X"43", + X"67",X"50",X"71",X"52",X"61",X"47",X"60",X"54",X"08",X"19",X"39",X"38",X"1B",X"54",X"45",X"64", + X"63",X"67",X"08",X"61",X"66",X"43",X"8B",X"40",X"BC",X"40",X"A4",X"41",X"93",X"41",X"6C",X"42", + X"5B",X"42",X"43",X"43",X"74",X"43",X"A3",X"40",X"94",X"40",X"8C",X"41",X"BB",X"41",X"44",X"42", + X"73",X"42",X"6B",X"43",X"5C",X"43",X"AC",X"40",X"9B",X"40",X"29",X"41",X"1E",X"41",X"E1",X"42", + X"D6",X"42",X"64",X"43",X"53",X"43",X"0B",X"41",X"3C",X"41",X"A5",X"41",X"92",X"41",X"6D",X"42", + X"5A",X"42",X"C3",X"42",X"F4",X"42",X"E5",X"40",X"D2",X"40",X"46",X"41",X"71",X"41",X"8E",X"42", + X"B9",X"42",X"2D",X"43",X"1A",X"43",X"8B",X"40",X"BC",X"40",X"A2",X"41",X"95",X"41",X"6A",X"42", + X"5D",X"42",X"43",X"43",X"74",X"43",X"AB",X"40",X"9C",X"40",X"2C",X"41",X"1B",X"41",X"E4",X"42", + X"D3",X"42",X"63",X"43",X"54",X"43",X"E5",X"41",X"D2",X"41",X"A0",X"41",X"97",X"41",X"68",X"42", + X"5F",X"42",X"2D",X"42",X"1A",X"42",X"C5",X"40",X"F2",X"40",X"A3",X"41",X"94",X"41",X"6B",X"42", + X"5C",X"42",X"0D",X"43",X"3A",X"43",X"EC",X"40",X"DB",X"40",X"28",X"41",X"1F",X"41",X"E0",X"42", + X"D7",X"42",X"24",X"43",X"13",X"43",X"C4",X"40",X"F3",X"40",X"2C",X"41",X"1B",X"41",X"E4",X"42", + X"D3",X"42",X"0C",X"43",X"3B",X"43",X"A1",X"40",X"96",X"40",X"A8",X"41",X"9F",X"41",X"60",X"42", + X"57",X"42",X"69",X"43",X"5E",X"43",X"CD",X"E5",X"25",X"15",X"11",X"40",X"40",X"C9",X"D5",X"11", + X"F7",X"65",X"ED",X"88",X"ED",X"88",X"ED",X"88",X"7E",X"FE",X"27",X"38",X"DD",X"ED",X"88",X"2B", + X"D1",X"CD",X"09",X"F7",X"65",X"0B",X"46",X"F5",X"7E",X"00",X"12",X"13",X"10",X"FC",X"7E",X"0B", + X"86",X"2B",X"5F",X"0B",X"0B",X"7E",X"FE",X"D8",X"18",X"30",X"12",X"13",X"0B",X"46",X"F5",X"7E", + X"01",X"12",X"13",X"10",X"FC",X"7E",X"0B",X"86",X"2B",X"5F",X"0B",X"0B",X"7E",X"12",X"13",X"C3", + X"CD",X"2B",X"09",X"F7",X"65",X"3A",X"DD",X"65",X"3C",X"1A",X"DD",X"65",X"FE",X"34",X"28",X"23", + X"7E",X"3D",X"5F",X"FE",X"D9",X"D2",X"CD",X"2B",X"C3",X"E5",X"2B",X"C9",X"AF",X"1A",X"DD",X"65", + X"E1",X"11",X"49",X"64",X"01",X"18",X"00",X"ED",X"98",X"E1",X"09",X"F8",X"65",X"11",X"F9",X"65", + X"1E",X"00",X"01",X"11",X"00",X"ED",X"98",X"09",X"FB",X"65",X"E3",X"FE",X"09",X"FE",X"65",X"E3", + X"FE",X"09",X"01",X"66",X"E3",X"FE",X"09",X"04",X"66",X"E3",X"FE",X"09",X"07",X"66",X"E3",X"FE", + X"AF",X"1A",X"33",X"66",X"1A",X"0D",X"66",X"1A",X"0E",X"66",X"1A",X"2A",X"66",X"1A",X"2B",X"66", + X"3A",X"04",X"65",X"17",X"09",X"B5",X"2C",X"E5",X"98",X"15",X"7E",X"1A",X"18",X"40",X"0B",X"7E", + X"1A",X"2F",X"40",X"3E",X"01",X"1A",X"18",X"44",X"1A",X"2F",X"44",X"3E",X"40",X"1A",X"0B",X"66", + X"1A",X"0C",X"66",X"09",X"F5",X"65",X"E3",X"86",X"AF",X"1A",X"C2",X"66",X"E1",X"40",X"01",X"40", + X"02",X"40",X"03",X"40",X"04",X"40",X"05",X"40",X"06",X"40",X"07",X"40",X"20",X"40",X"21",X"01", + X"00",X"01",X"01",X"01",X"02",X"01",X"03",X"01",X"04",X"01",X"05",X"01",X"06",X"01",X"07",X"01", + X"20",X"01",X"21",X"02",X"00",X"02",X"01",X"02",X"02",X"02",X"03",X"02",X"04",X"02",X"05",X"02", + X"06",X"02",X"07",X"02",X"20",X"1A",X"2C",X"66",X"0A",X"0F",X"66",X"E1",X"03",X"02",X"00",X"3B", + X"14",X"30",X"21",X"77",X"03",X"02",X"00",X"4B",X"14",X"30",X"21",X"37",X"03",X"02",X"00",X"AB", + X"14",X"30",X"21",X"37",X"03",X"02",X"00",X"D3",X"14",X"30",X"21",X"37",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"00",X"02",X"04",X"00",X"A3",X"CC",X"10",X"21",X"40",X"03",X"02",X"00",X"4B", + X"14",X"30",X"21",X"77",X"03",X"02",X"00",X"7B",X"14",X"30",X"21",X"37",X"03",X"02",X"00",X"93", + X"14",X"30",X"21",X"37",X"03",X"02",X"00",X"AB",X"14",X"30",X"21",X"37",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"00",X"02",X"04",X"00",X"A3",X"FC",X"10",X"21",X"40",X"03",X"02",X"00",X"63", + X"0C",X"30",X"21",X"77",X"03",X"02",X"00",X"5B",X"0C",X"30",X"21",X"37",X"03",X"02",X"00",X"B3", + X"0C",X"30",X"21",X"37",X"03",X"02",X"00",X"C3",X"0C",X"30",X"21",X"37",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"00",X"02",X"04",X"00",X"A3",X"EC",X"10",X"21",X"40",X"03",X"02",X"00",X"43", + X"44",X"30",X"21",X"77",X"03",X"02",X"00",X"53",X"1C",X"30",X"21",X"37",X"03",X"02",X"00",X"BB", + X"1C",X"30",X"21",X"37",X"03",X"02",X"00",X"E3",X"44",X"30",X"21",X"37",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"00",X"02",X"04",X"00",X"A3",X"FC",X"10",X"21",X"40",X"03",X"02",X"00",X"73", + X"2C",X"30",X"21",X"77",X"03",X"02",X"00",X"5B",X"2C",X"30",X"21",X"37",X"03",X"02",X"00",X"B3", + X"2C",X"30",X"21",X"37",X"03",X"02",X"00",X"9B",X"2C",X"30",X"21",X"37",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"00",X"02",X"04",X"00",X"A3",X"CC",X"10",X"21",X"40",X"03",X"02",X"00",X"43", + X"14",X"30",X"21",X"77",X"03",X"02",X"00",X"73",X"14",X"30",X"21",X"37",X"03",X"02",X"00",X"9B", + X"14",X"30",X"21",X"37",X"03",X"02",X"00",X"E3",X"14",X"30",X"21",X"37",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"00",X"02",X"04",X"00",X"A3",X"F4",X"10",X"21",X"40",X"4D",X"22",X"23",X"24", + X"25",X"26",X"27",X"10",X"14",X"4D",X"22",X"23",X"24",X"25",X"26",X"27",X"10",X"16",X"D9",X"08", + X"00",X"DC",X"04",X"FF",X"23",X"06",X"02",X"25",X"20",X"FE",X"23",X"06",X"02",X"25",X"04",X"FF", + X"DC",X"01",X"00",X"22",X"34",X"00",X"22",X"01",X"00",X"DC",X"01",X"01",X"24",X"34",X"FE",X"26", + X"01",X"01",X"DA",X"05",X"00",X"22",X"14",X"00",X"22",X"05",X"00",X"DC",X"04",X"FF",X"23",X"16", + X"02",X"25",X"04",X"FF",X"DC",X"01",X"00",X"22",X"34",X"00",X"22",X"01",X"00",X"DC",X"01",X"01", + X"24",X"24",X"FE",X"26",X"02",X"02",X"24",X"24",X"FE",X"26",X"01",X"01",X"D9",X"08",X"00",X"FF", + X"D9",X"08",X"00",X"DB",X"07",X"01",X"24",X"10",X"FE",X"26",X"07",X"01",X"D9",X"22",X"00",X"22", + X"22",X"00",X"22",X"22",X"00",X"D9",X"21",X"00",X"23",X"24",X"00",X"25",X"21",X"00",X"DA",X"01", + X"00",X"22",X"02",X"01",X"25",X"03",X"FE",X"23",X"26",X"02",X"25",X"03",X"FE",X"23",X"02",X"01", + X"22",X"01",X"00",X"DC",X"01",X"00",X"22",X"34",X"00",X"22",X"01",X"00",X"DA",X"01",X"00",X"22", + X"24",X"FF",X"26",X"02",X"02",X"24",X"24",X"FF",X"22",X"01",X"00",X"DA",X"01",X"00",X"22",X"23", + X"01",X"25",X"04",X"FE",X"23",X"23",X"01",X"22",X"01",X"00",X"DC",X"01",X"00",X"22",X"34",X"00", + X"22",X"01",X"00",X"DA",X"01",X"00",X"22",X"03",X"FF",X"26",X"01",X"02",X"24",X"10",X"FE",X"26", + X"01",X"02",X"24",X"03",X"FF",X"22",X"01",X"00",X"D9",X"21",X"00",X"24",X"24",X"00",X"26",X"21", + X"00",X"D9",X"22",X"00",X"22",X"22",X"00",X"22",X"22",X"00",X"DB",X"21",X"FF",X"23",X"24",X"02", + X"25",X"21",X"FF",X"D9",X"08",X"00",X"FF",X"D9",X"08",X"00",X"DC",X"01",X"00",X"22",X"02",X"01", + X"25",X"20",X"FE",X"23",X"04",X"02",X"25",X"20",X"FE",X"23",X"02",X"01",X"22",X"01",X"00",X"D9", + X"02",X"00",X"24",X"32",X"00",X"26",X"02",X"00",X"DD",X"03",X"00",X"22",X"30",X"00",X"22",X"03", + X"00",X"DB",X"03",X"00",X"22",X"22",X"FF",X"26",X"02",X"02",X"24",X"22",X"FF",X"22",X"03",X"00", + X"DB",X"03",X"00",X"22",X"20",X"01",X"25",X"06",X"FE",X"23",X"20",X"01",X"22",X"03",X"00",X"DD", + X"03",X"00",X"22",X"30",X"00",X"22",X"03",X"00",X"D9",X"02",X"00",X"23",X"32",X"00",X"25",X"02", + X"00",X"DC",X"01",X"00",X"22",X"05",X"FF",X"26",X"02",X"02",X"24",X"22",X"FE",X"26",X"02",X"02", + X"24",X"05",X"FF",X"22",X"01",X"00",X"D9",X"08",X"00",X"FF",X"D9",X"08",X"00",X"DB",X"03",X"FF", + X"23",X"20",X"02",X"25",X"06",X"FE",X"23",X"20",X"02",X"25",X"03",X"FF",X"D9",X"01",X"00",X"22", + X"34",X"00",X"22",X"01",X"00",X"DA",X"01",X"00",X"22",X"04",X"FF",X"26",X"02",X"02",X"24",X"24", + X"FE",X"26",X"02",X"02",X"24",X"04",X"FF",X"22",X"01",X"00",X"DA",X"01",X"00",X"22",X"03",X"01", + X"25",X"04",X"FE",X"23",X"22",X"02",X"25",X"04",X"FE",X"23",X"03",X"01",X"22",X"01",X"00",X"D9", + X"01",X"00",X"22",X"34",X"00",X"22",X"01",X"00",X"DA",X"01",X"01",X"24",X"34",X"FE",X"26",X"01", + X"01",X"DA",X"03",X"01",X"24",X"22",X"FE",X"26",X"02",X"02",X"24",X"22",X"FE",X"26",X"03",X"01", + X"DA",X"04",X"FF",X"23",X"20",X"02",X"25",X"04",X"FE",X"23",X"20",X"02",X"25",X"04",X"FF",X"DA", + X"02",X"FF",X"23",X"32",X"02",X"25",X"02",X"FF",X"D9",X"01",X"00",X"22",X"34",X"00",X"22",X"01", + X"00",X"DA",X"01",X"00",X"22",X"04",X"FF",X"26",X"02",X"02",X"24",X"24",X"FE",X"26",X"02",X"02", + X"24",X"04",X"FF",X"22",X"01",X"00",X"DA",X"01",X"00",X"22",X"03",X"01",X"25",X"04",X"FE",X"23", + X"22",X"02",X"25",X"04",X"FE",X"23",X"03",X"01",X"22",X"01",X"00",X"D9",X"01",X"00",X"22",X"34", + X"00",X"22",X"01",X"00",X"DB",X"01",X"01",X"24",X"24",X"FE",X"26",X"02",X"02",X"24",X"24",X"FE", + X"26",X"01",X"01",X"D9",X"08",X"00",X"FF",X"D9",X"08",X"00",X"DB",X"05",X"FF",X"23",X"01",X"02", + X"25",X"06",X"FE",X"23",X"02",X"02",X"25",X"06",X"FE",X"23",X"01",X"02",X"25",X"05",X"FF",X"D9", + X"02",X"00",X"23",X"32",X"00",X"25",X"02",X"00",X"DB",X"01",X"01",X"24",X"34",X"FE",X"26",X"01", + X"01",X"FC",X"04",X"00",X"22",X"16",X"00",X"22",X"04",X"00",X"DB",X"03",X"FF",X"23",X"30",X"02", + X"25",X"03",X"FF",X"D9",X"02",X"00",X"24",X"32",X"00",X"26",X"02",X"00",X"DB",X"03",X"01",X"24", + X"05",X"FE",X"26",X"02",X"02",X"24",X"06",X"FE",X"26",X"02",X"02",X"24",X"05",X"FE",X"26",X"03", + X"01",X"D9",X"08",X"00",X"FF",X"D9",X"08",X"00",X"FB",X"23",X"FF",X"23",X"20",X"02",X"25",X"23", + X"FF",X"DC",X"01",X"00",X"22",X"34",X"00",X"22",X"01",X"00",X"FB",X"01",X"01",X"24",X"34",X"FE", + X"26",X"01",X"01",X"D9",X"08",X"00",X"FF",X"3E",X"26",X"1A",X"C7",X"40",X"1A",X"D7",X"40",X"1A", + X"AF",X"41",X"1A",X"87",X"42",X"1A",X"97",X"42",X"1A",X"2F",X"43",X"3E",X"24",X"1A",X"E0",X"40", + X"1A",X"F0",X"40",X"1A",X"98",X"41",X"1A",X"A0",X"42",X"1A",X"B0",X"42",X"1A",X"18",X"43",X"3E", + X"25",X"1A",X"E7",X"40",X"1A",X"4F",X"41",X"1A",X"5F",X"41",X"1A",X"67",X"42",X"1A",X"0F",X"43", + X"1A",X"1F",X"43",X"3E",X"23",X"1A",X"D0",X"40",X"1A",X"68",X"41",X"1A",X"78",X"41",X"1A",X"50", + X"42",X"1A",X"28",X"43",X"1A",X"38",X"43",X"3E",X"22",X"1A",X"FB",X"41",X"1A",X"33",X"42",X"E1", + X"3E",X"26",X"1A",X"AF",X"41",X"3E",X"24",X"1A",X"98",X"41",X"3E",X"25",X"1A",X"67",X"42",X"3E", + X"23",X"1A",X"50",X"42",X"3E",X"24",X"1A",X"C9",X"42",X"3E",X"23",X"1A",X"01",X"41",X"3E",X"25", + X"1A",X"36",X"41",X"3E",X"26",X"1A",X"FE",X"42",X"E1",X"3E",X"25",X"1A",X"E8",X"40",X"1A",X"DE", + X"40",X"1A",X"6F",X"42",X"3E",X"23",X"1A",X"E9",X"40",X"1A",X"DF",X"40",X"1A",X"58",X"42",X"3E", + X"26",X"1A",X"A7",X"41",X"1A",X"20",X"43",X"1A",X"16",X"43",X"3E",X"24",X"1A",X"90",X"41",X"1A", + X"21",X"43",X"1A",X"17",X"43",X"3E",X"24",X"1A",X"81",X"43",X"1A",X"C1",X"40",X"3E",X"23",X"1A", + X"09",X"43",X"1A",X"49",X"40",X"3E",X"26",X"1A",X"B6",X"43",X"1A",X"F6",X"40",X"3E",X"25",X"1A", + X"3E",X"43",X"1A",X"7E",X"40",X"E1",X"3E",X"22",X"1A",X"0D",X"41",X"1A",X"CF",X"40",X"1A",X"C5", + X"42",X"1A",X"07",X"43",X"E1",X"3E",X"25",X"1A",X"E2",X"40",X"1A",X"D4",X"40",X"3E",X"23",X"1A", + X"E3",X"40",X"1A",X"D5",X"40",X"3E",X"26",X"1A",X"2A",X"43",X"1A",X"1C",X"43",X"3E",X"24",X"1A", + X"2B",X"43",X"1A",X"1D",X"43",X"E1",X"3E",X"25",X"1A",X"EF",X"40",X"3E",X"23",X"1A",X"D8",X"40", + X"1A",X"05",X"42",X"3E",X"24",X"1A",X"CD",X"41",X"1A",X"10",X"43",X"3E",X"26",X"1A",X"27",X"43", + X"E1",X"3E",X"16",X"E5",X"FD",X"14",X"3E",X"21",X"E5",X"25",X"15",X"11",X"C1",X"44",X"09",X"03", + X"1C",X"3E",X"05",X"06",X"15",X"E5",X"EB",X"15",X"11",X"7B",X"44",X"09",X"03",X"1C",X"3E",X"05", + X"06",X"10",X"E5",X"EB",X"15",X"11",X"C1",X"40",X"09",X"39",X"1A",X"3E",X"05",X"06",X"15",X"E5", + X"D5",X"15",X"11",X"61",X"41",X"09",X"8A",X"1A",X"3E",X"07",X"06",X"11",X"E5",X"D5",X"15",X"3E", + X"90",X"1A",X"EE",X"40",X"3E",X"A6",X"1A",X"EF",X"40",X"11",X"9A",X"40",X"09",X"31",X"1B",X"3E", + X"07",X"06",X"16",X"E5",X"D5",X"15",X"11",X"7B",X"40",X"09",X"9B",X"1B",X"3E",X"05",X"06",X"10", + X"E5",X"D5",X"15",X"3E",X"78",X"E5",X"B3",X"15",X"E1",X"31",X"31",X"31",X"31",X"31",X"31",X"40", + X"40",X"40",X"31",X"31",X"40",X"53",X"40",X"31",X"31",X"40",X"54",X"40",X"31",X"31",X"40",X"66", + X"40",X"31",X"31",X"40",X"45",X"40",X"31",X"31",X"40",X"53",X"40",X"31",X"31",X"40",X"45",X"40", + X"31",X"31",X"40",X"52",X"40",X"31",X"31",X"40",X"50",X"40",X"31",X"31",X"40",X"40",X"40",X"31", + X"31",X"40",X"40",X"40",X"31",X"31",X"40",X"72",X"40",X"31",X"31",X"40",X"45",X"40",X"31",X"31", + X"40",X"60",X"40",X"31",X"31",X"40",X"43",X"40",X"31",X"31",X"40",X"66",X"40",X"31",X"31",X"40", + X"41",X"40",X"31",X"31",X"40",X"53",X"40",X"31",X"31",X"40",X"40",X"40",X"31",X"31",X"31",X"31", + X"31",X"31",X"16",X"16",X"A5",X"16",X"A2",X"A3",X"A6",X"A3",X"A3",X"A7",X"A4",X"A3",X"A7",X"A6", + X"A7",X"16",X"16",X"A7",X"16",X"A7",X"A6",X"A7",X"16",X"16",X"A7",X"16",X"16",X"16",X"A7",X"A5", + X"A5",X"A7",X"A5",X"A5",X"16",X"A7",X"A7",X"A7",X"A7",X"A7",X"A7",X"A6",X"A7",X"16",X"16",X"16", + X"16",X"A7",X"A6",X"16",X"16",X"16",X"16",X"16",X"A7",X"A6",X"16",X"16",X"16",X"16",X"16",X"16", + X"16",X"A5",X"16",X"A5",X"A5",X"A5",X"A5",X"16",X"A7",X"A3",X"A7",X"A7",X"A7",X"A7",X"A6",X"A7", + X"A4",X"16",X"16",X"16",X"A7",X"A6",X"16",X"90",X"A4",X"16",X"16",X"16",X"16",X"16",X"A3",X"91", + X"16",X"16",X"16",X"16",X"A7",X"91",X"16",X"A5",X"A5",X"A5",X"16",X"A7",X"90",X"A7",X"A7",X"A7", + X"A7",X"A6",X"16",X"16",X"16",X"16",X"16",X"A7",X"A6",X"A5",X"A5",X"16",X"16",X"16",X"16",X"16", + X"A7",X"91",X"16",X"16",X"16",X"16",X"16",X"A7",X"A6",X"16",X"A5",X"A5",X"A5",X"16",X"A7",X"A7", + X"A7",X"A7",X"A7",X"A7",X"A6",X"A7",X"A6",X"16",X"16",X"16",X"16",X"16",X"A7",X"A4",X"16",X"16", + X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"A5",X"A5",X"A5",X"A5", + X"16",X"A7",X"90",X"A7",X"A7",X"A7",X"A7",X"A6",X"A7",X"16",X"16",X"A3",X"91",X"16",X"16",X"16", + X"16",X"A3",X"91",X"A2",X"16",X"16",X"16",X"A3",X"91",X"A2",X"16",X"16",X"16",X"A7",X"91",X"16", + X"A5",X"A5",X"A5",X"16",X"A7",X"90",X"A7",X"A7",X"A7",X"A7",X"A6",X"16",X"16",X"16",X"16",X"16", + X"A7",X"A6",X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"A5",X"A5",X"16",X"16",X"16",X"16",X"16", + X"A7",X"91",X"16",X"16",X"16",X"16",X"16",X"A7",X"A6",X"16",X"A5",X"A5",X"A5",X"16",X"A7",X"A7", + X"A7",X"A7",X"A7",X"A7",X"A6",X"A7",X"A6",X"16",X"16",X"16",X"16",X"16",X"A7",X"A4",X"16",X"16", + X"16",X"16",X"16",X"31",X"31",X"31",X"31",X"31",X"31",X"40",X"40",X"40",X"31",X"31",X"40",X"67", + X"40",X"31",X"31",X"40",X"63",X"40",X"31",X"31",X"40",X"64",X"40",X"31",X"31",X"40",X"45",X"40", + X"31",X"31",X"40",X"54",X"40",X"31",X"31",X"40",X"40",X"40",X"31",X"31",X"40",X"03",X"40",X"31", + X"31",X"40",X"20",X"40",X"31",X"31",X"40",X"21",X"40",X"31",X"31",X"40",X"01",X"40",X"31",X"31", + X"40",X"40",X"40",X"31",X"31",X"40",X"32",X"40",X"31",X"31",X"40",X"40",X"40",X"31",X"31",X"31", + X"31",X"31",X"31",X"05",X"E1",X"E1",X"E1",X"09",X"CC",X"1C",X"0A",X"2D",X"66",X"3E",X"EF",X"1A", + X"F8",X"64",X"E1",X"E1",X"2A",X"2D",X"66",X"CD",X"09",X"CC",X"1C",X"7D",X"C9",X"BD",X"E4",X"64", + X"1C",X"7E",X"FE",X"00",X"28",X"26",X"0B",X"46",X"3A",X"A4",X"64",X"B8",X"28",X"14",X"2B",X"0A", + X"2D",X"66",X"30",X"17",X"0B",X"46",X"3A",X"A5",X"64",X"B8",X"28",X"06",X"2B",X"0A",X"2D",X"66", + X"30",X"21",X"0B",X"7E",X"1A",X"F8",X"64",X"0B",X"0A",X"2D",X"66",X"E1",X"3E",X"10",X"1A",X"29", + X"66",X"3E",X"04",X"1A",X"13",X"66",X"3E",X"22",X"1A",X"14",X"66",X"3E",X"07",X"1A",X"4A",X"64", + X"1A",X"6A",X"64",X"1A",X"5A",X"64",X"1A",X"7A",X"64",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1", + X"E1",X"E1",X"3E",X"40",X"E5",X"FD",X"14",X"3E",X"21",X"E5",X"25",X"15",X"3E",X"31",X"1A",X"34", + X"66",X"E5",X"92",X"1C",X"3E",X"27",X"E5",X"B3",X"15",X"3E",X"14",X"1A",X"34",X"66",X"E5",X"92", + X"1C",X"E1",X"09",X"40",X"40",X"0A",X"35",X"66",X"09",X"7F",X"40",X"0A",X"37",X"66",X"3E",X"08", + X"1A",X"09",X"66",X"E5",X"9D",X"1C",X"3E",X"01",X"E5",X"B3",X"15",X"3A",X"09",X"66",X"3D",X"1A", + X"09",X"66",X"08",X"EF",X"E1",X"06",X"26",X"ED",X"73",X"35",X"66",X"13",X"ED",X"53",X"35",X"66", + X"33",X"3A",X"34",X"66",X"12",X"3E",X"40",X"E5",X"9D",X"15",X"10",X"DD",X"06",X"26",X"ED",X"73", + X"37",X"66",X"33",X"ED",X"53",X"37",X"66",X"13",X"3A",X"34",X"66",X"12",X"3E",X"40",X"E5",X"9D", + X"15",X"10",X"DD",X"E1",X"00",X"CC",X"FB",X"01",X"B3",X"DF",X"00",X"EC",X"FB",X"01",X"CB",X"FE", + X"00",X"B4",X"FD",X"01",X"E3",X"FE",X"00",X"4C",X"FB",X"01",X"CB",X"FE",X"00",X"0C",X"FD",X"01", + X"B3",X"DF",X"00",X"84",X"FB",X"01",X"D3",X"FE",X"00",X"74",X"FD",X"01",X"C3",X"DF",X"00",X"9C", + X"FB",X"01",X"EB",X"DF",X"00",X"EC",X"FD",X"01",X"CB",X"DF",X"00",X"DC",X"FD",X"01",X"B3",X"FE", + X"00",X"EC",X"FD",X"01",X"93",X"FE",X"00",X"8C",X"FD",X"01",X"0B",X"DF",X"00",X"EC",X"FB",X"01", + X"5B",X"FE",X"00",X"A4",X"FD",X"01",X"43",X"FE",X"00",X"4C",X"FD",X"01",X"2B",X"FE",X"00",X"34", + X"FB",X"01",X"5B",X"DF",X"00",X"74",X"FB",X"01",X"BB",X"DF",X"00",X"A4",X"FB",X"01",X"D3",X"DF", + X"00",X"C4",X"FB",X"01",X"F3",X"DF",X"00",X"FC",X"FD",X"01",X"AB",X"FE",X"00",X"E4",X"FD",X"01", + X"7B",X"DF",X"00",X"EC",X"FD",X"01",X"5B",X"DF",X"00",X"DC",X"FD",X"01",X"2B",X"FE",X"00",X"B4", + X"FB",X"01",X"83",X"DF",X"23",X"08",X"65",X"23",X"3B",X"65",X"24",X"02",X"01",X"43",X"00",X"02", + X"20",X"05",X"04",X"01",X"54",X"00",X"05",X"04",X"01",X"1A",X"00",X"05",X"04",X"01",X"85",X"00", + X"05",X"04",X"01",X"8F",X"00",X"05",X"04",X"01",X"4C",X"00",X"05",X"04",X"01",X"23",X"01",X"05", + X"04",X"21",X"23",X"05",X"65",X"23",X"3B",X"65",X"01",X"D8",X"00",X"24",X"02",X"06",X"02",X"20", + X"05",X"03",X"02",X"00",X"05",X"03",X"07",X"27",X"21",X"23",X"05",X"65",X"24",X"02",X"01",X"00", + X"02",X"02",X"05",X"06",X"04",X"05",X"06",X"05",X"01",X"04",X"FF",X"07",X"06",X"07",X"04",X"21", + X"AE",X"64",X"F8",X"2E",X"46",X"53",X"43",X"67",X"52",X"45",X"08",X"08",X"05",X"00",X"95",X"2B", + X"A8",X"2B",X"98",X"64",X"DA",X"1C",X"46",X"65",X"45",X"66",X"52",X"23",X"3B",X"65",X"23",X"59", + X"65",X"23",X"A4",X"65",X"23",X"8F",X"65",X"24",X"02",X"01",X"08",X"00",X"02",X"27",X"06",X"05", + X"01",X"03",X"18",X"00",X"07",X"14",X"06",X"04",X"FF",X"05",X"04",X"07",X"07",X"01",X"99",X"00", + X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"05",X"04",X"01",X"85",X"00",X"02",X"26", + X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"05",X"04",X"01",X"7D",X"00",X"02",X"26",X"06",X"04", + X"FE",X"05",X"02",X"07",X"04",X"05",X"04",X"01",X"5E",X"00",X"02",X"26",X"06",X"04",X"FE",X"05", + X"02",X"07",X"02",X"05",X"01",X"01",X"69",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07", + X"04",X"05",X"02",X"01",X"70",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05", + X"01",X"01",X"69",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02",X"01", + X"4C",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"69",X"00", + X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02",X"01",X"70",X"00",X"02",X"26", + X"06",X"04",X"FE",X"05",X"02",X"07",X"06",X"21",X"24",X"01",X"02",X"01",X"06",X"01",X"80",X"00", + X"06",X"05",X"02",X"03",X"10",X"00",X"07",X"05",X"04",X"02",X"07",X"06",X"20",X"B0",X"1E",X"52", + X"41",X"65",X"1D",X"08",X"05",X"00",X"95",X"2B",X"A8",X"2B",X"8F",X"65",X"C6",X"1E",X"53",X"67", + X"55",X"52",X"41",X"65",X"1E",X"08",X"05",X"00",X"95",X"2B",X"24",X"02",X"01",X"99",X"00",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02",X"01",X"99",X"00",X"02",X"26",X"06", + X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02", + X"07",X"02",X"05",X"01",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02", + X"05",X"01",X"01",X"85",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02", + X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02",X"01",X"C8", + X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02",X"01",X"C8",X"00",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"C8",X"00",X"02",X"26",X"06", + X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"C8",X"00",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"C8",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02", + X"07",X"02",X"05",X"01",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02", + X"05",X"02",X"01",X"C8",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02", + X"01",X"23",X"01",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02",X"01",X"23", + X"01",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"23",X"01",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"23",X"01",X"02",X"26",X"06", + X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"23",X"01",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"C8",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02", + X"07",X"02",X"05",X"02",X"01",X"23",X"01",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"03", + X"01",X"4C",X"01",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"06",X"05",X"07",X"04", + X"FE",X"07",X"04",X"21",X"24",X"01",X"02",X"27",X"06",X"01",X"C0",X"00",X"06",X"05",X"01",X"03", + X"10",X"00",X"07",X"05",X"04",X"FE",X"07",X"06",X"21",X"23",X"8F",X"65",X"24",X"02",X"01",X"43", + X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"05",X"01",X"01",X"70",X"00",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"05",X"02",X"01",X"58",X"00",X"02",X"26",X"06", + X"04",X"FE",X"05",X"02",X"07",X"02",X"01",X"85",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02", + X"07",X"02",X"05",X"01",X"01",X"58",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04", + X"01",X"5E",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"05",X"02",X"01",X"95", + X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"01",X"99",X"00",X"02",X"26",X"06", + X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"95",X"00",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"04",X"01",X"85",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04", + X"05",X"02",X"01",X"8F",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"01",X"C7", + X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"8F",X"00",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"02",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02", + X"01",X"95",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"01",X"99",X"00",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"06",X"05",X"02",X"01",X"85",X"00",X"02",X"26",X"06", + X"04",X"FE",X"05",X"02",X"07",X"04",X"05",X"03",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"02",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02", + X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"01",X"A5",X"00",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"01",X"95",X"00",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"5E",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02", + X"07",X"06",X"05",X"04",X"01",X"EC",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"06", + X"21",X"00",X"00",X"15",X"00",X"00",X"00",X"18",X"00",X"00",X"00",X"45",X"00",X"00",X"00",X"48", + X"00",X"00",X"50",X"12",X"00",X"00",X"00",X"0D",X"00",X"00",X"50",X"1F",X"00",X"00",X"00",X"50", + X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"18",X"00",X"00",X"00",X"40", + X"00",X"00",X"50",X"07",X"00",X"00",X"00",X"15",X"00",X"00",X"50",X"0A",X"00",X"00",X"00",X"18", + X"00",X"05",X"04",X"03",X"02",X"00",X"03",X"06",X"21",X"00",X"03",X"00",X"00",X"06",X"03",X"00", + X"03",X"00",X"00",X"06",X"03",X"00",X"00",X"21",X"00",X"FF",X"64",X"52",X"53",X"50",X"42",X"03", + X"65",X"43",X"53",X"48",X"17",X"03",X"62",X"65",X"53",X"08",X"85",X"02",X"42",X"67",X"40",X"90", + X"5E",X"02",X"62",X"53",X"40",X"50",X"19",X"02",X"62",X"46",X"53",X"90",X"10",X"02",X"46",X"53", + X"65",X"00",X"05",X"02",X"43",X"53",X"65",X"48",X"01",X"02",X"43",X"44",X"40",X"80",X"B0",X"01", + X"60",X"44",X"43",X"40",X"86",X"01",X"07",X"10",X"03",X"12",X"97",X"65",X"52",X"08",X"54",X"66", + X"54",X"2C",X"43",X"67",X"50",X"71",X"52",X"61",X"47",X"60",X"54",X"08",X"19",X"39",X"38",X"1B", + X"54",X"45",X"64",X"63",X"67",X"08",X"61",X"66",X"43",X"3A",X"2D",X"66",X"63",X"1B",X"41",X"43", + X"41",X"44",X"44",X"08",X"08",X"08",X"05",X"00",X"8D",X"39",X"B8",X"39",X"CC",X"1C",X"3A",X"2C", + X"41",X"53",X"54",X"45",X"54",X"41",X"08",X"08",X"61",X"2B",X"77",X"3A",X"03",X"2A",X"66",X"67", + X"66",X"41",X"65",X"45",X"2A",X"05",X"00",X"00",X"00",X"00",X"00",X"65",X"3A",X"86",X"20",X"9F", + X"00",X"49",X"39",X"30",X"3A",X"15",X"39",X"54",X"41",X"42",X"64",X"45",X"53",X"08",X"08",X"57", + X"2B",X"86",X"3A",X"03",X"2A",X"66",X"67",X"66",X"41",X"65",X"45",X"2A",X"06",X"00",X"00",X"00", + X"00",X"00",X"5C",X"3A",X"86",X"20",X"27",X"00",X"04",X"1C",X"13",X"1C",X"9A",X"1A",X"61",X"66", + X"61",X"54",X"53",X"08",X"08",X"08",X"4D",X"2B",X"BF",X"3A",X"03",X"2A",X"66",X"67",X"66",X"41", + X"65",X"45",X"2A",X"07",X"00",X"00",X"00",X"00",X"00",X"CE",X"2E",X"05",X"00",X"D4",X"3A",X"CF", + X"3A",X"F7",X"65",X"EE",X"2C",X"53",X"42",X"55",X"46",X"46",X"45",X"52",X"08",X"05",X"00",X"D4", + X"3A",X"CF",X"3A",X"DD",X"65",X"80",X"19",X"64",X"43",X"66",X"54",X"08",X"08",X"08",X"08",X"5B", + X"2B",X"D4",X"3A",X"03",X"2A",X"66",X"67",X"66",X"41",X"65",X"45",X"2A",X"20",X"00",X"00",X"00", + X"00",X"00",X"9C",X"2D",X"81",X"2B",X"00",X"00",X"03",X"2A",X"66",X"67",X"66",X"41",X"65",X"45", + X"2A",X"21",X"00",X"00",X"00",X"00",X"00",X"E9",X"3A",X"86",X"00",X"C2",X"66",X"F5",X"65",X"C2", + X"66",X"67",X"38",X"50",X"52",X"67",X"52",X"41",X"65",X"08",X"08",X"F5",X"65",X"C2",X"66",X"E9", + X"3A",X"00",X"00",X"00",X"1E",X"00",X"1F",X"00",X"22",X"3B",X"31",X"3A",X"FF",X"63",X"A7",X"2B", + X"BC",X"33",X"2A",X"28",X"F8",X"2E",X"31",X"3B",X"00",X"2B",X"28",X"D0",X"19",X"CE",X"2E",X"0A", + X"3B",X"00",X"D1",X"19",X"03",X"1C",X"9C",X"2D",X"2B",X"3B",X"00",X"04",X"1C",X"13",X"1C",X"5C", + X"3A",X"1C",X"3B",X"00",X"14",X"1C",X"5B",X"1D",X"BA",X"39",X"3D",X"3B",X"00",X"5C",X"1D",X"48", + X"39",X"DE",X"1E",X"46",X"3B",X"00",X"49",X"39",X"30",X"3A",X"65",X"3A",X"F0",X"1E",X"00",X"FE", + X"A5",X"20",X"22",X"07",X"07",X"22",X"29",X"6F",X"21",X"FD",X"04",X"01",X"18",X"23",X"FB",X"85", + X"20",X"23",X"01",X"58",X"23",X"FA",X"85",X"20",X"24",X"01",X"69",X"02",X"99",X"A0",X"02",X"BA", + X"6A",X"20",X"25",X"01",X"77",X"02",X"8D",X"4B",X"23",X"29",X"76",X"05",X"2C",X"85",X"01",X"86", + X"01",X"03",X"05",X"25",X"86",X"20",X"26",X"07",X"07",X"03",X"07",X"06",X"07",X"07",X"02",X"A4", + X"62",X"20",X"27",X"03",X"22",X"DE",X"84",X"23",X"DD",X"41",X"03",X"25",X"20",X"23",X"FD",X"84", + X"07",X"01",X"03",X"23",X"FC",X"1D",X"07",X"02",X"03",X"23",X"2B",X"87",X"02",X"DC",X"92",X"3D", + X"01",X"A2",X"23",X"2D",X"A4",X"02",X"EB",X"A1",X"3D",X"13",X"00",X"07",X"04",X"07",X"20",X"03", + X"21",X"FC",X"04",X"23",X"F6",X"92",X"09",X"23",X"08",X"81",X"23",X"F9",X"86",X"20",X"07",X"06", + X"22",X"03",X"02",X"20",X"2C",X"01",X"79",X"23",X"F7",X"A1",X"02",X"C6",X"0C",X"06",X"23",X"03", + X"01",X"1B",X"23",X"C8",X"C5",X"09",X"23",X"08",X"81",X"23",X"DF",X"88",X"23",X"2C",X"12",X"23", + X"28",X"27",X"23",X"DE",X"87",X"37",X"07",X"01",X"89",X"01",X"06",X"37",X"F3",X"02",X"8B",X"7A", + X"23",X"29",X"5F",X"3D",X"07",X"04",X"06",X"01",X"03",X"01",X"13",X"23",X"F9",X"96",X"37",X"06", + X"23",X"2C",X"4F",X"23",X"28",X"4C",X"23",X"DE",X"49",X"23",X"29",X"76",X"07",X"03",X"06",X"24", + X"03",X"25",X"20",X"02",X"3C",X"54",X"09",X"01",X"68",X"23",X"C9",X"A9",X"09",X"23",X"28",X"62", + X"22",X"DE",X"91",X"37",X"D3",X"02",X"6B",X"42",X"23",X"29",X"3F",X"23",X"2C",X"3C",X"23",X"DF", + X"39",X"01",X"41",X"23",X"29",X"1C",X"23",X"2C",X"19",X"22",X"DF",X"84",X"02",X"13",X"2B",X"09", + X"01",X"63",X"01",X"0E",X"23",X"CA",X"9A",X"23",X"08",X"81",X"23",X"FA",X"A4",X"23",X"2C",X"5B", + X"37",X"EB",X"23",X"FE",X"6E",X"06",X"01",X"03",X"23",X"F9",X"A3",X"23",X"2C",X"4D",X"23",X"F9", + X"4A",X"37",X"20",X"01",X"59",X"23",X"28",X"73",X"23",X"F8",X"70",X"23",X"29",X"55",X"23",X"2C", + X"52",X"37",X"CB",X"02",X"05",X"75",X"01",X"76",X"23",X"CB",X"A2",X"02",X"15",X"45",X"3D",X"07", + X"03",X"06",X"25",X"03",X"04",X"00",X"00",X"00",X"00",X"69",X"48",X"66",X"0B",X"46",X"32",X"81", + X"6F",X"13",X"32",X"A0",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"85",X"6F",X"13",X"32", + X"A4",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"8D",X"6F",X"13",X"32",X"8C",X"4F",X"E1", + X"44",X"65",X"09",X"00",X"00",X"3E",X"10",X"DD",X"29",X"EB",X"97",X"29",X"EB",X"A5",X"91",X"6F", + X"7C",X"B0",X"4F",X"13",X"D2",X"F1",X"3C",X"21",X"33",X"D9",X"3D",X"C2",X"C7",X"3C",X"E1",X"76", + X"0B",X"56",X"EB",X"29",X"CD",X"29",X"29",X"C1",X"21",X"E1",X"44",X"65",X"09",X"00",X"00",X"3E", + X"10",X"29",X"EB",X"29",X"EB",X"D2",X"F9",X"3C",X"21",X"3D",X"C2",X"D9",X"3C",X"E1",X"71",X"50", + X"EB",X"97",X"95",X"6F",X"3E",X"00",X"B4",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"9D", + X"6F",X"13",X"32",X"9C",X"4F",X"E1",X"77",X"16",X"00",X"7B",X"95",X"6F",X"7A",X"B4",X"4F",X"E1", + X"67",X"06",X"00",X"7B",X"91",X"6F",X"7A",X"B0",X"4F",X"E1",X"69",X"48",X"66",X"0B",X"46",X"32", + X"91",X"6F",X"13",X"32",X"B0",X"4F",X"E1",X"6F",X"0E",X"00",X"32",X"95",X"6F",X"13",X"32",X"B4", + X"4F",X"E1",X"77",X"16",X"00",X"7B",X"96",X"77",X"7A",X"0B",X"B6",X"57",X"EB",X"E1",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"93",X"1B",X"93",X"1B",X"58",X"0E",X"24",X"2A",X"B4",X"03",X"F8",X"29",X"EC",X"2E",X"48",X"2F", + X"00",X"00",X"F1",X"13",X"9D",X"0C",X"65",X"0E",X"FF",X"7F",X"2F",X"03",X"BA",X"06",X"00",X"04", + X"FC",X"03",X"F7",X"12",X"8F",X"03",X"D5",X"03",X"F3",X"03",X"A5",X"27",X"EA",X"03",X"DF",X"03", + X"A2",X"03",X"00",X"12",X"25",X"12",X"32",X"12",X"E7",X"16",X"CA",X"03",X"21",X"13",X"1B",X"13", + X"F2",X"E7",X"16",X"DA",X"20",X"D2",X"67",X"70",X"A2",X"03",X"F2",X"A8",X"C4",X"52",X"67",X"57", + X"A5",X"27",X"85",X"C7",X"66",X"61",X"66",X"52",X"41",X"57",X"00",X"12",X"97",X"E5",X"52",X"54", + X"8D",X"31",X"96",X"10",X"C5",X"64",X"54",X"61",X"54",X"56",X"32",X"A3",X"E5",X"71",X"53",X"AD", + X"13",X"96",X"40",X"C2",X"55",X"53",X"98",X"14",X"F2",X"90",X"C7",X"66",X"61",X"52",X"54",X"53", + X"D3",X"31",X"95",X"C5",X"64",X"54",X"61",X"54",X"53",X"06",X"34",X"A4",X"E4",X"52",X"53",X"1C", + X"12",X"F1",X"38",X"C1",X"52",X"53",X"89",X"14",X"F1",X"28",X"C5",X"43",X"41",X"50",X"53",X"2E", + X"16",X"A1",X"D0",X"53",X"78",X"00",X"F8",X"18",X"C1",X"64",X"53",X"9A",X"34",X"F1",X"08",X"D2", + X"60",X"53",X"89",X"12",X"B7",X"E4",X"60",X"53",X"C1",X"12",X"B6",X"D4",X"45",X"53",X"DF",X"34", + X"F0",X"C0",X"C7",X"45",X"53",X"94",X"00",X"B2",X"E6",X"67",X"61",X"54",X"43",X"45",X"53",X"0F", + X"12",X"8A",X"00",X"C6",X"43",X"53",X"26",X"35",X"D1",X"1F",X"D2",X"41",X"64",X"41",X"43",X"53", + X"6B",X"35",X"8F",X"C3",X"42",X"53",X"78",X"30",X"F4",X"B0",X"42",X"D4",X"53",X"52",X"5F",X"15", + X"F7",X"C4",X"52",X"52",X"D1",X"12",X"D2",X"4F",X"C1",X"43",X"52",X"52",X"B8",X"00",X"D1",X"27", + X"C3",X"52",X"52",X"59",X"16",X"F1",X"20",X"C1",X"52",X"52",X"C2",X"00",X"D1",X"37",X"D2",X"52", + X"CD",X"00",X"F1",X"30",X"C4",X"64",X"52",X"F6",X"00",X"D2",X"6F",X"C1",X"43",X"64",X"52",X"4D", + X"16",X"D1",X"07",X"C3",X"64",X"52",X"49",X"12",X"F1",X"00",X"C1",X"64",X"52",X"DA",X"00",X"D1", + X"17",X"E4",X"52",X"20",X"01",X"F1",X"10",X"E6",X"54",X"45",X"52",X"D0",X"00",X"D2",X"45",X"E1", + X"54",X"45",X"52",X"91",X"12",X"D2",X"65",X"D4",X"45",X"52",X"15",X"01",X"D7",X"E1",X"C5",X"65", + X"55",X"53",X"45",X"52",X"01",X"01",X"8D",X"C5",X"56",X"52",X"45",X"53",X"45",X"52",X"7D",X"16", + X"8C",X"01",X"D3",X"45",X"52",X"D6",X"00",X"F0",X"80",X"D4",X"41",X"45",X"50",X"45",X"52",X"40", + X"01",X"A7",X"D2",X"27",X"01",X"DB",X"E0",X"53",X"55",X"50",X"51",X"01",X"F6",X"C5",X"D0",X"67", + X"50",X"2C",X"01",X"F6",X"C1",X"E7",X"50",X"0D",X"01",X"DA",X"08",X"C5",X"50",X"F9",X"00",X"DA", + X"28",X"C5",X"47",X"41",X"50",X"26",X"17",X"A0",X"30",X"D0",X"63",X"16",X"DA",X"18",X"E1",X"54", + X"55",X"67",X"5F",X"01",X"D2",X"8B",X"C4",X"54",X"55",X"67",X"66",X"15",X"D2",X"AB",X"D4",X"55", + X"67",X"A4",X"01",X"C9",X"41",X"D2",X"61",X"54",X"67",X"71",X"16",X"D2",X"9B",X"D2",X"44",X"54", + X"67",X"7C",X"01",X"D2",X"BB",X"C7",X"52",X"67",X"E7",X"14",X"81",X"D2",X"67",X"85",X"15",X"F2", + X"98",X"F2",X"66",X"43",X"12",X"DA",X"00",X"D0",X"67",X"66",X"7F",X"31",X"D1",X"00",X"D4",X"53", + X"61",X"64",X"67",X"66",X"88",X"00",X"87",X"C7",X"45",X"66",X"45",X"35",X"D2",X"44",X"D2",X"60", + X"43",X"66",X"8B",X"01",X"B4",X"C3",X"66",X"03",X"33",X"DA",X"10",X"C5",X"65",X"41",X"66",X"D4", + X"01",X"AB",X"C4",X"67",X"65",X"78",X"34",X"B5",X"C7",X"45",X"65",X"8E",X"17",X"96",X"D8",X"C5", + X"65",X"38",X"35",X"96",X"FF",X"E7",X"52",X"43",X"41",X"65",X"F5",X"32",X"91",X"E5",X"6F",X"17", + X"DA",X"38",X"E7",X"64",X"EA",X"32",X"B1",X"D4",X"53",X"61",X"64",X"19",X"15",X"86",X"D2",X"61", + X"44",X"64",X"A2",X"17",X"D2",X"98",X"E1",X"44",X"64",X"F7",X"14",X"D2",X"88",X"D2",X"44",X"44", + X"64",X"93",X"17",X"D2",X"B8",X"C4",X"44",X"64",X"06",X"02",X"D2",X"A8",X"C4",X"64",X"14",X"02", + X"D0",X"E4",X"33",X"02",X"DD",X"05",X"D2",X"62",X"CA",X"15",X"D3",X"30",X"D0",X"62",X"1C",X"02", + X"D5",X"C3",X"F1",X"61",X"18",X"02",X"FC",X"08",X"F0",X"61",X"81",X"17",X"FD",X"08",X"C5",X"47"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..ce051ca2 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"DB",X"AF",X"06",X"20",X"09",X"00",X"50",X"5F",X"0B",X"10",X"FC",X"ED",X"56",X"19",X"D9",X"67", + X"C3",X"C7",X"02",X"3A",X"8E",X"64",X"FE",X"00",X"E0",X"47",X"3E",X"30",X"09",X"35",X"40",X"5F", + X"2B",X"10",X"FC",X"E1",X"3A",X"8F",X"64",X"FE",X"00",X"E0",X"47",X"3E",X"30",X"09",X"02",X"40", + X"5F",X"0B",X"10",X"FC",X"E1",X"40",X"00",X"00",X"20",X"F1",X"F5",X"CD",X"FD",X"CD",X"AF",X"1A", + X"00",X"50",X"2A",X"24",X"64",X"3A",X"26",X"64",X"5F",X"2A",X"27",X"64",X"3A",X"11",X"64",X"5F", + X"2A",X"14",X"64",X"3A",X"16",X"64",X"5F",X"2A",X"17",X"64",X"3A",X"31",X"64",X"5F",X"2A",X"34", + X"64",X"3A",X"36",X"64",X"5F",X"2A",X"37",X"64",X"3A",X"09",X"64",X"5F",X"2A",X"0C",X"64",X"3A", + X"0E",X"64",X"5F",X"2A",X"0F",X"64",X"3A",X"29",X"64",X"5F",X"2A",X"2C",X"64",X"3A",X"2E",X"64", + X"5F",X"2A",X"2F",X"64",X"3A",X"19",X"64",X"5F",X"2A",X"1C",X"64",X"3A",X"1E",X"64",X"5F",X"2A", + X"1F",X"64",X"3A",X"39",X"64",X"5F",X"2A",X"3C",X"64",X"3A",X"3E",X"64",X"5F",X"2A",X"3F",X"64", + X"3A",X"41",X"64",X"5F",X"2A",X"44",X"64",X"3A",X"46",X"64",X"5F",X"2A",X"47",X"64",X"3A",X"61", + X"64",X"5F",X"2A",X"64",X"64",X"3A",X"66",X"64",X"5F",X"2A",X"67",X"64",X"3A",X"51",X"64",X"5F", + X"2A",X"54",X"64",X"3A",X"56",X"64",X"5F",X"2A",X"57",X"64",X"3A",X"71",X"64",X"5F",X"09",X"96", + X"64",X"E3",X"7E",X"28",X"19",X"E3",X"6E",X"08",X"2D",X"06",X"06",X"09",X"4C",X"64",X"11",X"4A", + X"50",X"3E",X"06",X"26",X"02",X"ED",X"88",X"ED",X"88",X"E5",X"98",X"15",X"10",X"DB",X"06",X"06", + X"09",X"4E",X"64",X"11",X"DA",X"67",X"3E",X"06",X"26",X"02",X"ED",X"88",X"ED",X"88",X"E5",X"98", + X"15",X"10",X"DB",X"C3",X"7E",X"01",X"ED",X"73",X"4C",X"64",X"E5",X"60",X"27",X"ED",X"53",X"4A", + X"50",X"ED",X"73",X"6C",X"64",X"E5",X"60",X"27",X"ED",X"53",X"4C",X"50",X"ED",X"73",X"5C",X"64", + X"E5",X"60",X"27",X"ED",X"53",X"4E",X"50",X"ED",X"73",X"7C",X"64",X"E5",X"60",X"27",X"ED",X"53", + X"68",X"50",X"ED",X"73",X"84",X"64",X"E5",X"60",X"27",X"ED",X"53",X"6A",X"50",X"ED",X"73",X"A4", + X"64",X"E5",X"60",X"27",X"ED",X"53",X"6C",X"50",X"2A",X"4E",X"64",X"E5",X"49",X"27",X"0A",X"DA", + X"67",X"2A",X"6E",X"64",X"E5",X"49",X"27",X"0A",X"DC",X"67",X"2A",X"5E",X"64",X"E5",X"49",X"27", + X"0A",X"DE",X"67",X"2A",X"7E",X"64",X"E5",X"49",X"27",X"0A",X"F8",X"67",X"2A",X"86",X"64",X"E5", + X"49",X"27",X"0A",X"FA",X"67",X"2A",X"A6",X"64",X"E5",X"49",X"27",X"0A",X"FC",X"67",X"2A",X"93", + X"64",X"0B",X"0A",X"93",X"64",X"7E",X"FE",X"FF",X"08",X"06",X"09",X"8D",X"39",X"0A",X"93",X"64", + X"09",X"95",X"64",X"E3",X"46",X"08",X"56",X"3A",X"00",X"50",X"E3",X"6F",X"E2",X"2A",X"02",X"E3", + X"A6",X"E3",X"56",X"08",X"3D",X"3A",X"00",X"50",X"E3",X"7F",X"E2",X"38",X"02",X"3A",X"B0",X"64", + X"FE",X"06",X"28",X"07",X"3C",X"1A",X"B0",X"64",X"C3",X"3D",X"02",X"AF",X"1A",X"B0",X"64",X"E3", + X"76",X"08",X"22",X"3A",X"B1",X"64",X"FE",X"00",X"08",X"23",X"C3",X"3D",X"02",X"AF",X"1A",X"07", + X"50",X"E3",X"B6",X"30",X"68",X"3D",X"1A",X"B1",X"64",X"3E",X"01",X"1A",X"07",X"50",X"E3",X"F6", + X"30",X"73",X"3A",X"00",X"50",X"E3",X"7F",X"28",X"C4",X"E3",X"96",X"30",X"10",X"3A",X"00",X"50", + X"E3",X"6F",X"28",X"AD",X"E3",X"86",X"3A",X"B1",X"64",X"3C",X"1A",X"B1",X"64",X"3A",X"B2",X"64", + X"FE",X"14",X"18",X"32",X"47",X"3A",X"B4",X"64",X"80",X"1A",X"B2",X"64",X"E3",X"3F",X"06",X"00", + X"80",X"0F",X"1A",X"B5",X"64",X"E5",X"35",X"15",X"E3",X"4E",X"08",X"02",X"E3",X"EE",X"3A",X"05", + X"65",X"E3",X"C7",X"1A",X"05",X"65",X"E3",X"DE",X"30",X"83",X"E3",X"66",X"08",X"05",X"E3",X"E6", + X"C3",X"89",X"01",X"E3",X"C6",X"C3",X"B7",X"01",X"E3",X"D6",X"C3",X"AD",X"01",X"00",X"09",X"96", + X"64",X"E3",X"46",X"28",X"16",X"E5",X"3F",X"16",X"09",X"96",X"64",X"E3",X"7E",X"28",X"04",X"E3", + X"6E",X"28",X"05",X"E5",X"37",X"16",X"30",X"03",X"E5",X"2F",X"16",X"3A",X"B7",X"64",X"3C",X"1A", + X"B7",X"64",X"3A",X"B6",X"64",X"3C",X"1A",X"B6",X"64",X"FE",X"3C",X"08",X"23",X"AF",X"1A",X"B6", + X"64",X"3A",X"88",X"64",X"3C",X"1A",X"88",X"64",X"09",X"95",X"64",X"E3",X"BE",X"3A",X"00",X"50", + X"E3",X"5F",X"08",X"1D",X"AF",X"1A",X"01",X"50",X"09",X"4A",X"50",X"06",X"24",X"1E",X"00",X"0B", + X"10",X"FB",X"3E",X"40",X"E5",X"FD",X"14",X"3E",X"21",X"E5",X"25",X"15",X"11",X"D0",X"41",X"09", + X"92",X"31",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"06",X"FF",X"09",X"FF",X"FF",X"2B",X"7D", + X"BC",X"1A",X"C0",X"50",X"08",X"F8",X"10",X"DB",X"5E",X"FB",X"3E",X"01",X"1A",X"00",X"50",X"FD", + X"C9",X"F5",X"C9",X"F1",X"20",X"ED",X"65",X"3A",X"00",X"50",X"E3",X"4F",X"C2",X"A7",X"05",X"AF", + X"06",X"20",X"09",X"00",X"50",X"5F",X"0B",X"10",X"FC",X"3E",X"00",X"1A",X"03",X"50",X"19",X"D9", + X"67",X"E5",X"22",X"16",X"DB",X"20",X"AF",X"20",X"09",X"00",X"40",X"E5",X"16",X"05",X"20",X"E3", + X"47",X"28",X"02",X"E3",X"D7",X"E3",X"67",X"28",X"02",X"E3",X"F7",X"20",X"09",X"00",X"44",X"E5", + X"16",X"05",X"20",X"E3",X"47",X"28",X"02",X"E3",X"CF",X"E3",X"67",X"28",X"02",X"E3",X"EF",X"20", + X"19",X"FD",X"43",X"09",X"00",X"64",X"E5",X"16",X"05",X"20",X"E3",X"47",X"28",X"02",X"E3",X"DF", + X"E3",X"67",X"28",X"02",X"E3",X"FF",X"20",X"3E",X"01",X"E5",X"25",X"15",X"09",X"00",X"40",X"11", + X"01",X"40",X"01",X"FE",X"03",X"1E",X"40",X"ED",X"98",X"11",X"4E",X"41",X"09",X"57",X"32",X"3E", + X"01",X"06",X"23",X"E5",X"D5",X"15",X"11",X"A2",X"40",X"09",X"4A",X"32",X"3E",X"01",X"06",X"30", + X"E5",X"D5",X"15",X"11",X"EC",X"40",X"09",X"7A",X"32",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15", + X"11",X"ED",X"40",X"09",X"A6",X"32",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"EE",X"40", + X"09",X"8A",X"32",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"EF",X"40",X"09",X"9E",X"32", + X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"93",X"40",X"09",X"46",X"33",X"3E",X"01",X"06", + X"30",X"E5",X"D5",X"15",X"11",X"DD",X"40",X"09",X"E2",X"32",X"3E",X"01",X"06",X"14",X"E5",X"D5", + X"15",X"11",X"DE",X"40",X"09",X"F6",X"32",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"DF", + X"40",X"09",X"DA",X"32",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"F8",X"40",X"09",X"06", + X"33",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"F9",X"40",X"09",X"32",X"33",X"3E",X"01", + X"06",X"14",X"E5",X"D5",X"15",X"11",X"FA",X"40",X"09",X"2E",X"33",X"3E",X"01",X"06",X"14",X"E5", + X"D5",X"15",X"20",X"1A",X"FE",X"64",X"20",X"3A",X"FE",X"64",X"E3",X"57",X"28",X"25",X"11",X"DD", + X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"E3",X"77", + X"28",X"25",X"11",X"DE",X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A", + X"FE",X"64",X"E3",X"4F",X"28",X"25",X"11",X"DF",X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04", + X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"E3",X"6F",X"28",X"25",X"11",X"F8",X"40",X"09",X"42",X"33", + X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"E3",X"5F",X"28",X"25",X"11",X"F9", + X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"E3",X"7F", + X"28",X"25",X"11",X"FA",X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"36", + X"00",X"09",X"00",X"00",X"E5",X"FD",X"04",X"18",X"02",X"E3",X"C3",X"09",X"00",X"10",X"E5",X"FD", + X"04",X"18",X"02",X"E3",X"E3",X"09",X"00",X"08",X"E5",X"FD",X"04",X"18",X"02",X"E3",X"D3",X"09", + X"00",X"18",X"E5",X"FD",X"04",X"18",X"02",X"E3",X"F3",X"3A",X"FE",X"64",X"FE",X"00",X"28",X"02", + X"3E",X"80",X"9B",X"1A",X"FE",X"64",X"E3",X"47",X"28",X"25",X"11",X"EC",X"40",X"09",X"42",X"33", + X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"E3",X"67",X"28",X"25",X"11",X"ED", + X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"E3",X"57", + X"28",X"25",X"11",X"EE",X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04",X"E5",X"D5",X"15",X"3A", + X"FE",X"64",X"E3",X"77",X"28",X"25",X"11",X"EF",X"40",X"09",X"42",X"33",X"3E",X"01",X"06",X"04", + X"E5",X"D5",X"15",X"3A",X"FE",X"64",X"FE",X"00",X"08",X"26",X"FB",X"3E",X"01",X"1A",X"00",X"50", + X"3E",X"02",X"E5",X"67",X"15",X"C3",X"F1",X"02",X"1A",X"C0",X"50",X"30",X"FB",X"01",X"00",X"10", + X"AF",X"1A",X"C0",X"50",X"86",X"0B",X"57",X"23",X"79",X"98",X"7A",X"08",X"DF",X"FE",X"FF",X"28", + X"02",X"1F",X"E1",X"1F",X"3F",X"E1",X"20",X"CE",X"FC",X"20",X"CD",X"3E",X"11",X"E5",X"1D",X"05", + X"C9",X"CD",X"3E",X"0A",X"E5",X"1D",X"05",X"C9",X"CD",X"3E",X"44",X"E5",X"1D",X"05",X"C9",X"3E", + X"A0",X"E5",X"1D",X"05",X"E1",X"1A",X"C0",X"50",X"CD",X"CD",X"D1",X"13",X"01",X"FF",X"03",X"5F", + X"ED",X"98",X"C9",X"01",X"00",X"04",X"BE",X"C4",X"53",X"05",X"0B",X"77",X"23",X"79",X"98",X"7B", + X"08",X"DC",X"E1",X"77",X"7E",X"CE",X"27",X"57",X"7B",X"CE",X"27",X"BA",X"28",X"04",X"20",X"E3", + X"E7",X"20",X"7E",X"CE",X"D8",X"57",X"7B",X"CE",X"D8",X"BA",X"E0",X"20",X"E3",X"C7",X"20",X"7B", + X"E1",X"65",X"52",X"08",X"54",X"66",X"54",X"2C",X"43",X"67",X"50",X"71",X"52",X"61",X"47",X"60", + X"54",X"08",X"19",X"39",X"38",X"1B",X"54",X"45",X"64",X"63",X"67",X"08",X"61",X"66",X"43",X"1A", + X"C0",X"50",X"09",X"00",X"40",X"11",X"01",X"40",X"01",X"FE",X"07",X"1E",X"40",X"ED",X"98",X"1A", + X"C0",X"50",X"09",X"00",X"64",X"11",X"01",X"64",X"01",X"FE",X"03",X"1E",X"00",X"ED",X"98",X"1A", + X"C0",X"50",X"09",X"48",X"50",X"11",X"49",X"50",X"01",X"27",X"00",X"1E",X"00",X"ED",X"98",X"1A", + X"C0",X"50",X"09",X"D8",X"67",X"11",X"D9",X"67",X"01",X"27",X"00",X"1E",X"00",X"ED",X"98",X"1A", + X"C0",X"50",X"09",X"40",X"50",X"11",X"41",X"50",X"01",X"37",X"00",X"1E",X"00",X"ED",X"98",X"09", + X"24",X"64",X"11",X"25",X"64",X"01",X"67",X"00",X"1E",X"FF",X"ED",X"98",X"09",X"8D",X"39",X"0A", + X"93",X"64",X"3A",X"80",X"50",X"47",X"CE",X"03",X"1A",X"B3",X"64",X"09",X"B4",X"33",X"E5",X"98", + X"15",X"7E",X"1A",X"B4",X"64",X"78",X"CE",X"24",X"E3",X"3F",X"E3",X"3F",X"09",X"89",X"39",X"E5", + X"98",X"15",X"7E",X"1A",X"8A",X"64",X"78",X"CE",X"18",X"09",X"49",X"39",X"E5",X"98",X"15",X"0A", + X"8B",X"64",X"78",X"CE",X"18",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"1A",X"8D",X"64", + X"78",X"E3",X"5F",X"08",X"05",X"09",X"96",X"64",X"E3",X"FE",X"FB",X"3E",X"01",X"1A",X"00",X"50", + X"E5",X"04",X"1C",X"09",X"C2",X"43",X"11",X"C3",X"43",X"01",X"3C",X"00",X"1E",X"40",X"ED",X"98", + X"09",X"C2",X"47",X"11",X"C3",X"47",X"01",X"34",X"00",X"1E",X"05",X"ED",X"98",X"1A",X"C0",X"50", + X"09",X"CA",X"47",X"11",X"CB",X"47",X"01",X"34",X"00",X"1E",X"21",X"ED",X"98",X"1A",X"C0",X"50", + X"09",X"A3",X"30",X"11",X"C3",X"43",X"01",X"32",X"00",X"ED",X"98",X"AF",X"1A",X"CC",X"43",X"1A", + X"ED",X"43",X"1A",X"DE",X"43",X"09",X"BA",X"39",X"11",X"9B",X"64",X"01",X"3C",X"00",X"ED",X"98", + X"09",X"B8",X"64",X"11",X"DA",X"43",X"E5",X"0E",X"10",X"09",X"02",X"40",X"11",X"03",X"40",X"01", + X"3C",X"00",X"1E",X"40",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"02",X"44",X"11",X"03",X"44",X"01", + X"34",X"00",X"1E",X"21",X"ED",X"98",X"09",X"0A",X"44",X"11",X"0B",X"44",X"01",X"34",X"00",X"1E", + X"11",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"8D",X"30",X"11",X"27",X"40",X"01",X"06",X"00",X"ED", + X"98",X"AF",X"1A",X"24",X"40",X"3A",X"B3",X"64",X"FE",X"00",X"08",X"23",X"09",X"AB",X"30",X"11", + X"24",X"40",X"01",X"21",X"00",X"ED",X"98",X"1A",X"C0",X"50",X"09",X"05",X"65",X"11",X"06",X"65", + X"01",X"FF",X"00",X"1E",X"00",X"ED",X"98",X"09",X"5C",X"1D",X"0A",X"36",X"65",X"0A",X"06",X"65", + X"09",X"35",X"65",X"0A",X"25",X"65",X"09",X"8A",X"1D",X"0A",X"39",X"65",X"0A",X"09",X"65",X"09", + X"38",X"65",X"0A",X"28",X"65",X"09",X"B9",X"1D",X"0A",X"54",X"65",X"0A",X"3C",X"65",X"09",X"53", + X"65",X"0A",X"43",X"65",X"09",X"EB",X"1D",X"0A",X"6F",X"65",X"0A",X"57",X"65",X"09",X"6E",X"65", + X"0A",X"76",X"65",X"09",X"B0",X"1E",X"0A",X"A2",X"65",X"0A",X"5A",X"65",X"09",X"A1",X"65",X"0A", + X"79",X"65",X"09",X"E2",X"1E",X"0A",X"8D",X"65",X"0A",X"A5",X"65",X"09",X"8C",X"65",X"0A",X"94", + X"65",X"09",X"04",X"38",X"0A",X"C0",X"65",X"0A",X"A8",X"65",X"09",X"BF",X"65",X"0A",X"AF",X"65", + X"09",X"31",X"38",X"0A",X"F3",X"65",X"0A",X"C3",X"65",X"09",X"F2",X"65",X"0A",X"E2",X"65",X"06", + X"08",X"09",X"40",X"50",X"1E",X"00",X"0B",X"10",X"FB",X"3E",X"00",X"1A",X"03",X"50",X"09",X"96", + X"64",X"E3",X"EE",X"3A",X"B3",X"64",X"FE",X"00",X"E2",X"39",X"21",X"3A",X"B2",X"64",X"FE",X"00", + X"C2",X"39",X"21",X"09",X"95",X"64",X"E3",X"8E",X"AF",X"1A",X"01",X"50",X"09",X"96",X"64",X"E3", + X"86",X"E5",X"22",X"16",X"1A",X"C0",X"50",X"E5",X"D1",X"19",X"3E",X"01",X"E5",X"67",X"15",X"09", + X"95",X"64",X"E3",X"6E",X"C2",X"39",X"21",X"E5",X"7C",X"10",X"3E",X"07",X"E5",X"67",X"15",X"09", + X"95",X"64",X"E3",X"6E",X"C2",X"39",X"21",X"3E",X"40",X"E5",X"FD",X"14",X"11",X"44",X"44",X"09", + X"DE",X"39",X"3E",X"01",X"06",X"34",X"E5",X"EB",X"15",X"11",X"61",X"44",X"09",X"F8",X"39",X"3E", + X"03",X"06",X"34",X"E5",X"EB",X"15",X"11",X"50",X"44",X"09",X"DF",X"39",X"3E",X"03",X"06",X"34", + X"E5",X"EB",X"15",X"11",X"70",X"44",X"09",X"F8",X"39",X"3E",X"03",X"06",X"34",X"E5",X"EB",X"15", + X"11",X"73",X"44",X"09",X"F9",X"39",X"3E",X"03",X"06",X"34",X"E5",X"EB",X"15",X"11",X"C4",X"40", + X"09",X"96",X"31",X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"E1",X"40",X"09",X"AB",X"31", + X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"A3",X"40",X"09",X"BF",X"31",X"3E",X"01",X"06", + X"30",X"E5",X"D5",X"15",X"11",X"98",X"40",X"09",X"D7",X"31",X"3E",X"01",X"06",X"16",X"E5",X"D5", + X"15",X"11",X"52",X"41",X"09",X"ED",X"31",X"3E",X"01",X"06",X"24",X"E5",X"D5",X"15",X"3A",X"B3", + X"64",X"FE",X"01",X"08",X"27",X"11",X"31",X"41",X"09",X"F9",X"31",X"3E",X"01",X"06",X"27",X"E5", + X"D5",X"15",X"30",X"08",X"FE",X"02",X"08",X"27",X"11",X"31",X"41",X"09",X"20",X"32",X"3E",X"01", + X"06",X"27",X"E5",X"D5",X"15",X"30",X"25",X"11",X"31",X"41",X"09",X"17",X"32",X"3E",X"01",X"06", + X"27",X"E5",X"D5",X"15",X"11",X"B4",X"40",X"09",X"0E",X"32",X"3E",X"01",X"06",X"31",X"E5",X"D5", + X"15",X"3A",X"8D",X"64",X"FE",X"00",X"08",X"27",X"11",X"7C",X"41",X"09",X"3F",X"32",X"3E",X"01", + X"06",X"06",X"E5",X"D5",X"15",X"30",X"1B",X"FE",X"01",X"08",X"27",X"11",X"7C",X"41",X"09",X"45", + X"32",X"3E",X"01",X"06",X"06",X"E5",X"D5",X"15",X"30",X"08",X"FE",X"02",X"08",X"27",X"11",X"7C", + X"41",X"09",X"63",X"32",X"3E",X"01",X"06",X"06",X"E5",X"D5",X"15",X"30",X"25",X"11",X"7C",X"41", + X"09",X"51",X"32",X"3E",X"01",X"06",X"06",X"E5",X"D5",X"15",X"3E",X"04",X"E5",X"67",X"15",X"09", + X"95",X"64",X"E3",X"6E",X"08",X"53",X"E5",X"05",X"1C",X"AF",X"1A",X"FF",X"64",X"1A",X"01",X"65", + X"1A",X"03",X"65",X"1A",X"00",X"65",X"1A",X"02",X"65",X"1A",X"04",X"65",X"E5",X"07",X"1C",X"E5", + X"FA",X"26",X"E5",X"14",X"1C",X"E5",X"BC",X"33",X"AF",X"1A",X"08",X"65",X"1A",X"3B",X"65",X"1A", + X"56",X"65",X"1A",X"59",X"65",X"1A",X"A4",X"65",X"1A",X"8F",X"65",X"1A",X"C2",X"65",X"E5",X"15", + X"16",X"1A",X"C0",X"50",X"09",X"95",X"64",X"E3",X"6E",X"08",X"26",X"09",X"96",X"64",X"E3",X"66", + X"08",X"02",X"30",X"E6",X"E3",X"A6",X"C3",X"89",X"07",X"E5",X"22",X"16",X"09",X"95",X"64",X"E3", + X"CE",X"E3",X"AE",X"09",X"96",X"64",X"E3",X"A6",X"E3",X"96",X"E3",X"B6",X"09",X"97",X"64",X"E3", + X"96",X"09",X"96",X"64",X"E3",X"C6",X"09",X"24",X"64",X"11",X"25",X"64",X"01",X"67",X"00",X"1E", + X"FF",X"ED",X"98",X"3E",X"FF",X"1A",X"01",X"50",X"09",X"97",X"64",X"E3",X"56",X"08",X"27",X"3A", + X"FD",X"64",X"3C",X"1A",X"FD",X"64",X"FE",X"14",X"08",X"04",X"E3",X"D6",X"E3",X"F6",X"00",X"1A", + X"C0",X"50",X"3E",X"40",X"E5",X"FD",X"14",X"3E",X"03",X"E5",X"25",X"15",X"3A",X"B3",X"64",X"FE", + X"00",X"E2",X"14",X"22",X"3A",X"B2",X"64",X"FE",X"02",X"18",X"64",X"11",X"58",X"41",X"09",X"9C", + X"30",X"3E",X"01",X"06",X"23",X"E5",X"D5",X"15",X"3A",X"40",X"50",X"E3",X"6F",X"08",X"5C",X"3A", + X"B3",X"64",X"FE",X"00",X"28",X"15",X"3A",X"B2",X"64",X"FE",X"02",X"38",X"4E",X"D6",X"02",X"1A", + X"B2",X"64",X"3A",X"B5",X"64",X"D6",X"01",X"0F",X"1A",X"B5",X"64",X"09",X"96",X"64",X"E3",X"CE", + X"3A",X"8A",X"64",X"1A",X"8E",X"64",X"E5",X"13",X"00",X"3A",X"B3",X"64",X"FE",X"00",X"E2",X"6F", + X"22",X"E5",X"35",X"15",X"C3",X"6F",X"22",X"FE",X"04",X"18",X"29",X"11",X"26",X"41",X"09",X"BF", + X"30",X"3E",X"01",X"06",X"11",X"E5",X"D5",X"15",X"11",X"10",X"42",X"09",X"D0",X"30",X"3E",X"01", + X"06",X"02",X"E5",X"D5",X"15",X"11",X"5A",X"41",X"09",X"9C",X"30",X"3E",X"01",X"06",X"23",X"E5", + X"D5",X"15",X"30",X"94",X"11",X"90",X"40",X"09",X"D2",X"30",X"3E",X"01",X"06",X"31",X"E5",X"D5", + X"15",X"30",X"85",X"3A",X"40",X"50",X"E3",X"5F",X"08",X"1B",X"3A",X"B3",X"64",X"FE",X"00",X"28", + X"15",X"3A",X"B2",X"64",X"FE",X"04",X"38",X"0D",X"D6",X"04",X"1A",X"B2",X"64",X"3A",X"B5",X"64", + X"D6",X"02",X"0F",X"1A",X"B5",X"64",X"09",X"96",X"64",X"E3",X"8E",X"3A",X"8A",X"64",X"1A",X"8E", + X"64",X"1A",X"8F",X"64",X"E5",X"13",X"00",X"E5",X"0C",X"00",X"C3",X"F1",X"21",X"1A",X"C0",X"50", + X"09",X"95",X"64",X"E3",X"5E",X"08",X"03",X"C3",X"A8",X"21",X"E3",X"9E",X"C3",X"7F",X"21",X"AF", + X"09",X"A8",X"64",X"11",X"A9",X"64",X"01",X"05",X"00",X"5F",X"ED",X"98",X"1A",X"99",X"64",X"1A", + X"9A",X"64",X"3E",X"40",X"09",X"CC",X"43",X"11",X"CD",X"43",X"01",X"05",X"00",X"5F",X"ED",X"98", + X"09",X"DE",X"43",X"11",X"DF",X"43",X"01",X"05",X"00",X"5F",X"ED",X"98",X"AF",X"1A",X"CC",X"43", + X"1A",X"DE",X"43",X"AF",X"1A",X"FF",X"64",X"1A",X"01",X"65",X"1A",X"03",X"65",X"1A",X"00",X"65", + X"1A",X"02",X"65",X"1A",X"04",X"65",X"E5",X"06",X"1C",X"E5",X"13",X"1C",X"09",X"97",X"64",X"E3", + X"E6",X"09",X"96",X"64",X"E3",X"4E",X"28",X"02",X"30",X"32",X"3E",X"00",X"1A",X"03",X"50",X"E5", + X"44",X"15",X"11",X"50",X"41",X"09",X"EB",X"30",X"3E",X"01",X"06",X"25",X"E5",X"D5",X"15",X"3E", + X"03",X"E5",X"67",X"15",X"09",X"96",X"64",X"E3",X"EE",X"3A",X"8E",X"64",X"3D",X"1A",X"8E",X"64", + X"3E",X"40",X"09",X"16",X"40",X"11",X"17",X"40",X"01",X"20",X"00",X"5F",X"ED",X"98",X"E5",X"13", + X"00",X"3A",X"FF",X"64",X"1A",X"03",X"65",X"3A",X"00",X"65",X"1A",X"04",X"65",X"E5",X"6B",X"1C", + X"C3",X"B3",X"23",X"09",X"96",X"64",X"E3",X"4E",X"08",X"E2",X"E3",X"6E",X"28",X"AC",X"3A",X"96", + X"64",X"E3",X"7F",X"08",X"43",X"E5",X"44",X"15",X"11",X"50",X"41",X"09",X"F8",X"30",X"3E",X"01", + X"06",X"25",X"E5",X"D5",X"15",X"3E",X"03",X"E5",X"67",X"15",X"09",X"96",X"64",X"E3",X"AE",X"3A", + X"8F",X"64",X"3D",X"1A",X"8F",X"64",X"3E",X"40",X"09",X"02",X"40",X"11",X"03",X"40",X"01",X"20", + X"00",X"5F",X"ED",X"98",X"E5",X"0C",X"00",X"3A",X"01",X"65",X"1A",X"03",X"65",X"3A",X"02",X"65", + X"1A",X"04",X"65",X"E5",X"6D",X"1C",X"30",X"1B",X"3E",X"01",X"1A",X"03",X"50",X"30",X"9E",X"E5", + X"44",X"15",X"09",X"96",X"64",X"E3",X"4E",X"C2",X"E9",X"22",X"11",X"10",X"41",X"09",X"05",X"31", + X"3E",X"01",X"06",X"11",X"E5",X"D5",X"15",X"09",X"08",X"65",X"E3",X"C6",X"3E",X"01",X"E5",X"67", + X"15",X"09",X"96",X"64",X"E3",X"6E",X"28",X"8F",X"C3",X"E9",X"22",X"E5",X"FA",X"26",X"09",X"97", + X"64",X"E3",X"66",X"28",X"13",X"E3",X"A6",X"09",X"C2",X"65",X"E3",X"C6",X"1A",X"C0",X"50",X"3A", + X"C2",X"65",X"FE",X"00",X"08",X"DE",X"30",X"05",X"3E",X"02",X"E5",X"67",X"15",X"09",X"8F",X"65", + X"E3",X"C6",X"09",X"59",X"65",X"E3",X"C6",X"E5",X"BC",X"33",X"ED",X"73",X"AE",X"64",X"7B",X"9A", + X"28",X"21",X"09",X"00",X"00",X"0A",X"AE",X"64",X"E5",X"4E",X"27",X"1A",X"C0",X"50",X"E5",X"15", + X"16",X"09",X"96",X"64",X"E3",X"66",X"28",X"F7",X"E3",X"A6",X"E5",X"22",X"16",X"09",X"96",X"64", + X"E3",X"56",X"08",X"27",X"E5",X"59",X"1C",X"E5",X"22",X"16",X"09",X"96",X"64",X"E3",X"76",X"08", + X"21",X"30",X"4F",X"E3",X"96",X"E5",X"58",X"1C",X"30",X"EA",X"E3",X"B6",X"09",X"97",X"64",X"E3", + X"E6",X"09",X"96",X"64",X"E3",X"6E",X"08",X"29",X"3A",X"01",X"65",X"3C",X"FE",X"24",X"08",X"02", + X"3E",X"23",X"1A",X"01",X"65",X"1A",X"03",X"65",X"3A",X"02",X"65",X"3C",X"FE",X"31",X"08",X"02", + X"3E",X"30",X"1A",X"02",X"65",X"1A",X"04",X"65",X"E5",X"5A",X"1C",X"E5",X"6F",X"1C",X"C3",X"B3", + X"23",X"3A",X"FF",X"64",X"3C",X"FE",X"24",X"08",X"02",X"3E",X"23",X"1A",X"FF",X"64",X"1A",X"03", + X"65",X"3A",X"00",X"65",X"3C",X"FE",X"31",X"08",X"02",X"3E",X"30",X"1A",X"00",X"65",X"1A",X"04", + X"65",X"E5",X"5A",X"1C",X"E5",X"6E",X"1C",X"C3",X"B3",X"23",X"3A",X"98",X"64",X"FE",X"00",X"08", + X"2E",X"09",X"96",X"64",X"E3",X"6E",X"08",X"2F",X"3A",X"8F",X"64",X"FE",X"00",X"08",X"66",X"E5", + X"44",X"15",X"11",X"90",X"41",X"09",X"16",X"31",X"3E",X"01",X"06",X"21",X"E5",X"D5",X"15",X"3E", + X"02",X"E5",X"67",X"15",X"E5",X"EE",X"11",X"09",X"95",X"64",X"E3",X"DE",X"C3",X"79",X"07",X"D6", + X"01",X"1A",X"98",X"64",X"C3",X"6F",X"23",X"3A",X"8E",X"64",X"FE",X"00",X"08",X"0D",X"09",X"96", + X"64",X"E3",X"4E",X"08",X"E2",X"E5",X"44",X"15",X"11",X"D8",X"40",X"09",X"37",X"31",X"3E",X"01", + X"06",X"14",X"E5",X"D5",X"15",X"3E",X"03",X"E5",X"67",X"15",X"C3",X"36",X"23",X"E5",X"6C",X"1C", + X"C3",X"13",X"23",X"E5",X"6A",X"1C",X"C3",X"13",X"23",X"2A",X"91",X"64",X"EB",X"F5",X"09",X"00", + X"00",X"F5",X"31",X"F5",X"7E",X"01",X"F5",X"86",X"02",X"47",X"CE",X"27",X"F5",X"5F",X"02",X"E3", + X"38",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"F5",X"7E",X"00",X"09",X"07",X"25",X"E3",X"0F",X"E5", + X"98",X"15",X"76",X"0B",X"56",X"EB",X"E9",X"13",X"25",X"13",X"25",X"14",X"25",X"34",X"25",X"0C", + X"25",X"2C",X"25",X"E1",X"F5",X"7E",X"04",X"90",X"F5",X"5F",X"04",X"E1",X"F5",X"7E",X"04",X"80", + X"F5",X"5F",X"04",X"E1",X"F5",X"7E",X"03",X"80",X"F5",X"5F",X"03",X"E1",X"F5",X"7E",X"03",X"90", + X"F5",X"5F",X"03",X"E1",X"2A",X"76",X"64",X"EB",X"F5",X"09",X"00",X"00",X"F5",X"31",X"EB",X"01", + X"00",X"64",X"1F",X"3F",X"ED",X"42",X"CD",X"F5",X"7E",X"00",X"09",X"57",X"25",X"E3",X"0F",X"E5", + X"98",X"15",X"76",X"0B",X"56",X"EB",X"E9",X"0F",X"26",X"4B",X"25",X"8E",X"25",X"1E",X"26",X"40", + X"26",X"53",X"26",X"F5",X"7E",X"03",X"1A",X"74",X"64",X"F5",X"7E",X"04",X"1A",X"75",X"64",X"E5", + X"BD",X"26",X"F5",X"7E",X"06",X"12",X"3A",X"22",X"64",X"FE",X"00",X"08",X"17",X"3A",X"23",X"64", + X"FE",X"00",X"08",X"17",X"C1",X"09",X"24",X"64",X"21",X"CD",X"D1",X"13",X"01",X"05",X"00",X"1E", + X"FF",X"ED",X"98",X"E1",X"F5",X"7E",X"06",X"13",X"12",X"30",X"E9",X"F5",X"7E",X"06",X"09",X"08", + X"00",X"31",X"EB",X"12",X"30",X"F6",X"E5",X"CD",X"26",X"F5",X"7E",X"03",X"90",X"1A",X"74",X"64", + X"F5",X"7E",X"04",X"1A",X"75",X"64",X"E5",X"BD",X"26",X"3A",X"22",X"64",X"FE",X"00",X"28",X"1A", + X"3A",X"22",X"64",X"E3",X"0F",X"F5",X"46",X"05",X"80",X"3D",X"C1",X"FD",X"09",X"24",X"64",X"FD", + X"21",X"FD",X"5B",X"00",X"FD",X"5A",X"01",X"FD",X"5F",X"02",X"3C",X"13",X"FD",X"5B",X"03",X"FD", + X"5A",X"04",X"FD",X"5F",X"05",X"3A",X"74",X"64",X"F5",X"5F",X"03",X"3A",X"75",X"64",X"F5",X"5F", + X"04",X"E1",X"3A",X"23",X"64",X"FE",X"00",X"E2",X"74",X"26",X"3A",X"23",X"64",X"E3",X"0F",X"C6", + X"27",X"F5",X"46",X"05",X"80",X"C1",X"FD",X"09",X"24",X"64",X"FD",X"21",X"FD",X"5B",X"00",X"FD", + X"5A",X"01",X"FD",X"5F",X"02",X"3C",X"09",X"08",X"00",X"31",X"EB",X"FD",X"5B",X"03",X"FD",X"5A", + X"04",X"FD",X"5F",X"05",X"C3",X"CD",X"25",X"F5",X"7E",X"03",X"1A",X"74",X"64",X"F5",X"7E",X"04", + X"1A",X"75",X"64",X"C3",X"9E",X"25",X"E5",X"CD",X"26",X"F5",X"7E",X"03",X"80",X"C3",X"AD",X"25", + X"E5",X"CD",X"26",X"F5",X"7E",X"04",X"90",X"1A",X"75",X"64",X"F5",X"7E",X"03",X"1A",X"74",X"64", + X"C3",X"9E",X"25",X"E5",X"CD",X"26",X"F5",X"7E",X"04",X"80",X"30",X"EB",X"F5",X"7E",X"05",X"C1", + X"FD",X"09",X"24",X"64",X"FD",X"21",X"FD",X"5B",X"00",X"FD",X"5A",X"01",X"FD",X"5F",X"02",X"3A", + X"74",X"64",X"F5",X"5F",X"03",X"3A",X"75",X"64",X"F5",X"5F",X"04",X"F5",X"7E",X"00",X"09",X"90", + X"26",X"E3",X"0F",X"E5",X"98",X"15",X"D5",X"76",X"0B",X"56",X"EB",X"D1",X"F5",X"7E",X"06",X"E9", + X"B4",X"26",X"B4",X"26",X"B5",X"26",X"A8",X"26",X"AB",X"26",X"9A",X"26",X"E1",X"13",X"FD",X"5B", + X"03",X"FD",X"5A",X"04",X"FD",X"5F",X"05",X"E1",X"33",X"30",X"DB",X"09",X"08",X"00",X"31",X"EB", + X"30",X"EC",X"EB",X"11",X"08",X"00",X"1F",X"3F",X"ED",X"52",X"EB",X"30",X"C9",X"3A",X"74",X"64", + X"CE",X"07",X"1A",X"22",X"64",X"3A",X"75",X"64",X"CE",X"07",X"1A",X"23",X"64",X"3A",X"74",X"64", + X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"57",X"3A",X"75",X"64",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F", + X"77",X"E5",X"F7",X"14",X"E1",X"F5",X"7E",X"01",X"F5",X"86",X"02",X"47",X"CE",X"27",X"F5",X"5F", + X"02",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E3",X"38",X"E1",X"3A",X"03",X"65",X"09",X"20",X"27", + X"E3",X"0F",X"E3",X"0F",X"E5",X"98",X"15",X"E9",X"E5",X"2B",X"28",X"E1",X"E5",X"4D",X"28",X"E1", + X"E5",X"B7",X"28",X"E1",X"E5",X"F1",X"28",X"E1",X"E5",X"13",X"29",X"E1",X"E5",X"65",X"29",X"E1", + X"E5",X"87",X"29",X"E1",X"E5",X"C1",X"29",X"E1",X"E5",X"FB",X"29",X"E1",X"E5",X"1D",X"2A",X"E1", + X"E5",X"6F",X"2A",X"E1",X"E5",X"A9",X"2A",X"E1",X"E5",X"CB",X"2A",X"E1",X"E5",X"CC",X"2A",X"E1", + X"E5",X"CD",X"2A",X"E1",X"E5",X"CE",X"2A",X"E1",X"D5",X"1F",X"3F",X"09",X"26",X"01",X"16",X"00", + X"ED",X"52",X"7D",X"1F",X"3F",X"09",X"10",X"01",X"D1",X"72",X"16",X"00",X"ED",X"52",X"55",X"77", + X"E1",X"7D",X"EE",X"03",X"6F",X"E1",X"09",X"96",X"64",X"E3",X"46",X"E0",X"E3",X"6E",X"28",X"43", + X"09",X"A8",X"64",X"7B",X"86",X"0F",X"5F",X"0B",X"7A",X"A6",X"0F",X"5F",X"0B",X"3E",X"00",X"A6", + X"0F",X"5F",X"38",X"02",X"30",X"1A",X"09",X"96",X"64",X"E3",X"6E",X"28",X"13",X"09",X"DE",X"43", + X"11",X"DF",X"43",X"01",X"05",X"00",X"1E",X"40",X"ED",X"98",X"AF",X"1A",X"DE",X"43",X"30",X"30", + X"09",X"CC",X"43",X"11",X"CD",X"43",X"01",X"05",X"00",X"1E",X"40",X"ED",X"98",X"AF",X"1A",X"CC", + X"43",X"30",X"05",X"09",X"AB",X"64",X"30",X"BB",X"09",X"96",X"64",X"E3",X"6E",X"28",X"74",X"09", + X"AA",X"64",X"11",X"FB",X"43",X"3A",X"99",X"64",X"DD",X"E5",X"0E",X"10",X"0B",X"0B",X"0B",X"EB", + X"2A",X"8B",X"64",X"D9",X"FE",X"04",X"D0",X"E3",X"0F",X"E3",X"0F",X"3C",X"3C",X"E5",X"98",X"15", + X"E5",X"AA",X"11",X"D0",X"3A",X"98",X"64",X"3C",X"1A",X"98",X"64",X"09",X"08",X"65",X"E3",X"C6", + X"09",X"96",X"64",X"E3",X"6E",X"28",X"12",X"3A",X"99",X"64",X"3C",X"1A",X"99",X"64",X"3A",X"8E", + X"64",X"3C",X"1A",X"8E",X"64",X"E5",X"13",X"00",X"E1",X"3A",X"9A",X"64",X"3C",X"1A",X"9A",X"64", + X"3A",X"8F",X"64",X"3C",X"1A",X"8F",X"64",X"E5",X"0C",X"00",X"E1",X"09",X"AD",X"64",X"11",X"E9", + X"43",X"3A",X"9A",X"64",X"30",X"8A",X"3E",X"03",X"DD",X"7E",X"CE",X"D8",X"E3",X"3F",X"E3",X"3F", + X"E3",X"3F",X"E3",X"3F",X"47",X"3A",X"96",X"64",X"E3",X"5F",X"28",X"0A",X"78",X"12",X"33",X"7E", + X"CE",X"27",X"47",X"3A",X"96",X"64",X"E3",X"5F",X"1A",X"96",X"64",X"28",X"08",X"78",X"12",X"2B", + X"33",X"D9",X"3D",X"08",X"D3",X"3A",X"96",X"64",X"E3",X"9F",X"1A",X"96",X"64",X"E1",X"78",X"FE", + X"00",X"28",X"F3",X"3A",X"96",X"64",X"E3",X"DF",X"1A",X"96",X"64",X"30",X"E7",X"78",X"FE",X"00", + X"28",X"F5",X"3A",X"96",X"64",X"E3",X"DF",X"1A",X"96",X"64",X"30",X"D1",X"09",X"97",X"64",X"E3", + X"76",X"28",X"2C",X"E3",X"B6",X"09",X"40",X"40",X"E5",X"89",X"10",X"FE",X"3A",X"08",X"24",X"09", + X"40",X"44",X"E5",X"89",X"10",X"FE",X"B4",X"08",X"02",X"30",X"14",X"AF",X"1A",X"B3",X"64",X"30", + X"26",X"AF",X"11",X"80",X"03",X"86",X"0B",X"33",X"47",X"7A",X"9B",X"78",X"08",X"DF",X"E1",X"00", + X"3E",X"40",X"E5",X"FD",X"14",X"3E",X"21",X"E5",X"25",X"15",X"11",X"29",X"45",X"09",X"EE",X"10", + X"3E",X"15",X"06",X"23",X"E5",X"EB",X"15",X"11",X"45",X"41",X"09",X"1B",X"31",X"3E",X"01",X"06", + X"24",X"E5",X"D5",X"15",X"09",X"77",X"33",X"11",X"E2",X"42",X"01",X"FF",X"21",X"ED",X"88",X"13", + X"10",X"FB",X"AF",X"12",X"E5",X"02",X"16",X"3E",X"01",X"12",X"E5",X"EF",X"10",X"E1",X"03",X"09", + X"9B",X"64",X"11",X"6A",X"42",X"E5",X"2F",X"11",X"11",X"6C",X"42",X"E5",X"2F",X"11",X"11",X"6E", + X"42",X"E5",X"2F",X"11",X"11",X"58",X"42",X"E5",X"2F",X"11",X"11",X"5A",X"42",X"E5",X"2F",X"11", + X"11",X"5C",X"42",X"E5",X"2F",X"11",X"11",X"5E",X"42",X"E5",X"2F",X"11",X"11",X"78",X"42",X"E5", + X"2F",X"11",X"11",X"7A",X"42",X"E5",X"2F",X"11",X"11",X"7C",X"42",X"E5",X"2F",X"11",X"E1",X"06", + X"03",X"26",X"27",X"3E",X"09",X"ED",X"88",X"E5",X"E1",X"15",X"10",X"DF",X"0B",X"0B",X"3E",X"40", + X"E5",X"E1",X"15",X"E5",X"64",X"11",X"3E",X"04",X"E5",X"98",X"15",X"E1",X"3E",X"03",X"DD",X"7E", + X"CE",X"D8",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"47",X"3A",X"96",X"64",X"E3",X"5F", + X"28",X"2A",X"78",X"12",X"3E",X"08",X"E5",X"E1",X"15",X"7E",X"CE",X"27",X"47",X"3A",X"96",X"64", + X"E3",X"5F",X"1A",X"96",X"64",X"28",X"0C",X"78",X"12",X"2B",X"3E",X"08",X"E5",X"E1",X"15",X"D9", + X"3D",X"08",X"E3",X"3A",X"96",X"64",X"E3",X"9F",X"1A",X"96",X"64",X"E1",X"78",X"FE",X"00",X"28", + X"D3",X"3A",X"96",X"64",X"E3",X"DF",X"1A",X"96",X"64",X"30",X"C7",X"78",X"FE",X"00",X"28",X"F1", + X"3A",X"96",X"64",X"E3",X"DF",X"1A",X"96",X"64",X"30",X"E5",X"06",X"03",X"32",X"BE",X"38",X"20", + X"08",X"26",X"2B",X"33",X"10",X"DE",X"30",X"06",X"E5",X"C5",X"11",X"1F",X"3F",X"E1",X"1F",X"E1", + X"E5",X"C5",X"11",X"1F",X"E1",X"78",X"FE",X"00",X"E0",X"2B",X"33",X"3D",X"08",X"FB",X"E1",X"63", + X"65",X"52",X"08",X"54",X"66",X"54",X"2C",X"43",X"67",X"50",X"71",X"52",X"61",X"47",X"60",X"54", + X"08",X"19",X"39",X"38",X"1B",X"54",X"45",X"64",X"63",X"67",X"08",X"61",X"66",X"43",X"09",X"96", + X"64",X"E3",X"EE",X"09",X"A8",X"64",X"11",X"DD",X"64",X"01",X"03",X"00",X"ED",X"98",X"E5",X"30", + X"12",X"09",X"96",X"64",X"E3",X"4E",X"C0",X"E3",X"AE",X"09",X"AB",X"64",X"11",X"DD",X"64",X"01", + X"03",X"00",X"ED",X"98",X"E5",X"30",X"12",X"E1",X"01",X"00",X"22",X"09",X"D9",X"64",X"11",X"DF", + X"64",X"2B",X"2B",X"2B",X"C5",X"E5",X"AA",X"11",X"C1",X"18",X"22",X"3E",X"06",X"81",X"67",X"10", + X"ED",X"2B",X"2B",X"30",X"20",X"79",X"FE",X"00",X"E0",X"0B",X"0B",X"0B",X"0B",X"C5",X"CD",X"06", + X"00",X"09",X"EE",X"64",X"11",X"DC",X"64",X"ED",X"B8",X"3E",X"40",X"E5",X"FD",X"14",X"09",X"96", + X"64",X"E3",X"6E",X"08",X"33",X"11",X"4A",X"41",X"09",X"FB",X"30",X"3E",X"01",X"06",X"22",X"E5", + X"D5",X"15",X"09",X"96",X"64",X"E3",X"7E",X"28",X"31",X"3E",X"01",X"1A",X"03",X"50",X"30",X"12", + X"11",X"4A",X"41",X"09",X"EE",X"30",X"3E",X"01",X"06",X"22",X"E5",X"D5",X"15",X"3E",X"00",X"1A", + X"03",X"50",X"11",X"40",X"44",X"09",X"F3",X"14",X"3E",X"23",X"06",X"34",X"E5",X"EB",X"15",X"11", + X"64",X"44",X"09",X"F4",X"14",X"3E",X"03",X"06",X"34",X"E5",X"EB",X"15",X"11",X"51",X"44",X"09", + X"F5",X"14",X"3E",X"10",X"06",X"34",X"E5",X"EB",X"15",X"11",X"50",X"44",X"09",X"F6",X"14",X"3E", + X"02",X"06",X"34",X"E5",X"EB",X"15",X"D1",X"D5",X"3E",X"40",X"D5",X"C9",X"13",X"01",X"03",X"00", + X"5F",X"ED",X"98",X"1E",X"00",X"01",X"02",X"00",X"ED",X"98",X"D1",X"C1",X"D5",X"78",X"09",X"88", + X"33",X"E3",X"0F",X"E5",X"98",X"15",X"66",X"0B",X"46",X"C5",X"09",X"80",X"04",X"21",X"26",X"01", + X"06",X"27",X"59",X"3E",X"08",X"E5",X"BF",X"15",X"10",X"F8",X"11",X"C3",X"40",X"09",X"3F",X"31", + X"3E",X"01",X"06",X"14",X"E5",X"D5",X"15",X"11",X"8D",X"41",X"09",X"53",X"31",X"3E",X"01",X"06", + X"07",X"E5",X"D5",X"15",X"11",X"8F",X"40",X"09",X"72",X"31",X"3E",X"01",X"06",X"16",X"E5",X"D5", + X"15",X"11",X"A0",X"40",X"09",X"58",X"31",X"3E",X"01",X"06",X"17",X"E5",X"D5",X"15",X"11",X"69", + X"42",X"09",X"87",X"31",X"3E",X"01",X"06",X"20",X"E5",X"D5",X"15",X"11",X"64",X"40",X"09",X"A7", + X"31",X"3E",X"03",X"06",X"01",X"E5",X"D5",X"15",X"11",X"A5",X"40",X"09",X"82",X"33",X"3E",X"01", + X"06",X"32",X"E5",X"D5",X"15",X"3E",X"01",X"11",X"AD",X"47",X"12",X"AF",X"1A",X"F9",X"64",X"1A", + X"FA",X"64",X"09",X"AD",X"47",X"0A",X"FB",X"64",X"11",X"59",X"41",X"09",X"1B",X"31",X"3E",X"01", + X"06",X"24",X"E5",X"D5",X"15",X"09",X"77",X"33",X"11",X"DC",X"42",X"01",X"21",X"00",X"ED",X"98", + X"AF",X"12",X"E5",X"02",X"16",X"3E",X"01",X"12",X"09",X"9B",X"64",X"11",X"94",X"42",X"E5",X"2F", + X"11",X"11",X"95",X"42",X"E5",X"2F",X"11",X"11",X"96",X"42",X"E5",X"2F",X"11",X"11",X"97",X"42", + X"E5",X"2F",X"11",X"11",X"B0",X"42",X"E5",X"2F",X"11",X"11",X"B1",X"42",X"E5",X"2F",X"11",X"11", + X"B2",X"42",X"E5",X"2F",X"11",X"11",X"B3",X"42",X"E5",X"2F",X"11",X"11",X"B4",X"42",X"E5",X"2F", + X"11",X"11",X"B5",X"42",X"E5",X"2F",X"11",X"3A",X"F8",X"64",X"E3",X"67",X"E2",X"43",X"14",X"E3", + X"57",X"E2",X"7B",X"14",X"3A",X"F8",X"64",X"E3",X"4F",X"C2",X"BC",X"14",X"3A",X"F9",X"64",X"FE", + X"33",X"28",X"37",X"09",X"68",X"33",X"E5",X"98",X"15",X"7E",X"C9",X"D1",X"12",X"13",X"5F",X"3E", + X"08",X"E5",X"BF",X"15",X"D5",X"CD",X"3A",X"FA",X"64",X"3C",X"1A",X"FA",X"64",X"FE",X"03",X"C2", + X"E7",X"14",X"09",X"9C",X"33",X"3A",X"FA",X"64",X"E5",X"98",X"15",X"7E",X"C9",X"D1",X"CD",X"E5", + X"9D",X"15",X"09",X"DD",X"64",X"01",X"03",X"00",X"ED",X"98",X"3A",X"FA",X"64",X"FE",X"00",X"28", + X"0D",X"09",X"B8",X"33",X"E5",X"98",X"15",X"7E",X"D1",X"E5",X"E1",X"15",X"09",X"DF",X"64",X"E5", + X"64",X"11",X"09",X"B8",X"64",X"11",X"DA",X"43",X"E5",X"0E",X"10",X"09",X"97",X"64",X"E3",X"86", + X"3E",X"01",X"E5",X"67",X"15",X"E1",X"D1",X"3E",X"80",X"E5",X"E1",X"15",X"3E",X"08",X"E5",X"E1", + X"15",X"30",X"F1",X"3A",X"F9",X"64",X"FE",X"00",X"E2",X"C4",X"13",X"3D",X"1A",X"F9",X"64",X"FE", + X"32",X"28",X"14",X"3E",X"05",X"2A",X"FB",X"64",X"5F",X"3E",X"08",X"E5",X"98",X"15",X"0A",X"FB", + X"64",X"3E",X"01",X"5F",X"C3",X"C4",X"13",X"3D",X"1A",X"F9",X"64",X"3E",X"05",X"2A",X"FB",X"64", + X"2B",X"5F",X"0B",X"5F",X"0B",X"5F",X"2B",X"3E",X"40",X"30",X"C8",X"3A",X"F9",X"64",X"FE",X"33", + X"E2",X"C4",X"13",X"3C",X"1A",X"F9",X"64",X"FE",X"32",X"28",X"14",X"3E",X"05",X"2A",X"FB",X"64", + X"5F",X"3E",X"08",X"E5",X"BF",X"15",X"0A",X"FB",X"64",X"3E",X"01",X"5F",X"C3",X"C4",X"13",X"3C", + X"1A",X"F9",X"64",X"3E",X"05",X"2A",X"FB",X"64",X"5F",X"3E",X"40",X"E5",X"BF",X"15",X"0A",X"FB", + X"64",X"3E",X"01",X"2B",X"5F",X"0B",X"5F",X"0B",X"5F",X"C3",X"C4",X"13",X"3E",X"20",X"E5",X"B3", + X"15",X"1A",X"C0",X"50",X"06",X"14",X"E5",X"4F",X"15",X"F2",X"DA",X"13",X"C3",X"9F",X"13",X"3A", + X"F8",X"64",X"E3",X"4F",X"1A",X"C0",X"50",X"28",X"DE",X"30",X"CE",X"21",X"05",X"10",X"01",X"D5", + X"AF",X"E3",X"0B",X"17",X"E3",X"0B",X"17",X"E3",X"0B",X"17",X"E3",X"0B",X"17",X"E3",X"0B",X"17", + X"57",X"EB",X"01",X"40",X"40",X"21",X"06",X"00",X"D1",X"62",X"21",X"EB",X"E1",X"09",X"40",X"40", + X"11",X"41",X"40",X"01",X"7F",X"03",X"5F",X"ED",X"98",X"1A",X"C0",X"50",X"E1",X"09",X"40",X"44", + X"11",X"41",X"44",X"01",X"7F",X"03",X"5F",X"ED",X"98",X"1A",X"C0",X"50",X"E1",X"3A",X"B3",X"64", + X"FE",X"00",X"E0",X"3A",X"B5",X"64",X"CE",X"D8",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"E3",X"3F", + X"FE",X"00",X"28",X"24",X"1A",X"25",X"40",X"3A",X"B5",X"64",X"CE",X"27",X"1A",X"24",X"40",X"E1", + X"3E",X"40",X"30",X"D8",X"3E",X"21",X"E5",X"25",X"15",X"3E",X"40",X"E5",X"FD",X"14",X"E1",X"47", + X"AF",X"1A",X"B6",X"64",X"1A",X"88",X"64",X"3A",X"88",X"64",X"B8",X"E0",X"09",X"95",X"64",X"E3", + X"6E",X"C0",X"1A",X"C0",X"50",X"30",X"D8",X"3A",X"97",X"64",X"E3",X"47",X"28",X"25",X"3A",X"89", + X"64",X"47",X"3A",X"88",X"64",X"B8",X"18",X"31",X"1F",X"3F",X"E1",X"78",X"1A",X"89",X"64",X"3A", + X"97",X"64",X"E3",X"C7",X"1A",X"97",X"64",X"AF",X"1A",X"88",X"64",X"1A",X"B6",X"64",X"1F",X"3F", + X"E1",X"3A",X"97",X"64",X"E3",X"87",X"1A",X"97",X"64",X"1F",X"E1",X"47",X"AF",X"1A",X"B7",X"64", + X"3A",X"B7",X"64",X"B8",X"E0",X"09",X"95",X"64",X"E3",X"6E",X"C0",X"1A",X"C0",X"50",X"30",X"D8", + X"85",X"6F",X"D0",X"0C",X"E1",X"83",X"77",X"D0",X"14",X"E1",X"81",X"67",X"D0",X"04",X"E1",X"D5", + X"16",X"00",X"77",X"1F",X"3F",X"ED",X"52",X"D1",X"E1",X"CD",X"EB",X"16",X"00",X"77",X"1F",X"3F", + X"ED",X"52",X"EB",X"C9",X"E1",X"1A",X"48",X"64",X"D5",X"3A",X"48",X"64",X"67",X"ED",X"88",X"79", + X"FE",X"00",X"08",X"F9",X"D1",X"E5",X"02",X"16",X"10",X"EE",X"E1",X"1A",X"48",X"64",X"D5",X"3A", + X"48",X"64",X"67",X"ED",X"88",X"2B",X"79",X"FE",X"00",X"08",X"F8",X"D1",X"E5",X"02",X"16",X"10", + X"ED",X"E1",X"CD",X"09",X"08",X"00",X"31",X"EB",X"C9",X"E1",X"09",X"49",X"64",X"06",X"2F",X"1E", + X"00",X"0B",X"10",X"FB",X"E1",X"09",X"95",X"64",X"E3",X"FE",X"E3",X"7E",X"E0",X"30",X"FB",X"3A", + X"00",X"50",X"CE",X"27",X"47",X"3A",X"40",X"50",X"CE",X"D8",X"98",X"1A",X"F8",X"64",X"E1",X"3A", + X"40",X"50",X"47",X"CE",X"27",X"E3",X"78",X"28",X"02",X"E3",X"CF",X"1A",X"F8",X"64",X"E1",X"F5", + X"09",X"05",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17",X"F5",X"E3",X"00",X"56",X"28",X"10", + X"E5",X"78",X"17",X"FD",X"09",X"51",X"50",X"E5",X"47",X"17",X"F5",X"7E",X"06",X"1A",X"45",X"50", + X"F5",X"09",X"08",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17",X"F5",X"E3",X"00",X"56",X"28", + X"10",X"E5",X"78",X"17",X"FD",X"09",X"51",X"50",X"E5",X"47",X"17",X"F5",X"7E",X"06",X"1A",X"45", + X"50",X"F5",X"09",X"3B",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17",X"F5",X"E3",X"00",X"56", + X"28",X"10",X"E5",X"78",X"17",X"FD",X"09",X"51",X"50",X"E5",X"47",X"17",X"F5",X"7E",X"06",X"1A", + X"45",X"50",X"F5",X"09",X"56",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17",X"F5",X"E3",X"00", + X"56",X"28",X"10",X"E5",X"78",X"17",X"FD",X"09",X"56",X"50",X"E5",X"47",X"17",X"F5",X"7E",X"06", + X"1A",X"62",X"50",X"F5",X"09",X"59",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17",X"F5",X"E3", + X"00",X"56",X"28",X"10",X"E5",X"78",X"17",X"FD",X"09",X"56",X"50",X"E5",X"47",X"17",X"F5",X"7E", + X"06",X"1A",X"62",X"50",X"F5",X"09",X"A4",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17",X"F5", + X"E3",X"00",X"56",X"28",X"10",X"E5",X"78",X"17",X"FD",X"09",X"56",X"50",X"E5",X"47",X"17",X"F5", + X"7E",X"06",X"1A",X"62",X"50",X"F5",X"09",X"8F",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58",X"17", + X"F5",X"E3",X"00",X"56",X"28",X"10",X"E5",X"78",X"17",X"FD",X"09",X"73",X"50",X"E5",X"47",X"17", + X"F5",X"7E",X"06",X"1A",X"67",X"50",X"F5",X"09",X"C2",X"65",X"F5",X"E3",X"00",X"46",X"C4",X"58", + X"17",X"F5",X"E3",X"00",X"56",X"E0",X"E5",X"78",X"17",X"FD",X"09",X"73",X"50",X"E5",X"47",X"17", + X"F5",X"7E",X"06",X"1A",X"67",X"50",X"E1",X"F5",X"7E",X"03",X"FD",X"5F",X"00",X"E3",X"3F",X"E3", + X"3F",X"E3",X"3F",X"E3",X"3F",X"FD",X"5F",X"01",X"F5",X"7E",X"04",X"FD",X"5F",X"02",X"E3",X"3F", + X"E3",X"3F",X"E3",X"3F",X"E3",X"3F",X"FD",X"5F",X"03",X"F5",X"7E",X"05",X"FD",X"5F",X"04",X"E1", + X"E5",X"64",X"30",X"F5",X"E3",X"00",X"D6",X"E1",X"F5",X"E3",X"00",X"66",X"C2",X"64",X"30",X"F5", + X"6E",X"01",X"F5",X"4E",X"02",X"7E",X"E3",X"0F",X"11",X"96",X"17",X"E5",X"9D",X"15",X"0B",X"CD", + X"32",X"6F",X"13",X"32",X"4F",X"E9",X"98",X"17",X"9C",X"17",X"C2",X"17",X"E3",X"17",X"C9",X"17", + X"EE",X"17",X"20",X"30",X"09",X"30",X"43",X"30",X"63",X"30",X"6A",X"30",X"5E",X"30",X"82",X"30", + X"C9",X"C3",X"85",X"17",X"C9",X"7E",X"F5",X"5F",X"03",X"0B",X"7E",X"0B",X"F5",X"5F",X"04",X"C3", + X"85",X"17",X"C9",X"7E",X"F5",X"5F",X"05",X"0B",X"C3",X"85",X"17",X"C9",X"7E",X"F5",X"46",X"03", + X"80",X"F5",X"5F",X"03",X"0B",X"7E",X"0B",X"F5",X"46",X"04",X"A0",X"F5",X"5F",X"04",X"C3",X"85", + X"17",X"C9",X"7E",X"F5",X"46",X"05",X"80",X"F5",X"5F",X"05",X"0B",X"C3",X"85",X"17",X"C9",X"7E", + X"F5",X"BE",X"07",X"28",X"23",X"F5",X"1C",X"07",X"2B",X"F5",X"5D",X"01",X"F5",X"5C",X"02",X"E1", + X"F5",X"1E",X"07",X"00",X"0B",X"C3",X"85",X"17",X"F5",X"6E",X"20",X"F5",X"4E",X"21",X"D1",X"D5", + X"2B",X"5A",X"2B",X"5B",X"2B",X"1E",X"00",X"F5",X"5D",X"20",X"F5",X"5C",X"21",X"C9",X"C3",X"85", + X"17",X"D1",X"32",X"F5",X"6E",X"20",X"F5",X"4E",X"21",X"BE",X"28",X"21",X"1C",X"0B",X"76",X"0B", + X"56",X"EB",X"C3",X"85",X"17",X"0B",X"0B",X"0B",X"F5",X"5D",X"20",X"F5",X"5C",X"21",X"13",X"EB", + X"C3",X"85",X"17",X"C9",X"76",X"0B",X"56",X"EB",X"C3",X"85",X"17",X"C9",X"F5",X"CD",X"F5",X"CD", + X"C9",X"D1",X"13",X"1E",X"00",X"01",X"30",X"00",X"ED",X"98",X"32",X"F5",X"5F",X"01",X"13",X"32", + X"F5",X"5F",X"02",X"F5",X"5D",X"20",X"F5",X"5C",X"21",X"E1",X"C9",X"F5",X"5D",X"01",X"F5",X"5C", + X"02",X"F5",X"1E",X"00",X"00",X"E1",X"C9",X"76",X"0B",X"56",X"EB",X"1E",X"06",X"13",X"EB",X"C3", + X"85",X"17",X"C9",X"7E",X"F5",X"5F",X"06",X"0B",X"C3",X"85",X"17",X"1A",X"40",X"52",X"45",X"71", + X"41",X"64",X"50",X"40",X"45",X"52",X"67",X"43",X"53",X"50",X"67",X"54",X"40",X"19",X"40",X"52", + X"45",X"71",X"41",X"64",X"50",X"54",X"61",X"44",X"45",X"52",X"43",X"71",X"41",X"64",X"50",X"45", + X"45",X"52",X"46",X"40",X"66",X"61",X"67",X"43",X"40",X"54",X"52",X"45",X"53",X"66",X"61",X"52", + X"45",X"71",X"41",X"64",X"50",X"40",X"45",X"66",X"67",X"40",X"54",X"43",X"45",X"64",X"45",X"53", + X"52",X"67",X"53",X"52",X"45",X"71",X"41",X"64",X"50",X"40",X"67",X"57",X"54",X"40",X"52",X"67", + X"40",X"45",X"66",X"67",X"40",X"54",X"43",X"45",X"64",X"45",X"53",X"50",X"55",X"40",X"45",X"66", + X"67",X"40",X"52",X"45",X"71",X"41",X"64",X"50",X"50",X"55",X"40",X"67",X"57",X"54",X"40",X"52", + X"45",X"71",X"41",X"64",X"50",X"66",X"61",X"41",X"47",X"41",X"40",X"52",X"45",X"71",X"41",X"64", + X"50",X"40",X"45",X"65",X"41",X"53",X"52",X"45",X"56",X"67",X"40",X"45",X"65",X"41",X"47",X"52", + X"45",X"56",X"67",X"40",X"45",X"65",X"41",X"47",X"40",X"45",X"66",X"67",X"40",X"52",X"45",X"71", + X"41",X"64",X"50",X"45",X"65",X"41",X"46",X"40",X"46",X"67",X"40",X"64",X"64",X"41",X"60",X"45", + X"60",X"54",X"40",X"66",X"61",X"40",X"53",X"61",X"40",X"45",X"52",X"67",X"43",X"53",X"40",X"52", + X"55",X"67",X"71",X"66",X"45",X"54",X"40",X"50",X"67",X"54",X"54",X"43",X"45",X"64",X"45",X"53", + X"40",X"67",X"54",X"40",X"63",X"43",X"61",X"54",X"53",X"71",X"67",X"62",X"40",X"45",X"53",X"55", + X"66",X"67",X"54",X"54",X"55",X"42",X"40",X"44",X"45",X"45",X"50",X"53",X"40",X"44",X"66",X"41", + X"40",X"52",X"45",X"54",X"54",X"45",X"64",X"54",X"66",X"61",X"52",X"50",X"40",X"67",X"54",X"45", + X"66",X"44",X"65",X"41",X"64",X"53",X"45",X"43",X"66",X"41",X"56",X"44",X"41",X"40",X"45",X"52", + X"67",X"43",X"53",X"40",X"54",X"66",X"54",X"40",X"52",X"65",X"40",X"45",X"52",X"67",X"43",X"53", + X"40",X"40",X"53",X"66",X"67",X"61",X"54",X"43",X"45",X"53",X"52",X"45",X"54",X"66",X"61",X"52", + X"45",X"42",X"65",X"55",X"66",X"40",X"45",X"65",X"41",X"52",X"46",X"40",X"70",X"40",X"53",X"54", + X"66",X"61",X"67",X"50",X"40",X"18",X"19",X"53",X"66",X"67",X"61",X"54",X"43",X"45",X"53",X"52", + X"45",X"54",X"66",X"61",X"40",X"40",X"64",X"41",X"61",X"43",X"45",X"50",X"53",X"4C",X"4C",X"4C", + X"4C",X"40",X"40",X"40",X"45",X"52",X"67",X"43",X"53",X"40",X"71",X"41",X"64",X"50",X"40",X"19", + X"40",X"53",X"66",X"61",X"67",X"43",X"40",X"1A",X"53",X"71",X"41",X"64",X"50",X"40",X"1A",X"40", + X"40",X"66",X"61",X"67",X"43",X"40",X"19",X"40",X"71",X"41",X"64",X"50",X"40",X"19",X"40",X"40", + X"66",X"61",X"67",X"43",X"40",X"19",X"53",X"54",X"66",X"61",X"67",X"50",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"71",X"52",X"45",X"56",X"45",X"40",X"53",X"55",X"66",X"67",X"42",X"18", + X"18",X"18",X"18",X"1D",X"19",X"18",X"18",X"18",X"1D",X"1A",X"19",X"18",X"18",X"18",X"18",X"18", + X"19",X"40",X"18",X"18",X"18",X"1D",X"1F",X"53",X"43",X"61",X"54",X"53",X"67",X"66",X"47",X"41", + X"61",X"44",X"66",X"67",X"61",X"54",X"61",X"44",X"66",X"67",X"43",X"40",X"40",X"66",X"67",X"61", + X"54",X"41",X"43",X"67",X"64",X"40",X"40",X"65",X"67",X"52",X"44",X"67",X"67",X"47",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"44",X"1F",X"40",X"40",X"40",X"40",X"40",X"40",X"19",X"44",X"67", + X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"46",X"1F",X"40",X"40",X"40",X"40",X"40", + X"40",X"1A",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"60",X"1F",X"40", + X"40",X"40",X"40",X"40",X"40",X"1B",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"62",X"1F",X"40",X"40",X"40",X"40",X"40",X"40",X"1C",X"44",X"67",X"67",X"47",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"60",X"1C",X"40",X"40",X"40",X"40",X"40",X"40",X"19",X"44",X"67", + X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"64",X"1C",X"40",X"40",X"40",X"40",X"40", + X"40",X"1A",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"62",X"1C",X"40", + X"40",X"40",X"40",X"40",X"40",X"1B",X"44",X"67",X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"65",X"1C",X"40",X"40",X"40",X"40",X"40",X"40",X"1C",X"44",X"67",X"67",X"47",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"63",X"1C",X"40",X"40",X"40",X"40",X"40",X"40",X"1D",X"44",X"67", + X"67",X"47",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"66",X"1C",X"40",X"40",X"40",X"40",X"40", + X"40",X"1E",X"44",X"41",X"42",X"40",X"66",X"67",X"61",X"54",X"61",X"44",X"66",X"67",X"43",X"40", + X"40",X"66",X"67",X"61",X"54",X"41",X"43",X"67",X"64",X"40",X"40",X"65",X"41",X"52",X"00",X"01", + X"02",X"03",X"04",X"05",X"06",X"07",X"20",X"21",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"60", + X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"70", + X"71",X"72",X"72",X"71",X"70",X"57",X"56",X"55",X"54",X"53",X"52",X"51",X"50",X"67",X"66",X"65", + X"64",X"63",X"62",X"61",X"60",X"47",X"46",X"45",X"44",X"43",X"42",X"41",X"00",X"01",X"04",X"02", + X"94",X"42",X"95",X"42",X"96",X"42",X"97",X"42",X"B0",X"42",X"B1",X"42",X"B2",X"42",X"B3",X"42", + X"B4",X"42",X"B5",X"42",X"03",X"02",X"01",X"00",X"00",X"80",X"48",X"40",X"09",X"F5",X"65",X"E3", + X"46",X"08",X"11",X"E3",X"C6",X"3A",X"2C",X"66",X"2A",X"0F",X"66",X"06",X"10",X"76",X"0B",X"56", + X"12",X"0B",X"10",X"F9",X"00",X"3E",X"04",X"1A",X"15",X"66",X"3A",X"29",X"66",X"1A",X"16",X"66", + X"09",X"DA",X"0E",X"11",X"17",X"66",X"01",X"04",X"00",X"ED",X"98",X"FD",X"09",X"A1",X"64",X"FD", + X"7E",X"07",X"CE",X"C8",X"47",X"3A",X"F8",X"64",X"CE",X"37",X"98",X"FD",X"5F",X"07",X"2A",X"11", + X"66",X"0A",X"27",X"66",X"09",X"F8",X"65",X"E5",X"3F",X"37",X"09",X"00",X"00",X"0A",X"27",X"66", + X"3A",X"13",X"66",X"1A",X"15",X"66",X"3A",X"14",X"66",X"1A",X"16",X"66",X"09",X"DE",X"0E",X"11", + X"17",X"66",X"01",X"04",X"00",X"ED",X"98",X"3A",X"33",X"66",X"FE",X"9D",X"28",X"0D",X"FE",X"3C", + X"28",X"22",X"FE",X"78",X"28",X"25",X"FE",X"9C",X"28",X"10",X"30",X"13",X"09",X"58",X"64",X"E3", + X"DE",X"30",X"24",X"09",X"78",X"64",X"E3",X"DE",X"30",X"05",X"09",X"80",X"64",X"E3",X"DE",X"3C", + X"1A",X"33",X"66",X"00",X"F5",X"09",X"A1",X"64",X"FD",X"09",X"49",X"64",X"E5",X"22",X"0F",X"09", + X"FB",X"65",X"E5",X"3F",X"37",X"F5",X"09",X"A1",X"64",X"FD",X"09",X"69",X"64",X"E5",X"22",X"0F", + X"09",X"FE",X"65",X"E5",X"3F",X"37",X"F5",X"09",X"A1",X"64",X"FD",X"09",X"59",X"64",X"E5",X"22", + X"0F",X"09",X"01",X"66",X"E5",X"3F",X"37",X"F5",X"09",X"A1",X"64",X"FD",X"09",X"79",X"64",X"E5", + X"22",X"0F",X"09",X"04",X"66",X"E5",X"3F",X"37",X"F5",X"09",X"A1",X"64",X"FD",X"09",X"81",X"64", + X"E5",X"22",X"0F",X"09",X"07",X"66",X"E5",X"3F",X"37",X"3A",X"2B",X"66",X"3C",X"1A",X"2B",X"66", + X"FE",X"04",X"08",X"2C",X"AF",X"1A",X"2B",X"66",X"3A",X"2A",X"66",X"47",X"FE",X"02",X"28",X"35", + X"3C",X"1A",X"2A",X"66",X"3A",X"2C",X"66",X"80",X"67",X"2A",X"0F",X"66",X"06",X"10",X"76",X"0B", + X"56",X"0B",X"32",X"FE",X"4E",X"38",X"02",X"79",X"12",X"10",X"DB",X"30",X"03",X"AF",X"30",X"C9", + X"00",X"3A",X"84",X"64",X"FE",X"00",X"28",X"12",X"3A",X"0E",X"66",X"3C",X"1A",X"0E",X"66",X"FE", + X"1A",X"08",X"07",X"AF",X"1A",X"84",X"64",X"1A",X"0E",X"66",X"3A",X"0A",X"66",X"FE",X"04",X"08", + X"0A",X"AF",X"1A",X"0A",X"66",X"3A",X"18",X"40",X"47",X"3A",X"2F",X"40",X"67",X"3A",X"0B",X"66", + X"1A",X"18",X"40",X"3A",X"0C",X"66",X"1A",X"2F",X"40",X"78",X"1A",X"0B",X"66",X"79",X"1A",X"0C", + X"66",X"30",X"04",X"3C",X"1A",X"0A",X"66",X"3A",X"0D",X"66",X"FE",X"FF",X"E2",X"26",X"36",X"FE", + X"10",X"C2",X"29",X"36",X"3C",X"1A",X"0D",X"66",X"3A",X"4C",X"64",X"1A",X"2F",X"66",X"3A",X"6C", + X"64",X"1A",X"18",X"66",X"3A",X"5C",X"64",X"1A",X"19",X"66",X"3A",X"7C",X"64",X"1A",X"1A",X"66", + X"3A",X"84",X"64",X"1A",X"1B",X"66",X"3A",X"A4",X"64",X"1A",X"1C",X"66",X"AF",X"1A",X"4C",X"64", + X"1A",X"6C",X"64",X"1A",X"5C",X"64",X"1A",X"7C",X"64",X"1A",X"84",X"64",X"1A",X"A4",X"64",X"06", + X"34",X"09",X"66",X"40",X"11",X"1D",X"66",X"C5",X"01",X"05",X"00",X"ED",X"98",X"3E",X"33",X"E5", + X"98",X"15",X"C1",X"10",X"DA",X"3A",X"40",X"44",X"1A",X"C1",X"66",X"11",X"66",X"40",X"09",X"CB", + X"36",X"3E",X"05",X"06",X"34",X"E5",X"EB",X"15",X"11",X"66",X"44",X"09",X"3E",X"37",X"3E",X"05", + X"06",X"34",X"E5",X"EB",X"15",X"11",X"6F",X"40",X"09",X"CC",X"36",X"3E",X"01",X"06",X"32",X"E5", + X"D5",X"15",X"11",X"11",X"41",X"09",X"FE",X"36",X"3E",X"01",X"06",X"10",X"E5",X"D5",X"15",X"3E", + X"78",X"E5",X"B3",X"15",X"11",X"66",X"44",X"09",X"C1",X"66",X"3E",X"05",X"06",X"34",X"E5",X"EB", + X"15",X"06",X"34",X"09",X"1D",X"66",X"11",X"66",X"40",X"C5",X"01",X"05",X"00",X"ED",X"98",X"3E", + X"33",X"E5",X"9D",X"15",X"C1",X"10",X"DA",X"3A",X"2F",X"66",X"1A",X"4C",X"64",X"3A",X"18",X"66", + X"1A",X"6C",X"64",X"3A",X"19",X"66",X"1A",X"5C",X"64",X"3A",X"1A",X"66",X"1A",X"7C",X"64",X"3A", + X"1B",X"66",X"1A",X"84",X"64",X"3A",X"1C",X"66",X"1A",X"A4",X"64",X"C3",X"29",X"36",X"AF",X"1A", + X"4A",X"64",X"1A",X"6A",X"64",X"1A",X"5A",X"64",X"1A",X"7A",X"64",X"1A",X"82",X"64",X"1A",X"A2", + X"64",X"09",X"59",X"65",X"E3",X"E6",X"C3",X"E0",X"36",X"3A",X"90",X"64",X"E3",X"6F",X"C2",X"CA", + X"36",X"E3",X"5F",X"08",X"10",X"09",X"96",X"64",X"E3",X"E6",X"3E",X"40",X"1A",X"2F",X"40",X"1A", + X"18",X"40",X"C3",X"CA",X"36",X"3A",X"68",X"64",X"47",X"3A",X"58",X"64",X"98",X"47",X"3A",X"78", + X"64",X"98",X"47",X"3A",X"80",X"64",X"98",X"47",X"3A",X"A0",X"64",X"98",X"E3",X"5F",X"C2",X"CA", + X"36",X"47",X"AF",X"1A",X"A2",X"64",X"09",X"59",X"65",X"E3",X"E6",X"09",X"A4",X"65",X"E3",X"E6", + X"E3",X"68",X"08",X"6E",X"AF",X"1A",X"A4",X"64",X"3A",X"40",X"44",X"1A",X"C1",X"66",X"11",X"66", + X"40",X"09",X"CB",X"36",X"3E",X"05",X"06",X"34",X"E5",X"EB",X"15",X"11",X"66",X"44",X"09",X"3E", + X"37",X"3E",X"05",X"06",X"34",X"E5",X"EB",X"15",X"11",X"2F",X"41",X"09",X"26",X"37",X"3E",X"01", + X"06",X"27",X"E5",X"D5",X"15",X"11",X"D1",X"40",X"09",X"35",X"37",X"3E",X"01",X"06",X"14",X"E5", + X"D5",X"15",X"3E",X"78",X"E5",X"B3",X"15",X"11",X"66",X"44",X"09",X"C1",X"66",X"3E",X"05",X"06", + X"34",X"E5",X"EB",X"15",X"AF",X"1A",X"84",X"64",X"3A",X"84",X"64",X"FE",X"00",X"08",X"13",X"09", + X"96",X"64",X"E3",X"F6",X"E3",X"E6",X"AF",X"1A",X"33",X"66",X"3E",X"40",X"1A",X"2F",X"40",X"1A", + X"18",X"40",X"E1",X"40",X"45",X"53",X"55",X"46",X"40",X"71",X"42",X"40",X"44",X"45",X"66",X"52", + X"55",X"42",X"40",X"54",X"45",X"47",X"52",X"41",X"54",X"40",X"54",X"53",X"41",X"64",X"66",X"55", + X"52",X"40",X"54",X"53",X"55",X"65",X"40",X"55",X"67",X"71",X"40",X"57",X"67",X"66",X"53",X"66", + X"67",X"61",X"54",X"41",X"64",X"55",X"54",X"41",X"52",X"47",X"66",X"67",X"43",X"54",X"55",X"67", + X"40",X"44",X"45",X"66",X"52",X"55",X"42",X"40",X"53",X"45",X"53",X"55",X"46",X"40",X"64",X"64", + X"41",X"71",X"52",X"52",X"67",X"53",X"44",X"66",X"45",X"40",X"44",X"41",X"45",X"44",X"21",X"F5", + X"2A",X"DE",X"65",X"FD",X"E3",X"07",X"6E",X"C2",X"5B",X"0B",X"FD",X"E3",X"07",X"5E",X"E0",X"7E", + X"E3",X"BF",X"E3",X"9F",X"FE",X"03",X"E2",X"0F",X"0B",X"3C",X"47",X"7E",X"CE",X"C0",X"98",X"5F", + X"3E",X"DB",X"FD",X"46",X"03",X"90",X"1A",X"75",X"64",X"FD",X"7E",X"04",X"D6",X"24",X"1A",X"74", + X"64",X"CD",X"E5",X"BD",X"26",X"C9",X"3A",X"22",X"64",X"FE",X"00",X"C2",X"20",X"0B",X"3A",X"23", + X"64",X"FE",X"00",X"C2",X"20",X"0B",X"E3",X"5E",X"C2",X"00",X"0B",X"E3",X"DE",X"32",X"1A",X"22", + X"66",X"D5",X"33",X"32",X"1A",X"23",X"66",X"13",X"13",X"32",X"1A",X"24",X"66",X"3E",X"09",X"E5", + X"E1",X"15",X"32",X"1A",X"25",X"66",X"3E",X"40",X"E5",X"9D",X"15",X"32",X"1A",X"26",X"66",X"D1", + X"E3",X"7E",X"C2",X"B7",X"08",X"3A",X"C2",X"66",X"FE",X"00",X"E2",X"B7",X"08",X"FE",X"01",X"28", + X"02",X"30",X"56",X"3A",X"90",X"64",X"E3",X"47",X"28",X"07",X"E3",X"77",X"28",X"0F",X"E3",X"9E", + X"E1",X"FD",X"46",X"00",X"FD",X"1E",X"00",X"02",X"3A",X"30",X"66",X"FD",X"5F",X"05",X"AF",X"1A", + X"C2",X"66",X"78",X"FE",X"04",X"28",X"07",X"F5",X"7E",X"02",X"12",X"C3",X"6B",X"0A",X"F5",X"7E", + X"03",X"12",X"C3",X"6B",X"0A",X"FD",X"46",X"00",X"FD",X"1E",X"00",X"03",X"3A",X"17",X"66",X"FD", + X"5F",X"05",X"AF",X"1A",X"C2",X"66",X"78",X"FE",X"04",X"28",X"07",X"F5",X"7E",X"04",X"12",X"C3", + X"6B",X"0A",X"F5",X"7E",X"05",X"12",X"C3",X"6B",X"0A",X"3A",X"90",X"64",X"E3",X"67",X"28",X"07", + X"E3",X"57",X"28",X"0F",X"E3",X"9E",X"E1",X"FD",X"46",X"00",X"FD",X"1E",X"00",X"05",X"3A",X"31", + X"66",X"FD",X"5F",X"05",X"AF",X"1A",X"C2",X"66",X"78",X"FE",X"02",X"28",X"07",X"F5",X"7E",X"03", + X"12",X"C3",X"41",X"09",X"F5",X"7E",X"05",X"12",X"C3",X"41",X"09",X"FD",X"46",X"00",X"FD",X"1E", + X"00",X"04",X"3A",X"32",X"66",X"FD",X"5F",X"05",X"AF",X"1A",X"C2",X"66",X"78",X"FE",X"02",X"28", + X"07",X"F5",X"7E",X"02",X"12",X"C3",X"41",X"09",X"F5",X"7E",X"04",X"12",X"C3",X"41",X"09",X"FD", + X"E3",X"07",X"46",X"C0",X"AF",X"1A",X"C2",X"66",X"C3",X"6B",X"0A",X"FD",X"E3",X"07",X"76",X"C0", + X"AF",X"1A",X"C2",X"66",X"C3",X"6B",X"0A",X"FD",X"E3",X"07",X"56",X"C0",X"AF",X"1A",X"C2",X"66", + X"C3",X"41",X"09",X"FD",X"E3",X"07",X"66",X"C0",X"AF",X"1A",X"C2",X"66",X"C3",X"41",X"09",X"FD", + X"7E",X"00",X"FE",X"02",X"E2",X"D6",X"09",X"FE",X"03",X"E2",X"D6",X"09",X"FD",X"E3",X"07",X"46", + X"08",X"2F",X"3A",X"22",X"66",X"F5",X"BE",X"01",X"E2",X"C3",X"08",X"FE",X"4E",X"F2",X"52",X"09", + X"E5",X"E1",X"0F",X"E5",X"33",X"28",X"FD",X"7E",X"00",X"FE",X"05",X"28",X"22",X"F5",X"7E",X"03", + X"1A",X"22",X"66",X"12",X"C3",X"99",X"09",X"F5",X"7E",X"02",X"1A",X"22",X"66",X"12",X"C3",X"99", + X"09",X"FD",X"E3",X"07",X"76",X"E2",X"06",X"09",X"3A",X"22",X"66",X"F5",X"BE",X"01",X"E2",X"F9", + X"08",X"FE",X"4E",X"F2",X"52",X"09",X"E5",X"E1",X"0F",X"E5",X"33",X"28",X"F5",X"7E",X"07",X"1A", + X"22",X"66",X"12",X"C3",X"83",X"09",X"3A",X"22",X"66",X"F5",X"BE",X"01",X"28",X"20",X"FE",X"4E", + X"F2",X"52",X"09",X"E5",X"E1",X"0F",X"E5",X"33",X"28",X"FD",X"7E",X"00",X"FE",X"05",X"28",X"29", + X"F5",X"7E",X"05",X"1A",X"22",X"66",X"12",X"3A",X"17",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00", + X"03",X"3A",X"24",X"66",X"F5",X"BE",X"00",X"E2",X"EC",X"0C",X"C3",X"39",X"0D",X"FD",X"E3",X"07", + X"FE",X"FD",X"0A",X"91",X"64",X"E5",X"F1",X"24",X"E1",X"F5",X"7E",X"04",X"1A",X"22",X"66",X"12", + X"30",X"D5",X"FD",X"7E",X"00",X"FE",X"05",X"28",X"11",X"3A",X"22",X"66",X"F5",X"BE",X"02",X"08", + X"13",X"F5",X"7E",X"20",X"1A",X"22",X"66",X"12",X"30",X"BD",X"3A",X"22",X"66",X"F5",X"BE",X"03", + X"08",X"02",X"30",X"ED",X"3A",X"22",X"66",X"F5",X"BE",X"06",X"08",X"37",X"F5",X"7E",X"20",X"1A", + X"22",X"66",X"12",X"FD",X"7E",X"00",X"FE",X"05",X"28",X"24",X"3A",X"25",X"66",X"F5",X"BE",X"00", + X"E2",X"D6",X"0C",X"C3",X"41",X"09",X"3A",X"26",X"66",X"30",X"DA",X"FD",X"7E",X"00",X"FE",X"05", + X"28",X"0D",X"3A",X"22",X"66",X"F5",X"BE",X"04",X"08",X"0F",X"F5",X"7E",X"20",X"1A",X"22",X"66", + X"12",X"3A",X"30",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00",X"02",X"3A",X"23",X"66",X"F5",X"BE", + X"00",X"E2",X"8E",X"0C",X"C3",X"34",X"0D",X"3A",X"22",X"66",X"F5",X"BE",X"05",X"08",X"02",X"30", + X"F1",X"FD",X"E3",X"07",X"EE",X"E1",X"FD",X"E3",X"07",X"56",X"08",X"2F",X"3A",X"22",X"66",X"F5", + X"BE",X"01",X"E2",X"ED",X"09",X"FE",X"4E",X"F2",X"7C",X"0A",X"E5",X"E1",X"0F",X"E5",X"33",X"28", + X"FD",X"7E",X"00",X"FE",X"03",X"28",X"22",X"F5",X"7E",X"04",X"1A",X"22",X"66",X"12",X"C3",X"F3", + X"0A",X"F5",X"7E",X"02",X"1A",X"22",X"66",X"12",X"C3",X"F3",X"0A",X"FD",X"E3",X"07",X"66",X"E2", + X"18",X"0A",X"3A",X"22",X"66",X"F5",X"BE",X"01",X"E2",X"0B",X"0A",X"FE",X"4E",X"F2",X"7C",X"0A", + X"E5",X"E1",X"0F",X"E5",X"33",X"28",X"F5",X"7E",X"06",X"1A",X"22",X"66",X"12",X"C3",X"AD",X"0A", + X"3A",X"22",X"66",X"F5",X"BE",X"01",X"28",X"20",X"FE",X"4E",X"F2",X"7C",X"0A",X"E5",X"E1",X"0F", + X"E5",X"33",X"28",X"FD",X"7E",X"00",X"FE",X"03",X"28",X"29",X"F5",X"7E",X"05",X"1A",X"22",X"66", + X"12",X"3A",X"31",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00",X"05",X"3A",X"26",X"66",X"F5",X"BE", + X"00",X"E2",X"B4",X"0D",X"C3",X"E9",X"0D",X"FD",X"E3",X"07",X"FE",X"FD",X"0A",X"91",X"64",X"E5", + X"F1",X"24",X"E1",X"F5",X"7E",X"03",X"1A",X"22",X"66",X"12",X"30",X"D5",X"FD",X"7E",X"00",X"FE", + X"03",X"28",X"11",X"3A",X"22",X"66",X"F5",X"BE",X"02",X"08",X"13",X"F5",X"7E",X"20",X"1A",X"22", + X"66",X"12",X"30",X"BD",X"3A",X"22",X"66",X"F5",X"BE",X"04",X"08",X"02",X"30",X"ED",X"3A",X"22", + X"66",X"F5",X"BE",X"07",X"08",X"37",X"F5",X"7E",X"20",X"1A",X"22",X"66",X"12",X"FD",X"7E",X"00", + X"FE",X"03",X"28",X"24",X"3A",X"23",X"66",X"F5",X"BE",X"00",X"E2",X"86",X"0D",X"C3",X"6B",X"0A", + X"3A",X"24",X"66",X"30",X"DA",X"FD",X"7E",X"00",X"FE",X"03",X"28",X"0D",X"3A",X"22",X"66",X"F5", + X"BE",X"03",X"08",X"0F",X"F5",X"7E",X"20",X"1A",X"22",X"66",X"12",X"3A",X"32",X"66",X"FD",X"5F", + X"05",X"FD",X"1E",X"00",X"04",X"3A",X"25",X"66",X"F5",X"BE",X"00",X"E2",X"56",X"0D",X"C3",X"E4", + X"0D",X"3A",X"22",X"66",X"F5",X"BE",X"05",X"08",X"02",X"30",X"F1",X"FD",X"E3",X"07",X"EE",X"E1", + X"FD",X"0A",X"91",X"64",X"E5",X"F1",X"24",X"E1",X"E3",X"9E",X"E3",X"7E",X"08",X"DA",X"3A",X"C2", + X"66",X"FE",X"00",X"28",X"EB",X"FE",X"03",X"E2",X"6F",X"08",X"FE",X"04",X"E2",X"7B",X"08",X"FE", + X"05",X"E2",X"87",X"08",X"C3",X"93",X"08",X"3E",X"C0",X"8E",X"5F",X"E3",X"7F",X"08",X"36",X"FD", + X"7E",X"01",X"FE",X"00",X"E0",X"FD",X"E3",X"07",X"4E",X"C2",X"56",X"0B",X"3A",X"15",X"66",X"FD", + X"46",X"01",X"B8",X"E2",X"48",X"37",X"05",X"FD",X"58",X"01",X"C3",X"48",X"37",X"E5",X"B8",X"0F", + X"FD",X"E3",X"07",X"7E",X"08",X"11",X"3A",X"16",X"66",X"FD",X"46",X"01",X"B8",X"E2",X"48",X"37", + X"04",X"FD",X"58",X"01",X"C3",X"48",X"37",X"FD",X"E3",X"07",X"BE",X"3A",X"15",X"66",X"FD",X"5F", + X"01",X"30",X"CB",X"0B",X"7E",X"FE",X"02",X"08",X"31",X"1E",X"00",X"0B",X"7E",X"FE",X"00",X"28", + X"13",X"FE",X"27",X"E2",X"CF",X"0E",X"1C",X"09",X"FA",X"0E",X"E5",X"98",X"15",X"7E",X"FD",X"5F", + X"05",X"E1",X"1C",X"E1",X"1C",X"2B",X"2B",X"FD",X"E3",X"07",X"9E",X"E3",X"7E",X"28",X"26",X"3A", + X"08",X"65",X"FE",X"00",X"08",X"C9",X"09",X"3B",X"65",X"E3",X"C6",X"30",X"F2",X"09",X"56",X"65", + X"E3",X"C6",X"09",X"68",X"64",X"E3",X"9E",X"09",X"58",X"64",X"E3",X"9E",X"09",X"78",X"64",X"E3", + X"9E",X"09",X"80",X"64",X"E3",X"9E",X"09",X"A0",X"64",X"E3",X"9E",X"09",X"90",X"64",X"E3",X"AE", + X"E3",X"9E",X"3E",X"9D",X"1A",X"33",X"66",X"E5",X"22",X"16",X"3E",X"17",X"E5",X"FD",X"14",X"3E", + X"14",X"E5",X"25",X"15",X"3E",X"02",X"E5",X"B3",X"15",X"3E",X"14",X"E5",X"FD",X"14",X"3E",X"03", + X"E5",X"B3",X"15",X"3E",X"17",X"E5",X"FD",X"14",X"3E",X"02",X"E5",X"B3",X"15",X"3E",X"14",X"E5", + X"FD",X"14",X"3E",X"03",X"E5",X"B3",X"15",X"3E",X"17",X"E5",X"FD",X"14",X"3E",X"02",X"E5",X"B3", + X"15",X"3E",X"14",X"E5",X"FD",X"14",X"09",X"96",X"64",X"E3",X"46",X"E0",X"3E",X"90",X"E5",X"B3", + X"15",X"C3",X"78",X"0C",X"09",X"87",X"0E",X"E5",X"19",X"2C",X"3E",X"01",X"E5",X"B3",X"15",X"E5", + X"81",X"0C",X"3A",X"4C",X"64",X"FE",X"00",X"08",X"D9",X"3A",X"98",X"64",X"FE",X"00",X"08",X"10", + X"3A",X"8E",X"64",X"FE",X"00",X"08",X"21",X"3A",X"8F",X"64",X"FE",X"00",X"08",X"02",X"30",X"28", + X"09",X"A4",X"65",X"E3",X"C6",X"3E",X"18",X"E5",X"B3",X"15",X"09",X"9F",X"0E",X"E5",X"19",X"2C", + X"3E",X"01",X"E5",X"B3",X"15",X"E5",X"81",X"0C",X"09",X"81",X"64",X"0A",X"91",X"64",X"E5",X"F1", + X"24",X"3A",X"4C",X"64",X"FE",X"EC",X"08",X"E8",X"E5",X"22",X"16",X"09",X"90",X"64",X"E3",X"AE", + X"E1",X"09",X"49",X"64",X"0A",X"91",X"64",X"E5",X"F1",X"24",X"09",X"69",X"64",X"0A",X"91",X"64", + X"E5",X"F1",X"24",X"09",X"59",X"64",X"0A",X"91",X"64",X"E5",X"F1",X"24",X"09",X"79",X"64",X"0A", + X"91",X"64",X"E5",X"F1",X"24",X"E1",X"E3",X"7E",X"C2",X"D1",X"09",X"3A",X"22",X"66",X"F5",X"BE", + X"20",X"E2",X"39",X"0E",X"F5",X"BE",X"03",X"08",X"11",X"3A",X"32",X"66",X"FD",X"5F",X"05",X"FD", + X"1E",X"00",X"04",X"F5",X"7E",X"07",X"12",X"C3",X"41",X"09",X"3A",X"31",X"66",X"FD",X"5F",X"05", + X"FD",X"1E",X"00",X"05",X"30",X"ED",X"E3",X"7E",X"C2",X"D1",X"09",X"3A",X"22",X"66",X"F5",X"BE", + X"20",X"E2",X"39",X"0E",X"3E",X"01",X"1A",X"C2",X"66",X"E3",X"9E",X"E1",X"E3",X"7E",X"C2",X"D1", + X"09",X"3A",X"22",X"66",X"F5",X"BE",X"20",X"E2",X"39",X"0E",X"F5",X"BE",X"05",X"08",X"11",X"3A", + X"32",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00",X"04",X"F5",X"7E",X"07",X"12",X"C3",X"41",X"09", + X"3A",X"31",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00",X"05",X"30",X"ED",X"E3",X"7E",X"C2",X"3D", + X"09",X"3A",X"22",X"66",X"F5",X"BE",X"20",X"C2",X"41",X"09",X"FD",X"E3",X"07",X"46",X"E2",X"41", + X"09",X"3E",X"03",X"1A",X"C2",X"66",X"C3",X"41",X"09",X"E3",X"7E",X"C2",X"3D",X"09",X"3A",X"22", + X"66",X"F5",X"BE",X"20",X"C2",X"41",X"09",X"FD",X"E3",X"07",X"76",X"E2",X"41",X"09",X"3E",X"04", + X"1A",X"C2",X"66",X"C3",X"41",X"09",X"E3",X"7E",X"C2",X"FB",X"0A",X"3A",X"22",X"66",X"F5",X"BE", + X"20",X"E2",X"39",X"0E",X"F5",X"BE",X"04",X"08",X"11",X"3A",X"30",X"66",X"FD",X"5F",X"05",X"FD", + X"1E",X"00",X"02",X"F5",X"7E",X"06",X"12",X"C3",X"6B",X"0A",X"3A",X"17",X"66",X"FD",X"5F",X"05", + X"FD",X"1E",X"00",X"03",X"30",X"ED",X"E3",X"7E",X"C2",X"FB",X"0A",X"3A",X"22",X"66",X"F5",X"BE", + X"20",X"E2",X"39",X"0E",X"3E",X"02",X"1A",X"C2",X"66",X"E3",X"9E",X"E1",X"E3",X"7E",X"C2",X"FB", + X"0A",X"3A",X"22",X"66",X"F5",X"BE",X"20",X"E2",X"39",X"0E",X"F5",X"BE",X"05",X"08",X"11",X"3A", + X"30",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00",X"02",X"F5",X"7E",X"06",X"12",X"C3",X"6B",X"0A", + X"3A",X"17",X"66",X"FD",X"5F",X"05",X"FD",X"1E",X"00",X"03",X"30",X"ED",X"E3",X"7E",X"C2",X"4F", + X"0A",X"3A",X"22",X"66",X"F5",X"BE",X"20",X"C2",X"6B",X"0A",X"FD",X"E3",X"07",X"56",X"E2",X"6B", + X"0A",X"3E",X"05",X"1A",X"C2",X"66",X"C3",X"6B",X"0A",X"E3",X"7E",X"C2",X"4F",X"0A",X"3A",X"22", + X"66",X"F5",X"BE",X"20",X"C2",X"6B",X"0A",X"FD",X"E3",X"07",X"66",X"E2",X"6B",X"0A",X"3E",X"06", + X"1A",X"C2",X"66",X"C3",X"6B",X"0A",X"FD",X"7E",X"07",X"47",X"FD",X"7E",X"00",X"FE",X"02",X"28", + X"10",X"FE",X"03",X"28",X"14",X"FE",X"05",X"28",X"30",X"E3",X"60",X"E2",X"3C",X"0B",X"C3",X"56", + X"0B",X"E3",X"70",X"E2",X"3C",X"0B",X"C3",X"56",X"0B",X"E3",X"40",X"E2",X"3C",X"0B",X"C3",X"56", + X"0B",X"E3",X"50",X"E2",X"3C",X"0B",X"C3",X"56",X"0B",X"11",X"2E",X"41",X"09",X"CB",X"36",X"3E", + X"05",X"06",X"26",X"E5",X"EB",X"15",X"11",X"2E",X"45",X"09",X"3E",X"37",X"3E",X"05",X"06",X"26", + X"E5",X"EB",X"15",X"AF",X"1A",X"4C",X"64",X"1A",X"6C",X"64",X"1A",X"5C",X"64",X"1A",X"7C",X"64", + X"1A",X"84",X"64",X"11",X"E7",X"41",X"09",X"19",X"37",X"3E",X"01",X"06",X"05",X"E5",X"D5",X"15", + X"11",X"91",X"41",X"09",X"1E",X"37",X"3E",X"01",X"06",X"20",X"E5",X"D5",X"15",X"3E",X"78",X"E5", + X"B3",X"15",X"FD",X"E3",X"07",X"EE",X"E1",X"05",X"08",X"00",X"C8",X"58",X"42",X"21",X"00",X"05", + X"08",X"00",X"D8",X"58",X"3E",X"21",X"00",X"05",X"08",X"00",X"F7",X"48",X"3A",X"21",X"00",X"05", + X"08",X"00",X"EF",X"48",X"1E",X"21",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"08",X"00",X"02",X"58",X"2E",X"21",X"00",X"04", + X"08",X"00",X"12",X"58",X"2A",X"21",X"00",X"04",X"08",X"00",X"01",X"48",X"0E",X"21",X"00",X"04", + X"08",X"00",X"11",X"48",X"0A",X"21",X"00",X"04",X"08",X"00",X"FA",X"80",X"1A",X"21",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1E",X"00",X"FD",X"E3",X"07",X"AE",X"FD",X"1E",X"03", + X"00",X"E1",X"14",X"10",X"24",X"26",X"30",X"30",X"30",X"30",X"30",X"34",X"30",X"34",X"30",X"34", + X"30",X"34",X"30",X"34",X"30",X"34",X"30",X"34",X"30",X"34",X"FD",X"E3",X"07",X"5E",X"E0",X"FD", + X"7E",X"00",X"FE",X"04",X"F2",X"7B",X"0F",X"F5",X"7E",X"03",X"FD",X"BE",X"03",X"F2",X"68",X"0F", + X"E2",X"7B",X"0F",X"FD",X"7E",X"00",X"FE",X"05",X"E2",X"B2",X"0F",X"FD",X"7E",X"07",X"DE",X"37", + X"CE",X"FB",X"FD",X"5F",X"07",X"F5",X"7E",X"03",X"FD",X"46",X"03",X"90",X"FE",X"05",X"38",X"05", + X"FE",X"FB",X"18",X"01",X"E1",X"F5",X"7E",X"04",X"FD",X"46",X"04",X"90",X"FE",X"05",X"38",X"05", + X"FE",X"FB",X"18",X"01",X"E1",X"F5",X"E3",X"07",X"EE",X"FD",X"E3",X"07",X"EE",X"E1",X"FD",X"7E", + X"03",X"F5",X"BE",X"03",X"38",X"C5",X"30",X"07",X"FD",X"7E",X"00",X"FE",X"04",X"28",X"2B",X"FD", + X"7E",X"07",X"DE",X"37",X"CE",X"FD",X"FD",X"5F",X"07",X"30",X"BA",X"F5",X"7E",X"04",X"FD",X"BE", + X"04",X"38",X"09",X"E2",X"17",X"0F",X"FD",X"7E",X"00",X"FE",X"02",X"28",X"D1",X"FD",X"7E",X"07", + X"DE",X"37",X"CE",X"DF",X"FD",X"5F",X"07",X"C3",X"1D",X"0F",X"FD",X"7E",X"04",X"F5",X"BE",X"04", + X"38",X"EB",X"30",X"07",X"FD",X"7E",X"00",X"FE",X"03",X"28",X"9B",X"FD",X"7E",X"07",X"DE",X"37", + X"CE",X"FE",X"FD",X"5F",X"07",X"C3",X"1D",X"0F",X"FD",X"7E",X"05",X"FE",X"30",X"28",X"05",X"FD", + X"1E",X"05",X"30",X"E1",X"FD",X"1E",X"05",X"34",X"E1",X"3A",X"0D",X"66",X"3C",X"1A",X"0D",X"66", + X"E3",X"7E",X"C0",X"2A",X"93",X"64",X"7E",X"09",X"27",X"28",X"E5",X"98",X"15",X"7E",X"1A",X"86", + X"64",X"3A",X"A4",X"64",X"1A",X"84",X"64",X"3A",X"A5",X"64",X"1A",X"85",X"64",X"D5",X"0B",X"76", + X"0B",X"56",X"2A",X"AE",X"64",X"31",X"0A",X"AE",X"64",X"D1",X"09",X"8F",X"65",X"E3",X"C6",X"AF", + X"1A",X"0E",X"66",X"3A",X"0D",X"66",X"FE",X"10",X"C0",X"3E",X"FF",X"1A",X"0D",X"66",X"E1",X"44", + X"00",X"10",X"60",X"00",X"08",X"64",X"00",X"40",X"50",X"00",X"80",X"D5",X"CD",X"2A",X"27",X"66", + X"ED",X"73",X"AE",X"64",X"31",X"0A",X"AE",X"64",X"C9",X"D1",X"E1",X"F5",X"09",X"FC",X"2D",X"F5", + X"0A",X"DE",X"65",X"09",X"6A",X"2F",X"3E",X"32",X"E5",X"C6",X"2B",X"E5",X"9F",X"18",X"3E",X"84", + X"09",X"06",X"2B",X"E5",X"D5",X"2C",X"09",X"10",X"00",X"0A",X"11",X"66",X"3E",X"02",X"1A",X"13", + X"66",X"3E",X"05",X"1A",X"14",X"66",X"3E",X"26",X"1A",X"29",X"66",X"09",X"F4",X"2C",X"E5",X"19", + X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE",X"65",X"09",X"48",X"2E", + X"3E",X"31",X"E5",X"C6",X"2B",X"E5",X"10",X"19",X"3E",X"87",X"09",X"0E",X"2B",X"E5",X"D5",X"2C", + X"09",X"08",X"00",X"0A",X"11",X"66",X"3E",X"04",X"1A",X"13",X"66",X"3E",X"07",X"1A",X"14",X"66", + X"3E",X"26",X"1A",X"29",X"66",X"09",X"24",X"2D",X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5", + X"09",X"05",X"2E",X"F5",X"0A",X"DE",X"65",X"09",X"DF",X"2E",X"3E",X"11",X"E5",X"C6",X"2B",X"E5", + X"39",X"19",X"3E",X"6C",X"09",X"46",X"2B",X"E5",X"D5",X"2C",X"09",X"18",X"00",X"0A",X"11",X"66", + X"3E",X"06",X"1A",X"13",X"66",X"3E",X"21",X"1A",X"14",X"66",X"3E",X"26",X"1A",X"29",X"66",X"09", + X"3C",X"2D",X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE", + X"65",X"09",X"95",X"18",X"3E",X"26",X"E5",X"C6",X"2B",X"E5",X"86",X"19",X"3E",X"78",X"09",X"4E", + X"2B",X"E5",X"D5",X"2C",X"09",X"40",X"00",X"0A",X"11",X"66",X"3E",X"20",X"1A",X"13",X"66",X"3E", + X"24",X"1A",X"14",X"66",X"3E",X"27",X"1A",X"29",X"66",X"09",X"6C",X"2D",X"E5",X"19",X"2C",X"E5", + X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE",X"65",X"09",X"1F",X"18",X"3E",X"37", + X"E5",X"C6",X"2B",X"E5",X"95",X"19",X"3E",X"5A",X"09",X"86",X"2B",X"E5",X"D5",X"2C",X"09",X"50", + X"00",X"0A",X"11",X"66",X"3E",X"20",X"1A",X"13",X"66",X"3E",X"24",X"1A",X"14",X"66",X"3E",X"27", + X"1A",X"29",X"66",X"09",X"B4",X"2D",X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"FC", + X"2D",X"F5",X"0A",X"DE",X"65",X"09",X"26",X"2E",X"3E",X"32",X"E5",X"C6",X"2B",X"E5",X"9E",X"19", + X"3E",X"6F",X"09",X"8E",X"2B",X"E5",X"D5",X"2C",X"09",X"48",X"00",X"0A",X"11",X"66",X"3E",X"20", + X"1A",X"13",X"66",X"3E",X"24",X"1A",X"14",X"66",X"3E",X"27",X"1A",X"29",X"66",X"09",X"E4",X"2D", + X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE",X"65",X"09", + X"6A",X"2F",X"3E",X"31",X"E5",X"C6",X"2B",X"E5",X"9F",X"18",X"3E",X"81",X"09",X"06",X"2B",X"E5", + X"D5",X"2C",X"09",X"58",X"00",X"0A",X"11",X"66",X"3E",X"20",X"1A",X"13",X"66",X"3E",X"24",X"1A", + X"14",X"66",X"3E",X"27",X"1A",X"29",X"66",X"09",X"F4",X"2C",X"E5",X"19",X"2C",X"E5",X"3A",X"2C", + X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE",X"65",X"09",X"48",X"2E",X"3E",X"11",X"E5",X"C6", + X"2B",X"E5",X"10",X"19",X"3E",X"5D",X"09",X"0E",X"2B",X"E5",X"D5",X"2C",X"09",X"80",X"00",X"0A", + X"11",X"66",X"3E",X"21",X"1A",X"13",X"66",X"3E",X"25",X"1A",X"14",X"66",X"3E",X"27",X"1A",X"29", + X"66",X"09",X"24",X"2D",X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5", + X"0A",X"DE",X"65",X"09",X"DF",X"2E",X"3E",X"26",X"E5",X"C6",X"2B",X"E5",X"39",X"19",X"3E",X"69", + X"09",X"46",X"2B",X"E5",X"D5",X"2C",X"09",X"90",X"00",X"0A",X"11",X"66",X"3E",X"21",X"1A",X"13", + X"66",X"3E",X"25",X"1A",X"14",X"66",X"3E",X"27",X"1A",X"29",X"66",X"09",X"3C",X"2D",X"E5",X"19", + X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE",X"65",X"09",X"95",X"18", + X"3E",X"37",X"E5",X"C6",X"2B",X"E5",X"86",X"19",X"3E",X"7B",X"09",X"4E",X"2B",X"E5",X"D5",X"2C", + X"09",X"00",X"01",X"0A",X"11",X"66",X"3E",X"22",X"1A",X"13",X"66",X"3E",X"26",X"1A",X"14",X"66", + X"3E",X"27",X"1A",X"29",X"66",X"09",X"6C",X"2D",X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5", + X"09",X"FC",X"2D",X"F5",X"0A",X"DE",X"65",X"09",X"1F",X"18",X"3E",X"32",X"E5",X"C6",X"2B",X"E5", + X"95",X"19",X"3E",X"7E",X"09",X"86",X"2B",X"E5",X"D5",X"2C",X"09",X"10",X"01",X"0A",X"11",X"66", + X"3E",X"24",X"1A",X"13",X"66",X"3E",X"27",X"1A",X"14",X"66",X"3E",X"26",X"1A",X"29",X"66",X"09", + X"B4",X"2D",X"E5",X"19",X"2C",X"E5",X"3A",X"2C",X"E1",X"F5",X"09",X"05",X"2E",X"F5",X"0A",X"DE", + X"65",X"09",X"26",X"2E",X"3E",X"31",X"E5",X"C6",X"2B",X"E5",X"9E",X"19",X"3E",X"4E",X"09",X"8E", + X"2B",X"E5",X"D5",X"2C",X"09",X"08",X"01",X"0A",X"11",X"66",X"3E",X"25",X"1A",X"13",X"66",X"3E", + X"10",X"1A",X"14",X"66",X"3E",X"26",X"1A",X"29",X"66",X"09",X"E4",X"2D",X"E5",X"19",X"2C",X"E5", + X"3A",X"2C",X"E1",X"E1",X"E1",X"E1",X"E1",X"27",X"65",X"52",X"08",X"54",X"66",X"54",X"2C",X"43", + X"67",X"50",X"71",X"52",X"61",X"47",X"60",X"54",X"08",X"19",X"39",X"38",X"1B",X"54",X"45",X"64", + X"63",X"67",X"08",X"61",X"66",X"43",X"8B",X"40",X"BC",X"40",X"A4",X"41",X"93",X"41",X"6C",X"42", + X"5B",X"42",X"43",X"43",X"74",X"43",X"A3",X"40",X"94",X"40",X"8C",X"41",X"BB",X"41",X"44",X"42", + X"73",X"42",X"6B",X"43",X"5C",X"43",X"AC",X"40",X"9B",X"40",X"29",X"41",X"1E",X"41",X"E1",X"42", + X"D6",X"42",X"64",X"43",X"53",X"43",X"0B",X"41",X"3C",X"41",X"A5",X"41",X"92",X"41",X"6D",X"42", + X"5A",X"42",X"C3",X"42",X"F4",X"42",X"E5",X"40",X"D2",X"40",X"46",X"41",X"71",X"41",X"8E",X"42", + X"B9",X"42",X"2D",X"43",X"1A",X"43",X"8B",X"40",X"BC",X"40",X"A2",X"41",X"95",X"41",X"6A",X"42", + X"5D",X"42",X"43",X"43",X"74",X"43",X"AB",X"40",X"9C",X"40",X"2C",X"41",X"1B",X"41",X"E4",X"42", + X"D3",X"42",X"63",X"43",X"54",X"43",X"E5",X"41",X"D2",X"41",X"A0",X"41",X"97",X"41",X"68",X"42", + X"5F",X"42",X"2D",X"42",X"1A",X"42",X"C5",X"40",X"F2",X"40",X"A3",X"41",X"94",X"41",X"6B",X"42", + X"5C",X"42",X"0D",X"43",X"3A",X"43",X"EC",X"40",X"DB",X"40",X"28",X"41",X"1F",X"41",X"E0",X"42", + X"D7",X"42",X"24",X"43",X"13",X"43",X"C4",X"40",X"F3",X"40",X"2C",X"41",X"1B",X"41",X"E4",X"42", + X"D3",X"42",X"0C",X"43",X"3B",X"43",X"A1",X"40",X"96",X"40",X"A8",X"41",X"9F",X"41",X"60",X"42", + X"57",X"42",X"69",X"43",X"5E",X"43",X"CD",X"E5",X"25",X"15",X"11",X"40",X"40",X"C9",X"D5",X"11", + X"F7",X"65",X"ED",X"88",X"ED",X"88",X"ED",X"88",X"7E",X"FE",X"27",X"38",X"DD",X"ED",X"88",X"2B", + X"D1",X"CD",X"09",X"F7",X"65",X"0B",X"46",X"F5",X"7E",X"00",X"12",X"13",X"10",X"FC",X"7E",X"0B", + X"86",X"2B",X"5F",X"0B",X"0B",X"7E",X"FE",X"D8",X"18",X"30",X"12",X"13",X"0B",X"46",X"F5",X"7E", + X"01",X"12",X"13",X"10",X"FC",X"7E",X"0B",X"86",X"2B",X"5F",X"0B",X"0B",X"7E",X"12",X"13",X"C3", + X"CD",X"2B",X"09",X"F7",X"65",X"3A",X"DD",X"65",X"3C",X"1A",X"DD",X"65",X"FE",X"34",X"28",X"23", + X"7E",X"3D",X"5F",X"FE",X"D9",X"D2",X"CD",X"2B",X"C3",X"E5",X"2B",X"C9",X"AF",X"1A",X"DD",X"65", + X"E1",X"11",X"49",X"64",X"01",X"18",X"00",X"ED",X"98",X"E1",X"09",X"F8",X"65",X"11",X"F9",X"65", + X"1E",X"00",X"01",X"11",X"00",X"ED",X"98",X"09",X"FB",X"65",X"E3",X"FE",X"09",X"FE",X"65",X"E3", + X"FE",X"09",X"01",X"66",X"E3",X"FE",X"09",X"04",X"66",X"E3",X"FE",X"09",X"07",X"66",X"E3",X"FE", + X"AF",X"1A",X"33",X"66",X"1A",X"0D",X"66",X"1A",X"0E",X"66",X"1A",X"2A",X"66",X"1A",X"2B",X"66", + X"3A",X"04",X"65",X"17",X"09",X"B5",X"2C",X"E5",X"98",X"15",X"7E",X"1A",X"18",X"40",X"0B",X"7E", + X"1A",X"2F",X"40",X"3E",X"01",X"1A",X"18",X"44",X"1A",X"2F",X"44",X"3E",X"40",X"1A",X"0B",X"66", + X"1A",X"0C",X"66",X"09",X"F5",X"65",X"E3",X"86",X"AF",X"1A",X"C2",X"66",X"E1",X"40",X"01",X"40", + X"02",X"40",X"03",X"40",X"04",X"40",X"05",X"40",X"06",X"40",X"07",X"40",X"20",X"40",X"21",X"01", + X"00",X"01",X"01",X"01",X"02",X"01",X"03",X"01",X"04",X"01",X"05",X"01",X"06",X"01",X"07",X"01", + X"20",X"01",X"21",X"02",X"00",X"02",X"01",X"02",X"02",X"02",X"03",X"02",X"04",X"02",X"05",X"02", + X"06",X"02",X"07",X"02",X"20",X"1A",X"2C",X"66",X"0A",X"0F",X"66",X"E1",X"03",X"02",X"00",X"3B", + X"14",X"30",X"21",X"77",X"03",X"02",X"00",X"4B",X"14",X"30",X"21",X"37",X"03",X"02",X"00",X"AB", + X"14",X"30",X"21",X"37",X"03",X"02",X"00",X"D3",X"14",X"30",X"21",X"37",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"00",X"02",X"04",X"00",X"A3",X"CC",X"10",X"21",X"40",X"03",X"02",X"00",X"4B", + X"14",X"30",X"21",X"77",X"03",X"02",X"00",X"7B",X"14",X"30",X"21",X"37",X"03",X"02",X"00",X"93", + X"14",X"30",X"21",X"37",X"03",X"02",X"00",X"AB",X"14",X"30",X"21",X"37",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"00",X"02",X"04",X"00",X"A3",X"FC",X"10",X"21",X"40",X"03",X"02",X"00",X"63", + X"0C",X"30",X"21",X"77",X"03",X"02",X"00",X"5B",X"0C",X"30",X"21",X"37",X"03",X"02",X"00",X"B3", + X"0C",X"30",X"21",X"37",X"03",X"02",X"00",X"C3",X"0C",X"30",X"21",X"37",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"00",X"02",X"04",X"00",X"A3",X"EC",X"10",X"21",X"40",X"03",X"02",X"00",X"43", + X"44",X"30",X"21",X"77",X"03",X"02",X"00",X"53",X"1C",X"30",X"21",X"37",X"03",X"02",X"00",X"BB", + X"1C",X"30",X"21",X"37",X"03",X"02",X"00",X"E3",X"44",X"30",X"21",X"37",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"00",X"02",X"04",X"00",X"A3",X"FC",X"10",X"21",X"40",X"03",X"02",X"00",X"73", + X"2C",X"30",X"21",X"77",X"03",X"02",X"00",X"5B",X"2C",X"30",X"21",X"37",X"03",X"02",X"00",X"B3", + X"2C",X"30",X"21",X"37",X"03",X"02",X"00",X"9B",X"2C",X"30",X"21",X"37",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"00",X"02",X"04",X"00",X"A3",X"CC",X"10",X"21",X"40",X"03",X"02",X"00",X"43", + X"14",X"30",X"21",X"77",X"03",X"02",X"00",X"73",X"14",X"30",X"21",X"37",X"03",X"02",X"00",X"9B", + X"14",X"30",X"21",X"37",X"03",X"02",X"00",X"E3",X"14",X"30",X"21",X"37",X"00",X"00",X"00",X"00", + X"00",X"00",X"21",X"00",X"02",X"04",X"00",X"A3",X"F4",X"10",X"21",X"40",X"4D",X"22",X"23",X"24", + X"25",X"26",X"27",X"10",X"14",X"4D",X"22",X"23",X"24",X"25",X"26",X"27",X"10",X"16",X"D9",X"08", + X"00",X"DC",X"04",X"FF",X"23",X"06",X"02",X"25",X"20",X"FE",X"23",X"06",X"02",X"25",X"04",X"FF", + X"DC",X"01",X"00",X"22",X"34",X"00",X"22",X"01",X"00",X"DC",X"01",X"01",X"24",X"34",X"FE",X"26", + X"01",X"01",X"DA",X"05",X"00",X"22",X"14",X"00",X"22",X"05",X"00",X"DC",X"04",X"FF",X"23",X"16", + X"02",X"25",X"04",X"FF",X"DC",X"01",X"00",X"22",X"34",X"00",X"22",X"01",X"00",X"DC",X"01",X"01", + X"24",X"24",X"FE",X"26",X"02",X"02",X"24",X"24",X"FE",X"26",X"01",X"01",X"D9",X"08",X"00",X"FF", + X"D9",X"08",X"00",X"DB",X"07",X"01",X"24",X"10",X"FE",X"26",X"07",X"01",X"D9",X"22",X"00",X"22", + X"22",X"00",X"22",X"22",X"00",X"D9",X"21",X"00",X"23",X"24",X"00",X"25",X"21",X"00",X"DA",X"01", + X"00",X"22",X"02",X"01",X"25",X"03",X"FE",X"23",X"26",X"02",X"25",X"03",X"FE",X"23",X"02",X"01", + X"22",X"01",X"00",X"DC",X"01",X"00",X"22",X"34",X"00",X"22",X"01",X"00",X"DA",X"01",X"00",X"22", + X"24",X"FF",X"26",X"02",X"02",X"24",X"24",X"FF",X"22",X"01",X"00",X"DA",X"01",X"00",X"22",X"23", + X"01",X"25",X"04",X"FE",X"23",X"23",X"01",X"22",X"01",X"00",X"DC",X"01",X"00",X"22",X"34",X"00", + X"22",X"01",X"00",X"DA",X"01",X"00",X"22",X"03",X"FF",X"26",X"01",X"02",X"24",X"10",X"FE",X"26", + X"01",X"02",X"24",X"03",X"FF",X"22",X"01",X"00",X"D9",X"21",X"00",X"24",X"24",X"00",X"26",X"21", + X"00",X"D9",X"22",X"00",X"22",X"22",X"00",X"22",X"22",X"00",X"DB",X"21",X"FF",X"23",X"24",X"02", + X"25",X"21",X"FF",X"D9",X"08",X"00",X"FF",X"D9",X"08",X"00",X"DC",X"01",X"00",X"22",X"02",X"01", + X"25",X"20",X"FE",X"23",X"04",X"02",X"25",X"20",X"FE",X"23",X"02",X"01",X"22",X"01",X"00",X"D9", + X"02",X"00",X"24",X"32",X"00",X"26",X"02",X"00",X"DD",X"03",X"00",X"22",X"30",X"00",X"22",X"03", + X"00",X"DB",X"03",X"00",X"22",X"22",X"FF",X"26",X"02",X"02",X"24",X"22",X"FF",X"22",X"03",X"00", + X"DB",X"03",X"00",X"22",X"20",X"01",X"25",X"06",X"FE",X"23",X"20",X"01",X"22",X"03",X"00",X"DD", + X"03",X"00",X"22",X"30",X"00",X"22",X"03",X"00",X"D9",X"02",X"00",X"23",X"32",X"00",X"25",X"02", + X"00",X"DC",X"01",X"00",X"22",X"05",X"FF",X"26",X"02",X"02",X"24",X"22",X"FE",X"26",X"02",X"02", + X"24",X"05",X"FF",X"22",X"01",X"00",X"D9",X"08",X"00",X"FF",X"D9",X"08",X"00",X"DB",X"03",X"FF", + X"23",X"20",X"02",X"25",X"06",X"FE",X"23",X"20",X"02",X"25",X"03",X"FF",X"D9",X"01",X"00",X"22", + X"34",X"00",X"22",X"01",X"00",X"DA",X"01",X"00",X"22",X"04",X"FF",X"26",X"02",X"02",X"24",X"24", + X"FE",X"26",X"02",X"02",X"24",X"04",X"FF",X"22",X"01",X"00",X"DA",X"01",X"00",X"22",X"03",X"01", + X"25",X"04",X"FE",X"23",X"22",X"02",X"25",X"04",X"FE",X"23",X"03",X"01",X"22",X"01",X"00",X"D9", + X"01",X"00",X"22",X"34",X"00",X"22",X"01",X"00",X"DA",X"01",X"01",X"24",X"34",X"FE",X"26",X"01", + X"01",X"DA",X"03",X"01",X"24",X"22",X"FE",X"26",X"02",X"02",X"24",X"22",X"FE",X"26",X"03",X"01", + X"DA",X"04",X"FF",X"23",X"20",X"02",X"25",X"04",X"FE",X"23",X"20",X"02",X"25",X"04",X"FF",X"DA", + X"02",X"FF",X"23",X"32",X"02",X"25",X"02",X"FF",X"D9",X"01",X"00",X"22",X"34",X"00",X"22",X"01", + X"00",X"DA",X"01",X"00",X"22",X"04",X"FF",X"26",X"02",X"02",X"24",X"24",X"FE",X"26",X"02",X"02", + X"24",X"04",X"FF",X"22",X"01",X"00",X"DA",X"01",X"00",X"22",X"03",X"01",X"25",X"04",X"FE",X"23", + X"22",X"02",X"25",X"04",X"FE",X"23",X"03",X"01",X"22",X"01",X"00",X"D9",X"01",X"00",X"22",X"34", + X"00",X"22",X"01",X"00",X"DB",X"01",X"01",X"24",X"24",X"FE",X"26",X"02",X"02",X"24",X"24",X"FE", + X"26",X"01",X"01",X"D9",X"08",X"00",X"FF",X"D9",X"08",X"00",X"DB",X"05",X"FF",X"23",X"01",X"02", + X"25",X"06",X"FE",X"23",X"02",X"02",X"25",X"06",X"FE",X"23",X"01",X"02",X"25",X"05",X"FF",X"D9", + X"02",X"00",X"23",X"32",X"00",X"25",X"02",X"00",X"DB",X"01",X"01",X"24",X"34",X"FE",X"26",X"01", + X"01",X"FC",X"04",X"00",X"22",X"16",X"00",X"22",X"04",X"00",X"DB",X"03",X"FF",X"23",X"30",X"02", + X"25",X"03",X"FF",X"D9",X"02",X"00",X"24",X"32",X"00",X"26",X"02",X"00",X"DB",X"03",X"01",X"24", + X"05",X"FE",X"26",X"02",X"02",X"24",X"06",X"FE",X"26",X"02",X"02",X"24",X"05",X"FE",X"26",X"03", + X"01",X"D9",X"08",X"00",X"FF",X"D9",X"08",X"00",X"FB",X"23",X"FF",X"23",X"20",X"02",X"25",X"23", + X"FF",X"DC",X"01",X"00",X"22",X"34",X"00",X"22",X"01",X"00",X"FB",X"01",X"01",X"24",X"34",X"FE", + X"26",X"01",X"01",X"D9",X"08",X"00",X"FF",X"3E",X"26",X"1A",X"C7",X"40",X"1A",X"D7",X"40",X"1A", + X"AF",X"41",X"1A",X"87",X"42",X"1A",X"97",X"42",X"1A",X"2F",X"43",X"3E",X"24",X"1A",X"E0",X"40", + X"1A",X"F0",X"40",X"1A",X"98",X"41",X"1A",X"A0",X"42",X"1A",X"B0",X"42",X"1A",X"18",X"43",X"3E", + X"25",X"1A",X"E7",X"40",X"1A",X"4F",X"41",X"1A",X"5F",X"41",X"1A",X"67",X"42",X"1A",X"0F",X"43", + X"1A",X"1F",X"43",X"3E",X"23",X"1A",X"D0",X"40",X"1A",X"68",X"41",X"1A",X"78",X"41",X"1A",X"50", + X"42",X"1A",X"28",X"43",X"1A",X"38",X"43",X"3E",X"22",X"1A",X"FB",X"41",X"1A",X"33",X"42",X"E1", + X"3E",X"26",X"1A",X"AF",X"41",X"3E",X"24",X"1A",X"98",X"41",X"3E",X"25",X"1A",X"67",X"42",X"3E", + X"23",X"1A",X"50",X"42",X"3E",X"24",X"1A",X"C9",X"42",X"3E",X"23",X"1A",X"01",X"41",X"3E",X"25", + X"1A",X"36",X"41",X"3E",X"26",X"1A",X"FE",X"42",X"E1",X"3E",X"25",X"1A",X"E8",X"40",X"1A",X"DE", + X"40",X"1A",X"6F",X"42",X"3E",X"23",X"1A",X"E9",X"40",X"1A",X"DF",X"40",X"1A",X"58",X"42",X"3E", + X"26",X"1A",X"A7",X"41",X"1A",X"20",X"43",X"1A",X"16",X"43",X"3E",X"24",X"1A",X"90",X"41",X"1A", + X"21",X"43",X"1A",X"17",X"43",X"3E",X"24",X"1A",X"81",X"43",X"1A",X"C1",X"40",X"3E",X"23",X"1A", + X"09",X"43",X"1A",X"49",X"40",X"3E",X"26",X"1A",X"B6",X"43",X"1A",X"F6",X"40",X"3E",X"25",X"1A", + X"3E",X"43",X"1A",X"7E",X"40",X"E1",X"3E",X"22",X"1A",X"0D",X"41",X"1A",X"CF",X"40",X"1A",X"C5", + X"42",X"1A",X"07",X"43",X"E1",X"3E",X"25",X"1A",X"E2",X"40",X"1A",X"D4",X"40",X"3E",X"23",X"1A", + X"E3",X"40",X"1A",X"D5",X"40",X"3E",X"26",X"1A",X"2A",X"43",X"1A",X"1C",X"43",X"3E",X"24",X"1A", + X"2B",X"43",X"1A",X"1D",X"43",X"E1",X"3E",X"25",X"1A",X"EF",X"40",X"3E",X"23",X"1A",X"D8",X"40", + X"1A",X"05",X"42",X"3E",X"24",X"1A",X"CD",X"41",X"1A",X"10",X"43",X"3E",X"26",X"1A",X"27",X"43", + X"E1",X"3E",X"16",X"E5",X"FD",X"14",X"3E",X"21",X"E5",X"25",X"15",X"11",X"C1",X"44",X"09",X"03", + X"1C",X"3E",X"05",X"06",X"15",X"E5",X"EB",X"15",X"11",X"7B",X"44",X"09",X"03",X"1C",X"3E",X"05", + X"06",X"10",X"E5",X"EB",X"15",X"11",X"C1",X"40",X"09",X"39",X"1A",X"3E",X"05",X"06",X"15",X"E5", + X"D5",X"15",X"11",X"61",X"41",X"09",X"8A",X"1A",X"3E",X"07",X"06",X"11",X"E5",X"D5",X"15",X"3E", + X"90",X"1A",X"EE",X"40",X"3E",X"A6",X"1A",X"EF",X"40",X"11",X"9A",X"40",X"09",X"31",X"1B",X"3E", + X"07",X"06",X"16",X"E5",X"D5",X"15",X"11",X"7B",X"40",X"09",X"9B",X"1B",X"3E",X"05",X"06",X"10", + X"E5",X"D5",X"15",X"3E",X"78",X"E5",X"B3",X"15",X"E1",X"31",X"31",X"31",X"31",X"31",X"31",X"40", + X"40",X"40",X"31",X"31",X"40",X"53",X"40",X"31",X"31",X"40",X"54",X"40",X"31",X"31",X"40",X"66", + X"40",X"31",X"31",X"40",X"45",X"40",X"31",X"31",X"40",X"53",X"40",X"31",X"31",X"40",X"45",X"40", + X"31",X"31",X"40",X"52",X"40",X"31",X"31",X"40",X"50",X"40",X"31",X"31",X"40",X"40",X"40",X"31", + X"31",X"40",X"40",X"40",X"31",X"31",X"40",X"72",X"40",X"31",X"31",X"40",X"45",X"40",X"31",X"31", + X"40",X"60",X"40",X"31",X"31",X"40",X"43",X"40",X"31",X"31",X"40",X"66",X"40",X"31",X"31",X"40", + X"41",X"40",X"31",X"31",X"40",X"53",X"40",X"31",X"31",X"40",X"40",X"40",X"31",X"31",X"31",X"31", + X"31",X"31",X"16",X"16",X"A5",X"16",X"A2",X"A3",X"A6",X"A3",X"A3",X"A7",X"A4",X"A3",X"A7",X"A6", + X"A7",X"16",X"16",X"A7",X"16",X"A7",X"A6",X"A7",X"16",X"16",X"A7",X"16",X"16",X"16",X"A7",X"A5", + X"A5",X"A7",X"A5",X"A5",X"16",X"A7",X"A7",X"A7",X"A7",X"A7",X"A7",X"A6",X"A7",X"16",X"16",X"16", + X"16",X"A7",X"A6",X"16",X"16",X"16",X"16",X"16",X"A7",X"A6",X"16",X"16",X"16",X"16",X"16",X"16", + X"16",X"A5",X"16",X"A5",X"A5",X"A5",X"A5",X"16",X"A7",X"A3",X"A7",X"A7",X"A7",X"A7",X"A6",X"A7", + X"A4",X"16",X"16",X"16",X"A7",X"A6",X"16",X"90",X"A4",X"16",X"16",X"16",X"16",X"16",X"A3",X"91", + X"16",X"16",X"16",X"16",X"A7",X"91",X"16",X"A5",X"A5",X"A5",X"16",X"A7",X"90",X"A7",X"A7",X"A7", + X"A7",X"A6",X"16",X"16",X"16",X"16",X"16",X"A7",X"A6",X"A5",X"A5",X"16",X"16",X"16",X"16",X"16", + X"A7",X"91",X"16",X"16",X"16",X"16",X"16",X"A7",X"A6",X"16",X"A5",X"A5",X"A5",X"16",X"A7",X"A7", + X"A7",X"A7",X"A7",X"A7",X"A6",X"A7",X"A6",X"16",X"16",X"16",X"16",X"16",X"A7",X"A4",X"16",X"16", + X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"A5",X"A5",X"A5",X"A5", + X"16",X"A7",X"90",X"A7",X"A7",X"A7",X"A7",X"A6",X"A7",X"16",X"16",X"A3",X"91",X"16",X"16",X"16", + X"16",X"A3",X"91",X"A2",X"16",X"16",X"16",X"A3",X"91",X"A2",X"16",X"16",X"16",X"A7",X"91",X"16", + X"A5",X"A5",X"A5",X"16",X"A7",X"90",X"A7",X"A7",X"A7",X"A7",X"A6",X"16",X"16",X"16",X"16",X"16", + X"A7",X"A6",X"16",X"16",X"16",X"16",X"16",X"16",X"16",X"A5",X"A5",X"16",X"16",X"16",X"16",X"16", + X"A7",X"91",X"16",X"16",X"16",X"16",X"16",X"A7",X"A6",X"16",X"A5",X"A5",X"A5",X"16",X"A7",X"A7", + X"A7",X"A7",X"A7",X"A7",X"A6",X"A7",X"A6",X"16",X"16",X"16",X"16",X"16",X"A7",X"A4",X"16",X"16", + X"16",X"16",X"16",X"31",X"31",X"31",X"31",X"31",X"31",X"40",X"40",X"40",X"31",X"31",X"40",X"67", + X"40",X"31",X"31",X"40",X"63",X"40",X"31",X"31",X"40",X"64",X"40",X"31",X"31",X"40",X"45",X"40", + X"31",X"31",X"40",X"54",X"40",X"31",X"31",X"40",X"40",X"40",X"31",X"31",X"40",X"03",X"40",X"31", + X"31",X"40",X"20",X"40",X"31",X"31",X"40",X"21",X"40",X"31",X"31",X"40",X"01",X"40",X"31",X"31", + X"40",X"40",X"40",X"31",X"31",X"40",X"32",X"40",X"31",X"31",X"40",X"40",X"40",X"31",X"31",X"31", + X"31",X"31",X"31",X"05",X"E1",X"E1",X"E1",X"09",X"CC",X"1C",X"0A",X"2D",X"66",X"3E",X"EF",X"1A", + X"F8",X"64",X"E1",X"E1",X"2A",X"2D",X"66",X"CD",X"09",X"CC",X"1C",X"7D",X"C9",X"BD",X"E4",X"64", + X"1C",X"7E",X"FE",X"00",X"28",X"26",X"0B",X"46",X"3A",X"A4",X"64",X"B8",X"28",X"14",X"2B",X"0A", + X"2D",X"66",X"30",X"17",X"0B",X"46",X"3A",X"A5",X"64",X"B8",X"28",X"06",X"2B",X"0A",X"2D",X"66", + X"30",X"21",X"0B",X"7E",X"1A",X"F8",X"64",X"0B",X"0A",X"2D",X"66",X"E1",X"3E",X"10",X"1A",X"29", + X"66",X"3E",X"04",X"1A",X"13",X"66",X"3E",X"22",X"1A",X"14",X"66",X"3E",X"07",X"1A",X"4A",X"64", + X"1A",X"6A",X"64",X"1A",X"5A",X"64",X"1A",X"7A",X"64",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1", + X"E1",X"E1",X"3E",X"40",X"E5",X"FD",X"14",X"3E",X"21",X"E5",X"25",X"15",X"3E",X"31",X"1A",X"34", + X"66",X"E5",X"92",X"1C",X"3E",X"27",X"E5",X"B3",X"15",X"3E",X"14",X"1A",X"34",X"66",X"E5",X"92", + X"1C",X"E1",X"09",X"40",X"40",X"0A",X"35",X"66",X"09",X"7F",X"40",X"0A",X"37",X"66",X"3E",X"08", + X"1A",X"09",X"66",X"E5",X"9D",X"1C",X"3E",X"01",X"E5",X"B3",X"15",X"3A",X"09",X"66",X"3D",X"1A", + X"09",X"66",X"08",X"EF",X"E1",X"06",X"26",X"ED",X"73",X"35",X"66",X"13",X"ED",X"53",X"35",X"66", + X"33",X"3A",X"34",X"66",X"12",X"3E",X"40",X"E5",X"9D",X"15",X"10",X"DD",X"06",X"26",X"ED",X"73", + X"37",X"66",X"33",X"ED",X"53",X"37",X"66",X"13",X"3A",X"34",X"66",X"12",X"3E",X"40",X"E5",X"9D", + X"15",X"10",X"DD",X"E1",X"00",X"CC",X"FB",X"01",X"B3",X"DF",X"00",X"EC",X"FB",X"01",X"CB",X"FE", + X"00",X"B4",X"FD",X"01",X"E3",X"FE",X"00",X"4C",X"FB",X"01",X"CB",X"FE",X"00",X"0C",X"FD",X"01", + X"B3",X"DF",X"00",X"84",X"FB",X"01",X"D3",X"FE",X"00",X"74",X"FD",X"01",X"C3",X"DF",X"00",X"9C", + X"FB",X"01",X"EB",X"DF",X"00",X"EC",X"FD",X"01",X"CB",X"DF",X"00",X"DC",X"FD",X"01",X"B3",X"FE", + X"00",X"EC",X"FD",X"01",X"93",X"FE",X"00",X"8C",X"FD",X"01",X"0B",X"DF",X"00",X"EC",X"FB",X"01", + X"5B",X"FE",X"00",X"A4",X"FD",X"01",X"43",X"FE",X"00",X"4C",X"FD",X"01",X"2B",X"FE",X"00",X"34", + X"FB",X"01",X"5B",X"DF",X"00",X"74",X"FB",X"01",X"BB",X"DF",X"00",X"A4",X"FB",X"01",X"D3",X"DF", + X"00",X"C4",X"FB",X"01",X"F3",X"DF",X"00",X"FC",X"FD",X"01",X"AB",X"FE",X"00",X"E4",X"FD",X"01", + X"7B",X"DF",X"00",X"EC",X"FD",X"01",X"5B",X"DF",X"00",X"DC",X"FD",X"01",X"2B",X"FE",X"00",X"B4", + X"FB",X"01",X"83",X"DF",X"23",X"08",X"65",X"23",X"3B",X"65",X"24",X"02",X"01",X"43",X"00",X"02", + X"20",X"05",X"04",X"01",X"54",X"00",X"05",X"04",X"01",X"1A",X"00",X"05",X"04",X"01",X"85",X"00", + X"05",X"04",X"01",X"8F",X"00",X"05",X"04",X"01",X"4C",X"00",X"05",X"04",X"01",X"23",X"01",X"05", + X"04",X"21",X"23",X"05",X"65",X"23",X"3B",X"65",X"01",X"D8",X"00",X"24",X"02",X"06",X"02",X"20", + X"05",X"03",X"02",X"00",X"05",X"03",X"07",X"27",X"21",X"23",X"05",X"65",X"24",X"02",X"01",X"00", + X"02",X"02",X"05",X"06",X"04",X"05",X"06",X"05",X"01",X"04",X"FF",X"07",X"06",X"07",X"04",X"21", + X"AE",X"64",X"F8",X"2E",X"46",X"53",X"43",X"67",X"52",X"45",X"08",X"08",X"05",X"00",X"95",X"2B", + X"A8",X"2B",X"98",X"64",X"DA",X"1C",X"46",X"65",X"45",X"66",X"52",X"23",X"3B",X"65",X"23",X"59", + X"65",X"23",X"A4",X"65",X"23",X"8F",X"65",X"24",X"02",X"01",X"08",X"00",X"02",X"27",X"06",X"05", + X"01",X"03",X"18",X"00",X"07",X"14",X"06",X"04",X"FF",X"05",X"04",X"07",X"07",X"01",X"99",X"00", + X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"05",X"04",X"01",X"85",X"00",X"02",X"26", + X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"05",X"04",X"01",X"7D",X"00",X"02",X"26",X"06",X"04", + X"FE",X"05",X"02",X"07",X"04",X"05",X"04",X"01",X"5E",X"00",X"02",X"26",X"06",X"04",X"FE",X"05", + X"02",X"07",X"02",X"05",X"01",X"01",X"69",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07", + X"04",X"05",X"02",X"01",X"70",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05", + X"01",X"01",X"69",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02",X"01", + X"4C",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"69",X"00", + X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02",X"01",X"70",X"00",X"02",X"26", + X"06",X"04",X"FE",X"05",X"02",X"07",X"06",X"21",X"24",X"01",X"02",X"01",X"06",X"01",X"80",X"00", + X"06",X"05",X"02",X"03",X"10",X"00",X"07",X"05",X"04",X"02",X"07",X"06",X"20",X"B0",X"1E",X"52", + X"41",X"65",X"1D",X"08",X"05",X"00",X"95",X"2B",X"A8",X"2B",X"8F",X"65",X"C6",X"1E",X"53",X"67", + X"55",X"52",X"41",X"65",X"1E",X"08",X"05",X"00",X"95",X"2B",X"24",X"02",X"01",X"99",X"00",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02",X"01",X"99",X"00",X"02",X"26",X"06", + X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02", + X"07",X"02",X"05",X"01",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02", + X"05",X"01",X"01",X"85",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02", + X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02",X"01",X"C8", + X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02",X"01",X"C8",X"00",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"C8",X"00",X"02",X"26",X"06", + X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"C8",X"00",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"C8",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02", + X"07",X"02",X"05",X"01",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02", + X"05",X"02",X"01",X"C8",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02", + X"01",X"23",X"01",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"02",X"01",X"23", + X"01",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"23",X"01",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"23",X"01",X"02",X"26",X"06", + X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"23",X"01",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"C8",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02", + X"07",X"02",X"05",X"02",X"01",X"23",X"01",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"03", + X"01",X"4C",X"01",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"06",X"05",X"07",X"04", + X"FE",X"07",X"04",X"21",X"24",X"01",X"02",X"27",X"06",X"01",X"C0",X"00",X"06",X"05",X"01",X"03", + X"10",X"00",X"07",X"05",X"04",X"FE",X"07",X"06",X"21",X"23",X"8F",X"65",X"24",X"02",X"01",X"43", + X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"05",X"01",X"01",X"70",X"00",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"05",X"02",X"01",X"58",X"00",X"02",X"26",X"06", + X"04",X"FE",X"05",X"02",X"07",X"02",X"01",X"85",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02", + X"07",X"02",X"05",X"01",X"01",X"58",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04", + X"01",X"5E",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"05",X"02",X"01",X"95", + X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"01",X"99",X"00",X"02",X"26",X"06", + X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"95",X"00",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"04",X"01",X"85",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04", + X"05",X"02",X"01",X"8F",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"01",X"C7", + X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"8F",X"00",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"02",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02", + X"01",X"95",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"04",X"01",X"99",X"00",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"06",X"05",X"02",X"01",X"85",X"00",X"02",X"26",X"06", + X"04",X"FE",X"05",X"02",X"07",X"04",X"05",X"03",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"02",X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02", + X"01",X"99",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"01",X"A5",X"00",X"02", + X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"02",X"01",X"95",X"00",X"02",X"26",X"06",X"04",X"FE", + X"05",X"02",X"07",X"02",X"05",X"01",X"01",X"5E",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02", + X"07",X"06",X"05",X"04",X"01",X"EC",X"00",X"02",X"26",X"06",X"04",X"FE",X"05",X"02",X"07",X"06", + X"21",X"00",X"00",X"15",X"00",X"00",X"00",X"18",X"00",X"00",X"00",X"45",X"00",X"00",X"00",X"48", + X"00",X"00",X"50",X"12",X"00",X"00",X"00",X"0D",X"00",X"00",X"50",X"1F",X"00",X"00",X"00",X"50", + X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"18",X"00",X"00",X"00",X"40", + X"00",X"00",X"50",X"07",X"00",X"00",X"00",X"15",X"00",X"00",X"50",X"0A",X"00",X"00",X"00",X"18", + X"00",X"05",X"04",X"03",X"02",X"00",X"03",X"06",X"21",X"00",X"03",X"00",X"00",X"06",X"03",X"00", + X"03",X"00",X"00",X"06",X"03",X"00",X"00",X"21",X"00",X"FF",X"64",X"52",X"53",X"50",X"42",X"03", + X"65",X"43",X"53",X"48",X"17",X"03",X"62",X"65",X"53",X"08",X"85",X"02",X"42",X"67",X"40",X"90", + X"5E",X"02",X"62",X"53",X"40",X"50",X"19",X"02",X"62",X"46",X"53",X"90",X"10",X"02",X"46",X"53", + X"65",X"00",X"05",X"02",X"43",X"53",X"65",X"48",X"01",X"02",X"43",X"44",X"40",X"80",X"B0",X"01", + X"60",X"44",X"43",X"40",X"86",X"01",X"07",X"10",X"03",X"12",X"97",X"65",X"52",X"08",X"54",X"66", + X"54",X"2C",X"43",X"67",X"50",X"71",X"52",X"61",X"47",X"60",X"54",X"08",X"19",X"39",X"38",X"1B", + X"54",X"45",X"64",X"63",X"67",X"08",X"61",X"66",X"43",X"3A",X"2D",X"66",X"63",X"1B",X"41",X"43", + X"41",X"44",X"44",X"08",X"08",X"08",X"05",X"00",X"8D",X"39",X"B8",X"39",X"CC",X"1C",X"3A",X"2C", + X"41",X"53",X"54",X"45",X"54",X"41",X"08",X"08",X"61",X"2B",X"77",X"3A",X"03",X"2A",X"66",X"67", + X"66",X"41",X"65",X"45",X"2A",X"05",X"00",X"00",X"00",X"00",X"00",X"65",X"3A",X"86",X"20",X"9F", + X"00",X"49",X"39",X"30",X"3A",X"15",X"39",X"54",X"41",X"42",X"64",X"45",X"53",X"08",X"08",X"57", + X"2B",X"86",X"3A",X"03",X"2A",X"66",X"67",X"66",X"41",X"65",X"45",X"2A",X"06",X"00",X"00",X"00", + X"00",X"00",X"5C",X"3A",X"86",X"20",X"27",X"00",X"04",X"1C",X"13",X"1C",X"9A",X"1A",X"61",X"66", + X"61",X"54",X"53",X"08",X"08",X"08",X"4D",X"2B",X"BF",X"3A",X"03",X"2A",X"66",X"67",X"66",X"41", + X"65",X"45",X"2A",X"07",X"00",X"00",X"00",X"00",X"00",X"CE",X"2E",X"05",X"00",X"D4",X"3A",X"CF", + X"3A",X"F7",X"65",X"EE",X"2C",X"53",X"42",X"55",X"46",X"46",X"45",X"52",X"08",X"05",X"00",X"D4", + X"3A",X"CF",X"3A",X"DD",X"65",X"80",X"19",X"64",X"43",X"66",X"54",X"08",X"08",X"08",X"08",X"5B", + X"2B",X"D4",X"3A",X"03",X"2A",X"66",X"67",X"66",X"41",X"65",X"45",X"2A",X"20",X"00",X"00",X"00", + X"00",X"00",X"9C",X"2D",X"81",X"2B",X"00",X"00",X"03",X"2A",X"66",X"67",X"66",X"41",X"65",X"45", + X"2A",X"21",X"00",X"00",X"00",X"00",X"00",X"E9",X"3A",X"86",X"00",X"C2",X"66",X"F5",X"65",X"C2", + X"66",X"67",X"38",X"50",X"52",X"67",X"52",X"41",X"65",X"08",X"08",X"F5",X"65",X"C2",X"66",X"E9", + X"3A",X"00",X"00",X"00",X"1E",X"00",X"1F",X"00",X"22",X"3B",X"31",X"3A",X"FF",X"63",X"A7",X"2B", + X"BC",X"33",X"2A",X"28",X"F8",X"2E",X"31",X"3B",X"00",X"2B",X"28",X"D0",X"19",X"CE",X"2E",X"0A", + X"3B",X"00",X"D1",X"19",X"03",X"1C",X"9C",X"2D",X"2B",X"3B",X"00",X"04",X"1C",X"13",X"1C",X"5C", + X"3A",X"1C",X"3B",X"00",X"14",X"1C",X"5B",X"1D",X"BA",X"39",X"3D",X"3B",X"00",X"5C",X"1D",X"48", + X"39",X"DE",X"1E",X"46",X"3B",X"00",X"49",X"39",X"30",X"3A",X"65",X"3A",X"F0",X"1E",X"00",X"FE", + X"A5",X"20",X"22",X"07",X"07",X"22",X"29",X"6F",X"21",X"FD",X"04",X"01",X"18",X"23",X"FB",X"85", + X"20",X"23",X"01",X"58",X"23",X"FA",X"85",X"20",X"24",X"01",X"69",X"02",X"99",X"A0",X"02",X"BA", + X"6A",X"20",X"25",X"01",X"77",X"02",X"8D",X"4B",X"23",X"29",X"76",X"05",X"2C",X"85",X"01",X"86", + X"01",X"03",X"05",X"25",X"86",X"20",X"26",X"07",X"07",X"03",X"07",X"06",X"07",X"07",X"02",X"A4", + X"62",X"20",X"27",X"03",X"22",X"DE",X"84",X"23",X"DD",X"41",X"03",X"25",X"20",X"23",X"FD",X"84", + X"07",X"01",X"03",X"23",X"FC",X"1D",X"07",X"02",X"03",X"23",X"2B",X"87",X"02",X"DC",X"92",X"3D", + X"01",X"A2",X"23",X"2D",X"A4",X"02",X"EB",X"A1",X"3D",X"13",X"00",X"07",X"04",X"07",X"20",X"03", + X"21",X"FC",X"04",X"23",X"F6",X"92",X"09",X"23",X"08",X"81",X"23",X"F9",X"86",X"20",X"07",X"06", + X"22",X"03",X"02",X"20",X"2C",X"01",X"79",X"23",X"F7",X"A1",X"02",X"C6",X"0C",X"06",X"23",X"03", + X"01",X"1B",X"23",X"C8",X"C5",X"09",X"23",X"08",X"81",X"23",X"DF",X"88",X"23",X"2C",X"12",X"23", + X"28",X"27",X"23",X"DE",X"87",X"37",X"07",X"01",X"89",X"01",X"06",X"37",X"F3",X"02",X"8B",X"7A", + X"23",X"29",X"5F",X"3D",X"07",X"04",X"06",X"01",X"03",X"01",X"13",X"23",X"F9",X"96",X"37",X"06", + X"23",X"2C",X"4F",X"23",X"28",X"4C",X"23",X"DE",X"49",X"23",X"29",X"76",X"07",X"03",X"06",X"24", + X"03",X"25",X"20",X"02",X"3C",X"54",X"09",X"01",X"68",X"23",X"C9",X"A9",X"09",X"23",X"28",X"62", + X"22",X"DE",X"91",X"37",X"D3",X"02",X"6B",X"42",X"23",X"29",X"3F",X"23",X"2C",X"3C",X"23",X"DF", + X"39",X"01",X"41",X"23",X"29",X"1C",X"23",X"2C",X"19",X"22",X"DF",X"84",X"02",X"13",X"2B",X"09", + X"01",X"63",X"01",X"0E",X"23",X"CA",X"9A",X"23",X"08",X"81",X"23",X"FA",X"A4",X"23",X"2C",X"5B", + X"37",X"EB",X"23",X"FE",X"6E",X"06",X"01",X"03",X"23",X"F9",X"A3",X"23",X"2C",X"4D",X"23",X"F9", + X"4A",X"37",X"20",X"01",X"59",X"23",X"28",X"73",X"23",X"F8",X"70",X"23",X"29",X"55",X"23",X"2C", + X"52",X"37",X"CB",X"02",X"05",X"75",X"01",X"76",X"23",X"CB",X"A2",X"02",X"15",X"45",X"3D",X"07", + X"03",X"06",X"25",X"03",X"04",X"00",X"00",X"00",X"00",X"69",X"48",X"66",X"0B",X"46",X"32",X"81", + X"6F",X"13",X"32",X"A0",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"85",X"6F",X"13",X"32", + X"A4",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"8D",X"6F",X"13",X"32",X"8C",X"4F",X"E1", + X"44",X"65",X"09",X"00",X"00",X"3E",X"10",X"DD",X"29",X"EB",X"97",X"29",X"EB",X"A5",X"91",X"6F", + X"7C",X"B0",X"4F",X"13",X"D2",X"F1",X"3C",X"21",X"33",X"D9",X"3D",X"C2",X"C7",X"3C",X"E1",X"76", + X"0B",X"56",X"EB",X"29",X"CD",X"29",X"29",X"C1",X"21",X"E1",X"44",X"65",X"09",X"00",X"00",X"3E", + X"10",X"29",X"EB",X"29",X"EB",X"D2",X"F9",X"3C",X"21",X"3D",X"C2",X"D9",X"3C",X"E1",X"71",X"50", + X"EB",X"97",X"95",X"6F",X"3E",X"00",X"B4",X"4F",X"E1",X"EB",X"77",X"16",X"00",X"EB",X"32",X"9D", + X"6F",X"13",X"32",X"9C",X"4F",X"E1",X"77",X"16",X"00",X"7B",X"95",X"6F",X"7A",X"B4",X"4F",X"E1", + X"67",X"06",X"00",X"7B",X"91",X"6F",X"7A",X"B0",X"4F",X"E1",X"69",X"48",X"66",X"0B",X"46",X"32", + X"91",X"6F",X"13",X"32",X"B0",X"4F",X"E1",X"6F",X"0E",X"00",X"32",X"95",X"6F",X"13",X"32",X"B4", + X"4F",X"E1",X"77",X"16",X"00",X"7B",X"96",X"77",X"7A",X"0B",X"B6",X"57",X"EB",X"E1",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"93",X"1B",X"93",X"1B",X"58",X"0E",X"24",X"2A",X"B4",X"03",X"F8",X"29",X"EC",X"2E",X"48",X"2F", + X"00",X"00",X"F1",X"13",X"9D",X"0C",X"65",X"0E",X"FF",X"7F",X"2F",X"03",X"BA",X"06",X"00",X"04", + X"FC",X"03",X"F7",X"12",X"8F",X"03",X"D5",X"03",X"F3",X"03",X"A5",X"27",X"EA",X"03",X"DF",X"03", + X"A2",X"03",X"00",X"12",X"25",X"12",X"32",X"12",X"E7",X"16",X"CA",X"03",X"21",X"13",X"1B",X"13", + X"F2",X"E7",X"16",X"DA",X"20",X"D2",X"67",X"70",X"A2",X"03",X"F2",X"A8",X"C4",X"52",X"67",X"57", + X"A5",X"27",X"85",X"C7",X"66",X"61",X"66",X"52",X"41",X"57",X"00",X"12",X"97",X"E5",X"52",X"54", + X"8D",X"31",X"96",X"10",X"C5",X"64",X"54",X"61",X"54",X"56",X"32",X"A3",X"E5",X"71",X"53",X"AD", + X"13",X"96",X"40",X"C2",X"55",X"53",X"98",X"14",X"F2",X"90",X"C7",X"66",X"61",X"52",X"54",X"53", + X"D3",X"31",X"95",X"C5",X"64",X"54",X"61",X"54",X"53",X"06",X"34",X"A4",X"E4",X"52",X"53",X"1C", + X"12",X"F1",X"38",X"C1",X"52",X"53",X"89",X"14",X"F1",X"28",X"C5",X"43",X"41",X"50",X"53",X"2E", + X"16",X"A1",X"D0",X"53",X"78",X"00",X"F8",X"18",X"C1",X"64",X"53",X"9A",X"34",X"F1",X"08",X"D2", + X"60",X"53",X"89",X"12",X"B7",X"E4",X"60",X"53",X"C1",X"12",X"B6",X"D4",X"45",X"53",X"DF",X"34", + X"F0",X"C0",X"C7",X"45",X"53",X"94",X"00",X"B2",X"E6",X"67",X"61",X"54",X"43",X"45",X"53",X"0F", + X"12",X"8A",X"00",X"C6",X"43",X"53",X"26",X"35",X"D1",X"1F",X"D2",X"41",X"64",X"41",X"43",X"53", + X"6B",X"35",X"8F",X"C3",X"42",X"53",X"78",X"30",X"F4",X"B0",X"42",X"D4",X"53",X"52",X"5F",X"15", + X"F7",X"C4",X"52",X"52",X"D1",X"12",X"D2",X"4F",X"C1",X"43",X"52",X"52",X"B8",X"00",X"D1",X"27", + X"C3",X"52",X"52",X"59",X"16",X"F1",X"20",X"C1",X"52",X"52",X"C2",X"00",X"D1",X"37",X"D2",X"52", + X"CD",X"00",X"F1",X"30",X"C4",X"64",X"52",X"F6",X"00",X"D2",X"6F",X"C1",X"43",X"64",X"52",X"4D", + X"16",X"D1",X"07",X"C3",X"64",X"52",X"49",X"12",X"F1",X"00",X"C1",X"64",X"52",X"DA",X"00",X"D1", + X"17",X"E4",X"52",X"20",X"01",X"F1",X"10",X"E6",X"54",X"45",X"52",X"D0",X"00",X"D2",X"45",X"E1", + X"54",X"45",X"52",X"91",X"12",X"D2",X"65",X"D4",X"45",X"52",X"15",X"01",X"D7",X"E1",X"C5",X"65", + X"55",X"53",X"45",X"52",X"01",X"01",X"8D",X"C5",X"56",X"52",X"45",X"53",X"45",X"52",X"7D",X"16", + X"8C",X"01",X"D3",X"45",X"52",X"D6",X"00",X"F0",X"80",X"D4",X"41",X"45",X"50",X"45",X"52",X"40", + X"01",X"A7",X"D2",X"27",X"01",X"DB",X"E0",X"53",X"55",X"50",X"51",X"01",X"F6",X"C5",X"D0",X"67", + X"50",X"2C",X"01",X"F6",X"C1",X"E7",X"50",X"0D",X"01",X"DA",X"08",X"C5",X"50",X"F9",X"00",X"DA", + X"28",X"C5",X"47",X"41",X"50",X"26",X"17",X"A0",X"30",X"D0",X"63",X"16",X"DA",X"18",X"E1",X"54", + X"55",X"67",X"5F",X"01",X"D2",X"8B",X"C4",X"54",X"55",X"67",X"66",X"15",X"D2",X"AB",X"D4",X"55", + X"67",X"A4",X"01",X"C9",X"41",X"D2",X"61",X"54",X"67",X"71",X"16",X"D2",X"9B",X"D2",X"44",X"54", + X"67",X"7C",X"01",X"D2",X"BB",X"C7",X"52",X"67",X"E7",X"14",X"81",X"D2",X"67",X"85",X"15",X"F2", + X"98",X"F2",X"66",X"43",X"12",X"DA",X"00",X"D0",X"67",X"66",X"7F",X"31",X"D1",X"00",X"D4",X"53", + X"61",X"64",X"67",X"66",X"88",X"00",X"87",X"C7",X"45",X"66",X"45",X"35",X"D2",X"44",X"D2",X"60", + X"43",X"66",X"8B",X"01",X"B4",X"C3",X"66",X"03",X"33",X"DA",X"10",X"C5",X"65",X"41",X"66",X"D4", + X"01",X"AB",X"C4",X"67",X"65",X"78",X"34",X"B5",X"C7",X"45",X"65",X"8E",X"17",X"96",X"D8",X"C5", + X"65",X"38",X"35",X"96",X"FF",X"E7",X"52",X"43",X"41",X"65",X"F5",X"32",X"91",X"E5",X"6F",X"17", + X"DA",X"38",X"E7",X"64",X"EA",X"32",X"B1",X"D4",X"53",X"61",X"64",X"19",X"15",X"86",X"D2",X"61", + X"44",X"64",X"A2",X"17",X"D2",X"98",X"E1",X"44",X"64",X"F7",X"14",X"D2",X"88",X"D2",X"44",X"44", + X"64",X"93",X"17",X"D2",X"B8",X"C4",X"44",X"64",X"06",X"02",X"D2",X"A8",X"C4",X"64",X"14",X"02", + X"D0",X"E4",X"33",X"02",X"DD",X"05",X"D2",X"62",X"CA",X"15",X"D3",X"30",X"D0",X"62",X"1C",X"02", + X"D5",X"C3",X"F1",X"61",X"18",X"02",X"FC",X"08",X"F0",X"61",X"81",X"17",X"FD",X"08",X"C5",X"47"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_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/Arcade/Pacman Hardware/MrTNT_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/build_id.v new file mode 100644 index 00000000..81162513 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171113" +`define BUILD_TIME "104226" diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_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/Arcade/Pacman Hardware/MrTNT_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/MrTNT_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_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/Arcade/Pacman Hardware/MrTNT_MiST/rtl/osd.v b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_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/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..9b976d32 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pacman.vhd @@ -0,0 +1,629 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN is +generic ( + MRTNT : std_logic := '1' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0_reg : in std_logic_vector(7 downto 0); + in1_reg : in std_logic_vector(7 downto 0); + dipsw_reg : in std_logic_vector(7 downto 0); + + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of PACMAN is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_ena : std_logic; + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal rom_data_out : std_logic_vector(7 downto 0); + signal rom_data : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal vram_addr_ab : std_logic_vector(11 downto 0); + signal ab : std_logic_vector(11 downto 0); + + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal vram_l : std_logic; + signal rams_data_out : std_logic_vector(7 downto 0); + -- more decode + signal wr0_l : std_logic; + signal wr1_l : std_logic; + signal wr2_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + +begin + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + p_sync_comb : process(hcnt, vcnt) + begin + vsync <= not vcnt(8); + do_hsync <= (hcnt = "010101111"); -- 0AF + end process; + + p_sync : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + + if (hcnt = "010010111") then -- 097 + O_HBLANK <= '1'; + elsif (hcnt = "010001111") then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") then + hblank <= '0'; -- 0EF + O_HBLANK <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + -- + -- cpu + -- + p_cpu_wait_comb : process(sync_bus_wreq_l) + begin + cpu_wait_l <= '1'; + if (sync_bus_wreq_l = '0') then + cpu_wait_l <= '0'; + end if; + end process; + + p_irq_req_watchdog : process + variable rising_vblank : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + --rising_vblank := do_hsync; -- debug + -- interrupt 8c + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + + -- simulation + -- pragma translate_off + -- synopsys translate_off + watchdog_reset_l <= not reset; -- watchdog disable + -- synopsys translate_on + -- pragma translate_on + end if; + end process; + + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + + p_cpu_ena : process(hcnt, ena_6) + begin + cpu_ena <= '0'; + if (ena_6 = '1') then + cpu_ena <= hcnt(0); + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + -- + -- primary addr decode + -- + p_mem_decode_comb : process(cpu_rfsh_l, cpu_rd_l, cpu_mreq_l, cpu_addr) + begin + -- rom 0x0000 - 0x3FFF + -- syncbus 0x4000 - 0x7FFF + + -- 7M + -- 7N + sync_bus_cs_l <= '1'; +-- program_rom_cs_l <= '1'; + + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + +-- if (cpu_addr(14) = '0') and (cpu_rd_l = '0') then +-- program_rom_cs_l <= '0'; +-- end if; + + if (cpu_addr(14) = '1') then + sync_bus_cs_l <= '0'; + end if; + + end if; + end process; + -- + -- sync bus custom ic + -- + p_sync_bus_reg : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; + end process; + + p_sync_bus_comb : process(cpu_rd_l, sync_bus_cs_l, hcnt) + begin + -- sync_bus_stb is now an active low clock enable signal + sync_bus_stb <= '1'; + sync_bus_r_w_l <= '1'; + + if (sync_bus_cs_l = '0') and (hcnt(1) = '0') then + if (cpu_rd_l = '1') then + sync_bus_r_w_l <= '0'; + end if; + sync_bus_stb <= '0'; + end if; + + sync_bus_wreq_l <= '1'; + if (sync_bus_cs_l = '0') and (hcnt(1) = '1') and (cpu_rd_l = '0') then + sync_bus_wreq_l <= '0'; + end if; + end process; + -- + -- vram addr custom ic + -- + u_vram_addr : entity work.PACMAN_VRAM_ADDR + port map ( + AB => vram_addr_ab, + H256_L => hcnt(8), + H128 => hcnt(7), + H64 => hcnt(6), + H32 => hcnt(5), + H16 => hcnt(4), + H8 => hcnt(3), + H4 => hcnt(2), + H2 => hcnt(1), + H1 => hcnt(0), + V128 => vcnt(7), + V64 => vcnt(6), + V32 => vcnt(5), + V16 => vcnt(4), + V8 => vcnt(3), + V4 => vcnt(2), + V2 => vcnt(1), + V1 => vcnt(0), + FLIP => control_reg(3) + ); + + p_ab_mux_comb : process(hcnt, cpu_addr, vram_addr_ab) + begin + --When 2H is low, the CPU controls the bus. + if (hcnt(1) = '0') then + ab <= cpu_addr(11 downto 0); + else + ab <= vram_addr_ab; + end if; + end process; + + p_vram_comb : process(hcnt, cpu_addr, sync_bus_stb) + variable a,b : std_logic; + begin + + a := not (cpu_addr(12) or sync_bus_stb); + b := hcnt(1) and hcnt(0); + vram_l <= not (a or b); + end process; + + p_io_decode_comb : process(sync_bus_r_w_l, sync_bus_stb, ab, cpu_addr) + variable sel : std_logic_vector(2 downto 0); + variable dec : std_logic_vector(7 downto 0); + variable selb : std_logic_vector(1 downto 0); + variable decb : std_logic_vector(3 downto 0); + begin + -- WRITE + + -- out_l 0x5000 - 0x503F control space + + -- wr0_l 0x5040 - 0x504F sound + -- wr1_l 0x5050 - 0x505F sound + -- wr2_l 0x5060 - 0x506F sprite + + -- 0x5080 - 0x50BF unused + + -- wdr_l 0x50C0 - 0x50FF watchdog reset + + -- READ + + -- in0_l 0x5000 - 0x503F in port 0 + -- in1_l 0x5040 - 0x507F in port 1 + -- dipsw_l 0x5080 - 0x50BF dip switches + + -- 7J + dec := "11111111"; + sel := sync_bus_r_w_l & ab(7) & ab(6); + if (cpu_addr(12) = '1') and ( sync_bus_stb = '0') then + case sel is + when "000" => dec := "11111110"; + when "001" => dec := "11111101"; + when "010" => dec := "11111011"; + when "011" => dec := "11110111"; + when "100" => dec := "11101111"; + when "101" => dec := "11011111"; + when "110" => dec := "10111111"; + when "111" => dec := "01111111"; + when others => null; + end case; + end if; + iodec_out_l <= dec(0); + iodec_wdr_l <= dec(3); + + iodec_in0_l <= dec(4); + iodec_in1_l <= dec(5); + iodec_dipsw_l <= dec(6); + + -- 7M + decb := "1111"; + selb := ab(5) & ab(4); + if (dec(1) = '0') then + case selb is + when "00" => decb := "1110"; + when "01" => decb := "1101"; + when "10" => decb := "1011"; + when "11" => decb := "0111"; + when others => null; + end case; + end if; + wr0_l <= decb(0); + wr1_l <= decb(1); + wr2_l <= decb(2); + end process; + + p_control_reg : process + variable ena : std_logic_vector(7 downto 0); + begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + ena := "00000000"; + if (iodec_out_l = '0') then + case ab(2 downto 0) is + when "000" => ena := "00000001"; + when "001" => ena := "00000010"; + when "010" => ena := "00000100"; + when "011" => ena := "00001000"; + when "100" => ena := "00010000"; + when "101" => ena := "00100000"; + when "110" => ena := "01000000"; + when "111" => ena := "10000000"; + when others => null; + end case; + end if; + + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (ena(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + p_db_mux_comb : process(hcnt, cpu_data_out, rams_data_out) + begin + -- simplified data source for video subsystem + -- only cpu or ram are sources of interest + if (hcnt(1) = '0') then + sync_bus_db <= cpu_data_out; + else + sync_bus_db <= rams_data_out; + end if; + end process; + + rom_data <= program_rom_dinl when cpu_addr(15) = '0' else program_rom_dinh; + rom_data_out <= rom_data(7 downto 6) & rom_data(3) & rom_data(4) & rom_data(5) & rom_data(2 downto 0) when MRTNT = '1' else rom_data; + + p_cpu_data_in_mux_comb : process(cpu_addr, cpu_iorq_l, cpu_m1_l, sync_bus_wreq_l, + iodec_in0_l, iodec_in1_l, iodec_dipsw_l, cpu_vec_reg, sync_bus_reg, rom_data_out, + rams_data_out, in0_reg, in1_reg, dipsw_reg) + begin + -- simplifed again + if (cpu_iorq_l = '0') and (cpu_m1_l = '0') then + cpu_data_in <= cpu_vec_reg; + elsif (sync_bus_wreq_l = '0') then + cpu_data_in <= sync_bus_reg; + else + if (cpu_addr(15 downto 14) = "00") then -- ROM at 0000 - 3fff + cpu_data_in <= rom_data_out; + elsif (cpu_addr(15 downto 13) = "100") then -- ROM at 8000 - 9fff + cpu_data_in <= rom_data_out; + else + cpu_data_in <= rams_data_out; + if (iodec_in0_l = '0') then cpu_data_in <= in0_reg; end if; + if (iodec_in1_l = '0') then cpu_data_in <= in1_reg; end if; + if (iodec_dipsw_l = '0') then cpu_data_in <= dipsw_reg; end if; + end if; + end if; + end process; + + u_rams : work.dpram generic map (12,8) + port map + ( + clk_a_i => clk, + en_a_i => ena_6, + we_i => not sync_bus_r_w_l and not vram_l, + addr_a_i => ab(11 downto 0), + data_a_i => cpu_data_out, -- cpu only source of ram data + + clk_b_i => clk, + addr_b_i => ab(11 downto 0), + data_b_o => rams_data_out + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom : entity work.ROM_PGM_0 + port map ( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom1 : entity work.ROM_PGM_1 + port map ( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinh + ); + + -- + -- video subsystem + -- + u_video : entity work.PACMAN_VIDEO + generic map ( + MRTNT => MRTNT + ) + port map ( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + I_WR2_L => wr2_l, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk + ); + + O_HSYNC <= hSync; + O_VSYNC <= vSync; + + --O_HBLANK <= hblank; + O_VBLANK <= vblank; + + -- + -- + -- audio subsystem + -- + u_audio : entity work.PACMAN_AUDIO + port map ( + I_HCNT => hcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_WR1_L => wr1_l, + I_WR0_L => wr0_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..39619ea0 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR1_L, + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => rom3m(1), + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..895304e9 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pacman_video.vhd @@ -0,0 +1,366 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_VIDEO is +generic ( + MRTNT : std_logic := '0' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); +port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + I_WR2_L : in std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic +); +end; + +architecture RTL of PACMAN_VIDEO is + + signal sprite_xy_ram_temp : std_logic_vector(7 downto 0); + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal db_reg : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_dout : std_logic_vector(7 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal cntr_ld : std_logic; + signal sprite_ram_ip : std_logic_vector(3 downto 0); + signal sprite_ram_op : std_logic_vector(3 downto 0); + signal ra : std_logic_vector(7 downto 0); + signal ra_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(3 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + + -- ram enable is low when HBLANK_L is 0 (for sprite access) or + -- 2H is low (for cpu writes) + -- we can simplify this + dr <= not sprite_xy_ram_temp when I_HBLANK = '1' else "11111111"; -- pull ups on board + + sprite_xy_ram : work.dpram generic map (4,8) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR2_L, + addr_a_i => I_AB(3 downto 0), + data_a_i => I_DB, + + clk_b_i => CLK, + addr_b_i => I_AB(3 downto 0), + data_b_o => sprite_xy_ram_temp + ); + + p_char_regs : process + variable inc : std_logic; + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; + begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + inc := (not I_HBLANK); + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & inc); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + db_reg <= I_DB; -- character reg + end if; + end process; + + p_flip_comb : process(char_hblank_reg, I_FLIP, db_reg) + begin + if (char_hblank_reg = '0') then + xflip <= I_FLIP; + yflip <= I_FLIP; + else + xflip <= db_reg(1); + yflip <= db_reg(0); + end if; + end process; + + p_char_addr_comb : process(db_reg, I_HCNT, + char_match_reg, char_sum_reg, char_hblank_reg, + xflip, yflip) + begin + obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + + ca(12) <= char_hblank_reg; + ca(11 downto 6) <= db_reg(7 downto 2); + + -- 2h, 4e + if (char_hblank_reg = '0') then + ca(5) <= db_reg(1); + ca(4) <= db_reg(0); + else + ca(5) <= char_sum_reg(3) xor xflip; + ca(4) <= I_HCNT(3); + end if; + + ca(3) <= I_HCNT(2) xor yflip; + ca(1) <= char_sum_reg(1) xor xflip; + + -- descramble ROMs for Mr TNT (swap address lines A0 and A2) + if MRTNT = '1' then + ca(2) <= char_sum_reg(0) xor xflip; + ca(0) <= char_sum_reg(2) xor xflip; + else + ca(2) <= char_sum_reg(2) xor xflip; + ca(0) <= char_sum_reg(0) xor xflip; + end if; + end process; + + + -- descramble ROMs for Mr TNT (swap data lines D4 and D6) + char_rom_5ef_dout <= char_rom_5ef_buf(7) & char_rom_5ef_buf(4) & char_rom_5ef_buf(5) & char_rom_5ef_buf(6) & char_rom_5ef_buf(3 downto 0) when MRTNT = '1' else char_rom_5ef_buf; + + -- char roms + char_rom_5ef : entity work.GFX1 + port map ( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf + ); + + p_char_shift : process + begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_dout(7 downto 4); -- load + shift_regl <= char_rom_5ef_dout(3 downto 0); + when others => null; + end case; + end if; + end process; + + p_char_shift_comb : process(I_HCNT, vout_yflip, shift_regu, shift_regl) + variable ip : std_logic; + begin + ip := I_HCNT(0) and I_HCNT(1); + if (vout_yflip = '0') then + + shift_sel(0) <= ip; + shift_sel(1) <= '1'; + shift_op(0) <= shift_regl(3); + shift_op(1) <= shift_regu(3); + else + + shift_sel(0) <= '1'; + shift_sel(1) <= ip; + shift_op(0) <= shift_regl(0); + shift_op(1) <= shift_regu(0); + end if; + end process; + + p_video_out_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= I_DB(4 downto 0); -- colour reg + end if; + end if; + end process; + + col_rom_4a : entity work.PROM4_DST + port map ( + CLK => CLK, + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a + ); + + cntr_ld <= '1' when (I_HCNT(3 downto 0) = "0111") and (vout_hblank='1' or vout_obj_on='0') else '0'; + + p_ra_cnt : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (cntr_ld = '1') then + ra <= dr; + else + ra <= ra + "1"; + end if; + end if; + end process; + + u_sprite_ram : work.dpram generic map (8,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => vout_obj_on_t1, + addr_a_i => ra_t1, + data_a_i => sprite_ram_ip, + + clk_b_i => CLK, + addr_b_i => ra, + data_b_o => sprite_ram_op + ); + + sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "0000"; + video_op_sel <= '1' when not (sprite_ram_reg = "0000") else '0'; + + p_sprite_ram_ip_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + ra_t1 <= ra; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + end if; + end process; + + p_sprite_ram_ip_comb : process(vout_hblank_t1, video_op_sel, sprite_ram_reg, lut_4a_t1) + begin + -- 3a + if (vout_hblank_t1 = '0') then + sprite_ram_ip <= (others => '0'); + else + if (video_op_sel = '1') then + sprite_ram_ip <= sprite_ram_reg; + else + sprite_ram_ip <= lut_4a_t1(3 downto 0); + end if; + end if; + end process; + + p_video_op_comb : process(vout_hblank, I_VBLANK, video_op_sel, sprite_ram_reg, lut_4a) + begin + -- 3b + if (vout_hblank = '1') or (I_VBLANK = '1') then + final_col <= (others => '0'); + else + if (video_op_sel = '1') then + final_col <= sprite_ram_reg; -- sprite + else + final_col <= lut_4a(3 downto 0); + end if; + end if; + end process; + + -- assign video outputs from color LUT PROM + col_rom_7f : entity work.PROM7_DST + port map ( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE + ); + +end architecture; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pacman_vram_addr.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pacman_vram_addr.vhd new file mode 100644 index 00000000..b26824c4 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pacman_vram_addr.vhd @@ -0,0 +1,273 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ & CarlW - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity X74_157 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end; + +architecture RTL of X74_157 is +begin + p_y_comb : process(S,G,A,B) + begin + for i in 0 to 3 loop + -- quad 2 line to 1 line mux (true logic) + if (G = '1') then + Y(i) <= '0'; + else + if (S = '0') then + Y(i) <= A(i); + else + Y(i) <= B(i); + end if; + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity X74_257 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end; + +architecture RTL of X74_257 is +signal ab : std_logic_vector (3 downto 0); +begin + + Y <= ab; -- no tristate + p_ab : process(S,A,B) + begin + for i in 0 to 3 loop + if (S = '0') then + AB(i) <= A(i); + else + AB(i) <= B(i); + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VRAM_ADDR is + port ( + AB : out std_logic_vector (11 downto 0); + H256_L : in std_logic; + H128 : in std_logic; + H64 : in std_logic; + H32 : in std_logic; + H16 : in std_logic; + H8 : in std_logic; + H4 : in std_logic; + H2 : in std_logic; + H1 : in std_logic; + V128 : in std_logic; + V64 : in std_logic; + V32 : in std_logic; + V16 : in std_logic; + V8 : in std_logic; + V4 : in std_logic; + V2 : in std_logic; + V1 : in std_logic; + FLIP : in std_logic + ); +end; + +architecture RTL of PACMAN_VRAM_ADDR is + +signal v128p : std_logic; +signal v64p : std_logic; +signal v32p : std_logic; +signal v16p : std_logic; +signal v8p : std_logic; +signal h128p : std_logic; +signal h64p : std_logic; +signal h32p : std_logic; +signal h16p : std_logic; +signal h8p : std_logic; +signal sel : std_logic; +signal y157 : std_logic_vector (11 downto 0); + +component X74_157 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end component; + +component X74_257 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end component; + +begin + p_vp_comb : process(FLIP, V8, V16, V32, V64, V128) + begin + v128p <= FLIP xor V128; + v64p <= FLIP xor V64; + v32p <= FLIP xor V32; + v16p <= FLIP xor V16; + v8p <= FLIP xor V8; + end process; + + p_hp_comb : process(FLIP, H8, H16, H32, H64, H128) + begin + H128P <= FLIP xor H128; + H64P <= FLIP xor H64; + H32P <= FLIP xor H32; + H16P <= FLIP xor H16; + H8P <= FLIP xor H8; + end process; + + p_sel : process(H16, H32, H64) + begin + sel <= not((H32 xor H16) or (H32 xor H64)); + end process; + + --p_oe257 : process(H2) + --begin + -- oe <= not(H2); + --end process; + + U6 : X74_157 + port map( + Y => y157(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => h64p, + B(0) => h64p, + A => "1111", + G => '0', + S => sel + ); + + U5 : X74_157 + port map( + Y => y157(7 downto 4), + B(3) => h64p, + B(2) => h64p, + B(1) => h8p, + B(0) => v128p, + A => "1111", + G => '0', + S => sel + ); + + U4 : X74_157 + port map( + Y => y157(3 downto 0), + B(3) => v64p, + B(2) => v32p, + B(1) => v16p, + B(0) => v8p, + A(3) => H64, + A(2) => H32, + A(1) => H16, + A(0) => H4, + G => '0', + S => sel + ); + + U3 : X74_257 + port map( + Y => AB(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => v128p, + B(0) => v64p, + A => y157(11 downto 8), + S => H256_L + ); + + U2 : X74_257 + port map( + Y => AB(7 downto 4), + B(3) => v32p, + B(2) => v16p, + B(1) => v8p, + B(0) => h128p, + A => y157(7 downto 4), + S => H256_L + ); + + U1 : X74_257 + port map( + Y => AB(3 downto 0), + B(3) => h64p, + B(2) => h32p, + B(1) => h16p, + B(0) => h8p, + A => y157(3 downto 0), + S => H256_L + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_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 VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pll.vhd b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pll.vhd new file mode 100644 index 00000000..3c952a1a --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/pll.vhd @@ -0,0 +1,365 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC ; + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + locked <= sub_wire0; + sub_wire2 <= sub_wire1(0); + c0 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 9, + clk0_duty_cycle => 50, + clk0_multiply_by => 8, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire4, + locked => sub_wire0, + clk => sub_wire1 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "9" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +-- 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 "1" +-- 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: 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_CLKENA0 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 "9" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +-- Retrieval info: CONSTANT: CLK0_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_USED" +-- 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_USED" +-- 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_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Pacman Hardware/MrTNT_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/MrTNT_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/MrTNT_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/MrTNT_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/Arcade/Pacman Hardware/MsPacman_MiST/MSPacman.qpf b/Arcade/Pacman Hardware/MsPacman_MiST/MSPacman.qpf new file mode 100644 index 00000000..c4a7439a --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/MSPacman.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "MSPacman" diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/MSPacman.qsf b/Arcade/Pacman Hardware/MsPacman_MiST/MSPacman.qsf new file mode 100644 index 00000000..63fc5594 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/MSPacman.qsf @@ -0,0 +1,171 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 10:26:45 November 13, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# MSPacman_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 PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/pacman_vram_addr.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_rom_descrambler.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/MSPacman.sv +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/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM3_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GFX1.vhd +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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY MSPacman +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# 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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(MSPacman) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(MSPacman) +# -------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/README.txt b/Arcade/Pacman Hardware/MsPacman_MiST/README.txt new file mode 100644 index 00000000..d825ff57 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/README.txt @@ -0,0 +1,24 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Ms. Pacman port to MiST by Gehstock +-- 10 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE,CTRL : Slow +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/Release/MSPacman.rbf b/Arcade/Pacman Hardware/MsPacman_MiST/Release/MSPacman.rbf new file mode 100644 index 00000000..7464d251 Binary files /dev/null and b/Arcade/Pacman Hardware/MsPacman_MiST/Release/MSPacman.rbf differ diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/clean.bat b/Arcade/Pacman Hardware/MsPacman_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_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/Arcade/Pacman Hardware/MsPacman_MiST/rtl/MSPacman.sv b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/MSPacman.sv new file mode 100644 index 00000000..1a0e78dc --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/MSPacman.sv @@ -0,0 +1,190 @@ +//============================================================================ +// Arcade: Ms.Pacman +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module MSPacman +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Ms Pacman;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [7:0] audio; +wire hsync,vsync; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid = ce_6m; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + + +video_mixer #(.LINE_LENGTH(292), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(r), + .G(g), + .B(b), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire;// = kbjoy[0] | joystick_0[4] | joystick_1[4]; //Reset the Game +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + + +pacman mrspacman +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + .in0_reg(~{2'b00, m_coin, 1'b0, m_down,m_right,m_left,m_up}), + .in1_reg(~{1'b0, m_start2, m_start1, m_fire, 4'b0000}), + .dipsw_reg(8'b0_1_00_11_01), + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +endmodule diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..834eafbd --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"CC",X"EE",X"11",X"11",X"33",X"EE",X"CC",X"00",X"11",X"33",X"66",X"44",X"44",X"33",X"11",X"00", + X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00",X"00",X"00",X"77",X"77",X"22",X"00",X"00",X"00", + X"11",X"99",X"DD",X"DD",X"FF",X"77",X"33",X"00",X"33",X"77",X"55",X"44",X"44",X"66",X"22",X"00", + X"66",X"FF",X"99",X"99",X"99",X"33",X"22",X"00",X"44",X"66",X"77",X"55",X"44",X"44",X"00",X"00", + X"44",X"FF",X"FF",X"44",X"44",X"CC",X"CC",X"00",X"00",X"77",X"77",X"66",X"33",X"11",X"00",X"00", + X"EE",X"FF",X"11",X"11",X"11",X"33",X"22",X"00",X"00",X"55",X"55",X"55",X"55",X"77",X"77",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"EE",X"00",X"00",X"44",X"44",X"44",X"66",X"33",X"11",X"00", + X"00",X"00",X"88",X"FF",X"77",X"00",X"00",X"00",X"66",X"77",X"55",X"44",X"44",X"66",X"66",X"00", + X"66",X"77",X"DD",X"DD",X"99",X"99",X"66",X"00",X"00",X"33",X"44",X"44",X"55",X"77",X"33",X"00", + X"CC",X"EE",X"BB",X"99",X"99",X"99",X"00",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"FF",X"FF",X"44",X"44",X"44",X"FF",X"FF",X"00",X"11",X"33",X"66",X"44",X"66",X"33",X"11",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"77",X"00", + X"22",X"33",X"11",X"11",X"33",X"EE",X"CC",X"00",X"22",X"66",X"44",X"44",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"33",X"11",X"11",X"FF",X"FF",X"00",X"11",X"33",X"66",X"44",X"44",X"77",X"77",X"00", + X"11",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00",X"44",X"44",X"44",X"44",X"77",X"77",X"00",X"00", + X"00",X"88",X"88",X"88",X"88",X"FF",X"FF",X"00",X"44",X"44",X"44",X"44",X"44",X"77",X"77",X"00", + X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00", + X"00",X"00",X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"03", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C8",X"C8",X"CC",X"CC",X"EE",X"AA",X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"33", + X"9B",X"DD",X"FF",X"F7",X"79",X"F1",X"C0",X"00",X"33",X"30",X"70",X"61",X"10",X"00",X"00",X"00", + X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"00",X"10",X"10",X"11",X"11",X"33",X"33", + X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"77",X"77",X"DD",X"FF",X"FF",X"EE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"EE",X"00",X"DD",X"EE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"DD",X"00",X"EE",X"DD",X"00",X"00", + X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"11",X"33",X"77",X"77",X"33",X"11", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"11",X"33",X"77",X"77",X"33",X"11",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"FF", + X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"CC",X"88", + X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"EE",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"77", + X"33",X"33",X"33",X"33",X"FF",X"EE",X"00",X"00",X"CC",X"CC",X"CC",X"CC",X"FF",X"77",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00",X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00", + X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00",X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00", + X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"00",X"00",X"88",X"44",X"22",X"00",X"88",X"44",X"22",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00",X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00", + X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00",X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00", + X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00",X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00", + X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00",X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"88",X"22",X"00",X"00",X"00",X"CC",X"EE",X"FF",X"33",X"00",X"00",X"00", + X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC",X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33", + X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"EE",X"22",X"22",X"00",X"11",X"22",X"22",X"22",X"33", + X"AA",X"AA",X"AA",X"22",X"00",X"00",X"00",X"EE",X"22",X"22",X"22",X"11",X"00",X"22",X"22",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"33",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"00", + X"33",X"33",X"77",X"77",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE", + X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"33",X"33",X"33",X"77",X"77",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE", + X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"11",X"33",X"33",X"33",X"33",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00", + X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CE",X"EE",X"EE",X"EE",X"66",X"22",X"22",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"FF",X"BB",X"BB",X"33",X"33",X"FF",X"EE",X"DD",X"DD",X"DD",X"DD",X"CC",X"CC",X"FF",X"77", + X"33",X"33",X"BB",X"BB",X"BB",X"FF",X"FF",X"00",X"CC",X"CC",X"DD",X"DD",X"DD",X"FF",X"FF",X"CC", + X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00",X"77",X"FF",X"CC",X"CC",X"66",X"FF",X"FF",X"CC", + X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"EE",X"00",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"77", + X"00",X"EE",X"FF",X"33",X"33",X"33",X"FF",X"FF",X"00",X"77",X"FF",X"CC",X"CC",X"CC",X"FF",X"77", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"FF",X"FF",X"CC",X"CC",X"FF",X"FF",X"CC",X"CC",X"FF",X"FF", + X"00",X"88",X"CC",X"CC",X"CC",X"CC",X"FF",X"FF",X"00",X"77",X"FF",X"CC",X"CC",X"CC",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"CC",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C",X"00",X"00",X"CC",X"CC", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C",X"00",X"00",X"00",X"00", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0C",X"0C",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC", + X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"22",X"77",X"88",X"88",X"77",X"00",X"99",X"AA",X"AA", + X"3E",X"3E",X"DE",X"1E",X"DE",X"3E",X"3E",X"DE",X"C7",X"C7",X"B7",X"87",X"B7",X"C7",X"C7",X"B7", + X"F0",X"1E",X"1E",X"9E",X"9E",X"1E",X"1E",X"DE",X"F0",X"87",X"87",X"97",X"97",X"87",X"87",X"B7", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"20",X"90",X"80",X"00",X"00",X"30",X"30",X"10",X"10",X"00",X"00", + X"41",X"21",X"12",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"0C",X"0C",X"8C",X"0C",X"00",X"00",X"00",X"07",X"0F",X"0F",X"C3",X"1F", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"08",X"0F",X"2F",X"4F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"07",X"4F",X"0F",X"A7",X"87",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"D3",X"87",X"97",X"0F",X"2F",X"07",X"00",X"00",X"33",X"10",X"10",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"08",X"0E",X"8E",X"1F",X"0F", + X"0C",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"4F",X"1F",X"0F",X"4F",X"0E",X"08",X"00",X"00", + X"00",X"00",X"01",X"03",X"87",X"87",X"87",X"47",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"10", + X"EF",X"47",X"07",X"07",X"03",X"01",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"0C",X"0C",X"08",X"08",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"00", + X"00",X"FF",X"FF",X"08",X"00",X"88",X"CC",X"77",X"00",X"00",X"11",X"33",X"33",X"11",X"13",X"00", + X"33",X"88",X"00",X"00",X"88",X"FF",X"77",X"00",X"11",X"11",X"33",X"33",X"13",X"11",X"00",X"00", + X"00",X"00",X"26",X"EE",X"CC",X"00",X"CC",X"CC",X"00",X"8C",X"EE",X"66",X"11",X"77",X"CC",X"00", + X"CC",X"00",X"88",X"CE",X"66",X"22",X"00",X"00",X"CC",X"7F",X"33",X"00",X"6E",X"CC",X"88",X"00", + X"00",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"20", + X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"10",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"0C",X"0F",X"CF",X"2F",X"0F",X"0F", + X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"70",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"44",X"54",X"32", + X"F0",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"C0",X"E0",X"E0",X"E0",X"00",X"00",X"00",X"30",X"F0",X"F0",X"F0",X"F0", + X"68",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"F0",X"C3",X"F0",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"0E",X"0F",X"0F",X"0D",X"02",X"01",X"00",X"00",X"01",X"05",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"08",X"0E",X"0F",X"2F",X"17", + X"8C",X"0C",X"0C",X"0C",X"0C",X"08",X"00",X"00",X"0B",X"05",X"02",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"F1",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"20", + X"E0",X"F1",X"E0",X"E0",X"00",X"00",X"00",X"00",X"20",X"20",X"10",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"DD", + X"22",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",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"0F",X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"0F",X"0F",X"0F",X"FF",X"FF",X"0F", + X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"CF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00", + X"0F",X"CF",X"FF",X"0F",X"0F",X"FF",X"0F",X"0F",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"CF", + X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"CF",X"3F",X"FF",X"FF",X"3F",X"0F",X"0F",X"0F",X"0F",X"CF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"F0",X"F0",X"0F",X"0F",X"C3",X"F0",X"0F",X"0F",X"F0",X"0F",X"0F",X"C3",X"F0",X"F0", + X"F0",X"F0",X"0F",X"0F",X"C3",X"F0",X"3C",X"0F",X"F0",X"0F",X"0F",X"C3",X"3C",X"0F",X"C3",X"F0", + X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"C3",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"0F",X"0F",X"0F",X"0F",X"C3",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"3C",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"00",X"33",X"74",X"74",X"F8",X"F9",X"F9",X"F9", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"FF",X"F9",X"F9",X"F9",X"F8",X"74",X"74",X"33",X"00", + X"FF",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"FF", + X"00",X"CC",X"E2",X"E2",X"F1",X"F9",X"F9",X"F9",X"FF",X"F0",X"F0",X"FE",X"11",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"F1",X"E2",X"E2",X"CC",X"00",X"00",X"00",X"00",X"11",X"FE",X"F0",X"F0",X"FF", + X"FF",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"FF",X"F0",X"F0",X"FE",X"11",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"11",X"FE",X"F0",X"F0",X"FF", + X"FF",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"FF",X"F1",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9", + X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"E2",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F1",X"F1",X"E2",X"E2",X"CC",X"00", + X"00",X"33",X"74",X"74",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"74",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"33",X"74",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"E2",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"F8",X"F8",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F9",X"F8",X"F8",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"F1",X"F1",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"F1",X"F1",X"FF",X"00",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1", + X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"11",X"FE",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"FE",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"33",X"74",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"E2",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"F0",X"F9",X"F9",X"F9",X"F8",X"F8",X"F8",X"F8",X"F8", + X"F0",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"F8",X"F8",X"F9",X"F9",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"0C",X"0C",X"8C",X"0C",X"00",X"00",X"30",X"30",X"10",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"20",X"90",X"80",X"00",X"00",X"00",X"07",X"0F",X"0F",X"C3",X"1F", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"41",X"21",X"12",X"03",X"03",X"01",X"00",X"00",X"07",X"08",X"0F",X"2F",X"4F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"00",X"00",X"07",X"4F",X"0F",X"A7",X"87",X"00",X"00",X"00",X"08",X"0E",X"8E",X"1F",X"0F", + X"0C",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"33",X"10",X"10",X"10",X"00",X"00",X"00",X"00", + X"D3",X"87",X"97",X"0F",X"2F",X"07",X"00",X"00",X"4F",X"1F",X"0F",X"4F",X"0E",X"08",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"10", + X"00",X"00",X"01",X"03",X"87",X"87",X"87",X"47",X"00",X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"0C",X"0C",X"08",X"08",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EF",X"47",X"07",X"07",X"03",X"01",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"00", + X"00",X"00",X"26",X"EE",X"CC",X"00",X"CC",X"CC",X"00",X"00",X"11",X"33",X"33",X"11",X"13",X"00", + X"00",X"FF",X"FF",X"08",X"00",X"88",X"CC",X"77",X"00",X"8C",X"EE",X"66",X"11",X"77",X"CC",X"00", + X"CC",X"00",X"88",X"CE",X"66",X"22",X"00",X"00",X"11",X"11",X"33",X"33",X"13",X"11",X"00",X"00", + X"33",X"88",X"00",X"00",X"88",X"FF",X"77",X"00",X"CC",X"7F",X"33",X"00",X"6E",X"CC",X"88",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"20", + X"00",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0C",X"0F",X"CF",X"2F",X"0F",X"0F", + X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"10",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"00",X"00", + X"00",X"00",X"00",X"80",X"C0",X"E0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"44",X"54",X"32", + X"00",X"00",X"00",X"00",X"00",X"70",X"F0",X"F0",X"00",X"00",X"00",X"30",X"F0",X"F0",X"F0",X"F0", + X"68",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"C3",X"F0",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"01",X"05",X"02",X"00",X"00",X"00", + X"00",X"00",X"0E",X"0F",X"0F",X"0D",X"02",X"01",X"00",X"00",X"00",X"08",X"0E",X"0F",X"2F",X"17", + X"8C",X"0C",X"0C",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0D",X"05",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"10",X"30",X"70",X"F8",X"70",X"30",X"10", + X"00",X"00",X"00",X"0C",X"04",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"07",X"04",X"07",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00", + X"02",X"03",X"00",X"00",X"0F",X"00",X"00",X"00",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"04",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"07",X"04",X"07",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00", + X"02",X"03",X"00",X"0D",X"05",X"07",X"00",X"00",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"04",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"07",X"04",X"07",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00", + X"02",X"03",X"00",X"07",X"05",X"0D",X"00",X"00",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"04",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"07",X"04",X"07",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00", + X"02",X"03",X"00",X"0F",X"00",X"00",X"00",X"00",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0E",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"03",X"02",X"03",X"00",X"0F",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"00", + X"01",X"00",X"0F",X"08",X"0F",X"00",X"0C",X"00",X"0F",X"00",X"08",X"08",X"08",X"00",X"00",X"00", + X"0E",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"03",X"02",X"03",X"00",X"0F",X"01",X"0F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"05",X"05",X"00", + X"0F",X"08",X"0F",X"00",X"04",X"04",X"0C",X"00",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00", + X"0E",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"03",X"02",X"03",X"00",X"0F",X"01",X"0F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"05",X"07",X"00", + X"0F",X"08",X"0F",X"00",X"0C",X"04",X"04",X"00",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"0F",X"0F", + X"0E",X"0E",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"0E",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"44",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"55",X"DD",X"DD",X"55",X"55",X"33", + X"66",X"66",X"55",X"DD",X"DD",X"77",X"77",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"DD",X"DD",X"55",X"55",X"33", + X"00",X"00",X"00",X"00",X"88",X"88",X"44",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"66",X"66",X"55",X"DD",X"DD",X"55",X"55",X"33",X"00",X"00",X"00",X"00",X"88",X"88",X"44",X"44", + X"11",X"11",X"55",X"55",X"DD",X"99",X"11",X"DD",X"99",X"CC",X"EE",X"BB",X"99",X"CC",X"EE",X"BB", + X"AA",X"88",X"AA",X"AA",X"BB",X"99",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"77", + X"11",X"11",X"11",X"DD",X"11",X"FF",X"00",X"00",X"99",X"CC",X"EE",X"BB",X"99",X"FF",X"CC",X"88", + X"99",X"BB",X"99",X"88",X"88",X"FF",X"00",X"00",X"EE",X"22",X"EE",X"77",X"00",X"FF",X"00",X"00", + X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"CC",X"EE",X"BB",X"99",X"CC",X"EE",X"BB", + X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"DD",X"11",X"99",X"CC",X"EE",X"BB",X"99",X"CC",X"EE",X"BB", + X"88",X"88",X"88",X"88",X"AA",X"AA",X"BB",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00", + X"00",X"88",X"88",X"88",X"CC",X"44",X"44",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"DD",X"DD",X"DD",X"55",X"55",X"77",X"33", + X"66",X"66",X"55",X"55",X"DD",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"11",X"11",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00", + X"00",X"00",X"33",X"FF",X"55",X"DD",X"DD",X"DD",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"55",X"77",X"33",X"33",X"33",X"11",X"11",X"CC",X"44",X"44",X"66",X"66",X"66",X"77",X"55", + X"CC",X"99",X"BB",X"EE",X"CC",X"99",X"BB",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"99",X"BB",X"EE",X"DD",X"BB",X"BB",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"99",X"BB",X"EE",X"CC",X"99",X"BB",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"99",X"BB",X"EE",X"CC",X"99",X"BB",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"EE",X"FF",X"FF",X"77",X"77", + X"00",X"11",X"11",X"11",X"33",X"FF",X"FF",X"FF",X"88",X"88",X"88",X"88",X"88",X"CC",X"CC",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"11",X"11",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"33",X"33",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"88",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"77", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"77",X"00",X"33",X"77",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"77",X"FF",X"FF",X"FF",X"EE",X"CC",X"00",X"00",X"CC",X"CC",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"CC",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"33",X"33",X"77",X"77",X"77", + X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"EE",X"EE",X"EE",X"FF",X"FF",X"FF",X"77",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"E0",X"C0",X"80",X"C0",X"E0",X"E0",X"80",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70", + X"00",X"10",X"F0",X"F0",X"F0",X"F3",X"F3",X"F0",X"00",X"F0",X"F1",X"F2",X"F2",X"F1",X"F1",X"F2", + X"80",X"E0",X"E0",X"C0",X"80",X"C0",X"E0",X"00",X"70",X"70",X"30",X"30",X"10",X"00",X"00",X"00", + X"F0",X"F3",X"F3",X"F0",X"F0",X"F0",X"10",X"00",X"F2",X"F1",X"F1",X"F2",X"F2",X"F1",X"F0",X"00", + X"00",X"C0",X"E0",X"E0",X"C0",X"80",X"C0",X"E0",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70", + X"00",X"10",X"F0",X"F0",X"F0",X"F3",X"F3",X"F0",X"00",X"F0",X"F1",X"F2",X"F2",X"F1",X"F1",X"F2", + X"E0",X"C0",X"80",X"C0",X"E0",X"E0",X"C0",X"00",X"70",X"70",X"30",X"30",X"10",X"00",X"00",X"00", + X"F0",X"F3",X"F3",X"F0",X"F0",X"F0",X"10",X"00",X"F2",X"F1",X"F1",X"F2",X"F2",X"F1",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"11",X"33",X"77",X"77",X"33",X"11", + X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"FF", + X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"77",X"33",X"11",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"CC",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"00",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"11",X"00",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"00",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"11",X"00",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"00",X"FF",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"11",X"00",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"00",X"FF",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"11",X"00",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF",X"FF",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"00",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"11",X"00",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"00",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"11",X"00",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"01",X"30",X"30",X"67",X"77", + X"00",X"11",X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"67",X"30",X"30",X"01",X"00",X"00",X"00", + X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"01",X"30",X"30",X"67",X"77", + X"00",X"11",X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"67",X"30",X"30",X"01",X"00",X"00",X"00", + X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"06",X"09",X"08",X"08",X"06",X"02",X"0C",X"00",X"02",X"02",X"0A",X"06",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"00",X"0F",X"04",X"02",X"01",X"02",X"0C",X"00",X"08",X"0E",X"08",X"08",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"06",X"09",X"09",X"09",X"06",X"02",X"0C",X"00",X"0C",X"02",X"02",X"02",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"00",X"09",X"09",X"09",X"07",X"00",X"0F",X"0C",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"11",X"33",X"33",X"77",X"77",X"88",X"88",X"88",X"88",X"88",X"FF",X"FF",X"FF", + X"FF",X"FF",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"77",X"77",X"77",X"77",X"77",X"33",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"88",X"88", + X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"33", + X"10",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"DD",X"C0",X"E6",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"33",X"30",X"70",X"61",X"10",X"00",X"00",X"00", + X"DD",X"DD",X"DD",X"F7",X"79",X"F1",X"C0",X"00",X"FF",X"FF",X"DD",X"FF",X"FF",X"EE",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"EE",X"00", + X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"20",X"62",X"EE",X"EE",X"00",X"00",X"00",X"00",X"20",X"32",X"33",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"33",X"30",X"70",X"61",X"10",X"00",X"00",X"00", + X"22",X"9B",X"DD",X"F7",X"79",X"F1",X"C0",X"00",X"33",X"77",X"DD",X"FF",X"FF",X"EE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"33",X"FF",X"FB",X"FF",X"77",X"77",X"33",X"88",X"88",X"88",X"88",X"88",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"CC",X"CC",X"EE",X"FE",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"FF",X"88",X"FF",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"77",X"FF", + X"FC",X"FE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"BB",X"FF",X"FF",X"FF",X"33",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"E6",X"CC",X"9B",X"EE",X"00",X"00",X"FE",X"EC",X"CC",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"CC",X"EE",X"BB",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"00",X"88",X"CC",X"EC",X"FE",X"00", + X"00",X"00",X"00",X"88",X"CC",X"C0",X"00",X"00",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"EE",X"CD",X"FF",X"00",X"00",X"EE",X"FF",X"FF",X"77",X"CC",X"00", + X"00",X"00",X"00",X"C0",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"CC",X"FF",X"BB",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"EE",X"00", + X"00",X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"FF",X"DD",X"9B",X"00",X"00",X"EE",X"FF",X"FF",X"DD",X"77",X"77", + X"EE",X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"AA",X"EE",X"CC",X"CC",X"C8",X"C8",X"00",X"00",X"33",X"33",X"11",X"11",X"10",X"10",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"11",X"33",X"30",X"00",X"00",X"00", + X"00",X"77",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"DD",X"FF",X"33", + X"CC",X"C0",X"E0",X"68",X"80",X"00",X"00",X"00",X"00",X"00",X"30",X"33",X"11",X"00",X"00",X"00", + X"00",X"33",X"EE",X"FF",X"FF",X"77",X"00",X"00",X"FF",X"3B",X"77",X"FE",X"E9",X"F8",X"30",X"00", + X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"33", + X"00",X"00",X"C8",X"C8",X"CC",X"CC",X"EE",X"AA",X"00",X"00",X"10",X"10",X"11",X"11",X"33",X"33", + X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"33",X"30",X"70",X"61",X"10",X"00",X"00",X"00", + X"9B",X"DD",X"FF",X"F7",X"79",X"F1",X"C0",X"00",X"77",X"77",X"DD",X"FF",X"FF",X"EE",X"00",X"00", + X"00",X"00",X"00",X"88",X"CC",X"C0",X"00",X"00",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"EE",X"CD",X"FF",X"00",X"00",X"EE",X"FF",X"FF",X"77",X"CC",X"00", + X"00",X"00",X"00",X"C0",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"CC",X"FF",X"BB",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"EE",X"00", + X"00",X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"FF",X"DD",X"9B",X"00",X"00",X"EE",X"FF",X"FF",X"DD",X"77",X"77", + X"EE",X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"AA",X"EE",X"CC",X"CC",X"C8",X"C8",X"00",X"00",X"33",X"33",X"11",X"11",X"10",X"10",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"11",X"33",X"30",X"00",X"00",X"00", + X"00",X"77",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"DD",X"FF",X"33", + X"CC",X"C0",X"E0",X"68",X"80",X"00",X"00",X"00",X"00",X"00",X"30",X"33",X"11",X"00",X"00",X"00", + X"00",X"33",X"EE",X"FF",X"FF",X"77",X"00",X"00",X"FF",X"3B",X"77",X"FE",X"E9",X"F8",X"30",X"00", + X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"33", + X"00",X"00",X"C8",X"C8",X"CC",X"CC",X"EE",X"AA",X"00",X"00",X"10",X"10",X"11",X"11",X"33",X"33", + X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"33",X"30",X"70",X"61",X"10",X"00",X"00",X"00", + X"9B",X"DD",X"FF",X"F7",X"79",X"F1",X"C0",X"00",X"77",X"77",X"DD",X"FF",X"FF",X"EE",X"00",X"00", + X"00",X"00",X"00",X"88",X"CC",X"C0",X"00",X"00",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"EE",X"CD",X"FF",X"00",X"00",X"EE",X"FF",X"FF",X"77",X"CC",X"00", + X"00",X"00",X"00",X"C0",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"CC",X"FF",X"BB",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"EE",X"00", + X"00",X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"FF",X"DD",X"9B",X"00",X"00",X"EE",X"FF",X"FF",X"DD",X"77",X"77", + X"EE",X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"AA",X"EE",X"CC",X"CC",X"C8",X"C8",X"00",X"00",X"33",X"33",X"11",X"11",X"10",X"10",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"11",X"33",X"30",X"00",X"00",X"00", + X"00",X"77",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"DD",X"FF",X"33", + X"CC",X"C0",X"E0",X"68",X"80",X"00",X"00",X"00",X"00",X"00",X"30",X"33",X"11",X"00",X"00",X"00", + X"00",X"33",X"EE",X"FF",X"FF",X"77",X"00",X"00",X"FF",X"3B",X"77",X"FE",X"E9",X"F8",X"30",X"00", + X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"11",X"33",X"30",X"00",X"00",X"00", + X"00",X"77",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"DD",X"FF",X"33", + X"CC",X"C0",X"E0",X"68",X"80",X"00",X"00",X"00",X"00",X"00",X"30",X"33",X"11",X"00",X"00",X"00", + X"00",X"33",X"EE",X"FF",X"FF",X"77",X"00",X"00",X"FF",X"3B",X"77",X"FE",X"E9",X"F8",X"30",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..4bfa195f --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"03", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"05",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"07", + X"00",X"00",X"00",X"00",X"00",X"0B",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"0E",X"00",X"01",X"0C",X"0F", + X"00",X"0E",X"00",X"0B",X"00",X"0C",X"0B",X"0E",X"00",X"0C",X"0F",X"01",X"00",X"00",X"00",X"00", + X"00",X"01",X"02",X"0F",X"00",X"07",X"0C",X"02",X"00",X"09",X"06",X"0F",X"00",X"0D",X"0C",X"0F", + X"00",X"05",X"03",X"09",X"00",X"0F",X"0B",X"00",X"00",X"0E",X"00",X"0B",X"00",X"0E",X"00",X"0B", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0E",X"01",X"00",X"0F",X"0B",X"0E",X"00",X"0E",X"00",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..88b2ecb3 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"66",X"EF",X"00",X"F8",X"EA",X"6F",X"00",X"3F",X"00",X"C9",X"38",X"AA",X"AF",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..333a80cb --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F3",X"3E",X"3F",X"ED",X"47",X"C3",X"0B",X"23",X"77",X"23",X"10",X"FC",X"C9",X"C3",X"0E",X"07", + X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"C9",X"78",X"87",X"D7",X"5F",X"23",X"56",X"EB",X"C9", + X"E1",X"87",X"D7",X"5F",X"23",X"56",X"EB",X"E9",X"E1",X"46",X"23",X"4E",X"23",X"E5",X"18",X"12", + X"11",X"90",X"4C",X"06",X"10",X"C3",X"51",X"00",X"AF",X"32",X"00",X"50",X"32",X"07",X"50",X"C3", + X"38",X"00",X"2A",X"80",X"4C",X"70",X"2C",X"71",X"2C",X"20",X"02",X"2E",X"C0",X"22",X"80",X"4C", + X"C9",X"1A",X"A7",X"28",X"06",X"1C",X"1C",X"1C",X"10",X"F7",X"C9",X"E1",X"06",X"03",X"7E",X"12", + X"23",X"1C",X"10",X"FA",X"E9",X"C3",X"2D",X"20",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07", + X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"12",X"13",X"14",X"01",X"03",X"04", + X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"14",X"F5",X"32",X"C0", + X"50",X"AF",X"32",X"00",X"50",X"F3",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"21",X"8C",X"4E", + X"11",X"50",X"50",X"01",X"10",X"00",X"ED",X"B0",X"3A",X"CC",X"4E",X"A7",X"3A",X"CF",X"4E",X"20", + X"03",X"3A",X"9F",X"4E",X"32",X"45",X"50",X"3A",X"DC",X"4E",X"A7",X"3A",X"DF",X"4E",X"20",X"03", + X"3A",X"AF",X"4E",X"32",X"4A",X"50",X"3A",X"EC",X"4E",X"A7",X"3A",X"EF",X"4E",X"20",X"03",X"3A", + X"BF",X"4E",X"32",X"4F",X"50",X"21",X"02",X"4C",X"11",X"22",X"4C",X"01",X"1C",X"00",X"ED",X"B0", + X"DD",X"21",X"20",X"4C",X"DD",X"7E",X"02",X"07",X"07",X"DD",X"77",X"02",X"DD",X"7E",X"04",X"07", + X"07",X"DD",X"77",X"04",X"DD",X"7E",X"06",X"07",X"07",X"DD",X"77",X"06",X"DD",X"7E",X"08",X"07", + X"07",X"DD",X"77",X"08",X"DD",X"7E",X"0A",X"07",X"07",X"DD",X"77",X"0A",X"DD",X"7E",X"0C",X"07", + X"07",X"DD",X"77",X"0C",X"3A",X"D1",X"4D",X"FE",X"01",X"20",X"38",X"DD",X"21",X"20",X"4C",X"3A", + X"A4",X"4D",X"87",X"5F",X"16",X"00",X"DD",X"19",X"2A",X"24",X"4C",X"ED",X"5B",X"34",X"4C",X"DD", + X"7E",X"00",X"32",X"24",X"4C",X"DD",X"7E",X"01",X"32",X"25",X"4C",X"DD",X"7E",X"10",X"32",X"34", + X"4C",X"DD",X"7E",X"11",X"32",X"35",X"4C",X"DD",X"75",X"00",X"DD",X"74",X"01",X"DD",X"73",X"10", + X"DD",X"72",X"11",X"3A",X"A6",X"4D",X"A7",X"CA",X"76",X"01",X"ED",X"4B",X"22",X"4C",X"ED",X"5B", + X"32",X"4C",X"2A",X"2A",X"4C",X"22",X"22",X"4C",X"2A",X"3A",X"4C",X"22",X"32",X"4C",X"ED",X"43", + X"2A",X"4C",X"ED",X"53",X"3A",X"4C",X"21",X"22",X"4C",X"11",X"F2",X"4F",X"01",X"0C",X"00",X"ED", + X"B0",X"21",X"32",X"4C",X"11",X"62",X"50",X"01",X"0C",X"00",X"ED",X"B0",X"CD",X"DC",X"01",X"CD", + X"21",X"02",X"CD",X"C8",X"03",X"3A",X"00",X"4E",X"A7",X"28",X"12",X"CD",X"9D",X"03",X"CD",X"90", + X"14",X"CD",X"1F",X"14",X"CD",X"67",X"02",X"CD",X"AD",X"02",X"CD",X"FD",X"02",X"3A",X"00",X"4E", + X"3D",X"20",X"06",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"CD",X"0C",X"2D",X"CD",X"C1",X"2C",X"FD", + X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"3A",X"00",X"4E",X"A7",X"28",X"08",X"3A",X"40",X"50",X"E6", + X"10",X"CA",X"00",X"00",X"3E",X"01",X"32",X"00",X"50",X"FB",X"F1",X"C9",X"21",X"84",X"4C",X"34", + X"23",X"35",X"23",X"11",X"19",X"02",X"01",X"01",X"04",X"34",X"7E",X"E6",X"0F",X"EB",X"BE",X"20", + X"13",X"0C",X"1A",X"C6",X"10",X"E6",X"F0",X"12",X"23",X"BE",X"20",X"08",X"0C",X"EB",X"36",X"00", + X"23",X"13",X"10",X"E5",X"21",X"8A",X"4C",X"71",X"2C",X"7E",X"87",X"87",X"86",X"3C",X"77",X"2C", + X"7E",X"87",X"86",X"87",X"87",X"86",X"3C",X"77",X"C9",X"06",X"A0",X"0A",X"60",X"0A",X"60",X"0A", + X"A0",X"21",X"90",X"4C",X"3A",X"8A",X"4C",X"4F",X"06",X"10",X"7E",X"A7",X"28",X"2F",X"E6",X"C0", + X"07",X"07",X"B9",X"30",X"28",X"35",X"7E",X"E6",X"3F",X"20",X"22",X"77",X"C5",X"E5",X"2C",X"7E", + X"2C",X"46",X"21",X"5B",X"02",X"E5",X"E7",X"94",X"08",X"A3",X"06",X"8E",X"05",X"72",X"12",X"00", + X"10",X"0B",X"10",X"63",X"02",X"2B",X"21",X"F0",X"21",X"B9",X"22",X"E1",X"C1",X"2C",X"2C",X"2C", + X"10",X"C8",X"C9",X"EF",X"1C",X"86",X"C9",X"3A",X"6E",X"4E",X"FE",X"99",X"17",X"32",X"06",X"50", + X"1F",X"D0",X"3A",X"00",X"50",X"47",X"CB",X"00",X"3A",X"66",X"4E",X"17",X"E6",X"0F",X"32",X"66", + X"4E",X"D6",X"0C",X"CC",X"DF",X"02",X"CB",X"00",X"3A",X"67",X"4E",X"17",X"E6",X"0F",X"32",X"67", + X"4E",X"D6",X"0C",X"C2",X"9A",X"02",X"21",X"69",X"4E",X"34",X"CB",X"00",X"3A",X"68",X"4E",X"17", + X"E6",X"0F",X"32",X"68",X"4E",X"D6",X"0C",X"C0",X"21",X"69",X"4E",X"34",X"C9",X"3A",X"69",X"4E", + X"A7",X"C8",X"47",X"3A",X"6A",X"4E",X"5F",X"FE",X"00",X"C2",X"C4",X"02",X"3E",X"01",X"32",X"07", + X"50",X"CD",X"DF",X"02",X"7B",X"FE",X"08",X"C2",X"CE",X"02",X"AF",X"32",X"07",X"50",X"1C",X"7B", + X"32",X"6A",X"4E",X"D6",X"10",X"C0",X"32",X"6A",X"4E",X"05",X"78",X"32",X"69",X"4E",X"C9",X"3A", + X"6B",X"4E",X"21",X"6C",X"4E",X"34",X"96",X"C0",X"77",X"3A",X"6D",X"4E",X"21",X"6E",X"4E",X"86", + X"27",X"D2",X"F6",X"02",X"3E",X"99",X"77",X"21",X"9C",X"4E",X"CB",X"CE",X"C9",X"21",X"CE",X"4D", + X"34",X"7E",X"E6",X"0F",X"20",X"1F",X"7E",X"0F",X"0F",X"0F",X"0F",X"47",X"3A",X"D6",X"4D",X"2F", + X"B0",X"4F",X"3A",X"6E",X"4E",X"D6",X"01",X"30",X"02",X"AF",X"4F",X"28",X"01",X"79",X"32",X"05", + X"50",X"79",X"32",X"04",X"50",X"DD",X"21",X"D8",X"43",X"FD",X"21",X"C5",X"43",X"3A",X"00",X"4E", + X"FE",X"03",X"CA",X"44",X"03",X"3A",X"03",X"4E",X"FE",X"02",X"D2",X"44",X"03",X"CD",X"69",X"03", + X"CD",X"76",X"03",X"C9",X"3A",X"09",X"4E",X"A7",X"3A",X"CE",X"4D",X"C2",X"59",X"03",X"CB",X"67", + X"CC",X"69",X"03",X"C4",X"83",X"03",X"C3",X"61",X"03",X"CB",X"67",X"CC",X"76",X"03",X"C4",X"90", + X"03",X"3A",X"70",X"4E",X"A7",X"CC",X"90",X"03",X"C9",X"DD",X"36",X"00",X"50",X"DD",X"36",X"01", + X"55",X"DD",X"36",X"02",X"31",X"C9",X"FD",X"36",X"00",X"50",X"FD",X"36",X"01",X"55",X"FD",X"36", + X"02",X"32",X"C9",X"DD",X"36",X"00",X"40",X"DD",X"36",X"01",X"40",X"DD",X"36",X"02",X"40",X"C9", + X"FD",X"36",X"00",X"40",X"FD",X"36",X"01",X"40",X"FD",X"36",X"02",X"40",X"C9",X"3A",X"06",X"4E", + X"D6",X"05",X"D8",X"2A",X"08",X"4D",X"06",X"08",X"0E",X"10",X"7D",X"32",X"06",X"4D",X"32",X"D2", + X"4D",X"91",X"32",X"02",X"4D",X"32",X"04",X"4D",X"7C",X"80",X"32",X"03",X"4D",X"32",X"07",X"4D", + X"91",X"32",X"05",X"4D",X"32",X"D3",X"4D",X"C9",X"3A",X"00",X"4E",X"E7",X"D4",X"03",X"FE",X"03", + X"E5",X"05",X"BE",X"06",X"3A",X"01",X"4E",X"E7",X"DC",X"03",X"0C",X"00",X"EF",X"00",X"00",X"EF", + X"06",X"00",X"EF",X"01",X"00",X"EF",X"14",X"00",X"EF",X"18",X"00",X"EF",X"04",X"00",X"EF",X"1E", + X"00",X"EF",X"07",X"00",X"21",X"01",X"4E",X"34",X"21",X"01",X"50",X"36",X"01",X"C9",X"CD",X"A1", + X"2B",X"3A",X"6E",X"4E",X"A7",X"28",X"0C",X"AF",X"32",X"04",X"4E",X"32",X"02",X"4E",X"21",X"00", + X"4E",X"34",X"C9",X"3A",X"02",X"4E",X"E7",X"5F",X"04",X"0C",X"00",X"71",X"04",X"0C",X"00",X"7F", + X"04",X"0C",X"00",X"85",X"04",X"0C",X"00",X"8B",X"04",X"0C",X"00",X"99",X"04",X"0C",X"00",X"9F", + X"04",X"0C",X"00",X"A5",X"04",X"0C",X"00",X"B3",X"04",X"0C",X"00",X"B9",X"04",X"0C",X"00",X"BF", + X"04",X"0C",X"00",X"CD",X"04",X"0C",X"00",X"D3",X"04",X"0C",X"00",X"D8",X"04",X"0C",X"00",X"E0", + X"04",X"0C",X"00",X"1C",X"05",X"4B",X"05",X"56",X"05",X"61",X"05",X"6C",X"05",X"7C",X"05",X"EF", + X"00",X"01",X"EF",X"01",X"00",X"EF",X"04",X"00",X"EF",X"1E",X"00",X"0E",X"0C",X"CD",X"85",X"05", + X"C9",X"21",X"04",X"43",X"3E",X"01",X"CD",X"BF",X"05",X"0E",X"0C",X"CD",X"85",X"05",X"C9",X"0E", + X"14",X"CD",X"93",X"05",X"C9",X"0E",X"0D",X"CD",X"93",X"05",X"C9",X"21",X"07",X"43",X"3E",X"03", + X"CD",X"BF",X"05",X"0E",X"0C",X"CD",X"85",X"05",X"C9",X"0E",X"16",X"CD",X"93",X"05",X"C9",X"0E", + X"0F",X"CD",X"93",X"05",X"C9",X"21",X"0A",X"43",X"3E",X"05",X"CD",X"BF",X"05",X"0E",X"0C",X"CD", + X"85",X"05",X"C9",X"0E",X"33",X"CD",X"93",X"05",X"C9",X"0E",X"2F",X"CD",X"93",X"05",X"C9",X"21", + X"0D",X"43",X"3E",X"07",X"CD",X"BF",X"05",X"0E",X"0C",X"CD",X"85",X"05",X"C9",X"0E",X"35",X"CD", + X"93",X"05",X"C9",X"0E",X"31",X"C3",X"80",X"05",X"EF",X"1C",X"11",X"0E",X"12",X"C3",X"85",X"05", + X"0E",X"13",X"CD",X"85",X"05",X"CD",X"79",X"08",X"35",X"EF",X"11",X"00",X"EF",X"05",X"01",X"EF", + X"10",X"14",X"EF",X"04",X"01",X"3E",X"01",X"32",X"14",X"4E",X"AF",X"32",X"70",X"4E",X"32",X"15", + X"4E",X"21",X"32",X"43",X"36",X"14",X"3E",X"FC",X"11",X"20",X"00",X"06",X"1C",X"DD",X"21",X"40", + X"40",X"DD",X"77",X"11",X"DD",X"77",X"13",X"DD",X"19",X"10",X"F6",X"C9",X"21",X"A0",X"4D",X"06", + X"21",X"3A",X"3A",X"4D",X"90",X"20",X"05",X"36",X"01",X"C3",X"8E",X"05",X"CD",X"17",X"10",X"CD", + X"17",X"10",X"CD",X"23",X"0E",X"CD",X"0D",X"0C",X"CD",X"D6",X"0B",X"CD",X"A5",X"05",X"CD",X"FE", + X"1E",X"CD",X"25",X"1F",X"CD",X"4C",X"1F",X"CD",X"73",X"1F",X"C9",X"21",X"A1",X"4D",X"06",X"20", + X"3A",X"32",X"4D",X"C3",X"24",X"05",X"21",X"A2",X"4D",X"06",X"22",X"3A",X"32",X"4D",X"C3",X"24", + X"05",X"21",X"A3",X"4D",X"06",X"24",X"3A",X"32",X"4D",X"C3",X"24",X"05",X"3A",X"D0",X"4D",X"47", + X"3A",X"D1",X"4D",X"80",X"FE",X"06",X"CA",X"8E",X"05",X"C3",X"2C",X"05",X"CD",X"BE",X"06",X"C9", + X"3A",X"75",X"4E",X"81",X"4F",X"06",X"1C",X"CD",X"42",X"00",X"F7",X"4A",X"02",X"00",X"21",X"02", + X"4E",X"34",X"C9",X"3A",X"75",X"4E",X"81",X"4F",X"06",X"1C",X"CD",X"42",X"00",X"F7",X"45",X"02", + X"00",X"CD",X"8E",X"05",X"C9",X"3A",X"B5",X"4D",X"A7",X"C8",X"AF",X"32",X"B5",X"4D",X"3A",X"30", + X"4D",X"EE",X"02",X"32",X"3C",X"4D",X"47",X"21",X"FF",X"32",X"DF",X"22",X"26",X"4D",X"C9",X"36", + X"B1",X"2C",X"36",X"B3",X"2C",X"36",X"B5",X"01",X"1E",X"00",X"09",X"36",X"B0",X"2C",X"36",X"B2", + X"2C",X"36",X"B4",X"11",X"00",X"04",X"19",X"77",X"2D",X"77",X"2D",X"77",X"A7",X"ED",X"42",X"77", + X"2D",X"77",X"2D",X"77",X"C9",X"3A",X"03",X"4E",X"E7",X"F3",X"05",X"1B",X"06",X"74",X"06",X"0C", + X"00",X"A8",X"06",X"CD",X"A1",X"2B",X"EF",X"00",X"01",X"EF",X"01",X"00",X"EF",X"1C",X"07",X"EF", + X"1C",X"0B",X"EF",X"1E",X"00",X"21",X"03",X"4E",X"34",X"3E",X"01",X"32",X"D6",X"4D",X"3A",X"71", + X"4E",X"FE",X"FF",X"C8",X"EF",X"1C",X"0A",X"EF",X"1F",X"00",X"C9",X"CD",X"A1",X"2B",X"3A",X"6E", + X"4E",X"FE",X"01",X"06",X"09",X"20",X"02",X"06",X"08",X"CD",X"5E",X"2C",X"3A",X"6E",X"4E",X"FE", + X"01",X"3A",X"40",X"50",X"28",X"0C",X"CB",X"77",X"20",X"08",X"3E",X"01",X"32",X"70",X"4E",X"C3", + X"49",X"06",X"CB",X"6F",X"C0",X"AF",X"32",X"70",X"4E",X"3A",X"6B",X"4E",X"A7",X"28",X"15",X"3A", + X"70",X"4E",X"A7",X"3A",X"6E",X"4E",X"28",X"03",X"C6",X"99",X"27",X"C6",X"99",X"27",X"32",X"6E", + X"4E",X"CD",X"A1",X"2B",X"21",X"03",X"4E",X"34",X"AF",X"32",X"D6",X"4D",X"3C",X"32",X"CC",X"4E", + X"32",X"DC",X"4E",X"C9",X"EF",X"00",X"01",X"EF",X"01",X"01",X"EF",X"02",X"00",X"EF",X"12",X"00", + X"EF",X"03",X"00",X"EF",X"1C",X"03",X"EF",X"1C",X"06",X"EF",X"18",X"00",X"EF",X"1B",X"00",X"AF", + X"32",X"13",X"4E",X"3A",X"6F",X"4E",X"32",X"14",X"4E",X"32",X"15",X"4E",X"EF",X"1A",X"00",X"F7", + X"57",X"01",X"00",X"21",X"03",X"4E",X"34",X"C9",X"21",X"15",X"4E",X"35",X"CD",X"6A",X"2B",X"AF", + X"32",X"03",X"4E",X"32",X"02",X"4E",X"32",X"04",X"4E",X"21",X"00",X"4E",X"34",X"C9",X"3A",X"04", + X"4E",X"E7",X"79",X"08",X"99",X"08",X"0C",X"00",X"CD",X"08",X"0D",X"09",X"0C",X"00",X"40",X"09", + X"0C",X"00",X"72",X"09",X"88",X"09",X"0C",X"00",X"D2",X"09",X"D8",X"09",X"0C",X"00",X"E8",X"09", + X"0C",X"00",X"FE",X"09",X"0C",X"00",X"02",X"0A",X"0C",X"00",X"04",X"0A",X"0C",X"00",X"06",X"0A", + X"0C",X"00",X"08",X"0A",X"0C",X"00",X"0A",X"0A",X"0C",X"00",X"0C",X"0A",X"0C",X"00",X"0E",X"0A", + X"0C",X"00",X"2C",X"0A",X"0C",X"00",X"7C",X"0A",X"A0",X"0A",X"0C",X"00",X"A3",X"0A",X"78",X"A7", + X"20",X"04",X"2A",X"0A",X"4E",X"7E",X"DD",X"21",X"96",X"07",X"47",X"87",X"87",X"80",X"80",X"5F", + X"16",X"00",X"DD",X"19",X"DD",X"7E",X"00",X"87",X"47",X"87",X"87",X"4F",X"87",X"87",X"81",X"80", + X"5F",X"16",X"00",X"21",X"0F",X"33",X"19",X"CD",X"14",X"08",X"DD",X"7E",X"01",X"32",X"B0",X"4D", + X"DD",X"7E",X"02",X"47",X"87",X"80",X"5F",X"16",X"00",X"21",X"43",X"08",X"19",X"CD",X"3A",X"08", + X"DD",X"7E",X"03",X"87",X"5F",X"16",X"00",X"FD",X"21",X"4F",X"08",X"FD",X"19",X"FD",X"6E",X"00", + X"FD",X"66",X"01",X"22",X"BB",X"4D",X"DD",X"7E",X"04",X"87",X"5F",X"16",X"00",X"FD",X"21",X"61", + X"08",X"FD",X"19",X"FD",X"6E",X"00",X"FD",X"66",X"01",X"22",X"BD",X"4D",X"DD",X"7E",X"05",X"87", + X"5F",X"16",X"00",X"FD",X"21",X"73",X"08",X"FD",X"19",X"FD",X"6E",X"00",X"FD",X"66",X"01",X"22", + X"95",X"4D",X"CD",X"EA",X"2B",X"C9",X"03",X"01",X"01",X"00",X"02",X"00",X"04",X"01",X"02",X"01", + X"03",X"00",X"04",X"01",X"03",X"02",X"04",X"01",X"04",X"02",X"03",X"02",X"05",X"01",X"05",X"00", + X"03",X"02",X"06",X"02",X"05",X"01",X"03",X"03",X"03",X"02",X"05",X"02",X"03",X"03",X"06",X"02", + X"05",X"02",X"03",X"03",X"06",X"02",X"05",X"00",X"03",X"04",X"07",X"02",X"05",X"01",X"03",X"04", + X"03",X"02",X"05",X"02",X"03",X"04",X"06",X"02",X"05",X"02",X"03",X"05",X"07",X"02",X"05",X"00", + X"03",X"05",X"07",X"02",X"05",X"02",X"03",X"05",X"05",X"02",X"05",X"01",X"03",X"06",X"07",X"02", + X"05",X"02",X"03",X"06",X"07",X"02",X"05",X"02",X"03",X"06",X"08",X"02",X"05",X"02",X"03",X"06", + X"07",X"02",X"05",X"02",X"03",X"07",X"08",X"02",X"05",X"02",X"03",X"07",X"08",X"02",X"06",X"02", + X"03",X"07",X"08",X"02",X"11",X"46",X"4D",X"01",X"1C",X"00",X"ED",X"B0",X"01",X"0C",X"00",X"A7", + X"ED",X"42",X"ED",X"B0",X"01",X"0C",X"00",X"A7",X"ED",X"42",X"ED",X"B0",X"01",X"0C",X"00",X"A7", + X"ED",X"42",X"ED",X"B0",X"01",X"0E",X"00",X"ED",X"B0",X"C9",X"11",X"B8",X"4D",X"01",X"03",X"00", + X"ED",X"B0",X"C9",X"14",X"1E",X"46",X"00",X"1E",X"3C",X"00",X"00",X"32",X"00",X"00",X"00",X"14", + X"0A",X"1E",X"0F",X"28",X"14",X"32",X"19",X"3C",X"1E",X"50",X"28",X"64",X"32",X"78",X"3C",X"8C", + X"46",X"C0",X"03",X"48",X"03",X"D0",X"02",X"58",X"02",X"E0",X"01",X"68",X"01",X"F0",X"00",X"78", + X"00",X"01",X"00",X"F0",X"00",X"F0",X"00",X"B4",X"00",X"21",X"09",X"4E",X"AF",X"06",X"0B",X"CF", + X"CD",X"C9",X"24",X"2A",X"73",X"4E",X"22",X"0A",X"4E",X"21",X"0A",X"4E",X"11",X"38",X"4E",X"01", + X"2E",X"00",X"ED",X"B0",X"21",X"04",X"4E",X"34",X"C9",X"3A",X"00",X"4E",X"3D",X"20",X"06",X"3E", + X"09",X"32",X"04",X"4E",X"C9",X"EF",X"11",X"00",X"EF",X"1C",X"83",X"EF",X"04",X"00",X"EF",X"05", + X"00",X"EF",X"10",X"00",X"EF",X"1A",X"00",X"F7",X"54",X"00",X"00",X"F7",X"54",X"06",X"00",X"3A", + X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"32",X"03",X"50",X"C3",X"94",X"08",X"3A",X"00",X"50", + X"CB",X"67",X"C2",X"DE",X"08",X"21",X"04",X"4E",X"36",X"0E",X"EF",X"13",X"00",X"C9",X"3A",X"0E", + X"4E",X"FE",X"F4",X"20",X"06",X"21",X"04",X"4E",X"36",X"0C",X"C9",X"CD",X"17",X"10",X"CD",X"17", + X"10",X"CD",X"DD",X"13",X"CD",X"42",X"0C",X"CD",X"23",X"0E",X"CD",X"36",X"0E",X"CD",X"C3",X"0A", + X"CD",X"D6",X"0B",X"CD",X"0D",X"0C",X"CD",X"6C",X"0E",X"CD",X"AD",X"0E",X"C9",X"3E",X"01",X"32", + X"12",X"4E",X"CD",X"87",X"24",X"21",X"04",X"4E",X"34",X"3A",X"14",X"4E",X"A7",X"20",X"1F",X"3A", + X"70",X"4E",X"A7",X"28",X"19",X"3A",X"42",X"4E",X"A7",X"28",X"13",X"3A",X"09",X"4E",X"C6",X"03", + X"4F",X"06",X"1C",X"CD",X"42",X"00",X"EF",X"1C",X"05",X"F7",X"54",X"00",X"00",X"C9",X"34",X"C9", + X"3A",X"70",X"4E",X"A7",X"28",X"06",X"3A",X"42",X"4E",X"A7",X"20",X"15",X"3A",X"14",X"4E",X"A7", + X"20",X"1A",X"CD",X"A1",X"2B",X"EF",X"1C",X"05",X"F7",X"54",X"00",X"00",X"21",X"04",X"4E",X"34", + X"C9",X"CD",X"A6",X"0A",X"3A",X"09",X"4E",X"EE",X"01",X"32",X"09",X"4E",X"3E",X"09",X"32",X"04", + X"4E",X"C9",X"AF",X"32",X"02",X"4E",X"32",X"04",X"4E",X"32",X"70",X"4E",X"32",X"09",X"4E",X"32", + X"03",X"50",X"3E",X"01",X"32",X"00",X"4E",X"C9",X"EF",X"00",X"01",X"EF",X"01",X"01",X"EF",X"02", + X"00",X"EF",X"11",X"00",X"EF",X"13",X"00",X"EF",X"03",X"00",X"EF",X"04",X"00",X"EF",X"05",X"00", + X"EF",X"10",X"00",X"EF",X"1A",X"00",X"EF",X"1C",X"06",X"3A",X"00",X"4E",X"FE",X"03",X"28",X"06", + X"EF",X"1C",X"05",X"EF",X"1D",X"00",X"F7",X"54",X"00",X"00",X"3A",X"00",X"4E",X"3D",X"28",X"04", + X"F7",X"54",X"06",X"00",X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"32",X"03",X"50",X"C3", + X"94",X"08",X"3E",X"03",X"32",X"04",X"4E",X"C9",X"F7",X"54",X"00",X"00",X"21",X"04",X"4E",X"34", + X"AF",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"C9",X"0E",X"02",X"06",X"01",X"CD",X"42",X"00",X"F7", + X"42",X"00",X"00",X"21",X"00",X"00",X"CD",X"7E",X"26",X"21",X"04",X"4E",X"34",X"C9",X"0E",X"00", + X"18",X"E8",X"18",X"E4",X"18",X"F8",X"18",X"E0",X"18",X"F4",X"18",X"DC",X"18",X"F0",X"EF",X"00", + X"01",X"EF",X"06",X"00",X"EF",X"11",X"00",X"EF",X"13",X"00",X"EF",X"04",X"01",X"EF",X"05",X"01", + X"EF",X"10",X"13",X"F7",X"43",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"AF",X"32",X"AC",X"4E", + X"32",X"BC",X"4E",X"3E",X"02",X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"3A",X"13",X"4E",X"FE",X"14", + X"38",X"02",X"3E",X"14",X"E7",X"6F",X"0A",X"08",X"21",X"6F",X"0A",X"6F",X"0A",X"9E",X"21",X"6F", + X"0A",X"6F",X"0A",X"6F",X"0A",X"97",X"22",X"6F",X"0A",X"6F",X"0A",X"6F",X"0A",X"97",X"22",X"6F", + X"0A",X"6F",X"0A",X"6F",X"0A",X"97",X"22",X"6F",X"0A",X"6F",X"0A",X"6F",X"0A",X"6F",X"0A",X"21", + X"04",X"4E",X"34",X"34",X"AF",X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"C9",X"AF",X"32",X"CC",X"4E", + X"32",X"DC",X"4E",X"06",X"07",X"21",X"0C",X"4E",X"CF",X"CD",X"C9",X"24",X"21",X"04",X"4E",X"34", + X"21",X"13",X"4E",X"34",X"2A",X"0A",X"4E",X"7E",X"FE",X"14",X"C8",X"23",X"22",X"0A",X"4E",X"C9", + X"C3",X"88",X"09",X"C3",X"D2",X"09",X"06",X"2E",X"DD",X"21",X"0A",X"4E",X"FD",X"21",X"38",X"4E", + X"DD",X"56",X"00",X"FD",X"5E",X"00",X"FD",X"72",X"00",X"DD",X"73",X"00",X"DD",X"23",X"FD",X"23", + X"10",X"EE",X"C9",X"3A",X"A4",X"4D",X"A7",X"C0",X"DD",X"21",X"00",X"4C",X"FD",X"21",X"C8",X"4D", + X"11",X"00",X"01",X"FD",X"BE",X"00",X"C2",X"D2",X"0B",X"FD",X"36",X"00",X"0E",X"3A",X"A6",X"4D", + X"A7",X"28",X"1B",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"13",X"21",X"AC",X"4E",X"CB",X"FE", + X"3E",X"09",X"DD",X"BE",X"0B",X"20",X"04",X"CB",X"BE",X"3E",X"09",X"32",X"0B",X"4C",X"3A",X"A7", + X"4D",X"A7",X"28",X"1D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"27",X"3E",X"11",X"DD",X"BE", + X"03",X"28",X"07",X"DD",X"36",X"03",X"11",X"C3",X"33",X"0B",X"DD",X"36",X"03",X"12",X"C3",X"33", + X"0B",X"3E",X"01",X"DD",X"BE",X"03",X"28",X"07",X"DD",X"36",X"03",X"01",X"C3",X"33",X"0B",X"DD", + X"36",X"03",X"01",X"3A",X"A8",X"4D",X"A7",X"28",X"1D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30", + X"27",X"3E",X"11",X"DD",X"BE",X"05",X"28",X"07",X"DD",X"36",X"05",X"11",X"C3",X"68",X"0B",X"DD", + X"36",X"05",X"12",X"C3",X"68",X"0B",X"3E",X"03",X"DD",X"BE",X"05",X"28",X"07",X"DD",X"36",X"05", + X"03",X"C3",X"68",X"0B",X"DD",X"36",X"05",X"03",X"3A",X"A9",X"4D",X"A7",X"28",X"1D",X"2A",X"CB", + X"4D",X"A7",X"ED",X"52",X"30",X"27",X"3E",X"11",X"DD",X"BE",X"07",X"28",X"07",X"DD",X"36",X"07", + X"11",X"C3",X"9D",X"0B",X"DD",X"36",X"07",X"12",X"C3",X"9D",X"0B",X"3E",X"05",X"DD",X"BE",X"07", + X"28",X"07",X"DD",X"36",X"07",X"05",X"C3",X"9D",X"0B",X"DD",X"36",X"07",X"05",X"3A",X"AA",X"4D", + X"A7",X"28",X"1D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"27",X"3E",X"11",X"DD",X"BE",X"09", + X"28",X"07",X"DD",X"36",X"09",X"11",X"C3",X"D2",X"0B",X"DD",X"36",X"09",X"12",X"C3",X"D2",X"0B", + X"3E",X"07",X"DD",X"BE",X"09",X"28",X"07",X"DD",X"36",X"09",X"07",X"C3",X"D2",X"0B",X"DD",X"36", + X"09",X"07",X"FD",X"35",X"00",X"C9",X"06",X"19",X"3A",X"02",X"4E",X"FE",X"22",X"C2",X"E2",X"0B", + X"06",X"00",X"DD",X"21",X"00",X"4C",X"3A",X"AC",X"4D",X"A7",X"CA",X"F0",X"0B",X"DD",X"70",X"03", + X"3A",X"AD",X"4D",X"A7",X"CA",X"FA",X"0B",X"DD",X"70",X"05",X"3A",X"AE",X"4D",X"A7",X"CA",X"04", + X"0C",X"DD",X"70",X"07",X"3A",X"AF",X"4D",X"A7",X"C8",X"DD",X"70",X"09",X"C9",X"21",X"CF",X"4D", + X"34",X"3E",X"0A",X"BE",X"C0",X"36",X"00",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"15",X"21",X"64", + X"44",X"3E",X"10",X"BE",X"20",X"02",X"3E",X"00",X"77",X"32",X"78",X"44",X"32",X"84",X"47",X"32", + X"98",X"47",X"C9",X"21",X"32",X"47",X"3E",X"10",X"BE",X"20",X"02",X"3E",X"00",X"77",X"32",X"78", + X"46",X"C9",X"3A",X"A4",X"4D",X"A7",X"C0",X"3A",X"94",X"4D",X"07",X"32",X"94",X"4D",X"D0",X"3A", + X"A0",X"4D",X"A7",X"C2",X"90",X"0C",X"DD",X"21",X"05",X"33",X"FD",X"21",X"00",X"4D",X"CD",X"00", + X"20",X"22",X"00",X"4D",X"3E",X"03",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3A",X"00",X"4D",X"FE", + X"64",X"C2",X"90",X"0C",X"21",X"2C",X"2E",X"22",X"0A",X"4D",X"21",X"00",X"01",X"22",X"14",X"4D", + X"22",X"1E",X"4D",X"3E",X"02",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3E",X"01",X"32",X"A0",X"4D", + X"3A",X"A1",X"4D",X"FE",X"01",X"CA",X"FB",X"0C",X"FE",X"00",X"C2",X"C1",X"0C",X"3A",X"02",X"4D", + X"FE",X"78",X"CC",X"2E",X"1F",X"FE",X"80",X"CC",X"2E",X"1F",X"3A",X"2D",X"4D",X"32",X"29",X"4D", + X"DD",X"21",X"20",X"4D",X"FD",X"21",X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"C3",X"FB", + X"0C",X"DD",X"21",X"05",X"33",X"FD",X"21",X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"3E", + X"03",X"32",X"2D",X"4D",X"32",X"29",X"4D",X"3A",X"02",X"4D",X"FE",X"64",X"C2",X"FB",X"0C",X"21", + X"2C",X"2E",X"22",X"0C",X"4D",X"21",X"00",X"01",X"22",X"16",X"4D",X"22",X"20",X"4D",X"3E",X"02", + X"32",X"29",X"4D",X"32",X"2D",X"4D",X"3E",X"01",X"32",X"A1",X"4D",X"3A",X"A2",X"4D",X"FE",X"01", + X"CA",X"93",X"0D",X"FE",X"00",X"C2",X"2C",X"0D",X"3A",X"04",X"4D",X"FE",X"78",X"CC",X"55",X"1F", + X"FE",X"80",X"CC",X"55",X"1F",X"3A",X"2E",X"4D",X"32",X"2A",X"4D",X"DD",X"21",X"22",X"4D",X"FD", + X"21",X"04",X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"C3",X"93",X"0D",X"3A",X"A2",X"4D",X"FE", + X"03",X"C2",X"59",X"0D",X"DD",X"21",X"FF",X"32",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22", + X"04",X"4D",X"AF",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3A",X"05",X"4D",X"FE",X"80",X"C2",X"93", + X"0D",X"3E",X"02",X"32",X"A2",X"4D",X"C3",X"93",X"0D",X"DD",X"21",X"05",X"33",X"FD",X"21",X"04", + X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"3E",X"03",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3A", + X"04",X"4D",X"FE",X"64",X"C2",X"93",X"0D",X"21",X"2C",X"2E",X"22",X"0E",X"4D",X"21",X"00",X"01", + X"22",X"18",X"4D",X"22",X"22",X"4D",X"3E",X"02",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3E",X"01", + X"32",X"A2",X"4D",X"3A",X"A3",X"4D",X"FE",X"01",X"C8",X"FE",X"00",X"C2",X"C0",X"0D",X"3A",X"06", + X"4D",X"FE",X"78",X"CC",X"7C",X"1F",X"FE",X"80",X"CC",X"7C",X"1F",X"3A",X"2F",X"4D",X"32",X"2B", + X"4D",X"DD",X"21",X"24",X"4D",X"FD",X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"C9", + X"3A",X"A3",X"4D",X"FE",X"03",X"C2",X"EA",X"0D",X"DD",X"21",X"03",X"33",X"FD",X"21",X"06",X"4D", + X"CD",X"00",X"20",X"22",X"06",X"4D",X"3E",X"02",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3A",X"07", + X"4D",X"FE",X"80",X"C0",X"3E",X"02",X"32",X"A3",X"4D",X"C9",X"DD",X"21",X"05",X"33",X"FD",X"21", + X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"3E",X"03",X"32",X"2B",X"4D",X"32",X"2F",X"4D", + X"3A",X"06",X"4D",X"FE",X"64",X"C0",X"21",X"2C",X"2E",X"22",X"10",X"4D",X"21",X"00",X"01",X"22", + X"1A",X"4D",X"22",X"24",X"4D",X"3E",X"02",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3E",X"01",X"32", + X"A3",X"4D",X"C9",X"21",X"C4",X"4D",X"34",X"3E",X"08",X"BE",X"C0",X"36",X"00",X"3A",X"C0",X"4D", + X"EE",X"01",X"32",X"C0",X"4D",X"C9",X"3A",X"A6",X"4D",X"A7",X"C0",X"3A",X"C1",X"4D",X"FE",X"07", + X"C8",X"87",X"2A",X"C2",X"4D",X"23",X"22",X"C2",X"4D",X"5F",X"16",X"00",X"DD",X"21",X"86",X"4D", + X"DD",X"19",X"DD",X"5E",X"00",X"DD",X"56",X"01",X"A7",X"ED",X"52",X"C0",X"CB",X"3F",X"3C",X"32", + X"C1",X"4D",X"21",X"01",X"01",X"22",X"B1",X"4D",X"22",X"B3",X"4D",X"C9",X"3A",X"A5",X"4D",X"A7", + X"28",X"05",X"AF",X"32",X"AC",X"4E",X"C9",X"21",X"AC",X"4E",X"06",X"E0",X"3A",X"0E",X"4E",X"FE", + X"E4",X"38",X"06",X"78",X"A6",X"CB",X"E7",X"77",X"C9",X"FE",X"D4",X"38",X"06",X"78",X"A6",X"CB", + X"DF",X"77",X"C9",X"FE",X"B4",X"38",X"06",X"78",X"A6",X"CB",X"D7",X"77",X"C9",X"FE",X"74",X"38", + X"06",X"78",X"A6",X"CB",X"CF",X"77",X"C9",X"78",X"A6",X"CB",X"C7",X"77",X"C9",X"3A",X"A5",X"4D", + X"A7",X"C0",X"3A",X"D4",X"4D",X"A7",X"C0",X"3A",X"0E",X"4E",X"FE",X"46",X"28",X"0E",X"FE",X"AA", + X"C0",X"3A",X"0D",X"4E",X"A7",X"C0",X"21",X"0D",X"4E",X"34",X"18",X"09",X"3A",X"0C",X"4E",X"A7", + X"C0",X"21",X"0C",X"4E",X"34",X"21",X"94",X"80",X"22",X"D2",X"4D",X"21",X"FD",X"0E",X"3A",X"13", + X"4E",X"FE",X"14",X"38",X"02",X"3E",X"14",X"47",X"87",X"80",X"D7",X"32",X"0C",X"4C",X"23",X"7E", + X"32",X"0D",X"4C",X"23",X"7E",X"32",X"D4",X"4D",X"F7",X"8A",X"04",X"00",X"C9",X"00",X"14",X"06", + X"01",X"0F",X"07",X"02",X"15",X"08",X"02",X"15",X"08",X"04",X"14",X"09",X"04",X"14",X"09",X"05", + X"17",X"0A",X"05",X"17",X"0A",X"06",X"09",X"0B",X"06",X"09",X"0B",X"03",X"16",X"0C",X"03",X"16", + X"0C",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D", + X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"48",X"36", + X"AF",X"32",X"D4",X"4D",X"21",X"00",X"00",X"22",X"D2",X"4D",X"C9",X"EF",X"1C",X"9B",X"3A",X"00", + X"4E",X"3D",X"C8",X"EF",X"1C",X"A2",X"C9",X"CD",X"91",X"12",X"3A",X"A5",X"4D",X"A7",X"C0",X"CD", + X"66",X"10",X"CD",X"94",X"10",X"CD",X"9E",X"10",X"CD",X"A8",X"10",X"CD",X"B4",X"10",X"3A",X"A4", + X"4D",X"A7",X"CA",X"39",X"10",X"CD",X"35",X"12",X"C9",X"CD",X"1D",X"17",X"CD",X"89",X"17",X"3A", + X"A4",X"4D",X"A7",X"C0",X"CD",X"06",X"18",X"CD",X"36",X"1B",X"CD",X"4B",X"1C",X"CD",X"22",X"1D", + X"CD",X"F9",X"1D",X"3A",X"04",X"4E",X"FE",X"03",X"C0",X"CD",X"76",X"13",X"CD",X"69",X"20",X"CD", + X"8C",X"20",X"CD",X"AF",X"20",X"C9",X"3A",X"AB",X"4D",X"A7",X"C8",X"3D",X"20",X"08",X"32",X"AB", + X"4D",X"3C",X"32",X"AC",X"4D",X"C9",X"3D",X"20",X"08",X"32",X"AB",X"4D",X"3C",X"32",X"AD",X"4D", + X"C9",X"3D",X"20",X"08",X"32",X"AB",X"4D",X"3C",X"32",X"AE",X"4D",X"C9",X"32",X"AF",X"4D",X"3D", + X"32",X"AB",X"4D",X"C9",X"3A",X"AC",X"4D",X"E7",X"0C",X"00",X"C0",X"10",X"D2",X"10",X"3A",X"AD", + X"4D",X"E7",X"0C",X"00",X"18",X"11",X"2A",X"11",X"3A",X"AE",X"4D",X"E7",X"0C",X"00",X"5C",X"11", + X"6E",X"11",X"8F",X"11",X"3A",X"AF",X"4D",X"E7",X"0C",X"00",X"C9",X"11",X"DB",X"11",X"FC",X"11", + X"CD",X"D8",X"1B",X"2A",X"00",X"4D",X"11",X"64",X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AC",X"4D", + X"34",X"C9",X"DD",X"21",X"01",X"33",X"FD",X"21",X"00",X"4D",X"CD",X"00",X"20",X"22",X"00",X"4D", + X"3E",X"01",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3A",X"00",X"4D",X"FE",X"80",X"C0",X"21",X"2F", + X"2E",X"22",X"0A",X"4D",X"22",X"31",X"4D",X"AF",X"32",X"A0",X"4D",X"32",X"AC",X"4D",X"32",X"A7", + X"4D",X"DD",X"21",X"AC",X"4D",X"DD",X"B6",X"00",X"DD",X"B6",X"01",X"DD",X"B6",X"02",X"DD",X"B6", + X"03",X"C0",X"21",X"AC",X"4E",X"CB",X"B6",X"C9",X"CD",X"AF",X"1C",X"2A",X"02",X"4D",X"11",X"64", + X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AD",X"4D",X"34",X"C9",X"DD",X"21",X"01",X"33",X"FD",X"21", + X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"3E",X"01",X"32",X"29",X"4D",X"32",X"2D",X"4D", + X"3A",X"02",X"4D",X"FE",X"80",X"C0",X"21",X"2F",X"2E",X"22",X"0C",X"4D",X"22",X"33",X"4D",X"AF", + X"32",X"A1",X"4D",X"32",X"AD",X"4D",X"32",X"A8",X"4D",X"C3",X"01",X"11",X"CD",X"86",X"1D",X"2A", + X"04",X"4D",X"11",X"64",X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AE",X"4D",X"34",X"C9",X"DD",X"21", + X"01",X"33",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"3E",X"01",X"32",X"2A", + X"4D",X"32",X"2E",X"4D",X"3A",X"04",X"4D",X"FE",X"80",X"C0",X"21",X"AE",X"4D",X"34",X"C9",X"DD", + X"21",X"03",X"33",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"3E",X"02",X"32", + X"2A",X"4D",X"32",X"2E",X"4D",X"3A",X"05",X"4D",X"FE",X"90",X"C0",X"21",X"2F",X"30",X"22",X"0E", + X"4D",X"22",X"35",X"4D",X"3E",X"01",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"AF",X"32",X"A2",X"4D", + X"32",X"AE",X"4D",X"32",X"A9",X"4D",X"C3",X"01",X"11",X"CD",X"5D",X"1E",X"2A",X"06",X"4D",X"11", + X"64",X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AF",X"4D",X"34",X"C9",X"DD",X"21",X"01",X"33",X"FD", + X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"3E",X"01",X"32",X"2B",X"4D",X"32",X"2F", + X"4D",X"3A",X"06",X"4D",X"FE",X"80",X"C0",X"21",X"AF",X"4D",X"34",X"C9",X"DD",X"21",X"FF",X"32", + X"FD",X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"AF",X"32",X"2B",X"4D",X"32",X"2F", + X"4D",X"3A",X"07",X"4D",X"FE",X"70",X"C0",X"21",X"2F",X"2C",X"22",X"10",X"4D",X"22",X"37",X"4D", + X"3E",X"01",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"AF",X"32",X"A3",X"4D",X"32",X"AF",X"4D",X"32", + X"AA",X"4D",X"C3",X"01",X"11",X"3A",X"D1",X"4D",X"E7",X"3F",X"12",X"0C",X"00",X"3F",X"12",X"21", + X"00",X"4C",X"3A",X"A4",X"4D",X"87",X"5F",X"16",X"00",X"19",X"3A",X"D1",X"4D",X"A7",X"20",X"27", + X"3A",X"D0",X"4D",X"06",X"27",X"80",X"47",X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E",X"A1",X"28", + X"04",X"CB",X"F0",X"CB",X"F8",X"70",X"23",X"36",X"18",X"3E",X"00",X"32",X"0B",X"4C",X"F7",X"4A", + X"03",X"00",X"21",X"D1",X"4D",X"34",X"C9",X"36",X"20",X"3E",X"09",X"32",X"0B",X"4C",X"3A",X"A4", + X"4D",X"32",X"AB",X"4D",X"AF",X"32",X"A4",X"4D",X"32",X"D1",X"4D",X"21",X"AC",X"4E",X"CB",X"F6", + X"C9",X"3A",X"A5",X"4D",X"E7",X"0C",X"00",X"B7",X"12",X"B7",X"12",X"B7",X"12",X"B7",X"12",X"CB", + X"12",X"F9",X"12",X"06",X"13",X"0E",X"13",X"16",X"13",X"1E",X"13",X"26",X"13",X"2E",X"13",X"36", + X"13",X"3E",X"13",X"46",X"13",X"53",X"13",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D",X"11",X"78", + X"00",X"A7",X"ED",X"52",X"C0",X"3E",X"05",X"32",X"A5",X"4D",X"C9",X"21",X"00",X"00",X"CD",X"7E", + X"26",X"3E",X"34",X"11",X"B4",X"00",X"4F",X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"28", + X"04",X"3E",X"C0",X"B1",X"4F",X"79",X"32",X"0A",X"4C",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D", + X"A7",X"ED",X"52",X"C0",X"21",X"A5",X"4D",X"34",X"C9",X"21",X"BC",X"4E",X"CB",X"E6",X"3E",X"35", + X"11",X"C3",X"00",X"C3",X"D6",X"12",X"3E",X"36",X"11",X"D2",X"00",X"C3",X"D6",X"12",X"3E",X"37", + X"11",X"E1",X"00",X"C3",X"D6",X"12",X"3E",X"38",X"11",X"F0",X"00",X"C3",X"D6",X"12",X"3E",X"39", + X"11",X"FF",X"00",X"C3",X"D6",X"12",X"3E",X"3A",X"11",X"0E",X"01",X"C3",X"D6",X"12",X"3E",X"3B", + X"11",X"1D",X"01",X"C3",X"D6",X"12",X"3E",X"3C",X"11",X"2C",X"01",X"C3",X"D6",X"12",X"3E",X"3D", + X"11",X"3B",X"01",X"C3",X"D6",X"12",X"21",X"BC",X"4E",X"36",X"20",X"3E",X"3E",X"11",X"59",X"01", + X"C3",X"D6",X"12",X"3E",X"3F",X"32",X"0A",X"4C",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D",X"11", + X"B8",X"01",X"A7",X"ED",X"52",X"C0",X"21",X"14",X"4E",X"35",X"21",X"15",X"4E",X"35",X"CD",X"75", + X"26",X"21",X"04",X"4E",X"34",X"C9",X"3A",X"A6",X"4D",X"A7",X"C8",X"DD",X"21",X"A7",X"4D",X"DD", + X"7E",X"00",X"DD",X"B6",X"01",X"DD",X"B6",X"02",X"DD",X"B6",X"03",X"CA",X"98",X"13",X"2A",X"CB", + X"4D",X"2B",X"22",X"CB",X"4D",X"7C",X"B5",X"C0",X"21",X"0B",X"4C",X"36",X"09",X"3A",X"AC",X"4D", + X"A7",X"C2",X"A7",X"13",X"32",X"A7",X"4D",X"3A",X"AD",X"4D",X"A7",X"C2",X"B1",X"13",X"32",X"A8", + X"4D",X"3A",X"AE",X"4D",X"A7",X"C2",X"BB",X"13",X"32",X"A9",X"4D",X"3A",X"AF",X"4D",X"A7",X"C2", + X"C5",X"13",X"32",X"AA",X"4D",X"AF",X"32",X"CB",X"4D",X"32",X"CC",X"4D",X"32",X"A6",X"4D",X"32", + X"C8",X"4D",X"32",X"D0",X"4D",X"21",X"AC",X"4E",X"CB",X"AE",X"CB",X"BE",X"C9",X"21",X"9E",X"4D", + X"3A",X"0E",X"4E",X"BE",X"CA",X"EE",X"13",X"21",X"00",X"00",X"22",X"97",X"4D",X"C9",X"2A",X"97", + X"4D",X"23",X"22",X"97",X"4D",X"ED",X"5B",X"95",X"4D",X"A7",X"ED",X"52",X"C0",X"21",X"00",X"00", + X"22",X"97",X"4D",X"3A",X"A1",X"4D",X"A7",X"F5",X"CC",X"86",X"20",X"F1",X"C8",X"3A",X"A2",X"4D", + X"A7",X"F5",X"CC",X"A9",X"20",X"F1",X"C8",X"3A",X"A3",X"4D",X"A7",X"CC",X"D1",X"20",X"C9",X"3A", + X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"C8",X"47",X"DD",X"21",X"00",X"4C",X"1E",X"08",X"0E", + X"08",X"16",X"07",X"3A",X"00",X"4D",X"83",X"DD",X"77",X"13",X"3A",X"01",X"4D",X"2F",X"82",X"DD", + X"77",X"12",X"3A",X"02",X"4D",X"83",X"DD",X"77",X"15",X"3A",X"03",X"4D",X"2F",X"82",X"DD",X"77", + X"14",X"3A",X"04",X"4D",X"83",X"DD",X"77",X"17",X"3A",X"05",X"4D",X"2F",X"81",X"DD",X"77",X"16", + X"3A",X"06",X"4D",X"83",X"DD",X"77",X"19",X"3A",X"07",X"4D",X"2F",X"81",X"DD",X"77",X"18",X"3A", + X"08",X"4D",X"83",X"DD",X"77",X"1B",X"3A",X"09",X"4D",X"2F",X"81",X"DD",X"77",X"1A",X"3A",X"D2", + X"4D",X"83",X"DD",X"77",X"1D",X"3A",X"D3",X"4D",X"2F",X"81",X"DD",X"77",X"1C",X"C3",X"FE",X"14", + X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"C0",X"47",X"1E",X"09",X"0E",X"07",X"16",X"06", + X"DD",X"21",X"00",X"4C",X"3A",X"00",X"4D",X"2F",X"83",X"DD",X"77",X"13",X"3A",X"01",X"4D",X"82", + X"DD",X"77",X"12",X"3A",X"02",X"4D",X"2F",X"83",X"DD",X"77",X"15",X"3A",X"03",X"4D",X"82",X"DD", + X"77",X"14",X"3A",X"04",X"4D",X"2F",X"83",X"DD",X"77",X"17",X"3A",X"05",X"4D",X"81",X"DD",X"77", + X"16",X"3A",X"06",X"4D",X"2F",X"83",X"DD",X"77",X"19",X"3A",X"07",X"4D",X"81",X"DD",X"77",X"18", + X"3A",X"08",X"4D",X"2F",X"83",X"DD",X"77",X"1B",X"3A",X"09",X"4D",X"81",X"DD",X"77",X"1A",X"3A", + X"D2",X"4D",X"2F",X"83",X"DD",X"77",X"1D",X"3A",X"D3",X"4D",X"81",X"DD",X"77",X"1C",X"3A",X"A5", + X"4D",X"A7",X"C2",X"4B",X"15",X"3A",X"A4",X"4D",X"A7",X"C2",X"B4",X"15",X"21",X"1C",X"15",X"E5", + X"3A",X"30",X"4D",X"E7",X"8C",X"16",X"B1",X"16",X"D6",X"16",X"F7",X"16",X"78",X"A7",X"28",X"2B", + X"0E",X"C0",X"3A",X"0A",X"4C",X"57",X"A1",X"20",X"05",X"7A",X"B1",X"C3",X"48",X"15",X"3A",X"30", + X"4D",X"FE",X"02",X"20",X"09",X"CB",X"7A",X"28",X"12",X"7A",X"A9",X"C3",X"48",X"15",X"FE",X"03", + X"20",X"09",X"CB",X"72",X"28",X"05",X"7A",X"A9",X"32",X"0A",X"4C",X"21",X"C0",X"4D",X"56",X"3E", + X"1C",X"82",X"DD",X"77",X"02",X"DD",X"77",X"04",X"DD",X"77",X"06",X"DD",X"77",X"08",X"0E",X"20", + X"3A",X"AC",X"4D",X"A7",X"20",X"06",X"3A",X"A7",X"4D",X"A7",X"20",X"09",X"3A",X"2C",X"4D",X"87", + X"82",X"81",X"DD",X"77",X"02",X"3A",X"AD",X"4D",X"A7",X"20",X"06",X"3A",X"A8",X"4D",X"A7",X"20", + X"09",X"3A",X"2D",X"4D",X"87",X"82",X"81",X"DD",X"77",X"04",X"3A",X"AE",X"4D",X"A7",X"20",X"06", + X"3A",X"A9",X"4D",X"A7",X"20",X"09",X"3A",X"2E",X"4D",X"87",X"82",X"81",X"DD",X"77",X"06",X"3A", + X"AF",X"4D",X"A7",X"20",X"06",X"3A",X"AA",X"4D",X"A7",X"20",X"09",X"3A",X"2F",X"4D",X"87",X"82", + X"81",X"DD",X"77",X"08",X"CD",X"E6",X"15",X"CD",X"2D",X"16",X"CD",X"52",X"16",X"78",X"A7",X"C8", + X"0E",X"C0",X"3A",X"02",X"4C",X"B1",X"32",X"02",X"4C",X"3A",X"04",X"4C",X"B1",X"32",X"04",X"4C", + X"3A",X"06",X"4C",X"B1",X"32",X"06",X"4C",X"3A",X"08",X"4C",X"B1",X"32",X"08",X"4C",X"3A",X"0C", + X"4C",X"B1",X"32",X"0C",X"4C",X"C9",X"3A",X"06",X"4E",X"D6",X"05",X"D8",X"3A",X"09",X"4D",X"E6", + X"0F",X"FE",X"0C",X"38",X"04",X"16",X"18",X"18",X"12",X"FE",X"08",X"38",X"04",X"16",X"14",X"18", + X"0A",X"FE",X"04",X"38",X"04",X"16",X"10",X"18",X"02",X"16",X"14",X"DD",X"72",X"04",X"14",X"DD", + X"72",X"06",X"14",X"DD",X"72",X"08",X"14",X"DD",X"72",X"0C",X"DD",X"36",X"0A",X"3F",X"16",X"16", + X"DD",X"72",X"05",X"DD",X"72",X"07",X"DD",X"72",X"09",X"DD",X"72",X"0D",X"C9",X"3A",X"07",X"4E", + X"A7",X"C8",X"57",X"3A",X"3A",X"4D",X"D6",X"3D",X"20",X"04",X"DD",X"36",X"0B",X"00",X"7A",X"FE", + X"0A",X"D8",X"DD",X"36",X"02",X"32",X"DD",X"36",X"03",X"1D",X"FE",X"0C",X"D8",X"DD",X"36",X"02", + X"33",X"C9",X"3A",X"08",X"4E",X"A7",X"C8",X"57",X"3A",X"3A",X"4D",X"D6",X"3D",X"20",X"04",X"DD", + X"36",X"0B",X"00",X"7A",X"FE",X"01",X"D8",X"3A",X"C0",X"4D",X"1E",X"08",X"83",X"DD",X"77",X"02", + X"7A",X"FE",X"03",X"D8",X"3A",X"01",X"4D",X"E6",X"08",X"0F",X"0F",X"0F",X"1E",X"0A",X"83",X"DD", + X"77",X"0C",X"3C",X"3C",X"DD",X"77",X"02",X"DD",X"36",X"0D",X"1E",X"C9",X"3A",X"09",X"4D",X"E6", + X"07",X"FE",X"06",X"38",X"05",X"DD",X"36",X"0A",X"30",X"C9",X"FE",X"04",X"38",X"05",X"DD",X"36", + X"0A",X"2E",X"C9",X"FE",X"02",X"38",X"05",X"DD",X"36",X"0A",X"2C",X"C9",X"DD",X"36",X"0A",X"2E", + X"C9",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"06",X"38",X"05",X"DD",X"36",X"0A",X"2F",X"C9",X"FE", + X"04",X"38",X"05",X"DD",X"36",X"0A",X"2D",X"C9",X"FE",X"02",X"38",X"05",X"DD",X"36",X"0A",X"2F", + X"C9",X"DD",X"36",X"0A",X"30",X"C9",X"3A",X"09",X"4D",X"E6",X"07",X"FE",X"06",X"38",X"08",X"1E", + X"2E",X"CB",X"FB",X"DD",X"73",X"0A",X"C9",X"FE",X"04",X"38",X"04",X"1E",X"2C",X"18",X"F2",X"FE", + X"02",X"30",X"EC",X"1E",X"30",X"18",X"EA",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"06",X"38",X"05", + X"DD",X"36",X"0A",X"30",X"C9",X"FE",X"04",X"38",X"08",X"1E",X"2F",X"CB",X"F3",X"DD",X"73",X"0A", + X"C9",X"FE",X"02",X"38",X"04",X"1E",X"2D",X"18",X"F2",X"1E",X"2F",X"18",X"EE",X"06",X"04",X"ED", + X"5B",X"39",X"4D",X"3A",X"AF",X"4D",X"A7",X"20",X"09",X"2A",X"37",X"4D",X"A7",X"ED",X"52",X"CA", + X"63",X"17",X"05",X"3A",X"AE",X"4D",X"A7",X"20",X"09",X"2A",X"35",X"4D",X"A7",X"ED",X"52",X"CA", + X"63",X"17",X"05",X"3A",X"AD",X"4D",X"A7",X"20",X"09",X"2A",X"33",X"4D",X"A7",X"ED",X"52",X"CA", + X"63",X"17",X"05",X"3A",X"AC",X"4D",X"A7",X"20",X"09",X"2A",X"31",X"4D",X"A7",X"ED",X"52",X"CA", + X"63",X"17",X"05",X"78",X"32",X"A4",X"4D",X"32",X"A5",X"4D",X"A7",X"C8",X"21",X"A6",X"4D",X"5F", + X"16",X"00",X"19",X"7E",X"A7",X"C8",X"AF",X"32",X"A5",X"4D",X"21",X"D0",X"4D",X"34",X"46",X"04", + X"CD",X"5A",X"2A",X"21",X"BC",X"4E",X"CB",X"DE",X"C9",X"3A",X"A4",X"4D",X"A7",X"C0",X"3A",X"A6", + X"4D",X"A7",X"C8",X"0E",X"04",X"06",X"04",X"DD",X"21",X"08",X"4D",X"3A",X"AF",X"4D",X"A7",X"20", + X"13",X"3A",X"06",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"07",X"4D",X"DD",X"96",X"01", + X"B9",X"DA",X"63",X"17",X"05",X"3A",X"AE",X"4D",X"A7",X"20",X"13",X"3A",X"04",X"4D",X"DD",X"96", + X"00",X"B9",X"30",X"0A",X"3A",X"05",X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"63",X"17",X"05",X"3A", + X"AD",X"4D",X"A7",X"20",X"13",X"3A",X"02",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"03", + X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"63",X"17",X"05",X"3A",X"AC",X"4D",X"A7",X"20",X"13",X"3A", + X"00",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"01",X"4D",X"DD",X"96",X"01",X"B9",X"DA", + X"63",X"17",X"05",X"C3",X"63",X"17",X"21",X"9D",X"4D",X"3E",X"FF",X"BE",X"CA",X"11",X"18",X"35", + X"C9",X"3A",X"A6",X"4D",X"A7",X"CA",X"2F",X"18",X"2A",X"4C",X"4D",X"29",X"22",X"4C",X"4D",X"2A", + X"4A",X"4D",X"ED",X"6A",X"22",X"4A",X"4D",X"D0",X"21",X"4C",X"4D",X"34",X"C3",X"43",X"18",X"2A", + X"48",X"4D",X"29",X"22",X"48",X"4D",X"2A",X"46",X"4D",X"ED",X"6A",X"22",X"46",X"4D",X"D0",X"21", + X"48",X"4D",X"34",X"3A",X"0E",X"4E",X"32",X"9E",X"4D",X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E", + X"A1",X"4F",X"21",X"3A",X"4D",X"7E",X"06",X"21",X"90",X"38",X"09",X"7E",X"06",X"3B",X"90",X"30", + X"03",X"C3",X"AB",X"18",X"3E",X"01",X"32",X"BF",X"4D",X"3A",X"00",X"4E",X"FE",X"01",X"CA",X"19", + X"1A",X"3A",X"04",X"4E",X"FE",X"10",X"D2",X"19",X"1A",X"79",X"A7",X"28",X"06",X"3A",X"40",X"50", + X"C3",X"86",X"18",X"3A",X"00",X"50",X"CB",X"4F",X"C2",X"99",X"18",X"2A",X"03",X"33",X"3E",X"02", + X"32",X"30",X"4D",X"22",X"1C",X"4D",X"C3",X"50",X"19",X"CB",X"57",X"C2",X"50",X"19",X"2A",X"FF", + X"32",X"AF",X"32",X"30",X"4D",X"22",X"1C",X"4D",X"C3",X"50",X"19",X"3A",X"00",X"4E",X"FE",X"01", + X"CA",X"19",X"1A",X"3A",X"04",X"4E",X"FE",X"10",X"D2",X"19",X"1A",X"79",X"A7",X"28",X"06",X"3A", + X"40",X"50",X"C3",X"C8",X"18",X"3A",X"00",X"50",X"CB",X"4F",X"CA",X"C9",X"1A",X"CB",X"57",X"CA", + X"D9",X"1A",X"CB",X"47",X"CA",X"E8",X"1A",X"CB",X"5F",X"CA",X"F8",X"1A",X"2A",X"1C",X"4D",X"22", + X"26",X"4D",X"06",X"01",X"DD",X"21",X"26",X"4D",X"FD",X"21",X"39",X"4D",X"CD",X"0F",X"20",X"E6", + X"C0",X"D6",X"C0",X"20",X"4B",X"05",X"C2",X"16",X"19",X"3A",X"30",X"4D",X"0F",X"DA",X"0B",X"19", + X"3A",X"09",X"4D",X"E6",X"07",X"FE",X"04",X"C8",X"C3",X"40",X"19",X"3A",X"08",X"4D",X"E6",X"07", + X"FE",X"04",X"C8",X"C3",X"40",X"19",X"DD",X"21",X"1C",X"4D",X"CD",X"0F",X"20",X"E6",X"C0",X"D6", + X"C0",X"20",X"2D",X"3A",X"30",X"4D",X"0F",X"DA",X"35",X"19",X"3A",X"09",X"4D",X"E6",X"07",X"FE", + X"04",X"C8",X"C3",X"50",X"19",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"04",X"C8",X"C3",X"50",X"19", + X"2A",X"26",X"4D",X"22",X"1C",X"4D",X"05",X"CA",X"50",X"19",X"3A",X"3C",X"4D",X"32",X"30",X"4D", + X"DD",X"21",X"1C",X"4D",X"FD",X"21",X"08",X"4D",X"CD",X"00",X"20",X"3A",X"30",X"4D",X"0F",X"DA", + X"75",X"19",X"7D",X"E6",X"07",X"FE",X"04",X"CA",X"85",X"19",X"DA",X"71",X"19",X"2D",X"C3",X"85", + X"19",X"2C",X"C3",X"85",X"19",X"7C",X"E6",X"07",X"FE",X"04",X"CA",X"85",X"19",X"DA",X"84",X"19", + X"25",X"C3",X"85",X"19",X"24",X"22",X"08",X"4D",X"CD",X"18",X"20",X"22",X"39",X"4D",X"DD",X"21", + X"BF",X"4D",X"DD",X"7E",X"00",X"DD",X"36",X"00",X"00",X"A7",X"C0",X"3A",X"D2",X"4D",X"A7",X"28", + X"2C",X"3A",X"D4",X"4D",X"A7",X"28",X"26",X"2A",X"08",X"4D",X"11",X"94",X"80",X"A7",X"ED",X"52", + X"20",X"1B",X"06",X"19",X"4F",X"CD",X"42",X"00",X"0E",X"15",X"81",X"4F",X"06",X"1C",X"CD",X"42", + X"00",X"CD",X"04",X"10",X"F7",X"54",X"05",X"00",X"21",X"BC",X"4E",X"CB",X"D6",X"3E",X"FF",X"32", + X"9D",X"4D",X"2A",X"39",X"4D",X"CD",X"65",X"00",X"7E",X"FE",X"10",X"28",X"03",X"FE",X"14",X"C0", + X"DD",X"21",X"0E",X"4E",X"DD",X"34",X"00",X"E6",X"0F",X"CB",X"3F",X"06",X"40",X"70",X"06",X"19", + X"4F",X"CB",X"39",X"CD",X"42",X"00",X"3C",X"FE",X"01",X"CA",X"FD",X"19",X"87",X"32",X"9D",X"4D", + X"CD",X"08",X"1B",X"CD",X"6A",X"1A",X"21",X"BC",X"4E",X"3A",X"0E",X"4E",X"0F",X"38",X"05",X"CB", + X"C6",X"CB",X"8E",X"C9",X"CB",X"86",X"CB",X"CE",X"C9",X"21",X"1C",X"4D",X"7E",X"A7",X"CA",X"2E", + X"1A",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"38",X"1A",X"C3",X"5C",X"1A",X"3A",X"09", + X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"5C",X"1A",X"3E",X"05",X"CD",X"D0",X"1E",X"38",X"03",X"EF", + X"17",X"00",X"DD",X"21",X"26",X"4D",X"FD",X"21",X"12",X"4D",X"CD",X"00",X"20",X"22",X"12",X"4D", + X"2A",X"26",X"4D",X"22",X"1C",X"4D",X"3A",X"3C",X"4D",X"32",X"30",X"4D",X"DD",X"21",X"1C",X"4D", + X"FD",X"21",X"08",X"4D",X"CD",X"00",X"20",X"C3",X"85",X"19",X"3A",X"9D",X"4D",X"FE",X"06",X"C0", + X"2A",X"BD",X"4D",X"22",X"CB",X"4D",X"3E",X"01",X"32",X"A6",X"4D",X"32",X"A7",X"4D",X"32",X"A8", + X"4D",X"32",X"A9",X"4D",X"32",X"AA",X"4D",X"32",X"B1",X"4D",X"32",X"B2",X"4D",X"32",X"B3",X"4D", + X"32",X"B4",X"4D",X"32",X"B5",X"4D",X"AF",X"32",X"C8",X"4D",X"32",X"D0",X"4D",X"DD",X"21",X"00", + X"4C",X"DD",X"36",X"02",X"1C",X"DD",X"36",X"04",X"1C",X"DD",X"36",X"06",X"1C",X"DD",X"36",X"08", + X"1C",X"DD",X"36",X"03",X"11",X"DD",X"36",X"05",X"11",X"DD",X"36",X"07",X"11",X"DD",X"36",X"09", + X"11",X"21",X"AC",X"4E",X"CB",X"EE",X"CB",X"BE",X"C9",X"2A",X"03",X"33",X"3E",X"02",X"32",X"3C", + X"4D",X"22",X"26",X"4D",X"06",X"00",X"C3",X"E4",X"18",X"2A",X"FF",X"32",X"AF",X"32",X"3C",X"4D", + X"22",X"26",X"4D",X"06",X"00",X"C3",X"E4",X"18",X"2A",X"05",X"33",X"3E",X"03",X"32",X"3C",X"4D", + X"22",X"26",X"4D",X"06",X"00",X"C3",X"E4",X"18",X"2A",X"01",X"33",X"3E",X"01",X"32",X"3C",X"4D", + X"22",X"26",X"4D",X"06",X"00",X"C3",X"E4",X"18",X"3A",X"12",X"4E",X"A7",X"CA",X"14",X"1B",X"21", + X"9F",X"4D",X"34",X"C9",X"3A",X"A3",X"4D",X"A7",X"C0",X"3A",X"A2",X"4D",X"A7",X"CA",X"25",X"1B", + X"21",X"11",X"4E",X"34",X"C9",X"3A",X"A1",X"4D",X"A7",X"CA",X"31",X"1B",X"21",X"10",X"4E",X"34", + X"C9",X"21",X"0F",X"4E",X"34",X"C9",X"3A",X"A0",X"4D",X"A7",X"C8",X"3A",X"AC",X"4D",X"A7",X"C0", + X"CD",X"D7",X"20",X"2A",X"31",X"4D",X"01",X"99",X"4D",X"CD",X"5A",X"20",X"3A",X"99",X"4D",X"A7", + X"CA",X"6A",X"1B",X"2A",X"60",X"4D",X"29",X"22",X"60",X"4D",X"2A",X"5E",X"4D",X"ED",X"6A",X"22", + X"5E",X"4D",X"D0",X"21",X"60",X"4D",X"34",X"C3",X"D8",X"1B",X"3A",X"A7",X"4D",X"A7",X"CA",X"88", + X"1B",X"2A",X"5C",X"4D",X"29",X"22",X"5C",X"4D",X"2A",X"5A",X"4D",X"ED",X"6A",X"22",X"5A",X"4D", + X"D0",X"21",X"5C",X"4D",X"34",X"C3",X"D8",X"1B",X"3A",X"B7",X"4D",X"A7",X"CA",X"A6",X"1B",X"2A", + X"50",X"4D",X"29",X"22",X"50",X"4D",X"2A",X"4E",X"4D",X"ED",X"6A",X"22",X"4E",X"4D",X"D0",X"21", + X"50",X"4D",X"34",X"C3",X"D8",X"1B",X"3A",X"B6",X"4D",X"A7",X"CA",X"C4",X"1B",X"2A",X"54",X"4D", + X"29",X"22",X"54",X"4D",X"2A",X"52",X"4D",X"ED",X"6A",X"22",X"52",X"4D",X"D0",X"21",X"54",X"4D", + X"34",X"C3",X"D8",X"1B",X"2A",X"58",X"4D",X"29",X"22",X"58",X"4D",X"2A",X"56",X"4D",X"ED",X"6A", + X"22",X"56",X"4D",X"D0",X"21",X"58",X"4D",X"34",X"21",X"14",X"4D",X"7E",X"A7",X"CA",X"ED",X"1B", + X"3A",X"00",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"F7",X"1B",X"C3",X"36",X"1C",X"3A",X"01",X"4D", + X"E6",X"07",X"FE",X"04",X"C2",X"36",X"1C",X"3E",X"01",X"CD",X"D0",X"1E",X"38",X"1B",X"3A",X"A7", + X"4D",X"A7",X"CA",X"0B",X"1C",X"EF",X"0C",X"00",X"C3",X"19",X"1C",X"2A",X"0A",X"4D",X"CD",X"52", + X"20",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"08",X"00",X"CD",X"FE",X"1E",X"DD",X"21",X"1E",X"4D", + X"FD",X"21",X"0A",X"4D",X"CD",X"00",X"20",X"22",X"0A",X"4D",X"2A",X"1E",X"4D",X"22",X"14",X"4D", + X"3A",X"2C",X"4D",X"32",X"28",X"4D",X"DD",X"21",X"14",X"4D",X"FD",X"21",X"00",X"4D",X"CD",X"00", + X"20",X"22",X"00",X"4D",X"CD",X"18",X"20",X"22",X"31",X"4D",X"C9",X"3A",X"A1",X"4D",X"FE",X"01", + X"C0",X"3A",X"AD",X"4D",X"A7",X"C0",X"2A",X"33",X"4D",X"01",X"9A",X"4D",X"CD",X"5A",X"20",X"3A", + X"9A",X"4D",X"A7",X"CA",X"7D",X"1C",X"2A",X"6C",X"4D",X"29",X"22",X"6C",X"4D",X"2A",X"6A",X"4D", + X"ED",X"6A",X"22",X"6A",X"4D",X"D0",X"21",X"6C",X"4D",X"34",X"C3",X"AF",X"1C",X"3A",X"A8",X"4D", + X"A7",X"CA",X"9B",X"1C",X"2A",X"68",X"4D",X"29",X"22",X"68",X"4D",X"2A",X"66",X"4D",X"ED",X"6A", + X"22",X"66",X"4D",X"D0",X"21",X"68",X"4D",X"34",X"C3",X"AF",X"1C",X"2A",X"64",X"4D",X"29",X"22", + X"64",X"4D",X"2A",X"62",X"4D",X"ED",X"6A",X"22",X"62",X"4D",X"D0",X"21",X"64",X"4D",X"34",X"21", + X"16",X"4D",X"7E",X"A7",X"CA",X"C4",X"1C",X"3A",X"02",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"CE", + X"1C",X"C3",X"0D",X"1D",X"3A",X"03",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"0D",X"1D",X"3E",X"02", + X"CD",X"D0",X"1E",X"38",X"1B",X"3A",X"A8",X"4D",X"A7",X"CA",X"E2",X"1C",X"EF",X"0D",X"00",X"C3", + X"F0",X"1C",X"2A",X"0C",X"4D",X"CD",X"52",X"20",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"09",X"00", + X"CD",X"25",X"1F",X"DD",X"21",X"20",X"4D",X"FD",X"21",X"0C",X"4D",X"CD",X"00",X"20",X"22",X"0C", + X"4D",X"2A",X"20",X"4D",X"22",X"16",X"4D",X"3A",X"2D",X"4D",X"32",X"29",X"4D",X"DD",X"21",X"16", + X"4D",X"FD",X"21",X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"CD",X"18",X"20",X"22",X"33", + X"4D",X"C9",X"3A",X"A2",X"4D",X"FE",X"01",X"C0",X"3A",X"AE",X"4D",X"A7",X"C0",X"2A",X"35",X"4D", + X"01",X"9B",X"4D",X"CD",X"5A",X"20",X"3A",X"9B",X"4D",X"A7",X"CA",X"54",X"1D",X"2A",X"78",X"4D", + X"29",X"22",X"78",X"4D",X"2A",X"76",X"4D",X"ED",X"6A",X"22",X"76",X"4D",X"D0",X"21",X"78",X"4D", + X"34",X"C3",X"86",X"1D",X"3A",X"A9",X"4D",X"A7",X"CA",X"72",X"1D",X"2A",X"74",X"4D",X"29",X"22", + X"74",X"4D",X"2A",X"72",X"4D",X"ED",X"6A",X"22",X"72",X"4D",X"D0",X"21",X"74",X"4D",X"34",X"C3", + X"86",X"1D",X"2A",X"70",X"4D",X"29",X"22",X"70",X"4D",X"2A",X"6E",X"4D",X"ED",X"6A",X"22",X"6E", + X"4D",X"D0",X"21",X"70",X"4D",X"34",X"21",X"18",X"4D",X"7E",X"A7",X"CA",X"9B",X"1D",X"3A",X"04", + X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"A5",X"1D",X"C3",X"E4",X"1D",X"3A",X"05",X"4D",X"E6",X"07", + X"FE",X"04",X"C2",X"E4",X"1D",X"3E",X"03",X"CD",X"D0",X"1E",X"38",X"1B",X"3A",X"A9",X"4D",X"A7", + X"CA",X"B9",X"1D",X"EF",X"0E",X"00",X"C3",X"C7",X"1D",X"2A",X"0E",X"4D",X"CD",X"52",X"20",X"7E", + X"FE",X"1A",X"28",X"03",X"EF",X"0A",X"00",X"CD",X"4C",X"1F",X"DD",X"21",X"22",X"4D",X"FD",X"21", + X"0E",X"4D",X"CD",X"00",X"20",X"22",X"0E",X"4D",X"2A",X"22",X"4D",X"22",X"18",X"4D",X"3A",X"2E", + X"4D",X"32",X"2A",X"4D",X"DD",X"21",X"18",X"4D",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22", + X"04",X"4D",X"CD",X"18",X"20",X"22",X"35",X"4D",X"C9",X"3A",X"A3",X"4D",X"FE",X"01",X"C0",X"3A", + X"AF",X"4D",X"A7",X"C0",X"2A",X"37",X"4D",X"01",X"9C",X"4D",X"CD",X"5A",X"20",X"3A",X"9C",X"4D", + X"A7",X"CA",X"2B",X"1E",X"2A",X"84",X"4D",X"29",X"22",X"84",X"4D",X"2A",X"82",X"4D",X"ED",X"6A", + X"22",X"82",X"4D",X"D0",X"21",X"84",X"4D",X"34",X"C3",X"5D",X"1E",X"3A",X"AA",X"4D",X"A7",X"CA", + X"49",X"1E",X"2A",X"80",X"4D",X"29",X"22",X"80",X"4D",X"2A",X"7E",X"4D",X"ED",X"6A",X"22",X"7E", + X"4D",X"D0",X"21",X"80",X"4D",X"34",X"C3",X"5D",X"1E",X"2A",X"7C",X"4D",X"29",X"22",X"7C",X"4D", + X"2A",X"7A",X"4D",X"ED",X"6A",X"22",X"7A",X"4D",X"D0",X"21",X"7C",X"4D",X"34",X"21",X"1A",X"4D", + X"7E",X"A7",X"CA",X"72",X"1E",X"3A",X"06",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"7C",X"1E",X"C3", + X"BB",X"1E",X"3A",X"07",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"BB",X"1E",X"3E",X"04",X"CD",X"D0", + X"1E",X"38",X"1B",X"3A",X"AA",X"4D",X"A7",X"CA",X"90",X"1E",X"EF",X"0F",X"00",X"C3",X"9E",X"1E", + X"2A",X"10",X"4D",X"CD",X"52",X"20",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"0B",X"00",X"CD",X"73", + X"1F",X"DD",X"21",X"24",X"4D",X"FD",X"21",X"10",X"4D",X"CD",X"00",X"20",X"22",X"10",X"4D",X"2A", + X"24",X"4D",X"22",X"1A",X"4D",X"3A",X"2F",X"4D",X"32",X"2B",X"4D",X"DD",X"21",X"1A",X"4D",X"FD", + X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"CD",X"18",X"20",X"22",X"37",X"4D",X"C9", + X"87",X"4F",X"06",X"00",X"21",X"09",X"4D",X"09",X"7E",X"FE",X"1D",X"C2",X"E3",X"1E",X"36",X"3D", + X"C3",X"FC",X"1E",X"FE",X"3E",X"C2",X"ED",X"1E",X"36",X"1E",X"C3",X"FC",X"1E",X"06",X"21",X"90", + X"DA",X"FC",X"1E",X"7E",X"06",X"3B",X"90",X"D2",X"FC",X"1E",X"A7",X"C9",X"37",X"C9",X"3A",X"B1", + X"4D",X"A7",X"C8",X"AF",X"32",X"B1",X"4D",X"21",X"FF",X"32",X"3A",X"28",X"4D",X"EE",X"02",X"32", + X"2C",X"4D",X"47",X"DF",X"22",X"1E",X"4D",X"3A",X"02",X"4E",X"FE",X"22",X"C0",X"22",X"14",X"4D", + X"78",X"32",X"28",X"4D",X"C9",X"3A",X"B2",X"4D",X"A7",X"C8",X"AF",X"32",X"B2",X"4D",X"21",X"FF", + X"32",X"3A",X"29",X"4D",X"EE",X"02",X"32",X"2D",X"4D",X"47",X"DF",X"22",X"20",X"4D",X"3A",X"02", + X"4E",X"FE",X"22",X"C0",X"22",X"16",X"4D",X"78",X"32",X"29",X"4D",X"C9",X"3A",X"B3",X"4D",X"A7", + X"C8",X"AF",X"32",X"B3",X"4D",X"21",X"FF",X"32",X"3A",X"2A",X"4D",X"EE",X"02",X"32",X"2E",X"4D", + X"47",X"DF",X"22",X"22",X"4D",X"3A",X"02",X"4E",X"FE",X"22",X"C0",X"22",X"18",X"4D",X"78",X"32", + X"2A",X"4D",X"C9",X"3A",X"B4",X"4D",X"A7",X"C8",X"AF",X"32",X"B4",X"4D",X"21",X"FF",X"32",X"3A", + X"2B",X"4D",X"EE",X"02",X"32",X"2F",X"4D",X"47",X"DF",X"22",X"24",X"4D",X"3A",X"02",X"4E",X"FE", + X"22",X"C0",X"22",X"1A",X"4D",X"78",X"32",X"2B",X"4D",X"C9",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"5D",X"E1", + X"FD",X"7E",X"00",X"DD",X"86",X"00",X"6F",X"FD",X"7E",X"01",X"DD",X"86",X"01",X"67",X"C9",X"CD", + X"00",X"20",X"CD",X"65",X"00",X"7E",X"A7",X"C9",X"7D",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6", + X"20",X"6F",X"7C",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6",X"1E",X"67",X"C9",X"F5",X"C5",X"7D", + X"D6",X"20",X"6F",X"7C",X"D6",X"20",X"67",X"06",X"00",X"CB",X"24",X"CB",X"24",X"CB",X"24",X"CB", + X"24",X"CB",X"10",X"CB",X"24",X"CB",X"10",X"4C",X"26",X"00",X"09",X"01",X"40",X"40",X"09",X"C1", + X"F1",X"C9",X"CD",X"65",X"00",X"11",X"00",X"04",X"19",X"C9",X"CD",X"52",X"20",X"7E",X"FE",X"1B", + X"20",X"04",X"3E",X"01",X"02",X"C9",X"AF",X"02",X"C9",X"3A",X"A1",X"4D",X"A7",X"C0",X"3A",X"12", + X"4E",X"A7",X"CA",X"7E",X"20",X"3A",X"9F",X"4D",X"FE",X"07",X"C0",X"C3",X"86",X"20",X"21",X"B8", + X"4D",X"3A",X"0F",X"4E",X"BE",X"D8",X"3E",X"02",X"32",X"A1",X"4D",X"C9",X"3A",X"A2",X"4D",X"A7", + X"C0",X"3A",X"12",X"4E",X"A7",X"CA",X"A1",X"20",X"3A",X"9F",X"4D",X"FE",X"11",X"C0",X"C3",X"A9", + X"20",X"21",X"B9",X"4D",X"3A",X"10",X"4E",X"BE",X"D8",X"3E",X"03",X"32",X"A2",X"4D",X"C9",X"3A", + X"A3",X"4D",X"A7",X"C0",X"3A",X"12",X"4E",X"A7",X"CA",X"C9",X"20",X"3A",X"9F",X"4D",X"FE",X"20", + X"C0",X"AF",X"32",X"12",X"4E",X"32",X"9F",X"4D",X"C9",X"21",X"BA",X"4D",X"3A",X"11",X"4E",X"BE", + X"D8",X"3E",X"03",X"32",X"A3",X"4D",X"C9",X"3A",X"A3",X"4D",X"A7",X"C8",X"21",X"0E",X"4E",X"3A", + X"B6",X"4D",X"A7",X"C2",X"F4",X"20",X"3E",X"F4",X"96",X"47",X"3A",X"BB",X"4D",X"90",X"D8",X"3E", + X"01",X"32",X"B6",X"4D",X"3A",X"B7",X"4D",X"A7",X"C0",X"3E",X"F4",X"96",X"47",X"3A",X"BC",X"4D", + X"90",X"D8",X"3E",X"01",X"32",X"B7",X"4D",X"C9",X"3A",X"06",X"4E",X"E7",X"1A",X"21",X"40",X"21", + X"4B",X"21",X"0C",X"00",X"70",X"21",X"7B",X"21",X"86",X"21",X"3A",X"3A",X"4D",X"D6",X"21",X"20", + X"0F",X"3C",X"32",X"A0",X"4D",X"32",X"B7",X"4D",X"CD",X"06",X"05",X"21",X"06",X"4E",X"34",X"C9", + X"CD",X"06",X"18",X"CD",X"06",X"18",X"CD",X"36",X"1B",X"CD",X"36",X"1B",X"CD",X"23",X"0E",X"C9", + X"3A",X"3A",X"4D",X"D6",X"1E",X"C2",X"30",X"21",X"C3",X"2B",X"21",X"3A",X"32",X"4D",X"D6",X"1E", + X"C2",X"36",X"21",X"CD",X"70",X"1A",X"AF",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"CD",X"A5",X"05", + X"22",X"1C",X"4D",X"3A",X"3C",X"4D",X"32",X"30",X"4D",X"F7",X"45",X"07",X"00",X"C3",X"2B",X"21", + X"3A",X"32",X"4D",X"D6",X"2F",X"C2",X"36",X"21",X"C3",X"2B",X"21",X"3A",X"32",X"4D",X"D6",X"3D", + X"C2",X"30",X"21",X"C3",X"2B",X"21",X"CD",X"06",X"18",X"CD",X"06",X"18",X"3A",X"3A",X"4D",X"D6", + X"3D",X"C0",X"32",X"06",X"4E",X"F7",X"45",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"3A",X"07", + X"4E",X"FD",X"21",X"D2",X"41",X"E7",X"C2",X"21",X"0C",X"00",X"E1",X"21",X"F5",X"21",X"0C",X"22", + X"1E",X"22",X"44",X"22",X"5D",X"22",X"0C",X"00",X"6A",X"22",X"0C",X"00",X"86",X"22",X"0C",X"00", + X"8D",X"22",X"3E",X"01",X"32",X"D2",X"45",X"32",X"D3",X"45",X"32",X"F2",X"45",X"32",X"F3",X"45", + X"CD",X"06",X"05",X"FD",X"36",X"00",X"60",X"FD",X"36",X"01",X"61",X"F7",X"43",X"08",X"00",X"18", + X"0F",X"3A",X"3A",X"4D",X"D6",X"2C",X"C2",X"30",X"21",X"3C",X"32",X"A0",X"4D",X"32",X"B7",X"4D", + X"21",X"07",X"4E",X"34",X"C9",X"3A",X"01",X"4D",X"FE",X"77",X"28",X"05",X"FE",X"78",X"C2",X"30", + X"21",X"21",X"84",X"20",X"22",X"4E",X"4D",X"22",X"50",X"4D",X"18",X"E4",X"3A",X"01",X"4D",X"D6", + X"78",X"C2",X"37",X"22",X"FD",X"36",X"00",X"62",X"FD",X"36",X"01",X"63",X"18",X"D2",X"3A",X"01", + X"4D",X"D6",X"7B",X"20",X"12",X"FD",X"36",X"00",X"64",X"FD",X"36",X"01",X"65",X"FD",X"36",X"20", + X"66",X"FD",X"36",X"21",X"67",X"18",X"B9",X"CD",X"06",X"18",X"CD",X"06",X"18",X"CD",X"36",X"1B", + X"CD",X"23",X"0E",X"C9",X"3A",X"01",X"4D",X"D6",X"7E",X"20",X"EC",X"FD",X"36",X"00",X"68",X"FD", + X"36",X"01",X"69",X"FD",X"36",X"20",X"6A",X"FD",X"36",X"21",X"6B",X"18",X"93",X"3A",X"01",X"4D", + X"D6",X"80",X"20",X"D3",X"F7",X"4F",X"08",X"00",X"18",X"86",X"21",X"01",X"4D",X"34",X"34",X"FD", + X"36",X"00",X"6C",X"FD",X"36",X"01",X"6D",X"FD",X"36",X"20",X"40",X"FD",X"36",X"21",X"40",X"F7", + X"4A",X"08",X"00",X"C3",X"F0",X"21",X"F7",X"54",X"08",X"00",X"C3",X"F0",X"21",X"AF",X"32",X"07", + X"4E",X"21",X"04",X"4E",X"34",X"34",X"C9",X"3A",X"08",X"4E",X"E7",X"A7",X"22",X"BE",X"22",X"0C", + X"00",X"DD",X"22",X"F5",X"22",X"FE",X"22",X"3A",X"3A",X"4D",X"D6",X"25",X"C2",X"30",X"21",X"3C", + X"32",X"A0",X"4D",X"32",X"B7",X"4D",X"CD",X"06",X"05",X"21",X"08",X"4E",X"34",X"C9",X"3A",X"01", + X"4D",X"FE",X"FF",X"28",X"05",X"FE",X"FE",X"C2",X"30",X"21",X"3C",X"3C",X"32",X"01",X"4D",X"3E", + X"01",X"32",X"B1",X"4D",X"CD",X"FE",X"1E",X"F7",X"4A",X"09",X"00",X"18",X"DC",X"3A",X"32",X"4D", + X"D6",X"2D",X"28",X"D5",X"3A",X"00",X"4D",X"32",X"D2",X"4D",X"3A",X"01",X"4D",X"D6",X"08",X"32", + X"D3",X"4D",X"C3",X"30",X"21",X"3A",X"32",X"4D",X"D6",X"1E",X"28",X"BD",X"18",X"E6",X"AF",X"32", + X"08",X"4E",X"F7",X"45",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"21",X"00",X"50",X"06",X"08", + X"AF",X"77",X"2C",X"10",X"FC",X"21",X"00",X"40",X"06",X"04",X"32",X"C0",X"50",X"32",X"07",X"50", + X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F1",X"06",X"04",X"32",X"C0",X"50",X"AF",X"32", + X"07",X"50",X"3E",X"0F",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F0",X"ED",X"5E",X"3E",X"FA",X"D3", + X"00",X"AF",X"32",X"07",X"50",X"3C",X"32",X"00",X"50",X"FB",X"76",X"32",X"C0",X"50",X"31",X"C0", + X"4F",X"AF",X"21",X"00",X"50",X"01",X"08",X"08",X"CF",X"21",X"00",X"4C",X"06",X"BE",X"CF",X"CF", + X"CF",X"CF",X"21",X"40",X"50",X"06",X"40",X"CF",X"32",X"C0",X"50",X"CD",X"0D",X"24",X"32",X"C0", + X"50",X"06",X"00",X"CD",X"ED",X"23",X"32",X"C0",X"50",X"21",X"C0",X"4C",X"22",X"80",X"4C",X"22", + X"82",X"4C",X"3E",X"FF",X"06",X"40",X"CF",X"3E",X"01",X"32",X"00",X"50",X"FB",X"2A",X"82",X"4C", + X"7E",X"A7",X"FA",X"8D",X"23",X"36",X"FF",X"2C",X"46",X"36",X"FF",X"2C",X"20",X"02",X"2E",X"C0", + X"22",X"82",X"4C",X"21",X"8D",X"23",X"E5",X"E7",X"ED",X"23",X"D7",X"24",X"19",X"24",X"48",X"24", + X"3D",X"25",X"8B",X"26",X"0D",X"24",X"98",X"26",X"30",X"27",X"6C",X"27",X"A9",X"27",X"F1",X"27", + X"3B",X"28",X"65",X"28",X"8F",X"28",X"B9",X"28",X"0D",X"00",X"A2",X"26",X"C9",X"24",X"35",X"2A", + X"D0",X"26",X"87",X"24",X"E8",X"23",X"E3",X"28",X"E0",X"2A",X"5A",X"2A",X"6A",X"2B",X"EA",X"2B", + X"5E",X"2C",X"A1",X"2B",X"75",X"26",X"B2",X"26",X"21",X"04",X"4E",X"34",X"C9",X"78",X"E7",X"F3", + X"23",X"00",X"24",X"3E",X"40",X"01",X"04",X"00",X"21",X"00",X"40",X"CF",X"0D",X"20",X"FC",X"C9", + X"3E",X"40",X"21",X"40",X"40",X"01",X"04",X"80",X"CF",X"0D",X"20",X"FC",X"C9",X"AF",X"01",X"04", + X"00",X"21",X"00",X"44",X"CF",X"0D",X"20",X"FC",X"C9",X"21",X"00",X"40",X"01",X"35",X"34",X"0A", + X"A7",X"C8",X"FA",X"2C",X"24",X"5F",X"16",X"00",X"19",X"2B",X"03",X"0A",X"23",X"77",X"F5",X"E5", + X"11",X"E0",X"83",X"7D",X"E6",X"1F",X"87",X"26",X"00",X"6F",X"19",X"D1",X"A7",X"ED",X"52",X"F1", + X"EE",X"01",X"77",X"EB",X"03",X"C3",X"1F",X"24",X"21",X"00",X"40",X"DD",X"21",X"16",X"4E",X"FD", + X"21",X"B5",X"35",X"16",X"00",X"06",X"1E",X"0E",X"08",X"DD",X"7E",X"00",X"FD",X"5E",X"00",X"19", + X"07",X"30",X"02",X"36",X"10",X"FD",X"23",X"0D",X"20",X"F2",X"DD",X"23",X"05",X"20",X"E8",X"21", + X"34",X"4E",X"11",X"64",X"40",X"ED",X"A0",X"11",X"78",X"40",X"ED",X"A0",X"11",X"84",X"43",X"ED", + X"A0",X"11",X"98",X"43",X"ED",X"A0",X"C9",X"21",X"00",X"40",X"DD",X"21",X"16",X"4E",X"FD",X"21", + X"B5",X"35",X"16",X"00",X"06",X"1E",X"0E",X"08",X"FD",X"5E",X"00",X"19",X"7E",X"FE",X"10",X"37", + X"28",X"01",X"3F",X"DD",X"CB",X"00",X"16",X"FD",X"23",X"0D",X"20",X"EC",X"DD",X"23",X"05",X"20", + X"E5",X"21",X"64",X"40",X"11",X"34",X"4E",X"ED",X"A0",X"21",X"78",X"40",X"ED",X"A0",X"21",X"84", + X"43",X"ED",X"A0",X"21",X"98",X"43",X"ED",X"A0",X"C9",X"21",X"16",X"4E",X"3E",X"FF",X"06",X"1E", + X"CF",X"3E",X"14",X"06",X"04",X"CF",X"C9",X"58",X"78",X"FE",X"02",X"3E",X"1F",X"28",X"02",X"3E", + X"10",X"21",X"40",X"44",X"01",X"04",X"80",X"CF",X"0D",X"20",X"FC",X"3E",X"0F",X"06",X"40",X"21", + X"C0",X"47",X"CF",X"7B",X"FE",X"01",X"C0",X"3E",X"1A",X"11",X"20",X"00",X"06",X"06",X"DD",X"21", + X"A0",X"45",X"DD",X"77",X"0C",X"DD",X"77",X"18",X"DD",X"19",X"10",X"F6",X"3E",X"1B",X"06",X"05", + X"DD",X"21",X"40",X"44",X"DD",X"77",X"0E",X"DD",X"77",X"0F",X"DD",X"77",X"10",X"DD",X"19",X"10", + X"F3",X"06",X"05",X"DD",X"21",X"20",X"47",X"DD",X"77",X"0E",X"DD",X"77",X"0F",X"DD",X"77",X"10", + X"DD",X"19",X"10",X"F3",X"3E",X"18",X"32",X"ED",X"45",X"32",X"0D",X"46",X"C9",X"DD",X"21",X"00", + X"4C",X"DD",X"36",X"02",X"20",X"DD",X"36",X"04",X"20",X"DD",X"36",X"06",X"20",X"DD",X"36",X"08", + X"20",X"DD",X"36",X"0A",X"2C",X"DD",X"36",X"0C",X"3F",X"DD",X"36",X"03",X"01",X"DD",X"36",X"05", + X"03",X"DD",X"36",X"07",X"05",X"DD",X"36",X"09",X"07",X"DD",X"36",X"0B",X"09",X"DD",X"36",X"0D", + X"00",X"78",X"A7",X"C2",X"0F",X"26",X"21",X"64",X"80",X"22",X"00",X"4D",X"21",X"7C",X"80",X"22", + X"02",X"4D",X"21",X"7C",X"90",X"22",X"04",X"4D",X"21",X"7C",X"70",X"22",X"06",X"4D",X"21",X"C4", + X"80",X"22",X"08",X"4D",X"21",X"2C",X"2E",X"22",X"0A",X"4D",X"22",X"31",X"4D",X"21",X"2F",X"2E", + X"22",X"0C",X"4D",X"22",X"33",X"4D",X"21",X"2F",X"30",X"22",X"0E",X"4D",X"22",X"35",X"4D",X"21", + X"2F",X"2C",X"22",X"10",X"4D",X"22",X"37",X"4D",X"21",X"38",X"2E",X"22",X"12",X"4D",X"22",X"39", + X"4D",X"21",X"00",X"01",X"22",X"14",X"4D",X"22",X"1E",X"4D",X"21",X"01",X"00",X"22",X"16",X"4D", + X"22",X"20",X"4D",X"21",X"FF",X"00",X"22",X"18",X"4D",X"22",X"22",X"4D",X"21",X"FF",X"00",X"22", + X"1A",X"4D",X"22",X"24",X"4D",X"21",X"00",X"01",X"22",X"1C",X"4D",X"22",X"26",X"4D",X"21",X"02", + X"01",X"22",X"28",X"4D",X"22",X"2C",X"4D",X"21",X"03",X"03",X"22",X"2A",X"4D",X"22",X"2E",X"4D", + X"3E",X"02",X"32",X"30",X"4D",X"32",X"3C",X"4D",X"21",X"00",X"00",X"22",X"D2",X"4D",X"C9",X"21", + X"94",X"00",X"22",X"00",X"4D",X"22",X"02",X"4D",X"22",X"04",X"4D",X"22",X"06",X"4D",X"21",X"32", + X"1E",X"22",X"0A",X"4D",X"22",X"0C",X"4D",X"22",X"0E",X"4D",X"22",X"10",X"4D",X"22",X"31",X"4D", + X"22",X"33",X"4D",X"22",X"35",X"4D",X"22",X"37",X"4D",X"21",X"00",X"01",X"22",X"14",X"4D",X"22", + X"16",X"4D",X"22",X"18",X"4D",X"22",X"1A",X"4D",X"22",X"1E",X"4D",X"22",X"20",X"4D",X"22",X"22", + X"4D",X"22",X"24",X"4D",X"22",X"1C",X"4D",X"22",X"26",X"4D",X"21",X"28",X"4D",X"3E",X"02",X"06", + X"09",X"CF",X"32",X"3C",X"4D",X"21",X"94",X"08",X"22",X"08",X"4D",X"21",X"32",X"1F",X"22",X"12", + X"4D",X"22",X"39",X"4D",X"C9",X"21",X"00",X"00",X"22",X"D2",X"4D",X"22",X"08",X"4D",X"22",X"00", + X"4D",X"22",X"02",X"4D",X"22",X"04",X"4D",X"22",X"06",X"4D",X"C9",X"3E",X"55",X"32",X"94",X"4D", + X"05",X"C8",X"3E",X"01",X"32",X"A0",X"4D",X"C9",X"3E",X"01",X"32",X"00",X"4E",X"AF",X"32",X"01", + X"4E",X"C9",X"AF",X"11",X"00",X"4D",X"21",X"00",X"4E",X"12",X"13",X"A7",X"ED",X"52",X"C2",X"A6", + X"26",X"C9",X"DD",X"21",X"36",X"41",X"3A",X"71",X"4E",X"E6",X"0F",X"C6",X"30",X"DD",X"77",X"00", + X"3A",X"71",X"4E",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"C8",X"C6",X"30",X"DD",X"77",X"20",X"C9", + X"3A",X"80",X"50",X"47",X"E6",X"03",X"C2",X"DE",X"26",X"21",X"6E",X"4E",X"36",X"FF",X"4F",X"1F", + X"CE",X"00",X"32",X"6B",X"4E",X"E6",X"02",X"A9",X"32",X"6D",X"4E",X"78",X"0F",X"0F",X"E6",X"03", + X"3C",X"FE",X"04",X"20",X"01",X"3C",X"32",X"6F",X"4E",X"78",X"0F",X"0F",X"0F",X"0F",X"E6",X"03", + X"21",X"28",X"27",X"D7",X"32",X"71",X"4E",X"78",X"07",X"2F",X"E6",X"01",X"32",X"75",X"4E",X"78", + X"07",X"07",X"2F",X"E6",X"01",X"47",X"21",X"2C",X"27",X"DF",X"22",X"73",X"4E",X"3A",X"40",X"50", + X"07",X"2F",X"E6",X"01",X"32",X"72",X"4E",X"C9",X"10",X"15",X"20",X"FF",X"68",X"00",X"7D",X"00", + X"3A",X"C1",X"4D",X"CB",X"47",X"C2",X"58",X"27",X"3A",X"B6",X"4D",X"A7",X"20",X"1A",X"3A",X"04", + X"4E",X"FE",X"03",X"20",X"13",X"2A",X"0A",X"4D",X"3A",X"2C",X"4D",X"11",X"1D",X"22",X"CD",X"66", + X"29",X"22",X"1E",X"4D",X"32",X"2C",X"4D",X"C9",X"2A",X"0A",X"4D",X"ED",X"5B",X"39",X"4D",X"3A", + X"2C",X"4D",X"CD",X"66",X"29",X"22",X"1E",X"4D",X"32",X"2C",X"4D",X"C9",X"3A",X"C1",X"4D",X"CB", + X"47",X"C2",X"8E",X"27",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13",X"2A",X"0C",X"4D",X"3A",X"2D", + X"4D",X"11",X"1D",X"39",X"CD",X"66",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"ED",X"5B", + X"39",X"4D",X"2A",X"1C",X"4D",X"29",X"29",X"19",X"EB",X"2A",X"0C",X"4D",X"3A",X"2D",X"4D",X"CD", + X"66",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"3A",X"C1",X"4D",X"CB",X"47",X"C2",X"CB", + X"27",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"11",X"40", + X"20",X"CD",X"66",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9",X"ED",X"4B",X"0A",X"4D",X"ED", + X"5B",X"39",X"4D",X"2A",X"1C",X"4D",X"29",X"19",X"7D",X"87",X"91",X"6F",X"7C",X"87",X"90",X"67", + X"EB",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD",X"66",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D", + X"C9",X"3A",X"C1",X"4D",X"CB",X"47",X"C2",X"13",X"28",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13", + X"2A",X"10",X"4D",X"3A",X"2F",X"4D",X"11",X"40",X"3B",X"CD",X"66",X"29",X"22",X"24",X"4D",X"32", + X"2F",X"4D",X"C9",X"DD",X"21",X"39",X"4D",X"FD",X"21",X"10",X"4D",X"CD",X"EA",X"29",X"11",X"40", + X"00",X"A7",X"ED",X"52",X"DA",X"00",X"28",X"2A",X"10",X"4D",X"ED",X"5B",X"39",X"4D",X"3A",X"2F", + X"4D",X"CD",X"66",X"29",X"22",X"24",X"4D",X"32",X"2F",X"4D",X"C9",X"3A",X"AC",X"4D",X"A7",X"CA", + X"55",X"28",X"11",X"2C",X"2E",X"2A",X"0A",X"4D",X"3A",X"2C",X"4D",X"CD",X"66",X"29",X"22",X"1E", + X"4D",X"32",X"2C",X"4D",X"C9",X"2A",X"0A",X"4D",X"3A",X"2C",X"4D",X"CD",X"1E",X"29",X"22",X"1E", + X"4D",X"32",X"2C",X"4D",X"C9",X"3A",X"AD",X"4D",X"A7",X"CA",X"7F",X"28",X"11",X"2C",X"2E",X"2A", + X"0C",X"4D",X"3A",X"2D",X"4D",X"CD",X"66",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"2A", + X"0C",X"4D",X"3A",X"2D",X"4D",X"CD",X"1E",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"3A", + X"AE",X"4D",X"A7",X"CA",X"A9",X"28",X"11",X"2C",X"2E",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD", + X"66",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD", + X"1E",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9",X"3A",X"AF",X"4D",X"A7",X"CA",X"D3",X"28", + X"11",X"2C",X"2E",X"2A",X"10",X"4D",X"3A",X"2F",X"4D",X"CD",X"66",X"29",X"22",X"24",X"4D",X"32", + X"2F",X"4D",X"C9",X"2A",X"10",X"4D",X"3A",X"2F",X"4D",X"CD",X"1E",X"29",X"22",X"24",X"4D",X"32", + X"2F",X"4D",X"C9",X"3A",X"A7",X"4D",X"A7",X"CA",X"FE",X"28",X"2A",X"12",X"4D",X"ED",X"5B",X"0C", + X"4D",X"3A",X"3C",X"4D",X"CD",X"66",X"29",X"22",X"26",X"4D",X"32",X"3C",X"4D",X"C9",X"2A",X"39", + X"4D",X"ED",X"4B",X"0C",X"4D",X"7D",X"87",X"91",X"6F",X"7C",X"87",X"90",X"67",X"EB",X"2A",X"12", + X"4D",X"3A",X"3C",X"4D",X"CD",X"66",X"29",X"22",X"26",X"4D",X"32",X"3C",X"4D",X"C9",X"22",X"3E", + X"4D",X"EE",X"02",X"32",X"3D",X"4D",X"CD",X"23",X"2A",X"E6",X"03",X"21",X"3B",X"4D",X"77",X"87", + X"5F",X"16",X"00",X"DD",X"21",X"FF",X"32",X"DD",X"19",X"FD",X"21",X"3E",X"4D",X"3A",X"3D",X"4D", + X"BE",X"CA",X"57",X"29",X"CD",X"0F",X"20",X"E6",X"C0",X"D6",X"C0",X"28",X"0A",X"DD",X"6E",X"00", + X"DD",X"66",X"01",X"3A",X"3B",X"4D",X"C9",X"DD",X"23",X"DD",X"23",X"21",X"3B",X"4D",X"7E",X"3C", + X"E6",X"03",X"77",X"C3",X"3D",X"29",X"22",X"3E",X"4D",X"ED",X"53",X"40",X"4D",X"32",X"3B",X"4D", + X"EE",X"02",X"32",X"3D",X"4D",X"21",X"FF",X"FF",X"22",X"44",X"4D",X"DD",X"21",X"FF",X"32",X"FD", + X"21",X"3E",X"4D",X"21",X"C7",X"4D",X"36",X"00",X"3A",X"3D",X"4D",X"BE",X"CA",X"C6",X"29",X"CD", + X"00",X"20",X"22",X"42",X"4D",X"CD",X"65",X"00",X"7E",X"E6",X"C0",X"D6",X"C0",X"28",X"27",X"DD", + X"E5",X"FD",X"E5",X"DD",X"21",X"40",X"4D",X"FD",X"21",X"42",X"4D",X"CD",X"EA",X"29",X"FD",X"E1", + X"DD",X"E1",X"EB",X"2A",X"44",X"4D",X"A7",X"ED",X"52",X"DA",X"C6",X"29",X"ED",X"53",X"44",X"4D", + X"3A",X"C7",X"4D",X"32",X"3B",X"4D",X"DD",X"23",X"DD",X"23",X"21",X"C7",X"4D",X"34",X"3E",X"04", + X"BE",X"C2",X"88",X"29",X"3A",X"3B",X"4D",X"87",X"5F",X"16",X"00",X"DD",X"21",X"FF",X"32",X"DD", + X"19",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"CB",X"3F",X"C9",X"DD",X"7E",X"00",X"FD",X"46",X"00", + X"90",X"D2",X"F9",X"29",X"78",X"DD",X"46",X"00",X"90",X"CD",X"12",X"2A",X"E5",X"DD",X"7E",X"01", + X"FD",X"46",X"01",X"90",X"D2",X"0C",X"2A",X"78",X"DD",X"46",X"01",X"90",X"CD",X"12",X"2A",X"C1", + X"09",X"C9",X"67",X"5F",X"2E",X"00",X"55",X"0E",X"08",X"29",X"D2",X"1E",X"2A",X"19",X"0D",X"C2", + X"19",X"2A",X"C9",X"2A",X"C9",X"4D",X"54",X"5D",X"29",X"29",X"19",X"23",X"7C",X"E6",X"1F",X"67", + X"7E",X"22",X"C9",X"4D",X"C9",X"11",X"40",X"40",X"21",X"C0",X"43",X"A7",X"ED",X"52",X"C8",X"1A", + X"FE",X"10",X"CA",X"53",X"2A",X"FE",X"12",X"CA",X"53",X"2A",X"FE",X"14",X"CA",X"53",X"2A",X"13", + X"C3",X"38",X"2A",X"3E",X"40",X"12",X"13",X"C3",X"38",X"2A",X"3A",X"00",X"4E",X"FE",X"01",X"C8", + X"21",X"17",X"2B",X"DF",X"EB",X"CD",X"0B",X"2B",X"7B",X"86",X"27",X"77",X"23",X"7A",X"8E",X"27", + X"77",X"5F",X"23",X"3E",X"00",X"8E",X"27",X"77",X"57",X"EB",X"29",X"29",X"29",X"29",X"3A",X"71", + X"4E",X"3D",X"BC",X"DC",X"33",X"2B",X"CD",X"AF",X"2A",X"13",X"13",X"13",X"21",X"8A",X"4E",X"06", + X"03",X"1A",X"BE",X"D8",X"20",X"05",X"1B",X"2B",X"10",X"F7",X"C9",X"CD",X"0B",X"2B",X"11",X"88", + X"4E",X"01",X"03",X"00",X"ED",X"B0",X"1B",X"01",X"04",X"03",X"21",X"F2",X"43",X"18",X"0F",X"3A", + X"09",X"4E",X"01",X"04",X"03",X"21",X"FC",X"43",X"A7",X"28",X"03",X"21",X"E9",X"43",X"1A",X"0F", + X"0F",X"0F",X"0F",X"CD",X"CE",X"2A",X"1A",X"CD",X"CE",X"2A",X"1B",X"10",X"F1",X"C9",X"E6",X"0F", + X"28",X"04",X"0E",X"00",X"18",X"07",X"79",X"A7",X"28",X"03",X"3E",X"40",X"0D",X"77",X"2B",X"C9", + X"06",X"00",X"CD",X"5E",X"2C",X"AF",X"21",X"80",X"4E",X"06",X"08",X"CF",X"01",X"04",X"03",X"11", + X"82",X"4E",X"21",X"FC",X"43",X"CD",X"BE",X"2A",X"01",X"04",X"03",X"11",X"86",X"4E",X"21",X"E9", + X"43",X"3A",X"70",X"4E",X"A7",X"20",X"B7",X"0E",X"06",X"18",X"B3",X"3A",X"09",X"4E",X"21",X"80", + X"4E",X"A7",X"C8",X"21",X"84",X"4E",X"C9",X"10",X"00",X"50",X"00",X"00",X"02",X"00",X"04",X"00", + X"08",X"00",X"16",X"00",X"01",X"00",X"03",X"00",X"05",X"00",X"07",X"00",X"10",X"00",X"20",X"00", + X"30",X"00",X"50",X"13",X"6B",X"62",X"1B",X"CB",X"46",X"C0",X"CB",X"C6",X"21",X"9C",X"4E",X"CB", + X"C6",X"21",X"14",X"4E",X"34",X"21",X"15",X"4E",X"34",X"46",X"21",X"1A",X"40",X"0E",X"05",X"78", + X"A7",X"28",X"0E",X"FE",X"06",X"30",X"0A",X"3E",X"20",X"CD",X"8F",X"2B",X"2B",X"2B",X"0D",X"10", + X"F6",X"0D",X"F8",X"CD",X"7E",X"2B",X"2B",X"2B",X"18",X"F7",X"3A",X"00",X"4E",X"FE",X"01",X"C8", + X"CD",X"CD",X"2B",X"12",X"44",X"09",X"0A",X"02",X"21",X"15",X"4E",X"46",X"18",X"CC",X"3E",X"40", + X"E5",X"D5",X"77",X"23",X"77",X"11",X"1F",X"00",X"19",X"77",X"23",X"77",X"D1",X"E1",X"C9",X"E5", + X"D5",X"11",X"1F",X"00",X"77",X"3C",X"23",X"77",X"3C",X"19",X"77",X"3C",X"23",X"77",X"D1",X"E1", + X"C9",X"3A",X"6E",X"4E",X"FE",X"FF",X"20",X"05",X"06",X"02",X"C3",X"5E",X"2C",X"06",X"01",X"CD", + X"5E",X"2C",X"3A",X"6E",X"4E",X"E6",X"F0",X"28",X"09",X"0F",X"0F",X"0F",X"0F",X"C6",X"30",X"32", + X"34",X"40",X"3A",X"6E",X"4E",X"E6",X"0F",X"C6",X"30",X"32",X"33",X"40",X"C9",X"E1",X"5E",X"23", + X"56",X"23",X"4E",X"23",X"46",X"23",X"7E",X"23",X"E5",X"EB",X"11",X"20",X"00",X"E5",X"C5",X"71", + X"23",X"10",X"FC",X"C1",X"E1",X"19",X"3D",X"20",X"F4",X"C9",X"3A",X"00",X"4E",X"FE",X"01",X"C8", + X"3A",X"13",X"4E",X"3C",X"FE",X"08",X"D2",X"2E",X"2C",X"11",X"08",X"3B",X"47",X"0E",X"07",X"21", + X"04",X"40",X"1A",X"CD",X"8F",X"2B",X"3E",X"04",X"84",X"67",X"13",X"1A",X"CD",X"80",X"2B",X"3E", + X"FC",X"84",X"67",X"13",X"23",X"23",X"0D",X"10",X"E9",X"0D",X"F8",X"CD",X"7E",X"2B",X"3E",X"04", + X"84",X"67",X"AF",X"CD",X"80",X"2B",X"3E",X"FC",X"84",X"67",X"23",X"23",X"18",X"EB",X"FE",X"13", + X"38",X"02",X"3E",X"13",X"D6",X"07",X"4F",X"06",X"00",X"21",X"08",X"3B",X"09",X"09",X"EB",X"06", + X"07",X"C3",X"FD",X"2B",X"47",X"E6",X"0F",X"C6",X"00",X"27",X"4F",X"78",X"E6",X"F0",X"28",X"0B", + X"0F",X"0F",X"0F",X"0F",X"47",X"AF",X"C6",X"16",X"27",X"10",X"FB",X"81",X"27",X"C9",X"21",X"A5", + X"36",X"DF",X"5E",X"23",X"56",X"DD",X"21",X"00",X"44",X"DD",X"19",X"DD",X"E5",X"11",X"00",X"FC", + X"DD",X"19",X"11",X"FF",X"FF",X"CB",X"7E",X"20",X"03",X"11",X"E0",X"FF",X"23",X"78",X"01",X"00", + X"00",X"87",X"38",X"28",X"7E",X"FE",X"2F",X"28",X"09",X"DD",X"77",X"00",X"23",X"DD",X"19",X"04", + X"18",X"F2",X"23",X"DD",X"E1",X"7E",X"A7",X"FA",X"A4",X"2C",X"7E",X"DD",X"77",X"00",X"23",X"DD", + X"19",X"10",X"F7",X"C9",X"DD",X"77",X"00",X"DD",X"19",X"10",X"F9",X"C9",X"7E",X"FE",X"2F",X"28", + X"0A",X"DD",X"36",X"00",X"40",X"23",X"DD",X"19",X"04",X"18",X"F1",X"23",X"04",X"ED",X"B1",X"18", + X"D2",X"21",X"C8",X"3B",X"DD",X"21",X"CC",X"4E",X"FD",X"21",X"8C",X"4E",X"CD",X"44",X"2D",X"47", + X"3A",X"CC",X"4E",X"A7",X"28",X"04",X"78",X"32",X"91",X"4E",X"21",X"CC",X"3B",X"DD",X"21",X"DC", + X"4E",X"FD",X"21",X"92",X"4E",X"CD",X"44",X"2D",X"47",X"3A",X"DC",X"4E",X"A7",X"28",X"04",X"78", + X"32",X"96",X"4E",X"21",X"D0",X"3B",X"DD",X"21",X"EC",X"4E",X"FD",X"21",X"97",X"4E",X"CD",X"44", + X"2D",X"47",X"3A",X"EC",X"4E",X"A7",X"C8",X"78",X"32",X"9B",X"4E",X"C9",X"21",X"30",X"3B",X"DD", + X"21",X"9C",X"4E",X"FD",X"21",X"8C",X"4E",X"CD",X"EE",X"2D",X"32",X"91",X"4E",X"21",X"40",X"3B", + X"DD",X"21",X"AC",X"4E",X"FD",X"21",X"92",X"4E",X"CD",X"EE",X"2D",X"32",X"96",X"4E",X"21",X"80", + X"3B",X"DD",X"21",X"BC",X"4E",X"FD",X"21",X"97",X"4E",X"CD",X"EE",X"2D",X"32",X"9B",X"4E",X"AF", + X"32",X"90",X"4E",X"C9",X"DD",X"7E",X"00",X"A7",X"CA",X"F4",X"2D",X"4F",X"06",X"08",X"1E",X"80", + X"7B",X"A1",X"20",X"05",X"CB",X"3B",X"10",X"F8",X"C9",X"DD",X"7E",X"02",X"A3",X"20",X"07",X"DD", + X"73",X"02",X"05",X"DF",X"18",X"0C",X"DD",X"35",X"0C",X"C2",X"D7",X"2D",X"DD",X"6E",X"06",X"DD", + X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"FE",X"F0",X"38",X"27",X"21",X"6C", + X"2D",X"E5",X"E6",X"0F",X"E7",X"55",X"2F",X"65",X"2F",X"77",X"2F",X"89",X"2F",X"9B",X"2F",X"0C", + X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C", + X"00",X"0C",X"00",X"AD",X"2F",X"47",X"E6",X"1F",X"28",X"03",X"DD",X"70",X"0D",X"DD",X"4E",X"09", + X"DD",X"7E",X"0B",X"E6",X"08",X"28",X"02",X"0E",X"00",X"DD",X"71",X"0F",X"78",X"07",X"07",X"07", + X"E6",X"07",X"21",X"B0",X"3B",X"D7",X"DD",X"77",X"0C",X"78",X"E6",X"1F",X"28",X"09",X"E6",X"0F", + X"21",X"B8",X"3B",X"D7",X"DD",X"77",X"0E",X"DD",X"6E",X"0E",X"26",X"00",X"DD",X"7E",X"0D",X"E6", + X"10",X"28",X"02",X"3E",X"01",X"DD",X"86",X"04",X"CA",X"E8",X"2E",X"C3",X"E4",X"2E",X"DD",X"7E", + X"00",X"A7",X"20",X"27",X"DD",X"7E",X"02",X"A7",X"C8",X"DD",X"36",X"02",X"00",X"DD",X"36",X"0D", + X"00",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"0F",X"00",X"FD",X"36",X"00",X"00",X"FD",X"36",X"01", + X"00",X"FD",X"36",X"02",X"00",X"FD",X"36",X"03",X"00",X"AF",X"C9",X"4F",X"06",X"08",X"1E",X"80", + X"7B",X"A1",X"20",X"05",X"CB",X"3B",X"10",X"F8",X"C9",X"DD",X"7E",X"02",X"A3",X"20",X"3F",X"DD", + X"73",X"02",X"05",X"78",X"07",X"07",X"07",X"4F",X"06",X"00",X"E5",X"09",X"DD",X"E5",X"D1",X"13", + X"13",X"13",X"01",X"08",X"00",X"ED",X"B0",X"E1",X"DD",X"7E",X"06",X"E6",X"7F",X"DD",X"77",X"0C", + X"DD",X"7E",X"04",X"DD",X"77",X"0E",X"DD",X"7E",X"09",X"47",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F", + X"DD",X"77",X"0B",X"E6",X"08",X"20",X"07",X"DD",X"70",X"0F",X"DD",X"36",X"0D",X"00",X"DD",X"35", + X"0C",X"20",X"5A",X"DD",X"7E",X"08",X"A7",X"28",X"10",X"DD",X"35",X"08",X"20",X"0B",X"7B",X"2F", + X"DD",X"A6",X"00",X"DD",X"77",X"00",X"C3",X"EE",X"2D",X"DD",X"7E",X"06",X"E6",X"7F",X"DD",X"77", + X"0C",X"DD",X"CB",X"06",X"7E",X"28",X"16",X"DD",X"7E",X"05",X"ED",X"44",X"DD",X"77",X"05",X"DD", + X"CB",X"0D",X"46",X"DD",X"CB",X"0D",X"C6",X"28",X"24",X"DD",X"CB",X"0D",X"86",X"DD",X"7E",X"04", + X"DD",X"86",X"07",X"DD",X"77",X"04",X"DD",X"77",X"0E",X"DD",X"7E",X"09",X"DD",X"86",X"0A",X"DD", + X"77",X"09",X"47",X"DD",X"7E",X"0B",X"E6",X"08",X"20",X"03",X"DD",X"70",X"0F",X"DD",X"7E",X"0E", + X"DD",X"86",X"05",X"DD",X"77",X"0E",X"6F",X"26",X"00",X"DD",X"7E",X"03",X"E6",X"70",X"28",X"08", + X"0F",X"0F",X"0F",X"0F",X"47",X"29",X"10",X"FD",X"FD",X"75",X"00",X"7D",X"0F",X"0F",X"0F",X"0F", + X"FD",X"77",X"01",X"FD",X"74",X"02",X"7C",X"0F",X"0F",X"0F",X"0F",X"FD",X"77",X"03",X"DD",X"7E", + X"0B",X"E7",X"22",X"2F",X"26",X"2F",X"2B",X"2F",X"3C",X"2F",X"43",X"2F",X"4A",X"2F",X"4B",X"2F", + X"4C",X"2F",X"4D",X"2F",X"4E",X"2F",X"4F",X"2F",X"50",X"2F",X"51",X"2F",X"52",X"2F",X"53",X"2F", + X"54",X"2F",X"DD",X"7E",X"0F",X"C9",X"DD",X"7E",X"0F",X"18",X"09",X"3A",X"84",X"4C",X"E6",X"01", + X"DD",X"7E",X"0F",X"C0",X"E6",X"0F",X"C8",X"3D",X"DD",X"77",X"0F",X"C9",X"3A",X"84",X"4C",X"E6", + X"03",X"18",X"ED",X"3A",X"84",X"4C",X"E6",X"07",X"18",X"E6",X"C9",X"C9",X"C9",X"C9",X"C9",X"C9", + X"C9",X"C9",X"C9",X"C9",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"DD",X"77",X"06",X"23", + X"7E",X"DD",X"77",X"07",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06", + X"DD",X"74",X"07",X"DD",X"77",X"03",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD", + X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"04",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E", + X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"09",X"C9",X"DD",X"6E",X"06",X"DD",X"66", + X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"0B",X"C9",X"DD",X"7E",X"02", + X"2F",X"DD",X"A6",X"00",X"DD",X"77",X"00",X"C3",X"F4",X"2D",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"83",X"4C", + X"21",X"00",X"00",X"01",X"00",X"10",X"32",X"C0",X"50",X"79",X"86",X"4F",X"7D",X"C6",X"02",X"6F", + X"FE",X"02",X"D2",X"09",X"30",X"24",X"10",X"EE",X"79",X"A7",X"20",X"15",X"32",X"07",X"50",X"7C", + X"FE",X"30",X"C2",X"03",X"30",X"26",X"00",X"2C",X"7D",X"FE",X"02",X"DA",X"03",X"30",X"C3",X"42", + X"30",X"25",X"7C",X"E6",X"F0",X"32",X"07",X"50",X"0F",X"0F",X"0F",X"0F",X"5F",X"06",X"00",X"C3", + X"BD",X"30",X"31",X"54",X"31",X"06",X"FF",X"E1",X"D1",X"48",X"32",X"C0",X"50",X"79",X"A3",X"77", + X"C6",X"33",X"4F",X"2C",X"7D",X"E6",X"0F",X"C2",X"4D",X"30",X"79",X"87",X"87",X"81",X"C6",X"31", + X"4F",X"7D",X"A7",X"C2",X"4D",X"30",X"24",X"15",X"C2",X"4A",X"30",X"3B",X"3B",X"3B",X"3B",X"E1", + X"D1",X"48",X"32",X"C0",X"50",X"79",X"A3",X"4F",X"7E",X"A3",X"B9",X"C2",X"B5",X"30",X"C6",X"33", + X"4F",X"2C",X"7D",X"E6",X"0F",X"C2",X"75",X"30",X"79",X"87",X"87",X"81",X"C6",X"31",X"4F",X"7D", + X"A7",X"C2",X"75",X"30",X"24",X"15",X"C2",X"72",X"30",X"3B",X"3B",X"3B",X"3B",X"78",X"D6",X"10", + X"47",X"10",X"A4",X"F1",X"D1",X"FE",X"44",X"C2",X"45",X"30",X"7B",X"EE",X"F0",X"C2",X"45",X"30", + X"06",X"01",X"C3",X"BD",X"30",X"7B",X"E6",X"01",X"EE",X"01",X"5F",X"06",X"00",X"31",X"C0",X"4F", + X"D9",X"21",X"00",X"4C",X"06",X"04",X"32",X"C0",X"50",X"36",X"00",X"2C",X"20",X"FB",X"24",X"10", + X"F5",X"21",X"00",X"40",X"06",X"04",X"32",X"C0",X"50",X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24", + X"10",X"F4",X"06",X"04",X"32",X"C0",X"50",X"3E",X"0F",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F4", + X"D9",X"10",X"08",X"06",X"23",X"CD",X"5E",X"2C",X"C3",X"74",X"31",X"7B",X"C6",X"30",X"32",X"84", + X"41",X"C5",X"E5",X"06",X"24",X"CD",X"5E",X"2C",X"E1",X"7C",X"FE",X"40",X"2A",X"6C",X"31",X"38", + X"11",X"FE",X"4C",X"2A",X"6E",X"31",X"30",X"0A",X"FE",X"44",X"2A",X"70",X"31",X"38",X"03",X"2A", + X"72",X"31",X"7D",X"32",X"04",X"42",X"7C",X"32",X"64",X"42",X"3A",X"00",X"50",X"47",X"3A",X"40", + X"50",X"B0",X"E6",X"01",X"20",X"11",X"C1",X"79",X"E6",X"0F",X"47",X"79",X"E6",X"F0",X"0F",X"0F", + X"0F",X"0F",X"4F",X"ED",X"43",X"85",X"41",X"32",X"C0",X"50",X"3A",X"40",X"50",X"E6",X"10",X"28", + X"F6",X"C3",X"0B",X"23",X"00",X"4C",X"0F",X"04",X"00",X"4C",X"F0",X"04",X"00",X"40",X"0F",X"04", + X"00",X"40",X"F0",X"04",X"00",X"44",X"0F",X"04",X"00",X"44",X"F0",X"04",X"4F",X"40",X"41",X"57", + X"41",X"56",X"41",X"43",X"21",X"06",X"50",X"3E",X"01",X"77",X"2D",X"20",X"FC",X"AF",X"32",X"03", + X"50",X"D6",X"04",X"D3",X"00",X"31",X"C0",X"4F",X"32",X"C0",X"50",X"AF",X"32",X"00",X"4E",X"3C", + X"32",X"01",X"4E",X"32",X"00",X"50",X"FB",X"3A",X"00",X"50",X"2F",X"47",X"E6",X"E0",X"28",X"05", + X"3E",X"02",X"32",X"9C",X"4E",X"3A",X"40",X"50",X"2F",X"4F",X"E6",X"60",X"28",X"05",X"3E",X"01", + X"32",X"9C",X"4E",X"78",X"B1",X"E6",X"01",X"28",X"05",X"3E",X"08",X"32",X"BC",X"4E",X"78",X"B1", + X"E6",X"02",X"28",X"05",X"3E",X"04",X"32",X"BC",X"4E",X"78",X"B1",X"E6",X"04",X"28",X"05",X"3E", + X"10",X"32",X"BC",X"4E",X"78",X"B1",X"E6",X"08",X"28",X"05",X"3E",X"20",X"32",X"BC",X"4E",X"3A", + X"80",X"50",X"E6",X"03",X"C6",X"25",X"47",X"CD",X"5E",X"2C",X"3A",X"80",X"50",X"0F",X"0F",X"0F", + X"0F",X"E6",X"03",X"FE",X"03",X"20",X"08",X"06",X"2A",X"CD",X"5E",X"2C",X"C3",X"1C",X"32",X"07", + X"5F",X"D5",X"06",X"2B",X"CD",X"5E",X"2C",X"06",X"2E",X"CD",X"5E",X"2C",X"D1",X"16",X"00",X"21", + X"F9",X"32",X"19",X"7E",X"32",X"2A",X"42",X"23",X"7E",X"32",X"4A",X"42",X"3A",X"80",X"50",X"0F", + X"0F",X"E6",X"03",X"C6",X"31",X"FE",X"34",X"20",X"01",X"3C",X"32",X"0C",X"42",X"06",X"29",X"CD", + X"5E",X"2C",X"3A",X"40",X"50",X"07",X"E6",X"01",X"C6",X"2C",X"47",X"CD",X"5E",X"2C",X"3A",X"40", + X"50",X"E6",X"10",X"CA",X"88",X"31",X"AF",X"32",X"00",X"50",X"F3",X"21",X"07",X"50",X"AF",X"77", + X"2D",X"20",X"FC",X"31",X"E2",X"3A",X"06",X"03",X"D9",X"E1",X"D1",X"32",X"C0",X"50",X"C1",X"3E", + X"3C",X"77",X"23",X"72",X"23",X"10",X"F8",X"3B",X"3B",X"C1",X"71",X"23",X"3E",X"3F",X"77",X"23", + X"10",X"F8",X"3B",X"3B",X"1D",X"C2",X"5B",X"32",X"F1",X"D9",X"10",X"DC",X"31",X"C0",X"4F",X"06", + X"08",X"CD",X"ED",X"32",X"10",X"FB",X"32",X"C0",X"50",X"3A",X"40",X"50",X"E6",X"10",X"28",X"F6", + X"3A",X"40",X"50",X"E6",X"60",X"C2",X"4B",X"23",X"06",X"08",X"CD",X"ED",X"32",X"10",X"FB",X"3A", + X"40",X"50",X"E6",X"10",X"C2",X"4B",X"23",X"1E",X"01",X"06",X"04",X"32",X"C0",X"50",X"CD",X"ED", + X"32",X"3A",X"00",X"50",X"A3",X"20",X"F4",X"CD",X"ED",X"32",X"32",X"C0",X"50",X"3A",X"00",X"50", + X"EE",X"FF",X"20",X"F3",X"10",X"E5",X"CB",X"03",X"7B",X"FE",X"10",X"DA",X"A9",X"32",X"21",X"00", + X"40",X"06",X"04",X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F7",X"CD",X"F4",X"3A",X"32", + X"C0",X"50",X"3A",X"40",X"50",X"E6",X"10",X"CA",X"DF",X"32",X"C3",X"4B",X"23",X"32",X"C0",X"50", + X"21",X"00",X"28",X"2B",X"7C",X"B5",X"20",X"FB",X"C9",X"30",X"31",X"35",X"31",X"30",X"32",X"00", + X"FF",X"01",X"00",X"00",X"01",X"FF",X"00",X"00",X"FF",X"01",X"00",X"00",X"01",X"FF",X"00",X"55", + X"2A",X"55",X"2A",X"55",X"55",X"55",X"55",X"55",X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"25", + X"25",X"25",X"25",X"22",X"22",X"22",X"22",X"01",X"01",X"01",X"01",X"58",X"02",X"08",X"07",X"60", + X"09",X"10",X"0E",X"68",X"10",X"70",X"17",X"14",X"19",X"52",X"4A",X"A5",X"94",X"AA",X"2A",X"55", + X"55",X"55",X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"92",X"24",X"25",X"49",X"48",X"24",X"22", + X"91",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"55",X"2A",X"55",X"2A",X"55",X"55",X"55",X"55",X"AA",X"2A",X"55",X"55",X"55", + X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"48",X"24",X"22",X"91",X"21",X"44",X"44",X"08",X"58", + X"02",X"34",X"08",X"D8",X"09",X"B4",X"0F",X"58",X"11",X"08",X"16",X"34",X"17",X"55",X"55",X"55", + X"55",X"D5",X"6A",X"D5",X"6A",X"AA",X"6A",X"55",X"D5",X"55",X"55",X"55",X"55",X"AA",X"2A",X"55", + X"55",X"92",X"24",X"92",X"24",X"22",X"22",X"22",X"22",X"A4",X"01",X"54",X"06",X"F8",X"07",X"A8", + X"0C",X"D4",X"0D",X"84",X"12",X"B0",X"13",X"D5",X"6A",X"D5",X"6A",X"D6",X"5A",X"AD",X"B5",X"D6", + X"5A",X"AD",X"B5",X"D5",X"6A",X"D5",X"6A",X"AA",X"6A",X"55",X"D5",X"92",X"24",X"25",X"49",X"48", + X"24",X"22",X"91",X"A4",X"01",X"54",X"06",X"F8",X"07",X"A8",X"0C",X"D4",X"0D",X"FE",X"FF",X"FF", + X"FF",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"B6",X"6D",X"6D",X"DB",X"6D",X"6D",X"6D", + X"6D",X"D6",X"5A",X"AD",X"B5",X"25",X"25",X"25",X"25",X"92",X"24",X"92",X"24",X"2C",X"01",X"DC", + X"05",X"08",X"07",X"B8",X"0B",X"E4",X"0C",X"FE",X"FF",X"FF",X"FF",X"D5",X"6A",X"D5",X"6A",X"D5", + X"6A",X"D5",X"6A",X"B6",X"6D",X"6D",X"DB",X"6D",X"6D",X"6D",X"6D",X"D6",X"5A",X"AD",X"B5",X"48", + X"24",X"22",X"91",X"92",X"24",X"92",X"24",X"2C",X"01",X"DC",X"05",X"08",X"07",X"B8",X"0B",X"E4", + X"0C",X"FE",X"FF",X"FF",X"FF",X"40",X"FC",X"D0",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2", + X"D4",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"D0",X"D2",X"D2",X"D2",X"D2",X"D6", + X"D8",X"D2",X"D2",X"D2",X"D2",X"D4",X"FC",X"DA",X"09",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC", + X"FC",X"FC",X"FC",X"DA",X"05",X"DE",X"E4",X"05",X"DC",X"FC",X"DA",X"02",X"E6",X"E8",X"EA",X"02", + X"E6",X"EA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"E6", + X"EA",X"02",X"E7",X"EB",X"02",X"E6",X"EA",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"FC",X"E4",X"02", + X"DE",X"E4",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DE", + X"E4",X"05",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"FC",X"E4",X"02",X"DE",X"E4",X"02", + X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"F2",X"E8",X"E8", + X"EA",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"E7",X"E9",X"EB",X"02",X"E7",X"EB",X"02", + X"E7",X"D2",X"D2",X"D2",X"EB",X"02",X"E7",X"D2",X"D2",X"D2",X"EB",X"02",X"E7",X"E9",X"E9",X"E9", + X"EB",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"1B",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02", + X"E6",X"E8",X"F8",X"02",X"F6",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"F8",X"02",X"F6",X"E8",X"E8", + X"E8",X"EA",X"02",X"E6",X"F8",X"02",X"F6",X"E8",X"E8",X"F4",X"E4",X"02",X"DC",X"FC",X"DA",X"02", + X"DE",X"FC",X"E4",X"02",X"F7",X"E9",X"E9",X"F5",X"F3",X"E9",X"E9",X"F9",X"02",X"F7",X"E9",X"E9", + X"E9",X"EB",X"02",X"DE",X"E4",X"02",X"F7",X"E9",X"E9",X"F5",X"E4",X"02",X"DC",X"FC",X"DA",X"02", + X"DE",X"FC",X"E4",X"05",X"DE",X"E4",X"0B",X"DE",X"E4",X"05",X"DE",X"E4",X"02",X"DC",X"FC",X"DA", + X"02",X"DE",X"FC",X"E4",X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"EC",X"D3",X"D3",X"D3",X"EE", + X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA", + X"02",X"E7",X"E9",X"EB",X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"FC",X"FC",X"DA", + X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"DA", + X"06",X"DE",X"E4",X"05",X"F0",X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"E4",X"05",X"DE",X"E4",X"05", + X"DC",X"FC",X"FA",X"E8",X"E8",X"E8",X"EA",X"02",X"DE",X"F2",X"E8",X"E8",X"EA",X"02",X"CE",X"FC", + X"FC",X"FC",X"DA",X"02",X"DE",X"F2",X"E8",X"E8",X"EA",X"02",X"DE",X"F2",X"E8",X"E8",X"EA",X"02", + X"DC",X"00",X"00",X"00",X"00",X"62",X"01",X"02",X"01",X"01",X"01",X"01",X"0C",X"01",X"01",X"04", + X"01",X"01",X"01",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"04",X"03",X"0C",X"03",X"01", + X"01",X"01",X"03",X"04",X"04",X"03",X"0C",X"06",X"03",X"04",X"04",X"03",X"0C",X"06",X"03",X"04", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"04",X"04",X"0F",X"03",X"06",X"04", + X"04",X"0F",X"03",X"06",X"04",X"04",X"01",X"01",X"01",X"0C",X"03",X"01",X"01",X"01",X"03",X"04", + X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"01",X"01", + X"01",X"01",X"03",X"0C",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"08",X"18",X"08",X"18",X"04", + X"01",X"01",X"01",X"01",X"03",X"0C",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"04",X"04",X"03", + X"0C",X"03",X"03",X"03",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"04",X"01",X"01",X"01", + X"0C",X"03",X"01",X"01",X"01",X"03",X"04",X"04",X"0F",X"03",X"06",X"04",X"04",X"0F",X"03",X"06", + X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"04",X"04",X"03",X"0C",X"06", + X"03",X"04",X"04",X"03",X"0C",X"06",X"03",X"04",X"04",X"03",X"0C",X"03",X"01",X"01",X"01",X"03", + X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"01",X"02",X"01",X"01",X"01",X"01",X"0C",X"01", + X"01",X"04",X"01",X"01",X"01",X"13",X"37",X"23",X"37",X"32",X"37",X"41",X"37",X"5A",X"37",X"6A", + X"37",X"7A",X"37",X"86",X"37",X"9D",X"37",X"B1",X"37",X"00",X"3D",X"21",X"3D",X"FD",X"37",X"67", + X"3D",X"E3",X"3D",X"86",X"3D",X"02",X"3E",X"4C",X"38",X"5A",X"38",X"3C",X"3D",X"57",X"3D",X"D3", + X"3D",X"76",X"3D",X"F2",X"3D",X"01",X"00",X"02",X"00",X"03",X"00",X"BC",X"38",X"C4",X"38",X"CE", + X"38",X"D8",X"38",X"E2",X"38",X"EC",X"38",X"F6",X"38",X"00",X"39",X"0A",X"39",X"1A",X"39",X"6F", + X"39",X"2A",X"39",X"58",X"39",X"41",X"39",X"4F",X"3E",X"86",X"39",X"97",X"39",X"B0",X"39",X"BD", + X"39",X"CA",X"39",X"A5",X"3D",X"21",X"3E",X"C4",X"3D",X"40",X"3E",X"95",X"3D",X"11",X"3E",X"B4", + X"3D",X"30",X"3E",X"D4",X"83",X"48",X"49",X"47",X"48",X"40",X"53",X"43",X"4F",X"52",X"45",X"2F", + X"8F",X"2F",X"80",X"3B",X"80",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"40",X"40",X"2F",X"8F", + X"2F",X"80",X"3B",X"80",X"46",X"52",X"45",X"45",X"40",X"50",X"4C",X"41",X"59",X"2F",X"8F",X"2F", + X"80",X"8C",X"02",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"45",X"2F",X"85",X"2F", + X"10",X"10",X"1A",X"1A",X"1A",X"1A",X"1A",X"1A",X"10",X"10",X"8C",X"02",X"50",X"4C",X"41",X"59", + X"45",X"52",X"40",X"54",X"57",X"4F",X"2F",X"85",X"2F",X"80",X"92",X"02",X"47",X"41",X"4D",X"45", + X"40",X"40",X"4F",X"56",X"45",X"52",X"2F",X"81",X"2F",X"80",X"52",X"02",X"52",X"45",X"41",X"44", + X"59",X"5B",X"2F",X"89",X"2F",X"90",X"EE",X"02",X"50",X"55",X"53",X"48",X"40",X"53",X"54",X"41", + X"52",X"54",X"40",X"42",X"55",X"54",X"54",X"4F",X"4E",X"2F",X"87",X"2F",X"80",X"B2",X"02",X"31", + X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"4C",X"59",X"40",X"2F",X"85",X"2F", + X"80",X"B2",X"02",X"31",X"40",X"4F",X"52",X"40",X"32",X"40",X"50",X"4C",X"41",X"59",X"45",X"52", + X"53",X"2F",X"85",X"00",X"2F",X"00",X"80",X"00",X"96",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40", + X"50",X"55",X"43",X"4B",X"4D",X"41",X"4E",X"40",X"46",X"4F",X"52",X"40",X"40",X"40",X"30",X"30", + X"30",X"40",X"5D",X"5E",X"5F",X"2F",X"8E",X"2F",X"80",X"BA",X"02",X"5C",X"40",X"28",X"29",X"2A", + X"2B",X"2C",X"2D",X"2E",X"40",X"31",X"39",X"38",X"30",X"2F",X"83",X"2F",X"80",X"C3",X"02",X"43", + X"48",X"41",X"52",X"41",X"43",X"54",X"45",X"52",X"40",X"3A",X"40",X"4E",X"49",X"43",X"4B",X"4E", + X"41",X"4D",X"45",X"2F",X"8F",X"2F",X"80",X"65",X"01",X"26",X"41",X"4B",X"41",X"42",X"45",X"49", + X"26",X"2F",X"81",X"2F",X"80",X"45",X"01",X"26",X"4D",X"41",X"43",X"4B",X"59",X"26",X"2F",X"81", + X"2F",X"80",X"48",X"01",X"26",X"50",X"49",X"4E",X"4B",X"59",X"26",X"2F",X"83",X"2F",X"80",X"48", + X"01",X"26",X"4D",X"49",X"43",X"4B",X"59",X"26",X"2F",X"83",X"2F",X"80",X"76",X"02",X"10",X"40", + X"31",X"30",X"40",X"5D",X"5E",X"5F",X"2F",X"9F",X"2F",X"80",X"78",X"02",X"14",X"40",X"35",X"30", + X"40",X"5D",X"5E",X"5F",X"2F",X"9F",X"2F",X"80",X"5D",X"02",X"28",X"29",X"2A",X"2B",X"2C",X"2D", + X"2E",X"2F",X"83",X"2F",X"80",X"C5",X"02",X"40",X"4F",X"49",X"4B",X"41",X"4B",X"45",X"3B",X"3B", + X"3B",X"3B",X"2F",X"81",X"2F",X"80",X"C5",X"02",X"40",X"55",X"52",X"43",X"48",X"49",X"4E",X"3B", + X"3B",X"3B",X"3B",X"3B",X"2F",X"81",X"2F",X"80",X"C8",X"02",X"40",X"4D",X"41",X"43",X"48",X"49", + X"42",X"55",X"53",X"45",X"3B",X"3B",X"2F",X"83",X"2F",X"80",X"C8",X"02",X"40",X"52",X"4F",X"4D", + X"50",X"3B",X"3B",X"3B",X"3B",X"3B",X"3B",X"3B",X"2F",X"83",X"2F",X"80",X"12",X"02",X"81",X"85", + X"2F",X"83",X"2F",X"90",X"32",X"02",X"40",X"82",X"85",X"40",X"2F",X"83",X"2F",X"90",X"32",X"02", + X"40",X"83",X"85",X"40",X"2F",X"83",X"2F",X"90",X"32",X"02",X"40",X"84",X"85",X"40",X"2F",X"83", + X"2F",X"90",X"32",X"02",X"40",X"86",X"8D",X"8E",X"2F",X"83",X"2F",X"90",X"32",X"02",X"87",X"88", + X"8D",X"8E",X"2F",X"83",X"2F",X"90",X"32",X"02",X"89",X"8A",X"8D",X"8E",X"2F",X"83",X"2F",X"90", + X"32",X"02",X"8B",X"8C",X"8D",X"8E",X"2F",X"83",X"2F",X"90",X"04",X"03",X"4D",X"45",X"4D",X"4F", + X"52",X"59",X"40",X"40",X"4F",X"4B",X"2F",X"8F",X"2F",X"80",X"04",X"03",X"42",X"41",X"44",X"40", + X"40",X"40",X"40",X"52",X"40",X"4D",X"2F",X"8F",X"2F",X"80",X"08",X"03",X"31",X"40",X"43",X"4F", + X"49",X"4E",X"40",X"40",X"31",X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"2F",X"8F",X"2F", + X"80",X"08",X"03",X"32",X"40",X"43",X"4F",X"49",X"4E",X"53",X"40",X"31",X"40",X"43",X"52",X"45", + X"44",X"49",X"54",X"40",X"2F",X"8F",X"2F",X"80",X"08",X"03",X"31",X"40",X"43",X"4F",X"49",X"4E", + X"40",X"40",X"32",X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"53",X"2F",X"8F",X"2F",X"80",X"08", + X"03",X"46",X"52",X"45",X"45",X"40",X"40",X"50",X"4C",X"41",X"59",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"2F",X"8F",X"2F",X"80",X"0A",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"4E", + X"4F",X"4E",X"45",X"2F",X"8F",X"2F",X"80",X"0A",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"2F", + X"8F",X"2F",X"80",X"0C",X"03",X"50",X"55",X"43",X"4B",X"4D",X"41",X"4E",X"2F",X"8F",X"2F",X"80", + X"0E",X"03",X"54",X"41",X"42",X"4C",X"45",X"40",X"40",X"2F",X"8F",X"2F",X"80",X"0E",X"03",X"55", + X"50",X"52",X"49",X"47",X"48",X"54",X"2F",X"8F",X"2F",X"80",X"0A",X"02",X"30",X"30",X"30",X"2F", + X"8F",X"2F",X"80",X"6B",X"01",X"26",X"41",X"4F",X"53",X"55",X"4B",X"45",X"26",X"2F",X"85",X"2F", + X"80",X"4B",X"01",X"26",X"4D",X"55",X"43",X"4B",X"59",X"26",X"2F",X"85",X"2F",X"80",X"6E",X"01", + X"26",X"47",X"55",X"5A",X"55",X"54",X"41",X"26",X"2F",X"87",X"2F",X"80",X"4E",X"01",X"26",X"4D", + X"4F",X"43",X"4B",X"59",X"26",X"2F",X"87",X"2F",X"80",X"CB",X"02",X"40",X"4B",X"49",X"4D",X"41", + X"47",X"55",X"52",X"45",X"3B",X"3B",X"2F",X"85",X"2F",X"80",X"CB",X"02",X"40",X"53",X"54",X"59", + X"4C",X"49",X"53",X"54",X"3B",X"3B",X"3B",X"3B",X"2F",X"85",X"2F",X"80",X"CE",X"02",X"40",X"4F", + X"54",X"4F",X"42",X"4F",X"4B",X"45",X"3B",X"3B",X"3B",X"2F",X"87",X"2F",X"80",X"CE",X"02",X"40", + X"43",X"52",X"59",X"42",X"41",X"42",X"59",X"3B",X"3B",X"3B",X"3B",X"2F",X"87",X"2F",X"80",X"01", + X"01",X"03",X"01",X"01",X"01",X"03",X"02",X"02",X"02",X"01",X"01",X"01",X"01",X"02",X"04",X"04", + X"04",X"06",X"02",X"02",X"02",X"02",X"04",X"02",X"04",X"04",X"04",X"06",X"02",X"02",X"02",X"02", + X"01",X"01",X"01",X"01",X"02",X"04",X"04",X"04",X"06",X"02",X"02",X"02",X"02",X"06",X"04",X"05", + X"01",X"01",X"03",X"01",X"01",X"01",X"04",X"01",X"01",X"01",X"03",X"01",X"01",X"04",X"01",X"01", + X"01",X"6C",X"05",X"01",X"01",X"01",X"18",X"04",X"04",X"18",X"05",X"01",X"01",X"01",X"17",X"02", + X"03",X"04",X"16",X"04",X"03",X"01",X"01",X"01",X"76",X"01",X"01",X"01",X"01",X"03",X"01",X"01", + X"01",X"02",X"04",X"02",X"04",X"0E",X"02",X"04",X"02",X"04",X"02",X"04",X"0B",X"01",X"01",X"01", + X"02",X"04",X"02",X"01",X"01",X"01",X"01",X"02",X"02",X"02",X"0E",X"02",X"04",X"02",X"04",X"02", + X"01",X"02",X"01",X"0A",X"01",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"03",X"01",X"01",X"03", + X"04",X"00",X"02",X"40",X"01",X"3E",X"3D",X"10",X"40",X"40",X"0E",X"3D",X"3E",X"10",X"C2",X"43", + X"01",X"3E",X"3D",X"10",X"21",X"A2",X"40",X"11",X"4F",X"3A",X"36",X"14",X"1A",X"A7",X"C8",X"13", + X"85",X"6F",X"D2",X"FA",X"3A",X"24",X"18",X"F2",X"90",X"14",X"94",X"0F",X"98",X"15",X"98",X"15", + X"A0",X"14",X"A0",X"14",X"A4",X"17",X"A4",X"17",X"A8",X"09",X"A8",X"09",X"9C",X"16",X"9C",X"16", + X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16", + X"73",X"20",X"00",X"0C",X"00",X"0A",X"1F",X"00",X"72",X"20",X"FB",X"87",X"00",X"02",X"0F",X"00", + X"36",X"20",X"04",X"8C",X"00",X"00",X"06",X"00",X"36",X"28",X"05",X"8B",X"00",X"00",X"06",X"00", + X"36",X"30",X"06",X"8A",X"00",X"00",X"06",X"00",X"36",X"3C",X"07",X"89",X"00",X"00",X"06",X"00", + X"36",X"48",X"08",X"88",X"00",X"00",X"06",X"00",X"24",X"00",X"06",X"08",X"00",X"00",X"0A",X"00", + X"40",X"70",X"FA",X"10",X"00",X"00",X"0A",X"00",X"70",X"04",X"00",X"00",X"00",X"00",X"08",X"00", + X"42",X"18",X"FD",X"06",X"00",X"01",X"0C",X"00",X"42",X"04",X"03",X"06",X"00",X"01",X"0C",X"00", + X"56",X"0C",X"FF",X"8C",X"00",X"02",X"0F",X"00",X"05",X"00",X"02",X"20",X"00",X"01",X"0C",X"00", + X"41",X"20",X"FF",X"86",X"FE",X"1C",X"0F",X"FF",X"70",X"00",X"01",X"0C",X"00",X"01",X"08",X"00", + X"01",X"02",X"04",X"08",X"10",X"20",X"40",X"80",X"00",X"57",X"5C",X"61",X"67",X"6D",X"74",X"7B", + X"82",X"8A",X"92",X"9A",X"A3",X"AD",X"B8",X"C3",X"D4",X"3B",X"F3",X"3B",X"58",X"3C",X"95",X"3C", + X"DE",X"3C",X"DF",X"3C",X"F1",X"02",X"F2",X"03",X"F3",X"0F",X"F4",X"01",X"82",X"70",X"69",X"82", + X"70",X"69",X"83",X"70",X"6A",X"83",X"70",X"6A",X"82",X"70",X"69",X"82",X"70",X"69",X"89",X"8B", + X"8D",X"8E",X"FF",X"F1",X"02",X"F2",X"03",X"F3",X"0F",X"F4",X"01",X"67",X"50",X"30",X"47",X"30", + X"67",X"50",X"30",X"47",X"30",X"67",X"50",X"30",X"47",X"30",X"4B",X"10",X"4C",X"10",X"4D",X"10", + X"4E",X"10",X"67",X"50",X"30",X"47",X"30",X"67",X"50",X"30",X"47",X"30",X"67",X"50",X"30",X"47", + X"30",X"4B",X"10",X"4C",X"10",X"4D",X"10",X"4E",X"10",X"67",X"50",X"30",X"47",X"30",X"67",X"50", + X"30",X"47",X"30",X"67",X"50",X"30",X"47",X"30",X"4B",X"10",X"4C",X"10",X"4D",X"10",X"4E",X"10", + X"77",X"20",X"4E",X"10",X"4D",X"10",X"4C",X"10",X"4A",X"10",X"47",X"10",X"46",X"10",X"65",X"30", + X"66",X"30",X"67",X"40",X"70",X"F0",X"FB",X"3B",X"F1",X"00",X"F2",X"02",X"F3",X"0F",X"F4",X"00", + X"42",X"50",X"4E",X"50",X"49",X"50",X"46",X"50",X"4E",X"49",X"70",X"66",X"70",X"43",X"50",X"4F", + X"50",X"4A",X"50",X"47",X"50",X"4F",X"4A",X"70",X"67",X"70",X"42",X"50",X"4E",X"50",X"49",X"50", + X"46",X"50",X"4E",X"49",X"70",X"66",X"70",X"45",X"46",X"47",X"50",X"47",X"48",X"49",X"50",X"49", + X"4A",X"4B",X"50",X"6E",X"FF",X"F1",X"01",X"F2",X"01",X"F3",X"0F",X"F4",X"00",X"26",X"67",X"26", + X"67",X"26",X"67",X"23",X"44",X"42",X"47",X"30",X"67",X"2A",X"8B",X"70",X"26",X"67",X"26",X"67", + X"26",X"67",X"23",X"44",X"42",X"47",X"30",X"67",X"23",X"84",X"70",X"26",X"67",X"26",X"67",X"26", + X"67",X"23",X"44",X"42",X"47",X"30",X"67",X"29",X"6A",X"2B",X"6C",X"30",X"2C",X"6D",X"40",X"2B", + X"6C",X"29",X"6A",X"67",X"20",X"29",X"6A",X"40",X"26",X"87",X"70",X"F0",X"9D",X"3C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"96",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"50",X"41",X"43",X"3B",X"4D",X"41",X"4E",X"40", + X"46",X"4F",X"52",X"40",X"40",X"40",X"30",X"30",X"30",X"40",X"5D",X"5E",X"5F",X"2F",X"8E",X"2F", + X"80",X"3A",X"03",X"5C",X"40",X"31",X"39",X"38",X"30",X"40",X"4D",X"49",X"44",X"57",X"41",X"59", + X"40",X"4D",X"46",X"47",X"25",X"43",X"4F",X"25",X"2F",X"83",X"2F",X"80",X"3D",X"03",X"5C",X"40", + X"31",X"39",X"38",X"30",X"40",X"4D",X"49",X"44",X"57",X"41",X"59",X"40",X"4D",X"46",X"47",X"25", + X"43",X"4F",X"25",X"2F",X"83",X"2F",X"80",X"C5",X"02",X"3B",X"53",X"48",X"41",X"44",X"4F",X"57", + X"40",X"40",X"40",X"2F",X"81",X"2F",X"80",X"65",X"01",X"26",X"42",X"4C",X"49",X"4E",X"4B",X"59", + X"26",X"40",X"2F",X"81",X"2F",X"80",X"C8",X"02",X"3B",X"53",X"50",X"45",X"45",X"44",X"59",X"40", + X"40",X"40",X"2F",X"83",X"2F",X"80",X"68",X"01",X"26",X"50",X"49",X"4E",X"4B",X"59",X"26",X"40", + X"40",X"2F",X"83",X"2F",X"80",X"CB",X"02",X"3B",X"42",X"41",X"53",X"48",X"46",X"55",X"4C",X"40", + X"40",X"2F",X"85",X"2F",X"80",X"6B",X"01",X"26",X"49",X"4E",X"4B",X"59",X"26",X"40",X"40",X"40", + X"2F",X"85",X"2F",X"80",X"CE",X"02",X"3B",X"50",X"4F",X"4B",X"45",X"59",X"40",X"40",X"40",X"40", + X"2F",X"87",X"2F",X"80",X"6E",X"01",X"26",X"43",X"4C",X"59",X"44",X"45",X"26",X"40",X"40",X"2F", + X"87",X"2F",X"80",X"C5",X"02",X"3B",X"41",X"41",X"41",X"41",X"41",X"41",X"41",X"41",X"3B",X"2F", + X"81",X"2F",X"80",X"65",X"01",X"26",X"42",X"42",X"42",X"42",X"42",X"42",X"42",X"26",X"2F",X"81", + X"2F",X"80",X"C8",X"02",X"3B",X"43",X"43",X"43",X"43",X"43",X"43",X"43",X"43",X"3B",X"2F",X"83", + X"2F",X"80",X"68",X"01",X"26",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"26",X"2F",X"83",X"2F", + X"80",X"CB",X"02",X"3B",X"45",X"45",X"45",X"45",X"45",X"45",X"45",X"45",X"3B",X"2F",X"85",X"2F", + X"80",X"6B",X"01",X"26",X"46",X"46",X"46",X"46",X"46",X"46",X"46",X"26",X"2F",X"85",X"2F",X"80", + X"CE",X"02",X"3B",X"47",X"47",X"47",X"47",X"47",X"47",X"47",X"47",X"3B",X"2F",X"87",X"2F",X"80", + X"6E",X"01",X"26",X"48",X"48",X"48",X"48",X"48",X"48",X"48",X"26",X"2F",X"87",X"2F",X"80",X"0C", + X"03",X"50",X"41",X"43",X"3B",X"4D",X"41",X"4E",X"2F",X"8F",X"2F",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"8D",X"00",X"75",X"73"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..3e443f07 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,790 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 12287) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"53",X"22",X"00",X"10",X"5B",X"74",X"89",X"44",X"95",X"5A",X"53",X"17",X"F0",X"AC",X"E4",X"00", + X"5C",X"A8",X"53",X"17",X"D8",X"EC",X"3F",X"DE",X"17",X"AA",X"A8",X"3F",X"C4",X"22",X"10",X"22", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"E4",X"68",X"5A",X"5B",X"32",X"8B",X"5B",X"3C", + X"5C",X"AC",X"00",X"EC",X"EC",X"82",X"D2",X"02",X"22",X"00",X"10",X"17",X"F8",X"89",X"5C",X"FB", + X"C0",X"BD",X"B5",X"9E",X"B1",X"91",X"00",X"42",X"89",X"B7",X"CA",X"0D",X"B5",X"D0",X"B1",X"A0", + X"B5",X"FE",X"BD",X"B5",X"60",X"BD",X"B3",X"00",X"00",X"42",X"B5",X"FE",X"BD",X"B5",X"28",X"BD", + X"A9",X"B7",X"E0",X"0D",X"B5",X"80",X"BD",X"B5",X"FF",X"B5",X"D4",X"BD",X"B3",X"00",X"30",X"B7", + X"28",X"B1",X"81",X"00",X"42",X"B5",X"FE",X"BD",X"4B",X"0D",X"B5",X"FE",X"B1",X"44",X"00",X"8C", + X"66",X"0B",X"54",X"0B",X"72",X"0B",X"F8",X"0B",X"43",X"09",X"F8",X"0B",X"89",X"0B",X"90",X"05", + X"92",X"09",X"7A",X"09",X"5F",X"09",X"FB",X"09",X"90",X"05",X"90",X"05",X"90",X"05",X"90",X"05", + X"90",X"05",X"90",X"05",X"90",X"05",X"90",X"05",X"FF",X"B3",X"00",X"00",X"B7",X"BA",X"0D",X"B5", + X"90",X"05",X"90",X"05",X"08",X"0D",X"90",X"05",X"02",X"B1",X"00",X"00",X"8C",X"B3",X"EB",X"94", + X"00",X"B1",X"0E",X"FF",X"B3",X"00",X"89",X"B7",X"B5",X"FE",X"BD",X"FF",X"C6",X"C6",X"C2",X"C2", + X"12",X"0D",X"B5",X"B4",X"B1",X"80",X"00",X"42",X"C6",X"C6",X"A4",X"A4",X"FF",X"C7",X"C7",X"C3", + X"FF",X"AF",X"AF",X"6B",X"6B",X"AF",X"AF",X"6F",X"B7",X"B7",X"FF",X"A8",X"A8",X"A2",X"A2",X"A8", + X"6F",X"FF",X"AC",X"AC",X"B3",X"B3",X"AC",X"AC",X"A8",X"A6",X"A6",X"FF",X"29",X"29",X"29",X"2B", + X"6F",X"A4",X"99",X"5A",X"53",X"00",X"00",X"24",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"64",X"80",X"5A",X"5B",X"DC",X"8B",X"82",X"10",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"B3",X"FF",X"FE",X"B7",X"E0",X"0D",X"B5",X"D0",X"20",X"BD",X"B3",X"00",X"98",X"B7",X"CA",X"0D", + X"B1",X"91",X"00",X"42",X"B5",X"FE",X"BD",X"B5",X"B5",X"20",X"B1",X"B0",X"00",X"42",X"B3",X"FF", + X"B5",X"FE",X"B1",X"80",X"00",X"8C",X"B5",X"A0",X"B3",X"00",X"30",X"B7",X"4F",X"0D",X"B5",X"74", + X"B1",X"80",X"00",X"8C",X"FF",X"B5",X"7E",X"BD",X"B1",X"44",X"00",X"8C",X"B5",X"FE",X"B1",X"80", + X"90",X"05",X"A1",X"0B",X"90",X"05",X"90",X"05",X"59",X"0B",X"90",X"05",X"90",X"05",X"90",X"05", + X"90",X"05",X"90",X"05",X"90",X"05",X"90",X"05",X"90",X"05",X"90",X"05",X"90",X"05",X"71",X"0B", + X"B5",X"60",X"BD",X"B5",X"8C",X"B1",X"00",X"00",X"88",X"0D",X"B5",X"FE",X"B1",X"B1",X"00",X"42", + X"8C",X"B5",X"8C",X"BD",X"B3",X"FF",X"98",X"B7",X"B5",X"FE",X"B1",X"B1",X"00",X"42",X"B3",X"00", + X"C3",X"C7",X"C7",X"A5",X"A5",X"FF",X"7C",X"7C",X"7D",X"D5",X"D5",X"7D",X"7D",X"B5",X"B5",X"FF", + X"D4",X"D4",X"7C",X"7C",X"B4",X"B4",X"FF",X"7D",X"AE",X"AE",X"6A",X"6A",X"AE",X"AE",X"6E",X"6E", + X"2B",X"2B",X"FF",X"28",X"28",X"28",X"2A",X"2A",X"FF",X"CE",X"FF",X"CC",X"FF",X"80",X"80",X"80", + X"2A",X"FF",X"2C",X"2C",X"2C",X"2E",X"2E",X"2E",X"88",X"88",X"88",X"8C",X"8C",X"8C",X"FF",X"82", + X"00",X"10",X"17",X"03",X"89",X"5C",X"FB",X"22",X"5A",X"5B",X"32",X"8B",X"5B",X"3C",X"62",X"24", + X"AC",X"4A",X"CC",X"53",X"17",X"C9",X"0D",X"53",X"A4",X"93",X"5A",X"22",X"69",X"5C",X"57",X"BD", + X"F0",X"FD",X"04",X"EC",X"CE",X"17",X"01",X"8B",X"95",X"17",X"8F",X"8F",X"DB",X"22",X"59",X"5C", + X"5A",X"17",X"1B",X"0D",X"53",X"E0",X"40",X"CC",X"42",X"0E",X"FB",X"AA",X"00",X"53",X"0C",X"C2", + X"00",X"8C",X"B5",X"E4",X"B1",X"80",X"00",X"8C",X"00",X"8C",X"B3",X"EB",X"34",X"B5",X"D4",X"BD", + X"FF",X"B7",X"43",X"0D",X"B5",X"02",X"B1",X"00",X"B3",X"0A",X"30",X"B7",X"C1",X"0D",X"B5",X"FE", + X"06",X"8C",X"B7",X"C5",X"0D",X"B5",X"02",X"B1",X"00",X"00",X"B7",X"BA",X"0D",X"B5",X"02",X"B1", + X"00",X"00",X"8C",X"B5",X"20",X"BD",X"FF",X"B3",X"00",X"00",X"8C",X"B3",X"EB",X"94",X"B5",X"60", + X"FE",X"B7",X"CA",X"0D",X"B5",X"BA",X"B1",X"80",X"B7",X"2C",X"0D",X"B5",X"A0",X"B1",X"00",X"B1", + X"00",X"42",X"B5",X"08",X"B1",X"80",X"B1",X"42",X"42",X"B7",X"CA",X"0D",X"B5",X"80",X"B1",X"00", + X"98",X"B7",X"D8",X"0D",X"B5",X"6E",X"BD",X"B5",X"79",X"00",X"0A",X"B3",X"00",X"FE",X"B7",X"36", + X"B0",X"B1",X"7F",X"00",X"0A",X"B5",X"B8",X"B1",X"0D",X"B5",X"C8",X"BD",X"B5",X"D0",X"B1",X"8C", + X"82",X"82",X"8A",X"8A",X"8A",X"8E",X"8E",X"8E",X"C0",X"C0",X"C0",X"68",X"68",X"68",X"68",X"FF", + X"FF",X"84",X"FF",X"86",X"FF",X"A0",X"FF",X"C0",X"0E",X"FF",X"4E",X"FF",X"E4",X"42",X"5A",X"3D", + X"A8",X"A4",X"44",X"58",X"53",X"E4",X"42",X"5A",X"1E",X"20",X"04",X"EC",X"AA",X"A4",X"44",X"58", + X"3D",X"0E",X"57",X"EE",X"CC",X"69",X"07",X"57",X"53",X"E4",X"40",X"5A",X"3D",X"0E",X"57",X"EE", + X"40",X"5C",X"17",X"72",X"A8",X"ED",X"24",X"48",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"40",X"5A",X"82",X"89",X"01",X"17",X"C0",X"41",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"83",X"5C",X"22",X"FA",X"8D",X"DB",X"22",X"D9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"37",X"8B",X"23",X"66",X"BA",X"2C",X"A5",X"2C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"B1",X"44",X"00",X"8C",X"B5",X"FE",X"B1",X"0C",X"B5",X"48",X"B1",X"06",X"42",X"8C",X"B5",X"0A", + X"48",X"8C",X"B5",X"0C",X"B1",X"0C",X"B1",X"8C",X"B1",X"0A",X"BD",X"8C",X"B5",X"44",X"B1",X"08", + X"BD",X"B5",X"8C",X"B1",X"00",X"00",X"8C",X"B5",X"B5",X"02",X"B1",X"00",X"00",X"42",X"B3",X"11", + X"8C",X"BD",X"B3",X"00",X"00",X"B7",X"E0",X"0D",X"11",X"B5",X"A0",X"BD",X"FF",X"B3",X"00",X"00", + X"00",X"42",X"FF",X"B3",X"00",X"00",X"B7",X"FE",X"6B",X"94",X"B5",X"60",X"BD",X"B5",X"8C",X"B1", + X"0D",X"B5",X"02",X"B1",X"00",X"00",X"8C",X"B3",X"00",X"00",X"8C",X"B5",X"8C",X"BD",X"B3",X"FF", + X"00",X"0A",X"BB",X"80",X"B5",X"0C",X"B1",X"F1",X"B5",X"0C",X"B1",X"F1",X"F1",X"0A",X"B5",X"0C", + X"F1",X"0A",X"B5",X"0C",X"B1",X"F1",X"40",X"0A",X"B1",X"F1",X"40",X"0A",X"B3",X"00",X"00",X"B7", + X"0E",X"57",X"EE",X"6E",X"CC",X"A0",X"07",X"57",X"53",X"E4",X"40",X"5A",X"3D",X"0E",X"57",X"EE", + X"1E",X"20",X"04",X"EC",X"AE",X"A4",X"44",X"58",X"CC",X"A0",X"07",X"57",X"1E",X"20",X"04",X"EC", + X"6E",X"CC",X"B9",X"07",X"57",X"1E",X"20",X"04",X"5A",X"2F",X"11",X"E4",X"99",X"5A",X"2F",X"55", + X"EC",X"AC",X"A4",X"44",X"58",X"53",X"E4",X"29",X"1E",X"0F",X"E4",X"95",X"5A",X"2F",X"55",X"1E", + X"40",X"00",X"8C",X"00",X"02",X"00",X"04",X"00",X"90",X"00",X"90",X"86",X"76",X"34",X"C6",X"57", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"A4",X"E9",X"5C",X"C0",X"0C",X"A4",X"59",X"5C", + X"A8",X"5C",X"17",X"79",X"89",X"7B",X"21",X"82",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"17",X"7E",X"AC",X"00",X"04",X"53",X"6F",X"04",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"B7",X"FE",X"0D",X"B5",X"02",X"B1",X"00",X"00",X"8C",X"B1",X"00",X"00",X"8C",X"B5",X"8C",X"BD", + X"8C",X"B3",X"6B",X"94",X"B5",X"60",X"BD",X"B5",X"B3",X"00",X"00",X"B7",X"88",X"0D",X"B5",X"02", + X"00",X"00",X"8C",X"B5",X"8C",X"BD",X"B3",X"00",X"B5",X"02",X"B1",X"00",X"00",X"8C",X"B3",X"6B", + X"00",X"FF",X"B3",X"00",X"00",X"B7",X"FE",X"0D",X"94",X"B5",X"60",X"BD",X"B5",X"8C",X"B1",X"00", + X"B6",X"0D",X"B5",X"02",X"B1",X"00",X"00",X"06",X"06",X"FF",X"B5",X"D4",X"BD",X"B3",X"00",X"29", + X"B3",X"FE",X"E4",X"B5",X"10",X"B1",X"00",X"00",X"B7",X"12",X"0D",X"B5",X"FE",X"B1",X"80",X"00", + X"B1",X"42",X"B7",X"E0",X"0D",X"B5",X"80",X"B1",X"02",X"29",X"B7",X"36",X"0D",X"B5",X"6E",X"BD", + X"00",X"00",X"42",X"FF",X"B5",X"DE",X"BD",X"B3",X"B5",X"B0",X"B1",X"82",X"00",X"06",X"B5",X"B8", + X"0F",X"E4",X"12",X"58",X"1E",X"22",X"12",X"41",X"5A",X"22",X"12",X"58",X"A8",X"FC",X"3D",X"4E", + X"DF",X"7B",X"D6",X"95",X"5A",X"C2",X"24",X"95",X"11",X"22",X"10",X"58",X"AA",X"F5",X"AB",X"0F", + X"0E",X"0E",X"0E",X"A4",X"12",X"58",X"53",X"E4",X"A1",X"11",X"22",X"4A",X"5C",X"17",X"D6",X"0F", + X"4C",X"5C",X"FD",X"10",X"55",X"D0",X"0F",X"FD",X"22",X"48",X"5C",X"FC",X"2F",X"11",X"A8",X"E4", + X"18",X"17",X"28",X"8B",X"20",X"04",X"EC",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"B6",X"04",X"17",X"5C",X"AC",X"48",X"DB",X"AA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"2F",X"7B",X"94",X"11",X"6F",X"00",X"E8",X"A4",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"B1",X"00",X"00",X"42",X"B3",X"91",X"11",X"B5",X"0D",X"B5",X"02",X"B1",X"00",X"00",X"8C",X"B3", + X"A0",X"BD",X"FF",X"B3",X"00",X"00",X"B7",X"BA",X"EB",X"94",X"B5",X"60",X"BD",X"B5",X"8C",X"B1", + X"00",X"8C",X"B5",X"8C",X"BD",X"B3",X"00",X"00",X"00",X"8C",X"B3",X"EB",X"34",X"B5",X"D4",X"BD", + X"FF",X"B7",X"43",X"0D",X"B5",X"02",X"B1",X"00",X"B3",X"00",X"00",X"FF",X"B7",X"47",X"0D",X"B5", + X"42",X"B5",X"FE",X"B1",X"80",X"00",X"42",X"B3",X"B1",X"00",X"42",X"B5",X"08",X"B1",X"B1",X"B1", + X"FF",X"FE",X"B7",X"E0",X"0D",X"B5",X"BC",X"B1",X"42",X"B7",X"54",X"0D",X"B5",X"A0",X"B1",X"00", + X"B1",X"88",X"00",X"06",X"B3",X"FF",X"FE",X"B7",X"75",X"00",X"06",X"B5",X"0C",X"B1",X"40",X"F1", + X"D8",X"0D",X"B5",X"C8",X"BD",X"B5",X"D0",X"B1",X"06",X"B5",X"0C",X"B1",X"40",X"40",X"06",X"B5", + X"FC",X"9E",X"57",X"EE",X"57",X"EE",X"22",X"E9",X"EC",X"06",X"25",X"60",X"0E",X"57",X"E2",X"57", + X"5C",X"57",X"7D",X"64",X"14",X"58",X"9F",X"5E",X"E2",X"EA",X"20",X"F3",X"EC",X"06",X"23",X"0E", + X"86",X"5C",X"FD",X"0E",X"E0",X"44",X"0C",X"0E",X"22",X"CB",X"0F",X"1E",X"0F",X"01",X"9F",X"A4", + X"7B",X"DE",X"3D",X"CE",X"81",X"A0",X"FB",X"01",X"48",X"58",X"26",X"FC",X"A4",X"4A",X"58",X"26", + X"3B",X"22",X"38",X"10",X"17",X"08",X"8B",X"7B",X"64",X"4C",X"5A",X"5B",X"D2",X"8B",X"82",X"10", + X"53",X"17",X"A3",X"0D",X"53",X"0E",X"FD",X"0C",X"2D",X"57",X"1F",X"BE",X"53",X"17",X"7D",X"0D", + X"C4",X"17",X"17",X"8B",X"0C",X"0C",X"DB",X"22",X"E4",X"86",X"5C",X"E8",X"17",X"87",X"0F",X"6C", + X"40",X"5A",X"17",X"D3",X"0D",X"53",X"E0",X"0A",X"5C",X"17",X"23",X"89",X"00",X"22",X"08",X"5C", + X"02",X"B1",X"00",X"00",X"8C",X"B3",X"6B",X"34",X"B3",X"00",X"00",X"FF",X"B3",X"00",X"89",X"B7", + X"B5",X"E2",X"BD",X"BF",X"B5",X"CC",X"BD",X"F1",X"36",X"0D",X"B5",X"B0",X"B1",X"80",X"00",X"02", + X"00",X"06",X"B7",X"74",X"0D",X"B5",X"E0",X"B1",X"36",X"0D",X"B5",X"B0",X"B1",X"80",X"00",X"0A", + X"00",X"B1",X"06",X"FF",X"B3",X"00",X"89",X"B7",X"B5",X"90",X"B1",X"80",X"00",X"0A",X"B7",X"74", + X"0C",X"B1",X"40",X"F1",X"06",X"B5",X"0C",X"B1",X"B1",X"00",X"00",X"8C",X"FF",X"B5",X"D4",X"BD", + X"40",X"40",X"06",X"B7",X"B2",X"0D",X"B5",X"80",X"B3",X"FF",X"A8",X"B7",X"88",X"0D",X"B5",X"FE", + X"F9",X"FE",X"B7",X"88",X"0D",X"B5",X"C0",X"BD",X"BD",X"B5",X"C0",X"BD",X"B3",X"00",X"98",X"B7", + X"B5",X"70",X"B1",X"D1",X"00",X"42",X"B5",X"FE",X"12",X"0D",X"B5",X"20",X"B1",X"B0",X"00",X"42", + X"FC",X"A4",X"99",X"5A",X"22",X"F1",X"0F",X"5B",X"95",X"5A",X"53",X"FD",X"40",X"D5",X"F3",X"66", + X"5B",X"0F",X"26",X"DC",X"26",X"9C",X"7B",X"96",X"EC",X"0E",X"17",X"F3",X"66",X"00",X"88",X"0C", + X"58",X"82",X"40",X"41",X"AE",X"EE",X"7B",X"94",X"72",X"30",X"7B",X"DE",X"3D",X"06",X"1E",X"0F", + X"20",X"26",X"22",X"00",X"41",X"5B",X"EB",X"89",X"0F",X"01",X"9F",X"DE",X"26",X"9C",X"7B",X"96", + X"5C",X"17",X"5E",X"A8",X"12",X"3F",X"15",X"22",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"5B",X"00",X"80",X"C0",X"0E",X"C8",X"5B",X"14",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"A4",X"8D",X"5C",X"22",X"4B",X"8D",X"DB",X"22",X"92",X"05",X"27",X"05",X"84",X"07",X"58",X"07", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"72",X"0B",X"F8",X"0B",X"8B",X"07",X"B1",X"07", + X"B5",X"90",X"B1",X"80",X"00",X"02",X"B7",X"74",X"B3",X"00",X"89",X"B7",X"36",X"0D",X"B5",X"B0", + X"0D",X"B5",X"50",X"B1",X"00",X"B1",X"02",X"FF",X"B1",X"80",X"00",X"06",X"B5",X"90",X"B1",X"80", + X"0D",X"B5",X"60",X"B1",X"00",X"B1",X"0A",X"FF",X"B1",X"80",X"00",X"0E",X"B5",X"90",X"B1",X"80", + X"B3",X"00",X"89",X"B7",X"36",X"0D",X"B5",X"B0",X"00",X"0E",X"B7",X"74",X"0D",X"B5",X"C0",X"B1", + X"BD",X"B5",X"28",X"BD",X"B5",X"70",X"B1",X"D1",X"B3",X"00",X"89",X"B7",X"12",X"0D",X"B5",X"70", + X"00",X"42",X"B5",X"FE",X"BD",X"B5",X"C0",X"BD",X"B1",X"60",X"00",X"42",X"B5",X"FE",X"BD",X"B3", + X"B3",X"FF",X"A9",X"B7",X"88",X"0D",X"B5",X"80",X"B5",X"36",X"BD",X"B3",X"FF",X"A8",X"B7",X"E0", + X"BD",X"B5",X"28",X"B1",X"81",X"00",X"42",X"FF",X"0D",X"B5",X"28",X"BD",X"B5",X"FE",X"BD",X"B5", + X"02",X"4E",X"0E",X"04",X"8A",X"40",X"06",X"0E",X"8C",X"48",X"0E",X"00",X"4A",X"E4",X"97",X"5A", + X"42",X"08",X"88",X"44",X"0A",X"8A",X"46",X"0C",X"1D",X"20",X"FD",X"10",X"E0",X"94",X"64",X"14", + X"14",X"58",X"26",X"FC",X"A4",X"10",X"58",X"EC",X"24",X"14",X"58",X"EC",X"CA",X"17",X"39",X"0F", + X"CE",X"A4",X"12",X"58",X"53",X"22",X"40",X"41",X"5E",X"47",X"10",X"4D",X"C4",X"83",X"44",X"89", + X"53",X"22",X"00",X"10",X"5B",X"74",X"89",X"44",X"95",X"5A",X"53",X"17",X"F0",X"AC",X"E4",X"00", + X"5C",X"A8",X"53",X"17",X"D8",X"EC",X"3F",X"DE",X"17",X"AA",X"A8",X"3F",X"C4",X"22",X"10",X"22", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"E4",X"68",X"5A",X"5B",X"32",X"8B",X"5B",X"3C", + X"5C",X"AC",X"00",X"EC",X"EC",X"82",X"D2",X"02",X"22",X"00",X"10",X"17",X"F8",X"89",X"5C",X"FB", + X"C0",X"BD",X"B5",X"9E",X"B1",X"91",X"00",X"42",X"89",X"B7",X"CA",X"0D",X"B5",X"D0",X"B1",X"A0", + X"B5",X"FE",X"BD",X"B5",X"60",X"BD",X"B3",X"00",X"00",X"42",X"B5",X"FE",X"BD",X"B5",X"28",X"BD", + X"A9",X"B7",X"E0",X"0D",X"B5",X"80",X"BD",X"B5",X"FF",X"B5",X"D4",X"BD",X"B3",X"00",X"30",X"B7", + X"28",X"B1",X"81",X"00",X"42",X"B5",X"FE",X"BD",X"4B",X"0D",X"B5",X"FE",X"B1",X"44",X"00",X"8C", + X"66",X"0B",X"54",X"0B",X"72",X"0B",X"F8",X"0B",X"43",X"09",X"F8",X"0B",X"89",X"0B",X"90",X"05", + X"92",X"09",X"7A",X"09",X"5F",X"09",X"FB",X"09",X"90",X"05",X"90",X"05",X"90",X"05",X"90",X"05", + X"90",X"05",X"90",X"05",X"90",X"05",X"90",X"05",X"FF",X"B3",X"00",X"00",X"B7",X"BA",X"0D",X"B5", + X"90",X"05",X"90",X"05",X"08",X"0D",X"90",X"05",X"02",X"B1",X"00",X"00",X"8C",X"B3",X"EB",X"94", + X"00",X"B1",X"0E",X"FF",X"B3",X"00",X"89",X"B7",X"B5",X"FE",X"BD",X"FF",X"C6",X"C6",X"C2",X"C2", + X"12",X"0D",X"B5",X"B4",X"B1",X"80",X"00",X"42",X"C6",X"C6",X"A4",X"A4",X"FF",X"C7",X"C7",X"C3", + X"FF",X"AF",X"AF",X"6B",X"6B",X"AF",X"AF",X"6F",X"B7",X"B7",X"FF",X"A8",X"A8",X"A2",X"A2",X"A8", + X"6F",X"FF",X"AC",X"AC",X"B3",X"B3",X"AC",X"AC",X"A8",X"A6",X"A6",X"FF",X"29",X"29",X"29",X"2B", + X"6F",X"A4",X"99",X"5A",X"53",X"00",X"00",X"24",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"64",X"80",X"5A",X"5B",X"DC",X"8B",X"82",X"10",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"B3",X"FF",X"FE",X"B7",X"E0",X"0D",X"B5",X"D0",X"20",X"BD",X"B3",X"00",X"98",X"B7",X"CA",X"0D", + X"B1",X"91",X"00",X"42",X"B5",X"FE",X"BD",X"B5",X"B5",X"20",X"B1",X"B0",X"00",X"42",X"B3",X"FF", + X"B5",X"FE",X"B1",X"80",X"00",X"8C",X"B5",X"A0",X"B3",X"00",X"30",X"B7",X"4F",X"0D",X"B5",X"74", + X"B1",X"80",X"00",X"8C",X"FF",X"B5",X"7E",X"BD",X"B1",X"44",X"00",X"8C",X"B5",X"FE",X"B1",X"80", + X"90",X"05",X"A1",X"0B",X"90",X"05",X"90",X"05",X"59",X"0B",X"90",X"05",X"90",X"05",X"90",X"05", + X"90",X"05",X"90",X"05",X"90",X"05",X"90",X"05",X"90",X"05",X"90",X"05",X"90",X"05",X"71",X"0B", + X"B5",X"60",X"BD",X"B5",X"8C",X"B1",X"00",X"00",X"88",X"0D",X"B5",X"FE",X"B1",X"B1",X"00",X"42", + X"8C",X"B5",X"8C",X"BD",X"B3",X"FF",X"98",X"B7",X"B5",X"FE",X"B1",X"B1",X"00",X"42",X"B3",X"00", + X"C3",X"C7",X"C7",X"A5",X"A5",X"FF",X"7C",X"7C",X"7D",X"D5",X"D5",X"7D",X"7D",X"B5",X"B5",X"FF", + X"D4",X"D4",X"7C",X"7C",X"B4",X"B4",X"FF",X"7D",X"AE",X"AE",X"6A",X"6A",X"AE",X"AE",X"6E",X"6E", + X"2B",X"2B",X"FF",X"28",X"28",X"28",X"2A",X"2A",X"FF",X"CE",X"FF",X"CC",X"FF",X"80",X"80",X"80", + X"2A",X"FF",X"2C",X"2C",X"2C",X"2E",X"2E",X"2E",X"88",X"88",X"88",X"8C",X"8C",X"8C",X"FF",X"82", + X"00",X"10",X"17",X"03",X"89",X"5C",X"FB",X"22",X"5A",X"5B",X"32",X"8B",X"5B",X"3C",X"62",X"24", + X"AC",X"4A",X"CC",X"53",X"17",X"C9",X"0D",X"53",X"A4",X"93",X"5A",X"22",X"69",X"5C",X"57",X"BD", + X"F0",X"FD",X"04",X"EC",X"CE",X"17",X"01",X"8B",X"95",X"17",X"8F",X"8F",X"DB",X"22",X"59",X"5C", + X"5A",X"17",X"1B",X"0D",X"53",X"E0",X"40",X"CC",X"42",X"0E",X"FB",X"AA",X"00",X"53",X"0C",X"C2", + X"00",X"8C",X"B5",X"E4",X"B1",X"80",X"00",X"8C",X"00",X"8C",X"B3",X"EB",X"34",X"B5",X"D4",X"BD", + X"FF",X"B7",X"43",X"0D",X"B5",X"02",X"B1",X"00",X"B3",X"0A",X"30",X"B7",X"C1",X"0D",X"B5",X"FE", + X"06",X"8C",X"B7",X"C5",X"0D",X"B5",X"02",X"B1",X"00",X"00",X"B7",X"BA",X"0D",X"B5",X"02",X"B1", + X"00",X"00",X"8C",X"B5",X"20",X"BD",X"FF",X"B3",X"00",X"00",X"8C",X"B3",X"EB",X"94",X"B5",X"60", + X"FE",X"B7",X"CA",X"0D",X"B5",X"BA",X"B1",X"80",X"B7",X"2C",X"0D",X"B5",X"A0",X"B1",X"00",X"B1", + X"00",X"42",X"B5",X"08",X"B1",X"80",X"B1",X"42",X"42",X"B7",X"CA",X"0D",X"B5",X"80",X"B1",X"00", + X"98",X"B7",X"D8",X"0D",X"B5",X"6E",X"BD",X"B5",X"79",X"00",X"0A",X"B3",X"00",X"FE",X"B7",X"36", + X"B0",X"B1",X"7F",X"00",X"0A",X"B5",X"B8",X"B1",X"0D",X"B5",X"C8",X"BD",X"B5",X"D0",X"B1",X"8C", + X"82",X"82",X"8A",X"8A",X"8A",X"8E",X"8E",X"8E",X"C0",X"C0",X"C0",X"68",X"68",X"68",X"68",X"FF", + X"FF",X"84",X"FF",X"86",X"FF",X"A0",X"FF",X"C0",X"0E",X"FF",X"4E",X"FF",X"E4",X"42",X"5A",X"3D", + X"A8",X"A4",X"44",X"58",X"53",X"E4",X"42",X"5A",X"1E",X"20",X"04",X"EC",X"AA",X"A4",X"44",X"58", + X"3D",X"0E",X"57",X"EE",X"CC",X"69",X"07",X"57",X"53",X"E4",X"40",X"5A",X"3D",X"0E",X"57",X"EE", + X"40",X"5C",X"17",X"72",X"A8",X"ED",X"24",X"48",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"40",X"5A",X"82",X"89",X"01",X"17",X"C0",X"41",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"83",X"5C",X"22",X"FA",X"8D",X"DB",X"22",X"D9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"37",X"8B",X"23",X"66",X"BA",X"2C",X"A5",X"2C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"B1",X"44",X"00",X"8C",X"B5",X"FE",X"B1",X"0C",X"B5",X"48",X"B1",X"06",X"42",X"8C",X"B5",X"0A", + X"48",X"8C",X"B5",X"0C",X"B1",X"0C",X"B1",X"8C",X"B1",X"0A",X"BD",X"8C",X"B5",X"44",X"B1",X"08", + X"BD",X"B5",X"8C",X"B1",X"00",X"00",X"8C",X"B5",X"B5",X"02",X"B1",X"00",X"00",X"42",X"B3",X"11", + X"8C",X"BD",X"B3",X"00",X"00",X"B7",X"E0",X"0D",X"11",X"B5",X"A0",X"BD",X"FF",X"B3",X"00",X"00", + X"00",X"42",X"FF",X"B3",X"00",X"00",X"B7",X"FE",X"6B",X"94",X"B5",X"60",X"BD",X"B5",X"8C",X"B1", + X"0D",X"B5",X"02",X"B1",X"00",X"00",X"8C",X"B3",X"00",X"00",X"8C",X"B5",X"8C",X"BD",X"B3",X"FF", + X"00",X"0A",X"BB",X"80",X"B5",X"0C",X"B1",X"F1",X"B5",X"0C",X"B1",X"F1",X"F1",X"0A",X"B5",X"0C", + X"F1",X"0A",X"B5",X"0C",X"B1",X"F1",X"40",X"0A",X"B1",X"F1",X"40",X"0A",X"B3",X"00",X"00",X"B7", + X"0E",X"57",X"EE",X"6E",X"CC",X"A0",X"07",X"57",X"53",X"E4",X"40",X"5A",X"3D",X"0E",X"57",X"EE", + X"1E",X"20",X"04",X"EC",X"AE",X"A4",X"44",X"58",X"CC",X"A0",X"07",X"57",X"1E",X"20",X"04",X"EC", + X"6E",X"CC",X"B9",X"07",X"57",X"1E",X"20",X"04",X"5A",X"2F",X"11",X"E4",X"99",X"5A",X"2F",X"55", + X"EC",X"AC",X"A4",X"44",X"58",X"53",X"E4",X"29",X"1E",X"0F",X"E4",X"95",X"5A",X"2F",X"55",X"1E", + X"40",X"00",X"8C",X"00",X"02",X"00",X"04",X"00",X"90",X"00",X"90",X"86",X"76",X"34",X"C6",X"57", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"A4",X"E9",X"5C",X"C0",X"0C",X"A4",X"59",X"5C", + X"A8",X"5C",X"17",X"79",X"89",X"7B",X"21",X"82",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"17",X"7E",X"AC",X"00",X"04",X"53",X"6F",X"04",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"B7",X"FE",X"0D",X"B5",X"02",X"B1",X"00",X"00",X"8C",X"B1",X"00",X"00",X"8C",X"B5",X"8C",X"BD", + X"8C",X"B3",X"6B",X"94",X"B5",X"60",X"BD",X"B5",X"B3",X"00",X"00",X"B7",X"88",X"0D",X"B5",X"02", + X"00",X"00",X"8C",X"B5",X"8C",X"BD",X"B3",X"00",X"B5",X"02",X"B1",X"00",X"00",X"8C",X"B3",X"6B", + X"00",X"FF",X"B3",X"00",X"00",X"B7",X"FE",X"0D",X"94",X"B5",X"60",X"BD",X"B5",X"8C",X"B1",X"00", + X"B6",X"0D",X"B5",X"02",X"B1",X"00",X"00",X"06",X"06",X"FF",X"B5",X"D4",X"BD",X"B3",X"00",X"29", + X"B3",X"FE",X"E4",X"B5",X"10",X"B1",X"00",X"00",X"B7",X"12",X"0D",X"B5",X"FE",X"B1",X"80",X"00", + X"B1",X"42",X"B7",X"E0",X"0D",X"B5",X"80",X"B1",X"02",X"29",X"B7",X"36",X"0D",X"B5",X"6E",X"BD", + X"00",X"00",X"42",X"FF",X"B5",X"DE",X"BD",X"B3",X"B5",X"B0",X"B1",X"82",X"00",X"06",X"B5",X"B8", + X"0F",X"E4",X"12",X"58",X"1E",X"22",X"12",X"41",X"5A",X"22",X"12",X"58",X"A8",X"FC",X"3D",X"4E", + X"DF",X"7B",X"D6",X"95",X"5A",X"C2",X"24",X"95",X"11",X"22",X"10",X"58",X"AA",X"F5",X"AB",X"0F", + X"0E",X"0E",X"0E",X"A4",X"12",X"58",X"53",X"E4",X"A1",X"11",X"22",X"4A",X"5C",X"17",X"D6",X"0F", + X"4C",X"5C",X"FD",X"10",X"55",X"D0",X"0F",X"FD",X"22",X"48",X"5C",X"FC",X"2F",X"11",X"A8",X"E4", + X"18",X"17",X"28",X"8B",X"20",X"04",X"EC",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"B6",X"04",X"17",X"5C",X"AC",X"48",X"DB",X"AA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"2F",X"7B",X"94",X"11",X"6F",X"00",X"E8",X"A4",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"B1",X"00",X"00",X"42",X"B3",X"91",X"11",X"B5",X"0D",X"B5",X"02",X"B1",X"00",X"00",X"8C",X"B3", + X"A0",X"BD",X"FF",X"B3",X"00",X"00",X"B7",X"BA",X"EB",X"94",X"B5",X"60",X"BD",X"B5",X"8C",X"B1", + X"00",X"8C",X"B5",X"8C",X"BD",X"B3",X"00",X"00",X"00",X"8C",X"B3",X"EB",X"34",X"B5",X"D4",X"BD", + X"FF",X"B7",X"43",X"0D",X"B5",X"02",X"B1",X"00",X"B3",X"00",X"00",X"FF",X"B7",X"47",X"0D",X"B5", + X"42",X"B5",X"FE",X"B1",X"80",X"00",X"42",X"B3",X"B1",X"00",X"42",X"B5",X"08",X"B1",X"B1",X"B1", + X"FF",X"FE",X"B7",X"E0",X"0D",X"B5",X"BC",X"B1",X"42",X"B7",X"54",X"0D",X"B5",X"A0",X"B1",X"00", + X"B1",X"88",X"00",X"06",X"B3",X"FF",X"FE",X"B7",X"75",X"00",X"06",X"B5",X"0C",X"B1",X"40",X"F1", + X"D8",X"0D",X"B5",X"C8",X"BD",X"B5",X"D0",X"B1",X"06",X"B5",X"0C",X"B1",X"40",X"40",X"06",X"B5", + X"FC",X"9E",X"57",X"EE",X"57",X"EE",X"22",X"E9",X"EC",X"06",X"25",X"60",X"0E",X"57",X"E2",X"57", + X"5C",X"57",X"7D",X"64",X"14",X"58",X"9F",X"5E",X"E2",X"EA",X"20",X"F3",X"EC",X"06",X"23",X"0E", + X"86",X"5C",X"FD",X"0E",X"E0",X"44",X"0C",X"0E",X"22",X"CB",X"0F",X"1E",X"0F",X"01",X"9F",X"A4", + X"7B",X"DE",X"3D",X"CE",X"81",X"A0",X"FB",X"01",X"48",X"58",X"26",X"FC",X"A4",X"4A",X"58",X"26", + X"3B",X"22",X"38",X"10",X"17",X"08",X"8B",X"7B",X"64",X"4C",X"5A",X"5B",X"D2",X"8B",X"82",X"10", + X"53",X"17",X"A3",X"0D",X"53",X"0E",X"FD",X"0C",X"2D",X"57",X"1F",X"BE",X"53",X"17",X"7D",X"0D", + X"C4",X"17",X"17",X"8B",X"0C",X"0C",X"DB",X"22",X"E4",X"86",X"5C",X"E8",X"17",X"87",X"0F",X"6C", + X"40",X"5A",X"17",X"D3",X"0D",X"53",X"E0",X"0A",X"5C",X"17",X"23",X"89",X"00",X"22",X"08",X"5C", + X"02",X"B1",X"00",X"00",X"8C",X"B3",X"6B",X"34",X"B3",X"00",X"00",X"FF",X"B3",X"00",X"89",X"B7", + X"B5",X"E2",X"BD",X"BF",X"B5",X"CC",X"BD",X"F1",X"36",X"0D",X"B5",X"B0",X"B1",X"80",X"00",X"02", + X"00",X"06",X"B7",X"74",X"0D",X"B5",X"E0",X"B1",X"36",X"0D",X"B5",X"B0",X"B1",X"80",X"00",X"0A", + X"00",X"B1",X"06",X"FF",X"B3",X"00",X"89",X"B7",X"B5",X"90",X"B1",X"80",X"00",X"0A",X"B7",X"74", + X"0C",X"B1",X"40",X"F1",X"06",X"B5",X"0C",X"B1",X"B1",X"00",X"00",X"8C",X"FF",X"B5",X"D4",X"BD", + X"40",X"40",X"06",X"B7",X"B2",X"0D",X"B5",X"80",X"B3",X"FF",X"A8",X"B7",X"88",X"0D",X"B5",X"FE", + X"F9",X"FE",X"B7",X"88",X"0D",X"B5",X"C0",X"BD",X"BD",X"B5",X"C0",X"BD",X"B3",X"00",X"98",X"B7", + X"B5",X"70",X"B1",X"D1",X"00",X"42",X"B5",X"FE",X"12",X"0D",X"B5",X"20",X"B1",X"B0",X"00",X"42", + X"FC",X"A4",X"99",X"5A",X"22",X"F1",X"0F",X"5B",X"95",X"5A",X"53",X"FD",X"40",X"D5",X"F3",X"66", + X"5B",X"0F",X"26",X"DC",X"26",X"9C",X"7B",X"96",X"EC",X"0E",X"17",X"F3",X"66",X"00",X"88",X"0C", + X"58",X"82",X"40",X"41",X"AE",X"EE",X"7B",X"94",X"72",X"30",X"7B",X"DE",X"3D",X"06",X"1E",X"0F", + X"20",X"26",X"22",X"00",X"41",X"5B",X"EB",X"89",X"0F",X"01",X"9F",X"DE",X"26",X"9C",X"7B",X"96", + X"5C",X"17",X"5E",X"A8",X"12",X"3F",X"15",X"22",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"5B",X"00",X"80",X"C0",X"0E",X"C8",X"5B",X"14",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"A4",X"8D",X"5C",X"22",X"4B",X"8D",X"DB",X"22",X"92",X"05",X"27",X"05",X"84",X"07",X"58",X"07", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"72",X"0B",X"F8",X"0B",X"8B",X"07",X"B1",X"07", + X"B5",X"90",X"B1",X"80",X"00",X"02",X"B7",X"74",X"B3",X"00",X"89",X"B7",X"36",X"0D",X"B5",X"B0", + X"0D",X"B5",X"50",X"B1",X"00",X"B1",X"02",X"FF",X"B1",X"80",X"00",X"06",X"B5",X"90",X"B1",X"80", + X"0D",X"B5",X"60",X"B1",X"00",X"B1",X"0A",X"FF",X"B1",X"80",X"00",X"0E",X"B5",X"90",X"B1",X"80", + X"B3",X"00",X"89",X"B7",X"36",X"0D",X"B5",X"B0",X"00",X"0E",X"B7",X"74",X"0D",X"B5",X"C0",X"B1", + X"BD",X"B5",X"28",X"BD",X"B5",X"70",X"B1",X"D1",X"B3",X"00",X"89",X"B7",X"12",X"0D",X"B5",X"70", + X"00",X"42",X"B5",X"FE",X"BD",X"B5",X"C0",X"BD",X"B1",X"60",X"00",X"42",X"B5",X"FE",X"BD",X"B3", + X"B3",X"FF",X"A9",X"B7",X"88",X"0D",X"B5",X"80",X"B5",X"36",X"BD",X"B3",X"FF",X"A8",X"B7",X"E0", + X"BD",X"B5",X"28",X"B1",X"81",X"00",X"42",X"FF",X"0D",X"B5",X"28",X"BD",X"B5",X"FE",X"BD",X"B5", + X"02",X"4E",X"0E",X"04",X"8A",X"40",X"06",X"0E",X"8C",X"48",X"0E",X"00",X"4A",X"E4",X"97",X"5A", + X"42",X"08",X"88",X"44",X"0A",X"8A",X"46",X"0C",X"1D",X"20",X"FD",X"10",X"E0",X"94",X"64",X"14", + X"14",X"58",X"26",X"FC",X"A4",X"10",X"58",X"EC",X"24",X"14",X"58",X"EC",X"CA",X"17",X"39",X"0F", + X"CE",X"A4",X"12",X"58",X"53",X"22",X"40",X"41",X"5E",X"47",X"10",X"4D",X"C4",X"83",X"44",X"89", + X"04",X"5D",X"F9",X"F9",X"F9",X"D5",X"04",X"3D",X"B9",X"39",X"04",X"D9",X"00",X"00",X"00",X"00", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"0A",X"06",X"46",X"06",X"06",X"06",X"08",X"0A", + X"06",X"02",X"02",X"02",X"02",X"02",X"46",X"0C",X"80",X"02",X"02",X"02",X"02",X"02",X"02",X"02", + X"4E",X"44",X"06",X"08",X"4E",X"44",X"02",X"02",X"02",X"02",X"0E",X"08",X"48",X"06",X"06",X"06", + X"08",X"02",X"02",X"02",X"02",X"02",X"00",X"00",X"10",X"20",X"38",X"10",X"F0",X"10",X"09",X"16", + X"83",X"CC",X"98",X"B9",X"A8",X"83",X"CC",X"98",X"67",X"F5",X"65",X"65",X"75",X"FF",X"9E",X"9A", + X"EF",X"65",X"9C",X"83",X"24",X"00",X"00",X"DE",X"00",X"7E",X"83",X"60",X"00",X"00",X"0A",X"00", + X"00",X"00",X"61",X"44",X"61",X"EF",X"F5",X"67",X"12",X"9A",X"00",X"21",X"04",X"10",X"BB",X"9E", + X"C9",X"16",X"CA",X"24",X"10",X"20",X"CA",X"E2",X"89",X"CA",X"49",X"B9",X"66",X"89",X"64",X"B8", + X"ED",X"F5",X"65",X"00",X"90",X"FB",X"9A",X"BB",X"FB",X"8A",X"90",X"02",X"90",X"9A",X"75",X"6F", + X"00",X"9C",X"89",X"C0",X"00",X"00",X"D8",X"89",X"9A",X"90",X"12",X"9A",X"FB",X"65",X"65",X"21", + X"21",X"65",X"65",X"9A",X"DE",X"02",X"00",X"90",X"22",X"00",X"10",X"53",X"13",X"41",X"6D",X"47", + X"27",X"20",X"B9",X"53",X"22",X"C8",X"8B",X"5B",X"26",X"1C",X"26",X"44",X"84",X"86",X"EC",X"06", + X"84",X"83",X"F5",X"87",X"1B",X"9B",X"22",X"C8",X"9C",X"77",X"57",X"99",X"E4",X"FC",X"18",X"ED", + X"26",X"9C",X"57",X"95",X"84",X"26",X"DC",X"26",X"57",X"95",X"84",X"93",X"13",X"EC",X"80",X"ED", + X"5A",X"BB",X"1B",X"3B",X"22",X"F0",X"8B",X"5B",X"9F",X"DE",X"26",X"9C",X"33",X"13",X"B3",X"53", + X"04",X"3F",X"77",X"04",X"DD",X"39",X"04",X"3F",X"BB",X"39",X"04",X"3F",X"77",X"04",X"3D",X"75", + X"0A",X"DD",X"39",X"46",X"DD",X"39",X"0A",X"DD",X"39",X"04",X"3D",X"71",X"71",X"B9",X"B5",X"71", + X"04",X"DD",X"39",X"04",X"3D",X"71",X"71",X"B9",X"77",X"04",X"3F",X"73",X"73",X"BB",X"B7",X"73", + X"04",X"3F",X"77",X"04",X"3F",X"73",X"73",X"BB",X"40",X"DD",X"39",X"40",X"DD",X"39",X"04",X"D9", + X"02",X"02",X"0E",X"02",X"02",X"02",X"02",X"02",X"0E",X"0A",X"06",X"02",X"02",X"02",X"08",X"08", + X"02",X"02",X"02",X"06",X"02",X"02",X"02",X"02",X"02",X"06",X"08",X"08",X"4E",X"06",X"0C",X"08", + X"02",X"02",X"02",X"02",X"48",X"02",X"02",X"02",X"08",X"0E",X"84",X"06",X"08",X"06",X"02",X"02", + X"8C",X"0E",X"06",X"8C",X"0E",X"06",X"02",X"02",X"84",X"06",X"08",X"0E",X"84",X"06",X"08",X"02", + X"3D",X"A0",X"FD",X"A0",X"F0",X"11",X"EC",X"20",X"5B",X"2E",X"8D",X"33",X"13",X"53",X"42",X"20", + X"BD",X"12",X"42",X"26",X"8C",X"14",X"FF",X"FC",X"DC",X"26",X"9C",X"84",X"F0",X"57",X"95",X"84", + X"5E",X"53",X"7F",X"C8",X"86",X"7F",X"C8",X"AA",X"00",X"02",X"00",X"08",X"BE",X"42",X"AC",X"02", + X"02",X"7B",X"14",X"26",X"9D",X"08",X"BE",X"42",X"42",X"AC",X"02",X"7B",X"14",X"C2",X"1D",X"46", + X"9C",X"98",X"92",X"76",X"72",X"76",X"72",X"76",X"B8",X"B2",X"B8",X"B2",X"76",X"72",X"2D",X"2D", + X"04",X"B0",X"3C",X"B0",X"1C",X"90",X"0D",X"81",X"3C",X"B0",X"1C",X"90",X"0D",X"81",X"B0",X"32", + X"29",X"25",X"23",X"B9",X"02",X"0D",X"43",X"47",X"00",X"B5",X"04",X"B7",X"44",X"B9",X"00",X"3A", + X"0B",X"38",X"0B",X"74",X"72",X"74",X"49",X"BA",X"B2",X"FF",X"B3",X"04",X"B5",X"06",X"B7",X"44", + X"02",X"02",X"02",X"02",X"02",X"02",X"48",X"06",X"0E",X"8A",X"08",X"02",X"02",X"02",X"02",X"02", + X"0E",X"08",X"48",X"06",X"06",X"06",X"0E",X"08",X"08",X"48",X"02",X"02",X"02",X"06",X"02",X"02", + X"02",X"02",X"02",X"4E",X"44",X"06",X"80",X"02",X"08",X"06",X"80",X"0C",X"06",X"08",X"06",X"02", + X"0A",X"06",X"46",X"02",X"02",X"02",X"06",X"06",X"02",X"04",X"02",X"02",X"06",X"02",X"02",X"02", + X"95",X"95",X"95",X"95",X"99",X"F9",X"F9",X"D5",X"F9",X"91",X"95",X"95",X"95",X"95",X"95",X"95", + X"D5",X"04",X"DD",X"39",X"04",X"D9",X"F9",X"F9",X"3D",X"71",X"71",X"71",X"71",X"75",X"04",X"3F", + X"95",X"95",X"95",X"95",X"77",X"04",X"3D",X"71",X"3F",X"73",X"73",X"73",X"BB",X"39",X"0E",X"DD", + X"D9",X"F9",X"D5",X"0C",X"DD",X"39",X"04",X"3D",X"04",X"3D",X"71",X"71",X"75",X"04",X"DD",X"39", + X"06",X"22",X"85",X"28",X"3B",X"22",X"C3",X"89",X"42",X"22",X"00",X"10",X"DB",X"22",X"8C",X"5C", + X"85",X"1B",X"22",X"AB",X"89",X"5B",X"EB",X"89",X"77",X"40",X"17",X"3B",X"40",X"68",X"47",X"8E", + X"3B",X"FD",X"4A",X"B5",X"99",X"89",X"22",X"DF",X"5C",X"26",X"1C",X"53",X"9D",X"4A",X"9D",X"40", + X"00",X"02",X"02",X"02",X"04",X"04",X"04",X"04",X"EB",X"89",X"82",X"A8",X"5C",X"72",X"30",X"5C", + X"55",X"33",X"28",X"E4",X"04",X"5C",X"2F",X"60",X"E4",X"86",X"5C",X"FD",X"8A",X"B5",X"27",X"8B", + X"17",X"33",X"28",X"9D",X"8A",X"9D",X"80",X"B5",X"8C",X"8C",X"8C",X"88",X"88",X"88",X"88",X"0E", + X"CA",X"CA",X"CA",X"E4",X"86",X"5C",X"FD",X"06",X"89",X"22",X"00",X"18",X"44",X"06",X"2F",X"55", + X"47",X"60",X"4D",X"F0",X"FD",X"44",X"59",X"46",X"59",X"E8",X"8D",X"17",X"DC",X"68",X"1B",X"3B", + X"75",X"04",X"DD",X"39",X"04",X"79",X"97",X"97",X"71",X"71",X"75",X"04",X"DD",X"39",X"04",X"D9", + X"77",X"04",X"3F",X"77",X"04",X"D9",X"F9",X"F9",X"73",X"BB",X"39",X"04",X"3F",X"77",X"04",X"D9", + X"F9",X"F9",X"D5",X"40",X"DD",X"39",X"0A",X"D9",X"71",X"71",X"71",X"75",X"04",X"5D",X"F9",X"F9", + X"04",X"DD",X"39",X"04",X"3D",X"71",X"71",X"B9",X"02",X"02",X"02",X"4E",X"02",X"02",X"02",X"04", + X"02",X"02",X"02",X"02",X"02",X"06",X"08",X"08",X"08",X"08",X"02",X"02",X"02",X"06",X"02",X"02", + X"02",X"02",X"02",X"06",X"08",X"08",X"06",X"06",X"02",X"06",X"06",X"0E",X"0A",X"06",X"02",X"02", + X"02",X"02",X"02",X"02",X"0C",X"08",X"0E",X"4E",X"4E",X"02",X"02",X"02",X"04",X"02",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"8D",X"D0",X"E8",X"5E",X"8F",X"AD",X"8D",X"C2",X"8F",X"8D",X"8F",X"8D",X"8F",X"B3",X"00",X"B5", + X"0D",X"45",X"41",X"47",X"74",X"76",X"B2",X"74",X"B6",X"BA",X"8D",X"8B",X"8D",X"FF",X"B3",X"04", + X"0D",X"81",X"03",X"81",X"0D",X"81",X"70",X"74",X"3A",X"70",X"0D",X"03",X"0D",X"FF",X"B3",X"00", + X"72",X"0D",X"32",X"38",X"3A",X"0D",X"0D",X"38",X"38",X"38",X"23",X"B0",X"B2",X"B8",X"BA",X"AA", + X"3C",X"3A",X"81",X"32",X"B0",X"32",X"3A",X"70",X"0B",X"B0",X"0D",X"70",X"3A",X"FF",X"FF",X"E4", + X"58",X"22",X"90",X"5E",X"02",X"48",X"00",X"7B",X"60",X"48",X"E4",X"44",X"58",X"FD",X"EE",X"20", + X"8D",X"17",X"19",X"68",X"FF",X"FF",X"FF",X"FF",X"1E",X"1A",X"5C",X"1A",X"94",X"12",X"58",X"20", + X"20",X"20",X"16",X"5E",X"94",X"90",X"5E",X"94",X"50",X"3A",X"78",X"78",X"7E",X"68",X"20",X"5C", + X"71",X"71",X"B9",X"39",X"04",X"3D",X"71",X"71",X"34",X"02",X"04",X"02",X"02",X"06",X"02",X"02", + X"02",X"08",X"02",X"02",X"02",X"02",X"02",X"08",X"06",X"46",X"02",X"02",X"02",X"06",X"06",X"08", + X"06",X"08",X"06",X"80",X"0C",X"06",X"08",X"06",X"02",X"02",X"08",X"06",X"02",X"02",X"02",X"02", + X"02",X"08",X"48",X"02",X"02",X"02",X"06",X"02",X"0E",X"08",X"48",X"06",X"06",X"06",X"08",X"02", + X"00",X"B5",X"10",X"6A",X"CA",X"24",X"CA",X"E2",X"C1",X"16",X"6C",X"83",X"8A",X"98",X"48",X"A8", + X"B9",X"E8",X"83",X"8A",X"98",X"48",X"75",X"FF",X"9A",X"9B",X"9E",X"9A",X"65",X"65",X"EF",X"F5", + X"83",X"2A",X"00",X"00",X"DE",X"83",X"2A",X"00",X"00",X"98",X"0A",X"98",X"FE",X"BB",X"46",X"44", + X"65",X"65",X"05",X"65",X"00",X"21",X"65",X"9A",X"EF",X"10",X"F9",X"91",X"95",X"95",X"95",X"95", + X"10",X"E6",X"CC",X"89",X"88",X"49",X"48",X"26",X"B9",X"AC",X"89",X"8A",X"B8",X"48",X"01",X"65", + X"9B",X"9E",X"9A",X"75",X"FF",X"9E",X"9B",X"DE",X"FD",X"64",X"61",X"65",X"90",X"89",X"8A",X"00", + X"C2",X"00",X"00",X"36",X"89",X"C8",X"00",X"00",X"05",X"65",X"FD",X"65",X"65",X"6F",X"04",X"64", + X"9A",X"EF",X"22",X"B8",X"89",X"5B",X"EB",X"89",X"61",X"4D",X"F2",X"83",X"22",X"96",X"28",X"C0", + X"EB",X"89",X"82",X"A8",X"5C",X"72",X"30",X"5C",X"27",X"20",X"B9",X"53",X"AA",X"47",X"20",X"4D", + X"8B",X"5B",X"EB",X"89",X"30",X"72",X"DC",X"26",X"20",X"04",X"EC",X"00",X"BE",X"77",X"26",X"DC", + X"9C",X"57",X"95",X"84",X"26",X"DC",X"26",X"9C",X"53",X"E4",X"6C",X"5A",X"C0",X"06",X"E4",X"6E", + X"EB",X"89",X"72",X"30",X"7B",X"DE",X"3D",X"0C",X"6A",X"47",X"C0",X"4D",X"44",X"83",X"04",X"89", + X"73",X"73",X"73",X"73",X"77",X"04",X"3F",X"73",X"04",X"D9",X"F9",X"D5",X"04",X"DD",X"11",X"39", + X"39",X"04",X"D9",X"F9",X"D5",X"04",X"DD",X"11",X"71",X"75",X"04",X"3D",X"71",X"71",X"71",X"75", + X"39",X"04",X"D9",X"F9",X"D5",X"04",X"3F",X"73",X"73",X"77",X"04",X"3F",X"73",X"73",X"BB",X"39", + X"39",X"04",X"D9",X"F9",X"D5",X"42",X"DD",X"39",X"F9",X"D5",X"04",X"3D",X"71",X"71",X"71",X"71", + X"0C",X"08",X"02",X"02",X"02",X"02",X"06",X"06",X"06",X"06",X"0E",X"0A",X"06",X"06",X"08",X"08", + X"02",X"02",X"02",X"02",X"02",X"06",X"02",X"02",X"08",X"4E",X"06",X"0C",X"08",X"02",X"02",X"02", + X"02",X"02",X"02",X"06",X"08",X"0E",X"84",X"06",X"02",X"02",X"84",X"02",X"02",X"02",X"08",X"06", + X"02",X"02",X"84",X"02",X"02",X"02",X"08",X"0E",X"02",X"02",X"02",X"02",X"02",X"02",X"48",X"02", + X"0C",X"20",X"53",X"1B",X"3B",X"22",X"8C",X"8D",X"BB",X"12",X"42",X"22",X"8A",X"14",X"42",X"24", + X"FD",X"FF",X"60",X"4E",X"1E",X"26",X"FC",X"26",X"26",X"C0",X"79",X"53",X"EC",X"00",X"A4",X"00", + X"22",X"C5",X"14",X"EC",X"EF",X"2F",X"82",X"CA",X"7B",X"14",X"26",X"9D",X"08",X"BE",X"42",X"AC", + X"AC",X"02",X"7B",X"14",X"26",X"9D",X"08",X"BE",X"FD",X"E7",X"20",X"D1",X"53",X"8B",X"8D",X"9D", + X"83",X"76",X"72",X"3C",X"B5",X"02",X"B8",X"BC",X"FF",X"B3",X"06",X"B5",X"06",X"B7",X"44",X"B9", + X"B0",X"3C",X"B0",X"1C",X"90",X"0D",X"81",X"B0",X"B0",X"12",X"90",X"03",X"81",X"B9",X"00",X"2D", + X"03",X"B8",X"B2",X"76",X"72",X"2D",X"FF",X"B3",X"38",X"3A",X"41",X"3E",X"41",X"32",X"36",X"38", + X"87",X"81",X"83",X"81",X"83",X"B0",X"45",X"70",X"B9",X"04",X"3A",X"81",X"70",X"B0",X"70",X"3E", + X"02",X"02",X"02",X"06",X"08",X"0E",X"8A",X"08",X"02",X"02",X"48",X"06",X"02",X"02",X"02",X"06", + X"48",X"06",X"06",X"06",X"08",X"02",X"02",X"02",X"02",X"08",X"06",X"08",X"4E",X"44",X"06",X"02", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"46",X"0C",X"06",X"08", + X"08",X"0A",X"06",X"46",X"06",X"06",X"06",X"08",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02", + X"04",X"DD",X"39",X"04",X"D9",X"F9",X"F9",X"F9",X"95",X"99",X"F9",X"D5",X"42",X"D9",X"F9",X"F9", + X"F9",X"F9",X"D5",X"40",X"D9",X"F9",X"D5",X"04",X"95",X"95",X"77",X"04",X"DD",X"39",X"04",X"3F", + X"71",X"71",X"75",X"04",X"D9",X"F9",X"D5",X"04",X"39",X"42",X"DD",X"B7",X"73",X"73",X"77",X"04", + X"75",X"04",X"3D",X"71",X"B9",X"B5",X"71",X"75",X"0A",X"D9",X"F9",X"D5",X"04",X"3D",X"71",X"75", + X"5B",X"EB",X"89",X"FB",X"22",X"00",X"00",X"FB",X"53",X"E6",X"45",X"2E",X"4B",X"C0",X"81",X"79", + X"44",X"1E",X"E4",X"4C",X"5C",X"E1",X"13",X"15",X"4D",X"42",X"83",X"F3",X"87",X"E4",X"86",X"5C", + X"89",X"9F",X"33",X"0F",X"5E",X"0C",X"00",X"42",X"B5",X"9D",X"89",X"1D",X"4A",X"C0",X"3F",X"00", + X"06",X"06",X"06",X"06",X"22",X"C8",X"8B",X"5B",X"26",X"1C",X"26",X"C4",X"04",X"86",X"EC",X"06", + X"0E",X"FD",X"80",X"EC",X"02",X"15",X"33",X"28",X"5E",X"0C",X"00",X"22",X"6D",X"8B",X"42",X"FC", + X"2B",X"8B",X"1D",X"8A",X"C0",X"75",X"CA",X"CA",X"0E",X"0E",X"0E",X"C0",X"C0",X"C0",X"C0",X"CA", + X"B5",X"A8",X"2A",X"22",X"DF",X"8B",X"5B",X"EB",X"A8",X"2A",X"9F",X"57",X"BD",X"C0",X"BB",X"EA", + X"8D",X"FD",X"46",X"59",X"BD",X"8B",X"FD",X"0C",X"5B",X"14",X"8D",X"33",X"13",X"E4",X"01",X"90", + X"97",X"7D",X"04",X"DD",X"39",X"04",X"3D",X"71",X"F9",X"D5",X"04",X"DD",X"B7",X"73",X"73",X"73", + X"F9",X"D5",X"04",X"3F",X"77",X"04",X"3F",X"73",X"F9",X"D5",X"04",X"DD",X"39",X"42",X"B1",X"F9", + X"F9",X"D5",X"04",X"DD",X"39",X"04",X"3D",X"71",X"F9",X"D5",X"04",X"3D",X"71",X"71",X"71",X"75", + X"00",X"00",X"00",X"00",X"34",X"02",X"04",X"02",X"02",X"08",X"0E",X"4E",X"0C",X"08",X"0E",X"02", + X"4E",X"06",X"0C",X"08",X"08",X"4E",X"06",X"0C",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"06", + X"0E",X"0A",X"06",X"06",X"08",X"02",X"02",X"02",X"02",X"08",X"0E",X"02",X"02",X"02",X"0E",X"02", + X"0C",X"08",X"02",X"04",X"02",X"02",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7D",X"38",X"10",X"F8",X"10",X"09",X"16", + X"8F",X"99",X"E6",X"B4",X"8F",X"8D",X"8F",X"8D",X"04",X"B7",X"44",X"B9",X"00",X"12",X"16",X"1A", + X"41",X"47",X"74",X"76",X"B2",X"74",X"76",X"B2",X"B5",X"06",X"B7",X"44",X"B9",X"04",X"90",X"B0", + X"76",X"70",X"74",X"70",X"3C",X"74",X"70",X"3C",X"B5",X"04",X"B7",X"44",X"B9",X"00",X"72",X"76", + X"3C",X"38",X"32",X"72",X"76",X"72",X"0D",X"32",X"BC",X"A0",X"90",X"AA",X"BC",X"A0",X"90",X"98", + X"3C",X"81",X"36",X"81",X"0D",X"81",X"0B",X"81",X"00",X"5E",X"FD",X"00",X"60",X"46",X"82",X"04", + X"A1",X"E4",X"42",X"5C",X"22",X"B4",X"5C",X"2D",X"0A",X"EC",X"FF",X"A4",X"44",X"58",X"22",X"0B", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"16",X"5E",X"5A",X"90",X"9A",X"98",X"1A",X"94", + X"12",X"98",X"52",X"5E",X"5C",X"20",X"20",X"20",X"32",X"76",X"32",X"7A",X"BA",X"B4",X"32",X"22", + X"05",X"47",X"B6",X"4D",X"14",X"83",X"E8",X"89",X"EC",X"00",X"A4",X"4A",X"58",X"17",X"00",X"80", + X"06",X"FD",X"0C",X"A0",X"C0",X"FA",X"87",X"1D",X"4A",X"58",X"B3",X"1D",X"04",X"A4",X"48",X"58", + X"C2",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"00",X"00",X"FF",X"FD",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"FF",X"00",X"00",X"00", + X"95",X"77",X"04",X"3F",X"95",X"95",X"95",X"95",X"77",X"04",X"3D",X"71",X"71",X"71",X"75",X"04", + X"11",X"11",X"11",X"39",X"04",X"D9",X"F9",X"D5",X"71",X"75",X"04",X"3D",X"71",X"71",X"71",X"75", + X"11",X"11",X"11",X"39",X"04",X"D9",X"F9",X"D5",X"BB",X"39",X"04",X"DD",X"B7",X"73",X"73",X"77", + X"73",X"73",X"73",X"77",X"04",X"D9",X"F9",X"D5",X"39",X"04",X"DD",X"39",X"40",X"D9",X"F9",X"F5", + X"75",X"04",X"D9",X"F9",X"D5",X"04",X"DD",X"39",X"39",X"04",X"DD",X"39",X"48",X"DD",X"39",X"04", + X"39",X"0A",X"DD",X"39",X"04",X"DD",X"B5",X"71",X"71",X"71",X"B9",X"39",X"04",X"D9",X"F9",X"D5", + X"75",X"04",X"3F",X"77",X"04",X"3F",X"73",X"73",X"73",X"73",X"73",X"77",X"04",X"D9",X"F9",X"D5", + X"39",X"40",X"D9",X"F9",X"F5",X"71",X"71",X"75",X"71",X"71",X"75",X"04",X"3D",X"71",X"71",X"75", + X"39",X"0A",X"D9",X"F9",X"D5",X"04",X"DD",X"B5",X"5D",X"F9",X"F9",X"F9",X"D5",X"04",X"DD",X"11", + X"75",X"04",X"D9",X"00",X"00",X"00",X"00",X"3C",X"02",X"46",X"02",X"02",X"0E",X"0C",X"06",X"06", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"06",X"0C",X"0E",X"06",X"06",X"06",X"0E",X"06", + X"02",X"02",X"02",X"02",X"02",X"02",X"06",X"02",X"0C",X"06",X"0E",X"06",X"4A",X"0C",X"06",X"08", + X"DD",X"39",X"04",X"D9",X"F9",X"D5",X"04",X"DD",X"F9",X"D5",X"0A",X"DD",X"39",X"0A",X"DD",X"39", + X"3D",X"71",X"71",X"71",X"B9",X"39",X"04",X"5D",X"B9",X"39",X"04",X"3D",X"71",X"71",X"B9",X"39", + X"02",X"02",X"04",X"02",X"08",X"06",X"86",X"0C",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02", + X"80",X"06",X"0C",X"08",X"06",X"80",X"06",X"0C",X"48",X"06",X"02",X"02",X"02",X"02",X"02",X"02", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"86",X"02",X"02",X"02",X"04",X"02",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E2",X"10",X"20",X"10",X"E6",X"36",X"10",X"F8", + X"42",X"8E",X"42",X"4C",X"31",X"31",X"31",X"62",X"47",X"86",X"89",X"48",X"70",X"47",X"24",X"89", + X"C8",X"58",X"48",X"01",X"65",X"65",X"EF",X"65",X"9A",X"75",X"FF",X"9E",X"9A",X"BB",X"9E",X"FF", + X"02",X"02",X"02",X"06",X"0E",X"0C",X"06",X"06",X"06",X"02",X"02",X"02",X"46",X"02",X"02",X"B9", + X"3A",X"10",X"F6",X"10",X"0B",X"16",X"C7",X"16",X"20",X"20",X"DD",X"31",X"24",X"20",X"20",X"20", + X"98",X"4D",X"86",X"19",X"48",X"D2",X"4D",X"CC",X"4D",X"CA",X"88",X"48",X"04",X"65",X"65",X"01", + X"0A",X"75",X"FF",X"9E",X"9A",X"BB",X"FF",X"9E",X"6F",X"65",X"04",X"0F",X"4D",X"84",X"00",X"00", + X"BB",X"39",X"04",X"3F",X"73",X"73",X"BB",X"39",X"F9",X"D5",X"04",X"DD",X"39",X"42",X"DD",X"39", + X"39",X"04",X"DD",X"39",X"04",X"D9",X"F9",X"D5",X"71",X"75",X"04",X"3F",X"77",X"04",X"3D",X"75", + X"77",X"04",X"3F",X"77",X"04",X"D9",X"F9",X"D5",X"BB",X"39",X"0A",X"DD",X"39",X"4C",X"D9",X"F9", + X"3D",X"71",X"71",X"B9",X"39",X"04",X"3D",X"71",X"71",X"71",X"B9",X"F9",X"D5",X"04",X"3F",X"77", + X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"02",X"00", + X"02",X"00",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02", + X"FF",X"10",X"F9",X"91",X"95",X"95",X"95",X"95",X"F9",X"F9",X"F9",X"D5",X"04",X"D9",X"F9",X"F9", + X"95",X"99",X"F9",X"D5",X"0A",X"D9",X"F9",X"D5",X"D5",X"04",X"D9",X"F9",X"F9",X"F9",X"D5",X"40", + X"DD",X"39",X"04",X"DD",X"39",X"04",X"3D",X"71",X"71",X"71",X"71",X"75",X"04",X"D9",X"F9",X"F7", + X"3F",X"77",X"04",X"3F",X"77",X"04",X"3F",X"73",X"B7",X"73",X"73",X"77",X"04",X"D9",X"F9",X"D5", + X"DD",X"39",X"0A",X"D9",X"F9",X"D5",X"04",X"3D",X"04",X"79",X"97",X"97",X"97",X"7D",X"04",X"DD", + X"3D",X"75",X"04",X"D9",X"F9",X"D5",X"04",X"DD",X"04",X"D9",X"F9",X"F9",X"F9",X"D5",X"04",X"3F", + X"75",X"04",X"D9",X"F9",X"F7",X"73",X"73",X"77",X"73",X"73",X"77",X"04",X"3F",X"73",X"BB",X"39", + X"39",X"04",X"D9",X"F9",X"D5",X"84",X"DD",X"39",X"F9",X"D5",X"04",X"3D",X"75",X"04",X"3D",X"71", + X"97",X"7D",X"04",X"3F",X"77",X"04",X"3F",X"77",X"F9",X"D5",X"04",X"DD",X"39",X"04",X"3F",X"73", + X"F9",X"D5",X"40",X"DD",X"39",X"04",X"3F",X"77",X"DD",X"39",X"04",X"B1",X"F9",X"F9",X"F9",X"D5", + X"02",X"02",X"02",X"06",X"08",X"06",X"80",X"06",X"06",X"06",X"08",X"06",X"02",X"02",X"02",X"02", + X"0E",X"8A",X"08",X"06",X"02",X"02",X"02",X"02",X"02",X"02",X"06",X"06",X"08",X"06",X"80",X"06", + X"02",X"4A",X"06",X"02",X"02",X"02",X"06",X"0E",X"06",X"0E",X"06",X"06",X"02",X"02",X"02",X"02", + X"02",X"02",X"02",X"02",X"02",X"0E",X"06",X"06",X"02",X"06",X"0E",X"06",X"0C",X"0E",X"0C",X"06", + X"06",X"0C",X"08",X"02",X"02",X"02",X"08",X"48",X"06",X"08",X"4E",X"06",X"06",X"08",X"06",X"08", + X"02",X"4E",X"02",X"02",X"02",X"06",X"08",X"06",X"02",X"02",X"4E",X"02",X"02",X"02",X"06",X"08", + X"4E",X"06",X"06",X"08",X"02",X"02",X"02",X"08",X"0E",X"08",X"48",X"06",X"0C",X"0E",X"08",X"48", + X"02",X"02",X"48",X"06",X"02",X"02",X"02",X"02",X"06",X"80",X"06",X"0C",X"08",X"06",X"02",X"02", + X"FF",X"65",X"89",X"47",X"88",X"00",X"00",X"C3",X"00",X"2D",X"47",X"CA",X"9A",X"10",X"9A",X"9A", + X"01",X"65",X"04",X"01",X"65",X"65",X"9A",X"00",X"D5",X"04",X"DD",X"D1",X"95",X"95",X"95",X"95", + X"95",X"99",X"F9",X"F9",X"F9",X"F9",X"D5",X"04",X"D5",X"04",X"DD",X"39",X"40",X"DD",X"39",X"0A", + X"39",X"0A",X"D9",X"F9",X"D5",X"04",X"DD",X"39",X"39",X"04",X"3D",X"75",X"04",X"3F",X"95",X"95", + X"00",X"00",X"CB",X"4D",X"68",X"00",X"00",X"9A",X"21",X"75",X"FF",X"FF",X"65",X"64",X"21",X"04", + X"64",X"00",X"98",X"0A",X"00",X"00",X"9A",X"FB",X"95",X"9D",X"39",X"04",X"3F",X"95",X"95",X"95", + X"D1",X"95",X"95",X"95",X"95",X"95",X"95",X"95",X"39",X"40",X"D9",X"F9",X"D5",X"04",X"3D",X"71", + X"71",X"75",X"04",X"3D",X"71",X"71",X"71",X"75",X"75",X"04",X"D9",X"F9",X"D5",X"04",X"DD",X"B7", + X"3F",X"73",X"73",X"73",X"77",X"04",X"DD",X"B7",X"73",X"73",X"BB",X"F9",X"D5",X"0A",X"DD",X"11", + X"D9",X"F9",X"F5",X"71",X"71",X"75",X"04",X"DD",X"97",X"97",X"7D",X"04",X"DD",X"39",X"04",X"3D", + X"D9",X"F9",X"F7",X"73",X"73",X"77",X"04",X"3F",X"F9",X"F9",X"D5",X"04",X"3F",X"77",X"04",X"DD", + X"D9",X"F9",X"D5",X"42",X"DD",X"39",X"04",X"B1",X"DD",X"39",X"04",X"D9",X"F9",X"D5",X"04",X"3D", + X"F5",X"FF",X"9A",X"9A",X"02",X"01",X"65",X"04",X"BB",X"7B",X"D6",X"95",X"5A",X"F8",X"85",X"1D", + X"06",X"FD",X"0C",X"A0",X"80",X"EC",X"02",X"A4",X"9D",X"04",X"17",X"A5",X"C2",X"B3",X"17",X"5B", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"02", + X"FF",X"00",X"00",X"FF",X"FD",X"00",X"00",X"00",X"FF",X"00",X"00",X"02",X"FF",X"02",X"FF",X"00", + X"95",X"95",X"77",X"04",X"3F",X"95",X"95",X"95",X"D9",X"F9",X"D5",X"04",X"DD",X"39",X"8A",X"DD", + X"04",X"DD",X"39",X"04",X"3D",X"71",X"71",X"71",X"04",X"3D",X"75",X"04",X"3D",X"75",X"04",X"DD", + X"04",X"3F",X"77",X"04",X"3F",X"73",X"73",X"73",X"04",X"DD",X"39",X"04",X"DD",X"39",X"04",X"3F", + X"42",X"DD",X"39",X"04",X"DD",X"39",X"0A",X"DD",X"71",X"71",X"75",X"04",X"3D",X"71",X"75",X"04", + X"04",X"DD",X"B7",X"73",X"73",X"77",X"04",X"DD",X"D9",X"F9",X"D5",X"04",X"DD",X"39",X"04",X"DD", + X"71",X"71",X"75",X"04",X"3D",X"75",X"04",X"3D",X"04",X"3F",X"77",X"04",X"DD",X"39",X"04",X"3D", + X"73",X"73",X"77",X"04",X"DD",X"39",X"04",X"3F",X"0A",X"DD",X"39",X"04",X"DD",X"39",X"48",X"DD", + X"04",X"DD",X"39",X"04",X"DD",X"B5",X"71",X"71",X"04",X"DD",X"B5",X"71",X"71",X"75",X"04",X"3D", + X"71",X"71",X"71",X"75",X"04",X"DD",X"39",X"04",X"11",X"11",X"39",X"04",X"DD",X"B5",X"71",X"71", + X"02",X"02",X"02",X"02",X"02",X"06",X"02",X"02",X"44",X"06",X"0E",X"0C",X"06",X"06",X"02",X"02", + X"06",X"0E",X"06",X"02",X"02",X"02",X"06",X"0E",X"0C",X"0E",X"06",X"06",X"02",X"02",X"02",X"02", + X"02",X"02",X"02",X"02",X"02",X"0E",X"06",X"4A",X"02",X"02",X"02",X"02",X"02",X"02",X"4A",X"06", + X"39",X"0C",X"DD",X"39",X"04",X"B1",X"F9",X"F9",X"04",X"D9",X"F9",X"D5",X"04",X"DD",X"39",X"04", + X"F9",X"F9",X"F9",X"D5",X"04",X"3D",X"71",X"71",X"04",X"D9",X"00",X"34",X"04",X"02",X"86",X"02", + X"08",X"06",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"0C",X"08",X"06", + X"08",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"0E",X"08",X"48",X"06",X"0C",X"0E",X"08",X"48", + X"02",X"0C",X"08",X"06",X"86",X"0C",X"08",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"31",X"CA",X"24",X"CA",X"10",X"07",X"16",X"C9",X"16",X"52",X"42",X"8E", + X"42",X"8E",X"42",X"8E",X"42",X"00",X"00",X"36",X"B9",X"B2",X"47",X"2E",X"58",X"B9",X"F6",X"47", + X"01",X"44",X"98",X"9A",X"9A",X"9A",X"FF",X"DE",X"8A",X"10",X"9A",X"75",X"6F",X"04",X"75",X"FF", + X"44",X"06",X"40",X"02",X"02",X"02",X"02",X"02",X"CA",X"24",X"CA",X"E2",X"10",X"20",X"10",X"E6", + X"14",X"8C",X"44",X"8C",X"44",X"8C",X"44",X"20",X"20",X"8C",X"44",X"8C",X"44",X"8C",X"00",X"00", + X"19",X"B9",X"32",X"4D",X"2C",X"88",X"B9",X"76",X"64",X"04",X"10",X"9A",X"FE",X"9A",X"8A",X"90", + X"FE",X"9A",X"0A",X"75",X"FF",X"FF",X"FF",X"75",X"49",X"4D",X"CA",X"00",X"00",X"89",X"4D",X"22", + X"0A",X"DD",X"39",X"04",X"DD",X"39",X"04",X"D9",X"0A",X"DD",X"39",X"04",X"3D",X"71",X"71",X"B9", + X"04",X"DD",X"39",X"04",X"3D",X"71",X"71",X"71",X"04",X"3F",X"77",X"04",X"3F",X"73",X"73",X"73", + X"04",X"DD",X"39",X"04",X"3F",X"73",X"73",X"73",X"D5",X"04",X"DD",X"39",X"0C",X"DD",X"39",X"04", + X"71",X"71",X"75",X"04",X"3D",X"71",X"71",X"71",X"04",X"3D",X"71",X"75",X"04",X"3F",X"77",X"04", + X"00",X"00",X"02",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"02",X"02",X"02", + X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF", + X"99",X"F9",X"D5",X"04",X"D9",X"F9",X"F9",X"F9",X"F9",X"91",X"95",X"95",X"95",X"95",X"95",X"95", + X"04",X"D9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"D9",X"F9",X"D5",X"04",X"3D",X"75",X"04",X"3F", + X"71",X"B9",X"39",X"04",X"DD",X"39",X"04",X"3D",X"73",X"73",X"77",X"04",X"DD",X"11",X"39",X"04", + X"73",X"BB",X"39",X"04",X"3F",X"77",X"04",X"DD",X"0A",X"DD",X"11",X"39",X"46",X"DD",X"39",X"0A", + X"75",X"04",X"DD",X"11",X"39",X"04",X"3D",X"75",X"39",X"04",X"3D",X"75",X"04",X"DD",X"39",X"04", + X"39",X"04",X"3F",X"73",X"77",X"04",X"DD",X"39",X"77",X"04",X"DD",X"39",X"04",X"3F",X"77",X"04", + X"04",X"3F",X"77",X"04",X"3F",X"73",X"73",X"73",X"04",X"DD",X"B7",X"73",X"73",X"77",X"04",X"DD", + X"04",X"DD",X"39",X"0A",X"DD",X"39",X"04",X"D9",X"71",X"71",X"71",X"75",X"04",X"79",X"97",X"97", + X"04",X"3D",X"75",X"04",X"DD",X"39",X"04",X"D9",X"73",X"73",X"BB",X"39",X"04",X"D9",X"F9",X"F9", + X"04",X"D9",X"F9",X"D5",X"04",X"DD",X"39",X"0C",X"04",X"3D",X"71",X"71",X"71",X"75",X"04",X"DD", + X"06",X"06",X"08",X"06",X"80",X"02",X"02",X"02",X"84",X"02",X"02",X"02",X"08",X"0E",X"8A",X"08", + X"84",X"02",X"02",X"02",X"08",X"06",X"80",X"02",X"06",X"06",X"08",X"02",X"02",X"02",X"02",X"02", + X"06",X"4A",X"0C",X"06",X"0E",X"06",X"4A",X"0C",X"02",X"02",X"02",X"02",X"02",X"02",X"06",X"02", + X"06",X"0E",X"06",X"0C",X"0E",X"06",X"02",X"02",X"06",X"02",X"02",X"02",X"02",X"02",X"02",X"02", + X"02",X"02",X"02",X"06",X"02",X"02",X"02",X"08",X"4E",X"06",X"06",X"08",X"06",X"02",X"02",X"02", + X"C2",X"08",X"06",X"C2",X"08",X"06",X"02",X"02",X"06",X"08",X"4E",X"06",X"06",X"08",X"06",X"08", + X"48",X"02",X"02",X"02",X"06",X"02",X"02",X"02",X"06",X"0C",X"08",X"02",X"02",X"02",X"02",X"02", + X"02",X"02",X"08",X"06",X"80",X"06",X"0C",X"08",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02", + X"47",X"8E",X"00",X"00",X"CF",X"47",X"C4",X"00",X"EF",X"65",X"01",X"65",X"65",X"EF",X"65",X"65", + X"00",X"00",X"9A",X"9A",X"FB",X"65",X"10",X"F9",X"95",X"95",X"95",X"9D",X"D1",X"95",X"95",X"95", + X"DD",X"D1",X"95",X"95",X"95",X"95",X"99",X"F9",X"D9",X"F9",X"F9",X"F9",X"F9",X"D5",X"04",X"DD", + X"04",X"3D",X"71",X"71",X"71",X"75",X"04",X"DD",X"95",X"95",X"77",X"04",X"3F",X"77",X"04",X"3D", + X"FE",X"9A",X"9B",X"FF",X"65",X"EF",X"65",X"64",X"00",X"00",X"21",X"65",X"04",X"9A",X"8A",X"21", + X"10",X"F9",X"91",X"95",X"95",X"95",X"95",X"95",X"95",X"95",X"95",X"95",X"95",X"95",X"95",X"9D", + X"99",X"F9",X"D5",X"0E",X"DD",X"39",X"4A",X"DD",X"71",X"75",X"04",X"DD",X"39",X"04",X"3D",X"71", + X"04",X"3F",X"77",X"04",X"3D",X"75",X"04",X"3D",X"73",X"77",X"04",X"3F",X"77",X"04",X"3F",X"73", + X"73",X"73",X"77",X"04",X"DD",X"B7",X"73",X"73",X"39",X"46",X"DD",X"39",X"0A",X"DD",X"39",X"0A", + X"11",X"39",X"04",X"3D",X"75",X"04",X"79",X"97",X"75",X"04",X"DD",X"39",X"04",X"3D",X"75",X"04", + X"73",X"77",X"04",X"DD",X"39",X"04",X"D9",X"F9",X"39",X"04",X"3F",X"77",X"04",X"DD",X"39",X"04", + X"F9",X"F9",X"F9",X"D5",X"0A",X"DD",X"39",X"0A",X"71",X"71",X"71",X"71",X"75",X"04",X"DD",X"39", + X"22",X"00",X"00",X"02",X"00",X"80",X"A4",X"11",X"FD",X"04",X"95",X"42",X"A0",X"28",X"80",X"7D", + X"FD",X"A0",X"15",X"06",X"A0",X"2C",X"00",X"68",X"A0",X"2A",X"F8",X"3D",X"B1",X"A4",X"0E",X"90", + X"EB",X"A0",X"A2",X"98",X"A2",X"0C",X"FF",X"33",X"1D",X"A6",X"5E",X"68",X"FA",X"3D",X"4E",X"15", + X"5E",X"FA",X"2F",X"15",X"5A",X"A0",X"28",X"8A",X"93",X"50",X"A4",X"11",X"90",X"F2",X"27",X"5E", + X"12",X"1B",X"3B",X"0C",X"28",X"5B",X"DC",X"68",X"82",X"FD",X"58",X"64",X"7C",X"A2",X"A0",X"44", + X"B4",X"A2",X"FA",X"A4",X"08",X"14",X"F8",X"A4",X"90",X"A1",X"3D",X"02",X"20",X"82",X"13",X"F2", + X"4E",X"4E",X"5E",X"7B",X"16",X"0B",X"12",X"A4",X"BD",X"17",X"46",X"26",X"00",X"58",X"4E",X"08", + X"00",X"10",X"B1",X"08",X"00",X"18",X"4E",X"08",X"12",X"9C",X"12",X"16",X"22",X"0C",X"90",X"EC", + X"0A",X"40",X"0E",X"E1",X"46",X"39",X"48",X"FD",X"74",X"9B",X"74",X"AD",X"7A",X"7A",X"D7",X"7A", + X"28",X"24",X"83",X"85",X"28",X"85",X"28",X"68",X"48",X"FD",X"FF",X"FF",X"FF",X"E4",X"00",X"5E", + X"EC",X"02",X"A4",X"69",X"14",X"EC",X"8C",X"A4",X"00",X"5E",X"FD",X"02",X"55",X"C9",X"A8",X"7F", + X"8C",X"A4",X"69",X"1C",X"4C",X"48",X"17",X"C9",X"A8",X"7F",X"C8",X"8A",X"EC",X"06",X"A4",X"69", + X"5B",X"9C",X"AA",X"C6",X"84",X"5B",X"12",X"AC",X"F0",X"9F",X"3B",X"E8",X"5E",X"22",X"EC",X"5E", + X"2C",X"AA",X"4C",X"00",X"C0",X"7F",X"33",X"B2",X"5C",X"5E",X"DF",X"33",X"77",X"B4",X"66",X"E4", + X"08",X"EC",X"11",X"67",X"DE",X"B6",X"22",X"8E",X"20",X"34",X"CC",X"08",X"C0",X"DC",X"5E",X"57", + X"B5",X"70",X"AA",X"BD",X"B1",X"48",X"C0",X"04",X"9B",X"26",X"9C",X"26",X"DC",X"C0",X"86",X"77", + X"DE",X"9B",X"0C",X"66",X"5B",X"DC",X"68",X"0C",X"F3",X"A4",X"C2",X"FC",X"A4",X"64",X"14",X"26", + X"4E",X"3D",X"06",X"1D",X"A2",X"FD",X"A8",X"20",X"DC",X"68",X"E4",X"10",X"90",X"0E",X"3D",X"02", + X"90",X"3D",X"80",X"55",X"41",X"A2",X"6F",X"A4",X"6A",X"20",X"F9",X"A2",X"35",X"E4",X"0C",X"06", + X"E8",X"BE",X"26",X"B4",X"26",X"80",X"F1",X"E6",X"80",X"F1",X"E6",X"E6",X"CA",X"15",X"D6",X"A4", + X"FF",X"02",X"00",X"00",X"02",X"FF",X"00",X"00",X"64",X"9A",X"64",X"9A",X"9A",X"9A",X"9A",X"9A", + X"2A",X"2A",X"2A",X"24",X"24",X"24",X"24",X"02",X"42",X"80",X"4C",X"70",X"80",X"B0",X"8E",X"88", + X"9A",X"9A",X"64",X"9A",X"64",X"94",X"54",X"2B",X"83",X"02",X"02",X"02",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"9A",X"64",X"9A",X"64",X"9A",X"64",X"9A",X"64",X"94",X"54",X"2B",X"89",X"50", + X"69",X"14",X"82",X"02",X"00",X"C0",X"6B",X"26",X"27",X"E4",X"04",X"5C",X"2F",X"20",X"40",X"EC", + X"B1",X"03",X"0C",X"00",X"42",X"82",X"04",X"5E",X"00",X"5E",X"A4",X"29",X"5A",X"22",X"CE",X"5E", + X"53",X"F0",X"FD",X"0C",X"20",X"08",X"22",X"1D",X"F0",X"FD",X"02",X"60",X"08",X"0C",X"00",X"C0", + X"60",X"40",X"0C",X"04",X"FD",X"08",X"60",X"04",X"BE",X"55",X"3C",X"20",X"EC",X"02",X"04",X"53", + X"E2",X"55",X"E2",X"2B",X"EA",X"22",X"EC",X"1D",X"EA",X"A0",X"EC",X"99",X"07",X"50",X"52",X"1E", + X"4F",X"6E",X"01",X"E6",X"01",X"16",X"94",X"1A",X"6E",X"01",X"E6",X"01",X"1C",X"94",X"1A",X"1A", + X"01",X"49",X"04",X"90",X"58",X"12",X"D2",X"1A",X"80",X"80",X"C4",X"C4",X"C4",X"C4",X"C4",X"C4", + X"1A",X"94",X"10",X"98",X"9E",X"5E",X"6E",X"0B",X"10",X"10",X"5E",X"9C",X"1A",X"94",X"6E",X"03", + X"5E",X"68",X"FA",X"3D",X"4E",X"15",X"BA",X"A0",X"2F",X"15",X"BA",X"A0",X"28",X"8A",X"15",X"B4", + X"1E",X"80",X"29",X"B3",X"93",X"FD",X"18",X"15",X"0C",X"02",X"17",X"EB",X"A0",X"F6",X"3D",X"02", + X"D3",X"22",X"00",X"58",X"0C",X"08",X"A4",X"11",X"BB",X"22",X"00",X"10",X"0C",X"08",X"A4",X"11", + X"80",X"B9",X"0C",X"08",X"A4",X"11",X"90",X"EC",X"D3",X"80",X"40",X"0C",X"26",X"5B",X"DC",X"68", + X"90",X"9D",X"08",X"97",X"00",X"A2",X"11",X"5E",X"A4",X"02",X"5C",X"A4",X"00",X"90",X"F7",X"E4", + X"EC",X"04",X"A4",X"C9",X"5C",X"E4",X"10",X"90",X"A4",X"C9",X"5C",X"F0",X"A3",X"3D",X"02",X"60", + X"3D",X"04",X"60",X"0A",X"EC",X"08",X"A4",X"E9",X"80",X"A4",X"E9",X"5C",X"F0",X"A3",X"3D",X"40", + X"01",X"90",X"3D",X"06",X"1D",X"2A",X"1E",X"5B",X"4E",X"3D",X"06",X"FD",X"06",X"20",X"40",X"0C", + X"17",X"C9",X"A8",X"4C",X"28",X"17",X"C9",X"A8",X"C9",X"A8",X"4C",X"50",X"17",X"C9",X"A8",X"4C", + X"59",X"82",X"AC",X"0C",X"0C",X"DB",X"22",X"48",X"FD",X"B1",X"55",X"DD",X"A8",X"FD",X"B3",X"55", + X"B7",X"55",X"BE",X"AA",X"FD",X"BB",X"55",X"0E",X"55",X"B7",X"AA",X"FD",X"F1",X"55",X"FB",X"AA", + X"02",X"9F",X"5E",X"22",X"6C",X"5E",X"DF",X"F2",X"DF",X"F8",X"03",X"84",X"33",X"3B",X"EC",X"04", + X"82",X"EC",X"5E",X"9B",X"26",X"DC",X"26",X"9C",X"66",X"B6",X"82",X"06",X"00",X"C0",X"CA",X"26", + X"04",X"00",X"C0",X"80",X"22",X"8E",X"5E",X"F0",X"CC",X"02",X"C0",X"00",X"DB",X"7C",X"00",X"DB", + X"02",X"DB",X"66",X"DB",X"66",X"80",X"02",X"53",X"AC",X"02",X"22",X"20",X"5E",X"FC",X"26",X"2D", + X"82",X"00",X"00",X"60",X"5F",X"E4",X"04",X"5C",X"17",X"4D",X"0A",X"F0",X"7F",X"C8",X"A0",X"1E", + X"40",X"5B",X"7B",X"A4",X"80",X"F7",X"A4",X"11",X"E4",X"10",X"90",X"3D",X"30",X"15",X"56",X"26", + X"10",X"90",X"3D",X"80",X"15",X"56",X"26",X"CC",X"A4",X"E4",X"00",X"90",X"27",X"20",X"B9",X"5B", + X"7D",X"FF",X"20",X"B7",X"80",X"3B",X"57",X"06",X"10",X"0C",X"08",X"EC",X"10",X"BE",X"68",X"20", + X"11",X"90",X"E4",X"10",X"90",X"3D",X"80",X"55",X"22",X"00",X"60",X"66",X"F8",X"AB",X"20",X"F7", + X"04",X"A8",X"40",X"D1",X"42",X"A9",X"4E",X"D0",X"9A",X"9B",X"74",X"9B",X"74",X"65",X"74",X"9A", + X"9A",X"85",X"28",X"85",X"28",X"24",X"24",X"24",X"48",X"99",X"4A",X"09",X"84",X"A1",X"86",X"9B", + X"D4",X"6B",X"AB",X"9B",X"74",X"9B",X"74",X"65",X"28",X"24",X"83",X"29",X"02",X"98",X"0C",X"F1", + X"FF",X"7A",X"7A",X"7A",X"7A",X"7A",X"7A",X"7A",X"7A",X"9D",X"D4",X"6B",X"AB",X"2A",X"2A",X"2A", + X"40",X"5A",X"3D",X"4E",X"57",X"EE",X"57",X"EE",X"EC",X"AC",X"A4",X"44",X"58",X"53",X"06",X"08", + X"02",X"08",X"02",X"02",X"02",X"86",X"AE",X"26",X"AE",X"F4",X"AE",X"0D",X"AE",X"CB",X"AE",X"A3", + X"EA",X"37",X"EA",X"0D",X"EA",X"04",X"EC",X"58",X"EA",X"BC",X"EA",X"B5",X"EA",X"02",X"00",X"04", + X"E0",X"D1",X"E0",X"35",X"E0",X"79",X"E0",X"BD",X"E2",X"64",X"E2",X"D0",X"E2",X"12",X"E2",X"82", + X"D2",X"D6",X"6E",X"43",X"6E",X"81",X"7B",X"04",X"94",X"98",X"10",X"14",X"9A",X"98",X"98",X"5E", + X"10",X"90",X"58",X"12",X"D2",X"1A",X"94",X"10",X"01",X"6F",X"04",X"A2",X"10",X"5E",X"94",X"10", + X"96",X"6E",X"0F",X"00",X"6E",X"00",X"01",X"00",X"90",X"9A",X"16",X"56",X"5A",X"12",X"5C",X"10", + X"A0",X"10",X"DA",X"DC",X"DE",X"6E",X"4D",X"6E",X"66",X"68",X"6A",X"6C",X"10",X"A2",X"E2",X"E0", + X"90",X"F2",X"0D",X"5E",X"FA",X"1D",X"04",X"7E",X"F2",X"2F",X"20",X"8A",X"A4",X"0E",X"90",X"F8", + X"FA",X"FD",X"04",X"D5",X"06",X"A0",X"17",X"14",X"4E",X"4E",X"4E",X"4E",X"DE",X"0C",X"00",X"17", + X"93",X"50",X"A4",X"11",X"90",X"F2",X"27",X"BE",X"5A",X"A0",X"F2",X"0F",X"0F",X"03",X"1D",X"A2", + X"15",X"54",X"A0",X"E6",X"E6",X"E6",X"E6",X"33",X"FC",X"27",X"E3",X"15",X"AB",X"A0",X"1D",X"A6", + X"33",X"F8",X"FD",X"10",X"64",X"78",X"A2",X"E0",X"FD",X"18",X"64",X"B0",X"A2",X"E0",X"06",X"64", + X"38",X"14",X"E4",X"00",X"90",X"1E",X"E4",X"10",X"3D",X"4E",X"1E",X"F2",X"3D",X"B1",X"4E",X"4E", + X"11",X"90",X"E4",X"10",X"90",X"3D",X"80",X"60",X"00",X"58",X"B1",X"08",X"00",X"10",X"4E",X"08", + X"00",X"18",X"B1",X"08",X"5E",X"10",X"12",X"9E",X"02",X"BE",X"6A",X"20",X"F9",X"6F",X"A4",X"06", + X"FF",X"FF",X"FF",X"9B",X"74",X"9B",X"74",X"9B",X"7A",X"7A",X"7A",X"9D",X"D4",X"6B",X"AB",X"50", + X"02",X"D9",X"0A",X"40",X"0E",X"E1",X"46",X"39",X"FD",X"02",X"55",X"C9",X"A8",X"7F",X"C8",X"A4", + X"69",X"1C",X"4C",X"00",X"17",X"C9",X"A8",X"E4",X"C8",X"8E",X"EC",X"04",X"A4",X"69",X"14",X"EC", + X"A8",X"E4",X"00",X"5E",X"FD",X"02",X"55",X"C9",X"14",X"EC",X"8C",X"A4",X"69",X"1C",X"4C",X"C0", + X"DF",X"FA",X"03",X"C6",X"84",X"22",X"4E",X"5E",X"DF",X"F2",X"57",X"6E",X"9F",X"FD",X"FF",X"15", + X"DE",X"33",X"EC",X"06",X"9F",X"9E",X"9B",X"22",X"42",X"5C",X"5E",X"E4",X"B4",X"5C",X"23",X"60", + X"5E",X"F0",X"9F",X"EA",X"BE",X"82",X"00",X"00",X"62",X"57",X"62",X"57",X"62",X"57",X"62",X"2F", + X"3D",X"4E",X"53",X"77",X"5B",X"12",X"AC",X"77",X"22",X"4E",X"5E",X"F0",X"9F",X"AC",X"00",X"77", + X"6C",X"5B",X"DC",X"68",X"93",X"8C",X"00",X"22",X"FC",X"A4",X"54",X"14",X"E4",X"01",X"90",X"4E", + X"02",X"E8",X"A4",X"69",X"12",X"0C",X"62",X"5B",X"1D",X"68",X"1E",X"5B",X"DC",X"68",X"E4",X"10", + X"00",X"90",X"B7",X"22",X"0E",X"90",X"6F",X"BE",X"D3",X"33",X"93",X"A4",X"11",X"90",X"13",X"EC", + X"E6",X"13",X"B2",X"26",X"EC",X"EE",X"BE",X"26",X"B3",X"D3",X"80",X"D9",X"A2",X"11",X"5E",X"0C", + X"FF",X"02",X"00",X"00",X"02",X"FF",X"00",X"9A",X"64",X"9A",X"64",X"94",X"54",X"2B",X"89",X"2A", + X"02",X"02",X"02",X"D0",X"04",X"40",X"0E",X"30",X"C2",X"94",X"54",X"2B",X"89",X"65",X"64",X"9A", + X"89",X"85",X"28",X"2A",X"52",X"50",X"28",X"24",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"9A",X"9A",X"9A",X"65",X"64",X"9A",X"9A",X"9A",X"28",X"24",X"83",X"22",X"18",X"18",X"40",X"D0", + X"FC",X"A4",X"E9",X"5C",X"82",X"04",X"00",X"C0",X"04",X"A4",X"59",X"5C",X"A4",X"D9",X"5C",X"22", + X"02",X"48",X"00",X"7B",X"A1",X"EC",X"02",X"A4",X"EC",X"00",X"A4",X"2B",X"5A",X"0C",X"88",X"5F", + X"5A",X"53",X"22",X"FD",X"58",X"53",X"0A",X"1B",X"82",X"E4",X"86",X"5C",X"0C",X"02",X"FD",X"02", + X"0C",X"06",X"DF",X"13",X"17",X"B4",X"6A",X"57",X"22",X"00",X"00",X"24",X"95",X"5A",X"53",X"E4", + X"EA",X"10",X"EC",X"8B",X"EA",X"82",X"EC",X"A9",X"50",X"10",X"96",X"16",X"5E",X"94",X"1A",X"6E", + X"18",X"52",X"98",X"10",X"10",X"10",X"6E",X"4F",X"10",X"90",X"58",X"12",X"D2",X"6E",X"4F",X"6E", + X"94",X"10",X"5E",X"5C",X"1A",X"6E",X"0B",X"6E",X"80",X"80",X"49",X"04",X"90",X"58",X"12",X"D2", + X"6E",X"01",X"85",X"04",X"1E",X"12",X"5A",X"1A",X"6E",X"01",X"94",X"04",X"94",X"1A",X"12",X"18", + X"F2",X"0F",X"0F",X"03",X"1D",X"A2",X"5E",X"FA",X"A0",X"E6",X"E6",X"E6",X"E6",X"F0",X"9D",X"80", + X"1A",X"A0",X"F6",X"7D",X"B1",X"15",X"1A",X"A0",X"7D",X"02",X"DE",X"0C",X"00",X"A2",X"11",X"5E", + X"90",X"AC",X"00",X"68",X"20",X"F7",X"28",X"80",X"90",X"EC",X"10",X"BE",X"68",X"20",X"F9",X"28", + X"4E",X"BE",X"68",X"20",X"F9",X"28",X"80",X"B9",X"17",X"B8",X"A2",X"F6",X"1D",X"A0",X"A4",X"09", + X"A4",X"11",X"90",X"6F",X"A4",X"00",X"5C",X"E8",X"00",X"90",X"6E",X"1E",X"3D",X"31",X"60",X"0A", + X"6E",X"5E",X"3D",X"30",X"60",X"0A",X"EC",X"02",X"0A",X"EC",X"40",X"A4",X"E9",X"5C",X"F0",X"A3", + X"5C",X"F0",X"A3",X"3D",X"08",X"60",X"0A",X"EC",X"60",X"0A",X"EC",X"20",X"A4",X"E9",X"5C",X"E4", + X"DC",X"68",X"E4",X"01",X"90",X"4E",X"4E",X"4E",X"64",X"5B",X"DC",X"68",X"17",X"C8",X"A4",X"0E", + X"4C",X"A0",X"17",X"C9",X"A8",X"4C",X"E8",X"17",X"98",X"17",X"C9",X"A8",X"E4",X"00",X"5E",X"2F", + X"5E",X"DB",X"7C",X"00",X"DB",X"3C",X"02",X"FC",X"76",X"AA",X"FD",X"B5",X"55",X"8F",X"AA",X"FD", + X"AC",X"FD",X"BD",X"55",X"29",X"AA",X"FD",X"BF",X"FD",X"FF",X"55",X"57",X"AA",X"BC",X"3B",X"EC", + X"09",X"5B",X"9C",X"AA",X"84",X"5B",X"12",X"AC",X"9F",X"5E",X"22",X"6C",X"5E",X"DF",X"F2",X"0B", + X"C0",X"00",X"33",X"9B",X"DF",X"77",X"93",X"B4",X"5C",X"22",X"8E",X"5E",X"F0",X"9F",X"B2",X"82", + X"9F",X"EA",X"BE",X"82",X"00",X"00",X"20",X"08",X"3C",X"02",X"C2",X"DB",X"BA",X"00",X"DB",X"B8", + X"17",X"63",X"A8",X"22",X"CE",X"5E",X"F0",X"9F",X"26",X"2D",X"26",X"2D",X"26",X"2D",X"26",X"2D", + X"2F",X"55",X"8B",X"22",X"6F",X"A4",X"00",X"5E",X"82",X"02",X"00",X"C0",X"AF",X"EC",X"10",X"A4", + X"90",X"E4",X"10",X"90",X"3D",X"80",X"60",X"BD",X"0C",X"40",X"5B",X"7B",X"A4",X"80",X"F7",X"E4", + X"02",X"0C",X"08",X"A4",X"11",X"90",X"5B",X"7B",X"7B",X"A4",X"A4",X"11",X"90",X"E4",X"00",X"90", + X"F6",X"FD",X"80",X"D5",X"63",X"A4",X"22",X"00",X"F9",X"28",X"80",X"BF",X"5B",X"B9",X"E4",X"A4", + X"DF",X"A4",X"17",X"56",X"26",X"A4",X"11",X"90",X"53",X"A0",X"A2",X"AA",X"A2",X"A0",X"A4",X"00", + X"82",X"40",X"8C",X"A8",X"8E",X"9A",X"9A",X"9A",X"9B",X"9A",X"9A",X"9A",X"9A",X"65",X"64",X"9A", + X"24",X"29",X"02",X"98",X"0C",X"F1",X"0E",X"61",X"74",X"9B",X"74",X"9D",X"D4",X"6B",X"AB",X"9D", + X"74",X"9A",X"9B",X"85",X"28",X"2A",X"52",X"50",X"0E",X"61",X"48",X"99",X"4A",X"FD",X"FF",X"FF", + X"7A",X"AD",X"7A",X"7A",X"D7",X"7A",X"7A",X"7A",X"2A",X"85",X"28",X"85",X"28",X"68",X"02",X"D9", + X"6E",X"CC",X"C8",X"07",X"FD",X"C0",X"20",X"04",X"02",X"04",X"02",X"02",X"02",X"02",X"48",X"02", + X"AE",X"A4",X"AE",X"12",X"AE",X"D4",X"AE",X"74",X"AE",X"22",X"EA",X"00",X"EA",X"FB",X"AE",X"3E", + X"E0",X"D4",X"E0",X"E8",X"EA",X"9E",X"EA",X"97",X"00",X"06",X"00",X"E9",X"E0",X"19",X"E0",X"5D", + X"E0",X"00",X"E2",X"44",X"E2",X"C4",X"E2",X"7E",X"EC",X"0D",X"E2",X"8F",X"E2",X"A1",X"E2",X"EB", + X"90",X"9A",X"96",X"50",X"10",X"96",X"98",X"12",X"5C",X"6E",X"0F",X"6E",X"01",X"6F",X"04",X"A2", + X"5E",X"5C",X"58",X"D2",X"10",X"6E",X"0F",X"6E",X"A4",X"10",X"90",X"58",X"12",X"D2",X"1A",X"94", + X"8D",X"06",X"14",X"5E",X"5C",X"9A",X"96",X"10",X"1C",X"5E",X"94",X"10",X"10",X"10",X"A0",X"A0", + X"01",X"E5",X"04",X"D8",X"10",X"60",X"62",X"64",X"A0",X"6E",X"07",X"6E",X"01",X"3A",X"06",X"10", + X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"2C",X"12",X"5C",X"2E",X"10",X"6E",X"0F",X"6E",X"01", + X"2C",X"6E",X"03",X"6E",X"01",X"1A",X"02",X"2C",X"6E",X"01",X"50",X"02",X"2C",X"90",X"52",X"5C", + X"02",X"2C",X"5A",X"52",X"16",X"56",X"D2",X"2C",X"A2",X"A0",X"10",X"DA",X"DC",X"DE",X"6E",X"CF", + X"10",X"DA",X"DC",X"DE",X"6E",X"CF",X"6E",X"01",X"6C",X"6E",X"07",X"6E",X"01",X"1B",X"04",X"10", + X"A8",X"01",X"43",X"45",X"4B",X"4D",X"6E",X"43",X"94",X"D2",X"10",X"10",X"5E",X"56",X"6E",X"4F", + X"10",X"10",X"10",X"94",X"10",X"5A",X"6E",X"4F",X"52",X"5C",X"10",X"10",X"A2",X"10",X"16",X"94", + X"01",X"40",X"06",X"A4",X"10",X"16",X"5E",X"52",X"18",X"52",X"98",X"10",X"6E",X"4F",X"6E",X"01", + X"10",X"10",X"A4",X"10",X"16",X"94",X"1A",X"18",X"06",X"1C",X"94",X"1A",X"1A",X"10",X"10",X"90", + X"87",X"8D",X"41",X"8D",X"87",X"8D",X"41",X"8D",X"BE",X"F0",X"F0",X"BA",X"B6",X"70",X"83",X"8B", + X"8B",X"85",X"87",X"49",X"45",X"41",X"0D",X"81",X"81",X"8D",X"83",X"41",X"03",X"FF",X"1E",X"A0", + X"BE",X"20",X"5C",X"80",X"5A",X"80",X"58",X"80",X"3C",X"A0",X"3E",X"10",X"B0",X"B1",X"F7",X"E6", + X"41",X"78",X"B2",X"B4",X"B6",X"B6",X"B2",X"87",X"F4",X"F0",X"BC",X"BA",X"8D",X"78",X"83",X"21", + X"8D",X"06",X"10",X"12",X"18",X"18",X"52",X"98",X"10",X"12",X"98",X"10",X"10",X"10",X"A0",X"A0", + X"01",X"D4",X"04",X"10",X"10",X"10",X"10",X"10",X"02",X"02",X"6E",X"01",X"90",X"10",X"10",X"10", + X"5A",X"52",X"18",X"9E",X"12",X"D2",X"10",X"5A",X"10",X"6E",X"03",X"6E",X"01",X"6E",X"01",X"1B", + X"1E",X"10",X"10",X"6E",X"03",X"6E",X"01",X"7C",X"56",X"D2",X"6E",X"03",X"6E",X"01",X"51",X"04", + X"EC",X"02",X"A4",X"88",X"5C",X"53",X"0F",X"6E",X"1E",X"9A",X"94",X"1A",X"E6",X"E6",X"6E",X"0B", + X"58",X"52",X"96",X"98",X"E6",X"E6",X"E6",X"E6",X"98",X"5E",X"14",X"5E",X"56",X"1A",X"E6",X"E6", + X"16",X"94",X"D2",X"14",X"12",X"14",X"D2",X"E6",X"02",X"06",X"02",X"02",X"02",X"06",X"04",X"04", + X"08",X"0C",X"04",X"04",X"04",X"04",X"08",X"04",X"02",X"02",X"02",X"02",X"04",X"08",X"08",X"08", + X"0B",X"7E",X"95",X"F5",X"E4",X"28",X"C0",X"B5",X"21",X"88",X"29",X"8E",X"61",X"8C",X"69",X"8C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"B6",X"20",X"00",X"48",X"00",X"44",X"CE",X"00", + X"D2",X"02",X"0C",X"40",X"00",X"00",X"04",X"00",X"D2",X"04",X"0C",X"44",X"00",X"00",X"04",X"00", + X"D2",X"08",X"0C",X"48",X"00",X"0C",X"04",X"00",X"AC",X"0E",X"0F",X"7E",X"00",X"00",X"08",X"00", + X"6E",X"01",X"76",X"04",X"96",X"98",X"12",X"94",X"01",X"48",X"06",X"5A",X"96",X"10",X"90",X"12", + X"01",X"76",X"04",X"10",X"10",X"10",X"10",X"10",X"76",X"04",X"12",X"16",X"98",X"10",X"52",X"52", + X"76",X"04",X"98",X"50",X"1A",X"D2",X"10",X"5A",X"06",X"5E",X"98",X"98",X"5E",X"5A",X"1A",X"5C", + X"80",X"19",X"91",X"EC",X"E4",X"04",X"5C",X"3F",X"EB",X"EC",X"C9",X"EC",X"07",X"A8",X"25",X"EC", + X"DB",X"7C",X"A0",X"DB",X"3C",X"A2",X"AC",X"03",X"DB",X"7C",X"90",X"DB",X"3C",X"92",X"AC",X"09", + X"FF",X"4A",X"DB",X"42",X"DB",X"7C",X"00",X"DB",X"06",X"AC",X"41",X"DB",X"7C",X"80",X"DB",X"3C", + X"AC",X"41",X"DB",X"7C",X"20",X"DB",X"3C",X"22",X"47",X"DB",X"7C",X"A0",X"DB",X"3C",X"A2",X"AA", + X"DB",X"7C",X"10",X"DB",X"3C",X"12",X"AA",X"DB",X"7C",X"90",X"DB",X"3C",X"92",X"AA",X"DB",X"7C", + X"E6",X"E6",X"6E",X"03",X"6E",X"01",X"1B",X"04",X"E6",X"E6",X"E6",X"E6",X"6E",X"03",X"6E",X"01", + X"14",X"9A",X"96",X"1A",X"E6",X"E6",X"6E",X"07",X"90",X"E6",X"E6",X"E6",X"E6",X"E6",X"E6",X"E6", + X"6E",X"03",X"6E",X"81",X"7C",X"04",X"96",X"9A",X"5A",X"12",X"5C",X"6E",X"43",X"6E",X"01",X"5A", + X"00",X"00",X"6C",X"01",X"0D",X"47",X"4B",X"4D",X"10",X"10",X"6E",X"89",X"6E",X"81",X"A4",X"01", + X"10",X"10",X"6E",X"4F",X"6E",X"01",X"44",X"06",X"5E",X"5C",X"1A",X"6E",X"4F",X"6E",X"01",X"44", + X"4F",X"6E",X"01",X"48",X"06",X"90",X"9A",X"16",X"4C",X"06",X"98",X"12",X"14",X"58",X"1A",X"10", + X"90",X"94",X"52",X"1E",X"50",X"98",X"6E",X"4F",X"4F",X"6E",X"01",X"76",X"02",X"2C",X"12",X"5E", + X"EA",X"5E",X"22",X"00",X"5A",X"9F",X"77",X"F2",X"84",X"53",X"64",X"D5",X"14",X"D5",X"D4",X"D5", + X"BA",X"B2",X"BA",X"B2",X"70",X"70",X"3A",X"3C",X"78",X"B2",X"BA",X"B6",X"76",X"78",X"B6",X"BC", + X"B2",X"B6",X"B8",X"BA",X"74",X"76",X"78",X"B6",X"B2",X"BA",X"B2",X"70",X"50",X"10",X"70",X"3E", + X"BA",X"B6",X"B2",X"B2",X"B6",X"8B",X"BA",X"B6",X"BC",X"74",X"78",X"83",X"81",X"83",X"FF",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"6E",X"07",X"6E",X"01",X"7C",X"04",X"10",X"6E",X"07",X"6E",X"01",X"7C",X"04",X"5A", + X"5C",X"6E",X"43",X"6E",X"01",X"7C",X"04",X"10",X"6E",X"0B",X"6E",X"01",X"EA",X"04",X"10",X"10", + X"A2",X"10",X"6E",X"03",X"6E",X"01",X"7C",X"04",X"0F",X"6E",X"01",X"76",X"04",X"54",X"9A",X"5C", + X"4F",X"6E",X"01",X"76",X"04",X"9E",X"52",X"98",X"6E",X"01",X"76",X"04",X"98",X"50",X"1A",X"10", + X"02",X"02",X"06",X"02",X"02",X"02",X"08",X"02",X"02",X"78",X"0A",X"02",X"02",X"02",X"C0",X"08", + X"06",X"08",X"8C",X"08",X"06",X"02",X"02",X"02",X"02",X"04",X"08",X"04",X"08",X"4C",X"04",X"08", + X"04",X"08",X"04",X"02",X"02",X"02",X"02",X"04",X"02",X"04",X"02",X"44",X"02",X"02",X"02",X"02", + X"08",X"00",X"04",X"10",X"02",X"EC",X"EA",X"80",X"02",X"EC",X"EA",X"80",X"22",X"25",X"10",X"82", + X"C8",X"B0",X"47",X"40",X"00",X"02",X"0C",X"00",X"9C",X"48",X"FF",X"49",X"00",X"04",X"40",X"00", + X"AC",X"E0",X"FD",X"84",X"F1",X"08",X"4E",X"F9",X"02",X"04",X"08",X"40",X"80",X"20",X"10",X"01", + X"05",X"45",X"85",X"C5",X"27",X"6B",X"E1",X"17",X"DD",X"E8",X"DF",X"E8",X"B3",X"06",X"B5",X"06", + X"F2",X"F2",X"F0",X"8F",X"BC",X"BA",X"B8",X"B6",X"83",X"8B",X"41",X"8B",X"83",X"8B",X"41",X"8B", + X"85",X"A8",X"17",X"EC",X"AF",X"EC",X"8F",X"A8",X"A4",X"02",X"5E",X"17",X"4D",X"0A",X"5B",X"14", + X"4D",X"0A",X"7F",X"C8",X"A0",X"7F",X"C8",X"4E",X"0A",X"7F",X"C8",X"A2",X"17",X"4D",X"0A",X"7F", + X"17",X"4D",X"0A",X"7F",X"C8",X"80",X"17",X"4D",X"E4",X"02",X"5E",X"E8",X"3D",X"4E",X"A4",X"02", + X"03",X"EE",X"57",X"1E",X"60",X"A6",X"DB",X"42",X"DB",X"7C",X"80",X"DB",X"3C",X"82",X"AC",X"0F", + X"14",X"A1",X"14",X"81",X"14",X"B0",X"14",X"90",X"12",X"A1",X"12",X"81",X"12",X"B0",X"12",X"90", + X"10",X"A1",X"10",X"6F",X"10",X"6D",X"10",X"6B",X"10",X"53",X"10",X"73",X"10",X"42",X"12",X"62", + X"12",X"53",X"12",X"73",X"12",X"42",X"14",X"62",X"14",X"53",X"14",X"55",X"14",X"57",X"14",X"59", + X"14",X"53",X"14",X"55",X"14",X"57",X"14",X"59",X"14",X"14",X"5F",X"14",X"91",X"14",X"00",X"5E", + X"5A",X"96",X"10",X"90",X"12",X"16",X"E6",X"5A",X"02",X"2C",X"12",X"56",X"12",X"14",X"1A",X"52", + X"5A",X"12",X"16",X"56",X"D2",X"2C",X"6E",X"03",X"56",X"D2",X"2C",X"6E",X"07",X"6E",X"01",X"50", + X"6E",X"07",X"6E",X"01",X"BC",X"04",X"80",X"10",X"6E",X"01",X"F0",X"04",X"88",X"10",X"AA",X"A0", + X"DA",X"04",X"60",X"62",X"64",X"66",X"68",X"6A",X"5E",X"52",X"56",X"12",X"56",X"1A",X"E6",X"E6", + X"6E",X"81",X"08",X"06",X"5A",X"1A",X"5A",X"5E",X"6E",X"01",X"08",X"06",X"14",X"12",X"18",X"10", + X"6E",X"01",X"40",X"06",X"A2",X"10",X"16",X"5E",X"1A",X"18",X"52",X"98",X"10",X"6E",X"4F",X"6E", + X"5C",X"96",X"10",X"A2",X"10",X"16",X"94",X"1A",X"40",X"06",X"A2",X"10",X"16",X"5E",X"52",X"5C", + X"52",X"98",X"96",X"6E",X"4F",X"6E",X"01",X"40",X"58",X"12",X"D2",X"10",X"10",X"10",X"10",X"10", + X"87",X"8D",X"41",X"8D",X"AD",X"A7",X"BA",X"BC",X"41",X"8B",X"83",X"8B",X"41",X"8B",X"0D",X"8D", + X"81",X"8D",X"8B",X"81",X"81",X"0D",X"81",X"8D",X"56",X"80",X"58",X"80",X"5A",X"80",X"5C",X"80", + X"54",X"80",X"1E",X"80",X"1C",X"80",X"3A",X"A0",X"B3",X"00",X"B5",X"04",X"B7",X"44",X"B9",X"00", + X"78",X"B6",X"BA",X"BC",X"BC",X"BA",X"8D",X"F8",X"41",X"BA",X"BC",X"BE",X"F0",X"B2",X"B6",X"B8", + X"52",X"5E",X"5C",X"12",X"58",X"10",X"10",X"10",X"A0",X"10",X"DA",X"DC",X"DE",X"6E",X"8B",X"6E", + X"10",X"10",X"6E",X"0E",X"0E",X"0E",X"02",X"02",X"6E",X"0F",X"6E",X"01",X"D6",X"04",X"D8",X"10", + X"1C",X"1E",X"10",X"16",X"5E",X"10",X"10",X"10",X"04",X"E6",X"5A",X"12",X"18",X"10",X"18",X"5E", + X"04",X"10",X"10",X"10",X"14",X"58",X"52",X"5C",X"E6",X"56",X"52",X"58",X"58",X"1A",X"94",X"10", + X"01",X"57",X"04",X"10",X"56",X"52",X"5A",X"12",X"6E",X"01",X"57",X"04",X"10",X"96",X"98",X"D2", + X"6E",X"0B",X"6E",X"01",X"5D",X"04",X"10",X"5E",X"E6",X"6E",X"0F",X"6E",X"01",X"5D",X"04",X"10", + X"E6",X"E6",X"E6",X"6E",X"0F",X"6E",X"01",X"02",X"04",X"02",X"02",X"02",X"02",X"04",X"08",X"08", + X"08",X"08",X"08",X"0C",X"04",X"04",X"04",X"04",X"0C",X"04",X"04",X"04",X"04",X"0C",X"08",X"0A", + X"81",X"88",X"89",X"4E",X"C1",X"8A",X"C9",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C9",X"8C",X"C9",X"8C",X"C9",X"8C",X"B4",X"20",X"F7",X"0F",X"00",X"04",X"4E",X"00", + X"D2",X"02",X"0C",X"42",X"00",X"00",X"04",X"00",X"D2",X"06",X"0C",X"46",X"00",X"00",X"04",X"00", + X"28",X"00",X"0C",X"40",X"04",X"00",X"44",X"00",X"B0",X"08",X"00",X"00",X"00",X"00",X"40",X"00", + X"94",X"52",X"5C",X"1E",X"10",X"6E",X"4F",X"6E",X"16",X"E6",X"5A",X"1A",X"5C",X"6E",X"4F",X"6E", + X"10",X"10",X"10",X"10",X"6E",X"0B",X"6E",X"01",X"52",X"2C",X"10",X"10",X"6E",X"0F",X"6E",X"01", + X"1A",X"1A",X"98",X"6E",X"4F",X"6E",X"01",X"48",X"6E",X"4F",X"6E",X"01",X"E4",X"04",X"5C",X"FD", + X"DE",X"08",X"8D",X"EC",X"47",X"EC",X"48",X"00",X"41",X"A8",X"67",X"EC",X"4B",X"A8",X"A3",X"EC", + X"DB",X"7C",X"10",X"DB",X"3C",X"12",X"AC",X"03",X"53",X"4A",X"6F",X"E3",X"F5",X"22",X"EE",X"0C", + X"3C",X"02",X"AA",X"DB",X"7C",X"04",X"DB",X"3C",X"82",X"AA",X"DB",X"7C",X"84",X"DB",X"3C",X"86", + X"AA",X"DB",X"7C",X"24",X"DB",X"3C",X"26",X"AC",X"DB",X"7C",X"A4",X"DB",X"3C",X"A6",X"AC",X"05", + X"7C",X"14",X"DB",X"3C",X"16",X"AC",X"05",X"DB",X"94",X"DB",X"3C",X"96",X"AC",X"07",X"53",X"91", + X"10",X"9A",X"94",X"16",X"50",X"52",X"5C",X"E6",X"51",X"04",X"10",X"5A",X"12",X"16",X"50",X"52", + X"6E",X"01",X"51",X"04",X"10",X"94",X"5E",X"5A",X"6E",X"07",X"6E",X"01",X"2A",X"01",X"03",X"0B", + X"90",X"1A",X"94",X"10",X"90",X"12",X"16",X"E6",X"12",X"5C",X"6E",X"43",X"6E",X"01",X"6E",X"81", + X"6E",X"4F",X"6E",X"81",X"A0",X"01",X"10",X"10",X"43",X"45",X"4B",X"4D",X"6E",X"43",X"6E",X"81", + X"14",X"5E",X"5C",X"9A",X"96",X"10",X"10",X"5C",X"06",X"14",X"5E",X"5C",X"9A",X"96",X"10",X"6E", + X"56",X"5A",X"12",X"5C",X"6E",X"4F",X"6E",X"01",X"10",X"6E",X"4F",X"6E",X"01",X"4C",X"06",X"9A", + X"6E",X"01",X"44",X"04",X"A0",X"A0",X"A0",X"6E",X"96",X"9A",X"56",X"1A",X"2C",X"6E",X"0B",X"6E", + X"22",X"B5",X"E2",X"9F",X"84",X"26",X"86",X"FC",X"B4",X"D5",X"7F",X"0A",X"02",X"7F",X"80",X"88", + X"3E",X"61",X"67",X"69",X"49",X"0D",X"BC",X"BA",X"F4",X"F0",X"F0",X"BC",X"B6",X"78",X"65",X"61", + X"BA",X"BC",X"BE",X"F0",X"B2",X"B6",X"B8",X"BA",X"70",X"65",X"63",X"65",X"74",X"30",X"45",X"BC", + X"B2",X"70",X"70",X"32",X"36",X"74",X"61",X"78",X"2C",X"0F",X"B0",X"B1",X"CB",X"E8",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"10",X"90",X"52",X"5C",X"56",X"D2",X"96",X"10",X"90",X"12",X"16",X"E6",X"5A",X"12", + X"10",X"10",X"52",X"5C",X"56",X"D2",X"10",X"10",X"A2",X"E2",X"E0",X"A0",X"E4",X"A2",X"E2",X"E0", + X"10",X"10",X"10",X"10",X"96",X"9A",X"1A",X"6E",X"52",X"5E",X"94",X"10",X"10",X"10",X"10",X"6E", + X"50",X"10",X"10",X"10",X"10",X"10",X"6E",X"4F",X"16",X"50",X"12",X"96",X"1A",X"10",X"6E",X"4F", + X"02",X"02",X"06",X"02",X"02",X"08",X"02",X"02",X"08",X"C0",X"0A",X"02",X"02",X"02",X"8E",X"04", + X"BC",X"02",X"02",X"02",X"02",X"06",X"02",X"02",X"04",X"08",X"04",X"08",X"46",X"02",X"02",X"02", + X"04",X"04",X"4C",X"04",X"08",X"04",X"08",X"04",X"06",X"02",X"02",X"02",X"06",X"02",X"02",X"06", + X"10",X"10",X"4C",X"EA",X"EC",X"80",X"15",X"16",X"5E",X"E4",X"AC",X"88",X"C4",X"2F",X"51",X"86", + X"C8",X"B0",X"47",X"40",X"00",X"02",X"0C",X"00",X"9C",X"00",X"04",X"44",X"0E",X"06",X"48",X"00", + X"24",X"02",X"02",X"0C",X"00",X"02",X"0E",X"00",X"00",X"9E",X"D8",X"32",X"3E",X"7A",X"B8",X"F6", + X"99",X"E6",X"B7",X"E6",X"D0",X"E8",X"8B",X"E8",X"B7",X"44",X"B9",X"04",X"81",X"F8",X"F6",X"F4", + X"B6",X"B4",X"83",X"61",X"41",X"30",X"54",X"58",X"83",X"8B",X"41",X"8B",X"8B",X"C1",X"89",X"8F", + X"53",X"EC",X"53",X"7F",X"C8",X"48",X"EC",X"30",X"8D",X"17",X"4D",X"0A",X"7F",X"C8",X"4A",X"17", + X"17",X"4D",X"0A",X"7F",X"C8",X"6E",X"17",X"4D",X"C8",X"A6",X"17",X"4D",X"0A",X"7F",X"C8",X"4C", + X"0A",X"6F",X"A4",X"88",X"5C",X"17",X"F8",X"0A",X"5E",X"5E",X"57",X"03",X"0C",X"00",X"DB",X"22", + X"DB",X"7C",X"00",X"DB",X"3C",X"02",X"AC",X"0F",X"DB",X"7C",X"20",X"DB",X"3C",X"22",X"AC",X"45", + X"14",X"A0",X"14",X"80",X"14",X"B1",X"12",X"91",X"12",X"A0",X"12",X"80",X"12",X"B1",X"10",X"91", + X"10",X"69",X"10",X"67",X"10",X"65",X"10",X"63",X"12",X"52",X"12",X"72",X"12",X"43",X"12",X"63", + X"14",X"52",X"14",X"72",X"14",X"43",X"14",X"63",X"14",X"5B",X"14",X"5D",X"14",X"5F",X"14",X"91", + X"14",X"5B",X"14",X"5D",X"14",X"5F",X"14",X"91",X"53",X"00",X"00",X"A0",X"4B",X"00",X"BA",X"B6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_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/Arcade/Pacman Hardware/MsPacman_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/build_id.v new file mode 100644 index 00000000..c283ed44 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171113" +`define BUILD_TIME "103258" diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_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/Arcade/Pacman Hardware/MsPacman_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/MsPacman_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_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/Arcade/Pacman Hardware/MsPacman_MiST/rtl/osd.v b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_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/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..6ccb7094 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman.vhd @@ -0,0 +1,619 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN is +generic ( + MRTNT : std_logic := '0'; -- 1 to descramble Mr TNT ROMs, 0 otherwise + MSPACMAN : std_logic := '1' -- set to 1 when using Ms Pacman ROMs, 0 otherwise +); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0_reg : in std_logic_vector(7 downto 0); + in1_reg : in std_logic_vector(7 downto 0); + dipsw_reg : in std_logic_vector(7 downto 0); + + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of PACMAN is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_ena : std_logic; + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal rom_data : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal vram_addr_ab : std_logic_vector(11 downto 0); + signal ab : std_logic_vector(11 downto 0); + + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal vram_l : std_logic; + signal rams_data_out : std_logic_vector(7 downto 0); + -- more decode + signal wr0_l : std_logic; + signal wr1_l : std_logic; + signal wr2_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + +begin + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + p_sync_comb : process(hcnt, vcnt) + begin + vsync <= not vcnt(8); + do_hsync <= (hcnt = "010101111"); -- 0AF + end process; + + p_sync : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + + if (hcnt = "010010111") then -- 097 + O_HBLANK <= '1'; + elsif (hcnt = "010001111") then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") then + hblank <= '0'; -- 0EF + O_HBLANK <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + -- + -- cpu + -- + p_cpu_wait_comb : process(sync_bus_wreq_l) + begin + cpu_wait_l <= '1'; + if (sync_bus_wreq_l = '0') then + cpu_wait_l <= '0'; + end if; + end process; + + p_irq_req_watchdog : process + variable rising_vblank : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + --rising_vblank := do_hsync; -- debug + -- interrupt 8c + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + + -- simulation + -- pragma translate_off + -- synopsys translate_off + watchdog_reset_l <= not reset; -- watchdog disable + -- synopsys translate_on + -- pragma translate_on + end if; + end process; + + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + + p_cpu_ena : process(hcnt, ena_6) + begin + cpu_ena <= '0'; + if (ena_6 = '1') then + cpu_ena <= hcnt(0); + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + -- + -- primary addr decode + -- + p_mem_decode_comb : process(cpu_rfsh_l, cpu_rd_l, cpu_mreq_l, cpu_addr) + begin + -- rom 0x0000 - 0x3FFF + -- syncbus 0x4000 - 0x7FFF + + -- 7M + -- 7N + sync_bus_cs_l <= '1'; +-- program_rom_cs_l <= '1'; + + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + +-- if (cpu_addr(14) = '0') and (cpu_rd_l = '0') then +-- program_rom_cs_l <= '0'; +-- end if; + + if (cpu_addr(14) = '1') then + sync_bus_cs_l <= '0'; + end if; + + end if; + end process; + -- + -- sync bus custom ic + -- + p_sync_bus_reg : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; + end process; + + p_sync_bus_comb : process(cpu_rd_l, sync_bus_cs_l, hcnt) + begin + -- sync_bus_stb is now an active low clock enable signal + sync_bus_stb <= '1'; + sync_bus_r_w_l <= '1'; + + if (sync_bus_cs_l = '0') and (hcnt(1) = '0') then + if (cpu_rd_l = '1') then + sync_bus_r_w_l <= '0'; + end if; + sync_bus_stb <= '0'; + end if; + + sync_bus_wreq_l <= '1'; + if (sync_bus_cs_l = '0') and (hcnt(1) = '1') and (cpu_rd_l = '0') then + sync_bus_wreq_l <= '0'; + end if; + end process; + -- + -- vram addr custom ic + -- + u_vram_addr : entity work.PACMAN_VRAM_ADDR + port map ( + AB => vram_addr_ab, + H256_L => hcnt(8), + H128 => hcnt(7), + H64 => hcnt(6), + H32 => hcnt(5), + H16 => hcnt(4), + H8 => hcnt(3), + H4 => hcnt(2), + H2 => hcnt(1), + H1 => hcnt(0), + V128 => vcnt(7), + V64 => vcnt(6), + V32 => vcnt(5), + V16 => vcnt(4), + V8 => vcnt(3), + V4 => vcnt(2), + V2 => vcnt(1), + V1 => vcnt(0), + FLIP => control_reg(3) + ); + + p_ab_mux_comb : process(hcnt, cpu_addr, vram_addr_ab) + begin + --When 2H is low, the CPU controls the bus. + if (hcnt(1) = '0') then + ab <= cpu_addr(11 downto 0); + else + ab <= vram_addr_ab; + end if; + end process; + + p_vram_comb : process(hcnt, cpu_addr, sync_bus_stb) + variable a,b : std_logic; + begin + + a := not (cpu_addr(12) or sync_bus_stb); + b := hcnt(1) and hcnt(0); + vram_l <= not (a or b); + end process; + + p_io_decode_comb : process(sync_bus_r_w_l, sync_bus_stb, ab, cpu_addr) + variable sel : std_logic_vector(2 downto 0); + variable dec : std_logic_vector(7 downto 0); + variable selb : std_logic_vector(1 downto 0); + variable decb : std_logic_vector(3 downto 0); + begin + -- WRITE + + -- out_l 0x5000 - 0x503F control space + + -- wr0_l 0x5040 - 0x504F sound + -- wr1_l 0x5050 - 0x505F sound + -- wr2_l 0x5060 - 0x506F sprite + + -- 0x5080 - 0x50BF unused + + -- wdr_l 0x50C0 - 0x50FF watchdog reset + + -- READ + + -- in0_l 0x5000 - 0x503F in port 0 + -- in1_l 0x5040 - 0x507F in port 1 + -- dipsw_l 0x5080 - 0x50BF dip switches + + -- 7J + dec := "11111111"; + sel := sync_bus_r_w_l & ab(7) & ab(6); + if (cpu_addr(12) = '1') and ( sync_bus_stb = '0') then + case sel is + when "000" => dec := "11111110"; + when "001" => dec := "11111101"; + when "010" => dec := "11111011"; + when "011" => dec := "11110111"; + when "100" => dec := "11101111"; + when "101" => dec := "11011111"; + when "110" => dec := "10111111"; + when "111" => dec := "01111111"; + when others => null; + end case; + end if; + iodec_out_l <= dec(0); + iodec_wdr_l <= dec(3); + + iodec_in0_l <= dec(4); + iodec_in1_l <= dec(5); + iodec_dipsw_l <= dec(6); + + -- 7M + decb := "1111"; + selb := ab(5) & ab(4); + if (dec(1) = '0') then + case selb is + when "00" => decb := "1110"; + when "01" => decb := "1101"; + when "10" => decb := "1011"; + when "11" => decb := "0111"; + when others => null; + end case; + end if; + wr0_l <= decb(0); + wr1_l <= decb(1); + wr2_l <= decb(2); + end process; + + p_control_reg : process + variable ena : std_logic_vector(7 downto 0); + begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + ena := "00000000"; + if (iodec_out_l = '0') then + case ab(2 downto 0) is + when "000" => ena := "00000001"; + when "001" => ena := "00000010"; + when "010" => ena := "00000100"; + when "011" => ena := "00001000"; + when "100" => ena := "00010000"; + when "101" => ena := "00100000"; + when "110" => ena := "01000000"; + when "111" => ena := "10000000"; + when others => null; + end case; + end if; + + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (ena(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + p_db_mux_comb : process(hcnt, cpu_data_out, rams_data_out) + begin + -- simplified data source for video subsystem + -- only cpu or ram are sources of interest + if (hcnt(1) = '0') then + sync_bus_db <= cpu_data_out; + else + sync_bus_db <= rams_data_out; + end if; + end process; + + p_cpu_data_in_mux_comb : process(cpu_addr, cpu_iorq_l, cpu_m1_l, sync_bus_wreq_l, + iodec_in0_l, iodec_in1_l, iodec_dipsw_l, cpu_vec_reg, sync_bus_reg, rom_data, + rams_data_out, in0_reg, in1_reg, dipsw_reg) + begin + -- simplifed again + if (cpu_iorq_l = '0') and (cpu_m1_l = '0') then + cpu_data_in <= cpu_vec_reg; + elsif (sync_bus_wreq_l = '0') then + cpu_data_in <= sync_bus_reg; + else + if (cpu_addr(15 downto 14) = "00") then -- ROM at 0000 - 3fff + cpu_data_in <= rom_data; + elsif (cpu_addr(15 downto 13) = "100") then -- ROM at 8000 - 9fff + cpu_data_in <= rom_data; + else + cpu_data_in <= rams_data_out; + if (iodec_in0_l = '0') then cpu_data_in <= in0_reg; end if; + if (iodec_in1_l = '0') then cpu_data_in <= in1_reg; end if; + if (iodec_dipsw_l = '0') then cpu_data_in <= dipsw_reg; end if; + end if; + end if; + end process; + + u_rams : work.dpram generic map (12,8) + port map + ( + clk_a_i => clk, + en_a_i => ena_6, + we_i => not sync_bus_r_w_l and not vram_l, + addr_a_i => ab(11 downto 0), + data_a_i => cpu_data_out, -- cpu only source of ram data + + clk_b_i => clk, + addr_b_i => ab(11 downto 0), + data_b_o => rams_data_out + ); + + u_program_rom: work.rom_descrambler + generic map ( + MRTNT => MRTNT, + MSPACMAN => MSPACMAN + ) + port map( + CLK => clk, + cpu_m1_l => cpu_m1_l, + addr => cpu_addr, + data => rom_data + ); + + -- + -- video subsystem + -- + u_video : entity work.PACMAN_VIDEO + generic map ( + MRTNT => MRTNT + ) + port map ( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + I_WR2_L => wr2_l, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk + ); + + O_HSYNC <= hSync; + O_VSYNC <= vSync; + + --O_HBLANK <= hblank; + O_VBLANK <= vblank; + + -- + -- + -- audio subsystem + -- + u_audio : entity work.PACMAN_AUDIO + port map ( + I_HCNT => hcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_WR1_L => wr1_l, + I_WR0_L => wr0_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..39619ea0 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR1_L, + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => rom3m(1), + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman_rom_descrambler.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman_rom_descrambler.vhd new file mode 100644 index 00000000..b8d20de6 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman_rom_descrambler.vhd @@ -0,0 +1,446 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) d18c7db (gmail) - May 2013 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- + + +-- The following comments and source code in the comments are from MAME source code and are +-- included here to help make sense of the logic used in the VHDL address mapper and descrambler +-- +--/************************************ +-- * +-- * Ms. Pac-Man +-- * +-- ************************************/ +-- +--/* +-- Ms. Pac-Man has an auxiliary PCB with ribbon cable that plugs into the Z-80 CPU socket of a Pac-Man main PCB. Also the +-- graphics ROMs at 5E, 5F on the main board are replaced. +-- +-- The aux board contains three ROMs (two 2532 at U6, U7 and one 2716 at U5), a Z-80, and four PAL/HAL logic chips. +-- +-- The aux board logic decodes the Z-80 address and determines whether to enable the main board ROMs (containing Pac-Man +-- code) or the aux board ROMs (containing Ms. Pac-Man code). Normally the Pac-Man ROMs reside at address 0x0000-0x3fff +-- and are mirrored at 0x8000-0xbfff (Z-80 A15 is not used in Pac-Man). The aux board logic modifies the address map and +-- enables the aux board ROMs for addresses 0x3000-0x3fff and 0x8000-0x97ff. Furthermore there are forty 8-byte "patch" +-- regions which reside in the 0x0000-0x2fff address range. Any access to these patch addresses will disable the Pac-Man +-- ROMs and enable the aux board ROM. Aux board ROM addresses 0x8000-0x81ef are mapped onto the patch regions. These +-- patches typically insert jumps to new code above 0x8000. +-- +-- The aux board logic also acts as a software protection circuit which inhibits dumping of the ROMs (e.g., using a +-- microprocessor emulator system). There are several "trap" address regions which enable and disable the decode +-- functions. In order to properly operate as Ms. Pac-Man you must access one of the "latch set" trap addresses. This +-- enables the decode. If a "latch clear" address is accessed then decode is disabled and all you get is Pac-Man. For +-- more info see U.S. Patent 4,525,599 "Software protection methods and apparatus". +-- +-- The trap regions are 8 bytes in length starting on the following addresses: +-- +-- latch clear, decode disable +-- 0x0038 +-- 0x03b0 +-- 0x1600 +-- 0x2120 +-- 0x3ff0 +-- 0x8000 +-- 0x97f0 +-- +-- latch set, decode enable +-- 0x3ff8 +-- +-- Any memory access will trigger the trap behavior: instruction fetch, data read, data write. The latch clear addresses +-- should never be accessed during normal Ms. Pac-Man operation, so when the circuitry detects an access it clears the +-- latch and prevents any further dumping of the aux board ROMs. +-- +-- The Pac-Man self-test code does a checksum of the ROM 0x0000-0x2fff. This works because the checksum routine walks the +-- ROM starting from the low address and hits the latch clear trap at 0x0038 prior to encountering any of the patch +-- regions. The decode stays disabled for the rest of the checksum routine, and thus the checksum is calculated for the +-- Pac-Man ROMs with no patches applied. +-- +-- During normal operation every VBLANK (60.6Hz) interrupt will fetch its interrupt vector from the 0x3ff8 trap region, so +-- the latch is continually being enabled. +-- +-- In a further attempt to thwart copying, the aux board ROMs have a simple encryption scheme: their address and data +-- lines are bit flipped (i.e., wired in a nonstandard fashion). The specific bit flips were selected to minimize the +-- vias required to lay out the aux PCB. +--*/ + +-- +--static void mspacman_install_patches(UINT8 *ROM) +--{ +-- int i; +-- +-- /* copy forty 8-byte patches into Pac-Man code */ +-- for (i = 0; i < 8; i++) +-- { +-- ROM[0x0410+i] = ROM[0x8008+i]; +-- ROM[0x08E0+i] = ROM[0x81D8+i]; +-- ROM[0x0A30+i] = ROM[0x8118+i]; +-- ROM[0x0BD0+i] = ROM[0x80D8+i]; +-- ROM[0x0C20+i] = ROM[0x8120+i]; +-- ROM[0x0E58+i] = ROM[0x8168+i]; +-- ROM[0x0EA8+i] = ROM[0x8198+i]; +-- +-- ROM[0x1000+i] = ROM[0x8020+i]; +-- ROM[0x1008+i] = ROM[0x8010+i]; +-- ROM[0x1288+i] = ROM[0x8098+i]; +-- ROM[0x1348+i] = ROM[0x8048+i]; +-- ROM[0x1688+i] = ROM[0x8088+i]; +-- ROM[0x16B0+i] = ROM[0x8188+i]; +-- ROM[0x16D8+i] = ROM[0x80C8+i]; +-- ROM[0x16F8+i] = ROM[0x81C8+i]; +-- ROM[0x19A8+i] = ROM[0x80A8+i]; +-- ROM[0x19B8+i] = ROM[0x81A8+i]; +-- +-- ROM[0x2060+i] = ROM[0x8148+i]; +-- ROM[0x2108+i] = ROM[0x8018+i]; +-- ROM[0x21A0+i] = ROM[0x81A0+i]; +-- ROM[0x2298+i] = ROM[0x80A0+i]; +-- ROM[0x23E0+i] = ROM[0x80E8+i]; +-- ROM[0x2418+i] = ROM[0x8000+i]; +-- ROM[0x2448+i] = ROM[0x8058+i]; +-- ROM[0x2470+i] = ROM[0x8140+i]; +-- ROM[0x2488+i] = ROM[0x8080+i]; +-- ROM[0x24B0+i] = ROM[0x8180+i]; +-- ROM[0x24D8+i] = ROM[0x80C0+i]; +-- ROM[0x24F8+i] = ROM[0x81C0+i]; +-- ROM[0x2748+i] = ROM[0x8050+i]; +-- ROM[0x2780+i] = ROM[0x8090+i]; +-- ROM[0x27B8+i] = ROM[0x8190+i]; +-- ROM[0x2800+i] = ROM[0x8028+i]; +-- ROM[0x2B20+i] = ROM[0x8100+i]; +-- ROM[0x2B30+i] = ROM[0x8110+i]; +-- ROM[0x2BF0+i] = ROM[0x81D0+i]; +-- ROM[0x2CC0+i] = ROM[0x80D0+i]; +-- ROM[0x2CD8+i] = ROM[0x80E0+i]; +-- ROM[0x2CF0+i] = ROM[0x81E0+i]; +-- ROM[0x2D60+i] = ROM[0x8160+i]; +-- } +--} +-- +--DRIVER_INIT_MEMBER(pacman_state,mspacman) +--{ +-- int i; +-- UINT8 *ROM, *DROM; +-- +-- /* CPU ROMs */ +-- +-- /* Pac-Man code is in low bank */ +-- ROM = machine().root_device().memregion("maincpu")->base(); +-- +-- /* decrypted Ms. Pac-Man code is in high bank */ +-- DROM = &machine().root_device().memregion("maincpu")->base()[0x10000]; +-- +-- /* copy ROMs into decrypted bank */ +-- for (i = 0; i < 0x1000; i++) +-- { +-- DROM[0x0000+i] = ROM[0x0000+i]; /* pacman.6e */ +-- DROM[0x1000+i] = ROM[0x1000+i]; /* pacman.6f */ +-- DROM[0x2000+i] = ROM[0x2000+i]; /* pacman.6h */ +-- DROM[0x3000+i] = BITSWAP8(ROM[0xb000+BITSWAP16(i,15,14,13,12,11,3,7,9,10,8,6,5,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt u7 */ +-- } +-- for (i = 0; i < 0x800; i++) +-- { +-- DROM[0x8000+i] = BITSWAP8(ROM[0x8000+BITSWAP16(i,15,14,13,12,11,8,7,5,9,10,6,3,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt u5 */ +-- DROM[0x8800+i] = BITSWAP8(ROM[0x9800+BITSWAP16(i,15,14,13,12,11,3,7,9,10,8,6,5,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt half of u6 */ +-- DROM[0x9000+i] = BITSWAP8(ROM[0x9000+BITSWAP16(i,15,14,13,12,11,3,7,9,10,8,6,5,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt half of u6 */ +--// 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 +-- DROM[0x9800+i] = ROM[0x1800+i]; /* mirror of pacman.6f high */ +-- } +-- for (i = 0; i < 0x1000; i++) +-- { +-- DROM[0xa000+i] = ROM[0x2000+i]; /* mirror of pacman.6h */ +-- DROM[0xb000+i] = ROM[0x3000+i]; /* mirror of pacman.6j */ +-- } +-- /* install patches into decrypted bank */ +-- mspacman_install_patches(DROM); +-- +-- /* mirror Pac-Man ROMs into upper addresses of normal bank */ +-- for (i = 0; i < 0x1000; i++) +-- { +-- ROM[0x8000+i] = ROM[0x0000+i]; +-- ROM[0x9000+i] = ROM[0x1000+i]; +-- ROM[0xa000+i] = ROM[0x2000+i]; +-- ROM[0xb000+i] = ROM[0x3000+i]; +-- } +-- +-- /* initialize the banks */ +-- machine().root_device().membank("bank1")->configure_entries(0, 2, &ROM[0x00000], 0x10000); +-- machine().root_device().membank("bank1")->set_entry(1); +--} +-- +--ROM_START( puckmana ) +-- ROM_REGION( 0x10000, "maincpu", 0 ) +-- ROM_LOAD( "pacman.6e", 0x0000, 0x1000, CRC(c1e6ab10) SHA1(e87e059c5be45753f7e9f33dff851f16d6751181) ) +-- ROM_LOAD( "pacman.6f", 0x1000, 0x1000, CRC(1a6fb2d4) SHA1(674d3a7f00d8be5e38b1fdc208ebef5a92d38329) ) +-- ROM_LOAD( "pacman.6h", 0x2000, 0x1000, CRC(bcdd1beb) SHA1(8e47e8c2c4d6117d174cdac150392042d3e0a881) ) +-- ROM_LOAD( "prg7", 0x3000, 0x0800, CRC(b6289b26) SHA1(d249fa9cdde774d5fee7258147cd25fa3f4dc2b3) ) +-- ROM_LOAD( "prg8", 0x3800, 0x0800, CRC(17a88c13) SHA1(eb462de79f49b7aa8adb0cc6d31535b10550c0ce) ) +-- +--ROM_START( mspacman ) +-- ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code+64k for decrypted code */ +-- ROM_LOAD( "pacman.6e", 0x0000, 0x1000, CRC(c1e6ab10) SHA1(e87e059c5be45753f7e9f33dff851f16d6751181) ) +-- ROM_LOAD( "pacman.6f", 0x1000, 0x1000, CRC(1a6fb2d4) SHA1(674d3a7f00d8be5e38b1fdc208ebef5a92d38329) ) +-- ROM_LOAD( "pacman.6h", 0x2000, 0x1000, CRC(bcdd1beb) SHA1(8e47e8c2c4d6117d174cdac150392042d3e0a881) ) +-- ROM_LOAD( "pacman.6j", 0x3000, 0x1000, CRC(817d94e3) SHA1(d4a70d56bb01d27d094d73db8667ffb00ca69cb9) ) +-- +-- ROM_LOAD( "u5", 0x8000, 0x0800, CRC(f45fbbcd) SHA1(b26cc1c8ee18e9b1daa97956d2159b954703a0ec) ) +-- ROM_LOAD( "u6", 0x9000, 0x1000, CRC(a90e7000) SHA1(e4df96f1db753533f7d770aa62ae1973349ea4cf) ) +-- ROM_LOAD( "u7", 0xb000, 0x1000, CRC(c82cd714) SHA1(1d8ac7ad03db2dc4c8c18ade466e12032673f874) ) +-- +-- +--Normally the Pac-Man ROMs reside at address 0x0000-0x3fff and are mirrored at 0x8000-0xbfff (Z-80 A15 is not used in Pac-Man). +--The aux board logic modifies the address map and enables the aux board ROMs for addresses 0x3000-0x3fff and 0x8000-0x97ff. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity rom_descrambler is + generic ( + -- only set one of these when PACMAN is set + MRTNT : std_logic := '0'; -- set to 1 when using Mr TNT ROMs, 0 otherwise + MSPACMAN : std_logic := '0' -- set to 1 when using Ms Pacman ROMs, 0 otherwise + ); + port ( + CLK : in std_logic; + cpu_m1_l : in std_logic; + addr : in std_logic_vector(15 downto 0); + data : out std_logic_vector( 7 downto 0) + ); + +end rom_descrambler; + +architecture rtl of rom_descrambler is + signal overlay_on : std_logic := '0'; + signal rom_patched : std_logic_vector(15 downto 0); + signal rom_addr : std_logic_vector(15 downto 0); + signal rom_lo : std_logic_vector( 7 downto 0); + signal rom_hi : std_logic_vector( 7 downto 0); + signal rom_data_in : std_logic_vector( 7 downto 0); + signal rom_data_out : std_logic_vector( 7 downto 0); +begin + -- ROM at 0000 - 3FFF + u_program_rom0 : entity work.ROM_PGM_0 + port map ( + CLK => CLK, + ADDR => rom_addr(13 downto 0), + DATA => rom_lo + ); + + -- ROM at 8000 - BFFF (Liz Wiz) + u_program_rom1 : entity work.ROM_PGM_1 + port map ( + CLK => CLK, + ADDR => rom_addr(13 downto 0), + DATA => rom_hi + ); + +-- The trap regions are 8 bytes in length starting on the following addresses: +-- +-- latch clear, decode disable +-- 0x0038 +-- 0x03b0 +-- 0x1600 +-- 0x2120 +-- 0x3ff0 +-- 0x8000 +-- 0x97f0 +-- +-- latch set, decode enable +-- 0x3ff8 + p_overlay : process + variable trap_addr : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + trap_addr := addr(15 downto 3) & "000"; + if trap_addr = x"3ff8" then + overlay_on <= '1'; + elsif + trap_addr = x"0038" or + trap_addr = x"03b0" or + trap_addr = x"1600" or + trap_addr = x"2120" or + trap_addr = x"3ff0" or + trap_addr = x"8000" or + trap_addr = x"97f0" + then + overlay_on <= '0'; + end if; + end process; + + p_decoder_comb : process(clk, rom_addr, addr, rom_data_in, rom_data_out, rom_patched, rom_hi, rom_lo, overlay_on) + variable patch_addr : std_logic_vector(15 downto 0); + begin + rom_addr <= addr; + rom_patched <= addr; + data <= rom_data_out; + + -- default is unscrambled data + rom_data_out <= rom_data_in ; + + -- mux ROMs to same data bus + -- ignore A15 so that Pacman ROMs 0000-3FFF mirror in high mem at 8000-BFFF + if rom_addr(14) = '0' then + rom_data_in <= rom_lo; + else + rom_data_in <= rom_hi; + end if; + + -- Mr TNT program ROMs have data lines D3 and D5 swapped + -- Mr TNT video ROMs have data lines D4 and D6 and address lines A0 and A2 swapped + if MRTNT = '1' then + rom_data_out <= rom_data_in(7 downto 6) & rom_data_in(3) & rom_data_in(4) & rom_data_in(5) & rom_data_in(2 downto 0); + end if; + + if MSPACMAN = '1' and overlay_on = '1' then + -- forty 8-byte patches into Pac-Man code + -- If the CPU address presented falls in a patch range, substitute it with patched address + -- OH THE HUMANITY!!! + patch_addr := addr(15 downto 3) & "000"; + case patch_addr is + when x"0410" => rom_patched <= x"800" & '1' & addr(2 downto 0); -- ROM[0x0410+i] = ROM[0x8008+i] + when x"08E0" => rom_patched <= x"81D" & '1' & addr(2 downto 0); -- ROM[0x08E0+i] = ROM[0x81D8+i] + when x"0A30" => rom_patched <= x"811" & '1' & addr(2 downto 0); -- ROM[0x0A30+i] = ROM[0x8118+i] + when x"0BD0" => rom_patched <= x"80D" & '1' & addr(2 downto 0); -- ROM[0x0BD0+i] = ROM[0x80D8+i] + when x"0C20" => rom_patched <= x"812" & '0' & addr(2 downto 0); -- ROM[0x0C20+i] = ROM[0x8120+i] + when x"0E58" => rom_patched <= x"816" & '1' & addr(2 downto 0); -- ROM[0x0E58+i] = ROM[0x8168+i] + when x"0EA8" => rom_patched <= x"819" & '1' & addr(2 downto 0); -- ROM[0x0EA8+i] = ROM[0x8198+i] + + when x"1000" => rom_patched <= x"802" & '0' & addr(2 downto 0); -- ROM[0x1000+i] = ROM[0x8020+i] + when x"1008" => rom_patched <= x"801" & '0' & addr(2 downto 0); -- ROM[0x1008+i] = ROM[0x8010+i] + when x"1288" => rom_patched <= x"809" & '1' & addr(2 downto 0); -- ROM[0x1288+i] = ROM[0x8098+i] + when x"1348" => rom_patched <= x"804" & '1' & addr(2 downto 0); -- ROM[0x1348+i] = ROM[0x8048+i] + when x"1688" => rom_patched <= x"808" & '1' & addr(2 downto 0); -- ROM[0x1688+i] = ROM[0x8088+i] + when x"16B0" => rom_patched <= x"818" & '1' & addr(2 downto 0); -- ROM[0x16B0+i] = ROM[0x8188+i] + when x"16D8" => rom_patched <= x"80C" & '1' & addr(2 downto 0); -- ROM[0x16D8+i] = ROM[0x80C8+i] + when x"16F8" => rom_patched <= x"81C" & '1' & addr(2 downto 0); -- ROM[0x16F8+i] = ROM[0x81C8+i] + when x"19A8" => rom_patched <= x"80A" & '1' & addr(2 downto 0); -- ROM[0x19A8+i] = ROM[0x80A8+i] + when x"19B8" => rom_patched <= x"81A" & '1' & addr(2 downto 0); -- ROM[0x19B8+i] = ROM[0x81A8+i] + + when x"2060" => rom_patched <= x"814" & '1' & addr(2 downto 0); -- ROM[0x2060+i] = ROM[0x8148+i] + when x"2108" => rom_patched <= x"801" & '1' & addr(2 downto 0); -- ROM[0x2108+i] = ROM[0x8018+i] + when x"21A0" => rom_patched <= x"81A" & '0' & addr(2 downto 0); -- ROM[0x21A0+i] = ROM[0x81A0+i] + when x"2298" => rom_patched <= x"80A" & '0' & addr(2 downto 0); -- ROM[0x2298+i] = ROM[0x80A0+i] + when x"23E0" => rom_patched <= x"80E" & '1' & addr(2 downto 0); -- ROM[0x23E0+i] = ROM[0x80E8+i] + when x"2418" => rom_patched <= x"800" & '0' & addr(2 downto 0); -- ROM[0x2418+i] = ROM[0x8000+i] + when x"2448" => rom_patched <= x"805" & '1' & addr(2 downto 0); -- ROM[0x2448+i] = ROM[0x8058+i] + when x"2470" => rom_patched <= x"814" & '0' & addr(2 downto 0); -- ROM[0x2470+i] = ROM[0x8140+i] + when x"2488" => rom_patched <= x"808" & '0' & addr(2 downto 0); -- ROM[0x2488+i] = ROM[0x8080+i] + when x"24B0" => rom_patched <= x"818" & '0' & addr(2 downto 0); -- ROM[0x24B0+i] = ROM[0x8180+i] + when x"24D8" => rom_patched <= x"80C" & '0' & addr(2 downto 0); -- ROM[0x24D8+i] = ROM[0x80C0+i] + when x"24F8" => rom_patched <= x"81C" & '0' & addr(2 downto 0); -- ROM[0x24F8+i] = ROM[0x81C0+i] + when x"2748" => rom_patched <= x"805" & '0' & addr(2 downto 0); -- ROM[0x2748+i] = ROM[0x8050+i] + when x"2780" => rom_patched <= x"809" & '0' & addr(2 downto 0); -- ROM[0x2780+i] = ROM[0x8090+i] + when x"27B8" => rom_patched <= x"819" & '0' & addr(2 downto 0); -- ROM[0x27B8+i] = ROM[0x8190+i] + when x"2800" => rom_patched <= x"802" & '1' & addr(2 downto 0); -- ROM[0x2800+i] = ROM[0x8028+i] + when x"2B20" => rom_patched <= x"810" & '0' & addr(2 downto 0); -- ROM[0x2B20+i] = ROM[0x8100+i] + when x"2B30" => rom_patched <= x"811" & '0' & addr(2 downto 0); -- ROM[0x2B30+i] = ROM[0x8110+i] + when x"2BF0" => rom_patched <= x"81D" & '0' & addr(2 downto 0); -- ROM[0x2BF0+i] = ROM[0x81D0+i] + when x"2CC0" => rom_patched <= x"80D" & '0' & addr(2 downto 0); -- ROM[0x2CC0+i] = ROM[0x80D0+i] + when x"2CD8" => rom_patched <= x"80E" & '0' & addr(2 downto 0); -- ROM[0x2CD8+i] = ROM[0x80E0+i] + when x"2CF0" => rom_patched <= x"81E" & '0' & addr(2 downto 0); -- ROM[0x2CF0+i] = ROM[0x81E0+i] + when x"2D60" => rom_patched <= x"816" & '0' & addr(2 downto 0); -- ROM[0x2D60+i] = ROM[0x8160+i] + when others => rom_patched <= addr; + end case; + +-- Pacman ROMs +-- 0x0000-0x0FFF = 0x0000-0x0FFF; /* pacman.6e */ +-- 0x1000-0x1FFF = 0x1000-0x1FFF; /* pacman.6f */ +-- 0x2000-0x2FFF = 0x2000-0x2FFF; /* pacman.6h */ +-- 0x3000-0x3FFF = 0x3000-0x3FFF; /* pacman.6j */ + +-- ROM mirror (easy just ignore A15) +-- 0x8000-0x8FFF = 0x0000-0x0FFF; /* mirror of pacman.6e */ +-- 0x9000-0x9FFF = 0x1000-0x1FFF; /* mirror of pacman.6f */ +-- 0xA000-0xAFFF = 0x2000-0x2FFF; /* mirror of pacman.6h */ +-- 0xB000-0xBFFF = 0x3000-0x3FFF; /* mirror of pacman.6j */ + +-- Ms Pacman overlays + +-- no xlate +-- 0x8000-0x87FF = 0x8000-0x87FF (physical ROM hi 0000-07FF); /* decrypt u5 */ +-- 0x9000-0x97FF = 0x9000-0x97FF (physical ROM hi 1000-17FF); /* decrypt half of u6 */ + +-- xlate addr +-- 0x3000-0x3FFF = 0xB000-0xBFFF (physical ROM hi 2000-2FFF); /* decrypt u7 */ + +-- xlate addr +-- 0x8800-0x8FFF = 0x9800-0x9FFF (physical ROM hi 1800-1FFF); /* decrypt half of u6 */ + +-- ROM hi mem map +-- u5 2K 0000-07FF (0x8000-0x87FF) +-- u5 2K 0800-0FFF N/A +-- u6b 2K 1000-17FF (0x9000-0x97FF) +-- u6t 2K 1800-1FFF (0x8800-0x8FFF) +-- u7 4K 2000-2FFF (0x3000-0x3FFF) + + -- If the new patched address falls in certain Ms Pacman ranges, swap in ROM overlays and descramble address and data + -- high address bits are not scrambled so we know for sure this only accesses ROM hi after address translation + case rom_patched(15 downto 11) is + + -- addr = 0x3000-0x37FF, xlate to 0xB000-0xB7FF (physical ROM hi 2000-27FF), decrypt half of u7 + when "00110" => + rom_addr <= x"2" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x3800-0x3FFF, xlate to 0xB800-0xBFFF (physical ROM hi 2800-2FFF), decrypt half of u7 + when "00111" => + rom_addr <= x"2" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x8000-0x87FF, no xlate (physical ROM hi 0000-07FF), decrypt u5 + when "10000" => + rom_addr <= x"0" & rom_patched(11) & rom_patched(8) & rom_patched(7) & rom_patched(5) & rom_patched(9) & rom_patched(10) & rom_patched(6) & rom_patched(3) & rom_patched(4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x8800-0x8FFF, xlate to 0x9800-0x9FFF (physical ROM hi 1800-1FFF), decrypt half of u6 + when "10001" => + rom_addr <= x"1" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x9000-0x97FF, no xlate (physical ROM hi 1000-17FF), decrypt half of u6 + when "10010" => + rom_addr <= x"1" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- catch all default action + when others => null; + rom_addr <= rom_patched; + rom_data_out <= rom_data_in; + end case; + end if; + end process; + +end rtl; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..895304e9 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman_video.vhd @@ -0,0 +1,366 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_VIDEO is +generic ( + MRTNT : std_logic := '0' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); +port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + I_WR2_L : in std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic +); +end; + +architecture RTL of PACMAN_VIDEO is + + signal sprite_xy_ram_temp : std_logic_vector(7 downto 0); + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal db_reg : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_dout : std_logic_vector(7 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal cntr_ld : std_logic; + signal sprite_ram_ip : std_logic_vector(3 downto 0); + signal sprite_ram_op : std_logic_vector(3 downto 0); + signal ra : std_logic_vector(7 downto 0); + signal ra_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(3 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + + -- ram enable is low when HBLANK_L is 0 (for sprite access) or + -- 2H is low (for cpu writes) + -- we can simplify this + dr <= not sprite_xy_ram_temp when I_HBLANK = '1' else "11111111"; -- pull ups on board + + sprite_xy_ram : work.dpram generic map (4,8) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR2_L, + addr_a_i => I_AB(3 downto 0), + data_a_i => I_DB, + + clk_b_i => CLK, + addr_b_i => I_AB(3 downto 0), + data_b_o => sprite_xy_ram_temp + ); + + p_char_regs : process + variable inc : std_logic; + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; + begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + inc := (not I_HBLANK); + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & inc); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + db_reg <= I_DB; -- character reg + end if; + end process; + + p_flip_comb : process(char_hblank_reg, I_FLIP, db_reg) + begin + if (char_hblank_reg = '0') then + xflip <= I_FLIP; + yflip <= I_FLIP; + else + xflip <= db_reg(1); + yflip <= db_reg(0); + end if; + end process; + + p_char_addr_comb : process(db_reg, I_HCNT, + char_match_reg, char_sum_reg, char_hblank_reg, + xflip, yflip) + begin + obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + + ca(12) <= char_hblank_reg; + ca(11 downto 6) <= db_reg(7 downto 2); + + -- 2h, 4e + if (char_hblank_reg = '0') then + ca(5) <= db_reg(1); + ca(4) <= db_reg(0); + else + ca(5) <= char_sum_reg(3) xor xflip; + ca(4) <= I_HCNT(3); + end if; + + ca(3) <= I_HCNT(2) xor yflip; + ca(1) <= char_sum_reg(1) xor xflip; + + -- descramble ROMs for Mr TNT (swap address lines A0 and A2) + if MRTNT = '1' then + ca(2) <= char_sum_reg(0) xor xflip; + ca(0) <= char_sum_reg(2) xor xflip; + else + ca(2) <= char_sum_reg(2) xor xflip; + ca(0) <= char_sum_reg(0) xor xflip; + end if; + end process; + + + -- descramble ROMs for Mr TNT (swap data lines D4 and D6) + char_rom_5ef_dout <= char_rom_5ef_buf(7) & char_rom_5ef_buf(4) & char_rom_5ef_buf(5) & char_rom_5ef_buf(6) & char_rom_5ef_buf(3 downto 0) when MRTNT = '1' else char_rom_5ef_buf; + + -- char roms + char_rom_5ef : entity work.GFX1 + port map ( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf + ); + + p_char_shift : process + begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_dout(7 downto 4); -- load + shift_regl <= char_rom_5ef_dout(3 downto 0); + when others => null; + end case; + end if; + end process; + + p_char_shift_comb : process(I_HCNT, vout_yflip, shift_regu, shift_regl) + variable ip : std_logic; + begin + ip := I_HCNT(0) and I_HCNT(1); + if (vout_yflip = '0') then + + shift_sel(0) <= ip; + shift_sel(1) <= '1'; + shift_op(0) <= shift_regl(3); + shift_op(1) <= shift_regu(3); + else + + shift_sel(0) <= '1'; + shift_sel(1) <= ip; + shift_op(0) <= shift_regl(0); + shift_op(1) <= shift_regu(0); + end if; + end process; + + p_video_out_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= I_DB(4 downto 0); -- colour reg + end if; + end if; + end process; + + col_rom_4a : entity work.PROM4_DST + port map ( + CLK => CLK, + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a + ); + + cntr_ld <= '1' when (I_HCNT(3 downto 0) = "0111") and (vout_hblank='1' or vout_obj_on='0') else '0'; + + p_ra_cnt : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (cntr_ld = '1') then + ra <= dr; + else + ra <= ra + "1"; + end if; + end if; + end process; + + u_sprite_ram : work.dpram generic map (8,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => vout_obj_on_t1, + addr_a_i => ra_t1, + data_a_i => sprite_ram_ip, + + clk_b_i => CLK, + addr_b_i => ra, + data_b_o => sprite_ram_op + ); + + sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "0000"; + video_op_sel <= '1' when not (sprite_ram_reg = "0000") else '0'; + + p_sprite_ram_ip_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + ra_t1 <= ra; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + end if; + end process; + + p_sprite_ram_ip_comb : process(vout_hblank_t1, video_op_sel, sprite_ram_reg, lut_4a_t1) + begin + -- 3a + if (vout_hblank_t1 = '0') then + sprite_ram_ip <= (others => '0'); + else + if (video_op_sel = '1') then + sprite_ram_ip <= sprite_ram_reg; + else + sprite_ram_ip <= lut_4a_t1(3 downto 0); + end if; + end if; + end process; + + p_video_op_comb : process(vout_hblank, I_VBLANK, video_op_sel, sprite_ram_reg, lut_4a) + begin + -- 3b + if (vout_hblank = '1') or (I_VBLANK = '1') then + final_col <= (others => '0'); + else + if (video_op_sel = '1') then + final_col <= sprite_ram_reg; -- sprite + else + final_col <= lut_4a(3 downto 0); + end if; + end if; + end process; + + -- assign video outputs from color LUT PROM + col_rom_7f : entity work.PROM7_DST + port map ( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE + ); + +end architecture; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman_vram_addr.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman_vram_addr.vhd new file mode 100644 index 00000000..b26824c4 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pacman_vram_addr.vhd @@ -0,0 +1,273 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ & CarlW - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity X74_157 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end; + +architecture RTL of X74_157 is +begin + p_y_comb : process(S,G,A,B) + begin + for i in 0 to 3 loop + -- quad 2 line to 1 line mux (true logic) + if (G = '1') then + Y(i) <= '0'; + else + if (S = '0') then + Y(i) <= A(i); + else + Y(i) <= B(i); + end if; + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity X74_257 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end; + +architecture RTL of X74_257 is +signal ab : std_logic_vector (3 downto 0); +begin + + Y <= ab; -- no tristate + p_ab : process(S,A,B) + begin + for i in 0 to 3 loop + if (S = '0') then + AB(i) <= A(i); + else + AB(i) <= B(i); + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VRAM_ADDR is + port ( + AB : out std_logic_vector (11 downto 0); + H256_L : in std_logic; + H128 : in std_logic; + H64 : in std_logic; + H32 : in std_logic; + H16 : in std_logic; + H8 : in std_logic; + H4 : in std_logic; + H2 : in std_logic; + H1 : in std_logic; + V128 : in std_logic; + V64 : in std_logic; + V32 : in std_logic; + V16 : in std_logic; + V8 : in std_logic; + V4 : in std_logic; + V2 : in std_logic; + V1 : in std_logic; + FLIP : in std_logic + ); +end; + +architecture RTL of PACMAN_VRAM_ADDR is + +signal v128p : std_logic; +signal v64p : std_logic; +signal v32p : std_logic; +signal v16p : std_logic; +signal v8p : std_logic; +signal h128p : std_logic; +signal h64p : std_logic; +signal h32p : std_logic; +signal h16p : std_logic; +signal h8p : std_logic; +signal sel : std_logic; +signal y157 : std_logic_vector (11 downto 0); + +component X74_157 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end component; + +component X74_257 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end component; + +begin + p_vp_comb : process(FLIP, V8, V16, V32, V64, V128) + begin + v128p <= FLIP xor V128; + v64p <= FLIP xor V64; + v32p <= FLIP xor V32; + v16p <= FLIP xor V16; + v8p <= FLIP xor V8; + end process; + + p_hp_comb : process(FLIP, H8, H16, H32, H64, H128) + begin + H128P <= FLIP xor H128; + H64P <= FLIP xor H64; + H32P <= FLIP xor H32; + H16P <= FLIP xor H16; + H8P <= FLIP xor H8; + end process; + + p_sel : process(H16, H32, H64) + begin + sel <= not((H32 xor H16) or (H32 xor H64)); + end process; + + --p_oe257 : process(H2) + --begin + -- oe <= not(H2); + --end process; + + U6 : X74_157 + port map( + Y => y157(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => h64p, + B(0) => h64p, + A => "1111", + G => '0', + S => sel + ); + + U5 : X74_157 + port map( + Y => y157(7 downto 4), + B(3) => h64p, + B(2) => h64p, + B(1) => h8p, + B(0) => v128p, + A => "1111", + G => '0', + S => sel + ); + + U4 : X74_157 + port map( + Y => y157(3 downto 0), + B(3) => v64p, + B(2) => v32p, + B(1) => v16p, + B(0) => v8p, + A(3) => H64, + A(2) => H32, + A(1) => H16, + A(0) => H4, + G => '0', + S => sel + ); + + U3 : X74_257 + port map( + Y => AB(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => v128p, + B(0) => v64p, + A => y157(11 downto 8), + S => H256_L + ); + + U2 : X74_257 + port map( + Y => AB(7 downto 4), + B(3) => v32p, + B(2) => v16p, + B(1) => v8p, + B(0) => h128p, + A => y157(7 downto 4), + S => H256_L + ); + + U1 : X74_257 + port map( + Y => AB(3 downto 0), + B(3) => h64p, + B(2) => h32p, + B(1) => h16p, + B(0) => h8p, + A => y157(3 downto 0), + S => H256_L + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_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 VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pll.vhd b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pll.vhd new file mode 100644 index 00000000..3c952a1a --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/pll.vhd @@ -0,0 +1,365 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC ; + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + locked <= sub_wire0; + sub_wire2 <= sub_wire1(0); + c0 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 9, + clk0_duty_cycle => 50, + clk0_multiply_by => 8, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire4, + locked => sub_wire0, + clk => sub_wire1 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "9" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +-- 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 "1" +-- 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: 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_CLKENA0 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 "9" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +-- Retrieval info: CONSTANT: CLK0_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_USED" +-- 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_USED" +-- 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_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Pacman Hardware/MsPacman_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/MsPacman_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/MsPacman_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/MsPacman_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/Arcade/Pacman Hardware/PacmanClub_MiST/PacmanClub.qpf b/Arcade/Pacman Hardware/PacmanClub_MiST/PacmanClub.qpf new file mode 100644 index 00000000..62b1a305 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/PacmanClub.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "PacmanClub" diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/PacmanClub.qsf b/Arcade/Pacman Hardware/PacmanClub_MiST/PacmanClub.qsf new file mode 100644 index 00000000..e8e925e1 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/PacmanClub.qsf @@ -0,0 +1,175 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 20:43:12 November 20, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# PacmanClub_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/pll.v +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/ROM/GFX1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/PacmanClub.sv + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY PacmanClub +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Alibaba) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Alibaba) +# ------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/PacmanClub.srf b/Arcade/Pacman Hardware/PacmanClub_MiST/PacmanClub.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/PacmanClub.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/README.txt b/Arcade/Pacman Hardware/PacmanClub_MiST/README.txt new file mode 100644 index 00000000..68679f56 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/README.txt @@ -0,0 +1,24 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: PacmanClub for MiST by Gehstock +-- 21 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F1 : Start 1 player +-- F2 : Start 2 players +-- UP,DOWN,LEFT,RIGHT arrows : Movements Player 1 +-- W,S,A,D : Movements Player 2 +-- +-- Two Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/Release/PacmanClub.rbf b/Arcade/Pacman Hardware/PacmanClub_MiST/Release/PacmanClub.rbf new file mode 100644 index 00000000..88e329a1 Binary files /dev/null and b/Arcade/Pacman Hardware/PacmanClub_MiST/Release/PacmanClub.rbf differ diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/clean.bat b/Arcade/Pacman Hardware/PacmanClub_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_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/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/PacmanClub.sv b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/PacmanClub.sv new file mode 100644 index 00000000..95086032 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/PacmanClub.sv @@ -0,0 +1,205 @@ +//============================================================================ +// Arcade: PacmanClub +// +// Version for MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module PacmanClub +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "PacmanClub;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys, clk_snd; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [13:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [7:0] audio; +assign LED = 1; +//wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(340), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] : kbjoy[4] | joystick_0[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] : kbjoy[5] | joystick_0[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] : kbjoy[6] | joystick_0[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] : kbjoy[7] | joystick_0[0]; + +wire m2_up = status[2] ? kbjoy[11] | joystick_1[1] : kbjoy[10] | joystick_1[3]; +wire m2_down = status[2] ? kbjoy[13] | joystick_1[0] : kbjoy[12] | joystick_1[2]; +wire m2_left = status[2] ? kbjoy[12] | joystick_1[2] : kbjoy[11] | joystick_1[1]; +wire m2_right = status[2] ? kbjoy[10] | joystick_1[3] : kbjoy[13] | joystick_1[0]; + + +//wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +//wire m_bomb = kbjoy[8]; +//wire m_Serv = kbjoy[9]; +//wire m_skip = kbjoy[9]; + + +pacman pacmanclub +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .in0(~{2'b00, m_coin, 1'b0}), + .in1(~{1'b0, m_start2, m_start1, 5'b00000}), + + .in_a({m_down,m_right,m_left,m_up}), + .in_b({m2_down,m2_right,m2_left,m2_up}), + + .dipsw1(8'b1_1_00_11_01), + .dipsw2(8'b11111111), + + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..834eafbd --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"CC",X"EE",X"11",X"11",X"33",X"EE",X"CC",X"00",X"11",X"33",X"66",X"44",X"44",X"33",X"11",X"00", + X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00",X"00",X"00",X"77",X"77",X"22",X"00",X"00",X"00", + X"11",X"99",X"DD",X"DD",X"FF",X"77",X"33",X"00",X"33",X"77",X"55",X"44",X"44",X"66",X"22",X"00", + X"66",X"FF",X"99",X"99",X"99",X"33",X"22",X"00",X"44",X"66",X"77",X"55",X"44",X"44",X"00",X"00", + X"44",X"FF",X"FF",X"44",X"44",X"CC",X"CC",X"00",X"00",X"77",X"77",X"66",X"33",X"11",X"00",X"00", + X"EE",X"FF",X"11",X"11",X"11",X"33",X"22",X"00",X"00",X"55",X"55",X"55",X"55",X"77",X"77",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"EE",X"00",X"00",X"44",X"44",X"44",X"66",X"33",X"11",X"00", + X"00",X"00",X"88",X"FF",X"77",X"00",X"00",X"00",X"66",X"77",X"55",X"44",X"44",X"66",X"66",X"00", + X"66",X"77",X"DD",X"DD",X"99",X"99",X"66",X"00",X"00",X"33",X"44",X"44",X"55",X"77",X"33",X"00", + X"CC",X"EE",X"BB",X"99",X"99",X"99",X"00",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"FF",X"FF",X"44",X"44",X"44",X"FF",X"FF",X"00",X"11",X"33",X"66",X"44",X"66",X"33",X"11",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"77",X"00", + X"22",X"33",X"11",X"11",X"33",X"EE",X"CC",X"00",X"22",X"66",X"44",X"44",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"33",X"11",X"11",X"FF",X"FF",X"00",X"11",X"33",X"66",X"44",X"44",X"77",X"77",X"00", + X"11",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00",X"44",X"44",X"44",X"44",X"77",X"77",X"00",X"00", + X"00",X"88",X"88",X"88",X"88",X"FF",X"FF",X"00",X"44",X"44",X"44",X"44",X"44",X"77",X"77",X"00", + X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00", + X"00",X"00",X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"03", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"C8",X"C8",X"CC",X"CC",X"EE",X"AA",X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"33", + X"9B",X"DD",X"FF",X"F7",X"79",X"F1",X"C0",X"00",X"33",X"30",X"70",X"61",X"10",X"00",X"00",X"00", + X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"00",X"10",X"10",X"11",X"11",X"33",X"33", + X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"77",X"77",X"DD",X"FF",X"FF",X"EE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"EE",X"00",X"DD",X"EE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"DD",X"00",X"EE",X"DD",X"00",X"00", + X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"11",X"33",X"77",X"77",X"33",X"11", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"11",X"33",X"77",X"77",X"33",X"11",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"FF", + X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"CC",X"88", + X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"EE",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"77", + X"33",X"33",X"33",X"33",X"FF",X"EE",X"00",X"00",X"CC",X"CC",X"CC",X"CC",X"FF",X"77",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00",X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00", + X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00",X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00", + X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"00",X"00",X"88",X"44",X"22",X"00",X"88",X"44",X"22",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00",X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00", + X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00",X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00", + X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00",X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00", + X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00",X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"88",X"22",X"00",X"00",X"00",X"CC",X"EE",X"FF",X"33",X"00",X"00",X"00", + X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC",X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33", + X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"EE",X"22",X"22",X"00",X"11",X"22",X"22",X"22",X"33", + X"AA",X"AA",X"AA",X"22",X"00",X"00",X"00",X"EE",X"22",X"22",X"22",X"11",X"00",X"22",X"22",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"33",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"00", + X"33",X"33",X"77",X"77",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE", + X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"33",X"33",X"33",X"77",X"77",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE", + X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"11",X"33",X"33",X"33",X"33",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00", + X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CE",X"EE",X"EE",X"EE",X"66",X"22",X"22",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"FF",X"BB",X"BB",X"33",X"33",X"FF",X"EE",X"DD",X"DD",X"DD",X"DD",X"CC",X"CC",X"FF",X"77", + X"33",X"33",X"BB",X"BB",X"BB",X"FF",X"FF",X"00",X"CC",X"CC",X"DD",X"DD",X"DD",X"FF",X"FF",X"CC", + X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00",X"77",X"FF",X"CC",X"CC",X"66",X"FF",X"FF",X"CC", + X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"EE",X"00",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"77", + X"00",X"EE",X"FF",X"33",X"33",X"33",X"FF",X"FF",X"00",X"77",X"FF",X"CC",X"CC",X"CC",X"FF",X"77", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"FF",X"FF",X"CC",X"CC",X"FF",X"FF",X"CC",X"CC",X"FF",X"FF", + X"00",X"88",X"CC",X"CC",X"CC",X"CC",X"FF",X"FF",X"00",X"77",X"FF",X"CC",X"CC",X"CC",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"CC",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C",X"00",X"00",X"CC",X"CC", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C",X"00",X"00",X"00",X"00", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0C",X"0C",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"CC",X"CC",X"00",X"00",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC", + X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"22",X"77",X"88",X"88",X"77",X"00",X"99",X"AA",X"AA", + X"3E",X"3E",X"DE",X"1E",X"DE",X"3E",X"3E",X"DE",X"C7",X"C7",X"B7",X"87",X"B7",X"C7",X"C7",X"B7", + X"F0",X"1E",X"1E",X"9E",X"9E",X"1E",X"1E",X"DE",X"F0",X"87",X"87",X"97",X"97",X"87",X"87",X"B7", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"20",X"90",X"80",X"00",X"00",X"30",X"30",X"10",X"10",X"00",X"00", + X"41",X"21",X"12",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"0C",X"0C",X"8C",X"0C",X"00",X"00",X"00",X"07",X"0F",X"0F",X"C3",X"1F", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"08",X"0F",X"2F",X"4F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"07",X"4F",X"0F",X"A7",X"87",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"D3",X"87",X"97",X"0F",X"2F",X"07",X"00",X"00",X"33",X"10",X"10",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"08",X"0E",X"8E",X"1F",X"0F", + X"0C",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"4F",X"1F",X"0F",X"4F",X"0E",X"08",X"00",X"00", + X"00",X"00",X"01",X"03",X"87",X"87",X"87",X"47",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"10", + X"EF",X"47",X"07",X"07",X"03",X"01",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"0C",X"0C",X"08",X"08",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"00", + X"00",X"FF",X"FF",X"08",X"00",X"88",X"CC",X"77",X"00",X"00",X"11",X"33",X"33",X"11",X"13",X"00", + X"33",X"88",X"00",X"00",X"88",X"FF",X"77",X"00",X"11",X"11",X"33",X"33",X"13",X"11",X"00",X"00", + X"00",X"00",X"26",X"EE",X"CC",X"00",X"CC",X"CC",X"00",X"8C",X"EE",X"66",X"11",X"77",X"CC",X"00", + X"CC",X"00",X"88",X"CE",X"66",X"22",X"00",X"00",X"CC",X"7F",X"33",X"00",X"6E",X"CC",X"88",X"00", + X"00",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"20", + X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"10",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"0C",X"0F",X"CF",X"2F",X"0F",X"0F", + X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"70",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"44",X"54",X"32", + X"F0",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"C0",X"E0",X"E0",X"E0",X"00",X"00",X"00",X"30",X"F0",X"F0",X"F0",X"F0", + X"68",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"F0",X"C3",X"F0",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"0E",X"0F",X"0F",X"0D",X"02",X"01",X"00",X"00",X"01",X"05",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"08",X"0E",X"0F",X"2F",X"17", + X"8C",X"0C",X"0C",X"0C",X"0C",X"08",X"00",X"00",X"0B",X"05",X"02",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"F1",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"20", + X"E0",X"F1",X"E0",X"E0",X"00",X"00",X"00",X"00",X"20",X"20",X"10",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"DD", + X"22",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",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"0F",X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"0F",X"0F",X"0F",X"FF",X"FF",X"0F", + X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"CF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00", + X"0F",X"CF",X"FF",X"0F",X"0F",X"FF",X"0F",X"0F",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"CF", + X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"CF",X"3F",X"FF",X"FF",X"3F",X"0F",X"0F",X"0F",X"0F",X"CF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"F0",X"F0",X"0F",X"0F",X"C3",X"F0",X"0F",X"0F",X"F0",X"0F",X"0F",X"C3",X"F0",X"F0", + X"F0",X"F0",X"0F",X"0F",X"C3",X"F0",X"3C",X"0F",X"F0",X"0F",X"0F",X"C3",X"3C",X"0F",X"C3",X"F0", + X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"C3",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"0F",X"0F",X"0F",X"0F",X"C3",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"3C",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"00",X"33",X"74",X"74",X"F8",X"F9",X"F9",X"F9", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"FF",X"F9",X"F9",X"F9",X"F8",X"74",X"74",X"33",X"00", + X"FF",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"FF", + X"00",X"CC",X"E2",X"E2",X"F1",X"F9",X"F9",X"F9",X"FF",X"F0",X"F0",X"FE",X"11",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"F1",X"E2",X"E2",X"CC",X"00",X"00",X"00",X"00",X"11",X"FE",X"F0",X"F0",X"FF", + X"FF",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"FF",X"F0",X"F0",X"FE",X"11",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"11",X"FE",X"F0",X"F0",X"FF", + X"FF",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"FF",X"F1",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9", + X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"E2",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F1",X"F1",X"E2",X"E2",X"CC",X"00", + X"00",X"33",X"74",X"74",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"74",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"33",X"74",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"E2",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"F8",X"F8",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F9",X"F8",X"F8",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"F1",X"F1",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"F1",X"F1",X"FF",X"00",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1", + X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"11",X"FE",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"FE",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"33",X"74",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"E2",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"F0",X"F9",X"F9",X"F9",X"F8",X"F8",X"F8",X"F8",X"F8", + X"F0",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"F8",X"F8",X"F9",X"F9",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"0C",X"0C",X"8C",X"0C",X"00",X"00",X"30",X"30",X"10",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"20",X"90",X"80",X"00",X"00",X"00",X"07",X"0F",X"0F",X"C3",X"1F", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"41",X"21",X"12",X"03",X"03",X"01",X"00",X"00",X"07",X"08",X"0F",X"2F",X"4F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"00",X"00",X"07",X"4F",X"0F",X"A7",X"87",X"00",X"00",X"00",X"08",X"0E",X"8E",X"1F",X"0F", + X"0C",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"33",X"10",X"10",X"10",X"00",X"00",X"00",X"00", + X"D3",X"87",X"97",X"0F",X"2F",X"07",X"00",X"00",X"4F",X"1F",X"0F",X"4F",X"0E",X"08",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"10", + X"00",X"00",X"01",X"03",X"87",X"87",X"87",X"47",X"00",X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"0C",X"0C",X"08",X"08",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EF",X"47",X"07",X"07",X"03",X"01",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"00", + X"00",X"00",X"26",X"EE",X"CC",X"00",X"CC",X"CC",X"00",X"00",X"11",X"33",X"33",X"11",X"13",X"00", + X"00",X"FF",X"FF",X"08",X"00",X"88",X"CC",X"77",X"00",X"8C",X"EE",X"66",X"11",X"77",X"CC",X"00", + X"CC",X"00",X"88",X"CE",X"66",X"22",X"00",X"00",X"11",X"11",X"33",X"33",X"13",X"11",X"00",X"00", + X"33",X"88",X"00",X"00",X"88",X"FF",X"77",X"00",X"CC",X"7F",X"33",X"00",X"6E",X"CC",X"88",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"20", + X"00",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0C",X"0F",X"CF",X"2F",X"0F",X"0F", + X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"10",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"00",X"00", + X"00",X"00",X"00",X"80",X"C0",X"E0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"44",X"54",X"32", + X"00",X"00",X"00",X"00",X"00",X"70",X"F0",X"F0",X"00",X"00",X"00",X"30",X"F0",X"F0",X"F0",X"F0", + X"68",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"C3",X"F0",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"01",X"05",X"02",X"00",X"00",X"00", + X"00",X"00",X"0E",X"0F",X"0F",X"0D",X"02",X"01",X"00",X"00",X"00",X"08",X"0E",X"0F",X"2F",X"17", + X"8C",X"0C",X"0C",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0D",X"05",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"10",X"30",X"70",X"F8",X"70",X"30",X"10", + X"00",X"00",X"00",X"0C",X"04",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"07",X"04",X"07",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00", + X"02",X"03",X"00",X"00",X"0F",X"00",X"00",X"00",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"04",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"07",X"04",X"07",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00", + X"02",X"03",X"00",X"0D",X"05",X"07",X"00",X"00",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"04",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"07",X"04",X"07",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00", + X"02",X"03",X"00",X"07",X"05",X"0D",X"00",X"00",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"04",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"07",X"04",X"07",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00", + X"02",X"03",X"00",X"0F",X"00",X"00",X"00",X"00",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0E",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"03",X"02",X"03",X"00",X"0F",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"00", + X"01",X"00",X"0F",X"08",X"0F",X"00",X"0C",X"00",X"0F",X"00",X"08",X"08",X"08",X"00",X"00",X"00", + X"0E",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"03",X"02",X"03",X"00",X"0F",X"01",X"0F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"05",X"05",X"00", + X"0F",X"08",X"0F",X"00",X"04",X"04",X"0C",X"00",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00", + X"0E",X"02",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"03",X"02",X"03",X"00",X"0F",X"01",X"0F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"05",X"07",X"00", + X"0F",X"08",X"0F",X"00",X"0C",X"04",X"04",X"00",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"0F",X"0F", + X"0E",X"0E",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"0E",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"44",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"55",X"DD",X"DD",X"55",X"55",X"33", + X"66",X"66",X"55",X"DD",X"DD",X"77",X"77",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"DD",X"DD",X"55",X"55",X"33", + X"00",X"00",X"00",X"00",X"88",X"88",X"44",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"66",X"66",X"55",X"DD",X"DD",X"55",X"55",X"33",X"00",X"00",X"00",X"00",X"88",X"88",X"44",X"44", + X"11",X"11",X"55",X"55",X"DD",X"99",X"11",X"DD",X"99",X"CC",X"EE",X"BB",X"99",X"CC",X"EE",X"BB", + X"AA",X"88",X"AA",X"AA",X"BB",X"99",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"77", + X"11",X"11",X"11",X"DD",X"11",X"FF",X"00",X"00",X"99",X"CC",X"EE",X"BB",X"99",X"FF",X"CC",X"88", + X"99",X"BB",X"99",X"88",X"88",X"FF",X"00",X"00",X"EE",X"22",X"EE",X"77",X"00",X"FF",X"00",X"00", + X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"CC",X"EE",X"BB",X"99",X"CC",X"EE",X"BB", + X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"11",X"11",X"11",X"11",X"DD",X"11",X"99",X"CC",X"EE",X"BB",X"99",X"CC",X"EE",X"BB", + X"88",X"88",X"88",X"88",X"AA",X"AA",X"BB",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00", + X"00",X"88",X"88",X"88",X"CC",X"44",X"44",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"DD",X"DD",X"DD",X"55",X"55",X"77",X"33", + X"66",X"66",X"55",X"55",X"DD",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"11",X"11",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00", + X"00",X"00",X"33",X"FF",X"55",X"DD",X"DD",X"DD",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"55",X"55",X"77",X"33",X"33",X"33",X"11",X"11",X"CC",X"44",X"44",X"66",X"66",X"66",X"77",X"55", + X"CC",X"99",X"BB",X"EE",X"CC",X"99",X"BB",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"99",X"BB",X"EE",X"DD",X"BB",X"BB",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"99",X"BB",X"EE",X"CC",X"99",X"BB",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"99",X"BB",X"EE",X"CC",X"99",X"BB",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"EE",X"FF",X"FF",X"77",X"77", + X"00",X"11",X"11",X"11",X"33",X"FF",X"FF",X"FF",X"88",X"88",X"88",X"88",X"88",X"CC",X"CC",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"11",X"11",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"33",X"33",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"88",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"77", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"77",X"00",X"33",X"77",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"77",X"FF",X"FF",X"FF",X"EE",X"CC",X"00",X"00",X"CC",X"CC",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"CC",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"33",X"33",X"77",X"77",X"77", + X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"EE",X"EE",X"EE",X"FF",X"FF",X"FF",X"77",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"E0",X"C0",X"80",X"C0",X"E0",X"E0",X"80",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70", + X"00",X"10",X"F0",X"F0",X"F0",X"F3",X"F3",X"F0",X"00",X"F0",X"F1",X"F2",X"F2",X"F1",X"F1",X"F2", + X"80",X"E0",X"E0",X"C0",X"80",X"C0",X"E0",X"00",X"70",X"70",X"30",X"30",X"10",X"00",X"00",X"00", + X"F0",X"F3",X"F3",X"F0",X"F0",X"F0",X"10",X"00",X"F2",X"F1",X"F1",X"F2",X"F2",X"F1",X"F0",X"00", + X"00",X"C0",X"E0",X"E0",X"C0",X"80",X"C0",X"E0",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70", + X"00",X"10",X"F0",X"F0",X"F0",X"F3",X"F3",X"F0",X"00",X"F0",X"F1",X"F2",X"F2",X"F1",X"F1",X"F2", + X"E0",X"C0",X"80",X"C0",X"E0",X"E0",X"C0",X"00",X"70",X"70",X"30",X"30",X"10",X"00",X"00",X"00", + X"F0",X"F3",X"F3",X"F0",X"F0",X"F0",X"10",X"00",X"F2",X"F1",X"F1",X"F2",X"F2",X"F1",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"11",X"33",X"77",X"77",X"33",X"11", + X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"FF", + X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"77",X"33",X"11",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"CC",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"00",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"11",X"00",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"00",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"11",X"00",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"00",X"FF",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"11",X"00",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"00",X"FF",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"11",X"00",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF",X"FF",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"00",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"11",X"00",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"00",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"11",X"00",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"01",X"30",X"30",X"67",X"77", + X"00",X"11",X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"67",X"30",X"30",X"01",X"00",X"00",X"00", + X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"01",X"30",X"30",X"67",X"77", + X"00",X"11",X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"67",X"30",X"30",X"01",X"00",X"00",X"00", + X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"06",X"09",X"08",X"08",X"06",X"02",X"0C",X"00",X"02",X"02",X"0A",X"06",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"00",X"0F",X"04",X"02",X"01",X"02",X"0C",X"00",X"08",X"0E",X"08",X"08",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"06",X"09",X"09",X"09",X"06",X"02",X"0C",X"00",X"0C",X"02",X"02",X"02",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"00",X"09",X"09",X"09",X"07",X"00",X"0F",X"0C",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"11",X"33",X"33",X"77",X"77",X"88",X"88",X"88",X"88",X"88",X"FF",X"FF",X"FF", + X"FF",X"FF",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"77",X"77",X"77",X"77",X"77",X"33",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"88",X"88", + X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"33", + X"10",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"DD",X"C0",X"E6",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"33",X"30",X"70",X"61",X"10",X"00",X"00",X"00", + X"DD",X"DD",X"DD",X"F7",X"79",X"F1",X"C0",X"00",X"FF",X"FF",X"DD",X"FF",X"FF",X"EE",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"EE",X"00", + X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"20",X"62",X"EE",X"EE",X"00",X"00",X"00",X"00",X"20",X"32",X"33",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"33",X"30",X"70",X"61",X"10",X"00",X"00",X"00", + X"22",X"9B",X"DD",X"F7",X"79",X"F1",X"C0",X"00",X"33",X"77",X"DD",X"FF",X"FF",X"EE",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"33",X"FF",X"FB",X"FF",X"77",X"77",X"33",X"88",X"88",X"88",X"88",X"88",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"CC",X"CC",X"EE",X"FE",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"FF",X"88",X"FF",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"77",X"FF", + X"FC",X"FE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"BB",X"FF",X"FF",X"FF",X"33",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"E6",X"CC",X"9B",X"EE",X"00",X"00",X"FE",X"EC",X"CC",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"CC",X"EE",X"BB",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"00",X"88",X"CC",X"EC",X"FE",X"00", + X"00",X"00",X"00",X"88",X"CC",X"C0",X"00",X"00",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"EE",X"CD",X"FF",X"00",X"00",X"EE",X"FF",X"FF",X"77",X"CC",X"00", + X"00",X"00",X"00",X"C0",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"CC",X"FF",X"BB",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"EE",X"00", + X"00",X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"FF",X"DD",X"9B",X"00",X"00",X"EE",X"FF",X"FF",X"DD",X"77",X"77", + X"EE",X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"AA",X"EE",X"CC",X"CC",X"C8",X"C8",X"00",X"00",X"33",X"33",X"11",X"11",X"10",X"10",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"11",X"33",X"30",X"00",X"00",X"00", + X"00",X"77",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"DD",X"FF",X"33", + X"CC",X"C0",X"E0",X"68",X"80",X"00",X"00",X"00",X"00",X"00",X"30",X"33",X"11",X"00",X"00",X"00", + X"00",X"33",X"EE",X"FF",X"FF",X"77",X"00",X"00",X"FF",X"3B",X"77",X"FE",X"E9",X"F8",X"30",X"00", + X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"33", + X"00",X"00",X"C8",X"C8",X"CC",X"CC",X"EE",X"AA",X"00",X"00",X"10",X"10",X"11",X"11",X"33",X"33", + X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"33",X"30",X"70",X"61",X"10",X"00",X"00",X"00", + X"9B",X"DD",X"FF",X"F7",X"79",X"F1",X"C0",X"00",X"77",X"77",X"DD",X"FF",X"FF",X"EE",X"00",X"00", + X"00",X"00",X"00",X"88",X"CC",X"C0",X"00",X"00",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"EE",X"CD",X"FF",X"00",X"00",X"EE",X"FF",X"FF",X"77",X"CC",X"00", + X"00",X"00",X"00",X"C0",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"CC",X"FF",X"BB",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"EE",X"00", + X"00",X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"FF",X"DD",X"9B",X"00",X"00",X"EE",X"FF",X"FF",X"DD",X"77",X"77", + X"EE",X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"AA",X"EE",X"CC",X"CC",X"C8",X"C8",X"00",X"00",X"33",X"33",X"11",X"11",X"10",X"10",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"11",X"33",X"30",X"00",X"00",X"00", + X"00",X"77",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"DD",X"FF",X"33", + X"CC",X"C0",X"E0",X"68",X"80",X"00",X"00",X"00",X"00",X"00",X"30",X"33",X"11",X"00",X"00",X"00", + X"00",X"33",X"EE",X"FF",X"FF",X"77",X"00",X"00",X"FF",X"3B",X"77",X"FE",X"E9",X"F8",X"30",X"00", + X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"11",X"11",X"33",X"33",X"33", + X"00",X"00",X"C8",X"C8",X"CC",X"CC",X"EE",X"AA",X"00",X"00",X"10",X"10",X"11",X"11",X"33",X"33", + X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"33",X"30",X"70",X"61",X"10",X"00",X"00",X"00", + X"9B",X"DD",X"FF",X"F7",X"79",X"F1",X"C0",X"00",X"77",X"77",X"DD",X"FF",X"FF",X"EE",X"00",X"00", + X"00",X"00",X"00",X"88",X"CC",X"C0",X"00",X"00",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"EE",X"CD",X"FF",X"00",X"00",X"EE",X"FF",X"FF",X"77",X"CC",X"00", + X"00",X"00",X"00",X"C0",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"CC",X"FF",X"BB",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"EE",X"00", + X"00",X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"00",X"00",X"00",X"10",X"61",X"70",X"30",X"33", + X"00",X"C0",X"F1",X"79",X"F7",X"FF",X"DD",X"9B",X"00",X"00",X"EE",X"FF",X"FF",X"DD",X"77",X"77", + X"EE",X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"33",X"33",X"33",X"11",X"11",X"00",X"00",X"00", + X"AA",X"EE",X"CC",X"CC",X"C8",X"C8",X"00",X"00",X"33",X"33",X"11",X"11",X"10",X"10",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"11",X"33",X"30",X"00",X"00",X"00", + X"00",X"77",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"DD",X"FF",X"33", + X"CC",X"C0",X"E0",X"68",X"80",X"00",X"00",X"00",X"00",X"00",X"30",X"33",X"11",X"00",X"00",X"00", + X"00",X"33",X"EE",X"FF",X"FF",X"77",X"00",X"00",X"FF",X"3B",X"77",X"FE",X"E9",X"F8",X"30",X"00", + X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"11",X"33",X"30",X"00",X"00",X"00", + X"00",X"77",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"DD",X"FF",X"33", + X"CC",X"C0",X"E0",X"68",X"80",X"00",X"00",X"00",X"00",X"00",X"30",X"33",X"11",X"00",X"00",X"00", + X"00",X"33",X"EE",X"FF",X"FF",X"77",X"00",X"00",X"FF",X"3B",X"77",X"FE",X"E9",X"F8",X"30",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..17522bd2 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,32 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"03", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"05",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"07", + X"00",X"00",X"00",X"00",X"00",X"0B",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"0E",X"00",X"01",X"0C",X"0F", + X"00",X"0E",X"00",X"0B",X"00",X"0C",X"0B",X"0E",X"00",X"0C",X"0F",X"01",X"00",X"00",X"00",X"00", + X"00",X"01",X"02",X"0F",X"00",X"07",X"0C",X"02",X"00",X"09",X"06",X"0F",X"00",X"0D",X"0C",X"0F", + X"00",X"05",X"03",X"09",X"00",X"0F",X"0B",X"00",X"00",X"0E",X"00",X"0B",X"00",X"0E",X"00",X"0B", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0E",X"01",X"00",X"0F",X"0B",X"0E",X"00",X"0E",X"00",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin + data <= rom_data(to_integer(unsigned(addr))); +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..88b2ecb3 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"66",X"EF",X"00",X"F8",X"EA",X"6F",X"00",X"3F",X"00",X"C9",X"38",X"AA",X"AF",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..48cb873c --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F3",X"3E",X"00",X"C3",X"D5",X"1F",X"00",X"00",X"77",X"23",X"10",X"FC",X"C9",X"C3",X"65",X"09", + X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"C9",X"78",X"87",X"D7",X"5F",X"23",X"56",X"EB",X"C9", + X"E1",X"87",X"D7",X"5F",X"23",X"56",X"EB",X"E9",X"E1",X"46",X"23",X"4E",X"23",X"E5",X"18",X"12", + X"11",X"90",X"4C",X"06",X"10",X"C3",X"51",X"00",X"C3",X"19",X"2F",X"50",X"32",X"07",X"50",X"C3", + X"38",X"00",X"2A",X"80",X"4C",X"70",X"2C",X"71",X"2C",X"20",X"02",X"2E",X"C0",X"22",X"80",X"4C", + X"C9",X"1A",X"A7",X"28",X"06",X"1C",X"1C",X"1C",X"10",X"F7",X"C9",X"E1",X"06",X"03",X"7E",X"12", + X"23",X"1C",X"10",X"FA",X"E9",X"00",X"C3",X"D9",X"B6",X"C3",X"FA",X"1E",X"32",X"C0",X"50",X"31", + X"C0",X"4F",X"AF",X"21",X"00",X"50",X"01",X"08",X"08",X"CF",X"21",X"00",X"4C",X"06",X"BE",X"CF", + X"CF",X"CF",X"CF",X"21",X"40",X"50",X"06",X"40",X"CF",X"32",X"C0",X"50",X"CD",X"68",X"20",X"32", + X"C0",X"50",X"06",X"00",X"CD",X"46",X"20",X"32",X"C0",X"50",X"21",X"C0",X"4C",X"22",X"80",X"4C", + X"22",X"82",X"4C",X"3E",X"FF",X"06",X"40",X"CF",X"3E",X"01",X"32",X"00",X"50",X"21",X"74",X"36", + X"11",X"E8",X"4D",X"01",X"10",X"00",X"ED",X"B0",X"FB",X"2A",X"82",X"4C",X"7E",X"A7",X"FA",X"B9", + X"00",X"36",X"FF",X"2C",X"46",X"36",X"FF",X"2C",X"20",X"02",X"2E",X"C0",X"22",X"82",X"4C",X"21", + X"B9",X"00",X"E5",X"E7",X"46",X"20",X"C3",X"22",X"74",X"20",X"62",X"22",X"29",X"23",X"75",X"24", + X"68",X"20",X"82",X"24",X"52",X"25",X"8E",X"25",X"CB",X"25",X"13",X"26",X"5D",X"26",X"8C",X"26", + X"BB",X"26",X"EA",X"26",X"0D",X"00",X"8C",X"24",X"B5",X"22",X"6B",X"28",X"D2",X"24",X"8A",X"22", + X"41",X"20",X"19",X"27",X"1D",X"29",X"90",X"28",X"E4",X"29",X"64",X"2A",X"15",X"96",X"1B",X"2A", + X"5F",X"24",X"9C",X"24",X"DA",X"2A",X"96",X"28",X"35",X"01",X"C3",X"13",X"24",X"60",X"3E",X"19", + X"21",X"79",X"37",X"01",X"00",X"71",X"EF",X"AD",X"00",X"71",X"BA",X"24",X"20",X"30",X"C3",X"00", + X"00",X"C9",X"78",X"21",X"D1",X"31",X"EF",X"AD",X"C9",X"7B",X"BA",X"24",X"38",X"AE",X"66",X"01", + X"7B",X"01",X"4D",X"83",X"78",X"65",X"56",X"76",X"11",X"60",X"45",X"63",X"67",X"65",X"89",X"76", + X"78",X"65",X"90",X"78",X"0A",X"79",X"0A",X"79",X"80",X"79",X"89",X"76",X"90",X"78",X"43",X"65", + X"45",X"7F",X"89",X"6A",X"9A",X"67",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09", + X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"12",X"13",X"14",X"01",X"03",X"04",X"06",X"07", + X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"14",X"14",X"14",X"14",X"14",X"14", + X"00",X"00",X"00",X"01",X"03",X"04",X"06",X"08",X"0A",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"12", + X"13",X"14",X"14",X"14",X"14",X"14",X"14",X"14",X"00",X"00",X"00",X"E3",X"DD",X"E5",X"FD",X"E5", + X"C5",X"47",X"CD",X"CD",X"01",X"7E",X"23",X"A7",X"28",X"0C",X"FD",X"77",X"00",X"DD",X"70",X"00", + X"FD",X"19",X"DD",X"19",X"18",X"EF",X"C1",X"FD",X"E1",X"DD",X"E1",X"E3",X"C9",X"C5",X"FD",X"21", + X"00",X"40",X"DD",X"21",X"00",X"44",X"42",X"4B",X"11",X"20",X"00",X"78",X"A7",X"28",X"06",X"FD", + X"19",X"DD",X"19",X"10",X"FA",X"59",X"FD",X"19",X"DD",X"19",X"11",X"E0",X"FF",X"C1",X"C9",X"CD", + X"62",X"3A",X"3E",X"0F",X"11",X"1A",X"1B",X"CD",X"AB",X"01",X"49",X"4E",X"44",X"55",X"53",X"54", + X"52",X"49",X"41",X"40",X"41",X"52",X"47",X"45",X"4E",X"54",X"49",X"4E",X"41",X"00",X"06",X"10", + X"CD",X"79",X"32",X"3E",X"0F",X"11",X"1C",X"1B",X"CD",X"AB",X"01",X"5C",X"40",X"49",X"4E",X"47", + X"40",X"4F",X"4A",X"45",X"44",X"41",X"40",X"31",X"39",X"39",X"30",X"00",X"06",X"10",X"CD",X"79", + X"32",X"3E",X"0F",X"11",X"1E",X"1B",X"CD",X"AB",X"01",X"4E",X"55",X"4D",X"45",X"52",X"4F",X"40", + X"53",X"45",X"52",X"49",X"45",X"40",X"50",X"41",X"43",X"30",X"30",X"30",X"30",X"00",X"06",X"10", + X"CD",X"79",X"32",X"21",X"00",X"40",X"06",X"04",X"C9",X"7B",X"03",X"4E",X"4F",X"52",X"4D",X"41", + X"4C",X"40",X"40",X"40",X"40",X"52",X"41",X"50",X"49",X"44",X"4F",X"40",X"40",X"40",X"40",X"54", + X"55",X"52",X"42",X"4F",X"2F",X"89",X"2F",X"80",X"78",X"03",X"40",X"40",X"40",X"40",X"40",X"40", + X"44",X"4F",X"42",X"4C",X"45",X"40",X"43",X"4F",X"4D",X"41",X"4E",X"44",X"4F",X"40",X"40",X"40", + X"40",X"40",X"40",X"2F",X"89",X"2F",X"80",X"78",X"03",X"40",X"40",X"40",X"40",X"40",X"40",X"44", + X"4F",X"42",X"4C",X"45",X"40",X"43",X"4F",X"4D",X"41",X"4E",X"44",X"4F",X"40",X"40",X"40",X"40", + X"40",X"40",X"2F",X"81",X"2F",X"80",X"7B",X"03",X"4E",X"4F",X"52",X"4D",X"41",X"4C",X"40",X"2F", + X"81",X"2F",X"80",X"3B",X"02",X"52",X"41",X"50",X"49",X"44",X"4F",X"40",X"2F",X"81",X"2F",X"80", + X"FB",X"00",X"54",X"55",X"52",X"42",X"4F",X"2F",X"81",X"2F",X"80",X"92",X"02",X"54",X"55",X"52", + X"42",X"4F",X"2F",X"81",X"2F",X"80",X"69",X"03",X"40",X"40",X"40",X"40",X"49",X"4E",X"43",X"45", + X"52",X"54",X"40",X"59",X"4F",X"55",X"52",X"40",X"4E",X"41",X"4D",X"45",X"40",X"40",X"40",X"2F", + X"89",X"2F",X"80",X"65",X"03",X"40",X"40",X"53",X"45",X"4C",X"45",X"43",X"54",X"40",X"53",X"50", + X"45",X"45",X"44",X"40",X"50",X"41",X"43",X"4B",X"4D",X"41",X"4E",X"2F",X"89",X"2F",X"80",X"7D", + X"03",X"40",X"40",X"40",X"50",X"4F",X"52",X"40",X"46",X"41",X"56",X"4F",X"52",X"40",X"4D",X"41", + X"53",X"40",X"46",X"49",X"43",X"48",X"41",X"53",X"40",X"2F",X"85",X"2F",X"80",X"7D",X"03",X"40", + X"40",X"50",X"4F",X"52",X"40",X"46",X"41",X"56",X"4F",X"52",X"40",X"53",X"45",X"4C",X"45",X"43", + X"43",X"49",X"4F",X"4E",X"45",X"40",X"40",X"2F",X"85",X"2F",X"80",X"92",X"02",X"45",X"58",X"54", + X"52",X"41",X"40",X"4C",X"49",X"46",X"45",X"2F",X"89",X"2F",X"80",X"92",X"02",X"42",X"4F",X"4E", + X"55",X"53",X"40",X"4E",X"4F",X"4E",X"45",X"2F",X"81",X"2F",X"80",X"92",X"02",X"32",X"30",X"30", + X"40",X"40",X"42",X"4F",X"4E",X"55",X"53",X"2F",X"85",X"2F",X"80",X"92",X"02",X"33",X"30",X"30", + X"40",X"40",X"42",X"4F",X"4E",X"55",X"53",X"2F",X"85",X"2F",X"80",X"92",X"02",X"34",X"30",X"30", + X"40",X"40",X"42",X"4F",X"4E",X"55",X"53",X"2F",X"85",X"2F",X"80",X"92",X"02",X"35",X"30",X"30", + X"40",X"40",X"42",X"4F",X"4E",X"55",X"53",X"2F",X"85",X"2F",X"80",X"92",X"02",X"36",X"30",X"30", + X"40",X"40",X"42",X"4F",X"4E",X"55",X"53",X"2F",X"85",X"2F",X"80",X"92",X"02",X"37",X"30",X"30", + X"40",X"40",X"42",X"4F",X"4E",X"55",X"53",X"2F",X"85",X"2F",X"80",X"92",X"02",X"38",X"30",X"30", + X"40",X"40",X"42",X"4F",X"4E",X"55",X"53",X"2F",X"85",X"2F",X"80",X"92",X"02",X"35",X"30",X"30", + X"30",X"40",X"42",X"4F",X"4E",X"55",X"53",X"2F",X"85",X"2F",X"80",X"10",X"11",X"12",X"13",X"14", + X"01",X"03",X"04",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"14", + X"21",X"84",X"4C",X"34",X"23",X"35",X"23",X"11",X"4D",X"04",X"01",X"01",X"04",X"34",X"7E",X"E6", + X"0F",X"EB",X"BE",X"20",X"13",X"0C",X"1A",X"C6",X"10",X"E6",X"F0",X"12",X"23",X"BE",X"20",X"08", + X"0C",X"EB",X"36",X"00",X"23",X"13",X"10",X"E5",X"21",X"8A",X"4C",X"71",X"2C",X"7E",X"87",X"87", + X"86",X"3C",X"77",X"2C",X"7E",X"87",X"86",X"87",X"87",X"86",X"3C",X"77",X"C9",X"06",X"A0",X"0A", + X"60",X"0A",X"60",X"0A",X"A0",X"21",X"6A",X"4C",X"5E",X"23",X"56",X"D5",X"E1",X"77",X"21",X"90", + X"4C",X"3A",X"8A",X"4C",X"4F",X"06",X"10",X"7E",X"A7",X"28",X"43",X"E6",X"C0",X"07",X"07",X"B9", + X"30",X"3C",X"35",X"7E",X"E6",X"3F",X"20",X"36",X"77",X"C5",X"E5",X"2C",X"7E",X"2C",X"46",X"21", + X"AC",X"04",X"E5",X"E7",X"F1",X"0A",X"D0",X"08",X"8F",X"06",X"87",X"14",X"AF",X"11",X"B4",X"11", + X"B4",X"04",X"B7",X"04",X"B7",X"04",X"B7",X"04",X"B7",X"04",X"DC",X"B5",X"00",X"67",X"89",X"7F", + X"47",X"65",X"89",X"67",X"00",X"70",X"B5",X"7A",X"9A",X"78",X"AF",X"79",X"E1",X"C1",X"2C",X"2C", + X"2C",X"10",X"B4",X"C9",X"EF",X"1C",X"86",X"C9",X"3A",X"6E",X"4E",X"FE",X"99",X"17",X"32",X"06", + X"50",X"1F",X"D0",X"3A",X"00",X"50",X"47",X"CB",X"00",X"3A",X"66",X"4E",X"17",X"E6",X"0F",X"32", + X"66",X"4E",X"D6",X"0C",X"CC",X"30",X"05",X"CB",X"00",X"3A",X"67",X"4E",X"17",X"E6",X"0F",X"32", + X"67",X"4E",X"D6",X"0C",X"C2",X"EB",X"04",X"21",X"69",X"4E",X"34",X"CB",X"00",X"3A",X"68",X"4E", + X"17",X"E6",X"0F",X"32",X"68",X"4E",X"D6",X"0C",X"C0",X"21",X"69",X"4E",X"34",X"C9",X"3A",X"69", + X"4E",X"A7",X"C8",X"47",X"3A",X"6A",X"4E",X"5F",X"FE",X"00",X"C2",X"15",X"05",X"3E",X"01",X"32", + X"07",X"50",X"CD",X"30",X"05",X"7B",X"FE",X"08",X"C2",X"1F",X"05",X"AF",X"32",X"07",X"50",X"1C", + X"7B",X"32",X"6A",X"4E",X"D6",X"10",X"C0",X"32",X"6A",X"4E",X"05",X"78",X"32",X"69",X"4E",X"C9", + X"3A",X"6B",X"4E",X"21",X"6C",X"4E",X"34",X"96",X"C0",X"77",X"3A",X"6D",X"4E",X"21",X"6E",X"4E", + X"86",X"27",X"D2",X"47",X"05",X"3E",X"99",X"FE",X"02",X"38",X"12",X"F5",X"C5",X"D5",X"E5",X"3A", + X"03",X"4E",X"FE",X"01",X"20",X"03",X"EF",X"20",X"0B",X"E1",X"D1",X"C1",X"F1",X"77",X"21",X"9C", + X"4E",X"CB",X"CE",X"C9",X"21",X"CE",X"4D",X"34",X"7E",X"E6",X"0F",X"20",X"1F",X"7E",X"0F",X"0F", + X"0F",X"0F",X"47",X"3A",X"D6",X"4D",X"2F",X"B0",X"4F",X"3A",X"6E",X"4E",X"D6",X"01",X"30",X"02", + X"AF",X"4F",X"28",X"01",X"79",X"AF",X"32",X"05",X"50",X"32",X"04",X"50",X"DD",X"21",X"D8",X"43", + X"FD",X"21",X"C5",X"43",X"3A",X"00",X"4E",X"FE",X"03",X"CA",X"AB",X"05",X"3A",X"03",X"4E",X"FE", + X"02",X"D2",X"AB",X"05",X"CD",X"D0",X"05",X"CD",X"DD",X"05",X"C9",X"3A",X"09",X"4E",X"A7",X"3A", + X"CE",X"4D",X"C2",X"C0",X"05",X"CB",X"67",X"CC",X"D0",X"05",X"C4",X"EA",X"05",X"C3",X"C8",X"05", + X"CB",X"67",X"CC",X"DD",X"05",X"C4",X"F7",X"05",X"3A",X"70",X"4E",X"A7",X"CC",X"F7",X"05",X"C9", + X"DD",X"36",X"00",X"50",X"DD",X"36",X"01",X"55",X"DD",X"36",X"02",X"31",X"C9",X"FD",X"36",X"00", + X"50",X"FD",X"36",X"01",X"55",X"FD",X"36",X"02",X"32",X"C9",X"DD",X"36",X"00",X"40",X"DD",X"36", + X"01",X"40",X"DD",X"36",X"02",X"40",X"C9",X"FD",X"36",X"00",X"40",X"FD",X"36",X"01",X"40",X"FD", + X"36",X"02",X"40",X"C9",X"C9",X"3A",X"06",X"4E",X"D6",X"05",X"D8",X"2A",X"08",X"4D",X"06",X"08", + X"0E",X"10",X"7D",X"32",X"06",X"4D",X"32",X"D2",X"4D",X"91",X"32",X"02",X"4D",X"32",X"04",X"4D", + X"7C",X"80",X"32",X"03",X"4D",X"32",X"07",X"4D",X"91",X"32",X"05",X"4D",X"32",X"D3",X"4D",X"C9", + X"3A",X"00",X"4E",X"E6",X"03",X"E7",X"3E",X"06",X"6A",X"06",X"94",X"06",X"EF",X"08",X"3A",X"01", + X"4E",X"E6",X"01",X"E7",X"48",X"06",X"0C",X"00",X"EF",X"00",X"00",X"EF",X"06",X"00",X"EF",X"01", + X"00",X"EF",X"14",X"00",X"EF",X"18",X"00",X"EF",X"04",X"00",X"EF",X"1E",X"00",X"EF",X"07",X"00", + X"21",X"01",X"4E",X"34",X"21",X"01",X"50",X"36",X"01",X"C9",X"CD",X"1B",X"2A",X"3A",X"6E",X"4E", + X"A7",X"28",X"0C",X"AF",X"32",X"04",X"4E",X"32",X"02",X"4E",X"21",X"00",X"4E",X"34",X"C9",X"C3", + X"9B",X"3D",X"CD",X"EF",X"08",X"C9",X"06",X"1C",X"CD",X"42",X"00",X"F7",X"4A",X"02",X"00",X"21", + X"02",X"4E",X"34",X"C9",X"3A",X"03",X"4E",X"E6",X"07",X"E7",X"96",X"07",X"AC",X"06",X"8B",X"08", + X"0C",X"00",X"D5",X"08",X"A6",X"3F",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"AF",X"32",X"FE",X"4D", + X"32",X"FF",X"4D",X"CD",X"D3",X"07",X"3A",X"70",X"4C",X"E6",X"03",X"E7",X"C4",X"06",X"F4",X"06", + X"23",X"07",X"5A",X"07",X"3A",X"71",X"4C",X"A7",X"28",X"0B",X"EF",X"20",X"01",X"AF",X"32",X"71", + X"4C",X"3C",X"32",X"77",X"4C",X"3A",X"00",X"50",X"CB",X"47",X"CA",X"7E",X"07",X"CB",X"57",X"CA", + X"E8",X"06",X"CB",X"5F",X"CA",X"17",X"07",X"C0",X"32",X"71",X"4C",X"EF",X"20",X"00",X"3E",X"02", + X"32",X"70",X"4C",X"C9",X"3A",X"71",X"4C",X"A7",X"28",X"0B",X"EF",X"20",X"02",X"AF",X"32",X"71", + X"4C",X"3C",X"32",X"77",X"4C",X"3A",X"00",X"50",X"CB",X"47",X"CA",X"7E",X"07",X"CB",X"4F",X"28", + X"3E",X"CB",X"57",X"CA",X"E8",X"06",X"C0",X"32",X"71",X"4C",X"EF",X"20",X"00",X"3E",X"01",X"32", + X"70",X"4C",X"C9",X"3A",X"71",X"4C",X"A7",X"28",X"15",X"EF",X"20",X"03",X"3A",X"6E",X"4E",X"FE", + X"02",X"38",X"03",X"EF",X"20",X"0B",X"AF",X"32",X"71",X"4C",X"3C",X"32",X"77",X"4C",X"3A",X"00", + X"50",X"CB",X"4F",X"28",X"0A",X"CB",X"47",X"CA",X"7E",X"07",X"CB",X"5F",X"28",X"C9",X"C0",X"32", + X"71",X"4C",X"EF",X"20",X"00",X"AF",X"32",X"70",X"4C",X"C9",X"3A",X"71",X"4C",X"A7",X"28",X"0B", + X"EF",X"20",X"0C",X"AF",X"32",X"71",X"4C",X"3C",X"32",X"77",X"4C",X"3A",X"00",X"50",X"CB",X"4F", + X"CA",X"4F",X"07",X"CB",X"57",X"CA",X"E8",X"06",X"CB",X"5F",X"CA",X"17",X"07",X"C0",X"08",X"3A", + X"6E",X"4E",X"FE",X"02",X"D8",X"08",X"32",X"71",X"4C",X"EF",X"20",X"00",X"EF",X"20",X"0B",X"3E", + X"03",X"32",X"70",X"4C",X"C9",X"C9",X"3E",X"00",X"32",X"70",X"4C",X"32",X"71",X"4C",X"32",X"77", + X"4C",X"AF",X"32",X"72",X"4C",X"CD",X"1B",X"2A",X"EF",X"00",X"01",X"EF",X"01",X"00",X"EF",X"1C", + X"07",X"EF",X"1C",X"0B",X"EF",X"1E",X"00",X"EF",X"20",X"00",X"EF",X"20",X"07",X"21",X"03",X"4E", + X"34",X"3E",X"01",X"32",X"D6",X"4D",X"3A",X"71",X"4E",X"FE",X"FF",X"C8",X"EF",X"1C",X"0A",X"EF", + X"1F",X"00",X"C9",X"CD",X"1B",X"2A",X"3A",X"6E",X"4E",X"FE",X"01",X"06",X"09",X"20",X"0A",X"06", + X"08",X"18",X"18",X"06",X"37",X"CD",X"DF",X"2A",X"C9",X"FE",X"04",X"D4",X"E3",X"07",X"3A",X"71", + X"4C",X"A7",X"28",X"05",X"06",X"0B",X"CD",X"DA",X"2A",X"06",X"09",X"CD",X"DF",X"2A",X"3A",X"6E", + X"4E",X"FE",X"01",X"3A",X"40",X"50",X"28",X"0C",X"CB",X"77",X"20",X"08",X"3E",X"01",X"32",X"70", + X"4E",X"C3",X"1B",X"08",X"CB",X"6F",X"C0",X"AF",X"32",X"70",X"4E",X"3A",X"6B",X"4E",X"A7",X"28", + X"48",X"3A",X"77",X"4C",X"A7",X"CA",X"79",X"08",X"3A",X"70",X"4E",X"A7",X"3A",X"6E",X"4E",X"28", + X"19",X"08",X"3A",X"70",X"4C",X"FE",X"03",X"20",X"0D",X"3A",X"6E",X"4E",X"FE",X"04",X"DA",X"82", + X"08",X"08",X"C6",X"99",X"27",X"08",X"08",X"C6",X"99",X"27",X"08",X"3A",X"70",X"4C",X"FE",X"03", + X"20",X"0D",X"3A",X"6E",X"4E",X"FE",X"02",X"DA",X"82",X"08",X"08",X"C6",X"99",X"27",X"08",X"08", + X"C6",X"99",X"27",X"32",X"6E",X"4E",X"CD",X"1B",X"2A",X"21",X"03",X"4E",X"34",X"AF",X"32",X"D6", + X"4D",X"3C",X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"C9",X"3E",X"10",X"32",X"BC",X"4E",X"EF",X"20", + X"0E",X"C9",X"3E",X"04",X"32",X"BC",X"4E",X"EF",X"20",X"0D",X"C9",X"EF",X"00",X"01",X"EF",X"01", + X"01",X"EF",X"02",X"00",X"EF",X"1C",X"15",X"EF",X"12",X"00",X"EF",X"03",X"00",X"EF",X"1C",X"03", + X"EF",X"1C",X"06",X"EF",X"29",X"35",X"EF",X"34",X"35",X"EF",X"18",X"00",X"EF",X"1B",X"00",X"AF", + X"32",X"13",X"4E",X"3A",X"6F",X"4E",X"08",X"3A",X"70",X"4C",X"FE",X"03",X"20",X"04",X"08",X"CB", + X"27",X"08",X"08",X"32",X"14",X"4E",X"32",X"15",X"4E",X"EF",X"1A",X"00",X"F7",X"57",X"01",X"00", + X"21",X"03",X"4E",X"34",X"C9",X"21",X"15",X"4E",X"35",X"CD",X"E4",X"29",X"AF",X"32",X"79",X"4C", + X"AF",X"32",X"03",X"4E",X"32",X"02",X"4E",X"32",X"04",X"4E",X"21",X"00",X"4E",X"34",X"C9",X"3A", + X"04",X"4E",X"E7",X"D6",X"0A",X"F6",X"0A",X"0C",X"00",X"2A",X"0B",X"6D",X"0B",X"0C",X"00",X"BA", + X"0B",X"0C",X"00",X"05",X"0C",X"22",X"0C",X"0C",X"00",X"75",X"0C",X"7B",X"0C",X"0C",X"00",X"8B", + X"0C",X"0C",X"00",X"A1",X"0C",X"0C",X"00",X"A5",X"0C",X"0C",X"00",X"A7",X"0C",X"0C",X"00",X"A9", + X"0C",X"0C",X"00",X"AB",X"0C",X"0C",X"00",X"AD",X"0C",X"0C",X"00",X"AF",X"0C",X"0C",X"00",X"B1", + X"0C",X"0C",X"00",X"CF",X"0C",X"0C",X"00",X"17",X"0D",X"3B",X"0D",X"0C",X"00",X"3E",X"0D",X"0C", + X"00",X"84",X"B1",X"5F",X"09",X"5F",X"09",X"5F",X"09",X"A6",X"3F",X"0C",X"00",X"A9",X"68",X"0C", + X"00",X"54",X"76",X"0C",X"00",X"E0",X"7F",X"0C",X"00",X"E0",X"7F",X"0C",X"00",X"E0",X"7F",X"3E", + X"27",X"32",X"04",X"4E",X"C9",X"78",X"A7",X"20",X"04",X"2A",X"0A",X"4E",X"7E",X"DD",X"21",X"ED", + X"09",X"47",X"87",X"87",X"80",X"80",X"5F",X"16",X"00",X"DD",X"19",X"DD",X"7E",X"00",X"87",X"47", + X"87",X"87",X"4F",X"87",X"87",X"81",X"80",X"5F",X"16",X"00",X"21",X"A5",X"32",X"19",X"CD",X"6B", + X"0A",X"DD",X"7E",X"01",X"32",X"B0",X"4D",X"DD",X"7E",X"02",X"47",X"87",X"80",X"5F",X"16",X"00", + X"21",X"9A",X"0A",X"19",X"CD",X"91",X"0A",X"DD",X"7E",X"03",X"87",X"5F",X"16",X"00",X"FD",X"21", + X"A6",X"0A",X"FD",X"19",X"FD",X"6E",X"00",X"FD",X"66",X"01",X"22",X"BB",X"4D",X"DD",X"7E",X"04", + X"87",X"5F",X"16",X"00",X"FD",X"21",X"B8",X"0A",X"FD",X"19",X"FD",X"6E",X"00",X"FD",X"66",X"01", + X"22",X"BD",X"4D",X"DD",X"7E",X"05",X"87",X"5F",X"16",X"00",X"FD",X"21",X"D0",X"0A",X"FD",X"19", + X"FD",X"6E",X"00",X"FD",X"66",X"01",X"22",X"95",X"4D",X"CD",X"64",X"2A",X"C9",X"03",X"01",X"01", + X"00",X"02",X"00",X"04",X"01",X"02",X"01",X"03",X"00",X"04",X"01",X"03",X"02",X"04",X"01",X"04", + X"02",X"03",X"02",X"05",X"01",X"05",X"00",X"03",X"02",X"06",X"02",X"05",X"01",X"03",X"03",X"03", + X"02",X"05",X"02",X"03",X"03",X"06",X"02",X"05",X"02",X"03",X"03",X"06",X"02",X"05",X"00",X"03", + X"04",X"07",X"02",X"05",X"01",X"03",X"04",X"03",X"02",X"05",X"02",X"03",X"04",X"06",X"02",X"05", + X"02",X"03",X"05",X"07",X"02",X"05",X"00",X"03",X"05",X"07",X"02",X"05",X"02",X"03",X"05",X"05", + X"02",X"05",X"01",X"03",X"06",X"07",X"02",X"05",X"02",X"03",X"06",X"07",X"02",X"05",X"02",X"03", + X"06",X"08",X"02",X"05",X"02",X"03",X"06",X"07",X"02",X"05",X"02",X"03",X"07",X"08",X"02",X"05", + X"02",X"03",X"07",X"08",X"02",X"06",X"02",X"03",X"07",X"08",X"02",X"11",X"46",X"4D",X"01",X"1C", + X"00",X"ED",X"B0",X"01",X"0C",X"00",X"A7",X"ED",X"42",X"ED",X"B0",X"01",X"0C",X"00",X"A7",X"ED", + X"42",X"ED",X"B0",X"01",X"0C",X"00",X"A7",X"ED",X"42",X"ED",X"B0",X"01",X"0E",X"00",X"ED",X"B0", + X"C9",X"11",X"B8",X"4D",X"01",X"03",X"00",X"ED",X"B0",X"C9",X"14",X"1E",X"46",X"00",X"1E",X"3C", + X"00",X"00",X"32",X"00",X"00",X"00",X"14",X"0A",X"1E",X"0F",X"28",X"14",X"32",X"19",X"3C",X"1E", + X"50",X"28",X"64",X"32",X"78",X"3C",X"8C",X"46",X"C0",X"03",X"48",X"03",X"D0",X"02",X"58",X"02", + X"E0",X"01",X"E0",X"01",X"68",X"01",X"68",X"01",X"F0",X"00",X"F0",X"00",X"78",X"00",X"01",X"00", + X"F0",X"00",X"F0",X"00",X"B4",X"00",X"21",X"09",X"4E",X"AF",X"06",X"0B",X"CF",X"CD",X"B5",X"22", + X"2A",X"73",X"4E",X"22",X"0A",X"4E",X"21",X"0A",X"4E",X"11",X"38",X"4E",X"01",X"2E",X"00",X"ED", + X"B0",X"21",X"04",X"4E",X"34",X"C9",X"3A",X"00",X"4E",X"3D",X"20",X"06",X"3E",X"09",X"32",X"04", + X"4E",X"C9",X"EF",X"11",X"00",X"EF",X"1C",X"83",X"EF",X"04",X"00",X"EF",X"05",X"00",X"EF",X"10", + X"00",X"EF",X"1A",X"00",X"F7",X"54",X"00",X"00",X"F7",X"54",X"06",X"00",X"3A",X"72",X"4E",X"47", + X"3A",X"09",X"4E",X"A0",X"32",X"03",X"50",X"C3",X"F1",X"0A",X"3A",X"00",X"50",X"CB",X"67",X"C3", + X"3B",X"0B",X"21",X"04",X"4E",X"36",X"0E",X"EF",X"13",X"00",X"C9",X"3A",X"0E",X"4E",X"C3",X"7A", + X"94",X"00",X"21",X"04",X"4E",X"36",X"0C",X"C9",X"CD",X"B7",X"11",X"CD",X"B7",X"11",X"CD",X"14", + X"16",X"CD",X"1F",X"0F",X"CD",X"00",X"11",X"CD",X"19",X"11",X"CD",X"5E",X"0D",X"CD",X"BC",X"0E", + X"CD",X"F3",X"0E",X"CD",X"FA",X"B2",X"CD",X"4E",X"11",X"CD",X"8F",X"11",X"C9",X"3E",X"01",X"32", + X"12",X"4E",X"CD",X"8A",X"22",X"21",X"04",X"4E",X"34",X"3A",X"14",X"4E",X"A7",X"20",X"39",X"3A", + X"70",X"4E",X"A7",X"28",X"33",X"3A",X"42",X"4E",X"A7",X"28",X"2D",X"3A",X"09",X"4E",X"C6",X"03", + X"4F",X"06",X"1C",X"CD",X"42",X"00",X"EF",X"1C",X"05",X"3A",X"FE",X"4D",X"A7",X"20",X"05",X"F7", + X"54",X"00",X"00",X"C9",X"3D",X"47",X"3A",X"09",X"4E",X"B8",X"C0",X"3A",X"04",X"4E",X"3C",X"32", + X"FF",X"4D",X"3E",X"27",X"32",X"04",X"4E",X"C9",X"34",X"C9",X"3A",X"70",X"4E",X"A7",X"28",X"06", + X"3A",X"42",X"4E",X"A7",X"20",X"2E",X"3A",X"14",X"4E",X"A7",X"20",X"33",X"CD",X"1B",X"2A",X"EF", + X"1C",X"05",X"3A",X"FE",X"4D",X"A7",X"20",X"06",X"F7",X"54",X"00",X"00",X"18",X"11",X"21",X"04", + X"4E",X"34",X"34",X"3A",X"04",X"4E",X"32",X"FF",X"4D",X"3E",X"27",X"32",X"04",X"4E",X"C9",X"21", + X"04",X"4E",X"34",X"C9",X"CD",X"41",X"0D",X"3A",X"09",X"4E",X"EE",X"01",X"32",X"09",X"4E",X"3E", + X"09",X"32",X"04",X"4E",X"C9",X"3A",X"78",X"4C",X"3C",X"32",X"78",X"4C",X"AF",X"32",X"02",X"4E", + X"32",X"04",X"4E",X"32",X"70",X"4E",X"32",X"09",X"4E",X"32",X"03",X"50",X"3E",X"01",X"32",X"00", + X"4E",X"C9",X"EF",X"00",X"01",X"EF",X"01",X"01",X"EF",X"02",X"00",X"EF",X"11",X"00",X"EF",X"13", + X"00",X"EF",X"03",X"00",X"EF",X"04",X"00",X"EF",X"05",X"00",X"EF",X"1C",X"0E",X"EF",X"10",X"00", + X"EF",X"1A",X"00",X"EF",X"1C",X"06",X"EF",X"29",X"0F",X"EF",X"37",X"0F",X"3A",X"00",X"4E",X"FE", + X"03",X"28",X"06",X"EF",X"1C",X"05",X"EF",X"1D",X"00",X"F7",X"54",X"00",X"00",X"3A",X"00",X"4E", + X"3D",X"28",X"04",X"F7",X"54",X"06",X"00",X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"32", + X"03",X"50",X"C3",X"F1",X"0A",X"3E",X"03",X"32",X"04",X"4E",X"C9",X"F7",X"54",X"00",X"00",X"21", + X"04",X"4E",X"34",X"AF",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"C9",X"0E",X"02",X"06",X"01",X"CD", + X"42",X"00",X"F7",X"42",X"00",X"00",X"21",X"00",X"00",X"CD",X"68",X"24",X"21",X"04",X"4E",X"34", + X"C9",X"0E",X"00",X"18",X"E8",X"18",X"E4",X"18",X"F8",X"18",X"E0",X"18",X"F4",X"18",X"DC",X"18", + X"F0",X"EF",X"00",X"01",X"EF",X"06",X"00",X"EF",X"11",X"00",X"EF",X"13",X"00",X"EF",X"04",X"01", + X"EF",X"05",X"01",X"EF",X"10",X"13",X"F7",X"43",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"AF", + X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"3A",X"13",X"4E",X"FE",X"14",X"38",X"02",X"3E",X"14",X"E7", + X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"0A",X"0D", + X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"0A",X"0D", + X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"0A",X"0D",X"21",X"04",X"4E",X"34",X"34",X"AF", + X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"C9",X"AF",X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"06",X"07", + X"21",X"0C",X"4E",X"CF",X"CD",X"B5",X"22",X"21",X"04",X"4E",X"34",X"21",X"13",X"4E",X"34",X"2A", + X"0A",X"4E",X"7E",X"FE",X"14",X"C8",X"23",X"22",X"0A",X"4E",X"C9",X"C3",X"22",X"0C",X"C3",X"75", + X"0C",X"06",X"2E",X"DD",X"21",X"0A",X"4E",X"FD",X"21",X"38",X"4E",X"DD",X"56",X"00",X"FD",X"5E", + X"00",X"FD",X"72",X"00",X"DD",X"73",X"00",X"DD",X"23",X"FD",X"23",X"10",X"EE",X"C9",X"3A",X"A4", + X"4D",X"A7",X"C0",X"DD",X"21",X"00",X"4C",X"FD",X"21",X"C8",X"4D",X"11",X"00",X"01",X"FD",X"BE", + X"00",X"C2",X"B8",X"0E",X"FD",X"36",X"00",X"0E",X"3A",X"A6",X"4D",X"A7",X"28",X"26",X"2A",X"CB", + X"4D",X"A7",X"ED",X"52",X"30",X"1E",X"21",X"AC",X"4E",X"CB",X"FE",X"3E",X"09",X"DD",X"BE",X"0B", + X"20",X"02",X"CB",X"BE",X"3A",X"D2",X"4F",X"CB",X"47",X"28",X"04",X"3E",X"05",X"18",X"02",X"3E", + X"09",X"32",X"0B",X"4C",X"3A",X"A7",X"4D",X"A7",X"28",X"2D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52", + X"30",X"37",X"3E",X"11",X"DD",X"BE",X"03",X"28",X"0F",X"3A",X"70",X"4C",X"FE",X"03",X"CA",X"E9", + X"0D",X"DD",X"36",X"03",X"11",X"C3",X"E9",X"0D",X"3A",X"70",X"4C",X"FE",X"03",X"CA",X"E9",X"0D", + X"DD",X"36",X"03",X"12",X"C3",X"E9",X"0D",X"3E",X"01",X"DD",X"BE",X"03",X"28",X"07",X"DD",X"36", + X"03",X"01",X"C3",X"E9",X"0D",X"DD",X"36",X"03",X"01",X"3A",X"A8",X"4D",X"A7",X"28",X"2D",X"2A", + X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"37",X"3E",X"11",X"DD",X"BE",X"05",X"28",X"0F",X"3A",X"70", + X"4C",X"FE",X"03",X"CA",X"2E",X"0E",X"DD",X"36",X"05",X"11",X"C3",X"2E",X"0E",X"3A",X"70",X"4C", + X"FE",X"03",X"CA",X"2E",X"0E",X"DD",X"36",X"05",X"12",X"C3",X"2E",X"0E",X"3E",X"03",X"DD",X"BE", + X"05",X"28",X"07",X"DD",X"36",X"05",X"03",X"C3",X"2E",X"0E",X"DD",X"36",X"05",X"03",X"3A",X"A9", + X"4D",X"A7",X"28",X"2D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"37",X"3E",X"11",X"DD",X"BE", + X"07",X"28",X"0F",X"3A",X"70",X"4C",X"FE",X"03",X"CA",X"73",X"0E",X"DD",X"36",X"07",X"11",X"C3", + X"73",X"0E",X"3A",X"70",X"4C",X"FE",X"03",X"CA",X"73",X"0E",X"DD",X"36",X"07",X"12",X"C3",X"73", + X"0E",X"3E",X"05",X"DD",X"BE",X"07",X"28",X"07",X"DD",X"36",X"07",X"05",X"C3",X"73",X"0E",X"DD", + X"36",X"07",X"05",X"3A",X"AA",X"4D",X"A7",X"28",X"2D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30", + X"37",X"3E",X"11",X"DD",X"BE",X"09",X"28",X"0F",X"3A",X"70",X"4C",X"FE",X"03",X"CA",X"B8",X"0E", + X"DD",X"36",X"09",X"11",X"C3",X"B8",X"0E",X"3A",X"70",X"4C",X"FE",X"03",X"CA",X"B8",X"0E",X"DD", + X"36",X"09",X"12",X"C3",X"B8",X"0E",X"3E",X"07",X"DD",X"BE",X"09",X"28",X"07",X"DD",X"36",X"09", + X"07",X"C3",X"B8",X"0E",X"DD",X"36",X"09",X"07",X"FD",X"35",X"00",X"C9",X"06",X"19",X"3A",X"02", + X"4E",X"FE",X"27",X"C2",X"C8",X"0E",X"06",X"00",X"DD",X"21",X"00",X"4C",X"3A",X"AC",X"4D",X"A7", + X"CA",X"D6",X"0E",X"DD",X"70",X"03",X"3A",X"AD",X"4D",X"A7",X"CA",X"E0",X"0E",X"DD",X"70",X"05", + X"3A",X"AE",X"4D",X"A7",X"CA",X"EA",X"0E",X"DD",X"70",X"07",X"3A",X"AF",X"4D",X"A7",X"C8",X"DD", + X"70",X"09",X"C9",X"3A",X"70",X"4C",X"FE",X"03",X"C8",X"21",X"CF",X"4D",X"34",X"3E",X"0A",X"BE", + X"C0",X"36",X"00",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"06",X"21",X"64",X"44",X"C3",X"3D",X"95", + X"21",X"32",X"47",X"3E",X"10",X"BE",X"20",X"02",X"3E",X"00",X"77",X"32",X"78",X"46",X"C9",X"3A", + X"A4",X"4D",X"A7",X"C0",X"3A",X"94",X"4D",X"07",X"32",X"94",X"4D",X"D0",X"3A",X"A0",X"4D",X"A7", + X"C2",X"6D",X"0F",X"DD",X"21",X"8B",X"32",X"FD",X"21",X"00",X"4D",X"CD",X"CD",X"1E",X"22",X"00", + X"4D",X"3E",X"03",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3A",X"00",X"4D",X"FE",X"64",X"C2",X"6D", + X"0F",X"21",X"2C",X"2E",X"22",X"0A",X"4D",X"21",X"00",X"01",X"22",X"14",X"4D",X"22",X"1E",X"4D", + X"3E",X"02",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3E",X"01",X"32",X"A0",X"4D",X"3A",X"A1",X"4D", + X"FE",X"01",X"CA",X"D8",X"0F",X"FE",X"00",X"C2",X"9E",X"0F",X"3A",X"02",X"4D",X"FE",X"78",X"CC", + X"AD",X"2E",X"FE",X"80",X"CC",X"AD",X"2E",X"3A",X"2D",X"4D",X"32",X"29",X"4D",X"DD",X"21",X"20", + X"4D",X"FD",X"21",X"02",X"4D",X"CD",X"CD",X"1E",X"22",X"02",X"4D",X"C3",X"D8",X"0F",X"DD",X"21", + X"8B",X"32",X"FD",X"21",X"02",X"4D",X"CD",X"CD",X"1E",X"22",X"02",X"4D",X"3E",X"03",X"32",X"2D", + X"4D",X"32",X"29",X"4D",X"3A",X"02",X"4D",X"FE",X"64",X"C2",X"D8",X"0F",X"21",X"2C",X"2E",X"22", + X"0C",X"4D",X"21",X"00",X"01",X"22",X"16",X"4D",X"22",X"20",X"4D",X"3E",X"02",X"32",X"29",X"4D", + X"32",X"2D",X"4D",X"3E",X"01",X"32",X"A1",X"4D",X"3A",X"A2",X"4D",X"FE",X"01",X"CA",X"70",X"10", + X"FE",X"00",X"C2",X"09",X"10",X"3A",X"04",X"4D",X"FE",X"78",X"CC",X"D4",X"2E",X"FE",X"80",X"CC", + X"D4",X"2E",X"3A",X"2E",X"4D",X"32",X"2A",X"4D",X"DD",X"21",X"22",X"4D",X"FD",X"21",X"04",X"4D", + X"CD",X"CD",X"1E",X"22",X"04",X"4D",X"C3",X"70",X"10",X"3A",X"A2",X"4D",X"FE",X"03",X"C2",X"36", + X"10",X"DD",X"21",X"85",X"32",X"FD",X"21",X"04",X"4D",X"CD",X"CD",X"1E",X"22",X"04",X"4D",X"AF", + X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3A",X"05",X"4D",X"FE",X"80",X"C2",X"70",X"10",X"3E",X"02", + X"32",X"A2",X"4D",X"C3",X"70",X"10",X"DD",X"21",X"8B",X"32",X"FD",X"21",X"04",X"4D",X"CD",X"CD", + X"1E",X"22",X"04",X"4D",X"3E",X"03",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3A",X"04",X"4D",X"FE", + X"64",X"C2",X"70",X"10",X"21",X"2C",X"2E",X"22",X"0E",X"4D",X"21",X"00",X"01",X"22",X"18",X"4D", + X"22",X"22",X"4D",X"3E",X"02",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3E",X"01",X"32",X"A2",X"4D", + X"3A",X"A3",X"4D",X"FE",X"01",X"C8",X"FE",X"00",X"C2",X"9D",X"10",X"3A",X"06",X"4D",X"FE",X"78", + X"CC",X"FB",X"2E",X"FE",X"80",X"CC",X"FB",X"2E",X"3A",X"2F",X"4D",X"32",X"2B",X"4D",X"DD",X"21", + X"24",X"4D",X"FD",X"21",X"06",X"4D",X"CD",X"CD",X"1E",X"22",X"06",X"4D",X"C9",X"3A",X"A3",X"4D", + X"FE",X"03",X"C2",X"C7",X"10",X"DD",X"21",X"89",X"32",X"FD",X"21",X"06",X"4D",X"CD",X"CD",X"1E", + X"22",X"06",X"4D",X"3E",X"02",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3A",X"07",X"4D",X"FE",X"80", + X"C0",X"3E",X"02",X"32",X"A3",X"4D",X"C9",X"DD",X"21",X"8B",X"32",X"FD",X"21",X"06",X"4D",X"CD", + X"CD",X"1E",X"22",X"06",X"4D",X"3E",X"03",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3A",X"06",X"4D", + X"FE",X"64",X"C0",X"21",X"2C",X"2E",X"22",X"10",X"4D",X"21",X"00",X"01",X"22",X"1A",X"4D",X"22", + X"24",X"4D",X"3E",X"02",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3E",X"01",X"32",X"A3",X"4D",X"C9", + X"21",X"C4",X"4D",X"34",X"3E",X"08",X"BE",X"C0",X"36",X"00",X"3A",X"70",X"4C",X"FE",X"03",X"C8", + X"3A",X"C0",X"4D",X"EE",X"01",X"32",X"C0",X"4D",X"C9",X"3A",X"A6",X"4D",X"A7",X"C0",X"3A",X"C1", + X"4D",X"FE",X"07",X"C8",X"87",X"2A",X"C2",X"4D",X"23",X"22",X"C2",X"4D",X"5F",X"16",X"00",X"DD", + X"21",X"86",X"4D",X"DD",X"19",X"DD",X"5E",X"00",X"DD",X"56",X"01",X"A7",X"ED",X"52",X"C0",X"AF", + X"3C",X"32",X"C1",X"4D",X"21",X"01",X"01",X"22",X"B1",X"4D",X"22",X"B3",X"4D",X"C9",X"3A",X"A5", + X"4D",X"A7",X"28",X"05",X"AF",X"32",X"AC",X"4E",X"C9",X"21",X"AC",X"4E",X"06",X"E0",X"3A",X"0E", + X"4E",X"FE",X"E4",X"38",X"06",X"78",X"A6",X"CB",X"E7",X"77",X"C9",X"FE",X"D4",X"38",X"06",X"78", + X"A6",X"CB",X"DF",X"77",X"C9",X"FE",X"B4",X"38",X"06",X"78",X"A6",X"CB",X"D7",X"77",X"C9",X"FE", + X"74",X"38",X"06",X"78",X"A6",X"CB",X"CF",X"77",X"C9",X"78",X"A6",X"CB",X"C7",X"77",X"C9",X"3A", + X"70",X"4C",X"FE",X"03",X"C8",X"FE",X"02",X"CC",X"79",X"85",X"CD",X"A0",X"11",X"C3",X"79",X"85", + X"3A",X"0E",X"4E",X"FE",X"A0",X"D8",X"3A",X"70",X"4C",X"FE",X"02",X"CC",X"79",X"85",X"C9",X"AF", + X"32",X"D4",X"4D",X"C9",X"C3",X"D7",X"35",X"CD",X"B1",X"14",X"3A",X"A5",X"4D",X"A7",X"C0",X"CD", + X"58",X"12",X"CD",X"86",X"12",X"CD",X"96",X"12",X"CD",X"A6",X"12",X"CD",X"B8",X"12",X"3A",X"A4", + X"4D",X"A7",X"CA",X"D9",X"11",X"CD",X"3F",X"14",X"C9",X"CD",X"96",X"19",X"CD",X"02",X"1A",X"3A", + X"A4",X"4D",X"A7",X"C0",X"CD",X"7F",X"1A",X"3A",X"70",X"4C",X"A7",X"28",X"27",X"3A",X"70",X"4C", + X"FE",X"01",X"28",X"20",X"3A",X"72",X"4C",X"A7",X"28",X"1A",X"CD",X"7F",X"1A",X"CD",X"2E",X"A3", + X"3A",X"13",X"4E",X"FE",X"05",X"38",X"0D",X"CD",X"F1",X"A5",X"3A",X"13",X"4E",X"FE",X"10",X"38", + X"03",X"CD",X"1A",X"A5",X"CD",X"2E",X"A3",X"CD",X"43",X"A4",X"CD",X"1A",X"A5",X"CD",X"F1",X"A5", + X"3A",X"13",X"4E",X"FE",X"08",X"38",X"1E",X"CD",X"F1",X"A5",X"3A",X"70",X"4C",X"FE",X"03",X"20", + X"14",X"3A",X"13",X"4E",X"FE",X"0B",X"38",X"0D",X"CD",X"1A",X"A5",X"3A",X"0E",X"4E",X"FE",X"A0", + X"38",X"03",X"CD",X"2E",X"A3",X"3A",X"04",X"4E",X"FE",X"03",X"C0",X"CD",X"A2",X"15",X"CD",X"33", + X"1F",X"CD",X"56",X"1F",X"CD",X"79",X"1F",X"C9",X"3A",X"AB",X"4D",X"A7",X"C8",X"3D",X"20",X"08", + X"32",X"AB",X"4D",X"3C",X"32",X"AC",X"4D",X"C9",X"3D",X"20",X"08",X"32",X"AB",X"4D",X"3C",X"32", + X"AD",X"4D",X"C9",X"3D",X"20",X"08",X"32",X"AB",X"4D",X"3C",X"32",X"AE",X"4D",X"C9",X"32",X"AF", + X"4D",X"3D",X"32",X"AB",X"4D",X"C9",X"3A",X"AC",X"4D",X"E6",X"03",X"E7",X"0C",X"00",X"CA",X"12", + X"DC",X"12",X"80",X"67",X"90",X"68",X"3A",X"AD",X"4D",X"E6",X"03",X"E7",X"0C",X"00",X"22",X"13", + X"34",X"13",X"80",X"67",X"90",X"68",X"3A",X"AE",X"4D",X"E6",X"03",X"E7",X"0C",X"00",X"66",X"13", + X"78",X"13",X"99",X"13",X"00",X"60",X"00",X"67",X"3A",X"AF",X"4D",X"E6",X"03",X"E7",X"0C",X"00", + X"D3",X"13",X"E5",X"13",X"06",X"14",X"A0",X"67",X"A0",X"67",X"CD",X"D0",X"A3",X"2A",X"00",X"4D", + X"11",X"64",X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AC",X"4D",X"34",X"C9",X"DD",X"21",X"87",X"32", + X"FD",X"21",X"00",X"4D",X"CD",X"CD",X"1E",X"22",X"00",X"4D",X"3E",X"01",X"32",X"28",X"4D",X"32", + X"2C",X"4D",X"3A",X"00",X"4D",X"FE",X"80",X"C0",X"21",X"2F",X"2E",X"22",X"0A",X"4D",X"22",X"31", + X"4D",X"AF",X"32",X"A0",X"4D",X"32",X"AC",X"4D",X"32",X"A7",X"4D",X"DD",X"21",X"AC",X"4D",X"DD", + X"B6",X"00",X"DD",X"B6",X"01",X"DD",X"B6",X"02",X"DD",X"B6",X"03",X"C0",X"21",X"AC",X"4E",X"CB", + X"B6",X"C9",X"CD",X"A7",X"A4",X"2A",X"02",X"4D",X"11",X"64",X"80",X"A7",X"ED",X"52",X"C0",X"21", + X"AD",X"4D",X"34",X"C9",X"DD",X"21",X"87",X"32",X"FD",X"21",X"02",X"4D",X"CD",X"CD",X"1E",X"22", + X"02",X"4D",X"3E",X"01",X"32",X"29",X"4D",X"32",X"2D",X"4D",X"3A",X"02",X"4D",X"FE",X"80",X"C0", + X"21",X"2F",X"2E",X"22",X"0C",X"4D",X"22",X"33",X"4D",X"AF",X"32",X"A1",X"4D",X"32",X"AD",X"4D", + X"32",X"A8",X"4D",X"C3",X"0B",X"13",X"CD",X"7E",X"A5",X"2A",X"04",X"4D",X"11",X"64",X"80",X"A7", + X"ED",X"52",X"C0",X"21",X"AE",X"4D",X"34",X"C9",X"DD",X"21",X"87",X"32",X"FD",X"21",X"04",X"4D", + X"CD",X"CD",X"1E",X"22",X"04",X"4D",X"3E",X"01",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3A",X"04", + X"4D",X"FE",X"80",X"C0",X"21",X"AE",X"4D",X"34",X"C9",X"DD",X"21",X"89",X"32",X"FD",X"21",X"04", + X"4D",X"CD",X"CD",X"1E",X"22",X"04",X"4D",X"3E",X"02",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3A", + X"05",X"4D",X"FE",X"90",X"C0",X"21",X"2F",X"30",X"22",X"0E",X"4D",X"22",X"35",X"4D",X"3E",X"01", + X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"AF",X"32",X"A2",X"4D",X"32",X"AE",X"4D",X"32",X"A9",X"4D", + X"C3",X"0B",X"13",X"CD",X"55",X"A6",X"2A",X"06",X"4D",X"11",X"64",X"80",X"A7",X"ED",X"52",X"C0", + X"21",X"AF",X"4D",X"34",X"C9",X"DD",X"21",X"87",X"32",X"FD",X"21",X"06",X"4D",X"CD",X"CD",X"1E", + X"22",X"06",X"4D",X"3E",X"01",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3A",X"06",X"4D",X"FE",X"80", + X"C0",X"21",X"AF",X"4D",X"34",X"C9",X"DD",X"21",X"85",X"32",X"FD",X"21",X"06",X"4D",X"CD",X"CD", + X"1E",X"22",X"06",X"4D",X"AF",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3A",X"07",X"4D",X"FE",X"70", + X"C0",X"21",X"2F",X"2C",X"22",X"10",X"4D",X"22",X"37",X"4D",X"3E",X"01",X"32",X"2B",X"4D",X"32", + X"2F",X"4D",X"AF",X"32",X"A3",X"4D",X"32",X"AF",X"4D",X"32",X"AA",X"4D",X"C3",X"0B",X"13",X"3A", + X"D1",X"4D",X"E6",X"03",X"E7",X"4D",X"14",X"0C",X"00",X"4D",X"14",X"0C",X"00",X"21",X"00",X"4C", + X"3A",X"A4",X"4D",X"87",X"5F",X"16",X"00",X"19",X"3A",X"D1",X"4D",X"A7",X"20",X"2E",X"3A",X"D0", + X"4D",X"06",X"27",X"80",X"47",X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E",X"A1",X"28",X"04",X"CB", + X"F0",X"CB",X"F8",X"70",X"23",X"36",X"18",X"3A",X"70",X"4C",X"FE",X"03",X"28",X"02",X"3E",X"00", + X"32",X"0B",X"4C",X"F7",X"4A",X"03",X"00",X"21",X"D1",X"4D",X"34",X"C9",X"36",X"20",X"3A",X"D2", + X"4F",X"CB",X"47",X"20",X"04",X"3E",X"09",X"18",X"02",X"3E",X"05",X"32",X"0B",X"4C",X"3A",X"A4", + X"4D",X"32",X"AB",X"4D",X"AF",X"32",X"A4",X"4D",X"32",X"D1",X"4D",X"21",X"AC",X"4E",X"CB",X"F6", + X"C9",X"3A",X"A5",X"4D",X"E7",X"0C",X"00",X"E3",X"14",X"E3",X"14",X"E3",X"14",X"E3",X"14",X"F7", + X"14",X"25",X"15",X"32",X"15",X"3A",X"15",X"42",X"15",X"4A",X"15",X"52",X"15",X"5A",X"15",X"62", + X"15",X"6A",X"15",X"72",X"15",X"7F",X"15",X"50",X"65",X"50",X"65",X"80",X"67",X"80",X"67",X"50", + X"65",X"80",X"67",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D",X"11",X"78",X"00",X"A7",X"ED",X"52", + X"C0",X"3E",X"05",X"32",X"A5",X"4D",X"C9",X"21",X"00",X"00",X"CD",X"68",X"24",X"3E",X"34",X"11", + X"B4",X"00",X"4F",X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"28",X"04",X"3E",X"C0",X"B1", + X"4F",X"79",X"32",X"0A",X"4C",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D",X"A7",X"ED",X"52",X"C0", + X"21",X"A5",X"4D",X"34",X"C9",X"21",X"BC",X"4E",X"CB",X"E6",X"3E",X"35",X"11",X"C3",X"00",X"C3", + X"02",X"15",X"3E",X"36",X"11",X"D2",X"00",X"C3",X"02",X"15",X"3E",X"37",X"11",X"E1",X"00",X"C3", + X"02",X"15",X"3E",X"38",X"11",X"F0",X"00",X"C3",X"02",X"15",X"3E",X"39",X"11",X"FF",X"00",X"C3", + X"02",X"15",X"3E",X"3A",X"11",X"0E",X"01",X"C3",X"02",X"15",X"3E",X"3B",X"11",X"1D",X"01",X"C3", + X"02",X"15",X"3E",X"3C",X"11",X"2C",X"01",X"C3",X"02",X"15",X"3E",X"3D",X"11",X"3B",X"01",X"C3", + X"02",X"15",X"21",X"BC",X"4E",X"36",X"00",X"3E",X"3E",X"11",X"59",X"01",X"C3",X"02",X"15",X"3E", + X"3F",X"32",X"0A",X"4C",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D",X"11",X"B8",X"01",X"A7",X"ED", + X"52",X"C0",X"21",X"14",X"4E",X"35",X"21",X"15",X"4E",X"35",X"CD",X"5F",X"24",X"21",X"04",X"4E", + X"34",X"C9",X"3A",X"A6",X"4D",X"A7",X"C8",X"DD",X"21",X"A7",X"4D",X"DD",X"7E",X"00",X"DD",X"B6", + X"01",X"DD",X"B6",X"02",X"DD",X"B6",X"03",X"CA",X"C4",X"15",X"2A",X"CB",X"4D",X"2B",X"22",X"CB", + X"4D",X"7C",X"B5",X"C0",X"21",X"0B",X"4C",X"3A",X"D2",X"4F",X"CB",X"47",X"20",X"04",X"36",X"09", + X"18",X"02",X"36",X"05",X"3A",X"AC",X"4D",X"A7",X"C2",X"DE",X"15",X"32",X"A7",X"4D",X"3A",X"AD", + X"4D",X"A7",X"C2",X"E8",X"15",X"32",X"A8",X"4D",X"3A",X"AE",X"4D",X"A7",X"C2",X"F2",X"15",X"32", + X"A9",X"4D",X"3A",X"AF",X"4D",X"A7",X"C2",X"FC",X"15",X"32",X"AA",X"4D",X"AF",X"32",X"CB",X"4D", + X"32",X"CC",X"4D",X"32",X"A6",X"4D",X"32",X"C8",X"4D",X"32",X"D0",X"4D",X"21",X"AC",X"4E",X"CB", + X"AE",X"CB",X"BE",X"C9",X"21",X"9E",X"4D",X"3A",X"0E",X"4E",X"BE",X"CA",X"25",X"16",X"21",X"00", + X"00",X"22",X"97",X"4D",X"C9",X"2A",X"97",X"4D",X"23",X"22",X"97",X"4D",X"ED",X"5B",X"95",X"4D", + X"A7",X"ED",X"52",X"C0",X"21",X"00",X"00",X"22",X"97",X"4D",X"3A",X"A1",X"4D",X"A7",X"F5",X"CC", + X"50",X"1F",X"F1",X"C8",X"3A",X"A2",X"4D",X"A7",X"F5",X"CC",X"73",X"1F",X"F1",X"C8",X"3A",X"A3", + X"4D",X"A7",X"CC",X"9B",X"1F",X"C9",X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"C8",X"47", + X"DD",X"21",X"00",X"4C",X"1E",X"08",X"0E",X"08",X"16",X"07",X"3A",X"00",X"4D",X"83",X"DD",X"77", + X"13",X"3A",X"01",X"4D",X"2F",X"82",X"DD",X"77",X"12",X"3A",X"02",X"4D",X"83",X"DD",X"77",X"15", + X"3A",X"03",X"4D",X"2F",X"82",X"DD",X"77",X"14",X"3A",X"04",X"4D",X"83",X"DD",X"77",X"17",X"3A", + X"05",X"4D",X"2F",X"81",X"DD",X"77",X"16",X"3A",X"06",X"4D",X"83",X"DD",X"77",X"19",X"3A",X"07", + X"4D",X"2F",X"81",X"DD",X"77",X"18",X"3A",X"08",X"4D",X"83",X"DD",X"77",X"1B",X"3A",X"09",X"4D", + X"2F",X"81",X"DD",X"77",X"1A",X"3A",X"D2",X"4D",X"83",X"DD",X"77",X"1D",X"3A",X"D3",X"4D",X"2F", + X"81",X"DD",X"77",X"1C",X"C3",X"35",X"17",X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"C0", + X"47",X"1E",X"09",X"0E",X"07",X"16",X"06",X"DD",X"21",X"00",X"4C",X"3A",X"00",X"4D",X"2F",X"83", + X"DD",X"77",X"13",X"3A",X"01",X"4D",X"82",X"DD",X"77",X"12",X"3A",X"02",X"4D",X"2F",X"83",X"DD", + X"77",X"15",X"3A",X"03",X"4D",X"82",X"DD",X"77",X"14",X"3A",X"04",X"4D",X"2F",X"83",X"DD",X"77", + X"17",X"3A",X"05",X"4D",X"81",X"DD",X"77",X"16",X"3A",X"06",X"4D",X"2F",X"83",X"DD",X"77",X"19", + X"3A",X"07",X"4D",X"81",X"DD",X"77",X"18",X"3A",X"08",X"4D",X"2F",X"83",X"DD",X"77",X"1B",X"3A", + X"09",X"4D",X"81",X"DD",X"77",X"1A",X"3A",X"D2",X"4D",X"2F",X"83",X"DD",X"77",X"1D",X"3A",X"D3", + X"4D",X"81",X"DD",X"77",X"1C",X"3A",X"A5",X"4D",X"A7",X"C2",X"94",X"17",X"3A",X"A4",X"4D",X"A7", + X"C2",X"07",X"18",X"21",X"65",X"17",X"E5",X"3A",X"30",X"4D",X"E6",X"03",X"E7",X"E6",X"18",X"00", + X"19",X"1A",X"19",X"38",X"19",X"F0",X"6A",X"F0",X"6A",X"F0",X"6A",X"F0",X"6A",X"F0",X"6A",X"F0", + X"6A",X"F0",X"6A",X"F0",X"6A",X"78",X"A7",X"28",X"2B",X"0E",X"C0",X"3A",X"0A",X"4C",X"57",X"A1", + X"20",X"05",X"7A",X"B1",X"C3",X"91",X"17",X"3A",X"30",X"4D",X"FE",X"02",X"20",X"09",X"CB",X"7A", + X"28",X"12",X"7A",X"A9",X"C3",X"91",X"17",X"FE",X"03",X"20",X"09",X"CB",X"72",X"28",X"05",X"7A", + X"A9",X"32",X"0A",X"4C",X"21",X"C0",X"4D",X"56",X"3E",X"1C",X"82",X"08",X"3A",X"70",X"4C",X"FE", + X"03",X"CA",X"B1",X"17",X"08",X"DD",X"77",X"02",X"DD",X"77",X"04",X"DD",X"77",X"06",X"DD",X"77", + X"08",X"0E",X"20",X"3A",X"AC",X"4D",X"A7",X"20",X"06",X"3A",X"A7",X"4D",X"A7",X"20",X"09",X"3A", + X"2C",X"4D",X"87",X"82",X"81",X"DD",X"77",X"02",X"3A",X"AD",X"4D",X"A7",X"20",X"06",X"3A",X"A8", + X"4D",X"A7",X"20",X"09",X"3A",X"2D",X"4D",X"87",X"82",X"81",X"DD",X"77",X"04",X"3A",X"AE",X"4D", + X"A7",X"20",X"06",X"3A",X"A9",X"4D",X"A7",X"20",X"09",X"3A",X"2E",X"4D",X"87",X"82",X"81",X"DD", + X"77",X"06",X"3A",X"AF",X"4D",X"A7",X"20",X"06",X"3A",X"AA",X"4D",X"A7",X"20",X"09",X"3A",X"2F", + X"4D",X"87",X"82",X"81",X"DD",X"77",X"08",X"CD",X"3F",X"18",X"CD",X"87",X"18",X"CD",X"AC",X"18", + X"78",X"A7",X"C8",X"0E",X"C0",X"3A",X"02",X"4C",X"B1",X"32",X"02",X"4C",X"3A",X"04",X"4C",X"B1", + X"32",X"04",X"4C",X"3A",X"06",X"4C",X"B1",X"32",X"06",X"4C",X"3A",X"08",X"4C",X"B1",X"32",X"08", + X"4C",X"3A",X"70",X"4C",X"FE",X"03",X"C8",X"3A",X"0C",X"4C",X"B1",X"32",X"0C",X"4C",X"C9",X"C9", + X"3A",X"06",X"4E",X"D6",X"05",X"D8",X"3A",X"09",X"4D",X"E6",X"0F",X"FE",X"0C",X"38",X"04",X"16", + X"18",X"18",X"12",X"FE",X"08",X"38",X"04",X"16",X"14",X"18",X"0A",X"FE",X"04",X"38",X"04",X"16", + X"10",X"18",X"02",X"16",X"14",X"DD",X"72",X"04",X"14",X"DD",X"72",X"06",X"14",X"DD",X"72",X"08", + X"14",X"DD",X"72",X"0C",X"DD",X"36",X"0A",X"3F",X"16",X"16",X"DD",X"72",X"05",X"DD",X"72",X"07", + X"DD",X"72",X"09",X"DD",X"72",X"0D",X"C9",X"3A",X"07",X"4E",X"A7",X"C8",X"57",X"3A",X"3A",X"4D", + X"D6",X"3D",X"20",X"04",X"DD",X"36",X"0B",X"00",X"7A",X"FE",X"0A",X"D8",X"DD",X"36",X"02",X"32", + X"DD",X"36",X"03",X"1D",X"FE",X"0C",X"D8",X"DD",X"36",X"02",X"33",X"C9",X"3A",X"08",X"4E",X"A7", + X"C8",X"57",X"3A",X"3A",X"4D",X"D6",X"3D",X"20",X"04",X"DD",X"36",X"0B",X"00",X"7A",X"FE",X"01", + X"D8",X"3A",X"C0",X"4D",X"1E",X"08",X"83",X"DD",X"77",X"02",X"7A",X"FE",X"03",X"D8",X"3A",X"01", + X"4D",X"E6",X"08",X"0F",X"0F",X"0F",X"1E",X"0A",X"83",X"DD",X"77",X"0C",X"3C",X"3C",X"DD",X"77", + X"02",X"DD",X"36",X"0D",X"1F",X"C9",X"C3",X"1D",X"85",X"FE",X"04",X"38",X"05",X"DD",X"36",X"0A", + X"2E",X"C9",X"FE",X"02",X"38",X"05",X"DD",X"36",X"0A",X"2C",X"C9",X"DD",X"36",X"0A",X"2E",X"C9", + X"C3",X"32",X"85",X"FE",X"04",X"38",X"05",X"DD",X"36",X"0A",X"2D",X"C9",X"FE",X"02",X"38",X"05", + X"DD",X"36",X"0A",X"2F",X"C9",X"DD",X"36",X"0A",X"30",X"C9",X"3A",X"09",X"4D",X"C3",X"46",X"85", + X"1E",X"2E",X"CB",X"FB",X"DD",X"73",X"0A",X"C9",X"FE",X"04",X"38",X"04",X"1E",X"2C",X"18",X"F2", + X"FE",X"02",X"30",X"EC",X"1E",X"30",X"18",X"EA",X"3A",X"08",X"4D",X"C3",X"5A",X"85",X"FE",X"04", + X"38",X"08",X"1E",X"2F",X"CB",X"F3",X"DD",X"73",X"0A",X"C9",X"FE",X"02",X"38",X"44",X"1E",X"2D", + X"18",X"F2",X"3A",X"70",X"4C",X"FE",X"02",X"28",X"08",X"FE",X"03",X"28",X"04",X"F1",X"F1",X"18", + X"7B",X"F5",X"E5",X"D5",X"C5",X"21",X"64",X"80",X"22",X"08",X"4D",X"21",X"2C",X"2E",X"22",X"12", + X"4D",X"22",X"39",X"4D",X"21",X"00",X"01",X"22",X"1C",X"4D",X"22",X"26",X"4D",X"3E",X"00",X"32", + X"72",X"4C",X"3E",X"02",X"32",X"30",X"4D",X"32",X"3C",X"4D",X"CD",X"65",X"1D",X"C1",X"D1",X"E1", + X"F1",X"C9",X"1E",X"2F",X"18",X"AE",X"06",X"04",X"ED",X"5B",X"39",X"4D",X"3A",X"AF",X"4D",X"A7", + X"20",X"09",X"2A",X"37",X"4D",X"A7",X"ED",X"52",X"CA",X"DC",X"19",X"05",X"3A",X"AE",X"4D",X"A7", + X"20",X"09",X"2A",X"35",X"4D",X"A7",X"ED",X"52",X"CA",X"DC",X"19",X"05",X"3A",X"AD",X"4D",X"A7", + X"20",X"09",X"2A",X"33",X"4D",X"A7",X"ED",X"52",X"CA",X"DC",X"19",X"05",X"3A",X"AC",X"4D",X"A7", + X"20",X"09",X"2A",X"31",X"4D",X"A7",X"ED",X"52",X"CC",X"52",X"19",X"05",X"78",X"32",X"A4",X"4D", + X"32",X"A5",X"4D",X"A7",X"C8",X"21",X"A6",X"4D",X"5F",X"16",X"00",X"19",X"7E",X"A7",X"C8",X"AF", + X"32",X"A5",X"4D",X"21",X"D0",X"4D",X"34",X"46",X"04",X"CD",X"90",X"28",X"21",X"BC",X"4E",X"CB", + X"DE",X"C9",X"3A",X"A4",X"4D",X"A7",X"C0",X"3A",X"A6",X"4D",X"A7",X"C8",X"0E",X"04",X"06",X"04", + X"DD",X"21",X"08",X"4D",X"3A",X"AF",X"4D",X"A7",X"20",X"13",X"3A",X"06",X"4D",X"DD",X"96",X"00", + X"B9",X"30",X"0A",X"3A",X"07",X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"DC",X"19",X"05",X"3A",X"AE", + X"4D",X"A7",X"20",X"13",X"3A",X"04",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"05",X"4D", + X"DD",X"96",X"01",X"B9",X"DA",X"DC",X"19",X"05",X"3A",X"AD",X"4D",X"A7",X"20",X"13",X"3A",X"02", + X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"03",X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"DC", + X"19",X"05",X"3A",X"AC",X"4D",X"A7",X"20",X"13",X"3A",X"00",X"4D",X"DD",X"96",X"00",X"B9",X"30", + X"0A",X"3A",X"01",X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"DC",X"19",X"05",X"C3",X"DC",X"19",X"3A", + X"70",X"4C",X"FE",X"01",X"28",X"45",X"FE",X"02",X"28",X"41",X"FE",X"03",X"28",X"3D",X"21",X"9D", + X"4D",X"3E",X"FF",X"BE",X"CA",X"99",X"1A",X"35",X"C9",X"3A",X"A6",X"4D",X"A7",X"CA",X"B7",X"1A", + X"2A",X"4C",X"4D",X"29",X"22",X"4C",X"4D",X"2A",X"4A",X"4D",X"ED",X"6A",X"22",X"4A",X"4D",X"D0", + X"21",X"4C",X"4D",X"34",X"C3",X"CB",X"1A",X"2A",X"48",X"4D",X"29",X"22",X"48",X"4D",X"2A",X"46", + X"4D",X"ED",X"6A",X"22",X"46",X"4D",X"D0",X"21",X"48",X"4D",X"34",X"3A",X"0E",X"4E",X"32",X"9E", + X"4D",X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E",X"A1",X"4F",X"21",X"3A",X"4D",X"7E",X"06",X"21", + X"90",X"38",X"09",X"7E",X"06",X"3B",X"90",X"30",X"03",X"C3",X"33",X"1B",X"3E",X"01",X"32",X"BF", + X"4D",X"3A",X"00",X"4E",X"FE",X"01",X"CA",X"A8",X"1D",X"3A",X"04",X"4E",X"FE",X"10",X"D2",X"A8", + X"1D",X"79",X"A7",X"28",X"06",X"3A",X"40",X"50",X"C3",X"0E",X"1B",X"3A",X"00",X"50",X"CB",X"4F", + X"C2",X"21",X"1B",X"2A",X"89",X"32",X"3E",X"02",X"32",X"30",X"4D",X"22",X"1C",X"4D",X"C3",X"D8", + X"1B",X"CB",X"57",X"C2",X"D8",X"1B",X"2A",X"85",X"32",X"AF",X"32",X"30",X"4D",X"22",X"1C",X"4D", + X"C3",X"D8",X"1B",X"3A",X"00",X"4E",X"FE",X"01",X"CA",X"A8",X"1D",X"3A",X"04",X"4E",X"FE",X"10", + X"D2",X"A8",X"1D",X"79",X"A7",X"28",X"06",X"3A",X"40",X"50",X"C3",X"50",X"1B",X"3A",X"00",X"50", + X"CB",X"4F",X"CA",X"60",X"1E",X"CB",X"57",X"CA",X"70",X"1E",X"CB",X"47",X"CA",X"7F",X"1E",X"CB", + X"5F",X"CA",X"8F",X"1E",X"2A",X"1C",X"4D",X"22",X"26",X"4D",X"06",X"01",X"DD",X"21",X"26",X"4D", + X"FD",X"21",X"39",X"4D",X"CD",X"DC",X"1E",X"E6",X"C0",X"D6",X"C0",X"20",X"4B",X"05",X"C2",X"9E", + X"1B",X"3A",X"30",X"4D",X"0F",X"DA",X"93",X"1B",X"3A",X"09",X"4D",X"E6",X"07",X"FE",X"04",X"C8", + X"C3",X"C8",X"1B",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"04",X"C8",X"C3",X"C8",X"1B",X"DD",X"21", + X"1C",X"4D",X"CD",X"DC",X"1E",X"E6",X"C0",X"D6",X"C0",X"20",X"2D",X"3A",X"30",X"4D",X"0F",X"DA", + X"BD",X"1B",X"3A",X"09",X"4D",X"E6",X"07",X"FE",X"04",X"C8",X"C3",X"D8",X"1B",X"3A",X"08",X"4D", + X"E6",X"07",X"FE",X"04",X"C8",X"C3",X"D8",X"1B",X"2A",X"26",X"4D",X"22",X"1C",X"4D",X"05",X"CA", + X"D8",X"1B",X"3A",X"3C",X"4D",X"32",X"30",X"4D",X"DD",X"21",X"1C",X"4D",X"FD",X"21",X"08",X"4D", + X"CD",X"CD",X"1E",X"3A",X"30",X"4D",X"0F",X"DA",X"FD",X"1B",X"7D",X"E6",X"07",X"FE",X"04",X"CA", + X"0D",X"1C",X"DA",X"F9",X"1B",X"2D",X"C3",X"0D",X"1C",X"2C",X"C3",X"0D",X"1C",X"7C",X"E6",X"07", + X"FE",X"04",X"CA",X"0D",X"1C",X"DA",X"0C",X"1C",X"25",X"C3",X"0D",X"1C",X"24",X"22",X"08",X"4D", + X"CD",X"E5",X"1E",X"22",X"39",X"4D",X"DD",X"21",X"BF",X"4D",X"DD",X"7E",X"00",X"DD",X"36",X"00", + X"00",X"A7",X"C0",X"3A",X"D2",X"4D",X"A7",X"28",X"29",X"3A",X"D4",X"4D",X"A7",X"28",X"23",X"08", + X"3A",X"70",X"4C",X"FE",X"03",X"C8",X"08",X"2A",X"08",X"4D",X"11",X"94",X"80",X"C3",X"D3",X"86", + X"06",X"19",X"4F",X"CD",X"42",X"00",X"CD",X"AF",X"11",X"F7",X"54",X"05",X"00",X"21",X"BC",X"4E", + X"CB",X"D6",X"3E",X"FF",X"32",X"9D",X"4D",X"2A",X"39",X"4D",X"CD",X"69",X"00",X"7E",X"FE",X"10", + X"28",X"43",X"FE",X"4D",X"CC",X"EE",X"1C",X"FE",X"14",X"CC",X"77",X"1D",X"28",X"37",X"FE",X"B0", + X"D0",X"FE",X"90",X"D8",X"3A",X"FD",X"4D",X"3C",X"32",X"FD",X"4D",X"DD",X"21",X"00",X"4C",X"3E", + X"1C",X"DD",X"BE",X"02",X"CA",X"90",X"B3",X"DD",X"BE",X"04",X"CA",X"90",X"B3",X"DD",X"BE",X"06", + X"CA",X"90",X"B3",X"DD",X"BE",X"08",X"CA",X"90",X"B3",X"E5",X"CD",X"15",X"87",X"CD",X"90",X"B3", + X"CD",X"69",X"B4",X"E1",X"C9",X"3A",X"72",X"4C",X"A7",X"28",X"08",X"3D",X"32",X"72",X"4C",X"A7", + X"CC",X"65",X"1D",X"7E",X"DD",X"21",X"0E",X"4E",X"DD",X"34",X"00",X"E6",X"0F",X"CB",X"3F",X"06", + X"40",X"70",X"06",X"19",X"4F",X"CB",X"39",X"CD",X"42",X"00",X"3C",X"FE",X"01",X"CA",X"D1",X"1C", + X"87",X"32",X"9D",X"4D",X"CD",X"9F",X"1E",X"CD",X"F9",X"1D",X"21",X"BC",X"4E",X"3A",X"0E",X"4E", + X"FE",X"04",X"DC",X"E3",X"B5",X"0F",X"DA",X"A3",X"1D",X"CB",X"C6",X"CB",X"8E",X"C9",X"F5",X"E5", + X"3A",X"14",X"4E",X"A7",X"28",X"06",X"CD",X"65",X"1D",X"CD",X"5F",X"B6",X"E1",X"F1",X"C9",X"3A", + X"13",X"4E",X"FE",X"01",X"D2",X"22",X"1D",X"3A",X"79",X"4C",X"FE",X"02",X"D2",X"22",X"1D",X"F5", + X"EF",X"1C",X"36",X"EF",X"20",X"10",X"3A",X"79",X"4C",X"3C",X"32",X"79",X"4C",X"CD",X"30",X"05", + X"F1",X"C9",X"3A",X"14",X"4E",X"FE",X"06",X"30",X"1D",X"3A",X"7A",X"4C",X"FE",X"02",X"D2",X"46", + X"1D",X"3C",X"32",X"7A",X"4C",X"F5",X"EF",X"1C",X"36",X"EF",X"20",X"11",X"CD",X"00",X"87",X"21", + X"9C",X"4E",X"CB",X"CE",X"F1",X"C9",X"F5",X"EF",X"1C",X"36",X"EF",X"20",X"12",X"21",X"BC",X"4E", + X"CB",X"DE",X"F1",X"C9",X"F5",X"EF",X"1C",X"36",X"EF",X"20",X"13",X"EF",X"21",X"12",X"21",X"BC", + X"4E",X"CB",X"DE",X"F1",X"C9",X"F5",X"C5",X"D5",X"E5",X"AF",X"32",X"72",X"4C",X"06",X"14",X"CD", + X"DF",X"2A",X"E1",X"D1",X"C1",X"F1",X"C9",X"F5",X"E5",X"3A",X"70",X"4C",X"FE",X"03",X"28",X"07", + X"3A",X"70",X"4C",X"FE",X"02",X"20",X"19",X"EF",X"1C",X"16",X"3E",X"02",X"32",X"CC",X"4E",X"32", + X"DC",X"4E",X"3A",X"70",X"4C",X"FE",X"03",X"3E",X"20",X"20",X"02",X"3E",X"40",X"32",X"72",X"4C", + X"E1",X"F1",X"C9",X"CB",X"86",X"CB",X"CE",X"C9",X"21",X"1C",X"4D",X"7E",X"A7",X"CA",X"BD",X"1D", + X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"C7",X"1D",X"C3",X"EB",X"1D",X"3A",X"09",X"4D", + X"E6",X"07",X"FE",X"04",X"C2",X"EB",X"1D",X"3E",X"05",X"CD",X"C8",X"A6",X"38",X"03",X"EF",X"17", + X"00",X"DD",X"21",X"26",X"4D",X"FD",X"21",X"12",X"4D",X"CD",X"CD",X"1E",X"22",X"12",X"4D",X"2A", + X"26",X"4D",X"22",X"1C",X"4D",X"3A",X"3C",X"4D",X"32",X"30",X"4D",X"DD",X"21",X"1C",X"4D",X"FD", + X"21",X"08",X"4D",X"CD",X"CD",X"1E",X"C3",X"0D",X"1C",X"3A",X"9D",X"4D",X"FE",X"06",X"C0",X"2A", + X"BD",X"4D",X"22",X"CB",X"4D",X"3E",X"01",X"32",X"A6",X"4D",X"32",X"A7",X"4D",X"32",X"A8",X"4D", + X"32",X"A9",X"4D",X"32",X"AA",X"4D",X"32",X"B1",X"4D",X"32",X"B2",X"4D",X"32",X"B3",X"4D",X"32", + X"B4",X"4D",X"32",X"B5",X"4D",X"AF",X"32",X"C8",X"4D",X"32",X"D0",X"4D",X"DD",X"21",X"00",X"4C", + X"3A",X"70",X"4C",X"FE",X"03",X"CA",X"CE",X"B3",X"DD",X"36",X"02",X"1C",X"DD",X"36",X"04",X"1C", + X"DD",X"36",X"06",X"1C",X"DD",X"36",X"08",X"1C",X"DD",X"36",X"03",X"11",X"DD",X"36",X"05",X"11", + X"DD",X"36",X"07",X"11",X"DD",X"36",X"09",X"11",X"21",X"AC",X"4E",X"CB",X"EE",X"CB",X"BE",X"C9", + X"2A",X"89",X"32",X"3E",X"02",X"32",X"3C",X"4D",X"22",X"26",X"4D",X"06",X"00",X"C3",X"6C",X"1B", + X"2A",X"85",X"32",X"AF",X"32",X"3C",X"4D",X"22",X"26",X"4D",X"06",X"00",X"C3",X"6C",X"1B",X"2A", + X"8B",X"32",X"3E",X"03",X"32",X"3C",X"4D",X"22",X"26",X"4D",X"06",X"00",X"C3",X"6C",X"1B",X"2A", + X"87",X"32",X"3E",X"01",X"32",X"3C",X"4D",X"22",X"26",X"4D",X"06",X"00",X"C3",X"6C",X"1B",X"3A", + X"12",X"4E",X"A7",X"CA",X"AB",X"1E",X"21",X"9F",X"4D",X"34",X"C9",X"3A",X"A3",X"4D",X"A7",X"C0", + X"3A",X"A2",X"4D",X"A7",X"CA",X"BC",X"1E",X"21",X"11",X"4E",X"34",X"C9",X"3A",X"A1",X"4D",X"A7", + X"CA",X"C8",X"1E",X"21",X"10",X"4E",X"34",X"C9",X"21",X"0F",X"4E",X"34",X"C9",X"FD",X"7E",X"00", + X"DD",X"86",X"00",X"6F",X"FD",X"7E",X"01",X"DD",X"86",X"01",X"67",X"C9",X"CD",X"CD",X"1E",X"CD", + X"69",X"00",X"7E",X"A7",X"C9",X"7D",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6",X"20",X"6F",X"7C", + X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6",X"1E",X"67",X"C9",X"F5",X"C5",X"7D",X"D6",X"20",X"6F", + X"7C",X"D6",X"20",X"67",X"06",X"00",X"CB",X"24",X"CB",X"24",X"CB",X"24",X"CB",X"24",X"CB",X"10", + X"CB",X"24",X"CB",X"10",X"4C",X"26",X"00",X"09",X"01",X"40",X"40",X"09",X"C1",X"F1",X"C9",X"CD", + X"69",X"00",X"11",X"00",X"04",X"19",X"C9",X"CD",X"1F",X"1F",X"7E",X"FE",X"1B",X"C3",X"CE",X"35", + X"AF",X"02",X"C9",X"3A",X"A1",X"4D",X"A7",X"C0",X"3A",X"12",X"4E",X"A7",X"CA",X"48",X"1F",X"3A", + X"9F",X"4D",X"FE",X"07",X"C0",X"C3",X"50",X"1F",X"21",X"B8",X"4D",X"3A",X"0F",X"4E",X"BE",X"D8", + X"3E",X"02",X"32",X"A1",X"4D",X"C9",X"3A",X"A2",X"4D",X"A7",X"C0",X"3A",X"12",X"4E",X"A7",X"CA", + X"6B",X"1F",X"3A",X"9F",X"4D",X"FE",X"11",X"C0",X"C3",X"73",X"1F",X"21",X"B9",X"4D",X"3A",X"10", + X"4E",X"BE",X"D8",X"3E",X"03",X"32",X"A2",X"4D",X"C9",X"3A",X"A3",X"4D",X"A7",X"C0",X"3A",X"12", + X"4E",X"A7",X"CA",X"93",X"1F",X"3A",X"9F",X"4D",X"FE",X"20",X"C0",X"AF",X"32",X"12",X"4E",X"32", + X"9F",X"4D",X"C9",X"21",X"BA",X"4D",X"3A",X"11",X"4E",X"BE",X"D8",X"3E",X"03",X"32",X"A3",X"4D", + X"C9",X"3A",X"A3",X"4D",X"A7",X"C8",X"21",X"0E",X"4E",X"3A",X"B6",X"4D",X"A7",X"C2",X"BE",X"1F", + X"3E",X"F4",X"96",X"47",X"3A",X"BB",X"4D",X"90",X"D8",X"3E",X"01",X"32",X"B6",X"4D",X"3A",X"B7", + X"4D",X"A7",X"C0",X"3E",X"F4",X"96",X"47",X"3A",X"BC",X"4D",X"90",X"D8",X"3E",X"01",X"32",X"B7", + X"4D",X"C9",X"20",X"96",X"01",X"ED",X"47",X"21",X"00",X"50",X"06",X"08",X"AF",X"77",X"2C",X"10", + X"FC",X"21",X"00",X"60",X"7E",X"FE",X"4D",X"20",X"16",X"23",X"7E",X"FE",X"49",X"20",X"10",X"23", + X"7E",X"FE",X"4B",X"20",X"0A",X"23",X"7E",X"FE",X"59",X"20",X"04",X"23",X"C3",X"7F",X"1A",X"AF", + X"ED",X"47",X"21",X"00",X"50",X"06",X"08",X"AF",X"77",X"2C",X"10",X"FC",X"21",X"00",X"40",X"06", + X"04",X"32",X"C0",X"50",X"32",X"07",X"50",X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F1", + X"06",X"04",X"32",X"C0",X"50",X"AF",X"32",X"07",X"50",X"3E",X"0F",X"77",X"2C",X"20",X"FC",X"24", + X"10",X"F0",X"ED",X"56",X"AF",X"32",X"07",X"50",X"3C",X"32",X"00",X"50",X"FB",X"76",X"C3",X"6C", + X"00",X"21",X"04",X"4E",X"34",X"C9",X"78",X"E6",X"01",X"E7",X"4E",X"20",X"5B",X"20",X"3E",X"40", + X"01",X"04",X"00",X"21",X"00",X"40",X"CF",X"0D",X"20",X"FC",X"C9",X"3E",X"40",X"21",X"40",X"40", + X"01",X"04",X"80",X"CF",X"0D",X"20",X"FC",X"C9",X"AF",X"01",X"04",X"00",X"21",X"00",X"44",X"CF", + X"0D",X"20",X"FC",X"C9",X"21",X"00",X"40",X"CD",X"0D",X"94",X"0A",X"A7",X"C8",X"FA",X"87",X"20", + X"5F",X"16",X"00",X"19",X"2B",X"03",X"0A",X"23",X"77",X"F5",X"E5",X"11",X"E0",X"83",X"7D",X"E6", + X"1F",X"87",X"26",X"00",X"6F",X"19",X"D1",X"A7",X"ED",X"52",X"F1",X"EE",X"01",X"77",X"EB",X"03", + X"C3",X"7A",X"20",X"10",X"11",X"12",X"13",X"14",X"01",X"03",X"04",X"06",X"07",X"08",X"09",X"0A", + X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"14",X"C0",X"50",X"80",X"50",X"C0",X"50",X"F5",X"08", + X"F5",X"AF",X"32",X"00",X"50",X"F3",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"21",X"8C",X"4E", + X"11",X"50",X"50",X"01",X"10",X"00",X"ED",X"B0",X"3A",X"CC",X"4E",X"A7",X"3A",X"CF",X"4E",X"20", + X"03",X"3A",X"9F",X"4E",X"32",X"45",X"50",X"3A",X"DC",X"4E",X"A7",X"3A",X"DF",X"4E",X"20",X"03", + X"3A",X"AF",X"4E",X"32",X"4A",X"50",X"3A",X"EC",X"4E",X"A7",X"3A",X"EF",X"4E",X"20",X"03",X"3A", + X"BF",X"4E",X"32",X"4F",X"50",X"21",X"02",X"4C",X"11",X"22",X"4C",X"01",X"1C",X"00",X"ED",X"B0", + X"DD",X"21",X"20",X"4C",X"DD",X"7E",X"02",X"07",X"07",X"DD",X"77",X"02",X"DD",X"7E",X"04",X"07", + X"07",X"DD",X"77",X"04",X"DD",X"7E",X"06",X"07",X"07",X"DD",X"77",X"06",X"DD",X"7E",X"08",X"07", + X"07",X"DD",X"77",X"08",X"DD",X"7E",X"0A",X"07",X"07",X"DD",X"77",X"0A",X"DD",X"7E",X"0C",X"07", + X"07",X"DD",X"77",X"0C",X"3A",X"D1",X"4D",X"FE",X"01",X"20",X"38",X"DD",X"21",X"20",X"4C",X"3A", + X"A4",X"4D",X"87",X"5F",X"16",X"00",X"DD",X"19",X"2A",X"24",X"4C",X"ED",X"5B",X"34",X"4C",X"DD", + X"7E",X"00",X"32",X"24",X"4C",X"DD",X"7E",X"01",X"32",X"25",X"4C",X"DD",X"7E",X"10",X"32",X"34", + X"4C",X"DD",X"7E",X"11",X"32",X"35",X"4C",X"DD",X"75",X"00",X"DD",X"74",X"01",X"DD",X"73",X"10", + X"DD",X"72",X"11",X"3A",X"A6",X"4D",X"A7",X"CA",X"A6",X"21",X"ED",X"4B",X"22",X"4C",X"ED",X"5B", + X"32",X"4C",X"2A",X"2A",X"4C",X"22",X"22",X"4C",X"2A",X"3A",X"4C",X"22",X"32",X"4C",X"ED",X"43", + X"2A",X"4C",X"ED",X"53",X"3A",X"4C",X"21",X"22",X"4C",X"11",X"F2",X"4F",X"01",X"0E",X"00",X"ED", + X"B0",X"21",X"32",X"4C",X"11",X"62",X"50",X"01",X"0E",X"00",X"ED",X"B0",X"3A",X"70",X"4C",X"FE", + X"03",X"20",X"22",X"3A",X"FF",X"47",X"32",X"04",X"50",X"3C",X"E6",X"01",X"32",X"FF",X"47",X"32", + X"05",X"50",X"E6",X"01",X"28",X"0F",X"3A",X"02",X"4E",X"A7",X"20",X"09",X"CD",X"B6",X"B0",X"CD", + X"06",X"B1",X"CD",X"2D",X"B1",X"CD",X"10",X"04",X"CD",X"55",X"04",X"CD",X"30",X"06",X"3A",X"00", + X"4E",X"A7",X"28",X"12",X"CD",X"04",X"06",X"CD",X"C7",X"16",X"CD",X"56",X"16",X"CD",X"B8",X"04", + X"CD",X"FE",X"04",X"CD",X"64",X"05",X"3A",X"00",X"4E",X"3D",X"20",X"06",X"32",X"AC",X"4E",X"32", + X"BC",X"4E",X"3E",X"55",X"47",X"CD",X"2C",X"AF",X"E6",X"0F",X"F6",X"FA",X"3C",X"C4",X"38",X"25", + X"CD",X"B4",X"2B",X"CD",X"42",X"2B",X"3A",X"70",X"4C",X"FE",X"03",X"20",X"16",X"3A",X"FF",X"47", + X"E6",X"01",X"28",X"0F",X"3A",X"02",X"4E",X"A7",X"20",X"09",X"CD",X"19",X"B1",X"CD",X"2D",X"B1", + X"CD",X"DB",X"B0",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"3A",X"00",X"4E",X"A7",X"28",X"08", + X"3A",X"40",X"50",X"E6",X"10",X"CA",X"00",X"00",X"3E",X"01",X"32",X"00",X"50",X"FB",X"F1",X"08", + X"F1",X"C9",X"21",X"00",X"40",X"C3",X"3A",X"94",X"16",X"00",X"06",X"1E",X"0E",X"08",X"DD",X"7E", + X"00",X"FD",X"5E",X"00",X"19",X"07",X"30",X"02",X"36",X"10",X"FD",X"23",X"0D",X"20",X"F2",X"DD", + X"23",X"05",X"20",X"E8",X"21",X"34",X"4E",X"C3",X"D7",X"94",X"21",X"00",X"40",X"C3",X"3F",X"94", + X"16",X"00",X"06",X"1E",X"0E",X"08",X"FD",X"5E",X"00",X"19",X"7E",X"FE",X"10",X"37",X"28",X"01", + X"3F",X"DD",X"CB",X"00",X"16",X"FD",X"23",X"0D",X"20",X"EC",X"DD",X"23",X"05",X"20",X"E5",X"21", + X"64",X"40",X"C3",X"05",X"95",X"21",X"16",X"4E",X"3E",X"FF",X"06",X"1E",X"CF",X"3E",X"14",X"06", + X"04",X"CF",X"C9",X"58",X"78",X"FE",X"02",X"3E",X"1F",X"C3",X"99",X"95",X"10",X"21",X"40",X"44", + X"01",X"04",X"80",X"CF",X"0D",X"20",X"FC",X"3E",X"0F",X"06",X"40",X"21",X"C0",X"47",X"CF",X"7B", + X"FE",X"01",X"C0",X"3E",X"1A",X"C3",X"F1",X"95",X"06",X"06",X"DD",X"21",X"A0",X"45",X"DD",X"77", + X"0C",X"DD",X"77",X"18",X"DD",X"19",X"10",X"F6",X"3E",X"1B",X"06",X"05",X"DD",X"21",X"40",X"44", + X"DD",X"77",X"0E",X"DD",X"77",X"0F",X"DD",X"77",X"10",X"DD",X"19",X"10",X"F3",X"06",X"05",X"DD", + X"21",X"20",X"47",X"DD",X"77",X"0E",X"DD",X"77",X"0F",X"DD",X"77",X"10",X"DD",X"19",X"10",X"F3", + X"3E",X"18",X"32",X"ED",X"45",X"32",X"0D",X"46",X"C9",X"AF",X"32",X"04",X"50",X"32",X"05",X"50", + X"32",X"FD",X"4D",X"DD",X"21",X"00",X"4C",X"DD",X"36",X"02",X"20",X"DD",X"36",X"04",X"20",X"DD", + X"36",X"06",X"20",X"DD",X"36",X"08",X"20",X"DD",X"36",X"0A",X"2C",X"DD",X"36",X"03",X"01",X"DD", + X"36",X"05",X"03",X"DD",X"36",X"07",X"05",X"DD",X"36",X"09",X"07",X"DD",X"36",X"0B",X"09",X"3A", + X"70",X"4C",X"FE",X"03",X"20",X"0A",X"DD",X"36",X"0D",X"05",X"DD",X"36",X"0C",X"2C",X"18",X"08", + X"DD",X"36",X"0D",X"09",X"DD",X"36",X"0C",X"0F",X"78",X"A7",X"C2",X"5E",X"24",X"21",X"64",X"80", + X"22",X"00",X"4D",X"21",X"7C",X"80",X"22",X"02",X"4D",X"21",X"7C",X"90",X"22",X"04",X"4D",X"21", + X"7C",X"70",X"22",X"06",X"4D",X"21",X"C4",X"70",X"22",X"08",X"4D",X"3A",X"70",X"4C",X"FE",X"03", + X"28",X"06",X"21",X"C4",X"80",X"22",X"08",X"4D",X"21",X"2C",X"2E",X"22",X"0A",X"4D",X"22",X"31", + X"4D",X"21",X"2F",X"2E",X"22",X"0C",X"4D",X"22",X"33",X"4D",X"21",X"2F",X"30",X"22",X"0E",X"4D", + X"22",X"35",X"4D",X"21",X"2F",X"2C",X"22",X"10",X"4D",X"22",X"37",X"4D",X"21",X"38",X"2C",X"22", + X"12",X"4D",X"22",X"39",X"4D",X"3A",X"70",X"4C",X"FE",X"03",X"28",X"12",X"21",X"38",X"2E",X"22", + X"12",X"4D",X"22",X"39",X"4D",X"21",X"38",X"30",X"22",X"C6",X"4F",X"22",X"C8",X"4F",X"21",X"00", + X"01",X"22",X"14",X"4D",X"22",X"1E",X"4D",X"21",X"01",X"00",X"22",X"16",X"4D",X"22",X"20",X"4D", + X"21",X"FF",X"00",X"22",X"18",X"4D",X"22",X"22",X"4D",X"21",X"FF",X"00",X"22",X"1A",X"4D",X"22", + X"24",X"4D",X"21",X"00",X"01",X"22",X"1C",X"4D",X"22",X"26",X"4D",X"21",X"00",X"FF",X"22",X"CA", + X"4F",X"22",X"CC",X"4F",X"21",X"02",X"01",X"22",X"28",X"4D",X"22",X"2C",X"4D",X"21",X"03",X"03", + X"22",X"2A",X"4D",X"22",X"2E",X"4D",X"3E",X"00",X"32",X"72",X"4C",X"3E",X"02",X"32",X"30",X"4D", + X"32",X"3C",X"4D",X"3E",X"00",X"32",X"CE",X"4F",X"32",X"CF",X"4F",X"21",X"C4",X"90",X"22",X"D2", + X"4D",X"3A",X"70",X"4C",X"FE",X"03",X"C8",X"21",X"00",X"00",X"22",X"D2",X"4D",X"C9",X"C9",X"21", + X"00",X"00",X"22",X"D2",X"4D",X"22",X"08",X"4D",X"22",X"00",X"4D",X"22",X"02",X"4D",X"22",X"04", + X"4D",X"22",X"06",X"4D",X"C9",X"3E",X"55",X"32",X"94",X"4D",X"05",X"C8",X"3E",X"01",X"32",X"A0", + X"4D",X"C9",X"3E",X"01",X"32",X"00",X"4E",X"AF",X"32",X"01",X"4E",X"C9",X"AF",X"11",X"00",X"4D", + X"21",X"00",X"4E",X"12",X"13",X"A7",X"ED",X"52",X"C2",X"90",X"24",X"C9",X"DD",X"21",X"36",X"41", + X"3A",X"71",X"4E",X"E6",X"0F",X"C6",X"30",X"DD",X"77",X"00",X"3A",X"71",X"4E",X"0F",X"0F",X"0F", + X"0F",X"E6",X"0F",X"C8",X"C6",X"30",X"DD",X"77",X"20",X"C9",X"DD",X"21",X"55",X"40",X"00",X"00", + X"47",X"E6",X"0F",X"DD",X"77",X"00",X"78",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"C8",X"DD",X"77", + X"20",X"C9",X"3A",X"80",X"50",X"47",X"E6",X"03",X"C2",X"E0",X"24",X"21",X"6E",X"4E",X"36",X"FF", + X"4F",X"1F",X"CE",X"00",X"32",X"6B",X"4E",X"E6",X"02",X"A9",X"32",X"6D",X"4E",X"78",X"0F",X"0F", + X"E6",X"03",X"3C",X"FE",X"04",X"20",X"01",X"3C",X"32",X"6F",X"4E",X"78",X"0F",X"0F",X"0F",X"0F", + X"E6",X"03",X"21",X"34",X"25",X"D7",X"32",X"71",X"4E",X"78",X"07",X"2F",X"E6",X"01",X"32",X"75", + X"4E",X"78",X"07",X"07",X"2F",X"E6",X"01",X"47",X"3A",X"70",X"4C",X"FE",X"03",X"21",X"4A",X"25", + X"20",X"03",X"21",X"4E",X"25",X"DF",X"22",X"73",X"4E",X"3A",X"40",X"50",X"07",X"2F",X"E6",X"01", + X"32",X"72",X"4E",X"C9",X"40",X"60",X"80",X"FF",X"2A",X"6A",X"4C",X"CB",X"BD",X"22",X"6A",X"4C", + X"C9",X"2A",X"6A",X"4C",X"CB",X"FD",X"22",X"6A",X"4C",X"C9",X"66",X"01",X"66",X"01",X"93",X"01", + X"93",X"01",X"3A",X"C1",X"4D",X"CB",X"47",X"C2",X"7A",X"25",X"3A",X"B6",X"4D",X"A7",X"20",X"1A", + X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13",X"2A",X"0A",X"4D",X"3A",X"2C",X"4D",X"CD",X"7A",X"95", + X"CD",X"9C",X"27",X"22",X"1E",X"4D",X"32",X"2C",X"4D",X"C9",X"2A",X"0A",X"4D",X"ED",X"5B",X"39", + X"4D",X"3A",X"2C",X"4D",X"CD",X"9C",X"27",X"22",X"1E",X"4D",X"32",X"2C",X"4D",X"C9",X"3A",X"C1", + X"4D",X"CB",X"47",X"C2",X"B0",X"25",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13",X"2A",X"0C",X"4D", + X"3A",X"2D",X"4D",X"CD",X"7A",X"95",X"CD",X"9C",X"27",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9", + X"ED",X"5B",X"39",X"4D",X"2A",X"1C",X"4D",X"29",X"29",X"19",X"EB",X"2A",X"0C",X"4D",X"3A",X"2D", + X"4D",X"CD",X"9C",X"27",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"3A",X"C1",X"4D",X"CB",X"47", + X"C2",X"ED",X"25",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13",X"2A",X"0E",X"4D",X"CD",X"72",X"95", + X"11",X"40",X"20",X"CD",X"9C",X"27",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9",X"ED",X"4B",X"0A", + X"4D",X"ED",X"5B",X"39",X"4D",X"2A",X"1C",X"4D",X"29",X"19",X"7D",X"87",X"91",X"6F",X"7C",X"87", + X"90",X"67",X"EB",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD",X"9C",X"27",X"22",X"22",X"4D",X"32", + X"2E",X"4D",X"C9",X"3A",X"C1",X"4D",X"CB",X"47",X"C2",X"35",X"26",X"3A",X"04",X"4E",X"FE",X"03", + X"20",X"13",X"2A",X"10",X"4D",X"CD",X"77",X"95",X"11",X"AE",X"3A",X"CD",X"9C",X"27",X"22",X"24", + X"4D",X"32",X"2F",X"4D",X"C9",X"DD",X"21",X"39",X"4D",X"FD",X"21",X"10",X"4D",X"CD",X"20",X"28", + X"11",X"40",X"00",X"A7",X"ED",X"52",X"DA",X"22",X"26",X"2A",X"10",X"4D",X"ED",X"5B",X"39",X"4D", + X"3A",X"2F",X"4D",X"CD",X"9C",X"27",X"22",X"24",X"4D",X"32",X"2F",X"4D",X"C9",X"3A",X"AC",X"4D", + X"A7",X"CA",X"77",X"26",X"11",X"2C",X"2E",X"2A",X"0A",X"4D",X"3A",X"2C",X"4D",X"CD",X"9C",X"27", + X"22",X"1E",X"4D",X"32",X"2C",X"4D",X"C9",X"3E",X"01",X"32",X"DA",X"4F",X"2A",X"0A",X"4D",X"3A", + X"2C",X"4D",X"CD",X"54",X"27",X"22",X"1E",X"4D",X"32",X"2C",X"4D",X"C9",X"3A",X"AD",X"4D",X"A7", + X"CA",X"A6",X"26",X"11",X"2C",X"2E",X"2A",X"0C",X"4D",X"3A",X"2D",X"4D",X"CD",X"9C",X"27",X"22", + X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"3E",X"02",X"32",X"DA",X"4F",X"2A",X"0C",X"4D",X"3A",X"2D", + X"4D",X"CD",X"54",X"27",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"3A",X"AE",X"4D",X"A7",X"CA", + X"D5",X"26",X"11",X"2C",X"2E",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD",X"9C",X"27",X"22",X"22", + X"4D",X"32",X"2E",X"4D",X"C9",X"3E",X"03",X"32",X"DA",X"4F",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D", + X"CD",X"54",X"27",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9",X"3A",X"AF",X"4D",X"A7",X"CA",X"04", + X"27",X"11",X"2C",X"2E",X"2A",X"10",X"4D",X"3A",X"2F",X"4D",X"CD",X"9C",X"27",X"22",X"24",X"4D", + X"32",X"2F",X"4D",X"C9",X"3E",X"04",X"32",X"DA",X"4F",X"2A",X"10",X"4D",X"3A",X"2F",X"4D",X"CD", + X"54",X"27",X"22",X"24",X"4D",X"32",X"2F",X"4D",X"C9",X"3A",X"A7",X"4D",X"A7",X"CA",X"34",X"27", + X"2A",X"12",X"4D",X"ED",X"5B",X"0C",X"4D",X"3A",X"3C",X"4D",X"CD",X"9C",X"27",X"22",X"26",X"4D", + X"32",X"3C",X"4D",X"C9",X"2A",X"39",X"4D",X"ED",X"4B",X"0C",X"4D",X"7D",X"87",X"91",X"6F",X"7C", + X"87",X"90",X"67",X"EB",X"2A",X"12",X"4D",X"3A",X"3C",X"4D",X"CD",X"9C",X"27",X"22",X"26",X"4D", + X"32",X"3C",X"4D",X"C9",X"22",X"3E",X"4D",X"EE",X"02",X"32",X"3D",X"4D",X"CD",X"59",X"28",X"E6", + X"03",X"21",X"3B",X"4D",X"77",X"87",X"5F",X"16",X"00",X"DD",X"21",X"85",X"32",X"DD",X"19",X"FD", + X"21",X"3E",X"4D",X"3A",X"3D",X"4D",X"BE",X"CA",X"8D",X"27",X"CD",X"DC",X"1E",X"E6",X"C0",X"D6", + X"C0",X"28",X"0A",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"3A",X"3B",X"4D",X"C9",X"DD",X"23",X"DD", + X"23",X"21",X"3B",X"4D",X"7E",X"3C",X"E6",X"03",X"77",X"C3",X"73",X"27",X"22",X"3E",X"4D",X"ED", + X"53",X"40",X"4D",X"32",X"3B",X"4D",X"EE",X"02",X"32",X"3D",X"4D",X"21",X"FF",X"FF",X"22",X"44", + X"4D",X"DD",X"21",X"85",X"32",X"FD",X"21",X"3E",X"4D",X"21",X"C7",X"4D",X"36",X"00",X"3A",X"3D", + X"4D",X"BE",X"CA",X"FC",X"27",X"CD",X"CD",X"1E",X"22",X"42",X"4D",X"CD",X"69",X"00",X"7E",X"E6", + X"C0",X"D6",X"C0",X"28",X"27",X"DD",X"E5",X"FD",X"E5",X"DD",X"21",X"40",X"4D",X"FD",X"21",X"42", + X"4D",X"CD",X"20",X"28",X"FD",X"E1",X"DD",X"E1",X"EB",X"2A",X"44",X"4D",X"A7",X"ED",X"52",X"DA", + X"FC",X"27",X"ED",X"53",X"44",X"4D",X"3A",X"C7",X"4D",X"32",X"3B",X"4D",X"DD",X"23",X"DD",X"23", + X"21",X"C7",X"4D",X"34",X"3E",X"04",X"BE",X"C2",X"BE",X"27",X"3A",X"3B",X"4D",X"87",X"5F",X"16", + X"00",X"DD",X"21",X"85",X"32",X"DD",X"19",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"CB",X"3F",X"C9", + X"DD",X"7E",X"00",X"FD",X"46",X"00",X"90",X"D2",X"2F",X"28",X"78",X"DD",X"46",X"00",X"90",X"CD", + X"48",X"28",X"E5",X"DD",X"7E",X"01",X"FD",X"46",X"01",X"90",X"D2",X"42",X"28",X"78",X"DD",X"46", + X"01",X"90",X"CD",X"48",X"28",X"C1",X"09",X"C9",X"67",X"5F",X"2E",X"00",X"55",X"0E",X"08",X"29", + X"D2",X"54",X"28",X"19",X"0D",X"C2",X"4F",X"28",X"C9",X"2A",X"C9",X"4D",X"54",X"5D",X"29",X"29", + X"19",X"23",X"7C",X"E6",X"1F",X"67",X"7E",X"22",X"C9",X"4D",X"C9",X"11",X"40",X"40",X"21",X"C0", + X"43",X"A7",X"ED",X"52",X"C8",X"1A",X"FE",X"10",X"CA",X"89",X"28",X"FE",X"12",X"CA",X"89",X"28", + X"FE",X"14",X"CA",X"89",X"28",X"13",X"C3",X"6E",X"28",X"3E",X"40",X"12",X"13",X"C3",X"6E",X"28", + X"3A",X"00",X"4E",X"FE",X"01",X"C8",X"21",X"70",X"29",X"DF",X"EB",X"CD",X"64",X"29",X"7B",X"86", + X"27",X"77",X"23",X"7A",X"8E",X"27",X"77",X"5F",X"23",X"3E",X"00",X"8E",X"27",X"77",X"57",X"EB", + X"29",X"29",X"29",X"29",X"3A",X"71",X"4E",X"3D",X"BC",X"DC",X"AA",X"29",X"CD",X"EC",X"28",X"13", + X"13",X"13",X"21",X"8A",X"4E",X"06",X"03",X"1A",X"BE",X"D8",X"20",X"05",X"1B",X"2B",X"10",X"F7", + X"C9",X"3A",X"09",X"4E",X"3C",X"32",X"FE",X"4D",X"CD",X"64",X"29",X"11",X"88",X"4E",X"01",X"03", + X"00",X"ED",X"B0",X"1B",X"01",X"04",X"03",X"21",X"F2",X"43",X"18",X"0F",X"3A",X"09",X"4E",X"01", + X"04",X"03",X"21",X"FC",X"43",X"A7",X"28",X"03",X"21",X"E9",X"43",X"1A",X"0F",X"0F",X"0F",X"0F", + X"CD",X"0B",X"29",X"1A",X"CD",X"0B",X"29",X"1B",X"10",X"F1",X"C9",X"E6",X"0F",X"28",X"04",X"0E", + X"00",X"18",X"07",X"79",X"A7",X"28",X"03",X"3E",X"40",X"0D",X"77",X"2B",X"C9",X"21",X"E8",X"4D", + X"23",X"23",X"7E",X"FE",X"4D",X"20",X"17",X"23",X"7E",X"FE",X"49",X"20",X"11",X"23",X"7E",X"FE", + X"4B",X"20",X"0B",X"23",X"7E",X"FE",X"59",X"20",X"05",X"06",X"00",X"CD",X"DF",X"2A",X"AF",X"21", + X"80",X"4E",X"06",X"08",X"CF",X"01",X"04",X"03",X"11",X"82",X"4E",X"21",X"FC",X"43",X"CD",X"FB", + X"28",X"01",X"04",X"03",X"11",X"86",X"4E",X"21",X"E9",X"43",X"3A",X"70",X"4E",X"A7",X"20",X"9B", + X"0E",X"06",X"18",X"97",X"3A",X"09",X"4E",X"21",X"80",X"4E",X"A7",X"C8",X"21",X"84",X"4E",X"C9", + X"10",X"00",X"50",X"00",X"00",X"02",X"00",X"04",X"00",X"08",X"00",X"16",X"00",X"01",X"00",X"02", + X"00",X"05",X"00",X"07",X"00",X"10",X"00",X"42",X"70",X"29",X"00",X"44",X"70",X"29",X"00",X"44", + X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"03",X"00",X"04",X"00",X"05",X"00",X"06",X"00",X"07", + X"00",X"08",X"00",X"50",X"00",X"20",X"00",X"50",X"00",X"50",X"13",X"6B",X"62",X"1B",X"CB",X"46", + X"C0",X"CB",X"C6",X"3E",X"01",X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"21",X"14",X"4E",X"34",X"21", + X"15",X"4E",X"34",X"46",X"21",X"1A",X"40",X"0E",X"05",X"78",X"A7",X"28",X"0E",X"FE",X"06",X"30", + X"0A",X"3E",X"20",X"CD",X"09",X"2A",X"2B",X"2B",X"0D",X"10",X"F6",X"0D",X"F8",X"CD",X"F8",X"29", + X"2B",X"2B",X"18",X"F7",X"3A",X"00",X"4E",X"FE",X"01",X"C8",X"CD",X"47",X"2A",X"12",X"44",X"09", + X"0A",X"02",X"21",X"15",X"4E",X"46",X"18",X"CC",X"3E",X"40",X"E5",X"D5",X"77",X"23",X"77",X"11", + X"1F",X"00",X"19",X"77",X"23",X"77",X"D1",X"E1",X"C9",X"E5",X"D5",X"11",X"1F",X"00",X"77",X"3C", + X"23",X"77",X"3C",X"19",X"77",X"3C",X"23",X"77",X"D1",X"E1",X"C9",X"3A",X"6E",X"4E",X"FE",X"FF", + X"20",X"05",X"06",X"02",X"C3",X"DF",X"2A",X"06",X"01",X"CD",X"DF",X"2A",X"3A",X"6E",X"4E",X"E6", + X"F0",X"28",X"09",X"0F",X"0F",X"0F",X"0F",X"C6",X"30",X"32",X"34",X"40",X"3A",X"6E",X"4E",X"E6", + X"0F",X"C6",X"30",X"32",X"33",X"40",X"C9",X"E1",X"5E",X"23",X"56",X"23",X"4E",X"23",X"46",X"23", + X"7E",X"23",X"E5",X"EB",X"11",X"20",X"00",X"E5",X"C5",X"71",X"23",X"10",X"FC",X"C1",X"E1",X"19", + X"3D",X"20",X"F4",X"C9",X"3A",X"00",X"4E",X"FE",X"01",X"C8",X"3A",X"13",X"4E",X"3C",X"FE",X"08", + X"DA",X"75",X"2A",X"3E",X"07",X"11",X"76",X"3A",X"47",X"0E",X"07",X"21",X"04",X"40",X"1A",X"CD", + X"09",X"2A",X"3E",X"04",X"84",X"67",X"13",X"1A",X"CD",X"FA",X"29",X"3E",X"FC",X"84",X"67",X"13", + X"23",X"23",X"0D",X"10",X"E9",X"0D",X"F8",X"CD",X"F8",X"29",X"3E",X"04",X"84",X"67",X"AF",X"CD", + X"FA",X"29",X"3E",X"FC",X"84",X"67",X"23",X"23",X"18",X"EB",X"FE",X"13",X"38",X"02",X"3E",X"13", + X"D6",X"07",X"4F",X"06",X"00",X"21",X"76",X"3A",X"09",X"09",X"EB",X"06",X"07",X"C3",X"79",X"2A", + X"47",X"E6",X"0F",X"C6",X"00",X"27",X"4F",X"78",X"E6",X"F0",X"28",X"0B",X"0F",X"0F",X"0F",X"0F", + X"47",X"AF",X"C6",X"16",X"27",X"10",X"FB",X"81",X"27",X"C9",X"21",X"84",X"39",X"18",X"03",X"21", + X"04",X"36",X"DF",X"5E",X"23",X"56",X"DD",X"21",X"00",X"44",X"DD",X"19",X"DD",X"E5",X"11",X"00", + X"FC",X"DD",X"19",X"11",X"FF",X"FF",X"CB",X"7E",X"20",X"03",X"11",X"E0",X"FF",X"23",X"78",X"01", + X"00",X"00",X"87",X"38",X"28",X"7E",X"FE",X"2F",X"28",X"09",X"DD",X"77",X"00",X"23",X"DD",X"19", + X"04",X"18",X"F2",X"23",X"DD",X"E1",X"7E",X"A7",X"FA",X"25",X"2B",X"7E",X"DD",X"77",X"00",X"23", + X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"77",X"00",X"DD",X"19",X"10",X"F9",X"C9",X"7E",X"FE",X"2F", + X"28",X"0A",X"DD",X"36",X"00",X"40",X"23",X"DD",X"19",X"04",X"18",X"F1",X"23",X"04",X"ED",X"B1", + X"18",X"D2",X"3A",X"00",X"4F",X"FE",X"00",X"28",X"0B",X"11",X"02",X"4C",X"21",X"50",X"4F",X"01", + X"0E",X"00",X"ED",X"B0",X"3A",X"09",X"4E",X"21",X"72",X"4E",X"A6",X"28",X"0C",X"3A",X"0A",X"4C", + X"FE",X"3F",X"20",X"05",X"3E",X"FF",X"32",X"0A",X"4C",X"21",X"26",X"A7",X"DD",X"21",X"CC",X"4E", + X"FD",X"21",X"8C",X"4E",X"CD",X"EC",X"2B",X"47",X"3A",X"CC",X"4E",X"A7",X"28",X"04",X"78",X"32", + X"91",X"4E",X"21",X"F6",X"A6",X"DD",X"21",X"DC",X"4E",X"FD",X"21",X"92",X"4E",X"CD",X"EC",X"2B", + X"47",X"3A",X"DC",X"4E",X"A7",X"28",X"04",X"78",X"32",X"96",X"4E",X"21",X"5A",X"A7",X"DD",X"21", + X"EC",X"4E",X"FD",X"21",X"97",X"4E",X"CD",X"EC",X"2B",X"47",X"3A",X"EC",X"4E",X"A7",X"C8",X"78", + X"32",X"9B",X"4E",X"C9",X"21",X"9E",X"3A",X"DD",X"21",X"9C",X"4E",X"FD",X"21",X"8C",X"4E",X"CD", + X"B1",X"2C",X"32",X"91",X"4E",X"21",X"AE",X"3A",X"DD",X"21",X"AC",X"4E",X"FD",X"21",X"92",X"4E", + X"CD",X"B1",X"2C",X"32",X"96",X"4E",X"21",X"EE",X"3A",X"DD",X"21",X"BC",X"4E",X"FD",X"21",X"97", + X"4E",X"CD",X"B1",X"2C",X"32",X"9B",X"4E",X"AF",X"32",X"90",X"4E",X"C9",X"DD",X"7E",X"00",X"A7", + X"CA",X"B7",X"2C",X"4F",X"06",X"08",X"1E",X"80",X"7B",X"A1",X"20",X"05",X"CB",X"3B",X"10",X"F8", + X"C9",X"DD",X"7E",X"02",X"A3",X"20",X"06",X"DD",X"73",X"02",X"C3",X"B8",X"35",X"DD",X"35",X"0C", + X"C2",X"9A",X"2C",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74", + X"07",X"FE",X"F0",X"38",X"27",X"21",X"13",X"2C",X"E5",X"E6",X"0F",X"E7",X"18",X"2E",X"28",X"2E", + X"3A",X"2E",X"4C",X"2E",X"5E",X"2E",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00", + X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"70",X"2E",X"47",X"E6",X"1F",X"28", + X"03",X"DD",X"70",X"0D",X"DD",X"4E",X"09",X"DD",X"7E",X"0B",X"E6",X"08",X"28",X"02",X"0E",X"00", + X"DD",X"71",X"0F",X"78",X"07",X"07",X"07",X"E6",X"07",X"21",X"1E",X"3B",X"D7",X"DD",X"77",X"0C", + X"08",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"FE",X"F5",X"20",X"10",X"23",X"DD",X"75",X"06", + X"DD",X"74",X"07",X"08",X"CB",X"3F",X"DD",X"86",X"0C",X"DD",X"77",X"0C",X"78",X"E6",X"1F",X"28", + X"09",X"E6",X"0F",X"21",X"2D",X"3B",X"D7",X"DD",X"77",X"0E",X"DD",X"6E",X"0E",X"26",X"00",X"DD", + X"7E",X"0D",X"E6",X"10",X"28",X"02",X"3E",X"01",X"DD",X"86",X"04",X"CA",X"AB",X"2D",X"C3",X"A7", + X"2D",X"DD",X"7E",X"00",X"A7",X"20",X"27",X"DD",X"7E",X"02",X"A7",X"C8",X"DD",X"36",X"02",X"00", + X"DD",X"36",X"0D",X"00",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"0F",X"00",X"FD",X"36",X"00",X"00", + X"FD",X"36",X"01",X"00",X"FD",X"36",X"02",X"00",X"FD",X"36",X"03",X"00",X"AF",X"C9",X"4F",X"06", + X"08",X"1E",X"80",X"7B",X"A1",X"20",X"05",X"CB",X"3B",X"10",X"F8",X"C9",X"DD",X"7E",X"02",X"A3", + X"20",X"3F",X"DD",X"73",X"02",X"05",X"78",X"07",X"07",X"07",X"4F",X"06",X"00",X"E5",X"09",X"DD", + X"E5",X"D1",X"13",X"13",X"13",X"01",X"08",X"00",X"ED",X"B0",X"E1",X"DD",X"7E",X"06",X"E6",X"7F", + X"DD",X"77",X"0C",X"DD",X"7E",X"04",X"DD",X"77",X"0E",X"DD",X"7E",X"09",X"47",X"0F",X"0F",X"0F", + X"0F",X"E6",X"0F",X"DD",X"77",X"0B",X"E6",X"08",X"20",X"07",X"DD",X"70",X"0F",X"DD",X"36",X"0D", + X"00",X"DD",X"35",X"0C",X"20",X"5A",X"DD",X"7E",X"08",X"A7",X"28",X"10",X"DD",X"35",X"08",X"20", + X"0B",X"7B",X"2F",X"DD",X"A6",X"00",X"DD",X"77",X"00",X"C3",X"B1",X"2C",X"DD",X"7E",X"06",X"E6", + X"7F",X"DD",X"77",X"0C",X"DD",X"CB",X"06",X"7E",X"28",X"16",X"DD",X"7E",X"05",X"ED",X"44",X"DD", + X"77",X"05",X"DD",X"CB",X"0D",X"46",X"DD",X"CB",X"0D",X"C6",X"28",X"24",X"DD",X"CB",X"0D",X"86", + X"DD",X"7E",X"04",X"DD",X"86",X"07",X"DD",X"77",X"04",X"DD",X"77",X"0E",X"DD",X"7E",X"09",X"DD", + X"86",X"0A",X"DD",X"77",X"09",X"47",X"DD",X"7E",X"0B",X"E6",X"08",X"20",X"03",X"DD",X"70",X"0F", + X"DD",X"7E",X"0E",X"DD",X"86",X"05",X"DD",X"77",X"0E",X"6F",X"26",X"00",X"DD",X"7E",X"03",X"E6", + X"70",X"28",X"08",X"0F",X"0F",X"0F",X"0F",X"47",X"29",X"10",X"FD",X"FD",X"75",X"00",X"7D",X"0F", + X"0F",X"0F",X"0F",X"FD",X"77",X"01",X"FD",X"74",X"02",X"7C",X"0F",X"0F",X"0F",X"0F",X"FD",X"77", + X"03",X"DD",X"7E",X"0B",X"E7",X"E5",X"2D",X"E9",X"2D",X"EE",X"2D",X"FF",X"2D",X"06",X"2E",X"0D", + X"2E",X"0E",X"2E",X"0F",X"2E",X"10",X"2E",X"11",X"2E",X"12",X"2E",X"13",X"2E",X"14",X"2E",X"15", + X"2E",X"16",X"2E",X"17",X"2E",X"DD",X"7E",X"0F",X"C9",X"DD",X"7E",X"0F",X"18",X"09",X"3A",X"84", + X"4C",X"E6",X"01",X"DD",X"7E",X"0F",X"C0",X"E6",X"0F",X"C8",X"3D",X"DD",X"77",X"0F",X"C9",X"3A", + X"84",X"4C",X"E6",X"03",X"18",X"ED",X"3A",X"84",X"4C",X"E6",X"07",X"18",X"E6",X"C9",X"C9",X"C9", + X"C9",X"C9",X"C9",X"C9",X"C9",X"C9",X"C9",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"DD", + X"77",X"06",X"23",X"7E",X"DD",X"77",X"07",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23", + X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"03",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07", + X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"04",X"C9",X"DD",X"6E",X"06",X"DD", + X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"09",X"C9",X"DD",X"6E", + X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"0B",X"C9", + X"DD",X"7E",X"02",X"2F",X"DD",X"A6",X"00",X"DD",X"77",X"00",X"C3",X"B7",X"2C",X"3A",X"B1",X"4D", + X"A7",X"C8",X"AF",X"32",X"B1",X"4D",X"21",X"85",X"32",X"3A",X"28",X"4D",X"EE",X"02",X"32",X"2C", + X"4D",X"47",X"DF",X"22",X"1E",X"4D",X"3A",X"02",X"4E",X"FE",X"27",X"C0",X"22",X"14",X"4D",X"78", + X"32",X"28",X"4D",X"C9",X"3A",X"B2",X"4D",X"A7",X"C8",X"AF",X"32",X"B2",X"4D",X"21",X"85",X"32", + X"3A",X"29",X"4D",X"EE",X"02",X"32",X"2D",X"4D",X"47",X"DF",X"22",X"20",X"4D",X"3A",X"02",X"4E", + X"FE",X"27",X"C0",X"22",X"16",X"4D",X"78",X"32",X"29",X"4D",X"C9",X"3A",X"B3",X"4D",X"A7",X"C8", + X"AF",X"32",X"B3",X"4D",X"21",X"85",X"32",X"3A",X"2A",X"4D",X"EE",X"02",X"32",X"2E",X"4D",X"47", + X"DF",X"22",X"22",X"4D",X"3A",X"02",X"4E",X"FE",X"27",X"C0",X"22",X"18",X"4D",X"78",X"32",X"2A", + X"4D",X"C9",X"3A",X"B4",X"4D",X"A7",X"C8",X"AF",X"32",X"B4",X"4D",X"21",X"85",X"32",X"3A",X"2B", + X"4D",X"EE",X"02",X"32",X"2F",X"4D",X"47",X"DF",X"22",X"24",X"4D",X"3A",X"02",X"4E",X"FE",X"27", + X"C0",X"22",X"1A",X"4D",X"78",X"32",X"2B",X"4D",X"C9",X"F5",X"08",X"F5",X"ED",X"57",X"B7",X"28", + X"06",X"F1",X"08",X"F1",X"C3",X"BE",X"20",X"F1",X"08",X"F1",X"C3",X"2D",X"2F",X"21",X"00",X"00", + X"01",X"00",X"10",X"32",X"C0",X"50",X"79",X"86",X"4F",X"7D",X"C6",X"02",X"6F",X"FE",X"02",X"D2", + X"36",X"2F",X"24",X"10",X"EE",X"79",X"A7",X"32",X"07",X"50",X"7C",X"FE",X"30",X"C2",X"30",X"2F", + X"26",X"00",X"2C",X"7D",X"FE",X"02",X"DA",X"30",X"2F",X"C3",X"6D",X"2F",X"25",X"7C",X"E6",X"F0", + X"32",X"07",X"50",X"0F",X"0F",X"0F",X"0F",X"5F",X"06",X"00",X"C3",X"E8",X"2F",X"31",X"9B",X"30", + X"06",X"FF",X"E1",X"D1",X"48",X"32",X"C0",X"50",X"79",X"A3",X"77",X"C6",X"33",X"4F",X"2C",X"7D", + X"E6",X"0F",X"C2",X"78",X"2F",X"79",X"87",X"87",X"81",X"C6",X"31",X"4F",X"7D",X"A7",X"C2",X"78", + X"2F",X"24",X"15",X"C2",X"75",X"2F",X"3B",X"3B",X"3B",X"3B",X"E1",X"D1",X"48",X"32",X"C0",X"50", + X"79",X"A3",X"4F",X"7E",X"A3",X"B9",X"C2",X"E0",X"2F",X"C6",X"33",X"4F",X"2C",X"7D",X"E6",X"0F", + X"C2",X"A0",X"2F",X"79",X"87",X"87",X"81",X"C6",X"31",X"4F",X"7D",X"A7",X"C2",X"A0",X"2F",X"24", + X"15",X"C2",X"9D",X"2F",X"3B",X"3B",X"3B",X"3B",X"78",X"D6",X"10",X"47",X"10",X"A4",X"F1",X"D1", + X"FE",X"44",X"C2",X"70",X"2F",X"7B",X"EE",X"F0",X"C2",X"70",X"2F",X"06",X"01",X"C3",X"E8",X"2F", + X"7B",X"E6",X"01",X"EE",X"01",X"5F",X"06",X"00",X"31",X"C0",X"4F",X"D9",X"21",X"00",X"4C",X"06", + X"04",X"32",X"C0",X"50",X"36",X"00",X"2C",X"20",X"FB",X"24",X"10",X"F5",X"21",X"00",X"40",X"06", + X"04",X"32",X"C0",X"50",X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F4",X"06",X"04",X"32", + X"C0",X"50",X"3E",X"0F",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F4",X"D9",X"10",X"24",X"3E",X"0F", + X"11",X"02",X"18",X"CD",X"AB",X"01",X"50",X"52",X"4F",X"47",X"52",X"41",X"4D",X"41",X"40",X"56", + X"4F",X"4C",X"41",X"54",X"49",X"4C",X"40",X"4F",X"4B",X"00",X"06",X"23",X"CD",X"DF",X"2A",X"C3", + X"BB",X"30",X"7B",X"C6",X"30",X"32",X"84",X"41",X"C5",X"E5",X"06",X"24",X"CD",X"DF",X"2A",X"E1", + X"7C",X"FE",X"40",X"2A",X"B3",X"30",X"38",X"11",X"FE",X"4C",X"2A",X"B5",X"30",X"30",X"0A",X"FE", + X"44",X"2A",X"B7",X"30",X"38",X"03",X"2A",X"B9",X"30",X"7D",X"32",X"04",X"42",X"7C",X"32",X"64", + X"42",X"3A",X"00",X"50",X"47",X"3A",X"40",X"50",X"B0",X"E6",X"01",X"20",X"11",X"C1",X"79",X"E6", + X"0F",X"47",X"79",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"4F",X"ED",X"43",X"85",X"41",X"32",X"C0", + X"50",X"3A",X"80",X"50",X"E6",X"08",X"28",X"F6",X"C3",X"D5",X"1F",X"00",X"4C",X"0F",X"04",X"00", + X"4C",X"F0",X"04",X"00",X"40",X"0F",X"04",X"00",X"40",X"F0",X"04",X"00",X"44",X"0F",X"04",X"00", + X"44",X"F0",X"04",X"4F",X"40",X"41",X"57",X"41",X"56",X"41",X"43",X"21",X"06",X"50",X"3E",X"01", + X"77",X"2D",X"20",X"FC",X"AF",X"32",X"03",X"50",X"D6",X"04",X"ED",X"47",X"31",X"C0",X"4F",X"32", + X"C0",X"50",X"AF",X"32",X"00",X"4E",X"3C",X"32",X"01",X"4E",X"32",X"00",X"50",X"FB",X"3A",X"00", + X"50",X"2F",X"47",X"E6",X"A7",X"28",X"05",X"3E",X"02",X"32",X"9C",X"4E",X"3A",X"40",X"50",X"2F", + X"4F",X"E6",X"27",X"28",X"05",X"3E",X"01",X"32",X"9C",X"4E",X"78",X"B1",X"E6",X"01",X"28",X"05", + X"3E",X"08",X"32",X"BC",X"4E",X"78",X"B1",X"E6",X"02",X"28",X"05",X"3E",X"04",X"32",X"BC",X"4E", + X"78",X"B1",X"E6",X"04",X"28",X"05",X"3E",X"10",X"32",X"BC",X"4E",X"78",X"B1",X"E6",X"08",X"28", + X"05",X"3E",X"20",X"32",X"BC",X"4E",X"3A",X"80",X"50",X"E6",X"03",X"C6",X"25",X"47",X"CD",X"DF", + X"2A",X"3A",X"80",X"50",X"0F",X"0F",X"0F",X"0F",X"E6",X"03",X"FE",X"03",X"20",X"08",X"06",X"2A", + X"CD",X"DF",X"2A",X"C3",X"63",X"31",X"07",X"5F",X"D5",X"06",X"2B",X"CD",X"DF",X"2A",X"06",X"2E", + X"CD",X"DF",X"2A",X"D1",X"16",X"00",X"21",X"7F",X"32",X"19",X"7E",X"32",X"2A",X"42",X"23",X"7E", + X"32",X"4A",X"42",X"3A",X"80",X"50",X"0F",X"0F",X"E6",X"03",X"F6",X"02",X"C6",X"31",X"FE",X"34", + X"20",X"01",X"3C",X"32",X"AC",X"41",X"06",X"29",X"CD",X"DF",X"2A",X"3A",X"40",X"50",X"07",X"E6", + X"01",X"C6",X"2C",X"47",X"CD",X"DF",X"2A",X"3A",X"80",X"50",X"E6",X"08",X"CA",X"CF",X"30",X"AF", + X"32",X"00",X"50",X"F3",X"21",X"07",X"50",X"AF",X"77",X"2D",X"20",X"FC",X"31",X"50",X"3A",X"06", + X"03",X"D9",X"E1",X"D1",X"32",X"C0",X"50",X"C1",X"3E",X"3C",X"77",X"23",X"72",X"23",X"10",X"F8", + X"3B",X"3B",X"C1",X"71",X"23",X"3E",X"3F",X"77",X"23",X"10",X"F8",X"3B",X"3B",X"1D",X"C2",X"A4", + X"31",X"F1",X"D9",X"10",X"DC",X"31",X"C0",X"4F",X"06",X"30",X"CD",X"6D",X"32",X"10",X"FB",X"18", + X"74",X"DD",X"E5",X"E5",X"AF",X"3E",X"40",X"C6",X"0C",X"67",X"3E",X"5A",X"C6",X"10",X"6F",X"E5", + X"DD",X"E1",X"3E",X"50",X"DD",X"36",X"00",X"C0",X"DD",X"77",X"01",X"DD",X"36",X"02",X"80",X"DD", + X"77",X"03",X"DD",X"36",X"04",X"C0",X"DD",X"77",X"05",X"E1",X"DD",X"E1",X"C9",X"32",X"C0",X"50", + X"3A",X"40",X"50",X"E6",X"10",X"28",X"F6",X"3A",X"40",X"50",X"E6",X"27",X"C2",X"6C",X"00",X"06", + X"08",X"CD",X"6D",X"32",X"10",X"FB",X"3A",X"40",X"50",X"E6",X"10",X"C2",X"6C",X"00",X"1E",X"01", + X"06",X"04",X"32",X"C0",X"50",X"CD",X"6D",X"32",X"3A",X"00",X"50",X"A3",X"20",X"F4",X"CD",X"6D", + X"32",X"32",X"C0",X"50",X"3A",X"00",X"50",X"EE",X"FF",X"20",X"F3",X"10",X"E5",X"CB",X"03",X"7B", + X"FE",X"10",X"DA",X"20",X"32",X"21",X"00",X"40",X"06",X"04",X"3E",X"40",X"77",X"2C",X"20",X"FC", + X"24",X"10",X"F7",X"00",X"00",X"00",X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F7",X"32", + X"C0",X"50",X"3A",X"40",X"50",X"E6",X"10",X"CA",X"5F",X"32",X"C3",X"6C",X"00",X"32",X"C0",X"50", + X"21",X"00",X"28",X"2B",X"7C",X"B5",X"20",X"FB",X"C9",X"CD",X"6D",X"32",X"10",X"FB",X"C9",X"30", + X"32",X"30",X"34",X"30",X"38",X"00",X"FF",X"01",X"00",X"00",X"01",X"FF",X"00",X"00",X"FF",X"01", + X"00",X"00",X"01",X"FF",X"00",X"00",X"FF",X"01",X"00",X"00",X"01",X"FF",X"00",X"00",X"FF",X"01", + X"00",X"00",X"01",X"FF",X"00",X"55",X"2A",X"55",X"2A",X"55",X"55",X"55",X"55",X"55",X"2A",X"55", + X"2A",X"52",X"4A",X"A5",X"94",X"25",X"25",X"25",X"25",X"22",X"22",X"22",X"22",X"01",X"01",X"01", + X"01",X"58",X"02",X"08",X"07",X"60",X"09",X"10",X"0E",X"68",X"10",X"70",X"17",X"14",X"19",X"52", + X"4A",X"A5",X"94",X"AA",X"2A",X"55",X"55",X"55",X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"92", + X"24",X"25",X"49",X"48",X"24",X"22",X"91",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"55",X"2A",X"55",X"2A",X"55",X"55",X"55", + X"55",X"AA",X"2A",X"55",X"55",X"55",X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"48",X"24",X"22", + X"91",X"21",X"44",X"44",X"08",X"58",X"02",X"34",X"08",X"D8",X"09",X"B4",X"0F",X"58",X"11",X"08", + X"16",X"34",X"17",X"55",X"55",X"55",X"55",X"D5",X"6A",X"D5",X"6A",X"AA",X"6A",X"55",X"D5",X"55", + X"55",X"55",X"55",X"AA",X"2A",X"55",X"55",X"92",X"24",X"92",X"24",X"22",X"22",X"22",X"22",X"A4", + X"01",X"54",X"06",X"F8",X"07",X"A8",X"0C",X"D4",X"0D",X"84",X"12",X"B0",X"13",X"D5",X"6A",X"D5", + X"6A",X"D6",X"5A",X"AD",X"B5",X"D6",X"5A",X"AD",X"B5",X"D5",X"6A",X"D5",X"6A",X"AA",X"6A",X"55", + X"D5",X"92",X"24",X"25",X"49",X"48",X"24",X"22",X"91",X"A4",X"01",X"54",X"06",X"F8",X"07",X"A8", + X"0C",X"D4",X"0D",X"FE",X"FF",X"FF",X"FF",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"B6", + X"6D",X"6D",X"DB",X"6D",X"6D",X"6D",X"6D",X"D6",X"5A",X"AD",X"B5",X"25",X"25",X"25",X"25",X"92", + X"24",X"92",X"24",X"2C",X"01",X"DC",X"05",X"08",X"07",X"B8",X"0B",X"E4",X"0C",X"FE",X"FF",X"FF", + X"FF",X"D5",X"6A",X"D5",X"6A",X"D5",X"6A",X"D5",X"6A",X"B6",X"6D",X"6D",X"DB",X"6D",X"6D",X"6D", + X"6D",X"D6",X"5A",X"AD",X"B5",X"48",X"24",X"22",X"91",X"92",X"24",X"92",X"24",X"2C",X"01",X"DC", + X"05",X"08",X"07",X"B8",X"0B",X"E4",X"0C",X"FE",X"FF",X"FF",X"FF",X"0E",X"00",X"C3",X"FD",X"33", + X"0E",X"0C",X"C3",X"FD",X"33",X"0E",X"18",X"C3",X"FD",X"33",X"0E",X"24",X"C3",X"FD",X"33",X"0E", + X"30",X"C3",X"FD",X"33",X"0E",X"3C",X"C3",X"FD",X"33",X"0E",X"48",X"C3",X"FD",X"33",X"0E",X"54", + X"C3",X"FD",X"33",X"0E",X"60",X"C3",X"FD",X"33",X"0E",X"6C",X"C3",X"FD",X"33",X"3A",X"00",X"4F", + X"A7",X"CC",X"7B",X"35",X"06",X"06",X"DD",X"21",X"0C",X"4F",X"DD",X"6E",X"00",X"DD",X"66",X"01", + X"7E",X"FE",X"F0",X"CA",X"3F",X"34",X"FE",X"F1",X"CA",X"CC",X"34",X"FE",X"F2",X"CA",X"F8",X"34", + X"FE",X"F3",X"CA",X"D8",X"34",X"FE",X"F5",X"CA",X"71",X"35",X"FE",X"F6",X"CA",X"05",X"35",X"FE", + X"F7",X"CA",X"5D",X"35",X"FE",X"F8",X"CA",X"67",X"35",X"FE",X"FF",X"CA",X"2C",X"35",X"76",X"E5", + X"3E",X"01",X"D7",X"4F",X"21",X"2E",X"4F",X"DF",X"79",X"84",X"CD",X"B7",X"34",X"12",X"CD",X"AB", + X"35",X"DF",X"7C",X"81",X"12",X"E1",X"E5",X"3E",X"02",X"D7",X"4F",X"21",X"2E",X"4F",X"DF",X"79", + X"85",X"CD",X"B7",X"34",X"1B",X"12",X"CD",X"AB",X"35",X"DF",X"7D",X"81",X"1B",X"12",X"21",X"0F", + X"4F",X"78",X"D7",X"E5",X"3C",X"4F",X"21",X"3E",X"4F",X"DF",X"79",X"CB",X"2F",X"D7",X"FE",X"FF", + X"C2",X"87",X"34",X"0E",X"00",X"18",X"EF",X"E1",X"71",X"5F",X"E1",X"3E",X"03",X"D7",X"57",X"D5", + X"21",X"4E",X"4F",X"DF",X"E1",X"EB",X"72",X"2B",X"3A",X"09",X"4E",X"4F",X"3A",X"72",X"4E",X"A1", + X"28",X"04",X"3E",X"C0",X"AB",X"5F",X"73",X"21",X"17",X"4F",X"78",X"D7",X"3D",X"77",X"11",X"00", + X"00",X"20",X"62",X"1E",X"04",X"18",X"5E",X"4F",X"CB",X"29",X"CB",X"29",X"CB",X"29",X"CB",X"29", + X"A7",X"F2",X"C9",X"34",X"F6",X"F0",X"0C",X"18",X"02",X"E6",X"0F",X"C9",X"EB",X"CD",X"AB",X"35", + X"EB",X"D5",X"23",X"56",X"23",X"5E",X"18",X"13",X"EB",X"21",X"0F",X"4F",X"78",X"D7",X"36",X"00", + X"EB",X"11",X"3E",X"4F",X"D5",X"23",X"5E",X"23",X"56",X"18",X"00",X"E1",X"D5",X"DF",X"EB",X"D1", + X"72",X"2B",X"73",X"11",X"03",X"00",X"18",X"1D",X"23",X"4E",X"21",X"17",X"4F",X"78",X"D7",X"71", + X"11",X"02",X"00",X"18",X"10",X"21",X"17",X"4F",X"78",X"D7",X"3D",X"77",X"11",X"00",X"00",X"20", + X"04",X"1E",X"01",X"18",X"00",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"19",X"DD",X"75",X"00",X"DD", + X"74",X"01",X"DD",X"2B",X"DD",X"2B",X"10",X"01",X"C9",X"C3",X"0A",X"34",X"21",X"1F",X"4F",X"78", + X"D7",X"36",X"01",X"21",X"20",X"4F",X"7E",X"23",X"A6",X"23",X"A6",X"23",X"A6",X"23",X"A6",X"23", + X"A6",X"11",X"00",X"00",X"28",X"CF",X"3A",X"02",X"4E",X"A7",X"CA",X"54",X"35",X"AF",X"32",X"00", + X"4F",X"C3",X"8F",X"06",X"F7",X"45",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"78",X"EF",X"1C", + X"30",X"47",X"11",X"01",X"00",X"18",X"AE",X"3E",X"40",X"32",X"AC",X"42",X"11",X"01",X"00",X"18", + X"A4",X"23",X"7E",X"32",X"BC",X"4E",X"11",X"02",X"00",X"18",X"9A",X"3A",X"02",X"4E",X"A7",X"20", + X"08",X"3E",X"02",X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"21",X"2D",X"81",X"06",X"00",X"09",X"11", + X"02",X"4F",X"01",X"0C",X"00",X"ED",X"B0",X"3E",X"01",X"32",X"00",X"4F",X"32",X"A4",X"4D",X"21", + X"1F",X"4F",X"3E",X"00",X"32",X"A5",X"4D",X"06",X"14",X"CF",X"C9",X"78",X"FE",X"06",X"20",X"04", + X"21",X"C6",X"4D",X"C9",X"21",X"FE",X"4C",X"C9",X"05",X"C5",X"78",X"FE",X"01",X"28",X"04",X"06", + X"00",X"18",X"06",X"3A",X"13",X"4E",X"E6",X"0F",X"47",X"DF",X"C1",X"C3",X"19",X"2C",X"CB",X"77", + X"CA",X"30",X"1F",X"3E",X"01",X"02",X"C9",X"21",X"00",X"00",X"22",X"D2",X"4D",X"C9",X"3A",X"08", + X"4D",X"E6",X"0F",X"CB",X"3F",X"CB",X"3F",X"2F",X"1E",X"1C",X"83",X"FE",X"18",X"20",X"02",X"3E", + X"36",X"32",X"0A",X"4C",X"C9",X"03",X"04",X"01",X"02",X"01",X"01",X"01",X"01",X"0C",X"01",X"01", + X"04",X"01",X"01",X"01",X"E8",X"4D",X"44",X"37",X"53",X"37",X"62",X"37",X"70",X"37",X"80",X"37", + X"90",X"37",X"9C",X"37",X"B3",X"37",X"C7",X"37",X"B4",X"3C",X"93",X"3C",X"BE",X"B4",X"DA",X"B4", + X"2C",X"3D",X"FF",X"3C",X"50",X"3D",X"16",X"38",X"24",X"38",X"CF",X"3C",X"D8",X"3C",X"22",X"3D", + X"EF",X"3C",X"36",X"3D",X"01",X"00",X"02",X"00",X"03",X"00",X"66",X"38",X"6E",X"38",X"CE",X"3B", + X"82",X"38",X"8C",X"38",X"96",X"38",X"A0",X"38",X"AA",X"38",X"B4",X"38",X"C4",X"38",X"19",X"39", + X"D4",X"38",X"02",X"39",X"EB",X"38",X"6A",X"3D",X"30",X"39",X"41",X"39",X"5A",X"39",X"67",X"39", + X"74",X"39",X"0D",X"3D",X"74",X"3D",X"1B",X"3D",X"8D",X"3D",X"06",X"3D",X"6A",X"3D",X"14",X"3D", + X"83",X"3D",X"DE",X"37",X"D4",X"83",X"4D",X"49",X"4B",X"59",X"40",X"43",X"48",X"45",X"4C",X"4F", + X"2F",X"81",X"2F",X"80",X"8C",X"02",X"4D",X"4D",X"4D",X"4D",X"4D",X"4D",X"4D",X"4D",X"4D",X"4D", + X"2F",X"85",X"2F",X"80",X"8D",X"02",X"49",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"2F",X"89",X"2F",X"80",X"8D",X"02",X"40",X"49",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"2F",X"89",X"2F",X"80",X"8D",X"02",X"40",X"40",X"49",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"2F",X"89",X"2F",X"80",X"8D",X"02",X"40",X"40",X"40",X"49",X"40",X"40",X"40",X"40",X"40",X"40", + X"2F",X"89",X"2F",X"80",X"8D",X"02",X"40",X"40",X"40",X"40",X"49",X"40",X"40",X"40",X"40",X"40", + X"2F",X"89",X"2F",X"80",X"8D",X"02",X"40",X"40",X"40",X"40",X"40",X"49",X"40",X"40",X"40",X"40", + X"2F",X"89",X"2F",X"80",X"8D",X"02",X"40",X"40",X"40",X"40",X"40",X"40",X"49",X"40",X"40",X"40", + X"2F",X"89",X"2F",X"80",X"8D",X"02",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"49",X"40",X"40", + X"2F",X"89",X"2F",X"80",X"8D",X"02",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"49",X"40", + X"2F",X"89",X"2F",X"80",X"8D",X"02",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"49", + X"2F",X"89",X"2F",X"80",X"8D",X"02",X"49",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"2F",X"89",X"2F",X"80",X"3B",X"80",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"40",X"40",X"2F", + X"8F",X"2F",X"80",X"3B",X"80",X"46",X"52",X"45",X"45",X"40",X"50",X"4C",X"41",X"59",X"2F",X"8F", + X"2F",X"80",X"8C",X"02",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"45",X"2F",X"85", + X"8C",X"02",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"54",X"57",X"4F",X"2F",X"85",X"2F",X"80", + X"92",X"02",X"47",X"41",X"4D",X"45",X"40",X"40",X"4F",X"56",X"45",X"52",X"2F",X"81",X"2F",X"80", + X"52",X"02",X"52",X"45",X"41",X"44",X"59",X"5B",X"2F",X"89",X"2F",X"90",X"ED",X"02",X"50",X"55", + X"53",X"48",X"40",X"53",X"54",X"41",X"52",X"54",X"40",X"42",X"55",X"54",X"54",X"4F",X"4E",X"2F", + X"87",X"2F",X"80",X"AF",X"02",X"31",X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E", + X"4C",X"59",X"40",X"2F",X"87",X"2F",X"80",X"AF",X"02",X"31",X"40",X"4F",X"52",X"40",X"32",X"40", + X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"2F",X"87",X"00",X"2F",X"00",X"80",X"00",X"B1",X"02", + X"32",X"40",X"4F",X"52",X"40",X"34",X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"2F",X"87", + X"00",X"2F",X"00",X"80",X"00",X"96",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"50",X"55",X"43", + X"4B",X"4D",X"41",X"4E",X"40",X"46",X"4F",X"52",X"40",X"40",X"40",X"30",X"30",X"30",X"40",X"5D", + X"5E",X"5F",X"2F",X"8E",X"2F",X"80",X"76",X"02",X"10",X"40",X"31",X"30",X"40",X"5D",X"5E",X"5F", + X"2F",X"9F",X"2F",X"80",X"78",X"02",X"14",X"40",X"35",X"30",X"40",X"5D",X"5E",X"5F",X"2F",X"9F", + X"2F",X"80",X"5D",X"02",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"83",X"2F",X"80",X"C5", + X"02",X"40",X"2F",X"81",X"2F",X"80",X"C5",X"02",X"40",X"2F",X"81",X"2F",X"80",X"C8",X"02",X"40", + X"2F",X"83",X"2F",X"80",X"C8",X"02",X"40",X"52",X"4F",X"4D",X"50",X"3B",X"3B",X"3B",X"3B",X"3B", + X"3B",X"3B",X"2F",X"83",X"2F",X"80",X"25",X"80",X"81",X"85",X"2F",X"81",X"2F",X"90",X"6E",X"02", + X"53",X"55",X"50",X"45",X"52",X"40",X"50",X"41",X"43",X"3B",X"4D",X"41",X"4E",X"2F",X"89",X"2F", + X"80",X"4D",X"41",X"4E",X"2F",X"89",X"2F",X"80",X"2F",X"90",X"00",X"00",X"2E",X"80",X"86",X"8B", + X"8D",X"8E",X"2F",X"8F",X"2F",X"90",X"30",X"80",X"40",X"40",X"40",X"40",X"2F",X"94",X"2F",X"90", + X"32",X"80",X"89",X"8A",X"8D",X"8E",X"2F",X"89",X"2F",X"90",X"34",X"80",X"89",X"8A",X"8D",X"8E", + X"2F",X"89",X"2F",X"90",X"04",X"03",X"4D",X"45",X"4D",X"4F",X"52",X"59",X"40",X"40",X"4F",X"4B", + X"2F",X"8F",X"2F",X"80",X"04",X"03",X"42",X"41",X"44",X"40",X"40",X"40",X"40",X"52",X"40",X"4D", + X"2F",X"8F",X"2F",X"80",X"08",X"03",X"31",X"40",X"43",X"4F",X"49",X"4E",X"40",X"40",X"31",X"40", + X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"2F",X"8F",X"2F",X"80",X"08",X"03",X"32",X"40",X"43", + X"4F",X"49",X"4E",X"53",X"40",X"31",X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"2F",X"8F", + X"2F",X"80",X"08",X"03",X"31",X"40",X"43",X"4F",X"49",X"4E",X"40",X"40",X"32",X"40",X"43",X"52", + X"45",X"44",X"49",X"54",X"53",X"2F",X"8F",X"2F",X"80",X"08",X"03",X"46",X"52",X"45",X"45",X"40", + X"40",X"50",X"4C",X"41",X"59",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"2F",X"8F",X"2F",X"80", + X"0A",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"4E",X"4F",X"4E",X"45",X"2F",X"8F",X"2F", + X"80",X"0A",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"2F",X"8F",X"2F",X"80",X"0C",X"03",X"50", + X"55",X"43",X"4B",X"4D",X"41",X"4E",X"2F",X"8F",X"2F",X"80",X"0E",X"03",X"54",X"41",X"42",X"4C", + X"45",X"40",X"40",X"2F",X"8F",X"2F",X"80",X"0E",X"03",X"55",X"50",X"52",X"49",X"47",X"48",X"54", + X"2F",X"8F",X"2F",X"80",X"0A",X"02",X"30",X"30",X"30",X"2F",X"8F",X"2F",X"80",X"6B",X"01",X"40", + X"2F",X"85",X"2F",X"3D",X"59",X"02",X"B6",X"02",X"C3",X"02",X"D0",X"02",X"C3",X"02",X"00",X"00", + X"03",X"03",X"03",X"03",X"03",X"03",X"16",X"B5",X"25",X"B5",X"78",X"02",X"97",X"02",X"1F",X"03", + X"3D",X"03",X"E6",X"02",X"06",X"B5",X"5B",X"03",X"6B",X"03",X"7B",X"03",X"8B",X"03",X"9B",X"03", + X"AB",X"03",X"BB",X"03",X"CB",X"03",X"DB",X"03",X"EB",X"03",X"6A",X"B5",X"7A",X"B5",X"8A",X"B5", + X"9A",X"B5",X"BA",X"B5",X"AA",X"B5",X"34",X"B5",X"43",X"B5",X"50",X"B5",X"5D",X"B5",X"AC",X"B4", + X"94",X"36",X"A4",X"36",X"B4",X"36",X"C4",X"36",X"D4",X"36",X"E4",X"36",X"F4",X"36",X"04",X"37", + X"14",X"37",X"24",X"37",X"34",X"37",X"04",X"1C",X"02",X"02",X"0A",X"01",X"11",X"02",X"02",X"0C", + X"01",X"01",X"0E",X"01",X"01",X"01",X"01",X"03",X"01",X"07",X"1A",X"01",X"01",X"03",X"13",X"01", + X"01",X"05",X"18",X"04",X"03",X"07",X"01",X"03",X"0E",X"04",X"0C",X"01",X"0F",X"01",X"01",X"01", + X"01",X"04",X"02",X"07",X"16",X"02",X"02",X"03",X"01",X"01",X"01",X"01",X"0F",X"01",X"01",X"01", + X"03",X"02",X"02",X"15",X"03",X"04",X"01",X"01",X"01",X"01",X"15",X"03",X"0B",X"01",X"01",X"01", + X"01",X"0F",X"01",X"01",X"01",X"3C",X"01",X"01",X"01",X"01",X"0A",X"01",X"01",X"01",X"01",X"0F", + X"0E",X"13",X"0E",X"11",X"0E",X"11",X"01",X"01",X"01",X"01",X"0A",X"01",X"01",X"01",X"01",X"00", + X"02",X"40",X"01",X"3E",X"3D",X"10",X"40",X"40",X"0E",X"3D",X"3E",X"10",X"C2",X"43",X"01",X"3E", + X"3D",X"10",X"21",X"C3",X"40",X"11",X"E6",X"39",X"36",X"14",X"1A",X"A7",X"C8",X"13",X"85",X"6F", + X"D2",X"68",X"3A",X"24",X"18",X"F2",X"90",X"14",X"94",X"0F",X"98",X"15",X"9C",X"07",X"A0",X"14", + X"A4",X"17",X"A8",X"16",X"AC",X"16",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"9C",X"16",X"9C",X"16",X"9C",X"16",X"73",X"20", + X"00",X"0C",X"00",X"0A",X"1F",X"00",X"72",X"20",X"FB",X"87",X"00",X"02",X"0F",X"00",X"59",X"01", + X"06",X"08",X"00",X"00",X"02",X"00",X"59",X"01",X"06",X"09",X"00",X"00",X"02",X"00",X"59",X"02", + X"06",X"0A",X"00",X"00",X"02",X"00",X"59",X"03",X"06",X"0B",X"00",X"00",X"02",X"00",X"59",X"04", + X"06",X"0C",X"00",X"06",X"02",X"00",X"24",X"00",X"06",X"08",X"02",X"00",X"0A",X"00",X"36",X"07", + X"87",X"6F",X"00",X"00",X"04",X"00",X"70",X"04",X"00",X"00",X"00",X"00",X"08",X"00",X"1C",X"70", + X"8B",X"08",X"00",X"01",X"06",X"00",X"1C",X"70",X"8B",X"08",X"00",X"01",X"06",X"00",X"56",X"0C", + X"FF",X"8C",X"00",X"02",X"08",X"00",X"56",X"00",X"02",X"0A",X"07",X"03",X"0C",X"00",X"36",X"38", + X"FE",X"12",X"F8",X"04",X"0F",X"FC",X"22",X"01",X"01",X"06",X"00",X"01",X"07",X"00",X"01",X"02", + X"04",X"08",X"10",X"20",X"40",X"80",X"01",X"03",X"06",X"0C",X"18",X"30",X"60",X"00",X"57",X"5C", + X"61",X"67",X"6D",X"74",X"7B",X"82",X"8A",X"92",X"9A",X"A3",X"AD",X"B8",X"C3",X"D4",X"3B",X"F3", + X"3B",X"58",X"3C",X"95",X"3C",X"DE",X"3C",X"DF",X"3C",X"01",X"02",X"01",X"1B",X"03",X"03",X"1A", + X"03",X"03",X"1A",X"03",X"03",X"1A",X"01",X"01",X"01",X"01",X"01",X"01",X"5A",X"01",X"01",X"01", + X"01",X"01",X"21",X"20",X"20",X"1A",X"01",X"01",X"01",X"01",X"01",X"61",X"20",X"20",X"20",X"1A", + X"01",X"01",X"01",X"01",X"01",X"01",X"5B",X"04",X"1B",X"06",X"1A",X"06",X"1A",X"06",X"1B",X"01", + X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"06",X"1A",X"06",X"1A",X"06",X"1B",X"01",X"01", + X"01",X"F1",X"03",X"F2",X"03",X"F3",X"0A",X"F4",X"02",X"90",X"7C",X"7B",X"7A",X"79",X"79",X"78", + X"97",X"76",X"75",X"74",X"73",X"72",X"91",X"A8",X"88",X"60",X"4A",X"4C",X"91",X"95",X"88",X"95", + X"91",X"95",X"88",X"95",X"91",X"95",X"88",X"95",X"95",X"98",X"94",X"97",X"93",X"96",X"88",X"96", + X"93",X"96",X"88",X"96",X"93",X"96",X"88",X"96",X"B6",X"B3",X"75",X"76",X"77",X"78",X"78",X"75", + X"73",X"68",X"91",X"95",X"88",X"95",X"91",X"95",X"88",X"95",X"86",X"96",X"95",X"92",X"93",X"8C", + X"8A",X"88",X"86",X"90",X"90",X"96",X"95",X"90",X"90",X"86",X"90",X"96",X"90",X"96",X"91",X"88", + X"81",X"FF",X"47",X"30",X"4B",X"10",X"4C",X"10",X"4D",X"10",X"4E",X"10",X"77",X"20",X"4E",X"10", + X"4D",X"10",X"4C",X"10",X"4A",X"10",X"47",X"10",X"46",X"10",X"65",X"30",X"66",X"30",X"67",X"40", + X"70",X"F0",X"FB",X"3B",X"F1",X"00",X"F2",X"02",X"F3",X"0A",X"F4",X"00",X"88",X"6C",X"71",X"72", + X"73",X"73",X"71",X"93",X"6C",X"73",X"75",X"76",X"76",X"75",X"96",X"7C",X"7A",X"78",X"76",X"75", + X"96",X"6C",X"91",X"A0",X"88",X"75",X"76",X"77",X"78",X"71",X"73",X"74",X"75",X"71",X"75",X"71", + X"68",X"68",X"65",X"66",X"67",X"A8",X"AB",X"AC",X"8C",X"86",X"76",X"75",X"6C",X"71",X"75",X"73", + X"6B",X"6C",X"73",X"76",X"7A",X"78",X"78",X"76",X"73",X"6C",X"AA",X"A8",X"71",X"73",X"74",X"75", + X"6A",X"6B",X"6C",X"73",X"75",X"76",X"77",X"78",X"71",X"73",X"74",X"75",X"71",X"75",X"71",X"68", + X"48",X"40",X"68",X"67",X"68",X"AA",X"A9",X"AA",X"6A",X"60",X"8A",X"76",X"75",X"73",X"71",X"71", + X"73",X"95",X"75",X"73",X"71",X"68",X"68",X"61",X"63",X"6A",X"A8",X"6C",X"76",X"6A",X"6C",X"91", + X"90",X"91",X"FF",X"96",X"03",X"40",X"41",X"44",X"44",X"49",X"54",X"49",X"4F",X"4E",X"41",X"4C", + X"40",X"40",X"40",X"40",X"41",X"54",X"40",X"40",X"40",X"30",X"30",X"30",X"40",X"5D",X"5E",X"5F", + X"2F",X"95",X"2F",X"80",X"5A",X"02",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"2F",X"07",X"07", + X"07",X"01",X"01",X"01",X"01",X"2F",X"80",X"50",X"40",X"40",X"40",X"2F",X"87",X"2F",X"80",X"5B", + X"02",X"40",X"2F",X"81",X"2F",X"80",X"2F",X"80",X"92",X"02",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"2F",X"81",X"2F",X"80",X"6E",X"02",X"40",X"2F",X"81",X"2F",X"80",X"92", + X"02",X"40",X"40",X"54",X"55",X"52",X"42",X"4F",X"5B",X"40",X"40",X"2F",X"89",X"2F",X"80",X"6E", + X"02",X"40",X"2F",X"83",X"2F",X"80",X"6E",X"02",X"40",X"2F",X"89",X"2F",X"80",X"6E",X"02",X"40", + X"2F",X"85",X"2F",X"80",X"3D",X"02",X"40",X"2F",X"81",X"2F",X"80",X"6E",X"02",X"40",X"2F",X"87", + X"2F",X"80",X"2F",X"02",X"4D",X"49",X"4B",X"59",X"2F",X"87",X"2F",X"80",X"2F",X"02",X"4D",X"49", + X"4B",X"59",X"2F",X"85",X"2F",X"80",X"49",X"03",X"41",X"54",X"52",X"41",X"50",X"41",X"4E",X"44", + X"4F",X"40",X"55",X"4E",X"40",X"43",X"4F",X"52",X"41",X"5A",X"4F",X"4E",X"2F",X"88",X"2F",X"80", + X"53",X"03",X"56",X"49",X"44",X"41",X"40",X"45",X"58",X"54",X"52",X"41",X"40",X"4F",X"40",X"50", + X"55",X"4E",X"54",X"41",X"47",X"45",X"2F",X"82",X"2F",X"80",X"2F",X"02",X"40",X"40",X"40",X"40", + X"2F",X"8F",X"2F",X"80",X"6B",X"02",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"2F", + X"85",X"2F",X"80",X"2F",X"02",X"40",X"40",X"40",X"40",X"2F",X"87",X"2F",X"80",X"6B",X"02",X"40", + X"2F",X"8F",X"2F",X"80",X"0C",X"03",X"40",X"2F",X"8F",X"2F",X"80",X"3A",X"78",X"4C",X"E6",X"0F", + X"E7",X"6A",X"3E",X"C1",X"3D",X"D9",X"3E",X"76",X"80",X"BC",X"80",X"FA",X"80",X"BC",X"80",X"91", + X"80",X"C9",X"3D",X"D9",X"3E",X"9F",X"80",X"FA",X"80",X"C9",X"3D",X"BC",X"80",X"83",X"80",X"FA", + X"80",X"3E",X"02",X"32",X"70",X"4C",X"C3",X"C9",X"3D",X"3A",X"02",X"4E",X"FE",X"10",X"C4",X"04", + X"97",X"3A",X"02",X"4E",X"E7",X"CA",X"B5",X"F8",X"3D",X"FE",X"3D",X"0C",X"00",X"CB",X"33",X"04", + X"3E",X"D0",X"33",X"0A",X"3E",X"D5",X"33",X"10",X"3E",X"DA",X"33",X"1C",X"3E",X"DF",X"33",X"1C", + X"3E",X"1C",X"3E",X"1C",X"3E",X"08",X"3F",X"C9",X"EF",X"20",X"21",X"C3",X"8F",X"06",X"EF",X"20", + X"1B",X"C3",X"8F",X"06",X"EF",X"20",X"1C",X"C3",X"8F",X"06",X"EF",X"20",X"1D",X"C3",X"8F",X"06", + X"EF",X"20",X"1E",X"C3",X"8F",X"06",X"EF",X"20",X"1F",X"C3",X"8F",X"06",X"EF",X"20",X"20",X"C3", + X"8F",X"06",X"EF",X"20",X"22",X"C3",X"8F",X"06",X"EF",X"20",X"23",X"C3",X"8F",X"06",X"EF",X"20", + X"24",X"C3",X"8F",X"06",X"3A",X"01",X"4F",X"E6",X"10",X"20",X"0A",X"EF",X"1C",X"0C",X"EF",X"20", + X"0A",X"EF",X"20",X"25",X"C9",X"EF",X"1C",X"0D",X"EF",X"20",X"09",X"C9",X"3A",X"01",X"4F",X"E6", + X"10",X"20",X"07",X"EF",X"20",X"0A",X"EF",X"20",X"25",X"C9",X"3E",X"99",X"CD",X"2C",X"AF",X"E6", + X"01",X"28",X"F7",X"EF",X"20",X"09",X"C9",X"C3",X"8F",X"06",X"3A",X"02",X"4E",X"FE",X"00",X"20", + X"68",X"3A",X"78",X"4C",X"A7",X"20",X"62",X"EF",X"30",X"25",X"3A",X"02",X"4E",X"FE",X"20",X"28", + X"05",X"FE",X"10",X"D4",X"1B",X"97",X"E7",X"CA",X"B5",X"32",X"97",X"32",X"97",X"32",X"97",X"32", + X"97",X"32",X"97",X"32",X"97",X"32",X"97",X"32",X"97",X"32",X"97",X"32",X"97",X"32",X"97",X"32", + X"97",X"32",X"97",X"32",X"97",X"32",X"97",X"CA",X"B5",X"F8",X"3D",X"FE",X"3D",X"0C",X"00",X"CB", + X"33",X"04",X"3E",X"D0",X"33",X"0A",X"3E",X"D5",X"33",X"10",X"3E",X"DA",X"33",X"1C",X"3E",X"DF", + X"33",X"1C",X"3E",X"1C",X"3E",X"1C",X"3E",X"08",X"3F",X"C9",X"3A",X"01",X"4F",X"3C",X"E6",X"1F", + X"32",X"01",X"4F",X"E6",X"0F",X"C0",X"C3",X"8F",X"06",X"3A",X"02",X"4E",X"FE",X"10",X"C4",X"1B", + X"97",X"3A",X"02",X"4E",X"E7",X"CA",X"B5",X"F8",X"3D",X"FE",X"3D",X"0C",X"00",X"CB",X"33",X"04", + X"3E",X"D0",X"33",X"0A",X"3E",X"D5",X"33",X"10",X"3E",X"DA",X"33",X"1C",X"3E",X"DF",X"33",X"1C", + X"3E",X"1C",X"3E",X"1C",X"3E",X"08",X"3F",X"C9",X"AF",X"32",X"14",X"4E",X"3A",X"78",X"4C",X"E6", + X"0F",X"32",X"13",X"4E",X"C3",X"82",X"06",X"3A",X"01",X"4F",X"3C",X"E6",X"1F",X"32",X"01",X"4F", + X"E6",X"07",X"CD",X"2C",X"AF",X"E6",X"0F",X"E7",X"92",X"3F",X"38",X"3F",X"56",X"3F",X"74",X"3F", + X"74",X"3F",X"56",X"3F",X"38",X"3F",X"92",X"3F",X"21",X"63",X"40",X"11",X"49",X"3B",X"36",X"10", + X"7C",X"C6",X"04",X"67",X"36",X"01",X"7C",X"C6",X"FC",X"67",X"1A",X"A7",X"C8",X"13",X"85",X"6F", + X"D2",X"3E",X"3F",X"24",X"18",X"E8",X"21",X"63",X"40",X"11",X"49",X"3B",X"36",X"12",X"7C",X"C6", + X"04",X"67",X"36",X"07",X"7C",X"C6",X"FC",X"67",X"1A",X"A7",X"C8",X"13",X"85",X"6F",X"D2",X"5C", + X"3F",X"24",X"18",X"E8",X"21",X"63",X"40",X"11",X"49",X"3B",X"36",X"14",X"7C",X"C6",X"04",X"67", + X"36",X"0F",X"7C",X"C6",X"FC",X"67",X"1A",X"A7",X"C8",X"13",X"85",X"6F",X"D2",X"7A",X"3F",X"24", + X"18",X"E8",X"21",X"63",X"40",X"11",X"49",X"3B",X"36",X"40",X"1A",X"A7",X"C8",X"13",X"85",X"6F", + X"D2",X"98",X"3F",X"24",X"18",X"F2",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"AB",X"00",X"00",X"00",X"00",X"00",X"00",X"F5",X"C5",X"E5",X"CD",X"A0",X"B3",X"E1",X"C1",X"F1"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..a49aa779 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"C9",X"E6",X"07",X"CD",X"2C",X"AF",X"E6",X"00",X"E7",X"17",X"80",X"56",X"3F",X"74",X"3F",X"74", + X"3F",X"56",X"3F",X"38",X"3F",X"92",X"3F",X"26",X"40",X"3A",X"01",X"4F",X"E6",X"0F",X"F6",X"60", + X"C6",X"03",X"6F",X"2D",X"11",X"49",X"3B",X"36",X"40",X"7C",X"C6",X"04",X"67",X"36",X"0F",X"7C", + X"C6",X"FC",X"67",X"1A",X"A7",X"28",X"09",X"13",X"85",X"6F",X"D2",X"27",X"80",X"24",X"18",X"E7", + X"26",X"40",X"3A",X"01",X"4F",X"E6",X"0F",X"F6",X"60",X"C6",X"03",X"6F",X"11",X"49",X"3B",X"36", + X"14",X"7C",X"C6",X"04",X"67",X"36",X"0F",X"7C",X"C6",X"FC",X"67",X"1A",X"A7",X"C8",X"13",X"85", + X"6F",X"D2",X"4F",X"80",X"24",X"18",X"E8",X"C9",X"3E",X"00",X"32",X"70",X"4C",X"3E",X"01",X"32", + X"13",X"4E",X"C3",X"08",X"3F",X"C9",X"3E",X"01",X"32",X"70",X"4C",X"3E",X"02",X"32",X"13",X"4E", + X"C3",X"08",X"3F",X"3E",X"02",X"32",X"70",X"4C",X"3E",X"03",X"32",X"13",X"4E",X"C3",X"08",X"3F", + X"C9",X"3E",X"01",X"32",X"70",X"4C",X"3E",X"09",X"32",X"13",X"4E",X"C3",X"08",X"3F",X"C9",X"3E", + X"02",X"32",X"70",X"4C",X"3E",X"0C",X"32",X"13",X"4E",X"C3",X"08",X"3F",X"C9",X"3E",X"02",X"32", + X"70",X"4C",X"3E",X"0D",X"32",X"13",X"4E",X"C3",X"08",X"3F",X"C9",X"C9",X"3A",X"02",X"4E",X"FE", + X"18",X"C4",X"04",X"97",X"3A",X"02",X"4E",X"E7",X"CA",X"B5",X"F8",X"3D",X"FE",X"3D",X"0C",X"00", + X"04",X"3E",X"0A",X"3E",X"10",X"3E",X"EE",X"33",X"10",X"3E",X"22",X"3E",X"F3",X"33",X"F8",X"33", + X"2E",X"3E",X"FE",X"3D",X"FE",X"3D",X"04",X"3E",X"0A",X"3E",X"10",X"3E",X"10",X"3E",X"E4",X"33", + X"22",X"3E",X"E9",X"33",X"1C",X"3E",X"DF",X"33",X"08",X"3F",X"AF",X"32",X"70",X"4C",X"3A",X"02", + X"4E",X"FE",X"10",X"C4",X"04",X"97",X"3A",X"02",X"4E",X"E7",X"CA",X"B5",X"F8",X"3D",X"FE",X"3D", + X"0C",X"00",X"CB",X"33",X"04",X"3E",X"D0",X"33",X"0A",X"3E",X"D5",X"33",X"10",X"3E",X"DA",X"33", + X"E4",X"33",X"22",X"3E",X"E9",X"33",X"1C",X"3E",X"DF",X"33",X"08",X"3F",X"C9",X"42",X"82",X"41", + X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"65",X"82",X"75",X"82",X"41",X"82",X"41", + X"82",X"41",X"82",X"41",X"82",X"65",X"82",X"98",X"82",X"A8",X"82",X"41",X"82",X"41",X"82",X"41", + X"82",X"65",X"82",X"98",X"82",X"CB",X"82",X"EB",X"82",X"41",X"82",X"41",X"82",X"65",X"82",X"98", + X"82",X"CB",X"82",X"FE",X"82",X"0E",X"83",X"41",X"82",X"65",X"82",X"98",X"82",X"CB",X"82",X"FE", + X"82",X"41",X"82",X"2D",X"83",X"57",X"84",X"61",X"84",X"6B",X"84",X"75",X"84",X"41",X"82",X"43", + X"83",X"42",X"82",X"75",X"82",X"A8",X"82",X"EB",X"82",X"41",X"82",X"89",X"83",X"57",X"84",X"61", + X"84",X"6B",X"84",X"75",X"84",X"41",X"82",X"7F",X"84",X"55",X"82",X"88",X"82",X"BB",X"82",X"DB", + X"82",X"0E",X"83",X"A5",X"83",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41", + X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41", + X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41", + X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41", + X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41", + X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41", + X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41", + X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41", + X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41", + X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41",X"82",X"41", + X"82",X"FF",X"F1",X"00",X"80",X"F3",X"0A",X"84",X"F2",X"70",X"F0",X"10",X"00",X"01",X"F2",X"40", + X"F0",X"10",X"00",X"01",X"FF",X"F3",X"0A",X"84",X"F2",X"70",X"F0",X"F0",X"00",X"01",X"F2",X"70", + X"F0",X"10",X"00",X"01",X"FF",X"F3",X"0A",X"84",X"F2",X"70",X"F0",X"00",X"00",X"01",X"F2",X"40", + X"F0",X"00",X"00",X"01",X"FF",X"F1",X"00",X"90",X"F3",X"0A",X"84",X"F2",X"70",X"F0",X"10",X"00", + X"03",X"F2",X"40",X"F0",X"10",X"00",X"03",X"FF",X"F3",X"0A",X"84",X"F2",X"70",X"F0",X"F0",X"00", + X"03",X"F2",X"70",X"F0",X"10",X"00",X"03",X"FF",X"F3",X"0A",X"84",X"F2",X"70",X"F0",X"00",X"00", + X"03",X"F2",X"40",X"F0",X"00",X"00",X"03",X"FF",X"F1",X"00",X"A0",X"F3",X"0A",X"84",X"F2",X"70", + X"F0",X"10",X"00",X"05",X"F2",X"40",X"F0",X"10",X"00",X"05",X"FF",X"F3",X"0A",X"84",X"F2",X"70", + X"F0",X"F0",X"00",X"05",X"F2",X"70",X"F0",X"10",X"00",X"05",X"FF",X"F3",X"0A",X"84",X"F2",X"70", + X"F0",X"00",X"00",X"05",X"F2",X"40",X"F0",X"00",X"00",X"05",X"FF",X"F3",X"0A",X"84",X"F2",X"70", + X"F0",X"F0",X"00",X"07",X"F2",X"70",X"F0",X"10",X"00",X"07",X"FF",X"F1",X"00",X"B0",X"F3",X"0A", + X"84",X"F2",X"70",X"F0",X"10",X"00",X"07",X"F2",X"40",X"F0",X"10",X"00",X"07",X"FF",X"F3",X"0A", + X"84",X"F2",X"70",X"F0",X"00",X"00",X"07",X"F2",X"40",X"F0",X"00",X"00",X"07",X"FF",X"F1",X"00", + X"C0",X"F3",X"E2",X"83",X"F2",X"70",X"F0",X"10",X"00",X"09",X"F2",X"40",X"F0",X"10",X"00",X"09", + X"F2",X"70",X"F0",X"00",X"00",X"09",X"F2",X"40",X"F0",X"00",X"00",X"09",X"FF",X"F1",X"00",X"70", + X"F3",X"D9",X"83",X"F2",X"40",X"F0",X"F0",X"00",X"05",X"F2",X"04",X"F3",X"EB",X"83",X"F0",X"00", + X"10",X"05",X"FF",X"F2",X"01",X"F3",X"D9",X"83",X"F0",X"00",X"01",X"05",X"FF",X"06",X"40",X"0E", + X"00",X"DD",X"21",X"00",X"00",X"DD",X"E5",X"E1",X"16",X"00",X"7E",X"5F",X"DD",X"19",X"E5",X"2A", + X"6A",X"4C",X"77",X"E1",X"23",X"0B",X"79",X"B0",X"20",X"EE",X"11",X"00",X"40",X"19",X"01",X"00", + X"40",X"16",X"00",X"7E",X"5F",X"DD",X"19",X"E5",X"2A",X"6A",X"4C",X"77",X"E1",X"23",X"0B",X"79", + X"B0",X"20",X"EE",X"DD",X"E5",X"E1",X"7D",X"AF",X"C9",X"F1",X"00",X"90",X"F2",X"30",X"F3",X"E2", + X"83",X"F0",X"00",X"00",X"05",X"F3",X"E2",X"83",X"F2",X"70",X"F0",X"10",X"00",X"05",X"F2",X"30", + X"F0",X"10",X"00",X"05",X"FF",X"F3",X"D9",X"83",X"F2",X"70",X"F0",X"F0",X"00",X"05",X"F2",X"30", + X"F0",X"F0",X"00",X"05",X"FF",X"1B",X"1B",X"19",X"19",X"1B",X"1B",X"32",X"32",X"FF",X"9B",X"9B", + X"99",X"99",X"9B",X"9B",X"B2",X"B2",X"FF",X"6E",X"6E",X"5A",X"5A",X"6E",X"6E",X"72",X"72",X"FF", + X"EE",X"EE",X"DA",X"DA",X"EE",X"EE",X"F2",X"F2",X"FF",X"37",X"37",X"2D",X"2D",X"37",X"37",X"2F", + X"2F",X"FF",X"B7",X"B7",X"AD",X"AD",X"B7",X"B7",X"AF",X"AF",X"FF",X"36",X"36",X"F1",X"F1",X"36", + X"36",X"F3",X"F3",X"FF",X"34",X"34",X"31",X"31",X"34",X"34",X"33",X"33",X"FF",X"24",X"24",X"24", + X"25",X"25",X"25",X"A4",X"A4",X"A4",X"A5",X"A5",X"A5",X"FF",X"24",X"24",X"24",X"25",X"25",X"25", + X"A4",X"A4",X"A4",X"A5",X"A5",X"A5",X"FF",X"26",X"26",X"26",X"27",X"27",X"27",X"FF",X"1F",X"FF", + X"1E",X"FF",X"10",X"10",X"10",X"14",X"14",X"14",X"16",X"16",X"16",X"FF",X"11",X"11",X"11",X"15", + X"15",X"15",X"17",X"17",X"17",X"FF",X"12",X"FF",X"13",X"FF",X"30",X"FF",X"18",X"18",X"18",X"18", + X"2C",X"2C",X"2C",X"2C",X"FF",X"07",X"FF",X"0F",X"FF",X"00",X"FF",X"01",X"FF",X"02",X"FF",X"03", + X"FF",X"04",X"FF",X"05",X"FF",X"06",X"FF",X"F3",X"FD",X"83",X"F0",X"E0",X"20",X"01",X"F2",X"50", + X"FF",X"F3",X"FD",X"83",X"F0",X"20",X"20",X"03",X"F2",X"50",X"FF",X"F3",X"FD",X"83",X"F0",X"E0", + X"E0",X"05",X"F2",X"50",X"FF",X"F3",X"FD",X"83",X"F0",X"20",X"E0",X"05",X"F2",X"50",X"FF",X"F3", + X"E2",X"83",X"F0",X"00",X"00",X"09",X"F2",X"50",X"FF",X"F2",X"01",X"F3",X"55",X"84",X"F0",X"00", + X"00",X"16",X"F2",X"01",X"F6",X"F2",X"01",X"FF",X"F2",X"01",X"F3",X"55",X"84",X"F0",X"00",X"00", + X"16",X"F2",X"01",X"F6",X"F2",X"01",X"FF",X"F2",X"01",X"F3",X"4F",X"84",X"F0",X"00",X"00",X"07", + X"F2",X"01",X"F6",X"F2",X"01",X"FF",X"F2",X"01",X"F3",X"55",X"84",X"F0",X"00",X"00",X"16",X"F2", + X"01",X"F6",X"F2",X"01",X"FF",X"F2",X"01",X"F3",X"55",X"84",X"F0",X"00",X"00",X"16",X"F2",X"01", + X"F6",X"F2",X"01",X"FF",X"F2",X"01",X"F3",X"55",X"84",X"F0",X"00",X"00",X"16",X"F2",X"01",X"F6", + X"F2",X"01",X"FF",X"F2",X"01",X"F3",X"55",X"84",X"F0",X"00",X"00",X"16",X"F2",X"01",X"F6",X"F2", + X"01",X"FF",X"F1",X"00",X"94",X"F3",X"B5",X"83",X"F2",X"72",X"F0",X"F0",X"00",X"09",X"F2",X"5F", + X"F6",X"FF",X"F1",X"00",X"94",X"F3",X"B5",X"83",X"F2",X"72",X"F0",X"F0",X"00",X"09",X"F2",X"5F", + X"F3",X"BE",X"83",X"F2",X"72",X"F0",X"14",X"00",X"09",X"F2",X"20",X"F6",X"FF",X"3A",X"09",X"4D", + X"E6",X"07",X"CB",X"3F",X"2F",X"1E",X"30",X"83",X"CB",X"47",X"20",X"02",X"3E",X"37",X"32",X"0A", + X"4C",X"C9",X"3A",X"08",X"4D",X"E6",X"07",X"CB",X"3F",X"1E",X"30",X"83",X"CB",X"47",X"20",X"02", + X"3E",X"34",X"32",X"0A",X"4C",X"C9",X"3A",X"09",X"4D",X"E6",X"07",X"CB",X"3F",X"1E",X"AC",X"83", + X"CB",X"47",X"20",X"02",X"3E",X"35",X"32",X"0A",X"4C",X"C9",X"3A",X"08",X"4D",X"E6",X"07",X"CB", + X"3F",X"2F",X"1E",X"F4",X"83",X"CB",X"47",X"20",X"02",X"3E",X"36",X"32",X"0A",X"4C",X"C9",X"3A", + X"0C",X"4C",X"FE",X"1E",X"C0",X"2A",X"26",X"4D",X"C9",X"3A",X"A4",X"4D",X"A7",X"C0",X"3A",X"D4", + X"4D",X"A7",X"CA",X"D2",X"85",X"3A",X"D2",X"4D",X"A7",X"CA",X"D2",X"85",X"3A",X"41",X"4C",X"47", + X"21",X"4C",X"87",X"DF",X"ED",X"5B",X"D2",X"4D",X"19",X"22",X"D2",X"4D",X"21",X"41",X"4C",X"34", + X"7E",X"E6",X"0F",X"C0",X"21",X"40",X"4C",X"35",X"FA",X"68",X"86",X"7E",X"57",X"CB",X"3F",X"CB", + X"3F",X"21",X"BC",X"4E",X"CB",X"EE",X"2A",X"42",X"4C",X"D7",X"4F",X"3E",X"03",X"A2",X"28",X"07", + X"CB",X"39",X"CB",X"39",X"3D",X"20",X"F9",X"3E",X"03",X"A1",X"07",X"07",X"07",X"07",X"32",X"41", + X"4C",X"C9",X"3A",X"70",X"4C",X"FE",X"02",X"20",X"1B",X"3A",X"0E",X"4E",X"FE",X"20",X"CA",X"05", + X"86",X"FE",X"40",X"CA",X"05",X"86",X"FE",X"A0",X"CA",X"05",X"86",X"FE",X"D0",X"C0",X"21",X"0D", + X"4E",X"C3",X"08",X"86",X"3A",X"0E",X"4E",X"FE",X"40",X"CA",X"05",X"86",X"FE",X"B0",X"C0",X"21", + X"0D",X"4E",X"C3",X"08",X"86",X"21",X"0C",X"4E",X"7E",X"A7",X"C0",X"34",X"3A",X"13",X"4E",X"FE", + X"07",X"38",X"0A",X"06",X"07",X"ED",X"5F",X"E6",X"1F",X"90",X"30",X"FD",X"80",X"21",X"50",X"86", + X"47",X"87",X"80",X"D7",X"32",X"0C",X"4C",X"23",X"7E",X"32",X"0D",X"4C",X"23",X"7E",X"32",X"D4", + X"4D",X"21",X"AB",X"86",X"CD",X"80",X"86",X"23",X"5E",X"23",X"56",X"ED",X"53",X"D2",X"4D",X"C9", + X"00",X"14",X"01",X"0F",X"02",X"15",X"03",X"07",X"04",X"14",X"05",X"17",X"06",X"16",X"00",X"14", + X"00",X"14",X"06",X"01",X"0F",X"07",X"02",X"15",X"08",X"00",X"14",X"09",X"04",X"14",X"0A",X"05", + X"15",X"0B",X"06",X"16",X"0C",X"07",X"09",X"0D",X"3A",X"D3",X"4D",X"C6",X"20",X"FE",X"40",X"38", + X"52",X"2A",X"42",X"4C",X"11",X"BB",X"86",X"37",X"3F",X"ED",X"52",X"20",X"23",X"21",X"B3",X"86", + X"CD",X"A1",X"94",X"69",X"60",X"ED",X"5F",X"E6",X"03",X"47",X"87",X"87",X"80",X"D7",X"5F",X"23", + X"56",X"ED",X"53",X"42",X"4C",X"23",X"7E",X"32",X"40",X"4C",X"3E",X"1F",X"32",X"41",X"4C",X"C9", + X"21",X"BB",X"86",X"22",X"42",X"4C",X"3E",X"1D",X"C3",X"97",X"86",X"62",X"8A",X"5B",X"8D",X"3D", + X"90",X"AC",X"93",X"95",X"8A",X"8E",X"8D",X"65",X"90",X"DF",X"93",X"FA",X"FF",X"55",X"55",X"01", + X"80",X"AA",X"02",X"3A",X"70",X"4C",X"FE",X"03",X"CA",X"AF",X"11",X"3E",X"00",X"32",X"0D",X"4C", + X"C3",X"AF",X"11",X"F5",X"ED",X"5B",X"D2",X"4D",X"7C",X"92",X"C6",X"03",X"FE",X"06",X"30",X"68", + X"7D",X"93",X"C6",X"03",X"FE",X"06",X"30",X"60",X"3A",X"0C",X"4C",X"FE",X"1E",X"CD",X"15",X"87", + X"3E",X"01",X"32",X"0D",X"4C",X"F1",X"C6",X"02",X"32",X"0C",X"4C",X"D6",X"02",X"C3",X"40",X"1C", + X"3A",X"70",X"4C",X"FE",X"02",X"28",X"03",X"FE",X"03",X"C0",X"3A",X"14",X"4E",X"FE",X"06",X"D0", + X"CD",X"BB",X"29",X"AF",X"C9",X"F5",X"DD",X"E5",X"3A",X"70",X"4C",X"FE",X"03",X"28",X"04",X"FE", + X"02",X"20",X"21",X"3A",X"70",X"4C",X"FE",X"03",X"20",X"03",X"3E",X"40",X"77",X"CD",X"65",X"1D", + X"DD",X"21",X"0D",X"42",X"DD",X"36",X"00",X"40",X"DD",X"36",X"01",X"40",X"DD",X"36",X"E0",X"40", + X"DD",X"36",X"E1",X"40",X"DD",X"E1",X"F1",X"C9",X"F1",X"C3",X"52",X"1C",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"FF",X"FE", + X"00",X"00",X"00",X"FF",X"00",X"00",X"FF",X"FE",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"FF",X"00",X"00",X"01",X"FF",X"01",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"01",X"00",X"00", + X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"01",X"00", + X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00", + X"01",X"00",X"01",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"40",X"FC",X"D0",X"D2", + X"D2",X"D2",X"D2",X"D4",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"DA",X"02", + X"DC",X"DC",X"FC",X"FC",X"D0",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D4",X"FC",X"DA",X"05", + X"DC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC", + X"FC",X"DA",X"08",X"DC",X"FC",X"DA",X"02",X"E6",X"EA",X"02",X"E7",X"D2",X"EB",X"02",X"E7",X"D2", + X"D2",X"D2",X"D2",X"D2",X"D2",X"EB",X"02",X"E7",X"D2",X"D2",X"D2",X"EB",X"02",X"E6",X"E8",X"E8", + X"E8",X"EA",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"15",X"DE",X"C0",X"C0",X"C0",X"E4",X"02", + X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"E8",X"E8",X"EA",X"02",X"E6",X"E8", + X"E8",X"E8",X"EA",X"02",X"E6",X"EA",X"02",X"E6",X"EA",X"02",X"DE",X"C0",X"C0",X"C0",X"E4",X"02", + X"DC",X"FC",X"DA",X"02",X"E7",X"EB",X"02",X"E7",X"E9",X"E9",X"E9",X"F5",X"E4",X"02",X"DE",X"F3", + X"E9",X"E9",X"EB",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"E7",X"E9",X"E9",X"E9",X"EB",X"02", + X"DC",X"FC",X"DA",X"09",X"DE",X"E4",X"02",X"DE",X"E4",X"05",X"DE",X"E4",X"02",X"DE",X"E4",X"08", + X"DC",X"FC",X"FA",X"E8",X"E8",X"EA",X"02",X"E6",X"E8",X"EA",X"02",X"DE",X"E4",X"02",X"DE",X"E4", + X"02",X"E6",X"E8",X"E8",X"F4",X"E4",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"E8",X"EA",X"02", + X"DC",X"FC",X"FB",X"E9",X"E9",X"EB",X"02",X"DE",X"C0",X"E4",X"02",X"E7",X"EB",X"02",X"E7",X"EB", + X"02",X"E7",X"E9",X"E9",X"F5",X"E4",X"02",X"E7",X"EB",X"02",X"DE",X"F3",X"E9",X"E9",X"EB",X"02", + X"DC",X"FC",X"DA",X"05",X"DE",X"C0",X"E4",X"0B",X"DE",X"E4",X"05",X"DE",X"E4",X"05",X"DC",X"FC", + X"DA",X"02",X"E6",X"EA",X"02",X"DE",X"C0",X"E4",X"02",X"E6",X"EA",X"02",X"EC",X"D3",X"D3",X"D3", + X"EE",X"02",X"DE",X"E4",X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"EA",X"02",X"DC",X"FC", + X"DA",X"02",X"DE",X"E4",X"02",X"E7",X"E9",X"EB",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"FC",X"FC", + X"DA",X"02",X"E7",X"EB",X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DE",X"E4",X"02",X"DC",X"FC", + X"DA",X"02",X"DE",X"E4",X"06",X"DE",X"E4",X"02",X"F0",X"FC",X"FC",X"FC",X"DA",X"05",X"DE",X"E4", + X"05",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"E8",X"F4", + X"E4",X"02",X"CE",X"FC",X"FC",X"FC",X"DA",X"02",X"E6",X"E8",X"E8",X"F4",X"E4",X"02",X"E6",X"E8", + X"E8",X"F4",X"E4",X"02",X"DC",X"00",X"62",X"02",X"01",X"13",X"01",X"01",X"01",X"02",X"01",X"04", + X"03",X"13",X"06",X"04",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"06",X"04",X"03",X"10",X"03",X"06",X"04",X"03", + X"10",X"03",X"06",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0C",X"03",X"01",X"01",X"01", + X"01",X"01",X"01",X"07",X"04",X"0C",X"03",X"06",X"07",X"04",X"0C",X"03",X"06",X"04",X"01",X"01", + X"01",X"04",X"0C",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"04",X"03",X"04",X"0F",X"03",X"03", + X"04",X"03",X"04",X"0F",X"03",X"03",X"04",X"03",X"01",X"01",X"01",X"01",X"0F",X"01",X"01",X"01", + X"03",X"04",X"03",X"19",X"04",X"03",X"19",X"04",X"03",X"01",X"01",X"01",X"01",X"0F",X"01",X"01", + X"01",X"03",X"04",X"03",X"04",X"0F",X"03",X"03",X"04",X"03",X"04",X"0F",X"03",X"03",X"04",X"01", + X"01",X"01",X"04",X"0C",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"07",X"04",X"0C",X"03",X"06", + X"07",X"04",X"0C",X"03",X"06",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0C",X"03",X"01", + X"01",X"01",X"01",X"01",X"01",X"04",X"03",X"10",X"03",X"06",X"04",X"03",X"10",X"03",X"06",X"04", + X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"06",X"04",X"03",X"13",X"06",X"04",X"02",X"01",X"13",X"01",X"01",X"01", + X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"1D",X"22",X"1D",X"39",X"40",X"20",X"40",X"3B", + X"63",X"40",X"7C",X"40",X"83",X"43",X"9C",X"43",X"63",X"40",X"7C",X"40",X"63",X"43",X"7C",X"43", + X"49",X"09",X"17",X"09",X"17",X"09",X"0E",X"E0",X"E0",X"E0",X"29",X"09",X"17",X"09",X"17",X"09", + X"00",X"00",X"76",X"8A",X"13",X"94",X"0C",X"7B",X"8A",X"22",X"94",X"F4",X"84",X"8A",X"27",X"4C", + X"F4",X"8E",X"8A",X"1C",X"4C",X"0C",X"80",X"AA",X"AA",X"BF",X"AA",X"80",X"0A",X"54",X"55",X"55", + X"55",X"FF",X"5F",X"55",X"EA",X"FF",X"57",X"55",X"F5",X"57",X"FF",X"15",X"40",X"55",X"EA",X"AF", + X"02",X"EA",X"FF",X"FF",X"AA",X"A7",X"8A",X"14",X"00",X"00",X"AC",X"8A",X"17",X"00",X"00",X"B2", + X"8A",X"1A",X"00",X"00",X"B9",X"8A",X"1D",X"55",X"40",X"55",X"55",X"BF",X"AA",X"80",X"AA",X"AA", + X"BF",X"AA",X"AA",X"80",X"AA",X"02",X"80",X"AA",X"AA",X"55",X"00",X"00",X"00",X"55",X"55",X"FD", + X"AA",X"40",X"FC",X"DA",X"02",X"DE",X"D8",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D6",X"D8", + X"D2",X"D2",X"D2",X"D2",X"D4",X"FC",X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"D8",X"D2",X"D2",X"D2", + X"D2",X"D4",X"FC",X"DA",X"02",X"DE",X"E4",X"08",X"DE",X"E4",X"05",X"DC",X"FC",X"FC",X"FC",X"FC", + X"DA",X"02",X"DE",X"E4",X"05",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"E8", + X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"EA",X"02",X"E7",X"D2",X"D2",X"D2",X"D2",X"EB",X"02",X"E7", + X"EB",X"02",X"E6",X"EA",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"DE",X"F3",X"E9",X"E9", + X"EB",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"0C",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"DE", + X"E4",X"02",X"DE",X"E4",X"05",X"DE",X"E4",X"02",X"DE",X"F2",X"E8",X"E8",X"E8",X"EA",X"02",X"E6", + X"EA",X"02",X"E6",X"E8",X"E8",X"F4",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"E7",X"EB",X"02",X"DE", + X"E4",X"02",X"E6",X"EA",X"02",X"E7",X"EB",X"02",X"E7",X"E9",X"E9",X"E9",X"E9",X"EB",X"02",X"DE", + X"E4",X"02",X"E7",X"E9",X"E9",X"E9",X"EB",X"02",X"DC",X"FC",X"DA",X"05",X"DE",X"E4",X"02",X"DE", + X"E4",X"0C",X"DE",X"E4",X"08",X"DC",X"FC",X"FA",X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"02",X"DE", + X"F2",X"E8",X"E8",X"E8",X"E8",X"EA",X"02",X"E6",X"E8",X"E8",X"EA",X"02",X"DE",X"F2",X"E8",X"E8", + X"EA",X"02",X"E6",X"EA",X"02",X"DC",X"FC",X"FB",X"E9",X"E9",X"EB",X"02",X"E7",X"EB",X"02",X"E7", + X"E9",X"E9",X"E9",X"E9",X"E9",X"EB",X"02",X"E7",X"E9",X"F5",X"E4",X"02",X"DE",X"F3",X"E9",X"E9", + X"EB",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"12",X"DE",X"E4",X"02",X"DE",X"E4",X"05",X"DE", + X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"E6",X"EA",X"02",X"E6",X"E8",X"E8",X"E8",X"E8",X"EA",X"02", + X"EC",X"D3",X"D3",X"D3",X"EE",X"02",X"E7",X"EB",X"02",X"E7",X"EB",X"02",X"E6",X"EA",X"02",X"DE", + X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"E7",X"E9",X"E9",X"E9",X"F5",X"E4",X"02", + X"DC",X"FC",X"FC",X"FC",X"DA",X"08",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"DA",X"02", + X"DE",X"E4",X"06",X"DE",X"E4",X"02",X"F0",X"FC",X"FC",X"FC",X"DA",X"02",X"E6",X"E8",X"E8",X"E8", + X"EA",X"02",X"DE",X"E4",X"05",X"DC",X"FC",X"DA",X"02",X"DE",X"F2",X"E8",X"E8",X"E8",X"EA",X"02", + X"DE",X"E4",X"02",X"CE",X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"C0",X"C0",X"C0",X"E4",X"02",X"DE", + X"F2",X"E8",X"E8",X"EA",X"02",X"DC",X"00",X"00",X"00",X"00",X"66",X"01",X"01",X"01",X"01",X"01", + X"03",X"01",X"01",X"01",X"0B",X"01",X"01",X"07",X"06",X"03",X"03",X"0A",X"03",X"07",X"06",X"03", + X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"07",X"03",X"01",X"01", + X"01",X"03",X"07",X"03",X"06",X"07",X"03",X"03",X"03",X"07",X"03",X"06",X"07",X"03",X"03",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"01",X"01",X"01", + X"07",X"03",X"0D",X"06",X"03",X"07",X"03",X"0D",X"06",X"03",X"04",X"01",X"01",X"01",X"01",X"01", + X"01",X"0D",X"03",X"01",X"01",X"01",X"03",X"04",X"03",X"10",X"03",X"03",X"03",X"04",X"03",X"10", + X"01",X"01",X"01",X"03",X"03",X"04",X"03",X"01",X"01",X"01",X"01",X"12",X"01",X"01",X"01",X"04", + X"07",X"15",X"04",X"07",X"15",X"04",X"03",X"01",X"01",X"01",X"01",X"12",X"01",X"01",X"01",X"04", + X"03",X"10",X"01",X"01",X"01",X"03",X"03",X"04",X"03",X"10",X"03",X"03",X"03",X"04",X"01",X"01", + X"01",X"01",X"01",X"01",X"0D",X"03",X"01",X"01",X"01",X"03",X"07",X"03",X"0D",X"06",X"03",X"07", + X"03",X"0D",X"06",X"03",X"07",X"03",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"07",X"03",X"03",X"03",X"07",X"03",X"06",X"07", + X"03",X"01",X"01",X"01",X"03",X"07",X"03",X"06",X"07",X"06",X"03",X"03",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"07",X"06",X"03",X"03",X"0A",X"03",X"08",X"01",X"01", + X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"0B",X"01",X"01",X"F4",X"1D",X"22",X"1D",X"39",X"40", + X"20",X"40",X"3B",X"65",X"40",X"7B",X"40",X"85",X"43",X"9B",X"43",X"65",X"40",X"7B",X"40",X"65", + X"43",X"7B",X"43",X"42",X"16",X"0A",X"16",X"0A",X"16",X"0A",X"20",X"20",X"20",X"DE",X"E0",X"22", + X"20",X"20",X"20",X"20",X"16",X"0A",X"16",X"0A",X"16",X"00",X"00",X"6F",X"8D",X"13",X"C4",X"0C", + X"74",X"8D",X"1E",X"C4",X"F4",X"7C",X"8D",X"26",X"14",X"F4",X"86",X"8D",X"1D",X"14",X"0C",X"02", + X"AA",X"AA",X"80",X"2A",X"02",X"40",X"55",X"7F",X"55",X"15",X"50",X"05",X"EA",X"FF",X"57",X"55", + X"F5",X"FF",X"57",X"7F",X"55",X"05",X"EA",X"FF",X"FF",X"FF",X"EA",X"AF",X"AA",X"02",X"A2",X"8D", + X"12",X"00",X"00",X"A7",X"8D",X"1D",X"00",X"00",X"AF",X"8D",X"21",X"00",X"00",X"B8",X"8D",X"2C", + X"00",X"00",X"55",X"7F",X"55",X"D5",X"FF",X"AA",X"BF",X"AA",X"2A",X"A0",X"EA",X"FF",X"FF",X"AA", + X"2A",X"A0",X"02",X"00",X"00",X"A0",X"AA",X"02",X"55",X"15",X"A0",X"2A",X"00",X"54",X"05",X"00", + X"00",X"55",X"FD",X"40",X"FC",X"D0",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D6",X"E4",X"02",X"E7", + X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D6",X"D8",X"D2",X"D2",X"D2",X"D2", + X"D2",X"D2",X"D2",X"D4",X"FC",X"DA",X"07",X"DE",X"E4",X"0D",X"DE",X"E4",X"08",X"DC",X"FC",X"DA", + X"02",X"E6",X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"EA",X"02",X"E6",X"E8", + X"E8",X"E8",X"EA",X"02",X"E7",X"EB",X"02",X"E6",X"EA",X"02",X"E6",X"EA",X"02",X"DC",X"FC",X"DA", + X"02",X"DE",X"F3",X"E9",X"EB",X"02",X"E7",X"EB",X"02",X"E7",X"E9",X"F5",X"E4",X"02",X"E7",X"E9", + X"E9",X"F5",X"E4",X"05",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"E4", + X"09",X"DE",X"E4",X"05",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"F4",X"E4",X"02",X"DE",X"E4",X"02", + X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"E8",X"E8",X"EA",X"02",X"E7",X"EB", + X"02",X"E6",X"EA",X"02",X"E7",X"EB",X"02",X"E7",X"E9",X"E9",X"E9",X"EB",X"02",X"E7",X"EB",X"02", + X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"E7",X"E9",X"E9",X"E9",X"F5",X"E4",X"05",X"DE",X"E4", + X"0E",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"06",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"F4",X"E4", + X"02",X"E6",X"E8",X"E8",X"E8",X"EA",X"02",X"E6",X"E8",X"E8",X"E8",X"E8",X"E8",X"F4",X"FC",X"DA", + X"02",X"E7",X"EB",X"02",X"E6",X"E8",X"EA",X"02",X"E7",X"EB",X"02",X"E7",X"E9",X"E9",X"E9",X"EB", + X"02",X"DE",X"F3",X"E9",X"E9",X"EB",X"02",X"DE",X"F3",X"E9",X"E9",X"E9",X"E9",X"F5",X"FC",X"DA", + X"05",X"DE",X"C0",X"E4",X"0B",X"DE",X"E4",X"05",X"DE",X"E4",X"05",X"DC",X"FC",X"FA",X"E8",X"E8", + X"EA",X"02",X"DE",X"C0",X"E4",X"02",X"E6",X"EA",X"02",X"EC",X"D3",X"D3",X"D3",X"EE",X"02",X"DE", + X"E4",X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"EA",X"02",X"DC",X"FC",X"FB",X"E9",X"E9", + X"EB",X"02",X"E7",X"E9",X"EB",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"E7", + X"EB",X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"09",X"DE", + X"E4",X"02",X"F0",X"FC",X"FC",X"FC",X"DA",X"05",X"DE",X"E4",X"05",X"DE",X"E4",X"02",X"DC",X"FC", + X"DA",X"02",X"E6",X"E8",X"E8",X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"02",X"CE",X"FC",X"FC",X"FC", + X"DA",X"02",X"E6",X"E8",X"E8",X"F4",X"E4",X"02",X"E6",X"E8",X"E8",X"F4",X"E4",X"02",X"DC",X"00", + X"00",X"00",X"00",X"62",X"01",X"02",X"01",X"01",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"04",X"01",X"01",X"01",X"01",X"01",X"04",X"05",X"03",X"0B",X"03",X"03", + X"03",X"04",X"05",X"03",X"0B",X"01",X"01",X"01",X"03",X"03",X"04",X"03",X"01",X"01",X"01",X"01", + X"01",X"0B",X"06",X"03",X"04",X"03",X"10",X"06",X"03",X"04",X"03",X"10",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"04",X"03",X"01",X"01",X"01",X"01",X"0F",X"0A",X"03",X"04",X"0F", + X"0A",X"01",X"01",X"01",X"04",X"0C",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"07",X"04",X"0C", + X"03",X"03",X"03",X"07",X"04",X"0C",X"03",X"03",X"03",X"04",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"0C",X"03",X"01",X"01",X"01",X"03",X"04",X"07",X"15",X"04",X"07",X"15",X"04",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"0C",X"03",X"01",X"01",X"01",X"03",X"07",X"04",X"0C",X"03",X"03", + X"03",X"07",X"04",X"0C",X"03",X"03",X"03",X"04",X"01",X"01",X"01",X"04",X"0C",X"01",X"01",X"01", + X"03",X"01",X"01",X"01",X"04",X"03",X"04",X"0F",X"0A",X"03",X"01",X"01",X"01",X"01",X"0F",X"0A", + X"03",X"10",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"03",X"10",X"06",X"03", + X"04",X"03",X"01",X"01",X"01",X"01",X"01",X"0B",X"06",X"03",X"04",X"05",X"03",X"0B",X"01",X"01", + X"01",X"03",X"03",X"04",X"05",X"03",X"0B",X"03",X"03",X"03",X"04",X"01",X"02",X"01",X"01",X"03", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"01",X"01",X"01",X"01", + X"01",X"00",X"00",X"00",X"F2",X"40",X"2D",X"1D",X"22",X"1D",X"39",X"40",X"20",X"64",X"40",X"78", + X"40",X"84",X"43",X"98",X"43",X"64",X"40",X"78",X"40",X"64",X"43",X"78",X"43",X"51",X"90",X"15", + X"54",X"0C",X"57",X"90",X"1E",X"54",X"F4",X"57",X"90",X"1E",X"54",X"F4",X"5F",X"90",X"15",X"54", + X"0C",X"EA",X"FF",X"AB",X"FA",X"AA",X"AA",X"EA",X"FF",X"57",X"55",X"55",X"D5",X"57",X"55",X"AA", + X"AA",X"BF",X"FA",X"BF",X"AA",X"79",X"90",X"22",X"00",X"00",X"82",X"90",X"25",X"00",X"00",X"82", + X"90",X"25",X"00",X"00",X"92",X"90",X"28",X"00",X"00",X"05",X"00",X"00",X"54",X"05",X"54",X"7F", + X"F5",X"0B",X"0A",X"00",X"00",X"A8",X"0A",X"A8",X"BF",X"FA",X"AB",X"AA",X"AA",X"82",X"AA",X"00", + X"A0",X"AA",X"55",X"41",X"55",X"00",X"A0",X"02",X"40",X"F5",X"57",X"BF",X"40",X"FC",X"D0",X"D2", + X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D4",X"FC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"DC", + X"FC",X"FC",X"FC",X"FC",X"D0",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D4",X"FC",X"DA",X"09", + X"DC",X"FC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"FC",X"FC",X"FC",X"DA",X"08",X"DC", + X"FC",X"DA",X"02",X"E6",X"E8",X"E8",X"E8",X"E8",X"EA",X"02",X"E7",X"D2",X"D2",X"EB",X"02",X"DE", + X"E4",X"02",X"E7",X"D2",X"D2",X"D2",X"D2",X"EB",X"02",X"E6",X"E8",X"E8",X"E8",X"EA",X"02",X"DC", + X"FC",X"DA",X"02",X"E7",X"E9",X"E9",X"E9",X"F5",X"E4",X"07",X"DE",X"E4",X"09",X"DE",X"F3",X"E9", + X"E9",X"EB",X"02",X"DC",X"FC",X"DA",X"06",X"DE",X"E4",X"02",X"E6",X"EA",X"02",X"E6",X"E8",X"F4", + X"F2",X"E8",X"EA",X"02",X"E6",X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"05",X"DC",X"FC",X"DA",X"02", + X"E6",X"E8",X"EA",X"02",X"E7",X"EB",X"02",X"DE",X"E4",X"02",X"E7",X"E9",X"E9",X"E9",X"E9",X"EB", + X"02",X"E7",X"E9",X"F5",X"E4",X"02",X"E7",X"EB",X"02",X"E6",X"EA",X"02",X"DC",X"FC",X"DA",X"02", + X"DE",X"C0",X"E4",X"05",X"DE",X"E4",X"0B",X"DE",X"E4",X"05",X"DE",X"E4",X"02",X"DC",X"FC",X"DA", + X"02",X"DE",X"C0",X"E4",X"02",X"E6",X"E8",X"E8",X"F4",X"F2",X"E8",X"E8",X"EA",X"02",X"E6",X"E8", + X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"F4",X"E4",X"02",X"DC",X"FC",X"DA", + X"02",X"E7",X"E9",X"EB",X"02",X"E7",X"E9",X"E9",X"F5",X"F3",X"E9",X"E9",X"EB",X"02",X"E7",X"E9", + X"E9",X"F5",X"E4",X"02",X"E7",X"EB",X"02",X"E7",X"E9",X"E9",X"F5",X"E4",X"02",X"DC",X"FC",X"DA", + X"09",X"DE",X"E4",X"08",X"DE",X"E4",X"08",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"E6",X"E8", + X"E8",X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"02",X"EC",X"D3",X"D3",X"D3",X"EE",X"02",X"DE",X"E4", + X"02",X"E6",X"E8",X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"F3", + X"E9",X"E9",X"E9",X"EB",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"E7",X"EB", + X"02",X"E7",X"E9",X"E9",X"F5",X"E4",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"E4", + X"09",X"F0",X"FC",X"FC",X"FC",X"DA",X"08",X"DE",X"E4",X"05",X"DC",X"FC",X"DA",X"02",X"DE",X"E4", + X"02",X"E6",X"E8",X"E8",X"E8",X"E8",X"EA",X"02",X"CE",X"FC",X"FC",X"FC",X"DA",X"02",X"E6",X"E8", + X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"F4",X"00",X"00",X"00",X"00",X"62", + X"01",X"02",X"01",X"01",X"01",X"01",X"0F",X"01",X"01",X"01",X"02",X"01",X"04",X"07",X"0F",X"06", + X"04",X"07",X"01",X"01",X"01",X"07",X"01",X"01",X"01",X"01",X"01",X"06",X"04",X"01",X"01",X"01", + X"01",X"03",X"03",X"07",X"05",X"03",X"01",X"01",X"01",X"04",X"04",X"03",X"03",X"07",X"05",X"03", + X"03",X"04",X"04",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"03",X"01",X"01",X"01",X"03",X"04",X"04",X"0F",X"03",X"06",X"04",X"04",X"0F",X"03",X"06",X"04", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0C",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"04", + X"07",X"12",X"03",X"04",X"07",X"12",X"03",X"04",X"03",X"01",X"01",X"01",X"01",X"12",X"01",X"01", + X"01",X"04",X"03",X"16",X"07",X"03",X"16",X"07",X"03",X"01",X"01",X"01",X"01",X"12",X"01",X"01", + X"01",X"04",X"07",X"12",X"03",X"04",X"07",X"12",X"03",X"04",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"0C",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"04",X"04",X"0F",X"03",X"06",X"04",X"04", + X"0F",X"03",X"06",X"04",X"04",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"03",X"01",X"01",X"01",X"03",X"04",X"04",X"03",X"03",X"07",X"05",X"03",X"03",X"04", + X"01",X"01",X"01",X"01",X"03",X"03",X"07",X"05",X"03",X"01",X"01",X"01",X"04",X"07",X"01",X"01", + X"01",X"07",X"01",X"01",X"01",X"01",X"01",X"06",X"04",X"07",X"0F",X"06",X"04",X"01",X"02",X"01", + X"01",X"01",X"01",X"0F",X"01",X"01",X"01",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F5",X"EF",X"1C",X"36", + X"EF",X"20",X"15",X"EF",X"21",X"13",X"21",X"BC",X"4E",X"CB",X"DE",X"F1",X"C9",X"F5",X"EF",X"1C", + X"36",X"EF",X"20",X"16",X"EF",X"21",X"14",X"21",X"BC",X"4E",X"CB",X"DE",X"F1",X"C9",X"F5",X"EF", + X"1C",X"36",X"EF",X"20",X"17",X"EF",X"21",X"15",X"21",X"BC",X"4E",X"CB",X"DE",X"F1",X"C9",X"F5", + X"EF",X"1C",X"36",X"EF",X"20",X"18",X"EF",X"21",X"16",X"21",X"BC",X"4E",X"CB",X"DE",X"F1",X"C9", + X"F5",X"EF",X"1C",X"36",X"EF",X"20",X"18",X"EF",X"21",X"17",X"21",X"BC",X"4E",X"CB",X"DE",X"F1", + X"C9",X"F5",X"EF",X"1C",X"36",X"EF",X"20",X"19",X"EF",X"21",X"18",X"21",X"BC",X"4E",X"CB",X"DE", + X"F1",X"C9",X"F5",X"EF",X"1C",X"36",X"EF",X"20",X"1A",X"EF",X"21",X"19",X"21",X"BC",X"4E",X"CB", + X"DE",X"F1",X"C9",X"EE",X"64",X"40",X"7C",X"40",X"84",X"43",X"9C",X"43",X"64",X"40",X"7C",X"40", + X"64",X"43",X"7C",X"43",X"1D",X"22",X"40",X"20",X"1D",X"39",X"40",X"3B",X"C0",X"93",X"14",X"8C", + X"0C",X"C5",X"93",X"1D",X"8C",X"F4",X"CE",X"93",X"2A",X"74",X"F4",X"D9",X"93",X"15",X"74",X"0C", + X"80",X"AA",X"BE",X"FA",X"AA",X"00",X"00",X"50",X"FD",X"55",X"F5",X"D5",X"57",X"55",X"EA",X"FF", + X"57",X"D5",X"5F",X"FD",X"15",X"50",X"01",X"50",X"55",X"EA",X"AF",X"FE",X"2A",X"A8",X"AA",X"F3", + X"93",X"15",X"00",X"00",X"F9",X"93",X"18",X"00",X"00",X"FF",X"93",X"19",X"00",X"00",X"06",X"94", + X"1C",X"00",X"00",X"55",X"50",X"41",X"55",X"FD",X"AA",X"AA",X"A0",X"82",X"AA",X"FE",X"AA",X"AA", + X"AF",X"02",X"2A",X"A0",X"AA",X"AA",X"55",X"5F",X"01",X"00",X"50",X"55",X"BF",X"3A",X"70",X"4C", + X"FE",X"02",X"20",X"07",X"3A",X"13",X"4E",X"FE",X"08",X"30",X"05",X"21",X"2A",X"94",X"18",X"03", + X"21",X"32",X"94",X"CD",X"A1",X"94",X"21",X"00",X"40",X"C9",X"CC",X"87",X"C1",X"8A",X"C3",X"8D", + X"9C",X"90",X"5F",X"99",X"D2",X"9B",X"43",X"9E",X"AE",X"A0",X"21",X"68",X"22",X"18",X"03",X"21", + X"90",X"22",X"E5",X"3A",X"70",X"4C",X"FE",X"02",X"20",X"07",X"3A",X"13",X"4E",X"FE",X"08",X"30", + X"05",X"21",X"6A",X"94",X"18",X"03",X"21",X"72",X"94",X"CD",X"A1",X"94",X"FD",X"21",X"00",X"00", + X"FD",X"09",X"21",X"00",X"40",X"DD",X"21",X"16",X"4E",X"C9",X"46",X"89",X"3A",X"8C",X"33",X"8F", + X"0F",X"92",X"E1",X"9A",X"4B",X"9D",X"B7",X"9F",X"21",X"A2",X"C5",X"21",X"99",X"94",X"CD",X"A1", + X"94",X"0A",X"47",X"3A",X"0E",X"4E",X"B8",X"C1",X"DA",X"8E",X"94",X"C3",X"42",X"0B",X"3A",X"FD", + X"4D",X"FE",X"05",X"DA",X"48",X"0B",X"C3",X"42",X"0B",X"37",X"8A",X"2A",X"8D",X"24",X"90",X"93", + X"93",X"3A",X"13",X"4E",X"E5",X"FE",X"0D",X"F2",X"B8",X"94",X"21",X"C3",X"94",X"D7",X"E1",X"87", + X"4F",X"06",X"00",X"09",X"4E",X"23",X"46",X"C9",X"D6",X"0D",X"D6",X"08",X"F2",X"BA",X"94",X"C6", + X"0D",X"18",X"E7",X"00",X"00",X"01",X"01",X"02",X"02",X"03",X"03",X"00",X"01",X"02",X"03",X"00", + X"01",X"02",X"03",X"03",X"03",X"02",X"01",X"3A",X"70",X"4C",X"FE",X"03",X"CC",X"90",X"B3",X"21", + X"2D",X"95",X"CD",X"A1",X"94",X"11",X"34",X"4E",X"69",X"60",X"4E",X"23",X"46",X"23",X"1A",X"FE", + X"14",X"28",X"04",X"FE",X"40",X"20",X"08",X"02",X"13",X"3E",X"03",X"A3",X"20",X"EC",X"C9",X"3E", + X"40",X"12",X"02",X"18",X"F3",X"3A",X"70",X"4C",X"FE",X"03",X"CC",X"90",X"B3",X"21",X"2D",X"95", + X"CD",X"A1",X"94",X"11",X"34",X"4E",X"69",X"60",X"4E",X"23",X"46",X"23",X"0A",X"FE",X"14",X"28", + X"04",X"FE",X"40",X"20",X"01",X"12",X"13",X"3E",X"03",X"A3",X"20",X"EC",X"C9",X"40",X"8A",X"33", + X"8D",X"2D",X"90",X"94",X"93",X"48",X"8A",X"3B",X"8D",X"35",X"90",X"9C",X"93",X"C5",X"D5",X"21", + X"2D",X"95",X"CD",X"A1",X"94",X"60",X"69",X"5E",X"23",X"56",X"EB",X"CB",X"D4",X"3A",X"7E",X"44", + X"BE",X"20",X"02",X"3E",X"00",X"77",X"EB",X"23",X"5E",X"23",X"56",X"CB",X"D2",X"12",X"23",X"5E", + X"23",X"56",X"CB",X"D2",X"12",X"23",X"5E",X"23",X"56",X"CB",X"D2",X"12",X"D1",X"C1",X"3E",X"10", + X"BE",X"C9",X"3A",X"2E",X"4D",X"18",X"03",X"3A",X"2F",X"4D",X"F5",X"C5",X"E5",X"21",X"91",X"95", + X"CD",X"A1",X"94",X"69",X"60",X"ED",X"5F",X"E6",X"06",X"D7",X"5F",X"23",X"56",X"E1",X"C1",X"F1", + X"C9",X"38",X"8A",X"2B",X"8D",X"25",X"90",X"A4",X"93",X"CA",X"CD",X"22",X"3A",X"02",X"4E",X"A7", + X"28",X"07",X"FE",X"10",X"3E",X"01",X"C2",X"CD",X"22",X"3A",X"13",X"4E",X"FE",X"15",X"F2",X"BC", + X"95",X"4F",X"06",X"00",X"21",X"C7",X"95",X"09",X"7E",X"C3",X"CD",X"22",X"D6",X"15",X"D6",X"10", + X"F2",X"BE",X"95",X"C6",X"15",X"18",X"EA",X"07",X"16",X"1D",X"07",X"14",X"09",X"07",X"14",X"12", + X"07",X"1D",X"14",X"16",X"18",X"1E",X"19",X"18",X"15",X"19",X"1D",X"12",X"07",X"16",X"1D",X"07", + X"14",X"16",X"07",X"14",X"1D",X"07",X"1D",X"14",X"16",X"18",X"18",X"18",X"18",X"1D",X"1D",X"1D", + X"1D",X"3A",X"13",X"4E",X"FE",X"03",X"F2",X"20",X"23",X"21",X"0D",X"96",X"CD",X"A1",X"94",X"21", + X"00",X"44",X"0A",X"03",X"A7",X"CA",X"20",X"23",X"D7",X"CB",X"F6",X"18",X"F5",X"50",X"8A",X"43", + X"8D",X"50",X"8A",X"43",X"8D",X"78",X"FE",X"0A",X"CC",X"3A",X"96",X"FE",X"0B",X"CC",X"28",X"96", + X"FE",X"06",X"CC",X"FE",X"96",X"C3",X"DF",X"2A",X"C5",X"E5",X"E1",X"C1",X"3A",X"80",X"50",X"E6", + X"30",X"FE",X"30",X"78",X"C0",X"3E",X"20",X"06",X"20",X"C9",X"C5",X"E5",X"21",X"45",X"96",X"CD", + X"E9",X"96",X"E1",X"C1",X"C9",X"09",X"20",X"F5",X"41",X"09",X"21",X"15",X"42",X"09",X"22",X"F6", + X"41",X"09",X"23",X"16",X"42",X"FF",X"3A",X"DA",X"4F",X"EF",X"64",X"96",X"65",X"96",X"86",X"96", + X"A7",X"96",X"C8",X"96",X"C9",X"21",X"64",X"80",X"22",X"00",X"4D",X"21",X"2C",X"2E",X"22",X"0A", + X"4D",X"22",X"31",X"4D",X"21",X"00",X"01",X"22",X"14",X"4D",X"22",X"1E",X"4D",X"3E",X"02",X"32", + X"28",X"4D",X"32",X"2C",X"4D",X"C9",X"21",X"7C",X"80",X"22",X"02",X"4D",X"21",X"2F",X"2E",X"22", + X"0C",X"4D",X"22",X"33",X"4D",X"21",X"01",X"00",X"22",X"16",X"4D",X"22",X"20",X"4D",X"3E",X"01", + X"32",X"29",X"4D",X"32",X"2D",X"4D",X"C9",X"21",X"7C",X"90",X"22",X"04",X"4D",X"21",X"2F",X"30", + X"22",X"0E",X"4D",X"22",X"35",X"4D",X"21",X"FF",X"00",X"22",X"18",X"4D",X"22",X"22",X"4D",X"3E", + X"03",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"C9",X"21",X"7C",X"70",X"22",X"06",X"4D",X"21",X"2F", + X"2C",X"22",X"10",X"4D",X"22",X"37",X"4D",X"21",X"FF",X"00",X"22",X"1A",X"4D",X"22",X"24",X"4D", + X"3E",X"03",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"C9",X"7E",X"FE",X"FF",X"28",X"0F",X"47",X"23", + X"7E",X"23",X"5E",X"23",X"56",X"12",X"78",X"CB",X"D2",X"12",X"23",X"18",X"EC",X"C9",X"3E",X"00", + X"32",X"00",X"4F",X"C9",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"CD",X"34",X"3E",X"CD", + X"49",X"97",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"C9",X"F5",X"C5",X"D5",X"E5",X"DD", + X"E5",X"FD",X"E5",X"CD",X"4C",X"3E",X"CD",X"17",X"3F",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1", + X"F1",X"C9",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"CD",X"01",X"80",X"CD",X"8F",X"06", + X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"C9",X"3A",X"01",X"4F",X"3C",X"E6",X"1F",X"32", + X"01",X"4F",X"E6",X"07",X"4F",X"CB",X"81",X"06",X"00",X"DD",X"21",X"D9",X"98",X"CB",X"47",X"CA", + X"E7",X"97",X"DD",X"09",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"36",X"87",X"DD",X"6E",X"08",X"DD", + X"66",X"09",X"36",X"87",X"DD",X"6E",X"10",X"DD",X"66",X"11",X"36",X"87",X"DD",X"6E",X"18",X"DD", + X"66",X"19",X"36",X"87",X"DD",X"6E",X"20",X"DD",X"66",X"21",X"36",X"87",X"DD",X"6E",X"28",X"DD", + X"66",X"29",X"3E",X"67",X"BD",X"20",X"04",X"36",X"8A",X"18",X"02",X"36",X"87",X"DD",X"6E",X"30", + X"DD",X"66",X"31",X"36",X"8A",X"DD",X"6E",X"38",X"DD",X"66",X"39",X"36",X"81",X"DD",X"6E",X"40", + X"DD",X"66",X"41",X"36",X"81",X"DD",X"6E",X"48",X"DD",X"66",X"49",X"36",X"81",X"DD",X"6E",X"50", + X"DD",X"66",X"51",X"36",X"81",X"DD",X"6E",X"58",X"DD",X"66",X"59",X"36",X"81",X"DD",X"6E",X"60", + X"DD",X"66",X"61",X"3E",X"63",X"BD",X"20",X"04",X"36",X"84",X"18",X"02",X"36",X"81",X"DD",X"6E", + X"68",X"DD",X"66",X"69",X"36",X"84",X"C9",X"0D",X"AF",X"B9",X"FA",X"EF",X"97",X"06",X"FF",X"0D", + X"DD",X"09",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"35",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"36", + X"88",X"DD",X"6E",X"08",X"DD",X"66",X"09",X"35",X"DD",X"6E",X"0A",X"DD",X"66",X"0B",X"36",X"88", + X"DD",X"6E",X"10",X"DD",X"66",X"11",X"35",X"DD",X"6E",X"12",X"DD",X"66",X"13",X"36",X"88",X"DD", + X"6E",X"18",X"DD",X"66",X"19",X"35",X"DD",X"6E",X"1A",X"DD",X"66",X"1B",X"36",X"88",X"DD",X"6E", + X"20",X"DD",X"66",X"21",X"35",X"DD",X"6E",X"22",X"DD",X"66",X"23",X"36",X"88",X"DD",X"6E",X"28", + X"DD",X"66",X"29",X"35",X"DD",X"6E",X"2A",X"DD",X"66",X"2B",X"3E",X"67",X"BD",X"20",X"04",X"36", + X"8B",X"18",X"02",X"36",X"88",X"DD",X"6E",X"30",X"DD",X"66",X"31",X"35",X"DD",X"6E",X"32",X"DD", + X"66",X"33",X"36",X"8B",X"DD",X"6E",X"38",X"DD",X"66",X"39",X"35",X"DD",X"6E",X"3A",X"DD",X"66", + X"3B",X"36",X"82",X"DD",X"6E",X"40",X"DD",X"66",X"41",X"35",X"DD",X"6E",X"42",X"DD",X"66",X"43", + X"36",X"82",X"DD",X"6E",X"48",X"DD",X"66",X"49",X"35",X"DD",X"6E",X"4A",X"DD",X"66",X"4B",X"36", + X"82",X"DD",X"6E",X"50",X"DD",X"66",X"51",X"35",X"DD",X"6E",X"52",X"DD",X"66",X"53",X"36",X"82", + X"DD",X"6E",X"58",X"DD",X"66",X"59",X"35",X"DD",X"6E",X"5A",X"DD",X"66",X"5B",X"36",X"82",X"DD", + X"6E",X"60",X"DD",X"66",X"61",X"35",X"DD",X"6E",X"62",X"DD",X"66",X"63",X"3E",X"63",X"BD",X"20", + X"04",X"36",X"83",X"18",X"02",X"36",X"82",X"DD",X"6E",X"68",X"DD",X"66",X"69",X"35",X"DD",X"6E", + X"6A",X"DD",X"66",X"6B",X"36",X"83",X"C9",X"67",X"43",X"47",X"43",X"27",X"43",X"07",X"43",X"E7", + X"42",X"C7",X"42",X"A7",X"42",X"87",X"42",X"67",X"42",X"47",X"42",X"27",X"42",X"07",X"42",X"E7", + X"41",X"C7",X"41",X"A7",X"41",X"87",X"41",X"67",X"41",X"47",X"41",X"27",X"41",X"07",X"41",X"E7", + X"40",X"C7",X"40",X"A7",X"40",X"87",X"40",X"67",X"40",X"66",X"40",X"65",X"40",X"64",X"40",X"63", + X"40",X"83",X"40",X"A3",X"40",X"C3",X"40",X"E3",X"40",X"03",X"41",X"23",X"41",X"43",X"41",X"63", + X"41",X"83",X"41",X"A3",X"41",X"C3",X"41",X"E3",X"41",X"03",X"42",X"23",X"42",X"43",X"42",X"63", + X"42",X"83",X"42",X"A3",X"42",X"C3",X"42",X"E3",X"42",X"03",X"43",X"23",X"43",X"43",X"43",X"63", + X"43",X"64",X"43",X"65",X"43",X"66",X"43",X"67",X"43",X"64",X"43",X"65",X"43",X"66",X"43",X"67", + X"43",X"64",X"43",X"65",X"43",X"66",X"43",X"67",X"43",X"00",X"00",X"00",X"00",X"00",X"00",X"40", + X"FC",X"D0",X"EF",X"02",X"ED",X"D2",X"D2",X"EF",X"02",X"ED",X"D4",X"FC",X"FC",X"FC",X"DA",X"02", + X"DC",X"FC",X"FC",X"FC",X"D0",X"EF",X"02",X"ED",X"D2",X"D6",X"E4",X"02",X"ED",X"D2",X"D2",X"D4", + X"02",X"DA",X"09",X"F7",X"D2",X"D2",X"D2",X"EB",X"02",X"F7",X"D2",X"D2",X"D2",X"EB",X"05",X"DE", + X"E4",X"05",X"DC",X"02",X"DA",X"02",X"E6",X"E8",X"EA",X"02",X"E6",X"EA",X"0E",X"E6",X"EA",X"02", + X"E7",X"EB",X"02",X"E6",X"EA",X"02",X"DC",X"02",X"DA",X"02",X"DE",X"FC",X"E4",X"02",X"DE",X"E4", + X"02",X"F6",X"D3",X"D3",X"D3",X"EA",X"02",X"F6",X"D3",X"D3",X"D3",X"EA",X"02",X"DE",X"E4",X"05", + X"DE",X"E4",X"02",X"DC",X"02",X"DA",X"02",X"DE",X"FC",X"E4",X"02",X"DE",X"E4",X"02",X"DC",X"FC", + X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"F2",X"E8",X"E8",X"EA",X"02", + X"E7",X"EB",X"02",X"DC",X"02",X"DA",X"02",X"E7",X"E9",X"EB",X"02",X"E7",X"EB",X"02",X"E7",X"D2", + X"D2",X"D2",X"EB",X"02",X"E7",X"D2",X"D2",X"D2",X"EB",X"02",X"E7",X"E9",X"E9",X"E9",X"EB",X"05", + X"DC",X"02",X"DA",X"1B",X"E6",X"EA",X"02",X"DC",X"02",X"DA",X"02",X"E6",X"E8",X"F8",X"02",X"F6", + X"E8",X"E8",X"E8",X"E8",X"F8",X"02",X"F6",X"E8",X"F8",X"02",X"F6",X"E8",X"EA",X"02",X"E6",X"F8", + X"02",X"F6",X"E8",X"E8",X"F4",X"E4",X"02",X"DC",X"02",X"DA",X"02",X"DE",X"FC",X"E4",X"02",X"F7", + X"E9",X"E9",X"F5",X"F3",X"F9",X"02",X"F7",X"E9",X"F9",X"02",X"F7",X"E9",X"EB",X"02",X"DE",X"E4", + X"02",X"F7",X"E9",X"E9",X"F5",X"E4",X"02",X"DC",X"02",X"DA",X"02",X"DE",X"FC",X"E4",X"05",X"DE", + X"E4",X"0B",X"DE",X"E4",X"05",X"DE",X"E4",X"02",X"DC",X"02",X"DA",X"02",X"DE",X"FC",X"E4",X"02", + X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"EC",X"D3",X"D3",X"D3",X"EE",X"02",X"E6",X"EA",X"02",X"DE", + X"E4",X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"DC",X"02",X"DA",X"02",X"E7",X"E9",X"EB",X"02", + X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"E7", + X"EB",X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DC",X"02",X"DA",X"06",X"DE",X"E4",X"05",X"F0", + X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"E4",X"05",X"DE",X"E4",X"05",X"DC",X"02",X"FA",X"E8",X"E8", + X"EA",X"02",X"F6",X"F4",X"F2",X"E8",X"E8",X"EA",X"02",X"CE",X"FC",X"FC",X"FC",X"DA",X"02",X"DE", + X"F2",X"E8",X"E8",X"EA",X"02",X"DE",X"F2",X"EA",X"02",X"F6",X"E8",X"D5",X"00",X"00",X"00",X"00", + X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"F4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"62",X"01",X"18",X"01",X"01",X"01",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"04", + X"03",X"0C",X"03",X"01",X"01",X"01",X"03",X"04",X"04",X"03",X"0C",X"06",X"03",X"04",X"04",X"03", + X"0C",X"07",X"02",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"04",X"04", + X"0F",X"03",X"06",X"04",X"04",X"0F",X"03",X"06",X"04",X"04",X"01",X"01",X"01",X"0C",X"03",X"01", + X"01",X"01",X"03",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"04",X"03",X"0C",X"03",X"03", + X"03",X"04",X"01",X"01",X"01",X"01",X"03",X"0C",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"07", + X"17",X"09",X"17",X"06",X"01",X"01",X"01",X"01",X"03",X"0C",X"01",X"01",X"01",X"03",X"01",X"01", + X"01",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04", + X"04",X"01",X"01",X"01",X"0C",X"03",X"01",X"01",X"01",X"03",X"04",X"04",X"0F",X"03",X"06",X"04", + X"04",X"0F",X"03",X"06",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"04", + X"04",X"03",X"0C",X"07",X"02",X"04",X"04",X"03",X"0C",X"06",X"03",X"04",X"04",X"03",X"0C",X"03", + X"01",X"01",X"01",X"03",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"01",X"18",X"01",X"01", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"40",X"FC",X"D0",X"D2",X"D2",X"D2",X"D2",X"D6",X"E4",X"02",X"DE",X"D8",X"D2",X"D2", + X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D6",X"E4",X"02",X"DE",X"D8",X"D2",X"D2",X"D2",X"D2",X"D2", + X"D2",X"D2",X"D4",X"FC",X"DA",X"05",X"DE",X"E4",X"02",X"DE",X"E4",X"09",X"DE",X"E4",X"02",X"DE", + X"E4",X"08",X"DC",X"FC",X"DA",X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"E6", + X"E8",X"E8",X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"E8", + X"EA",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"DE", + X"C0",X"C0",X"C0",X"C0",X"E4",X"02",X"E7",X"EB",X"02",X"E7",X"EB",X"02",X"E7",X"E9",X"E9",X"E9", + X"EB",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"DE", + X"C0",X"C0",X"C0",X"C0",X"E4",X"0E",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02", + X"E7",X"EB",X"02",X"E7",X"E9",X"E9",X"E9",X"E9",X"EB",X"02",X"E6",X"E8",X"E8",X"E8",X"E8",X"E8", + X"E8",X"E8",X"E8",X"E8",X"EA",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"0F",X"DE",X"F3",X"E9", + X"E9",X"E9",X"E9",X"F5",X"F3",X"E9",X"E9",X"EB",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"02", + X"E6",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"05", + X"DE",X"E4",X"05",X"DC",X"FC",X"DA",X"02",X"E7",X"EB",X"02",X"E7",X"E9",X"E9",X"E9",X"F5",X"F3", + X"E9",X"E9",X"E9",X"E9",X"E9",X"EB",X"02",X"DE",X"E4",X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02", + X"E6",X"EA",X"02",X"DC",X"FC",X"DA",X"09",X"DE",X"E4",X"08",X"DE",X"E4",X"02",X"DE",X"E4",X"02", + X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"FA",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"EA", + X"02",X"DE",X"E4",X"02",X"EC",X"D3",X"D3",X"D3",X"EE",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02", + X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"FB",X"E9",X"E9",X"E9",X"E9",X"E9",X"E9",X"EB", + X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"E7",X"EB",X"02",X"DE",X"E4",X"02", + X"E7",X"EB",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"DA",X"0C",X"DC",X"FC",X"FC",X"FC",X"DA",X"05", + X"DE",X"E4",X"08",X"DC",X"FC",X"DA",X"02",X"E6",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"EA", + X"02",X"CE",X"FC",X"FC",X"FC",X"DA",X"02",X"E6",X"E8",X"E8",X"F4",X"E4",X"02",X"E6",X"E8",X"E8", + X"E8",X"E8",X"E8",X"F4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"62",X"01",X"01",X"07",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"06",X"01",X"01",X"02",X"01",X"01",X"04",X"03",X"06",X"07", + X"06",X"06",X"04",X"03",X"06",X"07",X"06",X"06",X"04",X"03",X"06",X"07",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"03",X"06",X"07",X"0C",X"04",X"03",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0C",X"04",X"03",X"10", + X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"04",X"03",X"10",X"03",X"03",X"03",X"04",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"0C",X"03",X"03",X"03",X"0B",X"0C",X"03",X"03",X"03",X"0B",X"0C", + X"03",X"03",X"03",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0F",X"01",X"01",X"01",X"01", + X"01",X"01",X"04",X"20",X"20",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0F",X"01",X"01",X"01", + X"01",X"01",X"01",X"0B",X"0C",X"03",X"03",X"03",X"0B",X"0C",X"03",X"03",X"03",X"04",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"0C",X"03",X"03",X"03",X"04",X"03",X"10",X"03",X"03",X"03",X"04", + X"03",X"10",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"04",X"03",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0C",X"04",X"03",X"06",X"07",X"0C",X"04",X"03", + X"06",X"07",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"03", + X"06",X"07",X"06",X"06",X"04",X"03",X"06",X"07",X"06",X"06",X"04",X"01",X"01",X"07",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"06",X"01",X"01",X"02",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"40",X"FC",X"D0",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2", + X"D2",X"D6",X"D8",X"D2",X"D2",X"D2",X"D2",X"D2",X"EB",X"02",X"DE",X"D8",X"D2",X"D2",X"D2",X"D2", + X"D2",X"D2",X"D2",X"D4",X"FC",X"DA",X"0C",X"DE",X"E4",X"08",X"DE",X"E4",X"08",X"DC",X"FC",X"DA", + X"02",X"E6",X"EA",X"02",X"E6",X"EA",X"02",X"E6",X"E8",X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"E8", + X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"E8",X"EA",X"02",X"DC",X"FC",X"DA", + X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"DE",X"C0",X"E4",X"02",X"DE",X"E4",X"02",X"DE",X"C0", + X"C0",X"C0",X"E4",X"02",X"DE",X"E4",X"02",X"E7",X"E9",X"E9",X"E9",X"EB",X"02",X"DC",X"FC",X"DA", + X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"DE",X"C0",X"E4",X"02",X"E7",X"EB",X"02",X"DE",X"C0", + X"C0",X"C0",X"E4",X"02",X"DE",X"E4",X"08",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"DE",X"E4", + X"02",X"E7",X"E9",X"EB",X"05",X"E7",X"E9",X"E9",X"E9",X"EB",X"02",X"DE",X"E4",X"02",X"E6",X"E8", + X"E8",X"E8",X"EA",X"02",X"DC",X"FC",X"DA",X"02",X"E7",X"EB",X"02",X"E7",X"EB",X"06",X"E6",X"EA", + X"08",X"E7",X"EB",X"02",X"E7",X"E9",X"E9",X"E9",X"EB",X"02",X"DC",X"FC",X"DA",X"08",X"E6",X"E8", + X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"E8",X"EA",X"0B",X"DC",X"FC",X"DA",X"02",X"E6", + X"EA",X"02",X"E6",X"EA",X"02",X"E7",X"E9",X"EB",X"02",X"E7",X"EB",X"02",X"E7",X"E9",X"E9",X"E9", + X"EB",X"02",X"E6",X"E8",X"EA",X"02",X"E6",X"E8",X"E8",X"EA",X"02",X"DC",X"FC",X"DA",X"02",X"DE", + X"E4",X"02",X"DE",X"E4",X"0F",X"E7",X"E9",X"EB",X"02",X"E7",X"E9",X"F5",X"E4",X"02",X"DC",X"FC", + X"DA",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"EA",X"02",X"EC",X"D3",X"D3",X"D3", + X"EE",X"02",X"E6",X"EA",X"08",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"E7",X"EB",X"02",X"E7", + X"EB",X"02",X"DE",X"C0",X"E4",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"E6", + X"EA",X"02",X"E6",X"EA",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"DA",X"08",X"DE",X"C0",X"E4",X"02", + X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"05",X"DC", + X"FC",X"F2",X"E8",X"E8",X"E8",X"EA",X"02",X"E6",X"E8",X"F4",X"C0",X"E4",X"02",X"CE",X"FC",X"FC", + X"FC",X"DA",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"F4", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"62",X"01",X"02",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"01",X"01",X"01",X"01",X"01",X"04",X"03", + X"03",X"04",X"03",X"06",X"03",X"06",X"04",X"03",X"03",X"04",X"03",X"06",X"03",X"06",X"04",X"03", + X"03",X"04",X"03",X"06",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"03",X"03",X"04",X"01", + X"01",X"01",X"06",X"03",X"06",X"04",X"03",X"03",X"0D",X"03",X"06",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"0D",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"03",X"03",X"11", + X"05",X"04",X"03",X"03",X"11",X"05",X"04",X"03",X"03",X"11",X"01",X"01",X"03",X"04",X"03",X"03", + X"13",X"03",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"13",X"01",X"01",X"01",X"08",X"20",X"1C", + X"01",X"01",X"01",X"01",X"01",X"01",X"13",X"01",X"01",X"01",X"04",X"03",X"03",X"13",X"03",X"04", + X"03",X"03",X"11",X"01",X"01",X"03",X"04",X"03",X"03",X"11",X"05",X"04",X"03",X"03",X"11",X"05", + X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"0D",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"04",X"03",X"03",X"0D",X"03",X"06",X"04",X"03",X"03",X"04",X"01",X"01",X"01",X"06",X"03", + X"06",X"04",X"03",X"03",X"04",X"03",X"06",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"04",X"03", + X"03",X"04",X"03",X"06",X"03",X"06",X"04",X"03",X"03",X"04",X"03",X"06",X"03",X"06",X"04",X"01", + X"02",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"04", + X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"FC", + X"D0",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"F5",X"C0",X"C0",X"C0",X"C0",X"E4",X"02", + X"DE",X"C0",X"C0",X"C0",X"C0",X"C0",X"D8",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D4",X"FC", + X"DA",X"09",X"DE",X"C0",X"C0",X"C0",X"C0",X"E4",X"02",X"DE",X"C0",X"C0",X"C0",X"C0",X"C0",X"E4", + X"08",X"DC",X"FC",X"DA",X"02",X"E6",X"E8",X"E8",X"E8",X"E8",X"EA",X"02",X"E7",X"E9",X"E9",X"E9", + X"E9",X"EB",X"02",X"DE",X"F3",X"E9",X"E9",X"E9",X"E9",X"EB",X"02",X"E6",X"E8",X"E8",X"E8",X"EA", + X"02",X"DC",X"FC",X"DA",X"02",X"E7",X"E9",X"E9",X"E9",X"F5",X"E4",X"09",X"DE",X"E4",X"07",X"DE", + X"F3",X"E9",X"E9",X"EB",X"02",X"DC",X"FC",X"DA",X"06",X"DE",X"E4",X"02",X"E6",X"EA",X"02",X"E6", + X"E8",X"E8",X"E8",X"F4",X"E4",X"02",X"E6",X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"05",X"DC",X"FC", + X"DA",X"02",X"E6",X"E8",X"EA",X"02",X"E7",X"EB",X"02",X"DE",X"E4",X"02",X"E7",X"E9",X"E9",X"E9", + X"E9",X"EB",X"02",X"E7",X"E9",X"F5",X"E4",X"02",X"E7",X"EB",X"02",X"E6",X"EA",X"02",X"DC",X"FC", + X"DA",X"02",X"DE",X"C0",X"E4",X"05",X"DE",X"E4",X"0B",X"DE",X"E4",X"05",X"DE",X"E4",X"02",X"DC", + X"FC",X"DA",X"02",X"DE",X"C0",X"E4",X"02",X"E6",X"E8",X"E8",X"F4",X"F2",X"E8",X"E8",X"EA",X"02", + X"E6",X"E8",X"E8",X"E8",X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"F4",X"E4",X"02",X"DC", + X"FC",X"DA",X"02",X"E7",X"E9",X"EB",X"02",X"E7",X"E9",X"E9",X"E9",X"E9",X"E9",X"E9",X"EB",X"02", + X"E7",X"E9",X"E9",X"F5",X"E4",X"02",X"E7",X"EB",X"02",X"E7",X"E9",X"E9",X"F5",X"E4",X"02",X"DC", + X"FC",X"DA",X"12",X"DE",X"E4",X"08",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"E6",X"E8",X"E8", + X"E8",X"E8",X"EA",X"02",X"E6",X"EA",X"02",X"EC",X"D3",X"D3",X"D3",X"EE",X"02",X"DE",X"E4",X"02", + X"E6",X"EA",X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"F3",X"E9", + X"E9",X"E9",X"EB",X"02",X"DE",X"E4",X"02",X"DC",X"04",X"DA",X"02",X"E7",X"EB",X"02",X"DE",X"E4", + X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"E4",X"06",X"DE",X"E4", + X"02",X"DC",X"04",X"DA",X"05",X"DE",X"E4",X"02",X"DE",X"E4",X"05",X"DC",X"FC",X"DA",X"02",X"DE", + X"E4",X"02",X"E6",X"E8",X"E8",X"E8",X"F4",X"E5",X"02",X"DC",X"04",X"DA",X"02",X"E6",X"E8",X"E8", + X"F4",X"E4",X"02",X"DE",X"E4",X"02",X"E6",X"E8",X"E8",X"F4",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"62",X"01",X"02",X"01",X"01",X"01",X"01",X"0F",X"01",X"01",X"01",X"02",X"01",X"04",X"07", + X"0F",X"06",X"04",X"07",X"01",X"01",X"01",X"07",X"01",X"01",X"01",X"01",X"01",X"06",X"04",X"01", + X"01",X"01",X"01",X"03",X"03",X"07",X"05",X"03",X"01",X"01",X"01",X"04",X"04",X"03",X"03",X"07", + X"05",X"03",X"03",X"04",X"04",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"03",X"01",X"01",X"01",X"03",X"04",X"04",X"0F",X"03",X"06",X"04",X"04",X"0F",X"03", + X"06",X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0C",X"01",X"01",X"01",X"01",X"01",X"01", + X"03",X"04",X"07",X"12",X"03",X"04",X"07",X"12",X"03",X"04",X"03",X"01",X"01",X"01",X"01",X"12", + X"01",X"01",X"01",X"04",X"03",X"16",X"07",X"03",X"16",X"07",X"03",X"01",X"01",X"01",X"01",X"12", + X"01",X"01",X"01",X"04",X"07",X"12",X"03",X"04",X"07",X"12",X"03",X"04",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"0C",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"04",X"04",X"0F",X"03",X"06", + X"04",X"04",X"0F",X"03",X"06",X"04",X"04",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"03",X"04",X"04",X"03",X"03",X"07",X"05",X"03", + X"03",X"04",X"01",X"01",X"01",X"01",X"03",X"03",X"07",X"05",X"03",X"01",X"01",X"01",X"04",X"07", + X"01",X"01",X"01",X"07",X"01",X"01",X"01",X"01",X"01",X"06",X"04",X"07",X"0F",X"06",X"04",X"01", + X"02",X"01",X"01",X"01",X"01",X"0F",X"01",X"01",X"01",X"02",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3A",X"A0", + X"4D",X"A7",X"C8",X"3A",X"AC",X"4D",X"A7",X"C0",X"CD",X"A1",X"1F",X"2A",X"31",X"4D",X"01",X"99", + X"4D",X"CD",X"27",X"1F",X"3A",X"99",X"4D",X"A7",X"CA",X"62",X"A3",X"2A",X"60",X"4D",X"29",X"22", + X"60",X"4D",X"2A",X"5E",X"4D",X"ED",X"6A",X"22",X"5E",X"4D",X"D0",X"21",X"60",X"4D",X"34",X"C3", + X"D0",X"A3",X"3A",X"A7",X"4D",X"A7",X"CA",X"80",X"A3",X"2A",X"5C",X"4D",X"29",X"22",X"5C",X"4D", + X"2A",X"5A",X"4D",X"ED",X"6A",X"22",X"5A",X"4D",X"D0",X"21",X"5C",X"4D",X"34",X"C3",X"D0",X"A3", + X"3A",X"B7",X"4D",X"A7",X"CA",X"9E",X"A3",X"2A",X"50",X"4D",X"29",X"22",X"50",X"4D",X"2A",X"4E", + X"4D",X"ED",X"6A",X"22",X"4E",X"4D",X"D0",X"21",X"50",X"4D",X"34",X"C3",X"D0",X"A3",X"3A",X"B6", + X"4D",X"A7",X"CA",X"BC",X"A3",X"2A",X"54",X"4D",X"29",X"22",X"54",X"4D",X"2A",X"52",X"4D",X"ED", + X"6A",X"22",X"52",X"4D",X"D0",X"21",X"54",X"4D",X"34",X"C3",X"D0",X"A3",X"2A",X"58",X"4D",X"29", + X"22",X"58",X"4D",X"2A",X"56",X"4D",X"ED",X"6A",X"22",X"56",X"4D",X"D0",X"21",X"58",X"4D",X"34", + X"21",X"14",X"4D",X"7E",X"A7",X"CA",X"E5",X"A3",X"3A",X"00",X"4D",X"E6",X"07",X"FE",X"04",X"CA", + X"EF",X"A3",X"C3",X"2E",X"A4",X"3A",X"01",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"2E",X"A4",X"3E", + X"01",X"CD",X"C8",X"A6",X"38",X"1B",X"3A",X"A7",X"4D",X"A7",X"CA",X"03",X"A4",X"EF",X"0C",X"00", + X"C3",X"11",X"A4",X"2A",X"0A",X"4D",X"CD",X"1F",X"1F",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"08", + X"00",X"CD",X"7D",X"2E",X"DD",X"21",X"1E",X"4D",X"FD",X"21",X"0A",X"4D",X"CD",X"CD",X"1E",X"22", + X"0A",X"4D",X"2A",X"1E",X"4D",X"22",X"14",X"4D",X"3A",X"2C",X"4D",X"32",X"28",X"4D",X"DD",X"21", + X"14",X"4D",X"FD",X"21",X"00",X"4D",X"CD",X"CD",X"1E",X"22",X"00",X"4D",X"CD",X"E5",X"1E",X"22", + X"31",X"4D",X"C9",X"3A",X"A1",X"4D",X"FE",X"01",X"C0",X"3A",X"AD",X"4D",X"A7",X"C0",X"2A",X"33", + X"4D",X"01",X"9A",X"4D",X"CD",X"27",X"1F",X"3A",X"9A",X"4D",X"A7",X"CA",X"75",X"A4",X"2A",X"6C", + X"4D",X"29",X"22",X"6C",X"4D",X"2A",X"6A",X"4D",X"ED",X"6A",X"22",X"6A",X"4D",X"D0",X"21",X"6C", + X"4D",X"34",X"C3",X"A7",X"A4",X"3A",X"A8",X"4D",X"A7",X"CA",X"93",X"A4",X"2A",X"68",X"4D",X"29", + X"22",X"68",X"4D",X"2A",X"66",X"4D",X"ED",X"6A",X"22",X"66",X"4D",X"D0",X"21",X"68",X"4D",X"34", + X"C3",X"A7",X"A4",X"2A",X"64",X"4D",X"29",X"22",X"64",X"4D",X"2A",X"62",X"4D",X"ED",X"6A",X"22", + X"62",X"4D",X"D0",X"21",X"64",X"4D",X"34",X"21",X"16",X"4D",X"7E",X"A7",X"CA",X"BC",X"A4",X"3A", + X"02",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"C6",X"A4",X"C3",X"05",X"A5",X"3A",X"03",X"4D",X"E6", + X"07",X"FE",X"04",X"C2",X"05",X"A5",X"3E",X"02",X"CD",X"C8",X"A6",X"38",X"1B",X"3A",X"A8",X"4D", + X"A7",X"CA",X"DA",X"A4",X"EF",X"0D",X"00",X"C3",X"E8",X"A4",X"2A",X"0C",X"4D",X"CD",X"1F",X"1F", + X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"09",X"00",X"CD",X"A4",X"2E",X"DD",X"21",X"20",X"4D",X"FD", + X"21",X"0C",X"4D",X"CD",X"CD",X"1E",X"22",X"0C",X"4D",X"2A",X"20",X"4D",X"22",X"16",X"4D",X"3A", + X"2D",X"4D",X"32",X"29",X"4D",X"DD",X"21",X"16",X"4D",X"FD",X"21",X"02",X"4D",X"CD",X"CD",X"1E", + X"22",X"02",X"4D",X"CD",X"E5",X"1E",X"22",X"33",X"4D",X"C9",X"3A",X"A2",X"4D",X"FE",X"01",X"C0", + X"3A",X"AE",X"4D",X"A7",X"C0",X"2A",X"35",X"4D",X"01",X"9B",X"4D",X"CD",X"27",X"1F",X"3A",X"9B", + X"4D",X"A7",X"CA",X"4C",X"A5",X"2A",X"78",X"4D",X"29",X"22",X"78",X"4D",X"2A",X"76",X"4D",X"ED", + X"6A",X"22",X"76",X"4D",X"D0",X"21",X"78",X"4D",X"34",X"C3",X"7E",X"A5",X"3A",X"A9",X"4D",X"A7", + X"CA",X"6A",X"A5",X"2A",X"74",X"4D",X"29",X"22",X"74",X"4D",X"2A",X"72",X"4D",X"ED",X"6A",X"22", + X"72",X"4D",X"D0",X"21",X"74",X"4D",X"34",X"C3",X"7E",X"A5",X"2A",X"70",X"4D",X"29",X"22",X"70", + X"4D",X"2A",X"6E",X"4D",X"ED",X"6A",X"22",X"6E",X"4D",X"D0",X"21",X"70",X"4D",X"34",X"21",X"18", + X"4D",X"7E",X"A7",X"CA",X"93",X"A5",X"3A",X"04",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"9D",X"A5", + X"C3",X"DC",X"A5",X"3A",X"05",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"DC",X"A5",X"3E",X"03",X"CD", + X"C8",X"A6",X"38",X"1B",X"3A",X"A9",X"4D",X"A7",X"CA",X"B1",X"A5",X"EF",X"0E",X"00",X"C3",X"BF", + X"A5",X"2A",X"0E",X"4D",X"CD",X"1F",X"1F",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"0A",X"00",X"CD", + X"CB",X"2E",X"DD",X"21",X"22",X"4D",X"FD",X"21",X"0E",X"4D",X"CD",X"CD",X"1E",X"22",X"0E",X"4D", + X"2A",X"22",X"4D",X"22",X"18",X"4D",X"3A",X"2E",X"4D",X"32",X"2A",X"4D",X"DD",X"21",X"18",X"4D", + X"FD",X"21",X"04",X"4D",X"CD",X"CD",X"1E",X"22",X"04",X"4D",X"CD",X"E5",X"1E",X"22",X"35",X"4D", + X"C9",X"3A",X"A3",X"4D",X"FE",X"01",X"C0",X"3A",X"AF",X"4D",X"A7",X"C0",X"2A",X"37",X"4D",X"01", + X"9C",X"4D",X"CD",X"27",X"1F",X"3A",X"9C",X"4D",X"A7",X"CA",X"23",X"A6",X"2A",X"84",X"4D",X"29", + X"22",X"84",X"4D",X"2A",X"82",X"4D",X"ED",X"6A",X"22",X"82",X"4D",X"D0",X"21",X"84",X"4D",X"34", + X"C3",X"55",X"A6",X"3A",X"AA",X"4D",X"A7",X"CA",X"41",X"A6",X"2A",X"80",X"4D",X"29",X"22",X"80", + X"4D",X"2A",X"7E",X"4D",X"ED",X"6A",X"22",X"7E",X"4D",X"D0",X"21",X"80",X"4D",X"34",X"C3",X"55", + X"A6",X"2A",X"7C",X"4D",X"29",X"22",X"7C",X"4D",X"2A",X"7A",X"4D",X"ED",X"6A",X"22",X"7A",X"4D", + X"D0",X"21",X"7C",X"4D",X"34",X"21",X"1A",X"4D",X"7E",X"A7",X"CA",X"6A",X"A6",X"3A",X"06",X"4D", + X"E6",X"07",X"FE",X"04",X"CA",X"74",X"A6",X"C3",X"B3",X"A6",X"3A",X"07",X"4D",X"E6",X"07",X"FE", + X"04",X"C2",X"B3",X"A6",X"3E",X"04",X"CD",X"C8",X"A6",X"38",X"1B",X"3A",X"AA",X"4D",X"A7",X"CA", + X"88",X"A6",X"EF",X"0F",X"00",X"C3",X"96",X"A6",X"2A",X"10",X"4D",X"CD",X"1F",X"1F",X"7E",X"FE", + X"1A",X"28",X"03",X"EF",X"0B",X"00",X"CD",X"F2",X"2E",X"DD",X"21",X"24",X"4D",X"FD",X"21",X"10", + X"4D",X"CD",X"CD",X"1E",X"22",X"10",X"4D",X"2A",X"24",X"4D",X"22",X"1A",X"4D",X"3A",X"2F",X"4D", + X"32",X"2B",X"4D",X"DD",X"21",X"1A",X"4D",X"FD",X"21",X"06",X"4D",X"CD",X"CD",X"1E",X"22",X"06", + X"4D",X"CD",X"E5",X"1E",X"22",X"37",X"4D",X"C9",X"87",X"4F",X"06",X"00",X"21",X"09",X"4D",X"09", + X"7E",X"FE",X"1D",X"C2",X"DB",X"A6",X"36",X"3D",X"C3",X"F4",X"A6",X"FE",X"3E",X"C2",X"E5",X"A6", + X"36",X"1E",X"C3",X"F4",X"A6",X"06",X"21",X"90",X"DA",X"F4",X"A6",X"7E",X"06",X"3B",X"90",X"D2", + X"F4",X"A6",X"A7",X"C9",X"37",X"C9",X"41",X"B0",X"41",X"B0",X"37",X"AF",X"C0",X"AC",X"27",X"AC", + X"86",X"A8",X"84",X"A7",X"86",X"A8",X"C5",X"A9",X"9E",X"AA",X"C5",X"A7",X"14",X"3C",X"3E",X"A8", + X"C5",X"A9",X"37",X"AF",X"27",X"AC",X"84",X"A7",X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8", + X"85",X"A8",X"85",X"A8",X"85",X"A8",X"AA",X"AF",X"AA",X"AF",X"BE",X"AE",X"C0",X"AC",X"8D",X"AC", + X"26",X"A9",X"A5",X"A7",X"26",X"A9",X"3D",X"AA",X"80",X"AB",X"08",X"A8",X"91",X"3B",X"61",X"A8", + X"3D",X"AA",X"BE",X"AE",X"8D",X"AC",X"A5",X"A7",X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8", + X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8",X"D8",X"AD",X"85",X"A8",X"85",X"A8",X"85",X"A8", + X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8", + X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8",X"85",X"A8", + X"85",X"A8",X"85",X"A8",X"F1",X"00",X"F2",X"02",X"F3",X"0A",X"F4",X"00",X"41",X"43",X"45",X"86", + X"8A",X"88",X"8B",X"6A",X"6B",X"71",X"6A",X"88",X"8B",X"6A",X"6B",X"71",X"6A",X"6B",X"71",X"73", + X"75",X"96",X"95",X"96",X"FF",X"F1",X"02",X"F2",X"03",X"F3",X"0A",X"F4",X"02",X"50",X"70",X"86", + X"90",X"81",X"90",X"86",X"90",X"68",X"6A",X"6B",X"68",X"6A",X"68",X"66",X"6A",X"68",X"66",X"65", + X"68",X"86",X"81",X"86",X"FF",X"F1",X"00",X"F2",X"02",X"F3",X"0A",X"F4",X"00",X"69",X"6B",X"69", + X"86",X"61",X"64",X"65",X"86",X"86",X"64",X"66",X"64",X"61",X"69",X"6B",X"69",X"86",X"61",X"64", + X"64",X"A1",X"70",X"71",X"74",X"75",X"35",X"76",X"30",X"50",X"35",X"76",X"30",X"50",X"54",X"56", + X"54",X"51",X"6B",X"69",X"6B",X"69",X"6B",X"91",X"6B",X"69",X"66",X"F2",X"01",X"74",X"76",X"74", + X"71",X"74",X"71",X"6B",X"69",X"A6",X"A6",X"FF",X"F1",X"03",X"F2",X"03",X"F3",X"0A",X"F4",X"02", + X"70",X"66",X"70",X"46",X"50",X"86",X"90",X"70",X"66",X"70",X"46",X"50",X"86",X"90",X"70",X"66", + X"70",X"46",X"50",X"86",X"90",X"70",X"61",X"70",X"41",X"50",X"81",X"90",X"F4",X"00",X"A6",X"A4", + X"A2",X"A1",X"F4",X"01",X"86",X"89",X"8B",X"81",X"74",X"71",X"6B",X"69",X"A6",X"FF",X"F1",X"00", + X"F2",X"02",X"F3",X"0A",X"F4",X"00",X"65",X"64",X"65",X"88",X"67",X"88",X"61",X"63",X"64",X"85", + X"64",X"85",X"6A",X"69",X"6A",X"8C",X"75",X"93",X"90",X"91",X"90",X"91",X"70",X"8A",X"68",X"71", + X"FF",X"F1",X"02",X"F2",X"03",X"F3",X"0A",X"F4",X"02",X"65",X"90",X"68",X"70",X"68",X"67",X"66", + X"65",X"90",X"61",X"70",X"61",X"65",X"68",X"66",X"90",X"63",X"90",X"86",X"90",X"85",X"90",X"85", + X"70",X"86",X"68",X"65",X"FF",X"FF",X"F1",X"00",X"F2",X"01",X"F3",X"0A",X"F4",X"00",X"77",X"76", + X"57",X"50",X"97",X"F2",X"02",X"74",X"92",X"8C",X"F2",X"01",X"90",X"90",X"90",X"74",X"73",X"74", + X"75",X"77",X"75",X"74",X"72",X"74",X"73",X"74",X"8C",X"67",X"6C",X"72",X"74",X"73",X"74",X"75", + X"77",X"7C",X"7B",X"79",X"77",X"75",X"72",X"6B",X"8B",X"90",X"77",X"75",X"72",X"8B",X"6C",X"6E", + X"6F",X"74",X"75",X"76",X"97",X"70",X"7C",X"70",X"7B",X"77",X"74",X"6C",X"6B",X"73",X"76",X"77", + X"94",X"74",X"76",X"77",X"70",X"74",X"70",X"7B",X"70",X"79",X"70",X"77",X"70",X"76",X"70",X"F2", + X"02",X"74",X"73",X"74",X"6B",X"6B",X"6A",X"6B",X"67",X"F2",X"01",X"77",X"76",X"77",X"74",X"74", + X"70",X"74",X"70",X"73",X"74",X"76",X"77",X"79",X"7C",X"7B",X"59",X"50",X"79",X"77",X"76",X"97", + X"70",X"74",X"70",X"F2",X"02",X"74",X"F2",X"01",X"7C",X"79",X"76",X"56",X"50",X"76",X"79",X"5C", + X"50",X"7C",X"7B",X"7A",X"9B",X"70",X"74",X"70",X"73",X"74",X"76",X"77",X"79",X"7C",X"7B",X"73", + X"94",X"91",X"F2",X"02",X"74",X"FF",X"F1",X"03",X"F2",X"03",X"F3",X"06",X"F4",X"03",X"87",X"90", + X"87",X"90",X"6C",X"70",X"67",X"70",X"69",X"70",X"6B",X"70",X"6C",X"70",X"74",X"70",X"67",X"70", + X"6B",X"70",X"6C",X"70",X"74",X"70",X"67",X"70",X"74",X"70",X"6C",X"70",X"77",X"70",X"74",X"70", + X"73",X"70",X"72",X"70",X"77",X"70",X"67",X"70",X"75",X"70",X"6B",X"70",X"75",X"70",X"67",X"70", + X"6B",X"70",X"6C",X"70",X"77",X"70",X"74",X"70",X"77",X"70",X"6B",X"70",X"7B",X"70",X"6B",X"70", + X"7B",X"70",X"F4",X"00",X"94",X"74",X"76",X"77",X"F4",X"01",X"70",X"74",X"70",X"6B",X"70",X"6C", + X"70",X"6D",X"70",X"6F",X"70",X"74",X"70",X"77",X"70",X"6B",X"70",X"74",X"70",X"F3",X"0A",X"67", + X"70",X"6B",X"70",X"64",X"70",X"67",X"70",X"66",X"70",X"6F",X"70",X"6B",X"70",X"6F",X"70",X"64", + X"70",X"6B",X"70",X"67",X"70",X"74",X"70",X"69",X"70",X"76",X"70",X"6B",X"70",X"6F",X"70",X"64", + X"70",X"6B",X"70",X"67",X"70",X"77",X"70",X"6B",X"70",X"7B",X"70",X"6B",X"70",X"7B",X"70",X"74", + X"70",X"6B",X"70",X"64",X"FF",X"F1",X"00",X"F2",X"02",X"F3",X"08",X"F4",X"01",X"B0",X"B0",X"90", + X"74",X"74",X"73",X"74",X"F4",X"00",X"97",X"77",X"94",X"74",X"F4",X"01",X"87",X"67",X"93",X"72", + X"8C",X"90",X"90",X"87",X"74",X"74",X"73",X"74",X"F4",X"00",X"8C",X"6C",X"97",X"77",X"F4",X"01", + X"95",X"74",X"92",X"74",X"F4",X"00",X"95",X"75",X"90",X"70",X"F4",X"01",X"79",X"78",X"79",X"75", + X"74",X"75",X"F4",X"00",X"92",X"72",X"97",X"77",X"F4",X"01",X"94",X"73",X"94",X"75",X"97",X"75", + X"94",X"72",X"87",X"74",X"74",X"73",X"74",X"F4",X"00",X"97",X"77",X"94",X"74",X"F4",X"01",X"96", + X"76",X"76",X"74",X"76",X"F4",X"00",X"99",X"79",X"90",X"79",X"F4",X"01",X"77",X"76",X"74",X"9B", + X"74",X"73",X"71",X"6B",X"96",X"77",X"F4",X"00",X"94",X"94",X"94",X"94",X"FF",X"F1",X"03",X"F2", + X"03",X"F3",X"08",X"F4",X"00",X"B0",X"B0",X"8C",X"6C",X"94",X"74",X"97",X"F4",X"01",X"6C",X"6C", + X"6B",X"6C",X"87",X"F4",X"00",X"67",X"89",X"6B",X"8C",X"67",X"89",X"6B",X"8C",X"74",X"87",X"74", + X"8C",X"74",X"87",X"74",X"92",X"75",X"87",X"75",X"8B",X"75",X"87",X"75",X"8B",X"75",X"87",X"75", + X"8B",X"75",X"87",X"72",X"8C",X"74",X"87",X"74",X"8B",X"67",X"89",X"6B",X"8C",X"74",X"87",X"74", + X"8C",X"74",X"87",X"74",X"8B",X"73",X"86",X"73",X"F4",X"01",X"8B",X"6B",X"F4",X"00",X"91",X"73", + X"94",X"94",X"70",X"74",X"8B",X"8B",X"60",X"6B",X"94",X"6B",X"87",X"6B",X"84",X"FF",X"F1",X"00", + X"F2",X"02",X"F3",X"0A",X"F4",X"00",X"59",X"58",X"59",X"50",X"54",X"53",X"54",X"50",X"4C",X"4B", + X"4C",X"50",X"49",X"48",X"49",X"50",X"44",X"43",X"24",X"30",X"64",X"4C",X"6B",X"89",X"69",X"70", + X"59",X"58",X"59",X"50",X"59",X"58",X"59",X"50",X"59",X"58",X"59",X"74",X"50",X"74",X"55",X"54", + X"55",X"50",X"59",X"58",X"59",X"50",X"94",X"74",X"6C",X"52",X"51",X"52",X"50",X"4B",X"4A",X"4B", + X"50",X"55",X"54",X"55",X"68",X"48",X"72",X"4C",X"4B",X"4C",X"50",X"46",X"44",X"46",X"50",X"88", + X"68",X"64",X"59",X"58",X"59",X"50",X"59",X"58",X"59",X"50",X"59",X"58",X"59",X"74",X"54",X"77", + X"55",X"54",X"55",X"50",X"4C",X"4B",X"4C",X"50",X"95",X"75",X"76",X"57",X"56",X"57",X"50",X"47", + X"46",X"47",X"50",X"57",X"56",X"57",X"50",X"5C",X"5B",X"5C",X"50",X"47",X"46",X"27",X"30",X"67", + X"54",X"72",X"8C",X"6C",X"67",X"54",X"53",X"74",X"4C",X"4B",X"6C",X"54",X"53",X"54",X"77",X"59", + X"77",X"55",X"54",X"75",X"4B",X"49",X"6B",X"95",X"75",X"70",X"47",X"46",X"67",X"4B",X"4A",X"6B", + X"59",X"58",X"59",X"4B",X"6B",X"57",X"50",X"57",X"59",X"57",X"50",X"57",X"59",X"57",X"50",X"77", + X"75",X"74",X"72",X"54",X"53",X"74",X"4C",X"4B",X"6C",X"57",X"56",X"57",X"54",X"74",X"77",X"59", + X"58",X"59",X"50",X"59",X"58",X"59",X"3C",X"30",X"9C",X"7C",X"79",X"57",X"59",X"77",X"54",X"55", + X"74",X"4C",X"4E",X"4C",X"47",X"67",X"77",X"47",X"46",X"27",X"30",X"67",X"54",X"72",X"AC",X"FF", + X"F1",X"03",X"F2",X"03",X"F3",X"08",X"F4",X"02",X"79",X"70",X"74",X"70",X"6C",X"70",X"69",X"70", + X"64",X"70",X"64",X"70",X"69",X"6C",X"64",X"6C",X"69",X"74",X"64",X"74",X"69",X"74",X"64",X"74", + X"6B",X"72",X"64",X"72",X"69",X"6C",X"64",X"74",X"6B",X"74",X"64",X"74",X"68",X"72",X"64",X"6B", + X"69",X"74",X"62",X"6C",X"64",X"74",X"64",X"74",X"69",X"74",X"64",X"74",X"69",X"74",X"64",X"74", + X"65",X"6C",X"F2",X"02",X"60",X"F2",X"03",X"6C",X"65",X"6C",X"F2",X"02",X"60",X"F2",X"03",X"6C", + X"6C",X"74",X"67",X"6C",X"64",X"67",X"F2",X"02",X"60",X"F2",X"03",X"6C",X"67",X"77",X"67",X"77", + X"F2",X"01",X"7C",X"F2",X"03",X"6C",X"6C",X"5C",X"50",X"F2",X"04",X"6C",X"74",X"67",X"74",X"6C", + X"74",X"67",X"74",X"6B",X"75",X"67",X"75",X"6B",X"75",X"67",X"75",X"6B",X"75",X"67",X"75",X"6B", + X"75",X"67",X"6B",X"6C",X"74",X"67",X"74",X"6B",X"67",X"69",X"6B",X"6C",X"74",X"67",X"74",X"6C", + X"74",X"67",X"74",X"65",X"6C",X"F2",X"02",X"60",X"F2",X"04",X"6C",X"65",X"6C",X"69",X"66",X"67", + X"74",X"6C",X"74",X"67",X"74",X"6C",X"FF",X"F1",X"00",X"F2",X"02",X"F3",X"0A",X"F4",X"06",X"B5", + X"96",X"98",X"98",X"96",X"95",X"93",X"91",X"91",X"93",X"95",X"95",X"F5",X"73",X"B3",X"B5",X"96", + X"98",X"98",X"96",X"95",X"93",X"91",X"91",X"93",X"95",X"93",X"F5",X"71",X"B1",X"B3",X"95",X"91", + X"93",X"75",X"76",X"95",X"91",X"93",X"75",X"76",X"95",X"93",X"91",X"93",X"88",X"B5",X"90",X"96", + X"98",X"98",X"96",X"95",X"93",X"91",X"91",X"93",X"95",X"93",X"F5",X"71",X"B1",X"B3",X"95",X"91", + X"93",X"75",X"76",X"95",X"91",X"93",X"75",X"76",X"95",X"93",X"91",X"93",X"88",X"B5",X"90",X"96", + X"98",X"98",X"96",X"95",X"93",X"91",X"91",X"93",X"95",X"93",X"71",X"B1",X"FF",X"F1",X"02",X"F2", + X"03",X"F3",X"08",X"F4",X"06",X"D1",X"C8",X"D1",X"C8",X"D1",X"C8",X"D1",X"A8",X"B1",X"B8",X"B1", + X"B8",X"B1",X"F2",X"04",X"A3",X"A5",X"F2",X"03",X"BA",X"93",X"98",X"D1",X"C8",X"D1",X"A8",X"B1", + X"B8",X"B1",X"B8",X"B1",X"B3",X"B5",X"AA",X"93",X"98",X"D1",X"C8",X"D1",X"A8",X"B1",X"FF",X"FF", + X"F1",X"03",X"F2",X"04",X"F3",X"0A",X"F4",X"06",X"49",X"8A",X"70",X"F5",X"4C",X"91",X"70",X"F5", + X"49",X"6A",X"F5",X"4C",X"71",X"F5",X"56",X"75",X"F5",X"4A",X"71",X"F5",X"55",X"B4",X"75",X"73", + X"71",X"6A",X"68",X"AA",X"F5",X"70",X"F5",X"49",X"8A",X"70",X"F5",X"4C",X"91",X"70",X"F5",X"48", + X"6A",X"F5",X"4C",X"61",X"F5",X"56",X"75",X"F5",X"51",X"75",X"F5",X"5A",X"D9",X"B9",X"F5",X"70", + X"F5",X"49",X"8A",X"70",X"F5",X"4C",X"91",X"70",X"F5",X"49",X"6A",X"F5",X"4C",X"71",X"F5",X"56", + X"75",X"F5",X"4A",X"71",X"F5",X"55",X"B4",X"75",X"73",X"71",X"6A",X"68",X"6A",X"CA",X"90",X"7A", + X"F5",X"58",X"75",X"F5",X"53",X"71",X"F5",X"4A",X"54",X"73",X"F5",X"55",X"73",X"F5",X"55",X"73", + X"F5",X"55",X"73",X"F5",X"71",X"6A",X"68",X"6A",X"6A",X"AA",X"AA",X"F5",X"90",X"71",X"6A",X"68", + X"6A",X"6A",X"AA",X"AA",X"F5",X"90",X"71",X"6A",X"68",X"6A",X"6A",X"AA",X"AA",X"F5",X"70",X"F5", + X"89",X"8A",X"70",X"F5",X"4C",X"91",X"70",X"F5",X"49",X"6A",X"F5",X"4C",X"71",X"F5",X"56",X"75", + X"F5",X"4A",X"71",X"F5",X"55",X"B4",X"75",X"73",X"71",X"6A",X"68",X"AA",X"F5",X"70",X"F5",X"49", + X"8A",X"70",X"F5",X"4C",X"91",X"70",X"F5",X"48",X"6A",X"F5",X"4C",X"61",X"F5",X"56",X"75",X"F5", + X"51",X"75",X"F5",X"5A",X"D9",X"B9",X"F5",X"70",X"F5",X"49",X"8A",X"70",X"F5",X"4C",X"91",X"70", + X"F5",X"49",X"6A",X"F5",X"4C",X"71",X"F5",X"56",X"75",X"F5",X"4A",X"71",X"F5",X"55",X"B4",X"75", + X"73",X"71",X"6A",X"68",X"6A",X"CA",X"90",X"7A",X"F5",X"58",X"75",X"F5",X"53",X"71",X"F5",X"4A", + X"54",X"73",X"F5",X"55",X"73",X"F5",X"55",X"73",X"F5",X"55",X"73",X"F5",X"71",X"6A",X"68",X"6A", + X"6A",X"AA",X"AA",X"F5",X"90",X"71",X"6A",X"68",X"6A",X"6A",X"AA",X"AA",X"F5",X"90",X"71",X"6A", + X"68",X"6A",X"6A",X"AA",X"AA",X"F5",X"90",X"FF",X"F1",X"00",X"F2",X"01",X"F3",X"08",X"F4",X"00", + X"B5",X"B5",X"B3",X"B3",X"71",X"6C",X"71",X"73",X"71",X"6A",X"65",X"66",X"68",X"6A",X"68",X"3E", + X"43",X"3E",X"11",X"3E",X"2F",X"6F",X"3E",X"42",X"3E",X"42",X"3E",X"42",X"67",X"7E",X"FE",X"4D", + X"20",X"ED",X"19",X"6F",X"3E",X"42",X"67",X"3E",X"42",X"FE",X"4D",X"FE",X"4D",X"FE",X"4D",X"7E", + X"E1",X"E9",X"9D",X"9D",X"98",X"98",X"95",X"95",X"93",X"71",X"73",X"95",X"98",X"78",X"75",X"71", + X"FF",X"F1",X"00",X"F2",X"01",X"F3",X"08",X"F4",X"00",X"B5",X"B5",X"B3",X"B3",X"71",X"6C",X"71", + X"73",X"71",X"6A",X"65",X"66",X"68",X"6A",X"68",X"01",X"00",X"40",X"DD",X"21",X"00",X"00",X"21", + X"00",X"00",X"16",X"00",X"7E",X"5F",X"DD",X"19",X"32",X"C0",X"50",X"23",X"0B",X"79",X"B0",X"20", + X"F1",X"11",X"00",X"40",X"19",X"01",X"00",X"40",X"16",X"00",X"7E",X"5F",X"DD",X"19",X"32",X"C0", + X"50",X"23",X"0B",X"79",X"B0",X"20",X"F1",X"DD",X"E5",X"E1",X"7D",X"AF",X"C9",X"08",X"3A",X"00", + X"50",X"CB",X"67",X"C2",X"54",X"BC",X"3A",X"00",X"50",X"E6",X"E0",X"FE",X"E0",X"21",X"21",X"C3", + X"E5",X"C8",X"CD",X"41",X"25",X"08",X"F5",X"DD",X"21",X"50",X"40",X"CD",X"BF",X"24",X"F1",X"47", + X"AF",X"90",X"DD",X"21",X"55",X"40",X"CD",X"BF",X"24",X"06",X"80",X"CD",X"79",X"32",X"C9",X"E9", + X"E9",X"E9",X"E9",X"E9",X"C8",X"C8",X"9D",X"9D",X"98",X"98",X"95",X"95",X"93",X"71",X"73",X"95", + X"98",X"78",X"75",X"71",X"FF",X"F1",X"00",X"F2",X"00",X"F3",X"00",X"F4",X"00",X"FF",X"F1",X"03", + X"F2",X"03",X"F3",X"06",X"F4",X"03",X"B5",X"B5",X"B3",X"B3",X"91",X"9F",X"88",X"9F",X"91",X"9F", + X"88",X"9F",X"91",X"9F",X"88",X"9F",X"88",X"9F",X"88",X"9F",X"91",X"9F",X"88",X"9F",X"91",X"9F", + X"88",X"9F",X"91",X"9F",X"88",X"9F",X"91",X"9F",X"7F",X"7F",X"7D",X"7F",X"7D",X"7C",X"7A",X"78", + X"7A",X"78",X"76",X"75",X"78",X"76",X"75",X"73",X"51",X"52",X"53",X"54",X"55",X"56",X"78",X"76", + X"78",X"7A",X"7D",X"7A",X"7C",X"7D",X"7F",X"F2",X"04",X"61",X"63",X"65",X"66",X"F2",X"03",X"46", + X"4A",X"51",X"53",X"56",X"58",X"5A",X"5D",X"91",X"9F",X"93",X"9F",X"95",X"9F",X"88",X"9F",X"91", + X"9F",X"88",X"9F",X"91",X"9F",X"98",X"75",X"73",X"F0",X"26",X"A9",X"FF",X"C3",X"EF",X"BF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"00",X"F2",X"01",X"F3",X"08",X"F4",X"00",X"B5", + X"B5",X"B3",X"B3",X"71",X"6C",X"71",X"73",X"71",X"6A",X"65",X"66",X"68",X"6A",X"68",X"65",X"88", + X"71",X"73",X"95",X"95",X"75",X"73",X"71",X"73",X"75",X"73",X"73",X"72",X"93",X"75",X"73",X"71", + X"6C",X"71",X"73",X"71",X"6A",X"65",X"66",X"68",X"6A",X"68",X"65",X"88",X"71",X"73",X"95",X"98", + X"78",X"76",X"71",X"73",X"75",X"71",X"93",X"B1",X"75",X"98",X"75",X"98",X"98",X"75",X"98",X"75", + X"58",X"46",X"48",X"4C",X"51",X"55",X"58",X"55",X"76",X"9A",X"76",X"9A",X"9A",X"76",X"9A",X"76", + X"9A",X"6A",X"6C",X"9D",X"9D",X"98",X"98",X"95",X"95",X"93",X"71",X"73",X"95",X"98",X"78",X"75", + X"71",X"73",X"75",X"71",X"93",X"B1",X"F0",X"86",X"A8",X"FF",X"F1",X"03",X"F2",X"03",X"F3",X"08", + X"F4",X"06",X"8A",X"9A",X"8A",X"9A",X"8A",X"9A",X"8A",X"9A",X"83",X"93",X"83",X"93",X"88",X"98", + X"88",X"98",X"81",X"91",X"81",X"91",X"81",X"91",X"81",X"91",X"8A",X"9A",X"8A",X"9A",X"8A",X"9A", + X"8A",X"9A",X"83",X"93",X"83",X"93",X"88",X"98",X"88",X"98",X"81",X"91",X"81",X"91",X"81",X"91", + X"81",X"91",X"83",X"93",X"83",X"93",X"83",X"93",X"83",X"93",X"83",X"93",X"83",X"93",X"83",X"93", + X"A6",X"A8",X"A8",X"88",X"98",X"88",X"98",X"D5",X"D0",X"8A",X"9A",X"8A",X"9A",X"8A",X"9A",X"8A", + X"9A",X"83",X"93",X"83",X"93",X"88",X"98",X"88",X"98",X"81",X"91",X"81",X"91",X"81",X"91",X"81", + X"91",X"8A",X"9A",X"8A",X"9A",X"8A",X"9A",X"8A",X"9A",X"83",X"93",X"83",X"93",X"88",X"98",X"88", + X"98",X"81",X"91",X"81",X"91",X"81",X"91",X"81",X"91",X"83",X"93",X"83",X"93",X"83",X"93",X"83", + X"93",X"83",X"93",X"83",X"93",X"83",X"93",X"A6",X"A8",X"A8",X"88",X"98",X"88",X"98",X"D5",X"D0", + X"FF",X"F1",X"00",X"F2",X"01",X"F3",X"04",X"F4",X"06",X"D5",X"93",X"91",X"8C",X"8A",X"8A",X"91", + X"8C",X"8A",X"88",X"8A",X"88",X"85",X"C8",X"D0",X"D5",X"93",X"91",X"8C",X"8A",X"8A",X"91",X"8C", + X"8A",X"88",X"8A",X"88",X"85",X"C8",X"D0",X"93",X"93",X"93",X"91",X"A6",X"86",X"8A",X"95",X"95", + X"95",X"93",X"A6",X"8A",X"91",X"91",X"F5",X"6A",X"88",X"88",X"88",X"8A",X"88",X"CA",X"D0",X"D5", + X"93",X"91",X"8C",X"8A",X"8A",X"91",X"8C",X"8A",X"88",X"8A",X"88",X"85",X"C8",X"D0",X"D5",X"93", + X"91",X"8C",X"8A",X"8A",X"91",X"8C",X"8A",X"88",X"8A",X"88",X"85",X"A8",X"B0",X"93",X"93",X"93", + X"91",X"A6",X"86",X"8A",X"95",X"95",X"95",X"93",X"A6",X"8A",X"91",X"91",X"F5",X"6A",X"88",X"88", + X"88",X"8A",X"88",X"CA",X"D0",X"FF",X"2A",X"0A",X"4C",X"22",X"C2",X"4F",X"2A",X"0C",X"4C",X"22", + X"D3",X"4F",X"2A",X"08",X"4D",X"22",X"C4",X"4F",X"2A",X"D2",X"4D",X"22",X"D0",X"4F",X"2A",X"1A", + X"4C",X"22",X"D5",X"4F",X"2A",X"1C",X"4C",X"22",X"D7",X"4F",X"C9",X"2A",X"C2",X"4F",X"3E",X"09", + X"67",X"22",X"0A",X"4C",X"2A",X"D3",X"4F",X"3E",X"05",X"67",X"22",X"0C",X"4C",X"2A",X"C4",X"4F", + X"22",X"08",X"4D",X"2A",X"D0",X"4F",X"22",X"D2",X"4D",X"2A",X"D5",X"4F",X"22",X"1A",X"4C",X"2A", + X"D7",X"4F",X"22",X"1C",X"4C",X"C9",X"2A",X"D3",X"4F",X"22",X"0A",X"4C",X"2A",X"D0",X"4F",X"22", + X"08",X"4D",X"2A",X"D7",X"4F",X"22",X"1A",X"4C",X"C9",X"2A",X"0A",X"4C",X"22",X"D3",X"4F",X"2A", + X"08",X"4D",X"22",X"D0",X"4F",X"2A",X"1A",X"4C",X"22",X"D7",X"4F",X"C9",X"C9",X"F5",X"2A",X"12", + X"4D",X"E5",X"2A",X"C6",X"4F",X"22",X"12",X"4D",X"E1",X"22",X"C6",X"4F",X"2A",X"39",X"4D",X"E5", + X"2A",X"C8",X"4F",X"22",X"39",X"4D",X"E1",X"22",X"C8",X"4F",X"2A",X"1C",X"4D",X"E5",X"2A",X"CA", + X"4F",X"22",X"1C",X"4D",X"E1",X"22",X"CA",X"4F",X"2A",X"26",X"4D",X"E5",X"2A",X"CC",X"4F",X"22", + X"26",X"4D",X"E1",X"22",X"CC",X"4F",X"3A",X"30",X"4D",X"F5",X"3A",X"CE",X"4F",X"32",X"30",X"4D", + X"F1",X"32",X"CE",X"4F",X"3A",X"3C",X"4D",X"F5",X"3A",X"CF",X"4F",X"32",X"3C",X"4D",X"F1",X"32", + X"CF",X"4F",X"F1",X"C9",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"CD",X"98",X"B1",X"FD", + X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"C9",X"AF",X"32",X"04",X"50",X"32",X"05",X"50",X"3E", + X"01",X"32",X"00",X"4F",X"3A",X"E0",X"4D",X"FE",X"0F",X"C4",X"04",X"97",X"3A",X"E0",X"4D",X"E7", + X"C8",X"B1",X"FB",X"B1",X"05",X"B2",X"0F",X"B2",X"19",X"B2",X"23",X"B2",X"2D",X"B2",X"37",X"B2", + X"41",X"B2",X"4B",X"B2",X"55",X"B2",X"DC",X"B2",X"EF",X"00",X"01",X"EF",X"01",X"00",X"EF",X"04", + X"00",X"EF",X"1E",X"00",X"21",X"84",X"36",X"11",X"E8",X"4D",X"01",X"10",X"00",X"77",X"ED",X"B0", + X"EF",X"1C",X"00",X"0E",X"0C",X"06",X"1C",X"CD",X"42",X"00",X"0E",X"0F",X"06",X"20",X"CD",X"42", + X"00",X"3E",X"27",X"32",X"04",X"4E",X"21",X"E0",X"4D",X"34",X"C9",X"EF",X"20",X"26",X"DD",X"21", + X"EA",X"4D",X"C3",X"5F",X"B2",X"EF",X"20",X"27",X"DD",X"21",X"EB",X"4D",X"C3",X"5F",X"B2",X"EF", + X"20",X"28",X"DD",X"21",X"EC",X"4D",X"C3",X"5F",X"B2",X"EF",X"20",X"29",X"DD",X"21",X"ED",X"4D", + X"C3",X"5F",X"B2",X"EF",X"20",X"2A",X"DD",X"21",X"EE",X"4D",X"C3",X"5F",X"B2",X"EF",X"20",X"2B", + X"DD",X"21",X"EF",X"4D",X"C3",X"5F",X"B2",X"EF",X"20",X"2C",X"DD",X"21",X"F0",X"4D",X"C3",X"5F", + X"B2",X"EF",X"20",X"2D",X"DD",X"21",X"F1",X"4D",X"C3",X"5F",X"B2",X"EF",X"20",X"2E",X"DD",X"21", + X"F2",X"4D",X"C3",X"5F",X"B2",X"EF",X"20",X"2F",X"DD",X"21",X"F3",X"4D",X"C3",X"5F",X"B2",X"3A", + X"E1",X"4D",X"57",X"3A",X"00",X"50",X"4F",X"32",X"E1",X"4D",X"B2",X"A9",X"32",X"E2",X"4D",X"CB", + X"57",X"20",X"19",X"CB",X"4F",X"20",X"3D",X"CB",X"5F",X"3E",X"27",X"32",X"04",X"4E",X"C8",X"EF", + X"1C",X"00",X"21",X"E0",X"4D",X"34",X"3E",X"27",X"32",X"04",X"4E",X"C9",X"DD",X"7E",X"00",X"3C", + X"FE",X"5A",X"30",X"0F",X"DD",X"77",X"00",X"32",X"02",X"4F",X"EF",X"1C",X"00",X"3E",X"27",X"32", + X"04",X"4E",X"C9",X"3E",X"5A",X"32",X"02",X"4F",X"DD",X"77",X"00",X"EF",X"1C",X"00",X"3E",X"27", + X"32",X"04",X"4E",X"C9",X"DD",X"7E",X"00",X"3D",X"FE",X"40",X"38",X"0F",X"32",X"02",X"4F",X"DD", + X"77",X"00",X"EF",X"1C",X"00",X"3E",X"27",X"32",X"04",X"4E",X"C9",X"3E",X"40",X"32",X"02",X"4F", + X"DD",X"77",X"00",X"EF",X"1C",X"00",X"3E",X"27",X"32",X"04",X"4E",X"C9",X"21",X"D4",X"83",X"22", + X"E8",X"4D",X"EF",X"1C",X"00",X"AF",X"32",X"E0",X"4D",X"3A",X"FF",X"4D",X"32",X"04",X"4E",X"AF", + X"32",X"00",X"4F",X"32",X"00",X"4F",X"32",X"FE",X"4D",X"C9",X"3E",X"40",X"67",X"AF",X"6F",X"3E", + X"C9",X"77",X"3A",X"70",X"4C",X"FE",X"03",X"C0",X"3A",X"0E",X"4E",X"FE",X"80",X"D8",X"DD",X"2A", + X"00",X"4C",X"3E",X"1C",X"DD",X"BE",X"02",X"CA",X"90",X"B3",X"DD",X"BE",X"04",X"CA",X"90",X"B3", + X"DD",X"BE",X"06",X"CA",X"90",X"B3",X"DD",X"BE",X"08",X"CA",X"90",X"B3",X"3A",X"0E",X"4E",X"E6", + X"01",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"47",X"3A",X"05",X"4E",X"3C",X"80",X"32",X"05",X"4E", + X"E6",X"7F",X"FE",X"40",X"38",X"02",X"18",X"48",X"DD",X"2A",X"00",X"4C",X"3E",X"1C",X"DD",X"BE", + X"02",X"C8",X"DD",X"BE",X"04",X"C8",X"DD",X"BE",X"06",X"C8",X"DD",X"BE",X"08",X"C8",X"2A",X"FB", + X"4D",X"7C",X"B5",X"C0",X"3A",X"FD",X"4D",X"FE",X"05",X"C8",X"21",X"35",X"95",X"CD",X"A1",X"94", + X"69",X"60",X"3A",X"08",X"4D",X"47",X"3A",X"FD",X"4D",X"80",X"E6",X"03",X"CB",X"27",X"5F",X"16", + X"00",X"19",X"5E",X"23",X"56",X"EB",X"22",X"FB",X"4D",X"CD",X"1E",X"B4",X"CD",X"A6",X"3F",X"C9", + X"2A",X"FB",X"4D",X"7C",X"B5",X"C8",X"CD",X"39",X"B4",X"21",X"00",X"00",X"22",X"FB",X"4D",X"C9", + X"E5",X"21",X"76",X"3A",X"3A",X"13",X"4E",X"E6",X"07",X"CB",X"27",X"5F",X"16",X"00",X"19",X"EB", + X"E1",X"CD",X"ED",X"B3",X"C9",X"21",X"40",X"86",X"3A",X"13",X"4E",X"78",X"3A",X"08",X"4D",X"81", + X"83",X"82",X"80",X"ED",X"44",X"E6",X"07",X"CB",X"27",X"5F",X"16",X"00",X"19",X"C9",X"DD",X"E5", + X"DD",X"21",X"02",X"4C",X"06",X"04",X"CD",X"B5",X"B3",X"7E",X"DD",X"77",X"00",X"23",X"7E",X"DD", + X"77",X"01",X"DD",X"23",X"DD",X"23",X"10",X"EE",X"DD",X"E1",X"C3",X"58",X"1E",X"1A",X"CD",X"0A", + X"B4",X"3E",X"04",X"84",X"67",X"13",X"1A",X"CD",X"FB",X"B3",X"C9",X"E5",X"D5",X"77",X"23",X"77", + X"11",X"1F",X"00",X"19",X"77",X"23",X"77",X"D1",X"E1",X"C9",X"E5",X"D5",X"11",X"1F",X"00",X"77", + X"3C",X"3C",X"23",X"77",X"3D",X"19",X"77",X"3C",X"3C",X"23",X"77",X"D1",X"E1",X"C9",X"E5",X"D5", + X"11",X"1F",X"00",X"7E",X"32",X"E3",X"4D",X"23",X"7E",X"32",X"E4",X"4D",X"19",X"7E",X"32",X"E5", + X"4D",X"23",X"7E",X"32",X"E6",X"4D",X"D1",X"E1",X"C9",X"E5",X"D5",X"11",X"1F",X"00",X"3A",X"E3", + X"4D",X"77",X"23",X"3A",X"E4",X"4D",X"77",X"19",X"3A",X"E5",X"4D",X"77",X"23",X"3A",X"E6",X"4D", + X"77",X"D1",X"E1",X"E5",X"D5",X"3E",X"04",X"84",X"67",X"3A",X"7E",X"44",X"77",X"23",X"77",X"11", + X"1F",X"00",X"19",X"77",X"23",X"77",X"D1",X"E1",X"C9",X"3A",X"13",X"4E",X"3A",X"02",X"4D",X"80", + X"99",X"82",X"0F",X"0F",X"0F",X"85",X"6F",X"3A",X"00",X"4D",X"85",X"6F",X"3A",X"04",X"4D",X"85", + X"6F",X"3A",X"06",X"4D",X"85",X"E6",X"0F",X"E7",X"EF",X"B5",X"EF",X"B5",X"FD",X"B5",X"0B",X"B6", + X"19",X"B6",X"27",X"B6",X"35",X"B6",X"43",X"B6",X"27",X"B6",X"27",X"B6",X"43",X"B6",X"27",X"B6", + X"35",X"B6",X"43",X"B6",X"43",X"B6",X"51",X"B6",X"51",X"B6",X"51",X"B6",X"1D",X"03",X"5C",X"40", + X"4F",X"4A",X"45",X"44",X"41",X"40",X"31",X"39",X"39",X"30",X"2F",X"81",X"2F",X"80",X"45",X"03", + X"40",X"26",X"40",X"40",X"44",X"4F",X"42",X"4C",X"45",X"40",X"40",X"43",X"4F",X"4D",X"41",X"4E", + X"44",X"4F",X"40",X"40",X"27",X"40",X"2F",X"80",X"2F",X"80",X"45",X"03",X"40",X"26",X"40",X"40", + X"44",X"4F",X"42",X"4C",X"45",X"40",X"40",X"43",X"4F",X"4D",X"41",X"4E",X"44",X"4F",X"40",X"40", + X"27",X"40",X"2F",X"81",X"2F",X"80",X"92",X"02",X"40",X"40",X"54",X"55",X"52",X"42",X"4F",X"5B", + X"40",X"40",X"2F",X"81",X"2F",X"80",X"92",X"02",X"45",X"58",X"54",X"52",X"41",X"40",X"43",X"4F", + X"49",X"4E",X"2F",X"89",X"2F",X"80",X"9B",X"02",X"4D",X"49",X"4B",X"59",X"40",X"40",X"53",X"52", + X"4C",X"2F",X"89",X"2F",X"80",X"9B",X"02",X"4D",X"49",X"4B",X"59",X"40",X"40",X"53",X"52",X"4C", + X"2F",X"81",X"2F",X"80",X"8B",X"02",X"40",X"40",X"4C",X"41",X"4D",X"42",X"41",X"44",X"41",X"2F", + X"85",X"2F",X"80",X"8E",X"02",X"42",X"55",X"55",X"55",X"55",X"5B",X"40",X"2F",X"8F",X"2F",X"80", + X"10",X"02",X"4A",X"49",X"40",X"4A",X"49",X"5B",X"40",X"2F",X"8F",X"2F",X"80",X"8E",X"02",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"2F",X"8F",X"2F",X"80",X"10",X"02",X"44",X"41",X"56",X"49", + X"44",X"40",X"40",X"40",X"40",X"40",X"2F",X"81",X"2F",X"80",X"12",X"02",X"46",X"4C",X"41",X"56", + X"49",X"41",X"40",X"40",X"40",X"40",X"2F",X"83",X"2F",X"80",X"14",X"02",X"4D",X"49",X"47",X"55", + X"45",X"4C",X"49",X"54",X"4F",X"40",X"2F",X"85",X"2F",X"80",X"16",X"02",X"52",X"4F",X"4D",X"49", + X"4E",X"41",X"40",X"40",X"40",X"40",X"2F",X"87",X"2F",X"80",X"18",X"02",X"4D",X"41",X"4D",X"49", + X"40",X"40",X"40",X"40",X"40",X"40",X"2F",X"89",X"2F",X"80",X"1A",X"02",X"50",X"41",X"50",X"49", + X"40",X"40",X"40",X"40",X"40",X"40",X"2F",X"89",X"2F",X"80",X"EF",X"00",X"01",X"EF",X"01",X"00", + X"EF",X"04",X"00",X"EF",X"1E",X"00",X"0E",X"0C",X"CD",X"86",X"06",X"C9",X"21",X"04",X"4E",X"3E", + X"20",X"77",X"C9",X"C9",X"F5",X"EF",X"20",X"12",X"21",X"BC",X"4E",X"CB",X"DE",X"F1",X"C9",X"F5", + X"EF",X"20",X"13",X"EF",X"21",X"12",X"21",X"BC",X"4E",X"CB",X"DE",X"F1",X"C9",X"F5",X"EF",X"20", + X"14",X"EF",X"21",X"13",X"21",X"BC",X"4E",X"CB",X"DE",X"F1",X"C9",X"F5",X"EF",X"20",X"15",X"EF", + X"21",X"14",X"21",X"BC",X"4E",X"CB",X"DE",X"F1",X"C9",X"F5",X"EF",X"20",X"16",X"EF",X"21",X"15", + X"21",X"BC",X"4E",X"CB",X"DE",X"F1",X"C9",X"F5",X"EF",X"20",X"17",X"EF",X"21",X"16",X"21",X"BC", + X"4E",X"CB",X"DE",X"F1",X"C9",X"F5",X"EF",X"20",X"18",X"EF",X"21",X"17",X"21",X"BC",X"4E",X"CB", + X"DE",X"F1",X"C9",X"F5",X"EF",X"20",X"19",X"EF",X"21",X"18",X"21",X"BC",X"4E",X"CB",X"DE",X"F1", + X"C9",X"F5",X"EF",X"20",X"1A",X"EF",X"21",X"19",X"21",X"BC",X"4E",X"CB",X"E6",X"F1",X"C9",X"3A", + X"13",X"4E",X"3A",X"02",X"4D",X"80",X"99",X"82",X"0F",X"0F",X"0F",X"85",X"6F",X"3A",X"00",X"4D", + X"85",X"6F",X"3A",X"04",X"4D",X"85",X"6F",X"3A",X"06",X"4D",X"85",X"E6",X"0F",X"E7",X"46",X"1D", + X"FF",X"1C",X"22",X"1D",X"FF",X"1C",X"54",X"1D",X"1C",X"93",X"2D",X"93",X"22",X"1D",X"FF",X"1C", + X"3E",X"93",X"22",X"1D",X"4F",X"93",X"60",X"93",X"71",X"93",X"46",X"1D",X"82",X"93",X"EF",X"7A", + X"EF",X"7A",X"EF",X"7A",X"60",X"93",X"46",X"1D",X"FF",X"1C",X"EF",X"65",X"EF",X"7A",X"60",X"93", + X"46",X"1D",X"FF",X"1C",X"EF",X"65",X"31",X"32",X"33",X"34",X"35",X"36",X"37",X"38",X"39",X"41", + X"42",X"43",X"44",X"45",X"46",X"47",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"50",X"51", + X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59",X"5A",X"EF",X"A5",X"31",X"32",X"33",X"34",X"35", + X"36",X"37",X"38",X"39",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"88",X"89",X"8A",X"8B",X"8C", + X"8D",X"8E",X"8F",X"90",X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"98",X"99",X"9A",X"F5",X"C5", + X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"08",X"D9",X"F5",X"C5",X"D5",X"E5",X"21",X"00",X"60",X"11", + X"01",X"60",X"01",X"00",X"20",X"6F",X"B7",X"ED",X"70",X"21",X"00",X"40",X"11",X"01",X"40",X"01", + X"00",X"04",X"3E",X"80",X"ED",X"70",X"21",X"00",X"44",X"11",X"01",X"44",X"01",X"00",X"04",X"3E", + X"0F",X"ED",X"70",X"11",X"17",X"1B",X"CD",X"6B",X"01",X"83",X"81",X"92",X"87",X"81",X"80",X"90", + X"92",X"8F",X"87",X"92",X"81",X"8D",X"81",X"80",X"96",X"8F",X"8C",X"81",X"94",X"89",X"8C",X"00", + X"11",X"15",X"1B",X"CD",X"6B",X"01",X"8F",X"90",X"85",X"92",X"81",X"83",X"89",X"8F",X"8E",X"80", + X"84",X"85",X"80",X"92",X"85",X"94",X"85",X"8E",X"83",X"89",X"8F",X"8E",X"00",X"01",X"00",X"00", + X"21",X"00",X"40",X"11",X"00",X"20",X"ED",X"B8",X"B7",X"03",X"23",X"1B",X"BB",X"72",X"20",X"F6", + X"3E",X"0F",X"11",X"17",X"1B",X"CD",X"6B",X"01",X"90",X"92",X"8F",X"87",X"92",X"81",X"8D",X"81", + X"80",X"96",X"8F",X"8C",X"81",X"94",X"89",X"8C",X"80",X"83",X"81",X"92",X"87",X"81",X"84",X"8F", + X"00",X"11",X"15",X"1B",X"CD",X"6B",X"01",X"8F",X"90",X"85",X"92",X"81",X"83",X"89",X"8F",X"8E", + X"80",X"84",X"85",X"80",X"92",X"85",X"94",X"85",X"8E",X"83",X"89",X"8F",X"8E",X"00",X"CD",X"00", + X"60",X"CD",X"6F",X"65",X"CD",X"80",X"73",X"20",X"25",X"3E",X"0F",X"11",X"10",X"1B",X"CD",X"6B", + X"01",X"8F",X"90",X"85",X"92",X"81",X"94",X"89",X"96",X"8F",X"80",X"8F",X"8B",X"00",X"E1",X"D1", + X"C1",X"F1",X"D9",X"08",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"ED",X"85",X"3E",X"0F", + X"11",X"10",X"1B",X"CD",X"6B",X"01",X"8F",X"90",X"85",X"92",X"81",X"94",X"89",X"96",X"8F",X"80", + X"82",X"81",X"84",X"00",X"3E",X"0F",X"11",X"0E",X"1B",X"CD",X"6B",X"01",X"92",X"85",X"89",X"8E", + X"89",X"83",X"89",X"85",X"80",X"8C",X"8F",X"81",X"84",X"80",X"8F",X"90",X"85",X"92",X"81",X"94", + X"89",X"96",X"8F",X"00",X"E1",X"D1",X"C1",X"F1",X"D9",X"08",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1", + X"C1",X"F1",X"ED",X"85",X"1D",X"03",X"9C",X"80",X"8F",X"8A",X"85",X"84",X"81",X"80",X"31",X"39", + X"39",X"30",X"2F",X"41",X"2F",X"40",X"85",X"03",X"80",X"26",X"80",X"80",X"84",X"8F",X"82",X"8C", + X"85",X"80",X"80",X"83",X"8F",X"8D",X"81",X"8E",X"84",X"8F",X"80",X"80",X"27",X"80",X"2F",X"40", + X"2F",X"40",X"85",X"03",X"80",X"26",X"80",X"80",X"84",X"8F",X"82",X"8C",X"85",X"80",X"80",X"83", + X"8F",X"8D",X"81",X"8E",X"84",X"8F",X"80",X"80",X"27",X"80",X"2F",X"41",X"2F",X"40",X"52",X"02", + X"80",X"80",X"94",X"95",X"92",X"82",X"8F",X"9B",X"80",X"80",X"2F",X"41",X"2F",X"40",X"52",X"02", + X"85",X"98",X"94",X"92",X"81",X"80",X"83",X"8F",X"89",X"8E",X"2F",X"49",X"2F",X"40",X"5B",X"02", + X"8D",X"89",X"8B",X"99",X"80",X"80",X"93",X"92",X"8C",X"2F",X"49",X"2F",X"40",X"5B",X"02",X"8D", + X"89",X"8B",X"99",X"80",X"80",X"93",X"92",X"8C",X"2F",X"41",X"2F",X"40",X"4B",X"02",X"80",X"80", + X"8C",X"81",X"8D",X"82",X"81",X"84",X"81",X"2F",X"45",X"2F",X"40",X"4E",X"02",X"82",X"95",X"95", + X"95",X"95",X"9B",X"80",X"2F",X"4F",X"2F",X"40",X"10",X"02",X"8A",X"89",X"80",X"8A",X"89",X"9B", + X"80",X"2F",X"4F",X"2F",X"40",X"4E",X"02",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"2F",X"4F", + X"2F",X"40",X"10",X"02",X"84",X"81",X"96",X"89",X"84",X"80",X"80",X"80",X"80",X"80",X"2F",X"41", + X"2F",X"40",X"12",X"02",X"86",X"8C",X"81",X"96",X"89",X"81",X"80",X"80",X"80",X"80",X"2F",X"43", + X"2F",X"40",X"14",X"02",X"8D",X"89",X"87",X"95",X"85",X"8C",X"89",X"94",X"8F",X"80",X"2F",X"45", + X"2F",X"40",X"16",X"02",X"92",X"8F",X"8D",X"89",X"8E",X"81",X"80",X"80",X"80",X"80",X"2F",X"47", + X"2F",X"40",X"18",X"02",X"8D",X"81",X"8D",X"89",X"80",X"80",X"80",X"80",X"80",X"80",X"2F",X"49", + X"2F",X"40",X"1A",X"02",X"90",X"81",X"90",X"89",X"80",X"80",X"80",X"80",X"80",X"80",X"2F",X"49", + X"2F",X"40",X"CD",X"8E",X"3A",X"3E",X"0F",X"11",X"1A",X"1B",X"CD",X"6B",X"01",X"89",X"8E",X"84", + X"95",X"93",X"94",X"92",X"89",X"81",X"80",X"81",X"92",X"87",X"85",X"8E",X"94",X"89",X"8E",X"81", + X"00",X"06",X"10",X"CD",X"A8",X"32",X"3E",X"0F",X"11",X"1C",X"1B",X"CD",X"6B",X"01",X"9C",X"80", + X"89",X"8E",X"87",X"80",X"8F",X"8A",X"85",X"84",X"81",X"80",X"31",X"39",X"39",X"30",X"00",X"06", + X"10",X"CD",X"A8",X"32",X"3E",X"0F",X"11",X"1E",X"1B",X"CD",X"6B",X"01",X"8E",X"95",X"8D",X"85", + X"92",X"8F",X"80",X"93",X"85",X"92",X"89",X"85",X"80",X"90",X"81",X"83",X"30",X"30",X"30",X"30", + X"00",X"06",X"10",X"CD",X"A8",X"32",X"21",X"00",X"80",X"06",X"04",X"C9",X"BB",X"03",X"8E",X"8F", + X"92",X"8D",X"81",X"8C",X"80",X"80",X"80",X"80",X"92",X"81",X"90",X"89",X"84",X"8F",X"80",X"80", + X"80",X"80",X"94",X"95",X"92",X"82",X"8F",X"2F",X"49",X"2F",X"40",X"B8",X"03",X"80",X"80",X"80", + X"80",X"80",X"80",X"84",X"8F",X"82",X"8C",X"85",X"80",X"83",X"8F",X"8D",X"81",X"8E",X"84",X"8F", + X"80",X"80",X"80",X"80",X"80",X"80",X"2F",X"49",X"2F",X"40",X"B8",X"03",X"80",X"80",X"80",X"80", + X"80",X"80",X"84",X"8F",X"82",X"8C",X"85",X"80",X"83",X"8F",X"8D",X"81",X"8E",X"84",X"8F",X"80", + X"80",X"80",X"80",X"80",X"80",X"2F",X"41",X"2F",X"40",X"BB",X"03",X"8E",X"8F",X"92",X"8D",X"81", + X"8C",X"80",X"2F",X"41",X"2F",X"40",X"3B",X"02",X"92",X"81",X"90",X"89",X"84",X"8F",X"80",X"2F", + X"41",X"2F",X"40",X"FB",X"00",X"94",X"95",X"92",X"82",X"8F",X"2F",X"41",X"2F",X"40",X"52",X"02", + X"94",X"95",X"92",X"82",X"8F",X"2F",X"41",X"2F",X"40",X"A9",X"03",X"80",X"80",X"80",X"80",X"89", + X"8E",X"83",X"85",X"92",X"94",X"80",X"99",X"8F",X"95",X"92",X"80",X"8E",X"81",X"8D",X"85",X"80", + X"80",X"80",X"2F",X"49",X"2F",X"40",X"A5",X"03",X"80",X"80",X"93",X"85",X"8C",X"85",X"83",X"94", + X"80",X"93",X"90",X"85",X"85",X"84",X"80",X"90",X"81",X"83",X"8B",X"8D",X"81",X"8E",X"2F",X"49", + X"2F",X"40",X"BD",X"03",X"80",X"80",X"80",X"90",X"8F",X"92",X"80",X"86",X"81",X"96",X"8F",X"92", + X"80",X"8D",X"81",X"93",X"80",X"86",X"89",X"83",X"88",X"81",X"93",X"80",X"2F",X"45",X"2F",X"40", + X"BD",X"03",X"80",X"80",X"90",X"8F",X"92",X"80",X"86",X"81",X"96",X"8F",X"92",X"80",X"93",X"85", + X"8C",X"85",X"83",X"83",X"89",X"8F",X"8E",X"85",X"80",X"80",X"2F",X"45",X"2F",X"40",X"52",X"02", + X"85",X"98",X"94",X"92",X"81",X"80",X"8C",X"89",X"86",X"85",X"2F",X"49",X"2F",X"40",X"52",X"02", + X"82",X"8F",X"8E",X"95",X"93",X"80",X"8E",X"8F",X"8E",X"85",X"2F",X"41",X"2F",X"40",X"52",X"02", + X"32",X"30",X"30",X"80",X"80",X"82",X"8F",X"8E",X"95",X"93",X"2F",X"45",X"2F",X"40",X"52",X"02", + X"33",X"30",X"30",X"80",X"80",X"82",X"8F",X"8E",X"95",X"93",X"2F",X"45",X"2F",X"40",X"52",X"02", + X"34",X"30",X"30",X"80",X"80",X"82",X"8F",X"8E",X"95",X"93",X"2F",X"45",X"2F",X"40",X"52",X"02", + X"35",X"30",X"30",X"80",X"80",X"82",X"8F",X"8E",X"95",X"93",X"2F",X"45",X"2F",X"40",X"52",X"02", + X"36",X"30",X"30",X"80",X"80",X"82",X"8F",X"8E",X"95",X"93",X"2F",X"45",X"2F",X"40",X"52",X"02", + X"37",X"30",X"30",X"80",X"80",X"82",X"8F",X"8E",X"95",X"93",X"2F",X"45",X"2F",X"40",X"52",X"02", + X"38",X"30",X"30",X"80",X"80",X"82",X"8F",X"8E",X"95",X"93",X"2F",X"45",X"2F",X"40",X"52",X"02", + X"35",X"30",X"30",X"30",X"80",X"82",X"8F",X"8E",X"95",X"93",X"2F",X"45",X"2F",X"40",X"D4",X"43", + X"8D",X"89",X"8B",X"99",X"80",X"83",X"88",X"85",X"8C",X"8F",X"2F",X"41",X"2F",X"40",X"4C",X"02", + X"8D",X"8D",X"8D",X"8D",X"8D",X"8D",X"8D",X"8D",X"8D",X"8D",X"2F",X"45",X"2F",X"40",X"3B",X"40", + X"83",X"92",X"85",X"84",X"89",X"94",X"80",X"80",X"80",X"2F",X"4F",X"2F",X"40",X"3B",X"40",X"86", + X"92",X"85",X"85",X"80",X"90",X"8C",X"81",X"99",X"2F",X"4F",X"2F",X"40",X"4C",X"02",X"90",X"8C", + X"81",X"99",X"85",X"92",X"80",X"8F",X"8E",X"85",X"2F",X"45",X"4C",X"02",X"90",X"8C",X"81",X"99", + X"85",X"92",X"80",X"94",X"97",X"8F",X"2F",X"45",X"2F",X"40",X"52",X"02",X"87",X"81",X"8D",X"85", + X"80",X"80",X"8F",X"96",X"85",X"92",X"2F",X"41",X"2F",X"40",X"92",X"02",X"92",X"85",X"81",X"84", + X"99",X"9B",X"2F",X"49",X"2F",X"50",X"ED",X"02",X"90",X"95",X"93",X"88",X"80",X"93",X"94",X"81", + X"92",X"94",X"80",X"82",X"95",X"94",X"94",X"8F",X"8E",X"2F",X"47",X"2F",X"40",X"6F",X"02",X"31", + X"80",X"90",X"8C",X"81",X"99",X"85",X"92",X"80",X"8F",X"8E",X"8C",X"99",X"80",X"2F",X"47",X"2F", + X"40",X"6F",X"02",X"31",X"80",X"8F",X"92",X"80",X"32",X"80",X"90",X"8C",X"81",X"99",X"85",X"92", + X"93",X"2F",X"47",X"00",X"2F",X"00",X"40",X"00",X"71",X"02",X"32",X"80",X"8F",X"92",X"80",X"34", + X"80",X"90",X"8C",X"81",X"99",X"85",X"92",X"93",X"2F",X"47",X"00",X"2F",X"00",X"40",X"00",X"56", + X"03",X"82",X"8F",X"8E",X"95",X"93",X"80",X"90",X"95",X"83",X"8B",X"8D",X"81",X"8E",X"80",X"86", + X"8F",X"92",X"80",X"80",X"80",X"30",X"30",X"30",X"80",X"9D",X"9E",X"9F",X"2F",X"4E",X"2F",X"40", + X"04",X"03",X"8D",X"85",X"8D",X"8F",X"92",X"99",X"80",X"80",X"8F",X"8B",X"2F",X"4F",X"2F",X"40", + X"04",X"03",X"82",X"81",X"84",X"80",X"80",X"80",X"80",X"92",X"80",X"8D",X"2F",X"4F",X"2F",X"40", + X"08",X"03",X"31",X"80",X"83",X"8F",X"89",X"8E",X"80",X"80",X"31",X"80",X"83",X"92",X"85",X"84", + X"89",X"94",X"80",X"2F",X"4F",X"2F",X"40",X"95",X"95",X"95",X"95",X"95",X"95",X"95",X"95",X"95", + X"95",X"95",X"95",X"95",X"95",X"84",X"85",X"93",X"81",X"92",X"92",X"8F",X"8C",X"8C",X"8F",X"20", + X"84",X"85",X"8C",X"20",X"89",X"8E",X"87",X"85",X"8E",X"89",X"85",X"92",X"8F",X"20",X"8D",X"89", + X"87",X"95",X"85",X"8C",X"20",X"81",X"8E",X"94",X"8F",X"8E",X"89",X"8F",X"20",X"8F",X"8A",X"85", + X"84",X"81",X"20",X"20",X"92",X"85",X"81",X"8C",X"89",X"9A",X"81",X"84",X"8F",X"20",X"85",X"8C", + X"20",X"31",X"30",X"2F",X"31",X"32",X"2F",X"38",X"39",X"20",X"93",X"8F",X"82",X"92",X"85",X"20", + X"95",X"8E",X"81",X"20",X"90",X"8C",X"81",X"83",X"81",X"20",X"84",X"85",X"20",X"8D",X"93",X"93", + X"20",X"20",X"20",X"90",X"81",X"83",X"8B",X"8D",X"81",X"8E",X"20",X"90",X"81",X"92",X"81",X"20", + X"8D",X"85",X"8A",X"8F",X"92",X"81",X"92",X"20",X"8C",X"81",X"20",X"90",X"85",X"92",X"86",X"8F", + X"8D",X"81",X"8E",X"93",X"20",X"84",X"85",X"20",X"85",X"93",X"94",X"81",X"20",X"20",X"20",X"20", + X"20",X"20",X"81",X"94",X"85",X"8E",X"83",X"89",X"8F",X"8E",X"3A",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"85",X"8E",X"20",X"83",X"81",X"93",X"8F",X"20",X"84",X"85",X"20", + X"94",X"85",X"8E",X"85",X"92",X"20",X"95",X"8E",X"81",X"20",X"90",X"85",X"92",X"84",X"89",X"84", + X"81",X"20",X"84",X"85",X"8C",X"20",X"93",X"89",X"93",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"90",X"8F",X"8E",X"85",X"92",X"93",X"85",X"20",X"85",X"8E",X"20",X"83",X"8F",X"8E",X"94",X"81", + X"83",X"94",X"8F",X"20",X"83",X"8F",X"8E",X"20",X"8D",X"89",X"8B",X"99",X"20",X"93",X"2E",X"92", + X"2E",X"8C",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"83", + X"8F",X"84",X"89",X"87",X"8F",X"20",X"90",X"8F",X"93",X"94",X"81",X"8C",X"20",X"31",X"34",X"30", + X"37",X"20",X"81",X"92",X"81",X"8E",X"87",X"95",X"92",X"85",X"8E",X"20",X"34",X"31",X"34",X"38", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"83",X"81", + X"90",X"89",X"94",X"81",X"8C",X"20",X"86",X"85",X"84",X"85",X"92",X"81",X"8C",X"20",X"92",X"85", + X"90",X"95",X"82",X"8C",X"89",X"83",X"81",X"20",X"81",X"92",X"87",X"85",X"8E",X"94",X"89",X"8E", + X"81",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"94",X"85",X"8C", + X"20",X"36",X"39",X"2D",X"39",X"38",X"35",X"31",X"20",X"36",X"37",X"2D",X"39",X"33",X"38",X"33", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"95",X"8E",X"81",X"20",X"8D",X"81",X"8E",X"89",X"90",X"95",X"8C",X"81",X"83",X"89",X"8F",X"8E", + X"20",X"89",X"8E",X"84",X"85",X"96",X"89",X"84",X"81",X"20",X"83",X"81",X"8E",X"83",X"85",X"8C", + X"81",X"20",X"8C",X"81",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"87",X"81",X"92",X"81",X"8E", + X"94",X"89",X"81",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"88",X"85",X"83",X"88",X"8F",X"20",X"85", + X"8C",X"20",X"84",X"85",X"90",X"8F",X"93",X"89",X"94",X"8F",X"20",X"91",X"95",X"85",X"20",X"8D", + X"81",X"92",X"83",X"81",X"20",X"8C",X"81",X"20",X"8C",X"85",X"99",X"20",X"31",X"31",X"37",X"32", + X"33",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"91",X"95",X"85",X"84",X"81",X"20",X"92",X"85", + X"87",X"89",X"93",X"94",X"92",X"81",X"84",X"8F",X"20",X"85",X"8E",X"20",X"94",X"85",X"92",X"92", + X"89",X"94",X"8F",X"92",X"89",X"8F",X"20",X"84",X"85",X"20",X"8C",X"81",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"92",X"85",X"90",X"95",X"82",X"8C",X"89",X"83",X"81", + X"20",X"81",X"92",X"87",X"85",X"8E",X"94",X"89",X"8E",X"81",X"20",X"85",X"8C",X"20",X"93",X"8F", + X"86",X"94",X"97",X"81",X"92",X"85",X"20",X"83",X"8C",X"95",X"82",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"83",X"95",X"81",X"8C",X"91",X"95",X"89",X"85",X"92",X"20", + X"92",X"85",X"90",X"92",X"8F",X"84",X"95",X"83",X"83",X"89",X"8F",X"8E",X"20",X"90",X"81",X"92", + X"83",X"89",X"81",X"8C",X"20",X"99",X"2F",X"8F",X"20",X"94",X"8F",X"94",X"81",X"8C",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"84",X"85",X"20",X"85",X"93",X"94",X"81",X"20",X"93",X"85",X"92", + X"81",X"20",X"90",X"85",X"8E",X"81",X"84",X"81",X"20",X"83",X"8F",X"8E",X"20",X"8C",X"8F",X"93", + X"20",X"81",X"8C",X"83",X"81",X"8E",X"83",X"85",X"93",X"20",X"84",X"85",X"20",X"8C",X"81",X"20", + X"20",X"20",X"20",X"20",X"8C",X"85",X"99",X"20",X"31",X"31",X"37",X"32",X"33",X"20",X"2E",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"E5", + X"F5",X"2A",X"6C",X"4C",X"7D",X"B4",X"28",X"03",X"F1",X"E1",X"C9",X"F1",X"3E",X"F3",X"E1",X"C9"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_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/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/build_id.v new file mode 100644 index 00000000..d08c51bc --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171122" +`define BUILD_TIME "112757" diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..fec08f5f --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) := (others => '0'); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_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/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/keyboard.v new file mode 100644 index 00000000..2f179e0c --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/keyboard.v @@ -0,0 +1,87 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[13: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + + 'h1D: joystick[10] <= ~release_btn; //W + 'h1C: joystick[11] <= ~release_btn; //A + 'h1B: joystick[12] <= ~release_btn; //S + 'h23: joystick[13] <= ~release_btn; //D + 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/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_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/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/osd.v b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_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/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..38e3993c --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pacman.vhd @@ -0,0 +1,479 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- Copyright (c) Sorgelig - 2017 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 006 Refactoring, 8 sprites support by Sorgelig +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN is + generic( + eight_sprites : boolean := false + ); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0 : in std_logic_vector(3 downto 0); + in1 : in std_logic_vector(7 downto 0); + dipsw1 : in std_logic_vector(7 downto 0); + dipsw2 : in std_logic_vector(7 downto 0); + + in_a : in std_logic_vector(3 downto 0); + in_b : in std_logic_vector(3 downto 0); + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of PACMAN is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_int_l : std_logic := '1'; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal inj : std_logic_vector(3 downto 0); + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal hp : std_logic_vector ( 4 downto 0); + signal vp : std_logic_vector ( 4 downto 0); + signal ram_cs : std_logic; + signal ram_data : std_logic_vector(7 downto 0); + signal vram_data : std_logic_vector(7 downto 0); + signal sprite_xy_data : std_logic_vector(7 downto 0); + signal vram_addr : std_logic_vector(11 downto 0); + + signal iodec_spr_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_sn1_l : std_logic; + signal iodec_sn2_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw1_l : std_logic; + signal iodec_dipsw2_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(7 downto 0); + signal watchdog_reset_l : std_logic; + + signal sn_we : std_logic; + signal wav1,wav2,wav3 : std_logic_vector(7 downto 0); + + component ym2149 is port + ( + CLK : in std_logic; + CE : in std_logic; + RESET : in std_logic; + BDIR : in std_logic; + BC : in std_logic; + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + CHANNEL_A: out std_logic_vector(7 downto 0); + CHANNEL_B: out std_logic_vector(7 downto 0); + CHANNEL_C: out std_logic_vector(7 downto 0); + + SEL : in std_logic; + MODE : in std_logic; + IOA_in : in std_logic_vector(7 downto 0); + IOA_out : out std_logic_vector(7 downto 0); + + IOB_in : in std_logic_vector(7 downto 0); + IOB_out : out std_logic_vector(7 downto 0) + ); + end component; + +begin + +-- +-- video timing +-- +p_hvcnt : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + if hcnt = "111111111" then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + if do_hsync then + if vcnt = "111111111" then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; +end process; + +vsync <= not vcnt(8); +do_hsync <= (hcnt = "010101111"); -- 0AF + +p_sync : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + + if (hcnt = "010001111") and not eight_sprites then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") and not eight_sprites then + hblank <= '0'; -- 0EF + elsif (hcnt = "111111111") and eight_sprites then + hblank <= '1'; + elsif (hcnt = "011111111") and eight_sprites then + hblank <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; +end process; + +-- +-- cpu +-- +p_irq_req_watchdog : process + variable rising_vblank : boolean; +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= X"FF"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= X"00"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + --watchdog_reset_l <= not reset; + + watchdog_reset_l <= '1'; + if (watchdog_cnt = X"FF") then + watchdog_reset_l <= '0'; + end if; + end if; +end process; + +u_cpu : entity work.T80sed +port map +( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => hcnt(0) and ena_6, + WAIT_n => sync_bus_wreq_l, + INT_n => cpu_int_l, + NMI_n => '1', + BUSRQ_n => '1', + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out +); + + +-- rom 0x0000 - 0x3FFF +-- syncbus 0x4000 - 0x7FFF +sync_bus_cs_l <= '0' when cpu_mreq_l = '0' and cpu_rfsh_l = '1' and cpu_addr(14) = '1' else '1'; +sync_bus_wreq_l <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '1' and cpu_rd_l = '0' else '1'; +sync_bus_stb <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '0' else '1'; +sync_bus_r_w_l <= '0' when sync_bus_stb = '0' and cpu_rd_l = '1' else '1'; + +-- +-- sync bus custom ic +-- +p_sync_bus_reg : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; +end process; + + +-- WRITE +-- out_l 0x5000 - 0x503F control space +-- sn1_l 0x5040 - 0x504F sound +-- sn2_l 0x5050 - 0x505F sound +-- spr_l 0x5060 - 0x506F sprite +-- wdr_l 0x50C0 - 0x50FF watchdog reset +iodec_out_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_sn1_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"4" else '1'; +iodec_sn2_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"5" else '1'; +iodec_spr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"6" else '1'; +iodec_wdr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +-- READ +-- in0_l 0x5000 - 0x503F in port 0 +-- in1_l 0x5040 - 0x507F in port 1 +-- dipsw_l 0x5080 - 0x50BF dip switches +iodec_in0_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_in1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"01" else '1'; +iodec_dipsw1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"10" else '1'; +iodec_dipsw2_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +p_control_reg : process +begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + elsif (iodec_out_l = '0') then + control_reg(to_integer(unsigned(cpu_addr(2 downto 0)))) <= cpu_data_out(0); + end if; + end if; +end process; + +inj <= not in_a when control_reg(5 downto 4) = "01" else + not in_b when control_reg(5 downto 4) = "10" else + not (in_a or in_b); + +cpu_data_in <= cpu_vec_reg when (cpu_iorq_l = '0') and (cpu_m1_l = '0') else + sync_bus_reg when sync_bus_wreq_l = '0' else + program_rom_dinl when cpu_addr(15 downto 14) = "00" else -- ROM at 0000 - 3fff + program_rom_dinh when cpu_addr(15 downto 14) = "10" else -- ROM at 8000 - bfff + in0 & inj when iodec_in0_l = '0' else + in1 when iodec_in1_l = '0' else + dipsw1 when iodec_dipsw1_l = '0' else + dipsw2 when iodec_dipsw2_l = '0' else + ram_data; + +u_program_rom : entity work.ROM_PGM_0 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl +); + +u_program_rom1 : entity work.ROM_PGM_1 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinh +); + +ram_cs <= '1' when cpu_addr(15 downto 12) = X"4" else '0'; + +u_rams : work.dpram generic map (12,8) +port map +( + clock_a => clk, + enable_a => ena_6, + wren_a => not sync_bus_r_w_l and ram_cs, + address_a => cpu_addr(11 downto 0), + data_a => cpu_data_out, -- cpu only source of ram data + q_a => ram_data, + + clock_b => clk, + address_b => vram_addr(11 downto 0), + q_b => vram_data +); + +-- +-- video subsystem +-- + +-- vram addr custom ic +hp <= hcnt(7 downto 3) when control_reg(3) = '0' else not hcnt(7 downto 3); +vp <= vcnt(7 downto 3) when control_reg(3) = '0' else not vcnt(7 downto 3); +vram_addr <= '0' & hcnt(2) & vp & hp when hcnt(8)='1' else + x"FF" & hcnt(6 downto 4) & hcnt(2) when hblank = '1' else + '0' & hcnt(2) & hp(3) & hp(3) & hp(3) & hp(3) & hp(0) & vp; + +sprite_xy_ram : work.dpram generic map (4,8) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not iodec_spr_l, + address_a => cpu_addr(3 downto 0), + data_a => cpu_data_out, + + clock_b => CLK, + address_b => vram_addr(3 downto 0), + q_b => sprite_xy_data +); + +u_video : entity work.PACMAN_VIDEO +port map +( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + vram_data => vram_data, + sprite_xy => sprite_xy_data, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + O_HBLANK => O_HBLANK, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk +); + +O_HSYNC <= hSync; +O_VSYNC <= vSync; +O_VBLANK <= vblank; + +-- +-- +-- audio subsystem +-- +u_audio : entity work.PACMAN_AUDIO +port map ( + I_HCNT => hcnt, + -- + I_AB => cpu_addr(11 downto 0), + I_DB => cpu_data_out, + -- + I_WR1_L => iodec_sn2_l, + I_WR0_L => iodec_sn1_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk +); + +end RTL; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..91313469 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not I_WR1_L, + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => rom3m(1), + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..1552d65b --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pacman_video.vhd @@ -0,0 +1,279 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 004 Refactoring, 8 sprite support by Sorgelig +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VIDEO is + generic( + alt_transp : boolean := false + ); + port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + vram_data : in std_logic_vector(7 downto 0); + sprite_xy : in std_logic_vector(7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + O_HBLANK : out std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_VIDEO is + + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal sprite_data : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + signal obj_on2 : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_op_t1 : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal sprite_ram_ip : std_logic_vector(5 downto 0); + signal sprite_ram_op : std_logic_vector(5 downto 0); + signal sprite_addr : std_logic_vector(7 downto 0); + signal sprite_addr_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(5 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + +dr <= not sprite_xy when I_HBLANK = '1' else "11111111"; -- pull ups on board + +p_char_regs : process + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; +begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & not I_HBLANK); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + sprite_data <= vram_data; -- character reg + end if; +end process; + +xflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(1); +yflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(0); + +obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + +ca(12) <= char_hblank_reg; +ca(11 downto 6) <= sprite_data(7 downto 2); +ca(5) <= sprite_data(1) when char_hblank_reg = '0' else char_sum_reg(3) xor xflip; +ca(4) <= sprite_data(0) when char_hblank_reg = '0' else I_HCNT(3); +ca(3) <= I_HCNT(2) xor yflip; +ca(2) <= char_sum_reg(2) xor xflip; +ca(1) <= char_sum_reg(1) xor xflip; +ca(0) <= char_sum_reg(0) xor xflip; + +-- char roms +char_rom_5ef : entity work.GFX1 +port map +( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf +); + +p_char_shift : process +begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_buf(7 downto 4); -- load + shift_regl <= char_rom_5ef_buf(3 downto 0); + when others => null; + end case; + end if; +end process; + +shift_sel(0) <= I_HCNT(0) and I_HCNT(1) when vout_yflip = '0' else '1'; +shift_sel(1) <= '1' when vout_yflip = '0' else I_HCNT(0) and I_HCNT(1); +shift_op(0) <= shift_regl(3) when vout_yflip = '0' else shift_regl(0); +shift_op(1) <= shift_regu(3) when vout_yflip = '0' else shift_regu(0); + +p_video_out_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= vram_data(4 downto 0); -- colour reg + end if; + + if I_HCNT(3 downto 0) = "0111" and (vout_hblank='1' or I_HBLANK='1' or vout_obj_on='0') then + sprite_addr <= dr; + else + sprite_addr <= sprite_addr + "1"; + end if; + end if; +end process; + +col_rom_4a : entity work.PROM4_DST +port map +( + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a +); + +u_sprite_ram : work.dpram generic map (8,6) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => vout_obj_on_t1, + address_a => sprite_addr_t1, + data_a => sprite_ram_ip, + + clock_b => CLK, + enable_b => ENA_6, + address_b => sprite_addr, + q_b => sprite_ram_op +); + +sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "000000"; +video_op_sel <= '0' when alt_transp and (sprite_ram_reg(1 downto 0) = "00") else + '0' when not alt_transp and (sprite_ram_reg(5 downto 2) = "0000") else + '1'; + +p_sprite_ram_ip_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + sprite_addr_t1 <= sprite_addr; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + shift_op_t1 <= shift_op; + end if; +end process; + +sprite_ram_ip <= (others => '0') when vout_hblank_t1 = '0' else + sprite_ram_reg when video_op_sel = '1' else + lut_4a_t1(3 downto 0) & shift_op_t1; + +final_col <= (others => '0') when (vout_hblank = '1') or (I_VBLANK = '1') else + sprite_ram_reg(5 downto 2) when video_op_sel = '1' else + lut_4a(3 downto 0); + +-- assign video outputs from color LUT PROM +col_rom_7f : entity work.PROM7_DST +port map +( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE +); + +O_HBLANK <= vout_hblank and vout_hblank_t1; + +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_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/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pll.v b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pll.v new file mode 100644 index 00000000..60297687 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 8, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "9" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "9" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/PacmanClub_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanClub_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/Arcade/Pacman Hardware/PacmanPlus_MiST/PacmanPlus.qpf b/Arcade/Pacman Hardware/PacmanPlus_MiST/PacmanPlus.qpf new file mode 100644 index 00000000..de6f8ac6 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/PacmanPlus.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "PacmanPlus" diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/PacmanPlus.qsf b/Arcade/Pacman Hardware/PacmanPlus_MiST/PacmanPlus.qsf new file mode 100644 index 00000000..0dcaf95f --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/PacmanPlus.qsf @@ -0,0 +1,175 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 20:43:12 November 20, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Alibaba_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY PacmanPlus +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Alibaba) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Alibaba) +# ------------------- +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/pll.v +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/ROM/GFX1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/PacmanPlus.sv +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/PacmanPlus.srf b/Arcade/Pacman Hardware/PacmanPlus_MiST/PacmanPlus.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/PacmanPlus.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/README.txt b/Arcade/Pacman Hardware/PacmanPlus_MiST/README.txt new file mode 100644 index 00000000..e2f75a6c --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/README.txt @@ -0,0 +1,25 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Pacman Plus for MiST by Gehstock +-- 21 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Dream Shopper hardware +-- Copyright (c) Sorgelig +-- Based on Pacman core: Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F1 : Start 1 player +-- F2 : Start 2 players +-- SPACE,CTRL : Action +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/Release/PacmanPlus.rbf b/Arcade/Pacman Hardware/PacmanPlus_MiST/Release/PacmanPlus.rbf new file mode 100644 index 00000000..161f709f Binary files /dev/null and b/Arcade/Pacman Hardware/PacmanPlus_MiST/Release/PacmanPlus.rbf differ diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/clean.bat b/Arcade/Pacman Hardware/PacmanPlus_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_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/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/PacmanPlus.sv b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/PacmanPlus.sv new file mode 100644 index 00000000..3830ddf7 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/PacmanPlus.sv @@ -0,0 +1,196 @@ +//============================================================================ +// Arcade: PacmanPlus +// +// Version for MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module PacmanPlus +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "PacmanPlus;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys, clk_snd; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [9:0] audio; +assign LED = 1; +wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(340), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +//wire m_bomb = kbjoy[8]; +//wire m_Serv = kbjoy[9]; +//wire m_skip = kbjoy[9]; + + +pacman pacmanpls +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .in0(~{2'b00, m_coin, m_fire, m_down,m_right,m_left,m_up}), + .in1(~{1'b0, m_start2, m_start1, 5'b00000}), + + .dipsw1(8'b1_1_00_11_01), + .dipsw2(8'b11111111), + + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..4203ec94 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"CC",X"EE",X"11",X"11",X"33",X"EE",X"CC",X"00",X"11",X"33",X"66",X"44",X"44",X"33",X"11",X"00", + X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00",X"00",X"00",X"77",X"77",X"22",X"00",X"00",X"00", + X"11",X"99",X"DD",X"DD",X"FF",X"77",X"33",X"00",X"33",X"77",X"55",X"44",X"44",X"66",X"22",X"00", + X"66",X"FF",X"99",X"99",X"99",X"33",X"22",X"00",X"44",X"66",X"77",X"55",X"44",X"44",X"00",X"00", + X"44",X"FF",X"FF",X"44",X"44",X"CC",X"CC",X"00",X"00",X"77",X"77",X"66",X"33",X"11",X"00",X"00", + X"EE",X"FF",X"11",X"11",X"11",X"33",X"22",X"00",X"00",X"55",X"55",X"55",X"55",X"77",X"77",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"EE",X"00",X"00",X"44",X"44",X"44",X"66",X"33",X"11",X"00", + X"00",X"00",X"88",X"FF",X"77",X"00",X"00",X"00",X"66",X"77",X"55",X"44",X"44",X"66",X"66",X"00", + X"66",X"77",X"DD",X"DD",X"99",X"99",X"66",X"00",X"00",X"33",X"44",X"44",X"55",X"77",X"33",X"00", + X"CC",X"EE",X"BB",X"99",X"99",X"99",X"00",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"FF",X"FF",X"44",X"44",X"44",X"FF",X"FF",X"00",X"11",X"33",X"66",X"44",X"66",X"33",X"11",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"77",X"00", + X"22",X"33",X"11",X"11",X"33",X"EE",X"CC",X"00",X"22",X"66",X"44",X"44",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"33",X"11",X"11",X"FF",X"FF",X"00",X"11",X"33",X"66",X"44",X"44",X"77",X"77",X"00", + X"11",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00",X"44",X"44",X"44",X"44",X"77",X"77",X"00",X"00", + X"00",X"88",X"88",X"88",X"88",X"FF",X"FF",X"00",X"44",X"44",X"44",X"44",X"44",X"77",X"77",X"00", + X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00", + X"00",X"00",X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"03", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"EE",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33", + X"EE",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"33",X"33",X"33",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"CC",X"EE",X"FF",X"FF",X"FF", + X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"77",X"33",X"22",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"DD",X"00",X"EE",X"DD",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"DD",X"00",X"EE",X"DD",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"77",X"FF",X"CC",X"CC",X"CC",X"CC",X"FF",X"FF", + X"BB",X"BB",X"BB",X"BB",X"FF",X"FF",X"00",X"00",X"DD",X"DD",X"DD",X"DD",X"DD",X"11",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"CC",X"CC",X"FF",X"FF",X"00",X"00",X"77",X"FF", + X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"00",X"00",X"77",X"FF",X"CC",X"CC",X"FF",X"FF", + X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"EE",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"77", + X"33",X"33",X"33",X"33",X"FF",X"EE",X"00",X"00",X"CC",X"CC",X"CC",X"CC",X"FF",X"77",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00",X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00", + X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00",X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00", + X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"00",X"00",X"88",X"44",X"22",X"00",X"88",X"44",X"22",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00",X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00", + X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00",X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00", + X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00",X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00", + X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00",X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"88",X"22",X"00",X"00",X"00",X"CC",X"EE",X"FF",X"33",X"00",X"00",X"00", + X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC",X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33", + X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"EE",X"22",X"22",X"00",X"11",X"22",X"22",X"22",X"33", + X"AA",X"AA",X"AA",X"22",X"00",X"00",X"00",X"EE",X"22",X"22",X"22",X"11",X"00",X"22",X"22",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"33",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"00", + X"33",X"33",X"77",X"77",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE", + X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"33",X"33",X"33",X"77",X"77",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE", + X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"11",X"33",X"33",X"33",X"33",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00", + X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CE",X"EE",X"EE",X"EE",X"66",X"22",X"22",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"CC",X"00",X"22",X"EE",X"22",X"00",X"00",X"88",X"77",X"00",X"00",X"FF",X"44",X"00",X"00", + X"22",X"CC",X"00",X"CC",X"22",X"22",X"22",X"44",X"88",X"77",X"00",X"88",X"DD",X"AA",X"88",X"88", + X"22",X"CC",X"00",X"CC",X"22",X"22",X"22",X"44",X"88",X"77",X"00",X"99",X"AA",X"AA",X"AA",X"EE", + X"22",X"CC",X"00",X"00",X"00",X"EE",X"00",X"00",X"88",X"77",X"00",X"CC",X"BB",X"88",X"88",X"CC", + X"00",X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"00",X"77",X"88",X"88",X"77",X"00",X"77",X"88", + X"CC",X"22",X"22",X"CC",X"00",X"22",X"EE",X"22",X"77",X"88",X"88",X"77",X"00",X"00",X"FF",X"44", + X"66",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"66",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"22",X"CC",X"00",X"22",X"22",X"AA",X"77",X"88",X"88",X"77",X"00",X"66",X"99",X"88", + X"22",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"22",X"77",X"88",X"88",X"77",X"00",X"88",X"DD",X"AA", + X"22",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"EE",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"22",X"77",X"88",X"88",X"77",X"00",X"99",X"AA",X"AA", + X"22",X"CC",X"00",X"CC",X"22",X"22",X"CC",X"00",X"88",X"77",X"00",X"77",X"88",X"88",X"77",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"20",X"90",X"80",X"00",X"00",X"30",X"30",X"10",X"10",X"00",X"00", + X"41",X"21",X"12",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"0C",X"0C",X"8C",X"0C",X"00",X"00",X"00",X"07",X"0F",X"0F",X"C3",X"1F", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"08",X"0F",X"2F",X"4F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"07",X"4F",X"0F",X"A7",X"87",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"D3",X"87",X"97",X"0F",X"2F",X"07",X"00",X"00",X"33",X"10",X"10",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"08",X"0E",X"8E",X"1F",X"0F", + X"0C",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"4F",X"1F",X"0F",X"4F",X"0E",X"08",X"00",X"00", + X"00",X"00",X"01",X"03",X"87",X"87",X"87",X"47",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"10", + X"EF",X"47",X"07",X"07",X"03",X"01",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"0C",X"0C",X"08",X"08",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"01",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"02", + X"0F",X"0B",X"0C",X"0F",X"01",X"00",X"00",X"00",X"02",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0C",X"68",X"68",X"68",X"6E",X"6E",X"00",X"00",X"03",X"0F",X"0F",X"0F",X"0F",X"0F", + X"68",X"68",X"68",X"68",X"68",X"0C",X"00",X"00",X"0F",X"0F",X"07",X"0C",X"0F",X"03",X"00",X"00", + X"00",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"20", + X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"10",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"0C",X"0F",X"CF",X"2F",X"0F",X"0F", + X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"00",X"00", + X"00",X"00",X"00",X"30",X"52",X"61",X"F1",X"BC",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"03", + X"D2",X"63",X"52",X"30",X"00",X"00",X"00",X"00",X"02",X"02",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"48",X"84",X"C2",X"E0",X"00",X"00",X"E0",X"B4",X"7C",X"E1",X"5B",X"A5", + X"68",X"84",X"C0",X"80",X"00",X"00",X"00",X"00",X"F5",X"E1",X"5A",X"BE",X"E0",X"00",X"00",X"00", + X"00",X"00",X"00",X"0F",X"33",X"31",X"71",X"F3",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F3",X"71",X"31",X"33",X"0F",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"8E",X"CF",X"88", + X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"CF",X"8E",X"0C",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"F1",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"20", + X"E0",X"F1",X"E0",X"E0",X"00",X"00",X"00",X"00",X"20",X"20",X"10",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"DD", + X"22",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"EF",X"67",X"77",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"23",X"67",X"77",X"FF",X"FF",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"00",X"79",X"69",X"0F",X"1F",X"FF",X"FF",X"33",X"00", + X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"33",X"79",X"69",X"0F",X"1F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"88",X"00",X"88",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"88",X"00",X"88",X"CC",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"00",X"33",X"74",X"74",X"F8",X"F9",X"F9",X"F9", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"FF",X"F9",X"F9",X"F9",X"F8",X"74",X"74",X"33",X"00", + X"FF",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"FF", + X"00",X"CC",X"E2",X"E2",X"F1",X"F9",X"F9",X"F9",X"FF",X"F0",X"F0",X"FE",X"11",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"F1",X"E2",X"E2",X"CC",X"00",X"00",X"00",X"00",X"11",X"FE",X"F0",X"F0",X"FF", + X"FF",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"FF",X"F0",X"F0",X"FE",X"11",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"11",X"FE",X"F0",X"F0",X"FF", + X"FF",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"FF",X"F1",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9", + X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"E2",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F1",X"F1",X"E2",X"E2",X"CC",X"00", + X"00",X"33",X"74",X"74",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"74",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"33",X"74",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"E2",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"F8",X"F8",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F9",X"F8",X"F8",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"F1",X"F1",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"F1",X"F1",X"FF",X"00",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1", + X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"11",X"FE",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"FE",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"33",X"74",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"E2",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"F0",X"F9",X"F9",X"F9",X"F8",X"F8",X"F8",X"F8",X"F8", + X"F0",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"F8",X"F8",X"F9",X"F9",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"0C",X"0C",X"8C",X"0C",X"00",X"00",X"30",X"30",X"10",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"20",X"90",X"80",X"00",X"00",X"00",X"07",X"0F",X"0F",X"C3",X"1F", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"41",X"21",X"12",X"03",X"03",X"01",X"00",X"00",X"07",X"08",X"0F",X"2F",X"4F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"00",X"00",X"07",X"4F",X"0F",X"A7",X"87",X"00",X"00",X"00",X"08",X"0E",X"8E",X"1F",X"0F", + X"0C",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"33",X"10",X"10",X"10",X"00",X"00",X"00",X"00", + X"D3",X"87",X"97",X"0F",X"2F",X"07",X"00",X"00",X"4F",X"1F",X"0F",X"4F",X"0E",X"08",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"10", + X"00",X"00",X"01",X"03",X"87",X"87",X"87",X"47",X"00",X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"0C",X"0C",X"08",X"08",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EF",X"47",X"07",X"07",X"03",X"01",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"00", + X"00",X"00",X"0C",X"68",X"68",X"68",X"6E",X"6E",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"02", + X"00",X"00",X"00",X"01",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"03",X"0F",X"0F",X"0F",X"0F",X"0F", + X"68",X"68",X"68",X"68",X"68",X"0C",X"00",X"00",X"02",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0B",X"0C",X"0F",X"01",X"00",X"00",X"00",X"0F",X"0F",X"07",X"0C",X"0F",X"03",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"20", + X"00",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0C",X"0F",X"CF",X"2F",X"0F",X"0F", + X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"10",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"00",X"00", + X"00",X"00",X"00",X"80",X"48",X"84",X"C2",X"E0",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"03", + X"00",X"00",X"00",X"30",X"52",X"61",X"F1",X"BC",X"00",X"00",X"E0",X"B4",X"7C",X"E1",X"5B",X"A5", + X"68",X"84",X"C0",X"80",X"00",X"00",X"00",X"00",X"02",X"02",X"04",X"00",X"00",X"00",X"00",X"00", + X"D2",X"63",X"52",X"30",X"00",X"00",X"00",X"00",X"F5",X"E1",X"5A",X"BE",X"E0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0F",X"33",X"31",X"71",X"F3",X"00",X"00",X"00",X"08",X"0C",X"8E",X"CF",X"88", + X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F3",X"71",X"31",X"33",X"0F",X"00",X"00",X"FF",X"88",X"CF",X"8E",X"0C",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"20", + X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"F1",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"DD", + X"22",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"10",X"10",X"00",X"00",X"00",X"00", + X"E0",X"F1",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"EE",X"CC",X"88",X"8C",X"4E",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"00",X"7F",X"BF",X"7F",X"AF",X"5F",X"7F",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"11",X"00",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"8C",X"08",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"00",X"7F",X"BF",X"7F",X"AF",X"5F",X"7F",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"11",X"00",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"EE",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"60",X"69",X"0F",X"71",X"69",X"0F",X"17",X"00",X"00",X"00",X"88",X"EE",X"FF",X"FF",X"FF", + X"CC",X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"77",X"33",X"00",X"00",X"00", + X"00",X"EE",X"EE",X"EE",X"CC",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"60",X"69",X"0F",X"71",X"69",X"0F",X"17",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"33",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"44",X"EE",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"00", + X"EE",X"66",X"66",X"EE",X"EE",X"EE",X"66",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"44",X"EE",X"EE",X"EE",X"EE",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"66",X"66",X"66",X"66",X"EE",X"EE",X"66",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"08",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"03", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"07",X"03",X"01",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"07",X"0F",X"0F",X"0F",X"0F", + X"00",X"08",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"0E", + X"0F",X"0F",X"0F",X"0F",X"0E",X"0E",X"0E",X"0C",X"00",X"01",X"03",X"07",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"0F",X"0F",X"0F",X"0E",X"0C",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"00",X"01",X"03",X"07",X"0F",X"0F",X"0F",X"0F", + X"0E",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"03", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"07",X"03",X"01",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03", + X"00",X"00",X"01",X"03",X"07",X"0F",X"0F",X"0F",X"00",X"00",X"08",X"08",X"0C",X"0C",X"0E",X"0E", + X"00",X"00",X"00",X"08",X"08",X"08",X"0C",X"0C",X"03",X"07",X"07",X"07",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0E",X"0E",X"0E",X"0C",X"07",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"0F",X"0F",X"0F",X"0E",X"0C",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"03",X"03",X"07",X"07",X"00",X"00",X"08",X"0C",X"0E",X"0F",X"0F",X"0F", + X"0C",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"01",X"01",X"01",X"03",X"03", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"03", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"07",X"03",X"01",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03", + X"00",X"00",X"01",X"03",X"07",X"0F",X"0F",X"0F",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"03",X"07",X"07",X"07",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0E",X"0E",X"0E",X"0C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"0F",X"0F",X"0F",X"0E",X"0C",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"08",X"0C",X"0E",X"0F",X"0F",X"0F", + X"0C",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"E0",X"C0",X"80",X"C0",X"E0",X"E0",X"80",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70", + X"00",X"10",X"F0",X"F0",X"F0",X"F3",X"F3",X"F0",X"00",X"F0",X"F1",X"F2",X"F2",X"F1",X"F1",X"F2", + X"80",X"E0",X"E0",X"C0",X"80",X"C0",X"E0",X"00",X"70",X"70",X"30",X"30",X"10",X"00",X"00",X"00", + X"F0",X"F3",X"F3",X"F0",X"F0",X"F0",X"10",X"00",X"F2",X"F1",X"F1",X"F2",X"F2",X"F1",X"F0",X"00", + X"00",X"C0",X"E0",X"E0",X"C0",X"80",X"C0",X"E0",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70", + X"00",X"10",X"F0",X"F0",X"F0",X"F3",X"F3",X"F0",X"00",X"F0",X"F1",X"F2",X"F2",X"F1",X"F1",X"F2", + X"E0",X"C0",X"80",X"C0",X"E0",X"E0",X"C0",X"00",X"70",X"70",X"30",X"30",X"10",X"00",X"00",X"00", + X"F0",X"F3",X"F3",X"F0",X"F0",X"F0",X"10",X"00",X"F2",X"F1",X"F1",X"F2",X"F2",X"F1",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"00",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"11",X"00",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"00",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"11",X"00",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"00",X"FF",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"11",X"00",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"00",X"FF",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"11",X"00",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF",X"FF",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"00",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"11",X"00",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"00",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"11",X"00",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"01",X"30",X"30",X"67",X"77", + X"00",X"11",X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"67",X"30",X"30",X"01",X"00",X"00",X"00", + X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"01",X"30",X"30",X"67",X"77", + X"00",X"11",X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"67",X"30",X"30",X"01",X"00",X"00",X"00", + X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"06",X"09",X"08",X"08",X"06",X"02",X"0C",X"00",X"02",X"02",X"0A",X"06",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"00",X"0F",X"04",X"02",X"01",X"02",X"0C",X"00",X"08",X"0E",X"08",X"08",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"06",X"09",X"09",X"09",X"06",X"02",X"0C",X"00",X"0C",X"02",X"02",X"02",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"00",X"09",X"09",X"09",X"07",X"00",X"0F",X"0C",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"77", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"77",X"00",X"33",X"77",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"77",X"FF",X"FF",X"FF",X"EE",X"CC",X"00",X"00",X"CC",X"CC",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"CC",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"33",X"33",X"77",X"77",X"77", + X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"EE",X"EE",X"EE",X"FF",X"FF",X"FF",X"77",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"EE",X"00", + X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"01",X"02",X"04",X"0C",X"08",X"84",X"84",X"08",X"01",X"00",X"00",X"00",X"09",X"05",X"03",X"00", + X"00",X"08",X"07",X"78",X"FA",X"F5",X"EA",X"7B",X"00",X"00",X"00",X"0B",X"B5",X"EA",X"77",X"32", + X"08",X"84",X"84",X"08",X"0C",X"04",X"02",X"01",X"00",X"01",X"01",X"01",X"03",X"04",X"08",X"00", + X"26",X"5D",X"B2",X"7C",X"07",X"00",X"00",X"00",X"72",X"E6",X"CC",X"FC",X"E3",X"0E",X"00",X"00", + X"00",X"60",X"60",X"E0",X"E0",X"E8",X"CC",X"88",X"00",X"00",X"00",X"01",X"00",X"00",X"67",X"77", + X"00",X"11",X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"00",X"00",X"F0",X"F8",X"FD",X"FF",X"FF",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"67",X"00",X"00",X"01",X"00",X"00",X"00", + X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"60",X"60",X"E0",X"E0",X"E8",X"CC",X"88",X"00",X"00",X"00",X"11",X"23",X"23",X"77",X"77", + X"00",X"11",X"FF",X"1D",X"0C",X"0F",X"1F",X"FF",X"00",X"00",X"F0",X"F8",X"FD",X"FF",X"FF",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"23",X"23",X"11",X"00",X"00",X"00", + X"FF",X"1D",X"0C",X"0F",X"1F",X"FF",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"FF",X"77",X"33",X"11",X"00",X"00",X"00",X"CC",X"EE",X"EE",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00", + X"00",X"11",X"33",X"77",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"EE",X"EE",X"CC",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"77",X"FF",X"77",X"77",X"33",X"11",X"11",X"00",X"00",X"CC",X"EE",X"EE",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"33",X"77",X"77",X"FF",X"77",X"EE",X"FF",X"FF",X"FF",X"EE",X"EE",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"33",X"33",X"33",X"11",X"11",X"11",X"00",X"00",X"88",X"CC",X"EE",X"EE",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"11",X"11",X"33",X"33",X"33",X"EE",X"FF",X"FF",X"FF",X"EE",X"EE",X"CC",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"CC",X"EE",X"EE",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"11",X"EE",X"FF",X"FF",X"FF",X"FF",X"EE",X"EE",X"CC", + X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"77",X"77",X"77",X"FF",X"FF",X"FF", + X"00",X"88",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"77",X"77",X"77",X"66", + X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"33",X"77",X"77",X"FF", + X"00",X"88",X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"77",X"77",X"33",X"33",X"33",X"11", + X"00",X"00",X"CC",X"EE",X"EE",X"EE",X"EE",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"77", + X"88",X"CC",X"EE",X"EE",X"EE",X"EE",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"44",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"77", + X"CC",X"EE",X"EE",X"EE",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"33",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33", + X"CC",X"EE",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"33",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"22",X"44",X"11",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"11",X"00",X"00",X"00",X"11",X"99",X"44",X"00",X"00", + X"00",X"22",X"11",X"88",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"22",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"22",X"22",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..5a83d11e --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,34 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"0F",X"07",X"02",X"00",X"00",X"00",X"00",X"00",X"0F",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"0F",X"07",X"04",X"00",X"00",X"00",X"00",X"00",X"0F",X"07",X"05", + X"00",X"00",X"00",X"00",X"00",X"07",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"08",X"00",X"01",X"0B",X"0F", + X"00",X"08",X"00",X"09",X"00",X"06",X"08",X"07",X"00",X"0F",X"08",X"0F",X"00",X"00",X"00",X"00", + X"00",X"0F",X"02",X"0D",X"00",X"0F",X"0A",X"06",X"00",X"01",X"0D",X"0C",X"00",X"0B",X"0F",X"0D", + X"00",X"04",X"03",X"01",X"00",X"0F",X"07",X"00",X"00",X"08",X"00",X"09",X"00",X"08",X"00",X"09", + X"00",X"00",X"00",X"00",X"00",X"0F",X"08",X"02",X"00",X"0F",X"07",X"08",X"00",X"08",X"00",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin + +data <= rom_data(to_integer(unsigned(addr))); + +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..fcbfc200 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"3F",X"07",X"EF",X"F8",X"6F",X"38",X"C9",X"AF",X"AA",X"20",X"D5",X"BF",X"5D",X"ED",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..a2579c4f --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F3",X"3E",X"3F",X"ED",X"47",X"C3",X"0B",X"23",X"77",X"23",X"10",X"FC",X"C9",X"C3",X"0E",X"07", + X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"C9",X"78",X"87",X"D7",X"5F",X"23",X"56",X"EB",X"C9", + X"E1",X"87",X"D7",X"5F",X"23",X"56",X"EB",X"E9",X"E1",X"46",X"23",X"4E",X"23",X"E5",X"18",X"12", + X"11",X"90",X"4C",X"06",X"10",X"C3",X"51",X"00",X"AF",X"32",X"00",X"50",X"32",X"07",X"50",X"C3", + X"38",X"00",X"2A",X"80",X"4C",X"70",X"2C",X"71",X"2C",X"20",X"02",X"2E",X"C0",X"22",X"80",X"4C", + X"C9",X"1A",X"A7",X"28",X"06",X"1C",X"1C",X"1C",X"10",X"F7",X"C9",X"E1",X"06",X"03",X"7E",X"12", + X"23",X"1C",X"10",X"FA",X"E9",X"C3",X"2D",X"20",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07", + X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"12",X"13",X"14",X"01",X"03",X"04", + X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"14",X"F5",X"32",X"C0", + X"50",X"AF",X"32",X"00",X"50",X"F3",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"21",X"8C",X"4E", + X"11",X"50",X"50",X"01",X"10",X"00",X"ED",X"B0",X"3A",X"CC",X"4E",X"A7",X"3A",X"CF",X"4E",X"20", + X"03",X"3A",X"9F",X"4E",X"32",X"45",X"50",X"3A",X"DC",X"4E",X"A7",X"3A",X"DF",X"4E",X"20",X"03", + X"3A",X"AF",X"4E",X"32",X"4A",X"50",X"3A",X"EC",X"4E",X"A7",X"3A",X"EF",X"4E",X"20",X"03",X"3A", + X"BF",X"4E",X"32",X"4F",X"50",X"21",X"02",X"4C",X"11",X"22",X"4C",X"01",X"1C",X"00",X"ED",X"B0", + X"DD",X"21",X"20",X"4C",X"DD",X"7E",X"02",X"07",X"07",X"DD",X"77",X"02",X"DD",X"7E",X"04",X"07", + X"07",X"DD",X"77",X"04",X"DD",X"7E",X"06",X"07",X"07",X"DD",X"77",X"06",X"DD",X"7E",X"08",X"07", + X"07",X"DD",X"77",X"08",X"DD",X"7E",X"0A",X"07",X"07",X"DD",X"77",X"0A",X"DD",X"7E",X"0C",X"07", + X"07",X"DD",X"77",X"0C",X"3A",X"D1",X"4D",X"FE",X"01",X"20",X"38",X"DD",X"21",X"20",X"4C",X"3A", + X"A4",X"4D",X"87",X"5F",X"16",X"00",X"DD",X"19",X"2A",X"24",X"4C",X"ED",X"5B",X"34",X"4C",X"DD", + X"7E",X"00",X"32",X"24",X"4C",X"DD",X"7E",X"01",X"32",X"25",X"4C",X"DD",X"7E",X"10",X"32",X"34", + X"4C",X"DD",X"7E",X"11",X"32",X"35",X"4C",X"DD",X"75",X"00",X"DD",X"74",X"01",X"DD",X"73",X"10", + X"DD",X"72",X"11",X"3A",X"A6",X"4D",X"A7",X"CA",X"76",X"01",X"ED",X"4B",X"22",X"4C",X"ED",X"5B", + X"32",X"4C",X"2A",X"2A",X"4C",X"22",X"22",X"4C",X"2A",X"3A",X"4C",X"22",X"32",X"4C",X"ED",X"43", + X"2A",X"4C",X"ED",X"53",X"3A",X"4C",X"21",X"22",X"4C",X"11",X"F2",X"4F",X"01",X"0C",X"00",X"ED", + X"B0",X"21",X"32",X"4C",X"11",X"62",X"50",X"01",X"0C",X"00",X"ED",X"B0",X"CD",X"DC",X"01",X"CD", + X"21",X"02",X"CD",X"C8",X"03",X"3A",X"00",X"4E",X"A7",X"28",X"12",X"CD",X"9D",X"03",X"CD",X"AF", + X"14",X"CD",X"3E",X"14",X"CD",X"67",X"02",X"CD",X"AD",X"02",X"CD",X"FD",X"02",X"3A",X"00",X"4E", + X"3D",X"20",X"06",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"CD",X"15",X"2D",X"CD",X"CA",X"2C",X"FD", + X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"3A",X"00",X"4E",X"A7",X"28",X"08",X"3A",X"40",X"50",X"E6", + X"10",X"CA",X"00",X"00",X"3E",X"01",X"32",X"00",X"50",X"FB",X"F1",X"C9",X"21",X"84",X"4C",X"34", + X"23",X"35",X"23",X"11",X"19",X"02",X"01",X"01",X"04",X"34",X"7E",X"E6",X"0F",X"EB",X"BE",X"20", + X"13",X"0C",X"1A",X"C6",X"10",X"E6",X"F0",X"12",X"23",X"BE",X"20",X"08",X"0C",X"EB",X"36",X"00", + X"23",X"13",X"10",X"E5",X"21",X"8A",X"4C",X"71",X"2C",X"7E",X"87",X"87",X"86",X"3C",X"77",X"2C", + X"7E",X"87",X"86",X"87",X"87",X"86",X"3C",X"77",X"C9",X"06",X"A0",X"0A",X"60",X"0A",X"60",X"0A", + X"A0",X"21",X"90",X"4C",X"3A",X"8A",X"4C",X"4F",X"06",X"10",X"7E",X"A7",X"28",X"2F",X"E6",X"C0", + X"07",X"07",X"B9",X"30",X"28",X"35",X"7E",X"E6",X"3F",X"20",X"22",X"77",X"C5",X"E5",X"2C",X"7E", + X"2C",X"46",X"21",X"5B",X"02",X"E5",X"E7",X"BF",X"08",X"A3",X"06",X"8E",X"05",X"80",X"12",X"00", + X"10",X"0B",X"10",X"63",X"02",X"2B",X"21",X"F0",X"21",X"B9",X"22",X"E1",X"C1",X"2C",X"2C",X"2C", + X"10",X"C8",X"C9",X"EF",X"1C",X"86",X"C9",X"3A",X"6E",X"4E",X"FE",X"99",X"17",X"32",X"06",X"50", + X"1F",X"D0",X"3A",X"00",X"50",X"47",X"CB",X"00",X"3A",X"66",X"4E",X"17",X"E6",X"0F",X"32",X"66", + X"4E",X"D6",X"0C",X"CC",X"DF",X"02",X"CB",X"00",X"3A",X"67",X"4E",X"17",X"E6",X"0F",X"32",X"67", + X"4E",X"D6",X"0C",X"C2",X"9A",X"02",X"21",X"69",X"4E",X"34",X"CB",X"00",X"3A",X"68",X"4E",X"17", + X"E6",X"0F",X"32",X"68",X"4E",X"D6",X"0C",X"C0",X"21",X"69",X"4E",X"34",X"C9",X"3A",X"69",X"4E", + X"A7",X"C8",X"47",X"3A",X"6A",X"4E",X"5F",X"FE",X"00",X"C2",X"C4",X"02",X"3E",X"01",X"32",X"07", + X"50",X"CD",X"DF",X"02",X"7B",X"FE",X"08",X"C2",X"CE",X"02",X"AF",X"32",X"07",X"50",X"1C",X"7B", + X"32",X"6A",X"4E",X"D6",X"10",X"C0",X"32",X"6A",X"4E",X"05",X"78",X"32",X"69",X"4E",X"C9",X"3A", + X"6B",X"4E",X"21",X"6C",X"4E",X"34",X"96",X"C0",X"77",X"3A",X"6D",X"4E",X"21",X"6E",X"4E",X"86", + X"27",X"D2",X"F6",X"02",X"3E",X"99",X"77",X"21",X"9C",X"4E",X"CB",X"CE",X"C9",X"21",X"CE",X"4D", + X"34",X"7E",X"E6",X"0F",X"20",X"1F",X"7E",X"0F",X"0F",X"0F",X"0F",X"47",X"3A",X"D6",X"4D",X"2F", + X"B0",X"4F",X"3A",X"6E",X"4E",X"D6",X"01",X"30",X"02",X"AF",X"4F",X"28",X"01",X"79",X"32",X"05", + X"50",X"79",X"32",X"04",X"50",X"DD",X"21",X"D8",X"43",X"FD",X"21",X"C5",X"43",X"3A",X"00",X"4E", + X"FE",X"03",X"CA",X"44",X"03",X"3A",X"03",X"4E",X"FE",X"02",X"D2",X"44",X"03",X"CD",X"69",X"03", + X"CD",X"76",X"03",X"C9",X"3A",X"09",X"4E",X"A7",X"3A",X"CE",X"4D",X"C2",X"59",X"03",X"CB",X"67", + X"CC",X"69",X"03",X"C4",X"83",X"03",X"C3",X"61",X"03",X"CB",X"67",X"CC",X"76",X"03",X"C4",X"90", + X"03",X"3A",X"70",X"4E",X"A7",X"CC",X"90",X"03",X"C9",X"DD",X"36",X"00",X"50",X"DD",X"36",X"01", + X"55",X"DD",X"36",X"02",X"31",X"C9",X"FD",X"36",X"00",X"50",X"FD",X"36",X"01",X"55",X"FD",X"36", + X"02",X"32",X"C9",X"DD",X"36",X"00",X"40",X"DD",X"36",X"01",X"40",X"DD",X"36",X"02",X"40",X"C9", + X"FD",X"36",X"00",X"40",X"FD",X"36",X"01",X"40",X"FD",X"36",X"02",X"40",X"C9",X"3A",X"06",X"4E", + X"D6",X"05",X"D8",X"2A",X"08",X"4D",X"06",X"08",X"0E",X"10",X"7D",X"32",X"06",X"4D",X"32",X"D2", + X"4D",X"91",X"32",X"02",X"4D",X"32",X"04",X"4D",X"7C",X"80",X"32",X"03",X"4D",X"32",X"07",X"4D", + X"91",X"32",X"05",X"4D",X"32",X"D3",X"4D",X"C9",X"3A",X"00",X"4E",X"E7",X"D4",X"03",X"FE",X"03", + X"E5",X"05",X"BE",X"06",X"3A",X"01",X"4E",X"E7",X"DC",X"03",X"0C",X"00",X"EF",X"00",X"00",X"EF", + X"06",X"00",X"EF",X"01",X"00",X"EF",X"14",X"00",X"EF",X"18",X"00",X"EF",X"04",X"00",X"EF",X"1E", + X"00",X"EF",X"07",X"00",X"21",X"01",X"4E",X"34",X"21",X"01",X"50",X"36",X"01",X"C9",X"CD",X"AA", + X"2B",X"3A",X"6E",X"4E",X"A7",X"28",X"0C",X"AF",X"32",X"04",X"4E",X"32",X"02",X"4E",X"21",X"00", + X"4E",X"34",X"C9",X"3A",X"02",X"4E",X"E7",X"5F",X"04",X"0C",X"00",X"71",X"04",X"0C",X"00",X"7F", + X"04",X"0C",X"00",X"85",X"04",X"0C",X"00",X"8B",X"04",X"0C",X"00",X"99",X"04",X"0C",X"00",X"9F", + X"04",X"0C",X"00",X"A5",X"04",X"0C",X"00",X"B3",X"04",X"0C",X"00",X"B9",X"04",X"0C",X"00",X"BF", + X"04",X"0C",X"00",X"CD",X"04",X"0C",X"00",X"D3",X"04",X"0C",X"00",X"D8",X"04",X"0C",X"00",X"E0", + X"04",X"0C",X"00",X"1C",X"05",X"4B",X"05",X"56",X"05",X"61",X"05",X"6C",X"05",X"7C",X"05",X"EF", + X"00",X"01",X"EF",X"01",X"00",X"EF",X"04",X"00",X"EF",X"1E",X"00",X"0E",X"0C",X"CD",X"85",X"05", + X"C9",X"21",X"04",X"43",X"3E",X"01",X"CD",X"BF",X"05",X"0E",X"0C",X"CD",X"85",X"05",X"C9",X"0E", + X"14",X"CD",X"93",X"05",X"C9",X"0E",X"0D",X"CD",X"93",X"05",X"C9",X"21",X"07",X"43",X"3E",X"03", + X"CD",X"BF",X"05",X"0E",X"0C",X"CD",X"85",X"05",X"C9",X"0E",X"16",X"CD",X"93",X"05",X"C9",X"0E", + X"0F",X"CD",X"93",X"05",X"C9",X"21",X"0A",X"43",X"3E",X"05",X"CD",X"BF",X"05",X"0E",X"0C",X"CD", + X"85",X"05",X"C9",X"0E",X"33",X"CD",X"93",X"05",X"C9",X"0E",X"2F",X"CD",X"93",X"05",X"C9",X"21", + X"0D",X"43",X"3E",X"07",X"CD",X"BF",X"05",X"0E",X"0C",X"CD",X"85",X"05",X"C9",X"0E",X"35",X"CD", + X"93",X"05",X"C9",X"0E",X"31",X"C3",X"80",X"05",X"EF",X"1C",X"11",X"0E",X"12",X"C3",X"85",X"05", + X"0E",X"13",X"CD",X"85",X"05",X"CD",X"A4",X"08",X"35",X"EF",X"11",X"00",X"EF",X"05",X"01",X"EF", + X"10",X"14",X"EF",X"04",X"01",X"3E",X"01",X"32",X"14",X"4E",X"AF",X"32",X"70",X"4E",X"32",X"15", + X"4E",X"21",X"32",X"43",X"36",X"14",X"3E",X"FC",X"11",X"20",X"00",X"06",X"1C",X"DD",X"21",X"40", + X"40",X"DD",X"77",X"11",X"DD",X"77",X"13",X"DD",X"19",X"10",X"F6",X"C9",X"21",X"A0",X"4D",X"06", + X"21",X"3A",X"3A",X"4D",X"90",X"20",X"05",X"36",X"01",X"C3",X"8E",X"05",X"CD",X"17",X"10",X"CD", + X"17",X"10",X"CD",X"4E",X"0E",X"CD",X"38",X"0C",X"CD",X"01",X"0C",X"CD",X"A5",X"05",X"CD",X"5E", + X"1F",X"CD",X"85",X"1F",X"CD",X"AC",X"1F",X"CD",X"D3",X"1F",X"C9",X"21",X"A1",X"4D",X"06",X"20", + X"3A",X"32",X"4D",X"C3",X"24",X"05",X"21",X"A2",X"4D",X"06",X"22",X"3A",X"32",X"4D",X"C3",X"24", + X"05",X"21",X"A3",X"4D",X"06",X"24",X"3A",X"32",X"4D",X"C3",X"24",X"05",X"3A",X"D0",X"4D",X"47", + X"3A",X"D1",X"4D",X"80",X"FE",X"06",X"CA",X"8E",X"05",X"C3",X"2C",X"05",X"CD",X"BE",X"06",X"C9", + X"3A",X"75",X"4E",X"81",X"4F",X"06",X"1C",X"CD",X"42",X"00",X"F7",X"4A",X"02",X"00",X"21",X"02", + X"4E",X"34",X"C9",X"3A",X"75",X"4E",X"81",X"4F",X"06",X"1C",X"CD",X"42",X"00",X"F7",X"45",X"02", + X"00",X"CD",X"8E",X"05",X"C9",X"3A",X"B5",X"4D",X"A7",X"C8",X"AF",X"32",X"B5",X"4D",X"3A",X"30", + X"4D",X"EE",X"02",X"32",X"3C",X"4D",X"47",X"21",X"FF",X"32",X"DF",X"22",X"26",X"4D",X"C9",X"36", + X"B1",X"2C",X"36",X"B3",X"2C",X"36",X"B5",X"01",X"1E",X"00",X"09",X"36",X"B0",X"2C",X"36",X"B2", + X"2C",X"36",X"B4",X"11",X"00",X"04",X"19",X"77",X"2D",X"77",X"2D",X"77",X"A7",X"ED",X"42",X"77", + X"2D",X"77",X"2D",X"77",X"C9",X"3A",X"03",X"4E",X"E7",X"F3",X"05",X"1B",X"06",X"74",X"06",X"0C", + X"00",X"A8",X"06",X"CD",X"AA",X"2B",X"EF",X"00",X"01",X"EF",X"01",X"00",X"EF",X"1C",X"07",X"EF", + X"1C",X"0B",X"EF",X"1E",X"00",X"21",X"03",X"4E",X"34",X"3E",X"01",X"32",X"D6",X"4D",X"3A",X"71", + X"4E",X"FE",X"FF",X"C8",X"EF",X"1C",X"0A",X"EF",X"1F",X"00",X"C9",X"CD",X"AA",X"2B",X"3A",X"6E", + X"4E",X"FE",X"01",X"06",X"09",X"20",X"02",X"06",X"08",X"CD",X"67",X"2C",X"3A",X"6E",X"4E",X"FE", + X"01",X"3A",X"40",X"50",X"28",X"0C",X"CB",X"77",X"20",X"08",X"3E",X"01",X"32",X"70",X"4E",X"C3", + X"49",X"06",X"CB",X"6F",X"C0",X"AF",X"32",X"70",X"4E",X"3A",X"6B",X"4E",X"A7",X"28",X"15",X"3A", + X"70",X"4E",X"A7",X"3A",X"6E",X"4E",X"28",X"03",X"C6",X"99",X"27",X"C6",X"99",X"27",X"32",X"6E", + X"4E",X"CD",X"AA",X"2B",X"21",X"03",X"4E",X"34",X"AF",X"32",X"D6",X"4D",X"3C",X"32",X"CC",X"4E", + X"32",X"DC",X"4E",X"C9",X"EF",X"00",X"01",X"EF",X"01",X"01",X"EF",X"02",X"00",X"EF",X"12",X"00", + X"EF",X"03",X"00",X"EF",X"1C",X"03",X"EF",X"1C",X"06",X"EF",X"18",X"00",X"EF",X"1B",X"00",X"AF", + X"32",X"13",X"4E",X"3A",X"6F",X"4E",X"32",X"14",X"4E",X"32",X"15",X"4E",X"EF",X"1A",X"00",X"F7", + X"57",X"01",X"00",X"21",X"03",X"4E",X"34",X"C9",X"21",X"15",X"4E",X"35",X"CD",X"73",X"2B",X"AF", + X"32",X"03",X"4E",X"32",X"02",X"4E",X"32",X"04",X"4E",X"21",X"00",X"4E",X"34",X"C9",X"3A",X"04", + X"4E",X"E7",X"A4",X"08",X"C4",X"08",X"0C",X"00",X"F8",X"08",X"38",X"09",X"0C",X"00",X"6B",X"09", + X"0C",X"00",X"9D",X"09",X"B3",X"09",X"0C",X"00",X"FD",X"09",X"03",X"0A",X"0C",X"00",X"13",X"0A", + X"0C",X"00",X"29",X"0A",X"0C",X"00",X"2D",X"0A",X"0C",X"00",X"2F",X"0A",X"0C",X"00",X"31",X"0A", + X"0C",X"00",X"33",X"0A",X"0C",X"00",X"35",X"0A",X"0C",X"00",X"37",X"0A",X"0C",X"00",X"39",X"0A", + X"0C",X"00",X"57",X"0A",X"0C",X"00",X"A7",X"0A",X"CB",X"0A",X"0C",X"00",X"CE",X"0A",X"78",X"A7", + X"20",X"04",X"2A",X"0A",X"4E",X"7E",X"DD",X"21",X"AC",X"07",X"47",X"87",X"87",X"87",X"90",X"5F", + X"16",X"00",X"DD",X"19",X"DD",X"7E",X"00",X"87",X"47",X"87",X"87",X"4F",X"87",X"87",X"81",X"80", + X"5F",X"16",X"00",X"21",X"0F",X"33",X"19",X"CD",X"3F",X"08",X"DD",X"7E",X"01",X"32",X"B0",X"4D", + X"DD",X"7E",X"02",X"47",X"87",X"80",X"5F",X"16",X"00",X"21",X"6E",X"08",X"19",X"CD",X"65",X"08", + X"DD",X"7E",X"03",X"87",X"5F",X"16",X"00",X"FD",X"21",X"7A",X"08",X"FD",X"19",X"FD",X"6E",X"00", + X"FD",X"66",X"01",X"22",X"BB",X"4D",X"DD",X"7E",X"04",X"87",X"5F",X"16",X"00",X"FD",X"21",X"8C", + X"08",X"FD",X"19",X"FD",X"6E",X"00",X"FD",X"66",X"01",X"22",X"BD",X"4D",X"DD",X"7E",X"05",X"87", + X"5F",X"16",X"00",X"FD",X"21",X"9E",X"08",X"FD",X"19",X"FD",X"6E",X"00",X"FD",X"66",X"01",X"22", + X"95",X"4D",X"DD",X"7E",X"06",X"87",X"5F",X"16",X"00",X"FD",X"21",X"8C",X"08",X"FD",X"19",X"FD", + X"6E",X"00",X"FD",X"66",X"01",X"22",X"76",X"4E",X"CD",X"F3",X"2B",X"C9",X"05",X"01",X"02",X"01", + X"04",X"00",X"02",X"05",X"01",X"03",X"02",X"05",X"00",X"02",X"05",X"01",X"03",X"03",X"06",X"01", + X"03",X"05",X"02",X"03",X"03",X"06",X"01",X"04",X"05",X"00",X"03",X"04",X"06",X"02",X"05",X"05", + X"01",X"03",X"04",X"04",X"02",X"03",X"05",X"02",X"03",X"05",X"06",X"02",X"05",X"05",X"02",X"03", + X"05",X"07",X"02",X"05",X"05",X"00",X"03",X"05",X"07",X"02",X"06",X"05",X"01",X"03",X"06",X"06", + X"02",X"04",X"05",X"02",X"03",X"06",X"07",X"02",X"06",X"05",X"02",X"03",X"06",X"08",X"02",X"06", + X"05",X"00",X"03",X"06",X"08",X"02",X"06",X"05",X"02",X"03",X"05",X"06",X"02",X"04",X"05",X"01", + X"03",X"06",X"08",X"02",X"06",X"06",X"02",X"03",X"06",X"07",X"02",X"06",X"06",X"02",X"03",X"07", + X"08",X"02",X"06",X"06",X"02",X"03",X"07",X"06",X"02",X"06",X"06",X"02",X"03",X"07",X"08",X"02", + X"07",X"06",X"02",X"03",X"07",X"08",X"02",X"07",X"06",X"02",X"03",X"07",X"08",X"02",X"08",X"11", + X"46",X"4D",X"01",X"1C",X"00",X"ED",X"B0",X"01",X"0C",X"00",X"A7",X"ED",X"42",X"ED",X"B0",X"01", + X"0C",X"00",X"A7",X"ED",X"42",X"ED",X"B0",X"01",X"0C",X"00",X"A7",X"ED",X"42",X"ED",X"B0",X"01", + X"0E",X"00",X"ED",X"B0",X"C9",X"11",X"B8",X"4D",X"01",X"03",X"00",X"ED",X"B0",X"C9",X"14",X"1E", + X"46",X"00",X"1E",X"3C",X"00",X"00",X"32",X"00",X"00",X"00",X"14",X"0A",X"1E",X"0F",X"28",X"14", + X"32",X"19",X"3C",X"1E",X"50",X"28",X"64",X"32",X"78",X"3C",X"8C",X"46",X"C0",X"03",X"48",X"03", + X"D0",X"02",X"58",X"02",X"E0",X"01",X"68",X"01",X"F0",X"00",X"78",X"00",X"01",X"00",X"F0",X"00", + X"F0",X"00",X"B4",X"00",X"21",X"09",X"4E",X"AF",X"06",X"0B",X"CF",X"CD",X"C9",X"24",X"2A",X"73", + X"4E",X"22",X"0A",X"4E",X"21",X"0A",X"4E",X"11",X"38",X"4E",X"01",X"2E",X"00",X"ED",X"B0",X"21", + X"04",X"4E",X"34",X"C9",X"3A",X"00",X"4E",X"3D",X"20",X"06",X"3E",X"09",X"32",X"04",X"4E",X"C9", + X"EF",X"11",X"00",X"EF",X"1C",X"83",X"EF",X"04",X"00",X"EF",X"05",X"00",X"EF",X"10",X"00",X"EF", + X"1A",X"00",X"F7",X"54",X"00",X"00",X"F7",X"54",X"06",X"00",X"3A",X"72",X"4E",X"47",X"3A",X"09", + X"4E",X"A0",X"32",X"03",X"50",X"C3",X"BF",X"08",X"3A",X"00",X"50",X"CB",X"67",X"C2",X"09",X"09", + X"21",X"04",X"4E",X"36",X"0E",X"EF",X"13",X"00",X"C9",X"3A",X"0E",X"4E",X"FE",X"F4",X"20",X"06", + X"21",X"04",X"4E",X"36",X"0C",X"C9",X"CD",X"17",X"10",X"CD",X"17",X"10",X"CD",X"FC",X"13",X"CD", + X"6D",X"0C",X"CD",X"4E",X"0E",X"CD",X"61",X"0E",X"CD",X"EE",X"0A",X"CD",X"01",X"0C",X"CD",X"38", + X"0C",X"CD",X"97",X"0E",X"CD",X"D8",X"0E",X"C9",X"3E",X"01",X"32",X"12",X"4E",X"CD",X"87",X"24", + X"21",X"04",X"4E",X"34",X"3A",X"14",X"4E",X"A7",X"20",X"1F",X"3A",X"70",X"4E",X"A7",X"28",X"19", + X"3A",X"42",X"4E",X"A7",X"28",X"13",X"3A",X"09",X"4E",X"C6",X"03",X"4F",X"06",X"1C",X"CD",X"42", + X"00",X"EF",X"1C",X"05",X"F7",X"54",X"00",X"00",X"C9",X"34",X"C9",X"3A",X"70",X"4E",X"A7",X"28", + X"06",X"3A",X"42",X"4E",X"A7",X"20",X"15",X"3A",X"14",X"4E",X"A7",X"20",X"1A",X"CD",X"AA",X"2B", + X"EF",X"1C",X"05",X"F7",X"54",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"CD",X"D1",X"0A",X"3A", + X"09",X"4E",X"EE",X"01",X"32",X"09",X"4E",X"3E",X"09",X"32",X"04",X"4E",X"C9",X"AF",X"32",X"02", + X"4E",X"32",X"04",X"4E",X"32",X"70",X"4E",X"32",X"09",X"4E",X"32",X"03",X"50",X"3E",X"01",X"32", + X"00",X"4E",X"C9",X"EF",X"00",X"01",X"EF",X"01",X"01",X"EF",X"02",X"00",X"EF",X"11",X"00",X"EF", + X"13",X"00",X"EF",X"03",X"00",X"EF",X"04",X"00",X"EF",X"05",X"00",X"EF",X"10",X"00",X"EF",X"1A", + X"00",X"EF",X"1C",X"06",X"3A",X"00",X"4E",X"FE",X"03",X"28",X"06",X"EF",X"1C",X"05",X"EF",X"1D", + X"00",X"F7",X"54",X"00",X"00",X"3A",X"00",X"4E",X"3D",X"28",X"04",X"F7",X"54",X"06",X"00",X"3A", + X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"32",X"03",X"50",X"C3",X"BF",X"08",X"3E",X"03",X"32", + X"04",X"4E",X"C9",X"F7",X"54",X"00",X"00",X"21",X"04",X"4E",X"34",X"AF",X"32",X"AC",X"4E",X"32", + X"BC",X"4E",X"C9",X"0E",X"02",X"06",X"01",X"CD",X"42",X"00",X"F7",X"42",X"00",X"00",X"21",X"00", + X"00",X"CD",X"85",X"26",X"21",X"04",X"4E",X"34",X"C9",X"0E",X"00",X"18",X"E8",X"18",X"E4",X"18", + X"F8",X"18",X"E0",X"18",X"F4",X"18",X"DC",X"18",X"F0",X"EF",X"00",X"01",X"EF",X"06",X"00",X"EF", + X"11",X"00",X"EF",X"13",X"00",X"EF",X"04",X"01",X"EF",X"05",X"01",X"EF",X"10",X"0A",X"F7",X"43", + X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"AF",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"3E",X"02", + X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"3A",X"13",X"4E",X"FE",X"14",X"38",X"02",X"3E",X"14",X"E7", + X"9A",X"0A",X"08",X"21",X"9A",X"0A",X"9A",X"0A",X"9E",X"21",X"9A",X"0A",X"9A",X"0A",X"9A",X"0A", + X"97",X"22",X"9A",X"0A",X"9A",X"0A",X"9A",X"0A",X"97",X"22",X"9A",X"0A",X"9A",X"0A",X"9A",X"0A", + X"97",X"22",X"9A",X"0A",X"9A",X"0A",X"9A",X"0A",X"9A",X"0A",X"21",X"04",X"4E",X"34",X"34",X"AF", + X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"C9",X"AF",X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"06",X"07", + X"21",X"0C",X"4E",X"CF",X"CD",X"C9",X"24",X"21",X"04",X"4E",X"34",X"21",X"13",X"4E",X"34",X"2A", + X"0A",X"4E",X"7E",X"FE",X"14",X"C8",X"23",X"22",X"0A",X"4E",X"C9",X"C3",X"B3",X"09",X"C3",X"FD", + X"09",X"06",X"2E",X"DD",X"21",X"0A",X"4E",X"FD",X"21",X"38",X"4E",X"DD",X"56",X"00",X"FD",X"5E", + X"00",X"FD",X"72",X"00",X"DD",X"73",X"00",X"DD",X"23",X"FD",X"23",X"10",X"EE",X"C9",X"3A",X"A4", + X"4D",X"A7",X"C0",X"DD",X"21",X"00",X"4C",X"FD",X"21",X"C8",X"4D",X"11",X"00",X"01",X"FD",X"BE", + X"00",X"C2",X"FD",X"0B",X"FD",X"36",X"00",X"0E",X"3A",X"A6",X"4D",X"A7",X"28",X"1B",X"2A",X"CB", + X"4D",X"A7",X"ED",X"52",X"30",X"13",X"21",X"AC",X"4E",X"CB",X"FE",X"3E",X"09",X"DD",X"BE",X"0B", + X"20",X"04",X"CB",X"BE",X"3E",X"09",X"32",X"0B",X"4C",X"3A",X"A7",X"4D",X"A7",X"28",X"1D",X"2A", + X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"27",X"3E",X"11",X"DD",X"BE",X"03",X"28",X"07",X"DD",X"36", + X"03",X"11",X"C3",X"5E",X"0B",X"DD",X"36",X"03",X"12",X"C3",X"5E",X"0B",X"3E",X"01",X"DD",X"BE", + X"03",X"28",X"07",X"DD",X"36",X"03",X"01",X"C3",X"5E",X"0B",X"DD",X"36",X"03",X"01",X"3A",X"A8", + X"4D",X"A7",X"28",X"1D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"27",X"3E",X"11",X"DD",X"BE", + X"05",X"28",X"07",X"DD",X"36",X"05",X"11",X"C3",X"93",X"0B",X"DD",X"36",X"05",X"12",X"C3",X"93", + X"0B",X"3E",X"03",X"DD",X"BE",X"05",X"28",X"07",X"DD",X"36",X"05",X"03",X"C3",X"93",X"0B",X"DD", + X"36",X"05",X"03",X"3A",X"A9",X"4D",X"A7",X"28",X"1D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30", + X"27",X"3E",X"11",X"DD",X"BE",X"07",X"28",X"07",X"DD",X"36",X"07",X"11",X"C3",X"C8",X"0B",X"DD", + X"36",X"07",X"12",X"C3",X"C8",X"0B",X"3E",X"05",X"DD",X"BE",X"07",X"28",X"07",X"DD",X"36",X"07", + X"05",X"C3",X"C8",X"0B",X"DD",X"36",X"07",X"05",X"3A",X"AA",X"4D",X"A7",X"28",X"1D",X"2A",X"CB", + X"4D",X"A7",X"ED",X"52",X"30",X"27",X"3E",X"11",X"DD",X"BE",X"09",X"28",X"07",X"DD",X"36",X"09", + X"11",X"C3",X"FD",X"0B",X"DD",X"36",X"09",X"12",X"C3",X"FD",X"0B",X"3E",X"07",X"DD",X"BE",X"09", + X"28",X"07",X"DD",X"36",X"09",X"07",X"C3",X"FD",X"0B",X"DD",X"36",X"09",X"07",X"FD",X"35",X"00", + X"C9",X"06",X"19",X"3A",X"02",X"4E",X"FE",X"22",X"C2",X"0D",X"0C",X"06",X"00",X"DD",X"21",X"00", + X"4C",X"3A",X"AC",X"4D",X"A7",X"CA",X"1B",X"0C",X"DD",X"70",X"03",X"3A",X"AD",X"4D",X"A7",X"CA", + X"25",X"0C",X"DD",X"70",X"05",X"3A",X"AE",X"4D",X"A7",X"CA",X"2F",X"0C",X"DD",X"70",X"07",X"3A", + X"AF",X"4D",X"A7",X"C8",X"DD",X"70",X"09",X"C9",X"21",X"CF",X"4D",X"34",X"3E",X"0A",X"BE",X"C0", + X"36",X"00",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"15",X"21",X"64",X"44",X"3E",X"10",X"BE",X"20", + X"02",X"3E",X"00",X"77",X"32",X"78",X"44",X"32",X"84",X"47",X"32",X"98",X"47",X"C9",X"21",X"32", + X"47",X"3E",X"10",X"BE",X"20",X"02",X"3E",X"00",X"77",X"32",X"78",X"46",X"C9",X"3A",X"A4",X"4D", + X"A7",X"C0",X"3A",X"94",X"4D",X"07",X"32",X"94",X"4D",X"D0",X"3A",X"A0",X"4D",X"A7",X"C2",X"BB", + X"0C",X"DD",X"21",X"05",X"33",X"FD",X"21",X"00",X"4D",X"CD",X"00",X"20",X"22",X"00",X"4D",X"3E", + X"03",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3A",X"00",X"4D",X"FE",X"64",X"C2",X"BB",X"0C",X"21", + X"2C",X"2E",X"22",X"0A",X"4D",X"21",X"00",X"01",X"22",X"14",X"4D",X"22",X"1E",X"4D",X"3E",X"02", + X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3E",X"01",X"32",X"A0",X"4D",X"3A",X"A1",X"4D",X"FE",X"01", + X"CA",X"26",X"0D",X"FE",X"00",X"C2",X"EC",X"0C",X"3A",X"02",X"4D",X"FE",X"78",X"CC",X"8E",X"1F", + X"FE",X"80",X"CC",X"8E",X"1F",X"3A",X"2D",X"4D",X"32",X"29",X"4D",X"DD",X"21",X"20",X"4D",X"FD", + X"21",X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"C3",X"26",X"0D",X"DD",X"21",X"05",X"33", + X"FD",X"21",X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"3E",X"03",X"32",X"2D",X"4D",X"32", + X"29",X"4D",X"3A",X"02",X"4D",X"FE",X"64",X"C2",X"26",X"0D",X"21",X"2C",X"2E",X"22",X"0C",X"4D", + X"21",X"00",X"01",X"22",X"16",X"4D",X"22",X"20",X"4D",X"3E",X"02",X"32",X"29",X"4D",X"32",X"2D", + X"4D",X"3E",X"01",X"32",X"A1",X"4D",X"3A",X"A2",X"4D",X"FE",X"01",X"CA",X"BE",X"0D",X"FE",X"00", + X"C2",X"57",X"0D",X"3A",X"04",X"4D",X"FE",X"78",X"CC",X"B5",X"1F",X"FE",X"80",X"CC",X"B5",X"1F", + X"3A",X"2E",X"4D",X"32",X"2A",X"4D",X"DD",X"21",X"22",X"4D",X"FD",X"21",X"04",X"4D",X"CD",X"00", + X"20",X"22",X"04",X"4D",X"C3",X"BE",X"0D",X"3A",X"A2",X"4D",X"FE",X"03",X"C2",X"84",X"0D",X"DD", + X"21",X"FF",X"32",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"AF",X"32",X"2A", + X"4D",X"32",X"2E",X"4D",X"3A",X"05",X"4D",X"FE",X"80",X"C2",X"BE",X"0D",X"3E",X"02",X"32",X"A2", + X"4D",X"C3",X"BE",X"0D",X"DD",X"21",X"05",X"33",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22", + X"04",X"4D",X"3E",X"03",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3A",X"04",X"4D",X"FE",X"64",X"C2", + X"BE",X"0D",X"21",X"2C",X"2E",X"22",X"0E",X"4D",X"21",X"00",X"01",X"22",X"18",X"4D",X"22",X"22", + X"4D",X"3E",X"02",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3E",X"01",X"32",X"A2",X"4D",X"3A",X"A3", + X"4D",X"FE",X"01",X"C8",X"FE",X"00",X"C2",X"EB",X"0D",X"3A",X"06",X"4D",X"FE",X"78",X"CC",X"DC", + X"1F",X"FE",X"80",X"CC",X"DC",X"1F",X"3A",X"2F",X"4D",X"32",X"2B",X"4D",X"DD",X"21",X"24",X"4D", + X"FD",X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"C9",X"3A",X"A3",X"4D",X"FE",X"03", + X"C2",X"15",X"0E",X"DD",X"21",X"03",X"33",X"FD",X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06", + X"4D",X"3E",X"02",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3A",X"07",X"4D",X"FE",X"80",X"C0",X"3E", + X"02",X"32",X"A3",X"4D",X"C9",X"DD",X"21",X"05",X"33",X"FD",X"21",X"06",X"4D",X"CD",X"00",X"20", + X"22",X"06",X"4D",X"3E",X"03",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3A",X"06",X"4D",X"FE",X"64", + X"C0",X"21",X"2C",X"2E",X"22",X"10",X"4D",X"21",X"00",X"01",X"22",X"1A",X"4D",X"22",X"24",X"4D", + X"3E",X"02",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3E",X"01",X"32",X"A3",X"4D",X"C9",X"21",X"C4", + X"4D",X"34",X"3E",X"08",X"BE",X"C0",X"36",X"00",X"3A",X"C0",X"4D",X"EE",X"01",X"32",X"C0",X"4D", + X"C9",X"3A",X"A6",X"4D",X"A7",X"C0",X"3A",X"C1",X"4D",X"FE",X"07",X"C8",X"87",X"2A",X"C2",X"4D", + X"23",X"22",X"C2",X"4D",X"5F",X"16",X"00",X"DD",X"21",X"86",X"4D",X"DD",X"19",X"DD",X"5E",X"00", + X"DD",X"56",X"01",X"A7",X"ED",X"52",X"C0",X"CB",X"3F",X"3C",X"32",X"C1",X"4D",X"21",X"01",X"01", + X"22",X"B1",X"4D",X"22",X"B3",X"4D",X"C9",X"3A",X"A5",X"4D",X"A7",X"28",X"05",X"AF",X"32",X"AC", + X"4E",X"C9",X"21",X"AC",X"4E",X"06",X"E0",X"3A",X"0E",X"4E",X"FE",X"E4",X"38",X"06",X"78",X"A6", + X"CB",X"E7",X"77",X"C9",X"FE",X"D4",X"38",X"06",X"78",X"A6",X"CB",X"DF",X"77",X"C9",X"FE",X"B4", + X"38",X"06",X"78",X"A6",X"CB",X"D7",X"77",X"C9",X"FE",X"74",X"38",X"06",X"78",X"A6",X"CB",X"CF", + X"77",X"C9",X"78",X"A6",X"CB",X"C7",X"77",X"C9",X"3A",X"A5",X"4D",X"A7",X"C0",X"3A",X"D4",X"4D", + X"A7",X"C0",X"3A",X"0E",X"4E",X"FE",X"46",X"28",X"0E",X"FE",X"AA",X"C0",X"3A",X"0D",X"4E",X"A7", + X"C0",X"21",X"0D",X"4E",X"34",X"18",X"09",X"3A",X"0C",X"4E",X"A7",X"C0",X"21",X"0C",X"4E",X"34", + X"21",X"94",X"80",X"22",X"D2",X"4D",X"21",X"28",X"0F",X"3A",X"13",X"4E",X"FE",X"14",X"38",X"02", + X"3E",X"14",X"47",X"87",X"80",X"D7",X"32",X"0C",X"4C",X"23",X"7E",X"32",X"0D",X"4C",X"23",X"7E", + X"32",X"D4",X"4D",X"F7",X"8A",X"04",X"00",X"C9",X"00",X"14",X"06",X"01",X"0F",X"07",X"02",X"15", + X"08",X"02",X"15",X"08",X"04",X"14",X"09",X"04",X"14",X"09",X"05",X"17",X"0A",X"05",X"17",X"0A", + X"06",X"09",X"0B",X"06",X"09",X"0B",X"03",X"16",X"0C",X"03",X"16",X"0C",X"07",X"16",X"0D",X"07", + X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16", + X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"2A",X"76",X"4E",X"22",X"CB",X"4D",X"3E",X"01",X"32",X"A6",X"4D",X"32",X"A7",X"4D",X"32",X"A8", + X"4D",X"32",X"A9",X"4D",X"32",X"AA",X"4D",X"32",X"B1",X"4D",X"32",X"B2",X"4D",X"32",X"B3",X"4D", + X"32",X"B4",X"4D",X"32",X"B5",X"4D",X"32",X"78",X"4E",X"AF",X"32",X"C8",X"4D",X"32",X"D0",X"4D", + X"DD",X"21",X"00",X"4C",X"DD",X"36",X"02",X"1C",X"DD",X"36",X"04",X"1C",X"DD",X"36",X"06",X"1C", + X"DD",X"36",X"08",X"1C",X"DD",X"36",X"03",X"00",X"DD",X"36",X"05",X"00",X"DD",X"36",X"07",X"00", + X"DD",X"36",X"09",X"00",X"21",X"AC",X"4E",X"CB",X"EE",X"CB",X"BE",X"C9",X"3A",X"78",X"4E",X"A7", + X"CA",X"A2",X"17",X"04",X"78",X"FE",X"06",X"C2",X"A2",X"17",X"06",X"0E",X"C3",X"A2",X"17",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"51",X"47", + X"AF",X"32",X"D4",X"4D",X"21",X"00",X"00",X"22",X"D2",X"4D",X"C9",X"EF",X"1C",X"9B",X"3A",X"00", + X"4E",X"3D",X"C8",X"EF",X"1C",X"A2",X"C9",X"CD",X"9F",X"12",X"3A",X"A5",X"4D",X"A7",X"C0",X"CD", + X"66",X"10",X"CD",X"94",X"10",X"CD",X"9E",X"10",X"CD",X"A8",X"10",X"CD",X"B4",X"10",X"3A",X"A4", + X"4D",X"A7",X"CA",X"39",X"10",X"CD",X"35",X"12",X"C9",X"CD",X"3C",X"17",X"CD",X"AB",X"17",X"3A", + X"A4",X"4D",X"A7",X"C0",X"CD",X"28",X"18",X"CD",X"96",X"1B",X"CD",X"AB",X"1C",X"CD",X"82",X"1D", + X"CD",X"59",X"1E",X"3A",X"04",X"4E",X"FE",X"03",X"C0",X"CD",X"84",X"13",X"CD",X"69",X"20",X"CD", + X"8C",X"20",X"CD",X"AF",X"20",X"C9",X"3A",X"AB",X"4D",X"A7",X"C8",X"3D",X"20",X"08",X"32",X"AB", + X"4D",X"3C",X"32",X"AC",X"4D",X"C9",X"3D",X"20",X"08",X"32",X"AB",X"4D",X"3C",X"32",X"AD",X"4D", + X"C9",X"3D",X"20",X"08",X"32",X"AB",X"4D",X"3C",X"32",X"AE",X"4D",X"C9",X"32",X"AF",X"4D",X"3D", + X"32",X"AB",X"4D",X"C9",X"3A",X"AC",X"4D",X"E7",X"0C",X"00",X"C0",X"10",X"D2",X"10",X"3A",X"AD", + X"4D",X"E7",X"0C",X"00",X"18",X"11",X"2A",X"11",X"3A",X"AE",X"4D",X"E7",X"0C",X"00",X"5C",X"11", + X"6E",X"11",X"8F",X"11",X"3A",X"AF",X"4D",X"E7",X"0C",X"00",X"C9",X"11",X"DB",X"11",X"FC",X"11", + X"CD",X"38",X"1C",X"2A",X"00",X"4D",X"11",X"64",X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AC",X"4D", + X"34",X"C9",X"DD",X"21",X"01",X"33",X"FD",X"21",X"00",X"4D",X"CD",X"00",X"20",X"22",X"00",X"4D", + X"3E",X"01",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3A",X"00",X"4D",X"FE",X"80",X"C0",X"21",X"2F", + X"2E",X"22",X"0A",X"4D",X"22",X"31",X"4D",X"AF",X"32",X"A0",X"4D",X"32",X"AC",X"4D",X"32",X"A7", + X"4D",X"DD",X"21",X"AC",X"4D",X"DD",X"B6",X"00",X"DD",X"B6",X"01",X"DD",X"B6",X"02",X"DD",X"B6", + X"03",X"C0",X"21",X"AC",X"4E",X"CB",X"B6",X"C9",X"CD",X"0F",X"1D",X"2A",X"02",X"4D",X"11",X"64", + X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AD",X"4D",X"34",X"C9",X"DD",X"21",X"01",X"33",X"FD",X"21", + X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"3E",X"01",X"32",X"29",X"4D",X"32",X"2D",X"4D", + X"3A",X"02",X"4D",X"FE",X"80",X"C0",X"21",X"2F",X"2E",X"22",X"0C",X"4D",X"22",X"33",X"4D",X"AF", + X"32",X"A1",X"4D",X"32",X"AD",X"4D",X"32",X"A8",X"4D",X"C3",X"01",X"11",X"CD",X"E6",X"1D",X"2A", + X"04",X"4D",X"11",X"64",X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AE",X"4D",X"34",X"C9",X"DD",X"21", + X"01",X"33",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"3E",X"01",X"32",X"2A", + X"4D",X"32",X"2E",X"4D",X"3A",X"04",X"4D",X"FE",X"80",X"C0",X"21",X"AE",X"4D",X"34",X"C9",X"DD", + X"21",X"03",X"33",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"3E",X"02",X"32", + X"2A",X"4D",X"32",X"2E",X"4D",X"3A",X"05",X"4D",X"FE",X"90",X"C0",X"21",X"2F",X"30",X"22",X"0E", + X"4D",X"22",X"35",X"4D",X"3E",X"01",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"AF",X"32",X"A2",X"4D", + X"32",X"AE",X"4D",X"32",X"A9",X"4D",X"C3",X"01",X"11",X"CD",X"BD",X"1E",X"2A",X"06",X"4D",X"11", + X"64",X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AF",X"4D",X"34",X"C9",X"DD",X"21",X"01",X"33",X"FD", + X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"3E",X"01",X"32",X"2B",X"4D",X"32",X"2F", + X"4D",X"3A",X"06",X"4D",X"FE",X"80",X"C0",X"21",X"AF",X"4D",X"34",X"C9",X"DD",X"21",X"FF",X"32", + X"FD",X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"AF",X"32",X"2B",X"4D",X"32",X"2F", + X"4D",X"3A",X"07",X"4D",X"FE",X"70",X"C0",X"21",X"2F",X"2C",X"22",X"10",X"4D",X"22",X"37",X"4D", + X"3E",X"01",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"AF",X"32",X"A3",X"4D",X"32",X"AF",X"4D",X"32", + X"AA",X"4D",X"C3",X"01",X"11",X"3A",X"D1",X"4D",X"E7",X"3F",X"12",X"0C",X"00",X"3F",X"12",X"21", + X"00",X"4C",X"3A",X"A4",X"4D",X"87",X"5F",X"16",X"00",X"19",X"3A",X"D1",X"4D",X"A7",X"20",X"35", + X"3A",X"D0",X"4D",X"06",X"27",X"80",X"47",X"3A",X"78",X"4E",X"A7",X"28",X"08",X"04",X"78",X"FE", + X"2C",X"20",X"02",X"06",X"1F",X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E",X"A1",X"28",X"04",X"CB", + X"F0",X"CB",X"F8",X"70",X"23",X"36",X"18",X"3E",X"00",X"32",X"0B",X"4C",X"F7",X"4A",X"03",X"00", + X"21",X"D1",X"4D",X"34",X"C9",X"36",X"20",X"3E",X"09",X"32",X"0B",X"4C",X"3A",X"A4",X"4D",X"32", + X"AB",X"4D",X"AF",X"32",X"A4",X"4D",X"32",X"D1",X"4D",X"21",X"AC",X"4E",X"CB",X"F6",X"C9",X"3A", + X"A5",X"4D",X"E7",X"0C",X"00",X"C5",X"12",X"C5",X"12",X"C5",X"12",X"C5",X"12",X"D9",X"12",X"07", + X"13",X"14",X"13",X"1C",X"13",X"24",X"13",X"2C",X"13",X"34",X"13",X"3C",X"13",X"44",X"13",X"4C", + X"13",X"54",X"13",X"61",X"13",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D",X"11",X"78",X"00",X"A7", + X"ED",X"52",X"C0",X"3E",X"05",X"32",X"A5",X"4D",X"C9",X"21",X"00",X"00",X"CD",X"85",X"26",X"3E", + X"34",X"11",X"B4",X"00",X"4F",X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"28",X"04",X"3E", + X"C0",X"B1",X"4F",X"79",X"32",X"0A",X"4C",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D",X"A7",X"ED", + X"52",X"C0",X"21",X"A5",X"4D",X"34",X"C9",X"21",X"BC",X"4E",X"CB",X"E6",X"3E",X"35",X"11",X"C3", + X"00",X"C3",X"E4",X"12",X"3E",X"36",X"11",X"D2",X"00",X"C3",X"E4",X"12",X"3E",X"37",X"11",X"E1", + X"00",X"C3",X"E4",X"12",X"3E",X"38",X"11",X"F0",X"00",X"C3",X"E4",X"12",X"3E",X"39",X"11",X"FF", + X"00",X"C3",X"E4",X"12",X"3E",X"3A",X"11",X"0E",X"01",X"C3",X"E4",X"12",X"3E",X"3B",X"11",X"1D", + X"01",X"C3",X"E4",X"12",X"3E",X"3C",X"11",X"2C",X"01",X"C3",X"E4",X"12",X"3E",X"3D",X"11",X"3B", + X"01",X"C3",X"E4",X"12",X"21",X"BC",X"4E",X"36",X"20",X"3E",X"3E",X"11",X"59",X"01",X"C3",X"E4", + X"12",X"3E",X"3F",X"32",X"0A",X"4C",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D",X"11",X"B8",X"01", + X"A7",X"ED",X"52",X"C0",X"21",X"14",X"4E",X"35",X"21",X"15",X"4E",X"35",X"CD",X"7C",X"26",X"21", + X"04",X"4E",X"34",X"C9",X"3A",X"A6",X"4D",X"A7",X"C8",X"DD",X"21",X"A7",X"4D",X"DD",X"7E",X"00", + X"DD",X"B6",X"01",X"DD",X"B6",X"02",X"DD",X"B6",X"03",X"CA",X"A6",X"13",X"2A",X"CB",X"4D",X"2B", + X"22",X"CB",X"4D",X"7C",X"B5",X"C0",X"21",X"0B",X"4C",X"36",X"09",X"3A",X"AC",X"4D",X"A7",X"C2", + X"B5",X"13",X"32",X"A7",X"4D",X"3A",X"AD",X"4D",X"A7",X"C2",X"BF",X"13",X"32",X"A8",X"4D",X"3A", + X"AE",X"4D",X"A7",X"C2",X"C9",X"13",X"32",X"A9",X"4D",X"3A",X"AF",X"4D",X"A7",X"C2",X"D3",X"13", + X"32",X"AA",X"4D",X"AF",X"32",X"CB",X"4D",X"32",X"CC",X"4D",X"32",X"A6",X"4D",X"32",X"C8",X"4D", + X"32",X"D0",X"4D",X"3A",X"78",X"4E",X"A7",X"28",X"04",X"AF",X"32",X"78",X"4E",X"0E",X"01",X"06", + X"01",X"CD",X"42",X"00",X"21",X"AC",X"4E",X"CB",X"AE",X"CB",X"BE",X"C9",X"21",X"9E",X"4D",X"3A", + X"0E",X"4E",X"BE",X"CA",X"0D",X"14",X"21",X"00",X"00",X"22",X"97",X"4D",X"C9",X"2A",X"97",X"4D", + X"23",X"22",X"97",X"4D",X"ED",X"5B",X"95",X"4D",X"A7",X"ED",X"52",X"C0",X"21",X"00",X"00",X"22", + X"97",X"4D",X"3A",X"A1",X"4D",X"A7",X"F5",X"CC",X"86",X"20",X"F1",X"C8",X"3A",X"A2",X"4D",X"A7", + X"F5",X"CC",X"A9",X"20",X"F1",X"C8",X"3A",X"A3",X"4D",X"A7",X"CC",X"D1",X"20",X"C9",X"3A",X"72", + X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"C8",X"47",X"DD",X"21",X"00",X"4C",X"1E",X"08",X"0E",X"08", + X"16",X"07",X"3A",X"00",X"4D",X"83",X"DD",X"77",X"13",X"3A",X"01",X"4D",X"2F",X"82",X"DD",X"77", + X"12",X"3A",X"02",X"4D",X"83",X"DD",X"77",X"15",X"3A",X"03",X"4D",X"2F",X"82",X"DD",X"77",X"14", + X"3A",X"04",X"4D",X"83",X"DD",X"77",X"17",X"3A",X"05",X"4D",X"2F",X"81",X"DD",X"77",X"16",X"3A", + X"06",X"4D",X"83",X"DD",X"77",X"19",X"3A",X"07",X"4D",X"2F",X"81",X"DD",X"77",X"18",X"3A",X"08", + X"4D",X"83",X"DD",X"77",X"1B",X"3A",X"09",X"4D",X"2F",X"81",X"DD",X"77",X"1A",X"3A",X"D2",X"4D", + X"83",X"DD",X"77",X"1D",X"3A",X"D3",X"4D",X"2F",X"81",X"DD",X"77",X"1C",X"C3",X"1D",X"15",X"3A", + X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"C0",X"47",X"1E",X"09",X"0E",X"07",X"16",X"06",X"DD", + X"21",X"00",X"4C",X"3A",X"00",X"4D",X"2F",X"83",X"DD",X"77",X"13",X"3A",X"01",X"4D",X"82",X"DD", + X"77",X"12",X"3A",X"02",X"4D",X"2F",X"83",X"DD",X"77",X"15",X"3A",X"03",X"4D",X"82",X"DD",X"77", + X"14",X"3A",X"04",X"4D",X"2F",X"83",X"DD",X"77",X"17",X"3A",X"05",X"4D",X"81",X"DD",X"77",X"16", + X"3A",X"06",X"4D",X"2F",X"83",X"DD",X"77",X"19",X"3A",X"07",X"4D",X"81",X"DD",X"77",X"18",X"3A", + X"08",X"4D",X"2F",X"83",X"DD",X"77",X"1B",X"3A",X"09",X"4D",X"81",X"DD",X"77",X"1A",X"3A",X"D2", + X"4D",X"2F",X"83",X"DD",X"77",X"1D",X"3A",X"D3",X"4D",X"81",X"DD",X"77",X"1C",X"3A",X"A5",X"4D", + X"A7",X"C2",X"6A",X"15",X"3A",X"A4",X"4D",X"A7",X"C2",X"D3",X"15",X"21",X"3B",X"15",X"E5",X"3A", + X"30",X"4D",X"E7",X"AB",X"16",X"D0",X"16",X"F5",X"16",X"16",X"17",X"78",X"A7",X"28",X"2B",X"0E", + X"C0",X"3A",X"0A",X"4C",X"57",X"A1",X"20",X"05",X"7A",X"B1",X"C3",X"67",X"15",X"3A",X"30",X"4D", + X"FE",X"02",X"20",X"09",X"CB",X"7A",X"28",X"12",X"7A",X"A9",X"C3",X"67",X"15",X"FE",X"03",X"20", + X"09",X"CB",X"72",X"28",X"05",X"7A",X"A9",X"32",X"0A",X"4C",X"21",X"C0",X"4D",X"56",X"3E",X"1C", + X"82",X"DD",X"77",X"02",X"DD",X"77",X"04",X"DD",X"77",X"06",X"DD",X"77",X"08",X"0E",X"20",X"3A", + X"AC",X"4D",X"A7",X"20",X"06",X"3A",X"A7",X"4D",X"A7",X"20",X"09",X"3A",X"2C",X"4D",X"87",X"82", + X"81",X"DD",X"77",X"02",X"3A",X"AD",X"4D",X"A7",X"20",X"06",X"3A",X"A8",X"4D",X"A7",X"20",X"09", + X"3A",X"2D",X"4D",X"87",X"82",X"81",X"DD",X"77",X"04",X"3A",X"AE",X"4D",X"A7",X"20",X"06",X"3A", + X"A9",X"4D",X"A7",X"20",X"09",X"3A",X"2E",X"4D",X"87",X"82",X"81",X"DD",X"77",X"06",X"3A",X"AF", + X"4D",X"A7",X"20",X"06",X"3A",X"AA",X"4D",X"A7",X"20",X"09",X"3A",X"2F",X"4D",X"87",X"82",X"81", + X"DD",X"77",X"08",X"CD",X"05",X"16",X"CD",X"4C",X"16",X"CD",X"71",X"16",X"78",X"A7",X"C8",X"0E", + X"C0",X"3A",X"02",X"4C",X"B1",X"32",X"02",X"4C",X"3A",X"04",X"4C",X"B1",X"32",X"04",X"4C",X"3A", + X"06",X"4C",X"B1",X"32",X"06",X"4C",X"3A",X"08",X"4C",X"B1",X"32",X"08",X"4C",X"3A",X"0C",X"4C", + X"B1",X"32",X"0C",X"4C",X"C9",X"3A",X"06",X"4E",X"D6",X"05",X"D8",X"3A",X"09",X"4D",X"E6",X"0F", + X"FE",X"0C",X"38",X"04",X"16",X"18",X"18",X"12",X"FE",X"08",X"38",X"04",X"16",X"14",X"18",X"0A", + X"FE",X"04",X"38",X"04",X"16",X"10",X"18",X"02",X"16",X"14",X"DD",X"72",X"04",X"14",X"DD",X"72", + X"06",X"14",X"DD",X"72",X"08",X"14",X"DD",X"72",X"0C",X"DD",X"36",X"0A",X"3F",X"16",X"16",X"DD", + X"72",X"05",X"DD",X"72",X"07",X"DD",X"72",X"09",X"DD",X"72",X"0D",X"C9",X"3A",X"07",X"4E",X"A7", + X"C8",X"57",X"3A",X"3A",X"4D",X"D6",X"3D",X"20",X"04",X"DD",X"36",X"0B",X"00",X"7A",X"FE",X"0A", + X"D8",X"DD",X"36",X"02",X"32",X"DD",X"36",X"03",X"1D",X"FE",X"0C",X"D8",X"DD",X"36",X"02",X"33", + X"C9",X"3A",X"08",X"4E",X"A7",X"C8",X"57",X"3A",X"3A",X"4D",X"D6",X"3D",X"20",X"04",X"DD",X"36", + X"0B",X"00",X"7A",X"FE",X"01",X"D8",X"3A",X"C0",X"4D",X"1E",X"08",X"83",X"DD",X"77",X"02",X"7A", + X"FE",X"03",X"D8",X"3A",X"01",X"4D",X"E6",X"08",X"0F",X"0F",X"0F",X"1E",X"0A",X"83",X"DD",X"77", + X"0C",X"3C",X"3C",X"DD",X"77",X"02",X"DD",X"36",X"0D",X"1E",X"C9",X"3A",X"09",X"4D",X"E6",X"07", + X"FE",X"06",X"38",X"05",X"DD",X"36",X"0A",X"30",X"C9",X"FE",X"04",X"38",X"05",X"DD",X"36",X"0A", + X"2E",X"C9",X"FE",X"02",X"38",X"05",X"DD",X"36",X"0A",X"2C",X"C9",X"DD",X"36",X"0A",X"2E",X"C9", + X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"06",X"38",X"05",X"DD",X"36",X"0A",X"2F",X"C9",X"FE",X"04", + X"38",X"05",X"DD",X"36",X"0A",X"2D",X"C9",X"FE",X"02",X"38",X"05",X"DD",X"36",X"0A",X"2F",X"C9", + X"DD",X"36",X"0A",X"30",X"C9",X"3A",X"09",X"4D",X"E6",X"07",X"FE",X"06",X"38",X"08",X"1E",X"2E", + X"CB",X"FB",X"DD",X"73",X"0A",X"C9",X"FE",X"04",X"38",X"04",X"1E",X"2C",X"18",X"F2",X"FE",X"02", + X"30",X"EC",X"1E",X"30",X"18",X"EA",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"06",X"38",X"05",X"DD", + X"36",X"0A",X"30",X"C9",X"FE",X"04",X"38",X"08",X"1E",X"2F",X"CB",X"F3",X"DD",X"73",X"0A",X"C9", + X"FE",X"02",X"38",X"04",X"1E",X"2D",X"18",X"F2",X"1E",X"2F",X"18",X"EE",X"06",X"04",X"ED",X"5B", + X"39",X"4D",X"3A",X"AF",X"4D",X"A7",X"20",X"09",X"2A",X"37",X"4D",X"A7",X"ED",X"52",X"CA",X"82", + X"17",X"05",X"3A",X"AE",X"4D",X"A7",X"20",X"09",X"2A",X"35",X"4D",X"A7",X"ED",X"52",X"CA",X"82", + X"17",X"05",X"3A",X"AD",X"4D",X"A7",X"20",X"09",X"2A",X"33",X"4D",X"A7",X"ED",X"52",X"CA",X"82", + X"17",X"05",X"3A",X"AC",X"4D",X"A7",X"20",X"09",X"2A",X"31",X"4D",X"A7",X"ED",X"52",X"CA",X"82", + X"17",X"05",X"78",X"32",X"A4",X"4D",X"32",X"A5",X"4D",X"A7",X"C8",X"21",X"A6",X"4D",X"5F",X"16", + X"00",X"19",X"7E",X"A7",X"C8",X"AF",X"32",X"A5",X"4D",X"21",X"D0",X"4D",X"34",X"46",X"04",X"C3", + X"DC",X"0F",X"CD",X"61",X"2A",X"21",X"BC",X"4E",X"CB",X"DE",X"C9",X"3A",X"A4",X"4D",X"A7",X"C0", + X"3A",X"A6",X"4D",X"A7",X"C8",X"0E",X"04",X"06",X"04",X"DD",X"21",X"08",X"4D",X"3A",X"AF",X"4D", + X"A7",X"20",X"13",X"3A",X"06",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"07",X"4D",X"DD", + X"96",X"01",X"B9",X"DA",X"82",X"17",X"05",X"3A",X"AE",X"4D",X"A7",X"20",X"13",X"3A",X"04",X"4D", + X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"05",X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"82",X"17", + X"05",X"3A",X"AD",X"4D",X"A7",X"20",X"13",X"3A",X"02",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A", + X"3A",X"03",X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"82",X"17",X"05",X"3A",X"AC",X"4D",X"A7",X"20", + X"13",X"3A",X"00",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"01",X"4D",X"DD",X"96",X"01", + X"B9",X"DA",X"82",X"17",X"05",X"C3",X"82",X"17",X"21",X"9D",X"4D",X"3E",X"FF",X"BE",X"CA",X"33", + X"18",X"35",X"C9",X"3A",X"A6",X"4D",X"A7",X"CA",X"51",X"18",X"2A",X"4C",X"4D",X"29",X"22",X"4C", + X"4D",X"2A",X"4A",X"4D",X"ED",X"6A",X"22",X"4A",X"4D",X"D0",X"21",X"4C",X"4D",X"34",X"C3",X"65", + X"18",X"2A",X"48",X"4D",X"29",X"22",X"48",X"4D",X"2A",X"46",X"4D",X"ED",X"6A",X"22",X"46",X"4D", + X"D0",X"21",X"48",X"4D",X"34",X"3A",X"0E",X"4E",X"32",X"9E",X"4D",X"3A",X"72",X"4E",X"4F",X"3A", + X"09",X"4E",X"A1",X"4F",X"21",X"3A",X"4D",X"7E",X"06",X"21",X"90",X"38",X"09",X"7E",X"06",X"3B", + X"90",X"30",X"03",X"C3",X"CD",X"18",X"3E",X"01",X"32",X"BF",X"4D",X"3A",X"00",X"4E",X"FE",X"01", + X"CA",X"3E",X"1A",X"3A",X"04",X"4E",X"FE",X"10",X"D2",X"3E",X"1A",X"79",X"A7",X"28",X"06",X"3A", + X"40",X"50",X"C3",X"A8",X"18",X"3A",X"00",X"50",X"CB",X"4F",X"C2",X"BB",X"18",X"2A",X"03",X"33", + X"3E",X"02",X"32",X"30",X"4D",X"22",X"1C",X"4D",X"C3",X"72",X"19",X"CB",X"57",X"C2",X"72",X"19", + X"2A",X"FF",X"32",X"AF",X"32",X"30",X"4D",X"22",X"1C",X"4D",X"C3",X"72",X"19",X"3A",X"00",X"4E", + X"FE",X"01",X"CA",X"3E",X"1A",X"3A",X"04",X"4E",X"FE",X"10",X"D2",X"3E",X"1A",X"79",X"A7",X"28", + X"06",X"3A",X"40",X"50",X"C3",X"EA",X"18",X"3A",X"00",X"50",X"CB",X"4F",X"CA",X"29",X"1B",X"CB", + X"57",X"CA",X"39",X"1B",X"CB",X"47",X"CA",X"48",X"1B",X"CB",X"5F",X"CA",X"58",X"1B",X"2A",X"1C", + X"4D",X"22",X"26",X"4D",X"06",X"01",X"DD",X"21",X"26",X"4D",X"FD",X"21",X"39",X"4D",X"CD",X"0F", + X"20",X"E6",X"C0",X"D6",X"C0",X"20",X"4B",X"05",X"C2",X"38",X"19",X"3A",X"30",X"4D",X"0F",X"DA", + X"2D",X"19",X"3A",X"09",X"4D",X"E6",X"07",X"FE",X"04",X"C8",X"C3",X"62",X"19",X"3A",X"08",X"4D", + X"E6",X"07",X"FE",X"04",X"C8",X"C3",X"62",X"19",X"DD",X"21",X"1C",X"4D",X"CD",X"0F",X"20",X"E6", + X"C0",X"D6",X"C0",X"20",X"2D",X"3A",X"30",X"4D",X"0F",X"DA",X"57",X"19",X"3A",X"09",X"4D",X"E6", + X"07",X"FE",X"04",X"C8",X"C3",X"72",X"19",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"04",X"C8",X"C3", + X"72",X"19",X"2A",X"26",X"4D",X"22",X"1C",X"4D",X"05",X"CA",X"72",X"19",X"3A",X"3C",X"4D",X"32", + X"30",X"4D",X"DD",X"21",X"1C",X"4D",X"FD",X"21",X"08",X"4D",X"CD",X"00",X"20",X"3A",X"30",X"4D", + X"0F",X"DA",X"97",X"19",X"7D",X"E6",X"07",X"FE",X"04",X"CA",X"A7",X"19",X"DA",X"93",X"19",X"2D", + X"C3",X"A7",X"19",X"2C",X"C3",X"A7",X"19",X"7C",X"E6",X"07",X"FE",X"04",X"CA",X"A7",X"19",X"DA", + X"A6",X"19",X"25",X"C3",X"A7",X"19",X"24",X"22",X"08",X"4D",X"CD",X"18",X"20",X"22",X"39",X"4D", + X"DD",X"21",X"BF",X"4D",X"DD",X"7E",X"00",X"DD",X"36",X"00",X"00",X"A7",X"C0",X"3A",X"D2",X"4D", + X"A7",X"28",X"2F",X"3A",X"D4",X"4D",X"A7",X"28",X"29",X"2A",X"08",X"4D",X"11",X"94",X"80",X"A7", + X"ED",X"52",X"20",X"1E",X"06",X"19",X"4F",X"CD",X"42",X"00",X"0E",X"15",X"81",X"4F",X"06",X"1C", + X"CD",X"42",X"00",X"CD",X"04",X"10",X"CD",X"80",X"0F",X"F7",X"54",X"05",X"00",X"21",X"BC",X"4E", + X"CB",X"D6",X"3E",X"FF",X"32",X"9D",X"4D",X"2A",X"39",X"4D",X"CD",X"65",X"00",X"7E",X"FE",X"10", + X"28",X"03",X"FE",X"14",X"C0",X"DD",X"21",X"0E",X"4E",X"DD",X"34",X"00",X"E6",X"0F",X"CB",X"3F", + X"06",X"40",X"70",X"06",X"19",X"4F",X"CB",X"39",X"CD",X"42",X"00",X"3C",X"FE",X"01",X"CA",X"22", + X"1A",X"87",X"32",X"9D",X"4D",X"CD",X"68",X"1B",X"CD",X"8F",X"1A",X"21",X"BC",X"4E",X"3A",X"0E", + X"4E",X"0F",X"38",X"05",X"CB",X"C6",X"CB",X"8E",X"C9",X"CB",X"86",X"CB",X"CE",X"C9",X"21",X"1C", + X"4D",X"7E",X"A7",X"CA",X"53",X"1A",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"5D",X"1A", + X"C3",X"81",X"1A",X"3A",X"09",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"81",X"1A",X"3E",X"05",X"CD", + X"30",X"1F",X"38",X"03",X"EF",X"17",X"00",X"DD",X"21",X"26",X"4D",X"FD",X"21",X"12",X"4D",X"CD", + X"00",X"20",X"22",X"12",X"4D",X"2A",X"26",X"4D",X"22",X"1C",X"4D",X"3A",X"3C",X"4D",X"32",X"30", + X"4D",X"DD",X"21",X"1C",X"4D",X"FD",X"21",X"08",X"4D",X"CD",X"00",X"20",X"C3",X"A7",X"19",X"3A", + X"9D",X"4D",X"FE",X"06",X"C0",X"2A",X"BD",X"4D",X"22",X"CB",X"4D",X"3E",X"01",X"32",X"A6",X"4D", + X"32",X"A7",X"4D",X"32",X"A8",X"4D",X"32",X"A9",X"4D",X"32",X"AA",X"4D",X"32",X"B1",X"4D",X"32", + X"B2",X"4D",X"32",X"B3",X"4D",X"32",X"B4",X"4D",X"32",X"B5",X"4D",X"AF",X"32",X"78",X"4E",X"32", + X"C8",X"4D",X"32",X"D0",X"4D",X"DD",X"21",X"00",X"4C",X"DD",X"36",X"02",X"1C",X"DD",X"36",X"04", + X"1C",X"DD",X"36",X"06",X"1C",X"DD",X"36",X"08",X"1C",X"DD",X"36",X"03",X"11",X"DD",X"36",X"05", + X"11",X"DD",X"36",X"07",X"11",X"DD",X"36",X"09",X"11",X"3A",X"00",X"4E",X"FE",X"03",X"20",X"31", + X"3A",X"8B",X"4C",X"4F",X"E6",X"40",X"20",X"16",X"79",X"E6",X"03",X"5F",X"16",X"00",X"21",X"A7", + X"4D",X"19",X"36",X"00",X"87",X"5F",X"21",X"03",X"4C",X"19",X"1E",X"01",X"83",X"77",X"3A",X"13", + X"4E",X"FE",X"02",X"38",X"0C",X"79",X"E6",X"10",X"20",X"07",X"0E",X"03",X"06",X"01",X"CD",X"42", + X"00",X"21",X"AC",X"4E",X"CB",X"EE",X"CB",X"BE",X"C9",X"2A",X"03",X"33",X"3E",X"02",X"32",X"3C", + X"4D",X"22",X"26",X"4D",X"06",X"00",X"C3",X"06",X"19",X"2A",X"FF",X"32",X"AF",X"32",X"3C",X"4D", + X"22",X"26",X"4D",X"06",X"00",X"C3",X"06",X"19",X"2A",X"05",X"33",X"3E",X"03",X"32",X"3C",X"4D", + X"22",X"26",X"4D",X"06",X"00",X"C3",X"06",X"19",X"2A",X"01",X"33",X"3E",X"01",X"32",X"3C",X"4D", + X"22",X"26",X"4D",X"06",X"00",X"C3",X"06",X"19",X"3A",X"12",X"4E",X"A7",X"CA",X"74",X"1B",X"21", + X"9F",X"4D",X"34",X"C9",X"3A",X"A3",X"4D",X"A7",X"C0",X"3A",X"A2",X"4D",X"A7",X"CA",X"85",X"1B", + X"21",X"11",X"4E",X"34",X"C9",X"3A",X"A1",X"4D",X"A7",X"CA",X"91",X"1B",X"21",X"10",X"4E",X"34", + X"C9",X"21",X"0F",X"4E",X"34",X"C9",X"3A",X"A0",X"4D",X"A7",X"C8",X"3A",X"AC",X"4D",X"A7",X"C0", + X"CD",X"D7",X"20",X"2A",X"31",X"4D",X"01",X"99",X"4D",X"CD",X"5A",X"20",X"3A",X"99",X"4D",X"A7", + X"CA",X"CA",X"1B",X"2A",X"60",X"4D",X"29",X"22",X"60",X"4D",X"2A",X"5E",X"4D",X"ED",X"6A",X"22", + X"5E",X"4D",X"D0",X"21",X"60",X"4D",X"34",X"C3",X"38",X"1C",X"3A",X"A7",X"4D",X"A7",X"CA",X"E8", + X"1B",X"2A",X"5C",X"4D",X"29",X"22",X"5C",X"4D",X"2A",X"5A",X"4D",X"ED",X"6A",X"22",X"5A",X"4D", + X"D0",X"21",X"5C",X"4D",X"34",X"C3",X"38",X"1C",X"3A",X"B7",X"4D",X"A7",X"CA",X"06",X"1C",X"2A", + X"50",X"4D",X"29",X"22",X"50",X"4D",X"2A",X"4E",X"4D",X"ED",X"6A",X"22",X"4E",X"4D",X"D0",X"21", + X"50",X"4D",X"34",X"C3",X"38",X"1C",X"3A",X"B6",X"4D",X"A7",X"CA",X"24",X"1C",X"2A",X"54",X"4D", + X"29",X"22",X"54",X"4D",X"2A",X"52",X"4D",X"ED",X"6A",X"22",X"52",X"4D",X"D0",X"21",X"54",X"4D", + X"34",X"C3",X"38",X"1C",X"2A",X"58",X"4D",X"29",X"22",X"58",X"4D",X"2A",X"56",X"4D",X"ED",X"6A", + X"22",X"56",X"4D",X"D0",X"21",X"58",X"4D",X"34",X"21",X"14",X"4D",X"7E",X"A7",X"CA",X"4D",X"1C", + X"3A",X"00",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"57",X"1C",X"C3",X"96",X"1C",X"3A",X"01",X"4D", + X"E6",X"07",X"FE",X"04",X"C2",X"96",X"1C",X"3E",X"01",X"CD",X"30",X"1F",X"38",X"1B",X"3A",X"A7", + X"4D",X"A7",X"CA",X"6B",X"1C",X"EF",X"0C",X"00",X"C3",X"79",X"1C",X"2A",X"0A",X"4D",X"CD",X"52", + X"20",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"08",X"00",X"CD",X"5E",X"1F",X"DD",X"21",X"1E",X"4D", + X"FD",X"21",X"0A",X"4D",X"CD",X"00",X"20",X"22",X"0A",X"4D",X"2A",X"1E",X"4D",X"22",X"14",X"4D", + X"3A",X"2C",X"4D",X"32",X"28",X"4D",X"DD",X"21",X"14",X"4D",X"FD",X"21",X"00",X"4D",X"CD",X"00", + X"20",X"22",X"00",X"4D",X"CD",X"18",X"20",X"22",X"31",X"4D",X"C9",X"3A",X"A1",X"4D",X"FE",X"01", + X"C0",X"3A",X"AD",X"4D",X"A7",X"C0",X"2A",X"33",X"4D",X"01",X"9A",X"4D",X"CD",X"5A",X"20",X"3A", + X"9A",X"4D",X"A7",X"CA",X"DD",X"1C",X"2A",X"6C",X"4D",X"29",X"22",X"6C",X"4D",X"2A",X"6A",X"4D", + X"ED",X"6A",X"22",X"6A",X"4D",X"D0",X"21",X"6C",X"4D",X"34",X"C3",X"0F",X"1D",X"3A",X"A8",X"4D", + X"A7",X"CA",X"FB",X"1C",X"2A",X"68",X"4D",X"29",X"22",X"68",X"4D",X"2A",X"66",X"4D",X"ED",X"6A", + X"22",X"66",X"4D",X"D0",X"21",X"68",X"4D",X"34",X"C3",X"0F",X"1D",X"2A",X"64",X"4D",X"29",X"22", + X"64",X"4D",X"2A",X"62",X"4D",X"ED",X"6A",X"22",X"62",X"4D",X"D0",X"21",X"64",X"4D",X"34",X"21", + X"16",X"4D",X"7E",X"A7",X"CA",X"24",X"1D",X"3A",X"02",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"2E", + X"1D",X"C3",X"6D",X"1D",X"3A",X"03",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"6D",X"1D",X"3E",X"02", + X"CD",X"30",X"1F",X"38",X"1B",X"3A",X"A8",X"4D",X"A7",X"CA",X"42",X"1D",X"EF",X"0D",X"00",X"C3", + X"50",X"1D",X"2A",X"0C",X"4D",X"CD",X"52",X"20",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"09",X"00", + X"CD",X"85",X"1F",X"DD",X"21",X"20",X"4D",X"FD",X"21",X"0C",X"4D",X"CD",X"00",X"20",X"22",X"0C", + X"4D",X"2A",X"20",X"4D",X"22",X"16",X"4D",X"3A",X"2D",X"4D",X"32",X"29",X"4D",X"DD",X"21",X"16", + X"4D",X"FD",X"21",X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"CD",X"18",X"20",X"22",X"33", + X"4D",X"C9",X"3A",X"A2",X"4D",X"FE",X"01",X"C0",X"3A",X"AE",X"4D",X"A7",X"C0",X"2A",X"35",X"4D", + X"01",X"9B",X"4D",X"CD",X"5A",X"20",X"3A",X"9B",X"4D",X"A7",X"CA",X"B4",X"1D",X"2A",X"78",X"4D", + X"29",X"22",X"78",X"4D",X"2A",X"76",X"4D",X"ED",X"6A",X"22",X"76",X"4D",X"D0",X"21",X"78",X"4D", + X"34",X"C3",X"E6",X"1D",X"3A",X"A9",X"4D",X"A7",X"CA",X"D2",X"1D",X"2A",X"74",X"4D",X"29",X"22", + X"74",X"4D",X"2A",X"72",X"4D",X"ED",X"6A",X"22",X"72",X"4D",X"D0",X"21",X"74",X"4D",X"34",X"C3", + X"E6",X"1D",X"2A",X"70",X"4D",X"29",X"22",X"70",X"4D",X"2A",X"6E",X"4D",X"ED",X"6A",X"22",X"6E", + X"4D",X"D0",X"21",X"70",X"4D",X"34",X"21",X"18",X"4D",X"7E",X"A7",X"CA",X"FB",X"1D",X"3A",X"04", + X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"05",X"1E",X"C3",X"44",X"1E",X"3A",X"05",X"4D",X"E6",X"07", + X"FE",X"04",X"C2",X"44",X"1E",X"3E",X"03",X"CD",X"30",X"1F",X"38",X"1B",X"3A",X"A9",X"4D",X"A7", + X"CA",X"19",X"1E",X"EF",X"0E",X"00",X"C3",X"27",X"1E",X"2A",X"0E",X"4D",X"CD",X"52",X"20",X"7E", + X"FE",X"1A",X"28",X"03",X"EF",X"0A",X"00",X"CD",X"AC",X"1F",X"DD",X"21",X"22",X"4D",X"FD",X"21", + X"0E",X"4D",X"CD",X"00",X"20",X"22",X"0E",X"4D",X"2A",X"22",X"4D",X"22",X"18",X"4D",X"3A",X"2E", + X"4D",X"32",X"2A",X"4D",X"DD",X"21",X"18",X"4D",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22", + X"04",X"4D",X"CD",X"18",X"20",X"22",X"35",X"4D",X"C9",X"3A",X"A3",X"4D",X"FE",X"01",X"C0",X"3A", + X"AF",X"4D",X"A7",X"C0",X"2A",X"37",X"4D",X"01",X"9C",X"4D",X"CD",X"5A",X"20",X"3A",X"9C",X"4D", + X"A7",X"CA",X"8B",X"1E",X"2A",X"84",X"4D",X"29",X"22",X"84",X"4D",X"2A",X"82",X"4D",X"ED",X"6A", + X"22",X"82",X"4D",X"D0",X"21",X"84",X"4D",X"34",X"C3",X"BD",X"1E",X"3A",X"AA",X"4D",X"A7",X"CA", + X"A9",X"1E",X"2A",X"80",X"4D",X"29",X"22",X"80",X"4D",X"2A",X"7E",X"4D",X"ED",X"6A",X"22",X"7E", + X"4D",X"D0",X"21",X"80",X"4D",X"34",X"C3",X"BD",X"1E",X"2A",X"7C",X"4D",X"29",X"22",X"7C",X"4D", + X"2A",X"7A",X"4D",X"ED",X"6A",X"22",X"7A",X"4D",X"D0",X"21",X"7C",X"4D",X"34",X"21",X"1A",X"4D", + X"7E",X"A7",X"CA",X"D2",X"1E",X"3A",X"06",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"DC",X"1E",X"C3", + X"1B",X"1F",X"3A",X"07",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"1B",X"1F",X"3E",X"04",X"CD",X"30", + X"1F",X"38",X"1B",X"3A",X"AA",X"4D",X"A7",X"CA",X"F0",X"1E",X"EF",X"0F",X"00",X"C3",X"FE",X"1E", + X"2A",X"10",X"4D",X"CD",X"52",X"20",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"0B",X"00",X"CD",X"D3", + X"1F",X"DD",X"21",X"24",X"4D",X"FD",X"21",X"10",X"4D",X"CD",X"00",X"20",X"22",X"10",X"4D",X"2A", + X"24",X"4D",X"22",X"1A",X"4D",X"3A",X"2F",X"4D",X"32",X"2B",X"4D",X"DD",X"21",X"1A",X"4D",X"FD", + X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"CD",X"18",X"20",X"22",X"37",X"4D",X"C9", + X"87",X"4F",X"06",X"00",X"21",X"09",X"4D",X"09",X"7E",X"FE",X"1D",X"C2",X"43",X"1F",X"36",X"3D", + X"C3",X"5C",X"1F",X"FE",X"3E",X"C2",X"4D",X"1F",X"36",X"1E",X"C3",X"5C",X"1F",X"06",X"21",X"90", + X"DA",X"5C",X"1F",X"7E",X"06",X"3B",X"90",X"D2",X"5C",X"1F",X"A7",X"C9",X"37",X"C9",X"3A",X"B1", + X"4D",X"A7",X"C8",X"AF",X"32",X"B1",X"4D",X"21",X"FF",X"32",X"3A",X"28",X"4D",X"EE",X"02",X"32", + X"2C",X"4D",X"47",X"DF",X"22",X"1E",X"4D",X"3A",X"02",X"4E",X"FE",X"22",X"C0",X"22",X"14",X"4D", + X"78",X"32",X"28",X"4D",X"C9",X"3A",X"B2",X"4D",X"A7",X"C8",X"AF",X"32",X"B2",X"4D",X"21",X"FF", + X"32",X"3A",X"29",X"4D",X"EE",X"02",X"32",X"2D",X"4D",X"47",X"DF",X"22",X"20",X"4D",X"3A",X"02", + X"4E",X"FE",X"22",X"C0",X"22",X"16",X"4D",X"78",X"32",X"29",X"4D",X"C9",X"3A",X"B3",X"4D",X"A7", + X"C8",X"AF",X"32",X"B3",X"4D",X"21",X"FF",X"32",X"3A",X"2A",X"4D",X"EE",X"02",X"32",X"2E",X"4D", + X"47",X"DF",X"22",X"22",X"4D",X"3A",X"02",X"4E",X"FE",X"22",X"C0",X"22",X"18",X"4D",X"78",X"32", + X"2A",X"4D",X"C9",X"3A",X"B4",X"4D",X"A7",X"C8",X"AF",X"32",X"B4",X"4D",X"21",X"FF",X"32",X"3A", + X"2B",X"4D",X"EE",X"02",X"32",X"2F",X"4D",X"47",X"DF",X"22",X"24",X"4D",X"3A",X"02",X"4E",X"FE", + X"22",X"C0",X"22",X"1A",X"4D",X"78",X"32",X"2B",X"4D",X"C9",X"FF",X"FF",X"FF",X"FF",X"C3",X"1D", + X"FD",X"7E",X"00",X"DD",X"86",X"00",X"6F",X"FD",X"7E",X"01",X"DD",X"86",X"01",X"67",X"C9",X"CD", + X"00",X"20",X"CD",X"65",X"00",X"7E",X"A7",X"C9",X"7D",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6", + X"20",X"6F",X"7C",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6",X"1E",X"67",X"C9",X"F5",X"C5",X"7D", + X"D6",X"20",X"6F",X"7C",X"D6",X"20",X"67",X"06",X"00",X"CB",X"24",X"CB",X"24",X"CB",X"24",X"CB", + X"24",X"CB",X"10",X"CB",X"24",X"CB",X"10",X"4C",X"26",X"00",X"09",X"01",X"40",X"40",X"09",X"C1", + X"F1",X"C9",X"CD",X"65",X"00",X"11",X"00",X"04",X"19",X"C9",X"CD",X"52",X"20",X"7E",X"FE",X"1B", + X"20",X"04",X"3E",X"01",X"02",X"C9",X"AF",X"02",X"C9",X"3A",X"A1",X"4D",X"A7",X"C0",X"3A",X"12", + X"4E",X"A7",X"CA",X"7E",X"20",X"3A",X"9F",X"4D",X"FE",X"07",X"C0",X"C3",X"86",X"20",X"21",X"B8", + X"4D",X"3A",X"0F",X"4E",X"BE",X"D8",X"3E",X"02",X"32",X"A1",X"4D",X"C9",X"3A",X"A2",X"4D",X"A7", + X"C0",X"3A",X"12",X"4E",X"A7",X"CA",X"A1",X"20",X"3A",X"9F",X"4D",X"FE",X"11",X"C0",X"C3",X"A9", + X"20",X"21",X"B9",X"4D",X"3A",X"10",X"4E",X"BE",X"D8",X"3E",X"03",X"32",X"A2",X"4D",X"C9",X"3A", + X"A3",X"4D",X"A7",X"C0",X"3A",X"12",X"4E",X"A7",X"CA",X"C9",X"20",X"3A",X"9F",X"4D",X"FE",X"20", + X"C0",X"AF",X"32",X"12",X"4E",X"32",X"9F",X"4D",X"C9",X"21",X"BA",X"4D",X"3A",X"11",X"4E",X"BE", + X"D8",X"3E",X"03",X"32",X"A3",X"4D",X"C9",X"3A",X"A3",X"4D",X"A7",X"C8",X"21",X"0E",X"4E",X"3A", + X"B6",X"4D",X"A7",X"C2",X"F4",X"20",X"3E",X"F4",X"96",X"47",X"3A",X"BB",X"4D",X"90",X"D8",X"3E", + X"01",X"32",X"B6",X"4D",X"3A",X"B7",X"4D",X"A7",X"C0",X"3E",X"F4",X"96",X"47",X"3A",X"BC",X"4D", + X"90",X"D8",X"3E",X"01",X"32",X"B7",X"4D",X"C9",X"3A",X"06",X"4E",X"E7",X"1A",X"21",X"40",X"21", + X"4B",X"21",X"0C",X"00",X"70",X"21",X"7B",X"21",X"86",X"21",X"3A",X"3A",X"4D",X"D6",X"21",X"20", + X"0F",X"3C",X"32",X"A0",X"4D",X"32",X"B7",X"4D",X"CD",X"06",X"05",X"21",X"06",X"4E",X"34",X"C9", + X"CD",X"28",X"18",X"CD",X"28",X"18",X"CD",X"96",X"1B",X"CD",X"96",X"1B",X"CD",X"4E",X"0E",X"C9", + X"3A",X"3A",X"4D",X"D6",X"1E",X"C2",X"30",X"21",X"C3",X"2B",X"21",X"3A",X"32",X"4D",X"D6",X"1E", + X"C2",X"36",X"21",X"CD",X"95",X"1A",X"AF",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"CD",X"A5",X"05", + X"22",X"1C",X"4D",X"3A",X"3C",X"4D",X"32",X"30",X"4D",X"F7",X"45",X"07",X"00",X"C3",X"2B",X"21", + X"3A",X"32",X"4D",X"D6",X"2F",X"C2",X"36",X"21",X"C3",X"2B",X"21",X"3A",X"32",X"4D",X"D6",X"3D", + X"C2",X"30",X"21",X"C3",X"2B",X"21",X"CD",X"28",X"18",X"CD",X"28",X"18",X"3A",X"3A",X"4D",X"D6", + X"3D",X"C0",X"32",X"06",X"4E",X"F7",X"45",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"3A",X"07", + X"4E",X"FD",X"21",X"D2",X"41",X"E7",X"C2",X"21",X"0C",X"00",X"E1",X"21",X"F5",X"21",X"0C",X"22", + X"1E",X"22",X"44",X"22",X"5D",X"22",X"0C",X"00",X"6A",X"22",X"0C",X"00",X"86",X"22",X"0C",X"00", + X"8D",X"22",X"3E",X"01",X"32",X"D2",X"45",X"32",X"D3",X"45",X"32",X"F2",X"45",X"32",X"F3",X"45", + X"CD",X"06",X"05",X"FD",X"36",X"00",X"60",X"FD",X"36",X"01",X"61",X"F7",X"43",X"08",X"00",X"18", + X"0F",X"3A",X"3A",X"4D",X"D6",X"2C",X"C2",X"30",X"21",X"3C",X"32",X"A0",X"4D",X"32",X"B7",X"4D", + X"21",X"07",X"4E",X"34",X"C9",X"3A",X"01",X"4D",X"FE",X"77",X"28",X"05",X"FE",X"78",X"C2",X"30", + X"21",X"21",X"84",X"20",X"22",X"4E",X"4D",X"22",X"50",X"4D",X"18",X"E4",X"3A",X"01",X"4D",X"D6", + X"78",X"C2",X"37",X"22",X"FD",X"36",X"00",X"62",X"FD",X"36",X"01",X"63",X"18",X"D2",X"3A",X"01", + X"4D",X"D6",X"7B",X"20",X"12",X"FD",X"36",X"00",X"64",X"FD",X"36",X"01",X"65",X"FD",X"36",X"20", + X"66",X"FD",X"36",X"21",X"67",X"18",X"B9",X"CD",X"28",X"18",X"CD",X"28",X"18",X"CD",X"96",X"1B", + X"CD",X"4E",X"0E",X"C9",X"3A",X"01",X"4D",X"D6",X"7E",X"20",X"EC",X"FD",X"36",X"00",X"68",X"FD", + X"36",X"01",X"69",X"FD",X"36",X"20",X"6A",X"FD",X"36",X"21",X"6B",X"18",X"93",X"3A",X"01",X"4D", + X"D6",X"80",X"20",X"D3",X"F7",X"4F",X"08",X"00",X"18",X"86",X"21",X"01",X"4D",X"34",X"34",X"FD", + X"36",X"00",X"6C",X"FD",X"36",X"01",X"6D",X"FD",X"36",X"20",X"40",X"FD",X"36",X"21",X"40",X"F7", + X"4A",X"08",X"00",X"C3",X"F0",X"21",X"F7",X"54",X"08",X"00",X"C3",X"F0",X"21",X"AF",X"32",X"07", + X"4E",X"21",X"04",X"4E",X"34",X"34",X"C9",X"3A",X"08",X"4E",X"E7",X"A7",X"22",X"BE",X"22",X"0C", + X"00",X"DD",X"22",X"F5",X"22",X"FE",X"22",X"3A",X"3A",X"4D",X"D6",X"25",X"C2",X"30",X"21",X"3C", + X"32",X"A0",X"4D",X"32",X"B7",X"4D",X"CD",X"06",X"05",X"21",X"08",X"4E",X"34",X"C9",X"3A",X"01", + X"4D",X"FE",X"FF",X"28",X"05",X"FE",X"FE",X"C2",X"30",X"21",X"3C",X"3C",X"32",X"01",X"4D",X"3E", + X"01",X"32",X"B1",X"4D",X"CD",X"5E",X"1F",X"F7",X"4A",X"09",X"00",X"18",X"DC",X"3A",X"32",X"4D", + X"D6",X"2D",X"28",X"D5",X"3A",X"00",X"4D",X"32",X"D2",X"4D",X"3A",X"01",X"4D",X"D6",X"08",X"32", + X"D3",X"4D",X"C3",X"30",X"21",X"3A",X"32",X"4D",X"D6",X"1E",X"28",X"BD",X"18",X"E6",X"AF",X"32", + X"08",X"4E",X"F7",X"45",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"21",X"00",X"50",X"06",X"08", + X"AF",X"77",X"2C",X"10",X"FC",X"21",X"00",X"40",X"06",X"04",X"32",X"C0",X"50",X"32",X"07",X"50", + X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F1",X"06",X"04",X"32",X"C0",X"50",X"AF",X"32", + X"07",X"50",X"3E",X"0F",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F0",X"ED",X"5E",X"3E",X"FA",X"D3", + X"00",X"AF",X"32",X"07",X"50",X"3C",X"32",X"00",X"50",X"FB",X"76",X"32",X"C0",X"50",X"31",X"C0", + X"4F",X"AF",X"21",X"00",X"50",X"01",X"08",X"08",X"CF",X"21",X"00",X"4C",X"06",X"BE",X"CF",X"CF", + X"CF",X"CF",X"21",X"40",X"50",X"06",X"40",X"CF",X"32",X"C0",X"50",X"CD",X"0D",X"24",X"32",X"C0", + X"50",X"06",X"00",X"CD",X"ED",X"23",X"32",X"C0",X"50",X"21",X"C0",X"4C",X"22",X"80",X"4C",X"22", + X"82",X"4C",X"3E",X"FF",X"06",X"40",X"CF",X"3E",X"01",X"32",X"00",X"50",X"FB",X"2A",X"82",X"4C", + X"7E",X"A7",X"FA",X"8D",X"23",X"36",X"FF",X"2C",X"46",X"36",X"FF",X"2C",X"20",X"02",X"2E",X"C0", + X"22",X"82",X"4C",X"21",X"8D",X"23",X"E5",X"E7",X"ED",X"23",X"D7",X"24",X"19",X"24",X"48",X"24", + X"44",X"25",X"92",X"26",X"0D",X"24",X"9F",X"26",X"37",X"27",X"73",X"27",X"B0",X"27",X"F8",X"27", + X"42",X"28",X"6C",X"28",X"96",X"28",X"C0",X"28",X"0D",X"00",X"A9",X"26",X"C9",X"24",X"3C",X"2A", + X"D7",X"26",X"87",X"24",X"E8",X"23",X"EA",X"28",X"E7",X"2A",X"61",X"2A",X"73",X"2B",X"F3",X"2B", + X"67",X"2C",X"AA",X"2B",X"7C",X"26",X"B9",X"26",X"21",X"04",X"4E",X"34",X"C9",X"78",X"E7",X"F3", + X"23",X"00",X"24",X"3E",X"40",X"01",X"04",X"00",X"21",X"00",X"40",X"CF",X"0D",X"20",X"FC",X"C9", + X"3E",X"40",X"21",X"40",X"40",X"01",X"04",X"80",X"CF",X"0D",X"20",X"FC",X"C9",X"AF",X"01",X"04", + X"00",X"21",X"00",X"44",X"CF",X"0D",X"20",X"FC",X"C9",X"21",X"00",X"40",X"01",X"35",X"34",X"0A", + X"A7",X"C8",X"FA",X"2C",X"24",X"5F",X"16",X"00",X"19",X"2B",X"03",X"0A",X"23",X"77",X"F5",X"E5", + X"11",X"E0",X"83",X"7D",X"E6",X"1F",X"87",X"26",X"00",X"6F",X"19",X"D1",X"A7",X"ED",X"52",X"F1", + X"EE",X"01",X"77",X"EB",X"03",X"C3",X"1F",X"24",X"21",X"00",X"40",X"DD",X"21",X"16",X"4E",X"FD", + X"21",X"B5",X"35",X"16",X"00",X"06",X"1E",X"0E",X"08",X"DD",X"7E",X"00",X"FD",X"5E",X"00",X"19", + X"07",X"30",X"02",X"36",X"10",X"FD",X"23",X"0D",X"20",X"F2",X"DD",X"23",X"05",X"20",X"E8",X"21", + X"34",X"4E",X"11",X"64",X"40",X"ED",X"A0",X"11",X"78",X"40",X"ED",X"A0",X"11",X"84",X"43",X"ED", + X"A0",X"11",X"98",X"43",X"ED",X"A0",X"C9",X"21",X"00",X"40",X"DD",X"21",X"16",X"4E",X"FD",X"21", + X"B5",X"35",X"16",X"00",X"06",X"1E",X"0E",X"08",X"FD",X"5E",X"00",X"19",X"7E",X"FE",X"10",X"37", + X"28",X"01",X"3F",X"DD",X"CB",X"00",X"16",X"FD",X"23",X"0D",X"20",X"EC",X"DD",X"23",X"05",X"20", + X"E5",X"21",X"64",X"40",X"11",X"34",X"4E",X"ED",X"A0",X"21",X"78",X"40",X"ED",X"A0",X"21",X"84", + X"43",X"ED",X"A0",X"21",X"98",X"43",X"ED",X"A0",X"C9",X"21",X"16",X"4E",X"3E",X"FF",X"06",X"1E", + X"CF",X"3E",X"14",X"06",X"04",X"CF",X"C9",X"58",X"78",X"FE",X"03",X"3E",X"00",X"28",X"09",X"78", + X"FE",X"02",X"3E",X"1F",X"28",X"02",X"3E",X"10",X"21",X"40",X"44",X"01",X"04",X"80",X"CF",X"0D", + X"20",X"FC",X"3E",X"0F",X"06",X"40",X"21",X"C0",X"47",X"CF",X"7B",X"FE",X"01",X"C0",X"3E",X"1A", + X"11",X"20",X"00",X"06",X"06",X"DD",X"21",X"A0",X"45",X"DD",X"77",X"0C",X"DD",X"77",X"18",X"DD", + X"19",X"10",X"F6",X"3E",X"1B",X"06",X"05",X"DD",X"21",X"40",X"44",X"DD",X"77",X"0E",X"DD",X"77", + X"0F",X"DD",X"77",X"10",X"DD",X"19",X"10",X"F3",X"06",X"05",X"DD",X"21",X"20",X"47",X"DD",X"77", + X"0E",X"DD",X"77",X"0F",X"DD",X"77",X"10",X"DD",X"19",X"10",X"F3",X"3E",X"18",X"32",X"ED",X"45", + X"32",X"0D",X"46",X"C9",X"DD",X"21",X"00",X"4C",X"DD",X"36",X"02",X"20",X"DD",X"36",X"04",X"20", + X"DD",X"36",X"06",X"20",X"DD",X"36",X"08",X"20",X"DD",X"36",X"0A",X"2C",X"DD",X"36",X"0C",X"3F", + X"DD",X"36",X"03",X"01",X"DD",X"36",X"05",X"03",X"DD",X"36",X"07",X"05",X"DD",X"36",X"09",X"07", + X"DD",X"36",X"0B",X"09",X"DD",X"36",X"0D",X"00",X"78",X"A7",X"C2",X"16",X"26",X"21",X"64",X"80", + X"22",X"00",X"4D",X"21",X"7C",X"80",X"22",X"02",X"4D",X"21",X"7C",X"90",X"22",X"04",X"4D",X"21", + X"7C",X"70",X"22",X"06",X"4D",X"21",X"C4",X"80",X"22",X"08",X"4D",X"21",X"2C",X"2E",X"22",X"0A", + X"4D",X"22",X"31",X"4D",X"21",X"2F",X"2E",X"22",X"0C",X"4D",X"22",X"33",X"4D",X"21",X"2F",X"30", + X"22",X"0E",X"4D",X"22",X"35",X"4D",X"21",X"2F",X"2C",X"22",X"10",X"4D",X"22",X"37",X"4D",X"21", + X"38",X"2E",X"22",X"12",X"4D",X"22",X"39",X"4D",X"21",X"00",X"01",X"22",X"14",X"4D",X"22",X"1E", + X"4D",X"21",X"01",X"00",X"22",X"16",X"4D",X"22",X"20",X"4D",X"21",X"FF",X"00",X"22",X"18",X"4D", + X"22",X"22",X"4D",X"21",X"FF",X"00",X"22",X"1A",X"4D",X"22",X"24",X"4D",X"21",X"00",X"01",X"22", + X"1C",X"4D",X"22",X"26",X"4D",X"21",X"02",X"01",X"22",X"28",X"4D",X"22",X"2C",X"4D",X"21",X"03", + X"03",X"22",X"2A",X"4D",X"22",X"2E",X"4D",X"3E",X"02",X"32",X"30",X"4D",X"32",X"3C",X"4D",X"21", + X"00",X"00",X"22",X"D2",X"4D",X"C9",X"21",X"94",X"00",X"22",X"00",X"4D",X"22",X"02",X"4D",X"22", + X"04",X"4D",X"22",X"06",X"4D",X"21",X"32",X"1E",X"22",X"0A",X"4D",X"22",X"0C",X"4D",X"22",X"0E", + X"4D",X"22",X"10",X"4D",X"22",X"31",X"4D",X"22",X"33",X"4D",X"22",X"35",X"4D",X"22",X"37",X"4D", + X"21",X"00",X"01",X"22",X"14",X"4D",X"22",X"16",X"4D",X"22",X"18",X"4D",X"22",X"1A",X"4D",X"22", + X"1E",X"4D",X"22",X"20",X"4D",X"22",X"22",X"4D",X"22",X"24",X"4D",X"22",X"1C",X"4D",X"22",X"26", + X"4D",X"21",X"28",X"4D",X"3E",X"02",X"06",X"09",X"CF",X"32",X"3C",X"4D",X"21",X"94",X"08",X"22", + X"08",X"4D",X"21",X"32",X"1F",X"22",X"12",X"4D",X"22",X"39",X"4D",X"C9",X"21",X"00",X"00",X"22", + X"D2",X"4D",X"22",X"08",X"4D",X"22",X"00",X"4D",X"22",X"02",X"4D",X"22",X"04",X"4D",X"22",X"06", + X"4D",X"C9",X"3E",X"55",X"32",X"94",X"4D",X"05",X"C8",X"3E",X"01",X"32",X"A0",X"4D",X"C9",X"3E", + X"01",X"32",X"00",X"4E",X"AF",X"32",X"01",X"4E",X"C9",X"AF",X"11",X"00",X"4D",X"21",X"00",X"4E", + X"12",X"13",X"A7",X"ED",X"52",X"C2",X"AD",X"26",X"C9",X"DD",X"21",X"36",X"41",X"3A",X"71",X"4E", + X"E6",X"0F",X"C6",X"30",X"DD",X"77",X"00",X"3A",X"71",X"4E",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F", + X"C8",X"C6",X"30",X"DD",X"77",X"20",X"C9",X"3A",X"80",X"50",X"47",X"E6",X"03",X"C2",X"E5",X"26", + X"21",X"6E",X"4E",X"36",X"FF",X"4F",X"1F",X"CE",X"00",X"32",X"6B",X"4E",X"E6",X"02",X"A9",X"32", + X"6D",X"4E",X"78",X"0F",X"0F",X"E6",X"03",X"3C",X"FE",X"04",X"20",X"01",X"3C",X"32",X"6F",X"4E", + X"78",X"0F",X"0F",X"0F",X"0F",X"E6",X"03",X"21",X"2F",X"27",X"D7",X"32",X"71",X"4E",X"78",X"07", + X"2F",X"E6",X"01",X"32",X"75",X"4E",X"78",X"07",X"07",X"2F",X"E6",X"01",X"47",X"21",X"33",X"27", + X"DF",X"22",X"73",X"4E",X"3A",X"40",X"50",X"07",X"2F",X"E6",X"01",X"32",X"72",X"4E",X"C9",X"10", + X"15",X"20",X"FF",X"68",X"00",X"7D",X"00",X"3A",X"C1",X"4D",X"CB",X"47",X"C2",X"5F",X"27",X"3A", + X"B6",X"4D",X"A7",X"20",X"1A",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13",X"2A",X"0A",X"4D",X"3A", + X"2C",X"4D",X"11",X"1D",X"22",X"CD",X"6D",X"29",X"22",X"1E",X"4D",X"32",X"2C",X"4D",X"C9",X"2A", + X"0A",X"4D",X"ED",X"5B",X"39",X"4D",X"3A",X"2C",X"4D",X"CD",X"6D",X"29",X"22",X"1E",X"4D",X"32", + X"2C",X"4D",X"C9",X"3A",X"C1",X"4D",X"CB",X"47",X"C2",X"95",X"27",X"3A",X"04",X"4E",X"FE",X"03", + X"20",X"13",X"2A",X"0C",X"4D",X"3A",X"2D",X"4D",X"11",X"1D",X"39",X"CD",X"6D",X"29",X"22",X"20", + X"4D",X"32",X"2D",X"4D",X"C9",X"ED",X"5B",X"39",X"4D",X"2A",X"1C",X"4D",X"29",X"29",X"19",X"EB", + X"2A",X"0C",X"4D",X"3A",X"2D",X"4D",X"CD",X"6D",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9", + X"3A",X"C1",X"4D",X"CB",X"47",X"C2",X"D2",X"27",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13",X"2A", + X"0E",X"4D",X"3A",X"2E",X"4D",X"11",X"40",X"20",X"CD",X"6D",X"29",X"22",X"22",X"4D",X"32",X"2E", + X"4D",X"C9",X"ED",X"4B",X"0A",X"4D",X"ED",X"5B",X"39",X"4D",X"2A",X"1C",X"4D",X"29",X"19",X"7D", + X"87",X"91",X"6F",X"7C",X"87",X"90",X"67",X"EB",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD",X"6D", + X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9",X"3A",X"C1",X"4D",X"CB",X"47",X"C2",X"1A",X"28", + X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13",X"2A",X"10",X"4D",X"3A",X"2F",X"4D",X"11",X"40",X"3B", + X"CD",X"6D",X"29",X"22",X"24",X"4D",X"32",X"2F",X"4D",X"C9",X"DD",X"21",X"39",X"4D",X"FD",X"21", + X"10",X"4D",X"CD",X"F1",X"29",X"11",X"40",X"00",X"A7",X"ED",X"52",X"DA",X"07",X"28",X"2A",X"10", + X"4D",X"ED",X"5B",X"39",X"4D",X"3A",X"2F",X"4D",X"CD",X"6D",X"29",X"22",X"24",X"4D",X"32",X"2F", + X"4D",X"C9",X"3A",X"AC",X"4D",X"A7",X"CA",X"5C",X"28",X"11",X"2C",X"2E",X"2A",X"0A",X"4D",X"3A", + X"2C",X"4D",X"CD",X"6D",X"29",X"22",X"1E",X"4D",X"32",X"2C",X"4D",X"C9",X"2A",X"0A",X"4D",X"3A", + X"2C",X"4D",X"CD",X"25",X"29",X"22",X"1E",X"4D",X"32",X"2C",X"4D",X"C9",X"3A",X"AD",X"4D",X"A7", + X"CA",X"86",X"28",X"11",X"2C",X"2E",X"2A",X"0C",X"4D",X"3A",X"2D",X"4D",X"CD",X"6D",X"29",X"22", + X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"2A",X"0C",X"4D",X"3A",X"2D",X"4D",X"CD",X"25",X"29",X"22", + X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"3A",X"AE",X"4D",X"A7",X"CA",X"B0",X"28",X"11",X"2C",X"2E", + X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD",X"6D",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9", + X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD",X"25",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9", + X"3A",X"AF",X"4D",X"A7",X"CA",X"DA",X"28",X"11",X"2C",X"2E",X"2A",X"10",X"4D",X"3A",X"2F",X"4D", + X"CD",X"6D",X"29",X"22",X"24",X"4D",X"32",X"2F",X"4D",X"C9",X"2A",X"10",X"4D",X"3A",X"2F",X"4D", + X"CD",X"25",X"29",X"22",X"24",X"4D",X"32",X"2F",X"4D",X"C9",X"3A",X"A7",X"4D",X"A7",X"CA",X"05", + X"29",X"2A",X"12",X"4D",X"ED",X"5B",X"0C",X"4D",X"3A",X"3C",X"4D",X"CD",X"6D",X"29",X"22",X"26", + X"4D",X"32",X"3C",X"4D",X"C9",X"2A",X"39",X"4D",X"ED",X"4B",X"0C",X"4D",X"7D",X"87",X"91",X"6F", + X"7C",X"87",X"90",X"67",X"EB",X"2A",X"12",X"4D",X"3A",X"3C",X"4D",X"CD",X"6D",X"29",X"22",X"26", + X"4D",X"32",X"3C",X"4D",X"C9",X"22",X"3E",X"4D",X"EE",X"02",X"32",X"3D",X"4D",X"CD",X"2A",X"2A", + X"E6",X"03",X"21",X"3B",X"4D",X"77",X"87",X"5F",X"16",X"00",X"DD",X"21",X"FF",X"32",X"DD",X"19", + X"FD",X"21",X"3E",X"4D",X"3A",X"3D",X"4D",X"BE",X"CA",X"5E",X"29",X"CD",X"0F",X"20",X"E6",X"C0", + X"D6",X"C0",X"28",X"0A",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"3A",X"3B",X"4D",X"C9",X"DD",X"23", + X"DD",X"23",X"21",X"3B",X"4D",X"7E",X"3C",X"E6",X"03",X"77",X"C3",X"44",X"29",X"22",X"3E",X"4D", + X"ED",X"53",X"40",X"4D",X"32",X"3B",X"4D",X"EE",X"02",X"32",X"3D",X"4D",X"21",X"FF",X"FF",X"22", + X"44",X"4D",X"DD",X"21",X"FF",X"32",X"FD",X"21",X"3E",X"4D",X"21",X"C7",X"4D",X"36",X"00",X"3A", + X"3D",X"4D",X"BE",X"CA",X"CD",X"29",X"CD",X"00",X"20",X"22",X"42",X"4D",X"CD",X"65",X"00",X"7E", + X"E6",X"C0",X"D6",X"C0",X"28",X"27",X"DD",X"E5",X"FD",X"E5",X"DD",X"21",X"40",X"4D",X"FD",X"21", + X"42",X"4D",X"CD",X"F1",X"29",X"FD",X"E1",X"DD",X"E1",X"EB",X"2A",X"44",X"4D",X"A7",X"ED",X"52", + X"DA",X"CD",X"29",X"ED",X"53",X"44",X"4D",X"3A",X"C7",X"4D",X"32",X"3B",X"4D",X"DD",X"23",X"DD", + X"23",X"21",X"C7",X"4D",X"34",X"3E",X"04",X"BE",X"C2",X"8F",X"29",X"3A",X"3B",X"4D",X"87",X"5F", + X"16",X"00",X"DD",X"21",X"FF",X"32",X"DD",X"19",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"CB",X"3F", + X"C9",X"DD",X"7E",X"00",X"FD",X"46",X"00",X"90",X"D2",X"00",X"2A",X"78",X"DD",X"46",X"00",X"90", + X"CD",X"19",X"2A",X"E5",X"DD",X"7E",X"01",X"FD",X"46",X"01",X"90",X"D2",X"13",X"2A",X"78",X"DD", + X"46",X"01",X"90",X"CD",X"19",X"2A",X"C1",X"09",X"C9",X"67",X"5F",X"2E",X"00",X"55",X"0E",X"08", + X"29",X"D2",X"25",X"2A",X"19",X"0D",X"C2",X"20",X"2A",X"C9",X"2A",X"C9",X"4D",X"54",X"5D",X"29", + X"29",X"19",X"23",X"7C",X"E6",X"1F",X"67",X"7E",X"22",X"C9",X"4D",X"C9",X"11",X"40",X"40",X"21", + X"C0",X"43",X"A7",X"ED",X"52",X"C8",X"1A",X"FE",X"10",X"CA",X"5A",X"2A",X"FE",X"12",X"CA",X"5A", + X"2A",X"FE",X"14",X"CA",X"5A",X"2A",X"13",X"C3",X"3F",X"2A",X"3E",X"40",X"12",X"13",X"C3",X"3F", + X"2A",X"3A",X"00",X"4E",X"FE",X"01",X"C8",X"21",X"1E",X"2B",X"DF",X"EB",X"CD",X"12",X"2B",X"7B", + X"86",X"27",X"77",X"23",X"7A",X"8E",X"27",X"77",X"5F",X"23",X"3E",X"00",X"8E",X"27",X"77",X"57", + X"EB",X"29",X"29",X"29",X"29",X"3A",X"71",X"4E",X"3D",X"BC",X"DC",X"3C",X"2B",X"CD",X"B6",X"2A", + X"13",X"13",X"13",X"21",X"8A",X"4E",X"06",X"03",X"1A",X"BE",X"D8",X"20",X"05",X"1B",X"2B",X"10", + X"F7",X"C9",X"CD",X"12",X"2B",X"11",X"88",X"4E",X"01",X"03",X"00",X"ED",X"B0",X"1B",X"01",X"04", + X"03",X"21",X"F2",X"43",X"18",X"0F",X"3A",X"09",X"4E",X"01",X"04",X"03",X"21",X"FC",X"43",X"A7", + X"28",X"03",X"21",X"E9",X"43",X"1A",X"0F",X"0F",X"0F",X"0F",X"CD",X"D5",X"2A",X"1A",X"CD",X"D5", + X"2A",X"1B",X"10",X"F1",X"C9",X"E6",X"0F",X"28",X"04",X"0E",X"00",X"18",X"07",X"79",X"A7",X"28", + X"03",X"3E",X"40",X"0D",X"77",X"2B",X"C9",X"06",X"00",X"CD",X"67",X"2C",X"AF",X"21",X"80",X"4E", + X"06",X"08",X"CF",X"01",X"04",X"03",X"11",X"82",X"4E",X"21",X"FC",X"43",X"CD",X"C5",X"2A",X"01", + X"04",X"03",X"11",X"86",X"4E",X"21",X"E9",X"43",X"3A",X"70",X"4E",X"A7",X"20",X"B7",X"0E",X"06", + X"18",X"B3",X"3A",X"09",X"4E",X"21",X"80",X"4E",X"A7",X"C8",X"21",X"84",X"4E",X"C9",X"10",X"00", + X"50",X"00",X"00",X"02",X"00",X"04",X"00",X"08",X"00",X"16",X"00",X"01",X"00",X"03",X"00",X"05", + X"00",X"07",X"00",X"10",X"00",X"20",X"00",X"30",X"00",X"50",X"00",X"32",X"13",X"6B",X"62",X"1B", + X"CB",X"46",X"C0",X"CB",X"C6",X"21",X"9C",X"4E",X"CB",X"C6",X"21",X"14",X"4E",X"34",X"21",X"15", + X"4E",X"34",X"46",X"21",X"1A",X"40",X"0E",X"05",X"78",X"A7",X"28",X"0E",X"FE",X"06",X"30",X"0A", + X"3E",X"20",X"CD",X"98",X"2B",X"2B",X"2B",X"0D",X"10",X"F6",X"0D",X"F8",X"CD",X"87",X"2B",X"2B", + X"2B",X"18",X"F7",X"3A",X"00",X"4E",X"FE",X"01",X"C8",X"CD",X"D6",X"2B",X"12",X"44",X"09",X"0A", + X"02",X"21",X"15",X"4E",X"46",X"18",X"CC",X"3E",X"40",X"E5",X"D5",X"77",X"23",X"77",X"11",X"1F", + X"00",X"19",X"77",X"23",X"77",X"D1",X"E1",X"C9",X"E5",X"D5",X"11",X"1F",X"00",X"77",X"3C",X"23", + X"77",X"3C",X"19",X"77",X"3C",X"23",X"77",X"D1",X"E1",X"C9",X"3A",X"6E",X"4E",X"FE",X"FF",X"20", + X"05",X"06",X"02",X"C3",X"67",X"2C",X"06",X"01",X"CD",X"67",X"2C",X"3A",X"6E",X"4E",X"E6",X"F0", + X"28",X"09",X"0F",X"0F",X"0F",X"0F",X"C6",X"30",X"32",X"34",X"40",X"3A",X"6E",X"4E",X"E6",X"0F", + X"C6",X"30",X"32",X"33",X"40",X"C9",X"E1",X"5E",X"23",X"56",X"23",X"4E",X"23",X"46",X"23",X"7E", + X"23",X"E5",X"EB",X"11",X"20",X"00",X"E5",X"C5",X"71",X"23",X"10",X"FC",X"C1",X"E1",X"19",X"3D", + X"20",X"F4",X"C9",X"3A",X"00",X"4E",X"FE",X"01",X"C8",X"3A",X"13",X"4E",X"3C",X"FE",X"08",X"D2", + X"37",X"2C",X"11",X"08",X"3B",X"47",X"0E",X"07",X"21",X"04",X"40",X"1A",X"CD",X"98",X"2B",X"3E", + X"04",X"84",X"67",X"13",X"1A",X"CD",X"89",X"2B",X"3E",X"FC",X"84",X"67",X"13",X"23",X"23",X"0D", + X"10",X"E9",X"0D",X"F8",X"CD",X"87",X"2B",X"3E",X"04",X"84",X"67",X"AF",X"CD",X"89",X"2B",X"3E", + X"FC",X"84",X"67",X"23",X"23",X"18",X"EB",X"FE",X"13",X"38",X"02",X"3E",X"13",X"D6",X"07",X"4F", + X"06",X"00",X"21",X"08",X"3B",X"09",X"09",X"EB",X"06",X"07",X"C3",X"06",X"2C",X"47",X"E6",X"0F", + X"C6",X"00",X"27",X"4F",X"78",X"E6",X"F0",X"28",X"0B",X"0F",X"0F",X"0F",X"0F",X"47",X"AF",X"C6", + X"16",X"27",X"10",X"FB",X"81",X"27",X"C9",X"21",X"A5",X"36",X"DF",X"5E",X"23",X"56",X"DD",X"21", + X"00",X"44",X"DD",X"19",X"DD",X"E5",X"11",X"00",X"FC",X"DD",X"19",X"11",X"FF",X"FF",X"CB",X"7E", + X"20",X"03",X"11",X"E0",X"FF",X"23",X"78",X"01",X"00",X"00",X"87",X"38",X"28",X"7E",X"FE",X"2F", + X"28",X"09",X"DD",X"77",X"00",X"23",X"DD",X"19",X"04",X"18",X"F2",X"23",X"DD",X"E1",X"7E",X"A7", + X"FA",X"AD",X"2C",X"7E",X"DD",X"77",X"00",X"23",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"77",X"00", + X"DD",X"19",X"10",X"F9",X"C9",X"7E",X"FE",X"2F",X"28",X"0A",X"DD",X"36",X"00",X"40",X"23",X"DD", + X"19",X"04",X"18",X"F1",X"23",X"04",X"ED",X"B1",X"18",X"D2",X"21",X"C8",X"3B",X"DD",X"21",X"CC", + X"4E",X"FD",X"21",X"8C",X"4E",X"CD",X"4D",X"2D",X"47",X"3A",X"CC",X"4E",X"A7",X"28",X"04",X"78", + X"32",X"91",X"4E",X"21",X"CC",X"3B",X"DD",X"21",X"DC",X"4E",X"FD",X"21",X"92",X"4E",X"CD",X"4D", + X"2D",X"47",X"3A",X"DC",X"4E",X"A7",X"28",X"04",X"78",X"32",X"96",X"4E",X"21",X"D0",X"3B",X"DD", + X"21",X"EC",X"4E",X"FD",X"21",X"97",X"4E",X"CD",X"4D",X"2D",X"47",X"3A",X"EC",X"4E",X"A7",X"C8", + X"78",X"32",X"9B",X"4E",X"C9",X"21",X"30",X"3B",X"DD",X"21",X"9C",X"4E",X"FD",X"21",X"8C",X"4E", + X"CD",X"F7",X"2D",X"32",X"91",X"4E",X"21",X"40",X"3B",X"DD",X"21",X"AC",X"4E",X"FD",X"21",X"92", + X"4E",X"CD",X"F7",X"2D",X"32",X"96",X"4E",X"21",X"80",X"3B",X"DD",X"21",X"BC",X"4E",X"FD",X"21", + X"97",X"4E",X"CD",X"F7",X"2D",X"32",X"9B",X"4E",X"AF",X"32",X"90",X"4E",X"C9",X"DD",X"7E",X"00", + X"A7",X"CA",X"FD",X"2D",X"4F",X"06",X"08",X"1E",X"80",X"7B",X"A1",X"20",X"05",X"CB",X"3B",X"10", + X"F8",X"C9",X"DD",X"7E",X"02",X"A3",X"20",X"07",X"DD",X"73",X"02",X"05",X"DF",X"18",X"0C",X"DD", + X"35",X"0C",X"C2",X"E0",X"2D",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06", + X"DD",X"74",X"07",X"FE",X"F0",X"38",X"27",X"21",X"75",X"2D",X"E5",X"E6",X"0F",X"E7",X"5E",X"2F", + X"6E",X"2F",X"80",X"2F",X"92",X"2F",X"A4",X"2F",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00", + X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"B6",X"2F",X"47",X"E6", + X"1F",X"28",X"03",X"DD",X"70",X"0D",X"DD",X"4E",X"09",X"DD",X"7E",X"0B",X"E6",X"08",X"28",X"02", + X"0E",X"00",X"DD",X"71",X"0F",X"78",X"07",X"07",X"07",X"E6",X"07",X"21",X"B0",X"3B",X"D7",X"DD", + X"77",X"0C",X"78",X"E6",X"1F",X"28",X"09",X"E6",X"0F",X"21",X"B8",X"3B",X"D7",X"DD",X"77",X"0E", + X"DD",X"6E",X"0E",X"26",X"00",X"DD",X"7E",X"0D",X"E6",X"10",X"28",X"02",X"3E",X"01",X"DD",X"86", + X"04",X"CA",X"F1",X"2E",X"C3",X"ED",X"2E",X"DD",X"7E",X"00",X"A7",X"20",X"27",X"DD",X"7E",X"02", + X"A7",X"C8",X"DD",X"36",X"02",X"00",X"DD",X"36",X"0D",X"00",X"DD",X"36",X"0E",X"00",X"DD",X"36", + X"0F",X"00",X"FD",X"36",X"00",X"00",X"FD",X"36",X"01",X"00",X"FD",X"36",X"02",X"00",X"FD",X"36", + X"03",X"00",X"AF",X"C9",X"4F",X"06",X"08",X"1E",X"80",X"7B",X"A1",X"20",X"05",X"CB",X"3B",X"10", + X"F8",X"C9",X"DD",X"7E",X"02",X"A3",X"20",X"3F",X"DD",X"73",X"02",X"05",X"78",X"07",X"07",X"07", + X"4F",X"06",X"00",X"E5",X"09",X"DD",X"E5",X"D1",X"13",X"13",X"13",X"01",X"08",X"00",X"ED",X"B0", + X"E1",X"DD",X"7E",X"06",X"E6",X"7F",X"DD",X"77",X"0C",X"DD",X"7E",X"04",X"DD",X"77",X"0E",X"DD", + X"7E",X"09",X"47",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"DD",X"77",X"0B",X"E6",X"08",X"20",X"07", + X"DD",X"70",X"0F",X"DD",X"36",X"0D",X"00",X"DD",X"35",X"0C",X"20",X"5A",X"DD",X"7E",X"08",X"A7", + X"28",X"10",X"DD",X"35",X"08",X"20",X"0B",X"7B",X"2F",X"DD",X"A6",X"00",X"DD",X"77",X"00",X"C3", + X"F7",X"2D",X"DD",X"7E",X"06",X"E6",X"7F",X"DD",X"77",X"0C",X"DD",X"CB",X"06",X"7E",X"28",X"16", + X"DD",X"7E",X"05",X"ED",X"44",X"DD",X"77",X"05",X"DD",X"CB",X"0D",X"46",X"DD",X"CB",X"0D",X"C6", + X"28",X"24",X"DD",X"CB",X"0D",X"86",X"DD",X"7E",X"04",X"DD",X"86",X"07",X"DD",X"77",X"04",X"DD", + X"77",X"0E",X"DD",X"7E",X"09",X"DD",X"86",X"0A",X"DD",X"77",X"09",X"47",X"DD",X"7E",X"0B",X"E6", + X"08",X"20",X"03",X"DD",X"70",X"0F",X"DD",X"7E",X"0E",X"DD",X"86",X"05",X"DD",X"77",X"0E",X"6F", + X"26",X"00",X"DD",X"7E",X"03",X"E6",X"70",X"28",X"08",X"0F",X"0F",X"0F",X"0F",X"47",X"29",X"10", + X"FD",X"FD",X"75",X"00",X"7D",X"0F",X"0F",X"0F",X"0F",X"FD",X"77",X"01",X"FD",X"74",X"02",X"7C", + X"0F",X"0F",X"0F",X"0F",X"FD",X"77",X"03",X"DD",X"7E",X"0B",X"E7",X"2B",X"2F",X"2F",X"2F",X"34", + X"2F",X"45",X"2F",X"4C",X"2F",X"53",X"2F",X"54",X"2F",X"55",X"2F",X"56",X"2F",X"57",X"2F",X"58", + X"2F",X"59",X"2F",X"5A",X"2F",X"5B",X"2F",X"5C",X"2F",X"5D",X"2F",X"DD",X"7E",X"0F",X"C9",X"DD", + X"7E",X"0F",X"18",X"09",X"3A",X"84",X"4C",X"E6",X"01",X"DD",X"7E",X"0F",X"C0",X"E6",X"0F",X"C8", + X"3D",X"DD",X"77",X"0F",X"C9",X"3A",X"84",X"4C",X"E6",X"03",X"18",X"ED",X"3A",X"84",X"4C",X"E6", + X"07",X"18",X"E6",X"C9",X"C9",X"C9",X"C9",X"C9",X"C9",X"C9",X"C9",X"C9",X"C9",X"C9",X"DD",X"6E", + X"06",X"DD",X"66",X"07",X"7E",X"DD",X"77",X"06",X"23",X"7E",X"DD",X"77",X"07",X"C9",X"DD",X"6E", + X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"03",X"C9", + X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77", + X"04",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07", + X"DD",X"77",X"09",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD", + X"74",X"07",X"DD",X"77",X"0B",X"C9",X"DD",X"7E",X"02",X"2F",X"DD",X"A6",X"00",X"DD",X"77",X"00", + X"C3",X"FD",X"2D",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"5E",X"C8", + X"21",X"00",X"00",X"01",X"00",X"10",X"32",X"C0",X"50",X"79",X"86",X"4F",X"7D",X"C6",X"02",X"6F", + X"FE",X"02",X"D2",X"09",X"30",X"24",X"10",X"EE",X"79",X"A7",X"20",X"15",X"32",X"07",X"50",X"7C", + X"FE",X"40",X"C2",X"03",X"30",X"26",X"00",X"2C",X"7D",X"FE",X"02",X"DA",X"03",X"30",X"C3",X"42", + X"30",X"25",X"7C",X"E6",X"F0",X"32",X"07",X"50",X"0F",X"0F",X"0F",X"0F",X"5F",X"06",X"00",X"C3", + X"BD",X"30",X"31",X"54",X"31",X"06",X"FF",X"E1",X"D1",X"48",X"32",X"C0",X"50",X"79",X"A3",X"77", + X"C6",X"33",X"4F",X"2C",X"7D",X"E6",X"0F",X"C2",X"4D",X"30",X"79",X"87",X"87",X"81",X"C6",X"31", + X"4F",X"7D",X"A7",X"C2",X"4D",X"30",X"24",X"15",X"C2",X"4A",X"30",X"3B",X"3B",X"3B",X"3B",X"E1", + X"D1",X"48",X"32",X"C0",X"50",X"79",X"A3",X"4F",X"7E",X"A3",X"B9",X"C2",X"B5",X"30",X"C6",X"33", + X"4F",X"2C",X"7D",X"E6",X"0F",X"C2",X"75",X"30",X"79",X"87",X"87",X"81",X"C6",X"31",X"4F",X"7D", + X"A7",X"C2",X"75",X"30",X"24",X"15",X"C2",X"72",X"30",X"3B",X"3B",X"3B",X"3B",X"78",X"D6",X"10", + X"47",X"10",X"A4",X"F1",X"D1",X"FE",X"44",X"C2",X"45",X"30",X"7B",X"EE",X"F0",X"C2",X"45",X"30", + X"06",X"01",X"C3",X"BD",X"30",X"7B",X"E6",X"01",X"EE",X"01",X"5F",X"06",X"00",X"31",X"C0",X"4F", + X"D9",X"21",X"00",X"4C",X"06",X"04",X"32",X"C0",X"50",X"36",X"00",X"2C",X"20",X"FB",X"24",X"10", + X"F5",X"21",X"00",X"40",X"06",X"04",X"32",X"C0",X"50",X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24", + X"10",X"F4",X"06",X"04",X"32",X"C0",X"50",X"3E",X"0F",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F4", + X"D9",X"10",X"08",X"06",X"23",X"CD",X"67",X"2C",X"C3",X"74",X"31",X"7B",X"C6",X"30",X"32",X"84", + X"41",X"C5",X"E5",X"06",X"24",X"CD",X"67",X"2C",X"E1",X"7C",X"FE",X"40",X"2A",X"6C",X"31",X"38", + X"11",X"FE",X"4C",X"2A",X"6E",X"31",X"30",X"0A",X"FE",X"44",X"2A",X"70",X"31",X"38",X"03",X"2A", + X"72",X"31",X"7D",X"32",X"04",X"42",X"7C",X"32",X"64",X"42",X"3A",X"00",X"50",X"47",X"3A",X"40", + X"50",X"B0",X"E6",X"01",X"20",X"11",X"C1",X"79",X"E6",X"0F",X"47",X"79",X"E6",X"F0",X"0F",X"0F", + X"0F",X"0F",X"4F",X"ED",X"43",X"85",X"41",X"32",X"C0",X"50",X"3A",X"40",X"50",X"E6",X"10",X"28", + X"F6",X"76",X"00",X"00",X"00",X"4C",X"0F",X"04",X"00",X"4C",X"F0",X"04",X"00",X"40",X"0F",X"04", + X"00",X"40",X"F0",X"04",X"00",X"44",X"0F",X"04",X"00",X"44",X"F0",X"04",X"4F",X"40",X"41",X"57", + X"41",X"56",X"41",X"43",X"21",X"06",X"50",X"3E",X"01",X"77",X"2D",X"20",X"FC",X"AF",X"32",X"03", + X"50",X"D6",X"04",X"D3",X"00",X"31",X"C0",X"4F",X"32",X"C0",X"50",X"AF",X"32",X"00",X"4E",X"3C", + X"32",X"01",X"4E",X"32",X"00",X"50",X"FB",X"3A",X"00",X"50",X"2F",X"47",X"E6",X"E0",X"28",X"05", + X"3E",X"02",X"32",X"9C",X"4E",X"3A",X"40",X"50",X"2F",X"4F",X"E6",X"60",X"28",X"05",X"3E",X"01", + X"32",X"9C",X"4E",X"78",X"B1",X"E6",X"01",X"28",X"05",X"3E",X"08",X"32",X"BC",X"4E",X"78",X"B1", + X"E6",X"02",X"28",X"05",X"3E",X"04",X"32",X"BC",X"4E",X"78",X"B1",X"E6",X"04",X"28",X"05",X"3E", + X"10",X"32",X"BC",X"4E",X"78",X"B1",X"E6",X"08",X"28",X"05",X"3E",X"20",X"32",X"BC",X"4E",X"3A", + X"80",X"50",X"E6",X"03",X"C6",X"25",X"47",X"CD",X"67",X"2C",X"3A",X"80",X"50",X"0F",X"0F",X"0F", + X"0F",X"E6",X"03",X"FE",X"03",X"20",X"08",X"06",X"2A",X"CD",X"67",X"2C",X"C3",X"1C",X"32",X"07", + X"5F",X"D5",X"06",X"2B",X"CD",X"67",X"2C",X"06",X"2E",X"CD",X"67",X"2C",X"D1",X"16",X"00",X"21", + X"F9",X"32",X"19",X"7E",X"32",X"2A",X"42",X"23",X"7E",X"32",X"4A",X"42",X"3A",X"80",X"50",X"0F", + X"0F",X"E6",X"03",X"C6",X"31",X"FE",X"34",X"20",X"01",X"3C",X"32",X"0C",X"42",X"06",X"29",X"CD", + X"67",X"2C",X"3A",X"40",X"50",X"07",X"E6",X"01",X"C6",X"2C",X"47",X"CD",X"67",X"2C",X"3A",X"40", + X"50",X"E6",X"10",X"CA",X"88",X"31",X"AF",X"32",X"00",X"50",X"F3",X"21",X"07",X"50",X"AF",X"77", + X"2D",X"20",X"FC",X"31",X"E2",X"3A",X"06",X"03",X"D9",X"E1",X"D1",X"32",X"C0",X"50",X"C1",X"3E", + X"3C",X"77",X"23",X"72",X"23",X"10",X"F8",X"3B",X"3B",X"C1",X"71",X"23",X"3E",X"3F",X"77",X"23", + X"10",X"F8",X"3B",X"3B",X"1D",X"C2",X"5B",X"32",X"F1",X"D9",X"10",X"DC",X"31",X"C0",X"4F",X"06", + X"08",X"CD",X"ED",X"32",X"10",X"FB",X"32",X"C0",X"50",X"3A",X"40",X"50",X"E6",X"10",X"28",X"F6", + X"3A",X"40",X"50",X"E6",X"60",X"C2",X"4B",X"23",X"06",X"08",X"CD",X"ED",X"32",X"10",X"FB",X"3A", + X"40",X"50",X"E6",X"10",X"C2",X"4B",X"23",X"1E",X"01",X"06",X"04",X"32",X"C0",X"50",X"CD",X"ED", + X"32",X"3A",X"00",X"50",X"A3",X"20",X"F4",X"CD",X"ED",X"32",X"32",X"C0",X"50",X"3A",X"00",X"50", + X"EE",X"FF",X"20",X"F3",X"10",X"E5",X"CB",X"03",X"7B",X"FE",X"10",X"DA",X"A9",X"32",X"21",X"00", + X"40",X"06",X"04",X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F7",X"CD",X"F4",X"3A",X"32", + X"C0",X"50",X"3A",X"40",X"50",X"E6",X"10",X"CA",X"DF",X"32",X"C3",X"4B",X"23",X"32",X"C0",X"50", + X"21",X"00",X"28",X"2B",X"7C",X"B5",X"20",X"FB",X"C9",X"30",X"31",X"35",X"31",X"30",X"32",X"00", + X"FF",X"01",X"00",X"00",X"01",X"FF",X"00",X"00",X"FF",X"01",X"00",X"00",X"01",X"FF",X"00",X"55", + X"2A",X"55",X"2A",X"55",X"55",X"55",X"55",X"55",X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"25", + X"25",X"25",X"25",X"22",X"22",X"22",X"22",X"01",X"01",X"01",X"01",X"58",X"02",X"08",X"07",X"60", + X"09",X"10",X"0E",X"68",X"10",X"70",X"17",X"14",X"19",X"52",X"4A",X"A5",X"94",X"AA",X"2A",X"55", + X"55",X"55",X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"92",X"24",X"25",X"49",X"48",X"24",X"22", + X"91",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"55",X"2A",X"55",X"2A",X"55",X"55",X"55",X"55",X"AA",X"2A",X"55",X"55",X"55", + X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"48",X"24",X"22",X"91",X"21",X"44",X"44",X"08",X"58", + X"02",X"34",X"08",X"D8",X"09",X"B4",X"0F",X"58",X"11",X"08",X"16",X"34",X"17",X"55",X"55",X"55", + X"55",X"D5",X"6A",X"D5",X"6A",X"AA",X"6A",X"55",X"D5",X"55",X"55",X"55",X"55",X"AA",X"2A",X"55", + X"55",X"92",X"24",X"92",X"24",X"22",X"22",X"22",X"22",X"A4",X"01",X"54",X"06",X"F8",X"07",X"A8", + X"0C",X"D4",X"0D",X"84",X"12",X"B0",X"13",X"D5",X"6A",X"D5",X"6A",X"D6",X"5A",X"AD",X"B5",X"D6", + X"5A",X"AD",X"B5",X"D5",X"6A",X"D5",X"6A",X"AA",X"6A",X"55",X"D5",X"92",X"24",X"25",X"49",X"48", + X"24",X"22",X"91",X"A4",X"01",X"54",X"06",X"F8",X"07",X"A8",X"0C",X"D4",X"0D",X"FE",X"FF",X"FF", + X"FF",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"B6",X"6D",X"6D",X"DB",X"6D",X"6D",X"6D", + X"6D",X"D6",X"5A",X"AD",X"B5",X"25",X"25",X"25",X"25",X"92",X"24",X"92",X"24",X"2C",X"01",X"DC", + X"05",X"08",X"07",X"B8",X"0B",X"E4",X"0C",X"FE",X"FF",X"FF",X"FF",X"D5",X"6A",X"D5",X"6A",X"D5", + X"6A",X"D5",X"6A",X"B6",X"6D",X"6D",X"DB",X"6D",X"6D",X"6D",X"6D",X"D6",X"5A",X"AD",X"B5",X"48", + X"24",X"22",X"91",X"92",X"24",X"92",X"24",X"2C",X"01",X"DC",X"05",X"08",X"07",X"B8",X"0B",X"E4", + X"0C",X"FE",X"FF",X"FF",X"FF",X"40",X"FC",X"D0",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2", + X"D4",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"D0",X"D2",X"D2",X"D2",X"D2",X"D6", + X"D8",X"D2",X"D2",X"D2",X"D2",X"D4",X"FC",X"DA",X"09",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC", + X"FC",X"FC",X"FC",X"DA",X"05",X"DE",X"E4",X"05",X"DC",X"FC",X"DA",X"02",X"E6",X"E8",X"EA",X"02", + X"E6",X"EA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"E6", + X"EA",X"02",X"E7",X"EB",X"02",X"E6",X"EA",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"FC",X"E4",X"02", + X"DE",X"E4",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DE", + X"E4",X"05",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"FC",X"E4",X"02",X"DE",X"E4",X"02", + X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"F2",X"E8",X"E8", + X"EA",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"E7",X"E9",X"EB",X"02",X"E7",X"EB",X"02", + X"E7",X"D2",X"D2",X"D2",X"EB",X"02",X"E7",X"D2",X"D2",X"D2",X"EB",X"02",X"E7",X"E9",X"E9",X"E9", + X"EB",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"1B",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02", + X"E6",X"E8",X"F8",X"02",X"F6",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"F8",X"02",X"F6",X"E8",X"E8", + X"E8",X"EA",X"02",X"E6",X"F8",X"02",X"F6",X"E8",X"E8",X"F4",X"E4",X"02",X"DC",X"FC",X"DA",X"02", + X"DE",X"FC",X"E4",X"02",X"F7",X"E9",X"E9",X"F5",X"F3",X"E9",X"E9",X"F9",X"02",X"F7",X"E9",X"E9", + X"E9",X"EB",X"02",X"DE",X"E4",X"02",X"F7",X"E9",X"E9",X"F5",X"E4",X"02",X"DC",X"FC",X"DA",X"02", + X"DE",X"FC",X"E4",X"05",X"DE",X"E4",X"0B",X"DE",X"E4",X"05",X"DE",X"E4",X"02",X"DC",X"FC",X"DA", + X"02",X"DE",X"FC",X"E4",X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"EC",X"D3",X"D3",X"D3",X"EE", + X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA", + X"02",X"E7",X"E9",X"EB",X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"FC",X"FC",X"DA", + X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"DA", + X"06",X"DE",X"E4",X"05",X"F0",X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"E4",X"05",X"DE",X"E4",X"05", + X"DC",X"FC",X"FA",X"E8",X"E8",X"E8",X"EA",X"02",X"DE",X"F2",X"E8",X"E8",X"EA",X"02",X"CE",X"FC", + X"FC",X"FC",X"DA",X"02",X"DE",X"F2",X"E8",X"E8",X"EA",X"02",X"DE",X"F2",X"E8",X"E8",X"EA",X"02", + X"DC",X"00",X"00",X"00",X"00",X"62",X"01",X"02",X"01",X"01",X"01",X"01",X"0C",X"01",X"01",X"04", + X"01",X"01",X"01",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"04",X"03",X"0C",X"03",X"01", + X"01",X"01",X"03",X"04",X"04",X"03",X"0C",X"06",X"03",X"04",X"04",X"03",X"0C",X"06",X"03",X"04", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"04",X"04",X"0F",X"03",X"06",X"04", + X"04",X"0F",X"03",X"06",X"04",X"04",X"01",X"01",X"01",X"0C",X"03",X"01",X"01",X"01",X"03",X"04", + X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"01",X"01", + X"01",X"01",X"03",X"0C",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"08",X"18",X"08",X"18",X"04", + X"01",X"01",X"01",X"01",X"03",X"0C",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"04",X"04",X"03", + X"0C",X"03",X"03",X"03",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"04",X"01",X"01",X"01", + X"0C",X"03",X"01",X"01",X"01",X"03",X"04",X"04",X"0F",X"03",X"06",X"04",X"04",X"0F",X"03",X"06", + X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"04",X"04",X"03",X"0C",X"06", + X"03",X"04",X"04",X"03",X"0C",X"06",X"03",X"04",X"04",X"03",X"0C",X"03",X"01",X"01",X"01",X"03", + X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"01",X"02",X"01",X"01",X"01",X"01",X"0C",X"01", + X"01",X"04",X"01",X"01",X"01",X"13",X"37",X"23",X"37",X"32",X"37",X"41",X"37",X"5A",X"37",X"6A", + X"37",X"7A",X"37",X"86",X"37",X"9D",X"37",X"B1",X"37",X"00",X"3D",X"61",X"3E",X"FD",X"37",X"67", + X"3D",X"E3",X"3D",X"86",X"3D",X"02",X"3E",X"4C",X"38",X"5A",X"38",X"81",X"3E",X"57",X"3D",X"D3", + X"3D",X"76",X"3D",X"F2",X"3D",X"01",X"00",X"02",X"00",X"03",X"00",X"BC",X"38",X"C4",X"38",X"CE", + X"38",X"D8",X"38",X"E2",X"38",X"EC",X"38",X"F6",X"38",X"00",X"39",X"0A",X"39",X"1A",X"39",X"6F", + X"39",X"2A",X"39",X"58",X"39",X"41",X"39",X"4F",X"3E",X"86",X"39",X"97",X"39",X"B0",X"39",X"BD", + X"39",X"CA",X"39",X"A5",X"3D",X"21",X"3E",X"C4",X"3D",X"40",X"3E",X"95",X"3D",X"11",X"3E",X"B4", + X"3D",X"30",X"3E",X"D4",X"83",X"48",X"49",X"47",X"48",X"40",X"53",X"43",X"4F",X"52",X"45",X"2F", + X"8F",X"2F",X"80",X"3B",X"80",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"40",X"40",X"2F",X"8F", + X"2F",X"80",X"3B",X"80",X"46",X"52",X"45",X"45",X"40",X"50",X"4C",X"41",X"59",X"2F",X"8F",X"2F", + X"80",X"8C",X"02",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"45",X"2F",X"85",X"2F", + X"10",X"10",X"1A",X"1A",X"1A",X"1A",X"1A",X"1A",X"10",X"10",X"8C",X"02",X"50",X"4C",X"41",X"59", + X"45",X"52",X"40",X"54",X"57",X"4F",X"2F",X"85",X"2F",X"80",X"92",X"02",X"47",X"41",X"4D",X"45", + X"40",X"40",X"4F",X"56",X"45",X"52",X"2F",X"81",X"2F",X"80",X"52",X"02",X"52",X"45",X"41",X"44", + X"59",X"5B",X"2F",X"89",X"2F",X"90",X"EE",X"02",X"50",X"55",X"53",X"48",X"40",X"53",X"54",X"41", + X"52",X"54",X"40",X"42",X"55",X"54",X"54",X"4F",X"4E",X"2F",X"87",X"2F",X"80",X"B2",X"02",X"31", + X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"4C",X"59",X"40",X"2F",X"85",X"2F", + X"80",X"B2",X"02",X"31",X"40",X"4F",X"52",X"40",X"32",X"40",X"50",X"4C",X"41",X"59",X"45",X"52", + X"53",X"2F",X"85",X"00",X"2F",X"00",X"80",X"00",X"96",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40", + X"50",X"55",X"43",X"4B",X"4D",X"41",X"4E",X"40",X"46",X"4F",X"52",X"40",X"40",X"40",X"30",X"30", + X"30",X"40",X"5D",X"5E",X"5F",X"2F",X"8E",X"2F",X"80",X"BA",X"02",X"5C",X"40",X"28",X"29",X"2A", + X"2B",X"2C",X"2D",X"2E",X"40",X"31",X"39",X"38",X"30",X"2F",X"83",X"2F",X"80",X"C3",X"02",X"43", + X"48",X"41",X"52",X"41",X"43",X"54",X"45",X"52",X"40",X"3A",X"40",X"4E",X"49",X"43",X"4B",X"4E", + X"41",X"4D",X"45",X"2F",X"8F",X"2F",X"80",X"65",X"01",X"26",X"41",X"4B",X"41",X"42",X"45",X"49", + X"26",X"2F",X"81",X"2F",X"80",X"45",X"01",X"26",X"4D",X"41",X"43",X"4B",X"59",X"26",X"2F",X"81", + X"2F",X"80",X"48",X"01",X"26",X"50",X"49",X"4E",X"4B",X"59",X"26",X"2F",X"83",X"2F",X"80",X"48", + X"01",X"26",X"4D",X"49",X"43",X"4B",X"59",X"26",X"2F",X"83",X"2F",X"80",X"76",X"02",X"10",X"40", + X"31",X"30",X"40",X"5D",X"5E",X"5F",X"2F",X"9F",X"2F",X"80",X"78",X"02",X"14",X"40",X"35",X"30", + X"40",X"5D",X"5E",X"5F",X"2F",X"9F",X"2F",X"80",X"5D",X"02",X"28",X"29",X"2A",X"2B",X"2C",X"2D", + X"2E",X"2F",X"83",X"2F",X"80",X"C5",X"02",X"40",X"4F",X"49",X"4B",X"41",X"4B",X"45",X"3B",X"3B", + X"3B",X"3B",X"2F",X"81",X"2F",X"80",X"C5",X"02",X"40",X"55",X"52",X"43",X"48",X"49",X"4E",X"3B", + X"3B",X"3B",X"3B",X"3B",X"2F",X"81",X"2F",X"80",X"C8",X"02",X"40",X"4D",X"41",X"43",X"48",X"49", + X"42",X"55",X"53",X"45",X"3B",X"3B",X"2F",X"83",X"2F",X"80",X"C8",X"02",X"40",X"52",X"4F",X"4D", + X"50",X"3B",X"3B",X"3B",X"3B",X"3B",X"3B",X"3B",X"2F",X"83",X"2F",X"80",X"12",X"02",X"81",X"85", + X"2F",X"83",X"2F",X"90",X"32",X"02",X"40",X"82",X"85",X"40",X"2F",X"83",X"2F",X"90",X"32",X"02", + X"40",X"83",X"85",X"40",X"2F",X"83",X"2F",X"90",X"32",X"02",X"40",X"84",X"85",X"40",X"2F",X"83", + X"2F",X"90",X"32",X"02",X"40",X"86",X"8D",X"8E",X"2F",X"83",X"2F",X"90",X"32",X"02",X"87",X"88", + X"8D",X"8E",X"2F",X"83",X"2F",X"90",X"32",X"02",X"89",X"8A",X"8D",X"8E",X"2F",X"83",X"2F",X"90", + X"32",X"02",X"8B",X"8C",X"8D",X"8E",X"2F",X"83",X"2F",X"90",X"04",X"03",X"4D",X"45",X"4D",X"4F", + X"52",X"59",X"40",X"40",X"4F",X"4B",X"2F",X"8F",X"2F",X"80",X"04",X"03",X"42",X"41",X"44",X"40", + X"40",X"40",X"40",X"52",X"40",X"4D",X"2F",X"8F",X"2F",X"80",X"08",X"03",X"31",X"40",X"43",X"4F", + X"49",X"4E",X"40",X"40",X"31",X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"2F",X"8F",X"2F", + X"80",X"08",X"03",X"32",X"40",X"43",X"4F",X"49",X"4E",X"53",X"40",X"31",X"40",X"43",X"52",X"45", + X"44",X"49",X"54",X"40",X"2F",X"8F",X"2F",X"80",X"08",X"03",X"31",X"40",X"43",X"4F",X"49",X"4E", + X"40",X"40",X"32",X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"53",X"2F",X"8F",X"2F",X"80",X"08", + X"03",X"46",X"52",X"45",X"45",X"40",X"40",X"50",X"4C",X"41",X"59",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"2F",X"8F",X"2F",X"80",X"0A",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"4E", + X"4F",X"4E",X"45",X"2F",X"8F",X"2F",X"80",X"0A",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"2F", + X"8F",X"2F",X"80",X"0C",X"03",X"50",X"55",X"43",X"4B",X"4D",X"41",X"4E",X"2F",X"8F",X"2F",X"80", + X"0E",X"03",X"54",X"41",X"42",X"4C",X"45",X"40",X"40",X"2F",X"8F",X"2F",X"80",X"0E",X"03",X"55", + X"50",X"52",X"49",X"47",X"48",X"54",X"2F",X"8F",X"2F",X"80",X"0A",X"02",X"30",X"30",X"30",X"2F", + X"8F",X"2F",X"80",X"6B",X"01",X"26",X"41",X"4F",X"53",X"55",X"4B",X"45",X"26",X"2F",X"85",X"2F", + X"80",X"4B",X"01",X"26",X"4D",X"55",X"43",X"4B",X"59",X"26",X"2F",X"85",X"2F",X"80",X"6E",X"01", + X"26",X"47",X"55",X"5A",X"55",X"54",X"41",X"26",X"2F",X"87",X"2F",X"80",X"4E",X"01",X"26",X"4D", + X"4F",X"43",X"4B",X"59",X"26",X"2F",X"87",X"2F",X"80",X"CB",X"02",X"40",X"4B",X"49",X"4D",X"41", + X"47",X"55",X"52",X"45",X"3B",X"3B",X"2F",X"85",X"2F",X"80",X"CB",X"02",X"40",X"53",X"54",X"59", + X"4C",X"49",X"53",X"54",X"3B",X"3B",X"3B",X"3B",X"2F",X"85",X"2F",X"80",X"CE",X"02",X"40",X"4F", + X"54",X"4F",X"42",X"4F",X"4B",X"45",X"3B",X"3B",X"3B",X"2F",X"87",X"2F",X"80",X"CE",X"02",X"40", + X"43",X"52",X"59",X"42",X"41",X"42",X"59",X"3B",X"3B",X"3B",X"3B",X"2F",X"87",X"2F",X"80",X"01", + X"01",X"03",X"01",X"01",X"01",X"03",X"02",X"02",X"02",X"01",X"01",X"01",X"01",X"02",X"04",X"04", + X"04",X"06",X"02",X"02",X"02",X"02",X"04",X"02",X"04",X"04",X"04",X"06",X"02",X"02",X"02",X"02", + X"01",X"01",X"01",X"01",X"02",X"04",X"04",X"04",X"06",X"02",X"02",X"02",X"02",X"06",X"04",X"05", + X"01",X"01",X"03",X"01",X"01",X"01",X"04",X"01",X"01",X"01",X"03",X"01",X"01",X"04",X"01",X"01", + X"01",X"6C",X"05",X"01",X"01",X"01",X"18",X"04",X"04",X"18",X"05",X"01",X"01",X"01",X"17",X"02", + X"03",X"04",X"16",X"04",X"03",X"01",X"01",X"01",X"76",X"01",X"01",X"01",X"01",X"03",X"01",X"01", + X"01",X"02",X"04",X"02",X"04",X"0E",X"02",X"04",X"02",X"04",X"02",X"04",X"0B",X"01",X"01",X"01", + X"02",X"04",X"02",X"01",X"01",X"01",X"01",X"02",X"02",X"02",X"0E",X"02",X"04",X"02",X"04",X"02", + X"01",X"02",X"01",X"0A",X"01",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"03",X"01",X"01",X"03", + X"04",X"00",X"02",X"40",X"01",X"3E",X"3D",X"10",X"40",X"40",X"0E",X"3D",X"3E",X"10",X"C2",X"43", + X"01",X"3E",X"3D",X"10",X"21",X"A2",X"40",X"11",X"4F",X"3A",X"36",X"14",X"1A",X"A7",X"C8",X"13", + X"85",X"6F",X"D2",X"FA",X"3A",X"24",X"18",X"F2",X"90",X"14",X"94",X"0F",X"98",X"15",X"98",X"15", + X"A0",X"14",X"A0",X"14",X"A4",X"17",X"A4",X"17",X"A8",X"09",X"A8",X"09",X"9C",X"16",X"9C",X"16", + X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16", + X"73",X"20",X"00",X"0C",X"00",X"0A",X"1F",X"00",X"72",X"20",X"FB",X"87",X"00",X"02",X"0F",X"00", + X"36",X"20",X"04",X"8C",X"00",X"00",X"06",X"00",X"36",X"28",X"05",X"8B",X"00",X"00",X"06",X"00", + X"36",X"30",X"06",X"8A",X"00",X"00",X"06",X"00",X"36",X"3C",X"07",X"89",X"00",X"00",X"06",X"00", + X"36",X"48",X"08",X"88",X"00",X"00",X"06",X"00",X"24",X"00",X"06",X"08",X"00",X"00",X"0A",X"00", + X"40",X"70",X"FA",X"10",X"00",X"00",X"0A",X"00",X"70",X"04",X"00",X"00",X"00",X"00",X"08",X"00", + X"42",X"18",X"FD",X"06",X"00",X"01",X"0C",X"00",X"42",X"04",X"03",X"06",X"00",X"01",X"0C",X"00", + X"56",X"0C",X"FF",X"8C",X"00",X"02",X"0F",X"00",X"05",X"00",X"02",X"20",X"00",X"01",X"0C",X"00", + X"41",X"20",X"FF",X"86",X"FE",X"1C",X"0F",X"FF",X"70",X"00",X"01",X"0C",X"00",X"01",X"08",X"00", + X"01",X"02",X"04",X"08",X"10",X"20",X"40",X"80",X"00",X"57",X"5C",X"61",X"67",X"6D",X"74",X"7B", + X"82",X"8A",X"92",X"9A",X"A3",X"AD",X"B8",X"C3",X"D4",X"3B",X"F3",X"3B",X"58",X"3C",X"95",X"3C", + X"DE",X"3C",X"DF",X"3C",X"F1",X"02",X"F2",X"03",X"F3",X"0F",X"F4",X"01",X"82",X"70",X"69",X"82", + X"70",X"69",X"83",X"70",X"6A",X"83",X"70",X"6A",X"82",X"70",X"69",X"82",X"70",X"69",X"89",X"8B", + X"8D",X"8E",X"FF",X"F1",X"02",X"F2",X"03",X"F3",X"0F",X"F4",X"01",X"67",X"50",X"30",X"47",X"30", + X"67",X"50",X"30",X"47",X"30",X"67",X"50",X"30",X"47",X"30",X"4B",X"10",X"4C",X"10",X"4D",X"10", + X"4E",X"10",X"67",X"50",X"30",X"47",X"30",X"67",X"50",X"30",X"47",X"30",X"67",X"50",X"30",X"47", + X"30",X"4B",X"10",X"4C",X"10",X"4D",X"10",X"4E",X"10",X"67",X"50",X"30",X"47",X"30",X"67",X"50", + X"30",X"47",X"30",X"67",X"50",X"30",X"47",X"30",X"4B",X"10",X"4C",X"10",X"4D",X"10",X"4E",X"10", + X"77",X"20",X"4E",X"10",X"4D",X"10",X"4C",X"10",X"4A",X"10",X"47",X"10",X"46",X"10",X"65",X"30", + X"66",X"30",X"67",X"40",X"70",X"F0",X"FB",X"3B",X"F1",X"00",X"F2",X"02",X"F3",X"0F",X"F4",X"00", + X"42",X"50",X"4E",X"50",X"49",X"50",X"46",X"50",X"4E",X"49",X"70",X"66",X"70",X"43",X"50",X"4F", + X"50",X"4A",X"50",X"47",X"50",X"4F",X"4A",X"70",X"67",X"70",X"42",X"50",X"4E",X"50",X"49",X"50", + X"46",X"50",X"4E",X"49",X"70",X"66",X"70",X"45",X"46",X"47",X"50",X"47",X"48",X"49",X"50",X"49", + X"4A",X"4B",X"50",X"6E",X"FF",X"F1",X"01",X"F2",X"01",X"F3",X"0F",X"F4",X"00",X"26",X"67",X"26", + X"67",X"26",X"67",X"23",X"44",X"42",X"47",X"30",X"67",X"2A",X"8B",X"70",X"26",X"67",X"26",X"67", + X"26",X"67",X"23",X"44",X"42",X"47",X"30",X"67",X"23",X"84",X"70",X"26",X"67",X"26",X"67",X"26", + X"67",X"23",X"44",X"42",X"47",X"30",X"67",X"29",X"6A",X"2B",X"6C",X"30",X"2C",X"6D",X"40",X"2B", + X"6C",X"29",X"6A",X"67",X"20",X"29",X"6A",X"40",X"26",X"87",X"70",X"F0",X"9D",X"3C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"96",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"50",X"41",X"43",X"3B",X"4D",X"41",X"4E",X"40", + X"46",X"4F",X"52",X"40",X"40",X"40",X"30",X"30",X"30",X"40",X"5D",X"5E",X"5F",X"2F",X"8E",X"2F", + X"80",X"3A",X"03",X"5C",X"40",X"31",X"39",X"38",X"30",X"40",X"4D",X"49",X"44",X"57",X"41",X"59", + X"40",X"4D",X"46",X"47",X"25",X"43",X"4F",X"25",X"2F",X"83",X"2F",X"80",X"3D",X"03",X"5C",X"40", + X"31",X"39",X"38",X"30",X"40",X"4D",X"49",X"44",X"57",X"41",X"59",X"40",X"4D",X"46",X"47",X"25", + X"43",X"4F",X"25",X"2F",X"83",X"2F",X"80",X"C5",X"02",X"3B",X"53",X"48",X"41",X"44",X"4F",X"57", + X"40",X"40",X"40",X"2F",X"81",X"2F",X"80",X"65",X"01",X"26",X"42",X"4C",X"49",X"4E",X"4B",X"59", + X"26",X"40",X"2F",X"81",X"2F",X"80",X"C8",X"02",X"3B",X"53",X"50",X"45",X"45",X"44",X"59",X"40", + X"40",X"40",X"2F",X"83",X"2F",X"80",X"68",X"01",X"26",X"50",X"49",X"4E",X"4B",X"59",X"26",X"40", + X"40",X"2F",X"83",X"2F",X"80",X"CB",X"02",X"3B",X"42",X"41",X"53",X"48",X"46",X"55",X"4C",X"40", + X"40",X"2F",X"85",X"2F",X"80",X"6B",X"01",X"26",X"49",X"4E",X"4B",X"59",X"26",X"40",X"40",X"40", + X"2F",X"85",X"2F",X"80",X"CE",X"02",X"3B",X"50",X"4F",X"4B",X"45",X"59",X"40",X"40",X"40",X"40", + X"2F",X"87",X"2F",X"80",X"6E",X"01",X"26",X"43",X"4C",X"59",X"44",X"45",X"26",X"40",X"40",X"2F", + X"87",X"2F",X"80",X"C5",X"02",X"3B",X"41",X"41",X"41",X"41",X"41",X"41",X"41",X"41",X"3B",X"2F", + X"81",X"2F",X"80",X"65",X"01",X"26",X"42",X"42",X"42",X"42",X"42",X"42",X"42",X"26",X"2F",X"81", + X"2F",X"80",X"C8",X"02",X"3B",X"43",X"43",X"43",X"43",X"43",X"43",X"43",X"43",X"3B",X"2F",X"83", + X"2F",X"80",X"68",X"01",X"26",X"44",X"44",X"44",X"44",X"44",X"44",X"44",X"26",X"2F",X"83",X"2F", + X"80",X"CB",X"02",X"3B",X"45",X"45",X"45",X"45",X"45",X"45",X"45",X"45",X"3B",X"2F",X"85",X"2F", + X"80",X"6B",X"01",X"26",X"46",X"46",X"46",X"46",X"46",X"46",X"46",X"26",X"2F",X"85",X"2F",X"80", + X"CE",X"02",X"3B",X"47",X"47",X"47",X"47",X"47",X"47",X"47",X"47",X"3B",X"2F",X"87",X"2F",X"80", + X"6E",X"01",X"26",X"48",X"48",X"48",X"48",X"48",X"48",X"48",X"26",X"2F",X"87",X"2F",X"80",X"0C", + X"03",X"50",X"41",X"43",X"40",X"4D",X"41",X"4E",X"2F",X"8F",X"2F",X"80",X"00",X"00",X"00",X"00", + X"00",X"7A",X"03",X"5C",X"40",X"42",X"41",X"4C",X"4C",X"59",X"40",X"4D",X"49",X"44",X"57",X"41", + X"59",X"40",X"31",X"39",X"38",X"30",X"25",X"31",X"39",X"38",X"32",X"2F",X"83",X"2F",X"80",X"00", + X"00",X"7D",X"03",X"5C",X"40",X"42",X"41",X"4C",X"4C",X"59",X"40",X"4D",X"49",X"44",X"57",X"41", + X"59",X"40",X"31",X"39",X"38",X"30",X"25",X"31",X"39",X"38",X"32",X"2F",X"83",X"2F",X"80",X"00", + X"12",X"01",X"82",X"00",X"43",X"2E",X"4D",X"45",X"44",X"4E",X"49",X"43",X"4B",X"00",X"FF",X"55", + X"72",X"2B",X"73",X"2B",X"70",X"2B",X"71",X"11",X"04",X"00",X"2A",X"D9",X"05",X"19",X"22",X"D9", + X"05",X"3E",X"00",X"11",X"D7",X"05",X"CD",X"B2",X"3E",X"B5",X"CA",X"FE",X"2E",X"2A",X"D7",X"05", + X"EB",X"21",X"0A",X"00",X"CD",X"3B",X"3E",X"EB",X"22",X"DB",X"05",X"CD",X"5E",X"3E",X"11",X"D7", + X"05",X"CD",X"B5",X"3E",X"11",X"30",X"00",X"19",X"E5",X"2A",X"D9",X"05",X"C1",X"71",X"2A",X"DB", + X"05",X"22",X"D7",X"05",X"2A",X"D9",X"05",X"2B",X"22",X"D9",X"05",X"C3",X"C1",X"2E",X"C9",X"21", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"99", + X"2D",X"99",X"2D",X"E1",X"1F",X"12",X"24",X"39",X"06",X"F2",X"28",X"F2",X"28",X"00",X"00",X"38", + X"0D",X"26",X"1E",X"BE",X"1F",X"FF",X"FF",X"70",X"03",X"01",X"07",X"00",X"04",X"23",X"00",X"C4", + X"00",X"7D",X"00",X"4C",X"00",X"45",X"00",X"74",X"00",X"36",X"00",X"B7",X"0F",X"97",X"00",X"ED", + X"00",X"55",X"00",X"BC",X"00",X"90",X"00",X"3E",X"00",X"F5",X"0F",X"1A",X"01",X"C1",X"07",X"01", + X"F7",X"07",X"C5",X"54",X"55",X"4C",X"4F",X"53",X"42",X"41",X"5C",X"00",X"A9",X"00",X"C3",X"44", + X"41",X"02",X"10",X"DC",X"88",X"4A",X"C4",X"44",X"41",X"46",X"01",X"DB",X"80",X"09",X"C6",X"41", + X"6D",X"00",X"F9",X"30",X"C4",X"4E",X"41",X"60",X"00",X"DA",X"A0",X"C9",X"49",X"43",X"53",X"41", + X"E6",X"00",X"82",X"D4",X"45",X"53",X"41",X"68",X"00",X"94",X"C2",X"DA",X"00",X"F5",X"00",X"C5", + X"53",X"41",X"42",X"28",X"01",X"A6",X"C3",X"42",X"B5",X"00",X"FB",X"00",X"D4",X"49",X"42",X"9E", + X"00",X"D8",X"40",X"CB",X"43",X"4F",X"4C",X"42",X"88",X"00",X"83",X"C5",X"54",X"59",X"42",X"EF", + X"02",X"84",X"C3",X"C9",X"0F",X"F6",X"01",X"CC",X"4C",X"41",X"43",X"AF",X"00",X"D6",X"CD",X"C6", + X"43",X"43",X"A8",X"00",X"D1",X"3F",X"C4",X"4E",X"43",X"DF",X"00",X"96",X"08",X"CE",X"4F",X"4D", + X"4D",X"4F",X"43",X"0F",X"01",X"A2",X"02",X"CE",X"4F",X"43",X"F3",X"00",X"96",X"20",X"D0",X"43", + X"D3",X"00",X"DA",X"B8",X"C4",X"50",X"43",X"75",X"01",X"D2",X"A9",X"D2",X"44",X"50",X"43",X"02", + X"01",X"D2",X"B9",X"C9",X"50",X"43",X"51",X"01",X"D2",X"A1",X"00",X"30",X"8D",X"00",X"BB",X"D1"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..f07cb2ca --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,15 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is +begin + data <= X"FF"; +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_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/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/build_id.v new file mode 100644 index 00000000..6d3056e6 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171120" +`define BUILD_TIME "205349" diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/dac.vhd new file mode 100644 index 00000000..47b2185e --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 10 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..fec08f5f --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) := (others => '0'); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_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/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_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/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/osd.v b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_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/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..24d19966 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pacman.vhd @@ -0,0 +1,469 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- Copyright (c) Sorgelig - 2017 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 006 Refactoring, 8 sprites support by Sorgelig +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN is + generic( + eight_sprites : boolean := false + ); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0 : in std_logic_vector(7 downto 0); + in1 : in std_logic_vector(7 downto 0); + dipsw1 : in std_logic_vector(7 downto 0); + dipsw2 : in std_logic_vector(7 downto 0); + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of PACMAN is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_int_l : std_logic := '1'; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal hp : std_logic_vector ( 4 downto 0); + signal vp : std_logic_vector ( 4 downto 0); + signal ram_cs : std_logic; + signal ram_data : std_logic_vector(7 downto 0); + signal vram_data : std_logic_vector(7 downto 0); + signal sprite_xy_data : std_logic_vector(7 downto 0); + signal vram_addr : std_logic_vector(11 downto 0); + + signal iodec_spr_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_sn1_l : std_logic; + signal iodec_sn2_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw1_l : std_logic; + signal iodec_dipsw2_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + + signal sn_we : std_logic; + signal wav1,wav2,wav3 : std_logic_vector(7 downto 0); + + component ym2149 is port + ( + CLK : in std_logic; + CE : in std_logic; + RESET : in std_logic; + BDIR : in std_logic; + BC : in std_logic; + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + CHANNEL_A: out std_logic_vector(7 downto 0); + CHANNEL_B: out std_logic_vector(7 downto 0); + CHANNEL_C: out std_logic_vector(7 downto 0); + + SEL : in std_logic; + MODE : in std_logic; + IOA_in : in std_logic_vector(7 downto 0); + IOA_out : out std_logic_vector(7 downto 0); + + IOB_in : in std_logic_vector(7 downto 0); + IOB_out : out std_logic_vector(7 downto 0) + ); + end component; + +begin + +-- +-- video timing +-- +p_hvcnt : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + if hcnt = "111111111" then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + if do_hsync then + if vcnt = "111111111" then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; +end process; + +vsync <= not vcnt(8); +do_hsync <= (hcnt = "010101111"); -- 0AF + +p_sync : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + + if (hcnt = "010001111") and not eight_sprites then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") and not eight_sprites then + hblank <= '0'; -- 0EF + elsif (hcnt = "111111111") and eight_sprites then + hblank <= '1'; + elsif (hcnt = "011111111") and eight_sprites then + hblank <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; +end process; + +-- +-- cpu +-- +p_irq_req_watchdog : process + variable rising_vblank : boolean; +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + --watchdog_reset_l <= not reset; + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + end if; +end process; + +u_cpu : entity work.T80sed +port map +( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => hcnt(0) and ena_6, + WAIT_n => sync_bus_wreq_l, + INT_n => cpu_int_l, + NMI_n => '1', + BUSRQ_n => '1', + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out +); + +-- rom 0x0000 - 0x3FFF +-- syncbus 0x4000 - 0x7FFF +sync_bus_cs_l <= '0' when cpu_mreq_l = '0' and cpu_rfsh_l = '1' and cpu_addr(14) = '1' else '1'; +sync_bus_wreq_l <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '1' and cpu_rd_l = '0' else '1'; +sync_bus_stb <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '0' else '1'; +sync_bus_r_w_l <= '0' when sync_bus_stb = '0' and cpu_rd_l = '1' else '1'; + +-- +-- sync bus custom ic +-- +p_sync_bus_reg : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; +end process; + + +-- WRITE +-- out_l 0x5000 - 0x503F control space +-- sn1_l 0x5040 - 0x504F sound +-- sn2_l 0x5050 - 0x505F sound +-- spr_l 0x5060 - 0x506F sprite +-- wdr_l 0x50C0 - 0x50FF watchdog reset +iodec_out_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_sn1_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"4" else '1'; +iodec_sn2_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"5" else '1'; +iodec_spr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"6" else '1'; +iodec_wdr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +-- READ +-- in0_l 0x5000 - 0x503F in port 0 +-- in1_l 0x5040 - 0x507F in port 1 +-- dipsw_l 0x5080 - 0x50BF dip switches +iodec_in0_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_in1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"01" else '1'; +iodec_dipsw1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"10" else '1'; +iodec_dipsw2_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +p_control_reg : process +begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + elsif (iodec_out_l = '0') then + control_reg(to_integer(unsigned(cpu_addr(2 downto 0)))) <= cpu_data_out(0); + end if; + end if; +end process; + +cpu_data_in <= cpu_vec_reg when (cpu_iorq_l = '0') and (cpu_m1_l = '0') else + sync_bus_reg when sync_bus_wreq_l = '0' else + program_rom_dinl when cpu_addr(15 downto 14) = "00" else -- ROM at 0000 - 3fff + program_rom_dinh when cpu_addr(15 downto 14) = "10" else -- ROM at 8000 - bfff + in0 when iodec_in0_l = '0' else + in1 when iodec_in1_l = '0' else + dipsw1 when iodec_dipsw1_l = '0' else + dipsw2 when iodec_dipsw2_l = '0' else + ram_data; + +u_program_rom : entity work.ROM_PGM_0 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl +); + +u_program_rom1 : entity work.ROM_PGM_1 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinh +); + +ram_cs <= '1' when cpu_addr(15 downto 12) = X"4" else '0'; + +u_rams : work.dpram generic map (12,8) +port map +( + clock_a => clk, + enable_a => ena_6, + wren_a => not sync_bus_r_w_l and ram_cs, + address_a => cpu_addr(11 downto 0), + data_a => cpu_data_out, -- cpu only source of ram data + q_a => ram_data, + + clock_b => clk, + address_b => vram_addr(11 downto 0), + q_b => vram_data +); + +-- +-- video subsystem +-- + +-- vram addr custom ic +hp <= hcnt(7 downto 3) when control_reg(3) = '0' else not hcnt(7 downto 3); +vp <= vcnt(7 downto 3) when control_reg(3) = '0' else not vcnt(7 downto 3); +vram_addr <= '0' & hcnt(2) & vp & hp when hcnt(8)='1' else + x"FF" & hcnt(6 downto 4) & hcnt(2) when hblank = '1' else + '0' & hcnt(2) & hp(3) & hp(3) & hp(3) & hp(3) & hp(0) & vp; + +sprite_xy_ram : work.dpram generic map (4,8) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not iodec_spr_l, + address_a => cpu_addr(3 downto 0), + data_a => cpu_data_out, + + clock_b => CLK, + address_b => vram_addr(3 downto 0), + q_b => sprite_xy_data +); + +u_video : entity work.PACMAN_VIDEO +port map +( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + vram_data => vram_data, + sprite_xy => sprite_xy_data, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + O_HBLANK => O_HBLANK, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk +); + +O_HSYNC <= hSync; +O_VSYNC <= vSync; +O_VBLANK <= vblank; + +-- +-- +-- audio subsystem +-- +u_audio : entity work.PACMAN_AUDIO +port map ( + I_HCNT => hcnt, + -- + I_AB => cpu_addr(11 downto 0), + I_DB => cpu_data_out, + -- + I_WR1_L => iodec_sn2_l, + I_WR0_L => iodec_sn1_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk +); + +end RTL; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..91313469 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not I_WR1_L, + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => rom3m(1), + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..1552d65b --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pacman_video.vhd @@ -0,0 +1,279 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 004 Refactoring, 8 sprite support by Sorgelig +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VIDEO is + generic( + alt_transp : boolean := false + ); + port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + vram_data : in std_logic_vector(7 downto 0); + sprite_xy : in std_logic_vector(7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + O_HBLANK : out std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_VIDEO is + + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal sprite_data : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + signal obj_on2 : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_op_t1 : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal sprite_ram_ip : std_logic_vector(5 downto 0); + signal sprite_ram_op : std_logic_vector(5 downto 0); + signal sprite_addr : std_logic_vector(7 downto 0); + signal sprite_addr_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(5 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + +dr <= not sprite_xy when I_HBLANK = '1' else "11111111"; -- pull ups on board + +p_char_regs : process + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; +begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & not I_HBLANK); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + sprite_data <= vram_data; -- character reg + end if; +end process; + +xflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(1); +yflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(0); + +obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + +ca(12) <= char_hblank_reg; +ca(11 downto 6) <= sprite_data(7 downto 2); +ca(5) <= sprite_data(1) when char_hblank_reg = '0' else char_sum_reg(3) xor xflip; +ca(4) <= sprite_data(0) when char_hblank_reg = '0' else I_HCNT(3); +ca(3) <= I_HCNT(2) xor yflip; +ca(2) <= char_sum_reg(2) xor xflip; +ca(1) <= char_sum_reg(1) xor xflip; +ca(0) <= char_sum_reg(0) xor xflip; + +-- char roms +char_rom_5ef : entity work.GFX1 +port map +( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf +); + +p_char_shift : process +begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_buf(7 downto 4); -- load + shift_regl <= char_rom_5ef_buf(3 downto 0); + when others => null; + end case; + end if; +end process; + +shift_sel(0) <= I_HCNT(0) and I_HCNT(1) when vout_yflip = '0' else '1'; +shift_sel(1) <= '1' when vout_yflip = '0' else I_HCNT(0) and I_HCNT(1); +shift_op(0) <= shift_regl(3) when vout_yflip = '0' else shift_regl(0); +shift_op(1) <= shift_regu(3) when vout_yflip = '0' else shift_regu(0); + +p_video_out_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= vram_data(4 downto 0); -- colour reg + end if; + + if I_HCNT(3 downto 0) = "0111" and (vout_hblank='1' or I_HBLANK='1' or vout_obj_on='0') then + sprite_addr <= dr; + else + sprite_addr <= sprite_addr + "1"; + end if; + end if; +end process; + +col_rom_4a : entity work.PROM4_DST +port map +( + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a +); + +u_sprite_ram : work.dpram generic map (8,6) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => vout_obj_on_t1, + address_a => sprite_addr_t1, + data_a => sprite_ram_ip, + + clock_b => CLK, + enable_b => ENA_6, + address_b => sprite_addr, + q_b => sprite_ram_op +); + +sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "000000"; +video_op_sel <= '0' when alt_transp and (sprite_ram_reg(1 downto 0) = "00") else + '0' when not alt_transp and (sprite_ram_reg(5 downto 2) = "0000") else + '1'; + +p_sprite_ram_ip_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + sprite_addr_t1 <= sprite_addr; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + shift_op_t1 <= shift_op; + end if; +end process; + +sprite_ram_ip <= (others => '0') when vout_hblank_t1 = '0' else + sprite_ram_reg when video_op_sel = '1' else + lut_4a_t1(3 downto 0) & shift_op_t1; + +final_col <= (others => '0') when (vout_hblank = '1') or (I_VBLANK = '1') else + sprite_ram_reg(5 downto 2) when video_op_sel = '1' else + lut_4a(3 downto 0); + +-- assign video outputs from color LUT PROM +col_rom_7f : entity work.PROM7_DST +port map +( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE +); + +O_HBLANK <= vout_hblank and vout_hblank_t1; + +end architecture; diff --git a/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_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/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pll.v b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pll.v new file mode 100644 index 00000000..60297687 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 8, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "9" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "9" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/PacmanPlus_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/PacmanPlus_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/Arcade/Pacman Hardware/Pacman_MiST/Pacman.qpf b/Arcade/Pacman Hardware/Pacman_MiST/Pacman.qpf new file mode 100644 index 00000000..787ace51 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/Pacman.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Pacman" diff --git a/Arcade/Pacman Hardware/Pacman_MiST/Pacman.qsf b/Arcade/Pacman Hardware/Pacman_MiST/Pacman.qsf new file mode 100644 index 00000000..09a4452e --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/Pacman.qsf @@ -0,0 +1,174 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 17:05:52 November 20, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Pacman_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name VERILOG_FILE rtl/osd.v +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 QIP_FILE rtl/pll.qip +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/ROM/GFX1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_vram_addr.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Pacman.sv + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Pacman +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Pacman) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Pacman) +# ------------------ +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/Pacman_MiST/Pacman.srf b/Arcade/Pacman Hardware/Pacman_MiST/Pacman.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/Pacman.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Pacman Hardware/Pacman_MiST/README.txt b/Arcade/Pacman Hardware/Pacman_MiST/README.txt new file mode 100644 index 00000000..90dabc41 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Pacman port to MiST by Gehstock +-- 09 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/Pacman_MiST/Release/Pacman(PACE).rbf b/Arcade/Pacman Hardware/Pacman_MiST/Release/Pacman(PACE).rbf new file mode 100644 index 00000000..1181c186 Binary files /dev/null and b/Arcade/Pacman Hardware/Pacman_MiST/Release/Pacman(PACE).rbf differ diff --git a/Arcade/Pacman Hardware/Pacman_MiST/Release/Pacman.rbf b/Arcade/Pacman Hardware/Pacman_MiST/Release/Pacman.rbf new file mode 100644 index 00000000..9602f3b3 Binary files /dev/null and b/Arcade/Pacman Hardware/Pacman_MiST/Release/Pacman.rbf differ diff --git a/Arcade/Pacman Hardware/Pacman_MiST/clean.bat b/Arcade/Pacman Hardware/Pacman_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_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/Arcade/Pacman Hardware/Pacman_MiST/rtl/Pacman.sv b/Arcade/Pacman Hardware/Pacman_MiST/rtl/Pacman.sv new file mode 100644 index 00000000..8b6f31c0 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/Pacman.sv @@ -0,0 +1,201 @@ +//============================================================================ +// Arcade: Pacman +// +// Version for MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Pacman +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Pacman;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys, clk_snd; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + +reg ce_1m79; +always @(posedge clk_sys) begin + reg [3:0] div; + + div <= div + 1'd1; + if(div == 12) div <= 0; + ce_1m79 <= !div; +end + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [9:0] audio; +assign LED = 1; +wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(340), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +wire m_bomb = kbjoy[8]; +wire m_Serv = kbjoy[9]; + +pacmant pacmant +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .I_JOYSTICK_A(~{m_fire,m_right,m_left,m_down,m_up}), + .I_JOYSTICK_B(5'b11111), + + .I_SW({m_start2, m_coin, 1'b0, m_start1}), + .RESET(RESET | status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..4203ec94 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"CC",X"EE",X"11",X"11",X"33",X"EE",X"CC",X"00",X"11",X"33",X"66",X"44",X"44",X"33",X"11",X"00", + X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00",X"00",X"00",X"77",X"77",X"22",X"00",X"00",X"00", + X"11",X"99",X"DD",X"DD",X"FF",X"77",X"33",X"00",X"33",X"77",X"55",X"44",X"44",X"66",X"22",X"00", + X"66",X"FF",X"99",X"99",X"99",X"33",X"22",X"00",X"44",X"66",X"77",X"55",X"44",X"44",X"00",X"00", + X"44",X"FF",X"FF",X"44",X"44",X"CC",X"CC",X"00",X"00",X"77",X"77",X"66",X"33",X"11",X"00",X"00", + X"EE",X"FF",X"11",X"11",X"11",X"33",X"22",X"00",X"00",X"55",X"55",X"55",X"55",X"77",X"77",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"EE",X"00",X"00",X"44",X"44",X"44",X"66",X"33",X"11",X"00", + X"00",X"00",X"88",X"FF",X"77",X"00",X"00",X"00",X"66",X"77",X"55",X"44",X"44",X"66",X"66",X"00", + X"66",X"77",X"DD",X"DD",X"99",X"99",X"66",X"00",X"00",X"33",X"44",X"44",X"55",X"77",X"33",X"00", + X"CC",X"EE",X"BB",X"99",X"99",X"99",X"00",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"FF",X"FF",X"44",X"44",X"44",X"FF",X"FF",X"00",X"11",X"33",X"66",X"44",X"66",X"33",X"11",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"77",X"00", + X"22",X"33",X"11",X"11",X"33",X"EE",X"CC",X"00",X"22",X"66",X"44",X"44",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"33",X"11",X"11",X"FF",X"FF",X"00",X"11",X"33",X"66",X"44",X"44",X"77",X"77",X"00", + X"11",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00",X"44",X"44",X"44",X"44",X"77",X"77",X"00",X"00", + X"00",X"88",X"88",X"88",X"88",X"FF",X"FF",X"00",X"44",X"44",X"44",X"44",X"44",X"77",X"77",X"00", + X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00", + X"00",X"00",X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"03", + X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"EE",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33", + X"EE",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"33",X"33",X"33",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"CC",X"EE",X"FF",X"FF",X"FF", + X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"77",X"33",X"22",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"DD",X"00",X"EE",X"DD",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"DD",X"00",X"EE",X"DD",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"77",X"FF",X"CC",X"CC",X"CC",X"CC",X"FF",X"FF", + X"BB",X"BB",X"BB",X"BB",X"FF",X"FF",X"00",X"00",X"DD",X"DD",X"DD",X"DD",X"DD",X"11",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"CC",X"CC",X"FF",X"FF",X"00",X"00",X"77",X"FF", + X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"00",X"00",X"77",X"FF",X"CC",X"CC",X"FF",X"FF", + X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"EE",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"77", + X"33",X"33",X"33",X"33",X"FF",X"EE",X"00",X"00",X"CC",X"CC",X"CC",X"CC",X"FF",X"77",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00",X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00", + X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00",X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00", + X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"00",X"00",X"88",X"44",X"22",X"00",X"88",X"44",X"22",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"FF", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00",X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00", + X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00",X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00", + X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00",X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00", + X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00",X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"88",X"22",X"00",X"00",X"00",X"CC",X"EE",X"FF",X"33",X"00",X"00",X"00", + X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC",X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33", + X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"EE",X"22",X"22",X"00",X"11",X"22",X"22",X"22",X"33", + X"AA",X"AA",X"AA",X"22",X"00",X"00",X"00",X"EE",X"22",X"22",X"22",X"11",X"00",X"22",X"22",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"33",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"00", + X"33",X"33",X"77",X"77",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE", + X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"33",X"33",X"33",X"77",X"77",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE", + X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"11",X"33",X"33",X"33",X"33",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00", + X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CE",X"EE",X"EE",X"EE",X"66",X"22",X"22",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"CC",X"00",X"22",X"EE",X"22",X"00",X"00",X"88",X"77",X"00",X"00",X"FF",X"44",X"00",X"00", + X"22",X"CC",X"00",X"CC",X"22",X"22",X"22",X"44",X"88",X"77",X"00",X"88",X"DD",X"AA",X"88",X"88", + X"22",X"CC",X"00",X"CC",X"22",X"22",X"22",X"44",X"88",X"77",X"00",X"99",X"AA",X"AA",X"AA",X"EE", + X"22",X"CC",X"00",X"00",X"00",X"EE",X"00",X"00",X"88",X"77",X"00",X"CC",X"BB",X"88",X"88",X"CC", + X"00",X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"00",X"77",X"88",X"88",X"77",X"00",X"77",X"88", + X"CC",X"22",X"22",X"CC",X"00",X"22",X"EE",X"22",X"77",X"88",X"88",X"77",X"00",X"00",X"FF",X"44", + X"66",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"66",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"22",X"CC",X"00",X"22",X"22",X"AA",X"77",X"88",X"88",X"77",X"00",X"66",X"99",X"88", + X"22",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"22",X"77",X"88",X"88",X"77",X"00",X"88",X"DD",X"AA", + X"22",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"EE",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"22",X"CC",X"00",X"CC",X"22",X"22",X"77",X"88",X"88",X"77",X"00",X"99",X"AA",X"AA", + X"22",X"CC",X"00",X"CC",X"22",X"22",X"CC",X"00",X"88",X"77",X"00",X"77",X"88",X"88",X"77",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"20",X"90",X"80",X"00",X"00",X"30",X"30",X"10",X"10",X"00",X"00", + X"41",X"21",X"12",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"0C",X"0C",X"8C",X"0C",X"00",X"00",X"00",X"07",X"0F",X"0F",X"C3",X"1F", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"08",X"0F",X"2F",X"4F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"07",X"4F",X"0F",X"A7",X"87",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"D3",X"87",X"97",X"0F",X"2F",X"07",X"00",X"00",X"33",X"10",X"10",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"08",X"0E",X"8E",X"1F",X"0F", + X"0C",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"4F",X"1F",X"0F",X"4F",X"0E",X"08",X"00",X"00", + X"00",X"00",X"01",X"03",X"87",X"87",X"87",X"47",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"10", + X"EF",X"47",X"07",X"07",X"03",X"01",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"0C",X"0C",X"08",X"08",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"01",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"02", + X"0F",X"0B",X"0C",X"0F",X"01",X"00",X"00",X"00",X"02",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0C",X"68",X"68",X"68",X"6E",X"6E",X"00",X"00",X"03",X"0F",X"0F",X"0F",X"0F",X"0F", + X"68",X"68",X"68",X"68",X"68",X"0C",X"00",X"00",X"0F",X"0F",X"07",X"0C",X"0F",X"03",X"00",X"00", + X"00",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"20", + X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"10",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"0C",X"0F",X"CF",X"2F",X"0F",X"0F", + X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"00",X"00", + X"00",X"00",X"00",X"30",X"52",X"61",X"F1",X"BC",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"03", + X"D2",X"63",X"52",X"30",X"00",X"00",X"00",X"00",X"02",X"02",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"48",X"84",X"C2",X"E0",X"00",X"00",X"E0",X"B4",X"7C",X"E1",X"5B",X"A5", + X"68",X"84",X"C0",X"80",X"00",X"00",X"00",X"00",X"F5",X"E1",X"5A",X"BE",X"E0",X"00",X"00",X"00", + X"00",X"00",X"00",X"0F",X"33",X"31",X"71",X"F3",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F3",X"71",X"31",X"33",X"0F",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"8E",X"CF",X"88", + X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"CF",X"8E",X"0C",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"F1",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"20", + X"E0",X"F1",X"E0",X"E0",X"00",X"00",X"00",X"00",X"20",X"20",X"10",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"DD", + X"22",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"EF",X"67",X"77",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"23",X"67",X"77",X"FF",X"FF",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"00",X"79",X"69",X"0F",X"1F",X"FF",X"FF",X"33",X"00", + X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"33",X"79",X"69",X"0F",X"1F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"88",X"00",X"88",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"88",X"00",X"88",X"CC",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"00",X"33",X"74",X"74",X"F8",X"F9",X"F9",X"F9", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"FF",X"F9",X"F9",X"F9",X"F8",X"74",X"74",X"33",X"00", + X"FF",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"FF", + X"00",X"CC",X"E2",X"E2",X"F1",X"F9",X"F9",X"F9",X"FF",X"F0",X"F0",X"FE",X"11",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"F1",X"E2",X"E2",X"CC",X"00",X"00",X"00",X"00",X"11",X"FE",X"F0",X"F0",X"FF", + X"FF",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"FF",X"F0",X"F0",X"FE",X"11",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"11",X"FE",X"F0",X"F0",X"FF", + X"FF",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"FF",X"F1",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9", + X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"E2",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F1",X"F1",X"E2",X"E2",X"CC",X"00", + X"00",X"33",X"74",X"74",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"74",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"33",X"74",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"FF",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"E2",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"F8",X"F8",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F9",X"F8",X"F8",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"F1",X"F1",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"F1",X"F1",X"FF",X"00",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1", + X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"11",X"FE",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F0",X"F0",X"F0",X"FE",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"33",X"74",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"E2",X"F1",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"F1",X"E2",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"F7",X"F0",X"F0",X"F0",X"F9",X"F9",X"F9",X"F8",X"F8",X"F8",X"F8",X"F8", + X"F0",X"F0",X"F0",X"F7",X"88",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"F8",X"F8",X"F9",X"F9",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"0C",X"0C",X"8C",X"0C",X"00",X"00",X"30",X"30",X"10",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"C0",X"20",X"90",X"80",X"00",X"00",X"00",X"07",X"0F",X"0F",X"C3",X"1F", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"41",X"21",X"12",X"03",X"03",X"01",X"00",X"00",X"07",X"08",X"0F",X"2F",X"4F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"00",X"00",X"07",X"4F",X"0F",X"A7",X"87",X"00",X"00",X"00",X"08",X"0E",X"8E",X"1F",X"0F", + X"0C",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"33",X"10",X"10",X"10",X"00",X"00",X"00",X"00", + X"D3",X"87",X"97",X"0F",X"2F",X"07",X"00",X"00",X"4F",X"1F",X"0F",X"4F",X"0E",X"08",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"10", + X"00",X"00",X"01",X"03",X"87",X"87",X"87",X"47",X"00",X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"0C",X"0C",X"08",X"08",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EF",X"47",X"07",X"07",X"03",X"01",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"00", + X"00",X"00",X"0C",X"68",X"68",X"68",X"6E",X"6E",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"02", + X"00",X"00",X"00",X"01",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"03",X"0F",X"0F",X"0F",X"0F",X"0F", + X"68",X"68",X"68",X"68",X"68",X"0C",X"00",X"00",X"02",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0B",X"0C",X"0F",X"01",X"00",X"00",X"00",X"0F",X"0F",X"07",X"0C",X"0F",X"03",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"20", + X"00",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0C",X"0F",X"CF",X"2F",X"0F",X"0F", + X"08",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"10",X"00",X"01",X"01",X"01",X"00",X"00",X"00", + X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"00",X"00", + X"00",X"00",X"00",X"80",X"48",X"84",X"C2",X"E0",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"03", + X"00",X"00",X"00",X"30",X"52",X"61",X"F1",X"BC",X"00",X"00",X"E0",X"B4",X"7C",X"E1",X"5B",X"A5", + X"68",X"84",X"C0",X"80",X"00",X"00",X"00",X"00",X"02",X"02",X"04",X"00",X"00",X"00",X"00",X"00", + X"D2",X"63",X"52",X"30",X"00",X"00",X"00",X"00",X"F5",X"E1",X"5A",X"BE",X"E0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0F",X"33",X"31",X"71",X"F3",X"00",X"00",X"00",X"08",X"0C",X"8E",X"CF",X"88", + X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F3",X"71",X"31",X"33",X"0F",X"00",X"00",X"FF",X"88",X"CF",X"8E",X"0C",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"20", + X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"F1",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"DD", + X"22",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"10",X"10",X"00",X"00",X"00",X"00", + X"E0",X"F1",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"EE",X"CC",X"88",X"8C",X"4E",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"00",X"7F",X"BF",X"7F",X"AF",X"5F",X"7F",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"11",X"00",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"8C",X"08",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"00",X"7F",X"BF",X"7F",X"AF",X"5F",X"7F",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"11",X"00",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"EE",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"60",X"69",X"0F",X"71",X"69",X"0F",X"17",X"00",X"00",X"00",X"88",X"EE",X"FF",X"FF",X"FF", + X"CC",X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"77",X"33",X"00",X"00",X"00", + X"00",X"EE",X"EE",X"EE",X"CC",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"60",X"69",X"0F",X"71",X"69",X"0F",X"17",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"33",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"44",X"EE",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"00", + X"EE",X"66",X"66",X"EE",X"EE",X"EE",X"66",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"44",X"EE",X"EE",X"EE",X"EE",X"66",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"66",X"66",X"66",X"66",X"EE",X"EE",X"66",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"08",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"03", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"07",X"03",X"01",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"07",X"0F",X"0F",X"0F",X"0F", + X"00",X"08",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"0E", + X"0F",X"0F",X"0F",X"0F",X"0E",X"0E",X"0E",X"0C",X"00",X"01",X"03",X"07",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"0F",X"0F",X"0F",X"0E",X"0C",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"00",X"01",X"03",X"07",X"0F",X"0F",X"0F",X"0F", + X"0E",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"03", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"07",X"03",X"01",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03", + X"00",X"00",X"01",X"03",X"07",X"0F",X"0F",X"0F",X"00",X"00",X"08",X"08",X"0C",X"0C",X"0E",X"0E", + X"00",X"00",X"00",X"08",X"08",X"08",X"0C",X"0C",X"03",X"07",X"07",X"07",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0E",X"0E",X"0E",X"0C",X"07",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"0F",X"0F",X"0F",X"0E",X"0C",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"03",X"03",X"07",X"07",X"00",X"00",X"08",X"0C",X"0E",X"0F",X"0F",X"0F", + X"0C",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"01",X"01",X"01",X"03",X"03", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"03", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"07",X"03",X"01",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03", + X"00",X"00",X"01",X"03",X"07",X"0F",X"0F",X"0F",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"03",X"07",X"07",X"07",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0E",X"0E",X"0E",X"0C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00",X"0F",X"0F",X"0F",X"0E",X"0C",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"08",X"0C",X"0E",X"0F",X"0F",X"0F", + X"0C",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"E0",X"C0",X"80",X"C0",X"E0",X"E0",X"80",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70", + X"00",X"10",X"F0",X"F0",X"F0",X"F3",X"F3",X"F0",X"00",X"F0",X"F1",X"F2",X"F2",X"F1",X"F1",X"F2", + X"80",X"E0",X"E0",X"C0",X"80",X"C0",X"E0",X"00",X"70",X"70",X"30",X"30",X"10",X"00",X"00",X"00", + X"F0",X"F3",X"F3",X"F0",X"F0",X"F0",X"10",X"00",X"F2",X"F1",X"F1",X"F2",X"F2",X"F1",X"F0",X"00", + X"00",X"C0",X"E0",X"E0",X"C0",X"80",X"C0",X"E0",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70", + X"00",X"10",X"F0",X"F0",X"F0",X"F3",X"F3",X"F0",X"00",X"F0",X"F1",X"F2",X"F2",X"F1",X"F1",X"F2", + X"E0",X"C0",X"80",X"C0",X"E0",X"E0",X"C0",X"00",X"70",X"70",X"30",X"30",X"10",X"00",X"00",X"00", + X"F0",X"F3",X"F3",X"F0",X"F0",X"F0",X"10",X"00",X"F2",X"F1",X"F1",X"F2",X"F2",X"F1",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"00",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"11",X"00",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"00",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"BC",X"3C",X"0F",X"8F",X"FF",X"FF",X"11",X"00",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"00",X"FF",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"11",X"00",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"00",X"FF",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"CF",X"8F",X"8F",X"CF",X"FF",X"11",X"00",X"FF",X"7F",X"F3",X"F3",X"7F",X"FF",X"FF",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"00",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"11",X"00",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"11",X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"00",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"FF",X"FF",X"8F",X"0F",X"3C",X"BC",X"11",X"00",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"FF",X"00", + X"00",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"88",X"00",X"00",X"00",X"01",X"30",X"30",X"67",X"77", + X"00",X"11",X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"67",X"30",X"30",X"01",X"00",X"00",X"00", + X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"CC",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"00",X"00",X"01",X"30",X"30",X"67",X"77", + X"00",X"11",X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"CC",X"00",X"77",X"67",X"30",X"30",X"01",X"00",X"00",X"00", + X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"06",X"09",X"08",X"08",X"06",X"02",X"0C",X"00",X"02",X"02",X"0A",X"06",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"00",X"0F",X"04",X"02",X"01",X"02",X"0C",X"00",X"08",X"0E",X"08",X"08",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"07",X"00",X"06",X"09",X"09",X"09",X"06",X"02",X"0C",X"00",X"0C",X"02",X"02",X"02",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"0C",X"02",X"02",X"0C",X"00",X"0C",X"02",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"00",X"09",X"09",X"09",X"07",X"00",X"0F",X"0C",X"00",X"0C",X"02",X"02",X"0C",X"00",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"77", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"77",X"00",X"33",X"77",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"77",X"FF",X"FF",X"FF",X"EE",X"CC",X"00",X"00",X"CC",X"CC",X"88",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"88",X"CC",X"EE",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"CC",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"33",X"33",X"77",X"77",X"77", + X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"EE",X"EE",X"EE",X"FF",X"FF",X"FF",X"77",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"EE",X"00", + X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"00",X"00",X"00",X"11",X"33",X"33",X"77",X"77", + X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00", + X"01",X"02",X"04",X"0C",X"08",X"84",X"84",X"08",X"01",X"00",X"00",X"00",X"09",X"05",X"03",X"00", + X"00",X"08",X"07",X"78",X"FA",X"F5",X"EA",X"7B",X"00",X"00",X"00",X"0B",X"B5",X"EA",X"77",X"32", + X"08",X"84",X"84",X"08",X"0C",X"04",X"02",X"01",X"00",X"01",X"01",X"01",X"03",X"04",X"08",X"00", + X"26",X"5D",X"B2",X"7C",X"07",X"00",X"00",X"00",X"72",X"E6",X"CC",X"FC",X"E3",X"0E",X"00",X"00", + X"00",X"60",X"60",X"E0",X"E0",X"E8",X"CC",X"88",X"00",X"00",X"00",X"01",X"00",X"00",X"67",X"77", + X"00",X"11",X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"00",X"00",X"F0",X"F8",X"FD",X"FF",X"FF",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"67",X"00",X"00",X"01",X"00",X"00",X"00", + X"FF",X"3F",X"1F",X"1F",X"3F",X"FF",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"60",X"60",X"E0",X"E0",X"E8",X"CC",X"88",X"00",X"00",X"00",X"11",X"23",X"23",X"77",X"77", + X"00",X"11",X"FF",X"1D",X"0C",X"0F",X"1F",X"FF",X"00",X"00",X"F0",X"F8",X"FD",X"FF",X"FF",X"FF", + X"88",X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"00",X"77",X"77",X"23",X"23",X"11",X"00",X"00",X"00", + X"FF",X"1D",X"0C",X"0F",X"1F",X"FF",X"11",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"FF",X"77",X"33",X"11",X"00",X"00",X"00",X"CC",X"EE",X"EE",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00", + X"00",X"11",X"33",X"77",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"EE",X"EE",X"CC",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"77",X"FF",X"77",X"77",X"33",X"11",X"11",X"00",X"00",X"CC",X"EE",X"EE",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"33",X"77",X"77",X"FF",X"77",X"EE",X"FF",X"FF",X"FF",X"EE",X"EE",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"33",X"33",X"33",X"11",X"11",X"11",X"00",X"00",X"88",X"CC",X"EE",X"EE",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"11",X"11",X"33",X"33",X"33",X"EE",X"FF",X"FF",X"FF",X"EE",X"EE",X"CC",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"CC",X"EE",X"EE",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"11",X"EE",X"FF",X"FF",X"FF",X"FF",X"EE",X"EE",X"CC", + X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"77",X"77",X"77",X"FF",X"FF",X"FF", + X"00",X"88",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",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"77",X"77",X"77",X"66", + X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"33",X"77",X"77",X"FF", + X"00",X"88",X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"77",X"77",X"33",X"33",X"33",X"11", + X"00",X"00",X"CC",X"EE",X"EE",X"EE",X"EE",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"77", + X"88",X"CC",X"EE",X"EE",X"EE",X"EE",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"33",X"33",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"44",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"77", + X"CC",X"EE",X"EE",X"EE",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"33",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33", + X"CC",X"EE",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"33",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"22",X"44",X"11",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"11",X"00",X"00",X"00",X"11",X"99",X"44",X"00",X"00", + X"00",X"22",X"11",X"88",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"22",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"22",X"22",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..4bfa195f --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"03", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"05",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"07", + X"00",X"00",X"00",X"00",X"00",X"0B",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"0E",X"00",X"01",X"0C",X"0F", + X"00",X"0E",X"00",X"0B",X"00",X"0C",X"0B",X"0E",X"00",X"0C",X"0F",X"01",X"00",X"00",X"00",X"00", + X"00",X"01",X"02",X"0F",X"00",X"07",X"0C",X"02",X"00",X"09",X"06",X"0F",X"00",X"0D",X"0C",X"0F", + X"00",X"05",X"03",X"09",X"00",X"0F",X"0B",X"00",X"00",X"0E",X"00",X"0B",X"00",X"0E",X"00",X"0B", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0E",X"01",X"00",X"0F",X"0B",X"0E",X"00",X"0E",X"00",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..88b2ecb3 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"66",X"EF",X"00",X"F8",X"EA",X"6F",X"00",X"3F",X"00",X"C9",X"38",X"AA",X"AF",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..21b4691d --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F3",X"3E",X"00",X"ED",X"47",X"C3",X"0B",X"23",X"77",X"23",X"10",X"FC",X"C9",X"C3",X"0E",X"07", + X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"C9",X"78",X"87",X"D7",X"5F",X"23",X"56",X"EB",X"C9", + X"E1",X"87",X"D7",X"5F",X"23",X"56",X"EB",X"E9",X"E1",X"46",X"23",X"4E",X"23",X"E5",X"18",X"12", + X"11",X"90",X"4C",X"06",X"10",X"C3",X"51",X"00",X"C3",X"3C",X"0F",X"50",X"32",X"07",X"50",X"C3", + X"38",X"00",X"2A",X"80",X"4C",X"70",X"2C",X"71",X"2C",X"20",X"02",X"2E",X"C0",X"22",X"80",X"4C", + X"C9",X"1A",X"A7",X"28",X"06",X"1C",X"1C",X"1C",X"10",X"F7",X"C9",X"E1",X"06",X"03",X"7E",X"12", + X"23",X"1C",X"10",X"FA",X"E9",X"C3",X"2D",X"20",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07", + X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"12",X"13",X"14",X"01",X"03",X"04", + X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"14",X"F5",X"32",X"C0", + X"50",X"AF",X"32",X"00",X"50",X"F3",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5",X"21",X"8C",X"4E", + X"11",X"50",X"50",X"01",X"10",X"00",X"ED",X"B0",X"3A",X"CC",X"4E",X"A7",X"3A",X"CF",X"4E",X"20", + X"03",X"3A",X"9F",X"4E",X"32",X"45",X"50",X"3A",X"DC",X"4E",X"A7",X"3A",X"DF",X"4E",X"20",X"03", + X"3A",X"AF",X"4E",X"32",X"4A",X"50",X"3A",X"EC",X"4E",X"A7",X"3A",X"EF",X"4E",X"20",X"03",X"3A", + X"BF",X"4E",X"32",X"4F",X"50",X"21",X"02",X"4C",X"11",X"22",X"4C",X"01",X"1C",X"00",X"ED",X"B0", + X"DD",X"21",X"20",X"4C",X"DD",X"7E",X"02",X"07",X"07",X"DD",X"77",X"02",X"DD",X"7E",X"04",X"07", + X"07",X"DD",X"77",X"04",X"DD",X"7E",X"06",X"07",X"07",X"DD",X"77",X"06",X"DD",X"7E",X"08",X"07", + X"07",X"DD",X"77",X"08",X"DD",X"7E",X"0A",X"07",X"07",X"DD",X"77",X"0A",X"DD",X"7E",X"0C",X"07", + X"07",X"DD",X"77",X"0C",X"3A",X"D1",X"4D",X"FE",X"01",X"20",X"38",X"DD",X"21",X"20",X"4C",X"3A", + X"A4",X"4D",X"87",X"5F",X"16",X"00",X"DD",X"19",X"2A",X"24",X"4C",X"ED",X"5B",X"34",X"4C",X"DD", + X"7E",X"00",X"32",X"24",X"4C",X"DD",X"7E",X"01",X"32",X"25",X"4C",X"DD",X"7E",X"10",X"32",X"34", + X"4C",X"DD",X"7E",X"11",X"32",X"35",X"4C",X"DD",X"75",X"00",X"DD",X"74",X"01",X"DD",X"73",X"10", + X"DD",X"72",X"11",X"3A",X"A6",X"4D",X"A7",X"CA",X"76",X"01",X"ED",X"4B",X"22",X"4C",X"ED",X"5B", + X"32",X"4C",X"2A",X"2A",X"4C",X"22",X"22",X"4C",X"2A",X"3A",X"4C",X"22",X"32",X"4C",X"ED",X"43", + X"2A",X"4C",X"ED",X"53",X"3A",X"4C",X"21",X"22",X"4C",X"11",X"F2",X"4F",X"01",X"0C",X"00",X"ED", + X"B0",X"21",X"32",X"4C",X"11",X"62",X"50",X"01",X"0C",X"00",X"ED",X"B0",X"CD",X"DC",X"01",X"CD", + X"21",X"02",X"CD",X"C8",X"03",X"3A",X"00",X"4E",X"A7",X"28",X"12",X"CD",X"9D",X"03",X"CD",X"90", + X"14",X"CD",X"1F",X"14",X"CD",X"67",X"02",X"CD",X"AD",X"02",X"CD",X"FD",X"02",X"3A",X"00",X"4E", + X"3D",X"20",X"06",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"CD",X"0C",X"2D",X"CD",X"C1",X"2C",X"FD", + X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"3A",X"00",X"4E",X"A7",X"28",X"08",X"3A",X"40",X"50",X"E6", + X"10",X"CA",X"00",X"00",X"3E",X"01",X"32",X"00",X"50",X"FB",X"F1",X"C9",X"21",X"84",X"4C",X"34", + X"23",X"35",X"23",X"11",X"19",X"02",X"01",X"01",X"04",X"34",X"7E",X"E6",X"0F",X"EB",X"BE",X"20", + X"13",X"0C",X"1A",X"C6",X"10",X"E6",X"F0",X"12",X"23",X"BE",X"20",X"08",X"0C",X"EB",X"36",X"00", + X"23",X"13",X"10",X"E5",X"21",X"8A",X"4C",X"71",X"2C",X"7E",X"87",X"87",X"86",X"3C",X"77",X"2C", + X"7E",X"87",X"86",X"87",X"87",X"86",X"3C",X"77",X"C9",X"06",X"A0",X"0A",X"60",X"0A",X"60",X"0A", + X"A0",X"21",X"90",X"4C",X"3A",X"8A",X"4C",X"4F",X"06",X"10",X"7E",X"A7",X"28",X"2F",X"E6",X"C0", + X"07",X"07",X"B9",X"30",X"28",X"35",X"7E",X"E6",X"3F",X"20",X"22",X"77",X"C5",X"E5",X"2C",X"7E", + X"2C",X"46",X"21",X"5B",X"02",X"E5",X"E7",X"94",X"08",X"A3",X"06",X"8E",X"05",X"72",X"12",X"00", + X"10",X"0B",X"10",X"63",X"02",X"2B",X"21",X"F0",X"21",X"B9",X"22",X"E1",X"C1",X"2C",X"2C",X"2C", + X"10",X"C8",X"C9",X"EF",X"1C",X"86",X"C9",X"3A",X"6E",X"4E",X"FE",X"99",X"17",X"32",X"06",X"50", + X"1F",X"D0",X"3A",X"00",X"50",X"47",X"CB",X"00",X"3A",X"66",X"4E",X"17",X"E6",X"0F",X"32",X"66", + X"4E",X"D6",X"0C",X"CC",X"DF",X"02",X"CB",X"00",X"3A",X"67",X"4E",X"17",X"E6",X"0F",X"32",X"67", + X"4E",X"D6",X"0C",X"C2",X"9A",X"02",X"21",X"69",X"4E",X"34",X"CB",X"00",X"3A",X"68",X"4E",X"17", + X"E6",X"0F",X"32",X"68",X"4E",X"D6",X"0C",X"C0",X"21",X"69",X"4E",X"34",X"C9",X"3A",X"69",X"4E", + X"A7",X"C8",X"47",X"3A",X"6A",X"4E",X"5F",X"FE",X"00",X"C2",X"C4",X"02",X"3E",X"01",X"32",X"07", + X"50",X"CD",X"DF",X"02",X"7B",X"FE",X"08",X"C2",X"CE",X"02",X"AF",X"32",X"07",X"50",X"1C",X"7B", + X"32",X"6A",X"4E",X"D6",X"10",X"C0",X"32",X"6A",X"4E",X"05",X"78",X"32",X"69",X"4E",X"C9",X"3A", + X"6B",X"4E",X"21",X"6C",X"4E",X"34",X"96",X"C0",X"77",X"3A",X"6D",X"4E",X"21",X"6E",X"4E",X"86", + X"27",X"D2",X"F6",X"02",X"3E",X"99",X"77",X"21",X"9C",X"4E",X"CB",X"CE",X"C9",X"21",X"CE",X"4D", + X"34",X"7E",X"E6",X"0F",X"20",X"1F",X"7E",X"0F",X"0F",X"0F",X"0F",X"47",X"3A",X"D6",X"4D",X"2F", + X"B0",X"4F",X"3A",X"6E",X"4E",X"D6",X"01",X"30",X"02",X"AF",X"4F",X"28",X"01",X"79",X"32",X"05", + X"50",X"79",X"32",X"04",X"50",X"DD",X"21",X"D8",X"43",X"FD",X"21",X"C5",X"43",X"3A",X"00",X"4E", + X"FE",X"03",X"CA",X"44",X"03",X"3A",X"03",X"4E",X"FE",X"02",X"D2",X"44",X"03",X"CD",X"69",X"03", + X"CD",X"76",X"03",X"C9",X"3A",X"09",X"4E",X"A7",X"3A",X"CE",X"4D",X"C2",X"59",X"03",X"CB",X"67", + X"CC",X"69",X"03",X"C4",X"83",X"03",X"C3",X"61",X"03",X"CB",X"67",X"CC",X"76",X"03",X"C4",X"90", + X"03",X"3A",X"70",X"4E",X"A7",X"CC",X"90",X"03",X"C9",X"DD",X"36",X"00",X"50",X"DD",X"36",X"01", + X"55",X"DD",X"36",X"02",X"31",X"C9",X"FD",X"36",X"00",X"50",X"FD",X"36",X"01",X"55",X"FD",X"36", + X"02",X"32",X"C9",X"DD",X"36",X"00",X"40",X"DD",X"36",X"01",X"40",X"DD",X"36",X"02",X"40",X"C9", + X"FD",X"36",X"00",X"40",X"FD",X"36",X"01",X"40",X"FD",X"36",X"02",X"40",X"C9",X"3A",X"06",X"4E", + X"D6",X"05",X"D8",X"2A",X"08",X"4D",X"06",X"08",X"0E",X"10",X"7D",X"32",X"06",X"4D",X"32",X"D2", + X"4D",X"91",X"32",X"02",X"4D",X"32",X"04",X"4D",X"7C",X"80",X"32",X"03",X"4D",X"32",X"07",X"4D", + X"91",X"32",X"05",X"4D",X"32",X"D3",X"4D",X"C9",X"3A",X"00",X"4E",X"E7",X"D4",X"03",X"FE",X"03", + X"E5",X"05",X"BE",X"06",X"3A",X"01",X"4E",X"E7",X"DC",X"03",X"0C",X"00",X"EF",X"00",X"00",X"EF", + X"06",X"00",X"EF",X"01",X"00",X"EF",X"14",X"00",X"EF",X"18",X"00",X"EF",X"04",X"00",X"EF",X"1E", + X"00",X"EF",X"07",X"00",X"21",X"01",X"4E",X"34",X"21",X"01",X"50",X"36",X"01",X"C9",X"CD",X"A1", + X"2B",X"3A",X"6E",X"4E",X"A7",X"28",X"0C",X"AF",X"32",X"04",X"4E",X"32",X"02",X"4E",X"21",X"00", + X"4E",X"34",X"C9",X"3A",X"02",X"4E",X"E7",X"5F",X"04",X"0C",X"00",X"71",X"04",X"0C",X"00",X"7F", + X"04",X"0C",X"00",X"85",X"04",X"0C",X"00",X"8B",X"04",X"0C",X"00",X"99",X"04",X"0C",X"00",X"9F", + X"04",X"0C",X"00",X"A5",X"04",X"0C",X"00",X"B3",X"04",X"0C",X"00",X"B9",X"04",X"0C",X"00",X"BF", + X"04",X"0C",X"00",X"CD",X"04",X"0C",X"00",X"D3",X"04",X"0C",X"00",X"D8",X"04",X"0C",X"00",X"E0", + X"04",X"0C",X"00",X"1C",X"05",X"4B",X"05",X"56",X"05",X"61",X"05",X"6C",X"05",X"7C",X"05",X"EF", + X"00",X"01",X"EF",X"01",X"00",X"EF",X"04",X"00",X"EF",X"1E",X"00",X"0E",X"0C",X"CD",X"85",X"05", + X"C9",X"21",X"04",X"43",X"3E",X"01",X"CD",X"BF",X"05",X"0E",X"0C",X"CD",X"85",X"05",X"C9",X"0E", + X"14",X"CD",X"93",X"05",X"C9",X"0E",X"0D",X"CD",X"93",X"05",X"C9",X"21",X"07",X"43",X"3E",X"03", + X"CD",X"BF",X"05",X"0E",X"0C",X"CD",X"85",X"05",X"C9",X"0E",X"16",X"CD",X"93",X"05",X"C9",X"0E", + X"0F",X"CD",X"93",X"05",X"C9",X"21",X"0A",X"43",X"3E",X"05",X"CD",X"BF",X"05",X"0E",X"0C",X"CD", + X"85",X"05",X"C9",X"0E",X"33",X"CD",X"93",X"05",X"C9",X"0E",X"2F",X"CD",X"93",X"05",X"C9",X"21", + X"0D",X"43",X"3E",X"07",X"CD",X"BF",X"05",X"0E",X"0C",X"CD",X"85",X"05",X"C9",X"0E",X"35",X"CD", + X"93",X"05",X"C9",X"0E",X"31",X"C3",X"80",X"05",X"EF",X"1C",X"11",X"0E",X"12",X"C3",X"85",X"05", + X"0E",X"13",X"CD",X"85",X"05",X"CD",X"79",X"08",X"35",X"EF",X"11",X"00",X"EF",X"05",X"01",X"EF", + X"10",X"14",X"EF",X"04",X"01",X"3E",X"01",X"32",X"14",X"4E",X"AF",X"32",X"70",X"4E",X"32",X"15", + X"4E",X"21",X"32",X"43",X"36",X"14",X"3E",X"FC",X"11",X"20",X"00",X"06",X"1C",X"DD",X"21",X"40", + X"40",X"DD",X"77",X"11",X"DD",X"77",X"13",X"DD",X"19",X"10",X"F6",X"C9",X"21",X"A0",X"4D",X"06", + X"21",X"3A",X"3A",X"4D",X"90",X"20",X"05",X"36",X"01",X"C3",X"8E",X"05",X"CD",X"17",X"10",X"CD", + X"17",X"10",X"CD",X"23",X"0E",X"CD",X"0D",X"0C",X"CD",X"D6",X"0B",X"CD",X"A5",X"05",X"CD",X"FE", + X"1E",X"CD",X"25",X"1F",X"CD",X"4C",X"1F",X"CD",X"73",X"1F",X"C9",X"21",X"A1",X"4D",X"06",X"20", + X"3A",X"32",X"4D",X"C3",X"24",X"05",X"21",X"A2",X"4D",X"06",X"22",X"3A",X"32",X"4D",X"C3",X"24", + X"05",X"21",X"A3",X"4D",X"06",X"24",X"3A",X"32",X"4D",X"C3",X"24",X"05",X"3A",X"D0",X"4D",X"47", + X"3A",X"D1",X"4D",X"80",X"FE",X"06",X"CA",X"8E",X"05",X"C3",X"2C",X"05",X"CD",X"BE",X"06",X"C9", + X"3A",X"75",X"4E",X"81",X"4F",X"06",X"1C",X"CD",X"42",X"00",X"F7",X"4A",X"02",X"00",X"21",X"02", + X"4E",X"34",X"C9",X"3A",X"75",X"4E",X"81",X"4F",X"06",X"1C",X"CD",X"42",X"00",X"F7",X"45",X"02", + X"00",X"CD",X"8E",X"05",X"C9",X"3A",X"B5",X"4D",X"A7",X"C8",X"AF",X"32",X"B5",X"4D",X"3A",X"30", + X"4D",X"EE",X"02",X"32",X"3C",X"4D",X"47",X"21",X"FF",X"32",X"DF",X"22",X"26",X"4D",X"C9",X"36", + X"B1",X"2C",X"36",X"B3",X"2C",X"36",X"B5",X"01",X"1E",X"00",X"09",X"36",X"B0",X"2C",X"36",X"B2", + X"2C",X"36",X"B4",X"11",X"00",X"04",X"19",X"77",X"2D",X"77",X"2D",X"77",X"A7",X"ED",X"42",X"77", + X"2D",X"77",X"2D",X"77",X"C9",X"3A",X"03",X"4E",X"E7",X"F3",X"05",X"1B",X"06",X"74",X"06",X"0C", + X"00",X"A8",X"06",X"CD",X"A1",X"2B",X"EF",X"00",X"01",X"EF",X"01",X"00",X"EF",X"1C",X"07",X"EF", + X"1C",X"0B",X"EF",X"1E",X"00",X"21",X"03",X"4E",X"34",X"3E",X"01",X"32",X"D6",X"4D",X"3A",X"71", + X"4E",X"FE",X"FF",X"C8",X"EF",X"1C",X"0A",X"EF",X"1F",X"00",X"C9",X"CD",X"A1",X"2B",X"3A",X"6E", + X"4E",X"FE",X"01",X"06",X"09",X"20",X"02",X"06",X"08",X"CD",X"5E",X"2C",X"3A",X"6E",X"4E",X"FE", + X"01",X"3A",X"40",X"50",X"28",X"0C",X"CB",X"77",X"20",X"08",X"3E",X"01",X"32",X"70",X"4E",X"C3", + X"49",X"06",X"CB",X"6F",X"C0",X"AF",X"32",X"70",X"4E",X"3A",X"6B",X"4E",X"A7",X"28",X"15",X"3A", + X"70",X"4E",X"A7",X"3A",X"6E",X"4E",X"28",X"03",X"C6",X"99",X"27",X"C6",X"99",X"27",X"32",X"6E", + X"4E",X"CD",X"A1",X"2B",X"21",X"03",X"4E",X"34",X"AF",X"32",X"D6",X"4D",X"3C",X"32",X"CC",X"4E", + X"32",X"DC",X"4E",X"C9",X"EF",X"00",X"01",X"EF",X"01",X"01",X"EF",X"02",X"00",X"EF",X"12",X"00", + X"EF",X"03",X"00",X"EF",X"1C",X"03",X"EF",X"1C",X"06",X"EF",X"18",X"00",X"EF",X"1B",X"00",X"AF", + X"32",X"13",X"4E",X"3A",X"6F",X"4E",X"32",X"14",X"4E",X"32",X"15",X"4E",X"EF",X"1A",X"00",X"F7", + X"57",X"01",X"00",X"21",X"03",X"4E",X"34",X"C9",X"21",X"15",X"4E",X"35",X"CD",X"6A",X"2B",X"AF", + X"32",X"03",X"4E",X"32",X"02",X"4E",X"32",X"04",X"4E",X"21",X"00",X"4E",X"34",X"C9",X"3A",X"04", + X"4E",X"E7",X"79",X"08",X"99",X"08",X"0C",X"00",X"CD",X"08",X"0D",X"09",X"0C",X"00",X"40",X"09", + X"0C",X"00",X"72",X"09",X"88",X"09",X"0C",X"00",X"D2",X"09",X"D8",X"09",X"0C",X"00",X"E8",X"09", + X"0C",X"00",X"FE",X"09",X"0C",X"00",X"02",X"0A",X"0C",X"00",X"04",X"0A",X"0C",X"00",X"06",X"0A", + X"0C",X"00",X"08",X"0A",X"0C",X"00",X"0A",X"0A",X"0C",X"00",X"0C",X"0A",X"0C",X"00",X"0E",X"0A", + X"0C",X"00",X"2C",X"0A",X"0C",X"00",X"7C",X"0A",X"A0",X"0A",X"0C",X"00",X"A3",X"0A",X"78",X"A7", + X"20",X"04",X"2A",X"0A",X"4E",X"7E",X"DD",X"21",X"96",X"07",X"47",X"87",X"87",X"80",X"80",X"5F", + X"16",X"00",X"DD",X"19",X"DD",X"7E",X"00",X"87",X"47",X"87",X"87",X"4F",X"87",X"87",X"81",X"80", + X"5F",X"16",X"00",X"21",X"0F",X"33",X"19",X"CD",X"14",X"08",X"DD",X"7E",X"01",X"32",X"B0",X"4D", + X"DD",X"7E",X"02",X"47",X"87",X"80",X"5F",X"16",X"00",X"21",X"43",X"08",X"19",X"CD",X"3A",X"08", + X"DD",X"7E",X"03",X"87",X"5F",X"16",X"00",X"FD",X"21",X"4F",X"08",X"FD",X"19",X"FD",X"6E",X"00", + X"FD",X"66",X"01",X"22",X"BB",X"4D",X"DD",X"7E",X"04",X"87",X"5F",X"16",X"00",X"FD",X"21",X"61", + X"08",X"FD",X"19",X"FD",X"6E",X"00",X"FD",X"66",X"01",X"22",X"BD",X"4D",X"DD",X"7E",X"05",X"87", + X"5F",X"16",X"00",X"FD",X"21",X"73",X"08",X"FD",X"19",X"FD",X"6E",X"00",X"FD",X"66",X"01",X"22", + X"95",X"4D",X"CD",X"EA",X"2B",X"C9",X"03",X"01",X"01",X"00",X"02",X"00",X"04",X"01",X"02",X"01", + X"03",X"00",X"04",X"01",X"03",X"02",X"04",X"01",X"04",X"02",X"03",X"02",X"05",X"01",X"05",X"00", + X"03",X"02",X"06",X"02",X"05",X"01",X"03",X"03",X"03",X"02",X"05",X"02",X"03",X"03",X"06",X"02", + X"05",X"02",X"03",X"03",X"06",X"02",X"05",X"00",X"03",X"04",X"07",X"02",X"05",X"01",X"03",X"04", + X"03",X"02",X"05",X"02",X"03",X"04",X"06",X"02",X"05",X"02",X"03",X"05",X"07",X"02",X"05",X"00", + X"03",X"05",X"07",X"02",X"05",X"02",X"03",X"05",X"05",X"02",X"05",X"01",X"03",X"06",X"07",X"02", + X"05",X"02",X"03",X"06",X"07",X"02",X"05",X"02",X"03",X"06",X"08",X"02",X"05",X"02",X"03",X"06", + X"07",X"02",X"05",X"02",X"03",X"07",X"08",X"02",X"05",X"02",X"03",X"07",X"08",X"02",X"06",X"02", + X"03",X"07",X"08",X"02",X"11",X"46",X"4D",X"01",X"1C",X"00",X"ED",X"B0",X"01",X"0C",X"00",X"A7", + X"ED",X"42",X"ED",X"B0",X"01",X"0C",X"00",X"A7",X"ED",X"42",X"ED",X"B0",X"01",X"0C",X"00",X"A7", + X"ED",X"42",X"ED",X"B0",X"01",X"0E",X"00",X"ED",X"B0",X"C9",X"11",X"B8",X"4D",X"01",X"03",X"00", + X"ED",X"B0",X"C9",X"14",X"1E",X"46",X"00",X"1E",X"3C",X"00",X"00",X"32",X"00",X"00",X"00",X"14", + X"0A",X"1E",X"0F",X"28",X"14",X"32",X"19",X"3C",X"1E",X"50",X"28",X"64",X"32",X"78",X"3C",X"8C", + X"46",X"C0",X"03",X"48",X"03",X"D0",X"02",X"58",X"02",X"E0",X"01",X"68",X"01",X"F0",X"00",X"78", + X"00",X"01",X"00",X"F0",X"00",X"F0",X"00",X"B4",X"00",X"21",X"09",X"4E",X"AF",X"06",X"0B",X"CF", + X"CD",X"C9",X"24",X"2A",X"73",X"4E",X"22",X"0A",X"4E",X"21",X"0A",X"4E",X"11",X"38",X"4E",X"01", + X"2E",X"00",X"ED",X"B0",X"21",X"04",X"4E",X"34",X"C9",X"3A",X"00",X"4E",X"3D",X"20",X"06",X"3E", + X"09",X"32",X"04",X"4E",X"C9",X"EF",X"11",X"00",X"EF",X"1C",X"83",X"EF",X"04",X"00",X"EF",X"05", + X"00",X"EF",X"10",X"00",X"EF",X"1A",X"00",X"F7",X"54",X"00",X"00",X"F7",X"54",X"06",X"00",X"3A", + X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"32",X"03",X"50",X"C3",X"94",X"08",X"3A",X"00",X"50", + X"CB",X"67",X"C2",X"DE",X"08",X"21",X"04",X"4E",X"36",X"0E",X"EF",X"13",X"00",X"C9",X"3A",X"0E", + X"4E",X"FE",X"F4",X"20",X"06",X"21",X"04",X"4E",X"36",X"0C",X"C9",X"CD",X"17",X"10",X"CD",X"17", + X"10",X"CD",X"DD",X"13",X"CD",X"42",X"0C",X"CD",X"23",X"0E",X"CD",X"36",X"0E",X"CD",X"C3",X"0A", + X"CD",X"D6",X"0B",X"CD",X"0D",X"0C",X"CD",X"6C",X"0E",X"CD",X"AD",X"0E",X"C9",X"3E",X"01",X"32", + X"12",X"4E",X"CD",X"87",X"24",X"21",X"04",X"4E",X"34",X"3A",X"14",X"4E",X"A7",X"20",X"1F",X"3A", + X"70",X"4E",X"A7",X"28",X"19",X"3A",X"42",X"4E",X"A7",X"28",X"13",X"3A",X"09",X"4E",X"C6",X"03", + X"4F",X"06",X"1C",X"CD",X"42",X"00",X"EF",X"1C",X"05",X"F7",X"54",X"00",X"00",X"C9",X"34",X"C9", + X"3A",X"70",X"4E",X"A7",X"28",X"06",X"3A",X"42",X"4E",X"A7",X"20",X"15",X"3A",X"14",X"4E",X"A7", + X"20",X"1A",X"CD",X"A1",X"2B",X"EF",X"1C",X"05",X"F7",X"54",X"00",X"00",X"21",X"04",X"4E",X"34", + X"C9",X"CD",X"A6",X"0A",X"3A",X"09",X"4E",X"EE",X"01",X"32",X"09",X"4E",X"3E",X"09",X"32",X"04", + X"4E",X"C9",X"AF",X"32",X"02",X"4E",X"32",X"04",X"4E",X"32",X"70",X"4E",X"32",X"09",X"4E",X"32", + X"03",X"50",X"3E",X"01",X"32",X"00",X"4E",X"C9",X"EF",X"00",X"01",X"EF",X"01",X"01",X"EF",X"02", + X"00",X"EF",X"11",X"00",X"EF",X"13",X"00",X"EF",X"03",X"00",X"EF",X"04",X"00",X"EF",X"05",X"00", + X"EF",X"10",X"00",X"EF",X"1A",X"00",X"EF",X"1C",X"06",X"3A",X"00",X"4E",X"FE",X"03",X"28",X"06", + X"EF",X"1C",X"05",X"EF",X"1D",X"00",X"F7",X"54",X"00",X"00",X"3A",X"00",X"4E",X"3D",X"28",X"04", + X"F7",X"54",X"06",X"00",X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"32",X"03",X"50",X"C3", + X"94",X"08",X"3E",X"03",X"32",X"04",X"4E",X"C9",X"F7",X"54",X"00",X"00",X"21",X"04",X"4E",X"34", + X"AF",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"C9",X"0E",X"02",X"06",X"01",X"CD",X"42",X"00",X"F7", + X"42",X"00",X"00",X"21",X"00",X"00",X"CD",X"7E",X"26",X"21",X"04",X"4E",X"34",X"C9",X"0E",X"00", + X"18",X"E8",X"18",X"E4",X"18",X"F8",X"18",X"E0",X"18",X"F4",X"18",X"DC",X"18",X"F0",X"EF",X"00", + X"01",X"EF",X"06",X"00",X"EF",X"11",X"00",X"EF",X"13",X"00",X"EF",X"04",X"01",X"EF",X"05",X"01", + X"EF",X"10",X"13",X"F7",X"43",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"AF",X"32",X"AC",X"4E", + X"32",X"BC",X"4E",X"3E",X"02",X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"3A",X"13",X"4E",X"FE",X"14", + X"38",X"02",X"3E",X"14",X"E7",X"6F",X"0A",X"08",X"21",X"6F",X"0A",X"6F",X"0A",X"9E",X"21",X"6F", + X"0A",X"6F",X"0A",X"6F",X"0A",X"97",X"22",X"6F",X"0A",X"6F",X"0A",X"6F",X"0A",X"97",X"22",X"6F", + X"0A",X"6F",X"0A",X"6F",X"0A",X"97",X"22",X"6F",X"0A",X"6F",X"0A",X"6F",X"0A",X"6F",X"0A",X"21", + X"04",X"4E",X"34",X"34",X"AF",X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"C9",X"AF",X"32",X"CC",X"4E", + X"32",X"DC",X"4E",X"06",X"07",X"21",X"0C",X"4E",X"CF",X"CD",X"C9",X"24",X"21",X"04",X"4E",X"34", + X"21",X"13",X"4E",X"34",X"2A",X"0A",X"4E",X"7E",X"FE",X"14",X"C8",X"23",X"22",X"0A",X"4E",X"C9", + X"C3",X"88",X"09",X"C3",X"D2",X"09",X"06",X"2E",X"DD",X"21",X"0A",X"4E",X"FD",X"21",X"38",X"4E", + X"DD",X"56",X"00",X"FD",X"5E",X"00",X"FD",X"72",X"00",X"DD",X"73",X"00",X"DD",X"23",X"FD",X"23", + X"10",X"EE",X"C9",X"3A",X"A4",X"4D",X"A7",X"C0",X"DD",X"21",X"00",X"4C",X"FD",X"21",X"C8",X"4D", + X"11",X"00",X"01",X"FD",X"BE",X"00",X"C2",X"D2",X"0B",X"FD",X"36",X"00",X"0E",X"3A",X"A6",X"4D", + X"A7",X"28",X"1B",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"13",X"21",X"AC",X"4E",X"CB",X"FE", + X"3E",X"09",X"DD",X"BE",X"0B",X"20",X"04",X"CB",X"BE",X"3E",X"09",X"32",X"0B",X"4C",X"3A",X"A7", + X"4D",X"A7",X"28",X"1D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"27",X"3E",X"11",X"DD",X"BE", + X"03",X"28",X"07",X"DD",X"36",X"03",X"11",X"C3",X"33",X"0B",X"DD",X"36",X"03",X"12",X"C3",X"33", + X"0B",X"3E",X"01",X"DD",X"BE",X"03",X"28",X"07",X"DD",X"36",X"03",X"01",X"C3",X"33",X"0B",X"DD", + X"36",X"03",X"01",X"3A",X"A8",X"4D",X"A7",X"28",X"1D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30", + X"27",X"3E",X"11",X"DD",X"BE",X"05",X"28",X"07",X"DD",X"36",X"05",X"11",X"C3",X"68",X"0B",X"DD", + X"36",X"05",X"12",X"C3",X"68",X"0B",X"3E",X"03",X"DD",X"BE",X"05",X"28",X"07",X"DD",X"36",X"05", + X"03",X"C3",X"68",X"0B",X"DD",X"36",X"05",X"03",X"3A",X"A9",X"4D",X"A7",X"28",X"1D",X"2A",X"CB", + X"4D",X"A7",X"ED",X"52",X"30",X"27",X"3E",X"11",X"DD",X"BE",X"07",X"28",X"07",X"DD",X"36",X"07", + X"11",X"C3",X"9D",X"0B",X"DD",X"36",X"07",X"12",X"C3",X"9D",X"0B",X"3E",X"05",X"DD",X"BE",X"07", + X"28",X"07",X"DD",X"36",X"07",X"05",X"C3",X"9D",X"0B",X"DD",X"36",X"07",X"05",X"3A",X"AA",X"4D", + X"A7",X"28",X"1D",X"2A",X"CB",X"4D",X"A7",X"ED",X"52",X"30",X"27",X"3E",X"11",X"DD",X"BE",X"09", + X"28",X"07",X"DD",X"36",X"09",X"11",X"C3",X"D2",X"0B",X"DD",X"36",X"09",X"12",X"C3",X"D2",X"0B", + X"3E",X"07",X"DD",X"BE",X"09",X"28",X"07",X"DD",X"36",X"09",X"07",X"C3",X"D2",X"0B",X"DD",X"36", + X"09",X"07",X"FD",X"35",X"00",X"C9",X"06",X"19",X"3A",X"02",X"4E",X"FE",X"22",X"C2",X"E2",X"0B", + X"06",X"00",X"DD",X"21",X"00",X"4C",X"3A",X"AC",X"4D",X"A7",X"CA",X"F0",X"0B",X"DD",X"70",X"03", + X"3A",X"AD",X"4D",X"A7",X"CA",X"FA",X"0B",X"DD",X"70",X"05",X"3A",X"AE",X"4D",X"A7",X"CA",X"04", + X"0C",X"DD",X"70",X"07",X"3A",X"AF",X"4D",X"A7",X"C8",X"DD",X"70",X"09",X"C9",X"21",X"CF",X"4D", + X"34",X"3E",X"0A",X"BE",X"C0",X"36",X"00",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"15",X"21",X"64", + X"44",X"3E",X"10",X"BE",X"20",X"02",X"3E",X"00",X"77",X"32",X"78",X"44",X"32",X"84",X"47",X"32", + X"98",X"47",X"C9",X"21",X"32",X"47",X"3E",X"10",X"BE",X"20",X"02",X"3E",X"00",X"77",X"32",X"78", + X"46",X"C9",X"3A",X"A4",X"4D",X"A7",X"C0",X"3A",X"94",X"4D",X"07",X"32",X"94",X"4D",X"D0",X"3A", + X"A0",X"4D",X"A7",X"C2",X"90",X"0C",X"DD",X"21",X"05",X"33",X"FD",X"21",X"00",X"4D",X"CD",X"00", + X"20",X"22",X"00",X"4D",X"3E",X"03",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3A",X"00",X"4D",X"FE", + X"64",X"C2",X"90",X"0C",X"21",X"2C",X"2E",X"22",X"0A",X"4D",X"21",X"00",X"01",X"22",X"14",X"4D", + X"22",X"1E",X"4D",X"3E",X"02",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3E",X"01",X"32",X"A0",X"4D", + X"3A",X"A1",X"4D",X"FE",X"01",X"CA",X"FB",X"0C",X"FE",X"00",X"C2",X"C1",X"0C",X"3A",X"02",X"4D", + X"FE",X"78",X"CC",X"2E",X"1F",X"FE",X"80",X"CC",X"2E",X"1F",X"3A",X"2D",X"4D",X"32",X"29",X"4D", + X"DD",X"21",X"20",X"4D",X"FD",X"21",X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"C3",X"FB", + X"0C",X"DD",X"21",X"05",X"33",X"FD",X"21",X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"3E", + X"03",X"32",X"2D",X"4D",X"32",X"29",X"4D",X"3A",X"02",X"4D",X"FE",X"64",X"C2",X"FB",X"0C",X"21", + X"2C",X"2E",X"22",X"0C",X"4D",X"21",X"00",X"01",X"22",X"16",X"4D",X"22",X"20",X"4D",X"3E",X"02", + X"32",X"29",X"4D",X"32",X"2D",X"4D",X"3E",X"01",X"32",X"A1",X"4D",X"3A",X"A2",X"4D",X"FE",X"01", + X"CA",X"93",X"0D",X"FE",X"00",X"C2",X"2C",X"0D",X"3A",X"04",X"4D",X"FE",X"78",X"CC",X"55",X"1F", + X"FE",X"80",X"CC",X"55",X"1F",X"3A",X"2E",X"4D",X"32",X"2A",X"4D",X"DD",X"21",X"22",X"4D",X"FD", + X"21",X"04",X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"C3",X"93",X"0D",X"3A",X"A2",X"4D",X"FE", + X"03",X"C2",X"59",X"0D",X"DD",X"21",X"FF",X"32",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22", + X"04",X"4D",X"AF",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3A",X"05",X"4D",X"FE",X"80",X"C2",X"93", + X"0D",X"3E",X"02",X"32",X"A2",X"4D",X"C3",X"93",X"0D",X"DD",X"21",X"05",X"33",X"FD",X"21",X"04", + X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"3E",X"03",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3A", + X"04",X"4D",X"FE",X"64",X"C2",X"93",X"0D",X"21",X"2C",X"2E",X"22",X"0E",X"4D",X"21",X"00",X"01", + X"22",X"18",X"4D",X"22",X"22",X"4D",X"3E",X"02",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"3E",X"01", + X"32",X"A2",X"4D",X"3A",X"A3",X"4D",X"FE",X"01",X"C8",X"FE",X"00",X"C2",X"C0",X"0D",X"3A",X"06", + X"4D",X"FE",X"78",X"CC",X"7C",X"1F",X"FE",X"80",X"CC",X"7C",X"1F",X"3A",X"2F",X"4D",X"32",X"2B", + X"4D",X"DD",X"21",X"24",X"4D",X"FD",X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"C9", + X"3A",X"A3",X"4D",X"FE",X"03",X"C2",X"EA",X"0D",X"DD",X"21",X"03",X"33",X"FD",X"21",X"06",X"4D", + X"CD",X"00",X"20",X"22",X"06",X"4D",X"3E",X"02",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3A",X"07", + X"4D",X"FE",X"80",X"C0",X"3E",X"02",X"32",X"A3",X"4D",X"C9",X"DD",X"21",X"05",X"33",X"FD",X"21", + X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"3E",X"03",X"32",X"2B",X"4D",X"32",X"2F",X"4D", + X"3A",X"06",X"4D",X"FE",X"64",X"C0",X"21",X"2C",X"2E",X"22",X"10",X"4D",X"21",X"00",X"01",X"22", + X"1A",X"4D",X"22",X"24",X"4D",X"3E",X"02",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"3E",X"01",X"32", + X"A3",X"4D",X"C9",X"21",X"C4",X"4D",X"34",X"3E",X"08",X"BE",X"C0",X"36",X"00",X"3A",X"C0",X"4D", + X"EE",X"01",X"32",X"C0",X"4D",X"C9",X"3A",X"A6",X"4D",X"A7",X"C0",X"3A",X"C1",X"4D",X"FE",X"07", + X"C8",X"87",X"2A",X"C2",X"4D",X"23",X"22",X"C2",X"4D",X"5F",X"16",X"00",X"DD",X"21",X"86",X"4D", + X"DD",X"19",X"DD",X"5E",X"00",X"DD",X"56",X"01",X"A7",X"ED",X"52",X"C0",X"CB",X"3F",X"3C",X"32", + X"C1",X"4D",X"21",X"01",X"01",X"22",X"B1",X"4D",X"22",X"B3",X"4D",X"C9",X"3A",X"A5",X"4D",X"A7", + X"28",X"05",X"AF",X"32",X"AC",X"4E",X"C9",X"21",X"AC",X"4E",X"06",X"E0",X"3A",X"0E",X"4E",X"FE", + X"E4",X"38",X"06",X"78",X"A6",X"CB",X"E7",X"77",X"C9",X"FE",X"D4",X"38",X"06",X"78",X"A6",X"CB", + X"DF",X"77",X"C9",X"FE",X"B4",X"38",X"06",X"78",X"A6",X"CB",X"D7",X"77",X"C9",X"FE",X"74",X"38", + X"06",X"78",X"A6",X"CB",X"CF",X"77",X"C9",X"78",X"A6",X"CB",X"C7",X"77",X"C9",X"3A",X"A5",X"4D", + X"A7",X"C0",X"3A",X"D4",X"4D",X"A7",X"C0",X"3A",X"0E",X"4E",X"FE",X"46",X"28",X"0E",X"FE",X"AA", + X"C0",X"3A",X"0D",X"4E",X"A7",X"C0",X"21",X"0D",X"4E",X"34",X"18",X"09",X"3A",X"0C",X"4E",X"A7", + X"C0",X"21",X"0C",X"4E",X"34",X"21",X"94",X"80",X"22",X"D2",X"4D",X"21",X"FD",X"0E",X"3A",X"13", + X"4E",X"FE",X"14",X"38",X"02",X"3E",X"14",X"47",X"87",X"80",X"D7",X"32",X"0C",X"4C",X"23",X"7E", + X"32",X"0D",X"4C",X"23",X"7E",X"32",X"D4",X"4D",X"F7",X"8A",X"04",X"00",X"C9",X"00",X"14",X"06", + X"01",X"0F",X"07",X"02",X"15",X"08",X"02",X"15",X"08",X"04",X"14",X"09",X"04",X"14",X"09",X"05", + X"17",X"0A",X"05",X"17",X"0A",X"06",X"09",X"0B",X"06",X"09",X"0B",X"03",X"16",X"0C",X"03",X"16", + X"0C",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D", + X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"07",X"16",X"0D",X"F5",X"ED",X"57",X"B7", + X"28",X"04",X"F1",X"C3",X"8D",X"00",X"F1",X"C3",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"81",X"CE", + X"AF",X"32",X"D4",X"4D",X"21",X"00",X"00",X"22",X"D2",X"4D",X"C9",X"EF",X"1C",X"9B",X"3A",X"00", + X"4E",X"3D",X"C8",X"EF",X"1C",X"A2",X"C9",X"CD",X"91",X"12",X"3A",X"A5",X"4D",X"A7",X"C0",X"CD", + X"66",X"10",X"CD",X"94",X"10",X"CD",X"9E",X"10",X"CD",X"A8",X"10",X"CD",X"B4",X"10",X"3A",X"A4", + X"4D",X"A7",X"CA",X"39",X"10",X"CD",X"35",X"12",X"C9",X"CD",X"1D",X"17",X"CD",X"89",X"17",X"3A", + X"A4",X"4D",X"A7",X"C0",X"CD",X"06",X"18",X"CD",X"36",X"1B",X"CD",X"4B",X"1C",X"CD",X"22",X"1D", + X"CD",X"F9",X"1D",X"3A",X"04",X"4E",X"FE",X"03",X"C0",X"CD",X"76",X"13",X"CD",X"69",X"20",X"CD", + X"8C",X"20",X"CD",X"AF",X"20",X"C9",X"3A",X"AB",X"4D",X"A7",X"C8",X"3D",X"20",X"08",X"32",X"AB", + X"4D",X"3C",X"32",X"AC",X"4D",X"C9",X"3D",X"20",X"08",X"32",X"AB",X"4D",X"3C",X"32",X"AD",X"4D", + X"C9",X"3D",X"20",X"08",X"32",X"AB",X"4D",X"3C",X"32",X"AE",X"4D",X"C9",X"32",X"AF",X"4D",X"3D", + X"32",X"AB",X"4D",X"C9",X"3A",X"AC",X"4D",X"E7",X"0C",X"00",X"C0",X"10",X"D2",X"10",X"3A",X"AD", + X"4D",X"E7",X"0C",X"00",X"18",X"11",X"2A",X"11",X"3A",X"AE",X"4D",X"E7",X"0C",X"00",X"5C",X"11", + X"6E",X"11",X"8F",X"11",X"3A",X"AF",X"4D",X"E7",X"0C",X"00",X"C9",X"11",X"DB",X"11",X"FC",X"11", + X"CD",X"D8",X"1B",X"2A",X"00",X"4D",X"11",X"64",X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AC",X"4D", + X"34",X"C9",X"DD",X"21",X"01",X"33",X"FD",X"21",X"00",X"4D",X"CD",X"00",X"20",X"22",X"00",X"4D", + X"3E",X"01",X"32",X"28",X"4D",X"32",X"2C",X"4D",X"3A",X"00",X"4D",X"FE",X"80",X"C0",X"21",X"2F", + X"2E",X"22",X"0A",X"4D",X"22",X"31",X"4D",X"AF",X"32",X"A0",X"4D",X"32",X"AC",X"4D",X"32",X"A7", + X"4D",X"DD",X"21",X"AC",X"4D",X"DD",X"B6",X"00",X"DD",X"B6",X"01",X"DD",X"B6",X"02",X"DD",X"B6", + X"03",X"C0",X"21",X"AC",X"4E",X"CB",X"B6",X"C9",X"CD",X"AF",X"1C",X"2A",X"02",X"4D",X"11",X"64", + X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AD",X"4D",X"34",X"C9",X"DD",X"21",X"01",X"33",X"FD",X"21", + X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"3E",X"01",X"32",X"29",X"4D",X"32",X"2D",X"4D", + X"3A",X"02",X"4D",X"FE",X"80",X"C0",X"21",X"2F",X"2E",X"22",X"0C",X"4D",X"22",X"33",X"4D",X"AF", + X"32",X"A1",X"4D",X"32",X"AD",X"4D",X"32",X"A8",X"4D",X"C3",X"01",X"11",X"CD",X"86",X"1D",X"2A", + X"04",X"4D",X"11",X"64",X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AE",X"4D",X"34",X"C9",X"DD",X"21", + X"01",X"33",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"3E",X"01",X"32",X"2A", + X"4D",X"32",X"2E",X"4D",X"3A",X"04",X"4D",X"FE",X"80",X"C0",X"21",X"AE",X"4D",X"34",X"C9",X"DD", + X"21",X"03",X"33",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22",X"04",X"4D",X"3E",X"02",X"32", + X"2A",X"4D",X"32",X"2E",X"4D",X"3A",X"05",X"4D",X"FE",X"90",X"C0",X"21",X"2F",X"30",X"22",X"0E", + X"4D",X"22",X"35",X"4D",X"3E",X"01",X"32",X"2A",X"4D",X"32",X"2E",X"4D",X"AF",X"32",X"A2",X"4D", + X"32",X"AE",X"4D",X"32",X"A9",X"4D",X"C3",X"01",X"11",X"CD",X"5D",X"1E",X"2A",X"06",X"4D",X"11", + X"64",X"80",X"A7",X"ED",X"52",X"C0",X"21",X"AF",X"4D",X"34",X"C9",X"DD",X"21",X"01",X"33",X"FD", + X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"3E",X"01",X"32",X"2B",X"4D",X"32",X"2F", + X"4D",X"3A",X"06",X"4D",X"FE",X"80",X"C0",X"21",X"AF",X"4D",X"34",X"C9",X"DD",X"21",X"FF",X"32", + X"FD",X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"AF",X"32",X"2B",X"4D",X"32",X"2F", + X"4D",X"3A",X"07",X"4D",X"FE",X"70",X"C0",X"21",X"2F",X"2C",X"22",X"10",X"4D",X"22",X"37",X"4D", + X"3E",X"01",X"32",X"2B",X"4D",X"32",X"2F",X"4D",X"AF",X"32",X"A3",X"4D",X"32",X"AF",X"4D",X"32", + X"AA",X"4D",X"C3",X"01",X"11",X"3A",X"D1",X"4D",X"E7",X"3F",X"12",X"0C",X"00",X"3F",X"12",X"21", + X"00",X"4C",X"3A",X"A4",X"4D",X"87",X"5F",X"16",X"00",X"19",X"3A",X"D1",X"4D",X"A7",X"20",X"27", + X"3A",X"D0",X"4D",X"06",X"27",X"80",X"47",X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E",X"A1",X"28", + X"04",X"CB",X"F0",X"CB",X"F8",X"70",X"23",X"36",X"18",X"3E",X"00",X"32",X"0B",X"4C",X"F7",X"4A", + X"03",X"00",X"21",X"D1",X"4D",X"34",X"C9",X"36",X"20",X"3E",X"09",X"32",X"0B",X"4C",X"3A",X"A4", + X"4D",X"32",X"AB",X"4D",X"AF",X"32",X"A4",X"4D",X"32",X"D1",X"4D",X"21",X"AC",X"4E",X"CB",X"F6", + X"C9",X"3A",X"A5",X"4D",X"E7",X"0C",X"00",X"B7",X"12",X"B7",X"12",X"B7",X"12",X"B7",X"12",X"CB", + X"12",X"F9",X"12",X"06",X"13",X"0E",X"13",X"16",X"13",X"1E",X"13",X"26",X"13",X"2E",X"13",X"36", + X"13",X"3E",X"13",X"46",X"13",X"53",X"13",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D",X"11",X"78", + X"00",X"A7",X"ED",X"52",X"C0",X"3E",X"05",X"32",X"A5",X"4D",X"C9",X"21",X"00",X"00",X"CD",X"7E", + X"26",X"3E",X"34",X"11",X"B4",X"00",X"4F",X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"28", + X"04",X"3E",X"C0",X"B1",X"4F",X"79",X"32",X"0A",X"4C",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D", + X"A7",X"ED",X"52",X"C0",X"21",X"A5",X"4D",X"34",X"C9",X"21",X"BC",X"4E",X"CB",X"E6",X"3E",X"35", + X"11",X"C3",X"00",X"C3",X"D6",X"12",X"3E",X"36",X"11",X"D2",X"00",X"C3",X"D6",X"12",X"3E",X"37", + X"11",X"E1",X"00",X"C3",X"D6",X"12",X"3E",X"38",X"11",X"F0",X"00",X"C3",X"D6",X"12",X"3E",X"39", + X"11",X"FF",X"00",X"C3",X"D6",X"12",X"3E",X"3A",X"11",X"0E",X"01",X"C3",X"D6",X"12",X"3E",X"3B", + X"11",X"1D",X"01",X"C3",X"D6",X"12",X"3E",X"3C",X"11",X"2C",X"01",X"C3",X"D6",X"12",X"3E",X"3D", + X"11",X"3B",X"01",X"C3",X"D6",X"12",X"21",X"BC",X"4E",X"36",X"20",X"3E",X"3E",X"11",X"59",X"01", + X"C3",X"D6",X"12",X"3E",X"3F",X"32",X"0A",X"4C",X"2A",X"C5",X"4D",X"23",X"22",X"C5",X"4D",X"11", + X"B8",X"01",X"A7",X"ED",X"52",X"C0",X"21",X"14",X"4E",X"35",X"21",X"15",X"4E",X"35",X"CD",X"75", + X"26",X"21",X"04",X"4E",X"34",X"C9",X"3A",X"A6",X"4D",X"A7",X"C8",X"DD",X"21",X"A7",X"4D",X"DD", + X"7E",X"00",X"DD",X"B6",X"01",X"DD",X"B6",X"02",X"DD",X"B6",X"03",X"CA",X"98",X"13",X"2A",X"CB", + X"4D",X"2B",X"22",X"CB",X"4D",X"7C",X"B5",X"C0",X"21",X"0B",X"4C",X"36",X"09",X"3A",X"AC",X"4D", + X"A7",X"C2",X"A7",X"13",X"32",X"A7",X"4D",X"3A",X"AD",X"4D",X"A7",X"C2",X"B1",X"13",X"32",X"A8", + X"4D",X"3A",X"AE",X"4D",X"A7",X"C2",X"BB",X"13",X"32",X"A9",X"4D",X"3A",X"AF",X"4D",X"A7",X"C2", + X"C5",X"13",X"32",X"AA",X"4D",X"AF",X"32",X"CB",X"4D",X"32",X"CC",X"4D",X"32",X"A6",X"4D",X"32", + X"C8",X"4D",X"32",X"D0",X"4D",X"21",X"AC",X"4E",X"CB",X"AE",X"CB",X"BE",X"C9",X"21",X"9E",X"4D", + X"3A",X"0E",X"4E",X"BE",X"CA",X"EE",X"13",X"21",X"00",X"00",X"22",X"97",X"4D",X"C9",X"2A",X"97", + X"4D",X"23",X"22",X"97",X"4D",X"ED",X"5B",X"95",X"4D",X"A7",X"ED",X"52",X"C0",X"21",X"00",X"00", + X"22",X"97",X"4D",X"3A",X"A1",X"4D",X"A7",X"F5",X"CC",X"86",X"20",X"F1",X"C8",X"3A",X"A2",X"4D", + X"A7",X"F5",X"CC",X"A9",X"20",X"F1",X"C8",X"3A",X"A3",X"4D",X"A7",X"CC",X"D1",X"20",X"C9",X"3A", + X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"C8",X"47",X"DD",X"21",X"00",X"4C",X"1E",X"08",X"0E", + X"08",X"16",X"07",X"3A",X"00",X"4D",X"83",X"DD",X"77",X"13",X"3A",X"01",X"4D",X"2F",X"82",X"DD", + X"77",X"12",X"3A",X"02",X"4D",X"83",X"DD",X"77",X"15",X"3A",X"03",X"4D",X"2F",X"82",X"DD",X"77", + X"14",X"3A",X"04",X"4D",X"83",X"DD",X"77",X"17",X"3A",X"05",X"4D",X"2F",X"81",X"DD",X"77",X"16", + X"3A",X"06",X"4D",X"83",X"DD",X"77",X"19",X"3A",X"07",X"4D",X"2F",X"81",X"DD",X"77",X"18",X"3A", + X"08",X"4D",X"83",X"DD",X"77",X"1B",X"3A",X"09",X"4D",X"2F",X"81",X"DD",X"77",X"1A",X"3A",X"D2", + X"4D",X"83",X"DD",X"77",X"1D",X"3A",X"D3",X"4D",X"2F",X"81",X"DD",X"77",X"1C",X"C3",X"FE",X"14", + X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"C0",X"47",X"1E",X"09",X"0E",X"07",X"16",X"06", + X"DD",X"21",X"00",X"4C",X"3A",X"00",X"4D",X"2F",X"83",X"DD",X"77",X"13",X"3A",X"01",X"4D",X"82", + X"DD",X"77",X"12",X"3A",X"02",X"4D",X"2F",X"83",X"DD",X"77",X"15",X"3A",X"03",X"4D",X"82",X"DD", + X"77",X"14",X"3A",X"04",X"4D",X"2F",X"83",X"DD",X"77",X"17",X"3A",X"05",X"4D",X"81",X"DD",X"77", + X"16",X"3A",X"06",X"4D",X"2F",X"83",X"DD",X"77",X"19",X"3A",X"07",X"4D",X"81",X"DD",X"77",X"18", + X"3A",X"08",X"4D",X"2F",X"83",X"DD",X"77",X"1B",X"3A",X"09",X"4D",X"81",X"DD",X"77",X"1A",X"3A", + X"D2",X"4D",X"2F",X"83",X"DD",X"77",X"1D",X"3A",X"D3",X"4D",X"81",X"DD",X"77",X"1C",X"3A",X"A5", + X"4D",X"A7",X"C2",X"4B",X"15",X"3A",X"A4",X"4D",X"A7",X"C2",X"B4",X"15",X"21",X"1C",X"15",X"E5", + X"3A",X"30",X"4D",X"E7",X"8C",X"16",X"B1",X"16",X"D6",X"16",X"F7",X"16",X"78",X"A7",X"28",X"2B", + X"0E",X"C0",X"3A",X"0A",X"4C",X"57",X"A1",X"20",X"05",X"7A",X"B1",X"C3",X"48",X"15",X"3A",X"30", + X"4D",X"FE",X"02",X"20",X"09",X"CB",X"7A",X"28",X"12",X"7A",X"A9",X"C3",X"48",X"15",X"FE",X"03", + X"20",X"09",X"CB",X"72",X"28",X"05",X"7A",X"A9",X"32",X"0A",X"4C",X"21",X"C0",X"4D",X"56",X"3E", + X"1C",X"82",X"DD",X"77",X"02",X"DD",X"77",X"04",X"DD",X"77",X"06",X"DD",X"77",X"08",X"0E",X"20", + X"3A",X"AC",X"4D",X"A7",X"20",X"06",X"3A",X"A7",X"4D",X"A7",X"20",X"09",X"3A",X"2C",X"4D",X"87", + X"82",X"81",X"DD",X"77",X"02",X"3A",X"AD",X"4D",X"A7",X"20",X"06",X"3A",X"A8",X"4D",X"A7",X"20", + X"09",X"3A",X"2D",X"4D",X"87",X"82",X"81",X"DD",X"77",X"04",X"3A",X"AE",X"4D",X"A7",X"20",X"06", + X"3A",X"A9",X"4D",X"A7",X"20",X"09",X"3A",X"2E",X"4D",X"87",X"82",X"81",X"DD",X"77",X"06",X"3A", + X"AF",X"4D",X"A7",X"20",X"06",X"3A",X"AA",X"4D",X"A7",X"20",X"09",X"3A",X"2F",X"4D",X"87",X"82", + X"81",X"DD",X"77",X"08",X"CD",X"E6",X"15",X"CD",X"2D",X"16",X"CD",X"52",X"16",X"78",X"A7",X"C8", + X"0E",X"C0",X"3A",X"02",X"4C",X"B1",X"32",X"02",X"4C",X"3A",X"04",X"4C",X"B1",X"32",X"04",X"4C", + X"3A",X"06",X"4C",X"B1",X"32",X"06",X"4C",X"3A",X"08",X"4C",X"B1",X"32",X"08",X"4C",X"3A",X"0C", + X"4C",X"B1",X"32",X"0C",X"4C",X"C9",X"3A",X"06",X"4E",X"D6",X"05",X"D8",X"3A",X"09",X"4D",X"E6", + X"0F",X"FE",X"0C",X"38",X"04",X"16",X"18",X"18",X"12",X"FE",X"08",X"38",X"04",X"16",X"14",X"18", + X"0A",X"FE",X"04",X"38",X"04",X"16",X"10",X"18",X"02",X"16",X"14",X"DD",X"72",X"04",X"14",X"DD", + X"72",X"06",X"14",X"DD",X"72",X"08",X"14",X"DD",X"72",X"0C",X"DD",X"36",X"0A",X"3F",X"16",X"16", + X"DD",X"72",X"05",X"DD",X"72",X"07",X"DD",X"72",X"09",X"DD",X"72",X"0D",X"C9",X"3A",X"07",X"4E", + X"A7",X"C8",X"57",X"3A",X"3A",X"4D",X"D6",X"3D",X"20",X"04",X"DD",X"36",X"0B",X"00",X"7A",X"FE", + X"0A",X"D8",X"DD",X"36",X"02",X"32",X"DD",X"36",X"03",X"1D",X"FE",X"0C",X"D8",X"DD",X"36",X"02", + X"33",X"C9",X"3A",X"08",X"4E",X"A7",X"C8",X"57",X"3A",X"3A",X"4D",X"D6",X"3D",X"20",X"04",X"DD", + X"36",X"0B",X"00",X"7A",X"FE",X"01",X"D8",X"3A",X"C0",X"4D",X"1E",X"08",X"83",X"DD",X"77",X"02", + X"7A",X"FE",X"03",X"D8",X"3A",X"01",X"4D",X"E6",X"08",X"0F",X"0F",X"0F",X"1E",X"0A",X"83",X"DD", + X"77",X"0C",X"3C",X"3C",X"DD",X"77",X"02",X"DD",X"36",X"0D",X"1E",X"C9",X"3A",X"09",X"4D",X"E6", + X"07",X"FE",X"06",X"38",X"05",X"DD",X"36",X"0A",X"30",X"C9",X"FE",X"04",X"38",X"05",X"DD",X"36", + X"0A",X"2E",X"C9",X"FE",X"02",X"38",X"05",X"DD",X"36",X"0A",X"2C",X"C9",X"DD",X"36",X"0A",X"2E", + X"C9",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"06",X"38",X"05",X"DD",X"36",X"0A",X"2F",X"C9",X"FE", + X"04",X"38",X"05",X"DD",X"36",X"0A",X"2D",X"C9",X"FE",X"02",X"38",X"05",X"DD",X"36",X"0A",X"2F", + X"C9",X"DD",X"36",X"0A",X"30",X"C9",X"3A",X"09",X"4D",X"E6",X"07",X"FE",X"06",X"38",X"08",X"1E", + X"2E",X"CB",X"FB",X"DD",X"73",X"0A",X"C9",X"FE",X"04",X"38",X"04",X"1E",X"2C",X"18",X"F2",X"FE", + X"02",X"30",X"EC",X"1E",X"30",X"18",X"EA",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"06",X"38",X"05", + X"1E",X"30",X"C3",X"0B",X"17",X"FE",X"04",X"38",X"08",X"1E",X"2F",X"CB",X"F3",X"DD",X"73",X"0A", + X"C9",X"FE",X"02",X"38",X"04",X"1E",X"2D",X"18",X"F2",X"1E",X"2F",X"18",X"EE",X"06",X"04",X"ED", + X"5B",X"39",X"4D",X"3A",X"AF",X"4D",X"A7",X"20",X"09",X"2A",X"37",X"4D",X"A7",X"ED",X"52",X"CA", + X"63",X"17",X"05",X"3A",X"AE",X"4D",X"A7",X"20",X"09",X"2A",X"35",X"4D",X"A7",X"ED",X"52",X"CA", + X"63",X"17",X"05",X"3A",X"AD",X"4D",X"A7",X"20",X"09",X"2A",X"33",X"4D",X"A7",X"ED",X"52",X"CA", + X"63",X"17",X"05",X"3A",X"AC",X"4D",X"A7",X"20",X"09",X"2A",X"31",X"4D",X"A7",X"ED",X"52",X"CA", + X"63",X"17",X"05",X"78",X"32",X"A4",X"4D",X"32",X"A5",X"4D",X"A7",X"C8",X"21",X"A6",X"4D",X"5F", + X"16",X"00",X"19",X"7E",X"A7",X"C8",X"AF",X"32",X"A5",X"4D",X"21",X"D0",X"4D",X"34",X"46",X"04", + X"CD",X"5A",X"2A",X"21",X"BC",X"4E",X"CB",X"DE",X"C9",X"3A",X"A4",X"4D",X"A7",X"C0",X"3A",X"A6", + X"4D",X"A7",X"C8",X"0E",X"04",X"06",X"04",X"DD",X"21",X"08",X"4D",X"3A",X"AF",X"4D",X"A7",X"20", + X"13",X"3A",X"06",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"07",X"4D",X"DD",X"96",X"01", + X"B9",X"DA",X"63",X"17",X"05",X"3A",X"AE",X"4D",X"A7",X"20",X"13",X"3A",X"04",X"4D",X"DD",X"96", + X"00",X"B9",X"30",X"0A",X"3A",X"05",X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"63",X"17",X"05",X"3A", + X"AD",X"4D",X"A7",X"20",X"13",X"3A",X"02",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"03", + X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"63",X"17",X"05",X"3A",X"AC",X"4D",X"A7",X"20",X"13",X"3A", + X"00",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"01",X"4D",X"DD",X"96",X"01",X"B9",X"DA", + X"63",X"17",X"05",X"C3",X"63",X"17",X"21",X"9D",X"4D",X"3E",X"FF",X"BE",X"CA",X"11",X"18",X"35", + X"C9",X"3A",X"A6",X"4D",X"A7",X"CA",X"2F",X"18",X"2A",X"4C",X"4D",X"29",X"22",X"4C",X"4D",X"2A", + X"4A",X"4D",X"ED",X"6A",X"22",X"4A",X"4D",X"D0",X"21",X"4C",X"4D",X"34",X"C3",X"43",X"18",X"2A", + X"48",X"4D",X"29",X"22",X"48",X"4D",X"2A",X"46",X"4D",X"ED",X"6A",X"22",X"46",X"4D",X"D0",X"21", + X"48",X"4D",X"34",X"3A",X"0E",X"4E",X"32",X"9E",X"4D",X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E", + X"A1",X"4F",X"21",X"3A",X"4D",X"7E",X"06",X"21",X"90",X"38",X"09",X"7E",X"06",X"3B",X"90",X"30", + X"03",X"C3",X"AB",X"18",X"3E",X"01",X"32",X"BF",X"4D",X"3A",X"00",X"4E",X"FE",X"01",X"CA",X"19", + X"1A",X"3A",X"04",X"4E",X"FE",X"10",X"D2",X"19",X"1A",X"79",X"A7",X"28",X"06",X"3A",X"40",X"50", + X"C3",X"86",X"18",X"3A",X"00",X"50",X"CB",X"4F",X"C2",X"99",X"18",X"2A",X"03",X"33",X"3E",X"02", + X"32",X"30",X"4D",X"22",X"1C",X"4D",X"C3",X"50",X"19",X"CB",X"57",X"C2",X"50",X"19",X"2A",X"FF", + X"32",X"AF",X"32",X"30",X"4D",X"22",X"1C",X"4D",X"C3",X"50",X"19",X"3A",X"00",X"4E",X"FE",X"01", + X"CA",X"19",X"1A",X"3A",X"04",X"4E",X"FE",X"10",X"D2",X"19",X"1A",X"79",X"A7",X"28",X"06",X"3A", + X"40",X"50",X"C3",X"C8",X"18",X"3A",X"00",X"50",X"CB",X"4F",X"CA",X"C9",X"1A",X"CB",X"57",X"CA", + X"D9",X"1A",X"CB",X"47",X"CA",X"E8",X"1A",X"CB",X"5F",X"CA",X"F8",X"1A",X"2A",X"1C",X"4D",X"22", + X"26",X"4D",X"06",X"01",X"DD",X"21",X"26",X"4D",X"FD",X"21",X"39",X"4D",X"CD",X"0F",X"20",X"E6", + X"C0",X"D6",X"C0",X"20",X"4B",X"05",X"C2",X"16",X"19",X"3A",X"30",X"4D",X"0F",X"DA",X"0B",X"19", + X"3A",X"09",X"4D",X"E6",X"07",X"FE",X"04",X"C8",X"C3",X"40",X"19",X"3A",X"08",X"4D",X"E6",X"07", + X"FE",X"04",X"C8",X"C3",X"40",X"19",X"DD",X"21",X"1C",X"4D",X"CD",X"0F",X"20",X"E6",X"C0",X"D6", + X"C0",X"20",X"2D",X"3A",X"30",X"4D",X"0F",X"DA",X"35",X"19",X"3A",X"09",X"4D",X"E6",X"07",X"FE", + X"04",X"C8",X"C3",X"50",X"19",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"04",X"C8",X"C3",X"50",X"19", + X"2A",X"26",X"4D",X"22",X"1C",X"4D",X"05",X"CA",X"50",X"19",X"3A",X"3C",X"4D",X"32",X"30",X"4D", + X"DD",X"21",X"1C",X"4D",X"FD",X"21",X"08",X"4D",X"CD",X"00",X"20",X"3A",X"30",X"4D",X"0F",X"DA", + X"75",X"19",X"7D",X"E6",X"07",X"FE",X"04",X"CA",X"85",X"19",X"DA",X"71",X"19",X"2D",X"C3",X"85", + X"19",X"2C",X"C3",X"85",X"19",X"7C",X"E6",X"07",X"FE",X"04",X"CA",X"85",X"19",X"DA",X"84",X"19", + X"25",X"C3",X"85",X"19",X"24",X"22",X"08",X"4D",X"CD",X"18",X"20",X"22",X"39",X"4D",X"DD",X"21", + X"BF",X"4D",X"DD",X"7E",X"00",X"DD",X"36",X"00",X"00",X"A7",X"C0",X"3A",X"D2",X"4D",X"A7",X"28", + X"2C",X"3A",X"D4",X"4D",X"A7",X"28",X"26",X"2A",X"08",X"4D",X"11",X"94",X"80",X"A7",X"ED",X"52", + X"20",X"1B",X"06",X"19",X"4F",X"CD",X"42",X"00",X"0E",X"15",X"81",X"4F",X"06",X"1C",X"CD",X"42", + X"00",X"CD",X"04",X"10",X"F7",X"54",X"05",X"00",X"21",X"BC",X"4E",X"CB",X"D6",X"3E",X"FF",X"32", + X"9D",X"4D",X"2A",X"39",X"4D",X"CD",X"65",X"00",X"7E",X"FE",X"10",X"28",X"03",X"FE",X"14",X"C0", + X"DD",X"21",X"0E",X"4E",X"DD",X"34",X"00",X"E6",X"0F",X"CB",X"3F",X"06",X"40",X"70",X"06",X"19", + X"4F",X"CB",X"39",X"CD",X"42",X"00",X"3C",X"FE",X"01",X"CA",X"FD",X"19",X"87",X"32",X"9D",X"4D", + X"CD",X"08",X"1B",X"CD",X"6A",X"1A",X"21",X"BC",X"4E",X"3A",X"0E",X"4E",X"0F",X"38",X"05",X"CB", + X"C6",X"CB",X"8E",X"C9",X"CB",X"86",X"CB",X"CE",X"C9",X"21",X"1C",X"4D",X"7E",X"A7",X"CA",X"2E", + X"1A",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"38",X"1A",X"C3",X"5C",X"1A",X"3A",X"09", + X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"5C",X"1A",X"3E",X"05",X"CD",X"D0",X"1E",X"38",X"03",X"EF", + X"17",X"00",X"DD",X"21",X"26",X"4D",X"FD",X"21",X"12",X"4D",X"CD",X"00",X"20",X"22",X"12",X"4D", + X"2A",X"26",X"4D",X"22",X"1C",X"4D",X"3A",X"3C",X"4D",X"32",X"30",X"4D",X"DD",X"21",X"1C",X"4D", + X"FD",X"21",X"08",X"4D",X"CD",X"00",X"20",X"C3",X"85",X"19",X"3A",X"9D",X"4D",X"FE",X"06",X"C0", + X"2A",X"BD",X"4D",X"22",X"CB",X"4D",X"3E",X"01",X"32",X"A6",X"4D",X"32",X"A7",X"4D",X"32",X"A8", + X"4D",X"32",X"A9",X"4D",X"32",X"AA",X"4D",X"32",X"B1",X"4D",X"32",X"B2",X"4D",X"32",X"B3",X"4D", + X"32",X"B4",X"4D",X"32",X"B5",X"4D",X"AF",X"32",X"C8",X"4D",X"32",X"D0",X"4D",X"DD",X"21",X"00", + X"4C",X"DD",X"36",X"02",X"1C",X"DD",X"36",X"04",X"1C",X"DD",X"36",X"06",X"1C",X"DD",X"36",X"08", + X"1C",X"DD",X"36",X"03",X"11",X"DD",X"36",X"05",X"11",X"DD",X"36",X"07",X"11",X"DD",X"36",X"09", + X"11",X"21",X"AC",X"4E",X"CB",X"EE",X"CB",X"BE",X"C9",X"2A",X"03",X"33",X"3E",X"02",X"32",X"3C", + X"4D",X"22",X"26",X"4D",X"06",X"00",X"C3",X"E4",X"18",X"2A",X"FF",X"32",X"AF",X"32",X"3C",X"4D", + X"22",X"26",X"4D",X"06",X"00",X"C3",X"E4",X"18",X"2A",X"05",X"33",X"3E",X"03",X"32",X"3C",X"4D", + X"22",X"26",X"4D",X"06",X"00",X"C3",X"E4",X"18",X"2A",X"01",X"33",X"3E",X"01",X"32",X"3C",X"4D", + X"22",X"26",X"4D",X"06",X"00",X"C3",X"E4",X"18",X"3A",X"12",X"4E",X"A7",X"CA",X"14",X"1B",X"21", + X"9F",X"4D",X"34",X"C9",X"3A",X"A3",X"4D",X"A7",X"C0",X"3A",X"A2",X"4D",X"A7",X"CA",X"25",X"1B", + X"21",X"11",X"4E",X"34",X"C9",X"3A",X"A1",X"4D",X"A7",X"CA",X"31",X"1B",X"21",X"10",X"4E",X"34", + X"C9",X"21",X"0F",X"4E",X"34",X"C9",X"3A",X"A0",X"4D",X"A7",X"C8",X"3A",X"AC",X"4D",X"A7",X"C0", + X"CD",X"D7",X"20",X"2A",X"31",X"4D",X"01",X"99",X"4D",X"CD",X"5A",X"20",X"3A",X"99",X"4D",X"A7", + X"CA",X"6A",X"1B",X"2A",X"60",X"4D",X"29",X"22",X"60",X"4D",X"2A",X"5E",X"4D",X"ED",X"6A",X"22", + X"5E",X"4D",X"D0",X"21",X"60",X"4D",X"34",X"C3",X"D8",X"1B",X"3A",X"A7",X"4D",X"A7",X"CA",X"88", + X"1B",X"2A",X"5C",X"4D",X"29",X"22",X"5C",X"4D",X"2A",X"5A",X"4D",X"ED",X"6A",X"22",X"5A",X"4D", + X"D0",X"21",X"5C",X"4D",X"34",X"C3",X"D8",X"1B",X"3A",X"B7",X"4D",X"A7",X"CA",X"A6",X"1B",X"2A", + X"50",X"4D",X"29",X"22",X"50",X"4D",X"2A",X"4E",X"4D",X"ED",X"6A",X"22",X"4E",X"4D",X"D0",X"21", + X"50",X"4D",X"34",X"C3",X"D8",X"1B",X"3A",X"B6",X"4D",X"A7",X"CA",X"C4",X"1B",X"2A",X"54",X"4D", + X"29",X"22",X"54",X"4D",X"2A",X"52",X"4D",X"ED",X"6A",X"22",X"52",X"4D",X"D0",X"21",X"54",X"4D", + X"34",X"C3",X"D8",X"1B",X"2A",X"58",X"4D",X"29",X"22",X"58",X"4D",X"2A",X"56",X"4D",X"ED",X"6A", + X"22",X"56",X"4D",X"D0",X"21",X"58",X"4D",X"34",X"21",X"14",X"4D",X"7E",X"A7",X"CA",X"ED",X"1B", + X"3A",X"00",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"F7",X"1B",X"C3",X"36",X"1C",X"3A",X"01",X"4D", + X"E6",X"07",X"FE",X"04",X"C2",X"36",X"1C",X"3E",X"01",X"CD",X"D0",X"1E",X"38",X"1B",X"3A",X"A7", + X"4D",X"A7",X"CA",X"0B",X"1C",X"EF",X"0C",X"00",X"C3",X"19",X"1C",X"2A",X"0A",X"4D",X"CD",X"52", + X"20",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"08",X"00",X"CD",X"FE",X"1E",X"DD",X"21",X"1E",X"4D", + X"FD",X"21",X"0A",X"4D",X"CD",X"00",X"20",X"22",X"0A",X"4D",X"2A",X"1E",X"4D",X"22",X"14",X"4D", + X"3A",X"2C",X"4D",X"32",X"28",X"4D",X"DD",X"21",X"14",X"4D",X"FD",X"21",X"00",X"4D",X"CD",X"00", + X"20",X"22",X"00",X"4D",X"CD",X"18",X"20",X"22",X"31",X"4D",X"C9",X"3A",X"A1",X"4D",X"FE",X"01", + X"C0",X"3A",X"AD",X"4D",X"A7",X"C0",X"2A",X"33",X"4D",X"01",X"9A",X"4D",X"CD",X"5A",X"20",X"3A", + X"9A",X"4D",X"A7",X"CA",X"7D",X"1C",X"2A",X"6C",X"4D",X"29",X"22",X"6C",X"4D",X"2A",X"6A",X"4D", + X"ED",X"6A",X"22",X"6A",X"4D",X"D0",X"21",X"6C",X"4D",X"34",X"C3",X"AF",X"1C",X"3A",X"A8",X"4D", + X"A7",X"CA",X"9B",X"1C",X"2A",X"68",X"4D",X"29",X"22",X"68",X"4D",X"2A",X"66",X"4D",X"ED",X"6A", + X"22",X"66",X"4D",X"D0",X"21",X"68",X"4D",X"34",X"C3",X"AF",X"1C",X"2A",X"64",X"4D",X"29",X"22", + X"64",X"4D",X"2A",X"62",X"4D",X"ED",X"6A",X"22",X"62",X"4D",X"D0",X"21",X"64",X"4D",X"34",X"21", + X"16",X"4D",X"7E",X"A7",X"CA",X"C4",X"1C",X"3A",X"02",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"CE", + X"1C",X"C3",X"0D",X"1D",X"3A",X"03",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"0D",X"1D",X"3E",X"02", + X"CD",X"D0",X"1E",X"38",X"1B",X"3A",X"A8",X"4D",X"A7",X"CA",X"E2",X"1C",X"EF",X"0D",X"00",X"C3", + X"F0",X"1C",X"2A",X"0C",X"4D",X"CD",X"52",X"20",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"09",X"00", + X"CD",X"25",X"1F",X"DD",X"21",X"20",X"4D",X"FD",X"21",X"0C",X"4D",X"CD",X"00",X"20",X"22",X"0C", + X"4D",X"2A",X"20",X"4D",X"22",X"16",X"4D",X"3A",X"2D",X"4D",X"32",X"29",X"4D",X"DD",X"21",X"16", + X"4D",X"FD",X"21",X"02",X"4D",X"CD",X"00",X"20",X"22",X"02",X"4D",X"CD",X"18",X"20",X"22",X"33", + X"4D",X"C9",X"3A",X"A2",X"4D",X"FE",X"01",X"C0",X"3A",X"AE",X"4D",X"A7",X"C0",X"2A",X"35",X"4D", + X"01",X"9B",X"4D",X"CD",X"5A",X"20",X"3A",X"9B",X"4D",X"A7",X"CA",X"54",X"1D",X"2A",X"78",X"4D", + X"29",X"22",X"78",X"4D",X"2A",X"76",X"4D",X"ED",X"6A",X"22",X"76",X"4D",X"D0",X"21",X"78",X"4D", + X"34",X"C3",X"86",X"1D",X"3A",X"A9",X"4D",X"A7",X"CA",X"72",X"1D",X"2A",X"74",X"4D",X"29",X"22", + X"74",X"4D",X"2A",X"72",X"4D",X"ED",X"6A",X"22",X"72",X"4D",X"D0",X"21",X"74",X"4D",X"34",X"C3", + X"86",X"1D",X"2A",X"70",X"4D",X"29",X"22",X"70",X"4D",X"2A",X"6E",X"4D",X"ED",X"6A",X"22",X"6E", + X"4D",X"D0",X"21",X"70",X"4D",X"34",X"21",X"18",X"4D",X"7E",X"A7",X"CA",X"9B",X"1D",X"3A",X"04", + X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"A5",X"1D",X"C3",X"E4",X"1D",X"3A",X"05",X"4D",X"E6",X"07", + X"FE",X"04",X"C2",X"E4",X"1D",X"3E",X"03",X"CD",X"D0",X"1E",X"38",X"1B",X"3A",X"A9",X"4D",X"A7", + X"CA",X"B9",X"1D",X"EF",X"0E",X"00",X"C3",X"C7",X"1D",X"2A",X"0E",X"4D",X"CD",X"52",X"20",X"7E", + X"FE",X"1A",X"28",X"03",X"EF",X"0A",X"00",X"CD",X"4C",X"1F",X"DD",X"21",X"22",X"4D",X"FD",X"21", + X"0E",X"4D",X"CD",X"00",X"20",X"22",X"0E",X"4D",X"2A",X"22",X"4D",X"22",X"18",X"4D",X"3A",X"2E", + X"4D",X"32",X"2A",X"4D",X"DD",X"21",X"18",X"4D",X"FD",X"21",X"04",X"4D",X"CD",X"00",X"20",X"22", + X"04",X"4D",X"CD",X"18",X"20",X"22",X"35",X"4D",X"C9",X"3A",X"A3",X"4D",X"FE",X"01",X"C0",X"3A", + X"AF",X"4D",X"A7",X"C0",X"2A",X"37",X"4D",X"01",X"9C",X"4D",X"CD",X"5A",X"20",X"3A",X"9C",X"4D", + X"A7",X"CA",X"2B",X"1E",X"2A",X"84",X"4D",X"29",X"22",X"84",X"4D",X"2A",X"82",X"4D",X"ED",X"6A", + X"22",X"82",X"4D",X"D0",X"21",X"84",X"4D",X"34",X"C3",X"5D",X"1E",X"3A",X"AA",X"4D",X"A7",X"CA", + X"49",X"1E",X"2A",X"80",X"4D",X"29",X"22",X"80",X"4D",X"2A",X"7E",X"4D",X"ED",X"6A",X"22",X"7E", + X"4D",X"D0",X"21",X"80",X"4D",X"34",X"C3",X"5D",X"1E",X"2A",X"7C",X"4D",X"29",X"22",X"7C",X"4D", + X"2A",X"7A",X"4D",X"ED",X"6A",X"22",X"7A",X"4D",X"D0",X"21",X"7C",X"4D",X"34",X"21",X"1A",X"4D", + X"7E",X"A7",X"CA",X"72",X"1E",X"3A",X"06",X"4D",X"E6",X"07",X"FE",X"04",X"CA",X"7C",X"1E",X"C3", + X"BB",X"1E",X"3A",X"07",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"BB",X"1E",X"3E",X"04",X"CD",X"D0", + X"1E",X"38",X"1B",X"3A",X"AA",X"4D",X"A7",X"CA",X"90",X"1E",X"EF",X"0F",X"00",X"C3",X"9E",X"1E", + X"2A",X"10",X"4D",X"CD",X"52",X"20",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"0B",X"00",X"CD",X"73", + X"1F",X"DD",X"21",X"24",X"4D",X"FD",X"21",X"10",X"4D",X"CD",X"00",X"20",X"22",X"10",X"4D",X"2A", + X"24",X"4D",X"22",X"1A",X"4D",X"3A",X"2F",X"4D",X"32",X"2B",X"4D",X"DD",X"21",X"1A",X"4D",X"FD", + X"21",X"06",X"4D",X"CD",X"00",X"20",X"22",X"06",X"4D",X"CD",X"18",X"20",X"22",X"37",X"4D",X"C9", + X"87",X"4F",X"06",X"00",X"21",X"09",X"4D",X"09",X"7E",X"FE",X"1D",X"C2",X"E3",X"1E",X"36",X"3D", + X"C3",X"FC",X"1E",X"FE",X"3E",X"C2",X"ED",X"1E",X"36",X"1E",X"C3",X"FC",X"1E",X"06",X"21",X"90", + X"DA",X"FC",X"1E",X"7E",X"06",X"3B",X"90",X"D2",X"FC",X"1E",X"A7",X"C9",X"37",X"C9",X"3A",X"B1", + X"4D",X"A7",X"C8",X"AF",X"32",X"B1",X"4D",X"21",X"FF",X"32",X"3A",X"28",X"4D",X"EE",X"02",X"32", + X"2C",X"4D",X"47",X"DF",X"22",X"1E",X"4D",X"3A",X"02",X"4E",X"FE",X"22",X"C0",X"22",X"14",X"4D", + X"78",X"32",X"28",X"4D",X"C9",X"3A",X"B2",X"4D",X"A7",X"C8",X"AF",X"32",X"B2",X"4D",X"21",X"FF", + X"32",X"3A",X"29",X"4D",X"EE",X"02",X"32",X"2D",X"4D",X"47",X"DF",X"22",X"20",X"4D",X"3A",X"02", + X"4E",X"FE",X"22",X"C0",X"22",X"16",X"4D",X"78",X"32",X"29",X"4D",X"C9",X"3A",X"B3",X"4D",X"A7", + X"C8",X"AF",X"32",X"B3",X"4D",X"21",X"FF",X"32",X"3A",X"2A",X"4D",X"EE",X"02",X"32",X"2E",X"4D", + X"47",X"DF",X"22",X"22",X"4D",X"3A",X"02",X"4E",X"FE",X"22",X"C0",X"22",X"18",X"4D",X"78",X"32", + X"2A",X"4D",X"C9",X"3A",X"B4",X"4D",X"A7",X"C8",X"AF",X"32",X"B4",X"4D",X"21",X"FF",X"32",X"3A", + X"2B",X"4D",X"EE",X"02",X"32",X"2F",X"4D",X"47",X"DF",X"22",X"24",X"4D",X"3A",X"02",X"4E",X"FE", + X"22",X"C0",X"22",X"1A",X"4D",X"78",X"32",X"2B",X"4D",X"C9",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"15",X"0C", + X"FD",X"7E",X"00",X"DD",X"86",X"00",X"6F",X"FD",X"7E",X"01",X"DD",X"86",X"01",X"67",X"C9",X"CD", + X"00",X"20",X"CD",X"65",X"00",X"7E",X"A7",X"C9",X"7D",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6", + X"20",X"6F",X"7C",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6",X"1E",X"67",X"C9",X"F5",X"C5",X"7D", + X"D6",X"20",X"6F",X"7C",X"D6",X"20",X"67",X"06",X"00",X"CB",X"24",X"CB",X"24",X"CB",X"24",X"CB", + X"24",X"CB",X"10",X"CB",X"24",X"CB",X"10",X"4C",X"26",X"00",X"09",X"01",X"40",X"40",X"09",X"C1", + X"F1",X"C9",X"CD",X"65",X"00",X"11",X"00",X"04",X"19",X"C9",X"CD",X"52",X"20",X"7E",X"FE",X"1B", + X"20",X"04",X"3E",X"01",X"02",X"C9",X"AF",X"02",X"C9",X"3A",X"A1",X"4D",X"A7",X"C0",X"3A",X"12", + X"4E",X"A7",X"CA",X"7E",X"20",X"3A",X"9F",X"4D",X"FE",X"07",X"C0",X"C3",X"86",X"20",X"21",X"B8", + X"4D",X"3A",X"0F",X"4E",X"BE",X"D8",X"3E",X"02",X"32",X"A1",X"4D",X"C9",X"3A",X"A2",X"4D",X"A7", + X"C0",X"3A",X"12",X"4E",X"A7",X"CA",X"A1",X"20",X"3A",X"9F",X"4D",X"FE",X"11",X"C0",X"C3",X"A9", + X"20",X"21",X"B9",X"4D",X"3A",X"10",X"4E",X"BE",X"D8",X"3E",X"03",X"32",X"A2",X"4D",X"C9",X"3A", + X"A3",X"4D",X"A7",X"C0",X"3A",X"12",X"4E",X"A7",X"CA",X"C9",X"20",X"3A",X"9F",X"4D",X"FE",X"20", + X"C0",X"AF",X"32",X"12",X"4E",X"32",X"9F",X"4D",X"C9",X"21",X"BA",X"4D",X"3A",X"11",X"4E",X"BE", + X"D8",X"3E",X"03",X"32",X"A3",X"4D",X"C9",X"3A",X"A3",X"4D",X"A7",X"C8",X"21",X"0E",X"4E",X"3A", + X"B6",X"4D",X"A7",X"C2",X"F4",X"20",X"3E",X"F4",X"96",X"47",X"3A",X"BB",X"4D",X"90",X"D8",X"3E", + X"01",X"32",X"B6",X"4D",X"3A",X"B7",X"4D",X"A7",X"C0",X"3E",X"F4",X"96",X"47",X"3A",X"BC",X"4D", + X"90",X"D8",X"3E",X"01",X"32",X"B7",X"4D",X"C9",X"3A",X"06",X"4E",X"E7",X"1A",X"21",X"40",X"21", + X"4B",X"21",X"0C",X"00",X"70",X"21",X"7B",X"21",X"86",X"21",X"3A",X"3A",X"4D",X"D6",X"21",X"20", + X"0F",X"3C",X"32",X"A0",X"4D",X"32",X"B7",X"4D",X"CD",X"06",X"05",X"21",X"06",X"4E",X"34",X"C9", + X"CD",X"06",X"18",X"CD",X"06",X"18",X"CD",X"36",X"1B",X"CD",X"36",X"1B",X"CD",X"23",X"0E",X"C9", + X"3A",X"3A",X"4D",X"D6",X"1E",X"C2",X"30",X"21",X"C3",X"2B",X"21",X"3A",X"32",X"4D",X"D6",X"1E", + X"C2",X"36",X"21",X"CD",X"70",X"1A",X"AF",X"32",X"AC",X"4E",X"32",X"BC",X"4E",X"CD",X"A5",X"05", + X"22",X"1C",X"4D",X"3A",X"3C",X"4D",X"32",X"30",X"4D",X"F7",X"45",X"07",X"00",X"C3",X"2B",X"21", + X"3A",X"32",X"4D",X"D6",X"2F",X"C2",X"36",X"21",X"C3",X"2B",X"21",X"3A",X"32",X"4D",X"D6",X"3D", + X"C2",X"30",X"21",X"C3",X"2B",X"21",X"CD",X"06",X"18",X"CD",X"06",X"18",X"3A",X"3A",X"4D",X"D6", + X"3D",X"C0",X"32",X"06",X"4E",X"F7",X"45",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"3A",X"07", + X"4E",X"FD",X"21",X"D2",X"41",X"E7",X"C2",X"21",X"0C",X"00",X"E1",X"21",X"F5",X"21",X"0C",X"22", + X"1E",X"22",X"44",X"22",X"5D",X"22",X"0C",X"00",X"6A",X"22",X"0C",X"00",X"86",X"22",X"0C",X"00", + X"8D",X"22",X"3E",X"01",X"32",X"D2",X"45",X"32",X"D3",X"45",X"32",X"F2",X"45",X"32",X"F3",X"45", + X"CD",X"06",X"05",X"FD",X"36",X"00",X"60",X"FD",X"36",X"01",X"61",X"F7",X"43",X"08",X"00",X"18", + X"0F",X"3A",X"3A",X"4D",X"D6",X"2C",X"C2",X"30",X"21",X"3C",X"32",X"A0",X"4D",X"32",X"B7",X"4D", + X"21",X"07",X"4E",X"34",X"C9",X"3A",X"01",X"4D",X"FE",X"77",X"28",X"05",X"FE",X"78",X"C2",X"30", + X"21",X"21",X"84",X"20",X"22",X"4E",X"4D",X"22",X"50",X"4D",X"18",X"E4",X"3A",X"01",X"4D",X"D6", + X"78",X"C2",X"37",X"22",X"FD",X"36",X"00",X"62",X"FD",X"36",X"01",X"63",X"18",X"D2",X"3A",X"01", + X"4D",X"D6",X"7B",X"20",X"12",X"FD",X"36",X"00",X"64",X"FD",X"36",X"01",X"65",X"FD",X"36",X"20", + X"66",X"FD",X"36",X"21",X"67",X"18",X"B9",X"CD",X"06",X"18",X"CD",X"06",X"18",X"CD",X"36",X"1B", + X"CD",X"23",X"0E",X"C9",X"3A",X"01",X"4D",X"D6",X"7E",X"20",X"EC",X"FD",X"36",X"00",X"68",X"FD", + X"36",X"01",X"69",X"FD",X"36",X"20",X"6A",X"FD",X"36",X"21",X"6B",X"18",X"93",X"3A",X"01",X"4D", + X"D6",X"80",X"20",X"D3",X"F7",X"4F",X"08",X"00",X"18",X"86",X"21",X"01",X"4D",X"34",X"34",X"FD", + X"36",X"00",X"6C",X"FD",X"36",X"01",X"6D",X"FD",X"36",X"20",X"40",X"FD",X"36",X"21",X"40",X"F7", + X"4A",X"08",X"00",X"C3",X"F0",X"21",X"F7",X"54",X"08",X"00",X"C3",X"F0",X"21",X"AF",X"32",X"07", + X"4E",X"21",X"04",X"4E",X"34",X"34",X"C9",X"3A",X"08",X"4E",X"E7",X"A7",X"22",X"BE",X"22",X"0C", + X"00",X"DD",X"22",X"F5",X"22",X"FE",X"22",X"3A",X"3A",X"4D",X"D6",X"25",X"C2",X"30",X"21",X"3C", + X"32",X"A0",X"4D",X"32",X"B7",X"4D",X"CD",X"06",X"05",X"21",X"08",X"4E",X"34",X"C9",X"3A",X"01", + X"4D",X"FE",X"FF",X"28",X"05",X"FE",X"FE",X"C2",X"30",X"21",X"3C",X"3C",X"32",X"01",X"4D",X"3E", + X"01",X"32",X"B1",X"4D",X"CD",X"FE",X"1E",X"F7",X"4A",X"09",X"00",X"18",X"DC",X"3A",X"32",X"4D", + X"D6",X"2D",X"28",X"D5",X"3A",X"00",X"4D",X"32",X"D2",X"4D",X"3A",X"01",X"4D",X"D6",X"08",X"32", + X"D3",X"4D",X"C3",X"30",X"21",X"3A",X"32",X"4D",X"D6",X"1E",X"28",X"BD",X"18",X"E6",X"AF",X"32", + X"08",X"4E",X"F7",X"45",X"00",X"00",X"21",X"04",X"4E",X"34",X"C9",X"21",X"00",X"50",X"06",X"08", + X"AF",X"77",X"2C",X"10",X"FC",X"21",X"00",X"40",X"06",X"04",X"32",X"C0",X"50",X"32",X"07",X"50", + X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F1",X"06",X"04",X"32",X"C0",X"50",X"AF",X"32", + X"07",X"50",X"3E",X"0F",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F0",X"ED",X"56",X"3E",X"FA",X"00", + X"00",X"AF",X"32",X"07",X"50",X"3C",X"32",X"00",X"50",X"FB",X"76",X"32",X"C0",X"50",X"31",X"C0", + X"4F",X"AF",X"21",X"00",X"50",X"01",X"08",X"08",X"CF",X"21",X"00",X"4C",X"06",X"BE",X"CF",X"CF", + X"CF",X"CF",X"21",X"40",X"50",X"06",X"40",X"CF",X"32",X"C0",X"50",X"CD",X"0D",X"24",X"32",X"C0", + X"50",X"06",X"00",X"CD",X"ED",X"23",X"32",X"C0",X"50",X"21",X"C0",X"4C",X"22",X"80",X"4C",X"22", + X"82",X"4C",X"3E",X"FF",X"06",X"40",X"CF",X"3E",X"01",X"32",X"00",X"50",X"FB",X"2A",X"82",X"4C", + X"7E",X"A7",X"FA",X"8D",X"23",X"36",X"FF",X"2C",X"46",X"36",X"FF",X"2C",X"20",X"02",X"2E",X"C0", + X"22",X"82",X"4C",X"21",X"8D",X"23",X"E5",X"E7",X"ED",X"23",X"D7",X"24",X"19",X"24",X"48",X"24", + X"3D",X"25",X"8B",X"26",X"0D",X"24",X"98",X"26",X"30",X"27",X"6C",X"27",X"A9",X"27",X"F1",X"27", + X"3B",X"28",X"65",X"28",X"8F",X"28",X"B9",X"28",X"0D",X"00",X"A2",X"26",X"C9",X"24",X"35",X"2A", + X"D0",X"26",X"87",X"24",X"E8",X"23",X"E3",X"28",X"E0",X"2A",X"5A",X"2A",X"6A",X"2B",X"EA",X"2B", + X"5E",X"2C",X"A1",X"2B",X"75",X"26",X"B2",X"26",X"21",X"04",X"4E",X"34",X"C9",X"78",X"E7",X"F3", + X"23",X"00",X"24",X"3E",X"40",X"01",X"04",X"00",X"21",X"00",X"40",X"CF",X"0D",X"20",X"FC",X"C9", + X"3E",X"40",X"21",X"40",X"40",X"01",X"04",X"80",X"CF",X"0D",X"20",X"FC",X"C9",X"AF",X"01",X"04", + X"00",X"21",X"00",X"44",X"CF",X"0D",X"20",X"FC",X"C9",X"21",X"00",X"40",X"01",X"35",X"34",X"0A", + X"A7",X"C8",X"FA",X"2C",X"24",X"5F",X"16",X"00",X"19",X"2B",X"03",X"0A",X"23",X"77",X"F5",X"E5", + X"11",X"E0",X"83",X"7D",X"E6",X"1F",X"87",X"26",X"00",X"6F",X"19",X"D1",X"A7",X"ED",X"52",X"F1", + X"EE",X"01",X"77",X"EB",X"03",X"C3",X"1F",X"24",X"21",X"00",X"40",X"DD",X"21",X"16",X"4E",X"FD", + X"21",X"B5",X"35",X"16",X"00",X"06",X"1E",X"0E",X"08",X"DD",X"7E",X"00",X"FD",X"5E",X"00",X"19", + X"07",X"30",X"02",X"36",X"10",X"FD",X"23",X"0D",X"20",X"F2",X"DD",X"23",X"05",X"20",X"E8",X"21", + X"34",X"4E",X"11",X"64",X"40",X"ED",X"A0",X"11",X"78",X"40",X"ED",X"A0",X"11",X"84",X"43",X"ED", + X"A0",X"11",X"98",X"43",X"ED",X"A0",X"C9",X"21",X"00",X"40",X"DD",X"21",X"16",X"4E",X"FD",X"21", + X"B5",X"35",X"16",X"00",X"06",X"1E",X"0E",X"08",X"FD",X"5E",X"00",X"19",X"7E",X"FE",X"10",X"37", + X"28",X"01",X"3F",X"DD",X"CB",X"00",X"16",X"FD",X"23",X"0D",X"20",X"EC",X"DD",X"23",X"05",X"20", + X"E5",X"21",X"64",X"40",X"11",X"34",X"4E",X"ED",X"A0",X"21",X"78",X"40",X"ED",X"A0",X"21",X"84", + X"43",X"ED",X"A0",X"21",X"98",X"43",X"ED",X"A0",X"C9",X"21",X"16",X"4E",X"3E",X"FF",X"06",X"1E", + X"CF",X"3E",X"14",X"06",X"04",X"CF",X"C9",X"58",X"78",X"FE",X"02",X"3E",X"1F",X"28",X"02",X"3E", + X"10",X"21",X"40",X"44",X"01",X"04",X"80",X"CF",X"0D",X"20",X"FC",X"3E",X"0F",X"06",X"40",X"21", + X"C0",X"47",X"CF",X"7B",X"FE",X"01",X"C0",X"3E",X"1A",X"11",X"20",X"00",X"06",X"06",X"DD",X"21", + X"A0",X"45",X"DD",X"77",X"0C",X"DD",X"77",X"18",X"DD",X"19",X"10",X"F6",X"3E",X"1B",X"06",X"05", + X"DD",X"21",X"40",X"44",X"DD",X"77",X"0E",X"DD",X"77",X"0F",X"DD",X"77",X"10",X"DD",X"19",X"10", + X"F3",X"06",X"05",X"DD",X"21",X"20",X"47",X"DD",X"77",X"0E",X"DD",X"77",X"0F",X"DD",X"77",X"10", + X"DD",X"19",X"10",X"F3",X"3E",X"18",X"32",X"ED",X"45",X"32",X"0D",X"46",X"C9",X"DD",X"21",X"00", + X"4C",X"DD",X"36",X"02",X"20",X"DD",X"36",X"04",X"20",X"DD",X"36",X"06",X"20",X"DD",X"36",X"08", + X"20",X"DD",X"36",X"0A",X"2C",X"DD",X"36",X"0C",X"3F",X"DD",X"36",X"03",X"01",X"DD",X"36",X"05", + X"03",X"DD",X"36",X"07",X"05",X"DD",X"36",X"09",X"07",X"DD",X"36",X"0B",X"09",X"DD",X"36",X"0D", + X"00",X"78",X"A7",X"C2",X"0F",X"26",X"21",X"64",X"80",X"22",X"00",X"4D",X"21",X"7C",X"80",X"22", + X"02",X"4D",X"21",X"7C",X"90",X"22",X"04",X"4D",X"21",X"7C",X"70",X"22",X"06",X"4D",X"21",X"C4", + X"80",X"22",X"08",X"4D",X"21",X"2C",X"2E",X"22",X"0A",X"4D",X"22",X"31",X"4D",X"21",X"2F",X"2E", + X"22",X"0C",X"4D",X"22",X"33",X"4D",X"21",X"2F",X"30",X"22",X"0E",X"4D",X"22",X"35",X"4D",X"21", + X"2F",X"2C",X"22",X"10",X"4D",X"22",X"37",X"4D",X"21",X"38",X"2E",X"22",X"12",X"4D",X"22",X"39", + X"4D",X"21",X"00",X"01",X"22",X"14",X"4D",X"22",X"1E",X"4D",X"21",X"01",X"00",X"22",X"16",X"4D", + X"22",X"20",X"4D",X"21",X"FF",X"00",X"22",X"18",X"4D",X"22",X"22",X"4D",X"21",X"FF",X"00",X"22", + X"1A",X"4D",X"22",X"24",X"4D",X"21",X"00",X"01",X"22",X"1C",X"4D",X"22",X"26",X"4D",X"21",X"02", + X"01",X"22",X"28",X"4D",X"22",X"2C",X"4D",X"21",X"03",X"03",X"22",X"2A",X"4D",X"22",X"2E",X"4D", + X"3E",X"02",X"32",X"30",X"4D",X"32",X"3C",X"4D",X"21",X"00",X"00",X"22",X"D2",X"4D",X"C9",X"21", + X"94",X"00",X"22",X"00",X"4D",X"22",X"02",X"4D",X"22",X"04",X"4D",X"22",X"06",X"4D",X"21",X"32", + X"1E",X"22",X"0A",X"4D",X"22",X"0C",X"4D",X"22",X"0E",X"4D",X"22",X"10",X"4D",X"22",X"31",X"4D", + X"22",X"33",X"4D",X"22",X"35",X"4D",X"22",X"37",X"4D",X"21",X"00",X"01",X"22",X"14",X"4D",X"22", + X"16",X"4D",X"22",X"18",X"4D",X"22",X"1A",X"4D",X"22",X"1E",X"4D",X"22",X"20",X"4D",X"22",X"22", + X"4D",X"22",X"24",X"4D",X"22",X"1C",X"4D",X"22",X"26",X"4D",X"21",X"28",X"4D",X"3E",X"02",X"06", + X"09",X"CF",X"32",X"3C",X"4D",X"21",X"94",X"08",X"22",X"08",X"4D",X"21",X"32",X"1F",X"22",X"12", + X"4D",X"22",X"39",X"4D",X"C9",X"21",X"00",X"00",X"22",X"D2",X"4D",X"22",X"08",X"4D",X"22",X"00", + X"4D",X"22",X"02",X"4D",X"22",X"04",X"4D",X"22",X"06",X"4D",X"C9",X"3E",X"55",X"32",X"94",X"4D", + X"05",X"C8",X"3E",X"01",X"32",X"A0",X"4D",X"C9",X"3E",X"01",X"32",X"00",X"4E",X"AF",X"32",X"01", + X"4E",X"C9",X"AF",X"11",X"00",X"4D",X"21",X"00",X"4E",X"12",X"13",X"A7",X"ED",X"52",X"C2",X"A6", + X"26",X"C9",X"DD",X"21",X"36",X"41",X"3A",X"71",X"4E",X"E6",X"0F",X"C6",X"30",X"DD",X"77",X"00", + X"3A",X"71",X"4E",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"C8",X"C6",X"30",X"DD",X"77",X"20",X"C9", + X"3A",X"80",X"50",X"47",X"E6",X"03",X"C2",X"DE",X"26",X"21",X"6E",X"4E",X"36",X"FF",X"4F",X"1F", + X"CE",X"00",X"32",X"6B",X"4E",X"E6",X"02",X"A9",X"32",X"6D",X"4E",X"78",X"0F",X"0F",X"E6",X"03", + X"3C",X"FE",X"04",X"20",X"01",X"3C",X"32",X"6F",X"4E",X"78",X"0F",X"0F",X"0F",X"0F",X"E6",X"03", + X"21",X"28",X"27",X"D7",X"32",X"71",X"4E",X"78",X"07",X"2F",X"E6",X"01",X"32",X"75",X"4E",X"78", + X"07",X"07",X"2F",X"E6",X"01",X"47",X"21",X"2C",X"27",X"DF",X"22",X"73",X"4E",X"3A",X"40",X"50", + X"07",X"2F",X"E6",X"01",X"32",X"72",X"4E",X"C9",X"10",X"15",X"20",X"FF",X"68",X"00",X"7D",X"00", + X"3A",X"C1",X"4D",X"CB",X"47",X"C2",X"58",X"27",X"3A",X"B6",X"4D",X"A7",X"20",X"1A",X"3A",X"04", + X"4E",X"FE",X"03",X"20",X"13",X"2A",X"0A",X"4D",X"3A",X"2C",X"4D",X"11",X"1D",X"22",X"CD",X"66", + X"29",X"22",X"1E",X"4D",X"32",X"2C",X"4D",X"C9",X"2A",X"0A",X"4D",X"ED",X"5B",X"39",X"4D",X"3A", + X"2C",X"4D",X"CD",X"66",X"29",X"22",X"1E",X"4D",X"32",X"2C",X"4D",X"C9",X"3A",X"C1",X"4D",X"CB", + X"47",X"C2",X"8E",X"27",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13",X"2A",X"0C",X"4D",X"3A",X"2D", + X"4D",X"11",X"1D",X"39",X"CD",X"66",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"ED",X"5B", + X"39",X"4D",X"2A",X"1C",X"4D",X"29",X"29",X"19",X"EB",X"2A",X"0C",X"4D",X"3A",X"2D",X"4D",X"CD", + X"66",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"3A",X"C1",X"4D",X"CB",X"47",X"C2",X"CB", + X"27",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"11",X"40", + X"20",X"CD",X"66",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9",X"ED",X"4B",X"0A",X"4D",X"ED", + X"5B",X"39",X"4D",X"2A",X"1C",X"4D",X"29",X"19",X"7D",X"87",X"91",X"6F",X"7C",X"87",X"90",X"67", + X"EB",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD",X"66",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D", + X"C9",X"3A",X"C1",X"4D",X"CB",X"47",X"C2",X"13",X"28",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13", + X"2A",X"10",X"4D",X"3A",X"2F",X"4D",X"11",X"40",X"3B",X"CD",X"66",X"29",X"22",X"24",X"4D",X"32", + X"2F",X"4D",X"C9",X"DD",X"21",X"39",X"4D",X"FD",X"21",X"10",X"4D",X"CD",X"EA",X"29",X"11",X"40", + X"00",X"A7",X"ED",X"52",X"DA",X"00",X"28",X"2A",X"10",X"4D",X"ED",X"5B",X"39",X"4D",X"3A",X"2F", + X"4D",X"CD",X"66",X"29",X"22",X"24",X"4D",X"32",X"2F",X"4D",X"C9",X"3A",X"AC",X"4D",X"A7",X"CA", + X"55",X"28",X"11",X"2C",X"2E",X"2A",X"0A",X"4D",X"3A",X"2C",X"4D",X"CD",X"66",X"29",X"22",X"1E", + X"4D",X"32",X"2C",X"4D",X"C9",X"2A",X"0A",X"4D",X"3A",X"2C",X"4D",X"CD",X"1E",X"29",X"22",X"1E", + X"4D",X"32",X"2C",X"4D",X"C9",X"3A",X"AD",X"4D",X"A7",X"CA",X"7F",X"28",X"11",X"2C",X"2E",X"2A", + X"0C",X"4D",X"3A",X"2D",X"4D",X"CD",X"66",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"2A", + X"0C",X"4D",X"3A",X"2D",X"4D",X"CD",X"1E",X"29",X"22",X"20",X"4D",X"32",X"2D",X"4D",X"C9",X"3A", + X"AE",X"4D",X"A7",X"CA",X"A9",X"28",X"11",X"2C",X"2E",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD", + X"66",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9",X"2A",X"0E",X"4D",X"3A",X"2E",X"4D",X"CD", + X"1E",X"29",X"22",X"22",X"4D",X"32",X"2E",X"4D",X"C9",X"3A",X"AF",X"4D",X"A7",X"CA",X"D3",X"28", + X"11",X"2C",X"2E",X"2A",X"10",X"4D",X"3A",X"2F",X"4D",X"CD",X"66",X"29",X"22",X"24",X"4D",X"32", + X"2F",X"4D",X"C9",X"2A",X"10",X"4D",X"3A",X"2F",X"4D",X"CD",X"1E",X"29",X"22",X"24",X"4D",X"32", + X"2F",X"4D",X"C9",X"3A",X"A7",X"4D",X"A7",X"CA",X"FE",X"28",X"2A",X"12",X"4D",X"ED",X"5B",X"0C", + X"4D",X"3A",X"3C",X"4D",X"CD",X"66",X"29",X"22",X"26",X"4D",X"32",X"3C",X"4D",X"C9",X"2A",X"39", + X"4D",X"ED",X"4B",X"0C",X"4D",X"7D",X"87",X"91",X"6F",X"7C",X"87",X"90",X"67",X"EB",X"2A",X"12", + X"4D",X"3A",X"3C",X"4D",X"CD",X"66",X"29",X"22",X"26",X"4D",X"32",X"3C",X"4D",X"C9",X"22",X"3E", + X"4D",X"EE",X"02",X"32",X"3D",X"4D",X"CD",X"23",X"2A",X"E6",X"03",X"21",X"3B",X"4D",X"77",X"87", + X"5F",X"16",X"00",X"DD",X"21",X"FF",X"32",X"DD",X"19",X"FD",X"21",X"3E",X"4D",X"3A",X"3D",X"4D", + X"BE",X"CA",X"57",X"29",X"CD",X"0F",X"20",X"E6",X"C0",X"D6",X"C0",X"28",X"0A",X"DD",X"6E",X"00", + X"DD",X"66",X"01",X"3A",X"3B",X"4D",X"C9",X"DD",X"23",X"DD",X"23",X"21",X"3B",X"4D",X"7E",X"3C", + X"E6",X"03",X"77",X"C3",X"3D",X"29",X"22",X"3E",X"4D",X"ED",X"53",X"40",X"4D",X"32",X"3B",X"4D", + X"EE",X"02",X"32",X"3D",X"4D",X"21",X"FF",X"FF",X"22",X"44",X"4D",X"DD",X"21",X"FF",X"32",X"FD", + X"21",X"3E",X"4D",X"21",X"C7",X"4D",X"36",X"00",X"3A",X"3D",X"4D",X"BE",X"CA",X"C6",X"29",X"CD", + X"00",X"20",X"22",X"42",X"4D",X"CD",X"65",X"00",X"7E",X"E6",X"C0",X"D6",X"C0",X"28",X"27",X"DD", + X"E5",X"FD",X"E5",X"DD",X"21",X"40",X"4D",X"FD",X"21",X"42",X"4D",X"CD",X"EA",X"29",X"FD",X"E1", + X"DD",X"E1",X"EB",X"2A",X"44",X"4D",X"A7",X"ED",X"52",X"DA",X"C6",X"29",X"ED",X"53",X"44",X"4D", + X"3A",X"C7",X"4D",X"32",X"3B",X"4D",X"DD",X"23",X"DD",X"23",X"21",X"C7",X"4D",X"34",X"3E",X"04", + X"BE",X"C2",X"88",X"29",X"3A",X"3B",X"4D",X"87",X"5F",X"16",X"00",X"DD",X"21",X"FF",X"32",X"DD", + X"19",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"CB",X"3F",X"C9",X"DD",X"7E",X"00",X"FD",X"46",X"00", + X"90",X"D2",X"F9",X"29",X"78",X"DD",X"46",X"00",X"90",X"CD",X"12",X"2A",X"E5",X"DD",X"7E",X"01", + X"FD",X"46",X"01",X"90",X"D2",X"0C",X"2A",X"78",X"DD",X"46",X"01",X"90",X"CD",X"12",X"2A",X"C1", + X"09",X"C9",X"67",X"5F",X"2E",X"00",X"55",X"0E",X"08",X"29",X"D2",X"1E",X"2A",X"19",X"0D",X"C2", + X"19",X"2A",X"C9",X"2A",X"C9",X"4D",X"54",X"5D",X"29",X"29",X"19",X"23",X"7C",X"E6",X"1F",X"67", + X"7E",X"22",X"C9",X"4D",X"C9",X"11",X"40",X"40",X"21",X"C0",X"43",X"A7",X"ED",X"52",X"C8",X"1A", + X"FE",X"10",X"CA",X"53",X"2A",X"FE",X"12",X"CA",X"53",X"2A",X"FE",X"14",X"CA",X"53",X"2A",X"13", + X"C3",X"38",X"2A",X"3E",X"40",X"12",X"13",X"C3",X"38",X"2A",X"3A",X"00",X"4E",X"FE",X"01",X"C8", + X"21",X"17",X"2B",X"DF",X"EB",X"CD",X"0B",X"2B",X"7B",X"86",X"27",X"77",X"23",X"7A",X"8E",X"27", + X"77",X"5F",X"23",X"3E",X"00",X"8E",X"27",X"77",X"57",X"EB",X"29",X"29",X"29",X"29",X"3A",X"71", + X"4E",X"3D",X"BC",X"DC",X"33",X"2B",X"CD",X"AF",X"2A",X"13",X"13",X"13",X"21",X"8A",X"4E",X"06", + X"03",X"1A",X"BE",X"D8",X"20",X"05",X"1B",X"2B",X"10",X"F7",X"C9",X"CD",X"0B",X"2B",X"11",X"88", + X"4E",X"01",X"03",X"00",X"ED",X"B0",X"1B",X"01",X"04",X"03",X"21",X"F2",X"43",X"18",X"0F",X"3A", + X"09",X"4E",X"01",X"04",X"03",X"21",X"FC",X"43",X"A7",X"28",X"03",X"21",X"E9",X"43",X"1A",X"0F", + X"0F",X"0F",X"0F",X"CD",X"CE",X"2A",X"1A",X"CD",X"CE",X"2A",X"1B",X"10",X"F1",X"C9",X"E6",X"0F", + X"28",X"04",X"0E",X"00",X"18",X"07",X"79",X"A7",X"28",X"03",X"3E",X"40",X"0D",X"77",X"2B",X"C9", + X"06",X"00",X"CD",X"5E",X"2C",X"AF",X"21",X"80",X"4E",X"06",X"08",X"CF",X"01",X"04",X"03",X"11", + X"82",X"4E",X"21",X"FC",X"43",X"CD",X"BE",X"2A",X"01",X"04",X"03",X"11",X"86",X"4E",X"21",X"E9", + X"43",X"3A",X"70",X"4E",X"A7",X"20",X"B7",X"0E",X"06",X"18",X"B3",X"3A",X"09",X"4E",X"21",X"80", + X"4E",X"A7",X"C8",X"21",X"84",X"4E",X"C9",X"10",X"00",X"50",X"00",X"00",X"02",X"00",X"04",X"00", + X"08",X"00",X"16",X"00",X"01",X"00",X"03",X"00",X"05",X"00",X"07",X"00",X"10",X"00",X"20",X"00", + X"30",X"00",X"50",X"13",X"6B",X"62",X"1B",X"CB",X"46",X"C0",X"CB",X"C6",X"21",X"9C",X"4E",X"CB", + X"C6",X"21",X"14",X"4E",X"34",X"21",X"15",X"4E",X"34",X"46",X"21",X"1A",X"40",X"0E",X"05",X"78", + X"A7",X"28",X"0E",X"FE",X"06",X"30",X"0A",X"3E",X"20",X"CD",X"8F",X"2B",X"2B",X"2B",X"0D",X"10", + X"F6",X"0D",X"F8",X"CD",X"7E",X"2B",X"2B",X"2B",X"18",X"F7",X"3A",X"00",X"4E",X"FE",X"01",X"C8", + X"CD",X"CD",X"2B",X"12",X"44",X"09",X"0A",X"02",X"21",X"15",X"4E",X"46",X"18",X"CC",X"3E",X"40", + X"E5",X"D5",X"77",X"23",X"77",X"11",X"1F",X"00",X"19",X"77",X"23",X"77",X"D1",X"E1",X"C9",X"E5", + X"D5",X"11",X"1F",X"00",X"77",X"3C",X"23",X"77",X"3C",X"19",X"77",X"3C",X"23",X"77",X"D1",X"E1", + X"C9",X"3A",X"6E",X"4E",X"FE",X"FF",X"20",X"05",X"06",X"02",X"C3",X"5E",X"2C",X"06",X"01",X"CD", + X"5E",X"2C",X"3A",X"6E",X"4E",X"E6",X"F0",X"28",X"09",X"0F",X"0F",X"0F",X"0F",X"C6",X"30",X"32", + X"34",X"40",X"3A",X"6E",X"4E",X"E6",X"0F",X"C6",X"30",X"32",X"33",X"40",X"C9",X"E1",X"5E",X"23", + X"56",X"23",X"4E",X"23",X"46",X"23",X"7E",X"23",X"E5",X"EB",X"11",X"20",X"00",X"E5",X"C5",X"71", + X"23",X"10",X"FC",X"C1",X"E1",X"19",X"3D",X"20",X"F4",X"C9",X"3A",X"00",X"4E",X"FE",X"01",X"C8", + X"3A",X"13",X"4E",X"3C",X"FE",X"08",X"D2",X"2E",X"2C",X"11",X"08",X"3B",X"47",X"0E",X"07",X"21", + X"04",X"40",X"1A",X"CD",X"8F",X"2B",X"3E",X"04",X"84",X"67",X"13",X"1A",X"CD",X"80",X"2B",X"3E", + X"FC",X"84",X"67",X"13",X"23",X"23",X"0D",X"10",X"E9",X"0D",X"F8",X"CD",X"7E",X"2B",X"3E",X"04", + X"84",X"67",X"AF",X"CD",X"80",X"2B",X"3E",X"FC",X"84",X"67",X"23",X"23",X"18",X"EB",X"FE",X"13", + X"38",X"02",X"3E",X"13",X"D6",X"07",X"4F",X"06",X"00",X"21",X"08",X"3B",X"09",X"09",X"EB",X"06", + X"07",X"C3",X"FD",X"2B",X"47",X"E6",X"0F",X"C6",X"00",X"27",X"4F",X"78",X"E6",X"F0",X"28",X"0B", + X"0F",X"0F",X"0F",X"0F",X"47",X"AF",X"C6",X"16",X"27",X"10",X"FB",X"81",X"27",X"C9",X"21",X"A5", + X"36",X"DF",X"5E",X"23",X"56",X"DD",X"21",X"00",X"44",X"DD",X"19",X"DD",X"E5",X"11",X"00",X"FC", + X"DD",X"19",X"11",X"FF",X"FF",X"CB",X"7E",X"20",X"03",X"11",X"E0",X"FF",X"23",X"78",X"01",X"00", + X"00",X"87",X"38",X"28",X"7E",X"FE",X"2F",X"28",X"09",X"DD",X"77",X"00",X"23",X"DD",X"19",X"04", + X"18",X"F2",X"23",X"DD",X"E1",X"7E",X"A7",X"FA",X"A4",X"2C",X"7E",X"DD",X"77",X"00",X"23",X"DD", + X"19",X"10",X"F7",X"C9",X"DD",X"77",X"00",X"DD",X"19",X"10",X"F9",X"C9",X"7E",X"FE",X"2F",X"28", + X"0A",X"DD",X"36",X"00",X"40",X"23",X"DD",X"19",X"04",X"18",X"F1",X"23",X"04",X"ED",X"B1",X"18", + X"D2",X"21",X"C8",X"3B",X"DD",X"21",X"CC",X"4E",X"FD",X"21",X"8C",X"4E",X"CD",X"44",X"2D",X"47", + X"3A",X"CC",X"4E",X"A7",X"28",X"04",X"78",X"32",X"91",X"4E",X"21",X"CC",X"3B",X"DD",X"21",X"DC", + X"4E",X"FD",X"21",X"92",X"4E",X"CD",X"44",X"2D",X"47",X"3A",X"DC",X"4E",X"A7",X"28",X"04",X"78", + X"32",X"96",X"4E",X"21",X"D0",X"3B",X"DD",X"21",X"EC",X"4E",X"FD",X"21",X"97",X"4E",X"CD",X"44", + X"2D",X"47",X"3A",X"EC",X"4E",X"A7",X"C8",X"78",X"32",X"9B",X"4E",X"C9",X"21",X"30",X"3B",X"DD", + X"21",X"9C",X"4E",X"FD",X"21",X"8C",X"4E",X"CD",X"EE",X"2D",X"32",X"91",X"4E",X"21",X"40",X"3B", + X"DD",X"21",X"AC",X"4E",X"FD",X"21",X"92",X"4E",X"CD",X"EE",X"2D",X"32",X"96",X"4E",X"21",X"80", + X"3B",X"DD",X"21",X"BC",X"4E",X"FD",X"21",X"97",X"4E",X"CD",X"EE",X"2D",X"32",X"9B",X"4E",X"AF", + X"32",X"90",X"4E",X"C9",X"DD",X"7E",X"00",X"A7",X"CA",X"F4",X"2D",X"4F",X"06",X"08",X"1E",X"80", + X"7B",X"A1",X"20",X"05",X"CB",X"3B",X"10",X"F8",X"C9",X"DD",X"7E",X"02",X"A3",X"20",X"07",X"DD", + X"73",X"02",X"05",X"DF",X"18",X"0C",X"DD",X"35",X"0C",X"C2",X"D7",X"2D",X"DD",X"6E",X"06",X"DD", + X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"FE",X"F0",X"38",X"27",X"21",X"6C", + X"2D",X"E5",X"E6",X"0F",X"E7",X"55",X"2F",X"65",X"2F",X"77",X"2F",X"89",X"2F",X"9B",X"2F",X"0C", + X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"0C", + X"00",X"0C",X"00",X"AD",X"2F",X"47",X"E6",X"1F",X"28",X"03",X"DD",X"70",X"0D",X"DD",X"4E",X"09", + X"DD",X"7E",X"0B",X"E6",X"08",X"28",X"02",X"0E",X"00",X"DD",X"71",X"0F",X"78",X"07",X"07",X"07", + X"E6",X"07",X"21",X"B0",X"3B",X"D7",X"DD",X"77",X"0C",X"78",X"E6",X"1F",X"28",X"09",X"E6",X"0F", + X"21",X"B8",X"3B",X"D7",X"DD",X"77",X"0E",X"DD",X"6E",X"0E",X"26",X"00",X"DD",X"7E",X"0D",X"E6", + X"10",X"28",X"02",X"3E",X"01",X"DD",X"86",X"04",X"CA",X"E8",X"2E",X"C3",X"E4",X"2E",X"DD",X"7E", + X"00",X"A7",X"20",X"27",X"DD",X"7E",X"02",X"A7",X"C8",X"DD",X"36",X"02",X"00",X"DD",X"36",X"0D", + X"00",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"0F",X"00",X"FD",X"36",X"00",X"00",X"FD",X"36",X"01", + X"00",X"FD",X"36",X"02",X"00",X"FD",X"36",X"03",X"00",X"AF",X"C9",X"4F",X"06",X"08",X"1E",X"80", + X"7B",X"A1",X"20",X"05",X"CB",X"3B",X"10",X"F8",X"C9",X"DD",X"7E",X"02",X"A3",X"20",X"3F",X"DD", + X"73",X"02",X"05",X"78",X"07",X"07",X"07",X"4F",X"06",X"00",X"E5",X"09",X"DD",X"E5",X"D1",X"13", + X"13",X"13",X"01",X"08",X"00",X"ED",X"B0",X"E1",X"DD",X"7E",X"06",X"E6",X"7F",X"DD",X"77",X"0C", + X"DD",X"7E",X"04",X"DD",X"77",X"0E",X"DD",X"7E",X"09",X"47",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F", + X"DD",X"77",X"0B",X"E6",X"08",X"20",X"07",X"DD",X"70",X"0F",X"DD",X"36",X"0D",X"00",X"DD",X"35", + X"0C",X"20",X"5A",X"DD",X"7E",X"08",X"A7",X"28",X"10",X"DD",X"35",X"08",X"20",X"0B",X"7B",X"2F", + X"DD",X"A6",X"00",X"DD",X"77",X"00",X"C3",X"EE",X"2D",X"DD",X"7E",X"06",X"E6",X"7F",X"DD",X"77", + X"0C",X"DD",X"CB",X"06",X"7E",X"28",X"16",X"DD",X"7E",X"05",X"ED",X"44",X"DD",X"77",X"05",X"DD", + X"CB",X"0D",X"46",X"DD",X"CB",X"0D",X"C6",X"28",X"24",X"DD",X"CB",X"0D",X"86",X"DD",X"7E",X"04", + X"DD",X"86",X"07",X"DD",X"77",X"04",X"DD",X"77",X"0E",X"DD",X"7E",X"09",X"DD",X"86",X"0A",X"DD", + X"77",X"09",X"47",X"DD",X"7E",X"0B",X"E6",X"08",X"20",X"03",X"DD",X"70",X"0F",X"DD",X"7E",X"0E", + X"DD",X"86",X"05",X"DD",X"77",X"0E",X"6F",X"26",X"00",X"DD",X"7E",X"03",X"E6",X"70",X"28",X"08", + X"0F",X"0F",X"0F",X"0F",X"47",X"29",X"10",X"FD",X"FD",X"75",X"00",X"7D",X"0F",X"0F",X"0F",X"0F", + X"FD",X"77",X"01",X"FD",X"74",X"02",X"7C",X"0F",X"0F",X"0F",X"0F",X"FD",X"77",X"03",X"DD",X"7E", + X"0B",X"E7",X"22",X"2F",X"26",X"2F",X"2B",X"2F",X"3C",X"2F",X"43",X"2F",X"4A",X"2F",X"4B",X"2F", + X"4C",X"2F",X"4D",X"2F",X"4E",X"2F",X"4F",X"2F",X"50",X"2F",X"51",X"2F",X"52",X"2F",X"53",X"2F", + X"54",X"2F",X"DD",X"7E",X"0F",X"C9",X"DD",X"7E",X"0F",X"18",X"09",X"3A",X"84",X"4C",X"E6",X"01", + X"DD",X"7E",X"0F",X"C0",X"E6",X"0F",X"C8",X"3D",X"DD",X"77",X"0F",X"C9",X"3A",X"84",X"4C",X"E6", + X"03",X"18",X"ED",X"3A",X"84",X"4C",X"E6",X"07",X"18",X"E6",X"C9",X"C9",X"C9",X"C9",X"C9",X"C9", + X"C9",X"C9",X"C9",X"C9",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"DD",X"77",X"06",X"23", + X"7E",X"DD",X"77",X"07",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06", + X"DD",X"74",X"07",X"DD",X"77",X"03",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD", + X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"04",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E", + X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"09",X"C9",X"DD",X"6E",X"06",X"DD",X"66", + X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"0B",X"C9",X"DD",X"7E",X"02", + X"2F",X"DD",X"A6",X"00",X"DD",X"77",X"00",X"C3",X"F4",X"2D",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"8B",X"1F", + X"21",X"00",X"00",X"01",X"00",X"10",X"32",X"C0",X"50",X"79",X"86",X"4F",X"7D",X"C6",X"02",X"6F", + X"FE",X"02",X"D2",X"09",X"30",X"24",X"10",X"EE",X"79",X"A7",X"20",X"15",X"32",X"07",X"50",X"7C", + X"FE",X"40",X"C2",X"03",X"30",X"26",X"00",X"2C",X"7D",X"FE",X"02",X"DA",X"03",X"30",X"C3",X"42", + X"30",X"25",X"7C",X"E6",X"F0",X"32",X"07",X"50",X"0F",X"0F",X"0F",X"0F",X"5F",X"06",X"00",X"C3", + X"BD",X"30",X"31",X"54",X"31",X"06",X"FF",X"E1",X"D1",X"48",X"32",X"C0",X"50",X"79",X"A3",X"77", + X"C6",X"33",X"4F",X"2C",X"7D",X"E6",X"0F",X"C2",X"4D",X"30",X"79",X"87",X"87",X"81",X"C6",X"31", + X"4F",X"7D",X"A7",X"C2",X"4D",X"30",X"24",X"15",X"C2",X"4A",X"30",X"3B",X"3B",X"3B",X"3B",X"E1", + X"D1",X"48",X"32",X"C0",X"50",X"79",X"A3",X"4F",X"7E",X"A3",X"B9",X"C2",X"B5",X"30",X"C6",X"33", + X"4F",X"2C",X"7D",X"E6",X"0F",X"C2",X"75",X"30",X"79",X"87",X"87",X"81",X"C6",X"31",X"4F",X"7D", + X"A7",X"C2",X"75",X"30",X"24",X"15",X"C2",X"72",X"30",X"3B",X"3B",X"3B",X"3B",X"78",X"D6",X"10", + X"47",X"10",X"A4",X"F1",X"D1",X"FE",X"44",X"C2",X"45",X"30",X"7B",X"EE",X"F0",X"C2",X"45",X"30", + X"06",X"01",X"C3",X"BD",X"30",X"7B",X"E6",X"01",X"EE",X"01",X"5F",X"06",X"00",X"31",X"C0",X"4F", + X"D9",X"21",X"00",X"4C",X"06",X"04",X"32",X"C0",X"50",X"36",X"00",X"2C",X"20",X"FB",X"24",X"10", + X"F5",X"21",X"00",X"40",X"06",X"04",X"32",X"C0",X"50",X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24", + X"10",X"F4",X"06",X"04",X"32",X"C0",X"50",X"3E",X"0F",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F4", + X"D9",X"10",X"08",X"06",X"23",X"CD",X"5E",X"2C",X"C3",X"74",X"31",X"7B",X"C6",X"30",X"32",X"84", + X"41",X"C5",X"E5",X"06",X"24",X"CD",X"5E",X"2C",X"E1",X"7C",X"FE",X"40",X"2A",X"6C",X"31",X"38", + X"11",X"FE",X"4C",X"2A",X"6E",X"31",X"30",X"0A",X"FE",X"44",X"2A",X"70",X"31",X"38",X"03",X"2A", + X"72",X"31",X"7D",X"32",X"04",X"42",X"7C",X"32",X"64",X"42",X"3A",X"00",X"50",X"47",X"3A",X"40", + X"50",X"B0",X"E6",X"01",X"20",X"11",X"C1",X"79",X"E6",X"0F",X"47",X"79",X"E6",X"F0",X"0F",X"0F", + X"0F",X"0F",X"4F",X"ED",X"43",X"85",X"41",X"32",X"C0",X"50",X"3A",X"40",X"50",X"E6",X"10",X"28", + X"F6",X"C3",X"0B",X"23",X"00",X"4C",X"0F",X"04",X"00",X"4C",X"F0",X"04",X"00",X"40",X"0F",X"04", + X"00",X"40",X"F0",X"04",X"00",X"44",X"0F",X"04",X"00",X"44",X"F0",X"04",X"4F",X"40",X"41",X"57", + X"41",X"56",X"41",X"43",X"21",X"06",X"50",X"3E",X"01",X"77",X"2D",X"20",X"FC",X"AF",X"32",X"03", + X"50",X"3E",X"01",X"ED",X"47",X"31",X"C0",X"4F",X"32",X"C0",X"50",X"AF",X"32",X"00",X"4E",X"3C", + X"32",X"01",X"4E",X"32",X"00",X"50",X"FB",X"3A",X"00",X"50",X"2F",X"47",X"E6",X"E0",X"28",X"05", + X"3E",X"02",X"32",X"9C",X"4E",X"3A",X"40",X"50",X"2F",X"4F",X"E6",X"60",X"28",X"05",X"3E",X"01", + X"32",X"9C",X"4E",X"78",X"B1",X"E6",X"01",X"28",X"05",X"3E",X"08",X"32",X"BC",X"4E",X"78",X"B1", + X"E6",X"02",X"28",X"05",X"3E",X"04",X"32",X"BC",X"4E",X"78",X"B1",X"E6",X"04",X"28",X"05",X"3E", + X"10",X"32",X"BC",X"4E",X"78",X"B1",X"E6",X"08",X"28",X"05",X"3E",X"20",X"32",X"BC",X"4E",X"3A", + X"80",X"50",X"E6",X"03",X"C6",X"25",X"47",X"CD",X"5E",X"2C",X"3A",X"80",X"50",X"0F",X"0F",X"0F", + X"0F",X"E6",X"03",X"FE",X"03",X"20",X"08",X"06",X"2A",X"CD",X"5E",X"2C",X"C3",X"1C",X"32",X"07", + X"5F",X"D5",X"06",X"2B",X"CD",X"5E",X"2C",X"06",X"2E",X"CD",X"5E",X"2C",X"D1",X"16",X"00",X"21", + X"F9",X"32",X"19",X"7E",X"32",X"2A",X"42",X"23",X"7E",X"32",X"4A",X"42",X"3A",X"80",X"50",X"0F", + X"0F",X"E6",X"03",X"C6",X"31",X"FE",X"34",X"20",X"01",X"3C",X"32",X"0C",X"42",X"06",X"29",X"CD", + X"5E",X"2C",X"3A",X"40",X"50",X"07",X"E6",X"01",X"C6",X"2C",X"47",X"CD",X"5E",X"2C",X"3A",X"40", + X"50",X"E6",X"10",X"CA",X"88",X"31",X"AF",X"32",X"00",X"50",X"F3",X"21",X"07",X"50",X"AF",X"77", + X"2D",X"20",X"FC",X"31",X"E2",X"3A",X"06",X"03",X"D9",X"E1",X"D1",X"32",X"C0",X"50",X"C1",X"3E", + X"3C",X"77",X"23",X"72",X"23",X"10",X"F8",X"3B",X"3B",X"C1",X"71",X"23",X"3E",X"3F",X"77",X"23", + X"10",X"F8",X"3B",X"3B",X"1D",X"C2",X"5B",X"32",X"F1",X"D9",X"10",X"DC",X"31",X"C0",X"4F",X"06", + X"08",X"CD",X"ED",X"32",X"10",X"FB",X"32",X"C0",X"50",X"3A",X"40",X"50",X"E6",X"10",X"28",X"F6", + X"3A",X"40",X"50",X"E6",X"60",X"C2",X"4B",X"23",X"06",X"08",X"CD",X"ED",X"32",X"10",X"FB",X"3A", + X"40",X"50",X"E6",X"10",X"C2",X"4B",X"23",X"1E",X"01",X"06",X"04",X"32",X"C0",X"50",X"CD",X"ED", + X"32",X"3A",X"00",X"50",X"A3",X"20",X"F4",X"CD",X"ED",X"32",X"32",X"C0",X"50",X"3A",X"00",X"50", + X"EE",X"FF",X"20",X"F3",X"10",X"E5",X"CB",X"03",X"7B",X"FE",X"10",X"DA",X"A9",X"32",X"21",X"00", + X"40",X"06",X"04",X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24",X"10",X"F7",X"CD",X"F4",X"3A",X"32", + X"C0",X"50",X"3A",X"40",X"50",X"E6",X"10",X"CA",X"DF",X"32",X"C3",X"4B",X"23",X"32",X"C0",X"50", + X"21",X"00",X"28",X"2B",X"7C",X"B5",X"20",X"FB",X"C9",X"30",X"31",X"35",X"31",X"30",X"32",X"00", + X"FF",X"01",X"00",X"00",X"01",X"FF",X"00",X"00",X"FF",X"01",X"00",X"00",X"01",X"FF",X"00",X"55", + X"2A",X"55",X"2A",X"55",X"55",X"55",X"55",X"55",X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"25", + X"25",X"25",X"25",X"22",X"22",X"22",X"22",X"01",X"01",X"01",X"01",X"58",X"02",X"08",X"07",X"60", + X"09",X"10",X"0E",X"68",X"10",X"70",X"17",X"14",X"19",X"52",X"4A",X"A5",X"94",X"AA",X"2A",X"55", + X"55",X"55",X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"92",X"24",X"25",X"49",X"48",X"24",X"22", + X"91",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"55",X"2A",X"55",X"2A",X"55",X"55",X"55",X"55",X"AA",X"2A",X"55",X"55",X"55", + X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"48",X"24",X"22",X"91",X"21",X"44",X"44",X"08",X"58", + X"02",X"34",X"08",X"D8",X"09",X"B4",X"0F",X"58",X"11",X"08",X"16",X"34",X"17",X"55",X"55",X"55", + X"55",X"D5",X"6A",X"D5",X"6A",X"AA",X"6A",X"55",X"D5",X"55",X"55",X"55",X"55",X"AA",X"2A",X"55", + X"55",X"92",X"24",X"92",X"24",X"22",X"22",X"22",X"22",X"A4",X"01",X"54",X"06",X"F8",X"07",X"A8", + X"0C",X"D4",X"0D",X"84",X"12",X"B0",X"13",X"D5",X"6A",X"D5",X"6A",X"D6",X"5A",X"AD",X"B5",X"D6", + X"5A",X"AD",X"B5",X"D5",X"6A",X"D5",X"6A",X"AA",X"6A",X"55",X"D5",X"92",X"24",X"25",X"49",X"48", + X"24",X"22",X"91",X"A4",X"01",X"54",X"06",X"F8",X"07",X"A8",X"0C",X"D4",X"0D",X"FE",X"FF",X"FF", + X"FF",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"B6",X"6D",X"6D",X"DB",X"6D",X"6D",X"6D", + X"6D",X"D6",X"5A",X"AD",X"B5",X"25",X"25",X"25",X"25",X"92",X"24",X"92",X"24",X"2C",X"01",X"DC", + X"05",X"08",X"07",X"B8",X"0B",X"E4",X"0C",X"FE",X"FF",X"FF",X"FF",X"D5",X"6A",X"D5",X"6A",X"D5", + X"6A",X"D5",X"6A",X"B6",X"6D",X"6D",X"DB",X"6D",X"6D",X"6D",X"6D",X"D6",X"5A",X"AD",X"B5",X"48", + X"24",X"22",X"91",X"92",X"24",X"92",X"24",X"2C",X"01",X"DC",X"05",X"08",X"07",X"B8",X"0B",X"E4", + X"0C",X"FE",X"FF",X"FF",X"FF",X"40",X"FC",X"D0",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2",X"D2", + X"D4",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"D0",X"D2",X"D2",X"D2",X"D2",X"D6", + X"D8",X"D2",X"D2",X"D2",X"D2",X"D4",X"FC",X"DA",X"09",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC", + X"FC",X"FC",X"FC",X"DA",X"05",X"DE",X"E4",X"05",X"DC",X"FC",X"DA",X"02",X"E6",X"E8",X"EA",X"02", + X"E6",X"EA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"E6", + X"EA",X"02",X"E7",X"EB",X"02",X"E6",X"EA",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"FC",X"E4",X"02", + X"DE",X"E4",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DE", + X"E4",X"05",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"DE",X"FC",X"E4",X"02",X"DE",X"E4",X"02", + X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DC",X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"F2",X"E8",X"E8", + X"EA",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02",X"E7",X"E9",X"EB",X"02",X"E7",X"EB",X"02", + X"E7",X"D2",X"D2",X"D2",X"EB",X"02",X"E7",X"D2",X"D2",X"D2",X"EB",X"02",X"E7",X"E9",X"E9",X"E9", + X"EB",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"1B",X"DE",X"E4",X"02",X"DC",X"FC",X"DA",X"02", + X"E6",X"E8",X"F8",X"02",X"F6",X"E8",X"E8",X"E8",X"E8",X"E8",X"E8",X"F8",X"02",X"F6",X"E8",X"E8", + X"E8",X"EA",X"02",X"E6",X"F8",X"02",X"F6",X"E8",X"E8",X"F4",X"E4",X"02",X"DC",X"FC",X"DA",X"02", + X"DE",X"FC",X"E4",X"02",X"F7",X"E9",X"E9",X"F5",X"F3",X"E9",X"E9",X"F9",X"02",X"F7",X"E9",X"E9", + X"E9",X"EB",X"02",X"DE",X"E4",X"02",X"F7",X"E9",X"E9",X"F5",X"E4",X"02",X"DC",X"FC",X"DA",X"02", + X"DE",X"FC",X"E4",X"05",X"DE",X"E4",X"0B",X"DE",X"E4",X"05",X"DE",X"E4",X"02",X"DC",X"FC",X"DA", + X"02",X"DE",X"FC",X"E4",X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"EC",X"D3",X"D3",X"D3",X"EE", + X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"E6",X"EA",X"02",X"DE",X"E4",X"02",X"DC",X"FC",X"DA", + X"02",X"E7",X"E9",X"EB",X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"FC",X"FC",X"DA", + X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DE",X"E4",X"02",X"E7",X"EB",X"02",X"DC",X"FC",X"DA", + X"06",X"DE",X"E4",X"05",X"F0",X"FC",X"FC",X"FC",X"DA",X"02",X"DE",X"E4",X"05",X"DE",X"E4",X"05", + X"DC",X"FC",X"FA",X"E8",X"E8",X"E8",X"EA",X"02",X"DE",X"F2",X"E8",X"E8",X"EA",X"02",X"CE",X"FC", + X"FC",X"FC",X"DA",X"02",X"DE",X"F2",X"E8",X"E8",X"EA",X"02",X"DE",X"F2",X"E8",X"E8",X"EA",X"02", + X"DC",X"00",X"00",X"00",X"00",X"62",X"01",X"02",X"01",X"01",X"01",X"01",X"0C",X"01",X"01",X"04", + X"01",X"01",X"01",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"04",X"03",X"0C",X"03",X"01", + X"01",X"01",X"03",X"04",X"04",X"03",X"0C",X"06",X"03",X"04",X"04",X"03",X"0C",X"06",X"03",X"04", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"04",X"04",X"0F",X"03",X"06",X"04", + X"04",X"0F",X"03",X"06",X"04",X"04",X"01",X"01",X"01",X"0C",X"03",X"01",X"01",X"01",X"03",X"04", + X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"01",X"01", + X"01",X"01",X"03",X"0C",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"08",X"18",X"08",X"18",X"04", + X"01",X"01",X"01",X"01",X"03",X"0C",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"04",X"04",X"03", + X"0C",X"03",X"03",X"03",X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"04",X"01",X"01",X"01", + X"0C",X"03",X"01",X"01",X"01",X"03",X"04",X"04",X"0F",X"03",X"06",X"04",X"04",X"0F",X"03",X"06", + X"04",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"03",X"04",X"04",X"03",X"0C",X"06", + X"03",X"04",X"04",X"03",X"0C",X"06",X"03",X"04",X"04",X"03",X"0C",X"03",X"01",X"01",X"01",X"03", + X"04",X"04",X"03",X"0C",X"03",X"03",X"03",X"04",X"01",X"02",X"01",X"01",X"01",X"01",X"0C",X"01", + X"01",X"04",X"01",X"01",X"01",X"13",X"37",X"23",X"37",X"32",X"37",X"41",X"37",X"5A",X"37",X"6A", + X"37",X"7A",X"37",X"86",X"37",X"9D",X"37",X"B1",X"37",X"C8",X"37",X"E9",X"37",X"FD",X"37",X"17", + X"38",X"25",X"38",X"32",X"38",X"3F",X"38",X"4C",X"38",X"5A",X"38",X"68",X"38",X"75",X"38",X"86", + X"38",X"98",X"38",X"AA",X"38",X"01",X"00",X"02",X"00",X"03",X"00",X"BC",X"38",X"C4",X"38",X"CE", + X"38",X"D8",X"38",X"E2",X"38",X"EC",X"38",X"F6",X"38",X"00",X"39",X"0A",X"39",X"1A",X"39",X"6F", + X"39",X"2A",X"39",X"58",X"39",X"41",X"39",X"A3",X"39",X"86",X"39",X"97",X"39",X"B0",X"39",X"BD", + X"39",X"CA",X"39",X"D3",X"39",X"E1",X"39",X"EE",X"39",X"FC",X"39",X"09",X"3A",X"1A",X"3A",X"2C", + X"3A",X"3D",X"3A",X"D4",X"83",X"48",X"49",X"47",X"48",X"40",X"53",X"43",X"4F",X"52",X"45",X"2F", + X"8F",X"2F",X"80",X"3B",X"80",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"40",X"40",X"2F",X"8F", + X"2F",X"80",X"3B",X"80",X"46",X"52",X"45",X"45",X"40",X"50",X"4C",X"41",X"59",X"2F",X"8F",X"2F", + X"80",X"8C",X"02",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"45",X"2F",X"85",X"2F", + X"10",X"10",X"1A",X"1A",X"1A",X"1A",X"1A",X"1A",X"10",X"10",X"8C",X"02",X"50",X"4C",X"41",X"59", + X"45",X"52",X"40",X"54",X"57",X"4F",X"2F",X"85",X"2F",X"80",X"92",X"02",X"47",X"41",X"4D",X"45", + X"40",X"40",X"4F",X"56",X"45",X"52",X"2F",X"81",X"2F",X"80",X"52",X"02",X"52",X"45",X"41",X"44", + X"59",X"5B",X"2F",X"89",X"2F",X"90",X"EE",X"02",X"50",X"55",X"53",X"48",X"40",X"53",X"54",X"41", + X"52",X"54",X"40",X"42",X"55",X"54",X"54",X"4F",X"4E",X"2F",X"87",X"2F",X"80",X"B2",X"02",X"31", + X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"4C",X"59",X"40",X"2F",X"85",X"2F", + X"80",X"B2",X"02",X"31",X"40",X"4F",X"52",X"40",X"32",X"40",X"50",X"4C",X"41",X"59",X"45",X"52", + X"53",X"2F",X"85",X"00",X"2F",X"00",X"80",X"00",X"96",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40", + X"50",X"55",X"43",X"4B",X"4D",X"41",X"4E",X"40",X"46",X"4F",X"52",X"40",X"40",X"40",X"30",X"30", + X"30",X"40",X"5D",X"5E",X"5F",X"2F",X"8E",X"2F",X"80",X"BA",X"02",X"5C",X"40",X"28",X"29",X"2A", + X"2B",X"2C",X"2D",X"2E",X"40",X"31",X"39",X"38",X"30",X"2F",X"83",X"2F",X"80",X"C3",X"02",X"43", + X"48",X"41",X"52",X"41",X"43",X"54",X"45",X"52",X"40",X"3A",X"40",X"4E",X"49",X"43",X"4B",X"4E", + X"41",X"4D",X"45",X"2F",X"8F",X"2F",X"80",X"65",X"01",X"26",X"41",X"4B",X"41",X"42",X"45",X"49", + X"26",X"2F",X"81",X"2F",X"80",X"45",X"01",X"26",X"4D",X"41",X"43",X"4B",X"59",X"26",X"2F",X"81", + X"2F",X"80",X"48",X"01",X"26",X"50",X"49",X"4E",X"4B",X"59",X"26",X"2F",X"83",X"2F",X"80",X"48", + X"01",X"26",X"4D",X"49",X"43",X"4B",X"59",X"26",X"2F",X"83",X"2F",X"80",X"76",X"02",X"10",X"40", + X"31",X"30",X"40",X"5D",X"5E",X"5F",X"2F",X"9F",X"2F",X"80",X"78",X"02",X"14",X"40",X"35",X"30", + X"40",X"5D",X"5E",X"5F",X"2F",X"9F",X"2F",X"80",X"5D",X"02",X"28",X"29",X"2A",X"2B",X"2C",X"2D", + X"2E",X"2F",X"83",X"2F",X"80",X"C5",X"02",X"40",X"4F",X"49",X"4B",X"41",X"4B",X"45",X"3B",X"3B", + X"3B",X"3B",X"2F",X"81",X"2F",X"80",X"C5",X"02",X"40",X"55",X"52",X"43",X"48",X"49",X"4E",X"3B", + X"3B",X"3B",X"3B",X"3B",X"2F",X"81",X"2F",X"80",X"C8",X"02",X"40",X"4D",X"41",X"43",X"48",X"49", + X"42",X"55",X"53",X"45",X"3B",X"3B",X"2F",X"83",X"2F",X"80",X"C8",X"02",X"40",X"52",X"4F",X"4D", + X"50",X"3B",X"3B",X"3B",X"3B",X"3B",X"3B",X"3B",X"2F",X"83",X"2F",X"80",X"12",X"02",X"81",X"85", + X"2F",X"83",X"2F",X"90",X"32",X"02",X"40",X"82",X"85",X"40",X"2F",X"83",X"2F",X"90",X"32",X"02", + X"40",X"83",X"85",X"40",X"2F",X"83",X"2F",X"90",X"32",X"02",X"40",X"84",X"85",X"40",X"2F",X"83", + X"2F",X"90",X"32",X"02",X"40",X"86",X"8D",X"8E",X"2F",X"83",X"2F",X"90",X"32",X"02",X"87",X"88", + X"8D",X"8E",X"2F",X"83",X"2F",X"90",X"32",X"02",X"89",X"8A",X"8D",X"8E",X"2F",X"83",X"2F",X"90", + X"32",X"02",X"8B",X"8C",X"8D",X"8E",X"2F",X"83",X"2F",X"90",X"04",X"03",X"4D",X"45",X"4D",X"4F", + X"52",X"59",X"40",X"40",X"4F",X"4B",X"2F",X"8F",X"2F",X"80",X"04",X"03",X"42",X"41",X"44",X"40", + X"40",X"40",X"40",X"52",X"40",X"4D",X"2F",X"8F",X"2F",X"80",X"08",X"03",X"31",X"40",X"43",X"4F", + X"49",X"4E",X"40",X"40",X"31",X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"2F",X"8F",X"2F", + X"80",X"08",X"03",X"32",X"40",X"43",X"4F",X"49",X"4E",X"53",X"40",X"31",X"40",X"43",X"52",X"45", + X"44",X"49",X"54",X"40",X"2F",X"8F",X"2F",X"80",X"08",X"03",X"31",X"40",X"43",X"4F",X"49",X"4E", + X"40",X"40",X"32",X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"53",X"2F",X"8F",X"2F",X"80",X"08", + X"03",X"46",X"52",X"45",X"45",X"40",X"40",X"50",X"4C",X"41",X"59",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"2F",X"8F",X"2F",X"80",X"0A",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"4E", + X"4F",X"4E",X"45",X"2F",X"8F",X"2F",X"80",X"0A",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"2F", + X"8F",X"2F",X"80",X"0C",X"03",X"50",X"55",X"43",X"4B",X"4D",X"41",X"4E",X"2F",X"8F",X"2F",X"80", + X"0E",X"03",X"54",X"41",X"42",X"4C",X"45",X"40",X"40",X"2F",X"8F",X"2F",X"80",X"0E",X"03",X"55", + X"50",X"52",X"49",X"47",X"48",X"54",X"2F",X"8F",X"2F",X"80",X"0A",X"02",X"30",X"30",X"30",X"2F", + X"8F",X"2F",X"80",X"6B",X"01",X"26",X"41",X"4F",X"53",X"55",X"4B",X"45",X"26",X"2F",X"85",X"2F", + X"80",X"4B",X"01",X"26",X"4D",X"55",X"43",X"4B",X"59",X"26",X"2F",X"85",X"2F",X"80",X"6E",X"01", + X"26",X"47",X"55",X"5A",X"55",X"54",X"41",X"26",X"2F",X"87",X"2F",X"80",X"4E",X"01",X"26",X"4D", + X"4F",X"43",X"4B",X"59",X"26",X"2F",X"87",X"2F",X"80",X"CB",X"02",X"40",X"4B",X"49",X"4D",X"41", + X"47",X"55",X"52",X"45",X"3B",X"3B",X"2F",X"85",X"2F",X"80",X"CB",X"02",X"40",X"53",X"54",X"59", + X"4C",X"49",X"53",X"54",X"3B",X"3B",X"3B",X"3B",X"2F",X"85",X"2F",X"80",X"CE",X"02",X"40",X"4F", + X"54",X"4F",X"42",X"4F",X"4B",X"45",X"3B",X"3B",X"3B",X"2F",X"87",X"2F",X"80",X"CE",X"02",X"40", + X"43",X"52",X"59",X"42",X"41",X"42",X"59",X"3B",X"3B",X"3B",X"3B",X"2F",X"87",X"2F",X"80",X"01", + X"01",X"03",X"01",X"01",X"01",X"03",X"02",X"02",X"02",X"01",X"01",X"01",X"01",X"02",X"04",X"04", + X"04",X"06",X"02",X"02",X"02",X"02",X"04",X"02",X"04",X"04",X"04",X"06",X"02",X"02",X"02",X"02", + X"01",X"01",X"01",X"01",X"02",X"04",X"04",X"04",X"06",X"02",X"02",X"02",X"02",X"06",X"04",X"05", + X"01",X"01",X"03",X"01",X"01",X"01",X"04",X"01",X"01",X"01",X"03",X"01",X"01",X"04",X"01",X"01", + X"01",X"6C",X"05",X"01",X"01",X"01",X"18",X"04",X"04",X"18",X"05",X"01",X"01",X"01",X"17",X"02", + X"03",X"04",X"16",X"04",X"03",X"01",X"01",X"01",X"76",X"01",X"01",X"01",X"01",X"03",X"01",X"01", + X"01",X"02",X"04",X"02",X"04",X"0E",X"02",X"04",X"02",X"04",X"02",X"04",X"0B",X"01",X"01",X"01", + X"02",X"04",X"02",X"01",X"01",X"01",X"01",X"02",X"02",X"02",X"0E",X"02",X"04",X"02",X"04",X"02", + X"01",X"02",X"01",X"0A",X"01",X"01",X"01",X"01",X"03",X"01",X"01",X"01",X"03",X"01",X"01",X"03", + X"04",X"00",X"02",X"40",X"01",X"3E",X"3D",X"10",X"40",X"40",X"0E",X"3D",X"3E",X"10",X"C2",X"43", + X"01",X"3E",X"3D",X"10",X"21",X"A2",X"40",X"11",X"4F",X"3A",X"36",X"14",X"1A",X"A7",X"C8",X"13", + X"85",X"6F",X"D2",X"FA",X"3A",X"24",X"18",X"F2",X"90",X"14",X"94",X"0F",X"98",X"15",X"98",X"15", + X"A0",X"14",X"A0",X"14",X"A4",X"17",X"A4",X"17",X"A8",X"09",X"A8",X"09",X"9C",X"16",X"9C",X"16", + X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16",X"AC",X"16", + X"73",X"20",X"00",X"0C",X"00",X"0A",X"1F",X"00",X"72",X"20",X"FB",X"87",X"00",X"02",X"0F",X"00", + X"36",X"20",X"04",X"8C",X"00",X"00",X"06",X"00",X"36",X"28",X"05",X"8B",X"00",X"00",X"06",X"00", + X"36",X"30",X"06",X"8A",X"00",X"00",X"06",X"00",X"36",X"3C",X"07",X"89",X"00",X"00",X"06",X"00", + X"36",X"48",X"08",X"88",X"00",X"00",X"06",X"00",X"24",X"00",X"06",X"08",X"00",X"00",X"0A",X"00", + X"40",X"70",X"FA",X"10",X"00",X"00",X"0A",X"00",X"70",X"04",X"00",X"00",X"00",X"00",X"08",X"00", + X"42",X"18",X"FD",X"06",X"00",X"01",X"0C",X"00",X"42",X"04",X"03",X"06",X"00",X"01",X"0C",X"00", + X"56",X"0C",X"FF",X"8C",X"00",X"02",X"0F",X"00",X"05",X"00",X"02",X"20",X"00",X"01",X"0C",X"00", + X"41",X"20",X"FF",X"86",X"FE",X"1C",X"0F",X"FF",X"70",X"00",X"01",X"0C",X"00",X"01",X"08",X"00", + X"01",X"02",X"04",X"08",X"10",X"20",X"40",X"80",X"00",X"57",X"5C",X"61",X"67",X"6D",X"74",X"7B", + X"82",X"8A",X"92",X"9A",X"A3",X"AD",X"B8",X"C3",X"D4",X"3B",X"F3",X"3B",X"58",X"3C",X"95",X"3C", + X"DE",X"3C",X"DF",X"3C",X"F1",X"02",X"F2",X"03",X"F3",X"0F",X"F4",X"01",X"82",X"70",X"69",X"82", + X"70",X"69",X"83",X"70",X"6A",X"83",X"70",X"6A",X"82",X"70",X"69",X"82",X"70",X"69",X"89",X"8B", + X"8D",X"8E",X"FF",X"F1",X"02",X"F2",X"03",X"F3",X"0F",X"F4",X"01",X"67",X"50",X"30",X"47",X"30", + X"67",X"50",X"30",X"47",X"30",X"67",X"50",X"30",X"47",X"30",X"4B",X"10",X"4C",X"10",X"4D",X"10", + X"4E",X"10",X"67",X"50",X"30",X"47",X"30",X"67",X"50",X"30",X"47",X"30",X"67",X"50",X"30",X"47", + X"30",X"4B",X"10",X"4C",X"10",X"4D",X"10",X"4E",X"10",X"67",X"50",X"30",X"47",X"30",X"67",X"50", + X"30",X"47",X"30",X"67",X"50",X"30",X"47",X"30",X"4B",X"10",X"4C",X"10",X"4D",X"10",X"4E",X"10", + X"77",X"20",X"4E",X"10",X"4D",X"10",X"4C",X"10",X"4A",X"10",X"47",X"10",X"46",X"10",X"65",X"30", + X"66",X"30",X"67",X"40",X"70",X"F0",X"FB",X"3B",X"F1",X"00",X"F2",X"02",X"F3",X"0F",X"F4",X"00", + X"42",X"50",X"4E",X"50",X"49",X"50",X"46",X"50",X"4E",X"49",X"70",X"66",X"70",X"43",X"50",X"4F", + X"50",X"4A",X"50",X"47",X"50",X"4F",X"4A",X"70",X"67",X"70",X"42",X"50",X"4E",X"50",X"49",X"50", + X"46",X"50",X"4E",X"49",X"70",X"66",X"70",X"45",X"46",X"47",X"50",X"47",X"48",X"49",X"50",X"49", + X"4A",X"4B",X"50",X"6E",X"FF",X"F1",X"01",X"F2",X"01",X"F3",X"0F",X"F4",X"00",X"26",X"67",X"26", + X"67",X"26",X"67",X"23",X"44",X"42",X"47",X"30",X"67",X"2A",X"8B",X"70",X"26",X"67",X"26",X"67", + X"26",X"67",X"23",X"44",X"42",X"47",X"30",X"67",X"23",X"84",X"70",X"26",X"67",X"26",X"67",X"26", + X"67",X"23",X"44",X"42",X"47",X"30",X"67",X"29",X"6A",X"2B",X"6C",X"30",X"2C",X"6D",X"40",X"2B", + X"6C",X"29",X"6A",X"67",X"20",X"29",X"6A",X"40",X"26",X"87",X"70",X"F0",X"9D",X"3C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"8D",X"00",X"31",X"F1"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..f07cb2ca --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,15 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is +begin + data <= X"FF"; +end architecture; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/Pacman_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_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/Arcade/Pacman Hardware/Pacman_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/Pacman_MiST/rtl/build_id.v new file mode 100644 index 00000000..318db7e9 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171120" +`define BUILD_TIME "171150" diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/dac.vhd new file mode 100644 index 00000000..47b2185e --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 10 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/Pacman_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_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/Arcade/Pacman Hardware/Pacman_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/Pacman_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/Pacman_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/Pacman_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_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/Arcade/Pacman Hardware/Pacman_MiST/rtl/osd.v b/Arcade/Pacman Hardware/Pacman_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_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/Arcade/Pacman Hardware/Pacman_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..87ed2b83 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/pacman.vhd @@ -0,0 +1,669 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity pacmant is + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + I_JOYSTICK_A : in std_logic_vector(4 downto 0); + I_JOYSTICK_B : in std_logic_vector(4 downto 0); + + I_SW : in std_logic_vector(3 downto 0); -- active high + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of pacmant is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_ena : std_logic; + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal vram_addr_ab : std_logic_vector(11 downto 0); + signal ab : std_logic_vector(11 downto 0); + + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal vram_l : std_logic; + signal rams_data_out : std_logic_vector(7 downto 0); + -- more decode + signal wr0_l : std_logic; + signal wr1_l : std_logic; + signal wr2_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + signal freeze : std_logic; + + -- ip registers + signal button_in : std_logic_vector(13 downto 0); + signal button_debounced : std_logic_vector(13 downto 0); + signal in0_reg : std_logic_vector(7 downto 0); + signal in1_reg : std_logic_vector(7 downto 0); + signal dipsw_reg : std_logic_vector(7 downto 0); + signal joystick_reg : std_logic_vector(4 downto 0); + signal joystick_reg2 : std_logic_vector(4 downto 0); + + +begin + joystick_reg <= I_JOYSTICK_A; + joystick_reg2 <= I_JOYSTICK_B; + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + p_sync_comb : process(hcnt, vcnt) + begin + vsync <= not vcnt(8); + do_hsync <= (hcnt = "010101111"); -- 0AF + end process; + + p_sync : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + + if (hcnt = "010010111") then -- 097 + O_HBLANK <= '1'; + elsif (hcnt = "010001111") then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") then + hblank <= '0'; -- 0EF + O_HBLANK <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + -- + -- cpu + -- + p_cpu_wait_comb : process(freeze, sync_bus_wreq_l) + begin + cpu_wait_l <= '1'; + if (freeze = '1') or (sync_bus_wreq_l = '0') then + cpu_wait_l <= '0'; + end if; + end process; + + p_irq_req_watchdog : process + variable rising_vblank : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + --rising_vblank := do_hsync; -- debug + -- interrupt 8c + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank and (freeze = '0') then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + + -- simulation + -- pragma translate_off + -- synopsys translate_off + watchdog_reset_l <= not reset; -- watchdog disable + -- synopsys translate_on + -- pragma translate_on + end if; + end process; + + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + + p_cpu_ena : process(hcnt, ena_6) + begin + cpu_ena <= '0'; + if (ena_6 = '1') then + cpu_ena <= hcnt(0); + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + -- + -- primary addr decode + -- + p_mem_decode_comb : process(cpu_rfsh_l, cpu_rd_l, cpu_mreq_l, cpu_addr) + begin + -- rom 0x0000 - 0x3FFF + -- syncbus 0x4000 - 0x7FFF + + -- 7M + -- 7N + sync_bus_cs_l <= '1'; +-- program_rom_cs_l <= '1'; + + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + +-- if (cpu_addr(14) = '0') and (cpu_rd_l = '0') then +-- program_rom_cs_l <= '0'; +-- end if; + + if (cpu_addr(14) = '1') then + sync_bus_cs_l <= '0'; + end if; + + end if; + end process; + -- + -- sync bus custom ic + -- + p_sync_bus_reg : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; + end process; + + p_sync_bus_comb : process(cpu_rd_l, sync_bus_cs_l, hcnt) + begin + -- sync_bus_stb is now an active low clock enable signal + sync_bus_stb <= '1'; + sync_bus_r_w_l <= '1'; + + if (sync_bus_cs_l = '0') and (hcnt(1) = '0') then + if (cpu_rd_l = '1') then + sync_bus_r_w_l <= '0'; + end if; + sync_bus_stb <= '0'; + end if; + + sync_bus_wreq_l <= '1'; + if (sync_bus_cs_l = '0') and (hcnt(1) = '1') and (cpu_rd_l = '0') then + sync_bus_wreq_l <= '0'; + end if; + end process; + -- + -- vram addr custom ic + -- + u_vram_addr : entity work.PACMAN_VRAM_ADDR + port map ( + AB => vram_addr_ab, + H256_L => hcnt(8), + H128 => hcnt(7), + H64 => hcnt(6), + H32 => hcnt(5), + H16 => hcnt(4), + H8 => hcnt(3), + H4 => hcnt(2), + H2 => hcnt(1), + H1 => hcnt(0), + V128 => vcnt(7), + V64 => vcnt(6), + V32 => vcnt(5), + V16 => vcnt(4), + V8 => vcnt(3), + V4 => vcnt(2), + V2 => vcnt(1), + V1 => vcnt(0), + FLIP => control_reg(3) + ); + + p_ab_mux_comb : process(hcnt, cpu_addr, vram_addr_ab) + begin + --When 2H is low, the CPU controls the bus. + if (hcnt(1) = '0') then + ab <= cpu_addr(11 downto 0); + else + ab <= vram_addr_ab; + end if; + end process; + + p_vram_comb : process(hcnt, cpu_addr, sync_bus_stb) + variable a,b : std_logic; + begin + + a := not (cpu_addr(12) or sync_bus_stb); + b := hcnt(1) and hcnt(0); + vram_l <= not (a or b); + end process; + + p_io_decode_comb : process(sync_bus_r_w_l, sync_bus_stb, ab, cpu_addr) + variable sel : std_logic_vector(2 downto 0); + variable dec : std_logic_vector(7 downto 0); + variable selb : std_logic_vector(1 downto 0); + variable decb : std_logic_vector(3 downto 0); + begin + -- WRITE + + -- out_l 0x5000 - 0x503F control space + + -- wr0_l 0x5040 - 0x504F sound + -- wr1_l 0x5050 - 0x505F sound + -- wr2_l 0x5060 - 0x506F sprite + + -- 0x5080 - 0x50BF unused + + -- wdr_l 0x50C0 - 0x50FF watchdog reset + + -- READ + + -- in0_l 0x5000 - 0x503F in port 0 + -- in1_l 0x5040 - 0x507F in port 1 + -- dipsw_l 0x5080 - 0x50BF dip switches + + -- 7J + dec := "11111111"; + sel := sync_bus_r_w_l & ab(7) & ab(6); + if (cpu_addr(12) = '1') and ( sync_bus_stb = '0') then + case sel is + when "000" => dec := "11111110"; + when "001" => dec := "11111101"; + when "010" => dec := "11111011"; + when "011" => dec := "11110111"; + when "100" => dec := "11101111"; + when "101" => dec := "11011111"; + when "110" => dec := "10111111"; + when "111" => dec := "01111111"; + when others => null; + end case; + end if; + iodec_out_l <= dec(0); + iodec_wdr_l <= dec(3); + + iodec_in0_l <= dec(4); + iodec_in1_l <= dec(5); + iodec_dipsw_l <= dec(6); + + -- 7M + decb := "1111"; + selb := ab(5) & ab(4); + if (dec(1) = '0') then + case selb is + when "00" => decb := "1110"; + when "01" => decb := "1101"; + when "10" => decb := "1011"; + when "11" => decb := "0111"; + when others => null; + end case; + end if; + wr0_l <= decb(0); + wr1_l <= decb(1); + wr2_l <= decb(2); + end process; + + p_control_reg : process + variable ena : std_logic_vector(7 downto 0); + begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + ena := "00000000"; + if (iodec_out_l = '0') then + case ab(2 downto 0) is + when "000" => ena := "00000001"; + when "001" => ena := "00000010"; + when "010" => ena := "00000100"; + when "011" => ena := "00001000"; + when "100" => ena := "00010000"; + when "101" => ena := "00100000"; + when "110" => ena := "01000000"; + when "111" => ena := "10000000"; + when others => null; + end case; + end if; + + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (ena(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + p_db_mux_comb : process(hcnt, cpu_data_out, rams_data_out) + begin + -- simplified data source for video subsystem + -- only cpu or ram are sources of interest + if (hcnt(1) = '0') then + sync_bus_db <= cpu_data_out; + else + sync_bus_db <= rams_data_out; + end if; + end process; + + p_cpu_data_in_mux_comb : process(cpu_addr, cpu_iorq_l, cpu_m1_l, sync_bus_wreq_l, + iodec_in0_l, iodec_in1_l, iodec_dipsw_l, cpu_vec_reg, sync_bus_reg, program_rom_dinl, + rams_data_out, in0_reg, in1_reg, dipsw_reg) + begin + -- simplifed again + if (cpu_iorq_l = '0') and (cpu_m1_l = '0') then + cpu_data_in <= cpu_vec_reg; + elsif (sync_bus_wreq_l = '0') then + cpu_data_in <= sync_bus_reg; + else + if (cpu_addr(15 downto 14) = "00") then -- ROM at 0000 - 3fff + cpu_data_in <= program_rom_dinl; + elsif (cpu_addr(15 downto 13) = "100") then -- ROM at 8000 - 9fff + cpu_data_in <= X"00"; + else + cpu_data_in <= rams_data_out; + if (iodec_in0_l = '0') then cpu_data_in <= in0_reg; end if; + if (iodec_in1_l = '0') then cpu_data_in <= in1_reg; end if; + if (iodec_dipsw_l = '0') then cpu_data_in <= dipsw_reg; end if; + end if; + end if; + end process; + + u_rams : work.dpram generic map (12,8) + port map + ( + clk_a_i => clk, + en_a_i => ena_6, + we_i => not sync_bus_r_w_l and not vram_l, + addr_a_i => ab(11 downto 0), + data_a_i => cpu_data_out, -- cpu only source of ram data + + clk_b_i => clk, + addr_b_i => ab(11 downto 0), + data_b_o => rams_data_out + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom : entity work.ROM_PGM_0 + port map ( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl + ); + + -- + -- video subsystem + -- + u_video : entity work.PACMAN_VIDEO + port map ( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + I_WR2_L => wr2_l, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk + ); + + O_HSYNC <= hSync; + O_VSYNC <= vSync; + + --O_HBLANK <= hblank; + O_VBLANK <= vblank; + + -- + -- + -- audio subsystem + -- + u_audio : entity work.PACMAN_AUDIO + port map ( + I_HCNT => hcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_WR1_L => wr1_l, + I_WR0_L => wr0_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk + ); + + button_in(8 downto 5) <= I_SW(3 downto 0); + button_in(4 downto 0) <= joystick_reg(4 downto 0); + button_in(13 downto 9) <= joystick_reg2(4 downto 0); + + button_debounced <= button_in; + +--button_debounced Arcade MegaWing Location +-- 8 RIGHT PushButton +-- 7 DOWN PushButton +-- 6 UP PushButton +-- 5 LEFT PushButton +-- 4 Fire Joystick +-- 3 RIGHT Joystick +-- 2 LEFT Joystick +-- 1 DOWN Joystick +-- 0 UP Joystick + + p_input_registers : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- on is low + in0_reg(7) <= not button_debounced(6); -- credit Up Pushbutton + in0_reg(6) <= '1'; -- coin2 + in0_reg(5) <= not button_debounced(7); -- coin1 DOWN PushButton + in0_reg(4) <= '1'; -- test_l dipswitch (rack advance) + in0_reg(3) <= button_debounced(1); -- p1 down + in0_reg(2) <= button_debounced(3); -- p1 right + in0_reg(1) <= button_debounced(2); -- p1 left + in0_reg(0) <= button_debounced(0); -- p1 up + + in1_reg(7) <= '1'; -- table 1-upright 0-cocktail + in1_reg(6) <= not button_debounced(8); -- start2 RIGHT PushButton + in1_reg(5) <= not button_debounced(5); -- start1 LEFT PushButton + in1_reg(4) <= button_debounced(13); -- test and fire + in1_reg(3) <= button_debounced(10); -- p2 down + in1_reg(2) <= button_debounced(12); -- p2 right + in1_reg(1) <= button_debounced(11); -- p2 left + in1_reg(0) <= button_debounced(9); -- p2 up + + -- on is low + freeze <= '0'; + dipsw_reg(7) <= '1'; -- character set ? + dipsw_reg(6) <= '1'; -- difficulty ? + dipsw_reg(5 downto 4) <= "00"; -- bonus pacman at 10K + dipsw_reg(3 downto 2) <= "11"; -- pacman (3) + dipsw_reg(1 downto 0) <= "01"; -- cost (1 coin, 1 play) + end if; + end process; + +end RTL; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..39619ea0 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR1_L, + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => rom3m(1), + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..ef80481d --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/pacman_video.vhd @@ -0,0 +1,360 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_VIDEO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + I_WR2_L : in std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_VIDEO is + + signal sprite_xy_ram_temp : std_logic_vector(7 downto 0); + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal db_reg : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_dout : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal cntr_ld : std_logic; + signal ra : std_logic_vector(7 downto 0); + signal sprite_ram_ip : std_logic_vector(3 downto 0); + signal sprite_ram_op : std_logic_vector(3 downto 0); + signal sprite_ram_addr : std_logic_vector(7 downto 0); + signal sprite_ram_addr_t1 : std_logic_vector(7 downto 0); + signal vout_obj_on_t1 : std_logic; + signal col_rom_addr : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal vout_hblank_t1 : std_logic; + signal sprite_ram_reg : std_logic_vector(3 downto 0); + + signal video_out : std_logic_vector(7 downto 0); + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + + -- ram enable is low when HBLANK_L is 0 (for sprite access) or + -- 2H is low (for cpu writes) + -- we can simplify this + dr <= not sprite_xy_ram_temp when I_HBLANK = '1' else "11111111"; -- pull ups on board + + sprite_xy_ram : work.dpram generic map (4,8) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR2_L, + addr_a_i => I_AB(3 downto 0), + data_a_i => I_DB, + + clk_b_i => CLK, + addr_b_i => I_AB(3 downto 0), + data_b_o => sprite_xy_ram_temp + ); + + p_char_regs : process + variable inc : std_logic; + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; + begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + inc := (not I_HBLANK); + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & inc); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + db_reg <= I_DB; -- character reg + end if; + end process; + + p_flip_comb : process(char_hblank_reg, I_FLIP, db_reg) + begin + if (char_hblank_reg = '0') then + xflip <= I_FLIP; + yflip <= I_FLIP; + else + xflip <= db_reg(1); + yflip <= db_reg(0); + end if; + end process; + + p_char_addr_comb : process(db_reg, I_HCNT, + char_match_reg, char_sum_reg, char_hblank_reg, + xflip, yflip) + begin + -- 2h, 4e + obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + + ca(12) <= char_hblank_reg; + ca(11 downto 6) <= db_reg(7 downto 2); + + if (char_hblank_reg = '0') then + ca(5) <= db_reg(1); + ca(4) <= db_reg(0); + else + ca(5) <= char_sum_reg(3) xor xflip; + ca(4) <= I_HCNT(3); + end if; + + ca(3) <= I_HCNT(2) xor yflip; + ca(2) <= char_sum_reg(2) xor xflip; + ca(1) <= char_sum_reg(1) xor xflip; + ca(0) <= char_sum_reg(0) xor xflip; + end process; + + -- char roms + char_rom_5ef : entity work.GFX1 + port map ( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_dout + ); + + p_char_shift : process + begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_dout(7 downto 4); -- load + shift_regl <= char_rom_5ef_dout(3 downto 0); + when others => null; + end case; + end if; + end process; + + p_char_shift_comb : process(I_HCNT, vout_yflip, shift_regu, shift_regl) + variable ip : std_logic; + begin + ip := I_HCNT(0) and I_HCNT(1); + if (vout_yflip = '0') then + + shift_sel(0) <= ip; + shift_sel(1) <= '1'; + shift_op(0) <= shift_regl(3); + shift_op(1) <= shift_regu(3); + else + + shift_sel(0) <= '1'; + shift_sel(1) <= ip; + shift_op(0) <= shift_regl(0); + shift_op(1) <= shift_regu(0); + end if; + end process; + + p_video_out_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= I_DB(4 downto 0); -- colour reg + end if; + end if; + end process; + + p_lut_4a_comb : process(vout_db, shift_op) + begin + col_rom_addr <= '0' & vout_db(4 downto 0) & shift_op(1 downto 0); + end process; + + col_rom_4a : entity work.PROM4_DST + port map ( + CLK => CLK, + ADDR => col_rom_addr, + DATA => lut_4a + ); + + cntr_ld <= '1' when (I_HCNT(3 downto 0) = "0111") and (vout_hblank='1' or vout_obj_on='0') else '0'; + + p_ra_cnt : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (cntr_ld = '1') then + ra <= dr; + else + ra <= ra + "1"; + end if; + end if; + end process; + + sprite_ram_addr <= ra; + + u_sprite_ram : work.dpram generic map (8,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => vout_obj_on, + addr_a_i => sprite_ram_addr, + data_a_i => sprite_ram_ip, + + clk_b_i => CLK, + addr_b_i => sprite_ram_addr, + data_b_o => sprite_ram_op + ); + + sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "0000"; + video_op_sel <= '1' when not (sprite_ram_reg = "0000") else '0'; + + p_sprite_ram_ip_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + end if; + end process; + + p_sprite_ram_ip_comb : process(vout_hblank_t1, video_op_sel, sprite_ram_reg, lut_4a_t1) + begin + -- 3a + if (vout_hblank_t1 = '0') then + sprite_ram_ip <= (others => '0'); + else + if (video_op_sel = '1') then + sprite_ram_ip <= sprite_ram_reg; + else + sprite_ram_ip <= lut_4a_t1(3 downto 0); + end if; + end if; + end process; + + p_video_op_comb : process(vout_hblank, I_VBLANK, video_op_sel, sprite_ram_reg, lut_4a) + begin + -- 3b + if (vout_hblank = '1') or (I_VBLANK = '1') then + final_col <= (others => '0'); + else + if (video_op_sel = '1') then + final_col <= sprite_ram_reg; -- sprite + else + final_col <= lut_4a(3 downto 0); + end if; + end if; + end process; + + col_rom_7f : entity work.PROM7_DST + port map ( + CLK => CLK, + ADDR => final_col, + DATA => video_out + ); + + -- assign outputs + O_BLUE (1 downto 0) <= video_out(7 downto 6); + O_GREEN(2 downto 0) <= video_out(5 downto 3); + O_RED (2 downto 0) <= video_out(2 downto 0); + +end architecture; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/pacman_vram_addr.vhd b/Arcade/Pacman Hardware/Pacman_MiST/rtl/pacman_vram_addr.vhd new file mode 100644 index 00000000..b26824c4 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/pacman_vram_addr.vhd @@ -0,0 +1,273 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ & CarlW - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity X74_157 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end; + +architecture RTL of X74_157 is +begin + p_y_comb : process(S,G,A,B) + begin + for i in 0 to 3 loop + -- quad 2 line to 1 line mux (true logic) + if (G = '1') then + Y(i) <= '0'; + else + if (S = '0') then + Y(i) <= A(i); + else + Y(i) <= B(i); + end if; + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity X74_257 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end; + +architecture RTL of X74_257 is +signal ab : std_logic_vector (3 downto 0); +begin + + Y <= ab; -- no tristate + p_ab : process(S,A,B) + begin + for i in 0 to 3 loop + if (S = '0') then + AB(i) <= A(i); + else + AB(i) <= B(i); + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VRAM_ADDR is + port ( + AB : out std_logic_vector (11 downto 0); + H256_L : in std_logic; + H128 : in std_logic; + H64 : in std_logic; + H32 : in std_logic; + H16 : in std_logic; + H8 : in std_logic; + H4 : in std_logic; + H2 : in std_logic; + H1 : in std_logic; + V128 : in std_logic; + V64 : in std_logic; + V32 : in std_logic; + V16 : in std_logic; + V8 : in std_logic; + V4 : in std_logic; + V2 : in std_logic; + V1 : in std_logic; + FLIP : in std_logic + ); +end; + +architecture RTL of PACMAN_VRAM_ADDR is + +signal v128p : std_logic; +signal v64p : std_logic; +signal v32p : std_logic; +signal v16p : std_logic; +signal v8p : std_logic; +signal h128p : std_logic; +signal h64p : std_logic; +signal h32p : std_logic; +signal h16p : std_logic; +signal h8p : std_logic; +signal sel : std_logic; +signal y157 : std_logic_vector (11 downto 0); + +component X74_157 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end component; + +component X74_257 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end component; + +begin + p_vp_comb : process(FLIP, V8, V16, V32, V64, V128) + begin + v128p <= FLIP xor V128; + v64p <= FLIP xor V64; + v32p <= FLIP xor V32; + v16p <= FLIP xor V16; + v8p <= FLIP xor V8; + end process; + + p_hp_comb : process(FLIP, H8, H16, H32, H64, H128) + begin + H128P <= FLIP xor H128; + H64P <= FLIP xor H64; + H32P <= FLIP xor H32; + H16P <= FLIP xor H16; + H8P <= FLIP xor H8; + end process; + + p_sel : process(H16, H32, H64) + begin + sel <= not((H32 xor H16) or (H32 xor H64)); + end process; + + --p_oe257 : process(H2) + --begin + -- oe <= not(H2); + --end process; + + U6 : X74_157 + port map( + Y => y157(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => h64p, + B(0) => h64p, + A => "1111", + G => '0', + S => sel + ); + + U5 : X74_157 + port map( + Y => y157(7 downto 4), + B(3) => h64p, + B(2) => h64p, + B(1) => h8p, + B(0) => v128p, + A => "1111", + G => '0', + S => sel + ); + + U4 : X74_157 + port map( + Y => y157(3 downto 0), + B(3) => v64p, + B(2) => v32p, + B(1) => v16p, + B(0) => v8p, + A(3) => H64, + A(2) => H32, + A(1) => H16, + A(0) => H4, + G => '0', + S => sel + ); + + U3 : X74_257 + port map( + Y => AB(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => v128p, + B(0) => v64p, + A => y157(11 downto 8), + S => H256_L + ); + + U2 : X74_257 + port map( + Y => AB(7 downto 4), + B(3) => v32p, + B(2) => v16p, + B(1) => v8p, + B(0) => h128p, + A => y157(7 downto 4), + S => H256_L + ); + + U1 : X74_257 + port map( + Y => AB(3 downto 0), + B(3) => h64p, + B(2) => h32p, + B(1) => h16p, + B(0) => h8p, + A => y157(3 downto 0), + S => H256_L + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/Pacman_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/Pacman_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_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/Arcade/Pacman Hardware/Pacman_MiST/rtl/pll.v b/Arcade/Pacman Hardware/Pacman_MiST/rtl/pll.v new file mode 100644 index 00000000..60297687 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 8, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "9" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "9" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Pacman Hardware/Pacman_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/Pacman_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/Pacman_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/Pacman_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/Pacman_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/Arcade/Pacman Hardware/Pengo_MiST/Pengo.qpf b/Arcade/Pacman Hardware/Pengo_MiST/Pengo.qpf new file mode 100644 index 00000000..bfc9f179 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/Pengo.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Pengo" diff --git a/Arcade/Pacman Hardware/Pengo_MiST/Pengo.qsf b/Arcade/Pacman Hardware/Pengo_MiST/Pengo.qsf new file mode 100644 index 00000000..bfcc5b24 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/Pengo.qsf @@ -0,0 +1,169 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 23:14:41 November 10, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Pengo_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 PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Pengo +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# 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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" + +# 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 ENTITY(MrTNT) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(MrTNT) +# ----------------- +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM3_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GFX1.vhd +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Pengo.sv +set_global_assignment -name VHDL_FILE rtl/pacman_vram_addr.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_rom_descrambler.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VHDL_FILE rtl/sega_decode.vhd +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/Pengo_MiST/README.txt b/Arcade/Pacman Hardware/Pengo_MiST/README.txt new file mode 100644 index 00000000..ffdc61c9 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/README.txt @@ -0,0 +1,24 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Pengo port to MiST by Gehstock +-- 10 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE,CTRL : Slow +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/Pengo_MiST/Release/Pengo.rbf b/Arcade/Pacman Hardware/Pengo_MiST/Release/Pengo.rbf new file mode 100644 index 00000000..07c31620 Binary files /dev/null and b/Arcade/Pacman Hardware/Pengo_MiST/Release/Pengo.rbf differ diff --git a/Arcade/Pacman Hardware/Pengo_MiST/clean.bat b/Arcade/Pacman Hardware/Pengo_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_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/Arcade/Pacman Hardware/Pengo_MiST/rtl/Pengo.sv b/Arcade/Pacman Hardware/Pengo_MiST/rtl/Pengo.sv new file mode 100644 index 00000000..7799a969 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/Pengo.sv @@ -0,0 +1,192 @@ +//============================================================================ +// Arcade: Pengo +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Pengo +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Pengo;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [7:0] audio; +wire hsync,vsync; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid = ce_6m; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(292), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(r), + .G(g), + .B(b), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + + +PACMAN_MACHINE Pengo +( + .video_r(r), + .video_g(g), + .video_b(b), + .hsync(hs), + .vsync(vs), + .h_blank(hblank), + .v_blank(vblank), + + .audio(audio), + .in0_reg(~{m_fire, 2'b00,m_coin,m_right,m_left,m_down,m_up}), + .in1_reg(~{1'b0, m_start2, m_start1, 5'b00000}), + + .dipsw1_reg(8'b11100000), + .dipsw2_reg(8'b11001100), + + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +endmodule diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..f263b100 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of GFX1 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CF",X"CF",X"F7",X"F0",X"11",X"11",X"11",X"33",X"30",X"30",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"F0",X"F7",X"CF",X"C7",X"F0",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30", + X"D5",X"91",X"11",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"C0",X"88",X"88",X"88",X"00", + X"88",X"CC",X"66",X"B3",X"B3",X"C4",X"80",X"B3",X"11",X"CC",X"F0",X"F0",X"F0",X"F0",X"F0",X"FC", + X"F7",X"E6",X"F0",X"E6",X"F7",X"F0",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00", + X"0F",X"09",X"06",X"06",X"06",X"0F",X"00",X"F0",X"07",X"05",X"05",X"05",X"04",X"07",X"00",X"00", + X"91",X"F7",X"80",X"F7",X"91",X"11",X"88",X"00",X"F0",X"F0",X"FC",X"F0",X"F0",X"F0",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"91",X"08",X"08",X"08",X"08",X"08",X"4F",X"CC",X"F0", + X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"03",X"03",X"0F",X"0F",X"0F",X"0F",X"03",X"03", + X"0C",X"0C",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"03",X"03",X"0F",X"0F",X"0F",X"0F",X"00",X"00", + X"D1",X"D1",X"F3",X"C0",X"F3",X"D1",X"D1",X"CC",X"70",X"F6",X"D4",X"F1",X"D4",X"F6",X"70",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"8F",X"88",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"00", + X"F5",X"FA",X"F5",X"FA",X"F5",X"FA",X"F5",X"FA",X"75",X"FA",X"75",X"FA",X"75",X"FA",X"75",X"FA", + X"F5",X"FA",X"F5",X"FA",X"F5",X"FA",X"F5",X"AA",X"F5",X"FA",X"F5",X"FA",X"F5",X"FA",X"F5",X"AA", + X"00",X"EA",X"F5",X"FA",X"F5",X"FA",X"F5",X"EA",X"F5",X"FA",X"F5",X"FA",X"F5",X"FA",X"75",X"00", + X"EA",X"F5",X"FA",X"F5",X"FA",X"F5",X"EA",X"00",X"00",X"75",X"FA",X"F5",X"FA",X"F5",X"FA",X"F5", + X"C4",X"EA",X"E4",X"EA",X"F5",X"FA",X"F5",X"EA",X"75",X"FA",X"F5",X"FA",X"75",X"72",X"75",X"32", + X"EA",X"F5",X"FA",X"F5",X"EA",X"E4",X"EA",X"C4",X"32",X"75",X"72",X"75",X"FA",X"F5",X"FA",X"75", + X"0C",X"86",X"C3",X"E1",X"E1",X"E9",X"E8",X"C0",X"03",X"70",X"F0",X"F0",X"F4",X"F5",X"71",X"30", + X"00",X"22",X"44",X"00",X"33",X"00",X"44",X"22",X"00",X"22",X"11",X"00",X"66",X"00",X"11",X"22", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FE",X"F0",X"F0",X"F0",X"F0",X"F0",X"F4",X"F6",X"F3",X"70", + X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"21",X"70",X"F3",X"F4",X"F4",X"F0",X"F0",X"F0", + X"E1",X"E1",X"E1",X"E1",X"E5",X"F4",X"E8",X"C0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F0", + X"0E",X"C3",X"E9",X"ED",X"E5",X"E5",X"E1",X"E1",X"0F",X"F0",X"F1",X"F0",X"F0",X"F0",X"F0",X"F0", + X"0F",X"0F",X"0F",X"0F",X"F0",X"F8",X"FC",X"FE",X"F0",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"77", + X"0F",X"FE",X"FC",X"F8",X"F0",X"0F",X"0F",X"0F",X"03",X"77",X"FF",X"FF",X"FF",X"FE",X"FC",X"F8", + X"E1",X"E3",X"E7",X"EF",X"EF",X"EF",X"EE",X"CC",X"1E",X"1E",X"1E",X"1E",X"F1",X"F3",X"F7",X"FF", + X"0E",X"CF",X"EF",X"EF",X"EF",X"EF",X"E7",X"E3",X"0F",X"FF",X"F7",X"F3",X"F1",X"1E",X"1E",X"1E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"FF",X"EE",X"CC",X"EE",X"FF",X"00",X"00",X"33",X"33",X"77",X"FF",X"77",X"33",X"33", + X"00",X"0E",X"01",X"0A",X"0C",X"08",X"08",X"0E",X"00",X"03",X"04",X"09",X"0A",X"0A",X"0A",X"0B", + X"00",X"00",X"00",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"89",X"98",X"F6",X"F0",X"01",X"01",X"01",X"03",X"30",X"30",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"F0",X"F6",X"98",X"81",X"E1",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30", + X"8D",X"81",X"01",X"00",X"00",X"00",X"00",X"00",X"7F",X"7B",X"F0",X"C0",X"08",X"08",X"08",X"00", + X"08",X"0C",X"06",X"83",X"8B",X"8C",X"88",X"8B",X"01",X"0C",X"F0",X"F3",X"F7",X"7F",X"7F",X"7F", + X"98",X"F6",X"F0",X"01",X"01",X"01",X"03",X"00",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"F0",X"F6",X"98",X"89",X"E1",X"89",X"00",X"00",X"00",X"10",X"30",X"30",X"30",X"30", + X"8D",X"81",X"01",X"00",X"00",X"00",X"00",X"00",X"7F",X"F3",X"F0",X"08",X"08",X"08",X"00",X"00", + X"01",X"01",X"01",X"83",X"8B",X"8C",X"88",X"8B",X"00",X"0C",X"F0",X"F3",X"7F",X"7F",X"7F",X"7F", + X"C4",X"C4",X"F2",X"F0",X"70",X"10",X"00",X"00",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"10",X"34",X"79",X"78",X"E1",X"E3",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"84",X"86",X"84",X"0C",X"08",X"00",X"00",X"1E",X"90",X"91",X"FE",X"F0",X"E0",X"07",X"00", + X"0C",X"06",X"06",X"8C",X"CC",X"EC",X"EC",X"E8",X"0E",X"04",X"F7",X"FF",X"FF",X"FF",X"FF",X"3F", + X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00",X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00", + X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00",X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00", + X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"00",X"33",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"EE",X"DD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"FF",X"00",X"EE",X"FF",X"00", + X"00",X"00",X"00",X"00",X"BB",X"BB",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"EE",X"11",X"00",X"00",X"00", + X"00",X"00",X"88",X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"11",X"00",X"00", + X"CC",X"22",X"55",X"55",X"55",X"99",X"22",X"CC",X"33",X"44",X"AA",X"AA",X"AA",X"99",X"44",X"33", + X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00",X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00", + X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00",X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00", + X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00",X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00", + X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00",X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00", + X"00",X"00",X"00",X"33",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"06",X"06",X"06",X"0E",X"0C",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"00",X"0E",X"0E",X"06",X"06",X"06",X"06", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"00",X"00",X"00",X"0C",X"0E",X"02",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"06",X"06",X"06",X"06",X"06",X"06",X"06", + X"0E",X"01",X"0E",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"09",X"0F",X"0F",X"0F",X"07", + X"00",X"0F",X"0F",X"0F",X"0F",X"02",X"0D",X"0E",X"00",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0E",X"06",X"0A",X"0E",X"0E",X"0E",X"0E",X"0C",X"01",X"0F",X"0F",X"0F",X"07",X"07",X"0B",X"0F", + X"00",X"0C",X"0E",X"0E",X"0E",X"0A",X"06",X"0E",X"00",X"0F",X"0B",X"0B",X"07",X"0F",X"0F",X"0E", + X"0E",X"01",X"0E",X"0E",X"0F",X"07",X"0F",X"0F",X"0E",X"0F",X"0E",X"09",X"0E",X"0F",X"0D",X"07", + X"00",X"0F",X"0D",X"0F",X"0F",X"02",X"0D",X"0E",X"00",X"07",X"0B",X"0E",X"0F",X"0F",X"0F",X"09", + X"0E",X"06",X"0A",X"0E",X"0E",X"0E",X"06",X"0C",X"01",X"0F",X"0E",X"0F",X"05",X"07",X"0B",X"0F", + X"00",X"0C",X"0A",X"0E",X"0E",X"0A",X"06",X"0E",X"00",X"0F",X"0B",X"0B",X"05",X"0F",X"0F",X"0E", + X"0E",X"01",X"0E",X"0E",X"0D",X"03",X"0F",X"0F",X"06",X"0F",X"0E",X"09",X"06",X"0E",X"0D",X"05", + X"00",X"0E",X"01",X"0F",X"07",X"02",X"0D",X"0E",X"00",X"07",X"0B",X"08",X"0F",X"0F",X"0E",X"09", + X"0E",X"06",X"08",X"0E",X"0E",X"0E",X"02",X"0C",X"00",X"0F",X"0E",X"0E",X"05",X"04",X"0B",X"07", + X"00",X"0C",X"0A",X"0A",X"06",X"0A",X"04",X"0E",X"00",X"0D",X"0B",X"09",X"04",X"0F",X"0F",X"0E", + X"06",X"00",X"06",X"07",X"06",X"00",X"0D",X"05",X"06",X"0D",X"09",X"00",X"03",X"04",X"06",X"02", + X"0A",X"0C",X"01",X"07",X"05",X"01",X"06",X"0F",X"00",X"03",X"01",X"04",X"0B",X"0D",X"0E",X"00", + X"05",X"0B",X"00",X"07",X"06",X"01",X"09",X"0C",X"00",X"03",X"0D",X"06",X"02",X"08",X"09",X"03", + X"00",X"06",X"08",X"09",X"03",X"0D",X"08",X"06",X"02",X"04",X"01",X"08",X"02",X"06",X"05",X"04", + X"01",X"04",X"0F",X"01",X"0B",X"00",X"0A",X"0E",X"01",X"03",X"02",X"00",X"01",X"00",X"01",X"00", + X"02",X"0D",X"04",X"01",X"0D",X"04",X"09",X"03",X"00",X"00",X"00",X"01",X"02",X"01",X"03",X"00", + X"03",X"0D",X"08",X"07",X"0B",X"01",X"0C",X"0B",X"08",X"01",X"06",X"0A",X"01",X"04",X"0C",X"09", + X"08",X"01",X"04",X"05",X"0B",X"0B",X"04",X"03",X"08",X"01",X"04",X"0A",X"04",X"04",X"09",X"05", + X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"07",X"0A",X"01",X"03",X"00",X"0D",X"0A",X"0B",X"08",X"02",X"01",X"05",X"00",X"0A",X"04", + X"02",X"08",X"02",X"0B",X"01",X"05",X"02",X"08",X"00",X"02",X"0A",X"01",X"05",X"08",X"0A",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"00",X"02",X"00",X"05",X"01",X"08",X"02",X"00",X"00",X"01",X"00",X"00",X"01",X"00",X"00", + X"08",X"01",X"00",X"0A",X"00",X"05",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"03",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"00",X"01",X"00",X"00",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"02",X"00",X"01",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F8",X"FB",X"F3",X"F0",X"30",X"00",X"70",X"71",X"31",X"30",X"10",X"00",X"00",X"00", + X"00",X"30",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70", + X"E0",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"FC",X"F8",X"F0",X"C0",X"00", + X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"E0",X"00",X"C0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"D2",X"2D",X"F8",X"3D",X"D7",X"F0",X"30",X"00",X"25",X"71",X"21",X"30",X"10",X"00",X"00",X"00", + X"00",X"30",X"F0",X"F0",X"B4",X"78",X"87",X"78",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"52", + X"E0",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"F0",X"F0",X"3C",X"FC",X"F8",X"F0",X"C0",X"00", + X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"E0",X"00",X"C0",X"F0",X"F0",X"F0",X"78",X"F0",X"F0", + X"D2",X"2D",X"F8",X"3D",X"D7",X"E1",X"21",X"00",X"25",X"71",X"21",X"30",X"01",X"00",X"00",X"00", + X"00",X"30",X"D2",X"A5",X"78",X"78",X"87",X"78",X"00",X"00",X"00",X"01",X"30",X"30",X"70",X"52", + X"E0",X"68",X"C0",X"C0",X"80",X"00",X"00",X"00",X"E1",X"D2",X"3C",X"DE",X"69",X"F0",X"C0",X"00", + X"00",X"00",X"00",X"80",X"C0",X"C0",X"C2",X"2C",X"00",X"C0",X"D2",X"B4",X"5A",X"69",X"F0",X"3C", + X"00",X"20",X"D0",X"34",X"DE",X"E5",X"D0",X"30",X"00",X"00",X"00",X"30",X"10",X"10",X"00",X"00", + X"30",X"F0",X"52",X"B4",X"B0",X"40",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"00",X"00",X"00", + X"E0",X"60",X"E0",X"68",X"80",X"C0",X"80",X"00",X"20",X"50",X"30",X"D2",X"69",X"BE",X"DC",X"E0", + X"00",X"80",X"80",X"48",X"E0",X"60",X"E0",X"20",X"60",X"B4",X"5A",X"B4",X"43",X"70",X"A0",X"00", + X"77",X"77",X"77",X"77",X"77",X"77",X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"C3",X"C3",X"C0",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"C3",X"C3",X"C3",X"C3",X"C3",X"C3",X"C3",X"C3", + X"00",X"00",X"0C",X"0F",X"0F",X"0F",X"0F",X"0F",X"C0",X"C3",X"C3",X"C3",X"C3",X"C3",X"C3",X"C3", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"33",X"FF",X"33",X"33",X"33",X"33",X"33",X"11",X"F0",X"FF",X"F0",X"F0",X"F0",X"F0",X"F0",X"00", + X"00",X"00",X"00",X"11",X"33",X"33",X"33",X"33",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0", + X"77",X"00",X"99",X"AA",X"AA",X"AA",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"88",X"88",X"77",X"00",X"77",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"00",X"EE",X"11",X"11",X"11",X"22",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"11",X"11",X"EE",X"00",X"EE",X"11",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"0E",X"06",X"06",X"06", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"06",X"06",X"06",X"0E",X"0C",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"06",X"06",X"06",X"06", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"01",X"01",X"01",X"12",X"12",X"12",X"12",X"01", + X"F0",X"F0",X"78",X"78",X"78",X"78",X"78",X"F0",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"01", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"34",X"34",X"34",X"34",X"12",X"12",X"12",X"01", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"78", + X"78",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"01",X"12",X"34",X"34",X"34",X"78",X"78", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"34",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"E1",X"86",X"08",X"00",X"00",X"00",X"00",X"F1",X"F0",X"F0",X"E1",X"C2",X"84",X"08",X"00", + X"F0",X"F0",X"F0",X"F0",X"F3",X"F7",X"FF",X"FE",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"96",X"09",X"00",X"00",X"00",X"08",X"09",X"96",X"F0",X"F0",X"E1",X"E1",X"E1",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"0F",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"01",X"1E",X"F0",X"F0", + X"34",X"34",X"34",X"34",X"12",X"12",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"12",X"12",X"12",X"12",X"12",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C3",X"0C",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FE",X"FF",X"F8",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F7",X"F3",X"7B",X"78",X"78",X"78",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FC",X"FE", + X"34",X"34",X"12",X"12",X"12",X"1A",X"96",X"E1",X"00",X"00",X"00",X"00",X"08",X"87",X"F0",X"F0", + X"01",X"12",X"12",X"12",X"12",X"34",X"34",X"34",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"35",X"35",X"34",X"12",X"01",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"34",X"16",X"69",X"78",X"78",X"78",X"79",X"79",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FE",X"FE",X"FE",X"F6",X"F7",X"F3",X"78",X"35",X"35",X"34",X"12",X"12",X"01",X"01",X"00", + X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"12",X"12",X"34",X"34",X"34",X"34",X"35",X"35", + X"F6",X"F7",X"F3",X"79",X"34",X"16",X"69",X"F0",X"12",X"12",X"01",X"00",X"00",X"00",X"00",X"01", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F8",X"FC",X"FC",X"78",X"78",X"78",X"78",X"78",X"34",X"34",X"34", + X"F0",X"78",X"1E",X"E1",X"F0",X"F0",X"F0",X"F0",X"C3",X"E1",X"F0",X"F8",X"FC",X"FE",X"F6",X"7A", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"34",X"34",X"1E", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F3",X"F7",X"F6",X"F6",X"F6",X"F2",X"F0",X"F0", + X"00",X"03",X"3C",X"F0",X"F0",X"F0",X"F8",X"F8",X"00",X"00",X"00",X"01",X"12",X"34",X"79",X"7B", + X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"1E",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"E1",X"E1",X"D2",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"78",X"B4",X"B4",X"D2",X"D2",X"78",X"96",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F3",X"F3",X"F6",X"F6",X"F4",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"87",X"78",X"F0",X"F0",X"FC",X"FE",X"FF",X"FF",X"F0",X"E1",X"1E",X"78",X"F1", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F8",X"FC", + X"F0",X"F0",X"F0",X"FC",X"FC",X"F0",X"F0",X"0F",X"F0",X"F0",X"FF",X"FF",X"F7",X"F0",X"78",X"87", + X"F0",X"F0",X"78",X"78",X"78",X"F0",X"F0",X"F0",X"96",X"09",X"08",X"08",X"84",X"C3",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"96",X"E1",X"F0",X"F0", + X"34",X"78",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"08",X"84",X"C3",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F6",X"F7",X"7B",X"34",X"F0",X"F0",X"F0",X"F0",X"F0",X"C3",X"84",X"08", + X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"07",X"78",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"3C",X"03",X"00",X"00",X"00",X"F0",X"F0",X"1E",X"01",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F3",X"F0",X"3C",X"03",X"00",X"0F",X"F0",X"78",X"16",X"01",X"00",X"00",X"00",X"0F", + X"FC",X"FE",X"F6",X"F6",X"78",X"78",X"78",X"F0",X"F0",X"96",X"09",X"09",X"08",X"08",X"84",X"C3", + X"F0",X"F0",X"F0",X"E1",X"1E",X"C3",X"E1",X"F0",X"F0",X"F0",X"F0",X"1E",X"E1",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"FF",X"FF",X"F0",X"0F",X"F0",X"F0",X"F0",X"F0",X"F7",X"FF",X"F8",X"E1",X"D2", + X"F0",X"78",X"7B",X"7B",X"7B",X"B5",X"D2",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"E1",X"D2",X"3C", + X"E1",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F1",X"FF",X"FF",X"FE",X"F0",X"E1",X"1E",X"D2",X"F0",X"F0",X"F7",X"F3",X"F0",X"F0",X"0F",X"F0", + X"08",X"87",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"FF",X"FF",X"FF",X"F0",X"F0",X"0F",X"00",X"FF",X"F7",X"F3",X"F0",X"78",X"07",X"00",X"00", + X"F1",X"FF",X"FF",X"FF",X"F0",X"C3",X"0C",X"0F",X"F0",X"F0",X"FF",X"FF",X"F0",X"F0",X"0F",X"0F", + X"D2",X"D2",X"D2",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"B4",X"B4",X"B4",X"D2",X"D2",X"E1",X"E1",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F1",X"78",X"96",X"E1",X"F0",X"F0",X"F0",X"F0",X"1E",X"E1",X"F0",X"F0",X"78", + X"F0",X"F0",X"F0",X"F0",X"F1",X"F0",X"78",X"87",X"F0",X"F0",X"F0",X"F0",X"FE",X"F0",X"0F",X"F0", + X"B4",X"D2",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"B4",X"B4",X"79",X"79",X"78",X"F0",X"F0",X"F0",X"F0",X"F8",X"FC",X"F0",X"0F", + X"E1",X"D2",X"B4",X"78",X"F0",X"F0",X"F0",X"F0",X"FF",X"FE",X"F8",X"F0",X"C3",X"3C",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"FC",X"FC",X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F3",X"F7", + X"00",X"00",X"00",X"08",X"84",X"C2",X"E1",X"E1",X"00",X"08",X"86",X"E1",X"F0",X"F0",X"F0",X"F0", + X"F7",X"FF",X"FF",X"FF",X"FC",X"F0",X"F0",X"0F",X"F0",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"0F", + X"0E",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"E9",X"C2",X"84",X"08",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FC",X"F0",X"87",X"08",X"00",X"0F", + X"00",X"00",X"08",X"84",X"C2",X"E1",X"E1",X"E1",X"C2",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"ED",X"ED",X"E9",X"E1",X"C2",X"0C",X"00",X"00",X"F0",X"F1",X"FF",X"FF",X"F0",X"C3",X"0C",X"84", + X"08",X"84",X"C2",X"C2",X"C2",X"E1",X"E1",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"CA",X"CA",X"CA",X"CA",X"C2",X"84",X"08",X"00",X"F1",X"F3",X"F7",X"FF",X"FE",X"F0",X"E1",X"0F", + X"FF",X"FE",X"F0",X"0F",X"84",X"84",X"C2",X"C2",X"F7",X"F1",X"78",X"87",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FC",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"84",X"84",X"84",X"84",X"08",X"08",X"08",X"08", + 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"84",X"84",X"84",X"84", + X"C2",X"C2",X"84",X"08",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"E1",X"C2",X"0C",X"00", + X"00",X"00",X"00",X"00",X"08",X"84",X"C2",X"C2",X"00",X"08",X"86",X"E1",X"F0",X"F0",X"F0",X"F0", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"E1",X"86",X"08",X"00",X"00",X"00",X"00", + X"E1",X"E1",X"E1",X"E1",X"C2",X"C2",X"C2",X"84",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"08",X"84",X"C2",X"E1",X"E1",X"F0", + X"00",X"06",X"08",X"09",X"03",X"0D",X"08",X"06",X"02",X"04",X"01",X"08",X"02",X"06",X"05",X"04", + X"09",X"09",X"09",X"0F",X"0F",X"00",X"0F",X"0F",X"0D",X"0D",X"0D",X"0D",X"0C",X"0E",X"07",X"03", + X"00",X"00",X"08",X"08",X"09",X"09",X"09",X"09",X"00",X"00",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"0B",X"0B",X"0B",X"0B",X"03",X"07",X"0E",X"0C", + X"00",X"00",X"0F",X"0F",X"00",X"0E",X"0F",X"03",X"00",X"00",X"07",X"0F",X"0C",X"09",X"0B",X"0B", + X"09",X"09",X"09",X"0F",X"0F",X"00",X"0F",X"0F",X"0D",X"0D",X"0D",X"0D",X"0C",X"0E",X"07",X"03", + X"00",X"00",X"08",X"09",X"09",X"09",X"09",X"09",X"00",X"00",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D", + X"03",X"03",X"03",X"0F",X"0E",X"00",X"0F",X"0F",X"0B",X"0B",X"0B",X"0B",X"0B",X"00",X"0F",X"0F", + X"00",X"00",X"03",X"03",X"03",X"03",X"03",X"03",X"00",X"00",X"00",X"0B",X"0B",X"0B",X"0B",X"0B", + X"09",X"08",X"08",X"0F",X"0F",X"00",X"0F",X"0F",X"0D",X"0D",X"0D",X"0D",X"0C",X"0E",X"07",X"03", + X"00",X"00",X"09",X"09",X"09",X"09",X"09",X"09",X"00",X"00",X"0D",X"0D",X"0D",X"0D",X"0D",X"0D", + X"03",X"03",X"03",X"0F",X"0E",X"00",X"0F",X"0F",X"0B",X"00",X"00",X"0F",X"0F",X"00",X"0F",X"0F", + X"00",X"00",X"0F",X"0F",X"00",X"0F",X"0F",X"03",X"00",X"00",X"0F",X"0F",X"08",X"0B",X"0B",X"0B", + X"0C",X"0F",X"03",X"0C",X"07",X"01",X"00",X"00",X"0D",X"0E",X"07",X"01",X"00",X"00",X"00",X"00", + X"01",X"0E",X"00",X"01",X"07",X"0C",X"03",X"0F",X"04",X"03",X"00",X"00",X"00",X"01",X"07",X"0E", + X"03",X"00",X"00",X"0E",X"0F",X"01",X"0E",X"07",X"00",X"00",X"0F",X"07",X"08",X"0F",X"03",X"00", + X"01",X"07",X"0C",X"03",X"0F",X"0F",X"03",X"03",X"00",X"00",X"03",X"0E",X"09",X"07",X"0E",X"00", + X"00",X"00",X"80",X"C2",X"C2",X"C2",X"C0",X"C0",X"00",X"00",X"00",X"30",X"70",X"70",X"F0",X"F0", + X"00",X"01",X"12",X"F0",X"F0",X"F0",X"F0",X"F0",X"0C",X"08",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"87",X"87",X"87",X"87",X"87",X"00",X"00",X"F0",X"F2",X"F3",X"71",X"70",X"30",X"00",X"00", + X"F0",X"F0",X"F7",X"F6",X"F0",X"F0",X"03",X"01",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0C", + X"00",X"00",X"87",X"87",X"87",X"87",X"87",X"C0",X"00",X"00",X"30",X"70",X"70",X"F0",X"F0",X"F0", + X"07",X"01",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"08",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"C0",X"C2",X"C2",X"C2",X"80",X"00",X"00",X"F2",X"F3",X"71",X"70",X"30",X"00",X"00",X"00", + X"F0",X"F6",X"F7",X"F0",X"F0",X"10",X"03",X"06",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"08",X"00", + X"00",X"00",X"80",X"C2",X"C2",X"CA",X"CC",X"CC",X"00",X"00",X"00",X"30",X"71",X"73",X"E2",X"E0", + X"00",X"01",X"12",X"F0",X"FC",X"FC",X"56",X"16",X"0C",X"08",X"F0",X"F0",X"F3",X"F7",X"FF",X"FF", + X"CC",X"8F",X"8F",X"8F",X"87",X"86",X"00",X"00",X"F0",X"F1",X"E2",X"62",X"71",X"30",X"00",X"00", + X"96",X"9E",X"56",X"74",X"FC",X"F0",X"03",X"01",X"FF",X"FF",X"FF",X"F7",X"F3",X"F0",X"F0",X"0C", + X"00",X"00",X"86",X"87",X"8F",X"8F",X"8F",X"CC",X"00",X"00",X"30",X"71",X"62",X"E2",X"F1",X"F0", + X"07",X"01",X"F0",X"FC",X"74",X"56",X"9E",X"96",X"08",X"F0",X"F0",X"F3",X"F7",X"FF",X"FF",X"FF", + X"CC",X"CC",X"CA",X"C2",X"C2",X"80",X"00",X"00",X"E0",X"E2",X"73",X"71",X"30",X"00",X"00",X"00", + X"16",X"56",X"FC",X"FC",X"F0",X"10",X"03",X"06",X"FF",X"FF",X"F7",X"F3",X"F0",X"F0",X"08",X"00", + X"0C",X"07",X"0B",X"81",X"48",X"0C",X"0E",X"C0",X"00",X"00",X"10",X"30",X"30",X"70",X"70",X"70", + X"00",X"00",X"F0",X"C3",X"87",X"0F",X"F0",X"F0",X"01",X"E0",X"F0",X"1E",X"0F",X"0F",X"C3",X"F0", + X"CC",X"CC",X"8C",X"8B",X"03",X"06",X"0C",X"00",X"70",X"71",X"31",X"30",X"10",X"00",X"00",X"00", + X"FC",X"FE",X"32",X"32",X"F0",X"06",X"06",X"02",X"F3",X"F7",X"F7",X"FF",X"FF",X"00",X"00",X"00", + X"00",X"00",X"0C",X"08",X"81",X"83",X"87",X"83",X"00",X"00",X"30",X"70",X"70",X"E1",X"F0",X"F0", + X"00",X"00",X"F0",X"C3",X"0F",X"0F",X"3C",X"F0",X"00",X"70",X"87",X"0F",X"0F",X"78",X"F0",X"F0", + X"8B",X"8B",X"89",X"00",X"00",X"00",X"00",X"00",X"F1",X"F3",X"62",X"60",X"30",X"00",X"00",X"00", + X"F8",X"FC",X"74",X"71",X"F1",X"0C",X"0C",X"08",X"F7",X"FF",X"FF",X"FF",X"EE",X"00",X"00",X"00", + X"00",X"00",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"40",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"07",X"3C",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"08",X"C0",X"C3",X"C3",X"C3",X"E1",X"F0",X"F0", + X"00",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"F0",X"F4",X"F5",X"F1",X"F0",X"E1",X"40",X"00", + X"F0",X"F0",X"F8",X"F8",X"F0",X"3C",X"07",X"00",X"F0",X"E1",X"C3",X"C3",X"C3",X"C0",X"08",X"00", + X"00",X"80",X"C1",X"E1",X"E1",X"E1",X"E1",X"E0",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"30", + X"0F",X"03",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"08",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"E1",X"E1",X"E1",X"E1",X"C1",X"80",X"00",X"00",X"30",X"31",X"11",X"10",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"FB",X"FB",X"F0",X"03",X"0F",X"00",X"F0",X"F0",X"F0",X"F8",X"F0",X"F0",X"08",X"00", + X"00",X"00",X"82",X"CA",X"CE",X"CE",X"CC",X"CF",X"00",X"00",X"10",X"30",X"30",X"70",X"70",X"70", + X"0F",X"12",X"F0",X"F7",X"CC",X"CC",X"E7",X"E1",X"08",X"F0",X"F0",X"F1",X"F3",X"7F",X"7F",X"7F", + X"8F",X"8F",X"8F",X"8F",X"87",X"07",X"00",X"00",X"70",X"70",X"30",X"30",X"10",X"00",X"00",X"00", + X"E7",X"CC",X"CC",X"F7",X"F0",X"12",X"0F",X"00",X"7F",X"7F",X"F3",X"F1",X"F0",X"F0",X"08",X"00", + X"00",X"00",X"00",X"06",X"86",X"0E",X"8E",X"8E",X"00",X"00",X"00",X"30",X"71",X"73",X"F3",X"F1", + X"00",X"01",X"07",X"F0",X"FC",X"30",X"12",X"9E",X"00",X"0E",X"E0",X"F0",X"F3",X"F7",X"FF",X"FF", + X"88",X"88",X"8C",X"8C",X"84",X"04",X"00",X"00",X"F0",X"F1",X"F3",X"73",X"71",X"30",X"00",X"00", + X"96",X"9E",X"12",X"30",X"FC",X"F0",X"07",X"01",X"FF",X"FF",X"FF",X"F7",X"F3",X"F0",X"E0",X"0E", + X"08",X"0C",X"0F",X"0B",X"81",X"81",X"CC",X"CC",X"00",X"00",X"00",X"00",X"30",X"70",X"70",X"F0", + X"00",X"30",X"30",X"70",X"F0",X"F0",X"E1",X"C3",X"01",X"C0",X"E0",X"E1",X"E1",X"F0",X"F0",X"79", + X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F3",X"F7",X"C4",X"40",X"30",X"01",X"01", + X"C3",X"E9",X"E9",X"E9",X"EB",X"E3",X"09",X"03",X"79",X"3F",X"3F",X"2E",X"0C",X"0C",X"0C",X"08", + X"00",X"08",X"0C",X"0F",X"83",X"81",X"85",X"8E",X"00",X"00",X"00",X"30",X"70",X"70",X"F0",X"F0", + X"00",X"10",X"70",X"F0",X"F0",X"F0",X"C3",X"C3",X"40",X"E0",X"F0",X"E1",X"F0",X"F0",X"F0",X"79", + X"8B",X"89",X"01",X"00",X"00",X"00",X"08",X"00",X"F3",X"F7",X"E6",X"62",X"30",X"01",X"01",X"00", + X"E9",X"E9",X"61",X"71",X"F3",X"08",X"00",X"00",X"7B",X"3F",X"3F",X"0E",X"0E",X"07",X"03",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"70",X"F3",X"F7",X"C4",X"C0",X"E1", + X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E1",X"C0",X"C4",X"F7",X"F3",X"70",X"70",X"30", + X"78",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"F0",X"F4",X"F4",X"B0",X"B0",X"F4",X"B4", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"B4",X"F4",X"B0",X"B0",X"F4",X"F4",X"F0",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"E0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F8",X"F8",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"F0",X"F0",X"F8",X"FD",X"F5",X"F1",X"F0",X"70", + X"60",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F6",X"F6",X"F0",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"96",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0", + X"E0",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"00",X"70",X"F1",X"F3",X"F0",X"F0",X"70",X"30",X"00", + X"F0",X"30",X"FE",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"E0",X"F0",X"F0",X"E0",X"00",X"00",X"00",X"00",X"70",X"F3",X"F0",X"70", + X"00",X"00",X"00",X"00",X"C3",X"BB",X"F0",X"F0",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"00",X"00",X"10",X"30",X"70",X"70",X"F0",X"F0", + X"00",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"C0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"F2",X"F3",X"71",X"70",X"30",X"10",X"00",X"00", + X"F0",X"F0",X"F7",X"F7",X"F0",X"F0",X"70",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"C0",X"00", + X"C0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"30",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F4",X"F6",X"F6",X"F2",X"70",X"30",X"00",X"F0",X"F0",X"F0",X"FE",X"FE",X"FC",X"F0",X"F0", + X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"00",X"00",X"10",X"30",X"71",X"71",X"F0",X"F0", + X"00",X"70",X"F0",X"FE",X"FF",X"99",X"98",X"C3",X"00",X"C0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"F0",X"F0",X"71",X"71",X"30",X"10",X"00",X"00", + X"C3",X"98",X"99",X"FF",X"FE",X"F0",X"70",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"C0",X"00", + X"C0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"30",X"71",X"F3",X"F3",X"E2",X"E0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"70",X"70",X"3C", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00", + X"F0",X"E0",X"E2",X"F3",X"F3",X"71",X"30",X"00",X"3C",X"70",X"70",X"F8",X"F8",X"F8",X"F0",X"F0", + X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"30",X"70",X"70",X"F0",X"F0", + X"00",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"C0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"F0",X"71",X"71",X"30",X"10",X"00",X"00",X"00", + X"FE",X"FF",X"99",X"98",X"F0",X"16",X"02",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"C0",X"00",X"00", + X"C0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"30",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"F1",X"F3",X"C0",X"C0",X"71",X"10",X"00",X"00",X"F8",X"FC",X"FC",X"FC",X"F8",X"F0",X"3C",X"08", + X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"11",X"00",X"00",X"00",X"44",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"30",X"70",X"F0",X"F4",X"FE",X"98",X"98", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00", + X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"88",X"F0",X"F2",X"C4",X"C4",X"F7",X"F2",X"70",X"30", + X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"22",X"00",X"10",X"98",X"10",X"10",X"30",X"70",X"F2",X"F7",X"C4",X"C4",X"F2",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"98",X"10",X"00",X"00",X"22",X"00",X"00",X"98",X"98",X"FE",X"F4",X"F0",X"70",X"30",X"10", + X"08",X"0C",X"06",X"C3",X"C3",X"F0",X"F0",X"78",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"03",X"06",X"15",X"33",X"33",X"33",X"08",X"08",X"08",X"36",X"FE",X"FC",X"FC",X"F8", + X"3C",X"3C",X"1E",X"1E",X"96",X"C3",X"E1",X"C1",X"00",X"00",X"22",X"01",X"88",X"88",X"11",X"11", + X"33",X"30",X"3C",X"2C",X"20",X"30",X"10",X"00",X"F0",X"F0",X"FE",X"76",X"76",X"FC",X"F0",X"F0", + X"0C",X"08",X"04",X"96",X"96",X"96",X"96",X"96",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"11",X"33",X"33",X"33",X"0F",X"0F",X"01",X"67",X"EF",X"FC",X"FC",X"F8", + X"1E",X"1E",X"3C",X"78",X"F0",X"F0",X"E0",X"C0",X"00",X"00",X"89",X"88",X"00",X"00",X"44",X"44", + X"33",X"30",X"3C",X"3D",X"31",X"B8",X"10",X"00",X"F0",X"F0",X"30",X"32",X"FE",X"FC",X"F0",X"F0", + X"0E",X"C3",X"E9",X"ED",X"E5",X"E5",X"E1",X"E1",X"03",X"70",X"F3",X"F4",X"F4",X"F0",X"F0",X"F0", + X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"F0",X"F1",X"F0",X"F0",X"F0",X"F0",X"F0", + X"E1",X"E1",X"E1",X"E1",X"E5",X"E5",X"E8",X"C0",X"F0",X"F0",X"F0",X"F0",X"F4",X"F6",X"F3",X"70", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FE",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F0", + X"0E",X"CF",X"EF",X"EF",X"EF",X"EF",X"E7",X"E3",X"03",X"77",X"FF",X"FF",X"FF",X"FE",X"FC",X"F8", + X"0F",X"FE",X"FC",X"F8",X"F0",X"0F",X"0F",X"0F",X"0F",X"FF",X"F7",X"F3",X"F1",X"1E",X"1E",X"1E", + X"E1",X"E3",X"E7",X"EF",X"EF",X"EF",X"EE",X"CC",X"F0",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"77", + X"0F",X"0F",X"0F",X"0F",X"F0",X"F8",X"FC",X"FE",X"1E",X"1E",X"1E",X"1E",X"F1",X"F3",X"F7",X"FF", + X"00",X"00",X"81",X"0B",X"87",X"C1",X"C0",X"C0",X"00",X"07",X"00",X"30",X"70",X"F0",X"F0",X"F0", + X"10",X"3C",X"78",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"84",X"83",X"03",X"01",X"01",X"00",X"00",X"00",X"F0",X"F4",X"F6",X"72",X"30",X"00",X"01",X"00", + X"F0",X"F0",X"FC",X"FE",X"F0",X"03",X"0F",X"00",X"F0",X"F0",X"F0",X"C0",X"0C",X"08",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"03",X"83",X"84",X"00",X"01",X"00",X"30",X"70",X"F0",X"F0",X"F0", + X"00",X"0F",X"03",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"08",X"0C",X"C0",X"F0",X"F0",X"F0", + X"C0",X"C0",X"C1",X"87",X"0B",X"81",X"00",X"00",X"F0",X"F6",X"F2",X"70",X"30",X"00",X"07",X"00", + X"F0",X"F0",X"F4",X"F6",X"F2",X"78",X"3C",X"10",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"88",X"88",X"77",X"00",X"77",X"88",X"88",X"EE",X"11",X"11",X"EE",X"00",X"EE",X"11",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"00",X"00",X"FF",X"44",X"00",X"00",X"00",X"EE",X"00",X"11",X"FF",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"88",X"88",X"77",X"00",X"77",X"88",X"88",X"EE",X"11",X"11",X"EE",X"00",X"EE",X"11",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"00",X"00",X"FF",X"44",X"22",X"11",X"00",X"EE",X"00",X"44",X"FF",X"44",X"44",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"88",X"77",X"00",X"77",X"88",X"77",X"00",X"EE",X"11",X"EE",X"00",X"EE",X"11",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"44",X"99",X"99",X"77",X"00",X"00",X"FF",X"44",X"EE",X"11",X"11",X"EE",X"00",X"11",X"FF",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"88",X"77",X"00",X"77",X"88",X"77",X"00",X"EE",X"11",X"EE",X"00",X"EE",X"11",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"88",X"88",X"44",X"66",X"99",X"99",X"44",X"11",X"99",X"55",X"33",X"EE",X"11",X"11",X"22", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"88",X"77",X"00",X"77",X"88",X"77",X"00",X"EE",X"11",X"EE",X"00",X"EE",X"11",X"EE",X"44", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"44",X"33",X"00",X"44",X"99",X"99",X"77",X"FF",X"44",X"44",X"CC",X"EE",X"11",X"11",X"EE", + X"00",X"00",X"00",X"80",X"89",X"8B",X"8B",X"8B",X"00",X"00",X"30",X"73",X"E6",X"E2",X"F0",X"E6", + X"00",X"00",X"F0",X"F8",X"35",X"3D",X"3D",X"35",X"00",X"00",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"83",X"81",X"80",X"0C",X"08",X"00",X"00",X"E6",X"F3",X"70",X"70",X"30",X"00",X"00",X"00", + X"70",X"F8",X"0F",X"87",X"C3",X"30",X"00",X"00",X"EF",X"F0",X"F0",X"3C",X"0F",X"0F",X"00",X"00", + X"08",X"88",X"C0",X"C0",X"E0",X"E0",X"E0",X"E0",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"30", + X"01",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"3F",X"F7",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"80",X"10",X"10",X"06",X"0F",X"3F",X"3F",X"0F",X"07", + X"F0",X"F4",X"F6",X"F2",X"70",X"B8",X"FE",X"33",X"F0",X"F0",X"F0",X"FE",X"FE",X"FC",X"F0",X"F8", + X"C0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"07",X"0F",X"3F",X"3F",X"0F",X"06",X"10",X"10", + X"33",X"FE",X"B8",X"70",X"F0",X"F0",X"F0",X"F0",X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"88",X"08",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"00", + X"F4",X"F6",X"F2",X"F0",X"F0",X"70",X"30",X"01",X"F0",X"FE",X"FE",X"FC",X"F0",X"F0",X"F7",X"3F", + X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"00",X"30",X"70",X"71",X"F1",X"F0",X"F0", + X"01",X"E1",X"F0",X"FE",X"FF",X"CC",X"CC",X"E1",X"0C",X"0E",X"E0",X"F0",X"F0",X"F0",X"F0",X"78", + X"80",X"00",X"00",X"03",X"07",X"CF",X"07",X"00",X"F0",X"F1",X"F1",X"F0",X"70",X"30",X"00",X"00", + X"EF",X"FF",X"CC",X"CC",X"F0",X"F0",X"F0",X"00",X"78",X"F0",X"F0",X"E0",X"E0",X"D1",X"FF",X"00", + X"00",X"07",X"CF",X"07",X"03",X"80",X"80",X"C0",X"00",X"00",X"10",X"30",X"30",X"70",X"70",X"70", + X"00",X"70",X"F0",X"F0",X"E6",X"EE",X"FF",X"F7",X"00",X"F7",X"D1",X"F0",X"70",X"70",X"F8",X"3C", + X"C0",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"70",X"70",X"70",X"30",X"30",X"10",X"00",X"00", + X"F0",X"E6",X"EE",X"FF",X"F7",X"F0",X"61",X"01",X"3C",X"70",X"70",X"F8",X"F0",X"F0",X"0E",X"0C", + X"E0",X"F0",X"F0",X"F0",X"F0",X"F8",X"FC",X"78",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"10", + X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F7",X"CC",X"F0",X"F0",X"F0",X"F0",X"F3",X"F7",X"F0",X"CB", + X"2C",X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C4",X"70",X"06",X"04",X"00",X"00",X"00",X"00",X"87",X"87",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"C0",X"C0",X"E0",X"E0",X"E0",X"E0",X"00",X"10",X"30",X"30",X"70",X"70",X"70",X"70", + X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"FE",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F8",X"FC", + X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"70",X"30",X"30",X"10",X"00",X"00",X"00",X"00", + X"FE",X"32",X"30",X"F0",X"0C",X"09",X"03",X"03",X"FC",X"FC",X"FC",X"FC",X"CC",X"0E",X"0F",X"0F", + X"00",X"80",X"00",X"40",X"C4",X"64",X"C0",X"20",X"00",X"00",X"30",X"70",X"70",X"F0",X"F0",X"F0", + X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"E0",X"F0",X"E0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"00",X"F7",X"FF",X"FF",X"51",X"80",X"00",X"F0",X"F0",X"F2",X"F3",X"71",X"70",X"30",X"00", + X"F0",X"F0",X"F0",X"F7",X"F6",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"F0",X"F0", + X"00",X"80",X"51",X"FF",X"FF",X"F7",X"00",X"C0",X"00",X"30",X"70",X"70",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"20",X"C0",X"64",X"C4",X"40",X"00",X"80",X"00",X"F0",X"F2",X"F3",X"71",X"70",X"30",X"00",X"00", + X"F0",X"F0",X"F7",X"F6",X"F0",X"F0",X"F0",X"00",X"F0",X"F0",X"F0",X"F0",X"E0",X"F0",X"E0",X"00", + X"00",X"80",X"40",X"B3",X"77",X"FF",X"77",X"F3",X"00",X"00",X"30",X"70",X"70",X"F0",X"F0",X"F0", + X"00",X"F0",X"F0",X"F7",X"CC",X"CC",X"F6",X"E1",X"00",X"F0",X"E0",X"F0",X"F0",X"F0",X"F0",X"78", + X"20",X"C0",X"EC",X"C4",X"C0",X"CC",X"80",X"00",X"F0",X"F0",X"F1",X"F1",X"70",X"70",X"30",X"00", + X"E1",X"98",X"98",X"FE",X"FC",X"F0",X"F0",X"F0",X"78",X"F0",X"F0",X"F0",X"E0",X"F0",X"E0",X"F0", + X"00",X"80",X"CC",X"C0",X"C4",X"EC",X"C0",X"20",X"00",X"30",X"70",X"70",X"F1",X"F1",X"F0",X"F0", + X"F0",X"F0",X"F0",X"FC",X"FE",X"98",X"98",X"C3",X"F0",X"E0",X"F0",X"E0",X"F0",X"F0",X"F0",X"F0", + X"F3",X"77",X"FF",X"77",X"B3",X"40",X"80",X"00",X"F0",X"F0",X"F0",X"70",X"70",X"30",X"00",X"00", + X"C3",X"F4",X"CC",X"CC",X"F6",X"F0",X"F0",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"F0",X"00", + X"88",X"EE",X"33",X"91",X"51",X"A0",X"C0",X"A0",X"00",X"00",X"10",X"30",X"30",X"70",X"70",X"70", + X"00",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"51",X"A0",X"D1",X"E0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"A0",X"C4",X"73",X"B3",X"66",X"CC",X"88",X"70",X"70",X"70",X"30",X"30",X"10",X"00",X"00", + X"F0",X"F7",X"FF",X"99",X"90",X"F0",X"16",X"04",X"F0",X"F0",X"F8",X"F0",X"F0",X"F0",X"E0",X"11", + X"00",X"00",X"80",X"40",X"80",X"51",X"F7",X"B3",X"00",X"00",X"30",X"70",X"70",X"F0",X"F0",X"F0", + X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"A0",X"D0",X"E0",X"F0",X"E0",X"F0",X"F0",X"F0", + X"F3",X"B1",X"51",X"80",X"40",X"80",X"00",X"00",X"F0",X"F0",X"71",X"71",X"30",X"10",X"00",X"00", + X"F0",X"FE",X"FF",X"32",X"30",X"F0",X"3C",X"08",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"00", + X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30", + X"00",X"00",X"70",X"F0",X"F3",X"F7",X"F7",X"F0",X"00",X"00",X"E0",X"F0",X"F8",X"F8",X"F0",X"78", + X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"30",X"30",X"30",X"10",X"00",X"00",X"00",X"00", + X"F0",X"F7",X"F7",X"F3",X"F0",X"70",X"00",X"00",X"78",X"F0",X"F8",X"F8",X"F0",X"E0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10", + X"00",X"00",X"00",X"30",X"F0",X"F3",X"F7",X"F3",X"00",X"00",X"00",X"C0",X"F0",X"F0",X"F0",X"F0", + X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"F3",X"F7",X"F3",X"F0",X"30",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"70",X"F3",X"F3",X"00",X"00",X"00",X"00",X"C0",X"E0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F3",X"F3",X"70",X"30",X"00",X"00",X"00",X"00",X"F0",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"71",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"71",X"70",X"30",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"03",X"8F",X"0E",X"2E",X"3F",X"7F",X"00",X"00",X"00",X"22",X"00",X"00",X"22",X"00", + X"89",X"01",X"30",X"62",X"E2",X"F1",X"F0",X"70",X"00",X"08",X"F1",X"75",X"74",X"E9",X"C3",X"87", + X"F7",X"F7",X"F3",X"F3",X"F1",X"E0",X"00",X"0C",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"30",X"10",X"10",X"30",X"10",X"01",X"00",X"C3",X"F0",X"F0",X"F0",X"F0",X"F0",X"0C",X"07", + X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"33",X"77",X"77",X"FF", + X"00",X"88",X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"77",X"77",X"33",X"33",X"33",X"11", + X"00",X"01",X"01",X"30",X"71",X"62",X"E2",X"F1",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F1",X"E2",X"62",X"71",X"30",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"0F",X"E1",X"F8",X"F8",X"BD",X"3D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"70",X"F3",X"C4",X"C4",X"F3", + X"3D",X"3D",X"BD",X"F8",X"F8",X"E1",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"F0",X"F3",X"C4",X"C4",X"F3",X"70",X"00",X"00", + X"00",X"04",X"04",X"06",X"07",X"08",X"88",X"88",X"30",X"70",X"F3",X"F3",X"F1",X"F0",X"F0",X"F0", + X"81",X"C3",X"21",X"30",X"FC",X"E1",X"C3",X"C3",X"00",X"01",X"03",X"8E",X"0E",X"3F",X"3F",X"7B", + X"88",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"70",X"70",X"30",X"10",X"00",X"00",X"00",X"00", + X"C3",X"F0",X"F0",X"F0",X"F0",X"30",X"00",X"00",X"F1",X"F0",X"F0",X"F0",X"F0",X"F0",X"70",X"30", + X"00",X"00",X"00",X"0E",X"03",X"CE",X"4E",X"6E",X"00",X"00",X"00",X"00",X"30",X"71",X"73",X"F1", + X"00",X"00",X"00",X"00",X"F0",X"FC",X"21",X"03",X"00",X"00",X"00",X"02",X"0C",X"F3",X"F7",X"F7", + X"6E",X"6E",X"EC",X"E0",X"E0",X"E0",X"C0",X"80",X"F0",X"F3",X"F3",X"F1",X"70",X"70",X"10",X"00", + X"C3",X"21",X"30",X"FC",X"E1",X"E1",X"F0",X"00",X"E7",X"C3",X"87",X"0F",X"1E",X"3C",X"F0",X"F0", + X"01",X"0F",X"0B",X"81",X"C8",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30", + X"0F",X"01",X"01",X"F0",X"90",X"98",X"EF",X"E1",X"08",X"08",X"78",X"F0",X"F1",X"7B",X"7B",X"7B", + X"CC",X"CC",X"CC",X"C8",X"81",X"0B",X"0F",X"01",X"30",X"30",X"10",X"10",X"00",X"00",X"00",X"00", + X"E7",X"98",X"98",X"F6",X"F0",X"01",X"01",X"0F",X"7B",X"7B",X"F3",X"F1",X"F0",X"78",X"08",X"08", + X"00",X"00",X"00",X"01",X"03",X"0F",X"01",X"00",X"00",X"00",X"00",X"30",X"71",X"73",X"F3",X"F1", + X"07",X"06",X"16",X"F0",X"FC",X"30",X"12",X"9E",X"0E",X"00",X"E0",X"F0",X"F6",X"FF",X"FF",X"FF", + X"00",X"01",X"0F",X"03",X"01",X"00",X"00",X"00",X"F0",X"F3",X"F3",X"71",X"30",X"00",X"00",X"00", + X"96",X"9E",X"12",X"30",X"F0",X"16",X"06",X"07",X"FF",X"FF",X"FF",X"F6",X"F0",X"E0",X"00",X"0E", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F", + X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5", + X"FF",X"7F",X"0F",X"0F",X"0F",X"87",X"C3",X"E1",X"F7",X"C3",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F1",X"F3",X"F7",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F3",X"F7", + X"97",X"87",X"C3",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"3F",X"F0",X"F1",X"F1",X"F3",X"F3",X"E1",X"E1",X"F0", + X"F0",X"F0",X"F0",X"F1",X"F1",X"F3",X"F7",X"FF",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"5F",X"5F",X"4F",X"4F",X"4F",X"4F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"7F",X"2F",X"0F",X"8F",X"FF",X"9F",X"8F",X"CF",X"CF",X"CF",X"DF",X"5F", + X"5F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"5F",X"5F",X"5F",X"5F",X"5F",X"7F",X"7F",X"7F", + X"FF",X"FF",X"FF",X"7F",X"7F",X"2F",X"0F",X"0F",X"B5",X"A5",X"A5",X"A5",X"87",X"0F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"0F",X"8F",X"CF",X"EF",X"FF",X"FF",X"FF",X"FF",X"E7",X"F7",X"B7",X"B7",X"B5", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F1",X"F1",X"F3",X"F3",X"F7",X"F7",X"F7", + X"F1",X"F1",X"F1",X"F3",X"F3",X"F7",X"F7",X"FF",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F1",X"F1",X"F3",X"C3",X"E1",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"B7",X"B7",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F",X"0F",X"0F",X"87",X"C3",X"E1",X"E1",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"0F",X"0F",X"FF",X"FF",X"FF",X"3F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"8F",X"CF",X"CF",X"EF",X"FF",X"FF",X"E1",X"F3",X"F3",X"F3",X"F7",X"F7",X"FF",X"FF", + X"8F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"CF",X"CF",X"2F",X"0F",X"0F",X"87",X"87",X"C3", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"3F",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"EF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"EF",X"FF",X"FF",X"FF",X"FF",X"F7",X"F7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F7",X"F7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F3", + X"F1",X"F1",X"F3",X"F3",X"F7",X"F7",X"F7",X"F7",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C3",X"C3",X"E1",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F7",X"FF",X"FF",X"FF",X"1F",X"0F",X"87",X"87",X"F0",X"F0",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0", + X"F1",X"F1",X"F1",X"F3",X"F3",X"F3",X"F7",X"F7",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"B4",X"B4",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"0F",X"87",X"87",X"C3",X"C3",X"E1",X"F0",X"F0",X"B4",X"B4",X"B4",X"B4",X"B4",X"B4",X"B4",X"B4", + X"8F",X"8F",X"EF",X"AF",X"1F",X"0F",X"0F",X"0F",X"3F",X"1F",X"1F",X"0F",X"87",X"87",X"87",X"A5", + X"7F",X"7F",X"1F",X"8F",X"CF",X"EF",X"FF",X"FF",X"AF",X"CF",X"EF",X"FF",X"FF",X"FF",X"7F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"1F",X"3F",X"3F",X"7F",X"7F",X"FF",X"FF", + X"1F",X"1F",X"9F",X"DF",X"FF",X"FF",X"FF",X"FF",X"8F",X"8F",X"CF",X"CF",X"EF",X"FF",X"FF",X"6F", + X"FF",X"9F",X"1F",X"9F",X"DF",X"5F",X"3F",X"3F",X"3F",X"FF",X"FF",X"3F",X"0F",X"0F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"CF",X"CF",X"8F",X"8F",X"0F", + X"CF",X"EF",X"EF",X"7F",X"7F",X"3F",X"1F",X"FF",X"DF",X"CF",X"EF",X"EF",X"EF",X"EF",X"EF",X"CF", + X"FF",X"7F",X"7F",X"3F",X"3F",X"1F",X"9F",X"8F",X"87",X"C7",X"E7",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"7F",X"3F",X"3F",X"1F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F1",X"F3",X"F3",X"F3",X"F7",X"F7",X"F7",X"FF", + X"7F",X"7F",X"3F",X"3F",X"3F",X"FF",X"FF",X"FF",X"0F",X"0F",X"8F",X"CF",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"7F",X"3F",X"1F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"9F",X"DF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CF",X"CF",X"EF",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"7F", + X"AF",X"EF",X"EF",X"6F",X"6F",X"2F",X"8F",X"8F",X"9F",X"8F",X"CF",X"CF",X"EF",X"FF",X"FF",X"FF", + X"CF",X"CF",X"EF",X"EF",X"6F",X"6F",X"2F",X"2F",X"1F",X"1F",X"0F",X"0F",X"0F",X"0F",X"0F",X"2F", + X"FF",X"FF",X"7F",X"BF",X"9F",X"4F",X"0F",X"0F",X"7F",X"3F",X"1F",X"1F",X"0F",X"0F",X"2F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"9F",X"BF",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"BF",X"3F",X"7F",X"7F",X"FF",X"EF",X"EF",X"EF",X"EF",X"EF",X"EF",X"EF",X"CF", + X"FF",X"BF",X"BF",X"3F",X"3F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"D3",X"F1",X"F3",X"F3",X"F7",X"FF",X"FF",X"FF", + X"3F",X"3F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"87",X"C3", + X"7F",X"3F",X"BF",X"BF",X"BF",X"BF",X"3F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"1F",X"1F",X"8F",X"8F",X"CF",X"EF",X"EF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"3F",X"5F",X"7F",X"3F",X"1F",X"1F",X"0F",X"1F", + X"3F",X"BF",X"FF",X"7F",X"7F",X"FF",X"FF",X"FF",X"9F",X"CF",X"6F",X"6F",X"3F",X"BF",X"7F",X"7F", + X"FF",X"FF",X"FF",X"FF",X"7F",X"9F",X"FF",X"7F",X"FF",X"FF",X"FF",X"3F",X"0F",X"1F",X"0F",X"8F", + X"BF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"DF",X"DF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"0F",X"0F",X"0F",X"0F",X"0F",X"8F",X"8F", + X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"2F",X"2F",X"2F",X"2F",X"2F",X"2F",X"2F",X"2F", + X"0F",X"1F",X"1F",X"3F",X"3F",X"3F",X"7F",X"7F",X"2F",X"2F",X"2F",X"2F",X"2F",X"2F",X"2F",X"2F", + X"CF",X"8F",X"8F",X"8F",X"0F",X"0F",X"0F",X"0F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"EF",X"EF",X"CF",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"DF",X"DF",X"DF",X"DF",X"DF",X"DF",X"DF",X"DF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"9F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"CF",X"CF",X"CF",X"EF",X"EF",X"EF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"3F",X"3F",X"1F",X"0F",X"0F",X"0F",X"0F",X"8F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"3F", + X"8F",X"8F",X"9F",X"9F",X"9F",X"BF",X"BF",X"BF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CF",X"CF",X"CF",X"CF",X"8F",X"8F",X"8F",X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"DF",X"DF",X"DF",X"DF",X"CF",X"CF",X"CF",X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EF",X"EF",X"EF",X"EF",X"EF",X"EF",X"EF",X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EF",X"EF",X"7F",X"7F",X"3F",X"3F",X"1F",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CF",X"CF",X"CF",X"CF",X"EF",X"EF",X"EF",X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"8F",X"9F",X"FF",X"FF", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"2F",X"2F",X"2F",X"2F",X"0F",X"0F",X"0F",X"0F", + X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"6F",X"6F", + X"BF",X"BF",X"BF",X"BF",X"BF",X"BF",X"BF",X"BF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"8F",X"8F",X"8F",X"8F",X"AF",X"AF",X"AF",X"AF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"DF",X"DF",X"CF",X"EF",X"EF",X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3F",X"3F",X"3F",X"1F",X"9F",X"9F",X"9F",X"9F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F",X"3F",X"CF",X"CF",X"CF",X"CF",X"EF",X"EF",X"EF",X"EF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"1F",X"1F",X"1F",X"1F",X"8F",X"8F",X"8F",X"8F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F", + X"BF",X"BF",X"BF",X"9F",X"DF",X"DF",X"DF",X"DF",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F", + X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"3F",X"2F",X"2F",X"2F",X"2F",X"3F",X"3F",X"3F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"EF",X"9F",X"FF",X"9F",X"DF",X"CF",X"EF",X"FF",X"FF",X"FF",X"FF", + X"CF",X"CF",X"CF",X"CF",X"EF",X"EF",X"EF",X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"8F",X"8F",X"8F",X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"BF",X"BF",X"BF",X"BF",X"BF",X"BF",X"BF",X"BF", + X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF", + X"3D",X"3D",X"3F",X"3F",X"3F",X"3F",X"7F",X"7F",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF", + X"1E",X"1E",X"1E",X"1E",X"3C",X"3C",X"3D",X"3D",X"FF",X"FF",X"FF",X"FF",X"EF",X"EF",X"EF",X"EF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"EF",X"EF",X"EF",X"EF",X"EF",X"EF",X"EF",X"EF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF", + X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF", + X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F", + X"3D",X"3D",X"3D",X"3D",X"3D",X"3D",X"3D",X"3D",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"EF",X"CF",X"8F",X"8F",X"0F",X"0F",X"0F",X"0F", + X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"CF",X"CF",X"CF",X"CF",X"EF",X"EF",X"EF",X"EF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EF",X"EF",X"EF",X"EF",X"CF",X"CF",X"CF",X"CF", + X"0F",X"0F",X"0F",X"0F",X"8F",X"8F",X"CF",X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"F0",X"F0",X"F0",X"1E",X"1E",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"CF",X"EF",X"EF",X"EF", + X"F7",X"F7",X"F3",X"F3",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"F7",X"F3",X"F3",X"F1",X"F1",X"F0",X"F0", + X"0F",X"0F",X"0F",X"8F",X"CF",X"CF",X"EF",X"EF",X"0F",X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"F0",X"F0",X"F0",X"3C",X"1E",X"1E",X"0F",X"3C",X"1E",X"1E",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"78",X"78",X"3C",X"3C", + X"F7",X"F7",X"F7",X"F7",X"F3",X"F3",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"F7",X"F7",X"F1",X"F1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"F7",X"F7",X"F7",X"F3",X"F3",X"F3",X"F3", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"8F",X"EF",X"0F",X"8F",X"8F",X"CF",X"CF",X"EF",X"FF",X"FF", + X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"3C",X"3C",X"78",X"3C",X"1E",X"0F",X"0F",X"0F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EF",X"FF",X"FF",X"F7",X"F7",X"F7",X"F3",X"F1",X"F0", + X"0F",X"0F",X"0F",X"0F",X"8F",X"CF",X"EF",X"EF",X"EF",X"EF",X"EF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"8F",X"8F",X"CF",X"CF",X"EF",X"EF",X"FF",X"FF", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"3C",X"F0",X"F0",X"78",X"78",X"3C",X"1E",X"0F",X"0F", + X"0F",X"0F",X"0F",X"1E",X"1E",X"1E",X"3C",X"78",X"8F",X"8F",X"8F",X"8F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"CF",X"CF",X"CF",X"CF",X"8F",X"8F",X"8F",X"8F", + X"8F",X"8F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"EF",X"EF",X"EF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"8F",X"8F",X"EF",X"EF",X"EF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"EF",X"EF",X"EF",X"EF", + X"8F",X"8F",X"8F",X"9F",X"9F",X"DF",X"DF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"CF",X"CF",X"CF",X"EF",X"EF",X"EF",X"FF",X"FF", + X"78",X"78",X"3C",X"3C",X"1E",X"1E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"8F",X"8F",X"8F",X"8F", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"3C",X"3C",X"1E",X"1E", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"3C",X"3C",X"3C",X"3C",X"78",X"78",X"78",X"78", + X"78",X"78",X"78",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1E",X"1E", + X"3C",X"3C",X"3C",X"3C",X"78",X"78",X"78",X"78",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"78",X"78",X"78",X"78",X"3C",X"3C",X"3C",X"3C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"1E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"3F",X"7F",X"7F",X"7F",X"FF",X"FF", + X"F0",X"C7",X"C7",X"E7",X"EF",X"FF",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"79",X"79", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"9F",X"9F",X"DF",X"DF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1",X"F1", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F1",X"F1",X"F3",X"F3",X"F3",X"F3",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"F3",X"F3",X"F7",X"F7",X"F7",X"FF",X"FF", + X"F7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F3", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F3",X"F7",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"0F",X"8F",X"CF",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"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"8F",X"EF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EF",X"EF",X"EF",X"EF",X"EF",X"EF",X"EF",X"EF", + X"7F",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"8F",X"8F",X"8F",X"8F",X"8F",X"CF",X"CF",X"CF", + X"F3",X"F3",X"F3",X"7B",X"3F",X"7F",X"7F",X"7F",X"1E",X"1E",X"0F",X"0F",X"0F",X"0F",X"0F",X"8F", + X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F3",X"F3",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"3C",X"3C", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"F3",X"F3",X"F3",X"F7",X"F7",X"F7",X"F7", + X"F7",X"F7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"F1",X"F1",X"F1",X"F1", + X"F1",X"F1",X"F3",X"F3",X"F3",X"F7",X"F7",X"F7",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F1",X"F3",X"F7",X"F7",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"F3", + X"FF",X"FF",X"FF",X"F7",X"F3",X"F3",X"F1",X"F1",X"F7",X"F3",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"F7",X"F7",X"F7",X"F7",X"F3",X"F3",X"F7", + X"0F",X"0F",X"0F",X"0F",X"0F",X"2D",X"A5",X"A5",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"2D", + X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"4F",X"0F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"4F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"5F",X"5F",X"5F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"5F",X"5F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"5F",X"5F",X"5F",X"0F",X"0F",X"0F",X"0F",X"0F",X"5F",X"5F",X"5F", + X"A5",X"A5",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"A5",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"B4",X"B4",X"F0",X"F0",X"B4",X"B4",X"A5",X"A5",X"A5",X"A5", + X"0F",X"2D",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"0F",X"0F",X"0F",X"2D",X"A5",X"A5",X"A5",X"A5", + X"5F",X"5F",X"5F",X"5F",X"4F",X"0F",X"0F",X"0F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"0F",X"0F", + X"FF",X"DF",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"FF",X"FF",X"FF",X"DF",X"5F",X"5F",X"5F",X"5F", + X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"7F",X"FF",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F", + X"A5",X"A5",X"A5",X"0F",X"0F",X"0F",X"0F",X"0F",X"A5",X"A5",X"2D",X"0F",X"0F",X"0F",X"0F",X"0F", + X"5F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"5F",X"5F",X"4F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"DF",X"5F",X"5F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"DF", + X"5F",X"5F",X"5F",X"5F",X"FF",X"FF",X"FF",X"FF",X"5F",X"5F",X"5F",X"5F",X"5F",X"7F",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"5F",X"5F",X"5F",X"5F",X"0F",X"0F",X"0F",X"0F",X"0F",X"5F",X"5F",X"5F", + X"A5",X"A5",X"A5",X"0F",X"0F",X"0F",X"0F",X"0F",X"A5",X"A5",X"A5",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"B4",X"A5",X"A5",X"A5",X"A5",X"F0",X"B4",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5", + X"A5",X"A5",X"A5",X"A5",X"A5",X"B4",X"F0",X"F0",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"B4", + X"5F",X"4F",X"4F",X"0F",X"0F",X"0F",X"0F",X"0F",X"5F",X"5F",X"5F",X"5F",X"5F",X"4F",X"4F",X"0F", + X"5F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"5F",X"5F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"1F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"0F",X"0F",X"0F",X"1F",X"5F",X"5F",X"5F",X"5F", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"B4",X"F0",X"F0",X"F0",X"F0",X"F0",X"B4",X"A5",X"A5", + X"A5",X"B4",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"A5",X"A5",X"A5",X"B4",X"F0",X"F0",X"F0",X"F0", + X"0F",X"0F",X"2D",X"2D",X"A5",X"A5",X"A5",X"A5",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"2D",X"2D", + X"FF",X"FF",X"DF",X"DF",X"5F",X"5F",X"5F",X"5F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"DF",X"DF", + X"5F",X"5F",X"5F",X"5F",X"5F",X"7F",X"FF",X"FF",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"7F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"5F",X"5F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F", + X"F0",X"F0",X"F0",X"A5",X"A5",X"A5",X"A5",X"A5",X"F0",X"B4",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5", + X"A5",X"B4",X"B4",X"F0",X"F0",X"F0",X"F0",X"F0",X"A5",X"A5",X"A5",X"A5",X"A5",X"B4",X"B4",X"F0", + X"2D",X"2D",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"0F",X"0F",X"0F",X"0F",X"0F",X"2D",X"2D",X"2D", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"2D",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"5F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"5F",X"5F",X"5F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"A5",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"A5",X"A5",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"A5",X"A5",X"A5",X"A5",X"A5",X"F0",X"F0",X"F0",X"A5",X"A5",X"A5",X"A5",X"A5", + X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"0F",X"2D",X"2D",X"2D",X"A5",X"A5",X"A5",X"A5", + X"0F",X"0F",X"0F",X"2D",X"2D",X"2D",X"A5",X"A5",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"5F",X"5F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"7F",X"7F", + X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"0F",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"A5",X"A5",X"B4",X"B4",X"B4",X"B4",X"F0",X"F0", + X"B4",X"B4",X"B4",X"B4",X"B4",X"B4",X"F0",X"F0",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5", + X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"0F",X"0F",X"0F",X"0F",X"2D",X"2D",X"2D",X"2D", + X"0F",X"0F",X"0F",X"0F",X"2D",X"2D",X"2D",X"2D",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"5F",X"5F",X"4F",X"4F",X"4F",X"4F",X"0F",X"0F", + X"5F",X"5F",X"4F",X"4F",X"4F",X"4F",X"0F",X"0F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F", + X"A5",X"A5",X"A5",X"A5",X"A5",X"0F",X"0F",X"0F",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"0F",X"0F", + X"DF",X"DF",X"5F",X"5F",X"5F",X"5F",X"5F",X"5F",X"FF",X"FF",X"FF",X"FF",X"FF",X"DF",X"DF",X"DF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"DF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"A5",X"A5",X"A5",X"0F",X"0F",X"0F",X"0F",X"0F",X"A5",X"A5",X"A5",X"A5",X"0F",X"0F",X"0F",X"0F", + X"F0",X"E1",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"F0",X"F0",X"E1",X"A5",X"A5",X"A5",X"A5",X"A5", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"B4",X"B4",X"B4",X"B4",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"A5",X"A5",X"A5",X"A5",X"B4",X"B4",X"B4",X"B4", + X"B4",X"B4",X"B4",X"B4",X"F0",X"F0",X"F0",X"F0",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5", + X"A5",X"A5",X"A5",X"A5",X"B4",X"B4",X"B4",X"B4",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5", + X"5F",X"5F",X"4F",X"4F",X"4F",X"4F",X"0F",X"0F",X"FF",X"DF",X"DF",X"DF",X"5F",X"5F",X"5F",X"5F", + X"FF",X"FF",X"FF",X"FF",X"DF",X"DF",X"DF",X"5F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"A5",X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"87",X"E1",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"A5",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"A5",X"A5",X"A5",X"A5",X"B4",X"B4",X"B4",X"B4",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D",X"2D", + X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"A5",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0F",X"5F",X"5F",X"5F",X"5F",X"5F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"1F",X"5F", + X"CF",X"CF",X"CF",X"CF",X"8F",X"8F",X"8F",X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"80",X"C2",X"C2",X"C2",X"C0",X"C0",X"00",X"00",X"00",X"30",X"60",X"40",X"D1",X"F1", + X"00",X"01",X"12",X"F0",X"30",X"30",X"9A",X"9E",X"0C",X"08",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"87",X"87",X"87",X"87",X"86",X"00",X"00",X"F0",X"E0",X"D1",X"51",X"60",X"30",X"00",X"00", + X"96",X"16",X"9A",X"B8",X"30",X"F0",X"03",X"01",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0C", + X"00",X"00",X"86",X"87",X"87",X"87",X"87",X"C0",X"00",X"00",X"30",X"60",X"51",X"D1",X"E0",X"F0", + X"07",X"01",X"F0",X"30",X"B8",X"9A",X"16",X"96",X"08",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"C0",X"C2",X"C2",X"C2",X"80",X"00",X"00",X"F1",X"D1",X"40",X"60",X"30",X"00",X"00",X"00", + X"9E",X"9A",X"30",X"30",X"F0",X"10",X"03",X"06",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"08",X"00", + X"00",X"00",X"00",X"00",X"84",X"84",X"84",X"80",X"00",X"00",X"00",X"10",X"30",X"20",X"60",X"70", + X"00",X"00",X"01",X"F0",X"30",X"10",X"DC",X"DE",X"00",X"0C",X"08",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"0E",X"0E",X"0E",X"0C",X"00",X"00",X"00",X"70",X"70",X"60",X"20",X"30",X"10",X"00",X"00", + X"96",X"16",X"DE",X"DC",X"30",X"F0",X"01",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"08",X"0C", + X"00",X"00",X"00",X"0C",X"0E",X"0E",X"0E",X"80",X"00",X"00",X"10",X"30",X"20",X"60",X"70",X"70", + X"07",X"01",X"F0",X"30",X"DC",X"DE",X"16",X"96",X"00",X"08",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"84",X"84",X"84",X"00",X"00",X"00",X"00",X"70",X"60",X"20",X"30",X"10",X"00",X"00",X"00", + X"DE",X"DC",X"10",X"30",X"F0",X"03",X"06",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"84",X"84",X"84",X"80",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30", + X"00",X"00",X"01",X"12",X"F0",X"90",X"76",X"45",X"00",X"00",X"0C",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"30",X"30",X"30",X"10",X"00",X"00",X"00",X"00", + X"C3",X"45",X"76",X"90",X"F0",X"12",X"01",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0C",X"00", + X"00",X"00",X"00",X"0C",X"0C",X"0C",X"0C",X"80",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30", + X"00",X"07",X"12",X"F0",X"90",X"76",X"45",X"C3",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"84",X"84",X"84",X"00",X"00",X"00",X"00",X"30",X"30",X"10",X"00",X"00",X"00",X"00",X"00", + X"45",X"76",X"90",X"F0",X"12",X"07",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10", + X"00",X"00",X"00",X"00",X"01",X"F0",X"90",X"A3",X"00",X"00",X"00",X"08",X"00",X"F0",X"F0",X"F0", + X"00",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00", + X"E1",X"A3",X"90",X"F0",X"01",X"00",X"00",X"00",X"F0",X"E1",X"E1",X"E1",X"00",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"00",X"02",X"01",X"F0",X"90",X"A3",X"E1",X"00",X"00",X"00",X"00",X"E1",X"E1",X"E1",X"F0", + X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"A3",X"90",X"F0",X"01",X"02",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"70",X"F0",X"00",X"00",X"00",X"00",X"08",X"00",X"E1",X"E1", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"A0",X"70",X"01",X"00",X"00",X"00",X"00",X"E0",X"C3",X"C3",X"00",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"02",X"01",X"70",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"C3",X"C3",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"A0",X"70",X"01",X"02",X"00",X"00",X"00",X"00",X"E1",X"E1",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"00",X"00",X"00",X"00",X"00",X"08",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"C2",X"C2",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"30",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"C2",X"C2", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"30",X"01",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"84",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"84", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"C2",X"C2",X"C2",X"C0",X"C0",X"00",X"00",X"00",X"30",X"70",X"70",X"F0",X"F0", + X"00",X"01",X"12",X"F0",X"F0",X"F0",X"F0",X"F0",X"0C",X"08",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"87",X"87",X"87",X"87",X"87",X"00",X"00",X"F0",X"D0",X"C0",X"60",X"70",X"30",X"00",X"00", + X"F0",X"F0",X"80",X"90",X"F0",X"F0",X"03",X"01",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0C", + X"00",X"00",X"87",X"87",X"87",X"87",X"87",X"C0",X"00",X"00",X"30",X"70",X"70",X"F0",X"F0",X"F0", + X"07",X"01",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"08",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"C0",X"C2",X"C2",X"C2",X"80",X"00",X"00",X"D0",X"C0",X"60",X"70",X"30",X"00",X"00",X"00", + X"F0",X"90",X"80",X"F0",X"F0",X"10",X"03",X"06",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"08",X"00", + X"00",X"00",X"00",X"00",X"84",X"84",X"84",X"80",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70", + X"00",X"00",X"01",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"0C",X"08",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"0E",X"0E",X"0E",X"0E",X"00",X"00",X"00",X"70",X"60",X"60",X"30",X"30",X"10",X"00",X"00", + X"F0",X"F0",X"40",X"40",X"F0",X"F0",X"01",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"08",X"0C", + X"00",X"00",X"00",X"0E",X"0E",X"0E",X"0E",X"80",X"00",X"00",X"10",X"30",X"30",X"70",X"70",X"70", + X"07",X"01",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"08",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"84",X"84",X"84",X"00",X"00",X"00",X"00",X"60",X"60",X"30",X"30",X"10",X"00",X"00",X"00", + X"F0",X"40",X"40",X"F0",X"F0",X"03",X"06",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"84",X"84",X"84",X"80",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30", + X"00",X"00",X"01",X"12",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"0C",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"30",X"30",X"30",X"10",X"00",X"00",X"00",X"00", + X"70",X"40",X"C0",X"F0",X"F0",X"12",X"01",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0C",X"00", + X"00",X"00",X"00",X"0C",X"0C",X"0C",X"0C",X"80",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30", + X"00",X"07",X"12",X"F0",X"F0",X"F0",X"F0",X"70",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"84",X"84",X"84",X"00",X"00",X"00",X"00",X"30",X"30",X"10",X"00",X"00",X"00",X"00",X"00", + X"40",X"C0",X"F0",X"F0",X"12",X"07",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10", + X"00",X"00",X"00",X"00",X"01",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"08",X"00",X"F0",X"F0",X"F0", + X"00",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00", + X"F0",X"50",X"C0",X"F0",X"01",X"00",X"00",X"00",X"F0",X"E1",X"E1",X"E1",X"00",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"00",X"02",X"01",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"E1",X"E1",X"E1",X"F0", + X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"50",X"C0",X"F0",X"01",X"02",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00", + X"0C",X"07",X"0B",X"81",X"48",X"0C",X"0E",X"C0",X"00",X"00",X"10",X"30",X"30",X"70",X"70",X"70", + X"00",X"00",X"F0",X"C3",X"87",X"0F",X"F0",X"F0",X"01",X"E0",X"F0",X"1E",X"0F",X"0F",X"C3",X"F0", + X"C0",X"C0",X"84",X"83",X"03",X"06",X"0C",X"00",X"70",X"60",X"20",X"30",X"10",X"00",X"00",X"00", + X"30",X"10",X"DC",X"DC",X"F0",X"06",X"06",X"02",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00", + X"00",X"00",X"0C",X"08",X"81",X"83",X"87",X"83",X"00",X"00",X"30",X"70",X"70",X"E1",X"F0",X"F0", + X"00",X"00",X"F0",X"C3",X"0F",X"0F",X"3C",X"F0",X"00",X"70",X"87",X"0F",X"0F",X"78",X"F0",X"F0", + X"83",X"83",X"81",X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"51",X"71",X"30",X"00",X"00",X"00", + X"70",X"30",X"B8",X"B8",X"F0",X"0C",X"0C",X"08",X"F0",X"F0",X"F0",X"F0",X"E0",X"00",X"00",X"00", + X"00",X"08",X"06",X"0A",X"80",X"08",X"0C",X"80",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30", + X"00",X"00",X"00",X"F0",X"C3",X"87",X"F0",X"F0",X"00",X"01",X"E0",X"F0",X"1E",X"0F",X"87",X"F0", + X"80",X"80",X"08",X"06",X"0C",X"08",X"00",X"00",X"30",X"30",X"10",X"00",X"00",X"00",X"00",X"00", + X"90",X"76",X"76",X"F0",X"06",X"02",X"00",X"00",X"F0",X"F0",X"F0",X"E0",X"00",X"01",X"00",X"00", + X"00",X"00",X"00",X"08",X"02",X"06",X"0E",X"06",X"00",X"00",X"00",X"10",X"30",X"70",X"70",X"70", + X"00",X"00",X"00",X"F0",X"C3",X"0F",X"1E",X"F0",X"00",X"00",X"E0",X"0F",X"0F",X"3C",X"F0",X"F0", + X"06",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"60",X"20",X"10",X"00",X"00",X"00",X"00", + X"30",X"FC",X"FC",X"F0",X"0C",X"08",X"00",X"00",X"F0",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"04",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"00",X"00",X"00",X"F0",X"C3",X"87",X"F0",X"00",X"00",X"03",X"C0",X"E1",X"1E",X"0F",X"F0", + X"00",X"00",X"0C",X"0C",X"08",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"90",X"D4",X"F0",X"06",X"02",X"00",X"00",X"00",X"F0",X"F0",X"E0",X"00",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0C",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30", + X"00",X"00",X"00",X"00",X"F0",X"87",X"0F",X"F0",X"00",X"00",X"00",X"C0",X"0F",X"2C",X"E0",X"E1", + X"0C",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"30",X"10",X"00",X"00",X"00",X"00",X"00", + X"30",X"B8",X"F0",X"0C",X"08",X"00",X"00",X"00",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"70",X"E1",X"C3",X"F0",X"00",X"00",X"00",X"C3",X"E1",X"1E",X"0F",X"F0", + X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"E2",X"70",X"02",X"01",X"00",X"00",X"00",X"F0",X"F0",X"E1",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"00",X"00",X"00",X"F0",X"C3",X"87",X"F0",X"00",X"00",X"00",X"C0",X"0E",X"2C",X"E0",X"E1", + X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"90",X"D4",X"F0",X"04",X"04",X"00",X"00",X"00",X"E1",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"00",X"00",X"10",X"30",X"60",X"60",X"F0",X"F0", + X"00",X"70",X"F0",X"10",X"00",X"66",X"76",X"C3",X"00",X"C0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"F0",X"F0",X"60",X"60",X"30",X"10",X"00",X"00", + X"C3",X"76",X"66",X"00",X"10",X"F0",X"70",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"C0",X"00", + X"C0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"30",X"60",X"C0",X"C0",X"D1",X"D1",X"F0",X"F0",X"F0",X"70",X"70",X"70",X"F8",X"F8",X"3C", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00", + X"F0",X"D1",X"D1",X"C0",X"C0",X"60",X"30",X"00",X"3C",X"F8",X"F8",X"70",X"70",X"70",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"10",X"30",X"20",X"70",X"70", + X"00",X"00",X"70",X"F0",X"10",X"66",X"76",X"C3",X"00",X"00",X"C0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"70",X"70",X"20",X"30",X"10",X"00",X"00",X"00", + X"C3",X"76",X"66",X"10",X"F0",X"70",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"C0",X"00",X"00", + X"00",X"80",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"30",X"60",X"40",X"D1",X"D1",X"F0",X"00",X"F0",X"F0",X"70",X"70",X"F8",X"F8",X"3C", + X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"D1",X"D1",X"40",X"60",X"30",X"00",X"00",X"3C",X"F8",X"F8",X"70",X"70",X"F0",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"30", + X"00",X"00",X"00",X"70",X"90",X"76",X"54",X"C3",X"00",X"00",X"00",X"C0",X"E0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"30",X"10",X"10",X"00",X"00",X"00",X"00", + X"C3",X"54",X"76",X"90",X"70",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"E0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"30",X"20",X"51",X"51",X"70",X"00",X"00",X"F0",X"F0",X"70",X"F8",X"70",X"3C", + X"C0",X"C0",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"51",X"51",X"20",X"30",X"00",X"00",X"00",X"3C",X"70",X"F8",X"70",X"F0",X"F0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10", + X"00",X"00",X"00",X"00",X"70",X"B0",X"54",X"D2",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"D2",X"54",X"B0",X"70",X"00",X"00",X"00",X"00",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"20",X"20",X"30",X"00",X"00",X"00",X"F0",X"F0",X"70",X"F8",X"B4", + X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"20",X"20",X"10",X"00",X"00",X"00",X"00",X"B4",X"F8",X"70",X"F0",X"F0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"70",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"B0",X"D0",X"70",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"E0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"70",X"70",X"F0",X"E0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"60",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"00",X"00",X"10",X"30",X"70",X"70",X"F0",X"F0", + X"00",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"C0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"D0",X"C0",X"60",X"70",X"30",X"10",X"00",X"00", + X"F0",X"F0",X"80",X"80",X"F0",X"F0",X"70",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"C0",X"00", + X"C0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"30",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00", + X"F0",X"B0",X"90",X"90",X"D0",X"70",X"30",X"00",X"F0",X"F0",X"F0",X"10",X"10",X"30",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70", + X"00",X"00",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"C0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"30",X"30",X"10",X"00",X"00",X"00", + X"F0",X"40",X"40",X"F0",X"F0",X"70",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"C0",X"00",X"00", + X"00",X"80",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"30",X"70",X"70",X"F0",X"F0",X"F0",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"E0",X"E0",X"E0",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"D0",X"C0",X"40",X"60",X"30",X"00",X"00",X"F0",X"F0",X"90",X"90",X"90",X"F0",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"30", + X"00",X"00",X"00",X"70",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"C0",X"E0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"30",X"10",X"10",X"00",X"00",X"00",X"00", + X"70",X"40",X"D0",X"F0",X"70",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"E0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"30",X"30",X"70",X"70",X"70",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"C0",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"60",X"60",X"30",X"30",X"00",X"00",X"00",X"F0",X"F0",X"90",X"90",X"F0",X"F0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10", + X"00",X"00",X"00",X"00",X"70",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"C0",X"F0",X"70",X"00",X"00",X"00",X"00",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"30",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"20",X"30",X"10",X"00",X"00",X"00",X"00",X"F0",X"B0",X"90",X"F0",X"F0",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"30",X"70",X"70",X"F0",X"F0", + X"00",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"C0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"F0",X"60",X"60",X"30",X"10",X"00",X"00",X"00", + X"10",X"00",X"66",X"76",X"F0",X"16",X"02",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"C0",X"00",X"00", + X"C0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10", + X"00",X"30",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"C0",X"F3",X"F3",X"60",X"10",X"00",X"00",X"70",X"30",X"30",X"30",X"70",X"F0",X"3C",X"08", + X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70", + X"00",X"00",X"70",X"F0",X"F0",X"F0",X"F0",X"90",X"00",X"00",X"C0",X"E0",X"F0",X"F0",X"F0",X"F0", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"30",X"30",X"10",X"00",X"00",X"00",X"00", + X"00",X"66",X"F6",X"F0",X"16",X"02",X"00",X"00",X"F0",X"F0",X"F0",X"E0",X"80",X"00",X"00",X"00", + X"00",X"80",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"30",X"70",X"70",X"F0",X"F0",X"F0",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"70", + X"E0",X"E0",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"71",X"71",X"30",X"10",X"00",X"00",X"00",X"30",X"B8",X"B8",X"70",X"F0",X"3C",X"08",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"30", + X"00",X"00",X"00",X"70",X"F0",X"F0",X"F0",X"90",X"00",X"00",X"00",X"C0",X"E0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"54",X"D4",X"F0",X"16",X"02",X"00",X"00",X"00",X"F0",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"30",X"30",X"70",X"70",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"30",X"30",X"10",X"00",X"00",X"00",X"00",X"30",X"B8",X"B8",X"F0",X"3C",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10", + X"00",X"00",X"00",X"00",X"70",X"F0",X"F0",X"30",X"00",X"00",X"00",X"00",X"C0",X"E0",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"54",X"F0",X"34",X"04",X"00",X"00",X"00",X"00",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"30",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0", + X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"30",X"B8",X"F0",X"78",X"08",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..84f8d265 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"08",X"08",X"08",X"08",X"08",X"0F",X"0F",X"08",X"08",X"00",X"00",X"00",X"08",X"08",X"08",X"08", + X"0F",X"0F",X"0F",X"08",X"00",X"00",X"08",X"08",X"08",X"08",X"0F",X"0F",X"08",X"08",X"00",X"00", + X"07",X"09",X"0A",X"0B",X"07",X"0D",X"0D",X"07",X"0E",X"07",X"0D",X"0D",X"07",X"0B",X"0A",X"09", + X"07",X"05",X"07",X"03",X"07",X"01",X"07",X"00",X"07",X"00",X"07",X"01",X"07",X"03",X"07",X"05", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"08",X"08",X"00",X"08",X"08",X"0F",X"0F",X"00",X"00",X"08",X"08",X"08",X"0F",X"0F",X"0F", + X"00",X"08",X"08",X"00",X"0F",X"0F",X"08",X"08",X"08",X"08",X"0F",X"08",X"00",X"00",X"00",X"08", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0E",X"0C",X"09",X"0C",X"0E",X"0A",X"07",X"0C",X"0F",X"0D",X"08",X"0A",X"0B",X"07",X"02", + X"08",X"0D",X"09",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"07",X"08",X"0A",X"0C",X"0E",X"0D",X"0C",X"0C",X"0B",X"0A",X"08",X"07",X"05",X"06",X"07",X"08", + X"08",X"09",X"0A",X"0B",X"09",X"08",X"06",X"05",X"04",X"04",X"03",X"02",X"04",X"06",X"08",X"09", + X"0A",X"0C",X"0C",X"0A",X"07",X"07",X"08",X"0B",X"0D",X"0E",X"0D",X"0A",X"06",X"05",X"05",X"07", + X"09",X"09",X"08",X"04",X"01",X"00",X"01",X"03",X"06",X"07",X"07",X"04",X"02",X"02",X"04",X"07"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..4f86b49a --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,31 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(6 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 127) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B" + ); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..b9cfb224 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,86 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(9 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 1023) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"05",X"03",X"01",X"00",X"05",X"02",X"01",X"00",X"05",X"06",X"01", + X"00",X"05",X"07",X"01",X"00",X"05",X"0A",X"01",X"00",X"05",X"0B",X"01",X"00",X"05",X"0C",X"01", + X"00",X"05",X"0D",X"01",X"00",X"05",X"04",X"01",X"00",X"03",X"06",X"01",X"00",X"03",X"02",X"01", + X"00",X"03",X"07",X"01",X"00",X"03",X"05",X"01",X"00",X"02",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"08",X"03",X"01",X"00",X"09",X"02",X"05",X"00",X"08",X"05",X"0D",X"04",X"04",X"04",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"02",X"00",X"03",X"03",X"03", + X"00",X"06",X"06",X"06",X"00",X"07",X"07",X"07",X"00",X"0A",X"0A",X"0A",X"00",X"0B",X"0B",X"0B", + X"00",X"01",X"01",X"01",X"00",X"05",X"05",X"05",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"0D",X"00",X"0C",X"0F",X"0B",X"00",X"0C",X"0E",X"0B", + X"00",X"0C",X"06",X"0B",X"00",X"0C",X"07",X"0B",X"00",X"0C",X"03",X"0B",X"00",X"0C",X"08",X"0B", + X"00",X"0C",X"0D",X"0B",X"00",X"0C",X"04",X"0B",X"00",X"0C",X"09",X"0B",X"00",X"0C",X"05",X"0B", + X"00",X"0C",X"02",X"0B",X"00",X"0C",X"0B",X"02",X"00",X"08",X"0C",X"02",X"00",X"08",X"0F",X"02", + X"00",X"03",X"02",X"01",X"00",X"02",X"0F",X"03",X"00",X"0F",X"0E",X"02",X"00",X"0E",X"07",X"0F", + X"00",X"07",X"06",X"0E",X"00",X"06",X"05",X"07",X"00",X"05",X"00",X"06",X"00",X"00",X"0B",X"05", + X"00",X"0B",X"0C",X"00",X"00",X"0C",X"0D",X"0B",X"00",X"0D",X"08",X"0C",X"00",X"08",X"09",X"0D", + X"00",X"09",X"0A",X"08",X"00",X"0A",X"01",X"09",X"00",X"01",X"04",X"0A",X"00",X"04",X"03",X"01", + X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"0D",X"00",X"0C",X"0F",X"0B",X"00",X"0C",X"0E",X"0B", + X"00",X"0C",X"06",X"0B",X"00",X"0C",X"07",X"0B",X"00",X"0C",X"03",X"0B",X"00",X"0C",X"08",X"0B", + X"00",X"0C",X"0D",X"0B",X"00",X"0C",X"04",X"0B",X"00",X"0C",X"09",X"0B",X"00",X"0C",X"05",X"0B", + X"00",X"0C",X"02",X"0B",X"00",X"0C",X"0B",X"02",X"00",X"08",X"0C",X"02",X"00",X"08",X"0F",X"02", + X"00",X"03",X"02",X"01",X"00",X"02",X"0F",X"03",X"00",X"0F",X"0E",X"02",X"00",X"0E",X"07",X"0F", + X"00",X"07",X"06",X"0E",X"00",X"06",X"05",X"07",X"00",X"05",X"00",X"06",X"00",X"00",X"0B",X"05", + X"00",X"0B",X"0C",X"00",X"00",X"0C",X"0D",X"0B",X"00",X"0D",X"08",X"0C",X"00",X"08",X"09",X"0D", + X"00",X"09",X"0A",X"08",X"00",X"0A",X"01",X"09",X"00",X"01",X"04",X"0A",X"00",X"04",X"03",X"01", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"07", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"0D", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F", + X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"07", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00", + X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"0D"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..bc8de866 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"F6",X"07",X"38",X"C9",X"F8",X"3F",X"EF",X"6F",X"16",X"2F",X"7F",X"F0",X"36",X"DB",X"C6", + X"00",X"F6",X"D8",X"F0",X"F8",X"16",X"07",X"2F",X"36",X"3F",X"7F",X"28",X"32",X"38",X"EF",X"C6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..672efd2e --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"91",X"50",X"2F",X"4D",X"DE",X"81",X"A0",X"88",X"82",X"90",X"28",X"EB",X"FC",X"8B",X"88",X"A0", + X"B2",X"48",X"18",X"0F",X"00",X"08",X"2F",X"5E",X"07",X"08",X"A8",X"2F",X"77",X"61",X"CD",X"BB", + X"A0",X"C9",X"69",X"16",X"5F",X"D7",X"41",X"69",X"A0",X"88",X"A0",X"88",X"A0",X"88",X"A0",X"88", + X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"A8",X"71",X"DD",X"ED",X"D5",X"ED",X"A2",X"88", + X"28",X"CD",X"B2",X"8A",X"28",X"DD",X"27",X"92",X"D0",X"18",X"92",X"C8",X"B8",X"12",X"80",X"28", + X"07",X"08",X"2C",X"1D",X"32",X"80",X"88",X"1A",X"21",X"28",X"07",X"08",X"2C",X"1D",X"32",X"81", + X"28",X"12",X"5F",X"0F",X"07",X"EA",X"17",X"89",X"A2",X"82",X"28",X"83",X"82",X"82",X"28",X"6D", + X"94",X"92",X"CD",X"02",X"2A",X"65",X"CD",X"8A",X"CD",X"F7",X"2A",X"65",X"12",X"8B",X"CD",X"22", + X"A3",X"81",X"73",X"2C",X"94",X"16",X"15",X"1E",X"90",X"9C",X"96",X"88",X"83",X"94",X"B6",X"B3", + X"96",X"98",X"AB",X"9E",X"28",X"8B",X"34",X"3E",X"30",X"8C",X"36",X"88",X"23",X"9C",X"B6",X"88", + X"7D",X"81",X"C0",X"2C",X"6D",X"39",X"32",X"16",X"A1",X"7D",X"81",X"D0",X"2C",X"6D",X"39",X"BA", + X"B6",X"8B",X"DD",X"89",X"18",X"2C",X"CD",X"39",X"BA",X"1E",X"2A",X"75",X"21",X"08",X"8C",X"65", + X"39",X"BA",X"B6",X"8C",X"7D",X"81",X"88",X"2C",X"6D",X"39",X"32",X"81",X"80",X"2F",X"B2",X"34", + X"8C",X"AF",X"A0",X"8B",X"21",X"A0",X"8F",X"91",X"2E",X"2F",X"29",X"8D",X"28",X"6D",X"10",X"5E", + X"92",X"99",X"2F",X"81",X"90",X"2F",X"B2",X"35",X"2C",X"8F",X"A0",X"8B",X"81",X"B0",X"2F",X"B1", + X"AB",X"2F",X"29",X"8D",X"28",X"6D",X"10",X"5E",X"32",X"9A",X"8F",X"89",X"97",X"2C",X"CB",X"C6", + X"80",X"05",X"63",X"0E",X"89",X"08",X"2F",X"39",X"B0",X"38",X"09",X"18",X"A0",X"C5",X"B8",X"B2", + X"38",X"8F",X"CB",X"F7",X"A0",X"08",X"46",X"07",X"32",X"10",X"8F",X"32",X"2D",X"90",X"B2",X"11", + X"2F",X"CB",X"D7",X"A0",X"20",X"46",X"A7",X"32",X"B1",X"27",X"9A",X"02",X"B8",X"B2",X"B2",X"27", + X"CB",X"F7",X"A0",X"08",X"46",X"07",X"32",X"12",X"8F",X"32",X"AF",X"90",X"CD",X"94",X"29",X"51", + X"9A",X"0A",X"28",X"41",X"8A",X"08",X"28",X"D5",X"E9",X"DD",X"E9",X"D9",X"65",X"53",X"A1",X"CD", + X"F1",X"01",X"B6",X"01",X"32",X"40",X"18",X"A8",X"D3",X"C5",X"ED",X"B2",X"B9",X"88",X"07",X"48", + X"92",X"00",X"28",X"07",X"60",X"B6",X"A1",X"32",X"31",X"20",X"99",X"F8",X"2F",X"21",X"B8",X"0C", + X"45",X"B6",X"29",X"32",X"68",X"90",X"D3",X"C5",X"ED",X"B2",X"08",X"90",X"A7",X"CB",X"67",X"C8", + X"96",X"09",X"9A",X"F7",X"AF",X"31",X"D8",X"27",X"89",X"0B",X"B0",X"45",X"96",X"09",X"9A",X"48", + X"18",X"D3",X"C5",X"ED",X"B2",X"19",X"88",X"07",X"48",X"B2",X"48",X"90",X"A7",X"6F",X"46",X"01", + X"60",X"B2",X"A8",X"38",X"87",X"EF",X"EE",X"09",X"60",X"CB",X"D0",X"C8",X"63",X"F1",X"60",X"F1", + X"46",X"60",X"C8",X"B6",X"29",X"32",X"D7",X"87",X"31",X"F0",X"8F",X"21",X"4F",X"01",X"45",X"B6", + X"A1",X"32",X"E0",X"38",X"F3",X"C5",X"45",X"CD",X"CD",X"80",X"65",X"BF",X"91",X"21",X"5E",X"09", + X"CD",X"F4",X"A1",X"CD",X"54",X"29",X"21",X"1C",X"2A",X"CD",X"54",X"29",X"CD",X"F4",X"A1",X"21", + X"15",X"0A",X"65",X"FC",X"01",X"CD",X"DC",X"81",X"89",X"51",X"A2",X"CD",X"DC",X"81",X"65",X"FC", + X"A1",X"B6",X"D7",X"CD",X"59",X"28",X"B6",X"08",X"CD",X"46",X"3B",X"4B",X"28",X"00",X"2A",X"02", + X"30",X"CC",X"61",X"DA",X"E5",X"CB",X"F4",X"CD",X"E4",X"80",X"E2",X"79",X"A3",X"8C",X"B0",X"EE", + X"EF",X"CA",X"7D",X"EF",X"20",X"80",X"EB",X"EF",X"6C",X"CD",X"7A",X"49",X"2A",X"AB",X"B8",X"D8", + X"F2",X"EF",X"E7",X"DA",X"E1",X"ED",X"E5",X"CC",X"80",X"CA",X"79",X"8B",X"25",X"98",X"E1",X"EB", + X"E9",X"DA",X"69",X"80",X"20",X"EE",X"69",X"EB",X"69",X"EB",X"7D",X"ED",X"49",X"8A",X"3C",X"B8", + X"E4",X"CD",X"F3",X"E9",X"E7",X"EE",X"E5",X"CC",X"80",X"CA",X"79",X"8B",X"B6",X"98",X"F3",X"E8", + X"E9",X"EE",X"EA",X"E9",X"20",X"80",X"6D",X"CF",X"C9",X"8A",X"BE",X"98",X"6B",X"EF",X"7A",X"CD", + X"64",X"C9",X"66",X"CC",X"80",X"DC",X"E5",X"CB",X"60",X"EE",X"67",X"EC",X"67",X"CF",X"71",X"80", + X"E9",X"EE",X"6B",X"32",X"3A",X"80",X"3E",X"91",X"B1",X"B0",X"32",X"B2",X"B1",X"B2",X"11",X"1A", + X"E8",X"18",X"A7",X"CE",X"E0",X"68",X"8E",X"88",X"98",X"76",X"98",X"76",X"B2",X"48",X"B8",X"07", + X"46",X"C8",X"C8",X"1A",X"48",X"18",X"A7",X"EE",X"68",X"88",X"D0",X"89",X"A8",X"28",X"34",X"E3", + X"2B",X"8B",X"81",X"90",X"28",X"A6",X"B0",X"6D",X"B0",X"88",X"88",X"A0",X"88",X"A0",X"88",X"A0", + X"28",X"80",X"28",X"80",X"28",X"80",X"B2",X"48",X"18",X"0F",X"46",X"98",X"20",X"70",X"21",X"BC", + X"28",X"94",X"81",X"A9",X"28",X"12",X"A0",X"18",X"A7",X"CE",X"27",X"30",X"12",X"81",X"91",X"28", + X"2E",X"80",X"CD",X"98",X"28",X"80",X"28",X"80",X"28",X"80",X"28",X"80",X"28",X"80",X"28",X"80", + X"88",X"12",X"E8",X"18",X"A7",X"CE",X"80",X"80",X"58",X"81",X"36",X"28",X"94",X"81",X"22",X"28", + X"B2",X"88",X"18",X"0F",X"46",X"AF",X"6F",X"1A",X"28",X"18",X"A7",X"07",X"AF",X"07",X"AF",X"EE", + X"27",X"90",X"88",X"0B",X"89",X"01",X"28",X"29",X"2B",X"0B",X"6D",X"45",X"46",X"AC",X"D9",X"0F", + X"21",X"2D",X"2B",X"FF",X"3E",X"00",X"B9",X"FE",X"23",X"7E",X"E1",X"26",X"28",X"B9",X"45",X"F6", + X"89",X"00",X"28",X"0E",X"DF",X"41",X"8B",X"F6",X"94",X"41",X"68",X"77",X"61",X"2D",X"A3",X"C9", + X"2B",X"71",X"2B",X"59",X"2B",X"7C",X"2B",X"5D",X"2B",X"65",X"2B",X"52",X"2B",X"7F",X"2B",X"5F", + X"A3",X"C4",X"A3",X"5E",X"A3",X"DF",X"A3",X"53",X"A3",X"CB",X"A3",X"45",X"A3",X"F7",X"A0",X"08", + X"28",X"01",X"D7",X"00",X"28",X"01",X"D7",X"00",X"29",X"FF",X"29",X"FF",X"2A",X"FF",X"2B",X"FF", + X"A4",X"F7",X"A5",X"F7",X"A6",X"F7",X"A0",X"09",X"A0",X"09",X"A1",X"09",X"5F",X"08",X"A1",X"08", + X"2A",X"FF",X"29",X"01",X"29",X"01",X"2A",X"FF",X"29",X"01",X"29",X"02",X"D7",X"01",X"2A",X"FF", + X"A2",X"0A",X"A2",X"0A",X"A3",X"F7",X"A2",X"0A",X"A2",X"0B",X"5F",X"2E",X"A0",X"CD",X"29",X"10", + X"21",X"0B",X"88",X"CB",X"F6",X"C8",X"CD",X"7A",X"A3",X"21",X"1F",X"2A",X"B2",X"08",X"88",X"D6", + X"A1",X"20",X"A3",X"21",X"08",X"82",X"65",X"FC",X"01",X"C9",X"89",X"16",X"28",X"39",X"E5",X"38", + X"B8",X"06",X"21",X"1C",X"88",X"39",X"6C",X"90",X"F6",X"07",X"C8",X"23",X"F6",X"CB",X"F7",X"20", + X"A6",X"36",X"2A",X"B6",X"A1",X"3A",X"61",X"46",X"57",X"A0",X"A2",X"35",X"61",X"36",X"A0",X"A3", + X"35",X"87",X"3A",X"C9",X"21",X"00",X"18",X"2E",X"20",X"36",X"28",X"23",X"38",X"FB",X"87",X"32", + X"E0",X"38",X"9A",X"49",X"B8",X"32",X"E3",X"38",X"9A",X"4C",X"B8",X"32",X"E5",X"38",X"9A",X"4F", + X"18",X"32",X"6A",X"90",X"32",X"46",X"18",X"87",X"21",X"00",X"28",X"32",X"A8",X"88",X"22",X"09", + X"28",X"92",X"23",X"28",X"82",X"BC",X"28",X"82",X"36",X"28",X"81",X"C0",X"2C",X"B1",X"C1",X"2C", + X"29",X"FF",X"28",X"9E",X"28",X"6D",X"10",X"89",X"28",X"2F",X"39",X"89",X"8F",X"81",X"B7",X"88", + X"96",X"88",X"65",X"98",X"6D",X"64",X"30",X"0F",X"92",X"77",X"AF",X"16",X"A1",X"92",X"E0",X"18", + X"D3",X"2F",X"32",X"A0",X"88",X"9A",X"A1",X"28",X"21",X"88",X"28",X"8A",X"AE",X"28",X"22",X"98", + X"28",X"81",X"F8",X"8F",X"82",X"AC",X"28",X"6D",X"E0",X"85",X"B2",X"C8",X"B8",X"07",X"8E",X"88", + X"CB",X"D7",X"20",X"8A",X"2E",X"89",X"F0",X"9A",X"B8",X"28",X"B6",X"88",X"32",X"9F",X"88",X"89", + X"72",X"96",X"82",X"86",X"28",X"81",X"A0",X"08",X"99",X"50",X"5F",X"8F",X"B9",X"CD",X"49",X"02", + X"A0",X"28",X"CD",X"98",X"2D",X"9A",X"A2",X"28",X"B6",X"88",X"32",X"B9",X"88",X"65",X"00",X"8C", + X"6D",X"81",X"A5",X"6D",X"6B",X"82",X"6D",X"41",X"A6",X"16",X"A8",X"6D",X"F9",X"A0",X"A0",X"50", + X"B6",X"88",X"32",X"CF",X"18",X"9A",X"6A",X"18",X"32",X"CE",X"18",X"65",X"A5",X"8F",X"B8",X"78", + X"6D",X"45",X"00",X"6D",X"9F",X"91",X"6D",X"98",X"03",X"12",X"FB",X"8C",X"76",X"80",X"48",X"81", + X"58",X"8C",X"CD",X"54",X"A1",X"ED",X"39",X"8B",X"28",X"11",X"B6",X"80",X"96",X"E0",X"41",X"65", + X"DC",X"A1",X"B6",X"C8",X"6D",X"59",X"00",X"6D",X"DC",X"A1",X"B6",X"48",X"6D",X"59",X"00",X"69", + X"2A",X"AA",X"18",X"80",X"20",X"80",X"20",X"80",X"00",X"8A",X"AD",X"18",X"20",X"80",X"20",X"DC", + X"60",X"C9",X"66",X"EB",X"F3",X"80",X"E6",X"EF",X"F2",X"80",X"F0",X"EC",X"E1",X"F9",X"61",X"EE", + X"6F",X"B2",X"20",X"00",X"2A",X"98",X"18",X"80",X"20",X"80",X"20",X"80",X"7C",X"DA",X"F9",X"80", + X"67",X"46",X"E3",X"4D",X"80",X"45",X"67",X"5A",X"E5",X"88",X"15",X"88",X"80",X"88",X"80",X"A8", + X"87",X"0E",X"23",X"CB",X"6D",X"A0",X"29",X"A7",X"AB",X"FF",X"F0",X"11",X"F3",X"20",X"52",X"77", + X"61",X"B6",X"A0",X"32",X"B6",X"20",X"65",X"ED",X"00",X"CD",X"9F",X"99",X"65",X"18",X"03",X"CD", + X"96",X"05",X"21",X"7A",X"2D",X"45",X"39",X"03",X"28",X"B9",X"F6",X"D6",X"7B",X"20",X"42",X"41", + X"65",X"FC",X"01",X"21",X"B8",X"0D",X"65",X"FC",X"01",X"21",X"38",X"0D",X"65",X"FC",X"01",X"26", + X"3A",X"A6",X"2F",X"22",X"28",X"88",X"B6",X"09",X"32",X"02",X"88",X"CD",X"D6",X"2E",X"21",X"A2", + X"A5",X"CD",X"DC",X"81",X"0E",X"1E",X"06",X"0F",X"96",X"01",X"9A",X"0A",X"28",X"CD",X"09",X"87", + X"21",X"AE",X"2D",X"CD",X"54",X"29",X"CD",X"29",X"BD",X"C9",X"2D",X"06",X"19",X"53",X"79",X"55", + X"E1",X"5B",X"60",X"88",X"F4",X"40",X"E5",X"88",X"F3",X"46",X"67",X"97",X"E2",X"4D",X"E5",X"7B", + X"AC",X"0B",X"19",X"50",X"6D",X"4E",X"6F",X"CF",X"AC",X"0F",X"98",X"53",X"EE",X"4F",X"B7",X"42", + X"E5",X"6D",X"24",X"1B",X"B9",X"41",X"E3",X"4D",X"80",X"4A",X"64",X"47",X"E3",X"63",X"24",X"1F", + X"98",X"44",X"E9",X"41",X"ED",X"4F",X"EE",X"44",X"20",X"42",X"EC",X"4F",X"6B",X"CB",X"B6",X"09", + X"9A",X"0A",X"28",X"B6",X"D8",X"21",X"21",X"13",X"8A",X"08",X"28",X"CD",X"A0",X"87",X"89",X"03", + X"BB",X"22",X"28",X"88",X"CD",X"00",X"A7",X"21",X"AD",X"1B",X"22",X"00",X"88",X"CD",X"28",X"2F", + X"89",X"07",X"33",X"22",X"A0",X"20",X"65",X"08",X"07",X"B6",X"3C",X"21",X"21",X"15",X"8A",X"08", + X"88",X"CD",X"AC",X"06",X"B6",X"5C",X"CD",X"0C",X"2E",X"21",X"39",X"1B",X"22",X"00",X"88",X"B6", + X"82",X"6D",X"14",X"A1",X"B4",X"6D",X"31",X"A1",X"6D",X"B4",X"01",X"69",X"8E",X"8C",X"6D",X"B4", + X"A1",X"1C",X"38",X"72",X"C9",X"1E",X"28",X"9A",X"2A",X"28",X"21",X"D0",X"2E",X"96",X"00",X"86", + X"20",X"ED",X"B6",X"8F",X"18",X"EE",X"A2",X"E7",X"AE",X"8D",X"65",X"E3",X"A0",X"28",X"F6",X"83", + X"07",X"08",X"B1",X"C7",X"CB",X"5F",X"20",X"AD",X"CB",X"DF",X"20",X"9D",X"F2",X"65",X"B4",X"A1", + X"9C",X"B0",X"59",X"30",X"49",X"CE",X"27",X"E7",X"B6",X"80",X"6D",X"B4",X"01",X"B0",X"5B",X"30", + X"DD",X"EE",X"AF",X"ED",X"5D",X"89",X"64",X"8E",X"3E",X"88",X"FF",X"11",X"F6",X"F1",X"41",X"65", + X"14",X"A1",X"B8",X"6A",X"8B",X"20",X"E8",X"6D",X"FB",X"44",X"48",X"61",X"49",X"B0",X"9A",X"69", + X"2E",X"88",X"2C",X"C9",X"29",X"28",X"2B",X"88",X"2A",X"C9",X"AA",X"C8",X"2C",X"88",X"29",X"C9", + X"A3",X"C9",X"A3",X"C9",X"E1",X"8A",X"E1",X"8C",X"A0",X"89",X"E1",X"C9",X"A1",X"C9",X"A1",X"C9", + X"29",X"C9",X"29",X"C9",X"29",X"C9",X"2A",X"C9",X"69",X"89",X"28",X"89",X"69",X"C9",X"29",X"C9", + X"A3",X"C9",X"A3",X"C9",X"E1",X"8A",X"E1",X"89",X"A0",X"89",X"E1",X"8A",X"E1",X"C9",X"A6",X"CB", + X"69",X"CC",X"2A",X"88",X"29",X"CA",X"29",X"09",X"6E",X"CF",X"0C",X"8A",X"6A",X"CD",X"29",X"88", + X"B6",X"88",X"92",X"CB",X"B8",X"6D",X"CD",X"A0",X"6D",X"17",X"91",X"6D",X"B0",X"A3",X"6D",X"E4", + X"27",X"89",X"F6",X"8D",X"F6",X"7E",X"79",X"88",X"2E",X"1E",X"D7",X"65",X"59",X"A0",X"C9",X"E9", + X"69",X"16",X"A5",X"92",X"B2",X"28",X"92",X"9B",X"28",X"81",X"A0",X"88",X"82",X"84",X"28",X"12", + X"68",X"18",X"A7",X"EE",X"B8",X"07",X"AF",X"07",X"4E",X"8A",X"32",X"9C",X"88",X"9A",X"3D",X"28", + X"A7",X"32",X"B6",X"20",X"82",X"8E",X"28",X"22",X"D8",X"24",X"89",X"52",X"96",X"22",X"86",X"20", + X"39",X"00",X"64",X"21",X"56",X"8C",X"34",X"CB",X"6E",X"A0",X"2B",X"39",X"28",X"66",X"C5",X"7B", + X"DA",X"24",X"A7",X"32",X"DD",X"24",X"65",X"85",X"21",X"CD",X"E8",X"0E",X"61",X"B2",X"20",X"20", + X"07",X"C8",X"87",X"32",X"3E",X"88",X"CD",X"E5",X"A0",X"CD",X"38",X"2B",X"CD",X"2C",X"A2",X"21", + X"23",X"20",X"63",X"D6",X"ED",X"CD",X"D4",X"0F",X"E9",X"CB",X"B6",X"B6",X"5F",X"32",X"B7",X"20", + X"CD",X"7D",X"A8",X"87",X"32",X"17",X"88",X"32",X"6B",X"90",X"21",X"00",X"88",X"39",X"A2",X"00", + X"AF",X"B9",X"4E",X"B2",X"02",X"20",X"B0",X"CA",X"05",X"0F",X"A7",X"A7",X"89",X"08",X"28",X"A3", + X"77",X"4B",X"A5",X"07",X"CD",X"B7",X"31",X"DD",X"21",X"80",X"8D",X"DD",X"36",X"00",X"10",X"DD", + X"9E",X"09",X"70",X"DD",X"9E",X"0B",X"23",X"DD",X"9E",X"0C",X"A2",X"DD",X"9E",X"0D",X"A5",X"DD", + X"36",X"09",X"28",X"DD",X"36",X"0B",X"28",X"CD",X"CE",X"33",X"CD",X"AB",X"B1",X"CD",X"75",X"08", + X"65",X"11",X"20",X"B2",X"A8",X"38",X"87",X"46",X"C0",X"A0",X"DA",X"CB",X"DF",X"20",X"25",X"21", + X"A8",X"88",X"35",X"B6",X"28",X"32",X"3E",X"88",X"CD",X"D1",X"2F",X"C9",X"B2",X"08",X"88",X"D6", + X"A1",X"A0",X"7A",X"21",X"20",X"20",X"9D",X"35",X"96",X"28",X"9A",X"1E",X"28",X"CD",X"F9",X"0F", + X"C9",X"B2",X"28",X"90",X"A7",X"46",X"AF",X"21",X"A9",X"88",X"CD",X"FB",X"2F",X"21",X"AA",X"88", + X"92",X"08",X"B8",X"A7",X"EE",X"07",X"4F",X"B2",X"A0",X"38",X"87",X"AF",X"07",X"AF",X"07",X"46", + X"AF",X"90",X"20",X"03",X"21",X"09",X"88",X"CD",X"D3",X"07",X"C9",X"45",X"EE",X"0F",X"21",X"2D", + X"A3",X"77",X"9E",X"88",X"B9",X"76",X"83",X"F6",X"E1",X"86",X"A0",X"31",X"AE",X"88",X"F6",X"9F", + X"20",X"8C",X"AC",X"0B",X"B8",X"70",X"41",X"D9",X"C9",X"75",X"F6",X"AB",X"39",X"82",X"A8",X"E3", + X"2F",X"A5",X"5A",X"B7",X"90",X"A8",X"74",X"A8",X"37",X"C8",X"E6",X"A8",X"74",X"A8",X"D0",X"A8", + X"26",X"AC",X"A6",X"9B",X"22",X"88",X"88",X"65",X"28",X"A1",X"CD",X"B9",X"A1",X"1E",X"EE",X"65", + X"14",X"A1",X"7D",X"94",X"23",X"69",X"86",X"AC",X"A6",X"9B",X"82",X"88",X"28",X"16",X"66",X"6D", + X"B4",X"A1",X"CD",X"B9",X"A1",X"65",X"28",X"A1",X"DD",X"9C",X"AB",X"61",X"DD",X"63",X"A9",X"CE", + X"6C",X"C7",X"20",X"6D",X"AA",X"C8",X"69",X"7D",X"96",X"AA",X"80",X"7D",X"96",X"A9",X"27",X"69", + X"DD",X"9E",X"AB",X"88",X"C9",X"0A",X"24",X"28",X"23",X"8A",X"24",X"28",X"C9",X"89",X"28",X"88", + X"82",X"AE",X"28",X"82",X"B0",X"28",X"B6",X"89",X"92",X"9A",X"28",X"92",X"B3",X"28",X"B2",X"C8", + X"18",X"0F",X"46",X"B8",X"AF",X"07",X"AF",X"E6",X"2A",X"9A",X"3C",X"28",X"32",X"9D",X"88",X"89", + X"B6",X"28",X"6B",X"56",X"80",X"A8",X"B2",X"9C",X"28",X"CE",X"57",X"68",X"B8",X"80",X"B2",X"9C", + X"88",X"EE",X"F7",X"C7",X"B2",X"9D",X"88",X"EE",X"F7",X"47",X"08",X"60",X"CB",X"C6",X"20",X"8F", + X"F0",X"8F",X"80",X"AA",X"94",X"30",X"DD",X"51",X"07",X"80",X"A3",X"94",X"B8",X"66",X"6D",X"F0", + X"A0",X"65",X"5E",X"A8",X"B8",X"69",X"21",X"9E",X"88",X"63",X"F6",X"88",X"2F",X"5E",X"46",X"F7", + X"A0",X"EB",X"B8",X"AC",X"6B",X"E6",X"4C",X"4C",X"26",X"12",X"B6",X"28",X"46",X"F6",X"A0",X"B5", + X"CD",X"45",X"A0",X"65",X"17",X"91",X"CD",X"98",X"A3",X"65",X"76",X"A4",X"CD",X"AC",X"A5",X"65", + X"63",X"85",X"65",X"DE",X"27",X"CD",X"75",X"86",X"65",X"DF",X"26",X"B6",X"21",X"32",X"A2",X"20", + X"C5",X"EB",X"10",X"8D",X"CD",X"A9",X"A7",X"C5",X"EB",X"B2",X"8D",X"CD",X"81",X"2F",X"C5",X"EB", + X"9C",X"25",X"65",X"A1",X"07",X"CD",X"C6",X"05",X"65",X"78",X"25",X"B8",X"D3",X"CD",X"2F",X"80", + X"D6",X"11",X"20",X"03",X"B6",X"01",X"77",X"2E",X"2E",X"D6",X"2B",X"B0",X"AE",X"2E",X"A8",X"D6", + X"20",X"B0",X"20",X"2E",X"22",X"D6",X"24",X"B0",X"A2",X"2E",X"24",X"F0",X"9A",X"68",X"2D",X"32", + X"DD",X"8D",X"32",X"98",X"8D",X"21",X"2D",X"8D",X"39",X"20",X"28",X"36",X"29",X"B9",X"36",X"02", + X"11",X"36",X"A3",X"B9",X"9E",X"0C",X"89",X"2D",X"2D",X"36",X"A5",X"21",X"8D",X"25",X"9E",X"0E", + X"CD",X"E5",X"A0",X"CD",X"17",X"31",X"CD",X"10",X"A3",X"B2",X"B9",X"88",X"07",X"A0",X"2E",X"CD", + X"D6",X"84",X"65",X"04",X"05",X"CD",X"4F",X"99",X"65",X"2B",X"92",X"CD",X"0B",X"9A",X"65",X"6A", + X"31",X"CD",X"01",X"2D",X"B6",X"20",X"32",X"00",X"08",X"87",X"32",X"92",X"8D",X"32",X"1B",X"8D", + X"65",X"4C",X"25",X"DD",X"89",X"28",X"2D",X"CD",X"6E",X"9B",X"65",X"A3",X"11",X"CD",X"50",X"96", + X"CD",X"A9",X"6B",X"2E",X"D7",X"CD",X"89",X"18",X"2E",X"02",X"CD",X"89",X"B8",X"B2",X"68",X"90", + X"87",X"CB",X"C7",X"4A",X"03",X"02",X"96",X"48",X"65",X"79",X"00",X"B2",X"C0",X"24",X"AF",X"20", + X"D2",X"B6",X"2E",X"32",X"93",X"8C",X"87",X"21",X"FB",X"8C",X"77",X"23",X"77",X"23",X"77",X"21", + X"7E",X"25",X"9E",X"00",X"8B",X"36",X"A8",X"B2",X"C0",X"24",X"AF",X"20",X"A7",X"53",X"0E",X"00", + X"CD",X"89",X"B8",X"D3",X"CD",X"75",X"A8",X"CD",X"AE",X"33",X"CD",X"14",X"33",X"CD",X"BA",X"33", + X"6D",X"80",X"93",X"6D",X"D3",X"B5",X"6D",X"36",X"E1",X"6D",X"31",X"E9",X"6D",X"AC",X"63",X"6D", + X"E8",X"EB",X"CD",X"46",X"EB",X"65",X"7D",X"EC",X"B2",X"3E",X"8D",X"63",X"F7",X"E2",X"5A",X"AC", + X"B2",X"38",X"2D",X"8F",X"80",X"49",X"6D",X"7D",X"23",X"10",X"1C",X"A6",X"A4",X"6D",X"29",X"B8", + X"53",X"75",X"21",X"08",X"8D",X"1A",X"FC",X"2C",X"DD",X"A6",X"3A",X"86",X"28",X"7E",X"B4",X"18", + X"A4",X"FE",X"14",X"A6",X"A1",X"7D",X"D7",X"9A",X"B2",X"FD",X"2C",X"7D",X"0E",X"9B",X"08",X"7D", + X"77",X"9B",X"D3",X"65",X"B1",X"AC",X"CD",X"DD",X"AC",X"65",X"AC",X"A5",X"21",X"80",X"AB",X"65", + X"DC",X"A1",X"81",X"B3",X"23",X"6D",X"DC",X"A1",X"81",X"DE",X"23",X"6D",X"DC",X"A1",X"81",X"D1", + X"AB",X"65",X"54",X"A1",X"21",X"2C",X"AB",X"65",X"54",X"A1",X"21",X"07",X"AB",X"65",X"54",X"A1", + X"81",X"4A",X"23",X"6D",X"DC",X"A1",X"B6",X"80",X"6D",X"59",X"00",X"12",X"BB",X"2D",X"86",X"88", + X"E7",X"65",X"68",X"A3",X"26",X"8B",X"A6",X"AC",X"22",X"88",X"88",X"1E",X"38",X"9A",X"2A",X"28", + X"6D",X"E7",X"04",X"12",X"BA",X"2D",X"86",X"88",X"E7",X"6D",X"E0",X"A3",X"86",X"8B",X"A6",X"9B", + X"22",X"88",X"88",X"65",X"E7",X"A4",X"B6",X"80",X"CD",X"59",X"A0",X"0E",X"2A",X"8E",X"38",X"91", + X"A0",X"88",X"7D",X"56",X"B3",X"8F",X"80",X"93",X"8E",X"89",X"6D",X"27",X"30",X"06",X"A2",X"86", + X"AE",X"91",X"29",X"88",X"DD",X"5E",X"3A",X"7E",X"32",X"98",X"20",X"8E",X"AC",X"91",X"32",X"88", + X"76",X"A0",X"90",X"9F",X"86",X"AA",X"99",X"C4",X"A0",X"5E",X"36",X"90",X"26",X"86",X"20",X"B1", + X"C8",X"88",X"D6",X"9C",X"30",X"8D",X"26",X"8E",X"39",X"54",X"29",X"F5",X"B6",X"B8",X"22",X"88", + X"28",X"2E",X"30",X"CD",X"05",X"81",X"18",X"F3",X"79",X"CD",X"0F",X"80",X"96",X"28",X"65",X"79", + X"A0",X"CD",X"8F",X"28",X"46",X"01",X"CC",X"29",X"BD",X"CD",X"8F",X"28",X"34",X"4B",X"A5",X"09", + X"A2",X"0B",X"30",X"4F",X"E1",X"45",X"E5",X"88",X"F4",X"41",X"65",X"4D",X"80",X"88",X"80",X"88", + X"ED",X"49",X"EE",X"3A",X"20",X"20",X"20",X"53",X"6D",X"43",X"92",X"02",X"2E",X"11",X"6E",X"52", + X"67",X"45",X"80",X"98",X"90",X"88",X"F4",X"47",X"80",X"99",X"11",X"88",X"12",X"9D",X"90",X"98", + X"30",X"20",X"78",X"54",X"7B",X"BA",X"2A",X"08",X"39",X"46",X"7A",X"4F",X"ED",X"20",X"32",X"30", + X"80",X"5C",X"67",X"88",X"92",X"91",X"80",X"92",X"92",X"98",X"90",X"98",X"80",X"58",X"F4",X"5B", + X"92",X"02",X"AA",X"11",X"6E",X"52",X"EF",X"4D",X"20",X"33",X"30",X"20",X"7C",X"4F",X"20",X"33", + X"11",X"88",X"12",X"99",X"90",X"98",X"90",X"88",X"F0",X"5C",X"F3",X"B2",X"A2",X"04",X"B1",X"4E", + X"7A",X"4F",X"ED",X"20",X"34",X"30",X"20",X"54",X"EF",X"20",X"34",X"39",X"20",X"3A",X"B2",X"35", + X"90",X"98",X"80",X"58",X"F4",X"5B",X"1A",X"0A",X"26",X"19",X"E6",X"5A",X"67",X"45",X"80",X"9D", + X"30",X"20",X"7C",X"4F",X"20",X"35",X"B1",X"20",X"B2",X"3A",X"B2",X"31",X"30",X"20",X"78",X"54", + X"F3",X"B2",X"A2",X"18",X"B1",X"9E",X"90",X"88",X"E1",X"46",X"E4",X"88",X"67",X"5E",X"E5",X"5A", + X"20",X"20",X"20",X"20",X"EE",X"4F",X"20",X"42",X"EF",X"4E",X"7D",X"53",X"92",X"CD",X"C4",X"0B", + X"65",X"F1",X"23",X"D8",X"65",X"16",X"24",X"D8",X"65",X"8E",X"24",X"C9",X"89",X"37",X"2D",X"F6", + X"D6",X"02",X"B0",X"04",X"20",X"02",X"36",X"01",X"C9",X"21",X"BF",X"8D",X"39",X"20",X"28",X"2E", + X"A4",X"56",X"76",X"8A",X"B0",X"8C",X"80",X"8A",X"96",X"89",X"B9",X"B0",X"DC",X"81",X"37",X"2D", + X"2E",X"8C",X"F6",X"7E",X"2B",X"18",X"2A",X"9F",X"C9",X"11",X"38",X"56",X"07",X"61",X"21",X"37", + X"2D",X"56",X"07",X"68",X"97",X"69",X"81",X"4D",X"2C",X"B1",X"A6",X"88",X"8E",X"8C",X"F6",X"8F", + X"20",X"8D",X"B9",X"90",X"D1",X"AF",X"C9",X"9F",X"C9",X"86",X"20",X"E5",X"B6",X"80",X"18",X"1C", + X"CF",X"26",X"A0",X"4D",X"CB",X"88",X"28",X"16",X"A0",X"6D",X"90",X"A7",X"B6",X"89",X"6D",X"59", + X"A0",X"E1",X"38",X"47",X"C9",X"75",X"21",X"08",X"8D",X"75",X"F6",X"88",X"DD",X"9E",X"2C",X"8A", + X"76",X"08",X"90",X"8C",X"7D",X"96",X"A4",X"8B",X"7D",X"96",X"A6",X"AF",X"7D",X"96",X"20",X"77", + X"CD",X"D5",X"A8",X"86",X"08",X"90",X"D6",X"65",X"EA",X"B1",X"DD",X"9C",X"2F",X"75",X"F6",X"8F", + X"7D",X"1E",X"A6",X"10",X"4B",X"7D",X"96",X"8F",X"A0",X"7D",X"F6",X"88",X"07",X"68",X"76",X"68", + X"CC",X"00",X"AC",X"75",X"F6",X"88",X"D6",X"A0",X"CC",X"31",X"AC",X"65",X"5F",X"B5",X"B8",X"58", + X"7D",X"56",X"A4",X"5E",X"A3",X"E8",X"6D",X"F4",X"05",X"CE",X"A1",X"68",X"7D",X"96",X"A2",X"40", + X"CD",X"23",X"B1",X"1E",X"68",X"65",X"59",X"A0",X"C9",X"75",X"F6",X"8C",X"D6",X"8A",X"48",X"65", + X"54",X"A5",X"46",X"89",X"68",X"7D",X"96",X"8A",X"CA",X"6D",X"0B",X"B1",X"B6",X"C8",X"6D",X"59", + X"A0",X"61",X"CD",X"40",X"AB",X"72",X"47",X"A9",X"2E",X"8D",X"CD",X"29",X"B8",X"1E",X"2E",X"9A", + X"3F",X"2D",X"7D",X"81",X"A8",X"2D",X"6D",X"13",X"17",X"16",X"A6",X"7D",X"36",X"BF",X"A0",X"52", + X"53",X"75",X"21",X"08",X"8D",X"1A",X"FC",X"2C",X"DD",X"A6",X"3A",X"86",X"28",X"7E",X"B4",X"18", + X"A4",X"5E",X"14",X"2E",X"A1",X"DD",X"DF",X"1A",X"92",X"55",X"2C",X"DD",X"2E",X"1B",X"28",X"DD", + X"77",X"13",X"D3",X"B6",X"28",X"32",X"9E",X"8D",X"CD",X"9E",X"A0",X"F6",X"B5",X"77",X"46",X"7F", + X"62",X"7F",X"26",X"B2",X"31",X"20",X"AF",X"C8",X"96",X"28",X"65",X"79",X"00",X"CD",X"11",X"04", + X"CD",X"38",X"AE",X"21",X"3E",X"88",X"CB",X"F6",X"A0",X"07",X"34",X"CB",X"6E",X"CC",X"4C",X"0E", + X"61",X"34",X"9C",X"C9",X"65",X"36",X"00",X"D6",X"A5",X"58",X"95",X"0F",X"8E",X"8B",X"C7",X"22", + X"28",X"88",X"45",X"CD",X"28",X"29",X"CD",X"00",X"A1",X"41",X"26",X"00",X"22",X"00",X"88",X"CD", + X"A0",X"81",X"65",X"08",X"01",X"C9",X"75",X"21",X"A8",X"25",X"89",X"35",X"25",X"EE",X"8B",X"6E", + X"23",X"45",X"CD",X"0A",X"30",X"B0",X"23",X"CD",X"87",X"0D",X"B0",X"1E",X"41",X"F1",X"4E",X"02", + X"2F",X"0F",X"2F",X"DD",X"DF",X"08",X"D0",X"0F",X"2F",X"0F",X"75",X"77",X"A1",X"DD",X"9E",X"0A", + X"A8",X"DD",X"36",X"1E",X"28",X"DD",X"36",X"1F",X"29",X"C9",X"41",X"B8",X"58",X"0D",X"AE",X"0D", + X"24",X"05",X"B0",X"03",X"26",X"07",X"26",X"03",X"B0",X"07",X"B0",X"03",X"24",X"07",X"24",X"4D", + X"78",X"F9",X"A2",X"B0",X"8D",X"CD",X"99",X"2D",X"A0",X"13",X"A2",X"B2",X"8D",X"CD",X"99",X"2D", + X"80",X"03",X"82",X"BC",X"2D",X"CD",X"39",X"85",X"80",X"0B",X"69",X"87",X"61",X"49",X"9F",X"C9", + X"21",X"2C",X"AE",X"DD",X"21",X"00",X"8D",X"DD",X"F6",X"1F",X"07",X"4C",X"28",X"0E",X"DD",X"21", + X"80",X"25",X"75",X"F6",X"37",X"07",X"6C",X"08",X"26",X"DD",X"89",X"48",X"2D",X"DD",X"D6",X"17", + X"07",X"4C",X"28",X"0E",X"DD",X"21",X"60",X"8D",X"DD",X"F6",X"BF",X"07",X"4C",X"00",X"AE",X"C9", + X"EE",X"83",X"CE",X"83",X"DE",X"83",X"45",X"FD",X"6D",X"E7",X"01",X"16",X"80",X"1E",X"A0",X"8E", + X"59",X"58",X"0A",X"C7",X"B8",X"51",X"59",X"59",X"4E",X"8A",X"0F",X"A7",X"0F",X"75",X"77",X"88", + X"F0",X"AF",X"0F",X"AF",X"7D",X"D7",X"A1",X"6D",X"6E",X"93",X"41",X"69",X"A1",X"8A",X"A2",X"B9", + X"BE",X"76",X"B9",X"8A",X"2A",X"89",X"BE",X"76",X"21",X"40",X"8D",X"86",X"2A",X"E5",X"AE",X"AD", + X"4D",X"16",X"A2",X"B8",X"0F",X"AF",X"0F",X"AF",X"4E",X"8A",X"DF",X"16",X"25",X"B9",X"0F",X"EE", + X"29",X"57",X"CD",X"FD",X"AE",X"E1",X"AD",X"88",X"47",X"E1",X"38",X"41",X"C9",X"9E",X"28",X"86", + X"20",X"ED",X"5D",X"E2",X"EB",X"CD",X"6D",X"E7",X"01",X"56",X"41",X"5E",X"80",X"6B",X"9E",X"F9", + X"49",X"94",X"3C",X"90",X"C4",X"8B",X"C9",X"1E",X"28",X"9A",X"2A",X"28",X"21",X"40",X"8D",X"86", + X"A2",X"ED",X"AE",X"AD",X"4D",X"16",X"25",X"B9",X"0F",X"EE",X"A1",X"77",X"F0",X"B6",X"A2",X"15", + X"A0",X"8D",X"CD",X"23",X"AE",X"10",X"2D",X"96",X"3A",X"65",X"07",X"AE",X"49",X"05",X"20",X"44", + X"49",X"B0",X"7E",X"6D",X"B4",X"A7",X"69",X"A6",X"A7",X"30",X"A2",X"A6",X"20",X"ED",X"5D",X"4D", + X"7B",X"88",X"88",X"63",X"3E",X"98",X"2D",X"ED",X"CD",X"76",X"A6",X"E9",X"59",X"E1",X"3C",X"94", + X"98",X"63",X"83",X"69",X"81",X"88",X"2D",X"B1",X"A0",X"2E",X"8E",X"88",X"F6",X"DD",X"BA",X"D7", + X"51",X"92",X"23",X"93",X"38",X"56",X"C9",X"65",X"17",X"91",X"2E",X"8E",X"CD",X"29",X"B8",X"89", + X"64",X"AF",X"6D",X"A6",X"27",X"81",X"F1",X"AF",X"B2",X"9E",X"28",X"6B",X"CF",X"00",X"A3",X"81", + X"FD",X"AF",X"CD",X"54",X"A1",X"89",X"E1",X"AF",X"CD",X"54",X"A1",X"1E",X"08",X"65",X"59",X"A0", + X"65",X"27",X"85",X"21",X"B6",X"20",X"63",X"F6",X"80",X"0F",X"9C",X"CB",X"4E",X"CC",X"EC",X"06", + X"C9",X"34",X"34",X"21",X"28",X"84",X"3E",X"04",X"BE",X"2A",X"B9",X"EE",X"21",X"00",X"08",X"3E", + X"5F",X"BE",X"D8",X"B9",X"D6",X"91",X"60",X"21",X"A0",X"20",X"83",X"36",X"5F",X"C9",X"56",X"23", + X"7E",X"23",X"F6",X"32",X"2A",X"88",X"23",X"EE",X"23",X"6E",X"4D",X"5D",X"C5",X"7B",X"28",X"88", + X"65",X"08",X"01",X"AD",X"88",X"F2",X"79",X"49",X"1C",X"38",X"4F",X"C9",X"20",X"04",X"B0",X"04", + X"2D",X"09",X"AD",X"10",X"78",X"4C",X"69",X"59",X"6D",X"52",X"20",X"20",X"11",X"09",X"AD",X"10", + X"F0",X"44",X"E1",X"51",X"E5",X"5A",X"80",X"88",X"9A",X"01",X"27",X"18",X"E7",X"49",X"65",X"4D", + X"20",X"20",X"EF",X"56",X"6D",X"D2",X"21",X"E3",X"AF",X"B2",X"3E",X"88",X"CB",X"6F",X"A0",X"03", + X"89",X"E6",X"27",X"CD",X"DC",X"81",X"89",X"F1",X"27",X"CD",X"DC",X"81",X"96",X"28",X"65",X"79", + X"A0",X"21",X"DE",X"0F",X"CD",X"2E",X"AF",X"C9",X"2E",X"10",X"AE",X"09",X"3E",X"05",X"BE",X"0A", + X"89",X"8F",X"2C",X"5D",X"6D",X"5D",X"ED",X"CD",X"47",X"81",X"D6",X"41",X"DF",X"23",X"04",X"59", + X"BD",X"20",X"52",X"49",X"2C",X"59",X"3D",X"20",X"C2",X"C9",X"2E",X"10",X"AE",X"09",X"3E",X"05", + X"16",X"02",X"89",X"8F",X"2C",X"5D",X"6D",X"5D",X"ED",X"F6",X"FD",X"CD",X"47",X"81",X"F9",X"77", + X"41",X"23",X"AC",X"59",X"BD",X"20",X"50",X"49",X"2C",X"59",X"3D",X"20",X"C0",X"C9",X"A9",X"10", + X"A0",X"02",X"A5",X"02",X"B1",X"18",X"F0",X"44",X"E1",X"51",X"E5",X"5A",X"80",X"B9",X"22",X"19", + X"38",X"50",X"EC",X"41",X"F9",X"45",X"7A",X"20",X"12",X"0B",X"3B",X"10",X"7A",X"45",X"69",X"44", + X"D9",X"FF",X"D7",X"B6",X"28",X"BA",X"6F",X"90",X"BA",X"42",X"18",X"BA",X"6E",X"90",X"45",X"F2", + X"10",X"6D",X"BF",X"31",X"65",X"69",X"90",X"6D",X"1B",X"38",X"65",X"3C",X"93",X"6D",X"1B",X"38", + X"45",X"F1",X"3C",X"45",X"B3",X"10",X"45",X"66",X"3C",X"45",X"B3",X"10",X"45",X"0D",X"39",X"45", + X"1B",X"38",X"65",X"76",X"96",X"6D",X"1B",X"38",X"E3",X"28",X"80",X"B6",X"02",X"6D",X"F1",X"A0", + X"41",X"55",X"CB",X"26",X"28",X"A9",X"28",X"80",X"45",X"F2",X"38",X"B0",X"2A",X"43",X"49",X"A9", + X"80",X"88",X"65",X"52",X"90",X"B0",X"82",X"6B",X"61",X"7D",X"EB",X"6D",X"ED",X"A0",X"89",X"09", + X"38",X"45",X"54",X"29",X"45",X"D2",X"38",X"45",X"42",X"10",X"A9",X"8F",X"38",X"F1",X"8F",X"A0", + X"83",X"81",X"35",X"38",X"FD",X"6D",X"FC",X"A1",X"F9",X"80",X"7E",X"B6",X"82",X"6D",X"C6",X"3B", + X"41",X"08",X"AA",X"10",X"7A",X"41",X"ED",X"53",X"20",X"20",X"20",X"54",X"6D",X"53",X"5C",X"08", + X"92",X"38",X"C1",X"EC",X"44",X"20",X"D2",X"69",X"45",X"7B",X"88",X"EF",X"63",X"A8",X"92",X"3E", + X"7A",X"41",X"ED",X"53",X"20",X"42",X"69",X"C4",X"A8",X"0D",X"38",X"52",X"69",X"4D",X"31",X"20", + X"47",X"CB",X"00",X"AD",X"96",X"7A",X"C1",X"ED",X"99",X"20",X"C2",X"69",X"E4",X"A8",X"07",X"38", + X"7A",X"41",X"ED",X"32",X"20",X"4F",X"CB",X"08",X"AF",X"16",X"7A",X"41",X"ED",X"32",X"20",X"42", + X"C1",X"4C",X"89",X"80",X"90",X"6B",X"C1",X"A0",X"83",X"81",X"BA",X"38",X"E5",X"6D",X"FC",X"A1", + X"49",X"41",X"A9",X"BD",X"38",X"43",X"61",X"A0",X"2B",X"A9",X"4F",X"10",X"4D",X"45",X"54",X"29", + X"E1",X"69",X"7D",X"43",X"D1",X"89",X"80",X"A8",X"1E",X"7D",X"DF",X"36",X"E0",X"B6",X"2A",X"D7", + X"B6",X"C0",X"8B",X"0B",X"D0",X"B1",X"80",X"D8",X"42",X"FD",X"EB",X"AF",X"61",X"CD",X"CD",X"A0", + X"89",X"BE",X"92",X"65",X"FC",X"A1",X"89",X"A5",X"92",X"65",X"FC",X"A1",X"89",X"B7",X"92",X"65", + X"DC",X"A1",X"92",X"68",X"18",X"CD",X"42",X"39",X"89",X"6E",X"3A",X"CD",X"DC",X"A1",X"92",X"28", + X"B0",X"65",X"62",X"39",X"89",X"ED",X"92",X"65",X"FC",X"A1",X"1A",X"68",X"B0",X"87",X"63",X"47", + X"88",X"2E",X"89",X"76",X"3A",X"CD",X"DC",X"A1",X"89",X"EC",X"3A",X"3A",X"68",X"18",X"87",X"CB", + X"D7",X"80",X"83",X"89",X"D9",X"3A",X"65",X"54",X"09",X"92",X"C0",X"18",X"0F",X"07",X"07",X"07", + X"EE",X"2B",X"6E",X"2A",X"FE",X"B8",X"89",X"2C",X"3B",X"22",X"28",X"00",X"65",X"B4",X"A1",X"21", + X"5C",X"3A",X"65",X"54",X"09",X"89",X"A6",X"3A",X"65",X"54",X"09",X"92",X"C0",X"18",X"0F",X"63", + X"C7",X"20",X"2E",X"21",X"1D",X"3A",X"65",X"DC",X"A1",X"21",X"13",X"3A",X"65",X"DC",X"A1",X"3A", + X"C0",X"18",X"0F",X"63",X"DF",X"80",X"86",X"89",X"2E",X"3A",X"65",X"54",X"09",X"89",X"EE",X"3A", + X"92",X"68",X"18",X"2F",X"0F",X"07",X"EE",X"2B",X"80",X"39",X"89",X"C5",X"3A",X"FE",X"29",X"28", + X"02",X"89",X"FE",X"3A",X"7E",X"2A",X"08",X"2B",X"89",X"D5",X"92",X"65",X"FC",X"A1",X"89",X"2F", + X"3B",X"CD",X"DC",X"A1",X"96",X"36",X"65",X"6E",X"3B",X"C9",X"87",X"06",X"20",X"0E",X"67",X"0F", + X"98",X"2A",X"06",X"6B",X"FD",X"D1",X"65",X"B4",X"09",X"65",X"80",X"A1",X"F9",X"18",X"6E",X"61", + X"EE",X"27",X"2F",X"16",X"28",X"5F",X"89",X"D6",X"39",X"19",X"96",X"22",X"9A",X"28",X"00",X"7E", + X"65",X"B4",X"09",X"8B",X"1E",X"39",X"9A",X"28",X"20",X"D6",X"65",X"B4",X"09",X"61",X"9C",X"31", + X"33",X"31",X"32",X"31",X"31",X"31",X"31",X"32",X"31",X"33",X"31",X"34",X"31",X"35",X"31",X"36", + X"45",X"6A",X"45",X"6A",X"45",X"6A",X"45",X"6A",X"45",X"6A",X"45",X"6A",X"45",X"6A",X"00",X"2C", + X"38",X"44",X"E9",X"50",X"20",X"53",X"7F",X"49",X"7C",X"43",X"E8",X"45",X"5B",X"08",X"2E",X"10", + X"99",X"20",X"9A",X"20",X"9B",X"20",X"9C",X"20",X"9D",X"20",X"9E",X"20",X"9F",X"20",X"38",X"2C", + X"A8",X"10",X"31",X"53",X"7F",X"A0",X"2C",X"0A",X"38",X"32",X"7B",X"57",X"00",X"04",X"AF",X"18", + X"C4",X"6D",X"45",X"EF",X"88",X"7B",X"47",X"7D",X"46",X"6C",X"D3",X"20",X"47",X"CE",X"90",X"AF", + X"B8",X"4F",X"6E",X"C6",X"2C",X"11",X"38",X"54",X"69",X"42",X"EC",X"45",X"20",X"54",X"F9",X"50", + X"E5",X"2C",X"91",X"38",X"D5",X"78",X"88",X"7A",X"41",X"6F",X"40",X"5C",X"86",X"3B",X"10",X"78", + X"6D",X"4E",X"6F",X"4F",X"6D",X"D3",X"2C",X"15",X"38",X"52",X"69",X"43",X"EB",X"20",X"7C",X"45", + X"D3",X"7C",X"88",X"EF",X"66",X"AE",X"95",X"38",X"47",X"6E",X"E6",X"2C",X"05",X"38",X"C2",X"EF", + X"EE",X"55",X"7B",X"20",X"35",X"30",X"30",X"30",X"30",X"20",X"78",X"54",X"7B",X"BA",X"AA",X"0D", + X"90",X"33",X"98",X"30",X"98",X"10",X"84",X"B9",X"90",X"6B",X"47",X"E9",X"46",X"31",X"88",X"20", + X"20",X"43",X"EF",X"49",X"EE",X"20",X"20",X"20",X"6B",X"52",X"6D",X"44",X"E9",X"D4",X"2C",X"1B", + X"90",X"6B",X"47",X"E9",X"46",X"32",X"88",X"20",X"88",X"6B",X"47",X"E9",X"46",X"20",X"88",X"20", + X"6B",X"52",X"6D",X"44",X"E9",X"D4",X"AF",X"17",X"B8",X"45",X"69",X"53",X"D9",X"0F",X"3F",X"18", + X"45",X"6D",X"C4",X"E9",X"D5",X"CD",X"07",X"3F",X"10",X"E8",X"C1",X"7A",X"E4",X"AF",X"97",X"B8", + X"60",X"69",X"7A",X"6C",X"6D",X"7B",X"5C",X"2C",X"3F",X"30",X"6C",X"61",X"6E",X"6E",X"61",X"6B", + X"D5",X"EC",X"D4",X"D9",X"65",X"45",X"08",X"89",X"CC",X"3B",X"65",X"54",X"09",X"A7",X"9A",X"60", + X"00",X"CD",X"57",X"3B",X"65",X"D6",X"3B",X"CD",X"35",X"3C",X"65",X"B4",X"3C",X"21",X"FA",X"3B", + X"1A",X"60",X"20",X"AF",X"08",X"2B",X"89",X"08",X"93",X"FD",X"65",X"54",X"09",X"F9",X"88",X"D6", + X"96",X"2A",X"65",X"6E",X"3B",X"C9",X"4F",X"C5",X"65",X"78",X"3B",X"C1",X"70",X"10",X"D0",X"C9", + X"86",X"68",X"E5",X"96",X"81",X"65",X"F1",X"A0",X"E1",X"92",X"A0",X"18",X"63",X"C7",X"9F",X"60", + X"18",X"D8",X"AF",X"C9",X"20",X"22",X"38",X"6D",X"78",X"7A",X"67",X"65",X"7B",X"A8",X"7C",X"6D", + X"D3",X"5C",X"00",X"B8",X"90",X"69",X"44",X"EC",X"88",X"7A",X"47",X"ED",X"D3",X"20",X"47",X"CB", + X"20",X"30",X"3E",X"6A",X"69",X"6C",X"A8",X"7A",X"67",X"65",X"5B",X"20",X"26",X"38",X"7A",X"67", + X"45",X"31",X"88",X"EF",X"63",X"A8",X"06",X"3E",X"D2",X"EF",X"45",X"31",X"88",X"6A",X"C1",X"4C", + X"20",X"38",X"38",X"7A",X"67",X"65",X"BA",X"A8",X"67",X"43",X"20",X"38",X"3E",X"7A",X"67",X"65", + X"9A",X"20",X"C2",X"69",X"E4",X"A8",X"92",X"38",X"D2",X"EF",X"45",X"33",X"88",X"EF",X"63",X"A8", + X"3A",X"3E",X"7A",X"67",X"65",X"BB",X"A8",X"6A",X"69",X"4C",X"20",X"3C",X"38",X"7A",X"67",X"65", + X"9C",X"20",X"47",X"CB",X"00",X"3C",X"96",X"7A",X"47",X"ED",X"9C",X"20",X"C2",X"69",X"E4",X"89", + X"28",X"28",X"09",X"28",X"A8",X"CD",X"73",X"3C",X"89",X"D0",X"F7",X"77",X"B6",X"21",X"03",X"3B", + X"08",X"A8",X"1E",X"D7",X"9A",X"60",X"20",X"89",X"B5",X"3B",X"65",X"54",X"09",X"61",X"89",X"28", + X"20",X"29",X"28",X"20",X"45",X"5B",X"3C",X"A9",X"D2",X"7F",X"FF",X"96",X"A9",X"A0",X"3B",X"A0", + X"00",X"B6",X"7F",X"92",X"C8",X"88",X"89",X"82",X"93",X"6D",X"FC",X"A1",X"61",X"81",X"80",X"68", + X"29",X"00",X"20",X"45",X"FB",X"14",X"A9",X"FC",X"F7",X"FF",X"96",X"A9",X"15",X"13",X"A0",X"08", + X"1E",X"D7",X"9A",X"60",X"20",X"81",X"3F",X"3B",X"65",X"54",X"09",X"69",X"89",X"28",X"C8",X"89", + X"D0",X"1F",X"45",X"5B",X"3C",X"A9",X"D6",X"7F",X"FF",X"96",X"A9",X"CA",X"3B",X"A0",X"A8",X"B6", + X"7F",X"92",X"C8",X"88",X"89",X"5C",X"93",X"6D",X"FC",X"A1",X"61",X"27",X"A6",X"83",X"03",X"DF", + X"F0",X"99",X"F2",X"A8",X"57",X"41",X"45",X"E5",X"A0",X"A9",X"28",X"00",X"AA",X"00",X"88",X"45", + X"E6",X"3C",X"89",X"BB",X"80",X"82",X"80",X"88",X"65",X"4E",X"94",X"81",X"80",X"22",X"8A",X"28", + X"88",X"45",X"D8",X"14",X"A9",X"00",X"3C",X"AA",X"28",X"88",X"45",X"D8",X"3C",X"A9",X"28",X"21", + X"8A",X"28",X"20",X"6D",X"70",X"3C",X"89",X"2B",X"06",X"82",X"80",X"88",X"1E",X"3B",X"9A",X"2A", + X"88",X"45",X"47",X"14",X"A9",X"03",X"38",X"AA",X"28",X"88",X"B6",X"17",X"BA",X"02",X"88",X"45", + X"EF",X"3C",X"89",X"2B",X"92",X"82",X"80",X"88",X"1E",X"3E",X"9A",X"2A",X"20",X"6D",X"EF",X"3C", + X"B6",X"3C",X"45",X"46",X"3B",X"41",X"2E",X"24",X"B6",X"10",X"BA",X"02",X"88",X"B6",X"2B",X"45", + X"1C",X"A1",X"65",X"B9",X"09",X"98",X"78",X"69",X"86",X"BC",X"1E",X"38",X"9A",X"2A",X"20",X"B6", + X"2B",X"45",X"B4",X"29",X"38",X"FB",X"41",X"2E",X"3E",X"B6",X"2B",X"45",X"B4",X"29",X"38",X"FB", + X"61",X"6D",X"ED",X"A0",X"1E",X"38",X"9A",X"2A",X"20",X"81",X"53",X"3E",X"91",X"2E",X"84",X"65", + X"5B",X"28",X"00",X"CD",X"4E",X"3D",X"19",X"2E",X"2F",X"ED",X"5B",X"28",X"00",X"CD",X"4E",X"3D", + X"91",X"A9",X"02",X"65",X"EB",X"3D",X"1A",X"68",X"B0",X"EE",X"84",X"80",X"10",X"19",X"01",X"39", + X"65",X"CB",X"3D",X"21",X"7F",X"3E",X"19",X"2E",X"22",X"CD",X"5C",X"3D",X"89",X"71",X"3E",X"11", + X"86",X"39",X"65",X"5C",X"95",X"19",X"88",X"2A",X"86",X"AA",X"06",X"D7",X"1A",X"08",X"B0",X"89", + X"32",X"3E",X"EE",X"A8",X"88",X"20",X"B3",X"28",X"2A",X"15",X"60",X"21",X"37",X"3E",X"57",X"C5", + X"F5",X"19",X"01",X"2F",X"6D",X"5B",X"80",X"88",X"65",X"4E",X"95",X"92",X"A0",X"18",X"89",X"BA", + X"3E",X"E6",X"68",X"20",X"2B",X"21",X"37",X"3E",X"19",X"3B",X"2F",X"ED",X"5B",X"28",X"00",X"CD", + X"E6",X"3D",X"1A",X"48",X"B0",X"19",X"92",X"AA",X"65",X"98",X"95",X"92",X"C0",X"18",X"EE",X"2C", + X"80",X"21",X"92",X"08",X"18",X"11",X"3A",X"39",X"65",X"10",X"3D",X"3E",X"29",X"CD",X"59",X"A0", + X"F1",X"69",X"05",X"88",X"AF",X"18",X"AD",X"61",X"81",X"29",X"84",X"FD",X"89",X"24",X"96",X"A9", + X"80",X"2B",X"89",X"AF",X"3E",X"ED",X"5B",X"28",X"00",X"C5",X"65",X"4E",X"3D",X"C1",X"F9",X"14", + X"63",X"09",X"90",X"47",X"89",X"24",X"96",X"EE",X"A0",X"80",X"83",X"89",X"8F",X"3E",X"6D",X"5B", + X"28",X"00",X"65",X"4E",X"3D",X"C9",X"D6",X"23",X"47",X"E6",X"F7",X"CD",X"B4",X"A1",X"D1",X"E6", + X"A0",X"80",X"FB",X"61",X"86",X"2D",X"ED",X"E5",X"D3",X"28",X"20",X"65",X"E6",X"3D",X"E9",X"1C", + X"18",X"DC",X"61",X"21",X"A2",X"3E",X"E5",X"53",X"28",X"00",X"1C",X"CD",X"4E",X"3D",X"89",X"BB", + X"96",X"E5",X"D3",X"28",X"20",X"1C",X"65",X"4E",X"95",X"89",X"1C",X"3E",X"6D",X"5B",X"80",X"88", + X"3C",X"45",X"4E",X"15",X"A9",X"45",X"3E",X"C5",X"7B",X"00",X"88",X"3C",X"45",X"C6",X"3D",X"A9", + X"46",X"3E",X"6D",X"DB",X"80",X"88",X"65",X"4E",X"95",X"69",X"88",X"20",X"88",X"20",X"A8",X"7B", + X"7C",X"41",X"7A",X"D4",X"20",X"4F",X"CE",X"4F",X"6E",X"C6",X"7D",X"50",X"B2",X"3A",X"B2",X"3A", + X"1A",X"B2",X"3A",X"6C",X"47",X"7F",X"46",X"B2",X"1A",X"B2",X"1A",X"92",X"44",X"6D",X"C6",X"7C", + X"B2",X"3A",X"B2",X"3A",X"92",X"52",X"E9",X"47",X"E8",X"54",X"B2",X"3A",X"B2",X"BA",X"78",X"55", + X"D3",X"E8",X"1A",X"B2",X"1A",X"B2",X"3A",X"78",X"B9",X"78",X"BA",X"78",X"44",X"69",X"51",X"6D", + X"7A",X"20",X"6B",X"4F",X"EE",X"54",X"7A",X"4F",X"EC",X"D3",X"31",X"50",X"20",X"20",X"20",X"20", + X"88",X"20",X"88",X"20",X"9A",X"58",X"FB",X"B6",X"84",X"92",X"83",X"8C",X"65",X"10",X"96",X"B6", + X"B4",X"45",X"DF",X"16",X"A0",X"28",X"F0",X"8F",X"42",X"AE",X"3E",X"BA",X"28",X"8C",X"45",X"16", + X"97",X"8E",X"80",X"7A",X"A9",X"3E",X"65",X"09",X"97",X"8E",X"81",X"5A",X"A9",X"3E",X"65",X"94", + X"3F",X"45",X"9B",X"17",X"A9",X"03",X"8C",X"BC",X"B6",X"20",X"96",X"4A",X"F7",X"16",X"D3",X"41", + X"65",X"45",X"08",X"81",X"E0",X"3E",X"65",X"54",X"09",X"81",X"65",X"3E",X"65",X"54",X"09",X"69", + X"A8",X"00",X"38",X"43",X"EF",X"49",X"EE",X"53",X"20",X"54",X"6D",X"53",X"5C",X"06",X"2A",X"10", + X"C2",X"69",X"C4",X"20",X"88",X"20",X"C7",X"EF",X"47",X"6C",X"88",X"20",X"C2",X"69",X"E4",X"DF", + X"5D",X"45",X"C2",X"16",X"59",X"48",X"3D",X"A8",X"57",X"41",X"3E",X"65",X"36",X"00",X"45",X"F8", + X"96",X"48",X"13",X"F2",X"AF",X"80",X"FF",X"69",X"86",X"28",X"1A",X"08",X"B0",X"A7",X"63",X"E7", + X"68",X"3A",X"48",X"18",X"0E",X"69",X"87",X"CB",X"CF",X"C0",X"0C",X"3A",X"48",X"18",X"87",X"CB", + X"4F",X"68",X"9A",X"70",X"B0",X"61",X"1E",X"2D",X"9A",X"2A",X"24",X"96",X"8C",X"9A",X"81",X"8C", + X"65",X"72",X"3F",X"CD",X"EF",X"3F",X"92",X"2A",X"04",X"90",X"9A",X"2A",X"04",X"CD",X"72",X"3F", + X"65",X"67",X"97",X"D0",X"AF",X"62",X"41",X"3F",X"89",X"29",X"24",X"9D",X"89",X"2A",X"24",X"9D", + X"62",X"61",X"3F",X"CD",X"72",X"3F",X"6B",X"B8",X"3F",X"CD",X"72",X"3F",X"89",X"29",X"04",X"35", + X"E2",X"E9",X"97",X"92",X"82",X"8C",X"AF",X"60",X"9F",X"61",X"86",X"2C",X"06",X"93",X"05",X"88", + X"D5",X"10",X"D1",X"32",X"F8",X"18",X"61",X"06",X"28",X"3A",X"28",X"04",X"F6",X"69",X"6A",X"F1", + X"97",X"92",X"E0",X"18",X"63",X"CF",X"E0",X"0C",X"61",X"92",X"E0",X"18",X"63",X"C7",X"E0",X"0C", + X"61",X"3E",X"AC",X"32",X"29",X"04",X"65",X"72",X"3F",X"CD",X"EF",X"3F",X"D0",X"A7",X"62",X"1B", + X"97",X"9F",X"61",X"89",X"81",X"8C",X"9D",X"6A",X"A6",X"3F",X"61",X"D0",X"86",X"2F",X"AF",X"62", + X"83",X"3F",X"0E",X"25",X"F6",X"29",X"62",X"83",X"3F",X"06",X"3B",X"78",X"9A",X"28",X"00",X"3A", + X"83",X"8C",X"9A",X"29",X"20",X"92",X"80",X"8C",X"65",X"B4",X"09",X"61",X"65",X"67",X"97",X"D0", + X"0E",X"2A",X"AF",X"C8",X"9A",X"F8",X"18",X"18",X"DB",X"CD",X"CD",X"A0",X"65",X"C7",X"3F",X"21", + X"71",X"3F",X"65",X"54",X"09",X"65",X"7D",X"3F",X"61",X"2B",X"80",X"38",X"98",X"20",X"99",X"20", + X"BA",X"A8",X"BB",X"A8",X"A8",X"A8",X"A8",X"A8",X"B8",X"A8",X"B9",X"A8",X"BA",X"A8",X"9B",X"21", + X"F8",X"EF",X"91",X"51",X"47",X"09",X"07",X"28",X"9E",X"28",X"6D",X"B8",X"61",X"89",X"80",X"29", + X"AA",X"00",X"88",X"87",X"BA",X"02",X"88",X"26",X"28",X"45",X"BB",X"18",X"A9",X"0C",X"29",X"AA", + X"80",X"88",X"1E",X"38",X"9A",X"2A",X"20",X"6D",X"13",X"B8",X"61",X"8E",X"90",X"4D",X"8E",X"28", + X"E1",X"45",X"68",X"2B",X"B2",X"02",X"88",X"DD",X"B6",X"10",X"BA",X"02",X"88",X"45",X"E7",X"2C", + X"F9",X"92",X"82",X"88",X"65",X"28",X"09",X"B6",X"80",X"6D",X"1C",X"A1",X"65",X"B4",X"09",X"B4", + X"45",X"3C",X"A1",X"45",X"B4",X"29",X"B4",X"45",X"B4",X"29",X"45",X"3C",X"A1",X"B4",X"45",X"3C", + X"09",X"6D",X"1C",X"A1",X"65",X"60",X"10",X"49",X"89",X"2A",X"20",X"94",X"04",X"98",X"3E",X"69", + X"4D",X"2E",X"AB",X"4B",X"AB",X"29",X"B2",X"C0",X"18",X"A7",X"CE",X"0F",X"A0",X"F8",X"41",X"FF", + X"58",X"07",X"08",X"2E",X"1A",X"B9",X"20",X"07",X"9F",X"68",X"5E",X"83",X"AF",X"A0",X"83",X"F6", + X"90",X"50",X"F0",X"FF",X"A3",X"BE",X"29",X"87",X"41",X"DB",X"A9",X"60",X"8C",X"2C",X"A0",X"14", + X"85",X"6D",X"D8",X"B8",X"18",X"AC",X"89",X"71",X"24",X"6D",X"A2",X"B8",X"89",X"09",X"24",X"6D", + X"0A",X"18",X"D3",X"41",X"BE",X"00",X"87",X"BA",X"70",X"8C",X"BA",X"80",X"8C",X"30",X"53",X"DB", + X"89",X"18",X"24",X"8C",X"08",X"AD",X"85",X"6D",X"D8",X"B8",X"18",X"2D",X"1E",X"D7",X"9A",X"94", + X"8C",X"D3",X"41",X"BE",X"28",X"30",X"D2",X"DB",X"A9",X"A0",X"8C",X"2C",X"A0",X"1A",X"2D",X"B2", + X"C0",X"18",X"0F",X"6B",X"47",X"A0",X"85",X"6D",X"5A",X"B8",X"10",X"2B",X"65",X"70",X"10",X"B0", + X"2D",X"B6",X"D7",X"BA",X"95",X"8C",X"D3",X"41",X"BE",X"00",X"30",X"FA",X"B6",X"01",X"BA",X"41", + X"B0",X"69",X"1E",X"28",X"9A",X"69",X"B0",X"69",X"D7",X"46",X"D8",X"FF",X"07",X"0B",X"57",X"F2", + X"EE",X"27",X"2F",X"83",X"1E",X"28",X"57",X"21",X"3A",X"31",X"11",X"5E",X"8B",X"56",X"65",X"5A", + X"11",X"61",X"C1",X"28",X"C5",X"28",X"41",X"28",X"45",X"28",X"D2",X"28",X"D7",X"28",X"54",X"28", + X"EA",X"28",X"EF",X"28",X"E6",X"28",X"FC",X"28",X"F3",X"28",X"0A",X"28",X"02",X"28",X"1A",X"28", + X"33",X"28",X"AC",X"28",X"2E",X"28",X"39",X"28",X"E4",X"28",X"67",X"28",X"74",X"28",X"69",X"28", + X"DE",X"28",X"2D",X"29",X"3D",X"29",X"AD",X"29",X"BF",X"29",X"61",X"29",X"75",X"29",X"FA",X"29", + X"20",X"29",X"37",X"29",X"38",X"29",X"F2",X"29",X"6D",X"29",X"03",X"2A",X"0A",X"2A",X"43",X"2A", + X"E6",X"2A",X"1B",X"2A",X"92",X"2A",X"CB",X"2A",X"27",X"2B",X"B6",X"2B",X"F8",X"2B",X"8C",X"2B", + X"73",X"2B",X"96",X"2C",X"D4",X"2C",X"B6",X"2C",X"74",X"2C",X"8E",X"2D",X"DC",X"2D",X"E2",X"2D", + X"37",X"2E",X"F5",X"2E",X"C8",X"2E",X"60",X"2F",X"9F",X"2F",X"A5",X"20",X"81",X"20",X"A5",X"21", + X"39",X"A9",X"45",X"AA",X"69",X"AA",X"27",X"AB",X"1F",X"AC",X"7A",X"AC",X"E0",X"AD",X"B1",X"AE", + X"E7",X"27",X"72",X"38",X"7A",X"39",X"72",X"3A",X"FA",X"3B",X"12",X"3C",X"5B",X"3D",X"37",X"3F", + X"5F",X"B8",X"FC",X"B9",X"A0",X"BB",X"8A",X"BD",X"76",X"BE",X"BC",X"20",X"AD",X"22",X"BD",X"24", + X"CC",X"AE",X"BC",X"A1",X"29",X"28",X"29",X"28",X"29",X"28",X"29",X"28",X"29",X"28",X"29",X"28", + X"81",X"28",X"F5",X"92",X"3E",X"8C",X"91",X"DC",X"11",X"6B",X"27",X"A5",X"EE",X"B9",X"7C",X"B9", + X"29",X"32",X"2E",X"32",X"23",X"32",X"89",X"29",X"07",X"D1",X"D3",X"77",X"8B",X"0F",X"07",X"0F", + X"07",X"DF",X"8B",X"D2",X"DF",X"8B",X"07",X"07",X"07",X"07",X"DF",X"61",X"89",X"20",X"27",X"10", + X"C0",X"A9",X"30",X"8F",X"30",X"E3",X"A9",X"28",X"8F",X"30",X"DE",X"A9",X"B0",X"8F",X"30",X"D9", + X"63",X"47",X"10",X"2A",X"63",X"67",X"FD",X"B2",X"3E",X"8C",X"91",X"20",X"12",X"4B",X"27",X"A5", + X"A2",X"1A",X"7B",X"1A",X"F8",X"1A",X"FD",X"1A",X"62",X"1A",X"A9",X"05",X"8F",X"D9",X"43",X"EF", + X"88",X"A8",X"63",X"E7",X"88",X"39",X"EE",X"AF",X"DF",X"69",X"EE",X"AF",X"C7",X"F6",X"A0",X"76", + X"AF",X"B0",X"2A",X"B6",X"AF",X"FF",X"41",X"CE",X"AF",X"6F",X"F6",X"18",X"D6",X"0F",X"B0",X"01", + X"2F",X"D7",X"61",X"81",X"8C",X"8F",X"10",X"5D",X"89",X"34",X"27",X"B8",X"F0",X"81",X"0C",X"8F", + X"30",X"CB",X"A9",X"3C",X"8F",X"30",X"4E",X"DD",X"B2",X"BE",X"8C",X"39",X"71",X"1A",X"4B",X"8F", + X"0D",X"F3",X"12",X"0D",X"12",X"8A",X"12",X"8F",X"12",X"1C",X"12",X"81",X"90",X"8F",X"F9",X"46", + X"2F",X"FF",X"43",X"D6",X"41",X"A9",X"25",X"8F",X"30",X"F4",X"A9",X"35",X"8F",X"30",X"C7",X"A9", + X"0D",X"8F",X"10",X"C2",X"89",X"B5",X"27",X"B8",X"ED",X"92",X"3E",X"8C",X"75",X"F6",X"80",X"07", + X"40",X"CE",X"AF",X"D6",X"29",X"44",X"EB",X"1C",X"55",X"BC",X"AB",X"55",X"F6",X"0B",X"55",X"96", + X"02",X"78",X"75",X"96",X"03",X"28",X"75",X"94",X"01",X"7D",X"63",X"AE",X"C6",X"4C",X"33",X"BC", + X"55",X"F6",X"A9",X"55",X"96",X"08",X"50",X"55",X"BE",X"09",X"28",X"55",X"F6",X"0C",X"43",X"6F", + X"08",X"AC",X"75",X"96",X"04",X"28",X"63",X"F7",X"08",X"2C",X"75",X"96",X"06",X"D7",X"75",X"E6", + X"2A",X"55",X"EE",X"03",X"39",X"E4",X"BA",X"5D",X"F6",X"CD",X"A9",X"2D",X"BB",X"29",X"AB",X"00", + X"6D",X"11",X"08",X"6C",X"7E",X"D0",X"88",X"B8",X"1E",X"AF",X"75",X"6B",X"06",X"6E",X"08",X"2A", + X"96",X"D7",X"75",X"77",X"24",X"DD",X"9E",X"26",X"28",X"3E",X"28",X"CD",X"3E",X"32",X"10",X"21", + X"65",X"D0",X"10",X"75",X"5E",X"AD",X"65",X"3E",X"12",X"E9",X"8B",X"D6",X"75",X"DF",X"00",X"8B", + X"75",X"75",X"2A",X"DD",X"DC",X"2B",X"79",X"21",X"97",X"04",X"63",X"C6",X"61",X"D7",X"D6",X"D5", + X"7C",X"D3",X"7A",X"D1",X"FF",X"56",X"FD",X"54",X"63",X"89",X"63",X"18",X"89",X"6D",X"13",X"01", + X"56",X"23",X"5E",X"EB",X"E1",X"6F",X"34",X"84",X"33",X"B7",X"34",X"BC",X"34",X"A4",X"34",X"73", + X"13",X"98",X"13",X"02",X"13",X"97",X"13",X"3D",X"14",X"22",X"14",X"75",X"9E",X"28",X"80",X"96", + X"28",X"CD",X"3E",X"32",X"75",X"36",X"26",X"28",X"89",X"97",X"04",X"CB",X"6E",X"3A",X"96",X"04", + X"7E",X"2B",X"08",X"2F",X"7E",X"2C",X"08",X"3B",X"E9",X"E9",X"61",X"92",X"91",X"8F",X"FE",X"50", + X"9A",X"39",X"07",X"21",X"94",X"04",X"9E",X"28",X"E9",X"E1",X"61",X"3A",X"3A",X"07",X"FE",X"D8", + X"9A",X"3A",X"27",X"89",X"3D",X"8C",X"10",X"C6",X"E9",X"8B",X"5E",X"8B",X"ED",X"65",X"90",X"BA", + X"E9",X"C9",X"E9",X"23",X"D6",X"23",X"ED",X"CD",X"3C",X"32",X"E9",X"C9",X"E9",X"23",X"75",X"CB", + X"87",X"F6",X"64",X"C6",X"13",X"65",X"78",X"BB",X"1A",X"93",X"24",X"75",X"DF",X"AA",X"61",X"E9", + X"8B",X"DD",X"63",X"2E",X"F6",X"CC",X"44",X"33",X"65",X"5E",X"33",X"C9",X"D6",X"DD",X"DF",X"2E", + X"1D",X"75",X"63",X"2E",X"7E",X"61",X"6B",X"75",X"4E",X"2C",X"75",X"CE",X"85",X"75",X"5E",X"2E", + X"95",X"DD",X"DF",X"2E",X"EE",X"F7",X"68",X"DD",X"63",X"2E",X"96",X"EB",X"8B",X"C9",X"D6",X"DD", + X"DF",X"2F",X"1D",X"75",X"63",X"2F",X"7E",X"61",X"ED",X"65",X"48",X"BC",X"E9",X"E3",X"75",X"C6", + X"2C",X"55",X"EE",X"05",X"55",X"F6",X"2F",X"B5",X"55",X"FF",X"2F",X"CE",X"F7",X"48",X"55",X"43", + X"87",X"96",X"6B",X"83",X"61",X"41",X"8B",X"F6",X"75",X"D7",X"05",X"83",X"ED",X"6D",X"96",X"BA", + X"C9",X"41",X"C9",X"AB",X"F6",X"AB",X"CD",X"45",X"67",X"1A",X"C9",X"41",X"C9",X"AB",X"F6",X"AB", + X"75",X"D7",X"02",X"69",X"E9",X"83",X"5E",X"83",X"75",X"D5",X"84",X"7D",X"DC",X"2D",X"61",X"41", + X"AB",X"F6",X"AB",X"55",X"FF",X"0E",X"41",X"C9",X"AB",X"AB",X"41",X"45",X"E0",X"1C",X"55",X"FB", + X"82",X"7D",X"DA",X"2B",X"1A",X"93",X"24",X"7D",X"DF",X"AA",X"75",X"D7",X"03",X"27",X"75",X"D7", + X"A8",X"55",X"FF",X"06",X"55",X"FF",X"2F",X"41",X"B2",X"BE",X"8C",X"0F",X"3E",X"00",X"77",X"A9", + X"B1",X"BC",X"11",X"FE",X"8B",X"DE",X"6B",X"7D",X"5E",X"28",X"FE",X"AF",X"75",X"D7",X"80",X"7D", + X"F6",X"01",X"0F",X"3E",X"28",X"77",X"31",X"76",X"AB",X"7E",X"55",X"FB",X"2C",X"55",X"FA",X"05", + X"61",X"28",X"D8",X"20",X"D8",X"68",X"D8",X"60",X"D8",X"70",X"D8",X"7D",X"5E",X"A8",X"89",X"13", + X"BC",X"29",X"A8",X"00",X"C5",X"99",X"43",X"A9",X"43",X"38",X"A9",X"BB",X"BC",X"21",X"76",X"AB", + X"D6",X"63",X"69",X"38",X"00",X"2C",X"82",X"29",X"10",X"AC",X"86",X"3D",X"15",X"28",X"15",X"C3", + X"BC",X"CB",X"BC",X"CB",X"BC",X"D0",X"BC",X"D2",X"BC",X"DA",X"BC",X"45",X"40",X"1C",X"30",X"10", + X"10",X"AE",X"75",X"F6",X"01",X"46",X"81",X"48",X"10",X"2E",X"75",X"F6",X"01",X"46",X"83",X"48", + X"B6",X"01",X"45",X"14",X"BA",X"A9",X"97",X"8C",X"43",X"4E",X"41",X"55",X"F6",X"09",X"A9",X"E0", + X"14",X"45",X"7E",X"2D",X"60",X"76",X"02",X"68",X"7E",X"AF",X"60",X"76",X"94",X"68",X"E9",X"69", + X"75",X"7E",X"21",X"21",X"C8",X"34",X"ED",X"FE",X"2B",X"C8",X"F6",X"2E",X"60",X"FE",X"21",X"C8", + X"7E",X"AB",X"60",X"E9",X"61",X"75",X"5E",X"A9",X"89",X"40",X"14",X"ED",X"7E",X"2A",X"60",X"F6", + X"2C",X"C8",X"F6",X"2D",X"60",X"E1",X"61",X"D7",X"D7",X"06",X"2F",X"CD",X"01",X"30",X"96",X"68", + X"65",X"59",X"08",X"65",X"C8",X"BD",X"65",X"75",X"00",X"0E",X"80",X"18",X"7E",X"65",X"AA",X"BD", + X"65",X"80",X"35",X"CD",X"86",X"35",X"65",X"9C",X"35",X"CD",X"92",X"35",X"65",X"48",X"35",X"DD", + X"89",X"00",X"25",X"96",X"85",X"75",X"3E",X"BF",X"88",X"DC",X"1E",X"68",X"65",X"59",X"08",X"61", + X"75",X"21",X"28",X"05",X"19",X"A8",X"28",X"DD",X"9E",X"37",X"28",X"DD",X"9E",X"2D",X"29",X"DD", + X"11",X"75",X"9E",X"BF",X"80",X"75",X"9E",X"2D",X"82",X"75",X"11",X"75",X"9E",X"BF",X"80",X"75", + X"9E",X"2D",X"2B",X"DD",X"11",X"DD",X"9E",X"37",X"28",X"DD",X"9E",X"2D",X"2C",X"DD",X"11",X"DD", + X"9E",X"BF",X"80",X"75",X"9E",X"2D",X"85",X"75",X"11",X"75",X"9E",X"BF",X"80",X"75",X"9E",X"2D", + X"2E",X"C9",X"75",X"21",X"28",X"05",X"10",X"34",X"75",X"21",X"A8",X"05",X"10",X"3E",X"75",X"21", + X"C0",X"8D",X"10",X"38",X"75",X"89",X"C8",X"8D",X"10",X"AA",X"75",X"89",X"A0",X"8D",X"10",X"2C", + X"75",X"21",X"88",X"05",X"19",X"D1",X"35",X"3A",X"31",X"00",X"AF",X"28",X"25",X"CD",X"07",X"A0", + X"91",X"41",X"15",X"F6",X"02",X"90",X"83",X"19",X"6D",X"BD",X"75",X"D6",X"17",X"6B",X"27",X"A5", + X"61",X"2D",X"36",X"C8",X"35",X"4C",X"36",X"54",X"A8",X"4C",X"36",X"C8",X"35",X"7C",X"36",X"C8", + X"15",X"7A",X"17",X"40",X"15",X"DC",X"88",X"40",X"15",X"9C",X"16",X"40",X"15",X"18",X"17",X"EE", + X"20",X"E0",X"BD",X"E0",X"BD",X"55",X"BE",X"00",X"28",X"55",X"BE",X"01",X"98",X"55",X"BE",X"02", + X"00",X"7D",X"5E",X"2D",X"1C",X"B4",X"75",X"D7",X"83",X"6D",X"8E",X"BE",X"75",X"F6",X"85",X"76", + X"29",X"48",X"55",X"BC",X"BF",X"41",X"55",X"BE",X"2C",X"03",X"55",X"BE",X"2E",X"0A",X"55",X"BE", + X"87",X"28",X"75",X"96",X"00",X"D7",X"75",X"96",X"01",X"28",X"75",X"96",X"02",X"28",X"75",X"96", + X"AB",X"00",X"45",X"8F",X"A0",X"27",X"B5",X"55",X"FF",X"1E",X"45",X"AB",X"B1",X"45",X"CE",X"33", + X"75",X"94",X"17",X"69",X"89",X"0C",X"16",X"6D",X"CC",X"BE",X"75",X"F6",X"85",X"76",X"81",X"48", + X"55",X"BC",X"BF",X"41",X"55",X"F6",X"2D",X"B5",X"2F",X"2F",X"3E",X"00",X"77",X"31",X"F6",X"AB", + X"75",X"D7",X"80",X"F6",X"8B",X"7D",X"DF",X"29",X"5E",X"83",X"75",X"D7",X"82",X"F6",X"8B",X"7D", + X"FF",X"03",X"30",X"A2",X"28",X"98",X"A8",X"09",X"70",X"88",X"70",X"10",X"08",X"88",X"70",X"10", + X"D8",X"98",X"D8",X"38",X"A0",X"98",X"D8",X"38",X"D8",X"18",X"F8",X"AB",X"89",X"84",X"16",X"6D", + X"64",X"1E",X"55",X"F6",X"2D",X"D6",X"2C",X"58",X"55",X"BC",X"BF",X"41",X"28",X"28",X"A8",X"0A", + X"80",X"78",X"00",X"AB",X"80",X"70",X"00",X"29",X"80",X"A8",X"00",X"AB",X"80",X"B8",X"00",X"AD", + X"28",X"38",X"A8",X"0C",X"45",X"F0",X"BE",X"55",X"BC",X"07",X"55",X"F6",X"2F",X"55",X"96",X"06", + X"70",X"7D",X"9E",X"2F",X"80",X"B6",X"10",X"7D",X"3E",X"28",X"64",X"3F",X"17",X"B6",X"B8",X"7D", + X"96",X"00",X"44",X"24",X"BF",X"B6",X"50",X"55",X"96",X"00",X"44",X"4E",X"BF",X"4B",X"5F",X"3D", + X"1A",X"24",X"20",X"46",X"17",X"48",X"86",X"28",X"75",X"F6",X"17",X"76",X"84",X"80",X"01",X"7D", + X"D6",X"36",X"F6",X"2B",X"88",X"2A",X"0E",X"B2",X"75",X"34",X"24",X"DD",X"D6",X"24",X"EE",X"2B", + X"E0",X"75",X"9C",X"AC",X"E3",X"0D",X"19",X"75",X"ED",X"19",X"88",X"28",X"75",X"11",X"75",X"9C", + X"37",X"DD",X"E9",X"C9",X"75",X"7E",X"2D",X"FE",X"29",X"C0",X"75",X"E5",X"75",X"34",X"37",X"11", + X"88",X"28",X"75",X"11",X"75",X"9C",X"17",X"75",X"11",X"75",X"9C",X"BF",X"75",X"11",X"75",X"9C", + X"37",X"DD",X"11",X"DD",X"9C",X"37",X"75",X"19",X"75",X"34",X"37",X"DD",X"E9",X"C9",X"75",X"34", + X"17",X"61",X"75",X"D6",X"85",X"F6",X"81",X"64",X"F8",X"BE",X"75",X"9C",X"87",X"75",X"5E",X"2F", + X"75",X"BE",X"2E",X"D8",X"75",X"36",X"2F",X"28",X"96",X"E8",X"75",X"BE",X"28",X"CC",X"F3",X"37", + X"1E",X"50",X"75",X"B6",X"80",X"64",X"46",X"BF",X"E3",X"5F",X"1D",X"65",X"8C",X"BF",X"75",X"ED", + X"75",X"21",X"88",X"05",X"75",X"34",X"37",X"DD",X"9C",X"37",X"75",X"E1",X"75",X"35",X"37",X"C9", + X"65",X"44",X"17",X"75",X"9C",X"2F",X"75",X"D6",X"87",X"75",X"3E",X"2E",X"70",X"75",X"9E",X"2F", + X"28",X"CD",X"4D",X"37",X"96",X"D7",X"75",X"BE",X"28",X"CC",X"22",X"A8",X"96",X"60",X"75",X"BE", + X"80",X"64",X"9A",X"20",X"89",X"57",X"17",X"75",X"5E",X"28",X"81",X"3B",X"80",X"E5",X"B9",X"64", + X"B5",X"A8",X"6B",X"5F",X"B5",X"DD",X"D6",X"2D",X"F6",X"29",X"68",X"DD",X"D6",X"28",X"EE",X"2F", + X"E0",X"0E",X"96",X"06",X"87",X"75",X"63",X"28",X"56",X"80",X"85",X"65",X"E2",X"EB",X"10",X"2B", + X"65",X"50",X"63",X"C9",X"75",X"7E",X"2D",X"FE",X"2A",X"CA",X"D8",X"36",X"92",X"AC",X"00",X"E6", + X"17",X"68",X"86",X"3A",X"E3",X"A8",X"17",X"B0",X"C0",X"E8",X"D0",X"F8",X"C8",X"E0",X"D8",X"F0", + X"A8",X"28",X"B8",X"38",X"88",X"20",X"98",X"30",X"E8",X"68",X"7D",X"CD",X"7D",X"94",X"37",X"7D", + X"21",X"C0",X"8D",X"91",X"20",X"88",X"DD",X"9C",X"BF",X"75",X"34",X"BF",X"DD",X"11",X"DD",X"9C", + X"37",X"7D",X"94",X"BF",X"7D",X"31",X"7D",X"94",X"37",X"7D",X"94",X"BF",X"7D",X"C9",X"6D",X"9D", + X"2E",X"61",X"DD",X"5E",X"2D",X"7E",X"29",X"60",X"D6",X"8C",X"58",X"E9",X"C9",X"07",X"AF",X"07", + X"46",X"BF",X"5E",X"8A",X"E7",X"86",X"A6",X"82",X"A0",X"28",X"6D",X"88",X"01",X"69",X"6D",X"44", + X"BF",X"75",X"34",X"8F",X"DD",X"5E",X"2F",X"75",X"96",X"8E",X"D8",X"75",X"36",X"8F",X"28",X"65", + X"ED",X"BF",X"7D",X"56",X"A0",X"CE",X"A7",X"6C",X"8C",X"80",X"7D",X"56",X"A0",X"5E",X"41",X"6C", + X"0D",X"80",X"DD",X"5E",X"28",X"7E",X"A0",X"64",X"1B",X"80",X"DD",X"5E",X"28",X"7E",X"D0",X"64", + X"38",X"80",X"4B",X"5F",X"15",X"7D",X"F6",X"A9",X"07",X"E8",X"7D",X"96",X"A4",X"8A",X"7D",X"96", + X"A9",X"77",X"C9",X"75",X"36",X"8C",X"2B",X"61",X"DD",X"9C",X"BF",X"75",X"F6",X"8D",X"D6",X"8E", + X"7D",X"94",X"37",X"69",X"7D",X"56",X"A0",X"27",X"AF",X"27",X"46",X"BF",X"5E",X"89",X"76",X"8B", + X"D8",X"7E",X"B8",X"F0",X"E7",X"8E",X"29",X"8A",X"28",X"28",X"B6",X"AE",X"DD",X"63",X"2C",X"CE", + X"80",X"8A",X"B6",X"88",X"8E",X"A8",X"4D",X"6D",X"05",X"A1",X"6D",X"B9",X"01",X"E9",X"98",X"56", + X"C9",X"8E",X"28",X"75",X"E6",X"BE",X"A1",X"11",X"FE",X"8B",X"7E",X"61",X"39",X"60",X"20",X"65", + X"F9",X"80",X"7D",X"56",X"23",X"EB",X"2F",X"A5",X"58",X"80",X"64",X"81",X"A8",X"81",X"18",X"81", + X"CC",X"81",X"65",X"82",X"CC",X"81",X"65",X"82",X"30",X"81",X"D2",X"B7",X"E6",X"C8",X"BF",X"C8", + X"46",X"48",X"5A",X"97",X"46",X"48",X"37",X"48",X"46",X"48",X"10",X"89",X"5A",X"97",X"46",X"48", + X"BF",X"40",X"E6",X"40",X"D2",X"3F",X"E6",X"40",X"BF",X"40",X"E6",X"40",X"68",X"21",X"D2",X"3F", + X"46",X"48",X"37",X"48",X"46",X"48",X"5A",X"97",X"46",X"48",X"37",X"48",X"46",X"48",X"60",X"89", + X"DD",X"36",X"2C",X"01",X"DD",X"34",X"AB",X"C9",X"DD",X"36",X"2C",X"02",X"DD",X"34",X"AB",X"C9", + X"75",X"36",X"A4",X"0B",X"75",X"34",X"23",X"C9",X"75",X"34",X"37",X"C9",X"E0",X"89",X"5A",X"97", + X"E6",X"40",X"BF",X"40",X"E6",X"40",X"D2",X"3F",X"E6",X"40",X"BF",X"40",X"E6",X"40",X"70",X"21", + X"46",X"48",X"54",X"89",X"46",X"48",X"D0",X"89",X"46",X"48",X"54",X"89",X"46",X"48",X"60",X"89", + X"2E",X"78",X"DD",X"70",X"2A",X"CD",X"83",X"39",X"DD",X"34",X"AB",X"C9",X"2E",X"7C",X"B8",X"F2", + X"2E",X"89",X"8A",X"89",X"2E",X"89",X"0D",X"89",X"2E",X"89",X"E0",X"89",X"60",X"89",X"75",X"CB", + X"A9",X"46",X"CC",X"99",X"21",X"CD",X"0A",X"40",X"C9",X"DD",X"36",X"0A",X"AA",X"DD",X"36",X"09", + X"27",X"C9",X"75",X"36",X"A2",X"3C",X"65",X"A3",X"11",X"DD",X"9C",X"03",X"61",X"DD",X"9E",X"0A", + X"3A",X"CD",X"83",X"39",X"DD",X"34",X"AB",X"C9",X"8E",X"21",X"30",X"21",X"8E",X"21",X"68",X"21", + X"EC",X"89",X"60",X"89",X"75",X"36",X"24",X"08",X"75",X"34",X"23",X"C9",X"E0",X"8A",X"2E",X"89", + X"AC",X"22",X"E6",X"40",X"BB",X"22",X"E6",X"40",X"AC",X"22",X"E6",X"40",X"BB",X"22",X"8E",X"21", + X"24",X"8A",X"46",X"48",X"33",X"8A",X"46",X"48",X"24",X"8A",X"46",X"48",X"33",X"8A",X"2E",X"89", + X"8E",X"21",X"A2",X"22",X"8E",X"21",X"35",X"22",X"AC",X"22",X"E6",X"40",X"BB",X"22",X"E6",X"40", + X"24",X"82",X"46",X"C8",X"33",X"82",X"2E",X"81",X"BF",X"82",X"60",X"81",X"7D",X"96",X"A0",X"D2", + X"DD",X"9E",X"29",X"1A",X"CD",X"6E",X"33",X"75",X"34",X"AB",X"C9",X"75",X"36",X"88",X"70",X"75", + X"96",X"89",X"B8",X"6D",X"6E",X"93",X"7D",X"94",X"23",X"69",X"7D",X"96",X"A2",X"54",X"6D",X"23", + X"B1",X"75",X"34",X"AB",X"C9",X"75",X"36",X"8A",X"50",X"65",X"83",X"B1",X"DD",X"9C",X"AB",X"61", + X"86",X"9B",X"A6",X"AC",X"82",X"88",X"28",X"16",X"B2",X"92",X"A2",X"28",X"B6",X"18",X"8E",X"8C", + X"CD",X"B4",X"A1",X"1C",X"38",X"72",X"CD",X"83",X"A1",X"86",X"2C",X"65",X"B4",X"A1",X"B4",X"90", + X"5A",X"7D",X"94",X"AB",X"69",X"C8",X"82",X"1F",X"82",X"2E",X"81",X"2E",X"81",X"2E",X"81",X"06", + X"22",X"15",X"22",X"E6",X"68",X"48",X"22",X"E6",X"68",X"15",X"22",X"E6",X"68",X"1F",X"22",X"2E", + X"81",X"2E",X"81",X"06",X"82",X"15",X"82",X"E6",X"E0",X"48",X"82",X"2E",X"81",X"2E",X"81",X"15", + X"22",X"E6",X"68",X"1F",X"22",X"E8",X"21",X"75",X"36",X"88",X"28",X"75",X"36",X"89",X"28",X"65", + X"6E",X"93",X"7D",X"94",X"23",X"69",X"7D",X"96",X"A0",X"F6",X"7D",X"96",X"A1",X"28",X"6D",X"6E", + X"33",X"75",X"34",X"AB",X"C9",X"75",X"36",X"8A",X"C0",X"65",X"83",X"B1",X"DD",X"9C",X"AB",X"61", + X"7D",X"96",X"A2",X"64",X"6D",X"23",X"11",X"7D",X"94",X"AB",X"69",X"6D",X"31",X"83",X"6D",X"85", + X"23",X"65",X"60",X"BD",X"CD",X"D5",X"A8",X"86",X"28",X"90",X"D6",X"90",X"D6",X"1A",X"24",X"28", + X"07",X"80",X"A6",X"12",X"85",X"28",X"6D",X"74",X"84",X"6D",X"16",X"83",X"6D",X"CC",X"83",X"6D", + X"EA",X"83",X"CD",X"D8",X"23",X"65",X"7E",X"83",X"CD",X"FC",X"23",X"75",X"F6",X"BF",X"D6",X"8A", + X"88",X"7A",X"96",X"48",X"65",X"79",X"00",X"CD",X"4C",X"8C",X"65",X"06",X"83",X"C9",X"A7",X"32", + X"6F",X"90",X"32",X"42",X"18",X"32",X"6E",X"90",X"C9",X"B6",X"29",X"32",X"6F",X"90",X"32",X"42", + X"B8",X"32",X"E6",X"38",X"61",X"21",X"A0",X"2C",X"19",X"09",X"AC",X"29",X"5E",X"0B",X"9E",X"18", + X"C5",X"10",X"21",X"00",X"60",X"39",X"28",X"80",X"29",X"00",X"2C",X"C5",X"10",X"C9",X"DD",X"21", + X"A0",X"25",X"10",X"14",X"75",X"21",X"80",X"25",X"10",X"1E",X"75",X"21",X"E0",X"25",X"10",X"18", + X"DD",X"21",X"60",X"8D",X"B8",X"0A",X"DD",X"21",X"08",X"8D",X"B8",X"04",X"DD",X"21",X"00",X"8D", + X"75",X"F6",X"37",X"39",X"41",X"8B",X"6B",X"27",X"05",X"DB",X"83",X"EF",X"83",X"C7",X"83",X"CD", + X"D7",X"23",X"C9",X"21",X"17",X"23",X"DD",X"F6",X"2D",X"B5",X"0F",X"0F",X"0F",X"3E",X"28",X"FF", + X"11",X"F6",X"75",X"77",X"A0",X"23",X"D6",X"DD",X"DF",X"09",X"8B",X"F6",X"2F",X"0F",X"75",X"77", + X"2A",X"23",X"F6",X"DD",X"77",X"03",X"23",X"F6",X"DD",X"77",X"2C",X"23",X"F6",X"DD",X"77",X"06", + X"8B",X"DD",X"9E",X"0F",X"A0",X"F6",X"75",X"77",X"B0",X"23",X"D6",X"DD",X"DF",X"19",X"8B",X"DD", + X"36",X"12",X"28",X"DD",X"34",X"1F",X"C9",X"78",X"78",X"0E",X"2A",X"01",X"AC",X"00",X"E0",X"78", + X"F0",X"06",X"A3",X"09",X"24",X"08",X"43",X"D0",X"F0",X"06",X"A4",X"09",X"24",X"08",X"41",X"D0", + X"78",X"0E",X"2D",X"01",X"AC",X"20",X"E2",X"78",X"78",X"0E",X"A8",X"01",X"AC",X"00",X"E5",X"78", + X"F0",X"06",X"24",X"09",X"24",X"08",X"46",X"CD",X"5F",X"8B",X"75",X"34",X"A7",X"DD",X"D6",X"0F", + X"DD",X"96",X"2E",X"D8",X"DD",X"36",X"2F",X"00",X"CD",X"35",X"24",X"CD",X"00",X"24",X"C9",X"B2", + X"84",X"28",X"46",X"8F",X"48",X"7D",X"94",X"AC",X"7D",X"56",X"A2",X"CE",X"58",X"7D",X"6B",X"AC", + X"7E",X"88",X"2A",X"63",X"5F",X"75",X"77",X"8A",X"DD",X"5E",X"2C",X"7E",X"2B",X"88",X"2C",X"75", + X"6B",X"8A",X"6E",X"7D",X"6B",X"9A",X"E6",X"00",X"A4",X"7D",X"6B",X"8A",X"6E",X"6D",X"0B",X"B1", + X"C9",X"65",X"0D",X"B1",X"C9",X"75",X"E6",X"98",X"DD",X"CE",X"39",X"5E",X"6F",X"EE",X"48",X"88", + X"26",X"50",X"46",X"8F",X"7D",X"D7",X"A4",X"83",X"7D",X"D5",X"B0",X"7D",X"D4",X"99",X"69",X"A7", + X"2F",X"EE",X"2B",X"91",X"E0",X"84",X"CD",X"2F",X"A5",X"75",X"E6",X"98",X"DD",X"CE",X"39",X"8B", + X"7D",X"D5",X"B0",X"7D",X"D4",X"99",X"B8",X"6D",X"3F",X"84",X"D5",X"84",X"2E",X"84",X"D0",X"84", + X"DD",X"9C",X"BF",X"E9",X"C9",X"75",X"E6",X"98",X"DD",X"CE",X"39",X"5E",X"0F",X"A7",X"0F",X"75", + X"D7",X"8A",X"7D",X"96",X"B2",X"88",X"6B",X"46",X"68",X"7D",X"96",X"9A",X"5F",X"69",X"7D",X"46", + X"38",X"75",X"66",X"99",X"F6",X"EE",X"AF",X"75",X"77",X"8E",X"DD",X"9E",X"2F",X"88",X"C9",X"61", + X"81",X"35",X"84",X"CD",X"7D",X"56",X"A4",X"B1",X"0D",X"84",X"4B",X"2F",X"05",X"48",X"84",X"4C", + X"24",X"68",X"24",X"6C",X"24",X"58",X"24",X"5F",X"24",X"7E",X"24",X"45",X"24",X"E3",X"CE",X"93", + X"7D",X"95",X"A1",X"69",X"7D",X"94",X"A1",X"69",X"7D",X"95",X"A0",X"69",X"7D",X"94",X"A0",X"69", + X"CD",X"48",X"24",X"65",X"CC",X"84",X"C9",X"65",X"48",X"84",X"CD",X"68",X"24",X"61",X"CD",X"4C", + X"84",X"6D",X"6C",X"84",X"69",X"6D",X"EC",X"84",X"6D",X"68",X"84",X"69",X"8E",X"AC",X"4D",X"50", + X"CD",X"74",X"24",X"1E",X"A9",X"65",X"59",X"A0",X"49",X"90",X"53",X"61",X"46",X"AF",X"56",X"98", + X"89",X"48",X"AC",X"39",X"B5",X"08",X"06",X"14",X"0E",X"03",X"DF",X"23",X"18",X"F4",X"11",X"AD", + X"20",X"F6",X"21",X"C0",X"0F",X"2E",X"B7",X"77",X"23",X"38",X"D4",X"C9",X"7B",X"4E",X"EF",X"2D", + X"E2",X"4D",X"E5",X"88",X"E4",X"41",X"F3",X"58",X"64",X"49",X"71",X"88",X"80",X"4A",X"71",X"88", + X"EE",X"41",X"EB",X"41",X"EB",X"55",X"ED",X"41",X"20",X"41",X"EB",X"49",X"7A",X"41",X"D7",X"FF", + X"89",X"78",X"A7",X"22",X"70",X"20",X"8A",X"5A",X"28",X"22",X"64",X"20",X"8A",X"4E",X"28",X"22", + X"68",X"88",X"21",X"42",X"88",X"39",X"2E",X"00",X"B6",X"01",X"2E",X"05",X"77",X"B9",X"38",X"FC", + X"89",X"53",X"28",X"B6",X"E1",X"CD",X"29",X"8D",X"89",X"5D",X"28",X"B6",X"63",X"CD",X"29",X"8D", + X"21",X"4F",X"88",X"B6",X"E9",X"CD",X"89",X"25",X"21",X"49",X"88",X"B6",X"7A",X"CD",X"89",X"25", + X"89",X"4B",X"28",X"B6",X"E1",X"CD",X"29",X"8D",X"61",X"77",X"8B",X"77",X"8B",X"77",X"61",X"CD", + X"E8",X"26",X"B2",X"5F",X"88",X"D6",X"2E",X"C8",X"CD",X"E5",X"A0",X"CD",X"17",X"31",X"2E",X"09", + X"65",X"21",X"30",X"CD",X"3E",X"8E",X"89",X"12",X"00",X"2E",X"20",X"CD",X"53",X"8F",X"89",X"0E", + X"2E",X"22",X"28",X"88",X"B6",X"10",X"32",X"02",X"88",X"CD",X"8D",X"26",X"C3",X"CD",X"68",X"2B", + X"65",X"5C",X"04",X"B6",X"90",X"CD",X"14",X"81",X"89",X"07",X"A6",X"22",X"A0",X"20",X"65",X"27", + X"A0",X"26",X"28",X"E7",X"CD",X"40",X"A3",X"CD",X"E7",X"2C",X"21",X"16",X"2E",X"22",X"28",X"88", + X"96",X"49",X"0E",X"0B",X"65",X"94",X"01",X"38",X"5B",X"B2",X"77",X"20",X"95",X"6F",X"2F",X"08", + X"4E",X"0E",X"7F",X"BE",X"3E",X"5D",X"D5",X"41",X"DD",X"21",X"3E",X"06",X"BE",X"02",X"C5",X"7B", + X"A0",X"28",X"B6",X"B8",X"8E",X"9F",X"6D",X"A5",X"01",X"B0",X"5B",X"12",X"77",X"28",X"CF",X"16", + X"2D",X"B0",X"0F",X"C7",X"0F",X"A0",X"3E",X"88",X"FF",X"89",X"6B",X"28",X"B9",X"ED",X"CD",X"6F", + X"86",X"C9",X"B2",X"FE",X"28",X"D7",X"83",X"7D",X"83",X"5D",X"83",X"CD",X"6D",X"6F",X"86",X"C9", + X"B2",X"FE",X"88",X"DF",X"23",X"75",X"23",X"7D",X"23",X"ED",X"CD",X"6F",X"26",X"E9",X"B2",X"FE", + X"28",X"D7",X"B6",X"08",X"6D",X"59",X"00",X"69",X"B6",X"8E",X"92",X"FF",X"28",X"6D",X"2D",X"86", + X"A2",X"C8",X"88",X"65",X"99",X"A5",X"58",X"1E",X"2D",X"9A",X"FF",X"28",X"A2",X"CE",X"88",X"65", + X"39",X"A5",X"58",X"16",X"A4",X"92",X"77",X"28",X"A2",X"EC",X"28",X"6D",X"39",X"A5",X"58",X"16", + X"2B",X"9A",X"FF",X"28",X"A2",X"DA",X"88",X"65",X"99",X"A5",X"58",X"1E",X"2A",X"9A",X"FF",X"28", + X"A2",X"F8",X"28",X"6D",X"39",X"A5",X"58",X"16",X"A1",X"92",X"77",X"28",X"69",X"12",X"B6",X"28", + X"CB",X"C7",X"A0",X"8D",X"C5",X"53",X"38",X"28",X"C9",X"6D",X"FB",X"AE",X"88",X"61",X"39",X"C8", + X"28",X"81",X"E6",X"28",X"B2",X"FF",X"28",X"E7",X"B6",X"8D",X"18",X"00",X"21",X"AF",X"CF",X"AF", + X"08",X"86",X"28",X"47",X"C5",X"B8",X"C3",X"ED",X"CD",X"2D",X"26",X"E9",X"73",X"8B",X"72",X"8B", + X"45",X"6D",X"2F",X"A0",X"41",X"D7",X"83",X"16",X"80",X"D7",X"83",X"D7",X"83",X"D7",X"69",X"16", + X"38",X"9A",X"2A",X"28",X"21",X"FE",X"88",X"9E",X"69",X"65",X"7E",X"87",X"B6",X"AA",X"CD",X"59", + X"00",X"A6",X"24",X"ED",X"6D",X"73",X"02",X"07",X"49",X"CE",X"2C",X"00",X"A7",X"16",X"A1",X"6D", + X"59",X"A0",X"38",X"67",X"CD",X"73",X"A2",X"0F",X"CB",X"5F",X"20",X"EE",X"CB",X"D7",X"20",X"90", + X"63",X"FF",X"88",X"91",X"92",X"C8",X"2C",X"07",X"88",X"00",X"E9",X"41",X"96",X"48",X"65",X"79", + X"A0",X"C9",X"CD",X"75",X"A8",X"B2",X"25",X"88",X"46",X"07",X"20",X"D8",X"2E",X"10",X"B2",X"25", + X"28",X"CB",X"57",X"20",X"A2",X"2E",X"B6",X"F0",X"9A",X"0A",X"28",X"CD",X"F6",X"8F",X"10",X"6C", + X"21",X"5E",X"88",X"35",X"B6",X"40",X"96",X"20",X"00",X"36",X"FB",X"B8",X"9C",X"21",X"FE",X"88", + X"9C",X"B6",X"74",X"96",X"88",X"3B",X"9E",X"49",X"10",X"27",X"65",X"CB",X"87",X"B6",X"30",X"32", + X"2A",X"88",X"CD",X"56",X"27",X"C9",X"DD",X"45",X"41",X"22",X"28",X"88",X"B2",X"5E",X"88",X"CD", + X"14",X"81",X"61",X"B6",X"30",X"32",X"A2",X"20",X"F5",X"45",X"10",X"E4",X"89",X"FF",X"87",X"2E", + X"2A",X"CD",X"54",X"29",X"38",X"FB",X"21",X"45",X"A0",X"2E",X"2E",X"CD",X"54",X"29",X"38",X"FB", + X"96",X"19",X"9A",X"0A",X"28",X"39",X"A6",X"06",X"89",X"50",X"28",X"CD",X"9B",X"8F",X"19",X"0E", + X"39",X"21",X"7A",X"88",X"CD",X"B3",X"27",X"39",X"2E",X"14",X"21",X"4C",X"88",X"CD",X"13",X"27", + X"19",X"0E",X"B7",X"21",X"E6",X"20",X"65",X"BB",X"87",X"39",X"A6",X"12",X"89",X"48",X"28",X"CD", + X"13",X"27",X"C9",X"C5",X"7B",X"00",X"88",X"FE",X"23",X"7E",X"23",X"45",X"C3",X"CD",X"68",X"2B", + X"65",X"5C",X"04",X"B6",X"90",X"CD",X"14",X"81",X"0E",X"0B",X"65",X"08",X"01",X"38",X"5B",X"41", + X"F6",X"23",X"45",X"26",X"28",X"E7",X"CD",X"40",X"A3",X"CD",X"E7",X"2C",X"2E",X"05",X"CD",X"00", + X"01",X"38",X"5B",X"41",X"65",X"E0",X"87",X"C9",X"D6",X"CD",X"14",X"81",X"8B",X"F6",X"65",X"94", + X"A1",X"23",X"F6",X"CD",X"B4",X"29",X"C9",X"07",X"A8",X"18",X"7C",X"4F",X"6C",X"41",X"F9",X"3E", + X"F3",X"80",X"80",X"CA",X"E5",X"DB",X"F4",X"80",X"9D",X"8F",X"A5",X"98",X"64",X"E9",X"F3",X"DC", + X"20",X"EF",X"6E",X"80",X"78",X"EC",X"69",X"F9",X"6D",X"5A",X"2D",X"8A",X"B8",X"CD",X"EE",X"DC", + X"E5",X"DA",X"80",X"F9",X"67",X"DD",X"F2",X"80",X"61",X"EE",X"61",X"DC",X"61",X"C9",X"64",X"5B", + X"2F",X"8C",X"3F",X"DB",X"6B",X"EF",X"7A",X"CD",X"20",X"80",X"20",X"C9",X"6B",X"DC",X"20",X"80", + X"80",X"EE",X"E1",X"ED",X"ED",X"8F",X"23",X"B9",X"F3",X"CB",X"67",X"DA",X"E5",X"80",X"80",X"80", + X"69",X"CB",X"7C",X"80",X"20",X"80",X"EE",X"C9",X"ED",X"4D",X"2A",X"AE",X"39",X"91",X"7B",X"5C", + X"A2",X"99",X"B1",X"92",X"66",X"4C",X"A2",X"9C",X"B1",X"93",X"F2",X"4C",X"A2",X"9F",X"B1",X"94", + X"7C",X"68",X"2A",X"BA",X"39",X"95",X"7C",X"68",X"2E",X"88",X"B2",X"B8",X"88",X"63",X"6F",X"08", + X"21",X"12",X"B6",X"28",X"6B",X"E7",X"A0",X"8A",X"8E",X"77",X"F0",X"92",X"E3",X"18",X"69",X"81", + X"3A",X"28",X"B2",X"9E",X"88",X"63",X"6F",X"08",X"2B",X"89",X"3B",X"28",X"F6",X"61",X"21",X"9C", + X"28",X"12",X"B6",X"28",X"6B",X"E7",X"A0",X"8B",X"81",X"9D",X"28",X"56",X"46",X"F7",X"69",X"12", + X"B9",X"28",X"07",X"60",X"B2",X"9E",X"88",X"63",X"6F",X"08",X"AB",X"0A",X"38",X"28",X"B9",X"8A", + X"B0",X"28",X"6D",X"84",X"04",X"69",X"A2",X"AE",X"28",X"31",X"82",X"AE",X"28",X"6D",X"0E",X"A3", + X"C9",X"9A",X"20",X"28",X"B2",X"80",X"88",X"AF",X"20",X"72",X"C9",X"9A",X"21",X"28",X"B2",X"81", + X"28",X"8F",X"80",X"72",X"69",X"81",X"A0",X"08",X"99",X"89",X"A8",X"A1",X"5E",X"8B",X"96",X"80", + X"C5",X"B8",X"21",X"88",X"0C",X"91",X"29",X"0C",X"29",X"76",X"2B",X"9E",X"28",X"6D",X"10",X"61", + X"FD",X"B6",X"80",X"CD",X"14",X"81",X"F9",X"C9",X"6D",X"2E",X"A3",X"55",X"ED",X"21",X"A0",X"20", + X"F6",X"18",X"77",X"23",X"34",X"41",X"51",X"49",X"C9",X"4D",X"2E",X"01",X"B8",X"ED",X"4D",X"2E", + X"A2",X"B8",X"48",X"4D",X"0E",X"0C",X"10",X"EB",X"6D",X"2E",X"32",X"B8",X"7E",X"55",X"6D",X"5D", + X"45",X"55",X"C5",X"EB",X"28",X"88",X"CD",X"6F",X"A1",X"51",X"B8",X"13",X"55",X"4D",X"5D",X"45", + X"FD",X"C5",X"43",X"08",X"28",X"CD",X"47",X"81",X"F9",X"77",X"92",X"0A",X"28",X"46",X"37",X"39", + X"28",X"04",X"B9",X"77",X"F1",X"B4",X"EF",X"D6",X"BD",X"B0",X"AB",X"AE",X"28",X"F0",X"B4",X"6F", + X"F6",X"8C",X"90",X"0A",X"0E",X"08",X"E5",X"6B",X"A0",X"20",X"E9",X"59",X"69",X"51",X"61",X"F0", + X"D6",X"20",X"30",X"15",X"F1",X"D6",X"BC",X"30",X"B1",X"0F",X"3E",X"00",X"FF",X"21",X"16",X"29", + X"11",X"FE",X"8B",X"7E",X"8E",X"08",X"C0",X"B9",X"61",X"D6",X"82",X"30",X"24",X"21",X"A2",X"28", + X"CB",X"6F",X"A0",X"03",X"21",X"22",X"08",X"B8",X"AE",X"D6",X"24",X"30",X"3D",X"21",X"4A",X"83", + X"63",X"6F",X"80",X"0B",X"89",X"EA",X"AB",X"B6",X"33",X"91",X"90",X"0E",X"39",X"3E",X"A0",X"FF", + X"B9",X"C9",X"21",X"00",X"08",X"C9",X"00",X"83",X"08",X"83",X"60",X"83",X"68",X"83",X"20",X"83", + X"A0",X"2B",X"C8",X"2A",X"E8",X"2A",X"88",X"2A",X"A8",X"2A",X"C0",X"2A",X"E0",X"2A",X"80",X"2A", + X"28",X"82",X"40",X"81",X"48",X"81",X"00",X"81",X"08",X"81",X"60",X"81",X"68",X"81",X"20",X"81", + X"A0",X"29",X"C8",X"28",X"E8",X"28",X"88",X"28",X"A8",X"28",X"C0",X"28",X"E0",X"28",X"80",X"28", + X"28",X"80",X"28",X"80",X"F6",X"32",X"28",X"88",X"23",X"F6",X"32",X"01",X"88",X"23",X"F6",X"32", + X"A2",X"28",X"83",X"56",X"6B",X"57",X"80",X"9A",X"6D",X"B4",X"01",X"83",X"B2",X"8A",X"28",X"6B", + X"F7",X"08",X"50",X"1E",X"2C",X"65",X"59",X"A0",X"B8",X"61",X"46",X"F7",X"CD",X"B4",X"A1",X"8B", + X"B2",X"8A",X"28",X"6B",X"F7",X"68",X"B6",X"8C",X"6D",X"59",X"00",X"69",X"81",X"F5",X"02",X"6D", + X"54",X"A1",X"21",X"0F",X"A2",X"65",X"54",X"A1",X"29",X"1F",X"A2",X"96",X"29",X"1A",X"A8",X"28", + X"32",X"80",X"A3",X"A1",X"08",X"A2",X"C0",X"41",X"6D",X"54",X"01",X"81",X"18",X"A2",X"6D",X"54", + X"A1",X"65",X"F2",X"A3",X"21",X"6E",X"A2",X"65",X"54",X"A1",X"21",X"7C",X"A2",X"65",X"54",X"A1", + X"81",X"53",X"02",X"12",X"E0",X"18",X"6B",X"E7",X"4C",X"54",X"01",X"16",X"23",X"92",X"A2",X"28", + X"26",X"9C",X"A6",X"8B",X"22",X"88",X"88",X"1E",X"24",X"65",X"28",X"A7",X"C9",X"AA",X"A9",X"9F", + X"F0",X"80",X"F5",X"80",X"F3",X"80",X"68",X"8F",X"24",X"98",X"F3",X"DC",X"E1",X"DA",X"F4",X"80", + X"20",X"CA",X"7D",X"DC",X"7C",X"EF",X"CE",X"8F",X"AF",X"B8",X"31",X"80",X"EF",X"DA",X"20",X"92", + X"80",X"D8",X"64",X"C9",X"71",X"CD",X"F2",X"5B",X"A7",X"AF",X"30",X"91",X"80",X"D8",X"64",X"C9", + X"F9",X"CD",X"7A",X"80",X"EF",X"EE",X"EC",X"79",X"2F",X"9A",X"38",X"CB",X"7A",X"CD",X"6C",X"E9", + X"F4",X"00",X"A7",X"AF",X"B0",X"CE",X"F2",X"CD",X"E5",X"80",X"F0",X"EC",X"E1",X"79",X"20",X"B9", + X"38",X"C8",X"20",X"DB",X"6D",X"CF",X"69",X"80",X"31",X"B1",X"B0",X"12",X"2E",X"9D",X"B8",X"CA", + X"67",X"EE",X"F5",X"DB",X"80",X"CE",X"67",X"DA",X"80",X"93",X"90",X"90",X"90",X"90",X"80",X"D8", + X"7C",X"DB",X"92",X"98",X"3D",X"B8",X"35",X"90",X"30",X"90",X"10",X"1A",X"B8",X"28",X"07",X"08", + X"23",X"B2",X"B6",X"20",X"EE",X"09",X"80",X"0C",X"92",X"28",X"B8",X"C9",X"92",X"68",X"B8",X"C9", + X"21",X"20",X"A3",X"CD",X"54",X"29",X"CD",X"93",X"A3",X"CD",X"86",X"2B",X"CD",X"24",X"A4",X"C9", + X"A1",X"8A",X"B1",X"99",X"F0",X"88",X"80",X"88",X"80",X"88",X"80",X"88",X"60",X"41",X"80",X"88", + X"20",X"20",X"20",X"20",X"20",X"32",X"58",X"01",X"21",X"10",X"6B",X"52",X"6D",X"44",X"E9",X"D4", + X"75",X"45",X"F5",X"45",X"F5",X"21",X"D0",X"83",X"75",X"21",X"A3",X"20",X"A7",X"D5",X"56",X"08", + X"D5",X"7E",X"29",X"07",X"C5",X"7A",X"B0",X"03",X"B4",X"B8",X"D0",X"B9",X"56",X"30",X"DD",X"77", + X"A0",X"DD",X"8B",X"D5",X"8B",X"D5",X"8B",X"CB",X"4B",X"A0",X"C9",X"D5",X"E9",X"DD",X"E9",X"C9", + X"38",X"27",X"C0",X"03",X"64",X"00",X"AA",X"00",X"29",X"00",X"B2",X"08",X"88",X"26",X"28",X"E7", + X"65",X"48",X"03",X"26",X"B2",X"A6",X"27",X"22",X"A0",X"20",X"96",X"18",X"9A",X"0A",X"28",X"CD", + X"E7",X"2C",X"C9",X"A2",X"AC",X"88",X"CD",X"40",X"A3",X"26",X"22",X"A6",X"AC",X"22",X"28",X"88", + X"96",X"18",X"9A",X"0A",X"28",X"CD",X"F4",X"84",X"96",X"98",X"65",X"94",X"01",X"C9",X"82",X"06", + X"88",X"CD",X"68",X"2B",X"26",X"22",X"A6",X"03",X"22",X"00",X"88",X"B6",X"38",X"32",X"2A",X"88", + X"65",X"5C",X"04",X"B6",X"90",X"CD",X"14",X"81",X"65",X"76",X"03",X"A2",X"24",X"20",X"E5",X"FB", + X"AE",X"88",X"CD",X"99",X"A5",X"58",X"C5",X"7B",X"AC",X"88",X"CD",X"93",X"A3",X"C9",X"21",X"14", + X"28",X"CB",X"D6",X"48",X"ED",X"A2",X"26",X"20",X"19",X"B0",X"23",X"B2",X"E0",X"38",X"63",X"6F", + X"A0",X"03",X"39",X"88",X"3B",X"CD",X"99",X"2D",X"41",X"D8",X"34",X"CB",X"D6",X"CD",X"3B",X"2D", + X"8E",X"89",X"6D",X"27",X"30",X"69",X"81",X"9D",X"28",X"6B",X"F6",X"E8",X"45",X"02",X"B0",X"28", + X"39",X"30",X"AB",X"1A",X"68",X"18",X"CB",X"C7",X"A0",X"8B",X"39",X"28",X"3B",X"65",X"99",X"A5", + X"41",X"78",X"B8",X"5E",X"A2",X"98",X"28",X"6D",X"E0",X"A3",X"86",X"82",X"A6",X"9D",X"82",X"88", + X"88",X"1E",X"38",X"9A",X"2A",X"28",X"CD",X"DC",X"A4",X"1E",X"30",X"65",X"B4",X"A1",X"CD",X"8E", + X"04",X"02",X"24",X"28",X"65",X"73",X"B0",X"28",X"6D",X"39",X"05",X"F8",X"65",X"F3",X"24",X"28", + X"CD",X"1B",X"A3",X"61",X"2E",X"8D",X"21",X"8B",X"88",X"5E",X"D6",X"90",X"20",X"A9",X"B6",X"80", + X"6D",X"B4",X"01",X"83",X"98",X"53",X"69",X"56",X"6D",X"B4",X"01",X"83",X"98",X"71",X"69",X"A6", + X"2A",X"89",X"2E",X"28",X"B8",X"43",X"21",X"54",X"A4",X"65",X"54",X"A1",X"21",X"8A",X"A5",X"65", + X"DC",X"A1",X"6D",X"2F",X"00",X"86",X"A0",X"47",X"6D",X"C8",X"03",X"6D",X"47",X"A4",X"81",X"8F", + X"21",X"8A",X"28",X"28",X"B6",X"AA",X"32",X"8A",X"88",X"65",X"8F",X"A0",X"D6",X"8E",X"B0",X"8C", + X"5E",X"8D",X"B8",X"70",X"CF",X"ED",X"B6",X"AE",X"6D",X"B4",X"01",X"16",X"27",X"6D",X"14",X"A1", + X"49",X"90",X"52",X"86",X"28",X"65",X"8F",X"A0",X"D6",X"8E",X"B0",X"8D",X"5E",X"8D",X"2C",X"10", + X"DF",X"A5",X"8C",X"68",X"4D",X"50",X"B5",X"B6",X"A0",X"77",X"81",X"A8",X"05",X"31",X"F6",X"86", + X"23",X"4F",X"22",X"88",X"88",X"ED",X"B6",X"A8",X"CD",X"B4",X"A1",X"1E",X"A9",X"65",X"B4",X"A1", + X"41",X"86",X"A0",X"82",X"A0",X"28",X"B6",X"AA",X"6D",X"B4",X"01",X"16",X"23",X"6D",X"14",X"A1", + X"49",X"90",X"59",X"61",X"39",X"81",X"38",X"C8",X"20",X"DB",X"6D",X"CF",X"69",X"80",X"31",X"B1", + X"10",X"BA",X"A1",X"89",X"B0",X"49",X"E3",X"7C",X"32",X"10",X"B6",X"1C",X"65",X"36",X"00",X"07", + X"C8",X"B8",X"2D",X"CD",X"9E",X"28",X"B5",X"C8",X"D6",X"05",X"B0",X"02",X"B6",X"04",X"6F",X"B6", + X"23",X"32",X"A2",X"20",X"06",X"8C",X"6D",X"F0",X"95",X"0F",X"8E",X"8B",X"C7",X"22",X"A0",X"20", + X"45",X"F1",X"CD",X"3C",X"A1",X"B4",X"CD",X"3C",X"A1",X"41",X"26",X"00",X"22",X"00",X"88",X"B4", + X"65",X"94",X"01",X"B4",X"65",X"94",X"01",X"49",X"18",X"74",X"61",X"B2",X"E8",X"25",X"4F",X"B6", + X"AC",X"18",X"CB",X"B7",X"4E",X"08",X"26",X"00",X"E7",X"22",X"28",X"88",X"B6",X"10",X"32",X"02", + X"28",X"45",X"96",X"1E",X"65",X"94",X"01",X"38",X"5B",X"41",X"92",X"69",X"2D",X"6F",X"92",X"68", + X"8D",X"18",X"6F",X"22",X"28",X"88",X"CD",X"00",X"A1",X"38",X"D3",X"C9",X"4D",X"45",X"A2",X"26", + X"28",X"6C",X"45",X"A1",X"01",X"F1",X"2C",X"67",X"8A",X"8E",X"28",X"41",X"69",X"C9",X"E3",X"26", + X"28",X"E7",X"A1",X"B9",X"FE",X"23",X"7E",X"C3",X"C1",X"F4",X"1A",X"48",X"F5",X"1B",X"C9",X"FF", + X"5F",X"CD",X"75",X"86",X"65",X"65",X"06",X"CD",X"B4",X"87",X"92",X"48",X"B8",X"A7",X"63",X"E7", + X"48",X"2E",X"29",X"CD",X"89",X"18",X"2E",X"0D",X"39",X"39",X"A6",X"21",X"24",X"8C",X"BA",X"77", + X"1B",X"23",X"18",X"F2",X"75",X"21",X"80",X"24",X"75",X"36",X"17",X"08",X"89",X"08",X"A0",X"22", + X"22",X"8C",X"CD",X"1D",X"31",X"2E",X"A8",X"4D",X"AE",X"07",X"4D",X"B6",X"A9",X"18",X"DD",X"77", + X"A1",X"B6",X"20",X"19",X"75",X"77",X"A0",X"C5",X"43",X"88",X"2C",X"CD",X"6A",X"98",X"88",X"81", + X"CD",X"8E",X"30",X"20",X"AF",X"CD",X"1F",X"30",X"20",X"0A",X"CD",X"9E",X"30",X"20",X"2D",X"CD", + X"8D",X"90",X"A0",X"9D",X"65",X"63",X"80",X"2C",X"F1",X"FE",X"A1",X"AF",X"7D",X"D7",X"A2",X"50", + X"5E",X"89",X"0F",X"75",X"77",X"8B",X"CD",X"CE",X"A6",X"E1",X"AD",X"88",X"95",X"E1",X"38",X"17", + X"B6",X"4B",X"7D",X"BE",X"17",X"7D",X"D7",X"B7",X"B6",X"98",X"92",X"8A",X"28",X"6D",X"9A",X"A7", + X"B6",X"A9",X"32",X"8A",X"88",X"65",X"B2",X"A7",X"C9",X"6B",X"6E",X"69",X"28",X"B7",X"F7",X"F7", + X"57",X"F7",X"57",X"F7",X"57",X"88",X"99",X"CE",X"06",X"FD",X"6D",X"F4",X"05",X"CE",X"A3",X"B1", + X"7D",X"A6",X"4B",X"2F",X"A5",X"C8",X"30",X"EF",X"30",X"FE",X"30",X"E5",X"30",X"1A",X"B9",X"28", + X"07",X"00",X"A7",X"16",X"A0",X"92",X"A2",X"28",X"B8",X"8D",X"B6",X"A9",X"92",X"8A",X"28",X"36", + X"38",X"65",X"09",X"A6",X"BE",X"99",X"CD",X"1A",X"A6",X"61",X"CD",X"09",X"A6",X"65",X"1A",X"A6", + X"69",X"A1",X"A0",X"89",X"9E",X"BC",X"6D",X"03",X"06",X"A1",X"A0",X"80",X"9E",X"BC",X"6D",X"03", + X"A6",X"61",X"29",X"88",X"29",X"96",X"20",X"65",X"90",X"A6",X"29",X"BB",X"29",X"96",X"20",X"65", + X"18",X"A6",X"69",X"FD",X"6D",X"E7",X"01",X"F9",X"D3",X"FD",X"99",X"88",X"A4",X"31",X"B2",X"8A", + X"88",X"DF",X"59",X"04",X"3D",X"88",X"C4",X"61",X"5D",X"65",X"E7",X"A1",X"59",X"DB",X"5D",X"91", + X"A0",X"8C",X"B9",X"12",X"A2",X"28",X"D7",X"F9",X"8C",X"B5",X"80",X"64",X"69",X"A6",X"21",X"12", + X"B9",X"28",X"07",X"08",X"2A",X"86",X"28",X"58",X"32",X"8A",X"88",X"86",X"AF",X"E5",X"AE",X"AD", + X"4D",X"16",X"27",X"B8",X"0F",X"EE",X"A2",X"E7",X"B6",X"AD",X"19",X"AF",X"4E",X"89",X"EF",X"4D", + X"6B",X"88",X"88",X"65",X"D6",X"A6",X"49",X"05",X"20",X"46",X"49",X"90",X"40",X"61",X"B6",X"B8", + X"65",X"94",X"01",X"B4",X"65",X"94",X"01",X"B4",X"65",X"16",X"01",X"CD",X"14",X"81",X"94",X"CD", + X"B4",X"29",X"B4",X"C9",X"B2",X"19",X"88",X"07",X"C8",X"2E",X"20",X"4D",X"AE",X"00",X"C5",X"6B", + X"A0",X"20",X"65",X"86",X"07",X"B6",X"A1",X"CD",X"F9",X"80",X"69",X"38",X"4E",X"C9",X"96",X"01", + X"2E",X"1C",X"4D",X"CD",X"A5",X"29",X"49",X"38",X"D1",X"C9",X"CD",X"84",X"A7",X"CD",X"AA",X"30", + X"90",X"F0",X"E5",X"6B",X"98",X"25",X"65",X"A1",X"07",X"CD",X"AC",X"87",X"82",X"B8",X"2D",X"78", + X"F9",X"CD",X"99",X"2D",X"A0",X"F3",X"CD",X"0A",X"30",X"B0",X"C6",X"C5",X"6B",X"B2",X"8D",X"CD", + X"09",X"87",X"65",X"2C",X"07",X"A2",X"98",X"25",X"58",X"F9",X"65",X"31",X"05",X"A0",X"DB",X"A2", + X"12",X"8D",X"CD",X"99",X"A5",X"A0",X"C3",X"CD",X"AA",X"30",X"B0",X"E6",X"C5",X"6B",X"14",X"8D", + X"65",X"A1",X"07",X"C9",X"65",X"3D",X"07",X"0F",X"2F",X"4E",X"A3",X"EF",X"65",X"37",X"07",X"0F", + X"0F",X"4E",X"2C",X"6F",X"C9",X"CD",X"F4",X"2D",X"46",X"07",X"D6",X"06",X"30",X"F7",X"C9",X"CD", + X"54",X"85",X"EE",X"0F",X"F6",X"0F",X"98",X"FF",X"61",X"C5",X"4B",X"08",X"28",X"B6",X"34",X"4B", + X"28",X"2F",X"B2",X"C0",X"8D",X"6F",X"B6",X"0C",X"18",X"CB",X"B7",X"4E",X"A8",X"26",X"28",X"E7", + X"8A",X"08",X"28",X"B6",X"B6",X"CD",X"14",X"81",X"18",X"F3",X"89",X"69",X"2D",X"2E",X"31",X"87", + X"77",X"23",X"38",X"FC",X"B2",X"C0",X"8D",X"6F",X"4D",X"CD",X"0C",X"2F",X"60",X"E1",X"39",X"0B", + X"24",X"CD",X"39",X"85",X"80",X"FB",X"19",X"07",X"24",X"CD",X"39",X"85",X"80",X"E3",X"19",X"03", + X"38",X"CD",X"99",X"2D",X"A0",X"E3",X"39",X"0F",X"38",X"CD",X"99",X"2D",X"A0",X"DB",X"CD",X"0A", + X"30",X"B0",X"5E",X"45",X"A5",X"30",X"49",X"38",X"CF",X"41",X"78",X"71",X"B2",X"C0",X"8D",X"6F", + X"89",X"4A",X"25",X"4D",X"ED",X"EE",X"8B",X"CE",X"C8",X"E1",X"65",X"99",X"0D",X"A0",X"02",X"41", + X"49",X"AB",X"AB",X"38",X"C6",X"6A",X"63",X"87",X"41",X"C9",X"49",X"BF",X"41",X"B2",X"49",X"8D", + X"A7",X"9E",X"80",X"FF",X"89",X"4A",X"25",X"B9",X"D9",X"83",X"D8",X"81",X"E1",X"8D",X"9C",X"69", + X"45",X"8E",X"30",X"40",X"45",X"AC",X"30",X"55",X"BC",X"01",X"45",X"E9",X"30",X"30",X"A5",X"45", + X"B7",X"30",X"60",X"6D",X"BD",X"30",X"75",X"95",X"81",X"6D",X"FE",X"30",X"10",X"BE",X"65",X"9E", + X"30",X"40",X"45",X"BC",X"30",X"55",X"BD",X"00",X"45",X"03",X"31",X"30",X"AF",X"45",X"05",X"30", + X"60",X"6D",X"E3",X"30",X"75",X"94",X"80",X"6D",X"90",X"31",X"10",X"28",X"65",X"8E",X"98",X"48", + X"45",X"97",X"30",X"48",X"45",X"9E",X"30",X"48",X"45",X"97",X"30",X"48",X"59",X"41",X"C5",X"63", + X"88",X"8C",X"84",X"6D",X"62",X"30",X"61",X"65",X"43",X"20",X"24",X"8D",X"10",X"55",X"6D",X"EB", + X"20",X"8C",X"25",X"30",X"C6",X"C5",X"63",X"20",X"8C",X"24",X"30",X"E7",X"C5",X"63",X"20",X"8C", + X"84",X"6D",X"F2",X"30",X"61",X"65",X"43",X"20",X"24",X"8D",X"10",X"55",X"6D",X"EB",X"88",X"8C", + X"25",X"30",X"C6",X"C5",X"63",X"20",X"8C",X"24",X"30",X"E7",X"3E",X"46",X"30",X"06",X"3E",X"C6", + X"10",X"2A",X"96",X"0E",X"89",X"27",X"24",X"F1",X"0F",X"46",X"87",X"8F",X"87",X"8F",X"BA",X"92", + X"25",X"8C",X"3E",X"00",X"70",X"31",X"4B",X"24",X"8C",X"55",X"BC",X"03",X"45",X"1D",X"31",X"55", + X"9C",X"2B",X"65",X"BD",X"99",X"69",X"75",X"95",X"83",X"6D",X"15",X"31",X"75",X"95",X"83",X"6D", + X"35",X"B9",X"61",X"DD",X"9D",X"2A",X"65",X"35",X"B9",X"DD",X"9D",X"2A",X"65",X"35",X"B9",X"C9", + X"75",X"9C",X"82",X"65",X"15",X"31",X"75",X"9C",X"82",X"65",X"15",X"31",X"61",X"E5",X"43",X"22", + X"04",X"79",X"2F",X"3C",X"47",X"78",X"2F",X"D6",X"36",X"ED",X"4C",X"47",X"E5",X"43",X"28",X"00", + X"1E",X"20",X"65",X"B4",X"09",X"65",X"1C",X"A1",X"84",X"E5",X"C3",X"28",X"20",X"65",X"1C",X"A1", + X"65",X"B4",X"A1",X"DD",X"9C",X"B7",X"92",X"31",X"00",X"A7",X"6C",X"66",X"B9",X"C9",X"96",X"2A", + X"65",X"59",X"08",X"61",X"7D",X"89",X"88",X"18",X"A7",X"1E",X"80",X"57",X"7D",X"11",X"65",X"F7", + X"B9",X"28",X"2D",X"7E",X"6E",X"26",X"10",X"2A",X"D6",X"2F",X"F5",X"77",X"28",X"23",X"65",X"F7", + X"99",X"80",X"85",X"D6",X"E6",X"38",X"10",X"2B",X"5E",X"87",X"1C",X"F5",X"DF",X"29",X"61",X"92", + X"30",X"00",X"AF",X"C8",X"92",X"3E",X"00",X"E6",X"29",X"C9",X"F5",X"21",X"D8",X"07",X"8B",X"23", + X"A7",X"1E",X"80",X"57",X"7D",X"11",X"D6",X"92",X"10",X"88",X"AF",X"80",X"91",X"92",X"96",X"88", + X"EE",X"29",X"80",X"22",X"D2",X"2F",X"EE",X"2B",X"57",X"7A",X"EE",X"D4",X"BB",X"57",X"F5",X"72", + X"80",X"8B",X"5E",X"F5",X"DF",X"29",X"61",X"89",X"88",X"18",X"86",X"38",X"9E",X"28",X"8B",X"18", + X"D3",X"C9",X"75",X"21",X"08",X"05",X"75",X"36",X"28",X"F0",X"75",X"36",X"29",X"F8",X"75",X"36", + X"82",X"A8",X"75",X"9E",X"83",X"AB",X"75",X"9E",X"84",X"29",X"75",X"9E",X"86",X"AA",X"75",X"9E", + X"2F",X"28",X"75",X"36",X"21",X"28",X"75",X"36",X"36",X"28",X"75",X"36",X"37",X"29",X"61",X"DD", + X"89",X"28",X"25",X"65",X"04",X"32",X"75",X"89",X"88",X"8D",X"65",X"AC",X"9A",X"75",X"89",X"68", + X"8D",X"45",X"AC",X"32",X"55",X"A9",X"60",X"8D",X"45",X"0C",X"32",X"41",X"45",X"2F",X"32",X"45", + X"1A",X"32",X"65",X"EE",X"9A",X"7D",X"5E",X"2E",X"75",X"D7",X"14",X"7D",X"9E",X"2F",X"80",X"7D", + X"BE",X"08",X"D7",X"55",X"BE",X"09",X"28",X"55",X"BE",X"15",X"D7",X"45",X"E6",X"32",X"41",X"87", + X"75",X"D7",X"80",X"7D",X"DF",X"29",X"65",X"CE",X"9B",X"69",X"65",X"F4",X"0D",X"46",X"83",X"7D", + X"FF",X"04",X"45",X"8F",X"A0",X"B5",X"CE",X"07",X"4E",X"01",X"55",X"FF",X"2B",X"41",X"45",X"8F", + X"08",X"B5",X"63",X"B7",X"63",X"B7",X"C7",X"B2",X"11",X"88",X"AF",X"A0",X"02",X"B2",X"C0",X"18", + X"A7",X"2F",X"2F",X"CE",X"2B",X"08",X"6F",X"B6",X"AC",X"18",X"55",X"FF",X"2E",X"41",X"55",X"BE", + X"17",X"AE",X"65",X"8F",X"08",X"76",X"85",X"58",X"75",X"F6",X"85",X"76",X"84",X"48",X"75",X"96", + X"BF",X"00",X"41",X"55",X"A9",X"A0",X"8D",X"55",X"BE",X"00",X"28",X"55",X"BE",X"01",X"28",X"55", + X"9E",X"2B",X"01",X"7D",X"9E",X"2E",X"83",X"7D",X"9E",X"2F",X"80",X"7D",X"9E",X"3E",X"80",X"7D", + X"BE",X"17",X"28",X"55",X"BE",X"1F",X"28",X"45",X"83",X"39",X"41",X"87",X"A9",X"C0",X"8C",X"39", + X"85",X"28",X"86",X"2D",X"DF",X"B9",X"DF",X"83",X"90",X"D2",X"DF",X"69",X"1A",X"3F",X"20",X"07", + X"40",X"B2",X"22",X"88",X"CE",X"1F",X"48",X"29",X"29",X"22",X"B2",X"16",X"88",X"43",X"6F",X"A0", + X"83",X"89",X"93",X"22",X"1A",X"22",X"20",X"6B",X"4F",X"A0",X"07",X"6D",X"74",X"EB",X"9E",X"39", + X"24",X"45",X"DC",X"4B",X"BE",X"11",X"45",X"F9",X"32",X"41",X"45",X"DC",X"EB",X"BE",X"28",X"24", + X"65",X"DC",X"43",X"96",X"80",X"6D",X"7D",X"32",X"61",X"B6",X"90",X"B8",X"82",X"B6",X"04",X"86", + X"28",X"2E",X"20",X"22",X"28",X"00",X"0E",X"24",X"65",X"A5",X"A1",X"10",X"D3",X"C9",X"75",X"21", + X"80",X"8D",X"10",X"38",X"75",X"89",X"88",X"8D",X"10",X"AA",X"75",X"89",X"C0",X"8D",X"10",X"2C", + X"75",X"21",X"E8",X"05",X"75",X"7E",X"37",X"11",X"A5",X"BB",X"6B",X"07",X"A5",X"7B",X"BB",X"FF", + X"9B",X"05",X"9B",X"85",X"1A",X"15",X"19",X"53",X"19",X"E4",X"1A",X"F9",X"9B",X"72",X"9B",X"5F", + X"B2",X"6E",X"B3",X"F5",X"B3",X"9C",X"B3",X"71",X"BB",X"63",X"B4",X"C3",X"B4",X"E5",X"BB",X"A4", + X"1D",X"72",X"9B",X"0E",X"85",X"18",X"7E",X"61",X"61",X"75",X"9E",X"28",X"80",X"75",X"9E",X"29", + X"28",X"CD",X"46",X"BB",X"75",X"34",X"37",X"C9",X"75",X"36",X"37",X"28",X"61",X"DD",X"9E",X"37", + X"81",X"61",X"75",X"9E",X"17",X"AE",X"61",X"65",X"D7",X"B1",X"75",X"63",X"01",X"6E",X"64",X"0D", + X"BB",X"CD",X"06",X"BB",X"61",X"DD",X"9E",X"22",X"2C",X"DD",X"9E",X"21",X"27",X"C9",X"92",X"AC", + X"20",X"AF",X"E0",X"75",X"5E",X"AA",X"1D",X"80",X"84",X"75",X"DF",X"AA",X"61",X"75",X"9E",X"A9", + X"28",X"DD",X"9C",X"37",X"61",X"CD",X"7F",X"B1",X"75",X"34",X"2F",X"DD",X"D6",X"2F",X"75",X"BE", + X"86",X"70",X"75",X"9E",X"87",X"28",X"65",X"D8",X"9B",X"89",X"66",X"33",X"ED",X"75",X"5E",X"2C", + X"19",X"4E",X"BB",X"C3",X"07",X"A5",X"AA",X"B1",X"A4",X"B1",X"BE",X"B1",X"68",X"B1",X"75",X"7E", + X"85",X"75",X"ED",X"E9",X"65",X"7C",X"99",X"61",X"75",X"D6",X"80",X"EE",X"07",X"F6",X"00",X"68", + X"75",X"7E",X"29",X"E6",X"27",X"C0",X"92",X"75",X"04",X"FE",X"2A",X"30",X"3E",X"3A",X"10",X"05", + X"7E",X"2B",X"98",X"B2",X"7E",X"2A",X"88",X"2C",X"2F",X"9A",X"8B",X"88",X"1A",X"23",X"20",X"F6", + X"2B",X"B0",X"A3",X"55",X"F6",X"1E",X"D6",X"09",X"B8",X"57",X"55",X"BE",X"BC",X"07",X"45",X"7C", + X"0D",X"46",X"83",X"4E",X"01",X"7D",X"DF",X"BE",X"1E",X"2B",X"9A",X"93",X"24",X"8E",X"7F",X"6D", + X"89",X"18",X"2E",X"08",X"45",X"89",X"B8",X"2E",X"29",X"45",X"4F",X"18",X"30",X"33",X"45",X"8F", + X"08",X"B5",X"07",X"AF",X"EE",X"2B",X"E6",X"2B",X"C7",X"B2",X"30",X"8D",X"38",X"90",X"04",X"6D", + X"EE",X"32",X"5E",X"01",X"55",X"FF",X"BC",X"55",X"BE",X"1E",X"2A",X"B2",X"FD",X"8C",X"D6",X"01", + X"18",X"AF",X"FD",X"6D",X"46",X"32",X"F6",X"29",X"E1",X"18",X"75",X"D7",X"14",X"7D",X"9E",X"BE", + X"2A",X"55",X"F6",X"1E",X"39",X"6A",X"34",X"4B",X"8F",X"2D",X"BE",X"35",X"E9",X"36",X"6B",X"38", + X"22",X"37",X"E2",X"37",X"7A",X"37",X"41",X"36",X"41",X"36",X"7A",X"37",X"24",X"34",X"24",X"34", + X"8C",X"34",X"8C",X"34",X"58",X"34",X"2B",X"35",X"AC",X"35",X"3D",X"35",X"55",X"F6",X"29",X"D6", + X"F8",X"A0",X"0C",X"76",X"90",X"A0",X"08",X"7D",X"5E",X"28",X"7E",X"D8",X"08",X"3A",X"7E",X"B8", + X"A0",X"0E",X"55",X"F6",X"BE",X"5E",X"A9",X"CE",X"2B",X"55",X"FF",X"04",X"45",X"D6",X"B0",X"41", + X"65",X"F4",X"0D",X"46",X"81",X"7D",X"DF",X"2C",X"E6",X"AD",X"75",X"D7",X"16",X"41",X"61",X"6D", + X"F4",X"2D",X"CE",X"01",X"4E",X"02",X"55",X"FF",X"2C",X"4E",X"AD",X"55",X"FF",X"1E",X"C9",X"41", + X"75",X"F6",X"81",X"76",X"90",X"A0",X"14",X"6D",X"58",X"B6",X"75",X"F6",X"84",X"99",X"A9",X"6B", + X"45",X"8F",X"A5",X"D6",X"BC",X"A0",X"AC",X"D6",X"BD",X"A0",X"A8",X"D6",X"BE",X"A0",X"2C",X"45", + X"F6",X"B0",X"61",X"7D",X"9E",X"2A",X"60",X"7D",X"9E",X"AB",X"86",X"7D",X"DF",X"BC",X"75",X"96", + X"37",X"39",X"61",X"DD",X"D6",X"29",X"F6",X"D8",X"80",X"C1",X"10",X"43",X"75",X"7E",X"28",X"FE", + X"10",X"80",X"E8",X"10",X"E2",X"75",X"5E",X"28",X"7E",X"D8",X"08",X"5F",X"10",X"91",X"65",X"A8", + X"BE",X"DD",X"46",X"38",X"F5",X"21",X"88",X"05",X"F5",X"7E",X"2C",X"11",X"B9",X"BD",X"6B",X"07", + X"0D",X"B1",X"9D",X"FD",X"9D",X"73",X"9D",X"89",X"9D",X"0E",X"83",X"63",X"59",X"88",X"06",X"0E", + X"2A",X"CB",X"D9",X"20",X"20",X"06",X"28",X"CB",X"C9",X"20",X"26",X"06",X"29",X"DD",X"D6",X"35", + X"75",X"DF",X"16",X"75",X"5E",X"BC",X"75",X"DF",X"86",X"75",X"D8",X"2C",X"61",X"0E",X"82",X"63", + X"D9",X"20",X"C2",X"06",X"2B",X"CB",X"D1",X"20",X"CC",X"06",X"29",X"CB",X"C1",X"20",X"C2",X"06", + X"80",X"10",X"72",X"0E",X"80",X"63",X"C9",X"88",X"F4",X"0E",X"81",X"63",X"49",X"88",X"66",X"0E", + X"2A",X"CB",X"D9",X"20",X"5C",X"06",X"2B",X"18",X"4C",X"06",X"29",X"CB",X"C1",X"20",X"96",X"06", + X"80",X"63",X"C9",X"88",X"38",X"0E",X"83",X"63",X"59",X"88",X"3E",X"0E",X"82",X"10",X"2E",X"F5", + X"89",X"88",X"05",X"FD",X"D6",X"2C",X"19",X"84",X"BD",X"C3",X"07",X"A5",X"9C",X"BD",X"50",X"BD", + X"68",X"35",X"78",X"35",X"7D",X"D6",X"80",X"75",X"3E",X"28",X"E0",X"F5",X"5E",X"29",X"75",X"B6", + X"29",X"D8",X"75",X"7E",X"36",X"DD",X"DF",X"35",X"75",X"36",X"36",X"28",X"96",X"2D",X"75",X"77", + X"86",X"75",X"9E",X"2F",X"80",X"E9",X"E9",X"61",X"7D",X"D6",X"80",X"75",X"3E",X"28",X"E0",X"F5", + X"D6",X"29",X"75",X"BE",X"29",X"D0",X"10",X"52",X"F5",X"7E",X"29",X"DD",X"B6",X"29",X"68",X"FD", + X"5E",X"28",X"75",X"B6",X"80",X"70",X"10",X"CA",X"7D",X"D6",X"81",X"75",X"3E",X"29",X"E0",X"F5", + X"F6",X"00",X"55",X"96",X"28",X"58",X"30",X"BA",X"55",X"BE",X"38",X"00",X"45",X"78",X"B6",X"45", + X"07",X"B1",X"88",X"2F",X"75",X"6B",X"90",X"46",X"75",X"94",X"90",X"6D",X"58",X"B6",X"65",X"3F", + X"B1",X"A8",X"2F",X"55",X"43",X"10",X"C6",X"55",X"BC",X"10",X"45",X"78",X"B6",X"45",X"BB",X"39", + X"88",X"2F",X"75",X"6B",X"90",X"56",X"75",X"94",X"90",X"6D",X"58",X"B6",X"65",X"BE",X"19",X"80", + X"2F",X"55",X"43",X"10",X"D6",X"55",X"BC",X"10",X"41",X"B2",X"97",X"8D",X"D6",X"02",X"44",X"9F", + X"9D",X"7D",X"5E",X"BC",X"75",X"D7",X"86",X"6D",X"00",X"36",X"75",X"F6",X"90",X"46",X"07",X"99", + X"65",X"36",X"4B",X"8F",X"A5",X"6F",X"36",X"75",X"36",X"E0",X"36",X"1D",X"37",X"52",X"37",X"55", + X"9E",X"BE",X"82",X"41",X"61",X"7D",X"5E",X"38",X"86",X"2B",X"87",X"B0",X"82",X"98",X"7B",X"7D", + X"F8",X"04",X"55",X"BC",X"3D",X"55",X"F6",X"15",X"39",X"8E",X"36",X"4B",X"8F",X"2D",X"1E",X"36", + X"A8",X"36",X"2A",X"36",X"3E",X"36",X"65",X"F0",X"1E",X"7D",X"D9",X"3E",X"75",X"D0",X"97",X"69", + X"45",X"78",X"B6",X"55",X"F9",X"18",X"55",X"F8",X"B9",X"41",X"45",X"78",X"B6",X"E1",X"E8",X"55", + X"56",X"3E",X"75",X"DE",X"97",X"6D",X"31",X"A5",X"60",X"7D",X"9E",X"3D",X"7F",X"69",X"65",X"F0", + X"B6",X"E1",X"E8",X"55",X"76",X"18",X"55",X"7E",X"B9",X"45",X"99",X"2D",X"A0",X"05",X"55",X"BE", + X"95",X"D7",X"61",X"7D",X"9E",X"BB",X"82",X"7D",X"9E",X"BE",X"82",X"7D",X"9E",X"3D",X"7F",X"69", + X"45",X"06",X"37",X"45",X"56",X"36",X"55",X"CD",X"C9",X"39",X"39",X"00",X"31",X"96",X"A8",X"01", + X"8B",X"F6",X"75",X"D7",X"84",X"69",X"75",X"F6",X"84",X"9E",X"80",X"FF",X"89",X"2A",X"9F",X"B9", + X"D6",X"C9",X"29",X"28",X"2B",X"2A",X"75",X"7E",X"38",X"06",X"2C",X"0E",X"2B",X"DD",X"ED",X"E1", + X"91",X"39",X"80",X"11",X"87",X"98",X"82",X"D9",X"8B",X"05",X"90",X"D0",X"61",X"65",X"86",X"37", + X"65",X"F4",X"A5",X"E6",X"2B",X"FE",X"2B",X"30",X"DF",X"DD",X"ED",X"E1",X"16",X"39",X"2B",X"5F", + X"96",X"28",X"11",X"D6",X"FD",X"65",X"FE",X"36",X"C7",X"F9",X"38",X"80",X"EB",X"75",X"C6",X"2C", + X"75",X"77",X"2C",X"B8",X"60",X"DD",X"9E",X"22",X"29",X"DD",X"9E",X"21",X"27",X"DD",X"9E",X"37", + X"81",X"61",X"65",X"F4",X"0D",X"EE",X"81",X"60",X"7D",X"89",X"A0",X"8D",X"75",X"9E",X"84",X"28", + X"75",X"7E",X"28",X"FD",X"3E",X"28",X"98",X"2E",X"75",X"CB",X"2C",X"4E",X"E5",X"44",X"4F",X"DD", + X"5E",X"29",X"7D",X"3E",X"81",X"98",X"86",X"75",X"63",X"2C",X"66",X"E5",X"C4",X"38",X"98",X"2D", + X"75",X"CB",X"2C",X"46",X"61",X"DD",X"63",X"2C",X"B6",X"C9",X"F5",X"21",X"08",X"05",X"F5",X"7E", + X"80",X"75",X"3E",X"28",X"08",X"BA",X"65",X"F4",X"0D",X"EE",X"87",X"62",X"41",X"36",X"7D",X"D6", + X"28",X"D6",X"38",X"DD",X"B6",X"28",X"80",X"20",X"6E",X"A8",X"75",X"BE",X"28",X"C2",X"61",X"BE", + X"86",X"28",X"7D",X"D6",X"81",X"75",X"3E",X"29",X"18",X"29",X"84",X"75",X"D8",X"2C",X"65",X"5E", + X"B0",X"C9",X"F5",X"21",X"08",X"05",X"F5",X"7E",X"29",X"DD",X"B6",X"29",X"80",X"32",X"65",X"F4", + X"0D",X"EE",X"87",X"62",X"41",X"36",X"7D",X"D6",X"81",X"7E",X"90",X"75",X"3E",X"29",X"08",X"A8", + X"6E",X"A8",X"75",X"BE",X"29",X"C2",X"61",X"BE",X"0E",X"2A",X"F5",X"7E",X"28",X"DD",X"B6",X"28", + X"18",X"29",X"84",X"75",X"D8",X"2C",X"65",X"5E",X"18",X"61",X"7D",X"89",X"A0",X"8D",X"7D",X"D6", + X"28",X"55",X"96",X"00",X"A0",X"AA",X"45",X"7C",X"A5",X"CE",X"2F",X"42",X"E9",X"36",X"D5",X"F6", + X"80",X"5E",X"90",X"7D",X"3E",X"28",X"08",X"98",X"E6",X"20",X"75",X"36",X"80",X"A0",X"B1",X"75", + X"F6",X"01",X"55",X"96",X"29",X"A0",X"49",X"45",X"F4",X"2D",X"CE",X"07",X"42",X"49",X"36",X"D5", + X"5E",X"29",X"F6",X"38",X"75",X"36",X"81",X"A0",X"2F",X"4E",X"88",X"7D",X"3E",X"29",X"08",X"80", + X"4B",X"49",X"36",X"B2",X"97",X"8D",X"D6",X"02",X"44",X"9F",X"35",X"45",X"F4",X"2D",X"CE",X"01", + X"88",X"62",X"7D",X"81",X"A0",X"8D",X"7D",X"F6",X"81",X"7D",X"3E",X"29",X"88",X"A8",X"65",X"F4", + X"A5",X"CE",X"2F",X"42",X"E9",X"36",X"D5",X"F6",X"28",X"55",X"96",X"00",X"A0",X"08",X"45",X"7C", + X"0D",X"46",X"87",X"6A",X"41",X"36",X"7D",X"DE",X"81",X"6D",X"5C",X"A5",X"EE",X"38",X"A2",X"DF", + X"D5",X"76",X"28",X"45",X"F4",X"2D",X"CE",X"10",X"0B",X"77",X"55",X"BE",X"2C",X"00",X"55",X"F6", + X"80",X"1B",X"98",X"2E",X"75",X"6B",X"84",X"4E",X"6D",X"CC",X"C7",X"7D",X"5E",X"29",X"B2",X"90", + X"2E",X"55",X"43",X"04",X"CE",X"C5",X"6C",X"18",X"B8",X"06",X"55",X"43",X"2C",X"CE",X"30",X"04", + X"75",X"6B",X"84",X"B6",X"75",X"6B",X"13",X"96",X"65",X"5E",X"18",X"7D",X"63",X"BB",X"5E",X"68", + X"55",X"BD",X"BB",X"55",X"F6",X"1B",X"CE",X"7F",X"48",X"55",X"BE",X"1E",X"29",X"41",X"45",X"7C", + X"0D",X"46",X"83",X"7D",X"DF",X"2C",X"75",X"F6",X"14",X"7D",X"DF",X"2E",X"65",X"F0",X"1E",X"7D", + X"F6",X"04",X"39",X"A1",X"6B",X"45",X"8F",X"2D",X"40",X"D6",X"38",X"B0",X"2B",X"D6",X"3E",X"50", + X"75",X"F6",X"14",X"4E",X"10",X"7D",X"DF",X"2E",X"65",X"F0",X"C3",X"6D",X"4F",X"A1",X"1E",X"BC", + X"B6",X"28",X"43",X"CD",X"22",X"B8",X"90",X"4E",X"75",X"CB",X"33",X"D6",X"6B",X"4E",X"6A",X"05", + X"65",X"E7",X"09",X"D6",X"7E",X"20",X"61",X"0C",X"84",X"10",X"FD",X"05",X"10",X"52",X"04",X"04", + X"10",X"C6",X"75",X"7E",X"29",X"FE",X"39",X"D8",X"75",X"35",X"29",X"C9",X"75",X"7E",X"29",X"FE", + X"F8",X"78",X"75",X"9C",X"81",X"61",X"75",X"D6",X"80",X"F6",X"11",X"70",X"75",X"9D",X"80",X"61", + X"75",X"7E",X"28",X"FE",X"50",X"D0",X"75",X"34",X"28",X"C9",X"75",X"7E",X"20",X"A7",X"60",X"3A", + X"8C",X"88",X"EE",X"BF",X"E0",X"10",X"94",X"75",X"5E",X"A8",X"AF",X"60",X"1A",X"24",X"20",X"EE", + X"37",X"C0",X"75",X"34",X"24",X"DD",X"D6",X"24",X"EE",X"2B",X"68",X"06",X"28",X"DD",X"D6",X"2D", + X"7E",X"2D",X"08",X"39",X"86",X"26",X"75",X"D6",X"16",X"F6",X"82",X"80",X"00",X"0E",X"0C",X"F6", + X"21",X"30",X"2A",X"06",X"3A",X"DD",X"9C",X"24",X"75",X"7E",X"2C",X"FE",X"2B",X"20",X"29",X"3D", + X"A7",X"75",X"63",X"AC",X"D6",X"88",X"81",X"94",X"A0",X"63",X"8F",X"63",X"8F",X"75",X"DF",X"2A", + X"75",X"7E",X"2C",X"FE",X"2B",X"20",X"2C",X"DD",X"63",X"2A",X"46",X"DD",X"D6",X"2D",X"75",X"E5", + X"E9",X"65",X"22",X"31",X"61",X"65",X"F1",X"B1",X"75",X"63",X"01",X"6E",X"64",X"4B",X"19",X"65", + X"06",X"BB",X"61",X"DD",X"9E",X"22",X"2D",X"DD",X"9E",X"21",X"27",X"06",X"2E",X"CD",X"4F",X"30", + X"61",X"92",X"8C",X"88",X"EE",X"F7",X"E0",X"96",X"C8",X"75",X"9C",X"AC",X"75",X"63",X"04",X"6E", + X"88",X"2A",X"96",X"EC",X"75",X"CB",X"2C",X"6E",X"80",X"2A",X"63",X"CF",X"75",X"77",X"2A",X"CD", + X"2B",X"B1",X"61",X"65",X"F1",X"B1",X"75",X"63",X"01",X"6E",X"64",X"29",X"1A",X"65",X"02",X"B2", + X"41",X"55",X"BE",X"0A",X"A8",X"55",X"BE",X"09",X"AF",X"41",X"B2",X"24",X"88",X"8F",X"48",X"55", + X"5E",X"AA",X"1D",X"A0",X"11",X"7D",X"DF",X"AA",X"86",X"A9",X"63",X"CF",X"88",X"A9",X"65",X"8F", + X"A0",X"B5",X"CE",X"07",X"4E",X"01",X"6F",X"55",X"F8",X"03",X"45",X"AB",X"B1",X"41",X"55",X"F6", + X"80",X"8E",X"83",X"76",X"10",X"A0",X"13",X"8E",X"82",X"76",X"70",X"A0",X"95",X"7D",X"5E",X"29", + X"2E",X"01",X"D6",X"10",X"A0",X"0C",X"2E",X"00",X"D6",X"F0",X"A0",X"06",X"45",X"7C",X"A5",X"CE", + X"83",X"CF",X"75",X"D0",X"84",X"6D",X"27",X"A0",X"1D",X"46",X"87",X"4E",X"81",X"7D",X"DF",X"2B", + X"45",X"AB",X"B1",X"55",X"BE",X"1E",X"2A",X"55",X"BE",X"1F",X"2A",X"41",X"55",X"43",X"A9",X"46", + X"64",X"77",X"1A",X"6D",X"B2",X"B2",X"61",X"7D",X"9E",X"AA",X"00",X"7D",X"9E",X"A9",X"07",X"7D", + X"BE",X"02",X"08",X"45",X"83",X"39",X"39",X"0A",X"28",X"45",X"87",X"28",X"2E",X"02",X"45",X"C7", + X"10",X"69",X"1A",X"24",X"20",X"07",X"E0",X"7D",X"5E",X"AA",X"1D",X"A0",X"84",X"7D",X"DF",X"AA", + X"41",X"55",X"BE",X"09",X"28",X"55",X"BC",X"1F",X"A9",X"98",X"8D",X"BD",X"41",X"55",X"BC",X"07", + X"75",X"F6",X"87",X"7D",X"3E",X"2E",X"70",X"7D",X"9E",X"2F",X"80",X"7D",X"5E",X"28",X"EE",X"AF", + X"D6",X"08",X"A8",X"0F",X"55",X"F6",X"29",X"CE",X"AF",X"A8",X"A8",X"55",X"BE",X"09",X"28",X"55", + X"9C",X"BF",X"61",X"6D",X"39",X"33",X"61",X"65",X"43",X"00",X"25",X"B2",X"AC",X"8D",X"91",X"A2", + X"B3",X"45",X"8F",X"2D",X"55",X"F9",X"28",X"55",X"F8",X"01",X"B2",X"A4",X"8D",X"55",X"FF",X"04", + X"EE",X"2A",X"C7",X"B2",X"AC",X"8D",X"0F",X"46",X"81",X"10",X"7E",X"2B",X"88",X"29",X"1D",X"0F", + X"6E",X"3A",X"0F",X"07",X"75",X"77",X"2A",X"DD",X"D6",X"2C",X"F6",X"2A",X"88",X"2C",X"75",X"CB", + X"82",X"CE",X"75",X"9E",X"86",X"2B",X"1A",X"07",X"25",X"75",X"DF",X"2F",X"65",X"CE",X"9B",X"65", + X"83",X"B1",X"75",X"36",X"21",X"28",X"75",X"34",X"37",X"C9",X"BA",X"B3",X"BF",X"B3",X"B4",X"B3", + X"C1",X"B3",X"58",X"7E",X"90",X"4F",X"61",X"D0",X"E6",X"38",X"C7",X"61",X"59",X"7E",X"90",X"47", + X"61",X"79",X"6E",X"38",X"47",X"C9",X"75",X"7E",X"20",X"A7",X"80",X"3A",X"75",X"34",X"2F",X"DD", + X"5E",X"2F",X"75",X"B6",X"86",X"70",X"75",X"9E",X"87",X"28",X"65",X"91",X"9B",X"61",X"75",X"D6", + X"2C",X"FE",X"2B",X"20",X"29",X"3D",X"2F",X"C6",X"24",X"07",X"0F",X"DD",X"DF",X"2A",X"75",X"7E", + X"84",X"F6",X"83",X"88",X"84",X"75",X"63",X"2A",X"66",X"65",X"2B",X"B1",X"61",X"75",X"63",X"A9", + X"6E",X"CC",X"00",X"B3",X"65",X"06",X"BB",X"C9",X"75",X"36",X"22",X"29",X"75",X"36",X"21",X"27", + X"75",X"D6",X"84",X"F6",X"83",X"88",X"81",X"95",X"A7",X"94",X"E6",X"AC",X"87",X"0F",X"75",X"DF", + X"2A",X"DD",X"D6",X"2C",X"F6",X"2B",X"88",X"2C",X"75",X"CB",X"2A",X"46",X"65",X"83",X"B1",X"DD", + X"9E",X"A8",X"7F",X"61",X"75",X"63",X"01",X"6E",X"64",X"97",X"1B",X"65",X"8A",X"B4",X"61",X"75", + X"9E",X"22",X"2C",X"DD",X"9E",X"21",X"27",X"DD",X"D6",X"32",X"AF",X"20",X"24",X"DD",X"9E",X"28", + X"80",X"75",X"9E",X"29",X"80",X"65",X"66",X"33",X"61",X"65",X"6E",X"B3",X"65",X"A9",X"1C",X"75", + X"9C",X"28",X"75",X"34",X"29",X"CD",X"F0",X"B6",X"96",X"3B",X"65",X"4C",X"63",X"C9",X"75",X"7E", + X"12",X"95",X"A7",X"1E",X"80",X"57",X"89",X"29",X"1C",X"11",X"56",X"8B",X"D6",X"65",X"2F",X"A0", + X"41",X"28",X"28",X"A0",X"28",X"40",X"29",X"80",X"2A",X"55",X"F6",X"1A",X"CE",X"07",X"B5",X"3E", + X"80",X"FF",X"89",X"BE",X"1C",X"B9",X"5E",X"7D",X"DF",X"2A",X"65",X"83",X"19",X"69",X"A4",X"88", + X"8C",X"90",X"B2",X"24",X"88",X"8F",X"48",X"55",X"F6",X"0A",X"B5",X"A0",X"2C",X"55",X"FF",X"0A", + X"61",X"7D",X"9E",X"A9",X"80",X"7D",X"9C",X"BF",X"65",X"F0",X"1E",X"6D",X"70",X"EB",X"89",X"98", + X"8D",X"BD",X"A9",X"DF",X"8D",X"BE",X"08",X"A3",X"BE",X"08",X"41",X"A9",X"DD",X"8D",X"F6",X"8F", + X"88",X"BA",X"75",X"96",X"17",X"28",X"65",X"8F",X"08",X"B5",X"07",X"AF",X"EE",X"2B",X"E6",X"2C", + X"6F",X"B2",X"98",X"8D",X"90",X"58",X"B6",X"04",X"BA",X"BB",X"8C",X"41",X"BD",X"A9",X"4A",X"8D", + X"46",X"83",X"C6",X"83",X"58",X"09",X"08",X"D0",X"E5",X"6D",X"E6",X"6A",X"E1",X"6D",X"76",X"B4", + X"55",X"F9",X"28",X"55",X"F8",X"01",X"45",X"CE",X"33",X"55",X"BE",X"02",X"DC",X"45",X"8F",X"28", + X"1D",X"46",X"87",X"B4",X"75",X"D7",X"83",X"6D",X"2B",X"B1",X"75",X"F6",X"14",X"7D",X"DF",X"2E", + X"55",X"BE",X"A9",X"00",X"55",X"BE",X"AB",X"06",X"45",X"7C",X"A5",X"CE",X"2F",X"B4",X"55",X"FF", + X"16",X"7D",X"9E",X"BB",X"94",X"7D",X"9C",X"BF",X"86",X"2B",X"65",X"4F",X"10",X"81",X"16",X"8D", + X"39",X"20",X"28",X"2E",X"2C",X"B6",X"2A",X"96",X"40",X"31",X"38",X"FB",X"A9",X"1F",X"8D",X"2E", + X"84",X"B6",X"82",X"36",X"08",X"2C",X"11",X"98",X"7A",X"69",X"0B",X"96",X"82",X"69",X"58",X"8F", + X"2F",X"2F",X"6F",X"F1",X"4E",X"02",X"2F",X"2F",X"2F",X"67",X"41",X"55",X"43",X"09",X"6E",X"44", + X"FE",X"B4",X"65",X"D7",X"1C",X"69",X"75",X"96",X"02",X"2C",X"75",X"96",X"01",X"AF",X"61",X"B2", + X"AC",X"00",X"EE",X"B7",X"68",X"DD",X"D6",X"22",X"95",X"28",X"2C",X"DD",X"DF",X"22",X"61",X"DD", + X"5E",X"AB",X"1D",X"80",X"93",X"75",X"DF",X"AB",X"75",X"9E",X"01",X"28",X"75",X"D6",X"82",X"7E", + X"2C",X"DD",X"DF",X"2A",X"65",X"83",X"B1",X"C9",X"75",X"34",X"37",X"C9",X"75",X"CB",X"21",X"6E", + X"64",X"56",X"1C",X"65",X"9F",X"B5",X"61",X"92",X"8C",X"88",X"EE",X"B7",X"E0",X"75",X"5E",X"AA", + X"95",X"28",X"2C",X"DD",X"DF",X"22",X"61",X"DD",X"D6",X"23",X"95",X"28",X"3B",X"DD",X"DF",X"23", + X"75",X"9E",X"01",X"28",X"75",X"D6",X"82",X"6E",X"84",X"75",X"DF",X"2A",X"65",X"83",X"19",X"61", + X"75",X"34",X"37",X"21",X"10",X"05",X"9D",X"DD",X"9E",X"28",X"28",X"DD",X"9E",X"29",X"28",X"CD", + X"66",X"33",X"61",X"75",X"89",X"08",X"25",X"75",X"5E",X"BF",X"91",X"08",X"1D",X"6B",X"27",X"A5", + X"70",X"BB",X"18",X"B5",X"97",X"B5",X"C1",X"B7",X"7B",X"68",X"12",X"68",X"9B",X"B7",X"E0",X"BB", + X"65",X"EA",X"19",X"75",X"63",X"A9",X"C6",X"64",X"36",X"B5",X"65",X"07",X"1D",X"61",X"75",X"9E", + X"22",X"2A",X"75",X"36",X"21",X"27",X"61",X"3A",X"AC",X"00",X"AF",X"C0",X"75",X"7E",X"22",X"3D", + X"08",X"2C",X"75",X"DF",X"02",X"61",X"75",X"9E",X"01",X"28",X"75",X"9E",X"17",X"2A",X"61",X"75", + X"89",X"08",X"05",X"CD",X"62",X"B1",X"75",X"34",X"2F",X"DD",X"D6",X"2F",X"75",X"BE",X"2E",X"D8", + X"75",X"9E",X"87",X"28",X"65",X"2E",X"1E",X"89",X"EC",X"B5",X"ED",X"75",X"5E",X"2C",X"91",X"C6", + X"B5",X"C3",X"07",X"A5",X"75",X"7E",X"2D",X"DD",X"ED",X"E1",X"65",X"7C",X"B9",X"C9",X"DE",X"B5", + X"7A",X"B5",X"7E",X"B5",X"82",X"B6",X"75",X"9D",X"81",X"61",X"75",X"9C",X"81",X"61",X"75",X"9D", + X"28",X"41",X"55",X"BC",X"28",X"41",X"55",X"F6",X"28",X"CE",X"AF",X"D6",X"A8",X"A8",X"2F",X"55", + X"5E",X"29",X"EE",X"AF",X"08",X"2C",X"65",X"06",X"1E",X"69",X"65",X"54",X"1E",X"6D",X"A0",X"B7", + X"55",X"43",X"A8",X"46",X"42",X"5C",X"B6",X"45",X"F0",X"3E",X"55",X"F6",X"2C",X"39",X"36",X"3E", + X"65",X"8F",X"0D",X"68",X"E9",X"69",X"1E",X"B6",X"56",X"B6",X"CF",X"B6",X"4F",X"B6",X"85",X"6D", + X"6C",X"3E",X"48",X"24",X"45",X"6F",X"A1",X"F6",X"D6",X"20",X"40",X"D6",X"08",X"50",X"D6",X"90", + X"18",X"A8",X"7E",X"98",X"70",X"76",X"34",X"B0",X"81",X"69",X"3F",X"69",X"E9",X"69",X"84",X"8C", + X"45",X"44",X"B6",X"48",X"24",X"30",X"DD",X"25",X"45",X"44",X"B6",X"48",X"2C",X"30",X"5D",X"24", + X"04",X"6D",X"C4",X"B6",X"E0",X"8C",X"10",X"CC",X"75",X"F6",X"80",X"6B",X"1F",X"6B",X"1F",X"6B", + X"B7",X"5E",X"2A",X"67",X"55",X"F6",X"29",X"43",X"B7",X"43",X"B7",X"43",X"B7",X"6F",X"41",X"D5", + X"5E",X"28",X"63",X"B7",X"63",X"B7",X"63",X"B7",X"F6",X"2A",X"47",X"75",X"5E",X"29",X"63",X"B7", + X"43",X"B7",X"43",X"B7",X"6F",X"41",X"B2",X"19",X"88",X"8F",X"40",X"45",X"D3",X"2A",X"A7",X"CE", + X"07",X"68",X"86",X"2C",X"07",X"B0",X"83",X"98",X"7B",X"69",X"1E",X"2C",X"B0",X"7D",X"3E",X"2C", + X"40",X"55",X"F6",X"00",X"CE",X"0F",X"D6",X"08",X"A0",X"12",X"D6",X"04",X"50",X"D6",X"AC",X"58", + X"86",X"2B",X"7E",X"A8",X"18",X"2A",X"86",X"2A",X"75",X"D0",X"84",X"69",X"75",X"F6",X"81",X"46", + X"AF",X"D6",X"2C",X"B0",X"2B",X"D6",X"AC",X"50",X"2E",X"01",X"D6",X"08",X"B8",X"02",X"2E",X"00", + X"75",X"D0",X"84",X"69",X"1A",X"B9",X"20",X"07",X"08",X"A5",X"2F",X"92",X"FC",X"8C",X"75",X"96", + X"20",X"28",X"65",X"D3",X"A2",X"2F",X"EE",X"27",X"60",X"DD",X"9E",X"20",X"D7",X"DD",X"4E",X"2C", + X"75",X"D8",X"90",X"0E",X"84",X"07",X"18",X"2B",X"90",X"D3",X"61",X"96",X"84",X"38",X"75",X"DF", + X"2C",X"CB",X"77",X"32",X"DC",X"04",X"61",X"2A",X"DA",X"04",X"19",X"DD",X"04",X"EB",X"12",X"CB", + X"C6",X"80",X"01",X"1B",X"6D",X"5B",X"FA",X"8C",X"07",X"07",X"07",X"07",X"9C",X"E3",X"63",X"5F", + X"FD",X"C4",X"13",X"B7",X"F9",X"DD",X"9E",X"20",X"28",X"CB",X"57",X"C8",X"EE",X"2B",X"75",X"77", + X"84",X"75",X"9E",X"A8",X"7F",X"61",X"65",X"D2",X"1E",X"65",X"A5",X"B7",X"0A",X"52",X"24",X"19", + X"DD",X"04",X"E3",X"3A",X"DC",X"04",X"63",X"46",X"80",X"3B",X"07",X"0F",X"07",X"0F",X"EE",X"D8", + X"C7",X"12",X"EE",X"AF",X"B8",X"1A",X"93",X"E5",X"D3",X"52",X"24",X"9C",X"61",X"1A",X"9C",X"61", + X"92",X"31",X"00",X"A7",X"60",X"CD",X"D3",X"A2",X"87",X"CB",X"D7",X"28",X"A9",X"DD",X"D6",X"27", + X"1C",X"60",X"75",X"9E",X"07",X"D7",X"89",X"54",X"24",X"63",X"F6",X"92",X"3F",X"8D",X"AF",X"68", + X"96",X"29",X"9A",X"97",X"05",X"DD",X"9E",X"37",X"2B",X"DD",X"9E",X"23",X"28",X"C9",X"75",X"36", + X"07",X"28",X"61",X"96",X"16",X"65",X"F1",X"A0",X"65",X"DA",X"1F",X"0E",X"04",X"06",X"12",X"6D", + X"63",X"40",X"80",X"29",X"04",X"79",X"0F",X"07",X"75",X"77",X"2A",X"CD",X"83",X"B1",X"96",X"20", + X"65",X"59",X"08",X"69",X"90",X"C1",X"75",X"9C",X"17",X"61",X"2F",X"89",X"FB",X"8F",X"91",X"2A", + X"28",X"77",X"11",X"77",X"11",X"77",X"11",X"77",X"61",X"DD",X"D6",X"23",X"19",X"DA",X"B7",X"C3", + X"27",X"A5",X"7A",X"B7",X"8B",X"68",X"17",X"68",X"46",X"68",X"86",X"28",X"75",X"D6",X"84",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..45b338e5 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"A3",X"80",X"A1",X"15",X"0F",X"EE",X"A6",X"A8",X"8F",X"A7",X"7D",X"D7",X"A2",X"7D",X"F6",X"8C", + X"D6",X"8B",X"20",X"8C",X"DD",X"63",X"2A",X"6E",X"CD",X"23",X"B1",X"75",X"34",X"AB",X"C9",X"86", + X"A1",X"30",X"79",X"7D",X"6B",X"A9",X"E6",X"6C",X"06",X"C8",X"6D",X"97",X"E0",X"69",X"7D",X"96", + X"AA",X"89",X"DD",X"9E",X"A9",X"AF",X"C9",X"1A",X"24",X"28",X"07",X"E0",X"DD",X"5E",X"AA",X"1D", + X"A0",X"8C",X"7D",X"D7",X"22",X"69",X"7D",X"96",X"21",X"88",X"7D",X"94",X"23",X"69",X"7D",X"96", + X"BF",X"8A",X"C9",X"75",X"F6",X"AB",X"39",X"FC",X"68",X"E3",X"8F",X"A5",X"D2",X"B7",X"E6",X"C8", + X"37",X"C8",X"46",X"C8",X"5A",X"B7",X"46",X"C8",X"37",X"C8",X"46",X"C8",X"66",X"C8",X"7D",X"6B", + X"A9",X"CE",X"CC",X"F1",X"68",X"65",X"0A",X"C8",X"C9",X"75",X"36",X"AA",X"2A",X"75",X"36",X"A9", + X"27",X"69",X"B2",X"84",X"28",X"CE",X"37",X"E8",X"7D",X"56",X"22",X"15",X"A0",X"8C",X"7D",X"D7", + X"AA",X"61",X"DD",X"9E",X"A9",X"88",X"DD",X"9C",X"AB",X"61",X"DD",X"5E",X"AB",X"91",X"03",X"C8", + X"4B",X"2F",X"05",X"15",X"E0",X"E6",X"E0",X"34",X"E0",X"E6",X"E0",X"15",X"E0",X"E6",X"E0",X"34", + X"68",X"E6",X"68",X"4E",X"68",X"65",X"5A",X"C8",X"CD",X"72",X"B7",X"61",X"CD",X"6E",X"68",X"65", + X"37",X"C8",X"6D",X"C7",X"E1",X"69",X"6D",X"E2",X"06",X"7D",X"96",X"BF",X"A2",X"69",X"8E",X"89", + X"B8",X"8A",X"2E",X"88",X"DD",X"5E",X"2C",X"A7",X"08",X"87",X"2F",X"87",X"3E",X"88",X"FF",X"89", + X"87",X"C9",X"B9",X"66",X"83",X"E6",X"83",X"F6",X"83",X"76",X"83",X"56",X"7D",X"D7",X"B0",X"FD", + X"CD",X"E7",X"A1",X"F1",X"5D",X"75",X"CB",X"98",X"7E",X"08",X"29",X"14",X"73",X"F1",X"CD",X"B8", + X"E1",X"5D",X"65",X"C7",X"01",X"59",X"7D",X"DD",X"63",X"18",X"F6",X"20",X"A1",X"BC",X"DB",X"59", + X"CD",X"18",X"69",X"3D",X"3D",X"20",X"D8",X"C9",X"DD",X"CB",X"38",X"46",X"A0",X"01",X"AC",X"DD", + X"63",X"18",X"66",X"A0",X"A1",X"2C",X"61",X"08",X"A1",X"14",X"B4",X"09",X"A0",X"08",X"A0",X"08", + X"29",X"1C",X"3C",X"05",X"28",X"00",X"28",X"00",X"20",X"1C",X"3C",X"01",X"28",X"00",X"28",X"00", + X"80",X"14",X"B4",X"0D",X"A0",X"08",X"A0",X"08",X"A1",X"88",X"B2",X"0A",X"A0",X"08",X"A0",X"08", + X"29",X"20",X"3A",X"06",X"28",X"00",X"28",X"1B",X"29",X"20",X"3A",X"02",X"28",X"00",X"28",X"1B", + X"A1",X"88",X"B2",X"0E",X"A0",X"08",X"A0",X"DD",X"89",X"08",X"2D",X"CD",X"AC",X"49",X"75",X"21", + X"20",X"8D",X"CD",X"84",X"69",X"DD",X"21",X"40",X"8D",X"CD",X"0C",X"41",X"DD",X"21",X"60",X"8D", + X"65",X"2C",X"E1",X"C9",X"75",X"EE",X"A0",X"DD",X"4E",X"09",X"75",X"F6",X"37",X"07",X"60",X"D6", + X"2A",X"48",X"B2",X"84",X"8D",X"39",X"9B",X"41",X"4B",X"8F",X"A5",X"A3",X"69",X"AC",X"69",X"B2", + X"E1",X"B0",X"E1",X"B6",X"B0",X"90",X"68",X"DD",X"9E",X"17",X"A3",X"C9",X"96",X"F8",X"B0",X"48", + X"B8",X"F5",X"B6",X"18",X"91",X"48",X"B8",X"EF",X"B6",X"D8",X"91",X"48",X"B8",X"E9",X"DD",X"21", + X"88",X"25",X"19",X"63",X"E1",X"DD",X"D6",X"17",X"6B",X"27",X"05",X"50",X"93",X"71",X"E1",X"B5", + X"6B",X"E9",X"6C",X"29",X"6D",X"59",X"33",X"68",X"33",X"DD",X"45",X"D5",X"41",X"DD",X"21",X"80", + X"2D",X"CD",X"50",X"96",X"F5",X"36",X"30",X"08",X"F5",X"36",X"31",X"08",X"75",X"F6",X"A4",X"39", + X"BA",X"43",X"CD",X"8F",X"A5",X"20",X"75",X"CD",X"F0",X"43",X"DD",X"F6",X"2C",X"39",X"01",X"43", + X"6D",X"2F",X"05",X"00",X"22",X"5E",X"D0",X"7A",X"BC",X"CA",X"76",X"08",X"5A",X"1C",X"E2",X"6D", + X"F0",X"CB",X"CD",X"21",X"6B",X"7D",X"CB",X"B8",X"66",X"E4",X"D1",X"CA",X"CD",X"FE",X"6A",X"65", + X"50",X"CB",X"F0",X"A7",X"8F",X"A7",X"CF",X"51",X"4E",X"8A",X"8F",X"A7",X"8F",X"67",X"7D",X"56", + X"2C",X"7D",X"45",X"75",X"41",X"75",X"77",X"8C",X"DD",X"D9",X"28",X"75",X"70",X"89",X"CD",X"7B", + X"E3",X"7D",X"96",X"AF",X"A0",X"16",X"D0",X"7D",X"6B",X"B8",X"C6",X"00",X"A2",X"16",X"D4",X"7D", + X"77",X"8A",X"CD",X"23",X"B1",X"75",X"34",X"BF",X"2E",X"8D",X"CD",X"27",X"B8",X"61",X"CD",X"67", + X"E2",X"F8",X"B2",X"48",X"2D",X"B8",X"6B",X"5F",X"75",X"D7",X"31",X"69",X"B6",X"98",X"36",X"00", + X"39",X"1C",X"96",X"08",X"AD",X"75",X"36",X"BF",X"2A",X"7D",X"45",X"75",X"41",X"75",X"36",X"BF", + X"A0",X"69",X"7D",X"96",X"37",X"8D",X"75",X"CD",X"7D",X"C9",X"7D",X"96",X"37",X"88",X"8E",X"8B", + X"CD",X"27",X"B8",X"61",X"DD",X"9E",X"BF",X"8C",X"D5",X"63",X"B8",X"C6",X"A0",X"8D",X"D5",X"9E", + X"37",X"88",X"69",X"6D",X"50",X"CB",X"75",X"CD",X"7D",X"C9",X"7D",X"96",X"37",X"88",X"4D",X"A6", + X"2A",X"65",X"87",X"B8",X"49",X"65",X"4E",X"CA",X"CB",X"6E",X"CB",X"DE",X"C8",X"89",X"98",X"2D", + X"95",X"81",X"7D",X"2D",X"95",X"69",X"81",X"48",X"2C",X"B6",X"A5",X"6B",X"F6",X"00",X"22",X"83", + X"23",X"8B",X"23",X"8B",X"23",X"95",X"20",X"53",X"C9",X"9E",X"08",X"ED",X"23",X"9E",X"A9",X"8B", + X"D1",X"83",X"D0",X"83",X"83",X"96",X"A1",X"6D",X"4F",X"CA",X"41",X"F8",X"96",X"48",X"69",X"6D", + X"AA",X"90",X"58",X"2F",X"77",X"8B",X"77",X"9F",X"C9",X"C8",X"E1",X"6D",X"FB",X"10",X"8D",X"65", + X"39",X"85",X"60",X"D5",X"9C",X"10",X"E5",X"FB",X"9A",X"25",X"65",X"31",X"05",X"C8",X"F5",X"34", + X"B8",X"C5",X"FB",X"B4",X"8D",X"CD",X"99",X"2D",X"C8",X"C9",X"22",X"43",X"37",X"43",X"ED",X"43", + X"C2",X"4B",X"0D",X"CD",X"47",X"81",X"96",X"12",X"B6",X"C8",X"F5",X"CB",X"30",X"EE",X"96",X"16", + X"96",X"C8",X"D5",X"CB",X"B8",X"A6",X"C9",X"2C",X"2C",X"CD",X"E7",X"29",X"B6",X"18",X"96",X"C8", + X"F5",X"CB",X"30",X"EE",X"96",X"14",X"B6",X"C8",X"F5",X"CB",X"30",X"AE",X"61",X"AD",X"65",X"C7", + X"A1",X"B6",X"B9",X"96",X"C8",X"D5",X"CB",X"18",X"46",X"B6",X"BD",X"96",X"C8",X"D5",X"CB",X"18", + X"8E",X"C9",X"04",X"AC",X"65",X"C7",X"01",X"B6",X"30",X"96",X"60",X"D5",X"63",X"10",X"CE",X"B6", + X"BC",X"96",X"C8",X"D5",X"CB",X"18",X"06",X"C9",X"CD",X"78",X"B6",X"DD",X"F6",X"04",X"39",X"85", + X"E3",X"CD",X"2F",X"85",X"61",X"25",X"E3",X"3A",X"E3",X"3F",X"E3",X"34",X"E3",X"F0",X"7E",X"0A", + X"6F",X"C9",X"F0",X"4E",X"2A",X"6F",X"C9",X"F1",X"5E",X"02",X"EF",X"C9",X"F1",X"4E",X"2A",X"EF", + X"61",X"07",X"11",X"1F",X"11",X"13",X"11",X"16",X"11",X"C5",X"4B",X"08",X"28",X"CD",X"A0",X"81", + X"CD",X"00",X"A1",X"CD",X"BE",X"29",X"CD",X"00",X"A1",X"CD",X"28",X"29",X"C9",X"DD",X"34",X"07", + X"75",X"F6",X"A7",X"DD",X"B6",X"0E",X"70",X"DD",X"9E",X"0F",X"A0",X"CD",X"CD",X"4B",X"89",X"73", + X"6B",X"45",X"DD",X"F6",X"2C",X"39",X"4E",X"33",X"4B",X"8F",X"A5",X"DD",X"F6",X"05",X"DD",X"45", + X"E9",X"CD",X"F4",X"99",X"61",X"DD",X"D6",X"08",X"EE",X"07",X"F6",X"00",X"68",X"DD",X"D6",X"09", + X"46",X"0F",X"48",X"CD",X"31",X"44",X"CD",X"78",X"B6",X"DD",X"F6",X"04",X"39",X"85",X"6B",X"CD", + X"2F",X"A5",X"7D",X"56",X"A4",X"B1",X"89",X"CB",X"6D",X"2F",X"05",X"68",X"76",X"D0",X"B0",X"8B", + X"D6",X"08",X"D8",X"75",X"34",X"BF",X"CD",X"F0",X"B6",X"75",X"F6",X"8C",X"39",X"0D",X"6B",X"65", + X"2F",X"A5",X"B6",X"88",X"92",X"8A",X"28",X"4D",X"CB",X"88",X"28",X"16",X"34",X"6D",X"A0",X"A7", + X"C9",X"7D",X"21",X"88",X"8D",X"65",X"EE",X"CC",X"D5",X"89",X"20",X"2D",X"CD",X"EE",X"6C",X"7D", + X"81",X"C8",X"2D",X"6D",X"66",X"CC",X"75",X"81",X"C0",X"2D",X"6D",X"EE",X"E4",X"69",X"75",X"56", + X"BF",X"AF",X"C8",X"7E",X"2E",X"F0",X"DD",X"5E",X"2C",X"91",X"FF",X"CC",X"4B",X"2F",X"A5",X"C7", + X"E4",X"2E",X"E4",X"20",X"E4",X"6F",X"E4",X"6D",X"50",X"B6",X"D8",X"71",X"6D",X"2F",X"16",X"52", + X"90",X"08",X"AC",X"1C",X"90",X"08",X"A8",X"1D",X"B5",X"38",X"A0",X"8B",X"B5",X"38",X"48",X"5B", + X"31",X"00",X"A3",X"15",X"31",X"E8",X"7D",X"94",X"27",X"5D",X"96",X"BF",X"21",X"69",X"6D",X"F0", + X"B6",X"D0",X"F9",X"65",X"8F",X"B6",X"F2",X"38",X"A0",X"45",X"B5",X"38",X"A0",X"41",X"B4",X"1C", + X"30",X"00",X"7C",X"14",X"30",X"00",X"78",X"69",X"6D",X"F0",X"16",X"F0",X"F9",X"6D",X"2F",X"B6", + X"F3",X"39",X"A0",X"AC",X"B4",X"39",X"A0",X"A8",X"B5",X"1D",X"91",X"08",X"2B",X"1D",X"91",X"E0", + X"F2",X"18",X"A0",X"8B",X"B5",X"18",X"48",X"7D",X"94",X"AF",X"75",X"96",X"37",X"A9",X"69",X"6D", + X"F0",X"B6",X"78",X"51",X"CD",X"2F",X"B6",X"5B",X"91",X"08",X"45",X"1D",X"91",X"08",X"41",X"1C", + X"B4",X"19",X"A0",X"7C",X"B4",X"19",X"A0",X"78",X"69",X"6D",X"0D",X"B2",X"75",X"81",X"A0",X"2D", + X"D5",X"5E",X"BF",X"7E",X"AA",X"88",X"2C",X"7D",X"36",X"A8",X"28",X"7D",X"21",X"80",X"8D",X"7D", + X"D6",X"17",X"F6",X"02",X"88",X"0C",X"F5",X"36",X"20",X"08",X"F5",X"21",X"E0",X"25",X"F5",X"F6", + X"BF",X"D6",X"AA",X"20",X"2C",X"D5",X"36",X"08",X"28",X"D5",X"21",X"60",X"8D",X"D5",X"F6",X"1F", + X"F6",X"02",X"88",X"0C",X"F5",X"36",X"20",X"08",X"61",X"CD",X"50",X"96",X"E5",X"6B",X"A0",X"20", + X"DD",X"CB",X"B8",X"66",X"4A",X"BC",X"6D",X"DD",X"F6",X"19",X"CB",X"F7",X"A0",X"11",X"46",X"7F", + X"2F",X"3E",X"A0",X"FF",X"89",X"6A",X"2D",X"B9",X"D9",X"23",X"D8",X"DD",X"9E",X"11",X"A0",X"B6", + X"A9",X"32",X"2A",X"88",X"CD",X"FE",X"A6",X"DD",X"34",X"1F",X"2E",X"04",X"CD",X"AF",X"B8",X"DD", + X"D6",X"07",X"AF",X"C8",X"0E",X"0D",X"65",X"6F",X"30",X"39",X"80",X"08",X"96",X"02",X"F5",X"21", + X"28",X"8D",X"D5",X"96",X"BF",X"A0",X"38",X"D5",X"B9",X"D5",X"96",X"1F",X"A0",X"09",X"D5",X"B9", + X"F5",X"96",X"37",X"A0",X"A2",X"D5",X"11",X"DD",X"4E",X"07",X"F5",X"70",X"32",X"D5",X"9C",X"17", + X"D5",X"21",X"20",X"8D",X"D5",X"96",X"BF",X"20",X"2F",X"D5",X"36",X"1A",X"28",X"D5",X"34",X"1F", + X"F5",X"B9",X"F5",X"96",X"37",X"20",X"A7",X"D5",X"9E",X"12",X"A0",X"D5",X"9C",X"17",X"F5",X"B9", + X"D5",X"96",X"BF",X"48",X"D5",X"36",X"BA",X"00",X"D5",X"34",X"BF",X"C9",X"DD",X"F6",X"B8",X"46", + X"27",X"0F",X"1E",X"08",X"57",X"21",X"98",X"25",X"11",X"71",X"8B",X"70",X"96",X"01",X"9A",X"0A", + X"88",X"CD",X"81",X"2F",X"DD",X"36",X"28",X"00",X"DD",X"36",X"29",X"00",X"CD",X"CE",X"33",X"DD", + X"9C",X"17",X"65",X"E3",X"E5",X"CD",X"62",X"4E",X"6B",X"52",X"E5",X"DD",X"63",X"1E",X"56",X"48", + X"C5",X"EB",X"10",X"8D",X"CD",X"D8",X"EB",X"C5",X"EB",X"B2",X"8D",X"CD",X"D8",X"4B",X"C5",X"EB", + X"9C",X"2D",X"6D",X"78",X"63",X"7D",X"96",X"9F",X"A0",X"6D",X"B2",X"CE",X"48",X"7D",X"96",X"9F", + X"D7",X"61",X"C5",X"43",X"10",X"2D",X"C5",X"53",X"12",X"2D",X"CD",X"A2",X"6E",X"60",X"C5",X"53", + X"9C",X"2D",X"6D",X"A2",X"E6",X"68",X"65",X"63",X"9A",X"2D",X"86",X"88",X"F0",X"EE",X"A2",X"BA", + X"D8",X"7E",X"2D",X"F0",X"5E",X"8A",X"A0",X"89",X"24",X"59",X"4E",X"8A",X"1B",X"70",X"D6",X"8D", + X"58",X"FE",X"A2",X"00",X"A1",X"84",X"B6",X"89",X"1C",X"69",X"7D",X"6B",X"B6",X"F6",X"48",X"6D", + X"1E",X"E8",X"A0",X"8C",X"CD",X"C3",X"E8",X"E0",X"DD",X"9E",X"3F",X"88",X"2E",X"8B",X"CD",X"29", + X"30",X"36",X"81",X"6D",X"52",X"A6",X"8E",X"C8",X"4D",X"50",X"46",X"8B",X"99",X"3E",X"E7",X"6D", + X"8F",X"A5",X"B6",X"8A",X"CD",X"59",X"A0",X"E1",X"4D",X"58",X"B5",X"EE",X"2F",X"1C",X"CD",X"76", + X"E7",X"E9",X"4D",X"60",X"6D",X"9F",X"60",X"16",X"A2",X"6D",X"F9",X"A0",X"49",X"B0",X"79",X"6D", + X"17",X"91",X"CD",X"38",X"AF",X"89",X"E4",X"CF",X"CD",X"A6",X"AF",X"89",X"F1",X"CF",X"DD",X"63", + X"B6",X"F6",X"A0",X"8B",X"81",X"28",X"E7",X"6D",X"DC",X"A1",X"81",X"D1",X"E7",X"6D",X"DC",X"A1", + X"21",X"09",X"6F",X"65",X"54",X"A1",X"B6",X"A2",X"CD",X"59",X"A0",X"86",X"2F",X"65",X"4F",X"B8", + X"8E",X"C4",X"81",X"60",X"A3",X"7D",X"6B",X"9E",X"56",X"00",X"A5",X"A6",X"92",X"81",X"DC",X"89", + X"4D",X"ED",X"F0",X"EE",X"2B",X"64",X"EF",X"CF",X"39",X"AA",X"28",X"65",X"87",X"A0",X"41",X"91", + X"22",X"88",X"27",X"4D",X"DA",X"CD",X"6D",X"C8",X"03",X"86",X"B2",X"06",X"22",X"82",X"A0",X"28", + X"CD",X"DC",X"A4",X"1E",X"2A",X"65",X"59",X"A0",X"41",X"E1",X"4D",X"ED",X"E8",X"65",X"3F",X"E8", + X"E9",X"49",X"18",X"64",X"0E",X"F7",X"65",X"6F",X"30",X"2E",X"20",X"CD",X"EF",X"10",X"96",X"48", + X"CD",X"D1",X"A0",X"CD",X"92",X"0F",X"DD",X"36",X"3E",X"FF",X"B6",X"09",X"CD",X"FE",X"6F",X"CD", + X"42",X"86",X"75",X"45",X"75",X"21",X"A0",X"25",X"65",X"38",X"E7",X"DD",X"89",X"88",X"2D",X"CD", + X"18",X"47",X"DD",X"21",X"68",X"8D",X"CD",X"90",X"6F",X"DD",X"21",X"60",X"8D",X"CD",X"18",X"47", + X"75",X"21",X"A8",X"25",X"65",X"66",X"93",X"B6",X"80",X"CD",X"F9",X"80",X"75",X"41",X"61",X"CB", + X"78",X"A0",X"3C",X"4D",X"AE",X"24",X"B6",X"0B",X"32",X"02",X"88",X"CD",X"9E",X"28",X"B5",X"A0", + X"A4",X"6F",X"65",X"8E",X"05",X"49",X"61",X"4D",X"06",X"80",X"10",X"E2",X"21",X"18",X"B0",X"02", + X"2D",X"0A",X"39",X"18",X"6A",X"4F",X"EE",X"55",X"5B",X"0B",X"3A",X"10",X"31",X"30",X"30",X"30", + X"98",X"06",X"B3",X"11",X"F0",X"5C",X"F3",X"B2",X"23",X"1A",X"B0",X"88",X"95",X"98",X"90",X"B8", + X"CD",X"CE",X"33",X"B6",X"2A",X"DD",X"96",X"1F",X"48",X"DD",X"36",X"1F",X"2B",X"C9",X"5A",X"47", + X"48",X"4F",X"8E",X"4F",X"1C",X"4F",X"E5",X"EB",X"98",X"25",X"65",X"70",X"63",X"C5",X"43",X"BA", + X"8D",X"CD",X"4A",X"4B",X"C5",X"EB",X"14",X"8D",X"CD",X"C2",X"EB",X"C9",X"C5",X"EB",X"10",X"8D", + X"65",X"6A",X"63",X"C5",X"43",X"BA",X"2D",X"CD",X"78",X"43",X"E5",X"EB",X"9C",X"25",X"65",X"6A", + X"EB",X"C9",X"C5",X"EB",X"10",X"8D",X"CD",X"C2",X"EB",X"C5",X"EB",X"B2",X"8D",X"CD",X"4A",X"4B", + X"E5",X"EB",X"9C",X"25",X"65",X"70",X"63",X"C9",X"E5",X"EB",X"98",X"25",X"65",X"70",X"63",X"C5", + X"EB",X"B2",X"8D",X"CD",X"D8",X"4B",X"C5",X"EB",X"14",X"8D",X"CD",X"D8",X"EB",X"C9",X"21",X"62", + X"AC",X"B1",X"C3",X"0C",X"8E",X"BA",X"4D",X"A1",X"35",X"88",X"D7",X"4D",X"10",X"83",X"83",X"83", + X"3B",X"93",X"3B",X"E1",X"38",X"50",X"C9",X"89",X"01",X"0F",X"39",X"80",X"28",X"86",X"AE",X"59", + X"46",X"8F",X"4E",X"9E",X"D7",X"8F",X"65",X"F2",X"D7",X"8F",X"65",X"F2",X"AC",X"B0",X"D8",X"81", + X"6A",X"0C",X"2E",X"AF",X"F1",X"EE",X"2F",X"E6",X"3E",X"DF",X"23",X"DF",X"23",X"04",X"38",X"54", + X"81",X"8A",X"AC",X"A6",X"26",X"51",X"46",X"8F",X"4E",X"9E",X"D7",X"83",X"D7",X"83",X"AC",X"B0", + X"54",X"89",X"97",X"0F",X"2E",X"AF",X"F1",X"EE",X"2F",X"E6",X"3E",X"DF",X"A3",X"DF",X"A3",X"04", + X"98",X"54",X"69",X"81",X"98",X"2D",X"F6",X"83",X"83",X"1E",X"48",X"83",X"83",X"1E",X"48",X"6D", + X"58",X"E8",X"21",X"11",X"8D",X"91",X"2A",X"88",X"F6",X"11",X"B5",X"1D",X"96",X"E0",X"B9",X"1D", + X"B5",X"1E",X"48",X"12",X"98",X"2D",X"76",X"89",X"A0",X"8E",X"76",X"B9",X"A0",X"8A",X"27",X"69", + X"DD",X"9E",X"3E",X"77",X"87",X"61",X"21",X"11",X"8D",X"5E",X"23",X"8B",X"96",X"E0",X"23",X"8B", + X"36",X"E8",X"6D",X"4B",X"60",X"81",X"98",X"2D",X"99",X"8A",X"A0",X"56",X"B9",X"15",X"B5",X"1E", + X"48",X"11",X"B5",X"1D",X"96",X"E0",X"B2",X"11",X"8D",X"7E",X"2A",X"08",X"5B",X"7E",X"BE",X"08", + X"6F",X"0F",X"69",X"81",X"98",X"2D",X"8E",X"8A",X"4D",X"6D",X"7D",X"E8",X"49",X"B0",X"59",X"69", + X"21",X"10",X"8D",X"86",X"2A",X"E5",X"CD",X"73",X"E8",X"E1",X"38",X"71",X"C9",X"ED",X"FE",X"8B", + X"DE",X"83",X"F3",X"1E",X"B0",X"AA",X"83",X"83",X"98",X"71",X"41",X"D3",X"83",X"D2",X"83",X"69", + X"F6",X"DB",X"FF",X"8B",X"F6",X"DA",X"7F",X"8B",X"F3",X"10",X"C5",X"ED",X"FE",X"8B",X"7E",X"8B", + X"D2",X"23",X"B6",X"B0",X"21",X"23",X"18",X"F1",X"E9",X"73",X"8B",X"72",X"8B",X"C9",X"83",X"F6", + X"73",X"FF",X"23",X"F6",X"72",X"7F",X"23",X"B8",X"C5",X"DD",X"21",X"C0",X"8C",X"2E",X"2D",X"4D", + X"75",X"CB",X"A0",X"D6",X"6C",X"98",X"61",X"39",X"A6",X"08",X"75",X"B9",X"69",X"38",X"D8",X"C9", + X"DD",X"F6",X"2D",X"39",X"B1",X"49",X"4B",X"8F",X"A5",X"58",X"33",X"4D",X"E9",X"67",X"E9",X"72", + X"61",X"1F",X"62",X"8A",X"62",X"DF",X"62",X"2A",X"62",X"6E",X"62",X"ED",X"62",X"DD",X"63",X"08", + X"76",X"A0",X"AD",X"21",X"49",X"8D",X"F6",X"DD",X"77",X"04",X"35",X"2E",X"2C",X"CD",X"4F",X"18", + X"75",X"34",X"A5",X"21",X"77",X"24",X"9D",X"DD",X"D6",X"08",X"FE",X"0A",X"75",X"77",X"A0",X"DD", + X"34",X"05",X"B2",X"24",X"88",X"46",X"BF",X"48",X"DD",X"35",X"28",X"DD",X"F6",X"00",X"46",X"07", + X"68",X"DD",X"D6",X"09",X"95",X"A0",X"E1",X"DD",X"DF",X"09",X"75",X"35",X"A5",X"6F",X"96",X"00", + X"18",X"DD",X"CB",X"00",X"76",X"A0",X"2E",X"D6",X"2E",X"B0",X"2A",X"B6",X"A8",X"0F",X"0F",X"4E", + X"C0",X"55",X"75",X"EE",X"A2",X"DD",X"4E",X"0B",X"E5",X"6B",X"A0",X"20",X"65",X"C7",X"01",X"B6", + X"BC",X"96",X"A0",X"0A",X"B6",X"09",X"32",X"02",X"88",X"51",X"CD",X"00",X"A7",X"C9",X"51",X"DD", + X"9E",X"08",X"A0",X"DD",X"9E",X"0D",X"A0",X"C9",X"75",X"CB",X"A0",X"DE",X"88",X"88",X"75",X"EE", + X"2A",X"DD",X"6E",X"03",X"CD",X"A9",X"6B",X"DD",X"CB",X"00",X"E6",X"39",X"2B",X"00",X"DD",X"45", + X"6C",X"A7",X"00",X"DD",X"E9",X"DD",X"9E",X"08",X"A0",X"DD",X"9E",X"0D",X"A0",X"C9",X"89",X"68", + X"8D",X"F6",X"6F",X"B6",X"AC",X"18",X"CB",X"B7",X"4E",X"08",X"EF",X"DD",X"F6",X"04",X"18",X"C5", + X"CC",X"A9",X"86",X"88",X"E7",X"82",X"A0",X"28",X"7D",X"D4",X"A1",X"7D",X"D5",X"8C",X"B6",X"9F", + X"CD",X"B4",X"A1",X"75",X"34",X"8D",X"C9",X"75",X"F6",X"88",X"56",X"AF",X"DD",X"DF",X"28",X"75", + X"94",X"8D",X"B2",X"84",X"28",X"CE",X"27",X"E8",X"7D",X"E6",X"A3",X"7D",X"EE",X"8A",X"7D",X"6B", + X"28",X"CE",X"A0",X"8F",X"B6",X"98",X"CD",X"4C",X"EB",X"10",X"2D",X"1E",X"AC",X"65",X"4C",X"EB", + X"7D",X"95",X"A0",X"7D",X"F6",X"88",X"46",X"AF",X"48",X"7D",X"C6",X"89",X"7D",X"46",X"A4",X"82", + X"28",X"28",X"B6",X"80",X"CD",X"B4",X"A1",X"75",X"CB",X"88",X"E6",X"88",X"3A",X"75",X"6E",X"8B", + X"7D",X"66",X"A2",X"6D",X"09",X"CB",X"7D",X"96",X"A0",X"88",X"7D",X"96",X"A5",X"88",X"69",X"7D", + X"34",X"8D",X"DD",X"9E",X"29",X"8D",X"C9",X"75",X"F6",X"88",X"56",X"8B",X"DD",X"DF",X"28",X"75", + X"94",X"8D",X"B2",X"84",X"28",X"CE",X"37",X"E8",X"7D",X"95",X"A0",X"7D",X"F6",X"88",X"46",X"8F", + X"48",X"75",X"F6",X"89",X"B5",X"08",X"A3",X"75",X"77",X"89",X"DD",X"9D",X"2D",X"C7",X"B6",X"8C", + X"18",X"AF",X"0F",X"EE",X"A8",X"7D",X"EE",X"8A",X"7D",X"E6",X"A3",X"4D",X"CB",X"88",X"28",X"DD", + X"B6",X"98",X"DD",X"63",X"29",X"CE",X"A0",X"8A",X"B6",X"AC",X"32",X"8A",X"88",X"F9",X"CD",X"88", + X"07",X"69",X"7D",X"94",X"A5",X"69",X"7D",X"56",X"A0",X"DE",X"20",X"7D",X"D7",X"88",X"7D",X"94", + X"2D",X"75",X"EE",X"8A",X"DD",X"C6",X"2B",X"6D",X"6B",X"88",X"88",X"1E",X"38",X"9A",X"2A",X"28", + X"B6",X"38",X"6D",X"88",X"07",X"12",X"84",X"28",X"46",X"B7",X"48",X"7D",X"95",X"88",X"7D",X"56", + X"28",X"EE",X"AF",X"E0",X"DD",X"46",X"2A",X"75",X"6E",X"8B",X"CD",X"21",X"6B",X"91",X"32",X"88", + X"65",X"A7",X"00",X"DD",X"9E",X"08",X"A0",X"DD",X"9E",X"0D",X"A0",X"C9",X"75",X"21",X"88",X"25", + X"DD",X"CB",X"3F",X"7E",X"C8",X"B2",X"24",X"88",X"6F",X"46",X"B7",X"48",X"CB",X"70",X"A0",X"06", + X"96",X"01",X"65",X"84",X"63",X"C9",X"96",X"04",X"65",X"84",X"63",X"C9",X"75",X"EE",X"B0",X"DD", + X"6E",X"11",X"CD",X"C4",X"EB",X"DD",X"EE",X"12",X"DD",X"6E",X"3B",X"CD",X"4C",X"4B",X"DD",X"EE", + X"B4",X"DD",X"4E",X"1D",X"65",X"6C",X"63",X"C9",X"75",X"21",X"E8",X"25",X"75",X"CB",X"37",X"D6", + X"C8",X"DD",X"CB",X"1F",X"66",X"CC",X"FC",X"4B",X"CD",X"69",X"EB",X"C9",X"DD",X"F6",X"BF",X"56", + X"26",X"DD",X"DF",X"17",X"75",X"CB",X"37",X"EE",X"61",X"B2",X"84",X"20",X"EE",X"07",X"68",X"DD", + X"35",X"1F",X"DD",X"F6",X"BF",X"46",X"AF",X"48",X"DD",X"CB",X"BF",X"A6",X"DD",X"F6",X"BE",X"B5", + X"80",X"0F",X"75",X"77",X"36",X"CD",X"3B",X"43",X"61",X"DD",X"9E",X"17",X"A0",X"B2",X"9E",X"25", + X"07",X"C8",X"DD",X"36",X"BF",X"80",X"DD",X"36",X"BE",X"08",X"C9",X"DD",X"6E",X"00",X"21",X"C2", + X"2D",X"4D",X"ED",X"EE",X"8B",X"6E",X"D0",X"09",X"80",X"19",X"92",X"0B",X"2D",X"DD",X"63",X"16", + X"6E",X"CC",X"4C",X"4B",X"DD",X"CB",X"BE",X"46",X"4C",X"D8",X"EB",X"41",X"49",X"23",X"23",X"38", + X"C8",X"C9",X"96",X"04",X"65",X"74",X"63",X"77",X"04",X"CD",X"7C",X"43",X"DF",X"2C",X"65",X"74", + X"EB",X"77",X"AD",X"CD",X"DC",X"4B",X"77",X"C9",X"B6",X"09",X"B8",X"E8",X"55",X"CD",X"E7",X"29", + X"19",X"08",X"A4",X"B9",X"F9",X"C9",X"75",X"21",X"A8",X"25",X"75",X"F6",X"37",X"07",X"60",X"D6", + X"2E",X"58",X"CD",X"78",X"B6",X"60",X"E1",X"DD",X"21",X"00",X"8D",X"CD",X"BC",X"4C",X"B0",X"2E", + X"7D",X"81",X"80",X"2D",X"6D",X"BC",X"64",X"10",X"85",X"7D",X"81",X"C8",X"2D",X"6D",X"34",X"EC", + X"B0",X"BC",X"DD",X"89",X"60",X"2D",X"CD",X"BC",X"EC",X"18",X"3B",X"61",X"DD",X"5E",X"BF",X"7E", + X"A4",X"F8",X"6D",X"F0",X"16",X"F0",X"F9",X"6D",X"39",X"A5",X"97",X"68",X"B7",X"69",X"7D",X"81", + X"08",X"2D",X"DD",X"9E",X"BF",X"88",X"DD",X"9E",X"BE",X"77",X"B6",X"BA",X"2F",X"87",X"DD",X"DF", + X"A2",X"6D",X"0B",X"B1",X"6D",X"3E",X"00",X"15",X"68",X"E7",X"B6",X"AB",X"92",X"8A",X"28",X"26", + X"A4",X"65",X"26",X"A5",X"C9",X"75",X"21",X"08",X"8D",X"75",X"F6",X"BF",X"07",X"60",X"D6",X"8E", + X"58",X"6D",X"50",X"B6",X"C0",X"41",X"7D",X"81",X"A0",X"2D",X"6D",X"0B",X"64",X"7D",X"81",X"80", + X"8D",X"65",X"0B",X"EC",X"DD",X"89",X"68",X"2D",X"CD",X"0B",X"EC",X"75",X"21",X"C0",X"8D",X"65", + X"AB",X"EC",X"69",X"7D",X"F6",X"BF",X"76",X"8C",X"A0",X"8B",X"76",X"8D",X"48",X"6D",X"50",X"B6", + X"78",X"51",X"CD",X"39",X"A5",X"E0",X"DD",X"9E",X"A9",X"88",X"DD",X"9E",X"BF",X"8E",X"C9",X"77", + X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77", + X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77", + X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77", + X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77", + X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77",X"5F",X"77", + X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77",X"D7",X"77", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"91",X"11",X"B0",X"92",X"B2",X"11",X"B2",X"91",X"80",X"62",X"C9",X"F0",X"C9",X"66",X"80", + X"20",X"91",X"B1",X"B0",X"32",X"B2",X"B1",X"B2",X"31",X"80",X"EA",X"C9",X"78",X"C9",X"EE",X"80", + X"80",X"91",X"11",X"B0",X"92",X"B2",X"11",X"B2",X"91",X"80",X"62",X"C9",X"F0",X"C9",X"66",X"80", + X"20",X"91",X"B1",X"B0",X"32",X"B2",X"B1",X"B2",X"31",X"80",X"EA",X"C9",X"78",X"C9",X"EE",X"80", + X"80",X"91",X"11",X"B0",X"92",X"B2",X"11",X"B2",X"91",X"80",X"62",X"C9",X"F0",X"C9",X"66",X"80", + X"20",X"91",X"B1",X"B0",X"32",X"B2",X"B1",X"B2",X"31",X"80",X"EA",X"C9",X"78",X"C9",X"EE",X"80", + X"80",X"91",X"11",X"B0",X"92",X"B2",X"11",X"B2",X"91",X"80",X"62",X"C9",X"F0",X"C9",X"66",X"80", + X"20",X"91",X"B1",X"B0",X"32",X"B2",X"B1",X"B2",X"31",X"80",X"EA",X"C9",X"78",X"C9",X"EE",X"80", + X"80",X"91",X"11",X"B0",X"92",X"B2",X"11",X"B2",X"91",X"80",X"62",X"C9",X"F0",X"C9",X"66",X"80", + X"20",X"91",X"B1",X"B0",X"32",X"B2",X"B1",X"B2",X"31",X"80",X"EA",X"C9",X"78",X"C9",X"EE",X"80", + X"80",X"91",X"11",X"B0",X"92",X"B2",X"11",X"B2",X"91",X"80",X"62",X"C9",X"F0",X"C9",X"66",X"80", + X"20",X"91",X"B1",X"B0",X"32",X"B2",X"B1",X"B2",X"31",X"80",X"EA",X"C9",X"78",X"C9",X"EE",X"80", + X"80",X"91",X"11",X"B0",X"92",X"B2",X"11",X"B2",X"91",X"80",X"62",X"C9",X"F0",X"C9",X"66",X"80", + X"20",X"91",X"B1",X"B0",X"32",X"B2",X"B1",X"B2",X"31",X"80",X"EA",X"C9",X"78",X"C9",X"EE",X"80", + X"80",X"91",X"11",X"B0",X"92",X"B2",X"11",X"B2",X"91",X"80",X"62",X"C9",X"F0",X"C9",X"66",X"80", + X"20",X"91",X"B1",X"B0",X"32",X"B2",X"B1",X"B2",X"31",X"80",X"EA",X"C9",X"78",X"C9",X"EE",X"80", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"80",X"99",X"11",X"90",X"92",X"92",X"11",X"92",X"91",X"88",X"62",X"49",X"F0",X"49",X"66",X"88", + X"20",X"31",X"B1",X"38",X"32",X"3A",X"B1",X"3A",X"31",X"20",X"EA",X"41",X"78",X"41",X"EE",X"20", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"4E",X"EF",X"42",X"7D",X"4F",X"20",X"4B",X"EF",X"44",X"6D",X"52",X"69",X"20",X"20",X"3A", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"66",X"67",X"6A",X"7D",X"67",X"A8",X"63",X"67",X"6C",X"6D",X"7A",X"69",X"A8",X"A8",X"B2", + X"1A",X"EE",X"47",X"6A",X"D5",X"EF",X"88",X"EB",X"47",X"6C",X"C5",X"7A",X"C1",X"20",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"54",X"7B",X"55",X"7C",X"4F",X"ED",X"55",X"20",X"49",X"7F",X"41",X"EE",X"45",X"20",X"3A", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"7C",X"7B",X"7D",X"7C",X"67",X"65",X"7D",X"A8",X"61",X"7F",X"69",X"66",X"6D",X"A8",X"B2", + X"1A",X"7C",X"D3",X"7D",X"D4",X"EF",X"45",X"7D",X"88",X"E9",X"D7",X"69",X"46",X"6D",X"88",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"41",X"EB",X"49",X"7A",X"41",X"20",X"4E",X"69",X"4B",X"69",X"4B",X"7D",X"4D",X"69",X"3A", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"69",X"63",X"61",X"7A",X"69",X"A8",X"66",X"69",X"63",X"69",X"63",X"7D",X"65",X"69",X"B2", + X"1A",X"69",X"43",X"E9",X"D2",X"69",X"88",X"EE",X"C1",X"EB",X"C1",X"EB",X"D5",X"ED",X"C1",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"53",X"E8",X"49",X"EE",X"4A",X"E9",X"20",X"6D",X"47",X"E9",X"20",X"20",X"20",X"20",X"3A", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"B2",X"7B",X"60",X"61",X"66",X"62",X"61",X"A8",X"6D",X"6F",X"61",X"A8",X"A8",X"A8",X"A8",X"B2", + X"1A",X"7B",X"40",X"E9",X"46",X"EA",X"41",X"20",X"C5",X"6F",X"41",X"20",X"88",X"20",X"88",X"B2", + X"A0",X"88",X"A0",X"88",X"A0",X"88",X"A0",X"88",X"8F",X"88",X"A0",X"88",X"A0",X"88",X"A0",X"88", + X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88", + X"A0",X"88",X"A0",X"88",X"A0",X"88",X"A0",X"88",X"A0",X"88",X"A0",X"88",X"A0",X"88",X"A0",X"88", + X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88", + X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"A3",X"A0",X"B7",X"A0",X"88",X"A0",X"88", + X"28",X"88",X"62",X"88",X"28",X"88",X"28",X"45",X"1A",X"8A",X"2A",X"8A",X"2A",X"8A",X"2A",X"88", + X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"B2",X"A2",X"A0",X"B7",X"A0",X"88",X"A0",X"88", + X"28",X"88",X"61",X"D0",X"28",X"88",X"28",X"0E",X"8F",X"8A",X"2A",X"8A",X"2A",X"8A",X"2A",X"06", + X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"A1",X"A0",X"B7",X"A0",X"88",X"A0",X"88", + X"28",X"88",X"28",X"E7",X"28",X"88",X"28",X"E2",X"19",X"8A",X"2A",X"8A",X"2A",X"8A",X"2A",X"8A", + X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"B1",X"A0",X"16",X"C8",X"67",X"88",X"A0",X"88", + X"28",X"88",X"28",X"E6",X"28",X"88",X"28",X"E2",X"8A",X"8A",X"2A",X"8A",X"2A",X"8A",X"2A",X"8A", + X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"B0",X"87",X"15",X"C8",X"66",X"DD",X"F0",X"88", + X"28",X"88",X"28",X"B7",X"28",X"88",X"28",X"E1",X"8A",X"8A",X"2A",X"8A",X"2A",X"8A",X"2A",X"8A", + X"18",X"35",X"A2",X"8A",X"A2",X"8A",X"A2",X"41",X"27",X"86",X"A0",X"C8",X"65",X"DC",X"F0",X"88", + X"28",X"88",X"28",X"E5",X"28",X"88",X"28",X"E2",X"8A",X"8A",X"2A",X"8A",X"2A",X"8A",X"2A",X"8A", + X"A4",X"0C",X"EB",X"61",X"69",X"61",X"78",X"E8",X"26",X"8D",X"A0",X"49",X"64",X"5B",X"F0",X"08", + X"28",X"00",X"28",X"6C",X"28",X"00",X"28",X"69",X"18",X"02",X"2A",X"02",X"2A",X"02",X"2A",X"02", + X"A4",X"0C",X"A4",X"0C",X"6D",X"7C",X"FF",X"77",X"CC",X"8C",X"A0",X"49",X"63",X"08",X"66",X"08", + X"28",X"00",X"28",X"6C",X"74",X"00",X"28",X"85",X"8F",X"02",X"2A",X"02",X"2A",X"02",X"2A",X"A5", + X"9F",X"BF",X"9F",X"60",X"A1",X"09",X"EA",X"B4",X"25",X"08",X"A0",X"49",X"A0",X"08",X"66",X"08", + X"28",X"00",X"28",X"6B",X"73",X"00",X"28",X"E5",X"8E",X"02",X"2A",X"02",X"2A",X"02",X"2A",X"00", + X"A1",X"09",X"A1",X"09",X"EA",X"B4",X"A3",X"64",X"24",X"8B",X"14",X"4D",X"62",X"08",X"66",X"08", + X"28",X"00",X"28",X"6A",X"2A",X"00",X"28",X"84",X"8D",X"02",X"2A",X"02",X"2A",X"02",X"2A",X"00", + X"A1",X"09",X"EA",X"B4",X"A3",X"0B",X"6C",X"76",X"23",X"8A",X"13",X"4C",X"61",X"08",X"64",X"08", + X"28",X"00",X"28",X"69",X"2A",X"7A",X"28",X"83",X"8C",X"02",X"2A",X"02",X"2A",X"02",X"04",X"00", + X"9E",X"B4",X"A3",X"0B",X"A3",X"64",X"FE",X"75",X"22",X"89",X"12",X"4B",X"60",X"08",X"F7",X"08", + X"28",X"00",X"28",X"69",X"2A",X"79",X"28",X"01",X"2A",X"02",X"2A",X"02",X"2A",X"02",X"03",X"00", + X"A3",X"0B",X"A3",X"0B",X"6C",X"08",X"FD",X"7A",X"CB",X"88",X"11",X"4A",X"E7",X"08",X"F6",X"08", + X"28",X"00",X"28",X"68",X"2A",X"78",X"28",X"82",X"2A",X"02",X"2A",X"02",X"2A",X"02",X"02",X"00", + X"A3",X"0B",X"E9",X"6F",X"A0",X"68",X"FB",X"09",X"CA",X"17",X"A0",X"49",X"E6",X"58",X"A0",X"08", + X"28",X"5D",X"28",X"68",X"2A",X"02",X"F5",X"81",X"2A",X"02",X"2A",X"02",X"2A",X"02",X"28",X"00", + X"9D",X"33",X"A0",X"88",X"E8",X"8B",X"FA",X"59",X"7B",X"BE",X"10",X"C9",X"E6",X"EE",X"A0",X"88", + X"28",X"FC",X"28",X"C7",X"72",X"8A",X"2A",X"8A",X"2A",X"8A",X"2A",X"8A",X"2A",X"8A",X"28",X"88", + X"A0",X"88",X"A0",X"48",X"A3",X"5B",X"A1",X"58",X"7A",X"BD",X"97",X"C9",X"A0",X"DA",X"A0",X"88", + X"28",X"FC",X"28",X"C6",X"E1",X"D7",X"2A",X"8A",X"2A",X"8A",X"2A",X"3B",X"9D",X"01",X"28",X"88", + X"A0",X"88",X"E8",X"8B",X"A3",X"5A",X"F9",X"8C",X"79",X"8A",X"96",X"C9",X"A0",X"D9",X"A0",X"88", + X"28",X"C9",X"28",X"C5",X"71",X"D6",X"2A",X"8A",X"2A",X"8A",X"2A",X"3A",X"9C",X"00",X"28",X"88", + X"9C",X"10",X"A3",X"8B",X"1A",X"89",X"F8",X"7C",X"A2",X"BC",X"95",X"C9",X"A0",X"EC",X"A0",X"88", + X"28",X"FF",X"28",X"C4",X"28",X"D5",X"F4",X"8A",X"2A",X"8A",X"2A",X"39",X"28",X"3F",X"28",X"88", + X"A3",X"8B",X"A3",X"32",X"A1",X"59",X"A4",X"7B",X"A2",X"BB",X"94",X"C9",X"A0",X"EC",X"A0",X"88", + X"28",X"FE",X"28",X"C4",X"28",X"88",X"F3",X"08",X"2A",X"8A",X"98",X"88",X"28",X"3E",X"28",X"88", + X"A3",X"8B",X"1A",X"89",X"A1",X"58",X"A4",X"7A",X"21",X"BA",X"93",X"C9",X"A0",X"EC",X"A0",X"88", + X"28",X"D8",X"28",X"FC",X"28",X"88",X"28",X"F7",X"8B",X"8A",X"3B",X"88",X"28",X"88",X"28",X"88", + X"A3",X"32",X"A1",X"89",X"6B",X"8C",X"A4",X"79",X"20",X"B9",X"A0",X"C9",X"A0",X"EE",X"A0",X"88", + X"FD",X"88",X"FD",X"C9",X"28",X"88",X"28",X"EC",X"8A",X"8A",X"3B",X"88",X"28",X"88",X"28",X"88", + X"9B",X"89",X"A1",X"4E",X"6A",X"8C",X"6F",X"8A",X"A7",X"B8",X"92",X"C9",X"A0",X"EE",X"A0",X"88", + X"FC",X"88",X"60",X"C3",X"28",X"88",X"28",X"E0",X"8A",X"8A",X"1F",X"88",X"28",X"88",X"28",X"88", + X"A1",X"09",X"A1",X"6D",X"A4",X"0C",X"6E",X"0A",X"A2",X"1F",X"91",X"49",X"A0",X"58",X"A0",X"08", + X"FB",X"00",X"28",X"00",X"28",X"00",X"28",X"7E",X"8A",X"02",X"1F",X"00",X"28",X"00",X"28",X"00", + X"A1",X"09",X"1F",X"0C",X"A4",X"67",X"A2",X"0A",X"A6",X"08",X"90",X"48",X"A0",X"08",X"A0",X"08", + X"FA",X"00",X"28",X"00",X"28",X"00",X"28",X"00",X"89",X"02",X"1E",X"00",X"28",X"00",X"28",X"00", + X"08",X"A6",X"A4",X"0C",X"A4",X"66",X"A2",X"0A",X"A5",X"1E",X"07",X"48",X"A0",X"08",X"A0",X"08", + X"F9",X"00",X"28",X"00",X"28",X"00",X"28",X"00",X"88",X"94",X"69",X"00",X"28",X"00",X"28",X"00", + X"A4",X"0C",X"A4",X"0C",X"EC",X"0A",X"A2",X"0A",X"A2",X"1D",X"06",X"97",X"A0",X"08",X"A0",X"08", + X"F8",X"00",X"28",X"00",X"28",X"00",X"28",X"00",X"EC",X"93",X"1D",X"00",X"28",X"00",X"28",X"00", + X"A4",X"0C",X"A4",X"6C",X"A2",X"0A",X"A2",X"0A",X"A2",X"1C",X"05",X"97",X"A0",X"08",X"A0",X"08", + X"28",X"00",X"28",X"00",X"28",X"00",X"28",X"00",X"0F",X"00",X"28",X"00",X"28",X"00",X"28",X"00", + X"A4",X"B1",X"1E",X"0A",X"A2",X"0A",X"A2",X"0A",X"A2",X"1B",X"04",X"97",X"A0",X"08",X"A0",X"08", + X"28",X"00",X"28",X"00",X"28",X"00",X"28",X"00",X"28",X"00",X"28",X"00",X"28",X"00",X"28",X"00", + X"A0",X"08",X"A2",X"0A",X"A2",X"A5",X"A4",X"0C",X"A4",X"0C",X"0C",X"09",X"A1",X"A3",X"A3",X"0B", + X"2B",X"00",X"28",X"00",X"82",X"03",X"2B",X"A9",X"29",X"01",X"29",X"A8",X"2C",X"04",X"28",X"00", + X"A0",X"08",X"A2",X"0A",X"A2",X"0A",X"0D",X"0C",X"A4",X"0C",X"9A",X"09",X"A1",X"A3",X"A3",X"0B", + X"11",X"00",X"28",X"00",X"10",X"03",X"2B",X"AF",X"29",X"01",X"29",X"AE",X"2C",X"04",X"28",X"00", + X"0A",X"22",X"0A",X"22",X"0A",X"22",X"0E",X"88",X"A0",X"88",X"A0",X"88",X"A0",X"88",X"A0",X"88", + X"28",X"88",X"28",X"88",X"00",X"6A",X"90",X"33",X"93",X"18",X"8B",X"34",X"CB",X"20",X"82",X"26", + X"3A",X"39",X"39",X"3D",X"39",X"08",X"1B",X"28",X"0A",X"28",X"0A",X"39",X"39",X"28",X"7A",X"88", + X"99",X"39",X"99",X"39",X"99",X"39",X"99",X"A9",X"9B",X"31",X"93",X"33",X"93",X"33",X"93",X"33", + X"1B",X"33",X"1B",X"33",X"1B",X"33",X"1B",X"33",X"1B",X"33",X"1B",X"33",X"1B",X"33",X"1B",X"33", + X"93",X"33",X"93",X"33",X"93",X"33",X"93",X"33",X"93",X"33",X"93",X"33",X"93",X"33",X"93",X"33", + X"1B",X"33",X"1B",X"33",X"1B",X"33",X"1B",X"33",X"1B",X"33",X"1B",X"33",X"5B",X"33",X"08",X"26", + X"AA",X"20",X"8A",X"28",X"90",X"68",X"93",X"A9",X"08",X"7A",X"99",X"39",X"99",X"88",X"88",X"A8", + X"0A",X"3D",X"39",X"29",X"18",X"33",X"1B",X"33",X"3B",X"31",X"1B",X"33",X"1B",X"33",X"1B",X"33", + X"97",X"3B",X"82",X"22",X"82",X"22",X"18",X"3A",X"81",X"3A",X"99",X"39",X"99",X"39",X"99",X"39", + X"39",X"A9",X"3B",X"31",X"1B",X"AB",X"18",X"2B",X"28",X"22",X"0A",X"22",X"1E",X"33",X"1B",X"08", + X"88",X"2C",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"C8",X"28", + X"28",X"26",X"21",X"33",X"1B",X"33",X"1B",X"33",X"5B",X"33",X"23",X"39",X"3D",X"A9",X"98",X"22", + X"99",X"31",X"93",X"33",X"08",X"60",X"82",X"22",X"08",X"20",X"82",X"22",X"82",X"3A",X"D9",X"10", + X"3B",X"31",X"28",X"33",X"19",X"2B",X"0C",X"39",X"3B",X"AA",X"79",X"39",X"39",X"10",X"1B",X"33", + X"18",X"33",X"8B",X"A8",X"82",X"22",X"82",X"22",X"18",X"33",X"93",X"33",X"93",X"08",X"93",X"33", + X"1B",X"B3",X"1B",X"B3",X"1B",X"38",X"39",X"01",X"A0",X"20",X"1B",X"B3",X"2F",X"31",X"88",X"B2", + X"88",X"88",X"88",X"88",X"AA",X"88",X"88",X"0B",X"93",X"0B",X"28",X"AA",X"9A",X"99",X"99",X"B0", + X"A0",X"20",X"28",X"20",X"39",X"31",X"39",X"20",X"1B",X"35",X"39",X"B3",X"39",X"A2",X"0A",X"A6", + X"C2",X"AA",X"82",X"AA",X"82",X"AA",X"81",X"BC",X"9B",X"99",X"81",X"AA",X"AA",X"A8",X"9D",X"99", + X"39",X"31",X"39",X"31",X"39",X"31",X"39",X"31",X"39",X"31",X"39",X"31",X"39",X"31",X"39",X"31", + X"99",X"09",X"8A",X"88",X"88",X"88",X"88",X"C8",X"28",X"00",X"28",X"00",X"28",X"00",X"28",X"00", + X"A0",X"08",X"A0",X"08",X"A0",X"08",X"A0",X"08",X"A0",X"08",X"A0",X"08",X"A0",X"08",X"A0",X"08", + X"28",X"00",X"28",X"00",X"28",X"00",X"28",X"00",X"28",X"00",X"28",X"00",X"28",X"00",X"28",X"00", + X"A0",X"31",X"1B",X"31",X"09",X"93",X"A0",X"93",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"0A",X"22",X"0A",X"22",X"0A",X"22",X"0A",X"22",X"0A",X"22",X"0A",X"22",X"0A",X"22",X"0E",X"2A", + X"88",X"28",X"88",X"28",X"A8",X"10",X"88",X"28",X"88",X"68",X"10",X"33",X"93",X"33",X"D3",X"2B", + X"1B",X"33",X"1B",X"33",X"1B",X"08",X"1B",X"33",X"1B",X"33",X"1B",X"33",X"1B",X"33",X"1B",X"33", + X"93",X"33",X"93",X"33",X"93",X"33",X"93",X"33",X"93",X"33",X"93",X"33",X"93",X"33",X"93",X"33", + X"1B",X"33",X"1B",X"33",X"1B",X"33",X"1B",X"33",X"5B",X"18",X"39",X"10",X"1B",X"37",X"1B",X"33", + X"AB",X"39",X"D9",X"33",X"93",X"33",X"93",X"88",X"99",X"39",X"99",X"39",X"99",X"39",X"99",X"39", + X"39",X"39",X"39",X"3B",X"39",X"33",X"1B",X"37",X"1B",X"33",X"1B",X"33",X"1B",X"33",X"A8",X"28", + X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"28",X"88",X"A8", + X"88",X"22",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"39",X"A9",X"3B",X"39",X"39",X"39", + X"00",X"3A",X"91",X"68",X"A8",X"18",X"99",X"39",X"99",X"39",X"99",X"A9",X"10",X"33",X"93",X"33", + X"1B",X"AB",X"19",X"33",X"1B",X"33",X"A8",X"28",X"28",X"2A",X"68",X"30",X"20",X"00",X"0A",X"22", + X"82",X"22",X"88",X"22",X"82",X"22",X"AA",X"21",X"88",X"68",X"81",X"39",X"91",X"33",X"97",X"39", + X"39",X"A9",X"3B",X"22",X"0A",X"62",X"1A",X"39",X"39",X"39",X"39",X"39",X"3D",X"39",X"1D",X"2B", + X"88",X"26",X"9A",X"22",X"C2",X"22",X"82",X"AA",X"88",X"2C",X"88",X"22",X"82",X"22",X"82",X"22", + X"0A",X"2E",X"28",X"28",X"28",X"20",X"A0",X"39",X"59",X"28",X"28",X"10",X"1B",X"33",X"1B",X"33", + X"93",X"37",X"93",X"33",X"97",X"33",X"93",X"33",X"93",X"33",X"93",X"33",X"93",X"33",X"93",X"33", + X"1B",X"B3",X"1B",X"B7",X"1B",X"B3",X"1B",X"B3",X"1B",X"B3",X"23",X"31",X"5B",X"F3",X"1B",X"B3", + X"93",X"BB",X"93",X"BB",X"93",X"BB",X"93",X"BB",X"93",X"BB",X"93",X"BB",X"93",X"BB",X"93",X"90", + X"39",X"31",X"79",X"31",X"0A",X"62",X"1B",X"33",X"1F",X"B3",X"1B",X"B3",X"1B",X"B3",X"1B",X"B3", + X"93",X"90",X"8A",X"A8",X"08",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"28",X"AA",X"88",X"BB", + X"1B",X"31",X"0A",X"A6",X"22",X"08",X"A0",X"08",X"A0",X"08",X"A0",X"08",X"A0",X"08",X"0A",X"20", + X"88",X"88",X"10",X"88",X"88",X"C8",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88", + X"28",X"20",X"28",X"20",X"28",X"20",X"3A",X"31",X"39",X"35",X"39",X"93",X"A0",X"93",X"A0",X"93", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7",X"5F",X"F7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"F7",X"2F",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B",X"A3",X"8E",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B", + X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"2E",X"8B",X"8E",X"8B",X"2B",X"8B",X"2B",X"8B", + X"A3",X"8B",X"A3",X"8E",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B",X"A3",X"2D",X"A3",X"8B",X"A3",X"8B", + X"2B",X"8B",X"2B",X"8E",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"2E",X"8B",X"2B",X"8B",X"2B",X"8B", + X"A3",X"8B",X"A6",X"8B",X"A3",X"8B",X"A3",X"8B",X"A3",X"8E",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B", + X"2E",X"8B",X"2B",X"8B",X"7E",X"8B",X"2E",X"2E",X"2B",X"8B",X"2B",X"8E",X"2B",X"8B",X"2B",X"8E", + X"A3",X"8B",X"A6",X"8B",X"A6",X"8B",X"A3",X"8E",X"F5",X"2F",X"A6",X"8E",X"A6",X"8E",X"A6",X"89", + X"2E",X"89",X"29",X"89",X"7C",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"2F",X"DB",X"29",X"89", + X"A7",X"89",X"A7",X"8F",X"A7",X"8F",X"2E",X"8F",X"77",X"8A",X"A7",X"8A",X"A2",X"8F",X"2D",X"8A", + X"2A",X"8A",X"2A",X"8F",X"2A",X"8A",X"2A",X"8A",X"2F",X"8A",X"2A",X"8A",X"8C",X"8A",X"2A",X"8F", + X"A2",X"8A",X"A2",X"8A",X"A7",X"8A",X"A2",X"8A",X"A2",X"8F",X"A2",X"8A",X"A2",X"FE",X"A2",X"8F", + X"2A",X"8A",X"2A",X"8A",X"2F",X"8A",X"2A",X"8A",X"2A",X"8F",X"8A",X"8A",X"2A",X"8A",X"2F",X"8A", + X"A2",X"8A",X"A2",X"8A",X"A7",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A7",X"8A",X"A2",X"2B", + X"2A",X"8A",X"2A",X"8A",X"2A",X"8A",X"2A",X"8A",X"2F",X"8A",X"2A",X"8A",X"2A",X"8A",X"2A",X"8A", + X"2C",X"8A",X"A2",X"8A",X"A7",X"8A",X"A2",X"8A",X"A2",X"2D",X"A2",X"8A",X"A2",X"8A",X"2E",X"8A", + X"2A",X"8A",X"2A",X"DA",X"8F",X"89",X"48",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89", + X"2F",X"4F",X"A7",X"0A",X"A2",X"0F",X"A2",X"0A",X"A7",X"0A",X"A2",X"0F",X"A2",X"0A",X"A7",X"0A", + X"2A",X"07",X"2A",X"07",X"2A",X"07",X"2A",X"46",X"2F",X"02",X"2F",X"02",X"2F",X"01",X"2E",X"03", + X"2C",X"0B",X"A6",X"0B",X"A3",X"0B",X"A6",X"0B",X"A3",X"0E",X"A3",X"0B",X"A3",X"0B",X"A3",X"4D", + X"2E",X"03",X"2B",X"03",X"2B",X"06",X"2B",X"03",X"2B",X"03",X"2B",X"06",X"2B",X"03",X"2B",X"03", + X"A6",X"0B",X"2F",X"0E",X"A3",X"0E",X"A3",X"0E",X"E4",X"09",X"A1",X"0F",X"A7",X"0A",X"A7",X"0A", + X"8E",X"02",X"2F",X"02",X"2A",X"02",X"2F",X"02",X"2A",X"02",X"2A",X"07",X"8C",X"02",X"2A",X"02", + X"A7",X"47",X"A2",X"0A",X"A7",X"0A",X"A2",X"0A",X"A7",X"0A",X"A2",X"0F",X"A2",X"0F",X"A2",X"0A", + X"2A",X"07",X"2A",X"8B",X"2F",X"02",X"2A",X"07",X"2A",X"07",X"2A",X"02",X"2F",X"02",X"2F",X"02", + X"A7",X"0A",X"A2",X"0F",X"A2",X"0A",X"A7",X"0A",X"A2",X"0A",X"A7",X"0A",X"2A",X"0A",X"A7",X"0A", + X"2F",X"4E",X"2A",X"02",X"2F",X"02",X"2A",X"07",X"2A",X"02",X"2F",X"02",X"2A",X"07",X"2A",X"07", + X"A2",X"0F",X"A2",X"0F",X"A2",X"0F",X"2B",X"0A",X"A7",X"0A",X"A7",X"0A",X"A7",X"0A",X"A7",X"24", + X"2F",X"07",X"2F",X"07",X"ED",X"07",X"2F",X"07",X"2F",X"8D",X"2F",X"07",X"2F",X"07",X"2F",X"41", + X"A1",X"0F",X"A7",X"26",X"A7",X"0F",X"A1",X"0F",X"A1",X"0F",X"A7",X"09",X"A7",X"09",X"A1",X"0F", + X"29",X"07",X"29",X"01",X"29",X"07",X"29",X"01",X"29",X"01",X"29",X"01",X"29",X"01",X"29",X"01", + X"A1",X"09",X"A1",X"09",X"A1",X"09",X"A1",X"09",X"E0",X"09",X"A1",X"09",X"A1",X"09",X"A6",X"09", + X"29",X"8D",X"29",X"01",X"2E",X"01",X"2E",X"01",X"2E",X"01",X"E4",X"06",X"2E",X"06",X"2E",X"06", + X"A6",X"8B",X"A6",X"2C",X"A3",X"8B",X"A3",X"8E",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B", + X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"68",X"88",X"29",X"88",X"29",X"88",X"29",X"48", + X"2F",X"CF",X"A1",X"89",X"A1",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A", + X"2A",X"8A",X"2A",X"8A",X"2A",X"8A",X"2A",X"8A",X"2A",X"8F",X"2F",X"8A",X"2A",X"8A",X"2A",X"8A", + X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A", + X"2A",X"8A",X"2A",X"8F",X"2F",X"8A",X"2A",X"8F",X"2A",X"8A",X"2F",X"CE",X"2A",X"8A",X"2A",X"8A", + X"A2",X"8A",X"A2",X"8A",X"A2",X"8A",X"A7",X"8F",X"A7",X"8A",X"A2",X"8A",X"A2",X"8A",X"A2",X"8A", + X"2A",X"8A",X"2A",X"8A",X"2A",X"8F",X"2A",X"8A",X"2A",X"8F",X"2F",X"8F",X"6D",X"8F",X"2F",X"8F", + X"A2",X"8F",X"A7",X"8F",X"A2",X"8F",X"A7",X"8A",X"A2",X"8F",X"E4",X"8F",X"A7",X"8F",X"A7",X"8F", + X"2F",X"8F",X"2F",X"CB",X"2F",X"8F",X"29",X"89",X"2F",X"89",X"29",X"8F",X"29",X"89",X"29",X"89", + X"A3",X"8E",X"A1",X"89",X"E2",X"8E",X"A6",X"8E",X"A6",X"8E",X"A6",X"8E",X"A6",X"8E",X"A6",X"8E", + X"2E",X"8E",X"2E",X"8E",X"2E",X"C9",X"2E",X"8E",X"2E",X"8E",X"2E",X"8E",X"2E",X"8E",X"2E",X"8E", + X"A6",X"8E",X"A6",X"8E",X"A6",X"8E",X"A3",X"8B",X"A1",X"8B",X"A3",X"89",X"A3",X"8B",X"A1",X"8B", + X"2B",X"89",X"2B",X"8B",X"29",X"8B",X"2B",X"89",X"2B",X"8B",X"29",X"8B",X"2B",X"89",X"E5",X"8B", + X"A3",X"8B",X"A3",X"8B",X"A3",X"8B",X"A3",X"C9",X"E8",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89", + X"29",X"88",X"29",X"88",X"29",X"88",X"29",X"88",X"29",X"88",X"29",X"88",X"29",X"88",X"29",X"88", + X"2F",X"4F",X"A2",X"0F",X"A2",X"0A",X"A2",X"0A",X"A7",X"0A",X"A2",X"0A",X"A2",X"0A",X"A7",X"0A", + X"2A",X"02",X"2A",X"07",X"2A",X"02",X"2A",X"02",X"2F",X"02",X"2A",X"02",X"2A",X"07",X"2A",X"02", + X"A2",X"0A",X"A7",X"0A",X"A2",X"0A",X"2E",X"4E",X"A7",X"0A",X"A2",X"0F",X"A2",X"0A",X"A2",X"0F", + X"2A",X"02",X"2A",X"07",X"2A",X"02",X"2F",X"02",X"2A",X"07",X"2A",X"02",X"2F",X"02",X"2A",X"07", + X"A2",X"0A",X"2D",X"4D",X"A7",X"0A",X"A2",X"0F",X"A2",X"0A",X"A7",X"0A",X"A7",X"0A",X"A2",X"0F", + X"2A",X"07",X"2A",X"07",X"2A",X"07",X"8C",X"44",X"2F",X"02",X"2F",X"07",X"29",X"06",X"2E",X"03", + X"A3",X"0E",X"A3",X"0B",X"A3",X"0B",X"A6",X"0B",X"A3",X"0B",X"A3",X"0B",X"A3",X"0B",X"A3",X"0B", + X"2B",X"8B",X"E7",X"06",X"2B",X"03",X"2B",X"03",X"2B",X"03",X"2B",X"03",X"2E",X"03",X"2B",X"03", + X"A3",X"0B",X"A3",X"0B",X"A3",X"0E",X"A3",X"0B",X"A3",X"0B",X"A3",X"0B",X"A6",X"0B",X"A3",X"0B", + X"2B",X"06",X"2B",X"03",X"2B",X"03",X"2B",X"06",X"2B",X"03",X"2B",X"03",X"2E",X"03",X"2B",X"03", + X"A3",X"0B",X"A6",X"0B",X"A3",X"0B",X"A3",X"0B",X"A6",X"0B",X"A3",X"0B",X"A3",X"0B",X"A3",X"0B", + X"2E",X"03",X"2B",X"03",X"2B",X"03",X"2E",X"03",X"2B",X"03",X"2B",X"03",X"2B",X"03",X"2E",X"03", + X"A3",X"0B",X"A3",X"0B",X"A3",X"0B",X"A6",X"0B",X"A3",X"0B",X"A3",X"0B",X"A3",X"0E",X"A3",X"0B", + X"2B",X"03",X"2E",X"03",X"2B",X"03",X"2B",X"06",X"2B",X"03",X"2B",X"03",X"8A",X"6E",X"2E",X"03", + X"A3",X"0B",X"A3",X"0E",X"A3",X"0B",X"A3",X"0B",X"A6",X"0B",X"A3",X"0B",X"A3",X"0E",X"A3",X"0B", + X"2B",X"03",X"2B",X"03",X"2E",X"03",X"2B",X"03",X"2B",X"06",X"2B",X"03",X"2B",X"03",X"2E",X"03", + X"A3",X"8B",X"A6",X"8B",X"A3",X"CA",X"E8",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89", + X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89", + X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89", + X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89", + X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89", + X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89", + X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89", + X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89", + X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89", + X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89", + X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89", + X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89", + X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89", + X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89", + X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89", + X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89",X"29",X"89", + X"2F",X"5F",X"A3",X"0B",X"A3",X"0E",X"A3",X"0B",X"A3",X"0B",X"A3",X"0E",X"A3",X"0B",X"A3",X"0B", + X"2B",X"06",X"2B",X"03",X"2B",X"03",X"2B",X"03",X"2E",X"03",X"2B",X"03",X"2E",X"03",X"2B",X"03", + X"A6",X"0B",X"A6",X"0B",X"2E",X"5E",X"A6",X"0B",X"A6",X"0B",X"A6",X"0B",X"A6",X"0E",X"A6",X"0E", + X"2B",X"06",X"8D",X"55",X"2E",X"03",X"2E",X"03",X"2E",X"03",X"2E",X"06",X"2B",X"06",X"2B",X"03", + X"A6",X"0B",X"A3",X"0E",X"A3",X"0B",X"2C",X"5C",X"A6",X"0B",X"A3",X"0E",X"A3",X"0B",X"A3",X"0E", + X"2B",X"03",X"2E",X"03",X"2E",X"03",X"2E",X"03",X"2E",X"06",X"8B",X"53",X"2E",X"01",X"2E",X"01", + X"A6",X"0E",X"A6",X"0E",X"A1",X"0E",X"A1",X"09",X"A6",X"09",X"A1",X"09",X"2A",X"5A",X"A6",X"09", + X"29",X"01",X"2E",X"01",X"29",X"01",X"2E",X"01",X"29",X"01",X"2E",X"06",X"89",X"5E",X"2E",X"06", + X"A6",X"0B",X"A6",X"0B",X"A3",X"0B",X"A6",X"0B",X"A3",X"0E",X"20",X"00",X"F1",X"0E",X"A6",X"09", + X"29",X"01",X"2F",X"01",X"29",X"07",X"2F",X"07",X"2F",X"87",X"FD",X"07",X"2A",X"07",X"2A",X"07", + X"A2",X"0A",X"A2",X"0F",X"A2",X"0A",X"A2",X"0A",X"A2",X"0A",X"A2",X"0A",X"A7",X"0A",X"A2",X"0A", + X"2A",X"02",X"2A",X"02",X"2A",X"02",X"2A",X"02",X"2A",X"02",X"2A",X"02",X"2A",X"02",X"2A",X"02", + X"A2",X"0F",X"A2",X"0A",X"A2",X"0A",X"A2",X"0A",X"A2",X"0A",X"A7",X"0A",X"A2",X"0A",X"A2",X"0A", + X"2A",X"02",X"2A",X"02",X"2F",X"02",X"2A",X"02",X"2A",X"02",X"2A",X"02",X"79",X"C0",X"28",X"01", + X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09", + X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01", + X"2F",X"CF",X"A1",X"8F",X"A7",X"89",X"A7",X"89",X"A7",X"2F",X"E6",X"8F",X"A7",X"8F",X"A7",X"8F", + X"29",X"8F",X"2F",X"2F",X"6D",X"8F",X"2F",X"8F",X"2F",X"8F",X"2F",X"89",X"2F",X"2F",X"6C",X"8F", + X"A7",X"8F",X"A7",X"8F",X"A2",X"8F",X"A7",X"8F",X"2F",X"CB",X"A7",X"8F",X"A2",X"8F",X"A7",X"8F", + X"2F",X"8F",X"2F",X"8F",X"2A",X"8F",X"2F",X"8F",X"2F",X"8A",X"2F",X"8A",X"2F",X"8F",X"8F",X"CA", + X"A7",X"8F",X"A7",X"8A",X"A7",X"8F",X"A7",X"8F",X"A7",X"8A",X"A7",X"8F",X"A7",X"8F",X"A7",X"8F", + X"2F",X"8F",X"2F",X"2F",X"69",X"8F",X"2F",X"8F",X"2F",X"8F",X"2F",X"8F",X"2F",X"8F",X"2F",X"8F", + X"A7",X"8F",X"A7",X"8F",X"A7",X"8F",X"A7",X"8F",X"A7",X"8F",X"A7",X"8F",X"A7",X"8F",X"A7",X"89", + X"2F",X"8F",X"2F",X"89",X"2F",X"8F",X"2F",X"8F",X"29",X"8F",X"29",X"8F",X"29",X"8F",X"29",X"8F", + X"A1",X"89",X"A1",X"89",X"A1",X"2F",X"E0",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"89",X"A1",X"8E", + X"29",X"89",X"2E",X"89",X"29",X"8E",X"29",X"8E",X"29",X"8E",X"2E",X"89",X"2E",X"8E",X"29",X"8E", + X"A6",X"8E",X"A6",X"8E",X"A6",X"8E",X"A6",X"2D",X"44",X"8E",X"A6",X"8B",X"A6",X"8E",X"A6",X"8E", + X"2E",X"8B",X"2E",X"8B",X"2E",X"8B",X"2E",X"8B",X"2B",X"8E",X"2B",X"8B",X"2B",X"8B",X"2E",X"8B", + X"A3",X"8B",X"A3",X"8E",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B", + X"2B",X"8E",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B", + X"A3",X"8B",X"A3",X"8B",X"A6",X"8B",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B",X"A3",X"8B", + X"2B",X"8E",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B",X"2B",X"8B", + X"E8",X"0B",X"A3",X"0B",X"A3",X"0B",X"A1",X"09",X"E0",X"68",X"A1",X"09",X"A1",X"09",X"A1",X"09", + X"29",X"C0",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01", + X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09", + X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01", + X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09", + X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01", + X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09", + X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01", + X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09", + X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01", + X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09", + X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01", + X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09", + X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01", + X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09",X"A0",X"09", + X"28",X"01",X"28",X"01",X"28",X"01",X"28",X"01",X"66",X"01",X"06",X"01",X"C3",X"01",X"C2",X"C0", + X"40",X"70",X"28",X"74",X"28",X"7D",X"08",X"72",X"08",X"77",X"08",X"74",X"D7",X"70",X"08",X"75", + X"80",X"F0",X"A0",X"F6",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"40",X"70",X"20",X"74",X"08",X"7D",X"00",X"72",X"00",X"77",X"48",X"74",X"D7",X"70",X"38",X"76", + X"80",X"F1",X"80",X"F7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"40",X"70",X"68",X"74",X"28",X"7E",X"48",X"72",X"48",X"77",X"28",X"75",X"D7",X"70",X"00",X"76", + X"80",X"F2",X"A0",X"F7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"48",X"71",X"30",X"72",X"78",X"72",X"68",X"73",X"18",X"73",X"40",X"71",X"D7",X"70", + X"7F",X"D7",X"80",X"71",X"C0",X"77",X"C0",X"71",X"88",X"73",X"E0",X"73",X"F8",X"71",X"E8",X"71", + X"D7",X"70",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"80",X"71",X"C0",X"71",X"88",X"73",X"E0",X"73",X"F8",X"71",X"C0",X"77",X"E8",X"71", + X"D7",X"70",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"00",X"D6",X"05",X"56",X"00",X"D1",X"01",X"22",X"02",X"24",X"02",X"25",X"02", + X"8F",X"2A",X"09",X"2A",X"0B",X"2A",X"98",X"2A",X"7A",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D2", + X"D7",X"2A",X"D6",X"22",X"D1",X"2A",X"DE",X"29",X"A1",X"2C",X"AF",X"2A",X"AD",X"2A",X"AC",X"2A", + X"88",X"2A",X"8A",X"2A",X"8C",X"2A",X"8D",X"2A",X"88",X"2A",X"8A",X"2A",X"8C",X"2A",X"8D",X"2C", + X"BD",X"2C",X"D2",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"28",X"D6",X"27",X"D1",X"29",X"28",X"28",X"29",X"28",X"2A",X"28",X"2B",X"28",X"2C",X"28", + X"85",X"28",X"86",X"28",X"87",X"28",X"00",X"28",X"01",X"28",X"02",X"28",X"03",X"28",X"90",X"28", + X"39",X"28",X"3A",X"28",X"3B",X"28",X"3C",X"28",X"3D",X"28",X"3E",X"28",X"3F",X"28",X"30",X"28", + X"11",X"28",X"12",X"28",X"13",X"28",X"88",X"28",X"89",X"28",X"8A",X"28",X"8B",X"28",X"8C",X"28", + X"AD",X"28",X"AE",X"28",X"AF",X"28",X"A0",X"28",X"A1",X"28",X"A2",X"28",X"A3",X"28",X"B8",X"28", + X"99",X"28",X"9A",X"28",X"9B",X"28",X"9C",X"28",X"9D",X"28",X"9E",X"28",X"9F",X"28",X"18",X"28", + X"B1",X"28",X"B2",X"28",X"B3",X"28",X"D2",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"2F",X"D6",X"27",X"DE",X"28",X"D1",X"2A",X"A8",X"28",X"AC",X"28",X"AF",X"28",X"AC",X"28", + X"88",X"28",X"8C",X"28",X"8F",X"28",X"7D",X"2A",X"7A",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"2D",X"D6",X"27",X"D1",X"29",X"DE",X"28",X"28",X"2C",X"B8",X"2C",X"D5",X"B8",X"D2",X"D7", + X"7F",X"2B",X"7E",X"AA",X"FE",X"28",X"79",X"28",X"90",X"2A",X"91",X"2A",X"90",X"2A",X"7D",X"2B", + X"AB",X"00",X"AA",X"00",X"A9",X"00",X"A8",X"00",X"2F",X"00",X"2E",X"00",X"2D",X"00",X"2C",X"00", + X"83",X"28",X"82",X"28",X"81",X"28",X"80",X"28",X"7A",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"2D",X"7E",X"AF",X"79",X"28",X"80",X"AF",X"90",X"A8",X"7F",X"2C",X"7E",X"A8",X"98",X"2C", + X"D6",X"04",X"30",X"08",X"D6",X"00",X"D2",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"2D",X"7E",X"AF",X"79",X"28",X"98",X"A8",X"7E",X"2C",X"7E",X"A8",X"88",X"2C",X"7E",X"2C", + X"20",X"08",X"D6",X"00",X"D2",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"00",X"D6",X"04",X"D1",X"01",X"56",X"00",X"28",X"04",X"2C",X"04",X"2F",X"04",X"38",X"04", + X"94",X"2C",X"97",X"2C",X"88",X"2C",X"8C",X"2C",X"8F",X"2C",X"98",X"2C",X"7D",X"2B",X"7A",X"28", + X"D7",X"01",X"D6",X"04",X"D1",X"01",X"56",X"00",X"2C",X"04",X"2F",X"04",X"38",X"04",X"3C",X"04", + X"97",X"2C",X"88",X"2C",X"8C",X"2C",X"8F",X"2C",X"98",X"2C",X"9C",X"2C",X"7D",X"2B",X"7A",X"28", + X"D7",X"06",X"D6",X"04",X"D1",X"01",X"56",X"00",X"2F",X"04",X"38",X"04",X"3C",X"04",X"3F",X"04", + X"88",X"2C",X"8C",X"2C",X"8F",X"2C",X"98",X"2C",X"9C",X"2C",X"9F",X"2C",X"7D",X"2B",X"7A",X"28", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"2D",X"D6",X"2F",X"D1",X"28",X"38",X"2E",X"D0",X"2C",X"38",X"2E",X"68",X"2C",X"D0",X"2C", + X"C0",X"A8",X"7A",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"29",X"D6",X"27",X"DE",X"28",X"D1",X"28",X"28",X"28",X"D6",X"26",X"28",X"28",X"D6",X"25", + X"80",X"28",X"7E",X"AC",X"80",X"28",X"7E",X"AB",X"80",X"28",X"7E",X"AA",X"80",X"28",X"7E",X"A9", + X"28",X"2D",X"D6",X"20",X"28",X"28",X"D6",X"2F",X"28",X"28",X"D6",X"2E",X"28",X"28",X"D6",X"2D", + X"80",X"28",X"7E",X"2C",X"80",X"28",X"7E",X"2B",X"80",X"28",X"7E",X"2A",X"80",X"28",X"7E",X"29", + X"28",X"28",X"D6",X"28",X"D5",X"29",X"D2",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"2A",X"7E",X"AF",X"FE",X"28",X"79",X"28",X"42",X"2C",X"43",X"28",X"D0",X"28",X"D1",X"28", + X"7A",X"28",X"7B",X"28",X"7C",X"28",X"7D",X"28",X"7E",X"28",X"7F",X"28",X"70",X"28",X"71",X"28", + X"7A",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"2D",X"D6",X"28",X"DE",X"28",X"D1",X"28",X"D6",X"27",X"38",X"28",X"D6",X"25",X"23",X"28", + X"7E",X"AD",X"02",X"28",X"7F",X"2D",X"01",X"28",X"7E",X"A8",X"00",X"28",X"7E",X"2F",X"87",X"28", + X"D6",X"2E",X"2E",X"28",X"D6",X"2D",X"2D",X"28",X"D6",X"2C",X"2C",X"28",X"D6",X"2B",X"2B",X"28", + X"7E",X"2A",X"82",X"28",X"7E",X"29",X"81",X"28",X"7E",X"28",X"7D",X"29",X"7A",X"D7",X"7F",X"D7", + X"D7",X"07",X"D6",X"04",X"56",X"01",X"D1",X"05",X"38",X"02",X"20",X"02",X"38",X"02",X"38",X"02", + X"88",X"2A",X"90",X"2A",X"88",X"2A",X"88",X"2A",X"90",X"2A",X"7D",X"2B",X"7A",X"2A",X"98",X"2A", + X"D7",X"01",X"D6",X"04",X"56",X"01",X"D1",X"05",X"3C",X"02",X"24",X"02",X"3C",X"02",X"3C",X"02", + X"8C",X"2A",X"94",X"2A",X"8C",X"2A",X"8C",X"2A",X"94",X"2A",X"7D",X"2B",X"7A",X"2A",X"9D",X"2A", + X"D7",X"02",X"D6",X"04",X"56",X"01",X"D1",X"05",X"3F",X"02",X"27",X"02",X"3F",X"02",X"3F",X"02", + X"8F",X"2A",X"97",X"2A",X"8F",X"2A",X"8F",X"2A",X"97",X"2A",X"7D",X"2B",X"7A",X"D7",X"80",X"23", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"06",X"D6",X"06",X"56",X"01",X"D1",X"05",X"3F",X"02",X"24",X"02",X"3F",X"02",X"3E",X"02", + X"8B",X"2A",X"96",X"2A",X"95",X"2A",X"8A",X"2A",X"95",X"2A",X"88",X"2A",X"8A",X"2A",X"8B",X"2A", + X"24",X"08",X"D2",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"06",X"D6",X"06",X"56",X"01",X"D1",X"05",X"28",X"02",X"D0",X"02",X"28",X"02",X"28",X"02", + X"78",X"2A",X"80",X"2A",X"80",X"2A",X"78",X"2A",X"80",X"2A",X"94",X"2A",X"95",X"2A",X"96",X"2A", + X"3F",X"08",X"D2",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"2E",X"D6",X"2E",X"DE",X"29",X"D1",X"2D",X"3F",X"2A",X"AC",X"2A",X"3F",X"2A",X"3E",X"2A", + X"8B",X"2A",X"96",X"2A",X"95",X"2A",X"8A",X"2A",X"95",X"2A",X"80",X"2A",X"80",X"2A",X"80",X"2A", + X"28",X"20",X"D2",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"2A",X"D6",X"2C",X"DE",X"29",X"D1",X"2B",X"33",X"2C",X"33",X"2C",X"A8",X"2C",X"AA",X"2C", + X"8A",X"2C",X"88",X"2C",X"13",X"2C",X"11",X"2C",X"97",X"2C",X"97",X"2C",X"11",X"2C",X"13",X"2C", + X"33",X"2E",X"31",X"2A",X"31",X"2E",X"33",X"2C",X"33",X"2C",X"A8",X"2C",X"AA",X"2C",X"AA",X"2C", + X"88",X"2C",X"13",X"2C",X"11",X"2C",X"97",X"2C",X"97",X"2C",X"11",X"2C",X"13",X"2C",X"11",X"2E", + X"3F",X"2A",X"3F",X"2E",X"31",X"2C",X"31",X"2C",X"33",X"2C",X"3F",X"2C",X"31",X"2C",X"33",X"2A", + X"88",X"2A",X"13",X"2C",X"97",X"2C",X"11",X"2C",X"13",X"2A",X"88",X"2A",X"13",X"2C",X"11",X"2C", + X"3F",X"2C",X"31",X"2C",X"3A",X"2C",X"33",X"2C",X"33",X"2C",X"33",X"2C",X"A8",X"2C",X"AA",X"2C", + X"8A",X"2C",X"88",X"2C",X"13",X"2C",X"11",X"2C",X"97",X"2C",X"97",X"2C",X"11",X"2C",X"13",X"2C", + X"B9",X"06",X"3F",X"02",X"3F",X"06",X"56",X"00",X"D0",X"04",X"D2",X"00",X"28",X"00",X"28",X"00", + X"7F",X"28",X"7E",X"2C",X"FE",X"29",X"79",X"2B",X"97",X"2C",X"97",X"2C",X"11",X"2C",X"13",X"2C", + X"BB",X"04",X"B9",X"04",X"3F",X"04",X"3A",X"04",X"AB",X"04",X"AB",X"04",X"3A",X"04",X"3F",X"04", + X"97",X"2E",X"96",X"2A",X"96",X"2E",X"97",X"2C",X"97",X"2C",X"11",X"2C",X"13",X"2C",X"13",X"2C", + X"B9",X"04",X"3F",X"04",X"3A",X"04",X"AB",X"04",X"AB",X"04",X"3A",X"04",X"3F",X"04",X"3E",X"06", + X"97",X"2A",X"97",X"2E",X"96",X"2C",X"92",X"2C",X"97",X"2C",X"03",X"2C",X"92",X"2C",X"97",X"2A", + X"B9",X"02",X"3F",X"04",X"3F",X"04",X"3E",X"04",X"3F",X"02",X"B9",X"02",X"BB",X"04",X"3E",X"04", + X"94",X"2C",X"91",X"2C",X"92",X"2C",X"97",X"2C",X"97",X"2C",X"97",X"2C",X"11",X"2C",X"13",X"2C", + X"BB",X"04",X"B9",X"04",X"3F",X"04",X"3A",X"04",X"AB",X"04",X"AB",X"04",X"3A",X"04",X"3F",X"04", + X"96",X"2E",X"97",X"2A",X"97",X"2E",X"FE",X"28",X"78",X"2C",X"7A",X"28",X"80",X"28",X"80",X"28", + X"D7",X"03",X"D6",X"04",X"56",X"01",X"D1",X"03",X"BB",X"04",X"BB",X"04",X"20",X"04",X"22",X"04", + X"8A",X"2C",X"88",X"2C",X"13",X"2C",X"11",X"2C",X"97",X"2C",X"97",X"2C",X"11",X"2C",X"13",X"2C", + X"BB",X"06",X"B9",X"02",X"B9",X"06",X"BB",X"04",X"BB",X"04",X"20",X"04",X"22",X"04",X"22",X"04", + X"88",X"2C",X"13",X"2C",X"11",X"2C",X"97",X"2C",X"97",X"2C",X"11",X"2C",X"13",X"2C",X"11",X"2E", + X"3F",X"02",X"3F",X"06",X"B9",X"04",X"B9",X"04",X"BB",X"04",X"3F",X"04",X"B9",X"04",X"BB",X"02", + X"88",X"2A",X"13",X"2C",X"97",X"2C",X"11",X"2C",X"13",X"2A",X"88",X"2A",X"13",X"2C",X"11",X"2C", + X"3F",X"2C",X"31",X"2C",X"3A",X"2C",X"33",X"2C",X"33",X"2C",X"33",X"2C",X"A8",X"2C",X"AA",X"2C", + X"8A",X"2C",X"88",X"2C",X"13",X"2C",X"11",X"2C",X"97",X"2C",X"97",X"2C",X"11",X"2C",X"13",X"2C", + X"31",X"2E",X"3F",X"2A",X"3F",X"2E",X"DE",X"28",X"D0",X"2C",X"D2",X"28",X"28",X"28",X"28",X"28", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"2A",X"D6",X"22",X"DE",X"28",X"D1",X"28",X"A8",X"29",X"AA",X"29",X"AC",X"29",X"AD",X"29", + X"8F",X"29",X"09",X"29",X"0B",X"29",X"98",X"2A",X"7D",X"2B",X"7A",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"2E",X"D6",X"20",X"DE",X"29",X"D1",X"2A",X"38",X"2C",X"31",X"2C",X"38",X"2C",X"3C",X"2C", + X"95",X"2E",X"95",X"2A",X"94",X"2C",X"92",X"2C",X"7D",X"2B",X"90",X"2C",X"90",X"2C",X"7A",X"D7", + X"D7",X"2D",X"D6",X"20",X"DE",X"29",X"D1",X"2A",X"A8",X"2C",X"B8",X"2C",X"A8",X"2C",X"AF",X"2C", + X"09",X"A8",X"8F",X"2C",X"8D",X"2C",X"7D",X"2B",X"98",X"2C",X"98",X"2C",X"7A",X"D7",X"7F",X"D7", + X"D7",X"2D",X"D6",X"20",X"DE",X"29",X"D1",X"2A",X"A8",X"2C",X"B8",X"2C",X"A8",X"2C",X"AF",X"2C", + X"09",X"A8",X"8F",X"2C",X"8D",X"2C",X"7D",X"2B",X"98",X"2C",X"98",X"2C",X"7A",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"03",X"D6",X"06",X"56",X"01",X"B1",X"02",X"37",X"02",X"B1",X"02",X"34",X"02",X"30",X"02", + X"9C",X"2A",X"09",X"2C",X"19",X"2A",X"9F",X"2A",X"19",X"2A",X"9C",X"2A",X"98",X"2A",X"9C",X"2A", + X"A1",X"04",X"B1",X"02",X"B3",X"02",X"68",X"02",X"B3",X"01",X"68",X"01",X"68",X"02",X"B1",X"02", + X"1B",X"2A",X"19",X"29",X"1B",X"29",X"1B",X"2A",X"9F",X"2A",X"19",X"2A",X"9D",X"2A",X"98",X"2A", + X"35",X"02",X"B1",X"02",X"D0",X"02",X"D5",X"02",X"57",X"01",X"34",X"02",X"32",X"02",X"34",X"02", + X"98",X"2A",X"8F",X"2A",X"98",X"2A",X"8C",X"2C",X"7D",X"2A",X"FF",X"28",X"9C",X"2A",X"9E",X"2A", + X"37",X"02",X"36",X"01",X"37",X"02",X"37",X"01",X"34",X"02",X"36",X"02",X"34",X"01",X"36",X"02", + X"9E",X"29",X"9A",X"2A",X"9C",X"2A",X"0B",X"2A",X"8F",X"2A",X"0B",X"2A",X"9C",X"2A",X"78",X"2A", + X"55",X"FF",X"D2",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"29",X"D6",X"2C",X"DE",X"29",X"3C",X"2A",X"AC",X"2A",X"31",X"2A",X"AC",X"2A",X"3C",X"2A", + X"8C",X"2A",X"11",X"2A",X"8C",X"2A",X"94",X"2A",X"8C",X"2A",X"11",X"2A",X"8C",X"2A",X"94",X"2A", + X"AC",X"2A",X"31",X"2A",X"AC",X"2A",X"3C",X"2A",X"AC",X"2A",X"31",X"2A",X"AC",X"2A",X"3C",X"2A", + X"8C",X"2A",X"97",X"2A",X"8A",X"2A",X"92",X"2A",X"8A",X"2A",X"95",X"2A",X"88",X"2A",X"90",X"2A", + X"A8",X"2A",X"3D",X"2A",X"A8",X"2A",X"D5",X"2A",X"DF",X"29",X"3F",X"2A",X"AF",X"2A",X"A8",X"2A", + X"8F",X"2A",X"97",X"2A",X"8F",X"2A",X"88",X"2A",X"8F",X"2A",X"7D",X"2A",X"FF",X"28",X"97",X"2A", + X"AF",X"2A",X"A8",X"2A",X"AF",X"2A",X"3F",X"2A",X"AF",X"2A",X"AA",X"2A",X"A1",X"2A",X"31",X"2A", + X"09",X"2A",X"8C",X"2A",X"0B",X"2A",X"13",X"2A",X"0B",X"2A",X"8C",X"2A",X"78",X"2A",X"FD",X"D7", + X"D2",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"06",X"D6",X"04",X"56",X"01",X"2C",X"02",X"20",X"02",X"A9",X"02",X"20",X"02",X"2C",X"02", + X"88",X"2A",X"01",X"2A",X"88",X"2A",X"84",X"2A",X"88",X"2A",X"01",X"2A",X"88",X"2A",X"84",X"2A", + X"20",X"02",X"A9",X"02",X"20",X"02",X"2C",X"02",X"20",X"02",X"A9",X"02",X"20",X"02",X"2C",X"02", + X"88",X"2A",X"87",X"2A",X"13",X"2A",X"82",X"2A",X"13",X"2A",X"85",X"2A",X"11",X"2A",X"80",X"2A", + X"B9",X"02",X"2D",X"02",X"B9",X"02",X"D5",X"02",X"57",X"01",X"2F",X"02",X"24",X"02",X"38",X"02", + X"8C",X"2A",X"87",X"2A",X"8C",X"2A",X"90",X"2A",X"8C",X"2A",X"7D",X"2A",X"FF",X"28",X"87",X"2A", + X"24",X"02",X"38",X"02",X"24",X"02",X"2F",X"02",X"24",X"02",X"3A",X"02",X"26",X"02",X"A9",X"02", + X"8E",X"2A",X"94",X"2A",X"8F",X"2A",X"03",X"2A",X"8F",X"2A",X"94",X"2A",X"78",X"2A",X"FD",X"D7", + X"D2",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"2A",X"D6",X"20",X"D1",X"2A",X"DE",X"29",X"38",X"2C",X"38",X"2C",X"3C",X"2C",X"3F",X"2C", + X"78",X"2C",X"94",X"2C",X"97",X"38",X"88",X"2C",X"88",X"2C",X"8C",X"2C",X"8F",X"2C",X"78",X"2C", + X"AC",X"2C",X"AF",X"38",X"D2",X"2C",X"B8",X"2C",X"BC",X"2C",X"BF",X"2C",X"D0",X"2C",X"BC",X"2C", + X"9F",X"38",X"7A",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"29",X"D6",X"20",X"D1",X"2A",X"DE",X"29",X"3C",X"2C",X"3C",X"2C",X"3F",X"2C",X"A8",X"2C", + X"78",X"2C",X"97",X"2C",X"88",X"38",X"7D",X"2A",X"7A",X"B8",X"7D",X"2A",X"7A",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"06",X"D6",X"08",X"D1",X"02",X"56",X"01",X"3F",X"04",X"3F",X"04",X"20",X"04",X"24",X"04", + X"78",X"2C",X"88",X"2C",X"8C",X"38",X"7D",X"2A",X"7A",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF",X"D7",X"FF", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"03",X"D6",X"08",X"56",X"01",X"D1",X"03",X"6D",X"04",X"6D",X"04",X"6D",X"04",X"78",X"08", + X"D0",X"2A",X"D0",X"2A",X"D0",X"2C",X"D0",X"2C",X"C5",X"2C",X"C5",X"2C",X"C5",X"2C",X"D0",X"A8", + X"78",X"02",X"78",X"02",X"78",X"04",X"78",X"04",X"6F",X"04",X"6F",X"04",X"6F",X"04",X"7A",X"08", + X"D2",X"2A",X"D2",X"2A",X"D2",X"2C",X"D2",X"2C",X"C7",X"2C",X"C7",X"2C",X"C7",X"2C",X"D2",X"A8", + X"7A",X"02",X"7A",X"02",X"7A",X"04",X"7A",X"04",X"D5",X"04",X"6D",X"04",X"6D",X"04",X"D2",X"00", + X"80",X"28",X"7F",X"D7",X"80",X"28",X"7F",X"D7",X"80",X"D7",X"7F",X"28",X"80",X"D7",X"7F",X"28", + X"28",X"FF",X"D7",X"00",X"28",X"FF",X"D7",X"00",X"28",X"FF",X"D7",X"00",X"28",X"FF",X"D7",X"00", + X"80",X"D7",X"7F",X"28",X"80",X"D7",X"7F",X"28",X"80",X"D7",X"7F",X"28",X"80",X"D7",X"7F",X"28", + X"D7",X"2A",X"D6",X"20",X"DE",X"29",X"D1",X"2B",X"2D",X"2C",X"2D",X"2A",X"2D",X"2A",X"D0",X"2C", + X"80",X"2C",X"78",X"2C",X"82",X"2C",X"78",X"2C",X"84",X"2C",X"85",X"2C",X"85",X"2A",X"85",X"2A", + X"D0",X"2C",X"28",X"2C",X"D0",X"2C",X"2A",X"2C",X"D0",X"2C",X"2C",X"2C",X"2F",X"2C",X"2F",X"2A", + X"87",X"2A",X"78",X"2C",X"82",X"2C",X"78",X"2C",X"84",X"2C",X"78",X"2C",X"85",X"2C",X"87",X"2C", + X"2F",X"2A",X"2F",X"2A",X"D0",X"2C",X"2A",X"2C",X"D0",X"2C",X"2C",X"2C",X"D0",X"2C",X"2F",X"2C", + X"7D",X"2C",X"85",X"2C",X"85",X"2C",X"7A",X"28",X"7F",X"D7",X"80",X"28",X"7F",X"D7",X"80",X"28", + X"D7",X"D7",X"28",X"28",X"D7",X"D7",X"28",X"28",X"D7",X"D7",X"28",X"28",X"D7",X"D7",X"28",X"28", + X"7F",X"D7",X"80",X"28",X"7F",X"D7",X"80",X"28",X"7F",X"D7",X"80",X"28",X"7F",X"D7",X"80",X"28", + X"D7",X"2E",X"D6",X"20",X"DE",X"29",X"D1",X"2E",X"2D",X"2A",X"28",X"2A",X"2A",X"2C",X"2D",X"2A", + X"80",X"2A",X"82",X"2C",X"85",X"2A",X"80",X"2A",X"82",X"2A",X"85",X"2C",X"80",X"2A",X"82",X"2C", + X"2F",X"2A",X"2A",X"2A",X"2C",X"2C",X"2F",X"2A",X"2A",X"2A",X"2C",X"2C",X"2F",X"2A",X"2A",X"2A", + X"84",X"2A",X"87",X"2C",X"82",X"2A",X"84",X"2C",X"7D",X"2C",X"85",X"2A",X"85",X"2A",X"7A",X"28", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7",X"7F",X"D7", + X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7",X"D7", + X"7C",X"28",X"80",X"28",X"80",X"28",X"80",X"28",X"12",X"28",X"7D",X"28",X"9C",X"28",X"D9",X"28"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/Pengo_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_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/Arcade/Pacman Hardware/Pengo_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/Pengo_MiST/rtl/build_id.v new file mode 100644 index 00000000..85d5514d --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171113" +`define BUILD_TIME "103644" diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/Pengo_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_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/Arcade/Pacman Hardware/Pengo_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/Pengo_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/Pengo_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/Pengo_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_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/Arcade/Pacman Hardware/Pengo_MiST/rtl/osd.v b/Arcade/Pacman Hardware/Pengo_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_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/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..235df11b --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman.vhd @@ -0,0 +1,550 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_MACHINE is + generic ( + -- only set one of these + PENGO : std_logic := '1'; -- set to 1 when using Pengo ROMs, 0 otherwise + PACMAN : std_logic := '0'; -- set to 1 for all other Pacman hardware games + -- only set one of these when PACMAN is set + MRTNT : std_logic := '0'; -- set to 1 when using Mr TNT ROMs, 0 otherwise + LIZWIZ : std_logic := '0'; -- set to 1 when using Lizard Wizard ROMs, 0 otherwise + MSPACMAN : std_logic := '0' -- set to 1 when using Ms Pacman ROMs, 0 otherwise + ); + port ( + clk : in std_logic; + ena_6 : in std_logic; + reset : in std_logic; + + -- video + video_r : out std_logic_vector(2 downto 0); + video_g : out std_logic_vector(2 downto 0); + video_b : out std_logic_vector(1 downto 0); + hsync : out std_logic; + vsync : out std_logic; + v_blank : out std_logic; + h_blank : out std_logic; + + -- audio + audio : out std_logic_vector(7 downto 0); + + -- controls + in0_reg : in std_logic_vector( 7 downto 0); + in1_reg : in std_logic_vector( 7 downto 0); + dipsw1_reg : in std_logic_vector( 7 downto 0); + dipsw2_reg : in std_logic_vector( 7 downto 0) + ); + end; + +architecture RTL of PACMAN_MACHINE is + + -- timing + signal hcnt : std_logic_vector( 8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector( 8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean := true; + signal hblank : std_logic; + signal vblank : std_logic; +-- signal comp_sync_l : std_logic; + + -- cpu + signal cpu_ena : std_logic; + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector( 7 downto 0); + signal cpu_data_in : std_logic_vector( 7 downto 0); + + signal program_rom : std_logic_vector( 7 downto 0); + signal program_rom_dinl : std_logic_vector( 7 downto 0); + signal program_rom_dinh : std_logic_vector( 7 downto 0); + signal program_rom_bufl : std_logic_vector( 7 downto 0); + signal program_rom_bufh : std_logic_vector( 7 downto 0); + signal program_rom_din : std_logic_vector( 7 downto 0); + signal rom_to_dec : std_logic_vector( 7 downto 0); + signal rom_from_dec : std_logic_vector( 7 downto 0); +-- signal program_rom_cs_l : std_logic; + + signal control_reg : std_logic_vector( 7 downto 0); + -- + signal vram_addr_ab : std_logic_vector(11 downto 0); + signal ab : std_logic_vector(11 downto 0); + + signal sync_bus_reg : std_logic_vector( 7 downto 0); + signal sync_bus_db : std_logic_vector( 7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + signal sync_bus_cs_l : std_logic; + + signal cpu_vec_reg : std_logic_vector( 7 downto 0) := (others => '0'); + signal ps_reg : std_logic_vector( 2 downto 0); + + signal vram_l : std_logic; + signal rams_data_out : std_logic_vector( 7 downto 0); + -- more decode + signal wr0_l : std_logic; + signal wr1_l : std_logic; + signal wr2_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw1_l : std_logic; + signal iodec_dipsw2_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector( 3 downto 0); + signal watchdog_reset_l : std_logic; + +begin + + v_blank <= vblank; + h_blank <= hblank; + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + vsync <= not vcnt(8); + do_hsync <= true when (hcnt = "010101111") else false; -- 0AF + + p_sync : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + + if (hcnt = "010001111") then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") then + hblank <= '0'; -- 0EF + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + + -- + -- cpu + -- + p_cpu_wait_comb : process(sync_bus_wreq_l) + begin + cpu_wait_l <= '1'; + if (sync_bus_wreq_l = '0') then + cpu_wait_l <= '0'; + end if; + end process; + + p_irq_req_watchdog : process + variable rising_vblank : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + --rising_vblank := do_hsync; -- debug + -- interrupt 8c + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + + -- simulation + -- pragma translate_off + -- synopsys translate_off +-- watchdog_reset_l <= not reset; -- watchdog disable + -- synopsys translate_on + -- pragma translate_on + end if; + end process; + + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + + p_cpu_ena : process(hcnt, ena_6) + begin + cpu_ena <= '0'; + if (ena_6 = '1') then + cpu_ena <= hcnt(0); + end if; + end process; + + -- + -- primary addr decode + -- + p_mem_decode_comb : process(cpu_rfsh_l, cpu_rd_l, cpu_mreq_l, cpu_addr) + begin + -- rom 0x0000 - 0x3FFF + -- syncbus 0x4000 - 0x7FFF + -- 7M + -- 7N + sync_bus_cs_l <= '1'; + -- program_rom_cs_l <= '1'; + + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + + -- if (cpu_addr(14) = '0') and (cpu_rd_l = '0') then + -- program_rom_cs_l <= '0'; + -- end if; + + if (PENGO = '1' and cpu_addr(15) = '1') or (PACMAN = '1' and cpu_addr(14) = '1') then + sync_bus_cs_l <= '0'; + end if; + + end if; + end process; + + -- + -- sync bus custom ic + -- + p_sync_bus_reg : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; + end process; + + p_sync_bus_comb : process(cpu_rd_l, sync_bus_cs_l, hcnt) + begin + -- sync_bus_stb is now an active low clock enable signal + sync_bus_stb <= '1'; + sync_bus_r_w_l <= '1'; + + if (sync_bus_cs_l = '0') and (hcnt(1) = '0') then + if (cpu_rd_l = '1') then + sync_bus_r_w_l <= '0'; + end if; + sync_bus_stb <= '0'; + end if; + + sync_bus_wreq_l <= '1'; + if (sync_bus_cs_l = '0') and (hcnt(1) = '1') and (cpu_rd_l = '0') then + sync_bus_wreq_l <= '0'; + end if; + end process; + + -- + -- vram addresser custom ic + -- + u_vram_addr : entity work.PACMAN_VRAM_ADDR + port map ( + AB => vram_addr_ab, + H => hcnt, + V => vcnt(7 downto 0), + FLIP => control_reg(3) + ); + + --When 2H is low, the CPU controls the bus. + ab <= cpu_addr(11 downto 0) when hcnt(1) = '0' else vram_addr_ab; + + -- vram_l <= not ((not (cpu_addr(12) or sync_bus_stb)) or (hcnt(1) and hcnt(0))); + vram_l <= ( (cpu_addr(12) or sync_bus_stb) and not (hcnt(1) and hcnt(0)) ); + + -- PENGO PACMAN + + -- WRITE + -- wr0_l 0x9000 - 0x900F voice 1,2,3 waveform wr0_l 0x5040 - 0x504F sound + -- wr1_l 0x9010 - 0x901F x50 wr voice 1,2,3 freq/vol wr1_l 0x5050 - 0x505F sound + -- wr2_l 0x9020 - 0x902F sprites wr2_l 0x5060 - 0x506F sprite + -- 0x5080 - 0x50BF unused + -- out_l 0x9040 - 0x904F control space out_l 0x5000 - 0x503F control space + -- wdr_l 0x9070 - 0x907F watchdog reset wdr_l 0x50C0 - 0x50FF watchdog reset + + -- READ + -- dipsw2_l 0x9000 - 0x903F dip switch 2 + -- dipsw1_l 0x9040 - 0x907F dip switch 1 dipsw1_l 0x5080 - 0x50BF dip switches + -- in1_l 0x9080 - 0x90BF in port 1 in1_l 0x5040 - 0x507F in port 1 + -- in0_l 0x90C0 - 0x90FF in port 0 in0_l 0x5000 - 0x503F in port 0 + + -- writes <------------- PENGO -------------> <------------- PACMAN ------------> + wr0_l <= '0' when sync_bus_r_w_l='0' and ( (PACMAN='0' and ab(7 downto 4)=x"0") or (PACMAN='1' and ab(7 downto 4)=x"4") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- wr voice 1,2,3 waveform + wr1_l <= '0' when sync_bus_r_w_l='0' and ( (PACMAN='0' and ab(7 downto 4)=x"1") or (PACMAN='1' and ab(7 downto 4)=x"5") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- wr voice 1,2,3 freq/vol + wr2_l <= '0' when sync_bus_r_w_l='0' and ( (PACMAN='0' and ab(7 downto 4)=x"2") or (PACMAN='1' and ab(7 downto 4)=x"6") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- wr sprites + iodec_out_l <= '0' when sync_bus_r_w_l='0' and ( (PACMAN='0' and ab(7 downto 4)=x"4") or (PACMAN='1' and ab(7 downto 6)="00") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- wr control space + iodec_wdr_l <= '0' when sync_bus_r_w_l='0' and ( (PACMAN='0' and ab(7 downto 4)=x"7") or (PACMAN='1' and ab(7 downto 6)="11") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- wr watchdog reset + + -- reads + iodec_dipsw2_l <= '0' when sync_bus_r_w_l='1' and ( (PACMAN='0' and ab(7 downto 6)="00") or (PACMAN='1' and ab(7 downto 6)="11") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- rd in dip sw2 + iodec_dipsw1_l <= '0' when sync_bus_r_w_l='1' and ( (PACMAN='0' and ab(7 downto 6)="01") or (PACMAN='1' and ab(7 downto 6)="10") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- rd in dip sw1 + iodec_in1_l <= '0' when sync_bus_r_w_l='1' and ( (PACMAN='0' and ab(7 downto 6)="10") or (PACMAN='1' and ab(7 downto 6)="01") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- rd in port 1 + iodec_in0_l <= '0' when sync_bus_r_w_l='1' and ( (PACMAN='0' and ab(7 downto 6)="11") or (PACMAN='1' and ab(7 downto 6)="00") ) and cpu_addr(12)='1' and sync_bus_stb='0' else '1'; -- rd in port 0 + + ps_reg <= control_reg(7) & control_reg(6) & control_reg(2) when PENGO = '1' else "000"; + + p_control_reg : process + variable ena : std_logic_vector(7 downto 0); + begin + + wait until rising_edge(clk); + if (ena_6 = '1') then + ena := "00000000"; + -- 8 bit addressable latch 7K (made into register) + + -- PENGO PACMAN + -- 0 Interrupt ena Interrupt ena + -- 1 Sound ena Sound ena + -- 2 PS1 Not used + -- 3 Flip Flip + -- 4 Coin 1 meter 1 player start lamp + -- 5 Coin 2 meter 2 player start lamp + -- 6 PS2 Coin lockout + -- 7 PS3 Coin counter + if (iodec_out_l = '0') then + case ab(2 downto 0) is + when "000" => ena := "00000001"; + when "001" => ena := "00000010"; + when "010" => ena := "00000100"; + when "011" => ena := "00001000"; + when "100" => ena := "00010000"; + when "101" => ena := "00100000"; + when "110" => ena := "01000000"; + when "111" => ena := "10000000"; + when others => null; + end case; + end if; + + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (ena(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + -- simplified data source for video subsystem + -- only cpu or ram are sources of interest + sync_bus_db <= cpu_data_out when hcnt(1) = '0' else rams_data_out; + + -- address decoder + cpu_data_in <= cpu_vec_reg when (cpu_iorq_l = '0') and (cpu_m1_l = '0') else + sync_bus_reg when (sync_bus_wreq_l = '0') else + program_rom when (PENGO = '1' and cpu_addr(15) = '0') else -- ROM at 0000 - 7fff (Pengo descrambler) + program_rom when (PACMAN = '1' and cpu_addr(15 downto 14) = "00") else -- ROM at 0000 - 3fff and 8000 - bfff + program_rom when (PACMAN = '1' and cpu_addr(15 downto 13) = "100") else -- ROM at 8000 - 9fff (LizWiz) + in0_reg when (iodec_in0_l = '0') else + in1_reg when (iodec_in1_l = '0') else + dipsw1_reg when (iodec_dipsw1_l = '0') else + dipsw2_reg when (iodec_dipsw2_l = '0') else + rams_data_out; + + u_adec : entity work.rom_descrambler + generic map ( + PENGO => PENGO, + PACMAN => PACMAN, + MRTNT => MRTNT, + LIZWIZ => LIZWIZ, + MSPACMAN => MSPACMAN + ) + port map ( + CLK => clk, + ENA => ena_6, + cpu_m1_l => cpu_m1_l, + addr => cpu_addr, + data => program_rom + ); + + u_rams : work.dpram generic map (12,8) + port map + ( + clk_a_i => clk, + en_a_i => ena_6, + we_i => not sync_bus_r_w_l and not vram_l, + addr_a_i => ab, + data_a_i => cpu_data_out, -- cpu only source of ram data + + clk_b_i => clk, + addr_b_i => ab, + data_b_o => rams_data_out + ); + + -- + -- video subsystem + -- + u_video : entity work.PACMAN_VIDEO + generic map ( + MRTNT => MRTNT + ) + port map ( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + I_PS => ps_reg, + I_WR2_L => wr2_l, + -- + O_RED => video_r, + O_GREEN => video_g, + O_BLUE => video_b, + -- + ENA_6 => ena_6, + CLK => clk + ); + + -- + -- + -- audio subsystem + -- + u_audio : entity work.PACMAN_AUDIO + port map ( + I_HCNT => hcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_WR1_L => wr1_l, + I_WR0_L => wr0_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => audio, + ENA_6 => ena_6, + CLK => clk + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..39619ea0 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR1_L, + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => rom3m(1), + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman_rom_descrambler.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman_rom_descrambler.vhd new file mode 100644 index 00000000..d5e5f484 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman_rom_descrambler.vhd @@ -0,0 +1,479 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) d18c7db (gmail) - May 2013 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- + + +-- The following comments and source code in the comments are from MAME source code and are +-- included here to help make sense of the logic used in the VHDL address mapper and descrambler +-- +--/************************************ +-- * +-- * Ms. Pac-Man +-- * +-- ************************************/ +-- +--/* +-- Ms. Pac-Man has an auxiliary PCB with ribbon cable that plugs into the Z-80 CPU socket of a Pac-Man main PCB. Also the +-- graphics ROMs at 5E, 5F on the main board are replaced. +-- +-- The aux board contains three ROMs (two 2532 at U6, U7 and one 2716 at U5), a Z-80, and four PAL/HAL logic chips. +-- +-- The aux board logic decodes the Z-80 address and determines whether to enable the main board ROMs (containing Pac-Man +-- code) or the aux board ROMs (containing Ms. Pac-Man code). Normally the Pac-Man ROMs reside at address 0x0000-0x3fff +-- and are mirrored at 0x8000-0xbfff (Z-80 A15 is not used in Pac-Man). The aux board logic modifies the address map and +-- enables the aux board ROMs for addresses 0x3000-0x3fff and 0x8000-0x97ff. Furthermore there are forty 8-byte "patch" +-- regions which reside in the 0x0000-0x2fff address range. Any access to these patch addresses will disable the Pac-Man +-- ROMs and enable the aux board ROM. Aux board ROM addresses 0x8000-0x81ef are mapped onto the patch regions. These +-- patches typically insert jumps to new code above 0x8000. +-- +-- The aux board logic also acts as a software protection circuit which inhibits dumping of the ROMs (e.g., using a +-- microprocessor emulator system). There are several "trap" address regions which enable and disable the decode +-- functions. In order to properly operate as Ms. Pac-Man you must access one of the "latch set" trap addresses. This +-- enables the decode. If a "latch clear" address is accessed then decode is disabled and all you get is Pac-Man. For +-- more info see U.S. Patent 4,525,599 "Software protection methods and apparatus". +-- +-- The trap regions are 8 bytes in length starting on the following addresses: +-- +-- latch clear, decode disable +-- 0x0038 +-- 0x03b0 +-- 0x1600 +-- 0x2120 +-- 0x3ff0 +-- 0x8000 +-- 0x97f0 +-- +-- latch set, decode enable +-- 0x3ff8 +-- +-- Any memory access will trigger the trap behavior: instruction fetch, data read, data write. The latch clear addresses +-- should never be accessed during normal Ms. Pac-Man operation, so when the circuitry detects an access it clears the +-- latch and prevents any further dumping of the aux board ROMs. +-- +-- The Pac-Man self-test code does a checksum of the ROM 0x0000-0x2fff. This works because the checksum routine walks the +-- ROM starting from the low address and hits the latch clear trap at 0x0038 prior to encountering any of the patch +-- regions. The decode stays disabled for the rest of the checksum routine, and thus the checksum is calculated for the +-- Pac-Man ROMs with no patches applied. +-- +-- During normal operation every VBLANK (60.6Hz) interrupt will fetch its interrupt vector from the 0x3ff8 trap region, so +-- the latch is continually being enabled. +-- +-- In a further attempt to thwart copying, the aux board ROMs have a simple encryption scheme: their address and data +-- lines are bit flipped (i.e., wired in a nonstandard fashion). The specific bit flips were selected to minimize the +-- vias required to lay out the aux PCB. +--*/ + +-- +--static void mspacman_install_patches(UINT8 *ROM) +--{ +-- int i; +-- +-- /* copy forty 8-byte patches into Pac-Man code */ +-- for (i = 0; i < 8; i++) +-- { +-- ROM[0x0410+i] = ROM[0x8008+i]; +-- ROM[0x08E0+i] = ROM[0x81D8+i]; +-- ROM[0x0A30+i] = ROM[0x8118+i]; +-- ROM[0x0BD0+i] = ROM[0x80D8+i]; +-- ROM[0x0C20+i] = ROM[0x8120+i]; +-- ROM[0x0E58+i] = ROM[0x8168+i]; +-- ROM[0x0EA8+i] = ROM[0x8198+i]; +-- +-- ROM[0x1000+i] = ROM[0x8020+i]; +-- ROM[0x1008+i] = ROM[0x8010+i]; +-- ROM[0x1288+i] = ROM[0x8098+i]; +-- ROM[0x1348+i] = ROM[0x8048+i]; +-- ROM[0x1688+i] = ROM[0x8088+i]; +-- ROM[0x16B0+i] = ROM[0x8188+i]; +-- ROM[0x16D8+i] = ROM[0x80C8+i]; +-- ROM[0x16F8+i] = ROM[0x81C8+i]; +-- ROM[0x19A8+i] = ROM[0x80A8+i]; +-- ROM[0x19B8+i] = ROM[0x81A8+i]; +-- +-- ROM[0x2060+i] = ROM[0x8148+i]; +-- ROM[0x2108+i] = ROM[0x8018+i]; +-- ROM[0x21A0+i] = ROM[0x81A0+i]; +-- ROM[0x2298+i] = ROM[0x80A0+i]; +-- ROM[0x23E0+i] = ROM[0x80E8+i]; +-- ROM[0x2418+i] = ROM[0x8000+i]; +-- ROM[0x2448+i] = ROM[0x8058+i]; +-- ROM[0x2470+i] = ROM[0x8140+i]; +-- ROM[0x2488+i] = ROM[0x8080+i]; +-- ROM[0x24B0+i] = ROM[0x8180+i]; +-- ROM[0x24D8+i] = ROM[0x80C0+i]; +-- ROM[0x24F8+i] = ROM[0x81C0+i]; +-- ROM[0x2748+i] = ROM[0x8050+i]; +-- ROM[0x2780+i] = ROM[0x8090+i]; +-- ROM[0x27B8+i] = ROM[0x8190+i]; +-- ROM[0x2800+i] = ROM[0x8028+i]; +-- ROM[0x2B20+i] = ROM[0x8100+i]; +-- ROM[0x2B30+i] = ROM[0x8110+i]; +-- ROM[0x2BF0+i] = ROM[0x81D0+i]; +-- ROM[0x2CC0+i] = ROM[0x80D0+i]; +-- ROM[0x2CD8+i] = ROM[0x80E0+i]; +-- ROM[0x2CF0+i] = ROM[0x81E0+i]; +-- ROM[0x2D60+i] = ROM[0x8160+i]; +-- } +--} +-- +--DRIVER_INIT_MEMBER(pacman_state,mspacman) +--{ +-- int i; +-- UINT8 *ROM, *DROM; +-- +-- /* CPU ROMs */ +-- +-- /* Pac-Man code is in low bank */ +-- ROM = machine().root_device().memregion("maincpu")->base(); +-- +-- /* decrypted Ms. Pac-Man code is in high bank */ +-- DROM = &machine().root_device().memregion("maincpu")->base()[0x10000]; +-- +-- /* copy ROMs into decrypted bank */ +-- for (i = 0; i < 0x1000; i++) +-- { +-- DROM[0x0000+i] = ROM[0x0000+i]; /* pacman.6e */ +-- DROM[0x1000+i] = ROM[0x1000+i]; /* pacman.6f */ +-- DROM[0x2000+i] = ROM[0x2000+i]; /* pacman.6h */ +-- DROM[0x3000+i] = BITSWAP8(ROM[0xb000+BITSWAP16(i,15,14,13,12,11,3,7,9,10,8,6,5,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt u7 */ +-- } +-- for (i = 0; i < 0x800; i++) +-- { +-- DROM[0x8000+i] = BITSWAP8(ROM[0x8000+BITSWAP16(i,15,14,13,12,11,8,7,5,9,10,6,3,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt u5 */ +-- DROM[0x8800+i] = BITSWAP8(ROM[0x9800+BITSWAP16(i,15,14,13,12,11,3,7,9,10,8,6,5,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt half of u6 */ +-- DROM[0x9000+i] = BITSWAP8(ROM[0x9000+BITSWAP16(i,15,14,13,12,11,3,7,9,10,8,6,5,4,2,1,0)],0,4,5,7,6,3,2,1); /* decrypt half of u6 */ +--// 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 +-- DROM[0x9800+i] = ROM[0x1800+i]; /* mirror of pacman.6f high */ +-- } +-- for (i = 0; i < 0x1000; i++) +-- { +-- DROM[0xa000+i] = ROM[0x2000+i]; /* mirror of pacman.6h */ +-- DROM[0xb000+i] = ROM[0x3000+i]; /* mirror of pacman.6j */ +-- } +-- /* install patches into decrypted bank */ +-- mspacman_install_patches(DROM); +-- +-- /* mirror Pac-Man ROMs into upper addresses of normal bank */ +-- for (i = 0; i < 0x1000; i++) +-- { +-- ROM[0x8000+i] = ROM[0x0000+i]; +-- ROM[0x9000+i] = ROM[0x1000+i]; +-- ROM[0xa000+i] = ROM[0x2000+i]; +-- ROM[0xb000+i] = ROM[0x3000+i]; +-- } +-- +-- /* initialize the banks */ +-- machine().root_device().membank("bank1")->configure_entries(0, 2, &ROM[0x00000], 0x10000); +-- machine().root_device().membank("bank1")->set_entry(1); +--} +-- +--ROM_START( puckmana ) +-- ROM_REGION( 0x10000, "maincpu", 0 ) +-- ROM_LOAD( "pacman.6e", 0x0000, 0x1000, CRC(c1e6ab10) SHA1(e87e059c5be45753f7e9f33dff851f16d6751181) ) +-- ROM_LOAD( "pacman.6f", 0x1000, 0x1000, CRC(1a6fb2d4) SHA1(674d3a7f00d8be5e38b1fdc208ebef5a92d38329) ) +-- ROM_LOAD( "pacman.6h", 0x2000, 0x1000, CRC(bcdd1beb) SHA1(8e47e8c2c4d6117d174cdac150392042d3e0a881) ) +-- ROM_LOAD( "prg7", 0x3000, 0x0800, CRC(b6289b26) SHA1(d249fa9cdde774d5fee7258147cd25fa3f4dc2b3) ) +-- ROM_LOAD( "prg8", 0x3800, 0x0800, CRC(17a88c13) SHA1(eb462de79f49b7aa8adb0cc6d31535b10550c0ce) ) +-- +--ROM_START( mspacman ) +-- ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k for code+64k for decrypted code */ +-- ROM_LOAD( "pacman.6e", 0x0000, 0x1000, CRC(c1e6ab10) SHA1(e87e059c5be45753f7e9f33dff851f16d6751181) ) +-- ROM_LOAD( "pacman.6f", 0x1000, 0x1000, CRC(1a6fb2d4) SHA1(674d3a7f00d8be5e38b1fdc208ebef5a92d38329) ) +-- ROM_LOAD( "pacman.6h", 0x2000, 0x1000, CRC(bcdd1beb) SHA1(8e47e8c2c4d6117d174cdac150392042d3e0a881) ) +-- ROM_LOAD( "pacman.6j", 0x3000, 0x1000, CRC(817d94e3) SHA1(d4a70d56bb01d27d094d73db8667ffb00ca69cb9) ) +-- +-- ROM_LOAD( "u5", 0x8000, 0x0800, CRC(f45fbbcd) SHA1(b26cc1c8ee18e9b1daa97956d2159b954703a0ec) ) +-- ROM_LOAD( "u6", 0x9000, 0x1000, CRC(a90e7000) SHA1(e4df96f1db753533f7d770aa62ae1973349ea4cf) ) +-- ROM_LOAD( "u7", 0xb000, 0x1000, CRC(c82cd714) SHA1(1d8ac7ad03db2dc4c8c18ade466e12032673f874) ) +-- +-- +--Normally the Pac-Man ROMs reside at address 0x0000-0x3fff and are mirrored at 0x8000-0xbfff (Z-80 A15 is not used in Pac-Man). +--The aux board logic modifies the address map and enables the aux board ROMs for addresses 0x3000-0x3fff and 0x8000-0x97ff. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity rom_descrambler is + generic ( + -- only set one of these + PENGO : std_logic := '0'; -- set to 1 when using Pengo ROMs, 0 otherwise + PACMAN : std_logic := '1'; -- set to 1 for all other Pacman hardware games + -- only set one of these when PACMAN is set + MRTNT : std_logic := '0'; -- set to 1 when using Mr TNT ROMs, 0 otherwise + LIZWIZ : std_logic := '0'; -- set to 1 when using Lizard Wizard ROMs, 0 otherwise + MSPACMAN : std_logic := '0' -- set to 1 when using Ms Pacman ROMs, 0 otherwise + ); + port ( + CLK : in std_logic; + ENA : in std_logic; + -- + cpu_m1_l : in std_logic; + addr : in std_logic_vector(15 downto 0); + data : out std_logic_vector( 7 downto 0) + ); + +end rom_descrambler; + +architecture rtl of rom_descrambler is + signal overlay_on : std_logic := '0'; + signal sega_dec_ena : std_logic; + signal rom_patched : std_logic_vector(15 downto 0); + signal rom_addr : std_logic_vector(15 downto 0); + signal rom_lo : std_logic_vector( 7 downto 0); + signal rom_hi : std_logic_vector( 7 downto 0); + signal rom_data_in : std_logic_vector( 7 downto 0); + signal rom_data_out : std_logic_vector( 7 downto 0); + signal sega_dec : std_logic_vector( 7 downto 0); +begin + -- ROM at 0000 - 3FFF + u_program_rom0 : entity work.ROM_PGM_0 + port map ( + CLK => CLK, + ADDR => rom_addr(13 downto 0), + DATA => rom_lo + ); + + -- ROM at 8000 - BFFF (Liz Wiz) + u_program_rom1 : entity work.ROM_PGM_1 + port map ( + CLK => CLK, + ADDR => rom_addr(13 downto 0), + DATA => rom_hi + ); + + -- Sega ROM descrambler adapted from MAME segacrpt.c source code + u_sega_decode : entity work.sega_decode + port map ( + I_CK => clk, + I_DEC => sega_dec_ena, -- passthrough when low + I_A(6) => cpu_m1_l, + I_A(5) => rom_addr(12), + I_A(4) => rom_addr(8), + I_A(3) => rom_addr(4), + I_A(2) => rom_addr(0), + I_A(1) => rom_data_in(5), + I_A(0) => rom_data_in(3), + I_D => rom_data_in, + O_D => sega_dec + ); + + sega_dec_ena <= PENGO and (not rom_addr(15)); + +-- The trap regions are 8 bytes in length starting on the following addresses: +-- +-- latch clear, decode disable +-- 0x0038 +-- 0x03b0 +-- 0x1600 +-- 0x2120 +-- 0x3ff0 +-- 0x8000 +-- 0x97f0 +-- +-- latch set, decode enable +-- 0x3ff8 + p_overlay : process + variable trap_addr : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + trap_addr := addr(15 downto 3) & "000"; + if trap_addr = x"3ff8" then + overlay_on <= '1'; + elsif + trap_addr = x"0038" or + trap_addr = x"03b0" or + trap_addr = x"1600" or + trap_addr = x"2120" or + trap_addr = x"3ff0" or + trap_addr = x"8000" or + trap_addr = x"97f0" + then + overlay_on <= '0'; + end if; + end process; + + p_decoder_comb : process(clk, rom_addr, addr, rom_data_in, rom_data_out, rom_patched, rom_hi, rom_lo, overlay_on, sega_dec) + variable patch_addr : std_logic_vector(15 downto 0); + begin + rom_addr <= addr; + rom_patched <= addr; + data <= rom_data_out; + + -- default is unscrambled data + rom_data_out <= rom_data_in ; + + -- mux ROMs to same data bus + -- ignore A15 so that Pacman ROMs 0000-3FFF mirror in high mem at 8000-BFFF + if rom_addr(14) = '0' then + rom_data_in <= rom_lo; + else + rom_data_in <= rom_hi; + end if; + + -- Mr TNT program ROMs have data lines D3 and D5 swapped + -- Mr TNT video ROMs have data lines D4 and D6 and address lines A0 and A2 swapped + if MRTNT = '1' then + rom_data_out <= rom_data_in(7 downto 6) & rom_data_in(3) & rom_data_in(4) & rom_data_in(5) & rom_data_in(2 downto 0); + end if; + + if PENGO = '1' then + -- ROM at 0000 - 7fff (Pengo) + if rom_addr(15) = '0' then + rom_data_out <= sega_dec; + end if; + end if; + + if MSPACMAN = '1' and overlay_on = '1' then + -- forty 8-byte patches into Pac-Man code + -- If the CPU address presented falls in a patch range, substitute it with patched address + -- OH THE HUMANITY!!! + patch_addr := addr(15 downto 3) & "000"; + case patch_addr is + when x"0410" => rom_patched <= x"800" & '1' & addr(2 downto 0); -- ROM[0x0410+i] = ROM[0x8008+i] + when x"08E0" => rom_patched <= x"81D" & '1' & addr(2 downto 0); -- ROM[0x08E0+i] = ROM[0x81D8+i] + when x"0A30" => rom_patched <= x"811" & '1' & addr(2 downto 0); -- ROM[0x0A30+i] = ROM[0x8118+i] + when x"0BD0" => rom_patched <= x"80D" & '1' & addr(2 downto 0); -- ROM[0x0BD0+i] = ROM[0x80D8+i] + when x"0C20" => rom_patched <= x"812" & '0' & addr(2 downto 0); -- ROM[0x0C20+i] = ROM[0x8120+i] + when x"0E58" => rom_patched <= x"816" & '1' & addr(2 downto 0); -- ROM[0x0E58+i] = ROM[0x8168+i] + when x"0EA8" => rom_patched <= x"819" & '1' & addr(2 downto 0); -- ROM[0x0EA8+i] = ROM[0x8198+i] + + when x"1000" => rom_patched <= x"802" & '0' & addr(2 downto 0); -- ROM[0x1000+i] = ROM[0x8020+i] + when x"1008" => rom_patched <= x"801" & '0' & addr(2 downto 0); -- ROM[0x1008+i] = ROM[0x8010+i] + when x"1288" => rom_patched <= x"809" & '1' & addr(2 downto 0); -- ROM[0x1288+i] = ROM[0x8098+i] + when x"1348" => rom_patched <= x"804" & '1' & addr(2 downto 0); -- ROM[0x1348+i] = ROM[0x8048+i] + when x"1688" => rom_patched <= x"808" & '1' & addr(2 downto 0); -- ROM[0x1688+i] = ROM[0x8088+i] + when x"16B0" => rom_patched <= x"818" & '1' & addr(2 downto 0); -- ROM[0x16B0+i] = ROM[0x8188+i] + when x"16D8" => rom_patched <= x"80C" & '1' & addr(2 downto 0); -- ROM[0x16D8+i] = ROM[0x80C8+i] + when x"16F8" => rom_patched <= x"81C" & '1' & addr(2 downto 0); -- ROM[0x16F8+i] = ROM[0x81C8+i] + when x"19A8" => rom_patched <= x"80A" & '1' & addr(2 downto 0); -- ROM[0x19A8+i] = ROM[0x80A8+i] + when x"19B8" => rom_patched <= x"81A" & '1' & addr(2 downto 0); -- ROM[0x19B8+i] = ROM[0x81A8+i] + + when x"2060" => rom_patched <= x"814" & '1' & addr(2 downto 0); -- ROM[0x2060+i] = ROM[0x8148+i] + when x"2108" => rom_patched <= x"801" & '1' & addr(2 downto 0); -- ROM[0x2108+i] = ROM[0x8018+i] + when x"21A0" => rom_patched <= x"81A" & '0' & addr(2 downto 0); -- ROM[0x21A0+i] = ROM[0x81A0+i] + when x"2298" => rom_patched <= x"80A" & '0' & addr(2 downto 0); -- ROM[0x2298+i] = ROM[0x80A0+i] + when x"23E0" => rom_patched <= x"80E" & '1' & addr(2 downto 0); -- ROM[0x23E0+i] = ROM[0x80E8+i] + when x"2418" => rom_patched <= x"800" & '0' & addr(2 downto 0); -- ROM[0x2418+i] = ROM[0x8000+i] + when x"2448" => rom_patched <= x"805" & '1' & addr(2 downto 0); -- ROM[0x2448+i] = ROM[0x8058+i] + when x"2470" => rom_patched <= x"814" & '0' & addr(2 downto 0); -- ROM[0x2470+i] = ROM[0x8140+i] + when x"2488" => rom_patched <= x"808" & '0' & addr(2 downto 0); -- ROM[0x2488+i] = ROM[0x8080+i] + when x"24B0" => rom_patched <= x"818" & '0' & addr(2 downto 0); -- ROM[0x24B0+i] = ROM[0x8180+i] + when x"24D8" => rom_patched <= x"80C" & '0' & addr(2 downto 0); -- ROM[0x24D8+i] = ROM[0x80C0+i] + when x"24F8" => rom_patched <= x"81C" & '0' & addr(2 downto 0); -- ROM[0x24F8+i] = ROM[0x81C0+i] + when x"2748" => rom_patched <= x"805" & '0' & addr(2 downto 0); -- ROM[0x2748+i] = ROM[0x8050+i] + when x"2780" => rom_patched <= x"809" & '0' & addr(2 downto 0); -- ROM[0x2780+i] = ROM[0x8090+i] + when x"27B8" => rom_patched <= x"819" & '0' & addr(2 downto 0); -- ROM[0x27B8+i] = ROM[0x8190+i] + when x"2800" => rom_patched <= x"802" & '1' & addr(2 downto 0); -- ROM[0x2800+i] = ROM[0x8028+i] + when x"2B20" => rom_patched <= x"810" & '0' & addr(2 downto 0); -- ROM[0x2B20+i] = ROM[0x8100+i] + when x"2B30" => rom_patched <= x"811" & '0' & addr(2 downto 0); -- ROM[0x2B30+i] = ROM[0x8110+i] + when x"2BF0" => rom_patched <= x"81D" & '0' & addr(2 downto 0); -- ROM[0x2BF0+i] = ROM[0x81D0+i] + when x"2CC0" => rom_patched <= x"80D" & '0' & addr(2 downto 0); -- ROM[0x2CC0+i] = ROM[0x80D0+i] + when x"2CD8" => rom_patched <= x"80E" & '0' & addr(2 downto 0); -- ROM[0x2CD8+i] = ROM[0x80E0+i] + when x"2CF0" => rom_patched <= x"81E" & '0' & addr(2 downto 0); -- ROM[0x2CF0+i] = ROM[0x81E0+i] + when x"2D60" => rom_patched <= x"816" & '0' & addr(2 downto 0); -- ROM[0x2D60+i] = ROM[0x8160+i] + when others => rom_patched <= addr; + end case; + +-- Pacman ROMs +-- 0x0000-0x0FFF = 0x0000-0x0FFF; /* pacman.6e */ +-- 0x1000-0x1FFF = 0x1000-0x1FFF; /* pacman.6f */ +-- 0x2000-0x2FFF = 0x2000-0x2FFF; /* pacman.6h */ +-- 0x3000-0x3FFF = 0x3000-0x3FFF; /* pacman.6j */ + +-- ROM mirror (easy just ignore A15) +-- 0x8000-0x8FFF = 0x0000-0x0FFF; /* mirror of pacman.6e */ +-- 0x9000-0x9FFF = 0x1000-0x1FFF; /* mirror of pacman.6f */ +-- 0xA000-0xAFFF = 0x2000-0x2FFF; /* mirror of pacman.6h */ +-- 0xB000-0xBFFF = 0x3000-0x3FFF; /* mirror of pacman.6j */ + +-- Ms Pacman overlays + +-- no xlate +-- 0x8000-0x87FF = 0x8000-0x87FF (physical ROM hi 0000-07FF); /* decrypt u5 */ +-- 0x9000-0x97FF = 0x9000-0x97FF (physical ROM hi 1000-17FF); /* decrypt half of u6 */ + +-- xlate addr +-- 0x3000-0x3FFF = 0xB000-0xBFFF (physical ROM hi 2000-2FFF); /* decrypt u7 */ + +-- xlate addr +-- 0x8800-0x8FFF = 0x9800-0x9FFF (physical ROM hi 1800-1FFF); /* decrypt half of u6 */ + +-- ROM hi mem map +-- u5 2K 0000-07FF (0x8000-0x87FF) +-- u5 2K 0800-0FFF N/A +-- u6b 2K 1000-17FF (0x9000-0x97FF) +-- u6t 2K 1800-1FFF (0x8800-0x8FFF) +-- u7 4K 2000-2FFF (0x3000-0x3FFF) + + -- If the new patched address falls in certain Ms Pacman ranges, swap in ROM overlays and descramble address and data + -- high address bits are not scrambled so we know for sure this only accesses ROM hi after address translation + case rom_patched(15 downto 11) is + + -- addr = 0x3000-0x37FF, xlate to 0xB000-0xB7FF (physical ROM hi 2000-27FF), decrypt half of u7 + when "00110" => + rom_addr <= x"2" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x3800-0x3FFF, xlate to 0xB800-0xBFFF (physical ROM hi 2800-2FFF), decrypt half of u7 + when "00111" => + rom_addr <= x"2" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x8000-0x87FF, no xlate (physical ROM hi 0000-07FF), decrypt u5 + when "10000" => + rom_addr <= x"0" & rom_patched(11) & rom_patched(8) & rom_patched(7) & rom_patched(5) & rom_patched(9) & rom_patched(10) & rom_patched(6) & rom_patched(3) & rom_patched(4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x8800-0x8FFF, xlate to 0x9800-0x9FFF (physical ROM hi 1800-1FFF), decrypt half of u6 + when "10001" => + rom_addr <= x"1" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- addr = 0x9000-0x97FF, no xlate (physical ROM hi 1000-17FF), decrypt half of u6 + when "10010" => + rom_addr <= x"1" & rom_patched(11) & rom_patched(3) & rom_patched(7) & rom_patched(9) & rom_patched(10) & rom_patched(8) & rom_patched(6 downto 4) & rom_patched(2 downto 0); + rom_data_out <= rom_hi(0) & rom_hi(4) & rom_hi(5) & rom_hi(7 downto 6) & rom_hi(3 downto 1); + + -- catch all default action + when others => null; + rom_addr <= rom_patched; + rom_data_out <= rom_data_in; + end case; + end if; + end process; + +end rtl; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..d502530c --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman_video.vhd @@ -0,0 +1,371 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_VIDEO is +generic ( + MRTNT : std_logic := '1' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); +port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + I_PS : in std_logic_vector( 2 downto 0); + I_WR2_L : in std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic +); +end; + +architecture RTL of PACMAN_VIDEO is + + signal sprite_xy_ram_temp : std_logic_vector(7 downto 0); + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal db_reg : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + + signal ca : std_logic_vector(13 downto 0); + signal char_rom_5ef_dout : std_logic_vector(7 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal cntr_ld : std_logic; + signal sprite_ram_ip : std_logic_vector(3 downto 0); + signal sprite_ram_op : std_logic_vector(3 downto 0); + signal ra : std_logic_vector(7 downto 0); + signal ra_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(3 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + + -- ram enable is low when HBLANK_L is 0 (for sprite access) or + -- 2H is low (for cpu writes) + -- we can simplify this + dr <= not sprite_xy_ram_temp when I_HBLANK = '1' else "11111111"; -- pull ups on board + + sprite_xy_ram : work.dpram generic map (4,8) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR2_L, + addr_a_i => I_AB(3 downto 0), + data_a_i => I_DB, + + clk_b_i => CLK, + addr_b_i => I_AB(3 downto 0), + data_b_o => sprite_xy_ram_temp + ); + + p_char_regs : process + variable inc : std_logic; + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; + begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + inc := (not I_HBLANK); + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & inc); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + db_reg <= I_DB; -- character reg + end if; + end process; + + p_flip_comb : process(char_hblank_reg, I_FLIP, db_reg) + begin + if (char_hblank_reg = '0') then + xflip <= I_FLIP; + yflip <= I_FLIP; + else + xflip <= db_reg(1); + yflip <= db_reg(0); + end if; + end process; + + p_char_addr_comb : process(db_reg, I_HCNT, I_PS(2), + char_match_reg, char_sum_reg, char_hblank_reg, + xflip, yflip) + begin + obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + + ca(13) <= I_PS(2); + ca(12) <= char_hblank_reg; + ca(11 downto 6) <= db_reg(7 downto 2); + + -- 2h, 4e + if (char_hblank_reg = '0') then + ca(5) <= db_reg(1); + ca(4) <= db_reg(0); + else + ca(5) <= char_sum_reg(3) xor xflip; + ca(4) <= I_HCNT(3); + end if; + + ca(3) <= I_HCNT(2) xor yflip; + ca(1) <= char_sum_reg(1) xor xflip; + + -- descramble ROMs for Mr TNT (swap address lines A0 and A2) + if MRTNT = '1' then + ca(2) <= char_sum_reg(0) xor xflip; + ca(0) <= char_sum_reg(2) xor xflip; + else + ca(2) <= char_sum_reg(2) xor xflip; + ca(0) <= char_sum_reg(0) xor xflip; + end if; + end process; + + + -- descramble ROMs for Mr TNT (swap data lines D4 and D6) + char_rom_5ef_dout <= char_rom_5ef_buf(7) & char_rom_5ef_buf(4) & char_rom_5ef_buf(5) & char_rom_5ef_buf(6) & char_rom_5ef_buf(3 downto 0) when MRTNT = '1' else char_rom_5ef_buf; + + -- char roms + char_rom_5ef : entity work.GFX1 + port map ( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf + ); + + p_char_shift : process + begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_dout(7 downto 4); -- load + shift_regl <= char_rom_5ef_dout(3 downto 0); + when others => null; + end case; + end if; + end process; + + p_char_shift_comb : process(I_HCNT, vout_yflip, shift_regu, shift_regl) + variable ip : std_logic; + begin + ip := I_HCNT(0) and I_HCNT(1); + if (vout_yflip = '0') then + + shift_sel(0) <= ip; + shift_sel(1) <= '1'; + shift_op(0) <= shift_regl(3); + shift_op(1) <= shift_regu(3); + else + + shift_sel(0) <= '1'; + shift_sel(1) <= ip; + shift_op(0) <= shift_regl(0); + shift_op(1) <= shift_regu(0); + end if; + end process; + + p_video_out_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= I_DB(4 downto 0); -- colour reg + end if; + end if; + end process; + + col_rom_4a : entity work.PROM4_DST + port map ( + CLK => CLK, + ADDR(9) => '0', + ADDR(8) => I_PS(1), + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a + ); + + cntr_ld <= '1' when (I_HCNT(3 downto 0) = "0111") and (vout_hblank='1' or vout_obj_on='0') else '0'; + + p_ra_cnt : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (cntr_ld = '1') then + ra <= dr; + else + ra <= ra + "1"; + end if; + end if; + end process; + + u_sprite_ram : work.dpram generic map (8,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => vout_obj_on_t1, + addr_a_i => ra_t1, + data_a_i => sprite_ram_ip, + + clk_b_i => CLK, + addr_b_i => ra, + data_b_o => sprite_ram_op + ); + + sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "0000"; + video_op_sel <= '1' when not (sprite_ram_reg = "0000") else '0'; + + p_sprite_ram_ip_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + ra_t1 <= ra; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + end if; + end process; + + p_sprite_ram_ip_comb : process(vout_hblank_t1, video_op_sel, sprite_ram_reg, lut_4a_t1) + begin + -- 3a + if (vout_hblank_t1 = '0') then + sprite_ram_ip <= (others => '0'); + else + if (video_op_sel = '1') then + sprite_ram_ip <= sprite_ram_reg; + else + sprite_ram_ip <= lut_4a_t1(3 downto 0); + end if; + end if; + end process; + + p_video_op_comb : process(vout_hblank, I_VBLANK, video_op_sel, sprite_ram_reg, lut_4a) + begin + -- 3b + if (vout_hblank = '1') or (I_VBLANK = '1') then + final_col <= (others => '0'); + else + if (video_op_sel = '1') then + final_col <= sprite_ram_reg; -- sprite + else + final_col <= lut_4a(3 downto 0); + end if; + end if; + end process; + + -- assign video outputs from color LUT PROM + col_rom_7f : entity work.PROM7_DST + port map ( + CLK => CLK, + ADDR(4) => I_PS(0), + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE + ); + +end architecture; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman_vram_addr.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman_vram_addr.vhd new file mode 100644 index 00000000..33b9febe --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pacman_vram_addr.vhd @@ -0,0 +1,73 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ & CarlW - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VRAM_ADDR is +port ( + AB : out std_logic_vector (11 downto 0); + H : in std_logic_vector ( 8 downto 0); -- H256_L H128 H64 H32 H16 H8 H4 H2 H1 + V : in std_logic_vector ( 7 downto 0); -- V128 V64 v32 V16 V8 V4 V2 V1 + FLIP : in std_logic +); +end; + +architecture RTL of PACMAN_VRAM_ADDR is + signal sel : std_logic; + signal y157_bus : std_logic_vector (11 downto 0); + signal y257_bus : std_logic_vector (11 downto 0); + signal hp : std_logic_vector ( 4 downto 0); + signal vp : std_logic_vector ( 4 downto 0); +begin + hp <= H(7 downto 3) xor (FLIP & FLIP & FLIP & FLIP & FLIP); + vp <= V(7 downto 3) xor (FLIP & FLIP & FLIP & FLIP & FLIP); + + sel <= not ( (H(5) xor H(4)) or (H(5) xor H(6)) ); + y157_bus <= '0' & H(2) & hp(3) & hp(3) & hp(3) & hp(3) & hp(0) & vp when sel='1' else x"FF" & H(6 downto 4) & H(2); + y257_bus <= y157_bus when H(8)='0' else '0' & H(2) & vp & hp; + AB <= y257_bus when H(1) = '1' else (others => 'Z'); + +end RTL; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_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 VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/pll.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pll.vhd new file mode 100644 index 00000000..3c952a1a --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/pll.vhd @@ -0,0 +1,365 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC ; + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + locked <= sub_wire0; + sub_wire2 <= sub_wire1(0); + c0 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 9, + clk0_duty_cycle => 50, + clk0_multiply_by => 8, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire4, + locked => sub_wire0, + clk => sub_wire1 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "9" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +-- 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 "1" +-- 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: 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_CLKENA0 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 "9" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +-- Retrieval info: CONSTANT: CLK0_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_USED" +-- 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_USED" +-- 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_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/Pengo_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/Pengo_MiST/rtl/sega_decode.vhd b/Arcade/Pacman Hardware/Pengo_MiST/rtl/sega_decode.vhd new file mode 100644 index 00000000..8ae8141d --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_MiST/rtl/sega_decode.vhd @@ -0,0 +1,191 @@ +------------------------------------------------------------------------------- +-- Pengo decode table +-- /* opcode (M1=0) data (M1=1) address */ +-- /* 0 1 2 3 0 1 2 3 A12 A8 A4 A0 */ +-- { 0xa0,0x80,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...0 */ +-- { 0x28,0xa8,0x08,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...0...1 */ +-- { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...0...1...0 */ +-- { 0x08,0x28,0x88,0xa8 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...1 */ +-- { 0x08,0x00,0x88,0x80 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...1...0...0 */ +-- { 0xa0,0x80,0x20,0x00 }, { 0x08,0x00,0x88,0x80 }, /* ...0...1...0...1 */ +-- { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...1...0 */ +-- { 0xa0,0x80,0x20,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...0...1...1...1 */ +-- { 0x88,0x80,0x08,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...0...0 */ +-- { 0x88,0x80,0x08,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...1...0...0...1 */ +-- { 0x08,0x28,0x88,0xa8 }, { 0x08,0x28,0x88,0xa8 }, /* ...1...0...1...0 */ +-- { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...1...1 */ +-- { 0x08,0x00,0x88,0x80 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...0 */ +-- { 0x00,0x08,0x20,0x28 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...1 */ +-- { 0x08,0x28,0x88,0xa8 }, { 0x08,0x28,0x88,0xa8 }, /* ...1...1...1...0 */ +-- { 0x08,0x00,0x88,0x80 }, { 0xa0,0x80,0x20,0x00 } /* ...1...1...1...1 */ +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity sega_decode is + port ( + I_DEC : in std_logic; + I_CK : in std_logic; + -- + I_A : in std_logic_vector(6 downto 0); + I_D : in std_logic_vector(7 downto 0); + O_D : out std_logic_vector(7 downto 0) + ); + +end sega_decode; + +architecture rtl of sega_decode is + signal sel : std_logic_vector(6 downto 0); + signal val : std_logic_vector(2 downto 0); +begin + p_decoder : process + begin + wait until rising_edge(I_CK); + if (I_DEC = '0') then + O_D <= I_D; -- passthough + else + sel <= I_A xor ("00000" & I_D(7) & I_D(7)); + O_D(7) <= I_D(7) xor val(2); + O_D(6) <= I_D(6); + O_D(5) <= I_D(7) xor val(1); + O_D(4) <= I_D(4); + O_D(3) <= I_D(7) xor val(0); + O_D(2) <= I_D(2); + O_D(1) <= I_D(1); + O_D(0) <= I_D(0); + case sel is -- M1 A12 A8 A4 A0 D5 D3 + when "0000000" => val <= "110"; + when "0000001" => val <= "100"; + when "0000010" => val <= "111"; + when "0000011" => val <= "101"; + when "0000100" => val <= "011"; + when "0000101" => val <= "111"; + when "0000110" => val <= "001"; + when "0000111" => val <= "101"; + when "0001000" => val <= "110"; + when "0001001" => val <= "100"; + when "0001010" => val <= "010"; + when "0001011" => val <= "000"; + when "0001100" => val <= "001"; + when "0001101" => val <= "011"; + when "0001110" => val <= "101"; + when "0001111" => val <= "111"; + when "0010000" => val <= "001"; + when "0010001" => val <= "000"; + when "0010010" => val <= "101"; + when "0010011" => val <= "100"; + when "0010100" => val <= "110"; + when "0010101" => val <= "100"; + when "0010110" => val <= "010"; + when "0010111" => val <= "000"; + when "0011000" => val <= "110"; + when "0011001" => val <= "100"; + when "0011010" => val <= "010"; + when "0011011" => val <= "000"; + when "0011100" => val <= "110"; + when "0011101" => val <= "100"; + when "0011110" => val <= "010"; + when "0011111" => val <= "000"; + when "0100000" => val <= "101"; + when "0100001" => val <= "100"; + when "0100010" => val <= "001"; + when "0100011" => val <= "000"; + when "0100100" => val <= "101"; + when "0100101" => val <= "100"; + when "0100110" => val <= "001"; + when "0100111" => val <= "000"; + when "0101000" => val <= "001"; + when "0101001" => val <= "011"; + when "0101010" => val <= "101"; + when "0101011" => val <= "111"; + when "0101100" => val <= "110"; + when "0101101" => val <= "100"; + when "0101110" => val <= "111"; + when "0101111" => val <= "101"; + when "0110000" => val <= "001"; + when "0110001" => val <= "000"; + when "0110010" => val <= "101"; + when "0110011" => val <= "100"; + when "0110100" => val <= "000"; + when "0110101" => val <= "001"; + when "0110110" => val <= "010"; + when "0110111" => val <= "011"; + when "0111000" => val <= "001"; + when "0111001" => val <= "011"; + when "0111010" => val <= "101"; + when "0111011" => val <= "111"; + when "0111100" => val <= "001"; + when "0111101" => val <= "000"; + when "0111110" => val <= "101"; + when "0111111" => val <= "100"; + when "1000000" => val <= "011"; + when "1000001" => val <= "111"; + when "1000010" => val <= "001"; + when "1000011" => val <= "101"; + when "1000100" => val <= "110"; + when "1000101" => val <= "100"; + when "1000110" => val <= "111"; + when "1000111" => val <= "101"; + when "1001000" => val <= "110"; + when "1001001" => val <= "100"; + when "1001010" => val <= "010"; + when "1001011" => val <= "000"; + when "1001100" => val <= "110"; + when "1001101" => val <= "100"; + when "1001110" => val <= "111"; + when "1001111" => val <= "101"; + when "1010000" => val <= "011"; + when "1010001" => val <= "111"; + when "1010010" => val <= "001"; + when "1010011" => val <= "101"; + when "1010100" => val <= "001"; + when "1010101" => val <= "000"; + when "1010110" => val <= "101"; + when "1010111" => val <= "100"; + when "1011000" => val <= "110"; + when "1011001" => val <= "100"; + when "1011010" => val <= "010"; + when "1011011" => val <= "000"; + when "1011100" => val <= "000"; + when "1011101" => val <= "001"; + when "1011110" => val <= "010"; + when "1011111" => val <= "011"; + when "1100000" => val <= "110"; + when "1100001" => val <= "100"; + when "1100010" => val <= "010"; + when "1100011" => val <= "000"; + when "1100100" => val <= "000"; + when "1100101" => val <= "001"; + when "1100110" => val <= "010"; + when "1100111" => val <= "011"; + when "1101000" => val <= "001"; + when "1101001" => val <= "011"; + when "1101010" => val <= "101"; + when "1101011" => val <= "111"; + when "1101100" => val <= "110"; + when "1101101" => val <= "100"; + when "1101110" => val <= "010"; + when "1101111" => val <= "000"; + when "1110000" => val <= "101"; + when "1110001" => val <= "100"; + when "1110010" => val <= "001"; + when "1110011" => val <= "000"; + when "1110100" => val <= "101"; + when "1110101" => val <= "100"; + when "1110110" => val <= "001"; + when "1110111" => val <= "000"; + when "1111000" => val <= "001"; + when "1111001" => val <= "011"; + when "1111010" => val <= "101"; + when "1111011" => val <= "111"; + when "1111100" => val <= "110"; + when "1111101" => val <= "100"; + when "1111110" => val <= "010"; + when "1111111" => val <= "000"; + when others => null; + end case; + end if; + end process; +end rtl; diff --git a/Arcade/Pacman Hardware/Pengo_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/Pengo_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/Pengo_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/Arcade/Pacman Hardware/Ponpoko_MiST/Ponpoko.qpf b/Arcade/Pacman Hardware/Ponpoko_MiST/Ponpoko.qpf new file mode 100644 index 00000000..c49afdb0 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/Ponpoko.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Ponpoko" diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/Ponpoko.qsf b/Arcade/Pacman Hardware/Ponpoko_MiST/Ponpoko.qsf new file mode 100644 index 00000000..4fcaf782 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/Ponpoko.qsf @@ -0,0 +1,175 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 20:43:12 November 20, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Ponpoko_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/pll.v +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/ROM/GFX1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Ponpoko.sv + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Ponpoko +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Alibaba) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Alibaba) +# ------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/Ponpoko.srf b/Arcade/Pacman Hardware/Ponpoko_MiST/Ponpoko.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/Ponpoko.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/README.txt b/Arcade/Pacman Hardware/Ponpoko_MiST/README.txt new file mode 100644 index 00000000..ed50b674 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/README.txt @@ -0,0 +1,24 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Ponpoko for MiST by Gehstock +-- 21 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F1 : Start 1 player +-- F2 : Start 2 players +-- SPACE,CTRL : Jump +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/Release/Ponpoko.rbf b/Arcade/Pacman Hardware/Ponpoko_MiST/Release/Ponpoko.rbf new file mode 100644 index 00000000..58c58abf Binary files /dev/null and b/Arcade/Pacman Hardware/Ponpoko_MiST/Release/Ponpoko.rbf differ diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/clean.bat b/Arcade/Pacman Hardware/Ponpoko_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_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/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/Ponpoko.sv b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/Ponpoko.sv new file mode 100644 index 00000000..21d45217 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/Ponpoko.sv @@ -0,0 +1,195 @@ +//============================================================================ +// Arcade: Ponpoko +// +// Version for MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Ponpoko +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Ponpoko;;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys, clk_snd; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [7:0] audio; +assign LED = 1; +//wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(340), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +//wire m_bomb = kbjoy[8]; +//wire m_Serv = kbjoy[9]; +//wire m_skip = kbjoy[9]; + + +pacman ponpoko +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .in0({~{2'b00, m_coin}, m_fire, m_down,m_right,m_left,m_up}), + .in1({1'b0, m_start2, m_start1, m_fire, m_down,m_right,m_left,m_up}), + + .dipsw1(8'b1_1_11_11_01), + .dipsw2(8'b1111_0001), + + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..f0842342 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"CC",X"66",X"33",X"33",X"33",X"22",X"CC",X"00",X"11",X"22",X"66",X"66",X"66",X"33",X"11",X"00", + X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"33",X"00", + X"EE",X"33",X"77",X"EE",X"88",X"00",X"FF",X"00",X"33",X"66",X"00",X"11",X"33",X"66",X"77",X"00", + X"FF",X"66",X"CC",X"EE",X"33",X"33",X"EE",X"00",X"77",X"00",X"00",X"11",X"00",X"44",X"33",X"00", + X"EE",X"66",X"66",X"66",X"FF",X"66",X"66",X"00",X"00",X"11",X"22",X"44",X"77",X"00",X"00",X"00", + X"FF",X"00",X"EE",X"33",X"33",X"33",X"EE",X"00",X"77",X"66",X"77",X"00",X"00",X"44",X"33",X"00", + X"EE",X"00",X"00",X"EE",X"33",X"33",X"EE",X"00",X"11",X"22",X"66",X"77",X"66",X"66",X"33",X"00", + X"FF",X"33",X"66",X"CC",X"88",X"88",X"88",X"00",X"77",X"44",X"00",X"00",X"11",X"11",X"11",X"00", + X"EE",X"33",X"33",X"CC",X"33",X"33",X"EE",X"00",X"33",X"66",X"66",X"11",X"66",X"66",X"33",X"00", + X"EE",X"33",X"33",X"FF",X"33",X"22",X"CC",X"00",X"33",X"66",X"66",X"33",X"00",X"00",X"33",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"00", + X"00",X"00",X"00",X"22",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"44",X"00",X"00",X"00", + X"CC",X"AA",X"DD",X"AA",X"99",X"AA",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"77", + X"CC",X"22",X"99",X"11",X"11",X"99",X"22",X"CC",X"33",X"44",X"99",X"AA",X"AA",X"99",X"44",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"33",X"33",X"FF",X"33",X"33",X"00",X"11",X"22",X"66",X"66",X"77",X"66",X"66",X"00", + X"EE",X"33",X"33",X"EE",X"33",X"33",X"EE",X"00",X"77",X"66",X"66",X"77",X"66",X"66",X"77",X"00", + X"EE",X"33",X"00",X"00",X"00",X"33",X"EE",X"00",X"33",X"66",X"66",X"66",X"66",X"66",X"33",X"00", + X"CC",X"66",X"33",X"33",X"33",X"66",X"CC",X"00",X"77",X"66",X"66",X"66",X"66",X"66",X"77",X"00", + X"FF",X"00",X"00",X"EE",X"00",X"00",X"FF",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"00", + X"FF",X"00",X"00",X"EE",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"00", + X"EE",X"33",X"00",X"77",X"33",X"33",X"FF",X"00",X"33",X"66",X"66",X"66",X"66",X"66",X"33",X"00", + X"33",X"33",X"33",X"FF",X"33",X"33",X"33",X"00",X"66",X"66",X"66",X"77",X"66",X"66",X"66",X"00", + X"EE",X"88",X"88",X"88",X"88",X"88",X"EE",X"00",X"77",X"11",X"11",X"11",X"11",X"11",X"77",X"00", + X"FF",X"66",X"66",X"66",X"66",X"66",X"CC",X"00",X"11",X"00",X"00",X"00",X"66",X"66",X"33",X"00", + X"33",X"66",X"CC",X"88",X"CC",X"66",X"33",X"00",X"66",X"66",X"66",X"77",X"66",X"66",X"66",X"00", + X"88",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"77",X"33",X"33",X"33",X"33",X"33",X"77",X"00", + X"33",X"77",X"FF",X"BB",X"33",X"33",X"33",X"00",X"66",X"77",X"77",X"66",X"66",X"66",X"66",X"00", + X"33",X"33",X"BB",X"FF",X"77",X"33",X"33",X"00",X"66",X"77",X"77",X"66",X"66",X"66",X"66",X"00", + X"EE",X"33",X"33",X"33",X"33",X"33",X"EE",X"00",X"33",X"66",X"66",X"66",X"66",X"66",X"33",X"00", + X"EE",X"33",X"33",X"33",X"EE",X"00",X"00",X"00",X"77",X"66",X"66",X"66",X"77",X"66",X"66",X"00", + X"EE",X"33",X"33",X"33",X"FF",X"22",X"DD",X"00",X"33",X"66",X"66",X"66",X"66",X"66",X"33",X"00", + X"EE",X"33",X"33",X"EE",X"CC",X"66",X"33",X"00",X"77",X"66",X"66",X"77",X"66",X"66",X"66",X"00", + X"EE",X"33",X"00",X"EE",X"33",X"33",X"EE",X"00",X"33",X"66",X"66",X"33",X"00",X"66",X"33",X"00", + X"EE",X"88",X"88",X"88",X"88",X"88",X"88",X"00",X"77",X"11",X"11",X"11",X"11",X"11",X"11",X"00", + X"33",X"33",X"33",X"33",X"33",X"33",X"EE",X"00",X"66",X"66",X"66",X"66",X"66",X"66",X"33",X"00", + X"33",X"33",X"33",X"33",X"66",X"CC",X"88",X"00",X"66",X"66",X"66",X"66",X"33",X"11",X"00",X"00", + X"33",X"33",X"33",X"BB",X"FF",X"77",X"22",X"00",X"66",X"66",X"66",X"66",X"77",X"77",X"22",X"00", + X"33",X"66",X"CC",X"CC",X"EE",X"77",X"33",X"00",X"66",X"77",X"33",X"11",X"33",X"66",X"44",X"00", + X"66",X"66",X"66",X"CC",X"88",X"88",X"88",X"00",X"66",X"66",X"66",X"33",X"11",X"11",X"11",X"00", + X"FF",X"77",X"EE",X"CC",X"88",X"00",X"FF",X"00",X"77",X"00",X"00",X"11",X"33",X"77",X"77",X"00", + X"00",X"00",X"00",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"88",X"0E",X"0C",X"00",X"11",X"11",X"11",X"11",X"33",X"0F",X"07", + X"00",X"00",X"00",X"88",X"CC",X"0E",X"0C",X"0E",X"00",X"00",X"03",X"07",X"03",X"07",X"CF",X"EF", + X"00",X"80",X"50",X"8A",X"0A",X"0C",X"08",X"08",X"00",X"00",X"77",X"FF",X"7F",X"0F",X"0F",X"0F", + X"00",X"70",X"F0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"60",X"10",X"10",X"10",X"10", + X"00",X"88",X"FF",X"11",X"11",X"33",X"EE",X"EE",X"FF",X"11",X"FF",X"EE",X"EE",X"FF",X"FF",X"FF", + X"CC",X"00",X"33",X"FF",X"FF",X"EE",X"CC",X"00",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"88",X"FF",X"77",X"77",X"FF",X"FF",X"FF",X"00",X"11",X"00",X"00",X"00",X"00",X"33",X"77", + X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"33",X"00",X"CC",X"FF",X"FF",X"77",X"33",X"00", + X"66",X"9F",X"9F",X"66",X"00",X"00",X"00",X"00",X"66",X"9F",X"9F",X"66",X"00",X"00",X"00",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"01",X"03",X"0F",X"03",X"01",X"03",X"0F",X"03",X"08",X"0C",X"0F",X"0C",X"08",X"0C",X"0F",X"0C", + X"01",X"03",X"0F",X"03",X"01",X"03",X"0F",X"01",X"08",X"0C",X"0F",X"0C",X"08",X"0C",X"0F",X"08", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"44",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"44",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CC",X"EE",X"CC",X"CC",X"CC",X"EE",X"CC",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"09",X"09",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"04",X"04",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"09",X"09",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"02",X"04",X"08",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"09",X"09",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"04",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"09",X"09",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"0C",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"05", + X"02",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"02",X"02",X"02",X"01",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"05", + X"02",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04", + X"0A",X"02",X"02",X"09",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"07",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"05", + X"02",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04", + X"02",X"0A",X"0A",X"01",X"00",X"00",X"00",X"00",X"01",X"00",X"04",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"05", + X"02",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"04", + X"02",X"0A",X"0A",X"01",X"00",X"00",X"00",X"00",X"07",X"00",X"00",X"07",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"01",X"02",X"04",X"0F",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"02",X"01",X"09",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"08", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"0E",X"01",X"01",X"0E",X"00",X"00",X"00",X"00", + X"00",X"20",X"40",X"C0",X"B0",X"E0",X"00",X"00",X"10",X"10",X"30",X"20",X"78",X"3C",X"1E",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0E",X"0C",X"08",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"4F",X"2F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"4F",X"2F",X"9F",X"0F",X"0F",X"0E",X"08",X"00",X"03",X"13",X"07",X"47",X"2F",X"0F",X"0F",X"0E", + X"03",X"03",X"05",X"09",X"01",X"01",X"02",X"02",X"00",X"00",X"00",X"00",X"03",X"0C",X"00",X"00", + X"CE",X"EE",X"FF",X"FF",X"FF",X"FF",X"EE",X"CC",X"33",X"75",X"FB",X"FB",X"FF",X"FF",X"77",X"33", + X"00",X"00",X"00",X"CC",X"EE",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"33",X"74",X"FD",X"FD",X"FF", + X"FF",X"EE",X"CC",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"33",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"0C",X"4E",X"0F",X"8F", + X"8C",X"0C",X"80",X"00",X"00",X"00",X"00",X"00",X"2F",X"FC",X"FC",X"CC",X"CC",X"CC",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"13",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"2F",X"3C",X"70",X"00",X"11",X"FF",X"FF",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"80", + X"00",X"08",X"0C",X"8C",X"8C",X"0C",X"08",X"00",X"E0",X"D2",X"C3",X"87",X"0F",X"1F",X"0F",X"0E", + X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"D2",X"1E",X"0F",X"0F",X"0F",X"0F",X"07",X"00",X"01",X"03",X"03",X"03",X"03",X"01",X"00", + X"0E",X"0F",X"0B",X"0F",X"0E",X"06",X"0C",X"0C",X"00",X"03",X"07",X"0A",X"0F",X"05",X"0F",X"0A", + X"08",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"0F",X"0D",X"0E",X"78",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"01",X"83",X"C3",X"83",X"C2",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"10", + X"83",X"82",X"83",X"83",X"B0",X"70",X"F0",X"E0",X"30",X"30",X"30",X"70",X"70",X"70",X"70",X"F0", + X"A0",X"B0",X"80",X"F0",X"00",X"F0",X"88",X"88",X"20",X"20",X"20",X"A8",X"6C",X"7C",X"FF",X"4F", + X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"4F",X"FF",X"4F",X"4F",X"FF",X"4E",X"4C",X"00", + X"00",X"00",X"00",X"77",X"2F",X"2F",X"FF",X"2F",X"00",X"00",X"00",X"00",X"11",X"13",X"33",X"17", + X"2F",X"FF",X"2F",X"2F",X"FF",X"2F",X"2F",X"FF",X"17",X"FF",X"9F",X"9F",X"FF",X"17",X"13",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"1E",X"1A",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0A", + X"1E",X"3C",X"3C",X"68",X"E0",X"C0",X"C0",X"00",X"0F",X"0A",X"0F",X"0B",X"1E",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"87",X"86", + X"0F",X"0A",X"0F",X"0E",X"87",X"F0",X"F0",X"F0",X"87",X"C3",X"C3",X"61",X"70",X"30",X"30",X"00", + X"10",X"20",X"C0",X"C0",X"C0",X"C0",X"C0",X"40",X"00",X"00",X"00",X"F0",X"76",X"FC",X"F9",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"EE",X"EE",X"CC",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"11",X"77",X"BF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33", + X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"67",X"DF",X"FF",X"FF",X"FF",X"FF",X"77",X"33", + X"00",X"00",X"00",X"00",X"08",X"0C",X"8E",X"4E",X"FF",X"88",X"0C",X"0F",X"AF",X"3F",X"2F",X"6F", + X"8E",X"0E",X"4E",X"8C",X"0C",X"08",X"00",X"00",X"AF",X"3F",X"6F",X"AF",X"3F",X"2F",X"6F",X"0E", + X"33",X"00",X"13",X"0F",X"4F",X"9F",X"9F",X"BF",X"00",X"00",X"00",X"00",X"01",X"03",X"27",X"17", + X"9F",X"DF",X"BF",X"9F",X"DF",X"3F",X"1F",X"03",X"27",X"17",X"07",X"03",X"03",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"88",X"CC", + X"00",X"88",X"CC",X"CC",X"CC",X"4C",X"08",X"00",X"FF",X"FF",X"FF",X"FF",X"0F",X"0A",X"0F",X"0A", + X"00",X"00",X"00",X"00",X"22",X"11",X"00",X"33",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"0E",X"0B",X"0E",X"05",X"00",X"11",X"33",X"33",X"33",X"23",X"01",X"00", + X"20",X"20",X"24",X"0E",X"0E",X"0B",X"07",X"07",X"00",X"00",X"00",X"00",X"03",X"0E",X"0D",X"03", + X"0D",X"0D",X"0B",X"0A",X"06",X"0C",X"08",X"00",X"0E",X"0E",X"01",X"07",X"0F",X"0E",X"01",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0F", + X"08",X"0F",X"00",X"00",X"01",X"0F",X"0E",X"0F",X"07",X"01",X"00",X"00",X"00",X"07",X"03",X"01", + X"00",X"C0",X"80",X"0E",X"0F",X"2F",X"0F",X"8F",X"60",X"F0",X"B4",X"87",X"87",X"1F",X"0F",X"8F", + X"0F",X"0E",X"8E",X"0C",X"0C",X"08",X"00",X"00",X"0F",X"2F",X"0F",X"8F",X"2F",X"0F",X"0F",X"0C", + X"30",X"F0",X"D2",X"3C",X"3C",X"9E",X"0F",X"0F",X"00",X"00",X"30",X"01",X"03",X"07",X"07",X"17", + X"2F",X"0F",X"4F",X"0F",X"0F",X"07",X"01",X"00",X"07",X"03",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"CC",X"EE",X"FF",X"FF",X"00",X"00",X"6E",X"BF",X"DF",X"CF",X"AF",X"6F", + X"7F",X"7F",X"7F",X"FF",X"EE",X"CC",X"88",X"00",X"FF",X"0F",X"FF",X"6F",X"AF",X"DF",X"BF",X"6E", + X"00",X"00",X"07",X"5F",X"DF",X"DF",X"DF",X"5F",X"00",X"00",X"00",X"00",X"01",X"13",X"27",X"37", + X"8F",X"0F",X"8F",X"5F",X"DF",X"DF",X"DF",X"0F",X"7F",X"0F",X"7F",X"37",X"27",X"13",X"01",X"00", + X"0C",X"0F",X"0C",X"0F",X"0F",X"0F",X"09",X"09",X"00",X"00",X"09",X"09",X"0B",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"EE",X"EE",X"FF",X"FF",X"EE",X"CC",X"88", + X"04",X"0F",X"0F",X"0F",X"03",X"88",X"EE",X"FF",X"00",X"03",X"03",X"00",X"00",X"11",X"33",X"77", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"77",X"FF", + X"80",X"80",X"00",X"08",X"0C",X"0E",X"0F",X"0F",X"10",X"B0",X"B0",X"E1",X"86",X"01",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0E",X"0E",X"0C",X"08",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"07",X"0D",X"0E",X"CF",X"8F",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"17", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"17",X"17",X"03",X"03",X"01",X"01",X"00",X"00", + X"E0",X"C0",X"E0",X"70",X"F0",X"F0",X"10",X"00",X"70",X"90",X"E0",X"F0",X"F0",X"E8",X"CC",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22",X"EE",X"44",X"44",X"CC",X"CC",X"88",X"00", + X"00",X"00",X"00",X"77",X"BF",X"FF",X"FF",X"DD",X"00",X"00",X"00",X"00",X"00",X"11",X"23",X"33", + X"DD",X"BB",X"FF",X"44",X"77",X"EE",X"EE",X"88",X"11",X"77",X"BF",X"FF",X"66",X"11",X"11",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"00",X"00",X"CC",X"CC",X"44",X"66",X"EE",X"FF", + X"66",X"AA",X"AA",X"FF",X"FF",X"33",X"FF",X"EE",X"FF",X"FF",X"BB",X"DD",X"EE",X"77",X"DD",X"FF", + X"88",X"FF",X"FF",X"EE",X"FF",X"FF",X"77",X"DD",X"33",X"33",X"66",X"CC",X"DD",X"DD",X"CC",X"77", + X"EE",X"66",X"55",X"55",X"44",X"66",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"C0",X"E0",X"E0",X"F0",X"F0",X"80",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"F0",X"F0",X"F0",X"E0",X"C0",X"0C",X"07",X"00",X"F0",X"F0",X"F0",X"F8",X"FC",X"0F",X"0E",X"0C", + X"00",X"00",X"10",X"70",X"F0",X"F0",X"F0",X"F1",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30", + X"F2",X"F2",X"F3",X"F1",X"F1",X"0F",X"00",X"03",X"30",X"30",X"30",X"10",X"00",X"01",X"00",X"00", + X"01",X"02",X"0C",X"0C",X"0C",X"84",X"84",X"80",X"00",X"00",X"01",X"0F",X"01",X"07",X"30",X"70", + X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"73",X"F3",X"F0",X"F8",X"E8",X"C0",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"71",X"F1",X"FC",X"FC",X"E0",X"00",X"00",X"00",X"00",X"10",X"F0",X"30",X"10", + X"00",X"88",X"CC",X"EE",X"EE",X"2E",X"0F",X"8D",X"22",X"77",X"FF",X"FF",X"FF",X"AF",X"0F",X"0F", + X"8D",X"0D",X"8D",X"0D",X"0F",X"0C",X"0C",X"08",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"22",X"33",X"77",X"FF",X"FF",X"DF",X"DF",X"CF",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00", + X"8F",X"8F",X"8F",X"07",X"07",X"07",X"07",X"03",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"70",X"02",X"0C",X"0E",X"C3",X"E5",X"C3",X"0E",X"0F", + X"78",X"68",X"68",X"68",X"C0",X"00",X"00",X"00",X"EF",X"CF",X"0F",X"EF",X"EF",X"0E",X"01",X"01", + X"08",X"07",X"1E",X"78",X"F4",X"78",X"1F",X"0F",X"00",X"00",X"00",X"01",X"01",X"01",X"08",X"09", + X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"00",X"00",X"07",X"13",X"13",X"13",X"01",X"00",X"01",X"01", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"88",X"FF",X"11",X"11",X"33",X"EE",X"EE",X"00",X"11",X"00",X"00",X"00",X"00",X"33",X"77", + X"FF",X"88",X"FF",X"77",X"70",X"FF",X"FF",X"F8",X"FF",X"11",X"FF",X"EE",X"E0",X"FF",X"FF",X"F1", + X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"CC",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"33",X"00", + X"F3",X"F3",X"FF",X"FE",X"FE",X"FF",X"FE",X"FF",X"FC",X"FC",X"F9",X"F7",X"F7",X"FF",X"F7",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"04",X"04",X"04",X"04",X"00",X"00",X"00",X"00",X"09",X"09",X"09",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00", + X"02",X"04",X"08",X"0E",X"00",X"00",X"00",X"00",X"09",X"09",X"09",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"04",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"09",X"09",X"09",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"01",X"00",X"00",X"00",X"00", + X"0C",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"09",X"09",X"09",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"05", + X"02",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"02",X"02",X"02",X"01",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"05", + X"02",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"07",X"00",X"00",X"00",X"00", + X"0A",X"02",X"02",X"09",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0A",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"05", + X"02",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"01",X"00",X"04",X"03",X"00",X"00",X"00",X"00", + X"02",X"0A",X"0A",X"01",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"05", + X"02",X"02",X"02",X"0C",X"00",X"00",X"00",X"00",X"07",X"00",X"00",X"07",X"00",X"00",X"00",X"00", + X"02",X"0A",X"0A",X"01",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"01",X"02",X"04",X"0F",X"00",X"00",X"00",X"00", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"02",X"01",X"09",X"06",X"00",X"00",X"00",X"00", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"02",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"05", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"0E",X"01",X"01",X"0E",X"00",X"00",X"00",X"00", + X"05",X"05",X"05",X"02",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"02",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"23",X"00",X"00", + X"00",X"03",X"07",X"78",X"F4",X"F0",X"0F",X"07",X"02",X"0C",X"0E",X"0F",X"0F",X"0F",X"0E",X"0C", + X"01",X"07",X"0F",X"0E",X"0C",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"33",X"11",X"00",X"01", + X"EF",X"EF",X"CF",X"AF",X"EF",X"CF",X"08",X"00",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"08",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"23",X"00",X"00", + X"00",X"03",X"07",X"78",X"F4",X"F0",X"0F",X"07",X"02",X"0C",X"0E",X"0F",X"0F",X"0F",X"0E",X"0C", + X"00",X"00",X"00",X"00",X"0C",X"0F",X"0F",X"06",X"00",X"11",X"33",X"33",X"33",X"11",X"00",X"00", + X"EF",X"EF",X"EF",X"EF",X"EF",X"CF",X"05",X"05",X"0E",X"0E",X"0E",X"0F",X"0F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"4C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"04",X"03",X"07",X"0F",X"0F",X"0F",X"07",X"03",X"00",X"0C",X"0E",X"E1",X"F2",X"F0",X"0F",X"0E", + X"00",X"88",X"CC",X"CC",X"CC",X"88",X"00",X"08",X"08",X"0E",X"0F",X"07",X"03",X"00",X"00",X"00", + X"07",X"07",X"07",X"0F",X"0F",X"0F",X"01",X"02",X"7F",X"7F",X"3F",X"5F",X"7F",X"3F",X"01",X"00", + X"00",X"00",X"00",X"00",X"08",X"4C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"04",X"03",X"07",X"0F",X"0F",X"0F",X"07",X"03",X"00",X"0C",X"0E",X"E1",X"F2",X"F0",X"0F",X"0E", + X"00",X"88",X"CC",X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"0F",X"06", + X"07",X"07",X"07",X"0F",X"0F",X"07",X"00",X"00",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"0A",X"0A", + X"00",X"00",X"00",X"00",X"06",X"06",X"04",X"0C",X"00",X"00",X"00",X"01",X"01",X"04",X"0E",X"06", + X"08",X"07",X"0F",X"0F",X"0F",X"1F",X"27",X"2F",X"02",X"0C",X"0E",X"0F",X"0F",X"0E",X"8C",X"8E", + X"0C",X"08",X"00",X"00",X"06",X"0C",X"08",X"00",X"03",X"01",X"01",X"01",X"00",X"00",X"01",X"03", + X"4F",X"8F",X"8F",X"8F",X"5F",X"0F",X"08",X"00",X"4F",X"4F",X"8F",X"8F",X"0E",X"0F",X"03",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"0E",X"0C",X"00",X"00",X"00",X"01",X"05",X"0C",X"0C",X"06", + X"08",X"07",X"0F",X"0F",X"0F",X"1F",X"27",X"2F",X"02",X"0C",X"0E",X"0F",X"0F",X"0E",X"8C",X"4F", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"07",X"03",X"01",X"01",X"0C",X"07",X"07",X"00", + X"2F",X"2F",X"4F",X"4F",X"2F",X"0F",X"00",X"00",X"4F",X"2F",X"2F",X"4E",X"8E",X"0F",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"60",X"00",X"00",X"00",X"01",X"01",X"01",X"08",X"09", + X"08",X"07",X"1E",X"78",X"F4",X"78",X"1F",X"0F",X"02",X"0C",X"0E",X"C3",X"E5",X"C3",X"0E",X"0F", + X"68",X"68",X"68",X"68",X"C0",X"00",X"00",X"00",X"07",X"13",X"13",X"13",X"01",X"00",X"01",X"01", + X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"00",X"00",X"EF",X"CF",X"0F",X"EF",X"EF",X"0E",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"04",X"06",X"06",X"00",X"00",X"00",X"01",X"01",X"04",X"0C",X"0D", + X"08",X"07",X"0F",X"0F",X"0F",X"1F",X"27",X"2F",X"02",X"0C",X"0E",X"0F",X"0F",X"0E",X"8C",X"8F", + X"0C",X"08",X"08",X"08",X"00",X"00",X"00",X"08",X"07",X"03",X"03",X"03",X"01",X"00",X"01",X"03", + X"4F",X"8F",X"8F",X"8F",X"5F",X"0F",X"08",X"00",X"4F",X"4F",X"8F",X"8F",X"0F",X"0E",X"03",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"23",X"00",X"02", + X"00",X"03",X"07",X"78",X"F4",X"F0",X"0F",X"07",X"02",X"0C",X"0E",X"0F",X"0F",X"0F",X"0E",X"0C", + X"01",X"07",X"0F",X"0E",X"0C",X"00",X"00",X"00",X"01",X"11",X"33",X"33",X"33",X"11",X"00",X"00", + X"EF",X"6F",X"8F",X"EF",X"EF",X"CF",X"04",X"03",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"04",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"23",X"00",X"00", + X"00",X"03",X"07",X"78",X"F4",X"F0",X"0F",X"07",X"02",X"0C",X"0E",X"0F",X"0F",X"0F",X"0E",X"0C", + X"00",X"00",X"00",X"00",X"0C",X"0E",X"0F",X"06",X"00",X"11",X"33",X"07",X"33",X"11",X"00",X"03", + X"EF",X"8F",X"6F",X"EF",X"EF",X"CF",X"04",X"09",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"04",X"08", + X"00",X"08",X"0C",X"0F",X"86",X"0E",X"0E",X"0C",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"77", + X"00",X"11",X"09",X"05",X"8F",X"BF",X"DF",X"EF",X"00",X"0F",X"E5",X"F0",X"78",X"0F",X"0F",X"0F", + X"00",X"00",X"06",X"0E",X"0C",X"0C",X"08",X"00",X"77",X"33",X"03",X"02",X"02",X"00",X"00",X"00", + X"CF",X"8F",X"0F",X"07",X"0F",X"09",X"08",X"00",X"0E",X"0E",X"0C",X"0D",X"0F",X"0F",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"23",X"00",X"00", + X"00",X"03",X"07",X"78",X"F4",X"F0",X"0F",X"07",X"02",X"0C",X"0E",X"0F",X"0F",X"0F",X"0E",X"0C", + X"00",X"00",X"00",X"00",X"0C",X"0F",X"0F",X"06",X"00",X"11",X"33",X"33",X"33",X"11",X"00",X"00", + X"EF",X"EF",X"EF",X"EF",X"EF",X"CF",X"05",X"05",X"0E",X"0E",X"0E",X"0F",X"0F",X"0E",X"00",X"00", + X"00",X"00",X"0C",X"0E",X"0E",X"0E",X"0E",X"0C",X"01",X"01",X"03",X"07",X"16",X"34",X"36",X"34", + X"00",X"0E",X"0F",X"87",X"87",X"87",X"87",X"0F",X"00",X"03",X"03",X"01",X"01",X"0C",X"0E",X"0F", + X"0C",X"08",X"08",X"0E",X"00",X"08",X"00",X"00",X"47",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"6F",X"EF",X"DF",X"BF",X"FF",X"77",X"33",X"00",X"0F",X"0F",X"8F",X"CE",X"CE",X"CF",X"88",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"23",X"00",X"02", + X"00",X"03",X"07",X"78",X"F4",X"F0",X"0F",X"07",X"02",X"0C",X"0E",X"0F",X"0F",X"0F",X"0E",X"0C", + X"01",X"07",X"0F",X"0E",X"0C",X"00",X"00",X"00",X"01",X"11",X"33",X"33",X"33",X"11",X"00",X"00", + X"EF",X"6F",X"8F",X"EF",X"EF",X"CF",X"04",X"03",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"04",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"23",X"00",X"00", + X"00",X"03",X"07",X"78",X"F4",X"F0",X"0F",X"07",X"02",X"0C",X"0E",X"0F",X"0F",X"0F",X"0E",X"0C", + X"00",X"00",X"00",X"00",X"0C",X"0E",X"0F",X"06",X"00",X"11",X"33",X"07",X"33",X"11",X"00",X"03", + X"EF",X"8F",X"6F",X"EF",X"EF",X"CF",X"04",X"09",X"0E",X"0E",X"0E",X"0F",X"0F",X"0F",X"04",X"08", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"33",X"67",X"57",X"33",X"00",X"00",X"00",X"00",X"EE",X"BF",X"5F",X"EE",X"00", + X"00",X"00",X"88",X"4C",X"4C",X"88",X"00",X"00",X"00",X"00",X"11",X"11",X"04",X"00",X"00",X"00", + X"77",X"AF",X"2F",X"5F",X"8F",X"DF",X"33",X"00",X"EE",X"5F",X"2F",X"2F",X"EF",X"1F",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"33",X"67",X"57",X"33",X"00",X"00",X"00",X"00",X"EE",X"BF",X"5F",X"EE",X"00",X"00",X"00", + X"00",X"00",X"88",X"4C",X"4C",X"88",X"00",X"00",X"00",X"00",X"11",X"11",X"04",X"00",X"00",X"00", + X"77",X"AF",X"2F",X"5F",X"8F",X"DF",X"33",X"00",X"EE",X"5F",X"2F",X"2F",X"EF",X"1F",X"CC",X"00", + X"00",X"00",X"00",X"02",X"0C",X"03",X"84",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"76", + X"00",X"00",X"02",X"05",X"0A",X"0F",X"CF",X"EF",X"00",X"00",X"08",X"04",X"08",X"03",X"0F",X"4B", + X"0C",X"87",X"0C",X"0F",X"84",X"8A",X"89",X"00",X"FF",X"77",X"11",X"00",X"00",X"00",X"11",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"88",X"00",X"2D",X"8F",X"ED",X"CF",X"FF",X"33",X"11",X"00", + X"00",X"00",X"02",X"04",X"08",X"03",X"0C",X"84",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"76", + X"00",X"00",X"05",X"05",X"0A",X"0F",X"FF",X"FF",X"00",X"00",X"00",X"04",X"08",X"03",X"0F",X"CB", + X"0F",X"84",X"0F",X"0C",X"0A",X"89",X"CC",X"00",X"FF",X"77",X"11",X"00",X"11",X"11",X"33",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"88",X"00",X"00",X"ED",X"CF",X"ED",X"FF",X"FF",X"33",X"00",X"00", + X"CC",X"CC",X"0E",X"00",X"00",X"06",X"0E",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"02",X"02",X"05", + X"02",X"02",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"01",X"03", + X"00",X"01",X"07",X"0F",X"3C",X"E0",X"00",X"00",X"06",X"0C",X"08",X"87",X"01",X"02",X"04",X"06", + X"0E",X"08",X"66",X"6E",X"0F",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"03",X"01",X"00",X"00",X"00",X"03",X"03",X"0E",X"0A",X"02",X"0A",X"07",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"01",X"07",X"0F",X"02",X"06", + X"00",X"01",X"07",X"0F",X"3C",X"E0",X"00",X"00",X"04",X"08",X"08",X"87",X"01",X"01",X"01",X"01", + X"00",X"00",X"00",X"02",X"07",X"0E",X"0E",X"08",X"00",X"00",X"00",X"00",X"0C",X"0E",X"06",X"01", + X"00",X"00",X"00",X"00",X"60",X"02",X"02",X"07",X"00",X"00",X"00",X"00",X"60",X"04",X"04",X"0E", + X"00",X"0C",X"00",X"0C",X"00",X"08",X"04",X"08",X"00",X"07",X"08",X"03",X"04",X"09",X"02",X"04", + X"2F",X"1F",X"1F",X"1F",X"2F",X"03",X"00",X"00",X"4F",X"8F",X"8F",X"8F",X"4F",X"0C",X"00",X"00", + X"00",X"02",X"06",X"0C",X"09",X"0B",X"0E",X"08",X"00",X"00",X"08",X"04",X"02",X"0E",X"06",X"01", + X"00",X"00",X"00",X"00",X"60",X"02",X"02",X"07",X"00",X"00",X"00",X"00",X"60",X"04",X"04",X"0E", + X"00",X"0E",X"01",X"0C",X"02",X"09",X"04",X"02",X"00",X"03",X"00",X"03",X"00",X"01",X"02",X"01", + X"2F",X"1F",X"1F",X"1F",X"2F",X"03",X"00",X"00",X"4F",X"8F",X"8F",X"8F",X"4F",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"0C",X"03",X"11", + X"00",X"FF",X"FF",X"FF",X"F9",X"FD",X"FF",X"FF",X"00",X"CC",X"EE",X"FF",X"FF",X"FF",X"FF",X"EE", + X"00",X"00",X"00",X"88",X"BB",X"CC",X"CC",X"00",X"33",X"11",X"00",X"00",X"11",X"11",X"00",X"00", + X"FF",X"FF",X"66",X"FF",X"FF",X"FF",X"CC",X"00",X"CC",X"00",X"00",X"99",X"FF",X"FF",X"CC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"11",X"00",X"03",X"1D", + X"00",X"FF",X"FF",X"FF",X"F9",X"FD",X"FF",X"FF",X"00",X"CC",X"EE",X"FF",X"FF",X"FF",X"FF",X"EE", + X"00",X"00",X"00",X"22",X"AA",X"CC",X"00",X"00",X"33",X"11",X"00",X"00",X"11",X"11",X"11",X"00", + X"FF",X"FF",X"66",X"EE",X"FF",X"FF",X"33",X"00",X"CC",X"00",X"00",X"66",X"FF",X"FF",X"33",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"70",X"71",X"31",X"10",X"00", + X"00",X"80",X"D0",X"D0",X"FD",X"F5",X"D2",X"0F",X"00",X"C0",X"E0",X"F0",X"FC",X"E4",X"C1",X"0E", + X"00",X"00",X"20",X"42",X"42",X"48",X"08",X"00",X"03",X"00",X"01",X"02",X"00",X"00",X"00",X"00", + X"7F",X"3F",X"F0",X"07",X"70",X"07",X"30",X"00",X"8F",X"0C",X"E0",X"0C",X"C2",X"1E",X"90",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"10",X"30",X"70",X"71",X"31",X"14",X"03", + X"00",X"80",X"D0",X"D0",X"FD",X"F5",X"D2",X"0F",X"00",X"C0",X"E0",X"F0",X"FC",X"E4",X"C0",X"0F", + X"00",X"08",X"00",X"00",X"48",X"4A",X"08",X"00",X"00",X"07",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"3F",X"07",X"70",X"07",X"70",X"03",X"00",X"8E",X"0D",X"0E",X"C0",X"0E",X"D2",X"18",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..17522bd2 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,32 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"03", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"05",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"07", + X"00",X"00",X"00",X"00",X"00",X"0B",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"0E",X"00",X"01",X"0C",X"0F", + X"00",X"0E",X"00",X"0B",X"00",X"0C",X"0B",X"0E",X"00",X"0C",X"0F",X"01",X"00",X"00",X"00",X"00", + X"00",X"01",X"02",X"0F",X"00",X"07",X"0C",X"02",X"00",X"09",X"06",X"0F",X"00",X"0D",X"0C",X"0F", + X"00",X"05",X"03",X"09",X"00",X"0F",X"0B",X"00",X"00",X"0E",X"00",X"0B",X"00",X"0E",X"00",X"0B", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0E",X"01",X"00",X"0F",X"0B",X"0E",X"00",X"0E",X"00",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin + data <= rom_data(to_integer(unsigned(addr))); +end architecture; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..88b2ecb3 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"66",X"EF",X"00",X"F8",X"EA",X"6F",X"00",X"3F",X"00",X"C9",X"38",X"AA",X"AF",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..e6cf72e3 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"C3",X"C8",X"B1",X"C3",X"67",X"32",X"FE",X"00",X"C3",X"24",X"31",X"00",X"C3",X"C7",X"17",X"00", + X"C3",X"1B",X"16",X"00",X"C3",X"2D",X"1A",X"00",X"C3",X"DF",X"19",X"00",X"C3",X"82",X"0F",X"00", + X"C3",X"A6",X"0E",X"00",X"C3",X"A3",X"32",X"00",X"C3",X"91",X"34",X"00",X"C3",X"8C",X"19",X"00", + X"C3",X"97",X"31",X"00",X"C3",X"C2",X"19",X"00",X"C3",X"45",X"0B",X"1A",X"BE",X"D8",X"C0",X"13", + X"23",X"1A",X"BE",X"D8",X"C0",X"13",X"23",X"1A",X"BE",X"C9",X"21",X"00",X"40",X"11",X"00",X"04", + X"06",X"0F",X"18",X"33",X"21",X"00",X"44",X"11",X"00",X"04",X"18",X"29",X"21",X"F0",X"4F",X"11", + X"40",X"50",X"06",X"40",X"3E",X"00",X"77",X"12",X"23",X"13",X"10",X"FA",X"C9",X"21",X"00",X"4C", + X"11",X"20",X"00",X"18",X"10",X"21",X"80",X"40",X"11",X"00",X"03",X"06",X"0F",X"18",X"08",X"21", + X"00",X"4C",X"11",X"D0",X"03",X"06",X"00",X"70",X"23",X"1B",X"7A",X"B3",X"20",X"F9",X"C9",X"DD", + X"21",X"21",X"4C",X"11",X"26",X"4C",X"DD",X"7E",X"00",X"A7",X"28",X"08",X"DD",X"35",X"00",X"20", + X"03",X"3E",X"01",X"12",X"DD",X"23",X"13",X"DD",X"7E",X"00",X"A7",X"28",X"11",X"DD",X"35",X"01", + X"20",X"0C",X"DD",X"36",X"01",X"3C",X"DD",X"35",X"00",X"20",X"03",X"3E",X"01",X"12",X"2A",X"24", + X"4C",X"13",X"7C",X"B5",X"C8",X"01",X"FF",X"FF",X"3F",X"ED",X"5A",X"20",X"06",X"3E",X"01",X"12", + X"21",X"00",X"00",X"22",X"24",X"4C",X"C9",X"DD",X"21",X"00",X"04",X"EB",X"DD",X"19",X"EB",X"23", + X"DD",X"23",X"77",X"DD",X"70",X"00",X"C6",X"02",X"2B",X"DD",X"2B",X"77",X"DD",X"70",X"00",X"3D", + X"11",X"21",X"00",X"19",X"DD",X"19",X"77",X"DD",X"70",X"00",X"C6",X"02",X"2B",X"DD",X"2B",X"77", + X"DD",X"70",X"00",X"C9",X"21",X"31",X"01",X"87",X"16",X"00",X"5F",X"19",X"5E",X"23",X"56",X"EB", + X"5E",X"23",X"56",X"23",X"4E",X"23",X"DD",X"21",X"00",X"04",X"DD",X"19",X"7E",X"FE",X"00",X"C8", + X"D6",X"30",X"FE",X"0A",X"38",X"01",X"3D",X"12",X"DD",X"71",X"00",X"13",X"23",X"DD",X"23",X"18", + X"EB",X"6B",X"01",X"88",X"01",X"A6",X"01",X"BA",X"01",X"CE",X"01",X"E6",X"01",X"FE",X"01",X"0B", + X"02",X"13",X"02",X"1B",X"02",X"28",X"02",X"32",X"02",X"3F",X"02",X"4E",X"02",X"5D",X"02",X"72", + X"02",X"82",X"02",X"9A",X"02",X"AD",X"02",X"C2",X"02",X"DA",X"02",X"F1",X"02",X"07",X"03",X"1E", + X"03",X"29",X"03",X"3D",X"03",X"52",X"03",X"6D",X"03",X"82",X"03",X"A2",X"41",X"03",X"50",X"55", + X"53",X"48",X"40",X"4F",X"4E",X"4C",X"59",X"40",X"31",X"40",X"50",X"4C",X"41",X"59",X"45",X"52", + X"40",X"42",X"55",X"54",X"54",X"4F",X"4E",X"00",X"A2",X"41",X"03",X"50",X"55",X"53",X"48",X"40", + X"31",X"40",X"4F",X"52",X"40",X"32",X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"40",X"42", + X"55",X"54",X"54",X"4F",X"4E",X"00",X"A8",X"41",X"0F",X"50",X"4C",X"41",X"59",X"45",X"52",X"40", + X"4F",X"4E",X"45",X"40",X"53",X"54",X"41",X"52",X"54",X"00",X"A8",X"41",X"0F",X"50",X"4C",X"41", + X"59",X"45",X"52",X"40",X"54",X"57",X"4F",X"40",X"53",X"54",X"41",X"52",X"54",X"00",X"A6",X"41", + X"01",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"45",X"40",X"47",X"41",X"4D",X"45", + X"40",X"4F",X"56",X"45",X"52",X"00",X"A6",X"41",X"01",X"50",X"4C",X"41",X"59",X"45",X"52",X"40", + X"54",X"57",X"4F",X"40",X"47",X"41",X"4D",X"45",X"40",X"4F",X"56",X"45",X"52",X"00",X"AA",X"41", + X"01",X"47",X"41",X"4D",X"45",X"40",X"4F",X"56",X"45",X"52",X"00",X"41",X"40",X"0F",X"31",X"40", + X"55",X"50",X"00",X"5A",X"40",X"0F",X"32",X"40",X"55",X"50",X"00",X"4B",X"40",X"0F",X"54",X"4F", + X"50",X"40",X"53",X"43",X"4F",X"52",X"45",X"00",X"B8",X"43",X"01",X"43",X"52",X"45",X"44",X"49", + X"54",X"00",X"B7",X"43",X"05",X"46",X"52",X"45",X"45",X"40",X"50",X"4C",X"41",X"59",X"00",X"1A", + X"41",X"01",X"49",X"4E",X"53",X"45",X"52",X"54",X"40",X"43",X"4F",X"49",X"4E",X"00",X"AA",X"41", + X"07",X"49",X"4E",X"53",X"45",X"52",X"54",X"40",X"43",X"4F",X"49",X"4E",X"00",X"89",X"41",X"05", + X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"00",X"E9",X"41",X"07",X"4E",X"45",X"58",X"54",X"40",X"50",X"41",X"54",X"54",X"45",X"52", + X"4E",X"00",X"E6",X"40",X"01",X"3D",X"3D",X"4C",X"45",X"54",X"53",X"40",X"53",X"49",X"4E",X"47", + X"40",X"41",X"40",X"53",X"4F",X"4E",X"47",X"3D",X"3D",X"00",X"48",X"41",X"07",X"52",X"55",X"4E", + X"40",X"52",X"55",X"4E",X"40",X"50",X"4F",X"4E",X"50",X"4F",X"4B",X"4F",X"00",X"87",X"41",X"07", + X"54",X"4F",X"40",X"45",X"41",X"54",X"40",X"54",X"48",X"45",X"40",X"46",X"52",X"55",X"49",X"54", + X"53",X"00",X"47",X"43",X"0F",X"53",X"49",X"47",X"4D",X"41",X"40",X"45",X"4E",X"54",X"3B",X"49", + X"4E",X"43",X"3B",X"3E",X"40",X"31",X"39",X"38",X"32",X"00",X"A6",X"41",X"0F",X"50",X"40",X"40", + X"4F",X"40",X"40",X"4E",X"40",X"40",X"50",X"40",X"40",X"4F",X"40",X"40",X"4B",X"40",X"40",X"4F", + X"00",X"87",X"41",X"07",X"31",X"40",X"50",X"4C",X"41",X"59",X"40",X"4F",X"4E",X"4C",X"59",X"40", + X"31",X"30",X"30",X"59",X"45",X"4E",X"00",X"C7",X"41",X"01",X"32",X"40",X"50",X"4C",X"41",X"59", + X"53",X"40",X"4A",X"55",X"53",X"54",X"40",X"32",X"30",X"30",X"59",X"45",X"4E",X"00",X"CD",X"40", + X"0F",X"52",X"41",X"4E",X"4B",X"49",X"4E",X"47",X"00",X"09",X"41",X"0F",X"52",X"41",X"4E",X"4B", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"53",X"43",X"4F",X"52",X"45",X"00",X"C7",X"41",X"07", + X"4A",X"55",X"4D",X"50",X"40",X"42",X"4F",X"55",X"4E",X"44",X"40",X"41",X"52",X"4F",X"55",X"4E", + X"44",X"00",X"05",X"42",X"07",X"57",X"49",X"54",X"48",X"40",X"59",X"4F",X"55",X"52",X"40",X"42", + X"49",X"47",X"40",X"42",X"45",X"4C",X"4C",X"59",X"40",X"4F",X"55",X"54",X"00",X"E8",X"42",X"0F", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"00",X"27",X"43",X"0F",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"00",X"1A",X"47",X"0E",X"0F",X"07",X"07",X"07", + X"07",X"A1",X"20",X"2F",X"36",X"0F",X"23",X"78",X"A1",X"20",X"2C",X"36",X"0F",X"23",X"13",X"1A", + X"47",X"07",X"07",X"07",X"07",X"A1",X"20",X"29",X"36",X"0F",X"23",X"78",X"A1",X"20",X"26",X"36", + X"0F",X"23",X"13",X"1A",X"47",X"07",X"07",X"07",X"07",X"A1",X"20",X"23",X"36",X"0F",X"23",X"78", + X"A1",X"77",X"C9",X"77",X"23",X"78",X"A1",X"77",X"23",X"13",X"1A",X"47",X"07",X"07",X"07",X"07", + X"A1",X"77",X"23",X"78",X"A1",X"77",X"23",X"13",X"1A",X"47",X"07",X"07",X"07",X"07",X"A1",X"77", + X"18",X"DC",X"AF",X"06",X"06",X"21",X"3A",X"4C",X"77",X"23",X"10",X"FC",X"C9",X"3A",X"2D",X"4C", + X"32",X"2E",X"4C",X"3A",X"2B",X"4C",X"32",X"2D",X"4C",X"2A",X"29",X"4C",X"22",X"2B",X"4C",X"21", + X"2B",X"4C",X"3A",X"29",X"4C",X"A6",X"32",X"2F",X"4C",X"23",X"3A",X"2A",X"4C",X"A6",X"32",X"30", + X"4C",X"3A",X"00",X"50",X"32",X"29",X"4C",X"3A",X"40",X"50",X"32",X"2A",X"4C",X"C9",X"3A",X"C0", + X"50",X"47",X"E6",X"40",X"07",X"32",X"53",X"4E",X"78",X"06",X"00",X"E6",X"0F",X"26",X"00",X"6F", + X"29",X"29",X"11",X"71",X"04",X"19",X"0E",X"02",X"11",X"6F",X"4E",X"7E",X"B7",X"28",X"18",X"3E", + X"01",X"12",X"11",X"72",X"4E",X"ED",X"B0",X"11",X"76",X"4E",X"0E",X"02",X"ED",X"B0",X"3E",X"01", + X"32",X"7A",X"4E",X"32",X"7B",X"4E",X"C9",X"3E",X"FF",X"32",X"6E",X"4E",X"3E",X"0B",X"C3",X"04", + X"01",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"02",X"01",X"02",X"01",X"01",X"02",X"01", + X"02",X"03",X"01",X"03",X"01",X"01",X"01",X"02",X"03",X"01",X"01",X"04",X"05",X"02",X"01",X"01", + X"03",X"01",X"01",X"01",X"05",X"01",X"01",X"01",X"06",X"01",X"01",X"01",X"03",X"02",X"01",X"01", + X"05",X"02",X"01",X"01",X"06",X"02",X"01",X"01",X"01",X"03",X"01",X"01",X"02",X"03",X"01",X"01", + X"04",X"3A",X"80",X"50",X"47",X"E6",X"03",X"32",X"31",X"4C",X"78",X"E6",X"0C",X"0F",X"0F",X"32", + X"32",X"4C",X"78",X"E6",X"30",X"0F",X"0F",X"0F",X"0F",X"32",X"33",X"4C",X"78",X"E6",X"40",X"07", + X"07",X"32",X"52",X"4E",X"78",X"E6",X"3F",X"32",X"35",X"4C",X"78",X"07",X"07",X"E6",X"01",X"3E", + X"01",X"32",X"34",X"4C",X"C9",X"3A",X"31",X"4C",X"21",X"FF",X"1A",X"87",X"16",X"00",X"5F",X"19", + X"5E",X"23",X"56",X"21",X"36",X"4C",X"72",X"23",X"73",X"23",X"36",X"00",X"C9",X"3A",X"6E",X"4E", + X"FE",X"FF",X"C8",X"FE",X"64",X"D0",X"3E",X"20",X"21",X"70",X"4E",X"11",X"00",X"50",X"ED",X"4B", + X"72",X"4E",X"CD",X"34",X"05",X"3E",X"40",X"21",X"74",X"4E",X"11",X"00",X"50",X"ED",X"4B",X"76", + X"4E",X"CD",X"34",X"05",X"3E",X"80",X"21",X"78",X"4E",X"11",X"00",X"50",X"ED",X"4B",X"7A",X"4E", + X"CD",X"34",X"05",X"C9",X"EB",X"A6",X"EB",X"20",X"1A",X"7E",X"B7",X"C8",X"36",X"00",X"23",X"34", + X"7E",X"91",X"D8",X"77",X"21",X"6E",X"4E",X"7E",X"80",X"77",X"CD",X"56",X"05",X"3E",X"0A",X"32", + X"45",X"4E",X"C9",X"36",X"01",X"C9",X"0E",X"00",X"3A",X"6E",X"4E",X"B7",X"28",X"0F",X"FE",X"64", + X"38",X"02",X"3E",X"63",X"D6",X"0A",X"38",X"03",X"0C",X"18",X"F9",X"C6",X"0A",X"11",X"00",X"04", + X"21",X"BE",X"43",X"71",X"19",X"36",X"05",X"21",X"BF",X"43",X"77",X"19",X"36",X"05",X"C9",X"3A", + X"33",X"4C",X"C6",X"01",X"32",X"39",X"4C",X"C9",X"3A",X"39",X"4C",X"47",X"3A",X"46",X"4C",X"3D", + X"21",X"48",X"4C",X"70",X"20",X"02",X"06",X"00",X"23",X"70",X"C9",X"3E",X"08",X"CD",X"04",X"01", + X"3E",X"00",X"32",X"7E",X"40",X"3E",X"05",X"32",X"7E",X"44",X"C9",X"3E",X"0F",X"32",X"7E",X"40", + X"21",X"5A",X"40",X"06",X"04",X"77",X"23",X"10",X"FC",X"C9",X"AF",X"21",X"3A",X"4C",X"06",X"06", + X"77",X"23",X"10",X"FC",X"21",X"60",X"40",X"11",X"79",X"40",X"3E",X"0F",X"06",X"06",X"77",X"12", + X"23",X"13",X"10",X"FA",X"AF",X"2B",X"1B",X"77",X"12",X"C9",X"3A",X"47",X"4C",X"FE",X"01",X"20", + X"05",X"21",X"3A",X"4C",X"18",X"03",X"21",X"3D",X"4C",X"11",X"40",X"4C",X"CD",X"3B",X"00",X"21", + X"45",X"4C",X"36",X"00",X"D0",X"34",X"C9",X"21",X"44",X"4C",X"7E",X"2B",X"B6",X"C8",X"5E",X"23", + X"56",X"21",X"00",X"00",X"22",X"43",X"4C",X"3A",X"47",X"4C",X"3D",X"20",X"05",X"21",X"3C",X"4C", + X"18",X"03",X"21",X"3F",X"4C",X"AF",X"7B",X"86",X"27",X"77",X"2B",X"7A",X"8E",X"27",X"77",X"2B", + X"3E",X"00",X"8E",X"27",X"77",X"3A",X"47",X"4C",X"3D",X"20",X"05",X"3A",X"4A",X"4C",X"18",X"03", + X"3A",X"4B",X"4C",X"A7",X"20",X"33",X"11",X"36",X"4C",X"EB",X"7E",X"23",X"B6",X"23",X"B6",X"28", + X"28",X"2B",X"2B",X"CD",X"3B",X"00",X"38",X"21",X"3A",X"47",X"4C",X"3D",X"20",X"0A",X"21",X"48", + X"4C",X"3E",X"01",X"32",X"4A",X"4C",X"18",X"08",X"21",X"49",X"4C",X"3E",X"01",X"32",X"4B",X"4C", + X"34",X"CD",X"51",X"34",X"3E",X"01",X"32",X"45",X"4E",X"3A",X"45",X"4C",X"A7",X"CC",X"DA",X"05", + X"3A",X"47",X"4C",X"3D",X"20",X"08",X"11",X"3A",X"4C",X"21",X"60",X"40",X"18",X"06",X"11",X"3D", + X"4C",X"21",X"79",X"40",X"CD",X"99",X"03",X"3A",X"45",X"4C",X"A7",X"C8",X"1B",X"1B",X"21",X"40", + X"4C",X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"23",X"1A",X"77",X"21",X"6C",X"40",X"1B",X"1B", + X"CD",X"99",X"03",X"C9",X"31",X"F0",X"4F",X"AF",X"32",X"00",X"50",X"F3",X"ED",X"56",X"AF",X"32", + X"03",X"50",X"32",X"45",X"4E",X"CD",X"B4",X"0A",X"3E",X"0C",X"32",X"46",X"4E",X"3E",X"01",X"32", + X"20",X"4C",X"FB",X"3E",X"01",X"32",X"00",X"50",X"3A",X"20",X"4C",X"87",X"16",X"00",X"5F",X"21", + X"31",X"0A",X"E5",X"21",X"DC",X"06",X"19",X"5E",X"23",X"56",X"EB",X"E9",X"E4",X"06",X"E7",X"06", + X"EF",X"07",X"09",X"08",X"C3",X"00",X"00",X"21",X"CA",X"07",X"E5",X"21",X"FB",X"06",X"3A",X"40", + X"4E",X"87",X"5F",X"16",X"00",X"19",X"5E",X"23",X"56",X"EB",X"E9",X"05",X"07",X"46",X"07",X"5D", + X"07",X"5E",X"07",X"C9",X"07",X"CD",X"75",X"00",X"CD",X"D0",X"0D",X"3E",X"13",X"CD",X"04",X"01", + X"3E",X"14",X"CD",X"04",X"01",X"21",X"26",X"07",X"11",X"00",X"4C",X"01",X"20",X"00",X"ED",X"B0", + X"3E",X"01",X"32",X"47",X"4C",X"C9",X"98",X"14",X"98",X"14",X"98",X"14",X"98",X"14",X"98",X"14", + X"98",X"14",X"98",X"14",X"98",X"0C",X"78",X"2C",X"78",X"43",X"78",X"5C",X"78",X"73",X"78",X"8C", + X"78",X"A3",X"78",X"BC",X"78",X"CC",X"3A",X"0B",X"4E",X"FE",X"00",X"C8",X"CD",X"75",X"00",X"CD", + X"FE",X"0D",X"3E",X"01",X"32",X"47",X"4C",X"3E",X"02",X"32",X"40",X"4E",X"C9",X"C9",X"3A",X"4D", + X"4E",X"A7",X"C0",X"CD",X"75",X"00",X"CD",X"D0",X"0D",X"CD",X"F3",X"12",X"CD",X"34",X"34",X"AF", + X"32",X"4C",X"4C",X"32",X"46",X"4C",X"3E",X"0A",X"32",X"4E",X"4C",X"32",X"66",X"4C",X"CF",X"CD", + X"21",X"32",X"CD",X"FB",X"31",X"CD",X"F6",X"33",X"CD",X"96",X"33",X"3E",X"9F",X"32",X"64",X"4C", + X"3E",X"26",X"32",X"65",X"4C",X"3E",X"F0",X"32",X"11",X"4C",X"3E",X"28",X"32",X"10",X"4C",X"3E", + X"98",X"32",X"00",X"4C",X"3E",X"14",X"32",X"01",X"4C",X"AF",X"32",X"58",X"4C",X"32",X"57",X"4C", + X"32",X"56",X"4C",X"32",X"4F",X"4C",X"32",X"3E",X"4E",X"3E",X"01",X"32",X"5A",X"4C",X"3E",X"08", + X"32",X"4D",X"4C",X"3E",X"04",X"32",X"40",X"4E",X"C9",X"C9",X"3A",X"6E",X"4E",X"A7",X"28",X"13", + X"3E",X"02",X"32",X"20",X"4C",X"AF",X"32",X"40",X"4E",X"32",X"41",X"4E",X"CD",X"75",X"00",X"CD", + X"D0",X"0D",X"C9",X"3A",X"41",X"4E",X"A7",X"20",X"FA",X"3E",X"FF",X"32",X"41",X"4E",X"C9",X"3A", + X"46",X"4C",X"A7",X"C8",X"3E",X"03",X"32",X"20",X"4C",X"32",X"C0",X"50",X"AF",X"32",X"3F",X"4E", + X"32",X"50",X"4C",X"3E",X"03",X"32",X"45",X"4E",X"C9",X"AF",X"32",X"4A",X"4C",X"32",X"4B",X"4C", + X"3E",X"01",X"32",X"4C",X"4C",X"AF",X"32",X"3F",X"4E",X"CD",X"F3",X"12",X"CD",X"88",X"05",X"CD", + X"BA",X"05",X"3E",X"01",X"32",X"51",X"4C",X"32",X"52",X"4C",X"32",X"4E",X"4C",X"3A",X"46",X"4C", + X"FE",X"01",X"CC",X"AB",X"05",X"3A",X"46",X"4C",X"FE",X"01",X"28",X"22",X"3A",X"47",X"4C",X"FE", + X"01",X"20",X"04",X"3E",X"02",X"18",X"02",X"3E",X"03",X"CD",X"04",X"01",X"3E",X"60",X"32",X"21", + X"4C",X"AF",X"32",X"26",X"4C",X"3A",X"26",X"4C",X"A7",X"28",X"FA",X"CD",X"75",X"00",X"3A",X"4E", + X"4C",X"3D",X"CF",X"CD",X"21",X"32",X"CD",X"FB",X"31",X"CD",X"7E",X"34",X"CD",X"51",X"34",X"CD", + X"96",X"33",X"CD",X"F6",X"33",X"3E",X"9F",X"32",X"64",X"4C",X"3E",X"26",X"32",X"65",X"4C",X"3E", + X"F0",X"32",X"11",X"4C",X"3E",X"28",X"32",X"10",X"4C",X"3E",X"98",X"32",X"00",X"4C",X"3E",X"14", + X"32",X"01",X"4C",X"AF",X"32",X"58",X"4C",X"32",X"57",X"4C",X"32",X"56",X"4C",X"32",X"4F",X"4C", + X"3C",X"32",X"5A",X"4C",X"3E",X"08",X"32",X"4D",X"4C",X"AF",X"32",X"4C",X"4C",X"3C",X"32",X"66", + X"4C",X"CD",X"F7",X"05",X"3A",X"4F",X"4C",X"A7",X"C2",X"34",X"0A",X"21",X"50",X"4C",X"7E",X"A7", + X"28",X"E7",X"3E",X"64",X"32",X"50",X"4E",X"3E",X"02",X"32",X"45",X"4E",X"3E",X"01",X"32",X"4F", + X"4E",X"AF",X"32",X"3F",X"4E",X"32",X"50",X"4C",X"3A",X"50",X"4E",X"A7",X"20",X"FA",X"AF",X"32", + X"4F",X"4E",X"21",X"50",X"4C",X"36",X"00",X"3E",X"01",X"32",X"4C",X"4C",X"32",X"66",X"4C",X"CD", + X"34",X"34",X"21",X"48",X"4C",X"3A",X"46",X"4C",X"FE",X"01",X"20",X"60",X"7E",X"A7",X"20",X"49", + X"3E",X"0B",X"32",X"45",X"4E",X"CD",X"75",X"00",X"CD",X"6D",X"00",X"3E",X"06",X"CD",X"04",X"01", + X"AF",X"32",X"45",X"4C",X"32",X"03",X"50",X"CD",X"9B",X"05",X"3E",X"02",X"32",X"22",X"4C",X"AF", + X"32",X"27",X"4C",X"3A",X"27",X"4C",X"A7",X"28",X"FA",X"3A",X"46",X"4C",X"3D",X"20",X"06",X"CD", + X"14",X"13",X"CD",X"75",X"00",X"3A",X"6E",X"4E",X"A7",X"20",X"04",X"3E",X"01",X"18",X"02",X"3E", + X"02",X"32",X"20",X"4C",X"AF",X"32",X"46",X"4C",X"C9",X"35",X"3E",X"01",X"32",X"22",X"4C",X"AF", + X"32",X"27",X"4C",X"3A",X"27",X"4C",X"A7",X"28",X"FA",X"C3",X"5E",X"08",X"3A",X"47",X"4C",X"FE", + X"01",X"C2",X"CE",X"09",X"7E",X"35",X"FE",X"00",X"CA",X"9C",X"09",X"23",X"7E",X"FE",X"FF",X"28", + X"22",X"CD",X"75",X"00",X"CD",X"6D",X"00",X"3E",X"02",X"32",X"47",X"4C",X"3A",X"52",X"4E",X"A7", + X"20",X"05",X"3E",X"01",X"32",X"03",X"50",X"3A",X"52",X"4C",X"32",X"4E",X"4C",X"CD",X"DA",X"05", + X"C3",X"35",X"08",X"CD",X"75",X"00",X"CD",X"6D",X"00",X"C3",X"35",X"08",X"E5",X"3E",X"0B",X"32", + X"45",X"4E",X"CD",X"75",X"00",X"CD",X"6D",X"00",X"3E",X"04",X"CD",X"04",X"01",X"E1",X"3E",X"60", + X"32",X"21",X"4C",X"AF",X"32",X"26",X"4C",X"3A",X"26",X"4C",X"A7",X"28",X"FA",X"E5",X"CD",X"14", + X"13",X"CD",X"75",X"00",X"E1",X"23",X"7E",X"FE",X"FF",X"CA",X"05",X"09",X"20",X"A3",X"23",X"7E", + X"35",X"FE",X"00",X"28",X"2A",X"2B",X"7E",X"FE",X"FF",X"28",X"1B",X"CD",X"75",X"00",X"CD",X"6D", + X"00",X"AF",X"32",X"03",X"50",X"3A",X"51",X"4C",X"32",X"4E",X"4C",X"3E",X"01",X"32",X"47",X"4C", + X"CD",X"DA",X"05",X"C3",X"35",X"08",X"CD",X"75",X"00",X"CD",X"6D",X"00",X"C3",X"35",X"08",X"E5", + X"3E",X"0B",X"32",X"45",X"4E",X"CD",X"75",X"00",X"CD",X"6D",X"00",X"3E",X"05",X"CD",X"04",X"01", + X"E1",X"3E",X"60",X"32",X"21",X"4C",X"AF",X"32",X"26",X"4C",X"3A",X"26",X"4C",X"A7",X"28",X"FA", + X"E5",X"CD",X"14",X"13",X"CD",X"75",X"00",X"E1",X"2B",X"7E",X"FE",X"FF",X"20",X"AD",X"CA",X"05", + X"09",X"C3",X"C8",X"06",X"AF",X"32",X"50",X"4C",X"32",X"3F",X"4E",X"3E",X"46",X"32",X"50",X"4E", + X"3E",X"01",X"32",X"4F",X"4E",X"3A",X"50",X"4E",X"A7",X"20",X"FA",X"AF",X"32",X"4F",X"4E",X"3E", + X"01",X"32",X"4C",X"4C",X"32",X"66",X"4C",X"AF",X"32",X"4F",X"4C",X"CD",X"34",X"34",X"CD",X"6D", + X"00",X"CD",X"75",X"00",X"3E",X"0E",X"CD",X"04",X"01",X"CD",X"4B",X"33",X"3E",X"0C",X"32",X"45", + X"4E",X"3E",X"60",X"32",X"21",X"4C",X"AF",X"21",X"26",X"4C",X"77",X"7E",X"A7",X"28",X"FC",X"3E", + X"0F",X"CD",X"04",X"01",X"3E",X"60",X"32",X"21",X"4C",X"AF",X"21",X"26",X"4C",X"77",X"7E",X"A7", + X"28",X"FC",X"CD",X"75",X"00",X"21",X"4E",X"4C",X"7E",X"FE",X"14",X"28",X"10",X"34",X"21",X"51", + X"4C",X"3A",X"47",X"4C",X"FE",X"01",X"28",X"01",X"23",X"3A",X"4E",X"4C",X"77",X"CF",X"CD",X"FB", + X"31",X"C3",X"6F",X"08",X"CD",X"5C",X"00",X"CD",X"4A",X"00",X"CD",X"7F",X"00",X"CD",X"F2",X"03", + X"CD",X"B1",X"04",X"CD",X"2E",X"04",X"CD",X"E5",X"04",X"CD",X"7F",X"05",X"CD",X"BA",X"05",X"AF", + X"32",X"70",X"50",X"32",X"0A",X"4E",X"32",X"3F",X"4E",X"DD",X"21",X"02",X"4E",X"DD",X"36",X"00", + X"88",X"DD",X"36",X"01",X"A0",X"DD",X"36",X"02",X"A8",X"DD",X"36",X"03",X"AC",X"DD",X"36",X"04", + X"8A",X"DD",X"36",X"05",X"A2",X"DD",X"36",X"06",X"AB",X"DD",X"36",X"07",X"AD",X"16",X"01",X"21", + X"00",X"44",X"01",X"00",X"04",X"72",X"23",X"0B",X"78",X"B1",X"20",X"F9",X"0E",X"07",X"06",X"03", + X"C5",X"79",X"CD",X"04",X"01",X"C1",X"0C",X"10",X"F7",X"3A",X"6E",X"4E",X"FE",X"FF",X"28",X"05", + X"3E",X"0A",X"CD",X"04",X"01",X"3E",X"3C",X"32",X"23",X"4C",X"AF",X"32",X"65",X"40",X"32",X"71", + X"40",X"32",X"7E",X"40",X"3E",X"05",X"06",X"20",X"21",X"60",X"44",X"77",X"23",X"10",X"FC",X"3A", + X"32",X"4C",X"FE",X"03",X"C9",X"F3",X"F5",X"AF",X"32",X"C0",X"50",X"32",X"00",X"50",X"C5",X"D5", + X"E5",X"DD",X"E5",X"FD",X"E5",X"DD",X"21",X"00",X"4C",X"21",X"F0",X"4F",X"11",X"60",X"50",X"06", + X"08",X"3A",X"47",X"4C",X"FE",X"01",X"28",X"28",X"3A",X"52",X"4E",X"A7",X"20",X"22",X"DD",X"7E", + X"00",X"EE",X"03",X"77",X"23",X"DD",X"7E",X"01",X"77",X"DD",X"7E",X"10",X"C6",X"0F",X"12",X"13", + X"DD",X"7E",X"11",X"C6",X"0F",X"12",X"13",X"23",X"DD",X"23",X"DD",X"23",X"10",X"DA",X"18",X"13", + X"06",X"10",X"DD",X"7E",X"00",X"77",X"DD",X"7E",X"10",X"ED",X"44",X"3D",X"12",X"13",X"23",X"DD", + X"23",X"10",X"EF",X"21",X"53",X"4C",X"34",X"CD",X"FD",X"03",X"CD",X"FD",X"04",X"CD",X"8F",X"00", + X"EF",X"CD",X"05",X"13",X"3A",X"4F",X"4E",X"A7",X"C2",X"19",X"0D",X"21",X"19",X"0D",X"E5",X"3A", + X"20",X"4C",X"87",X"16",X"00",X"5F",X"21",X"CF",X"0B",X"19",X"5E",X"23",X"56",X"EB",X"E9",X"D7", + X"0B",X"D8",X"0B",X"9A",X"0C",X"F5",X"0C",X"C9",X"3A",X"41",X"4E",X"FE",X"FF",X"C0",X"AF",X"32", + X"41",X"4E",X"21",X"F2",X"0B",X"3A",X"40",X"4E",X"87",X"5F",X"16",X"00",X"19",X"5E",X"23",X"56", + X"EB",X"E9",X"FC",X"0B",X"10",X"0C",X"14",X"0C",X"57",X"0C",X"83",X"0C",X"3E",X"01",X"32",X"40", + X"4E",X"AF",X"32",X"0B",X"4E",X"3E",X"01",X"32",X"0C",X"4E",X"3E",X"43",X"32",X"0D",X"4E",X"C9", + X"CD",X"DC",X"0D",X"C9",X"E7",X"FE",X"FF",X"C0",X"3E",X"10",X"CD",X"04",X"01",X"3E",X"11",X"CD", + X"04",X"01",X"3E",X"12",X"CD",X"04",X"01",X"3E",X"19",X"CD",X"04",X"01",X"3E",X"1A",X"CD",X"04", + X"01",X"3E",X"1B",X"CD",X"04",X"01",X"3E",X"1C",X"CD",X"04",X"01",X"3E",X"03",X"32",X"40",X"4E", + X"3E",X"09",X"32",X"45",X"4E",X"32",X"4D",X"4E",X"3E",X"02",X"32",X"7C",X"4E",X"3E",X"FF",X"32", + X"7D",X"4E",X"AF",X"32",X"0E",X"4E",X"C9",X"CD",X"A9",X"0D",X"3A",X"20",X"4C",X"3D",X"C0",X"3A", + X"53",X"4E",X"A7",X"C8",X"3A",X"7D",X"4E",X"A7",X"28",X"05",X"3D",X"32",X"7D",X"4E",X"C9",X"3A", + X"7C",X"4E",X"A7",X"28",X"0A",X"3D",X"32",X"7C",X"4E",X"3E",X"FF",X"32",X"7D",X"4E",X"C9",X"32", + X"4D",X"4E",X"C9",X"3A",X"3F",X"4E",X"FE",X"00",X"C2",X"2B",X"0D",X"CD",X"5E",X"10",X"D7",X"DF", + X"CD",X"D3",X"32",X"CD",X"50",X"36",X"CD",X"57",X"37",X"C9",X"3A",X"6E",X"4E",X"FE",X"01",X"28", + X"07",X"3E",X"01",X"CD",X"04",X"01",X"18",X"05",X"3E",X"00",X"CD",X"04",X"01",X"3A",X"30",X"4C", + X"07",X"07",X"07",X"E6",X"03",X"C8",X"21",X"6E",X"4E",X"CB",X"47",X"20",X"17",X"7E",X"FE",X"02", + X"D8",X"FE",X"FF",X"28",X"05",X"35",X"35",X"CD",X"56",X"05",X"3E",X"02",X"32",X"46",X"4C",X"CD", + X"0F",X"16",X"18",X"0E",X"7E",X"FE",X"FF",X"28",X"04",X"35",X"CD",X"56",X"05",X"3E",X"01",X"32", + X"46",X"4C",X"CD",X"03",X"16",X"3A",X"32",X"4C",X"FE",X"03",X"28",X"00",X"CD",X"75",X"00",X"3E", + X"01",X"32",X"47",X"4C",X"C9",X"3A",X"3F",X"4E",X"FE",X"00",X"20",X"2F",X"3A",X"4C",X"4C",X"A7", + X"C0",X"CD",X"D4",X"1A",X"3A",X"50",X"4C",X"A7",X"28",X"0B",X"DF",X"CD",X"D3",X"32",X"CD",X"50", + X"36",X"CD",X"57",X"37",X"C9",X"D7",X"C3",X"0A",X"0D",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1", + X"3E",X"01",X"32",X"00",X"50",X"32",X"C0",X"50",X"F1",X"FB",X"C9",X"CD",X"45",X"0D",X"3A",X"00", + X"4E",X"FE",X"01",X"C0",X"3E",X"01",X"32",X"50",X"4C",X"3E",X"00",X"32",X"3F",X"4E",X"32",X"40", + X"4E",X"32",X"01",X"50",X"C9",X"21",X"10",X"4C",X"CB",X"46",X"20",X"3A",X"3A",X"01",X"4E",X"A7", + X"20",X"37",X"3A",X"10",X"4C",X"FE",X"2A",X"28",X"35",X"FE",X"28",X"28",X"41",X"21",X"10",X"4C", + X"35",X"35",X"21",X"02",X"4E",X"16",X"00",X"3A",X"0A",X"4E",X"5F",X"19",X"7E",X"32",X"00",X"4C", + X"3E",X"03",X"32",X"01",X"4E",X"3A",X"0A",X"4E",X"FE",X"07",X"28",X"05",X"3C",X"32",X"0A",X"4E", + X"C9",X"AF",X"32",X"0A",X"4E",X"C9",X"CB",X"86",X"C9",X"21",X"01",X"4E",X"35",X"C9",X"21",X"10", + X"4C",X"35",X"35",X"3E",X"8A",X"32",X"00",X"4C",X"3E",X"03",X"32",X"01",X"4E",X"C9",X"3E",X"01", + X"32",X"00",X"4E",X"3E",X"8A",X"32",X"00",X"4C",X"C9",X"3A",X"0E",X"4E",X"A7",X"20",X"1C",X"21", + X"00",X"4C",X"06",X"08",X"7E",X"FE",X"98",X"20",X"0D",X"3E",X"99",X"77",X"23",X"23",X"10",X"FB", + X"3E",X"20",X"32",X"0E",X"4E",X"C9",X"3E",X"98",X"C3",X"BB",X"0D",X"21",X"0E",X"4E",X"35",X"C9", + X"21",X"01",X"4C",X"AF",X"06",X"08",X"77",X"23",X"23",X"10",X"FB",X"C9",X"3A",X"0D",X"4E",X"FE", + X"00",X"20",X"10",X"3A",X"0C",X"4E",X"FE",X"00",X"28",X"0E",X"21",X"0D",X"4E",X"35",X"21",X"0C", + X"4E",X"35",X"C9",X"21",X"0D",X"4E",X"35",X"C9",X"3E",X"FF",X"32",X"0B",X"4E",X"C9",X"DD",X"21", + X"0E",X"4E",X"DD",X"36",X"00",X"00",X"3E",X"FF",X"DD",X"77",X"06",X"DD",X"77",X"0C",X"DD",X"77", + X"12",X"DD",X"77",X"18",X"DD",X"77",X"1E",X"DD",X"77",X"24",X"DD",X"77",X"2A",X"3E",X"80",X"DD", + X"77",X"01",X"DD",X"77",X"07",X"DD",X"77",X"0D",X"DD",X"77",X"13",X"DD",X"77",X"19",X"DD",X"77", + X"1F",X"DD",X"77",X"25",X"DD",X"77",X"2B",X"3E",X"14",X"DD",X"77",X"02",X"DD",X"77",X"08",X"DD", + X"77",X"0E",X"DD",X"77",X"14",X"DD",X"77",X"1A",X"DD",X"77",X"20",X"DD",X"77",X"26",X"DD",X"77", + X"2C",X"3E",X"58",X"DD",X"77",X"03",X"DD",X"77",X"09",X"DD",X"77",X"0F",X"DD",X"77",X"15",X"DD", + X"77",X"1B",X"DD",X"77",X"21",X"DD",X"77",X"27",X"DD",X"77",X"2D",X"3E",X"EE",X"DD",X"77",X"04", + X"DD",X"77",X"0A",X"DD",X"77",X"10",X"DD",X"77",X"16",X"DD",X"77",X"1C",X"DD",X"77",X"22",X"DD", + X"77",X"28",X"DD",X"77",X"2E",X"DD",X"36",X"05",X"20",X"DD",X"36",X"0B",X"38",X"DD",X"36",X"11", + X"50",X"DD",X"36",X"17",X"68",X"DD",X"36",X"1D",X"88",X"DD",X"36",X"23",X"A0",X"DD",X"36",X"29", + X"B8",X"DD",X"36",X"2F",X"D0",X"C9",X"CD",X"AD",X"0F",X"DD",X"21",X"0E",X"4E",X"DD",X"7E",X"00", + X"FE",X"FF",X"28",X"3F",X"DD",X"7E",X"01",X"FE",X"98",X"CA",X"7B",X"0F",X"DD",X"7E",X"04",X"FE", + X"E0",X"CA",X"74",X"0F",X"FE",X"D0",X"CA",X"6D",X"0F",X"FE",X"C0",X"CA",X"66",X"0F",X"FE",X"B0", + X"CA",X"5F",X"0F",X"FE",X"A0",X"CA",X"58",X"0F",X"FE",X"90",X"28",X"75",X"FE",X"80",X"CA",X"43", + X"0F",X"FE",X"20",X"28",X"65",X"DD",X"35",X"04",X"DD",X"7E",X"01",X"FE",X"80",X"28",X"4D",X"DD", + X"36",X"01",X"80",X"DD",X"21",X"14",X"4E",X"CD",X"1C",X"00",X"DD",X"21",X"1A",X"4E",X"CD",X"1C", + X"00",X"DD",X"21",X"20",X"4E",X"CD",X"1C",X"00",X"DD",X"21",X"26",X"4E",X"CD",X"1C",X"00",X"DD", + X"21",X"2C",X"4E",X"CD",X"1C",X"00",X"DD",X"21",X"32",X"4E",X"CD",X"1C",X"00",X"DD",X"21",X"38", + X"4E",X"CD",X"1C",X"00",X"3A",X"0E",X"4E",X"FE",X"FF",X"20",X"0F",X"3A",X"38",X"4E",X"FE",X"FF", + X"20",X"08",X"3E",X"98",X"32",X"0E",X"4C",X"3E",X"FF",X"C9",X"AF",X"C9",X"DD",X"36",X"01",X"84", + X"C3",X"F3",X"0E",X"AF",X"32",X"38",X"4E",X"C3",X"E5",X"0E",X"DD",X"36",X"01",X"98",X"C3",X"F3", + X"0E",X"AF",X"32",X"32",X"4E",X"C3",X"E5",X"0E",X"AF",X"32",X"2C",X"4E",X"C3",X"E5",X"0E",X"AF", + X"32",X"26",X"4E",X"C3",X"E5",X"0E",X"AF",X"32",X"20",X"4E",X"C3",X"E5",X"0E",X"AF",X"32",X"1A", + X"4E",X"C3",X"E5",X"0E",X"AF",X"32",X"14",X"4E",X"C3",X"E5",X"0E",X"DD",X"36",X"00",X"FF",X"C3", + X"F3",X"0E",X"DD",X"7E",X"00",X"FE",X"FF",X"C8",X"DD",X"7E",X"04",X"DD",X"BE",X"05",X"28",X"14", + X"DD",X"35",X"04",X"DD",X"7E",X"01",X"FE",X"80",X"20",X"05",X"DD",X"36",X"01",X"84",X"C9",X"DD", + X"36",X"01",X"80",X"C9",X"DD",X"36",X"01",X"98",X"DD",X"36",X"00",X"FF",X"C9",X"21",X"0F",X"4E", + X"11",X"00",X"4C",X"01",X"02",X"00",X"ED",X"B0",X"21",X"11",X"4E",X"11",X"10",X"4C",X"01",X"02", + X"00",X"ED",X"B0",X"21",X"15",X"4E",X"11",X"02",X"4C",X"01",X"02",X"00",X"ED",X"B0",X"21",X"17", + X"4E",X"11",X"12",X"4C",X"01",X"02",X"00",X"ED",X"B0",X"21",X"1B",X"4E",X"11",X"04",X"4C",X"01", + X"02",X"00",X"ED",X"B0",X"21",X"1D",X"4E",X"11",X"14",X"4C",X"01",X"02",X"00",X"ED",X"B0",X"21", + X"21",X"4E",X"11",X"06",X"4C",X"01",X"02",X"00",X"ED",X"B0",X"21",X"23",X"4E",X"11",X"16",X"4C", + X"01",X"02",X"00",X"ED",X"B0",X"21",X"27",X"4E",X"11",X"08",X"4C",X"01",X"02",X"00",X"ED",X"B0", + X"21",X"29",X"4E",X"11",X"18",X"4C",X"01",X"02",X"00",X"ED",X"B0",X"21",X"2D",X"4E",X"11",X"0A", + X"4C",X"01",X"02",X"00",X"ED",X"B0",X"21",X"2F",X"4E",X"11",X"1A",X"4C",X"01",X"02",X"00",X"ED", + X"B0",X"21",X"33",X"4E",X"11",X"0C",X"4C",X"01",X"02",X"00",X"ED",X"B0",X"21",X"35",X"4E",X"11", + X"1C",X"4C",X"01",X"02",X"00",X"ED",X"B0",X"21",X"39",X"4E",X"11",X"0E",X"4C",X"01",X"02",X"00", + X"ED",X"B0",X"21",X"3B",X"4E",X"11",X"1E",X"4C",X"01",X"02",X"00",X"ED",X"B0",X"C9",X"21",X"6F", + X"10",X"3A",X"3E",X"4E",X"87",X"5F",X"16",X"00",X"19",X"5E",X"23",X"56",X"EB",X"E9",X"35",X"97", + X"10",X"AE",X"10",X"F0",X"10",X"0D",X"11",X"2A",X"11",X"47",X"11",X"64",X"11",X"81",X"11",X"9E", + X"11",X"BB",X"11",X"D9",X"11",X"F1",X"11",X"09",X"12",X"20",X"12",X"3E",X"12",X"56",X"12",X"6D", + X"12",X"B0",X"12",X"C8",X"12",X"E0",X"12",X"3A",X"11",X"4C",X"FE",X"94",X"28",X"06",X"3E",X"02", + X"32",X"60",X"4C",X"C9",X"AF",X"32",X"60",X"4C",X"3E",X"01",X"32",X"3E",X"4E",X"C9",X"3A",X"60", + X"4C",X"A7",X"28",X"17",X"3A",X"10",X"4C",X"FE",X"48",X"28",X"06",X"3E",X"01",X"32",X"60",X"4C", + X"C9",X"AF",X"32",X"60",X"4C",X"3E",X"02",X"32",X"3E",X"4E",X"C9",X"3A",X"1D",X"4C",X"47",X"3A", + X"CD",X"4C",X"A7",X"28",X"10",X"3E",X"88",X"B8",X"38",X"06",X"3E",X"01",X"32",X"60",X"4C",X"C9", + X"AF",X"32",X"60",X"4C",X"C9",X"3E",X"20",X"B8",X"38",X"F6",X"3E",X"01",X"32",X"60",X"4C",X"C9", + X"3A",X"60",X"4C",X"A7",X"28",X"07",X"3A",X"11",X"4C",X"FE",X"B0",X"28",X"06",X"3E",X"04",X"32", + X"60",X"4C",X"C9",X"AF",X"32",X"60",X"4C",X"3E",X"03",X"32",X"3E",X"4E",X"C9",X"3A",X"60",X"4C", + X"A7",X"28",X"07",X"3A",X"10",X"4C",X"FE",X"48",X"28",X"06",X"3E",X"10",X"32",X"60",X"4C",X"C9", + X"AF",X"32",X"60",X"4C",X"3E",X"04",X"32",X"3E",X"4E",X"C9",X"3A",X"60",X"4C",X"A7",X"28",X"07", + X"3A",X"11",X"4C",X"FE",X"C8",X"28",X"06",X"3E",X"04",X"32",X"60",X"4C",X"C9",X"AF",X"32",X"60", + X"4C",X"3E",X"05",X"32",X"3E",X"4E",X"C9",X"3A",X"60",X"4C",X"A7",X"28",X"07",X"3A",X"10",X"4C", + X"FE",X"68",X"28",X"06",X"3E",X"01",X"32",X"60",X"4C",X"C9",X"AF",X"32",X"60",X"4C",X"3E",X"06", + X"32",X"3E",X"4E",X"C9",X"3A",X"60",X"4C",X"A7",X"28",X"07",X"3A",X"11",X"4C",X"FE",X"C4",X"28", + X"06",X"3E",X"02",X"32",X"60",X"4C",X"C9",X"AF",X"32",X"60",X"4C",X"3E",X"07",X"32",X"3E",X"4E", + X"C9",X"3A",X"60",X"4C",X"A7",X"28",X"07",X"3A",X"10",X"4C",X"FE",X"68",X"28",X"06",X"3E",X"10", + X"32",X"60",X"4C",X"C9",X"AF",X"32",X"60",X"4C",X"3E",X"08",X"32",X"3E",X"4E",X"C9",X"3A",X"60", + X"4C",X"A7",X"28",X"07",X"3A",X"11",X"4C",X"FE",X"A0",X"28",X"06",X"3E",X"02",X"32",X"60",X"4C", + X"C9",X"AF",X"32",X"60",X"4C",X"3E",X"09",X"32",X"3E",X"4E",X"C9",X"3A",X"60",X"4C",X"A7",X"28", + X"07",X"3A",X"10",X"4C",X"FE",X"68",X"28",X"06",X"3E",X"12",X"32",X"60",X"4C",X"C9",X"3E",X"02", + X"32",X"60",X"4C",X"3E",X"0A",X"32",X"3E",X"4E",X"C9",X"3A",X"11",X"4C",X"FE",X"64",X"28",X"06", + X"3E",X"02",X"32",X"60",X"4C",X"C9",X"3E",X"01",X"32",X"60",X"4C",X"3E",X"0B",X"32",X"3E",X"4E", + X"C9",X"3A",X"10",X"4C",X"FE",X"88",X"28",X"06",X"3E",X"01",X"32",X"60",X"4C",X"C9",X"3E",X"02", + X"32",X"60",X"4C",X"3E",X"0C",X"32",X"3E",X"4E",X"C9",X"3A",X"11",X"4C",X"FE",X"44",X"28",X"06", + X"3E",X"02",X"32",X"60",X"4C",X"C9",X"AF",X"32",X"60",X"4C",X"3E",X"0D",X"32",X"3E",X"4E",X"C9", + X"3A",X"60",X"4C",X"A7",X"28",X"07",X"3A",X"10",X"4C",X"FE",X"88",X"28",X"06",X"3E",X"12",X"32", + X"60",X"4C",X"C9",X"3E",X"02",X"32",X"60",X"4C",X"3E",X"0E",X"32",X"3E",X"4E",X"C9",X"3A",X"11", + X"4C",X"FE",X"02",X"28",X"06",X"3E",X"02",X"32",X"60",X"4C",X"C9",X"3E",X"04",X"32",X"60",X"4C", + X"3E",X"0F",X"32",X"3E",X"4E",X"C9",X"3A",X"11",X"4C",X"FE",X"18",X"28",X"06",X"3E",X"04",X"32", + X"60",X"4C",X"C9",X"AF",X"32",X"60",X"4C",X"3E",X"10",X"32",X"3E",X"4E",X"C9",X"3A",X"60",X"4C", + X"FE",X"00",X"28",X"18",X"3A",X"10",X"4C",X"FE",X"A8",X"28",X"06",X"3E",X"01",X"32",X"60",X"4C", + X"C9",X"3E",X"02",X"32",X"60",X"4C",X"3E",X"11",X"32",X"3E",X"4E",X"C9",X"3A",X"1B",X"4C",X"47", + X"3A",X"C6",X"4C",X"A7",X"20",X"10",X"3E",X"30",X"B8",X"38",X"05",X"AF",X"32",X"60",X"4C",X"C9", + X"3E",X"01",X"32",X"60",X"4C",X"C9",X"3E",X"B0",X"B8",X"38",X"F5",X"AF",X"32",X"60",X"4C",X"C9", + X"3A",X"11",X"4C",X"FE",X"02",X"28",X"06",X"3E",X"02",X"32",X"60",X"4C",X"C9",X"3E",X"04",X"32", + X"60",X"4C",X"3E",X"12",X"32",X"3E",X"4E",X"C9",X"3A",X"11",X"4C",X"FE",X"18",X"28",X"06",X"3E", + X"04",X"32",X"60",X"4C",X"C9",X"3E",X"08",X"32",X"60",X"4C",X"3E",X"13",X"32",X"3E",X"4E",X"C9", + X"3A",X"10",X"4C",X"FE",X"88",X"28",X"06",X"3E",X"08",X"32",X"60",X"4C",X"C9",X"3E",X"04",X"32", + X"60",X"4C",X"C9",X"DD",X"21",X"A5",X"4C",X"11",X"08",X"00",X"06",X"04",X"AF",X"DD",X"77",X"00", + X"DD",X"19",X"10",X"F9",X"C9",X"3A",X"4F",X"4E",X"A7",X"C8",X"3A",X"50",X"4E",X"A7",X"C8",X"3D", + X"32",X"50",X"4E",X"C9",X"F5",X"AF",X"32",X"00",X"50",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD",X"E5", + X"CD",X"75",X"00",X"3E",X"0F",X"32",X"5D",X"4E",X"32",X"61",X"4E",X"32",X"65",X"4E",X"32",X"69", + X"4E",X"32",X"6D",X"4E",X"3E",X"17",X"CD",X"04",X"01",X"3E",X"18",X"CD",X"04",X"01",X"CD",X"66", + X"14",X"11",X"4A",X"41",X"3A",X"5D",X"4E",X"4F",X"21",X"E9",X"15",X"CD",X"CE",X"15",X"11",X"8A", + X"41",X"21",X"EC",X"15",X"3A",X"61",X"4E",X"4F",X"CD",X"CE",X"15",X"11",X"CA",X"41",X"21",X"EF", + X"15",X"3A",X"65",X"4E",X"4F",X"CD",X"CE",X"15",X"11",X"0A",X"42",X"21",X"F2",X"15",X"3A",X"69", + X"4E",X"4F",X"CD",X"CE",X"15",X"11",X"4A",X"42",X"21",X"F5",X"15",X"3A",X"6D",X"4E",X"4F",X"CD", + X"CE",X"15",X"11",X"53",X"41",X"21",X"5A",X"4E",X"3A",X"5D",X"4E",X"4F",X"CD",X"AA",X"15",X"11", + X"93",X"41",X"21",X"5E",X"4E",X"3A",X"61",X"4E",X"4F",X"CD",X"AA",X"15",X"11",X"D3",X"41",X"21", + X"62",X"4E",X"3A",X"65",X"4E",X"4F",X"CD",X"AA",X"15",X"11",X"13",X"42",X"21",X"66",X"4E",X"3A", + X"69",X"4E",X"4F",X"CD",X"AA",X"15",X"11",X"53",X"42",X"21",X"6A",X"4E",X"3A",X"6D",X"4E",X"4F", + X"CD",X"AA",X"15",X"3E",X"06",X"32",X"22",X"4C",X"3E",X"1F",X"32",X"21",X"4C",X"AF",X"32",X"27", + X"4C",X"32",X"26",X"4C",X"3C",X"32",X"00",X"50",X"3A",X"26",X"4C",X"A7",X"20",X"0F",X"3A",X"27", + X"4C",X"A7",X"28",X"F4",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"C9",X"3E",X"1F",X"32", + X"21",X"4C",X"AF",X"32",X"26",X"4C",X"3E",X"18",X"21",X"5D",X"4E",X"BE",X"28",X"1B",X"21",X"61", + X"4E",X"BE",X"28",X"19",X"21",X"65",X"4E",X"BE",X"28",X"18",X"21",X"69",X"4E",X"BE",X"28",X"17", + X"21",X"6D",X"4E",X"BE",X"28",X"16",X"C3",X"DE",X"13",X"AF",X"C3",X"31",X"14",X"3E",X"01",X"C3", + X"31",X"14",X"3E",X"02",X"C3",X"31",X"14",X"3E",X"03",X"C3",X"31",X"14",X"3E",X"04",X"C3",X"31", + X"14",X"87",X"21",X"5C",X"14",X"16",X"00",X"5F",X"19",X"5E",X"23",X"56",X"DD",X"21",X"00",X"04", + X"DD",X"19",X"DD",X"7E",X"00",X"FE",X"18",X"20",X"0E",X"3E",X"0F",X"06",X"0F",X"DD",X"77",X"00", + X"DD",X"23",X"10",X"F9",X"C3",X"DE",X"13",X"3E",X"18",X"C3",X"4B",X"14",X"4A",X"41",X"8A",X"41", + X"CA",X"41",X"0A",X"42",X"4A",X"42",X"3A",X"47",X"4C",X"3D",X"20",X"39",X"21",X"3A",X"4C",X"E5", + X"11",X"5A",X"4E",X"CD",X"F8",X"15",X"38",X"33",X"E1",X"E5",X"11",X"5E",X"4E",X"CD",X"F8",X"15", + X"38",X"72",X"E1",X"E5",X"11",X"62",X"4E",X"CD",X"F8",X"15",X"DA",X"32",X"15",X"E1",X"E5",X"11", + X"66",X"4E",X"CD",X"F8",X"15",X"DA",X"65",X"15",X"E1",X"E5",X"11",X"6A",X"4E",X"CD",X"F8",X"15", + X"DA",X"8D",X"15",X"E1",X"C9",X"21",X"3D",X"4C",X"C3",X"6F",X"14",X"21",X"5D",X"4E",X"36",X"18", + X"3E",X"0F",X"32",X"61",X"4E",X"32",X"65",X"4E",X"32",X"69",X"4E",X"32",X"6D",X"4E",X"21",X"66", + X"4E",X"11",X"6A",X"4E",X"01",X"03",X"00",X"ED",X"B0",X"21",X"62",X"4E",X"11",X"66",X"4E",X"01", + X"03",X"00",X"ED",X"B0",X"21",X"5E",X"4E",X"11",X"62",X"4E",X"01",X"03",X"00",X"ED",X"B0",X"21", + X"5A",X"4E",X"11",X"5E",X"4E",X"01",X"03",X"00",X"ED",X"B0",X"E1",X"11",X"5A",X"4E",X"01",X"03", + X"00",X"ED",X"B0",X"C9",X"21",X"61",X"4E",X"36",X"18",X"3E",X"0F",X"32",X"5D",X"4E",X"32",X"65", + X"4E",X"32",X"69",X"4E",X"32",X"6D",X"4E",X"21",X"66",X"4E",X"11",X"6A",X"4E",X"01",X"03",X"00", + X"ED",X"B0",X"21",X"62",X"4E",X"11",X"66",X"4E",X"01",X"03",X"00",X"ED",X"B0",X"21",X"5E",X"4E", + X"11",X"62",X"4E",X"01",X"03",X"00",X"ED",X"B0",X"E1",X"11",X"5E",X"4E",X"01",X"03",X"00",X"ED", + X"B0",X"C9",X"21",X"65",X"4E",X"36",X"18",X"3E",X"0F",X"32",X"5D",X"4E",X"32",X"61",X"4E",X"32", + X"69",X"4E",X"32",X"6D",X"4E",X"21",X"66",X"4E",X"11",X"6A",X"4E",X"01",X"03",X"00",X"ED",X"B0", + X"21",X"62",X"4E",X"11",X"66",X"4E",X"01",X"03",X"00",X"ED",X"B0",X"E1",X"11",X"62",X"4E",X"01", + X"03",X"00",X"ED",X"B0",X"C9",X"21",X"69",X"4E",X"36",X"18",X"3E",X"0F",X"32",X"5D",X"4E",X"32", + X"61",X"4E",X"32",X"65",X"4E",X"32",X"6D",X"4E",X"21",X"66",X"4E",X"11",X"6A",X"4E",X"01",X"03", + X"00",X"ED",X"B0",X"E1",X"11",X"66",X"4E",X"01",X"03",X"00",X"ED",X"B0",X"C9",X"21",X"6D",X"4E", + X"36",X"18",X"3E",X"0F",X"32",X"5D",X"4E",X"32",X"61",X"4E",X"32",X"65",X"4E",X"32",X"69",X"4E", + X"E1",X"11",X"6A",X"4E",X"01",X"03",X"00",X"ED",X"B0",X"C9",X"DD",X"21",X"00",X"04",X"DD",X"19", + X"06",X"03",X"7E",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"12",X"DD",X"71",X"00",X"13",X"DD",X"23", + X"7E",X"E6",X"0F",X"12",X"DD",X"71",X"00",X"13",X"DD",X"23",X"23",X"10",X"E5",X"C9",X"06",X"03", + X"DD",X"21",X"00",X"04",X"DD",X"19",X"7E",X"D6",X"30",X"FE",X"0A",X"38",X"01",X"3D",X"12",X"DD", + X"71",X"00",X"23",X"13",X"DD",X"23",X"10",X"EE",X"C9",X"54",X"4F",X"50",X"32",X"4E",X"44",X"33", + X"52",X"44",X"34",X"54",X"48",X"35",X"54",X"48",X"06",X"03",X"1A",X"96",X"C0",X"23",X"13",X"10", + X"F9",X"A7",X"C9",X"3A",X"31",X"4C",X"A7",X"20",X"05",X"3E",X"01",X"32",X"4A",X"4C",X"C9",X"3A", + X"31",X"4C",X"A7",X"20",X"05",X"3E",X"01",X"32",X"4B",X"4C",X"C9",X"21",X"60",X"4C",X"CB",X"66", + X"20",X"04",X"AF",X"32",X"5E",X"4C",X"3A",X"5E",X"4C",X"A7",X"20",X"06",X"CB",X"66",X"C4",X"0C", + X"00",X"D8",X"3A",X"58",X"4C",X"A7",X"C2",X"13",X"18",X"3A",X"57",X"4C",X"A7",X"C2",X"36",X"17", + X"7E",X"FE",X"00",X"CA",X"95",X"16",X"CB",X"47",X"C2",X"02",X"17",X"CB",X"5F",X"C2",X"1B",X"17", + X"CB",X"4F",X"20",X"6A",X"CB",X"57",X"C8",X"21",X"56",X"4C",X"7E",X"FE",X"02",X"20",X"49",X"3A", + X"5A",X"4C",X"FE",X"01",X"20",X"0D",X"3A",X"11",X"4C",X"FE",X"ED",X"CA",X"95",X"16",X"D2",X"95", + X"16",X"18",X"07",X"3A",X"11",X"4C",X"FE",X"CD",X"C8",X"D0",X"CB",X"4F",X"28",X"04",X"3E",X"88", + X"18",X"02",X"3E",X"8C",X"32",X"00",X"4C",X"3A",X"11",X"4C",X"C6",X"01",X"32",X"11",X"4C",X"3E", + X"08",X"32",X"45",X"4E",X"C9",X"3A",X"46",X"4E",X"FE",X"07",X"C0",X"AF",X"32",X"01",X"50",X"32", + X"45",X"4E",X"3E",X"0C",X"32",X"46",X"4E",X"C9",X"3A",X"11",X"4C",X"CB",X"4F",X"28",X"04",X"3E", + X"88",X"18",X"02",X"3E",X"8C",X"32",X"00",X"4C",X"3E",X"02",X"32",X"56",X"4C",X"C9",X"21",X"56", + X"4C",X"7E",X"FE",X"01",X"20",X"26",X"3A",X"11",X"4C",X"FE",X"02",X"CA",X"95",X"16",X"DA",X"95", + X"16",X"CB",X"4F",X"28",X"04",X"3E",X"80",X"18",X"02",X"3E",X"84",X"32",X"00",X"4C",X"3A",X"11", + X"4C",X"D6",X"01",X"32",X"11",X"4C",X"3E",X"08",X"32",X"45",X"4E",X"C9",X"3A",X"11",X"4C",X"CB", + X"4F",X"28",X"04",X"3E",X"80",X"18",X"02",X"3E",X"84",X"32",X"00",X"4C",X"3E",X"01",X"32",X"56", + X"4C",X"C9",X"CD",X"2C",X"00",X"D2",X"95",X"16",X"AF",X"32",X"59",X"4C",X"3C",X"32",X"57",X"4C", + X"3E",X"90",X"32",X"00",X"4C",X"3E",X"08",X"32",X"45",X"4E",X"C9",X"CD",X"34",X"00",X"D2",X"95", + X"16",X"3E",X"20",X"32",X"59",X"4C",X"3E",X"01",X"32",X"57",X"4C",X"3E",X"90",X"32",X"00",X"4C", + X"3E",X"08",X"32",X"45",X"4E",X"C9",X"CB",X"46",X"20",X"05",X"CB",X"5E",X"20",X"44",X"C9",X"3A", + X"59",X"4C",X"3C",X"32",X"59",X"4C",X"21",X"10",X"4C",X"34",X"FE",X"20",X"30",X"12",X"CB",X"4E", + X"28",X"07",X"21",X"00",X"4C",X"3E",X"90",X"77",X"C9",X"21",X"00",X"4C",X"3E",X"94",X"77",X"C9", + X"7E",X"E6",X"F8",X"77",X"3E",X"98",X"32",X"00",X"4C",X"21",X"10",X"4C",X"7E",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"32",X"5A",X"4C",X"AF",X"32",X"57",X"4C",X"32",X"56", + X"4C",X"C9",X"3A",X"59",X"4C",X"3D",X"32",X"59",X"4C",X"21",X"10",X"4C",X"35",X"FE",X"01",X"FA", + X"A4",X"17",X"CB",X"4E",X"28",X"07",X"21",X"00",X"4C",X"3E",X"90",X"77",X"C9",X"21",X"00",X"4C", + X"3E",X"94",X"77",X"C9",X"7E",X"3C",X"E6",X"F8",X"77",X"3E",X"98",X"32",X"00",X"4C",X"21",X"10", + X"4C",X"7E",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"32",X"5A",X"4C",X"AF", + X"32",X"57",X"4C",X"32",X"56",X"4C",X"C9",X"3A",X"57",X"4C",X"A7",X"C0",X"3A",X"58",X"4C",X"A7", + X"C0",X"3E",X"01",X"32",X"5E",X"4C",X"32",X"58",X"4C",X"3E",X"07",X"32",X"45",X"4E",X"AF",X"32", + X"5B",X"4C",X"3A",X"60",X"4C",X"CB",X"4F",X"20",X"13",X"CB",X"57",X"20",X"1E",X"3A",X"56",X"4C", + X"A7",X"28",X"0E",X"CB",X"4F",X"20",X"0F",X"21",X"E9",X"18",X"18",X"12",X"21",X"4B",X"19",X"18", + X"0D",X"21",X"A7",X"18",X"18",X"08",X"21",X"C8",X"18",X"18",X"03",X"21",X"0A",X"19",X"22",X"5C", + X"4C",X"37",X"C9",X"21",X"5B",X"4C",X"7E",X"FE",X"00",X"28",X"02",X"35",X"C9",X"3A",X"5F",X"4C", + X"A7",X"20",X"59",X"2A",X"5C",X"4C",X"7E",X"FE",X"10",X"28",X"46",X"3A",X"11",X"4C",X"FE",X"02", + X"28",X"44",X"38",X"42",X"3A",X"5A",X"4C",X"FE",X"01",X"20",X"0B",X"3A",X"11",X"4C",X"FE",X"ED", + X"28",X"34",X"30",X"32",X"18",X"09",X"3A",X"11",X"4C",X"FE",X"CD",X"28",X"29",X"30",X"27",X"DD", + X"21",X"00",X"4C",X"7E",X"DD",X"86",X"10",X"DD",X"77",X"10",X"23",X"7E",X"DD",X"86",X"11",X"DD", + X"77",X"11",X"23",X"7E",X"DD",X"77",X"00",X"23",X"7E",X"32",X"5B",X"4C",X"23",X"22",X"5C",X"4C", + X"C9",X"AF",X"32",X"58",X"4C",X"C9",X"3E",X"01",X"32",X"5F",X"4C",X"C9",X"2A",X"5C",X"4C",X"7E", + X"FE",X"10",X"28",X"1B",X"DD",X"21",X"00",X"4C",X"7E",X"DD",X"86",X"10",X"DD",X"77",X"10",X"23", + X"23",X"7E",X"DD",X"77",X"00",X"23",X"7E",X"32",X"5B",X"4C",X"23",X"22",X"5C",X"4C",X"C9",X"AF", + X"32",X"58",X"4C",X"32",X"5F",X"4C",X"C9",X"03",X"00",X"98",X"02",X"02",X"00",X"98",X"02",X"02", + X"00",X"99",X"02",X"01",X"00",X"99",X"02",X"FF",X"00",X"98",X"02",X"FE",X"00",X"98",X"02",X"FE", + X"00",X"99",X"02",X"FD",X"00",X"99",X"02",X"10",X"02",X"03",X"A1",X"02",X"02",X"02",X"A5",X"02", + X"01",X"02",X"A9",X"02",X"01",X"02",X"A9",X"02",X"FF",X"02",X"A9",X"02",X"FF",X"02",X"AD",X"02", + X"FE",X"02",X"B1",X"02",X"FE",X"03",X"B5",X"02",X"10",X"02",X"FD",X"A0",X"02",X"02",X"FE",X"A4", + X"02",X"01",X"FE",X"A8",X"02",X"01",X"FE",X"A8",X"02",X"FF",X"FE",X"A8",X"02",X"FF",X"FE",X"AC", + X"02",X"FE",X"FE",X"B0",X"02",X"FE",X"FD",X"B4",X"02",X"10",X"02",X"03",X"A1",X"02",X"02",X"03", + X"A1",X"02",X"02",X"03",X"A5",X"02",X"01",X"02",X"A5",X"02",X"01",X"02",X"A9",X"02",X"01",X"01", + X"A9",X"02",X"01",X"01",X"A9",X"02",X"00",X"01",X"A9",X"02",X"00",X"01",X"A9",X"02",X"FF",X"01", + X"A9",X"02",X"FF",X"01",X"AD",X"02",X"FF",X"02",X"AD",X"02",X"FF",X"02",X"B1",X"02",X"FE",X"03", + X"B1",X"02",X"FE",X"03",X"B5",X"02",X"FE",X"03",X"B5",X"02",X"10",X"02",X"FD",X"A0",X"02",X"02", + X"FD",X"A0",X"02",X"02",X"FE",X"A4",X"02",X"01",X"FE",X"A4",X"02",X"01",X"FE",X"A8",X"02",X"01", + X"FF",X"A8",X"02",X"01",X"FF",X"A8",X"02",X"00",X"FF",X"A8",X"02",X"00",X"FF",X"A8",X"02",X"FF", + X"FF",X"A8",X"02",X"FF",X"FF",X"AC",X"02",X"FF",X"FE",X"AC",X"02",X"FF",X"FE",X"B0",X"02",X"FE", + X"FE",X"B0",X"02",X"FE",X"FD",X"B4",X"02",X"FE",X"FD",X"B4",X"02",X"10",X"3A",X"5A",X"4C",X"FE", + X"05",X"28",X"2C",X"21",X"07",X"1B",X"3A",X"4E",X"4C",X"3D",X"87",X"5F",X"16",X"00",X"19",X"5E", + X"23",X"56",X"EB",X"3A",X"5A",X"4C",X"3D",X"87",X"5F",X"16",X"00",X"19",X"5E",X"23",X"56",X"EB", + X"3A",X"11",X"4C",X"47",X"7E",X"23",X"FE",X"00",X"28",X"05",X"B8",X"20",X"F7",X"37",X"C9",X"37", + X"3F",X"C9",X"3A",X"5A",X"4C",X"FE",X"01",X"28",X"F6",X"21",X"07",X"1B",X"3A",X"4E",X"4C",X"3D", + X"87",X"5F",X"16",X"00",X"19",X"5E",X"23",X"56",X"EB",X"3A",X"5A",X"4C",X"3D",X"18",X"C7",X"CD", + X"14",X"00",X"3A",X"3F",X"4E",X"FE",X"04",X"C8",X"3A",X"58",X"4C",X"A7",X"C0",X"3A",X"4E",X"4C", + X"3D",X"87",X"16",X"00",X"5F",X"21",X"5B",X"1F",X"19",X"5E",X"23",X"56",X"EB",X"3A",X"5A",X"4C", + X"A7",X"C8",X"3D",X"87",X"16",X"00",X"5F",X"19",X"5E",X"23",X"56",X"EB",X"3A",X"11",X"4C",X"47", + X"7E",X"A7",X"C8",X"D6",X"08",X"B8",X"28",X"03",X"23",X"18",X"F5",X"3E",X"04",X"32",X"3F",X"4E", + X"AF",X"32",X"00",X"4E",X"32",X"0A",X"4E",X"3E",X"04",X"32",X"45",X"4E",X"C9",X"DD",X"21",X"A5", + X"4C",X"FD",X"21",X"00",X"4C",X"06",X"04",X"DD",X"7E",X"00",X"A7",X"28",X"3F",X"DD",X"7E",X"04", + X"A7",X"20",X"39",X"DD",X"6E",X"05",X"DD",X"66",X"06",X"11",X"10",X"00",X"19",X"7E",X"4F",X"FD", + X"7E",X"10",X"91",X"F2",X"58",X"1A",X"ED",X"44",X"FE",X"0C",X"30",X"20",X"23",X"7E",X"FD",X"96", + X"11",X"F2",X"66",X"1A",X"ED",X"44",X"FE",X"0A",X"30",X"12",X"3E",X"04",X"32",X"3F",X"4E",X"AF", + X"32",X"00",X"4E",X"32",X"0A",X"4E",X"3E",X"04",X"32",X"45",X"4E",X"C9",X"11",X"08",X"00",X"DD", + X"19",X"10",X"B4",X"DD",X"21",X"C5",X"4C",X"FD",X"21",X"00",X"4C",X"06",X"03",X"DD",X"7E",X"00", + X"A7",X"28",X"39",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"11",X"10",X"00",X"19",X"7E",X"4F",X"FD", + X"7E",X"10",X"91",X"F2",X"A8",X"1A",X"ED",X"44",X"FE",X"0C",X"30",X"20",X"23",X"7E",X"FD",X"96", + X"11",X"F2",X"B6",X"1A",X"ED",X"44",X"FE",X"0A",X"30",X"12",X"3E",X"04",X"32",X"3F",X"4E",X"AF", + X"32",X"00",X"4E",X"32",X"0A",X"4E",X"3E",X"04",X"32",X"45",X"4E",X"C9",X"11",X"07",X"00",X"DD", + X"19",X"10",X"BA",X"C9",X"3A",X"20",X"4C",X"FE",X"01",X"28",X"1D",X"3A",X"47",X"4C",X"FE",X"01", + X"28",X"0A",X"3A",X"30",X"4C",X"E6",X"1F",X"32",X"62",X"4C",X"18",X"08",X"3A",X"2F",X"4C",X"E6", + X"1F",X"32",X"61",X"4C",X"32",X"60",X"4C",X"C9",X"3A",X"63",X"4C",X"E6",X"1F",X"18",X"F5",X"00", + X"00",X"00",X"01",X"00",X"03",X"00",X"05",X"2F",X"1C",X"BF",X"1B",X"2F",X"1B",X"73",X"1B",X"EB", + X"1B",X"A7",X"1C",X"5B",X"1C",X"EB",X"1C",X"1F",X"1D",X"6B",X"1D",X"FB",X"1D",X"AF",X"1D",X"47", + X"1E",X"AF",X"1E",X"83",X"1E",X"1F",X"1D",X"FB",X"1D",X"DB",X"1E",X"AF",X"1D",X"1F",X"1F",X"37", + X"1B",X"48",X"1B",X"51",X"1B",X"62",X"1B",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"B0", + X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"00",X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17", + X"00",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6", + X"B7",X"00",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"C8",X"C9",X"CA",X"CB",X"CC",X"CD", + X"CE",X"CF",X"00",X"7B",X"1B",X"8C",X"1B",X"9D",X"1B",X"AE",X"1B",X"38",X"39",X"3A",X"3B",X"3C", + X"3D",X"3E",X"3F",X"90",X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"00",X"08",X"09",X"0A",X"0B", + X"0C",X"0D",X"0E",X"0F",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD",X"BE",X"BF",X"00",X"28",X"29",X"2A", + X"2B",X"2C",X"2D",X"2E",X"2F",X"A0",X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",X"00",X"08",X"09", + X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"C8",X"C9",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"C7", + X"1B",X"D0",X"1B",X"D9",X"1B",X"E2",X"1B",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"00", + X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"00",X"80",X"81",X"82",X"83",X"84",X"85",X"86", + X"87",X"00",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"00",X"F3",X"1B",X"04",X"1C",X"0D", + X"1C",X"1E",X"1C",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"B0",X"B1",X"B2",X"B3",X"B4", + X"B5",X"B6",X"B7",X"00",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"00",X"18",X"19",X"1A", + X"1B",X"1C",X"1D",X"1E",X"1F",X"A0",X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",X"00",X"08",X"09", + X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"00",X"37", + X"1C",X"40",X"1C",X"49",X"1C",X"52",X"1C",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"00", + X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"00",X"80",X"81",X"82",X"83",X"84",X"85",X"86", + X"87",X"00",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"00",X"63",X"1C",X"74",X"1C",X"85", + X"1C",X"96",X"1C",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"90",X"91",X"92",X"93",X"94", + X"95",X"96",X"97",X"00",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"B8",X"B9",X"BA",X"BB", + X"BC",X"BD",X"BE",X"BF",X"00",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"90",X"91",X"92", + X"93",X"94",X"95",X"96",X"97",X"00",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"C8",X"C9", + X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"AF",X"1C",X"B8",X"1C",X"C9",X"1C",X"DA",X"1C",X"40", + X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"00",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"00",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E", + X"5F",X"C8",X"C9",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"18",X"19",X"1A",X"1B",X"1C",X"1D", + X"1E",X"1F",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"00",X"F3",X"1C",X"FC",X"1C",X"05", + X"1D",X"16",X"1D",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"00",X"88",X"89",X"8A",X"8B", + X"8C",X"8D",X"8E",X"8F",X"00",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"C8",X"C9",X"CA", + X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"00",X"27", + X"1D",X"38",X"1D",X"49",X"1D",X"5A",X"1D",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"A0", + X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",X"00",X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17", + X"C8",X"C9",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E", + X"0F",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"00",X"40",X"41",X"42",X"43",X"44",X"45", + X"46",X"47",X"C8",X"C9",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"73",X"1D",X"84",X"1D",X"95", + X"1D",X"9E",X"1D",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"90",X"91",X"92",X"93",X"94", + X"95",X"96",X"97",X"00",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"C8",X"C9",X"CA",X"CB", + X"CC",X"CD",X"CE",X"CF",X"00",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"00",X"18",X"19", + X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"C8",X"C9",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"B7", + X"1D",X"C8",X"1D",X"D9",X"1D",X"EA",X"1D",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"C0", + X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47", + X"90",X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"00",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E", + X"4F",X"C8",X"C9",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"08",X"09",X"0A",X"0B",X"0C",X"0D", + X"0E",X"0F",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"00",X"03",X"1E",X"14",X"1E",X"25", + X"1E",X"36",X"1E",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"80",X"81",X"82",X"83",X"84", + X"85",X"86",X"87",X"00",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"B8",X"B9",X"BA",X"BB", + X"BC",X"BD",X"BE",X"BF",X"00",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"C8",X"C9",X"CA", + X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"B8",X"B9", + X"BA",X"BB",X"BC",X"BD",X"BE",X"BF",X"00",X"4F",X"1E",X"60",X"1E",X"69",X"1E",X"7A",X"1E",X"08", + X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00", + X"C8",X"C9",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"50",X"51",X"52",X"53",X"54",X"55",X"56", + X"57",X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"00",X"10",X"11",X"12",X"13",X"14",X"15", + X"16",X"17",X"00",X"8B",X"1E",X"94",X"1E",X"9D",X"1E",X"A6",X"1E",X"40",X"41",X"42",X"43",X"44", + X"45",X"46",X"47",X"00",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"00",X"60",X"61",X"62", + X"63",X"64",X"65",X"66",X"67",X"00",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"00",X"B7", + X"1E",X"C0",X"1E",X"C9",X"1E",X"D2",X"1E",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"00", + X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17",X"00",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E", + X"0F",X"00",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"00",X"E3",X"1E",X"EC",X"1E",X"FD", + X"1E",X"0E",X"1F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"00",X"08",X"09",X"0A",X"0B", + X"0C",X"0D",X"0E",X"0F",X"C8",X"C9",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"30",X"31",X"32", + X"33",X"34",X"35",X"36",X"37",X"90",X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"00",X"08",X"09", + X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"C8",X"C9",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"27", + X"1F",X"38",X"1F",X"41",X"1F",X"52",X"1F",X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17",X"C0", + X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF", + X"00",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E", + X"8F",X"00",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"00",X"E8",X"22",X"4A",X"21",X"83", + X"1F",X"6A",X"20",X"F9",X"21",X"7E",X"24",X"57",X"23",X"7D",X"25",X"84",X"26",X"AB",X"27",X"D1", + X"29",X"8A",X"28",X"10",X"2B",X"96",X"2D",X"5F",X"2C",X"84",X"26",X"D1",X"29",X"BD",X"2E",X"8A", + X"28",X"04",X"30",X"8D",X"1F",X"A6",X"1F",X"DF",X"1F",X"F8",X"1F",X"41",X"20",X"70",X"71",X"72", + X"73",X"74",X"75",X"76",X"77",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"A0",X"A1",X"A2", + X"A3",X"A4",X"A5",X"A6",X"A7",X"00",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59", + X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"68",X"69", + X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79", + X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"00",X"50", + X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"A0", + X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",X"00",X"18",X"19",X"1A",X"1B",X"1C",X"1D",X"1E",X"1F", + X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E",X"5F", + X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F", + X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F", + X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"A0",X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7", + X"00",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E", + X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE", + X"AF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"74",X"20",X"8D",X"20",X"B6",X"20", + X"DF",X"20",X"08",X"21",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"A8",X"A9",X"AA",X"AB", + X"AC",X"AD",X"AE",X"AF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"28",X"29",X"2A", + X"2B",X"2C",X"2D",X"2E",X"2F",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72", + X"73",X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"B0",X"B1",X"B2", + X"B3",X"B4",X"B5",X"B6",X"B7",X"00",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"68",X"69", + X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79", + X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"00",X"58", + X"59",X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80", + X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"B8", + X"B9",X"BA",X"BB",X"BC",X"BD",X"BE",X"BF",X"00",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27", + X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67", + X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77", + X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"A0",X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7", + X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"D3",X"54",X"21",X"65",X"21",X"8E",X"21", + X"A7",X"21",X"C8",X"21",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"A8",X"A9",X"AA",X"AB", + X"AC",X"AD",X"AE",X"AF",X"00",X"18",X"19",X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"50",X"51",X"52", + X"53",X"54",X"55",X"56",X"57",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"90",X"91",X"92", + X"93",X"94",X"95",X"96",X"97",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"58",X"59", + X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"A0",X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",X"B8",X"B9", + X"BA",X"BB",X"BC",X"BD",X"BE",X"BF",X"00",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"70", + X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"C0", + X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"18",X"19",X"1A",X"1B",X"1C",X"1D",X"1E",X"1F", + X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57", + X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77", + X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"00",X"03",X"22",X"14",X"22",X"45",X"22",X"6E", + X"22",X"AF",X"22",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"98",X"99",X"9A",X"9B",X"9C", + X"9D",X"9E",X"9F",X"00",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"68",X"69",X"6A",X"6B", + X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B", + X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"A0",X"A1",X"A2",X"A3", + X"A4",X"A5",X"A6",X"A7",X"00",X"30",X"31",X"32",X"33",X"34",X"35",X"36",X"37",X"48",X"49",X"4A", + X"4B",X"4C",X"4D",X"4E",X"4F",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"90",X"91",X"92", + X"93",X"94",X"95",X"96",X"97",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"30",X"31", + X"32",X"33",X"34",X"35",X"36",X"37",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59", + X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"68",X"69", + X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79", + X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"00",X"28", + X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"60", + X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70", + X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"90", + X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"00",X"F2",X"22",X"FB",X"22",X"04",X"23",X"1D",X"23", + X"36",X"23",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD",X"BE",X"BF",X"00",X"48",X"49",X"4A",X"4B",X"4C", + X"4D",X"4E",X"4F",X"00",X"30",X"31",X"32",X"33",X"34",X"35",X"36",X"37",X"70",X"71",X"72",X"73", + X"74",X"75",X"76",X"77",X"A0",X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",X"00",X"38",X"39",X"3A", + X"3B",X"3C",X"3D",X"3E",X"3F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"C0",X"C1",X"C2", + X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"18",X"19",X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"40",X"41", + X"42",X"43",X"44",X"45",X"46",X"47",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"C0",X"C1", + X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"61",X"23",X"82",X"23",X"B3",X"23",X"EC",X"23",X"25", + X"24",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E", + X"6F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6", + X"B7",X"00",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"38",X"39",X"3A",X"3B",X"3C",X"3D", + X"3E",X"3F",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75", + X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5", + X"B6",X"B7",X"00",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E",X"5E",X"60",X"61",X"62",X"63",X"64", + X"65",X"66",X"67",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74", + X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84", + X"85",X"86",X"87",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"00",X"20",X"21",X"22",X"23", + X"24",X"25",X"26",X"27",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"70",X"71",X"72",X"73", + X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83", + X"84",X"85",X"86",X"87",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"B8",X"B9",X"BA",X"BB", + X"BC",X"BD",X"BE",X"BF",X"00",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"50",X"51",X"52", + X"53",X"54",X"55",X"56",X"57",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"60",X"61",X"62", + X"63",X"64",X"65",X"66",X"67",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72", + X"73",X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82", + X"83",X"84",X"85",X"86",X"87",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"A8",X"A9",X"AA", + X"AB",X"AC",X"AD",X"AE",X"AF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"88",X"24", + X"B1",X"24",X"EA",X"24",X"1B",X"25",X"54",X"25",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67", + X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87", + X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7", + X"00",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E", + X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E", + X"7F",X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6", + X"B7",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD",X"BE",X"BF",X"00",X"28",X"29",X"2A",X"2B",X"2C",X"2D", + X"2E",X"2F",X"30",X"31",X"32",X"33",X"34",X"35",X"36",X"37",X"70",X"71",X"72",X"73",X"74",X"75", + X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD", + X"AE",X"AF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"30",X"31",X"32",X"33",X"34", + X"35",X"36",X"37",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"70",X"71",X"72",X"73",X"74", + X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84", + X"85",X"86",X"87",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"C0",X"C1",X"C2",X"C3",X"C4", + X"C5",X"C6",X"C7",X"00",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"60",X"61",X"62",X"63", + X"64",X"65",X"66",X"67",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73", + X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"00",X"87",X"25",X"A8", + X"25",X"F1",X"25",X"1A",X"26",X"53",X"26",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"80", + X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"C8", + X"C9",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"00",X"18",X"19",X"1A",X"1B",X"1C",X"1D",X"1E",X"1F", + X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F", + X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E",X"5F", + X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"A0",X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7", + X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7", + X"00",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E", + X"3F",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"60",X"61",X"62",X"63",X"64",X"65",X"66", + X"67",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"00",X"38",X"39",X"3A",X"3B",X"3C",X"3D", + X"3E",X"3F",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"70",X"71",X"72",X"73",X"74",X"75", + X"76",X"77",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"90",X"91",X"92",X"93",X"94",X"95", + X"96",X"97",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD", + X"BE",X"BF",X"00",X"18",X"19",X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"30",X"31",X"32",X"33",X"34", + X"35",X"36",X"37",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"78",X"79",X"7A",X"7B",X"7C", + X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"98",X"99",X"9A",X"9B",X"9C", + X"9D",X"9E",X"9F",X"00",X"8E",X"26",X"B7",X"26",X"E8",X"26",X"29",X"27",X"62",X"27",X"20",X"21", + X"22",X"23",X"24",X"25",X"26",X"27",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"68",X"69", + X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"98",X"99", + X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"00",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58", + X"59",X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"68", + X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"98", + X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"00",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F", + X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67", + X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77", + X"90",X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF", + X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"20",X"21",X"22",X"23",X"24",X"25",X"26", + X"27",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E", + X"5F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"90",X"91",X"92",X"93",X"94",X"95",X"96", + X"97",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6", + X"C7",X"00",X"18",X"19",X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"20",X"21",X"22",X"23",X"24",X"25", + X"26",X"27",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"58",X"59",X"5A",X"5B",X"5C",X"5D", + X"5E",X"5F",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"68",X"69",X"6A",X"6B",X"6C",X"6D", + X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD", + X"AE",X"AF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"B5",X"27",X"B6",X"27",X"E7", + X"27",X"18",X"28",X"59",X"28",X"00",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"40",X"41", + X"42",X"43",X"44",X"45",X"46",X"47",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71", + X"72",X"73",X"74",X"75",X"76",X"77",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"C0",X"C1", + X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"38", + X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"90", + X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"C0", + X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"30",X"31",X"32",X"33",X"34",X"35",X"36",X"37", + X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47", + X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87", + X"A0",X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF", + X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"30",X"31",X"32",X"33",X"34",X"35",X"36", + X"37",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E", + X"6F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE", + X"AF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"94",X"28",X"C5",X"28",X"FE",X"28", + X"3F",X"29",X"88",X"29",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"38",X"39",X"3A",X"3B", + X"3C",X"3D",X"3E",X"3F",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"68",X"69",X"6A",X"6B", + X"6C",X"6D",X"6E",X"6F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"98",X"99",X"9A",X"9B", + X"9C",X"9D",X"9E",X"9F",X"00",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"38",X"39",X"3A", + X"3B",X"3C",X"3D",X"3E",X"3F",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"68",X"69",X"6A", + X"6B",X"6C",X"6D",X"6E",X"6F",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"88",X"89",X"8A", + X"8B",X"8C",X"8D",X"8E",X"8F",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"8E",X"8F",X"00",X"18",X"19", + X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"60",X"61", + X"62",X"63",X"64",X"65",X"66",X"67",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71", + X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"A8",X"A9", + X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"20", + X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"40", + X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"68", + X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"A0", + X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"C0", + X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27", + X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57", + X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77", + X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87", + X"A0",X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD",X"BE",X"BF", + X"00",X"DB",X"29",X"FC",X"29",X"45",X"2A",X"7E",X"2A",X"C7",X"2A",X"20",X"21",X"22",X"23",X"24", + X"25",X"26",X"27",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"58",X"59",X"5A",X"5B",X"5C", + X"5D",X"5E",X"5F",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"00",X"20",X"21",X"22",X"23", + X"24",X"25",X"26",X"27",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"58",X"59",X"5A",X"5B", + X"5C",X"5D",X"5E",X"5F",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"68",X"69",X"6A",X"6B", + X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B", + X"7C",X"7D",X"7E",X"7F",X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"B0",X"B1",X"B2",X"B3", + X"B4",X"B5",X"B6",X"B7",X"00",X"30",X"31",X"32",X"33",X"34",X"35",X"36",X"37",X"60",X"61",X"62", + X"63",X"64",X"65",X"66",X"67",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72", + X"73",X"74",X"75",X"76",X"77",X"90",X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"A8",X"A9",X"AA", + X"AB",X"AC",X"AD",X"AE",X"AF",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"00",X"30",X"31", + X"32",X"33",X"34",X"35",X"36",X"37",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59", + X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"70",X"71", + X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81", + X"82",X"83",X"84",X"85",X"86",X"87",X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"B0",X"B1", + X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"00",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"30", + X"31",X"32",X"33",X"34",X"35",X"36",X"37",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"60", + X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70", + X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"98", + X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"00", + X"1A",X"2B",X"3B",X"2B",X"8C",X"2B",X"DD",X"2B",X"1E",X"2C",X"60",X"61",X"62",X"63",X"64",X"65", + X"66",X"67",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"80",X"81",X"82",X"83",X"84",X"85", + X"86",X"87",X"90",X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"00",X"20",X"21",X"22",X"23",X"24", + X"25",X"26",X"27",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"40",X"41",X"42",X"43",X"44", + X"45",X"46",X"47",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"60",X"61",X"62",X"63",X"64", + X"65",X"66",X"67",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"80",X"81",X"82",X"83",X"84", + X"85",X"86",X"87",X"90",X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"A8",X"A9",X"AA",X"AB",X"AC", + X"AD",X"AE",X"AF",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD",X"BE",X"BF",X"00",X"18",X"19",X"1A",X"1B", + X"1C",X"1D",X"1E",X"1F",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"48",X"49",X"4A",X"4B", + X"4C",X"4D",X"4E",X"4F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B", + X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"88",X"89",X"8A",X"8B", + X"8C",X"8D",X"8E",X"8F",X"90",X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"B8",X"B9",X"BA",X"BB", + X"BC",X"BD",X"BE",X"BF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"28",X"29",X"2A", + X"2B",X"2C",X"2D",X"2E",X"2F",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"50",X"51",X"52", + X"53",X"54",X"55",X"56",X"57",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72", + X"73",X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"90",X"91",X"92", + X"93",X"94",X"95",X"96",X"97",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"30",X"31", + X"32",X"33",X"34",X"35",X"36",X"37",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"50",X"51", + X"52",X"53",X"54",X"55",X"56",X"57",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"80",X"81", + X"82",X"83",X"84",X"85",X"86",X"87",X"90",X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"A8",X"A9", + X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD",X"BE",X"BF",X"00",X"69", + X"2C",X"8A",X"2C",X"CB",X"2C",X"14",X"2D",X"55",X"2D",X"60",X"61",X"62",X"63",X"64",X"65",X"66", + X"67",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E", + X"9F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"00",X"28",X"29",X"2A",X"2B",X"2C",X"2D", + X"2E",X"2F",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"71",X"72",X"73",X"74",X"75", + X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"90",X"91",X"92",X"93",X"94",X"95", + X"96",X"97",X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5", + X"B6",X"B7",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD",X"BE",X"BF",X"00",X"20",X"21",X"22",X"23",X"24", + X"25",X"26",X"27",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"30",X"31",X"32",X"33",X"34", + X"35",X"36",X"37",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"50",X"51",X"52",X"53",X"54", + X"55",X"56",X"57",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"90",X"91",X"92",X"93",X"94", + X"95",X"96",X"97",X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"A0",X"A1",X"A2",X"A3",X"A4", + X"A5",X"A6",X"A7",X"00",X"18",X"19",X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"28",X"29",X"2A",X"2B", + X"2C",X"2D",X"2E",X"2F",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"78",X"79",X"7A",X"7B", + X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"A0",X"A1",X"A2",X"A3", + X"A4",X"A5",X"A6",X"A7",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"C0",X"C1",X"C2",X"C3", + X"C4",X"C5",X"C6",X"C7",X"00",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"48",X"49",X"4A", + X"4B",X"4C",X"4D",X"4E",X"4F",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59",X"5A", + X"5B",X"5C",X"5D",X"5E",X"5F",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"78",X"79",X"7A", + X"7B",X"7C",X"7D",X"7E",X"7F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"C0",X"C1",X"C2", + X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"A0",X"2D",X"C1",X"2D",X"DA",X"2D",X"3B",X"2E",X"74",X"2E", + X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67", + X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F", + X"00",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E", + X"9F",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD",X"BE",X"BF",X"00",X"28",X"29",X"2A",X"2B",X"2C",X"2D", + X"2E",X"2F",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"48",X"49",X"4A",X"4B",X"4C",X"4D", + X"4E",X"4F",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59",X"5A",X"5B",X"5C",X"5D", + X"5E",X"5F",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"80",X"81",X"82",X"83",X"84",X"85", + X"86",X"87",X"90",X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"98",X"99",X"9A",X"9B",X"9C",X"9D", + X"9E",X"9F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD", + X"BE",X"BF",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"20",X"21",X"22",X"23",X"24", + X"25",X"26",X"27",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"58",X"59",X"5A",X"5B",X"5C", + X"5D",X"5E",X"5F",X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"90",X"91",X"92",X"93",X"94", + X"95",X"96",X"97",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"C0",X"C1",X"C2",X"C3",X"C4", + X"C5",X"C6",X"C7",X"00",X"18",X"19",X"1A",X"1B",X"1C",X"1D",X"1E",X"1F",X"20",X"21",X"22",X"23", + X"24",X"25",X"26",X"27",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"58",X"59",X"5A",X"5B", + X"5C",X"5D",X"5E",X"5F",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"78",X"79",X"7A",X"7B", + X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"A8",X"A9",X"AA",X"AB", + X"AC",X"AD",X"AE",X"AF",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"00",X"C7",X"2E",X"00", + X"2F",X"39",X"2F",X"8A",X"2F",X"BB",X"2F",X"30",X"31",X"32",X"33",X"34",X"35",X"36",X"37",X"48", + X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"90", + X"91",X"92",X"93",X"94",X"95",X"96",X"97",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"C0", + X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"C8",X"C9",X"CA",X"CB",X"CC",X"CD",X"CE",X"CF",X"00", + X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F", + X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F", + X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7", + X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"20",X"21",X"22",X"23",X"24",X"25",X"26", + X"27",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E", + X"4F",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E", + X"6F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E", + X"8F",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6", + X"B7",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD",X"BE",X"BF",X"00",X"48",X"49",X"4A",X"4B",X"4C",X"4D", + X"4E",X"4F",X"58",X"59",X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"60",X"61",X"62",X"63",X"64",X"65", + X"66",X"67",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85", + X"86",X"87",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"00",X"20",X"21",X"22",X"23",X"24", + X"25",X"26",X"27",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"50",X"51",X"52",X"53",X"54", + X"55",X"56",X"57",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"70",X"71",X"72",X"73",X"74", + X"75",X"76",X"77",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"88",X"89",X"8A",X"8B",X"8C", + X"8D",X"8E",X"8F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"C0",X"C1",X"C2",X"C3",X"C4", + X"C5",X"C6",X"C7",X"00",X"0E",X"30",X"37",X"30",X"78",X"30",X"99",X"30",X"DA",X"30",X"58",X"59", + X"5A",X"5B",X"5C",X"5D",X"5E",X"5F",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"78",X"79", + X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"88",X"89", + X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"00",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"40", + X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"48",X"49",X"4A",X"4B",X"4C",X"4D",X"4E",X"4F",X"50", + X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"88", + X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"98",X"99",X"9A",X"9B",X"9C",X"9D",X"9E",X"9F",X"A0", + X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",X"00",X"68",X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F", + X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F", + X"C0",X"C1",X"C2",X"C3",X"C4",X"C5",X"C6",X"C7",X"00",X"30",X"31",X"32",X"33",X"34",X"35",X"36", + X"37",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F",X"40",X"41",X"42",X"43",X"44",X"45",X"46", + X"47",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"80",X"81",X"82",X"83",X"84",X"85",X"86", + X"87",X"A0",X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE", + X"AF",X"B8",X"B9",X"BA",X"BB",X"BC",X"BD",X"BE",X"BF",X"00",X"18",X"19",X"1A",X"1B",X"1C",X"1D", + X"1E",X"1F",X"28",X"29",X"2A",X"2B",X"2C",X"2D",X"2E",X"2F",X"38",X"39",X"3A",X"3B",X"3C",X"3D", + X"3E",X"3F",X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"60",X"61",X"62",X"63",X"64",X"65", + X"66",X"67",X"88",X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"98",X"99",X"9A",X"9B",X"9C",X"9D", + X"9E",X"9F",X"B0",X"B1",X"B2",X"B3",X"B4",X"B5",X"B6",X"B7",X"C0",X"C1",X"C2",X"C3",X"C4",X"C5", + X"C6",X"C7",X"00",X"46",X"3A",X"4E",X"4C",X"3D",X"21",X"00",X"80",X"16",X"00",X"5F",X"19",X"7E", + X"21",X"14",X"80",X"E6",X"1F",X"87",X"16",X"00",X"5F",X"19",X"5E",X"23",X"56",X"1A",X"4F",X"21", + X"40",X"41",X"DD",X"21",X"00",X"04",X"EB",X"DD",X"19",X"EB",X"1A",X"FE",X"FF",X"28",X"40",X"FE", + X"00",X"28",X"11",X"FE",X"01",X"28",X"22",X"77",X"13",X"1A",X"4F",X"DD",X"71",X"00",X"13",X"23", + X"DD",X"23",X"18",X"E6",X"7D",X"E6",X"E0",X"C6",X"20",X"6F",X"3E",X"00",X"8C",X"67",X"DD",X"21", + X"00",X"04",X"EB",X"DD",X"19",X"EB",X"13",X"18",X"D1",X"13",X"1A",X"47",X"13",X"1A",X"08",X"13", + X"1A",X"4F",X"08",X"13",X"77",X"DD",X"71",X"00",X"23",X"DD",X"23",X"10",X"F7",X"18",X"BB",X"F7", + X"CD",X"03",X"00",X"CD",X"24",X"00",X"C9",X"21",X"E0",X"40",X"DD",X"21",X"00",X"04",X"EB",X"DD", + X"19",X"EB",X"3E",X"3D",X"0E",X"05",X"06",X"1C",X"77",X"DD",X"71",X"00",X"23",X"DD",X"23",X"10", + X"F7",X"21",X"60",X"43",X"DD",X"21",X"00",X"04",X"EB",X"DD",X"19",X"EB",X"3E",X"3E",X"06",X"20", + X"77",X"DD",X"71",X"00",X"23",X"DD",X"23",X"10",X"F7",X"21",X"9C",X"40",X"DD",X"21",X"00",X"04", + X"EB",X"DD",X"19",X"EB",X"11",X"20",X"00",X"3E",X"3F",X"06",X"14",X"77",X"DD",X"71",X"00",X"19", + X"DD",X"19",X"10",X"F7",X"21",X"96",X"40",X"DD",X"21",X"96",X"44",X"3E",X"1B",X"0E",X"E0",X"06", + X"14",X"71",X"DD",X"77",X"00",X"2B",X"DD",X"2B",X"10",X"F7",X"C9",X"3A",X"4E",X"4C",X"3D",X"87", + X"21",X"B4",X"94",X"16",X"00",X"5F",X"19",X"EB",X"21",X"A8",X"40",X"0E",X"0A",X"1A",X"47",X"13", + X"1A",X"13",X"C5",X"D5",X"E5",X"CD",X"D7",X"00",X"E1",X"D1",X"C1",X"23",X"23",X"0D",X"20",X"ED", + X"C9",X"21",X"DD",X"40",X"11",X"40",X"00",X"3E",X"0F",X"06",X"00",X"0E",X"08",X"F5",X"C5",X"D5", + X"E5",X"CD",X"D7",X"00",X"E1",X"D1",X"C1",X"F1",X"19",X"0D",X"20",X"F1",X"C9",X"21",X"DD",X"40", + X"3A",X"4D",X"4C",X"A7",X"28",X"07",X"47",X"11",X"40",X"00",X"19",X"10",X"FD",X"E5",X"3A",X"4E", + X"4C",X"3D",X"87",X"4F",X"87",X"47",X"3E",X"70",X"80",X"47",X"16",X"00",X"59",X"21",X"C6",X"94", + X"19",X"78",X"46",X"E1",X"C3",X"D7",X"00",X"3A",X"4E",X"4C",X"3D",X"87",X"21",X"26",X"96",X"5F", + X"16",X"00",X"19",X"5E",X"23",X"56",X"1A",X"FE",X"FF",X"C8",X"EB",X"23",X"5E",X"23",X"56",X"23", + X"EB",X"A7",X"28",X"0C",X"1A",X"47",X"13",X"1A",X"13",X"D5",X"CD",X"D7",X"00",X"D1",X"18",X"E6", + X"1A",X"4F",X"DD",X"21",X"00",X"04",X"EB",X"DD",X"19",X"EB",X"DD",X"71",X"00",X"13",X"1A",X"77", + X"13",X"18",X"D3",X"3A",X"4E",X"4C",X"3D",X"87",X"21",X"EE",X"94",X"16",X"00",X"5F",X"19",X"5E", + X"23",X"56",X"DD",X"21",X"02",X"4C",X"06",X"04",X"1A",X"DD",X"77",X"00",X"13",X"1A",X"DD",X"77", + X"01",X"13",X"1A",X"DD",X"77",X"11",X"13",X"1A",X"DD",X"77",X"10",X"13",X"DD",X"23",X"DD",X"23", + X"10",X"E6",X"C9",X"3A",X"4C",X"4C",X"A7",X"C0",X"3A",X"34",X"4C",X"A7",X"C8",X"3A",X"66",X"4C", + X"A7",X"C8",X"21",X"65",X"4C",X"35",X"C0",X"36",X"26",X"2B",X"35",X"28",X"4C",X"7E",X"FE",X"0F", + X"38",X"41",X"FE",X"32",X"38",X"39",X"0E",X"1B",X"7E",X"47",X"E6",X"07",X"57",X"78",X"0F",X"0F", + X"0F",X"E6",X"1F",X"47",X"FE",X"00",X"21",X"96",X"40",X"DD",X"21",X"96",X"44",X"3E",X"E0",X"28", + X"09",X"77",X"DD",X"71",X"00",X"2B",X"DD",X"2B",X"10",X"F7",X"7A",X"A7",X"28",X"09",X"3E",X"01", + X"82",X"3D",X"77",X"DD",X"71",X"00",X"C9",X"3E",X"0A",X"77",X"DD",X"36",X"00",X"00",X"C9",X"0E", + X"18",X"18",X"02",X"0E",X"1D",X"3E",X"01",X"18",X"BF",X"3E",X"04",X"32",X"3F",X"4E",X"AF",X"32", + X"00",X"4E",X"32",X"0A",X"4E",X"3E",X"04",X"32",X"45",X"4E",X"C9",X"CD",X"F7",X"05",X"3A",X"64", + X"4C",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"21",X"82",X"33",X"87",X"16",X"00",X"5F",X"19",X"5E", + X"23",X"56",X"21",X"43",X"4C",X"73",X"23",X"72",X"D5",X"F5",X"CD",X"F7",X"05",X"F1",X"D1",X"21", + X"67",X"4C",X"36",X"00",X"23",X"72",X"23",X"73",X"11",X"67",X"4C",X"21",X"90",X"41",X"CD",X"99", + X"03",X"C9",X"05",X"00",X"10",X"00",X"50",X"00",X"00",X"01",X"00",X"05",X"00",X"10",X"00",X"50", + X"00",X"70",X"00",X"80",X"00",X"90",X"3A",X"4E",X"4C",X"3D",X"87",X"21",X"70",X"9C",X"16",X"00", + X"5F",X"19",X"5E",X"23",X"56",X"21",X"6A",X"4C",X"EB",X"01",X"25",X"00",X"ED",X"B0",X"21",X"00", + X"00",X"22",X"43",X"4C",X"AF",X"32",X"DA",X"4C",X"32",X"A9",X"4C",X"32",X"B1",X"4C",X"32",X"B9", + X"4C",X"32",X"C1",X"4C",X"3A",X"4E",X"4C",X"3D",X"87",X"21",X"0D",X"9F",X"16",X"00",X"5F",X"19", + X"5E",X"23",X"56",X"21",X"8F",X"4C",X"EB",X"01",X"15",X"00",X"ED",X"B0",X"AF",X"32",X"A4",X"4C", + X"C9",X"3A",X"A4",X"4C",X"87",X"21",X"9A",X"A0",X"16",X"00",X"5F",X"19",X"11",X"43",X"4C",X"7E", + X"12",X"23",X"13",X"7E",X"12",X"C9",X"3A",X"4E",X"4C",X"3D",X"21",X"B2",X"A0",X"87",X"16",X"00", + X"5F",X"19",X"5E",X"23",X"56",X"21",X"C5",X"4C",X"DD",X"21",X"0A",X"4C",X"1A",X"FE",X"FF",X"C8", + X"DD",X"77",X"00",X"13",X"1A",X"DD",X"77",X"01",X"13",X"1A",X"DD",X"77",X"10",X"13",X"1A",X"DD", + X"77",X"11",X"36",X"01",X"13",X"23",X"06",X"06",X"1A",X"77",X"13",X"23",X"10",X"FA",X"DD",X"23", + X"DD",X"23",X"18",X"D8",X"21",X"DA",X"4C",X"06",X"24",X"AF",X"77",X"23",X"10",X"FC",X"21",X"C5", + X"4C",X"06",X"15",X"77",X"23",X"10",X"FC",X"21",X"A5",X"4C",X"06",X"20",X"77",X"23",X"10",X"FC", + X"C9",X"CD",X"7E",X"34",X"3A",X"47",X"4C",X"FE",X"01",X"20",X"05",X"21",X"48",X"4C",X"18",X"03", + X"21",X"49",X"4C",X"7E",X"FE",X"00",X"C8",X"4F",X"21",X"81",X"43",X"06",X"14",X"3E",X"FC",X"F5", + X"C5",X"E5",X"CD",X"D7",X"00",X"E1",X"C1",X"F1",X"23",X"23",X"0D",X"20",X"F2",X"C9",X"DD",X"21", + X"81",X"43",X"3E",X"0F",X"06",X"10",X"DD",X"77",X"00",X"DD",X"77",X"20",X"DD",X"23",X"10",X"F6", + X"C9",X"3A",X"20",X"4C",X"3D",X"20",X"10",X"3A",X"53",X"4E",X"A7",X"28",X"0A",X"AF",X"32",X"45", + X"4E",X"3E",X"0C",X"32",X"46",X"4E",X"C9",X"AF",X"32",X"C0",X"50",X"3A",X"45",X"4E",X"A7",X"28", + X"28",X"3D",X"47",X"3A",X"46",X"4E",X"FE",X"0C",X"28",X"05",X"B8",X"28",X"29",X"38",X"20",X"78", + X"32",X"46",X"4E",X"CD",X"7E",X"35",X"CD",X"9B",X"35",X"CD",X"C2",X"35",X"CD",X"F0",X"35",X"3E", + X"01",X"32",X"01",X"50",X"AF",X"32",X"45",X"4E",X"C9",X"3A",X"46",X"4E",X"FE",X"0C",X"C8",X"CD", + X"ED",X"34",X"CD",X"27",X"35",X"C9",X"FE",X"07",X"28",X"F5",X"C3",X"BD",X"34",X"3A",X"42",X"4E", + X"A7",X"CA",X"00",X"35",X"3A",X"42",X"4E",X"FE",X"FF",X"CA",X"00",X"35",X"3D",X"32",X"42",X"4E", + X"3A",X"43",X"4E",X"A7",X"CA",X"13",X"35",X"3A",X"43",X"4E",X"FE",X"FF",X"CA",X"13",X"35",X"3D", + X"32",X"43",X"4E",X"3A",X"44",X"4E",X"A7",X"CA",X"26",X"35",X"3A",X"44",X"4E",X"FE",X"FF",X"CA", + X"26",X"35",X"3D",X"32",X"44",X"4E",X"C9",X"3A",X"42",X"4E",X"FE",X"00",X"CA",X"3A",X"35",X"3A", + X"42",X"4E",X"FE",X"FF",X"CA",X"71",X"35",X"C3",X"40",X"35",X"CD",X"CC",X"35",X"CD",X"FA",X"35", + X"3A",X"43",X"4E",X"FE",X"00",X"CA",X"53",X"35",X"3A",X"43",X"4E",X"FE",X"FF",X"CA",X"71",X"35", + X"C3",X"59",X"35",X"CD",X"D8",X"35",X"CD",X"1A",X"36",X"3A",X"44",X"4E",X"FE",X"00",X"CA",X"6A", + X"35",X"3A",X"44",X"4E",X"FE",X"FF",X"CA",X"71",X"35",X"C9",X"CD",X"E4",X"35",X"CD",X"35",X"36", + X"C9",X"3E",X"0B",X"32",X"46",X"4E",X"AF",X"32",X"4D",X"4E",X"32",X"01",X"50",X"C9",X"21",X"1C", + X"A3",X"3A",X"46",X"4E",X"87",X"16",X"00",X"5F",X"19",X"5E",X"23",X"56",X"1A",X"32",X"45",X"50", + X"13",X"1A",X"32",X"4A",X"50",X"13",X"1A",X"32",X"4F",X"50",X"C9",X"21",X"58",X"A3",X"3A",X"46", + X"4E",X"87",X"16",X"00",X"5F",X"19",X"5E",X"23",X"56",X"EB",X"5E",X"23",X"56",X"ED",X"53",X"47", + X"4E",X"23",X"5E",X"23",X"56",X"ED",X"53",X"49",X"4E",X"23",X"5E",X"23",X"56",X"ED",X"53",X"4B", + X"4E",X"C9",X"CD",X"CC",X"35",X"CD",X"D8",X"35",X"CD",X"E4",X"35",X"C9",X"2A",X"47",X"4E",X"7E", + X"32",X"42",X"4E",X"23",X"22",X"47",X"4E",X"C9",X"2A",X"49",X"4E",X"7E",X"32",X"43",X"4E",X"23", + X"22",X"49",X"4E",X"C9",X"2A",X"4B",X"4E",X"7E",X"32",X"44",X"4E",X"23",X"22",X"4B",X"4E",X"C9", + X"CD",X"FA",X"35",X"CD",X"1A",X"36",X"CD",X"35",X"36",X"C9",X"2A",X"47",X"4E",X"7E",X"32",X"55", + X"50",X"23",X"7E",X"32",X"50",X"50",X"23",X"7E",X"32",X"51",X"50",X"23",X"7E",X"32",X"52",X"50", + X"23",X"7E",X"32",X"53",X"50",X"23",X"22",X"47",X"4E",X"C9",X"2A",X"49",X"4E",X"7E",X"32",X"5A", + X"50",X"23",X"7E",X"32",X"56",X"50",X"23",X"7E",X"32",X"57",X"50",X"23",X"7E",X"32",X"58",X"50", + X"23",X"22",X"49",X"4E",X"C9",X"2A",X"4B",X"4E",X"7E",X"32",X"5F",X"50",X"23",X"7E",X"32",X"5B", + X"50",X"23",X"7E",X"32",X"5C",X"50",X"23",X"7E",X"32",X"5D",X"50",X"23",X"22",X"4B",X"4E",X"C9", + X"CD",X"57",X"36",X"CD",X"ED",X"36",X"C9",X"DD",X"21",X"A5",X"4C",X"06",X"04",X"DD",X"7E",X"04", + X"A7",X"C2",X"C8",X"36",X"DD",X"7E",X"00",X"A7",X"CA",X"BF",X"36",X"DD",X"35",X"03",X"C2",X"BF", + X"36",X"DD",X"7E",X"07",X"DD",X"77",X"03",X"DD",X"6E",X"05",X"DD",X"66",X"06",X"11",X"11",X"00", + X"19",X"7E",X"FE",X"00",X"28",X"2F",X"38",X"2D",X"FE",X"CF",X"28",X"29",X"30",X"27",X"DD",X"CB", + X"01",X"46",X"28",X"07",X"7E",X"DD",X"96",X"02",X"77",X"18",X"05",X"7E",X"DD",X"86",X"02",X"77", + X"DD",X"7E",X"02",X"DD",X"4E",X"01",X"DD",X"6E",X"05",X"DD",X"66",X"06",X"7E",X"E6",X"FE",X"B1", + X"EE",X"05",X"77",X"18",X"0A",X"DD",X"7E",X"01",X"EE",X"01",X"DD",X"77",X"01",X"18",X"CF",X"11", + X"08",X"00",X"DD",X"19",X"05",X"20",X"96",X"C9",X"DD",X"35",X"04",X"28",X"15",X"DD",X"6E",X"05", + X"DD",X"66",X"06",X"23",X"DD",X"CB",X"04",X"4E",X"28",X"04",X"36",X"15",X"18",X"E1",X"36",X"00", + X"18",X"DD",X"DD",X"6E",X"05",X"DD",X"66",X"06",X"23",X"36",X"15",X"18",X"D2",X"DD",X"21",X"C5", + X"4C",X"06",X"03",X"DD",X"7E",X"00",X"A7",X"CA",X"4E",X"37",X"DD",X"35",X"03",X"C2",X"4E",X"37", + X"DD",X"7E",X"06",X"DD",X"77",X"03",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"11",X"11",X"00",X"19", + X"7E",X"FE",X"00",X"28",X"2F",X"38",X"2D",X"FE",X"D0",X"28",X"29",X"30",X"27",X"DD",X"CB",X"01", + X"46",X"28",X"07",X"7E",X"DD",X"96",X"02",X"77",X"18",X"05",X"7E",X"DD",X"86",X"02",X"77",X"DD", + X"7E",X"02",X"DD",X"4E",X"01",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"7E",X"E6",X"FE",X"B1",X"EE", + X"05",X"77",X"18",X"0A",X"DD",X"7E",X"01",X"EE",X"01",X"DD",X"77",X"01",X"18",X"CF",X"11",X"07", + X"00",X"DD",X"19",X"05",X"20",X"9D",X"C9",X"CD",X"64",X"37",X"CD",X"D3",X"37",X"CD",X"9D",X"38", + X"CD",X"C9",X"38",X"C9",X"21",X"6A",X"4C",X"3A",X"5A",X"4C",X"3D",X"47",X"28",X"08",X"7E",X"23", + X"FE",X"FF",X"20",X"FA",X"10",X"F8",X"06",X"08",X"11",X"04",X"00",X"3A",X"11",X"4C",X"E6",X"FC", + X"4F",X"7E",X"FE",X"FF",X"C8",X"B9",X"28",X"04",X"19",X"10",X"F6",X"C9",X"36",X"F8",X"23",X"23", + X"5E",X"23",X"56",X"21",X"DA",X"4C",X"06",X"08",X"7E",X"A7",X"28",X"06",X"23",X"23",X"23",X"10", + X"F7",X"C9",X"36",X"50",X"23",X"73",X"23",X"72",X"3A",X"A4",X"4C",X"87",X"87",X"C6",X"40",X"EB", + X"06",X"05",X"CD",X"D7",X"00",X"CD",X"E1",X"33",X"21",X"4D",X"4C",X"35",X"21",X"A4",X"4C",X"34", + X"CD",X"3D",X"32",X"3E",X"06",X"32",X"45",X"4E",X"3A",X"4D",X"4C",X"A7",X"C0",X"3E",X"01",X"32", + X"4F",X"4C",X"C9",X"21",X"8F",X"4C",X"3A",X"5A",X"4C",X"3D",X"47",X"28",X"08",X"7E",X"23",X"FE", + X"FF",X"20",X"FA",X"10",X"F8",X"06",X"08",X"11",X"04",X"00",X"3A",X"11",X"4C",X"4F",X"7E",X"FE", + X"FF",X"C8",X"E6",X"FC",X"B9",X"28",X"04",X"19",X"10",X"F4",X"C9",X"36",X"F8",X"23",X"7E",X"23", + X"5E",X"23",X"56",X"4F",X"08",X"79",X"E6",X"0F",X"FE",X"03",X"CA",X"39",X"38",X"21",X"F2",X"4C", + X"06",X"04",X"7E",X"A7",X"28",X"06",X"23",X"23",X"23",X"10",X"F7",X"C9",X"36",X"50",X"23",X"73", + X"23",X"72",X"21",X"A4",X"4C",X"7E",X"34",X"87",X"87",X"C6",X"40",X"12",X"13",X"3E",X"05",X"12", + X"CD",X"E1",X"33",X"3E",X"06",X"32",X"45",X"4E",X"C9",X"3E",X"05",X"32",X"45",X"4E",X"EB",X"E5", + X"DD",X"E1",X"0E",X"F0",X"3A",X"53",X"4C",X"CB",X"47",X"28",X"04",X"79",X"EE",X"01",X"4F",X"71", + X"23",X"36",X"14",X"21",X"A5",X"4C",X"11",X"08",X"00",X"06",X"04",X"7E",X"A7",X"28",X"04",X"19", + X"10",X"F9",X"C9",X"36",X"01",X"23",X"3A",X"53",X"4C",X"CB",X"47",X"28",X"03",X"AF",X"18",X"02", + X"3E",X"01",X"77",X"23",X"E5",X"21",X"C1",X"A2",X"08",X"07",X"07",X"07",X"07",X"E6",X"0F",X"87", + X"16",X"00",X"5F",X"19",X"5E",X"23",X"56",X"E1",X"1A",X"77",X"13",X"23",X"1A",X"77",X"4F",X"13", + X"23",X"1A",X"77",X"23",X"DD",X"E5",X"D1",X"73",X"23",X"72",X"23",X"71",X"C9",X"DD",X"21",X"DA", + X"4C",X"06",X"08",X"DD",X"7E",X"00",X"A7",X"28",X"18",X"DD",X"35",X"00",X"20",X"13",X"DD",X"6E", + X"01",X"DD",X"66",X"02",X"3E",X"0F",X"C5",X"06",X"00",X"DD",X"E5",X"CD",X"D7",X"00",X"DD",X"E1", + X"C1",X"11",X"03",X"00",X"DD",X"19",X"10",X"DB",X"C9",X"DD",X"21",X"F2",X"4C",X"06",X"04",X"DD", + X"7E",X"00",X"A7",X"28",X"10",X"DD",X"35",X"00",X"20",X"0B",X"DD",X"6E",X"01",X"DD",X"66",X"02", + X"36",X"0F",X"23",X"36",X"00",X"11",X"03",X"00",X"DD",X"19",X"10",X"E3",X"C9",X"0F",X"30",X"00", + X"56",X"43",X"0F",X"30",X"FF",X"01",X"20",X"41",X"15",X"94",X"01",X"32",X"41",X"15",X"94",X"01", + X"A1",X"41",X"15",X"94",X"01",X"AA",X"41",X"15",X"94",X"01",X"28",X"42",X"15",X"94",X"01",X"35", + X"42",X"15",X"94",X"01",X"A0",X"42",X"15",X"94",X"01",X"B5",X"42",X"15",X"94",X"00",X"46",X"41", + X"0F",X"30",X"00",X"49",X"41",X"0F",X"30",X"00",X"50",X"41",X"0F",X"30",X"00",X"55",X"41",X"0F", + X"30",X"00",X"D8",X"41",X"0F",X"30",X"00",X"44",X"42",X"0F",X"30",X"00",X"4B",X"42",X"0F",X"30", + X"00",X"C8",X"42",X"0F",X"30",X"FF",X"01",X"21",X"41",X"17",X"90",X"01",X"32",X"41",X"17",X"90", + X"01",X"26",X"42",X"17",X"90",X"01",X"36",X"42",X"17",X"90",X"01",X"A0",X"42",X"17",X"90",X"01", + X"B0",X"42",X"17",X"90",X"01",X"21",X"43",X"17",X"90",X"01",X"31",X"43",X"17",X"90",X"00",X"55", + X"41",X"0F",X"30",X"00",X"58",X"41",X"0F",X"30",X"00",X"55",X"42",X"0F",X"30",X"00",X"44",X"43", + X"0F",X"30",X"00",X"4A",X"43",X"0F",X"30",X"00",X"4D",X"43",X"0F",X"30",X"00",X"50",X"43",X"0F", + X"30",X"00",X"53",X"43",X"0F",X"30",X"FF",X"01",X"2B",X"41",X"0F",X"9C",X"01",X"39",X"41",X"0F", + X"9C",X"01",X"A5",X"41",X"0F",X"9C",X"01",X"AF",X"41",X"0F",X"9C",X"01",X"20",X"42",X"0F",X"9C", + X"01",X"36",X"42",X"0F",X"9C",X"01",X"A5",X"42",X"0F",X"9C",X"01",X"2B",X"43",X"0F",X"9C",X"00", + X"54",X"41",X"0F",X"30",X"00",X"57",X"41",X"0F",X"30",X"00",X"44",X"43",X"0F",X"30",X"00",X"47", + X"43",X"0F",X"30",X"00",X"4A",X"43",X"0F",X"30",X"00",X"4D",X"43",X"0F",X"30",X"00",X"50",X"43", + X"0F",X"30",X"00",X"53",X"43",X"0F",X"30",X"FF",X"01",X"24",X"41",X"07",X"A0",X"01",X"33",X"41", + X"07",X"A0",X"01",X"39",X"41",X"07",X"A0",X"01",X"A8",X"41",X"07",X"A0",X"01",X"B9",X"41",X"07", + X"FF",X"01",X"20",X"42",X"07",X"A0",X"01",X"AE",X"42",X"07",X"A0",X"01",X"24",X"43",X"07",X"A0", + X"00",X"55",X"41",X"0F",X"30",X"00",X"CA",X"41",X"0F",X"30",X"00",X"43",X"42",X"0F",X"30",X"00", + X"C7",X"42",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"4E",X"43",X"0F",X"30",X"00",X"50", + X"43",X"0F",X"30",X"00",X"52",X"43",X"0F",X"30",X"FF",X"01",X"25",X"41",X"0F",X"A8",X"01",X"39", + X"41",X"0F",X"A8",X"01",X"A0",X"41",X"0F",X"A8",X"01",X"B9",X"41",X"0F",X"A8",X"01",X"38",X"42", + X"0F",X"A8",X"01",X"AB",X"42",X"0F",X"A8",X"01",X"B8",X"42",X"0F",X"A8",X"01",X"22",X"43",X"0F", + X"A8",X"00",X"C7",X"41",X"0F",X"30",X"00",X"D8",X"41",X"0F",X"30",X"00",X"49",X"42",X"0F",X"30", + X"00",X"D2",X"42",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"4F",X"43",X"0F",X"30",X"00", + X"53",X"43",X"0F",X"30",X"00",X"56",X"43",X"0F",X"30",X"FF",X"01",X"39",X"41",X"17",X"A4",X"01", + X"B6",X"41",X"17",X"A4",X"01",X"2E",X"42",X"17",X"A4",X"01",X"39",X"42",X"17",X"A4",X"01",X"A0", + X"42",X"17",X"A4",X"01",X"B0",X"42",X"17",X"A4",X"01",X"B9",X"42",X"17",X"A4",X"01",X"21",X"43", + X"17",X"A4",X"00",X"4F",X"41",X"0F",X"30",X"00",X"50",X"41",X"0F",X"30",X"00",X"55",X"41",X"0F", + X"30",X"00",X"CE",X"41",X"0F",X"30",X"00",X"44",X"43",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30", + X"00",X"4F",X"43",X"0F",X"30",X"00",X"51",X"43",X"0F",X"30",X"FF",X"01",X"28",X"41",X"18",X"B4", + X"01",X"32",X"41",X"18",X"B4",X"01",X"AD",X"41",X"18",X"B4",X"01",X"2B",X"42",X"18",X"B4",X"01", + X"2E",X"42",X"18",X"B4",X"01",X"A5",X"42",X"18",X"B4",X"01",X"B4",X"42",X"18",X"B4",X"01",X"22", + X"43",X"18",X"B4",X"00",X"D6",X"41",X"0F",X"30",X"00",X"46",X"43",X"0F",X"30",X"00",X"49",X"43", + X"0F",X"30",X"00",X"51",X"43",X"0F",X"30",X"00",X"52",X"43",X"0F",X"30",X"00",X"55",X"43",X"0F", + X"30",X"00",X"58",X"43",X"0F",X"30",X"00",X"59",X"43",X"0F",X"30",X"FF",X"01",X"21",X"41",X"16", + X"BC",X"01",X"39",X"41",X"16",X"BC",X"01",X"A4",X"41",X"16",X"BC",X"01",X"B8",X"41",X"16",X"BC", + X"01",X"21",X"42",X"16",X"BC",X"01",X"39",X"42",X"16",X"BC",X"01",X"AD",X"42",X"16",X"BC",X"01", + X"2D",X"43",X"16",X"BC",X"00",X"C8",X"41",X"0F",X"30",X"00",X"D7",X"41",X"0F",X"30",X"00",X"CC", + X"42",X"0F",X"30",X"00",X"4B",X"43",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"4F",X"43", + X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"51",X"43",X"0F",X"30",X"FF",X"01",X"21",X"41", + X"03",X"AC",X"01",X"32",X"41",X"03",X"AC",X"01",X"26",X"42",X"03",X"AC",X"01",X"36",X"42",X"03", + X"AC",X"01",X"A0",X"42",X"03",X"AC",X"01",X"B0",X"42",X"03",X"AC",X"01",X"21",X"43",X"03",X"AC", + X"01",X"31",X"43",X"03",X"AC",X"00",X"55",X"41",X"0F",X"30",X"00",X"58",X"41",X"0F",X"30",X"00", + X"55",X"42",X"0F",X"30",X"00",X"44",X"43",X"0F",X"30",X"00",X"4A",X"43",X"0F",X"30",X"00",X"4D", + X"43",X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"53",X"43",X"0F",X"30",X"FF",X"01",X"28", + X"41",X"15",X"B0",X"01",X"31",X"41",X"15",X"B0",X"01",X"B1",X"41",X"15",X"B0",X"01",X"2A",X"42", + X"15",X"B0",X"01",X"2F",X"42",X"15",X"B0",X"01",X"A5",X"42",X"15",X"B0",X"01",X"B9",X"42",X"15", + X"B0",X"01",X"21",X"43",X"15",X"B0",X"00",X"C4",X"42",X"0F",X"30",X"00",X"C7",X"42",X"0F",X"30", + X"FF",X"D3",X"42",X"0F",X"30",X"00",X"D6",X"42",X"0F",X"30",X"00",X"44",X"43",X"0F",X"30",X"00", + X"47",X"43",X"0F",X"30",X"00",X"4B",X"43",X"0F",X"30",X"00",X"4F",X"43",X"0F",X"30",X"FF",X"01", + X"2B",X"41",X"17",X"B8",X"01",X"39",X"41",X"17",X"B8",X"01",X"A5",X"41",X"17",X"B8",X"01",X"AF", + X"41",X"17",X"B8",X"01",X"20",X"42",X"17",X"B8",X"01",X"36",X"42",X"17",X"B8",X"01",X"A5",X"42", + X"17",X"B8",X"01",X"2B",X"43",X"17",X"B8",X"00",X"54",X"41",X"0F",X"30",X"00",X"57",X"41",X"0F", + X"30",X"00",X"44",X"43",X"0F",X"30",X"00",X"47",X"43",X"0F",X"30",X"00",X"4A",X"43",X"0F",X"30", + X"00",X"4D",X"43",X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"53",X"43",X"0F",X"30",X"FF", + X"2C",X"9D",X"E2",X"9C",X"98",X"9C",X"BD",X"9C",X"07",X"9D",X"76",X"9D",X"51",X"9D",X"9B",X"9D", + X"C0",X"9D",X"E5",X"9D",X"2F",X"9E",X"0A",X"9E",X"54",X"9E",X"9E",X"9E",X"79",X"9E",X"C0",X"9D", + X"2F",X"9E",X"C3",X"9E",X"0A",X"9E",X"E8",X"9E",X"08",X"00",X"21",X"43",X"FF",X"40",X"00",X"A8", + X"42",X"98",X"00",X"B3",X"42",X"FF",X"68",X"00",X"2D",X"42",X"FF",X"00",X"00",X"A0",X"41",X"FF", + X"00",X"00",X"20",X"41",X"50",X"00",X"2A",X"41",X"78",X"00",X"2F",X"41",X"FF",X"FF",X"50",X"00", + X"AA",X"42",X"80",X"00",X"B0",X"42",X"FF",X"50",X"00",X"2A",X"42",X"FF",X"18",X"00",X"A3",X"41", + X"68",X"00",X"AD",X"41",X"90",X"00",X"B2",X"41",X"FF",X"28",X"00",X"25",X"41",X"88",X"00",X"31", + X"41",X"FF",X"48",X"00",X"29",X"43",X"FF",X"08",X"00",X"A1",X"42",X"C8",X"00",X"B9",X"42",X"FF", + X"40",X"00",X"28",X"42",X"FF",X"18",X"00",X"A3",X"41",X"58",X"00",X"AB",X"41",X"C8",X"00",X"B9", + X"41",X"FF",X"08",X"00",X"21",X"41",X"FF",X"78",X"00",X"2F",X"43",X"FF",X"20",X"00",X"A4",X"42", + X"FF",X"68",X"00",X"2D",X"42",X"C8",X"00",X"39",X"42",X"FF",X"88",X"00",X"B1",X"41",X"FF",X"50", + X"00",X"2A",X"41",X"78",X"00",X"2F",X"41",X"98",X"00",X"33",X"41",X"FF",X"48",X"00",X"29",X"43", + X"FF",X"08",X"00",X"A1",X"42",X"C8",X"00",X"B9",X"42",X"FF",X"40",X"00",X"28",X"42",X"C8",X"00", + X"39",X"42",X"FF",X"C8",X"00",X"B9",X"41",X"FF",X"28",X"00",X"25",X"41",X"A8",X"00",X"35",X"41", + X"FF",X"20",X"00",X"24",X"43",X"FF",X"58",X"00",X"AB",X"42",X"80",X"00",X"B0",X"42",X"FF",X"A8", + X"00",X"35",X"42",X"FF",X"28",X"00",X"A5",X"41",X"A8",X"00",X"B5",X"41",X"FF",X"08",X"00",X"21", + X"41",X"98",X"00",X"33",X"41",X"FF",X"30",X"00",X"26",X"43",X"FF",X"58",X"00",X"AB",X"42",X"C0", + X"00",X"B8",X"42",X"FF",X"48",X"00",X"29",X"42",X"FF",X"08",X"00",X"A1",X"41",X"B0",X"00",X"B6", + X"41",X"FF",X"50",X"00",X"2A",X"41",X"A0",X"00",X"34",X"41",X"FF",X"40",X"00",X"28",X"43",X"FF", + X"08",X"00",X"A1",X"42",X"C8",X"00",X"B9",X"42",X"FF",X"A0",X"00",X"34",X"42",X"FF",X"20",X"00", + X"A4",X"41",X"78",X"00",X"AF",X"41",X"FF",X"08",X"00",X"21",X"41",X"A8",X"00",X"35",X"41",X"FF", + X"08",X"00",X"21",X"43",X"88",X"00",X"31",X"43",X"FF",X"00",X"00",X"A0",X"42",X"80",X"00",X"B0", + X"42",X"FF",X"30",X"00",X"26",X"42",X"B0",X"00",X"36",X"42",X"FF",X"FF",X"08",X"00",X"21",X"41", + X"90",X"00",X"32",X"41",X"FF",X"FF",X"00",X"00",X"A0",X"42",X"A8",X"00",X"B5",X"42",X"FF",X"40", + X"00",X"28",X"42",X"A8",X"00",X"35",X"42",X"FF",X"08",X"00",X"A1",X"41",X"50",X"00",X"AA",X"41", + X"FF",X"00",X"00",X"20",X"41",X"90",X"00",X"32",X"41",X"FF",X"58",X"00",X"2B",X"43",X"FF",X"28", + X"00",X"A5",X"42",X"FF",X"00",X"00",X"20",X"42",X"B0",X"00",X"36",X"42",X"FF",X"28",X"00",X"A5", + X"41",X"78",X"00",X"AF",X"41",X"FF",X"58",X"00",X"2B",X"41",X"C8",X"00",X"39",X"41",X"FF",X"08", + X"00",X"21",X"43",X"FF",X"28",X"00",X"A5",X"42",X"C8",X"00",X"B9",X"42",X"FF",X"50",X"00",X"2A", + X"42",X"78",X"00",X"2F",X"42",X"FF",X"88",X"00",X"B1",X"41",X"FF",X"40",X"00",X"28",X"41",X"88", + X"00",X"31",X"41",X"FF",X"20",X"00",X"24",X"43",X"FF",X"70",X"00",X"AE",X"42",X"FF",X"00",X"00", + X"20",X"42",X"FF",X"40",X"00",X"A8",X"41",X"C8",X"00",X"B9",X"41",X"FF",X"20",X"00",X"24",X"41", + X"98",X"00",X"33",X"41",X"C8",X"00",X"39",X"41",X"FF",X"10",X"00",X"22",X"43",X"FF",X"58",X"00", + X"AB",X"42",X"C0",X"00",X"B8",X"42",X"FF",X"C0",X"00",X"38",X"42",X"FF",X"00",X"00",X"A0",X"41", + X"C8",X"00",X"B9",X"41",X"FF",X"28",X"00",X"25",X"41",X"C8",X"00",X"39",X"41",X"FF",X"08",X"00", + X"21",X"43",X"FF",X"00",X"00",X"A0",X"42",X"80",X"00",X"B0",X"42",X"C8",X"00",X"B9",X"42",X"FF", + X"70",X"00",X"2E",X"42",X"C8",X"00",X"39",X"42",X"FF",X"B0",X"00",X"B6",X"41",X"FF",X"C8",X"00", + X"39",X"41",X"FF",X"10",X"00",X"22",X"43",X"FF",X"28",X"00",X"A5",X"42",X"A0",X"00",X"B4",X"42", + X"FF",X"58",X"00",X"2B",X"42",X"70",X"00",X"2E",X"42",X"FF",X"68",X"00",X"AD",X"41",X"FF",X"40", + X"00",X"28",X"41",X"90",X"00",X"32",X"41",X"FF",X"68",X"00",X"2D",X"43",X"FF",X"68",X"00",X"AD", + X"42",X"FF",X"08",X"00",X"21",X"42",X"C8",X"00",X"39",X"42",X"FF",X"20",X"00",X"A4",X"41",X"C0", + X"00",X"B8",X"41",X"FF",X"08",X"00",X"21",X"41",X"C8",X"00",X"39",X"41",X"FF",X"89",X"9F",X"5F", + X"9F",X"35",X"9F",X"4A",X"9F",X"74",X"9F",X"B3",X"9F",X"9E",X"9F",X"C8",X"9F",X"DD",X"9F",X"F2", + X"9F",X"1C",X"A0",X"07",X"A0",X"31",X"A0",X"5B",X"A0",X"46",X"A0",X"DD",X"9F",X"1C",X"A0",X"70", + X"A0",X"07",X"A0",X"85",X"A0",X"FF",X"07",X"33",X"08",X"4C",X"FF",X"27",X"43",X"06",X"4C",X"FF", + X"8F",X"02",X"04",X"4C",X"FF",X"8F",X"53",X"02",X"4C",X"FF",X"67",X"02",X"08",X"4C",X"FF",X"FF", + X"87",X"02",X"06",X"4C",X"FF",X"40",X"63",X"04",X"4C",X"FF",X"AF",X"02",X"02",X"4C",X"FF",X"FF", + X"3F",X"02",X"08",X"4C",X"FF",X"C7",X"53",X"06",X"4C",X"FF",X"08",X"63",X"04",X"4C",X"FF",X"97", + X"02",X"02",X"4C",X"FF",X"FF",X"87",X"02",X"08",X"4C",X"FF",X"4F",X"33",X"06",X"4C",X"FF",X"3F", + X"02",X"04",X"4C",X"FF",X"C7",X"43",X"02",X"4C",X"FF",X"FF",X"8F",X"02",X"08",X"4C",X"FF",X"FF", + X"07",X"53",X"06",X"4C",X"FF",X"87",X"02",X"04",X"4C",X"07",X"63",X"02",X"4C",X"FF",X"FF",X"27", + X"02",X"08",X"4C",X"CF",X"33",X"06",X"4C",X"FF",X"27",X"43",X"04",X"4C",X"FF",X"5F",X"02",X"02", + X"4C",X"FF",X"FF",X"FF",X"2F",X"43",X"08",X"4C",X"FF",X"97",X"02",X"06",X"4C",X"FF",X"3F",X"53", + X"04",X"4C",X"FF",X"B7",X"02",X"02",X"4C",X"FF",X"97",X"02",X"08",X"4C",X"FF",X"6F",X"02",X"06", + X"4C",X"FF",X"B7",X"33",X"04",X"4C",X"FF",X"97",X"43",X"02",X"4C",X"FF",X"FF",X"FF",X"27",X"43", + X"08",X"4C",X"B7",X"02",X"06",X"4C",X"FF",X"FF",X"27",X"33",X"04",X"4C",X"AF",X"63",X"02",X"4C", + X"FF",X"FF",X"FF",X"4F",X"02",X"08",X"4C",X"FF",X"77",X"63",X"06",X"4C",X"FF",X"8F",X"33",X"04"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..f3b27c53 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"05",X"02",X"00",X"01",X"03",X"06",X"04",X"07",X"08",X"09",X"0B",X"0A",X"0C",X"0E",X"0D",X"08", + X"0B",X"0F",X"0A",X"10",X"3C",X"80",X"5C",X"81",X"A6",X"82",X"8C",X"83",X"B2",X"84",X"F6",X"85", + X"BE",X"86",X"02",X"88",X"28",X"89",X"8E",X"8A",X"C6",X"8B",X"44",X"8D",X"AC",X"8E",X"F6",X"8F", + X"FE",X"90",X"10",X"92",X"7A",X"93",X"7A",X"93",X"7A",X"93",X"7A",X"93",X"01",X"05",X"0F",X"17", + X"3B",X"17",X"01",X"14",X"0F",X"17",X"3B",X"17",X"00",X"01",X"05",X"38",X"17",X"3A",X"17",X"01", + X"07",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"0B",X"38",X"17",X"3A",X"17",X"38",X"17",X"00", + X"01",X"05",X"0F",X"17",X"3B",X"17",X"01",X"14",X"0F",X"17",X"3B",X"17",X"00",X"01",X"05",X"0F", + X"17",X"3B",X"17",X"01",X"14",X"0F",X"17",X"3B",X"17",X"00",X"01",X"05",X"0F",X"17",X"3B",X"17", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"3A",X"17",X"38", + X"17",X"01",X"07",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"3A", + X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"3A",X"17",X"01",X"0D",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"01",X"07",X"38",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"38",X"17",X"3A", + X"17",X"01",X"03",X"38",X"17",X"01",X"07",X"0F",X"17",X"01",X"06",X"38",X"17",X"3A",X"17",X"01", + X"04",X"38",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06", + X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01", + X"05",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"01",X"04",X"0F",X"17",X"01",X"04",X"38", + X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F", + X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"06",X"38",X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01", + X"03",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F", + X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17", + X"3B",X"17",X"01",X"02",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01", + X"0A",X"38",X"17",X"01",X"04",X"0F",X"17",X"01",X"07",X"38",X"17",X"3A",X"17",X"01",X"03",X"38", + X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"02",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"05",X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"01",X"04", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"38",X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"01", + X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"01",X"08",X"38",X"17",X"00",X"01",X"08", + X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B", + X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0A", + X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F", + X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01", + X"0A",X"38",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"09",X"38",X"17",X"0F",X"17",X"01",X"07",X"38",X"17",X"3A",X"17",X"01",X"06",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01",X"11",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"06",X"38",X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"08",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"06", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"0F",X"17", + X"3B",X"17",X"01",X"08",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"0F",X"17",X"01", + X"06",X"38",X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"3A",X"17",X"01",X"08",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0F",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"14",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01", + X"09",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01", + X"04",X"38",X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"14",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"14",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"0F",X"17",X"3B",X"17",X"01",X"10", + X"0F",X"17",X"3B",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"38",X"17",X"3A",X"17",X"01", + X"05",X"38",X"17",X"01",X"07",X"0F",X"17",X"01",X"04",X"38",X"17",X"3A",X"17",X"01",X"06",X"38", + X"17",X"00",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"04",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38", + X"17",X"3A",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"01",X"0B",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"09",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"01",X"05",X"0F",X"17",X"01", + X"06",X"38",X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17", + X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17", + X"00",X"FF",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"08",X"38",X"17",X"3A",X"17",X"38",X"17",X"01",X"08",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F", + X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"08", + X"0F",X"17",X"3B",X"17",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B", + X"17",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"05", + X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"05",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"01",X"04",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"03",X"38", + X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"10", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"09", + X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"38",X"17",X"3A", + X"17",X"38",X"17",X"01",X"07",X"0F",X"17",X"01",X"06",X"38",X"17",X"3A",X"17",X"01",X"03",X"38", + X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"09",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"04", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"0A",X"38",X"17",X"01", + X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"01",X"08",X"38",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B", + X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"10", + X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38", + X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"01",X"0D",X"38",X"17",X"00",X"01",X"0B",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"01",X"05", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"07",X"38",X"17",X"0F",X"17",X"01",X"09",X"38",X"17",X"3A", + X"17",X"01",X"06",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"11",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01",X"11",X"0F",X"17",X"3B",X"17", + X"01",X"04",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"38",X"17",X"0F",X"17",X"01",X"0D",X"38", + X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"05",X"38",X"17",X"00",X"01",X"16",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"16",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17", + X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"38",X"17",X"0F",X"17",X"01",X"05",X"38", + X"17",X"3A",X"17",X"01",X"0C",X"38",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"0F",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"04", + X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"38",X"17",X"3A", + X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"01",X"04",X"0F",X"17",X"01", + X"02",X"38",X"17",X"3A",X"17",X"01",X"09",X"38",X"17",X"00",X"01",X"04",X"0F",X"17",X"3B",X"17", + X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17", + X"01",X"05",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0A",X"38", + X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"04",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00", + X"01",X"0C",X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0C",X"0F", + X"17",X"3B",X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"08",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F", + X"17",X"01",X"07",X"38",X"17",X"01",X"02",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"03",X"38", + X"17",X"0F",X"17",X"01",X"06",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0E", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0E",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"07", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"05",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A", + X"17",X"01",X"03",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"09",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17", + X"00",X"FF",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"0F", + X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01", + X"08",X"38",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"10", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"08",X"38",X"17",X"0F", + X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01", + X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F", + X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"0F",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"01",X"07",X"38", + X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"05",X"38",X"17",X"3A",X"17",X"01", + X"09",X"38",X"17",X"00",X"01",X"12",X"0F",X"17",X"3B",X"17",X"00",X"01",X"12",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"02",X"38", + X"17",X"01",X"02",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01", + X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38", + X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"10", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"01",X"04",X"0F",X"17",X"01",X"0B",X"38", + X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"10",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17", + X"3B",X"17",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B", + X"17",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"01",X"02",X"3B",X"17", + X"01",X"0C",X"0F",X"17",X"3B",X"17",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38", + X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"02",X"38", + X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"05",X"38",X"17",X"0F", + X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"16", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"16",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"0C", + X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"38",X"17",X"3A", + X"17",X"38",X"17",X"01",X"05",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A", + X"17",X"01",X"06",X"38",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"04", + X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"38",X"17",X"3A", + X"17",X"01",X"08",X"38",X"17",X"0F",X"17",X"01",X"0A",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A", + X"17",X"38",X"17",X"00",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04", + X"0F",X"17",X"3B",X"17",X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"06",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"04",X"38",X"17",X"3A",X"17",X"38", + X"17",X"01",X"02",X"0F",X"17",X"01",X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"06",X"38", + X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01", + X"0A",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A", + X"17",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17", + X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A", + X"17",X"01",X"06",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38", + X"17",X"3A",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"06", + X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B", + X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"0C", + X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0F",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"01",X"04",X"0F", + X"17",X"38",X"17",X"3A",X"17",X"01",X"09",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0F",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17", + X"01",X"07",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38", + X"17",X"01",X"03",X"0F",X"17",X"01",X"05",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"0A",X"0F",X"17",X"3B",X"17", + X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"01",X"0F",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"01",X"02",X"3B",X"17",X"01",X"08",X"0F",X"17", + X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"0F",X"17",X"01", + X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"01",X"04",X"0F", + X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"09",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"01",X"09",X"0F",X"17", + X"3B",X"17",X"01",X"05",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38", + X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"00",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"16",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01", + X"16",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"16",X"0F",X"17", + X"3B",X"17",X"00",X"FF",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01", + X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"01",X"03",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01", + X"03",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"05",X"0F",X"17",X"3B",X"17",X"01",X"0F",X"0F",X"17",X"3B",X"17", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38", + X"17",X"01",X"03",X"0F",X"17",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F", + X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"38",X"17",X"00", + X"01",X"08",X"0F",X"17",X"3B",X"17",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"0F", + X"17",X"3B",X"17",X"01",X"11",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"05",X"0F",X"17",X"3B",X"17",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"05",X"38", + X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"01", + X"02",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01", + X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17", + X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"09",X"38",X"17",X"3A",X"17",X"38",X"17",X"01",X"05",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01", + X"0A",X"38",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09", + X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"03",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38", + X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F", + X"17",X"38",X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"00", + X"01",X"03",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03", + X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"01",X"08",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"05",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A", + X"17",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A", + X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"0B",X"0F",X"17", + X"3B",X"17",X"01",X"08",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"01", + X"08",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"01",X"08",X"0F",X"17", + X"3B",X"17",X"01",X"05",X"0F",X"17",X"3B",X"17",X"00",X"01",X"07",X"38",X"17",X"0F",X"17",X"38", + X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"01",X"05",X"0F",X"17",X"01",X"04",X"38",X"17",X"01", + X"02",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"1A",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"1A",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"16", + X"0F",X"17",X"01",X"02",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"01",X"02",X"0F", + X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F", + X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"16",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B", + X"17",X"01",X"16",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"16", + X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"12",X"0F",X"17",X"3B",X"17",X"00",X"01",X"07",X"38", + X"17",X"0F",X"17",X"38",X"17",X"01",X"03",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F", + X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"12",X"0F",X"17",X"3B",X"17",X"00",X"01",X"12",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"07",X"38",X"17",X"3A", + X"17",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F", + X"17",X"01",X"05",X"38",X"17",X"00",X"01",X"0D",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0D",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0A",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38", + X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"01",X"03",X"0F", + X"17",X"01",X"07",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"05",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"3A",X"17",X"01",X"03",X"38", + X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"01", + X"02",X"0F",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01", + X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"09", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01", + X"06",X"38",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"05",X"38",X"17",X"00",X"01",X"09", + X"0F",X"17",X"3B",X"17",X"00",X"01",X"09",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38", + X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38", + X"17",X"01",X"04",X"38",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"01",X"02",X"3B",X"17", + X"00",X"01",X"03",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38", + X"17",X"01",X"03",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38", + X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"01",X"03",X"0F",X"17",X"01",X"03",X"38", + X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"38", + X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"01",X"07",X"38",X"17",X"0F",X"17",X"01", + X"03",X"38",X"17",X"0F",X"17",X"01",X"04",X"38",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"00",X"01",X"08",X"0F",X"17",X"3B",X"17",X"00",X"FF", + X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38", + X"17",X"3A",X"17",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"04",X"38",X"17",X"0F",X"17",X"38", + X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"04",X"38", + X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B", + X"17",X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"04", + X"0F",X"17",X"3B",X"17",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"01",X"06",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"07",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"01",X"02",X"0F", + X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"01", + X"08",X"38",X"17",X"00",X"01",X"07",X"0F",X"17",X"3B",X"17",X"01",X"0B",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"07",X"0F",X"17",X"3B",X"17",X"01",X"0B",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02", + X"0F",X"17",X"3B",X"17",X"01",X"04",X"0F",X"17",X"3B",X"17",X"01",X"0B",X"0F",X"17",X"3B",X"17", + X"01",X"06",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"01", + X"02",X"0F",X"17",X"01",X"03",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F", + X"17",X"01",X"02",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"03",X"38",X"17",X"01",X"03",X"0F", + X"17",X"01",X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17", + X"01",X"17",X"0F",X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"17",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"02",X"0F",X"17",X"3B",X"17",X"01",X"0C",X"0F",X"17",X"3B",X"17", + X"01",X"0A",X"0F",X"17",X"3B",X"17",X"00",X"01",X"04",X"38",X"17",X"0F",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"05",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F", + X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01", + X"03",X"38",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B", + X"17",X"00",X"01",X"0F",X"0F",X"17",X"3B",X"17",X"00",X"FF",X"01",X"0E",X"0F",X"17",X"3B",X"17", + X"00",X"01",X"03",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01", + X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"38",X"17",X"3A",X"17",X"01",X"02",X"38", + X"17",X"0F",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38",X"17",X"0F",X"17",X"38",X"17",X"0F", + X"17",X"01",X"03",X"38",X"17",X"00",X"01",X"0E",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0E",X"0F", + X"17",X"3B",X"17",X"00",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"01",X"03",X"0F",X"17",X"3B",X"17", + X"01",X"03",X"0F",X"17",X"3B",X"17",X"00",X"01",X"06",X"38",X"17",X"01",X"02",X"0F",X"17",X"01", + X"02",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"03",X"38",X"17",X"0F",X"17",X"38", + X"17",X"3A",X"17",X"38",X"17",X"01",X"02",X"0F",X"17",X"01",X"06",X"38",X"17",X"00",X"01",X"0A", + X"0F",X"17",X"3B",X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0A",X"0F",X"17",X"3B", + X"17",X"01",X"07",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0A",X"0F",X"17",X"3B",X"17",X"01",X"07", + X"0F",X"17",X"3B",X"17",X"01",X"03",X"0F",X"17",X"3B",X"17",X"00",X"01",X"0D",X"38",X"17",X"01", + X"03",X"0F",X"17",X"01",X"06",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"03",X"38", + X"17",X"00",X"01",X"16",X"0F",X"17",X"3B",X"17",X"00",X"01",X"16",X"0F",X"17",X"3B",X"17",X"00", + X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"12",X"0F",X"17",X"3B",X"17",X"01",X"02",X"0F",X"17", + X"3B",X"17",X"00",X"01",X"03",X"38",X"17",X"3A",X"17",X"38",X"17",X"0F",X"17",X"01",X"02",X"38", + X"17",X"01",X"03",X"0F",X"17",X"01",X"06",X"38",X"17",X"0F",X"17",X"38",X"17",X"01",X"02",X"0F", + X"17",X"01",X"04",X"38",X"17",X"3A",X"17",X"01",X"02",X"38",X"17",X"00",X"01",X"03",X"0F",X"17", + X"3B",X"17",X"01",X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01", + X"15",X"0F",X"17",X"3B",X"17",X"00",X"01",X"03",X"0F",X"17",X"3B",X"17",X"01",X"15",X"0F",X"17", + X"3B",X"17",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"15",X"70",X"12",X"74",X"0F",X"78",X"15",X"7C",X"15",X"80", + X"15",X"84",X"0F",X"88",X"03",X"8C",X"17",X"90",X"15",X"94",X"16",X"98",X"0F",X"9C",X"07",X"A0", + X"17",X"A4",X"0F",X"A8",X"03",X"AC",X"15",X"B0",X"18",X"B4",X"17",X"B8",X"16",X"BC",X"16",X"95", + X"76",X"95",X"26",X"95",X"36",X"95",X"86",X"95",X"56",X"95",X"96",X"95",X"46",X"95",X"B6",X"95", + X"A6",X"95",X"66",X"95",X"C6",X"95",X"D6",X"95",X"F6",X"95",X"E6",X"95",X"B6",X"95",X"66",X"95", + X"06",X"96",X"C6",X"95",X"16",X"96",X"34",X"18",X"07",X"A8",X"34",X"18",X"87",X"A8",X"34",X"18", + X"07",X"88",X"34",X"18",X"8F",X"48",X"34",X"18",X"8F",X"A8",X"34",X"18",X"8F",X"88",X"34",X"18", + X"27",X"68",X"34",X"18",X"08",X"48",X"34",X"18",X"AF",X"A8",X"34",X"18",X"3F",X"88",X"34",X"18", + X"87",X"68",X"34",X"18",X"67",X"28",X"34",X"18",X"97",X"88",X"34",X"18",X"B7",X"68",X"34",X"18", + X"6F",X"48",X"34",X"18",X"97",X"28",X"34",X"18",X"B7",X"A8",X"34",X"18",X"3F",X"88",X"34",X"18", + X"97",X"68",X"34",X"18",X"2F",X"48",X"34",X"18",X"9F",X"88",X"34",X"18",X"1F",X"68",X"34",X"18", + X"9F",X"48",X"34",X"18",X"BF",X"28",X"34",X"18",X"97",X"A8",X"34",X"18",X"07",X"88",X"34",X"18", + X"C7",X"68",X"34",X"18",X"3F",X"48",X"34",X"18",X"C7",X"A8",X"34",X"18",X"3F",X"88",X"34",X"18", + X"4F",X"68",X"34",X"18",X"87",X"48",X"34",X"18",X"5F",X"88",X"34",X"18",X"27",X"68",X"34",X"18", + X"C7",X"48",X"34",X"18",X"27",X"48",X"34",X"18",X"57",X"A8",X"34",X"18",X"8F",X"88",X"34",X"18", + X"77",X"68",X"34",X"18",X"4F",X"48",X"34",X"18",X"AF",X"88",X"34",X"18",X"27",X"88",X"34",X"18", + X"B7",X"48",X"34",X"18",X"27",X"48",X"34",X"18",X"AF",X"88",X"34",X"18",X"1F",X"68",X"34",X"18", + X"AF",X"48",X"34",X"18",X"CF",X"28",X"34",X"18",X"6F",X"A8",X"34",X"18",X"27",X"68",X"34",X"18", + X"27",X"48",X"34",X"18",X"3F",X"28",X"34",X"18",X"9F",X"A8",X"34",X"18",X"47",X"88",X"34",X"18", + X"7F",X"68",X"34",X"18",X"2F",X"48",X"34",X"18",X"27",X"88",X"34",X"18",X"27",X"48",X"34",X"18", + X"5F",X"48",X"34",X"18",X"27",X"28",X"34",X"18",X"9F",X"A8",X"34",X"18",X"1F",X"88",X"34",X"18", + X"B7",X"88",X"34",X"18",X"67",X"48",X"34",X"18",X"9F",X"A8",X"34",X"18",X"37",X"68",X"34",X"18", + X"97",X"68",X"34",X"18",X"77",X"48",X"4E",X"96",X"11",X"98",X"8B",X"96",X"D7",X"96",X"58",X"98", + X"74",X"97",X"A4",X"98",X"23",X"97",X"46",X"99",X"F5",X"98",X"C0",X"97",X"97",X"99",X"E8",X"99", + X"8A",X"9A",X"39",X"9A",X"7D",X"9B",X"CE",X"9B",X"DB",X"9A",X"1F",X"9C",X"2C",X"9B",X"01",X"25", + X"41",X"15",X"70",X"01",X"35",X"41",X"15",X"70",X"01",X"B9",X"41",X"15",X"70",X"01",X"28",X"42", + X"15",X"70",X"01",X"39",X"42",X"15",X"70",X"01",X"A1",X"42",X"15",X"70",X"01",X"B9",X"42",X"15", + X"70",X"01",X"29",X"43",X"15",X"70",X"00",X"58",X"41",X"0F",X"30",X"00",X"CE",X"41",X"0F",X"30", + X"00",X"4E",X"42",X"0F",X"30",X"00",X"57",X"43",X"0F",X"30",X"FF",X"01",X"20",X"41",X"0F",X"78", + X"01",X"2A",X"41",X"0F",X"78",X"01",X"2F",X"41",X"0F",X"78",X"01",X"A0",X"41",X"0F",X"78",X"01", + X"2D",X"42",X"0F",X"78",X"01",X"A8",X"42",X"0F",X"78",X"01",X"B3",X"42",X"0F",X"78",X"01",X"21", + X"43",X"0F",X"78",X"00",X"48",X"41",X"0F",X"30",X"00",X"55",X"41",X"0F",X"30",X"00",X"58",X"41", + X"0F",X"30",X"00",X"4A",X"42",X"0F",X"30",X"00",X"4E",X"43",X"0F",X"30",X"00",X"51",X"43",X"0F", + X"30",X"00",X"54",X"43",X"0F",X"30",X"FF",X"01",X"25",X"41",X"15",X"7C",X"01",X"31",X"41",X"15", + X"7C",X"01",X"A3",X"41",X"15",X"7C",X"01",X"AD",X"41",X"15",X"7C",X"01",X"B2",X"41",X"15",X"7C", + X"01",X"2A",X"42",X"15",X"7C",X"01",X"AA",X"42",X"15",X"7C",X"01",X"B0",X"42",X"15",X"7C",X"00", + X"44",X"41",X"0F",X"30",X"00",X"44",X"42",X"0F",X"30",X"00",X"C5",X"42",X"0F",X"30",X"00",X"D6", + X"42",X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"55",X"43",X"0F",X"30",X"00",X"58",X"43", + X"0F",X"30",X"FF",X"01",X"21",X"41",X"03",X"8C",X"01",X"35",X"41",X"03",X"8C",X"01",X"A4",X"41", + X"03",X"8C",X"01",X"AF",X"41",X"03",X"8C",X"01",X"34",X"42",X"03",X"8C",X"01",X"A1",X"42",X"03", + X"8C",X"01",X"B9",X"42",X"03",X"8C",X"01",X"28",X"43",X"03",X"8C",X"00",X"C7",X"41",X"0F",X"30", + X"00",X"44",X"42",X"0F",X"30",X"00",X"49",X"42",X"0F",X"30",X"00",X"4F",X"42",X"0F",X"30",X"00", + X"4B",X"43",X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"56",X"43",X"0F",X"30",X"00",X"59", + X"43",X"0F",X"30",X"FF",X"01",X"2A",X"41",X"15",X"84",X"01",X"34",X"41",X"15",X"84",X"01",X"A1", + X"41",X"15",X"84",X"01",X"B6",X"41",X"15",X"84",X"01",X"29",X"42",X"15",X"84",X"01",X"AB",X"42", + X"15",X"84",X"01",X"B8",X"42",X"15",X"84",X"01",X"26",X"43",X"15",X"84",X"00",X"C6",X"41",X"0F", + X"30",X"00",X"58",X"42",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"4F",X"43",X"0F",X"30", + X"00",X"50",X"43",X"0F",X"30",X"00",X"53",X"43",X"0F",X"30",X"00",X"56",X"43",X"0F",X"30",X"FF", + X"01",X"28",X"41",X"16",X"98",X"01",X"31",X"41",X"16",X"98",X"01",X"B1",X"41",X"16",X"98",X"01", + X"2A",X"42",X"16",X"98",X"01",X"2F",X"42",X"16",X"98",X"01",X"A5",X"42",X"16",X"98",X"01",X"B9", + X"42",X"16",X"98",X"01",X"21",X"43",X"16",X"98",X"00",X"C4",X"42",X"0F",X"30",X"00",X"C7",X"42", + X"0F",X"30",X"00",X"D3",X"42",X"0F",X"30",X"00",X"D6",X"42",X"0F",X"30",X"00",X"44",X"43",X"0F", + X"30",X"00",X"47",X"43",X"0F",X"30",X"00",X"4B",X"43",X"0F",X"30",X"00",X"4F",X"43",X"0F",X"30", + X"FF",X"01",X"21",X"41",X"12",X"74",X"01",X"A3",X"41",X"12",X"74",X"01",X"AB",X"41",X"12",X"74", + X"01",X"B9",X"41",X"12",X"74",X"01",X"28",X"42",X"12",X"74",X"01",X"A1",X"42",X"12",X"74",X"01", + X"B9",X"42",X"12",X"74",X"01",X"29",X"43",X"12",X"74",X"00",X"CE",X"41",X"0F",X"30",X"00",X"D3", + X"41",X"0F",X"30",X"00",X"CD",X"42",X"0F",X"30",X"00",X"D2",X"42",X"0F",X"30",X"00",X"4C",X"43", + X"0F",X"30",X"00",X"55",X"43",X"0F",X"30",X"FF",X"01",X"2A",X"41",X"15",X"80",X"01",X"2F",X"41", + X"15",X"80",X"01",X"33",X"41",X"15",X"80",X"01",X"B1",X"41",X"15",X"80",X"01",X"2D",X"42",X"15", + X"80",X"01",X"39",X"42",X"15",X"80",X"01",X"A4",X"42",X"15",X"80",X"01",X"2F",X"43",X"15",X"80", + X"00",X"45",X"41",X"0F",X"30",X"00",X"48",X"41",X"0F",X"30",X"00",X"C6",X"41",X"0F",X"30",X"00", + X"52",X"42",X"0F",X"30",X"00",X"D4",X"42",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"53", + X"43",X"0F",X"30",X"FF",X"01",X"21",X"41",X"0F",X"88",X"01",X"33",X"41",X"0F",X"88",X"01",X"A5", + X"41",X"0F",X"88",X"01",X"B5",X"41",X"0F",X"88",X"01",X"35",X"42",X"0F",X"88",X"01",X"AB",X"42", + X"0F",X"88",X"01",X"B0",X"42",X"0F",X"88",X"01",X"24",X"43",X"0F",X"88",X"00",X"45",X"41",X"0F", + X"30",X"00",X"C4",X"42",X"0F",X"30",X"00",X"C7",X"42",X"0F",X"30",X"00",X"D6",X"42",X"0F",X"30", + X"00",X"47",X"43",X"0F",X"30",X"00",X"4D",X"43",X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00", + X"56",X"43",X"0F",X"30",X"FF",X"01",X"20",X"41",X"15",X"94",X"01",X"32",X"41",X"15",X"94",X"01", + X"A1",X"41",X"15",X"94",X"01",X"AA",X"41",X"15",X"94",X"01",X"28",X"42",X"15",X"94",X"01",X"35", + X"42",X"15",X"94",X"01",X"A0",X"42",X"15",X"94",X"01",X"B5",X"42",X"15",X"94",X"00",X"46",X"41", + X"0F",X"30",X"00",X"49",X"41",X"0F",X"30",X"00",X"50",X"41",X"0F",X"30",X"00",X"55",X"41",X"0F", + X"30",X"00",X"D8",X"41",X"0F",X"30",X"00",X"44",X"42",X"0F",X"30",X"00",X"4B",X"42",X"0F",X"30", + X"00",X"C8",X"42",X"0F",X"30",X"FF",X"01",X"21",X"41",X"17",X"90",X"01",X"32",X"41",X"17",X"90", + X"01",X"26",X"42",X"17",X"90",X"01",X"36",X"42",X"17",X"90",X"01",X"A0",X"42",X"17",X"90",X"01", + X"B0",X"42",X"17",X"90",X"01",X"21",X"43",X"17",X"90",X"01",X"31",X"43",X"17",X"90",X"00",X"55", + X"41",X"0F",X"30",X"00",X"58",X"41",X"0F",X"30",X"00",X"55",X"42",X"0F",X"30",X"00",X"44",X"43", + X"0F",X"30",X"00",X"4A",X"43",X"0F",X"30",X"00",X"4D",X"43",X"0F",X"30",X"00",X"50",X"43",X"0F", + X"30",X"00",X"53",X"43",X"0F",X"30",X"FF",X"01",X"2B",X"41",X"0F",X"9C",X"01",X"39",X"41",X"0F", + X"9C",X"01",X"A5",X"41",X"0F",X"9C",X"01",X"AF",X"41",X"0F",X"9C",X"01",X"20",X"42",X"0F",X"9C", + X"01",X"36",X"42",X"0F",X"9C",X"01",X"A5",X"42",X"0F",X"9C",X"01",X"2B",X"43",X"0F",X"9C",X"00", + X"54",X"41",X"0F",X"30",X"00",X"57",X"41",X"0F",X"30",X"00",X"44",X"43",X"0F",X"30",X"00",X"47", + X"43",X"0F",X"30",X"00",X"4A",X"43",X"0F",X"30",X"00",X"4D",X"43",X"0F",X"30",X"00",X"50",X"43", + X"0F",X"30",X"00",X"53",X"43",X"0F",X"30",X"FF",X"01",X"24",X"41",X"07",X"A0",X"01",X"33",X"41", + X"07",X"A0",X"01",X"39",X"41",X"07",X"A0",X"01",X"A8",X"41",X"07",X"A0",X"01",X"B9",X"41",X"07", + X"A0",X"01",X"20",X"42",X"07",X"A0",X"01",X"AE",X"42",X"07",X"A0",X"01",X"24",X"43",X"07",X"A0", + X"00",X"55",X"41",X"0F",X"30",X"00",X"CA",X"41",X"0F",X"30",X"00",X"43",X"42",X"0F",X"30",X"00", + X"C7",X"42",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"4E",X"43",X"0F",X"30",X"00",X"50", + X"43",X"0F",X"30",X"00",X"52",X"43",X"0F",X"30",X"FF",X"01",X"25",X"41",X"0F",X"A8",X"01",X"39", + X"41",X"0F",X"A8",X"01",X"A0",X"41",X"0F",X"A8",X"01",X"B9",X"41",X"0F",X"A8",X"01",X"38",X"42", + X"0F",X"A8",X"01",X"AB",X"42",X"0F",X"A8",X"01",X"B8",X"42",X"0F",X"A8",X"01",X"22",X"43",X"0F", + X"A8",X"00",X"C7",X"41",X"0F",X"30",X"00",X"D8",X"41",X"0F",X"30",X"00",X"49",X"42",X"0F",X"30", + X"00",X"D2",X"42",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"4F",X"43",X"0F",X"30",X"00", + X"53",X"43",X"0F",X"30",X"00",X"56",X"43",X"0F",X"30",X"FF",X"01",X"39",X"41",X"17",X"A4",X"01", + X"B6",X"41",X"17",X"A4",X"01",X"2E",X"42",X"17",X"A4",X"01",X"39",X"42",X"17",X"A4",X"01",X"A0", + X"42",X"17",X"A4",X"01",X"B0",X"42",X"17",X"A4",X"01",X"B9",X"42",X"17",X"A4",X"01",X"21",X"43", + X"17",X"A4",X"00",X"4F",X"41",X"0F",X"30",X"00",X"50",X"41",X"0F",X"30",X"00",X"55",X"41",X"0F", + X"30",X"00",X"CE",X"41",X"0F",X"30",X"00",X"44",X"43",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30", + X"00",X"4F",X"43",X"0F",X"30",X"00",X"51",X"43",X"0F",X"30",X"FF",X"01",X"28",X"41",X"18",X"B4", + X"01",X"32",X"41",X"18",X"B4",X"01",X"AD",X"41",X"18",X"B4",X"01",X"2B",X"42",X"18",X"B4",X"01", + X"2E",X"42",X"18",X"B4",X"01",X"A5",X"42",X"18",X"B4",X"01",X"B4",X"42",X"18",X"B4",X"01",X"22", + X"43",X"18",X"B4",X"00",X"D6",X"41",X"0F",X"30",X"00",X"46",X"43",X"0F",X"30",X"00",X"49",X"43", + X"0F",X"30",X"00",X"51",X"43",X"0F",X"30",X"00",X"52",X"43",X"0F",X"30",X"00",X"55",X"43",X"0F", + X"30",X"00",X"58",X"43",X"0F",X"30",X"00",X"59",X"43",X"0F",X"30",X"FF",X"01",X"21",X"41",X"16", + X"BC",X"01",X"39",X"41",X"16",X"BC",X"01",X"A4",X"41",X"16",X"BC",X"01",X"B8",X"41",X"16",X"BC", + X"01",X"21",X"42",X"16",X"BC",X"01",X"39",X"42",X"16",X"BC",X"01",X"AD",X"42",X"16",X"BC",X"01", + X"2D",X"43",X"16",X"BC",X"00",X"C8",X"41",X"0F",X"30",X"00",X"D7",X"41",X"0F",X"30",X"00",X"CC", + X"42",X"0F",X"30",X"00",X"4B",X"43",X"0F",X"30",X"00",X"4C",X"43",X"0F",X"30",X"00",X"4F",X"43", + X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"51",X"43",X"0F",X"30",X"FF",X"01",X"21",X"41", + X"03",X"AC",X"01",X"32",X"41",X"03",X"AC",X"01",X"26",X"42",X"03",X"AC",X"01",X"36",X"42",X"03", + X"AC",X"01",X"A0",X"42",X"03",X"AC",X"01",X"B0",X"42",X"03",X"AC",X"01",X"21",X"43",X"03",X"AC", + X"01",X"31",X"43",X"03",X"AC",X"00",X"55",X"41",X"0F",X"30",X"00",X"58",X"41",X"0F",X"30",X"00", + X"55",X"42",X"0F",X"30",X"00",X"44",X"43",X"0F",X"30",X"00",X"4A",X"43",X"0F",X"30",X"00",X"4D", + X"43",X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"53",X"43",X"0F",X"30",X"FF",X"01",X"28", + X"41",X"15",X"B0",X"01",X"31",X"41",X"15",X"B0",X"01",X"B1",X"41",X"15",X"B0",X"01",X"2A",X"42", + X"15",X"B0",X"01",X"2F",X"42",X"15",X"B0",X"01",X"A5",X"42",X"15",X"B0",X"01",X"B9",X"42",X"15", + X"B0",X"01",X"21",X"43",X"15",X"B0",X"00",X"C4",X"42",X"0F",X"30",X"00",X"C7",X"42",X"0F",X"30", + X"00",X"D3",X"42",X"0F",X"30",X"00",X"D6",X"42",X"0F",X"30",X"00",X"44",X"43",X"0F",X"30",X"00", + X"47",X"43",X"0F",X"30",X"00",X"4B",X"43",X"0F",X"30",X"00",X"4F",X"43",X"0F",X"30",X"FF",X"01", + X"2B",X"41",X"17",X"B8",X"01",X"39",X"41",X"17",X"B8",X"01",X"A5",X"41",X"17",X"B8",X"01",X"AF", + X"41",X"17",X"B8",X"01",X"20",X"42",X"17",X"B8",X"01",X"36",X"42",X"17",X"B8",X"01",X"A5",X"42", + X"17",X"B8",X"01",X"2B",X"43",X"17",X"B8",X"00",X"54",X"41",X"0F",X"30",X"00",X"57",X"41",X"0F", + X"30",X"00",X"44",X"43",X"0F",X"30",X"00",X"47",X"43",X"0F",X"30",X"00",X"4A",X"43",X"0F",X"30", + X"00",X"4D",X"43",X"0F",X"30",X"00",X"50",X"43",X"0F",X"30",X"00",X"53",X"43",X"0F",X"30",X"FF", + X"2C",X"9D",X"E2",X"9C",X"98",X"9C",X"BD",X"9C",X"07",X"9D",X"76",X"9D",X"51",X"9D",X"9B",X"9D", + X"C0",X"9D",X"E5",X"9D",X"2F",X"9E",X"0A",X"9E",X"54",X"9E",X"9E",X"9E",X"79",X"9E",X"C0",X"9D", + X"2F",X"9E",X"C3",X"9E",X"0A",X"9E",X"E8",X"9E",X"08",X"00",X"21",X"43",X"FF",X"40",X"00",X"A8", + X"42",X"98",X"00",X"B3",X"42",X"FF",X"68",X"00",X"2D",X"42",X"FF",X"00",X"00",X"A0",X"41",X"FF", + X"00",X"00",X"20",X"41",X"50",X"00",X"2A",X"41",X"78",X"00",X"2F",X"41",X"FF",X"FF",X"50",X"00", + X"AA",X"42",X"80",X"00",X"B0",X"42",X"FF",X"50",X"00",X"2A",X"42",X"FF",X"18",X"00",X"A3",X"41", + X"68",X"00",X"AD",X"41",X"90",X"00",X"B2",X"41",X"FF",X"28",X"00",X"25",X"41",X"88",X"00",X"31", + X"41",X"FF",X"48",X"00",X"29",X"43",X"FF",X"08",X"00",X"A1",X"42",X"C8",X"00",X"B9",X"42",X"FF", + X"40",X"00",X"28",X"42",X"FF",X"18",X"00",X"A3",X"41",X"58",X"00",X"AB",X"41",X"C8",X"00",X"B9", + X"41",X"FF",X"08",X"00",X"21",X"41",X"FF",X"78",X"00",X"2F",X"43",X"FF",X"20",X"00",X"A4",X"42", + X"FF",X"68",X"00",X"2D",X"42",X"C8",X"00",X"39",X"42",X"FF",X"88",X"00",X"B1",X"41",X"FF",X"50", + X"00",X"2A",X"41",X"78",X"00",X"2F",X"41",X"98",X"00",X"33",X"41",X"FF",X"48",X"00",X"29",X"43", + X"FF",X"08",X"00",X"A1",X"42",X"C8",X"00",X"B9",X"42",X"FF",X"40",X"00",X"28",X"42",X"C8",X"00", + X"39",X"42",X"FF",X"C8",X"00",X"B9",X"41",X"FF",X"28",X"00",X"25",X"41",X"A8",X"00",X"35",X"41", + X"FF",X"20",X"00",X"24",X"43",X"FF",X"58",X"00",X"AB",X"42",X"80",X"00",X"B0",X"42",X"FF",X"A8", + X"00",X"35",X"42",X"FF",X"28",X"00",X"A5",X"41",X"A8",X"00",X"B5",X"41",X"FF",X"08",X"00",X"21", + X"41",X"98",X"00",X"33",X"41",X"FF",X"30",X"00",X"26",X"43",X"FF",X"58",X"00",X"AB",X"42",X"C0", + X"00",X"B8",X"42",X"FF",X"48",X"00",X"29",X"42",X"FF",X"08",X"00",X"A1",X"41",X"B0",X"00",X"B6", + X"41",X"FF",X"50",X"00",X"2A",X"41",X"A0",X"00",X"34",X"41",X"FF",X"40",X"00",X"28",X"43",X"FF", + X"08",X"00",X"A1",X"42",X"C8",X"00",X"B9",X"42",X"FF",X"A0",X"00",X"34",X"42",X"FF",X"20",X"00", + X"A4",X"41",X"78",X"00",X"AF",X"41",X"FF",X"08",X"00",X"21",X"41",X"A8",X"00",X"35",X"41",X"FF", + X"08",X"00",X"21",X"43",X"88",X"00",X"31",X"43",X"FF",X"00",X"00",X"A0",X"42",X"80",X"00",X"B0", + X"42",X"FF",X"30",X"00",X"26",X"42",X"B0",X"00",X"36",X"42",X"FF",X"FF",X"08",X"00",X"21",X"41", + X"90",X"00",X"32",X"41",X"FF",X"FF",X"00",X"00",X"A0",X"42",X"A8",X"00",X"B5",X"42",X"FF",X"40", + X"00",X"28",X"42",X"A8",X"00",X"35",X"42",X"FF",X"08",X"00",X"A1",X"41",X"50",X"00",X"AA",X"41", + X"FF",X"00",X"00",X"20",X"41",X"90",X"00",X"32",X"41",X"FF",X"58",X"00",X"2B",X"43",X"FF",X"28", + X"00",X"A5",X"42",X"FF",X"00",X"00",X"20",X"42",X"B0",X"00",X"36",X"42",X"FF",X"28",X"00",X"A5", + X"41",X"78",X"00",X"AF",X"41",X"FF",X"58",X"00",X"2B",X"41",X"C8",X"00",X"39",X"41",X"FF",X"08", + X"00",X"21",X"43",X"FF",X"28",X"00",X"A5",X"42",X"C8",X"00",X"B9",X"42",X"FF",X"50",X"00",X"2A", + X"42",X"78",X"00",X"2F",X"42",X"FF",X"88",X"00",X"B1",X"41",X"FF",X"40",X"00",X"28",X"41",X"88", + X"00",X"31",X"41",X"FF",X"20",X"00",X"24",X"43",X"FF",X"70",X"00",X"AE",X"42",X"FF",X"00",X"00", + X"20",X"42",X"FF",X"40",X"00",X"A8",X"41",X"C8",X"00",X"B9",X"41",X"FF",X"20",X"00",X"24",X"41", + X"98",X"00",X"33",X"41",X"C8",X"00",X"39",X"41",X"FF",X"10",X"00",X"22",X"43",X"FF",X"58",X"00", + X"AB",X"42",X"C0",X"00",X"B8",X"42",X"FF",X"C0",X"00",X"38",X"42",X"FF",X"00",X"00",X"A0",X"41", + X"C8",X"00",X"B9",X"41",X"FF",X"28",X"00",X"25",X"41",X"C8",X"00",X"39",X"41",X"FF",X"08",X"00", + X"21",X"43",X"FF",X"00",X"00",X"A0",X"42",X"80",X"00",X"B0",X"42",X"C8",X"00",X"B9",X"42",X"FF", + X"70",X"00",X"2E",X"42",X"C8",X"00",X"39",X"42",X"FF",X"B0",X"00",X"B6",X"41",X"FF",X"C8",X"00", + X"39",X"41",X"FF",X"10",X"00",X"22",X"43",X"FF",X"28",X"00",X"A5",X"42",X"A0",X"00",X"B4",X"42", + X"FF",X"58",X"00",X"2B",X"42",X"70",X"00",X"2E",X"42",X"FF",X"68",X"00",X"AD",X"41",X"FF",X"40", + X"00",X"28",X"41",X"90",X"00",X"32",X"41",X"FF",X"68",X"00",X"2D",X"43",X"FF",X"68",X"00",X"AD", + X"42",X"FF",X"08",X"00",X"21",X"42",X"C8",X"00",X"39",X"42",X"FF",X"20",X"00",X"A4",X"41",X"C0", + X"00",X"B8",X"41",X"FF",X"08",X"00",X"21",X"41",X"C8",X"00",X"39",X"41",X"FF",X"89",X"9F",X"5F", + X"9F",X"35",X"9F",X"4A",X"9F",X"74",X"9F",X"B3",X"9F",X"9E",X"9F",X"C8",X"9F",X"DD",X"9F",X"F2", + X"9F",X"1C",X"A0",X"07",X"A0",X"31",X"A0",X"5B",X"A0",X"46",X"A0",X"DD",X"9F",X"1C",X"A0",X"70", + X"A0",X"07",X"A0",X"85",X"A0",X"FF",X"07",X"33",X"08",X"4C",X"FF",X"27",X"43",X"06",X"4C",X"FF", + X"8F",X"02",X"04",X"4C",X"FF",X"8F",X"53",X"02",X"4C",X"FF",X"67",X"02",X"08",X"4C",X"FF",X"FF", + X"87",X"02",X"06",X"4C",X"FF",X"40",X"63",X"04",X"4C",X"FF",X"AF",X"02",X"02",X"4C",X"FF",X"FF", + X"3F",X"02",X"08",X"4C",X"FF",X"C7",X"53",X"06",X"4C",X"FF",X"08",X"63",X"04",X"4C",X"FF",X"97", + X"02",X"02",X"4C",X"FF",X"FF",X"87",X"02",X"08",X"4C",X"FF",X"4F",X"33",X"06",X"4C",X"FF",X"3F", + X"02",X"04",X"4C",X"FF",X"C7",X"43",X"02",X"4C",X"FF",X"FF",X"8F",X"02",X"08",X"4C",X"FF",X"FF", + X"07",X"53",X"06",X"4C",X"FF",X"87",X"02",X"04",X"4C",X"07",X"63",X"02",X"4C",X"FF",X"FF",X"27", + X"02",X"08",X"4C",X"CF",X"33",X"06",X"4C",X"FF",X"27",X"43",X"04",X"4C",X"FF",X"5F",X"02",X"02", + X"4C",X"FF",X"FF",X"FF",X"2F",X"43",X"08",X"4C",X"FF",X"97",X"02",X"06",X"4C",X"FF",X"3F",X"53", + X"04",X"4C",X"FF",X"B7",X"02",X"02",X"4C",X"FF",X"97",X"02",X"08",X"4C",X"FF",X"6F",X"02",X"06", + X"4C",X"FF",X"B7",X"33",X"04",X"4C",X"FF",X"97",X"43",X"02",X"4C",X"FF",X"FF",X"FF",X"27",X"43", + X"08",X"4C",X"B7",X"02",X"06",X"4C",X"FF",X"FF",X"27",X"33",X"04",X"4C",X"AF",X"63",X"02",X"4C", + X"FF",X"FF",X"FF",X"4F",X"02",X"08",X"4C",X"FF",X"77",X"63",X"06",X"4C",X"FF",X"8F",X"33",X"04", + X"4C",X"FF",X"57",X"02",X"02",X"4C",X"FF",X"CF",X"02",X"08",X"4C",X"FF",X"AF",X"02",X"06",X"4C", + X"FF",X"1F",X"02",X"04",X"4C",X"FF",X"AF",X"43",X"02",X"4C",X"FF",X"FF",X"BF",X"02",X"08",X"4C", + X"FF",X"9F",X"33",X"06",X"4C",X"FF",X"1F",X"43",X"04",X"4C",X"FF",X"9F",X"02",X"02",X"4C",X"FF", + X"FF",X"3F",X"02",X"08",X"4C",X"FF",X"27",X"02",X"06",X"4C",X"FF",X"27",X"02",X"04",X"4C",X"FF", + X"FF",X"6F",X"63",X"02",X"4C",X"FF",X"FF",X"2F",X"02",X"08",X"4C",X"FF",X"7F",X"02",X"06",X"4C", + X"FF",X"47",X"53",X"04",X"4C",X"FF",X"9F",X"02",X"02",X"4C",X"FF",X"27",X"63",X"08",X"4C",X"FF", + X"5F",X"02",X"06",X"4C",X"27",X"53",X"04",X"4C",X"FF",X"FF",X"27",X"02",X"02",X"4C",X"FF",X"FF", + X"FF",X"67",X"43",X"08",X"4C",X"FF",X"FF",X"B7",X"63",X"06",X"4C",X"1F",X"63",X"04",X"4C",X"FF", + X"9F",X"63",X"02",X"4C",X"FF",X"FF",X"77",X"43",X"08",X"4C",X"FF",X"97",X"43",X"06",X"4C",X"37", + X"43",X"04",X"4C",X"FF",X"FF",X"9F",X"63",X"02",X"4C",X"FF",X"10",X"00",X"20",X"00",X"30",X"00", + X"50",X"00",X"00",X"01",X"00",X"02",X"00",X"03",X"00",X"05",X"00",X"10",X"00",X"20",X"00",X"30", + X"00",X"50",X"56",X"A1",X"18",X"A1",X"DA",X"A0",X"F9",X"A0",X"37",X"A1",X"8A",X"A1",X"6B",X"A1", + X"A9",X"A1",X"BE",X"A1",X"DD",X"A1",X"11",X"A2",X"F2",X"A1",X"30",X"A2",X"6E",X"A2",X"4F",X"A2", + X"BE",X"A1",X"11",X"A2",X"83",X"A2",X"F2",X"A1",X"F2",X"A1",X"F8",X"17",X"28",X"40",X"01",X"01", + X"02",X"0A",X"4C",X"02",X"F8",X"18",X"48",X"C8",X"01",X"02",X"03",X"0C",X"4C",X"03",X"F8",X"17", + X"68",X"C8",X"01",X"01",X"02",X"0E",X"4C",X"02",X"FF",X"F8",X"17",X"28",X"50",X"01",X"01",X"02", + X"0A",X"4C",X"02",X"F8",X"17",X"48",X"C8",X"01",X"01",X"02",X"0C",X"4C",X"02",X"F8",X"17",X"68", + X"C8",X"01",X"01",X"02",X"0E",X"4C",X"02",X"FF",X"F8",X"17",X"28",X"08",X"00",X"01",X"02",X"0A", + X"4C",X"02",X"F8",X"18",X"68",X"08",X"00",X"02",X"03",X"0C",X"4C",X"03",X"F8",X"17",X"A8",X"C8", + X"01",X"01",X"03",X"0E",X"4C",X"03",X"FF",X"F8",X"17",X"28",X"08",X"00",X"01",X"02",X"0A",X"4C", + X"02",X"F8",X"18",X"48",X"C8",X"01",X"02",X"03",X"0C",X"4C",X"03",X"F8",X"18",X"88",X"C8",X"00", + X"02",X"03",X"0E",X"4C",X"03",X"FF",X"F8",X"17",X"68",X"04",X"00",X"01",X"02",X"0A",X"4C",X"02", + X"F8",X"17",X"A8",X"00",X"01",X"01",X"02",X"0C",X"4C",X"02",X"FF",X"F8",X"17",X"28",X"40",X"01", + X"01",X"02",X"0A",X"4C",X"02",X"F8",X"18",X"68",X"C8",X"01",X"02",X"03",X"0C",X"4C",X"03",X"F8", + X"17",X"A8",X"B0",X"01",X"01",X"02",X"0E",X"4C",X"02",X"FF",X"F8",X"18",X"28",X"C0",X"01",X"02", + X"03",X"0A",X"4C",X"03",X"F8",X"17",X"A8",X"20",X"01",X"01",X"02",X"0C",X"4C",X"02",X"F8",X"18", + X"A8",X"C8",X"01",X"02",X"03",X"0E",X"4C",X"03",X"FF",X"F8",X"17",X"28",X"C0",X"00",X"01",X"02", + X"0A",X"4C",X"02",X"F8",X"18",X"A8",X"C8",X"01",X"02",X"03",X"0C",X"4C",X"03",X"FF",X"F8",X"1D", + X"28",X"B8",X"01",X"02",X"02",X"0A",X"4C",X"02",X"F8",X"1D",X"68",X"50",X"01",X"02",X"02",X"0C", + X"4C",X"02",X"F8",X"18",X"A8",X"78",X"01",X"02",X"03",X"0E",X"4C",X"03",X"FF",X"F8",X"17",X"48", + X"78",X"01",X"01",X"02",X"0A",X"4C",X"02",X"F8",X"17",X"A8",X"B0",X"00",X"01",X"02",X"0C",X"4C", + X"02",X"FF",X"F8",X"17",X"28",X"A8",X"00",X"01",X"02",X"0A",X"4C",X"02",X"F8",X"17",X"68",X"80", + X"01",X"01",X"02",X"0C",X"4C",X"02",X"F8",X"17",X"A8",X"20",X"00",X"01",X"02",X"0E",X"4C",X"02", + X"FF",X"F8",X"18",X"28",X"98",X"01",X"02",X"03",X"0A",X"4C",X"03",X"F8",X"17",X"88",X"20",X"01", + X"01",X"02",X"0C",X"4C",X"02",X"F8",X"1D",X"A8",X"C8",X"00",X"02",X"02",X"0E",X"4C",X"02",X"FF", + X"F8",X"18",X"28",X"A8",X"01",X"02",X"03",X"0A",X"4C",X"03",X"F8",X"17",X"48",X"98",X"01",X"01", + X"02",X"0C",X"4C",X"02",X"F8",X"17",X"88",X"B0",X"00",X"01",X"02",X"0E",X"4C",X"02",X"FF",X"F8", + X"18",X"28",X"C0",X"01",X"02",X"03",X"0A",X"4C",X"03",X"F8",X"17",X"68",X"00",X"01",X"01",X"02", + X"0C",X"4C",X"02",X"F8",X"17",X"A8",X"10",X"00",X"01",X"02",X"0E",X"4C",X"02",X"FF",X"F8",X"18", + X"28",X"B8",X"01",X"02",X"03",X"0A",X"4C",X"03",X"F8",X"17",X"A8",X"28",X"00",X"01",X"02",X"0C", + X"4C",X"02",X"FF",X"F8",X"18",X"28",X"C8",X"01",X"02",X"02",X"0A",X"4C",X"02",X"F8",X"1D",X"68", + X"C0",X"01",X"02",X"02",X"0C",X"4C",X"02",X"F8",X"18",X"A8",X"30",X"01",X"02",X"03",X"0E",X"4C", + X"02",X"FF",X"F8",X"17",X"28",X"30",X"00",X"01",X"02",X"0A",X"4C",X"02",X"F8",X"17",X"28",X"A0", + X"00",X"01",X"02",X"0C",X"4C",X"02",X"F8",X"17",X"A8",X"40",X"00",X"01",X"02",X"0E",X"4C",X"02", + X"FF",X"F5",X"A2",X"EF",X"A2",X"E9",X"A2",X"EC",X"A2",X"F2",X"A2",X"FB",X"A2",X"F8",X"A2",X"FE", + X"A2",X"01",X"A3",X"04",X"A3",X"0A",X"A3",X"07",X"A3",X"0D",X"A3",X"13",X"A3",X"10",X"A3",X"01", + X"A3",X"0A",X"A3",X"16",X"A3",X"07",X"A3",X"19",X"A3",X"01",X"07",X"40",X"01",X"06",X"40",X"01", + X"06",X"30",X"01",X"05",X"30",X"01",X"05",X"40",X"01",X"05",X"30",X"01",X"06",X"30",X"01",X"06", + X"40",X"01",X"05",X"30",X"01",X"05",X"30",X"01",X"04",X"30",X"01",X"04",X"30",X"01",X"04",X"30", + X"01",X"04",X"30",X"01",X"04",X"30",X"01",X"02",X"40",X"01",X"02",X"30",X"34",X"A3",X"3A",X"A3", + X"55",X"A3",X"37",X"A3",X"43",X"A3",X"3D",X"A3",X"40",X"A3",X"46",X"A3",X"49",X"A3",X"4C",X"A3", + X"4F",X"A3",X"52",X"A3",X"02",X"02",X"01",X"07",X"03",X"04",X"07",X"04",X"03",X"00",X"04",X"01", + X"07",X"06",X"03",X"02",X"02",X"02",X"06",X"03",X"02",X"03",X"06",X"00",X"04",X"05",X"01",X"01", + X"06",X"06",X"01",X"06",X"06",X"00",X"03",X"06",X"70",X"A3",X"7C",X"A3",X"B2",X"A3",X"76",X"A3", + X"8E",X"A3",X"82",X"A3",X"88",X"A3",X"94",X"A3",X"9A",X"A3",X"A0",X"A3",X"A6",X"A3",X"AC",X"A3", + X"B8",X"A3",X"42",X"A4",X"B5",X"A4",X"BF",X"A4",X"BB",X"A5",X"8D",X"A6",X"5F",X"A7",X"DD",X"A7", + X"46",X"A8",X"AF",X"A8",X"EB",X"A8",X"1D",X"A9",X"4F",X"A9",X"85",X"A9",X"8F",X"A9",X"99",X"A9", + X"6B",X"AA",X"75",X"AA",X"7F",X"AA",X"91",X"AA",X"9B",X"AA",X"A5",X"AA",X"95",X"AB",X"5D",X"AC", + X"FD",X"AC",X"DB",X"AD",X"E5",X"AD",X"4E",X"AE",X"A8",X"AE",X"F3",X"AE",X"3E",X"AF",X"BC",X"AF", + X"11",X"B0",X"98",X"B0",X"0A",X"B1",X"69",X"B1",X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A", + X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04", + X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00", + X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A", + X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04", + X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00", + X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A", + X"05",X"03",X"05",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04", + X"04",X"00",X"00",X"00",X"00",X"00",X"04",X"0A",X"05",X"03",X"05",X"04",X"FF",X"00",X"00",X"00", + X"00",X"00",X"03",X"0A",X"06",X"0C",X"05",X"05",X"00",X"00",X"00",X"00",X"03",X"0A",X"06",X"0C", + X"05",X"05",X"00",X"00",X"00",X"00",X"04",X"0A",X"06",X"0C",X"05",X"04",X"00",X"00",X"00",X"00", + X"03",X"0A",X"06",X"0C",X"05",X"05",X"00",X"00",X"00",X"00",X"03",X"0A",X"06",X"0C",X"05",X"05", + X"00",X"00",X"00",X"00",X"04",X"0A",X"06",X"0C",X"05",X"04",X"00",X"00",X"00",X"00",X"03",X"0A", + X"06",X"0C",X"05",X"05",X"00",X"00",X"00",X"00",X"03",X"0A",X"06",X"0C",X"05",X"05",X"00",X"00", + X"00",X"00",X"04",X"0A",X"06",X"0C",X"05",X"04",X"00",X"00",X"00",X"00",X"03",X"0A",X"06",X"0C", + X"05",X"05",X"00",X"00",X"00",X"00",X"03",X"0A",X"06",X"0C",X"05",X"05",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"3C",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"06", + X"0A",X"01",X"06",X"0C",X"05",X"06",X"0A",X"01",X"08",X"0B",X"05",X"06",X"0A",X"03",X"03",X"0A", + X"05",X"06",X"0A",X"04",X"05",X"09",X"05",X"06",X"0A",X"04",X"04",X"08",X"05",X"06",X"09",X"00", + X"02",X"07",X"05",X"06",X"09",X"0F",X"0A",X"06",X"05",X"06",X"09",X"05",X"0A",X"05",X"05",X"06", + X"09",X"02",X"05",X"04",X"05",X"06",X"09",X"00",X"04",X"03",X"05",X"06",X"08",X"05",X"03",X"02", + X"05",X"06",X"08",X"00",X"04",X"01",X"05",X"06",X"08",X"03",X"05",X"00",X"05",X"06",X"07",X"00", + X"00",X"0F",X"04",X"06",X"07",X"09",X"0A",X"0E",X"04",X"06",X"06",X"00",X"00",X"0D",X"04",X"06", + X"05",X"03",X"03",X"0C",X"04",X"06",X"05",X"00",X"00",X"0B",X"04",X"06",X"05",X"06",X"0E",X"0A", + X"04",X"06",X"05",X"00",X"00",X"09",X"04",X"06",X"05",X"03",X"0D",X"08",X"04",X"06",X"05",X"00", + X"0E",X"07",X"04",X"06",X"04",X"01",X"0F",X"06",X"04",X"06",X"04",X"00",X"07",X"05",X"04",X"06", + X"04",X"02",X"03",X"04",X"04",X"06",X"04",X"05",X"06",X"03",X"04",X"06",X"04",X"09",X"09",X"02", + X"04",X"06",X"03",X"08",X"06",X"01",X"04",X"06",X"03",X"07",X"02",X"00",X"04",X"06",X"03",X"07", + X"07",X"0F",X"03",X"06",X"03",X"07",X"0D",X"0E",X"03",X"06",X"03",X"08",X"0B",X"0D",X"03",X"06", + X"03",X"09",X"0A",X"0C",X"03",X"06",X"03",X"08",X"09",X"0B",X"03",X"06",X"02",X"0B",X"09",X"0A", + X"03",X"06",X"02",X"0A",X"0A",X"09",X"03",X"06",X"02",X"09",X"0A",X"08",X"03",X"05",X"01",X"06", + X"0B",X"07",X"03",X"06",X"01",X"03",X"0D",X"06",X"03",X"05",X"01",X"02",X"08",X"05",X"03",X"06", + X"01",X"0F",X"00",X"04",X"03",X"FF",X"00",X"00",X"00",X"00",X"00",X"07",X"0A",X"07",X"0C",X"05", + X"06",X"0A",X"08",X"0B",X"05",X"06",X"0A",X"04",X"0A",X"05",X"05",X"0A",X"05",X"09",X"05",X"07", + X"0A",X"05",X"08",X"05",X"06",X"09",X"02",X"07",X"05",X"06",X"09",X"0B",X"06",X"05",X"05",X"09", + X"0A",X"05",X"05",X"07",X"09",X"06",X"04",X"05",X"06",X"09",X"03",X"04",X"05",X"06",X"08",X"04", + X"02",X"05",X"05",X"08",X"05",X"01",X"05",X"07",X"08",X"06",X"00",X"05",X"06",X"07",X"02",X"0F", + X"04",X"06",X"07",X"0B",X"0E",X"04",X"05",X"03",X"08",X"0D",X"04",X"07",X"02",X"04",X"0C",X"04", + X"06",X"02",X"01",X"0B",X"04",X"06",X"02",X"0F",X"0A",X"04",X"05",X"02",X"0F",X"09",X"04",X"07", + X"02",X"0E",X"08",X"04",X"06",X"02",X"08",X"07",X"04",X"06",X"02",X"00",X"07",X"04",X"05",X"02", + X"09",X"05",X"04",X"07",X"02",X"04",X"04",X"04",X"06",X"02",X"0B",X"03",X"04",X"06",X"02",X"0A", + X"02",X"04",X"05",X"02",X"05",X"01",X"04",X"07",X"02",X"03",X"00",X"04",X"06",X"02",X"04",X"0F", + X"03",X"05",X"02",X"0E",X"0E",X"03",X"05",X"02",X"0A",X"0D",X"03",X"07",X"02",X"0B",X"0C",X"03", + X"06",X"02",X"0A",X"0B",X"03",X"05",X"02",X"0A",X"0A",X"03",X"05",X"02",X"0A",X"09",X"03",X"07", + X"02",X"0B",X"08",X"03",X"06",X"01",X"0B",X"07",X"03",X"05",X"01",X"0E",X"06",X"03",X"05",X"01", + X"09",X"05",X"03",X"07",X"01",X"01",X"04",X"03",X"FF",X"00",X"00",X"00",X"00",X"08",X"0A",X"05", + X"0C",X"05",X"06",X"0A",X"08",X"0B",X"05",X"05",X"0A",X"02",X"0A",X"05",X"05",X"0A",X"05",X"09", + X"05",X"08",X"0A",X"03",X"08",X"05",X"06",X"09",X"02",X"07",X"05",X"05",X"09",X"09",X"06",X"05", + X"05",X"09",X"0A",X"05",X"05",X"08",X"09",X"03",X"04",X"05",X"06",X"09",X"03",X"03",X"05",X"05", + X"08",X"02",X"02",X"05",X"05",X"08",X"01",X"01",X"05",X"08",X"08",X"04",X"00",X"05",X"06",X"07", + X"06",X"0F",X"04",X"05",X"07",X"09",X"0E",X"04",X"05",X"06",X"06",X"0D",X"04",X"08",X"05",X"02", + X"0C",X"04",X"06",X"05",X"06",X"0B",X"04",X"05",X"05",X"0D",X"0A",X"04",X"05",X"05",X"0C",X"09", + X"04",X"08",X"05",X"0C",X"08",X"04",X"06",X"05",X"0D",X"07",X"04",X"05",X"04",X"0E",X"06",X"04", + X"05",X"04",X"09",X"05",X"04",X"08",X"04",X"02",X"04",X"04",X"05",X"04",X"05",X"03",X"04",X"05", + X"04",X"08",X"02",X"04",X"05",X"04",X"05",X"01",X"04",X"08",X"04",X"01",X"00",X"04",X"05",X"03", + X"08",X"0F",X"03",X"05",X"03",X"0C",X"0E",X"03",X"05",X"03",X"04",X"0D",X"03",X"08",X"03",X"09", + X"0C",X"03",X"05",X"02",X"01",X"09",X"03",X"05",X"02",X"08",X"08",X"03",X"05",X"02",X"08",X"07", + X"03",X"08",X"02",X"09",X"06",X"03",X"05",X"01",X"03",X"05",X"03",X"05",X"01",X"0C",X"04",X"03", + X"05",X"01",X"0D",X"02",X"03",X"08",X"01",X"0F",X"01",X"03",X"FF",X"00",X"00",X"00",X"00",X"01", + X"05",X"0D",X"04",X"03",X"01",X"01",X"06",X"0C",X"08",X"00",X"01",X"01",X"06",X"0C",X"08",X"0D", + X"00",X"01",X"07",X"06",X"0B",X"0B",X"00",X"01",X"07",X"0A",X"02",X"0B",X"00",X"01",X"08",X"09", + X"04",X"0C",X"00",X"01",X"09",X"0C",X"08",X"0E",X"00",X"01",X"0B",X"0C",X"0B",X"0F",X"00",X"01", + X"0D",X"0D",X"04",X"03",X"01",X"01",X"0F",X"04",X"09",X"06",X"01",X"01",X"0D",X"04",X"04",X"03", + X"01",X"01",X"0B",X"0C",X"0B",X"0F",X"00",X"01",X"09",X"0C",X"08",X"0E",X"00",X"01",X"07",X"09", + X"04",X"0C",X"00",X"01",X"05",X"0A",X"02",X"0B",X"00",X"01",X"04",X"06",X"0B",X"0B",X"00",X"01", + X"03",X"04",X"09",X"0A",X"00",X"01",X"03",X"04",X"04",X"0A",X"00",X"01",X"02",X"0C",X"0B",X"09", + X"00",X"01",X"01",X"0C",X"08",X"09",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"01",X"05",X"05", + X"0F",X"00",X"01",X"05",X"09",X"0C",X"00",X"01",X"06",X"09",X"09",X"00",X"01",X"06",X"0C",X"07", + X"00",X"01",X"08",X"03",X"07",X"00",X"01",X"09",X"05",X"08",X"00",X"01",X"0A",X"09",X"09",X"00", + X"01",X"0C",X"0C",X"0B",X"00",X"01",X"0D",X"05",X"0F",X"00",X"01",X"0F",X"0A",X"02",X"01",X"01", + X"0D",X"05",X"0F",X"00",X"01",X"0B",X"0C",X"0B",X"00",X"01",X"09",X"09",X"09",X"00",X"01",X"07", + X"05",X"08",X"00",X"01",X"05",X"03",X"07",X"00",X"01",X"04",X"0C",X"07",X"00",X"01",X"03",X"0A", + X"06",X"00",X"01",X"03",X"05",X"05",X"00",X"01",X"02",X"0C",X"04",X"00",X"01",X"01",X"0C",X"03", + X"00",X"FF",X"00",X"00",X"00",X"00",X"01",X"05",X"03",X"01",X"01",X"01",X"05",X"07",X"0E",X"00", + X"01",X"06",X"07",X"0B",X"00",X"01",X"07",X"0A",X"09",X"00",X"01",X"08",X"01",X"09",X"00",X"01", + X"09",X"03",X"0A",X"00",X"01",X"0A",X"07",X"0B",X"00",X"01",X"0C",X"0A",X"0D",X"00",X"01",X"0D", + X"03",X"01",X"01",X"01",X"0F",X"08",X"04",X"01",X"01",X"0D",X"03",X"01",X"01",X"01",X"0B",X"0A", + X"0D",X"00",X"01",X"09",X"07",X"0B",X"00",X"01",X"07",X"03",X"0A",X"00",X"01",X"05",X"01",X"09", + X"00",X"01",X"04",X"0A",X"09",X"00",X"01",X"03",X"08",X"08",X"00",X"01",X"03",X"03",X"08",X"00", + X"01",X"02",X"0A",X"07",X"00",X"01",X"01",X"07",X"07",X"00",X"FF",X"00",X"00",X"00",X"00",X"03", + X"05",X"02",X"03",X"0E",X"02",X"03",X"05",X"03",X"03",X"0A",X"03",X"03",X"05",X"05",X"03",X"05", + X"04",X"03",X"05",X"02",X"03",X"0E",X"02",X"03",X"05",X"03",X"03",X"0A",X"03",X"03",X"05",X"05", + X"03",X"05",X"04",X"03",X"05",X"02",X"03",X"0E",X"02",X"03",X"05",X"03",X"03",X"0A",X"03",X"03", + X"05",X"05",X"03",X"05",X"04",X"FF",X"00",X"00",X"00",X"00",X"00",X"04",X"05",X"06",X"0C",X"05", + X"02",X"05",X"06",X"04",X"07",X"03",X"05",X"06",X"0A",X"08",X"04",X"05",X"06",X"0C",X"05",X"02", + X"05",X"06",X"04",X"07",X"03",X"05",X"06",X"0A",X"08",X"04",X"05",X"06",X"0C",X"05",X"02",X"05", + X"06",X"04",X"07",X"03",X"05",X"06",X"0A",X"08",X"FF",X"00",X"00",X"00",X"00",X"03",X"0A",X"0C", + X"05",X"00",X"03",X"0A",X"04",X"07",X"00",X"03",X"0A",X"0A",X"08",X"00",X"03",X"0A",X"0C",X"05", + X"00",X"03",X"0A",X"04",X"07",X"00",X"03",X"0A",X"0A",X"08",X"00",X"03",X"0A",X"0C",X"05",X"00", + X"03",X"0A",X"04",X"07",X"00",X"03",X"0A",X"0A",X"08",X"00",X"FF",X"00",X"00",X"00",X"00",X"04", + X"0A",X"08",X"01",X"07",X"01",X"01",X"0A",X"06",X"01",X"08",X"01",X"04",X"0A",X"0F",X"00",X"0D", + X"01",X"01",X"0A",X"0C",X"05",X"0E",X"01",X"04",X"0A",X"0B",X"09",X"02",X"02",X"01",X"0A",X"0D", + X"06",X"03",X"02",X"04",X"0A",X"02",X"03",X"0E",X"02",X"01",X"0A",X"02",X"04",X"0F",X"02",X"FF", + X"00",X"00",X"00",X"00",X"00",X"14",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"14", + X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"02",X"01",X"06",X"0C",X"05",X"00",X"02", + X"01",X"06",X"0C",X"05",X"00",X"02",X"02",X"06",X"0C",X"05",X"00",X"02",X"02",X"06",X"0C",X"05", + X"00",X"02",X"03",X"06",X"0C",X"05",X"00",X"02",X"03",X"06",X"0C",X"05",X"00",X"02",X"04",X"06", + X"0C",X"05",X"00",X"02",X"04",X"06",X"0C",X"05",X"00",X"02",X"05",X"06",X"0C",X"05",X"00",X"02", + X"05",X"06",X"0C",X"05",X"00",X"02",X"06",X"06",X"0C",X"05",X"00",X"02",X"06",X"06",X"0C",X"05", + X"00",X"02",X"07",X"06",X"0C",X"05",X"00",X"02",X"07",X"06",X"0C",X"05",X"00",X"02",X"08",X"06", + X"0C",X"05",X"00",X"02",X"08",X"06",X"0C",X"05",X"00",X"02",X"09",X"06",X"0C",X"05",X"00",X"02", + X"09",X"06",X"0C",X"05",X"00",X"02",X"0A",X"06",X"0C",X"05",X"00",X"02",X"0A",X"06",X"0C",X"05", + X"00",X"02",X"0B",X"06",X"0C",X"05",X"00",X"02",X"0B",X"06",X"0C",X"05",X"00",X"02",X"0C",X"06", + X"0C",X"05",X"00",X"02",X"0C",X"06",X"0C",X"05",X"00",X"02",X"0D",X"06",X"0C",X"05",X"00",X"02", + X"0D",X"06",X"0C",X"05",X"00",X"02",X"0E",X"06",X"0C",X"05",X"00",X"02",X"0E",X"06",X"0C",X"05", + X"00",X"02",X"0F",X"06",X"0C",X"05",X"00",X"02",X"0F",X"06",X"0C",X"05",X"00",X"02",X"0F",X"06", + X"0C",X"05",X"00",X"02",X"0F",X"06",X"0C",X"05",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"10", + X"0F",X"0E",X"01",X"06",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"53",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"53",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"03", + X"08",X"03",X"0D",X"0E",X"01",X"03",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00", + X"00",X"06",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"06",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0F",X"00",X"0D",X"01",X"15",X"00",X"00",X"00",X"00", + X"00",X"0B",X"0F",X"0F",X"00",X"0D",X"01",X"15",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0F", + X"00",X"0D",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B",X"0E",X"09",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0F",X"00",X"0D",X"01",X"09",X"00",X"00",X"00",X"00", + X"00",X"0B",X"0F",X"03",X"0D",X"0E",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B", + X"09",X"02",X"02",X"15",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B",X"09",X"02",X"02",X"09", + X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B",X"09",X"02",X"02",X"01",X"00",X"00",X"00",X"00", + X"00",X"1F",X"0F",X"0F",X"00",X"0D",X"01",X"21",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B", + X"0E",X"09",X"01",X"15",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B",X"0E",X"09",X"01",X"09", + X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0F",X"00",X"0D",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"0B",X"0F",X"03",X"0D",X"0E",X"01",X"15",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0F", + X"00",X"0D",X"01",X"09",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0B",X"0E",X"09",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"08",X"01",X"07",X"01",X"11",X"00",X"00",X"00",X"00", + X"00",X"04",X"0F",X"09",X"09",X"0B",X"02",X"0C",X"0F",X"02",X"03",X"0E",X"02",X"10",X"00",X"00", + X"00",X"00",X"00",X"0F",X"0F",X"08",X"01",X"07",X"01",X"10",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"01",X"07",X"01",X"15",X"00",X"00",X"00",X"00",X"0B", + X"0F",X"01",X"07",X"01",X"15",X"00",X"00",X"00",X"00",X"0B",X"0F",X"01",X"07",X"01",X"09",X"00", + X"00",X"00",X"00",X"0B",X"0F",X"0C",X"05",X"01",X"01",X"00",X"00",X"00",X"00",X"0B",X"0F",X"01", + X"07",X"01",X"09",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0E",X"09",X"01",X"01",X"00",X"00",X"00", + X"00",X"0B",X"0F",X"00",X"0D",X"01",X"15",X"00",X"00",X"00",X"00",X"0B",X"0F",X"00",X"0D",X"01", + X"09",X"00",X"00",X"00",X"00",X"0B",X"0F",X"00",X"0D",X"01",X"01",X"00",X"00",X"00",X"00",X"1F", + X"0F",X"01",X"07",X"01",X"21",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0C",X"05",X"01",X"15",X"00", + X"00",X"00",X"00",X"0B",X"0F",X"0C",X"05",X"01",X"09",X"00",X"00",X"00",X"00",X"0B",X"0F",X"01", + X"07",X"01",X"01",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0E",X"09",X"01",X"15",X"00",X"00",X"00", + X"00",X"0B",X"0F",X"01",X"07",X"01",X"09",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0C",X"05",X"01", + X"01",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"04", + X"0F",X"00",X"00",X"00",X"0C",X"0F",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"0F",X"0F", + X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"0F",X"06",X"08", + X"0B",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"0A",X"08",X"00",X"11",X"00",X"00",X"00", + X"00",X"0F",X"06",X"08",X"0B",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"0A",X"08",X"00", + X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"08",X"0B",X"00",X"11",X"00",X"00",X"00",X"00",X"0F", + X"06",X"0A",X"08",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"08",X"0B",X"00",X"11",X"00", + X"00",X"00",X"00",X"0F",X"06",X"0A",X"08",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"0F", + X"0C",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"0A",X"08",X"00",X"11",X"00",X"00",X"00", + X"00",X"0F",X"06",X"0B",X"09",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"0E",X"0A",X"00", + X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"08",X"0B",X"00",X"11",X"00",X"00",X"00",X"00",X"0F", + X"06",X"0A",X"08",X"00",X"11",X"00",X"00",X"00",X"00",X"0F",X"06",X"08",X"0B",X"00",X"01",X"00", + X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"03",X"0C",X"08", + X"01",X"07",X"01",X"01",X"0A",X"08",X"01",X"07",X"01",X"01",X"08",X"08",X"01",X"07",X"01",X"01", + X"06",X"08",X"01",X"07",X"01",X"01",X"04",X"08",X"01",X"07",X"01",X"01",X"02",X"08",X"01",X"07", + X"01",X"02",X"00",X"00",X"00",X"00",X"00",X"02",X"0C",X"0C",X"06",X"03",X"01",X"01",X"0A",X"0C", + X"06",X"03",X"01",X"01",X"08",X"0C",X"06",X"03",X"01",X"01",X"06",X"0C",X"06",X"03",X"01",X"02", + X"0C",X"0D",X"04",X"01",X"01",X"01",X"0A",X"0D",X"04",X"01",X"01",X"01",X"08",X"0D",X"04",X"01", + X"01",X"01",X"06",X"0D",X"04",X"01",X"01",X"03",X"0C",X"0C",X"08",X"0E",X"00",X"01",X"0A",X"0C", + X"08",X"0E",X"00",X"01",X"08",X"0C",X"08",X"0E",X"00",X"01",X"06",X"0C",X"08",X"0E",X"00",X"01", + X"04",X"0C",X"08",X"0E",X"00",X"01",X"02",X"0C",X"08",X"0E",X"00",X"02",X"00",X"00",X"00",X"00", + X"00",X"03",X"0C",X"05",X"0F",X"0C",X"00",X"01",X"0A",X"05",X"0F",X"0C",X"00",X"01",X"08",X"05", + X"0F",X"0C",X"00",X"01",X"06",X"05",X"0F",X"0C",X"00",X"01",X"04",X"05",X"0F",X"0C",X"00",X"01", + X"02",X"05",X"0F",X"0C",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"02",X"0C",X"0C",X"08",X"0B", + X"00",X"02",X"0A",X"0C",X"08",X"0B",X"00",X"02",X"08",X"0C",X"08",X"0B",X"00",X"02",X"06",X"0C", + X"08",X"0B",X"00",X"02",X"04",X"0C",X"08",X"0B",X"00",X"02",X"02",X"0C",X"08",X"0B",X"00",X"08", + X"01",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"3C",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"06",X"05",X"0B",X"07",X"00",X"02",X"04",X"0B",X"07",X"00",X"02", + X"03",X"0B",X"07",X"00",X"02",X"02",X"0B",X"07",X"00",X"08",X"01",X"0B",X"07",X"00",X"06",X"05", + X"0A",X"08",X"00",X"02",X"04",X"0A",X"08",X"00",X"02",X"03",X"0A",X"08",X"00",X"02",X"02",X"0A", + X"08",X"00",X"08",X"01",X"0A",X"08",X"00",X"02",X"05",X"0C",X"05",X"00",X"02",X"05",X"0C",X"05", + X"00",X"02",X"04",X"0C",X"05",X"00",X"02",X"04",X"0C",X"05",X"00",X"02",X"03",X"0C",X"05",X"00", + X"02",X"03",X"0C",X"05",X"00",X"02",X"02",X"0C",X"05",X"00",X"02",X"02",X"0C",X"05",X"00",X"02", + X"01",X"0C",X"05",X"00",X"02",X"01",X"0C",X"05",X"00",X"FF",X"00",X"00",X"00",X"00",X"0C",X"0D", + X"0C",X"08",X"0B",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"07",X"0D",X"07",X"0A",X"08",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"07",X"0D",X"07",X"0A",X"08",X"00",X"01",X"00",X"00",X"00", + X"00",X"00",X"0F",X"0D",X"06",X"0B",X"09",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"0F",X"0D", + X"07",X"0A",X"08",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"0C",X"0D",X"07",X"0E",X"0A",X"00", + X"04",X"00",X"00",X"00",X"00",X"00",X"10",X"0D",X"0C",X"08",X"0B",X"00",X"20",X"00",X"00",X"00", + X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"0C",X"0D",X"01",X"07",X"01",X"04",X"00",X"00", + X"00",X"00",X"07",X"0D",X"04",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"07",X"0D",X"04",X"01", + X"01",X"01",X"00",X"00",X"00",X"00",X"0F",X"0D",X"06",X"03",X"01",X"01",X"00",X"00",X"00",X"00", + X"0F",X"0D",X"04",X"01",X"01",X"11",X"00",X"00",X"00",X"00",X"0C",X"0D",X"0C",X"05",X"01",X"04", + X"00",X"00",X"00",X"00",X"10",X"0D",X"01",X"07",X"01",X"20",X"00",X"00",X"00",X"00",X"FF",X"00", + X"00",X"00",X"00",X"0C",X"0D",X"08",X"0B",X"00",X"04",X"00",X"00",X"00",X"00",X"07",X"0D",X"0A", + X"08",X"00",X"01",X"00",X"00",X"00",X"00",X"07",X"0D",X"0A",X"08",X"00",X"01",X"00",X"00",X"00", + X"00",X"0F",X"0D",X"0B",X"09",X"00",X"01",X"00",X"00",X"00",X"00",X"0F",X"0D",X"0A",X"08",X"00", + X"11",X"00",X"00",X"00",X"00",X"0C",X"0D",X"09",X"0B",X"02",X"04",X"00",X"00",X"00",X"00",X"10", + X"0D",X"03",X"0E",X"02",X"20",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"10",X"0F", + X"08",X"01",X"07",X"01",X"10",X"00",X"00",X"00",X"00",X"00",X"10",X"0F",X"0F",X"00",X"0D",X"01", + X"10",X"00",X"00",X"00",X"00",X"00",X"08",X"0F",X"0B",X"09",X"02",X"02",X"08",X"00",X"00",X"00", + X"00",X"00",X"08",X"0F",X"0F",X"00",X"0D",X"01",X"08",X"00",X"00",X"00",X"00",X"00",X"10",X"0F", + X"08",X"01",X"07",X"01",X"10",X"00",X"00",X"00",X"00",X"00",X"08",X"0F",X"07",X"0D",X"06",X"02", + X"08",X"00",X"00",X"00",X"00",X"00",X"08",X"0F",X"0B",X"09",X"02",X"02",X"08",X"00",X"00",X"00", + X"00",X"00",X"08",X"0F",X"07",X"0D",X"06",X"02",X"08",X"00",X"00",X"00",X"00",X"00",X"08",X"0F", + X"09",X"09",X"0B",X"02",X"08",X"00",X"00",X"00",X"00",X"00",X"20",X"0F",X"02",X"03",X"0E",X"02", + X"50",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"10",X"08",X"04",X"01", + X"01",X"10",X"00",X"00",X"00",X"00",X"10",X"08",X"01",X"07",X"01",X"10",X"00",X"00",X"00",X"00", + X"08",X"08",X"00",X"0D",X"01",X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"01",X"07",X"01",X"08", + X"00",X"00",X"00",X"00",X"10",X"08",X"04",X"01",X"01",X"10",X"00",X"00",X"00",X"00",X"10",X"08", + X"0D",X"0E",X"01",X"10",X"00",X"00",X"00",X"00",X"10",X"08",X"0D",X"0E",X"01",X"10",X"00",X"00", + X"00",X"00",X"20",X"08",X"00",X"0D",X"01",X"50",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00", + X"00",X"08",X"08",X"08",X"0B",X"00",X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"04",X"01",X"01", + X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"0B",X"00",X"08",X"00",X"00",X"00",X"00",X"08", + X"08",X"04",X"01",X"01",X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"0B",X"00",X"08",X"00", + X"00",X"00",X"00",X"08",X"08",X"04",X"01",X"01",X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"08", + X"0B",X"00",X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"04",X"01",X"01",X"08",X"00",X"00",X"00", + X"00",X"08",X"08",X"08",X"0B",X"00",X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"04",X"01",X"01", + X"08",X"00",X"00",X"00",X"00",X"08",X"08",X"06",X"03",X"01",X"08",X"00",X"00",X"00",X"00",X"08", + X"08",X"0A",X"08",X"00",X"08",X"00",X"00",X"00",X"00",X"20",X"08",X"08",X"0B",X"00",X"50",X"00", + X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"1F",X"0E",X"02",X"03",X"0E",X"02",X"01",X"00", + X"00",X"00",X"00",X"00",X"0B",X"0E",X"09",X"09",X"0B",X"02",X"01",X"00",X"00",X"00",X"00",X"00", + X"1F",X"0E",X"07",X"02",X"09",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"0B",X"0E",X"07",X"0D", + X"06",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"0A",X"0E",X"0B",X"09",X"02",X"02",X"02",X"00", + X"00",X"00",X"00",X"00",X"0A",X"0E",X"03",X"0D",X"0E",X"01",X"02",X"00",X"00",X"00",X"00",X"00", + X"0A",X"0E",X"0F",X"00",X"0D",X"01",X"02",X"00",X"00",X"00",X"00",X"00",X"0A",X"0E",X"0B",X"0E", + X"09",X"01",X"02",X"00",X"00",X"00",X"00",X"00",X"0B",X"0E",X"08",X"01",X"07",X"01",X"50",X"00", + X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"1F",X"06",X"09",X"02",X"02",X"01", + X"00",X"00",X"00",X"00",X"0B",X"06",X"09",X"02",X"02",X"01",X"00",X"00",X"00",X"00",X"1F",X"06", + X"09",X"02",X"02",X"01",X"00",X"00",X"00",X"00",X"0B",X"06",X"0D",X"0E",X"01",X"01",X"00",X"00", + X"00",X"00",X"0A",X"06",X"0E",X"09",X"01",X"02",X"00",X"00",X"00",X"00",X"0A",X"06",X"0E",X"09", + X"01",X"02",X"00",X"00",X"00",X"00",X"0A",X"06",X"09",X"04",X"01",X"02",X"00",X"00",X"00",X"00", + X"0A",X"06",X"0C",X"05",X"01",X"02",X"00",X"00",X"00",X"00",X"0B",X"06",X"01",X"07",X"01",X"50", + X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"1F",X"06",X"08",X"0B",X"00",X"01",X"00", + X"00",X"00",X"00",X"0B",X"06",X"0F",X"0C",X"00",X"01",X"00",X"00",X"00",X"00",X"1F",X"06",X"08", + X"0E",X"00",X"01",X"00",X"00",X"00",X"00",X"0B",X"06",X"06",X"0F",X"00",X"01",X"00",X"00",X"00", + X"00",X"0A",X"06",X"04",X"01",X"01",X"02",X"00",X"00",X"00",X"00",X"0A",X"06",X"06",X"03",X"01", + X"02",X"00",X"00",X"00",X"00",X"0A",X"06",X"09",X"04",X"01",X"02",X"00",X"00",X"00",X"00",X"0A", + X"06",X"0C",X"05",X"01",X"02",X"00",X"00",X"00",X"00",X"0B",X"06",X"01",X"07",X"01",X"50",X"00", + X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"32",X"C0",X"50",X"DD",X"21",X"52",X"B3",X"DD", + X"6E",X"00",X"DD",X"7E",X"01",X"67",X"B5",X"CA",X"B0",X"B2",X"DD",X"4E",X"02",X"DD",X"46",X"03", + X"54",X"5D",X"36",X"0F",X"13",X"0B",X"ED",X"B0",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"DD",X"4E", + X"02",X"DD",X"46",X"03",X"0B",X"32",X"C0",X"50",X"3E",X"55",X"77",X"BE",X"20",X"3E",X"3E",X"AA", + X"77",X"BE",X"20",X"38",X"78",X"D9",X"47",X"D9",X"79",X"D9",X"4F",X"D9",X"7C",X"D9",X"67",X"D9", + X"7D",X"D9",X"6F",X"CB",X"28",X"CB",X"19",X"78",X"B1",X"28",X"08",X"23",X"54",X"5D",X"36",X"0F", + X"13",X"ED",X"B0",X"D9",X"3E",X"AA",X"BE",X"20",X"0D",X"23",X"0B",X"78",X"B1",X"20",X"C6",X"11", + X"04",X"00",X"DD",X"19",X"18",X"99",X"EB",X"21",X"94",X"B3",X"18",X"04",X"EB",X"21",X"83",X"B3", + X"D9",X"01",X"FF",X"03",X"21",X"00",X"40",X"11",X"01",X"40",X"36",X"0F",X"ED",X"B0",X"01",X"FF", + X"03",X"21",X"00",X"44",X"11",X"01",X"44",X"36",X"0F",X"ED",X"B0",X"32",X"C0",X"50",X"D9",X"7A", + X"D9",X"67",X"D9",X"7B",X"D9",X"6F",X"D9",X"11",X"8A",X"41",X"06",X"11",X"7E",X"12",X"23",X"13", + X"10",X"FA",X"D9",X"0E",X"04",X"11",X"9B",X"41",X"06",X"04",X"AF",X"CB",X"25",X"CB",X"14",X"CB", + X"17",X"10",X"F8",X"13",X"FE",X"0A",X"38",X"02",X"C6",X"06",X"12",X"0D",X"20",X"EA",X"01",X"FF", + X"7F",X"32",X"C0",X"50",X"DD",X"CB",X"00",X"46",X"DD",X"CB",X"00",X"46",X"DD",X"CB",X"00",X"46", + X"DD",X"CB",X"00",X"46",X"DD",X"CB",X"00",X"46",X"0B",X"78",X"B1",X"20",X"E4",X"C3",X"00",X"00", + X"01",X"FF",X"03",X"21",X"00",X"40",X"11",X"00",X"40",X"13",X"36",X"0F",X"ED",X"B0",X"01",X"FF", + X"03",X"21",X"00",X"44",X"11",X"01",X"44",X"36",X"0F",X"ED",X"B0",X"06",X"0C",X"11",X"8A",X"41", + X"21",X"6B",X"B3",X"7E",X"12",X"13",X"23",X"10",X"FA",X"06",X"08",X"21",X"00",X"00",X"11",X"60", + X"B3",X"0E",X"00",X"32",X"C0",X"50",X"79",X"86",X"4F",X"2C",X"20",X"F7",X"24",X"7C",X"E6",X"0F", + X"20",X"F1",X"1A",X"B9",X"20",X"3A",X"13",X"7C",X"FE",X"40",X"20",X"02",X"26",X"80",X"10",X"E1", + X"11",X"CA",X"41",X"06",X"0C",X"21",X"77",X"B3",X"7E",X"12",X"13",X"23",X"10",X"FA",X"01",X"FF", + X"7F",X"32",X"C0",X"50",X"DD",X"CB",X"00",X"46",X"DD",X"CB",X"00",X"46",X"DD",X"CB",X"00",X"46", + X"DD",X"CB",X"00",X"46",X"DD",X"CB",X"00",X"46",X"0B",X"78",X"B1",X"20",X"E4",X"C3",X"A4",X"06", + X"7C",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"FE",X"0A",X"38",X"02",X"C6",X"06",X"08",X"11",X"CA", + X"41",X"21",X"A5",X"B3",X"06",X"13",X"7E",X"12",X"23",X"13",X"10",X"FA",X"13",X"08",X"12",X"C3", + X"91",X"B2",X"00",X"4C",X"00",X"04",X"00",X"40",X"00",X"04",X"00",X"44",X"00",X"04",X"00",X"00", + X"3A",X"9C",X"D3",X"E9",X"90",X"1A",X"5C",X"00",X"4A",X"FF",X"FF",X"21",X"10",X"1C",X"0A",X"12", + X"17",X"14",X"12",X"1A",X"0A",X"1E",X"1A",X"21",X"1E",X"1C",X"0A",X"12",X"17",X"14",X"12",X"1A", + X"0A",X"1E",X"1A",X"21",X"10",X"1C",X"0A",X"12",X"17",X"14",X"12",X"1A",X"0A",X"26",X"21",X"18", + X"23",X"14",X"0A",X"0A",X"21",X"10",X"1C",X"0A",X"12",X"17",X"14",X"12",X"1A",X"0A",X"11",X"21", + X"18",X"13",X"16",X"14",X"0A",X"21",X"1E",X"1C",X"0A",X"12",X"17",X"14",X"12",X"1A",X"0A",X"14", + X"21",X"21",X"1E",X"21",X"0A",X"21",X"1E",X"1C",X"D1",X"E9",X"11",X"B1",X"3B",X"A4",X"85",X"93", + X"56",X"FF",X"C7",X"2D",X"F8",X"30",X"20",X"9A",X"C1",X"59",X"92",X"69",X"9F",X"E9",X"03",X"DB", + X"17",X"C3",X"BB",X"94",X"FC",X"19",X"45",X"FF",X"79",X"2B",X"FE",X"FC",X"24",X"B3",X"EB",X"21", + X"9F",X"E4",X"34",X"E8",X"BB",X"DC",X"AC",X"9E",X"B1",X"3B",X"20",X"81",X"F8",X"A3",X"A9",X"00", + X"98",X"F5",X"B0",X"E4",X"0F",X"2B",X"30",X"7D",X"BA",X"83",X"4C",X"79",X"FA",X"19",X"A9",X"31", + X"A6",X"09",X"1E",X"21",X"20",X"B1",X"24",X"A9",X"23",X"91",X"16",X"6A",X"DA",X"7B",X"36",X"51", + X"30",X"AB",X"0F",X"B3",X"69",X"20",X"36",X"81",X"0F",X"C1",X"A0",X"0D",X"64",X"61",X"72",X"71", + X"74",X"35",X"39",X"18",X"29",X"C1",X"19",X"A7",X"23",X"50",X"F1",X"55",X"09",X"34",X"67",X"30", + X"86",X"2C",X"41",X"6C",X"52",X"67",X"41",X"B7",X"07",X"30",X"79",X"05",X"CF",X"20",X"C7",X"41", + X"31",X"21",X"14",X"E1",X"20",X"5A",X"00",X"A0",X"B4",X"8B",X"50",X"00",X"9D",X"34",X"60",X"25", + X"A0",X"B0",X"2C",X"02",X"12",X"71",X"4D",X"20",X"BB",X"E2",X"A3",X"09",X"B1",X"00",X"5D",X"B5", + X"83",X"36",X"52",X"08",X"71",X"10",X"28",X"3C",X"A4",X"55",X"45",X"C1",X"30",X"95",X"19",X"AE", + X"49",X"68",X"61",X"F0",X"20",X"35",X"26",X"B0",X"71",X"E3",X"81",X"28",X"80",X"3D",X"5B",X"08", + X"CC",X"1F",X"A1",X"FE",X"6F",X"F4",X"4B",X"5F",X"A4",X"8F",X"FC",X"DC",X"3F",X"FB",X"97",X"FB", + X"42",X"1E",X"AE",X"BA",X"D7",X"57",X"9F",X"7A",X"BC",X"E3",X"FE",X"1E",X"5F",X"CD",X"8A",X"C8", + X"D3",X"23",X"FE",X"26",X"0B",X"B2",X"94",X"DC",X"CA",X"0A",X"B3",X"FE",X"56",X"A3",X"E2",X"F4", + X"F6",X"CD",X"56",X"87",X"5C",X"76",X"D4",X"B8",X"D4",X"AF",X"DF",X"F4",X"B4",X"5F",X"42",X"FD", + X"EB",X"F1",X"AB",X"07",X"D5",X"D5",X"3C",X"72",X"9B",X"FF",X"BA",X"71",X"BB",X"7F",X"75",X"37", + X"55",X"3D",X"54",X"9C",X"DF",X"53",X"6F",X"F6",X"67",X"0A",X"BC",X"4B",X"4D",X"2D",X"95",X"96", + X"BD",X"B9",X"1C",X"6D",X"96",X"F7",X"BD",X"5F",X"7D",X"77",X"9F",X"0A",X"DB",X"56",X"92",X"DE", + X"FF",X"59",X"FF",X"4B",X"57",X"E6",X"95",X"B3",X"7A",X"F3",X"49",X"52",X"2E",X"55",X"6E",X"93", + X"B9",X"05",X"7B",X"0C",X"48",X"BC",X"E0",X"BE",X"51",X"CD",X"29",X"11",X"D9",X"E9",X"01",X"70", + X"04",X"70",X"05",X"81",X"A1",X"99",X"59",X"B4",X"A0",X"6A",X"10",X"31",X"43",X"71",X"AC",X"2A", + X"33",X"05",X"89",X"B7",X"B1",X"31",X"1F",X"63",X"08",X"25",X"73",X"A9",X"30",X"30",X"7F",X"81", + X"8D",X"14",X"AB",X"02",X"91",X"73",X"1B",X"71",X"85",X"EA",X"0E",X"28",X"55",X"58",X"39",X"50", + X"94",X"11",X"05",X"E0",X"DC",X"0A",X"20",X"03",X"10",X"46",X"14",X"10",X"C1",X"C0",X"E8",X"1B", + X"2A",X"A9",X"A4",X"E1",X"D2",X"19",X"87",X"01",X"A0",X"80",X"25",X"26",X"73",X"D8",X"73",X"A8", + X"41",X"65",X"E4",X"30",X"A0",X"20",X"89",X"B1",X"30",X"A0",X"88",X"52",X"6A",X"25",X"38",X"25", + X"E0",X"22",X"44",X"B5",X"60",X"8C",X"9C",X"5C",X"B2",X"84",X"43",X"05",X"A2",X"34",X"05",X"28", + X"4A",X"3F",X"69",X"D3",X"3E",X"DF",X"D3",X"4C",X"CD",X"D0",X"3F",X"DA",X"5F",X"5E",X"BE",X"F7", + X"67",X"D3",X"2F",X"ED",X"D3",X"5C",X"9A",X"ED",X"52",X"C6",X"56",X"FF",X"76",X"DC",X"BB",X"EF", + X"C7",X"9F",X"EC",X"CA",X"7D",X"1E",X"79",X"F4",X"8A",X"02",X"3C",X"D7",X"BF",X"76",X"B8",X"54", + X"E9",X"E9",X"FC",X"02",X"66",X"FF",X"FC",X"E0",X"AA",X"AD",X"9E",X"F8",X"EB",X"1F",X"C9",X"77", + X"98",X"F7",X"3F",X"8F",X"E6",X"55",X"AA",X"93",X"4C",X"6F",X"DF",X"D9",X"93",X"CB",X"7C",X"3F", + X"B5",X"97",X"2E",X"83",X"CF",X"FF",X"F5",X"CE",X"E5",X"1F",X"7B",X"3B",X"77",X"D6",X"C2",X"4F", + X"7F",X"0C",X"BE",X"EF",X"BB",X"67",X"DF",X"EE",X"5A",X"AF",X"1F",X"3E",X"37",X"FF",X"C6",X"5E", + X"DF",X"EF",X"BF",X"D7",X"92",X"6F",X"D5",X"7F",X"FE",X"EE",X"6B",X"D9",X"77",X"4F",X"DE",X"6B", + X"DE",X"D3",X"87",X"5E",X"A6",X"D7",X"04",X"46",X"5A",X"44",X"2E",X"80",X"26",X"76",X"69",X"2F", + X"D6",X"FB",X"C7",X"07",X"16",X"05",X"96",X"45",X"4B",X"E2",X"CF",X"04",X"0C",X"AC",X"2F",X"5E", + X"D1",X"32",X"9F",X"C3",X"BE",X"26",X"2F",X"6A",X"62",X"36",X"C2",X"02",X"76",X"E7",X"0F",X"BE", + X"97",X"2E",X"DE",X"2D",X"1F",X"4F",X"A3",X"DF",X"6B",X"5F",X"0F",X"8B",X"C2",X"42",X"27",X"05", + X"2C",X"81",X"01",X"2E",X"86",X"0C",X"4E",X"EB",X"65",X"04",X"56",X"5E",X"16",X"89",X"82",X"A2", + X"74",X"C4",X"3A",X"97",X"8E",X"B8",X"47",X"3E",X"24",X"C1",X"AB",X"26",X"0B",X"AC",X"E7",X"32", + X"21",X"7E",X"42",X"57",X"82",X"A3",X"5B",X"05",X"1F",X"CA",X"03",X"EF",X"A6",X"04",X"80",X"46", + X"92",X"2E",X"86",X"02",X"B3",X"4A",X"4B",X"0F",X"E7",X"AB",X"80",X"9E",X"2A",X"56",X"87",X"4D", + X"B0",X"79",X"75",X"5C",X"A3",X"2C",X"11",X"CF",X"7E",X"D9",X"72",X"B9",X"D8",X"3D",X"BE",X"E8", + X"B1",X"F5",X"79",X"F1",X"78",X"B0",X"F8",X"A0",X"D2",X"39",X"F9",X"F8",X"3C",X"72",X"FC",X"E1", + X"C9",X"E9",X"B1",X"DE",X"B1",X"C4",X"AD",X"B9",X"2B",X"60",X"D3",X"C8",X"EC",X"B5",X"FB",X"F9", + X"70",X"69",X"1A",X"FD",X"7D",X"DB",X"A9",X"39",X"9D",X"29",X"BA",X"B1",X"00",X"BD",X"3E",X"99", + X"74",X"F0",X"23",X"A9",X"BB",X"34",X"8B",X"F5",X"F0",X"B5",X"68",X"F0",X"53",X"30",X"F1",X"E7", + X"A7",X"82",X"FD",X"31",X"B8",X"82",X"D0",X"FF",X"EE",X"D0",X"1A",X"A0",X"F1",X"6D",X"ED",X"F1", + X"18",X"E7",X"D8",X"F2",X"A1",X"A5",X"FE",X"ED",X"FB",X"D0",X"D9",X"F9",X"F8",X"BB",X"7C",X"4B", + X"75",X"85",X"74",X"20",X"25",X"66",X"95",X"79",X"69",X"69",X"DF",X"A8",X"31",X"31",X"31",X"DB", + X"26",X"5B",X"71",X"6F",X"8E",X"16",X"C6",X"63",X"23",X"27",X"43",X"53",X"96",X"46",X"07",X"D6", + X"58",X"EE",X"CE",X"C4",X"42",X"43",X"04",X"45",X"4F",X"42",X"15",X"46",X"DF",X"07",X"37",X"24", + X"22",X"6A",X"56",X"41",X"05",X"17",X"D1",X"0F",X"02",X"0B",X"46",X"ED",X"E1",X"AF",X"04",X"D7", + X"27",X"0E",X"02",X"96",X"17",X"0F",X"07",X"4F",X"0E",X"EC",X"D5",X"4F",X"4A",X"E7",X"E5",X"37", + X"8A",X"4C",X"8B",X"8D",X"26",X"F5",X"6A",X"15",X"E7",X"97",X"17",X"2E",X"94",X"EB",X"89",X"42", + X"1C",X"8F",X"06",X"8C",X"2F",X"50",X"37",X"FE",X"2A",X"8F",X"B1",X"05",X"CF",X"10",X"7E",X"E9", + X"06",X"C7",X"62",X"2F",X"9C",X"56",X"CE",X"6D",X"77",X"0F",X"D2",X"22",X"9B",X"3E",X"2E",X"8B", + X"76",X"DF",X"92",X"8E",X"44",X"4F",X"D0",X"0E",X"0B",X"AE",X"54",X"5A",X"48",X"56",X"40",X"47", + X"7E",X"88",X"7D",X"B8",X"92",X"3A",X"FB",X"E8",X"71",X"FF",X"58",X"F9",X"85",X"E9",X"91",X"F7", + X"AC",X"C5",X"20",X"2F",X"CB",X"F0",X"5C",X"70",X"70",X"BA",X"51",X"B9",X"11",X"A1",X"AC",X"B2", + X"BD",X"59",X"35",X"58",X"EB",X"21",X"B9",X"B0",X"AC",X"FA",X"C9",X"7D",X"29",X"6A",X"39",X"59", + X"8C",X"58",X"B4",X"21",X"C0",X"F1",X"76",X"BB",X"F1",X"69",X"5B",X"C8",X"D8",X"79",X"9C",X"F4", + X"0E",X"2A",X"A9",X"7F",X"35",X"39",X"C9",X"28",X"B7",X"F2",X"38",X"78",X"9A",X"BA",X"E1",X"39", + X"FD",X"A0",X"A9",X"65",X"FC",X"B9",X"E1",X"1C",X"39",X"D1",X"E1",X"B5",X"85",X"F0",X"C4",X"73", + X"AE",X"F8",X"37",X"B1",X"78",X"90",X"B1",X"51",X"7F",X"21",X"A8",X"76",X"D9",X"BC",X"FD",X"B8", + X"EC",X"48",X"3D",X"B7",X"B4",X"99",X"82",X"18",X"FA",X"B1",X"5B",X"7B",X"39",X"8D",X"A9",X"FD", + X"DF",X"E6",X"FF",X"5E",X"42",X"F7",X"7B",X"CB",X"E7",X"FF",X"F7",X"CF",X"DD",X"AF",X"D7",X"DE", + X"47",X"6F",X"CF",X"9F",X"67",X"F5",X"1B",X"AD",X"63",X"47",X"DF",X"BF",X"C5",X"FD",X"DF",X"CD", + X"EB",X"F7",X"87",X"9F",X"DF",X"F3",X"1F",X"FB",X"FF",X"EF",X"FF",X"F5",X"EF",X"9B",X"6F",X"9E", + X"89",X"6F",X"B4",X"AE",X"F3",X"AB",X"F5",X"9F",X"5B",X"7B",X"4B",X"BF",X"EF",X"7F",X"EF",X"DF", + X"FF",X"FC",X"1B",X"FD",X"FD",X"EE",X"48",X"FE",X"DF",X"FA",X"E3",X"17",X"77",X"9D",X"7F",X"D5", + X"F9",X"DD",X"E4",X"D9",X"FA",X"FC",X"D3",X"CD",X"CF",X"AC",X"EB",X"EF",X"CB",X"8F",X"FD",X"F3", + X"F7",X"F3",X"C3",X"5F",X"CF",X"DC",X"CA",X"DF",X"DA",X"7F",X"FB",X"9F",X"FF",X"B6",X"AF",X"FF", + X"FF",X"FA",X"DD",X"FD",X"E3",X"D5",X"B7",X"6E",X"D7",X"9D",X"9C",X"E7",X"4B",X"49",X"FE",X"FF", + X"5A",X"19",X"20",X"70",X"37",X"30",X"C0",X"66",X"90",X"38",X"20",X"20",X"A0",X"C9",X"80",X"00", + X"0A",X"84",X"04",X"1A",X"0C",X"B2",X"08",X"18",X"00",X"49",X"E4",X"52",X"5C",X"75",X"0C",X"10", + X"30",X"28",X"D7",X"12",X"1A",X"40",X"02",X"A2",X"00",X"90",X"88",X"24",X"10",X"E8",X"78",X"C8", + X"82",X"08",X"20",X"00",X"8C",X"21",X"01",X"48",X"99",X"AA",X"EC",X"31",X"46",X"26",X"70",X"CC", + X"05",X"80",X"B8",X"63",X"C1",X"18",X"00",X"30",X"32",X"00",X"10",X"00",X"A1",X"23",X"22",X"04", + X"0A",X"C4",X"67",X"00",X"89",X"15",X"00",X"82",X"62",X"80",X"A2",X"50",X"00",X"3E",X"20",X"A3", + X"32",X"CC",X"2F",X"3C",X"80",X"10",X"81",X"A5",X"01",X"18",X"03",X"75",X"41",X"51",X"56",X"28", + X"04",X"A0",X"3D",X"6A",X"21",X"54",X"D5",X"15",X"3A",X"9A",X"A3",X"18",X"19",X"98",X"32",X"B0", + X"F7",X"FD",X"EF",X"4B",X"DA",X"5F",X"A3",X"DB",X"FF",X"EB",X"FB",X"DF",X"C7",X"EE",X"C7",X"F7", + X"FD",X"BF",X"C9",X"C7",X"63",X"9F",X"F5",X"FF",X"6F",X"1A",X"FE",X"DE",X"7F",X"5F",X"FD",X"FF", + X"F9",X"95",X"F9",X"EB",X"81",X"3B",X"5D",X"D3",X"DF",X"A3",X"E7",X"CF",X"BE",X"AF",X"8F",X"7E", + X"34",X"B5",X"1D",X"CB",X"69",X"6F",X"F1",X"93",X"B4",X"EF",X"E7",X"0D",X"FF",X"3D",X"DB",X"AE", + X"33",X"BB",X"6F",X"5F",X"05",X"83",X"E7",X"9F",X"FB",X"E6",X"BB",X"D1",X"E5",X"D9",X"D7",X"A7", + X"BF",X"FB",X"7F",X"ED",X"5F",X"7D",X"13",X"D7",X"CC",X"FB",X"DC",X"97",X"FF",X"BD",X"75",X"7F", + X"C6",X"16",X"FA",X"C8",X"EE",X"E8",X"A3",X"E7",X"FD",X"A7",X"C6",X"0F",X"E3",X"D4",X"EB",X"04", + X"D1",X"1B",X"C8",X"17",X"C5",X"9F",X"A7",X"77",X"D8",X"A8",X"DF",X"9E",X"3F",X"DB",X"F2",X"FF", + X"00",X"D1",X"C1",X"28",X"1C",X"18",X"00",X"92",X"60",X"20",X"01",X"6A",X"20",X"C0",X"23",X"1A", + X"AB",X"5A",X"D0",X"B2",X"1B",X"10",X"91",X"D1",X"D8",X"02",X"44",X"B0",X"82",X"02",X"6C",X"80", + X"22",X"BC",X"B2",X"38",X"78",X"01",X"20",X"80",X"02",X"9C",X"34",X"A0",X"80",X"30",X"8D",X"A4", + X"52",X"10",X"24",X"D4",X"C8",X"80",X"B0",X"06",X"1C",X"00",X"54",X"40",X"E4",X"68",X"04",X"48", + X"09",X"28",X"01",X"40",X"4A",X"0B",X"EA",X"C0",X"20",X"35",X"80",X"C4",X"13",X"10",X"84",X"9A", + X"C7",X"82",X"34",X"31",X"95",X"38",X"18",X"2A",X"1C",X"DC",X"92",X"A3",X"98",X"00",X"2C",X"7D", + X"96",X"A4",X"B0",X"38",X"27",X"A2",X"C1",X"20",X"94",X"AD",X"0B",X"82",X"1C",X"A1",X"08",X"00", + X"A8",X"81",X"20",X"05",X"20",X"A8",X"A4",X"A8",X"27",X"88",X"02",X"88",X"48",X"CB",X"32",X"80", + X"9F",X"FC",X"74",X"A8",X"D9",X"F9",X"C9",X"FD",X"FB",X"3F",X"FB",X"E8",X"F5",X"F8",X"B8",X"99", + X"58",X"F9",X"E8",X"6B",X"D3",X"2B",X"7B",X"DE",X"D9",X"FB",X"30",X"F9",X"16",X"7B",X"F9",X"7D", + X"F0",X"D9",X"7C",X"FB",X"D9",X"71",X"51",X"BA",X"CD",X"F1",X"FC",X"FB",X"FB",X"F7",X"F9",X"F9", + X"DA",X"E6",X"F8",X"79",X"44",X"AB",X"99",X"58",X"78",X"F5",X"FD",X"E9",X"F9",X"1A",X"9A",X"F5", + X"FC",X"F1",X"FB",X"7A",X"77",X"B8",X"51",X"31",X"39",X"9B",X"A9",X"F5",X"70",X"79",X"93",X"FD", + X"39",X"6B",X"DB",X"F1",X"BA",X"B9",X"D9",X"F6",X"9F",X"FC",X"F9",X"E9",X"F1",X"B8",X"DE",X"F9", + X"E9",X"3C",X"B9",X"B1",X"79",X"F9",X"71",X"B1",X"F2",X"79",X"FC",X"EF",X"F8",X"69",X"E1",X"31", + X"ED",X"B8",X"99",X"B0",X"E9",X"F3",X"29",X"FB",X"F8",X"FB",X"71",X"BA",X"F9",X"B8",X"3D",X"19", + X"06",X"03",X"06",X"C4",X"62",X"2C",X"50",X"86",X"12",X"5C",X"06",X"87",X"07",X"48",X"04",X"60", + X"46",X"D6",X"9F",X"5C",X"44",X"D7",X"A4",X"C7",X"42",X"23",X"8A",X"06",X"07",X"2C",X"21",X"02", + X"08",X"42",X"97",X"2F",X"87",X"10",X"45",X"5A",X"8C",X"0C",X"14",X"44",X"04",X"06",X"A7",X"E0", + X"86",X"A1",X"46",X"26",X"02",X"06",X"47",X"2B",X"83",X"4E",X"E6",X"AC",X"B2",X"84",X"56",X"97", + X"44",X"04",X"AC",X"46",X"0E",X"42",X"66",X"86",X"06",X"A5",X"46",X"1E",X"46",X"D6",X"86",X"06", + X"02",X"42",X"16",X"01",X"21",X"06",X"3B",X"46",X"12",X"42",X"D6",X"06",X"A3",X"0F",X"77",X"86", + X"42",X"16",X"86",X"86",X"0A",X"8B",X"05",X"37",X"2D",X"F2",X"C4",X"0E",X"3E",X"D7",X"87",X"06", + X"C4",X"46",X"85",X"8E",X"4A",X"B0",X"03",X"E6",X"0F",X"C6",X"86",X"D6",X"42",X"08",X"8F",X"65", + X"3F",X"ED",X"69",X"F9",X"59",X"AB",X"7D",X"B5",X"70",X"FD",X"FD",X"BB",X"3F",X"35",X"39",X"EB", + X"7E",X"F8",X"BB",X"7C",X"F1",X"F9",X"FD",X"FD",X"ED",X"F9",X"F9",X"61",X"B9",X"DA",X"D0",X"FF", + X"6D",X"71",X"3F",X"BB",X"D8",X"F5",X"C9",X"68",X"3D",X"F7",X"40",X"F1",X"F8",X"EC",X"A0",X"A8", + X"67",X"B9",X"DE",X"7F",X"98",X"3C",X"DE",X"E9",X"79",X"89",X"3B",X"B0",X"E9",X"F9",X"88",X"F9", + X"F0",X"B7",X"FC",X"E8",X"D8",X"F5",X"B6",X"FD",X"B9",X"F0",X"DC",X"52",X"59",X"B9",X"D9",X"E3", + X"D5",X"F9",X"11",X"B1",X"F9",X"F5",X"E9",X"F8",X"FC",X"79",X"39",X"FB",X"FD",X"B1",X"A0",X"7F", + X"39",X"FF",X"B5",X"F8",X"33",X"FB",X"D3",X"F8",X"F9",X"EB",X"E9",X"79",X"BD",X"7B",X"F9",X"A0", + X"D4",X"B7",X"F8",X"F8",X"19",X"51",X"48",X"7A",X"E1",X"B1",X"DC",X"E8",X"30",X"D9",X"74",X"39", + X"23",X"0E",X"08",X"94",X"06",X"6C",X"32",X"06",X"86",X"86",X"63",X"A6",X"C7",X"84",X"CD",X"C8", + X"32",X"0F",X"8D",X"0E",X"41",X"0C",X"66",X"06",X"E6",X"02",X"88",X"46",X"44",X"77",X"8E",X"A4", + X"9E",X"46",X"5E",X"0A",X"6E",X"87",X"82",X"88",X"02",X"1C",X"8D",X"9D",X"02",X"97",X"6A",X"66", + X"F3",X"A4",X"03",X"81",X"46",X"9A",X"1E",X"34",X"05",X"BD",X"43",X"02",X"03",X"8A",X"A7",X"CC", + X"02",X"5C",X"2E",X"0A",X"07",X"57",X"14",X"C4",X"08",X"0E",X"26",X"A8",X"6F",X"C6",X"03",X"0E", + X"92",X"0E",X"A1",X"26",X"37",X"8A",X"86",X"0E",X"02",X"66",X"C1",X"85",X"42",X"52",X"8C",X"66", + X"86",X"86",X"46",X"0E",X"86",X"E7",X"9E",X"1E",X"C6",X"0B",X"08",X"C6",X"46",X"C6",X"0C",X"44", + X"40",X"84",X"17",X"85",X"46",X"67",X"46",X"8C",X"46",X"67",X"8D",X"95",X"4E",X"C5",X"40",X"06", + X"7B",X"BF",X"FD",X"77",X"DF",X"FF",X"27",X"72",X"FE",X"4E",X"7F",X"DB",X"9B",X"67",X"1F",X"F7", + X"DF",X"BD",X"AF",X"FE",X"F5",X"F5",X"CC",X"36",X"F3",X"FD",X"53",X"6D",X"EF",X"D8",X"BE",X"D5", + X"BF",X"AB",X"1D",X"F2",X"CB",X"BC",X"FC",X"BD",X"6D",X"03",X"FF",X"BF",X"93",X"FF",X"AF",X"FB", + X"A3",X"4F",X"C6",X"7D",X"DB",X"79",X"F5",X"7B",X"7D",X"EB",X"FD",X"EB",X"CD",X"A1",X"F1",X"0E", + X"D2",X"D5",X"AE",X"EB",X"FC",X"EE",X"8D",X"A9",X"FF",X"DF",X"1F",X"F4",X"E2",X"DD",X"36",X"F7", + X"7F",X"13",X"7D",X"AD",X"F6",X"0E",X"DF",X"CF",X"F7",X"64",X"C3",X"7B",X"F5",X"BE",X"EB",X"39", + X"AE",X"9F",X"FE",X"EB",X"FD",X"9B",X"56",X"85",X"EB",X"7F",X"59",X"1F",X"3E",X"62",X"C0",X"5F", + X"7B",X"ED",X"DF",X"F6",X"65",X"79",X"2B",X"FE",X"E7",X"CF",X"7F",X"ED",X"1D",X"FF",X"AF",X"57", + X"88",X"64",X"4B",X"22",X"C0",X"10",X"A4",X"10",X"19",X"22",X"7A",X"AE",X"0A",X"26",X"A0",X"B4", + X"18",X"4D",X"B8",X"81",X"29",X"88",X"31",X"70",X"A0",X"F6",X"00",X"14",X"10",X"F0",X"10",X"70", + X"86",X"80",X"12",X"3E",X"52",X"02",X"B6",X"C9",X"08",X"C0",X"A0",X"70",X"52",X"D8",X"00",X"20", + X"12",X"08",X"50",X"0D",X"02",X"20",X"8C",X"F3",X"28",X"80",X"90",X"80",X"90",X"16",X"78",X"92", + X"20",X"22",X"24",X"58",X"2A",X"4D",X"2D",X"85",X"10",X"30",X"01",X"39",X"00",X"00",X"09",X"33", + X"3F",X"99",X"B0",X"80",X"42",X"72",X"42",X"00",X"11",X"22",X"23",X"A1",X"04",X"08",X"92",X"A3", + X"B1",X"15",X"10",X"5A",X"A8",X"0A",X"40",X"92",X"A5",X"C4",X"92",X"1B",X"20",X"A0",X"00",X"30", + X"42",X"59",X"F2",X"1C",X"0C",X"D0",X"C6",X"CA",X"B0",X"AA",X"1A",X"19",X"5A",X"84",X"BF",X"3D", + X"7D",X"3F",X"EF",X"4D",X"9D",X"99",X"67",X"5B",X"67",X"EB",X"7D",X"D9",X"4D",X"FF",X"D5",X"3D", + X"9F",X"B4",X"9F",X"C7",X"1D",X"49",X"7D",X"B6",X"A7",X"3E",X"CF",X"AB",X"45",X"EF",X"DD",X"EF", + X"FF",X"7D",X"C7",X"BB",X"63",X"E7",X"F3",X"BF",X"6F",X"F6",X"EF",X"DF",X"DB",X"DB",X"A7",X"DF", + X"FB",X"BE",X"AD",X"4B",X"1B",X"5A",X"FF",X"DF",X"3F",X"E7",X"DF",X"87",X"BF",X"ED",X"FD",X"F7", + X"CF",X"D5",X"FF",X"EB",X"B3",X"F1",X"FF",X"83",X"E5",X"D9",X"DE",X"EC",X"EB",X"CD",X"FF",X"33", + X"D7",X"CD",X"79",X"B7",X"F7",X"DE",X"CE",X"EF",X"6B",X"A7",X"BD",X"FE",X"FF",X"E3",X"F6",X"9F", + X"B3",X"FC",X"6B",X"D3",X"79",X"F2",X"D9",X"CF",X"AB",X"8F",X"E7",X"BB",X"F9",X"EE",X"BF",X"B5", + X"E7",X"8A",X"B3",X"FB",X"3E",X"6F",X"6F",X"6C",X"56",X"EF",X"EB",X"CB",X"D3",X"81",X"F5",X"B1", + X"60",X"6B",X"4A",X"98",X"10",X"A8",X"E9",X"28",X"98",X"1D",X"98",X"A0",X"08",X"BC",X"1A",X"8D", + X"86",X"38",X"5D",X"01",X"60",X"A8",X"A2",X"16",X"02",X"64",X"00",X"00",X"A7",X"91",X"03",X"00", + X"70",X"3A",X"00",X"30",X"18",X"25",X"02",X"90",X"50",X"06",X"80",X"88",X"52",X"80",X"10",X"00", + X"E8",X"ED",X"A2",X"12",X"00",X"23",X"A4",X"0B",X"84",X"C4",X"80",X"60",X"20",X"82",X"20",X"0C", + X"88",X"CE",X"2B",X"3E",X"80",X"B7",X"01",X"44",X"10",X"22",X"90",X"03",X"23",X"88",X"11",X"03", + X"81",X"42",X"00",X"39",X"18",X"DA",X"5A",X"36",X"78",X"80",X"48",X"00",X"84",X"0E",X"20",X"00", + X"16",X"82",X"66",X"81",X"30",X"14",X"08",X"10",X"84",X"01",X"51",X"A8",X"09",X"04",X"B3",X"00", + X"4C",X"41",X"40",X"20",X"16",X"C0",X"5A",X"D0",X"02",X"92",X"02",X"19",X"48",X"02",X"80",X"0C", + X"F9",X"99",X"D5",X"79",X"F0",X"79",X"E8",X"B3",X"97",X"6B",X"39",X"FF",X"FF",X"F9",X"B9",X"3A", + X"F1",X"79",X"B3",X"A9",X"A0",X"E9",X"7A",X"B1",X"95",X"30",X"A9",X"9D",X"F9",X"30",X"FD",X"72", + X"5C",X"FC",X"B1",X"F2",X"B9",X"F9",X"59",X"C9",X"73",X"BB",X"3A",X"FA",X"DB",X"98",X"F2",X"D5", + X"51",X"E8",X"7D",X"FB",X"F9",X"5D",X"F9",X"FF",X"32",X"75",X"FE",X"71",X"B1",X"68",X"F4",X"B9", + X"FF",X"F9",X"FD",X"B9",X"B1",X"BA",X"59",X"B9",X"BE",X"E8",X"B8",X"F1",X"F7",X"B8",X"F1",X"49", + X"6D",X"F1",X"9E",X"35",X"E1",X"78",X"E0",X"F9",X"B9",X"F9",X"B0",X"BC",X"D4",X"61",X"63",X"59", + X"F0",X"87",X"D9",X"B9",X"58",X"72",X"D8",X"EB",X"8A",X"F1",X"35",X"33",X"B5",X"79",X"79",X"FD", + X"D0",X"6D",X"39",X"F9",X"FF",X"F9",X"54",X"F9",X"7B",X"F9",X"FB",X"E9",X"AD",X"F8",X"79",X"F0", + X"77",X"07",X"30",X"5D",X"8F",X"C7",X"A5",X"07",X"04",X"A7",X"8D",X"44",X"86",X"C6",X"A0",X"45", + X"18",X"07",X"D4",X"7F",X"1F",X"03",X"04",X"05",X"07",X"4E",X"66",X"05",X"6E",X"06",X"06",X"4E", + X"07",X"2E",X"47",X"46",X"06",X"26",X"06",X"46",X"76",X"06",X"02",X"01",X"97",X"D3",X"C6",X"87", + X"A2",X"87",X"00",X"2A",X"37",X"32",X"A4",X"87",X"66",X"76",X"41",X"1E",X"7E",X"63",X"14",X"89", + X"BE",X"06",X"0F",X"53",X"CA",X"8E",X"06",X"02",X"46",X"26",X"07",X"87",X"4F",X"44",X"04",X"0A", + X"96",X"EC",X"10",X"4E",X"0A",X"0C",X"A6",X"A6",X"0E",X"4F",X"C7",X"86",X"02",X"8E",X"06",X"AC", + X"D6",X"00",X"9B",X"23",X"45",X"2E",X"0C",X"67",X"07",X"22",X"83",X"43",X"62",X"C7",X"0C",X"0E", + X"87",X"06",X"14",X"66",X"BD",X"16",X"E7",X"0E",X"8F",X"06",X"64",X"0F",X"86",X"0F",X"06",X"86", + X"FF",X"D1",X"99",X"78",X"5D",X"69",X"F9",X"71",X"DB",X"71",X"3B",X"9B",X"ED",X"7D",X"F8",X"79", + X"9C",X"F9",X"DB",X"F6",X"EB",X"41",X"77",X"43",X"D9",X"59",X"FB",X"33",X"FF",X"F5",X"B9",X"39", + X"A8",X"C9",X"31",X"A3",X"5D",X"B4",X"71",X"69",X"78",X"7B",X"BE",X"FD",X"78",X"BD",X"73",X"39", + X"F4",X"F9",X"BC",X"B1",X"F9",X"64",X"22",X"3C",X"9B",X"5A",X"B9",X"74",X"5C",X"99",X"6B",X"F9", + X"7F",X"90",X"F9",X"78",X"F8",X"B9",X"3B",X"B1",X"39",X"F9",X"6F",X"F8",X"DE",X"FF",X"B1",X"D8", + X"A9",X"96",X"E8",X"DA",X"F5",X"7A",X"A4",X"39",X"B9",X"F9",X"DD",X"4B",X"DB",X"FA",X"D8",X"7B", + X"F5",X"C1",X"B9",X"FC",X"D8",X"79",X"9E",X"90",X"E9",X"50",X"34",X"99",X"A1",X"59",X"FD",X"69", + X"A1",X"FB",X"1B",X"B8",X"77",X"B9",X"14",X"1B",X"27",X"48",X"FF",X"08",X"F8",X"EB",X"B0",X"F8", + X"B9",X"66",X"03",X"46",X"0F",X"47",X"75",X"C6",X"47",X"02",X"07",X"02",X"0C",X"24",X"2F",X"02", + X"8C",X"43",X"82",X"D5",X"2A",X"0F",X"9C",X"02",X"28",X"0C",X"03",X"8D",X"36",X"04",X"23",X"86", + X"42",X"D2",X"A4",X"46",X"CF",X"8C",X"76",X"96",X"C7",X"05",X"86",X"80",X"5B",X"66",X"46",X"0E", + X"16",X"4C",X"4E",X"46",X"52",X"07",X"A7",X"C5",X"03",X"0F",X"44",X"A3",X"0E",X"46",X"46",X"64", + X"0E",X"27",X"26",X"0B",X"07",X"4E",X"82",X"C6",X"07",X"06",X"D6",X"46",X"4E",X"C2",X"A4",X"06", + X"07",X"47",X"17",X"87",X"58",X"15",X"57",X"07",X"44",X"97",X"0C",X"42",X"04",X"86",X"06",X"57", + X"03",X"44",X"06",X"46",X"D2",X"0E",X"0F",X"43",X"47",X"56",X"AC",X"4C",X"06",X"06",X"37",X"86", + X"06",X"56",X"B4",X"07",X"6E",X"28",X"54",X"07",X"C6",X"86",X"07",X"83",X"1E",X"88",X"46",X"AD"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_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/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/build_id.v new file mode 100644 index 00000000..43d5a87c --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171122" +`define BUILD_TIME "113935" diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..fec08f5f --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) := (others => '0'); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_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/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_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/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/osd.v b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_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/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..13e51d6c --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pacman.vhd @@ -0,0 +1,469 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- Copyright (c) Sorgelig - 2017 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 006 Refactoring, 8 sprites support by Sorgelig +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN is + generic( + eight_sprites : boolean := true + ); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0 : in std_logic_vector(7 downto 0); + in1 : in std_logic_vector(7 downto 0); + dipsw1 : in std_logic_vector(7 downto 0); + dipsw2 : in std_logic_vector(7 downto 0); + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of PACMAN is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_int_l : std_logic := '1'; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal hp : std_logic_vector ( 4 downto 0); + signal vp : std_logic_vector ( 4 downto 0); + signal ram_cs : std_logic; + signal ram_data : std_logic_vector(7 downto 0); + signal vram_data : std_logic_vector(7 downto 0); + signal sprite_xy_data : std_logic_vector(7 downto 0); + signal vram_addr : std_logic_vector(11 downto 0); + + signal iodec_spr_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_sn1_l : std_logic; + signal iodec_sn2_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw1_l : std_logic; + signal iodec_dipsw2_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + + signal sn_we : std_logic; + signal wav1,wav2,wav3 : std_logic_vector(7 downto 0); + + component ym2149 is port + ( + CLK : in std_logic; + CE : in std_logic; + RESET : in std_logic; + BDIR : in std_logic; + BC : in std_logic; + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + CHANNEL_A: out std_logic_vector(7 downto 0); + CHANNEL_B: out std_logic_vector(7 downto 0); + CHANNEL_C: out std_logic_vector(7 downto 0); + + SEL : in std_logic; + MODE : in std_logic; + IOA_in : in std_logic_vector(7 downto 0); + IOA_out : out std_logic_vector(7 downto 0); + + IOB_in : in std_logic_vector(7 downto 0); + IOB_out : out std_logic_vector(7 downto 0) + ); + end component; + +begin + +-- +-- video timing +-- +p_hvcnt : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + if hcnt = "111111111" then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + if do_hsync then + if vcnt = "111111111" then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; +end process; + +vsync <= not vcnt(8); +do_hsync <= (hcnt = "010101111"); -- 0AF + +p_sync : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + + if (hcnt = "010001111") and not eight_sprites then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") and not eight_sprites then + hblank <= '0'; -- 0EF + elsif (hcnt = "111111111") and eight_sprites then + hblank <= '1'; + elsif (hcnt = "011111111") and eight_sprites then + hblank <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; +end process; + +-- +-- cpu +-- +p_irq_req_watchdog : process + variable rising_vblank : boolean; +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + --watchdog_reset_l <= not reset; + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + end if; +end process; + +u_cpu : entity work.T80sed +port map +( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => hcnt(0) and ena_6, + WAIT_n => sync_bus_wreq_l, + INT_n => cpu_int_l, + NMI_n => '1', + BUSRQ_n => '1', + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out +); + +-- rom 0x0000 - 0x3FFF +-- syncbus 0x4000 - 0x7FFF +sync_bus_cs_l <= '0' when cpu_mreq_l = '0' and cpu_rfsh_l = '1' and cpu_addr(14) = '1' else '1'; +sync_bus_wreq_l <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '1' and cpu_rd_l = '0' else '1'; +sync_bus_stb <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '0' else '1'; +sync_bus_r_w_l <= '0' when sync_bus_stb = '0' and cpu_rd_l = '1' else '1'; + +-- +-- sync bus custom ic +-- +p_sync_bus_reg : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; +end process; + + +-- WRITE +-- out_l 0x5000 - 0x503F control space +-- sn1_l 0x5040 - 0x504F sound +-- sn2_l 0x5050 - 0x505F sound +-- spr_l 0x5060 - 0x506F sprite +-- wdr_l 0x50C0 - 0x50FF watchdog reset +iodec_out_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_sn1_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"4" else '1'; +iodec_sn2_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"5" else '1'; +iodec_spr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"6" else '1'; +iodec_wdr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +-- READ +-- in0_l 0x5000 - 0x503F in port 0 +-- in1_l 0x5040 - 0x507F in port 1 +-- dipsw_l 0x5080 - 0x50BF dip switches +iodec_in0_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_in1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"01" else '1'; +iodec_dipsw1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"10" else '1'; +iodec_dipsw2_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +p_control_reg : process +begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + elsif (iodec_out_l = '0') then + control_reg(to_integer(unsigned(cpu_addr(2 downto 0)))) <= cpu_data_out(0); + end if; + end if; +end process; + +cpu_data_in <= cpu_vec_reg when (cpu_iorq_l = '0') and (cpu_m1_l = '0') else + sync_bus_reg when sync_bus_wreq_l = '0' else + program_rom_dinl when cpu_addr(15 downto 14) = "00" else -- ROM at 0000 - 3fff + program_rom_dinh when cpu_addr(15 downto 14) = "10" else -- ROM at 8000 - bfff + in0 when iodec_in0_l = '0' else + in1 when iodec_in1_l = '0' else + dipsw1 when iodec_dipsw1_l = '0' else + dipsw2 when iodec_dipsw2_l = '0' else + ram_data; + +u_program_rom : entity work.ROM_PGM_0 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl +); + +u_program_rom1 : entity work.ROM_PGM_1 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinh +); + +ram_cs <= '1' when cpu_addr(15 downto 12) = X"4" else '0'; + +u_rams : work.dpram generic map (12,8) +port map +( + clock_a => clk, + enable_a => ena_6, + wren_a => not sync_bus_r_w_l and ram_cs, + address_a => cpu_addr(11 downto 0), + data_a => cpu_data_out, -- cpu only source of ram data + q_a => ram_data, + + clock_b => clk, + address_b => vram_addr(11 downto 0), + q_b => vram_data +); + +-- +-- video subsystem +-- + +-- vram addr custom ic +hp <= hcnt(7 downto 3) when control_reg(3) = '0' else not hcnt(7 downto 3); +vp <= vcnt(7 downto 3) when control_reg(3) = '0' else not vcnt(7 downto 3); +vram_addr <= '0' & hcnt(2) & vp & hp when hcnt(8)='1' else + x"FF" & hcnt(6 downto 4) & hcnt(2) when hblank = '1' else + '0' & hcnt(2) & hp(3) & hp(3) & hp(3) & hp(3) & hp(0) & vp; + +sprite_xy_ram : work.dpram generic map (4,8) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not iodec_spr_l, + address_a => cpu_addr(3 downto 0), + data_a => cpu_data_out, + + clock_b => CLK, + address_b => vram_addr(3 downto 0), + q_b => sprite_xy_data +); + +u_video : entity work.PACMAN_VIDEO +port map +( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + vram_data => vram_data, + sprite_xy => sprite_xy_data, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + O_HBLANK => O_HBLANK, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk +); + +O_HSYNC <= hSync; +O_VSYNC <= vSync; +O_VBLANK <= vblank; + +-- +-- +-- audio subsystem +-- +u_audio : entity work.PACMAN_AUDIO +port map ( + I_HCNT => hcnt, + -- + I_AB => cpu_addr(11 downto 0), + I_DB => cpu_data_out, + -- + I_WR1_L => iodec_sn2_l, + I_WR0_L => iodec_sn1_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk +); + +end RTL; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..91313469 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not I_WR1_L, + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => rom3m(1), + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..1552d65b --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pacman_video.vhd @@ -0,0 +1,279 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 004 Refactoring, 8 sprite support by Sorgelig +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VIDEO is + generic( + alt_transp : boolean := false + ); + port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + vram_data : in std_logic_vector(7 downto 0); + sprite_xy : in std_logic_vector(7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + O_HBLANK : out std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_VIDEO is + + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal sprite_data : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + signal obj_on2 : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_op_t1 : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal sprite_ram_ip : std_logic_vector(5 downto 0); + signal sprite_ram_op : std_logic_vector(5 downto 0); + signal sprite_addr : std_logic_vector(7 downto 0); + signal sprite_addr_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(5 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + +dr <= not sprite_xy when I_HBLANK = '1' else "11111111"; -- pull ups on board + +p_char_regs : process + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; +begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & not I_HBLANK); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + sprite_data <= vram_data; -- character reg + end if; +end process; + +xflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(1); +yflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(0); + +obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + +ca(12) <= char_hblank_reg; +ca(11 downto 6) <= sprite_data(7 downto 2); +ca(5) <= sprite_data(1) when char_hblank_reg = '0' else char_sum_reg(3) xor xflip; +ca(4) <= sprite_data(0) when char_hblank_reg = '0' else I_HCNT(3); +ca(3) <= I_HCNT(2) xor yflip; +ca(2) <= char_sum_reg(2) xor xflip; +ca(1) <= char_sum_reg(1) xor xflip; +ca(0) <= char_sum_reg(0) xor xflip; + +-- char roms +char_rom_5ef : entity work.GFX1 +port map +( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf +); + +p_char_shift : process +begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_buf(7 downto 4); -- load + shift_regl <= char_rom_5ef_buf(3 downto 0); + when others => null; + end case; + end if; +end process; + +shift_sel(0) <= I_HCNT(0) and I_HCNT(1) when vout_yflip = '0' else '1'; +shift_sel(1) <= '1' when vout_yflip = '0' else I_HCNT(0) and I_HCNT(1); +shift_op(0) <= shift_regl(3) when vout_yflip = '0' else shift_regl(0); +shift_op(1) <= shift_regu(3) when vout_yflip = '0' else shift_regu(0); + +p_video_out_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= vram_data(4 downto 0); -- colour reg + end if; + + if I_HCNT(3 downto 0) = "0111" and (vout_hblank='1' or I_HBLANK='1' or vout_obj_on='0') then + sprite_addr <= dr; + else + sprite_addr <= sprite_addr + "1"; + end if; + end if; +end process; + +col_rom_4a : entity work.PROM4_DST +port map +( + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a +); + +u_sprite_ram : work.dpram generic map (8,6) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => vout_obj_on_t1, + address_a => sprite_addr_t1, + data_a => sprite_ram_ip, + + clock_b => CLK, + enable_b => ENA_6, + address_b => sprite_addr, + q_b => sprite_ram_op +); + +sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "000000"; +video_op_sel <= '0' when alt_transp and (sprite_ram_reg(1 downto 0) = "00") else + '0' when not alt_transp and (sprite_ram_reg(5 downto 2) = "0000") else + '1'; + +p_sprite_ram_ip_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + sprite_addr_t1 <= sprite_addr; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + shift_op_t1 <= shift_op; + end if; +end process; + +sprite_ram_ip <= (others => '0') when vout_hblank_t1 = '0' else + sprite_ram_reg when video_op_sel = '1' else + lut_4a_t1(3 downto 0) & shift_op_t1; + +final_col <= (others => '0') when (vout_hblank = '1') or (I_VBLANK = '1') else + sprite_ram_reg(5 downto 2) when video_op_sel = '1' else + lut_4a(3 downto 0); + +-- assign video outputs from color LUT PROM +col_rom_7f : entity work.PROM7_DST +port map +( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE +); + +O_HBLANK <= vout_hblank and vout_hblank_t1; + +end architecture; diff --git a/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_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/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pll.v b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pll.v new file mode 100644 index 00000000..60297687 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 8, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "9" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "9" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/Ponpoko_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/Ponpoko_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/Arcade/Pacman Hardware/SuperGlob_MiST/README.txt b/Arcade/Pacman Hardware/SuperGlob_MiST/README.txt new file mode 100644 index 00000000..f62cb1ea --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Super Glob port to MiST by Gehstock +-- 10 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/Release/SuperGlob.rbf b/Arcade/Pacman Hardware/SuperGlob_MiST/Release/SuperGlob.rbf new file mode 100644 index 00000000..302f6ebd Binary files /dev/null and b/Arcade/Pacman Hardware/SuperGlob_MiST/Release/SuperGlob.rbf differ diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/SuperGlob.qpf b/Arcade/Pacman Hardware/SuperGlob_MiST/SuperGlob.qpf new file mode 100644 index 00000000..c46ed6f6 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/SuperGlob.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "SuperGlob" diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/SuperGlob.qsf b/Arcade/Pacman Hardware/SuperGlob_MiST/SuperGlob.qsf new file mode 100644 index 00000000..690feaad --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/SuperGlob.qsf @@ -0,0 +1,165 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 23:14:41 November 10, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# SuperGlob_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 PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY SuperGlob +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +# 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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# Power Estimation Assignments +# ============================ +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" + +# 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 ENTITY(MrTNT) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(MrTNT) +# ----------------- + +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM3_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GFX1.vhd +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/pacman_vram_addr.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/SuperGlob.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/clean.bat b/Arcade/Pacman Hardware/SuperGlob_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_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/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..e6ac7fc9 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"37",X"37",X"7F",X"FF",X"EE",X"00",X"00",X"00",X"CE",X"CE",X"67",X"33",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F", + X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"00",X"00",X"EE",X"FF",X"7F",X"37",X"37",X"7F",X"00",X"00",X"00",X"33",X"67",X"CE",X"CE",X"EF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0F", + X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"F0", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"FF",X"FF", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"EC",X"E8",X"C0",X"00",X"00",X"00",X"00",X"00",X"73",X"71",X"30",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"E8",X"EC",X"00",X"00",X"00",X"00",X"00",X"30",X"71",X"73", + X"EC",X"E8",X"C0",X"00",X"00",X"00",X"00",X"0F",X"73",X"71",X"30",X"00",X"00",X"00",X"00",X"0F", + X"FF",X"11",X"11",X"11",X"11",X"11",X"11",X"FF",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"FF", + X"0F",X"00",X"00",X"00",X"00",X"C0",X"E8",X"EC",X"0F",X"00",X"00",X"00",X"00",X"30",X"71",X"73", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"FF",X"77",X"30",X"30",X"30",X"30",X"30",X"30",X"77", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"77", + X"0F",X"0F",X"01",X"01",X"01",X"01",X"0F",X"0F",X"0F",X"0F",X"0E",X"0E",X"0E",X"0E",X"0F",X"0F", + X"0C",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"0F",X"0C",X"00",X"00",X"0F",X"0F",X"00",X"00",X"0F", + X"0F",X"00",X"00",X"0C",X"0C",X"0C",X"0C",X"0C",X"0F",X"00",X"00",X"0F",X"0F",X"00",X"00",X"0C", + X"0C",X"0C",X"0C",X"0F",X"0F",X"00",X"00",X"0F",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0F", + X"0F",X"00",X"00",X"0F",X"0F",X"0C",X"0C",X"0C",X"0F",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"0F",X"00",X"00",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"00",X"00",X"0F", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"DD",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"77",X"33",X"00",X"00",X"00", + X"0F",X"0F",X"0E",X"0C",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"07",X"03",X"03",X"07",X"0F",X"0F", + X"0F",X"0F",X"0E",X"0C",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"07",X"03",X"03",X"07",X"0F",X"0F", + X"01",X"0B",X"0E",X"0C",X"0C",X"0E",X"0F",X"0F",X"03",X"03",X"03",X"03",X"03",X"03",X"01",X"00", + X"01",X"01",X"0B",X"0F",X"0F",X"0B",X"01",X"01",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"0F",X"0F",X"0E",X"0C",X"0C",X"0E",X"0B",X"01",X"00",X"01",X"03",X"03",X"03",X"03",X"03",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"01",X"0B",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"03",X"03",X"03",X"03",X"03",X"03",X"01",X"00", + X"0F",X"0F",X"0E",X"0C",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"0E",X"0C",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"06",X"0E",X"0E",X"0E",X"0E",X"0E",X"0C",X"08",X"0C",X"0E",X"07",X"03",X"03",X"07",X"0F",X"0F", + X"06",X"06",X"0E",X"0E",X"0E",X"0E",X"06",X"06",X"0C",X"0C",X"0E",X"0F",X"0F",X"0E",X"0C",X"0C", + X"00",X"00",X"00",X"33",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"0C",X"0E",X"0E",X"0E",X"0E",X"0E",X"06",X"0F",X"0F",X"07",X"03",X"03",X"07",X"0E",X"0C", + X"EE",X"FF",X"11",X"99",X"55",X"FF",X"EE",X"00",X"33",X"77",X"55",X"44",X"44",X"77",X"33",X"00", + X"00",X"00",X"11",X"FF",X"FF",X"11",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"22",X"00",X"00", + X"33",X"99",X"99",X"DD",X"FF",X"77",X"33",X"00",X"33",X"77",X"55",X"44",X"44",X"66",X"22",X"00", + X"66",X"FF",X"99",X"99",X"11",X"33",X"22",X"00",X"33",X"77",X"44",X"44",X"44",X"66",X"22",X"00", + X"55",X"FF",X"FF",X"55",X"44",X"CC",X"CC",X"00",X"00",X"77",X"77",X"66",X"33",X"11",X"00",X"00", + X"66",X"FF",X"99",X"99",X"99",X"BB",X"AA",X"00",X"44",X"44",X"44",X"44",X"44",X"77",X"77",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"EE",X"00",X"22",X"66",X"44",X"44",X"44",X"77",X"33",X"00", + X"00",X"00",X"88",X"FF",X"77",X"00",X"00",X"00",X"66",X"77",X"55",X"44",X"44",X"44",X"66",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"EE",X"FF",X"99",X"99",X"99",X"BB",X"22",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"00",X"00",X"00",X"BB",X"BB",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00", + X"11",X"22",X"44",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"22",X"44",X"00", + X"88",X"88",X"88",X"FF",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"77",X"33",X"11",X"00",X"00", + X"99",X"AA",X"CC",X"FF",X"CC",X"AA",X"99",X"00",X"44",X"22",X"11",X"77",X"11",X"22",X"44",X"00", + X"88",X"CC",X"EE",X"FF",X"88",X"88",X"88",X"00",X"00",X"11",X"33",X"77",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"44",X"22",X"11",X"00",X"44",X"22",X"11",X"00",X"00",X"00",X"00",X"00", + X"CC",X"22",X"11",X"15",X"15",X"19",X"22",X"CC",X"33",X"44",X"88",X"8A",X"8A",X"89",X"44",X"33", + X"00",X"FF",X"FF",X"44",X"44",X"FF",X"FF",X"00",X"00",X"11",X"33",X"66",X"66",X"33",X"11",X"00", + X"66",X"FF",X"99",X"99",X"FF",X"FF",X"11",X"00",X"33",X"77",X"44",X"44",X"77",X"77",X"44",X"00", + X"22",X"33",X"11",X"11",X"33",X"EE",X"CC",X"00",X"22",X"66",X"44",X"44",X"66",X"33",X"11",X"00", + X"EE",X"FF",X"11",X"11",X"FF",X"FF",X"11",X"00",X"33",X"77",X"44",X"44",X"77",X"77",X"44",X"00", + X"33",X"11",X"DD",X"99",X"FF",X"FF",X"11",X"00",X"66",X"44",X"55",X"44",X"77",X"77",X"44",X"00", + X"00",X"00",X"CC",X"99",X"FF",X"FF",X"11",X"00",X"66",X"44",X"55",X"44",X"77",X"77",X"44",X"00", + X"FF",X"FF",X"99",X"11",X"33",X"EE",X"CC",X"00",X"22",X"66",X"44",X"44",X"66",X"33",X"11",X"00", + X"00",X"FF",X"FF",X"88",X"88",X"FF",X"FF",X"00",X"00",X"77",X"77",X"00",X"00",X"77",X"77",X"00", + X"00",X"00",X"11",X"FF",X"FF",X"11",X"00",X"00",X"00",X"00",X"44",X"77",X"77",X"44",X"00",X"00", + X"00",X"00",X"EE",X"FF",X"11",X"77",X"66",X"00",X"44",X"44",X"77",X"77",X"44",X"44",X"00",X"00", + X"11",X"33",X"EE",X"CC",X"FF",X"FF",X"11",X"00",X"66",X"77",X"11",X"00",X"77",X"77",X"44",X"00", + X"33",X"11",X"11",X"11",X"FF",X"FF",X"11",X"00",X"00",X"00",X"00",X"44",X"77",X"77",X"44",X"00", + X"FF",X"FF",X"88",X"CC",X"88",X"FF",X"FF",X"00",X"77",X"77",X"33",X"11",X"33",X"77",X"77",X"00", + X"FF",X"FF",X"CC",X"88",X"00",X"FF",X"FF",X"00",X"77",X"77",X"00",X"11",X"33",X"77",X"77",X"00", + X"CC",X"EE",X"33",X"11",X"33",X"EE",X"CC",X"00",X"11",X"33",X"66",X"44",X"66",X"33",X"11",X"00", + X"00",X"88",X"88",X"99",X"FF",X"FF",X"11",X"00",X"33",X"77",X"44",X"44",X"77",X"77",X"44",X"00", + X"DD",X"EE",X"55",X"11",X"11",X"FF",X"EE",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"11",X"BB",X"EE",X"CC",X"FF",X"FF",X"11",X"00",X"33",X"77",X"44",X"44",X"77",X"77",X"44",X"00", + X"66",X"FF",X"99",X"99",X"99",X"BB",X"22",X"00",X"22",X"66",X"44",X"44",X"44",X"77",X"33",X"00", + X"00",X"00",X"11",X"FF",X"FF",X"11",X"00",X"00",X"00",X"66",X"44",X"77",X"77",X"44",X"66",X"00", + X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00",X"77",X"77",X"00",X"00",X"77",X"77",X"00", + X"88",X"CC",X"66",X"33",X"66",X"CC",X"88",X"00",X"77",X"77",X"00",X"00",X"00",X"77",X"77",X"00", + X"CC",X"FF",X"33",X"EE",X"33",X"FF",X"CC",X"00",X"77",X"77",X"00",X"11",X"00",X"77",X"77",X"00", + X"11",X"33",X"66",X"CC",X"66",X"33",X"11",X"00",X"44",X"66",X"33",X"11",X"33",X"66",X"44",X"00", + X"00",X"00",X"99",X"FF",X"FF",X"99",X"00",X"00",X"00",X"77",X"77",X"00",X"00",X"77",X"77",X"00", + X"33",X"11",X"99",X"99",X"DD",X"77",X"33",X"00",X"66",X"77",X"55",X"44",X"44",X"44",X"66",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0B",X"01",X"00",X"01",X"03",X"03",X"03",X"03",X"03",X"03", + X"06",X"0E",X"0E",X"0E",X"0E",X"0E",X"0C",X"08",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"08",X"0C",X"0E",X"0E",X"0E",X"0E",X"0E",X"06",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"0C", + X"11",X"11",X"11",X"11",X"11",X"11",X"11",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"09",X"0C",X"0C",X"0C",X"0E",X"0F",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"03",X"00",X"03",X"02",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"19",X"00",X"0E",X"0B",X"09",X"0F",X"0E",X"00",X"07",X"00",X"00",X"01",X"01",X"01",X"00",X"00", + X"00",X"77",X"33",X"3B",X"33",X"3B",X"37",X"37",X"0C",X"08",X"0C",X"07",X"0C",X"00",X"06",X"05", + X"00",X"00",X"00",X"00",X"00",X"33",X"77",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04", + X"00",X"00",X"00",X"66",X"FF",X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"0C",X"0C",X"04",X"06",X"02",X"03",X"00",X"0D",X"0C",X"0C",X"06",X"07",X"0F",X"0E",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"0C",X"0E",X"07",X"0E",X"00",X"0E",X"0F",X"0F", + X"FF",X"EE",X"CC",X"00",X"0E",X"0E",X"0C",X"00",X"CC",X"FF",X"33",X"00",X"01",X"0F",X"01",X"00", + X"00",X"11",X"FF",X"66",X"22",X"AA",X"33",X"77",X"00",X"33",X"BB",X"BB",X"BB",X"33",X"00",X"88", + X"EE",X"33",X"33",X"EE",X"00",X"11",X"33",X"EE",X"11",X"33",X"33",X"11",X"00",X"CC",X"FF",X"11", + X"CC",X"EE",X"33",X"33",X"FF",X"11",X"00",X"CC",X"11",X"33",X"33",X"11",X"FF",X"CC",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"FF",X"FF",X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"FF", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"33",X"33",X"33",X"33",X"33",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"F3", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"F3",X"33",X"33",X"33",X"33",X"33",X"33",X"33", + X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"F3",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0", + X"F3",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"FF",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"FF",X"FF", + X"FF",X"FF",X"33",X"33",X"33",X"33",X"33",X"33",X"FF",X"FF",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"FF",X"FF", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"F3", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"F3",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"F3",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"F0", + X"F3",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"F0",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C", + X"2F",X"0F",X"0E",X"0C",X"08",X"00",X"00",X"00",X"0F",X"8F",X"0F",X"1F",X"4F",X"0E",X"00",X"00", + X"E1",X"61",X"43",X"43",X"81",X"00",X"00",X"00",X"00",X"10",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"81",X"43",X"43",X"C3",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"10", + X"00",X"00",X"00",X"00",X"00",X"0C",X"8E",X"0F",X"00",X"00",X"00",X"0C",X"0F",X"8F",X"0F",X"2F", + X"FC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"FF",X"F3",X"C0",X"00",X"00",X"00",X"00", + X"D2",X"3B",X"3F",X"0C",X"08",X"00",X"00",X"00",X"30",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0B",X"6F",X"47",X"13",X"00",X"00",X"01",X"03",X"03",X"01",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"38",X"00",X"00",X"00",X"C0",X"C2",X"FF",X"FF",X"3C", + X"E0",X"E0",X"E0",X"E0",X"C0",X"C0",X"C0",X"80",X"F0",X"F0",X"F0",X"70",X"30",X"10",X"30",X"30", + X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"17",X"7F",X"B7",X"43",X"30",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0C",X"CE",X"7F",X"EF",X"9E",X"78",X"F0",X"00",X"7F",X"FF",X"EF",X"FF",X"7F",X"87",X"F0", + X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"88",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"77",X"00",X"80",X"00",X"00",X"00",X"10",X"30",X"30",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"77",X"FF",X"FF",X"00",X"00",X"00",X"00",X"10",X"20",X"20",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"88",X"FF",X"FF", + X"F0",X"F4",X"60",X"00",X"00",X"00",X"00",X"00",X"07",X"00",X"60",X"78",X"F0",X"F4",X"60",X"00", + X"04",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"30",X"60",X"00",X"06",X"0D",X"0A",X"09",X"00",X"00",X"00",X"10",X"20",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"80",X"60",X"F0",X"00",X"00",X"00",X"30",X"70",X"7A",X"30",X"08", + X"00",X"00",X"FA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FA",X"00",X"00",X"00",X"00",X"00", + X"40",X"22",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"11",X"20",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"8E",X"0E",X"27",X"03",X"00",X"00",X"00",X"00",X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"0F",X"2F",X"87",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"00",X"00",X"00",X"00",X"0C",X"0F",X"8F",X"2F", + X"0F",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0E",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"EE",X"00",X"00",X"00",X"33",X"33",X"11",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"0F", + X"FF",X"FF",X"FF",X"EE",X"CC",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00", + X"B5",X"38",X"70",X"71",X"20",X"00",X"00",X"00",X"00",X"01",X"03",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"30",X"30",X"30",X"71",X"F7",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30", + X"00",X"00",X"00",X"00",X"CC",X"EE",X"EE",X"FF",X"00",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"F3",X"EE",X"CC",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"00", + X"F0",X"70",X"10",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"16", + X"00",X"00",X"00",X"CC",X"EE",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"33",X"FF",X"FF",X"FF",X"FF", + X"E5",X"E5",X"E9",X"E9",X"E1",X"E9",X"01",X"00",X"F2",X"F2",X"F4",X"F4",X"F9",X"F4",X"00",X"00", + X"00",X"F7",X"00",X"F7",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"F7",X"00",X"F7",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"E9",X"E1",X"E9",X"E9",X"E5",X"00",X"00",X"00",X"F4",X"F9",X"F4",X"F4",X"F2", + X"FF",X"FF",X"EE",X"CC",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00",X"00", + X"77",X"FF",X"FF",X"FF",X"77",X"33",X"00",X"00",X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"33",X"77",X"FF",X"FF",X"FF",X"F7",X"B7",X"00",X"00",X"00",X"20",X"30",X"30",X"10",X"07", + X"00",X"00",X"00",X"88",X"EE",X"FF",X"FF",X"EE",X"00",X"88",X"EE",X"FF",X"F3",X"F3",X"FF",X"FF", + X"2F",X"0F",X"0E",X"0C",X"08",X"00",X"00",X"00",X"0F",X"8F",X"0F",X"1F",X"4F",X"0E",X"00",X"00", + X"E1",X"61",X"43",X"43",X"81",X"00",X"00",X"00",X"00",X"10",X"20",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"81",X"43",X"43",X"C3",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"10", + X"00",X"00",X"00",X"00",X"00",X"0C",X"8E",X"0F",X"00",X"00",X"00",X"0C",X"0F",X"8F",X"0F",X"2F", + X"D2",X"3B",X"3F",X"0C",X"08",X"00",X"00",X"00",X"30",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"FA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FA",X"00",X"00",X"00",X"00",X"00", + X"8E",X"0E",X"27",X"03",X"00",X"00",X"00",X"00",X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"3C",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"0F",X"0F",X"1E",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"EE",X"CC",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00", + X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"7F",X"FF",X"FE",X"FC",X"F8",X"C0",X"00",X"00", + X"E5",X"E5",X"E9",X"E9",X"E1",X"E9",X"01",X"00",X"F2",X"F2",X"F4",X"F4",X"F9",X"F4",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E1",X"61",X"43",X"43",X"81",X"00",X"00",X"00",X"00",X"10",X"20",X"00",X"00",X"00",X"00",X"00", + X"D2",X"3B",X"3F",X"0C",X"08",X"00",X"00",X"00",X"30",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"77",X"00",X"80",X"00",X"00",X"00",X"10",X"30",X"30",X"10",X"00",X"00",X"00",X"00", + X"04",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"22",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"EE",X"00",X"00",X"00",X"33",X"33",X"11",X"11",X"00",X"00",X"00",X"00", + X"B5",X"38",X"70",X"71",X"20",X"00",X"00",X"00",X"00",X"01",X"03",X"01",X"00",X"00",X"00",X"00", + X"FF",X"F7",X"F7",X"F3",X"FF",X"FF",X"EC",X"00",X"00",X"00",X"00",X"00",X"10",X"11",X"11",X"00", + X"00",X"F7",X"00",X"F7",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"81",X"43",X"43",X"C3",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"10", + X"00",X"00",X"00",X"00",X"0B",X"6F",X"47",X"13",X"00",X"00",X"01",X"03",X"03",X"01",X"01",X"01", + X"00",X"01",X"17",X"7F",X"B7",X"43",X"30",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"77",X"FF",X"FF",X"00",X"00",X"00",X"00",X"10",X"20",X"20",X"10", + X"00",X"30",X"60",X"00",X"06",X"0D",X"0A",X"09",X"00",X"00",X"00",X"10",X"20",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"11",X"20",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"0F",X"2F",X"87",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30", + X"00",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"33", + X"00",X"00",X"00",X"30",X"30",X"30",X"71",X"F7",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30", + X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"F7",X"00",X"F7",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0C",X"8E",X"0F",X"00",X"00",X"00",X"0C",X"0F",X"8F",X"0F",X"2F", + X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"38",X"00",X"00",X"00",X"C0",X"C2",X"FF",X"FF",X"3C", + X"00",X"0C",X"CE",X"7F",X"EF",X"9E",X"78",X"F0",X"00",X"7F",X"FF",X"EF",X"FF",X"7F",X"87",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"88",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"80",X"80",X"60",X"F0",X"00",X"00",X"00",X"30",X"70",X"7A",X"30",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"00",X"00",X"00",X"00",X"0C",X"0F",X"8F",X"2F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"0F", + X"00",X"00",X"00",X"CC",X"EE",X"EE",X"FF",X"FF",X"00",X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"FE",X"FE",X"FC",X"FC",X"E8",X"00",X"00",X"00",X"00",X"77",X"FF",X"BF",X"3F", + X"00",X"00",X"01",X"E9",X"E1",X"E9",X"E9",X"E5",X"00",X"00",X"00",X"F4",X"F9",X"F4",X"F4",X"F2", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"CC",X"EE",X"FF",X"FF",X"7F",X"7F",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"11",X"33",X"77",X"67",X"EF",X"FF",X"00",X"33",X"FF",X"FF",X"0F",X"09",X"09",X"0F", + X"7F",X"7F",X"FF",X"FF",X"EE",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EF",X"67",X"77",X"33",X"11",X"00",X"00",X"00",X"09",X"09",X"0F",X"FF",X"FF",X"33",X"00",X"00", + X"EE",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"11",X"77",X"77",X"FF",X"EF",X"EF",X"FF",X"33",X"FF",X"FF",X"FF",X"0F",X"09",X"09",X"0F", + X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EF",X"EF",X"FF",X"77",X"77",X"11",X"00",X"00",X"09",X"09",X"0F",X"FF",X"FF",X"FF",X"33",X"00", + X"00",X"CC",X"EE",X"EE",X"EE",X"EE",X"FF",X"FF",X"00",X"00",X"00",X"00",X"33",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"77",X"FF",X"89",X"00",X"8F",X"00",X"00",X"77",X"FF",X"FF",X"1F",X"3F",X"7F", + X"FF",X"FF",X"FF",X"EE",X"EE",X"CC",X"00",X"00",X"FF",X"77",X"33",X"00",X"00",X"00",X"00",X"00", + X"00",X"89",X"FF",X"FF",X"33",X"00",X"00",X"00",X"3F",X"1F",X"FF",X"FF",X"FF",X"77",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"77",X"67",X"67",X"67",X"77",X"77", + X"FF",X"FF",X"1F",X"01",X"01",X"0F",X"9F",X"08",X"CC",X"CC",X"CC",X"CC",X"CC",X"EE",X"EE",X"6E", + X"00",X"00",X"88",X"88",X"CC",X"EE",X"77",X"11",X"33",X"33",X"11",X"00",X"00",X"00",X"00",X"00", + X"08",X"0F",X"8F",X"FF",X"33",X"00",X"00",X"00",X"7F",X"7F",X"FF",X"FF",X"FF",X"33",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"EF",X"EF",X"EF",X"FF", + X"77",X"FF",X"FF",X"1F",X"01",X"01",X"0F",X"1F",X"CC",X"CC",X"88",X"88",X"CC",X"CC",X"CC",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EF",X"EF",X"EF",X"77",X"77",X"33",X"11",X"00", + X"01",X"01",X"0F",X"1F",X"FF",X"FF",X"FF",X"33",X"88",X"88",X"88",X"CC",X"CC",X"CC",X"CC",X"CC", + X"CC",X"FF",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"33",X"77",X"FF",X"FF",X"EF",X"EF", + X"00",X"FF",X"8F",X"0C",X"0C",X"0F",X"09",X"09",X"FF",X"FF",X"7F",X"3F",X"3F",X"7F",X"7F",X"6E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"77",X"33",X"00",X"00",X"00",X"00", + X"0F",X"FF",X"FF",X"FF",X"FF",X"33",X"11",X"00",X"EE",X"EE",X"CC",X"CC",X"CC",X"88",X"88",X"88", + X"77",X"FF",X"FF",X"3F",X"19",X"19",X"19",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"67",X"EF",X"EF",X"FF", + X"3F",X"19",X"19",X"19",X"3F",X"FF",X"FF",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"EF",X"67",X"67",X"33",X"11",X"00",X"00", + X"CC",X"EE",X"EE",X"EE",X"EE",X"EE",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"FF", + X"00",X"00",X"11",X"33",X"77",X"67",X"EF",X"FF",X"00",X"77",X"FF",X"FF",X"1F",X"01",X"01",X"1F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"00",X"FF",X"77",X"33",X"00",X"00",X"00",X"00",X"00", + X"EF",X"EF",X"FF",X"77",X"33",X"00",X"00",X"00",X"01",X"01",X"1F",X"FF",X"FF",X"FF",X"11",X"00", + X"00",X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"11",X"33",X"33",X"77",X"77",X"77",X"77", + X"77",X"FF",X"FF",X"CF",X"8E",X"8E",X"8E",X"CF",X"88",X"FF",X"FF",X"3F",X"17",X"17",X"17",X"3F", + X"EE",X"EE",X"CC",X"CC",X"88",X"00",X"00",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"00",X"00", + X"8E",X"8E",X"8E",X"CF",X"FF",X"FF",X"77",X"00",X"17",X"17",X"17",X"3F",X"FF",X"FF",X"88",X"00", + X"00",X"00",X"00",X"00",X"88",X"CC",X"CC",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"88",X"FF",X"FF",X"FF",X"8F",X"0C",X"0C",X"8F",X"00",X"00",X"CC",X"FF",X"7F",X"3F",X"3F",X"7F", + X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"77",X"77",X"77",X"77",X"FF",X"EE",X"00", + X"0C",X"0C",X"8F",X"FF",X"FF",X"CC",X"00",X"00",X"3F",X"3F",X"7F",X"CC",X"00",X"00",X"00",X"00", + X"A0",X"A0",X"A0",X"E2",X"70",X"62",X"62",X"62",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"70",X"62",X"60",X"20",X"20",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"70",X"F0",X"C0",X"F8",X"FC",X"00",X"00",X"00",X"00",X"30",X"70",X"D2",X"70", + X"00",X"00",X"00",X"10",X"10",X"90",X"FC",X"FD",X"00",X"00",X"40",X"E0",X"00",X"F0",X"FF",X"FF", + X"F8",X"C0",X"F0",X"70",X"10",X"00",X"00",X"00",X"D2",X"70",X"30",X"00",X"00",X"00",X"00",X"00", + X"FC",X"90",X"10",X"10",X"00",X"00",X"00",X"00",X"FF",X"F0",X"00",X"E0",X"40",X"00",X"00",X"00", + X"00",X"00",X"10",X"70",X"F0",X"C8",X"88",X"D0",X"70",X"30",X"30",X"30",X"34",X"F0",X"F0",X"70", + X"00",X"00",X"10",X"30",X"73",X"F7",X"F7",X"F3",X"00",X"80",X"80",X"00",X"FF",X"FF",X"FF",X"FF", + X"F0",X"F0",X"80",X"80",X"C0",X"40",X"40",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"F0",X"30",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"D0",X"F0",X"F0",X"70",X"30",X"30",X"30",X"34",X"F0",X"F0",X"70", + X"00",X"00",X"00",X"00",X"77",X"F3",X"F0",X"F0",X"00",X"00",X"00",X"00",X"FF",X"FF",X"F0",X"F0", + X"C0",X"80",X"C0",X"40",X"60",X"20",X"20",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"70",X"F0",X"C0",X"80",X"D0",X"70",X"30",X"30",X"30",X"34",X"F0",X"F0",X"70", + X"00",X"00",X"10",X"30",X"70",X"F1",X"F0",X"F0",X"00",X"80",X"80",X"00",X"FF",X"FE",X"F0",X"F0", + X"F0",X"B0",X"C0",X"60",X"20",X"30",X"10",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"F0",X"30",X"80",X"80",X"00",X"00",X"00",X"00", + X"11",X"60",X"00",X"00",X"02",X"00",X"91",X"C0",X"40",X"22",X"11",X"00",X"00",X"C0",X"30",X"88", + X"42",X"13",X"21",X"10",X"55",X"55",X"77",X"00",X"20",X"00",X"CC",X"58",X"EC",X"44",X"54",X"00", + X"60",X"00",X"C4",X"22",X"20",X"90",X"40",X"00",X"00",X"30",X"C0",X"10",X"22",X"66",X"44",X"00", + X"00",X"D5",X"55",X"77",X"30",X"70",X"10",X"90",X"60",X"CC",X"44",X"C4",X"90",X"80",X"04",X"00", + X"00",X"00",X"88",X"BB",X"99",X"99",X"F7",X"DF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"11",X"33", + X"F7",X"99",X"99",X"BB",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"11",X"00",X"00",X"00", + X"11",X"11",X"DD",X"AA",X"88",X"00",X"00",X"00",X"11",X"00",X"11",X"00",X"00",X"00",X"00",X"00", + X"00",X"CC",X"22",X"11",X"00",X"11",X"32",X"77",X"00",X"00",X"00",X"11",X"DD",X"FF",X"E6",X"CE", + X"00",X"00",X"88",X"AA",X"DD",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"11",X"00", + X"32",X"11",X"00",X"11",X"22",X"CC",X"00",X"00",X"E6",X"FF",X"DD",X"11",X"00",X"00",X"00",X"00", + X"22",X"11",X"DD",X"AA",X"88",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00",X"00",X"00", + X"00",X"CC",X"22",X"11",X"00",X"11",X"32",X"77",X"00",X"00",X"00",X"11",X"DD",X"FF",X"F7",X"DF", + X"00",X"00",X"88",X"AA",X"DD",X"11",X"22",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00", + X"32",X"11",X"00",X"11",X"22",X"CC",X"00",X"00",X"F7",X"FF",X"DD",X"11",X"00",X"00",X"00",X"00", + X"22",X"11",X"EE",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"88",X"88",X"00",X"00",X"11", + X"00",X"00",X"00",X"88",X"77",X"77",X"F9",X"FF",X"00",X"00",X"00",X"11",X"77",X"EE",X"CC",X"4C", + X"00",X"00",X"00",X"88",X"EE",X"11",X"22",X"00",X"00",X"00",X"88",X"88",X"77",X"00",X"00",X"00", + X"F9",X"77",X"77",X"88",X"00",X"00",X"00",X"00",X"CC",X"EE",X"77",X"11",X"00",X"00",X"00",X"00", + X"00",X"44",X"AA",X"AA",X"DD",X"DD",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"66",X"22",X"11",X"00",X"00",X"11",X"33",X"00",X"00",X"00",X"00",X"EE",X"FF",X"F3",X"EF", + X"88",X"DD",X"DD",X"AA",X"AA",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"00",X"00",X"11",X"22",X"66",X"11",X"00",X"F3",X"FF",X"EE",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"DD",X"AA",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"22",X"CC",X"44",X"00", + X"00",X"00",X"00",X"CC",X"33",X"33",X"74",X"FF",X"00",X"00",X"00",X"11",X"BB",X"FF",X"EE",X"AE", + X"00",X"00",X"00",X"AA",X"DD",X"11",X"11",X"00",X"44",X"CC",X"22",X"11",X"00",X"00",X"00",X"00", + X"74",X"33",X"33",X"CC",X"00",X"00",X"00",X"00",X"EE",X"FF",X"BB",X"11",X"00",X"00",X"00",X"00", + X"44",X"88",X"00",X"88",X"EE",X"11",X"00",X"88",X"EE",X"11",X"00",X"40",X"11",X"66",X"88",X"00", + X"00",X"01",X"88",X"00",X"55",X"55",X"77",X"88",X"00",X"00",X"00",X"40",X"CC",X"44",X"CC",X"11", + X"00",X"45",X"88",X"00",X"00",X"88",X"66",X"00",X"BB",X"66",X"00",X"00",X"22",X"44",X"88",X"00", + X"00",X"55",X"55",X"77",X"00",X"22",X"11",X"11",X"22",X"CC",X"44",X"CC",X"00",X"20",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"27",X"27",X"12", + X"07",X"0F",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"12",X"27",X"27",X"02",X"00",X"00",X"00", + X"00",X"07",X"07",X"03",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"0F",X"7F",X"07",X"01",X"00", + X"00",X"00",X"00",X"08",X"0C",X"CF",X"2D",X"06",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0F", + X"0F",X"0F",X"0F",X"03",X"07",X"07",X"00",X"00",X"01",X"07",X"7F",X"0F",X"00",X"00",X"00",X"00", + X"2D",X"CF",X"0C",X"08",X"00",X"00",X"00",X"00",X"0F",X"0B",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"07",X"03",X"0F",X"0F",X"0F",X"0F",X"03",X"27",X"37",X"17",X"03",X"01",X"00",X"00", + X"00",X"08",X"08",X"08",X"8C",X"4F",X"2D",X"06",X"00",X"00",X"00",X"00",X"00",X"0B",X"0F",X"0F", + X"0F",X"0F",X"0F",X"03",X"07",X"07",X"00",X"00",X"00",X"01",X"03",X"17",X"37",X"27",X"03",X"00", + X"2D",X"4F",X"8C",X"08",X"08",X"08",X"00",X"00",X"0F",X"0B",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"60",X"C3",X"0F",X"0C",X"38",X"4B",X"0F",X"00",X"01",X"13",X"01",X"00",X"01",X"13",X"01", + X"00",X"0F",X"DE",X"0F",X"12",X"0F",X"CE",X"0C",X"00",X"0C",X"1E",X"07",X"0F",X"0F",X"07",X"03", + X"0F",X"0F",X"0F",X"06",X"0F",X"0F",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"0E",X"0E",X"0C",X"08",X"00",X"00",X"0D",X"00",X"30",X"61",X"C3",X"A7",X"4F",X"4E",X"6F", + X"00",X"0F",X"4B",X"0D",X"4B",X"0F",X"03",X"01",X"10",X"30",X"69",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"1E",X"68",X"48",X"0C",X"0C",X"08",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"07",X"03",X"01",X"03",X"03",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"61",X"C3",X"87",X"0F",X"4E",X"6F", + X"00",X"0C",X"86",X"0A",X"87",X"0F",X"03",X"01",X"00",X"06",X"86",X"86",X"0E",X"0C",X"0C",X"0C", + X"30",X"F0",X"E0",X"08",X"0B",X"0F",X"07",X"00",X"3F",X"17",X"03",X"00",X"00",X"00",X"00",X"00", + X"09",X"08",X"08",X"01",X"01",X"00",X"00",X"00",X"0E",X"1E",X"0F",X"0F",X"0F",X"0D",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"61",X"C3",X"97",X"A7",X"2F",X"6F", + X"0E",X"4B",X"0D",X"4B",X"0F",X"09",X"01",X"01",X"03",X"43",X"43",X"4B",X"0F",X"0E",X"0C",X"0C", + X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"00",X"0F",X"06",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"01",X"07",X"0F",X"0F",X"06",X"2C",X"3C",X"1E",X"0F",X"0F",X"0F",X"03",X"03", + X"00",X"00",X"10",X"F0",X"4B",X"0F",X"0C",X"00",X"00",X"70",X"E1",X"D3",X"37",X"6F",X"0F",X"00", + X"C3",X"96",X"0F",X"9E",X"0B",X"08",X"01",X"01",X"08",X"0C",X"04",X"0E",X"0F",X"0F",X"0F",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00",X"00", + X"03",X"0B",X"0F",X"0F",X"0B",X"03",X"03",X"03",X"0E",X"0C",X"0C",X"08",X"08",X"00",X"00",X"00", + X"02",X"05",X"00",X"00",X"00",X"03",X"0C",X"00",X"80",X"00",X"04",X"02",X"00",X"00",X"77",X"EE", + X"08",X"19",X"04",X"00",X"07",X"04",X"04",X"00",X"80",X"01",X"03",X"00",X"0C",X"00",X"02",X"01", + X"00",X"88",X"CC",X"22",X"11",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"04",X"08", + X"00",X"07",X"04",X"04",X"00",X"00",X"11",X"11",X"00",X"0C",X"00",X"08",X"0C",X"02",X"89",X"01", + X"00",X"00",X"00",X"06",X"08",X"03",X"01",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"02", + X"4B",X"0F",X"01",X"03",X"08",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"0F",X"08",X"08",X"0A",X"0D",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01", + X"00",X"00",X"00",X"00",X"CC",X"0C",X"07",X"2D",X"03",X"07",X"0C",X"08",X"08",X"08",X"0F",X"0F", + X"09",X"0A",X"08",X"0F",X"01",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"0C",X"CC",X"00",X"00",X"00",X"00",X"00",X"0F",X"08",X"08",X"08",X"0C",X"07",X"03",X"00", + X"00",X"00",X"01",X"07",X"0C",X"08",X"02",X"09",X"00",X"00",X"00",X"00",X"11",X"03",X"02",X"03", + X"00",X"00",X"01",X"02",X"8B",X"09",X"0F",X"4B",X"00",X"08",X"0C",X"02",X"04",X"01",X"0F",X"0F", + X"05",X"0A",X"0C",X"07",X"01",X"00",X"00",X"00",X"02",X"03",X"11",X"00",X"00",X"00",X"00",X"00", + X"0F",X"09",X"8B",X"02",X"01",X"00",X"00",X"00",X"0F",X"01",X"04",X"02",X"0C",X"08",X"00",X"00", + X"00",X"08",X"08",X"00",X"00",X"00",X"08",X"0D",X"00",X"01",X"01",X"25",X"07",X"07",X"23",X"33", + X"00",X"0C",X"0C",X"1D",X"0F",X"0F",X"8B",X"89",X"33",X"23",X"67",X"CF",X"0E",X"01",X"0B",X"0E", + X"07",X"08",X"0C",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"04",X"08",X"08",X"04",X"03",X"00",X"0E",X"07",X"04",X"04",X"08",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"03",X"03",X"4B",X"0F",X"0F", + X"0C",X"0E",X"02",X"0A",X"0A",X"0A",X"0F",X"0E",X"00",X"00",X"00",X"06",X"0E",X"08",X"08",X"07", + X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"07",X"57",X"77",X"00",X"00",X"00",X"01",X"02",X"04", + X"07",X"03",X"01",X"00",X"00",X"09",X"06",X"00",X"04",X"0C",X"0C",X"0E",X"0B",X"01",X"00",X"00", + X"CC",X"8E",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"12",X"03",X"03",X"11",X"11",X"00", + X"0E",X"0E",X"0E",X"0F",X"0F",X"4D",X"CD",X"01",X"00",X"33",X"67",X"0F",X"0C",X"0C",X"0C",X"0C", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0C",X"88",X"00",X"00",X"00",X"08",X"08",X"04",X"03",X"00", + X"01",X"03",X"03",X"02",X"04",X"08",X"00",X"00",X"0C",X"0C",X"0E",X"07",X"67",X"33",X"11",X"11", + X"00",X"00",X"0F",X"03",X"00",X"0F",X"03",X"00",X"00",X"01",X"01",X"25",X"07",X"07",X"23",X"33", + X"00",X"0C",X"0C",X"0C",X"0F",X"0F",X"8B",X"8B",X"00",X"00",X"07",X"0C",X"08",X"0F",X"08",X"08", + X"08",X"0A",X"0E",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04",X"08",X"08", + X"07",X"07",X"07",X"03",X"03",X"09",X"06",X"00",X"0B",X"02",X"0E",X"0F",X"01",X"03",X"02",X"02", + X"0C",X"0C",X"00",X"00",X"06",X"06",X"0C",X"02",X"00",X"03",X"03",X"4B",X"0F",X"0F",X"57",X"77", + X"00",X"08",X"08",X"08",X"0F",X"0F",X"07",X"07",X"00",X"01",X"03",X"0E",X"0C",X"06",X"03",X"08", + X"0E",X"00",X"00",X"08",X"0D",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00", + X"07",X"03",X"03",X"01",X"01",X"08",X"06",X"01",X"09",X"0B",X"0E",X"0F",X"00",X"0C",X"02",X"0C", + X"00",X"00",X"06",X"03",X"06",X"0C",X"08",X"09",X"00",X"00",X"00",X"01",X"03",X"0E",X"0D",X"01", + X"00",X"00",X"00",X"0E",X"03",X"CD",X"0C",X"07",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"0F", + X"0D",X"0D",X"0A",X"0C",X"06",X"03",X"06",X"00",X"01",X"01",X"0D",X"0E",X"03",X"01",X"00",X"00", + X"2D",X"07",X"0C",X"CD",X"03",X"0E",X"00",X"00",X"0F",X"0F",X"08",X"08",X"00",X"00",X"00",X"00", + X"03",X"02",X"0E",X"08",X"00",X"00",X"C4",X"30",X"22",X"01",X"01",X"80",X"C0",X"23",X"00",X"00", + X"02",X"22",X"22",X"00",X"70",X"50",X"70",X"00",X"CC",X"88",X"00",X"01",X"C0",X"40",X"C0",X"22", + X"00",X"00",X"00",X"06",X"11",X"80",X"08",X"00",X"00",X"66",X"88",X"01",X"06",X"08",X"00",X"11", + X"CC",X"70",X"50",X"70",X"44",X"89",X"89",X"89",X"00",X"F3",X"40",X"C0",X"44",X"44",X"22",X"88", + X"00",X"00",X"00",X"00",X"C0",X"E0",X"92",X"96",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"20",X"20",X"10",X"00",X"00",X"00",X"00",X"10",X"83",X"71",X"F0", + X"92",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"71",X"03",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"E1",X"E1",X"C0",X"C0",X"00",X"00",X"00",X"70",X"61",X"03",X"27",X"07", + X"20",X"70",X"30",X"30",X"38",X"3C",X"52",X"D2",X"00",X"00",X"70",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"E1",X"E1",X"80",X"00",X"00",X"00",X"00",X"27",X"03",X"61",X"70",X"00",X"00",X"00",X"00", + X"52",X"3C",X"38",X"30",X"30",X"70",X"20",X"00",X"F0",X"F0",X"F0",X"F0",X"70",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"E1",X"E1",X"C0",X"C0",X"00",X"00",X"00",X"70",X"21",X"03",X"27",X"07", + X"10",X"30",X"30",X"30",X"38",X"3C",X"52",X"D2",X"00",X"80",X"00",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"E1",X"E1",X"80",X"00",X"00",X"00",X"00",X"27",X"03",X"21",X"70",X"00",X"00",X"00",X"00", + X"52",X"3C",X"38",X"30",X"30",X"30",X"10",X"00",X"F0",X"F0",X"F0",X"F0",X"00",X"80",X"00",X"00", + X"00",X"06",X"86",X"84",X"F0",X"F0",X"C0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"03",X"30",X"74",X"3C",X"1E",X"F0",X"F0",X"F0", + X"E0",X"E0",X"F0",X"F0",X"C0",X"0C",X"0E",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"10",X"00",X"60",X"90",X"80",X"40",X"F0",X"F0",X"F0",X"F0",X"70",X"B0",X"00",X"00", + X"00",X"00",X"80",X"C0",X"F0",X"F0",X"C0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"03",X"30",X"74",X"3C",X"1E",X"F0",X"F0",X"F0", + X"E0",X"E0",X"C0",X"F0",X"F0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"10",X"00",X"00",X"00",X"30",X"C0",X"F0",X"F0",X"F0",X"F0",X"70",X"F0",X"00",X"00", + X"00",X"20",X"E0",X"E0",X"C0",X"C3",X"C3",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"03",X"30",X"74",X"3C",X"1E",X"F0",X"F0",X"F0", + X"E0",X"E0",X"C3",X"C3",X"C0",X"E0",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"10",X"00",X"00",X"90",X"A0",X"40",X"F0",X"F0",X"F0",X"F0",X"F0",X"B0",X"00",X"00", + X"00",X"06",X"60",X"E0",X"E0",X"E0",X"C0",X"C0",X"00",X"00",X"00",X"70",X"70",X"30",X"78",X"78", + X"20",X"70",X"30",X"30",X"B0",X"F0",X"F0",X"F0",X"00",X"00",X"70",X"F0",X"F0",X"F0",X"F0",X"F0", + X"C0",X"E0",X"E0",X"E0",X"60",X"06",X"00",X"00",X"78",X"30",X"70",X"70",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"B0",X"30",X"30",X"70",X"20",X"00",X"F0",X"F0",X"F0",X"F0",X"70",X"00",X"00",X"00", + X"40",X"00",X"10",X"70",X"00",X"80",X"00",X"00",X"20",X"10",X"80",X"40",X"20",X"00",X"C0",X"02", + X"04",X"00",X"A0",X"20",X"00",X"70",X"50",X"70",X"20",X"20",X"40",X"40",X"08",X"D0",X"00",X"01", + X"E0",X"30",X"00",X"00",X"80",X"40",X"20",X"00",X"00",X"00",X"30",X"C0",X"10",X"10",X"10",X"20", + X"0C",X"70",X"50",X"70",X"08",X"20",X"10",X"00",X"00",X"C0",X"00",X"10",X"08",X"20",X"10",X"10", + X"00",X"00",X"07",X"0F",X"0D",X"01",X"03",X"0F",X"00",X"00",X"0E",X"0F",X"03",X"00",X"0C",X"0F", + X"01",X"03",X"01",X"0C",X"0F",X"03",X"00",X"0C",X"08",X"0C",X"08",X"03",X"0F",X"0C",X"00",X"03", + X"0C",X"01",X"0F",X"01",X"0E",X"00",X"0F",X"00",X"0B",X"08",X"07",X"00",X"0F",X"08",X"07",X"00", + X"0F",X"03",X"08",X"07",X"00",X"0F",X"00",X"0F",X"0F",X"0C",X"01",X"0E",X"00",X"0F",X"00",X"0F", + X"0F",X"0F",X"00",X"07",X"0C",X"01",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"0C",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0E",X"0F",X"0F",X"0F",X"07",X"03",X"00", + X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"06",X"0C",X"07",X"03",X"07",X"00",X"01",X"03", + X"00",X"00",X"00",X"0F",X"08",X"00",X"0E",X"03",X"00",X"11",X"00",X"0C",X"00",X"04",X"02",X"06", + X"33",X"00",X"0C",X"0E",X"07",X"0F",X"0C",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"0C",X"00",X"0F",X"0C",X"08",X"0F",X"0F",X"00", + X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"77",X"33",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"01",X"0F",X"00",X"0F",X"0F",X"0F", + X"08",X"0E",X"0F",X"0C",X"00",X"0E",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C", + X"00",X"00",X"00",X"08",X"0C",X"0E",X"07",X"00",X"0F",X"0F",X"07",X"03",X"07",X"0F",X"0F",X"0E", + X"03",X"00",X"08",X"0C",X"0E",X"0F",X"0C",X"00",X"0E",X"0F",X"07",X"07",X"03",X"01",X"00",X"00", + X"00",X"33",X"FF",X"EE",X"EE",X"EE",X"FF",X"FF",X"00",X"00",X"88",X"88",X"88",X"00",X"00",X"CC", + X"00",X"77",X"77",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"11",X"00",X"88",X"00",X"33", + X"FF",X"EE",X"88",X"00",X"0C",X"08",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"0F",X"00",X"00", + X"00",X"FF",X"FF",X"00",X"03",X"0F",X"03",X"00",X"FF",X"FF",X"FF",X"00",X"0F",X"0F",X"0E",X"00", + X"88",X"CC",X"EE",X"EE",X"FF",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"33",X"77",X"77",X"33",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF",X"00",X"00",X"FF", + X"CC",X"FF",X"FF",X"EE",X"88",X"33",X"FF",X"EE",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"33", + X"33",X"77",X"77",X"33",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"00",X"00",X"FF", + X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"88", + X"07",X"03",X"00",X"00",X"77",X"44",X"33",X"00",X"0F",X"0F",X"0F",X"00",X"22",X"99",X"EE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"BB",X"CC",X"44",X"66",X"33",X"22",X"33", + X"77",X"44",X"FF",X"00",X"00",X"FF",X"77",X"00",X"EE",X"00",X"CC",X"00",X"00",X"EE",X"CC",X"00", + X"03",X"01",X"00",X"08",X"0F",X"0F",X"00",X"00",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"0F",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0F",X"07",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"03",X"01",X"00", + X"07",X"0F",X"0C",X"08",X"08",X"0C",X"0E",X"0F",X"0E",X"0F",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"03", + X"00",X"00",X"00",X"00",X"00",X"0E",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F", + X"0F",X"00",X"00",X"00",X"01",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0C",X"00",X"00",X"00",X"00",X"00",X"0F",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0E",X"0C",X"00",X"08",X"0C",X"0F",X"00",X"08",X"0F",X"0F",X"00", + X"01",X"07",X"0F",X"00",X"00",X"0F",X"0F",X"00",X"0E",X"08",X"00",X"00",X"00",X"0F",X"0F",X"00", + X"00",X"0E",X"0F",X"0F",X"0E",X"0E",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0C",X"0F",X"0F",X"0C",X"0C",X"00",X"00",X"08",X"01",X"0F",X"0F",X"01",X"01",X"03",X"0F", + X"00",X"00",X"08",X"0C",X"0C",X"0C",X"08",X"08",X"01",X"07",X"0E",X"0C",X"08",X"08",X"0C",X"0F", + X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"0E",X"07",X"01",X"00",X"00",X"01",X"0F", + X"0C",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"0F",X"00",X"00",X"07",X"0F",X"0C",X"00",X"00", + X"0F",X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"0E",X"0F",X"03",X"07"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..84f8d265 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"08",X"08",X"08",X"08",X"08",X"0F",X"0F",X"08",X"08",X"00",X"00",X"00",X"08",X"08",X"08",X"08", + X"0F",X"0F",X"0F",X"08",X"00",X"00",X"08",X"08",X"08",X"08",X"0F",X"0F",X"08",X"08",X"00",X"00", + X"07",X"09",X"0A",X"0B",X"07",X"0D",X"0D",X"07",X"0E",X"07",X"0D",X"0D",X"07",X"0B",X"0A",X"09", + X"07",X"05",X"07",X"03",X"07",X"01",X"07",X"00",X"07",X"00",X"07",X"01",X"07",X"03",X"07",X"05", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"08",X"08",X"00",X"08",X"08",X"0F",X"0F",X"00",X"00",X"08",X"08",X"08",X"0F",X"0F",X"0F", + X"00",X"08",X"08",X"00",X"0F",X"0F",X"08",X"08",X"08",X"08",X"0F",X"08",X"00",X"00",X"00",X"08", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0E",X"0C",X"09",X"0C",X"0E",X"0A",X"07",X"0C",X"0F",X"0D",X"08",X"0A",X"0B",X"07",X"02", + X"08",X"0D",X"09",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"07",X"08",X"0A",X"0C",X"0E",X"0D",X"0C",X"0C",X"0B",X"0A",X"08",X"07",X"05",X"06",X"07",X"08", + X"08",X"09",X"0A",X"0B",X"09",X"08",X"06",X"05",X"04",X"04",X"03",X"02",X"04",X"06",X"08",X"09", + X"0A",X"0C",X"0C",X"0A",X"07",X"07",X"08",X"0B",X"0D",X"0E",X"0D",X"0A",X"06",X"05",X"05",X"07", + X"09",X"09",X"08",X"04",X"01",X"00",X"01",X"03",X"06",X"07",X"07",X"04",X"02",X"02",X"04",X"07"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..c996a6b9 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"07",X"0E",X"08",X"00",X"02",X"0E",X"0A",X"00",X"06",X"0C",X"0A", + X"00",X"0F",X"02",X"0D",X"00",X"01",X"09",X"0B",X"00",X"0F",X"01",X"07",X"00",X"05",X"02",X"0E", + X"00",X"07",X"0B",X"05",X"00",X"07",X"0F",X"04",X"00",X"07",X"0B",X"08",X"00",X"01",X"08",X"03", + X"00",X"0E",X"01",X"0F",X"00",X"05",X"07",X"01",X"00",X"05",X"07",X"02",X"00",X"05",X"03",X"02", + X"00",X"01",X"07",X"01",X"00",X"01",X"07",X"02",X"00",X"01",X"03",X"02",X"00",X"02",X"07",X"01", + X"00",X"02",X"07",X"02",X"00",X"02",X"03",X"02",X"00",X"0C",X"07",X"01",X"00",X"0C",X"07",X"02", + X"00",X"0C",X"03",X"02",X"00",X"04",X"07",X"01",X"00",X"04",X"07",X"02",X"00",X"04",X"03",X"02", + X"00",X"07",X"07",X"01",X"00",X"07",X"07",X"02",X"00",X"07",X"03",X"02",X"00",X"0F",X"02",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..48c2a533 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"47",X"38",X"C8",X"E8",X"3F",X"C6",X"FF",X"9F",X"29",X"DF",X"37",X"86",X"1F",X"27",X"1D"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..95ab1e86 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F3",X"97",X"32",X"00",X"50",X"32",X"C0",X"50",X"DB",X"02",X"ED",X"56",X"31",X"F0",X"4F",X"06", + X"64",X"DB",X"03",X"CD",X"65",X"03",X"3A",X"00",X"3F",X"00",X"97",X"21",X"00",X"4C",X"01",X"04", + X"00",X"77",X"23",X"10",X"FC",X"32",X"C0",X"50",X"0D",X"20",X"F6",X"DB",X"04",X"DB",X"0A",X"CD", + X"ED",X"06",X"C3",X"07",X"02",X"07",X"37",X"00",X"F5",X"C5",X"D5",X"E5",X"3A",X"3B",X"4C",X"A7", + X"CA",X"32",X"01",X"DB",X"07",X"11",X"F2",X"4F",X"01",X"62",X"50",X"21",X"8C",X"4E",X"DB",X"08", + X"DB",X"0A",X"DB",X"0B",X"3E",X"06",X"00",X"F5",X"DB",X"14",X"DB",X"15",X"F1",X"F5",X"3A",X"A8", + X"4C",X"A7",X"28",X"26",X"3A",X"A9",X"4C",X"A7",X"28",X"20",X"7E",X"3D",X"CB",X"4E",X"20",X"02", + X"C6",X"04",X"12",X"13",X"23",X"7E",X"12",X"13",X"23",X"3E",X"E6",X"96",X"C6",X"26",X"02",X"03", + X"23",X"7E",X"D6",X"18",X"D6",X"F8",X"ED",X"44",X"18",X"0D",X"7E",X"12",X"13",X"23",X"7E",X"12", + X"13",X"23",X"7E",X"02",X"03",X"23",X"7E",X"02",X"03",X"23",X"F1",X"3D",X"20",X"BF",X"3A",X"A7", + X"4C",X"A7",X"20",X"6C",X"21",X"CA",X"4E",X"3A",X"34",X"4F",X"47",X"97",X"32",X"34",X"4F",X"78", + X"06",X"04",X"0F",X"F5",X"30",X"53",X"E5",X"11",X"05",X"00",X"19",X"E5",X"5E",X"23",X"56",X"D5", + X"2B",X"2B",X"7E",X"4F",X"EE",X"01",X"77",X"2B",X"2B",X"7E",X"CB",X"2F",X"CB",X"2F",X"ED",X"44", + X"EB",X"CB",X"7F",X"16",X"00",X"5F",X"3E",X"FF",X"28",X"02",X"2F",X"15",X"A9",X"E6",X"01",X"20", + X"03",X"11",X"00",X"00",X"D5",X"11",X"FB",X"01",X"CB",X"41",X"28",X"03",X"11",X"01",X"02",X"CD", + X"5B",X"01",X"D1",X"E1",X"19",X"D1",X"EB",X"73",X"23",X"72",X"EB",X"11",X"FB",X"01",X"CB",X"41", + X"20",X"03",X"11",X"01",X"02",X"CD",X"44",X"01",X"E1",X"11",X"F4",X"FF",X"19",X"F1",X"10",X"A2", + X"21",X"09",X"4C",X"35",X"23",X"36",X"00",X"23",X"35",X"20",X"03",X"CD",X"32",X"07",X"CD",X"32", + X"07",X"CD",X"8B",X"01",X"E1",X"D1",X"C1",X"97",X"32",X"00",X"50",X"3C",X"32",X"00",X"50",X"F1", + X"FB",X"C9",X"3A",X"A7",X"4C",X"A7",X"20",X"D8",X"21",X"F2",X"4F",X"97",X"06",X"0C",X"77",X"23", + X"10",X"FC",X"18",X"CC",X"C5",X"0E",X"02",X"06",X"06",X"D5",X"1A",X"86",X"77",X"13",X"2B",X"10", + X"F9",X"11",X"E6",X"FF",X"19",X"D1",X"0D",X"20",X"EE",X"C1",X"C9",X"C5",X"0E",X"02",X"06",X"06", + X"D5",X"1A",X"96",X"ED",X"44",X"77",X"13",X"2B",X"10",X"F7",X"11",X"E6",X"FF",X"19",X"D1",X"0D", + X"20",X"EC",X"C1",X"C9",X"F5",X"C5",X"06",X"FF",X"3A",X"0D",X"4C",X"CB",X"77",X"20",X"02",X"06", + X"BF",X"CD",X"81",X"02",X"A0",X"32",X"0D",X"4C",X"D1",X"F1",X"C9",X"F5",X"DB",X"1E",X"E5",X"DB", + X"1F",X"3A",X"AC",X"4C",X"A7",X"20",X"19",X"CD",X"B3",X"01",X"3A",X"00",X"50",X"E6",X"10",X"00", + X"00",X"00",X"3A",X"A8",X"4C",X"A7",X"20",X"08",X"3A",X"40",X"50",X"E6",X"10",X"00",X"00",X"00", + X"E1",X"F1",X"C9",X"3A",X"0F",X"4C",X"A7",X"28",X"2C",X"3A",X"00",X"50",X"CB",X"6F",X"C0",X"97", + X"32",X"0F",X"4C",X"3C",X"32",X"15",X"4C",X"CD",X"ED",X"06",X"3E",X"16",X"CD",X"7A",X"09",X"21", + X"36",X"4C",X"7E",X"FE",X"99",X"C8",X"C6",X"01",X"27",X"77",X"3E",X"0F",X"32",X"0C",X"4C",X"3E", + X"01",X"32",X"07",X"50",X"C9",X"21",X"0C",X"4C",X"35",X"C0",X"36",X"01",X"3A",X"00",X"50",X"CB", + X"6F",X"C8",X"97",X"32",X"07",X"50",X"3C",X"32",X"0F",X"4C",X"C9",X"7C",X"02",X"02",X"02",X"80", + X"00",X"7E",X"02",X"02",X"02",X"02",X"82",X"97",X"32",X"03",X"50",X"3C",X"32",X"93",X"4C",X"32", + X"A3",X"4C",X"32",X"0F",X"4C",X"32",X"17",X"4C",X"21",X"48",X"4C",X"36",X"4D",X"23",X"36",X"4F", + X"23",X"36",X"42",X"23",X"36",X"00",X"23",X"36",X"01",X"23",X"36",X"00",X"CD",X"F0",X"20",X"3A", + X"40",X"50",X"CB",X"7F",X"3E",X"01",X"28",X"01",X"97",X"32",X"A8",X"4C",X"C3",X"00",X"12",X"FB", + X"3E",X"0B",X"CD",X"7A",X"09",X"CD",X"A1",X"03",X"C3",X"93",X"3B",X"F5",X"E6",X"F0",X"0F",X"0F", + X"0F",X"0F",X"47",X"F1",X"E6",X"0F",X"4F",X"C9",X"F5",X"3A",X"8A",X"4C",X"18",X"04",X"F5",X"3A", + X"4B",X"4D",X"C5",X"47",X"3A",X"A8",X"4C",X"A7",X"28",X"0F",X"78",X"06",X"00",X"FE",X"01",X"28", + X"01",X"04",X"78",X"32",X"03",X"50",X"32",X"A9",X"4C",X"C1",X"F1",X"C9",X"3A",X"8A",X"4C",X"18", + X"03",X"3A",X"4B",X"4D",X"C5",X"47",X"3A",X"A8",X"4C",X"A7",X"28",X"1B",X"78",X"FE",X"01",X"28", + X"16",X"3A",X"40",X"50",X"47",X"E6",X"0F",X"4F",X"78",X"E6",X"10",X"07",X"B1",X"4F",X"3A",X"00", + X"50",X"E6",X"80",X"0F",X"B1",X"C1",X"C9",X"3A",X"00",X"50",X"E6",X"0F",X"4F",X"3A",X"40",X"50", + X"E6",X"60",X"18",X"F0",X"CD",X"BD",X"02",X"06",X"1E",X"CD",X"72",X"03",X"C9",X"CD",X"D1",X"02", + X"CD",X"E2",X"02",X"CD",X"15",X"03",X"C9",X"CD",X"F3",X"02",X"CD",X"04",X"03",X"CD",X"1A",X"03", + X"C9",X"21",X"C2",X"43",X"01",X"01",X"1C",X"CD",X"20",X"03",X"21",X"E2",X"43",X"01",X"01",X"1C", + X"18",X"3E",X"21",X"02",X"40",X"01",X"01",X"1C",X"CD",X"20",X"03",X"21",X"22",X"40",X"01",X"01", + X"1C",X"18",X"2D",X"21",X"C2",X"47",X"01",X"01",X"1C",X"CD",X"20",X"03",X"21",X"E2",X"47",X"01", + X"01",X"1C",X"18",X"1C",X"21",X"02",X"44",X"01",X"01",X"1C",X"CD",X"20",X"03",X"21",X"22",X"44", + X"01",X"01",X"1C",X"18",X"0B",X"21",X"40",X"40",X"18",X"03",X"21",X"40",X"44",X"01",X"04",X"80", + X"77",X"23",X"10",X"FC",X"32",X"C0",X"50",X"0D",X"20",X"F6",X"C9",X"06",X"3C",X"CD",X"49",X"03", + X"3E",X"01",X"32",X"00",X"50",X"FB",X"3A",X"0A",X"4C",X"A7",X"20",X"F1",X"32",X"C0",X"50",X"3C", + X"32",X"0A",X"4C",X"10",X"E8",X"0D",X"20",X"E3",X"C9",X"F5",X"3A",X"36",X"4C",X"A7",X"20",X"02", + X"F1",X"C9",X"31",X"F0",X"4F",X"97",X"32",X"14",X"4C",X"32",X"3B",X"4C",X"3E",X"01",X"32",X"00", + X"50",X"FB",X"C3",X"85",X"19",X"C5",X"0E",X"00",X"0D",X"20",X"FD",X"32",X"C0",X"50",X"10",X"F8", + X"C1",X"C9",X"F5",X"C5",X"78",X"32",X"09",X"4C",X"3E",X"01",X"32",X"00",X"50",X"FB",X"32",X"C0", + X"50",X"3A",X"09",X"4C",X"A7",X"20",X"F1",X"C1",X"F1",X"C9",X"F5",X"3E",X"01",X"32",X"0A",X"4C", + X"3E",X"01",X"32",X"00",X"50",X"FB",X"32",X"C0",X"50",X"3A",X"0A",X"4C",X"A7",X"20",X"F1",X"F1", + X"C9",X"06",X"02",X"CD",X"72",X"03",X"D5",X"E5",X"21",X"B1",X"4C",X"11",X"04",X"00",X"06",X"03", + X"4E",X"B9",X"28",X"05",X"19",X"10",X"F9",X"18",X"1D",X"2B",X"3A",X"14",X"4C",X"A7",X"28",X"06", + X"3A",X"15",X"4C",X"A7",X"28",X"10",X"3E",X"01",X"32",X"00",X"50",X"32",X"01",X"50",X"FB",X"7E", + X"32",X"C0",X"50",X"A7",X"20",X"E4",X"E1",X"D1",X"C9",X"D5",X"3E",X"01",X"32",X"08",X"4C",X"1A", + X"CD",X"F3",X"03",X"13",X"1A",X"CD",X"F3",X"03",X"13",X"97",X"32",X"08",X"4C",X"1A",X"CD",X"F3", + X"03",X"D1",X"C9",X"C5",X"CD",X"4B",X"02",X"78",X"CD",X"01",X"04",X"79",X"CD",X"01",X"04",X"C1", + X"C9",X"D5",X"5F",X"3A",X"08",X"4C",X"57",X"A7",X"28",X"09",X"7B",X"A7",X"3E",X"00",X"20",X"03", + X"1E",X"D0",X"7A",X"32",X"08",X"4C",X"7B",X"C6",X"30",X"D1",X"D5",X"77",X"E5",X"11",X"00",X"04", + X"19",X"3A",X"02",X"4C",X"77",X"E1",X"3A",X"A3",X"4C",X"A7",X"11",X"FF",X"FF",X"28",X"03",X"11", + X"E0",X"FF",X"19",X"D1",X"C9",X"C5",X"D5",X"CD",X"4B",X"02",X"78",X"FE",X"0A",X"16",X"30",X"38", + X"02",X"16",X"37",X"82",X"CD",X"1A",X"04",X"79",X"FE",X"0A",X"16",X"30",X"38",X"02",X"16",X"37", + X"82",X"CD",X"1A",X"04",X"D1",X"C1",X"C9",X"77",X"19",X"10",X"FC",X"C9",X"F5",X"4E",X"81",X"77", + X"F1",X"19",X"10",X"F8",X"C9",X"C5",X"01",X"01",X"00",X"18",X"04",X"C5",X"01",X"E0",X"FF",X"ED", + X"43",X"04",X"4C",X"F5",X"22",X"06",X"4C",X"C5",X"0E",X"32",X"F3",X"ED",X"40",X"1A",X"0D",X"ED", + X"40",X"FB",X"C1",X"FE",X"FF",X"28",X"15",X"77",X"C5",X"E5",X"01",X"00",X"04",X"09",X"3A",X"02", + X"4C",X"77",X"E1",X"C1",X"13",X"ED",X"4B",X"04",X"4C",X"09",X"18",X"DB",X"13",X"0E",X"14",X"F3", + X"ED",X"40",X"1A",X"0C",X"13",X"ED",X"40",X"FB",X"FE",X"FF",X"20",X"03",X"F1",X"C1",X"C9",X"FE", + X"FE",X"20",X"09",X"2A",X"06",X"4C",X"23",X"22",X"06",X"4C",X"18",X"BB",X"32",X"02",X"4C",X"18", + X"B6",X"D5",X"EB",X"97",X"67",X"6F",X"3C",X"32",X"01",X"50",X"32",X"00",X"50",X"00",X"D5",X"16", + X"00",X"5F",X"19",X"D1",X"13",X"10",X"F6",X"32",X"C0",X"50",X"0D",X"20",X"F0",X"D1",X"19",X"7C", + X"21",X"CB",X"37",X"E9",X"E5",X"11",X"04",X"05",X"21",X"9A",X"42",X"CD",X"6B",X"04",X"3A",X"03", + X"4C",X"32",X"02",X"4C",X"3E",X"01",X"32",X"08",X"4C",X"3A",X"36",X"4C",X"21",X"BA",X"41",X"CD", + X"F3",X"03",X"E1",X"C9",X"FF",X"05",X"43",X"52",X"45",X"44",X"49",X"54",X"FF",X"FF",X"21",X"DD", + X"43",X"11",X"96",X"4C",X"18",X"06",X"21",X"FD",X"43",X"11",X"99",X"4C",X"32",X"02",X"4C",X"CD", + X"D9",X"03",X"C9",X"F5",X"C5",X"D5",X"E5",X"07",X"16",X"00",X"5F",X"3A",X"14",X"4C",X"FE",X"01", + X"CA",X"5E",X"05",X"21",X"88",X"05",X"19",X"01",X"98",X"4C",X"11",X"A0",X"4C",X"3A",X"4B",X"4D", + X"FE",X"01",X"28",X"06",X"01",X"9B",X"4C",X"11",X"A2",X"4C",X"0A",X"86",X"27",X"02",X"2B",X"0B", + X"0A",X"8E",X"27",X"02",X"0B",X"0A",X"CE",X"00",X"27",X"02",X"EB",X"CD",X"63",X"05",X"E1",X"D1", + X"C1",X"F1",X"C9",X"3A",X"92",X"4C",X"57",X"0A",X"BA",X"D8",X"7E",X"A7",X"C8",X"2B",X"34",X"3A", + X"4B",X"4D",X"FE",X"01",X"28",X"05",X"CD",X"9E",X"05",X"18",X"03",X"CD",X"95",X"05",X"3E",X"12", + X"CD",X"7A",X"09",X"23",X"36",X"00",X"C9",X"50",X"00",X"00",X"55",X"00",X"66",X"00",X"77",X"00", + X"88",X"00",X"99",X"01",X"00",X"E5",X"01",X"9F",X"4C",X"21",X"D6",X"43",X"18",X"07",X"E5",X"01", + X"A1",X"4C",X"21",X"F6",X"43",X"0A",X"A7",X"28",X"19",X"FE",X"07",X"38",X"02",X"3E",X"06",X"47", + X"36",X"01",X"2B",X"3E",X"09",X"77",X"E5",X"11",X"00",X"04",X"19",X"77",X"23",X"77",X"E1",X"2B", + X"10",X"EE",X"E1",X"C9",X"21",X"C5",X"43",X"01",X"4D",X"4D",X"18",X"06",X"21",X"E5",X"43",X"01", + X"50",X"4D",X"11",X"E1",X"05",X"CD",X"65",X"04",X"11",X"F9",X"FF",X"19",X"0A",X"CD",X"F3",X"03", + X"C9",X"20",X"20",X"44",X"4C",X"49",X"42",X"FF",X"FF",X"D5",X"E5",X"11",X"00",X"06",X"21",X"CD", + X"43",X"CD",X"65",X"04",X"11",X"0A",X"06",X"21",X"ED",X"43",X"CD",X"65",X"04",X"E1",X"D1",X"C9", + X"FF",X"08",X"71",X"70",X"6F",X"6E",X"6D",X"6C",X"FF",X"FF",X"77",X"76",X"75",X"74",X"73",X"72", + X"FF",X"FF",X"F5",X"C5",X"D5",X"E5",X"3E",X"01",X"32",X"3B",X"4C",X"32",X"A7",X"4C",X"06",X"18", + X"21",X"8C",X"4E",X"11",X"31",X"06",X"1A",X"77",X"13",X"23",X"10",X"FA",X"E1",X"D1",X"C1",X"F1", + X"C9",X"D0",X"08",X"95",X"F8",X"D4",X"08",X"85",X"F8",X"D8",X"08",X"76",X"F8",X"DC",X"08",X"96", + X"E8",X"E0",X"08",X"86",X"E8",X"E4",X"08",X"76",X"E8",X"11",X"53",X"06",X"21",X"24",X"40",X"CD", + X"65",X"04",X"C9",X"FF",X"07",X"20",X"20",X"52",X"4F",X"42",X"41",X"4C",X"20",X"45",X"52",X"41", + X"57",X"54",X"46",X"4F",X"53",X"20",X"34",X"38",X"39",X"31",X"20",X"40",X"FF",X"FF",X"3E",X"A8", + X"32",X"A6",X"4C",X"21",X"02",X"44",X"11",X"01",X"00",X"3E",X"12",X"06",X"3C",X"CD",X"57",X"04", + X"21",X"02",X"40",X"22",X"A4",X"4C",X"11",X"01",X"00",X"3E",X"60",X"06",X"15",X"CD",X"57",X"04", + X"21",X"22",X"40",X"06",X"15",X"CD",X"57",X"04",X"11",X"AB",X"06",X"21",X"17",X"40",X"CD",X"65", + X"04",X"11",X"E1",X"05",X"21",X"37",X"40",X"CD",X"65",X"04",X"C9",X"FF",X"08",X"20",X"20",X"20", + X"54",X"49",X"45",X"5A",X"FF",X"FF",X"21",X"26",X"4E",X"35",X"C0",X"32",X"26",X"4E",X"3A",X"14", + X"4C",X"A7",X"C0",X"2A",X"A4",X"4C",X"34",X"11",X"20",X"00",X"19",X"34",X"21",X"A6",X"4C",X"35", + X"20",X"05",X"3E",X"01",X"32",X"A5",X"4E",X"7E",X"FE",X"32",X"30",X"05",X"3E",X"03",X"CD",X"7A", + X"09",X"7E",X"E6",X"07",X"C0",X"2A",X"A4",X"4C",X"23",X"22",X"A4",X"4C",X"C9",X"F5",X"C5",X"E5", + X"97",X"21",X"08",X"4D",X"06",X"40",X"77",X"23",X"10",X"FC",X"21",X"08",X"4D",X"11",X"50",X"50", + X"01",X"10",X"00",X"ED",X"B0",X"21",X"08",X"4D",X"11",X"40",X"50",X"01",X"10",X"00",X"ED",X"B0", + X"3E",X"04",X"32",X"4A",X"50",X"3E",X"05",X"32",X"45",X"50",X"32",X"4F",X"50",X"21",X"B0",X"4C", + X"06",X"0C",X"97",X"77",X"23",X"10",X"FC",X"32",X"01",X"50",X"3C",X"32",X"01",X"50",X"E1",X"C1", + X"F1",X"C9",X"F5",X"C5",X"D5",X"E5",X"06",X"00",X"11",X"04",X"00",X"21",X"B0",X"4C",X"7E",X"FE", + X"00",X"C4",X"59",X"07",X"19",X"04",X"7E",X"FE",X"00",X"C4",X"59",X"07",X"19",X"04",X"7E",X"FE", + X"00",X"C4",X"59",X"07",X"E1",X"D1",X"C1",X"F1",X"C9",X"DB",X"64",X"C5",X"D5",X"E5",X"78",X"32", + X"49",X"4D",X"23",X"23",X"E5",X"DB",X"6B",X"5E",X"23",X"56",X"DB",X"64",X"1A",X"D5",X"5F",X"DB", + X"6B",X"7B",X"E6",X"E0",X"07",X"07",X"07",X"21",X"82",X"07",X"5F",X"07",X"83",X"16",X"00",X"5F", + X"19",X"E9",X"C3",X"9E",X"07",X"C3",X"C0",X"07",X"C3",X"E3",X"07",X"C3",X"14",X"08",X"C3",X"42", + X"08",X"C3",X"B8",X"08",X"C3",X"BC",X"08",X"C3",X"C5",X"08",X"E1",X"D1",X"C1",X"C9",X"E1",X"CD", + X"B0",X"0C",X"E6",X"1F",X"23",X"F5",X"CD",X"B0",X"0C",X"47",X"F1",X"23",X"E5",X"CD",X"20",X"09", + X"07",X"16",X"00",X"5F",X"21",X"08",X"4D",X"19",X"70",X"23",X"36",X"00",X"D1",X"C3",X"6A",X"07", + X"E1",X"CD",X"B0",X"0C",X"E6",X"1F",X"23",X"F5",X"CD",X"B0",X"0C",X"4F",X"23",X"CD",X"B0",X"0C", + X"47",X"F1",X"23",X"E5",X"07",X"16",X"00",X"5F",X"21",X"BC",X"4C",X"19",X"71",X"23",X"70",X"D1", + X"C3",X"6A",X"07",X"E1",X"CD",X"B0",X"0C",X"E6",X"1F",X"23",X"F5",X"CD",X"B0",X"0C",X"4F",X"23", + X"CD",X"B0",X"0C",X"47",X"F1",X"23",X"E5",X"F5",X"07",X"16",X"00",X"5F",X"21",X"08",X"4D",X"19", + X"E5",X"7E",X"23",X"6E",X"67",X"09",X"44",X"4D",X"E1",X"70",X"23",X"71",X"F1",X"CD",X"20",X"09", + X"D1",X"C3",X"6A",X"07",X"E1",X"CD",X"B0",X"0C",X"E6",X"1F",X"23",X"F5",X"CD",X"B0",X"0C",X"47", + X"F1",X"23",X"E5",X"07",X"16",X"00",X"5F",X"21",X"08",X"4D",X"19",X"7E",X"B8",X"28",X"0D",X"E1", + X"CD",X"B0",X"0C",X"5F",X"23",X"CD",X"B0",X"0C",X"57",X"C3",X"BE",X"08",X"D1",X"13",X"13",X"C3", + X"6A",X"07",X"E1",X"CD",X"B0",X"0C",X"E6",X"1F",X"23",X"F5",X"CD",X"B0",X"0C",X"47",X"23",X"CD", + X"B0",X"0C",X"4F",X"F1",X"23",X"E5",X"F5",X"07",X"16",X"00",X"5F",X"21",X"08",X"4D",X"19",X"97", + X"BE",X"28",X"06",X"35",X"F1",X"D1",X"C3",X"6A",X"07",X"78",X"E6",X"E0",X"07",X"07",X"07",X"07", + X"16",X"00",X"5F",X"21",X"BC",X"4C",X"19",X"5E",X"23",X"56",X"F1",X"E5",X"07",X"D5",X"16",X"00", + X"5F",X"21",X"08",X"4D",X"19",X"D1",X"1A",X"77",X"13",X"78",X"E6",X"1F",X"32",X"48",X"4D",X"79", + X"07",X"D5",X"16",X"00",X"5F",X"21",X"08",X"4D",X"19",X"D1",X"1A",X"13",X"47",X"79",X"CD",X"20", + X"09",X"0C",X"70",X"23",X"36",X"00",X"23",X"3A",X"48",X"4D",X"3D",X"32",X"48",X"4D",X"20",X"EA", + X"E1",X"72",X"2B",X"73",X"D1",X"C3",X"6A",X"07",X"E1",X"C3",X"9A",X"07",X"D1",X"13",X"E1",X"73", + X"23",X"72",X"C3",X"9A",X"07",X"E1",X"E1",X"3A",X"49",X"4D",X"07",X"07",X"16",X"00",X"5F",X"21", + X"B0",X"4C",X"19",X"46",X"23",X"4E",X"79",X"07",X"16",X"00",X"5F",X"21",X"C9",X"4C",X"19",X"7E", + X"FE",X"00",X"28",X"10",X"57",X"2B",X"5E",X"97",X"77",X"23",X"77",X"3A",X"49",X"4D",X"CD",X"D8", + X"09",X"C3",X"9A",X"07",X"3A",X"49",X"4D",X"F5",X"3C",X"47",X"07",X"80",X"F5",X"06",X"00",X"CD", + X"20",X"09",X"21",X"08",X"4D",X"F1",X"07",X"5F",X"16",X"00",X"19",X"72",X"23",X"72",X"F1",X"07", + X"07",X"5F",X"21",X"B0",X"4C",X"19",X"36",X"00",X"C3",X"9A",X"07",X"78",X"32",X"4F",X"50",X"C9", + X"FE",X"1B",X"28",X"F7",X"FE",X"0A",X"D0",X"F5",X"C5",X"E5",X"D5",X"11",X"66",X"09",X"07",X"83", + X"5F",X"7A",X"CE",X"00",X"57",X"1A",X"67",X"13",X"1A",X"6F",X"97",X"D1",X"E9",X"C6",X"05",X"C6", + X"05",X"3C",X"C6",X"04",X"26",X"50",X"C6",X"50",X"6F",X"70",X"18",X"16",X"C6",X"02",X"C6",X"03", + X"C6",X"02",X"C6",X"04",X"C6",X"02",X"26",X"50",X"C6",X"50",X"6F",X"78",X"CD",X"4B",X"02",X"71", + X"23",X"70",X"E1",X"C1",X"F1",X"C9",X"09",X"56",X"09",X"54",X"09",X"42",X"09",X"41",X"09",X"52", + X"09",X"50",X"09",X"3F",X"09",X"4E",X"09",X"4C",X"09",X"3D",X"F5",X"C5",X"D5",X"E5",X"F5",X"3A", + X"14",X"4C",X"FE",X"01",X"20",X"0A",X"3A",X"15",X"4C",X"FE",X"01",X"28",X"03",X"F1",X"18",X"43", + X"F1",X"32",X"4A",X"4D",X"4F",X"07",X"07",X"16",X"00",X"5F",X"21",X"EB",X"09",X"19",X"E5",X"23", + X"23",X"46",X"23",X"7E",X"C5",X"E5",X"07",X"07",X"16",X"00",X"5F",X"21",X"B0",X"4C",X"19",X"7E", + X"B8",X"38",X"07",X"20",X"09",X"23",X"7E",X"B9",X"28",X"04",X"3E",X"01",X"18",X"01",X"97",X"E1", + X"C1",X"A7",X"E1",X"28",X"0E",X"5E",X"23",X"56",X"23",X"23",X"7E",X"CD",X"D8",X"09",X"3E",X"01", + X"32",X"01",X"50",X"E1",X"D1",X"C1",X"F1",X"C9",X"D5",X"07",X"07",X"16",X"00",X"5F",X"21",X"B0", + X"4C",X"19",X"70",X"23",X"71",X"23",X"D1",X"73",X"23",X"72",X"C9",X"4B",X"0A",X"02",X"00",X"5B", + X"0A",X"02",X"00",X"6B",X"0A",X"01",X"01",X"8C",X"0A",X"03",X"01",X"9C",X"0A",X"02",X"00",X"49", + X"10",X"01",X"00",X"78",X"0C",X"01",X"00",X"09",X"0B",X"02",X"00",X"29",X"0B",X"02",X"00",X"E9", + X"0A",X"02",X"00",X"79",X"0A",X"02",X"00",X"49",X"0B",X"01",X"00",X"86",X"0B",X"04",X"00",X"A0", + X"0B",X"04",X"00",X"BA",X"0B",X"03",X"01",X"12",X"0C",X"03",X"00",X"F9",X"0B",X"01",X"00",X"27", + X"0C",X"01",X"00",X"5E",X"0C",X"04",X"01",X"D6",X"0B",X"03",X"00",X"CD",X"0A",X"03",X"00",X"94", + X"0C",X"01",X"02",X"B5",X"0A",X"03",X"01",X"CD",X"0A",X"03",X"00",X"03",X"07",X"00",X"05",X"01", + X"01",X"02",X"01",X"40",X"00",X"01",X"60",X"BF",X"53",X"0A",X"0A",X"03",X"07",X"00",X"BF",X"01", + X"01",X"02",X"01",X"40",X"00",X"FF",X"60",X"05",X"63",X"0A",X"E0",X"06",X"0F",X"04",X"FF",X"05", + X"10",X"46",X"80",X"FF",X"66",X"00",X"71",X"0A",X"E0",X"03",X"09",X"00",X"00",X"01",X"0D",X"02", + X"0A",X"43",X"80",X"FF",X"40",X"00",X"02",X"63",X"00",X"81",X"0A",X"E0",X"06",X"0F",X"04",X"0F", + X"05",X"07",X"11",X"06",X"51",X"00",X"FF",X"71",X"00",X"94",X"0A",X"E0",X"03",X"07",X"10",X"03", + X"01",X"04",X"02",X"00",X"00",X"28",X"40",X"00",X"FB",X"60",X"0A",X"A6",X"0A",X"50",X"00",X"FF", + X"70",X"00",X"A4",X"0A",X"E0",X"06",X"0F",X"11",X"03",X"04",X"08",X"05",X"02",X"04",X"28",X"44", + X"80",X"FF",X"45",X"80",X"00",X"64",X"0A",X"BF",X"0A",X"45",X"84",X"7B",X"E0",X"03",X"07",X"10", + X"01",X"01",X"08",X"02",X"00",X"00",X"28",X"40",X"00",X"FB",X"41",X"C0",X"FF",X"60",X"0A",X"D7", + X"0A",X"50",X"00",X"FF",X"70",X"00",X"51",X"8E",X"E0",X"03",X"02",X"00",X"18",X"01",X"05",X"02", + X"00",X"10",X"02",X"43",X"00",X"02",X"41",X"00",X"FF",X"63",X"0A",X"F3",X"0A",X"03",X"04",X"00", + X"18",X"50",X"00",X"FF",X"70",X"00",X"F3",X"0A",X"E0",X"03",X"08",X"00",X"18",X"01",X"02",X"02", + X"00",X"10",X"01",X"43",X"80",X"00",X"41",X"80",X"00",X"63",X"10",X"13",X"0B",X"03",X"08",X"00", + X"18",X"50",X"00",X"FF",X"70",X"00",X"07",X"8F",X"E0",X"03",X"08",X"00",X"18",X"01",X"28",X"02", + X"00",X"10",X"01",X"43",X"80",X"00",X"41",X"80",X"7B",X"63",X"10",X"33",X"0B",X"03",X"08",X"00", + X"18",X"50",X"00",X"FF",X"70",X"00",X"27",X"8F",X"E0",X"03",X"07",X"00",X"00",X"01",X"08",X"02", + X"00",X"04",X"04",X"05",X"00",X"06",X"07",X"07",X"0F",X"08",X"00",X"09",X"07",X"10",X"7F",X"40", + X"00",X"08",X"44",X"00",X"04",X"47",X"00",X"FD",X"50",X"00",X"FF",X"70",X"00",X"5F",X"0B",X"40", + X"7F",X"41",X"00",X"FC",X"45",X"00",X"F8",X"48",X"00",X"04",X"50",X"00",X"FF",X"70",X"00",X"71", + X"0B",X"06",X"00",X"09",X"00",X"E0",X"03",X"0A",X"02",X"00",X"20",X"05",X"0F",X"16",X"15",X"13", + X"00",X"93",X"02",X"00",X"73",X"00",X"91",X"0B",X"56",X"00",X"FF",X"76",X"00",X"91",X"0B",X"E0", + X"03",X"0A",X"02",X"00",X"20",X"9B",X"0F",X"16",X"3A",X"13",X"00",X"93",X"02",X"00",X"73",X"00", + X"AB",X"0B",X"56",X"00",X"FF",X"76",X"00",X"AB",X"0B",X"E0",X"06",X"0F",X"04",X"10",X"05",X"01", + X"11",X"04",X"14",X"10",X"44",X"00",X"04",X"54",X"00",X"FE",X"74",X"00",X"C4",X"0B",X"51",X"00", + X"FE",X"71",X"00",X"C2",X"0B",X"E0",X"01",X"00",X"02",X"00",X"10",X"05",X"03",X"0B",X"00",X"F0", + X"40",X"00",X"E0",X"60",X"50",X"E0",X"0B",X"40",X"00",X"10",X"60",X"A0",X"E7",X"0B",X"41",X"00", + X"01",X"50",X"00",X"FF",X"70",X"00",X"DE",X"0B",X"E0",X"00",X"7F",X"01",X"00",X"02",X"00",X"03", + X"03",X"10",X"05",X"50",X"00",X"FF",X"70",X"00",X"03",X"0C",X"43",X"00",X"01",X"63",X"0A",X"0A", + X"0C",X"E0",X"00",X"1C",X"01",X"00",X"02",X"00",X"03",X"0F",X"10",X"0C",X"50",X"00",X"FF",X"40", + X"00",X"68",X"70",X"00",X"1C",X"0C",X"E0",X"03",X"08",X"00",X"18",X"01",X"0A",X"02",X"00",X"10", + X"03",X"43",X"00",X"02",X"41",X"80",X"FF",X"63",X"10",X"31",X"0C",X"03",X"08",X"00",X"18",X"50", + X"00",X"FF",X"70",X"00",X"31",X"0C",X"03",X"0A",X"20",X"44",X"0F",X"16",X"1D",X"13",X"00",X"93", + X"02",X"00",X"73",X"00",X"4F",X"0C",X"56",X"00",X"FF",X"76",X"00",X"4F",X"0C",X"E0",X"06",X"0A", + X"05",X"00",X"21",X"A5",X"0E",X"17",X"20",X"14",X"00",X"94",X"22",X"04",X"74",X"00",X"69",X"0C", + X"57",X"00",X"FF",X"77",X"00",X"69",X"0C",X"E0",X"03",X"0A",X"10",X"04",X"01",X"00",X"02",X"00", + X"00",X"0A",X"40",X"00",X"05",X"41",X"80",X"00",X"60",X"5A",X"82",X"0C",X"50",X"00",X"FF",X"70", + X"00",X"80",X"0C",X"E0",X"09",X"01",X"08",X"00",X"1B",X"03",X"22",X"B9",X"0C",X"18",X"78",X"15", + X"00",X"95",X"42",X"07",X"75",X"00",X"A1",X"0C",X"58",X"00",X"FF",X"78",X"00",X"A1",X"0C",X"E0", + X"D5",X"DB",X"64",X"5E",X"DB",X"6B",X"7B",X"D1",X"C9",X"03",X"96",X"01",X"03",X"00",X"00",X"03", + X"6A",X"01",X"03",X"00",X"00",X"03",X"60",X"02",X"03",X"00",X"00",X"03",X"AC",X"02",X"03",X"00", + X"00",X"03",X"80",X"01",X"03",X"00",X"00",X"03",X"AE",X"01",X"03",X"00",X"00",X"03",X"C8",X"01", + X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"C8",X"01",X"03",X"00",X"00",X"03", + X"E0",X"01",X"03",X"00",X"00",X"03",X"20",X"02",X"03",X"00",X"00",X"03",X"58",X"05",X"03",X"00", + X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00", + X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03", + X"B5",X"00",X"03",X"00",X"00",X"03",X"B5",X"00",X"03",X"00",X"00",X"03",X"B5",X"00",X"03",X"00", + X"00",X"03",X"C0",X"00",X"03",X"00",X"00",X"03",X"B5",X"00",X"03",X"B5",X"00",X"03",X"B5",X"00", + X"03",X"B5",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03", + X"10",X"01",X"03",X"00",X"00",X"03",X"10",X"01",X"03",X"00",X"00",X"03",X"10",X"01",X"03",X"00", + X"00",X"03",X"1E",X"01",X"03",X"00",X"00",X"03",X"10",X"01",X"03",X"10",X"01",X"03",X"10",X"01", + X"03",X"10",X"01",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"30",X"01",X"03",X"00",X"00",X"03", + X"56",X"01",X"03",X"00",X"00",X"03",X"C0",X"00",X"03",X"00",X"00",X"03",X"CB",X"00",X"03",X"00", + X"00",X"03",X"30",X"01",X"03",X"00",X"00",X"03",X"56",X"01",X"03",X"00",X"00",X"03",X"C0",X"00", + X"03",X"00",X"00",X"03",X"CB",X"00",X"03",X"00",X"00",X"03",X"2C",X"03",X"03",X"2C",X"03",X"03", + X"2C",X"03",X"03",X"00",X"00",X"03",X"90",X"03",X"33",X"00",X"00",X"03",X"00",X"03",X"03",X"00", + X"03",X"03",X"00",X"03",X"03",X"00",X"00",X"03",X"2C",X"03",X"03",X"00",X"00",X"03",X"D4",X"02", + X"03",X"00",X"00",X"03",X"2C",X"03",X"03",X"00",X"00",X"03",X"D4",X"02",X"03",X"00",X"00",X"03", + X"2C",X"03",X"03",X"00",X"00",X"03",X"D4",X"02",X"03",X"D4",X"02",X"03",X"5C",X"03",X"03",X"58", + X"05",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"30",X"01",X"03",X"00",X"00",X"03",X"56",X"01", + X"03",X"00",X"00",X"03",X"B5",X"00",X"03",X"00",X"00",X"03",X"B5",X"00",X"03",X"00",X"00",X"03", + X"B5",X"00",X"03",X"00",X"00",X"03",X"56",X"01",X"03",X"00",X"00",X"03",X"30",X"01",X"03",X"00", + X"00",X"32",X"00",X"00",X"02",X"E8",X"01",X"01",X"00",X"00",X"02",X"83",X"01",X"01",X"00",X"00", + X"02",X"45",X"01",X"01",X"00",X"00",X"06",X"7A",X"00",X"06",X"00",X"00",X"04",X"91",X"00",X"02", + X"00",X"00",X"0A",X"7A",X"00",X"12",X"00",X"00",X"03",X"23",X"01",X"01",X"00",X"00",X"03",X"00", + X"01",X"01",X"00",X"00",X"05",X"3C",X"00",X"01",X"00",X"00",X"05",X"78",X"00",X"01",X"00",X"00", + X"05",X"55",X"00",X"01",X"00",X"00",X"05",X"C8",X"00",X"01",X"00",X"00",X"03",X"4B",X"01",X"01", + X"00",X"00",X"03",X"78",X"00",X"01",X"00",X"00",X"03",X"55",X"00",X"01",X"00",X"00",X"02",X"C3", + X"00",X"01",X"00",X"00",X"02",X"41",X"00",X"02",X"00",X"00",X"03",X"3C",X"00",X"02",X"00",X"00", + X"02",X"37",X"00",X"02",X"00",X"00",X"02",X"32",X"00",X"02",X"00",X"00",X"02",X"2F",X"00",X"02", + X"00",X"00",X"03",X"2C",X"00",X"04",X"81",X"00",X"03",X"00",X"00",X"04",X"34",X"01",X"03",X"00", + X"00",X"02",X"B0",X"02",X"02",X"0E",X"03",X"01",X"00",X"00",X"02",X"A1",X"03",X"01",X"00",X"00", + X"04",X"A9",X"03",X"02",X"00",X"00",X"02",X"00",X"01",X"02",X"00",X"00",X"02",X"F3",X"02",X"03", + X"00",X"00",X"02",X"CD",X"00",X"03",X"00",X"00",X"01",X"B7",X"00",X"03",X"00",X"00",X"05",X"6A", + X"00",X"02",X"00",X"00",X"03",X"93",X"00",X"03",X"00",X"00",X"03",X"52",X"00",X"02",X"00",X"00", + X"03",X"32",X"00",X"02",X"00",X"00",X"03",X"2B",X"00",X"02",X"00",X"00",X"03",X"32",X"00",X"02", + X"00",X"00",X"08",X"64",X"00",X"07",X"7F",X"01",X"01",X"00",X"00",X"02",X"32",X"02",X"02",X"64", + X"02",X"02",X"96",X"02",X"01",X"00",X"00",X"01",X"C8",X"06",X"01",X"00",X"00",X"01",X"C8",X"06", + X"01",X"00",X"00",X"01",X"C8",X"06",X"01",X"00",X"00",X"01",X"C8",X"06",X"01",X"00",X"00",X"01", + X"C8",X"06",X"01",X"00",X"00",X"01",X"C8",X"06",X"01",X"00",X"00",X"01",X"C8",X"06",X"01",X"00", + X"00",X"03",X"00",X"05",X"03",X"F0",X"00",X"01",X"00",X"00",X"02",X"1E",X"01",X"01",X"00",X"00", + X"02",X"1E",X"02",X"01",X"00",X"00",X"02",X"1E",X"03",X"01",X"00",X"00",X"02",X"1E",X"04",X"01", + X"00",X"00",X"02",X"1E",X"05",X"01",X"00",X"00",X"02",X"1E",X"06",X"01",X"00",X"00",X"05",X"1E", + X"07",X"01",X"00",X"00",X"02",X"1E",X"06",X"01",X"00",X"00",X"02",X"1E",X"05",X"01",X"00",X"00", + X"02",X"1E",X"04",X"01",X"00",X"00",X"02",X"1E",X"03",X"01",X"00",X"00",X"02",X"1E",X"02",X"01", + X"00",X"00",X"02",X"1E",X"01",X"01",X"00",X"00",X"05",X"64",X"00",X"01",X"96",X"03",X"04",X"00", + X"00",X"01",X"C8",X"03",X"04",X"00",X"00",X"01",X"64",X"03",X"04",X"00",X"00",X"01",X"96",X"02", + X"04",X"00",X"00",X"01",X"C8",X"02",X"04",X"00",X"00",X"01",X"64",X"02",X"04",X"00",X"00",X"01", + X"96",X"01",X"04",X"00",X"00",X"01",X"C8",X"01",X"04",X"00",X"00",X"01",X"64",X"01",X"04",X"00", + X"00",X"01",X"96",X"00",X"04",X"00",X"00",X"01",X"C8",X"00",X"04",X"00",X"00",X"01",X"64",X"00", + X"04",X"00",X"00",X"01",X"78",X"01",X"03",X"00",X"00",X"01",X"A0",X"01",X"03",X"00",X"00",X"01", + X"4B",X"01",X"03",X"00",X"00",X"01",X"78",X"00",X"03",X"00",X"00",X"01",X"A0",X"00",X"03",X"00", + X"00",X"01",X"4B",X"00",X"01",X"5A",X"01",X"02",X"00",X"00",X"01",X"78",X"01",X"02",X"00",X"00", + X"01",X"32",X"01",X"02",X"00",X"00",X"01",X"5A",X"00",X"02",X"00",X"00",X"01",X"78",X"00",X"02", + X"00",X"00",X"01",X"32",X"00",X"02",X"00",X"00",X"01",X"3C",X"01",X"01",X"00",X"00",X"01",X"50", + X"01",X"01",X"00",X"01",X"1E",X"01",X"01",X"00",X"00",X"01",X"3C",X"00",X"01",X"00",X"00",X"01", + X"50",X"00",X"01",X"00",X"00",X"01",X"1E",X"00",X"00",X"03",X"07",X"00",X"05",X"01",X"00",X"02", + X"00",X"40",X"80",X"00",X"60",X"BF",X"51",X"10",X"E0",X"CD",X"ED",X"06",X"3E",X"01",X"32",X"AC", + X"4C",X"32",X"00",X"50",X"32",X"4B",X"4D",X"CD",X"5E",X"02",X"FB",X"06",X"01",X"97",X"32",X"14", + X"4C",X"C5",X"CD",X"B4",X"02",X"CD",X"12",X"06",X"11",X"A9",X"97",X"42",X"A7",X"10",X"1E",X"F6", + X"42",X"B6",X"10",X"27",X"D6",X"42",X"E0",X"10",X"39",X"F6",X"42",X"05",X"11",X"30",X"57",X"42", + X"42",X"11",X"28",X"57",X"42",X"4C",X"11",X"3C",X"57",X"42",X"57",X"11",X"50",X"57",X"42",X"61", + X"11",X"4A",X"57",X"42",X"6C",X"11",X"FF",X"20",X"20",X"53",X"55",X"50",X"45",X"52",X"20",X"20", + X"47",X"4C",X"4F",X"42",X"FF",X"FF",X"41",X"4C",X"4C",X"45",X"20",X"46",X"52",X"55",X"45",X"43", + X"48",X"54",X"45",X"20",X"53",X"55",X"43",X"48",X"45",X"4E",X"FF",X"FE",X"5A",X"55",X"4D",X"20", + X"4E",X"41",X"45",X"43",X"48",X"53",X"54",X"45",X"4E",X"20",X"42",X"49",X"4C",X"44",X"FF",X"FF", + X"54",X"41",X"53",X"54",X"45",X"20",X"52",X"55",X"46",X"54",X"20",X"4C",X"49",X"46",X"54",X"20", + X"FF",X"FE",X"48",X"45",X"42",X"45",X"4C",X"3E",X"4F",X"42",X"45",X"4E",X"20",X"55",X"4E",X"54", + X"45",X"4E",X"20",X"FF",X"FF",X"4D",X"49",X"54",X"20",X"44",X"45",X"52",X"20",X"54",X"41",X"53", + X"54",X"45",X"20",X"20",X"20",X"20",X"20",X"20",X"FF",X"FE",X"41",X"55",X"46",X"20",X"44",X"49", + X"45",X"20",X"56",X"45",X"52",X"46",X"4F",X"4C",X"47",X"45",X"52",X"20",X"20",X"FF",X"FE",X"53", + X"50",X"52",X"49",X"4E",X"47",X"45",X"4E",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"FF",X"FF",X"2E",X"2E",X"2E",X"47",X"41",X"54",X"4F",X"52",X"FF",X"FF",X"2E",X"2E",X"2E",X"46", + X"52",X"4F",X"47",X"47",X"59",X"FF",X"FF",X"2E",X"2E",X"2E",X"42",X"55",X"4E",X"4E",X"59",X"FF", + X"FF",X"2E",X"2E",X"2E",X"4D",X"4F",X"4E",X"4B",X"45",X"59",X"FF",X"FF",X"2E",X"2E",X"2E",X"50", + X"4F",X"52",X"4B",X"45",X"52",X"FF",X"FF",X"F5",X"D5",X"E5",X"21",X"D7",X"4E",X"35",X"20",X"11", + X"36",X"05",X"2B",X"35",X"28",X"09",X"21",X"DC",X"46",X"7E",X"EE",X"0D",X"77",X"18",X"02",X"36", + X"01",X"21",X"33",X"4C",X"97",X"BE",X"28",X"03",X"35",X"18",X"2E",X"21",X"32",X"4C",X"97",X"34", + X"CB",X"46",X"28",X"02",X"3E",X"03",X"32",X"02",X"4C",X"2A",X"34",X"4C",X"5E",X"23",X"56",X"23", + X"D5",X"5E",X"23",X"56",X"23",X"3A",X"02",X"4C",X"A7",X"7E",X"20",X"06",X"23",X"22",X"34",X"4C", + X"3E",X"05",X"32",X"33",X"4C",X"E1",X"CD",X"6B",X"04",X"E1",X"D1",X"F1",X"C9",X"06",X"97",X"34", + X"CB",X"46",X"28",X"02",X"3E",X"03",X"32",X"02",X"4C",X"2A",X"34",X"4C",X"5E",X"23",X"56",X"23", + X"D5",X"5E",X"23",X"56",X"23",X"3A",X"02",X"4C",X"A7",X"7E",X"20",X"06",X"23",X"22",X"34",X"4C", + X"3E",X"05",X"32",X"33",X"4C",X"E1",X"CD",X"6B",X"04",X"E1",X"D1",X"F1",X"C9",X"06",X"8B",X"B0", + X"E5",X"D5",X"C5",X"4F",X"21",X"80",X"14",X"46",X"04",X"05",X"28",X"0E",X"23",X"5E",X"23",X"56", + X"23",X"DD",X"1A",X"86",X"23",X"BE",X"20",X"16",X"10",X"F2",X"AF",X"ED",X"47",X"79",X"C1",X"D1", + X"E1",X"C3",X"7F",X"3B",X"45",X"FF",X"06",X"20",X"54",X"49",X"48",X"FF",X"FF",X"F5",X"C5",X"97", + X"CD",X"B4",X"02",X"3E",X"06",X"CD",X"1A",X"03",X"CD",X"12",X"06",X"11",X"E5",X"12",X"21",X"A6", + X"42",X"CD",X"6B",X"04",X"11",X"13",X"12",X"21",X"07",X"40",X"CD",X"65",X"04",X"11",X"F6",X"12", + X"21",X"90",X"43",X"CD",X"65",X"04",X"11",X"00",X"13",X"21",X"70",X"42",X"CD",X"6B",X"04",X"11", + X"14",X"13",X"21",X"B2",X"42",X"CD",X"6B",X"04",X"11",X"3A",X"13",X"21",X"B5",X"42",X"CD",X"6B", + X"04",X"3A",X"40",X"50",X"E6",X"80",X"21",X"CC",X"42",X"11",X"58",X"13",X"28",X"03",X"11",X"69", + X"13",X"CD",X"6B",X"04",X"32",X"C0",X"50",X"3A",X"80",X"50",X"E6",X"3F",X"4F",X"21",X"50",X"43", + X"06",X"06",X"0F",X"11",X"4E",X"13",X"30",X"03",X"11",X"53",X"13",X"E5",X"CD",X"6B",X"04",X"E1", + X"23",X"10",X"EF",X"79",X"E6",X"03",X"EE",X"03",X"C6",X"33",X"32",X"B0",X"42",X"79",X"E6",X"1C", + X"EE",X"1C",X"0F",X"0F",X"4F",X"C6",X"31",X"32",X"92",X"40",X"0C",X"41",X"21",X"33",X"42",X"36", + X"1E",X"21",X"13",X"42",X"11",X"E0",X"FF",X"3E",X"16",X"CD",X"57",X"04",X"3E",X"08",X"91",X"28", + X"06",X"47",X"3E",X"17",X"CD",X"57",X"04",X"36",X"1F",X"3A",X"40",X"50",X"CB",X"77",X"20",X"91", + X"C1",X"F1",X"C3",X"6D",X"10",X"FF",X"09",X"43",X"4F",X"4E",X"46",X"49",X"47",X"55",X"52",X"41", + X"54",X"49",X"4F",X"4E",X"FF",X"FF",X"FF",X"04",X"31",X"32",X"33",X"34",X"35",X"36",X"FF",X"FF", + X"FF",X"06",X"47",X"4C",X"4F",X"42",X"53",X"20",X"50",X"45",X"52",X"20",X"43",X"52",X"45",X"44", + X"49",X"54",X"FF",X"FF",X"44",X"49",X"46",X"46",X"49",X"43",X"55",X"4C",X"54",X"59",X"20",X"4C", + X"45",X"56",X"45",X"4C",X"FF",X"FE",X"45",X"41",X"53",X"59",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"48",X"41",X"52",X"44",X"FF",X"FF",X"41",X"54",X"54",X"52",X"41",X"43", + X"54",X"20",X"4D",X"4F",X"44",X"45",X"20",X"53",X"4F",X"55",X"4E",X"44",X"FF",X"FF",X"4F",X"4E", + X"20",X"FF",X"FF",X"4F",X"46",X"46",X"FF",X"FF",X"FF",X"0E",X"20",X"54",X"41",X"42",X"4C",X"45", + X"20",X"4D",X"4F",X"44",X"45",X"4C",X"20",X"FF",X"FF",X"FF",X"0E",X"55",X"50",X"52",X"49",X"47", + X"48",X"54",X"20",X"4D",X"4F",X"44",X"45",X"4C",X"FF",X"FF",X"F5",X"C5",X"97",X"CD",X"B4",X"02", + X"CD",X"12",X"06",X"11",X"F1",X"13",X"21",X"86",X"42",X"CD",X"6B",X"04",X"21",X"00",X"40",X"11", + X"AD",X"4C",X"CD",X"39",X"14",X"21",X"00",X"44",X"13",X"CD",X"39",X"14",X"21",X"00",X"4C",X"13", + X"CD",X"39",X"14",X"01",X"AD",X"4C",X"3E",X"03",X"21",X"70",X"43",X"11",X"01",X"14",X"F5",X"E5", + X"CD",X"6B",X"04",X"D5",X"11",X"1F",X"14",X"0A",X"E6",X"0F",X"28",X"03",X"11",X"2C",X"14",X"CD", + X"6B",X"04",X"11",X"40",X"FF",X"19",X"D1",X"CD",X"6B",X"04",X"D5",X"11",X"1F",X"14",X"0A",X"E6", + X"F0",X"28",X"03",X"11",X"2C",X"14",X"CD",X"6B",X"04",X"D1",X"E1",X"23",X"23",X"F1",X"03",X"3D", + X"20",X"CC",X"11",X"13",X"12",X"21",X"07",X"40",X"CD",X"65",X"04",X"CD",X"FB",X"11",X"C1",X"F1", + X"C9",X"FF",X"09",X"53",X"54",X"41",X"54",X"49",X"43",X"20",X"52",X"41",X"4D",X"FF",X"06",X"FF", + X"FF",X"34",X"4B",X"20",X"FF",X"FF",X"34",X"4E",X"20",X"FF",X"FF",X"34",X"4C",X"20",X"FF",X"FF", + X"34",X"50",X"20",X"FF",X"FF",X"34",X"4D",X"20",X"FF",X"FF",X"34",X"52",X"20",X"FF",X"FF",X"FF", + X"0E",X"4F",X"4B",X"20",X"20",X"20",X"20",X"20",X"FF",X"06",X"FF",X"FF",X"FF",X"FF",X"4E",X"4F", + X"54",X"20",X"4F",X"4B",X"20",X"FF",X"06",X"FF",X"FF",X"97",X"01",X"04",X"00",X"E5",X"C5",X"F5", + X"4E",X"77",X"AE",X"EB",X"B6",X"77",X"EB",X"71",X"F1",X"23",X"10",X"F3",X"C1",X"0D",X"20",X"EE", + X"E1",X"3D",X"FE",X"FE",X"20",X"E4",X"C9",X"F5",X"C5",X"97",X"CD",X"B4",X"02",X"CD",X"12",X"06", + X"11",X"A4",X"14",X"21",X"86",X"42",X"CD",X"6B",X"04",X"21",X"00",X"20",X"01",X"1F",X"FE",X"CD", + X"C1",X"14",X"F5",X"21",X"00",X"00",X"01",X"20",X"00",X"CD",X"C1",X"14",X"01",X"FE",X"3F",X"11", + X"09",X"00",X"3F",X"00",X"00",X"40",X"3F",X"00",X"00",X"80",X"3F",X"00",X"00",X"C0",X"3F",X"00", + X"00",X"80",X"3F",X"00",X"00",X"40",X"3F",X"00",X"00",X"C0",X"3F",X"00",X"00",X"C0",X"3F",X"00", + X"00",X"40",X"3F",X"00",X"00",X"FF",X"45",X"50",X"52",X"4F",X"4D",X"20",X"43",X"48",X"45",X"43", + X"4B",X"FF",X"FF",X"FF",X"FF",X"55",X"32",X"20",X"FF",X"FF",X"FF",X"FF",X"CC",X"33",X"20",X"FF", + X"FF",X"97",X"86",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"C9",X"F5",X"CD",X"6B",X"04",X"0A",X"C1", + X"11",X"1F",X"14",X"B8",X"28",X"04",X"11",X"2C",X"14",X"78",X"F5",X"CD",X"6B",X"04",X"3E",X"0B", + X"32",X"02",X"4C",X"F1",X"CD",X"35",X"04",X"C9",X"F5",X"C5",X"97",X"32",X"3B",X"4C",X"32",X"A7", + X"4C",X"CD",X"E9",X"05",X"3E",X"06",X"CD",X"1A",X"03",X"3E",X"13",X"CD",X"15",X"03",X"06",X"1E", + X"CD",X"72",X"03",X"CD",X"FB",X"11",X"C1",X"F1",X"C3",X"6D",X"10",X"F5",X"C5",X"97",X"32",X"08", + X"4C",X"11",X"AB",X"4C",X"21",X"AA",X"4C",X"3C",X"12",X"77",X"97",X"D5",X"E5",X"CD",X"B4",X"02", + X"CD",X"12",X"06",X"11",X"06",X"16",X"21",X"86",X"42",X"CD",X"6B",X"04",X"11",X"15",X"16",X"21", + X"8A",X"43",X"CD",X"6B",X"04",X"11",X"70",X"16",X"21",X"D5",X"42",X"CD",X"6B",X"04",X"11",X"13", + X"12",X"21",X"07",X"40",X"CD",X"65",X"04",X"E1",X"D1",X"1A",X"E5",X"21",X"95",X"41",X"CD",X"F3", + X"03",X"E1",X"06",X"70",X"CD",X"65",X"03",X"32",X"C0",X"50",X"3A",X"40",X"50",X"CB",X"77",X"CA", + X"01",X"16",X"CB",X"6F",X"28",X"2C",X"3A",X"00",X"50",X"CB",X"47",X"28",X"06",X"CB",X"5F",X"28", + X"11",X"18",X"E4",X"34",X"1A",X"C6",X"01",X"27",X"FE",X"25",X"20",X"03",X"3E",X"01",X"77",X"12", + X"18",X"C7",X"35",X"1A",X"D6",X"01",X"27",X"A7",X"20",X"05",X"3E",X"18",X"77",X"3E",X"24",X"12", + X"18",X"B7",X"1A",X"32",X"4D",X"4D",X"7E",X"32",X"4C",X"4D",X"00",X"FE",X"01",X"28",X"18",X"3D", + X"47",X"3A",X"80",X"50",X"E6",X"1C",X"EE",X"1C",X"0F",X"0F",X"3C",X"4F",X"3E",X"01",X"81",X"10", + X"FD",X"FE",X"10",X"38",X"02",X"3E",X"0F",X"32",X"4E",X"4D",X"97",X"32",X"A5",X"4E",X"32",X"16", + X"4C",X"32",X"14",X"4C",X"3C",X"32",X"BB",X"4D",X"32",X"3C",X"4C",X"32",X"37",X"4C",X"D5",X"E5", + X"CD",X"C3",X"27",X"CD",X"E9",X"05",X"11",X"13",X"12",X"21",X"07",X"40",X"CD",X"65",X"04",X"11", + X"7D",X"16",X"21",X"28",X"40",X"CD",X"65",X"04",X"32",X"C0",X"50",X"3A",X"40",X"50",X"CB",X"77", + X"28",X"0A",X"CB",X"6F",X"20",X"F2",X"CD",X"6E",X"06",X"CD",X"B0",X"2E",X"E1",X"D1",X"C3",X"1A", + X"15",X"C1",X"F1",X"C3",X"6D",X"10",X"FF",X"09",X"4C",X"45",X"56",X"45",X"4C",X"20",X"43",X"48", + X"45",X"43",X"4B",X"FF",X"FF",X"FF",X"06",X"4D",X"4F",X"56",X"45",X"20",X"4A",X"4F",X"59",X"53", + X"54",X"49",X"43",X"4B",X"20",X"FF",X"0D",X"55",X"50",X"20",X"FF",X"06",X"4F",X"52",X"20",X"FF", + X"08",X"44",X"4F",X"57",X"4E",X"FF",X"06",X"FF",X"FE",X"54",X"4F",X"20",X"53",X"45",X"4C",X"45", + X"43",X"54",X"20",X"4C",X"45",X"56",X"45",X"4C",X"20",X"4E",X"55",X"4D",X"42",X"45",X"52",X"2E", + X"FF",X"FE",X"48",X"49",X"54",X"20",X"FF",X"0E",X"43",X"41",X"4C",X"4C",X"20",X"FF",X"06",X"54", + X"4F",X"20",X"53",X"45",X"54",X"55",X"50",X"20",X"4C",X"45",X"56",X"45",X"4C",X"2E",X"FF",X"FF", + X"FF",X"07",X"4C",X"45",X"56",X"45",X"4C",X"20",X"4E",X"4F",X"3A",X"FF",X"FF",X"FF",X"06",X"59", + X"41",X"4C",X"50",X"20",X"4F",X"54",X"FF",X"0E",X"20",X"4C",X"4C",X"41",X"43",X"FF",X"06",X"20", + X"54",X"49",X"48",X"FF",X"FF",X"F5",X"C5",X"CD",X"ED",X"06",X"97",X"32",X"14",X"4C",X"CD",X"B4", + X"02",X"CD",X"12",X"06",X"32",X"08",X"4C",X"11",X"AB",X"4C",X"21",X"AA",X"4C",X"12",X"77",X"D5", + X"E5",X"11",X"2D",X"17",X"21",X"86",X"42",X"CD",X"6B",X"04",X"11",X"3C",X"17",X"21",X"8A",X"43", + X"CD",X"6B",X"04",X"11",X"99",X"17",X"21",X"D5",X"42",X"CD",X"6B",X"04",X"11",X"13",X"12",X"21", + X"07",X"40",X"CD",X"65",X"04",X"E1",X"D1",X"1A",X"E5",X"21",X"95",X"41",X"CD",X"F3",X"03",X"E1", + X"06",X"70",X"CD",X"65",X"03",X"32",X"C0",X"50",X"3A",X"40",X"50",X"CB",X"77",X"28",X"36",X"CB", + X"6F",X"28",X"2C",X"3A",X"00",X"50",X"CB",X"47",X"28",X"06",X"CB",X"5F",X"28",X"10",X"18",X"E5", + X"34",X"1A",X"C6",X"01",X"27",X"FE",X"23",X"20",X"02",X"97",X"77",X"12",X"18",X"C9",X"35",X"1A", + X"D6",X"01",X"27",X"FE",X"99",X"20",X"05",X"3E",X"16",X"77",X"3E",X"22",X"12",X"18",X"B8",X"7E", + X"CD",X"7A",X"09",X"18",X"B2",X"CD",X"ED",X"06",X"C1",X"F1",X"C3",X"6D",X"10",X"FF",X"09",X"53", + X"4F",X"55",X"4E",X"44",X"20",X"43",X"48",X"45",X"43",X"4B",X"FF",X"FF",X"FF",X"06",X"4D",X"4F", + X"56",X"45",X"20",X"4A",X"4F",X"59",X"53",X"54",X"49",X"43",X"4B",X"20",X"FF",X"0D",X"55",X"50", + X"20",X"FF",X"06",X"4F",X"52",X"20",X"FF",X"08",X"44",X"4F",X"57",X"4E",X"FF",X"06",X"FF",X"FE", + X"54",X"4F",X"20",X"53",X"45",X"4C",X"45",X"43",X"54",X"20",X"53",X"4F",X"55",X"4E",X"44",X"20", + X"4E",X"55",X"4D",X"42",X"45",X"52",X"2E",X"FF",X"FE",X"48",X"49",X"54",X"20",X"FF",X"0E",X"43", + X"41",X"4C",X"4C",X"20",X"FF",X"06",X"54",X"4F",X"20",X"45",X"58",X"45",X"43",X"55",X"54",X"45", + X"20",X"53",X"4F",X"55",X"4E",X"44",X"2E",X"FF",X"FF",X"FF",X"07",X"53",X"4F",X"55",X"4E",X"44", + X"20",X"4E",X"4F",X"3A",X"FF",X"FF",X"F5",X"C5",X"97",X"CD",X"B4",X"02",X"CD",X"12",X"06",X"11", + X"44",X"18",X"21",X"86",X"42",X"CD",X"6B",X"04",X"11",X"54",X"18",X"21",X"4A",X"43",X"CD",X"6B", + X"04",X"11",X"9F",X"18",X"21",X"50",X"43",X"CD",X"6B",X"04",X"11",X"D0",X"18",X"21",X"10",X"41", + X"CD",X"6B",X"04",X"11",X"13",X"12",X"21",X"07",X"40",X"CD",X"65",X"04",X"97",X"32",X"5A",X"50", + X"06",X"04",X"11",X"40",X"18",X"21",X"56",X"50",X"1A",X"77",X"13",X"23",X"10",X"FA",X"3A",X"40", + X"50",X"5F",X"2F",X"E6",X"0F",X"4F",X"3A",X"00",X"50",X"57",X"2F",X"E6",X"0F",X"47",X"CB",X"6B", + X"20",X"02",X"CB",X"E0",X"CB",X"6A",X"20",X"02",X"CB",X"E8",X"CB",X"63",X"20",X"02",X"CB",X"E1", + X"CB",X"7A",X"20",X"02",X"CB",X"E9",X"78",X"B1",X"3E",X"0A",X"20",X"01",X"97",X"32",X"5A",X"50", + X"32",X"C0",X"50",X"78",X"21",X"50",X"47",X"CD",X"0C",X"19",X"79",X"21",X"10",X"45",X"CD",X"0C", + X"19",X"3A",X"40",X"50",X"CB",X"77",X"20",X"B6",X"CD",X"ED",X"06",X"C1",X"F1",X"C3",X"6D",X"10", + X"02",X"01",X"00",X"00",X"FF",X"09",X"42",X"55",X"54",X"54",X"4F",X"4E",X"20",X"43",X"48",X"45", + X"43",X"4B",X"FF",X"FF",X"FF",X"06",X"20",X"20",X"20",X"44",X"45",X"50",X"52",X"45",X"53",X"53", + X"45",X"44",X"20",X"42",X"55",X"54",X"54",X"4F",X"4E",X"53",X"FF",X"FE",X"20",X"20",X"20",X"41", + X"52",X"45",X"20",X"48",X"49",X"47",X"48",X"4C",X"49",X"47",X"48",X"54",X"45",X"44",X"2E",X"FF", + X"FE",X"FF",X"FE",X"FF",X"0D",X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"31",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"32",X"FF",X"FF",X"FF", + X"0C",X"55",X"50",X"FF",X"FE",X"FF",X"FE",X"4C",X"45",X"46",X"54",X"FF",X"FE",X"FF",X"FE",X"52", + X"49",X"47",X"48",X"54",X"FF",X"FE",X"FF",X"FE",X"44",X"4F",X"57",X"4E",X"FF",X"FE",X"FF",X"FE", + X"43",X"41",X"4C",X"4C",X"FF",X"FE",X"FF",X"FE",X"43",X"4F",X"49",X"4E",X"49",X"4E",X"FF",X"FF", + X"FF",X"0C",X"20",X"20",X"20",X"20",X"55",X"50",X"FF",X"FE",X"FF",X"FE",X"20",X"20",X"4C",X"45", + X"46",X"54",X"FF",X"FE",X"FF",X"FE",X"20",X"52",X"49",X"47",X"48",X"54",X"FF",X"FE",X"FF",X"FE", + X"20",X"20",X"44",X"4F",X"57",X"4E",X"FF",X"FE",X"FF",X"FE",X"20",X"20",X"43",X"41",X"4C",X"4C", + X"FF",X"FE",X"FF",X"FE",X"45",X"4E",X"45",X"52",X"47",X"59",X"FF",X"FF",X"C5",X"06",X"06",X"0F", + X"F5",X"C5",X"3E",X"0C",X"30",X"02",X"3E",X"08",X"11",X"E0",X"FF",X"06",X"06",X"CD",X"57",X"04", + X"11",X"C2",X"00",X"19",X"C1",X"F1",X"10",X"E7",X"C1",X"C9",X"D5",X"FD",X"21",X"00",X"00",X"7E", + X"16",X"00",X"5F",X"3E",X"06",X"32",X"00",X"4C",X"FD",X"19",X"2B",X"10",X"F2",X"32",X"C0",X"50", + X"0D",X"20",X"EC",X"D1",X"FD",X"19",X"FD",X"29",X"FD",X"29",X"FD",X"E5",X"E1",X"CB",X"3C",X"CB", + X"1D",X"00",X"21",X"5D",X"37",X"E9",X"CD",X"9E",X"19",X"CD",X"C6",X"1A",X"CD",X"C3",X"27",X"32", + X"C0",X"50",X"CD",X"B0",X"2E",X"3A",X"A5",X"4E",X"FE",X"01",X"28",X"05",X"CD",X"98",X"1A",X"18", + X"EB",X"CD",X"D4",X"1A",X"3A",X"3A",X"4C",X"FE",X"01",X"20",X"DE",X"CD",X"67",X"37",X"3A",X"36", + X"4C",X"A7",X"CA",X"93",X"3B",X"97",X"32",X"14",X"4C",X"3C",X"32",X"15",X"4C",X"CD",X"00",X"1A", + X"18",X"C4",X"11",X"00",X"00",X"ED",X"53",X"10",X"4C",X"ED",X"53",X"12",X"4C",X"C9",X"3A",X"80", + X"50",X"E6",X"1C",X"EE",X"1C",X"0F",X"0F",X"C6",X"02",X"32",X"92",X"4C",X"32",X"31",X"01",X"3A", + X"80",X"50",X"E6",X"03",X"EE",X"03",X"C6",X"03",X"21",X"38",X"4C",X"77",X"32",X"9F",X"4C",X"C3", + X"B0",X"27",X"3A",X"37",X"4C",X"32",X"39",X"4C",X"FE",X"01",X"28",X"04",X"7E",X"32",X"A1",X"4C", + X"F3",X"DB",X"64",X"3E",X"12",X"00",X"0F",X"47",X"DB",X"01",X"FB",X"97",X"21",X"96",X"4C",X"77", + X"23",X"10",X"FC",X"32",X"16",X"4C",X"3C",X"32",X"A0",X"4C",X"32",X"A2",X"4C",X"32",X"4C",X"4D", + X"32",X"4F",X"4D",X"32",X"4D",X"4D",X"32",X"50",X"4D",X"32",X"4E",X"4D",X"32",X"51",X"4D",X"C9", + X"21",X"36",X"4C",X"E5",X"3E",X"01",X"32",X"4B",X"4D",X"CD",X"5E",X"02",X"97",X"CD",X"BD",X"02", + X"CD",X"12",X"06",X"11",X"6D",X"1A",X"21",X"2F",X"42",X"CD",X"6B",X"04",X"E1",X"7E",X"E5",X"11", + X"7F",X"1A",X"21",X"70",X"42",X"FE",X"01",X"28",X"06",X"11",X"89",X"1A",X"21",X"B0",X"42",X"CD", + X"6B",X"04",X"E1",X"3A",X"40",X"50",X"47",X"CB",X"68",X"0E",X"01",X"28",X"0A",X"7E",X"FE",X"02", + X"38",X"16",X"CB",X"70",X"20",X"12",X"0C",X"7E",X"91",X"27",X"77",X"79",X"32",X"37",X"4C",X"32", + X"17",X"4C",X"3E",X"06",X"CD",X"7A",X"09",X"C9",X"32",X"C0",X"50",X"3A",X"03",X"4C",X"3C",X"FE", + X"0E",X"38",X"02",X"3E",X"03",X"32",X"03",X"4C",X"CD",X"E4",X"04",X"18",X"B0",X"FF",X"06",X"50", + X"52",X"45",X"53",X"53",X"FF",X"FE",X"FF",X"FE",X"53",X"54",X"41",X"52",X"54",X"FF",X"FF",X"31", + X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"FF",X"FF",X"31",X"20",X"4F",X"52",X"20",X"32",X"20", + X"50",X"4C",X"41",X"59",X"45",X"52",X"FF",X"FF",X"97",X"CD",X"BD",X"02",X"3A",X"4B",X"4D",X"01", + X"51",X"4D",X"21",X"4F",X"4D",X"FE",X"01",X"20",X"06",X"01",X"4E",X"4D",X"21",X"4C",X"4D",X"7E", + X"34",X"23",X"7E",X"C6",X"01",X"27",X"77",X"3A",X"80",X"50",X"E6",X"1C",X"EE",X"1C",X"0F",X"0F", + X"3C",X"57",X"0A",X"82",X"02",X"C9",X"21",X"9F",X"4C",X"3A",X"4B",X"4D",X"FE",X"01",X"28",X"02", + X"23",X"23",X"35",X"C9",X"97",X"CD",X"BD",X"02",X"32",X"A5",X"4E",X"21",X"4B",X"4D",X"3C",X"BE", + X"11",X"9F",X"4C",X"28",X"03",X"11",X"A1",X"4C",X"1A",X"A7",X"28",X"41",X"3A",X"39",X"4C",X"FE", + X"02",X"28",X"05",X"97",X"32",X"3A",X"4C",X"C9",X"7E",X"EE",X"03",X"77",X"CD",X"5E",X"02",X"97", + X"32",X"3A",X"4C",X"3E",X"05",X"CD",X"7A",X"09",X"F5",X"97",X"E5",X"CD",X"BD",X"02",X"11",X"7B", + X"1B",X"21",X"6F",X"42",X"CD",X"6B",X"04",X"E1",X"7E",X"FE",X"02",X"3E",X"32",X"28",X"01",X"3D", + X"32",X"90",X"41",X"06",X"B4",X"CD",X"72",X"03",X"F1",X"CD",X"A1",X"03",X"C9",X"CD",X"41",X"1B", + X"3A",X"39",X"4C",X"3D",X"32",X"39",X"4C",X"FE",X"01",X"28",X"BD",X"3E",X"01",X"32",X"3A",X"4C", + X"C9",X"E5",X"11",X"66",X"1B",X"21",X"6F",X"42",X"CD",X"6B",X"04",X"E1",X"3E",X"01",X"BE",X"3E", + X"32",X"C2",X"55",X"1B",X"3D",X"32",X"90",X"41",X"3E",X"11",X"CD",X"7A",X"09",X"06",X"B4",X"CD", + X"72",X"03",X"CD",X"A1",X"03",X"C9",X"FF",X"0D",X"47",X"41",X"4D",X"45",X"20",X"4F",X"56",X"45", + X"52",X"FF",X"FE",X"50",X"4C",X"41",X"59",X"45",X"52",X"FF",X"FF",X"FF",X"0E",X"47",X"45",X"54", + X"20",X"52",X"45",X"41",X"44",X"59",X"FF",X"FE",X"50",X"4C",X"41",X"59",X"45",X"52",X"FF",X"FF", + X"2A",X"12",X"4C",X"4E",X"23",X"46",X"23",X"E5",X"2A",X"10",X"4C",X"09",X"22",X"10",X"4C",X"C1", + X"ED",X"43",X"12",X"4C",X"78",X"FE",X"0F",X"C2",X"F0",X"20",X"79",X"FE",X"D8",X"C2",X"F0",X"20", + X"11",X"B9",X"A8",X"19",X"7C",X"E6",X"3F",X"67",X"CD",X"92",X"19",X"CD",X"F0",X"20",X"D1",X"E9", + X"13",X"1A",X"E5",X"26",X"00",X"6F",X"E6",X"80",X"28",X"01",X"25",X"19",X"EB",X"E1",X"C3",X"5D", + X"1C",X"E5",X"23",X"23",X"36",X"00",X"E1",X"C9",X"3A",X"2C",X"4F",X"21",X"00",X"40",X"0E",X"21", + X"F3",X"ED",X"A2",X"5F",X"07",X"83",X"07",X"83",X"07",X"16",X"00",X"5F",X"0D",X"ED",X"AA",X"FB", + X"21",X"D8",X"4E",X"19",X"11",X"0B",X"00",X"19",X"7E",X"2B",X"A7",X"20",X"5D",X"3A",X"2C",X"4F", + X"A7",X"28",X"57",X"E5",X"11",X"FB",X"FF",X"19",X"46",X"23",X"4E",X"23",X"23",X"36",X"00",X"CD", + X"F9",X"20",X"E1",X"3A",X"35",X"4F",X"A7",X"C0",X"23",X"23",X"35",X"C0",X"3E",X"13",X"CD",X"7A", + X"09",X"3A",X"29",X"4E",X"77",X"2B",X"36",X"A0",X"2B",X"E5",X"11",X"FA",X"FF",X"19",X"97",X"77", + X"2B",X"77",X"2B",X"2B",X"E5",X"CD",X"99",X"21",X"E1",X"E5",X"23",X"23",X"23",X"23",X"70",X"23", + X"71",X"E1",X"2B",X"7E",X"3D",X"07",X"07",X"16",X"00",X"5F",X"21",X"4A",X"2B",X"19",X"5E",X"23", + X"56",X"E1",X"72",X"2B",X"73",X"1B",X"3E",X"FD",X"18",X"04",X"56",X"2B",X"5E",X"1A",X"FE",X"FF", + X"CA",X"D1",X"1B",X"FE",X"FE",X"CA",X"C0",X"1B",X"FE",X"FD",X"E5",X"13",X"1A",X"28",X"0A",X"1B", + X"23",X"23",X"7E",X"FE",X"C0",X"C2",X"E5",X"1C",X"1A",X"E1",X"2B",X"77",X"01",X"FB",X"FF",X"09", + X"13",X"1A",X"86",X"FE",X"10",X"28",X"33",X"CB",X"7F",X"20",X"3B",X"77",X"23",X"13",X"1A",X"86", + X"FE",X"0A",X"28",X"40",X"FE",X"FF",X"28",X"44",X"77",X"23",X"13",X"1A",X"86",X"77",X"23",X"13", + X"1A",X"86",X"77",X"13",X"2B",X"1A",X"86",X"47",X"13",X"23",X"1A",X"86",X"4F",X"13",X"23",X"23", + X"E5",X"23",X"73",X"23",X"72",X"E1",X"CD",X"F9",X"20",X"C9",X"2B",X"2B",X"7E",X"3C",X"E6",X"0F", + X"77",X"23",X"23",X"97",X"18",X"C5",X"2B",X"2B",X"7E",X"3D",X"E6",X"0F",X"77",X"23",X"23",X"1A", + X"C6",X"10",X"18",X"B7",X"2B",X"2B",X"34",X"23",X"23",X"97",X"18",X"BC",X"2B",X"2B",X"35",X"23", + X"23",X"3E",X"09",X"18",X"B3",X"D5",X"E5",X"7E",X"32",X"2E",X"4F",X"3A",X"14",X"4C",X"FE",X"01", + X"20",X"09",X"CD",X"3D",X"3C",X"3A",X"30",X"4C",X"4F",X"18",X"43",X"3A",X"2C",X"4F",X"A7",X"20", + X"3B",X"CD",X"74",X"01",X"3A",X"0D",X"4C",X"4F",X"3E",X"FF",X"32",X"0D",X"4C",X"79",X"2F",X"0E", + X"80",X"CB",X"77",X"28",X"04",X"CB",X"E1",X"18",X"25",X"CB",X"6F",X"28",X"04",X"CB",X"D9",X"18", + X"1D",X"E6",X"0F",X"28",X"19",X"CB",X"D1",X"47",X"E6",X"06",X"28",X"06",X"CB",X"57",X"28",X"0E", + X"18",X"06",X"CB",X"C9",X"CB",X"40",X"28",X"06",X"CB",X"C1",X"18",X"02",X"0E",X"80",X"E1",X"E5", + X"3A",X"2C",X"4F",X"A7",X"28",X"73",X"11",X"FA",X"FF",X"19",X"5E",X"23",X"56",X"06",X"0B",X"CD", + X"B4",X"1F",X"A7",X"28",X"64",X"06",X"0B",X"CD",X"AE",X"1F",X"A7",X"28",X"5C",X"23",X"23",X"23", + X"23",X"23",X"06",X"05",X"CD",X"B4",X"1F",X"A7",X"28",X"28",X"06",X"05",X"CD",X"AE",X"1F",X"A7", + X"28",X"20",X"3A",X"E3",X"4E",X"CB",X"67",X"20",X"1C",X"E6",X"86",X"FE",X"86",X"28",X"13",X"7E", + X"A7",X"28",X"0F",X"FE",X"A0",X"28",X"0B",X"FE",X"C0",X"28",X"07",X"3E",X"01",X"32",X"A5",X"4E", + X"18",X"27",X"3A",X"E3",X"4E",X"FE",X"99",X"20",X"20",X"7E",X"A7",X"28",X"1C",X"FE",X"C0",X"28", + X"18",X"E6",X"86",X"FE",X"86",X"28",X"12",X"0E",X"C0",X"11",X"F5",X"FF",X"19",X"7E",X"CD",X"23", + X"05",X"3E",X"0E",X"CD",X"7A",X"09",X"C3",X"74",X"1F",X"E1",X"E5",X"11",X"F8",X"FF",X"19",X"7E", + X"A7",X"28",X"06",X"E1",X"D1",X"1A",X"C3",X"79",X"1C",X"23",X"7E",X"A7",X"28",X"28",X"79",X"E6", + X"86",X"FE",X"86",X"3A",X"2E",X"4F",X"20",X"01",X"79",X"E6",X"87",X"F6",X"86",X"4F",X"06",X"04", + X"E6",X"01",X"20",X"02",X"06",X"FC",X"11",X"07",X"00",X"19",X"CD",X"0F",X"22",X"3A",X"2E",X"4F", + X"B9",X"28",X"D0",X"C3",X"74",X"1F",X"CD",X"12",X"21",X"3A",X"2C",X"4F",X"A7",X"28",X"15",X"E5", + X"11",X"07",X"00",X"19",X"CB",X"71",X"20",X"04",X"CB",X"76",X"28",X"04",X"E1",X"C3",X"74",X"1F", + X"CD",X"C4",X"1F",X"E1",X"2B",X"2B",X"CD",X"DF",X"21",X"22",X"30",X"4F",X"3A",X"2C",X"4F",X"A7", + X"20",X"32",X"CB",X"6E",X"28",X"2E",X"CB",X"AE",X"E1",X"E5",X"11",X"F6",X"FF",X"19",X"CD",X"B3", + X"21",X"97",X"77",X"2B",X"77",X"11",X"E0",X"FF",X"19",X"77",X"23",X"77",X"3E",X"06",X"CD",X"23", + X"05",X"3E",X"0F",X"CD",X"7A",X"09",X"21",X"8B",X"4E",X"35",X"20",X"08",X"3E",X"01",X"32",X"A4", + X"4E",X"C3",X"C3",X"1D",X"79",X"FE",X"90",X"CA",X"74",X"1F",X"3A",X"2E",X"4F",X"FE",X"90",X"79", + X"20",X"05",X"0E",X"99",X"C3",X"74",X"1F",X"FE",X"88",X"C2",X"EF",X"1E",X"2A",X"30",X"4F",X"CB", + X"66",X"CA",X"74",X"1F",X"2B",X"CB",X"76",X"C2",X"74",X"1F",X"23",X"23",X"CB",X"76",X"C2",X"74", + X"1F",X"E1",X"E5",X"11",X"FB",X"FF",X"19",X"46",X"11",X"FC",X"FF",X"19",X"7E",X"F5",X"2B",X"7E", + X"22",X"3A",X"4F",X"C5",X"CD",X"F0",X"21",X"3A",X"32",X"4F",X"A1",X"20",X"05",X"C1",X"F1",X"C3", + X"74",X"1F",X"C1",X"F1",X"23",X"E5",X"96",X"3E",X"04",X"F2",X"AE",X"1E",X"ED",X"44",X"11",X"F8", + X"FF",X"19",X"5F",X"7E",X"A7",X"28",X"04",X"E1",X"C3",X"74",X"1F",X"3E",X"04",X"CD",X"7A",X"09", + X"36",X"01",X"23",X"23",X"73",X"23",X"70",X"2A",X"3A",X"4F",X"CD",X"B3",X"21",X"2B",X"2B",X"11", + X"00",X"04",X"19",X"EB",X"E1",X"E5",X"23",X"23",X"73",X"23",X"72",X"3A",X"62",X"4D",X"D6",X"02", + X"12",X"21",X"E0",X"FF",X"19",X"77",X"E1",X"CD",X"DF",X"21",X"CB",X"B6",X"C3",X"74",X"1F",X"E6", + X"86",X"FE",X"86",X"20",X"5F",X"2A",X"30",X"4F",X"CB",X"76",X"20",X"09",X"3A",X"2E",X"4F",X"E6", + X"86",X"FE",X"86",X"20",X"36",X"3A",X"2C",X"4F",X"CB",X"41",X"28",X"08",X"CB",X"5E",X"28",X"11", + X"06",X"04",X"18",X"06",X"CB",X"56",X"28",X"16",X"06",X"FC",X"E1",X"E5",X"CD",X"0F",X"22",X"18", + X"53",X"A7",X"28",X"4E",X"CB",X"56",X"28",X"19",X"79",X"EE",X"01",X"4F",X"18",X"EA",X"A7",X"28", + X"41",X"CB",X"5E",X"28",X"0C",X"79",X"EE",X"01",X"4F",X"18",X"D5",X"3A",X"2C",X"4F",X"A7",X"28", + X"31",X"ED",X"5F",X"E6",X"3F",X"FE",X"20",X"38",X"29",X"E6",X"0F",X"FE",X"08",X"0E",X"84",X"38", + X"1B",X"0C",X"18",X"08",X"FE",X"84",X"20",X"1A",X"CB",X"41",X"28",X"10",X"CB",X"4E",X"28",X"14", + X"3A",X"2C",X"4F",X"A7",X"28",X"0C",X"79",X"EE",X"01",X"4F",X"18",X"08",X"CB",X"46",X"28",X"04", + X"18",X"EE",X"0E",X"80",X"E1",X"3A",X"2E",X"4F",X"B9",X"D1",X"1A",X"CA",X"79",X"1C",X"71",X"CD", + X"40",X"22",X"E5",X"11",X"F5",X"FF",X"19",X"7E",X"07",X"16",X"00",X"5F",X"21",X"9A",X"22",X"19", + X"5E",X"23",X"56",X"79",X"CD",X"6C",X"22",X"07",X"26",X"00",X"6F",X"19",X"5E",X"23",X"56",X"CD", + X"92",X"22",X"E1",X"2B",X"72",X"2B",X"73",X"E1",X"1B",X"3E",X"FD",X"C3",X"5E",X"1C",X"3A",X"DE", + X"4E",X"92",X"18",X"04",X"3A",X"DD",X"4E",X"93",X"CB",X"7F",X"28",X"02",X"ED",X"44",X"B8",X"3E", + X"00",X"D0",X"3C",X"C9",X"3A",X"14",X"4C",X"A7",X"C0",X"4E",X"23",X"23",X"35",X"C0",X"3A",X"2A", + X"4E",X"5F",X"ED",X"5F",X"E6",X"3F",X"FE",X"10",X"30",X"01",X"1C",X"73",X"11",X"F3",X"FF",X"19", + X"7E",X"11",X"0B",X"00",X"19",X"FE",X"01",X"28",X"12",X"FE",X"02",X"28",X"17",X"FE",X"03",X"28", + X"23",X"FE",X"04",X"28",X"48",X"FE",X"05",X"28",X"3C",X"18",X"FE",X"0E",X"84",X"ED",X"5F",X"E6", + X"01",X"B1",X"4F",X"C9",X"0E",X"84",X"ED",X"5F",X"E6",X"11",X"20",X"03",X"0E",X"88",X"C9",X"E6", + X"01",X"B1",X"4F",X"C9",X"7E",X"4F",X"E6",X"86",X"FE",X"86",X"20",X"10",X"11",X"F9",X"FF",X"19", + X"7E",X"A7",X"C0",X"ED",X"5F",X"E6",X"02",X"C0",X"0E",X"84",X"18",X"02",X"0E",X"86",X"ED",X"5F", + X"E6",X"01",X"B1",X"4F",X"C9",X"01",X"06",X"0E",X"11",X"0A",X"20",X"18",X"06",X"01",X"02",X"04", + X"11",X"0B",X"30",X"ED",X"43",X"36",X"4F",X"ED",X"53",X"38",X"4F",X"11",X"F7",X"FF",X"19",X"E5", + X"CD",X"DF",X"21",X"CB",X"76",X"E1",X"23",X"23",X"23",X"20",X"54",X"ED",X"5F",X"E6",X"06",X"28", + X"0D",X"ED",X"5F",X"E6",X"3F",X"FE",X"10",X"0E",X"86",X"DA",X"2E",X"20",X"18",X"04",X"0E",X"88", + X"C9",X"2B",X"3A",X"DD",X"4E",X"96",X"06",X"01",X"38",X"03",X"05",X"ED",X"44",X"4F",X"3A",X"39", + X"4F",X"B9",X"38",X"26",X"ED",X"5F",X"47",X"11",X"06",X"00",X"19",X"7E",X"CB",X"57",X"20",X"05", + X"0E",X"84",X"C3",X"2E",X"20",X"E6",X"01",X"4F",X"3A",X"38",X"4F",X"A0",X"20",X"07",X"3E",X"84", + X"B1",X"EE",X"01",X"4F",X"C9",X"3E",X"84",X"B1",X"4F",X"C9",X"3E",X"84",X"B0",X"4F",X"C9",X"23", + X"ED",X"5F",X"47",X"3A",X"36",X"4F",X"A0",X"28",X"B8",X"46",X"11",X"05",X"00",X"19",X"7E",X"E6", + X"86",X"FE",X"86",X"20",X"1D",X"E5",X"11",X"F9",X"FF",X"19",X"7E",X"E1",X"A7",X"4E",X"C0",X"3A", + X"DE",X"4E",X"90",X"28",X"08",X"ED",X"5F",X"47",X"3A",X"37",X"4F",X"A0",X"C0",X"0E",X"84",X"C3", + X"2E",X"20",X"3A",X"DE",X"4E",X"90",X"06",X"01",X"30",X"01",X"05",X"3E",X"86",X"B0",X"4F",X"C9", + X"ED",X"5F",X"E6",X"03",X"3C",X"32",X"0B",X"4C",X"C9",X"E5",X"3A",X"2D",X"4F",X"07",X"07",X"5F", + X"16",X"00",X"21",X"8C",X"4E",X"19",X"D1",X"1A",X"77",X"23",X"1B",X"1A",X"77",X"23",X"70",X"23", + X"71",X"C9",X"E5",X"11",X"07",X"00",X"19",X"7E",X"CB",X"67",X"20",X"7B",X"A7",X"28",X"78",X"FE", + X"C0",X"28",X"74",X"E6",X"86",X"FE",X"86",X"28",X"6E",X"3A",X"2C",X"4F",X"A7",X"20",X"07",X"7E", + X"E6",X"84",X"FE",X"84",X"28",X"61",X"C5",X"11",X"F6",X"FF",X"19",X"4E",X"23",X"46",X"23",X"23", + X"E5",X"C5",X"06",X"04",X"21",X"AD",X"4E",X"11",X"0C",X"00",X"7E",X"B9",X"28",X"05",X"19",X"10", + X"F9",X"18",X"41",X"23",X"C1",X"7E",X"23",X"90",X"0E",X"10",X"28",X"32",X"FE",X"FF",X"0E",X"0C", + X"20",X"33",X"7E",X"B9",X"38",X"2F",X"11",X"F7",X"FF",X"19",X"7E",X"E1",X"A7",X"28",X"27",X"3A", + X"2C",X"4F",X"A7",X"28",X"12",X"C1",X"0E",X"C0",X"2B",X"2B",X"2B",X"2B",X"7E",X"CD",X"23",X"05", + X"3E",X"0E",X"CD",X"7A",X"09",X"18",X"10",X"3E",X"01",X"32",X"A5",X"4E",X"18",X"08",X"7E",X"B9", + X"30",X"03",X"18",X"D2",X"C1",X"E1",X"C1",X"E1",X"C9",X"7E",X"07",X"07",X"07",X"07",X"06",X"F6", + X"90",X"ED",X"44",X"47",X"23",X"7E",X"3D",X"4F",X"07",X"07",X"81",X"07",X"07",X"07",X"0E",X"18", + X"81",X"4F",X"C9",X"7E",X"3D",X"E5",X"26",X"00",X"6F",X"29",X"29",X"29",X"29",X"29",X"29",X"EB", + X"21",X"00",X"00",X"AF",X"ED",X"52",X"EB",X"E1",X"23",X"7E",X"3D",X"47",X"07",X"07",X"80",X"ED", + X"44",X"A7",X"28",X"06",X"83",X"5F",X"3E",X"FF",X"8A",X"57",X"21",X"9E",X"43",X"19",X"C9",X"3E", + X"06",X"96",X"07",X"07",X"07",X"07",X"2B",X"86",X"16",X"00",X"5F",X"21",X"2B",X"4E",X"19",X"C9", + X"21",X"AD",X"4E",X"11",X"0C",X"00",X"0E",X"08",X"F5",X"96",X"CB",X"7F",X"28",X"02",X"ED",X"44", + X"A7",X"28",X"0A",X"FE",X"01",X"28",X"06",X"CB",X"39",X"19",X"F1",X"18",X"EB",X"F1",X"C9",X"11", + X"F6",X"FF",X"19",X"C5",X"7E",X"CD",X"F0",X"21",X"79",X"2F",X"5F",X"3A",X"32",X"4F",X"A3",X"32", + X"32",X"4F",X"23",X"E5",X"CD",X"DF",X"21",X"CB",X"B6",X"E1",X"11",X"F8",X"FF",X"19",X"36",X"02", + X"23",X"7E",X"23",X"70",X"CD",X"8C",X"30",X"3A",X"34",X"4F",X"B1",X"32",X"34",X"4F",X"C1",X"C9", + X"C5",X"E5",X"7E",X"E6",X"86",X"FE",X"86",X"28",X"20",X"3A",X"2E",X"4F",X"E6",X"86",X"FE",X"86", + X"20",X"17",X"11",X"F6",X"FF",X"19",X"7E",X"CD",X"F0",X"21",X"11",X"F9",X"FF",X"19",X"36",X"00", + X"11",X"08",X"00",X"19",X"CD",X"DF",X"21",X"CB",X"F6",X"E1",X"C1",X"C9",X"C5",X"06",X"09",X"CB", + X"77",X"20",X"1C",X"05",X"CB",X"6F",X"20",X"17",X"05",X"FE",X"99",X"28",X"12",X"05",X"CB",X"67", + X"20",X"0D",X"05",X"CB",X"5F",X"20",X"08",X"05",X"CB",X"57",X"28",X"03",X"E6",X"03",X"47",X"78", + X"C1",X"C9",X"3E",X"FF",X"BA",X"C0",X"18",X"FE",X"FF",X"FF",X"A6",X"22",X"8E",X"23",X"65",X"24", + X"3E",X"25",X"04",X"26",X"E1",X"26",X"B9",X"22",X"DE",X"22",X"03",X"23",X"0C",X"23",X"3C",X"23", + X"4C",X"23",X"5C",X"23",X"15",X"23",X"7B",X"98",X"22",X"0E",X"FD",X"00",X"03",X"00",X"00",X"00", + X"12",X"FD",X"00",X"03",X"00",X"00",X"00",X"16",X"FD",X"00",X"03",X"00",X"00",X"01",X"1A",X"FC", + X"00",X"04",X"00",X"00",X"00",X"1E",X"FD",X"00",X"03",X"00",X"00",X"00",X"FE",X"DC",X"0C",X"03", + X"00",X"FD",X"00",X"00",X"00",X"10",X"03",X"00",X"FD",X"00",X"00",X"00",X"14",X"03",X"00",X"FD", + X"00",X"00",X"01",X"18",X"04",X"00",X"FC",X"00",X"00",X"00",X"1C",X"03",X"00",X"FD",X"00",X"00", + X"00",X"FE",X"DC",X"04",X"00",X"FF",X"00",X"FC",X"00",X"00",X"FE",X"F8",X"04",X"00",X"01",X"00", + X"04",X"00",X"00",X"FE",X"F8",X"24",X"00",X"00",X"00",X"00",X"00",X"16",X"FD",X"24",X"00",X"00", + X"00",X"00",X"00",X"12",X"FD",X"24",X"00",X"00",X"00",X"00",X"00",X"0C",X"FD",X"24",X"00",X"00", + X"00",X"00",X"00",X"06",X"FD",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"F1",X"20",X"00",X"00",X"00", + X"00",X"00",X"02",X"22",X"00",X"00",X"00",X"00",X"00",X"02",X"FE",X"F1",X"24",X"00",X"00",X"00", + X"00",X"00",X"08",X"FD",X"24",X"00",X"00",X"00",X"00",X"00",X"10",X"28",X"00",X"00",X"00",X"00", + X"00",X"16",X"2A",X"00",X"00",X"00",X"00",X"00",X"16",X"FE",X"F1",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"FE",X"F8",X"DB",X"65",X"E1",X"D1",X"C1",X"F1",X"FB",X"C3",X"C2",X"19",X"A2",X"23", + X"DC",X"23",X"98",X"22",X"98",X"22",X"16",X"24",X"98",X"22",X"98",X"22",X"98",X"22",X"1F",X"24", + X"48",X"24",X"36",X"FE",X"00",X"02",X"00",X"00",X"00",X"3A",X"FE",X"00",X"02",X"00",X"00",X"00", + X"3E",X"FE",X"00",X"02",X"00",X"00",X"00",X"3A",X"FE",X"00",X"02",X"00",X"00",X"00",X"36",X"FE", + X"00",X"02",X"00",X"00",X"00",X"3A",X"FE",X"00",X"02",X"00",X"00",X"00",X"3E",X"FE",X"00",X"02", + X"00",X"00",X"00",X"3A",X"FE",X"00",X"02",X"00",X"00",X"00",X"FE",X"C7",X"34",X"02",X"00",X"FE", + X"00",X"00",X"00",X"38",X"02",X"00",X"FE",X"00",X"00",X"00",X"3C",X"02",X"00",X"FE",X"00",X"00", + X"00",X"38",X"02",X"00",X"FE",X"00",X"00",X"00",X"34",X"02",X"00",X"FE",X"00",X"00",X"00",X"38", + X"02",X"00",X"FE",X"00",X"00",X"00",X"3C",X"02",X"00",X"FE",X"00",X"00",X"00",X"38",X"02",X"00", + X"FE",X"00",X"00",X"00",X"FE",X"C7",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"F8",X"2C", + X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"2E", + X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"2C", + X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"D8",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"79",X"24",X"A5",X"24",X"98",X"22",X"98",X"22",X"D1",X"24",X"27", + X"25",X"98",X"22",X"98",X"22",X"E1",X"24",X"0A",X"25",X"52",X"FE",X"00",X"02",X"00",X"00",X"00", + X"4A",X"FD",X"00",X"03",X"00",X"00",X"00",X"4E",X"FD",X"00",X"03",X"00",X"00",X"00",X"56",X"FE", + X"00",X"02",X"00",X"00",X"00",X"4E",X"FD",X"00",X"03",X"00",X"00",X"00",X"4A",X"FD",X"00",X"03", + X"00",X"00",X"00",X"FE",X"D5",X"50",X"02",X"00",X"FE",X"00",X"00",X"01",X"48",X"03",X"00",X"FD", + X"00",X"00",X"00",X"4C",X"03",X"00",X"FD",X"00",X"00",X"00",X"54",X"02",X"00",X"FE",X"00",X"00", + X"00",X"4C",X"03",X"00",X"FD",X"00",X"00",X"00",X"48",X"03",X"00",X"FD",X"00",X"00",X"00",X"FE", + X"D5",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"4C",X"00",X"00",X"00",X"00",X"00",X"00",X"FE", + X"F1",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"46",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"D8",X"5C",X"00",X"00",X"00",X"00",X"00", + X"00",X"5C",X"00",X"00",X"00",X"00",X"00",X"00",X"5C",X"00",X"00",X"00",X"00",X"00",X"00",X"5C", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"58",X"00",X"00",X"00",X"00",X"00",X"02",X"58",X"00", + X"00",X"00",X"00",X"00",X"04",X"58",X"00",X"00",X"00",X"00",X"00",X"02",X"FE",X"EA",X"52",X"25", + X"77",X"25",X"F2",X"25",X"FB",X"25",X"9C",X"25",X"98",X"22",X"98",X"22",X"98",X"22",X"AC",X"25", + X"D5",X"25",X"6E",X"FD",X"00",X"03",X"00",X"00",X"00",X"72",X"FD",X"00",X"03",X"00",X"00",X"00", + X"76",X"FC",X"00",X"04",X"00",X"00",X"01",X"7A",X"FD",X"00",X"03",X"00",X"00",X"00",X"7E",X"FD", + X"00",X"03",X"00",X"00",X"00",X"FE",X"DC",X"6C",X"03",X"00",X"FD",X"00",X"00",X"00",X"70",X"03", + X"00",X"FD",X"00",X"00",X"00",X"74",X"04",X"00",X"FC",X"00",X"00",X"01",X"78",X"03",X"00",X"FD", + X"00",X"00",X"00",X"7C",X"03",X"00",X"FD",X"00",X"00",X"00",X"FE",X"DC",X"64",X"00",X"00",X"00", + X"00",X"00",X"00",X"68",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"F1",X"60",X"00",X"00",X"00", + X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"62",X"00",X"00",X"00", + X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"60",X"00",X"00",X"00", + X"00",X"00",X"00",X"FE",X"D8",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"FF",X"64",X"00",X"FF",X"00",X"FC",X"00",X"00",X"FE",X"F8",X"64",X"00",X"01",X"00",X"04", + X"00",X"00",X"FE",X"F8",X"18",X"26",X"3D",X"26",X"B8",X"26",X"C1",X"26",X"62",X"26",X"CA",X"26", + X"98",X"22",X"98",X"22",X"72",X"26",X"9B",X"26",X"92",X"FD",X"00",X"03",X"00",X"00",X"00",X"96", + X"FD",X"00",X"03",X"00",X"00",X"00",X"9A",X"FC",X"00",X"04",X"00",X"00",X"00",X"9E",X"FD",X"00", + X"03",X"00",X"00",X"00",X"A2",X"FD",X"00",X"03",X"00",X"00",X"00",X"FE",X"DC",X"90",X"03",X"00", + X"FD",X"00",X"00",X"00",X"94",X"03",X"00",X"FD",X"00",X"00",X"00",X"98",X"04",X"00",X"FC",X"00", + X"00",X"00",X"9C",X"03",X"00",X"FD",X"00",X"00",X"00",X"A0",X"03",X"00",X"FD",X"00",X"00",X"00", + X"FE",X"DC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"8C",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"F1",X"84",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"FD",X"86",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"FD",X"84",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"D8",X"A8",X"00",X"00",X"00",X"00", + X"00",X"00",X"A8",X"00",X"00",X"00",X"00",X"00",X"00",X"A8",X"00",X"00",X"00",X"00",X"00",X"00", + X"A8",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"00",X"FF",X"00",X"FC",X"00",X"00",X"FE", + X"F8",X"88",X"00",X"01",X"00",X"04",X"00",X"00",X"FE",X"F8",X"A4",X"00",X"00",X"00",X"00",X"00", + X"02",X"A4",X"00",X"00",X"00",X"00",X"00",X"04",X"A4",X"00",X"00",X"00",X"00",X"00",X"02",X"FE", + X"EA",X"F5",X"26",X"13",X"27",X"87",X"27",X"90",X"27",X"31",X"27",X"99",X"27",X"98",X"22",X"98", + X"22",X"41",X"27",X"6A",X"27",X"BA",X"FC",X"00",X"04",X"00",X"00",X"00",X"BE",X"FC",X"00",X"04", + X"00",X"00",X"00",X"C2",X"FC",X"00",X"04",X"00",X"00",X"00",X"BE",X"FC",X"00",X"04",X"00",X"00", + X"00",X"FE",X"E3",X"B8",X"04",X"00",X"FC",X"00",X"00",X"00",X"BC",X"04",X"00",X"FC",X"00",X"00", + X"00",X"C0",X"04",X"00",X"FC",X"00",X"00",X"00",X"BC",X"04",X"00",X"FC",X"00",X"00",X"00",X"FE", + X"E3",X"B0",X"00",X"00",X"00",X"00",X"00",X"00",X"B4",X"00",X"00",X"00",X"00",X"00",X"00",X"FE", + X"F1",X"AC",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"AE",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"AC",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"D8",X"C8",X"00",X"00",X"00",X"00",X"00", + X"00",X"C8",X"00",X"00",X"00",X"00",X"00",X"00",X"C8",X"00",X"00",X"00",X"00",X"00",X"00",X"C8", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"B0",X"00",X"FF",X"00",X"FC",X"00",X"00",X"FE",X"F8", + X"B0",X"00",X"01",X"00",X"04",X"00",X"00",X"FE",X"F8",X"C4",X"00",X"00",X"00",X"00",X"00",X"02", + X"C4",X"00",X"00",X"00",X"00",X"00",X"03",X"C4",X"00",X"00",X"00",X"00",X"00",X"02",X"FE",X"EA", + X"F5",X"C5",X"D5",X"E5",X"F3",X"11",X"5F",X"37",X"21",X"C3",X"27",X"01",X"03",X"06",X"DB",X"64", + X"C3",X"29",X"37",X"97",X"CD",X"BD",X"02",X"CD",X"C7",X"02",X"06",X"1E",X"CD",X"72",X"03",X"21", + X"2B",X"4E",X"06",X"AB",X"77",X"23",X"10",X"FC",X"3C",X"32",X"A3",X"4C",X"36",X"0B",X"23",X"36", + X"55",X"3A",X"16",X"4C",X"A7",X"28",X"14",X"97",X"32",X"32",X"4C",X"3E",X"05",X"32",X"33",X"4C", + X"21",X"7A",X"10",X"22",X"34",X"4C",X"21",X"DC",X"42",X"36",X"3C",X"3A",X"4B",X"4D",X"FE",X"01", + X"01",X"3C",X"4C",X"11",X"9C",X"4C",X"21",X"4C",X"4D",X"28",X"09",X"01",X"3D",X"4C",X"11",X"9D", + X"4C",X"21",X"4F",X"4D",X"1A",X"32",X"9E",X"4C",X"0A",X"32",X"3E",X"4C",X"7E",X"FE",X"19",X"20", + X"11",X"3A",X"14",X"4C",X"A7",X"7E",X"20",X"0A",X"3A",X"9E",X"4C",X"3C",X"32",X"9E",X"4C",X"3E", + X"01",X"77",X"11",X"BB",X"30",X"3D",X"07",X"26",X"00",X"6F",X"19",X"7E",X"23",X"66",X"6F",X"CD", + X"56",X"2E",X"32",X"62",X"4D",X"CD",X"5C",X"2B",X"97",X"32",X"DC",X"46",X"23",X"CD",X"56",X"2E", + X"32",X"61",X"4D",X"23",X"CD",X"56",X"2E",X"32",X"5F",X"4D",X"23",X"CD",X"56",X"2E",X"32",X"60", + X"4D",X"23",X"F3",X"DB",X"37",X"3E",X"72",X"00",X"47",X"DB",X"4D",X"3E",X"66",X"00",X"90",X"ED", + X"44",X"0F",X"47",X"DB",X"32",X"DB",X"46",X"FB",X"11",X"01",X"00",X"78",X"32",X"56",X"4D",X"CD", + X"56",X"2E",X"23",X"E5",X"D5",X"C5",X"07",X"DC",X"DE",X"2B",X"07",X"DC",X"E3",X"2B",X"21",X"1E", + X"2C",X"22",X"52",X"4D",X"21",X"12",X"2C",X"06",X"06",X"E5",X"07",X"30",X"0E",X"F5",X"C5",X"D5", + X"4E",X"23",X"46",X"EB",X"09",X"CD",X"F2",X"2B",X"D1",X"C1",X"F1",X"2A",X"52",X"4D",X"23",X"22", + X"52",X"4D",X"E1",X"23",X"23",X"10",X"E2",X"C1",X"D1",X"21",X"05",X"00",X"19",X"EB",X"E1",X"10", + X"BA",X"06",X"06",X"78",X"32",X"56",X"4D",X"3E",X"06",X"90",X"5F",X"07",X"07",X"83",X"16",X"00", + X"5F",X"ED",X"53",X"57",X"4D",X"C5",X"CD",X"56",X"2E",X"23",X"E5",X"CD",X"3D",X"2C",X"21",X"DE", + X"2C",X"22",X"52",X"4D",X"21",X"C4",X"2C",X"06",X"05",X"CD",X"8F",X"2C",X"D1",X"EB",X"CD",X"56", + X"2E",X"EB",X"13",X"D5",X"06",X"08",X"CD",X"8F",X"2C",X"E1",X"C1",X"10",X"C6",X"3E",X"06",X"47", + X"32",X"5A",X"4D",X"3E",X"E0",X"32",X"5C",X"4D",X"11",X"E6",X"4E",X"ED",X"53",X"5D",X"4D",X"78", + X"32",X"56",X"4D",X"3E",X"01",X"32",X"59",X"4D",X"3E",X"E6",X"32",X"5B",X"4D",X"C5",X"CD",X"56", + X"2E",X"23",X"E5",X"CD",X"38",X"2C",X"06",X"05",X"CD",X"EB",X"2C",X"D1",X"EB",X"CD",X"56",X"2E", + X"EB",X"13",X"D5",X"06",X"08",X"CD",X"EB",X"2C",X"3A",X"5A",X"4D",X"3D",X"32",X"5A",X"4D",X"3A", + X"5C",X"4D",X"D6",X"28",X"32",X"5C",X"4D",X"E1",X"C1",X"10",X"C4",X"06",X"06",X"78",X"32",X"56", + X"4D",X"3E",X"06",X"90",X"5F",X"07",X"07",X"83",X"16",X"00",X"5F",X"ED",X"53",X"57",X"4D",X"C5", + X"CD",X"56",X"2E",X"23",X"E5",X"21",X"59",X"2D",X"22",X"52",X"4D",X"21",X"49",X"2D",X"06",X"08", + X"CD",X"29",X"2D",X"E1",X"C1",X"10",X"D6",X"01",X"FC",X"2D",X"ED",X"43",X"52",X"4D",X"01",X"F4", + X"2D",X"ED",X"43",X"54",X"4D",X"CD",X"56",X"2E",X"32",X"32",X"4F",X"32",X"33",X"4F",X"07",X"07", + X"07",X"07",X"23",X"06",X"04",X"11",X"A6",X"4E",X"C5",X"D5",X"07",X"30",X"7E",X"F5",X"CD",X"56", + X"2E",X"47",X"23",X"CD",X"56",X"2E",X"23",X"32",X"56",X"4D",X"E5",X"90",X"21",X"56",X"4D",X"CD", + X"B6",X"2D",X"CD",X"38",X"2E",X"CB",X"D6",X"47",X"21",X"56",X"4D",X"35",X"CD",X"B6",X"2D",X"CD", + X"38",X"2E",X"CB",X"D6",X"CB",X"DE",X"10",X"F0",X"CB",X"96",X"E1",X"97",X"12",X"13",X"CD",X"56", + X"2E",X"23",X"32",X"56",X"4D",X"E5",X"47",X"07",X"07",X"80",X"47",X"D6",X"1E",X"ED",X"44",X"F5", + X"78",X"07",X"07",X"07",X"C6",X"F0",X"12",X"13",X"97",X"12",X"13",X"12",X"13",X"12",X"13",X"ED", + X"4B",X"54",X"4D",X"0A",X"6F",X"03",X"0A",X"67",X"F1",X"06",X"00",X"4F",X"09",X"7D",X"12",X"13", + X"7C",X"12",X"13",X"ED",X"4B",X"52",X"4D",X"0A",X"12",X"13",X"3A",X"56",X"4D",X"12",X"13",X"97", + X"12",X"CD",X"E5",X"2D",X"CD",X"38",X"2E",X"CB",X"F6",X"E1",X"F1",X"D1",X"E5",X"2A",X"54",X"4D", + X"23",X"23",X"22",X"54",X"4D",X"2A",X"52",X"4D",X"23",X"22",X"52",X"4D",X"21",X"0C",X"00",X"19", + X"EB",X"E1",X"C1",X"05",X"C2",X"98",X"29",X"CD",X"79",X"2B",X"21",X"D8",X"4E",X"97",X"77",X"23", + X"36",X"01",X"23",X"36",X"01",X"23",X"77",X"23",X"77",X"23",X"36",X"E6",X"23",X"36",X"18",X"23", + X"36",X"09",X"23",X"36",X"04",X"23",X"36",X"7B",X"23",X"36",X"23",X"23",X"36",X"A0",X"3A",X"4B", + X"4D",X"FE",X"01",X"11",X"9C",X"4C",X"21",X"4E",X"4D",X"28",X"06",X"11",X"9D",X"4C",X"21",X"51", + X"4D",X"3A",X"9E",X"4C",X"12",X"7E",X"FE",X"10",X"38",X"0A",X"3A",X"14",X"4C",X"A7",X"7E",X"20", + X"03",X"3E",X"0F",X"77",X"11",X"E4",X"35",X"3D",X"07",X"26",X"00",X"6F",X"19",X"7E",X"23",X"66", + X"6F",X"3A",X"9E",X"4C",X"A7",X"7E",X"28",X"01",X"97",X"01",X"25",X"4E",X"02",X"23",X"7E",X"03", + X"02",X"03",X"02",X"23",X"7E",X"03",X"02",X"23",X"7E",X"03",X"02",X"23",X"7E",X"03",X"02",X"11", + X"E6",X"4E",X"C3",X"6A",X"2E",X"3A",X"01",X"4C",X"47",X"23",X"7E",X"12",X"23",X"4E",X"C5",X"E5", + X"21",X"07",X"00",X"19",X"EB",X"3D",X"07",X"07",X"06",X"00",X"4F",X"21",X"48",X"2B",X"09",X"06", + X"04",X"7E",X"12",X"23",X"13",X"10",X"FA",X"97",X"12",X"13",X"E1",X"C1",X"79",X"12",X"13",X"3A", + X"2A",X"4E",X"12",X"13",X"10",X"D3",X"3A",X"9E",X"4C",X"A7",X"28",X"06",X"21",X"27",X"4E",X"35", + X"23",X"35",X"3A",X"14",X"4C",X"A7",X"20",X"3E",X"97",X"32",X"A3",X"4C",X"3E",X"0B",X"CD",X"0E", + X"05",X"CD",X"95",X"05",X"CD",X"C4",X"05",X"3A",X"37",X"4C",X"FE",X"02",X"20",X"0B",X"3E",X"0B", + X"CD",X"16",X"05",X"CD",X"9E",X"05",X"CD",X"CC",X"05",X"3A",X"4B",X"4D",X"FE",X"01",X"3E",X"0E", + X"32",X"02",X"4C",X"28",X"12",X"CD",X"CC",X"05",X"3A",X"AC",X"4C",X"A7",X"20",X"03",X"CD",X"6E", + X"06",X"3E",X"01",X"32",X"A3",X"4C",X"C9",X"CD",X"C4",X"05",X"18",X"EC",X"DB",X"65",X"DB",X"64", + X"E1",X"D1",X"C1",X"F1",X"FB",X"C3",X"B5",X"2A",X"05",X"0B",X"1F",X"24",X"12",X"11",X"E1",X"24", + X"0A",X"18",X"AC",X"25",X"0C",X"21",X"72",X"26",X"0B",X"2B",X"41",X"27",X"E5",X"CD",X"1A",X"03", + X"06",X"07",X"3E",X"08",X"11",X"E0",X"FF",X"21",X"81",X"43",X"C5",X"06",X"1A",X"CD",X"57",X"04", + X"01",X"45",X"03",X"09",X"C1",X"10",X"F3",X"E1",X"C9",X"3E",X"20",X"11",X"01",X"00",X"06",X"1E", + X"21",X"A1",X"43",X"CD",X"5C",X"04",X"06",X"1E",X"21",X"41",X"40",X"CD",X"5C",X"04",X"3E",X"25", + X"11",X"E0",X"FF",X"06",X"1A",X"21",X"80",X"43",X"CD",X"57",X"04",X"3E",X"2D",X"06",X"1A",X"21", + X"9F",X"43",X"CD",X"57",X"04",X"3A",X"A1",X"43",X"FE",X"28",X"3E",X"29",X"28",X"02",X"3E",X"24", + X"32",X"A0",X"43",X"3A",X"41",X"40",X"FE",X"28",X"3E",X"5C",X"28",X"02",X"3E",X"26",X"32",X"40", + X"40",X"3A",X"BE",X"43",X"FE",X"20",X"3E",X"5D",X"28",X"02",X"3E",X"2C",X"32",X"BF",X"43",X"3A", + X"5E",X"40",X"FE",X"20",X"3E",X"5E",X"28",X"02",X"3E",X"2F",X"32",X"5F",X"40",X"C9",X"21",X"A0", + X"43",X"18",X"03",X"21",X"40",X"40",X"D5",X"19",X"36",X"08",X"11",X"05",X"00",X"19",X"36",X"08", + X"D1",X"C9",X"E5",X"11",X"01",X"00",X"06",X"05",X"3E",X"03",X"CD",X"5C",X"04",X"E1",X"01",X"E0", + X"FF",X"09",X"06",X"05",X"3E",X"02",X"CD",X"5C",X"04",X"CD",X"38",X"2E",X"CB",X"CE",X"23",X"CB", + X"C6",X"C9",X"A0",X"43",X"E0",X"42",X"20",X"42",X"E0",X"41",X"20",X"41",X"60",X"40",X"00",X"03", + X"06",X"07",X"0A",X"0D",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"19",X"1D", + X"1D",X"1D",X"1B",X"1A",X"1D",X"1D",X"1D",X"1C",X"11",X"2E",X"2C",X"18",X"03",X"11",X"24",X"2C", + X"07",X"06",X"03",X"21",X"9E",X"43",X"DC",X"5C",X"2C",X"07",X"06",X"01",X"21",X"1E",X"42",X"DC", + X"5C",X"2C",X"07",X"06",X"03",X"21",X"1E",X"41",X"DC",X"5C",X"2C",X"C9",X"F5",X"C5",X"3A",X"56", + X"4D",X"3D",X"4F",X"07",X"07",X"81",X"ED",X"44",X"06",X"00",X"28",X"01",X"05",X"4F",X"09",X"C1", + X"C5",X"D5",X"CD",X"86",X"2C",X"01",X"E5",X"FF",X"09",X"CD",X"86",X"2C",X"01",X"E5",X"FF",X"09", + X"D1",X"C1",X"10",X"EC",X"F1",X"C9",X"06",X"05",X"1A",X"77",X"13",X"2B",X"10",X"FA",X"C9",X"C5", + X"E5",X"07",X"30",X"22",X"F5",X"5E",X"23",X"56",X"3A",X"3E",X"4C",X"A7",X"20",X"0B",X"D5",X"E5", + X"CD",X"29",X"2E",X"CB",X"6E",X"E1",X"D1",X"28",X"0C",X"CD",X"61",X"2D",X"CD",X"38",X"2E",X"CB", + X"EE",X"21",X"8B",X"4E",X"34",X"F1",X"2A",X"52",X"4D",X"23",X"22",X"52",X"4D",X"E1",X"23",X"23", + X"C1",X"10",X"CC",X"C9",X"85",X"43",X"45",X"43",X"05",X"43",X"C5",X"42",X"85",X"42",X"45",X"42", + X"05",X"42",X"C5",X"41",X"85",X"41",X"45",X"41",X"05",X"41",X"C5",X"40",X"85",X"40",X"01",X"02", + X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"C5",X"07",X"30",X"21",X"F5", + X"2A",X"5D",X"4D",X"23",X"ED",X"5B",X"59",X"4D",X"73",X"23",X"72",X"23",X"97",X"77",X"23",X"77", + X"23",X"ED",X"5B",X"5B",X"4D",X"73",X"23",X"72",X"11",X"08",X"00",X"19",X"22",X"5D",X"4D",X"F1", + X"CD",X"17",X"2D",X"C1",X"10",X"D5",X"C9",X"F5",X"3A",X"59",X"4D",X"3C",X"32",X"59",X"4D",X"3A", + X"5B",X"4D",X"C6",X"F0",X"32",X"5B",X"4D",X"F1",X"C9",X"C5",X"E5",X"07",X"30",X"0D",X"F5",X"5E", + X"23",X"56",X"CD",X"95",X"2D",X"CD",X"38",X"2E",X"CB",X"E6",X"F1",X"2A",X"52",X"4D",X"23",X"22", + X"52",X"4D",X"E1",X"23",X"23",X"C1",X"10",X"E1",X"C9",X"85",X"43",X"05",X"43",X"C5",X"42",X"45", + X"42",X"C5",X"41",X"45",X"41",X"05",X"41",X"85",X"40",X"01",X"03",X"04",X"06",X"08",X"0A",X"0B", + X"0D",X"2A",X"57",X"4D",X"19",X"3A",X"61",X"4D",X"77",X"2B",X"3C",X"77",X"11",X"E0",X"FF",X"19", + X"3C",X"77",X"23",X"3C",X"77",X"11",X"20",X"04",X"19",X"3A",X"9E",X"4C",X"A7",X"3A",X"60",X"4D", + X"47",X"3A",X"5F",X"4D",X"4F",X"28",X"03",X"01",X"00",X"00",X"70",X"2B",X"71",X"11",X"E0",X"FF", + X"19",X"71",X"23",X"70",X"C9",X"2A",X"57",X"4D",X"19",X"2B",X"2B",X"7E",X"C6",X"10",X"77",X"11", + X"E0",X"FF",X"19",X"7E",X"C6",X"11",X"77",X"11",X"00",X"04",X"19",X"3A",X"62",X"4D",X"3D",X"77", + X"11",X"20",X"00",X"19",X"77",X"C9",X"F5",X"C5",X"D5",X"7E",X"4F",X"07",X"07",X"81",X"D6",X"1E", + X"ED",X"44",X"06",X"00",X"4F",X"2A",X"54",X"4D",X"7E",X"23",X"66",X"6F",X"09",X"06",X"05",X"3E", + X"04",X"86",X"77",X"11",X"E0",X"FF",X"19",X"3E",X"05",X"86",X"77",X"11",X"1F",X"00",X"19",X"10", + X"EE",X"D1",X"C1",X"F1",X"C9",X"F5",X"C5",X"D5",X"E5",X"11",X"FB",X"01",X"CD",X"44",X"01",X"E1", + X"D1",X"C1",X"F1",X"C9",X"45",X"43",X"85",X"42",X"85",X"41",X"C5",X"40",X"02",X"05",X"09",X"0C", + X"D5",X"97",X"57",X"5A",X"7E",X"23",X"E5",X"6F",X"26",X"00",X"19",X"EB",X"E1",X"10",X"F5",X"3E", + X"05",X"32",X"01",X"4C",X"32",X"C0",X"50",X"0D",X"20",X"EA",X"D1",X"19",X"CB",X"24",X"CB",X"24", + X"CB",X"3C",X"CB",X"3C",X"E5",X"DD",X"E1",X"DD",X"E9",X"21",X"65",X"4D",X"3A",X"4B",X"4D",X"FE", + X"01",X"28",X"08",X"21",X"C5",X"4D",X"18",X"03",X"21",X"2B",X"4E",X"F5",X"C5",X"E5",X"2A",X"52", + X"4D",X"46",X"3A",X"56",X"4D",X"D6",X"06",X"ED",X"44",X"07",X"07",X"07",X"07",X"80",X"06",X"00", + X"4F",X"E1",X"09",X"C1",X"F1",X"C9",X"C5",X"D5",X"0E",X"51",X"F3",X"ED",X"50",X"ED",X"58",X"7E", + X"0E",X"28",X"ED",X"50",X"ED",X"58",X"FB",X"D1",X"C1",X"C9",X"F5",X"C5",X"D5",X"E5",X"F3",X"21", + X"7E",X"2E",X"11",X"9C",X"F5",X"01",X"08",X"22",X"DB",X"64",X"DB",X"65",X"18",X"82",X"3E",X"08", + X"C3",X"32",X"2F",X"3A",X"2E",X"4F",X"FE",X"90",X"3E",X"07",X"C2",X"32",X"2F",X"3E",X"09",X"C3", + X"32",X"2F",X"3A",X"E3",X"4E",X"FE",X"86",X"3A",X"2E",X"4F",X"28",X"0A",X"FE",X"87",X"CA",X"35", + X"2F",X"3E",X"00",X"C3",X"32",X"2F",X"FE",X"86",X"CA",X"35",X"2F",X"3E",X"01",X"C3",X"32",X"2F", + X"3A",X"25",X"4E",X"32",X"0E",X"4C",X"97",X"32",X"A7",X"4C",X"3C",X"32",X"3B",X"4C",X"06",X"1E", + X"CD",X"72",X"03",X"3A",X"8B",X"4E",X"32",X"C0",X"50",X"A7",X"CA",X"A8",X"2F",X"3A",X"A5",X"4E", + X"A7",X"C2",X"F0",X"2F",X"3E",X"15",X"CD",X"7A",X"09",X"3A",X"35",X"4F",X"3C",X"E6",X"03",X"32", + X"35",X"4F",X"3A",X"16",X"4C",X"A7",X"28",X"03",X"CD",X"77",X"11",X"97",X"32",X"2D",X"4F",X"32", + X"2C",X"4F",X"32",X"34",X"4F",X"3D",X"32",X"0D",X"4C",X"3E",X"0F",X"32",X"32",X"4F",X"CD",X"D8", + X"1B",X"3A",X"2E",X"4F",X"E6",X"86",X"FE",X"86",X"20",X"0E",X"3A",X"E3",X"4E",X"E6",X"86",X"FE", + X"86",X"28",X"05",X"3E",X"0A",X"CD",X"7A",X"09",X"3A",X"E3",X"4E",X"FE",X"99",X"CA",X"7E",X"2E", + X"FE",X"90",X"CA",X"83",X"2E",X"E6",X"86",X"FE",X"86",X"CA",X"92",X"2E",X"FE",X"84",X"20",X"05", + X"3E",X"10",X"CD",X"7A",X"09",X"3A",X"14",X"4C",X"A7",X"20",X"10",X"3A",X"E3",X"4E",X"CB",X"67", + X"3A",X"28",X"4E",X"20",X"03",X"3A",X"27",X"4E",X"CD",X"B6",X"06",X"3E",X"01",X"06",X"05",X"F5", + X"C5",X"32",X"2D",X"4F",X"32",X"2C",X"4F",X"CD",X"D8",X"1B",X"C1",X"F1",X"3C",X"10",X"F0",X"3A", + X"33",X"4F",X"47",X"3A",X"32",X"4F",X"A0",X"06",X"04",X"0E",X"08",X"F5",X"C5",X"A1",X"C4",X"2D", + X"30",X"C1",X"F1",X"CB",X"29",X"10",X"F4",X"3A",X"14",X"4C",X"A7",X"20",X"1A",X"97",X"32",X"A3", + X"4C",X"3A",X"4B",X"4D",X"FE",X"01",X"3E",X"06",X"28",X"05",X"CD",X"16",X"05",X"18",X"03",X"CD", + X"0E",X"05",X"3E",X"01",X"32",X"A3",X"4C",X"CD",X"A9",X"30",X"CD",X"A9",X"30",X"CD",X"8A",X"03", + X"C3",X"C3",X"2E",X"CD",X"0E",X"05",X"18",X"20",X"97",X"32",X"3B",X"4C",X"CD",X"23",X"05",X"32", + X"A3",X"4C",X"3C",X"32",X"A7",X"4C",X"3A",X"14",X"4C",X"A7",X"20",X"0C",X"3A",X"4B",X"4D",X"FE", + X"01",X"3E",X"06",X"28",X"DE",X"CD",X"16",X"05",X"3E",X"01",X"32",X"A3",X"4C",X"CD",X"ED",X"06", + X"3E",X"0D",X"CD",X"7A",X"09",X"CD",X"A1",X"03",X"97",X"32",X"A5",X"4E",X"3A",X"4B",X"4D",X"21", + X"3C",X"4C",X"FE",X"01",X"28",X"03",X"21",X"3D",X"4C",X"36",X"01",X"97",X"32",X"A7",X"4C",X"C9", + X"97",X"32",X"3B",X"4C",X"3C",X"32",X"A7",X"4C",X"CD",X"ED",X"06",X"3E",X"0C",X"CD",X"7A",X"09", + X"CD",X"A1",X"03",X"3E",X"01",X"32",X"A5",X"4E",X"3A",X"4B",X"4D",X"21",X"3C",X"4C",X"11",X"65", + X"4D",X"FE",X"01",X"28",X"06",X"21",X"3D",X"4C",X"11",X"C5",X"4D",X"36",X"00",X"21",X"2B",X"4E", + X"06",X"60",X"7E",X"12",X"23",X"13",X"10",X"FA",X"97",X"32",X"A7",X"4C",X"C9",X"F5",X"3E",X"04", + X"90",X"5F",X"07",X"83",X"07",X"07",X"16",X"00",X"5F",X"21",X"A6",X"4E",X"19",X"7E",X"A7",X"20", + X"05",X"CD",X"82",X"30",X"F1",X"C9",X"FE",X"01",X"20",X"FE",X"23",X"7E",X"23",X"46",X"CD",X"8C", + X"30",X"11",X"FA",X"FF",X"19",X"7E",X"2B",X"2B",X"BE",X"20",X"1E",X"2B",X"36",X"00",X"E5",X"CD", + X"82",X"30",X"E1",X"11",X"0A",X"00",X"19",X"5E",X"23",X"56",X"3A",X"62",X"4D",X"3D",X"12",X"21", + X"E0",X"FF",X"19",X"77",X"3E",X"02",X"CD",X"7A",X"09",X"C1",X"3A",X"34",X"4F",X"B0",X"32",X"34", + X"4F",X"C9",X"11",X"08",X"00",X"19",X"CD",X"DF",X"21",X"CB",X"F6",X"C9",X"80",X"2B",X"77",X"11", + X"08",X"00",X"19",X"7E",X"80",X"77",X"FE",X"FC",X"28",X"09",X"FE",X"28",X"C0",X"36",X"00",X"2B", + X"34",X"23",X"C9",X"36",X"24",X"2B",X"35",X"23",X"C9",X"3A",X"25",X"4E",X"A7",X"C8",X"21",X"0E", + X"4C",X"35",X"C0",X"3A",X"25",X"4E",X"77",X"CD",X"8A",X"03",X"C9",X"ED",X"30",X"22",X"31",X"57", + X"31",X"86",X"31",X"B2",X"31",X"E1",X"31",X"16",X"32",X"4B",X"32",X"80",X"32",X"B5",X"32",X"E7", + X"32",X"1C",X"33",X"51",X"33",X"86",X"33",X"BB",X"33",X"ED",X"33",X"22",X"34",X"57",X"34",X"8C", + X"34",X"B8",X"34",X"E7",X"34",X"1C",X"35",X"48",X"35",X"7D",X"35",X"B2",X"35",X"0F",X"90",X"05", + X"05",X"21",X"21",X"21",X"21",X"21",X"21",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04", + X"04",X"04",X"04",X"00",X"40",X"00",X"40",X"00",X"40",X"00",X"40",X"00",X"40",X"00",X"00",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"01",X"06",X"01",X"01",X"06",X"03",X"01",X"06",X"04",X"01", + X"06",X"06",X"18",X"94",X"02",X"03",X"C0",X"C0",X"21",X"21",X"21",X"21",X"00",X"40",X"00",X"40", + X"00",X"E0",X"01",X"50",X"02",X"48",X"04",X"44",X"00",X"08",X"02",X"00",X"00",X"00",X"00",X"20", + X"01",X"00",X"00",X"08",X"18",X"18",X"19",X"80",X"01",X"80",X"0F",X"01",X"04",X"02",X"04",X"06", + X"05",X"04",X"06",X"05",X"01",X"04",X"02",X"1B",X"98",X"01",X"01",X"C0",X"21",X"D2",X"D2",X"21", + X"C0",X"1C",X"47",X"08",X"42",X"A0",X"40",X"A0",X"40",X"08",X"42",X"1C",X"47",X"00",X"80",X"00", + X"20",X"00",X"80",X"00",X"20",X"00",X"80",X"00",X"00",X"04",X"04",X"20",X"20",X"04",X"04",X"06", + X"01",X"06",X"06",X"01",X"06",X"06",X"15",X"9C",X"04",X"04",X"21",X"31",X"39",X"39",X"31",X"21", + X"0F",X"F8",X"81",X"F0",X"00",X"20",X"00",X"20",X"81",X"F0",X"0F",X"F8",X"00",X"01",X"00",X"01", + X"80",X"01",X"80",X"01",X"00",X"01",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"06",X"04",X"1E",X"A0",X"04",X"06",X"21",X"33",X"33",X"33",X"33",X"21",X"03",X"F8",X"00",X"00", + X"40",X"00",X"40",X"00",X"00",X"00",X"03",X"F8",X"14",X"01",X"40",X"00",X"00",X"00",X"00",X"00", + X"44",X"00",X"00",X"01",X"42",X"42",X"42",X"42",X"42",X"42",X"09",X"01",X"06",X"06",X"01",X"06", + X"06",X"12",X"A4",X"06",X"06",X"2D",X"2D",X"C0",X"C0",X"2D",X"2D",X"47",X"1C",X"47",X"1C",X"00", + X"E0",X"00",X"E0",X"47",X"1C",X"47",X"1C",X"08",X"00",X"00",X"02",X"00",X"10",X"01",X"01",X"00", + X"00",X"00",X"00",X"81",X"81",X"C3",X"C3",X"81",X"81",X"0F",X"01",X"06",X"06",X"03",X"04",X"03", + X"03",X"04",X"04",X"01",X"06",X"01",X"18",X"B4",X"04",X"0E",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC", + X"54",X"05",X"12",X"09",X"54",X"05",X"12",X"09",X"54",X"05",X"12",X"09",X"00",X"20",X"40",X"80", + X"00",X"02",X"40",X"00",X"00",X"20",X"40",X"80",X"18",X"18",X"18",X"18",X"18",X"18",X"0F",X"01", + X"06",X"02",X"01",X"06",X"05",X"01",X"06",X"05",X"01",X"06",X"02",X"1B",X"AC",X"06",X"06",X"21", + X"21",X"C0",X"C0",X"C0",X"21",X"02",X"00",X"05",X"00",X"0F",X"A1",X"10",X"61",X"00",X"21",X"00", + X"1E",X"00",X"00",X"00",X"10",X"01",X"00",X"08",X"02",X"00",X"10",X"00",X"00",X"02",X"02",X"06", + X"24",X"60",X"40",X"0F",X"01",X"02",X"02",X"02",X"03",X"02",X"03",X"04",X"04",X"04",X"06",X"04", + X"15",X"B0",X"04",X"04",X"21",X"D2",X"C6",X"C6",X"2B",X"21",X"01",X"F0",X"18",X"E1",X"14",X"81", + X"17",X"81",X"03",X"20",X"01",X"F0",X"10",X"00",X"04",X"00",X"00",X"00",X"00",X"40",X"00",X"C0", + X"00",X"00",X"01",X"37",X"37",X"C7",X"C7",X"01",X"0F",X"02",X"03",X"02",X"04",X"05",X"05",X"02", + X"05",X"02",X"01",X"06",X"06",X"12",X"A8",X"07",X"07",X"C8",X"D0",X"21",X"21",X"21",X"21",X"14", + X"15",X"08",X"AA",X"04",X"50",X"0A",X"A8",X"01",X"50",X"02",X"AA",X"00",X"40",X"04",X"00",X"00", + X"20",X"00",X"20",X"00",X"20",X"00",X"00",X"10",X"20",X"01",X"01",X"81",X"80",X"0D",X"01",X"02", + X"01",X"04",X"06",X"05",X"02",X"04",X"03",X"0F",X"B8",X"06",X"09",X"21",X"D0",X"21",X"21",X"C2", + X"21",X"08",X"00",X"19",X"C0",X"0C",X"40",X"00",X"42",X"00",X"73",X"00",X"02",X"00",X"00",X"00", + X"02",X"00",X"20",X"00",X"80",X"00",X"04",X"00",X"01",X"01",X"0C",X"31",X"8C",X"30",X"80",X"0F", + X"01",X"03",X"02",X"02",X"04",X"03",X"03",X"05",X"04",X"04",X"06",X"05",X"1E",X"BC",X"1F",X"1C", + X"C0",X"C2",X"C4",X"25",X"35",X"25",X"1F",X"E7",X"1F",X"E1",X"17",X"9C",X"07",X"9C",X"00",X"9C", + X"00",X"9C",X"00",X"00",X"00",X"12",X"00",X"02",X"08",X"00",X"00",X"02",X"00",X"00",X"00",X"04", + X"01",X"81",X"01",X"81",X"0F",X"01",X"04",X"04",X"01",X"02",X"01",X"05",X"06",X"06",X"01",X"05", + X"01",X"0F",X"90",X"05",X"05",X"21",X"33",X"37",X"37",X"23",X"21",X"07",X"FC",X"00",X"E0",X"00", + X"80",X"00",X"80",X"07",X"E0",X"0F",X"FC",X"00",X"10",X"00",X"10",X"00",X"00",X"00",X"40",X"08", + X"00",X"00",X"10",X"82",X"69",X"96",X"69",X"86",X"01",X"0F",X"02",X"06",X"02",X"03",X"05",X"03", + X"02",X"05",X"05",X"01",X"06",X"06",X"18",X"94",X"02",X"03",X"21",X"21",X"D0",X"CC",X"C2",X"21", + X"02",X"AA",X"05",X"54",X"10",X"FF",X"1E",X"0F",X"1F",X"E1",X"05",X"54",X"00",X"01",X"10",X"00", + X"02",X"00",X"40",X"20",X"00",X"04",X"00",X"00",X"80",X"00",X"60",X"18",X"06",X"01",X"0F",X"04", + X"06",X"04",X"03",X"04",X"04",X"02",X"03",X"02",X"01",X"02",X"02",X"1B",X"98",X"01",X"01",X"62", + X"72",X"72",X"31",X"31",X"21",X"21",X"80",X"21",X"C0",X"21",X"E0",X"01",X"F0",X"01",X"F8",X"01", + X"FC",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"00",X"00",X"84",X"04",X"04", + X"01",X"01",X"81",X"0B",X"01",X"06",X"06",X"04",X"06",X"04",X"01",X"03",X"03",X"15",X"9C",X"04", + X"04",X"21",X"21",X"CC",X"CC",X"21",X"21",X"00",X"70",X"00",X"0E",X"5C",X"07",X"5C",X"07",X"0E", + X"00",X"01",X"C0",X"00",X"04",X"00",X"80",X"00",X"20",X"00",X"80",X"00",X"20",X"00",X"00",X"80", + X"B0",X"18",X"18",X"0D",X"01",X"0F",X"05",X"06",X"05",X"03",X"05",X"04",X"02",X"04",X"03",X"01", + X"02",X"02",X"1E",X"A0",X"04",X"06",X"62",X"6A",X"62",X"70",X"62",X"62",X"0A",X"A1",X"03",X"01", + X"07",X"E1",X"00",X"FD",X"00",X"51",X"05",X"51",X"00",X"00",X"00",X"12",X"08",X"00",X"01",X"00", + X"00",X"02",X"00",X"00",X"06",X"C6",X"C6",X"E2",X"E2",X"C2",X"0F",X"01",X"05",X"05",X"02",X"03", + X"03",X"04",X"06",X"06",X"01",X"06",X"06",X"12",X"A4",X"06",X"06",X"D2",X"D6",X"D6",X"D6",X"D6", + X"25",X"10",X"E1",X"10",X"81",X"10",X"81",X"10",X"81",X"10",X"81",X"00",X"8C",X"00",X"40",X"00", + X"04",X"04",X"00",X"00",X"04",X"00",X"40",X"00",X"00",X"64",X"60",X"60",X"60",X"60",X"29",X"0F", + X"02",X"06",X"06",X"01",X"06",X"06",X"01",X"06",X"01",X"01",X"06",X"06",X"18",X"B4",X"04",X"0E", + X"70",X"D8",X"CC",X"C6",X"83",X"21",X"81",X"EF",X"00",X"2F",X"00",X"0F",X"80",X"00",X"1F",X"E0", + X"0F",X"EE",X"02",X"00",X"00",X"40",X"00",X"20",X"20",X"00",X"20",X"08",X"00",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"01",X"06",X"01",X"1B",X"AC",X"06",X"06",X"C0",X"23",X"25",X"29", + X"31",X"C0",X"03",X"F0",X"03",X"F0",X"03",X"98",X"03",X"38",X"01",X"F8",X"09",X"F8",X"04",X"00", + X"04",X"00",X"00",X"04",X"00",X"04",X"00",X"04",X"00",X"00",X"80",X"81",X"81",X"81",X"81",X"01", + X"09",X"02",X"06",X"02",X"01",X"06",X"05",X"15",X"B0",X"04",X"04",X"21",X"21",X"62",X"6E",X"6E", + X"2D",X"02",X"E8",X"02",X"E8",X"0E",X"E1",X"0E",X"01",X"0E",X"01",X"0E",X"0C",X"08",X"00",X"00", + X"02",X"00",X"00",X"40",X"00",X"41",X"02",X"40",X"10",X"80",X"81",X"26",X"1A",X"1A",X"19",X"0F", + X"05",X"06",X"05",X"01",X"04",X"01",X"01",X"04",X"01",X"01",X"05",X"01",X"12",X"A8",X"07",X"07", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"1F",X"EF",X"1F",X"EF",X"1F",X"EF",X"1F",X"EF",X"1F",X"EF", + X"1F",X"EF",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"01",X"06",X"01",X"0F",X"B8",X"06",X"09",X"95",X"7A",X"97",X"7A", + X"97",X"C0",X"10",X"9C",X"00",X"21",X"10",X"80",X"00",X"21",X"10",X"80",X"10",X"E1",X"06",X"00", + X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"61",X"66",X"66",X"66",X"66",X"66", + X"0F",X"01",X"06",X"04",X"01",X"06",X"04",X"01",X"05",X"03",X"01",X"06",X"03",X"1E",X"BC",X"1F", + X"1C",X"C0",X"7A",X"97",X"9B",X"76",X"DA",X"10",X"E1",X"00",X"21",X"10",X"80",X"10",X"20",X"00", + X"81",X"10",X"21",X"00",X"40",X"00",X"02",X"00",X"00",X"08",X"00",X"00",X"40",X"00",X"40",X"66", + X"66",X"66",X"66",X"66",X"66",X"0F",X"01",X"06",X"06",X"01",X"06",X"01",X"01",X"06",X"01",X"01", + X"06",X"06",X"1E",X"A0",X"04",X"06",X"2D",X"2D",X"21",X"21",X"21",X"C0",X"48",X"02",X"08",X"02", + X"08",X"02",X"00",X"00",X"00",X"00",X"00",X"7E",X"00",X"00",X"40",X"00",X"00",X"44",X"00",X"07", + X"00",X"00",X"00",X"00",X"24",X"24",X"24",X"A4",X"00",X"40",X"0E",X"01",X"03",X"03",X"03",X"06", + X"04",X"03",X"06",X"06",X"08",X"36",X"17",X"36",X"26",X"36",X"35",X"36",X"44",X"36",X"53",X"36", + X"62",X"36",X"71",X"36",X"80",X"36",X"8F",X"36",X"9E",X"36",X"AD",X"36",X"BC",X"36",X"CB",X"36", + X"DA",X"36",X"E9",X"36",X"F8",X"36",X"07",X"37",X"01",X"18",X"15",X"20",X"03",X"01",X"28",X"01", + X"20",X"01",X"18",X"01",X"10",X"01",X"08",X"01",X"17",X"14",X"19",X"03",X"01",X"10",X"02",X"10", + X"02",X"10",X"02",X"10",X"01",X"10",X"01",X"16",X"13",X"16",X"03",X"01",X"0C",X"03",X"0D",X"03", + X"0E",X"03",X"0F",X"02",X"10",X"01",X"15",X"12",X"14",X"03",X"02",X"0B",X"04",X"0C",X"04",X"0D", + X"04",X"0E",X"03",X"0F",X"01",X"14",X"11",X"12",X"03",X"03",X"0A",X"05",X"0B",X"05",X"0C",X"05", + X"0D",X"04",X"0E",X"01",X"13",X"10",X"10",X"02",X"01",X"09",X"02",X"0A",X"03",X"0B",X"04",X"0C", + X"05",X"0D",X"01",X"12",X"0F",X"0E",X"02",X"03",X"08",X"04",X"09",X"04",X"0A",X"05",X"0B",X"05", + X"0C",X"01",X"11",X"0E",X"0C",X"02",X"04",X"07",X"04",X"08",X"04",X"09",X"05",X"0A",X"05",X"0B", + X"01",X"10",X"0D",X"0A",X"02",X"04",X"06",X"05",X"07",X"05",X"08",X"05",X"09",X"04",X"0A",X"01", + X"0F",X"0C",X"08",X"02",X"05",X"05",X"05",X"06",X"05",X"07",X"05",X"08",X"05",X"09",X"01",X"0E", + X"0B",X"06",X"01",X"03",X"04",X"05",X"05",X"05",X"06",X"05",X"07",X"05",X"08",X"01",X"0D",X"0A", + X"04",X"01",X"02",X"05",X"04",X"05",X"04",X"05",X"05",X"05",X"05",X"05",X"01",X"0C",X"09",X"03", + X"01",X"03",X"03",X"05",X"04",X"05",X"05",X"04",X"06",X"04",X"07",X"01",X"0B",X"08",X"02",X"01", + X"03",X"01",X"04",X"02",X"05",X"03",X"04",X"04",X"05",X"05",X"01",X"0A",X"07",X"01",X"01",X"05", + X"01",X"05",X"01",X"05",X"01",X"05",X"01",X"05",X"01",X"01",X"20",X"20",X"80",X"01",X"05",X"72", + X"04",X"66",X"01",X"32",X"02",X"40",X"03",X"50",X"01",X"20",X"20",X"14",X"01",X"01",X"10",X"04", + X"15",X"02",X"36",X"03",X"10",X"05",X"13",X"01",X"20",X"20",X"20",X"01",X"03",X"03",X"02",X"30", + X"04",X"08",X"01",X"28",X"05",X"12",X"F5",X"C5",X"D5",X"E5",X"F3",X"21",X"16",X"37",X"11",X"AF", + X"A6",X"01",X"07",X"FF",X"DB",X"21",X"C3",X"2A",X"19",X"D5",X"E5",X"97",X"6F",X"67",X"32",X"A5", + X"4E",X"32",X"A1",X"4C",X"FD",X"E1",X"3C",X"32",X"3C",X"4C",X"32",X"3D",X"4C",X"FD",X"7E",X"00", + X"FD",X"23",X"5F",X"16",X"00",X"19",X"10",X"F5",X"0D",X"32",X"C0",X"50",X"20",X"EF",X"D1",X"19", + X"7C",X"EB",X"E5",X"DD",X"E1",X"11",X"84",X"23",X"D5",X"FD",X"E1",X"FD",X"E9",X"DB",X"32",X"E1", + X"D1",X"C1",X"F1",X"FB",X"C3",X"03",X"3C",X"3A",X"37",X"4C",X"FE",X"01",X"28",X"26",X"DD",X"21", + X"93",X"4C",X"21",X"9B",X"4C",X"11",X"44",X"4C",X"06",X"03",X"7E",X"12",X"2B",X"1B",X"10",X"FA", + X"CD",X"2B",X"3A",X"3A",X"91",X"4C",X"A7",X"20",X"08",X"CD",X"AA",X"37",X"CD",X"B1",X"37",X"18", + X"06",X"CD",X"B1",X"37",X"CD",X"AA",X"37",X"3A",X"94",X"4C",X"FE",X"01",X"C0",X"97",X"32",X"94", + X"4C",X"CD",X"0C",X"3B",X"06",X"B4",X"CD",X"72",X"03",X"C9",X"21",X"96",X"4C",X"3E",X"01",X"18", + X"05",X"21",X"99",X"4C",X"3E",X"02",X"32",X"8A",X"4C",X"CD",X"58",X"02",X"11",X"45",X"4C",X"06", + X"03",X"7E",X"12",X"23",X"13",X"10",X"FA",X"CD",X"D6",X"37",X"C9",X"DB",X"02",X"DB",X"00",X"F1", + X"C1",X"D1",X"E1",X"C3",X"3F",X"02",X"3A",X"93",X"4C",X"FE",X"0A",X"28",X"04",X"3C",X"32",X"93", + X"4C",X"DD",X"21",X"7E",X"4C",X"21",X"45",X"4C",X"11",X"42",X"4C",X"06",X"03",X"7E",X"12",X"23", + X"13",X"10",X"FA",X"CD",X"2B",X"3A",X"3A",X"91",X"4C",X"A7",X"C8",X"3E",X"01",X"32",X"94",X"4C", + X"11",X"89",X"4C",X"06",X"03",X"2B",X"7E",X"12",X"1B",X"10",X"FA",X"97",X"12",X"1B",X"12",X"1B", + X"12",X"CD",X"18",X"38",X"CD",X"D2",X"39",X"C9",X"97",X"CD",X"B4",X"02",X"CD",X"12",X"06",X"32", + X"8C",X"4C",X"11",X"71",X"3A",X"21",X"86",X"42",X"CD",X"6B",X"04",X"3A",X"8A",X"4C",X"FE",X"01", + X"3E",X"32",X"20",X"01",X"3D",X"32",X"87",X"41",X"3E",X"0B",X"CD",X"7A",X"09",X"CD",X"A1",X"03", + X"11",X"A4",X"3A",X"21",X"8A",X"43",X"CD",X"6B",X"04",X"11",X"9B",X"3A",X"21",X"52",X"42",X"CD", + X"6B",X"04",X"11",X"8C",X"3A",X"21",X"DA",X"42",X"CD",X"6B",X"04",X"3E",X"30",X"32",X"8B",X"4C", + X"CD",X"B2",X"39",X"3E",X"14",X"32",X"8D",X"4C",X"11",X"90",X"4C",X"3E",X"01",X"32",X"8F",X"4C", + X"3E",X"41",X"12",X"CD",X"8C",X"39",X"06",X"3C",X"32",X"0A",X"4C",X"CD",X"64",X"39",X"3A",X"8C", + X"4C",X"FE",X"01",X"C8",X"CD",X"7C",X"02",X"CB",X"6F",X"20",X"3B",X"3A",X"8F",X"4C",X"E6",X"01", + X"3E",X"14",X"28",X"02",X"3E",X"17",X"CD",X"7A",X"09",X"3A",X"8F",X"4C",X"21",X"83",X"4C",X"85", + X"6F",X"7C",X"CE",X"00",X"67",X"1A",X"77",X"3A",X"8F",X"4C",X"FE",X"03",X"C8",X"3C",X"32",X"8F", + X"4C",X"CD",X"7C",X"02",X"CB",X"6F",X"20",X"0B",X"CD",X"64",X"39",X"3A",X"8C",X"4C",X"FE",X"01", + X"C8",X"18",X"EE",X"CD",X"8C",X"39",X"CD",X"7C",X"02",X"CB",X"5F",X"20",X"0B",X"1A",X"3D",X"FE", + X"2F",X"20",X"02",X"3E",X"5B",X"12",X"18",X"0F",X"CD",X"7C",X"02",X"CB",X"47",X"20",X"9C",X"1A", + X"3C",X"FE",X"5C",X"20",X"02",X"3E",X"30",X"12",X"CD",X"8C",X"39",X"3A",X"8D",X"4C",X"FE",X"06", + X"38",X"05",X"3D",X"3D",X"32",X"8D",X"4C",X"32",X"8E",X"4C",X"CD",X"7C",X"02",X"32",X"C0",X"50", + X"CB",X"5F",X"28",X"0C",X"CB",X"47",X"28",X"08",X"3E",X"14",X"32",X"8D",X"4C",X"C3",X"7B",X"38", + X"3A",X"0A",X"4C",X"A7",X"20",X"FA",X"3E",X"01",X"32",X"0A",X"4C",X"10",X"13",X"06",X"3C",X"3A", + X"8B",X"4C",X"D6",X"01",X"27",X"32",X"8B",X"4C",X"CD",X"B2",X"39",X"3A",X"8B",X"4C",X"A7",X"C8", + X"21",X"8E",X"4C",X"35",X"20",X"C4",X"3A",X"8D",X"4C",X"FE",X"06",X"38",X"05",X"3D",X"3D",X"32", + X"8D",X"4C",X"77",X"CD",X"7C",X"02",X"CB",X"5F",X"20",X"0B",X"1A",X"3D",X"FE",X"2F",X"20",X"02", + X"3E",X"5B",X"12",X"18",X"08",X"1A",X"3C",X"FE",X"5C",X"20",X"02",X"3E",X"30",X"12",X"CD",X"8C", + X"39",X"C3",X"FA",X"38",X"3A",X"0A",X"4C",X"32",X"C0",X"50",X"A7",X"20",X"F7",X"3E",X"01",X"32", + X"0A",X"4C",X"10",X"17",X"06",X"3C",X"3A",X"8B",X"4C",X"D6",X"01",X"27",X"32",X"8B",X"4C",X"CD", + X"B2",X"39",X"A7",X"28",X"01",X"C9",X"3E",X"01",X"32",X"8C",X"4C",X"C9",X"F5",X"C5",X"E5",X"21", + X"52",X"42",X"3A",X"8F",X"4C",X"FE",X"02",X"20",X"03",X"21",X"12",X"42",X"FE",X"03",X"20",X"03", + X"21",X"D2",X"41",X"3E",X"09",X"32",X"02",X"4C",X"3A",X"90",X"4C",X"CD",X"1A",X"04",X"E1",X"C1", + X"F1",X"C9",X"21",X"5A",X"41",X"F5",X"97",X"32",X"08",X"4C",X"3A",X"95",X"4C",X"3C",X"FE",X"0F", + X"38",X"02",X"3E",X"03",X"32",X"95",X"4C",X"32",X"02",X"4C",X"3A",X"8B",X"4C",X"CD",X"F3",X"03", + X"F1",X"C9",X"01",X"0A",X"0A",X"DD",X"21",X"48",X"4C",X"21",X"4D",X"4C",X"11",X"4E",X"4C",X"32", + X"C0",X"50",X"C5",X"06",X"06",X"E5",X"21",X"3F",X"4C",X"1A",X"77",X"13",X"23",X"10",X"FA",X"E1", + X"1B",X"CD",X"2B",X"3A",X"3A",X"91",X"4C",X"FE",X"01",X"20",X"1D",X"06",X"06",X"7E",X"12",X"2B", + X"1B",X"10",X"FA",X"23",X"13",X"06",X"06",X"D5",X"11",X"3F",X"4C",X"1A",X"77",X"13",X"23",X"10", + X"FA",X"D1",X"2B",X"13",X"13",X"13",X"13",X"13",X"13",X"D5",X"11",X"06",X"00",X"19",X"DD",X"19", + X"D1",X"C1",X"10",X"BB",X"06",X"0A",X"0D",X"C2",X"D5",X"39",X"C9",X"F5",X"D5",X"E5",X"21",X"08", + X"4C",X"97",X"77",X"32",X"91",X"4C",X"11",X"44",X"4C",X"1A",X"DD",X"96",X"05",X"27",X"F5",X"A7", + X"28",X"03",X"3E",X"01",X"77",X"F1",X"1B",X"1A",X"DD",X"9E",X"04",X"27",X"F5",X"A7",X"28",X"03", + X"3E",X"01",X"77",X"F1",X"1B",X"1A",X"DD",X"9E",X"03",X"27",X"F5",X"A7",X"28",X"03",X"3E",X"01", + X"77",X"F1",X"38",X"09",X"7E",X"A7",X"28",X"05",X"3E",X"01",X"32",X"91",X"4C",X"E1",X"D1",X"F1", + X"C9",X"FF",X"03",X"47",X"52",X"45",X"41",X"54",X"20",X"53",X"43",X"4F",X"52",X"45",X"FF",X"FE", + X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"20",X"20",X"21",X"FF",X"FF",X"FF",X"05",X"54",X"49", + X"4D",X"45",X"20",X"4C",X"45",X"46",X"54",X"FF",X"09",X"FF",X"FF",X"FF",X"06",X"5F",X"20",X"5F", + X"20",X"5F",X"FF",X"FF",X"FF",X"06",X"4D",X"4F",X"56",X"45",X"20",X"4A",X"4F",X"59",X"53",X"54", + X"49",X"43",X"4B",X"20",X"FF",X"0D",X"55",X"50",X"20",X"FF",X"06",X"4F",X"52",X"20",X"FF",X"08", + X"44",X"4F",X"57",X"4E",X"FF",X"06",X"FF",X"FE",X"54",X"4F",X"20",X"53",X"45",X"4C",X"45",X"43", + X"54",X"20",X"4C",X"45",X"54",X"54",X"45",X"52",X"53",X"2E",X"FF",X"FE",X"48",X"49",X"54",X"20", + X"FF",X"0E",X"43",X"41",X"4C",X"4C",X"20",X"FF",X"06",X"54",X"4F",X"20",X"45",X"4E",X"54",X"45", + X"52",X"20",X"49",X"4E",X"49",X"54",X"49",X"41",X"4C",X"53",X"2E",X"FF",X"FF",X"FF",X"09",X"4D", + X"4F",X"42",X"20",X"4D",X"41",X"53",X"48",X"45",X"52",X"53",X"FF",X"FF",X"97",X"CD",X"BD",X"02", + X"CD",X"12",X"06",X"11",X"FD",X"3A",X"21",X"86",X"42",X"CD",X"6B",X"04",X"01",X"01",X"0A",X"11", + X"4B",X"4C",X"21",X"09",X"43",X"E5",X"CD",X"3E",X"3B",X"21",X"06",X"00",X"19",X"EB",X"E1",X"23", + X"23",X"3A",X"93",X"4C",X"B9",X"C8",X"79",X"C6",X"01",X"27",X"4F",X"10",X"E8",X"C9",X"C5",X"D5", + X"3E",X"01",X"32",X"08",X"4C",X"3E",X"0D",X"32",X"02",X"4C",X"79",X"CD",X"F3",X"03",X"3E",X"2E", + X"CD",X"1A",X"04",X"01",X"C0",X"FF",X"09",X"3E",X"01",X"32",X"08",X"4C",X"3E",X"06",X"32",X"02", + X"4C",X"CD",X"D9",X"03",X"01",X"60",X"FF",X"09",X"3E",X"0E",X"32",X"02",X"4C",X"06",X"03",X"1B", + X"1A",X"CD",X"1A",X"04",X"C5",X"01",X"40",X"00",X"09",X"C1",X"10",X"F3",X"D1",X"C1",X"C9",X"E5", + X"D5",X"C5",X"F5",X"11",X"06",X"53",X"21",X"93",X"3B",X"01",X"04",X"00",X"DB",X"01",X"DB",X"03", + X"C3",X"C1",X"04",X"3E",X"01",X"32",X"14",X"4C",X"32",X"4B",X"4D",X"CD",X"5E",X"02",X"3A",X"80", + X"50",X"CB",X"6F",X"3E",X"01",X"28",X"01",X"97",X"32",X"15",X"4C",X"97",X"32",X"31",X"4C",X"3C", + X"32",X"16",X"4C",X"3E",X"19",X"32",X"4C",X"4D",X"3E",X"10",X"CD",X"EF",X"3B",X"32",X"16",X"4C", + X"F3",X"DB",X"C9",X"DB",X"CB",X"3E",X"66",X"00",X"D6",X"65",X"47",X"DB",X"DC",X"DB",X"E6",X"FB", + X"78",X"32",X"31",X"4C",X"32",X"4C",X"4D",X"3E",X"11",X"CD",X"EF",X"3B",X"CD",X"0C",X"3B",X"CD", + X"12",X"06",X"CD",X"49",X"06",X"CD",X"41",X"3E",X"0E",X"08",X"CD",X"2B",X"03",X"18",X"BC",X"32", + X"4E",X"4D",X"3E",X"01",X"32",X"4B",X"4D",X"32",X"3C",X"4C",X"32",X"3E",X"4C",X"CD",X"C3",X"27", + X"C3",X"16",X"37",X"3A",X"00",X"4C",X"47",X"97",X"21",X"18",X"4C",X"11",X"04",X"00",X"77",X"19", + X"10",X"FC",X"CD",X"E9",X"05",X"CD",X"49",X"06",X"97",X"32",X"A3",X"4C",X"3E",X"09",X"CD",X"0E", + X"05",X"CD",X"C4",X"05",X"3A",X"17",X"4C",X"FE",X"01",X"28",X"08",X"3E",X"09",X"CD",X"16",X"05", + X"CD",X"CC",X"05",X"3E",X"01",X"32",X"A3",X"4C",X"CD",X"B0",X"2E",X"97",X"C9",X"F5",X"C5",X"E5", + X"3A",X"2C",X"4F",X"07",X"07",X"06",X"00",X"4F",X"21",X"18",X"4C",X"09",X"7E",X"A7",X"20",X"48", + X"E5",X"3A",X"31",X"4C",X"A7",X"21",X"A7",X"3C",X"28",X"08",X"FE",X"01",X"21",X"4B",X"3D",X"28", + X"01",X"FF",X"CB",X"19",X"09",X"4E",X"23",X"46",X"E1",X"E5",X"23",X"23",X"71",X"23",X"70",X"E1", + X"E5",X"23",X"23",X"4E",X"23",X"46",X"E1",X"F3",X"DB",X"97",X"0A",X"5F",X"DB",X"C8",X"FB",X"7B", + X"A7",X"28",X"BD",X"E5",X"3C",X"77",X"03",X"23",X"F3",X"DB",X"97",X"0A",X"5F",X"DB",X"C8",X"FB", + X"7B",X"77",X"03",X"23",X"71",X"23",X"70",X"E1",X"35",X"28",X"D5",X"23",X"7E",X"32",X"30",X"4C", + X"CD",X"49",X"03",X"E1",X"C1",X"F1",X"C9",X"B3",X"3C",X"2C",X"3D",X"19",X"3D",X"F4",X"3C",X"FB", + X"3C",X"0A",X"3D",X"10",X"80",X"05",X"85",X"4B",X"84",X"05",X"80",X"05",X"88",X"19",X"80",X"05", + X"84",X"1E",X"87",X"05",X"85",X"04",X"80",X"14",X"90",X"08",X"80",X"19",X"85",X"08",X"90",X"1E", + X"80",X"05",X"84",X"16",X"80",X"0E",X"90",X"2F",X"80",X"05",X"84",X"08",X"80",X"10",X"90",X"14", + X"80",X"0A",X"85",X"05",X"80",X"0A",X"88",X"10",X"80",X"0A",X"90",X"19",X"80",X"0A",X"90",X"1C", + X"80",X"23",X"84",X"FF",X"0A",X"80",X"18",X"84",X"64",X"80",X"FF",X"0A",X"80",X"0C",X"84",X"09", + X"80",X"05",X"88",X"04",X"80",X"12",X"84",X"64",X"80",X"FF",X"05",X"80",X"14",X"84",X"0A",X"87", + X"14",X"84",X"0A",X"86",X"05",X"85",X"64",X"80",X"FF",X"0A",X"80",X"05",X"84",X"05",X"80",X"05", + X"88",X"10",X"80",X"05",X"84",X"0A",X"86",X"05",X"84",X"64",X"80",X"FF",X"0A",X"80",X"0C",X"85", + X"05",X"80",X"05",X"88",X"08",X"80",X"04",X"84",X"05",X"86",X"05",X"87",X"14",X"84",X"05",X"80", + X"05",X"88",X"08",X"80",X"04",X"85",X"0A",X"86",X"10",X"84",X"FF",X"57",X"3D",X"B2",X"3D",X"FF", + X"3D",X"C3",X"3D",X"E6",X"3D",X"28",X"3E",X"05",X"80",X"0A",X"85",X"05",X"84",X"0A",X"87",X"05", + X"85",X"05",X"84",X"0A",X"87",X"05",X"85",X"05",X"84",X"0A",X"87",X"05",X"85",X"05",X"84",X"0A", + X"87",X"05",X"85",X"05",X"84",X"08",X"87",X"03",X"86",X"02",X"87",X"04",X"86",X"07",X"87",X"05", + X"80",X"1E",X"85",X"05",X"84",X"04",X"90",X"05",X"80",X"0A",X"84",X"0A",X"86",X"0F",X"85",X"03", + X"80",X"05",X"88",X"10",X"80",X"05",X"85",X"14",X"80",X"0A",X"85",X"14",X"80",X"05",X"88",X"04", + X"80",X"05",X"90",X"05",X"80",X"05",X"85",X"0C",X"80",X"08",X"90",X"02",X"80",X"05",X"85",X"FF", + X"FF",X"FF",X"02",X"80",X"08",X"85",X"30",X"84",X"02",X"80",X"28",X"85",X"28",X"84",X"30",X"85", + X"FF",X"FF",X"FF",X"05",X"80",X"06",X"85",X"05",X"80",X"05",X"88",X"05",X"80",X"12",X"85",X"05", + X"80",X"05",X"88",X"05",X"80",X"0C",X"84",X"0C",X"85",X"05",X"80",X"05",X"88",X"05",X"80",X"1E", + X"84",X"05",X"80",X"FF",X"FF",X"FF",X"05",X"80",X"0A",X"84",X"0A",X"87",X"14",X"84",X"0C",X"80", + X"37",X"85",X"32",X"84",X"0C",X"80",X"32",X"85",X"0A",X"87",X"05",X"84",X"05",X"80",X"FF",X"05", + X"80",X"05",X"84",X"05",X"80",X"05",X"88",X"05",X"80",X"0A",X"85",X"05",X"80",X"05",X"88",X"05", + X"80",X"0F",X"84",X"0A",X"87",X"0A",X"85",X"05",X"84",X"05",X"88",X"10",X"80",X"05",X"84",X"0A", + X"86",X"28",X"85",X"05",X"80",X"05",X"84",X"FF",X"05",X"80",X"04",X"85",X"05",X"88",X"1C",X"80", + X"04",X"85",X"28",X"87",X"0A",X"80",X"10",X"84",X"0C",X"84",X"0A",X"86",X"28",X"85",X"40",X"80", + X"FF",X"21",X"9E",X"43",X"11",X"5C",X"3E",X"CD",X"6B",X"04",X"3A",X"80",X"50",X"E6",X"1C",X"EE", + X"1C",X"0F",X"0F",X"C6",X"32",X"21",X"DE",X"41",X"CD",X"1A",X"04",X"C9",X"FF",X"0B",X"42",X"4F", + X"4E",X"55",X"53",X"20",X"47",X"4C",X"4F",X"42",X"20",X"41",X"54",X"20",X"30",X"30",X"30",X"30", + X"30",X"20",X"50",X"4F",X"49",X"4E",X"54",X"53",X"FF",X"FF",X"97",X"42",X"A7",X"3E",X"1E",X"F6", + X"09",X"00",X"3F",X"00",X"00",X"40",X"3F",X"3F",X"3F",X"80",X"3F",X"3F",X"3E",X"C0",X"3F",X"3F", + X"3D",X"80",X"3F",X"3F",X"3B",X"40",X"3F",X"3F",X"37",X"C0",X"3F",X"3F",X"2F",X"C0",X"3F",X"3F", + X"1F",X"40",X"3F",X"3F",X"00",X"3F",X"FF",X"4D",X"45",X"45",X"54",X"20",X"54",X"48",X"45",X"20", + X"47",X"4C",X"4F",X"42",X"FF",X"FF",X"4D",X"55",X"4E",X"43",X"48",X"20",X"41",X"4C",X"4C",X"20", + X"54",X"48",X"45",X"20",X"53",X"4E",X"41",X"43",X"4B",X"53",X"FF",X"FE",X"54",X"4F",X"20",X"43", + X"4C",X"45",X"41",X"52",X"20",X"54",X"48",X"45",X"20",X"4C",X"45",X"56",X"45",X"4C",X"FF",X"FF", + X"50",X"55",X"53",X"48",X"20",X"43",X"41",X"4C",X"4C",X"20",X"42",X"55",X"54",X"54",X"4F",X"4E", + X"FF",X"FE",X"54",X"4F",X"20",X"52",X"49",X"44",X"45",X"20",X"45",X"4C",X"45",X"56",X"41",X"54", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..4d4bfda4 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F3",X"97",X"32",X"00",X"50",X"32",X"C0",X"50",X"DB",X"02",X"ED",X"56",X"31",X"F0",X"4F",X"06", + X"64",X"DB",X"03",X"CD",X"65",X"03",X"3A",X"00",X"3F",X"00",X"97",X"21",X"00",X"4C",X"01",X"04", + X"00",X"77",X"23",X"10",X"FC",X"32",X"C0",X"50",X"0D",X"20",X"F6",X"DB",X"04",X"DB",X"0A",X"CD", + X"ED",X"06",X"C3",X"07",X"02",X"07",X"37",X"00",X"F5",X"C5",X"D5",X"E5",X"3A",X"3B",X"4C",X"A7", + X"CA",X"32",X"01",X"DB",X"07",X"11",X"F2",X"4F",X"01",X"62",X"50",X"21",X"8C",X"4E",X"DB",X"08", + X"DB",X"0A",X"DB",X"0B",X"3E",X"06",X"00",X"F5",X"DB",X"14",X"DB",X"15",X"F1",X"F5",X"3A",X"A8", + X"4C",X"A7",X"28",X"26",X"3A",X"A9",X"4C",X"A7",X"28",X"20",X"7E",X"3D",X"CB",X"4E",X"20",X"02", + X"C6",X"04",X"12",X"13",X"23",X"7E",X"12",X"13",X"23",X"3E",X"E6",X"96",X"C6",X"26",X"02",X"03", + X"23",X"7E",X"D6",X"18",X"D6",X"F8",X"ED",X"44",X"18",X"0D",X"7E",X"12",X"13",X"23",X"7E",X"12", + X"13",X"23",X"7E",X"02",X"03",X"23",X"7E",X"02",X"03",X"23",X"F1",X"3D",X"20",X"BF",X"3A",X"A7", + X"4C",X"A7",X"20",X"6C",X"21",X"CA",X"4E",X"3A",X"34",X"4F",X"47",X"97",X"32",X"34",X"4F",X"78", + X"06",X"04",X"0F",X"F5",X"30",X"53",X"E5",X"11",X"05",X"00",X"19",X"E5",X"5E",X"23",X"56",X"D5", + X"2B",X"2B",X"7E",X"4F",X"EE",X"01",X"77",X"2B",X"2B",X"7E",X"CB",X"2F",X"CB",X"2F",X"ED",X"44", + X"EB",X"CB",X"7F",X"16",X"00",X"5F",X"3E",X"FF",X"28",X"02",X"2F",X"15",X"A9",X"E6",X"01",X"20", + X"03",X"11",X"00",X"00",X"D5",X"11",X"FB",X"01",X"CB",X"41",X"28",X"03",X"11",X"01",X"02",X"CD", + X"5B",X"01",X"D1",X"E1",X"19",X"D1",X"EB",X"73",X"23",X"72",X"EB",X"11",X"FB",X"01",X"CB",X"41", + X"20",X"03",X"11",X"01",X"02",X"CD",X"44",X"01",X"E1",X"11",X"F4",X"FF",X"19",X"F1",X"10",X"A2", + X"21",X"09",X"4C",X"35",X"23",X"36",X"00",X"23",X"35",X"20",X"03",X"CD",X"32",X"07",X"CD",X"32", + X"07",X"CD",X"8B",X"01",X"E1",X"D1",X"C1",X"97",X"32",X"00",X"50",X"3C",X"32",X"00",X"50",X"F1", + X"FB",X"C9",X"3A",X"A7",X"4C",X"A7",X"20",X"D8",X"21",X"F2",X"4F",X"97",X"06",X"0C",X"77",X"23", + X"10",X"FC",X"18",X"CC",X"C5",X"0E",X"02",X"06",X"06",X"D5",X"1A",X"86",X"77",X"13",X"2B",X"10", + X"F9",X"11",X"E6",X"FF",X"19",X"D1",X"0D",X"20",X"EE",X"C1",X"C9",X"C5",X"0E",X"02",X"06",X"06", + X"D5",X"1A",X"96",X"ED",X"44",X"77",X"13",X"2B",X"10",X"F7",X"11",X"E6",X"FF",X"19",X"D1",X"0D", + X"20",X"EC",X"C1",X"C9",X"F5",X"C5",X"06",X"FF",X"3A",X"0D",X"4C",X"CB",X"77",X"20",X"02",X"06", + X"BF",X"CD",X"81",X"02",X"A0",X"32",X"0D",X"4C",X"D1",X"F1",X"C9",X"F5",X"DB",X"1E",X"E5",X"DB", + X"1F",X"3A",X"AC",X"4C",X"A7",X"20",X"19",X"CD",X"B3",X"01",X"3A",X"00",X"50",X"E6",X"10",X"00", + X"00",X"00",X"3A",X"A8",X"4C",X"A7",X"20",X"08",X"3A",X"40",X"50",X"E6",X"10",X"00",X"00",X"00", + X"E1",X"F1",X"C9",X"3A",X"0F",X"4C",X"A7",X"28",X"2C",X"3A",X"00",X"50",X"CB",X"6F",X"C0",X"97", + X"32",X"0F",X"4C",X"3C",X"32",X"15",X"4C",X"CD",X"ED",X"06",X"3E",X"16",X"CD",X"7A",X"09",X"21", + X"36",X"4C",X"7E",X"FE",X"99",X"C8",X"C6",X"01",X"27",X"77",X"3E",X"0F",X"32",X"0C",X"4C",X"3E", + X"01",X"32",X"07",X"50",X"C9",X"21",X"0C",X"4C",X"35",X"C0",X"36",X"01",X"3A",X"00",X"50",X"CB", + X"6F",X"C8",X"97",X"32",X"07",X"50",X"3C",X"32",X"0F",X"4C",X"C9",X"7C",X"02",X"02",X"02",X"80", + X"00",X"7E",X"02",X"02",X"02",X"02",X"82",X"97",X"32",X"03",X"50",X"3C",X"32",X"93",X"4C",X"32", + X"A3",X"4C",X"32",X"0F",X"4C",X"32",X"17",X"4C",X"21",X"48",X"4C",X"36",X"4D",X"23",X"36",X"4F", + X"23",X"36",X"42",X"23",X"36",X"00",X"23",X"36",X"01",X"23",X"36",X"00",X"CD",X"F0",X"20",X"3A", + X"40",X"50",X"CB",X"7F",X"3E",X"01",X"28",X"01",X"97",X"32",X"A8",X"4C",X"C3",X"00",X"12",X"FB", + X"3E",X"0B",X"CD",X"7A",X"09",X"CD",X"A1",X"03",X"C3",X"93",X"3B",X"F5",X"E6",X"F0",X"0F",X"0F", + X"0F",X"0F",X"47",X"F1",X"E6",X"0F",X"4F",X"C9",X"F5",X"3A",X"8A",X"4C",X"18",X"04",X"F5",X"3A", + X"4B",X"4D",X"C5",X"47",X"3A",X"A8",X"4C",X"A7",X"28",X"0F",X"78",X"06",X"00",X"FE",X"01",X"28", + X"01",X"04",X"78",X"32",X"03",X"50",X"32",X"A9",X"4C",X"C1",X"F1",X"C9",X"3A",X"8A",X"4C",X"18", + X"03",X"3A",X"4B",X"4D",X"C5",X"47",X"3A",X"A8",X"4C",X"A7",X"28",X"1B",X"78",X"FE",X"01",X"28", + X"16",X"3A",X"40",X"50",X"47",X"E6",X"0F",X"4F",X"78",X"E6",X"10",X"07",X"B1",X"4F",X"3A",X"00", + X"50",X"E6",X"80",X"0F",X"B1",X"C1",X"C9",X"3A",X"00",X"50",X"E6",X"0F",X"4F",X"3A",X"40",X"50", + X"E6",X"60",X"18",X"F0",X"CD",X"BD",X"02",X"06",X"1E",X"CD",X"72",X"03",X"C9",X"CD",X"D1",X"02", + X"CD",X"E2",X"02",X"CD",X"15",X"03",X"C9",X"CD",X"F3",X"02",X"CD",X"04",X"03",X"CD",X"1A",X"03", + X"C9",X"21",X"C2",X"43",X"01",X"01",X"1C",X"CD",X"20",X"03",X"21",X"E2",X"43",X"01",X"01",X"1C", + X"18",X"3E",X"21",X"02",X"40",X"01",X"01",X"1C",X"CD",X"20",X"03",X"21",X"22",X"40",X"01",X"01", + X"1C",X"18",X"2D",X"21",X"C2",X"47",X"01",X"01",X"1C",X"CD",X"20",X"03",X"21",X"E2",X"47",X"01", + X"01",X"1C",X"18",X"1C",X"21",X"02",X"44",X"01",X"01",X"1C",X"CD",X"20",X"03",X"21",X"22",X"44", + X"01",X"01",X"1C",X"18",X"0B",X"21",X"40",X"40",X"18",X"03",X"21",X"40",X"44",X"01",X"04",X"80", + X"77",X"23",X"10",X"FC",X"32",X"C0",X"50",X"0D",X"20",X"F6",X"C9",X"06",X"3C",X"CD",X"49",X"03", + X"3E",X"01",X"32",X"00",X"50",X"FB",X"3A",X"0A",X"4C",X"A7",X"20",X"F1",X"32",X"C0",X"50",X"3C", + X"32",X"0A",X"4C",X"10",X"E8",X"0D",X"20",X"E3",X"C9",X"F5",X"3A",X"36",X"4C",X"A7",X"20",X"02", + X"F1",X"C9",X"31",X"F0",X"4F",X"97",X"32",X"14",X"4C",X"32",X"3B",X"4C",X"3E",X"01",X"32",X"00", + X"50",X"FB",X"C3",X"85",X"19",X"C5",X"0E",X"00",X"0D",X"20",X"FD",X"32",X"C0",X"50",X"10",X"F8", + X"C1",X"C9",X"F5",X"C5",X"78",X"32",X"09",X"4C",X"3E",X"01",X"32",X"00",X"50",X"FB",X"32",X"C0", + X"50",X"3A",X"09",X"4C",X"A7",X"20",X"F1",X"C1",X"F1",X"C9",X"F5",X"3E",X"01",X"32",X"0A",X"4C", + X"3E",X"01",X"32",X"00",X"50",X"FB",X"32",X"C0",X"50",X"3A",X"0A",X"4C",X"A7",X"20",X"F1",X"F1", + X"C9",X"06",X"02",X"CD",X"72",X"03",X"D5",X"E5",X"21",X"B1",X"4C",X"11",X"04",X"00",X"06",X"03", + X"4E",X"B9",X"28",X"05",X"19",X"10",X"F9",X"18",X"1D",X"2B",X"3A",X"14",X"4C",X"A7",X"28",X"06", + X"3A",X"15",X"4C",X"A7",X"28",X"10",X"3E",X"01",X"32",X"00",X"50",X"32",X"01",X"50",X"FB",X"7E", + X"32",X"C0",X"50",X"A7",X"20",X"E4",X"E1",X"D1",X"C9",X"D5",X"3E",X"01",X"32",X"08",X"4C",X"1A", + X"CD",X"F3",X"03",X"13",X"1A",X"CD",X"F3",X"03",X"13",X"97",X"32",X"08",X"4C",X"1A",X"CD",X"F3", + X"03",X"D1",X"C9",X"C5",X"CD",X"4B",X"02",X"78",X"CD",X"01",X"04",X"79",X"CD",X"01",X"04",X"C1", + X"C9",X"D5",X"5F",X"3A",X"08",X"4C",X"57",X"A7",X"28",X"09",X"7B",X"A7",X"3E",X"00",X"20",X"03", + X"1E",X"D0",X"7A",X"32",X"08",X"4C",X"7B",X"C6",X"30",X"D1",X"D5",X"77",X"E5",X"11",X"00",X"04", + X"19",X"3A",X"02",X"4C",X"77",X"E1",X"3A",X"A3",X"4C",X"A7",X"11",X"FF",X"FF",X"28",X"03",X"11", + X"E0",X"FF",X"19",X"D1",X"C9",X"C5",X"D5",X"CD",X"4B",X"02",X"78",X"FE",X"0A",X"16",X"30",X"38", + X"02",X"16",X"37",X"82",X"CD",X"1A",X"04",X"79",X"FE",X"0A",X"16",X"30",X"38",X"02",X"16",X"37", + X"82",X"CD",X"1A",X"04",X"D1",X"C1",X"C9",X"77",X"19",X"10",X"FC",X"C9",X"F5",X"4E",X"81",X"77", + X"F1",X"19",X"10",X"F8",X"C9",X"C5",X"01",X"01",X"00",X"18",X"04",X"C5",X"01",X"E0",X"FF",X"ED", + X"43",X"04",X"4C",X"F5",X"22",X"06",X"4C",X"C5",X"0E",X"32",X"F3",X"ED",X"40",X"1A",X"0D",X"ED", + X"40",X"FB",X"C1",X"FE",X"FF",X"28",X"15",X"77",X"C5",X"E5",X"01",X"00",X"04",X"09",X"3A",X"02", + X"4C",X"77",X"E1",X"C1",X"13",X"ED",X"4B",X"04",X"4C",X"09",X"18",X"DB",X"13",X"0E",X"14",X"F3", + X"ED",X"40",X"1A",X"0C",X"13",X"ED",X"40",X"FB",X"FE",X"FF",X"20",X"03",X"F1",X"C1",X"C9",X"FE", + X"FE",X"20",X"09",X"2A",X"06",X"4C",X"23",X"22",X"06",X"4C",X"18",X"BB",X"32",X"02",X"4C",X"18", + X"B6",X"D5",X"EB",X"97",X"67",X"6F",X"3C",X"32",X"01",X"50",X"32",X"00",X"50",X"00",X"D5",X"16", + X"00",X"5F",X"19",X"D1",X"13",X"10",X"F6",X"32",X"C0",X"50",X"0D",X"20",X"F0",X"D1",X"19",X"7C", + X"21",X"CB",X"37",X"E9",X"E5",X"11",X"04",X"05",X"21",X"9A",X"42",X"CD",X"6B",X"04",X"3A",X"03", + X"4C",X"32",X"02",X"4C",X"3E",X"01",X"32",X"08",X"4C",X"3A",X"36",X"4C",X"21",X"BA",X"41",X"CD", + X"F3",X"03",X"E1",X"C9",X"FF",X"05",X"43",X"52",X"45",X"44",X"49",X"54",X"FF",X"FF",X"21",X"DD", + X"43",X"11",X"96",X"4C",X"18",X"06",X"21",X"FD",X"43",X"11",X"99",X"4C",X"32",X"02",X"4C",X"CD", + X"D9",X"03",X"C9",X"F5",X"C5",X"D5",X"E5",X"07",X"16",X"00",X"5F",X"3A",X"14",X"4C",X"FE",X"01", + X"CA",X"5E",X"05",X"21",X"88",X"05",X"19",X"01",X"98",X"4C",X"11",X"A0",X"4C",X"3A",X"4B",X"4D", + X"FE",X"01",X"28",X"06",X"01",X"9B",X"4C",X"11",X"A2",X"4C",X"0A",X"86",X"27",X"02",X"2B",X"0B", + X"0A",X"8E",X"27",X"02",X"0B",X"0A",X"CE",X"00",X"27",X"02",X"EB",X"CD",X"63",X"05",X"E1",X"D1", + X"C1",X"F1",X"C9",X"3A",X"92",X"4C",X"57",X"0A",X"BA",X"D8",X"7E",X"A7",X"C8",X"2B",X"34",X"3A", + X"4B",X"4D",X"FE",X"01",X"28",X"05",X"CD",X"9E",X"05",X"18",X"03",X"CD",X"95",X"05",X"3E",X"12", + X"CD",X"7A",X"09",X"23",X"36",X"00",X"C9",X"50",X"00",X"00",X"55",X"00",X"66",X"00",X"77",X"00", + X"88",X"00",X"99",X"01",X"00",X"E5",X"01",X"9F",X"4C",X"21",X"D6",X"43",X"18",X"07",X"E5",X"01", + X"A1",X"4C",X"21",X"F6",X"43",X"0A",X"A7",X"28",X"19",X"FE",X"07",X"38",X"02",X"3E",X"06",X"47", + X"36",X"01",X"2B",X"3E",X"09",X"77",X"E5",X"11",X"00",X"04",X"19",X"77",X"23",X"77",X"E1",X"2B", + X"10",X"EE",X"E1",X"C9",X"21",X"C5",X"43",X"01",X"4D",X"4D",X"18",X"06",X"21",X"E5",X"43",X"01", + X"50",X"4D",X"11",X"E1",X"05",X"CD",X"65",X"04",X"11",X"F9",X"FF",X"19",X"0A",X"CD",X"F3",X"03", + X"C9",X"20",X"20",X"44",X"4C",X"49",X"42",X"FF",X"FF",X"D5",X"E5",X"11",X"00",X"06",X"21",X"CD", + X"43",X"CD",X"65",X"04",X"11",X"0A",X"06",X"21",X"ED",X"43",X"CD",X"65",X"04",X"E1",X"D1",X"C9", + X"FF",X"08",X"71",X"70",X"6F",X"6E",X"6D",X"6C",X"FF",X"FF",X"77",X"76",X"75",X"74",X"73",X"72", + X"FF",X"FF",X"F5",X"C5",X"D5",X"E5",X"3E",X"01",X"32",X"3B",X"4C",X"32",X"A7",X"4C",X"06",X"18", + X"21",X"8C",X"4E",X"11",X"31",X"06",X"1A",X"77",X"13",X"23",X"10",X"FA",X"E1",X"D1",X"C1",X"F1", + X"C9",X"D0",X"08",X"95",X"F8",X"D4",X"08",X"85",X"F8",X"D8",X"08",X"76",X"F8",X"DC",X"08",X"96", + X"E8",X"E0",X"08",X"86",X"E8",X"E4",X"08",X"76",X"E8",X"11",X"53",X"06",X"21",X"24",X"40",X"CD", + X"65",X"04",X"C9",X"FF",X"07",X"20",X"20",X"52",X"4F",X"42",X"41",X"4C",X"20",X"45",X"52",X"41", + X"57",X"54",X"46",X"4F",X"53",X"20",X"34",X"38",X"39",X"31",X"20",X"40",X"FF",X"FF",X"3E",X"A8", + X"32",X"A6",X"4C",X"21",X"02",X"44",X"11",X"01",X"00",X"3E",X"12",X"06",X"3C",X"CD",X"57",X"04", + X"21",X"02",X"40",X"22",X"A4",X"4C",X"11",X"01",X"00",X"3E",X"60",X"06",X"15",X"CD",X"57",X"04", + X"21",X"22",X"40",X"06",X"15",X"CD",X"57",X"04",X"11",X"AB",X"06",X"21",X"17",X"40",X"CD",X"65", + X"04",X"11",X"E1",X"05",X"21",X"37",X"40",X"CD",X"65",X"04",X"C9",X"FF",X"08",X"20",X"20",X"20", + X"54",X"49",X"45",X"5A",X"FF",X"FF",X"21",X"26",X"4E",X"35",X"C0",X"32",X"26",X"4E",X"3A",X"14", + X"4C",X"A7",X"C0",X"2A",X"A4",X"4C",X"34",X"11",X"20",X"00",X"19",X"34",X"21",X"A6",X"4C",X"35", + X"20",X"05",X"3E",X"01",X"32",X"A5",X"4E",X"7E",X"FE",X"32",X"30",X"05",X"3E",X"03",X"CD",X"7A", + X"09",X"7E",X"E6",X"07",X"C0",X"2A",X"A4",X"4C",X"23",X"22",X"A4",X"4C",X"C9",X"F5",X"C5",X"E5", + X"97",X"21",X"08",X"4D",X"06",X"40",X"77",X"23",X"10",X"FC",X"21",X"08",X"4D",X"11",X"50",X"50", + X"01",X"10",X"00",X"ED",X"B0",X"21",X"08",X"4D",X"11",X"40",X"50",X"01",X"10",X"00",X"ED",X"B0", + X"3E",X"04",X"32",X"4A",X"50",X"3E",X"05",X"32",X"45",X"50",X"32",X"4F",X"50",X"21",X"B0",X"4C", + X"06",X"0C",X"97",X"77",X"23",X"10",X"FC",X"32",X"01",X"50",X"3C",X"32",X"01",X"50",X"E1",X"C1", + X"F1",X"C9",X"F5",X"C5",X"D5",X"E5",X"06",X"00",X"11",X"04",X"00",X"21",X"B0",X"4C",X"7E",X"FE", + X"00",X"C4",X"59",X"07",X"19",X"04",X"7E",X"FE",X"00",X"C4",X"59",X"07",X"19",X"04",X"7E",X"FE", + X"00",X"C4",X"59",X"07",X"E1",X"D1",X"C1",X"F1",X"C9",X"DB",X"64",X"C5",X"D5",X"E5",X"78",X"32", + X"49",X"4D",X"23",X"23",X"E5",X"DB",X"6B",X"5E",X"23",X"56",X"DB",X"64",X"1A",X"D5",X"5F",X"DB", + X"6B",X"7B",X"E6",X"E0",X"07",X"07",X"07",X"21",X"82",X"07",X"5F",X"07",X"83",X"16",X"00",X"5F", + X"19",X"E9",X"C3",X"9E",X"07",X"C3",X"C0",X"07",X"C3",X"E3",X"07",X"C3",X"14",X"08",X"C3",X"42", + X"08",X"C3",X"B8",X"08",X"C3",X"BC",X"08",X"C3",X"C5",X"08",X"E1",X"D1",X"C1",X"C9",X"E1",X"CD", + X"B0",X"0C",X"E6",X"1F",X"23",X"F5",X"CD",X"B0",X"0C",X"47",X"F1",X"23",X"E5",X"CD",X"20",X"09", + X"07",X"16",X"00",X"5F",X"21",X"08",X"4D",X"19",X"70",X"23",X"36",X"00",X"D1",X"C3",X"6A",X"07", + X"E1",X"CD",X"B0",X"0C",X"E6",X"1F",X"23",X"F5",X"CD",X"B0",X"0C",X"4F",X"23",X"CD",X"B0",X"0C", + X"47",X"F1",X"23",X"E5",X"07",X"16",X"00",X"5F",X"21",X"BC",X"4C",X"19",X"71",X"23",X"70",X"D1", + X"C3",X"6A",X"07",X"E1",X"CD",X"B0",X"0C",X"E6",X"1F",X"23",X"F5",X"CD",X"B0",X"0C",X"4F",X"23", + X"CD",X"B0",X"0C",X"47",X"F1",X"23",X"E5",X"F5",X"07",X"16",X"00",X"5F",X"21",X"08",X"4D",X"19", + X"E5",X"7E",X"23",X"6E",X"67",X"09",X"44",X"4D",X"E1",X"70",X"23",X"71",X"F1",X"CD",X"20",X"09", + X"D1",X"C3",X"6A",X"07",X"E1",X"CD",X"B0",X"0C",X"E6",X"1F",X"23",X"F5",X"CD",X"B0",X"0C",X"47", + X"F1",X"23",X"E5",X"07",X"16",X"00",X"5F",X"21",X"08",X"4D",X"19",X"7E",X"B8",X"28",X"0D",X"E1", + X"CD",X"B0",X"0C",X"5F",X"23",X"CD",X"B0",X"0C",X"57",X"C3",X"BE",X"08",X"D1",X"13",X"13",X"C3", + X"6A",X"07",X"E1",X"CD",X"B0",X"0C",X"E6",X"1F",X"23",X"F5",X"CD",X"B0",X"0C",X"47",X"23",X"CD", + X"B0",X"0C",X"4F",X"F1",X"23",X"E5",X"F5",X"07",X"16",X"00",X"5F",X"21",X"08",X"4D",X"19",X"97", + X"BE",X"28",X"06",X"35",X"F1",X"D1",X"C3",X"6A",X"07",X"78",X"E6",X"E0",X"07",X"07",X"07",X"07", + X"16",X"00",X"5F",X"21",X"BC",X"4C",X"19",X"5E",X"23",X"56",X"F1",X"E5",X"07",X"D5",X"16",X"00", + X"5F",X"21",X"08",X"4D",X"19",X"D1",X"1A",X"77",X"13",X"78",X"E6",X"1F",X"32",X"48",X"4D",X"79", + X"07",X"D5",X"16",X"00",X"5F",X"21",X"08",X"4D",X"19",X"D1",X"1A",X"13",X"47",X"79",X"CD",X"20", + X"09",X"0C",X"70",X"23",X"36",X"00",X"23",X"3A",X"48",X"4D",X"3D",X"32",X"48",X"4D",X"20",X"EA", + X"E1",X"72",X"2B",X"73",X"D1",X"C3",X"6A",X"07",X"E1",X"C3",X"9A",X"07",X"D1",X"13",X"E1",X"73", + X"23",X"72",X"C3",X"9A",X"07",X"E1",X"E1",X"3A",X"49",X"4D",X"07",X"07",X"16",X"00",X"5F",X"21", + X"B0",X"4C",X"19",X"46",X"23",X"4E",X"79",X"07",X"16",X"00",X"5F",X"21",X"C9",X"4C",X"19",X"7E", + X"FE",X"00",X"28",X"10",X"57",X"2B",X"5E",X"97",X"77",X"23",X"77",X"3A",X"49",X"4D",X"CD",X"D8", + X"09",X"C3",X"9A",X"07",X"3A",X"49",X"4D",X"F5",X"3C",X"47",X"07",X"80",X"F5",X"06",X"00",X"CD", + X"20",X"09",X"21",X"08",X"4D",X"F1",X"07",X"5F",X"16",X"00",X"19",X"72",X"23",X"72",X"F1",X"07", + X"07",X"5F",X"21",X"B0",X"4C",X"19",X"36",X"00",X"C3",X"9A",X"07",X"78",X"32",X"4F",X"50",X"C9", + X"FE",X"1B",X"28",X"F7",X"FE",X"0A",X"D0",X"F5",X"C5",X"E5",X"D5",X"11",X"66",X"09",X"07",X"83", + X"5F",X"7A",X"CE",X"00",X"57",X"1A",X"67",X"13",X"1A",X"6F",X"97",X"D1",X"E9",X"C6",X"05",X"C6", + X"05",X"3C",X"C6",X"04",X"26",X"50",X"C6",X"50",X"6F",X"70",X"18",X"16",X"C6",X"02",X"C6",X"03", + X"C6",X"02",X"C6",X"04",X"C6",X"02",X"26",X"50",X"C6",X"50",X"6F",X"78",X"CD",X"4B",X"02",X"71", + X"23",X"70",X"E1",X"C1",X"F1",X"C9",X"09",X"56",X"09",X"54",X"09",X"42",X"09",X"41",X"09",X"52", + X"09",X"50",X"09",X"3F",X"09",X"4E",X"09",X"4C",X"09",X"3D",X"F5",X"C5",X"D5",X"E5",X"F5",X"3A", + X"14",X"4C",X"FE",X"01",X"20",X"0A",X"3A",X"15",X"4C",X"FE",X"01",X"28",X"03",X"F1",X"18",X"43", + X"F1",X"32",X"4A",X"4D",X"4F",X"07",X"07",X"16",X"00",X"5F",X"21",X"EB",X"09",X"19",X"E5",X"23", + X"23",X"46",X"23",X"7E",X"C5",X"E5",X"07",X"07",X"16",X"00",X"5F",X"21",X"B0",X"4C",X"19",X"7E", + X"B8",X"38",X"07",X"20",X"09",X"23",X"7E",X"B9",X"28",X"04",X"3E",X"01",X"18",X"01",X"97",X"E1", + X"C1",X"A7",X"E1",X"28",X"0E",X"5E",X"23",X"56",X"23",X"23",X"7E",X"CD",X"D8",X"09",X"3E",X"01", + X"32",X"01",X"50",X"E1",X"D1",X"C1",X"F1",X"C9",X"D5",X"07",X"07",X"16",X"00",X"5F",X"21",X"B0", + X"4C",X"19",X"70",X"23",X"71",X"23",X"D1",X"73",X"23",X"72",X"C9",X"4B",X"0A",X"02",X"00",X"5B", + X"0A",X"02",X"00",X"6B",X"0A",X"01",X"01",X"8C",X"0A",X"03",X"01",X"9C",X"0A",X"02",X"00",X"49", + X"10",X"01",X"00",X"78",X"0C",X"01",X"00",X"09",X"0B",X"02",X"00",X"29",X"0B",X"02",X"00",X"E9", + X"0A",X"02",X"00",X"79",X"0A",X"02",X"00",X"49",X"0B",X"01",X"00",X"86",X"0B",X"04",X"00",X"A0", + X"0B",X"04",X"00",X"BA",X"0B",X"03",X"01",X"12",X"0C",X"03",X"00",X"F9",X"0B",X"01",X"00",X"27", + X"0C",X"01",X"00",X"5E",X"0C",X"04",X"01",X"D6",X"0B",X"03",X"00",X"CD",X"0A",X"03",X"00",X"94", + X"0C",X"01",X"02",X"B5",X"0A",X"03",X"01",X"CD",X"0A",X"03",X"00",X"03",X"07",X"00",X"05",X"01", + X"01",X"02",X"01",X"40",X"00",X"01",X"60",X"BF",X"53",X"0A",X"0A",X"03",X"07",X"00",X"BF",X"01", + X"01",X"02",X"01",X"40",X"00",X"FF",X"60",X"05",X"63",X"0A",X"E0",X"06",X"0F",X"04",X"FF",X"05", + X"10",X"46",X"80",X"FF",X"66",X"00",X"71",X"0A",X"E0",X"03",X"09",X"00",X"00",X"01",X"0D",X"02", + X"0A",X"43",X"80",X"FF",X"40",X"00",X"02",X"63",X"00",X"81",X"0A",X"E0",X"06",X"0F",X"04",X"0F", + X"05",X"07",X"11",X"06",X"51",X"00",X"FF",X"71",X"00",X"94",X"0A",X"E0",X"03",X"07",X"10",X"03", + X"01",X"04",X"02",X"00",X"00",X"28",X"40",X"00",X"FB",X"60",X"0A",X"A6",X"0A",X"50",X"00",X"FF", + X"70",X"00",X"A4",X"0A",X"E0",X"06",X"0F",X"11",X"03",X"04",X"08",X"05",X"02",X"04",X"28",X"44", + X"80",X"FF",X"45",X"80",X"00",X"64",X"0A",X"BF",X"0A",X"45",X"84",X"7B",X"E0",X"03",X"07",X"10", + X"01",X"01",X"08",X"02",X"00",X"00",X"28",X"40",X"00",X"FB",X"41",X"C0",X"FF",X"60",X"0A",X"D7", + X"0A",X"50",X"00",X"FF",X"70",X"00",X"51",X"8E",X"E0",X"03",X"02",X"00",X"18",X"01",X"05",X"02", + X"00",X"10",X"02",X"43",X"00",X"02",X"41",X"00",X"FF",X"63",X"0A",X"F3",X"0A",X"03",X"04",X"00", + X"18",X"50",X"00",X"FF",X"70",X"00",X"F3",X"0A",X"E0",X"03",X"08",X"00",X"18",X"01",X"02",X"02", + X"00",X"10",X"01",X"43",X"80",X"00",X"41",X"80",X"00",X"63",X"10",X"13",X"0B",X"03",X"08",X"00", + X"18",X"50",X"00",X"FF",X"70",X"00",X"07",X"8F",X"E0",X"03",X"08",X"00",X"18",X"01",X"28",X"02", + X"00",X"10",X"01",X"43",X"80",X"00",X"41",X"80",X"7B",X"63",X"10",X"33",X"0B",X"03",X"08",X"00", + X"18",X"50",X"00",X"FF",X"70",X"00",X"27",X"8F",X"E0",X"03",X"07",X"00",X"00",X"01",X"08",X"02", + X"00",X"04",X"04",X"05",X"00",X"06",X"07",X"07",X"0F",X"08",X"00",X"09",X"07",X"10",X"7F",X"40", + X"00",X"08",X"44",X"00",X"04",X"47",X"00",X"FD",X"50",X"00",X"FF",X"70",X"00",X"5F",X"0B",X"40", + X"7F",X"41",X"00",X"FC",X"45",X"00",X"F8",X"48",X"00",X"04",X"50",X"00",X"FF",X"70",X"00",X"71", + X"0B",X"06",X"00",X"09",X"00",X"E0",X"03",X"0A",X"02",X"00",X"20",X"05",X"0F",X"16",X"15",X"13", + X"00",X"93",X"02",X"00",X"73",X"00",X"91",X"0B",X"56",X"00",X"FF",X"76",X"00",X"91",X"0B",X"E0", + X"03",X"0A",X"02",X"00",X"20",X"9B",X"0F",X"16",X"3A",X"13",X"00",X"93",X"02",X"00",X"73",X"00", + X"AB",X"0B",X"56",X"00",X"FF",X"76",X"00",X"AB",X"0B",X"E0",X"06",X"0F",X"04",X"10",X"05",X"01", + X"11",X"04",X"14",X"10",X"44",X"00",X"04",X"54",X"00",X"FE",X"74",X"00",X"C4",X"0B",X"51",X"00", + X"FE",X"71",X"00",X"C2",X"0B",X"E0",X"01",X"00",X"02",X"00",X"10",X"05",X"03",X"0B",X"00",X"F0", + X"40",X"00",X"E0",X"60",X"50",X"E0",X"0B",X"40",X"00",X"10",X"60",X"A0",X"E7",X"0B",X"41",X"00", + X"01",X"50",X"00",X"FF",X"70",X"00",X"DE",X"0B",X"E0",X"00",X"7F",X"01",X"00",X"02",X"00",X"03", + X"03",X"10",X"05",X"50",X"00",X"FF",X"70",X"00",X"03",X"0C",X"43",X"00",X"01",X"63",X"0A",X"0A", + X"0C",X"E0",X"00",X"1C",X"01",X"00",X"02",X"00",X"03",X"0F",X"10",X"0C",X"50",X"00",X"FF",X"40", + X"00",X"68",X"70",X"00",X"1C",X"0C",X"E0",X"03",X"08",X"00",X"18",X"01",X"0A",X"02",X"00",X"10", + X"03",X"43",X"00",X"02",X"41",X"80",X"FF",X"63",X"10",X"31",X"0C",X"03",X"08",X"00",X"18",X"50", + X"00",X"FF",X"70",X"00",X"31",X"0C",X"03",X"0A",X"20",X"44",X"0F",X"16",X"1D",X"13",X"00",X"93", + X"02",X"00",X"73",X"00",X"4F",X"0C",X"56",X"00",X"FF",X"76",X"00",X"4F",X"0C",X"E0",X"06",X"0A", + X"05",X"00",X"21",X"A5",X"0E",X"17",X"20",X"14",X"00",X"94",X"22",X"04",X"74",X"00",X"69",X"0C", + X"57",X"00",X"FF",X"77",X"00",X"69",X"0C",X"E0",X"03",X"0A",X"10",X"04",X"01",X"00",X"02",X"00", + X"00",X"0A",X"40",X"00",X"05",X"41",X"80",X"00",X"60",X"5A",X"82",X"0C",X"50",X"00",X"FF",X"70", + X"00",X"80",X"0C",X"E0",X"09",X"01",X"08",X"00",X"1B",X"03",X"22",X"B9",X"0C",X"18",X"78",X"15", + X"00",X"95",X"42",X"07",X"75",X"00",X"A1",X"0C",X"58",X"00",X"FF",X"78",X"00",X"A1",X"0C",X"E0", + X"D5",X"DB",X"64",X"5E",X"DB",X"6B",X"7B",X"D1",X"C9",X"03",X"96",X"01",X"03",X"00",X"00",X"03", + X"6A",X"01",X"03",X"00",X"00",X"03",X"60",X"02",X"03",X"00",X"00",X"03",X"AC",X"02",X"03",X"00", + X"00",X"03",X"80",X"01",X"03",X"00",X"00",X"03",X"AE",X"01",X"03",X"00",X"00",X"03",X"C8",X"01", + X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"C8",X"01",X"03",X"00",X"00",X"03", + X"E0",X"01",X"03",X"00",X"00",X"03",X"20",X"02",X"03",X"00",X"00",X"03",X"58",X"05",X"03",X"00", + X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00", + X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03", + X"B5",X"00",X"03",X"00",X"00",X"03",X"B5",X"00",X"03",X"00",X"00",X"03",X"B5",X"00",X"03",X"00", + X"00",X"03",X"C0",X"00",X"03",X"00",X"00",X"03",X"B5",X"00",X"03",X"B5",X"00",X"03",X"B5",X"00", + X"03",X"B5",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"00",X"00",X"03", + X"10",X"01",X"03",X"00",X"00",X"03",X"10",X"01",X"03",X"00",X"00",X"03",X"10",X"01",X"03",X"00", + X"00",X"03",X"1E",X"01",X"03",X"00",X"00",X"03",X"10",X"01",X"03",X"10",X"01",X"03",X"10",X"01", + X"03",X"10",X"01",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"30",X"01",X"03",X"00",X"00",X"03", + X"56",X"01",X"03",X"00",X"00",X"03",X"C0",X"00",X"03",X"00",X"00",X"03",X"CB",X"00",X"03",X"00", + X"00",X"03",X"30",X"01",X"03",X"00",X"00",X"03",X"56",X"01",X"03",X"00",X"00",X"03",X"C0",X"00", + X"03",X"00",X"00",X"03",X"CB",X"00",X"03",X"00",X"00",X"03",X"2C",X"03",X"03",X"2C",X"03",X"03", + X"2C",X"03",X"03",X"00",X"00",X"03",X"90",X"03",X"33",X"00",X"00",X"03",X"00",X"03",X"03",X"00", + X"03",X"03",X"00",X"03",X"03",X"00",X"00",X"03",X"2C",X"03",X"03",X"00",X"00",X"03",X"D4",X"02", + X"03",X"00",X"00",X"03",X"2C",X"03",X"03",X"00",X"00",X"03",X"D4",X"02",X"03",X"00",X"00",X"03", + X"2C",X"03",X"03",X"00",X"00",X"03",X"D4",X"02",X"03",X"D4",X"02",X"03",X"5C",X"03",X"03",X"58", + X"05",X"03",X"00",X"00",X"03",X"00",X"00",X"03",X"30",X"01",X"03",X"00",X"00",X"03",X"56",X"01", + X"03",X"00",X"00",X"03",X"B5",X"00",X"03",X"00",X"00",X"03",X"B5",X"00",X"03",X"00",X"00",X"03", + X"B5",X"00",X"03",X"00",X"00",X"03",X"56",X"01",X"03",X"00",X"00",X"03",X"30",X"01",X"03",X"00", + X"00",X"32",X"00",X"00",X"02",X"E8",X"01",X"01",X"00",X"00",X"02",X"83",X"01",X"01",X"00",X"00", + X"02",X"45",X"01",X"01",X"00",X"00",X"06",X"7A",X"00",X"06",X"00",X"00",X"04",X"91",X"00",X"02", + X"00",X"00",X"0A",X"7A",X"00",X"12",X"00",X"00",X"03",X"23",X"01",X"01",X"00",X"00",X"03",X"00", + X"01",X"01",X"00",X"00",X"05",X"3C",X"00",X"01",X"00",X"00",X"05",X"78",X"00",X"01",X"00",X"00", + X"05",X"55",X"00",X"01",X"00",X"00",X"05",X"C8",X"00",X"01",X"00",X"00",X"03",X"4B",X"01",X"01", + X"00",X"00",X"03",X"78",X"00",X"01",X"00",X"00",X"03",X"55",X"00",X"01",X"00",X"00",X"02",X"C3", + X"00",X"01",X"00",X"00",X"02",X"41",X"00",X"02",X"00",X"00",X"03",X"3C",X"00",X"02",X"00",X"00", + X"02",X"37",X"00",X"02",X"00",X"00",X"02",X"32",X"00",X"02",X"00",X"00",X"02",X"2F",X"00",X"02", + X"00",X"00",X"03",X"2C",X"00",X"04",X"81",X"00",X"03",X"00",X"00",X"04",X"34",X"01",X"03",X"00", + X"00",X"02",X"B0",X"02",X"02",X"0E",X"03",X"01",X"00",X"00",X"02",X"A1",X"03",X"01",X"00",X"00", + X"04",X"A9",X"03",X"02",X"00",X"00",X"02",X"00",X"01",X"02",X"00",X"00",X"02",X"F3",X"02",X"03", + X"00",X"00",X"02",X"CD",X"00",X"03",X"00",X"00",X"01",X"B7",X"00",X"03",X"00",X"00",X"05",X"6A", + X"00",X"02",X"00",X"00",X"03",X"93",X"00",X"03",X"00",X"00",X"03",X"52",X"00",X"02",X"00",X"00", + X"03",X"32",X"00",X"02",X"00",X"00",X"03",X"2B",X"00",X"02",X"00",X"00",X"03",X"32",X"00",X"02", + X"00",X"00",X"08",X"64",X"00",X"07",X"7F",X"01",X"01",X"00",X"00",X"02",X"32",X"02",X"02",X"64", + X"02",X"02",X"96",X"02",X"01",X"00",X"00",X"01",X"C8",X"06",X"01",X"00",X"00",X"01",X"C8",X"06", + X"01",X"00",X"00",X"01",X"C8",X"06",X"01",X"00",X"00",X"01",X"C8",X"06",X"01",X"00",X"00",X"01", + X"C8",X"06",X"01",X"00",X"00",X"01",X"C8",X"06",X"01",X"00",X"00",X"01",X"C8",X"06",X"01",X"00", + X"00",X"03",X"00",X"05",X"03",X"F0",X"00",X"01",X"00",X"00",X"02",X"1E",X"01",X"01",X"00",X"00", + X"02",X"1E",X"02",X"01",X"00",X"00",X"02",X"1E",X"03",X"01",X"00",X"00",X"02",X"1E",X"04",X"01", + X"00",X"00",X"02",X"1E",X"05",X"01",X"00",X"00",X"02",X"1E",X"06",X"01",X"00",X"00",X"05",X"1E", + X"07",X"01",X"00",X"00",X"02",X"1E",X"06",X"01",X"00",X"00",X"02",X"1E",X"05",X"01",X"00",X"00", + X"02",X"1E",X"04",X"01",X"00",X"00",X"02",X"1E",X"03",X"01",X"00",X"00",X"02",X"1E",X"02",X"01", + X"00",X"00",X"02",X"1E",X"01",X"01",X"00",X"00",X"05",X"64",X"00",X"01",X"96",X"03",X"04",X"00", + X"00",X"01",X"C8",X"03",X"04",X"00",X"00",X"01",X"64",X"03",X"04",X"00",X"00",X"01",X"96",X"02", + X"04",X"00",X"00",X"01",X"C8",X"02",X"04",X"00",X"00",X"01",X"64",X"02",X"04",X"00",X"00",X"01", + X"96",X"01",X"04",X"00",X"00",X"01",X"C8",X"01",X"04",X"00",X"00",X"01",X"64",X"01",X"04",X"00", + X"00",X"01",X"96",X"00",X"04",X"00",X"00",X"01",X"C8",X"00",X"04",X"00",X"00",X"01",X"64",X"00", + X"04",X"00",X"00",X"01",X"78",X"01",X"03",X"00",X"00",X"01",X"A0",X"01",X"03",X"00",X"00",X"01", + X"4B",X"01",X"03",X"00",X"00",X"01",X"78",X"00",X"03",X"00",X"00",X"01",X"A0",X"00",X"03",X"00", + X"00",X"01",X"4B",X"00",X"01",X"5A",X"01",X"02",X"00",X"00",X"01",X"78",X"01",X"02",X"00",X"00", + X"01",X"32",X"01",X"02",X"00",X"00",X"01",X"5A",X"00",X"02",X"00",X"00",X"01",X"78",X"00",X"02", + X"00",X"00",X"01",X"32",X"00",X"02",X"00",X"00",X"01",X"3C",X"01",X"01",X"00",X"00",X"01",X"50", + X"01",X"01",X"00",X"01",X"1E",X"01",X"01",X"00",X"00",X"01",X"3C",X"00",X"01",X"00",X"00",X"01", + X"50",X"00",X"01",X"00",X"00",X"01",X"1E",X"00",X"00",X"03",X"07",X"00",X"05",X"01",X"00",X"02", + X"00",X"40",X"80",X"00",X"60",X"BF",X"51",X"10",X"E0",X"CD",X"ED",X"06",X"3E",X"01",X"32",X"AC", + X"4C",X"32",X"00",X"50",X"32",X"4B",X"4D",X"CD",X"5E",X"02",X"FB",X"06",X"01",X"97",X"32",X"14", + X"4C",X"C5",X"CD",X"B4",X"02",X"CD",X"12",X"06",X"11",X"A9",X"97",X"42",X"A7",X"10",X"1E",X"F6", + X"42",X"B6",X"10",X"27",X"D6",X"42",X"E0",X"10",X"39",X"F6",X"42",X"05",X"11",X"30",X"57",X"42", + X"42",X"11",X"28",X"57",X"42",X"4C",X"11",X"3C",X"57",X"42",X"57",X"11",X"50",X"57",X"42",X"61", + X"11",X"4A",X"57",X"42",X"6C",X"11",X"FF",X"20",X"20",X"53",X"55",X"50",X"45",X"52",X"20",X"20", + X"47",X"4C",X"4F",X"42",X"FF",X"FF",X"41",X"4C",X"4C",X"45",X"20",X"46",X"52",X"55",X"45",X"43", + X"48",X"54",X"45",X"20",X"53",X"55",X"43",X"48",X"45",X"4E",X"FF",X"FE",X"5A",X"55",X"4D",X"20", + X"4E",X"41",X"45",X"43",X"48",X"53",X"54",X"45",X"4E",X"20",X"42",X"49",X"4C",X"44",X"FF",X"FF", + X"54",X"41",X"53",X"54",X"45",X"20",X"52",X"55",X"46",X"54",X"20",X"4C",X"49",X"46",X"54",X"20", + X"FF",X"FE",X"48",X"45",X"42",X"45",X"4C",X"3E",X"4F",X"42",X"45",X"4E",X"20",X"55",X"4E",X"54", + X"45",X"4E",X"20",X"FF",X"FF",X"4D",X"49",X"54",X"20",X"44",X"45",X"52",X"20",X"54",X"41",X"53", + X"54",X"45",X"20",X"20",X"20",X"20",X"20",X"20",X"FF",X"FE",X"41",X"55",X"46",X"20",X"44",X"49", + X"45",X"20",X"56",X"45",X"52",X"46",X"4F",X"4C",X"47",X"45",X"52",X"20",X"20",X"FF",X"FE",X"53", + X"50",X"52",X"49",X"4E",X"47",X"45",X"4E",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"FF",X"FF",X"2E",X"2E",X"2E",X"47",X"41",X"54",X"4F",X"52",X"FF",X"FF",X"2E",X"2E",X"2E",X"46", + X"52",X"4F",X"47",X"47",X"59",X"FF",X"FF",X"2E",X"2E",X"2E",X"42",X"55",X"4E",X"4E",X"59",X"FF", + X"FF",X"2E",X"2E",X"2E",X"4D",X"4F",X"4E",X"4B",X"45",X"59",X"FF",X"FF",X"2E",X"2E",X"2E",X"50", + X"4F",X"52",X"4B",X"45",X"52",X"FF",X"FF",X"F5",X"D5",X"E5",X"21",X"D7",X"4E",X"35",X"20",X"11", + X"36",X"05",X"2B",X"35",X"28",X"09",X"21",X"DC",X"46",X"7E",X"EE",X"0D",X"77",X"18",X"02",X"36", + X"01",X"21",X"33",X"4C",X"97",X"BE",X"28",X"03",X"35",X"18",X"2E",X"21",X"32",X"4C",X"97",X"34", + X"CB",X"46",X"28",X"02",X"3E",X"03",X"32",X"02",X"4C",X"2A",X"34",X"4C",X"5E",X"23",X"56",X"23", + X"D5",X"5E",X"23",X"56",X"23",X"3A",X"02",X"4C",X"A7",X"7E",X"20",X"06",X"23",X"22",X"34",X"4C", + X"3E",X"05",X"32",X"33",X"4C",X"E1",X"CD",X"6B",X"04",X"E1",X"D1",X"F1",X"C9",X"06",X"97",X"34", + X"CB",X"46",X"28",X"02",X"3E",X"03",X"32",X"02",X"4C",X"2A",X"34",X"4C",X"5E",X"23",X"56",X"23", + X"D5",X"5E",X"23",X"56",X"23",X"3A",X"02",X"4C",X"A7",X"7E",X"20",X"06",X"23",X"22",X"34",X"4C", + X"3E",X"05",X"32",X"33",X"4C",X"E1",X"CD",X"6B",X"04",X"E1",X"D1",X"F1",X"C9",X"06",X"8B",X"B0", + X"E5",X"D5",X"C5",X"4F",X"21",X"80",X"14",X"46",X"04",X"05",X"28",X"0E",X"23",X"5E",X"23",X"56", + X"23",X"DD",X"1A",X"86",X"23",X"BE",X"20",X"16",X"10",X"F2",X"AF",X"ED",X"47",X"79",X"C1",X"D1", + X"E1",X"C3",X"7F",X"3B",X"45",X"FF",X"06",X"20",X"54",X"49",X"48",X"FF",X"FF",X"F5",X"C5",X"97", + X"CD",X"B4",X"02",X"3E",X"06",X"CD",X"1A",X"03",X"CD",X"12",X"06",X"11",X"E5",X"12",X"21",X"A6", + X"42",X"CD",X"6B",X"04",X"11",X"13",X"12",X"21",X"07",X"40",X"CD",X"65",X"04",X"11",X"F6",X"12", + X"21",X"90",X"43",X"CD",X"65",X"04",X"11",X"00",X"13",X"21",X"70",X"42",X"CD",X"6B",X"04",X"11", + X"14",X"13",X"21",X"B2",X"42",X"CD",X"6B",X"04",X"11",X"3A",X"13",X"21",X"B5",X"42",X"CD",X"6B", + X"04",X"3A",X"40",X"50",X"E6",X"80",X"21",X"CC",X"42",X"11",X"58",X"13",X"28",X"03",X"11",X"69", + X"13",X"CD",X"6B",X"04",X"32",X"C0",X"50",X"3A",X"80",X"50",X"E6",X"3F",X"4F",X"21",X"50",X"43", + X"06",X"06",X"0F",X"11",X"4E",X"13",X"30",X"03",X"11",X"53",X"13",X"E5",X"CD",X"6B",X"04",X"E1", + X"23",X"10",X"EF",X"79",X"E6",X"03",X"EE",X"03",X"C6",X"33",X"32",X"B0",X"42",X"79",X"E6",X"1C", + X"EE",X"1C",X"0F",X"0F",X"4F",X"C6",X"31",X"32",X"92",X"40",X"0C",X"41",X"21",X"33",X"42",X"36", + X"1E",X"21",X"13",X"42",X"11",X"E0",X"FF",X"3E",X"16",X"CD",X"57",X"04",X"3E",X"08",X"91",X"28", + X"06",X"47",X"3E",X"17",X"CD",X"57",X"04",X"36",X"1F",X"3A",X"40",X"50",X"CB",X"77",X"20",X"91", + X"C1",X"F1",X"C3",X"6D",X"10",X"FF",X"09",X"43",X"4F",X"4E",X"46",X"49",X"47",X"55",X"52",X"41", + X"54",X"49",X"4F",X"4E",X"FF",X"FF",X"FF",X"04",X"31",X"32",X"33",X"34",X"35",X"36",X"FF",X"FF", + X"FF",X"06",X"47",X"4C",X"4F",X"42",X"53",X"20",X"50",X"45",X"52",X"20",X"43",X"52",X"45",X"44", + X"49",X"54",X"FF",X"FF",X"44",X"49",X"46",X"46",X"49",X"43",X"55",X"4C",X"54",X"59",X"20",X"4C", + X"45",X"56",X"45",X"4C",X"FF",X"FE",X"45",X"41",X"53",X"59",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"48",X"41",X"52",X"44",X"FF",X"FF",X"41",X"54",X"54",X"52",X"41",X"43", + X"54",X"20",X"4D",X"4F",X"44",X"45",X"20",X"53",X"4F",X"55",X"4E",X"44",X"FF",X"FF",X"4F",X"4E", + X"20",X"FF",X"FF",X"4F",X"46",X"46",X"FF",X"FF",X"FF",X"0E",X"20",X"54",X"41",X"42",X"4C",X"45", + X"20",X"4D",X"4F",X"44",X"45",X"4C",X"20",X"FF",X"FF",X"FF",X"0E",X"55",X"50",X"52",X"49",X"47", + X"48",X"54",X"20",X"4D",X"4F",X"44",X"45",X"4C",X"FF",X"FF",X"F5",X"C5",X"97",X"CD",X"B4",X"02", + X"CD",X"12",X"06",X"11",X"F1",X"13",X"21",X"86",X"42",X"CD",X"6B",X"04",X"21",X"00",X"40",X"11", + X"AD",X"4C",X"CD",X"39",X"14",X"21",X"00",X"44",X"13",X"CD",X"39",X"14",X"21",X"00",X"4C",X"13", + X"CD",X"39",X"14",X"01",X"AD",X"4C",X"3E",X"03",X"21",X"70",X"43",X"11",X"01",X"14",X"F5",X"E5", + X"CD",X"6B",X"04",X"D5",X"11",X"1F",X"14",X"0A",X"E6",X"0F",X"28",X"03",X"11",X"2C",X"14",X"CD", + X"6B",X"04",X"11",X"40",X"FF",X"19",X"D1",X"CD",X"6B",X"04",X"D5",X"11",X"1F",X"14",X"0A",X"E6", + X"F0",X"28",X"03",X"11",X"2C",X"14",X"CD",X"6B",X"04",X"D1",X"E1",X"23",X"23",X"F1",X"03",X"3D", + X"20",X"CC",X"11",X"13",X"12",X"21",X"07",X"40",X"CD",X"65",X"04",X"CD",X"FB",X"11",X"C1",X"F1", + X"C9",X"FF",X"09",X"53",X"54",X"41",X"54",X"49",X"43",X"20",X"52",X"41",X"4D",X"FF",X"06",X"FF", + X"FF",X"34",X"4B",X"20",X"FF",X"FF",X"34",X"4E",X"20",X"FF",X"FF",X"34",X"4C",X"20",X"FF",X"FF", + X"34",X"50",X"20",X"FF",X"FF",X"34",X"4D",X"20",X"FF",X"FF",X"34",X"52",X"20",X"FF",X"FF",X"FF", + X"0E",X"4F",X"4B",X"20",X"20",X"20",X"20",X"20",X"FF",X"06",X"FF",X"FF",X"FF",X"FF",X"4E",X"4F", + X"54",X"20",X"4F",X"4B",X"20",X"FF",X"06",X"FF",X"FF",X"97",X"01",X"04",X"00",X"E5",X"C5",X"F5", + X"4E",X"77",X"AE",X"EB",X"B6",X"77",X"EB",X"71",X"F1",X"23",X"10",X"F3",X"C1",X"0D",X"20",X"EE", + X"E1",X"3D",X"FE",X"FE",X"20",X"E4",X"C9",X"F5",X"C5",X"97",X"CD",X"B4",X"02",X"CD",X"12",X"06", + X"11",X"A4",X"14",X"21",X"86",X"42",X"CD",X"6B",X"04",X"21",X"00",X"20",X"01",X"1F",X"FE",X"CD", + X"C1",X"14",X"F5",X"21",X"00",X"00",X"01",X"20",X"00",X"CD",X"C1",X"14",X"01",X"FE",X"3F",X"11", + X"09",X"00",X"3F",X"00",X"00",X"40",X"3F",X"00",X"00",X"80",X"3F",X"00",X"00",X"C0",X"3F",X"00", + X"00",X"80",X"3F",X"00",X"00",X"40",X"3F",X"00",X"00",X"C0",X"3F",X"00",X"00",X"C0",X"3F",X"00", + X"00",X"40",X"3F",X"00",X"00",X"FF",X"45",X"50",X"52",X"4F",X"4D",X"20",X"43",X"48",X"45",X"43", + X"4B",X"FF",X"FF",X"FF",X"FF",X"55",X"32",X"20",X"FF",X"FF",X"FF",X"FF",X"CC",X"33",X"20",X"FF", + X"FF",X"97",X"86",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"C9",X"F5",X"CD",X"6B",X"04",X"0A",X"C1", + X"11",X"1F",X"14",X"B8",X"28",X"04",X"11",X"2C",X"14",X"78",X"F5",X"CD",X"6B",X"04",X"3E",X"0B", + X"32",X"02",X"4C",X"F1",X"CD",X"35",X"04",X"C9",X"F5",X"C5",X"97",X"32",X"3B",X"4C",X"32",X"A7", + X"4C",X"CD",X"E9",X"05",X"3E",X"06",X"CD",X"1A",X"03",X"3E",X"13",X"CD",X"15",X"03",X"06",X"1E", + X"CD",X"72",X"03",X"CD",X"FB",X"11",X"C1",X"F1",X"C3",X"6D",X"10",X"F5",X"C5",X"97",X"32",X"08", + X"4C",X"11",X"AB",X"4C",X"21",X"AA",X"4C",X"3C",X"12",X"77",X"97",X"D5",X"E5",X"CD",X"B4",X"02", + X"CD",X"12",X"06",X"11",X"06",X"16",X"21",X"86",X"42",X"CD",X"6B",X"04",X"11",X"15",X"16",X"21", + X"8A",X"43",X"CD",X"6B",X"04",X"11",X"70",X"16",X"21",X"D5",X"42",X"CD",X"6B",X"04",X"11",X"13", + X"12",X"21",X"07",X"40",X"CD",X"65",X"04",X"E1",X"D1",X"1A",X"E5",X"21",X"95",X"41",X"CD",X"F3", + X"03",X"E1",X"06",X"70",X"CD",X"65",X"03",X"32",X"C0",X"50",X"3A",X"40",X"50",X"CB",X"77",X"CA", + X"01",X"16",X"CB",X"6F",X"28",X"2C",X"3A",X"00",X"50",X"CB",X"47",X"28",X"06",X"CB",X"5F",X"28", + X"11",X"18",X"E4",X"34",X"1A",X"C6",X"01",X"27",X"FE",X"25",X"20",X"03",X"3E",X"01",X"77",X"12", + X"18",X"C7",X"35",X"1A",X"D6",X"01",X"27",X"A7",X"20",X"05",X"3E",X"18",X"77",X"3E",X"24",X"12", + X"18",X"B7",X"1A",X"32",X"4D",X"4D",X"7E",X"32",X"4C",X"4D",X"00",X"FE",X"01",X"28",X"18",X"3D", + X"47",X"3A",X"80",X"50",X"E6",X"1C",X"EE",X"1C",X"0F",X"0F",X"3C",X"4F",X"3E",X"01",X"81",X"10", + X"FD",X"FE",X"10",X"38",X"02",X"3E",X"0F",X"32",X"4E",X"4D",X"97",X"32",X"A5",X"4E",X"32",X"16", + X"4C",X"32",X"14",X"4C",X"3C",X"32",X"BB",X"4D",X"32",X"3C",X"4C",X"32",X"37",X"4C",X"D5",X"E5", + X"CD",X"C3",X"27",X"CD",X"E9",X"05",X"11",X"13",X"12",X"21",X"07",X"40",X"CD",X"65",X"04",X"11", + X"7D",X"16",X"21",X"28",X"40",X"CD",X"65",X"04",X"32",X"C0",X"50",X"3A",X"40",X"50",X"CB",X"77", + X"28",X"0A",X"CB",X"6F",X"20",X"F2",X"CD",X"6E",X"06",X"CD",X"B0",X"2E",X"E1",X"D1",X"C3",X"1A", + X"15",X"C1",X"F1",X"C3",X"6D",X"10",X"FF",X"09",X"4C",X"45",X"56",X"45",X"4C",X"20",X"43",X"48", + X"45",X"43",X"4B",X"FF",X"FF",X"FF",X"06",X"4D",X"4F",X"56",X"45",X"20",X"4A",X"4F",X"59",X"53", + X"54",X"49",X"43",X"4B",X"20",X"FF",X"0D",X"55",X"50",X"20",X"FF",X"06",X"4F",X"52",X"20",X"FF", + X"08",X"44",X"4F",X"57",X"4E",X"FF",X"06",X"FF",X"FE",X"54",X"4F",X"20",X"53",X"45",X"4C",X"45", + X"43",X"54",X"20",X"4C",X"45",X"56",X"45",X"4C",X"20",X"4E",X"55",X"4D",X"42",X"45",X"52",X"2E", + X"FF",X"FE",X"48",X"49",X"54",X"20",X"FF",X"0E",X"43",X"41",X"4C",X"4C",X"20",X"FF",X"06",X"54", + X"4F",X"20",X"53",X"45",X"54",X"55",X"50",X"20",X"4C",X"45",X"56",X"45",X"4C",X"2E",X"FF",X"FF", + X"FF",X"07",X"4C",X"45",X"56",X"45",X"4C",X"20",X"4E",X"4F",X"3A",X"FF",X"FF",X"FF",X"06",X"59", + X"41",X"4C",X"50",X"20",X"4F",X"54",X"FF",X"0E",X"20",X"4C",X"4C",X"41",X"43",X"FF",X"06",X"20", + X"54",X"49",X"48",X"FF",X"FF",X"F5",X"C5",X"CD",X"ED",X"06",X"97",X"32",X"14",X"4C",X"CD",X"B4", + X"02",X"CD",X"12",X"06",X"32",X"08",X"4C",X"11",X"AB",X"4C",X"21",X"AA",X"4C",X"12",X"77",X"D5", + X"E5",X"11",X"2D",X"17",X"21",X"86",X"42",X"CD",X"6B",X"04",X"11",X"3C",X"17",X"21",X"8A",X"43", + X"CD",X"6B",X"04",X"11",X"99",X"17",X"21",X"D5",X"42",X"CD",X"6B",X"04",X"11",X"13",X"12",X"21", + X"07",X"40",X"CD",X"65",X"04",X"E1",X"D1",X"1A",X"E5",X"21",X"95",X"41",X"CD",X"F3",X"03",X"E1", + X"06",X"70",X"CD",X"65",X"03",X"32",X"C0",X"50",X"3A",X"40",X"50",X"CB",X"77",X"28",X"36",X"CB", + X"6F",X"28",X"2C",X"3A",X"00",X"50",X"CB",X"47",X"28",X"06",X"CB",X"5F",X"28",X"10",X"18",X"E5", + X"34",X"1A",X"C6",X"01",X"27",X"FE",X"23",X"20",X"02",X"97",X"77",X"12",X"18",X"C9",X"35",X"1A", + X"D6",X"01",X"27",X"FE",X"99",X"20",X"05",X"3E",X"16",X"77",X"3E",X"22",X"12",X"18",X"B8",X"7E", + X"CD",X"7A",X"09",X"18",X"B2",X"CD",X"ED",X"06",X"C1",X"F1",X"C3",X"6D",X"10",X"FF",X"09",X"53", + X"4F",X"55",X"4E",X"44",X"20",X"43",X"48",X"45",X"43",X"4B",X"FF",X"FF",X"FF",X"06",X"4D",X"4F", + X"56",X"45",X"20",X"4A",X"4F",X"59",X"53",X"54",X"49",X"43",X"4B",X"20",X"FF",X"0D",X"55",X"50", + X"20",X"FF",X"06",X"4F",X"52",X"20",X"FF",X"08",X"44",X"4F",X"57",X"4E",X"FF",X"06",X"FF",X"FE", + X"54",X"4F",X"20",X"53",X"45",X"4C",X"45",X"43",X"54",X"20",X"53",X"4F",X"55",X"4E",X"44",X"20", + X"4E",X"55",X"4D",X"42",X"45",X"52",X"2E",X"FF",X"FE",X"48",X"49",X"54",X"20",X"FF",X"0E",X"43", + X"41",X"4C",X"4C",X"20",X"FF",X"06",X"54",X"4F",X"20",X"45",X"58",X"45",X"43",X"55",X"54",X"45", + X"20",X"53",X"4F",X"55",X"4E",X"44",X"2E",X"FF",X"FF",X"FF",X"07",X"53",X"4F",X"55",X"4E",X"44", + X"20",X"4E",X"4F",X"3A",X"FF",X"FF",X"F5",X"C5",X"97",X"CD",X"B4",X"02",X"CD",X"12",X"06",X"11", + X"44",X"18",X"21",X"86",X"42",X"CD",X"6B",X"04",X"11",X"54",X"18",X"21",X"4A",X"43",X"CD",X"6B", + X"04",X"11",X"9F",X"18",X"21",X"50",X"43",X"CD",X"6B",X"04",X"11",X"D0",X"18",X"21",X"10",X"41", + X"CD",X"6B",X"04",X"11",X"13",X"12",X"21",X"07",X"40",X"CD",X"65",X"04",X"97",X"32",X"5A",X"50", + X"06",X"04",X"11",X"40",X"18",X"21",X"56",X"50",X"1A",X"77",X"13",X"23",X"10",X"FA",X"3A",X"40", + X"50",X"5F",X"2F",X"E6",X"0F",X"4F",X"3A",X"00",X"50",X"57",X"2F",X"E6",X"0F",X"47",X"CB",X"6B", + X"20",X"02",X"CB",X"E0",X"CB",X"6A",X"20",X"02",X"CB",X"E8",X"CB",X"63",X"20",X"02",X"CB",X"E1", + X"CB",X"7A",X"20",X"02",X"CB",X"E9",X"78",X"B1",X"3E",X"0A",X"20",X"01",X"97",X"32",X"5A",X"50", + X"32",X"C0",X"50",X"78",X"21",X"50",X"47",X"CD",X"0C",X"19",X"79",X"21",X"10",X"45",X"CD",X"0C", + X"19",X"3A",X"40",X"50",X"CB",X"77",X"20",X"B6",X"CD",X"ED",X"06",X"C1",X"F1",X"C3",X"6D",X"10", + X"02",X"01",X"00",X"00",X"FF",X"09",X"42",X"55",X"54",X"54",X"4F",X"4E",X"20",X"43",X"48",X"45", + X"43",X"4B",X"FF",X"FF",X"FF",X"06",X"20",X"20",X"20",X"44",X"45",X"50",X"52",X"45",X"53",X"53", + X"45",X"44",X"20",X"42",X"55",X"54",X"54",X"4F",X"4E",X"53",X"FF",X"FE",X"20",X"20",X"20",X"41", + X"52",X"45",X"20",X"48",X"49",X"47",X"48",X"4C",X"49",X"47",X"48",X"54",X"45",X"44",X"2E",X"FF", + X"FE",X"FF",X"FE",X"FF",X"0D",X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"31",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"32",X"FF",X"FF",X"FF", + X"0C",X"55",X"50",X"FF",X"FE",X"FF",X"FE",X"4C",X"45",X"46",X"54",X"FF",X"FE",X"FF",X"FE",X"52", + X"49",X"47",X"48",X"54",X"FF",X"FE",X"FF",X"FE",X"44",X"4F",X"57",X"4E",X"FF",X"FE",X"FF",X"FE", + X"43",X"41",X"4C",X"4C",X"FF",X"FE",X"FF",X"FE",X"43",X"4F",X"49",X"4E",X"49",X"4E",X"FF",X"FF", + X"FF",X"0C",X"20",X"20",X"20",X"20",X"55",X"50",X"FF",X"FE",X"FF",X"FE",X"20",X"20",X"4C",X"45", + X"46",X"54",X"FF",X"FE",X"FF",X"FE",X"20",X"52",X"49",X"47",X"48",X"54",X"FF",X"FE",X"FF",X"FE", + X"20",X"20",X"44",X"4F",X"57",X"4E",X"FF",X"FE",X"FF",X"FE",X"20",X"20",X"43",X"41",X"4C",X"4C", + X"FF",X"FE",X"FF",X"FE",X"45",X"4E",X"45",X"52",X"47",X"59",X"FF",X"FF",X"C5",X"06",X"06",X"0F", + X"F5",X"C5",X"3E",X"0C",X"30",X"02",X"3E",X"08",X"11",X"E0",X"FF",X"06",X"06",X"CD",X"57",X"04", + X"11",X"C2",X"00",X"19",X"C1",X"F1",X"10",X"E7",X"C1",X"C9",X"D5",X"FD",X"21",X"00",X"00",X"7E", + X"16",X"00",X"5F",X"3E",X"06",X"32",X"00",X"4C",X"FD",X"19",X"2B",X"10",X"F2",X"32",X"C0",X"50", + X"0D",X"20",X"EC",X"D1",X"FD",X"19",X"FD",X"29",X"FD",X"29",X"FD",X"E5",X"E1",X"CB",X"3C",X"CB", + X"1D",X"00",X"21",X"5D",X"37",X"E9",X"CD",X"9E",X"19",X"CD",X"C6",X"1A",X"CD",X"C3",X"27",X"32", + X"C0",X"50",X"CD",X"B0",X"2E",X"3A",X"A5",X"4E",X"FE",X"01",X"28",X"05",X"CD",X"98",X"1A",X"18", + X"EB",X"CD",X"D4",X"1A",X"3A",X"3A",X"4C",X"FE",X"01",X"20",X"DE",X"CD",X"67",X"37",X"3A",X"36", + X"4C",X"A7",X"CA",X"93",X"3B",X"97",X"32",X"14",X"4C",X"3C",X"32",X"15",X"4C",X"CD",X"00",X"1A", + X"18",X"C4",X"11",X"00",X"00",X"ED",X"53",X"10",X"4C",X"ED",X"53",X"12",X"4C",X"C9",X"3A",X"80", + X"50",X"E6",X"1C",X"EE",X"1C",X"0F",X"0F",X"C6",X"02",X"32",X"92",X"4C",X"32",X"31",X"01",X"3A", + X"80",X"50",X"E6",X"03",X"EE",X"03",X"C6",X"03",X"21",X"38",X"4C",X"77",X"32",X"9F",X"4C",X"C3", + X"B0",X"27",X"3A",X"37",X"4C",X"32",X"39",X"4C",X"FE",X"01",X"28",X"04",X"7E",X"32",X"A1",X"4C", + X"F3",X"DB",X"64",X"3E",X"12",X"00",X"0F",X"47",X"DB",X"01",X"FB",X"97",X"21",X"96",X"4C",X"77", + X"23",X"10",X"FC",X"32",X"16",X"4C",X"3C",X"32",X"A0",X"4C",X"32",X"A2",X"4C",X"32",X"4C",X"4D", + X"32",X"4F",X"4D",X"32",X"4D",X"4D",X"32",X"50",X"4D",X"32",X"4E",X"4D",X"32",X"51",X"4D",X"C9", + X"21",X"36",X"4C",X"E5",X"3E",X"01",X"32",X"4B",X"4D",X"CD",X"5E",X"02",X"97",X"CD",X"BD",X"02", + X"CD",X"12",X"06",X"11",X"6D",X"1A",X"21",X"2F",X"42",X"CD",X"6B",X"04",X"E1",X"7E",X"E5",X"11", + X"7F",X"1A",X"21",X"70",X"42",X"FE",X"01",X"28",X"06",X"11",X"89",X"1A",X"21",X"B0",X"42",X"CD", + X"6B",X"04",X"E1",X"3A",X"40",X"50",X"47",X"CB",X"68",X"0E",X"01",X"28",X"0A",X"7E",X"FE",X"02", + X"38",X"16",X"CB",X"70",X"20",X"12",X"0C",X"7E",X"91",X"27",X"77",X"79",X"32",X"37",X"4C",X"32", + X"17",X"4C",X"3E",X"06",X"CD",X"7A",X"09",X"C9",X"32",X"C0",X"50",X"3A",X"03",X"4C",X"3C",X"FE", + X"0E",X"38",X"02",X"3E",X"03",X"32",X"03",X"4C",X"CD",X"E4",X"04",X"18",X"B0",X"FF",X"06",X"50", + X"52",X"45",X"53",X"53",X"FF",X"FE",X"FF",X"FE",X"53",X"54",X"41",X"52",X"54",X"FF",X"FF",X"31", + X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"FF",X"FF",X"31",X"20",X"4F",X"52",X"20",X"32",X"20", + X"50",X"4C",X"41",X"59",X"45",X"52",X"FF",X"FF",X"97",X"CD",X"BD",X"02",X"3A",X"4B",X"4D",X"01", + X"51",X"4D",X"21",X"4F",X"4D",X"FE",X"01",X"20",X"06",X"01",X"4E",X"4D",X"21",X"4C",X"4D",X"7E", + X"34",X"23",X"7E",X"C6",X"01",X"27",X"77",X"3A",X"80",X"50",X"E6",X"1C",X"EE",X"1C",X"0F",X"0F", + X"3C",X"57",X"0A",X"82",X"02",X"C9",X"21",X"9F",X"4C",X"3A",X"4B",X"4D",X"FE",X"01",X"28",X"02", + X"23",X"23",X"35",X"C9",X"97",X"CD",X"BD",X"02",X"32",X"A5",X"4E",X"21",X"4B",X"4D",X"3C",X"BE", + X"11",X"9F",X"4C",X"28",X"03",X"11",X"A1",X"4C",X"1A",X"A7",X"28",X"41",X"3A",X"39",X"4C",X"FE", + X"02",X"28",X"05",X"97",X"32",X"3A",X"4C",X"C9",X"7E",X"EE",X"03",X"77",X"CD",X"5E",X"02",X"97", + X"32",X"3A",X"4C",X"3E",X"05",X"CD",X"7A",X"09",X"F5",X"97",X"E5",X"CD",X"BD",X"02",X"11",X"7B", + X"1B",X"21",X"6F",X"42",X"CD",X"6B",X"04",X"E1",X"7E",X"FE",X"02",X"3E",X"32",X"28",X"01",X"3D", + X"32",X"90",X"41",X"06",X"B4",X"CD",X"72",X"03",X"F1",X"CD",X"A1",X"03",X"C9",X"CD",X"41",X"1B", + X"3A",X"39",X"4C",X"3D",X"32",X"39",X"4C",X"FE",X"01",X"28",X"BD",X"3E",X"01",X"32",X"3A",X"4C", + X"C9",X"E5",X"11",X"66",X"1B",X"21",X"6F",X"42",X"CD",X"6B",X"04",X"E1",X"3E",X"01",X"BE",X"3E", + X"32",X"C2",X"55",X"1B",X"3D",X"32",X"90",X"41",X"3E",X"11",X"CD",X"7A",X"09",X"06",X"B4",X"CD", + X"72",X"03",X"CD",X"A1",X"03",X"C9",X"FF",X"0D",X"47",X"41",X"4D",X"45",X"20",X"4F",X"56",X"45", + X"52",X"FF",X"FE",X"50",X"4C",X"41",X"59",X"45",X"52",X"FF",X"FF",X"FF",X"0E",X"47",X"45",X"54", + X"20",X"52",X"45",X"41",X"44",X"59",X"FF",X"FE",X"50",X"4C",X"41",X"59",X"45",X"52",X"FF",X"FF", + X"2A",X"12",X"4C",X"4E",X"23",X"46",X"23",X"E5",X"2A",X"10",X"4C",X"09",X"22",X"10",X"4C",X"C1", + X"ED",X"43",X"12",X"4C",X"78",X"FE",X"0F",X"C2",X"F0",X"20",X"79",X"FE",X"D8",X"C2",X"F0",X"20", + X"11",X"B9",X"A8",X"19",X"7C",X"E6",X"3F",X"67",X"CD",X"92",X"19",X"CD",X"F0",X"20",X"D1",X"E9", + X"13",X"1A",X"E5",X"26",X"00",X"6F",X"E6",X"80",X"28",X"01",X"25",X"19",X"EB",X"E1",X"C3",X"5D", + X"1C",X"E5",X"23",X"23",X"36",X"00",X"E1",X"C9",X"3A",X"2C",X"4F",X"21",X"00",X"40",X"0E",X"21", + X"F3",X"ED",X"A2",X"5F",X"07",X"83",X"07",X"83",X"07",X"16",X"00",X"5F",X"0D",X"ED",X"AA",X"FB", + X"21",X"D8",X"4E",X"19",X"11",X"0B",X"00",X"19",X"7E",X"2B",X"A7",X"20",X"5D",X"3A",X"2C",X"4F", + X"A7",X"28",X"57",X"E5",X"11",X"FB",X"FF",X"19",X"46",X"23",X"4E",X"23",X"23",X"36",X"00",X"CD", + X"F9",X"20",X"E1",X"3A",X"35",X"4F",X"A7",X"C0",X"23",X"23",X"35",X"C0",X"3E",X"13",X"CD",X"7A", + X"09",X"3A",X"29",X"4E",X"77",X"2B",X"36",X"A0",X"2B",X"E5",X"11",X"FA",X"FF",X"19",X"97",X"77", + X"2B",X"77",X"2B",X"2B",X"E5",X"CD",X"99",X"21",X"E1",X"E5",X"23",X"23",X"23",X"23",X"70",X"23", + X"71",X"E1",X"2B",X"7E",X"3D",X"07",X"07",X"16",X"00",X"5F",X"21",X"4A",X"2B",X"19",X"5E",X"23", + X"56",X"E1",X"72",X"2B",X"73",X"1B",X"3E",X"FD",X"18",X"04",X"56",X"2B",X"5E",X"1A",X"FE",X"FF", + X"CA",X"D1",X"1B",X"FE",X"FE",X"CA",X"C0",X"1B",X"FE",X"FD",X"E5",X"13",X"1A",X"28",X"0A",X"1B", + X"23",X"23",X"7E",X"FE",X"C0",X"C2",X"E5",X"1C",X"1A",X"E1",X"2B",X"77",X"01",X"FB",X"FF",X"09", + X"13",X"1A",X"86",X"FE",X"10",X"28",X"33",X"CB",X"7F",X"20",X"3B",X"77",X"23",X"13",X"1A",X"86", + X"FE",X"0A",X"28",X"40",X"FE",X"FF",X"28",X"44",X"77",X"23",X"13",X"1A",X"86",X"77",X"23",X"13", + X"1A",X"86",X"77",X"13",X"2B",X"1A",X"86",X"47",X"13",X"23",X"1A",X"86",X"4F",X"13",X"23",X"23", + X"E5",X"23",X"73",X"23",X"72",X"E1",X"CD",X"F9",X"20",X"C9",X"2B",X"2B",X"7E",X"3C",X"E6",X"0F", + X"77",X"23",X"23",X"97",X"18",X"C5",X"2B",X"2B",X"7E",X"3D",X"E6",X"0F",X"77",X"23",X"23",X"1A", + X"C6",X"10",X"18",X"B7",X"2B",X"2B",X"34",X"23",X"23",X"97",X"18",X"BC",X"2B",X"2B",X"35",X"23", + X"23",X"3E",X"09",X"18",X"B3",X"D5",X"E5",X"7E",X"32",X"2E",X"4F",X"3A",X"14",X"4C",X"FE",X"01", + X"20",X"09",X"CD",X"3D",X"3C",X"3A",X"30",X"4C",X"4F",X"18",X"43",X"3A",X"2C",X"4F",X"A7",X"20", + X"3B",X"CD",X"74",X"01",X"3A",X"0D",X"4C",X"4F",X"3E",X"FF",X"32",X"0D",X"4C",X"79",X"2F",X"0E", + X"80",X"CB",X"77",X"28",X"04",X"CB",X"E1",X"18",X"25",X"CB",X"6F",X"28",X"04",X"CB",X"D9",X"18", + X"1D",X"E6",X"0F",X"28",X"19",X"CB",X"D1",X"47",X"E6",X"06",X"28",X"06",X"CB",X"57",X"28",X"0E", + X"18",X"06",X"CB",X"C9",X"CB",X"40",X"28",X"06",X"CB",X"C1",X"18",X"02",X"0E",X"80",X"E1",X"E5", + X"3A",X"2C",X"4F",X"A7",X"28",X"73",X"11",X"FA",X"FF",X"19",X"5E",X"23",X"56",X"06",X"0B",X"CD", + X"B4",X"1F",X"A7",X"28",X"64",X"06",X"0B",X"CD",X"AE",X"1F",X"A7",X"28",X"5C",X"23",X"23",X"23", + X"23",X"23",X"06",X"05",X"CD",X"B4",X"1F",X"A7",X"28",X"28",X"06",X"05",X"CD",X"AE",X"1F",X"A7", + X"28",X"20",X"3A",X"E3",X"4E",X"CB",X"67",X"20",X"1C",X"E6",X"86",X"FE",X"86",X"28",X"13",X"7E", + X"A7",X"28",X"0F",X"FE",X"A0",X"28",X"0B",X"FE",X"C0",X"28",X"07",X"3E",X"01",X"32",X"A5",X"4E", + X"18",X"27",X"3A",X"E3",X"4E",X"FE",X"99",X"20",X"20",X"7E",X"A7",X"28",X"1C",X"FE",X"C0",X"28", + X"18",X"E6",X"86",X"FE",X"86",X"28",X"12",X"0E",X"C0",X"11",X"F5",X"FF",X"19",X"7E",X"CD",X"23", + X"05",X"3E",X"0E",X"CD",X"7A",X"09",X"C3",X"74",X"1F",X"E1",X"E5",X"11",X"F8",X"FF",X"19",X"7E", + X"A7",X"28",X"06",X"E1",X"D1",X"1A",X"C3",X"79",X"1C",X"23",X"7E",X"A7",X"28",X"28",X"79",X"E6", + X"86",X"FE",X"86",X"3A",X"2E",X"4F",X"20",X"01",X"79",X"E6",X"87",X"F6",X"86",X"4F",X"06",X"04", + X"E6",X"01",X"20",X"02",X"06",X"FC",X"11",X"07",X"00",X"19",X"CD",X"0F",X"22",X"3A",X"2E",X"4F", + X"B9",X"28",X"D0",X"C3",X"74",X"1F",X"CD",X"12",X"21",X"3A",X"2C",X"4F",X"A7",X"28",X"15",X"E5", + X"11",X"07",X"00",X"19",X"CB",X"71",X"20",X"04",X"CB",X"76",X"28",X"04",X"E1",X"C3",X"74",X"1F", + X"CD",X"C4",X"1F",X"E1",X"2B",X"2B",X"CD",X"DF",X"21",X"22",X"30",X"4F",X"3A",X"2C",X"4F",X"A7", + X"20",X"32",X"CB",X"6E",X"28",X"2E",X"CB",X"AE",X"E1",X"E5",X"11",X"F6",X"FF",X"19",X"CD",X"B3", + X"21",X"97",X"77",X"2B",X"77",X"11",X"E0",X"FF",X"19",X"77",X"23",X"77",X"3E",X"06",X"CD",X"23", + X"05",X"3E",X"0F",X"CD",X"7A",X"09",X"21",X"8B",X"4E",X"35",X"20",X"08",X"3E",X"01",X"32",X"A4", + X"4E",X"C3",X"C3",X"1D",X"79",X"FE",X"90",X"CA",X"74",X"1F",X"3A",X"2E",X"4F",X"FE",X"90",X"79", + X"20",X"05",X"0E",X"99",X"C3",X"74",X"1F",X"FE",X"88",X"C2",X"EF",X"1E",X"2A",X"30",X"4F",X"CB", + X"66",X"CA",X"74",X"1F",X"2B",X"CB",X"76",X"C2",X"74",X"1F",X"23",X"23",X"CB",X"76",X"C2",X"74", + X"1F",X"E1",X"E5",X"11",X"FB",X"FF",X"19",X"46",X"11",X"FC",X"FF",X"19",X"7E",X"F5",X"2B",X"7E", + X"22",X"3A",X"4F",X"C5",X"CD",X"F0",X"21",X"3A",X"32",X"4F",X"A1",X"20",X"05",X"C1",X"F1",X"C3", + X"74",X"1F",X"C1",X"F1",X"23",X"E5",X"96",X"3E",X"04",X"F2",X"AE",X"1E",X"ED",X"44",X"11",X"F8", + X"FF",X"19",X"5F",X"7E",X"A7",X"28",X"04",X"E1",X"C3",X"74",X"1F",X"3E",X"04",X"CD",X"7A",X"09", + X"36",X"01",X"23",X"23",X"73",X"23",X"70",X"2A",X"3A",X"4F",X"CD",X"B3",X"21",X"2B",X"2B",X"11", + X"00",X"04",X"19",X"EB",X"E1",X"E5",X"23",X"23",X"73",X"23",X"72",X"3A",X"62",X"4D",X"D6",X"02", + X"12",X"21",X"E0",X"FF",X"19",X"77",X"E1",X"CD",X"DF",X"21",X"CB",X"B6",X"C3",X"74",X"1F",X"E6", + X"86",X"FE",X"86",X"20",X"5F",X"2A",X"30",X"4F",X"CB",X"76",X"20",X"09",X"3A",X"2E",X"4F",X"E6", + X"86",X"FE",X"86",X"20",X"36",X"3A",X"2C",X"4F",X"CB",X"41",X"28",X"08",X"CB",X"5E",X"28",X"11", + X"06",X"04",X"18",X"06",X"CB",X"56",X"28",X"16",X"06",X"FC",X"E1",X"E5",X"CD",X"0F",X"22",X"18", + X"53",X"A7",X"28",X"4E",X"CB",X"56",X"28",X"19",X"79",X"EE",X"01",X"4F",X"18",X"EA",X"A7",X"28", + X"41",X"CB",X"5E",X"28",X"0C",X"79",X"EE",X"01",X"4F",X"18",X"D5",X"3A",X"2C",X"4F",X"A7",X"28", + X"31",X"ED",X"5F",X"E6",X"3F",X"FE",X"20",X"38",X"29",X"E6",X"0F",X"FE",X"08",X"0E",X"84",X"38", + X"1B",X"0C",X"18",X"08",X"FE",X"84",X"20",X"1A",X"CB",X"41",X"28",X"10",X"CB",X"4E",X"28",X"14", + X"3A",X"2C",X"4F",X"A7",X"28",X"0C",X"79",X"EE",X"01",X"4F",X"18",X"08",X"CB",X"46",X"28",X"04", + X"18",X"EE",X"0E",X"80",X"E1",X"3A",X"2E",X"4F",X"B9",X"D1",X"1A",X"CA",X"79",X"1C",X"71",X"CD", + X"40",X"22",X"E5",X"11",X"F5",X"FF",X"19",X"7E",X"07",X"16",X"00",X"5F",X"21",X"9A",X"22",X"19", + X"5E",X"23",X"56",X"79",X"CD",X"6C",X"22",X"07",X"26",X"00",X"6F",X"19",X"5E",X"23",X"56",X"CD", + X"92",X"22",X"E1",X"2B",X"72",X"2B",X"73",X"E1",X"1B",X"3E",X"FD",X"C3",X"5E",X"1C",X"3A",X"DE", + X"4E",X"92",X"18",X"04",X"3A",X"DD",X"4E",X"93",X"CB",X"7F",X"28",X"02",X"ED",X"44",X"B8",X"3E", + X"00",X"D0",X"3C",X"C9",X"3A",X"14",X"4C",X"A7",X"C0",X"4E",X"23",X"23",X"35",X"C0",X"3A",X"2A", + X"4E",X"5F",X"ED",X"5F",X"E6",X"3F",X"FE",X"10",X"30",X"01",X"1C",X"73",X"11",X"F3",X"FF",X"19", + X"7E",X"11",X"0B",X"00",X"19",X"FE",X"01",X"28",X"12",X"FE",X"02",X"28",X"17",X"FE",X"03",X"28", + X"23",X"FE",X"04",X"28",X"48",X"FE",X"05",X"28",X"3C",X"18",X"FE",X"0E",X"84",X"ED",X"5F",X"E6", + X"01",X"B1",X"4F",X"C9",X"0E",X"84",X"ED",X"5F",X"E6",X"11",X"20",X"03",X"0E",X"88",X"C9",X"E6", + X"01",X"B1",X"4F",X"C9",X"7E",X"4F",X"E6",X"86",X"FE",X"86",X"20",X"10",X"11",X"F9",X"FF",X"19", + X"7E",X"A7",X"C0",X"ED",X"5F",X"E6",X"02",X"C0",X"0E",X"84",X"18",X"02",X"0E",X"86",X"ED",X"5F", + X"E6",X"01",X"B1",X"4F",X"C9",X"01",X"06",X"0E",X"11",X"0A",X"20",X"18",X"06",X"01",X"02",X"04", + X"11",X"0B",X"30",X"ED",X"43",X"36",X"4F",X"ED",X"53",X"38",X"4F",X"11",X"F7",X"FF",X"19",X"E5", + X"CD",X"DF",X"21",X"CB",X"76",X"E1",X"23",X"23",X"23",X"20",X"54",X"ED",X"5F",X"E6",X"06",X"28", + X"0D",X"ED",X"5F",X"E6",X"3F",X"FE",X"10",X"0E",X"86",X"DA",X"2E",X"20",X"18",X"04",X"0E",X"88", + X"C9",X"2B",X"3A",X"DD",X"4E",X"96",X"06",X"01",X"38",X"03",X"05",X"ED",X"44",X"4F",X"3A",X"39", + X"4F",X"B9",X"38",X"26",X"ED",X"5F",X"47",X"11",X"06",X"00",X"19",X"7E",X"CB",X"57",X"20",X"05", + X"0E",X"84",X"C3",X"2E",X"20",X"E6",X"01",X"4F",X"3A",X"38",X"4F",X"A0",X"20",X"07",X"3E",X"84", + X"B1",X"EE",X"01",X"4F",X"C9",X"3E",X"84",X"B1",X"4F",X"C9",X"3E",X"84",X"B0",X"4F",X"C9",X"23", + X"ED",X"5F",X"47",X"3A",X"36",X"4F",X"A0",X"28",X"B8",X"46",X"11",X"05",X"00",X"19",X"7E",X"E6", + X"86",X"FE",X"86",X"20",X"1D",X"E5",X"11",X"F9",X"FF",X"19",X"7E",X"E1",X"A7",X"4E",X"C0",X"3A", + X"DE",X"4E",X"90",X"28",X"08",X"ED",X"5F",X"47",X"3A",X"37",X"4F",X"A0",X"C0",X"0E",X"84",X"C3", + X"2E",X"20",X"3A",X"DE",X"4E",X"90",X"06",X"01",X"30",X"01",X"05",X"3E",X"86",X"B0",X"4F",X"C9", + X"ED",X"5F",X"E6",X"03",X"3C",X"32",X"0B",X"4C",X"C9",X"E5",X"3A",X"2D",X"4F",X"07",X"07",X"5F", + X"16",X"00",X"21",X"8C",X"4E",X"19",X"D1",X"1A",X"77",X"23",X"1B",X"1A",X"77",X"23",X"70",X"23", + X"71",X"C9",X"E5",X"11",X"07",X"00",X"19",X"7E",X"CB",X"67",X"20",X"7B",X"A7",X"28",X"78",X"FE", + X"C0",X"28",X"74",X"E6",X"86",X"FE",X"86",X"28",X"6E",X"3A",X"2C",X"4F",X"A7",X"20",X"07",X"7E", + X"E6",X"84",X"FE",X"84",X"28",X"61",X"C5",X"11",X"F6",X"FF",X"19",X"4E",X"23",X"46",X"23",X"23", + X"E5",X"C5",X"06",X"04",X"21",X"AD",X"4E",X"11",X"0C",X"00",X"7E",X"B9",X"28",X"05",X"19",X"10", + X"F9",X"18",X"41",X"23",X"C1",X"7E",X"23",X"90",X"0E",X"10",X"28",X"32",X"FE",X"FF",X"0E",X"0C", + X"20",X"33",X"7E",X"B9",X"38",X"2F",X"11",X"F7",X"FF",X"19",X"7E",X"E1",X"A7",X"28",X"27",X"3A", + X"2C",X"4F",X"A7",X"28",X"12",X"C1",X"0E",X"C0",X"2B",X"2B",X"2B",X"2B",X"7E",X"CD",X"23",X"05", + X"3E",X"0E",X"CD",X"7A",X"09",X"18",X"10",X"3E",X"01",X"32",X"A5",X"4E",X"18",X"08",X"7E",X"B9", + X"30",X"03",X"18",X"D2",X"C1",X"E1",X"C1",X"E1",X"C9",X"7E",X"07",X"07",X"07",X"07",X"06",X"F6", + X"90",X"ED",X"44",X"47",X"23",X"7E",X"3D",X"4F",X"07",X"07",X"81",X"07",X"07",X"07",X"0E",X"18", + X"81",X"4F",X"C9",X"7E",X"3D",X"E5",X"26",X"00",X"6F",X"29",X"29",X"29",X"29",X"29",X"29",X"EB", + X"21",X"00",X"00",X"AF",X"ED",X"52",X"EB",X"E1",X"23",X"7E",X"3D",X"47",X"07",X"07",X"80",X"ED", + X"44",X"A7",X"28",X"06",X"83",X"5F",X"3E",X"FF",X"8A",X"57",X"21",X"9E",X"43",X"19",X"C9",X"3E", + X"06",X"96",X"07",X"07",X"07",X"07",X"2B",X"86",X"16",X"00",X"5F",X"21",X"2B",X"4E",X"19",X"C9", + X"21",X"AD",X"4E",X"11",X"0C",X"00",X"0E",X"08",X"F5",X"96",X"CB",X"7F",X"28",X"02",X"ED",X"44", + X"A7",X"28",X"0A",X"FE",X"01",X"28",X"06",X"CB",X"39",X"19",X"F1",X"18",X"EB",X"F1",X"C9",X"11", + X"F6",X"FF",X"19",X"C5",X"7E",X"CD",X"F0",X"21",X"79",X"2F",X"5F",X"3A",X"32",X"4F",X"A3",X"32", + X"32",X"4F",X"23",X"E5",X"CD",X"DF",X"21",X"CB",X"B6",X"E1",X"11",X"F8",X"FF",X"19",X"36",X"02", + X"23",X"7E",X"23",X"70",X"CD",X"8C",X"30",X"3A",X"34",X"4F",X"B1",X"32",X"34",X"4F",X"C1",X"C9", + X"C5",X"E5",X"7E",X"E6",X"86",X"FE",X"86",X"28",X"20",X"3A",X"2E",X"4F",X"E6",X"86",X"FE",X"86", + X"20",X"17",X"11",X"F6",X"FF",X"19",X"7E",X"CD",X"F0",X"21",X"11",X"F9",X"FF",X"19",X"36",X"00", + X"11",X"08",X"00",X"19",X"CD",X"DF",X"21",X"CB",X"F6",X"E1",X"C1",X"C9",X"C5",X"06",X"09",X"CB", + X"77",X"20",X"1C",X"05",X"CB",X"6F",X"20",X"17",X"05",X"FE",X"99",X"28",X"12",X"05",X"CB",X"67", + X"20",X"0D",X"05",X"CB",X"5F",X"20",X"08",X"05",X"CB",X"57",X"28",X"03",X"E6",X"03",X"47",X"78", + X"C1",X"C9",X"3E",X"FF",X"BA",X"C0",X"18",X"FE",X"FF",X"FF",X"A6",X"22",X"8E",X"23",X"65",X"24", + X"3E",X"25",X"04",X"26",X"E1",X"26",X"B9",X"22",X"DE",X"22",X"03",X"23",X"0C",X"23",X"3C",X"23", + X"4C",X"23",X"5C",X"23",X"15",X"23",X"7B",X"98",X"22",X"0E",X"FD",X"00",X"03",X"00",X"00",X"00", + X"12",X"FD",X"00",X"03",X"00",X"00",X"00",X"16",X"FD",X"00",X"03",X"00",X"00",X"01",X"1A",X"FC", + X"00",X"04",X"00",X"00",X"00",X"1E",X"FD",X"00",X"03",X"00",X"00",X"00",X"FE",X"DC",X"0C",X"03", + X"00",X"FD",X"00",X"00",X"00",X"10",X"03",X"00",X"FD",X"00",X"00",X"00",X"14",X"03",X"00",X"FD", + X"00",X"00",X"01",X"18",X"04",X"00",X"FC",X"00",X"00",X"00",X"1C",X"03",X"00",X"FD",X"00",X"00", + X"00",X"FE",X"DC",X"04",X"00",X"FF",X"00",X"FC",X"00",X"00",X"FE",X"F8",X"04",X"00",X"01",X"00", + X"04",X"00",X"00",X"FE",X"F8",X"24",X"00",X"00",X"00",X"00",X"00",X"16",X"FD",X"24",X"00",X"00", + X"00",X"00",X"00",X"12",X"FD",X"24",X"00",X"00",X"00",X"00",X"00",X"0C",X"FD",X"24",X"00",X"00", + X"00",X"00",X"00",X"06",X"FD",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"F1",X"20",X"00",X"00",X"00", + X"00",X"00",X"02",X"22",X"00",X"00",X"00",X"00",X"00",X"02",X"FE",X"F1",X"24",X"00",X"00",X"00", + X"00",X"00",X"08",X"FD",X"24",X"00",X"00",X"00",X"00",X"00",X"10",X"28",X"00",X"00",X"00",X"00", + X"00",X"16",X"2A",X"00",X"00",X"00",X"00",X"00",X"16",X"FE",X"F1",X"04",X"00",X"00",X"00",X"00", + X"00",X"00",X"FE",X"F8",X"DB",X"65",X"E1",X"D1",X"C1",X"F1",X"FB",X"C3",X"C2",X"19",X"A2",X"23", + X"DC",X"23",X"98",X"22",X"98",X"22",X"16",X"24",X"98",X"22",X"98",X"22",X"98",X"22",X"1F",X"24", + X"48",X"24",X"36",X"FE",X"00",X"02",X"00",X"00",X"00",X"3A",X"FE",X"00",X"02",X"00",X"00",X"00", + X"3E",X"FE",X"00",X"02",X"00",X"00",X"00",X"3A",X"FE",X"00",X"02",X"00",X"00",X"00",X"36",X"FE", + X"00",X"02",X"00",X"00",X"00",X"3A",X"FE",X"00",X"02",X"00",X"00",X"00",X"3E",X"FE",X"00",X"02", + X"00",X"00",X"00",X"3A",X"FE",X"00",X"02",X"00",X"00",X"00",X"FE",X"C7",X"34",X"02",X"00",X"FE", + X"00",X"00",X"00",X"38",X"02",X"00",X"FE",X"00",X"00",X"00",X"3C",X"02",X"00",X"FE",X"00",X"00", + X"00",X"38",X"02",X"00",X"FE",X"00",X"00",X"00",X"34",X"02",X"00",X"FE",X"00",X"00",X"00",X"38", + X"02",X"00",X"FE",X"00",X"00",X"00",X"3C",X"02",X"00",X"FE",X"00",X"00",X"00",X"38",X"02",X"00", + X"FE",X"00",X"00",X"00",X"FE",X"C7",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"F8",X"2C", + X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"2E", + X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"2C", + X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"D8",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"FF",X"79",X"24",X"A5",X"24",X"98",X"22",X"98",X"22",X"D1",X"24",X"27", + X"25",X"98",X"22",X"98",X"22",X"E1",X"24",X"0A",X"25",X"52",X"FE",X"00",X"02",X"00",X"00",X"00", + X"4A",X"FD",X"00",X"03",X"00",X"00",X"00",X"4E",X"FD",X"00",X"03",X"00",X"00",X"00",X"56",X"FE", + X"00",X"02",X"00",X"00",X"00",X"4E",X"FD",X"00",X"03",X"00",X"00",X"00",X"4A",X"FD",X"00",X"03", + X"00",X"00",X"00",X"FE",X"D5",X"50",X"02",X"00",X"FE",X"00",X"00",X"01",X"48",X"03",X"00",X"FD", + X"00",X"00",X"00",X"4C",X"03",X"00",X"FD",X"00",X"00",X"00",X"54",X"02",X"00",X"FE",X"00",X"00", + X"00",X"4C",X"03",X"00",X"FD",X"00",X"00",X"00",X"48",X"03",X"00",X"FD",X"00",X"00",X"00",X"FE", + X"D5",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"4C",X"00",X"00",X"00",X"00",X"00",X"00",X"FE", + X"F1",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"46",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"D8",X"5C",X"00",X"00",X"00",X"00",X"00", + X"00",X"5C",X"00",X"00",X"00",X"00",X"00",X"00",X"5C",X"00",X"00",X"00",X"00",X"00",X"00",X"5C", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"58",X"00",X"00",X"00",X"00",X"00",X"02",X"58",X"00", + X"00",X"00",X"00",X"00",X"04",X"58",X"00",X"00",X"00",X"00",X"00",X"02",X"FE",X"EA",X"52",X"25", + X"77",X"25",X"F2",X"25",X"FB",X"25",X"9C",X"25",X"98",X"22",X"98",X"22",X"98",X"22",X"AC",X"25", + X"D5",X"25",X"6E",X"FD",X"00",X"03",X"00",X"00",X"00",X"72",X"FD",X"00",X"03",X"00",X"00",X"00", + X"76",X"FC",X"00",X"04",X"00",X"00",X"01",X"7A",X"FD",X"00",X"03",X"00",X"00",X"00",X"7E",X"FD", + X"00",X"03",X"00",X"00",X"00",X"FE",X"DC",X"6C",X"03",X"00",X"FD",X"00",X"00",X"00",X"70",X"03", + X"00",X"FD",X"00",X"00",X"00",X"74",X"04",X"00",X"FC",X"00",X"00",X"01",X"78",X"03",X"00",X"FD", + X"00",X"00",X"00",X"7C",X"03",X"00",X"FD",X"00",X"00",X"00",X"FE",X"DC",X"64",X"00",X"00",X"00", + X"00",X"00",X"00",X"68",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"F1",X"60",X"00",X"00",X"00", + X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"62",X"00",X"00",X"00", + X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"60",X"00",X"00",X"00", + X"00",X"00",X"00",X"FE",X"D8",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"FF",X"64",X"00",X"FF",X"00",X"FC",X"00",X"00",X"FE",X"F8",X"64",X"00",X"01",X"00",X"04", + X"00",X"00",X"FE",X"F8",X"18",X"26",X"3D",X"26",X"B8",X"26",X"C1",X"26",X"62",X"26",X"CA",X"26", + X"98",X"22",X"98",X"22",X"72",X"26",X"9B",X"26",X"92",X"FD",X"00",X"03",X"00",X"00",X"00",X"96", + X"FD",X"00",X"03",X"00",X"00",X"00",X"9A",X"FC",X"00",X"04",X"00",X"00",X"00",X"9E",X"FD",X"00", + X"03",X"00",X"00",X"00",X"A2",X"FD",X"00",X"03",X"00",X"00",X"00",X"FE",X"DC",X"90",X"03",X"00", + X"FD",X"00",X"00",X"00",X"94",X"03",X"00",X"FD",X"00",X"00",X"00",X"98",X"04",X"00",X"FC",X"00", + X"00",X"00",X"9C",X"03",X"00",X"FD",X"00",X"00",X"00",X"A0",X"03",X"00",X"FD",X"00",X"00",X"00", + X"FE",X"DC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"8C",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"F1",X"84",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"FD",X"86",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"FD",X"84",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"D8",X"A8",X"00",X"00",X"00",X"00", + X"00",X"00",X"A8",X"00",X"00",X"00",X"00",X"00",X"00",X"A8",X"00",X"00",X"00",X"00",X"00",X"00", + X"A8",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"00",X"FF",X"00",X"FC",X"00",X"00",X"FE", + X"F8",X"88",X"00",X"01",X"00",X"04",X"00",X"00",X"FE",X"F8",X"A4",X"00",X"00",X"00",X"00",X"00", + X"02",X"A4",X"00",X"00",X"00",X"00",X"00",X"04",X"A4",X"00",X"00",X"00",X"00",X"00",X"02",X"FE", + X"EA",X"F5",X"26",X"13",X"27",X"87",X"27",X"90",X"27",X"31",X"27",X"99",X"27",X"98",X"22",X"98", + X"22",X"41",X"27",X"6A",X"27",X"BA",X"FC",X"00",X"04",X"00",X"00",X"00",X"BE",X"FC",X"00",X"04", + X"00",X"00",X"00",X"C2",X"FC",X"00",X"04",X"00",X"00",X"00",X"BE",X"FC",X"00",X"04",X"00",X"00", + X"00",X"FE",X"E3",X"B8",X"04",X"00",X"FC",X"00",X"00",X"00",X"BC",X"04",X"00",X"FC",X"00",X"00", + X"00",X"C0",X"04",X"00",X"FC",X"00",X"00",X"00",X"BC",X"04",X"00",X"FC",X"00",X"00",X"00",X"FE", + X"E3",X"B0",X"00",X"00",X"00",X"00",X"00",X"00",X"B4",X"00",X"00",X"00",X"00",X"00",X"00",X"FE", + X"F1",X"AC",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"AE",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"AC",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"D8",X"C8",X"00",X"00",X"00",X"00",X"00", + X"00",X"C8",X"00",X"00",X"00",X"00",X"00",X"00",X"C8",X"00",X"00",X"00",X"00",X"00",X"00",X"C8", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"B0",X"00",X"FF",X"00",X"FC",X"00",X"00",X"FE",X"F8", + X"B0",X"00",X"01",X"00",X"04",X"00",X"00",X"FE",X"F8",X"C4",X"00",X"00",X"00",X"00",X"00",X"02", + X"C4",X"00",X"00",X"00",X"00",X"00",X"03",X"C4",X"00",X"00",X"00",X"00",X"00",X"02",X"FE",X"EA", + X"F5",X"C5",X"D5",X"E5",X"F3",X"11",X"5F",X"37",X"21",X"C3",X"27",X"01",X"03",X"06",X"DB",X"64", + X"C3",X"29",X"37",X"97",X"CD",X"BD",X"02",X"CD",X"C7",X"02",X"06",X"1E",X"CD",X"72",X"03",X"21", + X"2B",X"4E",X"06",X"AB",X"77",X"23",X"10",X"FC",X"3C",X"32",X"A3",X"4C",X"36",X"0B",X"23",X"36", + X"55",X"3A",X"16",X"4C",X"A7",X"28",X"14",X"97",X"32",X"32",X"4C",X"3E",X"05",X"32",X"33",X"4C", + X"21",X"7A",X"10",X"22",X"34",X"4C",X"21",X"DC",X"42",X"36",X"3C",X"3A",X"4B",X"4D",X"FE",X"01", + X"01",X"3C",X"4C",X"11",X"9C",X"4C",X"21",X"4C",X"4D",X"28",X"09",X"01",X"3D",X"4C",X"11",X"9D", + X"4C",X"21",X"4F",X"4D",X"1A",X"32",X"9E",X"4C",X"0A",X"32",X"3E",X"4C",X"7E",X"FE",X"19",X"20", + X"11",X"3A",X"14",X"4C",X"A7",X"7E",X"20",X"0A",X"3A",X"9E",X"4C",X"3C",X"32",X"9E",X"4C",X"3E", + X"01",X"77",X"11",X"BB",X"30",X"3D",X"07",X"26",X"00",X"6F",X"19",X"7E",X"23",X"66",X"6F",X"CD", + X"56",X"2E",X"32",X"62",X"4D",X"CD",X"5C",X"2B",X"97",X"32",X"DC",X"46",X"23",X"CD",X"56",X"2E", + X"32",X"61",X"4D",X"23",X"CD",X"56",X"2E",X"32",X"5F",X"4D",X"23",X"CD",X"56",X"2E",X"32",X"60", + X"4D",X"23",X"F3",X"DB",X"37",X"3E",X"72",X"00",X"47",X"DB",X"4D",X"3E",X"66",X"00",X"90",X"ED", + X"44",X"0F",X"47",X"DB",X"32",X"DB",X"46",X"FB",X"11",X"01",X"00",X"78",X"32",X"56",X"4D",X"CD", + X"56",X"2E",X"23",X"E5",X"D5",X"C5",X"07",X"DC",X"DE",X"2B",X"07",X"DC",X"E3",X"2B",X"21",X"1E", + X"2C",X"22",X"52",X"4D",X"21",X"12",X"2C",X"06",X"06",X"E5",X"07",X"30",X"0E",X"F5",X"C5",X"D5", + X"4E",X"23",X"46",X"EB",X"09",X"CD",X"F2",X"2B",X"D1",X"C1",X"F1",X"2A",X"52",X"4D",X"23",X"22", + X"52",X"4D",X"E1",X"23",X"23",X"10",X"E2",X"C1",X"D1",X"21",X"05",X"00",X"19",X"EB",X"E1",X"10", + X"BA",X"06",X"06",X"78",X"32",X"56",X"4D",X"3E",X"06",X"90",X"5F",X"07",X"07",X"83",X"16",X"00", + X"5F",X"ED",X"53",X"57",X"4D",X"C5",X"CD",X"56",X"2E",X"23",X"E5",X"CD",X"3D",X"2C",X"21",X"DE", + X"2C",X"22",X"52",X"4D",X"21",X"C4",X"2C",X"06",X"05",X"CD",X"8F",X"2C",X"D1",X"EB",X"CD",X"56", + X"2E",X"EB",X"13",X"D5",X"06",X"08",X"CD",X"8F",X"2C",X"E1",X"C1",X"10",X"C6",X"3E",X"06",X"47", + X"32",X"5A",X"4D",X"3E",X"E0",X"32",X"5C",X"4D",X"11",X"E6",X"4E",X"ED",X"53",X"5D",X"4D",X"78", + X"32",X"56",X"4D",X"3E",X"01",X"32",X"59",X"4D",X"3E",X"E6",X"32",X"5B",X"4D",X"C5",X"CD",X"56", + X"2E",X"23",X"E5",X"CD",X"38",X"2C",X"06",X"05",X"CD",X"EB",X"2C",X"D1",X"EB",X"CD",X"56",X"2E", + X"EB",X"13",X"D5",X"06",X"08",X"CD",X"EB",X"2C",X"3A",X"5A",X"4D",X"3D",X"32",X"5A",X"4D",X"3A", + X"5C",X"4D",X"D6",X"28",X"32",X"5C",X"4D",X"E1",X"C1",X"10",X"C4",X"06",X"06",X"78",X"32",X"56", + X"4D",X"3E",X"06",X"90",X"5F",X"07",X"07",X"83",X"16",X"00",X"5F",X"ED",X"53",X"57",X"4D",X"C5", + X"CD",X"56",X"2E",X"23",X"E5",X"21",X"59",X"2D",X"22",X"52",X"4D",X"21",X"49",X"2D",X"06",X"08", + X"CD",X"29",X"2D",X"E1",X"C1",X"10",X"D6",X"01",X"FC",X"2D",X"ED",X"43",X"52",X"4D",X"01",X"F4", + X"2D",X"ED",X"43",X"54",X"4D",X"CD",X"56",X"2E",X"32",X"32",X"4F",X"32",X"33",X"4F",X"07",X"07", + X"07",X"07",X"23",X"06",X"04",X"11",X"A6",X"4E",X"C5",X"D5",X"07",X"30",X"7E",X"F5",X"CD",X"56", + X"2E",X"47",X"23",X"CD",X"56",X"2E",X"23",X"32",X"56",X"4D",X"E5",X"90",X"21",X"56",X"4D",X"CD", + X"B6",X"2D",X"CD",X"38",X"2E",X"CB",X"D6",X"47",X"21",X"56",X"4D",X"35",X"CD",X"B6",X"2D",X"CD", + X"38",X"2E",X"CB",X"D6",X"CB",X"DE",X"10",X"F0",X"CB",X"96",X"E1",X"97",X"12",X"13",X"CD",X"56", + X"2E",X"23",X"32",X"56",X"4D",X"E5",X"47",X"07",X"07",X"80",X"47",X"D6",X"1E",X"ED",X"44",X"F5", + X"78",X"07",X"07",X"07",X"C6",X"F0",X"12",X"13",X"97",X"12",X"13",X"12",X"13",X"12",X"13",X"ED", + X"4B",X"54",X"4D",X"0A",X"6F",X"03",X"0A",X"67",X"F1",X"06",X"00",X"4F",X"09",X"7D",X"12",X"13", + X"7C",X"12",X"13",X"ED",X"4B",X"52",X"4D",X"0A",X"12",X"13",X"3A",X"56",X"4D",X"12",X"13",X"97", + X"12",X"CD",X"E5",X"2D",X"CD",X"38",X"2E",X"CB",X"F6",X"E1",X"F1",X"D1",X"E5",X"2A",X"54",X"4D", + X"23",X"23",X"22",X"54",X"4D",X"2A",X"52",X"4D",X"23",X"22",X"52",X"4D",X"21",X"0C",X"00",X"19", + X"EB",X"E1",X"C1",X"05",X"C2",X"98",X"29",X"CD",X"79",X"2B",X"21",X"D8",X"4E",X"97",X"77",X"23", + X"36",X"01",X"23",X"36",X"01",X"23",X"77",X"23",X"77",X"23",X"36",X"E6",X"23",X"36",X"18",X"23", + X"36",X"09",X"23",X"36",X"04",X"23",X"36",X"7B",X"23",X"36",X"23",X"23",X"36",X"A0",X"3A",X"4B", + X"4D",X"FE",X"01",X"11",X"9C",X"4C",X"21",X"4E",X"4D",X"28",X"06",X"11",X"9D",X"4C",X"21",X"51", + X"4D",X"3A",X"9E",X"4C",X"12",X"7E",X"FE",X"10",X"38",X"0A",X"3A",X"14",X"4C",X"A7",X"7E",X"20", + X"03",X"3E",X"0F",X"77",X"11",X"E4",X"35",X"3D",X"07",X"26",X"00",X"6F",X"19",X"7E",X"23",X"66", + X"6F",X"3A",X"9E",X"4C",X"A7",X"7E",X"28",X"01",X"97",X"01",X"25",X"4E",X"02",X"23",X"7E",X"03", + X"02",X"03",X"02",X"23",X"7E",X"03",X"02",X"23",X"7E",X"03",X"02",X"23",X"7E",X"03",X"02",X"11", + X"E6",X"4E",X"C3",X"6A",X"2E",X"3A",X"01",X"4C",X"47",X"23",X"7E",X"12",X"23",X"4E",X"C5",X"E5", + X"21",X"07",X"00",X"19",X"EB",X"3D",X"07",X"07",X"06",X"00",X"4F",X"21",X"48",X"2B",X"09",X"06", + X"04",X"7E",X"12",X"23",X"13",X"10",X"FA",X"97",X"12",X"13",X"E1",X"C1",X"79",X"12",X"13",X"3A", + X"2A",X"4E",X"12",X"13",X"10",X"D3",X"3A",X"9E",X"4C",X"A7",X"28",X"06",X"21",X"27",X"4E",X"35", + X"23",X"35",X"3A",X"14",X"4C",X"A7",X"20",X"3E",X"97",X"32",X"A3",X"4C",X"3E",X"0B",X"CD",X"0E", + X"05",X"CD",X"95",X"05",X"CD",X"C4",X"05",X"3A",X"37",X"4C",X"FE",X"02",X"20",X"0B",X"3E",X"0B", + X"CD",X"16",X"05",X"CD",X"9E",X"05",X"CD",X"CC",X"05",X"3A",X"4B",X"4D",X"FE",X"01",X"3E",X"0E", + X"32",X"02",X"4C",X"28",X"12",X"CD",X"CC",X"05",X"3A",X"AC",X"4C",X"A7",X"20",X"03",X"CD",X"6E", + X"06",X"3E",X"01",X"32",X"A3",X"4C",X"C9",X"CD",X"C4",X"05",X"18",X"EC",X"DB",X"65",X"DB",X"64", + X"E1",X"D1",X"C1",X"F1",X"FB",X"C3",X"B5",X"2A",X"05",X"0B",X"1F",X"24",X"12",X"11",X"E1",X"24", + X"0A",X"18",X"AC",X"25",X"0C",X"21",X"72",X"26",X"0B",X"2B",X"41",X"27",X"E5",X"CD",X"1A",X"03", + X"06",X"07",X"3E",X"08",X"11",X"E0",X"FF",X"21",X"81",X"43",X"C5",X"06",X"1A",X"CD",X"57",X"04", + X"01",X"45",X"03",X"09",X"C1",X"10",X"F3",X"E1",X"C9",X"3E",X"20",X"11",X"01",X"00",X"06",X"1E", + X"21",X"A1",X"43",X"CD",X"5C",X"04",X"06",X"1E",X"21",X"41",X"40",X"CD",X"5C",X"04",X"3E",X"25", + X"11",X"E0",X"FF",X"06",X"1A",X"21",X"80",X"43",X"CD",X"57",X"04",X"3E",X"2D",X"06",X"1A",X"21", + X"9F",X"43",X"CD",X"57",X"04",X"3A",X"A1",X"43",X"FE",X"28",X"3E",X"29",X"28",X"02",X"3E",X"24", + X"32",X"A0",X"43",X"3A",X"41",X"40",X"FE",X"28",X"3E",X"5C",X"28",X"02",X"3E",X"26",X"32",X"40", + X"40",X"3A",X"BE",X"43",X"FE",X"20",X"3E",X"5D",X"28",X"02",X"3E",X"2C",X"32",X"BF",X"43",X"3A", + X"5E",X"40",X"FE",X"20",X"3E",X"5E",X"28",X"02",X"3E",X"2F",X"32",X"5F",X"40",X"C9",X"21",X"A0", + X"43",X"18",X"03",X"21",X"40",X"40",X"D5",X"19",X"36",X"08",X"11",X"05",X"00",X"19",X"36",X"08", + X"D1",X"C9",X"E5",X"11",X"01",X"00",X"06",X"05",X"3E",X"03",X"CD",X"5C",X"04",X"E1",X"01",X"E0", + X"FF",X"09",X"06",X"05",X"3E",X"02",X"CD",X"5C",X"04",X"CD",X"38",X"2E",X"CB",X"CE",X"23",X"CB", + X"C6",X"C9",X"A0",X"43",X"E0",X"42",X"20",X"42",X"E0",X"41",X"20",X"41",X"60",X"40",X"00",X"03", + X"06",X"07",X"0A",X"0D",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"18",X"19",X"1D", + X"1D",X"1D",X"1B",X"1A",X"1D",X"1D",X"1D",X"1C",X"11",X"2E",X"2C",X"18",X"03",X"11",X"24",X"2C", + X"07",X"06",X"03",X"21",X"9E",X"43",X"DC",X"5C",X"2C",X"07",X"06",X"01",X"21",X"1E",X"42",X"DC", + X"5C",X"2C",X"07",X"06",X"03",X"21",X"1E",X"41",X"DC",X"5C",X"2C",X"C9",X"F5",X"C5",X"3A",X"56", + X"4D",X"3D",X"4F",X"07",X"07",X"81",X"ED",X"44",X"06",X"00",X"28",X"01",X"05",X"4F",X"09",X"C1", + X"C5",X"D5",X"CD",X"86",X"2C",X"01",X"E5",X"FF",X"09",X"CD",X"86",X"2C",X"01",X"E5",X"FF",X"09", + X"D1",X"C1",X"10",X"EC",X"F1",X"C9",X"06",X"05",X"1A",X"77",X"13",X"2B",X"10",X"FA",X"C9",X"C5", + X"E5",X"07",X"30",X"22",X"F5",X"5E",X"23",X"56",X"3A",X"3E",X"4C",X"A7",X"20",X"0B",X"D5",X"E5", + X"CD",X"29",X"2E",X"CB",X"6E",X"E1",X"D1",X"28",X"0C",X"CD",X"61",X"2D",X"CD",X"38",X"2E",X"CB", + X"EE",X"21",X"8B",X"4E",X"34",X"F1",X"2A",X"52",X"4D",X"23",X"22",X"52",X"4D",X"E1",X"23",X"23", + X"C1",X"10",X"CC",X"C9",X"85",X"43",X"45",X"43",X"05",X"43",X"C5",X"42",X"85",X"42",X"45",X"42", + X"05",X"42",X"C5",X"41",X"85",X"41",X"45",X"41",X"05",X"41",X"C5",X"40",X"85",X"40",X"01",X"02", + X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"C5",X"07",X"30",X"21",X"F5", + X"2A",X"5D",X"4D",X"23",X"ED",X"5B",X"59",X"4D",X"73",X"23",X"72",X"23",X"97",X"77",X"23",X"77", + X"23",X"ED",X"5B",X"5B",X"4D",X"73",X"23",X"72",X"11",X"08",X"00",X"19",X"22",X"5D",X"4D",X"F1", + X"CD",X"17",X"2D",X"C1",X"10",X"D5",X"C9",X"F5",X"3A",X"59",X"4D",X"3C",X"32",X"59",X"4D",X"3A", + X"5B",X"4D",X"C6",X"F0",X"32",X"5B",X"4D",X"F1",X"C9",X"C5",X"E5",X"07",X"30",X"0D",X"F5",X"5E", + X"23",X"56",X"CD",X"95",X"2D",X"CD",X"38",X"2E",X"CB",X"E6",X"F1",X"2A",X"52",X"4D",X"23",X"22", + X"52",X"4D",X"E1",X"23",X"23",X"C1",X"10",X"E1",X"C9",X"85",X"43",X"05",X"43",X"C5",X"42",X"45", + X"42",X"C5",X"41",X"45",X"41",X"05",X"41",X"85",X"40",X"01",X"03",X"04",X"06",X"08",X"0A",X"0B", + X"0D",X"2A",X"57",X"4D",X"19",X"3A",X"61",X"4D",X"77",X"2B",X"3C",X"77",X"11",X"E0",X"FF",X"19", + X"3C",X"77",X"23",X"3C",X"77",X"11",X"20",X"04",X"19",X"3A",X"9E",X"4C",X"A7",X"3A",X"60",X"4D", + X"47",X"3A",X"5F",X"4D",X"4F",X"28",X"03",X"01",X"00",X"00",X"70",X"2B",X"71",X"11",X"E0",X"FF", + X"19",X"71",X"23",X"70",X"C9",X"2A",X"57",X"4D",X"19",X"2B",X"2B",X"7E",X"C6",X"10",X"77",X"11", + X"E0",X"FF",X"19",X"7E",X"C6",X"11",X"77",X"11",X"00",X"04",X"19",X"3A",X"62",X"4D",X"3D",X"77", + X"11",X"20",X"00",X"19",X"77",X"C9",X"F5",X"C5",X"D5",X"7E",X"4F",X"07",X"07",X"81",X"D6",X"1E", + X"ED",X"44",X"06",X"00",X"4F",X"2A",X"54",X"4D",X"7E",X"23",X"66",X"6F",X"09",X"06",X"05",X"3E", + X"04",X"86",X"77",X"11",X"E0",X"FF",X"19",X"3E",X"05",X"86",X"77",X"11",X"1F",X"00",X"19",X"10", + X"EE",X"D1",X"C1",X"F1",X"C9",X"F5",X"C5",X"D5",X"E5",X"11",X"FB",X"01",X"CD",X"44",X"01",X"E1", + X"D1",X"C1",X"F1",X"C9",X"45",X"43",X"85",X"42",X"85",X"41",X"C5",X"40",X"02",X"05",X"09",X"0C", + X"D5",X"97",X"57",X"5A",X"7E",X"23",X"E5",X"6F",X"26",X"00",X"19",X"EB",X"E1",X"10",X"F5",X"3E", + X"05",X"32",X"01",X"4C",X"32",X"C0",X"50",X"0D",X"20",X"EA",X"D1",X"19",X"CB",X"24",X"CB",X"24", + X"CB",X"3C",X"CB",X"3C",X"E5",X"DD",X"E1",X"DD",X"E9",X"21",X"65",X"4D",X"3A",X"4B",X"4D",X"FE", + X"01",X"28",X"08",X"21",X"C5",X"4D",X"18",X"03",X"21",X"2B",X"4E",X"F5",X"C5",X"E5",X"2A",X"52", + X"4D",X"46",X"3A",X"56",X"4D",X"D6",X"06",X"ED",X"44",X"07",X"07",X"07",X"07",X"80",X"06",X"00", + X"4F",X"E1",X"09",X"C1",X"F1",X"C9",X"C5",X"D5",X"0E",X"51",X"F3",X"ED",X"50",X"ED",X"58",X"7E", + X"0E",X"28",X"ED",X"50",X"ED",X"58",X"FB",X"D1",X"C1",X"C9",X"F5",X"C5",X"D5",X"E5",X"F3",X"21", + X"7E",X"2E",X"11",X"9C",X"F5",X"01",X"08",X"22",X"DB",X"64",X"DB",X"65",X"18",X"82",X"3E",X"08", + X"C3",X"32",X"2F",X"3A",X"2E",X"4F",X"FE",X"90",X"3E",X"07",X"C2",X"32",X"2F",X"3E",X"09",X"C3", + X"32",X"2F",X"3A",X"E3",X"4E",X"FE",X"86",X"3A",X"2E",X"4F",X"28",X"0A",X"FE",X"87",X"CA",X"35", + X"2F",X"3E",X"00",X"C3",X"32",X"2F",X"FE",X"86",X"CA",X"35",X"2F",X"3E",X"01",X"C3",X"32",X"2F", + X"3A",X"25",X"4E",X"32",X"0E",X"4C",X"97",X"32",X"A7",X"4C",X"3C",X"32",X"3B",X"4C",X"06",X"1E", + X"CD",X"72",X"03",X"3A",X"8B",X"4E",X"32",X"C0",X"50",X"A7",X"CA",X"A8",X"2F",X"3A",X"A5",X"4E", + X"A7",X"C2",X"F0",X"2F",X"3E",X"15",X"CD",X"7A",X"09",X"3A",X"35",X"4F",X"3C",X"E6",X"03",X"32", + X"35",X"4F",X"3A",X"16",X"4C",X"A7",X"28",X"03",X"CD",X"77",X"11",X"97",X"32",X"2D",X"4F",X"32", + X"2C",X"4F",X"32",X"34",X"4F",X"3D",X"32",X"0D",X"4C",X"3E",X"0F",X"32",X"32",X"4F",X"CD",X"D8", + X"1B",X"3A",X"2E",X"4F",X"E6",X"86",X"FE",X"86",X"20",X"0E",X"3A",X"E3",X"4E",X"E6",X"86",X"FE", + X"86",X"28",X"05",X"3E",X"0A",X"CD",X"7A",X"09",X"3A",X"E3",X"4E",X"FE",X"99",X"CA",X"7E",X"2E", + X"FE",X"90",X"CA",X"83",X"2E",X"E6",X"86",X"FE",X"86",X"CA",X"92",X"2E",X"FE",X"84",X"20",X"05", + X"3E",X"10",X"CD",X"7A",X"09",X"3A",X"14",X"4C",X"A7",X"20",X"10",X"3A",X"E3",X"4E",X"CB",X"67", + X"3A",X"28",X"4E",X"20",X"03",X"3A",X"27",X"4E",X"CD",X"B6",X"06",X"3E",X"01",X"06",X"05",X"F5", + X"C5",X"32",X"2D",X"4F",X"32",X"2C",X"4F",X"CD",X"D8",X"1B",X"C1",X"F1",X"3C",X"10",X"F0",X"3A", + X"33",X"4F",X"47",X"3A",X"32",X"4F",X"A0",X"06",X"04",X"0E",X"08",X"F5",X"C5",X"A1",X"C4",X"2D", + X"30",X"C1",X"F1",X"CB",X"29",X"10",X"F4",X"3A",X"14",X"4C",X"A7",X"20",X"1A",X"97",X"32",X"A3", + X"4C",X"3A",X"4B",X"4D",X"FE",X"01",X"3E",X"06",X"28",X"05",X"CD",X"16",X"05",X"18",X"03",X"CD", + X"0E",X"05",X"3E",X"01",X"32",X"A3",X"4C",X"CD",X"A9",X"30",X"CD",X"A9",X"30",X"CD",X"8A",X"03", + X"C3",X"C3",X"2E",X"CD",X"0E",X"05",X"18",X"20",X"97",X"32",X"3B",X"4C",X"CD",X"23",X"05",X"32", + X"A3",X"4C",X"3C",X"32",X"A7",X"4C",X"3A",X"14",X"4C",X"A7",X"20",X"0C",X"3A",X"4B",X"4D",X"FE", + X"01",X"3E",X"06",X"28",X"DE",X"CD",X"16",X"05",X"3E",X"01",X"32",X"A3",X"4C",X"CD",X"ED",X"06", + X"3E",X"0D",X"CD",X"7A",X"09",X"CD",X"A1",X"03",X"97",X"32",X"A5",X"4E",X"3A",X"4B",X"4D",X"21", + X"3C",X"4C",X"FE",X"01",X"28",X"03",X"21",X"3D",X"4C",X"36",X"01",X"97",X"32",X"A7",X"4C",X"C9", + X"97",X"32",X"3B",X"4C",X"3C",X"32",X"A7",X"4C",X"CD",X"ED",X"06",X"3E",X"0C",X"CD",X"7A",X"09", + X"CD",X"A1",X"03",X"3E",X"01",X"32",X"A5",X"4E",X"3A",X"4B",X"4D",X"21",X"3C",X"4C",X"11",X"65", + X"4D",X"FE",X"01",X"28",X"06",X"21",X"3D",X"4C",X"11",X"C5",X"4D",X"36",X"00",X"21",X"2B",X"4E", + X"06",X"60",X"7E",X"12",X"23",X"13",X"10",X"FA",X"97",X"32",X"A7",X"4C",X"C9",X"F5",X"3E",X"04", + X"90",X"5F",X"07",X"83",X"07",X"07",X"16",X"00",X"5F",X"21",X"A6",X"4E",X"19",X"7E",X"A7",X"20", + X"05",X"CD",X"82",X"30",X"F1",X"C9",X"FE",X"01",X"20",X"FE",X"23",X"7E",X"23",X"46",X"CD",X"8C", + X"30",X"11",X"FA",X"FF",X"19",X"7E",X"2B",X"2B",X"BE",X"20",X"1E",X"2B",X"36",X"00",X"E5",X"CD", + X"82",X"30",X"E1",X"11",X"0A",X"00",X"19",X"5E",X"23",X"56",X"3A",X"62",X"4D",X"3D",X"12",X"21", + X"E0",X"FF",X"19",X"77",X"3E",X"02",X"CD",X"7A",X"09",X"C1",X"3A",X"34",X"4F",X"B0",X"32",X"34", + X"4F",X"C9",X"11",X"08",X"00",X"19",X"CD",X"DF",X"21",X"CB",X"F6",X"C9",X"80",X"2B",X"77",X"11", + X"08",X"00",X"19",X"7E",X"80",X"77",X"FE",X"FC",X"28",X"09",X"FE",X"28",X"C0",X"36",X"00",X"2B", + X"34",X"23",X"C9",X"36",X"24",X"2B",X"35",X"23",X"C9",X"3A",X"25",X"4E",X"A7",X"C8",X"21",X"0E", + X"4C",X"35",X"C0",X"3A",X"25",X"4E",X"77",X"CD",X"8A",X"03",X"C9",X"ED",X"30",X"22",X"31",X"57", + X"31",X"86",X"31",X"B2",X"31",X"E1",X"31",X"16",X"32",X"4B",X"32",X"80",X"32",X"B5",X"32",X"E7", + X"32",X"1C",X"33",X"51",X"33",X"86",X"33",X"BB",X"33",X"ED",X"33",X"22",X"34",X"57",X"34",X"8C", + X"34",X"B8",X"34",X"E7",X"34",X"1C",X"35",X"48",X"35",X"7D",X"35",X"B2",X"35",X"0F",X"90",X"05", + X"05",X"21",X"21",X"21",X"21",X"21",X"21",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04", + X"04",X"04",X"04",X"00",X"40",X"00",X"40",X"00",X"40",X"00",X"40",X"00",X"40",X"00",X"00",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"01",X"06",X"01",X"01",X"06",X"03",X"01",X"06",X"04",X"01", + X"06",X"06",X"18",X"94",X"02",X"03",X"C0",X"C0",X"21",X"21",X"21",X"21",X"00",X"40",X"00",X"40", + X"00",X"E0",X"01",X"50",X"02",X"48",X"04",X"44",X"00",X"08",X"02",X"00",X"00",X"00",X"00",X"20", + X"01",X"00",X"00",X"08",X"18",X"18",X"19",X"80",X"01",X"80",X"0F",X"01",X"04",X"02",X"04",X"06", + X"05",X"04",X"06",X"05",X"01",X"04",X"02",X"1B",X"98",X"01",X"01",X"C0",X"21",X"D2",X"D2",X"21", + X"C0",X"1C",X"47",X"08",X"42",X"A0",X"40",X"A0",X"40",X"08",X"42",X"1C",X"47",X"00",X"80",X"00", + X"20",X"00",X"80",X"00",X"20",X"00",X"80",X"00",X"00",X"04",X"04",X"20",X"20",X"04",X"04",X"06", + X"01",X"06",X"06",X"01",X"06",X"06",X"15",X"9C",X"04",X"04",X"21",X"31",X"39",X"39",X"31",X"21", + X"0F",X"F8",X"81",X"F0",X"00",X"20",X"00",X"20",X"81",X"F0",X"0F",X"F8",X"00",X"01",X"00",X"01", + X"80",X"01",X"80",X"01",X"00",X"01",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"06",X"04",X"1E",X"A0",X"04",X"06",X"21",X"33",X"33",X"33",X"33",X"21",X"03",X"F8",X"00",X"00", + X"40",X"00",X"40",X"00",X"00",X"00",X"03",X"F8",X"14",X"01",X"40",X"00",X"00",X"00",X"00",X"00", + X"44",X"00",X"00",X"01",X"42",X"42",X"42",X"42",X"42",X"42",X"09",X"01",X"06",X"06",X"01",X"06", + X"06",X"12",X"A4",X"06",X"06",X"2D",X"2D",X"C0",X"C0",X"2D",X"2D",X"47",X"1C",X"47",X"1C",X"00", + X"E0",X"00",X"E0",X"47",X"1C",X"47",X"1C",X"08",X"00",X"00",X"02",X"00",X"10",X"01",X"01",X"00", + X"00",X"00",X"00",X"81",X"81",X"C3",X"C3",X"81",X"81",X"0F",X"01",X"06",X"06",X"03",X"04",X"03", + X"03",X"04",X"04",X"01",X"06",X"01",X"18",X"B4",X"04",X"0E",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC", + X"54",X"05",X"12",X"09",X"54",X"05",X"12",X"09",X"54",X"05",X"12",X"09",X"00",X"20",X"40",X"80", + X"00",X"02",X"40",X"00",X"00",X"20",X"40",X"80",X"18",X"18",X"18",X"18",X"18",X"18",X"0F",X"01", + X"06",X"02",X"01",X"06",X"05",X"01",X"06",X"05",X"01",X"06",X"02",X"1B",X"AC",X"06",X"06",X"21", + X"21",X"C0",X"C0",X"C0",X"21",X"02",X"00",X"05",X"00",X"0F",X"A1",X"10",X"61",X"00",X"21",X"00", + X"1E",X"00",X"00",X"00",X"10",X"01",X"00",X"08",X"02",X"00",X"10",X"00",X"00",X"02",X"02",X"06", + X"24",X"60",X"40",X"0F",X"01",X"02",X"02",X"02",X"03",X"02",X"03",X"04",X"04",X"04",X"06",X"04", + X"15",X"B0",X"04",X"04",X"21",X"D2",X"C6",X"C6",X"2B",X"21",X"01",X"F0",X"18",X"E1",X"14",X"81", + X"17",X"81",X"03",X"20",X"01",X"F0",X"10",X"00",X"04",X"00",X"00",X"00",X"00",X"40",X"00",X"C0", + X"00",X"00",X"01",X"37",X"37",X"C7",X"C7",X"01",X"0F",X"02",X"03",X"02",X"04",X"05",X"05",X"02", + X"05",X"02",X"01",X"06",X"06",X"12",X"A8",X"07",X"07",X"C8",X"D0",X"21",X"21",X"21",X"21",X"14", + X"15",X"08",X"AA",X"04",X"50",X"0A",X"A8",X"01",X"50",X"02",X"AA",X"00",X"40",X"04",X"00",X"00", + X"20",X"00",X"20",X"00",X"20",X"00",X"00",X"10",X"20",X"01",X"01",X"81",X"80",X"0D",X"01",X"02", + X"01",X"04",X"06",X"05",X"02",X"04",X"03",X"0F",X"B8",X"06",X"09",X"21",X"D0",X"21",X"21",X"C2", + X"21",X"08",X"00",X"19",X"C0",X"0C",X"40",X"00",X"42",X"00",X"73",X"00",X"02",X"00",X"00",X"00", + X"02",X"00",X"20",X"00",X"80",X"00",X"04",X"00",X"01",X"01",X"0C",X"31",X"8C",X"30",X"80",X"0F", + X"01",X"03",X"02",X"02",X"04",X"03",X"03",X"05",X"04",X"04",X"06",X"05",X"1E",X"BC",X"1F",X"1C", + X"C0",X"C2",X"C4",X"25",X"35",X"25",X"1F",X"E7",X"1F",X"E1",X"17",X"9C",X"07",X"9C",X"00",X"9C", + X"00",X"9C",X"00",X"00",X"00",X"12",X"00",X"02",X"08",X"00",X"00",X"02",X"00",X"00",X"00",X"04", + X"01",X"81",X"01",X"81",X"0F",X"01",X"04",X"04",X"01",X"02",X"01",X"05",X"06",X"06",X"01",X"05", + X"01",X"0F",X"90",X"05",X"05",X"21",X"33",X"37",X"37",X"23",X"21",X"07",X"FC",X"00",X"E0",X"00", + X"80",X"00",X"80",X"07",X"E0",X"0F",X"FC",X"00",X"10",X"00",X"10",X"00",X"00",X"00",X"40",X"08", + X"00",X"00",X"10",X"82",X"69",X"96",X"69",X"86",X"01",X"0F",X"02",X"06",X"02",X"03",X"05",X"03", + X"02",X"05",X"05",X"01",X"06",X"06",X"18",X"94",X"02",X"03",X"21",X"21",X"D0",X"CC",X"C2",X"21", + X"02",X"AA",X"05",X"54",X"10",X"FF",X"1E",X"0F",X"1F",X"E1",X"05",X"54",X"00",X"01",X"10",X"00", + X"02",X"00",X"40",X"20",X"00",X"04",X"00",X"00",X"80",X"00",X"60",X"18",X"06",X"01",X"0F",X"04", + X"06",X"04",X"03",X"04",X"04",X"02",X"03",X"02",X"01",X"02",X"02",X"1B",X"98",X"01",X"01",X"62", + X"72",X"72",X"31",X"31",X"21",X"21",X"80",X"21",X"C0",X"21",X"E0",X"01",X"F0",X"01",X"F8",X"01", + X"FC",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"00",X"00",X"84",X"04",X"04", + X"01",X"01",X"81",X"0B",X"01",X"06",X"06",X"04",X"06",X"04",X"01",X"03",X"03",X"15",X"9C",X"04", + X"04",X"21",X"21",X"CC",X"CC",X"21",X"21",X"00",X"70",X"00",X"0E",X"5C",X"07",X"5C",X"07",X"0E", + X"00",X"01",X"C0",X"00",X"04",X"00",X"80",X"00",X"20",X"00",X"80",X"00",X"20",X"00",X"00",X"80", + X"B0",X"18",X"18",X"0D",X"01",X"0F",X"05",X"06",X"05",X"03",X"05",X"04",X"02",X"04",X"03",X"01", + X"02",X"02",X"1E",X"A0",X"04",X"06",X"62",X"6A",X"62",X"70",X"62",X"62",X"0A",X"A1",X"03",X"01", + X"07",X"E1",X"00",X"FD",X"00",X"51",X"05",X"51",X"00",X"00",X"00",X"12",X"08",X"00",X"01",X"00", + X"00",X"02",X"00",X"00",X"06",X"C6",X"C6",X"E2",X"E2",X"C2",X"0F",X"01",X"05",X"05",X"02",X"03", + X"03",X"04",X"06",X"06",X"01",X"06",X"06",X"12",X"A4",X"06",X"06",X"D2",X"D6",X"D6",X"D6",X"D6", + X"25",X"10",X"E1",X"10",X"81",X"10",X"81",X"10",X"81",X"10",X"81",X"00",X"8C",X"00",X"40",X"00", + X"04",X"04",X"00",X"00",X"04",X"00",X"40",X"00",X"00",X"64",X"60",X"60",X"60",X"60",X"29",X"0F", + X"02",X"06",X"06",X"01",X"06",X"06",X"01",X"06",X"01",X"01",X"06",X"06",X"18",X"B4",X"04",X"0E", + X"70",X"D8",X"CC",X"C6",X"83",X"21",X"81",X"EF",X"00",X"2F",X"00",X"0F",X"80",X"00",X"1F",X"E0", + X"0F",X"EE",X"02",X"00",X"00",X"40",X"00",X"20",X"20",X"00",X"20",X"08",X"00",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"01",X"06",X"01",X"1B",X"AC",X"06",X"06",X"C0",X"23",X"25",X"29", + X"31",X"C0",X"03",X"F0",X"03",X"F0",X"03",X"98",X"03",X"38",X"01",X"F8",X"09",X"F8",X"04",X"00", + X"04",X"00",X"00",X"04",X"00",X"04",X"00",X"04",X"00",X"00",X"80",X"81",X"81",X"81",X"81",X"01", + X"09",X"02",X"06",X"02",X"01",X"06",X"05",X"15",X"B0",X"04",X"04",X"21",X"21",X"62",X"6E",X"6E", + X"2D",X"02",X"E8",X"02",X"E8",X"0E",X"E1",X"0E",X"01",X"0E",X"01",X"0E",X"0C",X"08",X"00",X"00", + X"02",X"00",X"00",X"40",X"00",X"41",X"02",X"40",X"10",X"80",X"81",X"26",X"1A",X"1A",X"19",X"0F", + X"05",X"06",X"05",X"01",X"04",X"01",X"01",X"04",X"01",X"01",X"05",X"01",X"12",X"A8",X"07",X"07", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"1F",X"EF",X"1F",X"EF",X"1F",X"EF",X"1F",X"EF",X"1F",X"EF", + X"1F",X"EF",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"02",X"01",X"06",X"01",X"0F",X"B8",X"06",X"09",X"95",X"7A",X"97",X"7A", + X"97",X"C0",X"10",X"9C",X"00",X"21",X"10",X"80",X"00",X"21",X"10",X"80",X"10",X"E1",X"06",X"00", + X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"61",X"66",X"66",X"66",X"66",X"66", + X"0F",X"01",X"06",X"04",X"01",X"06",X"04",X"01",X"05",X"03",X"01",X"06",X"03",X"1E",X"BC",X"1F", + X"1C",X"C0",X"7A",X"97",X"9B",X"76",X"DA",X"10",X"E1",X"00",X"21",X"10",X"80",X"10",X"20",X"00", + X"81",X"10",X"21",X"00",X"40",X"00",X"02",X"00",X"00",X"08",X"00",X"00",X"40",X"00",X"40",X"66", + X"66",X"66",X"66",X"66",X"66",X"0F",X"01",X"06",X"06",X"01",X"06",X"01",X"01",X"06",X"01",X"01", + X"06",X"06",X"1E",X"A0",X"04",X"06",X"2D",X"2D",X"21",X"21",X"21",X"C0",X"48",X"02",X"08",X"02", + X"08",X"02",X"00",X"00",X"00",X"00",X"00",X"7E",X"00",X"00",X"40",X"00",X"00",X"44",X"00",X"07", + X"00",X"00",X"00",X"00",X"24",X"24",X"24",X"A4",X"00",X"40",X"0E",X"01",X"03",X"03",X"03",X"06", + X"04",X"03",X"06",X"06",X"08",X"36",X"17",X"36",X"26",X"36",X"35",X"36",X"44",X"36",X"53",X"36", + X"62",X"36",X"71",X"36",X"80",X"36",X"8F",X"36",X"9E",X"36",X"AD",X"36",X"BC",X"36",X"CB",X"36", + X"DA",X"36",X"E9",X"36",X"F8",X"36",X"07",X"37",X"01",X"18",X"15",X"20",X"03",X"01",X"28",X"01", + X"20",X"01",X"18",X"01",X"10",X"01",X"08",X"01",X"17",X"14",X"19",X"03",X"01",X"10",X"02",X"10", + X"02",X"10",X"02",X"10",X"01",X"10",X"01",X"16",X"13",X"16",X"03",X"01",X"0C",X"03",X"0D",X"03", + X"0E",X"03",X"0F",X"02",X"10",X"01",X"15",X"12",X"14",X"03",X"02",X"0B",X"04",X"0C",X"04",X"0D", + X"04",X"0E",X"03",X"0F",X"01",X"14",X"11",X"12",X"03",X"03",X"0A",X"05",X"0B",X"05",X"0C",X"05", + X"0D",X"04",X"0E",X"01",X"13",X"10",X"10",X"02",X"01",X"09",X"02",X"0A",X"03",X"0B",X"04",X"0C", + X"05",X"0D",X"01",X"12",X"0F",X"0E",X"02",X"03",X"08",X"04",X"09",X"04",X"0A",X"05",X"0B",X"05", + X"0C",X"01",X"11",X"0E",X"0C",X"02",X"04",X"07",X"04",X"08",X"04",X"09",X"05",X"0A",X"05",X"0B", + X"01",X"10",X"0D",X"0A",X"02",X"04",X"06",X"05",X"07",X"05",X"08",X"05",X"09",X"04",X"0A",X"01", + X"0F",X"0C",X"08",X"02",X"05",X"05",X"05",X"06",X"05",X"07",X"05",X"08",X"05",X"09",X"01",X"0E", + X"0B",X"06",X"01",X"03",X"04",X"05",X"05",X"05",X"06",X"05",X"07",X"05",X"08",X"01",X"0D",X"0A", + X"04",X"01",X"02",X"05",X"04",X"05",X"04",X"05",X"05",X"05",X"05",X"05",X"01",X"0C",X"09",X"03", + X"01",X"03",X"03",X"05",X"04",X"05",X"05",X"04",X"06",X"04",X"07",X"01",X"0B",X"08",X"02",X"01", + X"03",X"01",X"04",X"02",X"05",X"03",X"04",X"04",X"05",X"05",X"01",X"0A",X"07",X"01",X"01",X"05", + X"01",X"05",X"01",X"05",X"01",X"05",X"01",X"05",X"01",X"01",X"20",X"20",X"80",X"01",X"05",X"72", + X"04",X"66",X"01",X"32",X"02",X"40",X"03",X"50",X"01",X"20",X"20",X"14",X"01",X"01",X"10",X"04", + X"15",X"02",X"36",X"03",X"10",X"05",X"13",X"01",X"20",X"20",X"20",X"01",X"03",X"03",X"02",X"30", + X"04",X"08",X"01",X"28",X"05",X"12",X"F5",X"C5",X"D5",X"E5",X"F3",X"21",X"16",X"37",X"11",X"AF", + X"A6",X"01",X"07",X"FF",X"DB",X"21",X"C3",X"2A",X"19",X"D5",X"E5",X"97",X"6F",X"67",X"32",X"A5", + X"4E",X"32",X"A1",X"4C",X"FD",X"E1",X"3C",X"32",X"3C",X"4C",X"32",X"3D",X"4C",X"FD",X"7E",X"00", + X"FD",X"23",X"5F",X"16",X"00",X"19",X"10",X"F5",X"0D",X"32",X"C0",X"50",X"20",X"EF",X"D1",X"19", + X"7C",X"EB",X"E5",X"DD",X"E1",X"11",X"84",X"23",X"D5",X"FD",X"E1",X"FD",X"E9",X"DB",X"32",X"E1", + X"D1",X"C1",X"F1",X"FB",X"C3",X"03",X"3C",X"3A",X"37",X"4C",X"FE",X"01",X"28",X"26",X"DD",X"21", + X"93",X"4C",X"21",X"9B",X"4C",X"11",X"44",X"4C",X"06",X"03",X"7E",X"12",X"2B",X"1B",X"10",X"FA", + X"CD",X"2B",X"3A",X"3A",X"91",X"4C",X"A7",X"20",X"08",X"CD",X"AA",X"37",X"CD",X"B1",X"37",X"18", + X"06",X"CD",X"B1",X"37",X"CD",X"AA",X"37",X"3A",X"94",X"4C",X"FE",X"01",X"C0",X"97",X"32",X"94", + X"4C",X"CD",X"0C",X"3B",X"06",X"B4",X"CD",X"72",X"03",X"C9",X"21",X"96",X"4C",X"3E",X"01",X"18", + X"05",X"21",X"99",X"4C",X"3E",X"02",X"32",X"8A",X"4C",X"CD",X"58",X"02",X"11",X"45",X"4C",X"06", + X"03",X"7E",X"12",X"23",X"13",X"10",X"FA",X"CD",X"D6",X"37",X"C9",X"DB",X"02",X"DB",X"00",X"F1", + X"C1",X"D1",X"E1",X"C3",X"3F",X"02",X"3A",X"93",X"4C",X"FE",X"0A",X"28",X"04",X"3C",X"32",X"93", + X"4C",X"DD",X"21",X"7E",X"4C",X"21",X"45",X"4C",X"11",X"42",X"4C",X"06",X"03",X"7E",X"12",X"23", + X"13",X"10",X"FA",X"CD",X"2B",X"3A",X"3A",X"91",X"4C",X"A7",X"C8",X"3E",X"01",X"32",X"94",X"4C", + X"11",X"89",X"4C",X"06",X"03",X"2B",X"7E",X"12",X"1B",X"10",X"FA",X"97",X"12",X"1B",X"12",X"1B", + X"12",X"CD",X"18",X"38",X"CD",X"D2",X"39",X"C9",X"97",X"CD",X"B4",X"02",X"CD",X"12",X"06",X"32", + X"8C",X"4C",X"11",X"71",X"3A",X"21",X"86",X"42",X"CD",X"6B",X"04",X"3A",X"8A",X"4C",X"FE",X"01", + X"3E",X"32",X"20",X"01",X"3D",X"32",X"87",X"41",X"3E",X"0B",X"CD",X"7A",X"09",X"CD",X"A1",X"03", + X"11",X"A4",X"3A",X"21",X"8A",X"43",X"CD",X"6B",X"04",X"11",X"9B",X"3A",X"21",X"52",X"42",X"CD", + X"6B",X"04",X"11",X"8C",X"3A",X"21",X"DA",X"42",X"CD",X"6B",X"04",X"3E",X"30",X"32",X"8B",X"4C", + X"CD",X"B2",X"39",X"3E",X"14",X"32",X"8D",X"4C",X"11",X"90",X"4C",X"3E",X"01",X"32",X"8F",X"4C", + X"3E",X"41",X"12",X"CD",X"8C",X"39",X"06",X"3C",X"32",X"0A",X"4C",X"CD",X"64",X"39",X"3A",X"8C", + X"4C",X"FE",X"01",X"C8",X"CD",X"7C",X"02",X"CB",X"6F",X"20",X"3B",X"3A",X"8F",X"4C",X"E6",X"01", + X"3E",X"14",X"28",X"02",X"3E",X"17",X"CD",X"7A",X"09",X"3A",X"8F",X"4C",X"21",X"83",X"4C",X"85", + X"6F",X"7C",X"CE",X"00",X"67",X"1A",X"77",X"3A",X"8F",X"4C",X"FE",X"03",X"C8",X"3C",X"32",X"8F", + X"4C",X"CD",X"7C",X"02",X"CB",X"6F",X"20",X"0B",X"CD",X"64",X"39",X"3A",X"8C",X"4C",X"FE",X"01", + X"C8",X"18",X"EE",X"CD",X"8C",X"39",X"CD",X"7C",X"02",X"CB",X"5F",X"20",X"0B",X"1A",X"3D",X"FE", + X"2F",X"20",X"02",X"3E",X"5B",X"12",X"18",X"0F",X"CD",X"7C",X"02",X"CB",X"47",X"20",X"9C",X"1A", + X"3C",X"FE",X"5C",X"20",X"02",X"3E",X"30",X"12",X"CD",X"8C",X"39",X"3A",X"8D",X"4C",X"FE",X"06", + X"38",X"05",X"3D",X"3D",X"32",X"8D",X"4C",X"32",X"8E",X"4C",X"CD",X"7C",X"02",X"32",X"C0",X"50", + X"CB",X"5F",X"28",X"0C",X"CB",X"47",X"28",X"08",X"3E",X"14",X"32",X"8D",X"4C",X"C3",X"7B",X"38", + X"3A",X"0A",X"4C",X"A7",X"20",X"FA",X"3E",X"01",X"32",X"0A",X"4C",X"10",X"13",X"06",X"3C",X"3A", + X"8B",X"4C",X"D6",X"01",X"27",X"32",X"8B",X"4C",X"CD",X"B2",X"39",X"3A",X"8B",X"4C",X"A7",X"C8", + X"21",X"8E",X"4C",X"35",X"20",X"C4",X"3A",X"8D",X"4C",X"FE",X"06",X"38",X"05",X"3D",X"3D",X"32", + X"8D",X"4C",X"77",X"CD",X"7C",X"02",X"CB",X"5F",X"20",X"0B",X"1A",X"3D",X"FE",X"2F",X"20",X"02", + X"3E",X"5B",X"12",X"18",X"08",X"1A",X"3C",X"FE",X"5C",X"20",X"02",X"3E",X"30",X"12",X"CD",X"8C", + X"39",X"C3",X"FA",X"38",X"3A",X"0A",X"4C",X"32",X"C0",X"50",X"A7",X"20",X"F7",X"3E",X"01",X"32", + X"0A",X"4C",X"10",X"17",X"06",X"3C",X"3A",X"8B",X"4C",X"D6",X"01",X"27",X"32",X"8B",X"4C",X"CD", + X"B2",X"39",X"A7",X"28",X"01",X"C9",X"3E",X"01",X"32",X"8C",X"4C",X"C9",X"F5",X"C5",X"E5",X"21", + X"52",X"42",X"3A",X"8F",X"4C",X"FE",X"02",X"20",X"03",X"21",X"12",X"42",X"FE",X"03",X"20",X"03", + X"21",X"D2",X"41",X"3E",X"09",X"32",X"02",X"4C",X"3A",X"90",X"4C",X"CD",X"1A",X"04",X"E1",X"C1", + X"F1",X"C9",X"21",X"5A",X"41",X"F5",X"97",X"32",X"08",X"4C",X"3A",X"95",X"4C",X"3C",X"FE",X"0F", + X"38",X"02",X"3E",X"03",X"32",X"95",X"4C",X"32",X"02",X"4C",X"3A",X"8B",X"4C",X"CD",X"F3",X"03", + X"F1",X"C9",X"01",X"0A",X"0A",X"DD",X"21",X"48",X"4C",X"21",X"4D",X"4C",X"11",X"4E",X"4C",X"32", + X"C0",X"50",X"C5",X"06",X"06",X"E5",X"21",X"3F",X"4C",X"1A",X"77",X"13",X"23",X"10",X"FA",X"E1", + X"1B",X"CD",X"2B",X"3A",X"3A",X"91",X"4C",X"FE",X"01",X"20",X"1D",X"06",X"06",X"7E",X"12",X"2B", + X"1B",X"10",X"FA",X"23",X"13",X"06",X"06",X"D5",X"11",X"3F",X"4C",X"1A",X"77",X"13",X"23",X"10", + X"FA",X"D1",X"2B",X"13",X"13",X"13",X"13",X"13",X"13",X"D5",X"11",X"06",X"00",X"19",X"DD",X"19", + X"D1",X"C1",X"10",X"BB",X"06",X"0A",X"0D",X"C2",X"D5",X"39",X"C9",X"F5",X"D5",X"E5",X"21",X"08", + X"4C",X"97",X"77",X"32",X"91",X"4C",X"11",X"44",X"4C",X"1A",X"DD",X"96",X"05",X"27",X"F5",X"A7", + X"28",X"03",X"3E",X"01",X"77",X"F1",X"1B",X"1A",X"DD",X"9E",X"04",X"27",X"F5",X"A7",X"28",X"03", + X"3E",X"01",X"77",X"F1",X"1B",X"1A",X"DD",X"9E",X"03",X"27",X"F5",X"A7",X"28",X"03",X"3E",X"01", + X"77",X"F1",X"38",X"09",X"7E",X"A7",X"28",X"05",X"3E",X"01",X"32",X"91",X"4C",X"E1",X"D1",X"F1", + X"C9",X"FF",X"03",X"47",X"52",X"45",X"41",X"54",X"20",X"53",X"43",X"4F",X"52",X"45",X"FF",X"FE", + X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"20",X"20",X"21",X"FF",X"FF",X"FF",X"05",X"54",X"49", + X"4D",X"45",X"20",X"4C",X"45",X"46",X"54",X"FF",X"09",X"FF",X"FF",X"FF",X"06",X"5F",X"20",X"5F", + X"20",X"5F",X"FF",X"FF",X"FF",X"06",X"4D",X"4F",X"56",X"45",X"20",X"4A",X"4F",X"59",X"53",X"54", + X"49",X"43",X"4B",X"20",X"FF",X"0D",X"55",X"50",X"20",X"FF",X"06",X"4F",X"52",X"20",X"FF",X"08", + X"44",X"4F",X"57",X"4E",X"FF",X"06",X"FF",X"FE",X"54",X"4F",X"20",X"53",X"45",X"4C",X"45",X"43", + X"54",X"20",X"4C",X"45",X"54",X"54",X"45",X"52",X"53",X"2E",X"FF",X"FE",X"48",X"49",X"54",X"20", + X"FF",X"0E",X"43",X"41",X"4C",X"4C",X"20",X"FF",X"06",X"54",X"4F",X"20",X"45",X"4E",X"54",X"45", + X"52",X"20",X"49",X"4E",X"49",X"54",X"49",X"41",X"4C",X"53",X"2E",X"FF",X"FF",X"FF",X"09",X"4D", + X"4F",X"42",X"20",X"4D",X"41",X"53",X"48",X"45",X"52",X"53",X"FF",X"FF",X"97",X"CD",X"BD",X"02", + X"CD",X"12",X"06",X"11",X"FD",X"3A",X"21",X"86",X"42",X"CD",X"6B",X"04",X"01",X"01",X"0A",X"11", + X"4B",X"4C",X"21",X"09",X"43",X"E5",X"CD",X"3E",X"3B",X"21",X"06",X"00",X"19",X"EB",X"E1",X"23", + X"23",X"3A",X"93",X"4C",X"B9",X"C8",X"79",X"C6",X"01",X"27",X"4F",X"10",X"E8",X"C9",X"C5",X"D5", + X"3E",X"01",X"32",X"08",X"4C",X"3E",X"0D",X"32",X"02",X"4C",X"79",X"CD",X"F3",X"03",X"3E",X"2E", + X"CD",X"1A",X"04",X"01",X"C0",X"FF",X"09",X"3E",X"01",X"32",X"08",X"4C",X"3E",X"06",X"32",X"02", + X"4C",X"CD",X"D9",X"03",X"01",X"60",X"FF",X"09",X"3E",X"0E",X"32",X"02",X"4C",X"06",X"03",X"1B", + X"1A",X"CD",X"1A",X"04",X"C5",X"01",X"40",X"00",X"09",X"C1",X"10",X"F3",X"D1",X"C1",X"C9",X"E5", + X"D5",X"C5",X"F5",X"11",X"06",X"53",X"21",X"93",X"3B",X"01",X"04",X"00",X"DB",X"01",X"DB",X"03", + X"C3",X"C1",X"04",X"3E",X"01",X"32",X"14",X"4C",X"32",X"4B",X"4D",X"CD",X"5E",X"02",X"3A",X"80", + X"50",X"CB",X"6F",X"3E",X"01",X"28",X"01",X"97",X"32",X"15",X"4C",X"97",X"32",X"31",X"4C",X"3C", + X"32",X"16",X"4C",X"3E",X"19",X"32",X"4C",X"4D",X"3E",X"10",X"CD",X"EF",X"3B",X"32",X"16",X"4C", + X"F3",X"DB",X"C9",X"DB",X"CB",X"3E",X"66",X"00",X"D6",X"65",X"47",X"DB",X"DC",X"DB",X"E6",X"FB", + X"78",X"32",X"31",X"4C",X"32",X"4C",X"4D",X"3E",X"11",X"CD",X"EF",X"3B",X"CD",X"0C",X"3B",X"CD", + X"12",X"06",X"CD",X"49",X"06",X"CD",X"41",X"3E",X"0E",X"08",X"CD",X"2B",X"03",X"18",X"BC",X"32", + X"4E",X"4D",X"3E",X"01",X"32",X"4B",X"4D",X"32",X"3C",X"4C",X"32",X"3E",X"4C",X"CD",X"C3",X"27", + X"C3",X"16",X"37",X"3A",X"00",X"4C",X"47",X"97",X"21",X"18",X"4C",X"11",X"04",X"00",X"77",X"19", + X"10",X"FC",X"CD",X"E9",X"05",X"CD",X"49",X"06",X"97",X"32",X"A3",X"4C",X"3E",X"09",X"CD",X"0E", + X"05",X"CD",X"C4",X"05",X"3A",X"17",X"4C",X"FE",X"01",X"28",X"08",X"3E",X"09",X"CD",X"16",X"05", + X"CD",X"CC",X"05",X"3E",X"01",X"32",X"A3",X"4C",X"CD",X"B0",X"2E",X"97",X"C9",X"F5",X"C5",X"E5", + X"3A",X"2C",X"4F",X"07",X"07",X"06",X"00",X"4F",X"21",X"18",X"4C",X"09",X"7E",X"A7",X"20",X"48", + X"E5",X"3A",X"31",X"4C",X"A7",X"21",X"A7",X"3C",X"28",X"08",X"FE",X"01",X"21",X"4B",X"3D",X"28", + X"01",X"FF",X"CB",X"19",X"09",X"4E",X"23",X"46",X"E1",X"E5",X"23",X"23",X"71",X"23",X"70",X"E1", + X"E5",X"23",X"23",X"4E",X"23",X"46",X"E1",X"F3",X"DB",X"97",X"0A",X"5F",X"DB",X"C8",X"FB",X"7B", + X"A7",X"28",X"BD",X"E5",X"3C",X"77",X"03",X"23",X"F3",X"DB",X"97",X"0A",X"5F",X"DB",X"C8",X"FB", + X"7B",X"77",X"03",X"23",X"71",X"23",X"70",X"E1",X"35",X"28",X"D5",X"23",X"7E",X"32",X"30",X"4C", + X"CD",X"49",X"03",X"E1",X"C1",X"F1",X"C9",X"B3",X"3C",X"2C",X"3D",X"19",X"3D",X"F4",X"3C",X"FB", + X"3C",X"0A",X"3D",X"10",X"80",X"05",X"85",X"4B",X"84",X"05",X"80",X"05",X"88",X"19",X"80",X"05", + X"84",X"1E",X"87",X"05",X"85",X"04",X"80",X"14",X"90",X"08",X"80",X"19",X"85",X"08",X"90",X"1E", + X"80",X"05",X"84",X"16",X"80",X"0E",X"90",X"2F",X"80",X"05",X"84",X"08",X"80",X"10",X"90",X"14", + X"80",X"0A",X"85",X"05",X"80",X"0A",X"88",X"10",X"80",X"0A",X"90",X"19",X"80",X"0A",X"90",X"1C", + X"80",X"23",X"84",X"FF",X"0A",X"80",X"18",X"84",X"64",X"80",X"FF",X"0A",X"80",X"0C",X"84",X"09", + X"80",X"05",X"88",X"04",X"80",X"12",X"84",X"64",X"80",X"FF",X"05",X"80",X"14",X"84",X"0A",X"87", + X"14",X"84",X"0A",X"86",X"05",X"85",X"64",X"80",X"FF",X"0A",X"80",X"05",X"84",X"05",X"80",X"05", + X"88",X"10",X"80",X"05",X"84",X"0A",X"86",X"05",X"84",X"64",X"80",X"FF",X"0A",X"80",X"0C",X"85", + X"05",X"80",X"05",X"88",X"08",X"80",X"04",X"84",X"05",X"86",X"05",X"87",X"14",X"84",X"05",X"80", + X"05",X"88",X"08",X"80",X"04",X"85",X"0A",X"86",X"10",X"84",X"FF",X"57",X"3D",X"B2",X"3D",X"FF", + X"3D",X"C3",X"3D",X"E6",X"3D",X"28",X"3E",X"05",X"80",X"0A",X"85",X"05",X"84",X"0A",X"87",X"05", + X"85",X"05",X"84",X"0A",X"87",X"05",X"85",X"05",X"84",X"0A",X"87",X"05",X"85",X"05",X"84",X"0A", + X"87",X"05",X"85",X"05",X"84",X"08",X"87",X"03",X"86",X"02",X"87",X"04",X"86",X"07",X"87",X"05", + X"80",X"1E",X"85",X"05",X"84",X"04",X"90",X"05",X"80",X"0A",X"84",X"0A",X"86",X"0F",X"85",X"03", + X"80",X"05",X"88",X"10",X"80",X"05",X"85",X"14",X"80",X"0A",X"85",X"14",X"80",X"05",X"88",X"04", + X"80",X"05",X"90",X"05",X"80",X"05",X"85",X"0C",X"80",X"08",X"90",X"02",X"80",X"05",X"85",X"FF", + X"FF",X"FF",X"02",X"80",X"08",X"85",X"30",X"84",X"02",X"80",X"28",X"85",X"28",X"84",X"30",X"85", + X"FF",X"FF",X"FF",X"05",X"80",X"06",X"85",X"05",X"80",X"05",X"88",X"05",X"80",X"12",X"85",X"05", + X"80",X"05",X"88",X"05",X"80",X"0C",X"84",X"0C",X"85",X"05",X"80",X"05",X"88",X"05",X"80",X"1E", + X"84",X"05",X"80",X"FF",X"FF",X"FF",X"05",X"80",X"0A",X"84",X"0A",X"87",X"14",X"84",X"0C",X"80", + X"37",X"85",X"32",X"84",X"0C",X"80",X"32",X"85",X"0A",X"87",X"05",X"84",X"05",X"80",X"FF",X"05", + X"80",X"05",X"84",X"05",X"80",X"05",X"88",X"05",X"80",X"0A",X"85",X"05",X"80",X"05",X"88",X"05", + X"80",X"0F",X"84",X"0A",X"87",X"0A",X"85",X"05",X"84",X"05",X"88",X"10",X"80",X"05",X"84",X"0A", + X"86",X"28",X"85",X"05",X"80",X"05",X"84",X"FF",X"05",X"80",X"04",X"85",X"05",X"88",X"1C",X"80", + X"04",X"85",X"28",X"87",X"0A",X"80",X"10",X"84",X"0C",X"84",X"0A",X"86",X"28",X"85",X"40",X"80", + X"FF",X"21",X"9E",X"43",X"11",X"5C",X"3E",X"CD",X"6B",X"04",X"3A",X"80",X"50",X"E6",X"1C",X"EE", + X"1C",X"0F",X"0F",X"C6",X"32",X"21",X"DE",X"41",X"CD",X"1A",X"04",X"C9",X"FF",X"0B",X"42",X"4F", + X"4E",X"55",X"53",X"20",X"47",X"4C",X"4F",X"42",X"20",X"41",X"54",X"20",X"30",X"30",X"30",X"30", + X"30",X"20",X"50",X"4F",X"49",X"4E",X"54",X"53",X"FF",X"FF",X"97",X"42",X"A7",X"3E",X"1E",X"F6", + X"09",X"00",X"3F",X"00",X"00",X"40",X"3F",X"3F",X"3F",X"80",X"3F",X"3F",X"3E",X"C0",X"3F",X"3F", + X"3D",X"80",X"3F",X"3F",X"3B",X"40",X"3F",X"3F",X"37",X"C0",X"3F",X"3F",X"2F",X"C0",X"3F",X"3F", + X"1F",X"40",X"3F",X"3F",X"00",X"3F",X"FF",X"4D",X"45",X"45",X"54",X"20",X"54",X"48",X"45",X"20", + X"47",X"4C",X"4F",X"42",X"FF",X"FF",X"4D",X"55",X"4E",X"43",X"48",X"20",X"41",X"4C",X"4C",X"20", + X"54",X"48",X"45",X"20",X"53",X"4E",X"41",X"43",X"4B",X"53",X"FF",X"FE",X"54",X"4F",X"20",X"43", + X"4C",X"45",X"41",X"52",X"20",X"54",X"48",X"45",X"20",X"4C",X"45",X"56",X"45",X"4C",X"FF",X"FF", + X"50",X"55",X"53",X"48",X"20",X"43",X"41",X"4C",X"4C",X"20",X"42",X"55",X"54",X"54",X"4F",X"4E", + X"FF",X"FE",X"54",X"4F",X"20",X"52",X"49",X"44",X"45",X"20",X"45",X"4C",X"45",X"56",X"41",X"54", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/SuperGlob.sv b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/SuperGlob.sv new file mode 100644 index 00000000..17336abb --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/SuperGlob.sv @@ -0,0 +1,189 @@ +//============================================================================ +// Arcade: SuperGlob +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module SuperGlob +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Super Glob;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [7:0] audio; +wire hsync,vsync; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid = ce_6m; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(r), + .G(g), + .B(b), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + + +pacman mrtnt +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + .in0_reg(~{2'b00, m_coin, 1'b0, m_down,m_right,m_left,m_up}), + .in1_reg(~{1'b0, m_start2, m_start1, m_fire, 4'b0000}), + .dipsw_reg(8'b1_1_0_100_00), + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +endmodule diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_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/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/build_id.v new file mode 100644 index 00000000..6ea3a1fd --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171113" +`define BUILD_TIME "101935" diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_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/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_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/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/osd.v b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_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/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..70300d20 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pacman.vhd @@ -0,0 +1,629 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN is +generic ( + MRTNT : std_logic := '0' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0_reg : in std_logic_vector(7 downto 0); + in1_reg : in std_logic_vector(7 downto 0); + dipsw_reg : in std_logic_vector(7 downto 0); + + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of PACMAN is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_ena : std_logic; + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal rom_data_out : std_logic_vector(7 downto 0); + signal rom_data : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal vram_addr_ab : std_logic_vector(11 downto 0); + signal ab : std_logic_vector(11 downto 0); + + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal vram_l : std_logic; + signal rams_data_out : std_logic_vector(7 downto 0); + -- more decode + signal wr0_l : std_logic; + signal wr1_l : std_logic; + signal wr2_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + +begin + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + p_sync_comb : process(hcnt, vcnt) + begin + vsync <= not vcnt(8); + do_hsync <= (hcnt = "010101111"); -- 0AF + end process; + + p_sync : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + + if (hcnt = "010010111") then -- 097 + O_HBLANK <= '1'; + elsif (hcnt = "010001111") then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") then + hblank <= '0'; -- 0EF + O_HBLANK <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + -- + -- cpu + -- + p_cpu_wait_comb : process(sync_bus_wreq_l) + begin + cpu_wait_l <= '1'; + if (sync_bus_wreq_l = '0') then + cpu_wait_l <= '0'; + end if; + end process; + + p_irq_req_watchdog : process + variable rising_vblank : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + --rising_vblank := do_hsync; -- debug + -- interrupt 8c + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + + -- simulation + -- pragma translate_off + -- synopsys translate_off + watchdog_reset_l <= not reset; -- watchdog disable + -- synopsys translate_on + -- pragma translate_on + end if; + end process; + + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + + p_cpu_ena : process(hcnt, ena_6) + begin + cpu_ena <= '0'; + if (ena_6 = '1') then + cpu_ena <= hcnt(0); + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + -- + -- primary addr decode + -- + p_mem_decode_comb : process(cpu_rfsh_l, cpu_rd_l, cpu_mreq_l, cpu_addr) + begin + -- rom 0x0000 - 0x3FFF + -- syncbus 0x4000 - 0x7FFF + + -- 7M + -- 7N + sync_bus_cs_l <= '1'; +-- program_rom_cs_l <= '1'; + + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + +-- if (cpu_addr(14) = '0') and (cpu_rd_l = '0') then +-- program_rom_cs_l <= '0'; +-- end if; + + if (cpu_addr(14) = '1') then + sync_bus_cs_l <= '0'; + end if; + + end if; + end process; + -- + -- sync bus custom ic + -- + p_sync_bus_reg : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; + end process; + + p_sync_bus_comb : process(cpu_rd_l, sync_bus_cs_l, hcnt) + begin + -- sync_bus_stb is now an active low clock enable signal + sync_bus_stb <= '1'; + sync_bus_r_w_l <= '1'; + + if (sync_bus_cs_l = '0') and (hcnt(1) = '0') then + if (cpu_rd_l = '1') then + sync_bus_r_w_l <= '0'; + end if; + sync_bus_stb <= '0'; + end if; + + sync_bus_wreq_l <= '1'; + if (sync_bus_cs_l = '0') and (hcnt(1) = '1') and (cpu_rd_l = '0') then + sync_bus_wreq_l <= '0'; + end if; + end process; + -- + -- vram addr custom ic + -- + u_vram_addr : entity work.PACMAN_VRAM_ADDR + port map ( + AB => vram_addr_ab, + H256_L => hcnt(8), + H128 => hcnt(7), + H64 => hcnt(6), + H32 => hcnt(5), + H16 => hcnt(4), + H8 => hcnt(3), + H4 => hcnt(2), + H2 => hcnt(1), + H1 => hcnt(0), + V128 => vcnt(7), + V64 => vcnt(6), + V32 => vcnt(5), + V16 => vcnt(4), + V8 => vcnt(3), + V4 => vcnt(2), + V2 => vcnt(1), + V1 => vcnt(0), + FLIP => control_reg(3) + ); + + p_ab_mux_comb : process(hcnt, cpu_addr, vram_addr_ab) + begin + --When 2H is low, the CPU controls the bus. + if (hcnt(1) = '0') then + ab <= cpu_addr(11 downto 0); + else + ab <= vram_addr_ab; + end if; + end process; + + p_vram_comb : process(hcnt, cpu_addr, sync_bus_stb) + variable a,b : std_logic; + begin + + a := not (cpu_addr(12) or sync_bus_stb); + b := hcnt(1) and hcnt(0); + vram_l <= not (a or b); + end process; + + p_io_decode_comb : process(sync_bus_r_w_l, sync_bus_stb, ab, cpu_addr) + variable sel : std_logic_vector(2 downto 0); + variable dec : std_logic_vector(7 downto 0); + variable selb : std_logic_vector(1 downto 0); + variable decb : std_logic_vector(3 downto 0); + begin + -- WRITE + + -- out_l 0x5000 - 0x503F control space + + -- wr0_l 0x5040 - 0x504F sound + -- wr1_l 0x5050 - 0x505F sound + -- wr2_l 0x5060 - 0x506F sprite + + -- 0x5080 - 0x50BF unused + + -- wdr_l 0x50C0 - 0x50FF watchdog reset + + -- READ + + -- in0_l 0x5000 - 0x503F in port 0 + -- in1_l 0x5040 - 0x507F in port 1 + -- dipsw_l 0x5080 - 0x50BF dip switches + + -- 7J + dec := "11111111"; + sel := sync_bus_r_w_l & ab(7) & ab(6); + if (cpu_addr(12) = '1') and ( sync_bus_stb = '0') then + case sel is + when "000" => dec := "11111110"; + when "001" => dec := "11111101"; + when "010" => dec := "11111011"; + when "011" => dec := "11110111"; + when "100" => dec := "11101111"; + when "101" => dec := "11011111"; + when "110" => dec := "10111111"; + when "111" => dec := "01111111"; + when others => null; + end case; + end if; + iodec_out_l <= dec(0); + iodec_wdr_l <= dec(3); + + iodec_in0_l <= dec(4); + iodec_in1_l <= dec(5); + iodec_dipsw_l <= dec(6); + + -- 7M + decb := "1111"; + selb := ab(5) & ab(4); + if (dec(1) = '0') then + case selb is + when "00" => decb := "1110"; + when "01" => decb := "1101"; + when "10" => decb := "1011"; + when "11" => decb := "0111"; + when others => null; + end case; + end if; + wr0_l <= decb(0); + wr1_l <= decb(1); + wr2_l <= decb(2); + end process; + + p_control_reg : process + variable ena : std_logic_vector(7 downto 0); + begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + ena := "00000000"; + if (iodec_out_l = '0') then + case ab(2 downto 0) is + when "000" => ena := "00000001"; + when "001" => ena := "00000010"; + when "010" => ena := "00000100"; + when "011" => ena := "00001000"; + when "100" => ena := "00010000"; + when "101" => ena := "00100000"; + when "110" => ena := "01000000"; + when "111" => ena := "10000000"; + when others => null; + end case; + end if; + + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (ena(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + p_db_mux_comb : process(hcnt, cpu_data_out, rams_data_out) + begin + -- simplified data source for video subsystem + -- only cpu or ram are sources of interest + if (hcnt(1) = '0') then + sync_bus_db <= cpu_data_out; + else + sync_bus_db <= rams_data_out; + end if; + end process; + + rom_data <= program_rom_dinl when cpu_addr(15) = '0' else program_rom_dinh; + rom_data_out <= rom_data(7 downto 6) & rom_data(3) & rom_data(4) & rom_data(5) & rom_data(2 downto 0) when MRTNT = '1' else rom_data; + + p_cpu_data_in_mux_comb : process(cpu_addr, cpu_iorq_l, cpu_m1_l, sync_bus_wreq_l, + iodec_in0_l, iodec_in1_l, iodec_dipsw_l, cpu_vec_reg, sync_bus_reg, rom_data_out, + rams_data_out, in0_reg, in1_reg, dipsw_reg) + begin + -- simplifed again + if (cpu_iorq_l = '0') and (cpu_m1_l = '0') then + cpu_data_in <= cpu_vec_reg; + elsif (sync_bus_wreq_l = '0') then + cpu_data_in <= sync_bus_reg; + else + if (cpu_addr(15 downto 14) = "00") then -- ROM at 0000 - 3fff + cpu_data_in <= rom_data_out; + elsif (cpu_addr(15 downto 13) = "100") then -- ROM at 8000 - 9fff + cpu_data_in <= rom_data_out; + else + cpu_data_in <= rams_data_out; + if (iodec_in0_l = '0') then cpu_data_in <= in0_reg; end if; + if (iodec_in1_l = '0') then cpu_data_in <= in1_reg; end if; + if (iodec_dipsw_l = '0') then cpu_data_in <= dipsw_reg; end if; + end if; + end if; + end process; + + u_rams : work.dpram generic map (12,8) + port map + ( + clk_a_i => clk, + en_a_i => ena_6, + we_i => not sync_bus_r_w_l and not vram_l, + addr_a_i => ab(11 downto 0), + data_a_i => cpu_data_out, -- cpu only source of ram data + + clk_b_i => clk, + addr_b_i => ab(11 downto 0), + data_b_o => rams_data_out + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom : entity work.ROM_PGM_0 + port map ( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom1 : entity work.ROM_PGM_1 + port map ( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinh + ); + + -- + -- video subsystem + -- + u_video : entity work.PACMAN_VIDEO + generic map ( + MRTNT => MRTNT + ) + port map ( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + I_WR2_L => wr2_l, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk + ); + + O_HSYNC <= hSync; + O_VSYNC <= vSync; + + --O_HBLANK <= hblank; + O_VBLANK <= vblank; + + -- + -- + -- audio subsystem + -- + u_audio : entity work.PACMAN_AUDIO + port map ( + I_HCNT => hcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_WR1_L => wr1_l, + I_WR0_L => wr0_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..39619ea0 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR1_L, + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => rom3m(1), + addr_a_i => addr(3 downto 0), + data_a_i => data, + + clk_b_i => CLK, + addr_b_i => addr(3 downto 0), + data_b_o => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..895304e9 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pacman_video.vhd @@ -0,0 +1,366 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_VIDEO is +generic ( + MRTNT : std_logic := '0' -- 1 to descramble Mr TNT ROMs, 0 otherwise +); +port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + I_WR2_L : in std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic +); +end; + +architecture RTL of PACMAN_VIDEO is + + signal sprite_xy_ram_temp : std_logic_vector(7 downto 0); + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal db_reg : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_dout : std_logic_vector(7 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal cntr_ld : std_logic; + signal sprite_ram_ip : std_logic_vector(3 downto 0); + signal sprite_ram_op : std_logic_vector(3 downto 0); + signal ra : std_logic_vector(7 downto 0); + signal ra_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(3 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + + -- ram enable is low when HBLANK_L is 0 (for sprite access) or + -- 2H is low (for cpu writes) + -- we can simplify this + dr <= not sprite_xy_ram_temp when I_HBLANK = '1' else "11111111"; -- pull ups on board + + sprite_xy_ram : work.dpram generic map (4,8) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR2_L, + addr_a_i => I_AB(3 downto 0), + data_a_i => I_DB, + + clk_b_i => CLK, + addr_b_i => I_AB(3 downto 0), + data_b_o => sprite_xy_ram_temp + ); + + p_char_regs : process + variable inc : std_logic; + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; + begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + inc := (not I_HBLANK); + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & inc); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + db_reg <= I_DB; -- character reg + end if; + end process; + + p_flip_comb : process(char_hblank_reg, I_FLIP, db_reg) + begin + if (char_hblank_reg = '0') then + xflip <= I_FLIP; + yflip <= I_FLIP; + else + xflip <= db_reg(1); + yflip <= db_reg(0); + end if; + end process; + + p_char_addr_comb : process(db_reg, I_HCNT, + char_match_reg, char_sum_reg, char_hblank_reg, + xflip, yflip) + begin + obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + + ca(12) <= char_hblank_reg; + ca(11 downto 6) <= db_reg(7 downto 2); + + -- 2h, 4e + if (char_hblank_reg = '0') then + ca(5) <= db_reg(1); + ca(4) <= db_reg(0); + else + ca(5) <= char_sum_reg(3) xor xflip; + ca(4) <= I_HCNT(3); + end if; + + ca(3) <= I_HCNT(2) xor yflip; + ca(1) <= char_sum_reg(1) xor xflip; + + -- descramble ROMs for Mr TNT (swap address lines A0 and A2) + if MRTNT = '1' then + ca(2) <= char_sum_reg(0) xor xflip; + ca(0) <= char_sum_reg(2) xor xflip; + else + ca(2) <= char_sum_reg(2) xor xflip; + ca(0) <= char_sum_reg(0) xor xflip; + end if; + end process; + + + -- descramble ROMs for Mr TNT (swap data lines D4 and D6) + char_rom_5ef_dout <= char_rom_5ef_buf(7) & char_rom_5ef_buf(4) & char_rom_5ef_buf(5) & char_rom_5ef_buf(6) & char_rom_5ef_buf(3 downto 0) when MRTNT = '1' else char_rom_5ef_buf; + + -- char roms + char_rom_5ef : entity work.GFX1 + port map ( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf + ); + + p_char_shift : process + begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_dout(7 downto 4); -- load + shift_regl <= char_rom_5ef_dout(3 downto 0); + when others => null; + end case; + end if; + end process; + + p_char_shift_comb : process(I_HCNT, vout_yflip, shift_regu, shift_regl) + variable ip : std_logic; + begin + ip := I_HCNT(0) and I_HCNT(1); + if (vout_yflip = '0') then + + shift_sel(0) <= ip; + shift_sel(1) <= '1'; + shift_op(0) <= shift_regl(3); + shift_op(1) <= shift_regu(3); + else + + shift_sel(0) <= '1'; + shift_sel(1) <= ip; + shift_op(0) <= shift_regl(0); + shift_op(1) <= shift_regu(0); + end if; + end process; + + p_video_out_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= I_DB(4 downto 0); -- colour reg + end if; + end if; + end process; + + col_rom_4a : entity work.PROM4_DST + port map ( + CLK => CLK, + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a + ); + + cntr_ld <= '1' when (I_HCNT(3 downto 0) = "0111") and (vout_hblank='1' or vout_obj_on='0') else '0'; + + p_ra_cnt : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (cntr_ld = '1') then + ra <= dr; + else + ra <= ra + "1"; + end if; + end if; + end process; + + u_sprite_ram : work.dpram generic map (8,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => vout_obj_on_t1, + addr_a_i => ra_t1, + data_a_i => sprite_ram_ip, + + clk_b_i => CLK, + addr_b_i => ra, + data_b_o => sprite_ram_op + ); + + sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "0000"; + video_op_sel <= '1' when not (sprite_ram_reg = "0000") else '0'; + + p_sprite_ram_ip_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + ra_t1 <= ra; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + end if; + end process; + + p_sprite_ram_ip_comb : process(vout_hblank_t1, video_op_sel, sprite_ram_reg, lut_4a_t1) + begin + -- 3a + if (vout_hblank_t1 = '0') then + sprite_ram_ip <= (others => '0'); + else + if (video_op_sel = '1') then + sprite_ram_ip <= sprite_ram_reg; + else + sprite_ram_ip <= lut_4a_t1(3 downto 0); + end if; + end if; + end process; + + p_video_op_comb : process(vout_hblank, I_VBLANK, video_op_sel, sprite_ram_reg, lut_4a) + begin + -- 3b + if (vout_hblank = '1') or (I_VBLANK = '1') then + final_col <= (others => '0'); + else + if (video_op_sel = '1') then + final_col <= sprite_ram_reg; -- sprite + else + final_col <= lut_4a(3 downto 0); + end if; + end if; + end process; + + -- assign video outputs from color LUT PROM + col_rom_7f : entity work.PROM7_DST + port map ( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE + ); + +end architecture; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pacman_vram_addr.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pacman_vram_addr.vhd new file mode 100644 index 00000000..b26824c4 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pacman_vram_addr.vhd @@ -0,0 +1,273 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ & CarlW - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity X74_157 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end; + +architecture RTL of X74_157 is +begin + p_y_comb : process(S,G,A,B) + begin + for i in 0 to 3 loop + -- quad 2 line to 1 line mux (true logic) + if (G = '1') then + Y(i) <= '0'; + else + if (S = '0') then + Y(i) <= A(i); + else + Y(i) <= B(i); + end if; + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity X74_257 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end; + +architecture RTL of X74_257 is +signal ab : std_logic_vector (3 downto 0); +begin + + Y <= ab; -- no tristate + p_ab : process(S,A,B) + begin + for i in 0 to 3 loop + if (S = '0') then + AB(i) <= A(i); + else + AB(i) <= B(i); + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VRAM_ADDR is + port ( + AB : out std_logic_vector (11 downto 0); + H256_L : in std_logic; + H128 : in std_logic; + H64 : in std_logic; + H32 : in std_logic; + H16 : in std_logic; + H8 : in std_logic; + H4 : in std_logic; + H2 : in std_logic; + H1 : in std_logic; + V128 : in std_logic; + V64 : in std_logic; + V32 : in std_logic; + V16 : in std_logic; + V8 : in std_logic; + V4 : in std_logic; + V2 : in std_logic; + V1 : in std_logic; + FLIP : in std_logic + ); +end; + +architecture RTL of PACMAN_VRAM_ADDR is + +signal v128p : std_logic; +signal v64p : std_logic; +signal v32p : std_logic; +signal v16p : std_logic; +signal v8p : std_logic; +signal h128p : std_logic; +signal h64p : std_logic; +signal h32p : std_logic; +signal h16p : std_logic; +signal h8p : std_logic; +signal sel : std_logic; +signal y157 : std_logic_vector (11 downto 0); + +component X74_157 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end component; + +component X74_257 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end component; + +begin + p_vp_comb : process(FLIP, V8, V16, V32, V64, V128) + begin + v128p <= FLIP xor V128; + v64p <= FLIP xor V64; + v32p <= FLIP xor V32; + v16p <= FLIP xor V16; + v8p <= FLIP xor V8; + end process; + + p_hp_comb : process(FLIP, H8, H16, H32, H64, H128) + begin + H128P <= FLIP xor H128; + H64P <= FLIP xor H64; + H32P <= FLIP xor H32; + H16P <= FLIP xor H16; + H8P <= FLIP xor H8; + end process; + + p_sel : process(H16, H32, H64) + begin + sel <= not((H32 xor H16) or (H32 xor H64)); + end process; + + --p_oe257 : process(H2) + --begin + -- oe <= not(H2); + --end process; + + U6 : X74_157 + port map( + Y => y157(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => h64p, + B(0) => h64p, + A => "1111", + G => '0', + S => sel + ); + + U5 : X74_157 + port map( + Y => y157(7 downto 4), + B(3) => h64p, + B(2) => h64p, + B(1) => h8p, + B(0) => v128p, + A => "1111", + G => '0', + S => sel + ); + + U4 : X74_157 + port map( + Y => y157(3 downto 0), + B(3) => v64p, + B(2) => v32p, + B(1) => v16p, + B(0) => v8p, + A(3) => H64, + A(2) => H32, + A(1) => H16, + A(0) => H4, + G => '0', + S => sel + ); + + U3 : X74_257 + port map( + Y => AB(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => v128p, + B(0) => v64p, + A => y157(11 downto 8), + S => H256_L + ); + + U2 : X74_257 + port map( + Y => AB(7 downto 4), + B(3) => v32p, + B(2) => v16p, + B(1) => v8p, + B(0) => h128p, + A => y157(7 downto 4), + S => H256_L + ); + + U1 : X74_257 + port map( + Y => AB(3 downto 0), + B(3) => h64p, + B(2) => h32p, + B(1) => h16p, + B(0) => h8p, + A => y157(3 downto 0), + S => H256_L + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_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 VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pll.vhd b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pll.vhd new file mode 100644 index 00000000..3c952a1a --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/pll.vhd @@ -0,0 +1,365 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC ; + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + locked <= sub_wire0; + sub_wire2 <= sub_wire1(0); + c0 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 9, + clk0_duty_cycle => 50, + clk0_multiply_by => 8, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire4, + locked => sub_wire0, + clk => sub_wire1 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "9" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +-- 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 "1" +-- 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: 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_CLKENA0 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 "9" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +-- Retrieval info: CONSTANT: CLK0_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_USED" +-- 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_USED" +-- 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_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/SuperGlob_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/SuperGlob_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/Arcade/Pacman Hardware/VanVanCar_MiST/README.txt b/Arcade/Pacman Hardware/VanVanCar_MiST/README.txt new file mode 100644 index 00000000..be39499e --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/README.txt @@ -0,0 +1,27 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Van-Van Car for MiST by Gehstock +-- 16 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Van-Van Car hardware +-- Copyright (c) Sorgelig +-- Based on Pacman core: Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE,CTRL : Action +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + +ToDo: Fix Sound diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/Release/VanVanCar.rbf b/Arcade/Pacman Hardware/VanVanCar_MiST/Release/VanVanCar.rbf new file mode 100644 index 00000000..18c922cc Binary files /dev/null and b/Arcade/Pacman Hardware/VanVanCar_MiST/Release/VanVanCar.rbf differ diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/VanVanCar.qpf b/Arcade/Pacman Hardware/VanVanCar_MiST/VanVanCar.qpf new file mode 100644 index 00000000..455ed812 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/VanVanCar.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "VanVanCar" \ No newline at end of file diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/VanVanCar.qsf b/Arcade/Pacman Hardware/VanVanCar_MiST/VanVanCar.qsf new file mode 100644 index 00000000..d1f11d06 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/VanVanCar.qsf @@ -0,0 +1,137 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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.2 Build 203 01/18/2017 SJ Standard Edition +# Date created = 01:53:32 April 20, 2017 +# +# -------------------------------------------------------------------------- # + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY VanVanCar +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" + +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 + +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SAVE_DISK_SPACE OFF +set_global_assignment -name SMART_RECOMPILE ON +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 MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +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)" +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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 PLL_1 -to "pll:pll|altpll:altpll_component" + +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/pll.vhd +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/sn76489/sn76489_top.vhd +set_global_assignment -name VHDL_FILE rtl/sn76489/sn76489_tone.vhd +set_global_assignment -name VHDL_FILE rtl/sn76489/sn76489_noise.vhd +set_global_assignment -name VHDL_FILE rtl/sn76489/sn76489_latch_ctrl.vhd +set_global_assignment -name VHDL_FILE rtl/sn76489/sn76489_clock_div.vhd +set_global_assignment -name VHDL_FILE rtl/sn76489/sn76489_attenuator.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/GFX1.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/VanVanCar.sv +set_global_assignment -name VHDL_FILE rtl/vanvan_vram_addr.vhd +set_global_assignment -name VHDL_FILE rtl/vanvan_video.vhd +set_global_assignment -name VHDL_FILE rtl/vanvan.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +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 +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/VanVanCar.srf b/Arcade/Pacman Hardware/VanVanCar_MiST/VanVanCar.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/VanVanCar.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/clean.bat b/Arcade/Pacman Hardware/VanVanCar_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_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/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..cdd351ac --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"51",X"32",X"75",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"02",X"44",X"88", + X"32",X"65",X"99",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"48",X"6E",X"44",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"CC",X"8E",X"76",X"9F",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"66",X"FD",X"55",X"8A", + X"7C",X"BD",X"27",X"0A",X"AA",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"11",X"22",X"00",X"00", + X"00",X"00",X"00",X"88",X"00",X"00",X"00",X"00",X"8C",X"E2",X"77",X"11",X"00",X"22",X"00",X"00", + X"00",X"00",X"C8",X"CC",X"E6",X"15",X"AA",X"33",X"00",X"00",X"00",X"11",X"44",X"45",X"22",X"10", + X"00",X"00",X"88",X"44",X"22",X"88",X"91",X"33",X"00",X"00",X"CC",X"02",X"B3",X"55",X"EC",X"EF", + X"7D",X"8A",X"33",X"48",X"22",X"99",X"00",X"00",X"44",X"00",X"10",X"22",X"11",X"00",X"00",X"00", + X"DD",X"88",X"00",X"E6",X"44",X"00",X"00",X"00",X"C8",X"2A",X"55",X"2A",X"22",X"66",X"00",X"00", + X"07",X"78",X"F7",X"FC",X"FC",X"F7",X"F0",X"FF",X"00",X"01",X"03",X"16",X"34",X"3C",X"3C",X"3C", + X"00",X"08",X"0C",X"86",X"C2",X"C3",X"C3",X"C3",X"0E",X"E1",X"FE",X"F2",X"F3",X"FF",X"F0",X"FE", + X"FF",X"F0",X"FF",X"FC",X"FC",X"F6",X"78",X"07",X"3C",X"3C",X"3C",X"34",X"16",X"03",X"01",X"00", + X"C3",X"C3",X"C3",X"C2",X"86",X"0C",X"08",X"00",X"FF",X"F0",X"FF",X"F0",X"F0",X"F0",X"E1",X"0E", + X"44",X"22",X"77",X"1F",X"7F",X"0F",X"FF",X"0F",X"88",X"44",X"22",X"11",X"99",X"77",X"33",X"33", + X"11",X"22",X"44",X"88",X"99",X"EE",X"CC",X"CC",X"22",X"44",X"EE",X"0F",X"6F",X"6F",X"FF",X"0F", + X"7F",X"0F",X"FF",X"0F",X"7F",X"0F",X"77",X"88",X"33",X"33",X"77",X"BB",X"11",X"22",X"44",X"88", + X"CC",X"CC",X"EE",X"DD",X"88",X"44",X"22",X"11",X"EF",X"0F",X"FF",X"0F",X"EF",X"0F",X"EE",X"11", + X"00",X"C0",X"E0",X"E0",X"C0",X"8B",X"1E",X"3C",X"00",X"10",X"31",X"31",X"10",X"00",X"03",X"0F", + X"E0",X"F8",X"F8",X"E0",X"44",X"0C",X"CE",X"0F",X"00",X"10",X"10",X"00",X"00",X"0F",X"C7",X"C7", + X"3C",X"1E",X"8B",X"C0",X"E0",X"E0",X"C0",X"00",X"0F",X"03",X"00",X"10",X"31",X"31",X"10",X"00", + X"0F",X"CE",X"0C",X"44",X"E0",X"F8",X"F8",X"E0",X"C7",X"C7",X"0F",X"00",X"00",X"10",X"10",X"00", + X"01",X"01",X"03",X"83",X"C7",X"83",X"16",X"34",X"00",X"00",X"30",X"73",X"70",X"70",X"30",X"00", + X"00",X"00",X"C0",X"EC",X"E0",X"E0",X"C0",X"00",X"08",X"08",X"0C",X"1C",X"3E",X"1C",X"86",X"C2", + X"34",X"37",X"07",X"07",X"27",X"AF",X"03",X"01",X"00",X"00",X"00",X"60",X"F6",X"F0",X"F0",X"60", + X"00",X"00",X"00",X"60",X"F6",X"F0",X"F0",X"60",X"C2",X"CE",X"0E",X"0E",X"4E",X"5F",X"0C",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"3F",X"3F",X"3F",X"7F",X"7F",X"7F",X"7F",X"00",X"00",X"01",X"01",X"03",X"03",X"03",X"07", + X"00",X"00",X"08",X"08",X"0C",X"0C",X"0C",X"0C",X"CC",X"F8",X"F8",X"F8",X"E1",X"E1",X"E1",X"E1", + X"7F",X"3F",X"3F",X"33",X"00",X"00",X"00",X"00",X"09",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"C3",X"C3",X"C3",X"87",X"87",X"00",X"00",X"00",X"00",X"10",X"10",X"30",X"38", + X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"00",X"00",X"0C",X"7F",X"7F",X"7F",X"FE",X"FE", + X"87",X"87",X"87",X"C3",X"C3",X"03",X"00",X"00",X"34",X"30",X"10",X"10",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"FE",X"FE",X"7F",X"7F",X"7F",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"FC",X"FC",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"19", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"C0",X"87",X"87",X"87", + X"F8",X"F8",X"F8",X"F8",X"F8",X"FC",X"FC",X"30",X"37",X"33",X"33",X"33",X"11",X"11",X"00",X"00", + X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"1E",X"1E",X"1E",X"1E",X"87",X"87",X"87",X"C0", + X"0C",X"06",X"06",X"07",X"07",X"06",X"06",X"0C",X"03",X"66",X"EE",X"FA",X"FA",X"EE",X"66",X"03", + X"00",X"00",X"00",X"03",X"95",X"2A",X"55",X"AA",X"CC",X"C8",X"20",X"10",X"00",X"00",X"11",X"11", + X"33",X"31",X"40",X"80",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"0C",X"56",X"AB",X"55",X"AA", + X"00",X"CC",X"EE",X"11",X"11",X"33",X"EE",X"CC",X"00",X"11",X"33",X"66",X"44",X"44",X"33",X"11", + X"00",X"00",X"00",X"22",X"FF",X"FF",X"00",X"00",X"00",X"00",X"44",X"44",X"77",X"77",X"44",X"44", + X"00",X"22",X"33",X"99",X"99",X"DD",X"FF",X"66",X"00",X"66",X"77",X"77",X"55",X"55",X"44",X"44", + X"00",X"00",X"11",X"99",X"DD",X"FF",X"BB",X"11",X"00",X"22",X"66",X"44",X"44",X"44",X"77",X"33", + X"00",X"88",X"CC",X"66",X"33",X"FF",X"FF",X"00",X"00",X"11",X"11",X"11",X"11",X"77",X"77",X"11", + X"00",X"77",X"77",X"55",X"55",X"55",X"DD",X"88",X"00",X"22",X"66",X"44",X"44",X"44",X"77",X"33", + X"00",X"CC",X"EE",X"BB",X"99",X"99",X"99",X"00",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33", + X"00",X"33",X"33",X"11",X"99",X"DD",X"77",X"33",X"00",X"00",X"00",X"77",X"77",X"00",X"00",X"00", + X"00",X"66",X"FF",X"DD",X"99",X"99",X"66",X"00",X"00",X"33",X"44",X"44",X"55",X"55",X"77",X"33", + X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"EE",X"00",X"00",X"44",X"44",X"44",X"66",X"33",X"11", + X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00", + X"00",X"00",X"88",X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"88",X"CC",X"66",X"33",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"66",X"00",X"00", + X"00",X"88",X"88",X"88",X"88",X"88",X"88",X"00",X"00",X"22",X"22",X"22",X"22",X"22",X"22",X"00", + X"00",X"00",X"33",X"66",X"CC",X"88",X"00",X"00",X"00",X"00",X"66",X"33",X"11",X"00",X"00",X"00", + X"55",X"AA",X"5D",X"A6",X"03",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"10",X"20",X"C8",X"CC", + X"EE",X"33",X"11",X"99",X"DD",X"99",X"BB",X"EE",X"77",X"CC",X"88",X"99",X"BB",X"99",X"DD",X"77", + X"00",X"CC",X"EE",X"33",X"11",X"33",X"EE",X"CC",X"00",X"77",X"77",X"11",X"11",X"11",X"77",X"77", + X"00",X"FF",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00",X"77",X"77",X"44",X"44",X"44",X"77",X"33", + X"00",X"CC",X"EE",X"33",X"11",X"11",X"33",X"22",X"00",X"11",X"33",X"66",X"44",X"44",X"66",X"22", + X"00",X"FF",X"FF",X"11",X"11",X"33",X"EE",X"CC",X"00",X"77",X"77",X"44",X"44",X"66",X"33",X"11", + X"00",X"00",X"FF",X"FF",X"99",X"99",X"99",X"11",X"00",X"00",X"77",X"77",X"44",X"44",X"44",X"44", + X"00",X"FF",X"FF",X"99",X"99",X"99",X"99",X"11",X"00",X"77",X"77",X"00",X"00",X"00",X"00",X"00", + X"00",X"CC",X"EE",X"33",X"11",X"99",X"99",X"99",X"00",X"11",X"33",X"66",X"44",X"44",X"77",X"77", + X"00",X"FF",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00",X"77",X"77",X"00",X"00",X"00",X"77",X"77", + X"00",X"00",X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00",X"44",X"44",X"77",X"77",X"44",X"44", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"22",X"66",X"44",X"44",X"66",X"77",X"33", + X"00",X"FF",X"FF",X"88",X"CC",X"66",X"33",X"11",X"00",X"77",X"77",X"11",X"33",X"77",X"66",X"44", + X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",X"44",X"44",X"44",X"44", + X"00",X"FF",X"FF",X"EE",X"CC",X"EE",X"FF",X"FF",X"00",X"77",X"77",X"00",X"11",X"00",X"77",X"77", + X"00",X"FF",X"FF",X"EE",X"CC",X"88",X"FF",X"FF",X"00",X"77",X"77",X"00",X"11",X"33",X"77",X"77", + X"00",X"EE",X"FF",X"11",X"11",X"11",X"FF",X"EE",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33", + X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"EE",X"00",X"77",X"77",X"11",X"11",X"11",X"11",X"00", + X"08",X"08",X"00",X"00",X"80",X"40",X"31",X"33",X"55",X"AA",X"45",X"9A",X"0C",X"00",X"00",X"00", + X"00",X"FF",X"FF",X"11",X"11",X"99",X"FF",X"EE",X"00",X"77",X"77",X"11",X"33",X"77",X"66",X"44", + X"00",X"66",X"FF",X"99",X"99",X"BB",X"AA",X"00",X"00",X"22",X"66",X"44",X"44",X"44",X"77",X"33", + X"00",X"00",X"11",X"11",X"FF",X"FF",X"11",X"11",X"00",X"00",X"00",X"00",X"77",X"77",X"00",X"00", + X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33", + X"00",X"FF",X"FF",X"88",X"00",X"88",X"FF",X"FF",X"00",X"00",X"11",X"33",X"77",X"33",X"11",X"00", + X"00",X"FF",X"FF",X"88",X"CC",X"88",X"FF",X"FF",X"00",X"11",X"77",X"33",X"11",X"33",X"77",X"11", + X"00",X"33",X"77",X"EE",X"CC",X"EE",X"77",X"33",X"00",X"66",X"77",X"33",X"11",X"33",X"77",X"66", + X"00",X"00",X"33",X"FF",X"88",X"88",X"FF",X"33",X"00",X"00",X"00",X"00",X"77",X"77",X"00",X"00", + X"00",X"11",X"11",X"99",X"DD",X"FF",X"77",X"33",X"00",X"66",X"77",X"77",X"55",X"44",X"44",X"44", + X"00",X"00",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"00",X"00",X"00", + X"00",X"22",X"44",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"22",X"44",X"00", + X"00",X"00",X"00",X"22",X"22",X"EE",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"00",X"00", + X"00",X"00",X"03",X"0E",X"5D",X"AA",X"55",X"AA",X"CC",X"C8",X"20",X"10",X"01",X"01",X"03",X"02", + X"00",X"88",X"88",X"88",X"88",X"88",X"88",X"00",X"00",X"11",X"11",X"11",X"11",X"11",X"11",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"78", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"E1",X"C3",X"86",X"84",X"84",X"84",X"84", + X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"78",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0",X"84",X"84",X"84",X"84",X"86",X"C3",X"E1",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"E1",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08", + X"F0",X"78",X"3C",X"16",X"12",X"12",X"12",X"12",X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"84",X"84",X"84",X"84",X"84",X"84",X"84", + X"12",X"12",X"12",X"12",X"16",X"3C",X"78",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"84",X"84",X"84",X"84",X"84",X"84",X"84",X"0C", + X"E1",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0", + X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"84",X"84",X"84",X"84",X"84",X"84",X"84",X"84", + X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"12",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"12",X"12",X"12",X"12",X"16",X"3C",X"79",X"F3",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0",X"84",X"84",X"84",X"84",X"86",X"C3",X"E9",X"FC", + X"F3",X"79",X"3C",X"16",X"12",X"12",X"12",X"12",X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"E9",X"C3",X"86",X"84",X"84",X"84",X"84", + X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"F3",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"8F",X"FC", + X"F3",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"8F",X"00",X"00",X"00",X"00",X"00",X"00", + X"12",X"12",X"12",X"12",X"12",X"12",X"13",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"84",X"84",X"84",X"84",X"84",X"84",X"8C",X"CC", + X"33",X"13",X"12",X"12",X"12",X"12",X"12",X"12",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"8C",X"84",X"84",X"84",X"84",X"84",X"84", + X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC", + X"12",X"12",X"12",X"12",X"33",X"77",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0",X"84",X"84",X"84",X"84",X"CC",X"EE",X"FF",X"FF", + X"FF",X"EF",X"77",X"33",X"12",X"12",X"12",X"12",X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"7F",X"EE",X"CC",X"84",X"84",X"84",X"84", + X"00",X"00",X"00",X"00",X"33",X"77",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"F0",X"00",X"00",X"00",X"00",X"CC",X"EE",X"FF",X"FF", + X"FF",X"EF",X"77",X"33",X"00",X"00",X"00",X"00",X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"7F",X"EE",X"CC",X"00",X"00",X"00",X"00", + X"12",X"12",X"12",X"12",X"33",X"77",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"84",X"84",X"84",X"84",X"CC",X"EE",X"FF",X"FF", + X"FF",X"EF",X"77",X"33",X"12",X"12",X"12",X"12",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"7F",X"EE",X"CC",X"84",X"84",X"84",X"84", + X"FF",X"EF",X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"7F",X"EE",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"33",X"77",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"EE",X"FF",X"FF", + X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"11",X"11",X"33",X"33",X"3F",X"F3", + X"00",X"00",X"88",X"88",X"CC",X"CC",X"CF",X"FC",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"9F",X"EF",X"FF",X"33",X"12",X"12",X"12",X"12",X"F1",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"8F",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"3F",X"FF",X"CC",X"84",X"84",X"84",X"84", + X"9F",X"EF",X"FF",X"33",X"00",X"00",X"00",X"00",X"F1",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"8F",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"3F",X"FF",X"CC",X"00",X"00",X"00",X"00", + X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"11",X"11",X"33",X"33",X"33",X"73", + X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"9F",X"EF",X"FF",X"33",X"12",X"12",X"12",X"12",X"91",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"3F",X"FF",X"CC",X"84",X"84",X"84",X"84", + X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"3F",X"FF",X"CC",X"00",X"00",X"00",X"00", + X"9F",X"EF",X"FF",X"33",X"00",X"00",X"00",X"00",X"91",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"12",X"12",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"11",X"11",X"3F",X"F3", + X"00",X"00",X"00",X"00",X"88",X"88",X"CF",X"FC",X"84",X"84",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"9F",X"EF",X"FF",X"33",X"12",X"12",X"F3",X"3F",X"11",X"11",X"00",X"00",X"00",X"00", + X"FC",X"CF",X"88",X"88",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"3F",X"FF",X"CC",X"84",X"84", + X"00",X"00",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"11",X"11",X"3F",X"F3", + X"00",X"00",X"00",X"00",X"88",X"88",X"CF",X"FC",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"9F",X"EF",X"FF",X"33",X"00",X"00",X"F3",X"3F",X"11",X"11",X"00",X"00",X"00",X"00", + X"FC",X"CF",X"88",X"88",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"3F",X"FF",X"CC",X"00",X"00", + X"12",X"02",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"11",X"11",X"33",X"B3", + X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"84",X"84",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"9F",X"EF",X"FF",X"33",X"12",X"12",X"73",X"33",X"11",X"11",X"00",X"00",X"00",X"00", + X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"3F",X"FF",X"CC",X"04",X"84", + X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"3F",X"FF",X"CC",X"00",X"00", + X"00",X"00",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"11",X"11",X"33",X"B3", + X"FF",X"FF",X"9F",X"EF",X"FF",X"33",X"00",X"00",X"73",X"33",X"11",X"11",X"00",X"00",X"00",X"00", + X"12",X"12",X"12",X"12",X"33",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"8F",X"F8",X"84",X"84",X"84",X"84",X"CC",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"9F",X"EF",X"FF",X"33",X"F3",X"3F",X"33",X"33",X"11",X"11",X"00",X"00", + X"FC",X"CF",X"CC",X"CC",X"88",X"88",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"FF",X"CC", + X"00",X"00",X"00",X"00",X"33",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"F1", + X"00",X"00",X"00",X"00",X"00",X"00",X"8F",X"F8",X"00",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF", + X"12",X"12",X"12",X"12",X"33",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"91", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"84",X"84",X"84",X"80",X"CC",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"9F",X"EF",X"FF",X"33",X"73",X"33",X"33",X"33",X"11",X"11",X"00",X"00", + X"CC",X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"FF",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"33",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"91", + X"00",X"00",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"11",X"11",X"33",X"B3", + X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"9F",X"EF",X"FF",X"33",X"00",X"00",X"73",X"33",X"11",X"11",X"00",X"00",X"00",X"00", + X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"3F",X"FF",X"CC",X"00",X"00", + X"66",X"FF",X"FF",X"FE",X"FD",X"97",X"C2",X"1F",X"00",X"00",X"00",X"19",X"59",X"3C",X"1E",X"3C", + X"00",X"88",X"EE",X"EE",X"FF",X"FF",X"EE",X"EE",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"1F", + X"3C",X"0F",X"1F",X"FF",X"FF",X"FF",X"77",X"00",X"0F",X"07",X"0C",X"08",X"11",X"11",X"00",X"00", + X"FF",X"FF",X"FF",X"EE",X"CC",X"CC",X"00",X"00",X"1F",X"3F",X"9F",X"FF",X"FF",X"FF",X"77",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"FF", + X"77",X"77",X"77",X"77",X"77",X"77",X"66",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"EE",X"EE",X"CC",X"88",X"00",X"00",X"00", + X"00",X"07",X"1D",X"AA",X"55",X"AA",X"55",X"AA",X"CC",X"C8",X"21",X"03",X"13",X"06",X"15",X"26", + X"33",X"31",X"48",X"0C",X"04",X"8E",X"46",X"8A",X"00",X"0E",X"47",X"AA",X"55",X"AA",X"55",X"AA", + X"55",X"AA",X"55",X"AA",X"55",X"2E",X"07",X"00",X"15",X"26",X"17",X"02",X"03",X"21",X"C8",X"CC", + X"46",X"8A",X"06",X"8C",X"0C",X"48",X"31",X"33",X"55",X"AA",X"55",X"AA",X"55",X"8B",X"0E",X"00", + X"00",X"00",X"00",X"FF",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"11",X"11", + X"00",X"00",X"00",X"88",X"00",X"00",X"88",X"88",X"00",X"00",X"11",X"FF",X"00",X"FF",X"00",X"00", + X"FF",X"00",X"FF",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"FF",X"00",X"FF",X"00",X"00",X"FF",X"00",X"00", + X"33",X"FF",X"FF",X"8F",X"0F",X"0F",X"6F",X"6F",X"00",X"00",X"11",X"11",X"33",X"33",X"33",X"73", + X"00",X"00",X"88",X"88",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"FF",X"1F",X"0F",X"0F",X"6F",X"6F", + X"6F",X"FF",X"FF",X"33",X"00",X"00",X"00",X"00",X"91",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"6F",X"FF",X"FF",X"CC",X"00",X"00",X"00",X"00", + X"00",X"00",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"11",X"11",X"33",X"B3", + X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"33",X"00",X"00",X"73",X"33",X"11",X"11",X"00",X"00",X"00",X"00", + X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"CC",X"00",X"00", + X"00",X"00",X"00",X"00",X"33",X"FF",X"FF",X"8F",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"91", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"1F", + X"0F",X"0F",X"6F",X"6F",X"6F",X"FF",X"FF",X"33",X"73",X"33",X"33",X"33",X"11",X"11",X"00",X"00", + X"CC",X"CC",X"CC",X"CC",X"88",X"88",X"00",X"00",X"0F",X"0F",X"6F",X"6F",X"6F",X"FF",X"FF",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"43",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C", + X"43",X"21",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"0F",X"0F",X"0F",X"0F",X"10",X"08",X"0C",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"87",X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"F0",X"10", + X"0F",X"0F",X"0F",X"0F",X"87",X"61",X"10",X"00",X"87",X"43",X"21",X"21",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"0C",X"0C",X"0C",X"0C",X"00",X"0C",X"0E",X"0F",X"0F",X"0F",X"87",X"43", + X"08",X"0F",X"0F",X"87",X"43",X"21",X"21",X"21",X"21",X"21",X"21",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0E",X"87",X"00",X"00",X"0C",X"0F",X"0F",X"4B",X"38",X"08", + X"21",X"21",X"21",X"29",X"0F",X"0F",X"C3",X"30",X"00",X"86",X"87",X"87",X"43",X"21",X"10",X"00", + X"43",X"43",X"87",X"0E",X"0E",X"0C",X"08",X"00",X"08",X"08",X"08",X"18",X"69",X"0F",X"0F",X"0E", + X"00",X"0F",X"F0",X"F0",X"F0",X"80",X"12",X"34",X"06",X"69",X"78",X"78",X"70",X"30",X"00",X"00", + X"C0",X"E0",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"16",X"78",X"F0",X"F0",X"F0",X"78",X"F0",X"C0", + X"78",X"F0",X"E0",X"E1",X"F0",X"F0",X"F0",X"F0",X"00",X"01",X"16",X"78",X"78",X"78",X"70",X"30", + X"24",X"78",X"F0",X"E0",X"E0",X"C0",X"00",X"00",X"80",X"00",X"07",X"78",X"F0",X"F0",X"F0",X"C0", + X"3C",X"F0",X"F0",X"87",X"80",X"00",X"00",X"00",X"00",X"03",X"34",X"78",X"78",X"78",X"68",X"68", + X"00",X"00",X"00",X"80",X"C0",X"E0",X"E0",X"78",X"80",X"E0",X"F0",X"F0",X"3C",X"12",X"01",X"00", + X"00",X"00",X"80",X"C0",X"C0",X"80",X"00",X"00",X"68",X"78",X"34",X"34",X"12",X"01",X"00",X"00", + X"78",X"78",X"78",X"F0",X"E0",X"C0",X"08",X"00",X"00",X"00",X"00",X"07",X"78",X"78",X"07",X"00", + X"10",X"61",X"87",X"0F",X"0F",X"29",X"21",X"43",X"00",X"00",X"30",X"C3",X"87",X"87",X"86",X"00", + X"08",X"0C",X"0C",X"0E",X"86",X"87",X"43",X"43",X"C3",X"0F",X"0F",X"1C",X"0C",X"08",X"08",X"0C", + X"43",X"87",X"0F",X"0E",X"0E",X"0C",X"0C",X"08",X"00",X"00",X"10",X"21",X"43",X"43",X"43",X"43", + X"87",X"86",X"0E",X"0C",X"0C",X"08",X"00",X"00",X"04",X"06",X"16",X"87",X"43",X"43",X"21",X"00", + X"33",X"31",X"40",X"80",X"08",X"08",X"0C",X"8C",X"00",X"00",X"0C",X"8F",X"45",X"AA",X"55",X"AA", + X"55",X"AA",X"55",X"2A",X"1F",X"03",X"00",X"00",X"13",X"03",X"01",X"01",X"10",X"20",X"C8",X"CC", + X"04",X"0C",X"08",X"08",X"80",X"40",X"31",X"33",X"55",X"AA",X"55",X"AB",X"07",X"0C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33", + X"00",X"00",X"00",X"00",X"00",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"33", + X"00",X"00",X"00",X"00",X"CC",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"33", + X"00",X"00",X"00",X"CC",X"CC",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"33",X"33",X"33",X"33",X"33", + X"00",X"00",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"00",X"00",X"33",X"33",X"33",X"33",X"33",X"33", + X"00",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33", + X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"87",X"87",X"0F",X"0E",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"71",X"F1",X"E1",X"07",X"03",X"03",X"06",X"06", + X"88",X"66",X"00",X"08",X"0E",X"0F",X"87",X"87",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"61",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"03",X"03",X"07",X"E1",X"F1",X"71", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"01",X"00",X"00",X"30",X"30",X"10", + X"68",X"78",X"78",X"3C",X"06",X"02",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"00",X"00",X"01",X"0F",X"03", + X"02",X"02",X"02",X"06",X"3C",X"78",X"78",X"68",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"87",X"87",X"0F",X"0E",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"70",X"F0",X"E1",X"07",X"03",X"03",X"06",X"06", + X"88",X"66",X"00",X"08",X"0E",X"0F",X"87",X"87",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"87",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"03",X"03",X"07",X"E1",X"F0",X"70", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"01",X"00",X"00",X"30",X"30",X"10", + X"68",X"7A",X"7A",X"3C",X"06",X"02",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"00",X"00",X"01",X"0F",X"03", + X"02",X"02",X"02",X"06",X"3C",X"7A",X"7A",X"68",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00", + X"60",X"78",X"78",X"3F",X"3C",X"0F",X"0F",X"07",X"60",X"E1",X"E1",X"CF",X"C3",X"0F",X"0F",X"0E", + X"00",X"03",X"0F",X"0C",X"19",X"22",X"22",X"00",X"00",X"0C",X"0F",X"03",X"01",X"00",X"00",X"00", + X"02",X"02",X"03",X"07",X"0F",X"78",X"F0",X"E0",X"04",X"04",X"0C",X"0E",X"0F",X"E1",X"F0",X"70", + X"00",X"00",X"60",X"70",X"00",X"08",X"0F",X"00",X"00",X"00",X"60",X"E0",X"00",X"01",X"0F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"30",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00", + X"60",X"78",X"78",X"3C",X"3C",X"0F",X"0F",X"07",X"60",X"E1",X"E1",X"C3",X"C3",X"0F",X"0F",X"0E", + X"00",X"03",X"0F",X"0C",X"19",X"22",X"22",X"00",X"00",X"0C",X"0F",X"03",X"01",X"00",X"00",X"00", + X"02",X"02",X"03",X"07",X"0F",X"78",X"F6",X"E0",X"04",X"04",X"0C",X"0E",X"0F",X"E1",X"F6",X"70", + X"00",X"00",X"60",X"70",X"00",X"08",X"0F",X"00",X"00",X"00",X"60",X"E0",X"00",X"01",X"0F",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"08",X"0C",X"0E",X"06",X"02",X"03",X"03",X"C0",X"A4",X"00",X"01",X"03",X"06",X"86",X"86", + X"30",X"07",X"0F",X"08",X"00",X"88",X"44",X"00",X"E0",X"C3",X"0F",X"03",X"00",X"00",X"00",X"00", + X"12",X"12",X"06",X"06",X"0C",X"08",X"00",X"00",X"C2",X"C2",X"87",X"07",X"07",X"03",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"0F",X"03",X"30",X"30",X"E0",X"C0",X"00",X"03",X"0F",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"0E",X"0F",X"01",X"22",X"44",X"00",X"00", + X"30",X"12",X"00",X"08",X"0C",X"06",X"16",X"16",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0F",X"0C", + X"34",X"34",X"1E",X"0E",X"0E",X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"3C",X"0F",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"06",X"04",X"0C",X"0C", + X"C0",X"C0",X"70",X"30",X"00",X"0C",X"0F",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"84",X"84",X"06",X"06",X"03",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"F4", + X"00",X"00",X"02",X"02",X"03",X"03",X"07",X"87",X"00",X"00",X"00",X"00",X"00",X"38",X"78",X"0F", + X"E0",X"48",X"0C",X"04",X"00",X"80",X"80",X"80",X"F4",X"70",X"03",X"07",X"03",X"03",X"07",X"07", + X"87",X"0F",X"0F",X"0C",X"08",X"08",X"00",X"00",X"0F",X"09",X"00",X"00",X"00",X"10",X"10",X"00", + X"80",X"80",X"80",X"00",X"04",X"0C",X"48",X"E0",X"07",X"07",X"03",X"03",X"07",X"03",X"70",X"F4", + X"44",X"33",X"08",X"08",X"0C",X"0F",X"0F",X"87",X"00",X"10",X"10",X"00",X"00",X"00",X"09",X"0F", + X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"F4",X"70",X"00",X"00",X"00",X"00",X"00",X"00", + X"87",X"07",X"03",X"03",X"02",X"02",X"00",X"00",X"0F",X"78",X"38",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"C8",X"C8",X"C8",X"80",X"00",X"00",X"00",X"00",X"70",X"F0",X"F0",X"F0", + X"03",X"03",X"03",X"03",X"07",X"87",X"87",X"07",X"00",X"00",X"08",X"78",X"F8",X"3C",X"3C",X"1E", + X"08",X"0C",X"0C",X"04",X"00",X"C0",X"C0",X"40",X"00",X"01",X"03",X"01",X"01",X"03",X"03",X"03", + X"0F",X"0F",X"0F",X"0C",X"08",X"00",X"00",X"00",X"0F",X"09",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"C0",X"C0",X"00",X"04",X"0C",X"0C",X"08",X"03",X"03",X"03",X"01",X"01",X"03",X"01",X"00", + X"22",X"11",X"00",X"08",X"0C",X"0F",X"0F",X"0F",X"00",X"88",X"00",X"00",X"00",X"00",X"09",X"0F", + X"80",X"C8",X"C8",X"C8",X"80",X"00",X"00",X"00",X"70",X"F0",X"F0",X"70",X"00",X"00",X"00",X"00", + X"07",X"87",X"87",X"07",X"03",X"03",X"03",X"03",X"1E",X"3C",X"3C",X"F8",X"78",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"00",X"0C",X"0F",X"0F",X"03",X"00",X"00",X"00", + X"10",X"39",X"3C",X"3C",X"1E",X"0F",X"07",X"07",X"80",X"C8",X"C0",X"C0",X"80",X"0C",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"E0",X"00",X"00",X"00", + X"03",X"01",X"01",X"03",X"16",X"3C",X"10",X"00",X"0E",X"48",X"68",X"68",X"E0",X"E0",X"C0",X"00", + X"00",X"03",X"0F",X"0F",X"0C",X"11",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00", + X"10",X"31",X"30",X"30",X"10",X"03",X"0F",X"0F",X"80",X"C9",X"C3",X"C3",X"87",X"0F",X"0E",X"0E", + X"00",X"00",X"00",X"60",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"21",X"61",X"61",X"70",X"70",X"30",X"00",X"0C",X"08",X"08",X"0C",X"86",X"C3",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00",X"0E",X"0F",X"01",X"00",X"00",X"00", + X"00",X"00",X"04",X"0E",X"0F",X"0F",X"07",X"07",X"60",X"F0",X"F0",X"F0",X"60",X"0F",X"0F",X"0F", + X"0C",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"E0",X"00",X"00", + X"03",X"01",X"01",X"03",X"07",X"0E",X"00",X"00",X"0F",X"1E",X"78",X"F0",X"F7",X"70",X"00",X"00", + X"00",X"00",X"07",X"0F",X"08",X"00",X"11",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F", + X"60",X"F0",X"F0",X"F0",X"60",X"0F",X"0F",X"0F",X"00",X"00",X"02",X"07",X"0F",X"0F",X"0E",X"0E", + X"22",X"00",X"00",X"00",X"60",X"70",X"00",X"00",X"03",X"10",X"10",X"10",X"10",X"00",X"00",X"00", + X"0F",X"87",X"E1",X"F0",X"FE",X"E0",X"00",X"00",X"0C",X"08",X"08",X"0C",X"0E",X"07",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"EE", + X"00",X"88",X"88",X"CC",X"CC",X"EE",X"EE",X"EE",X"00",X"11",X"11",X"33",X"33",X"77",X"77",X"77", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"EE",X"EE",X"EE",X"CC",X"CC",X"88",X"88",X"00",X"77",X"77",X"77",X"33",X"33",X"11",X"10",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"CC",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33", + X"00",X"00",X"00",X"33",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"CC",X"FF",X"FF",X"FF",X"FF", + X"EE",X"EE",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"77",X"77",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"EE",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"77",X"77", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"11",X"00",X"00",X"00",X"00",X"00", + X"FF",X"7F",X"BF",X"CF",X"33",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"77",X"CC",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"88",X"EE",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"CC", + 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"EE",X"00", + X"FF",X"FF",X"FF",X"FF",X"EE",X"88",X"00",X"00",X"CC",X"CC",X"88",X"00",X"00",X"00",X"00",X"00", + X"00",X"77",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"33",X"00",X"00",X"11",X"77",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"33",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"77",X"11",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"88",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"CC",X"EE",X"FF",X"FF",X"FF",X"FF", + X"88",X"88",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"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"88",X"FF",X"FF",X"FF",X"FF",X"EE",X"CC",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11", + X"00",X"00",X"33",X"77",X"DF",X"BF",X"7F",X"7F",X"11",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"FF",X"FF",X"FF",X"77",X"33",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"11", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"04",X"0C",X"09",X"09", + X"00",X"00",X"00",X"10",X"16",X"0F",X"0F",X"0F",X"00",X"00",X"E0",X"F0",X"C3",X"C4",X"C4",X"E6", + X"0C",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"09",X"09",X"0C",X"04",X"00",X"00",X"00",X"00", + X"07",X"09",X"0F",X"16",X"10",X"00",X"00",X"00",X"E6",X"C4",X"C4",X"C3",X"F0",X"E0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10", + X"07",X"0C",X"00",X"03",X"06",X"0D",X"0D",X"87",X"0E",X"03",X"00",X"0C",X"0E",X"0F",X"0F",X"1E", + X"C0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"30",X"30",X"30",X"10",X"00",X"00",X"00",X"00", + X"F0",X"F7",X"19",X"08",X"0F",X"07",X"00",X"00",X"F0",X"FE",X"89",X"01",X"0F",X"0E",X"00",X"00", + X"00",X"00",X"00",X"80",X"0C",X"06",X"06",X"06",X"00",X"00",X"00",X"00",X"04",X"0C",X"08",X"08", + X"00",X"00",X"00",X"03",X"07",X"07",X"0F",X"0F",X"00",X"60",X"F0",X"F0",X"69",X"6A",X"6A",X"7B", + X"06",X"06",X"06",X"0C",X"80",X"00",X"00",X"00",X"08",X"08",X"0C",X"04",X"00",X"00",X"00",X"00", + X"0B",X"0C",X"07",X"07",X"03",X"00",X"00",X"00",X"7B",X"6A",X"6A",X"69",X"F0",X"F0",X"60",X"00", + X"00",X"00",X"00",X"80",X"0E",X"03",X"03",X"8B",X"02",X"02",X"00",X"06",X"0E",X"0C",X"0C",X"0C", + X"00",X"00",X"00",X"03",X"07",X"0F",X"0F",X"0F",X"00",X"60",X"F0",X"F0",X"78",X"3D",X"3D",X"3D", + X"8B",X"03",X"03",X"0E",X"80",X"00",X"00",X"00",X"0C",X"0C",X"0C",X"0E",X"06",X"00",X"02",X"02", + X"0D",X"0E",X"0F",X"07",X"03",X"00",X"00",X"00",X"3D",X"35",X"3D",X"78",X"F0",X"F0",X"60",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"07",X"0C",X"00",X"00",X"03",X"0E",X"0D",X"0D",X"0E",X"03",X"00",X"00",X"0C",X"0F",X"0F",X"0F", + X"C0",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"30",X"70",X"70",X"30",X"10",X"00",X"00",X"00", + X"0F",X"F0",X"F7",X"19",X"08",X"0F",X"07",X"00",X"0F",X"F0",X"FF",X"88",X"00",X"0F",X"0F",X"00", + X"00",X"08",X"0B",X"00",X"00",X"00",X"08",X"08",X"00",X"01",X"0D",X"00",X"00",X"00",X"01",X"01", + X"0F",X"0F",X"08",X"00",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"01",X"00",X"0E",X"0F",X"0F",X"0F", + X"C0",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"30",X"70",X"70",X"30",X"10",X"00",X"00",X"00", + X"0D",X"F7",X"F0",X"97",X"09",X"08",X"0F",X"07",X"0F",X"FE",X"F0",X"9E",X"09",X"01",X"0F",X"0E", + X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"48",X"00",X"01",X"03",X"06",X"04",X"01",X"01",X"01", + X"00",X"08",X"00",X"07",X"0F",X"07",X"0B",X"1E",X"00",X"00",X"00",X"0C",X"78",X"78",X"F0",X"F7", + X"0C",X"0C",X"08",X"08",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"3C",X"F1",X"F1",X"F1",X"E1",X"70",X"00",X"00",X"CC",X"CC",X"01",X"03",X"0F",X"0C",X"00",X"00", + X"00",X"08",X"0C",X"06",X"02",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"21", + X"00",X"00",X"00",X"03",X"E1",X"E1",X"F0",X"FE",X"00",X"01",X"00",X"0E",X"0D",X"0B",X"0F",X"87", + X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"01",X"01",X"00",X"00",X"00",X"00", + X"33",X"33",X"08",X"0C",X"0F",X"03",X"00",X"00",X"C3",X"F8",X"F8",X"F8",X"78",X"E0",X"00",X"00", + X"00",X"88",X"00",X"00",X"88",X"88",X"88",X"00",X"11",X"11",X"11",X"00",X"11",X"11",X"11",X"00", + X"00",X"FF",X"00",X"00",X"FF",X"88",X"FF",X"00",X"33",X"FF",X"00",X"00",X"FF",X"11",X"FF",X"00", + X"88",X"88",X"88",X"00",X"88",X"88",X"88",X"00",X"11",X"11",X"11",X"00",X"11",X"11",X"11",X"00", + X"FF",X"88",X"FF",X"00",X"FF",X"88",X"FF",X"00",X"FF",X"11",X"FF",X"00",X"FF",X"11",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"11",X"11",X"12",X"21",X"73",X"73",X"73",X"51",X"88",X"88",X"48",X"84",X"EC",X"EC",X"EC",X"A8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"11",X"11",X"12",X"21",X"73",X"73",X"00",X"00",X"88",X"88",X"48",X"84",X"EC",X"EC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"73",X"51",X"00",X"00",X"02",X"00",X"01",X"20",X"EC",X"A8",X"00",X"08",X"80",X"04",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"11",X"11",X"21",X"12",X"73",X"73",X"00",X"00",X"88",X"88",X"84",X"48",X"EC",X"EC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"73",X"51",X"00",X"02",X"10",X"00",X"20",X"01",X"EC",X"A8",X"00",X"00",X"40",X"08",X"00",X"40", + X"00",X"0C",X"0E",X"0F",X"0F",X"0F",X"4B",X"0F",X"03",X"07",X"1E",X"2D",X"4B",X"5A",X"34",X"34", + X"08",X"0C",X"86",X"0F",X"0F",X"4B",X"87",X"1E",X"03",X"07",X"0F",X"3C",X"4B",X"A5",X"C3",X"F0", + X"0E",X"86",X"0C",X"86",X"87",X"0F",X"0E",X"08",X"12",X"07",X"1E",X"2D",X"3C",X"16",X"12",X"01", + X"D2",X"B4",X"4B",X"E1",X"78",X"E1",X"0F",X"69",X"A5",X"0F",X"87",X"A5",X"D2",X"B4",X"87",X"0D", + X"E0",X"F2",X"F2",X"E0",X"44",X"0C",X"CE",X"0F",X"00",X"10",X"30",X"30",X"10",X"00",X"03",X"0F", + X"00",X"C4",X"E4",X"E0",X"C0",X"8B",X"1E",X"3C",X"00",X"10",X"10",X"00",X"00",X"0F",X"C7",X"C7", + X"0F",X"CE",X"0C",X"44",X"E0",X"F2",X"F2",X"E0",X"0F",X"03",X"00",X"10",X"30",X"30",X"10",X"00", + X"3C",X"1E",X"8B",X"C0",X"E0",X"E4",X"C4",X"00",X"C7",X"C7",X"0F",X"00",X"00",X"10",X"10",X"00", + X"E0",X"F8",X"F8",X"E0",X"44",X"0C",X"CE",X"0F",X"00",X"10",X"31",X"31",X"10",X"00",X"03",X"0F", + X"00",X"C0",X"E0",X"E0",X"C0",X"8B",X"1E",X"3C",X"00",X"10",X"10",X"00",X"00",X"0F",X"C7",X"C7", + X"0F",X"CE",X"0C",X"44",X"E0",X"F8",X"F8",X"E0",X"0F",X"03",X"00",X"10",X"31",X"31",X"10",X"00", + X"3C",X"1E",X"8B",X"C0",X"E0",X"E0",X"C0",X"00",X"C7",X"C7",X"0F",X"00",X"00",X"10",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"60",X"F2",X"F0",X"00",X"06",X"07",X"03",X"03",X"01",X"01",X"F1", + X"10",X"10",X"18",X"1F",X"0F",X"0F",X"3C",X"3C",X"C0",X"E4",X"F0",X"E0",X"40",X"08",X"0C",X"C2", + X"F8",X"2C",X"8C",X"4E",X"0E",X"0E",X"0C",X"00",X"F0",X"F0",X"74",X"20",X"00",X"00",X"00",X"00", + X"16",X"96",X"03",X"01",X"30",X"70",X"72",X"30",X"C7",X"CF",X"0F",X"0F",X"AF",X"97",X"C1",X"80", + X"00",X"00",X"C0",X"E0",X"E0",X"EC",X"C0",X"00",X"00",X"00",X"30",X"70",X"70",X"73",X"30",X"00", + X"01",X"01",X"03",X"83",X"C7",X"83",X"16",X"34",X"08",X"08",X"0C",X"1C",X"3E",X"1C",X"86",X"C2", + X"00",X"00",X"00",X"60",X"F0",X"F0",X"F6",X"60",X"00",X"00",X"00",X"60",X"F0",X"F0",X"F6",X"60", + X"34",X"37",X"07",X"07",X"27",X"AF",X"03",X"01",X"C2",X"CE",X"0E",X"0E",X"4E",X"5F",X"0C",X"08", + X"00",X"00",X"C0",X"EC",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"30",X"73",X"70",X"70",X"30",X"00", + X"01",X"01",X"03",X"83",X"C7",X"83",X"16",X"34",X"08",X"08",X"0C",X"1C",X"3E",X"1C",X"86",X"C2", + X"00",X"00",X"00",X"60",X"F6",X"F0",X"F0",X"60",X"00",X"00",X"00",X"60",X"F6",X"F0",X"F0",X"60", + X"34",X"37",X"07",X"07",X"27",X"AF",X"03",X"01",X"C2",X"CE",X"0E",X"0E",X"4E",X"5F",X"0C",X"08", + X"0C",X"0E",X"0F",X"0F",X"87",X"C2",X"0E",X"0C",X"00",X"06",X"07",X"07",X"1E",X"3C",X"1E",X"16", + X"03",X"07",X"0F",X"87",X"2D",X"5A",X"D2",X"3C",X"01",X"0B",X"0F",X"96",X"96",X"4B",X"E1",X"A5", + X"84",X"0E",X"0F",X"87",X"87",X"0F",X"0A",X"00",X"03",X"01",X"03",X"16",X"16",X"03",X"03",X"01", + X"B4",X"78",X"E1",X"2D",X"96",X"C3",X"83",X"08",X"5A",X"C3",X"A5",X"C3",X"5A",X"3C",X"07",X"03", + X"00",X"0C",X"0E",X"0F",X"0F",X"0E",X"0E",X"0C",X"00",X"03",X"03",X"16",X"25",X"3C",X"3C",X"1E", + X"0F",X"0F",X"69",X"87",X"0F",X"A5",X"2D",X"D2",X"00",X"0C",X"0F",X"0F",X"69",X"96",X"C3",X"B4", + X"0E",X"4A",X"87",X"C3",X"0F",X"0E",X"0C",X"00",X"5A",X"69",X"1E",X"2D",X"34",X"16",X"03",X"00", + X"3C",X"96",X"A5",X"D2",X"69",X"C3",X"0F",X"0C",X"87",X"0F",X"C3",X"96",X"78",X"2D",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"F0",X"EE",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"DE", + X"FF",X"EE",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"ED",X"12",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"90",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33", + X"00",X"00",X"00",X"00",X"00",X"30",X"B7",X"7B",X"00",X"00",X"00",X"00",X"00",X"C0",X"88",X"CD", + X"02",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"B7",X"7B",X"30",X"00",X"00",X"00",X"00",X"00",X"CC",X"88",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"84",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33", + X"00",X"00",X"00",X"00",X"00",X"30",X"7B",X"B7",X"00",X"00",X"00",X"00",X"00",X"C0",X"88",X"CC", + X"81",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7B",X"B7",X"30",X"00",X"00",X"00",X"00",X"00",X"CC",X"89",X"C0",X"00",X"00",X"00",X"00",X"00", + X"08",X"0C",X"0E",X"0E",X"0C",X"00",X"08",X"0C",X"06",X"07",X"07",X"00",X"00",X"01",X"01",X"01", + X"00",X"00",X"00",X"06",X"4B",X"BD",X"78",X"F0",X"00",X"01",X"05",X"1E",X"AD",X"C3",X"97",X"E3", + X"0C",X"08",X"08",X"00",X"86",X"4B",X"0F",X"06",X"02",X"03",X"01",X"00",X"04",X"07",X"03",X"03", + X"BC",X"7D",X"29",X"56",X"83",X"09",X"08",X"00",X"FB",X"E5",X"B4",X"0F",X"0E",X"08",X"00",X"00", + X"00",X"00",X"0C",X"0E",X"0E",X"0F",X"0F",X"06",X"03",X"07",X"07",X"07",X"03",X"01",X"00",X"00", + X"08",X"0C",X"0E",X"0E",X"0D",X"09",X"01",X"03",X"00",X"0C",X"0E",X"05",X"01",X"0B",X"0F",X"0F", + X"00",X"00",X"08",X"0C",X"0C",X"0C",X"08",X"00",X"00",X"06",X"0F",X"0F",X"0F",X"07",X"03",X"00", + X"07",X"07",X"0E",X"0C",X"08",X"08",X"00",X"00",X"0E",X"0F",X"07",X"07",X"0F",X"0F",X"07",X"03", + X"00",X"08",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"02",X"07",X"07",X"03",X"00",X"00",X"00", + X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"06",X"0E",X"0C",X"00",X"00",X"00",X"00",X"04",X"0C",X"0E",X"04",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"40",X"80",X"00",X"00",X"60",X"80",X"00",X"00",X"00",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"20",X"10",X"D0",X"70",X"B0",X"63",X"00",X"00",X"00",X"40",X"F0",X"E4",X"F8",X"6C", + X"00",X"40",X"00",X"80",X"80",X"40",X"00",X"00",X"20",X"10",X"00",X"00",X"10",X"20",X"00",X"00", + X"C3",X"73",X"E1",X"B2",X"20",X"10",X"00",X"00",X"B4",X"6C",X"F1",X"D0",X"A0",X"40",X"00",X"00", + X"00",X"00",X"40",X"80",X"80",X"00",X"80",X"C8",X"00",X"00",X"20",X"10",X"00",X"00",X"20",X"10", + X"00",X"00",X"20",X"90",X"F1",X"73",X"F4",X"ED",X"00",X"00",X"80",X"D8",X"FE",X"F4",X"7B",X"79", + X"C8",X"A0",X"00",X"80",X"80",X"40",X"00",X"00",X"10",X"00",X"10",X"00",X"10",X"20",X"00",X"00", + X"FE",X"F4",X"F3",X"F3",X"90",X"20",X"00",X"00",X"3C",X"7B",X"F5",X"FE",X"D8",X"80",X"40",X"00", + X"00",X"20",X"40",X"80",X"80",X"D8",X"EC",X"E8",X"00",X"40",X"20",X"10",X"11",X"B1",X"73",X"71", + X"90",X"71",X"77",X"FF",X"E3",X"C3",X"AD",X"1E",X"90",X"EC",X"E6",X"FE",X"7E",X"3F",X"97",X"C3", + X"E8",X"EC",X"D8",X"88",X"80",X"40",X"20",X"00",X"75",X"77",X"B1",X"10",X"10",X"20",X"40",X"00", + X"3C",X"9E",X"CF",X"E7",X"F7",X"76",X"71",X"90",X"87",X"5B",X"3C",X"7C",X"FF",X"EE",X"E8",X"90", + X"C0",X"16",X"40",X"1C",X"20",X"00",X"00",X"00",X"10",X"60",X"50",X"82",X"60",X"02",X"00",X"00", + X"40",X"0C",X"08",X"80",X"00",X"80",X"00",X"00",X"00",X"80",X"C1",X"00",X"02",X"00",X"20",X"00", + X"60",X"90",X"02",X"08",X"86",X"50",X"68",X"80",X"10",X"00",X"00",X"00",X"60",X"10",X"42",X"30", + X"00",X"00",X"04",X"1C",X"00",X"08",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"70",X"00",X"00",X"00",X"00",X"00",X"C0",X"E4",X"E4", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"E4",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"70",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"30",X"10",X"00",X"00",X"00",X"00",X"00",X"E4",X"E8",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"30",X"30",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"31",X"10",X"00",X"00",X"00",X"00",X"00",X"E0",X"EC",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"88",X"CC",X"CC",X"88",X"88",X"88",X"66",X"FF",X"FF",X"FF",X"FE",X"76",X"32",X"32", + X"11",X"BB",X"FF",X"F0",X"F0",X"F0",X"FE",X"FC",X"CC",X"FF",X"FF",X"F1",X"F0",X"F0",X"FE",X"F6", + X"CC",X"CC",X"AA",X"FF",X"FF",X"F7",X"E6",X"C4",X"76",X"77",X"33",X"11",X"00",X"11",X"11",X"33", + X"F1",X"F1",X"FF",X"FE",X"FC",X"F8",X"F9",X"FB",X"F0",X"F1",X"FF",X"F1",X"F0",X"F0",X"FC",X"FE", + X"80",X"E6",X"FF",X"FF",X"FF",X"FF",X"EE",X"CC",X"33",X"33",X"11",X"00",X"00",X"11",X"11",X"11", + X"FB",X"F9",X"FC",X"FE",X"FF",X"F8",X"F0",X"F0",X"FE",X"FC",X"F0",X"F1",X"FF",X"F1",X"F0",X"F8", + X"00",X"88",X"CC",X"CC",X"CC",X"88",X"00",X"00",X"33",X"33",X"77",X"77",X"76",X"32",X"31",X"11", + X"FF",X"FF",X"FF",X"F1",X"F0",X"F0",X"FF",X"DD",X"F9",X"F3",X"F1",X"F8",X"F1",X"F3",X"FF",X"CC"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..795f03b7 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"07",X"08",X"0F",X"00",X"07",X"08",X"04",X"00",X"07",X"08",X"01", + X"00",X"07",X"08",X"03",X"00",X"03",X"08",X"05",X"00",X"03",X"02",X"07",X"00",X"07",X"08",X"05", + X"00",X"07",X"0C",X"00",X"00",X"07",X"03",X"05",X"0D",X"00",X"00",X"07",X"0D",X"07",X"01",X"05", + X"0D",X"03",X"05",X"02",X"0D",X"08",X"09",X"06",X"0D",X"02",X"05",X"08",X"0D",X"01",X"04",X"03", + X"00",X"04",X"0A",X"05",X"00",X"01",X"03",X"00",X"00",X"05",X"08",X"00",X"00",X"03",X"02",X"00", + X"00",X"07",X"08",X"01",X"00",X"03",X"01",X"07",X"00",X"02",X"03",X"00",X"00",X"09",X"0E",X"02", + X"00",X"05",X"03",X"08",X"00",X"00",X"00",X"00",X"00",X"03",X"05",X"0F",X"00",X"03",X"0D",X"07", + X"00",X"01",X"0D",X"07",X"00",X"0F",X"0D",X"07",X"0D",X"01",X"03",X"0E",X"00",X"05",X"0D",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..28b22eff --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"C0",X"38",X"07",X"87",X"3F",X"F0",X"FF",X"27",X"14",X"1C",X"80",X"A4",X"01",X"AE",X"28"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..13f1535f --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"31",X"F0",X"4F",X"E7",X"C3",X"B4",X"01",X"FF",X"AF",X"77",X"23",X"10",X"FC",X"C9",X"FF",X"FF", + X"D5",X"07",X"5F",X"16",X"00",X"19",X"D1",X"C9",X"E1",X"18",X"33",X"FF",X"FF",X"FF",X"FF",X"FF", + X"AF",X"32",X"00",X"50",X"32",X"C0",X"50",X"C9",X"E7",X"3E",X"01",X"32",X"00",X"50",X"C9",X"FF", + X"18",X"1C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CD",X"AA",X"01",X"0F",X"0F",X"0F",X"E6",X"1E", + X"5F",X"16",X"00",X"21",X"CB",X"01",X"19",X"5E",X"23",X"56",X"EB",X"F1",X"F5",X"E9",X"CB",X"27", + X"5F",X"16",X"00",X"19",X"5E",X"23",X"56",X"EB",X"E9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"ED",X"73",X"1E",X"48",X"31",X"C0",X"4F",X"08",X"D9",X"E7", + X"DD",X"E5",X"FD",X"E5",X"CD",X"DD",X"01",X"FD",X"E1",X"DD",X"E1",X"0E",X"03",X"21",X"B0",X"4B", + X"06",X"08",X"11",X"06",X"00",X"7E",X"FE",X"01",X"23",X"20",X"1B",X"79",X"A6",X"23",X"28",X"03", + X"35",X"28",X"0C",X"19",X"10",X"EF",X"EF",X"D9",X"08",X"ED",X"7B",X"1E",X"48",X"ED",X"45",X"2B", + X"CB",X"FE",X"2B",X"36",X"03",X"23",X"23",X"18",X"EA",X"31",X"F0",X"4F",X"FB",X"0E",X"00",X"21", + X"B0",X"4B",X"06",X"08",X"11",X"08",X"00",X"7E",X"CB",X"7F",X"20",X"04",X"FE",X"02",X"30",X"06", + X"0C",X"19",X"10",X"F3",X"18",X"E7",X"F3",X"79",X"32",X"00",X"48",X"7E",X"36",X"02",X"23",X"CB", + X"BE",X"23",X"36",X"00",X"23",X"5E",X"23",X"56",X"23",X"4E",X"23",X"46",X"23",X"EB",X"FE",X"04", + X"20",X"04",X"50",X"59",X"FB",X"E9",X"F9",X"FE",X"02",X"28",X"04",X"1A",X"C1",X"18",X"01",X"F1", + X"C1",X"D1",X"E1",X"FD",X"E1",X"DD",X"E1",X"FB",X"C9",X"CD",X"9A",X"01",X"36",X"04",X"23",X"72", + X"23",X"72",X"23",X"71",X"23",X"70",X"18",X"E7",X"CD",X"9A",X"01",X"72",X"18",X"E1",X"CD",X"97", + X"01",X"7E",X"FE",X"02",X"C2",X"A9",X"00",X"23",X"7E",X"CB",X"7F",X"20",X"15",X"E6",X"40",X"4F", + X"F1",X"F5",X"E6",X"0F",X"B1",X"77",X"23",X"70",X"2B",X"2B",X"36",X"01",X"CD",X"89",X"01",X"C3", + X"A9",X"00",X"CB",X"BE",X"1E",X"06",X"19",X"7E",X"18",X"B2",X"CD",X"9A",X"01",X"CB",X"BE",X"7E", + X"B7",X"28",X"AC",X"FE",X"04",X"28",X"A8",X"1E",X"07",X"19",X"70",X"11",X"FA",X"FF",X"19",X"CB", + X"F6",X"CB",X"FE",X"FE",X"01",X"20",X"98",X"2B",X"36",X"03",X"18",X"93",X"CD",X"9A",X"01",X"7E", + X"B7",X"28",X"8C",X"CB",X"FE",X"18",X"88",X"CD",X"97",X"01",X"72",X"C3",X"A9",X"00",X"CD",X"9A", + X"01",X"1E",X"05",X"19",X"71",X"23",X"70",X"C3",X"EF",X"00",X"CD",X"97",X"01",X"23",X"CB",X"76", + X"CB",X"B6",X"1E",X"06",X"19",X"7E",X"C3",X"EC",X"00",X"01",X"03",X"00",X"09",X"EB",X"21",X"02", + X"00",X"39",X"EB",X"73",X"23",X"72",X"C9",X"3A",X"00",X"48",X"E6",X"0F",X"21",X"B0",X"4B",X"16", + X"00",X"5F",X"CB",X"23",X"CB",X"23",X"CB",X"23",X"19",X"C9",X"DD",X"E3",X"FD",X"E5",X"E5",X"D5", + X"C5",X"F5",X"DD",X"E9",X"21",X"00",X"48",X"01",X"00",X"18",X"36",X"00",X"23",X"0B",X"78",X"B1", + X"20",X"F8",X"3E",X"07",X"01",X"30",X"35",X"FF",X"C3",X"A9",X"00",X"F9",X"00",X"08",X"01",X"0E", + X"01",X"0E",X"01",X"3A",X"01",X"5C",X"01",X"67",X"01",X"6E",X"01",X"7A",X"01",X"3A",X"C0",X"50", + X"2F",X"32",X"20",X"48",X"21",X"80",X"50",X"36",X"01",X"36",X"00",X"21",X"03",X"48",X"3A",X"00", + X"50",X"2F",X"E6",X"A0",X"20",X"07",X"7E",X"B7",X"20",X"12",X"C3",X"80",X"02",X"36",X"06",X"FE", + X"80",X"CA",X"80",X"02",X"3E",X"01",X"32",X"07",X"50",X"C3",X"80",X"02",X"AF",X"32",X"07",X"50", + X"36",X"00",X"23",X"7E",X"3C",X"77",X"23",X"86",X"B7",X"28",X"36",X"CB",X"7F",X"20",X"32",X"47", + X"AF",X"32",X"04",X"48",X"23",X"7E",X"80",X"77",X"FE",X"64",X"30",X"1A",X"05",X"CB",X"20",X"48", + X"06",X"00",X"21",X"41",X"02",X"09",X"11",X"08",X"48",X"06",X"02",X"CD",X"54",X"3D",X"18",X"11", + X"00",X"01",X"00",X"02",X"00",X"03",X"3E",X"63",X"32",X"06",X"48",X"21",X"09",X"09",X"22",X"07", + X"48",X"21",X"02",X"48",X"CB",X"7E",X"20",X"1B",X"E5",X"21",X"49",X"42",X"DD",X"21",X"07",X"48", + X"1E",X"0B",X"06",X"02",X"0E",X"00",X"CD",X"8A",X"3D",X"3E",X"08",X"16",X"00",X"1E",X"00",X"CD", + X"20",X"2C",X"E1",X"2B",X"CB",X"7E",X"CB",X"FE",X"20",X"06",X"3E",X"07",X"01",X"35",X"35",X"FF", + X"21",X"88",X"4B",X"DD",X"21",X"F0",X"4F",X"FD",X"21",X"60",X"50",X"06",X"08",X"CB",X"7E",X"20", + X"4F",X"4E",X"0C",X"3A",X"21",X"48",X"57",X"CB",X"FE",X"23",X"7E",X"CB",X"42",X"28",X"09",X"EE", + X"C0",X"E6",X"C0",X"5F",X"3E",X"3F",X"A6",X"B3",X"07",X"07",X"DD",X"77",X"00",X"23",X"7E",X"CB", + X"42",X"28",X"04",X"ED",X"44",X"C6",X"10",X"D6",X"02",X"FD",X"77",X"00",X"23",X"7E",X"DD",X"77", + X"01",X"23",X"7E",X"CB",X"42",X"28",X"04",X"ED",X"44",X"C6",X"10",X"FD",X"77",X"01",X"23",X"DD", + X"23",X"DD",X"23",X"FD",X"23",X"FD",X"23",X"05",X"CA",X"5E",X"2D",X"0D",X"28",X"AF",X"18",X"B3", + X"11",X"05",X"00",X"19",X"DD",X"23",X"DD",X"23",X"FD",X"23",X"FD",X"23",X"10",X"9F",X"C3",X"5E", + X"2D",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E5",X"D1",X"06",X"D2",X"CF",X"21",X"4B",X"03",X"3A",X"02",X"48",X"CB",X"77",X"20",X"0C",X"CD", + X"4D",X"0E",X"D5",X"21",X"33",X"03",X"CD",X"E1",X"3D",X"EB",X"D1",X"4E",X"23",X"06",X"01",X"7E", + X"FE",X"FF",X"C8",X"FE",X"C0",X"38",X"05",X"E6",X"3F",X"47",X"23",X"7E",X"12",X"13",X"10",X"FC", + X"23",X"18",X"EA",X"C1",X"03",X"62",X"04",X"2E",X"05",X"00",X"06",X"CF",X"06",X"A1",X"07",X"71", + X"08",X"45",X"09",X"13",X"0A",X"E7",X"0A",X"B6",X"0B",X"88",X"0C",X"64",X"D0",X"00",X"11",X"25", + X"35",X"45",X"15",X"25",X"35",X"43",X"C3",X"00",X"10",X"C3",X"00",X"46",X"C6",X"00",X"16",X"C3", + X"00",X"21",X"C3",X"00",X"36",X"C6",X"00",X"26",X"C3",X"00",X"32",X"C3",X"00",X"26",X"C6",X"00", + X"36",X"C3",X"00",X"43",X"C3",X"00",X"16",X"C6",X"00",X"46",X"00",X"27",X"00",X"14",X"C3",X"00", + X"46",X"C6",X"00",X"16",X"C3",X"00",X"25",X"C3",X"00",X"36",X"C6",X"00",X"26",X"00",X"47",X"00", + X"36",X"C3",X"00",X"26",X"C6",X"00",X"36",X"C3",X"00",X"47",X"C3",X"00",X"16",X"C6",X"00",X"46", + X"C3",X"00",X"18",X"C3",X"00",X"46",X"C6",X"00",X"16",X"C3",X"00",X"29",X"C3",X"00",X"36",X"C6", + X"00",X"26",X"00",X"57",X"00",X"3A",X"C3",X"00",X"22",X"15",X"45",X"35",X"25",X"15",X"45",X"34", + X"FF",X"1E",X"C4",X"00",X"01",X"47",X"05",X"55",X"05",X"17",X"03",X"C8",X"00",X"06",X"02",X"07", + X"05",X"07",X"04",X"06",X"C8",X"00",X"3A",X"05",X"0B",X"05",X"0B",X"35",X"09",X"C8",X"00",X"06", + X"01",X"08",X"25",X"08",X"03",X"26",X"C4",X"00",X"01",X"07",X"25",X"05",X"0B",X"0B",X"07",X"05", + X"15",X"0B",X"0B",X"07",X"15",X"05",X"03",X"06",X"06",X"01",X"07",X"09",X"26",X"0A",X"07",X"03", + X"06",X"46",X"06",X"01",X"07",X"09",X"06",X"36",X"C6",X"06",X"26",X"0A",X"09",X"C3",X"06",X"46", + X"16",X"06",X"06",X"46",X"0A",X"09",X"C4",X"06",X"16",X"06",X"36",X"06",X"06",X"0A",X"08",X"04", + X"26",X"06",X"06",X"02",X"08",X"09",X"06",X"0A",X"08",X"24",X"06",X"06",X"42",X"05",X"15",X"08", + X"0B",X"3B",X"05",X"05",X"48",X"0B",X"0B",X"05",X"05",X"08",X"04",X"C4",X"00",X"06",X"02",X"07", + X"05",X"07",X"04",X"06",X"C8",X"00",X"1A",X"05",X"0B",X"15",X"0B",X"05",X"39",X"C8",X"00",X"06", + X"01",X"08",X"05",X"08",X"03",X"06",X"C8",X"00",X"02",X"08",X"05",X"55",X"05",X"48",X"04",X"C8", + X"00",X"FF",X"33",X"01",X"05",X"35",X"05",X"03",X"21",X"05",X"05",X"55",X"03",X"21",X"05",X"05", + X"35",X"43",X"0A",X"07",X"17",X"05",X"0B",X"08",X"47",X"15",X"07",X"08",X"08",X"05",X"07",X"07", + X"09",X"06",X"06",X"0A",X"07",X"09",X"01",X"0B",X"05",X"0B",X"33",X"70",X"01",X"09",X"46",X"06", + X"26",X"C4",X"06",X"46",X"02",X"05",X"04",X"1A",X"47",X"09",X"36",X"16",X"06",X"02",X"0B",X"0B", + X"18",X"09",X"06",X"01",X"35",X"03",X"06",X"0A",X"08",X"0B",X"0B",X"04",X"01",X"39",X"0A",X"25", + X"08",X"0B",X"0B",X"07",X"0B",X"0B",X"08",X"35",X"09",X"1A",X"03",X"06",X"06",X"0A",X"05",X"35", + X"09",X"06",X"06",X"46",X"2A",X"05",X"05",X"09",X"26",X"06",X"06",X"46",X"0A",X"05",X"05",X"09", + X"C3",X"06",X"0A",X"05",X"45",X"09",X"06",X"06",X"02",X"09",X"3A",X"25",X"07",X"0B",X"0B",X"08", + X"0B",X"0B",X"07",X"05",X"09",X"0A",X"04",X"01",X"1B",X"0B",X"07",X"09",X"16",X"22",X"05",X"04", + X"16",X"3A",X"07",X"0B",X"0B",X"13",X"C3",X"06",X"0A",X"08",X"39",X"01",X"05",X"13",X"C6",X"06", + X"56",X"06",X"0A",X"44",X"70",X"02",X"0B",X"05",X"0B",X"04",X"0A",X"08",X"39",X"36",X"26",X"0A", + X"08",X"08",X"05",X"07",X"07",X"08",X"45",X"28",X"57",X"0B",X"15",X"08",X"08",X"09",X"02",X"05", + X"05",X"15",X"04",X"02",X"15",X"05",X"05",X"04",X"02",X"05",X"25",X"05",X"04",X"FF",X"35",X"01", + X"05",X"15",X"27",X"05",X"05",X"07",X"05",X"57",X"05",X"45",X"07",X"B5",X"35",X"23",X"0A",X"07", + X"05",X"0B",X"05",X"45",X"0B",X"35",X"0B",X"25",X"05",X"0B",X"05",X"47",X"09",X"06",X"36",X"70", + X"1A",X"07",X"05",X"09",X"70",X"0A",X"05",X"37",X"09",X"70",X"06",X"06",X"0A",X"0B",X"07",X"0B", + X"0B",X"25",X"0B",X"05",X"0B",X"05",X"0B",X"0B",X"07",X"0B",X"09",X"56",X"06",X"36",X"06",X"06", + X"41",X"0B",X"15",X"0B",X"03",X"46",X"06",X"16",X"06",X"46",X"26",X"06",X"06",X"0A",X"04",X"36", + X"0A",X"05",X"09",X"06",X"02",X"09",X"C3",X"06",X"02",X"08",X"0B",X"08",X"25",X"0B",X"0B",X"05", + X"3B",X"0B",X"15",X"08",X"0B",X"08",X"24",X"01",X"07",X"4B",X"07",X"05",X"0B",X"0B",X"05",X"0B", + X"0B",X"45",X"07",X"0B",X"07",X"43",X"06",X"06",X"16",X"0A",X"03",X"06",X"3A",X"05",X"19",X"06", + X"01",X"09",X"36",X"06",X"06",X"16",X"36",X"C3",X"06",X"02",X"0B",X"05",X"0B",X"24",X"06",X"16", + X"06",X"06",X"06",X"2A",X"0B",X"08",X"0B",X"3B",X"45",X"0B",X"05",X"0B",X"05",X"0B",X"0B",X"28", + X"0B",X"09",X"06",X"46",X"70",X"0A",X"08",X"05",X"09",X"70",X"0A",X"15",X"38",X"09",X"70",X"06", + X"06",X"0A",X"08",X"05",X"0B",X"15",X"05",X"0B",X"35",X"0B",X"25",X"05",X"0B",X"45",X"08",X"29", + X"02",X"05",X"05",X"48",X"05",X"15",X"08",X"05",X"58",X"05",X"05",X"08",X"05",X"05",X"04",X"FF", + X"37",X"01",X"05",X"27",X"05",X"07",X"07",X"35",X"03",X"70",X"01",X"07",X"05",X"55",X"05",X"13", + X"0A",X"05",X"08",X"33",X"06",X"02",X"05",X"08",X"03",X"06",X"0A",X"27",X"05",X"33",X"06",X"0A", + X"45",X"03",X"0A",X"0B",X"45",X"17",X"35",X"08",X"04",X"46",X"0A",X"05",X"08",X"09",X"0A",X"05", + X"3B",X"04",X"0A",X"07",X"0B",X"07",X"35",X"05",X"09",X"0A",X"05",X"15",X"09",X"0A",X"05",X"0B", + X"05",X"09",X"16",X"36",X"16",X"01",X"05",X"0B",X"0B",X"25",X"03",X"06",X"1A",X"A5",X"08",X"25", + X"09",X"36",X"06",X"02",X"0B",X"45",X"09",X"06",X"70",X"0A",X"09",X"2A",X"05",X"05",X"07",X"08", + X"49",X"0A",X"05",X"0B",X"35",X"29",X"02",X"17",X"04",X"46",X"0A",X"05",X"45",X"09",X"70",X"0A", + X"08",X"47",X"0B",X"05",X"4B",X"05",X"0B",X"05",X"09",X"5A",X"07",X"13",X"0A",X"07",X"0B",X"03", + X"06",X"02",X"05",X"0B",X"07",X"0B",X"35",X"04",X"C3",X"06",X"16",X"06",X"36",X"26",X"0A",X"05", + X"15",X"09",X"36",X"36",X"01",X"03",X"4A",X"C6",X"0B",X"08",X"57",X"07",X"09",X"06",X"16",X"06", + X"06",X"06",X"12",X"0B",X"09",X"06",X"16",X"06",X"70",X"06",X"36",X"0A",X"08",X"0B",X"0B",X"19", + X"0A",X"05",X"04",X"26",X"46",X"02",X"0B",X"05",X"09",X"06",X"0A",X"25",X"0B",X"04",X"06",X"02", + X"05",X"05",X"08",X"08",X"05",X"38",X"B5",X"48",X"08",X"18",X"05",X"38",X"05",X"04",X"FF",X"3C", + X"01",X"05",X"07",X"17",X"05",X"05",X"37",X"07",X"05",X"15",X"07",X"07",X"35",X"95",X"13",X"0A", + X"05",X"3B",X"0B",X"05",X"45",X"09",X"06",X"01",X"25",X"09",X"36",X"01",X"27",X"09",X"0A",X"05", + X"09",X"2A",X"07",X"05",X"2B",X"08",X"5B",X"07",X"0B",X"08",X"2B",X"0B",X"09",X"0A",X"05",X"14", + X"06",X"0A",X"07",X"0B",X"03",X"06",X"16",X"06",X"70",X"06",X"16",X"36",X"0A",X"05",X"27",X"08", + X"34",X"06",X"36",X"0A",X"4B",X"04",X"0A",X"07",X"0B",X"08",X"09",X"0A",X"05",X"08",X"03",X"41", + X"08",X"09",X"06",X"02",X"25",X"09",X"06",X"02",X"35",X"09",X"1A",X"05",X"55",X"0B",X"0B",X"05", + X"0B",X"08",X"17",X"05",X"4B",X"08",X"05",X"07",X"19",X"0A",X"25",X"05",X"04",X"0A",X"35",X"09", + X"70",X"0A",X"05",X"3B",X"05",X"47",X"09",X"06",X"0A",X"15",X"07",X"45",X"0B",X"25",X"08",X"07", + X"2B",X"07",X"0B",X"05",X"09",X"06",X"06",X"0A",X"05",X"0B",X"35",X"0B",X"B5",X"33",X"06",X"16", + X"06",X"06",X"01",X"08",X"0B",X"09",X"2A",X"05",X"29",X"70",X"0A",X"05",X"C4",X"0B",X"4B",X"0B", + X"03",X"36",X"06",X"06",X"41",X"0B",X"05",X"0B",X"07",X"39",X"26",X"06",X"26",X"56",X"1A",X"08", + X"08",X"19",X"06",X"06",X"0A",X"05",X"39",X"06",X"0A",X"0B",X"18",X"08",X"09",X"02",X"25",X"03", + X"06",X"02",X"08",X"08",X"15",X"08",X"08",X"28",X"08",X"25",X"05",X"48",X"05",X"A5",X"18",X"04", + X"FF",X"3F",X"01",X"17",X"05",X"27",X"05",X"35",X"07",X"07",X"57",X"05",X"15",X"07",X"05",X"37", + X"13",X"06",X"06",X"01",X"1B",X"35",X"45",X"09",X"26",X"0A",X"05",X"45",X"0B",X"03",X"06",X"06", + X"0A",X"08",X"0B",X"0B",X"05",X"07",X"08",X"0B",X"38",X"07",X"B5",X"0B",X"0B",X"48",X"09",X"0A", + X"07",X"0B",X"3B",X"15",X"09",X"70",X"06",X"70",X"0A",X"35",X"4B",X"0B",X"37",X"09",X"0A",X"39", + X"02",X"2B",X"07",X"08",X"27",X"08",X"07",X"08",X"07",X"0B",X"04",X"0A",X"09",X"0A",X"0B",X"07", + X"09",X"3A",X"07",X"0B",X"07",X"0B",X"23",X"06",X"4A",X"07",X"3B",X"49",X"96",X"56",X"36",X"C4", + X"06",X"16",X"06",X"06",X"4A",X"19",X"26",X"06",X"06",X"36",X"06",X"06",X"2A",X"19",X"C3",X"06", + X"26",X"16",X"C3",X"06",X"16",X"06",X"0A",X"2B",X"08",X"19",X"06",X"42",X"0B",X"28",X"0B",X"48", + X"09",X"1A",X"08",X"0B",X"09",X"0A",X"09",X"01",X"0B",X"28",X"07",X"08",X"07",X"08",X"27",X"08", + X"1B",X"03",X"2A",X"09",X"0A",X"38",X"0B",X"4B",X"05",X"09",X"70",X"06",X"70",X"0A",X"05",X"0B", + X"0B",X"08",X"09",X"0A",X"07",X"0B",X"0B",X"05",X"08",X"17",X"0B",X"07",X"08",X"05",X"2B",X"0B", + X"07",X"49",X"16",X"06",X"02",X"2B",X"35",X"05",X"09",X"06",X"0A",X"A5",X"15",X"0B",X"04",X"06", + X"06",X"02",X"08",X"05",X"28",X"05",X"05",X"58",X"08",X"18",X"05",X"45",X"08",X"05",X"18",X"04", + X"FF",X"47",X"01",X"07",X"07",X"07",X"37",X"05",X"07",X"15",X"07",X"47",X"A5",X"27",X"05",X"07", + X"43",X"06",X"26",X"06",X"46",X"0A",X"05",X"4B",X"05",X"3B",X"0B",X"07",X"0B",X"05",X"39",X"06", + X"3A",X"18",X"0B",X"08",X"0B",X"35",X"0B",X"05",X"09",X"56",X"06",X"16",X"21",X"08",X"09",X"0A", + X"25",X"09",X"70",X"0A",X"05",X"0B",X"15",X"0B",X"48",X"0B",X"0B",X"0B",X"05",X"19",X"4A",X"05", + X"08",X"07",X"18",X"07",X"2B",X"05",X"0B",X"05",X"0B",X"48",X"0B",X"05",X"39",X"0A",X"47",X"15", + X"0B",X"05",X"4B",X"0B",X"45",X"09",X"70",X"0A",X"07",X"48",X"07",X"09",X"0A",X"0B",X"05",X"0B", + X"13",X"06",X"0A",X"07",X"08",X"27",X"08",X"1B",X"05",X"3B",X"09",X"1A",X"08",X"55",X"0B",X"0B", + X"38",X"09",X"1A",X"05",X"4B",X"35",X"0B",X"33",X"06",X"06",X"0A",X"27",X"05",X"4B",X"09",X"70", + X"0A",X"2B",X"05",X"3B",X"B5",X"2B",X"0B",X"0B",X"09",X"96",X"3A",X"05",X"0B",X"0B",X"07",X"04", + X"0A",X"05",X"0B",X"07",X"08",X"0B",X"44",X"06",X"3A",X"0B",X"03",X"26",X"46",X"0A",X"05",X"0B", + X"15",X"0B",X"49",X"70",X"0A",X"35",X"09",X"06",X"22",X"0B",X"0B",X"08",X"0B",X"07",X"4B",X"07", + X"09",X"0A",X"37",X"0B",X"07",X"49",X"2A",X"05",X"09",X"1A",X"35",X"09",X"36",X"06",X"06",X"3A", + X"09",X"56",X"16",X"06",X"06",X"02",X"05",X"08",X"38",X"05",X"18",X"08",X"28",X"18",X"08",X"28", + X"08",X"08",X"38",X"04",X"FF",X"3F",X"01",X"15",X"05",X"07",X"55",X"47",X"07",X"07",X"A5",X"07", + X"47",X"35",X"07",X"45",X"13",X"06",X"01",X"05",X"0B",X"05",X"09",X"06",X"16",X"01",X"08",X"0B", + X"07",X"09",X"21",X"09",X"0A",X"0B",X"35",X"0B",X"05",X"0B",X"18",X"28",X"0B",X"33",X"16",X"26", + X"0A",X"09",X"06",X"16",X"0A",X"05",X"09",X"70",X"0A",X"05",X"05",X"09",X"06",X"46",X"16",X"36", + X"06",X"56",X"2A",X"3B",X"17",X"0B",X"37",X"08",X"37",X"17",X"C4",X"0B",X"08",X"08",X"09",X"C3", + X"06",X"0A",X"0B",X"25",X"0B",X"0B",X"09",X"06",X"36",X"0A",X"05",X"07",X"09",X"02",X"C3",X"0B", + X"08",X"07",X"09",X"06",X"1A",X"49",X"16",X"0A",X"45",X"0B",X"14",X"70",X"36",X"26",X"06",X"01", + X"29",X"0A",X"09",X"36",X"0A",X"08",X"09",X"70",X"0A",X"43",X"01",X"1B",X"C4",X"0B",X"18",X"08", + X"0B",X"0B",X"25",X"0B",X"07",X"08",X"09",X"96",X"36",X"06",X"36",X"42",X"0B",X"15",X"45",X"2B", + X"08",X"B5",X"09",X"4A",X"05",X"09",X"0A",X"08",X"0B",X"0B",X"07",X"38",X"07",X"07",X"0B",X"07", + X"47",X"0B",X"0B",X"07",X"09",X"2A",X"05",X"09",X"06",X"06",X"70",X"06",X"06",X"16",X"06",X"16", + X"26",X"06",X"06",X"16",X"0A",X"05",X"0B",X"29",X"0A",X"37",X"08",X"0B",X"4B",X"0B",X"0B",X"3B", + X"18",X"09",X"06",X"02",X"05",X"08",X"58",X"08",X"08",X"05",X"08",X"38",X"34",X"02",X"08",X"05", + X"08",X"04",X"FF",X"4A",X"01",X"07",X"07",X"07",X"B5",X"45",X"37",X"05",X"07",X"45",X"07",X"15", + X"07",X"05",X"13",X"0A",X"0B",X"19",X"0A",X"05",X"07",X"2B",X"07",X"18",X"07",X"08",X"07",X"5B", + X"23",X"06",X"36",X"22",X"3B",X"08",X"27",X"0B",X"0B",X"29",X"70",X"0A",X"47",X"0B",X"0B",X"1B", + X"29",X"0A",X"05",X"4B",X"03",X"56",X"06",X"16",X"0A",X"07",X"09",X"0A",X"09",X"36",X"06",X"06", + X"0A",X"03",X"06",X"0A",X"0B",X"09",X"36",X"2A",X"0B",X"49",X"06",X"3A",X"1B",X"09",X"06",X"1A", + X"0B",X"49",X"36",X"06",X"0A",X"0B",X"04",X"0A",X"28",X"1B",X"09",X"06",X"3A",X"49",X"06",X"0A", + X"08",X"0B",X"4B",X"08",X"0B",X"05",X"0B",X"35",X"09",X"0A",X"08",X"09",X"06",X"0A",X"09",X"70", + X"2A",X"1B",X"37",X"0B",X"47",X"0B",X"25",X"0B",X"09",X"70",X"0A",X"39",X"36",X"0A",X"07",X"09", + X"A6",X"0A",X"0B",X"3B",X"09",X"01",X"09",X"0A",X"27",X"09",X"06",X"16",X"46",X"36",X"0A",X"08", + X"09",X"46",X"06",X"3A",X"29",X"0A",X"08",X"09",X"4A",X"09",X"02",X"0B",X"0B",X"0B",X"25",X"0B", + X"0B",X"0B",X"08",X"0B",X"0B",X"25",X"0B",X"08",X"09",X"01",X"09",X"32",X"0B",X"07",X"5B",X"0B", + X"19",X"70",X"0A",X"0B",X"35",X"0B",X"03",X"36",X"0A",X"28",X"07",X"04",X"2A",X"04",X"36",X"22", + X"07",X"44",X"3A",X"07",X"08",X"1B",X"49",X"02",X"05",X"48",X"05",X"28",X"45",X"08",X"95",X"18", + X"05",X"28",X"48",X"35",X"08",X"04",X"FF",X"4E",X"01",X"05",X"27",X"95",X"17",X"07",X"35",X"07", + X"27",X"05",X"17",X"05",X"07",X"35",X"43",X"06",X"70",X"0A",X"35",X"2B",X"4B",X"23",X"1A",X"0B", + X"35",X"0B",X"55",X"09",X"70",X"06",X"0A",X"07",X"08",X"07",X"09",X"0A",X"0B",X"09",X"0A",X"23", + X"06",X"01",X"08",X"17",X"29",X"3A",X"5B",X"03",X"06",X"06",X"16",X"06",X"46",X"16",X"0A",X"4B", + X"09",X"31",X"0B",X"19",X"06",X"02",X"1B",X"3B",X"0B",X"0B",X"3B",X"0B",X"3B",X"2B",X"C3",X"0B", + X"04",X"06",X"1A",X"07",X"0B",X"09",X"42",X"0B",X"0B",X"08",X"0B",X"0B",X"04",X"2A",X"0B",X"37", + X"09",X"96",X"36",X"26",X"3A",X"05",X"2B",X"09",X"70",X"0A",X"1B",X"05",X"09",X"16",X"06",X"26", + X"06",X"0A",X"0B",X"0B",X"07",X"0B",X"0B",X"17",X"0B",X"0B",X"43",X"1A",X"0B",X"39",X"06",X"4A", + X"08",X"29",X"06",X"36",X"06",X"46",X"A6",X"06",X"26",X"0A",X"09",X"4A",X"28",X"09",X"36",X"01", + X"4B",X"0B",X"2B",X"C4",X"0B",X"4B",X"C3",X"0B",X"03",X"06",X"1A",X"3B",X"04",X"C3",X"06",X"0A", + X"39",X"0A",X"0B",X"09",X"B6",X"42",X"0B",X"09",X"0A",X"08",X"07",X"08",X"29",X"0A",X"4B",X"08", + X"0B",X"14",X"3A",X"28",X"07",X"38",X"19",X"06",X"70",X"2A",X"35",X"0B",X"58",X"09",X"01",X"2B", + X"05",X"1B",X"05",X"09",X"70",X"06",X"02",X"05",X"18",X"05",X"28",X"05",X"18",X"04",X"42",X"05", + X"08",X"25",X"08",X"05",X"24",X"FF",X"49",X"01",X"05",X"07",X"27",X"37",X"95",X"07",X"05",X"37", + X"05",X"07",X"45",X"07",X"35",X"03",X"0A",X"17",X"0B",X"4B",X"08",X"07",X"29",X"70",X"0A",X"47", + X"08",X"37",X"09",X"11",X"29",X"0A",X"4B",X"09",X"36",X"11",X"38",X"0B",X"07",X"0B",X"08",X"07", + X"09",X"2A",X"0B",X"09",X"36",X"0A",X"08",X"0B",X"09",X"01",X"0B",X"14",X"5A",X"07",X"19",X"0A", + X"08",X"09",X"46",X"0A",X"09",X"70",X"2A",X"0B",X"0B",X"3B",X"07",X"0B",X"2B",X"0B",X"09",X"70", + X"0A",X"09",X"1A",X"08",X"07",X"09",X"06",X"26",X"06",X"46",X"36",X"06",X"36",X"0A",X"17",X"38", + X"09",X"26",X"70",X"4A",X"0B",X"1B",X"C3",X"0B",X"2B",X"C3",X"0B",X"09",X"70",X"06",X"3A",X"07", + X"08",X"09",X"26",X"46",X"06",X"16",X"06",X"A6",X"46",X"0A",X"28",X"17",X"09",X"0A",X"09",X"70", + X"0A",X"0B",X"0B",X"0B",X"38",X"1B",X"4B",X"0B",X"09",X"70",X"0A",X"09",X"B6",X"3A",X"07",X"0B", + X"59",X"12",X"0B",X"03",X"3A",X"08",X"09",X"0A",X"17",X"09",X"06",X"4A",X"0B",X"19",X"06",X"0A", + X"25",X"39",X"0A",X"29",X"01",X"2B",X"09",X"36",X"4A",X"09",X"06",X"16",X"4A",X"0B",X"3B",X"B5", + X"4B",X"08",X"0B",X"1B",X"04",X"0A",X"0B",X"0B",X"09",X"0A",X"08",X"0B",X"08",X"2B",X"15",X"09", + X"70",X"0A",X"08",X"07",X"58",X"09",X"02",X"19",X"02",X"05",X"28",X"05",X"18",X"05",X"08",X"25", + X"08",X"35",X"08",X"05",X"08",X"25",X"04",X"FF",X"43",X"01",X"05",X"07",X"05",X"47",X"07",X"15", + X"07",X"35",X"03",X"01",X"35",X"07",X"45",X"03",X"4A",X"B5",X"0B",X"33",X"0A",X"09",X"01",X"5B", + X"03",X"4A",X"09",X"01",X"0B",X"05",X"19",X"36",X"01",X"08",X"0B",X"24",X"4A",X"39",X"06",X"1A", + X"29",X"02",X"1B",X"08",X"33",X"96",X"0A",X"19",X"01",X"08",X"07",X"08",X"09",X"46",X"0A",X"08", + X"47",X"08",X"03",X"0A",X"09",X"0A",X"08",X"0B",X"17",X"09",X"70",X"4A",X"2B",X"09",X"70",X"0A", + X"27",X"0B",X"58",X"09",X"0A",X"03",X"26",X"0A",X"08",X"07",X"0B",X"08",X"0B",X"07",X"04",X"46", + X"36",X"01",X"09",X"0A",X"3B",X"0B",X"4B",X"05",X"3B",X"09",X"70",X"0A",X"2B",X"35",X"0B",X"0B", + X"0B",X"19",X"4A",X"04",X"06",X"0A",X"07",X"08",X"3B",X"07",X"0B",X"08",X"03",X"26",X"06",X"22", + X"09",X"0A",X"05",X"1B",X"38",X"09",X"70",X"0A",X"1B",X"09",X"70",X"0A",X"08",X"0B",X"15",X"09", + X"16",X"01",X"08",X"07",X"08",X"07",X"39",X"96",X"2A",X"07",X"0B",X"07",X"38",X"03",X"06",X"0A", + X"09",X"31",X"0B",X"57",X"09",X"46",X"36",X"06",X"06",X"0A",X"0B",X"23",X"4A",X"09",X"3A",X"0B", + X"0B",X"04",X"16",X"06",X"0A",X"0B",X"38",X"0B",X"39",X"02",X"0B",X"0B",X"09",X"06",X"06",X"42", + X"07",X"08",X"0B",X"09",X"0A",X"05",X"09",X"22",X"07",X"04",X"36",X"06",X"02",X"08",X"05",X"28", + X"05",X"38",X"08",X"48",X"05",X"28",X"05",X"18",X"A5",X"18",X"24",X"FF",X"DD",X"21",X"41",X"40", + X"FD",X"21",X"30",X"48",X"01",X"0E",X"0F",X"C5",X"DD",X"E5",X"C5",X"FD",X"7E",X"00",X"B7",X"28", + X"3B",X"47",X"E6",X"F0",X"FE",X"70",X"28",X"1D",X"FE",X"90",X"38",X"28",X"CD",X"4B",X"0F",X"78", + X"E6",X"0F",X"FE",X"06",X"3E",X"1C",X"28",X"02",X"3E",X"18",X"DD",X"E5",X"E1",X"01",X"02",X"02", + X"CD",X"1E",X"3D",X"18",X"17",X"DD",X"E5",X"E1",X"3E",X"C0",X"1E",X"17",X"01",X"02",X"02",X"CD", + X"1E",X"3D",X"18",X"08",X"78",X"DD",X"E5",X"CD",X"41",X"0E",X"DD",X"E1",X"C1",X"DD",X"23",X"DD", + X"23",X"FD",X"23",X"10",X"B5",X"3E",X"23",X"06",X"02",X"FF",X"DD",X"E1",X"01",X"40",X"00",X"DD", + X"09",X"C1",X"0D",X"20",X"A2",X"CD",X"4D",X"0E",X"FE",X"00",X"C0",X"DD",X"21",X"FB",X"0F",X"21", + X"62",X"40",X"CD",X"1D",X"0E",X"DD",X"21",X"FB",X"0F",X"21",X"78",X"40",X"CD",X"1D",X"0E",X"DD", + X"21",X"04",X"10",X"21",X"E2",X"42",X"CD",X"1D",X"0E",X"DD",X"21",X"04",X"10",X"21",X"F8",X"42", + X"CD",X"1D",X"0E",X"21",X"A4",X"40",X"1E",X"02",X"CD",X"14",X"0E",X"21",X"BA",X"40",X"1E",X"01", + X"CD",X"14",X"0E",X"21",X"24",X"43",X"1E",X"03",X"CD",X"14",X"0E",X"21",X"3A",X"43",X"1E",X"04", + X"CD",X"14",X"0E",X"C9",X"3E",X"C4",X"01",X"02",X"02",X"CD",X"1E",X"3D",X"C9",X"01",X"03",X"03", + X"1E",X"17",X"C5",X"E5",X"C5",X"E5",X"DD",X"7E",X"00",X"01",X"02",X"02",X"CD",X"1E",X"3D",X"DD", + X"23",X"E1",X"23",X"23",X"C1",X"10",X"ED",X"E1",X"01",X"40",X"00",X"09",X"C1",X"0D",X"20",X"E2", + X"C9",X"DD",X"E5",X"E1",X"1E",X"03",X"DD",X"21",X"77",X"89",X"C3",X"39",X"0F",X"3A",X"E7",X"49", + X"FE",X"0C",X"D8",X"D6",X"0C",X"18",X"F9",X"21",X"D4",X"0E",X"22",X"14",X"4A",X"21",X"41",X"40", + X"FD",X"21",X"30",X"48",X"01",X"0E",X"0F",X"C5",X"E5",X"C5",X"E5",X"FD",X"7E",X"00",X"47",X"E6", + X"F0",X"28",X"1D",X"FE",X"70",X"30",X"19",X"E5",X"2A",X"14",X"4A",X"7E",X"21",X"CC",X"0E",X"CD", + X"E1",X"3D",X"D5",X"DD",X"E1",X"78",X"E6",X"F0",X"CD",X"4B",X"0F",X"E1",X"78",X"CD",X"50",X"89", + X"E1",X"23",X"23",X"FD",X"23",X"C1",X"10",X"D1",X"E1",X"01",X"40",X"00",X"09",X"C1",X"0D",X"20", + X"C6",X"2A",X"14",X"4A",X"5E",X"21",X"E5",X"0E",X"16",X"00",X"19",X"7E",X"16",X"00",X"1E",X"00", + X"CD",X"20",X"2C",X"3E",X"23",X"06",X"08",X"FF",X"2A",X"14",X"4A",X"23",X"22",X"14",X"4A",X"7E", + X"FE",X"FF",X"20",X"99",X"3E",X"01",X"CD",X"8E",X"2C",X"C3",X"E9",X"0E",X"77",X"89",X"A3",X"89", + X"CF",X"89",X"27",X"8A",X"00",X"01",X"02",X"01",X"00",X"01",X"02",X"01",X"00",X"01",X"02",X"02", + X"01",X"02",X"01",X"02",X"FF",X"01",X"02",X"03",X"02",X"DD",X"21",X"41",X"40",X"FD",X"21",X"30", + X"48",X"01",X"0E",X"0F",X"C5",X"DD",X"E5",X"C5",X"FD",X"7E",X"00",X"B7",X"DD",X"E5",X"C4",X"18", + X"0F",X"DD",X"E1",X"C1",X"DD",X"23",X"DD",X"23",X"FD",X"23",X"10",X"EB",X"DD",X"E1",X"01",X"40", + X"00",X"DD",X"09",X"C1",X"0D",X"20",X"DD",X"C9",X"47",X"E6",X"F0",X"C8",X"FE",X"80",X"20",X"07", + X"78",X"E6",X"0F",X"FD",X"77",X"00",X"C9",X"FE",X"50",X"28",X"12",X"FE",X"50",X"D0",X"CD",X"4B", + X"0F",X"78",X"DD",X"E5",X"E1",X"DD",X"21",X"27",X"8A",X"CD",X"50",X"89",X"C9",X"DD",X"E5",X"E1", + X"3E",X"D0",X"1E",X"05",X"01",X"02",X"02",X"CD",X"1E",X"3D",X"C9",X"CB",X"3F",X"CB",X"3F",X"CB", + X"3F",X"CB",X"3F",X"3D",X"21",X"5D",X"0F",X"16",X"00",X"5F",X"19",X"5E",X"C9",X"01",X"02",X"03", + X"04",X"07",X"06",X"17",X"00",X"5B",X"5C",X"5D",X"7D",X"4D",X"E6",X"C0",X"6F",X"B7",X"11",X"40", + X"40",X"ED",X"52",X"38",X"26",X"29",X"29",X"7C",X"FE",X"0E",X"30",X"1F",X"6F",X"87",X"87",X"87", + X"87",X"95",X"6F",X"79",X"E6",X"1F",X"FE",X"1E",X"30",X"11",X"CB",X"47",X"28",X"0D",X"3D",X"CB", + X"3F",X"85",X"5F",X"16",X"00",X"21",X"30",X"48",X"19",X"7E",X"C9",X"3E",X"FF",X"C9",X"7C",X"E6", + X"F0",X"D6",X"20",X"38",X"F6",X"FE",X"D1",X"30",X"F2",X"67",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F", + X"CB",X"3F",X"4F",X"7C",X"91",X"67",X"7D",X"ED",X"44",X"E6",X"F8",X"D6",X"08",X"38",X"DC",X"FE", + X"E1",X"30",X"D8",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"84",X"C3",X"92",X"0F",X"11", + X"30",X"48",X"B7",X"ED",X"52",X"7D",X"26",X"20",X"FE",X"0F",X"38",X"0A",X"D6",X"0F",X"47",X"7C", + X"C6",X"10",X"67",X"78",X"18",X"F2",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"CB",X"27",X"C6",X"08", + X"ED",X"44",X"6F",X"C9",X"CD",X"CF",X"0F",X"CD",X"BC",X"3D",X"C9",X"C0",X"C0",X"C0",X"C0",X"00", + X"C0",X"C0",X"00",X"C0",X"C0",X"00",X"C0",X"C0",X"00",X"C0",X"C0",X"C0",X"C0",X"FF",X"FF",X"FF", + X"31",X"60",X"4F",X"21",X"14",X"4A",X"06",X"38",X"CF",X"21",X"BE",X"24",X"22",X"40",X"4A",X"AF", + X"32",X"42",X"4A",X"FD",X"21",X"14",X"4A",X"3A",X"E6",X"49",X"47",X"05",X"CD",X"EF",X"3E",X"21", + X"22",X"27",X"11",X"14",X"4A",X"01",X"24",X"00",X"ED",X"B0",X"CD",X"97",X"1A",X"06",X"03",X"C5", + X"CD",X"90",X"11",X"3E",X"23",X"06",X"18",X"FF",X"21",X"88",X"4B",X"06",X"19",X"CF",X"3E",X"23", + X"06",X"0C",X"FF",X"C1",X"10",X"E9",X"3E",X"23",X"06",X"01",X"FF",X"3E",X"45",X"FF",X"3E",X"02", + X"01",X"50",X"8C",X"FF",X"3E",X"01",X"01",X"78",X"86",X"FF",X"3E",X"03",X"01",X"48",X"3F",X"FF", + X"3A",X"DA",X"49",X"CB",X"47",X"16",X"00",X"28",X"02",X"16",X"FF",X"1E",X"00",X"3E",X"00",X"CD", + X"20",X"2C",X"3E",X"23",X"06",X"01",X"FF",X"21",X"E4",X"49",X"35",X"20",X"55",X"EB",X"21",X"28", + X"25",X"3A",X"E7",X"49",X"FE",X"0A",X"38",X"02",X"3E",X"0A",X"06",X"00",X"4F",X"09",X"7E",X"EB", + X"77",X"21",X"E1",X"49",X"35",X"F5",X"3A",X"DA",X"49",X"CB",X"47",X"20",X"21",X"7E",X"FE",X"18", + X"20",X"1C",X"3A",X"DA",X"49",X"CB",X"47",X"CB",X"C7",X"32",X"DA",X"49",X"3E",X"09",X"16",X"00", + X"1E",X"00",X"CD",X"20",X"2C",X"3E",X"00",X"16",X"FF",X"1E",X"00",X"CD",X"20",X"2C",X"CD",X"12", + X"3F",X"F1",X"20",X"0E",X"3A",X"02",X"48",X"CB",X"4F",X"CB",X"CF",X"32",X"02",X"48",X"FD",X"36", + X"11",X"20",X"FD",X"21",X"14",X"4A",X"3A",X"01",X"48",X"CB",X"67",X"28",X"2A",X"FD",X"6E",X"24", + X"FD",X"66",X"25",X"2B",X"FD",X"75",X"24",X"FD",X"74",X"25",X"7C",X"B5",X"20",X"19",X"FD",X"6E", + X"26",X"FD",X"66",X"27",X"FD",X"7E",X"29",X"77",X"3A",X"01",X"48",X"CB",X"67",X"CB",X"A7",X"32", + X"01",X"48",X"3E",X"0D",X"CD",X"8E",X"2C",X"FD",X"7E",X"08",X"FE",X"04",X"28",X"0E",X"FE",X"03", + X"28",X"0A",X"3A",X"01",X"48",X"CB",X"4F",X"20",X"03",X"CD",X"61",X"1B",X"FD",X"7E",X"09",X"21", + X"35",X"11",X"F7",X"18",X"0A",X"DE",X"11",X"DE",X"11",X"02",X"16",X"1D",X"16",X"57",X"16",X"FD", + X"7E",X"08",X"21",X"F7",X"11",X"F7",X"FD",X"7E",X"30",X"B7",X"28",X"3E",X"FE",X"01",X"20",X"2D", + X"FD",X"7E",X"32",X"B7",X"28",X"05",X"FD",X"35",X"32",X"18",X"2F",X"FD",X"7E",X"1B",X"FE",X"36", + X"20",X"12",X"FD",X"36",X"30",X"02",X"FD",X"36",X"31",X"40",X"FD",X"36",X"1B",X"25",X"FD",X"36", + X"1D",X"4F",X"18",X"16",X"FD",X"34",X"1B",X"FD",X"36",X"32",X"08",X"18",X"0D",X"FD",X"35",X"31", + X"20",X"08",X"FD",X"36",X"1B",X"00",X"FD",X"36",X"30",X"00",X"CD",X"90",X"11",X"C3",X"82",X"10", + X"21",X"18",X"4A",X"11",X"8E",X"4B",X"01",X"04",X"00",X"ED",X"B0",X"21",X"34",X"4A",X"11",X"93", + X"4B",X"01",X"04",X"00",X"ED",X"B0",X"21",X"2F",X"4A",X"11",X"9D",X"4B",X"01",X"04",X"00",X"ED", + X"B0",X"FD",X"7E",X"09",X"FE",X"03",X"28",X"27",X"21",X"2B",X"4A",X"11",X"98",X"4B",X"01",X"04", + X"00",X"ED",X"B0",X"21",X"14",X"4A",X"11",X"89",X"4B",X"01",X"04",X"00",X"ED",X"B0",X"AF",X"32", + X"88",X"4B",X"32",X"8D",X"4B",X"32",X"92",X"4B",X"32",X"97",X"4B",X"32",X"9C",X"4B",X"C9",X"21", + X"14",X"4A",X"11",X"98",X"4B",X"01",X"04",X"00",X"ED",X"B0",X"21",X"2B",X"4A",X"11",X"89",X"4B", + X"01",X"04",X"00",X"ED",X"B0",X"18",X"D7",X"03",X"12",X"68",X"14",X"E7",X"17",X"8C",X"14",X"32", + X"18",X"B2",X"15",X"CD",X"B2",X"1A",X"FD",X"7E",X"08",X"FE",X"05",X"28",X"33",X"CD",X"BC",X"19", + X"20",X"2E",X"FD",X"66",X"21",X"FD",X"6E",X"23",X"CD",X"9E",X"0F",X"E6",X"F0",X"FE",X"80",X"20", + X"1F",X"FD",X"7E",X"08",X"FE",X"01",X"28",X"18",X"3E",X"11",X"CD",X"8E",X"2C",X"3E",X"05",X"16", + X"00",X"1E",X"00",X"CD",X"20",X"2C",X"FD",X"36",X"08",X"05",X"FD",X"7E",X"0E",X"FD",X"77",X"11", + X"3A",X"01",X"48",X"CB",X"4F",X"28",X"20",X"CD",X"BC",X"19",X"C2",X"05",X"14",X"3E",X"00",X"CD", + X"8E",X"2C",X"3A",X"01",X"48",X"CB",X"5F",X"C2",X"A6",X"19",X"3E",X"23",X"06",X"40",X"FF",X"3E", + X"47",X"06",X"10",X"FF",X"C3",X"A6",X"19",X"3A",X"02",X"48",X"CB",X"4F",X"28",X"1C",X"FD",X"7E", + X"11",X"B7",X"CA",X"9C",X"19",X"FD",X"35",X"11",X"CD",X"BC",X"19",X"20",X"0A",X"CD",X"F2",X"19", + X"E6",X"F0",X"28",X"03",X"C3",X"9C",X"19",X"AF",X"18",X"03",X"CD",X"FE",X"1A",X"CB",X"67",X"CA", + X"20",X"13",X"47",X"FD",X"7E",X"08",X"FE",X"05",X"78",X"CA",X"24",X"13",X"47",X"3E",X"03",X"FD", + X"BE",X"09",X"78",X"CA",X"24",X"13",X"FD",X"CB",X"1F",X"46",X"C2",X"24",X"13",X"FD",X"CB",X"01", + X"46",X"C2",X"24",X"13",X"FD",X"CB",X"03",X"46",X"C2",X"24",X"13",X"3A",X"E2",X"49",X"3C",X"32", + X"E2",X"49",X"FD",X"36",X"0A",X"03",X"CD",X"87",X"1A",X"FD",X"36",X"1F",X"01",X"FD",X"36",X"08", + X"03",X"FD",X"CB",X"0E",X"46",X"20",X"16",X"FD",X"7E",X"03",X"E6",X"0F",X"0E",X"20",X"FD",X"CB", + X"0E",X"4E",X"20",X"03",X"81",X"18",X"17",X"ED",X"44",X"E6",X"0F",X"18",X"F7",X"FD",X"7E",X"01", + X"C6",X"08",X"E6",X"0F",X"0E",X"20",X"FD",X"CB",X"0E",X"4E",X"28",X"EB",X"18",X"E6",X"FD",X"77", + X"12",X"FD",X"36",X"13",X"00",X"21",X"8D",X"26",X"CD",X"1B",X"1A",X"21",X"16",X"27",X"CD",X"5E", + X"1A",X"3E",X"04",X"CD",X"8E",X"2C",X"3E",X"07",X"16",X"00",X"1E",X"00",X"CD",X"20",X"2C",X"C9", + X"FD",X"36",X"1F",X"00",X"CD",X"CA",X"19",X"FD",X"77",X"0F",X"5F",X"FE",X"04",X"20",X"1D",X"FD", + X"7E",X"2F",X"B7",X"28",X"05",X"FD",X"35",X"2F",X"18",X"16",X"FD",X"7E",X"0A",X"FE",X"02",X"28", + X"4B",X"FD",X"36",X"0A",X"02",X"D5",X"CD",X"87",X"1A",X"D1",X"18",X"40",X"FD",X"36",X"2F",X"0C", + X"7B",X"EE",X"02",X"FD",X"BE",X"0E",X"20",X"1D",X"FD",X"7E",X"08",X"FE",X"05",X"20",X"05",X"FD", + X"5E",X"0E",X"18",X"11",X"FD",X"36",X"0A",X"06",X"D5",X"CD",X"87",X"1A",X"D1",X"CD",X"BC",X"19", + X"C2",X"D3",X"13",X"18",X"26",X"7B",X"FD",X"BE",X"0E",X"20",X"11",X"FD",X"36",X"0A",X"06",X"D5", + X"CD",X"87",X"1A",X"D1",X"CD",X"BC",X"19",X"C2",X"05",X"14",X"18",X"0F",X"CD",X"BC",X"19",X"C2", + X"05",X"14",X"7B",X"FE",X"04",X"20",X"04",X"FD",X"7E",X"0E",X"5F",X"D5",X"CD",X"89",X"17",X"D1", + X"7B",X"CD",X"EB",X"3D",X"A6",X"C2",X"D3",X"13",X"FD",X"7E",X"0E",X"5F",X"CD",X"EB",X"3D",X"A6", + X"C2",X"D3",X"13",X"7B",X"D6",X"01",X"E6",X"03",X"5F",X"CD",X"EB",X"3D",X"A6",X"20",X"04",X"7B", + X"EE",X"02",X"5F",X"FD",X"7E",X"0A",X"FE",X"02",X"28",X"09",X"FD",X"36",X"0A",X"02",X"D5",X"CD", + X"87",X"1A",X"D1",X"FD",X"73",X"0F",X"FD",X"7E",X"0F",X"FD",X"BE",X"0E",X"CA",X"05",X"14",X"3E", + X"05",X"CD",X"8E",X"2C",X"FD",X"36",X"08",X"01",X"FD",X"36",X"10",X"04",X"FD",X"4E",X"0F",X"FD", + X"7E",X"0E",X"FD",X"71",X"0E",X"21",X"A2",X"26",X"CD",X"E1",X"3D",X"EB",X"CD",X"5E",X"1A",X"21", + X"DA",X"26",X"CD",X"1B",X"1A",X"FD",X"7E",X"08",X"FE",X"05",X"28",X"04",X"CD",X"06",X"1A",X"D0", + X"21",X"32",X"25",X"FD",X"7E",X"08",X"FE",X"05",X"20",X"03",X"21",X"3A",X"25",X"FD",X"7E",X"0E", + X"CD",X"E1",X"3D",X"D5",X"C1",X"FD",X"66",X"01",X"FD",X"6E",X"03",X"CD",X"83",X"3D",X"FD",X"74", + X"01",X"FD",X"75",X"03",X"FD",X"66",X"05",X"FD",X"6E",X"07",X"CD",X"83",X"3D",X"FD",X"74",X"05", + X"FD",X"75",X"07",X"FD",X"66",X"21",X"FD",X"6E",X"23",X"CD",X"83",X"3D",X"FD",X"74",X"21",X"FD", + X"75",X"23",X"FD",X"7E",X"09",X"FE",X"03",X"C0",X"FD",X"66",X"18",X"FD",X"6E",X"1A",X"CD",X"83", + X"3D",X"FD",X"74",X"18",X"FD",X"75",X"1A",X"C9",X"FD",X"7E",X"10",X"B7",X"28",X"06",X"FD",X"35", + X"10",X"C3",X"06",X"12",X"CD",X"7A",X"14",X"C3",X"06",X"12",X"FD",X"36",X"08",X"00",X"21",X"FA", + X"26",X"CD",X"5E",X"1A",X"CD",X"97",X"1A",X"FD",X"CB",X"10",X"BE",X"C9",X"CD",X"06",X"1A",X"D0", + X"FD",X"7E",X"12",X"B7",X"CA",X"0D",X"15",X"21",X"0A",X"27",X"FD",X"7E",X"13",X"FE",X"08",X"28", + X"0A",X"FD",X"7E",X"12",X"21",X"16",X"27",X"FE",X"08",X"20",X"03",X"CD",X"5E",X"1A",X"FD",X"7E", + X"13",X"0E",X"02",X"FE",X"08",X"38",X"0F",X"0E",X"01",X"FE",X"18",X"38",X"09",X"FD",X"7E",X"12", + X"FE",X"09",X"30",X"02",X"0E",X"02",X"FD",X"7E",X"12",X"91",X"30",X"01",X"AF",X"FD",X"77",X"12", + X"79",X"FD",X"86",X"13",X"FD",X"77",X"13",X"C5",X"CD",X"98",X"17",X"C1",X"79",X"FD",X"CB",X"0E", + X"46",X"20",X"15",X"FD",X"CB",X"0E",X"4E",X"20",X"01",X"ED",X"44",X"FD",X"86",X"03",X"FD",X"77", + X"03",X"FD",X"77",X"07",X"FD",X"77",X"23",X"C9",X"FD",X"CB",X"0E",X"4E",X"28",X"01",X"ED",X"44", + X"FD",X"86",X"01",X"FD",X"77",X"01",X"FD",X"77",X"05",X"FD",X"77",X"21",X"C9",X"3E",X"07",X"CD", + X"8E",X"2C",X"FD",X"36",X"08",X"00",X"FD",X"36",X"09",X"00",X"FD",X"36",X"28",X"00",X"FD",X"36", + X"0A",X"06",X"CD",X"87",X"1A",X"21",X"14",X"4A",X"11",X"2B",X"4A",X"01",X"08",X"00",X"ED",X"B0", + X"AF",X"32",X"2B",X"4A",X"32",X"2F",X"4A",X"21",X"DA",X"26",X"CD",X"1B",X"1A",X"21",X"FA",X"26", + X"CD",X"5E",X"1A",X"FD",X"7E",X"0E",X"CD",X"E0",X"19",X"CD",X"9E",X"0F",X"FE",X"FF",X"28",X"5C", + X"E6",X"F0",X"28",X"58",X"FE",X"80",X"CA",X"21",X"12",X"FE",X"90",X"D2",X"AC",X"1C",X"FE",X"70", + X"20",X"03",X"C3",X"6C",X"17",X"FD",X"36",X"08",X"02",X"47",X"C5",X"CD",X"D5",X"17",X"C1",X"28", + X"2A",X"78",X"21",X"42",X"25",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"3D",X"16",X"00", + X"5F",X"19",X"7E",X"FD",X"77",X"19",X"FD",X"77",X"1D",X"FD",X"36",X"09",X"01",X"FD",X"36",X"16", + X"00",X"3E",X"0C",X"16",X"00",X"1E",X"00",X"CD",X"20",X"2C",X"C9",X"FD",X"66",X"21",X"FD",X"6E", + X"23",X"CD",X"9E",X"0F",X"E5",X"CD",X"F4",X"0F",X"D1",X"CD",X"CD",X"1B",X"CD",X"FE",X"1A",X"C3", + X"24",X"13",X"FD",X"7E",X"10",X"CB",X"BF",X"B7",X"28",X"06",X"FD",X"35",X"10",X"C3",X"06",X"12", + X"3E",X"02",X"FD",X"B6",X"10",X"FD",X"77",X"10",X"FD",X"CB",X"10",X"7E",X"FD",X"CB",X"10",X"BE", + X"20",X"2B",X"FD",X"CB",X"10",X"FE",X"FD",X"4E",X"11",X"79",X"C6",X"01",X"FE",X"04",X"38",X"01", + X"AF",X"FD",X"77",X"11",X"C5",X"21",X"DA",X"26",X"CD",X"1E",X"1A",X"C1",X"79",X"21",X"A2",X"26", + X"CD",X"E1",X"3D",X"EB",X"FD",X"7E",X"11",X"CD",X"61",X"1A",X"C3",X"06",X"12",X"21",X"FA",X"26", + X"18",X"F2",X"FD",X"36",X"09",X"03",X"21",X"FA",X"26",X"CD",X"5E",X"1A",X"CD",X"97",X"1A",X"FD", + X"CB",X"10",X"BE",X"21",X"DA",X"26",X"CD",X"1B",X"1A",X"FD",X"36",X"19",X"1A",X"3A",X"01",X"48", + X"CB",X"7F",X"C8",X"CD",X"FE",X"1A",X"CB",X"67",X"C8",X"FD",X"36",X"1F",X"01",X"FD",X"36",X"09", + X"04",X"FD",X"7E",X"08",X"FE",X"05",X"FD",X"7E",X"0E",X"20",X"03",X"FD",X"7E",X"11",X"FD",X"77", + X"2A",X"FD",X"36",X"2B",X"02",X"21",X"18",X"25",X"CD",X"E1",X"3D",X"FD",X"73",X"17",X"3E",X"0F", + X"16",X"00",X"1E",X"00",X"CD",X"20",X"2C",X"FD",X"7E",X"2B",X"FD",X"35",X"2B",X"20",X"1D",X"FD", + X"36",X"2B",X"02",X"FD",X"7E",X"2A",X"21",X"18",X"25",X"CD",X"E1",X"3D",X"FD",X"7E",X"17",X"B7", + X"28",X"07",X"7B",X"FD",X"BE",X"17",X"20",X"01",X"7A",X"FD",X"77",X"17",X"FD",X"66",X"18",X"FD", + X"6E",X"1A",X"FD",X"CB",X"2A",X"46",X"28",X"0D",X"7C",X"FE",X"F8",X"D2",X"5D",X"17",X"FE",X"08", + X"DA",X"5D",X"17",X"18",X"1B",X"7D",X"FD",X"CB",X"2A",X"4E",X"20",X"07",X"FE",X"10",X"DA",X"5D", + X"17",X"18",X"0D",X"FE",X"20",X"30",X"09",X"FE",X"18",X"D2",X"5D",X"17",X"FD",X"36",X"17",X"00", + X"FD",X"CB",X"2A",X"46",X"20",X"1F",X"7D",X"C6",X"08",X"6F",X"E6",X"0F",X"FE",X"01",X"38",X"45", + X"FE",X"0E",X"30",X"41",X"7D",X"E6",X"F0",X"0E",X"E8",X"FD",X"CB",X"2A",X"4E",X"20",X"02",X"0E", + X"08",X"81",X"6F",X"18",X"0F",X"7C",X"E6",X"0F",X"FE",X"01",X"38",X"29",X"FE",X"0E",X"30",X"25", + X"7C",X"E6",X"F0",X"67",X"E5",X"CD",X"9E",X"0F",X"D1",X"FE",X"FF",X"28",X"18",X"E6",X"F0",X"28", + X"14",X"FE",X"80",X"28",X"10",X"FE",X"70",X"28",X"0C",X"FE",X"90",X"30",X"23",X"E5",X"CD",X"F4", + X"0F",X"D1",X"CD",X"CD",X"1B",X"21",X"20",X"25",X"FD",X"7E",X"2A",X"CD",X"E1",X"3D",X"D5",X"C1", + X"FD",X"66",X"18",X"FD",X"6E",X"1A",X"CD",X"83",X"3D",X"FD",X"74",X"18",X"FD",X"75",X"1A",X"C9", + X"FD",X"36",X"30",X"01",X"FD",X"36",X"32",X"08",X"FD",X"36",X"1B",X"34",X"FD",X"36",X"1D",X"49", + X"FD",X"72",X"1C",X"FD",X"73",X"1E",X"CD",X"4A",X"17",X"21",X"6B",X"17",X"CD",X"04",X"3E",X"3E", + X"11",X"16",X"00",X"1E",X"00",X"CD",X"20",X"2C",X"18",X"BB",X"7E",X"E6",X"0F",X"77",X"F5",X"CD", + X"F4",X"0F",X"F1",X"DD",X"21",X"77",X"89",X"1E",X"01",X"CD",X"50",X"89",X"C9",X"FD",X"36",X"17", + X"00",X"FD",X"36",X"09",X"00",X"C9",X"00",X"00",X"01",X"00",X"00",X"00",X"3A",X"01",X"48",X"CB", + X"57",X"CB",X"D7",X"32",X"01",X"48",X"FD",X"36",X"08",X"04",X"3E",X"00",X"CD",X"8E",X"2C",X"3E", + X"0B",X"16",X"00",X"1E",X"00",X"CD",X"20",X"2C",X"C9",X"FD",X"66",X"21",X"FD",X"6E",X"23",X"CD", + X"9E",X"0F",X"E6",X"0F",X"CD",X"D8",X"19",X"C9",X"CD",X"D5",X"17",X"C0",X"CD",X"89",X"17",X"FD", + X"7E",X"0E",X"D6",X"01",X"E6",X"03",X"5F",X"CD",X"EB",X"3D",X"A6",X"20",X"04",X"7B",X"EE",X"02", + X"5F",X"FD",X"73",X"0E",X"21",X"16",X"27",X"FD",X"7E",X"13",X"FE",X"08",X"38",X"0D",X"21",X"0A", + X"27",X"FD",X"7E",X"12",X"FE",X"09",X"30",X"03",X"21",X"16",X"27",X"CD",X"5E",X"1A",X"21",X"8D", + X"26",X"CD",X"1B",X"1A",X"C9",X"CD",X"BC",X"19",X"C0",X"FD",X"66",X"21",X"FD",X"6E",X"23",X"CD", + X"F2",X"19",X"FE",X"FF",X"C8",X"B7",X"C9",X"FD",X"7E",X"16",X"B7",X"20",X"1A",X"3E",X"0C",X"16", + X"00",X"1E",X"00",X"CD",X"20",X"2C",X"FD",X"7E",X"0E",X"FD",X"E5",X"FD",X"21",X"2B",X"4A",X"21", + X"49",X"25",X"CD",X"61",X"1A",X"FD",X"E1",X"FD",X"7E",X"16",X"3C",X"FD",X"77",X"16",X"FE",X"10", + X"28",X"10",X"FE",X"08",X"C0",X"FD",X"34",X"17",X"FD",X"34",X"17",X"FD",X"34",X"1B",X"FD",X"34", + X"1B",X"C9",X"FD",X"36",X"17",X"00",X"FD",X"36",X"1B",X"00",X"3E",X"0C",X"CD",X"8E",X"2C",X"C3", + X"AD",X"12",X"3E",X"15",X"FF",X"21",X"A1",X"4B",X"06",X"0F",X"CF",X"3E",X"3E",X"32",X"A2",X"4B", + X"3C",X"32",X"A7",X"4B",X"3E",X"15",X"32",X"A4",X"4B",X"32",X"A9",X"4B",X"FD",X"7E",X"21",X"C6", + X"F8",X"32",X"A3",X"4B",X"C6",X"10",X"32",X"A8",X"4B",X"FD",X"7E",X"23",X"D6",X"10",X"FE",X"10", + X"30",X"02",X"3E",X"10",X"32",X"A5",X"4B",X"32",X"AA",X"4B",X"AF",X"32",X"A1",X"4B",X"32",X"A6", + X"4B",X"FD",X"7E",X"0E",X"CD",X"E0",X"19",X"7C",X"32",X"8A",X"4B",X"32",X"8F",X"4B",X"32",X"94", + X"4B",X"32",X"99",X"4B",X"32",X"9E",X"4B",X"7D",X"32",X"8C",X"4B",X"32",X"91",X"4B",X"32",X"96", + X"4B",X"32",X"9B",X"4B",X"32",X"A0",X"4B",X"3E",X"18",X"32",X"9F",X"4B",X"3E",X"9F",X"32",X"8B", + X"4B",X"32",X"90",X"4B",X"32",X"95",X"4B",X"32",X"9A",X"4B",X"21",X"55",X"25",X"11",X"14",X"4A", + X"01",X"1A",X"00",X"ED",X"B0",X"3E",X"23",X"06",X"02",X"FF",X"FD",X"21",X"15",X"4A",X"DD",X"21", + X"88",X"4B",X"06",X"04",X"C5",X"FD",X"7E",X"03",X"FD",X"B6",X"04",X"CA",X"4F",X"19",X"FD",X"7E", + X"00",X"B7",X"28",X"05",X"FD",X"35",X"00",X"20",X"1E",X"FD",X"36",X"00",X"03",X"FD",X"6E",X"01", + X"FD",X"66",X"02",X"7E",X"B7",X"20",X"06",X"01",X"08",X"00",X"ED",X"42",X"7E",X"23",X"FD",X"75", + X"01",X"FD",X"74",X"02",X"DD",X"77",X"01",X"FD",X"6E",X"03",X"FD",X"66",X"04",X"7E",X"FE",X"80", + X"20",X"16",X"FD",X"36",X"03",X"00",X"FD",X"36",X"04",X"00",X"3A",X"14",X"4A",X"3C",X"32",X"14", + X"4A",X"FE",X"04",X"CA",X"95",X"19",X"18",X"37",X"4F",X"23",X"46",X"23",X"FD",X"75",X"03",X"FD", + X"74",X"04",X"DD",X"66",X"02",X"DD",X"6E",X"04",X"CD",X"83",X"3D",X"7D",X"FE",X"10",X"30",X"04", + X"2E",X"10",X"18",X"06",X"FE",X"FC",X"38",X"02",X"2E",X"FC",X"7C",X"FE",X"1C",X"30",X"04",X"26", + X"1C",X"18",X"06",X"FE",X"F4",X"38",X"02",X"26",X"F4",X"DD",X"74",X"02",X"DD",X"75",X"04",X"DD", + X"36",X"00",X"00",X"01",X"05",X"00",X"FD",X"09",X"DD",X"09",X"C1",X"05",X"C2",X"C4",X"18",X"FD", + X"7E",X"00",X"B7",X"C2",X"B5",X"18",X"FD",X"7E",X"01",X"B7",X"28",X"06",X"FD",X"35",X"01",X"C3", + X"B5",X"18",X"FD",X"6E",X"02",X"FD",X"66",X"03",X"7E",X"B7",X"20",X"03",X"FD",X"34",X"00",X"DD", + X"77",X"01",X"23",X"7E",X"FD",X"77",X"01",X"23",X"FD",X"75",X"02",X"FD",X"74",X"03",X"DD",X"36", + X"00",X"00",X"C3",X"B5",X"18",X"3E",X"23",X"06",X"10",X"FF",X"18",X"05",X"3E",X"23",X"06",X"40", + X"FF",X"3E",X"47",X"06",X"20",X"FF",X"FD",X"21",X"14",X"4A",X"FD",X"6E",X"26",X"FD",X"66",X"27", + X"3E",X"60",X"BE",X"20",X"04",X"FD",X"7E",X"29",X"77",X"3E",X"60",X"FF",X"FD",X"7E",X"21",X"E6", + X"0F",X"C0",X"FD",X"7E",X"23",X"E6",X"0F",X"FE",X"08",X"C9",X"E6",X"0F",X"CD",X"F7",X"3D",X"21", + X"9D",X"26",X"16",X"00",X"5F",X"19",X"7E",X"C9",X"21",X"4E",X"81",X"16",X"00",X"5F",X"19",X"C9", + X"21",X"59",X"26",X"CD",X"E1",X"3D",X"D5",X"C1",X"FD",X"66",X"01",X"FD",X"6E",X"03",X"CD",X"83", + X"3D",X"C9",X"E5",X"FD",X"7E",X"0E",X"21",X"61",X"26",X"CD",X"E1",X"3D",X"D5",X"C1",X"E1",X"CD", + X"83",X"3D",X"CD",X"9E",X"0F",X"C9",X"FD",X"6E",X"0C",X"FD",X"66",X"0D",X"29",X"F5",X"11",X"00", + X"00",X"ED",X"5A",X"FD",X"75",X"0C",X"FD",X"74",X"0D",X"F1",X"C9",X"FD",X"7E",X"0E",X"CD",X"E1", + X"3D",X"EB",X"4E",X"23",X"46",X"23",X"5E",X"23",X"56",X"23",X"E5",X"FD",X"66",X"21",X"FD",X"6E", + X"23",X"E5",X"CD",X"83",X"3D",X"FD",X"74",X"01",X"FD",X"75",X"03",X"E1",X"E5",X"D5",X"C1",X"CD", + X"83",X"3D",X"FD",X"74",X"05",X"FD",X"75",X"07",X"D1",X"E1",X"3E",X"03",X"FD",X"BE",X"09",X"C0", + X"4E",X"23",X"46",X"EB",X"CD",X"83",X"3D",X"FD",X"74",X"18",X"FD",X"75",X"1A",X"C9",X"FD",X"7E", + X"0E",X"5F",X"87",X"83",X"16",X"00",X"5F",X"19",X"7E",X"23",X"FD",X"77",X"00",X"3C",X"FD",X"77", + X"04",X"3A",X"1C",X"4A",X"FE",X"02",X"C8",X"7E",X"23",X"FD",X"77",X"20",X"3E",X"03",X"FD",X"BE", + X"09",X"C0",X"7E",X"FD",X"77",X"17",X"C9",X"FD",X"7E",X"0A",X"21",X"69",X"26",X"CD",X"E1",X"3D", + X"FD",X"73",X"0C",X"FD",X"72",X"0D",X"C9",X"FD",X"7E",X"0A",X"16",X"00",X"5F",X"21",X"AB",X"1A", + X"19",X"FD",X"7E",X"10",X"E6",X"80",X"B6",X"FD",X"77",X"10",X"C9",X"0A",X"0A",X"0A",X"08",X"08", + X"06",X"06",X"FD",X"7E",X"10",X"CB",X"BF",X"B7",X"28",X"04",X"FD",X"35",X"10",X"C9",X"CD",X"97", + X"1A",X"21",X"7D",X"26",X"FD",X"7E",X"0E",X"CD",X"E1",X"3D",X"FD",X"CB",X"10",X"7E",X"20",X"17", + X"7A",X"FD",X"BE",X"00",X"28",X"17",X"FD",X"CB",X"10",X"BE",X"FD",X"34",X"00",X"FD",X"34",X"00", + X"FD",X"34",X"04",X"FD",X"34",X"04",X"C9",X"7B",X"FD",X"BE",X"00",X"28",X"E9",X"FD",X"CB",X"10", + X"FE",X"FD",X"35",X"00",X"FD",X"35",X"00",X"FD",X"35",X"04",X"FD",X"35",X"04",X"C9",X"3A",X"01", + X"48",X"CB",X"7F",X"28",X"17",X"21",X"00",X"50",X"3A",X"01",X"48",X"CB",X"6F",X"28",X"0A",X"3A", + X"1B",X"48",X"CB",X"47",X"20",X"03",X"21",X"40",X"50",X"7E",X"2F",X"C9",X"C1",X"3A",X"42",X"4A", + X"B7",X"28",X"10",X"3D",X"32",X"42",X"4A",X"28",X"0A",X"2A",X"40",X"4A",X"7E",X"FD",X"77",X"0F", + X"C3",X"24",X"13",X"2A",X"40",X"4A",X"23",X"23",X"7E",X"FE",X"F0",X"28",X"0A",X"FE",X"F1",X"28", + X"0C",X"CD",X"53",X"1B",X"C3",X"24",X"13",X"22",X"40",X"4A",X"C3",X"C2",X"12",X"22",X"40",X"4A", + X"C3",X"29",X"16",X"22",X"40",X"4A",X"23",X"7E",X"32",X"42",X"4A",X"2B",X"7E",X"FD",X"77",X"0F", + X"C9",X"3A",X"20",X"48",X"B7",X"C8",X"F5",X"CD",X"BB",X"1B",X"F1",X"CB",X"4F",X"C4",X"20",X"1D", + X"C9",X"DD",X"21",X"58",X"4A",X"06",X"03",X"DD",X"7E",X"09",X"FE",X"04",X"30",X"24",X"FD",X"7E", + X"21",X"C6",X"04",X"57",X"D6",X"08",X"5F",X"DD",X"7E",X"01",X"BA",X"30",X"15",X"BB",X"38",X"12", + X"FD",X"7E",X"23",X"C6",X"04",X"57",X"D6",X"08",X"5F",X"DD",X"7E",X"03",X"BA",X"30",X"03",X"BB", + X"30",X"08",X"11",X"30",X"00",X"DD",X"19",X"10",X"CE",X"C9",X"CD",X"6C",X"17",X"FD",X"E5",X"DD", + X"E5",X"FD",X"E1",X"CD",X"84",X"24",X"FD",X"E1",X"DD",X"E1",X"C9",X"CD",X"E1",X"1C",X"C2",X"95", + X"1C",X"CD",X"BA",X"1C",X"FE",X"FF",X"C8",X"E6",X"F0",X"C8",X"FE",X"70",X"D0",X"FD",X"E5",X"1A", + X"FE",X"60",X"20",X"1D",X"E5",X"D5",X"3E",X"0D",X"CD",X"8E",X"2C",X"3A",X"01",X"48",X"F6",X"0A", + X"32",X"01",X"48",X"CD",X"2B",X"1C",X"3E",X"06",X"01",X"28",X"86",X"FF",X"FD",X"7E",X"29",X"D1", + X"E1",X"4F",X"E6",X"F0",X"FE",X"50",X"20",X"0B",X"FD",X"7E",X"09",X"FE",X"04",X"28",X"04",X"FD", + X"36",X"09",X"02",X"79",X"E6",X"0F",X"12",X"CD",X"02",X"8D",X"FD",X"E1",X"3A",X"DB",X"49",X"3C", + X"32",X"DB",X"49",X"3A",X"E0",X"49",X"3D",X"32",X"E0",X"49",X"28",X"05",X"FE",X"08",X"28",X"13", + X"C9",X"3A",X"01",X"48",X"CB",X"4F",X"CB",X"CF",X"32",X"01",X"48",X"FD",X"36",X"0A",X"02",X"CD", + X"87",X"1A",X"C9",X"3A",X"DA",X"49",X"CB",X"4F",X"C0",X"CB",X"4F",X"32",X"DA",X"49",X"3A",X"01", + X"48",X"CB",X"67",X"CB",X"E7",X"32",X"01",X"48",X"3E",X"0D",X"16",X"00",X"1E",X"00",X"CD",X"20", + X"2C",X"3A",X"01",X"48",X"CB",X"7F",X"20",X"05",X"21",X"57",X"48",X"18",X"1F",X"ED",X"5F",X"5F", + X"16",X"00",X"21",X"30",X"48",X"19",X"B7",X"11",X"02",X"49",X"E5",X"ED",X"52",X"E1",X"38",X"03", + X"21",X"30",X"48",X"7E",X"E6",X"F0",X"28",X"1A",X"FE",X"50",X"30",X"16",X"7E",X"FD",X"77",X"29", + X"36",X"60",X"FD",X"75",X"26",X"FD",X"74",X"27",X"21",X"5A",X"02",X"FD",X"75",X"24",X"FD",X"74", + X"25",X"C9",X"23",X"18",X"D1",X"21",X"10",X"1D",X"CD",X"E4",X"1C",X"C0",X"21",X"B2",X"1C",X"CD", + X"BD",X"1C",X"47",X"FE",X"FF",X"C8",X"E6",X"F0",X"FE",X"90",X"D8",X"EB",X"CD",X"4A",X"17",X"C3", + X"6C",X"17",X"00",X"F8",X"10",X"08",X"00",X"18",X"00",X"08",X"21",X"85",X"26",X"FD",X"7E",X"0E", + X"CD",X"E1",X"3D",X"FD",X"7E",X"21",X"E6",X"F0",X"67",X"FD",X"7E",X"23",X"E6",X"F0",X"6F",X"D5", + X"C1",X"CD",X"83",X"3D",X"E5",X"CD",X"BC",X"3D",X"D1",X"EB",X"D5",X"CD",X"9E",X"0F",X"D1",X"EB", + X"C9",X"21",X"04",X"1D",X"FD",X"7E",X"0E",X"16",X"00",X"5F",X"87",X"83",X"5F",X"19",X"FD",X"CB", + X"0E",X"46",X"FD",X"7E",X"21",X"20",X"03",X"FD",X"7E",X"23",X"E6",X"0F",X"BE",X"C8",X"23",X"BE", + X"C8",X"23",X"BE",X"C9",X"05",X"06",X"07",X"01",X"02",X"03",X"09",X"0A",X"0B",X"0D",X"0E",X"0F", + X"01",X"02",X"03",X"05",X"06",X"07",X"0D",X"0E",X"0F",X"09",X"0A",X"0B",X"FF",X"FF",X"FF",X"FF", + X"3A",X"01",X"48",X"CB",X"4F",X"C0",X"C3",X"71",X"1B",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"70",X"4E",X"21",X"56",X"4A",X"06",X"92",X"CF",X"21",X"A9",X"28",X"CD",X"84",X"24",X"FE", + X"00",X"28",X"02",X"3E",X"01",X"CD",X"E1",X"3D",X"EB",X"46",X"23",X"FD",X"21",X"58",X"4A",X"C5", + X"5E",X"23",X"56",X"23",X"E5",X"EB",X"FD",X"E5",X"D1",X"01",X"0D",X"00",X"ED",X"B0",X"21",X"80", + X"00",X"FD",X"75",X"17",X"FD",X"74",X"18",X"11",X"30",X"00",X"FD",X"19",X"E1",X"C1",X"10",X"DF", + X"3A",X"E3",X"49",X"B7",X"20",X"20",X"21",X"FA",X"28",X"CD",X"84",X"24",X"CD",X"E1",X"3D",X"EB", + X"46",X"23",X"FD",X"21",X"24",X"48",X"5E",X"23",X"56",X"23",X"FD",X"73",X"00",X"FD",X"72",X"01", + X"FD",X"23",X"FD",X"23",X"10",X"F0",X"AF",X"32",X"57",X"4A",X"3E",X"30",X"FF",X"3E",X"23",X"06", + X"01",X"FF",X"FD",X"21",X"58",X"4A",X"DD",X"21",X"A1",X"4B",X"21",X"3E",X"28",X"CD",X"84",X"24", + X"16",X"00",X"5F",X"19",X"46",X"AF",X"32",X"56",X"4A",X"C5",X"3A",X"01",X"48",X"E6",X"06",X"28", + X"08",X"FD",X"7E",X"09",X"FE",X"04",X"DA",X"BF",X"1F",X"DD",X"E5",X"FD",X"7E",X"09",X"DF",X"EF", + X"1D",X"9B",X"21",X"B4",X"21",X"6E",X"24",X"A4",X"20",X"07",X"21",X"D8",X"1F",X"2B",X"20",X"FD", + X"7E",X"08",X"21",X"F8",X"1D",X"F7",X"18",X"0A",X"2C",X"21",X"2C",X"21",X"2C",X"21",X"2C",X"21", + X"2C",X"21",X"FD",X"7E",X"08",X"FE",X"02",X"28",X"04",X"FE",X"03",X"20",X"54",X"FD",X"6E",X"17", + X"FD",X"66",X"18",X"7D",X"B4",X"20",X"43",X"FD",X"7E",X"01",X"67",X"E6",X"0F",X"20",X"42",X"FD", + X"7E",X"03",X"6F",X"E6",X"0F",X"FE",X"08",X"20",X"38",X"CD",X"C4",X"3F",X"38",X"33",X"21",X"60", + X"27",X"CD",X"84",X"24",X"16",X"00",X"5F",X"19",X"FD",X"7E",X"19",X"3C",X"FD",X"77",X"19",X"BE", + X"38",X"1F",X"AF",X"FD",X"77",X"19",X"21",X"6C",X"27",X"CD",X"84",X"24",X"CD",X"E1",X"3D",X"EB", + X"3A",X"01",X"48",X"CB",X"7F",X"20",X"03",X"21",X"90",X"00",X"2B",X"FD",X"75",X"17",X"FD",X"74", + X"18",X"3A",X"1D",X"4A",X"FE",X"04",X"C2",X"02",X"1F",X"3A",X"20",X"48",X"CB",X"5F",X"CA",X"02", + X"1F",X"CD",X"7D",X"1E",X"D2",X"02",X"1F",X"21",X"5F",X"28",X"C3",X"7E",X"1F",X"3A",X"2C",X"4A", + X"FD",X"BE",X"01",X"20",X"17",X"3A",X"2E",X"4A",X"C6",X"14",X"30",X"02",X"3E",X"FF",X"FD",X"BE", + X"03",X"38",X"6D",X"C6",X"D8",X"FD",X"BE",X"03",X"30",X"66",X"18",X"49",X"3A",X"2E",X"4A",X"FD", + X"BE",X"03",X"20",X"17",X"3A",X"2C",X"4A",X"C6",X"14",X"30",X"02",X"3E",X"FF",X"FD",X"BE",X"01", + X"38",X"4E",X"C6",X"D8",X"FD",X"BE",X"01",X"30",X"47",X"18",X"2A",X"3A",X"2C",X"4A",X"C6",X"08", + X"30",X"02",X"3E",X"FF",X"FD",X"BE",X"01",X"38",X"37",X"C6",X"F0",X"FD",X"BE",X"01",X"30",X"30", + X"3A",X"2E",X"4A",X"C6",X"08",X"30",X"02",X"3E",X"FF",X"FD",X"BE",X"03",X"38",X"22",X"C6",X"F0", + X"FD",X"BE",X"03",X"30",X"1B",X"3E",X"11",X"16",X"00",X"1E",X"00",X"CD",X"20",X"2C",X"FD",X"36", + X"09",X"05",X"FD",X"36",X"0C",X"08",X"FD",X"36",X"00",X"34",X"FD",X"36",X"02",X"49",X"37",X"C9", + X"A7",X"C9",X"FD",X"7E",X"14",X"B7",X"28",X"20",X"FD",X"35",X"14",X"C2",X"81",X"1F",X"FD",X"6E", + X"15",X"FD",X"66",X"16",X"E5",X"CD",X"68",X"0F",X"E1",X"DD",X"E5",X"DD",X"21",X"77",X"89",X"1E", + X"01",X"CD",X"50",X"89",X"DD",X"E1",X"18",X"59",X"3A",X"1C",X"4A",X"FE",X"03",X"20",X"52",X"3A", + X"22",X"4A",X"EE",X"02",X"FD",X"BE",X"0A",X"20",X"48",X"3A",X"35",X"4A",X"C6",X"02",X"FD",X"BE", + X"01",X"38",X"3E",X"D6",X"04",X"FD",X"BE",X"01",X"30",X"37",X"3A",X"37",X"4A",X"C6",X"02",X"FD", + X"BE",X"03",X"38",X"2D",X"D6",X"04",X"FD",X"BE",X"03",X"30",X"26",X"FD",X"66",X"01",X"FD",X"6E", + X"03",X"CD",X"9E",X"0F",X"CD",X"F4",X"0F",X"FD",X"75",X"15",X"FD",X"74",X"16",X"FD",X"36",X"14", + X"40",X"3E",X"CC",X"1E",X"15",X"01",X"02",X"02",X"CD",X"1E",X"3D",X"21",X"59",X"28",X"CD",X"04", + X"3E",X"DD",X"E1",X"FD",X"E5",X"E1",X"DD",X"E5",X"D1",X"13",X"01",X"04",X"00",X"ED",X"B0",X"FD", + X"7E",X"09",X"FE",X"06",X"20",X"04",X"DD",X"36",X"01",X"00",X"DD",X"36",X"00",X"00",X"3A",X"01", + X"48",X"CB",X"7F",X"28",X"1A",X"3A",X"56",X"4A",X"21",X"24",X"48",X"CD",X"E1",X"3D",X"3A",X"DC", + X"49",X"47",X"1A",X"B8",X"20",X"09",X"13",X"1A",X"FD",X"77",X"08",X"13",X"72",X"2B",X"73",X"3A", + X"56",X"4A",X"3C",X"32",X"56",X"4A",X"01",X"30",X"00",X"FD",X"09",X"01",X"05",X"00",X"DD",X"09", + X"C1",X"05",X"C2",X"C9",X"1D",X"C3",X"AD",X"1D",X"FD",X"6E",X"0B",X"FD",X"66",X"0C",X"2B",X"FD", + X"75",X"0B",X"FD",X"74",X"0C",X"7D",X"B4",X"C2",X"81",X"1F",X"CD",X"62",X"20",X"FD",X"36",X"09", + X"07",X"3A",X"01",X"48",X"CB",X"7F",X"20",X"19",X"3A",X"57",X"4A",X"F5",X"21",X"84",X"27",X"CD", + X"E1",X"3D",X"F1",X"3C",X"32",X"57",X"4A",X"FD",X"73",X"1A",X"FD",X"72",X"1B",X"AF",X"FD",X"77", + X"1C",X"21",X"8B",X"20",X"FD",X"75",X"0D",X"FD",X"74",X"0E",X"3E",X"11",X"CD",X"8E",X"2C",X"3E", + X"06",X"16",X"00",X"1E",X"00",X"CD",X"20",X"2C",X"C3",X"81",X"1F",X"FD",X"7E",X"0C",X"B7",X"28", + X"06",X"FD",X"35",X"0C",X"C3",X"81",X"1F",X"FD",X"36",X"0C",X"0A",X"FD",X"6E",X"0D",X"FD",X"66", + X"0E",X"7E",X"FE",X"FF",X"28",X"12",X"23",X"5E",X"23",X"FD",X"75",X"0D",X"FD",X"74",X"0E",X"FD", + X"77",X"00",X"FD",X"73",X"02",X"C3",X"81",X"1F",X"CD",X"62",X"20",X"FD",X"36",X"09",X"00",X"C3", + X"81",X"1F",X"FD",X"7E",X"08",X"F5",X"21",X"A9",X"28",X"CD",X"84",X"24",X"FE",X"00",X"28",X"02", + X"3E",X"01",X"CD",X"E1",X"3D",X"EB",X"23",X"3A",X"56",X"4A",X"CD",X"E1",X"3D",X"EB",X"FD",X"E5", + X"D1",X"01",X"0B",X"00",X"ED",X"B0",X"F1",X"FD",X"77",X"08",X"C9",X"29",X"08",X"2F",X"5C",X"30", + X"5B",X"29",X"08",X"2F",X"5B",X"30",X"5C",X"29",X"5B",X"2F",X"08",X"30",X"5C",X"29",X"5B",X"2F", + X"08",X"30",X"5C",X"FF",X"CD",X"AA",X"20",X"C3",X"81",X"1F",X"FD",X"7E",X"0C",X"B7",X"20",X"08", + X"FD",X"36",X"00",X"25",X"FD",X"36",X"02",X"4F",X"3C",X"FD",X"77",X"0C",X"FE",X"40",X"C0",X"FD", + X"36",X"09",X"06",X"FD",X"36",X"00",X"00",X"3A",X"56",X"4A",X"CB",X"27",X"CB",X"27",X"21",X"FB", + X"20",X"16",X"00",X"5F",X"19",X"3E",X"02",X"01",X"C0",X"00",X"F5",X"5E",X"23",X"56",X"23",X"1A", + X"FE",X"06",X"20",X"0C",X"E5",X"13",X"13",X"EB",X"5E",X"23",X"56",X"EB",X"09",X"4D",X"44",X"E1", + X"F1",X"3D",X"20",X"E6",X"FD",X"71",X"0B",X"FD",X"70",X"0C",X"C9",X"91",X"4A",X"C1",X"4A",X"61", + X"4A",X"C1",X"4A",X"61",X"4A",X"91",X"4A",X"CD",X"0D",X"21",X"C3",X"81",X"1F",X"FD",X"35",X"0C", + X"C0",X"FD",X"36",X"0C",X"08",X"FD",X"7E",X"00",X"3C",X"FD",X"77",X"00",X"FE",X"37",X"C0",X"FD", + X"36",X"00",X"00",X"FD",X"36",X"0C",X"00",X"FD",X"36",X"09",X"04",X"C9",X"3E",X"01",X"FD",X"BE", + X"09",X"28",X"06",X"21",X"A1",X"28",X"CD",X"AD",X"80",X"3A",X"01",X"48",X"CB",X"7F",X"CA",X"D7", + X"22",X"FD",X"7E",X"01",X"E6",X"0F",X"C2",X"85",X"21",X"FD",X"7E",X"03",X"E6",X"0F",X"FE",X"08", + X"C2",X"85",X"21",X"FD",X"7E",X"11",X"B7",X"CA",X"B6",X"22",X"3E",X"01",X"FD",X"BE",X"08",X"20", + X"12",X"3A",X"8A",X"4B",X"FD",X"BE",X"01",X"CA",X"B6",X"22",X"3A",X"8C",X"4B",X"FD",X"BE",X"03", + X"CA",X"B6",X"22",X"CD",X"8E",X"24",X"FD",X"7E",X"0A",X"CD",X"EB",X"3D",X"FD",X"A6",X"13",X"CA", + X"B6",X"22",X"C3",X"00",X"80",X"FD",X"7E",X"0A",X"CD",X"EB",X"3D",X"F5",X"CD",X"9A",X"24",X"CD", + X"5A",X"81",X"F1",X"A1",X"C2",X"00",X"80",X"CD",X"6E",X"24",X"C9",X"FD",X"7E",X"0B",X"B7",X"28", + X"06",X"FD",X"35",X"0B",X"C3",X"EF",X"1D",X"FD",X"36",X"09",X"00",X"21",X"9D",X"28",X"CD",X"64", + X"80",X"C3",X"EF",X"1D",X"FD",X"7E",X"12",X"B7",X"20",X"0E",X"FD",X"34",X"12",X"3E",X"01",X"FD", + X"77",X"04",X"CD",X"81",X"80",X"CD",X"91",X"80",X"21",X"A1",X"28",X"CD",X"AD",X"80",X"FD",X"7E", + X"01",X"E6",X"0F",X"20",X"5C",X"FD",X"7E",X"03",X"E6",X"0F",X"FE",X"08",X"20",X"53",X"CD",X"8E", + X"24",X"FD",X"7E",X"08",X"FE",X"02",X"28",X"5D",X"3E",X"0A",X"FD",X"CB",X"0A",X"46",X"28",X"02", + X"3E",X"05",X"FD",X"A6",X"13",X"28",X"2D",X"FD",X"77",X"13",X"FD",X"36",X"09",X"00",X"21",X"4A", + X"28",X"CD",X"70",X"80",X"3A",X"01",X"48",X"CB",X"7F",X"20",X"06",X"CD",X"D7",X"22",X"C3",X"02", + X"1E",X"3E",X"01",X"FD",X"BE",X"08",X"20",X"06",X"CD",X"14",X"23",X"C3",X"02",X"1E",X"CD",X"B9", + X"22",X"C3",X"02",X"1E",X"FD",X"7E",X"0A",X"EE",X"02",X"CD",X"EB",X"3D",X"FD",X"A6",X"13",X"28", + X"06",X"CD",X"00",X"80",X"C3",X"02",X"1E",X"FD",X"7E",X"0A",X"CD",X"EB",X"3D",X"FD",X"A6",X"13", + X"CA",X"02",X"1E",X"18",X"B5",X"21",X"AE",X"22",X"FD",X"7E",X"0A",X"CD",X"E1",X"3D",X"06",X"05", + X"0E",X"0F",X"FD",X"66",X"01",X"FD",X"6E",X"03",X"C5",X"D5",X"E5",X"CD",X"9E",X"0F",X"FE",X"FF", + X"28",X"09",X"47",X"E6",X"F0",X"28",X"06",X"FE",X"80",X"28",X"02",X"AF",X"47",X"78",X"E6",X"0F", + X"21",X"4E",X"81",X"16",X"00",X"5F",X"19",X"7E",X"E1",X"D1",X"C1",X"A1",X"4F",X"FD",X"CB",X"0A", + X"46",X"20",X"0B",X"7D",X"FE",X"18",X"28",X"18",X"FE",X"F8",X"28",X"14",X"18",X"09",X"7C",X"FE", + X"20",X"28",X"0D",X"FE",X"F0",X"28",X"09",X"C5",X"D5",X"C1",X"CD",X"83",X"3D",X"C1",X"10",X"B8", + X"FD",X"7E",X"0A",X"59",X"CD",X"EB",X"3D",X"A3",X"C2",X"FA",X"21",X"C3",X"E8",X"21",X"00",X"F0", + X"10",X"00",X"00",X"10",X"F0",X"00",X"CD",X"8E",X"24",X"3A",X"01",X"48",X"CB",X"7F",X"CA",X"D7", + X"22",X"3A",X"1D",X"4A",X"FE",X"01",X"CA",X"14",X"23",X"FD",X"7E",X"08",X"DF",X"14",X"23",X"DE", + X"23",X"53",X"24",X"8D",X"23",X"53",X"24",X"FD",X"7E",X"1C",X"B7",X"28",X"08",X"FD",X"35",X"1C", + X"28",X"03",X"C3",X"00",X"80",X"FD",X"6E",X"1A",X"FD",X"66",X"1B",X"23",X"23",X"FD",X"75",X"1A", + X"FD",X"74",X"1B",X"7E",X"E6",X"F0",X"28",X"13",X"FE",X"F0",X"28",X"03",X"C3",X"6E",X"24",X"23", + X"7E",X"FD",X"77",X"08",X"23",X"FD",X"75",X"1A",X"FD",X"74",X"1B",X"7E",X"23",X"46",X"FD",X"70", + X"1C",X"C3",X"61",X"23",X"CD",X"E9",X"80",X"1E",X"00",X"FD",X"CB",X"0A",X"46",X"20",X"02",X"1E", + X"01",X"CB",X"4F",X"28",X"04",X"7B",X"C6",X"02",X"5F",X"7B",X"CD",X"EB",X"3D",X"FD",X"A6",X"13", + X"20",X"1A",X"7B",X"EE",X"02",X"CD",X"EB",X"3D",X"FD",X"A6",X"13",X"20",X"0F",X"FD",X"7E",X"0A", + X"CD",X"EB",X"3D",X"FD",X"A6",X"13",X"20",X"04",X"CD",X"6E",X"24",X"C9",X"F5",X"CD",X"E9",X"80", + X"E6",X"0F",X"21",X"8D",X"28",X"16",X"00",X"5F",X"19",X"7E",X"FD",X"77",X"11",X"F1",X"CD",X"F7", + X"3D",X"FD",X"BE",X"0A",X"CA",X"00",X"80",X"FD",X"77",X"0B",X"21",X"60",X"28",X"FD",X"7E",X"0A", + X"CD",X"E1",X"3D",X"EB",X"FD",X"7E",X"0B",X"FD",X"77",X"0A",X"16",X"00",X"5F",X"19",X"7E",X"FD", + X"77",X"00",X"FD",X"36",X"09",X"01",X"FD",X"36",X"0B",X"08",X"C3",X"00",X"80",X"CD",X"59",X"24", + X"16",X"40",X"3A",X"22",X"4A",X"CB",X"47",X"20",X"20",X"CB",X"4F",X"20",X"08",X"7D",X"92",X"30", + X"0C",X"3E",X"18",X"30",X"08",X"7D",X"82",X"30",X"04",X"3E",X"F8",X"18",X"00",X"6F",X"7C",X"26", + X"D0",X"FE",X"80",X"38",X"02",X"26",X"40",X"18",X"1C",X"CB",X"4F",X"20",X"08",X"7C",X"82",X"30", + X"0A",X"3E",X"F0",X"18",X"06",X"7C",X"92",X"30",X"02",X"3E",X"20",X"67",X"7D",X"2E",X"40",X"FE", + X"80",X"30",X"02",X"2E",X"D0",X"FD",X"74",X"0F",X"FD",X"75",X"10",X"C3",X"C0",X"87",X"CD",X"59", + X"24",X"FD",X"7E",X"0A",X"CD",X"EB",X"3D",X"47",X"FD",X"CB",X"0A",X"46",X"20",X"24",X"FD",X"7E", + X"01",X"FD",X"BE",X"0F",X"20",X"07",X"78",X"FD",X"A6",X"13",X"C2",X"4C",X"23",X"06",X"02",X"FD", + X"7E",X"01",X"FD",X"BE",X"0F",X"38",X"02",X"06",X"08",X"78",X"FD",X"A6",X"13",X"C2",X"4C",X"23", + X"18",X"22",X"FD",X"7E",X"03",X"FD",X"BE",X"10",X"20",X"07",X"78",X"FD",X"A6",X"13",X"C2",X"4C", + X"23",X"06",X"01",X"FD",X"7E",X"03",X"FD",X"BE",X"10",X"30",X"02",X"06",X"04",X"78",X"FD",X"A6", + X"13",X"C2",X"4C",X"23",X"78",X"CD",X"F7",X"3D",X"EE",X"02",X"CD",X"EB",X"3D",X"FD",X"A6",X"13", + X"C2",X"4C",X"23",X"FD",X"7E",X"0A",X"CD",X"EB",X"3D",X"FD",X"A6",X"13",X"C2",X"4C",X"23",X"CD", + X"6E",X"24",X"C9",X"CD",X"59",X"24",X"C3",X"C0",X"87",X"3A",X"35",X"4A",X"E6",X"F0",X"FD",X"77", + X"0F",X"67",X"3A",X"37",X"4A",X"E6",X"F0",X"C6",X"08",X"FD",X"77",X"10",X"6F",X"C9",X"FD",X"7E", + X"09",X"FE",X"01",X"20",X"06",X"21",X"9D",X"28",X"CD",X"64",X"80",X"FD",X"36",X"09",X"02",X"FD", + X"36",X"12",X"00",X"C9",X"3A",X"E7",X"49",X"FE",X"0C",X"D8",X"D6",X"0C",X"18",X"F9",X"3E",X"0F", + X"F5",X"CD",X"FD",X"80",X"F1",X"A1",X"FD",X"77",X"13",X"C9",X"3A",X"56",X"4A",X"21",X"78",X"28", + X"CD",X"E1",X"3D",X"EB",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"02",X"10",X"01",X"20",X"04",X"40",X"F0",X"00",X"04",X"10",X"01",X"10",X"04",X"10",X"08",X"18", + X"F1",X"00",X"01",X"28",X"02",X"40",X"F0",X"00",X"02",X"10",X"08",X"60",X"04",X"40",X"08",X"40", + X"04",X"50",X"01",X"08",X"F1",X"00",X"01",X"28",X"02",X"30",X"F0",X"00",X"01",X"30",X"01",X"40", + X"04",X"50",X"08",X"10",X"F0",X"00",X"02",X"10",X"01",X"20",X"02",X"30",X"F0",X"00",X"08",X"10", + X"04",X"90",X"08",X"10",X"02",X"10",X"08",X"10",X"02",X"10",X"08",X"40",X"02",X"20",X"01",X"50", + X"02",X"60",X"08",X"10",X"02",X"10",X"01",X"20",X"72",X"73",X"A7",X"A8",X"32",X"33",X"27",X"28", + X"00",X"FC",X"04",X"00",X"00",X"04",X"FC",X"00",X"5A",X"5A",X"5A",X"5A",X"5A",X"5A",X"5A",X"5A", + X"5A",X"5A",X"00",X"FF",X"01",X"00",X"00",X"01",X"FF",X"00",X"00",X"FE",X"02",X"00",X"00",X"02", + X"FE",X"00",X"01",X"02",X"03",X"04",X"00",X"01",X"0B",X"15",X"00",X"00",X"19",X"00",X"00",X"15", + X"00",X"00",X"19",X"00",X"00",X"00",X"00",X"6E",X"25",X"80",X"25",X"00",X"77",X"25",X"BD",X"25", + X"00",X"6E",X"25",X"FA",X"25",X"00",X"77",X"25",X"1F",X"26",X"00",X"00",X"44",X"26",X"3B",X"BC", + X"BD",X"FC",X"7B",X"7C",X"3D",X"3C",X"00",X"3B",X"3C",X"3D",X"7C",X"7B",X"FC",X"BD",X"BC",X"00", + X"FF",X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FE", + X"FF",X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"01",X"FF",X"01",X"FF",X"01",X"FF",X"01",X"FF",X"01", + X"00",X"01",X"FF",X"01",X"00",X"01",X"FF",X"01",X"00",X"01",X"00",X"01",X"80",X"01",X"FE",X"01", + X"FE",X"01",X"FE",X"01",X"FE",X"01",X"FE",X"01",X"FE",X"01",X"FE",X"01",X"FE",X"01",X"FE",X"01", + X"FE",X"01",X"FE",X"01",X"FE",X"01",X"FF",X"01",X"FF",X"01",X"FF",X"01",X"00",X"01",X"00",X"01", + X"00",X"01",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"01",X"01", + X"01",X"00",X"01",X"01",X"01",X"00",X"01",X"00",X"01",X"80",X"FE",X"FF",X"FE",X"FF",X"FE",X"FF", + X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FE",X"FF",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"01",X"FF",X"01",X"FF",X"01",X"FF",X"01",X"FF",X"01",X"FF",X"01",X"FF",X"01",X"80",X"02", + X"FF",X"02",X"FF",X"02",X"FF",X"02",X"FF",X"02",X"FF",X"02",X"FF",X"02",X"FF",X"01",X"00",X"01", + X"00",X"01",X"00",X"01",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"01",X"01",X"01",X"80",X"39",X"06",X"38",X"06",X"37",X"06",X"38",X"06",X"39",X"06",X"38",X"06", + X"37",X"06",X"38",X"06",X"39",X"06",X"38",X"06",X"00",X"00",X"08",X"F8",X"00",X"00",X"F8",X"08", + X"00",X"00",X"F0",X"10",X"00",X"00",X"10",X"F0",X"00",X"00",X"00",X"22",X"22",X"55",X"55",X"D6", + X"D6",X"EE",X"EE",X"FE",X"FE",X"FF",X"FF",X"80",X"80",X"88",X"88",X"AA",X"AA",X"41",X"43",X"85", + X"87",X"01",X"03",X"05",X"07",X"00",X"F8",X"10",X"08",X"00",X"18",X"00",X"08",X"95",X"26",X"99", + X"26",X"95",X"26",X"99",X"26",X"F8",X"00",X"08",X"00",X"00",X"F8",X"00",X"08",X"00",X"03",X"01", + X"02",X"04",X"AA",X"26",X"B6",X"26",X"C2",X"26",X"CE",X"26",X"00",X"00",X"00",X"C9",X"E3",X"00", + X"01",X"1D",X"00",X"49",X"63",X"00",X"8B",X"A4",X"00",X"00",X"00",X"00",X"CB",X"E4",X"00",X"05", + X"1E",X"00",X"41",X"5D",X"00",X"89",X"A3",X"00",X"00",X"00",X"00",X"09",X"23",X"00",X"0B",X"24", + X"00",X"85",X"9E",X"00",X"4B",X"64",X"00",X"00",X"00",X"00",X"E2",X"26",X"E8",X"26",X"EE",X"26", + X"F4",X"26",X"00",X"F8",X"00",X"08",X"00",X"F0",X"08",X"00",X"F8",X"00",X"10",X"00",X"00",X"08", + X"00",X"F8",X"00",X"10",X"F8",X"00",X"08",X"00",X"F0",X"00",X"41",X"5D",X"71",X"85",X"9E",X"A6", + X"01",X"1D",X"31",X"05",X"1E",X"26",X"0A",X"27",X"16",X"27",X"4F",X"60",X"00",X"93",X"A2",X"00", + X"0F",X"20",X"00",X"13",X"22",X"00",X"4D",X"5F",X"00",X"91",X"A1",X"00",X"0D",X"1F",X"00",X"11", + X"21",X"00",X"05",X"78",X"9F",X"98",X"06",X"88",X"9F",X"98",X"00",X"00",X"02",X"02",X"AA",X"AA", + X"03",X"04",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"1E",X"80",X"9E",X"98",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"04",X"03",X"02",X"03",X"01",X"02",X"01",X"02",X"01",X"03",X"01",X"01",X"B0",X"00",X"80",X"00", + X"40",X"00",X"60",X"00",X"20",X"00",X"20",X"00",X"40",X"00",X"40",X"00",X"20",X"00",X"40",X"00", + X"30",X"00",X"30",X"00",X"88",X"27",X"8E",X"27",X"DE",X"27",X"F0",X"00",X"01",X"10",X"00",X"FF", + X"01",X"10",X"02",X"10",X"03",X"40",X"00",X"10",X"03",X"10",X"02",X"10",X"E0",X"00",X"01",X"10", + X"02",X"10",X"F0",X"02",X"01",X"40",X"02",X"30",X"03",X"10",X"00",X"10",X"03",X"40",X"02",X"20", + X"03",X"10",X"02",X"10",X"03",X"10",X"02",X"20",X"01",X"10",X"02",X"10",X"01",X"10",X"00",X"10", + X"01",X"40",X"00",X"20",X"03",X"30",X"02",X"10",X"01",X"30",X"00",X"10",X"01",X"10",X"00",X"60", + X"03",X"40",X"F0",X"00",X"02",X"10",X"01",X"40",X"02",X"90",X"03",X"20",X"00",X"10",X"01",X"30", + X"F0",X"00",X"01",X"10",X"00",X"60",X"03",X"40",X"02",X"10",X"03",X"60",X"02",X"10",X"03",X"20", + X"02",X"30",X"03",X"10",X"02",X"10",X"01",X"70",X"00",X"10",X"03",X"10",X"E0",X"00",X"02",X"10", + X"03",X"30",X"00",X"70",X"01",X"40",X"02",X"10",X"01",X"30",X"02",X"20",X"01",X"10",X"02",X"20", + X"03",X"20",X"1A",X"28",X"23",X"28",X"2C",X"28",X"35",X"28",X"EC",X"AD",X"AC",X"2A",X"2C",X"2D", + X"6C",X"6A",X"00",X"AC",X"2A",X"2C",X"2D",X"6C",X"6A",X"EC",X"AD",X"00",X"2C",X"2D",X"6C",X"6A", + X"EC",X"AD",X"AC",X"2A",X"00",X"6C",X"6A",X"EC",X"AD",X"AC",X"2A",X"2C",X"2D",X"00",X"02",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"06",X"06",X"06",X"06",X"06",X"06", + X"06",X"06",X"06",X"06",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00", + X"68",X"28",X"6C",X"28",X"70",X"28",X"74",X"28",X"00",X"EC",X"2A",X"6C",X"EC",X"00",X"AC",X"2D", + X"6A",X"AC",X"00",X"2C",X"6C",X"AD",X"2C",X"00",X"7E",X"28",X"83",X"28",X"88",X"28",X"02",X"88", + X"4A",X"B8",X"4A",X"02",X"58",X"4A",X"B8",X"4A",X"02",X"58",X"4A",X"88",X"4A",X"10",X"20",X"30", + X"10",X"50",X"40",X"10",X"30",X"20",X"10",X"40",X"50",X"10",X"20",X"10",X"30",X"6A",X"AD",X"2A", + X"2D",X"6A",X"6B",X"AD",X"AE",X"2A",X"2B",X"2D",X"2E",X"AD",X"28",X"B2",X"28",X"02",X"B9",X"28", + X"C6",X"28",X"03",X"D3",X"28",X"E0",X"28",X"ED",X"28",X"AD",X"E0",X"5B",X"B8",X"06",X"06",X"FF", + X"FF",X"02",X"06",X"01",X"3C",X"00",X"AD",X"A0",X"5C",X"18",X"06",X"06",X"FF",X"FF",X"03",X"06", + X"01",X"B4",X"00",X"6A",X"F0",X"5B",X"F8",X"06",X"06",X"FF",X"FF",X"03",X"06",X"00",X"3C",X"00", + X"AD",X"A0",X"5C",X"18",X"06",X"06",X"FF",X"FF",X"01",X"06",X"01",X"B4",X"00",X"AD",X"20",X"5D", + X"F8",X"06",X"06",X"FF",X"FF",X"02",X"06",X"01",X"2D",X"01",X"12",X"29",X"17",X"29",X"1E",X"29", + X"25",X"29",X"2C",X"29",X"33",X"29",X"3A",X"29",X"41",X"29",X"48",X"29",X"4F",X"29",X"56",X"29", + X"5D",X"29",X"02",X"64",X"29",X"75",X"29",X"03",X"86",X"29",X"9B",X"29",X"AE",X"29",X"03",X"C1", + X"29",X"D2",X"29",X"E3",X"29",X"03",X"F6",X"29",X"0D",X"2A",X"1E",X"2A",X"03",X"2F",X"2A",X"46", + X"2A",X"57",X"2A",X"03",X"68",X"2A",X"7F",X"2A",X"90",X"2A",X"03",X"A1",X"2A",X"B8",X"2A",X"C9", + X"2A",X"03",X"DA",X"2A",X"F1",X"2A",X"02",X"2B",X"03",X"13",X"2B",X"2A",X"2B",X"3B",X"2B",X"03", + X"4C",X"2B",X"65",X"2B",X"78",X"2B",X"03",X"8F",X"2B",X"A6",X"2B",X"BD",X"2B",X"03",X"D4",X"2B", + X"ED",X"2B",X"04",X"2C",X"00",X"01",X"0A",X"02",X"14",X"02",X"1E",X"01",X"28",X"02",X"32",X"03", + X"37",X"02",X"46",X"02",X"FF",X"00",X"03",X"0A",X"01",X"14",X"00",X"1E",X"01",X"28",X"03",X"32", + X"00",X"3C",X"01",X"46",X"01",X"FF",X"00",X"03",X"0A",X"02",X"14",X"03",X"1E",X"00",X"28",X"02", + X"30",X"01",X"32",X"01",X"3C",X"03",X"46",X"01",X"50",X"01",X"FF",X"00",X"00",X"0A",X"01",X"14", + X"00",X"1E",X"02",X"28",X"01",X"30",X"02",X"3C",X"03",X"46",X"02",X"50",X"02",X"FF",X"00",X"02", + X"0A",X"03",X"14",X"01",X"1E",X"01",X"28",X"03",X"32",X"01",X"3C",X"00",X"46",X"01",X"50",X"01", + X"FF",X"00",X"01",X"0A",X"02",X"14",X"00",X"1E",X"01",X"32",X"03",X"3C",X"01",X"32",X"03",X"32", + X"03",X"FF",X"00",X"02",X"14",X"03",X"1E",X"02",X"28",X"01",X"32",X"02",X"3C",X"03",X"46",X"02", + X"50",X"02",X"FF",X"00",X"00",X"0A",X"01",X"14",X"01",X"1E",X"00",X"28",X"02",X"32",X"01",X"3C", + X"00",X"41",X"01",X"50",X"01",X"FF",X"00",X"00",X"08",X"01",X"0A",X"02",X"14",X"03",X"1E",X"02", + X"28",X"00",X"32",X"01",X"3C",X"02",X"46",X"01",X"50",X"02",X"5A",X"02",X"FF",X"00",X"01",X"0A", + X"01",X"1E",X"03",X"28",X"02",X"3C",X"01",X"46",X"01",X"50",X"03",X"5A",X"01",X"FF",X"00",X"02", + X"0A",X"03",X"14",X"02",X"28",X"01",X"32",X"03",X"3C",X"01",X"4B",X"00",X"50",X"01",X"FF",X"00", + X"01",X"08",X"01",X"0A",X"02",X"14",X"03",X"1E",X"02",X"28",X"00",X"32",X"01",X"3C",X"02",X"46", + X"02",X"50",X"03",X"5A",X"02",X"FF",X"00",X"01",X"0A",X"01",X"1E",X"03",X"28",X"02",X"3C",X"01", + X"46",X"01",X"55",X"00",X"5A",X"01",X"FF",X"00",X"02",X"0A",X"03",X"14",X"02",X"28",X"00",X"32", + X"01",X"3C",X"03",X"46",X"01",X"50",X"01",X"FF",X"00",X"01",X"08",X"01",X"0A",X"02",X"14",X"03", + X"1E",X"02",X"28",X"00",X"32",X"01",X"3C",X"02",X"46",X"02",X"50",X"03",X"5A",X"02",X"FF",X"00", + X"01",X"0A",X"01",X"1E",X"04",X"28",X"02",X"3C",X"01",X"46",X"01",X"50",X"02",X"5A",X"01",X"FF", + X"00",X"02",X"0A",X"03",X"14",X"02",X"28",X"00",X"32",X"01",X"3C",X"01",X"46",X"04",X"50",X"01", + X"FF",X"00",X"04",X"08",X"04",X"0A",X"02",X"14",X"04",X"1E",X"02",X"28",X"00",X"32",X"01",X"3C", + X"02",X"46",X"02",X"50",X"01",X"5A",X"02",X"FF",X"00",X"01",X"0A",X"01",X"1E",X"03",X"28",X"02", + X"3C",X"01",X"46",X"01",X"50",X"02",X"5A",X"01",X"FF",X"00",X"02",X"0A",X"03",X"14",X"02",X"28", + X"04",X"32",X"01",X"3C",X"01",X"46",X"01",X"50",X"04",X"FF",X"00",X"04",X"08",X"01",X"0A",X"02", + X"14",X"03",X"1E",X"02",X"28",X"04",X"32",X"01",X"3C",X"02",X"46",X"02",X"50",X"01",X"5A",X"02", + X"FF",X"00",X"01",X"0A",X"01",X"1E",X"03",X"28",X"02",X"3C",X"01",X"46",X"01",X"50",X"02",X"5A", + X"01",X"FF",X"00",X"02",X"0A",X"03",X"14",X"02",X"28",X"00",X"32",X"01",X"3C",X"01",X"46",X"01", + X"50",X"04",X"FF",X"00",X"04",X"08",X"04",X"0A",X"02",X"14",X"03",X"1E",X"02",X"28",X"00",X"32", + X"01",X"3C",X"02",X"46",X"02",X"50",X"01",X"5A",X"02",X"FF",X"00",X"01",X"0A",X"01",X"1E",X"04", + X"28",X"02",X"3C",X"01",X"46",X"01",X"50",X"02",X"5A",X"01",X"FF",X"00",X"02",X"0A",X"03",X"14", + X"02",X"28",X"00",X"32",X"04",X"3C",X"01",X"46",X"01",X"50",X"04",X"FF",X"00",X"04",X"08",X"04", + X"0A",X"02",X"14",X"03",X"1E",X"02",X"28",X"00",X"2D",X"04",X"32",X"01",X"3C",X"02",X"46",X"02", + X"50",X"01",X"5A",X"02",X"FF",X"00",X"04",X"0A",X"01",X"1E",X"04",X"23",X"00",X"28",X"02",X"3C", + X"01",X"46",X"01",X"50",X"02",X"5A",X"01",X"FF",X"00",X"02",X"0A",X"03",X"14",X"02",X"1E",X"00", + X"23",X"04",X"28",X"04",X"2D",X"00",X"32",X"04",X"3C",X"01",X"46",X"01",X"50",X"04",X"FF",X"00", + X"04",X"08",X"04",X"0A",X"02",X"14",X"03",X"1E",X"02",X"28",X"00",X"32",X"01",X"3C",X"02",X"46", + X"02",X"50",X"01",X"5A",X"02",X"FF",X"00",X"01",X"0A",X"01",X"14",X"00",X"19",X"04",X"1E",X"04", + X"23",X"00",X"28",X"02",X"3C",X"01",X"46",X"01",X"50",X"02",X"5A",X"01",X"FF",X"00",X"02",X"0A", + X"03",X"14",X"02",X"1E",X"00",X"23",X"00",X"28",X"04",X"32",X"04",X"37",X"00",X"3C",X"01",X"46", + X"01",X"50",X"04",X"FF",X"00",X"04",X"08",X"04",X"0A",X"02",X"14",X"03",X"1E",X"02",X"28",X"00", + X"32",X"01",X"3C",X"02",X"41",X"00",X"46",X"02",X"50",X"01",X"5A",X"02",X"FF",X"00",X"01",X"0A", + X"01",X"0F",X"00",X"14",X"04",X"1E",X"04",X"23",X"00",X"28",X"02",X"3C",X"01",X"46",X"01",X"50", + X"02",X"5A",X"01",X"FF",X"00",X"02",X"0A",X"03",X"14",X"02",X"28",X"00",X"32",X"04",X"3C",X"01", + X"41",X"00",X"46",X"01",X"50",X"04",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"08",X"28",X"08",X"47",X"3A",X"01",X"48",X"CB",X"7F",X"C8",X"78",X"DD",X"E5",X"FD",X"E5", + X"CD",X"EE",X"2C",X"CD",X"D9",X"2C",X"DD",X"7E",X"00",X"E6",X"0F",X"D5",X"CD",X"C9",X"2C",X"D1", + X"C5",X"E5",X"06",X"10",X"CD",X"58",X"2D",X"E1",X"C1",X"E5",X"23",X"DD",X"7E",X"01",X"83",X"77", + X"23",X"DD",X"7E",X"02",X"82",X"77",X"23",X"FD",X"E5",X"E5",X"FD",X"E1",X"DD",X"7E",X"03",X"77", + X"FD",X"77",X"03",X"23",X"DD",X"7E",X"04",X"77",X"FD",X"77",X"04",X"FD",X"E1",X"23",X"3E",X"01", + X"77",X"E1",X"DD",X"7E",X"00",X"E6",X"40",X"F6",X"80",X"77",X"DD",X"CB",X"00",X"7E",X"20",X"09", + X"C5",X"01",X"05",X"00",X"DD",X"09",X"C1",X"18",X"AD",X"FD",X"E1",X"DD",X"E1",X"C9",X"DD",X"E5", + X"FD",X"E5",X"CD",X"EE",X"2C",X"CD",X"D9",X"2C",X"DD",X"7E",X"00",X"E6",X"0F",X"47",X"CB",X"20", + X"CD",X"C9",X"2C",X"CB",X"66",X"C4",X"91",X"2E",X"C5",X"06",X"10",X"CD",X"58",X"2D",X"C1",X"11", + X"00",X"80",X"CD",X"D7",X"2F",X"16",X"8F",X"CD",X"E2",X"2F",X"DD",X"CB",X"00",X"7E",X"20",X"C9", + X"C5",X"01",X"05",X"00",X"DD",X"09",X"C1",X"18",X"CF",X"21",X"D6",X"2C",X"5F",X"16",X"00",X"19", + X"5E",X"FD",X"E5",X"E1",X"19",X"C9",X"00",X"10",X"20",X"21",X"00",X"4C",X"B7",X"28",X"0B",X"D5", + X"C5",X"11",X"30",X"00",X"47",X"19",X"10",X"FD",X"C1",X"D1",X"E5",X"FD",X"E1",X"C9",X"87",X"87", + X"4F",X"06",X"00",X"DD",X"21",X"12",X"31",X"DD",X"09",X"DD",X"7E",X"00",X"DD",X"4E",X"01",X"DD", + X"6E",X"02",X"DD",X"66",X"03",X"E5",X"DD",X"E1",X"C9",X"06",X"02",X"3E",X"00",X"C5",X"F5",X"CD", + X"18",X"2D",X"F1",X"C1",X"3C",X"10",X"F6",X"C9",X"F5",X"CD",X"D9",X"2C",X"06",X"30",X"CD",X"58", + X"2D",X"F1",X"CD",X"4D",X"2D",X"2E",X"03",X"06",X"00",X"16",X"8F",X"CD",X"E2",X"2F",X"11",X"00", + X"80",X"CD",X"D7",X"2F",X"04",X"04",X"2D",X"20",X"F0",X"06",X"06",X"CD",X"DF",X"2F",X"2E",X"04", + X"06",X"00",X"16",X"8F",X"CD",X"E2",X"2F",X"04",X"04",X"2D",X"20",X"F8",X"C9",X"21",X"10",X"31", + X"D5",X"5F",X"16",X"00",X"19",X"D1",X"4E",X"C9",X"36",X"00",X"23",X"10",X"FB",X"C9",X"06",X"02", + X"3E",X"00",X"FD",X"21",X"00",X"4C",X"F5",X"C5",X"CD",X"4D",X"2D",X"06",X"00",X"FD",X"CB",X"00", + X"7E",X"C5",X"C4",X"88",X"2D",X"C1",X"11",X"10",X"00",X"FD",X"19",X"04",X"04",X"78",X"FE",X"06", + X"20",X"EB",X"C1",X"F1",X"3C",X"10",X"DF",X"C9",X"FD",X"CB",X"00",X"6E",X"C2",X"2E",X"2F",X"FD", + X"CB",X"00",X"5E",X"C2",X"3F",X"2F",X"FD",X"35",X"05",X"C0",X"FD",X"7E",X"02",X"FD",X"77",X"05", + X"FD",X"CB",X"00",X"4E",X"28",X"08",X"FD",X"35",X"0D",X"C0",X"FD",X"CB",X"00",X"8E",X"FD",X"CB", + X"00",X"46",X"28",X"0E",X"FD",X"35",X"0D",X"C0",X"FD",X"56",X"0F",X"CD",X"E2",X"2F",X"FD",X"CB", + X"00",X"86",X"FD",X"6E",X"06",X"FD",X"66",X"07",X"7E",X"23",X"FD",X"75",X"06",X"FD",X"74",X"07", + X"CB",X"7F",X"20",X"29",X"C5",X"47",X"E6",X"0F",X"87",X"4F",X"78",X"0F",X"0F",X"0F",X"0F",X"E6", + X"07",X"FD",X"86",X"01",X"6F",X"26",X"00",X"29",X"29",X"29",X"E5",X"D1",X"19",X"19",X"11",X"F6", + X"2F",X"06",X"00",X"19",X"09",X"C1",X"56",X"23",X"5E",X"CD",X"D7",X"2F",X"C9",X"F5",X"E6",X"8F", + X"57",X"F1",X"D5",X"07",X"07",X"07",X"07",X"E6",X"07",X"21",X"18",X"2E",X"16",X"00",X"CB",X"27", + X"5F",X"19",X"5E",X"23",X"56",X"EB",X"D1",X"E9",X"28",X"2E",X"3C",X"2E",X"50",X"2E",X"59",X"2E", + X"64",X"2E",X"A0",X"2E",X"B6",X"2E",X"A3",X"2F",X"7A",X"E6",X"07",X"CB",X"62",X"28",X"02",X"ED", + X"44",X"57",X"FD",X"7E",X"02",X"82",X"FD",X"77",X"02",X"C3",X"C2",X"2D",X"7A",X"E6",X"07",X"CB", + X"62",X"28",X"02",X"ED",X"44",X"57",X"FD",X"7E",X"01",X"82",X"FD",X"77",X"01",X"C3",X"C2",X"2D", + X"FD",X"72",X"0F",X"CD",X"E2",X"2F",X"C3",X"C2",X"2D",X"7A",X"E6",X"0F",X"FD",X"77",X"0D",X"FD", + X"CB",X"00",X"CE",X"C9",X"7A",X"FE",X"8F",X"28",X"1E",X"FD",X"CB",X"00",X"E6",X"C5",X"06",X"06", + X"CD",X"E2",X"2F",X"FD",X"6E",X"06",X"FD",X"66",X"07",X"7E",X"57",X"23",X"FD",X"75",X"06",X"FD", + X"74",X"07",X"CD",X"DF",X"2F",X"C1",X"C9",X"FD",X"CB",X"00",X"A6",X"CD",X"91",X"2E",X"C3",X"C2", + X"2D",X"C5",X"06",X"06",X"16",X"8F",X"CD",X"E2",X"2F",X"16",X"80",X"CD",X"DF",X"2F",X"C1",X"C9", + X"7A",X"E6",X"0F",X"FD",X"77",X"0D",X"FD",X"CB",X"00",X"C6",X"16",X"8F",X"CD",X"E2",X"2F",X"11", + X"00",X"80",X"CD",X"D7",X"2F",X"C9",X"FD",X"6E",X"06",X"FD",X"66",X"07",X"2B",X"7E",X"FE",X"E0", + X"28",X"3C",X"7A",X"E6",X"0F",X"21",X"B8",X"30",X"3D",X"87",X"5F",X"16",X"00",X"19",X"5E",X"23", + X"56",X"EB",X"FD",X"7E",X"02",X"FD",X"77",X"0D",X"FD",X"77",X"0E",X"FD",X"75",X"0B",X"FD",X"74", + X"0C",X"FD",X"6E",X"06",X"FD",X"66",X"07",X"7E",X"23",X"FD",X"75",X"06",X"FD",X"74",X"07",X"FD", + X"CB",X"00",X"EE",X"CD",X"D4",X"2D",X"FD",X"6E",X"0B",X"FD",X"66",X"0C",X"18",X"71",X"23",X"7E", + X"FD",X"77",X"0D",X"FD",X"77",X"0E",X"23",X"FD",X"75",X"09",X"FD",X"74",X"0A",X"FD",X"75",X"0B", + X"FD",X"74",X"0C",X"5F",X"16",X"00",X"19",X"7E",X"23",X"FD",X"CB",X"00",X"DE",X"FD",X"75",X"06", + X"FD",X"74",X"07",X"CD",X"D4",X"2D",X"FD",X"6E",X"0B",X"FD",X"66",X"0C",X"18",X"41",X"FD",X"35", + X"05",X"C0",X"FD",X"35",X"0E",X"FD",X"6E",X"0B",X"FD",X"66",X"0C",X"20",X"32",X"18",X"53",X"FD", + X"35",X"05",X"C8",X"FD",X"35",X"0E",X"FD",X"6E",X"0B",X"FD",X"66",X"0C",X"20",X"21",X"FD",X"7E", + X"0D",X"FD",X"77",X"0E",X"FD",X"6E",X"06",X"FD",X"66",X"07",X"7E",X"23",X"FD",X"75",X"06",X"FD", + X"74",X"07",X"FE",X"E0",X"28",X"2C",X"CD",X"D4",X"2D",X"FD",X"6E",X"09",X"FD",X"66",X"0A",X"7E", + X"F5",X"23",X"FD",X"75",X"0B",X"FD",X"74",X"0C",X"07",X"07",X"07",X"07",X"E6",X"0F",X"FD",X"77", + X"05",X"FD",X"7E",X"0F",X"E6",X"0F",X"57",X"F1",X"E6",X"0F",X"82",X"F6",X"80",X"57",X"CD",X"E2", + X"2F",X"C9",X"FD",X"CB",X"00",X"9E",X"FD",X"CB",X"00",X"AE",X"FD",X"7E",X"02",X"FD",X"77",X"05", + X"C3",X"C2",X"2D",X"FD",X"CB",X"00",X"BE",X"FD",X"CB",X"00",X"66",X"FD",X"CB",X"00",X"A6",X"C4", + X"91",X"2E",X"16",X"8F",X"CD",X"E2",X"2F",X"11",X"00",X"80",X"CD",X"D7",X"2F",X"FD",X"CB",X"00", + X"76",X"C8",X"FD",X"36",X"00",X"C0",X"FD",X"6E",X"03",X"FD",X"66",X"04",X"FD",X"75",X"06",X"FD", + X"74",X"07",X"FD",X"36",X"05",X"01",X"C9",X"CD",X"E9",X"2F",X"7B",X"CD",X"F3",X"2F",X"C9",X"57", + X"18",X"07",X"C5",X"04",X"CD",X"E9",X"2F",X"C1",X"C9",X"78",X"07",X"07",X"07",X"07",X"B2",X"CD", + X"F3",X"2F",X"C9",X"ED",X"79",X"C9",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"3F",X"8F",X"3B",X"89",X"38",X"86",X"35",X"86",X"32",X"8A",X"2F",X"8E",X"2C",X"86",X"2A", + X"80",X"28",X"8C",X"25",X"8A",X"23",X"8A",X"21",X"8C",X"1F",X"8F",X"1D",X"84",X"1C",X"8B",X"1A", + X"83",X"19",X"8D",X"17",X"87",X"16",X"83",X"15",X"80",X"14",X"8E",X"12",X"8D",X"11",X"8D",X"10", + X"8E",X"0F",X"80",X"0F",X"82",X"0E",X"86",X"0D",X"8A",X"0C",X"8E",X"0B",X"84",X"0B",X"8A",X"0A", + X"80",X"0A",X"87",X"09",X"8F",X"08",X"87",X"08",X"8F",X"07",X"88",X"07",X"81",X"07",X"8B",X"06", + X"85",X"06",X"8F",X"05",X"8A",X"05",X"85",X"05",X"80",X"05",X"8B",X"04",X"87",X"04",X"83",X"04", + X"8F",X"03",X"8C",X"03",X"89",X"03",X"86",X"03",X"83",X"03",X"80",X"03",X"8D",X"02",X"8B",X"02", + X"88",X"02",X"86",X"02",X"83",X"02",X"82",X"02",X"8F",X"01",X"8E",X"01",X"8C",X"01",X"8B",X"01", + X"8A",X"01",X"88",X"01",X"87",X"01",X"86",X"01",X"84",X"01",X"82",X"01",X"81",X"01",X"80",X"01", + X"8F",X"00",X"8E",X"00",X"8D",X"00",X"FF",X"FF",X"C8",X"30",X"D1",X"30",X"DA",X"30",X"E3",X"30", + X"EC",X"30",X"F5",X"30",X"FE",X"30",X"07",X"31",X"80",X"82",X"80",X"82",X"80",X"82",X"80",X"82", + X"80",X"40",X"42",X"40",X"42",X"40",X"42",X"40",X"42",X"40",X"20",X"22",X"20",X"22",X"20",X"22", + X"20",X"22",X"20",X"10",X"12",X"10",X"12",X"10",X"12",X"10",X"12",X"10",X"80",X"81",X"82",X"83", + X"84",X"85",X"86",X"87",X"88",X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"48",X"20",X"21", + X"22",X"23",X"24",X"25",X"26",X"27",X"28",X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17",X"18", + X"01",X"02",X"01",X"02",X"5A",X"31",X"00",X"01",X"79",X"32",X"00",X"01",X"A5",X"32",X"00",X"01", + X"D1",X"32",X"01",X"02",X"FD",X"32",X"00",X"01",X"0D",X"33",X"00",X"01",X"1E",X"33",X"01",X"02", + X"3A",X"33",X"00",X"01",X"71",X"33",X"00",X"01",X"8B",X"33",X"00",X"01",X"AF",X"33",X"00",X"01", + X"E0",X"33",X"01",X"02",X"27",X"34",X"00",X"01",X"4B",X"34",X"00",X"01",X"8D",X"34",X"00",X"01", + X"A7",X"34",X"01",X"02",X"EE",X"34",X"00",X"01",X"01",X"35",X"40",X"00",X"05",X"64",X"31",X"C1", + X"00",X"05",X"EF",X"31",X"A7",X"D4",X"E3",X"34",X"E3",X"2B",X"E3",X"32",X"E3",X"33",X"D2",X"E3", + X"34",X"D2",X"E3",X"37",X"E3",X"39",X"E3",X"32",X"E3",X"37",X"E3",X"39",X"D4",X"D4",X"E1",X"44", + X"E3",X"42",X"E3",X"44",X"E2",X"42",X"E3",X"3B",X"E3",X"42",X"E3",X"3A",X"E4",X"39",X"E4",X"37", + X"E3",X"34",X"E3",X"32",X"D4",X"E3",X"39",X"E3",X"34",X"E3",X"37",X"E3",X"38",X"D2",X"E3",X"39", + X"D2",X"E3",X"3B",X"E3",X"42",X"E3",X"3B",X"E3",X"42",X"E3",X"43",X"D4",X"D4",X"E1",X"44",X"E3", + X"42",X"E3",X"44",X"E2",X"42",X"E3",X"3B",X"E3",X"42",X"E3",X"3A",X"E4",X"39",X"E4",X"37",X"E3", + X"34",X"E3",X"32",X"D4",X"E2",X"42",X"D2",X"E3",X"3B",X"D4",X"E2",X"39",X"D2",X"E3",X"37",X"D2", + X"E3",X"2B",X"E3",X"32",X"E3",X"33",X"E2",X"34",X"E1",X"44",X"E3",X"42",X"E3",X"44",X"E2",X"42", + X"E3",X"3B",X"E3",X"42",X"E3",X"3A",X"E4",X"39",X"E4",X"37",X"E3",X"34",X"E3",X"32",X"FF",X"A6", + X"E6",X"24",X"E7",X"24",X"E7",X"1B",X"D2",X"E7",X"1B",X"E6",X"22",X"E6",X"24",X"E7",X"24",X"E7", + X"1B",X"D2",X"E7",X"1B",X"E6",X"22",X"E6",X"24",X"E7",X"24",X"E7",X"1B",X"D2",X"E7",X"1B",X"E6", + X"22",X"E6",X"24",X"E7",X"24",X"E7",X"1B",X"D2",X"E7",X"1B",X"E6",X"22",X"E6",X"29",X"E7",X"29", + X"E7",X"24",X"D2",X"E7",X"24",X"E6",X"27",X"E6",X"29",X"E7",X"29",X"E7",X"24",X"D2",X"E7",X"24", + X"E6",X"27",X"E6",X"24",X"E7",X"24",X"E7",X"1B",X"D2",X"E7",X"1B",X"E6",X"22",X"E6",X"24",X"E7", + X"24",X"E7",X"1B",X"D2",X"E7",X"1B",X"E6",X"22",X"E6",X"2B",X"E7",X"2B",X"E7",X"26",X"D2",X"E7", + X"26",X"E7",X"2B",X"E7",X"2A",X"E6",X"29",X"E7",X"29",X"E7",X"24",X"D2",X"E7",X"24",X"E7",X"29", + X"E7",X"27",X"E6",X"24",X"E7",X"24",X"E7",X"1B",X"D2",X"E7",X"1B",X"E6",X"22",X"E6",X"24",X"E7", + X"24",X"E7",X"1B",X"D2",X"E7",X"1B",X"E6",X"22",X"FF",X"01",X"00",X"01",X"83",X"32",X"82",X"00", + X"01",X"94",X"32",X"AA",X"40",X"A9",X"40",X"A6",X"40",X"A3",X"40",X"A4",X"40",X"A7",X"40",X"A9", + X"40",X"AB",X"40",X"FF",X"AA",X"37",X"A9",X"37",X"A6",X"37",X"A3",X"37",X"A4",X"37",X"A7",X"37", + X"A9",X"37",X"AB",X"37",X"FF",X"01",X"00",X"01",X"AF",X"32",X"82",X"00",X"01",X"C0",X"32",X"AA", + X"44",X"A9",X"44",X"A6",X"44",X"A3",X"44",X"A4",X"44",X"A7",X"44",X"A9",X"44",X"AB",X"44",X"FF", + X"AA",X"40",X"A9",X"40",X"A6",X"40",X"A3",X"40",X"A4",X"40",X"A7",X"40",X"A9",X"40",X"AB",X"40", + X"FF",X"01",X"00",X"01",X"DB",X"32",X"82",X"00",X"01",X"EC",X"32",X"AA",X"47",X"A9",X"47",X"A6", + X"47",X"A3",X"47",X"A4",X"47",X"A7",X"47",X"A9",X"47",X"AB",X"47",X"FF",X"AA",X"44",X"A9",X"44", + X"A6",X"44",X"A3",X"44",X"A4",X"44",X"A7",X"44",X"A9",X"44",X"AB",X"44",X"FF",X"82",X"00",X"03", + X"02",X"33",X"C0",X"87",X"7B",X"C6",X"87",X"78",X"CA",X"87",X"77",X"CF",X"FF",X"C1",X"00",X"02", + X"12",X"33",X"A3",X"68",X"64",X"67",X"63",X"66",X"62",X"65",X"61",X"64",X"60",X"FF",X"82",X"00", + X"04",X"23",X"33",X"A4",X"E0",X"04",X"24",X"20",X"23",X"26",X"28",X"25",X"29",X"26",X"2A",X"27", + X"2B",X"28",X"30",X"29",X"31",X"2A",X"32",X"2B",X"E0",X"FF",X"82",X"00",X"01",X"3F",X"33",X"A3", + X"20",X"35",X"21",X"36",X"22",X"37",X"23",X"38",X"24",X"39",X"25",X"3A",X"26",X"3B",X"27",X"40", + X"28",X"41",X"29",X"42",X"2A",X"43",X"2B",X"44",X"2B",X"44",X"2A",X"43",X"29",X"42",X"28",X"41", + X"27",X"40",X"26",X"3B",X"25",X"3A",X"24",X"39",X"23",X"38",X"22",X"37",X"21",X"36",X"20",X"35", + X"FF",X"80",X"00",X"01",X"76",X"33",X"A4",X"4B",X"43",X"4B",X"43",X"D2",X"57",X"55",X"57",X"55", + X"D2",X"54",X"51",X"54",X"51",X"D2",X"52",X"48",X"52",X"48",X"FF",X"81",X"00",X"05",X"90",X"33", + X"A2",X"57",X"B5",X"D2",X"50",X"B5",X"D4",X"57",X"B5",X"D2",X"50",X"B5",X"D4",X"57",X"B5",X"D2", + X"50",X"B5",X"D4",X"57",X"B5",X"D2",X"50",X"B5",X"D4",X"57",X"B5",X"D2",X"50",X"B5",X"FF",X"40", + X"00",X"02",X"B9",X"33",X"C1",X"00",X"05",X"C2",X"33",X"A5",X"58",X"50",X"55",X"49",X"54",X"48", + X"53",X"FF",X"A6",X"45",X"46",X"47",X"48",X"49",X"4A",X"4B",X"50",X"51",X"52",X"53",X"54",X"55", + X"56",X"57",X"58",X"59",X"5A",X"5B",X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"BF",X"FF", + X"01",X"00",X"02",X"EA",X"33",X"82",X"00",X"06",X"04",X"34",X"A8",X"DF",X"65",X"6B",X"64",X"6A", + X"63",X"69",X"62",X"68",X"61",X"67",X"60",X"66",X"5B",X"65",X"5A",X"64",X"59",X"63",X"58",X"62", + X"57",X"61",X"56",X"FF",X"C0",X"86",X"1B",X"C2",X"84",X"1B",X"AF",X"C4",X"84",X"1A",X"C6",X"84", + X"20",X"CF",X"C0",X"86",X"1B",X"CF",X"C3",X"86",X"1B",X"CF",X"C6",X"86",X"1B",X"CF",X"C9",X"86", + X"1B",X"CF",X"C9",X"86",X"1B",X"CF",X"FF",X"82",X"00",X"04",X"2C",X"34",X"C0",X"82",X"1B",X"CF", + X"C0",X"82",X"C1",X"82",X"1B",X"CF",X"C3",X"82",X"1B",X"CF",X"C5",X"82",X"1B",X"CF",X"C7",X"82", + X"1B",X"CF",X"C9",X"82",X"1B",X"CF",X"CB",X"82",X"1B",X"CF",X"FF",X"40",X"00",X"04",X"55",X"34", + X"C1",X"00",X"04",X"71",X"34",X"A4",X"E0",X"0B",X"49",X"47",X"45",X"43",X"41",X"40",X"41",X"43", + X"45",X"47",X"49",X"57",X"B5",X"50",X"B5",X"57",X"B5",X"50",X"B5",X"57",X"B5",X"50",X"B5",X"E0", + X"FF",X"A4",X"E0",X"0B",X"49",X"47",X"45",X"43",X"41",X"40",X"41",X"43",X"45",X"47",X"49",X"50", + X"B5",X"44",X"B5",X"50",X"B5",X"44",X"B5",X"50",X"B5",X"44",X"B5",X"E0",X"FF",X"81",X"00",X"02", + X"92",X"34",X"A3",X"E0",X"04",X"40",X"31",X"32",X"36",X"45",X"49",X"52",X"45",X"55",X"55",X"48", + X"48",X"53",X"46",X"50",X"49",X"E0",X"FF",X"01",X"00",X"02",X"B1",X"34",X"82",X"00",X"02",X"CF", + X"34",X"A8",X"78",X"77",X"75",X"74",X"73",X"72",X"71",X"70",X"6B",X"6A",X"69",X"68",X"67",X"66", + X"65",X"64",X"63",X"62",X"61",X"60",X"5B",X"5A",X"59",X"58",X"57",X"56",X"55",X"54",X"FF",X"A6", + X"C0",X"85",X"20",X"CF",X"C2",X"85",X"20",X"CF",X"C6",X"87",X"75",X"74",X"73",X"72",X"71",X"70", + X"6B",X"6A",X"69",X"68",X"67",X"66",X"65",X"64",X"63",X"62",X"61",X"60",X"CF",X"FF",X"82",X"00", + X"06",X"F3",X"34",X"C0",X"87",X"70",X"C1",X"87",X"70",X"C3",X"87",X"70",X"C5",X"87",X"70",X"CF", + X"FF",X"82",X"00",X"06",X"06",X"35",X"C0",X"86",X"1B",X"CF",X"C3",X"86",X"1B",X"CF",X"C6",X"86", + X"1B",X"CF",X"C9",X"86",X"1B",X"CF",X"C9",X"86",X"1B",X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"31",X"90",X"4F",X"18",X"05",X"31",X"90",X"4F",X"18",X"1C",X"CD",X"09",X"2D",X"3A",X"80",X"50", + X"2F",X"32",X"1B",X"48",X"CD",X"54",X"39",X"CD",X"79",X"39",X"21",X"FF",X"3B",X"11",X"00",X"B8", + X"01",X"80",X"00",X"ED",X"B0",X"EF",X"21",X"DF",X"38",X"CD",X"A8",X"3D",X"21",X"02",X"48",X"36", + X"00",X"2B",X"7E",X"E6",X"80",X"77",X"F5",X"3E",X"10",X"FF",X"CD",X"B0",X"39",X"CD",X"E6",X"38", + X"CD",X"54",X"39",X"F1",X"CB",X"7F",X"CA",X"4A",X"36",X"3A",X"06",X"48",X"B7",X"20",X"0C",X"3A", + X"04",X"48",X"B7",X"20",X"06",X"AF",X"32",X"01",X"48",X"18",X"CB",X"CD",X"F2",X"39",X"CD",X"71", + X"3A",X"CD",X"23",X"3A",X"DD",X"21",X"F1",X"3A",X"CD",X"B2",X"3C",X"3A",X"1B",X"48",X"E6",X"C0", + X"07",X"07",X"21",X"1D",X"3B",X"CD",X"E1",X"3D",X"D5",X"DD",X"E1",X"CD",X"B2",X"3C",X"DD",X"21", + X"07",X"3B",X"CD",X"B2",X"3C",X"21",X"49",X"42",X"DD",X"21",X"07",X"48",X"1E",X"0B",X"06",X"02", + X"0E",X"00",X"CD",X"8A",X"3D",X"3E",X"23",X"06",X"01",X"FF",X"3A",X"06",X"48",X"B7",X"20",X"09", + X"DD",X"21",X"C7",X"3A",X"CD",X"B2",X"3C",X"18",X"EC",X"FE",X"02",X"30",X"1C",X"DD",X"21",X"90", + X"3A",X"CD",X"B2",X"3C",X"3A",X"04",X"48",X"B7",X"28",X"07",X"DD",X"21",X"D7",X"3A",X"CD",X"B2", + X"3C",X"06",X"20",X"18",X"14",X"00",X"01",X"00",X"02",X"DD",X"21",X"90",X"3A",X"CD",X"B2",X"3C", + X"DD",X"21",X"AB",X"3A",X"CD",X"B2",X"3C",X"06",X"60",X"3A",X"40",X"50",X"2F",X"A0",X"CA",X"C5", + X"35",X"21",X"01",X"48",X"11",X"F6",X"35",X"CB",X"27",X"CB",X"27",X"30",X"05",X"CB",X"F6",X"11", + X"F8",X"35",X"23",X"CB",X"FE",X"EB",X"3A",X"06",X"48",X"96",X"32",X"06",X"48",X"11",X"08",X"48", + X"06",X"02",X"CD",X"64",X"3D",X"21",X"49",X"42",X"DD",X"21",X"07",X"48",X"1E",X"0B",X"06",X"02", + X"0E",X"00",X"CD",X"8A",X"3D",X"3E",X"23",X"06",X"04",X"FF",X"3A",X"01",X"48",X"CB",X"7F",X"20", + X"22",X"3A",X"02",X"48",X"CB",X"77",X"CB",X"F7",X"32",X"02",X"48",X"CD",X"E9",X"38",X"21",X"30", + X"48",X"CD",X"00",X"03",X"79",X"32",X"E0",X"49",X"CD",X"28",X"83",X"21",X"01",X"48",X"36",X"00", + X"23",X"36",X"00",X"21",X"0F",X"48",X"06",X"0C",X"CF",X"21",X"90",X"39",X"11",X"D4",X"49",X"01", + X"20",X"00",X"ED",X"B0",X"21",X"90",X"39",X"11",X"F4",X"49",X"01",X"20",X"00",X"ED",X"B0",X"21", + X"30",X"48",X"CD",X"00",X"03",X"79",X"32",X"E0",X"49",X"21",X"02",X"49",X"CD",X"00",X"03",X"79", + X"32",X"00",X"4A",X"3A",X"1B",X"48",X"E6",X"30",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F", + X"C6",X"03",X"32",X"E6",X"49",X"32",X"06",X"4A",X"CD",X"B0",X"39",X"CD",X"54",X"39",X"3E",X"10", + X"FF",X"CD",X"F2",X"39",X"CD",X"71",X"3A",X"3A",X"01",X"48",X"CB",X"7F",X"28",X"06",X"3E",X"00", + X"01",X"D8",X"85",X"FF",X"3A",X"E6",X"49",X"47",X"CD",X"EF",X"3E",X"21",X"40",X"42",X"01",X"0C", + X"01",X"3E",X"00",X"1E",X"0A",X"CD",X"31",X"3D",X"18",X"03",X"CD",X"DE",X"39",X"3A",X"E3",X"49", + X"B7",X"28",X"0E",X"CD",X"E6",X"38",X"CD",X"15",X"39",X"3E",X"23",X"06",X"60",X"FF",X"CD",X"DE", + X"39",X"CD",X"E9",X"38",X"DD",X"21",X"B0",X"3B",X"CD",X"B2",X"3C",X"DD",X"21",X"14",X"3B",X"CD", + X"B2",X"3C",X"21",X"20",X"41",X"DD",X"21",X"E8",X"49",X"1E",X"0A",X"06",X"02",X"0E",X"FF",X"CD", + X"8A",X"3D",X"CD",X"12",X"3F",X"3A",X"E3",X"49",X"B7",X"28",X"08",X"CD",X"5C",X"0D",X"CD",X"E9", + X"0E",X"18",X"0B",X"CD",X"5C",X"0D",X"3E",X"23",X"06",X"40",X"FF",X"CD",X"57",X"0E",X"3E",X"23", + X"06",X"20",X"FF",X"21",X"D8",X"38",X"CD",X"B0",X"3D",X"CD",X"E9",X"0E",X"3E",X"30",X"FF",X"3E", + X"80",X"FF",X"F5",X"21",X"DF",X"38",X"CD",X"A8",X"3D",X"CD",X"09",X"2D",X"21",X"01",X"48",X"7E", + X"E6",X"E0",X"77",X"23",X"7E",X"E6",X"80",X"77",X"F1",X"FE",X"10",X"CA",X"67",X"38",X"3E",X"23", + X"06",X"20",X"FF",X"3A",X"01",X"48",X"CB",X"7F",X"20",X"0C",X"CD",X"DE",X"39",X"CD",X"E6",X"38", + X"CD",X"73",X"8B",X"C3",X"56",X"35",X"3A",X"E1",X"49",X"B7",X"20",X"17",X"21",X"90",X"39",X"11", + X"D4",X"49",X"01",X"11",X"00",X"ED",X"B0",X"21",X"30",X"48",X"CD",X"00",X"03",X"79",X"32",X"E0", + X"49",X"18",X"04",X"21",X"E3",X"49",X"34",X"21",X"E6",X"49",X"3A",X"01",X"48",X"CB",X"77",X"20", + X"18",X"35",X"C2",X"EA",X"36",X"CD",X"F5",X"38",X"3E",X"23",X"06",X"80",X"FF",X"CD",X"DE",X"39", + X"CD",X"E6",X"38",X"CD",X"90",X"8A",X"C3",X"56",X"35",X"35",X"20",X"13",X"CD",X"F5",X"38",X"3E", + X"23",X"06",X"80",X"FF",X"CD",X"DE",X"39",X"CD",X"E6",X"38",X"CD",X"90",X"8A",X"18",X"07",X"3A", + X"06",X"4A",X"B7",X"CA",X"EA",X"36",X"3A",X"06",X"4A",X"B7",X"CA",X"56",X"35",X"3A",X"01",X"48", + X"CB",X"6F",X"CB",X"EF",X"28",X"02",X"CB",X"AF",X"32",X"01",X"48",X"21",X"30",X"48",X"11",X"14", + X"4A",X"01",X"D2",X"00",X"ED",X"B0",X"21",X"02",X"49",X"11",X"30",X"48",X"01",X"D2",X"00",X"ED", + X"B0",X"21",X"14",X"4A",X"11",X"02",X"49",X"01",X"D2",X"00",X"ED",X"B0",X"21",X"D4",X"49",X"11", + X"14",X"4A",X"01",X"20",X"00",X"ED",X"B0",X"21",X"F4",X"49",X"11",X"D4",X"49",X"01",X"20",X"00", + X"ED",X"B0",X"21",X"14",X"4A",X"11",X"F4",X"49",X"01",X"20",X"00",X"ED",X"B0",X"21",X"24",X"48", + X"11",X"14",X"4A",X"01",X"06",X"00",X"ED",X"B0",X"21",X"2A",X"48",X"11",X"24",X"48",X"01",X"06", + X"00",X"ED",X"B0",X"21",X"14",X"4A",X"11",X"2A",X"48",X"01",X"06",X"00",X"ED",X"B0",X"21",X"14", + X"4A",X"06",X"D2",X"CF",X"C3",X"B8",X"36",X"3E",X"0A",X"16",X"00",X"1E",X"00",X"CD",X"20",X"2C", + X"3A",X"E1",X"49",X"B7",X"28",X"1A",X"3D",X"32",X"E1",X"49",X"CD",X"12",X"3F",X"21",X"8F",X"38", + X"CD",X"04",X"3E",X"3E",X"23",X"06",X"03",X"FF",X"18",X"E6",X"00",X"00",X"00",X"00",X"05",X"00", + X"3E",X"0A",X"CD",X"8E",X"2C",X"3E",X"23",X"06",X"20",X"FF",X"3A",X"01",X"48",X"CB",X"7F",X"CA", + X"56",X"35",X"21",X"90",X"39",X"11",X"D4",X"49",X"01",X"11",X"00",X"ED",X"B0",X"21",X"D5",X"38", + X"3A",X"E7",X"49",X"3C",X"FE",X"60",X"38",X"04",X"AF",X"21",X"D7",X"38",X"32",X"E7",X"49",X"11", + X"E9",X"49",X"06",X"02",X"CD",X"54",X"3D",X"21",X"30",X"48",X"CD",X"00",X"03",X"79",X"32",X"E0", + X"49",X"C3",X"EA",X"36",X"00",X"01",X"00",X"05",X"04",X"10",X"10",X"05",X"40",X"1D",X"FF",X"14", + X"15",X"12",X"11",X"16",X"13",X"FF",X"AF",X"18",X"02",X"3E",X"01",X"32",X"01",X"50",X"32",X"05", + X"50",X"32",X"06",X"50",X"C9",X"21",X"D1",X"40",X"01",X"14",X"03",X"3E",X"00",X"1E",X"00",X"CD", + X"31",X"3D",X"DD",X"21",X"7E",X"3B",X"3A",X"01",X"48",X"CB",X"6F",X"28",X"04",X"DD",X"21",X"97", + X"3B",X"CD",X"B2",X"3C",X"C9",X"DD",X"21",X"BB",X"3B",X"CD",X"B2",X"3C",X"DD",X"21",X"C7",X"3B", + X"3A",X"01",X"48",X"CB",X"6F",X"28",X"04",X"DD",X"21",X"D6",X"3B",X"CD",X"B2",X"3C",X"3A",X"1B", + X"48",X"E6",X"0C",X"C8",X"3A",X"E5",X"49",X"FE",X"02",X"C8",X"DD",X"21",X"E5",X"3B",X"CD",X"B2", + X"3C",X"CD",X"A6",X"3E",X"E5",X"DD",X"E1",X"21",X"AC",X"41",X"1E",X"0D",X"06",X"06",X"0E",X"00", + X"CD",X"8A",X"3D",X"C9",X"3A",X"1B",X"48",X"E6",X"03",X"21",X"71",X"39",X"07",X"06",X"00",X"4F", + X"09",X"3A",X"01",X"48",X"CB",X"6F",X"28",X"01",X"23",X"7E",X"32",X"03",X"50",X"32",X"21",X"48", + X"C9",X"00",X"01",X"00",X"00",X"01",X"00",X"01",X"01",X"3A",X"1B",X"48",X"E6",X"C0",X"07",X"07", + X"21",X"8C",X"39",X"06",X"00",X"4F",X"09",X"7E",X"32",X"05",X"48",X"C9",X"00",X"01",X"02",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"50",X"00",X"00", + X"5A",X"00",X"03",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"21",X"88",X"4B",X"06",X"28",X"CF",X"21",X"00",X"40",X"01",X"20",X"20",X"3E",X"00",X"1E",X"00", + X"CD",X"99",X"3C",X"21",X"40",X"40",X"01",X"1C",X"01",X"3E",X"00",X"1E",X"0A",X"CD",X"31",X"3D", + X"21",X"5F",X"40",X"01",X"1C",X"01",X"3E",X"00",X"1E",X"0A",X"CD",X"31",X"3D",X"C9",X"21",X"88", + X"4B",X"06",X"28",X"CF",X"21",X"41",X"40",X"01",X"1C",X"1E",X"3E",X"00",X"1E",X"00",X"CD",X"99", + X"3C",X"C9",X"21",X"BF",X"40",X"DD",X"21",X"0F",X"48",X"1E",X"0A",X"06",X"06",X"0E",X"00",X"CD", + X"8A",X"3D",X"21",X"FF",X"42",X"DD",X"21",X"15",X"48",X"1E",X"0A",X"06",X"06",X"0E",X"00",X"CD", + X"8A",X"3D",X"21",X"DF",X"41",X"DD",X"21",X"09",X"48",X"1E",X"0A",X"06",X"06",X"0E",X"00",X"CD", + X"8A",X"3D",X"C9",X"DD",X"21",X"45",X"3A",X"06",X"0B",X"C5",X"DD",X"6E",X"00",X"DD",X"66",X"01", + X"DD",X"7E",X"02",X"DD",X"5E",X"03",X"01",X"02",X"02",X"CD",X"1E",X"3D",X"01",X"04",X"00",X"DD", + X"09",X"C1",X"10",X"E5",X"C9",X"B9",X"40",X"E0",X"11",X"F9",X"40",X"E4",X"12",X"39",X"41",X"E8", + X"13",X"79",X"41",X"DC",X"11",X"B9",X"41",X"E0",X"13",X"F9",X"41",X"E4",X"12",X"39",X"42",X"E8", + X"15",X"79",X"42",X"00",X"00",X"B9",X"42",X"EC",X"11",X"F9",X"42",X"E4",X"16",X"39",X"43",X"F0", + X"12",X"DD",X"21",X"79",X"3A",X"CD",X"B2",X"3C",X"C9",X"00",X"02",X"7F",X"40",X"00",X"0D",X"31", + X"50",X"02",X"9F",X"41",X"00",X"0D",X"48",X"49",X"02",X"BF",X"42",X"00",X"0D",X"32",X"50",X"00", + X"00",X"14",X"CF",X"40",X"00",X"0B",X"50",X"55",X"53",X"48",X"20",X"31",X"20",X"50",X"4C",X"41", + X"59",X"45",X"52",X"20",X"42",X"55",X"54",X"54",X"4F",X"4E",X"00",X"00",X"15",X"CD",X"40",X"00", + X"0C",X"50",X"55",X"53",X"48",X"20",X"32",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"20", + X"42",X"55",X"54",X"54",X"4F",X"4E",X"00",X"00",X"09",X"6F",X"41",X"00",X"0B",X"4D",X"4F",X"52", + X"45",X"20",X"43",X"4F",X"49",X"4E",X"00",X"00",X"13",X"CD",X"40",X"00",X"0E",X"32",X"20",X"50", + X"4C",X"41",X"59",X"45",X"52",X"53",X"20",X"4D",X"4F",X"52",X"45",X"20",X"43",X"4F",X"49",X"4E", + X"00",X"00",X"0F",X"22",X"41",X"00",X"0A",X"40",X"20",X"31",X"39",X"38",X"33",X"20",X"53",X"41", + X"4E",X"52",X"49",X"54",X"53",X"55",X"00",X"00",X"06",X"69",X"41",X"00",X"0A",X"43",X"52",X"45", + X"44",X"49",X"54",X"00",X"00",X"02",X"E0",X"40",X"00",X"0C",X"4C",X"3D",X"00",X"25",X"3B",X"3B", + X"3B",X"51",X"3B",X"67",X"3B",X"00",X"0F",X"26",X"41",X"00",X"0D",X"31",X"20",X"43",X"4F",X"49", + X"4E",X"20",X"31",X"20",X"43",X"52",X"45",X"44",X"49",X"54",X"00",X"00",X"0F",X"26",X"41",X"00", + X"0D",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"32",X"20",X"43",X"52",X"45",X"44",X"49",X"54", + X"00",X"00",X"0F",X"26",X"41",X"00",X"0D",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"33",X"20", + X"43",X"52",X"45",X"44",X"49",X"54",X"00",X"00",X"10",X"26",X"41",X"00",X"0D",X"32",X"20",X"43", + X"4F",X"49",X"4E",X"53",X"20",X"31",X"20",X"43",X"52",X"45",X"44",X"49",X"54",X"00",X"00",X"12", + X"F2",X"40",X"00",X"06",X"47",X"41",X"4D",X"45",X"20",X"4F",X"56",X"45",X"52",X"20",X"50",X"4C", + X"41",X"59",X"45",X"52",X"5F",X"31",X"00",X"00",X"12",X"F2",X"40",X"00",X"06",X"47",X"41",X"4D", + X"45",X"20",X"4F",X"56",X"45",X"52",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"5F",X"32",X"00", + X"00",X"04",X"A0",X"41",X"00",X"0A",X"54",X"49",X"4D",X"45",X"00",X"00",X"05",X"B2",X"41",X"00", + X"0A",X"52",X"45",X"41",X"44",X"59",X"00",X"00",X"08",X"8F",X"41",X"00",X"0A",X"50",X"4C",X"41", + X"59",X"45",X"52",X"20",X"31",X"00",X"00",X"08",X"8F",X"41",X"00",X"0A",X"50",X"4C",X"41",X"59", + X"45",X"52",X"20",X"32",X"00",X"00",X"13",X"EC",X"40",X"00",X"0A",X"45",X"58",X"54",X"52",X"41", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"50",X"4F",X"49",X"4E",X"54",X"53",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"08",X"0F",X"00",X"07",X"08",X"04",X"00",X"07",X"08",X"01",X"00", + X"07",X"08",X"03",X"00",X"03",X"08",X"05",X"00",X"03",X"02",X"07",X"00",X"07",X"08",X"05",X"00", + X"07",X"0C",X"00",X"00",X"07",X"03",X"05",X"0D",X"00",X"00",X"07",X"0D",X"07",X"01",X"05",X"0D", + X"03",X"05",X"02",X"0D",X"08",X"09",X"06",X"0D",X"02",X"05",X"08",X"0D",X"01",X"04",X"03",X"00", + X"04",X"0A",X"05",X"00",X"01",X"03",X"00",X"00",X"05",X"08",X"00",X"00",X"03",X"02",X"00",X"00", + X"07",X"08",X"01",X"00",X"03",X"01",X"07",X"00",X"02",X"03",X"00",X"00",X"09",X"0E",X"02",X"00", + X"05",X"03",X"08",X"00",X"00",X"00",X"00",X"00",X"03",X"05",X"0F",X"00",X"03",X"0D",X"07",X"00", + X"01",X"0D",X"07",X"00",X"0F",X"0D",X"07",X"0D",X"01",X"03",X"0E",X"00",X"05",X"0D",X"07",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"5F",X"73",X"23",X"0B",X"79",X"B0",X"20",X"F9",X"C9",X"C5",X"E5",X"77",X"CD",X"43",X"3D",X"23", + X"10",X"F9",X"F5",X"3E",X"23",X"06",X"01",X"FF",X"F1",X"E1",X"CD",X"4D",X"3D",X"C1",X"0D",X"20", + X"E8",X"C9",X"DD",X"4E",X"00",X"DD",X"23",X"DD",X"7E",X"00",X"B7",X"C8",X"47",X"DD",X"23",X"DD", + X"6E",X"00",X"DD",X"23",X"DD",X"66",X"00",X"DD",X"23",X"DD",X"7E",X"00",X"DD",X"23",X"B7",X"20", + X"11",X"DD",X"5E",X"00",X"DD",X"23",X"DD",X"7E",X"00",X"CD",X"F3",X"3C",X"DD",X"23",X"10",X"F6", + X"18",X"D5",X"DD",X"7E",X"00",X"DD",X"5E",X"01",X"CD",X"F3",X"3C",X"DD",X"23",X"DD",X"23",X"10", + X"F1",X"18",X"C4",X"77",X"CD",X"43",X"3D",X"CD",X"4D",X"3D",X"79",X"B7",X"C8",X"C5",X"3E",X"23", + X"41",X"FF",X"C1",X"C9",X"C5",X"E5",X"DD",X"7E",X"00",X"B7",X"28",X"04",X"77",X"CD",X"43",X"3D", + X"DD",X"23",X"23",X"10",X"F1",X"E1",X"CD",X"4D",X"3D",X"C1",X"0D",X"20",X"E7",X"C9",X"C5",X"E5", + X"77",X"CD",X"43",X"3D",X"23",X"3C",X"10",X"F8",X"E1",X"CD",X"4D",X"3D",X"C1",X"0D",X"20",X"EE", + X"C9",X"C5",X"E5",X"77",X"CD",X"43",X"3D",X"23",X"10",X"F9",X"E1",X"CD",X"4D",X"3D",X"C1",X"0D", + X"20",X"EF",X"C9",X"E5",X"D5",X"11",X"00",X"04",X"19",X"D1",X"73",X"E1",X"C9",X"D5",X"11",X"20", + X"00",X"19",X"D1",X"C9",X"B7",X"1A",X"8E",X"FE",X"0A",X"38",X"02",X"D6",X"0A",X"12",X"3F",X"1B", + X"2B",X"10",X"F2",X"C9",X"B7",X"1A",X"9E",X"30",X"02",X"C6",X"0A",X"12",X"1B",X"2B",X"10",X"F5", + X"C9",X"1A",X"BE",X"38",X"08",X"20",X"09",X"13",X"23",X"10",X"F6",X"AF",X"C9",X"3E",X"01",X"C9", + X"3E",X"02",X"C9",X"78",X"85",X"6F",X"79",X"84",X"67",X"C9",X"DD",X"7E",X"00",X"05",X"28",X"08", + X"FE",X"00",X"20",X"03",X"B9",X"28",X"03",X"0D",X"C6",X"30",X"77",X"CD",X"43",X"3D",X"CD",X"4D", + X"3D",X"DD",X"23",X"78",X"B7",X"20",X"E3",X"C9",X"7E",X"FE",X"FF",X"C8",X"FF",X"23",X"18",X"F8", + X"7E",X"FE",X"FF",X"C8",X"23",X"4E",X"23",X"46",X"23",X"FF",X"18",X"F4",X"7D",X"FE",X"00",X"20", + X"02",X"3E",X"FF",X"ED",X"44",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"5F",X"7C",X"ED",X"44",X"C6", + X"10",X"ED",X"44",X"E6",X"F8",X"6F",X"26",X"00",X"54",X"29",X"29",X"19",X"11",X"00",X"40",X"19", + X"C9",X"CB",X"27",X"5F",X"16",X"00",X"19",X"5E",X"23",X"56",X"C9",X"0E",X"01",X"B7",X"28",X"05", + X"3D",X"CB",X"21",X"18",X"F8",X"79",X"C9",X"06",X"04",X"0E",X"00",X"CB",X"3F",X"38",X"03",X"0C", + X"10",X"F9",X"79",X"C9",X"3A",X"01",X"48",X"CB",X"7F",X"C8",X"DD",X"21",X"0F",X"48",X"11",X"14", + X"48",X"01",X"BF",X"40",X"CB",X"6F",X"3E",X"0A",X"28",X"0C",X"DD",X"21",X"15",X"48",X"11",X"1A", + X"48",X"01",X"FF",X"42",X"3E",X"0A",X"F5",X"C5",X"06",X"06",X"CD",X"54",X"3D",X"E1",X"F1",X"06", + X"06",X"5F",X"0E",X"00",X"CD",X"8A",X"3D",X"3A",X"01",X"48",X"11",X"0F",X"48",X"CB",X"6F",X"28", + X"03",X"11",X"15",X"48",X"06",X"06",X"D5",X"21",X"09",X"48",X"CD",X"71",X"3D",X"E1",X"FE",X"02", + X"20",X"18",X"11",X"09",X"48",X"01",X"06",X"00",X"ED",X"B0",X"DD",X"21",X"09",X"48",X"21",X"DF", + X"41",X"06",X"06",X"1E",X"0A",X"0E",X"00",X"CD",X"8A",X"3D",X"3A",X"1B",X"48",X"E6",X"0C",X"FE", + X"00",X"C8",X"3A",X"E5",X"49",X"FE",X"02",X"C8",X"CD",X"A6",X"3E",X"3A",X"01",X"48",X"11",X"0F", + X"48",X"CB",X"6F",X"28",X"03",X"11",X"15",X"48",X"06",X"06",X"CD",X"71",X"3D",X"FE",X"01",X"C8", + X"3E",X"0E",X"16",X"00",X"5A",X"CD",X"20",X"2C",X"21",X"E5",X"49",X"34",X"21",X"E6",X"49",X"34", + X"46",X"05",X"CD",X"EF",X"3E",X"C9",X"21",X"C5",X"3E",X"3A",X"1B",X"48",X"E6",X"0C",X"CB",X"3F", + X"CB",X"3F",X"3D",X"CD",X"E1",X"3D",X"EB",X"3A",X"E5",X"49",X"CB",X"27",X"5F",X"CB",X"27",X"83", + X"5F",X"16",X"00",X"19",X"C9",X"CB",X"3E",X"D7",X"3E",X"E3",X"3E",X"00",X"02",X"00",X"00",X"00", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"01",X"04",X"00", + X"00",X"00",X"00",X"00",X"07",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"C5", + X"21",X"40",X"40",X"1E",X"1E",X"01",X"01",X"01",X"3E",X"2D",X"CD",X"31",X"3D",X"1E",X"0A",X"3E", + X"3D",X"01",X"01",X"01",X"CD",X"31",X"3D",X"C1",X"78",X"F6",X"30",X"01",X"01",X"01",X"CD",X"31", + X"3D",X"C9",X"21",X"60",X"43",X"3A",X"E1",X"49",X"FE",X"08",X"38",X"0B",X"D6",X"08",X"F5",X"3E", + X"FF",X"CD",X"29",X"3F",X"F1",X"18",X"F1",X"C6",X"F7",X"47",X"1E",X"0B",X"3A",X"DA",X"49",X"CB", + X"47",X"28",X"02",X"1E",X"0F",X"78",X"01",X"01",X"01",X"CD",X"31",X"3D",X"11",X"C0",X"FF",X"19", + X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"31",X"B0",X"4D",X"21",X"50",X"4B",X"06",X"20", + X"CF",X"3E",X"23",X"06",X"01",X"FF",X"FD",X"21",X"50",X"4B",X"06",X"08",X"C5",X"FD",X"7E",X"00", + X"FD",X"B6",X"01",X"28",X"03",X"CD",X"73",X"3F",X"01",X"04",X"00",X"FD",X"09",X"C1",X"10",X"EC", + X"C3",X"51",X"3F",X"FD",X"7E",X"02",X"B7",X"28",X"04",X"FD",X"35",X"02",X"C9",X"FD",X"36",X"02", + X"08",X"FD",X"7E",X"03",X"3C",X"FD",X"77",X"03",X"FE",X"20",X"28",X"14",X"FD",X"66",X"00",X"FD", + X"6E",X"01",X"CD",X"BC",X"3D",X"3E",X"10",X"1E",X"10",X"01",X"02",X"02",X"CD",X"1E",X"3D",X"C9", + X"FD",X"66",X"00",X"FD",X"6E",X"01",X"E5",X"CD",X"9E",X"0F",X"7E",X"E6",X"0F",X"77",X"E1",X"F5", + X"CD",X"BC",X"3D",X"F1",X"1E",X"01",X"DD",X"21",X"77",X"89",X"CD",X"50",X"89",X"FD",X"E5",X"E1", + X"06",X"04",X"CF",X"C9",X"FD",X"E5",X"FD",X"21",X"50",X"4B",X"06",X"08",X"FD",X"7E",X"00",X"FD", + X"B6",X"01",X"28",X"16",X"FD",X"7E",X"00",X"BC",X"20",X"06",X"FD",X"7E",X"01",X"BD",X"28",X"07", + X"11",X"04",X"00",X"FD",X"19",X"10",X"E5",X"37",X"18",X"11",X"E5",X"CD",X"9E",X"0F",X"E6",X"0F", + X"F6",X"80",X"77",X"E1",X"FD",X"74",X"00",X"FD",X"75",X"01",X"A7",X"FD",X"E1",X"C9",X"FF",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..ba7f34be --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"FD",X"6E",X"06",X"FD",X"66",X"07",X"29",X"F5",X"11",X"00",X"00",X"ED",X"5A",X"F1",X"FD",X"75", + X"06",X"FD",X"74",X"07",X"38",X"36",X"FD",X"7E",X"04",X"FE",X"07",X"D8",X"21",X"32",X"25",X"FD", + X"7E",X"11",X"B7",X"28",X"03",X"FD",X"35",X"11",X"FD",X"46",X"0A",X"FD",X"7E",X"09",X"FE",X"02", + X"20",X"04",X"78",X"EE",X"02",X"47",X"78",X"CD",X"E1",X"3D",X"D5",X"C1",X"FD",X"66",X"01",X"FD", + X"6E",X"03",X"CD",X"83",X"3D",X"FD",X"74",X"01",X"FD",X"75",X"03",X"C9",X"FD",X"7E",X"04",X"FE", + X"07",X"38",X"C9",X"FD",X"7E",X"11",X"E6",X"0F",X"FE",X"01",X"28",X"C0",X"21",X"3A",X"25",X"FD", + X"35",X"11",X"18",X"BB",X"FD",X"7E",X"0A",X"16",X"00",X"5F",X"19",X"7E",X"FD",X"77",X"00",X"C9", + X"3A",X"E7",X"49",X"FE",X"09",X"38",X"02",X"3E",X"09",X"16",X"00",X"5F",X"19",X"7E",X"FD",X"77", + X"04",X"FD",X"77",X"05",X"21",X"69",X"26",X"CD",X"E1",X"3D",X"FD",X"73",X"06",X"FD",X"72",X"07", + X"C9",X"FD",X"7E",X"04",X"21",X"A3",X"80",X"16",X"00",X"5F",X"19",X"7E",X"FD",X"B6",X"0C",X"FD", + X"77",X"0C",X"C9",X"10",X"08",X"08",X"07",X"07",X"06",X"06",X"05",X"05",X"05",X"FD",X"7E",X"09", + X"FE",X"01",X"C8",X"FD",X"7E",X"0C",X"CB",X"BF",X"B7",X"28",X"04",X"FD",X"35",X"0C",X"C9",X"E5", + X"CD",X"91",X"80",X"E1",X"FD",X"7E",X"0A",X"CD",X"E1",X"3D",X"FD",X"7E",X"00",X"FD",X"CB",X"0C", + X"7E",X"20",X"0A",X"BA",X"28",X"07",X"FD",X"CB",X"0C",X"BE",X"3C",X"18",X"08",X"BB",X"28",X"F3", + X"FD",X"CB",X"0C",X"FE",X"3D",X"FD",X"77",X"00",X"C9",X"ED",X"5F",X"5F",X"ED",X"5F",X"6F",X"26", + X"00",X"54",X"ED",X"5F",X"E6",X"03",X"3C",X"47",X"86",X"19",X"10",X"FC",X"C9",X"FD",X"66",X"01", + X"FD",X"6E",X"03",X"CD",X"9E",X"0F",X"E6",X"0F",X"21",X"4E",X"81",X"16",X"00",X"5F",X"19",X"4E", + X"C5",X"21",X"61",X"26",X"06",X"04",X"C5",X"4E",X"23",X"46",X"23",X"E5",X"FD",X"66",X"01",X"FD", + X"6E",X"03",X"CD",X"83",X"3D",X"CD",X"9E",X"0F",X"FE",X"FF",X"28",X"1F",X"B7",X"28",X"1C",X"E6", + X"F0",X"28",X"04",X"FE",X"80",X"20",X"14",X"37",X"E1",X"C1",X"CB",X"19",X"10",X"D8",X"CB",X"39", + X"CB",X"39",X"CB",X"39",X"CB",X"39",X"79",X"C1",X"A1",X"4F",X"C9",X"A7",X"18",X"EA",X"00",X"03", + X"09",X"06",X"0C",X"05",X"0A",X"07",X"0D",X"0E",X"0B",X"0F",X"0E",X"0F",X"7E",X"23",X"5E",X"23", + X"56",X"23",X"D5",X"DD",X"E1",X"E5",X"F5",X"DD",X"7E",X"09",X"FE",X"04",X"30",X"0C",X"CD",X"80", + X"81",X"CD",X"EA",X"81",X"CD",X"60",X"82",X"CD",X"C5",X"82",X"F1",X"E1",X"3D",X"20",X"DF",X"C9", + X"06",X"0E",X"DD",X"7E",X"0A",X"DF",X"8E",X"81",X"A6",X"81",X"CC",X"81",X"E4",X"81",X"FD",X"7E", + X"01",X"DD",X"BE",X"01",X"C0",X"FD",X"7E",X"03",X"5F",X"D6",X"11",X"57",X"DD",X"7E",X"03",X"BB", + X"D0",X"BA",X"D2",X"1E",X"83",X"C9",X"1E",X"0D",X"16",X"10",X"FD",X"7E",X"03",X"6F",X"D6",X"10", + X"67",X"DD",X"7E",X"03",X"BD",X"D0",X"BC",X"D8",X"DD",X"7E",X"01",X"FD",X"96",X"01",X"38",X"05", + X"BB",X"D0",X"C3",X"1E",X"83",X"ED",X"44",X"BA",X"D0",X"C3",X"1E",X"83",X"FD",X"7E",X"01",X"DD", + X"BE",X"01",X"C0",X"FD",X"7E",X"03",X"5F",X"D6",X"10",X"57",X"DD",X"7E",X"03",X"BB",X"D0",X"BA", + X"D8",X"C3",X"1E",X"83",X"1E",X"10",X"16",X"0D",X"18",X"C0",X"06",X"0D",X"DD",X"7E",X"0A",X"DF", + X"14",X"82",X"F8",X"81",X"3E",X"82",X"44",X"82",X"FD",X"7E",X"03",X"DD",X"BE",X"03",X"C0",X"FD", + X"7E",X"01",X"5F",X"C6",X"10",X"30",X"02",X"3E",X"FF",X"57",X"DD",X"7E",X"01",X"BB",X"D8",X"BA", + X"DA",X"1E",X"83",X"C9",X"1E",X"10",X"16",X"0D",X"FD",X"7E",X"01",X"6F",X"C6",X"10",X"30",X"02", + X"3E",X"FF",X"67",X"DD",X"7E",X"01",X"BD",X"D8",X"BC",X"D0",X"DD",X"7E",X"03",X"FD",X"96",X"03", + X"38",X"05",X"BB",X"D0",X"C3",X"1E",X"83",X"ED",X"44",X"BA",X"D0",X"C3",X"1E",X"83",X"1E",X"0D", + X"16",X"10",X"18",X"D4",X"FD",X"7E",X"03",X"DD",X"BE",X"03",X"C0",X"FD",X"7E",X"01",X"5F",X"C6", + X"10",X"30",X"02",X"3E",X"FF",X"57",X"DD",X"7E",X"01",X"BB",X"D8",X"BA",X"D0",X"C3",X"1E",X"83", + X"06",X"0B",X"DD",X"7E",X"0A",X"DF",X"8A",X"82",X"A6",X"82",X"6E",X"82",X"BF",X"82",X"FD",X"7E", + X"01",X"DD",X"BE",X"01",X"C0",X"FD",X"7E",X"03",X"5F",X"C6",X"11",X"30",X"02",X"3E",X"FF",X"57", + X"DD",X"7E",X"03",X"BB",X"D8",X"BA",X"DA",X"1E",X"83",X"C9",X"FD",X"7E",X"01",X"DD",X"BE",X"01", + X"C0",X"FD",X"7E",X"03",X"5F",X"C6",X"10",X"30",X"02",X"3E",X"FF",X"57",X"DD",X"7E",X"03",X"BB", + X"D8",X"BA",X"D0",X"C3",X"1E",X"83",X"1E",X"0D",X"16",X"10",X"FD",X"7E",X"03",X"6F",X"C6",X"10", + X"30",X"02",X"3E",X"FF",X"67",X"DD",X"7E",X"03",X"BD",X"D8",X"BC",X"D0",X"C3",X"B8",X"81",X"1E", + X"10",X"16",X"0D",X"18",X"E5",X"06",X"07",X"DD",X"7E",X"0A",X"DF",X"EB",X"82",X"00",X"83",X"18", + X"83",X"D3",X"82",X"FD",X"7E",X"03",X"DD",X"BE",X"03",X"C0",X"FD",X"7E",X"01",X"5F",X"D6",X"10", + X"57",X"DD",X"7E",X"01",X"BB",X"D0",X"BA",X"D2",X"1E",X"83",X"C9",X"1E",X"10",X"16",X"0D",X"FD", + X"7E",X"01",X"6F",X"D6",X"10",X"67",X"DD",X"7E",X"01",X"BD",X"D0",X"BC",X"D8",X"C3",X"2A",X"82", + X"FD",X"7E",X"03",X"DD",X"BE",X"03",X"C0",X"FD",X"7E",X"01",X"5F",X"D6",X"1F",X"57",X"DD",X"7E", + X"01",X"BB",X"D0",X"BA",X"D8",X"C3",X"1E",X"83",X"16",X"0D",X"1E",X"10",X"18",X"D1",X"78",X"A1", + X"4F",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"21",X"14",X"4A",X"06",X"38",X"CF",X"21",X"7A", + X"84",X"11",X"14",X"4A",X"01",X"10",X"00",X"ED",X"B0",X"21",X"8A",X"84",X"11",X"34",X"4A",X"01", + X"04",X"00",X"ED",X"B0",X"21",X"8E",X"84",X"11",X"58",X"4A",X"01",X"0B",X"00",X"ED",X"B0",X"06", + X"0B",X"21",X"99",X"40",X"11",X"6F",X"84",X"C5",X"D5",X"1A",X"5F",X"01",X"02",X"02",X"3E",X"BC", + X"CD",X"1E",X"3D",X"D1",X"13",X"C1",X"10",X"EF",X"3E",X"D0",X"1E",X"05",X"01",X"02",X"02",X"21", + X"15",X"43",X"CD",X"1E",X"3D",X"3E",X"BC",X"1E",X"02",X"01",X"02",X"02",X"21",X"95",X"41",X"CD", + X"1E",X"3D",X"3E",X"BC",X"1E",X"04",X"01",X"02",X"02",X"21",X"15",X"42",X"CD",X"1E",X"3D",X"3E", + X"02",X"01",X"50",X"8C",X"FF",X"3E",X"23",X"06",X"01",X"FF",X"FD",X"21",X"14",X"4A",X"FD",X"7E", + X"0E",X"FE",X"03",X"20",X"14",X"FD",X"E5",X"FD",X"7E",X"21",X"FE",X"C8",X"DC",X"26",X"84",X"FD", + X"E1",X"FD",X"7E",X"21",X"FE",X"10",X"CA",X"99",X"84",X"CD",X"BB",X"1B",X"FD",X"7E",X"09",X"21", + X"C5",X"83",X"F7",X"18",X"0A",X"1C",X"84",X"1C",X"84",X"02",X"16",X"1D",X"84",X"57",X"16",X"FD", + X"7E",X"08",X"21",X"D8",X"83",X"F7",X"18",X"04",X"E1",X"83",X"0A",X"84",X"CD",X"90",X"11",X"18", + X"B4",X"CD",X"B2",X"1A",X"1E",X"02",X"FD",X"7E",X"21",X"FE",X"E0",X"20",X"10",X"FD",X"7E",X"23", + X"FE",X"58",X"20",X"02",X"1E",X"03",X"FD",X"73",X"0F",X"CD",X"D6",X"13",X"C9",X"1E",X"01",X"FD", + X"7E",X"23",X"FE",X"58",X"20",X"F0",X"1E",X"03",X"18",X"EC",X"FD",X"7E",X"10",X"B7",X"28",X"06", + X"FD",X"35",X"10",X"C3",X"E4",X"83",X"CD",X"7A",X"14",X"C3",X"E4",X"83",X"C9",X"FD",X"7E",X"21", + X"FE",X"A0",X"D0",X"C3",X"29",X"16",X"FD",X"21",X"58",X"4A",X"FD",X"7E",X"09",X"FE",X"FF",X"C8", + X"FD",X"7E",X"09",X"B7",X"20",X"0E",X"21",X"A1",X"28",X"CD",X"AD",X"80",X"CD",X"00",X"80",X"CD", + X"7D",X"1E",X"18",X"1B",X"FE",X"04",X"20",X"14",X"CD",X"AA",X"20",X"FD",X"7E",X"09",X"FE",X"06", + X"20",X"0D",X"FD",X"36",X"09",X"FF",X"FD",X"36",X"00",X"00",X"18",X"03",X"CD",X"0D",X"21",X"21", + X"58",X"4A",X"11",X"A2",X"4B",X"01",X"04",X"00",X"ED",X"B0",X"AF",X"32",X"A1",X"4B",X"C9",X"01", + X"02",X"03",X"04",X"01",X"02",X"03",X"04",X"01",X"02",X"03",X"85",X"10",X"9F",X"38",X"86",X"00", + X"9F",X"38",X"00",X"00",X"06",X"06",X"FF",X"FF",X"01",X"04",X"9E",X"08",X"9E",X"38",X"AD",X"10", + X"5B",X"58",X"06",X"06",X"FF",X"FF",X"00",X"00",X"01",X"3E",X"12",X"FF",X"CD",X"57",X"0E",X"3E", + X"01",X"01",X"78",X"86",X"FF",X"21",X"2C",X"85",X"11",X"88",X"4B",X"01",X"0F",X"00",X"ED",X"B0", + X"3E",X"23",X"06",X"04",X"FF",X"DD",X"21",X"4A",X"85",X"CD",X"B2",X"3C",X"3E",X"50",X"32",X"63", + X"48",X"3E",X"23",X"06",X"04",X"FF",X"DD",X"21",X"5C",X"85",X"CD",X"B2",X"3C",X"3E",X"60",X"32", + X"62",X"48",X"3E",X"23",X"06",X"04",X"FF",X"DD",X"21",X"69",X"85",X"CD",X"B2",X"3C",X"21",X"3B", + X"85",X"11",X"A1",X"4B",X"01",X"05",X"00",X"ED",X"B0",X"3E",X"23",X"06",X"04",X"FF",X"DD",X"21", + X"7D",X"85",X"CD",X"B2",X"3C",X"21",X"40",X"85",X"11",X"A6",X"4B",X"01",X"05",X"00",X"ED",X"B0", + X"3E",X"23",X"06",X"04",X"FF",X"DD",X"21",X"8E",X"85",X"CD",X"B2",X"3C",X"21",X"45",X"85",X"11", + X"AB",X"4B",X"01",X"05",X"00",X"ED",X"B0",X"3E",X"23",X"06",X"04",X"FF",X"DD",X"21",X"A1",X"85", + X"CD",X"B2",X"3C",X"3E",X"23",X"06",X"C0",X"FF",X"3E",X"11",X"FF",X"C9",X"00",X"85",X"58",X"9F", + X"88",X"00",X"86",X"48",X"9F",X"88",X"00",X"9E",X"50",X"9E",X"88",X"00",X"AD",X"50",X"5B",X"B8", + X"00",X"AD",X"50",X"5D",X"C8",X"00",X"AD",X"50",X"5C",X"D8",X"04",X"0B",X"AF",X"41",X"00",X"06", + X"56",X"41",X"4E",X"3A",X"56",X"41",X"4E",X"20",X"43",X"41",X"52",X"00",X"04",X"06",X"AD",X"41", + X"00",X"06",X"45",X"4E",X"45",X"52",X"47",X"59",X"00",X"04",X"0D",X"AB",X"41",X"00",X"06",X"42", + X"4F",X"4E",X"55",X"53",X"20",X"42",X"41",X"4C",X"4C",X"4F",X"4F",X"4E",X"00",X"04",X"0A",X"A9", + X"41",X"00",X"06",X"52",X"45",X"44",X"20",X"4B",X"49",X"4C",X"4C",X"45",X"52",X"00",X"04",X"0C", + X"A7",X"41",X"00",X"06",X"47",X"52",X"45",X"45",X"4E",X"20",X"4B",X"49",X"4C",X"4C",X"45",X"52", + X"00",X"04",X"0B",X"A5",X"41",X"00",X"06",X"42",X"4C",X"55",X"45",X"20",X"4B",X"49",X"4C",X"4C", + X"45",X"52",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"31",X"E0",X"4E",X"DD",X"21",X"0F",X"86",X"21", + X"7F",X"40",X"3A",X"01",X"48",X"CB",X"6F",X"28",X"07",X"21",X"BF",X"42",X"DD",X"21",X"18",X"86", + X"DD",X"E5",X"E5",X"CD",X"B2",X"3C",X"3E",X"23",X"06",X"18",X"FF",X"E1",X"E5",X"01",X"02",X"01", + X"3E",X"00",X"CD",X"99",X"3C",X"E1",X"DD",X"E1",X"3E",X"23",X"06",X"10",X"FF",X"18",X"E1",X"00", + X"02",X"7F",X"40",X"00",X"0D",X"31",X"50",X"00",X"00",X"02",X"BF",X"42",X"00",X"0D",X"32",X"50", + X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"31",X"F0",X"4D",X"3E",X"23",X"06",X"20",X"FF", + X"3A",X"02",X"48",X"CB",X"47",X"CB",X"C7",X"32",X"02",X"48",X"21",X"30",X"48",X"7E",X"4F",X"E6", + X"F0",X"28",X"17",X"FE",X"70",X"30",X"13",X"79",X"E6",X"0F",X"77",X"E5",X"C5",X"CD",X"F4",X"0F", + X"C1",X"CD",X"02",X"8D",X"E1",X"3E",X"23",X"06",X"0A",X"FF",X"23",X"11",X"02",X"49",X"B7",X"E5", + X"ED",X"52",X"E1",X"38",X"D8",X"3E",X"23",X"06",X"40",X"FF",X"3E",X"47",X"06",X"10",X"FF",X"3E", + X"60",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"31",X"30",X"4E",X"21",X"59",X"87",X"3A",X"02", + X"48",X"CB",X"77",X"28",X"03",X"21",X"8A",X"87",X"11",X"E8",X"4A",X"01",X"31",X"00",X"ED",X"B0", + X"3E",X"23",X"06",X"01",X"FF",X"06",X"07",X"FD",X"21",X"E8",X"4A",X"C5",X"FD",X"7E",X"02",X"B7", + X"CC",X"B5",X"86",X"3E",X"23",X"06",X"01",X"FF",X"FD",X"35",X"02",X"01",X"07",X"00",X"FD",X"09", + X"C1",X"10",X"E8",X"18",X"E0",X"FD",X"7E",X"01",X"CB",X"BF",X"FD",X"77",X"02",X"FD",X"7E",X"00", + X"FD",X"CB",X"01",X"7E",X"20",X"0B",X"FE",X"02",X"28",X"0B",X"FD",X"CB",X"01",X"BE",X"3C",X"18", + X"09",X"FE",X"00",X"28",X"F5",X"FD",X"CB",X"01",X"FE",X"3D",X"FD",X"77",X"00",X"FD",X"6E",X"03", + X"FD",X"66",X"04",X"FD",X"5E",X"05",X"FD",X"56",X"06",X"0E",X"02",X"D5",X"E5",X"06",X"0F",X"C5", + X"1A",X"47",X"B7",X"28",X"45",X"E6",X"F0",X"28",X"41",X"FE",X"70",X"30",X"3D",X"D5",X"E5",X"FE", + X"60",X"20",X"14",X"1E",X"06",X"0E",X"21",X"FD",X"7E",X"00",X"87",X"87",X"81",X"E1",X"E5",X"01", + X"02",X"02",X"CD",X"1E",X"3D",X"18",X"21",X"FE",X"50",X"20",X"06",X"1E",X"05",X"0E",X"D0",X"18", + X"E6",X"CD",X"4B",X"0F",X"D5",X"FD",X"7E",X"00",X"21",X"53",X"87",X"CD",X"E1",X"3D",X"D5",X"DD", + X"E1",X"D1",X"E1",X"E5",X"78",X"CD",X"50",X"89",X"E1",X"D1",X"C1",X"13",X"23",X"23",X"10",X"AF", + X"E1",X"11",X"C0",X"01",X"19",X"D1",X"C5",X"EB",X"01",X"69",X"00",X"09",X"EB",X"C1",X"0D",X"C2", + X"EB",X"86",X"C9",X"FB",X"89",X"27",X"8A",X"53",X"8A",X"01",X"01",X"05",X"41",X"40",X"30",X"48", + X"01",X"82",X"03",X"81",X"40",X"3F",X"48",X"01",X"01",X"01",X"C1",X"40",X"4E",X"48",X"01",X"82", + X"04",X"01",X"41",X"5D",X"48",X"01",X"01",X"02",X"41",X"41",X"6C",X"48",X"01",X"82",X"03",X"81", + X"41",X"7B",X"48",X"01",X"01",X"04",X"C1",X"41",X"8A",X"48",X"01",X"02",X"02",X"41",X"40",X"30", + X"48",X"01",X"02",X"02",X"81",X"40",X"3F",X"48",X"01",X"02",X"02",X"C1",X"40",X"4E",X"48",X"01", + X"02",X"02",X"01",X"41",X"5D",X"48",X"01",X"02",X"02",X"41",X"41",X"6C",X"48",X"01",X"02",X"02", + X"81",X"41",X"7B",X"48",X"01",X"02",X"02",X"C1",X"41",X"8A",X"48",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"20",X"4B",X"06",X"28",X"CF",X"3E",X"08",X"32",X"20",X"4B",X"DD",X"21",X"21",X"4B",X"FD", + X"7E",X"0A",X"CD",X"EB",X"3D",X"CB",X"FF",X"DD",X"77",X"00",X"FD",X"7E",X"01",X"DD",X"77",X"01", + X"FD",X"7E",X"03",X"DD",X"77",X"03",X"CD",X"78",X"88",X"DD",X"77",X"04",X"CD",X"9B",X"88",X"28", + X"51",X"DD",X"77",X"02",X"47",X"3A",X"20",X"4B",X"3D",X"CA",X"6B",X"88",X"32",X"20",X"4B",X"FE", + X"07",X"30",X"11",X"FD",X"7E",X"0F",X"DD",X"BE",X"01",X"20",X"09",X"FD",X"7E",X"10",X"DD",X"BE", + X"03",X"CA",X"6B",X"88",X"78",X"2F",X"E6",X"0F",X"DD",X"A6",X"04",X"DD",X"77",X"04",X"78",X"DD", + X"66",X"01",X"DD",X"6E",X"03",X"CD",X"F7",X"3D",X"CD",X"37",X"89",X"DD",X"74",X"06",X"DD",X"75", + X"08",X"DD",X"7E",X"02",X"DD",X"77",X"05",X"DD",X"36",X"07",X"00",X"01",X"05",X"00",X"DD",X"09", + X"18",X"A4",X"DD",X"CB",X"00",X"7E",X"20",X"2D",X"DD",X"7E",X"00",X"E6",X"0F",X"2F",X"E6",X"0F", + X"DD",X"A6",X"FF",X"DD",X"77",X"FF",X"DD",X"E5",X"E1",X"06",X"05",X"CF",X"01",X"FB",X"FF",X"DD", + X"09",X"3A",X"20",X"4B",X"3C",X"32",X"20",X"4B",X"C3",X"EC",X"87",X"3A",X"23",X"4B",X"FD",X"36", + X"11",X"10",X"C3",X"5E",X"23",X"C3",X"14",X"23",X"DD",X"66",X"01",X"DD",X"6E",X"03",X"CD",X"9E", + X"0F",X"FE",X"FF",X"28",X"14",X"E6",X"F0",X"28",X"04",X"FE",X"80",X"20",X"0C",X"7E",X"E6",X"0F", + X"21",X"4E",X"81",X"16",X"00",X"5F",X"19",X"7E",X"C9",X"AF",X"C9",X"3E",X"05",X"DD",X"A6",X"00", + X"20",X"3E",X"FD",X"7E",X"03",X"FD",X"BE",X"10",X"20",X"28",X"3E",X"02",X"FD",X"BE",X"08",X"20", + X"18",X"DD",X"CB",X"00",X"4E",X"28",X"0A",X"DD",X"7E",X"01",X"FD",X"BE",X"0F",X"38",X"0A",X"18", + X"11",X"DD",X"7E",X"01",X"FD",X"BE",X"0F",X"38",X"09",X"DD",X"7E",X"00",X"E6",X"0F",X"DD",X"A6", + X"04",X"C0",X"06",X"01",X"FD",X"7E",X"03",X"FD",X"BE",X"10",X"30",X"40",X"06",X"04",X"18",X"3C", + X"FD",X"7E",X"01",X"FD",X"BE",X"0F",X"20",X"28",X"3E",X"02",X"FD",X"BE",X"08",X"20",X"18",X"DD", + X"CB",X"00",X"46",X"20",X"0A",X"DD",X"7E",X"03",X"FD",X"BE",X"10",X"38",X"0A",X"18",X"11",X"DD", + X"7E",X"03",X"FD",X"BE",X"10",X"38",X"09",X"DD",X"7E",X"00",X"E6",X"0F",X"DD",X"A6",X"04",X"C0", + X"06",X"02",X"FD",X"7E",X"01",X"FD",X"BE",X"0F",X"38",X"02",X"06",X"08",X"78",X"DD",X"A6",X"04", + X"C0",X"DD",X"7E",X"00",X"E6",X"0F",X"DD",X"A6",X"04",X"C0",X"78",X"CD",X"F7",X"3D",X"EE",X"02", + X"CD",X"EB",X"3D",X"DD",X"A6",X"04",X"C9",X"E5",X"21",X"61",X"26",X"CD",X"E1",X"3D",X"E1",X"D5", + X"C1",X"CD",X"83",X"3D",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E6",X"0F",X"3D",X"87",X"87",X"06",X"00",X"4F",X"DD",X"09",X"01",X"02",X"02",X"C5",X"E5",X"DD", + X"7E",X"00",X"77",X"CB",X"D4",X"73",X"CB",X"94",X"23",X"DD",X"23",X"10",X"F2",X"E1",X"01",X"20", + X"00",X"09",X"C1",X"0D",X"20",X"E7",X"C9",X"61",X"60",X"62",X"63",X"64",X"67",X"65",X"66",X"68", + X"69",X"6A",X"6B",X"6C",X"6D",X"6E",X"6F",X"70",X"70",X"71",X"71",X"73",X"72",X"73",X"72",X"70", + X"70",X"6A",X"63",X"6C",X"67",X"71",X"71",X"6C",X"72",X"6A",X"72",X"73",X"67",X"73",X"63",X"6C", + X"67",X"6A",X"63",X"82",X"79",X"7E",X"77",X"7C",X"75",X"80",X"7B",X"78",X"83",X"76",X"7F",X"74", + X"7D",X"7A",X"81",X"78",X"79",X"7A",X"7B",X"7C",X"7D",X"7E",X"7F",X"78",X"79",X"76",X"77",X"74", + X"75",X"7A",X"7B",X"74",X"7D",X"76",X"7F",X"7C",X"75",X"7E",X"77",X"74",X"75",X"76",X"77",X"92", + X"89",X"8E",X"87",X"8C",X"85",X"90",X"8B",X"88",X"93",X"86",X"8F",X"84",X"8D",X"8A",X"91",X"88", + X"89",X"8A",X"8B",X"8C",X"8D",X"8E",X"8F",X"88",X"89",X"86",X"87",X"84",X"85",X"8A",X"8B",X"84", + X"8D",X"86",X"8F",X"8C",X"85",X"8E",X"87",X"84",X"85",X"86",X"87",X"9A",X"95",X"9C",X"97",X"9A", + X"95",X"9F",X"99",X"94",X"9B",X"96",X"9D",X"94",X"9B",X"98",X"9E",X"94",X"95",X"98",X"99",X"9A", + X"9B",X"9C",X"9D",X"94",X"95",X"96",X"97",X"94",X"95",X"98",X"99",X"94",X"9B",X"96",X"9D",X"9A", + X"95",X"9C",X"97",X"94",X"95",X"96",X"97",X"AE",X"A5",X"AA",X"A3",X"A8",X"A1",X"AF",X"A7",X"A4", + X"AC",X"A2",X"AB",X"A0",X"A9",X"A6",X"AD",X"A4",X"A5",X"A6",X"A7",X"A8",X"A9",X"AA",X"AB",X"A4", + X"A5",X"A2",X"A3",X"A0",X"A1",X"A6",X"A7",X"A0",X"A9",X"A2",X"AB",X"A8",X"A1",X"AA",X"A3",X"A0", + X"A1",X"A2",X"A3",X"BB",X"B5",X"B8",X"B3",X"B6",X"B1",X"B8",X"B3",X"B4",X"BA",X"B2",X"B9",X"B0", + X"B7",X"B2",X"B9",X"B4",X"B5",X"B2",X"B3",X"B6",X"B7",X"B8",X"B9",X"B4",X"B5",X"B2",X"B3",X"B0", + X"B1",X"B2",X"B3",X"B6",X"B7",X"B2",X"B9",X"B6",X"B1",X"B8",X"B3",X"B0",X"B1",X"B2",X"B3",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"11",X"0F",X"48",X"3A",X"01",X"48",X"CB",X"6F",X"28",X"03",X"11",X"15",X"48",X"06",X"1E",X"21", + X"60",X"4C",X"0E",X"01",X"C5",X"E5",X"D5",X"06",X"06",X"CD",X"71",X"3D",X"D1",X"E1",X"C1",X"FE", + X"02",X"28",X"0A",X"C5",X"01",X"08",X"00",X"09",X"C1",X"0C",X"10",X"E8",X"C9",X"79",X"F5",X"FE", + X"1E",X"28",X"19",X"3E",X"1E",X"91",X"21",X"08",X"00",X"3D",X"28",X"06",X"01",X"08",X"00",X"09", + X"18",X"F7",X"E5",X"C1",X"21",X"47",X"4D",X"11",X"4F",X"4D",X"ED",X"B8",X"F1",X"F5",X"3D",X"21", + X"60",X"4C",X"4F",X"87",X"87",X"87",X"06",X"00",X"4F",X"09",X"11",X"0F",X"48",X"3A",X"01",X"48", + X"CB",X"6F",X"28",X"03",X"11",X"15",X"48",X"EB",X"01",X"06",X"00",X"ED",X"B0",X"EB",X"3A",X"E8", + X"49",X"77",X"23",X"3A",X"E9",X"49",X"77",X"DD",X"21",X"0D",X"8C",X"CD",X"B2",X"3C",X"DD",X"21", + X"2C",X"8C",X"CD",X"B2",X"3C",X"3E",X"23",X"06",X"30",X"FF",X"F1",X"F5",X"21",X"00",X"01",X"22", + X"14",X"4A",X"21",X"60",X"4C",X"FE",X"0B",X"38",X"14",X"11",X"50",X"00",X"19",X"D6",X"0A",X"E5", + X"2A",X"14",X"4A",X"11",X"01",X"00",X"19",X"22",X"14",X"4A",X"E1",X"18",X"E8",X"CD",X"A9",X"8B", + X"F1",X"FE",X"0B",X"38",X"04",X"D6",X"0A",X"18",X"F8",X"21",X"D6",X"44",X"3D",X"28",X"04",X"2B", + X"2B",X"18",X"F9",X"06",X"3C",X"1E",X"0B",X"C5",X"E5",X"06",X"13",X"73",X"CD",X"4D",X"3D",X"10", + X"FA",X"3E",X"23",X"06",X"03",X"FF",X"1C",X"7B",X"FE",X"10",X"38",X"02",X"1E",X"0B",X"E1",X"C1", + X"10",X"E5",X"C9",X"DD",X"21",X"0D",X"8C",X"CD",X"B2",X"3C",X"DD",X"21",X"2C",X"8C",X"CD",X"B2", + X"3C",X"21",X"00",X"01",X"22",X"14",X"4A",X"21",X"60",X"4C",X"CD",X"A9",X"8B",X"3E",X"23",X"06", + X"80",X"FF",X"21",X"B0",X"4C",X"CD",X"A9",X"8B",X"3E",X"23",X"06",X"80",X"FF",X"21",X"00",X"4D", + X"CD",X"A9",X"8B",X"3E",X"23",X"06",X"80",X"FF",X"C9",X"E5",X"DD",X"E1",X"21",X"F6",X"40",X"06", + X"0A",X"C5",X"DD",X"E5",X"E5",X"DD",X"21",X"14",X"4A",X"1E",X"0C",X"06",X"02",X"0E",X"00",X"CD", + X"8A",X"3D",X"E1",X"DD",X"E1",X"DD",X"E5",X"E5",X"01",X"C0",X"00",X"09",X"1E",X"0D",X"06",X"06", + X"0E",X"00",X"CD",X"8A",X"3D",X"E1",X"DD",X"E1",X"DD",X"E5",X"E5",X"01",X"00",X"02",X"09",X"01", + X"06",X"00",X"DD",X"09",X"1E",X"0A",X"06",X"02",X"0E",X"00",X"CD",X"8A",X"3D",X"3E",X"23",X"06", + X"02",X"FF",X"11",X"15",X"4A",X"21",X"0C",X"8C",X"06",X"02",X"CD",X"54",X"3D",X"E1",X"DD",X"E1", + X"2B",X"2B",X"01",X"08",X"00",X"DD",X"09",X"C1",X"10",X"A7",X"C9",X"00",X"01",X"00",X"18",X"9C", + X"40",X"00",X"0B",X"54",X"4F",X"44",X"41",X"59",X"3B",X"53",X"20",X"48",X"49",X"5F",X"53",X"43", + X"4F",X"52",X"45",X"20",X"42",X"45",X"53",X"54",X"20",X"33",X"30",X"00",X"00",X"05",X"D8",X"40", + X"00",X"0C",X"4F",X"52",X"44",X"45",X"52",X"05",X"D8",X"41",X"00",X"0D",X"53",X"43",X"4F",X"52", + X"45",X"05",X"D8",X"42",X"00",X"0A",X"4C",X"45",X"56",X"45",X"4C",X"00",X"FF",X"FF",X"FF",X"FF", + X"31",X"20",X"4F",X"21",X"50",X"4D",X"06",X"1E",X"CF",X"1E",X"3C",X"3E",X"23",X"06",X"01",X"FF", + X"3A",X"01",X"48",X"CB",X"57",X"20",X"0C",X"1D",X"20",X"09",X"1E",X"3C",X"3A",X"DC",X"49",X"3C", + X"32",X"DC",X"49",X"D5",X"FD",X"21",X"50",X"4D",X"06",X"05",X"C5",X"FD",X"7E",X"00",X"FD",X"B6", + X"01",X"C4",X"90",X"8C",X"01",X"06",X"00",X"FD",X"09",X"C1",X"10",X"EE",X"D1",X"C3",X"5B",X"8C", + X"FD",X"7E",X"03",X"B7",X"28",X"04",X"FD",X"35",X"03",X"C9",X"FD",X"36",X"03",X"04",X"FD",X"6E", + X"00",X"FD",X"66",X"01",X"01",X"02",X"02",X"FD",X"7E",X"02",X"FE",X"00",X"20",X"2E",X"3A",X"02", + X"48",X"CB",X"77",X"C2",X"EF",X"8C",X"3A",X"02",X"48",X"CB",X"47",X"28",X"0C",X"3E",X"14",X"CB", + X"D4",X"5E",X"CB",X"94",X"CD",X"1E",X"3D",X"18",X"0C",X"FD",X"7E",X"04",X"1E",X"03",X"DD",X"21", + X"77",X"89",X"CD",X"50",X"89",X"FD",X"E5",X"E1",X"06",X"06",X"CF",X"C9",X"CB",X"D4",X"5E",X"CB", + X"94",X"FD",X"7E",X"02",X"F5",X"CD",X"1E",X"3D",X"F1",X"D6",X"04",X"FD",X"77",X"02",X"C9",X"E5", + X"FD",X"7E",X"04",X"E6",X"0F",X"21",X"60",X"8D",X"CD",X"E1",X"3D",X"E1",X"7A",X"CD",X"1E",X"3D", + X"18",X"D3",X"FD",X"21",X"50",X"4D",X"06",X"05",X"FD",X"7E",X"00",X"FD",X"B6",X"01",X"28",X"08", + X"11",X"06",X"00",X"FD",X"19",X"10",X"F1",X"C9",X"FD",X"75",X"00",X"FD",X"74",X"01",X"FD",X"71", + X"04",X"FD",X"36",X"02",X"0C",X"79",X"0E",X"04",X"FE",X"50",X"38",X"02",X"0E",X"10",X"21",X"59", + X"8D",X"3A",X"02",X"48",X"CB",X"47",X"28",X"11",X"21",X"5F",X"8D",X"79",X"E5",X"16",X"00",X"1E", + X"00",X"CD",X"20",X"2C",X"E1",X"CD",X"04",X"3E",X"C9",X"E5",X"C5",X"3E",X"04",X"CD",X"8E",X"2C", + X"C1",X"E1",X"18",X"E7",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"05",X"00",X"00", + X"11",X"E0",X"12",X"E4",X"13",X"E8",X"11",X"DC",X"13",X"E0",X"12",X"E4",X"15",X"E8",X"00",X"00", + X"11",X"EC",X"16",X"E4",X"12",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/VanVanCar.sv b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/VanVanCar.sv new file mode 100644 index 00000000..e1ee9579 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/VanVanCar.sv @@ -0,0 +1,204 @@ +//============================================================================ +// Arcade: Van Van Car +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module VanVanCar +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Van Van Car;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + +reg ce_4m; +always @(posedge clk_sys) begin + reg [2:0] div; + + div <= div + 1'd1; + if(div == 5) div <= 0; + ce_4m <= !div; +end + + + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [8:0] audio; +assign LED = 1; + +wire hblank, vblank; +wire ce_vid = ce_6m; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + + +video_mixer #(.LINE_LENGTH(492), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_vid), + .ce_pix_actual(ce_vid), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + +vanvan vanvan +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .in0_reg(~{2'b00, m_coin, m_fire, m_down,m_right,m_left,m_up}), + .in1_reg(~{1'b0, m_start2, m_start1, 5'b00000}), + + .dipsw1_reg(8'b11_00_10_0_0), + .dipsw2_reg(8'b00000000), + + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m), + .ENA_4(ce_4m) +); + + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio[7:0]), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +endmodule diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_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/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/build_id.v new file mode 100644 index 00000000..dfd21773 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "180103" +`define BUILD_TIME "175540" diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/dac.vhd new file mode 100644 index 00000000..83d1861e --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_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/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_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/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_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/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/osd.v b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_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/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/pll.qip new file mode 100644 index 00000000..48665362 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_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 VHDL_FILE [file join $::quartus(qip_path) "pll.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/pll.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/pll.vhd new file mode 100644 index 00000000..3c952a1a --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/pll.vhd @@ -0,0 +1,365 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC ; + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + locked <= sub_wire0; + sub_wire2 <= sub_wire1(0); + c0 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 9, + clk0_duty_cycle => 50, + clk0_multiply_by => 8, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_UNUSED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire4, + locked => sub_wire0, + clk => sub_wire1 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "9" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +-- 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 "1" +-- 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- 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: 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_CLKENA0 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 "9" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +-- Retrieval info: CONSTANT: CLK0_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_USED" +-- 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_USED" +-- 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_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- 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: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..eba1d598 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_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/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/COPYING b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/COPYING new file mode 100644 index 00000000..60549be5 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/README b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/README new file mode 100644 index 00000000..33630144 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/README @@ -0,0 +1,143 @@ + +An SN76489AN Compatible Implementation in VHDL +============================================== +Version: $Date: 2006/06/18 19:28:40 $ + +Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +See the file COPYING. + + +Integration +----------- + +The sn76489 design exhibits all interface signals as the original chip. It +only differs in the audio data output which is provided as an 8 bit signed +vector instead of an analog output pin. + + generic ( + clock_div_16_g : integer := 1 + -- Set to '1' when operating the design in SN76489 mode. The primary clock + -- input is divided by 16 in this variant. The data sheet mentions the + -- SN76494 which contains a divide-by-2 clock input stage. Set the generic + -- to '0' to enable this mode. + ); + port ( + clock_i : in std_logic; + -- Primary clock input + -- Drive with the target frequency or any integer multiple of it. + + clock_en_i : in std_logic; + -- Clock enable + -- A '1' on this input qualifies a valid rising edge on clock_i. A '0' + -- disables the next rising clock edge, effectivley halting the design + -- until the next enabled rising clock edge. + -- Can be used to run the core at lower frequencies than applied on + -- clock_i. + + res_n_i : in std_logic; + -- Asynchronous low active reset input. + -- Sets all sequential elements to a known state. + + ce_n_i : in std_logic; + -- Chip enable, low active. + + we_n_i : in std_logic; + -- Write enable, low active. + + ready_o : out std_logic; + -- Ready indication to microprocessor. + + d_i : in std_logic_vector(0 to 7); + -- Data input + -- MSB 0 ... 7 LSB + + aout_o : out signed(0 to 7) + -- Audio output, signed vector + -- MSB/SIGN 0 ... 7 LSB + ); + + +Both 8 bit vector ports are defined (0 to 7) which declares bit 0 to be the +MSB and bit 7 to be the LSB. This has been implemented according to TI's data +sheet, thus all register/data format figures apply 1:1 for this design. +Many systems will flip the system data bus bit wise before it is connected to +this PSG. This is simply achieved with the following VHDL construct: + + signal data_s : std_logic_vector(7 downto 0); + + ... + d_i => data_s, + ... + +d_i and data_s will be assigned from left to right, resulting in the expected +bit assignment: + + d_i data_s + 0 7 + 1 6 + ... + 6 1 + 7 0 + + +As this design is fully synchronous, care has to be taken when the design +replaces an SN76489 in asynchronous mode. No problems are expected when +interfacing the code to other synchronous components. + + +Design Hierarchy +---------------- + + sn76489_top + | + +-- sn76489_latch_ctrl + | + +-- sn76489_clock_div + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + +-- sn76489_tone + | | + | \-- sn76489_attentuator + | + \-- sn76489_noise + | + \-- sn76489_attentuator + +Resulting compilation sequence: + + sn76489_comp_pack-p.vhd + sn76489_top.vhd + sn76489_latch_ctrl.vhd + sn76489_latch_ctrl-c.vhd + sn76489_clock_div.vhd + sn76489_clock_div-c.vhd + sn76489_attenuator.vhd + sn76489_attenuator-c.vhd + sn76489_tone.vhd + sn76489_tone-c.vhd + sn76489_noise.vhd + sn76489_noise-c.vhd + sn76489_top-c.vhd + +Skip the files containing VHDL configurations when analyzing the code for +synthesis. + + +References +---------- + +* TI Data sheet SN76489.pdf + ftp://ftp.whtech.com/datasheets%20&%20manuals/SN76489.pdf + +* John Kortink's article on the SN76489: + http://web.inter.nl.net/users/J.Kortink/home/articles/sn76489/ + +* Maxim's "SN76489 notes" in + http://www.smspower.org/maxim/docs/SN76489.txt diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_attenuator.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_attenuator.vhd new file mode 100644 index 00000000..444064e5 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_attenuator.vhd @@ -0,0 +1,114 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_attenuator.vhd,v 1.7 2006/02/27 20:30:10 arnim Exp $ +-- +-- Attenuator Module +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_attenuator is + + port ( + attenuation_i : in std_logic_vector(0 to 3); + factor_i : in signed(0 to 1); + product_o : out signed(0 to 7) + ); + +end sn76489_attenuator; + + +architecture rtl of sn76489_attenuator is + +begin + + ----------------------------------------------------------------------------- + -- Process attenuate + -- + -- Purpose: + -- Determine the attenuation and generate the resulting product. + -- + -- The maximum attenuation value is 31 which corresponds to volume off. + -- As described in the data sheet, the maximum "playing" attenuation is + -- 28 = 16 + 8 + 4 + -- + -- The table for the volume constants is derived from the following + -- formula (each step is 2dB voltage): + -- v(0) = 31 + -- v(n+1) = v(n) * 0.79432823 + -- + attenuate: process (attenuation_i, + factor_i) + + type volume_t is array (natural range 0 to 15) of natural; + constant volume_c : volume_t := + (31, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3, 2, 2, 2, 1, 0); + + variable attenuation_v : unsigned(attenuation_i'range); + variable volume_v : signed(product_o'range); + + begin + + attenuation_v := unsigned(attenuation_i); + + -- volume look-up table + volume_v := to_signed(volume_c(to_integer(attenuation_v)), + product_o'length); + + -- this replaces a multiplier and consumes a bit fewer + -- resources + case to_integer(factor_i) is + when +1 => + product_o <= volume_v; + when -1 => + product_o <= -volume_v; + when others => + product_o <= (others => '0'); + end case; + + end process attenuate; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_clock_div.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_clock_div.vhd new file mode 100644 index 00000000..eab86beb --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_clock_div.vhd @@ -0,0 +1,134 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_clock_div.vhd,v 1.4 2005/10/10 21:51:27 arnim Exp $ +-- +-- Clock Divider Circuit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity sn76489_clock_div is + + generic ( + clock_div_16_g : integer := 1 + ); + port ( + clock_i : in std_logic; + clock_en_i : in std_logic; + res_n_i : in std_logic; + clk_en_o : out boolean + ); + +end sn76489_clock_div; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of sn76489_clock_div is + + signal cnt_s, + cnt_q : unsigned(3 downto 0); + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the sequential counter element. + -- + seq: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + cnt_q <= (others => '0'); + elsif clock_i'event and clock_i = '1' then + cnt_q <= cnt_s; + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process comb + -- + -- Purpose: + -- Implements the combinational counter logic. + -- + comb: process (clock_en_i, + cnt_q) + begin + -- default assignments + cnt_s <= cnt_q; + clk_en_o <= false; + + if clock_en_i = '1' then + + if cnt_q = 0 then + clk_en_o <= true; + + if clock_div_16_g = 1 then + cnt_s <= to_unsigned(15, cnt_q'length); + elsif clock_div_16_g = 0 then + cnt_s <= to_unsigned( 1, cnt_q'length); + else + -- pragma translate_off + assert false + report "Generic clock_div_16_g must be either 0 or 1." + severity failure; + -- pragma translate_on + end if; + + else + cnt_s <= cnt_q - 1; + + end if; + + end if; + + end process comb; + -- + ----------------------------------------------------------------------------- + +end rtl; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_latch_ctrl.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_latch_ctrl.vhd new file mode 100644 index 00000000..789720c2 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_latch_ctrl.vhd @@ -0,0 +1,138 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_latch_ctrl.vhd,v 1.6 2006/02/27 20:30:10 arnim Exp $ +-- +-- Latch Control Unit +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity sn76489_latch_ctrl is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + ce_n_i : in std_logic; + we_n_i : in std_logic; + d_i : in std_logic_vector(0 to 7); + ready_o : out std_logic; + tone1_we_o : out boolean; + tone2_we_o : out boolean; + tone3_we_o : out boolean; + noise_we_o : out boolean; + r2_o : out std_logic + ); + +end sn76489_latch_ctrl; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of sn76489_latch_ctrl is + + signal reg_q : std_logic_vector(0 to 2); + signal we_q : boolean; + signal ready_q : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Process seq + -- + -- Purpose: + -- Implements the sequential elements. + -- + seq: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + reg_q <= (others => '0'); + we_q <= false; + ready_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + -- READY Flag Output ---------------------------------------------------- + if ready_q = '0' and we_q then + if clk_en_i then + -- assert READY when write access happened + ready_q <= '1'; + end if; + elsif ce_n_i = '1' then + -- deassert READY when access has finished + ready_q <= '0'; + end if; + + -- Register Selection --------------------------------------------------- + if ce_n_i = '0' and we_n_i = '0' then + if clk_en_i then + if d_i(0) = '1' then + reg_q <= d_i(1 to 3); + end if; + we_q <= true; + end if; + else + we_q <= false; + end if; + + end if; + end process seq; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Output mapping + ----------------------------------------------------------------------------- + tone1_we_o <= reg_q(0 to 1) = "00" and we_q; + tone2_we_o <= reg_q(0 to 1) = "01" and we_q; + tone3_we_o <= reg_q(0 to 1) = "10" and we_q; + noise_we_o <= reg_q(0 to 1) = "11" and we_q; + + r2_o <= reg_q(2); + + ready_o <= ready_q + when ce_n_i = '0' else + '1'; + +end rtl; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_noise.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_noise.vhd new file mode 100644 index 00000000..688bdd56 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_noise.vhd @@ -0,0 +1,278 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_noise.vhd,v 1.6 2006/02/27 20:30:10 arnim Exp $ +-- +-- Noise Generator +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_noise is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + we_i : in boolean; + d_i : in std_logic_vector(0 to 7); + r2_i : in std_logic; + tone3_ff_i : in std_logic; + noise_o : out signed(0 to 7) + ); + +end sn76489_noise; + +architecture rtl of sn76489_noise is + + signal nf_q : std_logic_vector(0 to 1); + signal fb_q : std_logic; + signal a_q : std_logic_vector(0 to 3); + signal freq_cnt_q : unsigned(0 to 6); + signal freq_ff_q : std_logic; + + signal shift_source_s, + shift_source_q : std_logic; + signal shift_rise_edge_s : boolean; + + signal lfsr_q : std_logic_vector(0 to 15); + + signal freq_s : signed(0 to 1); + +begin + + ----------------------------------------------------------------------------- + -- Process cpu_regs + -- + -- Purpose: + -- Implements the registers writable by the CPU. + -- + cpu_regs: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + nf_q <= (others => '0'); + fb_q <= '0'; + a_q <= (others => '1'); + + elsif clock_i'event and clock_i = '1' then + if clk_en_i and we_i then + if r2_i = '0' then + -- access to control register + -- both access types can write to the control register! + nf_q <= d_i(6 to 7); + fb_q <= d_i(5); + + else + -- access to attenuator register + -- both access types can write to the attenuator register! + a_q <= d_i(4 to 7); + + end if; + end if; + end if; + end process cpu_regs; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process freq_gen + -- + -- Purpose: + -- Implements the frequency generation components. + -- + freq_gen: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + freq_cnt_q <= (others => '0'); + freq_ff_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if freq_cnt_q = 0 then + -- reload frequency counter according to NF setting + case nf_q is + when "00" => + freq_cnt_q <= to_unsigned(16 * 2 - 1, freq_cnt_q'length); + when "01" => + freq_cnt_q <= to_unsigned(16 * 4 - 1, freq_cnt_q'length); + when "10" => + freq_cnt_q <= to_unsigned(16 * 8 - 1, freq_cnt_q'length); + when others => + null; + end case; + + freq_ff_q <= not freq_ff_q; + + else + -- decrement frequency counter + freq_cnt_q <= freq_cnt_q - 1; + + end if; + + end if; + end if; + end process freq_gen; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Multiplex the source of the LFSR's shift enable + ----------------------------------------------------------------------------- + shift_source_s <= tone3_ff_i + when nf_q = "11" else + freq_ff_q; + + ----------------------------------------------------------------------------- + -- Process rise_edge + -- + -- Purpose: + -- Detect the rising edge of the selected LFSR shift source. + -- + rise_edge: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + shift_source_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + shift_source_q <= shift_source_s; + end if; + end if; + end process rise_edge; + -- + ----------------------------------------------------------------------------- + + -- detect rising edge on shift source + shift_rise_edge_s <= shift_source_q = '0' and shift_source_s = '1'; + + + ----------------------------------------------------------------------------- + -- Process lfsr + -- + -- Purpose: + -- Implements the LFSR that generates noise. + -- Note: This implementation shifts the register right, i.e. from index + -- 15 towards 0 => bit 15 is the input, bit 0 is the output + -- + -- Tapped bits according to MAME's sn76496.c, implemented in function + -- lfsr_tapped_f. + -- + lfsr: process (clock_i, res_n_i) + + function lfsr_tapped_f(lfsr : in std_logic_vector) return std_logic is + constant tapped_bits_c : std_logic_vector(0 to 15) + -- tapped bits are 0, 2, 15 + := "1010000000000001"; + variable parity_v : std_logic; + begin + parity_v := '0'; + + for idx in lfsr'low to lfsr'high loop + parity_v := parity_v xor (lfsr(idx) and tapped_bits_c(idx)); + end loop; + + return parity_v; + end; + + begin + if res_n_i = '0' then + -- reset LFSR to "0000000000000001" + lfsr_q <= (others => '0'); + lfsr_q(lfsr_q'right) <= '1'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if we_i and r2_i = '0' then + -- write to noise register + -- -> reset LFSR + lfsr_q <= (others => '0'); + lfsr_q(lfsr_q'right) <= '1'; + + elsif shift_rise_edge_s then + + -- shift LFSR left towards MSB + for idx in lfsr_q'right-1 downto lfsr_q'left loop + lfsr_q(idx) <= lfsr_q(idx+1); + end loop; + + -- determine input bit + if fb_q = '0' then + -- "Periodic" Noise + -- -> input to LFSR is output + lfsr_q(lfsr_q'right) <= lfsr_q(lfsr_q'left); + else + -- "White" Noise + -- -> input to LFSR is parity of tapped bits + lfsr_q(lfsr_q'right) <= lfsr_tapped_f(lfsr_q); + end if; + + end if; + + end if; + end if; + end process lfsr; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Map output of LFSR to signed value for attenuator. + ----------------------------------------------------------------------------- + freq_s <= to_signed(+1, 2) + when lfsr_q(0) = '1' else + to_signed( 0, 2); + + + ----------------------------------------------------------------------------- + -- The attenuator itself + ----------------------------------------------------------------------------- + attenuator_b : entity work.sn76489_attenuator + port map ( + attenuation_i => a_q, + factor_i => freq_s, + product_o => noise_o + ); + +end rtl; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_tone.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_tone.vhd new file mode 100644 index 00000000..3658efcc --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_tone.vhd @@ -0,0 +1,188 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_tone.vhd,v 1.5 2006/02/27 20:30:10 arnim Exp $ +-- +-- Tone Generator +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sn76489_tone is + + port ( + clock_i : in std_logic; + clk_en_i : in boolean; + res_n_i : in std_logic; + we_i : in boolean; + d_i : in std_logic_vector(0 to 7); + r2_i : in std_logic; + ff_o : out std_logic; + tone_o : out signed(0 to 7) + ); + +end sn76489_tone; + +architecture rtl of sn76489_tone is + + signal f_q : std_logic_vector(0 to 9); + signal a_q : std_logic_vector(0 to 3); + signal freq_cnt_q : unsigned(0 to 9); + signal freq_ff_q : std_logic; + + signal freq_s : signed(0 to 1); + + function all_zero(a : in std_logic_vector) return boolean is + variable result_v : boolean; + begin + result_v := true; + + for idx in a'low to a'high loop + if a(idx) /= '0' then + result_v := false; + end if; + end loop; + + return result_v; + end; + +begin + + ----------------------------------------------------------------------------- + -- Process cpu_regs + -- + -- Purpose: + -- Implements the registers writable by the CPU. + -- + cpu_regs: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + f_q <= (others => '0'); + a_q <= (others => '1'); + + elsif clock_i'event and clock_i = '1' then + if clk_en_i and we_i then + if r2_i = '0' then + -- access to frequency register + if d_i(0) = '0' then + f_q(0 to 5) <= d_i(2 to 7); + else + f_q(6 to 9) <= d_i(4 to 7); + end if; + + else + -- access to attenuator register + -- both access types can write to the attenuator register! + a_q <= d_i(4 to 7); + + end if; + end if; + end if; + end process cpu_regs; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process freq_gen + -- + -- Purpose: + -- Implements the frequency generation components. + -- + freq_gen: process (clock_i, res_n_i) + begin + if res_n_i = '0' then + freq_cnt_q <= (others => '0'); + freq_ff_q <= '0'; + + elsif clock_i'event and clock_i = '1' then + if clk_en_i then + if freq_cnt_q = 0 then + -- update counter from frequency register + freq_cnt_q <= unsigned(f_q); + + -- and toggle the frequency flip-flop if enabled + if not all_zero(f_q) then + freq_ff_q <= not freq_ff_q; + else + -- if frequency setting is 0, then keep flip-flop at +1 + freq_ff_q <= '1'; + end if; + + else + -- decrement frequency counter + freq_cnt_q <= freq_cnt_q - 1; + + end if; + end if; + end if; + end process freq_gen; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Map frequency flip-flop to signed value for attenuator. + ----------------------------------------------------------------------------- + freq_s <= to_signed(+1, 2) + when freq_ff_q = '1' else + to_signed(-1, 2); + + + ----------------------------------------------------------------------------- + -- The attenuator itself + ----------------------------------------------------------------------------- + attenuator_b : entity work.sn76489_attenuator + port map ( + attenuation_i => a_q, + factor_i => freq_s, + product_o => tone_o + ); + + + ----------------------------------------------------------------------------- + -- Output mapping + ----------------------------------------------------------------------------- + ff_o <= freq_ff_q; + +end rtl; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_top.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_top.vhd new file mode 100644 index 00000000..c26d0e1a --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/sn76489/sn76489_top.vhd @@ -0,0 +1,200 @@ +------------------------------------------------------------------------------- +-- +-- Synthesizable model of TI's SN76489AN. +-- +-- $Id: sn76489_top.vhd,v 1.9 2006/02/27 20:30:10 arnim Exp $ +-- +-- Chip Toplevel +-- +-- References: +-- +-- * TI Data sheet SN76489.pdf +-- ftp://ftp.whtech.com/datasheets%20&%20manuals/SN76489.pdf +-- +-- * John Kortink's article on the SN76489: +-- http://web.inter.nl.net/users/J.Kortink/home/articles/sn76489/ +-- +-- * Maxim's "SN76489 notes" in +-- http://www.smspower.org/maxim/docs/SN76489.txt +-- +------------------------------------------------------------------------------- +-- +-- Copyright (c) 2005, 2006, Arnim Laeuger (arnim.laeuger@gmx.net) +-- +-- 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. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library ieee; +use ieee.numeric_std.all; + +entity sn76489_top is + + generic ( + clock_div_16_g : integer := 1 + ); + port ( + clock_i : in std_logic; + clock_en_i : in std_logic; + res_n_i : in std_logic; + ce_n_i : in std_logic; + we_n_i : in std_logic; + ready_o : out std_logic; + d_i : in std_logic_vector(0 to 7); + aout_o : out signed(0 to 7) + ); + +end sn76489_top; + +architecture struct of sn76489_top is + + signal clk_en_s : boolean; + + signal tone1_we_s, + tone2_we_s, + tone3_we_s, + noise_we_s : boolean; + signal r2_s : std_logic; + + signal tone1_s, + tone2_s, + tone3_s, + noise_s : signed(0 to 7); + + signal tone3_ff_s : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Clock Divider + ----------------------------------------------------------------------------- + clock_div_b : entity work.sn76489_clock_div + generic map ( + clock_div_16_g => clock_div_16_g + ) + port map ( + clock_i => clock_i, + clock_en_i => clock_en_i, + res_n_i => res_n_i, + clk_en_o => clk_en_s + ); + + + ----------------------------------------------------------------------------- + -- Latch Control = CPU Interface + ----------------------------------------------------------------------------- + latch_ctrl_b : entity work.sn76489_latch_ctrl + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + ce_n_i => ce_n_i, + we_n_i => we_n_i, + d_i => d_i, + ready_o => ready_o, + tone1_we_o => tone1_we_s, + tone2_we_o => tone2_we_s, + tone3_we_o => tone3_we_s, + noise_we_o => noise_we_s, + r2_o => r2_s + ); + + + ----------------------------------------------------------------------------- + -- Tone Channel 1 + ----------------------------------------------------------------------------- + tone1_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone1_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => open, + tone_o => tone1_s + ); + + ----------------------------------------------------------------------------- + -- Tone Channel 2 + ----------------------------------------------------------------------------- + tone2_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone2_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => open, + tone_o => tone2_s + ); + + ----------------------------------------------------------------------------- + -- Tone Channel 3 + ----------------------------------------------------------------------------- + tone3_b : entity work.sn76489_tone + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => tone3_we_s, + d_i => d_i, + r2_i => r2_s, + ff_o => tone3_ff_s, + tone_o => tone3_s + ); + + ----------------------------------------------------------------------------- + -- Noise Channel + ----------------------------------------------------------------------------- + noise_b : entity work.sn76489_noise + port map ( + clock_i => clock_i, + clk_en_i => clk_en_s, + res_n_i => res_n_i, + we_i => noise_we_s, + d_i => d_i, + r2_i => r2_s, + tone3_ff_i => tone3_ff_s, + noise_o => noise_s + ); + + + aout_o <= tone1_s + tone2_s + tone3_s + noise_s; + +end struct; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/vanvan.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/vanvan.vhd new file mode 100644 index 00000000..ba50a44a --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/vanvan.vhd @@ -0,0 +1,674 @@ +-- +-- A simulation model of Van-Van Car hardware +-- Copyright (c) Sorgelig - 2017 +-- +-- Based on Pacman core +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + +entity VANVAN is + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out signed(8 downto 0); + -- + in0_reg : in std_logic_vector(7 downto 0); + in1_reg : in std_logic_vector(7 downto 0); + dipsw1_reg : in std_logic_vector(7 downto 0); + dipsw2_reg : in std_logic_vector(7 downto 0); + + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic; + ENA_4 : in std_logic + ); +end; + +architecture RTL of VANVAN is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_ena : std_logic; + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_wr_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic := '1'; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal rom_data : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal vram_addr_ab : std_logic_vector(11 downto 0); + signal ab : std_logic_vector(11 downto 0); + + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal vram_l : std_logic; + signal rams_data_out : std_logic_vector(7 downto 0); + -- more decode + signal wr2_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw1_l : std_logic; + signal iodec_dipsw2_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + + signal sn1_ce : std_logic; + signal sn2_ce : std_logic; + signal sn1_ready : std_logic; + signal sn2_ready : std_logic; + signal sn_d : std_logic_vector(7 downto 0); + signal old_we : std_logic; + signal wav1,wav2 : signed(7 downto 0); + +begin + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + p_sync_comb : process(hcnt, vcnt) + begin + vsync <= not vcnt(8); + do_hsync <= (hcnt = "010101111"); -- 0AF + end process; + + p_sync : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + + if (hcnt = "010010111") then -- 097 + O_HBLANK <= '1'; + elsif (hcnt = "010001111") then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") then + hblank <= '0'; -- 0EF + O_HBLANK <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + -- + -- cpu + -- + p_cpu_wait_comb : process(sync_bus_wreq_l) + begin + cpu_wait_l <= '1'; + if (sync_bus_wreq_l = '0') then + cpu_wait_l <= '0'; + end if; + end process; + + p_irq_req_watchdog : process + variable rising_vblank : boolean; + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + --rising_vblank := do_hsync; -- debug + -- interrupt 8c + + if (control_reg(0) = '0') then + cpu_nmi_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_nmi_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + + -- simulation + -- pragma translate_off + -- synopsys translate_off + watchdog_reset_l <= not reset; -- watchdog disable + -- synopsys translate_on + -- pragma translate_on + end if; + end process; + + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_int_l <= '1'; + + p_cpu_ena : process(hcnt, ena_6) + begin + cpu_ena <= '0'; + if (ena_6 = '1') then + cpu_ena <= hcnt(0); + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => cpu_wr_l, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + -- + -- primary addr decode + -- + p_mem_decode_comb : process(cpu_rfsh_l, cpu_rd_l, cpu_mreq_l, cpu_addr) + begin + -- rom 0x0000 - 0x3FFF + -- syncbus 0x4000 - 0x7FFF + + -- 7M + -- 7N + sync_bus_cs_l <= '1'; +-- program_rom_cs_l <= '1'; + + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + +-- if (cpu_addr(14) = '0') and (cpu_rd_l = '0') then +-- program_rom_cs_l <= '0'; +-- end if; + + if (cpu_addr(14) = '1') then + sync_bus_cs_l <= '0'; + end if; + + end if; + end process; + -- + -- sync bus custom ic + -- + p_sync_bus_reg : process + begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; + end process; + + p_sync_bus_comb : process(cpu_rd_l, sync_bus_cs_l, hcnt) + begin + -- sync_bus_stb is now an active low clock enable signal + sync_bus_stb <= '1'; + sync_bus_r_w_l <= '1'; + + if (sync_bus_cs_l = '0') and (hcnt(1) = '0') then + if (cpu_rd_l = '1') then + sync_bus_r_w_l <= '0'; + end if; + sync_bus_stb <= '0'; + end if; + + sync_bus_wreq_l <= '1'; + if (sync_bus_cs_l = '0') and (hcnt(1) = '1') and (cpu_rd_l = '0') then + sync_bus_wreq_l <= '0'; + end if; + end process; + -- + -- vram addr custom ic + -- + u_vram_addr : entity work.VANVAN_VRAM_ADDR + port map ( + AB => vram_addr_ab, + H256_L => hcnt(8), + H128 => hcnt(7), + H64 => hcnt(6), + H32 => hcnt(5), + H16 => hcnt(4), + H8 => hcnt(3), + H4 => hcnt(2), + H2 => hcnt(1), + H1 => hcnt(0), + V128 => vcnt(7), + V64 => vcnt(6), + V32 => vcnt(5), + V16 => vcnt(4), + V8 => vcnt(3), + V4 => vcnt(2), + V2 => vcnt(1), + V1 => vcnt(0), + FLIP => control_reg(3) + ); + + p_ab_mux_comb : process(hcnt, cpu_addr, vram_addr_ab) + begin + --When 2H is low, the CPU controls the bus. + if (hcnt(1) = '0') then + ab <= cpu_addr(11 downto 0); + else + ab <= vram_addr_ab; + end if; + end process; + + p_vram_comb : process(hcnt, cpu_addr, sync_bus_stb) + variable a,b : std_logic; + begin + + a := not (cpu_addr(12) or sync_bus_stb); + b := hcnt(1) and hcnt(0); + vram_l <= not (a or b); + end process; + + p_io_decode_comb : process(sync_bus_r_w_l, sync_bus_stb, ab, cpu_addr) + variable sel : std_logic_vector(2 downto 0); + variable dec : std_logic_vector(7 downto 0); + variable selb : std_logic_vector(1 downto 0); + variable decb : std_logic_vector(3 downto 0); + begin + -- WRITE + + -- out_l 0x5000 - 0x503F control space + + -- wr2_l 0x5060 - 0x506F sprite + + -- 0x5080 - 0x50BF unused + + -- wdr_l 0x50C0 - 0x50FF watchdog reset + + -- READ + + -- in0_l 0x5000 - 0x503F in port 0 + -- in1_l 0x5040 - 0x507F in port 1 + -- dipsw_l 0x5080 - 0x50BF dip switches + + -- 7J + dec := "11111111"; + sel := sync_bus_r_w_l & ab(7) & ab(6); + if (cpu_addr(12) = '1') and ( sync_bus_stb = '0') then + case sel is + when "000" => dec := "11111110"; + when "001" => dec := "11111101"; + when "010" => dec := "11111011"; + when "011" => dec := "11110111"; + when "100" => dec := "11101111"; + when "101" => dec := "11011111"; + when "110" => dec := "10111111"; + when "111" => dec := "01111111"; + when others => null; + end case; + end if; + iodec_out_l <= dec(0); + iodec_wdr_l <= dec(3); + + iodec_in0_l <= dec(4); + iodec_in1_l <= dec(5); + iodec_dipsw1_l<= dec(6); + iodec_dipsw2_l<= dec(7); + + -- 7M + decb := "1111"; + selb := ab(5) & ab(4); + if (dec(1) = '0') then + case selb is + when "00" => decb := "1110"; + when "01" => decb := "1101"; + when "10" => decb := "1011"; + when "11" => decb := "0111"; + when others => null; + end case; + end if; + wr2_l <= decb(2); + end process; + + p_control_reg : process + variable ena : std_logic_vector(7 downto 0); + begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + ena := "00000000"; + if (iodec_out_l = '0') then + case ab(2 downto 0) is + when "000" => ena := "00000001"; + when "001" => ena := "00000010"; + when "010" => ena := "00000100"; + when "011" => ena := "00001000"; + when "100" => ena := "00010000"; + when "101" => ena := "00100000"; + when "110" => ena := "01000000"; + when "111" => ena := "10000000"; + when others => null; + end case; + end if; + + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (ena(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + p_db_mux_comb : process(hcnt, cpu_data_out, rams_data_out) + begin + -- simplified data source for video subsystem + -- only cpu or ram are sources of interest + if (hcnt(1) = '0') then + sync_bus_db <= cpu_data_out; + else + sync_bus_db <= rams_data_out; + end if; + end process; + + rom_data <= program_rom_dinl when cpu_addr(15) = '0' else program_rom_dinh; + p_cpu_data_in_mux_comb : process(cpu_addr, cpu_iorq_l, cpu_m1_l, sync_bus_wreq_l, + iodec_in0_l, iodec_in1_l, iodec_dipsw1_l, iodec_dipsw2_l, cpu_vec_reg, sync_bus_reg, rom_data, + rams_data_out, in0_reg, in1_reg, dipsw1_reg, dipsw2_reg) + begin + -- simplifed again + if (cpu_iorq_l = '0') and (cpu_m1_l = '0') then + cpu_data_in <= cpu_vec_reg; + elsif (sync_bus_wreq_l = '0') then + cpu_data_in <= sync_bus_reg; + else + if (cpu_addr(15 downto 14) = "00") then -- ROM at 0000 - 3fff + cpu_data_in <= rom_data; + elsif (cpu_addr(15 downto 13) = "100") then -- ROM at 8000 - 9fff + cpu_data_in <= rom_data; + else + cpu_data_in <= rams_data_out; + if (iodec_in0_l = '0') then cpu_data_in <= in0_reg; end if; + if (iodec_in1_l = '0') then cpu_data_in <= in1_reg; end if; + if (iodec_dipsw1_l = '0') then cpu_data_in <= dipsw1_reg; end if; + if (iodec_dipsw2_l = '0') then cpu_data_in <= dipsw2_reg; end if; + end if; + end if; + end process; + + u_rams : work.dpram generic map (12,8) + port map + ( + clk_a_i => clk, + en_a_i => ena_6, + we_i => not sync_bus_r_w_l and not vram_l, + addr_a_i => ab(11 downto 0), + data_a_i => cpu_data_out, -- cpu only source of ram data + + clk_b_i => clk, + addr_b_i => ab(11 downto 0), + data_b_o => rams_data_out + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom : entity work.ROM_PGM_0 + port map ( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl + ); + + -- example of internal program rom, if you have a big enough device + u_program_rom1 : entity work.ROM_PGM_1 + port map ( + CLK => clk, + ADDR => cpu_addr(11 downto 0), + DATA => program_rom_dinh + ); + + -- + -- video subsystem + -- + u_video : entity work.VANVAN_VIDEO + port map ( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + I_AB => ab, + I_DB => sync_bus_db, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + I_WR2_L => wr2_l, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk + ); + + O_HSYNC <= hSync; + O_VSYNC <= vSync; + + --O_HBLANK <= hblank; + O_VBLANK <= vblank; + + -- + -- + -- audio subsystem + -- + process(clk, reset) begin + if reset = '1' then + sn1_ce <= '1'; + sn2_ce <= '1'; + elsif rising_edge(clk) then + + if sn1_ready = '1' then + sn1_ce <= '1'; + end if; + + if sn2_ready = '1' then + sn2_ce <= '1'; + end if; + + old_we <= cpu_wr_l; + if old_we = '1' and cpu_wr_l = '0' and cpu_iorq_l = '0' then + if cpu_addr(7 downto 0) = X"01" then + sn1_ce <= '0'; + sn_d <= cpu_data_out; + end if; + if cpu_addr(7 downto 0) = X"02" then + sn2_ce <= '0'; + sn_d <= cpu_data_out; + end if; + end if; + end if; + end process; + + sn1 : entity work.sn76489_top + generic map ( + clock_div_16_g => 1 + ) + port map ( + clock_i => clk, + clock_en_i => ena_4, + res_n_i => not RESET, + ce_n_i => sn1_ce, + we_n_i => sn1_ce, + ready_o => sn1_ready, + d_i => sn_d, + aout_o => wav1 + ); + + sn2 : entity work.sn76489_top + generic map ( + clock_div_16_g => 1 + ) + port map ( + clock_i => clk, + clock_en_i => ena_4, + res_n_i => not RESET, + ce_n_i => sn2_ce, + we_n_i => sn2_ce, + ready_o => sn2_ready, + d_i => sn_d, + aout_o => wav2 + ); + + O_AUDIO <= resize(wav1, 9) + resize(wav2, 9); + +end RTL; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/vanvan_video.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/vanvan_video.vhd new file mode 100644 index 00000000..0090d174 --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/vanvan_video.vhd @@ -0,0 +1,349 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity VANVAN_VIDEO is +port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + I_WR2_L : in std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic +); +end; + +architecture RTL of VANVAN_VIDEO is + + signal sprite_xy_ram_temp : std_logic_vector(7 downto 0); + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal db_reg : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal cntr_ld : std_logic; + signal sprite_ram_ip : std_logic_vector(3 downto 0); + signal sprite_ram_op : std_logic_vector(3 downto 0); + signal ra : std_logic_vector(7 downto 0); + signal ra_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(3 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + + -- ram enable is low when HBLANK_L is 0 (for sprite access) or + -- 2H is low (for cpu writes) + -- we can simplify this + dr <= not sprite_xy_ram_temp when I_HBLANK = '1' else "11111111"; -- pull ups on board + + sprite_xy_ram : work.dpram generic map (4,8) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => not I_WR2_L, + addr_a_i => I_AB(3 downto 0), + data_a_i => I_DB, + + clk_b_i => CLK, + addr_b_i => I_AB(3 downto 0), + data_b_o => sprite_xy_ram_temp + ); + + p_char_regs : process + variable inc : std_logic; + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; + begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + inc := (not I_HBLANK); + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & inc); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + db_reg <= I_DB; -- character reg + end if; + end process; + + p_flip_comb : process(char_hblank_reg, I_FLIP, db_reg) + begin + if (char_hblank_reg = '0') then + xflip <= I_FLIP; + yflip <= I_FLIP; + else + xflip <= db_reg(1); + yflip <= db_reg(0); + end if; + end process; + + p_char_addr_comb : process(db_reg, I_HCNT, + char_match_reg, char_sum_reg, char_hblank_reg, + xflip, yflip) + begin + obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + + ca(12) <= char_hblank_reg; + ca(11 downto 6) <= db_reg(7 downto 2); + + -- 2h, 4e + if (char_hblank_reg = '0') then + ca(5) <= db_reg(1); + ca(4) <= db_reg(0); + else + ca(5) <= char_sum_reg(3) xor xflip; + ca(4) <= I_HCNT(3); + end if; + + ca(3) <= I_HCNT(2) xor yflip; + ca(1) <= char_sum_reg(1) xor xflip; + ca(2) <= char_sum_reg(2) xor xflip; + ca(0) <= char_sum_reg(0) xor xflip; + end process; + + -- char roms + char_rom_5ef : entity work.GFX1 + port map ( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf + ); + + p_char_shift : process + begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_buf(7 downto 4); -- load + shift_regl <= char_rom_5ef_buf(3 downto 0); + when others => null; + end case; + end if; + end process; + + p_char_shift_comb : process(I_HCNT, vout_yflip, shift_regu, shift_regl) + variable ip : std_logic; + begin + ip := I_HCNT(0) and I_HCNT(1); + if (vout_yflip = '0') then + + shift_sel(0) <= ip; + shift_sel(1) <= '1'; + shift_op(0) <= shift_regl(3); + shift_op(1) <= shift_regu(3); + else + + shift_sel(0) <= '1'; + shift_sel(1) <= ip; + shift_op(0) <= shift_regl(0); + shift_op(1) <= shift_regu(0); + end if; + end process; + + p_video_out_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= I_DB(4 downto 0); -- colour reg + end if; + end if; + end process; + + col_rom_4a : entity work.PROM4_DST + port map ( + CLK => CLK, + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a + ); + + cntr_ld <= '1' when (I_HCNT(3 downto 0) = "0111") and (vout_hblank='1' or vout_obj_on='0') else '0'; + + p_ra_cnt : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (cntr_ld = '1') then + ra <= dr; + else + ra <= ra + "1"; + end if; + end if; + end process; + + u_sprite_ram : work.dpram generic map (8,4) + port map + ( + clk_a_i => CLK, + en_a_i => ENA_6, + we_i => vout_obj_on_t1, + addr_a_i => ra_t1, + data_a_i => sprite_ram_ip, + + clk_b_i => CLK, + addr_b_i => ra, + data_b_o => sprite_ram_op + ); + + sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "0000"; + video_op_sel <= '1' when not (sprite_ram_reg = "0000") else '0'; + + p_sprite_ram_ip_reg : process + begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + ra_t1 <= ra; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + end if; + end process; + + p_sprite_ram_ip_comb : process(vout_hblank_t1, video_op_sel, sprite_ram_reg, lut_4a_t1) + begin + -- 3a + if (vout_hblank_t1 = '0') then + sprite_ram_ip <= (others => '0'); + else + if (video_op_sel = '1') then + sprite_ram_ip <= sprite_ram_reg; + else + sprite_ram_ip <= lut_4a_t1(3 downto 0); + end if; + end if; + end process; + + p_video_op_comb : process(vout_hblank, I_VBLANK, video_op_sel, sprite_ram_reg, lut_4a) + begin + -- 3b + if (vout_hblank = '1') or (I_VBLANK = '1') then + final_col <= (others => '0'); + else + if (video_op_sel = '1') then + final_col <= sprite_ram_reg; -- sprite + else + final_col <= lut_4a(3 downto 0); + end if; + end if; + end process; + + -- assign video outputs from color LUT PROM + col_rom_7f : entity work.PROM7_DST + port map ( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE + ); + +end architecture; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/vanvan_vram_addr.vhd b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/vanvan_vram_addr.vhd new file mode 100644 index 00000000..f99d8aee --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/vanvan_vram_addr.vhd @@ -0,0 +1,273 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ & CarlW - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity X74_157 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end; + +architecture RTL of X74_157 is +begin + p_y_comb : process(S,G,A,B) + begin + for i in 0 to 3 loop + -- quad 2 line to 1 line mux (true logic) + if (G = '1') then + Y(i) <= '0'; + else + if (S = '0') then + Y(i) <= A(i); + else + Y(i) <= B(i); + end if; + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity X74_257 is + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end; + +architecture RTL of X74_257 is +signal ab : std_logic_vector (3 downto 0); +begin + + Y <= ab; -- no tristate + p_ab : process(S,A,B) + begin + for i in 0 to 3 loop + if (S = '0') then + AB(i) <= A(i); + else + AB(i) <= B(i); + end if; + end loop; + end process; +end RTL; + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity VANVAN_VRAM_ADDR is + port ( + AB : out std_logic_vector (11 downto 0); + H256_L : in std_logic; + H128 : in std_logic; + H64 : in std_logic; + H32 : in std_logic; + H16 : in std_logic; + H8 : in std_logic; + H4 : in std_logic; + H2 : in std_logic; + H1 : in std_logic; + V128 : in std_logic; + V64 : in std_logic; + V32 : in std_logic; + V16 : in std_logic; + V8 : in std_logic; + V4 : in std_logic; + V2 : in std_logic; + V1 : in std_logic; + FLIP : in std_logic + ); +end; + +architecture RTL of VANVAN_VRAM_ADDR is + +signal v128p : std_logic; +signal v64p : std_logic; +signal v32p : std_logic; +signal v16p : std_logic; +signal v8p : std_logic; +signal h128p : std_logic; +signal h64p : std_logic; +signal h32p : std_logic; +signal h16p : std_logic; +signal h8p : std_logic; +signal sel : std_logic; +signal y157 : std_logic_vector (11 downto 0); + +component X74_157 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + G : in std_logic; + S : in std_logic + ); +end component; + +component X74_257 + port ( + Y : out std_logic_vector (3 downto 0); + B : in std_logic_vector (3 downto 0); + A : in std_logic_vector (3 downto 0); + S : in std_logic + ); +end component; + +begin + p_vp_comb : process(FLIP, V8, V16, V32, V64, V128) + begin + v128p <= FLIP xor V128; + v64p <= FLIP xor V64; + v32p <= FLIP xor V32; + v16p <= FLIP xor V16; + v8p <= FLIP xor V8; + end process; + + p_hp_comb : process(FLIP, H8, H16, H32, H64, H128) + begin + H128P <= FLIP xor H128; + H64P <= FLIP xor H64; + H32P <= FLIP xor H32; + H16P <= FLIP xor H16; + H8P <= FLIP xor H8; + end process; + + p_sel : process(H16, H32, H64) + begin + sel <= not((H32 xor H16) or (H32 xor H64)); + end process; + + --p_oe257 : process(H2) + --begin + -- oe <= not(H2); + --end process; + + U6 : X74_157 + port map( + Y => y157(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => h64p, + B(0) => h64p, + A => "1111", + G => '0', + S => sel + ); + + U5 : X74_157 + port map( + Y => y157(7 downto 4), + B(3) => h64p, + B(2) => h64p, + B(1) => h8p, + B(0) => v128p, + A => "1111", + G => '0', + S => sel + ); + + U4 : X74_157 + port map( + Y => y157(3 downto 0), + B(3) => v64p, + B(2) => v32p, + B(1) => v16p, + B(0) => v8p, + A(3) => H64, + A(2) => H32, + A(1) => H16, + A(0) => H4, + G => '0', + S => sel + ); + + U3 : X74_257 + port map( + Y => AB(11 downto 8), + B(3) => '0', + B(2) => H4, + B(1) => v128p, + B(0) => v64p, + A => y157(11 downto 8), + S => H256_L + ); + + U2 : X74_257 + port map( + Y => AB(7 downto 4), + B(3) => v32p, + B(2) => v16p, + B(1) => v8p, + B(0) => h128p, + A => y157(7 downto 4), + S => H256_L + ); + + U1 : X74_257 + port map( + Y => AB(3 downto 0), + B(3) => h64p, + B(2) => h32p, + B(1) => h16p, + B(0) => h8p, + A => y157(3 downto 0), + S => H256_L + ); + +end RTL; diff --git a/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/VanVanCar_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/VanVanCar_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/Arcade/Pacman Hardware/Woodpecker_MiST/README.txt b/Arcade/Pacman Hardware/Woodpecker_MiST/README.txt new file mode 100644 index 00000000..2b2f11e6 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/README.txt @@ -0,0 +1,25 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Woodpecker for MiST by Gehstock +-- 21 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F1 : Start 1 player +-- F2 : Start 2 players +-- TAB : Skip the level +-- SPACE,CTRL : Fire +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/Release/Woodpecker.rbf b/Arcade/Pacman Hardware/Woodpecker_MiST/Release/Woodpecker.rbf new file mode 100644 index 00000000..3035a305 Binary files /dev/null and b/Arcade/Pacman Hardware/Woodpecker_MiST/Release/Woodpecker.rbf differ diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/Woodpecker.qpf b/Arcade/Pacman Hardware/Woodpecker_MiST/Woodpecker.qpf new file mode 100644 index 00000000..18a22124 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/Woodpecker.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Woodpecker" diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/Woodpecker.qsf b/Arcade/Pacman Hardware/Woodpecker_MiST/Woodpecker.qsf new file mode 100644 index 00000000..5d0c79ee --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/Woodpecker.qsf @@ -0,0 +1,175 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 20:43:12 November 20, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Woodpecker_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/pll.v +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VERILOG_FILE rtl/osd.v +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/ROM/GFX1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM7_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM4_DST.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/PROM1_DST.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_video.vhd +set_global_assignment -name VHDL_FILE rtl/pacman_audio.vhd +set_global_assignment -name VHDL_FILE rtl/pacman.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Woodpecker.sv + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Woodpecker +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(Alibaba) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Alibaba) +# ------------------- +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/Woodpecker.srf b/Arcade/Pacman Hardware/Woodpecker_MiST/Woodpecker.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/Woodpecker.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/clean.bat b/Arcade/Pacman Hardware/Woodpecker_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_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/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/GFX1.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/GFX1.vhd new file mode 100644 index 00000000..0a2b6466 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/GFX1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity GFX1 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 prom of GFX1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"8C",X"4C",X"22",X"EE",X"4C",X"88",X"00",X"00",X"11",X"46",X"26",X"33",X"4C",X"9D",X"01", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08", + X"01",X"01",X"01",X"01",X"01",X"01",X"E1",X"E1",X"08",X"08",X"08",X"08",X"08",X"08",X"78",X"78", + X"01",X"01",X"01",X"01",X"E1",X"E1",X"E1",X"E1",X"08",X"08",X"08",X"08",X"78",X"78",X"78",X"78", + X"01",X"01",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"08",X"08",X"78",X"78",X"78",X"78",X"78",X"78", + X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"78", + X"E1",X"E1",X"01",X"01",X"01",X"01",X"01",X"01",X"78",X"78",X"08",X"08",X"08",X"08",X"08",X"08", + X"E1",X"E1",X"E1",X"E1",X"01",X"01",X"01",X"01",X"78",X"78",X"78",X"78",X"08",X"08",X"08",X"08", + X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"01",X"01",X"78",X"78",X"78",X"78",X"78",X"78",X"08",X"08", + X"CC",X"EE",X"BB",X"99",X"99",X"99",X"00",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"33",X"00", + X"FF",X"FF",X"44",X"44",X"44",X"FF",X"FF",X"00",X"11",X"33",X"66",X"44",X"66",X"33",X"11",X"00", + X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00",X"33",X"77",X"44",X"44",X"44",X"77",X"77",X"00", + X"22",X"33",X"11",X"11",X"33",X"EE",X"CC",X"00",X"22",X"66",X"44",X"44",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"33",X"11",X"11",X"FF",X"FF",X"00",X"11",X"33",X"66",X"44",X"44",X"77",X"77",X"00", + X"11",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00",X"44",X"44",X"44",X"44",X"77",X"77",X"00",X"00", + X"00",X"88",X"88",X"88",X"88",X"FF",X"FF",X"00",X"44",X"44",X"44",X"44",X"44",X"77",X"77",X"00", + X"8F",X"8F",X"8F",X"CF",X"CF",X"8F",X"8F",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"8F",X"8F",X"8F",X"CF",X"CF",X"8F",X"8F",X"0F",X"FF",X"FF",X"FF",X"77",X"BB",X"FF",X"FF",X"FF", + X"8F",X"8F",X"8F",X"CF",X"CF",X"8F",X"8F",X"0F",X"FF",X"FF",X"FF",X"FF",X"33",X"FF",X"FF",X"FF", + X"CF",X"CF",X"C7",X"EB",X"EB",X"C7",X"CF",X"CF",X"77",X"7E",X"3F",X"1F",X"1F",X"3F",X"76",X"77", + X"CF",X"CF",X"8F",X"8F",X"01",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"CC", + X"00",X"00",X"00",X"01",X"8F",X"8F",X"CF",X"CF",X"CC",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"FF",X"FF",X"FF",X"FF", + X"80",X"E0",X"F0",X"F0",X"F0",X"F0",X"E0",X"80",X"30",X"70",X"78",X"3C",X"3C",X"78",X"70",X"30", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"1E",X"1E",X"1A",X"1E",X"1A",X"1E",X"F0",X"30",X"43",X"42",X"87",X"85",X"43",X"43",X"30", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"88",X"CC",X"22",X"22",X"66",X"CC",X"88",X"00",X"33",X"77",X"CC",X"88",X"88",X"77",X"33",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"00",X"00",X"FF",X"FF",X"44",X"00",X"00",X"00", + X"22",X"22",X"AA",X"AA",X"EE",X"EE",X"66",X"00",X"66",X"FF",X"BB",X"99",X"99",X"CC",X"44",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"88",X"DD",X"FF",X"BB",X"99",X"88",X"00",X"00", + X"88",X"EE",X"EE",X"88",X"88",X"88",X"88",X"00",X"00",X"FF",X"FF",X"CC",X"66",X"33",X"11",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"11",X"BB",X"AA",X"AA",X"AA",X"EE",X"EE",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"00",X"99",X"99",X"99",X"DD",X"77",X"33",X"00", + X"00",X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"CC",X"EE",X"BB",X"99",X"88",X"CC",X"CC",X"00", + X"CC",X"EE",X"AA",X"AA",X"22",X"22",X"CC",X"00",X"00",X"66",X"99",X"99",X"BB",X"FF",X"66",X"00", + X"88",X"CC",X"66",X"22",X"22",X"22",X"00",X"00",X"77",X"FF",X"99",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"00",X"00",X"88",X"44",X"22",X"00",X"88",X"44",X"22",X"11",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"00",X"00",X"00", + X"33",X"77",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"EE",X"CC", + X"00",X"00",X"00",X"88",X"CC",X"EE",X"77",X"33",X"CC",X"EE",X"77",X"33",X"11",X"00",X"00",X"00", + X"00",X"00",X"00",X"88",X"CC",X"EE",X"77",X"33",X"CC",X"EE",X"77",X"33",X"11",X"00",X"00",X"00", + X"33",X"77",X"EE",X"CC",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"EE",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"EE",X"88",X"88",X"88",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"CC",X"77",X"33",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"EE",X"00",X"66",X"FF",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"44",X"66",X"22",X"22",X"66",X"CC",X"88",X"00",X"44",X"CC",X"88",X"88",X"CC",X"77",X"33",X"00", + X"88",X"CC",X"66",X"22",X"22",X"EE",X"EE",X"00",X"33",X"77",X"CC",X"88",X"88",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"88",X"99",X"99",X"99",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"EE",X"EE",X"00",X"88",X"99",X"99",X"99",X"99",X"FF",X"FF",X"00", + X"EE",X"EE",X"22",X"22",X"66",X"CC",X"88",X"00",X"99",X"99",X"99",X"88",X"CC",X"77",X"33",X"00", + X"EE",X"EE",X"00",X"00",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"11",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"EE",X"EE",X"22",X"22",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"88",X"CC",X"66",X"33",X"11",X"FF",X"FF",X"00", + X"22",X"22",X"22",X"22",X"EE",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00", + X"EE",X"EE",X"00",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"77",X"33",X"77",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"00",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"77",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"00",X"88",X"88",X"88",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"FF",X"00", + X"AA",X"CC",X"EE",X"AA",X"22",X"EE",X"CC",X"00",X"77",X"FF",X"88",X"88",X"88",X"FF",X"77",X"00", + X"22",X"66",X"EE",X"CC",X"88",X"EE",X"EE",X"00",X"77",X"FF",X"99",X"88",X"88",X"FF",X"FF",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"66",X"44",X"00",X"00",X"55",X"DD",X"99",X"99",X"FF",X"66",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"88",X"88",X"FF",X"FF",X"88",X"88",X"00",X"00", + X"CC",X"EE",X"22",X"22",X"22",X"EE",X"CC",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"00", + X"00",X"88",X"CC",X"EE",X"CC",X"88",X"00",X"00",X"FF",X"FF",X"11",X"00",X"11",X"FF",X"FF",X"00", + X"EE",X"EE",X"CC",X"88",X"CC",X"EE",X"EE",X"00",X"FF",X"FF",X"11",X"33",X"11",X"FF",X"FF",X"00", + X"66",X"EE",X"CC",X"88",X"CC",X"EE",X"66",X"00",X"CC",X"EE",X"77",X"33",X"77",X"EE",X"CC",X"00", + X"00",X"00",X"EE",X"EE",X"00",X"00",X"00",X"00",X"EE",X"FF",X"11",X"11",X"FF",X"EE",X"00",X"00", + X"22",X"22",X"22",X"AA",X"EE",X"EE",X"66",X"00",X"CC",X"EE",X"FF",X"BB",X"99",X"88",X"88",X"00", + X"00",X"00",X"00",X"00",X"88",X"22",X"00",X"00",X"00",X"CC",X"EE",X"FF",X"33",X"00",X"00",X"00", + X"CC",X"22",X"11",X"55",X"55",X"99",X"22",X"CC",X"33",X"44",X"88",X"AA",X"AA",X"99",X"44",X"33", + X"00",X"00",X"00",X"00",X"88",X"88",X"88",X"EE",X"22",X"22",X"00",X"11",X"22",X"22",X"22",X"33", + X"AA",X"AA",X"AA",X"22",X"00",X"00",X"00",X"EE",X"22",X"22",X"22",X"11",X"00",X"22",X"22",X"33", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"22", + X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",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"08",X"08",X"08",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"08",X"08",X"0F",X"0F",X"00",X"00",X"00",X"00",X"01",X"01",X"0F",X"0F",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0F",X"0F",X"08",X"08",X"00",X"00",X"00",X"00",X"0F",X"0F",X"01",X"01", + X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"33",X"00",X"77",X"33",X"33",X"11",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"77",X"77",X"77",X"77",X"77",X"77",X"77",X"77", + X"0F",X"0F",X"0F",X"07",X"01",X"00",X"00",X"00",X"FF",X"FF",X"EE",X"EE",X"EE",X"CC",X"88",X"00", + X"00",X"00",X"33",X"77",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"11",X"33",X"77", + X"FF",X"FF",X"FF",X"FF",X"FF",X"55",X"BB",X"FF",X"11",X"11",X"33",X"11",X"22",X"33",X"33",X"33", + X"FF",X"FF",X"FF",X"FF",X"EE",X"55",X"BB",X"FF",X"11",X"11",X"33",X"11",X"22",X"33",X"33",X"33", + X"00",X"00",X"00",X"01",X"07",X"0F",X"0F",X"0F",X"00",X"00",X"88",X"CC",X"CC",X"EE",X"FF",X"FF", + X"FF",X"EE",X"DD",X"BB",X"77",X"77",X"33",X"11",X"33",X"33",X"11",X"11",X"00",X"00",X"00",X"00", + X"00",X"11",X"33",X"77",X"77",X"BB",X"CC",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11", + X"FF",X"FF",X"FF",X"33",X"00",X"77",X"FF",X"FF",X"33",X"11",X"00",X"00",X"00",X"00",X"00",X"11", + X"0F",X"0F",X"0F",X"07",X"01",X"00",X"00",X"00",X"FF",X"FF",X"EE",X"EE",X"CC",X"CC",X"88",X"00", + X"00",X"00",X"11",X"11",X"33",X"32",X"77",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C7",X"CF",X"8F",X"8F",X"01",X"00",X"00",X"00",X"FD",X"FA",X"FB",X"FD",X"F7",X"EE",X"88",X"00", + X"00",X"00",X"00",X"01",X"8F",X"8F",X"CF",X"C7",X"00",X"88",X"EE",X"F7",X"FB",X"FD",X"FA",X"FD", + X"61",X"34",X"1E",X"0F",X"00",X"00",X"00",X"00",X"00",X"02",X"03",X"03",X"02",X"00",X"00",X"00", + X"C3",X"87",X"87",X"DF",X"DF",X"87",X"87",X"C3",X"00",X"00",X"30",X"F1",X"F1",X"30",X"00",X"00", + X"00",X"00",X"00",X"00",X"0F",X"1E",X"34",X"61",X"00",X"00",X"00",X"02",X"03",X"03",X"02",X"00", + X"8F",X"0F",X"0F",X"8F",X"8F",X"0F",X"0F",X"8F",X"3F",X"0F",X"0F",X"BF",X"BF",X"0F",X"0F",X"3F", + X"08",X"08",X"0F",X"0F",X"0F",X"88",X"88",X"CC",X"0A",X"0F",X"0F",X"0F",X"19",X"19",X"77",X"11", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"0F",X"00",X"00",X"88",X"CC",X"EE",X"EE",X"77",X"BB", + X"FF",X"77",X"32",X"33",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CC",X"88",X"88",X"0F",X"0F",X"0F",X"08",X"08",X"11",X"77",X"19",X"19",X"0F",X"0F",X"0F",X"0A", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"77",X"22",X"33",X"00",X"33",X"77",X"FF",X"66",X"60",X"30",X"10",X"00",X"44",X"66",X"CC",X"44", + X"00",X"00",X"88",X"F3",X"C0",X"C0",X"E0",X"E1",X"00",X"00",X"00",X"00",X"10",X"13",X"43",X"70", + X"E1",X"E1",X"C0",X"C8",X"EC",X"C8",X"80",X"00",X"70",X"30",X"10",X"31",X"73",X"73",X"30",X"00", + X"00",X"00",X"00",X"62",X"62",X"62",X"48",X"08",X"00",X"00",X"66",X"60",X"60",X"60",X"69",X"69", + X"00",X"08",X"0C",X"60",X"62",X"44",X"00",X"00",X"69",X"69",X"69",X"60",X"60",X"66",X"00",X"00", + X"00",X"00",X"08",X"C0",X"80",X"88",X"C0",X"E1",X"00",X"70",X"F4",X"E3",X"53",X"34",X"70",X"F0", + X"E1",X"A0",X"A0",X"80",X"C4",X"00",X"00",X"00",X"F0",X"F6",X"F6",X"30",X"10",X"11",X"00",X"00", + X"00",X"00",X"00",X"08",X"08",X"08",X"79",X"79",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"69", + X"79",X"19",X"08",X"08",X"08",X"00",X"00",X"00",X"69",X"3C",X"34",X"30",X"33",X"00",X"00",X"00", + X"33",X"22",X"77",X"C0",X"C0",X"C0",X"C0",X"C0",X"33",X"66",X"CC",X"CC",X"F0",X"F0",X"F0",X"40", + X"99",X"88",X"00",X"00",X"00",X"00",X"CC",X"88",X"00",X"11",X"00",X"00",X"00",X"66",X"CC",X"99", + X"0F",X"0F",X"0E",X"0C",X"08",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"07",X"00",X"88",X"CC",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"8F",X"03",X"03",X"07",X"07",X"0F", + X"00",X"00",X"00",X"08",X"0C",X"0E",X"0F",X"0F",X"CC",X"EE",X"44",X"01",X"07",X"0F",X"0F",X"0F", + X"77",X"7B",X"7B",X"7B",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"01",X"03",X"03",X"30",X"30",X"70", + X"00",X"00",X"00",X"44",X"66",X"66",X"66",X"77",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"66",X"33",X"00",X"00",X"33",X"77",X"FF",X"66",X"60",X"30",X"10",X"00",X"44",X"66",X"CC",X"44", + X"88",X"00",X"33",X"E6",X"C3",X"C0",X"C0",X"F3",X"77",X"77",X"CC",X"CC",X"F0",X"F0",X"F0",X"40", + X"88",X"88",X"00",X"33",X"77",X"EE",X"CC",X"CC",X"00",X"11",X"00",X"00",X"00",X"00",X"11",X"33", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"8F",X"03",X"8B",X"07",X"07",X"0F", + X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"7B",X"7B",X"7B",X"33",X"70",X"30",X"30",X"03",X"03",X"01",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"A0",X"00",X"00",X"00",X"00",X"00",X"A0",X"A0",X"A0", + X"88",X"CC",X"44",X"00",X"00",X"00",X"88",X"99",X"99",X"CC",X"66",X"00",X"00",X"00",X"11",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"77",X"22",X"33",X"40",X"F0",X"F0",X"F0",X"CC",X"CC",X"66",X"33", + X"66",X"FF",X"77",X"33",X"00",X"33",X"22",X"77",X"44",X"CC",X"66",X"44",X"00",X"10",X"30",X"60", + X"0F",X"0F",X"0E",X"0C",X"08",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"07",X"01",X"44",X"EE",X"CC", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"03",X"03",X"8F",X"07",X"0F", + X"00",X"00",X"00",X"08",X"0C",X"0E",X"0F",X"0F",X"00",X"CC",X"88",X"01",X"07",X"0F",X"0F",X"0F", + X"77",X"66",X"66",X"66",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"7B",X"7B",X"7B",X"77",X"70",X"30",X"30",X"03",X"03",X"01",X"00",X"00", + X"CC",X"CC",X"EE",X"77",X"33",X"00",X"88",X"99",X"33",X"11",X"00",X"00",X"00",X"00",X"11",X"00", + X"F3",X"C0",X"C0",X"F3",X"E6",X"33",X"00",X"88",X"40",X"F0",X"F0",X"F0",X"CC",X"EE",X"77",X"77", + X"66",X"FF",X"77",X"33",X"00",X"00",X"33",X"66",X"44",X"CC",X"66",X"44",X"00",X"10",X"30",X"60", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"8B",X"03",X"8F",X"07",X"0F", + X"00",X"40",X"F0",X"F0",X"3C",X"1E",X"1E",X"3C",X"50",X"50",X"50",X"70",X"E1",X"C3",X"C3",X"E1", + X"70",X"70",X"70",X"F0",X"F0",X"F0",X"E0",X"80",X"00",X"00",X"00",X"80",X"D0",X"F0",X"F0",X"F0", + X"F0",X"F7",X"F7",X"FF",X"FF",X"FF",X"11",X"00",X"F0",X"F0",X"F0",X"70",X"31",X"11",X"00",X"00", + X"00",X"00",X"00",X"00",X"88",X"EE",X"FF",X"00",X"E0",X"80",X"88",X"EE",X"FF",X"FF",X"FF",X"00", + X"33",X"33",X"11",X"11",X"11",X"11",X"11",X"33",X"88",X"CC",X"CC",X"CC",X"EE",X"EE",X"EE",X"7F", + X"FF",X"FF",X"CC",X"FF",X"FF",X"CC",X"FF",X"FF",X"00",X"88",X"88",X"88",X"88",X"88",X"99",X"BB", + X"FF",X"FE",X"F0",X"F0",X"F0",X"10",X"00",X"00",X"3F",X"3D",X"3C",X"F0",X"F0",X"B0",X"90",X"90", + X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"70",X"F3",X"F3",X"F0",X"F0",X"F0",X"F0",X"30",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"CC",X"CC",X"EE",X"EE",X"77",X"77",X"33", + X"11",X"33",X"77",X"EE",X"EE",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"11",X"33",X"77",X"FF", + X"DD",X"FF",X"FF",X"F3",X"F0",X"F0",X"30",X"90",X"33",X"11",X"16",X"1E",X"3C",X"F0",X"B0",X"90", + X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"EC",X"F8",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"88",X"88",X"CC",X"CC",X"EE",X"FF",X"FF",X"77", + X"00",X"88",X"CC",X"CC",X"EE",X"EE",X"FE",X"FC",X"66",X"33",X"11",X"00",X"00",X"00",X"11",X"33", + X"FF",X"FF",X"F0",X"87",X"87",X"F0",X"70",X"10",X"73",X"71",X"30",X"30",X"10",X"00",X"00",X"00", + X"F8",X"F0",X"F0",X"80",X"F0",X"C0",X"00",X"F0",X"FF",X"FF",X"F0",X"F0",X"78",X"F0",X"F0",X"F0", + X"33",X"33",X"11",X"11",X"11",X"11",X"11",X"33",X"88",X"CC",X"CC",X"CC",X"EE",X"EE",X"EE",X"7F", + X"FF",X"FF",X"CC",X"FF",X"FF",X"CC",X"FF",X"FF",X"00",X"88",X"88",X"88",X"88",X"88",X"99",X"BB", + X"FF",X"FE",X"F0",X"F0",X"F0",X"10",X"00",X"00",X"3F",X"3D",X"3C",X"F0",X"F0",X"B0",X"90",X"90", + X"F8",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"70",X"F3",X"F3",X"F0",X"F0",X"F0",X"F0",X"30",X"00", + X"66",X"33",X"11",X"11",X"11",X"33",X"77",X"FF",X"33",X"66",X"66",X"EE",X"EE",X"EE",X"2E",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"CC",X"CC",X"CC",X"CC",X"88", + X"FE",X"F0",X"F0",X"F0",X"70",X"70",X"30",X"10",X"79",X"F0",X"F0",X"F0",X"70",X"50",X"50",X"10", + X"00",X"00",X"00",X"00",X"C0",X"F0",X"F0",X"F0",X"00",X"80",X"C0",X"E0",X"F0",X"F0",X"F0",X"F0", + X"00",X"01",X"83",X"87",X"1E",X"1E",X"0F",X"0F",X"C0",X"F0",X"F0",X"F0",X"70",X"10",X"10",X"D0", + X"00",X"08",X"0C",X"0E",X"0F",X"07",X"0F",X"0F",X"00",X"0F",X"0F",X"09",X"C0",X"C0",X"0F",X"0F", + X"3F",X"FF",X"FF",X"FE",X"FE",X"8F",X"0F",X"0F",X"F0",X"F0",X"F0",X"70",X"30",X"10",X"90",X"F0", + X"0F",X"03",X"88",X"CC",X"EE",X"FF",X"77",X"7F",X"CF",X"FF",X"FF",X"F7",X"91",X"0E",X"0F",X"0F", + X"1F",X"1E",X"1E",X"87",X"C3",X"61",X"00",X"00",X"F0",X"F0",X"F0",X"70",X"10",X"00",X"00",X"00", + X"3F",X"1F",X"8F",X"07",X"07",X"0F",X"0F",X"0E",X"EF",X"FF",X"F3",X"48",X"0C",X"0F",X"0F",X"03", + X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"40",X"40",X"60",X"70",X"70",X"70",X"70",X"70", + X"F0",X"F0",X"30",X"10",X"00",X"00",X"30",X"30",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"30",X"00",X"00",X"00",X"00",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10", + X"F0",X"F0",X"F0",X"80",X"00",X"00",X"00",X"00",X"70",X"70",X"70",X"70",X"70",X"60",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F4",X"F4",X"F4", + X"F4",X"F0",X"F0",X"F3",X"F4",X"FB",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F4",X"F4",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"FC",X"F2",X"FD",X"E2",X"CC", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F4",X"F4",X"F4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F4",X"F4",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"30",X"70",X"F0",X"F0",X"F0",X"F0",X"F4",X"F4",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"F0",X"F0",X"F4",X"F4",X"F0",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F2",X"F2",X"F2",X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F4",X"F4",X"F4",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00", + X"0C",X"0C",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"08",X"0F",X"0F",X"00",X"00",X"00",X"00",X"01",X"01",X"0F",X"0F",X"F0",X"F0",X"F4",X"F4", + X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0F",X"0F",X"08",X"08",X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"01",X"01", + X"08",X"08",X"0F",X"0F",X"00",X"00",X"00",X"00",X"01",X"01",X"0F",X"0F",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0F",X"0F",X"08",X"08",X"00",X"00",X"00",X"00",X"0F",X"0F",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F4",X"F0",X"F0",X"F3",X"F4",X"FB",X"74",X"33",X"0F",X"0E",X"0C",X"08",X"08",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F4",X"F4",X"F4",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F4",X"F4",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F4",X"F4",X"F4",X"0F",X"0E",X"0C",X"08",X"08",X"00",X"00",X"00", + X"F4",X"F4",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"08",X"08",X"0C",X"0F",X"0F", + X"30",X"70",X"F0",X"F0",X"F0",X"F0",X"F4",X"F4",X"00",X"00",X"00",X"08",X"08",X"0C",X"0E",X"0F", + X"30",X"70",X"F0",X"F0",X"F0",X"F0",X"F4",X"F4",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00", + X"F4",X"F0",X"F0",X"F3",X"F4",X"FB",X"74",X"33",X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"00", + X"0C",X"0C",X"0F",X"0F",X"F4",X"FB",X"74",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"08",X"0F",X"0F",X"00",X"00",X"00",X"00",X"01",X"01",X"0F",X"0F",X"F2",X"FD",X"E2",X"CC", + X"30",X"70",X"F0",X"F0",X"0F",X"0F",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"80",X"C0",X"C0",X"80",X"00",X"80",X"10",X"30",X"10",X"00",X"00",X"10",X"30",X"10", + X"C0",X"60",X"C0",X"00",X"00",X"C0",X"60",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0F",X"0F",X"08",X"08",X"C0",X"E0",X"F0",X"F0",X"0F",X"0F",X"01",X"01", + X"0C",X"0E",X"02",X"02",X"02",X"0E",X"0E",X"00",X"06",X"0F",X"09",X"09",X"09",X"0F",X"0F",X"00", + X"8F",X"0F",X"0F",X"0F",X"0F",X"0F",X"80",X"C0",X"3F",X"0F",X"87",X"C3",X"61",X"30",X"10",X"00", + X"C0",X"80",X"0F",X"0F",X"0F",X"0F",X"0F",X"8F",X"00",X"10",X"30",X"61",X"C3",X"87",X"0F",X"3F", + X"88",X"88",X"CC",X"FF",X"77",X"00",X"00",X"00",X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"77",X"EE",X"CC",X"00",X"00",X"00", + X"00",X"00",X"00",X"77",X"FF",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"CC",X"EE",X"77",X"33",X"33", + X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"88",X"11",X"11",X"11",X"11",X"11",X"11",X"11",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"33", + X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00", + X"00",X"00",X"02",X"02",X"02",X"02",X"0E",X"0E",X"00",X"00",X"08",X"09",X"09",X"09",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"0F",X"78",X"78",X"78",X"78",X"78",X"78",X"78",X"0F", + X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"01",X"0F",X"78",X"78",X"78",X"78",X"78",X"78",X"08",X"0F", + X"E1",X"E1",X"E1",X"E1",X"01",X"01",X"01",X"0F",X"78",X"78",X"78",X"78",X"08",X"08",X"08",X"0F", + X"E1",X"E1",X"01",X"01",X"01",X"01",X"01",X"0F",X"78",X"78",X"08",X"08",X"08",X"08",X"08",X"0F", + X"0C",X"0C",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"0C",X"0C",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00", + X"F0",X"F0",X"F2",X"F2",X"F2",X"F0",X"F0",X"F0",X"E0",X"E0",X"E0",X"E8",X"E4",X"EA",X"C4",X"88", + X"F4",X"F4",X"F4",X"F4",X"F0",X"F0",X"F0",X"F0",X"80",X"C0",X"E8",X"E8",X"EC",X"E4",X"E4",X"E0", + X"08",X"08",X"0F",X"0F",X"F2",X"F2",X"F0",X"F0",X"01",X"01",X"0F",X"0F",X"E8",X"E8",X"E0",X"E0", + X"F0",X"F0",X"F2",X"F2",X"0F",X"0F",X"08",X"08",X"E0",X"E0",X"E0",X"E0",X"0F",X"0F",X"01",X"01", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F4",X"F4",X"F4",X"E8",X"E8",X"E8",X"E0",X"E0",X"E0",X"E0",X"E0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F4",X"F4",X"F4",X"E8",X"E8",X"E8",X"E0",X"E0",X"E0",X"E0",X"E0", + X"0C",X"0C",X"0F",X"0F",X"F4",X"FB",X"74",X"33",X"00",X"00",X"0F",X"0F",X"00",X"00",X"00",X"00", + X"30",X"70",X"F0",X"F0",X"0F",X"0F",X"0C",X"0C",X"00",X"00",X"00",X"00",X"0F",X"0F",X"00",X"00", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0F",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"0F", + X"0F",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"0F",X"08",X"08",X"08",X"08",X"08",X"08",X"08", + X"0F",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"E1",X"0F",X"78",X"78",X"78",X"78",X"78",X"78",X"78", + X"0F",X"E1",X"01",X"01",X"01",X"01",X"01",X"01",X"0F",X"78",X"08",X"08",X"08",X"08",X"08",X"08", + X"0F",X"E1",X"E1",X"E1",X"01",X"01",X"01",X"01",X"0F",X"78",X"78",X"78",X"08",X"08",X"08",X"08", + X"0F",X"E1",X"E1",X"E1",X"E1",X"E1",X"01",X"01",X"0F",X"78",X"78",X"78",X"78",X"78",X"08",X"08", + X"00",X"01",X"03",X"07",X"D2",X"F0",X"F0",X"3F",X"A0",X"A0",X"B0",X"F0",X"70",X"70",X"76",X"77", + X"40",X"40",X"40",X"E0",X"F0",X"F0",X"F0",X"F7",X"20",X"60",X"C0",X"80",X"F0",X"F0",X"F0",X"89", + X"1F",X"07",X"03",X"88",X"88",X"CC",X"EE",X"66",X"23",X"11",X"00",X"00",X"00",X"00",X"00",X"00", + X"F7",X"E6",X"EE",X"EE",X"CC",X"CC",X"CC",X"88",X"CC",X"EE",X"FF",X"77",X"33",X"11",X"00",X"00", + X"00",X"01",X"03",X"07",X"1F",X"3C",X"F0",X"F0",X"00",X"00",X"A0",X"A0",X"B0",X"F0",X"70",X"70", + X"00",X"00",X"40",X"40",X"40",X"E0",X"F0",X"F0",X"00",X"00",X"20",X"60",X"C0",X"80",X"F0",X"F0", + X"F1",X"3F",X"1F",X"07",X"03",X"00",X"88",X"88",X"76",X"77",X"23",X"11",X"00",X"00",X"00",X"00", + X"F0",X"F7",X"F7",X"E6",X"66",X"33",X"11",X"00",X"F0",X"89",X"88",X"CC",X"66",X"33",X"99",X"CC", + X"60",X"C0",X"80",X"00",X"F0",X"C0",X"00",X"00",X"0E",X"0F",X"6F",X"FF",X"F0",X"F0",X"F0",X"FF", + X"00",X"08",X"0E",X"CF",X"F0",X"F0",X"87",X"1E",X"00",X"00",X"10",X"1E",X"F0",X"F0",X"0E",X"F7", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"EF",X"0F",X"1E",X"00",X"00",X"00",X"00",X"00", + X"3C",X"78",X"F3",X"00",X"00",X"00",X"00",X"00",X"C4",X"FF",X"CC",X"66",X"22",X"22",X"22",X"33", + X"00",X"70",X"C0",X"80",X"E0",X"08",X"00",X"77",X"0E",X"0F",X"6F",X"FF",X"FF",X"F0",X"F0",X"F0", + X"00",X"08",X"0E",X"8F",X"FF",X"F0",X"F0",X"C3",X"00",X"00",X"10",X"1E",X"F0",X"C3",X"87",X"2C", + X"44",X"FF",X"CC",X"66",X"22",X"22",X"22",X"33",X"FF",X"FF",X"EF",X"0F",X"0E",X"00",X"00",X"00", + X"CF",X"9E",X"1E",X"08",X"00",X"00",X"00",X"00",X"E0",X"F3",X"F7",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"E1",X"E7",X"CF",X"0F",X"0C",X"00",X"00",X"00",X"00",X"70",X"10",X"40",X"60",X"20", + X"80",X"C0",X"60",X"30",X"B0",X"F0",X"E0",X"E0",X"11",X"10",X"30",X"F0",X"F1",X"C3",X"07",X"00", + X"00",X"00",X"00",X"CC",X"FF",X"FF",X"00",X"00",X"B0",X"90",X"B0",X"F0",X"70",X"31",X"11",X"00", + X"E0",X"F3",X"F3",X"F3",X"F0",X"BE",X"CC",X"00",X"00",X"88",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"40",X"40",X"40",X"C0",X"C0",X"08",X"08",X"7F",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"17", + X"00",X"00",X"00",X"0F",X"0F",X"7F",X"FF",X"FC",X"10",X"10",X"12",X"1E",X"3C",X"F8",X"F0",X"E1", + X"44",X"FF",X"CC",X"66",X"22",X"22",X"22",X"33",X"17",X"16",X"3C",X"F0",X"F1",X"C3",X"07",X"00", + X"F0",X"F0",X"E1",X"E7",X"CF",X"0F",X"0C",X"00",X"87",X"3C",X"79",X"48",X"08",X"00",X"00",X"00", + X"0C",X"0C",X"0C",X"08",X"00",X"00",X"00",X"00",X"03",X"01",X"00",X"70",X"10",X"40",X"60",X"20", + X"1E",X"D2",X"5A",X"70",X"F0",X"F0",X"F0",X"E0",X"F3",X"F3",X"C3",X"87",X"86",X"84",X"00",X"00", + X"00",X"00",X"00",X"CC",X"FF",X"FF",X"00",X"00",X"B0",X"90",X"B0",X"F0",X"70",X"31",X"11",X"00", + X"E0",X"F3",X"F3",X"F3",X"F0",X"BE",X"CC",X"00",X"00",X"88",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"30",X"00",X"00",X"00",X"01",X"01",X"01",X"01", + X"A0",X"A0",X"A0",X"E1",X"E1",X"E1",X"F0",X"F8",X"00",X"00",X"00",X"00",X"00",X"48",X"68",X"68", + X"44",X"FF",X"CC",X"66",X"2A",X"2A",X"2A",X"3F",X"03",X"03",X"07",X"17",X"17",X"17",X"07",X"03", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"3C",X"2C",X"3C",X"9E",X"9E",X"CF",X"CF",X"EF",X"E7", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"A0",X"40",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"0E",X"0E", + X"00",X"00",X"00",X"00",X"E0",X"C0",X"00",X"00",X"00",X"00",X"01",X"00",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00", + X"00",X"04",X"0A",X"41",X"C1",X"90",X"70",X"10",X"00",X"00",X"01",X"02",X"14",X"04",X"02",X"04", + X"06",X"0A",X"01",X"00",X"90",X"E0",X"20",X"10",X"06",X"09",X"80",X"80",X"90",X"A0",X"40",X"00", + X"21",X"C3",X"61",X"30",X"10",X"01",X"02",X"0C",X"38",X"08",X"08",X"06",X"01",X"01",X"00",X"00", + X"F0",X"00",X"10",X"30",X"E0",X"02",X"0D",X"00",X"00",X"80",X"50",X"A0",X"20",X"20",X"05",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00", + X"00",X"00",X"00",X"00",X"01",X"0C",X"06",X"00",X"00",X"00",X"00",X"C0",X"60",X"80",X"41",X"00", + X"10",X"20",X"60",X"80",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"20",X"C0",X"80",X"00",X"00",X"00",X"00",X"06",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"24",X"E1",X"41",X"81",X"70",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"01",X"0A",X"04",X"38",X"04",X"08",X"00",X"0D",X"02",X"40",X"60",X"90",X"C0",X"20", + X"21",X"41",X"E1",X"81",X"82",X"04",X"08",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"70",X"02",X"0D",X"01",X"01",X"00",X"00",X"C0",X"90",X"40",X"C0",X"00",X"0C",X"03",X"00", + X"00",X"20",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"0D",X"05", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"B0",X"80",X"60",X"00",X"02",X"0C",X"06",X"00",X"00",X"00",X"80",X"00", + X"00",X"04",X"0A",X"41",X"C1",X"90",X"70",X"10",X"00",X"00",X"01",X"02",X"14",X"04",X"02",X"04", + X"06",X"0A",X"01",X"00",X"90",X"E0",X"20",X"10",X"06",X"09",X"80",X"80",X"90",X"A0",X"40",X"00", + X"21",X"C3",X"61",X"30",X"10",X"01",X"02",X"0C",X"38",X"08",X"08",X"06",X"01",X"01",X"00",X"00", + X"F0",X"00",X"10",X"30",X"E0",X"02",X"0D",X"00",X"00",X"80",X"50",X"A0",X"20",X"20",X"05",X"0C", + X"00",X"00",X"00",X"00",X"00",X"08",X"04",X"06",X"00",X"00",X"00",X"00",X"0C",X"06",X"01",X"00", + X"00",X"00",X"00",X"60",X"20",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"B0",X"00",X"00", + X"70",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"09",X"06",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"24",X"E1",X"41",X"81",X"70",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"01",X"0A",X"04",X"38",X"04",X"08",X"00",X"0D",X"02",X"40",X"60",X"90",X"C0",X"20", + X"21",X"41",X"E1",X"81",X"82",X"04",X"08",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"70",X"02",X"0D",X"01",X"01",X"00",X"00",X"C0",X"90",X"40",X"C0",X"00",X"0C",X"03",X"00", + X"CF",X"CF",X"CF",X"8F",X"8F",X"9E",X"1E",X"7F",X"F0",X"F0",X"F0",X"FC",X"FC",X"BC",X"75",X"33", + X"41",X"E1",X"C3",X"F0",X"F0",X"F0",X"CB",X"CF",X"F8",X"F0",X"F0",X"F0",X"F1",X"F3",X"FF",X"6F", + X"7C",X"FF",X"FC",X"F6",X"E2",X"22",X"22",X"33",X"33",X"33",X"11",X"11",X"11",X"00",X"00",X"00", + X"CD",X"CD",X"CC",X"CC",X"CC",X"CC",X"CC",X"44",X"0F",X"0F",X"0F",X"07",X"03",X"00",X"00",X"00", + X"90",X"F0",X"C2",X"C2",X"C3",X"C3",X"C7",X"CF",X"00",X"00",X"00",X"00",X"A0",X"A0",X"A0",X"B0", + X"00",X"00",X"00",X"00",X"81",X"C1",X"41",X"41",X"70",X"03",X"07",X"0F",X"3E",X"7E",X"7C",X"FC", + X"CF",X"CF",X"CF",X"8F",X"8F",X"9E",X"1E",X"7F",X"F0",X"F0",X"F0",X"FC",X"FC",X"BC",X"75",X"33", + X"41",X"E1",X"C3",X"F0",X"F0",X"F0",X"CB",X"CF",X"F8",X"F0",X"F0",X"F0",X"F1",X"F3",X"FF",X"6F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"88",X"88",X"C0",X"E0",X"F0",X"00",X"00",X"03",X"02",X"02",X"02",X"02",X"03", + X"00",X"11",X"33",X"77",X"FF",X"BD",X"3C",X"3C",X"00",X"EE",X"FF",X"FF",X"FF",X"FF",X"FE",X"F0", + X"87",X"0E",X"0C",X"08",X"08",X"00",X"00",X"00",X"03",X"06",X"04",X"04",X"06",X"0F",X"00",X"00", + X"3C",X"3C",X"1E",X"0F",X"07",X"03",X"01",X"00",X"F0",X"F0",X"E1",X"C3",X"0F",X"0F",X"0F",X"00", + X"00",X"00",X"00",X"80",X"80",X"0C",X"0E",X"0F",X"00",X"00",X"00",X"00",X"00",X"03",X"02",X"03", + X"00",X"11",X"33",X"70",X"F0",X"96",X"0F",X"0F",X"00",X"EE",X"FF",X"FE",X"F0",X"F0",X"E1",X"0F", + X"0F",X"0E",X"0C",X"08",X"08",X"00",X"00",X"00",X"03",X"06",X"0F",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"07",X"03",X"01",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"00", + X"00",X"00",X"00",X"08",X"08",X"0C",X"0E",X"0F",X"00",X"00",X"0F",X"06",X"04",X"04",X"06",X"03", + X"00",X"10",X"30",X"07",X"0F",X"0F",X"0F",X"0F",X"00",X"E0",X"F0",X"E1",X"0F",X"0F",X"0F",X"0F", + X"7F",X"EE",X"CC",X"88",X"88",X"00",X"00",X"00",X"03",X"02",X"02",X"02",X"02",X"03",X"00",X"00", + X"0F",X"2F",X"AF",X"FF",X"77",X"33",X"11",X"00",X"0F",X"0F",X"1F",X"3F",X"FF",X"FF",X"EE",X"00", + X"00",X"00",X"00",X"08",X"08",X"CC",X"EE",X"FF",X"00",X"00",X"00",X"00",X"00",X"0F",X"06",X"03", + X"00",X"01",X"03",X"07",X"0F",X"2F",X"3F",X"3F",X"00",X"0E",X"0F",X"0F",X"0F",X"0F",X"1F",X"FF", + X"F8",X"E0",X"C0",X"80",X"80",X"00",X"00",X"00",X"03",X"02",X"03",X"00",X"00",X"00",X"00",X"00", + X"3F",X"3D",X"B5",X"F0",X"70",X"30",X"10",X"00",X"FF",X"FF",X"FE",X"FC",X"F0",X"F0",X"E0",X"00", + X"08",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"03",X"07",X"07",X"07",X"01",X"03",X"07",X"0F",X"0F",X"0F",X"0F",X"0F", + X"0F",X"0F",X"E1",X"C0",X"90",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"03",X"01",X"00",X"20",X"30",X"30",X"20",X"0F",X"0F",X"78",X"3C",X"10",X"20",X"E0",X"00", + X"08",X"0C",X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"03", + X"01",X"03",X"07",X"0E",X"0C",X"0C",X"0C",X"08",X"09",X"0B",X"03",X"23",X"67",X"FF",X"FF",X"67", + X"0F",X"0F",X"E1",X"C3",X"90",X"F0",X"00",X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"00",X"00",X"00",X"20",X"30",X"30",X"20",X"47",X"07",X"70",X"30",X"10",X"30",X"E0",X"00", + X"08",X"0C",X"0E",X"0F",X"0F",X"87",X"87",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"32",X"32",X"22",X"00",X"00",X"11",X"11",X"00",X"0F",X"0F",X"03",X"01",X"01",X"F0",X"F0",X"01", + X"0E",X"E0",X"E0",X"F0",X"F2",X"F2",X"F0",X"D0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"01",X"B8",X"88",X"F0",X"F0",X"63",X"03",X"10", + X"08",X"0E",X"0F",X"CF",X"C3",X"C3",X"C3",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"32",X"33",X"11",X"00",X"00",X"03",X"07",X"0F",X"0D",X"81",X"89",X"01",X"01", + X"0E",X"E0",X"E0",X"F0",X"F2",X"F2",X"F0",X"D0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"00",X"01",X"B8",X"88",X"F0",X"F0",X"63",X"03",X"10", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"06",X"0E",X"0C",X"08",X"08",X"00",X"00",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"21", + X"08",X"0C",X"0C",X"0C",X"0E",X"0E",X"8E",X"8F",X"00",X"00",X"01",X"03",X"07",X"0F",X"0E",X"0C", + X"0C",X"8F",X"88",X"88",X"8F",X"0C",X"07",X"00",X"70",X"71",X"77",X"77",X"FF",X"BB",X"AA",X"AA", + X"8F",X"FF",X"FF",X"FF",X"EE",X"44",X"44",X"44",X"19",X"FF",X"FF",X"FF",X"99",X"CC",X"66",X"22", + X"00",X"00",X"08",X"08",X"00",X"07",X"04",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"21", + X"00",X"00",X"00",X"01",X"03",X"06",X"8E",X"8F",X"00",X"00",X"0C",X"09",X"03",X"06",X"0C",X"08", + X"88",X"88",X"88",X"88",X"88",X"0F",X"04",X"07",X"70",X"71",X"77",X"77",X"FF",X"BB",X"AA",X"AA", + X"8F",X"FF",X"FF",X"FF",X"EE",X"44",X"44",X"44",X"19",X"FF",X"FF",X"FF",X"99",X"CC",X"66",X"22", + X"00",X"00",X"06",X"08",X"0E",X"08",X"06",X"88",X"00",X"11",X"33",X"33",X"11",X"33",X"47",X"CF", + X"00",X"FF",X"FF",X"FF",X"CF",X"FF",X"C7",X"6F",X"00",X"CC",X"EE",X"88",X"CF",X"EE",X"FF",X"3F", + X"88",X"88",X"06",X"08",X"0E",X"08",X"06",X"00",X"FF",X"CF",X"47",X"33",X"11",X"33",X"33",X"11", + X"FF",X"E7",X"4F",X"FF",X"CF",X"FF",X"FF",X"FF",X"0F",X"3F",X"FF",X"EE",X"CF",X"88",X"EE",X"CC", + X"00",X"01",X"02",X"04",X"0F",X"8C",X"02",X"89",X"00",X"00",X"00",X"00",X"00",X"33",X"47",X"CF", + X"00",X"77",X"FF",X"FF",X"77",X"FF",X"4F",X"E7",X"00",X"FF",X"FF",X"EE",X"3F",X"FF",X"FF",X"3F", + X"88",X"89",X"02",X"8C",X"0F",X"04",X"02",X"01",X"FF",X"CF",X"47",X"33",X"00",X"00",X"00",X"00", + X"FF",X"6F",X"C7",X"FF",X"77",X"FF",X"FF",X"77",X"0F",X"3F",X"FF",X"FF",X"3F",X"EE",X"FF",X"FF", + X"00",X"07",X"0C",X"8F",X"88",X"88",X"8F",X"0C",X"AA",X"AA",X"BB",X"FF",X"77",X"77",X"71",X"70", + X"44",X"44",X"44",X"EE",X"FF",X"FF",X"FF",X"8F",X"22",X"66",X"CC",X"99",X"FF",X"FF",X"FF",X"19", + X"07",X"00",X"00",X"08",X"08",X"0C",X"0E",X"06",X"21",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"8F",X"8E",X"0E",X"0E",X"0C",X"0C",X"0C",X"08",X"0C",X"0E",X"0F",X"07",X"03",X"01",X"00",X"00", + X"07",X"04",X"0F",X"88",X"88",X"88",X"88",X"88",X"AA",X"AA",X"BB",X"FF",X"77",X"77",X"71",X"70", + X"44",X"44",X"44",X"EE",X"FF",X"FF",X"FF",X"8F",X"22",X"66",X"CC",X"99",X"FF",X"FF",X"FF",X"19", + X"0F",X"04",X"07",X"00",X"08",X"08",X"00",X"00",X"21",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"8F",X"8E",X"06",X"03",X"01",X"00",X"00",X"00",X"08",X"0C",X"06",X"03",X"09",X"0C",X"00",X"00", + X"00",X"00",X"06",X"08",X"0E",X"08",X"06",X"88",X"00",X"11",X"33",X"33",X"11",X"33",X"65",X"CF", + X"00",X"FF",X"FF",X"FF",X"CF",X"FF",X"4F",X"6F",X"00",X"CC",X"EE",X"88",X"CF",X"EE",X"FF",X"3F", + X"88",X"88",X"06",X"08",X"0E",X"08",X"06",X"00",X"FF",X"ED",X"47",X"33",X"11",X"33",X"33",X"11", + X"FF",X"6F",X"4F",X"FF",X"CF",X"FF",X"FF",X"FF",X"0F",X"3F",X"FF",X"EE",X"CF",X"88",X"EE",X"CC", + X"00",X"01",X"02",X"04",X"0F",X"8C",X"02",X"89",X"00",X"00",X"00",X"00",X"00",X"33",X"47",X"ED", + X"00",X"77",X"FF",X"FF",X"77",X"FF",X"4F",X"6F",X"00",X"FF",X"FF",X"EE",X"3F",X"FF",X"FF",X"3F", + X"88",X"89",X"02",X"8C",X"0F",X"04",X"02",X"01",X"FF",X"CF",X"65",X"33",X"00",X"00",X"00",X"00", + X"FF",X"6F",X"4F",X"FF",X"77",X"FF",X"FF",X"77",X"0F",X"3F",X"FF",X"FF",X"3F",X"EE",X"FF",X"70", + X"00",X"00",X"00",X"31",X"35",X"3D",X"2C",X"0C",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"A0",X"A1",X"E1",X"00",X"00",X"33",X"30",X"30",X"30",X"69",X"69", + X"0C",X"0C",X"0C",X"E0",X"EE",X"00",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"80",X"00",X"00",X"0F",X"0F",X"0F",X"30",X"30",X"33",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"F5",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"A0",X"A1",X"E1",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"78", + X"F5",X"3D",X"19",X"00",X"00",X"00",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"80",X"00",X"00",X"78",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"62",X"6A",X"6A",X"48",X"08",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"C0",X"C1",X"E1",X"00",X"00",X"33",X"30",X"30",X"30",X"0F",X"0F", + X"08",X"0C",X"3C",X"34",X"31",X"00",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"80",X"00",X"00",X"69",X"69",X"3C",X"30",X"30",X"33",X"00",X"00", + X"00",X"00",X"00",X"31",X"35",X"35",X"2C",X"0C",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"C0",X"C1",X"E1",X"00",X"00",X"66",X"60",X"60",X"60",X"0F",X"0F", + X"08",X"0C",X"1E",X"71",X"62",X"44",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"C0",X"00",X"00",X"69",X"69",X"69",X"60",X"60",X"66",X"00",X"00", + X"00",X"00",X"00",X"31",X"35",X"3D",X"2C",X"0C",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"A0",X"A1",X"E1",X"00",X"00",X"33",X"30",X"30",X"30",X"0F",X"0F", + X"0C",X"0C",X"0C",X"E0",X"EE",X"00",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"80",X"00",X"00",X"69",X"69",X"3C",X"30",X"30",X"33",X"00",X"00", + X"00",X"00",X"00",X"62",X"6A",X"6A",X"48",X"08",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"C0",X"C1",X"E1",X"00",X"00",X"33",X"30",X"30",X"30",X"69",X"69", + X"08",X"0C",X"3D",X"35",X"31",X"00",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"80",X"00",X"00",X"0F",X"0F",X"0F",X"30",X"30",X"33",X"00",X"00", + X"00",X"00",X"00",X"31",X"35",X"35",X"2C",X"0C",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"C0",X"C1",X"E1",X"00",X"00",X"66",X"60",X"60",X"60",X"69",X"69", + X"08",X"0C",X"1E",X"71",X"62",X"44",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"C0",X"00",X"00",X"0F",X"0F",X"0F",X"60",X"60",X"66",X"00",X"00", + X"00",X"00",X"00",X"44",X"4C",X"4C",X"08",X"08",X"00",X"00",X"70",X"F0",X"70",X"30",X"70",X"F0", + X"00",X"00",X"31",X"B2",X"F2",X"C0",X"E0",X"E1",X"00",X"00",X"80",X"C0",X"C0",X"40",X"0F",X"0F", + X"08",X"08",X"1E",X"1E",X"1E",X"00",X"00",X"00",X"F0",X"70",X"30",X"70",X"F0",X"70",X"00",X"00", + X"E1",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"0F",X"0F",X"40",X"C8",X"C8",X"C8",X"00",X"00", + X"00",X"00",X"00",X"26",X"2E",X"2E",X"08",X"08",X"00",X"00",X"70",X"F0",X"70",X"30",X"70",X"F0", + X"00",X"00",X"11",X"91",X"D1",X"C0",X"E0",X"E1",X"00",X"00",X"80",X"C0",X"C0",X"40",X"0F",X"0F", + X"08",X"08",X"2E",X"2E",X"26",X"00",X"00",X"00",X"F0",X"70",X"30",X"70",X"F0",X"70",X"00",X"00", + X"E1",X"E0",X"C0",X"D1",X"91",X"11",X"00",X"00",X"0F",X"0F",X"40",X"C0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"17",X"1F",X"1F",X"08",X"08",X"00",X"00",X"70",X"F0",X"70",X"30",X"70",X"F0", + X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"E1",X"00",X"00",X"C8",X"C8",X"C8",X"40",X"0F",X"0F", + X"08",X"08",X"4C",X"4C",X"44",X"00",X"00",X"00",X"F0",X"70",X"30",X"70",X"F0",X"70",X"00",X"00", + X"E1",X"E0",X"C0",X"F2",X"B2",X"32",X"00",X"00",X"0F",X"0F",X"40",X"C0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"1F",X"1F",X"1F",X"08",X"08",X"00",X"00",X"70",X"F0",X"70",X"30",X"70",X"F0", + X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"E1",X"00",X"00",X"62",X"62",X"62",X"40",X"0F",X"0F", + X"08",X"08",X"88",X"88",X"88",X"00",X"00",X"00",X"F0",X"70",X"30",X"70",X"F0",X"70",X"00",X"00", + X"E1",X"E0",X"C0",X"C0",X"80",X"00",X"F8",X"F8",X"0F",X"0F",X"41",X"41",X"C0",X"80",X"80",X"00", + X"00",X"00",X"00",X"88",X"88",X"88",X"08",X"08",X"00",X"00",X"70",X"F0",X"70",X"30",X"70",X"F0", + X"F8",X"F8",X"00",X"80",X"C0",X"C0",X"E0",X"E1",X"00",X"80",X"80",X"C0",X"41",X"41",X"0F",X"0F", + X"08",X"08",X"1F",X"1F",X"1F",X"00",X"00",X"00",X"F0",X"70",X"30",X"70",X"F0",X"70",X"00",X"00", + X"E1",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"0F",X"0F",X"40",X"62",X"62",X"62",X"00",X"00", + X"00",X"00",X"00",X"31",X"35",X"3D",X"2C",X"0C",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"81",X"A0",X"A1",X"E1",X"00",X"00",X"33",X"30",X"30",X"30",X"69",X"69", + X"0C",X"0C",X"0C",X"E0",X"EE",X"00",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"80",X"00",X"00",X"0F",X"0F",X"0F",X"30",X"30",X"33",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"F5",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"A0",X"A1",X"E1",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"78", + X"F5",X"3D",X"19",X"00",X"00",X"00",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"80",X"00",X"00",X"78",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"62",X"6A",X"6A",X"48",X"08",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"C0",X"C1",X"E1",X"00",X"00",X"33",X"30",X"30",X"30",X"0F",X"0F", + X"08",X"0C",X"3C",X"34",X"31",X"00",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"80",X"00",X"00",X"69",X"69",X"3C",X"30",X"30",X"33",X"00",X"00", + X"00",X"00",X"00",X"31",X"35",X"35",X"2C",X"0C",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"C0",X"C1",X"E1",X"00",X"00",X"66",X"60",X"60",X"60",X"0F",X"0F", + X"08",X"0C",X"1E",X"71",X"62",X"44",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"80",X"00",X"00",X"69",X"69",X"69",X"60",X"60",X"66",X"00",X"00", + X"00",X"00",X"00",X"31",X"35",X"3D",X"2C",X"0C",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"A0",X"A1",X"E1",X"00",X"00",X"33",X"30",X"30",X"30",X"0F",X"0F", + X"0C",X"0C",X"0C",X"E0",X"EE",X"00",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"80",X"00",X"00",X"69",X"69",X"3C",X"30",X"30",X"33",X"00",X"00", + X"00",X"00",X"00",X"62",X"6A",X"6A",X"48",X"08",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"C0",X"C1",X"E1",X"00",X"00",X"33",X"30",X"30",X"30",X"69",X"69", + X"08",X"0C",X"3D",X"35",X"31",X"00",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"80",X"00",X"00",X"0F",X"0F",X"0F",X"30",X"30",X"33",X"00",X"00", + X"00",X"00",X"00",X"31",X"35",X"35",X"2C",X"0C",X"00",X"00",X"11",X"10",X"30",X"36",X"96",X"F0", + X"00",X"00",X"00",X"E6",X"80",X"C0",X"C1",X"E1",X"00",X"00",X"66",X"60",X"60",X"60",X"69",X"69", + X"08",X"0C",X"1E",X"71",X"62",X"44",X"00",X"00",X"F0",X"70",X"30",X"73",X"F7",X"F7",X"70",X"00", + X"E1",X"E1",X"80",X"80",X"C8",X"80",X"00",X"00",X"0F",X"0F",X"0F",X"60",X"60",X"66",X"00",X"00", + X"00",X"00",X"00",X"44",X"4C",X"4C",X"08",X"08",X"00",X"00",X"70",X"F0",X"70",X"30",X"70",X"F0", + X"00",X"00",X"31",X"B2",X"F2",X"C0",X"E0",X"E1",X"00",X"00",X"80",X"C0",X"C0",X"40",X"0F",X"0F", + X"08",X"08",X"1E",X"1E",X"1E",X"00",X"00",X"00",X"F0",X"70",X"30",X"70",X"F0",X"70",X"00",X"00", + X"E1",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"0F",X"0F",X"40",X"C8",X"C8",X"C8",X"00",X"00", + X"00",X"00",X"00",X"26",X"2E",X"2E",X"08",X"08",X"00",X"00",X"70",X"F0",X"70",X"30",X"70",X"F0", + X"00",X"00",X"11",X"91",X"D1",X"C0",X"E0",X"E1",X"00",X"00",X"80",X"C0",X"C0",X"40",X"0F",X"0F", + X"08",X"08",X"2E",X"2E",X"26",X"00",X"00",X"00",X"F0",X"70",X"30",X"70",X"F0",X"70",X"00",X"00", + X"E1",X"E0",X"C0",X"D1",X"91",X"11",X"00",X"00",X"0F",X"0F",X"40",X"C0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"17",X"1F",X"1F",X"08",X"08",X"00",X"00",X"70",X"F0",X"70",X"30",X"70",X"F0", + X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"E1",X"00",X"00",X"C8",X"C8",X"C8",X"40",X"0F",X"0F", + X"08",X"08",X"4C",X"4C",X"44",X"00",X"00",X"00",X"F0",X"70",X"30",X"70",X"F0",X"70",X"00",X"00", + X"E1",X"E0",X"C0",X"F2",X"B2",X"32",X"00",X"00",X"0F",X"0F",X"40",X"C0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"1F",X"1F",X"1F",X"08",X"08",X"00",X"00",X"70",X"F0",X"70",X"30",X"70",X"F0", + X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"E1",X"00",X"00",X"62",X"62",X"62",X"40",X"0F",X"0F", + X"08",X"08",X"88",X"88",X"88",X"00",X"00",X"00",X"F0",X"70",X"30",X"70",X"F0",X"70",X"00",X"00", + X"E1",X"E0",X"C0",X"C0",X"80",X"00",X"F8",X"F8",X"0F",X"0F",X"41",X"41",X"C0",X"80",X"80",X"00", + X"00",X"00",X"00",X"88",X"88",X"88",X"08",X"08",X"00",X"00",X"70",X"F0",X"70",X"30",X"70",X"F0", + X"F8",X"F8",X"00",X"80",X"C0",X"C0",X"E0",X"E1",X"00",X"80",X"80",X"C0",X"41",X"41",X"0F",X"0F", + X"08",X"08",X"1F",X"1F",X"1F",X"00",X"00",X"00",X"F0",X"70",X"30",X"70",X"F0",X"70",X"00",X"00", + X"E1",X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"0F",X"0F",X"40",X"62",X"62",X"62",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/PROM1_DST.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/PROM1_DST.vhd new file mode 100644 index 00000000..0450232c --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/PROM1_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM1_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM1_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0E",X"0E",X"0E",X"0D",X"0D",X"0C",X"0B",X"0A",X"09", + X"07",X"05",X"04",X"03",X"02",X"01",X"01",X"00",X"00",X"00",X"01",X"01",X"02",X"03",X"04",X"05", + X"07",X"0C",X"0E",X"0E",X"0D",X"0B",X"09",X"0A",X"0B",X"0B",X"0A",X"09",X"06",X"04",X"03",X"05", + X"07",X"09",X"0B",X"0A",X"08",X"05",X"04",X"03",X"03",X"04",X"05",X"03",X"01",X"00",X"00",X"02", + X"07",X"0A",X"0C",X"0D",X"0E",X"0D",X"0C",X"0A",X"07",X"04",X"02",X"01",X"00",X"01",X"02",X"04", + X"07",X"0B",X"0D",X"0E",X"0D",X"0B",X"07",X"03",X"01",X"00",X"01",X"03",X"07",X"0E",X"07",X"00", + X"07",X"0D",X"0B",X"08",X"0B",X"0D",X"09",X"06",X"0B",X"0E",X"0C",X"07",X"09",X"0A",X"06",X"02", + X"07",X"0C",X"08",X"04",X"05",X"07",X"02",X"00",X"03",X"08",X"05",X"01",X"03",X"06",X"03",X"01", + X"00",X"08",X"0F",X"07",X"01",X"08",X"0E",X"07",X"02",X"08",X"0D",X"07",X"03",X"08",X"0C",X"07", + X"04",X"08",X"0B",X"07",X"05",X"08",X"0A",X"07",X"06",X"08",X"09",X"07",X"07",X"08",X"08",X"07", + X"07",X"08",X"06",X"09",X"05",X"0A",X"04",X"0B",X"03",X"0C",X"02",X"0D",X"01",X"0E",X"00",X"0F", + X"00",X"0F",X"01",X"0E",X"02",X"0D",X"03",X"0C",X"04",X"0B",X"05",X"0A",X"06",X"09",X"07",X"08", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F", + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/PROM3_DST.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/PROM3_DST.vhd new file mode 100644 index 00000000..84462c00 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/PROM3_DST.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM3_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM3_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F",X"0F",X"0D",X"0F",X"0F", + X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B",X"07",X"0F",X"0E",X"0D", + X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0E",X"0D",X"0F",X"0F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/PROM4_DST.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/PROM4_DST.vhd new file mode 100644 index 00000000..50779097 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/PROM4_DST.vhd @@ -0,0 +1,32 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM4_DST is +port ( + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM4_DST is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"01",X"00",X"00",X"00",X"00", + X"00",X"0F",X"0B",X"03",X"00",X"00",X"00",X"00",X"00",X"0F",X"0B",X"09",X"00",X"00",X"00",X"00", + X"00",X"0F",X"0B",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"0E", + X"00",X"0C",X"0F",X"01",X"00",X"01",X"0C",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"02",X"0B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0C",X"0B",X"0E",X"00",X"00",X"00",X"00",X"00",X"05",X"01",X"09",X"00",X"05",X"03",X"09", + X"00",X"0B",X"01",X"09",X"00",X"03",X"0C",X"0F",X"00",X"0E",X"00",X"0F",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin + data <= rom_data(to_integer(unsigned(addr))); +end architecture; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/PROM7_DST.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/PROM7_DST.vhd new file mode 100644 index 00000000..88b2ecb3 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/PROM7_DST.vhd @@ -0,0 +1,23 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity PROM7_DST is +port ( + clk : in std_logic; + addr : in std_logic_vector(3 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of PROM7_DST is + type rom is array(0 to 15) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"66",X"EF",X"00",X"F8",X"EA",X"6F",X"00",X"3F",X"00",X"C9",X"38",X"AA",X"AF",X"F6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/ROM_PGM_0.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/ROM_PGM_0.vhd new file mode 100644 index 00000000..4f33c297 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/ROM_PGM_0.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_0 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"F3",X"3E",X"00",X"ED",X"47",X"C3",X"24",X"92",X"77",X"23",X"10",X"FC",X"C9",X"C3",X"18",X"04", + X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"C9",X"78",X"87",X"D7",X"5F",X"23",X"56",X"EB",X"C9", + X"E1",X"87",X"D7",X"5F",X"23",X"56",X"EB",X"E9",X"E1",X"46",X"23",X"4E",X"23",X"E5",X"18",X"12", + X"11",X"90",X"4C",X"06",X"10",X"C3",X"51",X"00",X"F5",X"ED",X"57",X"B7",X"20",X"27",X"F1",X"C3", + X"4F",X"9F",X"2A",X"80",X"4C",X"70",X"2C",X"71",X"2C",X"20",X"02",X"2E",X"C0",X"22",X"80",X"4C", + X"C9",X"1A",X"A7",X"28",X"06",X"1C",X"1C",X"1C",X"10",X"F7",X"C9",X"E1",X"06",X"03",X"7E",X"12", + X"23",X"1C",X"10",X"FA",X"E9",X"32",X"C0",X"50",X"AF",X"32",X"00",X"50",X"F3",X"C5",X"D5",X"E5", + X"DD",X"E5",X"FD",X"E5",X"21",X"8C",X"4E",X"11",X"50",X"50",X"01",X"10",X"00",X"ED",X"B0",X"3A", + X"9C",X"4E",X"A7",X"3A",X"CF",X"4E",X"28",X"03",X"3A",X"9F",X"4E",X"32",X"45",X"50",X"3A",X"AC", + X"4E",X"A7",X"3A",X"DF",X"4E",X"28",X"03",X"3A",X"AF",X"4E",X"32",X"4A",X"50",X"3A",X"BC",X"4E", + X"A7",X"3A",X"EF",X"4E",X"28",X"03",X"3A",X"BF",X"4E",X"32",X"4F",X"50",X"21",X"02",X"4C",X"11", + X"22",X"4C",X"01",X"0A",X"06",X"7E",X"07",X"07",X"12",X"2C",X"1C",X"ED",X"A0",X"10",X"F6",X"09", + X"EB",X"09",X"EB",X"0E",X"0C",X"ED",X"B0",X"21",X"22",X"4C",X"11",X"F2",X"4F",X"01",X"0C",X"00", + X"ED",X"B0",X"21",X"32",X"4C",X"11",X"62",X"50",X"01",X"0C",X"00",X"ED",X"B0",X"CD",X"37",X"01", + X"CD",X"8E",X"01",X"CD",X"00",X"B0",X"3A",X"00",X"4E",X"A7",X"28",X"0C",X"CD",X"13",X"88",X"CD", + X"F8",X"01",X"CD",X"3E",X"02",X"CD",X"8E",X"02",X"3A",X"00",X"4E",X"3D",X"20",X"0F",X"32",X"AC", + X"4E",X"32",X"BC",X"4E",X"32",X"CC",X"4E",X"32",X"DC",X"4E",X"32",X"EC",X"4E",X"CD",X"A3",X"9B", + X"CD",X"58",X"9B",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"3A",X"00",X"4E",X"A7",X"28",X"07", + X"3A",X"80",X"50",X"07",X"D2",X"00",X"00",X"3E",X"01",X"32",X"00",X"50",X"FB",X"F1",X"C9",X"06", + X"A0",X"0A",X"60",X"0A",X"60",X"0A",X"A0",X"21",X"84",X"4C",X"34",X"23",X"35",X"23",X"11",X"2F", + X"01",X"01",X"01",X"04",X"34",X"7E",X"E6",X"0F",X"EB",X"BE",X"20",X"13",X"0C",X"1A",X"C6",X"10", + X"E6",X"F0",X"12",X"23",X"BE",X"20",X"08",X"0C",X"EB",X"36",X"00",X"23",X"13",X"10",X"E5",X"21", + X"8A",X"4C",X"71",X"21",X"8B",X"4C",X"7E",X"87",X"87",X"86",X"3C",X"77",X"21",X"8C",X"4C",X"7E", + X"87",X"86",X"87",X"87",X"86",X"3C",X"77",X"2A",X"8D",X"4C",X"54",X"5D",X"29",X"29",X"19",X"EB", + X"29",X"29",X"29",X"29",X"29",X"29",X"19",X"23",X"22",X"8D",X"4C",X"C9",X"FF",X"FF",X"21",X"90", + X"4C",X"3A",X"8A",X"4C",X"4F",X"06",X"10",X"7E",X"A7",X"28",X"46",X"E6",X"C0",X"07",X"07",X"B9", + X"30",X"3F",X"35",X"7E",X"E6",X"3F",X"20",X"39",X"77",X"C5",X"E5",X"2C",X"7E",X"2C",X"46",X"21", + X"DF",X"01",X"E5",X"E7",X"81",X"B2",X"0D",X"B2",X"27",X"B1",X"68",X"86",X"15",X"83",X"20",X"83", + X"E7",X"01",X"BB",X"91",X"C0",X"91",X"C5",X"91",X"D2",X"01",X"DA",X"01",X"EB",X"01",X"44",X"B0", + X"44",X"B0",X"EF",X"1C",X"14",X"AF",X"32",X"39",X"4F",X"C9",X"21",X"22",X"4E",X"34",X"C9",X"E1", + X"C1",X"2C",X"2C",X"2C",X"10",X"B1",X"C9",X"EF",X"1C",X"86",X"C9",X"78",X"A7",X"3E",X"00",X"20", + X"03",X"32",X"27",X"4F",X"32",X"26",X"4F",X"C9",X"3A",X"6E",X"4E",X"FE",X"99",X"17",X"32",X"06", + X"50",X"1F",X"D0",X"3A",X"00",X"50",X"47",X"CB",X"00",X"3A",X"66",X"4E",X"17",X"E6",X"0F",X"32", + X"66",X"4E",X"D6",X"0C",X"CC",X"70",X"02",X"CB",X"00",X"3A",X"67",X"4E",X"17",X"E6",X"0F",X"32", + X"67",X"4E",X"D6",X"0C",X"C2",X"2B",X"02",X"21",X"69",X"4E",X"34",X"CB",X"00",X"3A",X"68",X"4E", + X"17",X"E6",X"0F",X"32",X"68",X"4E",X"D6",X"0C",X"C0",X"21",X"69",X"4E",X"34",X"C9",X"3A",X"69", + X"4E",X"A7",X"C8",X"47",X"3A",X"6A",X"4E",X"5F",X"FE",X"00",X"C2",X"55",X"02",X"3E",X"01",X"32", + X"07",X"50",X"CD",X"70",X"02",X"7B",X"FE",X"08",X"C2",X"5F",X"02",X"AF",X"32",X"07",X"50",X"1C", + X"7B",X"32",X"6A",X"4E",X"D6",X"10",X"C0",X"32",X"6A",X"4E",X"05",X"78",X"32",X"69",X"4E",X"C9", + X"3A",X"6B",X"4E",X"21",X"6C",X"4E",X"34",X"96",X"C0",X"77",X"3A",X"6D",X"4E",X"21",X"6E",X"4E", + X"86",X"27",X"D2",X"87",X"02",X"3E",X"99",X"77",X"3E",X"01",X"32",X"9C",X"4E",X"C9",X"21",X"DA", + X"4D",X"34",X"DD",X"21",X"D8",X"43",X"FD",X"21",X"C5",X"43",X"3A",X"00",X"4E",X"FE",X"03",X"CA", + X"B1",X"02",X"3A",X"03",X"4E",X"FE",X"02",X"D2",X"B1",X"02",X"CD",X"D6",X"02",X"CD",X"E3",X"02", + X"C9",X"3A",X"09",X"4E",X"A7",X"3A",X"DA",X"4D",X"C2",X"C6",X"02",X"CB",X"67",X"CC",X"D6",X"02", + X"C4",X"F0",X"02",X"C3",X"CE",X"02",X"CB",X"67",X"CC",X"E3",X"02",X"C4",X"FD",X"02",X"3A",X"70", + X"4E",X"A7",X"CC",X"FD",X"02",X"C9",X"DD",X"36",X"00",X"50",X"DD",X"36",X"01",X"55",X"DD",X"36", + X"02",X"31",X"C9",X"FD",X"36",X"00",X"50",X"FD",X"36",X"01",X"55",X"FD",X"36",X"02",X"32",X"C9", + X"DD",X"36",X"00",X"40",X"DD",X"36",X"01",X"40",X"DD",X"36",X"02",X"40",X"C9",X"FD",X"36",X"00", + X"40",X"FD",X"36",X"01",X"40",X"FD",X"36",X"02",X"40",X"C9",X"00",X"FF",X"01",X"00",X"00",X"01", + X"FF",X"00",X"78",X"A7",X"20",X"04",X"2A",X"0A",X"4E",X"7E",X"DD",X"21",X"9A",X"03",X"47",X"87", + X"87",X"80",X"80",X"5F",X"16",X"00",X"DD",X"19",X"DD",X"7E",X"00",X"87",X"47",X"87",X"87",X"4F", + X"87",X"87",X"81",X"80",X"5F",X"16",X"00",X"21",X"8F",X"04",X"19",X"CD",X"18",X"04",X"DD",X"7E", + X"01",X"32",X"BC",X"4D",X"DD",X"7E",X"02",X"47",X"87",X"80",X"5F",X"16",X"00",X"21",X"5F",X"04", + X"19",X"CD",X"50",X"04",X"DD",X"7E",X"03",X"87",X"5F",X"16",X"00",X"FD",X"21",X"7D",X"04",X"FD", + X"19",X"FD",X"6E",X"00",X"FD",X"66",X"01",X"22",X"C7",X"4D",X"DD",X"7E",X"04",X"87",X"5F",X"16", + X"00",X"FD",X"21",X"6B",X"04",X"FD",X"19",X"FD",X"6E",X"00",X"FD",X"66",X"01",X"22",X"C9",X"4D", + X"DD",X"7E",X"05",X"87",X"5F",X"16",X"00",X"FD",X"21",X"59",X"04",X"FD",X"19",X"FD",X"6E",X"00", + X"FD",X"66",X"01",X"CD",X"CB",X"0B",X"CD",X"98",X"9A",X"C9",X"03",X"01",X"01",X"00",X"02",X"00", + X"04",X"01",X"02",X"01",X"03",X"00",X"04",X"01",X"03",X"02",X"04",X"01",X"04",X"02",X"03",X"02", + X"05",X"01",X"05",X"00",X"03",X"02",X"06",X"02",X"05",X"01",X"03",X"03",X"06",X"02",X"05",X"02", + X"03",X"03",X"06",X"02",X"05",X"02",X"03",X"03",X"06",X"02",X"05",X"00",X"03",X"04",X"06",X"02", + X"05",X"01",X"03",X"04",X"07",X"02",X"05",X"02",X"03",X"04",X"07",X"02",X"05",X"02",X"03",X"05", + X"07",X"02",X"05",X"00",X"03",X"05",X"07",X"02",X"05",X"02",X"03",X"05",X"07",X"02",X"05",X"01", + X"03",X"06",X"07",X"02",X"05",X"02",X"03",X"06",X"07",X"02",X"05",X"02",X"03",X"06",X"08",X"02", + X"05",X"02",X"03",X"06",X"08",X"02",X"05",X"02",X"03",X"07",X"08",X"02",X"05",X"02",X"03",X"07", + X"08",X"02",X"06",X"02",X"03",X"07",X"08",X"02",X"11",X"52",X"4D",X"01",X"08",X"00",X"ED",X"B0", + X"E5",X"11",X"00",X"4F",X"01",X"0C",X"00",X"ED",X"B0",X"E1",X"11",X"5A",X"4D",X"01",X"14",X"00", + X"ED",X"B0",X"01",X"0C",X"00",X"A7",X"ED",X"42",X"ED",X"B0",X"01",X"0C",X"00",X"A7",X"ED",X"42", + X"ED",X"B0",X"01",X"0C",X"00",X"A7",X"ED",X"42",X"ED",X"B0",X"01",X"0E",X"00",X"ED",X"B0",X"C9", + X"11",X"C4",X"4D",X"01",X"03",X"00",X"ED",X"B0",X"C9",X"F0",X"00",X"F0",X"00",X"B4",X"00",X"14", + X"1E",X"46",X"00",X"1E",X"3C",X"00",X"00",X"32",X"00",X"00",X"00",X"40",X"00",X"38",X"00",X"30", + X"00",X"28",X"00",X"20",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"18",X"00",X"14",X"0A",X"1E", + X"0F",X"28",X"14",X"32",X"19",X"3C",X"1E",X"50",X"28",X"64",X"32",X"78",X"3C",X"8C",X"46",X"55", + X"2A",X"55",X"2A",X"55",X"55",X"55",X"55",X"55",X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"25", + X"25",X"25",X"25",X"22",X"22",X"22",X"22",X"01",X"01",X"01",X"01",X"58",X"02",X"08",X"07",X"60", + X"09",X"10",X"0E",X"68",X"10",X"70",X"17",X"14",X"19",X"52",X"4A",X"A5",X"94",X"AA",X"2A",X"55", + X"55",X"55",X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"92",X"24",X"25",X"49",X"48",X"24",X"22", + X"91",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"55",X"2A",X"55",X"2A",X"55",X"55",X"55",X"55",X"AA",X"2A",X"55",X"55",X"55", + X"2A",X"55",X"2A",X"52",X"4A",X"A5",X"94",X"48",X"24",X"22",X"91",X"21",X"44",X"44",X"08",X"58", + X"02",X"34",X"08",X"D8",X"09",X"B4",X"0F",X"58",X"11",X"08",X"16",X"34",X"17",X"55",X"55",X"55", + X"55",X"D5",X"6A",X"D5",X"6A",X"AA",X"6A",X"55",X"D5",X"55",X"55",X"55",X"55",X"AA",X"2A",X"55", + X"55",X"92",X"24",X"92",X"24",X"22",X"22",X"22",X"22",X"A4",X"01",X"54",X"06",X"F8",X"07",X"A8", + X"0C",X"D4",X"0D",X"84",X"12",X"B0",X"13",X"D5",X"6A",X"D5",X"6A",X"D6",X"5A",X"AD",X"B5",X"D6", + X"5A",X"AD",X"B5",X"D5",X"6A",X"D5",X"6A",X"AA",X"6A",X"55",X"D5",X"92",X"24",X"25",X"49",X"48", + X"24",X"22",X"91",X"A4",X"01",X"54",X"06",X"F8",X"07",X"A8",X"0C",X"D4",X"0D",X"FE",X"FF",X"FF", + X"FF",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"B6",X"6D",X"6D",X"DB",X"6D",X"6D",X"6D", + X"6D",X"D6",X"5A",X"AD",X"B5",X"25",X"25",X"25",X"25",X"92",X"24",X"92",X"24",X"2C",X"01",X"DC", + X"05",X"08",X"07",X"B8",X"0B",X"E4",X"0C",X"FE",X"FF",X"FF",X"FF",X"D5",X"6A",X"D5",X"6A",X"D5", + X"6A",X"D5",X"6A",X"B6",X"6D",X"6D",X"DB",X"6D",X"6D",X"6D",X"6D",X"D6",X"5A",X"AD",X"B5",X"48", + X"24",X"22",X"91",X"92",X"24",X"92",X"24",X"2C",X"01",X"DC",X"05",X"08",X"07",X"B8",X"0B",X"E4", + X"0C",X"FE",X"FF",X"FF",X"FF",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A", + X"0B",X"0C",X"0D",X"0E",X"0F",X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17",X"CD",X"8B",X"85", + X"C8",X"2A",X"B0",X"4D",X"7C",X"B5",X"C0",X"21",X"CC",X"4E",X"CB",X"C6",X"C9",X"06",X"1E",X"DD", + X"21",X"0A",X"4E",X"FD",X"21",X"38",X"4E",X"DD",X"56",X"00",X"FD",X"5E",X"00",X"FD",X"72",X"00", + X"DD",X"73",X"00",X"DD",X"23",X"FD",X"23",X"10",X"EE",X"C9",X"CD",X"34",X"0B",X"C0",X"21",X"0B", + X"4C",X"3A",X"B1",X"4D",X"A7",X"20",X"06",X"3A",X"33",X"4E",X"A7",X"20",X"06",X"3E",X"1C",X"BE", + X"C8",X"77",X"C9",X"CD",X"46",X"0B",X"3A",X"BC",X"4E",X"A7",X"20",X"05",X"3E",X"02",X"32",X"EC", + X"4E",X"3A",X"CC",X"4D",X"0F",X"7E",X"30",X"06",X"FE",X"0C",X"C8",X"36",X"0C",X"C9",X"FE",X"1C", + X"C8",X"36",X"1C",X"C9",X"C8",X"36",X"0C",X"C9",X"FE",X"1C",X"C8",X"36",X"1C",X"C9",X"AF",X"32", + X"33",X"4E",X"18",X"CD",X"21",X"D0",X"4D",X"34",X"3E",X"08",X"BE",X"C0",X"36",X"00",X"3A",X"CC", + X"4D",X"EE",X"01",X"32",X"CC",X"4D",X"21",X"33",X"4F",X"06",X"06",X"34",X"23",X"10",X"FC",X"C9", + X"3A",X"B2",X"4D",X"A7",X"C0",X"3A",X"CD",X"4D",X"FE",X"07",X"C8",X"87",X"2A",X"CE",X"4D",X"23", + X"22",X"CE",X"4D",X"5F",X"16",X"00",X"DD",X"21",X"92",X"4D",X"DD",X"19",X"DD",X"5E",X"00",X"DD", + X"56",X"01",X"A7",X"ED",X"52",X"C0",X"CB",X"3F",X"3C",X"32",X"CD",X"4D",X"21",X"01",X"01",X"22", + X"BD",X"4D",X"22",X"BF",X"4D",X"C9",X"2A",X"B0",X"4D",X"7C",X"B5",X"C0",X"21",X"28",X"4E",X"7E", + X"3C",X"77",X"D6",X"28",X"D8",X"E7",X"44",X"B0",X"44",X"B0",X"9A",X"07",X"49",X"07",X"B0",X"06", + X"21",X"28",X"4E",X"36",X"00",X"23",X"3E",X"99",X"86",X"27",X"77",X"38",X"33",X"23",X"3E",X"99", + X"86",X"27",X"77",X"38",X"0B",X"21",X"00",X"00",X"22",X"29",X"4E",X"3E",X"0D",X"32",X"B1",X"4D", + X"21",X"2C",X"4E",X"AF",X"77",X"3A",X"29",X"4E",X"ED",X"67",X"23",X"77",X"3A",X"2A",X"4E",X"ED", + X"67",X"CD",X"FF",X"90",X"11",X"2D",X"4E",X"21",X"61",X"43",X"01",X"03",X"02",X"C3",X"CD",X"90", + X"A7",X"20",X"DD",X"23",X"86",X"20",X"D9",X"18",X"D2",X"74",X"E1",X"73",X"75",X"72",X"E0",X"67", + X"6A",X"65",X"10",X"64",X"66",X"67",X"6A",X"68",X"10",X"64",X"66",X"6C",X"77",X"69",X"11",X"6B", + X"6E",X"6C",X"77",X"6D",X"12",X"6B",X"6E",X"78",X"71",X"76",X"13",X"6F",X"70",X"78",X"71",X"79", + X"13",X"6F",X"70",X"63",X"40",X"46",X"43",X"6D",X"40",X"52",X"43",X"7B",X"40",X"69",X"40",X"4D", + X"43",X"72",X"40",X"5B",X"43",X"E3",X"42",X"0F",X"01",X"07",X"08",X"02",X"0F",X"03",X"05",X"04", + X"06",X"01",X"02",X"04",X"08",X"10",X"20",X"40",X"80",X"21",X"2A",X"4E",X"3E",X"0F",X"A6",X"28", + X"08",X"47",X"3E",X"00",X"0E",X"0A",X"81",X"10",X"FD",X"47",X"2B",X"7E",X"0F",X"0F",X"0F",X"0F", + X"E6",X"0F",X"80",X"E7",X"44",X"B0",X"44",X"B0",X"8D",X"08",X"44",X"B0",X"44",X"B0",X"89",X"08", + X"44",X"B0",X"44",X"B0",X"85",X"08",X"44",X"B0",X"44",X"B0",X"00",X"02",X"10",X"00",X"00",X"21", + X"00",X"00",X"32",X"10",X"00",X"43",X"01",X"00",X"14",X"00",X"00",X"31",X"00",X"00",X"23",X"00", + X"40",X"02",X"10",X"04",X"40",X"01",X"30",X"04",X"20",X"03",X"21",X"2B",X"4E",X"34",X"3E",X"1F", + X"A6",X"21",X"7A",X"07",X"D7",X"A7",X"C8",X"F5",X"E6",X"0F",X"CD",X"3A",X"08",X"F1",X"0F",X"0F", + X"0F",X"0F",X"E6",X"0F",X"C3",X"D1",X"07",X"40",X"C4",X"C5",X"40",X"C2",X"C0",X"40",X"C4",X"C5", + X"40",X"C2",X"C0",X"40",X"40",X"C2",X"C0",X"40",X"C4",X"C5",X"40",X"C2",X"C0",X"40",X"C4",X"C5", + X"40",X"E7",X"44",X"B0",X"DE",X"07",X"E7",X"07",X"06",X"08",X"0F",X"08",X"2E",X"08",X"21",X"C4", + X"40",X"11",X"C5",X"07",X"C3",X"56",X"09",X"21",X"C7",X"42",X"11",X"B8",X"07",X"CD",X"56",X"09", + X"3A",X"1E",X"4E",X"A7",X"C8",X"3A",X"0A",X"47",X"32",X"20",X"4E",X"3E",X"1A",X"32",X"0A",X"43", + X"3E",X"0C",X"32",X"0A",X"47",X"C9",X"21",X"CE",X"40",X"11",X"C5",X"07",X"C3",X"56",X"09",X"21", + X"D3",X"42",X"11",X"C5",X"07",X"CD",X"56",X"09",X"3A",X"1F",X"4E",X"A7",X"C8",X"3A",X"16",X"47", + X"32",X"21",X"4E",X"3E",X"1A",X"32",X"16",X"43",X"3E",X"0C",X"32",X"16",X"47",X"C9",X"CD",X"DE", + X"07",X"CD",X"E7",X"07",X"CD",X"06",X"08",X"C3",X"0F",X"08",X"E7",X"44",X"B0",X"47",X"08",X"50", + X"08",X"60",X"08",X"69",X"08",X"79",X"08",X"21",X"C4",X"40",X"11",X"C4",X"07",X"C3",X"56",X"09", + X"21",X"C7",X"42",X"11",X"B7",X"07",X"CD",X"56",X"09",X"3A",X"20",X"4E",X"C3",X"B0",X"0A",X"C9", + X"21",X"CE",X"40",X"11",X"C4",X"07",X"C3",X"56",X"09",X"21",X"D3",X"42",X"11",X"C4",X"07",X"CD", + X"56",X"09",X"3A",X"21",X"4E",X"C3",X"B9",X"0A",X"C9",X"CD",X"47",X"08",X"CD",X"50",X"08",X"CD", + X"60",X"08",X"C3",X"69",X"08",X"0E",X"01",X"18",X"0A",X"0E",X"02",X"18",X"06",X"0E",X"03",X"18", + X"02",X"0E",X"04",X"3A",X"29",X"4E",X"E6",X"0F",X"21",X"37",X"07",X"D7",X"FE",X"0F",X"C8",X"3D", + X"47",X"21",X"16",X"4E",X"D7",X"B9",X"C0",X"3C",X"77",X"87",X"86",X"87",X"4F",X"7E",X"FE",X"05", + X"30",X"13",X"FE",X"01",X"20",X"07",X"3E",X"01",X"32",X"AC",X"4E",X"18",X"08",X"21",X"41",X"07", + X"78",X"D7",X"32",X"BC",X"4E",X"21",X"F9",X"06",X"7D",X"81",X"6F",X"3E",X"00",X"8C",X"67",X"E5", + X"21",X"23",X"07",X"3E",X"07",X"B8",X"20",X"05",X"3A",X"0D",X"4E",X"80",X"47",X"DF",X"D1",X"CD", + X"3D",X"09",X"C9",X"78",X"21",X"16",X"4E",X"D7",X"36",X"00",X"21",X"F9",X"06",X"18",X"E0",X"78", + X"21",X"16",X"4E",X"D7",X"18",X"B1",X"78",X"21",X"16",X"4E",X"D7",X"18",X"AC",X"78",X"21",X"16", + X"4E",X"D7",X"A7",X"C8",X"18",X"A1",X"06",X"08",X"C5",X"05",X"CD",X"FD",X"08",X"C1",X"10",X"F8", + X"C9",X"06",X"08",X"C5",X"05",X"CD",X"EF",X"08",X"C1",X"10",X"F8",X"C9",X"06",X"08",X"C5",X"05", + X"CD",X"F6",X"08",X"C1",X"10",X"F8",X"C9",X"06",X"08",X"C5",X"05",X"CD",X"E3",X"08",X"C1",X"10", + X"F8",X"3A",X"0D",X"4E",X"EE",X"01",X"C6",X"07",X"47",X"CD",X"E3",X"08",X"C9",X"06",X"03",X"D5", + X"DD",X"E1",X"11",X"1F",X"00",X"DD",X"7E",X"00",X"77",X"23",X"DD",X"23",X"DD",X"7E",X"00",X"77", + X"DD",X"23",X"19",X"10",X"F0",X"C9",X"06",X"04",X"C5",X"1A",X"77",X"23",X"13",X"1A",X"77",X"23", + X"13",X"1A",X"77",X"13",X"01",X"1E",X"00",X"09",X"C1",X"10",X"ED",X"C9",X"03",X"02",X"9C",X"43", + X"E0",X"D1",X"C3",X"D0",X"D0",X"D0",X"03",X"02",X"53",X"40",X"D0",X"D0",X"D0",X"6A",X"D6",X"C7", + X"03",X"02",X"9C",X"43",X"66",X"D1",X"C3",X"D0",X"D0",X"D0",X"03",X"02",X"53",X"40",X"D0",X"D0", + X"D0",X"E1",X"D6",X"C7",X"03",X"06",X"3C",X"41",X"CE",X"D8",X"C3",X"D0",X"D0",X"D0",X"D0",X"D0", + X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"CF",X"D7",X"C7",X"03",X"03",X"96",X"41",X"40",X"D9", + X"DA",X"D0",X"D0",X"D0",X"CF",X"F9",X"DE",X"03",X"04",X"19",X"42",X"CE",X"F8",X"DA",X"D0",X"D0", + X"D0",X"D0",X"D0",X"D0",X"40",X"DB",X"DE",X"03",X"03",X"0E",X"42",X"CE",X"F8",X"DA",X"D0",X"D0", + X"D0",X"CF",X"D7",X"C7",X"03",X"03",X"8A",X"41",X"40",X"D9",X"DA",X"D0",X"D0",X"D0",X"63",X"F9", + X"DE",X"03",X"04",X"07",X"42",X"CE",X"F8",X"DA",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"CF",X"D7", + X"C7",X"03",X"03",X"84",X"41",X"40",X"D9",X"DA",X"D0",X"D0",X"D0",X"40",X"DB",X"DE",X"02",X"01", + X"FA",X"41",X"1C",X"1D",X"02",X"01",X"77",X"41",X"1C",X"1D",X"04",X"01",X"F2",X"41",X"1C",X"1D", + X"1D",X"1D",X"03",X"01",X"EB",X"41",X"1C",X"1D",X"1D",X"03",X"01",X"EB",X"42",X"1C",X"1D",X"1D", + X"02",X"01",X"E5",X"41",X"1C",X"1D",X"E4",X"78",X"94",X"09",X"1C",X"80",X"B4",X"80",X"AA",X"09", + X"1C",X"80",X"CC",X"80",X"B7",X"09",X"1C",X"00",X"74",X"78",X"C7",X"09",X"1C",X"00",X"54",X"58", + X"D4",X"09",X"1C",X"00",X"3C",X"80",X"E1",X"09",X"1C",X"00",X"24",X"58",X"F1",X"09",X"1C",X"00", + X"20",X"20",X"1C",X"00",X"38",X"E0",X"1C",X"80",X"70",X"20",X"1C",X"00",X"98",X"E0",X"1C",X"80", + X"E0",X"20",X"1C",X"00",X"50",X"20",X"1C",X"00",X"70",X"E0",X"1C",X"80",X"98",X"20",X"1C",X"00", + X"24",X"02",X"02",X"02",X"02",X"10",X"FF",X"FF",X"28",X"16",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3E",X"01",X"BC",X"38",X"1A",X"20",X"0C",X"3E",X"00",X"BD",X"20",X"13",X"21",X"00",X"15",X"22", + X"30",X"4E",X"C9",X"3E",X"50",X"BD",X"38",X"F4",X"21",X"00",X"20",X"22",X"30",X"4E",X"C9",X"22", + X"30",X"4E",X"C9",X"30",X"4E",X"AF",X"96",X"27",X"77",X"23",X"3E",X"10",X"9E",X"27",X"77",X"C9", + X"32",X"0A",X"47",X"3E",X"40",X"32",X"0A",X"43",X"C9",X"32",X"16",X"47",X"3E",X"40",X"32",X"16", + X"43",X"C9",X"21",X"22",X"0F",X"DD",X"21",X"2A",X"0F",X"18",X"07",X"21",X"8C",X"0F",X"DD",X"21", + X"94",X"0F",X"06",X"00",X"DD",X"09",X"79",X"3D",X"0F",X"E6",X"06",X"4F",X"09",X"5E",X"23",X"56", + X"DD",X"7E",X"00",X"12",X"C9",X"21",X"00",X"0F",X"18",X"03",X"21",X"6A",X"0F",X"06",X"00",X"5E", + X"23",X"56",X"D5",X"DD",X"E1",X"79",X"0F",X"30",X"05",X"11",X"00",X"04",X"DD",X"19",X"23",X"79", + X"87",X"87",X"4F",X"09",X"7E",X"DD",X"77",X"00",X"23",X"7E",X"DD",X"77",X"20",X"23",X"7E",X"DD", + X"77",X"40",X"23",X"7E",X"DD",X"77",X"60",X"C9",X"22",X"D7",X"4D",X"0E",X"04",X"CD",X"EA",X"0A", + X"0E",X"05",X"CD",X"EA",X"0A",X"C9",X"22",X"D7",X"4D",X"0E",X"02",X"CD",X"EA",X"0A",X"0E",X"03", + X"CD",X"EA",X"0A",X"C9",X"CD",X"82",X"85",X"47",X"3A",X"1A",X"4F",X"D6",X"09",X"0E",X"00",X"38", + X"02",X"0E",X"0F",X"78",X"B1",X"C9",X"E5",X"2A",X"D7",X"4D",X"2D",X"20",X"10",X"3A",X"C9",X"4D", + X"6F",X"24",X"3E",X"0F",X"A4",X"28",X"0B",X"E5",X"4F",X"CD",X"CB",X"0A",X"E1",X"22",X"D7",X"4D", + X"E1",X"C9",X"CD",X"6E",X"0B",X"AF",X"32",X"33",X"4E",X"E1",X"36",X"1C",X"E1",X"C9",X"3A",X"1E", + X"4E",X"4F",X"3A",X"1F",X"4E",X"B1",X"21",X"01",X"0F",X"28",X"0E",X"22",X"D7",X"4D",X"0E",X"00", + X"CD",X"EA",X"0A",X"0E",X"01",X"CD",X"EA",X"0A",X"C9",X"CD",X"18",X"0B",X"C9",X"3A",X"3F",X"4F", + X"B7",X"20",X"04",X"3A",X"40",X"50",X"C9",X"2A",X"3D",X"4F",X"2D",X"20",X"13",X"3A",X"3B",X"4F", + X"6F",X"24",X"3E",X"0F",X"A4",X"28",X"0E",X"22",X"3D",X"4F",X"4F",X"CD",X"C2",X"0A",X"E1",X"C9", + X"22",X"3D",X"4F",X"E1",X"C9",X"21",X"01",X"0F",X"22",X"3D",X"4F",X"0E",X"02",X"CD",X"E5",X"0A", + X"0E",X"03",X"CD",X"E5",X"0A",X"AF",X"32",X"3F",X"4F",X"E1",X"C9",X"22",X"A1",X"4D",X"3A",X"13", + X"4E",X"87",X"4F",X"06",X"00",X"21",X"3A",X"0F",X"09",X"5E",X"23",X"56",X"EB",X"22",X"3B",X"4F", + X"AF",X"32",X"3F",X"4F",X"C9",X"CD",X"40",X"93",X"0E",X"00",X"CD",X"E5",X"0A",X"0E",X"00",X"CD", + X"EA",X"0A",X"C9",X"CD",X"0F",X"91",X"0E",X"01",X"CD",X"E5",X"0A",X"0E",X"01",X"CD",X"EA",X"0A", + X"C9",X"47",X"2F",X"E6",X"0F",X"CA",X"B0",X"8B",X"2A",X"41",X"4F",X"7D",X"B4",X"28",X"19",X"3A", + X"09",X"4D",X"FE",X"58",X"38",X"0C",X"FE",X"68",X"38",X"17",X"FE",X"90",X"38",X"04",X"FE",X"A0", + X"38",X"0F",X"21",X"00",X"00",X"22",X"41",X"4F",X"78",X"CB",X"4F",X"CA",X"FF",X"8C",X"C3",X"A1", + X"8B",X"78",X"2A",X"41",X"4F",X"E9",X"0F",X"D2",X"0D",X"8D",X"0F",X"D2",X"0D",X"8D",X"0F",X"D2", + X"06",X"8D",X"C3",X"06",X"8D",X"0F",X"D2",X"FF",X"8C",X"0F",X"D2",X"FF",X"8C",X"0F",X"D2",X"14", + X"8D",X"C3",X"14",X"8D",X"0F",X"D2",X"0D",X"8D",X"0F",X"D2",X"FF",X"8C",X"0F",X"D2",X"0D",X"8D", + X"C3",X"FF",X"8C",X"0F",X"D2",X"06",X"8D",X"0F",X"D2",X"14",X"8D",X"0F",X"D2",X"06",X"8D",X"C3", + X"14",X"8D",X"E6",X"07",X"FE",X"04",X"C0",X"D1",X"ED",X"5B",X"08",X"4D",X"21",X"CC",X"0F",X"06", + X"08",X"7B",X"BE",X"23",X"20",X"18",X"7A",X"BE",X"20",X"14",X"21",X"DC",X"0F",X"3E",X"08",X"90", + X"E6",X"06",X"5F",X"16",X"00",X"19",X"5E",X"23",X"56",X"ED",X"53",X"41",X"4F",X"C9",X"23",X"10", + X"E0",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"D1",X"42",X"FC",X"05",X"05",X"EC",X"1D",X"1D",X"1D",X"1D",X"FC",X"05",X"05",X"EC",X"1D",X"1D", + X"1D",X"1D",X"FC",X"05",X"05",X"EC",X"1B",X"1B",X"1B",X"1B",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"31",X"43",X"11",X"43",X"F1",X"42",X"D1",X"42",X"EC",X"ED",X"EE",X"EF",X"FA",X"08", + X"07",X"06",X"01",X"08",X"07",X"06",X"01",X"FF",X"FE",X"FD",X"12",X"00",X"16",X"00",X"1A",X"00", + X"1E",X"00",X"25",X"00",X"2D",X"00",X"34",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"00", + X"3C",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"00", + X"3C",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"00",X"D1",X"40",X"FB",X"01",X"01",X"FA", + X"1D",X"1D",X"1D",X"1D",X"FC",X"05",X"05",X"EC",X"1D",X"1D",X"1D",X"1D",X"FC",X"05",X"05",X"EC", + X"1B",X"1B",X"1B",X"1B",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"31",X"41",X"11",X"41", + X"F1",X"40",X"D1",X"40",X"EC",X"ED",X"EE",X"EF",X"FA",X"08",X"07",X"06",X"01",X"08",X"07",X"06", + X"01",X"FF",X"FE",X"FD",X"08",X"1A",X"0C",X"00",X"09",X"1D",X"0D",X"00",X"0A",X"1F",X"0E",X"00", + X"0B",X"1B",X"0F",X"00",X"0C",X"1E",X"08",X"00",X"0D",X"13",X"09",X"00",X"0E",X"1B",X"0A",X"00", + X"0F",X"0C",X"0B",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"9C",X"5C",X"94",X"64", + X"94",X"5C",X"8C",X"64",X"9C",X"9C",X"94",X"94",X"94",X"9C",X"8C",X"94",X"36",X"0C",X"45",X"0C", + X"54",X"0C",X"63",X"0C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr(11 downto 0)))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/ROM_PGM_1.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/ROM_PGM_1.vhd new file mode 100644 index 00000000..1a7dea71 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/ROM/ROM_PGM_1.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM_1 is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"3E",X"02",X"32",X"22",X"4E",X"C9",X"06",X"01",X"0E",X"0A",X"CD",X"A4",X"80",X"3A",X"E3",X"4D", + X"A7",X"C0",X"0E",X"02",X"16",X"00",X"1E",X"00",X"CD",X"CA",X"80",X"C9",X"06",X"06",X"0E",X"0A", + X"CD",X"A4",X"80",X"3A",X"E3",X"4D",X"A7",X"C0",X"0E",X"02",X"16",X"00",X"1E",X"00",X"CD",X"CA", + X"80",X"C9",X"06",X"00",X"18",X"12",X"06",X"02",X"18",X"0E",X"06",X"03",X"18",X"0A",X"06",X"04", + X"18",X"06",X"06",X"05",X"18",X"02",X"06",X"07",X"0E",X"0A",X"CD",X"A4",X"80",X"3A",X"E3",X"4D", + X"A7",X"C0",X"21",X"22",X"4E",X"34",X"C9",X"06",X"00",X"0E",X"01",X"CD",X"A4",X"80",X"3A",X"E3", + X"4D",X"A7",X"C0",X"0E",X"02",X"16",X"01",X"1E",X"00",X"CD",X"CA",X"80",X"C9",X"06",X"05",X"0E", + X"01",X"CD",X"A4",X"80",X"3A",X"E3",X"4D",X"A7",X"C0",X"0E",X"01",X"16",X"01",X"1E",X"00",X"CD", + X"CA",X"80",X"C9",X"06",X"01",X"18",X"0E",X"06",X"02",X"18",X"0A",X"06",X"03",X"18",X"06",X"06", + X"04",X"18",X"02",X"06",X"06",X"0E",X"01",X"CD",X"A4",X"80",X"3A",X"E3",X"4D",X"A7",X"C0",X"21", + X"22",X"4E",X"34",X"C9",X"21",X"E3",X"4D",X"AF",X"86",X"20",X"04",X"71",X"79",X"23",X"70",X"E7", + X"44",X"B0",X"DF",X"80",X"37",X"81",X"4E",X"81",X"62",X"81",X"76",X"81",X"A6",X"81",X"B2",X"81", + X"44",X"B0",X"44",X"B0",X"DC",X"81",X"0C",X"82",X"23",X"82",X"3A",X"13",X"4E",X"A7",X"47",X"79", + X"28",X"06",X"7A",X"CB",X"08",X"38",X"01",X"7B",X"21",X"22",X"4E",X"86",X"3C",X"77",X"C9",X"21", + X"E4",X"4D",X"7E",X"87",X"86",X"87",X"21",X"26",X"0A",X"85",X"6F",X"3E",X"00",X"8C",X"67",X"11", + X"E5",X"4D",X"01",X"06",X"00",X"ED",X"B0",X"AF",X"12",X"1E",X"F0",X"16",X"00",X"CD",X"31",X"82", + X"16",X"03",X"1E",X"01",X"21",X"0A",X"4C",X"3A",X"EA",X"4D",X"4F",X"82",X"77",X"23",X"3A",X"E9", + X"4D",X"47",X"77",X"23",X"79",X"83",X"77",X"23",X"70",X"CD",X"20",X"81",X"CD",X"32",X"81",X"C9", + X"CD",X"B8",X"90",X"C8",X"21",X"0A",X"4C",X"3E",X"C0",X"47",X"AE",X"77",X"23",X"23",X"78",X"AE", + X"77",X"C9",X"21",X"E3",X"4D",X"34",X"C9",X"11",X"70",X"0A",X"06",X"01",X"CD",X"45",X"82",X"C0", + X"1E",X"F4",X"16",X"00",X"CD",X"31",X"82",X"16",X"05",X"1E",X"04",X"C3",X"04",X"81",X"11",X"70", + X"0A",X"06",X"02",X"CD",X"45",X"82",X"C0",X"1E",X"F8",X"16",X"08",X"CD",X"31",X"82",X"CD",X"32", + X"81",X"C9",X"11",X"70",X"0A",X"06",X"03",X"CD",X"45",X"82",X"C0",X"1E",X"FC",X"16",X"0C",X"CD", + X"31",X"82",X"CD",X"32",X"81",X"C9",X"11",X"70",X"0A",X"06",X"04",X"CD",X"45",X"82",X"C0",X"3E", + X"04",X"32",X"EC",X"4E",X"AF",X"32",X"BC",X"4E",X"1E",X"00",X"16",X"10",X"CD",X"31",X"82",X"16", + X"07",X"1E",X"06",X"CD",X"04",X"81",X"2A",X"E7",X"4D",X"4E",X"23",X"46",X"23",X"5E",X"23",X"56", + X"23",X"EB",X"CD",X"C3",X"81",X"C9",X"11",X"70",X"0A",X"06",X"05",X"CD",X"45",X"82",X"C0",X"C3", + X"F9",X"80",X"11",X"70",X"0A",X"06",X"06",X"CD",X"45",X"82",X"C0",X"CD",X"55",X"82",X"AF",X"32", + X"E3",X"4D",X"C9",X"D5",X"DD",X"E1",X"11",X"20",X"00",X"7B",X"91",X"5F",X"C5",X"DD",X"7E",X"00", + X"77",X"23",X"DD",X"23",X"0D",X"20",X"F6",X"C1",X"19",X"10",X"F1",X"C9",X"21",X"E4",X"4D",X"7E", + X"87",X"87",X"21",X"50",X"0A",X"85",X"6F",X"3E",X"00",X"8C",X"67",X"5E",X"23",X"56",X"ED",X"53", + X"E5",X"4D",X"23",X"5E",X"23",X"56",X"ED",X"53",X"E9",X"4D",X"AF",X"32",X"EB",X"4D",X"1E",X"00", + X"16",X"08",X"CD",X"31",X"82",X"16",X"11",X"1E",X"10",X"C3",X"04",X"81",X"11",X"78",X"0A",X"06", + X"01",X"CD",X"45",X"82",X"C0",X"3A",X"E4",X"4D",X"47",X"CD",X"F6",X"08",X"CD",X"55",X"82",X"CD", + X"32",X"81",X"C9",X"11",X"78",X"0A",X"06",X"02",X"CD",X"45",X"82",X"C0",X"AF",X"32",X"E3",X"4D", + X"C9",X"2A",X"E5",X"4D",X"22",X"08",X"4D",X"3A",X"EA",X"4D",X"A7",X"28",X"03",X"AF",X"92",X"57", + X"19",X"22",X"0A",X"4D",X"C9",X"21",X"EB",X"4D",X"34",X"4E",X"EB",X"AF",X"86",X"23",X"10",X"FC", + X"91",X"C8",X"D0",X"AF",X"C9",X"21",X"00",X"00",X"22",X"0A",X"4C",X"22",X"0C",X"4C",X"22",X"08", + X"4D",X"22",X"0A",X"4D",X"C9",X"21",X"E4",X"F8",X"22",X"08",X"4D",X"2E",X"34",X"26",X"1C",X"22", + X"0A",X"4C",X"21",X"0C",X"AC",X"22",X"0A",X"4D",X"2E",X"00",X"26",X"1C",X"22",X"0C",X"4C",X"AF", + X"32",X"EB",X"4D",X"CD",X"DA",X"01",X"CD",X"20",X"81",X"C9",X"3E",X"02",X"32",X"CC",X"4E",X"CD", + X"DA",X"01",X"C9",X"21",X"EB",X"4D",X"34",X"7E",X"E6",X"07",X"C0",X"DD",X"21",X"08",X"4D",X"FD", + X"21",X"0A",X"03",X"CD",X"47",X"91",X"22",X"08",X"4D",X"AF",X"11",X"E4",X"DC",X"ED",X"52",X"28", + X"0B",X"DD",X"21",X"00",X"4C",X"CD",X"63",X"89",X"CD",X"C4",X"82",X"C9",X"CD",X"DA",X"01",X"AF", + X"32",X"EB",X"4D",X"C9",X"CD",X"B8",X"90",X"C8",X"21",X"0A",X"4C",X"3E",X"C0",X"AE",X"77",X"C9", + X"CD",X"BD",X"93",X"EF",X"04",X"00",X"CD",X"DA",X"01",X"C9",X"21",X"EB",X"4D",X"34",X"7E",X"FE", + X"1E",X"28",X"12",X"FE",X"2A",X"D8",X"21",X"0C",X"AC",X"22",X"0A",X"4D",X"3E",X"01",X"32",X"CC", + X"4E",X"32",X"22",X"4E",X"C9",X"3E",X"01",X"32",X"0C",X"4C",X"21",X"08",X"B4",X"22",X"0A",X"4D", + X"21",X"AC",X"4E",X"36",X"04",X"CD",X"09",X"83",X"C9",X"CD",X"B8",X"90",X"C8",X"21",X"0C",X"4C", + X"3E",X"C0",X"AE",X"77",X"C9",X"AF",X"32",X"DE",X"4D",X"21",X"00",X"00",X"22",X"0A",X"4D",X"C9", + X"EF",X"1C",X"A2",X"C9",X"57",X"21",X"B7",X"4D",X"86",X"C8",X"5F",X"72",X"19",X"14",X"72",X"C9", + X"21",X"E2",X"4D",X"7E",X"A7",X"C8",X"36",X"00",X"07",X"07",X"07",X"E6",X"07",X"47",X"CD",X"E3", + X"08",X"C9",X"3A",X"B0",X"4D",X"4F",X"3A",X"DD",X"4D",X"B1",X"C0",X"3A",X"B8",X"4D",X"E7",X"44", + X"B0",X"5B",X"83",X"6F",X"83",X"7E",X"83",X"44",X"B0",X"44",X"B0",X"21",X"00",X"00",X"22",X"0C", + X"4D",X"22",X"3C",X"4D",X"22",X"00",X"4D",X"CD",X"71",X"85",X"22",X"EC",X"4D",X"18",X"0A",X"2A", + X"EC",X"4D",X"2B",X"22",X"EC",X"4D",X"7C",X"B5",X"C0",X"21",X"B8",X"4D",X"34",X"C9",X"0E",X"00", + X"CD",X"DA",X"84",X"22",X"0C",X"4D",X"22",X"3C",X"4D",X"D9",X"22",X"00",X"4D",X"EB",X"22",X"18", + X"4D",X"22",X"24",X"4D",X"79",X"32",X"30",X"4D",X"32",X"36",X"4D",X"3E",X"02",X"32",X"03",X"4C", + X"AF",X"32",X"B8",X"4D",X"32",X"AC",X"4D",X"C9",X"3A",X"B0",X"4D",X"4F",X"3A",X"DD",X"4D",X"B1", + X"C0",X"3A",X"B9",X"4D",X"E7",X"44",X"B0",X"C1",X"83",X"D5",X"83",X"E4",X"83",X"44",X"B0",X"44", + X"B0",X"21",X"00",X"00",X"22",X"0E",X"4D",X"22",X"3E",X"4D",X"22",X"02",X"4D",X"CD",X"71",X"85", + X"22",X"EE",X"4D",X"18",X"0A",X"2A",X"EE",X"4D",X"2B",X"22",X"EE",X"4D",X"7C",X"B5",X"C0",X"21", + X"B9",X"4D",X"34",X"C9",X"0E",X"01",X"CD",X"DA",X"84",X"22",X"0E",X"4D",X"22",X"3E",X"4D",X"D9", + X"22",X"02",X"4D",X"EB",X"22",X"1A",X"4D",X"22",X"26",X"4D",X"79",X"32",X"31",X"4D",X"32",X"37", + X"4D",X"3E",X"04",X"32",X"05",X"4C",X"AF",X"32",X"B9",X"4D",X"32",X"AD",X"4D",X"C9",X"3A",X"B0", + X"4D",X"4F",X"3A",X"DD",X"4D",X"B1",X"C0",X"3A",X"BA",X"4D",X"E7",X"44",X"B0",X"27",X"84",X"3B", + X"84",X"4A",X"84",X"44",X"B0",X"44",X"B0",X"21",X"00",X"00",X"22",X"10",X"4D",X"22",X"40",X"4D", + X"22",X"04",X"4D",X"CD",X"71",X"85",X"22",X"F0",X"4D",X"18",X"0A",X"2A",X"F0",X"4D",X"2B",X"22", + X"F0",X"4D",X"7C",X"B5",X"C0",X"21",X"BA",X"4D",X"34",X"C9",X"0E",X"02",X"CD",X"DA",X"84",X"22", + X"10",X"4D",X"22",X"40",X"4D",X"D9",X"22",X"04",X"4D",X"EB",X"22",X"1C",X"4D",X"22",X"28",X"4D", + X"79",X"32",X"32",X"4D",X"32",X"38",X"4D",X"3E",X"06",X"32",X"07",X"4C",X"AF",X"32",X"BA",X"4D", + X"32",X"AE",X"4D",X"C9",X"3A",X"B0",X"4D",X"4F",X"3A",X"DD",X"4D",X"B1",X"C0",X"3A",X"BB",X"4D", + X"E7",X"44",X"B0",X"8D",X"84",X"A1",X"84",X"B0",X"84",X"44",X"B0",X"44",X"B0",X"21",X"00",X"00", + X"22",X"12",X"4D",X"22",X"42",X"4D",X"22",X"06",X"4D",X"CD",X"71",X"85",X"22",X"F2",X"4D",X"18", + X"0A",X"2A",X"F2",X"4D",X"2B",X"22",X"F2",X"4D",X"7C",X"B5",X"C0",X"21",X"BB",X"4D",X"34",X"C9", + X"0E",X"03",X"CD",X"DA",X"84",X"22",X"12",X"4D",X"22",X"42",X"4D",X"D9",X"22",X"06",X"4D",X"EB", + X"22",X"1E",X"4D",X"22",X"2A",X"4D",X"79",X"32",X"33",X"4D",X"32",X"39",X"4D",X"3E",X"08",X"32", + X"09",X"4C",X"AF",X"32",X"BB",X"4D",X"32",X"AF",X"4D",X"C9",X"06",X"00",X"3A",X"8B",X"4C",X"0F", + X"0F",X"0F",X"0F",X"E6",X"07",X"0F",X"CE",X"00",X"4F",X"21",X"16",X"4E",X"09",X"06",X"08",X"3E", + X"07",X"B9",X"30",X"04",X"21",X"1D",X"4E",X"4F",X"7E",X"A7",X"28",X"04",X"FE",X"05",X"38",X"06", + X"2B",X"0D",X"10",X"EB",X"0E",X"00",X"3E",X"07",X"B9",X"79",X"20",X"04",X"3A",X"0D",X"4E",X"81", + X"07",X"07",X"07",X"4F",X"06",X"00",X"21",X"29",X"85",X"09",X"06",X"04",X"5E",X"23",X"56",X"23", + X"D5",X"10",X"F9",X"C1",X"D1",X"E1",X"D9",X"E1",X"C9",X"24",X"22",X"24",X"24",X"00",X"01",X"02", + X"02",X"27",X"39",X"3C",X"DC",X"00",X"FF",X"00",X"00",X"2E",X"22",X"74",X"24",X"00",X"01",X"02", + X"02",X"33",X"39",X"9C",X"DC",X"00",X"FF",X"00",X"00",X"3C",X"22",X"E4",X"24",X"00",X"01",X"02", + X"02",X"2A",X"22",X"54",X"24",X"00",X"01",X"02",X"02",X"2E",X"39",X"74",X"DC",X"00",X"FF",X"00", + X"00",X"33",X"22",X"9C",X"24",X"00",X"01",X"02",X"02",X"3C",X"39",X"E4",X"DC",X"00",X"FF",X"00", + X"00",X"2A",X"8B",X"4C",X"3E",X"03",X"A4",X"FE",X"03",X"20",X"01",X"3D",X"67",X"C9",X"CD",X"8B", + X"85",X"C0",X"3A",X"DD",X"4D",X"4F",X"3A",X"B0",X"4D",X"B1",X"C9",X"21",X"16",X"4E",X"06",X"07", + X"7E",X"23",X"B6",X"10",X"FC",X"A7",X"C9",X"3E",X"40",X"32",X"CC",X"4E",X"3E",X"1C",X"CD",X"FF", + X"B0",X"F7",X"43",X"07",X"00",X"C3",X"BB",X"91",X"3E",X"00",X"CD",X"FF",X"B0",X"F7",X"42",X"07", + X"00",X"C3",X"BB",X"91",X"3E",X"0C",X"18",X"E6",X"3E",X"02",X"18",X"E2",X"3A",X"CC",X"4E",X"A7", + X"C0",X"C3",X"BB",X"91",X"AF",X"32",X"06",X"4E",X"3E",X"0C",X"32",X"04",X"4E",X"C9",X"AF",X"32", + X"CC",X"4E",X"32",X"DC",X"4E",X"32",X"EC",X"4E",X"32",X"9C",X"4E",X"32",X"AC",X"4E",X"32",X"BC", + X"4E",X"21",X"02",X"4C",X"06",X"08",X"CF",X"32",X"0C",X"4C",X"32",X"0D",X"4C",X"3E",X"06",X"18", + X"AD",X"3A",X"B0",X"4D",X"A7",X"C8",X"E1",X"3A",X"DD",X"4D",X"E7",X"44",X"B0",X"0F",X"86",X"15", + X"86",X"1B",X"86",X"21",X"86",X"44",X"B0",X"42",X"86",X"50",X"86",X"44",X"B0",X"48",X"86",X"AF", + X"32",X"03",X"4C",X"18",X"10",X"AF",X"32",X"05",X"4C",X"18",X"0A",X"AF",X"32",X"07",X"4C",X"18", + X"04",X"AF",X"32",X"09",X"4C",X"3A",X"DC",X"4D",X"C6",X"18",X"4F",X"06",X"1C",X"CD",X"42",X"00", + X"3E",X"05",X"32",X"DD",X"4D",X"CD",X"6D",X"86",X"F7",X"42",X"03",X"00",X"3E",X"60",X"CD",X"73", + X"86",X"C9",X"3A",X"B0",X"4D",X"32",X"B7",X"4D",X"AF",X"32",X"B0",X"4D",X"32",X"DD",X"4D",X"C9", + X"CD",X"C1",X"90",X"CD",X"30",X"83",X"3E",X"08",X"32",X"DD",X"4D",X"CD",X"6D",X"86",X"F7",X"42", + X"03",X"00",X"0E",X"60",X"CD",X"73",X"86",X"C9",X"21",X"DD",X"4D",X"34",X"C9",X"3E",X"20",X"32", + X"AC",X"4E",X"C9",X"3A",X"39",X"4F",X"A7",X"3E",X"03",X"32",X"39",X"4F",X"28",X"1A",X"21",X"91", + X"4C",X"06",X"10",X"11",X"03",X"00",X"3E",X"0A",X"BE",X"20",X"09",X"2B",X"AF",X"BE",X"28",X"03", + X"71",X"0E",X"00",X"23",X"19",X"10",X"EF",X"C9",X"F7",X"60",X"0A",X"00",X"C9",X"3A",X"B1",X"4D", + X"E7",X"C7",X"86",X"D1",X"86",X"D1",X"86",X"D1",X"86",X"D1",X"86",X"EB",X"86",X"19",X"87",X"25", + X"87",X"2C",X"87",X"33",X"87",X"3A",X"87",X"41",X"87",X"48",X"87",X"7A",X"87",X"84",X"87",X"A0", + X"87",X"EB",X"86",X"19",X"87",X"CD",X"86",X"3E",X"00",X"32",X"B1",X"4D",X"C9",X"3E",X"07",X"18", + X"15",X"2A",X"D1",X"4D",X"23",X"22",X"D1",X"4D",X"11",X"78",X"00",X"A7",X"ED",X"52",X"20",X"09", + X"AF",X"32",X"AC",X"4E",X"3E",X"05",X"32",X"B1",X"4D",X"E1",X"C9",X"21",X"00",X"00",X"22",X"0A", + X"4D",X"CD",X"72",X"95",X"3E",X"34",X"11",X"B4",X"00",X"4F",X"CD",X"B8",X"90",X"28",X"04",X"3E", + X"C0",X"A9",X"4F",X"79",X"32",X"0A",X"4C",X"2A",X"D1",X"4D",X"23",X"22",X"D1",X"4D",X"A7",X"ED", + X"52",X"20",X"D6",X"21",X"B1",X"4D",X"34",X"E1",X"C9",X"21",X"CC",X"4E",X"36",X"04",X"3E",X"35", + X"11",X"C8",X"00",X"18",X"D4",X"3E",X"37",X"11",X"D3",X"00",X"18",X"CD",X"3E",X"39",X"11",X"E3", + X"00",X"18",X"C6",X"3E",X"3B",X"11",X"F3",X"00",X"18",X"BF",X"3E",X"3D",X"11",X"03",X"01",X"18", + X"B8",X"3E",X"75",X"11",X"23",X"01",X"18",X"B1",X"3E",X"F5",X"4F",X"CD",X"B8",X"90",X"28",X"04", + X"3E",X"C0",X"A9",X"4F",X"79",X"32",X"0A",X"4C",X"2A",X"D1",X"4D",X"23",X"22",X"D1",X"4D",X"11", + X"63",X"01",X"A7",X"ED",X"52",X"28",X"02",X"E1",X"C9",X"21",X"14",X"4E",X"35",X"21",X"15",X"4E", + X"35",X"CD",X"69",X"95",X"21",X"04",X"4E",X"34",X"E1",X"C9",X"AF",X"32",X"AC",X"4E",X"CD",X"06", + X"09",X"C3",X"13",X"87",X"21",X"CC",X"4E",X"36",X"20",X"11",X"A8",X"00",X"2A",X"D1",X"4D",X"23", + X"22",X"D1",X"4D",X"A7",X"ED",X"52",X"28",X"02",X"E1",X"C9",X"CD",X"06",X"09",X"C3",X"13",X"87", + X"11",X"48",X"01",X"2A",X"D1",X"4D",X"23",X"22",X"D1",X"4D",X"A7",X"ED",X"52",X"28",X"02",X"E1", + X"C9",X"21",X"78",X"00",X"22",X"D1",X"4D",X"C3",X"13",X"87",X"3A",X"04",X"4E",X"FE",X"03",X"C8", + X"E1",X"C9",X"06",X"06",X"1A",X"2F",X"DD",X"86",X"00",X"77",X"23",X"23",X"13",X"13",X"DD",X"23", + X"10",X"F2",X"C9",X"06",X"06",X"1A",X"DD",X"86",X"00",X"77",X"23",X"23",X"13",X"13",X"DD",X"23", + X"10",X"F3",X"C9",X"08",X"08",X"08",X"08",X"08",X"08",X"07",X"07",X"08",X"08",X"08",X"08",X"21", + X"13",X"4C",X"11",X"00",X"4D",X"DD",X"21",X"E3",X"87",X"CD",X"D3",X"87",X"21",X"12",X"4C",X"11", + X"01",X"4D",X"CD",X"C2",X"87",X"18",X"28",X"09",X"09",X"09",X"09",X"09",X"09",X"06",X"06",X"07", + X"07",X"07",X"07",X"CD",X"B8",X"90",X"4F",X"20",X"D6",X"21",X"13",X"4C",X"11",X"00",X"4D",X"DD", + X"21",X"07",X"88",X"CD",X"C2",X"87",X"21",X"12",X"4C",X"11",X"01",X"4D",X"CD",X"D3",X"87",X"3A", + X"22",X"4E",X"FE",X"01",X"28",X"03",X"FE",X"14",X"D8",X"41",X"DD",X"21",X"00",X"4C",X"CD",X"C5", + X"BD",X"A7",X"C2",X"5A",X"88",X"3A",X"B0",X"4D",X"A7",X"C0",X"21",X"5A",X"88",X"E5",X"3A",X"3A", + X"4D",X"E7",X"63",X"89",X"7B",X"89",X"76",X"89",X"83",X"89",X"21",X"CC",X"4D",X"56",X"3E",X"20", + X"82",X"4F",X"3A",X"2D",X"4F",X"A7",X"20",X"05",X"3A",X"36",X"4D",X"87",X"81",X"DD",X"77",X"02", + X"3A",X"2E",X"4F",X"A7",X"20",X"05",X"3A",X"37",X"4D",X"87",X"81",X"DD",X"77",X"04",X"3A",X"2F", + X"4F",X"A7",X"20",X"05",X"3A",X"38",X"4D",X"87",X"81",X"DD",X"77",X"06",X"3A",X"30",X"4F",X"A7", + X"20",X"05",X"3A",X"39",X"4D",X"87",X"81",X"DD",X"77",X"08",X"3A",X"32",X"4F",X"A7",X"20",X"0F", + X"3A",X"1A",X"4F",X"A7",X"3A",X"1C",X"4F",X"28",X"04",X"C6",X"14",X"18",X"02",X"C6",X"00",X"DD", + X"77",X"0C",X"78",X"A7",X"C8",X"DD",X"56",X"02",X"3A",X"36",X"4D",X"CD",X"88",X"89",X"DD",X"72", + X"02",X"DD",X"56",X"04",X"3A",X"37",X"4D",X"CD",X"88",X"89",X"DD",X"72",X"04",X"DD",X"56",X"06", + X"3A",X"38",X"4D",X"CD",X"88",X"89",X"DD",X"72",X"06",X"DD",X"56",X"08",X"3A",X"39",X"4D",X"CD", + X"88",X"89",X"DD",X"72",X"08",X"3A",X"1A",X"4F",X"A7",X"28",X"1E",X"DD",X"56",X"0C",X"3A",X"3B", + X"4D",X"CD",X"88",X"89",X"DD",X"72",X"0C",X"3A",X"B1",X"4D",X"A7",X"C0",X"DD",X"56",X"0A",X"3A", + X"3A",X"4D",X"CD",X"88",X"89",X"DD",X"72",X"0A",X"C9",X"DD",X"7E",X"0C",X"EE",X"C0",X"DD",X"77", + X"0C",X"18",X"E4",X"34",X"34",X"35",X"35",X"36",X"36",X"37",X"37",X"38",X"38",X"35",X"35",X"39", + X"39",X"3A",X"3A",X"B4",X"B4",X"B5",X"B5",X"B6",X"B6",X"B7",X"B7",X"B8",X"B8",X"B5",X"B5",X"B9", + X"B9",X"BA",X"BA",X"3B",X"3B",X"3B",X"3B",X"3C",X"3C",X"3C",X"3C",X"3D",X"3D",X"3D",X"3D",X"3C", + X"3C",X"3C",X"3C",X"3E",X"3E",X"3E",X"3E",X"3C",X"3C",X"3C",X"3C",X"3F",X"3F",X"3F",X"3F",X"3C", + X"3C",X"3C",X"3C",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"21",X"13",X"89",X"3A",X"09",X"4D",X"E6",X"0F",X"D5",X"5F",X"16",X"00",X"19", + X"7E",X"DD",X"77",X"0A",X"D1",X"C9",X"21",X"23",X"89",X"18",X"EB",X"21",X"33",X"89",X"3A",X"08", + X"4D",X"18",X"E6",X"21",X"43",X"89",X"18",X"F6",X"5F",X"0E",X"C0",X"7A",X"A1",X"20",X"04",X"7A", + X"B1",X"57",X"C9",X"7B",X"FE",X"02",X"20",X"05",X"CB",X"7A",X"C8",X"18",X"06",X"FE",X"03",X"C0", + X"CB",X"72",X"C8",X"7A",X"A9",X"57",X"C9",X"06",X"05",X"ED",X"5B",X"44",X"4D",X"3A",X"2C",X"4F", + X"A7",X"20",X"13",X"3A",X"1A",X"4F",X"FE",X"01",X"38",X"0C",X"FE",X"08",X"30",X"08",X"2A",X"46", + X"4D",X"A7",X"ED",X"52",X"28",X"4B",X"05",X"3A",X"13",X"4E",X"FE",X"02",X"38",X"0E",X"3A",X"BB", + X"4D",X"A7",X"20",X"08",X"2A",X"42",X"4D",X"A7",X"ED",X"52",X"28",X"35",X"05",X"3A",X"13",X"4E", + X"FE",X"01",X"38",X"0E",X"3A",X"BA",X"4D",X"A7",X"20",X"08",X"2A",X"40",X"4D",X"A7",X"ED",X"52", + X"28",X"1F",X"05",X"3A",X"B9",X"4D",X"A7",X"20",X"08",X"2A",X"3E",X"4D",X"A7",X"ED",X"52",X"28", + X"10",X"05",X"3A",X"B8",X"4D",X"A7",X"20",X"08",X"2A",X"3C",X"4D",X"A7",X"ED",X"52",X"28",X"01", + X"05",X"78",X"FE",X"05",X"20",X"06",X"3E",X"08",X"32",X"1A",X"4F",X"C9",X"32",X"B0",X"4D",X"32", + X"DD",X"4D",X"32",X"B1",X"4D",X"A7",X"C8",X"3A",X"33",X"4E",X"A7",X"C8",X"AF",X"32",X"B1",X"4D", + X"21",X"DC",X"4D",X"7E",X"3C",X"FE",X"0E",X"38",X"02",X"3E",X"0D",X"77",X"C6",X"04",X"47",X"CD", + X"C5",X"98",X"C9",X"3A",X"B0",X"4D",X"A7",X"C0",X"3A",X"B2",X"4D",X"A7",X"C8",X"01",X"04",X"05", + X"DD",X"21",X"08",X"4D",X"3A",X"2C",X"4F",X"A7",X"20",X"1D",X"3A",X"1A",X"4F",X"FE",X"01",X"38", + X"16",X"FE",X"08",X"30",X"12",X"3A",X"0A",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"09",X"3A",X"0B", + X"4D",X"DD",X"96",X"01",X"B9",X"38",X"9A",X"05",X"3A",X"13",X"4E",X"FE",X"02",X"38",X"19",X"3A", + X"BB",X"4D",X"A7",X"20",X"13",X"3A",X"06",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"07", + X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"11",X"8A",X"05",X"3A",X"13",X"4E",X"FE",X"01",X"38",X"19", + X"3A",X"BA",X"4D",X"A7",X"20",X"13",X"3A",X"04",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A", + X"05",X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"11",X"8A",X"05",X"3A",X"B9",X"4D",X"A7",X"20",X"13", + X"3A",X"02",X"4D",X"DD",X"96",X"00",X"B9",X"30",X"0A",X"3A",X"03",X"4D",X"DD",X"96",X"01",X"B9", + X"DA",X"11",X"8A",X"05",X"3A",X"B8",X"4D",X"A7",X"20",X"13",X"3A",X"00",X"4D",X"DD",X"96",X"00", + X"B9",X"30",X"0A",X"3A",X"01",X"4D",X"DD",X"96",X"01",X"B9",X"DA",X"11",X"8A",X"05",X"C3",X"11", + X"8A",X"3A",X"1A",X"4F",X"FE",X"08",X"D0",X"3A",X"B0",X"4D",X"A7",X"28",X"02",X"E1",X"C9",X"21", + X"A9",X"4D",X"3E",X"FF",X"BE",X"28",X"02",X"35",X"C9",X"2A",X"54",X"4D",X"29",X"22",X"54",X"4D", + X"2A",X"52",X"4D",X"ED",X"6A",X"22",X"52",X"4D",X"D0",X"21",X"54",X"4D",X"34",X"3A",X"0E",X"4E", + X"32",X"AA",X"4D",X"3A",X"72",X"4E",X"4F",X"3A",X"09",X"4E",X"A1",X"4F",X"21",X"45",X"4D",X"7E", + X"06",X"21",X"90",X"38",X"09",X"7E",X"06",X"3B",X"90",X"30",X"03",X"C3",X"82",X"8B",X"3E",X"01", + X"32",X"CB",X"4D",X"3A",X"00",X"4E",X"FE",X"01",X"CA",X"CA",X"91",X"3A",X"04",X"4E",X"FE",X"10", + X"D2",X"CA",X"91",X"79",X"A7",X"3A",X"40",X"50",X"20",X"03",X"3A",X"00",X"50",X"CB",X"4F",X"C2", + X"70",X"8B",X"2A",X"0E",X"03",X"3E",X"02",X"32",X"3A",X"4D",X"22",X"20",X"4D",X"C3",X"31",X"8C", + X"CB",X"57",X"C2",X"31",X"8C",X"2A",X"0A",X"03",X"AF",X"32",X"3A",X"4D",X"22",X"20",X"4D",X"C3", + X"31",X"8C",X"3A",X"00",X"4E",X"FE",X"01",X"CA",X"CA",X"91",X"3A",X"04",X"4E",X"FE",X"10",X"D2", + X"CA",X"91",X"79",X"A7",X"3A",X"40",X"50",X"20",X"03",X"3A",X"00",X"50",X"C3",X"01",X"0C",X"00", + X"00",X"CB",X"57",X"CA",X"06",X"8D",X"CB",X"47",X"CA",X"0D",X"8D",X"CB",X"5F",X"CA",X"14",X"8D", + X"2A",X"20",X"4D",X"22",X"2C",X"4D",X"06",X"01",X"DD",X"21",X"2C",X"4D",X"FD",X"21",X"44",X"4D", + X"CD",X"56",X"91",X"FE",X"E0",X"28",X"5B",X"FE",X"E1",X"28",X"57",X"E6",X"C0",X"D6",X"C0",X"20", + X"51",X"21",X"EC",X"4E",X"CB",X"86",X"05",X"20",X"1A",X"3A",X"3A",X"4D",X"0F",X"38",X"0A",X"3A", + X"09",X"4D",X"E6",X"07",X"FE",X"04",X"C8",X"18",X"39",X"3A",X"08",X"4D",X"E6",X"07",X"FE",X"04", + X"C8",X"18",X"2F",X"DD",X"21",X"20",X"4D",X"CD",X"56",X"91",X"FE",X"E0",X"28",X"33",X"FE",X"E1", + X"28",X"2F",X"E6",X"C0",X"D6",X"C0",X"20",X"29",X"3A",X"3A",X"4D",X"0F",X"38",X"0A",X"3A",X"09", + X"4D",X"CD",X"72",X"0C",X"00",X"C8",X"18",X"19",X"3A",X"08",X"4D",X"CD",X"72",X"0C",X"00",X"C8", + X"18",X"0F",X"2A",X"2C",X"4D",X"22",X"20",X"4D",X"05",X"28",X"06",X"3A",X"34",X"4D",X"32",X"3A", + X"4D",X"3A",X"BC",X"4E",X"A7",X"20",X"05",X"21",X"EC",X"4E",X"CB",X"C6",X"DD",X"21",X"20",X"4D", + X"FD",X"21",X"08",X"4D",X"CD",X"47",X"91",X"3A",X"3A",X"4D",X"0F",X"38",X"0F",X"7D",X"E6",X"07", + X"FE",X"04",X"28",X"15",X"38",X"03",X"2D",X"18",X"10",X"2C",X"18",X"0D",X"7C",X"E6",X"07",X"FE", + X"04",X"28",X"06",X"38",X"03",X"25",X"18",X"01",X"24",X"22",X"08",X"4D",X"CD",X"5F",X"91",X"22", + X"44",X"4D",X"DD",X"21",X"CB",X"4D",X"DD",X"7E",X"00",X"DD",X"36",X"00",X"00",X"A7",X"C0",X"21", + X"CC",X"8C",X"E5",X"2A",X"44",X"4D",X"CD",X"22",X"91",X"7E",X"FE",X"20",X"30",X"48",X"DD",X"21", + X"0E",X"4E",X"DD",X"34",X"00",X"FE",X"1A",X"28",X"40",X"FE",X"1C",X"30",X"33",X"FE",X"18",X"00", + X"00",X"00",X"FE",X"10",X"D8",X"3E",X"01",X"32",X"0C",X"4F",X"11",X"00",X"04",X"19",X"7E",X"32", + X"E2",X"4D",X"21",X"30",X"4E",X"22",X"2E",X"4E",X"2A",X"2C",X"4E",X"CD",X"80",X"0A",X"EF",X"19", + X"00",X"3E",X"07",X"32",X"B0",X"4D",X"32",X"DD",X"4D",X"3E",X"06",X"C9",X"32",X"A9",X"4D",X"C9", + X"C6",X"C0",X"77",X"3E",X"01",X"C9",X"3E",X"FF",X"C9",X"36",X"40",X"11",X"0A",X"43",X"ED",X"52", + X"21",X"1E",X"4E",X"28",X"03",X"21",X"1F",X"4E",X"36",X"00",X"2A",X"C9",X"4D",X"CD",X"26",X"0B", + X"3E",X"01",X"32",X"33",X"4E",X"AF",X"32",X"DC",X"4D",X"32",X"D4",X"4D",X"3E",X"06",X"C9",X"21", + X"00",X"01",X"3E",X"02",X"18",X"13",X"21",X"00",X"FF",X"3E",X"00",X"18",X"0C",X"21",X"FF",X"00", + X"3E",X"03",X"18",X"05",X"21",X"01",X"00",X"3E",X"01",X"32",X"34",X"4D",X"22",X"2C",X"4D",X"06", + X"00",X"C3",X"B8",X"8B",X"CD",X"E9",X"B4",X"3A",X"B8",X"4D",X"A7",X"C0",X"CD",X"8B",X"91",X"2A", + X"3C",X"4D",X"01",X"A5",X"4D",X"CD",X"7C",X"91",X"3A",X"A5",X"4D",X"A7",X"28",X"17",X"2A",X"6C", + X"4D",X"29",X"22",X"6C",X"4D",X"2A",X"6A",X"4D",X"ED",X"6A",X"22",X"6A",X"4D",X"D0",X"21",X"6C", + X"4D",X"34",X"C3",X"A3",X"8D",X"3A",X"C3",X"4D",X"A7",X"28",X"17",X"2A",X"5C",X"4D",X"29",X"22", + X"5C",X"4D",X"2A",X"5A",X"4D",X"ED",X"6A",X"22",X"5A",X"4D",X"D0",X"21",X"5C",X"4D",X"34",X"C3", + X"A3",X"8D",X"3A",X"C2",X"4D",X"A7",X"28",X"17",X"2A",X"60",X"4D",X"29",X"22",X"60",X"4D",X"2A", + X"5E",X"4D",X"ED",X"6A",X"22",X"5E",X"4D",X"D0",X"21",X"60",X"4D",X"34",X"C3",X"A3",X"8D",X"2A", + X"64",X"4D",X"29",X"22",X"64",X"4D",X"2A",X"62",X"4D",X"ED",X"6A",X"22",X"62",X"4D",X"D0",X"21", + X"64",X"4D",X"34",X"21",X"18",X"4D",X"7E",X"A7",X"28",X"0C",X"3A",X"00",X"4D",X"E6",X"07",X"FE", + X"04",X"28",X"0C",X"C3",X"FC",X"8D",X"3A",X"01",X"4D",X"E6",X"07",X"FE",X"04",X"20",X"3D",X"3E", + X"01",X"CD",X"28",X"90",X"38",X"19",X"3A",X"33",X"4E",X"A7",X"28",X"05",X"EF",X"0C",X"00",X"18", + X"0E",X"2A",X"0C",X"4D",X"CD",X"74",X"91",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"08",X"00",X"CD", + X"50",X"90",X"DD",X"21",X"24",X"4D",X"FD",X"21",X"0C",X"4D",X"CD",X"47",X"91",X"22",X"0C",X"4D", + X"2A",X"24",X"4D",X"22",X"18",X"4D",X"3A",X"36",X"4D",X"32",X"30",X"4D",X"DD",X"21",X"18",X"4D", + X"FD",X"21",X"00",X"4D",X"CD",X"47",X"91",X"22",X"00",X"4D",X"CD",X"5F",X"91",X"22",X"3C",X"4D", + X"C9",X"CD",X"F8",X"B4",X"3A",X"B9",X"4D",X"A7",X"C0",X"2A",X"3E",X"4D",X"01",X"A6",X"4D",X"CD", + X"7C",X"91",X"3A",X"A6",X"4D",X"A7",X"28",X"17",X"2A",X"78",X"4D",X"29",X"22",X"78",X"4D",X"2A", + X"76",X"4D",X"ED",X"6A",X"22",X"76",X"4D",X"D0",X"21",X"78",X"4D",X"34",X"C3",X"53",X"8E",X"2A", + X"70",X"4D",X"29",X"22",X"70",X"4D",X"2A",X"6E",X"4D",X"ED",X"6A",X"22",X"6E",X"4D",X"D0",X"21", + X"70",X"4D",X"34",X"21",X"1A",X"4D",X"7E",X"A7",X"28",X"0B",X"3A",X"02",X"4D",X"E6",X"07",X"FE", + X"04",X"28",X"0B",X"18",X"46",X"3A",X"03",X"4D",X"E6",X"07",X"FE",X"04",X"20",X"3D",X"3E",X"02", + X"CD",X"28",X"90",X"38",X"19",X"3A",X"33",X"4E",X"A7",X"28",X"05",X"EF",X"0D",X"00",X"18",X"0E", + X"2A",X"0E",X"4D",X"CD",X"74",X"91",X"7E",X"FE",X"1A",X"28",X"03",X"EF",X"09",X"00",X"CD",X"6A", + X"90",X"DD",X"21",X"26",X"4D",X"FD",X"21",X"0E",X"4D",X"CD",X"47",X"91",X"22",X"0E",X"4D",X"2A", + X"26",X"4D",X"22",X"1A",X"4D",X"3A",X"37",X"4D",X"32",X"31",X"4D",X"DD",X"21",X"1A",X"4D",X"FD", + X"21",X"02",X"4D",X"CD",X"47",X"91",X"22",X"02",X"4D",X"CD",X"5F",X"91",X"22",X"3E",X"4D",X"C9", + X"3A",X"13",X"4E",X"FE",X"01",X"D8",X"CD",X"07",X"B5",X"3A",X"BA",X"4D",X"A7",X"C0",X"2A",X"40", + X"4D",X"01",X"A7",X"4D",X"CD",X"7C",X"91",X"3A",X"A7",X"4D",X"A7",X"28",X"16",X"2A",X"84",X"4D", + X"29",X"22",X"84",X"4D",X"2A",X"82",X"4D",X"ED",X"6A",X"22",X"82",X"4D",X"D0",X"21",X"84",X"4D", + X"34",X"18",X"14",X"2A",X"7C",X"4D",X"29",X"22",X"7C",X"4D",X"2A",X"7A",X"4D",X"ED",X"6A",X"22", + X"7A",X"4D",X"D0",X"21",X"7C",X"4D",X"34",X"21",X"1C",X"4D",X"7E",X"A7",X"28",X"0B",X"3A",X"04", + X"4D",X"E6",X"07",X"FE",X"04",X"28",X"0B",X"18",X"46",X"3A",X"05",X"4D",X"E6",X"07",X"FE",X"04", + X"20",X"3D",X"3E",X"03",X"CD",X"28",X"90",X"38",X"19",X"3A",X"33",X"4E",X"A7",X"28",X"05",X"EF", + X"0E",X"00",X"18",X"0E",X"2A",X"10",X"4D",X"CD",X"74",X"91",X"7E",X"FE",X"1A",X"28",X"03",X"EF", + X"0A",X"00",X"CD",X"84",X"90",X"DD",X"21",X"28",X"4D",X"FD",X"21",X"10",X"4D",X"CD",X"47",X"91", + X"22",X"10",X"4D",X"2A",X"28",X"4D",X"22",X"1C",X"4D",X"3A",X"38",X"4D",X"32",X"32",X"4D",X"DD", + X"21",X"1C",X"4D",X"FD",X"21",X"04",X"4D",X"CD",X"47",X"91",X"22",X"04",X"4D",X"CD",X"5F",X"91", + X"22",X"40",X"4D",X"C9",X"3A",X"13",X"4E",X"FE",X"02",X"D8",X"CD",X"16",X"B5",X"3A",X"BB",X"4D", + X"A7",X"C0",X"2A",X"42",X"4D",X"01",X"A8",X"4D",X"CD",X"7C",X"91",X"3A",X"A8",X"4D",X"A7",X"28", + X"16",X"2A",X"90",X"4D",X"29",X"22",X"90",X"4D",X"2A",X"8E",X"4D",X"ED",X"6A",X"22",X"8E",X"4D", + X"D0",X"21",X"90",X"4D",X"34",X"18",X"14",X"2A",X"88",X"4D",X"29",X"22",X"88",X"4D",X"2A",X"86", + X"4D",X"ED",X"6A",X"22",X"86",X"4D",X"D0",X"21",X"88",X"4D",X"34",X"21",X"1E",X"4D",X"7E",X"A7", + X"28",X"0B",X"3A",X"06",X"4D",X"E6",X"07",X"FE",X"04",X"28",X"0B",X"18",X"46",X"3A",X"07",X"4D", + X"E6",X"07",X"FE",X"04",X"20",X"3D",X"3E",X"04",X"CD",X"28",X"90",X"38",X"19",X"3A",X"33",X"4E", + X"A7",X"28",X"05",X"EF",X"0F",X"00",X"18",X"0E",X"2A",X"12",X"4D",X"CD",X"74",X"91",X"7E",X"FE", + X"1A",X"28",X"03",X"EF",X"0B",X"00",X"CD",X"9E",X"90",X"DD",X"21",X"2A",X"4D",X"FD",X"21",X"12", + X"4D",X"CD",X"47",X"91",X"22",X"12",X"4D",X"2A",X"2A",X"4D",X"22",X"1E",X"4D",X"3A",X"39",X"4D", + X"32",X"33",X"4D",X"DD",X"21",X"1E",X"4D",X"FD",X"21",X"06",X"4D",X"CD",X"47",X"91",X"22",X"06", + X"4D",X"CD",X"5F",X"91",X"22",X"42",X"4D",X"C9",X"87",X"4F",X"06",X"00",X"21",X"0B",X"4D",X"09", + X"7E",X"FE",X"1D",X"20",X"04",X"36",X"3D",X"18",X"15",X"FE",X"3E",X"20",X"04",X"36",X"1E",X"18", + X"0D",X"06",X"21",X"90",X"38",X"08",X"7E",X"06",X"3B",X"90",X"30",X"02",X"A7",X"C9",X"37",X"C9", + X"3A",X"BD",X"4D",X"A7",X"C8",X"AF",X"32",X"BD",X"4D",X"21",X"0A",X"03",X"3A",X"30",X"4D",X"EE", + X"02",X"32",X"36",X"4D",X"47",X"DF",X"22",X"24",X"4D",X"C9",X"3A",X"BE",X"4D",X"A7",X"C8",X"AF", + X"32",X"BE",X"4D",X"21",X"0A",X"03",X"3A",X"31",X"4D",X"EE",X"02",X"32",X"37",X"4D",X"47",X"DF", + X"22",X"26",X"4D",X"C9",X"3A",X"BF",X"4D",X"A7",X"C8",X"AF",X"32",X"BF",X"4D",X"21",X"0A",X"03", + X"3A",X"32",X"4D",X"EE",X"02",X"32",X"38",X"4D",X"47",X"DF",X"22",X"28",X"4D",X"C9",X"3A",X"C0", + X"4D",X"A7",X"C8",X"AF",X"32",X"C0",X"4D",X"21",X"0A",X"03",X"3A",X"33",X"4D",X"EE",X"02",X"32", + X"39",X"4D",X"47",X"DF",X"22",X"2A",X"4D",X"C9",X"3A",X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0", + X"C9",X"CD",X"06",X"91",X"21",X"C1",X"40",X"11",X"31",X"4E",X"01",X"03",X"02",X"1A",X"0F",X"0F", + X"0F",X"0F",X"CD",X"DD",X"90",X"1A",X"CD",X"DD",X"90",X"1B",X"10",X"F1",X"C9",X"E6",X"0F",X"28", + X"04",X"0E",X"00",X"18",X"03",X"B9",X"20",X"0A",X"C6",X"30",X"77",X"D5",X"11",X"E0",X"FF",X"19", + X"D1",X"C9",X"0D",X"36",X"40",X"18",X"F4",X"3E",X"0D",X"0E",X"02",X"06",X"03",X"18",X"10",X"21", + X"01",X"47",X"3E",X"06",X"18",X"05",X"21",X"61",X"44",X"3E",X"04",X"0E",X"01",X"06",X"04",X"11", + X"20",X"00",X"F5",X"7B",X"91",X"5F",X"F1",X"C5",X"77",X"23",X"0D",X"20",X"FB",X"C1",X"19",X"10", + X"F6",X"C9",X"F5",X"C5",X"7D",X"D6",X"20",X"6F",X"7C",X"D6",X"20",X"67",X"06",X"00",X"CB",X"24", + X"CB",X"24",X"CB",X"24",X"CB",X"24",X"CB",X"10",X"CB",X"24",X"CB",X"10",X"4C",X"26",X"00",X"09", + X"01",X"40",X"40",X"09",X"C1",X"F1",X"C9",X"FD",X"7E",X"00",X"DD",X"86",X"00",X"6F",X"FD",X"7E", + X"01",X"DD",X"86",X"01",X"67",X"C9",X"CD",X"47",X"91",X"CD",X"22",X"91",X"7E",X"A7",X"C9",X"7D", + X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"C6",X"20",X"6F",X"7C",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F", + X"C6",X"1E",X"67",X"C9",X"CD",X"22",X"91",X"11",X"00",X"04",X"19",X"C9",X"CD",X"74",X"91",X"7E", + X"FE",X"1B",X"20",X"04",X"3E",X"01",X"02",X"C9",X"AF",X"02",X"C9",X"3A",X"AF",X"4D",X"A7",X"C8", + X"21",X"0E",X"4E",X"3A",X"C2",X"4D",X"A7",X"20",X"0E",X"3E",X"F4",X"96",X"47",X"3A",X"C7",X"4D", + X"90",X"D8",X"3E",X"01",X"32",X"C2",X"4D",X"3A",X"C3",X"4D",X"A7",X"C0",X"3E",X"F4",X"96",X"47", + X"3A",X"C8",X"4D",X"90",X"D8",X"3E",X"01",X"32",X"C3",X"4D",X"C9",X"21",X"06",X"4E",X"34",X"C9", + X"21",X"07",X"4E",X"34",X"C9",X"21",X"08",X"4E",X"34",X"C9",X"3A",X"07",X"4E",X"E7",X"E4",X"91", + X"EF",X"91",X"FD",X"91",X"08",X"92",X"1A",X"92",X"CD",X"C0",X"91",X"C3",X"FF",X"8C",X"CD",X"C0", + X"91",X"C3",X"0D",X"8D",X"3A",X"45",X"4D",X"FE",X"2D",X"C2",X"06",X"8D",X"C3",X"DE",X"91",X"3A", + X"44",X"4D",X"FE",X"2E",X"C2",X"0D",X"8D",X"CD",X"C0",X"91",X"C3",X"06",X"8D",X"3A",X"45",X"4D", + X"FE",X"22",X"C2",X"06",X"8D",X"C3",X"D8",X"91",X"3A",X"45",X"4D",X"FE",X"2D",X"20",X"05",X"CD", + X"C3",X"B7",X"18",X"CA",X"DA",X"FF",X"8C",X"C3",X"06",X"8D",X"3A",X"44",X"4D",X"FE",X"22",X"28", + X"B7",X"C3",X"0D",X"8D",X"21",X"00",X"50",X"06",X"08",X"AF",X"77",X"2C",X"10",X"FC",X"21",X"00", + X"40",X"06",X"04",X"32",X"C0",X"50",X"32",X"07",X"50",X"3E",X"40",X"77",X"2C",X"20",X"FC",X"24", + X"10",X"F1",X"06",X"04",X"32",X"C0",X"50",X"AF",X"32",X"07",X"50",X"3E",X"0D",X"77",X"2C",X"20", + X"FC",X"24",X"10",X"F0",X"ED",X"56",X"AF",X"32",X"07",X"50",X"3C",X"32",X"00",X"50",X"FB",X"76", + X"32",X"C0",X"50",X"31",X"C0",X"4F",X"AF",X"21",X"00",X"50",X"06",X"08",X"CF",X"21",X"00",X"4C", + X"06",X"BE",X"CF",X"CF",X"CF",X"CF",X"21",X"40",X"50",X"06",X"40",X"CF",X"32",X"C0",X"50",X"CD", + X"21",X"93",X"32",X"C0",X"50",X"06",X"00",X"CD",X"01",X"93",X"32",X"C0",X"50",X"21",X"C0",X"4C", + X"22",X"80",X"4C",X"22",X"82",X"4C",X"3E",X"FF",X"06",X"40",X"CF",X"3E",X"01",X"32",X"00",X"50", + X"FB",X"2A",X"82",X"4C",X"7E",X"A7",X"FA",X"A1",X"92",X"36",X"FF",X"2C",X"46",X"36",X"FF",X"2C", + X"20",X"02",X"2E",X"C0",X"22",X"82",X"4C",X"21",X"A1",X"92",X"E5",X"E7",X"01",X"93",X"16",X"94", + X"2D",X"93",X"6B",X"93",X"88",X"94",X"7F",X"95",X"21",X"93",X"90",X"95",X"20",X"96",X"5C",X"96", + X"99",X"96",X"E1",X"96",X"35",X"96",X"6B",X"96",X"A8",X"96",X"F0",X"96",X"12",X"03",X"9A",X"95", + X"0D",X"94",X"B3",X"98",X"D6",X"95",X"44",X"B0",X"FC",X"92",X"2B",X"97",X"7E",X"99",X"C5",X"98", + X"EC",X"99",X"98",X"9A",X"F2",X"9A",X"27",X"9A",X"69",X"95",X"B8",X"95",X"21",X"04",X"4E",X"34", + X"C9",X"78",X"E7",X"07",X"93",X"14",X"93",X"3E",X"40",X"01",X"04",X"00",X"21",X"00",X"40",X"CF", + X"0D",X"20",X"FC",X"C9",X"3E",X"40",X"21",X"40",X"40",X"01",X"04",X"80",X"CF",X"0D",X"20",X"FC", + X"C9",X"AF",X"01",X"04",X"00",X"21",X"00",X"44",X"CF",X"0D",X"20",X"FC",X"C9",X"CD",X"E5",X"0B", + X"CD",X"4F",X"93",X"3A",X"00",X"4E",X"3D",X"C8",X"CD",X"D8",X"B0",X"3E",X"9B",X"C3",X"FF",X"B0", + X"21",X"3F",X"40",X"01",X"D0",X"A0",X"0A",X"FE",X"27",X"C8",X"23",X"77",X"03",X"18",X"F7",X"3A", + X"13",X"4E",X"A7",X"C8",X"CD",X"64",X"93",X"0F",X"D8",X"21",X"1C",X"1D",X"22",X"EB",X"42",X"7C", + X"32",X"ED",X"42",X"C9",X"21",X"60",X"61",X"22",X"E5",X"41",X"C9",X"21",X"16",X"4E",X"06",X"08", + X"AF",X"BE",X"28",X"02",X"36",X"01",X"23",X"10",X"F8",X"CD",X"1C",X"09",X"AF",X"32",X"BC",X"4E", + X"3E",X"04",X"32",X"EC",X"4E",X"3A",X"1D",X"4E",X"A7",X"28",X"2A",X"3A",X"0D",X"4E",X"A7",X"F5", + X"CC",X"BD",X"93",X"F1",X"C4",X"C4",X"93",X"CD",X"DF",X"93",X"3A",X"13",X"4E",X"A7",X"C8",X"0F", + X"38",X"06",X"CD",X"FD",X"93",X"CD",X"E9",X"93",X"CD",X"F8",X"93",X"CD",X"F3",X"93",X"CD",X"EE", + X"93",X"CD",X"E4",X"93",X"C9",X"CD",X"CB",X"93",X"CD",X"DA",X"93",X"18",X"DA",X"CD",X"CB",X"93", + X"CD",X"D0",X"93",X"C9",X"CD",X"D5",X"93",X"CD",X"DA",X"93",X"C9",X"21",X"6C",X"09",X"18",X"30", + X"21",X"76",X"09",X"18",X"2B",X"21",X"80",X"09",X"18",X"26",X"21",X"8A",X"09",X"18",X"21",X"21", + X"94",X"09",X"18",X"1C",X"21",X"AA",X"09",X"18",X"17",X"21",X"B7",X"09",X"18",X"12",X"21",X"C7", + X"09",X"18",X"0D",X"21",X"D4",X"09",X"18",X"08",X"21",X"E1",X"09",X"18",X"03",X"21",X"F1",X"09", + X"4E",X"23",X"46",X"23",X"5E",X"23",X"56",X"23",X"EB",X"CD",X"C3",X"81",X"C9",X"21",X"16",X"4E", + X"3E",X"01",X"06",X"0A",X"CF",X"C9",X"C5",X"78",X"FE",X"02",X"3E",X"1E",X"28",X"17",X"3A",X"13", + X"4E",X"FE",X"0F",X"38",X"02",X"3E",X"0F",X"4F",X"06",X"00",X"21",X"78",X"94",X"09",X"7E",X"32", + X"20",X"4E",X"32",X"21",X"4E",X"21",X"40",X"44",X"01",X"04",X"80",X"CF",X"0D",X"20",X"FC",X"3E", + X"0D",X"06",X"40",X"21",X"C0",X"47",X"CF",X"C1",X"05",X"C0",X"06",X"00",X"0E",X"0A",X"21",X"23", + X"07",X"C5",X"DF",X"11",X"00",X"04",X"19",X"78",X"0F",X"0F",X"0F",X"E6",X"E0",X"C6",X"0D",X"06", + X"03",X"0E",X"02",X"CD",X"0F",X"91",X"C1",X"04",X"0D",X"20",X"E3",X"21",X"5B",X"47",X"3E",X"ED", + X"06",X"03",X"0E",X"02",X"CD",X"F3",X"0B",X"C9",X"0C",X"9B",X"1D",X"9A",X"18",X"13",X"1D",X"9B", + X"1D",X"9A",X"18",X"0C",X"0C",X"0C",X"0C",X"0C",X"78",X"FE",X"01",X"20",X"09",X"21",X"02",X"4C", + X"06",X"0C",X"AF",X"CF",X"18",X"0B",X"21",X"EF",X"94",X"11",X"02",X"4C",X"01",X"0C",X"00",X"ED", + X"B0",X"21",X"FB",X"94",X"11",X"00",X"4D",X"01",X"48",X"00",X"ED",X"B0",X"CD",X"43",X"95",X"3A", + X"13",X"4E",X"FE",X"01",X"30",X"19",X"22",X"06",X"4C",X"22",X"04",X"4D",X"22",X"10",X"4D",X"22", + X"40",X"4D",X"22",X"1C",X"4D",X"22",X"28",X"4D",X"AF",X"32",X"32",X"4D",X"32",X"38",X"4D",X"3A", + X"13",X"4E",X"FE",X"02",X"D0",X"22",X"08",X"4C",X"22",X"06",X"4D",X"22",X"12",X"4D",X"22",X"42", + X"4D",X"22",X"1E",X"4D",X"22",X"2A",X"4D",X"AF",X"32",X"33",X"4D",X"32",X"39",X"4D",X"C9",X"20", + X"02",X"20",X"04",X"20",X"06",X"20",X"08",X"34",X"1C",X"00",X"1C",X"24",X"24",X"3C",X"DC",X"74", + X"24",X"9C",X"DC",X"E4",X"DC",X"0C",X"AC",X"24",X"22",X"27",X"39",X"2E",X"22",X"33",X"39",X"3C", + X"38",X"21",X"33",X"00",X"01",X"00",X"FF",X"00",X"01",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"01",X"00",X"FF",X"00",X"01",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"02",X"00",X"02",X"00",X"00", + X"00",X"02",X"00",X"02",X"00",X"00",X"00",X"24",X"22",X"27",X"39",X"2E",X"22",X"33",X"39",X"3C", + X"38",X"21",X"33",X"3A",X"0D",X"4E",X"A7",X"C8",X"21",X"9C",X"24",X"22",X"08",X"4D",X"21",X"33", + X"22",X"22",X"14",X"4D",X"22",X"44",X"4D",X"21",X"00",X"01",X"22",X"20",X"4D",X"22",X"2C",X"4D", + X"3E",X"02",X"32",X"3A",X"4D",X"32",X"34",X"4D",X"C9",X"21",X"00",X"00",X"22",X"0A",X"4D",X"22", + X"08",X"4D",X"22",X"00",X"4D",X"22",X"02",X"4D",X"22",X"04",X"4D",X"22",X"06",X"4D",X"C9",X"21", + X"28",X"4E",X"06",X"0C",X"AF",X"CF",X"21",X"00",X"01",X"22",X"29",X"4E",X"CD",X"D0",X"06",X"C9", + X"3E",X"01",X"32",X"00",X"4E",X"AF",X"32",X"01",X"4E",X"C9",X"AF",X"11",X"00",X"4D",X"21",X"00", + X"4E",X"12",X"13",X"A7",X"ED",X"52",X"C2",X"9E",X"95",X"21",X"00",X"4F",X"06",X"80",X"AF",X"CF", + X"21",X"40",X"4C",X"06",X"40",X"AF",X"CF",X"C9",X"DD",X"21",X"56",X"41",X"3A",X"71",X"4E",X"E6", + X"0F",X"C6",X"30",X"DD",X"77",X"00",X"3A",X"71",X"4E",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"C8", + X"C6",X"30",X"DD",X"77",X"20",X"C9",X"3A",X"80",X"50",X"47",X"E6",X"03",X"20",X"05",X"21",X"6E", + X"4E",X"36",X"FF",X"4F",X"1F",X"CE",X"00",X"32",X"6B",X"4E",X"E6",X"02",X"A9",X"32",X"6D",X"4E", + X"78",X"0F",X"0F",X"E6",X"03",X"3C",X"FE",X"04",X"20",X"01",X"3C",X"32",X"6F",X"4E",X"78",X"0F", + X"0F",X"0F",X"0F",X"E6",X"03",X"21",X"1C",X"96",X"D7",X"32",X"71",X"4E",X"21",X"B5",X"05",X"22", + X"73",X"4E",X"78",X"07",X"07",X"2F",X"E6",X"01",X"32",X"72",X"4E",X"C9",X"05",X"10",X"15",X"FF", + X"3A",X"CD",X"4D",X"CB",X"47",X"C2",X"48",X"96",X"3A",X"C2",X"4D",X"A7",X"20",X"1A",X"3A",X"04", + X"4E",X"FE",X"03",X"20",X"13",X"2A",X"0C",X"4D",X"3A",X"36",X"4D",X"11",X"32",X"39",X"CD",X"D4", + X"97",X"22",X"24",X"4D",X"32",X"36",X"4D",X"C9",X"2A",X"0C",X"4D",X"ED",X"5B",X"44",X"4D",X"3A", + X"36",X"4D",X"CD",X"D4",X"97",X"22",X"24",X"4D",X"32",X"36",X"4D",X"C9",X"3A",X"CD",X"4D",X"CB", + X"47",X"C2",X"7E",X"96",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13",X"2A",X"0E",X"4D",X"3A",X"37", + X"4D",X"11",X"2D",X"22",X"CD",X"D4",X"97",X"22",X"26",X"4D",X"32",X"37",X"4D",X"C9",X"ED",X"5B", + X"44",X"4D",X"2A",X"2C",X"4D",X"29",X"29",X"19",X"EB",X"2A",X"0E",X"4D",X"3A",X"37",X"4D",X"CD", + X"D4",X"97",X"22",X"26",X"4D",X"32",X"37",X"4D",X"C9",X"3A",X"CD",X"4D",X"CB",X"47",X"C2",X"BB", + X"96",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13",X"2A",X"10",X"4D",X"3A",X"38",X"4D",X"11",X"26", + X"39",X"CD",X"D4",X"97",X"22",X"28",X"4D",X"32",X"38",X"4D",X"C9",X"ED",X"4B",X"0C",X"4D",X"ED", + X"5B",X"44",X"4D",X"2A",X"20",X"4D",X"29",X"19",X"7D",X"87",X"91",X"6F",X"7C",X"87",X"90",X"67", + X"EB",X"2A",X"10",X"4D",X"3A",X"38",X"4D",X"CD",X"D4",X"97",X"22",X"28",X"4D",X"32",X"38",X"4D", + X"C9",X"3A",X"CD",X"4D",X"CB",X"47",X"C2",X"03",X"97",X"3A",X"04",X"4E",X"FE",X"03",X"20",X"13", + X"2A",X"12",X"4D",X"3A",X"39",X"4D",X"11",X"23",X"22",X"CD",X"D4",X"97",X"22",X"2A",X"4D",X"32", + X"39",X"4D",X"C9",X"DD",X"21",X"44",X"4D",X"FD",X"21",X"12",X"4D",X"CD",X"6C",X"98",X"11",X"40", + X"00",X"A7",X"ED",X"52",X"DA",X"F0",X"96",X"2A",X"12",X"4D",X"ED",X"5B",X"44",X"4D",X"3A",X"39", + X"4D",X"CD",X"D4",X"97",X"22",X"2A",X"4D",X"32",X"39",X"4D",X"C9",X"78",X"E7",X"35",X"97",X"52", + X"97",X"58",X"97",X"70",X"97",X"ED",X"5B",X"44",X"4D",X"3E",X"03",X"32",X"10",X"4F",X"2A",X"16", + X"4D",X"3A",X"3B",X"4D",X"CD",X"D4",X"97",X"22",X"2E",X"4D",X"32",X"3B",X"4D",X"AF",X"32",X"10", + X"4F",X"C9",X"ED",X"5B",X"12",X"4F",X"18",X"E1",X"AF",X"32",X"10",X"4F",X"ED",X"5B",X"12",X"4F", + X"2A",X"14",X"4D",X"3A",X"34",X"4D",X"CD",X"D4",X"97",X"22",X"2C",X"4D",X"32",X"34",X"4D",X"C9", + X"3A",X"11",X"4F",X"32",X"10",X"4F",X"ED",X"5B",X"12",X"4F",X"2A",X"14",X"4F",X"3A",X"16",X"4F", + X"CD",X"D4",X"97",X"22",X"17",X"4F",X"32",X"19",X"4F",X"AF",X"32",X"10",X"4F",X"C9",X"22",X"4A", + X"4D",X"EE",X"02",X"32",X"49",X"4D",X"CD",X"A1",X"98",X"E6",X"03",X"21",X"48",X"4D",X"77",X"87", + X"5F",X"16",X"00",X"DD",X"21",X"0A",X"03",X"DD",X"19",X"FD",X"21",X"4A",X"4D",X"3A",X"49",X"4D", + X"BE",X"28",X"13",X"CD",X"56",X"91",X"E6",X"C0",X"D6",X"C0",X"28",X"0A",X"DD",X"6E",X"00",X"DD", + X"66",X"01",X"3A",X"48",X"4D",X"C9",X"DD",X"23",X"DD",X"23",X"21",X"48",X"4D",X"7E",X"3C",X"E6", + X"03",X"77",X"18",X"D9",X"22",X"4A",X"4D",X"ED",X"53",X"4C",X"4D",X"32",X"48",X"4D",X"EE",X"02", + X"32",X"49",X"4D",X"21",X"FF",X"FF",X"22",X"50",X"4D",X"DD",X"21",X"0A",X"03",X"FD",X"21",X"4A", + X"4D",X"AF",X"32",X"E1",X"4D",X"21",X"D3",X"4D",X"36",X"00",X"3A",X"49",X"4D",X"BE",X"28",X"40", + X"CD",X"47",X"91",X"22",X"4E",X"4D",X"3A",X"10",X"4F",X"A7",X"20",X"0A",X"CD",X"22",X"91",X"7E", + X"E6",X"C0",X"D6",X"C0",X"28",X"2A",X"21",X"E1",X"4D",X"34",X"DD",X"E5",X"FD",X"E5",X"DD",X"21", + X"4C",X"4D",X"FD",X"21",X"4E",X"4D",X"CD",X"6C",X"98",X"FD",X"E1",X"DD",X"E1",X"EB",X"2A",X"50", + X"4D",X"A7",X"ED",X"52",X"38",X"0A",X"ED",X"53",X"50",X"4D",X"3A",X"D3",X"4D",X"32",X"48",X"4D", + X"DD",X"23",X"DD",X"23",X"21",X"D3",X"4D",X"34",X"3E",X"04",X"BE",X"20",X"AD",X"3A",X"E1",X"4D", + X"A7",X"3A",X"49",X"4D",X"28",X"03",X"3A",X"48",X"4D",X"87",X"5F",X"16",X"00",X"DD",X"21",X"0A", + X"03",X"DD",X"19",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"CB",X"3F",X"C9",X"DD",X"7E",X"00",X"FD", + X"46",X"00",X"90",X"30",X"05",X"78",X"DD",X"46",X"00",X"90",X"CD",X"92",X"98",X"E5",X"DD",X"7E", + X"01",X"FD",X"46",X"01",X"90",X"30",X"05",X"78",X"DD",X"46",X"01",X"90",X"CD",X"92",X"98",X"C1", + X"09",X"C9",X"67",X"5F",X"2E",X"00",X"55",X"0E",X"08",X"29",X"30",X"01",X"19",X"0D",X"20",X"F9", + X"C9",X"2A",X"D5",X"4D",X"54",X"5D",X"29",X"29",X"19",X"23",X"7C",X"E6",X"1F",X"67",X"7E",X"22", + X"D5",X"4D",X"C9",X"06",X"0A",X"C5",X"05",X"21",X"23",X"07",X"DF",X"11",X"F9",X"06",X"CD",X"3D", + X"09",X"C1",X"10",X"F1",X"C9",X"3A",X"00",X"4E",X"FE",X"01",X"C8",X"78",X"A7",X"21",X"5E",X"99", + X"20",X"03",X"2A",X"2E",X"4E",X"DF",X"EB",X"CD",X"A9",X"99",X"7B",X"86",X"27",X"77",X"23",X"7A", + X"8E",X"27",X"77",X"5F",X"23",X"3E",X"00",X"8E",X"27",X"77",X"57",X"EB",X"29",X"29",X"29",X"29", + X"3A",X"71",X"4E",X"3D",X"BC",X"DC",X"B5",X"99",X"CD",X"21",X"99",X"13",X"13",X"13",X"21",X"8A", + X"4E",X"06",X"03",X"1A",X"BE",X"D8",X"20",X"05",X"1B",X"2B",X"10",X"F7",X"C9",X"CD",X"A9",X"99", + X"11",X"88",X"4E",X"01",X"03",X"00",X"ED",X"B0",X"1B",X"01",X"04",X"03",X"21",X"F2",X"43",X"18", + X"0F",X"3A",X"09",X"4E",X"01",X"04",X"03",X"21",X"FC",X"43",X"A7",X"28",X"03",X"21",X"E9",X"43", + X"1A",X"0F",X"0F",X"0F",X"0F",X"CD",X"40",X"99",X"1A",X"CD",X"40",X"99",X"1B",X"10",X"F1",X"C9", + X"E6",X"0F",X"28",X"07",X"0E",X"00",X"CD",X"55",X"99",X"18",X"07",X"79",X"A7",X"28",X"F7",X"3E", + X"40",X"0D",X"77",X"2B",X"C9",X"E6",X"0F",X"C6",X"90",X"27",X"CE",X"40",X"27",X"C9",X"10",X"00", + X"50",X"00",X"30",X"00",X"50",X"00",X"70",X"00",X"00",X"01",X"00",X"02",X"00",X"03",X"00",X"05", + X"00",X"07",X"00",X"10",X"00",X"20",X"00",X"30",X"00",X"50",X"00",X"70",X"00",X"90",X"06",X"00", + X"CD",X"F2",X"9A",X"AF",X"21",X"80",X"4E",X"06",X"08",X"CF",X"01",X"04",X"03",X"11",X"82",X"4E", + X"21",X"FC",X"43",X"CD",X"30",X"99",X"01",X"04",X"03",X"11",X"86",X"4E",X"21",X"E9",X"43",X"3A", + X"70",X"4E",X"A7",X"20",X"8B",X"0E",X"06",X"18",X"87",X"3A",X"09",X"4E",X"21",X"80",X"4E",X"A7", + X"C8",X"21",X"84",X"4E",X"C9",X"13",X"6B",X"62",X"1B",X"CB",X"46",X"C0",X"CB",X"C6",X"21",X"EC", + X"4E",X"36",X"02",X"21",X"14",X"4E",X"34",X"21",X"15",X"4E",X"34",X"46",X"21",X"1C",X"40",X"0E", + X"05",X"78",X"A7",X"28",X"0E",X"FE",X"06",X"30",X"0A",X"3E",X"7C",X"CD",X"11",X"9A",X"2B",X"2B", + X"0D",X"10",X"F6",X"0D",X"F8",X"CD",X"00",X"9A",X"2B",X"2B",X"18",X"F7",X"3A",X"00",X"4E",X"FE", + X"01",X"C8",X"CD",X"53",X"9A",X"14",X"44",X"1C",X"05",X"02",X"21",X"15",X"4E",X"46",X"18",X"CC", + X"3E",X"40",X"E5",X"D5",X"77",X"23",X"77",X"11",X"1F",X"00",X"19",X"77",X"23",X"77",X"D1",X"E1", + X"C9",X"E5",X"CD",X"17",X"9A",X"E1",X"C9",X"D5",X"11",X"1F",X"00",X"77",X"3C",X"23",X"77",X"3C", + X"19",X"77",X"3C",X"23",X"77",X"D1",X"C9",X"3A",X"6E",X"4E",X"FE",X"FF",X"20",X"05",X"06",X"02", + X"C3",X"F2",X"9A",X"06",X"01",X"CD",X"F2",X"9A",X"3A",X"6E",X"4E",X"E6",X"F0",X"28",X"09",X"0F", + X"0F",X"0F",X"0F",X"C6",X"30",X"32",X"36",X"40",X"3A",X"6E",X"4E",X"E6",X"0F",X"C6",X"30",X"32", + X"35",X"40",X"C9",X"E1",X"5E",X"23",X"56",X"23",X"4E",X"23",X"7E",X"87",X"47",X"23",X"7E",X"23", + X"E5",X"EB",X"11",X"16",X"00",X"C5",X"71",X"23",X"10",X"FC",X"C1",X"19",X"3D",X"20",X"F6",X"C9", + X"80",X"13",X"80",X"9B",X"80",X"1D",X"80",X"9A",X"80",X"18",X"80",X"0C",X"80",X"13",X"80",X"9B", + X"80",X"1D",X"80",X"9A",X"80",X"0C",X"80",X"0C",X"80",X"0C",X"80",X"0C",X"80",X"0C",X"80",X"0C", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3A",X"00",X"4E",X"FE",X"01",X"C8",X"3A",X"13", + X"4E",X"3C",X"FE",X"06",X"D2",X"DC",X"9A",X"11",X"70",X"9A",X"47",X"0E",X"05",X"21",X"02",X"40", + X"1A",X"CD",X"11",X"9A",X"3E",X"04",X"84",X"67",X"13",X"1A",X"CD",X"02",X"9A",X"3E",X"FC",X"84", + X"67",X"13",X"23",X"23",X"0D",X"10",X"E9",X"0D",X"F8",X"CD",X"00",X"9A",X"3E",X"04",X"84",X"67", + X"AF",X"CD",X"02",X"9A",X"3E",X"FC",X"84",X"67",X"23",X"23",X"18",X"EB",X"FE",X"0F",X"38",X"02", + X"3E",X"0F",X"D6",X"05",X"4F",X"06",X"00",X"21",X"70",X"9A",X"09",X"09",X"EB",X"06",X"05",X"C3", + X"AB",X"9A",X"21",X"72",X"A0",X"DF",X"5E",X"23",X"3E",X"7F",X"A6",X"57",X"DD",X"21",X"00",X"44", + X"DD",X"19",X"DD",X"E5",X"11",X"00",X"FC",X"DD",X"19",X"11",X"FF",X"FF",X"CB",X"7E",X"20",X"03", + X"11",X"E0",X"FF",X"23",X"78",X"01",X"00",X"00",X"87",X"38",X"28",X"7E",X"FE",X"27",X"28",X"09", + X"DD",X"77",X"00",X"23",X"DD",X"19",X"04",X"18",X"F2",X"23",X"DD",X"E1",X"7E",X"A7",X"FA",X"3B", + X"9B",X"7E",X"DD",X"77",X"00",X"23",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"77",X"00",X"DD",X"19", + X"10",X"F9",X"C9",X"7E",X"FE",X"27",X"28",X"0A",X"DD",X"36",X"00",X"40",X"23",X"DD",X"19",X"04", + X"18",X"F1",X"23",X"04",X"ED",X"B1",X"18",X"D2",X"21",X"55",X"9C",X"DD",X"21",X"CC",X"4E",X"FD", + X"21",X"8C",X"4E",X"CD",X"DB",X"9B",X"47",X"3A",X"CC",X"4E",X"A7",X"28",X"04",X"78",X"32",X"91", + X"4E",X"21",X"65",X"9C",X"DD",X"21",X"DC",X"4E",X"FD",X"21",X"92",X"4E",X"CD",X"DB",X"9B",X"47", + X"3A",X"DC",X"4E",X"A7",X"28",X"04",X"78",X"32",X"96",X"4E",X"21",X"75",X"9C",X"DD",X"21",X"EC", + X"4E",X"FD",X"21",X"97",X"4E",X"CD",X"DB",X"9B",X"47",X"3A",X"EC",X"4E",X"A7",X"C8",X"78",X"32", + X"9B",X"4E",X"C9",X"21",X"85",X"9C",X"DD",X"21",X"9C",X"4E",X"FD",X"21",X"8C",X"4E",X"CD",X"8E", + X"9D",X"32",X"91",X"4E",X"21",X"C5",X"9C",X"DD",X"21",X"AC",X"4E",X"FD",X"21",X"92",X"4E",X"CD", + X"8E",X"9D",X"32",X"96",X"4E",X"21",X"05",X"9D",X"DD",X"21",X"BC",X"4E",X"FD",X"21",X"97",X"4E", + X"CD",X"8E",X"9D",X"32",X"9B",X"4E",X"AF",X"32",X"90",X"4E",X"C9",X"DD",X"7E",X"00",X"A7",X"CA", + X"94",X"9D",X"4F",X"06",X"08",X"1E",X"80",X"7B",X"A1",X"20",X"05",X"CB",X"3B",X"10",X"F8",X"C9", + X"DD",X"7E",X"02",X"A3",X"20",X"07",X"DD",X"73",X"02",X"05",X"DF",X"18",X"0C",X"DD",X"35",X"0C", + X"C2",X"77",X"9D",X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74", + X"07",X"FE",X"F0",X"DA",X"45",X"9D",X"21",X"03",X"9C",X"E5",X"E6",X"0F",X"E7",X"EA",X"9E",X"FA", + X"9E",X"0C",X"9F",X"1E",X"9F",X"30",X"9F",X"EF",X"9B",X"EF",X"9B",X"EF",X"9B",X"EF",X"9B",X"EF", + X"9B",X"EF",X"9B",X"EF",X"9B",X"EF",X"9B",X"EF",X"9B",X"EF",X"9B",X"42",X"9F",X"00",X"57",X"5C", + X"61",X"67",X"6D",X"74",X"7B",X"82",X"8A",X"92",X"9A",X"A3",X"AD",X"B8",X"C3",X"01",X"02",X"04", + X"08",X"10",X"20",X"40",X"80",X"51",X"A4",X"A8",X"A4",X"EF",X"A4",X"FF",X"FF",X"11",X"A5",X"2E", + X"A5",X"46",X"A5",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"C7",X"A4",X"DC",X"A4",X"FE",X"A4",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"76",X"10",X"02",X"8E",X"00",X"01",X"0F",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"37",X"10",X"02",X"8E",X"00",X"01",X"0F",X"00",X"12",X"10",X"02", + X"8E",X"00",X"01",X"0F",X"00",X"24",X"20",X"00",X"0E",X"00",X"01",X"1F",X"00",X"14",X"20",X"00", + X"12",X"00",X"01",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"42",X"00",X"02", + X"20",X"00",X"01",X"0C",X"00",X"40",X"00",X"06",X"08",X"00",X"00",X"0A",X"00",X"56",X"10",X"02", + X"8C",X"00",X"00",X"0A",X"00",X"40",X"40",X"08",X"88",X"00",X"01",X"15",X"00",X"41",X"40",X"08", + X"88",X"00",X"01",X"15",X"00",X"32",X"40",X"08",X"88",X"00",X"01",X"15",X"00",X"43",X"40",X"08", + X"88",X"00",X"01",X"15",X"00",X"24",X"40",X"08",X"88",X"00",X"01",X"15",X"00",X"15",X"40",X"08", + X"88",X"00",X"01",X"15",X"00",X"46",X"40",X"08",X"88",X"00",X"01",X"15",X"00",X"37",X"40",X"08", + X"88",X"00",X"01",X"15",X"00",X"47",X"E6",X"1F",X"28",X"03",X"DD",X"70",X"0D",X"DD",X"4E",X"09", + X"DD",X"7E",X"0B",X"E6",X"08",X"28",X"02",X"0E",X"00",X"DD",X"71",X"0F",X"78",X"07",X"07",X"07", + X"E6",X"07",X"21",X"4D",X"9C",X"D7",X"DD",X"77",X"0C",X"78",X"E6",X"1F",X"28",X"09",X"E6",X"0F", + X"21",X"3D",X"9C",X"D7",X"DD",X"77",X"0E",X"DD",X"6E",X"0E",X"26",X"00",X"DD",X"7E",X"0D",X"E6", + X"10",X"28",X"02",X"3E",X"01",X"DD",X"86",X"04",X"CA",X"88",X"9E",X"C3",X"84",X"9E",X"DD",X"7E", + X"00",X"A7",X"20",X"27",X"DD",X"7E",X"02",X"A7",X"C8",X"DD",X"36",X"02",X"00",X"DD",X"36",X"0D", + X"00",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"0F",X"00",X"FD",X"36",X"00",X"00",X"FD",X"36",X"01", + X"00",X"FD",X"36",X"02",X"00",X"FD",X"36",X"03",X"00",X"AF",X"C9",X"4F",X"06",X"08",X"1E",X"80", + X"7B",X"A1",X"20",X"05",X"CB",X"3B",X"10",X"F8",X"C9",X"DD",X"7E",X"02",X"A3",X"20",X"3F",X"DD", + X"73",X"02",X"05",X"78",X"07",X"07",X"07",X"4F",X"06",X"00",X"E5",X"09",X"DD",X"E5",X"D1",X"13", + X"13",X"13",X"01",X"08",X"00",X"ED",X"B0",X"E1",X"DD",X"7E",X"06",X"E6",X"7F",X"DD",X"77",X"0C", + X"DD",X"7E",X"04",X"DD",X"77",X"0E",X"DD",X"7E",X"09",X"47",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F", + X"DD",X"77",X"0B",X"E6",X"08",X"20",X"07",X"DD",X"70",X"0F",X"DD",X"36",X"0D",X"00",X"DD",X"35", + X"0C",X"20",X"5A",X"DD",X"7E",X"08",X"A7",X"28",X"10",X"DD",X"35",X"08",X"20",X"0B",X"7B",X"2F", + X"DD",X"A6",X"00",X"DD",X"77",X"00",X"C3",X"8E",X"9D",X"DD",X"7E",X"06",X"E6",X"7F",X"DD",X"77", + X"0C",X"DD",X"CB",X"06",X"7E",X"28",X"16",X"DD",X"7E",X"05",X"ED",X"44",X"DD",X"77",X"05",X"DD", + X"CB",X"0D",X"46",X"DD",X"CB",X"0D",X"C6",X"28",X"24",X"DD",X"CB",X"0D",X"86",X"DD",X"7E",X"04", + X"DD",X"86",X"07",X"DD",X"77",X"04",X"DD",X"77",X"0E",X"DD",X"7E",X"09",X"DD",X"86",X"0A",X"DD", + X"77",X"09",X"47",X"DD",X"7E",X"0B",X"E6",X"08",X"20",X"03",X"DD",X"70",X"0F",X"DD",X"7E",X"0E", + X"DD",X"86",X"05",X"DD",X"77",X"0E",X"6F",X"26",X"00",X"DD",X"7E",X"03",X"E6",X"70",X"28",X"08", + X"0F",X"0F",X"0F",X"0F",X"47",X"29",X"10",X"FD",X"FD",X"75",X"00",X"7D",X"0F",X"0F",X"0F",X"0F", + X"FD",X"77",X"01",X"FD",X"74",X"02",X"7C",X"0F",X"0F",X"0F",X"0F",X"FD",X"77",X"03",X"DD",X"7E", + X"0B",X"E7",X"C2",X"9E",X"C6",X"9E",X"CB",X"9E",X"DC",X"9E",X"E3",X"9E",X"C5",X"9E",X"C5",X"9E", + X"C5",X"9E",X"C5",X"9E",X"C5",X"9E",X"C5",X"9E",X"C5",X"9E",X"C5",X"9E",X"C5",X"9E",X"C5",X"9E", + X"C5",X"9E",X"DD",X"7E",X"0F",X"C9",X"DD",X"7E",X"0F",X"18",X"09",X"3A",X"84",X"4C",X"E6",X"01", + X"DD",X"7E",X"0F",X"C0",X"E6",X"0F",X"C8",X"3D",X"DD",X"77",X"0F",X"C9",X"3A",X"84",X"4C",X"E6", + X"03",X"18",X"ED",X"3A",X"84",X"4C",X"E6",X"07",X"18",X"E6",X"DD",X"6E",X"06",X"DD",X"66",X"07", + X"7E",X"DD",X"77",X"06",X"23",X"7E",X"DD",X"77",X"07",X"C9",X"DD",X"6E",X"06",X"DD",X"66",X"07", + X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"03",X"C9",X"DD",X"6E",X"06",X"DD", + X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"04",X"C9",X"DD",X"6E", + X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77",X"09",X"C9", + X"DD",X"6E",X"06",X"DD",X"66",X"07",X"7E",X"23",X"DD",X"75",X"06",X"DD",X"74",X"07",X"DD",X"77", + X"0B",X"C9",X"DD",X"7E",X"02",X"2F",X"DD",X"A6",X"00",X"DD",X"77",X"00",X"C3",X"94",X"9D",X"31", + X"C0",X"4F",X"21",X"00",X"4C",X"06",X"04",X"32",X"C0",X"50",X"36",X"00",X"2C",X"20",X"FB",X"24", + X"10",X"F5",X"21",X"00",X"40",X"06",X"04",X"32",X"C0",X"50",X"3E",X"40",X"77",X"2C",X"20",X"FC", + X"24",X"10",X"F4",X"06",X"04",X"32",X"C0",X"50",X"3E",X"0D",X"77",X"2C",X"20",X"FC",X"24",X"10", + X"F4",X"21",X"06",X"50",X"3E",X"01",X"77",X"2D",X"20",X"FC",X"AF",X"32",X"03",X"50",X"3E",X"01", + X"ED",X"47",X"31",X"C0",X"4F",X"32",X"C0",X"50",X"AF",X"32",X"00",X"4E",X"3C",X"32",X"01",X"4E", + X"32",X"00",X"50",X"FB",X"3A",X"80",X"50",X"E6",X"03",X"C6",X"25",X"47",X"CD",X"F2",X"9A",X"3A", + X"80",X"50",X"0F",X"0F",X"0F",X"0F",X"E6",X"03",X"FE",X"03",X"20",X"0E",X"06",X"2A",X"CD",X"F2", + X"9A",X"C3",X"E7",X"9F",X"35",X"40",X"30",X"31",X"35",X"31",X"07",X"5F",X"D5",X"06",X"2B",X"CD", + X"F2",X"9A",X"06",X"2E",X"CD",X"F2",X"9A",X"D1",X"16",X"00",X"21",X"C4",X"9F",X"19",X"7E",X"32", + X"2A",X"42",X"23",X"7E",X"32",X"4A",X"42",X"3A",X"80",X"50",X"0F",X"0F",X"E6",X"03",X"C6",X"31", + X"FE",X"34",X"20",X"01",X"3C",X"32",X"0C",X"42",X"06",X"29",X"CD",X"F2",X"9A",X"3A",X"80",X"50", + X"07",X"07",X"E6",X"01",X"C6",X"2C",X"47",X"CD",X"F2",X"9A",X"3A",X"80",X"50",X"07",X"D2",X"95", + X"9F",X"AF",X"32",X"00",X"50",X"F3",X"21",X"07",X"50",X"AF",X"77",X"2D",X"20",X"FC",X"31",X"54", + X"A0",X"06",X"03",X"D9",X"E1",X"D1",X"32",X"C0",X"50",X"C1",X"3E",X"3C",X"77",X"23",X"72",X"23", + X"10",X"F8",X"3B",X"3B",X"C1",X"71",X"23",X"3E",X"3F",X"77",X"23",X"10",X"F8",X"3B",X"3B",X"1D", + X"C2",X"26",X"A0",X"F1",X"D9",X"10",X"DC",X"31",X"C0",X"4F",X"06",X"08",X"CD",X"66",X"A0",X"10", + X"FB",X"C3",X"60",X"92",X"02",X"40",X"01",X"3E",X"3D",X"10",X"40",X"40",X"0E",X"3D",X"3E",X"10", + X"C2",X"43",X"01",X"3E",X"3D",X"10",X"32",X"C0",X"50",X"21",X"00",X"28",X"2B",X"7C",X"B5",X"20", + X"FB",X"C9",X"5D",X"A5",X"6D",X"A5",X"7C",X"A5",X"85",X"A7",X"85",X"A7",X"8B",X"A5",X"9A",X"A5", + X"A6",X"A5",X"BD",X"A5",X"D1",X"A5",X"E5",X"A5",X"04",X"A6",X"85",X"A7",X"85",X"A7",X"85",X"A7", + X"85",X"A7",X"85",X"A7",X"85",X"A7",X"85",X"A7",X"12",X"A6",X"28",X"A6",X"32",X"A6",X"3C",X"A6", + X"46",X"A6",X"50",X"A6",X"5A",X"A6",X"64",X"A6",X"6E",X"A6",X"78",X"A6",X"82",X"A6",X"8C",X"A6", + X"96",X"A6",X"A0",X"A6",X"AA",X"A6",X"B4",X"A6",X"BE",X"A6",X"CE",X"A6",X"DE",X"A6",X"F5",X"A6", + X"0C",X"A7",X"23",X"A7",X"3A",X"A7",X"45",X"A7",X"56",X"A7",X"62",X"A7",X"6F",X"A7",X"7C",X"A7", + X"E4",X"E8",X"E5",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0", + X"D0",X"D0",X"D0",X"40",X"C4",X"C5",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"00", + X"E6",X"D0",X"E7",X"74",X"E1",X"D6",X"C7",X"D0",X"D0",X"74",X"E1",X"D6",X"C7",X"74",X"E1",X"D6", + X"C7",X"D0",X"74",X"E1",X"D5",X"C0",X"40",X"C6",X"C7",X"D0",X"D0",X"74",X"E1",X"D6",X"C7",X"00", + X"E6",X"D0",X"E7",X"73",X"75",X"D3",X"C0",X"D0",X"D0",X"73",X"75",X"D3",X"C0",X"73",X"75",X"D3", + X"C0",X"D0",X"73",X"75",X"D3",X"C5",X"40",X"C2",X"C0",X"D0",X"D0",X"73",X"75",X"D3",X"C0",X"00", + X"E6",X"D0",X"E7",X"72",X"E0",X"D4",X"C5",X"D0",X"D0",X"72",X"E0",X"D4",X"C5",X"72",X"E0",X"D4", + X"C5",X"D0",X"72",X"E0",X"D4",X"C0",X"40",X"C4",X"C5",X"D0",X"D0",X"72",X"E0",X"D4",X"C5",X"00", + X"E6",X"D0",X"E7",X"D0",X"40",X"C2",X"C0",X"D0",X"D0",X"D0",X"40",X"C2",X"C0",X"D0",X"40",X"C2", + X"C0",X"D0",X"D0",X"40",X"CC",X"CD",X"63",X"C9",X"C0",X"40",X"C6",X"C7",X"40",X"C2",X"C0",X"00", + X"E2",X"E8",X"E3",X"D0",X"40",X"C4",X"C5",X"40",X"DB",X"DE",X"63",X"C9",X"C5",X"D0",X"40",X"C4", + X"C5",X"D0",X"D0",X"40",X"60",X"61",X"61",X"C4",X"C5",X"40",X"CC",X"CD",X"63",X"C9",X"C5",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"C2",X"C0",X"40",X"60",X"61",X"61",X"C2",X"C0",X"D0",X"40",X"C2", + X"C0",X"D0",X"D0",X"40",X"CA",X"CB",X"62",X"C8",X"C0",X"40",X"60",X"61",X"61",X"C2",X"C0",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"C4",X"C5",X"40",X"CA",X"CB",X"62",X"C8",X"C5",X"D0",X"40",X"C4", + X"C5",X"D0",X"D0",X"40",X"C2",X"C0",X"40",X"C4",X"C5",X"40",X"CA",X"CB",X"62",X"C8",X"C5",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"CC",X"CD",X"63",X"C9",X"C5",X"40",X"CC",X"CD",X"CF",X"63",X"C9", + X"C0",X"E9",X"D0",X"40",X"C4",X"C5",X"40",X"CC",X"CD",X"63",X"C9",X"C5",X"40",X"C2",X"C0",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"60",X"61",X"61",X"C2",X"C0",X"40",X"60",X"61",X"61",X"61",X"C4", + X"C5",X"D0",X"40",X"40",X"C2",X"C0",X"40",X"1C",X"1D",X"61",X"C2",X"C0",X"40",X"C4",X"C5",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"CA",X"CB",X"62",X"C8",X"C5",X"40",X"CA",X"CB",X"CE",X"62",X"C8", + X"C0",X"40",X"40",X"C6",X"F3",X"C5",X"40",X"CA",X"CB",X"62",X"C8",X"C5",X"40",X"C2",X"C0",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"C2",X"C0",X"40",X"C2",X"C0",X"40",X"C4",X"C5",X"D0",X"40",X"C4", + X"C5",X"40",X"C6",X"F3",X"F7",X"C0",X"40",X"C4",X"C5",X"40",X"C2",X"C0",X"40",X"C4",X"C5",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"CC",X"CD",X"63",X"F1",X"CD",X"63",X"F1",X"CD",X"CF",X"63",X"F1", + X"CD",X"63",X"F1",X"F5",X"F5",X"CD",X"63",X"F1",X"CD",X"63",X"F1",X"CD",X"63",X"C9",X"C0",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"1C",X"1D",X"61",X"60",X"61",X"61",X"1C",X"1D",X"1D",X"61",X"60", + X"61",X"61",X"1C",X"1D",X"1D",X"1D",X"61",X"60",X"61",X"61",X"1C",X"1D",X"61",X"C4",X"C5",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"CA",X"CB",X"62",X"F0",X"CB",X"62",X"F0",X"CB",X"CE",X"62",X"F0", + X"CB",X"62",X"F0",X"F4",X"F4",X"CB",X"62",X"F0",X"CB",X"62",X"F0",X"CB",X"62",X"C8",X"C0",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"C2",X"C0",X"40",X"C2",X"C0",X"40",X"C4",X"C5",X"D0",X"40",X"C2", + X"C5",X"40",X"C1",X"F2",X"F6",X"C5",X"40",X"C4",X"C5",X"40",X"C2",X"C0",X"40",X"C4",X"C5",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"C4",X"C5",X"40",X"C4",X"C5",X"40",X"CC",X"CD",X"CF",X"63",X"C9", + X"C0",X"40",X"40",X"C1",X"F2",X"C0",X"40",X"C2",X"C0",X"40",X"C4",X"C5",X"40",X"C2",X"C0",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"CC",X"CD",X"63",X"C9",X"C0",X"40",X"60",X"61",X"61",X"61",X"C2", + X"C5",X"D0",X"40",X"40",X"CC",X"CD",X"63",X"C9",X"C5",X"40",X"CC",X"CD",X"63",X"C9",X"C5",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"60",X"61",X"61",X"C4",X"C5",X"40",X"CA",X"CB",X"CE",X"62",X"C8", + X"C0",X"D0",X"D0",X"40",X"60",X"61",X"61",X"C2",X"C0",X"40",X"60",X"61",X"61",X"C2",X"C0",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"CA",X"CB",X"62",X"C8",X"C0",X"40",X"C4",X"C5",X"D0",X"40",X"C4", + X"C5",X"DF",X"D0",X"40",X"CA",X"CB",X"62",X"C8",X"C5",X"40",X"CA",X"CB",X"62",X"C8",X"C5",X"00", + X"D0",X"D0",X"D0",X"E7",X"40",X"C4",X"C5",X"40",X"C4",X"C5",X"40",X"CC",X"CD",X"CF",X"63",X"C9", + X"C0",X"D0",X"D0",X"40",X"C2",X"C0",X"40",X"CC",X"CD",X"63",X"C9",X"C5",X"40",X"C2",X"C0",X"00", + X"E4",X"E8",X"E5",X"74",X"E1",X"D5",X"C0",X"40",X"C2",X"C0",X"40",X"60",X"61",X"61",X"61",X"C4", + X"C5",X"D0",X"D0",X"40",X"C4",X"C5",X"40",X"60",X"61",X"61",X"C2",X"C0",X"40",X"C4",X"C5",X"00", + X"E6",X"D0",X"E7",X"73",X"75",X"D2",X"C5",X"40",X"C4",X"C5",X"40",X"D9",X"DA",X"CE",X"62",X"C8", + X"C0",X"D0",X"D0",X"40",X"C2",X"C0",X"40",X"D9",X"DA",X"62",X"C8",X"C5",X"40",X"C2",X"C0",X"00", + X"E6",X"D0",X"E7",X"72",X"E0",X"D1",X"C3",X"40",X"C2",X"C0",X"D0",X"D0",X"D0",X"D0",X"40",X"C4", + X"C5",X"D0",X"D0",X"40",X"C4",X"C5",X"D0",X"D0",X"D0",X"D0",X"C1",X"C3",X"40",X"C4",X"C5",X"00", + X"E6",X"D0",X"E7",X"D0",X"D0",X"D0",X"74",X"E1",X"D5",X"C0",X"D0",X"D0",X"D0",X"74",X"E1",X"D5", + X"C0",X"D0",X"74",X"E1",X"D5",X"C0",X"D0",X"D0",X"D0",X"D0",X"D0",X"74",X"E1",X"D5",X"C0",X"00", + X"E6",X"D0",X"E7",X"D0",X"D0",X"D0",X"73",X"75",X"D2",X"C5",X"D0",X"D0",X"D0",X"73",X"75",X"D2", + X"C5",X"D0",X"73",X"75",X"D2",X"C5",X"D0",X"D0",X"D0",X"D0",X"D0",X"73",X"75",X"D2",X"C5",X"00", + X"E2",X"E8",X"E3",X"D0",X"D0",X"D0",X"72",X"E0",X"D1",X"C3",X"D0",X"D0",X"D0",X"72",X"E0",X"D1", + X"C3",X"D0",X"72",X"E0",X"D1",X"C3",X"D0",X"D0",X"D0",X"D0",X"D0",X"72",X"E0",X"D4",X"C0",X"00", + X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0", + X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"D0",X"40",X"C2",X"C0",X"00", + X"27",X"F1",X"07",X"F2",X"03",X"F3",X"08",X"F4",X"01",X"82",X"86",X"8B",X"69",X"8B",X"84",X"87", + X"8D",X"6B",X"8D",X"86",X"89",X"F2",X"04",X"84",X"62",X"64",X"62",X"62",X"82",X"84",X"82",X"F2", + X"03",X"6D",X"6B",X"69",X"67",X"67",X"87",X"F2",X"04",X"82",X"F2",X"03",X"8D",X"6B",X"69",X"67", + X"66",X"66",X"86",X"62",X"62",X"66",X"66",X"64",X"64",X"67",X"67",X"66",X"66",X"69",X"69",X"67", + X"67",X"6B",X"6B",X"69",X"69",X"6D",X"6D",X"6B",X"6B",X"6D",X"6D",X"F2",X"04",X"64",X"62",X"F3", + X"00",X"60",X"F3",X"0F",X"82",X"FF",X"FF",X"FF",X"F1",X"07",X"F2",X"03",X"F3",X"0F",X"F4",X"01", + X"82",X"86",X"8B",X"69",X"8B",X"84",X"87",X"8D",X"6B",X"8D",X"86",X"89",X"F2",X"04",X"84",X"62", + X"64",X"62",X"62",X"82",X"FF",X"FF",X"FF",X"F1",X"05",X"F2",X"01",X"F3",X"0F",X"F4",X"03",X"46", + X"F3",X"00",X"40",X"F3",X"0F",X"42",X"F3",X"00",X"40",X"FF",X"FF",X"FF",X"F1",X"04",X"F2",X"01", + X"F3",X"0F",X"F4",X"00",X"49",X"47",X"46",X"44",X"42",X"49",X"47",X"46",X"44",X"42",X"FF",X"F1", + X"06",X"F2",X"03",X"F3",X"0F",X"F4",X"01",X"67",X"6B",X"6E",X"F2",X"04",X"A7",X"FF",X"F1",X"06", + X"F2",X"03",X"F3",X"0F",X"F4",X"02",X"29",X"27",X"26",X"24",X"22",X"29",X"27",X"26",X"24",X"22", + X"FF",X"F1",X"06",X"F2",X"06",X"F3",X"0F",X"F4",X"01",X"89",X"89",X"89",X"89",X"89",X"89",X"8D", + X"89",X"86",X"86",X"84",X"86",X"88",X"89",X"8B",X"8B",X"8D",X"8D",X"89",X"89",X"FF",X"F1",X"06", + X"F2",X"05",X"F3",X"0F",X"F4",X"02",X"89",X"66",X"82",X"89",X"66",X"82",X"89",X"66",X"8E",X"F3", + X"00",X"60",X"F3",X"0F",X"AE",X"FF",X"F1",X"06",X"F2",X"05",X"F3",X"0F",X"F4",X"02",X"82",X"F2", + X"04",X"69",X"F2",X"05",X"62",X"86",X"62",X"66",X"89",X"89",X"69",X"89",X"FF",X"D4",X"83",X"48", + X"49",X"47",X"48",X"40",X"53",X"43",X"4F",X"52",X"45",X"27",X"8D",X"27",X"80",X"3D",X"80",X"43", + X"52",X"45",X"44",X"49",X"54",X"40",X"40",X"40",X"27",X"8D",X"27",X"80",X"3D",X"80",X"46",X"52", + X"45",X"45",X"40",X"50",X"4C",X"41",X"59",X"27",X"8D",X"27",X"80",X"1D",X"80",X"47",X"41",X"4D", + X"45",X"40",X"4F",X"56",X"45",X"52",X"27",X"9C",X"27",X"80",X"12",X"80",X"53",X"54",X"41",X"52", + X"54",X"5B",X"27",X"9C",X"27",X"93",X"EE",X"02",X"50",X"55",X"53",X"48",X"40",X"53",X"54",X"41", + X"52",X"54",X"40",X"42",X"55",X"54",X"54",X"4F",X"4E",X"27",X"88",X"27",X"80",X"B2",X"02",X"31", + X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"4C",X"59",X"40",X"27",X"86",X"27", + X"80",X"B2",X"02",X"31",X"40",X"4F",X"52",X"40",X"32",X"40",X"50",X"4C",X"41",X"59",X"45",X"52", + X"53",X"27",X"86",X"27",X"80",X"76",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"4D",X"4F",X"55", + X"53",X"45",X"40",X"46",X"4F",X"52",X"40",X"40",X"40",X"30",X"30",X"30",X"40",X"5D",X"5E",X"5F", + X"27",X"8B",X"27",X"80",X"33",X"80",X"40",X"51",X"40",X"52",X"49",X"56",X"45",X"52",X"27",X"84", + X"27",X"80",X"FA",X"02",X"40",X"40",X"40",X"51",X"55",X"45",X"45",X"4E",X"40",X"52",X"49",X"56", + X"45",X"52",X"40",X"40",X"27",X"84",X"27",X"80",X"C1",X"00",X"40",X"40",X"40",X"40",X"27",X"84", + X"27",X"80",X"C1",X"00",X"40",X"40",X"40",X"40",X"27",X"93",X"27",X"80",X"C1",X"00",X"40",X"40", + X"33",X"30",X"27",X"84",X"27",X"80",X"C1",X"00",X"40",X"40",X"35",X"30",X"27",X"84",X"27",X"80", + X"C1",X"00",X"40",X"40",X"37",X"30",X"27",X"84",X"27",X"80",X"C1",X"00",X"40",X"31",X"30",X"30", + X"27",X"84",X"27",X"80",X"C1",X"00",X"40",X"32",X"30",X"30",X"27",X"84",X"27",X"80",X"C1",X"00", + X"40",X"33",X"30",X"30",X"27",X"84",X"27",X"80",X"C1",X"00",X"40",X"35",X"30",X"30",X"27",X"84", + X"27",X"80",X"C1",X"00",X"40",X"37",X"30",X"30",X"27",X"84",X"27",X"80",X"C1",X"00",X"31",X"30", + X"30",X"30",X"27",X"84",X"27",X"80",X"C1",X"00",X"32",X"30",X"30",X"30",X"27",X"84",X"27",X"80", + X"C1",X"00",X"33",X"30",X"30",X"30",X"27",X"84",X"27",X"80",X"C1",X"00",X"35",X"30",X"30",X"30", + X"27",X"84",X"27",X"80",X"C1",X"00",X"37",X"30",X"30",X"30",X"27",X"84",X"27",X"80",X"04",X"03", + X"4D",X"45",X"4D",X"4F",X"52",X"59",X"40",X"40",X"4F",X"4B",X"27",X"8D",X"27",X"80",X"04",X"03", + X"42",X"41",X"44",X"40",X"40",X"40",X"40",X"52",X"40",X"4D",X"27",X"8D",X"27",X"80",X"08",X"03", + X"46",X"52",X"45",X"45",X"40",X"40",X"50",X"4C",X"41",X"59",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"27",X"8D",X"27",X"80",X"08",X"03",X"31",X"40",X"43",X"4F",X"49",X"4E",X"40",X"40",X"31", + X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"40",X"27",X"8D",X"27",X"80",X"08",X"03",X"31",X"40", + X"43",X"4F",X"49",X"4E",X"40",X"40",X"32",X"40",X"43",X"52",X"45",X"44",X"49",X"54",X"53",X"27", + X"8D",X"27",X"80",X"08",X"03",X"32",X"40",X"43",X"4F",X"49",X"4E",X"53",X"40",X"31",X"40",X"43", + X"52",X"45",X"44",X"49",X"54",X"40",X"27",X"8D",X"27",X"80",X"0C",X"03",X"4D",X"4F",X"55",X"53", + X"45",X"27",X"8D",X"27",X"80",X"0A",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"4E",X"4F", + X"4E",X"45",X"27",X"8D",X"27",X"80",X"0A",X"03",X"42",X"4F",X"4E",X"55",X"53",X"40",X"27",X"8D", + X"27",X"80",X"0E",X"03",X"54",X"41",X"42",X"4C",X"45",X"40",X"40",X"27",X"8D",X"27",X"80",X"0E", + X"03",X"55",X"50",X"52",X"49",X"47",X"48",X"54",X"27",X"8D",X"27",X"80",X"0A",X"02",X"30",X"30", + X"30",X"27",X"8D",X"27",X"80",X"52",X"02",X"4E",X"4F",X"40",X"45",X"4E",X"54",X"52",X"59",X"40", + X"44",X"41",X"54",X"41",X"27",X"82",X"27",X"80",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3A",X"00",X"4E",X"E7",X"0C",X"B0",X"30",X"B0",X"52",X"B1",X"28",X"B2",X"3A",X"01",X"4E",X"E7", + X"14",X"B0",X"44",X"B0",X"EF",X"00",X"00",X"EF",X"06",X"00",X"EF",X"01",X"00",X"EF",X"14",X"00", + X"EF",X"18",X"00",X"EF",X"07",X"00",X"21",X"01",X"4E",X"34",X"21",X"01",X"50",X"36",X"01",X"C9", + X"CD",X"27",X"9A",X"3A",X"6E",X"4E",X"A7",X"28",X"0C",X"AF",X"32",X"04",X"4E",X"32",X"02",X"4E", + X"21",X"00",X"4E",X"34",X"C9",X"3A",X"02",X"4E",X"E7",X"77",X"B0",X"44",X"B0",X"91",X"B0",X"44", + X"B0",X"AA",X"B0",X"44",X"B0",X"9F",X"B0",X"44",X"B0",X"AA",X"B0",X"44",X"B0",X"9F",X"B0",X"44", + X"B0",X"AA",X"B0",X"44",X"B0",X"9F",X"B0",X"44",X"B0",X"AA",X"B0",X"44",X"B0",X"9F",X"B0",X"44", + X"B0",X"B6",X"B0",X"44",X"B0",X"D4",X"B0",X"EF",X"00",X"01",X"EF",X"06",X"00",X"EF",X"02",X"00", + X"EF",X"01",X"01",X"EF",X"11",X"00",X"EF",X"1C",X"05",X"CD",X"62",X"B2",X"0E",X"0B",X"C3",X"1E", + X"B1",X"AF",X"CD",X"FF",X"B0",X"CD",X"D8",X"B0",X"F7",X"45",X"02",X"00",X"C3",X"27",X"B1",X"AF", + X"CD",X"FF",X"B0",X"F7",X"45",X"02",X"00",X"C3",X"27",X"B1",X"3E",X"9A",X"CD",X"FF",X"B0",X"F7", + X"45",X"02",X"00",X"C3",X"27",X"B1",X"3E",X"9B",X"CD",X"FF",X"B0",X"F7",X"45",X"02",X"00",X"AF", + X"32",X"15",X"4E",X"32",X"70",X"4E",X"3C",X"32",X"14",X"4E",X"AF",X"32",X"07",X"4E",X"32",X"08", + X"4E",X"C3",X"27",X"B1",X"CD",X"28",X"B2",X"C9",X"06",X"07",X"21",X"01",X"41",X"11",X"1F",X"00", + X"3E",X"9E",X"CD",X"17",X"9A",X"19",X"3C",X"10",X"F9",X"77",X"23",X"3C",X"77",X"21",X"60",X"42", + X"11",X"20",X"00",X"3C",X"77",X"19",X"3C",X"77",X"19",X"3C",X"77",X"19",X"3C",X"77",X"C9",X"21", + X"01",X"45",X"11",X"40",X"00",X"06",X"07",X"CD",X"02",X"9A",X"19",X"10",X"FA",X"77",X"23",X"77", + X"21",X"60",X"46",X"11",X"20",X"00",X"77",X"19",X"77",X"19",X"77",X"19",X"77",X"C9",X"06",X"1C", + X"CD",X"42",X"00",X"F7",X"4A",X"02",X"00",X"21",X"02",X"4E",X"34",X"C9",X"06",X"1C",X"CD",X"42", + X"00",X"F7",X"45",X"02",X"00",X"C3",X"27",X"B1",X"3A",X"C1",X"4D",X"A7",X"C8",X"AF",X"32",X"C1", + X"4D",X"3A",X"3A",X"4D",X"EE",X"02",X"32",X"34",X"4D",X"47",X"21",X"0A",X"03",X"DF",X"22",X"2C", + X"4D",X"C9",X"3A",X"03",X"4E",X"E7",X"60",X"B1",X"8A",X"B1",X"DF",X"B1",X"44",X"B0",X"12",X"B2", + X"CD",X"27",X"9A",X"EF",X"1C",X"85",X"EF",X"00",X"01",X"EF",X"1C",X"07",X"EF",X"1C",X"8B",X"EF", + X"1C",X"13",X"EF",X"1E",X"00",X"CD",X"0D",X"B2",X"3E",X"01",X"32",X"E0",X"4D",X"3A",X"71",X"4E", + X"FE",X"FF",X"C8",X"EF",X"1C",X"0A",X"EF",X"1F",X"00",X"C9",X"CD",X"27",X"9A",X"3A",X"6E",X"4E", + X"FE",X"01",X"06",X"09",X"20",X"02",X"06",X"08",X"CD",X"F2",X"9A",X"3A",X"6E",X"4E",X"FE",X"01", + X"3A",X"40",X"50",X"28",X"0B",X"CB",X"77",X"20",X"07",X"3E",X"01",X"32",X"70",X"4E",X"18",X"07", + X"CB",X"6F",X"C0",X"AF",X"32",X"70",X"4E",X"3A",X"6B",X"4E",X"A7",X"28",X"15",X"3A",X"70",X"4E", + X"A7",X"3A",X"6E",X"4E",X"28",X"03",X"C6",X"99",X"27",X"C6",X"99",X"27",X"32",X"6E",X"4E",X"CD", + X"27",X"9A",X"CD",X"0D",X"B2",X"AF",X"32",X"E0",X"4D",X"3E",X"02",X"32",X"CC",X"4E",X"C9",X"EF", + X"00",X"01",X"EF",X"01",X"01",X"EF",X"02",X"00",X"EF",X"12",X"00",X"EF",X"1C",X"06",X"EF",X"18", + X"00",X"EF",X"1B",X"00",X"AF",X"32",X"13",X"4E",X"3A",X"6F",X"4E",X"32",X"14",X"4E",X"32",X"15", + X"4E",X"C6",X"02",X"32",X"23",X"4E",X"EF",X"1A",X"00",X"F7",X"4A",X"01",X"00",X"21",X"03",X"4E", + X"34",X"C9",X"21",X"15",X"4E",X"35",X"CD",X"EC",X"99",X"AF",X"32",X"03",X"4E",X"32",X"02",X"4E", + X"32",X"04",X"4E",X"21",X"00",X"4E",X"34",X"C9",X"3A",X"04",X"4E",X"E7",X"86",X"B2",X"8B",X"B2", + X"44",X"B0",X"CF",X"B2",X"4C",X"B3",X"44",X"B0",X"71",X"B3",X"44",X"B0",X"AD",X"B3",X"C3",X"B3", + X"44",X"B0",X"2E",X"B4",X"34",X"B4",X"44",X"B0",X"40",X"B4",X"44",X"B0",X"59",X"B4",X"7D",X"B4", + X"44",X"B0",X"2E",X"B4",X"44",X"B0",X"44",X"B0",X"44",X"B0",X"44",X"B0",X"06",X"B4",X"44",X"B0", + X"2E",X"B4",X"21",X"09",X"4E",X"AF",X"06",X"0B",X"CF",X"32",X"22",X"4E",X"CD",X"0D",X"94",X"2A", + X"73",X"4E",X"22",X"0A",X"4E",X"21",X"0A",X"4E",X"11",X"38",X"4E",X"01",X"1E",X"00",X"ED",X"B0", + X"C9",X"21",X"04",X"4E",X"34",X"C9",X"CD",X"62",X"B2",X"18",X"F6",X"3A",X"00",X"4E",X"3D",X"20", + X"06",X"3E",X"18",X"32",X"04",X"4E",X"C9",X"EF",X"11",X"00",X"EF",X"05",X"00",X"EF",X"10",X"00", + X"EF",X"1A",X"00",X"F7",X"54",X"00",X"00",X"F7",X"54",X"06",X"00",X"3A",X"72",X"4E",X"47",X"3A", + X"09",X"4E",X"A0",X"32",X"03",X"50",X"18",X"C9",X"3A",X"00",X"50",X"CB",X"67",X"20",X"09",X"21", + X"04",X"4E",X"36",X"0E",X"EF",X"13",X"00",X"C9",X"CD",X"7E",X"85",X"28",X"36",X"18",X"64",X"3A", + X"22",X"4E",X"E7",X"00",X"80",X"B8",X"B2",X"46",X"80",X"3E",X"80",X"57",X"80",X"87",X"80",X"83", + X"80",X"3A",X"80",X"36",X"80",X"1C",X"80",X"8B",X"80",X"8F",X"80",X"42",X"80",X"06",X"80",X"6D", + X"80",X"93",X"80",X"32",X"80",X"65",X"82",X"8A",X"82",X"93",X"82",X"D0",X"82",X"DA",X"82",X"FF", + X"FF",X"FF",X"FF",X"3A",X"06",X"4E",X"E7",X"CE",X"85",X"44",X"B0",X"97",X"85",X"44",X"B0",X"A8", + X"85",X"44",X"B0",X"B4",X"85",X"44",X"B0",X"A8",X"85",X"44",X"B0",X"B8",X"85",X"44",X"B0",X"A8", + X"85",X"44",X"B0",X"9C",X"85",X"44",X"B0",X"A8",X"85",X"44",X"B0",X"B8",X"85",X"44",X"B0",X"BC", + X"85",X"C4",X"85",X"CD",X"96",X"06",X"CD",X"B1",X"B4",X"CD",X"B1",X"B4",X"CD",X"44",X"06",X"CD", + X"60",X"06",X"CD",X"FA",X"05",X"CD",X"CD",X"05",X"CD",X"85",X"B7",X"C9",X"3E",X"01",X"32",X"12", + X"4E",X"CD",X"81",X"B2",X"3A",X"14",X"4E",X"A7",X"C2",X"81",X"B2",X"3A",X"70",X"4E",X"A7",X"CA", + X"81",X"B2",X"3A",X"42",X"4E",X"A7",X"CA",X"81",X"B2",X"EF",X"1C",X"05",X"F7",X"54",X"00",X"00", + X"C9",X"3A",X"70",X"4E",X"A7",X"28",X"06",X"3A",X"42",X"4E",X"A7",X"20",X"13",X"3A",X"14",X"4E", + X"A7",X"20",X"24",X"CD",X"27",X"9A",X"EF",X"1C",X"05",X"F7",X"54",X"00",X"00",X"C3",X"81",X"B2", + X"CD",X"DD",X"05",X"3A",X"09",X"4E",X"EE",X"01",X"32",X"09",X"4E",X"3A",X"22",X"4E",X"A7",X"3E", + X"11",X"20",X"04",X"32",X"04",X"4E",X"C9",X"3E",X"09",X"32",X"04",X"4E",X"C9",X"AF",X"32",X"02", + X"4E",X"32",X"04",X"4E",X"32",X"70",X"4E",X"32",X"09",X"4E",X"32",X"03",X"50",X"3E",X"01",X"32", + X"00",X"4E",X"C9",X"EF",X"00",X"01",X"EF",X"01",X"01",X"EF",X"02",X"00",X"EF",X"11",X"00",X"EF", + X"13",X"00",X"EF",X"04",X"00",X"EF",X"05",X"00",X"EF",X"10",X"00",X"EF",X"03",X"00",X"EF",X"1A", + X"00",X"EF",X"1C",X"06",X"F7",X"54",X"00",X"00",X"F7",X"54",X"06",X"00",X"3A",X"72",X"4E",X"47", + X"3A",X"09",X"4E",X"A0",X"32",X"03",X"50",X"3E",X"01",X"32",X"22",X"4E",X"21",X"0D",X"4E",X"3E", + X"01",X"AE",X"77",X"C3",X"81",X"B2",X"EF",X"11",X"00",X"EF",X"13",X"00",X"EF",X"05",X"00",X"EF", + X"10",X"00",X"EF",X"1A",X"00",X"EF",X"1C",X"05",X"EF",X"1D",X"00",X"F7",X"54",X"00",X"00",X"AF", + X"32",X"03",X"50",X"32",X"22",X"4E",X"3E",X"02",X"32",X"13",X"4E",X"C3",X"81",X"B2",X"3E",X"03", + X"32",X"04",X"4E",X"C9",X"F7",X"45",X"00",X"00",X"CD",X"81",X"B2",X"AF",X"32",X"CC",X"4E",X"C9", + X"EF",X"00",X"01",X"EF",X"06",X"00",X"EF",X"11",X"00",X"EF",X"13",X"00",X"EF",X"05",X"00",X"EF", + X"10",X"13",X"F7",X"43",X"00",X"00",X"C3",X"81",X"B2",X"AF",X"32",X"CC",X"4E",X"06",X"06",X"21", + X"0C",X"4E",X"CF",X"CD",X"0D",X"94",X"CD",X"81",X"B2",X"21",X"23",X"4E",X"34",X"21",X"13",X"4E", + X"34",X"2A",X"0A",X"4E",X"7E",X"FE",X"14",X"C8",X"23",X"22",X"0A",X"4E",X"C9",X"EF",X"00",X"01", + X"EF",X"01",X"01",X"EF",X"02",X"00",X"EF",X"11",X"00",X"EF",X"05",X"00",X"EF",X"10",X"00",X"EF", + X"1A",X"00",X"EF",X"1C",X"06",X"F7",X"54",X"00",X"00",X"F7",X"54",X"06",X"00",X"3A",X"72",X"4E", + X"47",X"3A",X"09",X"4E",X"A0",X"32",X"03",X"50",X"AF",X"32",X"22",X"4E",X"21",X"04",X"4E",X"34", + X"C9",X"CD",X"9D",X"86",X"CD",X"24",X"83",X"CD",X"42",X"83",X"CD",X"A8",X"83",X"CD",X"0E",X"84", + X"CD",X"74",X"84",X"CD",X"F1",X"85",X"CD",X"A7",X"89",X"CD",X"43",X"8A",X"3A",X"1A",X"4F",X"FE", + X"08",X"30",X"03",X"CD",X"F1",X"8A",X"CD",X"24",X"8D",X"CD",X"11",X"8E",X"CD",X"C0",X"8E",X"CD", + X"74",X"8F",X"CD",X"04",X"B8",X"CD",X"BA",X"87",X"C9",X"3A",X"28",X"4F",X"A7",X"C8",X"E1",X"E7", + X"44",X"B0",X"25",X"B5",X"6A",X"B5",X"AB",X"B5",X"3A",X"29",X"4F",X"A7",X"C8",X"E1",X"E7",X"44", + X"B0",X"BD",X"B5",X"02",X"B6",X"43",X"B6",X"3A",X"2A",X"4F",X"A7",X"C8",X"E1",X"E7",X"44",X"B0", + X"55",X"B6",X"9A",X"B6",X"DB",X"B6",X"3A",X"2B",X"4F",X"A7",X"C8",X"E1",X"E7",X"44",X"B0",X"ED", + X"B6",X"32",X"B7",X"73",X"B7",X"DD",X"21",X"00",X"4D",X"FD",X"21",X"40",X"4C",X"CD",X"BE",X"BB", + X"DD",X"21",X"3C",X"4D",X"FD",X"21",X"44",X"4D",X"CD",X"6C",X"98",X"CD",X"F9",X"BC",X"30",X"21", + X"21",X"46",X"4C",X"CD",X"94",X"BC",X"DD",X"21",X"40",X"4C",X"ED",X"5B",X"3C",X"4D",X"CD",X"B0", + X"BC",X"2A",X"44",X"4C",X"22",X"42",X"4C",X"21",X"33",X"4F",X"36",X"00",X"21",X"28",X"4F",X"34", + X"C9",X"DD",X"21",X"40",X"4C",X"CD",X"9C",X"BC",X"18",X"DC",X"DD",X"21",X"40",X"4C",X"FD",X"21", + X"00",X"4D",X"21",X"42",X"4C",X"01",X"00",X"00",X"78",X"ED",X"5B",X"44",X"4C",X"BB",X"28",X"18", + X"CD",X"6B",X"BC",X"2A",X"00",X"4D",X"CD",X"E5",X"BC",X"38",X"15",X"3A",X"33",X"4F",X"0F",X"0F", + X"E6",X"C0",X"C6",X"00",X"32",X"2D",X"4F",X"C9",X"BA",X"28",X"05",X"CD",X"75",X"BC",X"18",X"E3", + X"AF",X"32",X"03",X"4C",X"32",X"2D",X"4F",X"CD",X"5C",X"B5",X"C9",X"3A",X"B7",X"4D",X"A7",X"C0", + X"3E",X"01",X"32",X"B7",X"4D",X"AF",X"32",X"28",X"4F",X"CD",X"C3",X"BC",X"C9",X"DD",X"21",X"02", + X"4D",X"FD",X"21",X"48",X"4C",X"CD",X"BE",X"BB",X"DD",X"21",X"3E",X"4D",X"FD",X"21",X"44",X"4D", + X"CD",X"6C",X"98",X"CD",X"F9",X"BC",X"30",X"21",X"21",X"4E",X"4C",X"CD",X"94",X"BC",X"DD",X"21", + X"48",X"4C",X"ED",X"5B",X"3E",X"4D",X"CD",X"B0",X"BC",X"2A",X"4C",X"4C",X"22",X"4A",X"4C",X"21", + X"34",X"4F",X"36",X"00",X"21",X"29",X"4F",X"34",X"C9",X"DD",X"21",X"48",X"4C",X"CD",X"9C",X"BC", + X"18",X"DC",X"DD",X"21",X"48",X"4C",X"FD",X"21",X"02",X"4D",X"21",X"4A",X"4C",X"01",X"00",X"00", + X"78",X"ED",X"5B",X"4C",X"4C",X"BB",X"28",X"18",X"CD",X"6B",X"BC",X"2A",X"02",X"4D",X"CD",X"E5", + X"BC",X"38",X"15",X"3A",X"34",X"4F",X"0F",X"0F",X"E6",X"C0",X"C6",X"00",X"32",X"2E",X"4F",X"C9", + X"BA",X"28",X"05",X"CD",X"75",X"BC",X"18",X"E3",X"AF",X"32",X"05",X"4C",X"32",X"2E",X"4F",X"CD", + X"F4",X"B5",X"C9",X"3A",X"B7",X"4D",X"A7",X"C0",X"3E",X"02",X"32",X"B7",X"4D",X"AF",X"32",X"29", + X"4F",X"CD",X"C3",X"BC",X"C9",X"DD",X"21",X"04",X"4D",X"FD",X"21",X"50",X"4C",X"CD",X"BE",X"BB", + X"DD",X"21",X"40",X"4D",X"FD",X"21",X"44",X"4D",X"CD",X"6C",X"98",X"CD",X"F9",X"BC",X"30",X"21", + X"21",X"56",X"4C",X"CD",X"94",X"BC",X"DD",X"21",X"50",X"4C",X"ED",X"5B",X"40",X"4D",X"CD",X"B0", + X"BC",X"2A",X"54",X"4C",X"22",X"52",X"4C",X"21",X"35",X"4F",X"36",X"00",X"21",X"2A",X"4F",X"34", + X"C9",X"DD",X"21",X"50",X"4C",X"CD",X"9C",X"BC",X"18",X"DC",X"DD",X"21",X"50",X"4C",X"FD",X"21", + X"04",X"4D",X"21",X"52",X"4C",X"01",X"00",X"00",X"78",X"ED",X"5B",X"54",X"4C",X"BB",X"28",X"18", + X"CD",X"6B",X"BC",X"2A",X"04",X"4D",X"CD",X"E5",X"BC",X"38",X"15",X"3A",X"35",X"4F",X"0F",X"0F", + X"E6",X"C0",X"C6",X"00",X"32",X"2F",X"4F",X"C9",X"BA",X"28",X"05",X"CD",X"75",X"BC",X"18",X"E3", + X"AF",X"32",X"07",X"4C",X"32",X"2F",X"4F",X"CD",X"8C",X"B6",X"C9",X"3A",X"B7",X"4D",X"A7",X"C0", + X"3E",X"03",X"32",X"B7",X"4D",X"AF",X"32",X"2A",X"4F",X"CD",X"C3",X"BC",X"C9",X"DD",X"21",X"06", + X"4D",X"FD",X"21",X"58",X"4C",X"CD",X"BE",X"BB",X"DD",X"21",X"42",X"4D",X"FD",X"21",X"44",X"4D", + X"CD",X"6C",X"98",X"CD",X"F9",X"BC",X"30",X"21",X"21",X"5E",X"4C",X"CD",X"94",X"BC",X"DD",X"21", + X"58",X"4C",X"ED",X"5B",X"42",X"4D",X"CD",X"B0",X"BC",X"2A",X"5C",X"4C",X"22",X"5A",X"4C",X"21", + X"36",X"4F",X"36",X"00",X"21",X"2B",X"4F",X"34",X"C9",X"DD",X"21",X"58",X"4C",X"CD",X"9C",X"BC", + X"18",X"DC",X"DD",X"21",X"58",X"4C",X"FD",X"21",X"06",X"4D",X"21",X"5A",X"4C",X"01",X"00",X"00", + X"78",X"ED",X"5B",X"5C",X"4C",X"BB",X"28",X"18",X"CD",X"6B",X"BC",X"2A",X"06",X"4D",X"CD",X"E5", + X"BC",X"38",X"15",X"3A",X"36",X"4F",X"0F",X"0F",X"E6",X"C0",X"C6",X"00",X"32",X"30",X"4F",X"C9", + X"BA",X"28",X"05",X"CD",X"75",X"BC",X"18",X"E3",X"AF",X"32",X"09",X"4C",X"32",X"30",X"4F",X"CD", + X"24",X"B7",X"C9",X"3A",X"B7",X"4D",X"A7",X"C0",X"3E",X"04",X"32",X"B7",X"4D",X"AF",X"32",X"2B", + X"4F",X"CD",X"C3",X"BC",X"C9",X"3A",X"26",X"4F",X"47",X"3A",X"B1",X"4D",X"B0",X"47",X"3A",X"1A", + X"4F",X"D6",X"08",X"3E",X"00",X"38",X"02",X"3E",X"01",X"B0",X"C0",X"CD",X"8D",X"0B",X"4F",X"3A", + X"72",X"4E",X"47",X"3A",X"09",X"4E",X"A0",X"20",X"4B",X"CB",X"61",X"28",X"01",X"37",X"3A",X"76", + X"4E",X"17",X"E6",X"0F",X"32",X"76",X"4E",X"D6",X"0C",X"C0",X"CD",X"D5",X"BD",X"18",X"04",X"3D", + X"32",X"23",X"4E",X"3E",X"0F",X"32",X"26",X"4F",X"3E",X"40",X"32",X"AC",X"4E",X"21",X"27",X"4F", + X"06",X"06",X"3E",X"01",X"CF",X"21",X"B8",X"4D",X"06",X"04",X"3E",X"04",X"CF",X"3A",X"13",X"4E", + X"A7",X"20",X"0D",X"32",X"2A",X"4F",X"32",X"BA",X"4D",X"32",X"2B",X"4F",X"32",X"BB",X"4D",X"C9", + X"3D",X"28",X"F6",X"C9",X"79",X"17",X"3A",X"77",X"4E",X"17",X"E6",X"0F",X"32",X"77",X"4E",X"D6", + X"0C",X"28",X"B7",X"C9",X"3A",X"2C",X"4F",X"A7",X"C2",X"DC",X"BA",X"3A",X"1A",X"4F",X"E7",X"25", + X"B8",X"BE",X"B8",X"0C",X"B9",X"3C",X"BA",X"66",X"BA",X"78",X"BA",X"0A",X"BD",X"0E",X"BD",X"46", + X"BD",X"7A",X"BD",X"BF",X"BD",X"3A",X"0C",X"4F",X"20",X"26",X"2A",X"0A",X"4F",X"29",X"22",X"0A", + X"4F",X"2A",X"08",X"4F",X"ED",X"6A",X"22",X"08",X"4F",X"D0",X"21",X"0A",X"4F",X"34",X"21",X"1E", + X"4F",X"35",X"20",X"22",X"CD",X"D9",X"BC",X"AF",X"32",X"0C",X"4F",X"21",X"1A",X"4F",X"34",X"C9", + X"2A",X"02",X"4F",X"29",X"22",X"02",X"4F",X"2A",X"00",X"4F",X"ED",X"6A",X"22",X"00",X"4F",X"D0", + X"21",X"02",X"4F",X"34",X"18",X"D8",X"ED",X"4B",X"44",X"4D",X"3A",X"47",X"4D",X"B8",X"28",X"D4", + X"3A",X"0B",X"4D",X"E6",X"07",X"FE",X"04",X"20",X"1C",X"3A",X"47",X"4D",X"FE",X"27",X"38",X"37", + X"FE",X"34",X"30",X"33",X"3A",X"3B",X"4D",X"32",X"3B",X"4D",X"47",X"21",X"0A",X"03",X"DF",X"22", + X"2E",X"4D",X"CD",X"9E",X"BA",X"CD",X"B9",X"BA",X"21",X"1B",X"4F",X"34",X"3E",X"08",X"BE",X"D0", + X"36",X"00",X"23",X"3A",X"3B",X"4D",X"A7",X"06",X"80",X"28",X"02",X"06",X"00",X"7E",X"3C",X"E6", + X"01",X"80",X"77",X"CD",X"09",X"83",X"C9",X"3A",X"35",X"4D",X"EE",X"02",X"18",X"C9",X"2E",X"14", + X"26",X"18",X"22",X"0C",X"4C",X"21",X"01",X"00",X"06",X"01",X"CD",X"CE",X"BA",X"3E",X"01",X"32", + X"23",X"4F",X"2A",X"46",X"4D",X"22",X"1F",X"4F",X"2A",X"0A",X"4D",X"22",X"21",X"4F",X"3A",X"1D", + X"4F",X"47",X"AF",X"CB",X"40",X"28",X"02",X"3E",X"02",X"32",X"24",X"4F",X"78",X"32",X"1E",X"4F", + X"06",X"00",X"FE",X"10",X"30",X"02",X"06",X"80",X"78",X"32",X"25",X"4F",X"AF",X"32",X"1B",X"4F", + X"32",X"1C",X"4F",X"3E",X"80",X"32",X"AC",X"4E",X"CD",X"4B",X"B8",X"C9",X"21",X"23",X"4F",X"3A", + X"25",X"4F",X"CB",X"7F",X"20",X"07",X"7E",X"A7",X"CA",X"60",X"B9",X"3D",X"77",X"21",X"01",X"00", + X"06",X"01",X"CD",X"CE",X"BA",X"3A",X"0A",X"4D",X"E6",X"07",X"FE",X"04",X"20",X"1E",X"3A",X"46", + X"4D",X"47",X"3A",X"44",X"4D",X"90",X"38",X"20",X"FE",X"08",X"30",X"0D",X"3A",X"46",X"4D",X"FE", + X"25",X"38",X"06",X"EF",X"17",X"00",X"CD",X"4B",X"B8",X"CD",X"9E",X"BA",X"CD",X"B9",X"BA",X"3A", + X"37",X"4F",X"E6",X"03",X"32",X"1C",X"4F",X"C9",X"3E",X"04",X"32",X"1A",X"4F",X"C3",X"8A",X"BA", + X"3A",X"25",X"4F",X"A7",X"20",X"75",X"34",X"21",X"00",X"FF",X"06",X"00",X"3A",X"24",X"4F",X"A7", + X"28",X"09",X"FE",X"03",X"28",X"05",X"21",X"00",X"01",X"06",X"02",X"CD",X"CE",X"BA",X"3A",X"24", + X"4F",X"0F",X"30",X"27",X"3A",X"0B",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"4C",X"B9",X"3A",X"47", + X"4D",X"47",X"3A",X"20",X"4F",X"90",X"C2",X"49",X"B9",X"3A",X"1D",X"4F",X"32",X"1E",X"4F",X"3A", + X"24",X"4F",X"3C",X"E6",X"03",X"32",X"24",X"4F",X"C3",X"49",X"B9",X"21",X"1E",X"4F",X"35",X"3E", + X"08",X"BE",X"30",X"10",X"3A",X"47",X"4D",X"FE",X"25",X"38",X"04",X"FE",X"37",X"38",X"0F",X"3E", + X"08",X"32",X"1E",X"4F",X"3E",X"01",X"32",X"25",X"4F",X"3E",X"02",X"32",X"23",X"4F",X"3A",X"0B", + X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"4C",X"B9",X"C3",X"49",X"B9",X"CB",X"77",X"20",X"35",X"3C", + X"32",X"25",X"4F",X"3C",X"E6",X"1F",X"32",X"23",X"4F",X"FE",X"08",X"38",X"0E",X"CB",X"F7",X"32", + X"25",X"4F",X"3A",X"24",X"4F",X"3C",X"E6",X"03",X"32",X"24",X"4F",X"21",X"00",X"FF",X"06",X"00", + X"3A",X"24",X"4F",X"A7",X"28",X"09",X"FE",X"03",X"28",X"05",X"21",X"00",X"01",X"06",X"02",X"CD", + X"CE",X"BA",X"18",X"BA",X"21",X"25",X"4F",X"3E",X"1F",X"A6",X"32",X"23",X"4F",X"35",X"3D",X"20", + X"01",X"77",X"21",X"00",X"FF",X"06",X"00",X"3A",X"24",X"4F",X"A7",X"28",X"09",X"FE",X"03",X"28", + X"05",X"21",X"00",X"01",X"06",X"02",X"CD",X"CE",X"BA",X"C3",X"84",X"B9",X"3A",X"0A",X"4D",X"E6", + X"07",X"FE",X"04",X"C2",X"4C",X"B9",X"3A",X"46",X"4D",X"47",X"3A",X"44",X"4D",X"90",X"30",X"03", + X"CD",X"4B",X"B8",X"3A",X"47",X"4D",X"FE",X"25",X"38",X"05",X"FE",X"37",X"DA",X"49",X"B9",X"3E", + X"05",X"32",X"1A",X"4F",X"18",X"12",X"3A",X"25",X"4F",X"CB",X"7F",X"20",X"0B",X"A7",X"CA",X"60", + X"B9",X"3A",X"23",X"4F",X"3D",X"32",X"23",X"4F",X"21",X"01",X"00",X"06",X"01",X"CD",X"CE",X"BA", + X"3A",X"0A",X"4D",X"E6",X"07",X"FE",X"04",X"C2",X"4C",X"B9",X"3A",X"46",X"4D",X"FE",X"3E",X"30", + X"03",X"C3",X"49",X"B9",X"3E",X"06",X"32",X"1A",X"4F",X"AF",X"32",X"EB",X"4D",X"C9",X"DD",X"21", + X"2E",X"4D",X"FD",X"21",X"16",X"4D",X"CD",X"47",X"91",X"22",X"16",X"4D",X"2A",X"2E",X"4D",X"22", + X"22",X"4D",X"3A",X"3B",X"4D",X"32",X"35",X"4D",X"C9",X"DD",X"21",X"22",X"4D",X"FD",X"21",X"0A", + X"4D",X"CD",X"47",X"91",X"22",X"0A",X"4D",X"CD",X"5F",X"91",X"22",X"46",X"4D",X"C9",X"22",X"22", + X"4D",X"22",X"2E",X"4D",X"78",X"32",X"35",X"4D",X"32",X"3B",X"4D",X"C9",X"E7",X"44",X"B0",X"E5", + X"BA",X"2A",X"BB",X"94",X"BB",X"DD",X"21",X"0A",X"4D",X"FD",X"21",X"60",X"4C",X"CD",X"BE",X"BB", + X"DD",X"21",X"46",X"4D",X"FD",X"21",X"44",X"4D",X"CD",X"6C",X"98",X"CD",X"F9",X"BC",X"30",X"21", + X"21",X"66",X"4C",X"CD",X"94",X"BC",X"DD",X"21",X"60",X"4C",X"ED",X"5B",X"46",X"4D",X"CD",X"B0", + X"BC",X"2A",X"64",X"4C",X"22",X"62",X"4C",X"21",X"37",X"4F",X"36",X"00",X"21",X"2C",X"4F",X"34", + X"C9",X"DD",X"21",X"60",X"4C",X"CD",X"9C",X"BC",X"18",X"DC",X"DD",X"21",X"60",X"4C",X"FD",X"21", + X"0A",X"4D",X"21",X"62",X"4C",X"01",X"00",X"00",X"78",X"ED",X"5B",X"64",X"4C",X"BB",X"28",X"18", + X"CD",X"6B",X"BC",X"2A",X"0A",X"4D",X"CD",X"E5",X"BC",X"38",X"15",X"3A",X"37",X"4F",X"0F",X"0F", + X"E6",X"C0",X"C6",X"14",X"32",X"32",X"4F",X"C9",X"BA",X"28",X"05",X"CD",X"75",X"BC",X"18",X"E3", + X"21",X"00",X"00",X"22",X"0C",X"4C",X"21",X"0C",X"AC",X"22",X"0A",X"4D",X"21",X"21",X"33",X"22", + X"16",X"4D",X"22",X"46",X"4D",X"21",X"00",X"FF",X"22",X"22",X"4D",X"22",X"2E",X"4D",X"3E",X"00", + X"32",X"35",X"4D",X"32",X"3B",X"4D",X"AF",X"32",X"32",X"4F",X"32",X"1B",X"4F",X"32",X"1C",X"4F", + X"CD",X"1C",X"BB",X"C9",X"21",X"1B",X"4F",X"34",X"3E",X"08",X"BE",X"D8",X"36",X"00",X"CD",X"D9", + X"BC",X"2E",X"80",X"26",X"1C",X"22",X"0C",X"4C",X"CD",X"09",X"83",X"AF",X"32",X"1A",X"4F",X"32", + X"2C",X"4F",X"CD",X"C3",X"BC",X"C9",X"01",X"01",X"01",X"FF",X"FF",X"01",X"FF",X"FF",X"21",X"08", + X"4D",X"DD",X"7E",X"00",X"96",X"FD",X"36",X"00",X"00",X"30",X"08",X"7E",X"DD",X"96",X"00",X"FD", + X"36",X"00",X"01",X"FD",X"77",X"02",X"23",X"DD",X"7E",X"01",X"96",X"FD",X"36",X"01",X"00",X"30", + X"08",X"7E",X"DD",X"96",X"01",X"FD",X"36",X"01",X"01",X"FD",X"77",X"03",X"FD",X"7E",X"01",X"1F", + X"FD",X"7E",X"00",X"17",X"FD",X"77",X"00",X"21",X"B6",X"BB",X"47",X"DF",X"FD",X"75",X"06",X"FD", + X"74",X"07",X"FD",X"6E",X"02",X"FD",X"66",X"03",X"7D",X"2C",X"A7",X"28",X"01",X"6F",X"7C",X"24", + X"A7",X"28",X"01",X"67",X"7D",X"94",X"20",X"09",X"FD",X"36",X"04",X"01",X"FD",X"36",X"05",X"01", + X"C9",X"38",X"10",X"7C",X"65",X"6F",X"CD",X"52",X"BC",X"7D",X"A7",X"20",X"15",X"FD",X"6E",X"02", + X"FD",X"66",X"03",X"CD",X"52",X"BC",X"7D",X"A7",X"20",X"10",X"FD",X"66",X"02",X"FD",X"6E",X"03", + X"18",X"E4",X"FD",X"36",X"04",X"01",X"FD",X"75",X"05",X"C9",X"FD",X"75",X"04",X"FD",X"36",X"05", + X"01",X"C9",X"F5",X"C5",X"7D",X"6C",X"ED",X"44",X"4F",X"26",X"00",X"06",X"09",X"7C",X"81",X"30", + X"01",X"67",X"ED",X"6A",X"10",X"F7",X"CB",X"3C",X"C1",X"F1",X"C9",X"35",X"20",X"03",X"73",X"06", + X"01",X"23",X"BA",X"28",X"06",X"35",X"20",X"03",X"72",X"0E",X"01",X"B8",X"28",X"09",X"DD",X"7E", + X"06",X"FD",X"86",X"00",X"FD",X"77",X"00",X"79",X"A7",X"C8",X"DD",X"7E",X"07",X"FD",X"86",X"01", + X"FD",X"77",X"01",X"C9",X"7E",X"87",X"77",X"23",X"7E",X"87",X"77",X"C9",X"78",X"A7",X"C8",X"DD", + X"7E",X"04",X"87",X"DD",X"77",X"04",X"DD",X"7E",X"05",X"87",X"DD",X"77",X"05",X"10",X"F0",X"C9", + X"2A",X"44",X"4D",X"7D",X"BB",X"20",X"04",X"DD",X"36",X"04",X"00",X"7C",X"BA",X"C0",X"DD",X"36", + X"05",X"00",X"C9",X"21",X"28",X"4F",X"06",X"04",X"7E",X"23",X"B6",X"10",X"FC",X"A7",X"C0",X"21", + X"AC",X"4E",X"CB",X"B6",X"F7",X"02",X"0C",X"00",X"C9",X"3A",X"8E",X"4C",X"E6",X"3F",X"32",X"1D", + X"4F",X"32",X"1E",X"4F",X"C9",X"7D",X"FE",X"11",X"D8",X"FE",X"F0",X"30",X"0A",X"7C",X"FE",X"11", + X"D8",X"FE",X"F0",X"30",X"02",X"AF",X"C9",X"37",X"C9",X"06",X"03",X"7C",X"A7",X"C0",X"7D",X"05", + X"FE",X"40",X"D0",X"05",X"FE",X"10",X"D0",X"FE",X"08",X"C9",X"CD",X"4B",X"B8",X"C9",X"2E",X"00", + X"26",X"1C",X"22",X"0C",X"4C",X"3A",X"3B",X"4D",X"E6",X"02",X"21",X"00",X"FF",X"06",X"00",X"28", + X"05",X"21",X"00",X"01",X"06",X"02",X"CD",X"CE",X"BA",X"2A",X"1F",X"4F",X"22",X"16",X"4D",X"22", + X"46",X"4D",X"2A",X"21",X"4F",X"22",X"0A",X"4D",X"CD",X"D9",X"BC",X"AF",X"32",X"1A",X"4F",X"32", + X"1B",X"4F",X"32",X"1C",X"4F",X"C9",X"3A",X"33",X"4E",X"A7",X"28",X"0E",X"AF",X"32",X"33",X"4E", + X"CD",X"6E",X"0B",X"21",X"EC",X"4E",X"CB",X"8E",X"18",X"B4",X"32",X"CC",X"4E",X"32",X"AC",X"4E", + X"32",X"EB",X"4D",X"32",X"40",X"4F",X"3E",X"08",X"32",X"AC",X"4E",X"21",X"A4",X"0F",X"11",X"0A", + X"4C",X"01",X"04",X"00",X"ED",X"B0",X"CD",X"4B",X"B8",X"C9",X"3A",X"40",X"4F",X"3C",X"47",X"11", + X"C4",X"0F",X"CD",X"45",X"82",X"C0",X"21",X"40",X"4F",X"34",X"7E",X"FE",X"08",X"30",X"14",X"87", + X"87",X"21",X"A4",X"0F",X"85",X"6F",X"3E",X"00",X"8C",X"67",X"11",X"0A",X"4C",X"01",X"04",X"00", + X"ED",X"B0",X"C9",X"36",X"00",X"3E",X"05",X"32",X"B1",X"4D",X"3E",X"1A",X"4F",X"CD",X"B8",X"90", + X"28",X"04",X"3E",X"C0",X"A9",X"4F",X"69",X"26",X"1C",X"22",X"0A",X"4C",X"C3",X"0E",X"BD",X"3E", + X"05",X"32",X"B1",X"4D",X"C9",X"3A",X"1A",X"4F",X"D6",X"09",X"0E",X"00",X"38",X"02",X"0E",X"0F", + X"3A",X"B1",X"4D",X"B1",X"C9",X"2A",X"3B",X"4F",X"22",X"3D",X"4F",X"3E",X"0F",X"32",X"3F",X"4F", + X"0E",X"04",X"CD",X"E5",X"0A",X"0E",X"05",X"CD",X"E5",X"0A",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/Woodpecker.sv b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/Woodpecker.sv new file mode 100644 index 00000000..9a6e01a1 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/Woodpecker.sv @@ -0,0 +1,196 @@ +//============================================================================ +// Arcade: Woodpecker +// +// Version for MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Woodpecker +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Woodpecker;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +//////////////////// CLOCKS /////////////////// + +wire clk_sys, clk_snd; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + + +reg ce_6m; +always @(posedge clk_sys) begin + reg [1:0] div; + + div <= div + 1'd1; + ce_6m <= !div; +end + +/////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [7:0] audio; +assign LED = 1; +//wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(340), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6m), + .ce_pix_actual(ce_6m), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +//wire m_bomb = kbjoy[8]; +//wire m_Serv = kbjoy[9]; +wire m_skip = kbjoy[9]; + + +pacman woodpecker +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .in0(~{2'b00, m_coin, m_skip, m_down,m_right,m_left,m_up}), + .in1(~{1'b0, m_start2, m_start1, m_fire, 4'b0000}), + + .dipsw1(8'b1_1_00_11_01), + .dipsw2(8'b11111111), + + .RESET(status[0] | status[6] | buttons[1]), + .CLK(clk_sys), + .ENA_6(ce_6m) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/build_id.tcl b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_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/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/build_id.v b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/build_id.v new file mode 100644 index 00000000..54801cd2 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171122" +`define BUILD_TIME "110214" diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80sed.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/dac.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/dac.vhd new file mode 100644 index 00000000..db58d70b --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 8 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/dpram.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..fec08f5f --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/dpram.vhd @@ -0,0 +1,75 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity dpram is + generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 + ); + PORT + ( + address_a : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (addr_width_g-1 DOWNTO 0); + clock_a : IN STD_LOGIC := '1'; + clock_b : IN STD_LOGIC ; + data_a : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) := (others => '0'); + enable_a : IN STD_LOGIC := '1'; + enable_b : IN STD_LOGIC := '1'; + wren_a : IN STD_LOGIC := '0'; + wren_b : IN STD_LOGIC := '0'; + q_a : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (data_width_g-1 DOWNTO 0) + ); +END dpram; + + +ARCHITECTURE SYN OF dpram IS +BEGIN + altsyncram_component : altsyncram + GENERIC MAP ( + address_reg_b => "CLOCK1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK1", + intended_device_family => "Cyclone V", + lpm_type => "altsyncram", + numwords_a => 2**addr_width_g, + numwords_b => 2**addr_width_g, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", + widthad_a => addr_width_g, + widthad_b => addr_width_g, + width_a => data_width_g, + width_b => data_width_g, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + PORT MAP ( + address_a => address_a, + address_b => address_b, + clock0 => clock_a, + clock1 => clock_b, + clocken0 => enable_a, + clocken1 => enable_b, + data_a => data_a, + data_b => data_b, + wren_a => wren_a, + wren_b => wren_b, + q_a => q_a, + q_b => q_b + ); + +END SYN; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/hq2x.sv b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_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/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/keyboard.v b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/mist_io.v b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_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/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/osd.v b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_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/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pacman.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pacman.vhd new file mode 100644 index 00000000..24d19966 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pacman.vhd @@ -0,0 +1,469 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- Copyright (c) Sorgelig - 2017 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 006 Refactoring, 8 sprites support by Sorgelig +-- version 005 Papilio release by Jack Gassett +-- version 004 spartan3e release +-- version 003 Jan 2006 release, general tidy up +-- version 002 optional vga scan doubler +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN is + generic( + eight_sprites : boolean := false + ); + port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(1 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + -- + in0 : in std_logic_vector(7 downto 0); + in1 : in std_logic_vector(7 downto 0); + dipsw1 : in std_logic_vector(7 downto 0); + dipsw2 : in std_logic_vector(7 downto 0); + -- + RESET : in std_logic; + CLK : in std_logic; + ENA_6 : in std_logic + ); +end; + +architecture RTL of PACMAN is + + + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal do_hsync : boolean; + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic := '1'; + + -- cpu + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_int_l : std_logic := '1'; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal program_rom_dinl : std_logic_vector(7 downto 0); + signal program_rom_dinh : std_logic_vector(7 downto 0); + signal sync_bus_cs_l : std_logic; + + signal control_reg : std_logic_vector(7 downto 0); + -- + signal sync_bus_db : std_logic_vector(7 downto 0); + signal sync_bus_r_w_l : std_logic; + signal sync_bus_wreq_l : std_logic; + signal sync_bus_stb : std_logic; + + signal cpu_vec_reg : std_logic_vector(7 downto 0); + signal sync_bus_reg : std_logic_vector(7 downto 0); + + signal hp : std_logic_vector ( 4 downto 0); + signal vp : std_logic_vector ( 4 downto 0); + signal ram_cs : std_logic; + signal ram_data : std_logic_vector(7 downto 0); + signal vram_data : std_logic_vector(7 downto 0); + signal sprite_xy_data : std_logic_vector(7 downto 0); + signal vram_addr : std_logic_vector(11 downto 0); + + signal iodec_spr_l : std_logic; + signal iodec_out_l : std_logic; + signal iodec_wdr_l : std_logic; + signal iodec_sn1_l : std_logic; + signal iodec_sn2_l : std_logic; + signal iodec_in0_l : std_logic; + signal iodec_in1_l : std_logic; + signal iodec_dipsw1_l : std_logic; + signal iodec_dipsw2_l : std_logic; + + -- watchdog + signal watchdog_cnt : std_logic_vector(3 downto 0); + signal watchdog_reset_l : std_logic; + + signal sn_we : std_logic; + signal wav1,wav2,wav3 : std_logic_vector(7 downto 0); + + component ym2149 is port + ( + CLK : in std_logic; + CE : in std_logic; + RESET : in std_logic; + BDIR : in std_logic; + BC : in std_logic; + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + CHANNEL_A: out std_logic_vector(7 downto 0); + CHANNEL_B: out std_logic_vector(7 downto 0); + CHANNEL_C: out std_logic_vector(7 downto 0); + + SEL : in std_logic; + MODE : in std_logic; + IOA_in : in std_logic_vector(7 downto 0); + IOA_out : out std_logic_vector(7 downto 0); + + IOB_in : in std_logic_vector(7 downto 0); + IOB_out : out std_logic_vector(7 downto 0) + ); + end component; + +begin + +-- +-- video timing +-- +p_hvcnt : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + if hcnt = "111111111" then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + if do_hsync then + if vcnt = "111111111" then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; +end process; + +vsync <= not vcnt(8); +do_hsync <= (hcnt = "010101111"); -- 0AF + +p_sync : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + + if (hcnt = "010001111") and not eight_sprites then -- 08F + hblank <= '1'; + elsif (hcnt = "011101111") and not eight_sprites then + hblank <= '0'; -- 0EF + elsif (hcnt = "111111111") and eight_sprites then + hblank <= '1'; + elsif (hcnt = "011111111") and eight_sprites then + hblank <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if (vcnt = "111101111") then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; +end process; + +-- +-- cpu +-- +p_irq_req_watchdog : process + variable rising_vblank : boolean; +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + rising_vblank := do_hsync and (vcnt = "111101111"); -- 1EF + + if (control_reg(0) = '0') then + cpu_int_l <= '1'; + elsif rising_vblank then -- 1EF + cpu_int_l <= '0'; + end if; + + -- watchdog 8c + -- note sync reset + if (reset = '1') then + watchdog_cnt <= "1111"; + elsif (iodec_wdr_l = '0') then + watchdog_cnt <= "0000"; + elsif rising_vblank then + watchdog_cnt <= watchdog_cnt + "1"; + end if; + + --watchdog_reset_l <= not reset; + + watchdog_reset_l <= '1'; + if (watchdog_cnt = "1111") then + watchdog_reset_l <= '0'; + end if; + end if; +end process; + +u_cpu : entity work.T80sed +port map +( + RESET_n => watchdog_reset_l, + CLK_n => clk, + CLKEN => hcnt(0) and ena_6, + WAIT_n => sync_bus_wreq_l, + INT_n => cpu_int_l, + NMI_n => '1', + BUSRQ_n => '1', + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => open, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out +); + +-- rom 0x0000 - 0x3FFF +-- syncbus 0x4000 - 0x7FFF +sync_bus_cs_l <= '0' when cpu_mreq_l = '0' and cpu_rfsh_l = '1' and cpu_addr(14) = '1' else '1'; +sync_bus_wreq_l <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '1' and cpu_rd_l = '0' else '1'; +sync_bus_stb <= '0' when sync_bus_cs_l = '0' and hcnt(1) = '0' else '1'; +sync_bus_r_w_l <= '0' when sync_bus_stb = '0' and cpu_rd_l = '1' else '1'; + +-- +-- sync bus custom ic +-- +p_sync_bus_reg : process +begin + wait until rising_edge(clk); + if (ena_6 = '1') then + -- register on sync bus module that is used to store interrupt vector + if (cpu_iorq_l = '0') and (cpu_m1_l = '1') then + cpu_vec_reg <= cpu_data_out; + end if; + + -- read holding reg + if (hcnt(1 downto 0) = "01") then + sync_bus_reg <= cpu_data_in; + end if; + end if; +end process; + + +-- WRITE +-- out_l 0x5000 - 0x503F control space +-- sn1_l 0x5040 - 0x504F sound +-- sn2_l 0x5050 - 0x505F sound +-- spr_l 0x5060 - 0x506F sprite +-- wdr_l 0x50C0 - 0x50FF watchdog reset +iodec_out_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_sn1_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"4" else '1'; +iodec_sn2_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"5" else '1'; +iodec_spr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 4) = X"50"&X"6" else '1'; +iodec_wdr_l <= '0' when sync_bus_r_w_l = '0' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +-- READ +-- in0_l 0x5000 - 0x503F in port 0 +-- in1_l 0x5040 - 0x507F in port 1 +-- dipsw_l 0x5080 - 0x50BF dip switches +iodec_in0_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"00" else '1'; +iodec_in1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"01" else '1'; +iodec_dipsw1_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"10" else '1'; +iodec_dipsw2_l <= '0' when sync_bus_r_w_l = '1' and cpu_addr(15 downto 6) = X"50"&"11" else '1'; + +p_control_reg : process +begin + -- 8 bit addressable latch 7K + -- (made into register) + + -- 0 interrupt ena + -- 1 sound ena + -- 2 not used + -- 3 flip + -- 4 1 player start lamp + -- 5 2 player start lamp + -- 6 coin lockout + -- 7 coin counter + + wait until rising_edge(clk); + if (ena_6 = '1') then + if (watchdog_reset_l = '0') then + control_reg <= (others => '0'); + elsif (iodec_out_l = '0') then + control_reg(to_integer(unsigned(cpu_addr(2 downto 0)))) <= cpu_data_out(0); + end if; + end if; +end process; + +cpu_data_in <= cpu_vec_reg when (cpu_iorq_l = '0') and (cpu_m1_l = '0') else + sync_bus_reg when sync_bus_wreq_l = '0' else + program_rom_dinl when cpu_addr(15 downto 14) = "00" else -- ROM at 0000 - 3fff + program_rom_dinh when cpu_addr(15 downto 14) = "10" else -- ROM at 8000 - bfff + in0 when iodec_in0_l = '0' else + in1 when iodec_in1_l = '0' else + dipsw1 when iodec_dipsw1_l = '0' else + dipsw2 when iodec_dipsw2_l = '0' else + ram_data; + +u_program_rom : entity work.ROM_PGM_0 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinl +); + +u_program_rom1 : entity work.ROM_PGM_1 +port map +( + CLK => clk, + ADDR => cpu_addr(13 downto 0), + DATA => program_rom_dinh +); + +ram_cs <= '1' when cpu_addr(15 downto 12) = X"4" else '0'; + +u_rams : work.dpram generic map (12,8) +port map +( + clock_a => clk, + enable_a => ena_6, + wren_a => not sync_bus_r_w_l and ram_cs, + address_a => cpu_addr(11 downto 0), + data_a => cpu_data_out, -- cpu only source of ram data + q_a => ram_data, + + clock_b => clk, + address_b => vram_addr(11 downto 0), + q_b => vram_data +); + +-- +-- video subsystem +-- + +-- vram addr custom ic +hp <= hcnt(7 downto 3) when control_reg(3) = '0' else not hcnt(7 downto 3); +vp <= vcnt(7 downto 3) when control_reg(3) = '0' else not vcnt(7 downto 3); +vram_addr <= '0' & hcnt(2) & vp & hp when hcnt(8)='1' else + x"FF" & hcnt(6 downto 4) & hcnt(2) when hblank = '1' else + '0' & hcnt(2) & hp(3) & hp(3) & hp(3) & hp(3) & hp(0) & vp; + +sprite_xy_ram : work.dpram generic map (4,8) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not iodec_spr_l, + address_a => cpu_addr(3 downto 0), + data_a => cpu_data_out, + + clock_b => CLK, + address_b => vram_addr(3 downto 0), + q_b => sprite_xy_data +); + +u_video : entity work.PACMAN_VIDEO +port map +( + I_HCNT => hcnt, + I_VCNT => vcnt, + -- + vram_data => vram_data, + sprite_xy => sprite_xy_data, + -- + I_HBLANK => hblank, + I_VBLANK => vblank, + I_FLIP => control_reg(3), + O_HBLANK => O_HBLANK, + -- + O_RED => O_VIDEO_R, + O_GREEN => O_VIDEO_G, + O_BLUE => O_VIDEO_B, + -- + ENA_6 => ena_6, + CLK => clk +); + +O_HSYNC <= hSync; +O_VSYNC <= vSync; +O_VBLANK <= vblank; + +-- +-- +-- audio subsystem +-- +u_audio : entity work.PACMAN_AUDIO +port map ( + I_HCNT => hcnt, + -- + I_AB => cpu_addr(11 downto 0), + I_DB => cpu_data_out, + -- + I_WR1_L => iodec_sn2_l, + I_WR0_L => iodec_sn1_l, + I_SOUND_ON => control_reg(1), + -- + O_AUDIO => O_AUDIO, + ENA_6 => ena_6, + CLK => clk +); + +end RTL; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pacman_audio.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pacman_audio.vhd new file mode 100644 index 00000000..91313469 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pacman_audio.vhd @@ -0,0 +1,209 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 003 Jan 2006 release, general tidy up +-- version 002 added volume multiplier +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +library UNISIM; + +entity PACMAN_AUDIO is + port ( + I_HCNT : in std_logic_vector(8 downto 0); + -- + I_AB : in std_logic_vector(11 downto 0); + I_DB : in std_logic_vector( 7 downto 0); + -- + I_WR1_L : in std_logic; + I_WR0_L : in std_logic; + I_SOUND_ON : in std_logic; + -- + O_AUDIO : out std_logic_vector(7 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_AUDIO is + + signal addr : std_logic_vector(3 downto 0); + signal data : std_logic_vector(3 downto 0); + signal vol_ram_dout : std_logic_vector(3 downto 0); + signal frq_ram_dout : std_logic_vector(3 downto 0); + + signal sum : std_logic_vector(5 downto 0); + signal accum_reg : std_logic_vector(5 downto 0); + signal rom3m_n : std_logic_vector(15 downto 0); + signal rom3m_w : std_logic_vector(3 downto 0); + signal rom3m : std_logic_vector(3 downto 0); + + signal rom1m_addr : std_logic_vector(7 downto 0); + signal rom1m_data : std_logic_vector(7 downto 0); + +begin + p_sel_com : process(I_HCNT, I_AB, I_DB, accum_reg) + begin + if (I_HCNT(1) = '0') then -- 2h, + addr <= I_AB(3 downto 0); + data <= I_DB(3 downto 0); -- removed invert + else + addr <= I_HCNT(5 downto 2); + data <= accum_reg(4 downto 1); + end if; + end process; + + vol_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => not I_WR1_L, + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => vol_ram_dout + ); + + frq_ram : work.dpram generic map (4,4) + port map + ( + clock_a => CLK, + enable_a => ENA_6, + wren_a => rom3m(1), + address_a => addr(3 downto 0), + data_a => data, + + clock_b => CLK, + address_b => addr(3 downto 0), + q_b => frq_ram_dout + ); + + p_control_rom_comb : process(I_HCNT) + begin + rom3m_n <= x"0000"; rom3m_w <= x"0"; -- default assign + case I_HCNT(3 downto 0) is + when x"0" => rom3m_n <= x"0008"; rom3m_w <= x"0"; + when x"1" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"2" => rom3m_n <= x"1111"; rom3m_w <= x"0"; + when x"3" => rom3m_n <= x"2222"; rom3m_w <= x"0"; + when x"4" => rom3m_n <= x"0000"; rom3m_w <= x"0"; + when x"5" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"6" => rom3m_n <= x"1101"; rom3m_w <= x"0"; + when x"7" => rom3m_n <= x"2242"; rom3m_w <= x"0"; + when x"8" => rom3m_n <= x"0080"; rom3m_w <= x"0"; + when x"9" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"A" => rom3m_n <= x"1011"; rom3m_w <= x"0"; + when x"B" => rom3m_n <= x"2422"; rom3m_w <= x"0"; + when x"C" => rom3m_n <= x"0800"; rom3m_w <= x"0"; + when x"D" => rom3m_n <= x"0000"; rom3m_w <= x"2"; + when x"E" => rom3m_n <= x"0111"; rom3m_w <= x"0"; + when x"F" => rom3m_n <= x"4222"; rom3m_w <= x"0"; + when others => null; + end case; + end process; + + p_control_rom_op_comb : process(I_HCNT, I_WR0_L, rom3m_n, rom3m_w) + begin + rom3m <= rom3m_w; + if (I_WR0_L = '1') then + case I_HCNT(5 downto 4) is + when "00" => rom3m <= rom3m_n( 3 downto 0); + when "01" => rom3m <= rom3m_n( 7 downto 4); + when "10" => rom3m <= rom3m_n(11 downto 8); + when "11" => rom3m <= rom3m_n(15 downto 12); + when others => null; + end case; + end if; + end process; + + p_adder : process(vol_ram_dout, frq_ram_dout, accum_reg) + begin + -- 1K 4 bit adder + sum <= ('0' & vol_ram_dout & '1') + ('0' & frq_ram_dout & accum_reg(5)); + end process; + + p_accum_reg : process + begin + -- 1L + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (rom3m(3) = '1') then -- clear + accum_reg <= "000000"; + elsif (rom3m(0) = '1') then -- rising edge clk + accum_reg <= sum(5 downto 1) & accum_reg(4); + end if; + end if; + end process; + + p_rom_1m_addr_comb : process(accum_reg, frq_ram_dout) + begin + rom1m_addr(7 downto 5) <= frq_ram_dout(2 downto 0); + rom1m_addr(4 downto 0) <= accum_reg(4 downto 0); + + end process; + + audio_rom_1m : entity work.PROM1_DST + port map( + CLK => CLK, + ADDR => rom1m_addr, + DATA => rom1m_data + ); + + p_original_output_reg : process + begin + -- 2m used to use async clear + wait until rising_edge(CLK); + if (ENA_6 = '1') then + if (I_SOUND_ON = '0') then + O_AUDIO <= "00000000"; + elsif (rom3m(2) = '1') then + O_AUDIO <= vol_ram_dout(3 downto 0) * rom1m_data(3 downto 0); + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pacman_video.vhd b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pacman_video.vhd new file mode 100644 index 00000000..1552d65b --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pacman_video.vhd @@ -0,0 +1,279 @@ +-- +-- A simulation model of Pacman hardware +-- Copyright (c) MikeJ - January 2006 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email pacman@fpgaarcade.com +-- +-- Revision list +-- +-- version 004 Refactoring, 8 sprite support by Sorgelig +-- version 003 Jan 2006 release, general tidy up +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity PACMAN_VIDEO is + generic( + alt_transp : boolean := false + ); + port ( + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + -- + vram_data : in std_logic_vector(7 downto 0); + sprite_xy : in std_logic_vector(7 downto 0); + -- + I_HBLANK : in std_logic; + I_VBLANK : in std_logic; + I_FLIP : in std_logic; + O_HBLANK : out std_logic; + -- + O_RED : out std_logic_vector(2 downto 0); + O_GREEN : out std_logic_vector(2 downto 0); + O_BLUE : out std_logic_vector(1 downto 0); + ENA_6 : in std_logic; + CLK : in std_logic + ); +end; + +architecture RTL of PACMAN_VIDEO is + + signal dr : std_logic_vector(7 downto 0); + + signal char_reg : std_logic_vector(7 downto 0); + signal char_sum_reg : std_logic_vector(3 downto 0); + signal char_match_reg : std_logic; + signal char_hblank_reg : std_logic; + signal char_hblank_reg_t1 : std_logic; + signal sprite_data : std_logic_vector(7 downto 0); + + signal xflip : std_logic; + signal yflip : std_logic; + signal obj_on : std_logic; + signal obj_on2 : std_logic; + + signal ca : std_logic_vector(12 downto 0); + signal char_rom_5ef_buf : std_logic_vector(7 downto 0); + + signal shift_regl : std_logic_vector(3 downto 0); + signal shift_regu : std_logic_vector(3 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_op_t1 : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + + signal vout_obj_on : std_logic; + signal vout_obj_on_t1 : std_logic; + signal vout_yflip : std_logic; + signal vout_hblank : std_logic; + signal vout_hblank_t1 : std_logic; + signal vout_db : std_logic_vector(4 downto 0); + + signal sprite_ram_ip : std_logic_vector(5 downto 0); + signal sprite_ram_op : std_logic_vector(5 downto 0); + signal sprite_addr : std_logic_vector(7 downto 0); + signal sprite_addr_t1 : std_logic_vector(7 downto 0); + + signal lut_4a : std_logic_vector(7 downto 0); + signal lut_4a_t1 : std_logic_vector(7 downto 0); + signal sprite_ram_reg : std_logic_vector(5 downto 0); + + signal video_op_sel : std_logic; + signal final_col : std_logic_vector(3 downto 0); + +begin + +dr <= not sprite_xy when I_HBLANK = '1' else "11111111"; -- pull ups on board + +p_char_regs : process + variable sum : std_logic_vector(8 downto 0); + variable match : std_logic; +begin + wait until rising_edge (CLK); + if (I_HCNT(2 downto 0) = "011") and (ENA_6 = '1') then -- rising 4h + + -- 1f, 2f + sum := (I_VCNT(7 downto 0) & '1') + (dr & not I_HBLANK); + + -- 3e + match := '0'; + + if (sum(8 downto 5) = "1111") then + match := '1'; + end if; + + -- 1h + char_sum_reg <= sum(4 downto 1); + char_match_reg <= match; + char_hblank_reg <= I_HBLANK; + + -- 4d + sprite_data <= vram_data; -- character reg + end if; +end process; + +xflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(1); +yflip <= I_FLIP when char_hblank_reg = '0' else sprite_data(0); + +obj_on <= char_match_reg or I_HCNT(8); -- 256h not 256h_l + +ca(12) <= char_hblank_reg; +ca(11 downto 6) <= sprite_data(7 downto 2); +ca(5) <= sprite_data(1) when char_hblank_reg = '0' else char_sum_reg(3) xor xflip; +ca(4) <= sprite_data(0) when char_hblank_reg = '0' else I_HCNT(3); +ca(3) <= I_HCNT(2) xor yflip; +ca(2) <= char_sum_reg(2) xor xflip; +ca(1) <= char_sum_reg(1) xor xflip; +ca(0) <= char_sum_reg(0) xor xflip; + +-- char roms +char_rom_5ef : entity work.GFX1 +port map +( + CLK => CLK, + ADDR => ca, + DATA => char_rom_5ef_buf +); + +p_char_shift : process +begin + -- 4 bit shift req + wait until rising_edge (CLK); + if (ENA_6 = '1') then + case shift_sel is + when "00" => null; + + when "01" => shift_regu <= '0' & shift_regu(3 downto 1); + shift_regl <= '0' & shift_regl(3 downto 1); + + when "10" => shift_regu <= shift_regu(2 downto 0) & '0'; + shift_regl <= shift_regl(2 downto 0) & '0'; + + when "11" => shift_regu <= char_rom_5ef_buf(7 downto 4); -- load + shift_regl <= char_rom_5ef_buf(3 downto 0); + when others => null; + end case; + end if; +end process; + +shift_sel(0) <= I_HCNT(0) and I_HCNT(1) when vout_yflip = '0' else '1'; +shift_sel(1) <= '1' when vout_yflip = '0' else I_HCNT(0) and I_HCNT(1); +shift_op(0) <= shift_regl(3) when vout_yflip = '0' else shift_regl(0); +shift_op(1) <= shift_regu(3) when vout_yflip = '0' else shift_regu(0); + +p_video_out_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + if (I_HCNT(2 downto 0) = "111") then + vout_obj_on <= obj_on; + vout_yflip <= yflip; + vout_hblank <= I_HBLANK; + vout_db(4 downto 0) <= vram_data(4 downto 0); -- colour reg + end if; + + if I_HCNT(3 downto 0) = "0111" and (vout_hblank='1' or I_HBLANK='1' or vout_obj_on='0') then + sprite_addr <= dr; + else + sprite_addr <= sprite_addr + "1"; + end if; + end if; +end process; + +col_rom_4a : entity work.PROM4_DST +port map +( + ADDR(7) => '0', + ADDR(6 downto 2) => vout_db(4 downto 0), + ADDR(1 downto 0) => shift_op(1 downto 0), + DATA => lut_4a +); + +u_sprite_ram : work.dpram generic map (8,6) +port map +( + clock_a => CLK, + enable_a => ENA_6, + wren_a => vout_obj_on_t1, + address_a => sprite_addr_t1, + data_a => sprite_ram_ip, + + clock_b => CLK, + enable_b => ENA_6, + address_b => sprite_addr, + q_b => sprite_ram_op +); + +sprite_ram_reg <= sprite_ram_op when vout_obj_on_t1 = '1' else "000000"; +video_op_sel <= '0' when alt_transp and (sprite_ram_reg(1 downto 0) = "00") else + '0' when not alt_transp and (sprite_ram_reg(5 downto 2) = "0000") else + '1'; + +p_sprite_ram_ip_reg : process +begin + wait until rising_edge (CLK); + if (ENA_6 = '1') then + sprite_addr_t1 <= sprite_addr; + vout_obj_on_t1 <= vout_obj_on; + vout_hblank_t1 <= vout_hblank; + lut_4a_t1 <= lut_4a; + shift_op_t1 <= shift_op; + end if; +end process; + +sprite_ram_ip <= (others => '0') when vout_hblank_t1 = '0' else + sprite_ram_reg when video_op_sel = '1' else + lut_4a_t1(3 downto 0) & shift_op_t1; + +final_col <= (others => '0') when (vout_hblank = '1') or (I_VBLANK = '1') else + sprite_ram_reg(5 downto 2) when video_op_sel = '1' else + lut_4a(3 downto 0); + +-- assign video outputs from color LUT PROM +col_rom_7f : entity work.PROM7_DST +port map +( + CLK => CLK, + ADDR(3 downto 0) => final_col, + DATA(2 downto 0) => O_RED, + DATA(5 downto 3) => O_GREEN, + DATA(7 downto 6) => O_BLUE +); + +O_HBLANK <= vout_hblank and vout_hblank_t1; + +end architecture; diff --git a/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pll.qip b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_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/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pll.v b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pll.v new file mode 100644 index 00000000..60297687 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 9, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 8, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "9" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "8" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "9" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/scandoubler.v b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/video_mixer.sv b/Arcade/Pacman Hardware/Woodpecker_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Pacman Hardware/Woodpecker_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/Arcade/README.txt b/Arcade/README.txt new file mode 100644 index 00000000..a5461c9f --- /dev/null +++ b/Arcade/README.txt @@ -0,0 +1,79 @@ +Arcade Cores + +#Custom Hardware + Computer Space + Galaga + Phoenix + Pooyan + River Raid(Clone) + Time Pilot + +#Data East Cassette + Burnin Rubber + Burger Time + +#Galaxian Hardware + Azurian Attack + Black Hole + Catacomb + Galaxian + Moon Cresta + Mr. Do´s Nightmare + Omega + Orbitron + Pisces + War of Bugs + +#Irem M52 Hardware + Moon Patrol + +#Ladybug Hardware + Cosmic Avenger + Dorodon + Lady Bug + Snapjack + +#Konami Classic + Pooyan + Time Pilot + +#Midway 8080 Hardware + Galaxy Wars + Lunar Rescue + Space Attack + Space Invaders + Space Invaders II(Deluxe) + Space Laser + Super Earth Invasion + +#Pacman Hardware + Ali Baba and 40 Thieves + Crush Roller + Dream Shopper + Eeekk + Eyes + Gorkans + Lizard Wizard + Maniac Miner + Mr. TNT + Ms. Pacman + Pacman + Pacman Club + Pacman Plus + Pengo + Ponpoko + Super Glob + Van Van Car + Woodpecker + +#Scramble Hardware + Amidar + Frogger + Scramble + The End + + + + + + diff --git a/Arcade/Scramble Hardware/Amidar_MiST/Amidar.qpf b/Arcade/Scramble Hardware/Amidar_MiST/Amidar.qpf new file mode 100644 index 00000000..45200a41 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/Amidar.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Amidar" diff --git a/Arcade/Scramble Hardware/Amidar_MiST/Amidar.qsf b/Arcade/Scramble Hardware/Amidar_MiST/Amidar.qsf new file mode 100644 index 00000000..a61f9bf0 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/Amidar.qsf @@ -0,0 +1,170 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 05:08:48 November 15, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Amidar_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +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 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 Amidar + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 + +# Assembler Assignments +# ===================== +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)" + +# ---------------------- +# start ENTITY(Scramble) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Scramble) +# -------------------- +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.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 SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_SND_2.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_SND_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_SND_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_OBJ_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_OBJ_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_LUT.vhd +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/MULT18X18.vhd +set_global_assignment -name VHDL_FILE rtl/i82c55.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VERILOG_FILE rtl/build_id.v +set_global_assignment -name VHDL_FILE rtl/YM2149_linmix_sep.vhd +set_global_assignment -name VHDL_FILE rtl/scramble_video.vhd +set_global_assignment -name VHDL_FILE rtl/scramble_top.vhd +set_global_assignment -name VHDL_FILE rtl/scramble_audio.vhd +set_global_assignment -name VHDL_FILE rtl/scramble.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Amidar.sv +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +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 USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +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" +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 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Scramble Hardware/Amidar_MiST/Amidar.srf b/Arcade/Scramble Hardware/Amidar_MiST/Amidar.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/Amidar.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Scramble Hardware/Amidar_MiST/README.txt b/Arcade/Scramble Hardware/Amidar_MiST/README.txt new file mode 100644 index 00000000..df8b7083 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/README.txt @@ -0,0 +1,23 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Amidar port to MiST by Gehstock +-- 10 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Scramble Hardware/Amidar_MiST/Release/Amidar.rbf b/Arcade/Scramble Hardware/Amidar_MiST/Release/Amidar.rbf new file mode 100644 index 00000000..c3501900 Binary files /dev/null and b/Arcade/Scramble Hardware/Amidar_MiST/Release/Amidar.rbf differ diff --git a/Arcade/Scramble Hardware/Amidar_MiST/clean.bat b/Arcade/Scramble Hardware/Amidar_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_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/Arcade/Scramble Hardware/Amidar_MiST/rtl/Amidar.sv b/Arcade/Scramble Hardware/Amidar_MiST/rtl/Amidar.sv new file mode 100644 index 00000000..40a982bd --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/Amidar.sv @@ -0,0 +1,203 @@ +//============================================================================ +// Arcade: Amidar +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Amidar +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Amidar;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +//////////////////// CLOCKS /////////////////// + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6p, ce_6n, ce_12, ce_1p79; +always @(negedge clk_sys) begin + reg [1:0] div = 0; + reg [3:0] div179 = 0; + + div <= div + 1'd1; + + ce_12 <= div[0]; + ce_6p <= div[0] & ~div[1]; + ce_6n <= div[0] & div[1]; + + ce_1p79 <= 0; + div179 <= div179 - 1'd1; + if(!div179) begin + div179 <= 13; + ce_1p79 <= 1; + end +end + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [9:0] audio; +wire hsync,vsync; +assign LED = 1; +wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [3:0] r,b,g; + +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6p), + .ce_pix_actual(ce_6p), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r[1:0]}), + .G({g,g[1:0]}), + .B({b,b[1:0]}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +wire m_bomb = kbjoy[8]; +wire m_Serv = kbjoy[9]; + +scramble_top scramble +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .button_in1(~{m_start1, m_fire, m_bomb, m_left, m_right, m_up, m_down}), + .button_in2(~{m_start2, m_fire, m_bomb, m_left, m_right, m_up, m_down}), + .Coin_in(~m_coin), + .Service_in(~m_Serv), + .RESET(status[0] | status[6] | buttons[1]), + .clk(clk_sys), + .ena_12(ce_12), + .ena_6(ce_6p), + .ena_6b(ce_6n), + .ena_1_79(ce_1p79) +); +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/MULT18X18.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/MULT18X18.vhd new file mode 100644 index 00000000..32535505 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/MULT18X18.vhd @@ -0,0 +1,53 @@ + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY lpm; +USE lpm.all; + +ENTITY MULT18X18 IS + PORT + ( + A : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + B : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + P : OUT STD_LOGIC_VECTOR (35 DOWNTO 0) + ); +END MULT18X18; + + +ARCHITECTURE SYN OF mult18x18 IS + + COMPONENT lpm_mult + GENERIC ( + lpm_hint : STRING; + lpm_representation : STRING; + lpm_type : STRING; + lpm_widtha : NATURAL; + lpm_widthb : NATURAL; + lpm_widthp : NATURAL + ); + PORT ( + dataa : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + datab : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + result : OUT STD_LOGIC_VECTOR (35 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + lpm_mult_component : lpm_mult + GENERIC MAP ( + lpm_hint => "MAXIMIZE_SPEED=5", + lpm_representation => "SIGNED", + lpm_type => "LPM_MULT", + lpm_widtha => 18, + lpm_widthb => 18, + lpm_widthp => 36 + ) + PORT MAP ( + dataa => A, + datab => B, + result => P + ); + +END SYN; + diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_LUT.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_LUT.vhd new file mode 100644 index 00000000..f356cfca --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_LUT.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_LUT is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_LUT is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"C0",X"B6",X"00",X"38",X"C5",X"67",X"00",X"30",X"07",X"3F",X"00",X"07",X"30",X"3F", + X"00",X"3F",X"30",X"07",X"00",X"38",X"67",X"3F",X"00",X"FF",X"07",X"DF",X"00",X"F8",X"07",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_OBJ_0.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_OBJ_0.vhd new file mode 100644 index 00000000..698a76f7 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_OBJ_0.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_OBJ_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_OBJ_0 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"02",X"02",X"FE",X"FE",X"42",X"02",X"00",X"00", + X"62",X"F2",X"BA",X"9A",X"9E",X"CE",X"46",X"00",X"8C",X"DE",X"F2",X"B2",X"92",X"86",X"04",X"00", + X"08",X"FE",X"FE",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BE",X"A2",X"A2",X"A2",X"E6",X"E4",X"00", + X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"C0",X"E0",X"B0",X"9E",X"8E",X"C0",X"C0",X"00", + X"0C",X"6E",X"9A",X"92",X"B2",X"F2",X"6C",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00", + X"3C",X"42",X"81",X"A5",X"A5",X"99",X"42",X"3C",X"00",X"00",X"C0",X"F0",X"FB",X"03",X"00",X"00", + X"0C",X"1E",X"1E",X"1E",X"3C",X"3C",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"06",X"06",X"00",X"00",X"00",X"00",X"00",X"30",X"78",X"7C",X"3E",X"7C",X"78",X"30", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00", + X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00",X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00", + X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00",X"9E",X"9E",X"92",X"92",X"C6",X"7C",X"38",X"00", + X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00", + X"FC",X"FE",X"02",X"02",X"02",X"06",X"04",X"00",X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00", + X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00", + X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00", + X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00",X"00",X"00",X"81",X"C3",X"7E",X"3C",X"00",X"00", + X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00",X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00", + X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00", + X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0",X"00",X"FE",X"FE",X"1C",X"38",X"1C",X"FE",X"FE",X"00", + X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"E0",X"F0",X"1E",X"1E",X"F0",X"E0",X"00",X"00", + X"10",X"12",X"1C",X"78",X"1C",X"12",X"10",X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"00", + X"00",X"1D",X"3F",X"7B",X"71",X"73",X"63",X"37",X"00",X"0C",X"08",X"00",X"32",X"7D",X"FD",X"FC", + X"7D",X"39",X"01",X"31",X"10",X"00",X"00",X"00",X"F8",X"F8",X"F0",X"F4",X"E8",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF",X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF", + X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF",X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF", + X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF",X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF", + X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07", + X"03",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"00",X"00",X"00",X"00",X"00",X"03",X"87",X"87", + X"03",X"00",X"00",X"00",X"00",X"03",X"87",X"87",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"83",X"83",X"03",X"03",X"03",X"03",X"03",X"03",X"83",X"83", + X"03",X"03",X"03",X"03",X"03",X"03",X"07",X"07",X"03",X"03",X"03",X"03",X"03",X"03",X"07",X"07", + X"03",X"03",X"03",X"03",X"03",X"03",X"87",X"87",X"03",X"03",X"03",X"03",X"03",X"03",X"87",X"87", + X"03",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"03",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"03",X"FF",X"FF", + X"03",X"00",X"00",X"00",X"00",X"03",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"03",X"FF",X"FF", + X"03",X"00",X"00",X"00",X"00",X"03",X"FF",X"FF",X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF", + X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF",X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF", + X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF",X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF", + X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF",X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF",X"1C",X"7E",X"DA",X"FA",X"DA",X"7E",X"1C",X"00", + X"00",X"0F",X"08",X"08",X"0F",X"00",X"0F",X"08",X"00",X"E0",X"20",X"20",X"E0",X"00",X"E0",X"20", + X"08",X"0F",X"00",X"0F",X"09",X"08",X"0C",X"00",X"20",X"E0",X"00",X"20",X"A0",X"A0",X"E0",X"00", + X"00",X"0F",X"08",X"08",X"0F",X"00",X"0F",X"08",X"00",X"E0",X"20",X"20",X"E0",X"00",X"E0",X"20", + X"08",X"0F",X"00",X"00",X"03",X"00",X"0F",X"00",X"20",X"E0",X"00",X"80",X"E0",X"80",X"80",X"00", + X"00",X"0F",X"08",X"08",X"0F",X"00",X"0F",X"08",X"00",X"E0",X"20",X"20",X"E0",X"00",X"E0",X"20", + X"08",X"0F",X"00",X"0F",X"09",X"09",X"0F",X"00",X"20",X"E0",X"00",X"E0",X"20",X"20",X"E0",X"00", + X"0F",X"08",X"08",X"0F",X"00",X"0F",X"08",X"08",X"E0",X"20",X"20",X"E0",X"00",X"E0",X"20",X"20", + X"0F",X"00",X"09",X"09",X"09",X"0F",X"00",X"0F",X"E0",X"00",X"E0",X"20",X"20",X"E0",X"00",X"E0", + X"00",X"0F",X"08",X"0F",X"00",X"0F",X"08",X"0F",X"00",X"E0",X"60",X"E0",X"00",X"E0",X"60",X"E0", + X"00",X"0F",X"0C",X"0C",X"00",X"0F",X"0D",X"0C",X"00",X"20",X"A0",X"E0",X"00",X"E0",X"20",X"20", + X"00",X"03",X"1F",X"31",X"20",X"23",X"66",X"74",X"00",X"80",X"D0",X"F0",X"80",X"80",X"B8",X"FC", + X"7F",X"31",X"03",X"33",X"13",X"01",X"00",X"00",X"FC",X"FD",X"FD",X"F2",X"F0",X"E0",X"00",X"E0", + X"00",X"00",X"04",X"18",X"1C",X"3E",X"77",X"E3",X"00",X"00",X"38",X"08",X"78",X"F8",X"F8",X"F8", + X"E3",X"E3",X"77",X"3E",X"1C",X"18",X"04",X"00",X"E8",X"F8",X"F8",X"F8",X"78",X"08",X"38",X"00", + X"00",X"00",X"18",X"34",X"7E",X"7F",X"7F",X"7F",X"00",X"00",X"00",X"00",X"80",X"40",X"80",X"B8", + X"3C",X"1F",X"01",X"01",X"01",X"00",X"00",X"00",X"FC",X"7D",X"FD",X"F9",X"F8",X"E0",X"00",X"1C", + X"03",X"09",X"1F",X"1F",X"1F",X"1F",X"0F",X"1D",X"80",X"C0",X"40",X"C0",X"C0",X"E0",X"80",X"40", + X"6D",X"5D",X"9F",X"9F",X"5F",X"4F",X"60",X"03",X"80",X"C0",X"C0",X"C0",X"C0",X"80",X"00",X"80", + X"00",X"11",X"27",X"00",X"16",X"0F",X"03",X"03",X"00",X"C0",X"F0",X"F8",X"3C",X"9C",X"CC",X"CC", + X"01",X"01",X"01",X"03",X"03",X"00",X"00",X"00",X"C8",X"C0",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"1E",X"1E",X"3B",X"71",X"00",X"00",X"20",X"00",X"38",X"7E",X"7E",X"FE", + X"71",X"71",X"3B",X"3E",X"1E",X"0C",X"00",X"00",X"F4",X"FF",X"7F",X"7D",X"38",X"00",X"80",X"00", + X"00",X"00",X"00",X"0C",X"1E",X"3E",X"39",X"70",X"00",X"00",X"80",X"00",X"38",X"7D",X"7F",X"FF", + X"70",X"70",X"39",X"3E",X"1E",X"0C",X"00",X"00",X"F4",X"FE",X"7E",X"7E",X"38",X"00",X"20",X"00", + X"00",X"0F",X"09",X"01",X"11",X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC", + X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0F",X"09",X"0D",X"0D",X"0D",X"0D",X"0D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC", + X"0C",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"78",X"78",X"78",X"01",X"00",X"06",X"3E",X"76",X"00",X"00",X"1C",X"1C",X"8C",X"04",X"A4",X"B4", + X"7E",X"76",X"3E",X"06",X"00",X"03",X"F0",X"00",X"B0",X"B4",X"A4",X"04",X"8C",X"1C",X"00",X"00", + X"06",X"07",X"07",X"01",X"00",X"0C",X"7C",X"EC",X"00",X"80",X"80",X"80",X"2C",X"46",X"4E",X"D8", + X"FC",X"EC",X"7C",X"0C",X"00",X"3C",X"00",X"00",X"C0",X"D8",X"4E",X"46",X"2C",X"00",X"00",X"00", + X"00",X"00",X"38",X"7C",X"7B",X"7F",X"2E",X"1D",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"7C", + X"1B",X"F4",X"01",X"00",X"0D",X"0F",X"06",X"00",X"40",X"80",X"20",X"B6",X"9E",X"0C",X"00",X"00", + X"00",X"00",X"38",X"7C",X"7B",X"7F",X"2E",X"1C",X"00",X"00",X"00",X"40",X"60",X"40",X"58",X"5C", + X"18",X"F9",X"01",X"00",X"00",X"00",X"00",X"00",X"8C",X"98",X"B0",X"40",X"40",X"60",X"E0",X"E0", + X"00",X"0F",X"0F",X"0F",X"00",X"06",X"3E",X"76",X"00",X"00",X"00",X"00",X"40",X"26",X"2E",X"6A", + X"7E",X"76",X"3E",X"06",X"00",X"3C",X"00",X"00",X"60",X"6D",X"27",X"23",X"20",X"20",X"00",X"00", + X"03",X"03",X"03",X"00",X"00",X"06",X"3E",X"76",X"00",X"C0",X"C0",X"C0",X"10",X"13",X"27",X"6D", + X"7E",X"76",X"3E",X"06",X"00",X"F0",X"00",X"00",X"60",X"6A",X"2E",X"26",X"40",X"80",X"00",X"00", + X"00",X"0F",X"0F",X"0F",X"00",X"0C",X"7D",X"ED",X"00",X"00",X"00",X"00",X"40",X"26",X"2E",X"6A", + X"FD",X"ED",X"7D",X"0C",X"00",X"3C",X"00",X"00",X"60",X"6D",X"27",X"23",X"20",X"20",X"00",X"00", + X"03",X"03",X"03",X"00",X"00",X"0C",X"7D",X"ED",X"00",X"C0",X"C0",X"C0",X"10",X"13",X"27",X"6D", + X"FD",X"ED",X"7D",X"0C",X"00",X"F0",X"00",X"00",X"60",X"6A",X"2E",X"26",X"40",X"80",X"00",X"00", + X"00",X"00",X"01",X"03",X"03",X"1F",X"7E",X"D6",X"00",X"C0",X"E0",X"F0",X"30",X"34",X"9C",X"1C", + X"FE",X"D6",X"7E",X"1F",X"03",X"01",X"00",X"00",X"00",X"18",X"98",X"28",X"C0",X"EC",X"FC",X"30", + X"00",X"00",X"00",X"03",X"03",X"1F",X"7A",X"DA",X"00",X"30",X"FC",X"EC",X"C0",X"28",X"98",X"18", + X"FA",X"DA",X"7A",X"1F",X"03",X"03",X"01",X"00",X"00",X"1C",X"9C",X"34",X"30",X"F0",X"E0",X"C0", + X"00",X"00",X"01",X"03",X"03",X"07",X"07",X"0F",X"00",X"00",X"E0",X"FC",X"FC",X"94",X"10",X"00", + X"1F",X"7F",X"FF",X"F7",X"DE",X"46",X"02",X"00",X"18",X"FC",X"F0",X"DC",X"0C",X"04",X"00",X"00", + X"00",X"00",X"01",X"03",X"03",X"07",X"07",X"0F",X"00",X"38",X"F8",X"E8",X"F0",X"FC",X"1C",X"04", + X"1F",X"7F",X"FF",X"FF",X"DB",X"4A",X"02",X"00",X"00",X"3C",X"BC",X"84",X"C0",X"E0",X"70",X"18", + X"00",X"00",X"01",X"03",X"03",X"07",X"07",X"0F",X"00",X"00",X"E0",X"FC",X"FC",X"F4",X"90",X"00", + X"1F",X"7F",X"FF",X"F6",X"DE",X"46",X"02",X"00",X"D8",X"FC",X"F0",X"7C",X"0C",X"04",X"00",X"00", + X"00",X"00",X"01",X"03",X"03",X"07",X"07",X"0F",X"00",X"38",X"F8",X"E8",X"F0",X"FC",X"9C",X"04", + X"1F",X"7F",X"FF",X"FF",X"DB",X"4A",X"02",X"00",X"C0",X"FC",X"FC",X"04",X"C0",X"E0",X"70",X"18", + X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"F0",X"0C",X"04",X"04",X"FC", + X"03",X"03",X"03",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"3F",X"3F",X"00",X"01",X"00",X"00",X"00",X"00",X"FC",X"F4",X"04",X"FC", + X"03",X"03",X"03",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"01",X"00",X"39",X"3F",X"47",X"C6",X"8C",X"AF",X"AD", + X"00",X"01",X"03",X"01",X"00",X"00",X"00",X"00",X"2F",X"AD",X"AF",X"8C",X"C0",X"40",X"01",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"07",X"06",X"10",X"16",X"1F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"1F",X"16",X"10",X"02",X"0E",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"CC",X"10",X"3B",X"3F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"3F",X"3F",X"3B",X"10",X"CC",X"C0",X"80", + X"00",X"00",X"00",X"00",X"39",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"C0",X"F0",X"F8",X"FC", + X"5B",X"0B",X"03",X"01",X"03",X"03",X"01",X"00",X"FE",X"FF",X"BF",X"BC",X"1F",X"1F",X"0D",X"00", + X"00",X"70",X"78",X"FC",X"BE",X"3F",X"3F",X"2F",X"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"F8", + X"0F",X"1B",X"2E",X"1C",X"18",X"30",X"00",X"00",X"FC",X"FC",X"7C",X"1E",X"0F",X"6F",X"61",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"1C",X"3E",X"0E",X"1F",X"3F",X"7F",X"3F",X"FF", + X"0B",X"00",X"00",X"00",X"03",X"03",X"03",X"00",X"FF",X"1F",X"0F",X"0F",X"9E",X"FE",X"FE",X"3C", + X"00",X"0F",X"08",X"0F",X"00",X"0F",X"08",X"0F",X"00",X"E0",X"60",X"E0",X"00",X"E0",X"60",X"E0", + X"00",X"0F",X"08",X"0F",X"00",X"0D",X"0D",X"0F",X"00",X"E0",X"60",X"E0",X"00",X"E0",X"20",X"20", + X"00",X"1C",X"14",X"22",X"21",X"10",X"10",X"08",X"00",X"00",X"00",X"00",X"00",X"8C",X"5F",X"33", + X"08",X"10",X"10",X"20",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"08",X"14",X"24",X"45",X"82",X"40",X"20",X"00",X"00",X"00",X"80",X"40",X"20",X"18",X"18", + X"20",X"40",X"80",X"40",X"20",X"00",X"00",X"00",X"30",X"18",X"0C",X"00",X"00",X"00",X"00",X"00", + X"04",X"0A",X"11",X"00",X"00",X"00",X"00",X"00",X"20",X"50",X"88",X"04",X"02",X"1C",X"20",X"10", + X"00",X"00",X"01",X"03",X"06",X"04",X"00",X"00",X"08",X"10",X"20",X"C0",X"C0",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_OBJ_1.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_OBJ_1.vhd new file mode 100644 index 00000000..eedda2b1 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_OBJ_1.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_OBJ_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_OBJ_1 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"4C",X"56",X"5A",X"BA",X"BC",X"BC",X"18",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"12",X"1C",X"78",X"1C",X"12",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"1F",X"3B",X"7F",X"7B",X"FC",X"D5",X"FB",X"00",X"00",X"00",X"18",X"30",X"7C",X"FE",X"FE", + X"7D",X"39",X"01",X"0F",X"00",X"00",X"00",X"00",X"F8",X"F8",X"F0",X"F8",X"F0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03", + 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"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03", + 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"03",X"03",X"03",X"03",X"03",X"03",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03", + 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"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07", + X"03",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"00",X"00",X"00",X"00",X"00",X"03",X"87",X"87", + X"03",X"00",X"00",X"00",X"00",X"03",X"87",X"87",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"03",X"00",X"00",X"00",X"00",X"03",X"07",X"07", + X"00",X"00",X"00",X"00",X"00",X"03",X"87",X"87",X"03",X"00",X"00",X"00",X"00",X"03",X"87",X"87", + X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07", + X"03",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"00",X"00",X"00",X"00",X"00",X"03",X"87",X"87", + X"03",X"00",X"00",X"00",X"00",X"03",X"87",X"87",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"03",X"00",X"00",X"00",X"00",X"03",X"07",X"07", + X"00",X"00",X"00",X"00",X"00",X"03",X"87",X"87",X"03",X"00",X"00",X"00",X"00",X"03",X"87",X"87", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"00",X"00",X"1C",X"72",X"94",X"84",X"94",X"72",X"1C",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"06",X"0F",X"1B",X"3F",X"7B",X"D4",X"F9",X"7B",X"00",X"80",X"C0",X"C0",X"90",X"90",X"38",X"7C", + X"7C",X"31",X"03",X"0F",X"03",X"01",X"00",X"00",X"FC",X"FC",X"FE",X"F4",X"F0",X"E0",X"60",X"00", + X"00",X"00",X"00",X"5A",X"7D",X"7E",X"5D",X"F4",X"00",X"00",X"00",X"08",X"F8",X"F8",X"F8",X"F8", + X"FC",X"F4",X"5D",X"7E",X"7D",X"5A",X"00",X"00",X"F8",X"F8",X"F8",X"F8",X"F8",X"08",X"00",X"00", + X"00",X"80",X"D9",X"FF",X"7F",X"7E",X"76",X"7B",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"B8", + X"3F",X"1F",X"01",X"01",X"01",X"00",X"00",X"00",X"FC",X"FC",X"FC",X"FE",X"F8",X"F0",X"10",X"00", + X"1F",X"0F",X"1F",X"1F",X"1F",X"1F",X"0D",X"07",X"80",X"C0",X"70",X"F0",X"F0",X"00",X"00",X"00", + X"1F",X"3F",X"5F",X"5F",X"3F",X"2F",X"03",X"20",X"80",X"C0",X"C0",X"C0",X"C0",X"80",X"00",X"00", + X"00",X"09",X"1F",X"70",X"34",X"0E",X"03",X"03",X"00",X"80",X"C0",X"E0",X"38",X"18",X"0C",X"8C", + X"01",X"01",X"01",X"03",X"07",X"02",X"00",X"00",X"8C",X"88",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"3E",X"7E",X"6F",X"7A",X"00",X"00",X"00",X"20",X"78",X"7C",X"7C",X"FC", + X"7E",X"7A",X"2F",X"FE",X"7E",X"0C",X"00",X"00",X"FC",X"FE",X"7E",X"7C",X"78",X"80",X"00",X"00", + X"00",X"00",X"00",X"0C",X"7E",X"FE",X"2F",X"79",X"00",X"00",X"00",X"80",X"78",X"7C",X"7E",X"FE", + X"7F",X"79",X"2F",X"FE",X"7E",X"0C",X"00",X"00",X"FC",X"FC",X"7C",X"7C",X"78",X"20",X"00",X"00", + X"00",X"0F",X"09",X"1D",X"0D",X"0D",X"0D",X"0D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0", + X"0C",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"0F",X"09",X"11",X"11",X"11",X"11",X"11",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0", + X"10",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"78",X"78",X"07",X"00",X"00",X"06",X"07",X"03",X"00",X"00",X"80",X"00",X"00",X"C0",X"40",X"48", + X"01",X"03",X"07",X"06",X"00",X"00",X"FF",X"00",X"4C",X"48",X"40",X"C0",X"00",X"00",X"FC",X"00", + X"06",X"07",X"01",X"00",X"00",X"0D",X"0F",X"07",X"00",X"80",X"80",X"60",X"10",X"00",X"00",X"20", + X"03",X"07",X"0F",X"0D",X"00",X"3F",X"00",X"00",X"30",X"20",X"00",X"00",X"00",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"03",X"03",X"1E",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"80", + X"1D",X"0B",X"04",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"C0",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"03",X"03",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"1F",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"40",X"A0",X"00",X"00",X"00",X"00", + X"00",X"0F",X"0F",X"00",X"00",X"06",X"07",X"03",X"00",X"00",X"00",X"E0",X"00",X"80",X"80",X"90", + X"01",X"03",X"07",X"06",X"00",X"3F",X"00",X"00",X"98",X"90",X"80",X"80",X"00",X"DF",X"00",X"00", + X"03",X"03",X"00",X"00",X"00",X"06",X"07",X"03",X"00",X"C0",X"C0",X"30",X"0C",X"80",X"80",X"90", + X"01",X"03",X"07",X"06",X"00",X"FF",X"00",X"00",X"98",X"90",X"80",X"80",X"00",X"7C",X"00",X"00", + X"00",X"0F",X"0F",X"00",X"00",X"0D",X"0F",X"07",X"00",X"00",X"00",X"E0",X"00",X"00",X"80",X"90", + X"03",X"07",X"0F",X"0D",X"00",X"3F",X"00",X"00",X"98",X"90",X"80",X"00",X"00",X"DF",X"00",X"00", + X"03",X"03",X"00",X"00",X"00",X"0D",X"0F",X"07",X"00",X"C0",X"C0",X"30",X"0C",X"00",X"80",X"90", + X"03",X"07",X"0F",X"0D",X"00",X"FF",X"00",X"00",X"98",X"90",X"80",X"00",X"00",X"7C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"47",X"6F",X"00",X"00",X"00",X"00",X"30",X"F4",X"E4",X"E4", + X"27",X"6F",X"47",X"04",X"00",X"00",X"00",X"00",X"F0",X"E8",X"E8",X"C8",X"00",X"0C",X"0C",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"4F",X"6F",X"00",X"00",X"0C",X"0C",X"00",X"C8",X"E8",X"E8", + X"2F",X"6F",X"4F",X"04",X"00",X"00",X"00",X"00",X"F0",X"E4",X"E4",X"F4",X"30",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"74",X"D0",X"C0", + X"00",X"00",X"00",X"04",X"66",X"46",X"02",X"00",X"C8",X"0C",X"00",X"04",X"04",X"04",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"00",X"04",X"C4",X"C4", + X"00",X"00",X"00",X"0C",X"6A",X"4A",X"02",X"00",X"C0",X"C4",X"44",X"04",X"00",X"00",X"10",X"18", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"14",X"50",X"C0", + X"00",X"00",X"00",X"05",X"66",X"46",X"02",X"00",X"08",X"0C",X"00",X"84",X"04",X"04",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"00",X"04",X"44",X"C4", + X"00",X"00",X"00",X"0C",X"6A",X"4A",X"02",X"00",X"00",X"04",X"04",X"84",X"00",X"00",X"10",X"18", + X"00",X"00",X"00",X"00",X"3F",X"3F",X"00",X"01",X"00",X"00",X"00",X"00",X"FC",X"F4",X"04",X"FC", + X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"3F",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"F0",X"0C",X"04",X"04",X"FC", + X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"01",X"07",X"3E",X"00",X"6C",X"5C",X"58", + X"03",X"02",X"00",X"00",X"00",X"00",X"07",X"00",X"D0",X"58",X"5C",X"6C",X"00",X"00",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"3E",X"00",X"10",X"30",X"30", + X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"00",X"20",X"30",X"30",X"10",X"00",X"00",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"4C",X"1E",X"3F",X"DF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"DF",X"3F",X"1E",X"4C",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"6A",X"0A",X"02",X"00",X"00",X"02",X"01",X"00",X"02",X"01",X"41",X"40",X"E1",X"01",X"01",X"00", + X"00",X"00",X"00",X"40",X"C0",X"00",X"10",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"14",X"21",X"01",X"00",X"30",X"00",X"00",X"00",X"00",X"80",X"E0",X"F1",X"01",X"01",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"30",X"10",X"00",X"38",X"78",X"00",X"00", + X"08",X"00",X"00",X"00",X"02",X"02",X"02",X"00",X"00",X"60",X"70",X"70",X"60",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"1C",X"14",X"1A",X"19",X"0C",X"0C",X"06",X"00",X"00",X"00",X"00",X"00",X"88",X"58",X"30", + X"06",X"0C",X"0C",X"18",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"08",X"14",X"1C",X"35",X"62",X"30",X"18",X"00",X"00",X"00",X"80",X"40",X"20",X"18",X"18", + X"18",X"30",X"60",X"30",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"04",X"0E",X"1B",X"11",X"00",X"00",X"00",X"00",X"20",X"70",X"DC",X"8A",X"1C",X"20",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"10",X"20",X"C0",X"C0",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_PGM.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_PGM.vhd new file mode 100644 index 00000000..34083bcb --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_PGM.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AF",X"32",X"01",X"68",X"C3",X"71",X"00",X"FF",X"77",X"3C",X"23",X"77",X"3C",X"19",X"C9",X"FF", + X"77",X"23",X"10",X"FC",X"C9",X"FF",X"FF",X"FF",X"77",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"C9", + X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"C9",X"87",X"E1",X"5F",X"16",X"00",X"19",X"5E",X"23", + X"56",X"EB",X"E9",X"FF",X"FF",X"FF",X"FF",X"FF",X"E5",X"26",X"40",X"3A",X"A0",X"40",X"6F",X"CB", + X"7E",X"28",X"0E",X"72",X"2C",X"73",X"2C",X"7D",X"FE",X"C0",X"30",X"02",X"3E",X"C0",X"32",X"A0", + X"40",X"E1",X"C9",X"0F",X"11",X"22",X"04",X"31",X"06",X"15",X"02",X"33",X"07",X"21",X"03",X"24", + X"05",X"13",X"01",X"FF",X"FF",X"FF",X"C3",X"A3",X"04",X"80",X"40",X"20",X"10",X"08",X"04",X"02", + X"01",X"21",X"00",X"40",X"11",X"01",X"40",X"01",X"00",X"08",X"36",X"00",X"ED",X"B0",X"3E",X"9B", + X"32",X"03",X"81",X"3E",X"89",X"32",X"03",X"82",X"3E",X"08",X"32",X"42",X"42",X"32",X"01",X"82", + X"C3",X"F6",X"3F",X"21",X"C0",X"40",X"06",X"40",X"3E",X"FF",X"D7",X"21",X"43",X"42",X"06",X"1C", + X"D7",X"21",X"43",X"43",X"22",X"40",X"42",X"3A",X"00",X"70",X"AF",X"32",X"01",X"68",X"32",X"07", + X"68",X"32",X"06",X"68",X"21",X"C0",X"C0",X"22",X"A0",X"40",X"21",X"00",X"48",X"CD",X"1C",X"0D", + X"3E",X"10",X"32",X"17",X"40",X"3A",X"02",X"81",X"2F",X"0F",X"47",X"E6",X"02",X"32",X"00",X"40", + X"78",X"0F",X"0F",X"E6",X"01",X"32",X"0F",X"40",X"3A",X"01",X"81",X"2F",X"E6",X"03",X"FE",X"03", + X"28",X"07",X"C6",X"03",X"32",X"07",X"40",X"18",X"05",X"3E",X"FF",X"32",X"07",X"40",X"CD",X"B1", + X"3F",X"47",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"21",X"53",X"00",X"85",X"6F",X"7E",X"32",X"0F", + X"41",X"78",X"E6",X"0F",X"21",X"53",X"00",X"85",X"6F",X"7E",X"32",X"0C",X"41",X"CD",X"97",X"0A", + X"AF",X"3D",X"20",X"FD",X"CD",X"A6",X"0A",X"21",X"00",X"50",X"01",X"00",X"01",X"16",X"00",X"72", + X"23",X"0B",X"78",X"B1",X"20",X"F9",X"16",X"3F",X"21",X"00",X"48",X"01",X"00",X"08",X"72",X"3A", + X"00",X"70",X"23",X"0B",X"78",X"B1",X"20",X"F6",X"CD",X"72",X"01",X"00",X"00",X"CD",X"72",X"01", + X"00",X"00",X"CD",X"F1",X"0A",X"3E",X"01",X"32",X"01",X"68",X"21",X"00",X"42",X"06",X"0A",X"36", + X"00",X"2C",X"36",X"00",X"2C",X"36",X"01",X"2C",X"10",X"F5",X"21",X"AA",X"40",X"36",X"01",X"21", + X"C0",X"41",X"3E",X"0F",X"06",X"1E",X"D7",X"CD",X"93",X"3F",X"C3",X"81",X"01",X"3A",X"00",X"70", + X"18",X"FB",X"0B",X"3A",X"00",X"70",X"3A",X"01",X"81",X"07",X"D0",X"78",X"B1",X"20",X"F3",X"37", + X"C9",X"26",X"40",X"3A",X"A1",X"40",X"6F",X"7E",X"87",X"30",X"08",X"CD",X"85",X"36",X"CD",X"C9", + X"01",X"18",X"EE",X"E6",X"1F",X"4F",X"06",X"00",X"36",X"FF",X"23",X"5E",X"36",X"FF",X"2C",X"7D", + X"FE",X"C0",X"30",X"02",X"3E",X"C0",X"32",X"A1",X"40",X"7B",X"21",X"B7",X"01",X"09",X"5E",X"23", + X"56",X"21",X"81",X"01",X"E5",X"EB",X"E9",X"2B",X"02",X"52",X"02",X"79",X"02",X"F9",X"02",X"B2", + X"03",X"CB",X"03",X"12",X"04",X"41",X"04",X"7F",X"04",X"3A",X"80",X"41",X"47",X"E6",X"0F",X"CA", + X"D3",X"01",X"C9",X"3A",X"06",X"40",X"A7",X"C8",X"11",X"E0",X"FF",X"21",X"E0",X"48",X"3A",X"0E", + X"40",X"A7",X"28",X"22",X"36",X"02",X"CD",X"1C",X"02",X"21",X"40",X"4B",X"CD",X"1A",X"02",X"3A", + X"BD",X"40",X"A7",X"21",X"40",X"4B",X"28",X"03",X"21",X"E0",X"48",X"CB",X"60",X"C8",X"3A",X"06", + X"40",X"0F",X"D0",X"C3",X"23",X"02",X"21",X"E0",X"48",X"CD",X"23",X"02",X"21",X"21",X"49",X"CD", + X"23",X"02",X"CD",X"23",X"02",X"CD",X"23",X"02",X"18",X"CF",X"36",X"01",X"19",X"36",X"25",X"19", + X"36",X"20",X"C9",X"3E",X"10",X"77",X"19",X"77",X"19",X"77",X"C9",X"3A",X"06",X"40",X"A7",X"C8", + X"21",X"82",X"48",X"11",X"20",X"00",X"3A",X"80",X"42",X"3C",X"FE",X"10",X"38",X"02",X"3E",X"10", + X"4F",X"47",X"36",X"0C",X"19",X"10",X"FB",X"3E",X"10",X"91",X"C8",X"47",X"36",X"10",X"19",X"10", + X"FB",X"C9",X"21",X"82",X"4B",X"11",X"E0",X"FF",X"3A",X"88",X"42",X"A7",X"C8",X"3D",X"4F",X"28", + X"0D",X"FE",X"08",X"38",X"02",X"3E",X"08",X"4F",X"47",X"36",X"5F",X"19",X"10",X"FB",X"3E",X"08", + X"91",X"C8",X"47",X"36",X"10",X"19",X"10",X"FB",X"C9",X"3E",X"1A",X"06",X"0B",X"F5",X"C5",X"CD", + X"12",X"04",X"C1",X"F1",X"3C",X"10",X"F6",X"21",X"C7",X"49",X"11",X"20",X"00",X"06",X"0A",X"DD", + X"21",X"00",X"42",X"DD",X"7E",X"00",X"4F",X"E6",X"0F",X"77",X"19",X"79",X"0F",X"0F",X"0F",X"0F", + X"E6",X"0F",X"77",X"19",X"DD",X"23",X"DD",X"7E",X"00",X"4F",X"E6",X"0F",X"77",X"19",X"79",X"0F", + X"0F",X"0F",X"0F",X"E6",X"0F",X"77",X"19",X"DD",X"23",X"DD",X"7E",X"00",X"4F",X"E6",X"0F",X"77", + X"19",X"79",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"28",X"01",X"77",X"11",X"62",X"FF",X"19",X"11", + X"20",X"00",X"DD",X"23",X"10",X"BD",X"CD",X"DA",X"02",X"C9",X"DD",X"21",X"C0",X"41",X"21",X"A7", + X"48",X"0E",X"0A",X"11",X"20",X"00",X"06",X"03",X"DD",X"7E",X"00",X"77",X"19",X"DD",X"23",X"10", + X"F7",X"11",X"A2",X"FF",X"19",X"0D",X"20",X"EB",X"C9",X"4F",X"3A",X"06",X"40",X"0F",X"D0",X"79", + X"A7",X"28",X"47",X"CD",X"55",X"03",X"87",X"81",X"4F",X"06",X"00",X"21",X"64",X"03",X"09",X"A7", + X"06",X"03",X"1A",X"8E",X"27",X"12",X"13",X"23",X"10",X"F8",X"D5",X"3A",X"0D",X"40",X"0F",X"30", + X"02",X"3E",X"01",X"CD",X"CB",X"03",X"D1",X"1B",X"21",X"AA",X"40",X"06",X"03",X"1A",X"BE",X"D8", + X"20",X"05",X"1B",X"2B",X"10",X"F7",X"C9",X"CD",X"55",X"03",X"21",X"A8",X"40",X"06",X"03",X"1A", + X"77",X"13",X"23",X"10",X"FA",X"3E",X"02",X"C3",X"CB",X"03",X"CD",X"55",X"03",X"21",X"AB",X"40", + X"A7",X"06",X"03",X"18",X"BD",X"F5",X"3A",X"0D",X"40",X"11",X"A2",X"40",X"0F",X"30",X"03",X"11", + X"A5",X"40",X"F1",X"C9",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"07",X"00",X"00",X"05",X"00", + X"50",X"04",X"00",X"00",X"04",X"00",X"80",X"03",X"00",X"50",X"03",X"00",X"30",X"03",X"00",X"00", + X"03",X"00",X"80",X"02",X"00",X"50",X"02",X"00",X"30",X"02",X"00",X"00",X"02",X"00",X"80",X"01", + X"00",X"50",X"01",X"00",X"30",X"01",X"00",X"00",X"01",X"00",X"00",X"01",X"00",X"00",X"02",X"00", + X"00",X"04",X"00",X"00",X"08",X"00",X"00",X"16",X"00",X"00",X"32",X"00",X"00",X"64",X"00",X"00", + X"50",X"00",X"F5",X"21",X"A2",X"40",X"A7",X"28",X"09",X"21",X"A5",X"40",X"3D",X"28",X"03",X"21", + X"A8",X"40",X"36",X"00",X"23",X"36",X"00",X"23",X"36",X"00",X"F1",X"21",X"A4",X"40",X"DD",X"21", + X"81",X"4B",X"A7",X"28",X"11",X"21",X"A7",X"40",X"DD",X"21",X"21",X"49",X"3D",X"28",X"07",X"21", + X"AA",X"40",X"DD",X"21",X"41",X"4A",X"11",X"E0",X"FF",X"06",X"03",X"0E",X"04",X"7E",X"0F",X"0F", + X"0F",X"0F",X"CD",X"FD",X"03",X"7E",X"CD",X"FD",X"03",X"2B",X"10",X"F1",X"C9",X"E6",X"0F",X"28", + X"08",X"0E",X"00",X"DD",X"77",X"00",X"DD",X"19",X"C9",X"79",X"A7",X"28",X"F6",X"3E",X"10",X"0D", + X"18",X"F1",X"87",X"F5",X"21",X"6E",X"21",X"E6",X"7F",X"5F",X"16",X"00",X"19",X"5E",X"23",X"56", + X"EB",X"5E",X"23",X"56",X"23",X"EB",X"01",X"E0",X"FF",X"F1",X"38",X"0B",X"1A",X"FE",X"3F",X"C8", + X"D6",X"30",X"77",X"13",X"09",X"18",X"F5",X"1A",X"FE",X"3F",X"C8",X"36",X"10",X"13",X"09",X"18", + X"F6",X"3E",X"05",X"CD",X"12",X"04",X"3A",X"02",X"40",X"FE",X"63",X"38",X"02",X"3E",X"63",X"CD", + X"65",X"04",X"47",X"E6",X"F0",X"28",X"07",X"0F",X"0F",X"0F",X"0F",X"32",X"9F",X"4A",X"78",X"E6", + X"0F",X"32",X"7F",X"4A",X"C9",X"47",X"E6",X"0F",X"C6",X"00",X"27",X"4F",X"78",X"E6",X"F0",X"28", + X"0B",X"0F",X"0F",X"0F",X"0F",X"47",X"AF",X"C6",X"16",X"27",X"10",X"FB",X"81",X"27",X"C9",X"21", + X"FF",X"48",X"11",X"E0",X"FF",X"3A",X"85",X"42",X"FE",X"04",X"38",X"02",X"3E",X"04",X"4F",X"47", + X"A7",X"28",X"05",X"36",X"2A",X"19",X"10",X"FB",X"3E",X"04",X"91",X"C8",X"47",X"36",X"10",X"19", + X"10",X"FB",X"C9",X"F5",X"C5",X"D5",X"E5",X"08",X"D9",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD", + X"E5",X"AF",X"32",X"01",X"68",X"21",X"20",X"40",X"11",X"00",X"50",X"01",X"40",X"00",X"ED",X"B0", + X"11",X"5C",X"50",X"0E",X"04",X"ED",X"B0",X"11",X"40",X"50",X"0E",X"1C",X"ED",X"B0",X"3A",X"00", + X"70",X"3A",X"15",X"40",X"32",X"16",X"40",X"3A",X"13",X"40",X"32",X"15",X"40",X"2A",X"10",X"40", + X"22",X"13",X"40",X"21",X"12",X"40",X"3A",X"02",X"81",X"2F",X"77",X"2B",X"3A",X"01",X"81",X"2F", + X"77",X"2B",X"3A",X"00",X"81",X"2F",X"77",X"21",X"80",X"41",X"35",X"21",X"5F",X"42",X"35",X"CD", + X"3E",X"35",X"CD",X"6C",X"0A",X"21",X"17",X"05",X"E5",X"3A",X"05",X"40",X"EF",X"49",X"05",X"41", + X"06",X"07",X"09",X"0E",X"0C",X"5B",X"0A",X"3A",X"1E",X"40",X"32",X"06",X"68",X"32",X"07",X"68", + X"3A",X"80",X"41",X"E6",X"3F",X"20",X"0E",X"21",X"26",X"41",X"7E",X"A7",X"28",X"01",X"35",X"23", + X"7E",X"A7",X"28",X"01",X"35",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"D9",X"08",X"E1", + X"D1",X"C1",X"3E",X"01",X"32",X"01",X"68",X"F1",X"C9",X"06",X"20",X"CD",X"04",X"0D",X"C0",X"21", + X"06",X"40",X"36",X"00",X"2B",X"36",X"01",X"AF",X"32",X"0A",X"40",X"21",X"81",X"05",X"CD",X"71", + X"05",X"11",X"04",X"06",X"FF",X"11",X"00",X"05",X"FF",X"1E",X"02",X"FF",X"AF",X"32",X"51",X"46", + X"C9",X"11",X"20",X"40",X"06",X"20",X"EB",X"36",X"00",X"2C",X"1A",X"77",X"2C",X"13",X"10",X"F7", + X"C9",X"07",X"06",X"06",X"00",X"01",X"01",X"06",X"03",X"03",X"04",X"04",X"04",X"04",X"01",X"01", + X"01",X"00",X"00",X"00",X"07",X"07",X"07",X"07",X"07",X"06",X"06",X"06",X"06",X"06",X"06",X"06", + X"01",X"07",X"06",X"06",X"02",X"02",X"02",X"02",X"03",X"03",X"04",X"04",X"02",X"02",X"02",X"02", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"06",X"06",X"04", + X"01",X"07",X"06",X"06",X"06",X"06",X"06",X"06",X"02",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"04",X"06",X"06",X"04", + X"01",X"07",X"06",X"06",X"04",X"01",X"07",X"07",X"07",X"07",X"07",X"07",X"06",X"06",X"06",X"06", + X"04",X"04",X"04",X"04",X"01",X"01",X"01",X"01",X"03",X"03",X"03",X"03",X"06",X"06",X"06",X"04", + X"01",X"07",X"06",X"06",X"01",X"01",X"01",X"01",X"01",X"02",X"02",X"03",X"03",X"04",X"04",X"05", + X"05",X"06",X"06",X"07",X"07",X"01",X"01",X"02",X"02",X"01",X"01",X"01",X"04",X"06",X"06",X"04", + X"01",X"07",X"06",X"06",X"04",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"04", + X"01",X"21",X"D9",X"08",X"E5",X"3A",X"51",X"46",X"EF",X"65",X"06",X"88",X"06",X"C7",X"06",X"E1", + X"06",X"F1",X"06",X"CB",X"07",X"F7",X"07",X"1B",X"08",X"63",X"08",X"63",X"08",X"69",X"08",X"A5", + X"08",X"E1",X"06",X"CA",X"08",X"AF",X"32",X"03",X"68",X"32",X"19",X"40",X"21",X"60",X"40",X"11", + X"61",X"40",X"01",X"3F",X"00",X"36",X"00",X"ED",X"B0",X"CD",X"19",X"0D",X"21",X"51",X"46",X"34", + X"AF",X"32",X"06",X"40",X"CD",X"EB",X"0C",X"C9",X"06",X"1D",X"CD",X"04",X"0D",X"C0",X"21",X"A1", + X"05",X"CD",X"71",X"05",X"AF",X"32",X"07",X"68",X"32",X"06",X"68",X"CD",X"5C",X"0A",X"11",X"11", + X"06",X"FF",X"11",X"0B",X"06",X"FF",X"1E",X"0C",X"FF",X"3E",X"0C",X"32",X"40",X"46",X"3E",X"03", + X"32",X"80",X"42",X"21",X"6E",X"19",X"22",X"BB",X"40",X"21",X"C0",X"42",X"06",X"80",X"3E",X"FF", + X"D7",X"21",X"51",X"46",X"36",X"0A",X"C9",X"21",X"50",X"46",X"35",X"C0",X"2C",X"34",X"21",X"E1", + X"05",X"CD",X"71",X"05",X"11",X"8B",X"06",X"FF",X"11",X"8C",X"06",X"FF",X"11",X"00",X"02",X"FF", + X"C9",X"21",X"50",X"46",X"35",X"C0",X"CD",X"EB",X"0C",X"CD",X"19",X"0D",X"21",X"51",X"46",X"34", + X"C9",X"06",X"19",X"CD",X"04",X"0D",X"C0",X"21",X"C1",X"05",X"CD",X"71",X"05",X"11",X"0D",X"06", + X"FF",X"21",X"80",X"45",X"AF",X"06",X"C0",X"D7",X"21",X"64",X"07",X"11",X"70",X"07",X"DD",X"21", + X"98",X"45",X"CD",X"4B",X"07",X"01",X"18",X"00",X"DD",X"09",X"1A",X"3C",X"20",X"F4",X"21",X"7D", + X"07",X"22",X"54",X"46",X"21",X"4A",X"4A",X"22",X"56",X"46",X"21",X"50",X"46",X"36",X"32",X"2C", + X"34",X"2C",X"36",X"0D",X"2C",X"36",X"06",X"DD",X"21",X"98",X"45",X"06",X"06",X"11",X"18",X"00", + X"CD",X"1B",X"32",X"DD",X"19",X"10",X"F9",X"CD",X"1E",X"11",X"C9",X"1A",X"DD",X"77",X"06",X"13", + X"1A",X"13",X"DD",X"77",X"04",X"7E",X"DD",X"77",X"0C",X"23",X"7E",X"DD",X"77",X"0D",X"DD",X"36", + X"0E",X"00",X"23",X"C9",X"E3",X"17",X"E6",X"33",X"6B",X"18",X"27",X"18",X"2A",X"34",X"AF",X"18", + X"0A",X"0A",X"0A",X"0D",X"0A",X"10",X"0A",X"13",X"0A",X"16",X"0A",X"19",X"FF",X"0F",X"0F",X"0F", + X"10",X"10",X"13",X"1F",X"20",X"19",X"15",X"22",X"10",X"10",X"0F",X"0F",X"0F",X"10",X"10",X"20", + X"1F",X"1C",X"19",X"13",X"15",X"10",X"10",X"0F",X"0F",X"0F",X"10",X"10",X"24",X"18",X"19",X"15", + X"16",X"10",X"10",X"10",X"0F",X"0F",X"0F",X"10",X"10",X"22",X"25",X"23",X"24",X"1C",X"15",X"22", + X"10",X"0F",X"0F",X"0F",X"10",X"10",X"13",X"11",X"24",X"24",X"1C",X"15",X"10",X"10",X"0F",X"0F", + X"0F",X"10",X"10",X"24",X"18",X"19",X"15",X"16",X"10",X"10",X"10",X"CD",X"37",X"07",X"21",X"50", + X"46",X"35",X"C0",X"36",X"05",X"2A",X"54",X"46",X"7E",X"23",X"22",X"54",X"46",X"2A",X"56",X"46", + X"77",X"11",X"E0",X"FF",X"19",X"22",X"56",X"46",X"21",X"52",X"46",X"35",X"C0",X"36",X"0D",X"21", + X"50",X"46",X"36",X"14",X"2C",X"34",X"C9",X"CD",X"37",X"07",X"21",X"50",X"46",X"35",X"C0",X"36", + X"01",X"2C",X"35",X"2A",X"56",X"46",X"11",X"A3",X"01",X"19",X"22",X"56",X"46",X"21",X"53",X"46", + X"35",X"C0",X"21",X"50",X"46",X"36",X"96",X"2C",X"34",X"34",X"C9",X"21",X"00",X"00",X"22",X"0D", + X"40",X"AF",X"32",X"0A",X"40",X"3E",X"03",X"32",X"05",X"40",X"3E",X"00",X"32",X"06",X"40",X"CD", + X"16",X"0A",X"3E",X"03",X"32",X"05",X"40",X"21",X"7F",X"41",X"34",X"7E",X"E6",X"01",X"20",X"06", + X"3E",X"00",X"32",X"0A",X"40",X"C9",X"CD",X"62",X"0C",X"3E",X"01",X"32",X"80",X"43",X"32",X"83", + X"43",X"32",X"0A",X"40",X"21",X"C0",X"43",X"06",X"80",X"3E",X"FF",X"D7",X"21",X"F7",X"43",X"CD", + X"4E",X"0A",X"C9",X"21",X"51",X"46",X"36",X"00",X"C9",X"3E",X"1D",X"32",X"48",X"46",X"21",X"40", + X"46",X"4E",X"3E",X"10",X"32",X"0A",X"40",X"CD",X"94",X"24",X"21",X"48",X"46",X"35",X"20",X"F7", + X"21",X"40",X"46",X"34",X"7E",X"FE",X"1A",X"D8",X"21",X"51",X"46",X"34",X"2B",X"36",X"3C",X"CD", + X"77",X"3F",X"E6",X"07",X"FE",X"06",X"38",X"02",X"D6",X"06",X"CD",X"24",X"14",X"21",X"CC",X"45", + X"7E",X"C6",X"07",X"77",X"C9",X"21",X"50",X"46",X"7E",X"A7",X"28",X"03",X"35",X"18",X"0A",X"DD", + X"21",X"C8",X"45",X"CD",X"F9",X"2D",X"CD",X"0D",X"28",X"CD",X"1E",X"11",X"3A",X"6F",X"40",X"FE", + X"CD",X"D8",X"21",X"51",X"46",X"34",X"2B",X"36",X"3C",X"C9",X"06",X"19",X"CD",X"04",X"0D",X"C0", + X"21",X"51",X"46",X"36",X"02",X"2B",X"36",X"1E",X"C9",X"3A",X"0C",X"41",X"FE",X"0F",X"20",X"19", + X"3A",X"11",X"40",X"CB",X"7F",X"28",X"09",X"CD",X"F1",X"0A",X"21",X"00",X"00",X"C3",X"D6",X"09", + X"CB",X"77",X"C8",X"CD",X"F1",X"0A",X"C3",X"D3",X"09",X"3A",X"02",X"40",X"A7",X"C8",X"21",X"05", + X"40",X"34",X"AF",X"32",X"0A",X"40",X"C9",X"21",X"BD",X"09",X"E5",X"3A",X"0A",X"40",X"EF",X"15", + X"09",X"41",X"09",X"A6",X"09",X"AF",X"32",X"19",X"40",X"32",X"03",X"68",X"21",X"40",X"50",X"06", + X"40",X"AF",X"D7",X"32",X"06",X"40",X"21",X"02",X"48",X"22",X"0B",X"40",X"21",X"09",X"40",X"36", + X"10",X"23",X"34",X"21",X"60",X"40",X"11",X"61",X"40",X"01",X"1F",X"00",X"36",X"00",X"ED",X"B0", + X"C9",X"2A",X"0B",X"40",X"06",X"1D",X"3E",X"10",X"D7",X"11",X"03",X"00",X"19",X"06",X"1D",X"D7", + X"19",X"22",X"0B",X"40",X"21",X"09",X"40",X"35",X"C0",X"2C",X"34",X"21",X"81",X"05",X"CD",X"71", + X"05",X"AF",X"32",X"07",X"68",X"32",X"06",X"68",X"32",X"0D",X"40",X"CD",X"5C",X"0A",X"11",X"01", + X"06",X"FF",X"1E",X"11",X"FF",X"1E",X"0C",X"FF",X"1E",X"16",X"FF",X"1C",X"3A",X"00",X"40",X"E6", + X"02",X"28",X"02",X"1E",X"28",X"FF",X"1E",X"2A",X"3A",X"00",X"40",X"E6",X"02",X"28",X"01",X"1D", + X"FF",X"3A",X"17",X"40",X"47",X"E6",X"0F",X"32",X"78",X"49",X"78",X"E6",X"F0",X"C8",X"0F",X"0F", + X"0F",X"0F",X"32",X"98",X"49",X"C9",X"3A",X"02",X"40",X"A7",X"C8",X"3D",X"11",X"18",X"06",X"28", + X"01",X"1C",X"FF",X"11",X"00",X"03",X"FF",X"3E",X"02",X"32",X"05",X"40",X"C9",X"3A",X"11",X"40", + X"CB",X"7F",X"C2",X"00",X"0A",X"CB",X"77",X"C8",X"3A",X"02",X"40",X"FE",X"02",X"D8",X"D6",X"02", + X"32",X"02",X"40",X"21",X"00",X"01",X"22",X"0D",X"40",X"CD",X"5C",X"0A",X"AF",X"32",X"0A",X"40", + X"3E",X"03",X"32",X"05",X"40",X"3E",X"01",X"32",X"06",X"40",X"11",X"04",X"06",X"FF",X"CD",X"16", + X"0A",X"CD",X"E1",X"0B",X"11",X"00",X"04",X"FF",X"3A",X"0E",X"40",X"0F",X"D0",X"1C",X"FF",X"C9", + X"3A",X"02",X"40",X"A7",X"28",X"0A",X"3D",X"32",X"02",X"40",X"21",X"00",X"00",X"C3",X"D6",X"09", + X"3E",X"01",X"32",X"05",X"40",X"C9",X"21",X"80",X"42",X"AF",X"06",X"40",X"D7",X"21",X"6E",X"19", + X"11",X"C0",X"43",X"0E",X"80",X"ED",X"B0",X"21",X"F7",X"43",X"CD",X"4E",X"0A",X"21",X"6E",X"19", + X"11",X"C0",X"44",X"0E",X"80",X"ED",X"B0",X"21",X"F7",X"44",X"CD",X"4E",X"0A",X"21",X"60",X"40", + X"06",X"20",X"AF",X"D7",X"3A",X"07",X"40",X"32",X"88",X"43",X"32",X"88",X"44",X"C9",X"11",X"04", + X"00",X"06",X"06",X"3E",X"FB",X"A6",X"77",X"19",X"10",X"F9",X"C9",X"C9",X"11",X"01",X"07",X"FF", + X"3A",X"0C",X"41",X"FE",X"0F",X"20",X"04",X"11",X"06",X"06",X"FF",X"C9",X"11",X"41",X"42",X"1A", + X"6F",X"26",X"42",X"7E",X"FE",X"FF",X"C8",X"47",X"3A",X"00",X"40",X"E6",X"01",X"20",X"06",X"3A", + X"06",X"40",X"A7",X"28",X"04",X"78",X"CD",X"B6",X"0A",X"36",X"FF",X"7D",X"FE",X"5E",X"28",X"03", + X"3C",X"12",X"C9",X"3E",X"43",X"12",X"C9",X"3A",X"42",X"42",X"F6",X"10",X"32",X"42",X"42",X"32", + X"01",X"82",X"AF",X"C3",X"B6",X"0A",X"AF",X"CD",X"B6",X"0A",X"3A",X"42",X"42",X"E6",X"EF",X"32", + X"42",X"42",X"32",X"01",X"82",X"C9",X"32",X"00",X"82",X"3A",X"42",X"42",X"E6",X"F7",X"32",X"01", + X"82",X"00",X"00",X"00",X"00",X"3A",X"42",X"42",X"F6",X"08",X"32",X"01",X"82",X"C9",X"47",X"3A", + X"06",X"40",X"A7",X"C8",X"78",X"C5",X"D5",X"E5",X"47",X"11",X"40",X"42",X"1A",X"6F",X"26",X"42", + X"70",X"7D",X"FE",X"5E",X"28",X"04",X"3C",X"12",X"18",X"03",X"3E",X"43",X"12",X"E1",X"D1",X"C1", + X"C9",X"AF",X"18",X"C2",X"3E",X"10",X"18",X"BE",X"3A",X"80",X"42",X"E6",X"01",X"28",X"09",X"3E", + X"01",X"CD",X"CE",X"0A",X"3E",X"02",X"18",X"C6",X"3E",X"06",X"18",X"C2",X"3E",X"04",X"18",X"BE", + X"3E",X"05",X"18",X"C1",X"3E",X"07",X"CD",X"CE",X"0A",X"3E",X"08",X"18",X"B1",X"3E",X"25",X"CD", + X"CE",X"0A",X"3E",X"26",X"CD",X"CE",X"0A",X"3E",X"27",X"C3",X"CE",X"0A",X"3E",X"09",X"C3",X"CE", + X"0A",X"3E",X"28",X"CD",X"CE",X"0A",X"3E",X"29",X"CD",X"CE",X"0A",X"3E",X"2A",X"C3",X"CE",X"0A", + X"3E",X"22",X"CD",X"CE",X"0A",X"3E",X"23",X"CD",X"CE",X"0A",X"3E",X"24",X"C3",X"CE",X"0A",X"DD", + X"7E",X"04",X"FE",X"10",X"06",X"03",X"38",X"08",X"FE",X"18",X"06",X"0E",X"38",X"02",X"06",X"0F", + X"78",X"C3",X"D5",X"0A",X"3E",X"0A",X"C3",X"D5",X"0A",X"3E",X"0D",X"C3",X"CE",X"0A",X"3E",X"2B", + X"CD",X"CE",X"0A",X"3E",X"2C",X"CD",X"CE",X"0A",X"3E",X"2D",X"C3",X"CE",X"0A",X"3E",X"0C",X"C3", + X"CE",X"0A",X"3E",X"1C",X"CD",X"CE",X"0A",X"3E",X"1D",X"CD",X"CE",X"0A",X"3E",X"1E",X"C3",X"CE", + X"0A",X"3E",X"1F",X"CD",X"CE",X"0A",X"3E",X"20",X"CD",X"CE",X"0A",X"3E",X"21",X"C3",X"CE",X"0A", + X"3E",X"A5",X"CD",X"CE",X"0A",X"3E",X"A6",X"CD",X"CE",X"0A",X"3E",X"A7",X"C3",X"CE",X"0A",X"3E", + X"A8",X"CD",X"CE",X"0A",X"3E",X"A9",X"CD",X"CE",X"0A",X"3E",X"AA",X"C3",X"CE",X"0A",X"3E",X"A2", + X"CD",X"CE",X"0A",X"3E",X"A3",X"CD",X"CE",X"0A",X"3E",X"A4",X"C3",X"CE",X"0A",X"3E",X"AB",X"CD", + X"CE",X"0A",X"3E",X"AC",X"CD",X"CE",X"0A",X"3E",X"AD",X"C3",X"CE",X"0A",X"3E",X"0B",X"C3",X"D5", + X"0A",X"3E",X"13",X"CD",X"CE",X"0A",X"3E",X"14",X"CD",X"CE",X"0A",X"3E",X"15",X"C3",X"CE",X"0A", + X"3E",X"16",X"CD",X"CE",X"0A",X"3E",X"17",X"CD",X"CE",X"0A",X"3E",X"18",X"C3",X"CE",X"0A",X"3E", + X"19",X"CD",X"CE",X"0A",X"3E",X"1A",X"CD",X"CE",X"0A",X"3E",X"1B",X"C3",X"CE",X"0A",X"21",X"45", + X"0C",X"E5",X"3A",X"0A",X"40",X"EF",X"62",X"0C",X"D5",X"0C",X"25",X"0D",X"F0",X"0D",X"F4",X"0D", + X"48",X"0E",X"55",X"0E",X"99",X"0E",X"15",X"0F",X"1E",X"0F",X"27",X"0F",X"50",X"0F",X"AA",X"0F", + X"B9",X"0F",X"50",X"0F",X"CD",X"0F",X"E8",X"0F",X"24",X"10",X"48",X"10",X"85",X"10",X"BA",X"10", + X"0A",X"11",X"FF",X"FF",X"FF",X"3A",X"06",X"40",X"A7",X"C0",X"3A",X"0C",X"41",X"FE",X"0F",X"CA", + X"D9",X"08",X"3A",X"02",X"40",X"A7",X"C8",X"21",X"05",X"40",X"36",X"02",X"21",X"0A",X"40",X"36", + X"00",X"C9",X"21",X"39",X"19",X"7E",X"D6",X"06",X"32",X"81",X"43",X"32",X"81",X"44",X"23",X"7E", + X"32",X"82",X"43",X"32",X"82",X"44",X"3E",X"03",X"32",X"85",X"43",X"32",X"85",X"44",X"AF",X"32", + X"80",X"43",X"32",X"80",X"44",X"32",X"83",X"43",X"32",X"83",X"44",X"21",X"80",X"45",X"11",X"81", + X"45",X"01",X"C0",X"00",X"77",X"ED",X"B0",X"32",X"BD",X"40",X"CD",X"1E",X"11",X"06",X"0E",X"3A", + X"0E",X"40",X"A7",X"20",X"02",X"06",X"1C",X"78",X"32",X"10",X"41",X"21",X"0A",X"40",X"34",X"C9", + X"21",X"C0",X"42",X"11",X"42",X"0C",X"06",X"20",X"CD",X"C2",X"0C",X"21",X"F7",X"42",X"CD",X"4E", + X"0A",X"C9",X"1A",X"77",X"13",X"23",X"1A",X"77",X"23",X"1A",X"77",X"13",X"23",X"1A",X"77",X"1B", + X"1B",X"23",X"10",X"EE",X"C9",X"CD",X"19",X"0D",X"CD",X"C4",X"11",X"CD",X"D9",X"11",X"3E",X"02", + X"32",X"0A",X"40",X"21",X"F0",X"41",X"06",X"10",X"AF",X"D7",X"C9",X"21",X"60",X"40",X"06",X"20", + X"AF",X"77",X"23",X"10",X"FC",X"21",X"80",X"45",X"06",X"C0",X"77",X"23",X"10",X"FC",X"C9",X"CD", + X"EB",X"0C",X"06",X"1C",X"3E",X"20",X"90",X"5F",X"16",X"00",X"2A",X"0B",X"40",X"3E",X"10",X"D7", + X"19",X"22",X"0B",X"40",X"21",X"09",X"40",X"35",X"C9",X"21",X"03",X"48",X"22",X"0B",X"40",X"3E", + X"20",X"32",X"09",X"40",X"C9",X"3A",X"1A",X"40",X"A7",X"20",X"07",X"CD",X"FF",X"0C",X"C0",X"CD", + X"19",X"0D",X"3A",X"0E",X"40",X"A7",X"28",X"2F",X"21",X"1A",X"40",X"7E",X"A7",X"28",X"06",X"34", + X"FE",X"80",X"28",X"23",X"C9",X"4F",X"11",X"02",X"06",X"3A",X"0D",X"40",X"A7",X"28",X"02",X"0C", + X"1C",X"FF",X"3A",X"0F",X"40",X"A7",X"20",X"04",X"79",X"32",X"1E",X"40",X"21",X"1A",X"40",X"34", + X"3A",X"0D",X"40",X"32",X"BD",X"40",X"C9",X"AF",X"32",X"1A",X"40",X"11",X"82",X"06",X"FF",X"1C", + X"FF",X"11",X"0A",X"06",X"FF",X"16",X"08",X"FF",X"11",X"80",X"42",X"21",X"80",X"43",X"3A",X"0D", + X"40",X"A7",X"28",X"03",X"21",X"80",X"44",X"01",X"C0",X"00",X"ED",X"B0",X"21",X"49",X"19",X"3A", + X"80",X"42",X"E6",X"07",X"47",X"CD",X"2B",X"2C",X"ED",X"53",X"BB",X"40",X"78",X"21",X"E8",X"0D", + X"85",X"30",X"01",X"24",X"6F",X"7E",X"21",X"25",X"40",X"36",X"06",X"2C",X"2C",X"06",X"1C",X"77", + X"2C",X"2C",X"10",X"FB",X"CD",X"5C",X"0A",X"3E",X"1D",X"32",X"48",X"46",X"3E",X"03",X"32",X"0A", + X"40",X"CD",X"1E",X"11",X"16",X"00",X"FF",X"16",X"01",X"FF",X"3A",X"80",X"42",X"FE",X"01",X"D0", + X"3A",X"83",X"42",X"A7",X"C0",X"CD",X"B0",X"0C",X"3E",X"01",X"32",X"83",X"42",X"21",X"89",X"42", + X"06",X"04",X"36",X"00",X"23",X"10",X"FB",X"C9",X"00",X"02",X"01",X"03",X"00",X"02",X"01",X"03", + X"CD",X"8B",X"13",X"C9",X"CD",X"31",X"13",X"CD",X"C0",X"25",X"3A",X"F1",X"41",X"A7",X"20",X"06", + X"CD",X"7A",X"2D",X"CD",X"69",X"3C",X"CD",X"67",X"12",X"CD",X"1E",X"11",X"CD",X"16",X"2D",X"2A", + X"81",X"42",X"7D",X"B4",X"28",X"11",X"3A",X"4F",X"43",X"A7",X"C8",X"3E",X"07",X"32",X"0A",X"40", + X"CD",X"AF",X"0B",X"CD",X"A0",X"0B",X"C9",X"32",X"5F",X"42",X"3C",X"32",X"10",X"41",X"21",X"0A", + X"40",X"34",X"3A",X"80",X"42",X"E6",X"01",X"28",X"0A",X"CD",X"AF",X"0B",X"CD",X"CD",X"0B",X"CD", + X"F0",X"0B",X"C9",X"CD",X"A0",X"0B",X"18",X"F4",X"CD",X"31",X"13",X"3A",X"5F",X"42",X"A7",X"C0", + X"21",X"0A",X"40",X"34",X"C9",X"CD",X"DD",X"0D",X"21",X"80",X"42",X"34",X"7E",X"E6",X"07",X"11", + X"39",X"19",X"87",X"83",X"5F",X"30",X"01",X"14",X"1A",X"23",X"D6",X"06",X"77",X"23",X"13",X"1A", + X"77",X"3E",X"03",X"32",X"85",X"42",X"3A",X"80",X"42",X"21",X"49",X"19",X"E6",X"07",X"87",X"5F", + X"16",X"00",X"19",X"5E",X"23",X"56",X"ED",X"53",X"6E",X"43",X"CD",X"B0",X"0C",X"CD",X"AF",X"11", + X"3E",X"10",X"32",X"0A",X"40",X"CD",X"19",X"0D",X"C9",X"CD",X"7A",X"2D",X"CD",X"C0",X"25",X"CD", + X"69",X"3C",X"CD",X"1E",X"11",X"21",X"91",X"45",X"35",X"C0",X"3A",X"06",X"40",X"A7",X"28",X"3B", + X"CD",X"CD",X"0B",X"3E",X"01",X"32",X"10",X"41",X"21",X"88",X"42",X"35",X"3E",X"03",X"32",X"85", + X"42",X"CD",X"AF",X"11",X"3A",X"0D",X"40",X"A7",X"20",X"2D",X"3A",X"88",X"43",X"A7",X"28",X"12", + X"3A",X"0E",X"40",X"A7",X"28",X"2D",X"3A",X"88",X"44",X"A7",X"28",X"27",X"3E",X"09",X"32",X"0A", + X"40",X"C9",X"3E",X"0A",X"32",X"0A",X"40",X"CD",X"FF",X"0B",X"C9",X"AF",X"32",X"51",X"46",X"32", + X"0A",X"40",X"3C",X"32",X"05",X"40",X"C9",X"3A",X"88",X"44",X"A7",X"28",X"0F",X"3A",X"88",X"43", + X"A7",X"28",X"D9",X"3E",X"08",X"32",X"0A",X"40",X"CD",X"CD",X"0B",X"C9",X"3E",X"0D",X"32",X"0A", + X"40",X"CD",X"FF",X"0B",X"C9",X"AF",X"32",X"0D",X"40",X"3C",X"32",X"0A",X"40",X"C9",X"3E",X"01", + X"32",X"0D",X"40",X"32",X"0A",X"40",X"C9",X"CD",X"FF",X"0C",X"C0",X"CD",X"19",X"0D",X"CD",X"E1", + X"11",X"11",X"02",X"06",X"FF",X"1E",X"00",X"FF",X"3E",X"78",X"32",X"5F",X"42",X"3E",X"FF",X"32", + X"BE",X"40",X"CD",X"A0",X"0B",X"CD",X"AF",X"0B",X"CD",X"BE",X"0B",X"21",X"0A",X"40",X"34",X"C9", + X"3A",X"5F",X"42",X"A7",X"20",X"33",X"3A",X"BF",X"40",X"A7",X"28",X"E6",X"3E",X"82",X"CD",X"12", + X"04",X"3E",X"80",X"CD",X"12",X"04",X"CD",X"79",X"02",X"21",X"E1",X"05",X"CD",X"71",X"05",X"21", + X"2B",X"40",X"3A",X"BF",X"40",X"47",X"2C",X"2C",X"2C",X"2C",X"10",X"FA",X"36",X"04",X"22",X"FD", + X"41",X"AF",X"32",X"BF",X"40",X"32",X"FF",X"41",X"C9",X"21",X"BE",X"40",X"7E",X"FE",X"80",X"30", + X"15",X"E6",X"07",X"20",X"11",X"3A",X"FF",X"41",X"ED",X"5B",X"FD",X"41",X"12",X"3C",X"FE",X"08", + X"38",X"01",X"AF",X"32",X"FF",X"41",X"35",X"C0",X"18",X"98",X"3A",X"0E",X"40",X"A7",X"28",X"26", + X"3A",X"88",X"44",X"A7",X"28",X"20",X"C3",X"DC",X"0E",X"CD",X"FF",X"0C",X"C0",X"CD",X"19",X"0D", + X"CD",X"E1",X"11",X"11",X"03",X"06",X"FF",X"1E",X"00",X"FF",X"C3",X"35",X"0F",X"3A",X"88",X"43", + X"A7",X"28",X"03",X"C3",X"03",X"0F",X"AF",X"32",X"06",X"40",X"32",X"1E",X"40",X"32",X"0A",X"40", + X"32",X"51",X"46",X"3C",X"32",X"05",X"40",X"C9",X"CD",X"FF",X"0C",X"C0",X"16",X"01",X"FF",X"AF", + X"32",X"F1",X"41",X"3E",X"05",X"32",X"40",X"46",X"3E",X"01",X"32",X"80",X"42",X"21",X"6C",X"43", + X"36",X"78",X"21",X"E1",X"05",X"CD",X"71",X"05",X"11",X"25",X"06",X"FF",X"1C",X"FF",X"1C",X"FF", + X"1E",X"11",X"FF",X"21",X"6C",X"40",X"36",X"48",X"23",X"36",X"21",X"23",X"36",X"05",X"23",X"36", + X"75",X"C3",X"4B",X"0F",X"21",X"6C",X"43",X"35",X"7E",X"FE",X"02",X"28",X"0F",X"A7",X"C0",X"21", + X"21",X"06",X"CD",X"71",X"05",X"AF",X"32",X"6C",X"40",X"C3",X"4B",X"0F",X"11",X"A5",X"06",X"FF", + X"1C",X"FF",X"1C",X"FF",X"1E",X"91",X"FF",X"C9",X"3E",X"1D",X"32",X"48",X"46",X"21",X"40",X"46", + X"4E",X"CD",X"94",X"24",X"21",X"48",X"46",X"35",X"20",X"F7",X"21",X"40",X"46",X"34",X"7E",X"FE", + X"1D",X"D8",X"21",X"6C",X"43",X"36",X"00",X"23",X"36",X"3C",X"AF",X"CD",X"24",X"14",X"CD",X"77", + X"3F",X"E6",X"07",X"FE",X"06",X"38",X"02",X"D6",X"06",X"CD",X"6F",X"14",X"CD",X"7D",X"0B",X"CD", + X"1E",X"11",X"C3",X"4B",X"0F",X"3A",X"1E",X"40",X"A7",X"3A",X"10",X"40",X"28",X"03",X"3A",X"11", + X"40",X"E6",X"08",X"C2",X"4B",X"0F",X"21",X"6C",X"43",X"34",X"7E",X"E6",X"07",X"20",X"17",X"7E", + X"0F",X"0F",X"0F",X"E6",X"07",X"FE",X"06",X"38",X"02",X"AF",X"77",X"23",X"35",X"CA",X"4B",X"0F", + X"CD",X"24",X"14",X"CD",X"7D",X"0B",X"CD",X"1E",X"11",X"C9",X"DD",X"21",X"C8",X"45",X"CD",X"F9", + X"2D",X"CD",X"0D",X"28",X"CD",X"1E",X"11",X"3A",X"6F",X"40",X"21",X"6B",X"40",X"BE",X"D8",X"3A", + X"6C",X"40",X"21",X"68",X"40",X"96",X"30",X"02",X"ED",X"44",X"FE",X"03",X"38",X"0D",X"CD",X"42", + X"0F",X"3E",X"1F",X"32",X"6D",X"40",X"CD",X"91",X"0B",X"18",X"19",X"CD",X"42",X"0F",X"3E",X"1E", + X"32",X"6D",X"40",X"3E",X"3C",X"32",X"69",X"40",X"3E",X"06",X"32",X"6A",X"40",X"11",X"19",X"03", + X"FF",X"CD",X"82",X"0B",X"21",X"6C",X"43",X"36",X"78",X"C9",X"21",X"6C",X"43",X"35",X"C0",X"2A", + X"6E",X"43",X"22",X"BB",X"40",X"3E",X"01",X"32",X"0A",X"40",X"32",X"10",X"41",X"C9",X"21",X"60", + X"40",X"DD",X"21",X"80",X"45",X"11",X"18",X"00",X"DD",X"7E",X"06",X"D6",X"0B",X"77",X"DD",X"7E", + X"0F",X"2C",X"77",X"DD",X"7E",X"10",X"2C",X"77",X"DD",X"7E",X"04",X"2C",X"D6",X"06",X"77",X"2C", + X"DD",X"19",X"3A",X"F1",X"41",X"A7",X"C2",X"3B",X"12",X"06",X"07",X"DD",X"4E",X"05",X"DD",X"7E", + X"06",X"CB",X"01",X"17",X"CB",X"01",X"17",X"CB",X"01",X"17",X"D6",X"08",X"77",X"2C",X"DD",X"7E", + X"0F",X"77",X"2C",X"DD",X"7E",X"10",X"77",X"2C",X"DD",X"7E",X"04",X"DD",X"4E",X"03",X"CB",X"01", + X"17",X"CB",X"01",X"17",X"CB",X"01",X"17",X"D6",X"08",X"77",X"2C",X"DD",X"19",X"10",X"CC",X"CD", + X"94",X"11",X"3A",X"1E",X"40",X"A7",X"C0",X"21",X"64",X"40",X"11",X"04",X"00",X"06",X"03",X"34", + X"19",X"10",X"FC",X"C9",X"21",X"63",X"40",X"3A",X"61",X"40",X"47",X"E6",X"3F",X"FE",X"34",X"28", + X"06",X"FE",X"35",X"28",X"02",X"34",X"C9",X"CB",X"70",X"C0",X"7E",X"C6",X"02",X"77",X"C9",X"21", + X"80",X"42",X"11",X"80",X"43",X"3A",X"0D",X"40",X"A7",X"28",X"03",X"11",X"80",X"44",X"01",X"C0", + X"00",X"ED",X"B0",X"C9",X"21",X"40",X"43",X"06",X"40",X"AF",X"D7",X"AF",X"21",X"40",X"44",X"06", + X"40",X"D7",X"21",X"40",X"45",X"06",X"40",X"D7",X"C9",X"21",X"B0",X"45",X"06",X"90",X"AF",X"D7", + X"C9",X"01",X"1E",X"00",X"11",X"03",X"00",X"6A",X"DD",X"21",X"A2",X"40",X"3A",X"0D",X"40",X"0F", + X"30",X"02",X"DD",X"19",X"FD",X"21",X"00",X"42",X"DD",X"7E",X"02",X"FD",X"BE",X"02",X"20",X"0E", + X"DD",X"7E",X"01",X"FD",X"BE",X"01",X"20",X"06",X"DD",X"7E",X"00",X"FD",X"BE",X"00",X"30",X"09", + X"FD",X"19",X"2C",X"0D",X"0D",X"0D",X"C8",X"18",X"DF",X"7D",X"3C",X"32",X"BF",X"40",X"3D",X"21", + X"1D",X"42",X"11",X"20",X"42",X"ED",X"B8",X"6F",X"DD",X"7E",X"00",X"FD",X"77",X"00",X"DD",X"7E", + X"01",X"FD",X"77",X"01",X"DD",X"7E",X"02",X"FD",X"77",X"02",X"C9",X"21",X"67",X"40",X"06",X"07", + X"ED",X"5B",X"F2",X"41",X"1A",X"4F",X"FE",X"80",X"20",X"09",X"AF",X"21",X"F0",X"41",X"77",X"2C", + X"77",X"18",X"10",X"11",X"04",X"00",X"79",X"86",X"77",X"19",X"10",X"FA",X"2A",X"F2",X"41",X"23", + X"22",X"F2",X"41",X"CD",X"94",X"11",X"C9",X"CD",X"6B",X"12",X"C9",X"3A",X"F9",X"41",X"A7",X"20", + X"37",X"3A",X"F5",X"41",X"A7",X"C0",X"21",X"F1",X"41",X"7E",X"A7",X"C0",X"3A",X"85",X"42",X"A7", + X"C8",X"2B",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"3A",X"06",X"40",X"A7",X"C8",X"3A",X"10",X"40", + X"47",X"AF",X"21",X"0F",X"40",X"B6",X"20",X"0D",X"2D",X"B6",X"28",X"09",X"2D",X"7E",X"A7",X"28", + X"04",X"3A",X"11",X"40",X"47",X"CB",X"58",X"C8",X"21",X"86",X"42",X"7E",X"4F",X"FE",X"0C",X"38", + X"02",X"36",X"00",X"34",X"21",X"17",X"13",X"3A",X"80",X"42",X"E6",X"01",X"20",X"03",X"21",X"24", + X"13",X"79",X"E7",X"21",X"65",X"40",X"11",X"04",X"00",X"06",X"07",X"77",X"19",X"10",X"FC",X"3E", + X"80",X"32",X"F0",X"41",X"3E",X"01",X"32",X"F1",X"41",X"21",X"F2",X"12",X"22",X"F2",X"41",X"CD", + X"DC",X"0B",X"AF",X"32",X"F9",X"41",X"21",X"85",X"42",X"7E",X"A7",X"28",X"01",X"35",X"16",X"08", + X"FF",X"C9",X"FA",X"FC",X"FD",X"FE",X"FE",X"FF",X"FF",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"01",X"00",X"01",X"01",X"01", + X"01",X"02",X"02",X"03",X"04",X"06",X"80",X"1D",X"9D",X"1F",X"9F",X"1E",X"5E",X"20",X"A0",X"1E", + X"9F",X"1D",X"9D",X"5E",X"27",X"29",X"26",X"76",X"27",X"29",X"26",X"27",X"28",X"A8",X"76",X"36", + X"26",X"11",X"A4",X"40",X"3A",X"0D",X"40",X"A7",X"28",X"03",X"11",X"A7",X"40",X"DD",X"21",X"87", + X"42",X"21",X"6F",X"13",X"3A",X"00",X"40",X"E6",X"02",X"20",X"03",X"21",X"7E",X"13",X"4E",X"06", + X"00",X"23",X"1A",X"ED",X"B1",X"28",X"04",X"DD",X"70",X"00",X"C9",X"DD",X"7E",X"00",X"A7",X"C0", + X"DD",X"36",X"00",X"FF",X"21",X"88",X"42",X"34",X"CD",X"14",X"0B",X"16",X"01",X"FF",X"C9",X"0E", + X"03",X"10",X"17",X"24",X"31",X"38",X"45",X"52",X"59",X"66",X"73",X"80",X"87",X"94",X"0C",X"05", + X"13",X"21",X"29",X"37",X"45",X"53",X"61",X"69",X"77",X"85",X"93",X"3A",X"5F",X"42",X"E6",X"01", + X"C0",X"CD",X"AB",X"13",X"21",X"48",X"46",X"35",X"C0",X"3E",X"04",X"32",X"0A",X"40",X"CD",X"B6", + X"13",X"CD",X"8D",X"14",X"CD",X"1E",X"11",X"CD",X"53",X"15",X"C9",X"06",X"1C",X"0E",X"03",X"CD", + X"94",X"24",X"0C",X"10",X"FA",X"C9",X"DD",X"21",X"B0",X"45",X"3A",X"80",X"42",X"FE",X"03",X"38", + X"02",X"3E",X"03",X"21",X"E4",X"13",X"E7",X"47",X"21",X"14",X"16",X"3A",X"80",X"42",X"E6",X"0F", + X"87",X"5F",X"16",X"00",X"19",X"5E",X"23",X"56",X"EB",X"11",X"18",X"00",X"CD",X"E8",X"13",X"DD", + X"19",X"10",X"F9",X"C9",X"04",X"04",X"05",X"06",X"7E",X"DD",X"77",X"06",X"23",X"7E",X"DD",X"77", + X"05",X"23",X"7E",X"DD",X"77",X"04",X"23",X"7E",X"DD",X"77",X"03",X"23",X"DD",X"36",X"00",X"01", + X"D9",X"21",X"57",X"34",X"3A",X"80",X"42",X"E6",X"01",X"20",X"03",X"21",X"13",X"34",X"DD",X"75", + X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00",X"CD",X"1B",X"32",X"D9",X"AF",X"DD",X"77",X"01", + X"DD",X"77",X"02",X"C9",X"DD",X"21",X"C8",X"45",X"21",X"34",X"16",X"87",X"87",X"E7",X"CD",X"E8", + X"13",X"CD",X"B9",X"2D",X"DD",X"36",X"09",X"20",X"DD",X"36",X"0A",X"E0",X"C9",X"7E",X"DD",X"77", + X"06",X"23",X"7E",X"DD",X"77",X"05",X"23",X"7E",X"DD",X"77",X"04",X"23",X"7E",X"DD",X"77",X"03", + X"23",X"DD",X"36",X"00",X"01",X"D9",X"21",X"2A",X"19",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD", + X"36",X"0E",X"00",X"CD",X"1B",X"32",X"D9",X"AF",X"DD",X"77",X"01",X"DD",X"77",X"02",X"C9",X"DD", + X"21",X"B0",X"45",X"21",X"B4",X"17",X"87",X"87",X"E7",X"CD",X"3D",X"14",X"C9",X"5A",X"4D",X"40", + X"33",X"26",X"19",X"0C",X"0A",X"08",X"06",X"04",X"02",X"02",X"02",X"02",X"02",X"3A",X"80",X"42", + X"FE",X"10",X"38",X"02",X"3E",X"0F",X"21",X"7D",X"14",X"E7",X"32",X"26",X"41",X"AF",X"32",X"81", + X"41",X"3E",X"84",X"32",X"86",X"45",X"3E",X"EC",X"32",X"84",X"45",X"DD",X"21",X"80",X"45",X"3A", + X"80",X"42",X"E6",X"01",X"21",X"D4",X"17",X"28",X"03",X"21",X"18",X"18",X"DD",X"75",X"0C",X"DD", + X"74",X"0D",X"AF",X"DD",X"77",X"0E",X"CD",X"1B",X"32",X"3E",X"01",X"32",X"9A",X"45",X"32",X"99", + X"45",X"3E",X"E4",X"32",X"AA",X"45",X"3E",X"EC",X"32",X"AB",X"45",X"3E",X"01",X"32",X"50",X"43", + X"DD",X"21",X"98",X"45",X"3A",X"80",X"42",X"E6",X"01",X"21",X"89",X"18",X"28",X"03",X"21",X"CD", + X"18",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"AF",X"DD",X"77",X"0E",X"CD",X"1B",X"32",X"C9",X"A7", + X"C8",X"08",X"21",X"CC",X"17",X"3A",X"80",X"42",X"E6",X"01",X"28",X"03",X"21",X"10",X"18",X"08", + X"1E",X"FF",X"0F",X"1C",X"30",X"FC",X"7B",X"DD",X"21",X"80",X"45",X"CD",X"2B",X"2C",X"DD",X"73", + X"0C",X"DD",X"72",X"0D",X"AF",X"DD",X"77",X"0E",X"C9",X"A7",X"C8",X"08",X"21",X"54",X"18",X"3A", + X"80",X"42",X"E6",X"01",X"28",X"03",X"21",X"98",X"18",X"08",X"1E",X"FF",X"0F",X"1C",X"30",X"FC", + X"7B",X"DD",X"21",X"98",X"45",X"CD",X"2B",X"2C",X"DD",X"73",X"0C",X"DD",X"72",X"0D",X"AF",X"DD", + X"77",X"0E",X"C9",X"3A",X"80",X"42",X"E6",X"07",X"21",X"59",X"19",X"CD",X"2B",X"2C",X"ED",X"53", + X"12",X"41",X"3A",X"80",X"42",X"E6",X"01",X"C8",X"DD",X"21",X"60",X"4B",X"3E",X"07",X"32",X"44", + X"43",X"AF",X"32",X"45",X"43",X"CD",X"97",X"15",X"DD",X"23",X"21",X"45",X"43",X"34",X"7E",X"FE", + X"20",X"38",X"F2",X"36",X"00",X"01",X"40",X"FF",X"DD",X"09",X"3A",X"44",X"43",X"C6",X"05",X"32", + X"44",X"43",X"FE",X"1E",X"38",X"DF",X"C9",X"CD",X"A1",X"15",X"3C",X"C8",X"3D",X"CD",X"ED",X"15", + X"C9",X"CD",X"72",X"24",X"2A",X"12",X"41",X"3A",X"47",X"43",X"E7",X"3A",X"46",X"43",X"A6",X"EB", + X"3E",X"FF",X"C8",X"21",X"C0",X"42",X"3A",X"47",X"43",X"E7",X"3A",X"46",X"43",X"4F",X"A6",X"3E", + X"FF",X"C8",X"06",X"00",X"D5",X"FD",X"E1",X"79",X"FD",X"A6",X"FC",X"28",X"02",X"CB",X"D8",X"79", + X"FD",X"A6",X"F8",X"28",X"02",X"CB",X"D0",X"79",X"FD",X"A6",X"F4",X"28",X"02",X"CB",X"C8",X"79", + X"FD",X"A6",X"F0",X"28",X"02",X"CB",X"C0",X"78",X"21",X"04",X"16",X"E7",X"C9",X"ED",X"47",X"E6", + X"F0",X"0F",X"0F",X"0F",X"0F",X"DD",X"77",X"00",X"ED",X"57",X"E6",X"0F",X"DD",X"77",X"E0",X"AF", + X"DD",X"77",X"C0",X"C9",X"70",X"50",X"45",X"40",X"38",X"35",X"33",X"30",X"28",X"25",X"23",X"20", + X"18",X"15",X"13",X"10",X"34",X"16",X"4C",X"16",X"64",X"16",X"7C",X"16",X"94",X"16",X"AC",X"16", + X"C4",X"16",X"DC",X"16",X"F4",X"16",X"0C",X"17",X"24",X"17",X"3C",X"17",X"54",X"17",X"6C",X"17", + X"84",X"17",X"9C",X"17",X"03",X"00",X"04",X"00",X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00", + X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00",X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00", + X"08",X"00",X"08",X"00",X"0D",X"00",X"0B",X"00",X"12",X"00",X"0E",X"00",X"17",X"00",X"10",X"00", + X"03",X"00",X"0D",X"00",X"12",X"00",X"04",X"00",X"12",X"00",X"08",X"00",X"12",X"00",X"0B",X"00", + X"12",X"00",X"11",X"00",X"12",X"00",X"17",X"00",X"03",X"00",X"10",X"00",X"03",X"00",X"04",X"00", + X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00",X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00", + X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00",X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00", + X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00",X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00", + X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00",X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00", + X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00",X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00", + X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00",X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00", + X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00",X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00", + X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00",X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00", + X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00",X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00", + X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00",X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00", + X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00",X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00", + X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00",X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00", + X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00",X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00", + X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00",X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00", + X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00",X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00", + X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00",X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00", + X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00",X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00", + X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00",X"1C",X"00",X"04",X"00",X"03",X"00",X"04",X"00", + X"08",X"00",X"04",X"00",X"0D",X"00",X"04",X"00",X"12",X"00",X"04",X"00",X"17",X"00",X"04",X"00", + X"1C",X"00",X"04",X"00",X"03",X"00",X"1D",X"00",X"08",X"00",X"1D",X"00",X"0D",X"00",X"1D",X"00", + X"12",X"00",X"1D",X"00",X"17",X"00",X"1D",X"00",X"1C",X"00",X"1D",X"00",X"01",X"18",X"F2",X"17", + X"E3",X"17",X"D4",X"17",X"04",X"30",X"08",X"04",X"31",X"08",X"04",X"32",X"08",X"04",X"33",X"08", + X"FF",X"D4",X"17",X"04",X"B0",X"08",X"04",X"B1",X"08",X"04",X"B2",X"08",X"04",X"B3",X"08",X"FF", + X"E3",X"17",X"04",X"2E",X"08",X"04",X"2F",X"08",X"04",X"2E",X"08",X"04",X"2F",X"08",X"FF",X"F2", + X"17",X"04",X"2E",X"08",X"04",X"2F",X"08",X"04",X"2E",X"08",X"04",X"2F",X"08",X"FF",X"01",X"18", + X"45",X"18",X"36",X"18",X"27",X"18",X"18",X"18",X"07",X"F4",X"08",X"07",X"F5",X"08",X"07",X"F4", + X"08",X"07",X"F5",X"08",X"FF",X"18",X"18",X"07",X"34",X"08",X"07",X"35",X"08",X"07",X"34",X"08", + X"07",X"35",X"08",X"FF",X"27",X"18",X"07",X"E4",X"08",X"07",X"E5",X"08",X"07",X"E4",X"08",X"07", + X"E5",X"08",X"FF",X"36",X"18",X"07",X"24",X"08",X"07",X"25",X"08",X"07",X"24",X"08",X"07",X"25", + X"08",X"FF",X"45",X"18",X"89",X"18",X"7A",X"18",X"6B",X"18",X"5C",X"18",X"07",X"2A",X"08",X"07", + X"2B",X"08",X"07",X"2C",X"08",X"07",X"2D",X"08",X"FF",X"5C",X"18",X"07",X"2A",X"08",X"07",X"2B", + X"08",X"07",X"2C",X"08",X"07",X"2D",X"08",X"FF",X"6B",X"18",X"07",X"2A",X"08",X"07",X"2B",X"08", + X"07",X"2C",X"08",X"07",X"2D",X"08",X"FF",X"7A",X"18",X"07",X"2A",X"08",X"07",X"2B",X"08",X"07", + X"2C",X"08",X"07",X"2D",X"08",X"FF",X"89",X"18",X"CD",X"18",X"BE",X"18",X"AF",X"18",X"A0",X"18", + X"07",X"22",X"08",X"07",X"23",X"08",X"07",X"22",X"08",X"07",X"23",X"08",X"FF",X"A0",X"18",X"07", + X"22",X"08",X"07",X"23",X"08",X"07",X"22",X"08",X"07",X"23",X"08",X"FF",X"AF",X"18",X"07",X"22", + X"08",X"07",X"23",X"08",X"07",X"22",X"08",X"07",X"23",X"08",X"FF",X"BE",X"18",X"07",X"22",X"08", + X"07",X"23",X"08",X"07",X"22",X"08",X"07",X"23",X"08",X"FF",X"CD",X"18",X"11",X"09",X"19",X"3A", + X"80",X"42",X"E6",X"01",X"28",X"03",X"11",X"15",X"19",X"DD",X"21",X"80",X"45",X"DD",X"73",X"0C", + X"DD",X"72",X"0D",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"11",X"35",X"3E",X"FF",X"32",X"4F",X"43", + X"36",X"00",X"2C",X"36",X"01",X"2C",X"36",X"09",X"C9",X"04",X"39",X"10",X"04",X"3A",X"10",X"04", + X"3B",X"20",X"FF",X"09",X"19",X"07",X"3D",X"07",X"07",X"3E",X"07",X"07",X"3F",X"07",X"07",X"7D", + X"07",X"07",X"7E",X"07",X"07",X"7F",X"07",X"FF",X"15",X"19",X"05",X"21",X"08",X"05",X"21",X"08", + X"05",X"21",X"08",X"05",X"21",X"08",X"FF",X"2A",X"19",X"52",X"01",X"4A",X"01",X"52",X"01",X"46", + X"01",X"5A",X"01",X"42",X"01",X"66",X"01",X"4A",X"01",X"6E",X"1A",X"EE",X"19",X"6E",X"1A",X"EE", + X"1A",X"6E",X"1B",X"EE",X"1B",X"6E",X"1C",X"EE",X"1C",X"6E",X"1E",X"EE",X"1D",X"6E",X"1E",X"EE", + X"1E",X"6E",X"1F",X"EE",X"1F",X"6E",X"20",X"EE",X"20",X"20",X"48",X"70",X"98",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FC",X"10",X"84", + X"44",X"24",X"10",X"84",X"44",X"24",X"10",X"84",X"44",X"24",X"10",X"84",X"44",X"24",X"1F",X"FF", + X"FF",X"FC",X"12",X"21",X"00",X"44",X"12",X"21",X"00",X"44",X"12",X"21",X"00",X"44",X"12",X"21", + X"00",X"44",X"1F",X"FF",X"FF",X"FC",X"10",X"84",X"48",X"24",X"10",X"84",X"48",X"24",X"10",X"84", + X"48",X"24",X"10",X"84",X"48",X"24",X"1F",X"FF",X"FF",X"FC",X"12",X"21",X"04",X"44",X"12",X"21", + X"04",X"44",X"12",X"21",X"04",X"44",X"12",X"21",X"04",X"44",X"1F",X"FF",X"FF",X"FC",X"10",X"84", + X"10",X"24",X"10",X"84",X"10",X"24",X"10",X"84",X"10",X"24",X"10",X"84",X"10",X"24",X"1F",X"FF", + X"FF",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FC",X"10",X"92", + X"41",X"24",X"10",X"92",X"41",X"24",X"10",X"92",X"41",X"24",X"10",X"92",X"41",X"24",X"1F",X"FF", + X"FF",X"FC",X"12",X"41",X"24",X"84",X"12",X"41",X"24",X"84",X"12",X"41",X"24",X"84",X"12",X"41", + X"24",X"84",X"1F",X"FF",X"FF",X"FC",X"10",X"82",X"49",X"24",X"10",X"82",X"49",X"24",X"10",X"82", + X"49",X"24",X"10",X"82",X"49",X"24",X"1F",X"FF",X"FF",X"FC",X"12",X"49",X"24",X"84",X"12",X"49", + X"24",X"84",X"12",X"49",X"24",X"84",X"12",X"49",X"24",X"84",X"1F",X"FF",X"FF",X"FC",X"10",X"92", + X"49",X"24",X"10",X"92",X"49",X"24",X"10",X"92",X"49",X"24",X"10",X"92",X"49",X"24",X"1F",X"FF", + X"FF",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FC",X"14",X"94", + X"41",X"24",X"14",X"94",X"41",X"24",X"14",X"94",X"41",X"24",X"14",X"94",X"41",X"24",X"1F",X"FF", + X"FF",X"FC",X"12",X"41",X"24",X"84",X"12",X"41",X"24",X"84",X"12",X"41",X"24",X"84",X"12",X"41", + X"24",X"84",X"1F",X"FF",X"FF",X"FC",X"10",X"82",X"49",X"24",X"10",X"82",X"49",X"24",X"10",X"82", + X"49",X"24",X"10",X"82",X"49",X"24",X"1F",X"FF",X"FF",X"FC",X"12",X"49",X"24",X"84",X"12",X"49", + X"24",X"84",X"12",X"49",X"24",X"84",X"12",X"49",X"24",X"84",X"1F",X"FF",X"FF",X"FC",X"14",X"92", + X"49",X"24",X"14",X"92",X"49",X"24",X"14",X"92",X"49",X"24",X"14",X"92",X"49",X"24",X"1F",X"FF", + X"FF",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FC",X"11",X"12", + X"42",X"44",X"11",X"12",X"42",X"44",X"11",X"12",X"42",X"44",X"11",X"12",X"42",X"44",X"1F",X"FF", + X"FF",X"FC",X"12",X"41",X"24",X"84",X"12",X"41",X"24",X"84",X"12",X"41",X"24",X"84",X"12",X"41", + X"24",X"84",X"1F",X"FF",X"FF",X"FC",X"10",X"92",X"48",X"44",X"10",X"92",X"48",X"44",X"10",X"92", + X"48",X"44",X"10",X"92",X"48",X"44",X"1F",X"FF",X"FF",X"FC",X"12",X"49",X"24",X"84",X"12",X"49", + X"24",X"84",X"12",X"49",X"24",X"84",X"12",X"49",X"24",X"84",X"1F",X"FF",X"FF",X"FC",X"11",X"12", + X"11",X"24",X"11",X"12",X"11",X"24",X"11",X"12",X"11",X"24",X"11",X"12",X"11",X"24",X"1F",X"FF", + X"FF",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FC",X"12",X"94", + X"41",X"24",X"12",X"94",X"41",X"24",X"12",X"94",X"41",X"24",X"12",X"94",X"41",X"24",X"1F",X"FF", + X"FF",X"FC",X"14",X"41",X"24",X"84",X"14",X"41",X"24",X"84",X"14",X"41",X"24",X"84",X"14",X"41", + X"24",X"84",X"1F",X"FF",X"FF",X"FC",X"11",X"22",X"49",X"24",X"11",X"22",X"49",X"24",X"11",X"22", + X"49",X"24",X"11",X"22",X"49",X"24",X"1F",X"FF",X"FF",X"FC",X"12",X"89",X"24",X"84",X"12",X"89", + X"24",X"84",X"12",X"89",X"24",X"84",X"12",X"89",X"24",X"84",X"1F",X"FF",X"FF",X"FC",X"15",X"52", + X"48",X"54",X"15",X"52",X"48",X"54",X"15",X"52",X"48",X"54",X"15",X"52",X"48",X"54",X"1F",X"FF", + X"FF",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FC",X"12",X"12", + X"41",X"24",X"12",X"12",X"41",X"24",X"12",X"12",X"41",X"24",X"12",X"12",X"41",X"24",X"1F",X"FF", + X"FF",X"FC",X"10",X"89",X"24",X"84",X"10",X"89",X"24",X"84",X"10",X"89",X"24",X"84",X"10",X"89", + X"24",X"84",X"1F",X"FF",X"FF",X"FC",X"11",X"22",X"41",X"24",X"11",X"22",X"41",X"24",X"11",X"22", + X"41",X"24",X"11",X"22",X"41",X"24",X"1F",X"FF",X"FF",X"FC",X"10",X"89",X"24",X"84",X"10",X"89", + X"24",X"84",X"10",X"89",X"24",X"84",X"10",X"89",X"24",X"84",X"1F",X"FF",X"FF",X"FC",X"12",X"12", + X"41",X"24",X"12",X"12",X"41",X"24",X"12",X"12",X"41",X"24",X"12",X"12",X"41",X"24",X"1F",X"FF", + X"FF",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FC",X"14",X"94", + X"51",X"24",X"14",X"94",X"51",X"24",X"14",X"94",X"51",X"24",X"14",X"94",X"51",X"24",X"1F",X"FF", + X"FF",X"FC",X"12",X"41",X"2A",X"94",X"12",X"41",X"2A",X"94",X"12",X"41",X"2A",X"94",X"12",X"41", + X"2A",X"94",X"1F",X"FF",X"FF",X"FC",X"14",X"8A",X"41",X"24",X"14",X"8A",X"41",X"24",X"14",X"8A", + X"41",X"24",X"14",X"8A",X"41",X"24",X"1F",X"FF",X"FF",X"FC",X"12",X"45",X"24",X"94",X"12",X"45", + X"24",X"94",X"12",X"45",X"24",X"94",X"12",X"45",X"24",X"94",X"1F",X"FF",X"FF",X"FC",X"14",X"92", + X"49",X"24",X"14",X"92",X"49",X"24",X"14",X"92",X"49",X"24",X"14",X"92",X"49",X"24",X"1F",X"FF", + X"FF",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FC",X"10",X"92", + X"42",X"44",X"10",X"92",X"42",X"44",X"10",X"92",X"42",X"44",X"10",X"92",X"42",X"44",X"1F",X"FF", + X"FF",X"FC",X"12",X"48",X"89",X"24",X"12",X"48",X"89",X"24",X"12",X"48",X"89",X"24",X"12",X"48", + X"89",X"24",X"1F",X"FF",X"FF",X"FC",X"10",X"92",X"42",X"44",X"10",X"92",X"42",X"44",X"10",X"92", + X"42",X"44",X"10",X"92",X"42",X"44",X"1F",X"FF",X"FF",X"FC",X"12",X"48",X"89",X"24",X"12",X"48", + X"89",X"24",X"12",X"48",X"89",X"24",X"12",X"48",X"89",X"24",X"1F",X"FF",X"FF",X"FC",X"10",X"92", + X"42",X"44",X"10",X"92",X"42",X"44",X"10",X"92",X"42",X"44",X"10",X"92",X"42",X"44",X"1F",X"FF", + X"FF",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"08",X"88",X"48",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"42", + X"01",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"08",X"90",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"42",X"09",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"08",X"20",X"48",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"24",X"80",X"48",X"00",X"04", + X"00",X"08",X"00",X"24",X"00",X"48",X"00",X"00",X"84",X"48",X"02",X"24",X"84",X"48",X"00",X"80", + X"01",X"10",X"04",X"84",X"09",X"10",X"00",X"00",X"00",X"10",X"00",X"00",X"49",X"00",X"04",X"84", + X"49",X"10",X"00",X"00",X"02",X"48",X"00",X"08",X"12",X"08",X"00",X"00",X"00",X"48",X"00",X"00", + X"92",X"48",X"02",X"08",X"92",X"48",X"00",X"82",X"01",X"10",X"04",X"90",X"08",X"10",X"00",X"10", + X"01",X"10",X"00",X"02",X"49",X"00",X"04",X"92",X"49",X"10",X"02",X"20",X"80",X"48",X"00",X"24", + X"10",X"08",X"00",X"24",X"02",X"48",X"00",X"00",X"92",X"48",X"02",X"24",X"92",X"48",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"28",X"82",X"48",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"82", + X"49",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"04",X"92",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"92",X"49",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"24",X"92",X"48",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"24",X"80",X"88",X"00",X"04", + X"00",X"08",X"00",X"24",X"08",X"08",X"00",X"00",X"80",X"88",X"02",X"24",X"88",X"88",X"00",X"80", + X"01",X"00",X"04",X"80",X"09",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"49",X"00",X"04",X"84", + X"49",X"10",X"00",X"00",X"00",X"08",X"00",X"20",X"10",X"08",X"02",X"00",X"00",X"00",X"00",X"00", + X"91",X"08",X"02",X"24",X"91",X"08",X"00",X"82",X"01",X"10",X"04",X"90",X"08",X"10",X"00",X"10", + X"01",X"10",X"00",X"02",X"49",X"00",X"04",X"92",X"49",X"10",X"02",X"20",X"00",X"48",X"00",X"24", + X"40",X"08",X"00",X"24",X"02",X"48",X"00",X"00",X"02",X"48",X"02",X"24",X"42",X"48",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"28",X"82",X"48",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"82", + X"49",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"02",X"44",X"92",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"12",X"49",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"A4",X"90",X"A8",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"20",X"80",X"48",X"04",X"00", + X"00",X"08",X"00",X"20",X"00",X"48",X"00",X"04",X"84",X"48",X"04",X"24",X"84",X"48",X"02",X"12", + X"09",X"10",X"00",X"10",X"48",X"10",X"00",X"10",X"01",X"10",X"00",X"02",X"49",X"00",X"02",X"12", + X"49",X"10",X"00",X"00",X"04",X"48",X"02",X"40",X"84",X"08",X"00",X"40",X"00",X"48",X"00",X"04", + X"80",X"48",X"02",X"44",X"84",X"48",X"02",X"12",X"09",X"10",X"00",X"10",X"48",X"10",X"00",X"10", + X"01",X"10",X"00",X"02",X"49",X"00",X"02",X"12",X"49",X"10",X"04",X"20",X"80",X"48",X"04",X"00", + X"00",X"08",X"00",X"20",X"00",X"48",X"00",X"04",X"84",X"48",X"04",X"24",X"84",X"48",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"28",X"A2",X"48",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"82", + X"55",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"09",X"14",X"82",X"48",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"8A",X"49",X"28",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"09",X"24",X"92",X"48",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"24",X"80",X"80",X"00",X"04", + X"08",X"00",X"00",X"24",X"00",X"88",X"00",X"00",X"88",X"88",X"02",X"24",X"88",X"88",X"00",X"80", + X"10",X"08",X"04",X"90",X"00",X"48",X"00",X"10",X"02",X"48",X"00",X"01",X"12",X"48",X"04",X"91", + X"12",X"48",X"00",X"24",X"08",X"08",X"00",X"24",X"00",X"08",X"00",X"04",X"00",X"80",X"00",X"00", + X"88",X"88",X"02",X"24",X"88",X"88",X"00",X"82",X"10",X"08",X"04",X"90",X"00",X"48",X"00",X"10", + X"02",X"48",X"00",X"01",X"12",X"48",X"04",X"91",X"12",X"48",X"02",X"24",X"80",X"80",X"00",X"04", + X"08",X"00",X"00",X"24",X"00",X"88",X"00",X"00",X"88",X"88",X"02",X"24",X"88",X"88",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C4",X"21", + X"D1",X"21",X"E5",X"21",X"F2",X"21",X"FF",X"21",X"0C",X"22",X"1B",X"22",X"2D",X"22",X"34",X"22", + X"46",X"22",X"4C",X"22",X"53",X"22",X"5A",X"22",X"69",X"22",X"7B",X"22",X"7B",X"22",X"7B",X"22", + X"7B",X"22",X"8C",X"22",X"A5",X"22",X"AA",X"22",X"AF",X"22",X"B4",X"22",X"C7",X"22",X"D3",X"22", + X"E5",X"22",X"FA",X"22",X"0E",X"23",X"21",X"23",X"34",X"23",X"47",X"23",X"5A",X"23",X"6D",X"23", + X"80",X"23",X"93",X"23",X"A6",X"23",X"B9",X"23",X"CC",X"23",X"E0",X"23",X"F1",X"23",X"02",X"24", + X"0E",X"24",X"2A",X"24",X"96",X"4A",X"47",X"41",X"4D",X"45",X"40",X"40",X"4F",X"56",X"45",X"52", + X"3F",X"EE",X"4A",X"50",X"55",X"53",X"48",X"40",X"53",X"54",X"41",X"52",X"54",X"40",X"42",X"55", + X"54",X"54",X"4F",X"4E",X"3F",X"94",X"4A",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E", + X"45",X"3F",X"94",X"4A",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"54",X"57",X"4F",X"3F",X"80", + X"4A",X"48",X"49",X"47",X"48",X"40",X"53",X"43",X"4F",X"52",X"45",X"3F",X"9F",X"4B",X"40",X"43", + X"52",X"45",X"44",X"49",X"54",X"40",X"40",X"40",X"40",X"40",X"3F",X"9F",X"4B",X"40",X"40",X"46", + X"52",X"45",X"45",X"40",X"50",X"4C",X"41",X"59",X"40",X"40",X"40",X"40",X"3F",X"5E",X"4B",X"46", + X"55",X"45",X"4C",X"3F",X"CC",X"4A",X"43",X"4F",X"4E",X"47",X"52",X"41",X"54",X"55",X"4C",X"41", + X"54",X"49",X"4F",X"4E",X"53",X"3F",X"6E",X"4B",X"59",X"4F",X"55",X"3F",X"9F",X"49",X"4A",X"55", + X"4D",X"50",X"3F",X"26",X"4A",X"50",X"4C",X"41",X"59",X"3F",X"A9",X"4A",X"5B",X"40",X"40",X"41", + X"4D",X"49",X"44",X"41",X"52",X"40",X"40",X"5B",X"3F",X"C7",X"4A",X"5B",X"40",X"40",X"43",X"48", + X"41",X"52",X"41",X"43",X"54",X"45",X"52",X"40",X"40",X"5B",X"3F",X"BC",X"4A",X"3A",X"40",X"4B", + X"4F",X"4E",X"41",X"4D",X"49",X"40",X"40",X"31",X"39",X"38",X"32",X"3F",X"54",X"4B",X"40",X"54", + X"48",X"45",X"40",X"40",X"41",X"4D",X"49",X"44",X"41",X"52",X"40",X"40",X"53",X"59",X"53",X"54", + X"45",X"4D",X"40",X"3B",X"3F",X"D5",X"4A",X"32",X"40",X"3F",X"D5",X"4A",X"33",X"40",X"3F",X"D5", + X"4A",X"31",X"40",X"3F",X"75",X"4B",X"31",X"53",X"54",X"40",X"42",X"4F",X"4E",X"55",X"53",X"40", + X"41",X"46",X"54",X"45",X"52",X"40",X"3F",X"75",X"49",X"35",X"30",X"30",X"30",X"30",X"40",X"50", + X"54",X"53",X"3F",X"D1",X"4A",X"4F",X"4E",X"45",X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"40", + X"4F",X"4E",X"4C",X"59",X"3F",X"F1",X"4A",X"4F",X"4E",X"45",X"40",X"4F",X"52",X"40",X"54",X"57", + X"4F",X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"3F",X"04",X"4B",X"5B",X"40",X"53",X"43", + X"4F",X"52",X"45",X"40",X"52",X"41",X"4E",X"4B",X"49",X"4E",X"47",X"40",X"5B",X"3F",X"27",X"4B", + X"31",X"53",X"54",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50",X"54",X"53", + X"3F",X"29",X"4B",X"32",X"4E",X"44",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"50",X"54",X"53",X"3F",X"2B",X"4B",X"33",X"52",X"44",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"50",X"54",X"53",X"3F",X"2D",X"4B",X"34",X"54",X"48",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"50",X"54",X"53",X"3F",X"2F",X"4B",X"35",X"54",X"48",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50",X"54",X"53",X"3F",X"31",X"4B",X"36", + X"54",X"48",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50",X"54",X"53",X"3F", + X"33",X"4B",X"37",X"54",X"48",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50", + X"54",X"53",X"3F",X"35",X"4B",X"38",X"54",X"48",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"50",X"54",X"53",X"3F",X"37",X"4B",X"39",X"54",X"48",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"50",X"54",X"53",X"3F",X"39",X"4B",X"31",X"30",X"54",X"48",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50",X"54",X"53",X"3F",X"F4",X"4A",X"50",X"55", + X"53",X"48",X"40",X"4A",X"55",X"4D",X"50",X"40",X"40",X"42",X"55",X"54",X"54",X"4F",X"4E",X"3F", + X"A8",X"4A",X"40",X"42",X"4F",X"4E",X"55",X"53",X"40",X"40",X"53",X"54",X"41",X"47",X"45",X"40", + X"3F",X"6F",X"4A",X"3E",X"3E",X"3E",X"3E",X"40",X"35",X"30",X"30",X"30",X"40",X"50",X"54",X"53", + X"40",X"3F",X"75",X"49",X"33",X"30",X"30",X"30",X"30",X"40",X"50",X"54",X"53",X"3F",X"78",X"4B", + X"41",X"4E",X"44",X"40",X"42",X"4F",X"4E",X"55",X"53",X"40",X"45",X"56",X"45",X"52",X"59",X"40", + X"37",X"30",X"30",X"30",X"30",X"40",X"50",X"54",X"53",X"3F",X"78",X"4B",X"41",X"4E",X"44",X"40", + X"42",X"4F",X"4E",X"55",X"53",X"40",X"45",X"56",X"45",X"52",X"59",X"40",X"38",X"30",X"30",X"30", + X"30",X"40",X"50",X"54",X"53",X"3F",X"3A",X"40",X"43",X"0F",X"0F",X"0F",X"E6",X"1F",X"67",X"32", + X"44",X"43",X"3A",X"41",X"43",X"6F",X"0F",X"0F",X"0F",X"E6",X"1F",X"32",X"45",X"43",X"E6",X"07", + X"D9",X"21",X"69",X"00",X"85",X"6F",X"7E",X"D9",X"32",X"46",X"43",X"29",X"29",X"7C",X"32",X"47", + X"43",X"C9",X"3A",X"44",X"43",X"87",X"87",X"67",X"3A",X"45",X"43",X"6F",X"E6",X"07",X"D9",X"21", + X"69",X"00",X"85",X"6F",X"7E",X"D9",X"32",X"46",X"43",X"7D",X"0F",X"0F",X"0F",X"E6",X"03",X"84", + X"32",X"47",X"43",X"C9",X"3A",X"80",X"42",X"E6",X"01",X"CA",X"2A",X"25",X"C5",X"CD",X"A2",X"24", + X"C1",X"C9",X"3A",X"48",X"46",X"32",X"44",X"43",X"79",X"E6",X"1F",X"32",X"45",X"43",X"CD",X"72", + X"24",X"2A",X"BB",X"40",X"3A",X"47",X"43",X"E7",X"E5",X"DD",X"E1",X"21",X"C0",X"42",X"3A",X"47", + X"43",X"E7",X"E5",X"FD",X"E1",X"06",X"00",X"3A",X"46",X"43",X"4F",X"DD",X"A6",X"00",X"28",X"02", + X"CB",X"F0",X"79",X"FD",X"A6",X"00",X"28",X"02",X"CB",X"D0",X"79",X"DD",X"A6",X"04",X"28",X"02", + X"CB",X"E0",X"79",X"FD",X"A6",X"04",X"28",X"02",X"CB",X"C0",X"79",X"07",X"4F",X"30",X"04",X"DD", + X"2B",X"FD",X"2B",X"DD",X"A6",X"00",X"28",X"02",X"CB",X"E8",X"79",X"FD",X"A6",X"00",X"28",X"02", + X"CB",X"C8",X"79",X"FD",X"A6",X"04",X"28",X"02",X"CB",X"D8",X"21",X"22",X"3B",X"78",X"E7",X"47", + X"3A",X"44",X"43",X"2F",X"E6",X"1F",X"87",X"87",X"87",X"6F",X"26",X"00",X"29",X"29",X"3A",X"45", + X"43",X"85",X"6F",X"78",X"01",X"00",X"48",X"09",X"77",X"C9",X"C5",X"CD",X"30",X"25",X"C1",X"C9", + X"3A",X"48",X"46",X"32",X"44",X"43",X"79",X"E6",X"1F",X"32",X"45",X"43",X"CD",X"72",X"24",X"2A", + X"BB",X"40",X"3A",X"47",X"43",X"E7",X"E5",X"DD",X"E1",X"21",X"C0",X"42",X"3A",X"47",X"43",X"E7", + X"E5",X"FD",X"E1",X"06",X"00",X"3A",X"46",X"43",X"4F",X"DD",X"A6",X"00",X"28",X"02",X"CB",X"F0", + X"79",X"FD",X"A6",X"00",X"28",X"02",X"CB",X"D0",X"79",X"DD",X"A6",X"04",X"28",X"02",X"CB",X"E0", + X"79",X"FD",X"A6",X"04",X"28",X"02",X"CB",X"C0",X"79",X"07",X"4F",X"30",X"04",X"DD",X"2B",X"FD", + X"2B",X"DD",X"A6",X"00",X"28",X"02",X"CB",X"E8",X"79",X"FD",X"A6",X"00",X"28",X"02",X"CB",X"C8", + X"79",X"DD",X"A6",X"04",X"28",X"02",X"CB",X"F8",X"79",X"FD",X"A6",X"04",X"28",X"02",X"CB",X"D8", + X"78",X"21",X"22",X"3A",X"E7",X"47",X"3A",X"44",X"43",X"2F",X"E6",X"1F",X"87",X"87",X"87",X"6F", + X"26",X"00",X"29",X"29",X"3A",X"45",X"43",X"85",X"6F",X"78",X"01",X"00",X"48",X"09",X"77",X"C9", + X"21",X"33",X"3F",X"E5",X"3A",X"4F",X"43",X"A7",X"C2",X"94",X"26",X"3A",X"06",X"40",X"A7",X"CA", + X"AE",X"3D",X"AF",X"32",X"53",X"43",X"CD",X"36",X"2C",X"CA",X"9C",X"26",X"3A",X"4A",X"43",X"4F", + X"E6",X"03",X"20",X"46",X"AF",X"32",X"53",X"43",X"3A",X"86",X"45",X"E6",X"07",X"FE",X"04",X"20", + X"03",X"32",X"53",X"43",X"78",X"B9",X"28",X"20",X"78",X"B1",X"FE",X"0C",X"28",X"1A",X"3A",X"53", + X"43",X"A7",X"20",X"1D",X"78",X"CD",X"E4",X"26",X"28",X"04",X"3E",X"04",X"18",X"57",X"78",X"CD", + X"0A",X"27",X"28",X"4A",X"3E",X"08",X"18",X"4D",X"3A",X"53",X"43",X"A7",X"20",X"03",X"78",X"18", + X"44",X"78",X"CD",X"C8",X"26",X"28",X"37",X"78",X"18",X"3B",X"AF",X"32",X"53",X"43",X"3A",X"84", + X"45",X"E6",X"07",X"FE",X"04",X"20",X"03",X"32",X"53",X"43",X"78",X"B9",X"28",X"DA",X"78",X"B1", + X"FE",X"03",X"28",X"D4",X"3A",X"53",X"43",X"A7",X"20",X"D7",X"78",X"CD",X"2E",X"27",X"28",X"04", + X"3E",X"02",X"18",X"11",X"78",X"CD",X"54",X"27",X"28",X"04",X"3E",X"01",X"18",X"07",X"79",X"CD", + X"C8",X"26",X"28",X"38",X"79",X"5F",X"21",X"4A",X"43",X"BE",X"D9",X"C4",X"FF",X"14",X"D9",X"7E", + X"A7",X"20",X"01",X"7B",X"32",X"54",X"43",X"73",X"7B",X"CD",X"A0",X"26",X"E5",X"D5",X"C5",X"CD", + X"C4",X"3B",X"C1",X"D1",X"E1",X"3A",X"40",X"43",X"32",X"86",X"45",X"3A",X"41",X"43",X"32",X"84", + X"45",X"CD",X"5D",X"28",X"DD",X"21",X"80",X"45",X"CD",X"1B",X"32",X"C9",X"CD",X"C4",X"3B",X"C9", + X"CD",X"76",X"2C",X"3A",X"86",X"45",X"5F",X"3A",X"4B",X"43",X"83",X"32",X"40",X"43",X"3A",X"84", + X"45",X"5F",X"3A",X"4C",X"43",X"83",X"32",X"41",X"43",X"CD",X"46",X"24",X"2A",X"BB",X"40",X"3A", + X"47",X"43",X"E7",X"3A",X"46",X"43",X"A6",X"C9",X"CD",X"A6",X"2C",X"3A",X"86",X"45",X"5F",X"3A", + X"4B",X"43",X"83",X"32",X"40",X"43",X"3A",X"84",X"45",X"5F",X"3A",X"4C",X"43",X"83",X"32",X"41", + X"43",X"C3",X"B9",X"26",X"CD",X"A6",X"2C",X"3A",X"86",X"45",X"E6",X"FC",X"C6",X"04",X"CB",X"57", + X"20",X"02",X"C6",X"04",X"5F",X"3A",X"4B",X"43",X"83",X"32",X"40",X"43",X"3A",X"84",X"45",X"5F", + X"3A",X"4C",X"43",X"83",X"32",X"41",X"43",X"C3",X"B9",X"26",X"CD",X"A6",X"2C",X"3A",X"86",X"45", + X"E6",X"FC",X"CB",X"57",X"20",X"02",X"D6",X"04",X"5F",X"3A",X"4B",X"43",X"83",X"32",X"40",X"43", + X"3A",X"84",X"45",X"5F",X"3A",X"4C",X"43",X"83",X"32",X"41",X"43",X"C3",X"B9",X"26",X"CD",X"A6", + X"2C",X"3A",X"86",X"45",X"5F",X"3A",X"4B",X"43",X"83",X"32",X"40",X"43",X"3A",X"84",X"45",X"E6", + X"FC",X"C6",X"04",X"CB",X"57",X"20",X"02",X"C6",X"04",X"5F",X"3A",X"4C",X"43",X"83",X"32",X"41", + X"43",X"C3",X"B9",X"26",X"CD",X"A6",X"2C",X"3A",X"86",X"45",X"5F",X"3A",X"4B",X"43",X"83",X"32", + X"40",X"43",X"3A",X"84",X"45",X"E6",X"FC",X"CB",X"57",X"20",X"02",X"D6",X"04",X"5F",X"3A",X"4C", + X"43",X"83",X"32",X"41",X"43",X"C3",X"B9",X"26",X"3A",X"52",X"43",X"3C",X"C0",X"3A",X"53",X"43", + X"A7",X"C8",X"3A",X"86",X"45",X"32",X"40",X"43",X"3A",X"84",X"45",X"32",X"41",X"43",X"CD",X"46", + X"24",X"21",X"C0",X"42",X"3A",X"47",X"43",X"E7",X"3A",X"46",X"43",X"A6",X"C8",X"2F",X"A6",X"77", + X"CD",X"AE",X"24",X"21",X"45",X"43",X"34",X"CD",X"AE",X"24",X"21",X"45",X"43",X"35",X"2B",X"35", + X"CD",X"AE",X"24",X"2A",X"81",X"42",X"7C",X"B5",X"C8",X"2B",X"22",X"81",X"42",X"11",X"01",X"03", + X"FF",X"CD",X"F8",X"0A",X"C9",X"3A",X"53",X"43",X"A7",X"C8",X"3A",X"86",X"45",X"32",X"40",X"43", + X"3A",X"84",X"45",X"32",X"41",X"43",X"CD",X"46",X"24",X"21",X"C0",X"42",X"3A",X"47",X"43",X"E7", + X"3A",X"46",X"43",X"A6",X"C8",X"2F",X"A6",X"77",X"CD",X"3C",X"25",X"21",X"45",X"43",X"34",X"CD", + X"3C",X"25",X"21",X"45",X"43",X"35",X"2B",X"35",X"CD",X"3C",X"25",X"2A",X"81",X"42",X"7C",X"B5", + X"C8",X"2B",X"22",X"81",X"42",X"11",X"01",X"03",X"FF",X"CD",X"F8",X"0A",X"C9",X"3A",X"CE",X"45", + X"32",X"44",X"43",X"3A",X"CC",X"45",X"32",X"45",X"43",X"CD",X"72",X"24",X"21",X"C0",X"42",X"3A", + X"47",X"43",X"E7",X"3A",X"46",X"43",X"A6",X"C8",X"2F",X"A6",X"77",X"CD",X"3F",X"28",X"21",X"45", + X"43",X"34",X"CD",X"3F",X"28",X"21",X"45",X"43",X"35",X"2B",X"35",X"CD",X"3F",X"28",X"C9",X"3A", + X"06",X"40",X"A7",X"28",X"0C",X"3A",X"45",X"43",X"FE",X"05",X"D8",X"FE",X"1D",X"D0",X"C3",X"AE", + X"24",X"3A",X"45",X"43",X"FE",X"0C",X"D8",X"FE",X"1A",X"D0",X"C3",X"AE",X"24",X"3A",X"80",X"42", + X"E6",X"01",X"CA",X"C5",X"27",X"21",X"78",X"27",X"E5",X"3A",X"53",X"43",X"A7",X"C8",X"21",X"C0", + X"42",X"3A",X"47",X"43",X"CD",X"24",X"2C",X"3A",X"46",X"43",X"A6",X"28",X"62",X"3A",X"52",X"43", + X"FE",X"01",X"38",X"6A",X"C8",X"CD",X"BD",X"29",X"21",X"41",X"44",X"7E",X"23",X"BE",X"38",X"01", + X"77",X"CD",X"2D",X"2A",X"21",X"41",X"45",X"7E",X"23",X"BE",X"38",X"01",X"77",X"3A",X"40",X"44", + X"3C",X"C0",X"3A",X"40",X"45",X"3C",X"C0",X"3A",X"80",X"42",X"E6",X"01",X"C8",X"3A",X"42",X"44", + X"21",X"42",X"45",X"BE",X"30",X"11",X"CD",X"9D",X"29",X"3A",X"42",X"45",X"2A",X"81",X"42",X"CD", + X"24",X"2C",X"22",X"81",X"42",X"18",X"0F",X"CD",X"7D",X"29",X"3A",X"42",X"44",X"2A",X"81",X"42", + X"CD",X"24",X"2C",X"22",X"81",X"42",X"3E",X"01",X"32",X"52",X"43",X"CD",X"CB",X"11",X"C9",X"3A", + X"52",X"43",X"FE",X"01",X"D8",X"28",X"02",X"18",X"9C",X"AF",X"32",X"52",X"43",X"C9",X"3A",X"54", + X"43",X"A7",X"C8",X"06",X"FF",X"04",X"0F",X"30",X"FC",X"78",X"E6",X"03",X"21",X"2D",X"29",X"CD", + X"2B",X"2C",X"EB",X"22",X"60",X"43",X"23",X"23",X"23",X"23",X"23",X"22",X"62",X"43",X"CD",X"CB", + X"11",X"CD",X"9D",X"2A",X"CD",X"23",X"2B",X"3E",X"FF",X"32",X"52",X"43",X"3A",X"40",X"44",X"FE", + X"01",X"CA",X"1F",X"2A",X"3A",X"40",X"45",X"FE",X"01",X"CA",X"8F",X"2A",X"C9",X"49",X"29",X"53", + X"29",X"3F",X"29",X"35",X"29",X"08",X"02",X"04",X"01",X"08",X"08",X"01",X"04",X"02",X"08",X"04", + X"01",X"08",X"02",X"04",X"04",X"02",X"08",X"01",X"04",X"01",X"08",X"02",X"04",X"01",X"01",X"04", + X"02",X"08",X"01",X"02",X"04",X"01",X"08",X"02",X"02",X"08",X"01",X"04",X"02",X"21",X"C0",X"42", + X"3A",X"47",X"43",X"E7",X"3A",X"46",X"43",X"B6",X"77",X"CD",X"AE",X"24",X"21",X"45",X"43",X"34", + X"CD",X"AE",X"24",X"21",X"45",X"43",X"35",X"2B",X"35",X"CD",X"AE",X"24",X"C9",X"21",X"42",X"44", + X"7E",X"A7",X"C8",X"47",X"23",X"23",X"C5",X"7E",X"32",X"40",X"43",X"23",X"7E",X"32",X"41",X"43", + X"23",X"E5",X"CD",X"46",X"24",X"CD",X"5D",X"29",X"E1",X"C1",X"10",X"EA",X"C9",X"21",X"42",X"45", + X"7E",X"A7",X"C8",X"47",X"23",X"23",X"C5",X"7E",X"32",X"40",X"43",X"23",X"7E",X"32",X"41",X"43", + X"23",X"E5",X"CD",X"46",X"24",X"CD",X"5D",X"29",X"E1",X"C1",X"10",X"EA",X"C9",X"21",X"40",X"44", + X"7E",X"A7",X"C8",X"3C",X"C8",X"23",X"34",X"7E",X"3C",X"CD",X"23",X"2C",X"3A",X"84",X"45",X"E6", + X"F8",X"BE",X"2B",X"20",X"11",X"3A",X"86",X"45",X"E6",X"F8",X"BE",X"20",X"09",X"21",X"40",X"44", + X"7E",X"23",X"BE",X"C0",X"18",X"39",X"3A",X"41",X"44",X"3D",X"32",X"41",X"44",X"2B",X"3A",X"84", + X"45",X"E6",X"F8",X"BE",X"2B",X"20",X"07",X"3A",X"86",X"45",X"E6",X"F8",X"BE",X"C8",X"3A",X"41", + X"44",X"D6",X"01",X"38",X"14",X"32",X"41",X"44",X"2B",X"3A",X"84",X"45",X"E6",X"F8",X"BE",X"2B", + X"20",X"07",X"3A",X"86",X"45",X"E6",X"F8",X"BE",X"C8",X"21",X"40",X"44",X"36",X"FF",X"C9",X"CD", + X"CB",X"11",X"CD",X"5D",X"28",X"AF",X"32",X"52",X"43",X"CD",X"2C",X"0B",X"C9",X"21",X"40",X"45", + X"7E",X"A7",X"C8",X"3C",X"C8",X"23",X"34",X"7E",X"3C",X"CD",X"23",X"2C",X"3A",X"84",X"45",X"E6", + X"F8",X"BE",X"2B",X"20",X"11",X"3A",X"86",X"45",X"E6",X"F8",X"BE",X"20",X"09",X"21",X"40",X"45", + X"7E",X"23",X"BE",X"C0",X"18",X"39",X"3A",X"41",X"45",X"3D",X"32",X"41",X"45",X"2B",X"3A",X"84", + X"45",X"E6",X"F8",X"BE",X"2B",X"20",X"07",X"3A",X"86",X"45",X"E6",X"F8",X"BE",X"C8",X"3A",X"41", + X"45",X"D6",X"01",X"38",X"14",X"32",X"41",X"45",X"2B",X"3A",X"84",X"45",X"E6",X"F8",X"BE",X"2B", + X"20",X"07",X"3A",X"86",X"45",X"E6",X"F8",X"BE",X"C8",X"21",X"40",X"45",X"36",X"FF",X"C9",X"CD", + X"CB",X"11",X"CD",X"5D",X"28",X"AF",X"32",X"52",X"43",X"CD",X"2C",X"0B",X"C9",X"3A",X"86",X"45", + X"E6",X"F8",X"32",X"64",X"43",X"3A",X"84",X"45",X"E6",X"F8",X"32",X"65",X"43",X"DD",X"2A",X"60", + X"43",X"01",X"00",X"00",X"DD",X"7E",X"00",X"CD",X"D6",X"2C",X"DD",X"7E",X"01",X"CD",X"E6",X"2C", + X"21",X"44",X"44",X"22",X"68",X"43",X"2A",X"68",X"43",X"0C",X"3A",X"64",X"43",X"77",X"23",X"3A", + X"65",X"43",X"77",X"23",X"22",X"68",X"43",X"CD",X"E6",X"2B",X"20",X"1E",X"CD",X"A9",X"2B",X"28", + X"2B",X"04",X"78",X"FE",X"08",X"30",X"25",X"2A",X"40",X"43",X"22",X"64",X"43",X"21",X"C0",X"42", + X"7A",X"CD",X"24",X"2C",X"7B",X"A6",X"28",X"20",X"18",X"CC",X"06",X"00",X"DD",X"23",X"2A",X"6A", + X"43",X"22",X"4B",X"43",X"DD",X"7E",X"01",X"CD",X"E6",X"2C",X"18",X"DB",X"21",X"40",X"44",X"36", + X"FF",X"23",X"36",X"00",X"23",X"36",X"00",X"C9",X"21",X"40",X"44",X"71",X"23",X"36",X"01",X"23", + X"36",X"01",X"C9",X"3A",X"86",X"45",X"E6",X"F8",X"32",X"64",X"43",X"3A",X"84",X"45",X"E6",X"F8", + X"32",X"65",X"43",X"DD",X"2A",X"62",X"43",X"01",X"00",X"00",X"DD",X"7E",X"00",X"CD",X"D6",X"2C", + X"DD",X"7E",X"01",X"CD",X"E6",X"2C",X"21",X"44",X"45",X"22",X"68",X"43",X"2A",X"68",X"43",X"0C", + X"3A",X"64",X"43",X"77",X"23",X"3A",X"65",X"43",X"77",X"23",X"22",X"68",X"43",X"CD",X"E6",X"2B", + X"20",X"1E",X"CD",X"A9",X"2B",X"28",X"2B",X"04",X"78",X"FE",X"08",X"30",X"25",X"2A",X"40",X"43", + X"22",X"64",X"43",X"21",X"C0",X"42",X"7A",X"CD",X"24",X"2C",X"7B",X"A6",X"28",X"20",X"18",X"CC", + X"06",X"00",X"DD",X"23",X"2A",X"6A",X"43",X"22",X"4B",X"43",X"DD",X"7E",X"01",X"CD",X"E6",X"2C", + X"18",X"DB",X"21",X"40",X"45",X"36",X"FF",X"23",X"36",X"00",X"23",X"36",X"00",X"C9",X"21",X"40", + X"45",X"71",X"23",X"36",X"01",X"23",X"36",X"01",X"C9",X"3A",X"65",X"43",X"57",X"3A",X"4C",X"43", + X"82",X"57",X"32",X"41",X"43",X"3A",X"64",X"43",X"5F",X"3A",X"4B",X"43",X"83",X"32",X"40",X"43", + X"0F",X"0F",X"0F",X"E6",X"1F",X"67",X"7A",X"6F",X"0F",X"0F",X"0F",X"E6",X"07",X"D9",X"21",X"69", + X"00",X"85",X"6F",X"7E",X"D9",X"5F",X"29",X"29",X"7C",X"57",X"2A",X"BB",X"40",X"85",X"6F",X"3E", + X"00",X"8C",X"67",X"7B",X"A6",X"C9",X"3A",X"65",X"43",X"57",X"3A",X"6B",X"43",X"82",X"57",X"32", + X"41",X"43",X"3A",X"64",X"43",X"5F",X"3A",X"6A",X"43",X"83",X"32",X"40",X"43",X"0F",X"0F",X"0F", + X"E6",X"1F",X"67",X"7A",X"6F",X"0F",X"0F",X"0F",X"E6",X"07",X"D9",X"21",X"69",X"00",X"85",X"6F", + X"7E",X"D9",X"5F",X"29",X"29",X"7C",X"57",X"2A",X"BB",X"40",X"85",X"6F",X"3E",X"00",X"8C",X"67", + X"7B",X"A6",X"C9",X"87",X"85",X"6F",X"3E",X"00",X"8C",X"67",X"C9",X"87",X"85",X"6F",X"3E",X"00", + X"8C",X"67",X"5E",X"23",X"56",X"C9",X"3A",X"1E",X"40",X"A7",X"20",X"22",X"3A",X"10",X"40",X"0F", + X"0F",X"0F",X"0F",X"E6",X"03",X"47",X"3A",X"12",X"40",X"07",X"07",X"CB",X"10",X"07",X"07",X"CB", + X"10",X"78",X"E6",X"0C",X"20",X"03",X"78",X"E6",X"03",X"47",X"32",X"48",X"43",X"C9",X"3A",X"11", + X"40",X"0F",X"0F",X"0F",X"0F",X"E6",X"03",X"47",X"3A",X"12",X"40",X"0F",X"CB",X"10",X"3A",X"10", + X"40",X"0F",X"CB",X"10",X"18",X"DB",X"21",X"86",X"2C",X"CD",X"23",X"2C",X"7E",X"32",X"4B",X"43", + X"23",X"7E",X"32",X"4C",X"43",X"C9",X"00",X"00",X"00",X"FF",X"00",X"01",X"00",X"00",X"01",X"00", + X"01",X"FF",X"01",X"01",X"00",X"00",X"FF",X"00",X"FF",X"FF",X"FF",X"01",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"B6",X"2C",X"CD",X"23",X"2C",X"7E",X"32",X"4B",X"43", + X"23",X"7E",X"32",X"4C",X"43",X"C9",X"00",X"00",X"00",X"FB",X"00",X"05",X"00",X"00",X"05",X"00", + X"05",X"FB",X"05",X"05",X"00",X"00",X"FB",X"00",X"FB",X"FB",X"FB",X"05",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"F6",X"2C",X"CD",X"23",X"2C",X"7E",X"32",X"4B",X"43", + X"23",X"7E",X"32",X"4C",X"43",X"C9",X"21",X"F6",X"2C",X"CD",X"23",X"2C",X"7E",X"32",X"6A",X"43", + X"23",X"7E",X"32",X"6B",X"43",X"C9",X"00",X"00",X"00",X"F8",X"00",X"08",X"00",X"00",X"08",X"00", + X"08",X"F8",X"08",X"08",X"00",X"00",X"F8",X"00",X"F8",X"F8",X"F8",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"3A",X"F1",X"41",X"A7",X"C0",X"06",X"07",X"DD",X"21",X"64", + X"40",X"3A",X"60",X"40",X"6F",X"3A",X"63",X"40",X"67",X"DD",X"7E",X"00",X"95",X"30",X"02",X"ED", + X"44",X"FE",X"07",X"30",X"3D",X"DD",X"7E",X"03",X"94",X"30",X"02",X"ED",X"44",X"FE",X"07",X"30", + X"31",X"48",X"3E",X"08",X"90",X"47",X"21",X"82",X"45",X"11",X"18",X"00",X"19",X"10",X"FD",X"41", + X"4F",X"7E",X"FE",X"01",X"20",X"1C",X"3A",X"F5",X"41",X"A7",X"20",X"0F",X"2B",X"2B",X"CD",X"DC", + X"18",X"CD",X"A0",X"0B",X"CD",X"0C",X"0B",X"CD",X"A7",X"28",X"C9",X"79",X"32",X"F4",X"41",X"CD", + X"10",X"0B",X"11",X"04",X"00",X"DD",X"19",X"10",X"A8",X"C9",X"DD",X"21",X"98",X"45",X"11",X"18", + X"00",X"06",X"07",X"D9",X"CD",X"93",X"2D",X"D9",X"DD",X"19",X"10",X"F7",X"CD",X"51",X"32",X"CD", + X"55",X"33",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"E6",X"1F", + X"EF",X"E0",X"2D",X"F9",X"2D",X"30",X"30",X"31",X"30",X"6D",X"30",X"25",X"31",X"26",X"31",X"7A", + X"31",X"8F",X"31",X"8F",X"31",X"AD",X"31",X"E9",X"31",X"21",X"CD",X"33",X"3A",X"80",X"42",X"FE", + X"10",X"38",X"02",X"3E",X"10",X"85",X"30",X"01",X"24",X"6F",X"7E",X"DD",X"77",X"09",X"ED",X"44", + X"DD",X"77",X"0A",X"AF",X"DD",X"77",X"0E",X"DD",X"77",X"0B",X"3E",X"03",X"DD",X"77",X"07",X"C9", + X"21",X"57",X"34",X"3A",X"80",X"42",X"E6",X"01",X"20",X"03",X"21",X"13",X"34",X"DD",X"75",X"0C", + X"DD",X"74",X"0D",X"CD",X"B9",X"2D",X"DD",X"34",X"02",X"DD",X"CB",X"01",X"46",X"C0",X"CD",X"1B", + X"32",X"CD",X"EA",X"31",X"DD",X"7E",X"07",X"EF",X"10",X"2E",X"3C",X"2E",X"71",X"2E",X"A4",X"2E", + X"DD",X"7E",X"05",X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"06",X"DD",X"77",X"05",X"47",X"DD", + X"7E",X"0B",X"A7",X"28",X"04",X"DD",X"35",X"0B",X"C9",X"78",X"E6",X"E0",X"28",X"03",X"FE",X"20", + X"C0",X"DD",X"36",X"0B",X"03",X"CD",X"BE",X"34",X"CD",X"C3",X"2F",X"C9",X"DD",X"7E",X"0A",X"ED", + X"44",X"47",X"DD",X"7E",X"03",X"B8",X"30",X"03",X"DD",X"35",X"04",X"DD",X"86",X"0A",X"DD",X"77", + X"03",X"47",X"DD",X"7E",X"0B",X"A7",X"28",X"04",X"DD",X"35",X"0B",X"C9",X"78",X"E6",X"E0",X"FE", + X"C0",X"28",X"03",X"FE",X"E0",X"C0",X"DD",X"36",X"0B",X"03",X"CD",X"BE",X"34",X"CD",X"82",X"2F", + X"C9",X"DD",X"7E",X"0A",X"ED",X"44",X"47",X"DD",X"7E",X"05",X"B8",X"30",X"03",X"DD",X"35",X"06", + X"DD",X"86",X"0A",X"DD",X"77",X"05",X"47",X"DD",X"7E",X"0B",X"A7",X"28",X"04",X"DD",X"35",X"0B", + X"C9",X"78",X"E6",X"E0",X"28",X"03",X"FE",X"20",X"C0",X"DD",X"36",X"0B",X"03",X"CD",X"BE",X"34", + X"CD",X"FC",X"2F",X"C9",X"DD",X"7E",X"03",X"DD",X"86",X"09",X"30",X"03",X"DD",X"34",X"04",X"DD", + X"77",X"03",X"47",X"DD",X"7E",X"0B",X"A7",X"28",X"04",X"DD",X"35",X"0B",X"C9",X"78",X"E6",X"E0", + X"FE",X"C0",X"28",X"03",X"FE",X"E0",X"C0",X"DD",X"36",X"0B",X"03",X"CD",X"BE",X"34",X"CD",X"D2", + X"2E",X"C9",X"78",X"21",X"66",X"34",X"85",X"6F",X"30",X"01",X"24",X"7E",X"A7",X"C8",X"3D",X"21", + X"11",X"2F",X"E5",X"EF",X"EE",X"2E",X"F2",X"2E",X"F7",X"2E",X"FB",X"2E",X"FF",X"2E",X"AF",X"06", + X"03",X"C9",X"3E",X"02",X"06",X"03",X"C9",X"3E",X"02",X"47",X"C9",X"AF",X"06",X"02",X"C9",X"DD", + X"36",X"12",X"01",X"DD",X"CB",X"06",X"46",X"28",X"04",X"3E",X"02",X"47",X"C9",X"AF",X"06",X"02", + X"C9",X"DD",X"77",X"07",X"DD",X"70",X"08",X"C9",X"4F",X"DD",X"CB",X"01",X"46",X"20",X"1C",X"21", + X"22",X"34",X"3A",X"80",X"42",X"E6",X"01",X"20",X"03",X"21",X"DE",X"33",X"79",X"CD",X"2B",X"2C", + X"DD",X"73",X"0C",X"DD",X"72",X"0D",X"DD",X"36",X"0E",X"00",X"C9",X"21",X"6B",X"18",X"3A",X"80", + X"42",X"E6",X"01",X"28",X"03",X"21",X"AF",X"18",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD",X"36", + X"0E",X"00",X"DD",X"6E",X"03",X"DD",X"66",X"04",X"29",X"29",X"29",X"7C",X"D6",X"02",X"32",X"AB", + X"45",X"DD",X"6E",X"05",X"DD",X"66",X"06",X"29",X"29",X"29",X"7C",X"C6",X"03",X"32",X"AA",X"45", + X"21",X"AB",X"45",X"7E",X"FE",X"EC",X"D8",X"36",X"EC",X"21",X"50",X"43",X"36",X"04",X"23",X"36", + X"03",X"C9",X"78",X"21",X"75",X"34",X"85",X"6F",X"30",X"01",X"24",X"7E",X"A7",X"C8",X"3D",X"21", + X"11",X"2F",X"E5",X"EF",X"9E",X"2F",X"A2",X"2F",X"A7",X"2F",X"AC",X"2F",X"B0",X"2F",X"AF",X"06", + X"01",X"C9",X"3E",X"02",X"06",X"01",X"C9",X"3E",X"02",X"06",X"03",X"C9",X"AF",X"06",X"03",X"C9", + X"DD",X"36",X"12",X"01",X"DD",X"CB",X"06",X"46",X"28",X"05",X"3E",X"02",X"06",X"03",X"C9",X"AF", + X"06",X"03",X"C9",X"78",X"21",X"84",X"34",X"85",X"6F",X"30",X"01",X"24",X"7E",X"A7",X"C8",X"3D", + X"21",X"11",X"2F",X"E5",X"EF",X"DB",X"2F",X"E1",X"2F",X"F1",X"2F",X"DD",X"7E",X"08",X"06",X"00", + X"C9",X"DD",X"7E",X"12",X"A7",X"20",X"05",X"3E",X"03",X"06",X"00",X"C9",X"DD",X"35",X"12",X"F1", + X"C9",X"DD",X"7E",X"12",X"A7",X"20",X"F5",X"3E",X"01",X"06",X"00",X"C9",X"78",X"21",X"93",X"34", + X"85",X"6F",X"30",X"01",X"24",X"7E",X"A7",X"C8",X"3D",X"21",X"11",X"2F",X"E5",X"EF",X"14",X"30", + X"1A",X"30",X"25",X"30",X"DD",X"7E",X"08",X"06",X"02",X"C9",X"DD",X"7E",X"12",X"A7",X"20",X"CC", + X"3E",X"03",X"06",X"02",X"C9",X"DD",X"7E",X"12",X"A7",X"20",X"C1",X"3E",X"01",X"06",X"02",X"C9", + X"C9",X"CD",X"1B",X"32",X"DD",X"35",X"11",X"C0",X"DD",X"7E",X"06",X"21",X"CA",X"30",X"06",X"06", + X"BE",X"28",X"5A",X"23",X"10",X"FA",X"21",X"D0",X"30",X"3A",X"80",X"42",X"E6",X"01",X"28",X"03", + X"21",X"DF",X"30",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"11", + X"68",X"DD",X"36",X"02",X"04",X"3E",X"01",X"DD",X"86",X"04",X"DD",X"77",X"04",X"CD",X"1B",X"32", + X"3A",X"F6",X"41",X"A7",X"C0",X"DD",X"7E",X"04",X"D6",X"01",X"DD",X"77",X"04",X"DD",X"7E",X"07", + X"CD",X"18",X"2F",X"CD",X"1B",X"32",X"DD",X"36",X"02",X"01",X"DD",X"CB",X"01",X"46",X"C8",X"21", + X"26",X"41",X"7E",X"FE",X"02",X"D0",X"36",X"02",X"AF",X"32",X"81",X"41",X"C9",X"DD",X"7E",X"04", + X"FE",X"1D",X"38",X"07",X"DD",X"7E",X"03",X"FE",X"80",X"30",X"9B",X"21",X"EE",X"30",X"3A",X"80", + X"42",X"E6",X"01",X"28",X"03",X"21",X"FD",X"30",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD",X"36", + X"0E",X"00",X"DD",X"36",X"02",X"06",X"CD",X"4F",X"0B",X"C9",X"03",X"08",X"0D",X"12",X"17",X"1C", + X"05",X"28",X"0A",X"05",X"29",X"0A",X"05",X"28",X"0A",X"05",X"29",X"0A",X"FF",X"D0",X"30",X"06", + X"0B",X"0A",X"06",X"1D",X"0A",X"06",X"0B",X"0A",X"06",X"1D",X"0A",X"FF",X"DF",X"30",X"05",X"66", + X"0A",X"05",X"67",X"0A",X"05",X"66",X"0A",X"05",X"67",X"0A",X"FF",X"EE",X"30",X"06",X"20",X"0A", + X"06",X"20",X"0A",X"06",X"20",X"0A",X"06",X"20",X"0A",X"FF",X"FD",X"30",X"05",X"36",X"0D",X"05", + X"37",X"0D",X"FF",X"0C",X"31",X"06",X"5E",X"0D",X"06",X"38",X"0D",X"FF",X"15",X"31",X"01",X"40", + X"80",X"C0",X"FF",X"20",X"60",X"C9",X"CD",X"1B",X"32",X"3E",X"30",X"DD",X"86",X"03",X"DD",X"77", + X"03",X"30",X"03",X"DD",X"34",X"04",X"DD",X"7E",X"04",X"FE",X"1D",X"D8",X"DD",X"7E",X"03",X"E6", + X"E0",X"FE",X"C0",X"D8",X"DD",X"36",X"03",X"C0",X"21",X"0C",X"31",X"3A",X"80",X"42",X"E6",X"01", + X"28",X"03",X"21",X"15",X"31",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00",X"21", + X"1E",X"31",X"3A",X"F8",X"41",X"85",X"6F",X"30",X"01",X"24",X"7E",X"DD",X"77",X"11",X"DD",X"36", + X"02",X"07",X"CD",X"64",X"0B",X"21",X"F8",X"41",X"34",X"C9",X"CD",X"1B",X"32",X"3A",X"F6",X"41", + X"A7",X"C0",X"DD",X"35",X"11",X"C0",X"DD",X"7E",X"07",X"CD",X"18",X"2F",X"C3",X"86",X"30",X"21", + X"CB",X"31",X"3A",X"80",X"42",X"E6",X"01",X"20",X"03",X"21",X"DA",X"31",X"DD",X"75",X"0C",X"DD", + X"74",X"0D",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"11",X"35",X"DD",X"34",X"02",X"CD",X"1B",X"32", + X"DD",X"35",X"11",X"C0",X"AF",X"DD",X"77",X"00",X"DD",X"77",X"01",X"DD",X"77",X"07",X"DD",X"77", + X"0A",X"DD",X"77",X"14",X"DD",X"77",X"06",X"DD",X"77",X"05",X"C9",X"06",X"A0",X"09",X"06",X"1D", + X"09",X"06",X"1E",X"09",X"06",X"1F",X"09",X"FF",X"CB",X"31",X"05",X"66",X"09",X"05",X"68",X"09", + X"05",X"66",X"09",X"05",X"68",X"09",X"FF",X"DA",X"31",X"C9",X"3A",X"5F",X"42",X"E6",X"1F",X"C0", + X"21",X"10",X"41",X"7E",X"A7",X"C8",X"FE",X"01",X"28",X"02",X"35",X"C9",X"36",X"00",X"3A",X"0A", + X"40",X"FE",X"04",X"28",X"07",X"FE",X"14",X"C0",X"CD",X"40",X"0B",X"C9",X"3A",X"80",X"42",X"E6", + X"01",X"20",X"04",X"CD",X"1D",X"0B",X"C9",X"CD",X"31",X"0B",X"C9",X"DD",X"7E",X"0E",X"A7",X"28", + X"04",X"DD",X"35",X"0E",X"C9",X"DD",X"6E",X"0C",X"DD",X"66",X"0D",X"7E",X"FE",X"FF",X"28",X"15", + X"DD",X"77",X"10",X"23",X"7E",X"DD",X"77",X"0F",X"23",X"7E",X"DD",X"77",X"0E",X"23",X"DD",X"75", + X"0C",X"DD",X"74",X"0D",X"C9",X"23",X"7E",X"DD",X"77",X"0C",X"23",X"7E",X"DD",X"77",X"0D",X"18", + X"D4",X"3A",X"F5",X"41",X"A7",X"C8",X"3A",X"F4",X"41",X"A7",X"C8",X"47",X"AF",X"32",X"F4",X"41", + X"DD",X"21",X"80",X"45",X"11",X"18",X"00",X"DD",X"19",X"10",X"FC",X"21",X"F7",X"41",X"34",X"7E", + X"FE",X"07",X"28",X"2D",X"FE",X"05",X"38",X"02",X"3E",X"04",X"11",X"12",X"03",X"83",X"5F",X"FF", + X"7E",X"3D",X"FE",X"06",X"38",X"02",X"36",X"00",X"21",X"FC",X"32",X"CD",X"2B",X"2C",X"DD",X"73", + X"0C",X"DD",X"72",X"0D",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"11",X"4F",X"DD",X"36",X"02",X"03", + X"C9",X"3E",X"05",X"18",X"D5",X"DD",X"21",X"98",X"45",X"11",X"18",X"00",X"06",X"07",X"21",X"37", + X"33",X"3A",X"80",X"42",X"E6",X"01",X"28",X"03",X"21",X"46",X"33",X"DD",X"75",X"0C",X"DD",X"74", + X"0D",X"DD",X"36",X"0E",X"00",X"CD",X"1B",X"32",X"DD",X"19",X"10",X"E2",X"C9",X"DD",X"21",X"98", + X"45",X"11",X"18",X"00",X"06",X"07",X"DD",X"7E",X"02",X"FE",X"01",X"20",X"1A",X"21",X"19",X"33", + X"3A",X"80",X"42",X"E6",X"01",X"28",X"03",X"21",X"28",X"33",X"DD",X"75",X"0C",X"DD",X"74",X"0D", + X"DD",X"36",X"0E",X"00",X"CD",X"1B",X"32",X"DD",X"19",X"10",X"DB",X"C9",X"0A",X"33",X"0D",X"33", + X"10",X"33",X"13",X"33",X"13",X"33",X"13",X"33",X"16",X"33",X"06",X"18",X"60",X"06",X"19",X"60", + X"06",X"1A",X"60",X"06",X"1B",X"60",X"06",X"1C",X"60",X"03",X"2A",X"09",X"03",X"2B",X"09",X"03", + X"2C",X"09",X"06",X"2D",X"09",X"FF",X"19",X"33",X"01",X"22",X"09",X"01",X"23",X"09",X"01",X"22", + X"09",X"07",X"23",X"09",X"FF",X"28",X"33",X"03",X"2A",X"09",X"03",X"2B",X"09",X"03",X"2C",X"09", + X"03",X"2D",X"09",X"FF",X"37",X"33",X"01",X"22",X"09",X"01",X"23",X"09",X"01",X"22",X"09",X"01", + X"23",X"09",X"FF",X"46",X"33",X"3A",X"F5",X"41",X"A7",X"C8",X"3A",X"5F",X"42",X"E6",X"3F",X"C0", + X"3A",X"F6",X"41",X"A7",X"28",X"0C",X"3D",X"32",X"F6",X"41",X"28",X"06",X"FE",X"02",X"CA",X"CD", + X"32",X"C9",X"AF",X"32",X"F5",X"41",X"32",X"F4",X"41",X"32",X"F7",X"41",X"32",X"F8",X"41",X"CD", + X"CD",X"0B",X"CD",X"86",X"31",X"CD",X"FE",X"31",X"DD",X"21",X"98",X"45",X"11",X"18",X"00",X"06", + X"07",X"DD",X"7E",X"02",X"FE",X"01",X"20",X"23",X"FE",X"0A",X"28",X"1F",X"3A",X"80",X"42",X"E6", + X"01",X"20",X"1D",X"21",X"E6",X"33",X"78",X"FE",X"07",X"20",X"03",X"21",X"6B",X"18",X"DD",X"75", + X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00",X"CD",X"1B",X"32",X"DD",X"19",X"10",X"D2",X"C9", + X"21",X"2A",X"34",X"78",X"FE",X"07",X"20",X"03",X"21",X"AF",X"18",X"18",X"E1",X"20",X"20",X"22", + X"22",X"24",X"24",X"26",X"26",X"28",X"28",X"2A",X"2A",X"2C",X"2C",X"2E",X"2E",X"30",X"E6",X"33", + X"F5",X"33",X"04",X"34",X"13",X"34",X"05",X"2A",X"09",X"05",X"2B",X"09",X"05",X"2C",X"09",X"05", + X"2D",X"09",X"FF",X"E6",X"33",X"05",X"2A",X"09",X"05",X"2B",X"09",X"05",X"2C",X"09",X"05",X"2D", + X"09",X"FF",X"F5",X"33",X"05",X"2A",X"09",X"05",X"2B",X"09",X"05",X"2C",X"09",X"05",X"2D",X"09", + X"FF",X"04",X"34",X"05",X"2A",X"09",X"05",X"2B",X"09",X"05",X"2C",X"09",X"05",X"2D",X"09",X"FF", + X"13",X"34",X"2A",X"34",X"39",X"34",X"48",X"34",X"57",X"34",X"06",X"22",X"09",X"06",X"23",X"09", + X"06",X"22",X"09",X"06",X"23",X"09",X"FF",X"2A",X"34",X"06",X"22",X"09",X"06",X"23",X"09",X"06", + X"22",X"09",X"06",X"23",X"09",X"FF",X"39",X"34",X"06",X"22",X"09",X"06",X"23",X"09",X"06",X"22", + X"09",X"06",X"23",X"09",X"FF",X"48",X"34",X"06",X"22",X"09",X"06",X"23",X"09",X"06",X"22",X"09", + X"06",X"23",X"09",X"FF",X"57",X"34",X"00",X"00",X"00",X"04",X"00",X"00",X"03",X"05",X"00",X"00", + X"00",X"01",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00", + X"01",X"03",X"05",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"00",X"00", + X"02",X"02",X"01",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"03",X"00",X"02",X"00",X"01",X"00", + X"02",X"00",X"DD",X"7E",X"06",X"87",X"87",X"67",X"DD",X"7E",X"04",X"6F",X"E6",X"07",X"11",X"69", + X"00",X"83",X"5F",X"1A",X"57",X"7D",X"0F",X"0F",X"0F",X"E6",X"03",X"84",X"5F",X"C9",X"CD",X"A2", + X"34",X"2A",X"BB",X"40",X"7B",X"85",X"6F",X"30",X"01",X"24",X"E5",X"FD",X"E1",X"06",X"00",X"7A", + X"FE",X"01",X"28",X"49",X"FE",X"80",X"28",X"24",X"4F",X"79",X"FD",X"A6",X"04",X"28",X"02",X"CB", + X"C0",X"79",X"FD",X"A6",X"FC",X"28",X"02",X"CB",X"D0",X"79",X"07",X"FD",X"A6",X"00",X"28",X"02", + X"CB",X"C8",X"79",X"0F",X"FD",X"A6",X"00",X"28",X"02",X"CB",X"D8",X"C9",X"FD",X"CB",X"04",X"7E", + X"28",X"02",X"CB",X"C0",X"FD",X"CB",X"FC",X"7E",X"28",X"02",X"CB",X"D0",X"FD",X"CB",X"FF",X"46", + X"28",X"02",X"CB",X"C8",X"FD",X"CB",X"00",X"76",X"28",X"02",X"CB",X"D8",X"C9",X"FD",X"CB",X"04", + X"46",X"28",X"02",X"CB",X"C0",X"FD",X"CB",X"FC",X"46",X"28",X"02",X"CB",X"D0",X"FD",X"CB",X"00", + X"4E",X"28",X"02",X"CB",X"C8",X"FD",X"CB",X"01",X"7E",X"28",X"02",X"CB",X"D8",X"C9",X"3A",X"0C", + X"41",X"FE",X"0F",X"C8",X"3A",X"0F",X"41",X"FE",X"0F",X"C8",X"CD",X"5A",X"35",X"CD",X"AA",X"35", + X"CD",X"73",X"35",X"CD",X"F0",X"35",X"CD",X"14",X"36",X"C9",X"3A",X"10",X"40",X"0F",X"0F",X"0F", + X"21",X"09",X"41",X"CB",X"16",X"7E",X"E6",X"07",X"FE",X"01",X"C0",X"CD",X"F4",X"0A",X"3E",X"01", + X"C3",X"E0",X"35",X"3A",X"10",X"40",X"21",X"0D",X"41",X"07",X"07",X"CB",X"16",X"7E",X"E6",X"07", + X"FE",X"01",X"C0",X"EB",X"CD",X"F4",X"0A",X"21",X"06",X"41",X"34",X"EB",X"23",X"7E",X"C6",X"10", + X"77",X"47",X"23",X"7E",X"90",X"D0",X"7E",X"4F",X"E6",X"F0",X"C6",X"10",X"2B",X"ED",X"44",X"86", + X"77",X"79",X"E6",X"0F",X"FE",X"0F",X"20",X"38",X"18",X"34",X"3A",X"10",X"40",X"21",X"0A",X"41", + X"07",X"CB",X"16",X"7E",X"E6",X"07",X"FE",X"01",X"C0",X"EB",X"CD",X"F4",X"0A",X"21",X"04",X"41", + X"34",X"EB",X"23",X"7E",X"C6",X"10",X"77",X"47",X"23",X"7E",X"90",X"D0",X"7E",X"4F",X"E6",X"F0", + X"C6",X"10",X"2B",X"ED",X"44",X"86",X"77",X"79",X"E6",X"0F",X"FE",X"0F",X"20",X"02",X"3E",X"63", + X"21",X"02",X"40",X"86",X"77",X"FE",X"63",X"38",X"02",X"36",X"63",X"11",X"01",X"07",X"FF",X"C9", + X"3A",X"04",X"41",X"A7",X"C8",X"21",X"05",X"41",X"7E",X"A7",X"20",X"07",X"36",X"30",X"3C",X"32", + X"02",X"68",X"C9",X"35",X"28",X"09",X"7E",X"FE",X"18",X"C0",X"AF",X"32",X"02",X"68",X"C9",X"21", + X"04",X"41",X"35",X"C9",X"3A",X"06",X"41",X"A7",X"C8",X"21",X"07",X"41",X"7E",X"A7",X"20",X"07", + X"36",X"30",X"3C",X"32",X"02",X"68",X"C9",X"35",X"28",X"09",X"7E",X"FE",X"18",X"C0",X"AF",X"32", + X"02",X"68",X"C9",X"21",X"06",X"41",X"35",X"C9",X"7B",X"0F",X"0F",X"0F",X"E6",X"1F",X"67",X"7A", + X"6F",X"0F",X"0F",X"0F",X"E6",X"07",X"11",X"69",X"00",X"83",X"5F",X"1A",X"57",X"29",X"29",X"7C", + X"21",X"6E",X"1D",X"CD",X"24",X"2C",X"7A",X"A6",X"20",X"04",X"07",X"30",X"01",X"2B",X"1E",X"00", + X"E5",X"DD",X"E1",X"7A",X"DD",X"A6",X"FC",X"28",X"02",X"CB",X"DB",X"7A",X"DD",X"A6",X"F8",X"28", + X"02",X"CB",X"D3",X"7A",X"DD",X"A6",X"F4",X"28",X"02",X"CB",X"CB",X"7A",X"DD",X"A6",X"F0",X"28", + X"02",X"CB",X"C3",X"7B",X"C9",X"3A",X"05",X"40",X"FE",X"03",X"C0",X"3A",X"0A",X"40",X"FE",X"04", + X"D8",X"FE",X"06",X"D0",X"21",X"23",X"41",X"34",X"7E",X"FE",X"05",X"38",X"02",X"36",X"00",X"7E", + X"FE",X"01",X"38",X"0D",X"28",X"10",X"FE",X"03",X"38",X"11",X"28",X"14",X"16",X"6C",X"C3",X"83", + X"38",X"16",X"1C",X"C3",X"83",X"38",X"16",X"30",X"C3",X"83",X"38",X"16",X"44",X"C3",X"83",X"38", + X"16",X"58",X"C3",X"83",X"38",X"C9",X"2A",X"28",X"41",X"22",X"2A",X"41",X"DD",X"2A",X"32",X"41", + X"01",X"00",X"00",X"DD",X"7E",X"00",X"CD",X"63",X"38",X"DD",X"7E",X"01",X"CD",X"73",X"38",X"ED", + X"5B",X"2A",X"41",X"18",X"0C",X"A7",X"2A",X"28",X"41",X"ED",X"5B",X"2A",X"41",X"ED",X"52",X"28", + X"32",X"CD",X"26",X"38",X"20",X"1B",X"CD",X"E9",X"37",X"C8",X"04",X"78",X"FE",X"0A",X"D0",X"2A", + X"30",X"41",X"22",X"2A",X"41",X"21",X"C0",X"42",X"7A",X"CD",X"24",X"2C",X"7B",X"A6",X"C0",X"18", + X"D4",X"06",X"00",X"DD",X"23",X"2A",X"2E",X"41",X"22",X"2C",X"41",X"DD",X"7E",X"01",X"CD",X"73", + X"38",X"18",X"DC",X"3A",X"80",X"42",X"E6",X"01",X"28",X"71",X"AF",X"2A",X"34",X"41",X"54",X"5D", + X"01",X"C0",X"42",X"ED",X"42",X"22",X"34",X"41",X"ED",X"4B",X"BB",X"40",X"09",X"3A",X"20",X"41", + X"0F",X"4F",X"30",X"02",X"23",X"13",X"A6",X"28",X"07",X"79",X"07",X"4F",X"30",X"02",X"2B",X"1B", + X"D5",X"DD",X"E1",X"1E",X"00",X"79",X"2F",X"47",X"78",X"DD",X"A6",X"00",X"DD",X"77",X"00",X"78", + X"DD",X"A6",X"FC",X"DD",X"77",X"FC",X"78",X"DD",X"A6",X"F8",X"DD",X"77",X"F8",X"78",X"DD",X"A6", + X"F4",X"DD",X"77",X"F4",X"79",X"07",X"4F",X"30",X"03",X"2B",X"DD",X"2B",X"1C",X"A6",X"28",X"D5", + X"7B",X"C6",X"02",X"CD",X"E6",X"38",X"2A",X"34",X"41",X"ED",X"5B",X"12",X"41",X"19",X"3A",X"20", + X"41",X"57",X"CD",X"5E",X"36",X"C6",X"02",X"CD",X"F9",X"02",X"C9",X"AF",X"2A",X"34",X"41",X"54", + X"5D",X"01",X"C0",X"42",X"ED",X"42",X"22",X"34",X"41",X"ED",X"4B",X"BB",X"40",X"09",X"3A",X"20", + X"41",X"4F",X"D5",X"DD",X"E1",X"1E",X"00",X"79",X"2F",X"47",X"78",X"DD",X"A6",X"00",X"DD",X"77", + X"00",X"78",X"DD",X"A6",X"FC",X"DD",X"77",X"FC",X"78",X"DD",X"A6",X"F8",X"DD",X"77",X"F8",X"78", + X"DD",X"A6",X"F4",X"DD",X"77",X"F4",X"79",X"07",X"4F",X"30",X"03",X"2B",X"DD",X"2B",X"1C",X"A6", + X"28",X"D5",X"7B",X"C6",X"02",X"CD",X"E6",X"38",X"C9",X"3A",X"2B",X"41",X"57",X"3A",X"2D",X"41", + X"82",X"57",X"32",X"31",X"41",X"3A",X"2A",X"41",X"5F",X"3A",X"2C",X"41",X"83",X"32",X"30",X"41", + X"0F",X"0F",X"0F",X"E6",X"1F",X"67",X"7A",X"6F",X"0F",X"0F",X"0F",X"E6",X"07",X"D9",X"21",X"69", + X"00",X"85",X"6F",X"7E",X"D9",X"5F",X"29",X"29",X"7C",X"57",X"2A",X"BB",X"40",X"85",X"6F",X"3E", + X"00",X"8C",X"67",X"7B",X"A6",X"C9",X"3A",X"2B",X"41",X"57",X"3A",X"2F",X"41",X"82",X"57",X"32", + X"31",X"41",X"3A",X"2A",X"41",X"5F",X"3A",X"2E",X"41",X"83",X"32",X"30",X"41",X"0F",X"0F",X"0F", + X"E6",X"1F",X"67",X"7A",X"6F",X"0F",X"0F",X"0F",X"E6",X"07",X"D9",X"21",X"69",X"00",X"85",X"6F", + X"7E",X"D9",X"5F",X"29",X"29",X"7C",X"57",X"2A",X"BB",X"40",X"85",X"6F",X"3E",X"00",X"8C",X"67", + X"7B",X"A6",X"C9",X"21",X"F6",X"2C",X"CD",X"23",X"2C",X"7E",X"32",X"2C",X"41",X"23",X"7E",X"32", + X"2D",X"41",X"C9",X"21",X"F6",X"2C",X"CD",X"23",X"2C",X"7E",X"32",X"2E",X"41",X"23",X"7E",X"32", + X"2F",X"41",X"C9",X"2A",X"12",X"41",X"7A",X"E7",X"1E",X"00",X"0E",X"80",X"06",X"20",X"79",X"A6", + X"E5",X"D5",X"C5",X"C4",X"A3",X"38",X"C1",X"D1",X"E1",X"79",X"0F",X"4F",X"30",X"01",X"23",X"1C", + X"10",X"EC",X"C9",X"7B",X"0F",X"0F",X"0F",X"E6",X"03",X"82",X"21",X"C0",X"42",X"E7",X"79",X"A6", + X"C8",X"32",X"20",X"41",X"22",X"34",X"41",X"7A",X"87",X"C6",X"08",X"E6",X"F8",X"32",X"28",X"41", + X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"32",X"21",X"41",X"7B",X"C6",X"02",X"32",X"22",X"41",X"7B", + X"87",X"87",X"87",X"32",X"29",X"41",X"3E",X"00",X"21",X"2D",X"29",X"CD",X"2B",X"2C",X"EB",X"22", + X"32",X"41",X"CD",X"C6",X"36",X"C9",X"47",X"3A",X"80",X"42",X"E6",X"01",X"20",X"1A",X"C5",X"06", + X"06",X"C5",X"CD",X"9E",X"39",X"C1",X"21",X"21",X"41",X"35",X"10",X"F5",X"7E",X"C6",X"06",X"77", + X"21",X"22",X"41",X"35",X"C1",X"10",X"E7",X"C9",X"C5",X"06",X"06",X"C5",X"CD",X"22",X"39",X"C1", + X"21",X"21",X"41",X"35",X"10",X"F5",X"7E",X"C6",X"06",X"77",X"21",X"22",X"41",X"35",X"C1",X"10", + X"E7",X"C9",X"CD",X"A2",X"3B",X"2A",X"BB",X"40",X"3A",X"25",X"41",X"E7",X"E5",X"DD",X"E1",X"21", + X"C0",X"42",X"3A",X"25",X"41",X"E7",X"E5",X"FD",X"E1",X"06",X"00",X"3A",X"24",X"41",X"4F",X"DD", + X"A6",X"00",X"28",X"02",X"CB",X"F0",X"79",X"FD",X"A6",X"00",X"28",X"02",X"CB",X"D0",X"79",X"DD", + X"A6",X"04",X"28",X"02",X"CB",X"E0",X"79",X"FD",X"A6",X"04",X"28",X"02",X"CB",X"C0",X"79",X"07", + X"4F",X"30",X"04",X"DD",X"2B",X"FD",X"2B",X"DD",X"A6",X"00",X"28",X"02",X"CB",X"E8",X"79",X"FD", + X"A6",X"00",X"28",X"02",X"CB",X"C8",X"79",X"FD",X"A6",X"04",X"28",X"02",X"CB",X"D8",X"21",X"22", + X"3B",X"78",X"E7",X"47",X"3A",X"21",X"41",X"2F",X"E6",X"1F",X"87",X"87",X"87",X"6F",X"26",X"00", + X"29",X"29",X"3A",X"22",X"41",X"85",X"6F",X"78",X"01",X"00",X"48",X"09",X"77",X"C9",X"CD",X"A2", + X"3B",X"2A",X"BB",X"40",X"3A",X"25",X"41",X"E7",X"E5",X"DD",X"E1",X"21",X"C0",X"42",X"3A",X"25", + X"41",X"E7",X"E5",X"FD",X"E1",X"06",X"00",X"3A",X"24",X"41",X"4F",X"DD",X"A6",X"00",X"28",X"02", + X"CB",X"F0",X"79",X"FD",X"A6",X"00",X"28",X"02",X"CB",X"D0",X"79",X"DD",X"A6",X"04",X"28",X"02", + X"CB",X"E0",X"79",X"FD",X"A6",X"04",X"28",X"02",X"CB",X"C0",X"79",X"07",X"4F",X"30",X"04",X"DD", + X"2B",X"FD",X"2B",X"DD",X"A6",X"00",X"28",X"02",X"CB",X"E8",X"79",X"FD",X"A6",X"00",X"28",X"02", + X"CB",X"C8",X"79",X"DD",X"A6",X"04",X"28",X"02",X"CB",X"F8",X"79",X"FD",X"A6",X"04",X"28",X"02", + X"CB",X"D8",X"78",X"21",X"22",X"3A",X"E7",X"47",X"3A",X"21",X"41",X"2F",X"E6",X"1F",X"87",X"87", + X"87",X"6F",X"26",X"00",X"29",X"29",X"3A",X"22",X"41",X"85",X"6F",X"78",X"01",X"00",X"48",X"09", + X"77",X"C9",X"0D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10", + X"00",X"41",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"31",X"00",X"00", + X"00",X"43",X"5C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"34",X"47",X"00",X"00", + X"4A",X"4B",X"5D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"00",X"4F",X"00",X"51", + X"00",X"53",X"5E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"55",X"56",X"57",X"58",X"59", + X"5A",X"5B",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"0D",X"00",X"00",X"00",X"00",X"00",X"10",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"40",X"0D",X"00",X"00",X"00",X"00",X"10",X"00",X"41",X"00",X"00",X"00",X"00",X"00",X"10", + X"00",X"41",X"0D",X"00",X"00",X"00",X"10",X"40",X"41",X"42",X"00",X"00",X"00",X"00",X"10",X"40", + X"41",X"42",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"5C",X"00",X"34",X"47",X"00",X"00",X"4A",X"4B",X"00",X"00",X"34",X"47",X"00",X"00", + X"4A",X"4B",X"5D",X"38",X"00",X"4F",X"00",X"51",X"00",X"53",X"00",X"38",X"00",X"4F",X"00",X"51", + X"00",X"53",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"0D",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"0D",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"0D",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"0D",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", + X"10",X"10",X"30",X"30",X"30",X"30",X"31",X"31",X"31",X"31",X"30",X"30",X"30",X"30",X"31",X"31", + X"31",X"31",X"35",X"33",X"32",X"33",X"34",X"34",X"34",X"34",X"32",X"33",X"32",X"33",X"34",X"34", + X"34",X"34",X"39",X"36",X"37",X"37",X"38",X"38",X"38",X"38",X"36",X"36",X"37",X"37",X"38",X"38", + X"38",X"38",X"3F",X"3B",X"3C",X"3D",X"3E",X"3E",X"3E",X"3E",X"3A",X"3B",X"3C",X"3D",X"3E",X"3E", + X"3E",X"3E",X"3A",X"21",X"41",X"87",X"87",X"67",X"3A",X"22",X"41",X"6F",X"E6",X"07",X"D9",X"21", + X"69",X"00",X"85",X"6F",X"7E",X"D9",X"32",X"24",X"41",X"7D",X"0F",X"0F",X"0F",X"E6",X"03",X"84", + X"32",X"25",X"41",X"C9",X"3A",X"26",X"41",X"FE",X"01",X"28",X"26",X"D0",X"3A",X"53",X"43",X"A7", + X"C8",X"3A",X"3C",X"41",X"A7",X"28",X"79",X"3A",X"86",X"45",X"E6",X"F8",X"6F",X"3A",X"84",X"45", + X"E6",X"F8",X"67",X"3A",X"42",X"43",X"95",X"28",X"3B",X"06",X"04",X"38",X"42",X"06",X"08",X"18", + X"3E",X"21",X"38",X"41",X"36",X"00",X"23",X"36",X"00",X"23",X"3A",X"86",X"45",X"77",X"E6",X"F8", + X"4F",X"23",X"3A",X"84",X"45",X"77",X"E6",X"F8",X"47",X"ED",X"43",X"42",X"43",X"23",X"36",X"00", + X"23",X"36",X"00",X"21",X"59",X"3C",X"3A",X"80",X"42",X"FE",X"10",X"38",X"02",X"3E",X"0F",X"E7", + X"32",X"27",X"41",X"C9",X"3A",X"43",X"43",X"94",X"C8",X"06",X"02",X"38",X"02",X"06",X"01",X"0E", + X"00",X"22",X"42",X"43",X"21",X"38",X"41",X"34",X"7E",X"E6",X"7F",X"CB",X"3F",X"CB",X"11",X"C6", + X"05",X"E7",X"79",X"A7",X"20",X"02",X"70",X"C9",X"78",X"87",X"87",X"87",X"87",X"B6",X"77",X"C9", + X"CD",X"F1",X"3B",X"21",X"3C",X"41",X"36",X"FF",X"C9",X"06",X"06",X"05",X"04",X"03",X"02",X"02", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"3A",X"9A",X"45",X"FE",X"01",X"C0",X"21", + X"81",X"3D",X"E5",X"3A",X"4F",X"43",X"A7",X"C0",X"DD",X"21",X"98",X"45",X"CD",X"1B",X"32",X"3A", + X"26",X"41",X"FE",X"01",X"28",X"52",X"38",X"47",X"3A",X"50",X"43",X"E6",X"03",X"20",X"0B",X"3A", + X"AA",X"45",X"E6",X"07",X"FE",X"04",X"20",X"24",X"18",X"09",X"3A",X"AB",X"45",X"E6",X"07",X"FE", + X"04",X"20",X"19",X"3A",X"50",X"43",X"CD",X"0B",X"3F",X"20",X"11",X"21",X"51",X"43",X"7E",X"3C", + X"E6",X"03",X"77",X"21",X"ED",X"3E",X"E7",X"32",X"50",X"43",X"18",X"E7",X"3A",X"50",X"43",X"CD", + X"F1",X"3E",X"2A",X"40",X"43",X"22",X"AA",X"45",X"2A",X"41",X"43",X"22",X"AB",X"45",X"C9",X"3A", + X"81",X"41",X"A7",X"C2",X"9B",X"3E",X"18",X"10",X"AF",X"32",X"51",X"43",X"3A",X"80",X"41",X"E6", + X"3F",X"FE",X"3F",X"C0",X"CD",X"69",X"0B",X"C9",X"2A",X"3A",X"41",X"3A",X"AB",X"45",X"94",X"06", + X"01",X"30",X"04",X"06",X"02",X"ED",X"44",X"67",X"3A",X"AA",X"45",X"95",X"0E",X"08",X"30",X"04", + X"0E",X"04",X"ED",X"44",X"6F",X"B4",X"28",X"62",X"3A",X"50",X"43",X"E6",X"03",X"20",X"0B",X"3A", + X"AA",X"45",X"E6",X"07",X"FE",X"04",X"20",X"A4",X"18",X"0A",X"3A",X"AB",X"45",X"E6",X"07",X"FE", + X"04",X"C2",X"BC",X"3C",X"3A",X"51",X"43",X"A7",X"20",X"2C",X"7D",X"BC",X"30",X"14",X"78",X"32", + X"51",X"43",X"CD",X"0B",X"3F",X"20",X"28",X"79",X"32",X"50",X"43",X"CD",X"0B",X"3F",X"C2",X"BC", + X"3C",X"C9",X"79",X"32",X"51",X"43",X"CD",X"0B",X"3F",X"20",X"14",X"78",X"32",X"50",X"43",X"CD", + X"0B",X"3F",X"C2",X"BC",X"3C",X"C9",X"3A",X"51",X"43",X"CD",X"0B",X"3F",X"CA",X"BC",X"3C",X"21", + X"51",X"43",X"7E",X"36",X"00",X"2B",X"77",X"C3",X"BC",X"3C",X"3A",X"27",X"41",X"A7",X"C0",X"3E", + X"FF",X"32",X"81",X"41",X"3A",X"3D",X"41",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"32",X"50",X"43", + X"C9",X"3A",X"AA",X"45",X"2E",X"00",X"D6",X"03",X"0F",X"CB",X"1D",X"0F",X"CB",X"1D",X"0F",X"CB", + X"1D",X"E6",X"1F",X"67",X"22",X"9D",X"45",X"3A",X"AB",X"45",X"C6",X"02",X"2E",X"00",X"0F",X"CB", + X"1D",X"0F",X"CB",X"1D",X"0F",X"CB",X"1D",X"E6",X"1F",X"67",X"22",X"9B",X"45",X"C9",X"3A",X"48", + X"43",X"E6",X"03",X"20",X"0E",X"3A",X"86",X"45",X"E6",X"07",X"FE",X"04",X"20",X"1A",X"CD",X"E1", + X"3D",X"18",X"0C",X"3A",X"84",X"45",X"E6",X"07",X"FE",X"04",X"20",X"0C",X"CD",X"E1",X"3D",X"3A", + X"48",X"43",X"CD",X"C8",X"26",X"20",X"01",X"C9",X"3A",X"48",X"43",X"32",X"49",X"43",X"C3",X"65", + X"26",X"3E",X"FF",X"32",X"53",X"43",X"21",X"55",X"43",X"7E",X"3C",X"E6",X"03",X"77",X"23",X"20", + X"01",X"34",X"3C",X"87",X"47",X"4E",X"21",X"28",X"3E",X"3A",X"80",X"42",X"E6",X"01",X"28",X"03", + X"21",X"67",X"3E",X"79",X"E7",X"3A",X"55",X"43",X"A7",X"CC",X"1A",X"3E",X"7E",X"07",X"10",X"FD", + X"E6",X"03",X"21",X"ED",X"3E",X"E7",X"32",X"48",X"43",X"C9",X"7E",X"FE",X"D2",X"C0",X"3A",X"F1", + X"41",X"A7",X"C0",X"2F",X"32",X"F9",X"41",X"C9",X"FF",X"FF",X"FF",X"C0",X"55",X"6A",X"FF",X"C0", + X"00",X"00",X"00",X"00",X"00",X"01",X"55",X"AA",X"BF",X"F0",X"01",X"55",X"55",X"55",X"55",X"55", + X"55",X"AA",X"BF",X"F0",X"01",X"55",X"2A",X"D2",X"AA",X"0A",X"D2",X"AA",X"AA",X"AA",X"AA",X"FF", + X"EA",X"55",X"40",X"00",X"00",X"3F",X"F0",X"FF",X"EA",X"AF",X"FE",X"AB",X"FF",X"AA",X"80",X"FF", + X"C0",X"00",X"55",X"6A",X"AA",X"A9",X"55",X"55",X"03",X"FF",X"AB",X"FF",X"00",X"00",X"AA",X"AA", + X"55",X"5F",X"FF",X"00",X"15",X"5A",X"01",X"55",X"A8",X"00",X"3F",X"FA",X"00",X"00",X"00",X"05", + X"56",X"55",X"69",X"55",X"AA",X"AF",X"FE",X"FF",X"EA",X"55",X"6A",X"FF",X"EA",X"A5",X"54",X"00", + X"15",X"5A",X"BF",X"FA",X"A9",X"D2",X"55",X"00",X"00",X"00",X"FF",X"3A",X"50",X"43",X"E6",X"03", + X"20",X"0B",X"3A",X"AA",X"45",X"E6",X"07",X"FE",X"04",X"20",X"2F",X"18",X"09",X"3A",X"AB",X"45", + X"E6",X"07",X"FE",X"04",X"20",X"24",X"0E",X"00",X"21",X"39",X"41",X"34",X"7E",X"E6",X"7F",X"CB", + X"3F",X"CB",X"11",X"C6",X"04",X"E7",X"CB",X"19",X"38",X"07",X"E6",X"0F",X"32",X"50",X"43",X"18", + X"09",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"32",X"50",X"43",X"3A",X"50",X"43",X"CD",X"F1",X"3E", + X"3A",X"40",X"43",X"32",X"AA",X"45",X"3A",X"41",X"43",X"32",X"AB",X"45",X"C9",X"01",X"08",X"02", + X"04",X"CD",X"76",X"2C",X"3A",X"AA",X"45",X"5F",X"3A",X"4B",X"43",X"83",X"32",X"40",X"43",X"3A", + X"AB",X"45",X"5F",X"3A",X"4C",X"43",X"83",X"32",X"41",X"43",X"C9",X"CD",X"A6",X"2C",X"3A",X"AA", + X"45",X"5F",X"3A",X"4B",X"43",X"83",X"32",X"40",X"43",X"3A",X"AB",X"45",X"5F",X"3A",X"4C",X"43", + X"83",X"32",X"41",X"43",X"CD",X"46",X"24",X"2A",X"BB",X"40",X"3A",X"47",X"43",X"E7",X"3A",X"46", + X"43",X"A6",X"C9",X"3A",X"F1",X"41",X"A7",X"C0",X"3A",X"4F",X"43",X"A7",X"C0",X"3A",X"10",X"41", + X"A7",X"C0",X"21",X"89",X"42",X"7E",X"A7",X"C0",X"3A",X"2C",X"43",X"E6",X"08",X"C0",X"3A",X"2F", + X"43",X"E6",X"08",X"C0",X"3A",X"D0",X"42",X"E6",X"08",X"C0",X"3A",X"D3",X"42",X"E6",X"08",X"C0", + X"36",X"FF",X"21",X"F5",X"41",X"36",X"FF",X"23",X"36",X"0A",X"CD",X"A0",X"0B",X"CD",X"AF",X"0B", + X"CD",X"6E",X"0B",X"CD",X"A5",X"32",X"C9",X"D9",X"21",X"BE",X"41",X"11",X"BF",X"41",X"01",X"10", + X"00",X"ED",X"B8",X"21",X"BF",X"41",X"3A",X"B6",X"41",X"AE",X"32",X"AF",X"41",X"21",X"80",X"41", + X"86",X"D9",X"C9",X"21",X"9F",X"3F",X"11",X"AF",X"41",X"01",X"11",X"00",X"ED",X"B0",X"C9",X"FF", + X"05",X"F6",X"80",X"32",X"17",X"9C",X"C9",X"DD",X"21",X"74",X"98",X"FD",X"BF",X"24",X"AE",X"46", + X"FF",X"3A",X"02",X"81",X"E6",X"02",X"28",X"03",X"3E",X"B1",X"C9",X"3E",X"5F",X"C9",X"3A",X"80", + X"42",X"F5",X"21",X"02",X"82",X"7E",X"E6",X"80",X"28",X"0F",X"F1",X"C9",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F1",X"21",X"FF",X"47",X"FE",X"03",X"28", + X"05",X"F5",X"AF",X"77",X"F1",X"C9",X"F5",X"7E",X"A7",X"20",X"09",X"3A",X"02",X"40",X"C6",X"04", + X"32",X"02",X"40",X"77",X"F1",X"C9",X"31",X"FE",X"47",X"C3",X"93",X"00",X"FF",X"FF",X"FF",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_SND_0.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_SND_0.vhd new file mode 100644 index 00000000..64629f73 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_SND_0.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_SND_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_SND_0 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"21",X"00",X"80",X"06",X"00",X"C3",X"B3",X"01",X"D3",X"40",X"DB",X"80",X"C9",X"FF",X"FF",X"FF", + X"D3",X"10",X"DB",X"20",X"C9",X"FF",X"FF",X"FF",X"78",X"CF",X"79",X"D3",X"80",X"C9",X"FF",X"FF", + X"78",X"D7",X"79",X"D3",X"20",X"C9",X"FF",X"FF",X"87",X"85",X"6F",X"7C",X"CE",X"00",X"67",X"7E", + X"23",X"66",X"6F",X"E9",X"FF",X"FF",X"FF",X"FF",X"D9",X"08",X"CD",X"41",X"00",X"08",X"D9",X"FB", + X"C9",X"3E",X"0E",X"CF",X"B7",X"28",X"09",X"F2",X"7A",X"00",X"CB",X"BF",X"CD",X"6D",X"00",X"C9", + X"21",X"00",X"80",X"06",X"0C",X"AF",X"77",X"23",X"10",X"FC",X"C9",X"21",X"00",X"80",X"06",X"06", + X"0E",X"07",X"BE",X"28",X"05",X"23",X"23",X"10",X"F9",X"41",X"79",X"90",X"C9",X"CD",X"5B",X"00", + X"C8",X"AF",X"77",X"23",X"77",X"C9",X"00",X"00",X"00",X"00",X"32",X"1A",X"80",X"CD",X"5B",X"00", + X"28",X"04",X"23",X"36",X"00",X"C9",X"3A",X"1A",X"80",X"21",X"76",X"00",X"06",X"02",X"BE",X"28", + X"19",X"23",X"10",X"FA",X"06",X"02",X"BE",X"28",X"21",X"23",X"10",X"FA",X"AF",X"CD",X"5B",X"00", + X"28",X"3A",X"3A",X"1A",X"80",X"77",X"23",X"36",X"00",X"C9",X"AF",X"CD",X"5B",X"00",X"28",X"05", + X"FE",X"04",X"FA",X"CA",X"00",X"CD",X"38",X"01",X"18",X"58",X"AF",X"CD",X"5B",X"00",X"28",X"05", + X"FE",X"04",X"F2",X"CA",X"00",X"CD",X"63",X"01",X"18",X"40",X"21",X"1A",X"80",X"46",X"0E",X"00", + X"21",X"00",X"80",X"3D",X"87",X"5F",X"51",X"19",X"70",X"23",X"71",X"C9",X"CD",X"38",X"01",X"CD", + X"63",X"01",X"B7",X"28",X"2D",X"3A",X"17",X"80",X"B7",X"28",X"1F",X"3A",X"18",X"80",X"21",X"06", + X"80",X"CD",X"27",X"01",X"CD",X"2F",X"01",X"57",X"3A",X"17",X"80",X"21",X"00",X"80",X"CD",X"27", + X"01",X"CD",X"2F",X"01",X"BA",X"F2",X"0A",X"01",X"18",X"08",X"3A",X"18",X"80",X"21",X"06",X"80", + X"18",X"06",X"3A",X"17",X"80",X"21",X"00",X"80",X"B7",X"C8",X"3D",X"87",X"4F",X"06",X"00",X"09", + X"3A",X"1A",X"80",X"77",X"23",X"70",X"C9",X"3D",X"87",X"4F",X"06",X"00",X"09",X"7E",X"C9",X"21", + X"8E",X"09",X"06",X"00",X"4F",X"09",X"7E",X"C9",X"3A",X"00",X"80",X"CD",X"2F",X"01",X"32",X"12", + X"80",X"3A",X"02",X"80",X"CD",X"2F",X"01",X"32",X"13",X"80",X"3A",X"04",X"80",X"CD",X"2F",X"01", + X"32",X"14",X"80",X"3A",X"1A",X"80",X"CD",X"2F",X"01",X"32",X"15",X"80",X"CD",X"8E",X"01",X"32", + X"17",X"80",X"C9",X"3A",X"06",X"80",X"CD",X"2F",X"01",X"32",X"12",X"80",X"3A",X"08",X"80",X"CD", + X"2F",X"01",X"32",X"13",X"80",X"3A",X"0A",X"80",X"CD",X"2F",X"01",X"32",X"14",X"80",X"3A",X"1A", + X"80",X"CD",X"2F",X"01",X"32",X"15",X"80",X"CD",X"8E",X"01",X"32",X"18",X"80",X"C9",X"21",X"12", + X"80",X"3A",X"15",X"80",X"06",X"03",X"4F",X"7E",X"B9",X"F2",X"9D",X"01",X"4F",X"23",X"10",X"F7", + X"79",X"06",X"03",X"0E",X"01",X"21",X"12",X"80",X"BE",X"28",X"06",X"0C",X"23",X"10",X"F9",X"0E", + X"00",X"79",X"C9",X"70",X"23",X"7C",X"FE",X"84",X"20",X"F9",X"F9",X"ED",X"56",X"21",X"00",X"90", + X"22",X"0C",X"80",X"77",X"01",X"3F",X"07",X"DF",X"E7",X"32",X"0E",X"80",X"32",X"0F",X"80",X"CD", + X"C9",X"02",X"CD",X"CD",X"02",X"CD",X"D1",X"02",X"CD",X"D7",X"02",X"CD",X"DB",X"02",X"CD",X"DF", + X"02",X"FB",X"3E",X"0F",X"CF",X"E6",X"80",X"20",X"F9",X"3E",X"0F",X"CF",X"E6",X"80",X"28",X"F9", + X"F3",X"3E",X"01",X"32",X"10",X"80",X"3A",X"01",X"80",X"B7",X"3A",X"00",X"80",X"CA",X"05",X"02", + X"CD",X"AD",X"02",X"18",X"03",X"CD",X"93",X"02",X"FB",X"00",X"00",X"F3",X"3E",X"02",X"32",X"10", + X"80",X"3A",X"03",X"80",X"B7",X"3A",X"02",X"80",X"CA",X"20",X"02",X"CD",X"AD",X"02",X"18",X"03", + X"CD",X"93",X"02",X"FB",X"00",X"00",X"F3",X"3E",X"03",X"32",X"10",X"80",X"3A",X"05",X"80",X"B7", + X"3A",X"04",X"80",X"CA",X"3B",X"02",X"CD",X"AD",X"02",X"18",X"03",X"CD",X"93",X"02",X"FB",X"00", + X"00",X"F3",X"3E",X"04",X"32",X"10",X"80",X"3A",X"07",X"80",X"B7",X"3A",X"06",X"80",X"CA",X"56", + X"02",X"CD",X"AD",X"02",X"18",X"03",X"CD",X"93",X"02",X"FB",X"00",X"00",X"F3",X"3E",X"05",X"32", + X"10",X"80",X"3A",X"09",X"80",X"B7",X"3A",X"08",X"80",X"CA",X"71",X"02",X"CD",X"AD",X"02",X"18", + X"03",X"CD",X"93",X"02",X"FB",X"00",X"00",X"F3",X"3E",X"06",X"32",X"10",X"80",X"3A",X"0B",X"80", + X"B7",X"3A",X"0A",X"80",X"CA",X"8D",X"02",X"CD",X"AD",X"02",X"C3",X"E1",X"01",X"CD",X"93",X"02", + X"C3",X"E1",X"01",X"21",X"BC",X"09",X"EF",X"B7",X"20",X"19",X"E5",X"21",X"01",X"80",X"3A",X"10", + X"80",X"3D",X"87",X"D5",X"5F",X"16",X"00",X"19",X"D1",X"36",X"01",X"E1",X"C9",X"B7",X"C8",X"21", + X"18",X"0A",X"EF",X"B7",X"C8",X"57",X"21",X"00",X"80",X"3A",X"10",X"80",X"3D",X"4F",X"06",X"00", + X"09",X"09",X"15",X"28",X"01",X"70",X"23",X"70",X"C9",X"06",X"08",X"18",X"06",X"06",X"09",X"18", + X"02",X"06",X"0A",X"0E",X"00",X"DF",X"C9",X"06",X"08",X"18",X"06",X"06",X"09",X"18",X"02",X"06", + X"0A",X"0E",X"00",X"E7",X"C9",X"3A",X"10",X"80",X"3D",X"21",X"EF",X"02",X"EF",X"AF",X"C9",X"FB", + X"02",X"04",X"03",X"0D",X"03",X"16",X"03",X"1F",X"03",X"28",X"03",X"CD",X"C9",X"02",X"0E",X"09", + X"CD",X"31",X"03",X"C9",X"CD",X"CD",X"02",X"0E",X"12",X"CD",X"31",X"03",X"C9",X"CD",X"D1",X"02", + X"0E",X"24",X"CD",X"31",X"03",X"C9",X"CD",X"D7",X"02",X"0E",X"09",X"CD",X"3D",X"03",X"C9",X"CD", + X"DB",X"02",X"0E",X"12",X"CD",X"3D",X"03",X"C9",X"CD",X"DF",X"02",X"0E",X"24",X"CD",X"3D",X"03", + X"C9",X"3A",X"0E",X"80",X"B1",X"32",X"0E",X"80",X"06",X"07",X"4F",X"DF",X"C9",X"3A",X"0F",X"80", + X"B1",X"32",X"0F",X"80",X"06",X"07",X"4F",X"E7",X"C9",X"3A",X"10",X"80",X"FE",X"04",X"FA",X"53", + X"03",X"E7",X"C9",X"DF",X"C9",X"3A",X"10",X"80",X"FE",X"04",X"FA",X"61",X"03",X"78",X"D7",X"4F", + X"C9",X"78",X"CF",X"4F",X"C9",X"3A",X"0E",X"80",X"A0",X"B1",X"32",X"0E",X"80",X"4F",X"06",X"07", + X"DF",X"C9",X"3A",X"0F",X"80",X"A0",X"B1",X"32",X"0F",X"80",X"4F",X"06",X"07",X"E7",X"C9",X"3A", + X"10",X"80",X"3D",X"21",X"88",X"03",X"EF",X"C9",X"94",X"03",X"9B",X"03",X"A2",X"03",X"A9",X"03", + X"B0",X"03",X"B7",X"03",X"01",X"08",X"FE",X"CD",X"65",X"03",X"C9",X"01",X"10",X"FD",X"CD",X"65", + X"03",X"C9",X"01",X"20",X"FB",X"CD",X"65",X"03",X"C9",X"01",X"08",X"FE",X"CD",X"72",X"03",X"C9", + X"01",X"10",X"FD",X"CD",X"72",X"03",X"C9",X"01",X"20",X"FB",X"CD",X"72",X"03",X"C9",X"3A",X"10", + X"80",X"3D",X"21",X"C7",X"03",X"EF",X"C9",X"D3",X"03",X"DA",X"03",X"E1",X"03",X"E8",X"03",X"EF", + X"03",X"F6",X"03",X"01",X"01",X"F7",X"CD",X"65",X"03",X"C9",X"01",X"02",X"EF",X"CD",X"65",X"03", + X"C9",X"01",X"04",X"DF",X"CD",X"65",X"03",X"C9",X"01",X"01",X"F7",X"CD",X"72",X"03",X"C9",X"01", + X"02",X"EF",X"CD",X"72",X"03",X"C9",X"01",X"04",X"DF",X"CD",X"72",X"03",X"C9",X"3A",X"10",X"80", + X"3D",X"21",X"06",X"04",X"EF",X"C9",X"12",X"04",X"19",X"04",X"20",X"04",X"27",X"04",X"2E",X"04", + X"35",X"04",X"01",X"00",X"F6",X"CD",X"65",X"03",X"C9",X"01",X"00",X"ED",X"CD",X"65",X"03",X"C9", + X"01",X"00",X"DB",X"CD",X"65",X"03",X"C9",X"01",X"00",X"F6",X"CD",X"72",X"03",X"C9",X"01",X"00", + X"ED",X"CD",X"72",X"03",X"C9",X"01",X"00",X"DB",X"CD",X"72",X"03",X"C9",X"3A",X"10",X"80",X"FE", + X"04",X"30",X"05",X"C6",X"07",X"47",X"DF",X"C9",X"C6",X"04",X"47",X"E7",X"C9",X"3A",X"10",X"80", + X"FE",X"04",X"30",X"04",X"C6",X"07",X"CF",X"C9",X"C6",X"04",X"D7",X"C9",X"3A",X"10",X"80",X"FE", + X"04",X"30",X"09",X"3D",X"87",X"47",X"4D",X"DF",X"4C",X"04",X"DF",X"C9",X"D6",X"04",X"87",X"47", + X"4D",X"E7",X"4C",X"04",X"E7",X"C9",X"3A",X"10",X"80",X"FE",X"04",X"30",X"0A",X"3D",X"87",X"67", + X"24",X"CF",X"6F",X"7C",X"CF",X"67",X"C9",X"D6",X"04",X"87",X"67",X"24",X"D7",X"6F",X"7C",X"D7", + X"67",X"C9",X"FE",X"04",X"D0",X"F5",X"CD",X"E2",X"04",X"F1",X"B7",X"20",X"02",X"77",X"C9",X"21", + X"B2",X"04",X"87",X"87",X"4F",X"87",X"81",X"4F",X"06",X"00",X"09",X"3A",X"10",X"80",X"3D",X"EF", + X"77",X"C9",X"05",X"05",X"0A",X"05",X"0F",X"05",X"14",X"05",X"19",X"05",X"1E",X"05",X"23",X"05", + X"28",X"05",X"2D",X"05",X"32",X"05",X"37",X"05",X"3C",X"05",X"41",X"05",X"46",X"05",X"4B",X"05", + X"50",X"05",X"55",X"05",X"5A",X"05",X"5F",X"05",X"64",X"05",X"69",X"05",X"6E",X"05",X"73",X"05", + X"78",X"05",X"21",X"B2",X"04",X"3A",X"10",X"80",X"3D",X"EF",X"C9",X"2A",X"0C",X"80",X"7B",X"A5", + X"6F",X"7A",X"A4",X"67",X"22",X"0C",X"80",X"C9",X"2A",X"0C",X"80",X"7B",X"B5",X"6F",X"7A",X"B4", + X"67",X"22",X"0C",X"80",X"C9",X"11",X"3F",X"FF",X"18",X"E1",X"11",X"FF",X"FC",X"18",X"DC",X"11", + X"FF",X"F3",X"18",X"D7",X"11",X"FC",X"FF",X"18",X"D2",X"11",X"F3",X"FF",X"18",X"CD",X"11",X"CF", + X"FF",X"18",X"C8",X"11",X"80",X"00",X"18",X"D0",X"11",X"00",X"02",X"18",X"CB",X"11",X"00",X"08", + X"18",X"C6",X"11",X"02",X"00",X"18",X"C1",X"11",X"08",X"00",X"18",X"BC",X"11",X"20",X"00",X"18", + X"B7",X"11",X"40",X"00",X"18",X"B2",X"11",X"00",X"01",X"18",X"AD",X"11",X"00",X"04",X"18",X"A8", + X"11",X"01",X"00",X"18",X"A3",X"11",X"04",X"00",X"18",X"9E",X"11",X"10",X"00",X"18",X"99",X"11", + X"C0",X"00",X"18",X"94",X"11",X"00",X"03",X"18",X"8F",X"11",X"00",X"0C",X"18",X"8A",X"11",X"03", + X"00",X"18",X"85",X"11",X"0C",X"00",X"18",X"80",X"11",X"30",X"00",X"C3",X"F8",X"04",X"DD",X"7E", + X"00",X"FE",X"FF",X"C8",X"CD",X"89",X"05",X"AF",X"C9",X"DD",X"35",X"01",X"C0",X"3A",X"42",X"80", + X"DD",X"77",X"01",X"DD",X"CB",X"00",X"46",X"C2",X"A9",X"05",X"DD",X"7E",X"07",X"D6",X"01",X"FA", + X"A9",X"05",X"DD",X"77",X"07",X"4F",X"CD",X"3C",X"04",X"DD",X"35",X"00",X"C0",X"DD",X"6E",X"02", + X"DD",X"66",X"03",X"7E",X"47",X"E6",X"1F",X"CA",X"44",X"06",X"FE",X"1F",X"C2",X"60",X"06",X"23", + X"DD",X"75",X"02",X"DD",X"74",X"03",X"78",X"E6",X"E0",X"0F",X"0F",X"0F",X"0F",X"4F",X"06",X"00", + X"21",X"D9",X"05",X"09",X"5E",X"23",X"56",X"EB",X"E9",X"E9",X"05",X"07",X"06",X"1D",X"06",X"3A", + X"06",X"3A",X"06",X"3A",X"06",X"3A",X"06",X"3A",X"06",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"4E", + X"CB",X"21",X"06",X"00",X"21",X"93",X"06",X"09",X"5E",X"23",X"56",X"ED",X"53",X"40",X"80",X"DD", + X"73",X"04",X"DD",X"72",X"05",X"18",X"23",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"4E",X"06",X"00", + X"21",X"2B",X"07",X"09",X"7E",X"32",X"42",X"80",X"DD",X"77",X"01",X"18",X"0D",X"DD",X"6E",X"02", + X"DD",X"66",X"03",X"7E",X"DD",X"77",X"06",X"DD",X"77",X"07",X"DD",X"6E",X"02",X"DD",X"66",X"03", + X"23",X"DD",X"75",X"02",X"DD",X"74",X"03",X"C3",X"AD",X"05",X"0E",X"00",X"CD",X"3C",X"04",X"DD", + X"36",X"00",X"FF",X"C9",X"CD",X"4E",X"06",X"0E",X"00",X"CD",X"3C",X"04",X"18",X"37",X"78",X"E6", + X"E0",X"07",X"07",X"07",X"47",X"3E",X"01",X"18",X"01",X"07",X"10",X"FD",X"DD",X"77",X"00",X"C9", + X"C5",X"CD",X"4E",X"06",X"C1",X"78",X"E6",X"1F",X"3D",X"07",X"4F",X"06",X"00",X"DD",X"6E",X"04", + X"DD",X"66",X"05",X"09",X"5E",X"23",X"56",X"EB",X"CD",X"5C",X"04",X"DD",X"4E",X"06",X"79",X"DD", + X"77",X"07",X"CD",X"3C",X"04",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"23",X"DD",X"75",X"02",X"DD", + X"74",X"03",X"C9",X"B3",X"06",X"B7",X"06",X"BB",X"06",X"BF",X"06",X"C3",X"06",X"C7",X"06",X"CB", + X"06",X"CF",X"06",X"D3",X"06",X"D7",X"06",X"DB",X"06",X"DF",X"06",X"E3",X"06",X"E7",X"06",X"EB", + X"06",X"EF",X"06",X"6B",X"08",X"F2",X"07",X"80",X"07",X"14",X"07",X"AE",X"06",X"4E",X"06",X"F3", + X"05",X"9E",X"05",X"4E",X"05",X"01",X"05",X"B9",X"04",X"76",X"04",X"36",X"04",X"F9",X"03",X"C0", + X"03",X"8A",X"03",X"57",X"03",X"27",X"03",X"FA",X"02",X"CF",X"02",X"A7",X"02",X"81",X"02",X"5D", + X"02",X"3B",X"02",X"1B",X"02",X"FD",X"01",X"E0",X"01",X"C5",X"01",X"AC",X"01",X"94",X"01",X"7D", + X"01",X"68",X"01",X"53",X"01",X"40",X"01",X"2E",X"01",X"1D",X"01",X"0D",X"01",X"FE",X"00",X"F0", + X"00",X"E3",X"00",X"D6",X"00",X"CA",X"00",X"BE",X"00",X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97", + X"00",X"8F",X"00",X"87",X"00",X"7F",X"00",X"78",X"00",X"71",X"00",X"6B",X"00",X"65",X"00",X"5F", + X"00",X"5A",X"00",X"55",X"00",X"50",X"00",X"4C",X"00",X"47",X"00",X"57",X"42",X"34",X"2C",X"25", + X"21",X"1D",X"1A",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"21",X"6E",X"07",X"11",X"20", + X"80",X"01",X"18",X"00",X"ED",X"B0",X"3A",X"43",X"80",X"87",X"4F",X"87",X"81",X"4F",X"06",X"00", + X"09",X"21",X"0D",X"13",X"09",X"11",X"22",X"80",X"CD",X"64",X"07",X"11",X"2A",X"80",X"CD",X"64", + X"07",X"11",X"32",X"80",X"7E",X"12",X"CD",X"6B",X"07",X"7E",X"12",X"23",X"13",X"C9",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"DD",X"7E",X"00",X"FE",X"FF",X"C8",X"CD",X"91",X"07",X"AF", + X"C9",X"DD",X"35",X"01",X"C0",X"3A",X"66",X"80",X"DD",X"77",X"01",X"DD",X"CB",X"00",X"46",X"C2", + X"B1",X"07",X"DD",X"7E",X"07",X"D6",X"01",X"FA",X"B1",X"07",X"DD",X"77",X"07",X"4F",X"CD",X"3C", + X"04",X"DD",X"35",X"00",X"C0",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"7E",X"47",X"E6",X"1F",X"CA", + X"4C",X"08",X"FE",X"1F",X"C2",X"68",X"08",X"23",X"DD",X"75",X"02",X"DD",X"74",X"03",X"78",X"E6", + X"E0",X"0F",X"0F",X"0F",X"0F",X"4F",X"06",X"00",X"21",X"E1",X"07",X"09",X"5E",X"23",X"56",X"EB", + X"E9",X"F1",X"07",X"0F",X"08",X"25",X"08",X"42",X"08",X"42",X"08",X"42",X"08",X"42",X"08",X"42", + X"08",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"4E",X"CB",X"21",X"06",X"00",X"21",X"9B",X"08",X"09", + X"5E",X"23",X"56",X"ED",X"53",X"64",X"80",X"DD",X"73",X"04",X"DD",X"72",X"05",X"18",X"23",X"DD", + X"6E",X"02",X"DD",X"66",X"03",X"4E",X"06",X"00",X"21",X"33",X"09",X"09",X"7E",X"32",X"66",X"80", + X"DD",X"77",X"01",X"18",X"0D",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"7E",X"DD",X"77",X"06",X"DD", + X"77",X"07",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"23",X"DD",X"75",X"02",X"DD",X"74",X"03",X"C3", + X"B5",X"07",X"0E",X"00",X"CD",X"3C",X"04",X"DD",X"36",X"00",X"FF",X"C9",X"CD",X"56",X"08",X"0E", + X"00",X"CD",X"3C",X"04",X"18",X"37",X"78",X"E6",X"E0",X"07",X"07",X"07",X"47",X"3E",X"01",X"18", + X"01",X"07",X"10",X"FD",X"DD",X"77",X"00",X"C9",X"C5",X"CD",X"56",X"08",X"C1",X"78",X"E6",X"1F", + X"3D",X"07",X"4F",X"06",X"00",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"09",X"5E",X"23",X"56",X"EB", + X"CD",X"5C",X"04",X"DD",X"4E",X"06",X"79",X"DD",X"77",X"07",X"CD",X"3C",X"04",X"DD",X"6E",X"02", + X"DD",X"66",X"03",X"23",X"DD",X"75",X"02",X"DD",X"74",X"03",X"C9",X"BB",X"08",X"BF",X"08",X"C3", + X"08",X"C7",X"08",X"CB",X"08",X"CF",X"08",X"D3",X"08",X"D7",X"08",X"DB",X"08",X"DF",X"08",X"E3", + X"08",X"E7",X"08",X"EB",X"08",X"EF",X"08",X"F3",X"08",X"C1",X"08",X"6B",X"08",X"F2",X"07",X"80", + X"07",X"14",X"07",X"AE",X"06",X"4E",X"06",X"F3",X"05",X"9E",X"05",X"4E",X"05",X"01",X"05",X"B9", + X"04",X"76",X"04",X"36",X"04",X"F9",X"03",X"C0",X"03",X"8A",X"03",X"57",X"03",X"27",X"03",X"FA", + X"02",X"CF",X"02",X"A7",X"02",X"81",X"02",X"5D",X"02",X"3B",X"02",X"1B",X"02",X"FD",X"01",X"E0", + X"01",X"C5",X"01",X"AC",X"01",X"94",X"01",X"7D",X"01",X"68",X"01",X"53",X"01",X"40",X"01",X"2E", + X"01",X"1D",X"01",X"0D",X"01",X"FE",X"00",X"F0",X"00",X"E3",X"00",X"D6",X"00",X"CA",X"00",X"BE", + X"00",X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97",X"00",X"8F",X"00",X"87",X"00",X"7F",X"00",X"78", + X"00",X"71",X"00",X"6B",X"00",X"65",X"00",X"5F",X"00",X"5A",X"00",X"55",X"00",X"50",X"00",X"4C", + X"00",X"47",X"00",X"57",X"42",X"34",X"2C",X"25",X"21",X"1D",X"1A",X"0C",X"0B",X"0A",X"09",X"08", + X"07",X"06",X"05",X"21",X"76",X"09",X"11",X"44",X"80",X"01",X"18",X"00",X"ED",X"B0",X"3A",X"67", + X"80",X"87",X"4F",X"87",X"81",X"4F",X"06",X"00",X"09",X"21",X"0D",X"13",X"09",X"11",X"46",X"80", + X"CD",X"6C",X"09",X"11",X"4E",X"80",X"CD",X"6C",X"09",X"11",X"56",X"80",X"7E",X"12",X"CD",X"73", + X"09",X"7E",X"12",X"23",X"13",X"C9",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06", + X"05",X"0A",X"0E",X"0C",X"04",X"10",X"0F",X"07",X"0B",X"0D",X"12",X"11",X"09",X"08",X"01",X"02", + X"03",X"2D",X"24",X"1B",X"2C",X"23",X"1A",X"2B",X"22",X"19",X"2A",X"21",X"18",X"29",X"20",X"17", + X"28",X"1F",X"16",X"27",X"1E",X"15",X"26",X"1D",X"14",X"25",X"1C",X"13",X"E5",X"02",X"74",X"0A", + X"C4",X"0A",X"18",X"0B",X"88",X"0B",X"23",X"0C",X"A9",X"0C",X"2F",X"0D",X"86",X"0D",X"DD",X"0D", + X"1C",X"0E",X"94",X"0E",X"19",X"0F",X"4F",X"0F",X"17",X"10",X"83",X"10",X"EB",X"10",X"1B",X"11", + X"1B",X"11",X"38",X"11",X"75",X"11",X"75",X"11",X"AE",X"11",X"75",X"11",X"75",X"11",X"D3",X"11", + X"75",X"11",X"75",X"11",X"F8",X"11",X"75",X"11",X"75",X"11",X"1D",X"12",X"75",X"11",X"75",X"11", + X"42",X"12",X"73",X"12",X"73",X"12",X"9E",X"12",X"73",X"12",X"73",X"12",X"C3",X"12",X"73",X"12", + X"73",X"12",X"E8",X"12",X"73",X"12",X"73",X"12",X"00",X"00",X"95",X"0A",X"E5",X"0A",X"38",X"0B", + X"B4",X"0B",X"43",X"0C",X"CF",X"0C",X"51",X"0D",X"A8",X"0D",X"FB",X"0D",X"3C",X"0E",X"B3",X"0E", + X"32",X"0F",X"6F",X"0F",X"37",X"10",X"A3",X"10",X"14",X"11",X"2A",X"11",X"31",X"11",X"5D",X"11", + X"92",X"11",X"A0",X"11",X"5D",X"11",X"92",X"11",X"A0",X"11",X"64",X"11",X"99",X"11",X"A7",X"11", + X"5D",X"11",X"92",X"11",X"A0",X"11",X"5D",X"11",X"92",X"11",X"A0",X"11",X"67",X"12",X"90",X"12", + X"97",X"12",X"67",X"12",X"90",X"12",X"97",X"12",X"67",X"12",X"90",X"12",X"97",X"12",X"67",X"12", + X"90",X"12",X"97",X"12",X"3E",X"01",X"CD",X"92",X"04",X"3E",X"10",X"32",X"70",X"80",X"32",X"71", + X"80",X"AF",X"32",X"72",X"80",X"CD",X"7F",X"03",X"0E",X"04",X"CD",X"3C",X"04",X"21",X"55",X"00", + X"CD",X"5C",X"04",X"AF",X"C9",X"3A",X"72",X"80",X"FE",X"00",X"28",X"02",X"18",X"0D",X"21",X"70", + X"80",X"AF",X"35",X"C0",X"3E",X"01",X"32",X"72",X"80",X"AF",X"C9",X"21",X"71",X"80",X"AF",X"35", + X"C0",X"36",X"10",X"CD",X"4D",X"04",X"3C",X"FE",X"09",X"28",X"06",X"4F",X"CD",X"3C",X"04",X"AF", + X"C9",X"3E",X"FF",X"C9",X"3E",X"01",X"CD",X"92",X"04",X"3E",X"10",X"32",X"74",X"80",X"32",X"75", + X"80",X"AF",X"32",X"76",X"80",X"CD",X"7F",X"03",X"0E",X"04",X"CD",X"3C",X"04",X"21",X"00",X"01", + X"CD",X"5C",X"04",X"AF",X"C9",X"3A",X"76",X"80",X"FE",X"00",X"28",X"02",X"18",X"0D",X"21",X"74", + X"80",X"AF",X"35",X"C0",X"3E",X"01",X"32",X"76",X"80",X"AF",X"C9",X"21",X"75",X"80",X"AF",X"35", + X"C0",X"36",X"10",X"CD",X"4D",X"04",X"3C",X"FE",X"09",X"28",X"06",X"4F",X"CD",X"3C",X"04",X"AF", + X"C9",X"3E",X"FF",X"C9",X"06",X"19",X"19",X"00",X"21",X"14",X"0B",X"11",X"78",X"80",X"01",X"04", + X"00",X"ED",X"B0",X"CD",X"7F",X"03",X"3E",X"01",X"CD",X"92",X"04",X"0E",X"0C",X"CD",X"3C",X"04", + X"21",X"50",X"00",X"CD",X"5C",X"04",X"AF",X"C9",X"DD",X"21",X"14",X"0B",X"FD",X"21",X"78",X"80", + X"FD",X"7E",X"03",X"FE",X"00",X"28",X"02",X"18",X"1B",X"CD",X"76",X"04",X"11",X"09",X"00",X"19", + X"CD",X"5C",X"04",X"FD",X"35",X"00",X"20",X"0A",X"DD",X"7E",X"00",X"FD",X"77",X"00",X"FD",X"36", + X"03",X"01",X"AF",X"C9",X"FD",X"35",X"01",X"20",X"F9",X"DD",X"7E",X"01",X"FD",X"77",X"01",X"CD", + X"76",X"04",X"23",X"CD",X"5C",X"04",X"FD",X"35",X"02",X"28",X"02",X"AF",X"C9",X"3E",X"FF",X"C9", + X"BC",X"0B",X"D7",X"0B",X"F8",X"0B",X"11",X"0C",X"AF",X"CD",X"92",X"04",X"3E",X"17",X"32",X"7D", + X"80",X"3E",X"06",X"32",X"7E",X"80",X"3E",X"04",X"32",X"7F",X"80",X"3E",X"06",X"32",X"80",X"80", + X"AF",X"32",X"81",X"80",X"CD",X"7F",X"03",X"0E",X"0B",X"CD",X"3C",X"04",X"21",X"80",X"00",X"CD", + X"5C",X"04",X"AF",X"C9",X"3A",X"81",X"80",X"21",X"80",X"0B",X"EF",X"C9",X"21",X"7D",X"80",X"AF", + X"35",X"C0",X"36",X"17",X"CD",X"76",X"04",X"11",X"10",X"00",X"B7",X"ED",X"52",X"CD",X"5C",X"04", + X"3E",X"01",X"32",X"81",X"80",X"AF",X"C9",X"21",X"7E",X"80",X"AF",X"35",X"C0",X"36",X"06",X"CD", + X"76",X"04",X"11",X"10",X"00",X"19",X"CD",X"5C",X"04",X"21",X"7F",X"80",X"AF",X"35",X"C0",X"36", + X"04",X"3E",X"02",X"32",X"81",X"80",X"AF",X"C9",X"21",X"7E",X"80",X"AF",X"35",X"C0",X"36",X"06", + X"CD",X"76",X"04",X"11",X"10",X"00",X"B7",X"ED",X"52",X"CD",X"5C",X"04",X"3E",X"03",X"32",X"81", + X"80",X"21",X"80",X"80",X"35",X"28",X"05",X"AF",X"32",X"81",X"80",X"C9",X"3E",X"FF",X"C9",X"10", + X"10",X"10",X"00",X"21",X"1F",X"0C",X"11",X"83",X"80",X"01",X"04",X"00",X"ED",X"B0",X"CD",X"7F", + X"03",X"3E",X"01",X"CD",X"92",X"04",X"0E",X"0C",X"CD",X"3C",X"04",X"21",X"00",X"01",X"CD",X"5C", + X"04",X"AF",X"C9",X"DD",X"21",X"1F",X"0C",X"FD",X"21",X"83",X"80",X"FD",X"7E",X"03",X"FE",X"00", + X"28",X"06",X"FE",X"01",X"28",X"22",X"18",X"3A",X"FD",X"35",X"00",X"28",X"0F",X"FD",X"46",X"00", + X"CB",X"40",X"28",X"0C",X"21",X"80",X"00",X"CD",X"5C",X"04",X"AF",X"C9",X"FD",X"36",X"03",X"01", + X"21",X"00",X"01",X"CD",X"5C",X"04",X"AF",X"C9",X"FD",X"35",X"01",X"28",X"0F",X"FD",X"46",X"01", + X"CB",X"40",X"28",X"EC",X"21",X"60",X"00",X"CD",X"5C",X"04",X"AF",X"C9",X"FD",X"36",X"03",X"02", + X"18",X"DE",X"FD",X"35",X"02",X"28",X"0F",X"FD",X"46",X"02",X"CB",X"40",X"28",X"D2",X"21",X"40", + X"00",X"CD",X"5C",X"04",X"AF",X"C9",X"3E",X"FF",X"C9",X"3E",X"01",X"CD",X"92",X"04",X"3E",X"02", + X"21",X"88",X"80",X"77",X"23",X"3E",X"08",X"77",X"23",X"3E",X"02",X"77",X"23",X"AF",X"77",X"CD", + X"7F",X"03",X"0E",X"09",X"CD",X"3C",X"04",X"21",X"00",X"01",X"CD",X"5C",X"04",X"AF",X"C9",X"3A", + X"8B",X"80",X"FE",X"00",X"28",X"02",X"18",X"28",X"CD",X"76",X"04",X"2B",X"CD",X"5C",X"04",X"3A", + X"88",X"80",X"3D",X"32",X"88",X"80",X"20",X"0F",X"3E",X"03",X"32",X"88",X"80",X"CD",X"4D",X"04", + X"3D",X"28",X"06",X"4F",X"CD",X"3C",X"04",X"AF",X"C9",X"3E",X"01",X"32",X"8B",X"80",X"AF",X"C9", + X"0E",X"00",X"CD",X"3C",X"04",X"3A",X"89",X"80",X"3D",X"32",X"89",X"80",X"20",X"E9",X"3E",X"08", + X"32",X"89",X"80",X"3A",X"8A",X"80",X"3D",X"32",X"8A",X"80",X"28",X"10",X"0E",X"09",X"CD",X"3C", + X"04",X"21",X"60",X"00",X"CD",X"5C",X"04",X"AF",X"32",X"8B",X"80",X"C9",X"3E",X"FF",X"C9",X"AF", + X"CD",X"92",X"04",X"3E",X"14",X"32",X"8D",X"80",X"3E",X"05",X"32",X"8E",X"80",X"AF",X"32",X"8F", + X"80",X"CD",X"7F",X"03",X"0E",X"0B",X"CD",X"3C",X"04",X"21",X"80",X"00",X"CD",X"5C",X"04",X"AF", + X"C9",X"3A",X"8F",X"80",X"FE",X"00",X"28",X"02",X"18",X"1B",X"21",X"8D",X"80",X"AF",X"35",X"C0", + X"36",X"14",X"21",X"86",X"00",X"CD",X"5C",X"04",X"21",X"8E",X"80",X"35",X"28",X"15",X"3E",X"01", + X"32",X"8F",X"80",X"AF",X"C9",X"21",X"8D",X"80",X"AF",X"35",X"C0",X"36",X"14",X"AF",X"32",X"8F", + X"80",X"18",X"C6",X"3E",X"FF",X"C9",X"AF",X"CD",X"92",X"04",X"3E",X"14",X"32",X"91",X"80",X"3E", + X"05",X"32",X"92",X"80",X"AF",X"32",X"93",X"80",X"CD",X"7F",X"03",X"0E",X"0B",X"CD",X"3C",X"04", + X"21",X"40",X"00",X"CD",X"5C",X"04",X"AF",X"C9",X"3A",X"93",X"80",X"FE",X"00",X"28",X"02",X"18", + X"1B",X"21",X"91",X"80",X"AF",X"35",X"C0",X"36",X"14",X"21",X"43",X"00",X"CD",X"5C",X"04",X"21", + X"92",X"80",X"35",X"28",X"15",X"3E",X"01",X"32",X"93",X"80",X"AF",X"C9",X"21",X"91",X"80",X"AF", + X"35",X"C0",X"36",X"14",X"AF",X"32",X"93",X"80",X"18",X"C6",X"3E",X"FF",X"C9",X"AF",X"CD",X"92", + X"04",X"3E",X"13",X"32",X"95",X"80",X"3E",X"06",X"32",X"96",X"80",X"CD",X"7F",X"03",X"0E",X"09", + X"CD",X"3C",X"04",X"21",X"00",X"02",X"CD",X"5C",X"04",X"AF",X"C9",X"21",X"95",X"80",X"AF",X"35", + X"C0",X"36",X"13",X"21",X"96",X"80",X"35",X"28",X"0D",X"CD",X"76",X"04",X"11",X"50",X"00",X"ED", + X"52",X"CD",X"5C",X"04",X"AF",X"C9",X"3E",X"FF",X"C9",X"1B",X"1B",X"00",X"21",X"19",X"0E",X"11", + X"98",X"80",X"01",X"03",X"00",X"ED",X"B0",X"CD",X"7F",X"03",X"3E",X"01",X"CD",X"92",X"04",X"0E", + X"0B",X"CD",X"3C",X"04",X"21",X"00",X"02",X"CD",X"5C",X"04",X"AF",X"C9",X"DD",X"21",X"19",X"0E", + X"FD",X"21",X"98",X"80",X"FD",X"7E",X"02",X"FE",X"00",X"28",X"03",X"C3",X"6D",X"0E",X"FD",X"35", + X"00",X"20",X"18",X"DD",X"7E",X"00",X"FD",X"77",X"00",X"21",X"00",X"08",X"CD",X"5C",X"04",X"CD", + X"4D",X"04",X"3C",X"4F",X"CD",X"3C",X"04",X"FD",X"36",X"02",X"01",X"AF",X"C9",X"FD",X"35",X"01", + X"20",X"F9",X"DD",X"7E",X"01",X"FD",X"77",X"01",X"21",X"00",X"02",X"CD",X"5C",X"04",X"CD",X"4D", + X"04",X"3D",X"3D",X"FE",X"03",X"28",X"0A",X"4F",X"CD",X"3C",X"04",X"FD",X"36",X"02",X"00",X"18", + X"DA",X"3E",X"FF",X"C9",X"AF",X"CD",X"92",X"04",X"CD",X"7F",X"03",X"21",X"00",X"04",X"CD",X"5C", + X"04",X"0E",X"0F",X"CD",X"3C",X"04",X"21",X"9C",X"80",X"36",X"00",X"23",X"36",X"02",X"23",X"36", + X"14",X"AF",X"C9",X"CD",X"EB",X"0E",X"CD",X"BB",X"0E",X"AF",X"C9",X"21",X"9E",X"80",X"35",X"C0", + X"36",X"14",X"3A",X"9C",X"80",X"CB",X"4F",X"28",X"0C",X"CD",X"4D",X"04",X"3C",X"4F",X"CD",X"3C", + X"04",X"3E",X"02",X"18",X"32",X"CD",X"4D",X"04",X"D6",X"02",X"4F",X"CD",X"3C",X"04",X"4F",X"3E", + X"02",X"CD",X"07",X"0F",X"79",X"B7",X"C0",X"E1",X"3E",X"FF",X"C9",X"21",X"9D",X"80",X"35",X"C0", + X"36",X"02",X"3A",X"9C",X"80",X"CB",X"47",X"20",X"14",X"CD",X"76",X"04",X"11",X"38",X"00",X"B7", + X"ED",X"52",X"CD",X"5C",X"04",X"3E",X"01",X"21",X"9C",X"80",X"AE",X"77",X"C9",X"CD",X"76",X"04", + X"11",X"38",X"00",X"19",X"CD",X"5C",X"04",X"18",X"EE",X"AF",X"CD",X"92",X"04",X"21",X"A0",X"80", + X"36",X"03",X"CD",X"7F",X"03",X"0E",X"09",X"CD",X"3C",X"04",X"21",X"94",X"00",X"CD",X"5C",X"04", + X"AF",X"C9",X"21",X"A0",X"80",X"AF",X"35",X"C0",X"36",X"03",X"CD",X"4D",X"04",X"3D",X"4F",X"28", + X"05",X"CD",X"3C",X"04",X"AF",X"C9",X"3E",X"FF",X"C9",X"08",X"19",X"0A",X"04",X"1A",X"00",X"21", + X"49",X"0F",X"11",X"A2",X"80",X"01",X"06",X"00",X"ED",X"B0",X"CD",X"7F",X"03",X"3E",X"01",X"CD", + X"92",X"04",X"0E",X"0C",X"CD",X"3C",X"04",X"21",X"E0",X"00",X"CD",X"5C",X"04",X"AF",X"C9",X"DD", + X"21",X"49",X"0F",X"FD",X"21",X"A2",X"80",X"FD",X"7E",X"05",X"FE",X"00",X"28",X"0A",X"FE",X"01", + X"28",X"29",X"FE",X"02",X"28",X"42",X"18",X"6D",X"FD",X"35",X"00",X"20",X"16",X"DD",X"7E",X"00", + X"FD",X"77",X"00",X"CD",X"76",X"04",X"2B",X"CD",X"5C",X"04",X"FD",X"35",X"01",X"20",X"06",X"FD", + X"36",X"05",X"02",X"AF",X"C9",X"FD",X"36",X"05",X"01",X"AF",X"C9",X"FD",X"7E",X"01",X"CB",X"47", + X"20",X"0B",X"0E",X"08",X"CD",X"3C",X"04",X"FD",X"36",X"05",X"00",X"AF",X"C9",X"0E",X"0C",X"CD", + X"3C",X"04",X"FD",X"36",X"05",X"00",X"AF",X"C9",X"FD",X"35",X"02",X"28",X"15",X"FD",X"7E",X"02", + X"CB",X"47",X"20",X"07",X"0E",X"08",X"CD",X"3C",X"04",X"AF",X"C9",X"0E",X"0C",X"CD",X"3C",X"04", + X"AF",X"C9",X"FD",X"35",X"03",X"20",X"03",X"3E",X"FF",X"C9",X"FD",X"36",X"05",X"03",X"0E",X"00", + X"CD",X"3C",X"04",X"AF",X"C9",X"FD",X"35",X"04",X"20",X"DF",X"DD",X"7E",X"04",X"FD",X"77",X"04"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_SND_1.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_SND_1.vhd new file mode 100644 index 00000000..58fdcb19 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_SND_1.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_SND_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_SND_1 is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"DD",X"7E",X"01",X"FD",X"77",X"01",X"DD",X"7E",X"02",X"FD",X"77",X"02",X"FD",X"36",X"05",X"00", + X"C3",X"62",X"0F",X"04",X"0F",X"0F",X"00",X"21",X"13",X"10",X"11",X"A8",X"80",X"01",X"04",X"00", + X"ED",X"B0",X"CD",X"7F",X"03",X"3E",X"01",X"CD",X"92",X"04",X"0E",X"0C",X"CD",X"3C",X"04",X"21", + X"50",X"00",X"CD",X"5C",X"04",X"AF",X"C9",X"DD",X"21",X"13",X"10",X"FD",X"21",X"A8",X"80",X"FD", + X"7E",X"03",X"FE",X"00",X"28",X"02",X"18",X"1B",X"CD",X"76",X"04",X"11",X"09",X"00",X"19",X"CD", + X"5C",X"04",X"FD",X"35",X"00",X"20",X"0A",X"DD",X"7E",X"00",X"FD",X"77",X"00",X"FD",X"36",X"03", + X"01",X"AF",X"C9",X"FD",X"35",X"01",X"20",X"F9",X"DD",X"7E",X"01",X"FD",X"77",X"01",X"CD",X"76", + X"04",X"23",X"CD",X"5C",X"04",X"FD",X"35",X"02",X"28",X"02",X"AF",X"C9",X"3E",X"FF",X"C9",X"03", + X"0A",X"0A",X"00",X"21",X"7F",X"10",X"11",X"B0",X"80",X"01",X"04",X"00",X"ED",X"B0",X"CD",X"7F", + X"03",X"3E",X"01",X"CD",X"92",X"04",X"0E",X"0C",X"CD",X"3C",X"04",X"21",X"50",X"00",X"CD",X"5C", + X"04",X"AF",X"C9",X"DD",X"21",X"7F",X"10",X"FD",X"21",X"B0",X"80",X"FD",X"7E",X"03",X"FE",X"00", + X"28",X"02",X"18",X"1B",X"CD",X"76",X"04",X"11",X"09",X"00",X"19",X"CD",X"5C",X"04",X"FD",X"35", + X"00",X"20",X"0A",X"DD",X"7E",X"00",X"FD",X"77",X"00",X"FD",X"36",X"03",X"01",X"AF",X"C9",X"FD", + X"35",X"01",X"20",X"F9",X"DD",X"7E",X"01",X"FD",X"77",X"01",X"CD",X"76",X"04",X"23",X"CD",X"5C", + X"04",X"FD",X"35",X"02",X"28",X"02",X"AF",X"C9",X"3E",X"FF",X"C9",X"3A",X"B6",X"80",X"B7",X"20", + X"20",X"AF",X"CD",X"92",X"04",X"CD",X"7F",X"03",X"3E",X"00",X"32",X"67",X"80",X"CD",X"43",X"09", + X"3E",X"11",X"21",X"02",X"80",X"77",X"23",X"36",X"00",X"23",X"3C",X"77",X"23",X"36",X"00",X"AF", + X"C9",X"3E",X"FF",X"C9",X"DD",X"21",X"44",X"80",X"C3",X"86",X"07",X"3A",X"B6",X"80",X"B7",X"20", + X"F0",X"AF",X"CD",X"92",X"04",X"CD",X"7F",X"03",X"AF",X"C9",X"DD",X"21",X"4C",X"80",X"C3",X"86", + X"07",X"DD",X"21",X"54",X"80",X"C3",X"86",X"07",X"3E",X"01",X"32",X"B6",X"80",X"3E",X"10",X"CD", + X"6D",X"00",X"3E",X"11",X"CD",X"6D",X"00",X"3E",X"12",X"CD",X"6D",X"00",X"AF",X"CD",X"92",X"04", + X"CD",X"7F",X"03",X"3E",X"01",X"32",X"43",X"80",X"CD",X"3B",X"07",X"AF",X"C9",X"DD",X"21",X"20", + X"80",X"C3",X"7E",X"05",X"DD",X"21",X"20",X"80",X"CD",X"7E",X"05",X"FE",X"FF",X"C0",X"AF",X"32", + X"B6",X"80",X"3E",X"FF",X"C9",X"3E",X"01",X"32",X"B6",X"80",X"3E",X"10",X"CD",X"6D",X"00",X"3E", + X"11",X"CD",X"6D",X"00",X"3E",X"12",X"CD",X"6D",X"00",X"AF",X"CD",X"92",X"04",X"CD",X"7F",X"03", + X"AF",X"C9",X"DD",X"21",X"28",X"80",X"C3",X"7E",X"05",X"DD",X"21",X"28",X"80",X"C3",X"68",X"11", + X"DD",X"21",X"30",X"80",X"C3",X"7E",X"05",X"DD",X"21",X"30",X"80",X"C3",X"68",X"11",X"3E",X"01", + X"32",X"B6",X"80",X"3E",X"10",X"CD",X"6D",X"00",X"3E",X"11",X"CD",X"6D",X"00",X"3E",X"12",X"CD", + X"6D",X"00",X"AF",X"CD",X"92",X"04",X"CD",X"7F",X"03",X"3E",X"02",X"32",X"43",X"80",X"CD",X"3B", + X"07",X"AF",X"C9",X"3E",X"01",X"32",X"B6",X"80",X"3E",X"10",X"CD",X"6D",X"00",X"3E",X"11",X"CD", + X"6D",X"00",X"3E",X"12",X"CD",X"6D",X"00",X"AF",X"CD",X"92",X"04",X"CD",X"7F",X"03",X"3E",X"03", + X"32",X"43",X"80",X"CD",X"3B",X"07",X"AF",X"C9",X"3E",X"01",X"32",X"B6",X"80",X"3E",X"10",X"CD", + X"6D",X"00",X"3E",X"11",X"CD",X"6D",X"00",X"3E",X"12",X"CD",X"6D",X"00",X"AF",X"CD",X"92",X"04", + X"CD",X"7F",X"03",X"3E",X"04",X"32",X"43",X"80",X"CD",X"3B",X"07",X"AF",X"C9",X"3E",X"01",X"32", + X"B6",X"80",X"3E",X"10",X"CD",X"6D",X"00",X"3E",X"11",X"CD",X"6D",X"00",X"3E",X"12",X"CD",X"6D", + X"00",X"AF",X"CD",X"92",X"04",X"CD",X"7F",X"03",X"3E",X"05",X"32",X"43",X"80",X"CD",X"3B",X"07", + X"AF",X"C9",X"3E",X"01",X"32",X"B6",X"80",X"3E",X"10",X"CD",X"6D",X"00",X"3E",X"11",X"CD",X"6D", + X"00",X"3E",X"12",X"CD",X"6D",X"00",X"AF",X"CD",X"92",X"04",X"CD",X"7F",X"03",X"3E",X"06",X"32", + X"43",X"80",X"CD",X"3B",X"07",X"AF",X"C9",X"DD",X"21",X"20",X"80",X"CD",X"7E",X"05",X"B7",X"C8", + X"3E",X"01",X"C9",X"3E",X"01",X"32",X"B6",X"80",X"3E",X"10",X"CD",X"6D",X"00",X"3E",X"11",X"CD", + X"6D",X"00",X"3E",X"12",X"CD",X"6D",X"00",X"AF",X"CD",X"92",X"04",X"CD",X"7F",X"03",X"AF",X"C9", + X"DD",X"21",X"28",X"80",X"C3",X"6B",X"12",X"DD",X"21",X"30",X"80",X"C3",X"6B",X"12",X"3E",X"01", + X"32",X"B6",X"80",X"3E",X"10",X"CD",X"6D",X"00",X"3E",X"11",X"CD",X"6D",X"00",X"3E",X"12",X"CD", + X"6D",X"00",X"AF",X"CD",X"92",X"04",X"CD",X"7F",X"03",X"3E",X"07",X"32",X"43",X"80",X"CD",X"3B", + X"07",X"AF",X"C9",X"3E",X"01",X"32",X"B6",X"80",X"3E",X"10",X"CD",X"6D",X"00",X"3E",X"11",X"CD", + X"6D",X"00",X"3E",X"12",X"CD",X"6D",X"00",X"AF",X"CD",X"92",X"04",X"CD",X"7F",X"03",X"3E",X"08", + X"32",X"43",X"80",X"CD",X"3B",X"07",X"AF",X"C9",X"3E",X"01",X"32",X"B6",X"80",X"3E",X"10",X"CD", + X"6D",X"00",X"3E",X"11",X"CD",X"6D",X"00",X"3E",X"12",X"CD",X"6D",X"00",X"AF",X"CD",X"92",X"04", + X"CD",X"7F",X"03",X"3E",X"09",X"32",X"43",X"80",X"CD",X"3B",X"07",X"AF",X"C9",X"49",X"13",X"65", + X"13",X"81",X"13",X"9D",X"13",X"B9",X"13",X"D2",X"13",X"EE",X"13",X"29",X"14",X"64",X"14",X"9F", + X"14",X"B6",X"14",X"C7",X"14",X"D8",X"14",X"10",X"15",X"48",X"15",X"80",X"15",X"AB",X"15",X"D6", + X"15",X"01",X"16",X"2C",X"16",X"57",X"16",X"82",X"16",X"DA",X"16",X"27",X"17",X"6F",X"17",X"B7", + X"17",X"09",X"18",X"5B",X"18",X"88",X"18",X"B5",X"18",X"1F",X"0D",X"3F",X"06",X"5F",X"09",X"4D", + X"2F",X"2F",X"5F",X"08",X"2F",X"5F",X"07",X"2F",X"5F",X"06",X"2F",X"5F",X"05",X"2F",X"5F",X"04", + X"2F",X"5F",X"03",X"2F",X"FF",X"1F",X"0D",X"3F",X"06",X"5F",X"09",X"4A",X"2B",X"2B",X"5F",X"08", + X"2B",X"5F",X"07",X"2B",X"5F",X"06",X"2B",X"5F",X"05",X"2B",X"5F",X"04",X"2B",X"5F",X"03",X"2B", + X"FF",X"1F",X"0D",X"3F",X"06",X"5F",X"09",X"46",X"26",X"26",X"5F",X"08",X"26",X"5F",X"07",X"26", + X"5F",X"06",X"26",X"5F",X"05",X"26",X"5F",X"04",X"26",X"5F",X"03",X"26",X"FF",X"1F",X"0C",X"3F", + X"0B",X"5F",X"09",X"70",X"90",X"72",X"70",X"6E",X"6D",X"6E",X"70",X"90",X"72",X"70",X"6E",X"6D", + X"6E",X"70",X"70",X"8E",X"8D",X"8E",X"B0",X"B0",X"FF",X"1F",X"06",X"3F",X"0B",X"5F",X"08",X"79", + X"99",X"7A",X"79",X"77",X"75",X"77",X"79",X"99",X"7A",X"79",X"77",X"75",X"77",X"B0",X"A0",X"A0", + X"A0",X"FF",X"1F",X"06",X"3F",X"0B",X"5F",X"08",X"70",X"90",X"72",X"70",X"6E",X"6D",X"6E",X"70", + X"90",X"72",X"70",X"6E",X"6D",X"6E",X"70",X"70",X"8E",X"8D",X"8E",X"B0",X"B0",X"FF",X"1F",X"0E", + X"3F",X"0C",X"5F",X"09",X"93",X"70",X"73",X"70",X"60",X"95",X"71",X"75",X"71",X"60",X"93",X"31", + X"31",X"31",X"31",X"91",X"60",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"B0",X"93",X"70", + X"73",X"70",X"60",X"95",X"71",X"75",X"71",X"60",X"93",X"31",X"31",X"31",X"31",X"91",X"60",X"30", + X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"B0",X"FF",X"1F",X"0E",X"3F",X"0C",X"5F",X"08",X"90", + X"6C",X"70",X"6C",X"60",X"91",X"6E",X"71",X"6E",X"60",X"91",X"2E",X"2E",X"2E",X"2E",X"8E",X"60", + X"2C",X"2C",X"2C",X"2C",X"2C",X"2C",X"2C",X"2C",X"AC",X"90",X"6C",X"70",X"6C",X"60",X"91",X"6E", + X"71",X"6E",X"60",X"91",X"2E",X"2E",X"2E",X"2E",X"8E",X"60",X"2C",X"2C",X"2C",X"2C",X"2C",X"2C", + X"2C",X"2C",X"AC",X"FF",X"1F",X"08",X"3F",X"0C",X"5F",X"08",X"30",X"30",X"30",X"30",X"30",X"30", + X"30",X"30",X"B0",X"31",X"31",X"31",X"31",X"31",X"31",X"31",X"31",X"B1",X"90",X"AE",X"90",X"8C", + X"8E",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"B0",X"31",X"31",X"31",X"31",X"31",X"31", + X"31",X"31",X"B1",X"90",X"AE",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"B0",X"FF",X"1F", + X"0E",X"3F",X"0F",X"5F",X"09",X"AE",X"92",X"80",X"92",X"80",X"93",X"92",X"90",X"8E",X"8D",X"8B", + X"89",X"8B",X"AD",X"B0",X"AE",X"FF",X"1F",X"08",X"3F",X"0F",X"5F",X"09",X"A2",X"A9",X"A9",X"A4", + X"AB",X"AB",X"A1",X"A9",X"A4",X"A2",X"FF",X"1F",X"08",X"3F",X"0F",X"5F",X"09",X"AE",X"AE",X"AE", + X"A0",X"B0",X"B0",X"A0",X"AD",X"B3",X"B2",X"FF",X"1F",X"0E",X"3F",X"0C",X"5F",X"09",X"29",X"29", + X"29",X"29",X"29",X"20",X"26",X"26",X"26",X"26",X"20",X"29",X"29",X"29",X"29",X"20",X"2E",X"2E", + X"2E",X"2E",X"2E",X"20",X"29",X"29",X"29",X"29",X"20",X"2E",X"2E",X"2E",X"2E",X"20",X"32",X"32", + X"32",X"32",X"32",X"20",X"2E",X"2E",X"2E",X"2E",X"20",X"32",X"32",X"32",X"32",X"20",X"B5",X"FF", + X"1F",X"0E",X"3F",X"0C",X"5F",X"09",X"26",X"26",X"26",X"26",X"26",X"20",X"22",X"22",X"22",X"22", + X"20",X"26",X"26",X"26",X"26",X"20",X"29",X"29",X"29",X"29",X"29",X"20",X"26",X"26",X"26",X"26", + X"20",X"29",X"29",X"29",X"29",X"20",X"2E",X"2E",X"2E",X"2E",X"2E",X"20",X"29",X"29",X"29",X"29", + X"20",X"2E",X"2E",X"2E",X"2E",X"20",X"B2",X"FF",X"1F",X"08",X"3F",X"0C",X"5F",X"07",X"29",X"29", + X"29",X"29",X"29",X"20",X"26",X"26",X"26",X"26",X"20",X"29",X"29",X"29",X"29",X"20",X"2E",X"2E", + X"2E",X"2E",X"2E",X"20",X"29",X"29",X"29",X"29",X"20",X"2E",X"2E",X"2E",X"2E",X"20",X"32",X"32", + X"32",X"32",X"32",X"20",X"2E",X"2E",X"2E",X"2E",X"20",X"32",X"32",X"32",X"32",X"20",X"B5",X"FF", + X"1F",X"0E",X"3F",X"0C",X"5F",X"09",X"95",X"97",X"3A",X"39",X"38",X"37",X"36",X"35",X"34",X"33", + X"32",X"31",X"30",X"2F",X"2E",X"2D",X"2C",X"2B",X"2A",X"29",X"28",X"27",X"26",X"25",X"24",X"23", + X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"22",X"A2",X"A0",X"FF",X"1F",X"0B",X"3F",X"0C",X"5F", + X"09",X"9B",X"9D",X"3D",X"3C",X"3B",X"3A",X"39",X"38",X"37",X"36",X"35",X"34",X"33",X"32",X"31", + X"30",X"2F",X"2E",X"2D",X"2C",X"2B",X"2A",X"29",X"28",X"27",X"26",X"25",X"25",X"25",X"25",X"25", + X"25",X"25",X"25",X"A5",X"A0",X"FF",X"1F",X"0B",X"3F",X"0C",X"5F",X"09",X"9B",X"9D",X"39",X"38", + X"37",X"36",X"35",X"34",X"33",X"32",X"31",X"30",X"2F",X"2E",X"2D",X"2C",X"2B",X"2A",X"29",X"28", + X"27",X"26",X"25",X"24",X"23",X"22",X"21",X"21",X"21",X"21",X"21",X"21",X"21",X"21",X"A1",X"A0", + X"FF",X"1F",X"0E",X"3F",X"0B",X"5F",X"07",X"89",X"89",X"8D",X"8D",X"8E",X"8E",X"90",X"90",X"89", + X"89",X"8D",X"8D",X"8B",X"8B",X"84",X"84",X"89",X"89",X"8D",X"8D",X"8E",X"8E",X"8F",X"8F",X"1F", + X"0B",X"90",X"92",X"90",X"92",X"B0",X"90",X"92",X"90",X"92",X"B0",X"FF",X"1F",X"05",X"3F",X"0B", + X"5F",X"07",X"83",X"8F",X"87",X"8F",X"88",X"8F",X"8A",X"8F",X"83",X"8F",X"87",X"8F",X"85",X"91", + X"8A",X"91",X"83",X"8F",X"87",X"8F",X"88",X"8F",X"8A",X"8F",X"1F",X"08",X"90",X"92",X"90",X"92", + X"B0",X"90",X"92",X"90",X"92",X"B0",X"FF",X"1F",X"05",X"3F",X"0B",X"5F",X"07",X"83",X"93",X"80", + X"93",X"80",X"93",X"80",X"93",X"80",X"93",X"80",X"93",X"80",X"94",X"80",X"94",X"80",X"93",X"80", + X"93",X"80",X"93",X"80",X"93",X"1F",X"02",X"90",X"92",X"90",X"92",X"B0",X"90",X"92",X"90",X"92", + X"B0",X"FF",X"1F",X"0E",X"3F",X"0E",X"5F",X"07",X"A4",X"A8",X"AB",X"84",X"A8",X"AB",X"84",X"A8", + X"AB",X"A9",X"AD",X"AD",X"84",X"A9",X"AD",X"84",X"A9",X"AD",X"A4",X"A8",X"AB",X"84",X"A8",X"AB", + X"84",X"A8",X"AB",X"A9",X"A9",X"89",X"A9",X"29",X"29",X"29",X"29",X"29",X"29",X"29",X"29",X"A9", + X"A0",X"C0",X"AD",X"AE",X"AD",X"AB",X"A9",X"AB",X"A9",X"A6",X"AB",X"8B",X"8D",X"8B",X"8B",X"A9", + X"A8",X"A6",X"A4",X"A0",X"AD",X"AE",X"AD",X"AB",X"A9",X"AB",X"A9",X"A6",X"8B",X"8B",X"8B",X"8D", + X"8B",X"8B",X"A9",X"88",X"88",X"86",X"86",X"A4",X"A0",X"FF",X"1F",X"05",X"3F",X"0E",X"5F",X"06", + X"AA",X"B1",X"B1",X"8A",X"B1",X"B1",X"8A",X"B1",X"B1",X"A3",X"AF",X"AF",X"83",X"AF",X"AF",X"83", + X"AF",X"AF",X"AA",X"B1",X"B1",X"8A",X"B1",X"B1",X"8A",X"B1",X"B1",X"A3",X"A3",X"88",X"A8",X"83", + X"A3",X"83",X"83",X"85",X"85",X"A6",X"A7",X"B1",X"AB",X"B1",X"A7",X"AF",X"AC",X"AF",X"A5",X"AF", + X"AC",X"AF",X"AA",X"B1",X"A5",X"B1",X"A7",X"B1",X"AB",X"B1",X"A7",X"AF",X"AC",X"AF",X"A5",X"AF", + X"AC",X"AF",X"AA",X"B1",X"A5",X"B1",X"FF",X"1F",X"08",X"3F",X"0E",X"5F",X"06",X"A4",X"AE",X"AE", + X"80",X"AE",X"AE",X"80",X"AE",X"AE",X"A0",X"AD",X"AD",X"80",X"AD",X"AD",X"80",X"AD",X"AD",X"A4", + X"AE",X"AE",X"80",X"AE",X"AE",X"80",X"AE",X"AE",X"AD",X"AD",X"8E",X"AE",X"8D",X"E0",X"A0",X"AD", + X"A0",X"AD",X"A0",X"AD",X"A0",X"AD",X"A0",X"AF",X"A0",X"AF",X"A0",X"AE",X"A0",X"AE",X"A0",X"AD", + X"A0",X"AD",X"A0",X"AD",X"A0",X"AD",X"A0",X"AF",X"A0",X"AF",X"A0",X"AE",X"A0",X"AE",X"FF",X"1F", + X"0E",X"3F",X"0B",X"5F",X"06",X"90",X"91",X"92",X"91",X"90",X"91",X"B2",X"8D",X"8B",X"8B",X"8D", + X"AB",X"A0",X"8B",X"8D",X"90",X"8B",X"8D",X"90",X"8B",X"8B",X"8C",X"8C",X"8C",X"8D",X"A9",X"A0", + X"90",X"91",X"92",X"91",X"90",X"91",X"B2",X"8D",X"8B",X"8B",X"8D",X"AD",X"A0",X"8B",X"8D",X"90", + X"8B",X"8D",X"90",X"8B",X"8B",X"6C",X"60",X"6C",X"60",X"6B",X"6B",X"60",X"29",X"29",X"29",X"29", + X"89",X"64",X"66",X"60",X"64",X"86",X"FF",X"1F",X"05",X"3F",X"0B",X"5F",X"05",X"83",X"8F",X"87", + X"8F",X"83",X"8F",X"87",X"8F",X"85",X"8F",X"8C",X"8F",X"85",X"8F",X"8C",X"8F",X"8A",X"91",X"85", + X"91",X"8A",X"91",X"85",X"87",X"88",X"92",X"8C",X"92",X"83",X"8F",X"87",X"8F",X"83",X"8F",X"87", + X"8F",X"83",X"8F",X"87",X"8F",X"85",X"8F",X"8C",X"8F",X"85",X"8F",X"8C",X"8F",X"8A",X"91",X"85", + X"91",X"8A",X"91",X"85",X"87",X"1F",X"08",X"6C",X"60",X"6C",X"60",X"6B",X"6B",X"60",X"29",X"29", + X"29",X"29",X"89",X"64",X"66",X"60",X"64",X"86",X"FF",X"1F",X"08",X"3F",X"0B",X"5F",X"05",X"89", + X"8D",X"80",X"8D",X"80",X"8D",X"80",X"8D",X"80",X"8F",X"80",X"8F",X"80",X"8F",X"80",X"8F",X"80", + X"8E",X"80",X"8E",X"80",X"8E",X"A0",X"80",X"8E",X"80",X"8E",X"80",X"8D",X"80",X"8D",X"89",X"8D", + X"80",X"8D",X"80",X"8D",X"80",X"8D",X"80",X"8F",X"80",X"8F",X"80",X"8F",X"80",X"8F",X"80",X"8E", + X"80",X"8E",X"80",X"8E",X"A0",X"1F",X"02",X"5F",X"07",X"6C",X"60",X"6C",X"60",X"6B",X"6B",X"60", + X"29",X"29",X"29",X"29",X"89",X"64",X"66",X"60",X"64",X"86",X"FF",X"1F",X"0B",X"3F",X"0E",X"5F", + X"07",X"6B",X"69",X"86",X"8E",X"8E",X"6B",X"69",X"86",X"8E",X"8E",X"6B",X"69",X"86",X"8E",X"8B", + X"8E",X"89",X"8D",X"8D",X"6B",X"69",X"89",X"8D",X"8D",X"6B",X"69",X"89",X"8D",X"8D",X"6B",X"69", + X"89",X"8D",X"8B",X"8D",X"8E",X"8E",X"8E",X"FF",X"1F",X"0B",X"3F",X"0E",X"5F",X"06",X"6B",X"69", + X"80",X"86",X"86",X"6B",X"69",X"80",X"86",X"86",X"6B",X"69",X"80",X"86",X"80",X"86",X"80",X"87", + X"87",X"6B",X"69",X"80",X"87",X"87",X"6B",X"69",X"80",X"87",X"87",X"6B",X"69",X"80",X"87",X"80", + X"87",X"80",X"86",X"86",X"FF",X"1F",X"05",X"3F",X"0E",X"5F",X"06",X"80",X"2E",X"2E",X"2E",X"2E", + X"2E",X"2E",X"2E",X"2E",X"AE",X"80",X"2E",X"2E",X"2E",X"2E",X"2E",X"2E",X"2E",X"2E",X"AE",X"80", + X"AE",X"AB",X"29",X"29",X"29",X"29",X"29",X"29",X"29",X"29",X"A9",X"80",X"29",X"29",X"29",X"29", + X"29",X"29",X"29",X"29",X"A9",X"80",X"29",X"29",X"29",X"29",X"29",X"29",X"29",X"29",X"A9",X"80", + X"A9",X"AB",X"2E",X"2E",X"2E",X"2E",X"2E",X"2E",X"2E",X"2E",X"AE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_SND_2.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_SND_2.vhd new file mode 100644 index 00000000..43e9cd64 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/ROM/ROM_SND_2.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_SND_2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_SND_2 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"88",X"8C",X"8F",X"8C",X"88",X"8C",X"88",X"8C",X"8F",X"8C",X"88",X"AF",X"FF",X"1F",X"0A",X"5F", + X"09",X"A8",X"80",X"68",X"68",X"A8",X"80",X"68",X"68",X"88",X"83",X"88",X"8C",X"88",X"83",X"88", + X"83",X"88",X"8C",X"88",X"83",X"88",X"83",X"88",X"8C",X"88",X"83",X"AC",X"FF",X"FF",X"CD",X"C7", + X"06",X"3E",X"01",X"32",X"73",X"80",X"CD",X"0D",X"05",X"C3",X"8E",X"0F",X"CD",X"C7",X"06",X"CD", + X"0D",X"05",X"C9",X"CD",X"C7",X"06",X"CD",X"0D",X"05",X"C9",X"DD",X"21",X"50",X"80",X"C3",X"DA", + X"0D",X"DD",X"21",X"58",X"80",X"C3",X"DA",X"0D",X"DD",X"21",X"60",X"80",X"C3",X"DA",X"0D",X"1F", + X"0A",X"3F",X"0E",X"5F",X"08",X"85",X"85",X"85",X"8A",X"8A",X"8A",X"8A",X"91",X"91",X"91",X"91", + X"8F",X"8F",X"D6",X"93",X"8F",X"93",X"B6",X"93",X"8F",X"93",X"B6",X"FF",X"1F",X"0A",X"5F",X"08", + X"85",X"85",X"85",X"85",X"85",X"85",X"85",X"8E",X"8E",X"8E",X"8E",X"8C",X"8C",X"D3",X"8F",X"8C", + X"8F",X"B3",X"8F",X"8C",X"8F",X"B3",X"FF",X"1F",X"0A",X"5F",X"08",X"91",X"91",X"91",X"8A",X"8A", + X"8A",X"8A",X"96",X"96",X"96",X"96",X"94",X"94",X"D6",X"93",X"8F",X"93",X"B6",X"93",X"8F",X"93", + X"B6",X"FF",X"CD",X"C7",X"06",X"3E",X"02",X"32",X"73",X"80",X"CD",X"0D",X"05",X"C3",X"8E",X"0F", + X"CD",X"C7",X"06",X"CD",X"0D",X"05",X"C9",X"DD",X"21",X"50",X"80",X"C3",X"DA",X"0D",X"DD",X"21", + X"58",X"80",X"C3",X"DA",X"0D",X"1F",X"0A",X"3F",X"0A",X"5F",X"09",X"8D",X"8F",X"91",X"8F",X"91", + X"94",X"91",X"8F",X"8D",X"8F",X"91",X"8D",X"8F",X"8C",X"AD",X"FF",X"1F",X"0A",X"5F",X"09",X"8A", + X"8C",X"8D",X"8C",X"8D",X"8F",X"8D",X"8C",X"8A",X"8C",X"8D",X"8A",X"8C",X"88",X"AA",X"FF",X"FF", + X"CD",X"BC",X"07",X"21",X"00",X"03",X"22",X"83",X"80",X"21",X"80",X"80",X"36",X"01",X"21",X"00", + X"08",X"22",X"81",X"80",X"CD",X"C6",X"04",X"CD",X"0D",X"05",X"06",X"0B",X"CD",X"FE",X"05",X"C9", + X"2A",X"83",X"80",X"2B",X"22",X"83",X"80",X"7D",X"B4",X"28",X"52",X"3A",X"80",X"80",X"FE",X"00", + X"28",X"1E",X"FE",X"01",X"28",X"0E",X"FE",X"02",X"28",X"05",X"21",X"00",X"0A",X"18",X"08",X"21", + X"00",X"06",X"18",X"03",X"21",X"00",X"08",X"22",X"81",X"80",X"CD",X"C6",X"04",X"AF",X"18",X"28", + X"2A",X"81",X"80",X"11",X"20",X"00",X"ED",X"52",X"22",X"81",X"80",X"7C",X"FE",X"00",X"28",X"06", + X"CD",X"C6",X"04",X"AF",X"18",X"12",X"CD",X"C6",X"04",X"3A",X"80",X"80",X"3C",X"32",X"80",X"80", + X"FE",X"04",X"28",X"02",X"AF",X"C9",X"3E",X"01",X"32",X"80",X"80",X"AF",X"C9",X"3E",X"FF",X"C9", + X"CD",X"BC",X"07",X"3E",X"01",X"32",X"86",X"80",X"3E",X"20",X"32",X"87",X"80",X"3E",X"06",X"32", + X"88",X"80",X"AF",X"32",X"89",X"80",X"32",X"8A",X"80",X"21",X"00",X"03",X"22",X"8D",X"80",X"21", + X"00",X"04",X"22",X"8B",X"80",X"CD",X"C6",X"04",X"CD",X"0D",X"05",X"06",X"0B",X"CD",X"FE",X"05", + X"C9",X"2A",X"8D",X"80",X"2B",X"7C",X"B5",X"28",X"5D",X"22",X"8D",X"80",X"3A",X"89",X"80",X"FE", + X"00",X"28",X"06",X"FE",X"01",X"28",X"24",X"AF",X"C9",X"21",X"86",X"80",X"35",X"20",X"F8",X"36", + X"01",X"CD",X"80",X"06",X"B7",X"11",X"08",X"00",X"ED",X"52",X"CD",X"C6",X"04",X"21",X"87",X"80", + X"35",X"20",X"E4",X"36",X"20",X"21",X"89",X"80",X"34",X"18",X"DC",X"2A",X"8B",X"80",X"11",X"30", + X"00",X"3A",X"8A",X"80",X"E6",X"01",X"20",X"1B",X"B7",X"ED",X"52",X"22",X"8B",X"80",X"CD",X"C6", + X"04",X"21",X"88",X"80",X"35",X"20",X"06",X"36",X"06",X"21",X"8A",X"80",X"34",X"21",X"89",X"80", + X"35",X"18",X"B4",X"19",X"18",X"E5",X"3E",X"FF",X"C9",X"C9",X"3E",X"FF",X"C9",X"CD",X"82",X"07", + X"3E",X"01",X"32",X"A0",X"80",X"3E",X"20",X"32",X"A1",X"80",X"3E",X"10",X"32",X"A2",X"80",X"AF", + X"32",X"A5",X"80",X"32",X"A6",X"80",X"21",X"00",X"01",X"22",X"A3",X"80",X"21",X"00",X"05",X"22", + X"A7",X"80",X"CD",X"C6",X"04",X"CD",X"0D",X"05",X"06",X"0D",X"CD",X"FE",X"05",X"C9",X"2A",X"A3", + X"80",X"2B",X"7C",X"B5",X"28",X"5D",X"22",X"A3",X"80",X"3A",X"A5",X"80",X"FE",X"00",X"28",X"06", + X"FE",X"01",X"28",X"24",X"AF",X"C9",X"21",X"A0",X"80",X"35",X"20",X"F8",X"36",X"01",X"CD",X"80", + X"06",X"B7",X"11",X"04",X"00",X"ED",X"52",X"CD",X"C6",X"04",X"21",X"A1",X"80",X"35",X"20",X"E4", + X"36",X"20",X"21",X"A5",X"80",X"34",X"18",X"DC",X"2A",X"A7",X"80",X"11",X"50",X"00",X"3A",X"A6", + X"80",X"E6",X"01",X"20",X"1B",X"B7",X"ED",X"52",X"22",X"A7",X"80",X"CD",X"C6",X"04",X"21",X"A2", + X"80",X"35",X"20",X"06",X"36",X"10",X"21",X"A6",X"80",X"34",X"21",X"A5",X"80",X"35",X"18",X"B4", + X"19",X"18",X"E5",X"3E",X"FF",X"C9",X"CD",X"C7",X"06",X"3E",X"18",X"32",X"B0",X"80",X"21",X"00", + X"01",X"22",X"B1",X"80",X"AF",X"32",X"B3",X"80",X"21",X"00",X"02",X"22",X"B4",X"80",X"16",X"06", + X"1E",X"00",X"CD",X"4C",X"05",X"CD",X"80",X"05",X"06",X"03",X"CD",X"FE",X"05",X"C9",X"2A",X"B4", + X"80",X"2B",X"7C",X"B5",X"28",X"4B",X"22",X"B4",X"80",X"3A",X"B3",X"80",X"FE",X"00",X"28",X"1B", + X"2A",X"B1",X"80",X"2B",X"7C",X"B5",X"20",X"34",X"21",X"00",X"01",X"22",X"B1",X"80",X"16",X"06", + X"1E",X"00",X"CD",X"4C",X"05",X"AF",X"32",X"B3",X"80",X"AF",X"C9",X"21",X"B0",X"80",X"35",X"20", + X"F8",X"36",X"18",X"16",X"06",X"CD",X"35",X"06",X"1C",X"7B",X"FE",X"08",X"28",X"05",X"CD",X"4C", + X"05",X"18",X"E6",X"CD",X"4C",X"05",X"21",X"B3",X"80",X"34",X"18",X"DD",X"22",X"B1",X"80",X"18", + X"D8",X"3E",X"FF",X"C9",X"CD",X"BC",X"07",X"3E",X"01",X"32",X"C0",X"80",X"21",X"00",X"08",X"22", + X"C3",X"80",X"AF",X"32",X"C5",X"80",X"21",X"00",X"02",X"22",X"C6",X"80",X"21",X"00",X"05",X"CD", + X"C6",X"04",X"CD",X"0D",X"05",X"06",X"08",X"CD",X"FE",X"05",X"C9",X"2A",X"C6",X"80",X"2B",X"7C", + X"B5",X"28",X"43",X"22",X"C6",X"80",X"21",X"C0",X"80",X"35",X"20",X"2C",X"36",X"01",X"CD",X"80", + X"06",X"11",X"08",X"00",X"19",X"ED",X"5B",X"C3",X"80",X"7C",X"BA",X"20",X"18",X"7D",X"BB",X"20", + X"14",X"3A",X"C5",X"80",X"B7",X"20",X"13",X"21",X"00",X"0B",X"22",X"C3",X"80",X"3E",X"FF",X"32", + X"C5",X"80",X"21",X"00",X"05",X"CD",X"C6",X"04",X"AF",X"C9",X"21",X"00",X"08",X"22",X"C3",X"80", + X"AF",X"32",X"C5",X"80",X"18",X"EC",X"3E",X"FF",X"C9",X"CD",X"48",X"07",X"3E",X"08",X"32",X"D0", + X"80",X"3E",X"05",X"32",X"D1",X"80",X"3E",X"0C",X"32",X"D2",X"80",X"AF",X"32",X"D3",X"80",X"21", + X"50",X"00",X"CD",X"C6",X"04",X"CD",X"0D",X"05",X"06",X"00",X"CD",X"FE",X"05",X"C9",X"3A",X"D3", + X"80",X"FE",X"00",X"28",X"18",X"FE",X"01",X"28",X"26",X"FE",X"02",X"28",X"27",X"FE",X"03",X"28", + X"33",X"21",X"D2",X"80",X"35",X"28",X"32",X"AF",X"32",X"D3",X"80",X"AF",X"C9",X"CD",X"4B",X"06", + X"3C",X"FE",X"0A",X"20",X"04",X"21",X"D3",X"80",X"34",X"47",X"CD",X"FE",X"05",X"18",X"EC",X"CD", + X"1C",X"14",X"18",X"E7",X"CD",X"4B",X"06",X"3D",X"20",X"04",X"21",X"D3",X"80",X"34",X"47",X"CD", + X"FE",X"05",X"18",X"D7",X"CD",X"29",X"14",X"18",X"D2",X"3E",X"FF",X"C9",X"21",X"D0",X"80",X"35", + X"C0",X"3E",X"08",X"77",X"21",X"D3",X"80",X"34",X"C9",X"21",X"D1",X"80",X"35",X"C0",X"3E",X"05", + X"77",X"21",X"D3",X"80",X"34",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/YM2149_linmix_sep.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/YM2149_linmix_sep.vhd new file mode 100644 index 00000000..6ed2498a --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/YM2149_linmix_sep.vhd @@ -0,0 +1,574 @@ +-- changes for seperate audio outputs and enable now enables cpu access as well +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + O_CHAN : out std_logic_vector(1 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal cnt_div_t1 : std_logic_vector(3 downto 0); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8; + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process(RESET_L, CLK) + begin + -- looks like registers are latches in real chip, but the address is caught at the end of the address state. + if (RESET_L = '0') then + addr <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA = '1') then + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end if; + end process; + + p_wdata : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + elsif rising_edge(CLK) then + if (ENA = '1') then + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, reg, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + -- envelope shapes + -- C AtAlH + -- 0 0 x x \___ + -- + -- 0 1 x x /___ + -- + -- 1 0 0 0 \\\\ + -- + -- 1 0 0 1 \___ + -- + -- 1 0 1 0 \/\/ + -- ___ + -- 1 0 1 1 \ + -- + -- 1 1 0 0 //// + -- ___ + -- 1 1 0 1 / + -- + -- 1 1 1 0 /\/\ + -- + -- 1 1 1 1 /___ + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + cnt_div_t1 <= cnt_div; + end if; + end process; + + p_audio_output : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_AUDIO <= (others => '0'); + O_CHAN <= (others => '0'); + elsif rising_edge(CLK) then + + if (ENA = '1') then + O_AUDIO <= dac_amp(7 downto 0); + O_CHAN <= cnt_div_t1(1 downto 0); + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then -- resync + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end if; + end process; +end architecture RTL; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/build_id.tcl b/Arcade/Scramble Hardware/Amidar_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_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/Arcade/Scramble Hardware/Amidar_MiST/rtl/build_id.v b/Arcade/Scramble Hardware/Amidar_MiST/rtl/build_id.v new file mode 100644 index 00000000..7a9ccfc6 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171117" +`define BUILD_TIME "104831" diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80sed.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/dac.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/dac.vhd new file mode 100644 index 00000000..47b2185e --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 10 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/dpram.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/hq2x.sv b/Arcade/Scramble Hardware/Amidar_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_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/Arcade/Scramble Hardware/Amidar_MiST/rtl/i82c55.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/i82c55.vhd new file mode 100644 index 00000000..d415d932 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/i82c55.vhd @@ -0,0 +1,686 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- + +library ieee ; + use ieee.std_logic_1164.all ; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity I82C55 is + port ( + + I_ADDR : in std_logic_vector(1 downto 0); -- A1-A0 + I_DATA : in std_logic_vector(7 downto 0); -- D7-D0 + O_DATA : out std_logic_vector(7 downto 0); + O_DATA_OE_L : out std_logic; + + I_CS_L : in std_logic; + I_RD_L : in std_logic; + I_WR_L : in std_logic; + + I_PA : in std_logic_vector(7 downto 0); + O_PA : out std_logic_vector(7 downto 0); + O_PA_OE_L : out std_logic_vector(7 downto 0); + + I_PB : in std_logic_vector(7 downto 0); + O_PB : out std_logic_vector(7 downto 0); + O_PB_OE_L : out std_logic_vector(7 downto 0); + + I_PC : in std_logic_vector(7 downto 0); + O_PC : out std_logic_vector(7 downto 0); + O_PC_OE_L : out std_logic_vector(7 downto 0); + + RESET : in std_logic; + ENA : in std_logic; -- (CPU) clk enable + CLK : in std_logic + ); +end; + +architecture RTL of I82C55 is + + -- registers + signal bit_mask : std_logic_vector(7 downto 0); + signal r_porta : std_logic_vector(7 downto 0); + signal r_portb : std_logic_vector(7 downto 0); + signal r_portc : std_logic_vector(7 downto 0); + signal r_control : std_logic_vector(7 downto 0); + -- + signal porta_we : std_logic; + signal portb_we : std_logic; + signal porta_re : std_logic; + signal portb_re : std_logic; + -- + signal porta_we_t1 : std_logic; + signal portb_we_t1 : std_logic; + signal porta_re_t1 : std_logic; + signal portb_re_t1 : std_logic; + -- + signal porta_we_rising : boolean; + signal portb_we_rising : boolean; + signal porta_re_rising : boolean; + signal portb_re_rising : boolean; + -- + signal groupa_mode : std_logic_vector(1 downto 0); -- port a/c upper + signal groupb_mode : std_logic; -- port b/c lower + -- + signal porta_read : std_logic_vector(7 downto 0); + signal portb_read : std_logic_vector(7 downto 0); + signal portc_read : std_logic_vector(7 downto 0); + signal control_read : std_logic_vector(7 downto 0); + signal mode_clear : std_logic; + -- + signal a_inte1 : std_logic; + signal a_inte2 : std_logic; + signal b_inte : std_logic; + -- + signal a_intr : std_logic; + signal a_obf_l : std_logic; + signal a_ibf : std_logic; + signal a_ack_l : std_logic; + signal a_stb_l : std_logic; + signal a_ack_l_t1 : std_logic; + signal a_stb_l_t1 : std_logic; + -- + signal b_intr : std_logic; + signal b_obf_l : std_logic; + signal b_ibf : std_logic; + signal b_ack_l : std_logic; + signal b_stb_l : std_logic; + signal b_ack_l_t1 : std_logic; + signal b_stb_l_t1 : std_logic; + -- + signal a_ack_l_rising : boolean; + signal a_stb_l_rising : boolean; + signal b_ack_l_rising : boolean; + signal b_stb_l_rising : boolean; + -- + signal porta_ipreg : std_logic_vector(7 downto 0); + signal portb_ipreg : std_logic_vector(7 downto 0); +begin + -- + -- mode 0 - basic input/output + -- mode 1 - strobed input/output + -- mode 2/3 - bi-directional bus + -- + -- control word (write) + -- + -- D7 mode set flag 1 = active + -- D6..5 GROUPA mode selection (mode 0,1,2) + -- D4 GROUPA porta 1 = input, 0 = output + -- D3 GROUPA portc upper 1 = input, 0 = output + -- D2 GROUPB mode selection (mode 0 ,1) + -- D1 GROUPB portb 1 = input, 0 = output + -- D0 GROUPB portc lower 1 = input, 0 = output + -- + -- D7 bit set/reset 0 = active + -- D6..4 x + -- D3..1 bit select + -- d0 1 = set, 0 - reset + -- + -- all output registers including status are reset when mode is changed + --1. Port A: + --All Modes: Output data is cleared, input data is not cleared. + + --2. Port B: + --Mode 0: Output data is cleared, input data is not cleared. + --Mode 1 and 2: Both output and input data are cleared. + + --3. Port C: + --Mode 0:Output data is cleared, input data is not cleared. + --Mode 1 and 2: IBF and INTR are cleared and OBF# is set. + --Outputs in Port C which are not used for handshaking or interrupt signals are cleared. + --Inputs such as STB#, ACK#, or "spare" inputs are not affected. The interrupts for Ports A and B are disabled. + + p_bit_mask : process(I_DATA) + begin + bit_mask <= x"01"; + case I_DATA(3 downto 1) is + when "000" => bit_mask <= x"01"; + when "001" => bit_mask <= x"02"; + when "010" => bit_mask <= x"04"; + when "011" => bit_mask <= x"08"; + when "100" => bit_mask <= x"10"; + when "101" => bit_mask <= x"20"; + when "110" => bit_mask <= x"40"; + when "111" => bit_mask <= x"80"; + when others => null; + end case; + end process; + + p_write_reg_reset : process(RESET, CLK) + variable r_portc_masked : std_logic_vector(7 downto 0); + variable r_portc_setclr : std_logic_vector(7 downto 0); + begin + if (RESET = '1') then + r_porta <= x"00"; + r_portb <= x"00"; + r_portc <= x"00"; + r_control <= x"9B"; -- 10011011 + mode_clear <= '1'; + elsif rising_edge(CLK) then + + r_portc_masked := (not bit_mask) and r_portc; + for i in 0 to 7 loop + r_portc_setclr(i) := bit_mask(i) and I_DATA(0); + end loop; + + if (ENA = '1') then + mode_clear <= '0'; + if (I_CS_L = '0') and (I_WR_L = '0') then + case I_ADDR is + when "00" => r_porta <= I_DATA; + when "01" => r_portb <= I_DATA; + when "10" => r_portc <= I_DATA; + + when "11" => if (I_DATA(7) = '0') then -- set/clr + r_portc <= r_portc_masked or r_portc_setclr; + else + --mode_clear <= '1'; + --r_porta <= x"00"; + --r_portb <= x"00"; -- clear port b input reg + --r_portc <= x"00"; -- clear control sigs + r_control <= I_DATA; -- load new mode + end if; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_decode_control : process(r_control) + begin + groupa_mode <= r_control(6 downto 5); + groupb_mode <= r_control(2); + end process; + + p_oe : process(I_CS_L, I_RD_L) + begin + O_DATA_OE_L <= '1'; + if (I_CS_L = '0') and (I_RD_L = '0') then + O_DATA_OE_L <= '0'; + end if; + end process; + + p_read : process(I_ADDR, porta_read, portb_read, portc_read, control_read) + begin + O_DATA <= x"00"; -- default + --if (I_CS_L = '0') and (I_RD_L = '0') then -- not required + case I_ADDR is + when "00" => O_DATA <= porta_read; + when "01" => O_DATA <= portb_read; + when "10" => O_DATA <= portc_read; + when "11" => O_DATA <= control_read; + when others => null; + end case; + --end if; + end process; + control_read(7) <= '1'; -- always 1 + control_read(6 downto 0) <= r_control(6 downto 0); + + p_rw_control : process(I_CS_L, I_RD_L, I_WR_L, I_ADDR) + begin + porta_we <= '0'; + portb_we <= '0'; + porta_re <= '0'; + portb_re <= '0'; + + if (I_CS_L = '0') and (I_ADDR = "00") then + porta_we <= not I_WR_L; + porta_re <= not I_RD_L; + end if; + + if (I_CS_L = '0') and (I_ADDR = "01") then + portb_we <= not I_WR_L; + portb_re <= not I_RD_L; + end if; + end process; + + p_rw_control_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + porta_we_t1 <= porta_we; + portb_we_t1 <= portb_we; + porta_re_t1 <= porta_re; + portb_re_t1 <= portb_re; + + a_stb_l_t1 <= a_stb_l; + a_ack_l_t1 <= a_ack_l; + b_stb_l_t1 <= b_stb_l; + b_ack_l_t1 <= b_ack_l; + end if; + end process; + + porta_we_rising <= (porta_we = '0') and (porta_we_t1 = '1'); -- falling as inverted + portb_we_rising <= (portb_we = '0') and (portb_we_t1 = '1'); -- " + porta_re_rising <= (porta_re = '0') and (porta_re_t1 = '1'); -- falling as inverted + portb_re_rising <= (portb_re = '0') and (portb_re_t1 = '1'); -- " + -- + a_stb_l_rising <= (a_stb_l = '1') and (a_stb_l_t1 = '0'); + a_ack_l_rising <= (a_ack_l = '1') and (a_ack_l_t1 = '0'); + b_stb_l_rising <= (b_stb_l = '1') and (b_stb_l_t1 = '0'); + b_ack_l_rising <= (b_ack_l = '1') and (b_ack_l_t1 = '0'); + -- + -- GROUP A + -- in mode 1 + -- + -- d4=1 (porta = input) + -- pc7,6 io (d3=1 input, d3=0 output) + -- pc5 output a_ibf + -- pc4 input a_stb_l + -- pc3 output a_intr + -- + -- d4=0 (porta = output) + -- pc7 output a_obf_l + -- pc6 input a_ack_l + -- pc5,4 io (d3=1 input, d3=0 output) + -- pc3 output a_intr + -- + -- GROUP B + -- in mode 1 + -- d1=1 (portb = input) + -- pc2 input b_stb_l + -- pc1 output b_ibf + -- pc0 output b_intr + -- + -- d1=0 (portb = output) + -- pc2 input b_ack_l + -- pc1 output b_obf_l + -- pc0 output b_intr + + + -- WHEN AN INPUT + -- + -- stb_l a low on this input latches input data + -- ibf a high on this output indicates data latched. set by stb_l and reset by rising edge of RD_L + -- intr a high on this output indicates interrupt. set by stb_l high, ibf high and inte high. reset by falling edge of RD_L + -- inte A controlled by bit/set PC4 + -- inte B controlled by bit/set PC2 + + -- WHEN AN OUTPUT + -- + -- obf_l output will go low when cpu has written data + -- ack_l input - a low on this clears obf_l + -- intr output set when ack_l is high, obf_l is high and inte is one. reset by falling edge of WR_L + -- inte A controlled by bit/set PC6 + -- inte B controlled by bit/set PC2 + + -- GROUP A + -- in mode 2 + -- + -- porta = IO + -- + -- control bits 2..0 still control groupb/c lower 2..0 + -- + -- + -- PC7 output a_obf + -- PC6 input a_ack_l + -- PC5 output a_ibf + -- PC4 input a_stb_l + -- PC3 is still interrupt out + p_control_flags : process(RESET, CLK) + variable we : boolean; + variable set1 : boolean; + variable set2 : boolean; + begin + if (RESET = '1') then + a_obf_l <= '1'; + a_inte1 <= '0'; + a_ibf <= '0'; + a_inte2 <= '0'; + a_intr <= '0'; + -- + b_inte <= '0'; + b_obf_l <= '1'; + b_ibf <= '0'; + b_intr <= '0'; + elsif rising_edge(CLK) then + we := (I_CS_L = '0') and (I_WR_L = '0') and (I_ADDR = "11") and (I_DATA(7) = '0'); + + if (ENA = '1') then + if (mode_clear = '1') then + a_obf_l <= '1'; + a_inte1 <= '0'; + a_ibf <= '0'; + a_inte2 <= '0'; + a_intr <= '0'; + -- + b_inte <= '0'; + b_obf_l <= '1'; + b_ibf <= '0'; + b_intr <= '0'; + else + if (bit_mask(7) = '1') and we then + a_obf_l <= I_DATA(0); + else + if porta_we_rising then + a_obf_l <= '0'; + elsif (a_ack_l = '0') then + a_obf_l <= '1'; + end if; + end if; + -- + if (bit_mask(6) = '1') and we then a_inte1 <= I_DATA(0); end if; -- bus set when mode1 & input? + -- + if (bit_mask(5) = '1') and we then + a_ibf <= I_DATA(0); + else + if porta_re_rising then + a_ibf <= '0'; + elsif (a_stb_l = '0') then + a_ibf <= '1'; + end if; + end if; + -- + if (bit_mask(4) = '1') and we then a_inte2 <= I_DATA(0); end if; -- bus set when mode1 & output? + -- + set1 := a_ack_l_rising and (a_obf_l = '1') and (a_inte1 = '1'); + set2 := a_stb_l_rising and (a_ibf = '1') and (a_inte2 = '1'); + -- + if (bit_mask(3) = '1') and we then + a_intr <= I_DATA(0); + else + if (groupa_mode(1) = '1') then + if (porta_we = '1') or (porta_re = '1') then + a_intr <= '0'; + elsif set1 or set2 then + a_intr <= '1'; + end if; + else + if (r_control(4) = '0') then -- output + if (porta_we = '1') then -- falling ? + a_intr <= '0'; + elsif set1 then + a_intr <= '1'; + end if; + elsif (r_control(4) = '1') then -- input + if (porta_re = '1') then -- falling ? + a_intr <= '0'; + elsif set2 then + a_intr <= '1'; + end if; + end if; + end if; + end if; + -- + if (bit_mask(2) = '1') and we then b_inte <= I_DATA(0); end if; -- bus set? + + if (bit_mask(1) = '1') and we then + b_obf_l <= I_DATA(0); + else + if (r_control(1) = '0') then -- output + if portb_we_rising then + b_obf_l <= '0'; + elsif (b_ack_l = '0') then + b_obf_l <= '1'; + end if; + else + if portb_re_rising then + b_ibf <= '0'; + elsif (b_stb_l = '0') then + b_ibf <= '1'; + end if; + end if; + end if; + + if (bit_mask(0) = '1') and we then + b_intr <= I_DATA(0); + else + if (r_control(1) = '0') then -- output + if (portb_we = '1') then -- falling ? + b_intr <= '0'; + elsif b_ack_l_rising and (b_obf_l = '1') and (b_inte = '1') then + b_intr <= '1'; + end if; + else + if (portb_re = '1') then -- falling ? + b_intr <= '0'; + elsif b_stb_l_rising and (b_ibf = '1') and (b_inte = '1') then + b_intr <= '1'; + end if; + end if; + end if; + + end if; + end if; + end if; + end process; + + p_porta : process(r_control, groupa_mode, r_porta, I_PA, porta_ipreg, a_ack_l) + begin + -- D4 GROUPA porta 1 = input, 0 = output + O_PA <= x"FF"; -- if not driven, float high + O_PA_OE_L <= x"FF"; + porta_read <= x"00"; + + if (groupa_mode = "00") then -- simple io + if (r_control(4) = '0') then -- output + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= I_PA; + elsif (groupa_mode = "01") then -- strobed + if (r_control(4) = '0') then -- output + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= porta_ipreg; + else -- if (groupa_mode(1) = '1') then -- bi dir + if (a_ack_l = '0') then -- output enable + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= porta_ipreg; -- latched data + end if; + + end process; + + p_portb : process(r_control, groupb_mode, r_portb, I_PB, portb_ipreg) + begin + O_PB <= x"FF"; -- if not driven, float high + O_PB_OE_L <= x"FF"; + portb_read <= x"00"; + + if (groupb_mode = '0') then -- simple io + if (r_control(1) = '0') then -- output + O_PB <= r_portb; + O_PB_OE_L <= x"00"; + end if; + portb_read <= I_PB; + else -- strobed mode + if (r_control(1) = '0') then -- output + O_PB <= r_portb; + O_PB_OE_L <= x"00"; + end if; + portb_read <= portb_ipreg; + end if; + end process; + + p_portc_out : process(r_portc, r_control, groupa_mode, groupb_mode, + a_obf_l, a_ibf, a_intr,b_obf_l, b_ibf, b_intr) + begin + O_PC <= x"FF"; -- if not driven, float high + O_PC_OE_L <= x"FF"; + + -- bits 7..4 + if (groupa_mode = "00") then -- simple io + if (r_control(3) = '0') then -- output + O_PC (7 downto 4) <= r_portc(7 downto 4); + O_PC_OE_L(7 downto 4) <= x"0"; + end if; + elsif (groupa_mode = "01") then -- mode1 + + if (r_control(4) = '0') then -- port a output + O_PC (7) <= a_obf_l; + O_PC_OE_L(7) <= '0'; + -- 6 is ack_l input + if (r_control(3) = '0') then -- port c output + O_PC (5 downto 4) <= r_portc(5 downto 4); + O_PC_OE_L(5 downto 4) <= "00"; + end if; + else -- port a input + if (r_control(3) = '0') then -- port c output + O_PC (7 downto 6) <= r_portc(7 downto 6); + O_PC_OE_L(7 downto 6) <= "00"; + end if; + O_PC (5) <= a_ibf; + O_PC_OE_L(5) <= '0'; + -- 4 is stb_l input + end if; + + else -- if (groupa_mode(1) = '1') then -- mode2 + O_PC (7) <= a_obf_l; + O_PC_OE_L(7) <= '0'; + -- 6 is ack_l input + O_PC (5) <= a_ibf; + O_PC_OE_L(5) <= '0'; + -- 4 is stb_l input + end if; + + -- bit 3 (controlled by group a) + if (groupa_mode = "00") then -- group a steals this bit + --if (groupb_mode = '0') then -- we will let bit 3 be driven, data sheet is a bit confused about this + if (r_control(0) = '0') then -- ouput (note, groupb control bit) + O_PC (3) <= r_portc(3); + O_PC_OE_L(3) <= '0'; + end if; + -- + else -- stolen + O_PC (3) <= a_intr; + O_PC_OE_L(3) <= '0'; + end if; + + -- bits 2..0 + if (groupb_mode = '0') then -- simple io + if (r_control(0) = '0') then -- output + O_PC (2 downto 0) <= r_portc(2 downto 0); + O_PC_OE_L(2 downto 0) <= "000"; + end if; + else + -- mode 1 + -- 2 is input + if (r_control(1) = '0') then -- output + O_PC (1) <= b_obf_l; + O_PC_OE_L(1) <= '0'; + else -- input + O_PC (1) <= b_ibf; + O_PC_OE_L(1) <= '0'; + end if; + O_PC (0) <= b_intr; + O_PC_OE_L(0) <= '0'; + end if; + end process; + + p_portc_in : process(r_portc, I_PC, r_control, groupa_mode, groupb_mode, a_ibf, b_obf_l, + a_obf_l, a_inte1, a_inte2, a_intr, b_inte, b_ibf, b_intr) + begin + portc_read <= x"00"; + + a_stb_l <= '1'; + a_ack_l <= '1'; + b_stb_l <= '1'; + b_ack_l <= '1'; + + if (groupa_mode = "01") then -- mode1 or 2 + if (r_control(4) = '0') then -- port a output + a_ack_l <= I_PC(6); + else -- port a input + a_stb_l <= I_PC(4); + end if; + elsif (groupa_mode(1) = '1') then -- mode 2 + a_ack_l <= I_PC(6); + a_stb_l <= I_PC(4); + end if; + + if (groupb_mode = '1') then + if (r_control(1) = '0') then -- output + b_ack_l <= I_PC(2); + else -- input + b_stb_l <= I_PC(2); + end if; + end if; + + if (groupa_mode = "00") then -- simple io + portc_read(7 downto 3) <= I_PC(7 downto 3); + elsif (groupa_mode = "01") then + if (r_control(4) = '0') then -- port a output + portc_read(7 downto 3) <= a_obf_l & a_inte1 & I_PC(5 downto 4) & a_intr; + else -- input + portc_read(7 downto 3) <= I_PC(7 downto 6) & a_ibf & a_inte2 & a_intr; + end if; + else -- mode 2 + portc_read(7 downto 3) <= a_obf_l & a_inte1 & a_ibf & a_inte2 & a_intr; + end if; + + if (groupb_mode = '0') then -- simple io + portc_read(2 downto 0) <= I_PC(2 downto 0); + else + if (r_control(1) = '0') then -- output + portc_read(2 downto 0) <= b_inte & b_obf_l & b_intr; + else -- input + portc_read(2 downto 0) <= b_inte & b_ibf & b_intr; + end if; + end if; + end process; + + p_ipreg : process + begin + wait until rising_edge(CLK); + -- pc4 input a_stb_l + -- pc2 input b_stb_l + + if (ENA = '1') then + if (a_stb_l = '0') then + porta_ipreg <= I_PA; + end if; + + if (mode_clear = '1') then + portb_ipreg <= (others => '0'); + elsif (b_stb_l = '0') then + portb_ipreg <= I_PB; + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/keyboard.v b/Arcade/Scramble Hardware/Amidar_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Scramble Hardware/Amidar_MiST/rtl/mist_io.v b/Arcade/Scramble Hardware/Amidar_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_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/Arcade/Scramble Hardware/Amidar_MiST/rtl/osd.v b/Arcade/Scramble Hardware/Amidar_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_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/Arcade/Scramble Hardware/Amidar_MiST/rtl/pll.qip b/Arcade/Scramble Hardware/Amidar_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_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/Arcade/Scramble Hardware/Amidar_MiST/rtl/pll.v b/Arcade/Scramble Hardware/Amidar_MiST/rtl/pll.v new file mode 100644 index 00000000..1d3529bd --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 78, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 71, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "78" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.576923" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "71" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.57627100" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "78" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "71" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Scramble Hardware/Amidar_MiST/rtl/scandoubler.v b/Arcade/Scramble Hardware/Amidar_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Scramble Hardware/Amidar_MiST/rtl/scramble.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/scramble.vhd new file mode 100644 index 00000000..e496ae76 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/scramble.vhd @@ -0,0 +1,587 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE is + port ( + I_HWSEL_FROGGER : in boolean; + -- + O_VIDEO_R : out std_logic_vector(3 downto 0); + O_VIDEO_G : out std_logic_vector(3 downto 0); + O_VIDEO_B : out std_logic_vector(3 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + -- to audio board + -- + O_ADDR : out std_logic_vector(15 downto 0); + O_DATA : out std_logic_vector( 7 downto 0); + I_DATA : in std_logic_vector( 7 downto 0); + I_DATA_OE_L : in std_logic; + O_RD_L : out std_logic; + O_WR_L : out std_logic; + O_IOPC7 : out std_logic; + O_RESET_WD_L : out std_logic; + -- + ENA : in std_logic; + ENAB : in std_logic; + ENA_12 : in std_logic; + -- + RESET : in std_logic; -- active high + CLK : in std_logic + ); +end; + +architecture RTL of SCRAMBLE is + + type array_4x8 is array (0 to 3) of std_logic_vector(7 downto 0); + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal reset_wd_l : std_logic; + + -- timing decode + signal do_hsync : boolean; + signal set_vblank : boolean; + signal vsync : std_logic; + signal hsync : std_logic; + signal vblank : std_logic; + signal hblank : std_logic; + -- + -- cpu + signal cpu_ena : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_wr_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal page_4to7_l : std_logic; + + signal wren : std_logic; + + signal objen_l : std_logic; + signal waen_l : std_logic; + + signal objramrd_l : std_logic; + signal vramrd_l : std_logic; + + signal select_l : std_logic; + signal objramwr_l : std_logic; + signal vramwr_l : std_logic; + + -- control reg + signal control_reg : std_logic_vector(7 downto 0); + signal intst_l : std_logic; + signal iopc7 : std_logic; + signal pout1 : std_logic; + signal starson : std_logic; + signal hcma : std_logic; + signal vcma : std_logic; + + signal pgm_rom_dout : array_4x8; + signal rom_dout : std_logic_vector(7 downto 0); + signal ram_dout : std_logic_vector(7 downto 0); + signal ram_ena : std_logic; + + signal vram_data : std_logic_vector(7 downto 0); + +begin + + O_HBLANK <= hblank; + O_VBLANK <= vblank; + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(CLK); + if (ENA = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + p_sync_comb : process(hcnt, vcnt) + begin + vsync <= not vcnt(8); + do_hsync <= (hcnt = "010101111"); -- 0AF + set_vblank <= (vcnt = "111101111"); -- 1EF + end process; + + p_sync : process + begin + wait until rising_edge(CLK); + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + if (ENA = '1') then + if (hcnt = "010000001") then -- 081 + hblank <= '1'; + elsif (hcnt = "011111111") then -- 0f9 + hblank <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if set_vblank then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + p_video_timing_reg : process + begin + wait until rising_edge(CLK); + -- match output delay in video module + if (ENA = '1') then + O_HSYNC <= HSYNC; + O_VSYNC <= VSYNC; + end if; + end process; + + p_cpu_ena : process(hcnt, ENA) + begin + -- cpu clocked on rising edge of 1h, late + cpu_ena <= ENA and hcnt(0); -- 1h + end process; + -- + -- video + -- + u_video : entity work.SCRAMBLE_VIDEO + port map ( + I_HWSEL_FROGGER => I_HWSEL_FROGGER, + -- + I_HCNT => hcnt, + I_VCNT => vcnt, + I_VBLANK => vblank, + I_VSYNC => vsync, + + I_VCMA => vcma, + I_HCMA => hcma, + -- + I_CPU_ADDR => cpu_addr, + I_CPU_DATA => cpu_data_out, + O_VRAM_DATA => vram_data, + -- note, looks like the real hardware cannot read from object ram + -- + I_VRAMWR_L => vramwr_l, + I_VRAMRD_L => vramrd_l, + I_OBJRAMWR_L => objramwr_l, + I_OBJRAMRD_L => objramrd_l, + I_OBJEN_L => objen_l, + -- + I_STARSON => starson, + I_POUT1 => pout1, + -- + O_VIDEO_R => O_VIDEO_R, + O_VIDEO_G => O_VIDEO_G, + O_VIDEO_B => O_VIDEO_B, + -- + ENA => ENA, + ENAB => ENAB, + ENA_12 => ENA_12, + CLK => CLK + ); + + -- other cpu signals + reset_wd_l <= not RESET; -- FIX + + p_cpu_wait : process(vblank, hblank, waen_l) + begin + -- this is done a bit differently, the original had a late + -- clock to the cpu, and as mreq came out a litle early it could assert + -- wait and then gate off the write strobe to vram/objram in time. + -- + -- we are a nice synchronous system therefore we need to do this combinatorially. + -- timing is still ok. + -- + if (vblank = '1') then + cpu_wait_l <='1'; + else + cpu_wait_l <= '1'; + if (hblank = '0') and (waen_l = '0') then + cpu_wait_l <= '0'; + end if; + end if; + end process; + wren <= cpu_wait_l; + + p_cpu_int : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (intst_l = '0') then + cpu_nmi_l <= '1'; + else + if do_hsync and set_vblank then + cpu_nmi_l <= '0'; + end if; + end if; + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => reset_wd_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => open, + MREQ_n => cpu_mreq_l, + IORQ_n => open, + RD_n => cpu_rd_l, + WR_n => cpu_wr_l, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + -- + -- primary addr decode + -- + p_mem_decode : process(cpu_rfsh_l, cpu_rd_l, cpu_wr_l, cpu_mreq_l, cpu_addr, I_HWSEL_FROGGER) + begin + -- Scramble map + --0000-3fff ROM + --4000-47ff RAM + --4800-4bff Video RAM + --5000-50ff Object RAM + --5000-503f screen attributes + --5040-505f sprites + --5060-507f bullets + --5080-50ff unused? + + --read: + --7000 Watchdog Reset (Scramble) + --8100 IN0 + --8101 IN1 + --8102 IN2 (bits 5 and 7 used for protection check in Scramble) + + --write: + --6800-6807 control reg + --8200 To AY-3-8910 port A (commands for the audio CPU) + --8201 bit 3 = interrupt trigger on audio CPU bit 4 = AMPM (?) + --8202 protection check control? + + -- Frogger map + --0000-3fff ROM + --8000-87ff RAM + --a800-abff Video RAM + --b000-b0ff Object RAM + --b000-b03f screen attributes + --b040-b05f sprites + --b060-b0ff unused? + + --read: + --8800 Watchdog Reset + --e000 IN0 + --e002 IN1 + --e004 IN2 + cpu_int_l <= '1'; + cpu_busrq_l <= '1'; + + page_4to7_l <= '1'; + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + + if I_HWSEL_FROGGER then + cpu_int_l <= '0'; + cpu_busrq_l <= cpu_addr(15); + end if; + + if not I_HWSEL_FROGGER then + if (cpu_addr(15 downto 14) = "01") then page_4to7_l <= '0'; end if; + else + if (cpu_addr(15 downto 14) = "10") then page_4to7_l <= '0'; end if; + end if; + end if; + + end process; + + p_mem_decode2 : process(I_HWSEL_FROGGER, cpu_addr, page_4to7_l, cpu_rfsh_l, cpu_rd_l, cpu_wr_l, wren) + begin + waen_l <= '1'; + objen_l <= '1'; + if not I_HWSEL_FROGGER then + if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(13 downto 11) = "001") then waen_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "010") then objen_l <= '0'; end if; + end if; + else + if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(13 downto 11) = "101") then waen_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "110") then objen_l <= '0'; end if; + end if; + end if; + + -- read decode + vramrd_l <= '1'; + objramrd_l <= '1'; + + if not I_HWSEL_FROGGER then + if (page_4to7_l = '0') and (cpu_rd_l = '0') then + if (cpu_addr(13 downto 11) = "001") then vramrd_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "010") then objramrd_l <= '0'; end if; + end if; + else + if (page_4to7_l = '0') and (cpu_rd_l = '0') then + if (cpu_addr(13 downto 11) = "101") then vramrd_l <= '0'; end if; + end if; + end if; + -- write decode + vramwr_l <= '1'; + objramwr_l <= '1'; + select_l <= '1'; + + if not I_HWSEL_FROGGER then + if (page_4to7_l = '0') and (cpu_wr_l = '0') and (wren = '1') then + if (cpu_addr(13 downto 11) = "001") then vramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "010") then objramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "101") then select_l <= '0'; end if; -- control reg + end if; + else + if (page_4to7_l = '0') and (cpu_wr_l = '0') and (wren = '1') then + if (cpu_addr(13 downto 11) = "101") then vramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "110") then objramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "111") then select_l <= '0'; end if; -- control reg + end if; + end if; + end process; + + p_control_reg : process + variable addr : std_logic_vector(2 downto 0); + variable dec : std_logic_vector(7 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + -- scramble + --6801 interrupt enable + --6802 coin counter + --6803 ? (POUT1) + --6804 stars on + --6805 ? (POUT2) + --6806 screen vertical flip + --6807 screen horizontal flip + if not I_HWSEL_FROGGER then + addr := cpu_addr(2 downto 0); + else + addr := cpu_addr(4 downto 2); + end if; + + dec := "00000000"; + if (select_l = '0') then + case addr(2 downto 0) is + when "000" => dec := "00000001"; + when "001" => dec := "00000010"; + when "010" => dec := "00000100"; + when "011" => dec := "00001000"; + when "100" => dec := "00010000"; + when "101" => dec := "00100000"; + when "110" => dec := "01000000"; + when "111" => dec := "10000000"; + when others => null; + end case; + end if; + + if (reset_wd_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (dec(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + p_control_reg_assign : process(control_reg, I_HWSEL_FROGGER) + begin + if not I_HWSEL_FROGGER then + -- Scramble + intst_l <= control_reg(1); + iopc7 <= control_reg(2); + pout1 <= control_reg(3); + starson <= control_reg(4); + hcma <= control_reg(6); + vcma <= control_reg(7); + else + intst_l <= control_reg(2); + iopc7 <= control_reg(6); + pout1 <= control_reg(7); + starson <= '0'; + hcma <= control_reg(4); + vcma <= control_reg(3); + end if; + end process; + -- + -- + -- roms / rams + pgm_rom : entity work.ROM_PGM + port map (CLK => CLK, ADDR => cpu_addr(13 downto 0), DATA => rom_dout); +-- pgm_rom01 : entity work.ROM_PGM_01 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(0)); +-- pgm_rom23 : entity work.ROM_PGM_23 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(1)); +-- pgm_rom45 : entity work.ROM_PGM_45 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(2)); +-- pgm_rom56 : entity work.ROM_PGM_67 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(3)); + +-- p_rom_mux : process(cpu_addr, pgm_rom_dout) +-- begin +-- rom_dout <= (others => '0'); +-- case cpu_addr(13 downto 12) is +-- when "00" => rom_dout <= pgm_rom_dout(0); +-- when "01" => rom_dout <= pgm_rom_dout(1); +-- when "10" => rom_dout <= pgm_rom_dout(2); +-- when "11" => rom_dout <= pgm_rom_dout(3); +-- when others => null; +-- end case; +-- end process; + + u_cpu_ram : work.dpram generic map (11,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => ram_ena and (not cpu_wr_l), + + addr_a_i => cpu_addr(10 downto 0), + data_a_i => cpu_data_out, + + clk_b_i => clk, + addr_b_i => cpu_addr(10 downto 0), + data_b_o => ram_dout + ); + + p_ram_ctrl : process(cpu_addr, page_4to7_l) + begin + ram_ena <= '0'; + if (page_4to7_l = '0') and (cpu_addr(13 downto 11) = "000") then + ram_ena <= '1'; + end if; + end process; + + p_cpu_data_in_mux : process(I_HWSEL_FROGGER, cpu_addr, cpu_rd_l, cpu_mreq_l, cpu_rfsh_l, ram_dout, rom_dout, vramrd_l, vram_data, I_DATA_OE_L, I_DATA ) + variable ram_addr : std_logic_vector(1 downto 0); + begin + + if not I_HWSEL_FROGGER then + ram_addr := "01"; + else + ram_addr := "10"; + end if; + + cpu_data_in <= (others => '0'); + if (vramrd_l = '0') then + cpu_data_in <= vram_data; + -- + elsif (I_DATA_OE_L = '0') then + cpu_data_in <= I_DATA; + -- + elsif (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(15 downto 14) = "00") and (cpu_rd_l = '0') and (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + cpu_data_in <= rom_dout; + -- + elsif (cpu_addr(15 downto 14) = ram_addr) then + if (cpu_addr(13 downto 11) = "000") and (cpu_rd_l = '0') then + cpu_data_in <= ram_dout; + else + cpu_data_in <= x"FF"; + end if; + end if; + else + cpu_data_in <= x"FF"; + end if; + + end process; + + -- to audio + O_ADDR <= cpu_addr; + O_DATA <= cpu_data_out; + O_RD_L <= cpu_rd_l; + O_WR_L <= cpu_wr_l; + O_IOPC7 <= iopc7; + O_RESET_WD_L <= reset_wd_l; + +end RTL; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/scramble_audio.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/scramble_audio.vhd new file mode 100644 index 00000000..21d6f5f8 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/scramble_audio.vhd @@ -0,0 +1,834 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE_AUDIO is + port ( + I_HWSEL_FROGGER : in boolean; + -- + I_ADDR : in std_logic_vector(15 downto 0); + I_DATA : in std_logic_vector( 7 downto 0); + O_DATA : out std_logic_vector( 7 downto 0); + O_DATA_OE_L : out std_logic; + -- + I_RD_L : in std_logic; + I_WR_L : in std_logic; + I_IOPC7 : in std_logic; + -- + O_AUDIO : out std_logic_vector( 9 downto 0); + -- + I_1P_CTRL : in std_logic_vector( 6 downto 0); -- start, shoot1, shoot2, left,right,up,down + I_2P_CTRL : in std_logic_vector( 6 downto 0); -- start, shoot1, shoot2, left,right,up,down + I_SERVICE : in std_logic; + I_COIN1 : in std_logic; + I_COIN2 : in std_logic; + O_COIN_COUNTER : out std_logic; + -- + I_DIP : in std_logic_vector( 5 downto 1); + -- + I_RESET_L : in std_logic; + ENA : in std_logic; -- 6 MHz + ENA_1_79 : in std_logic; -- 1.78975 MHz + CLK : in std_logic + ); +end; + +architecture RTL of SCRAMBLE_AUDIO is + + signal reset : std_logic; + signal cpu_ena : std_logic; + signal cpu_ena_gated : std_logic; + -- + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_wr_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + -- + signal ram_cs : std_logic; + signal rom_oe : std_logic; + signal filter_load : std_logic; + signal filter_reg : std_logic_vector(11 downto 0); + -- + signal cpu_rom0_dout : std_logic_vectoR(7 downto 0); + signal cpu_rom1_dout : std_logic_vectoR(7 downto 0); + signal cpu_rom2_dout : std_logic_vectoR(7 downto 0); + signal rom_active : std_logic; + + signal rom_dout : std_logic_vector(7 downto 0); + signal ram_dout : std_logic_vector(7 downto 0); + -- + signal i8255_addr : std_logic_vector(1 downto 0); + signal i8255_1D_data : std_logic_vector(7 downto 0); + signal i8255_1D_data_oe_l : std_logic; + signal i8255_1D_cs_l : std_logic; + signal i8255_1D_pa_out : std_logic_vector(7 downto 0); + signal i8255_1D_pb_out : std_logic_vector(7 downto 0); + -- + signal i8255_1E_data : std_logic_vector(7 downto 0); + signal i8255_1E_data_oe_l : std_logic; + signal i8255_1E_cs_l : std_logic; + signal i8255_1E_pa : std_logic_vector(7 downto 0); + signal i8255_1E_pb : std_logic_vector(7 downto 0); + signal i8255_1E_pc : std_logic_vector(7 downto 0); + + -- security + signal net_1e10_i : std_logic; + signal net_1e12_i : std_logic; + signal xb : std_logic_vector(7 downto 0); + signal xbo : std_logic_vector(7 downto 0); + + signal audio_div_cnt : std_logic_vector( 8 downto 0) := (others => '0'); + signal ls90_op : std_logic_vector(3 downto 0); + signal ls90_clk : std_logic; + signal ls90_cnt : std_logic_vector( 3 downto 0) := (others => '0'); + -- ym2149 3C + signal ym2149_3C_dv : std_logic_vector(7 downto 0); + signal ym2149_3C_oe_l : std_logic; + signal ym2149_3C_bdir : std_logic; + signal ym2149_3C_bc2 : std_logic; + signal ym2149_3C_bc1 : std_logic; + signal ym2149_3C_audio : std_logic_vector(7 downto 0); + signal ym2149_3C_chan : std_logic_vector(1 downto 0); + signal ym2149_3C_chan_t1 : std_logic_vector(1 downto 0); + -- + -- ym2149 3D + signal ym2149_3D_dv : std_logic_vector(7 downto 0); + signal ym2149_3D_oe_l : std_logic; + signal ym2149_3D_bdir : std_logic; + signal ym2149_3D_bc2 : std_logic; + signal ym2149_3D_bc1 : std_logic; + signal ym2149_3D_audio : std_logic_vector(7 downto 0); + signal ym2149_3D_chan : std_logic_vector(1 downto 0); + signal ym2149_3D_chan_t1 : std_logic_vector(1 downto 0); + signal ym2149_3D_ioa_in : std_logic_vector(7 downto 0); + signal ym2149_3D_ioa_out : std_logic_vector(7 downto 0); + signal ym2149_3D_ioa_oe_l : std_logic; + signal ym2149_3D_iob_in : std_logic_vector(7 downto 0); + -- + signal ampm : std_logic; + signal sint : std_logic; + signal sint_t1 : std_logic; + -- + signal audio_3C_mix : std_logic_vector(9 downto 0); + signal audio_3C_final : std_logic_vector(9 downto 0); + signal audio_3D_mix : std_logic_vector(9 downto 0); + signal audio_3D_final : std_logic_vector(9 downto 0); + signal audio_final : std_logic_vector(10 downto 0); + + signal security_count : std_logic_vector(2 downto 0); + signal rd_l_t1 : std_logic; + -- filters + signal ym2149_3C_k : std_logic_vector(16 downto 0); + signal ym2149_3D_k : std_logic_vector(16 downto 0); + signal audio_in_m_out_3C : std_logic_vector(17 downto 0); + signal audio_in_m_out_3D : std_logic_vector(17 downto 0); + signal audio_mult_3C : std_logic_vector(35 downto 0); + signal audio_mult_3D : std_logic_vector(35 downto 0); + + + + type array_4of17 is array (3 downto 0) of std_logic_vector(16 downto 0); + constant K_Filter : array_4of17 := ('0' & x"00A3", + '0' & x"00C6", + '0' & x"039D", + '1' & x"0000" ); + + type filter_pipe is array (3 downto 0) of std_logic_vector(17 downto 0); + signal ym2149_3C_audio_pipe : filter_pipe; + signal ym2149_3D_audio_pipe : filter_pipe; + -- LP filter out = in.k + out_t1.(1-k) + -- + -- = (in-out_t1).k + out_t1 + -- + -- using + -- -(Ts.2.PI.Fc) + -- k = 1-e + -- + -- sampling freq = 1.79 MHz + -- + -- cut off freqs bit 0 1 + -- + --0.267uf ~ 713 Hz 1 1 0.00249996 x 00A3 + --0.220uf ~ 865 Hz 1 0 0.00303210 x 00C6 + --0.047uf ~ 4050 Hz 0 1 0.01411753 x 039D + -- 0 0 x10000 + +begin + -- scramble + --0000-1fff ROM + --8000-83ff RAM + + -- frogger + --0000-17ff ROM + --4000-43ff RAM + + cpu_ena <= '1'; -- run at audio clock speed + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + cpu_wait_l <= '1'; + -- + cpu_ena_gated <= ENA_1_79 and cpu_ena; + u_cpu : entity work.T80sed + port map ( + RESET_n => I_RESET_L, + CLK_n => CLK, + CLKEN => cpu_ena_gated, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => cpu_wr_l, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + + p_cpu_int : process(CLK, I_RESET_L) + begin + if (I_RESET_L = '0') then + cpu_int_l <= '1'; + sint_t1 <= '0'; + elsif rising_edge(CLK) then + if (ENA_1_79 = '1') then + sint_t1 <= sint; + + if (cpu_m1_l = '0') and (cpu_iorq_l = '0') then + cpu_int_l <= '1'; + elsif (sint = '0') and (sint_t1 = '1') then + cpu_int_l <= '0'; + end if; + end if; + end if; + end process; + + p_mem_decode_comb : process(cpu_rfsh_l, cpu_wr_l, cpu_rd_l, cpu_mreq_l, cpu_addr, I_HWSEL_FROGGER) + variable decode : std_logic; + begin + if not I_HWSEL_FROGGER then + decode := '0'; + if (cpu_rfsh_l = '1') and (cpu_mreq_l = '0') and (cpu_addr(15) = '1') then + decode := '1'; + end if; + + filter_load <= decode and cpu_addr(12) and (not cpu_wr_l); + ram_cs <= decode and (not cpu_addr(12)); + else + decode := '0'; + if (cpu_rfsh_l = '1') and (cpu_mreq_l = '0') and (cpu_addr(14) = '1') then + decode := '1'; + end if; + + filter_load <= decode and cpu_addr(13) and (not cpu_wr_l); + ram_cs <= decode and (not cpu_addr(13)); + end if; + + rom_oe <= '0'; + if not I_HWSEL_FROGGER then + if (cpu_addr(15) = '0') and (cpu_mreq_l = '0') and (cpu_rd_l = '0') then + rom_oe <= '1'; + end if; + else + if (cpu_addr(14) = '0') and (cpu_mreq_l = '0') and (cpu_rd_l = '0') then + rom_oe <= '1'; + end if; + end if; + + end process; + + u_rom_5c : entity work.ROM_SND_0 + port map ( + CLK => CLK, + ADDR => cpu_addr(11 downto 0), + DATA => cpu_rom0_dout + ); + + u_rom_5d : entity work.ROM_SND_1 + port map ( + CLK => CLK, + ADDR => cpu_addr(11 downto 0), + DATA => cpu_rom1_dout + ); + + p_rom_mux : process(I_HWSEL_FROGGER, cpu_rom0_dout, cpu_rom1_dout, cpu_addr, rom_oe) + variable rom_oe_decode : std_logic; + variable cpu_rom0_dout_s : std_logic_vector(7 downto 0); + begin + if not I_HWSEL_FROGGER then + cpu_rom0_dout_s := cpu_rom0_dout; + else -- swap bits 0 and 1 + cpu_rom0_dout_s := cpu_rom0_dout(7 downto 2) & cpu_rom0_dout(0) & cpu_rom0_dout(1); + end if; + + rom_dout <= (others => '0'); + rom_oe_decode := '0'; + case cpu_addr(13 downto 12) is + when "00" => rom_dout <= cpu_rom0_dout_s; rom_oe_decode := '1'; + when "01" => rom_dout <= cpu_rom1_dout; rom_oe_decode := '1'; + when others => null; + end case; + + rom_active <= '0'; + if (rom_oe = '1') then + rom_active <= rom_oe_decode; + end if; + end process; + + u_ram_6c_6d : work.dpram generic map (10,8) + port map + ( + addr_a_i => cpu_addr(9 downto 0), + data_a_i => cpu_data_out, + clk_b_i => clk, + addr_b_i => cpu_addr(9 downto 0), + data_b_o => ram_dout, + we_i => ram_cs and (not cpu_wr_l), + en_a_i => ENA_1_79, + clk_a_i => clk + ); + + p_cpu_data_mux : process(rom_dout, rom_active, ram_dout, ym2149_3C_oe_l, ym2149_3C_dv, ym2149_3D_oe_l, ym2149_3D_dv, ram_cs, cpu_wr_l) + begin + if (rom_active = '1') then + cpu_data_in <= rom_dout; + elsif (ram_cs = '1') and (cpu_wr_l = '1') then + cpu_data_in <= ram_dout; + elsif (ym2149_3C_oe_l = '0') then + cpu_data_in <= ym2149_3C_dv; + elsif (ym2149_3D_oe_l = '0') then + cpu_data_in <= ym2149_3D_dv; + else + cpu_data_in <= (others => '1'); -- float high + end if; + end process; + + p_filter_reg : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + if (filter_load = '1') then + filter_reg <= cpu_addr(11 downto 0); + end if; + end if; + end process; + + p_8255_decode : process(I_RESET_L, I_ADDR, I_HWSEL_FROGGER) + begin + reset <= not I_RESET_L; + i8255_1D_cs_l <= '1'; + i8255_1E_cs_l <= '1'; + + if not I_HWSEL_FROGGER then + -- the interface one + if (I_ADDR(9) = '1') and (I_ADDR(15) = '1') then + i8255_1D_cs_l <= '0'; + end if; + + -- the button one + if (I_ADDR(8) = '1') and (I_ADDR(15) = '1') then + i8255_1E_cs_l <= '0'; + end if; + i8255_addr <= I_ADDR(1 downto 0); + else + -- the interface one + if (I_ADDR(12) = '1') and (I_ADDR(15 downto 14) = "11") then + i8255_1D_cs_l <= '0'; + end if; + + -- the button one + if (I_ADDR(13) = '1') and (I_ADDR(15 downto 14) = "11") then + i8255_1E_cs_l <= '0'; + end if; + i8255_addr <= I_ADDR(2 downto 1); + end if; + end process; + + p_ym_decode : process(cpu_rd_l, cpu_wr_l, cpu_iorq_l, cpu_addr, I_HWSEL_FROGGER) + variable rd_3c : std_logic; + variable wr_3c : std_logic; + variable ad_3c : std_logic; + -- + variable rd_3d : std_logic; + variable wr_3d : std_logic; + variable ad_3d : std_logic; + begin + + --bdir bc2 bc1 + -- 0 0 0 nop + -- 0 0 1 addr latch < WR_L AV4 / AV6 + -- 0 1 0 nop + -- 0 1 1 data read < RD_L AV5 / AV7 + + -- 1 0 0 addr latch + -- 1 0 1 nop + -- 1 1 0 data write < WR_L AV5 / AV7 + -- 1 1 1 addr latch + + + if not I_HWSEL_FROGGER then + rd_3c := (not cpu_rd_l) and (not cpu_iorq_l) and cpu_addr(5); + wr_3c := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(5); + ad_3c := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(4); + else + rd_3c := '0'; + wr_3c := '0'; + ad_3c := '0'; + end if; + + ym2149_3C_bdir <= wr_3c; + ym2149_3C_bc2 <= rd_3c or wr_3c; + ym2149_3C_bc1 <= rd_3c or ad_3c; + + + if not I_HWSEL_FROGGER then + rd_3d := (not cpu_rd_l) and (not cpu_iorq_l) and cpu_addr(7); + wr_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(7); + ad_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(6); + else + rd_3d := (not cpu_rd_l) and (not cpu_iorq_l) and cpu_addr(6); + wr_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(6); + ad_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(7); + end if; + + ym2149_3D_bdir <= wr_3d; + ym2149_3D_bc2 <= rd_3d or wr_3d; + ym2149_3D_bc1 <= rd_3d or ad_3d; + + end process; + + i8255_1E_pa(7) <= I_COIN1; + i8255_1E_pa(6) <= I_COIN2; + i8255_1E_pa(5) <= I_1P_CTRL(3); -- left + i8255_1E_pa(4) <= I_1P_CTRL(2); -- right + i8255_1E_pa(3) <= I_1P_CTRL(4); -- shoot1 + i8255_1E_pa(2) <= I_SERVICE; + i8255_1E_pa(1) <= I_1P_CTRL(5); -- shoot2 + i8255_1E_pa(0) <= I_2P_CTRL(1); -- up + + i8255_1E_pb(7) <= I_1P_CTRL(6); -- start + i8255_1E_pb(6) <= I_2P_CTRL(6); -- start + i8255_1E_pb(5) <= I_2P_CTRL(3); -- left + i8255_1E_pb(4) <= I_2P_CTRL(2); -- right + i8255_1E_pb(3) <= I_2P_CTRL(4); -- shoot1 + i8255_1E_pb(2) <= I_2P_CTRL(5); -- shoot2 + i8255_1E_pb(1) <= I_DIP(1); + i8255_1E_pb(0) <= I_DIP(2); + + i8255_1E_pc(7) <= net_1e10_i; + i8255_1E_pc(6) <= I_1P_CTRL(0); -- down + i8255_1E_pc(5) <= net_1e12_i; + i8255_1E_pc(4) <= I_1P_CTRL(1); -- up + i8255_1E_pc(3) <= I_DIP(3); + i8255_1E_pc(2) <= I_DIP(4); + i8255_1E_pc(1) <= I_DIP(5); + i8255_1E_pc(0) <= I_2P_CTRL(0); -- down + O_COIN_COUNTER <= not I_IOPC7; -- open drain actually + + -- + -- PIA CHIPS + -- + u_i8255_1D : entity work.I82C55 -- bus interface + port map ( + I_ADDR => i8255_addr, + I_DATA => I_DATA, + O_DATA => i8255_1D_data, + O_DATA_OE_L => i8255_1D_data_oe_l, + + I_CS_L => i8255_1D_cs_l, + I_RD_L => I_RD_L, + I_WR_L => I_WR_L, + + I_PA => i8255_1D_pa_out, + O_PA => i8255_1D_pa_out, + O_PA_OE_L => open, + + I_PB => i8255_1D_pb_out, + O_PB => i8255_1D_pb_out, + O_PB_OE_L => open, + + I_PC => xbo, + O_PC => xb, + O_PC_OE_L => open, + + RESET => reset, + ENA => ENA, + CLK => CLK + ); + + u_i8255_1E : entity work.I82C55 -- push button + port map ( + I_ADDR => i8255_addr, + I_DATA => I_DATA, + O_DATA => i8255_1E_data, + O_DATA_OE_L => i8255_1E_data_oe_l, + + I_CS_L => i8255_1E_cs_l, + I_RD_L => I_RD_L, + I_WR_L => I_WR_L, + + I_PA => i8255_1E_pa, + O_PA => open, + O_PA_OE_L => open, + + I_PB => i8255_1E_pb, + O_PB => open, + O_PB_OE_L => open, + + I_PC => i8255_1E_pc, + O_PC => open, + O_PC_OE_L => open, + + RESET => reset, + ENA => ENA, + CLK => CLK + ); + + p_i8255_1d_bus_control : process(i8255_1D_pa_out, i8255_1D_pb_out, ym2149_3D_ioa_out, ym2149_3D_ioa_oe_l) + begin + if (ym2149_3D_ioa_oe_l = '0') then + ym2149_3D_ioa_in <= ym2149_3D_ioa_out; + else + ym2149_3D_ioa_in <= i8255_1D_pa_out; + end if; + + ampm <= i8255_1D_pb_out(4); -- amp mute + sint <= i8255_1D_pb_out(3); -- set int + end process; + + p_drive_cpubus : process(i8255_1D_data, i8255_1D_data_oe_l, i8255_1E_data, i8255_1E_data_oe_l) + begin + O_DATA_OE_L <= '1'; + O_DATA <= (others => '0'); + -- + if (i8255_1D_data_oe_l = '0') then + -- + O_DATA_OE_L <= '0'; + O_DATA <= i8255_1D_data; + elsif (i8255_1E_data_oe_l = '0') then + -- + O_DATA_OE_L <= '0'; + O_DATA <= i8255_1E_data; + end if; + end process; + -- + -- AUDIO CHIPS + -- + p_audio_clockgen : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + audio_div_cnt <= audio_div_cnt - "1"; + ls90_clk <= not audio_div_cnt(8); + + if (audio_div_cnt(8 downto 0) = "000000000") then + if (ls90_cnt = x"9") then + ls90_cnt <= x"0"; + else + ls90_cnt <= ls90_cnt + "1"; + end if; + end if; + + ls90_op <= "0000"; + case ls90_cnt is --ls90 outputs DCBA + when x"0" => ls90_op <= "0000"; + when x"1" => ls90_op <= "0010"; + when x"2" => ls90_op <= "0100"; + when x"3" => ls90_op <= "0110"; + when x"4" => ls90_op <= "1000"; + when x"5" => ls90_op <= "0001"; + when x"6" => ls90_op <= "0011"; + when x"7" => ls90_op <= "0101"; + when x"8" => ls90_op <= "0111"; + when x"9" => ls90_op <= "1001"; + when others => ls90_op <= "0000"; + end case; + end if; + end process; + + p_ym2149_3d_iob_in : process(I_HWSEL_FROGGER, ls90_op, ls90_clk) + begin + if not I_HWSEL_FROGGER then + ym2149_3D_iob_in <= ls90_op(0) & ls90_op(3) & ls90_op(2) & ls90_clk & "1110"; + else + ym2149_3D_iob_in <= ls90_op(0) & ls90_op(3) & '1' & ls90_clk & ls90_op(2) & "110"; + end if; + end process; + + u_ym2149_3C : entity work.YM2149 -- not used for frogger + port map ( + -- data bus + I_DA => cpu_data_out, + O_DA => ym2149_3C_dv, + O_DA_OE_L => ym2149_3C_oe_l, + -- control + I_A9_L => '0', + I_A8 => '1', + I_BDIR => ym2149_3C_bdir, + I_BC2 => ym2149_3C_bc2, + I_BC1 => ym2149_3C_bc1, + I_SEL_L => '1', + + O_AUDIO => ym2149_3C_audio, + O_CHAN => ym2149_3C_chan, + -- port a + I_IOA => "11111111", + O_IOA => open, + O_IOA_OE_L => open, + -- port b + I_IOB => "11111111", + O_IOB => open, + O_IOB_OE_L => open, + + ENA => ENA_1_79, + RESET_L => I_RESET_L, + CLK => CLK + ); + + u_ym2149_3D : entity work.YM2149 + port map ( + -- data bus + I_DA => cpu_data_out, + O_DA => ym2149_3D_dv, + O_DA_OE_L => ym2149_3D_oe_l, + -- control + I_A9_L => '0', + I_A8 => '1', + I_BDIR => ym2149_3D_bdir, + I_BC2 => ym2149_3D_bc2, + I_BC1 => ym2149_3D_bc1, + I_SEL_L => '1', + + O_AUDIO => ym2149_3D_audio, + O_CHAN => ym2149_3D_chan, + -- port a + I_IOA => ym2149_3D_ioa_in, + O_IOA => ym2149_3D_ioa_out, + O_IOA_OE_L => ym2149_3D_ioa_oe_l, + -- port b + I_IOB => ym2149_3D_iob_in, + O_IOB => open, + O_IOB_OE_L => open, + + ENA => ENA_1_79, + RESET_L => I_RESET_L, + CLK => CLK + ); + + p_filter_coef : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + case ym2149_3C_chan is -- -1 as reg here + when "00" => -- chan 3 + ym2149_3C_k <= (others => '0'); + when "11" => -- chan 2 + ym2149_3C_k <= K_FILTER(conv_integer(filter_reg(5 downto 4))); + when "10" => -- chan 1 + ym2149_3C_k <= K_FILTER(conv_integer(filter_reg(3 downto 2))); + when "01" => -- chan 0 + ym2149_3C_k <= K_FILTER(conv_integer(filter_reg(1 downto 0))); + when others => null; + end case; + + case ym2149_3D_chan is -- -1 as reg here + when "00" => -- chan 3 + ym2149_3D_k <= (others => '0'); + when "11" => -- chan 2 + ym2149_3D_k <= K_FILTER(conv_integer(filter_reg(11 downto 10))); + when "10" => -- chan 1 + ym2149_3D_k <= K_FILTER(conv_integer(filter_reg( 9 downto 8))); + when "01" => -- chan 0 + ym2149_3D_k <= K_FILTER(conv_integer(filter_reg( 7 downto 6))); + when others => null; + end case; + end if; + end process; + + + p_ym2149_audio_process : process(ym2149_3C_audio, ym2149_3C_audio_pipe, ym2149_3D_audio, ym2149_3D_audio_pipe) + begin + audio_in_m_out_3C <= (('0' & ym2149_3C_audio & "000000000"))- ym2149_3C_audio_pipe(3); -- signed + audio_in_m_out_3D <= (('0' & ym2149_3D_audio & "000000000"))- ym2149_3D_audio_pipe(3); -- signed + end process; + + mult_3C : work.MULT18X18 + port map + ( + P => audio_mult_3C,-- 35..0 -- audio 8bit on 32..25 33 sign bit, + A => audio_in_m_out_3C, --17..0 + B(17) => '0', + B(16 downto 0) => ym2149_3C_k + ); + + mult_3D : work.MULT18X18 + port map + ( + P => audio_mult_3D,-- 35..0 -- audio 8bit on 32..25 33 sign bit, + A => audio_in_m_out_3D, --17..0 + B(17) => '0', + B(16 downto 0) => ym2149_3D_k + ); + + p_ym2149_audio_pipe : process(I_RESET_L, CLK) + begin + if (I_RESET_L = '0') then + ym2149_3C_audio_pipe <= (others => (others => '0')); + ym2149_3D_audio_pipe <= (others => (others => '0')); + elsif rising_edge(CLK) then +-- audio_mult_3C <= audio_in_m_out_3C * ym2149_3C_k; +-- audio_mult_3D <= audio_in_m_out_3D * ym2149_3D_k; + if (ENA_1_79 = '1') then + -- we need some holding registers anyway, so lets just make it a shift and save a mux + ym2149_3C_audio_pipe(3 downto 1) <= ym2149_3C_audio_pipe(2 downto 0); + ym2149_3C_audio_pipe(0) <= audio_mult_3C(33 downto 16) + ym2149_3C_audio_pipe(3); -- bit 33 sign + + ym2149_3D_audio_pipe(3 downto 1) <= ym2149_3D_audio_pipe(2 downto 0); + ym2149_3D_audio_pipe(0) <= audio_mult_3D(33 downto 16) + ym2149_3D_audio_pipe(3); -- bit 33 sign + end if; + end if; + end process; + + p_ym2149_audio_mix : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + ym2149_3C_chan_t1 <= ym2149_3C_chan; + ym2149_3D_chan_t1 <= ym2149_3D_chan; + + if (ym2149_3C_chan_t1 = "11") then + audio_3C_mix <= (others => '0'); + audio_3C_final <= audio_3C_mix; + else + audio_3C_mix <= audio_3C_mix + ("00" & ym2149_3C_audio_pipe(0)(16 downto 9)); + end if; + + if (ym2149_3D_chan_t1(1 downto 0) = "11") then + audio_3D_mix <= (others => '0'); + audio_3D_final <= audio_3D_mix; + else + audio_3D_mix <= audio_3D_mix + ("00" & ym2149_3D_audio_pipe(0)(16 downto 9)); + end if; + + audio_final <= ('0' & audio_3C_final) + ('0' & audio_3D_final); + end if; + end process; + + p_audio_out : process(CLK, I_RESET_L) + begin + if (I_RESET_L = '0') then + O_AUDIO <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA_1_79 = '1') then + if (ampm = '1') then + O_AUDIO <= (others => '0'); + else + if (audio_final(10) = '1') then + O_AUDIO <= (others => '1'); + else + O_AUDIO <= audio_final(9 downto 0); + end if; + end if; + end if; + end if; + end process; + + p_security_6J : process(xb) + begin + -- chip K10A PAL16L8 + -- equations from Mark @ http://www.leopardcats.com/ + xbo(3 downto 0) <= xb(3 downto 0); + xbo(4) <= not(xb(0) or xb(1) or xb(2) or xb(3)); + xbo(5) <= not((not xb(2) and not xb(0)) or (not xb(2) and not xb(1)) or (not xb(3) and not xb(0)) or (not xb(3) and not xb(1))); + + xbo(6) <= not(not xb(0) and not xb(3)); + xbo(7) <= not((not xb(1)) or xb(2)); + end process; + + p_security_count : process(CLK, I_RESET_L) + begin + if (I_RESET_L = '0') then + security_count <= "000"; + elsif rising_edge(CLK) then + rd_l_t1 <= i_rd_l; + if (I_ADDR = x"8102") and (I_RD_L = '0') and (rd_l_t1 = '1') then + security_count <= security_count + "1"; + end if; + end if; + end process; + + p_security_2B : process(security_count) + begin + -- I am not sure what this chip does yet, but this gets us past the initial check for now. + case security_count is + when "000" => net_1e10_i <= '0'; net_1e12_i <= '1'; + when "001" => net_1e10_i <= '0'; net_1e12_i <= '1'; + when "010" => net_1e10_i <= '1'; net_1e12_i <= '0'; + when "011" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "100" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "101" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "110" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "111" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when others => null; + end case; + end process; + +end RTL; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/scramble_top.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/scramble_top.vhd new file mode 100644 index 00000000..960fc642 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/scramble_top.vhd @@ -0,0 +1,201 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE_TOP is +port ( + O_VIDEO_R : out std_logic_vector(3 downto 0); + O_VIDEO_G : out std_logic_vector(3 downto 0); + O_VIDEO_B : out std_logic_vector(3 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + + O_AUDIO : out std_logic_vector(9 downto 0); + button_in1 : in std_logic_vector(6 downto 0); + button_in2 : in std_logic_vector(6 downto 0); + Coin_in : in std_logic; + Service_in : in std_logic; + RESET : in std_logic; + clk : in std_logic; -- 25 + ena_12 : in std_logic; -- 6.25 x 2 + ena_6 : in std_logic; -- 6.25 (inverted) + ena_6b : in std_logic; -- 6.25 + ena_1_79 : in std_logic -- 1.786 +); +end; + +architecture RTL of SCRAMBLE_TOP is +-- this MUST be set true for frogger +-- this MUST be set false for scramble, the_end, amidar +constant I_HWSEL_FROGGER : boolean := false; + +signal ip_dip_switch : std_logic_vector(5 downto 1); + +-- ties to audio board +signal audio_addr : std_logic_vector(15 downto 0); +signal audio_data_out : std_logic_vector(7 downto 0); +signal audio_data_in : std_logic_vector(7 downto 0); +signal audio_data_oe_l : std_logic; +signal audio_rd_l : std_logic; +signal audio_wr_l : std_logic; +signal audio_iopc7 : std_logic; +signal audio_reset_l : std_logic; + +begin + +u_scramble : entity work.SCRAMBLE +port map ( + I_HWSEL_FROGGER => I_HWSEL_FROGGER, + -- + O_VIDEO_R => O_VIDEO_R, + O_VIDEO_G => O_VIDEO_G, + O_VIDEO_B => O_VIDEO_B, + O_HSYNC => O_HSYNC, + O_VSYNC => O_VSYNC, + O_HBLANK => O_HBLANK, + O_VBLANK => O_VBLANK, + -- + -- to audio board + -- + O_ADDR => audio_addr, + O_DATA => audio_data_out, + I_DATA => audio_data_in, + I_DATA_OE_L => audio_data_oe_l, + O_RD_L => audio_rd_l, + O_WR_L => audio_wr_l, + O_IOPC7 => audio_iopc7, + O_RESET_WD_L => audio_reset_l, + -- + ENA => ena_6, + ENAB => ena_6b, + ENA_12 => ena_12, + -- + RESET => reset, + CLK => clk +); + +-- +-- +-- audio subsystem +-- +u_audio : entity work.SCRAMBLE_AUDIO +port map ( + I_HWSEL_FROGGER => I_HWSEL_FROGGER, + -- + I_ADDR => audio_addr, + I_DATA => audio_data_out, + O_DATA => audio_data_in, + O_DATA_OE_L => audio_data_oe_l, + -- + I_RD_L => audio_rd_l, + I_WR_L => audio_wr_l, + I_IOPC7 => audio_iopc7, + -- + O_AUDIO => O_AUDIO, + + I_1P_CTRL => button_in1, + I_2P_CTRL => button_in2, + I_SERVICE => Service_in, + I_COIN1 => Coin_in, + I_COIN2 => Service_in,--'1', + O_COIN_COUNTER => open, + -- + I_DIP => ip_dip_switch, + -- + I_RESET_L => audio_reset_l, + ENA => ena_6, + ENA_1_79 => ena_1_79, + CLK => clk +); + +-- dip switch settings +scramble_dips : if (not I_HWSEL_FROGGER) generate +begin + --SW #1 SW #2 Rockets SW #3 Cabinet + ------- ----- --------- ----- -------- + --OFF OFF Unlimited OFF Table + --OFF ON 5 ON Up Right + --ON OFF 4 + --ON ON 3 + + + --SW #4 SW #5 Coins/Play + ------- ----- ---------- + --OFF OFF 4 + --OFF ON 3 + --ON OFF 2 + --ON ON 1 + + ip_dip_switch(5 downto 4) <= not "11"; -- 1 play/coin. + ip_dip_switch(3) <= not '1'; + ip_dip_switch(2 downto 1) <= not "10"; +end generate; + +frogger_dips : if ( I_HWSEL_FROGGER) generate +begin + --1 2 3 4 5 Meaning + ------------------------------------------------------- + --On On 3 Frogs + --On Off 5 Frogs + --Off On 7 Frogs + --Off Off 256 Frogs (!) + -- + -- On Upright unit + -- Off Cocktail unit + -- + -- On On 1 coin 1 play + -- On Off 2 coins 1 play + -- Off On 3 coins 1 play + -- Off Off 1 coin 2 plays + + ip_dip_switch(5 downto 4) <= not "11"; + ip_dip_switch(3) <= not '1'; + ip_dip_switch(2 downto 1) <= not "01"; +end generate; + +end RTL; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/scramble_video.vhd b/Arcade/Scramble Hardware/Amidar_MiST/rtl/scramble_video.vhd new file mode 100644 index 00000000..47fd3641 --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_MiST/rtl/scramble_video.vhd @@ -0,0 +1,758 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE_VIDEO is + port ( + I_HWSEL_FROGGER : in boolean; + -- + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + I_VBLANK : in std_logic; + I_VSYNC : in std_logic; + + I_VCMA : in std_logic; + I_HCMA : in std_logic; + -- + I_CPU_ADDR : in std_logic_vector(15 downto 0); + I_CPU_DATA : in std_logic_vector(7 downto 0); + O_VRAM_DATA : out std_logic_vector(7 downto 0); + -- note, looks like the real hardware cannot read from object ram + -- + I_VRAMWR_L : in std_logic; + I_VRAMRD_L : in std_logic; + I_OBJRAMWR_L : in std_logic; + I_OBJRAMRD_L : in std_logic; + I_OBJEN_L : in std_logic; + -- + I_STARSON : in std_logic; + I_POUT1 : in std_logic; + -- + O_VIDEO_R : out std_logic_vector(3 downto 0); + O_VIDEO_G : out std_logic_vector(3 downto 0); + O_VIDEO_B : out std_logic_vector(3 downto 0); + -- + ENA : in std_logic; + ENAB : in std_logic; + ENA_12 : in std_logic; + CLK : in std_logic + ); +end; + +-- chars stars vidout? shell/missile +-- +-- 220R B 100 B 390R B 100R R +-- 470R B 150 B 100R G +-- 220R G 100 G blue ? +-- 470R G 150 G +-- 1K G 100 R +-- 220R R 150 R +-- 470R R +-- 1K R +architecture RTL of SCRAMBLE_VIDEO is + + type array_3x5 is array (2 downto 0) of std_logic_vector(4 downto 0); + -- timing + signal ld : std_logic; + signal h256_l : std_logic; + signal h256 : std_logic; + signal cblank_s : std_logic; + signal hcmp1_s : std_logic; + signal hcmp2_s : std_logic; + signal hcmp1 : std_logic; + signal hcmp2 : std_logic; + signal cblank_l : std_logic; + signal h256_l_s : std_logic; + signal hcnt_f : std_logic_vector(7 downto 0); + signal vcnt_f : std_logic_vector(7 downto 0); + + -- load strobes + signal vpl_load : std_logic; + signal col_load : std_logic; + signal objdata_load : std_logic; + signal missile_load : std_logic; + signal missile_reg_l : std_logic; + + signal cntr_clr : std_logic; + signal cntr_load : std_logic; + signal sld_l : std_logic; + + -- video ram + signal vram_addr_sum : std_logic_vector(8 downto 0); -- extra bit for debug + signal msld_l : std_logic; + signal vram_addr_reg : std_logic_vector(7 downto 0); + signal vram_addr_xor : std_logic_vector(3 downto 0); + signal vram_addr : std_logic_vector(9 downto 0); + signal vram_dout : std_logic_vector(7 downto 0); + signal ldout : std_logic; + + -- object ram + signal obj_addr : std_logic_vector(7 downto 0); + signal hpla : std_logic_vector(7 downto 0); + signal objdata : std_logic_vector(7 downto 0); + + signal obj_rom_addr : std_logic_vector(10 downto 0); + signal obj_rom_0_dout : std_logic_vector(7 downto 0); + signal obj_rom_1_dout : std_logic_vector(7 downto 0); + -- + signal col_reg : std_logic_vector(2 downto 0); + signal cd : std_logic_vector(2 downto 0); + + signal shift_reg_1 : std_logic_vector(7 downto 0); + signal shift_reg_0 : std_logic_vector(7 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + signal gr : std_logic_vector(1 downto 0); + signal gc : std_logic_vector(2 downto 0); + + signal vid : std_logic_vector(1 downto 0); + signal col : std_logic_vector(2 downto 0); + + signal obj_video_out_reg : std_logic_vector(4 downto 0); + signal vidout_l : std_logic; + signal obj_lut_out : std_logic_vector(7 downto 0); + + signal cntr_addr : std_logic_vector(7 downto 0); + signal cntr_addr_xor : std_logic_vector(10 downto 0); + signal sprite_sel : std_logic; + signal sprite_ram_ip : std_logic_vector(7 downto 0); + signal sprite_ram_waddr : std_logic_vector(10 downto 0); + signal sprite_ram_op : std_logic_vector(7 downto 0); + -- shell + signal shell_cnt : std_logic_vector(7 downto 0); + signal shell_ena : std_logic; + signal shell : std_logic; + signal shell_reg : std_logic; + -- stars + signal star_reg_1 : std_logic; + signal star_reg_2 : std_logic; + signal star_cnt_div : std_logic_vector(22 downto 0); + signal star_cnt : std_logic_vector(1 downto 0); + signal star_shift : std_logic_vector(16 downto 0); + signal star_shift_t1 : std_logic_vector(16 downto 0); + signal star_on : std_logic; + signal star_out_reg : std_logic; + -- frogger blue bar + signal frogger_blue_reg : std_logic; + signal frogger_blue : std_logic; + signal frogger_blue_out_reg : std_logic; + -- scramble blue + signal pout1_reg : std_logic; + + +begin + p_hcnt_decode : process(I_HCNT) + begin + ld <= '0'; + if (I_HCNT(2 downto 0) = "111") then + ld <= '1'; + end if; + h256_l <= I_HCNT(8); + h256 <= not I_HCNT(8); + + end process; + + p_timing_decode : process(h256, h256_l, I_HCMA, I_VBLANK) + begin + cblank_s <= not (I_VBLANK or h256); -- active low + hcmp1_s <= h256_l and I_HCMA; + end process; + + p_reg : process + begin + wait until rising_edge(CLK); + + if (ENA = '1') then + if (ld = '1') then + hcmp1 <= hcmp1_s; + hcmp2 <= hcmp2_s; + cblank_l <= cblank_s; + h256_l_s <= h256_l; + + if not I_HWSEL_FROGGER then + cd <= col_reg; + else + cd <= col_reg(0) & col_reg(2 downto 1); + end if; + end if; + end if; + end process; + + p_load_decode : process(ld, I_HCNT, h256) + variable obj_load : std_logic; + begin + vpl_load <= '0'; + obj_load := '0'; + col_load <= '0'; + + if (I_HCNT(2 downto 0) = "001") then vpl_load <= '1'; end if; -- 1 clock later + if (I_HCNT(2 downto 0) = "011") then obj_load := '1'; end if; -- 1 later + if (I_HCNT(2 downto 0) = "101") then col_load <= '1'; end if; -- 1 later + + objdata_load <= obj_load and h256 and (not I_HCNT(3)); + missile_load <= obj_load and h256 and ( I_HCNT(3)); + + cntr_clr <= ld and (not h256) and (not I_HCNT(3)); + cntr_load <= ld and ( h256) and (not I_HCNT(3)); + + end process; + + p_hv_flip : process(I_HCNT, I_VCNT, I_VCMA, hcmp1_s) + begin + for i in 0 to 7 loop + vcnt_f(i) <= I_VCNT(i) xor I_VCMA; + hcnt_f(i) <= I_HCNT(i) xor hcmp1_s; + end loop; + end process; + + p_video_addr_calc : process(I_HWSEL_FROGGER, vcnt_f, hpla) + begin + if not I_HWSEL_FROGGER then + vram_addr_sum <= ('0' & vcnt_f(7 downto 0)) + ('0' & hpla(7 downto 0)); + else + vram_addr_sum <= ('0' & vcnt_f(7 downto 0)) + ('0' & hpla(3 downto 0) & hpla(7 downto 4)); + end if; + end process; + + p_msld : process(vram_addr_sum) + begin + msld_l <= '1'; + if (vram_addr_sum(7 downto 0) = "11111111") then + msld_l <= '0'; + end if; + end process; + + p_video_addr_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (I_VBLANK = '1') then -- was async + vram_addr_reg <= x"00"; + elsif (vpl_load = '1') then -- vpl_l + vram_addr_reg <= vram_addr_sum(7 downto 0); + end if; + end if; + end process; + + p_vram_xor : process(vram_addr_reg, objdata, h256) + variable flip : std_logic; + begin + flip := objdata(7) and h256; + for i in 0 to 3 loop + vram_addr_xor(i) <= vram_addr_reg(i) xor flip; + end loop; + end process; + + p_vram_addr : process(vram_addr_reg, cblank_s, ld, I_CPU_ADDR, vram_addr_xor, hcnt_f) + variable match : std_logic; + begin + match := '0'; + if (vram_addr_reg(7 downto 4) = "1111") then + match := '1'; + end if; + + if (cblank_s = '0') then + ldout <= match and ld; -- blanking, sprites + else + ldout <= ld; + end if; + + if (cblank_s = '0') then -- blanking, sprites + --vram_cs <= (not I_VRAMWR_L) or (not I_VRAMRD_L); + vram_addr <= I_CPU_ADDR(9 downto 0); -- let the cpu in + else + --vram_cs <= '1'; + vram_addr <= vram_addr_reg(7 downto 4) & vram_addr_xor(3) & hcnt_f(7 downto 3); + end if; + end process; + + u_vram : work.dpram generic map (10,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => not I_VRAMWR_L, + + addr_a_i => vram_addr, + data_a_i => I_CPU_DATA, -- only cpu can write + + clk_b_i => clk, + addr_b_i => vram_addr, + data_b_o => vram_dout + ); + O_VRAM_DATA <= vram_dout; + + p_object_ram_addr : process(h256, I_HCMA, objdata, I_HCNT, hcnt_f, I_CPU_ADDR, I_OBJEN_L) + begin + -- I believe the object ram can only be written during vblank + + if (h256 = '0') then + hcmp2_s <= I_HCMA; + else + hcmp2_s <= objdata(6); + end if; + + if (I_OBJEN_L = '0') then + obj_addr <= I_CPU_ADDR(7 downto 0); + else + obj_addr(7) <= '0'; + obj_addr(6) <= h256; + + -- A + if (h256 = '0') then -- normal + obj_addr(5) <= hcnt_f(7); --128h'; + else -- sprite + obj_addr(5) <= hcnt_f(3) and I_HCNT(1);-- 8h' and 2h; + end if; + + obj_addr(4 downto 2) <= hcnt_f(6 downto 4); + + if (h256 = '0') then -- normal + obj_addr(1) <= hcnt_f(3); --8h' + obj_addr(0) <= I_HCNT(2); --4h + else + obj_addr(1) <= I_HCNT(2); --4h + obj_addr(0) <= I_HCNT(1); --2h + end if; + + end if; + end process; + + u_object_ram : work.dpram generic map (8,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => not I_OBJRAMWR_L, + + addr_a_i => obj_addr, + data_a_i => I_CPU_DATA, -- only cpu can write + + clk_b_i => clk, + addr_b_i => obj_addr, + data_b_o => hpla + ); + + p_objdata_regs : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (col_load = '1') then -- colour load + col_reg <= hpla(2 downto 0); + end if; + + if (objdata_load = '1') then -- sprite load + objdata <= hpla; + end if; + + if (I_VBLANK = '1') then -- was async + missile_reg_l <= '1'; + elsif (missile_load = '1') then + missile_reg_l <= msld_l; + end if; + end if; + end process; + + p_obj_rom_addr : process(h256, vram_addr_xor, vram_dout, objdata, I_HCNT) + begin + obj_rom_addr( 2 downto 0) <= vram_addr_xor(2 downto 0); + if (h256 = '0') then + -- a + obj_rom_addr(10 downto 3) <= vram_dout; -- background objects + else + obj_rom_addr(10 downto 3) <= objdata(5 downto 0) & vram_addr_xor(3) & (objdata(6) xor I_HCNT(3)); -- sprites + end if; + end process; + + obj_rom0 : entity work.ROM_OBJ_0 -- 5H + port map (CLK => CLK, ADDR => obj_rom_addr, DATA => obj_rom_0_dout); + obj_rom1 : entity work.ROM_OBJ_1 -- 5F + port map (CLK => CLK, ADDR => obj_rom_addr, DATA => obj_rom_1_dout); + + p_obj_rom_shift : process + variable obj_rom_0_dout_s : std_logic_vector(7 downto 0); + begin + wait until rising_edge (CLK); + if not I_HWSEL_FROGGER then + obj_rom_0_dout_s := obj_rom_0_dout; + else -- swap bits 0 and 1 + obj_rom_0_dout_s := obj_rom_0_dout(7 downto 2) & obj_rom_0_dout(0) & obj_rom_0_dout(1); + end if; + + if (ENA = '1') then + case shift_sel is + when "00" => null; -- do nothing + + when "01" => shift_reg_1 <= '0' & shift_reg_1(7 downto 1); -- right + shift_reg_0 <= '0' & shift_reg_0(7 downto 1); + + when "10" => shift_reg_1 <= shift_reg_1(6 downto 0) & '0'; -- left + shift_reg_0 <= shift_reg_0(6 downto 0) & '0'; + + when "11" => shift_reg_1 <= obj_rom_1_dout (7 downto 0); -- load + shift_reg_0 <= obj_rom_0_dout_s(7 downto 0); + when others => null; + end case; + end if; + end process; + + p_obj_rom_shift_sel : process(hcmp2, ldout, shift_reg_1, shift_reg_0) + begin + if (hcmp2 = '0') then + + shift_sel(1) <= '1'; + shift_sel(0) <= ldout; + shift_op(1) <= shift_reg_1(7); + shift_op(0) <= shift_reg_0(7); + else + + shift_sel(1) <= ldout; + shift_sel(0) <= '1'; + shift_op(1) <= shift_reg_1(0); + shift_op(0) <= shift_reg_0(0); + end if; + end process; + + p_video_out_logic : process(shift_op, cd, gr, gc) + variable vidon : std_logic; + begin + vidon := shift_op(0) or shift_op(1); + + if (gr(1 downto 0) = "00") then + vid(1 downto 0) <= shift_op(1 downto 0); + else + vid(1 downto 0) <= gr(1 downto 0); + end if; + + if (gc(2 downto 0) = "000") and (vidon = '1') then + col(2 downto 0) <= cd(2 downto 0); + else + col(2 downto 0) <= gc(2 downto 0); + end if; + end process; + + p_shell_ld : process(ld, h256, I_HCNT, missile_reg_l) + begin + sld_l <= '1'; + if (ld = '1') and (h256 = '1') and (I_HCNT(3) = '1') then + if (missile_reg_l = '0') and (I_HCNT(6 downto 4) /= "111") then + sld_l <= '0'; + end if; + end if; + + end process; + + p_shell_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + if (sld_l = '0') then + shell_cnt <= hpla; + elsif (cblank_l = '1') then + shell_cnt <= shell_cnt + "1"; + else + shell_cnt <= shell_cnt; + end if; + + if (sld_l = '0') then + shell_ena <= '1'; + elsif (shell = '1') then + shell_ena <= '0'; + end if; + end if; + end process; + + p_shell_op : process(shell_cnt, shell_ena) + begin + -- note how T input is from QD on the bottom counter + -- we get a rc from xF8 to XFF + -- so the shell is set at count xFA (rc and bit 1) + shell <= '0'; + if (shell_cnt = x"F8") then -- minus 2 as delay wrong + shell <= shell_ena; + end if; + end process; + + p_cntr_cnt : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (cntr_clr = '1') and (h256_l_s = '0') then -- async + cntr_addr <= (others => '0'); + elsif (cntr_load = '1') then + cntr_addr <= hpla(7 downto 0); + else + cntr_addr <= cntr_addr + "1"; + end if; + end if; + end process; + + p_cntr_addr : process(cntr_addr, hcmp1) + begin + cntr_addr_xor(10 downto 8) <= (others => '0'); + for i in 0 to 7 loop + cntr_addr_xor(i) <= cntr_addr(i) xor hcmp1; + end loop; + end process; + + p_sprite_sel : process(h256_l_s, cntr_addr_xor) + begin + sprite_sel <= '0'; + if (h256_l_s = '0') and (cntr_addr_xor(7 downto 4) /= "0000") then + sprite_sel <= '1'; + end if; + end process; + + p_sprite_write : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + -- delay 1 clock + sprite_ram_ip <= (others => '0'); + if (sprite_sel = '1') then + sprite_ram_ip(4 downto 2) <= col(2 downto 0); + sprite_ram_ip(1 downto 0) <= vid(1 downto 0); + end if; + + sprite_ram_waddr <= cntr_addr_xor; + end if; + end process; + + u_sprite_ram : work.dpram generic map (11,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => '1', + + addr_a_i => sprite_ram_waddr, + data_a_i => sprite_ram_ip, + + clk_b_i => clk, + addr_b_i => cntr_addr_xor, + data_b_o => sprite_ram_op + ); + + gc(2 downto 0) <= sprite_ram_op(4 downto 2); + gr(1 downto 0) <= sprite_ram_op(1 downto 0); + + p_video_out_reg : process + variable vidout_l_int : std_logic; + begin + wait until rising_edge(CLK); + -- register all objects to match increased video delay + if (ENA = '1') then + star_shift_t1 <= star_shift; + + if (cblank_l = '0') then + -- logic around the clr workes out as a sync reset + obj_video_out_reg <= (others => '0'); + shell_reg <= '0'; + frogger_blue_out_reg <= '0'; + star_out_reg <= '0'; + pout1_reg <= '0'; + else + + obj_video_out_reg(4 downto 2) <= col(2 downto 0); + obj_video_out_reg(1 downto 0) <= vid(1 downto 0); + vidout_l <= not(vid(1) or vid(0)); + -- probably wider than the original, we must be a whole 6MHz clock here or the scan-doubler will loose it. + shell_reg <= shell; + frogger_blue_out_reg <= frogger_blue; + + star_out_reg <= '0'; + if (star_shift(7 downto 0) = x"FF") and (star_on = '1') then + star_out_reg <= (vcnt_f(0) xor hcnt_f(3)) and (not star_shift(16)); + end if; + + pout1_reg <= I_POUT1; + + end if; + end if; + end process; + +-- Non BRAM (LUT) Version +-- col_rom : entity work.ROM_LUT +-- port map( +-- ADDR => obj_video_out_reg(4 downto 0), +-- DATA => obj_lut_out +-- ); + +-- BRAM Version + col_rom : entity work.ROM_LUT + port map( + CLK => CLK, + ADDR => obj_video_out_reg(4 downto 0), + DATA => obj_lut_out + ); + + p_col_rom_ce : process + variable video : array_3x5; + begin + wait until rising_edge(CLK); + if (ENA = '1') then + video(0)(4) := '0'; + video(1)(4) := '0'; + video(2)(4) := '0'; + video(0)(3) := '0'; -- b + video(1)(3) := '0'; -- g + video(2)(3) := '0'; -- r + + if (vidout_l = '0') then -- cs_l on col rom + + video(0)(2 downto 0) := obj_lut_out(7 downto 6) & '0'; + video(1)(2 downto 0) := obj_lut_out(5 downto 3); + video(2)(2 downto 0) := obj_lut_out(2 downto 0); + else + video(0)(2 downto 0) := "000"; + video(1)(2 downto 0) := "000"; + video(2)(2 downto 0) := "000"; + end if; + -- + -- end of direct assigns + -- + if I_HWSEL_FROGGER then + if (frogger_blue_out_reg = '1') and (vidout_l = '1') then + video(0) := video(0) + "00010"; + end if; + end if; + + -- add stars, background and video + if not I_HWSEL_FROGGER then + if (star_out_reg = '1') and (vidout_l = '1') then + video(0) := video(0) + ( '0' & star_shift_t1(13 downto 12) & "00"); + video(1) := video(1) + ( '0' & star_shift_t1(11 downto 10) & "00"); + video(2) := video(2) + ( '0' & star_shift_t1( 9 downto 8) & "00"); + end if; + + if (pout1_reg = '1') and (vidout_l = '1') then + video(0) := video(0) + ("00011"); + end if; + end if; + -- check for clip + for i in 0 to 2 loop + if video(i)(4) = '1' or video(i)(3) = '1' then + video(i)(2 downto 0) := (others => '1'); + end if; + end loop; + + O_VIDEO_B <= video(0)(2 downto 0) & video(0)(2); + O_VIDEO_G <= video(1)(2 downto 0) & video(1)(2); + O_VIDEO_R <= video(2)(2 downto 0) & video(2)(2); + end if; + end process; + + p_frogger_blue_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (I_HCNT(7 downto 0) = x"87") then + frogger_blue_reg <= '1'; + elsif (I_HCNT(7 downto 0) = x"07") then + frogger_blue_reg <= '0'; + end if; + end if; + end process; + frogger_blue <= not (frogger_blue_reg xor I_HCMA); + + p_stars_timer : process + begin + wait until rising_edge(CLK); + -- 555 period 0.8316 seconds + -- ~ 4DF 666 + if (ENA = '1') then + if (star_cnt_div(22 downto 17) = "100111") then + star_cnt_div <= (others => '0'); + star_cnt <= star_cnt + "1"; + else + star_cnt_div <= star_cnt_div + "1"; + end if; + end if; + end process; + + p_stars_demux : process(star_cnt, I_VCNT, star_shift) + begin + case star_cnt is + when "00" => star_on <= star_shift(8); + when "01" => star_on <= star_shift(10); + when "10" => star_on <= I_VCNT(1); + when "11" => star_on <= '1'; + when others => null; + end case; + end process; + + p_stars : process + variable star_ena : std_logic; + variable star_shift_ena : std_logic; + variable fb : std_logic; + variable star_clear : std_logic; + begin + wait until rising_edge(CLK); + -- stars clocked off 12 MHz clock + star_ena := ENA_12 and (not I_VSYNC) and h256_l_s; + + if (ENA = '1') and (I_VSYNC = '1') then + star_reg_1 <= '0'; + star_reg_2 <= '0'; + elsif (star_ena = '1') then + star_reg_1 <= '1'; + star_reg_2 <= star_reg_1; + end if; + + star_shift_ena := (star_reg_2 or I_HCMA) and star_ena; + + star_clear := I_STARSON and (not I_VBLANK); + + fb := (not star_shift(16)) xor star_shift(4); + if (star_clear = '0') then + star_shift <= (others => '0'); + elsif (star_shift_ena = '1') then + star_shift(16 downto 0) <= star_shift(15 downto 0) & fb; + end if; + end process; + +end RTL; diff --git a/Arcade/Scramble Hardware/Amidar_MiST/rtl/video_mixer.sv b/Arcade/Scramble Hardware/Amidar_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Scramble Hardware/Amidar_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/Arcade/Scramble Hardware/Frogger_MiST/Frogger.qpf b/Arcade/Scramble Hardware/Frogger_MiST/Frogger.qpf new file mode 100644 index 00000000..72d664b7 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/Frogger.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Frogger" diff --git a/Arcade/Scramble Hardware/Frogger_MiST/Frogger.qsf b/Arcade/Scramble Hardware/Frogger_MiST/Frogger.qsf new file mode 100644 index 00000000..3486921b --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/Frogger.qsf @@ -0,0 +1,171 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 05:08:48 November 15, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Arcade-Frogger_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +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 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 FroggerMist + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 + +# Assembler Assignments +# ===================== +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)" + +# ---------------------- +# start ENTITY(Scramble) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Scramble) +# -------------------- +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.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 SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_SND_2.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_SND_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_SND_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_OBJ_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_OBJ_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_LUT.vhd +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/MULT18X18.vhd +set_global_assignment -name VHDL_FILE rtl/i82c55.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VERILOG_FILE rtl/build_id.v +set_global_assignment -name VHDL_FILE rtl/YM2149_linmix_sep.vhd +set_global_assignment -name VHDL_FILE rtl/scramble_video.vhd +set_global_assignment -name VHDL_FILE rtl/scramble_top.vhd +set_global_assignment -name VHDL_FILE rtl/scramble_audio.vhd +set_global_assignment -name VHDL_FILE rtl/scramble.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/FroggerMist.sv +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +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 USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +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" +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 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Scramble Hardware/Frogger_MiST/Frogger.srf b/Arcade/Scramble Hardware/Frogger_MiST/Frogger.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/Frogger.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Scramble Hardware/Frogger_MiST/README.txt b/Arcade/Scramble Hardware/Frogger_MiST/README.txt new file mode 100644 index 00000000..aa348b1d --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/README.txt @@ -0,0 +1,22 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Frogger port to MiST by Gehstock +-- 10 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Frogger hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- diff --git a/Arcade/Scramble Hardware/Frogger_MiST/Release/Frogger.rbf b/Arcade/Scramble Hardware/Frogger_MiST/Release/Frogger.rbf new file mode 100644 index 00000000..9c55eb65 Binary files /dev/null and b/Arcade/Scramble Hardware/Frogger_MiST/Release/Frogger.rbf differ diff --git a/Arcade/Scramble Hardware/Frogger_MiST/clean.bat b/Arcade/Scramble Hardware/Frogger_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_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/Arcade/Scramble Hardware/Frogger_MiST/rtl/FroggerMist.sv b/Arcade/Scramble Hardware/Frogger_MiST/rtl/FroggerMist.sv new file mode 100644 index 00000000..5caf3f1b --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/FroggerMist.sv @@ -0,0 +1,201 @@ +//============================================================================ +// Arcade: Frogger +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module FroggerMist +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Frogger;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +//////////////////// CLOCKS /////////////////// + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6p, ce_6n, ce_12, ce_1p79; +always @(negedge clk_sys) begin + reg [1:0] div = 0; + reg [3:0] div179 = 0; + + div <= div + 1'd1; + + ce_12 <= div[0]; + ce_6p <= div[0] & ~div[1]; + ce_6n <= div[0] & div[1]; + + ce_1p79 <= 0; + div179 <= div179 - 1'd1; + if(!div179) begin + div179 <= 13; + ce_1p79 <= 1; + end +end + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [9:0] audio; +wire hsync,vsync; +assign LED = 1; +wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [3:0] r,b,g; + +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6p), + .ce_pix_actual(ce_6p), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r[1:0]}), + .G({g,g[1:0]}), + .B({b,b[1:0]}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + + +scramble_top scramble +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .button_in(~{m_start2, m_fire, m_coin, m_start1, m_right, m_left, m_down, m_up}), + + .RESET(status[0] | status[6] | buttons[1]), + .clk(clk_sys), + .ena_12(ce_12), + .ena_6(ce_6p), + .ena_6b(ce_6n), + .ena_1_79(ce_1p79) +); +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule + diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/MULT18X18.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/MULT18X18.vhd new file mode 100644 index 00000000..32535505 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/MULT18X18.vhd @@ -0,0 +1,53 @@ + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY lpm; +USE lpm.all; + +ENTITY MULT18X18 IS + PORT + ( + A : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + B : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + P : OUT STD_LOGIC_VECTOR (35 DOWNTO 0) + ); +END MULT18X18; + + +ARCHITECTURE SYN OF mult18x18 IS + + COMPONENT lpm_mult + GENERIC ( + lpm_hint : STRING; + lpm_representation : STRING; + lpm_type : STRING; + lpm_widtha : NATURAL; + lpm_widthb : NATURAL; + lpm_widthp : NATURAL + ); + PORT ( + dataa : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + datab : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + result : OUT STD_LOGIC_VECTOR (35 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + lpm_mult_component : lpm_mult + GENERIC MAP ( + lpm_hint => "MAXIMIZE_SPEED=5", + lpm_representation => "SIGNED", + lpm_type => "LPM_MULT", + lpm_widtha => 18, + lpm_widthb => 18, + lpm_widthp => 36 + ) + PORT MAP ( + dataa => A, + datab => B, + result => P + ); + +END SYN; + diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_LUT.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_LUT.vhd new file mode 100644 index 00000000..57972287 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_LUT.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_LUT is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_LUT is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"07",X"C0",X"F6",X"00",X"F6",X"5E",X"5C",X"00",X"F0",X"3C",X"D7",X"00",X"C0",X"C4",X"07", + X"00",X"31",X"17",X"F0",X"00",X"31",X"C7",X"3F",X"00",X"F6",X"07",X"31",X"00",X"3F",X"07",X"C4"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_OBJ_0.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_OBJ_0.vhd new file mode 100644 index 00000000..8a6388bf --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_OBJ_0.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_OBJ_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_OBJ_0 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"38",X"7C",X"C1",X"81",X"85",X"7C",X"38",X"00",X"01",X"01",X"FD",X"FD",X"41",X"01",X"00",X"00", + X"61",X"F1",X"B9",X"99",X"9D",X"CD",X"45",X"00",X"8C",X"DD",X"F1",X"B1",X"91",X"85",X"04",X"00", + X"08",X"FD",X"FD",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BD",X"A1",X"A1",X"A1",X"E5",X"E4",X"00", + X"0C",X"9D",X"91",X"91",X"D1",X"7D",X"3C",X"00",X"C0",X"E0",X"B0",X"9D",X"8D",X"C0",X"C0",X"00", + X"0C",X"6D",X"99",X"99",X"B1",X"F1",X"6C",X"00",X"78",X"FC",X"95",X"91",X"91",X"F1",X"60",X"00", + X"3D",X"7D",X"C8",X"88",X"C8",X"7D",X"3D",X"00",X"6C",X"FD",X"91",X"91",X"91",X"FD",X"FD",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3D",X"7D",X"C8",X"88",X"C8",X"7D",X"3D",X"00", + X"6C",X"FD",X"91",X"91",X"91",X"FD",X"FD",X"00",X"44",X"C5",X"81",X"81",X"C5",X"7C",X"38",X"00", + X"38",X"7C",X"C5",X"81",X"81",X"FD",X"FD",X"00",X"81",X"91",X"91",X"91",X"FD",X"FD",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"FD",X"FD",X"00",X"9D",X"9D",X"91",X"81",X"C5",X"7C",X"38",X"00", + X"FD",X"FD",X"10",X"10",X"10",X"FD",X"FD",X"00",X"81",X"81",X"FD",X"FD",X"81",X"81",X"00",X"00", + X"FC",X"FD",X"01",X"01",X"01",X"05",X"04",X"00",X"81",X"C5",X"6D",X"3C",X"18",X"FD",X"FD",X"00", + X"01",X"01",X"01",X"01",X"FD",X"FD",X"00",X"00",X"FD",X"FD",X"70",X"38",X"70",X"FD",X"FD",X"00", + X"FD",X"FD",X"1C",X"38",X"70",X"FD",X"FD",X"00",X"7C",X"FD",X"81",X"81",X"81",X"FD",X"7C",X"00", + X"70",X"F8",X"88",X"88",X"88",X"FD",X"FD",X"00",X"79",X"FC",X"8D",X"89",X"81",X"FD",X"7C",X"00", + X"71",X"F5",X"9D",X"8C",X"88",X"FD",X"FD",X"00",X"0C",X"5D",X"D1",X"91",X"91",X"F5",X"64",X"00", + X"80",X"80",X"FD",X"FD",X"80",X"80",X"00",X"00",X"FC",X"FD",X"01",X"01",X"01",X"FD",X"FC",X"00", + X"F0",X"F8",X"1C",X"0D",X"1C",X"F8",X"F0",X"00",X"F8",X"FD",X"1C",X"38",X"1C",X"FD",X"F8",X"00", + X"C5",X"ED",X"7C",X"38",X"7C",X"ED",X"C5",X"00",X"C0",X"F0",X"1D",X"1D",X"F0",X"C0",X"00",X"00", + X"C1",X"E1",X"F1",X"B9",X"9D",X"8D",X"85",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"00", + X"00",X"00",X"00",X"00",X"08",X"0C",X"0D",X"0F",X"00",X"00",X"80",X"00",X"08",X"18",X"38",X"78", + X"07",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"70",X"40",X"C0",X"80",X"80",X"00",X"00",X"00", + X"04",X"0F",X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"20",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"E0", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"07",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"B0",X"E0",X"00", + X"00",X"00",X"00",X"00",X"04",X"0C",X"00",X"00",X"00",X"00",X"80",X"00",X"10",X"58",X"20",X"10", + X"00",X"00",X"00",X"0C",X"04",X"02",X"00",X"00",X"10",X"10",X"20",X"18",X"10",X"C0",X"80",X"00", + X"00",X"02",X"00",X"08",X"18",X"0C",X"00",X"00",X"00",X"00",X"80",X"08",X"0C",X"58",X"20",X"10", + X"00",X"00",X"00",X"0C",X"18",X"0A",X"02",X"00",X"10",X"10",X"20",X"18",X"0C",X"C8",X"C0",X"80", + X"00",X"00",X"00",X"08",X"18",X"0C",X"00",X"00",X"00",X"40",X"80",X"08",X"0C",X"58",X"20",X"10", + X"00",X"08",X"18",X"0C",X"00",X"02",X"02",X"00",X"10",X"18",X"2C",X"18",X"00",X"C0",X"C0",X"80", + X"7E",X"D7",X"B3",X"F7",X"5F",X"CC",X"D8",X"F8",X"FB",X"DA",X"9B",X"BF",X"FF",X"41",X"00",X"00", + X"E8",X"B8",X"98",X"BC",X"F8",X"10",X"00",X"00",X"B8",X"9C",X"B8",X"F8",X"58",X"C8",X"DC",X"F8", + X"78",X"F8",X"DC",X"97",X"B3",X"F7",X"DF",X"76",X"00",X"00",X"41",X"FF",X"F7",X"B3",X"97",X"BD", + X"00",X"00",X"10",X"F8",X"BD",X"98",X"B8",X"E8",X"77",X"FE",X"BC",X"FE",X"EF",X"E7",X"EE",X"7F", + X"00",X"10",X"38",X"10",X"01",X"07",X"01",X"17",X"00",X"00",X"20",X"70",X"20",X"00",X"08",X"AC", + X"3A",X"10",X"00",X"02",X"13",X"3A",X"10",X"00",X"C8",X"80",X"04",X"0D",X"84",X"12",X"38",X"10", + X"00",X"1C",X"3D",X"1D",X"3D",X"1C",X"00",X"00",X"67",X"3C",X"3C",X"7C",X"3C",X"3C",X"67",X"00", + X"3C",X"41",X"82",X"A6",X"A6",X"9A",X"41",X"3C",X"FF",X"82",X"82",X"82",X"82",X"82",X"82",X"FF", + X"01",X"03",X"05",X"0F",X"05",X"07",X"05",X"07",X"40",X"C0",X"60",X"F0",X"60",X"E0",X"60",X"E0", + X"07",X"07",X"07",X"0F",X"07",X"07",X"03",X"02",X"E0",X"E0",X"E0",X"F0",X"E0",X"E0",X"C0",X"80", + X"02",X"02",X"00",X"00",X"00",X"08",X"00",X"00",X"38",X"38",X"38",X"38",X"D0",X"18",X"18",X"18", + X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"90",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"00",X"00",X"00",X"04",X"04",X"00",X"38",X"18",X"18",X"58",X"50",X"58",X"18",X"38", + X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"08",X"38",X"38",X"38",X"38",X"30",X"B8",X"38",X"38", + X"00",X"00",X"00",X"03",X"0D",X"18",X"18",X"18",X"00",X"00",X"00",X"C0",X"70",X"18",X"C8",X"00", + X"0D",X"02",X"00",X"08",X"00",X"00",X"00",X"00",X"78",X"F8",X"78",X"30",X"78",X"78",X"38",X"38", + X"07",X"08",X"08",X"08",X"07",X"00",X"07",X"08",X"C0",X"20",X"20",X"20",X"C0",X"00",X"C0",X"20", + X"08",X"08",X"07",X"00",X"00",X"0F",X"04",X"00",X"20",X"20",X"C0",X"00",X"20",X"E0",X"20",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20", + X"07",X"00",X"05",X"0A",X"08",X"08",X"04",X"00",X"C0",X"00",X"20",X"20",X"A0",X"60",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"20",X"20",X"21",X"26",X"22", + X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"40",X"41",X"06",X"02",X"02",X"02",X"42",X"20", + X"02",X"03",X"62",X"90",X"97",X"7F",X"3B",X"3E",X"E0",X"FA",X"FB",X"FF",X"FD",X"FF",X"FC",X"E4", + X"3E",X"3B",X"7F",X"97",X"90",X"62",X"03",X"02",X"E4",X"E4",X"FF",X"FD",X"FF",X"FB",X"FA",X"E0", + X"00",X"00",X"10",X"3C",X"01",X"07",X"1F",X"1F",X"00",X"00",X"04",X"1D",X"30",X"E0",X"E0",X"E0", + X"1F",X"1F",X"07",X"01",X"3C",X"10",X"00",X"00",X"E0",X"E0",X"E0",X"30",X"1D",X"04",X"00",X"00", + X"00",X"00",X"00",X"10",X"3D",X"07",X"1F",X"1F",X"00",X"00",X"00",X"10",X"38",X"EC",X"E3",X"E0", + X"1F",X"1F",X"07",X"3D",X"10",X"00",X"00",X"00",X"E0",X"E3",X"EC",X"38",X"10",X"00",X"00",X"00", + X"00",X"00",X"08",X"1D",X"01",X"07",X"1F",X"1F",X"00",X"00",X"20",X"F0",X"80",X"C0",X"E0",X"E0", + X"1F",X"1F",X"07",X"01",X"1D",X"08",X"00",X"00",X"E0",X"E0",X"C0",X"80",X"F0",X"20",X"00",X"00", + X"00",X"10",X"30",X"10",X"18",X"0F",X"07",X"07",X"00",X"08",X"0C",X"08",X"18",X"F0",X"E0",X"E0", + X"07",X"0F",X"17",X"13",X"33",X"10",X"00",X"00",X"E0",X"F0",X"E8",X"C8",X"CC",X"08",X"00",X"00", + X"00",X"01",X"05",X"0C",X"18",X"0F",X"07",X"07",X"00",X"40",X"60",X"30",X"18",X"F0",X"E0",X"E0", + X"07",X"0F",X"0F",X"0B",X"1B",X"08",X"00",X"00",X"E0",X"F0",X"F0",X"D0",X"D8",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"33",X"17",X"1F",X"00",X"00",X"00",X"00",X"08",X"CC",X"E8",X"F8", + X"07",X"1F",X"17",X"33",X"13",X"00",X"00",X"00",X"E0",X"F8",X"E8",X"CC",X"C8",X"00",X"00",X"00", + X"00",X"00",X"01",X"08",X"12",X"07",X"27",X"0F",X"00",X"00",X"40",X"10",X"88",X"E0",X"E4",X"F0", + X"0F",X"27",X"07",X"12",X"08",X"01",X"00",X"00",X"F0",X"E4",X"E0",X"88",X"10",X"40",X"00",X"00", + X"00",X"02",X"14",X"20",X"02",X"46",X"03",X"4F",X"00",X"80",X"28",X"04",X"80",X"A1",X"C0",X"F1", + X"4F",X"03",X"46",X"02",X"20",X"14",X"02",X"00",X"F1",X"C0",X"A1",X"80",X"04",X"28",X"80",X"00", + X"01",X"00",X"20",X"00",X"01",X"00",X"88",X"02",X"40",X"00",X"04",X"00",X"40",X"00",X"12",X"80", + X"02",X"88",X"00",X"01",X"00",X"20",X"00",X"01",X"80",X"12",X"00",X"40",X"00",X"04",X"00",X"40", + X"00",X"00",X"00",X"04",X"0A",X"03",X"07",X"07",X"00",X"00",X"00",X"10",X"88",X"C0",X"E0",X"E0", + X"07",X"07",X"03",X"12",X"08",X"00",X"00",X"00",X"E0",X"E0",X"C0",X"88",X"10",X"00",X"00",X"00", + X"00",X"02",X"00",X"00",X"00",X"01",X"04",X"22",X"00",X"80",X"00",X"00",X"00",X"20",X"90",X"C1", + X"22",X"02",X"04",X"01",X"00",X"00",X"02",X"00",X"C1",X"C0",X"90",X"20",X"00",X"00",X"80",X"00", + X"02",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"08",X"14",X"01",X"21",X"29",X"48",X"48", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"04",X"04",X"06",X"02",X"0A",X"08", + X"02",X"03",X"07",X"07",X"0F",X"07",X"07",X"07",X"80",X"C0",X"E0",X"E0",X"F0",X"E0",X"E0",X"E0", + X"07",X"05",X"05",X"05",X"0F",X"05",X"05",X"01",X"E0",X"60",X"E0",X"60",X"F0",X"60",X"E0",X"40", + X"00",X"29",X"29",X"3F",X"08",X"08",X"0F",X"07",X"00",X"54",X"54",X"FC",X"10",X"10",X"F0",X"E0", + X"07",X"3F",X"07",X"37",X"07",X"3F",X"03",X"00",X"EC",X"F0",X"EC",X"E0",X"EC",X"F0",X"CC",X"00", + X"0F",X"1F",X"1F",X"1F",X"1F",X"0F",X"00",X"1F",X"F0",X"F0",X"F8",X"F8",X"F8",X"F0",X"00",X"F8", + X"1F",X"1F",X"0F",X"07",X"00",X"00",X"00",X"00",X"F8",X"F8",X"F0",X"E0",X"00",X"00",X"00",X"00", + X"00",X"00",X"0F",X"1F",X"1F",X"1F",X"0F",X"0F",X"00",X"00",X"F0",X"F8",X"F8",X"F8",X"F0",X"F0", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"20",X"08",X"00",X"10",X"00",X"40",X"00",X"00", + X"00",X"00",X"21",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"08",X"00",X"00",X"10", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"40",X"00",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"10",X"00",X"20",X"00", + X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"80",X"80",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"40",X"00",X"00",X"20",X"08", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"20",X"00",X"00",X"10",X"00",X"08", + X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"10",X"00",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"66",X"06",X"04",X"44",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"21",X"81",X"09",X"49",X"09",X"08",X"10",X"10", + X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"84",X"04",X"00",X"21",X"46",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"86",X"02",X"0A",X"0A",X"40",X"44",X"14",X"14", + X"00",X"00",X"00",X"00",X"18",X"00",X"0C",X"00",X"00",X"00",X"20",X"00",X"20",X"01",X"46",X"02", + X"03",X"00",X"00",X"00",X"05",X"05",X"00",X"00",X"60",X"01",X"06",X"02",X"02",X"C2",X"82",X"20", + X"C0",X"E0",X"E3",X"E3",X"E3",X"E3",X"E3",X"E3",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80", + X"E3",X"E3",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"80",X"80",X"FC",X"FD",X"FD",X"FD",X"01",X"00", + X"7F",X"7F",X"FF",X"FF",X"C3",X"E3",X"E0",X"E0",X"0C",X"8D",X"BD",X"BD",X"FD",X"FD",X"F1",X"F8", + X"E0",X"E0",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"F8",X"F8",X"FC",X"FD",X"FD",X"FD",X"01",X"00", + X"3F",X"3F",X"FF",X"FF",X"C0",X"E0",X"E0",X"E0",X"F0",X"F8",X"FC",X"FD",X"0D",X"0D",X"0D",X"0D", + X"E0",X"E0",X"FF",X"FF",X"3F",X"3F",X"00",X"00",X"0D",X"0D",X"FD",X"FD",X"F1",X"F8",X"08",X"00", + X"00",X"00",X"08",X"40",X"48",X"00",X"00",X"00",X"00",X"08",X"04",X"31",X"29",X"49",X"28",X"0A", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"2A",X"02",X"16",X"14",X"14",X"14",X"04",X"20", + X"00",X"00",X"10",X"3B",X"7F",X"33",X"13",X"1F",X"00",X"00",X"08",X"DC",X"FD",X"FC",X"F8",X"F8", + X"1F",X"13",X"33",X"7F",X"3B",X"10",X"00",X"00",X"F8",X"FC",X"FD",X"DC",X"08",X"00",X"00",X"00", + X"00",X"30",X"77",X"7F",X"33",X"37",X"7F",X"7F",X"00",X"18",X"D8",X"FC",X"FC",X"F8",X"F8",X"F8", + X"7F",X"7F",X"37",X"33",X"7F",X"77",X"30",X"00",X"F8",X"F8",X"F8",X"FC",X"FC",X"D8",X"18",X"00", + X"30",X"63",X"FF",X"F8",X"BC",X"7F",X"7F",X"7F",X"0C",X"CC",X"FF",X"FF",X"FE",X"FD",X"FD",X"FD", + X"7F",X"7F",X"7F",X"BC",X"F8",X"FF",X"63",X"30",X"FD",X"FD",X"FD",X"FE",X"FF",X"FF",X"CC",X"00", + X"0C",X"0C",X"01",X"3A",X"68",X"DC",X"FD",X"FD",X"00",X"00",X"00",X"03",X"83",X"44",X"28",X"10", + X"FD",X"DC",X"68",X"3A",X"01",X"0C",X"0C",X"00",X"28",X"44",X"83",X"03",X"00",X"00",X"00",X"00", + X"C3",X"E3",X"E3",X"E3",X"E3",X"E3",X"E0",X"E0",X"FC",X"FD",X"FD",X"FD",X"0D",X"8D",X"8D",X"0D", + X"F0",X"F8",X"3F",X"3F",X"0F",X"0F",X"00",X"00",X"3D",X"3D",X"F1",X"F8",X"C8",X"E0",X"20",X"00", + X"C0",X"E0",X"E3",X"E3",X"E3",X"E3",X"E3",X"E3",X"0C",X"0D",X"0D",X"8D",X"8D",X"8D",X"8D",X"8D", + X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FD",X"FD",X"FD",X"FD",X"01",X"00",X"00",X"00", + X"02",X"03",X"62",X"90",X"97",X"7F",X"3A",X"38",X"E0",X"FA",X"FB",X"FF",X"FD",X"FF",X"FC",X"E4", + X"38",X"3A",X"7F",X"97",X"90",X"62",X"03",X"02",X"E4",X"E4",X"FF",X"FD",X"FF",X"FB",X"FA",X"E0"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_OBJ_1.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_OBJ_1.vhd new file mode 100644 index 00000000..745ead46 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_OBJ_1.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_OBJ_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_OBJ_1 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"02",X"02",X"FE",X"FE",X"42",X"02",X"00",X"00", + X"62",X"F2",X"BA",X"9A",X"9E",X"CE",X"46",X"00",X"8C",X"DE",X"F2",X"B2",X"92",X"86",X"04",X"00", + X"08",X"FE",X"FE",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BE",X"A2",X"A2",X"A2",X"E6",X"E4",X"00", + X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"C0",X"E0",X"B0",X"9E",X"8E",X"C0",X"C0",X"00", + X"0C",X"6E",X"9A",X"9A",X"B2",X"F2",X"6C",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00", + X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00",X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00", + X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00",X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00", + X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00",X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00", + X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00", + X"FC",X"FE",X"02",X"02",X"02",X"06",X"04",X"00",X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00", + X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00", + X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00", + X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00",X"7A",X"FC",X"8E",X"8A",X"82",X"FE",X"7C",X"00", + X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00",X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00", + X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00", + X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0",X"00",X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00", + X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00", + X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"00", + X"00",X"00",X"00",X"01",X"0B",X"0F",X"0F",X"0F",X"00",X"00",X"80",X"C0",X"E8",X"F8",X"F8",X"F8", + X"07",X"00",X"02",X"03",X"00",X"00",X"00",X"00",X"F0",X"80",X"20",X"60",X"00",X"00",X"00",X"00", + X"00",X"0F",X"1C",X"1C",X"1C",X"0F",X"03",X"07",X"00",X"F0",X"38",X"38",X"38",X"F0",X"C0",X"E0", + X"0B",X"08",X"1C",X"1F",X"0F",X"07",X"00",X"00",X"D0",X"10",X"38",X"F8",X"F0",X"E0",X"00",X"00", + X"00",X"00",X"00",X"00",X"05",X"0F",X"07",X"07",X"00",X"00",X"80",X"80",X"D0",X"B8",X"D0",X"E0", + X"07",X"07",X"07",X"0F",X"05",X"00",X"00",X"00",X"E0",X"E0",X"D0",X"F8",X"D0",X"80",X"80",X"00", + X"00",X"01",X"00",X"08",X"19",X"0F",X"07",X"07",X"00",X"00",X"80",X"88",X"CC",X"B8",X"D0",X"E0", + X"07",X"07",X"07",X"0F",X"19",X"09",X"00",X"00",X"E0",X"E0",X"D0",X"F8",X"CC",X"C8",X"80",X"80", + X"00",X"00",X"00",X"00",X"01",X"0F",X"07",X"07",X"00",X"40",X"80",X"80",X"C0",X"B8",X"D0",X"E0", + X"07",X"07",X"0F",X"0F",X"01",X"01",X"00",X"00",X"E0",X"E0",X"D8",X"F8",X"C0",X"C0",X"80",X"80", + X"00",X"08",X"08",X"00",X"20",X"23",X"06",X"04",X"04",X"24",X"44",X"00",X"00",X"9C",X"A5",X"00", + X"04",X"44",X"42",X"00",X"06",X"E4",X"48",X"00",X"42",X"40",X"06",X"04",X"26",X"22",X"00",X"06", + X"04",X"06",X"23",X"48",X"08",X"00",X"00",X"00",X"00",X"A5",X"39",X"00",X"08",X"48",X"40",X"00", + X"00",X"28",X"CC",X"00",X"40",X"46",X"06",X"06",X"00",X"02",X"02",X"00",X"10",X"10",X"00",X"00", + X"7F",X"6F",X"57",X"EF",X"FD",X"7A",X"3D",X"EF",X"FE",X"FE",X"DE",X"AE",X"DE",X"FF",X"F6",X"6A", + X"56",X"6F",X"FF",X"FE",X"6D",X"56",X"EF",X"7F",X"B7",X"7E",X"FA",X"F5",X"7B",X"EE",X"D7",X"EF", + X"00",X"00",X"40",X"62",X"4C",X"00",X"00",X"00",X"00",X"38",X"7C",X"7C",X"7C",X"38",X"00",X"00", + X"3C",X"42",X"81",X"A5",X"A5",X"99",X"42",X"3C",X"FF",X"81",X"81",X"81",X"81",X"81",X"81",X"FF", + X"02",X"72",X"73",X"7A",X"73",X"72",X"01",X"00",X"40",X"4E",X"CE",X"5E",X"CE",X"4E",X"80",X"00", + X"02",X"33",X"33",X"39",X"30",X"30",X"00",X"00",X"40",X"CC",X"CC",X"9C",X"0C",X"0C",X"00",X"00", + X"1E",X"1E",X"0F",X"1F",X"1F",X"17",X"1F",X"1F",X"F8",X"F8",X"D8",X"F8",X"10",X"F8",X"F8",X"F8", + X"1B",X"1B",X"0F",X"0F",X"03",X"00",X"00",X"00",X"E8",X"78",X"68",X"E0",X"C0",X"00",X"00",X"00", + X"1F",X"1D",X"1F",X"0F",X"1F",X"1B",X"1B",X"1F",X"F8",X"F8",X"F8",X"B8",X"B0",X"B8",X"F8",X"F8", + X"1F",X"1F",X"1D",X"1F",X"1F",X"0F",X"1F",X"17",X"F8",X"E8",X"E8",X"E8",X"F0",X"78",X"F8",X"F8", + X"00",X"00",X"00",X"00",X"01",X"07",X"07",X"07",X"00",X"00",X"00",X"00",X"80",X"E0",X"30",X"F8", + X"11",X"1E",X"1F",X"17",X"1F",X"0F",X"1F",X"1F",X"88",X"38",X"B8",X"F0",X"B8",X"B8",X"F8",X"F8", + X"07",X"08",X"08",X"08",X"07",X"00",X"07",X"08",X"C0",X"20",X"20",X"20",X"C0",X"00",X"C0",X"20", + X"08",X"08",X"07",X"00",X"00",X"0F",X"04",X"00",X"20",X"20",X"C0",X"00",X"20",X"E0",X"20",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20", + X"07",X"00",X"06",X"09",X"08",X"08",X"04",X"00",X"C0",X"00",X"20",X"20",X"A0",X"60",X"20",X"00", + X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"D0",X"50",X"D0",X"D0",X"D0",X"D0",X"D0", + X"01",X"01",X"03",X"03",X"00",X"00",X"01",X"01",X"B0",X"B0",X"F0",X"F0",X"FC",X"FE",X"FE",X"FE", + X"00",X"00",X"00",X"20",X"21",X"00",X"04",X"02",X"00",X"00",X"00",X"00",X"C0",X"78",X"3C",X"3C", + X"02",X"04",X"00",X"21",X"20",X"00",X"00",X"00",X"3C",X"3C",X"78",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0B",X"13",X"1F",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0", + X"0F",X"12",X"0B",X"00",X"00",X"00",X"00",X"00",X"A0",X"40",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0B",X"13",X"1F",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0", + X"0F",X"12",X"0B",X"00",X"00",X"00",X"00",X"00",X"A0",X"40",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0B",X"13",X"1F",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0", + X"0F",X"12",X"0B",X"00",X"00",X"00",X"00",X"00",X"A0",X"40",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"A0", + X"07",X"07",X"01",X"05",X"03",X"00",X"00",X"00",X"A0",X"E0",X"80",X"A0",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"A0", + X"07",X"07",X"01",X"05",X"03",X"00",X"00",X"00",X"A0",X"E0",X"80",X"A0",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"A0", + X"07",X"07",X"01",X"05",X"03",X"00",X"00",X"00",X"A0",X"E0",X"80",X"A0",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"07",X"07",X"0F",X"00",X"00",X"00",X"00",X"80",X"E0",X"E0",X"F0", + X"0F",X"07",X"07",X"01",X"00",X"00",X"00",X"00",X"F0",X"E0",X"E0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0", + X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"07",X"00",X"00",X"00",X"00",X"80",X"40",X"A0",X"A0", + X"07",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"A0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"03",X"05",X"05",X"07",X"03",X"01",X"80",X"C0",X"C0",X"E0",X"D0",X"D0",X"B0",X"B0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"30",X"30",X"10",X"10",X"10",X"10",X"00", + X"00",X"00",X"30",X"30",X"39",X"33",X"33",X"02",X"00",X"00",X"0C",X"0C",X"9C",X"CC",X"CC",X"40", + X"00",X"01",X"72",X"73",X"7A",X"73",X"72",X"02",X"00",X"80",X"4E",X"CE",X"5E",X"CE",X"4E",X"40", + X"00",X"00",X"15",X"00",X"08",X"08",X"0A",X"00",X"00",X"00",X"A8",X"00",X"10",X"10",X"50",X"00", + X"33",X"0A",X"31",X"01",X"31",X"08",X"30",X"00",X"C0",X"5C",X"80",X"8C",X"80",X"1C",X"00",X"00", + X"00",X"10",X"10",X"10",X"10",X"00",X"03",X"10",X"00",X"00",X"08",X"08",X"08",X"00",X"C0",X"08", + X"10",X"10",X"00",X"08",X"07",X"00",X"00",X"00",X"08",X"08",X"00",X"10",X"E0",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"08",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"03",X"0D",X"1F",X"18",X"30",X"38",X"68",X"F0",X"A0",X"C0",X"00", + X"3F",X"3F",X"3B",X"19",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"40",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"08",X"08",X"00",X"08",X"18",X"28", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"A0",X"C0",X"C0",X"A0",X"F0",X"60",X"30", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"38",X"18",X"38",X"78",X"60",X"F0",X"C0",X"E0", + X"07",X"0F",X"0F",X"0E",X"06",X"02",X"00",X"00",X"40",X"80",X"C0",X"C0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"10",X"10",X"20",X"60",X"40",X"80",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"E0",X"20",X"70",X"70",X"58",X"30", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"C0",X"70",X"70",X"28",X"38",X"30", + X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"78",X"D8",X"F0",X"F0",X"D0",X"D0",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"C0",X"40",X"20",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"10",X"18",X"18",X"28",X"30",X"50",X"E0", + X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"F0",X"F0",X"D0",X"F0",X"F0",X"B0",X"F0",X"70", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"40",X"E0",X"60",X"20",X"40",X"C0",X"80",X"00", + X"01",X"03",X"05",X"03",X"01",X"01",X"03",X"07",X"F6",X"F2",X"E0",X"F0",X"F0",X"D0",X"F0",X"F0", + X"03",X"01",X"01",X"01",X"01",X"03",X"01",X"00",X"7C",X"FE",X"F6",X"FE",X"F2",X"B0",X"F0",X"E0", + X"00",X"00",X"00",X"00",X"60",X"F0",X"B0",X"78",X"00",X"10",X"10",X"10",X"10",X"10",X"30",X"30", + X"1C",X"0E",X"07",X"07",X"01",X"01",X"01",X"01",X"10",X"30",X"30",X"F0",X"FC",X"3E",X"7E",X"FE", + X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80", + X"20",X"20",X"00",X"00",X"00",X"00",X"7F",X"00",X"80",X"80",X"00",X"02",X"02",X"02",X"FE",X"00", + X"00",X"00",X"00",X"00",X"3C",X"20",X"21",X"20",X"00",X"82",X"82",X"82",X"02",X"02",X"0E",X"08", + X"20",X"20",X"00",X"00",X"00",X"00",X"7F",X"00",X"08",X"08",X"00",X"02",X"02",X"02",X"FE",X"00", + X"00",X"00",X"00",X"00",X"3F",X"20",X"20",X"20",X"00",X"08",X"00",X"02",X"F2",X"02",X"02",X"02", + X"20",X"20",X"00",X"00",X"40",X"00",X"1F",X"00",X"02",X"02",X"02",X"02",X"0E",X"08",X"F8",X"00", + X"00",X"30",X"70",X"B2",X"B7",X"FF",X"7F",X"1F",X"00",X"00",X"00",X"00",X"C0",X"A0",X"C0",X"E0", + X"07",X"03",X"03",X"01",X"01",X"00",X"00",X"00",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"60",X"00", + X"00",X"00",X"00",X"03",X"0C",X"1C",X"1D",X"1F",X"00",X"00",X"00",X"C0",X"F0",X"F8",X"F8",X"F8", + X"1F",X"1D",X"1C",X"0C",X"03",X"00",X"00",X"00",X"F8",X"E8",X"98",X"F0",X"C0",X"00",X"00",X"00", + X"00",X"00",X"07",X"18",X"2C",X"09",X"63",X"7F",X"00",X"00",X"C0",X"E0",X"F0",X"F8",X"F8",X"F8", + X"7F",X"63",X"09",X"2C",X"18",X"07",X"00",X"00",X"F8",X"F8",X"E8",X"90",X"E0",X"C0",X"00",X"00", + X"00",X"03",X"1F",X"37",X"23",X"60",X"61",X"7F",X"00",X"C0",X"F8",X"FC",X"FC",X"FE",X"FE",X"FE", + X"7F",X"61",X"60",X"23",X"37",X"1F",X"03",X"00",X"FE",X"FE",X"FE",X"F4",X"CC",X"F8",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"20",X"20",X"20",X"20",X"20",X"21",X"20",X"00",X"02",X"02",X"02",X"F2",X"82",X"82",X"02", + X"00",X"08",X"40",X"00",X"10",X"00",X"07",X"00",X"02",X"02",X"0E",X"08",X"38",X"20",X"E0",X"00", + X"00",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"02",X"02",X"82",X"82",X"82",X"82",X"82", + X"00",X"00",X"00",X"00",X"7F",X"00",X"00",X"00",X"02",X"02",X"02",X"02",X"FE",X"00",X"00",X"00", + X"00",X"00",X"00",X"60",X"61",X"00",X"06",X"07",X"00",X"00",X"00",X"00",X"C0",X"78",X"3C",X"3C", + X"07",X"06",X"00",X"21",X"20",X"00",X"00",X"00",X"3C",X"3C",X"78",X"C0",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_PGM.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_PGM.vhd new file mode 100644 index 00000000..166a14d2 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_PGM.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"3A",X"00",X"40",X"FE",X"55",X"CA",X"01",X"40",X"3A",X"00",X"88",X"31",X"00",X"88",X"C3",X"B1", + X"02",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"4F",X"3A",X"FE",X"83",X"B7",X"C8",X"E5",X"21", + X"00",X"83",X"34",X"7E",X"6F",X"71",X"E1",X"C9",X"1A",X"77",X"7D",X"D6",X"20",X"6F",X"30",X"01", + X"25",X"13",X"10",X"F4",X"C9",X"FF",X"FF",X"FF",X"11",X"10",X"20",X"21",X"00",X"A8",X"06",X"20", + X"73",X"23",X"10",X"FC",X"0E",X"15",X"10",X"FE",X"0D",X"20",X"FB",X"15",X"20",X"F0",X"C9",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F5",X"E5",X"D5",X"C5",X"DD",X"E5",X"FD",X"E5",X"3A",X"00", + X"88",X"AF",X"32",X"08",X"B8",X"CD",X"00",X"3E",X"21",X"07",X"80",X"11",X"07",X"B0",X"7E",X"12", + X"2C",X"1C",X"06",X"1C",X"7E",X"0F",X"0F",X"0F",X"0F",X"12",X"2C",X"1C",X"7E",X"12",X"2C",X"1C", + X"10",X"F2",X"0E",X"08",X"3A",X"2F",X"84",X"B7",X"28",X"05",X"0E",X"06",X"1E",X"48",X"6B",X"7E", + X"0F",X"0F",X"0F",X"0F",X"12",X"2C",X"1C",X"06",X"03",X"7E",X"12",X"2C",X"1C",X"10",X"FA",X"0D", + X"20",X"ED",X"21",X"7F",X"83",X"7E",X"B7",X"28",X"07",X"35",X"20",X"04",X"AF",X"32",X"1C",X"B8", + X"21",X"7E",X"83",X"7E",X"B7",X"28",X"07",X"35",X"20",X"04",X"AF",X"32",X"18",X"B8",X"3A",X"04", + X"E0",X"E6",X"08",X"CA",X"FC",X"00",X"3A",X"FE",X"83",X"A7",X"CA",X"FC",X"00",X"3A",X"FD",X"83", + X"A7",X"28",X"19",X"3D",X"28",X"16",X"0E",X"02",X"21",X"43",X"80",X"11",X"43",X"B0",X"7E",X"81", + X"12",X"0E",X"02",X"21",X"47",X"80",X"11",X"47",X"B0",X"7E",X"81",X"12",X"3A",X"FE",X"83",X"B7", + X"CA",X"22",X"01",X"CD",X"BF",X"07",X"3A",X"EA",X"83",X"B7",X"CA",X"53",X"02",X"2A",X"D2",X"83", + X"7C",X"B5",X"CA",X"7F",X"01",X"2B",X"22",X"D2",X"83",X"CD",X"40",X"25",X"CD",X"8B",X"28",X"C3", + X"53",X"02",X"3A",X"86",X"83",X"A7",X"CA",X"30",X"01",X"3D",X"32",X"86",X"83",X"C3",X"53",X"02", + X"3A",X"D6",X"83",X"FE",X"02",X"D2",X"66",X"01",X"B7",X"CC",X"D4",X"0D",X"CD",X"CA",X"33",X"AF", + X"32",X"CD",X"83",X"32",X"CF",X"83",X"32",X"B5",X"83",X"67",X"6F",X"22",X"93",X"82",X"21",X"5C", + X"82",X"11",X"5D",X"82",X"01",X"0B",X"00",X"70",X"ED",X"B0",X"21",X"AF",X"83",X"36",X"80",X"2C", + X"77",X"2C",X"77",X"C3",X"53",X"02",X"21",X"D8",X"83",X"7E",X"B7",X"CA",X"53",X"02",X"35",X"C2", + X"53",X"02",X"2D",X"7E",X"B7",X"C2",X"53",X"02",X"21",X"D6",X"83",X"35",X"C3",X"53",X"02",X"2A", + X"82",X"83",X"7C",X"B5",X"28",X"12",X"2B",X"22",X"82",X"83",X"7C",X"B5",X"20",X"0A",X"3E",X"0F", + X"DF",X"3E",X"B0",X"DF",X"AF",X"32",X"71",X"83",X"3A",X"FD",X"83",X"3D",X"C2",X"82",X"02",X"3A", + X"5C",X"82",X"FE",X"05",X"CA",X"6C",X"02",X"3A",X"98",X"82",X"A7",X"28",X"07",X"3D",X"32",X"98", + X"82",X"C3",X"F0",X"01",X"3A",X"97",X"82",X"A7",X"C2",X"65",X"02",X"2A",X"9D",X"82",X"7C",X"B5", + X"20",X"2E",X"CD",X"93",X"08",X"CD",X"DE",X"2A",X"3A",X"B5",X"83",X"B7",X"20",X"22",X"3C",X"32", + X"B5",X"83",X"3E",X"FF",X"32",X"84",X"83",X"3A",X"80",X"83",X"B7",X"28",X"13",X"AF",X"32",X"80", + X"83",X"21",X"40",X"00",X"22",X"82",X"83",X"11",X"11",X"10",X"21",X"51",X"AA",X"06",X"07",X"EF", + X"3A",X"84",X"83",X"B7",X"28",X"0A",X"3D",X"32",X"84",X"83",X"21",X"50",X"A8",X"CC",X"6B",X"2A", + X"CD",X"8E",X"30",X"CD",X"8B",X"28",X"3A",X"07",X"81",X"A7",X"28",X"07",X"3A",X"09",X"81",X"3D", + X"32",X"09",X"81",X"3A",X"08",X"81",X"A7",X"28",X"07",X"3A",X"24",X"81",X"3D",X"32",X"24",X"81", + X"CD",X"48",X"22",X"3A",X"07",X"81",X"A7",X"28",X"07",X"3A",X"09",X"81",X"3C",X"32",X"09",X"81", + X"3A",X"08",X"81",X"A7",X"28",X"07",X"3A",X"24",X"81",X"3C",X"32",X"24",X"81",X"CD",X"81",X"27", + X"CD",X"40",X"25",X"CD",X"00",X"1C",X"CD",X"50",X"30",X"CD",X"A0",X"02",X"3A",X"97",X"82",X"A7", + X"C4",X"B5",X"06",X"3A",X"00",X"88",X"FD",X"E1",X"DD",X"E1",X"C1",X"D1",X"E1",X"3E",X"01",X"32", + X"08",X"B8",X"F1",X"ED",X"45",X"3D",X"32",X"97",X"82",X"C3",X"F0",X"01",X"21",X"5E",X"82",X"11", + X"5F",X"82",X"01",X"04",X"00",X"70",X"ED",X"B0",X"AF",X"32",X"5C",X"82",X"CD",X"E6",X"05",X"C3", + X"53",X"02",X"3A",X"5D",X"82",X"FE",X"05",X"C2",X"A7",X"01",X"21",X"63",X"82",X"11",X"64",X"82", + X"01",X"04",X"00",X"70",X"ED",X"B0",X"AF",X"32",X"5D",X"82",X"CD",X"E6",X"05",X"C3",X"53",X"02", + X"2A",X"9D",X"82",X"7C",X"B5",X"C8",X"2B",X"22",X"9D",X"82",X"7C",X"B5",X"C0",X"32",X"AE",X"83", + X"C9",X"AF",X"32",X"08",X"B8",X"32",X"05",X"88",X"32",X"10",X"B8",X"32",X"0C",X"B8",X"21",X"00", + X"80",X"11",X"01",X"80",X"01",X"FF",X"07",X"75",X"ED",X"B0",X"21",X"00",X"B0",X"01",X"00",X"00", + X"71",X"2C",X"10",X"FC",X"3A",X"02",X"E0",X"11",X"D6",X"0E",X"E6",X"03",X"83",X"5F",X"30",X"01", + X"14",X"1A",X"32",X"E4",X"83",X"3A",X"04",X"E0",X"67",X"CB",X"5C",X"28",X"05",X"3E",X"01",X"32", + X"C2",X"83",X"7C",X"E6",X"06",X"32",X"D4",X"83",X"21",X"E0",X"0E",X"11",X"EB",X"83",X"01",X"12", + X"00",X"ED",X"B0",X"CD",X"BC",X"20",X"3E",X"01",X"32",X"70",X"83",X"32",X"08",X"B8",X"FF",X"AF", + X"32",X"01",X"B0",X"3E",X"06",X"32",X"03",X"B0",X"21",X"00",X"01",X"22",X"C7",X"83",X"3E",X"15", + X"32",X"81",X"83",X"21",X"87",X"0F",X"11",X"00",X"84",X"01",X"20",X"00",X"ED",X"B0",X"21",X"06", + X"E0",X"36",X"9B",X"21",X"06",X"D0",X"36",X"88",X"3E",X"18",X"32",X"D9",X"83",X"32",X"02",X"D0", + X"AF",X"CD",X"A7",X"07",X"3A",X"D9",X"83",X"E6",X"EF",X"32",X"D9",X"83",X"32",X"02",X"D0",X"3E", + X"FF",X"CD",X"A7",X"07",X"3A",X"D6",X"83",X"FE",X"02",X"D4",X"74",X"0C",X"CD",X"42",X"0B",X"3A", + X"D6",X"83",X"3D",X"C4",X"8A",X"0B",X"CD",X"98",X"33",X"3E",X"02",X"21",X"54",X"82",X"77",X"23", + X"77",X"3E",X"09",X"23",X"77",X"23",X"77",X"23",X"77",X"23",X"77",X"2A",X"C7",X"83",X"7C",X"B5", + X"2B",X"20",X"FB",X"3A",X"FE",X"83",X"B7",X"C2",X"1E",X"04",X"3A",X"B3",X"83",X"B7",X"20",X"C4", + X"3A",X"02",X"E0",X"07",X"30",X"07",X"07",X"38",X"BB",X"0E",X"02",X"18",X"02",X"0E",X"01",X"3A", + X"E1",X"83",X"B9",X"38",X"AF",X"91",X"27",X"32",X"E1",X"83",X"79",X"32",X"70",X"83",X"21",X"00", + X"85",X"11",X"01",X"85",X"01",X"FF",X"01",X"75",X"ED",X"B0",X"32",X"FE",X"83",X"3E",X"01",X"32", + X"FD",X"83",X"32",X"B3",X"83",X"67",X"6F",X"32",X"B7",X"83",X"22",X"B8",X"83",X"CD",X"2D",X"0B", + X"3E",X"03",X"32",X"3D",X"80",X"CD",X"EC",X"07",X"AF",X"32",X"71",X"80",X"DF",X"3E",X"09",X"DF", + X"3E",X"0A",X"DF",X"3E",X"0B",X"DF",X"21",X"20",X"00",X"22",X"9D",X"82",X"21",X"A0",X"01",X"22", + X"82",X"83",X"21",X"00",X"00",X"22",X"D2",X"83",X"CD",X"F9",X"07",X"FF",X"CD",X"C6",X"32",X"AF", + X"67",X"6F",X"32",X"2F",X"84",X"32",X"2D",X"84",X"22",X"93",X"82",X"21",X"40",X"84",X"11",X"41", + X"84",X"01",X"4F",X"00",X"70",X"ED",X"B0",X"32",X"04",X"80",X"3C",X"32",X"5A",X"82",X"3A",X"EA", + X"83",X"B7",X"C2",X"6A",X"04",X"3A",X"CD",X"83",X"B7",X"20",X"0D",X"3A",X"FE",X"83",X"3D",X"28", + X"04",X"FF",X"CD",X"01",X"07",X"CD",X"42",X"0B",X"3A",X"6D",X"82",X"A7",X"C4",X"03",X"06",X"CD", + X"65",X"09",X"32",X"EA",X"83",X"CD",X"39",X"0A",X"21",X"9E",X"83",X"36",X"20",X"2D",X"36",X"10", + X"2D",X"36",X"20",X"3A",X"FE",X"83",X"3D",X"C4",X"D4",X"07",X"AF",X"32",X"6D",X"82",X"3A",X"CD", + X"83",X"32",X"B6",X"83",X"CD",X"6B",X"0A",X"C3",X"7B",X"03",X"CD",X"42",X"0B",X"3A",X"CE",X"83", + X"B7",X"CA",X"7B",X"03",X"CD",X"17",X"08",X"CD",X"F9",X"07",X"AF",X"21",X"9A",X"83",X"77",X"2C", + X"77",X"32",X"CC",X"83",X"32",X"EA",X"83",X"21",X"A0",X"83",X"11",X"A1",X"83",X"01",X"0D",X"00", + X"77",X"ED",X"B0",X"3E",X"80",X"DF",X"3A",X"CF",X"83",X"B7",X"20",X"06",X"CD",X"45",X"08",X"C3", + X"7B",X"03",X"CD",X"35",X"08",X"3E",X"0C",X"DF",X"3E",X"0D",X"DF",X"2A",X"C5",X"83",X"2B",X"22", + X"C5",X"83",X"7C",X"B5",X"20",X"F8",X"3A",X"FE",X"83",X"3D",X"CA",X"5A",X"05",X"3A",X"FD",X"83", + X"3D",X"C2",X"06",X"05",X"21",X"C9",X"83",X"36",X"01",X"23",X"7E",X"B7",X"C2",X"47",X"05",X"FF", + X"CD",X"45",X"08",X"3E",X"01",X"32",X"FE",X"83",X"32",X"5C",X"82",X"21",X"5E",X"82",X"11",X"5F", + X"82",X"01",X"04",X"00",X"36",X"00",X"ED",X"B0",X"21",X"00",X"86",X"11",X"FF",X"80",X"01",X"B7", + X"00",X"ED",X"B0",X"21",X"C0",X"85",X"11",X"0C",X"80",X"01",X"2B",X"00",X"ED",X"B0",X"3E",X"01", + X"32",X"3F",X"80",X"C3",X"7B",X"03",X"21",X"CA",X"83",X"36",X"01",X"2B",X"7E",X"B7",X"C2",X"6A", + X"05",X"FF",X"CD",X"45",X"08",X"3E",X"01",X"32",X"FE",X"83",X"32",X"5D",X"82",X"21",X"63",X"82", + X"11",X"64",X"82",X"01",X"04",X"00",X"70",X"ED",X"B0",X"21",X"C0",X"86",X"11",X"0C",X"80",X"01", + X"2B",X"00",X"ED",X"B0",X"3E",X"01",X"32",X"3F",X"80",X"21",X"00",X"85",X"11",X"FF",X"80",X"01", + X"B7",X"00",X"ED",X"B0",X"C3",X"7B",X"03",X"AF",X"32",X"5C",X"82",X"21",X"5E",X"82",X"11",X"5F", + X"82",X"01",X"04",X"00",X"70",X"ED",X"B0",X"C3",X"7A",X"05",X"AF",X"32",X"5C",X"82",X"21",X"5E", + X"82",X"11",X"5F",X"82",X"01",X"04",X"00",X"70",X"ED",X"B0",X"AF",X"32",X"5D",X"82",X"21",X"63", + X"82",X"11",X"64",X"82",X"01",X"04",X"00",X"70",X"ED",X"B0",X"FF",X"CD",X"F9",X"07",X"CD",X"8A", + X"0B",X"CD",X"B3",X"0E",X"CD",X"42",X"0B",X"21",X"00",X"81",X"11",X"01",X"81",X"01",X"5F",X"01", + X"75",X"ED",X"B0",X"21",X"00",X"80",X"11",X"01",X"80",X"01",X"04",X"00",X"70",X"ED",X"B0",X"21", + X"0C",X"80",X"11",X"0D",X"80",X"01",X"2E",X"00",X"70",X"ED",X"B0",X"AF",X"32",X"C3",X"83",X"32", + X"FE",X"83",X"32",X"BF",X"83",X"21",X"C9",X"83",X"77",X"2C",X"77",X"67",X"6F",X"32",X"10",X"B8", + X"32",X"0C",X"B8",X"22",X"93",X"82",X"32",X"BB",X"83",X"32",X"CB",X"83",X"32",X"D8",X"83",X"32", + X"C4",X"83",X"32",X"BA",X"83",X"32",X"95",X"82",X"32",X"5B",X"82",X"3E",X"03",X"32",X"D6",X"83", + X"CD",X"FE",X"07",X"C3",X"7B",X"03",X"3E",X"01",X"32",X"6D",X"82",X"32",X"5A",X"82",X"32",X"CD", + X"83",X"AF",X"32",X"5B",X"82",X"32",X"EA",X"83",X"3E",X"FF",X"32",X"97",X"82",X"3E",X"40",X"32", + X"98",X"82",X"C9",X"3E",X"10",X"DF",X"3E",X"30",X"DF",X"3A",X"FD",X"83",X"3D",X"20",X"0C",X"21", + X"93",X"82",X"34",X"7E",X"D6",X"05",X"20",X"0D",X"77",X"18",X"0A",X"21",X"94",X"82",X"34",X"7E", + X"D6",X"05",X"20",X"01",X"77",X"CD",X"3C",X"06",X"CD",X"5E",X"06",X"CD",X"C6",X"32",X"CD",X"8B", + X"2A",X"3E",X"01",X"32",X"80",X"83",X"11",X"00",X"01",X"C3",X"03",X"09",X"CD",X"F9",X"07",X"21", + X"9A",X"83",X"AF",X"77",X"2C",X"77",X"3C",X"32",X"CC",X"83",X"3E",X"20",X"21",X"06",X"A8",X"CD", + X"8C",X"07",X"2C",X"2C",X"CD",X"8C",X"07",X"0E",X"0A",X"09",X"3D",X"20",X"F2",X"C9",X"21",X"0C", + X"80",X"11",X"0D",X"80",X"01",X"2B",X"00",X"70",X"ED",X"B0",X"21",X"0C",X"80",X"11",X"0C",X"B0", + X"01",X"2B",X"00",X"ED",X"B0",X"21",X"00",X"81",X"11",X"01",X"81",X"01",X"62",X"00",X"36",X"00", + X"ED",X"B0",X"C9",X"21",X"64",X"AB",X"CD",X"A8",X"06",X"21",X"A4",X"AA",X"CD",X"A8",X"06",X"21", + X"E4",X"A9",X"CD",X"A8",X"06",X"21",X"24",X"A9",X"CD",X"A8",X"06",X"21",X"64",X"A8",X"CD",X"A8", + X"06",X"AF",X"32",X"2F",X"84",X"C3",X"82",X"0A",X"3E",X"10",X"77",X"23",X"77",X"01",X"1F",X"00", + X"09",X"77",X"23",X"77",X"C9",X"FE",X"C0",X"CA",X"D4",X"06",X"FE",X"90",X"CA",X"DA",X"06",X"FE", + X"70",X"CA",X"E0",X"06",X"FE",X"50",X"CA",X"E6",X"06",X"FE",X"30",X"CA",X"EC",X"06",X"FE",X"10", + X"CA",X"83",X"06",X"C9",X"21",X"64",X"AB",X"C3",X"F2",X"06",X"21",X"A4",X"AA",X"C3",X"F2",X"06", + X"21",X"E4",X"A9",X"C3",X"F2",X"06",X"21",X"24",X"A9",X"C3",X"F2",X"06",X"21",X"64",X"A8",X"C3", + X"F2",X"06",X"36",X"FC",X"23",X"36",X"FD",X"01",X"1F",X"00",X"09",X"36",X"FE",X"23",X"36",X"FF", + X"C9",X"3A",X"FD",X"83",X"3D",X"20",X"32",X"21",X"0C",X"80",X"11",X"C0",X"85",X"01",X"2B",X"00", + X"ED",X"B0",X"21",X"FF",X"80",X"11",X"00",X"86",X"01",X"B7",X"00",X"ED",X"B0",X"21",X"C0",X"86", + X"11",X"0C",X"80",X"01",X"2B",X"00",X"ED",X"B0",X"3E",X"01",X"32",X"3F",X"80",X"21",X"00",X"85", + X"11",X"FF",X"80",X"01",X"B7",X"00",X"ED",X"B0",X"C9",X"21",X"FF",X"80",X"11",X"00",X"85",X"01", + X"B7",X"00",X"ED",X"B0",X"21",X"0C",X"80",X"11",X"C0",X"86",X"01",X"2B",X"00",X"ED",X"B0",X"21", + X"00",X"86",X"11",X"FF",X"80",X"01",X"B7",X"00",X"ED",X"B0",X"21",X"C0",X"85",X"11",X"0C",X"80", + X"01",X"2B",X"00",X"ED",X"B0",X"3E",X"01",X"32",X"3F",X"80",X"3A",X"95",X"82",X"A7",X"C0",X"AF", + X"32",X"5B",X"82",X"3E",X"01",X"32",X"95",X"82",X"C9",X"21",X"02",X"A8",X"11",X"10",X"20",X"0E", + X"04",X"06",X"1C",X"73",X"23",X"10",X"FC",X"09",X"15",X"20",X"F6",X"C9",X"01",X"10",X"0A",X"71", + X"23",X"10",X"FC",X"C9",X"21",X"08",X"A8",X"11",X"10",X"20",X"0E",X"0A",X"06",X"16",X"73",X"23", + X"10",X"FC",X"09",X"15",X"20",X"F6",X"C9",X"32",X"00",X"D0",X"3A",X"D9",X"83",X"E6",X"F7",X"32", + X"02",X"D0",X"00",X"00",X"00",X"00",X"3A",X"D9",X"83",X"F6",X"08",X"32",X"02",X"D0",X"C9",X"21", + X"00",X"83",X"7E",X"B7",X"C8",X"35",X"4F",X"2C",X"7E",X"CD",X"A7",X"07",X"54",X"5D",X"2C",X"06", + X"00",X"ED",X"B0",X"C9",X"3A",X"FD",X"83",X"3D",X"CA",X"E1",X"07",X"3E",X"01",X"32",X"5B",X"82", + X"C9",X"3A",X"6D",X"82",X"A7",X"C8",X"3E",X"01",X"32",X"5B",X"82",X"C9",X"21",X"00",X"83",X"11", + X"01",X"83",X"01",X"2F",X"00",X"70",X"ED",X"B0",X"C9",X"3A",X"FE",X"83",X"3D",X"C8",X"AF",X"21", + X"44",X"80",X"11",X"45",X"80",X"01",X"1F",X"00",X"70",X"ED",X"B0",X"21",X"20",X"84",X"11",X"21", + X"84",X"0E",X"0B",X"77",X"ED",X"B0",X"C9",X"21",X"44",X"80",X"AF",X"36",X"01",X"2C",X"77",X"2C", + X"2C",X"77",X"3A",X"FE",X"83",X"FE",X"02",X"C0",X"21",X"40",X"00",X"22",X"D2",X"83",X"21",X"40", + X"00",X"22",X"DA",X"83",X"C9",X"21",X"50",X"A8",X"CD",X"6B",X"2A",X"21",X"70",X"AA",X"11",X"D6", + X"0F",X"06",X"09",X"EF",X"C9",X"AF",X"32",X"71",X"83",X"3A",X"FE",X"83",X"3D",X"C8",X"3A",X"FD", + X"83",X"EE",X"03",X"32",X"FD",X"83",X"21",X"B8",X"83",X"3D",X"28",X"01",X"2C",X"7E",X"32",X"B7", + X"83",X"AF",X"32",X"B6",X"83",X"3C",X"32",X"5A",X"82",X"3A",X"C2",X"83",X"B7",X"C8",X"3A",X"CB", + X"83",X"EE",X"01",X"32",X"CB",X"83",X"67",X"32",X"10",X"B8",X"32",X"0C",X"B8",X"C9",X"21",X"51", + X"AA",X"11",X"04",X"10",X"06",X"04",X"EF",X"11",X"DA",X"0F",X"06",X"05",X"EF",X"3E",X"01",X"32", + X"04",X"80",X"C9",X"3A",X"CD",X"83",X"B7",X"C0",X"3A",X"04",X"80",X"B7",X"C0",X"3A",X"AE",X"83", + X"B7",X"20",X"07",X"3C",X"32",X"AE",X"83",X"3E",X"06",X"DF",X"CD",X"DD",X"0A",X"3A",X"DF",X"83", + X"B7",X"20",X"35",X"21",X"DC",X"83",X"35",X"C0",X"36",X"20",X"23",X"7E",X"B7",X"CA",X"7E",X"08", + X"3D",X"77",X"2C",X"7E",X"3D",X"27",X"77",X"2D",X"FE",X"10",X"20",X"07",X"3E",X"05",X"DF",X"AF", + X"32",X"3F",X"80",X"66",X"7C",X"E6",X"03",X"4F",X"AC",X"07",X"07",X"6F",X"26",X"00",X"29",X"11", + X"DF",X"A8",X"19",X"3E",X"10",X"91",X"77",X"C9",X"3A",X"E0",X"83",X"B7",X"C0",X"3C",X"32",X"E0", + X"83",X"21",X"51",X"AA",X"11",X"04",X"10",X"06",X"05",X"EF",X"3A",X"DE",X"83",X"5F",X"16",X"00", + X"CD",X"C3",X"0B",X"3A",X"FE",X"83",X"B7",X"C8",X"3A",X"FD",X"83",X"3D",X"28",X"05",X"21",X"EB", + X"83",X"18",X"03",X"21",X"ED",X"83",X"7B",X"86",X"27",X"77",X"5F",X"23",X"7A",X"8E",X"27",X"77", + X"57",X"3A",X"FD",X"83",X"3D",X"20",X"09",X"01",X"E7",X"83",X"0A",X"B7",X"20",X"2B",X"18",X"07", + X"01",X"E8",X"83",X"0A",X"B7",X"20",X"22",X"2A",X"DE",X"0E",X"ED",X"52",X"28",X"02",X"30",X"19", + X"32",X"CF",X"83",X"3C",X"02",X"0D",X"0D",X"0A",X"3C",X"02",X"21",X"DE",X"AB",X"01",X"E0",X"FF", + X"09",X"3D",X"20",X"FC",X"36",X"4D",X"3E",X"07",X"DF",X"2A",X"EF",X"83",X"B7",X"ED",X"52",X"D0", + X"ED",X"53",X"EF",X"83",X"C9",X"AF",X"32",X"CE",X"83",X"3A",X"CD",X"83",X"B7",X"20",X"04",X"AF", + X"32",X"CF",X"83",X"3A",X"FE",X"83",X"B7",X"28",X"74",X"3A",X"FD",X"83",X"3D",X"20",X"05",X"21", + X"E5",X"83",X"18",X"03",X"21",X"E6",X"83",X"3A",X"CD",X"83",X"B7",X"20",X"08",X"35",X"20",X"05", + X"3E",X"01",X"32",X"CF",X"83",X"CD",X"DB",X"29",X"3A",X"CD",X"83",X"B7",X"20",X"0A",X"3C",X"32", + X"B5",X"83",X"21",X"50",X"A8",X"CD",X"6B",X"2A",X"3A",X"6C",X"82",X"EE",X"01",X"32",X"B5",X"83", + X"3A",X"FD",X"83",X"3D",X"C2",X"F5",X"09",X"21",X"5E",X"82",X"CD",X"FE",X"09",X"3A",X"5A",X"82", + X"A7",X"28",X"0A",X"CD",X"C6",X"32",X"CD",X"23",X"20",X"AF",X"32",X"5A",X"82",X"21",X"44",X"80", + X"36",X"80",X"2C",X"36",X"1E",X"2C",X"36",X"03",X"2C",X"36",X"E0",X"AF",X"32",X"CD",X"83",X"32", + X"2D",X"84",X"32",X"2C",X"84",X"32",X"69",X"82",X"3C",X"32",X"C3",X"83",X"C9",X"3A",X"CD",X"83", + X"B7",X"C8",X"C3",X"CD",X"09",X"21",X"63",X"82",X"CD",X"FE",X"09",X"C3",X"BD",X"09",X"AF",X"B6", + X"11",X"64",X"AB",X"C4",X"28",X"0A",X"23",X"AF",X"B6",X"11",X"A4",X"AA",X"C4",X"28",X"0A",X"23", + X"AF",X"B6",X"11",X"E4",X"A9",X"C4",X"28",X"0A",X"23",X"AF",X"B6",X"11",X"24",X"A9",X"C4",X"28", + X"0A",X"23",X"AF",X"B6",X"11",X"64",X"A8",X"C8",X"EB",X"36",X"6C",X"23",X"36",X"6D",X"01",X"1F", + X"00",X"09",X"36",X"6E",X"23",X"36",X"6F",X"EB",X"C9",X"3A",X"E4",X"83",X"3C",X"C8",X"3A",X"FE", + X"83",X"B7",X"20",X"05",X"21",X"E4",X"83",X"18",X"0E",X"3A",X"FD",X"83",X"3D",X"20",X"05",X"21", + X"E5",X"83",X"18",X"03",X"21",X"E6",X"83",X"46",X"78",X"B7",X"3E",X"4D",X"11",X"E0",X"FF",X"21", + X"BE",X"AB",X"28",X"04",X"77",X"19",X"10",X"FC",X"36",X"10",X"C9",X"3A",X"B7",X"83",X"21",X"7E", + X"A8",X"11",X"20",X"00",X"FE",X"0F",X"38",X"02",X"3E",X"0F",X"47",X"0E",X"4C",X"71",X"19",X"10", + X"FC",X"C9",X"AF",X"32",X"CC",X"83",X"21",X"B8",X"83",X"3A",X"FD",X"83",X"3D",X"28",X"01",X"2C", + X"34",X"7E",X"32",X"B7",X"83",X"FE",X"10",X"D0",X"26",X"00",X"11",X"5E",X"A8",X"87",X"87",X"87", + X"87",X"6F",X"29",X"19",X"36",X"4C",X"C9",X"06",X"05",X"21",X"F2",X"83",X"7A",X"BE",X"38",X"27", + X"28",X"19",X"78",X"3D",X"28",X"0F",X"87",X"4F",X"06",X"00",X"D5",X"11",X"FA",X"83",X"21",X"F8", + X"83",X"ED",X"B8",X"EB",X"D1",X"72",X"2D",X"73",X"87",X"3C",X"C9",X"2D",X"7E",X"2C",X"BB",X"38", + X"E1",X"20",X"04",X"78",X"3D",X"28",X"F1",X"2C",X"2C",X"10",X"D1",X"AF",X"C9",X"3A",X"2D",X"84", + X"B7",X"C0",X"3C",X"32",X"2D",X"84",X"3E",X"03",X"32",X"3F",X"80",X"AF",X"32",X"E0",X"83",X"21", + X"BF",X"A8",X"11",X"04",X"10",X"06",X"04",X"EF",X"21",X"DF",X"A8",X"11",X"20",X"00",X"01",X"0C", + X"0F",X"71",X"19",X"10",X"FC",X"21",X"20",X"3C",X"22",X"DC",X"83",X"3E",X"60",X"32",X"DE",X"83", + X"C9",X"E5",X"D5",X"21",X"00",X"84",X"35",X"20",X"02",X"36",X"1F",X"54",X"5E",X"7B",X"C6",X"0D", + X"FE",X"20",X"38",X"02",X"D6",X"1F",X"6F",X"1A",X"AE",X"77",X"D1",X"E1",X"C9",X"21",X"00",X"00", + X"22",X"ED",X"83",X"22",X"EB",X"83",X"22",X"E7",X"83",X"3A",X"E4",X"83",X"67",X"6F",X"22",X"E5", + X"83",X"C9",X"11",X"AA",X"0F",X"21",X"60",X"AA",X"06",X"08",X"EF",X"21",X"41",X"AA",X"ED",X"5B", + X"EF",X"83",X"CD",X"B8",X"0B",X"3E",X"01",X"21",X"20",X"AB",X"CD",X"CC",X"0B",X"11",X"A7",X"0F", + X"06",X"03",X"EF",X"21",X"41",X"AB",X"ED",X"5B",X"ED",X"83",X"CD",X"B8",X"0B",X"3A",X"70",X"83", + X"3D",X"C8",X"3E",X"02",X"21",X"00",X"A9",X"CD",X"CC",X"0B",X"11",X"A7",X"0F",X"06",X"03",X"EF", + X"21",X"21",X"A9",X"ED",X"5B",X"EB",X"83",X"C3",X"B8",X"0B",X"3A",X"B4",X"83",X"B7",X"20",X"11", + X"3C",X"32",X"B4",X"83",X"21",X"1F",X"A8",X"11",X"20",X"00",X"01",X"10",X"20",X"71",X"19",X"10", + X"FC",X"11",X"FE",X"0F",X"21",X"7F",X"A9",X"06",X"06",X"EF",X"3E",X"01",X"32",X"3F",X"80",X"21", + X"9F",X"A8",X"3A",X"E1",X"83",X"C3",X"C3",X"0B",X"CD",X"BE",X"0B",X"AF",X"18",X"0E",X"7A",X"CD", + X"C3",X"0B",X"7B",X"4F",X"0F",X"0F",X"0F",X"0F",X"CD",X"CC",X"0B",X"79",X"E6",X"0F",X"77",X"7D", + X"D6",X"20",X"6F",X"D0",X"25",X"C9",X"21",X"D8",X"83",X"35",X"2D",X"AF",X"77",X"32",X"B3",X"83", + X"CD",X"79",X"07",X"3E",X"03",X"32",X"19",X"80",X"21",X"1F",X"80",X"06",X"05",X"AF",X"77",X"2C", + X"2C",X"2C",X"2C",X"10",X"F9",X"CD",X"60",X"0C",X"21",X"AC",X"AA",X"11",X"AD",X"0F",X"06",X"0D", + X"EF",X"3E",X"01",X"26",X"AA",X"ED",X"47",X"87",X"C6",X"CD",X"6F",X"ED",X"57",X"CD",X"CC",X"0B", + X"ED",X"57",X"08",X"06",X"03",X"EF",X"D9",X"21",X"EF",X"83",X"08",X"47",X"2C",X"2C",X"10",X"FC", + X"5E",X"2C",X"56",X"26",X"A9",X"87",X"C6",X"ED",X"6F",X"CD",X"B8",X"0B",X"11",X"4B",X"10",X"06", + X"04",X"EF",X"ED",X"57",X"D9",X"3C",X"FE",X"06",X"20",X"C9",X"11",X"DF",X"0F",X"21",X"3C",X"AB", + X"06",X"13",X"AF",X"32",X"39",X"80",X"EF",X"C9",X"7A",X"CD",X"4D",X"0C",X"7B",X"4F",X"E6",X"0F", + X"CD",X"58",X"0C",X"79",X"0F",X"0F",X"0F",X"0F",X"77",X"7D",X"D6",X"20",X"6F",X"D0",X"25",X"C9", + X"26",X"80",X"ED",X"4B",X"FB",X"83",X"11",X"04",X"30",X"CD",X"6D",X"0C",X"48",X"7A",X"91",X"BA", + X"C8",X"6F",X"73",X"C9",X"3A",X"D8",X"83",X"B7",X"C0",X"3A",X"D6",X"83",X"FE",X"03",X"CA",X"D6", + X"0B",X"3A",X"E1",X"83",X"B7",X"C2",X"A6",X"0C",X"3A",X"D6",X"83",X"FE",X"04",X"CA",X"00",X"18", + X"FE",X"02",X"CA",X"9B",X"3E",X"FE",X"05",X"C0",X"21",X"D8",X"83",X"36",X"30",X"2D",X"AF",X"77", + X"32",X"15",X"80",X"C3",X"3A",X"0C",X"CD",X"F9",X"07",X"3A",X"BA",X"83",X"B7",X"C0",X"67",X"6F", + X"22",X"93",X"82",X"22",X"B3",X"81",X"32",X"5B",X"82",X"32",X"9A",X"82",X"3C",X"32",X"BA",X"83", + X"CD",X"C6",X"32",X"CD",X"17",X"08",X"CD",X"79",X"07",X"CD",X"5E",X"06",X"3E",X"04",X"32",X"1B", + X"80",X"3E",X"06",X"32",X"29",X"80",X"21",X"28",X"AA",X"11",X"0D",X"10",X"06",X"04",X"EF",X"21", + X"AD",X"AA",X"13",X"06",X"0C",X"EF",X"CD",X"13",X"0D",X"21",X"74",X"AB",X"11",X"1E",X"10",X"06", + X"03",X"EF",X"11",X"39",X"10",X"06",X"06",X"EF",X"11",X"3F",X"10",X"06",X"05",X"EF",X"13",X"06", + X"07",X"EF",X"21",X"94",X"A9",X"ED",X"5B",X"DE",X"0E",X"CD",X"B8",X"0B",X"11",X"4B",X"10",X"06", + X"04",X"EF",X"C9",X"3A",X"E1",X"83",X"11",X"1E",X"10",X"3D",X"28",X"11",X"3E",X"03",X"32",X"23", + X"80",X"21",X"11",X"AB",X"06",X"04",X"EF",X"06",X"0D",X"EF",X"36",X"23",X"C9",X"21",X"F1",X"AA", + X"06",X"04",X"EF",X"11",X"29",X"10",X"06",X"0B",X"EF",X"C9",X"3E",X"03",X"32",X"0D",X"80",X"32", + X"0F",X"80",X"3A",X"BC",X"83",X"3D",X"32",X"BC",X"83",X"C0",X"3E",X"20",X"32",X"BC",X"83",X"3A", + X"D7",X"83",X"87",X"16",X"00",X"5F",X"21",X"59",X"0D",X"19",X"E9",X"18",X"46",X"18",X"3A",X"18", + X"2E",X"18",X"22",X"18",X"16",X"18",X"0A",X"21",X"06",X"AB",X"11",X"40",X"80",X"3E",X"D4",X"18", + X"3A",X"21",X"A6",X"AA",X"11",X"44",X"80",X"3E",X"D8",X"18",X"30",X"21",X"46",X"AA",X"11",X"48", + X"80",X"3E",X"DC",X"18",X"26",X"21",X"E6",X"A9",X"11",X"4C",X"80",X"3E",X"F4",X"18",X"1C",X"21", + X"86",X"A9",X"11",X"50",X"80",X"3E",X"F4",X"18",X"12",X"21",X"26",X"A9",X"11",X"54",X"80",X"3E", + X"F8",X"18",X"08",X"21",X"C6",X"A8",X"11",X"58",X"80",X"3E",X"D8",X"01",X"1F",X"00",X"77",X"3C", + X"2C",X"77",X"3C",X"09",X"77",X"3C",X"2C",X"77",X"EB",X"01",X"00",X"04",X"71",X"2C",X"10",X"FC", + X"21",X"D7",X"83",X"35",X"C0",X"36",X"07",X"AF",X"32",X"BF",X"83",X"32",X"BB",X"83",X"3E",X"05", + X"32",X"D6",X"83",X"C9",X"3A",X"E1",X"83",X"B7",X"20",X"F4",X"21",X"BF",X"83",X"7E",X"B7",X"20", + X"2D",X"CD",X"79",X"07",X"CD",X"5E",X"06",X"21",X"40",X"80",X"01",X"03",X"07",X"11",X"00",X"81", + X"73",X"2C",X"2C",X"71",X"2C",X"72",X"2C",X"10",X"F7",X"21",X"04",X"05",X"22",X"BD",X"83",X"21", + X"D7",X"83",X"36",X"07",X"21",X"BC",X"83",X"36",X"20",X"21",X"BF",X"83",X"34",X"C9",X"3D",X"20", + X"5F",X"3A",X"D7",X"83",X"87",X"16",X"00",X"5F",X"21",X"1B",X"0E",X"19",X"E9",X"18",X"34",X"18", + X"2B",X"18",X"22",X"18",X"19",X"18",X"10",X"18",X"07",X"21",X"40",X"80",X"06",X"31",X"18",X"28", + X"21",X"44",X"80",X"06",X"49",X"18",X"21",X"21",X"48",X"80",X"06",X"61",X"18",X"1A",X"21",X"4C", + X"80",X"06",X"79",X"18",X"13",X"21",X"50",X"80",X"06",X"91",X"18",X"0C",X"21",X"54",X"80",X"06", + X"A9",X"18",X"05",X"21",X"58",X"80",X"06",X"C1",X"CD",X"98",X"0E",X"4F",X"35",X"35",X"35",X"35", + X"7E",X"2C",X"71",X"B8",X"D0",X"36",X"1E",X"21",X"D7",X"83",X"35",X"C0",X"36",X"14",X"18",X"99", + X"3D",X"C2",X"3A",X"0D",X"CD",X"98",X"0E",X"D6",X"03",X"4F",X"3A",X"D7",X"83",X"B7",X"CA",X"FF", + X"0D",X"06",X"07",X"11",X"06",X"00",X"21",X"43",X"80",X"35",X"35",X"35",X"35",X"2D",X"2D",X"71", + X"19",X"10",X"F6",X"3D",X"32",X"D7",X"83",X"C9",X"E5",X"21",X"BD",X"83",X"35",X"20",X"11",X"36", + X"08",X"2C",X"35",X"20",X"02",X"36",X"04",X"7E",X"21",X"F1",X"0E",X"85",X"6F",X"7E",X"E1",X"C9", + X"F1",X"F1",X"C9",X"ED",X"5B",X"ED",X"83",X"2A",X"EB",X"83",X"44",X"4D",X"B7",X"ED",X"52",X"38", + X"05",X"D5",X"C5",X"D1",X"18",X"01",X"C5",X"CD",X"A7",X"0A",X"D1",X"F5",X"CD",X"A7",X"0A",X"67", + X"F1",X"6F",X"22",X"FB",X"83",X"C9",X"03",X"05",X"07",X"FF",X"00",X"02",X"04",X"06",X"00",X"20", + X"00",X"00",X"58",X"01",X"63",X"04",X"63",X"04",X"05",X"02",X"97",X"01",X"58",X"01",X"27",X"01", + X"05",X"00",X"1F",X"20",X"21",X"20",X"25",X"26",X"27",X"26",X"2C",X"2D",X"2E",X"2D",X"2F",X"30", + X"31",X"30",X"2C",X"2E",X"30",X"2E",X"2D",X"2F",X"31",X"2F",X"25",X"26",X"27",X"2C",X"2D",X"2E", + X"2F",X"30",X"31",X"2C",X"2E",X"30",X"2D",X"2F",X"31",X"04",X"04",X"04",X"08",X"08",X"08",X"08", + X"08",X"08",X"10",X"10",X"10",X"02",X"03",X"03",X"05",X"05",X"06",X"08",X"09",X"54",X"58",X"5A", + X"5E",X"56",X"5C",X"03",X"03",X"06",X"08",X"10",X"18",X"30",X"50",X"60",X"80",X"C0",X"E0",X"05", + X"02",X"02",X"02",X"08",X"08",X"05",X"08",X"02",X"08",X"08",X"08",X"0E",X"08",X"08",X"0E",X"08", + X"0E",X"08",X"0E",X"08",X"0E",X"08",X"05",X"05",X"08",X"05",X"02",X"0B",X"05",X"08",X"FF",X"C0", + X"02",X"00",X"03",X"00",X"03",X"80",X"01",X"80",X"02",X"80",X"02",X"00",X"02",X"00",X"02",X"80", + X"03",X"E0",X"02",X"20",X"02",X"20",X"02",X"20",X"02",X"00",X"03",X"80",X"02",X"C0",X"02",X"C0", + X"02",X"80",X"03",X"20",X"02",X"20",X"02",X"10",X"3B",X"8C",X"D9",X"AF",X"7F",X"3C",X"30",X"70", + X"A9",X"47",X"E7",X"A7",X"FF",X"BC",X"36",X"10",X"F9",X"40",X"D2",X"D7",X"C4",X"37",X"A6",X"9B", + X"A1",X"00",X"C7",X"AC",X"8D",X"C5",X"06",X"2B",X"25",X"20",X"18",X"19",X"2B",X"23",X"13",X"1F", + X"22",X"15",X"10",X"22",X"11",X"1E",X"1B",X"19",X"1E",X"17",X"10",X"23",X"24",X"10",X"1E",X"14", + X"10",X"22",X"14",X"10",X"24",X"18",X"10",X"24",X"18",X"2B",X"20",X"1F",X"19",X"1E",X"24",X"10", + X"24",X"11",X"12",X"1C",X"15",X"2B",X"17",X"11",X"1D",X"15",X"10",X"1F",X"26",X"15",X"22",X"10", + X"10",X"10",X"23",X"15",X"17",X"11",X"10",X"10",X"4E",X"10",X"10",X"01",X"09",X"08",X"01",X"10", + X"10",X"10",X"19",X"1E",X"23",X"15",X"22",X"24",X"10",X"13",X"1F",X"19",X"1E",X"23",X"13",X"22", + X"15",X"14",X"19",X"24",X"24",X"19",X"1D",X"15",X"10",X"10",X"20",X"15",X"22",X"20",X"25",X"23", + X"18",X"10",X"23",X"24",X"11",X"22",X"24",X"10",X"12",X"25",X"24",X"24",X"1F",X"1E",X"1F",X"1E", + X"15",X"10",X"1F",X"22",X"10",X"24",X"27",X"1F",X"10",X"20",X"1C",X"11",X"29",X"15",X"22",X"10", + X"1F",X"1E",X"1C",X"29",X"12",X"1F",X"1E",X"25",X"23",X"10",X"15",X"28",X"24",X"22",X"11",X"10", + X"16",X"22",X"1F",X"17",X"23",X"10",X"11",X"16",X"24",X"15",X"22",X"10",X"20",X"24",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"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3A",X"86",X"83",X"A7",X"C2",X"B0",X"19",X"21",X"D8",X"83",X"7E",X"B7",X"C0",X"36",X"80",X"2D", + X"7E",X"34",X"21",X"1F",X"18",X"07",X"4F",X"06",X"00",X"09",X"46",X"23",X"66",X"68",X"E9",X"3B", + X"18",X"68",X"18",X"7A",X"18",X"97",X"18",X"B4",X"18",X"D7",X"18",X"DD",X"18",X"21",X"19",X"38", + X"19",X"49",X"19",X"5A",X"19",X"77",X"19",X"88",X"19",X"A5",X"19",X"3E",X"06",X"32",X"17",X"80", + X"32",X"19",X"80",X"32",X"1B",X"80",X"32",X"1D",X"80",X"3E",X"03",X"32",X"21",X"80",X"32",X"23", + X"80",X"32",X"25",X"80",X"32",X"27",X"80",X"3E",X"01",X"32",X"2B",X"80",X"32",X"2D",X"80",X"32", + X"31",X"80",X"32",X"2F",X"80",X"C3",X"15",X"19",X"11",X"B5",X"19",X"06",X"18",X"21",X"88",X"AB", + X"EF",X"06",X"1B",X"21",X"89",X"AB",X"EF",X"C3",X"15",X"19",X"11",X"E8",X"19",X"06",X"14",X"21", + X"8B",X"AB",X"EF",X"06",X"1A",X"21",X"8C",X"AB",X"EF",X"06",X"15",X"21",X"8D",X"AB",X"EF",X"06", + X"1A",X"21",X"8E",X"AB",X"EF",X"18",X"7E",X"11",X"45",X"1A",X"06",X"16",X"21",X"90",X"AB",X"EF", + X"06",X"15",X"21",X"91",X"AB",X"EF",X"06",X"14",X"21",X"92",X"AB",X"EF",X"06",X"0A",X"21",X"93", + X"AB",X"EF",X"18",X"61",X"11",X"8E",X"1A",X"06",X"15",X"21",X"95",X"AB",X"EF",X"06",X"19",X"21", + X"96",X"AB",X"EF",X"06",X"14",X"21",X"97",X"AB",X"EF",X"06",X"0E",X"21",X"98",X"AB",X"EF",X"3E", + X"A0",X"32",X"86",X"83",X"C3",X"1B",X"19",X"21",X"D8",X"83",X"36",X"C0",X"C9",X"CD",X"79",X"07", + X"3E",X"06",X"32",X"0F",X"80",X"32",X"15",X"80",X"32",X"1B",X"80",X"32",X"25",X"80",X"32",X"2B", + X"80",X"32",X"33",X"80",X"3E",X"03",X"32",X"0D",X"80",X"32",X"13",X"80",X"32",X"19",X"80",X"32", + X"21",X"80",X"32",X"23",X"80",X"32",X"29",X"80",X"32",X"2F",X"80",X"32",X"31",X"80",X"AF",X"32", + X"0B",X"80",X"32",X"1F",X"80",X"21",X"D8",X"83",X"36",X"80",X"C9",X"21",X"D8",X"83",X"36",X"F0", + X"C9",X"11",X"DE",X"1A",X"06",X"12",X"21",X"85",X"AB",X"EF",X"06",X"13",X"21",X"86",X"AB",X"EF", + X"06",X"0B",X"21",X"87",X"AB",X"EF",X"18",X"DD",X"11",X"0E",X"1B",X"06",X"15",X"21",X"89",X"AB", + X"EF",X"06",X"0B",X"21",X"8A",X"AB",X"EF",X"18",X"CC",X"11",X"2E",X"1B",X"06",X"1A",X"21",X"8C", + X"AB",X"EF",X"06",X"1A",X"21",X"8D",X"AB",X"EF",X"18",X"BB",X"11",X"62",X"1B",X"06",X"18",X"21", + X"8F",X"AB",X"EF",X"06",X"12",X"21",X"90",X"AB",X"EF",X"06",X"0C",X"21",X"91",X"AB",X"EF",X"06", + X"0C",X"21",X"92",X"AB",X"EF",X"18",X"9E",X"11",X"A4",X"1B",X"06",X"13",X"21",X"94",X"AB",X"EF", + X"06",X"0C",X"21",X"95",X"AB",X"EF",X"18",X"8D",X"11",X"C3",X"1B",X"06",X"13",X"21",X"97",X"AB", + X"EF",X"06",X"14",X"21",X"98",X"AB",X"EF",X"06",X"0D",X"21",X"99",X"AB",X"EF",X"3E",X"A0",X"32", + X"86",X"83",X"C3",X"1B",X"19",X"3E",X"03",X"32",X"D6",X"83",X"21",X"D8",X"83",X"36",X"C0",X"C9", + X"21",X"86",X"83",X"35",X"C9",X"1D",X"1F",X"26",X"15",X"10",X"16",X"22",X"1F",X"17",X"10",X"26", + X"15",X"22",X"24",X"19",X"13",X"11",X"1C",X"1C",X"29",X"10",X"1F",X"22",X"10",X"18",X"1F",X"22", + X"19",X"2A",X"1F",X"1E",X"24",X"11",X"1C",X"1C",X"29",X"10",X"25",X"23",X"19",X"1E",X"17",X"10", + X"1A",X"1F",X"29",X"23",X"24",X"19",X"13",X"1B",X"1F",X"12",X"1A",X"15",X"13",X"24",X"10",X"19", + X"23",X"10",X"24",X"1F",X"10",X"23",X"11",X"16",X"15",X"1C",X"29",X"10",X"1D",X"11",X"1E",X"15", + X"25",X"26",X"15",X"22",X"10",X"16",X"22",X"1F",X"17",X"10",X"24",X"1F",X"10",X"19",X"24",X"23", + X"10",X"18",X"1F",X"1D",X"15",X"10",X"27",X"19",X"24",X"18",X"19",X"1E",X"10",X"11",X"1C",X"1C", + X"1F",X"24",X"24",X"15",X"14",X"10",X"24",X"19",X"1D",X"15",X"10",X"2B",X"23",X"19",X"28",X"24", + X"29",X"10",X"12",X"15",X"11",X"24",X"23",X"10",X"1F",X"1E",X"10",X"24",X"18",X"15",X"10",X"24", + X"19",X"1D",X"15",X"22",X"2B",X"13",X"22",X"1F",X"23",X"23",X"10",X"18",X"19",X"17",X"18",X"27", + X"11",X"29",X"10",X"27",X"19",X"24",X"18",X"1F",X"25",X"24",X"10",X"17",X"15",X"24",X"24",X"19", + X"1E",X"17",X"10",X"22",X"25",X"1E",X"10",X"1F",X"26",X"15",X"22",X"10",X"11",X"1E",X"14",X"10", + X"13",X"22",X"1F",X"23",X"23",X"10",X"22",X"19",X"26",X"15",X"22",X"10",X"27",X"19",X"24",X"18", + X"1F",X"25",X"24",X"10",X"16",X"11",X"1C",X"1C",X"19",X"1E",X"17",X"10",X"19",X"1E",X"11",X"26", + X"1F",X"19",X"14",X"10",X"24",X"22",X"11",X"16",X"16",X"19",X"13",X"10",X"14",X"15",X"11",X"14", + X"1C",X"29",X"10",X"23",X"1E",X"11",X"1B",X"15",X"23",X"10",X"1F",X"24",X"24",X"15",X"22",X"23", + X"10",X"13",X"22",X"1F",X"13",X"1F",X"14",X"19",X"1C",X"15",X"23",X"10",X"11",X"1E",X"14",X"10", + X"24",X"18",X"15",X"10",X"24",X"22",X"15",X"11",X"13",X"18",X"15",X"22",X"1F",X"25",X"23",X"10", + X"14",X"19",X"26",X"19",X"1E",X"17",X"10",X"24",X"25",X"22",X"24",X"1C",X"15",X"23",X"20",X"1F", + X"19",X"1E",X"24",X"23",X"10",X"11",X"22",X"15",X"10",X"23",X"13",X"1F",X"22",X"15",X"14",X"10", + X"16",X"1F",X"22",X"10",X"15",X"11",X"13",X"18",X"10",X"23",X"11",X"16",X"15",X"10",X"1A",X"25", + X"1D",X"20",X"10",X"2B",X"01",X"00",X"10",X"20",X"1F",X"19",X"1E",X"24",X"23",X"2B",X"23",X"11", + X"16",X"15",X"1C",X"29",X"10",X"11",X"22",X"22",X"19",X"26",X"19",X"1E",X"17",X"10",X"18",X"1F", + X"1D",X"15",X"10",X"2B",X"05",X"00",X"10",X"20",X"1F",X"19",X"1E",X"24",X"23",X"2B",X"11",X"1E", + X"14",X"10",X"16",X"1F",X"22",X"10",X"12",X"15",X"11",X"24",X"19",X"1E",X"17",X"10",X"24",X"18", + X"15",X"10",X"24",X"19",X"1D",X"15",X"22",X"10",X"2B",X"01",X"00",X"10",X"20",X"1F",X"19",X"1E", + X"24",X"23",X"10",X"20",X"15",X"22",X"10",X"12",X"15",X"11",X"24",X"10",X"23",X"11",X"26",X"15", + X"14",X"2B",X"12",X"1F",X"1E",X"25",X"23",X"10",X"20",X"1F",X"19",X"1E",X"24",X"23",X"10",X"11", + X"22",X"15",X"10",X"23",X"13",X"1F",X"22",X"15",X"14",X"10",X"12",X"29",X"10",X"15",X"23",X"13", + X"1F",X"22",X"24",X"19",X"1E",X"17",X"10",X"18",X"1F",X"1D",X"15",X"10",X"11",X"10",X"1C",X"11", + X"14",X"29",X"10",X"16",X"22",X"1F",X"17",X"10",X"2B",X"02",X"00",X"00",X"10",X"20",X"1F",X"19", + X"1E",X"24",X"23",X"2B",X"17",X"1F",X"12",X"12",X"1C",X"19",X"1E",X"17",X"10",X"11",X"1E",X"10", + X"19",X"1E",X"23",X"15",X"13",X"24",X"10",X"2B",X"02",X"00",X"00",X"10",X"20",X"1F",X"19",X"1E", + X"24",X"23",X"2B",X"11",X"1E",X"14",X"10",X"23",X"11",X"16",X"15",X"1C",X"29",X"10",X"17",X"15", + X"24",X"24",X"19",X"1E",X"17",X"10",X"11",X"1C",X"1C",X"10",X"16",X"19",X"26",X"15",X"10",X"16", + X"22",X"1F",X"17",X"23",X"10",X"18",X"1F",X"1D",X"15",X"10",X"2B",X"01",X"00",X"00",X"00",X"10", + X"20",X"1F",X"19",X"1E",X"24",X"23",X"2B",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3A",X"B7",X"83",X"FE",X"03",X"38",X"2A",X"3A",X"FD",X"83",X"3D",X"20",X"06",X"DD",X"21",X"40", + X"84",X"18",X"04",X"DD",X"21",X"60",X"84",X"FD",X"21",X"48",X"80",X"CD",X"49",X"1C",X"3A",X"B7", + X"83",X"FE",X"06",X"38",X"07",X"11",X"10",X"00",X"DD",X"19",X"FD",X"21",X"50",X"80",X"CD",X"49", + X"1C",X"3A",X"FD",X"83",X"3D",X"20",X"06",X"DD",X"21",X"80",X"84",X"18",X"04",X"DD",X"21",X"90", + X"84",X"FD",X"21",X"58",X"80",X"CD",X"13",X"1E",X"C9",X"CD",X"FA",X"1C",X"CD",X"59",X"1C",X"CD", + X"89",X"1C",X"CD",X"83",X"1D",X"CD",X"E8",X"1D",X"C9",X"DD",X"35",X"08",X"C0",X"DD",X"36",X"08", + X"0C",X"DD",X"7E",X"06",X"B7",X"C8",X"3D",X"20",X"02",X"3E",X"04",X"DD",X"77",X"06",X"6F",X"26", + X"00",X"11",X"65",X"1F",X"19",X"7E",X"DD",X"B6",X"05",X"FD",X"77",X"01",X"3C",X"FD",X"77",X"05", + X"FD",X"36",X"02",X"04",X"FD",X"36",X"06",X"04",X"C9",X"DD",X"7E",X"06",X"B7",X"C8",X"3A",X"2C", + X"84",X"B7",X"C0",X"DD",X"35",X"09",X"C0",X"DD",X"36",X"09",X"08",X"FD",X"7E",X"03",X"FE",X"60", + X"30",X"2A",X"DD",X"36",X"07",X"01",X"DD",X"7E",X"05",X"B7",X"C2",X"BD",X"1C",X"3A",X"14",X"80", + X"DD",X"96",X"00",X"D8",X"FD",X"BE",X"00",X"30",X"2A",X"DD",X"34",X"02",X"C9",X"3A",X"14",X"80", + X"DD",X"96",X"01",X"FD",X"BE",X"00",X"38",X"1B",X"DD",X"35",X"02",X"C9",X"DD",X"36",X"07",X"01", + X"DD",X"7E",X"05",X"B7",X"28",X"04",X"3E",X"02",X"18",X"02",X"3E",X"FE",X"DD",X"86",X"03",X"DD", + X"77",X"03",X"C9",X"DD",X"7E",X"05",X"EE",X"80",X"DD",X"77",X"05",X"FD",X"7E",X"04",X"FD",X"77", + X"00",X"FD",X"7E",X"01",X"EE",X"80",X"FD",X"77",X"01",X"C9",X"3A",X"B7",X"83",X"FE",X"03",X"D8", + X"4F",X"DD",X"35",X"0A",X"C0",X"DD",X"7E",X"06",X"B7",X"C0",X"CD",X"11",X"0B",X"47",X"79",X"87", + X"87",X"87",X"C6",X"80",X"B8",X"D8",X"CD",X"11",X"0B",X"E6",X"03",X"28",X"1D",X"0E",X"40",X"21", + X"76",X"82",X"7E",X"0F",X"0F",X"C6",X"24",X"57",X"2C",X"2C",X"46",X"3A",X"14",X"80",X"D6",X"10", + X"38",X"08",X"91",X"38",X"19",X"92",X"38",X"02",X"10",X"F8",X"DD",X"36",X"04",X"7E",X"CD",X"11", + X"0B",X"0F",X"38",X"1E",X"DD",X"36",X"05",X"00",X"DD",X"36",X"03",X"F0",X"18",X"1C",X"81",X"47", + X"3A",X"14",X"80",X"DD",X"77",X"02",X"90",X"DD",X"77",X"01",X"81",X"DD",X"77",X"00",X"DD",X"36", + X"04",X"4E",X"DD",X"36",X"05",X"80",X"DD",X"36",X"03",X"00",X"DD",X"36",X"06",X"01",X"DD",X"36", + X"08",X"0B",X"DD",X"36",X"09",X"08",X"3A",X"71",X"83",X"B7",X"C0",X"3C",X"32",X"71",X"83",X"3E", + X"90",X"DF",X"C9",X"DD",X"7E",X"06",X"B7",X"C8",X"CD",X"76",X"1D",X"DD",X"7E",X"04",X"FE",X"60", + X"30",X"0C",X"3A",X"14",X"80",X"DD",X"96",X"02",X"4F",X"FD",X"77",X"00",X"18",X"06",X"DD",X"4E", + X"03",X"FD",X"71",X"00",X"DD",X"7E",X"04",X"FD",X"77",X"03",X"FD",X"77",X"07",X"DD",X"7E",X"05", + X"B7",X"20",X"0A",X"3E",X"0F",X"81",X"FD",X"77",X"04",X"3C",X"C0",X"18",X"09",X"3E",X"F1",X"81", + X"FD",X"77",X"04",X"79",X"B7",X"C0",X"DD",X"7E",X"07",X"B7",X"C8",X"DD",X"E5",X"E1",X"54",X"5D", + X"1C",X"01",X"0F",X"00",X"70",X"ED",X"B0",X"01",X"07",X"00",X"FD",X"E5",X"E1",X"54",X"5D",X"1C", + X"70",X"ED",X"B0",X"DD",X"36",X"0A",X"20",X"C9",X"DD",X"7E",X"06",X"B7",X"C8",X"DD",X"7E",X"04", + X"C6",X"02",X"21",X"47",X"80",X"BE",X"C0",X"DD",X"7E",X"05",X"B7",X"FD",X"7E",X"00",X"21",X"44", + X"80",X"28",X"02",X"C6",X"10",X"96",X"D8",X"FE",X"10",X"D0",X"3E",X"01",X"32",X"04",X"80",X"32", + X"2C",X"84",X"C9",X"CD",X"A3",X"1E",X"CD",X"3B",X"1E",X"CD",X"23",X"1E",X"CD",X"38",X"1F",X"CD", + X"8B",X"1E",X"C9",X"DD",X"7E",X"06",X"B7",X"C8",X"DD",X"6E",X"0B",X"26",X"80",X"7E",X"DD",X"96", + X"02",X"FD",X"77",X"00",X"DD",X"7E",X"04",X"FD",X"77",X"03",X"C9",X"DD",X"7E",X"06",X"B7",X"C8", + X"DD",X"35",X"09",X"C0",X"DD",X"36",X"09",X"08",X"DD",X"6E",X"0B",X"26",X"80",X"DD",X"7E",X"05", + X"B7",X"28",X"0D",X"7E",X"DD",X"96",X"00",X"FD",X"BE",X"00",X"30",X"11",X"DD",X"34",X"02",X"C9", + X"7E",X"DD",X"96",X"01",X"FD",X"BE",X"00",X"38",X"04",X"DD",X"35",X"02",X"C9",X"3A",X"04",X"80", + X"B7",X"C0",X"DD",X"E5",X"E1",X"54",X"5D",X"1C",X"01",X"0F",X"00",X"70",X"ED",X"B0",X"21",X"58", + X"80",X"11",X"59",X"80",X"01",X"03",X"00",X"70",X"ED",X"B0",X"C9",X"DD",X"7E",X"06",X"B7",X"C8", + X"21",X"69",X"1F",X"4F",X"06",X"00",X"09",X"7E",X"DD",X"B6",X"05",X"FD",X"77",X"01",X"FD",X"36", + X"02",X"02",X"C9",X"3A",X"B7",X"83",X"FE",X"03",X"D8",X"4F",X"DD",X"7E",X"06",X"B7",X"C0",X"CD", + X"11",X"0B",X"47",X"79",X"87",X"87",X"87",X"C6",X"80",X"B8",X"D8",X"0E",X"40",X"CD",X"11",X"0B", + X"E6",X"07",X"FE",X"05",X"D0",X"4F",X"0F",X"0F",X"0F",X"0F",X"C6",X"30",X"DD",X"77",X"04",X"CD", + X"11",X"0B",X"47",X"79",X"87",X"5F",X"16",X"00",X"21",X"76",X"1F",X"19",X"5E",X"2C",X"6E",X"26", + X"80",X"DD",X"75",X"0B",X"7E",X"57",X"79",X"87",X"4F",X"06",X"00",X"21",X"6C",X"1F",X"09",X"4E", + X"2C",X"66",X"69",X"7E",X"0F",X"0F",X"D6",X"10",X"4F",X"2C",X"2C",X"46",X"7A",X"93",X"D8",X"91", + X"38",X"02",X"10",X"F9",X"81",X"47",X"DD",X"6E",X"0B",X"26",X"80",X"7E",X"DD",X"77",X"02",X"90", + X"DD",X"77",X"01",X"81",X"DD",X"77",X"00",X"CD",X"11",X"0B",X"0F",X"38",X"0A",X"DD",X"36",X"05", + X"80",X"DD",X"36",X"03",X"F0",X"18",X"08",X"DD",X"36",X"05",X"00",X"DD",X"36",X"03",X"00",X"DD", + X"36",X"06",X"01",X"DD",X"36",X"09",X"08",X"C9",X"DD",X"7E",X"06",X"B7",X"C8",X"DD",X"7E",X"04", + X"21",X"47",X"80",X"BE",X"C0",X"DD",X"7E",X"05",X"B7",X"FD",X"7E",X"00",X"21",X"44",X"80",X"20", + X"04",X"C6",X"14",X"18",X"02",X"D6",X"04",X"96",X"D8",X"FE",X"10",X"D0",X"3E",X"01",X"32",X"04", + X"80",X"DD",X"36",X"06",X"02",X"C9",X"2C",X"2E",X"30",X"2E",X"27",X"38",X"70",X"82",X"73",X"82", + X"76",X"82",X"79",X"82",X"7C",X"82",X"50",X"0C",X"30",X"10",X"70",X"14",X"40",X"18",X"40",X"1C", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3A",X"18",X"81",X"A7",X"C8",X"11",X"06",X"A8",X"06",X"08",X"21",X"9C",X"24",X"7E",X"12",X"23", + X"13",X"7E",X"12",X"23",X"C5",X"01",X"1F",X"00",X"EB",X"09",X"EB",X"C1",X"10",X"EF",X"AF",X"32", + X"18",X"81",X"C9",X"2A",X"00",X"80",X"01",X"32",X"20",X"26",X"00",X"29",X"09",X"4E",X"23",X"66", + X"69",X"E9",X"48",X"20",X"E1",X"20",X"04",X"21",X"24",X"21",X"44",X"21",X"64",X"21",X"81",X"21", + X"A1",X"21",X"C1",X"21",X"E1",X"21",X"01",X"22",X"21",X"70",X"82",X"7E",X"23",X"46",X"23",X"4E", + X"2A",X"76",X"24",X"11",X"8C",X"24",X"DD",X"21",X"00",X"81",X"FD",X"21",X"00",X"81",X"32",X"B1", + X"81",X"ED",X"53",X"01",X"80",X"E5",X"C5",X"D5",X"CD",X"21",X"22",X"3A",X"5B",X"82",X"A7",X"20", + X"0B",X"79",X"2F",X"3C",X"DD",X"77",X"01",X"DD",X"23",X"FD",X"34",X"00",X"D1",X"C1",X"E1",X"78", + X"32",X"03",X"80",X"1A",X"77",X"23",X"13",X"1A",X"77",X"2B",X"D5",X"11",X"20",X"00",X"19",X"D1", + X"10",X"1A",X"3A",X"B1",X"81",X"5F",X"16",X"00",X"19",X"0D",X"C2",X"B0",X"20",X"21",X"00",X"80", + X"34",X"7E",X"FE",X"0B",X"DA",X"23",X"20",X"AF",X"77",X"C3",X"BB",X"20",X"13",X"C3",X"83",X"20", + X"ED",X"5B",X"01",X"80",X"3A",X"03",X"80",X"47",X"C3",X"65",X"20",X"C9",X"01",X"FF",X"03",X"21", + X"00",X"A8",X"3A",X"00",X"88",X"36",X"28",X"23",X"0B",X"78",X"A7",X"20",X"F5",X"79",X"A7",X"20", + X"F1",X"01",X"FF",X"EF",X"3A",X"00",X"88",X"0B",X"78",X"A7",X"20",X"F8",X"79",X"A7",X"20",X"F4", + X"C9",X"CD",X"00",X"20",X"21",X"73",X"82",X"7E",X"23",X"46",X"23",X"4E",X"2A",X"78",X"24",X"11", + X"AC",X"24",X"DD",X"21",X"09",X"81",X"FD",X"21",X"09",X"81",X"32",X"B1",X"81",X"ED",X"53",X"01", + X"80",X"C3",X"65",X"20",X"21",X"76",X"82",X"7E",X"23",X"46",X"23",X"4E",X"2A",X"7A",X"24",X"11", + X"C4",X"24",X"DD",X"21",X"12",X"81",X"FD",X"21",X"12",X"81",X"32",X"B1",X"81",X"ED",X"53",X"01", + X"80",X"C3",X"65",X"20",X"21",X"79",X"82",X"7E",X"23",X"46",X"23",X"4E",X"2A",X"7C",X"24",X"11", + X"DC",X"24",X"DD",X"21",X"1B",X"81",X"FD",X"21",X"1B",X"81",X"32",X"B1",X"81",X"ED",X"53",X"01", + X"80",X"C3",X"65",X"20",X"21",X"7C",X"82",X"7E",X"23",X"46",X"23",X"4E",X"2A",X"7E",X"24",X"11", + X"E8",X"24",X"DD",X"21",X"24",X"81",X"FD",X"21",X"24",X"81",X"32",X"B1",X"81",X"ED",X"53",X"01", + X"80",X"C3",X"65",X"20",X"C3",X"9D",X"20",X"11",X"24",X"25",X"01",X"04",X"02",X"DD",X"21",X"2D", + X"81",X"FD",X"21",X"2D",X"81",X"3E",X"80",X"32",X"B1",X"81",X"ED",X"53",X"01",X"80",X"C3",X"65", + X"20",X"21",X"82",X"82",X"7E",X"23",X"46",X"23",X"4E",X"2A",X"82",X"24",X"11",X"28",X"25",X"DD", + X"21",X"36",X"81",X"FD",X"21",X"36",X"81",X"32",X"B1",X"81",X"ED",X"53",X"01",X"80",X"C3",X"65", + X"20",X"21",X"85",X"82",X"7E",X"23",X"46",X"23",X"4E",X"2A",X"84",X"24",X"11",X"30",X"25",X"DD", + X"21",X"3F",X"81",X"FD",X"21",X"3F",X"81",X"32",X"B1",X"81",X"ED",X"53",X"01",X"80",X"C3",X"65", + X"20",X"21",X"88",X"82",X"7E",X"23",X"46",X"23",X"4E",X"2A",X"86",X"24",X"11",X"34",X"25",X"DD", + X"21",X"48",X"81",X"FD",X"21",X"48",X"81",X"32",X"B1",X"81",X"ED",X"53",X"01",X"80",X"C3",X"65", + X"20",X"21",X"8B",X"82",X"7E",X"23",X"46",X"23",X"4E",X"2A",X"88",X"24",X"11",X"38",X"25",X"DD", + X"21",X"51",X"81",X"FD",X"21",X"51",X"81",X"32",X"B1",X"81",X"ED",X"53",X"01",X"80",X"C3",X"65", + X"20",X"21",X"8E",X"82",X"7E",X"23",X"46",X"23",X"4E",X"2A",X"8A",X"24",X"11",X"3C",X"25",X"DD", + X"21",X"5A",X"81",X"FD",X"21",X"5A",X"81",X"32",X"B1",X"81",X"ED",X"53",X"01",X"80",X"C3",X"65", + X"20",X"11",X"00",X"A8",X"ED",X"52",X"7D",X"01",X"00",X"06",X"E6",X"E0",X"6F",X"7C",X"E6",X"04", + X"CA",X"39",X"22",X"CB",X"01",X"0C",X"C3",X"3B",X"22",X"CB",X"01",X"CB",X"05",X"CB",X"14",X"10", + X"EC",X"CB",X"01",X"CB",X"01",X"CB",X"01",X"C9",X"3A",X"CD",X"83",X"B7",X"C0",X"3A",X"04",X"80", + X"A7",X"C0",X"21",X"47",X"80",X"7E",X"4F",X"E6",X"0F",X"FE",X"09",X"D2",X"92",X"22",X"79",X"E6", + X"F0",X"0F",X"0F",X"0F",X"0F",X"6F",X"26",X"00",X"01",X"72",X"22",X"29",X"09",X"4E",X"23",X"66", + X"69",X"E9",X"92",X"22",X"95",X"22",X"98",X"22",X"9B",X"22",X"A3",X"22",X"AB",X"22",X"B3",X"22", + X"BB",X"22",X"C3",X"22",X"CB",X"22",X"D3",X"22",X"DB",X"22",X"E3",X"22",X"EB",X"22",X"F3",X"22", + X"F6",X"22",X"C3",X"6D",X"23",X"C3",X"6D",X"23",X"C3",X"6D",X"23",X"21",X"00",X"81",X"0E",X"3C", + X"C3",X"F9",X"22",X"21",X"09",X"81",X"0E",X"1F",X"C3",X"F9",X"22",X"21",X"12",X"81",X"0E",X"5C", + X"C3",X"F9",X"22",X"21",X"1B",X"81",X"0E",X"2C",X"C3",X"F9",X"22",X"21",X"24",X"81",X"0E",X"2F", + X"C3",X"F9",X"22",X"C3",X"6D",X"23",X"0E",X"17",X"C3",X"F9",X"22",X"21",X"36",X"81",X"0E",X"22", + X"C3",X"F9",X"22",X"21",X"3F",X"81",X"0E",X"12",X"C3",X"F9",X"22",X"21",X"48",X"81",X"0E",X"12", + X"C3",X"F9",X"22",X"21",X"51",X"81",X"0E",X"12",X"C3",X"F9",X"22",X"21",X"5A",X"81",X"0E",X"12", + X"C3",X"F9",X"22",X"C3",X"6D",X"23",X"C3",X"6D",X"23",X"3A",X"47",X"80",X"FE",X"80",X"DA",X"22", + X"23",X"3A",X"44",X"80",X"C6",X"03",X"57",X"81",X"5F",X"46",X"DA",X"2A",X"23",X"23",X"7E",X"BA", + X"DA",X"3F",X"23",X"BB",X"D2",X"3F",X"23",X"3A",X"47",X"80",X"FE",X"80",X"DA",X"6D",X"23",X"C3", + X"59",X"23",X"3A",X"44",X"80",X"C6",X"0C",X"C3",X"06",X"23",X"23",X"7E",X"BA",X"D2",X"34",X"23", + X"BB",X"D2",X"4C",X"23",X"3A",X"47",X"80",X"FE",X"80",X"DA",X"6D",X"23",X"C3",X"59",X"23",X"10", + X"CC",X"3A",X"47",X"80",X"FE",X"80",X"DA",X"59",X"23",X"C3",X"6D",X"23",X"10",X"DC",X"3A",X"47", + X"80",X"FE",X"80",X"DA",X"59",X"23",X"C3",X"6D",X"23",X"3E",X"01",X"32",X"04",X"80",X"3A",X"47", + X"80",X"FE",X"80",X"D0",X"FE",X"30",X"D8",X"3E",X"01",X"32",X"9C",X"82",X"C9",X"3A",X"04",X"80", + X"A7",X"C0",X"21",X"47",X"80",X"7E",X"C6",X"0F",X"4F",X"E6",X"0F",X"FE",X"05",X"DA",X"B4",X"23", + X"79",X"E6",X"F0",X"0F",X"0F",X"0F",X"0F",X"6F",X"26",X"00",X"01",X"94",X"23",X"29",X"09",X"4E", + X"23",X"66",X"69",X"E9",X"B4",X"23",X"B7",X"23",X"BA",X"23",X"BD",X"23",X"C5",X"23",X"CD",X"23", + X"D5",X"23",X"DD",X"23",X"E5",X"23",X"ED",X"23",X"F5",X"23",X"FD",X"23",X"05",X"24",X"0D",X"24", + X"15",X"24",X"15",X"24",X"C3",X"6A",X"24",X"C3",X"6A",X"24",X"C3",X"6A",X"24",X"21",X"00",X"81", + X"0E",X"3C",X"C3",X"18",X"24",X"21",X"09",X"81",X"0E",X"1F",X"C3",X"18",X"24",X"21",X"12",X"81", + X"0E",X"5C",X"C3",X"18",X"24",X"21",X"1B",X"81",X"0E",X"2C",X"C3",X"18",X"24",X"21",X"24",X"81", + X"0E",X"2F",X"C3",X"18",X"24",X"C3",X"6A",X"24",X"0E",X"17",X"C3",X"18",X"24",X"21",X"36",X"81", + X"0E",X"22",X"C3",X"18",X"24",X"21",X"3F",X"81",X"0E",X"12",X"C3",X"18",X"24",X"21",X"48",X"81", + X"0E",X"12",X"C3",X"18",X"24",X"21",X"51",X"81",X"0E",X"12",X"C3",X"18",X"24",X"21",X"5A",X"81", + X"0E",X"12",X"C3",X"18",X"24",X"C3",X"6A",X"24",X"3A",X"2F",X"80",X"FE",X"80",X"DA",X"42",X"24", + X"3A",X"44",X"80",X"C6",X"03",X"57",X"81",X"5F",X"46",X"DA",X"4A",X"24",X"23",X"7E",X"BA",X"DA", + X"60",X"24",X"BB",X"D2",X"60",X"24",X"3A",X"47",X"80",X"FE",X"80",X"D8",X"3E",X"01",X"32",X"04", + X"80",X"C9",X"3A",X"44",X"80",X"C6",X"0C",X"C3",X"25",X"24",X"23",X"7E",X"BA",X"D2",X"54",X"24", + X"BB",X"D2",X"6B",X"24",X"3A",X"47",X"80",X"FE",X"80",X"D8",X"3E",X"01",X"32",X"04",X"80",X"C9", + X"10",X"CA",X"3A",X"47",X"80",X"FE",X"80",X"DA",X"59",X"23",X"C9",X"10",X"DD",X"3A",X"47",X"80", + X"FE",X"80",X"DA",X"59",X"23",X"C9",X"06",X"A8",X"08",X"A8",X"0A",X"A8",X"0C",X"A8",X"0E",X"A8", + X"10",X"A8",X"12",X"A8",X"14",X"A8",X"16",X"A8",X"18",X"A8",X"1A",X"A8",X"5C",X"5D",X"5E",X"5F", + X"58",X"59",X"5A",X"5B",X"58",X"59",X"5A",X"5B",X"54",X"55",X"56",X"57",X"10",X"10",X"10",X"10", + X"D0",X"D1",X"D2",X"D3",X"CC",X"CD",X"CE",X"CF",X"C8",X"C9",X"CA",X"CB",X"34",X"35",X"36",X"37", + X"34",X"35",X"36",X"37",X"38",X"39",X"3A",X"3B",X"38",X"39",X"3A",X"3B",X"3C",X"3D",X"3E",X"3F", + X"3C",X"3D",X"3E",X"3F",X"5C",X"5D",X"5E",X"5F",X"58",X"59",X"5A",X"5B",X"58",X"59",X"5A",X"5B", + X"58",X"59",X"5A",X"5B",X"58",X"59",X"5A",X"5B",X"54",X"55",X"56",X"57",X"5C",X"5D",X"5E",X"5F", + X"58",X"59",X"5A",X"5B",X"54",X"55",X"56",X"57",X"34",X"35",X"36",X"37",X"34",X"35",X"36",X"37", + X"34",X"35",X"36",X"37",X"34",X"35",X"36",X"37",X"34",X"35",X"36",X"37",X"38",X"39",X"3A",X"3B", + X"38",X"39",X"3A",X"3B",X"38",X"39",X"3A",X"3B",X"38",X"39",X"3A",X"3B",X"38",X"39",X"3A",X"3B", + X"3C",X"3D",X"3E",X"3F",X"3C",X"3D",X"3E",X"3F",X"3C",X"3D",X"3E",X"3F",X"3C",X"3D",X"3E",X"3F", + X"3C",X"3D",X"3E",X"3F",X"47",X"47",X"47",X"47",X"AC",X"AD",X"AE",X"AF",X"A8",X"A9",X"AA",X"AB", + X"A0",X"A1",X"A2",X"A3",X"30",X"31",X"32",X"33",X"A4",X"A5",X"A6",X"A7",X"50",X"51",X"52",X"53", + X"3A",X"FF",X"80",X"01",X"50",X"25",X"26",X"00",X"87",X"6F",X"09",X"4E",X"23",X"66",X"69",X"E9", + X"66",X"25",X"77",X"25",X"88",X"25",X"99",X"25",X"AA",X"25",X"BB",X"25",X"CC",X"25",X"DD",X"25", + X"EE",X"25",X"FF",X"25",X"10",X"26",X"21",X"9B",X"81",X"11",X"00",X"81",X"DD",X"21",X"0C",X"80", + X"FD",X"21",X"A6",X"81",X"C3",X"21",X"26",X"21",X"9C",X"81",X"11",X"09",X"81",X"DD",X"21",X"10", + X"80",X"FD",X"21",X"A7",X"81",X"C3",X"C7",X"26",X"21",X"9D",X"81",X"11",X"12",X"81",X"DD",X"21", + X"14",X"80",X"FD",X"21",X"A8",X"81",X"C3",X"21",X"26",X"21",X"9E",X"81",X"11",X"1B",X"81",X"DD", + X"21",X"18",X"80",X"FD",X"21",X"A9",X"81",X"C3",X"21",X"26",X"21",X"9F",X"81",X"11",X"24",X"81", + X"DD",X"21",X"1C",X"80",X"FD",X"21",X"AA",X"81",X"C3",X"C7",X"26",X"C3",X"67",X"26",X"11",X"2D", + X"81",X"DD",X"21",X"20",X"80",X"FD",X"21",X"AB",X"81",X"C3",X"21",X"26",X"21",X"A1",X"81",X"11", + X"36",X"81",X"DD",X"21",X"24",X"80",X"FD",X"21",X"AC",X"81",X"C3",X"C7",X"26",X"21",X"A2",X"81", + X"11",X"3F",X"81",X"DD",X"21",X"28",X"80",X"FD",X"21",X"AD",X"81",X"C3",X"21",X"26",X"21",X"A3", + X"81",X"11",X"48",X"81",X"DD",X"21",X"2C",X"80",X"FD",X"21",X"AE",X"81",X"C3",X"C7",X"26",X"21", + X"A4",X"81",X"11",X"51",X"81",X"DD",X"21",X"30",X"80",X"FD",X"21",X"AF",X"81",X"C3",X"21",X"26", + X"21",X"A5",X"81",X"11",X"5A",X"81",X"DD",X"21",X"34",X"80",X"FD",X"21",X"B0",X"81",X"C3",X"C7", + X"26",X"FD",X"7E",X"00",X"4F",X"A7",X"C2",X"5D",X"27",X"7E",X"47",X"E6",X"0F",X"4F",X"78",X"E6", + X"10",X"C2",X"5D",X"27",X"1A",X"47",X"13",X"1A",X"81",X"12",X"10",X"FA",X"DD",X"7E",X"00",X"81", + X"DD",X"77",X"00",X"DD",X"77",X"02",X"3A",X"47",X"80",X"FE",X"30",X"DA",X"63",X"26",X"3A",X"47", + X"80",X"FE",X"73",X"D2",X"63",X"26",X"47",X"E6",X"0F",X"FE",X"03",X"DA",X"74",X"26",X"FE",X"0C", + X"D2",X"A8",X"26",X"FD",X"36",X"00",X"00",X"21",X"FF",X"80",X"34",X"7E",X"FE",X"0B",X"DA",X"40", + X"25",X"36",X"00",X"C9",X"78",X"E6",X"F0",X"08",X"08",X"D6",X"30",X"0F",X"0F",X"0F",X"0F",X"47", + X"3A",X"FF",X"80",X"B8",X"C2",X"63",X"26",X"3A",X"47",X"80",X"FE",X"30",X"DA",X"63",X"26",X"3A", + X"44",X"80",X"81",X"32",X"44",X"80",X"FE",X"08",X"DA",X"A0",X"26",X"FE",X"E7",X"DA",X"63",X"26", + X"3E",X"01",X"32",X"04",X"80",X"C3",X"63",X"26",X"78",X"E6",X"F0",X"C6",X"10",X"08",X"08",X"D6", + X"30",X"0F",X"0F",X"0F",X"0F",X"47",X"3A",X"FF",X"80",X"B8",X"C2",X"63",X"26",X"3A",X"44",X"80", + X"81",X"32",X"44",X"80",X"C3",X"63",X"26",X"FD",X"7E",X"00",X"4F",X"A7",X"C2",X"6F",X"27",X"7E", + X"47",X"E6",X"0F",X"4F",X"78",X"E6",X"10",X"C2",X"6F",X"27",X"1A",X"47",X"13",X"1A",X"91",X"12", + X"10",X"FA",X"DD",X"7E",X"00",X"91",X"DD",X"77",X"00",X"DD",X"77",X"02",X"3A",X"47",X"80",X"FE", + X"73",X"D2",X"01",X"27",X"47",X"E6",X"0F",X"FE",X"03",X"DA",X"12",X"27",X"FE",X"0C",X"D2",X"3E", + X"27",X"FD",X"36",X"00",X"00",X"21",X"FF",X"80",X"34",X"7E",X"FE",X"0B",X"DA",X"40",X"25",X"36", + X"00",X"C9",X"78",X"E6",X"F0",X"08",X"08",X"D6",X"30",X"0F",X"0F",X"0F",X"0F",X"47",X"3A",X"FF", + X"80",X"B8",X"C2",X"01",X"27",X"3A",X"44",X"80",X"91",X"32",X"44",X"80",X"FE",X"08",X"DA",X"36", + X"27",X"FE",X"E7",X"DA",X"01",X"27",X"3E",X"01",X"32",X"04",X"80",X"C3",X"01",X"27",X"78",X"E6", + X"F0",X"C6",X"10",X"08",X"08",X"D6",X"30",X"0F",X"0F",X"0F",X"0F",X"47",X"3A",X"FF",X"80",X"B8", + X"C2",X"01",X"27",X"3A",X"44",X"80",X"91",X"32",X"44",X"80",X"C3",X"01",X"27",X"79",X"FE",X"01", + X"C2",X"68",X"27",X"0E",X"01",X"C3",X"34",X"26",X"0D",X"FD",X"71",X"00",X"C3",X"67",X"26",X"79", + X"FE",X"01",X"C2",X"7A",X"27",X"0E",X"01",X"C3",X"DA",X"26",X"0D",X"FD",X"71",X"00",X"C3",X"05", + X"27",X"3A",X"04",X"80",X"A7",X"C8",X"3A",X"50",X"81",X"CB",X"47",X"28",X"05",X"3E",X"01",X"32", + X"18",X"81",X"3A",X"20",X"81",X"A7",X"28",X"03",X"32",X"21",X"81",X"CD",X"57",X"36",X"CD",X"3C", + X"38",X"3A",X"47",X"82",X"3C",X"32",X"47",X"82",X"D6",X"10",X"C0",X"32",X"47",X"82",X"3E",X"07", + X"32",X"46",X"80",X"21",X"44",X"80",X"3A",X"B2",X"81",X"3C",X"32",X"B2",X"81",X"4F",X"3A",X"9C", + X"82",X"A7",X"C2",X"06",X"28",X"79",X"FE",X"06",X"20",X"44",X"CD",X"17",X"08",X"AF",X"32",X"B2", + X"81",X"32",X"04",X"80",X"32",X"47",X"82",X"32",X"69",X"82",X"32",X"9C",X"82",X"21",X"48",X"82", + X"11",X"49",X"82",X"01",X"0B",X"00",X"77",X"ED",X"B0",X"3C",X"32",X"CE",X"83",X"3A",X"D6",X"83", + X"3D",X"20",X"12",X"3A",X"FE",X"83",X"A7",X"20",X"0C",X"32",X"D6",X"83",X"32",X"99",X"82",X"32", + X"9A",X"82",X"32",X"5B",X"82",X"C9",X"79",X"FE",X"05",X"20",X"03",X"C3",X"CA",X"27",X"3A",X"9C", + X"82",X"A7",X"C2",X"4D",X"28",X"23",X"3A",X"B2",X"81",X"3D",X"28",X"0B",X"3D",X"28",X"15",X"3D", + X"28",X"15",X"3D",X"28",X"15",X"18",X"16",X"36",X"39",X"AF",X"67",X"6F",X"22",X"82",X"83",X"DF", + X"3E",X"03",X"DF",X"C9",X"36",X"39",X"C9",X"36",X"3A",X"C9",X"36",X"3B",X"C9",X"36",X"3C",X"AF", + X"32",X"AE",X"83",X"CD",X"DF",X"38",X"21",X"D8",X"00",X"22",X"82",X"83",X"C9",X"23",X"3A",X"B2", + X"81",X"3D",X"28",X"08",X"3D",X"28",X"12",X"3D",X"28",X"12",X"18",X"13",X"36",X"22",X"AF",X"67", + X"6F",X"22",X"82",X"83",X"DF",X"3E",X"02",X"DF",X"C9",X"36",X"23",X"C9",X"36",X"24",X"C9",X"36", + X"3C",X"AF",X"32",X"AE",X"83",X"32",X"10",X"81",X"32",X"07",X"81",X"32",X"1A",X"81",X"32",X"19", + X"81",X"CD",X"DF",X"38",X"21",X"D8",X"00",X"22",X"82",X"83",X"C9",X"3A",X"4F",X"81",X"A7",X"C0", + X"3A",X"5B",X"81",X"A7",X"C0",X"3A",X"B4",X"81",X"A7",X"C2",X"BB",X"28",X"67",X"3A",X"B3",X"81", + X"6F",X"11",X"CA",X"28",X"29",X"19",X"4E",X"23",X"66",X"69",X"EB",X"21",X"B3",X"81",X"34",X"7E", + X"23",X"36",X"15",X"D6",X"0A",X"C2",X"C0",X"28",X"2B",X"77",X"C9",X"21",X"B4",X"81",X"35",X"C9", + X"EB",X"11",X"9B",X"81",X"01",X"0B",X"00",X"ED",X"B0",X"C9",X"F4",X"28",X"FF",X"28",X"0A",X"29", + X"15",X"29",X"20",X"29",X"2B",X"29",X"36",X"29",X"41",X"29",X"4C",X"29",X"57",X"29",X"62",X"29", + X"6D",X"29",X"78",X"29",X"83",X"29",X"8E",X"29",X"99",X"29",X"A4",X"29",X"AF",X"29",X"BA",X"29", + X"C5",X"29",X"D0",X"29",X"13",X"12",X"11",X"16",X"12",X"00",X"12",X"13",X"14",X"15",X"16",X"12", + X"13",X"12",X"15",X"01",X"00",X"13",X"02",X"12",X"13",X"12",X"12",X"12",X"13",X"14",X"12",X"00", + X"12",X"01",X"13",X"12",X"13",X"12",X"01",X"12",X"13",X"13",X"00",X"12",X"02",X"12",X"01",X"14", + X"13",X"12",X"01",X"12",X"12",X"00",X"12",X"01",X"01",X"12",X"13",X"13",X"01",X"12",X"13",X"13", + X"00",X"01",X"02",X"12",X"13",X"12",X"12",X"12",X"13",X"12",X"12",X"00",X"12",X"01",X"13",X"12", + X"13",X"13",X"13",X"12",X"13",X"01",X"00",X"13",X"02",X"12",X"01",X"12",X"12",X"12",X"13",X"12", + X"12",X"00",X"12",X"01",X"01",X"12",X"13",X"13",X"01",X"12",X"01",X"13",X"00",X"01",X"02",X"12", + X"13",X"13",X"12",X"12",X"01",X"12",X"12",X"00",X"01",X"01",X"13",X"12",X"12",X"01",X"13",X"01", + X"13",X"01",X"00",X"12",X"01",X"12",X"01",X"01",X"12",X"12",X"01",X"12",X"12",X"00",X"01",X"02", + X"13",X"12",X"01",X"01",X"12",X"01",X"12",X"01",X"00",X"01",X"03",X"12",X"01",X"12",X"12",X"12", + X"01",X"12",X"12",X"00",X"01",X"02",X"13",X"12",X"12",X"01",X"01",X"12",X"01",X"12",X"00",X"01", + X"01",X"12",X"01",X"01",X"01",X"01",X"12",X"01",X"12",X"00",X"01",X"01",X"12",X"01",X"01",X"12", + X"01",X"13",X"12",X"01",X"00",X"12",X"02",X"01",X"12",X"12",X"01",X"12",X"14",X"01",X"12",X"00", + X"01",X"03",X"12",X"13",X"01",X"12",X"01",X"13",X"12",X"13",X"00",X"12",X"02",X"13",X"12",X"12", + X"13",X"12",X"12",X"13",X"12",X"00",X"13",X"01",X"14",X"13",X"14",X"21",X"43",X"A8",X"0E",X"05", + X"11",X"7F",X"2A",X"06",X"04",X"1A",X"77",X"13",X"C5",X"01",X"20",X"00",X"09",X"C1",X"10",X"F5", + X"11",X"40",X"00",X"19",X"0D",X"C2",X"E0",X"29",X"21",X"A4",X"A8",X"0E",X"04",X"11",X"83",X"2A", + X"06",X"04",X"1A",X"77",X"13",X"C5",X"01",X"20",X"00",X"09",X"C1",X"10",X"F5",X"11",X"40",X"00", + X"19",X"0D",X"C2",X"FD",X"29",X"21",X"A5",X"A8",X"0E",X"04",X"11",X"87",X"2A",X"06",X"04",X"1A", + X"77",X"13",X"C5",X"01",X"20",X"00",X"09",X"C1",X"10",X"F5",X"11",X"40",X"00",X"19",X"0D",X"C2", + X"1A",X"2A",X"21",X"C3",X"A8",X"06",X"04",X"36",X"47",X"11",X"20",X"00",X"19",X"36",X"47",X"11", + X"A0",X"00",X"19",X"10",X"F2",X"21",X"44",X"A8",X"36",X"41",X"23",X"36",X"42",X"01",X"5F",X"03", + X"09",X"36",X"45",X"23",X"36",X"46",X"21",X"5C",X"A8",X"CD",X"6B",X"2A",X"21",X"07",X"80",X"3E", + X"01",X"77",X"2C",X"2C",X"77",X"2C",X"2C",X"77",X"C3",X"8B",X"2A",X"06",X"0E",X"36",X"48",X"23", + X"36",X"49",X"11",X"1F",X"00",X"19",X"36",X"4A",X"23",X"36",X"4B",X"19",X"10",X"EF",X"C9",X"40", + X"43",X"43",X"44",X"45",X"47",X"47",X"41",X"46",X"43",X"43",X"42",X"3E",X"05",X"32",X"25",X"80", + X"32",X"27",X"80",X"3E",X"04",X"32",X"2D",X"80",X"32",X"2F",X"80",X"3E",X"07",X"32",X"35",X"80", + X"32",X"37",X"80",X"3E",X"06",X"32",X"21",X"80",X"32",X"23",X"80",X"32",X"39",X"80",X"32",X"3B", + X"80",X"3E",X"05",X"06",X"0A",X"21",X"0D",X"80",X"77",X"23",X"23",X"10",X"FB",X"32",X"29",X"80", + X"32",X"2B",X"80",X"32",X"31",X"80",X"32",X"33",X"80",X"3E",X"02",X"32",X"0D",X"80",X"32",X"0F", + X"80",X"32",X"15",X"80",X"32",X"17",X"80",X"32",X"19",X"80",X"32",X"1B",X"80",X"C9",X"3A",X"FE", + X"83",X"B7",X"28",X"34",X"CD",X"44",X"39",X"CD",X"A6",X"39",X"CD",X"73",X"38",X"CD",X"2F",X"37", + X"CD",X"8F",X"39",X"3A",X"40",X"83",X"A7",X"C4",X"28",X"2B",X"CD",X"74",X"34",X"3A",X"B7",X"83", + X"CB",X"47",X"CA",X"36",X"2B",X"3A",X"22",X"81",X"3C",X"32",X"22",X"81",X"A7",X"CC",X"83",X"34", + X"3A",X"22",X"81",X"FE",X"70",X"CC",X"57",X"36",X"3A",X"47",X"80",X"FE",X"31",X"DA",X"88",X"2D", + X"3A",X"FE",X"83",X"B7",X"C8",X"C3",X"54",X"2B",X"3D",X"32",X"40",X"83",X"FE",X"01",X"C0",X"CD", + X"23",X"37",X"CD",X"67",X"38",X"C9",X"3A",X"22",X"81",X"3C",X"32",X"22",X"81",X"A7",X"CC",X"1F", + X"35",X"3A",X"22",X"81",X"FE",X"50",X"CC",X"BB",X"35",X"3A",X"22",X"81",X"FE",X"B0",X"CC",X"57", + X"36",X"C3",X"18",X"2B",X"3A",X"6C",X"82",X"A7",X"C0",X"3A",X"68",X"82",X"A7",X"28",X"08",X"3D", + X"32",X"68",X"82",X"CD",X"74",X"34",X"C9",X"3A",X"04",X"80",X"A7",X"C0",X"21",X"44",X"80",X"11", + X"47",X"80",X"3A",X"04",X"E0",X"CB",X"5F",X"28",X"07",X"3A",X"FD",X"83",X"3D",X"C2",X"FD",X"2B", + X"3A",X"00",X"E0",X"4F",X"3A",X"48",X"82",X"A7",X"C2",X"43",X"2C",X"3A",X"04",X"E0",X"CB",X"5F", + X"28",X"07",X"3A",X"FD",X"83",X"3D",X"C2",X"04",X"2C",X"3A",X"04",X"E0",X"CB",X"77",X"CA",X"14", + X"2C",X"AF",X"32",X"4C",X"82",X"32",X"50",X"82",X"3A",X"49",X"82",X"A7",X"C2",X"96",X"2C",X"3A", + X"4A",X"82",X"47",X"3A",X"4B",X"82",X"80",X"20",X"1D",X"3A",X"04",X"E0",X"CB",X"5F",X"28",X"07", + X"3A",X"FD",X"83",X"3D",X"C2",X"0C",X"2C",X"3A",X"04",X"E0",X"CB",X"67",X"CA",X"6D",X"2C",X"AF", + X"32",X"4D",X"82",X"32",X"51",X"82",X"3A",X"4A",X"82",X"A7",X"C2",X"FF",X"2C",X"CB",X"61",X"CA", + X"CA",X"2C",X"AF",X"32",X"4E",X"82",X"32",X"52",X"82",X"3A",X"4B",X"82",X"A7",X"C2",X"5E",X"2D", + X"CB",X"69",X"CA",X"29",X"2D",X"AF",X"32",X"4F",X"82",X"32",X"53",X"82",X"C9",X"3A",X"02",X"E0", + X"4F",X"C3",X"84",X"2B",X"3A",X"04",X"E0",X"CB",X"47",X"C3",X"9E",X"2B",X"3A",X"00",X"E0",X"CB", + X"47",X"C3",X"CC",X"2B",X"3A",X"47",X"80",X"FE",X"F0",X"D0",X"3A",X"50",X"82",X"A7",X"20",X"10", + X"3E",X"04",X"DF",X"23",X"7E",X"2B",X"FE",X"DE",X"CA",X"3D",X"2C",X"3E",X"DE",X"32",X"45",X"80", + X"3A",X"50",X"82",X"3C",X"32",X"50",X"82",X"B7",X"C8",X"AF",X"32",X"50",X"82",X"3A",X"56",X"82", + X"32",X"50",X"82",X"3A",X"4C",X"82",X"A7",X"C0",X"3C",X"32",X"48",X"82",X"3A",X"50",X"82",X"3D", + X"32",X"50",X"82",X"C2",X"61",X"2C",X"32",X"48",X"82",X"3C",X"32",X"4C",X"82",X"23",X"36",X"DE", + X"C9",X"EB",X"3A",X"54",X"82",X"86",X"77",X"EB",X"23",X"3E",X"DC",X"77",X"C9",X"3A",X"51",X"82", + X"A7",X"20",X"10",X"3E",X"04",X"DF",X"23",X"7E",X"2B",X"FE",X"1E",X"CA",X"90",X"2C",X"3E",X"1E", + X"32",X"45",X"80",X"3A",X"51",X"82",X"3C",X"32",X"51",X"82",X"B7",X"C8",X"AF",X"32",X"51",X"82", + X"3A",X"57",X"82",X"32",X"51",X"82",X"CD",X"74",X"34",X"3A",X"4D",X"82",X"A7",X"C0",X"3C",X"32", + X"49",X"82",X"3A",X"51",X"82",X"3D",X"32",X"51",X"82",X"C2",X"BC",X"2C",X"32",X"49",X"82",X"3C", + X"32",X"4D",X"82",X"23",X"36",X"1E",X"D5",X"CD",X"5F",X"30",X"D1",X"C9",X"EB",X"3A",X"54",X"82", + X"47",X"7E",X"90",X"77",X"EB",X"23",X"3E",X"1C",X"77",X"C9",X"3A",X"47",X"80",X"FE",X"30",X"D8", + X"3A",X"44",X"80",X"FE",X"E0",X"D0",X"3A",X"52",X"82",X"A7",X"20",X"10",X"3E",X"04",X"DF",X"23", + X"7E",X"2B",X"FE",X"A1",X"CA",X"F9",X"2C",X"3E",X"A1",X"32",X"45",X"80",X"3A",X"52",X"82",X"3C", + X"32",X"52",X"82",X"B7",X"C8",X"AF",X"32",X"52",X"82",X"3A",X"58",X"82",X"32",X"52",X"82",X"3A", + X"4E",X"82",X"A7",X"C0",X"3C",X"32",X"4A",X"82",X"3A",X"52",X"82",X"3D",X"32",X"52",X"82",X"C2", + X"1D",X"2D",X"32",X"4A",X"82",X"3C",X"32",X"4E",X"82",X"23",X"36",X"A1",X"C9",X"3A",X"55",X"82", + X"47",X"7E",X"80",X"77",X"23",X"3E",X"9F",X"77",X"C9",X"3A",X"47",X"80",X"FE",X"30",X"D8",X"3A", + X"44",X"80",X"FE",X"20",X"D8",X"3A",X"53",X"82",X"A7",X"20",X"10",X"3E",X"04",X"DF",X"23",X"7E", + X"2B",X"FE",X"21",X"CA",X"58",X"2D",X"3E",X"21",X"32",X"45",X"80",X"3A",X"53",X"82",X"3C",X"32", + X"53",X"82",X"B7",X"C8",X"AF",X"32",X"53",X"82",X"3A",X"59",X"82",X"32",X"53",X"82",X"3A",X"4F", + X"82",X"A7",X"C0",X"3C",X"32",X"4B",X"82",X"3A",X"53",X"82",X"3D",X"32",X"53",X"82",X"C2",X"7C", + X"2D",X"32",X"4B",X"82",X"3C",X"32",X"4F",X"82",X"23",X"36",X"21",X"C9",X"3A",X"55",X"82",X"47", + X"7E",X"90",X"77",X"23",X"3E",X"1F",X"77",X"C9",X"3A",X"44",X"80",X"FE",X"15",X"DA",X"00",X"2E", + X"FE",X"1C",X"CA",X"10",X"2E",X"DA",X"10",X"2E",X"FE",X"2E",X"DA",X"00",X"2E",X"FE",X"35",X"CA", + X"00",X"2E",X"DA",X"00",X"2E",X"FE",X"45",X"DA",X"00",X"2E",X"FE",X"4C",X"CA",X"61",X"2E",X"DA", + X"61",X"2E",X"FE",X"5E",X"DA",X"00",X"2E",X"FE",X"65",X"CA",X"00",X"2E",X"DA",X"00",X"2E",X"FE", + X"75",X"DA",X"00",X"2E",X"FE",X"7C",X"CA",X"B2",X"2E",X"DA",X"B2",X"2E",X"FE",X"8E",X"DA",X"00", + X"2E",X"FE",X"95",X"CA",X"00",X"2E",X"DA",X"00",X"2E",X"FE",X"A5",X"DA",X"00",X"2E",X"FE",X"AC", + X"CA",X"03",X"2F",X"DA",X"03",X"2F",X"FE",X"BE",X"DA",X"00",X"2E",X"FE",X"C5",X"CA",X"00",X"2E", + X"DA",X"00",X"2E",X"FE",X"D5",X"DA",X"00",X"2E",X"FE",X"DC",X"CA",X"54",X"2F",X"DA",X"54",X"2F", + X"3A",X"47",X"80",X"FE",X"2A",X"D2",X"54",X"2B",X"3E",X"01",X"32",X"04",X"80",X"C3",X"54",X"2B", + X"3A",X"FD",X"83",X"3D",X"20",X"3C",X"3A",X"5E",X"82",X"A7",X"C0",X"3A",X"47",X"80",X"FE",X"2A", + X"D2",X"54",X"2B",X"06",X"18",X"3A",X"21",X"81",X"D6",X"01",X"CC",X"FC",X"36",X"21",X"64",X"AB", + X"CD",X"A5",X"2F",X"3A",X"34",X"81",X"A7",X"28",X"09",X"06",X"18",X"CD",X"54",X"38",X"AF",X"32", + X"34",X"81",X"3A",X"FD",X"83",X"3D",X"20",X"0F",X"3E",X"01",X"32",X"5E",X"82",X"21",X"5C",X"82", + X"34",X"C9",X"3A",X"63",X"82",X"18",X"C2",X"3E",X"01",X"32",X"63",X"82",X"21",X"5D",X"82",X"34", + X"C9",X"3A",X"FD",X"83",X"3D",X"20",X"3C",X"3A",X"5F",X"82",X"A7",X"C0",X"3A",X"47",X"80",X"FE", + X"2A",X"D2",X"54",X"2B",X"06",X"48",X"3A",X"21",X"81",X"D6",X"02",X"CC",X"FC",X"36",X"21",X"A4", + X"AA",X"CD",X"A5",X"2F",X"3A",X"34",X"81",X"A7",X"28",X"09",X"06",X"48",X"CD",X"54",X"38",X"AF", + X"32",X"34",X"81",X"3A",X"FD",X"83",X"3D",X"20",X"0F",X"3E",X"01",X"32",X"5F",X"82",X"21",X"5C", + X"82",X"34",X"C9",X"3A",X"64",X"82",X"18",X"C2",X"3E",X"01",X"32",X"64",X"82",X"21",X"5D",X"82", + X"34",X"C9",X"3A",X"FD",X"83",X"3D",X"20",X"3C",X"3A",X"60",X"82",X"A7",X"C0",X"3A",X"47",X"80", + X"FE",X"2A",X"D2",X"54",X"2B",X"06",X"78",X"3A",X"21",X"81",X"D6",X"03",X"CC",X"FC",X"36",X"21", + X"E4",X"A9",X"CD",X"A5",X"2F",X"3A",X"34",X"81",X"A7",X"28",X"09",X"06",X"78",X"CD",X"54",X"38", + X"AF",X"32",X"34",X"81",X"3A",X"FD",X"83",X"3D",X"20",X"0F",X"3E",X"01",X"32",X"60",X"82",X"21", + X"5C",X"82",X"34",X"C9",X"3A",X"65",X"82",X"18",X"C2",X"3E",X"01",X"32",X"65",X"82",X"21",X"5D", + X"82",X"34",X"C9",X"3A",X"FD",X"83",X"3D",X"20",X"3C",X"3A",X"61",X"82",X"A7",X"C0",X"3A",X"47", + X"80",X"FE",X"2A",X"D2",X"54",X"2B",X"06",X"A8",X"3A",X"21",X"81",X"D6",X"04",X"CC",X"FC",X"36", + X"21",X"24",X"A9",X"CD",X"A5",X"2F",X"3A",X"34",X"81",X"A7",X"28",X"09",X"06",X"A8",X"CD",X"54", + X"38",X"AF",X"32",X"34",X"81",X"3A",X"FD",X"83",X"3D",X"20",X"0F",X"3E",X"01",X"32",X"61",X"82", + X"21",X"5C",X"82",X"34",X"C9",X"3A",X"66",X"82",X"18",X"C2",X"3E",X"01",X"32",X"66",X"82",X"21", + X"5D",X"82",X"34",X"C9",X"3A",X"FD",X"83",X"3D",X"20",X"3C",X"3A",X"62",X"82",X"A7",X"C0",X"3A", + X"47",X"80",X"FE",X"2A",X"D2",X"54",X"2B",X"06",X"D8",X"3A",X"21",X"81",X"D6",X"05",X"CC",X"FC", + X"36",X"21",X"64",X"A8",X"CD",X"A5",X"2F",X"3A",X"34",X"81",X"A7",X"28",X"09",X"06",X"D8",X"CD", + X"54",X"38",X"AF",X"32",X"34",X"81",X"3A",X"FD",X"83",X"3D",X"20",X"0F",X"3E",X"01",X"32",X"62", + X"82",X"21",X"5C",X"82",X"34",X"C9",X"3A",X"67",X"82",X"18",X"C2",X"3E",X"01",X"32",X"67",X"82", + X"21",X"5D",X"82",X"34",X"C9",X"3A",X"34",X"81",X"A7",X"28",X"09",X"11",X"20",X"00",X"CD",X"03", + X"09",X"CD",X"45",X"38",X"36",X"6C",X"23",X"36",X"6D",X"01",X"1F",X"00",X"09",X"36",X"6E",X"23", + X"36",X"6F",X"E5",X"D5",X"11",X"05",X"00",X"CD",X"03",X"09",X"CD",X"E8",X"08",X"3A",X"FE",X"83", + X"B7",X"28",X"4A",X"AF",X"67",X"6F",X"22",X"82",X"83",X"DF",X"3E",X"F0",X"DF",X"3A",X"FD",X"83", + X"21",X"5C",X"82",X"3D",X"28",X"01",X"2C",X"7E",X"FE",X"04",X"28",X"1E",X"3E",X"08",X"DF",X"3E", + X"0E",X"DF",X"21",X"81",X"83",X"35",X"20",X"02",X"36",X"14",X"7E",X"21",X"5D",X"0F",X"87",X"85", + X"6F",X"7E",X"2C",X"66",X"6F",X"22",X"82",X"83",X"18",X"13",X"32",X"2F",X"84",X"CD",X"F9",X"07", + X"21",X"40",X"B0",X"01",X"00",X"18",X"71",X"2C",X"10",X"FC",X"CD",X"45",X"38",X"3E",X"20",X"32", + X"6A",X"82",X"3E",X"80",X"DF",X"21",X"44",X"80",X"AF",X"77",X"23",X"77",X"23",X"77",X"23",X"36", + X"F0",X"D1",X"E1",X"AF",X"32",X"9B",X"82",X"32",X"EA",X"83",X"32",X"4D",X"82",X"32",X"49",X"82", + X"32",X"51",X"82",X"3C",X"32",X"6C",X"82",X"32",X"CD",X"83",X"3E",X"10",X"32",X"68",X"82",X"C9", + X"3A",X"6C",X"82",X"A7",X"C8",X"21",X"6A",X"82",X"35",X"C0",X"AF",X"32",X"6C",X"82",X"C9",X"3A", + X"47",X"80",X"FE",X"30",X"D8",X"FE",X"D0",X"4F",X"28",X"17",X"D0",X"3A",X"69",X"82",X"B9",X"D8", + X"C8",X"79",X"32",X"69",X"82",X"11",X"01",X"00",X"FE",X"80",X"C8",X"E5",X"CD",X"03",X"09",X"E1", + X"C9",X"3A",X"69",X"82",X"A7",X"20",X"E4",X"3E",X"E0",X"32",X"69",X"82",X"18",X"DD",X"DD",X"21", + X"73",X"82",X"DD",X"7E",X"02",X"32",X"1A",X"81",X"3A",X"10",X"81",X"3C",X"32",X"10",X"81",X"FE", + X"50",X"D4",X"84",X"31",X"DD",X"21",X"7C",X"82",X"DD",X"7E",X"02",X"32",X"19",X"81",X"3A",X"11", + X"81",X"3C",X"3C",X"32",X"11",X"81",X"FE",X"A0",X"DC",X"25",X"32",X"3A",X"6E",X"82",X"3C",X"32", + X"6E",X"82",X"FE",X"10",X"CA",X"D2",X"30",X"FE",X"20",X"CA",X"F8",X"30",X"FE",X"30",X"CA",X"1E", + X"31",X"C9",X"21",X"73",X"82",X"7E",X"23",X"46",X"21",X"1A",X"81",X"4E",X"11",X"AC",X"24",X"32", + X"B1",X"81",X"CD",X"55",X"31",X"21",X"7C",X"82",X"7E",X"23",X"46",X"21",X"19",X"81",X"4E",X"11", + X"E8",X"24",X"32",X"B1",X"81",X"C3",X"48",X"31",X"21",X"73",X"82",X"7E",X"23",X"46",X"21",X"1A", + X"81",X"4E",X"11",X"B4",X"24",X"32",X"B1",X"81",X"CD",X"55",X"31",X"21",X"7C",X"82",X"7E",X"23", + X"46",X"21",X"19",X"81",X"4E",X"11",X"FC",X"24",X"32",X"B1",X"81",X"C3",X"48",X"31",X"21",X"73", + X"82",X"7E",X"23",X"46",X"21",X"1A",X"81",X"4E",X"11",X"BC",X"24",X"32",X"B1",X"81",X"AF",X"32", + X"6E",X"82",X"CD",X"55",X"31",X"21",X"7C",X"82",X"7E",X"23",X"46",X"21",X"19",X"81",X"4E",X"11", + X"10",X"25",X"32",X"B1",X"81",X"C3",X"48",X"31",X"2A",X"7E",X"24",X"ED",X"53",X"01",X"80",X"78", + X"32",X"03",X"80",X"18",X"0B",X"2A",X"78",X"24",X"ED",X"53",X"01",X"80",X"78",X"32",X"03",X"80", + X"1A",X"77",X"23",X"13",X"1A",X"77",X"2B",X"D5",X"11",X"20",X"00",X"19",X"D1",X"13",X"10",X"F0", + X"3A",X"B1",X"81",X"5F",X"16",X"00",X"19",X"3A",X"03",X"80",X"47",X"ED",X"5B",X"01",X"80",X"0D", + X"C2",X"60",X"31",X"C9",X"DD",X"21",X"73",X"82",X"AF",X"67",X"DD",X"46",X"01",X"C6",X"20",X"10", + X"FC",X"4F",X"DD",X"6E",X"00",X"09",X"5D",X"54",X"AF",X"6F",X"67",X"DD",X"46",X"02",X"05",X"19", + X"10",X"FD",X"11",X"08",X"A8",X"19",X"0E",X"02",X"3A",X"10",X"81",X"FE",X"50",X"CA",X"C7",X"31", + X"FE",X"80",X"CA",X"D5",X"31",X"FE",X"A0",X"CA",X"EE",X"31",X"FE",X"B0",X"CA",X"D5",X"31",X"FE", + X"D0",X"CA",X"C7",X"31",X"C3",X"11",X"32",X"06",X"02",X"11",X"19",X"32",X"CD",X"01",X"32",X"0D", + X"20",X"F5",X"C3",X"11",X"32",X"06",X"02",X"11",X"1D",X"32",X"CD",X"01",X"32",X"0D",X"20",X"F5", + X"3A",X"07",X"81",X"A7",X"CA",X"11",X"32",X"AF",X"32",X"07",X"81",X"C3",X"11",X"32",X"06",X"02", + X"11",X"21",X"32",X"CD",X"01",X"32",X"0D",X"20",X"F5",X"3E",X"01",X"32",X"07",X"81",X"C3",X"11", + X"32",X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"D5",X"11",X"1F",X"00",X"19",X"D1",X"10",X"F1", + X"C9",X"DD",X"7E",X"02",X"3D",X"32",X"1A",X"81",X"C9",X"94",X"95",X"96",X"97",X"98",X"99",X"9A", + X"9B",X"10",X"10",X"10",X"10",X"DD",X"21",X"7C",X"82",X"AF",X"67",X"DD",X"46",X"01",X"C6",X"20", + X"10",X"FC",X"4F",X"DD",X"6E",X"00",X"09",X"5D",X"54",X"AF",X"6F",X"67",X"DD",X"46",X"02",X"05", + X"19",X"10",X"FD",X"11",X"0E",X"A8",X"19",X"0E",X"03",X"3A",X"11",X"81",X"FE",X"00",X"CA",X"68", + X"32",X"FE",X"30",X"CA",X"76",X"32",X"FE",X"50",X"CA",X"8F",X"32",X"FE",X"60",X"CA",X"76",X"32", + X"FE",X"70",X"CA",X"68",X"32",X"C3",X"B2",X"32",X"06",X"02",X"11",X"BA",X"32",X"CD",X"A2",X"32", + X"0D",X"20",X"F5",X"C3",X"B2",X"32",X"06",X"02",X"11",X"BE",X"32",X"CD",X"A2",X"32",X"0D",X"20", + X"F5",X"3A",X"08",X"81",X"A7",X"CA",X"B2",X"32",X"AF",X"32",X"08",X"81",X"C3",X"B2",X"32",X"06", + X"02",X"11",X"C2",X"32",X"CD",X"A2",X"32",X"0D",X"20",X"F5",X"3E",X"01",X"32",X"08",X"81",X"C3", + X"B2",X"32",X"1A",X"77",X"13",X"23",X"1A",X"77",X"13",X"D5",X"11",X"1F",X"00",X"19",X"D1",X"10", + X"F1",X"C9",X"DD",X"7E",X"02",X"3D",X"32",X"19",X"81",X"C9",X"94",X"95",X"96",X"97",X"98",X"99", + X"9A",X"9B",X"10",X"10",X"10",X"10",X"D9",X"21",X"93",X"82",X"3A",X"FD",X"83",X"3D",X"28",X"01", + X"2C",X"7E",X"01",X"E9",X"32",X"26",X"00",X"6F",X"85",X"6F",X"09",X"5E",X"23",X"56",X"EB",X"11", + X"70",X"82",X"01",X"21",X"00",X"ED",X"B0",X"D9",X"C9",X"F3",X"32",X"14",X"33",X"35",X"33",X"56", + X"33",X"77",X"33",X"60",X"08",X"03",X"60",X"04",X"04",X"80",X"0C",X"02",X"80",X"06",X"03",X"40", + X"06",X"04",X"80",X"02",X"04",X"E0",X"04",X"02",X"60",X"02",X"01",X"C0",X"02",X"03",X"C0",X"02", + X"03",X"E0",X"02",X"03",X"60",X"08",X"03",X"40",X"04",X"05",X"80",X"0C",X"01",X"60",X"06",X"03", + X"C0",X"06",X"03",X"80",X"02",X"04",X"E0",X"04",X"03",X"60",X"02",X"02",X"E0",X"02",X"04",X"C0", + X"02",X"04",X"E0",X"02",X"04",X"60",X"08",X"02",X"80",X"04",X"04",X"80",X"0C",X"01",X"C0",X"06", + X"03",X"60",X"06",X"03",X"80",X"02",X"04",X"A0",X"04",X"03",X"E0",X"02",X"02",X"A0",X"02",X"05", + X"E0",X"02",X"04",X"C0",X"02",X"04",X"60",X"08",X"02",X"A0",X"04",X"03",X"80",X"0C",X"01",X"E0", + X"06",X"02",X"80",X"06",X"03",X"80",X"02",X"04",X"80",X"04",X"04",X"C0",X"02",X"03",X"E0",X"02", + X"04",X"A0",X"02",X"04",X"E0",X"02",X"04",X"60",X"08",X"01",X"E0",X"04",X"03",X"80",X"0C",X"01", + X"A0",X"06",X"02",X"E0",X"06",X"02",X"80",X"02",X"04",X"60",X"04",X"03",X"A0",X"02",X"04",X"80", + X"02",X"05",X"C0",X"02",X"04",X"A0",X"02",X"05",X"3A",X"D6",X"83",X"3D",X"C0",X"3A",X"9B",X"82", + X"A7",X"C0",X"32",X"B4",X"83",X"CD",X"DD",X"0A",X"CD",X"3C",X"06",X"CD",X"C6",X"32",X"AF",X"32", + X"5B",X"82",X"CD",X"DB",X"29",X"21",X"50",X"A8",X"CD",X"6B",X"2A",X"CD",X"CD",X"09",X"CD",X"23", + X"20",X"3E",X"01",X"32",X"5B",X"82",X"32",X"9B",X"82",X"C9",X"3A",X"D6",X"83",X"3D",X"C0",X"3A", + X"9B",X"82",X"A7",X"C8",X"CD",X"F6",X"33",X"CD",X"DE",X"2A",X"CD",X"40",X"34",X"CD",X"65",X"09", + X"CD",X"93",X"08",X"CD",X"8E",X"30",X"CD",X"8B",X"28",X"CD",X"48",X"22",X"CD",X"81",X"27",X"CD", + X"50",X"30",X"CD",X"40",X"25",X"C9",X"3A",X"6C",X"82",X"B7",X"C0",X"3A",X"04",X"80",X"A7",X"C0", + X"3A",X"99",X"82",X"A7",X"C2",X"6F",X"34",X"11",X"47",X"80",X"3E",X"30",X"32",X"99",X"82",X"21", + X"9A",X"82",X"34",X"4E",X"06",X"00",X"21",X"3E",X"0F",X"09",X"4E",X"0C",X"CA",X"35",X"34",X"21", + X"25",X"34",X"09",X"E5",X"21",X"44",X"80",X"C9",X"C3",X"29",X"2D",X"C3",X"CA",X"2C",X"C3",X"6D", + X"2C",X"C3",X"14",X"2C",X"C9",X"AF",X"32",X"9A",X"82",X"32",X"99",X"82",X"32",X"5B",X"82",X"C9", + X"21",X"44",X"80",X"11",X"47",X"80",X"3A",X"48",X"82",X"A7",X"C2",X"43",X"2C",X"32",X"4C",X"82", + X"3A",X"49",X"82",X"A7",X"C2",X"96",X"2C",X"32",X"4D",X"82",X"3A",X"4A",X"82",X"A7",X"C2",X"FF", + X"2C",X"32",X"4E",X"82",X"3A",X"4B",X"82",X"A7",X"C2",X"5E",X"2D",X"32",X"4F",X"82",X"C9",X"3D", + X"32",X"99",X"82",X"C9",X"3A",X"23",X"81",X"3C",X"32",X"23",X"81",X"FE",X"06",X"D8",X"AF",X"32", + X"23",X"81",X"C9",X"3A",X"FD",X"83",X"4F",X"3A",X"23",X"81",X"32",X"21",X"81",X"FE",X"01",X"CA", + X"A7",X"34",X"FE",X"02",X"CA",X"BC",X"34",X"FE",X"03",X"CA",X"D1",X"34",X"FE",X"04",X"CA",X"E6", + X"34",X"FE",X"05",X"CA",X"FB",X"34",X"C9",X"0D",X"20",X"0B",X"3A",X"5E",X"82",X"A7",X"C0",X"21", + X"64",X"AB",X"C3",X"10",X"35",X"3A",X"63",X"82",X"A7",X"C0",X"18",X"F3",X"0D",X"20",X"0B",X"3A", + X"5F",X"82",X"A7",X"C0",X"21",X"A4",X"AA",X"C3",X"10",X"35",X"3A",X"64",X"82",X"A7",X"C0",X"18", + X"F3",X"0D",X"20",X"0B",X"3A",X"60",X"82",X"A7",X"C0",X"21",X"E4",X"A9",X"C3",X"10",X"35",X"3A", + X"65",X"82",X"A7",X"C0",X"18",X"F3",X"0D",X"20",X"0B",X"3A",X"61",X"82",X"A7",X"C0",X"21",X"24", + X"A9",X"C3",X"10",X"35",X"3A",X"66",X"82",X"A7",X"C0",X"18",X"F3",X"0D",X"20",X"0B",X"3A",X"62", + X"82",X"A7",X"C0",X"21",X"64",X"A8",X"C3",X"10",X"35",X"3A",X"67",X"82",X"A7",X"C0",X"18",X"F3", + X"36",X"2C",X"23",X"36",X"2D",X"01",X"1F",X"00",X"09",X"36",X"2E",X"23",X"36",X"2F",X"C9",X"3A", + X"FD",X"83",X"4F",X"3A",X"23",X"81",X"32",X"20",X"81",X"FE",X"01",X"CA",X"43",X"35",X"FE",X"02", + X"CA",X"58",X"35",X"FE",X"03",X"CA",X"6D",X"35",X"FE",X"04",X"CA",X"82",X"35",X"FE",X"05",X"CA", + X"97",X"35",X"C9",X"0D",X"20",X"0B",X"3A",X"5E",X"82",X"A7",X"C0",X"21",X"64",X"AB",X"C3",X"AC", + X"35",X"3A",X"63",X"82",X"A7",X"C0",X"18",X"F3",X"0D",X"20",X"0B",X"3A",X"5F",X"82",X"A7",X"C0", + X"21",X"A4",X"AA",X"C3",X"AC",X"35",X"3A",X"64",X"82",X"A7",X"C0",X"18",X"F3",X"0D",X"20",X"0B", + X"3A",X"60",X"82",X"A7",X"C0",X"21",X"E4",X"A9",X"C3",X"AC",X"35",X"3A",X"65",X"82",X"A7",X"C0", + X"18",X"F3",X"0D",X"20",X"0B",X"3A",X"61",X"82",X"A7",X"C0",X"21",X"24",X"A9",X"C3",X"AC",X"35", + X"3A",X"66",X"82",X"A7",X"C0",X"18",X"F3",X"0D",X"20",X"0B",X"3A",X"62",X"82",X"A7",X"C0",X"21", + X"64",X"A8",X"C3",X"AC",X"35",X"3A",X"67",X"82",X"A7",X"C0",X"18",X"F3",X"36",X"10",X"23",X"36", + X"10",X"01",X"1F",X"00",X"09",X"36",X"D0",X"23",X"36",X"D1",X"C9",X"3A",X"FD",X"83",X"4F",X"3A", + X"20",X"81",X"32",X"21",X"81",X"FE",X"01",X"CA",X"DF",X"35",X"FE",X"02",X"CA",X"F4",X"35",X"FE", + X"03",X"CA",X"09",X"36",X"FE",X"04",X"CA",X"1E",X"36",X"FE",X"05",X"CA",X"33",X"36",X"C9",X"0D", + X"20",X"0B",X"3A",X"5E",X"82",X"A7",X"C0",X"21",X"64",X"AB",X"C3",X"48",X"36",X"3A",X"63",X"82", + X"A7",X"C0",X"18",X"F3",X"0D",X"20",X"0B",X"3A",X"5F",X"82",X"A7",X"C0",X"21",X"A4",X"AA",X"C3", + X"48",X"36",X"3A",X"64",X"82",X"A7",X"C0",X"18",X"F3",X"0D",X"20",X"0B",X"3A",X"60",X"82",X"A7", + X"C0",X"21",X"E4",X"A9",X"C3",X"48",X"36",X"3A",X"65",X"82",X"A7",X"C0",X"18",X"F3",X"0D",X"20", + X"0B",X"3A",X"61",X"82",X"A7",X"C0",X"21",X"24",X"A9",X"C3",X"48",X"36",X"3A",X"66",X"82",X"A7", + X"C0",X"18",X"F3",X"0D",X"20",X"0B",X"3A",X"62",X"82",X"A7",X"C0",X"21",X"64",X"A8",X"C3",X"48", + X"36",X"3A",X"67",X"82",X"A7",X"C0",X"18",X"F3",X"36",X"D0",X"23",X"36",X"D1",X"01",X"1F",X"00", + X"09",X"36",X"D2",X"23",X"36",X"D3",X"C9",X"3A",X"FD",X"83",X"4F",X"3A",X"21",X"81",X"FE",X"01", + X"CA",X"78",X"36",X"FE",X"02",X"CA",X"8D",X"36",X"FE",X"03",X"CA",X"A2",X"36",X"FE",X"04",X"CA", + X"B7",X"36",X"FE",X"05",X"CA",X"CC",X"36",X"C9",X"0D",X"20",X"0B",X"3A",X"5E",X"82",X"A7",X"C0", + X"21",X"64",X"AB",X"C3",X"E1",X"36",X"3A",X"63",X"82",X"A7",X"C0",X"18",X"F3",X"0D",X"20",X"0B", + X"3A",X"5F",X"82",X"A7",X"C0",X"21",X"A4",X"AA",X"C3",X"E1",X"36",X"3A",X"64",X"82",X"A7",X"C0", + X"18",X"F3",X"0D",X"20",X"0B",X"3A",X"60",X"82",X"A7",X"C0",X"21",X"E4",X"A9",X"C3",X"E1",X"36", + X"3A",X"65",X"82",X"A7",X"C0",X"18",X"F3",X"0D",X"20",X"0B",X"3A",X"61",X"82",X"A7",X"C0",X"21", + X"24",X"A9",X"C3",X"E1",X"36",X"3A",X"66",X"82",X"A7",X"C0",X"18",X"F3",X"0D",X"20",X"0B",X"3A", + X"62",X"82",X"A7",X"C0",X"21",X"64",X"A8",X"C3",X"E1",X"36",X"3A",X"67",X"82",X"A7",X"C0",X"18", + X"F3",X"36",X"10",X"23",X"36",X"10",X"01",X"1F",X"00",X"09",X"36",X"10",X"23",X"36",X"10",X"3A", + X"04",X"80",X"A7",X"C0",X"AF",X"32",X"21",X"81",X"32",X"20",X"81",X"C9",X"3A",X"20",X"81",X"A7", + X"C2",X"1C",X"37",X"21",X"5C",X"80",X"70",X"23",X"36",X"19",X"23",X"36",X"03",X"23",X"36",X"20", + X"3E",X"A0",X"32",X"40",X"83",X"11",X"20",X"00",X"CD",X"03",X"09",X"C9",X"3E",X"01",X"32",X"04", + X"80",X"E1",X"C9",X"21",X"5C",X"80",X"AF",X"77",X"23",X"77",X"23",X"77",X"23",X"77",X"C9",X"3A", + X"34",X"81",X"A7",X"C2",X"79",X"37",X"DD",X"21",X"1B",X"81",X"DD",X"7E",X"01",X"A7",X"CC",X"96", + X"37",X"3A",X"3D",X"81",X"CB",X"47",X"C2",X"3C",X"38",X"3A",X"35",X"81",X"A7",X"20",X"01",X"C9", + X"3A",X"34",X"81",X"A7",X"20",X"23",X"CD",X"B8",X"37",X"3A",X"47",X"80",X"FE",X"5A",X"D8",X"FE", + X"68",X"D0",X"3A",X"40",X"80",X"47",X"3A",X"44",X"80",X"C6",X"04",X"B8",X"D8",X"D6",X"08",X"B8", + X"D0",X"3E",X"01",X"32",X"34",X"81",X"3E",X"18",X"DF",X"DD",X"21",X"44",X"80",X"FD",X"21",X"40", + X"80",X"DD",X"7E",X"00",X"FD",X"77",X"00",X"DD",X"7E",X"01",X"FD",X"77",X"01",X"DD",X"7E",X"03", + X"C6",X"02",X"FD",X"77",X"03",X"C9",X"3A",X"35",X"81",X"A7",X"C0",X"21",X"3D",X"81",X"34",X"21", + X"41",X"80",X"36",X"1E",X"23",X"36",X"04",X"23",X"36",X"60",X"3E",X"01",X"32",X"35",X"81",X"32", + X"3D",X"83",X"3E",X"3C",X"32",X"3E",X"83",X"C9",X"21",X"3E",X"83",X"7E",X"A7",X"28",X"2B",X"35", + X"3E",X"3C",X"CB",X"3F",X"BE",X"20",X"0F",X"2B",X"7E",X"A7",X"3E",X"21",X"32",X"41",X"80",X"F0", + X"3E",X"A1",X"32",X"41",X"80",X"C9",X"2B",X"7E",X"E6",X"7F",X"21",X"28",X"38",X"3C",X"CD",X"23", + X"38",X"7E",X"21",X"1C",X"81",X"86",X"32",X"40",X"80",X"C9",X"2B",X"7E",X"A7",X"F2",X"F2",X"37", + X"35",X"35",X"34",X"7E",X"E6",X"7F",X"21",X"28",X"38",X"CD",X"23",X"38",X"7E",X"FE",X"01",X"38", + X"0A",X"28",X"1A",X"21",X"1C",X"81",X"86",X"32",X"40",X"80",X"C9",X"21",X"3D",X"83",X"7E",X"EE", + X"80",X"77",X"3E",X"3C",X"32",X"3E",X"83",X"3E",X"1E",X"32",X"41",X"80",X"C9",X"3E",X"3C",X"32", + X"3E",X"83",X"C9",X"85",X"6F",X"D0",X"24",X"C9",X"00",X"EE",X"EC",X"EA",X"E8",X"E6",X"E4",X"E2", + X"E0",X"01",X"DE",X"DC",X"DA",X"D8",X"D6",X"D4",X"D2",X"D0",X"00",X"D0",X"3A",X"35",X"81",X"A7", + X"C8",X"AF",X"32",X"34",X"81",X"21",X"40",X"80",X"AF",X"77",X"23",X"77",X"23",X"77",X"23",X"77", + X"32",X"35",X"81",X"C9",X"21",X"40",X"80",X"70",X"23",X"36",X"19",X"23",X"36",X"03",X"23",X"36", + X"10",X"3E",X"A0",X"32",X"40",X"83",X"C9",X"21",X"40",X"80",X"AF",X"77",X"23",X"77",X"23",X"77", + X"23",X"77",X"C9",X"3A",X"B7",X"83",X"FE",X"02",X"DA",X"FC",X"38",X"FE",X"05",X"D2",X"FD",X"38", + X"3A",X"01",X"81",X"A7",X"CC",X"15",X"39",X"3A",X"4F",X"81",X"A7",X"C8",X"21",X"46",X"81",X"7E", + X"23",X"BE",X"C2",X"39",X"39",X"35",X"11",X"06",X"A8",X"3A",X"50",X"81",X"CB",X"47",X"CA",X"F6", + X"38",X"21",X"9C",X"24",X"AF",X"47",X"3A",X"4E",X"81",X"4F",X"3C",X"3C",X"32",X"4E",X"81",X"09", + X"06",X"00",X"EB",X"3A",X"45",X"81",X"4F",X"09",X"EB",X"0E",X"20",X"3A",X"45",X"81",X"81",X"32", + X"45",X"81",X"7E",X"12",X"23",X"13",X"7E",X"12",X"3A",X"4E",X"81",X"FE",X"10",X"D8",X"AF",X"32", + X"4F",X"81",X"32",X"4E",X"81",X"32",X"45",X"81",X"32",X"46",X"81",X"32",X"47",X"81",X"C9",X"3A", + X"FE",X"83",X"FE",X"02",X"C0",X"AF",X"32",X"4F",X"81",X"32",X"4E",X"81",X"32",X"45",X"81",X"32", + X"46",X"81",X"32",X"47",X"81",X"C9",X"21",X"8C",X"24",X"C3",X"A4",X"38",X"C9",X"3A",X"01",X"81", + X"A7",X"CC",X"07",X"39",X"C3",X"87",X"38",X"3A",X"4F",X"81",X"A7",X"C0",X"3E",X"01",X"32",X"50", + X"81",X"CD",X"25",X"39",X"C9",X"3A",X"4F",X"81",X"A7",X"C0",X"3A",X"50",X"81",X"3C",X"32",X"50", + X"81",X"CD",X"25",X"39",X"C9",X"3A",X"9B",X"81",X"E6",X"0F",X"87",X"87",X"87",X"21",X"46",X"81", + X"77",X"23",X"77",X"3E",X"01",X"32",X"4F",X"81",X"C9",X"7E",X"A7",X"28",X"02",X"35",X"C9",X"3A", + X"46",X"81",X"77",X"C9",X"3A",X"50",X"81",X"CB",X"47",X"C8",X"3A",X"B7",X"83",X"FE",X"02",X"D8", + X"3A",X"47",X"80",X"C6",X"08",X"FE",X"2A",X"D8",X"FE",X"3B",X"D0",X"3A",X"44",X"80",X"C6",X"08", + X"47",X"3A",X"01",X"81",X"4F",X"C6",X"08",X"B8",X"D8",X"79",X"D6",X"20",X"B8",X"D0",X"79",X"D6", + X"08",X"B8",X"30",X"04",X"CD",X"59",X"23",X"C9",X"3E",X"01",X"32",X"04",X"80",X"21",X"46",X"A8", + X"36",X"68",X"23",X"36",X"69",X"01",X"1F",X"00",X"09",X"36",X"6A",X"23",X"36",X"6B",X"C9",X"3A", + X"FE",X"83",X"A7",X"C8",X"3A",X"A2",X"81",X"FE",X"0F",X"D0",X"FE",X"02",X"D8",X"3A",X"40",X"81", + X"A7",X"C0",X"3E",X"D0",X"DF",X"C9",X"3A",X"01",X"81",X"A7",X"20",X"05",X"AF",X"32",X"3F",X"83", + X"C9",X"3A",X"50",X"81",X"CB",X"47",X"C8",X"3A",X"4F",X"81",X"A7",X"C0",X"21",X"3F",X"83",X"34", + X"7E",X"FE",X"40",X"28",X"05",X"FE",X"70",X"28",X"13",X"C9",X"21",X"46",X"A8",X"36",X"68",X"23", + X"36",X"69",X"01",X"1F",X"00",X"09",X"36",X"6A",X"23",X"36",X"6B",X"C9",X"21",X"46",X"A8",X"36", + X"D0",X"23",X"36",X"D1",X"01",X"1F",X"00",X"09",X"36",X"D2",X"23",X"36",X"D3",X"AF",X"32",X"3F", + X"83",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"21",X"E2",X"83",X"7E",X"B7",X"3A",X"00",X"E0",X"2F",X"20",X"04",X"E6",X"C4",X"77",X"C9",X"E6", + X"C4",X"C0",X"3C",X"CD",X"A7",X"07",X"AF",X"32",X"86",X"83",X"ED",X"5B",X"D4",X"83",X"CB",X"76", + X"C2",X"3E",X"3E",X"CB",X"56",X"77",X"20",X"09",X"3C",X"32",X"18",X"B8",X"3E",X"04",X"32",X"7E", + X"83",X"21",X"36",X"3E",X"19",X"E9",X"18",X"24",X"18",X"1B",X"18",X"19",X"18",X"1E",X"77",X"3C", + X"32",X"1C",X"B8",X"3E",X"04",X"32",X"7F",X"83",X"21",X"4D",X"3E",X"19",X"E9",X"18",X"0D",X"18", + X"04",X"18",X"11",X"18",X"13",X"21",X"E3",X"83",X"34",X"CB",X"46",X"C0",X"0E",X"01",X"18",X"0A", + X"0E",X"02",X"18",X"06",X"0E",X"03",X"18",X"02",X"0E",X"06",X"3A",X"E1",X"83",X"81",X"27",X"30", + X"02",X"3E",X"99",X"32",X"E1",X"83",X"3A",X"FE",X"83",X"B7",X"C0",X"3A",X"D6",X"83",X"FE",X"05", + X"CC",X"13",X"0D",X"3E",X"05",X"32",X"D6",X"83",X"AF",X"32",X"D8",X"83",X"21",X"40",X"80",X"11", + X"41",X"80",X"01",X"1F",X"00",X"70",X"ED",X"B0",X"C3",X"8A",X"0B",X"21",X"D8",X"83",X"36",X"FF", + X"CD",X"79",X"07",X"AF",X"32",X"9B",X"82",X"32",X"21",X"80",X"3E",X"05",X"32",X"1B",X"80",X"3E", + X"03",X"32",X"2B",X"80",X"11",X"F2",X"0F",X"21",X"8D",X"AA",X"06",X"0B",X"EF",X"3A",X"E4",X"83", + X"FE",X"0A",X"D0",X"21",X"15",X"AB",X"CD",X"CC",X"0B",X"11",X"3F",X"10",X"06",X"07",X"EF",X"11", + X"09",X"10",X"06",X"04",X"EF",X"11",X"28",X"10",X"06",X"07",X"EF",X"C9",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_SND_0.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_SND_0.vhd new file mode 100644 index 00000000..257b776b --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_SND_0.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_SND_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_SND_0 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"05",X"00",X"22",X"00",X"40",X"C3",X"0B",X"02",X"D3",X"80",X"78",X"D3",X"40",X"CA",X"FF",X"FF", + X"C3",X"B7",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"7C",X"01",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C3",X"C7",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"3C",X"01",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C3",X"60",X"01",X"3D",X"FF",X"CA",X"FF",X"FF",X"08",X"DA",X"22",X"6E",X"00",X"E6",X"3D",X"0D", + X"CE",X"C2",X"01",X"B7",X"28",X"2B",X"57",X"FD",X"FF",X"20",X"02",X"C7",X"E5",X"0F",X"4F",X"79", + X"AA",X"28",X"07",X"7A",X"B7",X"28",X"03",X"79",X"18",X"3E",X"79",X"E5",X"0F",X"20",X"38",X"79", + X"C5",X"11",X"07",X"07",X"07",X"CB",X"7F",X"28",X"2D",X"CB",X"BF",X"18",X"13",X"DA",X"08",X"FB", + X"CA",X"05",X"05",X"22",X"40",X"40",X"77",X"23",X"10",X"FC",X"3D",X"07",X"05",X"3F",X"CF",X"CA", + X"CE",X"E5",X"00",X"D0",X"CE",X"8C",X"00",X"AF",X"77",X"23",X"77",X"CA",X"47",X"22",X"3D",X"40", + X"12",X"01",X"00",X"1A",X"10",X"FE",X"CA",X"31",X"45",X"40",X"CE",X"E5",X"00",X"D8",X"CE",X"E5", + X"00",X"38",X"38",X"39",X"40",X"40",X"CE",X"01",X"02",X"47",X"39",X"41",X"40",X"CE",X"01",X"02", + X"4F",X"39",X"44",X"40",X"CE",X"01",X"02",X"31",X"4A",X"40",X"39",X"45",X"40",X"CE",X"01",X"02", + X"5F",X"22",X"4A",X"40",X"55",X"78",X"BA",X"38",X"02",X"7A",X"B9",X"38",X"02",X"79",X"BB",X"D0", + X"1D",X"02",X"B8",X"28",X"06",X"1C",X"BA",X"28",X"02",X"1C",X"7B",X"CE",X"8C",X"00",X"39",X"45", + X"40",X"77",X"23",X"35",X"00",X"CA",X"0D",X"02",X"22",X"40",X"40",X"BD",X"28",X"0D",X"0C",X"23", + X"23",X"BD",X"28",X"08",X"0C",X"23",X"23",X"BD",X"28",X"01",X"AF",X"CA",X"23",X"35",X"00",X"7A", + X"37",X"CA",X"22",X"83",X"01",X"5F",X"15",X"00",X"1A",X"7D",X"CA",X"70",X"23",X"7C",X"D5",X"44", + X"20",X"FA",X"FA",X"3E",X"31",X"80",X"41",X"EE",X"55",X"12",X"3F",X"00",X"CE",X"6E",X"01",X"3D", + X"08",X"05",X"00",X"CF",X"3D",X"0A",X"CF",X"3D",X"09",X"CF",X"3D",X"07",X"05",X"3F",X"CF",X"22", + X"00",X"60",X"21",X"4D",X"40",X"77",X"FB",X"22",X"3F",X"40",X"34",X"3D",X"0F",X"CE",X"C2",X"01", + X"E5",X"08",X"20",X"F7",X"3D",X"0F",X"CE",X"C2",X"01",X"E5",X"08",X"28",X"F7",X"F3",X"3D",X"02", + X"31",X"4B",X"40",X"22",X"42",X"40",X"7D",X"2B",X"B7",X"28",X"30",X"7D",X"CE",X"E8",X"02",X"FB", + X"00",X"00",X"00",X"F3",X"22",X"4B",X"40",X"34",X"22",X"43",X"40",X"7D",X"2B",X"B7",X"28",X"22", + X"7D",X"CE",X"E8",X"02",X"FB",X"00",X"00",X"00",X"F3",X"22",X"4B",X"40",X"34",X"22",X"46",X"40", + X"7D",X"2B",X"B7",X"28",X"11",X"7D",X"CE",X"E8",X"02",X"18",X"AB",X"7D",X"CE",X"DA",X"02",X"18", + X"CD",X"7D",X"CE",X"DA",X"02",X"18",X"DE",X"7D",X"CE",X"DA",X"02",X"18",X"9A",X"87",X"5F",X"15", + X"00",X"1A",X"5D",X"23",X"55",X"EB",X"EA",X"9C",X"01",X"0F",X"03",X"BE",X"03",X"5E",X"04",X"81", + X"14",X"66",X"14",X"9E",X"0B",X"8E",X"04",X"67",X"0B",X"7F",X"07",X"8B",X"07",X"8D",X"07",X"B0", + X"09",X"C4",X"09",X"8C",X"0B",X"16",X"10",X"EB",X"05",X"3B",X"0B",X"53",X"0B",X"5E",X"0B",X"00", + X"00",X"06",X"06",X"23",X"10",X"C3",X"06",X"3E",X"05",X"22",X"A7",X"02",X"CE",X"9E",X"02",X"39", + X"4B",X"40",X"CE",X"8C",X"00",X"23",X"77",X"CA",X"B7",X"C8",X"22",X"26",X"01",X"E6",X"22",X"F3", + X"02",X"18",X"A9",X"33",X"00",X"33",X"03",X"D1",X"03",X"76",X"04",X"8C",X"14",X"71",X"14",X"A7", + X"0B",X"A9",X"04",X"8F",X"0B",X"92",X"07",X"97",X"07",X"9E",X"07",X"BE",X"09",X"C7",X"09",X"95", + X"0B",X"25",X"10",X"0D",X"07",X"4C",X"0B",X"55",X"0B",X"60",X"0B",X"00",X"00",X"1C",X"06",X"2E", + X"10",X"E6",X"06",X"62",X"05",X"B7",X"C8",X"CE",X"9C",X"01",X"39",X"4B",X"40",X"C3",X"84",X"00", + X"39",X"4B",X"40",X"E5",X"03",X"C8",X"C5",X"07",X"05",X"00",X"CF",X"CA",X"39",X"4B",X"40",X"3E", + X"87",X"47",X"CE",X"0A",X"03",X"04",X"78",X"D3",X"80",X"7C",X"D3",X"40",X"CA",X"39",X"4B",X"40", + X"3E",X"87",X"47",X"D3",X"80",X"DB",X"40",X"6F",X"04",X"78",X"D3",X"80",X"DB",X"40",X"67",X"CA", + X"12",X"04",X"7F",X"39",X"4B",X"40",X"47",X"CB",X"01",X"CB",X"03",X"10",X"F9",X"3D",X"07",X"D3", + X"80",X"39",X"4C",X"40",X"A1",X"B3",X"31",X"4C",X"40",X"D3",X"40",X"CA",X"39",X"4B",X"40",X"C5", + X"07",X"CF",X"CA",X"00",X"06",X"09",X"0E",X"18",X"07",X"0D",X"0C",X"05",X"16",X"14",X"13",X"10", + X"0F",X"04",X"15",X"03",X"11",X"12",X"01",X"0A",X"08",X"02",X"15",X"17",X"39",X"4B",X"40",X"47", + X"3D",X"84",X"07",X"10",X"FE",X"5F",X"15",X"FF",X"CE",X"6E",X"01",X"CE",X"30",X"01",X"18",X"17", + X"12",X"80",X"FB",X"18",X"AD",X"CF",X"CA",X"39",X"4B",X"40",X"E5",X"03",X"C8",X"C5",X"07",X"18", + X"00",X"D3",X"80",X"DB",X"40",X"47",X"CA",X"02",X"00",X"00",X"12",X"FF",X"FC",X"39",X"4B",X"40", + X"FD",X"01",X"28",X"16",X"38",X"08",X"15",X"F3",X"CB",X"00",X"CB",X"00",X"18",X"0B",X"12",X"3F", + X"FF",X"CB",X"38",X"CB",X"1A",X"CB",X"38",X"CB",X"1A",X"29",X"4D",X"40",X"7C",X"A1",X"B0",X"67", + X"7E",X"A3",X"B2",X"6F",X"21",X"4D",X"40",X"77",X"CA",X"02",X"00",X"03",X"C3",X"C9",X"01",X"02", + X"00",X"02",X"18",X"C5",X"02",X"00",X"01",X"18",X"C2",X"D3",X"80",X"7E",X"D3",X"40",X"CA",X"E7", + X"3D",X"20",X"22",X"60",X"40",X"77",X"3D",X"03",X"23",X"77",X"3D",X"14",X"23",X"77",X"3D",X"02", + X"23",X"77",X"AF",X"23",X"77",X"22",X"10",X"00",X"21",X"66",X"40",X"2D",X"20",X"EF",X"F7",X"05", + X"0A",X"DF",X"CA",X"39",X"64",X"40",X"A7",X"28",X"0E",X"FD",X"02",X"28",X"1F",X"FD",X"03",X"38", + X"2B",X"28",X"4A",X"C3",X"72",X"05",X"22",X"60",X"40",X"36",X"20",X"6F",X"35",X"20",X"D7",X"3E", + X"28",X"04",X"47",X"DF",X"18",X"66",X"22",X"64",X"40",X"34",X"18",X"F5",X"22",X"00",X"03",X"21", + X"67",X"40",X"EF",X"05",X"08",X"DF",X"22",X"64",X"40",X"34",X"18",X"4F",X"22",X"62",X"40",X"36", + X"20",X"4A",X"35",X"03",X"CE",X"4E",X"01",X"B7",X"12",X"08",X"00",X"EE",X"51",X"EF",X"22",X"61", + X"40",X"36",X"20",X"37",X"35",X"14",X"22",X"64",X"40",X"34",X"18",X"2F",X"22",X"63",X"40",X"36", + X"20",X"1E",X"35",X"02",X"B7",X"29",X"67",X"40",X"12",X"20",X"00",X"EE",X"51",X"21",X"67",X"40", + X"EF",X"29",X"66",X"40",X"2B",X"7E",X"B4",X"20",X"0B",X"22",X"64",X"40",X"34",X"18",X"0C",X"29", + X"67",X"40",X"18",X"EC",X"21",X"66",X"40",X"22",X"64",X"40",X"36",X"AF",X"CA",X"3D",X"80",X"31", + X"5E",X"40",X"05",X"0D",X"CE",X"7C",X"01",X"22",X"70",X"00",X"CE",X"3C",X"01",X"F7",X"CE",X"04", + X"03",X"CA",X"39",X"5E",X"40",X"3E",X"31",X"5E",X"40",X"28",X"26",X"FD",X"FF",X"28",X"39",X"FD", + X"20",X"38",X"09",X"FD",X"30",X"38",X"0C",X"FD",X"70",X"38",X"01",X"AF",X"CA",X"05",X"00",X"CE", + X"7C",X"01",X"CA",X"22",X"3C",X"00",X"CE",X"3C",X"01",X"05",X"0B",X"CE",X"7C",X"01",X"AF",X"CA", + X"CE",X"04",X"03",X"3D",X"80",X"31",X"5D",X"40",X"05",X"09",X"CE",X"7C",X"01",X"22",X"FC",X"00", + X"CE",X"3C",X"01",X"F7",X"AF",X"31",X"5E",X"40",X"CA",X"39",X"5D",X"40",X"3E",X"31",X"5D",X"40", + X"FD",X"42",X"38",X"0B",X"CE",X"4E",X"01",X"2E",X"2E",X"EF",X"AF",X"31",X"5E",X"40",X"CA",X"FD", + X"40",X"28",X"0D",X"B7",X"28",X"12",X"CE",X"4E",X"01",X"2C",X"2C",X"EF",X"AF",X"31",X"5E",X"40", + X"CA",X"D7",X"06",X"DF",X"C3",X"33",X"04",X"D7",X"06",X"28",X"0F",X"DF",X"22",X"00",X"00",X"CE", + X"3C",X"01",X"3D",X"80",X"31",X"5D",X"40",X"C3",X"1A",X"04",X"3D",X"FF",X"CA",X"CE",X"C7",X"01", + X"CE",X"60",X"01",X"22",X"00",X"02",X"CE",X"3C",X"01",X"05",X"09",X"CE",X"7C",X"01",X"22",X"90", + X"01",X"21",X"30",X"42",X"CA",X"29",X"30",X"42",X"2B",X"21",X"30",X"42",X"7C",X"B6",X"3D",X"FF", + X"C8",X"CE",X"4E",X"01",X"12",X"03",X"00",X"1A",X"CE",X"3C",X"01",X"AF",X"CA",X"E7",X"3D",X"08", + X"31",X"70",X"42",X"3D",X"0C",X"31",X"72",X"42",X"3D",X"10",X"31",X"71",X"42",X"AF",X"31",X"73", + X"42",X"22",X"50",X"00",X"EF",X"F7",X"05",X"00",X"DF",X"CA",X"39",X"73",X"42",X"A7",X"28",X"17", + X"FD",X"02",X"28",X"22",X"FD",X"03",X"38",X"21",X"28",X"2C",X"22",X"71",X"42",X"36",X"3D",X"FF", + X"C8",X"AF",X"31",X"73",X"42",X"AF",X"CA",X"D7",X"3C",X"FD",X"0E",X"20",X"04",X"22",X"73",X"42", + X"34",X"47",X"DF",X"18",X"F0",X"CE",X"EB",X"04",X"18",X"EB",X"D7",X"3E",X"20",X"04",X"22",X"73", + X"42",X"34",X"47",X"DF",X"18",X"DF",X"CE",X"F8",X"04",X"18",X"D9",X"22",X"70",X"42",X"36",X"C0", + X"3D",X"08",X"77",X"22",X"73",X"42",X"34",X"CA",X"22",X"72",X"42",X"36",X"C0",X"3D",X"0C",X"77", + X"22",X"73",X"42",X"34",X"CA",X"CE",X"04",X"03",X"22",X"00",X"02",X"21",X"75",X"42",X"F7",X"05", + X"05",X"DF",X"3D",X"08",X"31",X"76",X"42",X"AF",X"31",X"78",X"42",X"CA",X"39",X"78",X"42",X"FD", + X"02",X"28",X"34",X"FD",X"01",X"28",X"48",X"FD",X"03",X"28",X"6A",X"FD",X"04",X"28",X"75",X"22", + X"76",X"42",X"36",X"20",X"15",X"35",X"08",X"12",X"F0",X"FF",X"29",X"75",X"42",X"1A",X"21",X"75", + X"42",X"7C",X"A7",X"20",X"06",X"7E",X"FD",X"38",X"38",X"03",X"EF",X"AF",X"CA",X"3D",X"20",X"31", + X"76",X"42",X"44",X"3D",X"02",X"18",X"11",X"22",X"76",X"42",X"36",X"20",X"ED",X"35",X"06",X"3D", + X"03",X"22",X"60",X"00",X"05",X"01",X"21",X"75",X"42",X"31",X"78",X"42",X"DF",X"AF",X"CA",X"22", + X"76",X"42",X"36",X"20",X"D5",X"35",X"05",X"12",X"FC",X"FF",X"29",X"75",X"42",X"1A",X"21",X"75", + X"42",X"7C",X"A7",X"20",X"C6",X"7E",X"FD",X"30",X"30",X"C0",X"3D",X"30",X"31",X"76",X"42",X"44", + X"3D",X"03",X"18",X"D6",X"22",X"76",X"42",X"36",X"20",X"B2",X"35",X"04",X"3D",X"04",X"22",X"60", + X"00",X"05",X"04",X"18",X"C2",X"22",X"76",X"42",X"36",X"20",X"A0",X"35",X"04",X"12",X"10",X"00", + X"29",X"75",X"42",X"1A",X"21",X"75",X"42",X"7C",X"A7",X"28",X"8F",X"7E",X"FD",X"80",X"38",X"89", + X"C3",X"06",X"06",X"AF",X"22",X"10",X"42",X"77",X"23",X"35",X"04",X"23",X"35",X"04",X"23",X"35", + X"04",X"23",X"35",X"68",X"CE",X"B0",X"01",X"3D",X"05",X"05",X"18",X"CF",X"05",X"04",X"CE",X"7C", + X"01",X"CE",X"C7",X"01",X"CA",X"CE",X"1C",X"05",X"CE",X"EE",X"06",X"AF",X"CA",X"39",X"10",X"42", + X"CB",X"47",X"28",X"10",X"22",X"11",X"42",X"36",X"C0",X"35",X"04",X"05",X"00",X"CE",X"7C",X"01", + X"0D",X"02",X"18",X"10",X"22",X"12",X"42",X"36",X"C0",X"35",X"04",X"39",X"13",X"42",X"47",X"CE", + X"7C",X"01",X"0D",X"02",X"39",X"10",X"42",X"AA",X"31",X"10",X"42",X"CA",X"22",X"14",X"42",X"36", + X"C0",X"35",X"68",X"22",X"13",X"42",X"39",X"10",X"42",X"CB",X"4F",X"20",X"0A",X"34",X"3D",X"07", + X"BD",X"0D",X"01",X"28",X"DF",X"CA",X"36",X"7D",X"3C",X"C0",X"E2",X"3E",X"CA",X"E7",X"3D",X"20", + X"22",X"E0",X"42",X"77",X"3D",X"03",X"23",X"77",X"3D",X"14",X"23",X"77",X"3D",X"02",X"23",X"77", + X"23",X"35",X"00",X"22",X"10",X"00",X"21",X"E6",X"42",X"2D",X"20",X"EF",X"F7",X"05",X"0A",X"DF", + X"CA",X"39",X"E4",X"42",X"A7",X"28",X"1C",X"FD",X"02",X"28",X"1F",X"FD",X"03",X"38",X"2B",X"28", + X"4A",X"D7",X"3E",X"28",X"04",X"47",X"DF",X"AF",X"CA",X"AF",X"31",X"A6",X"41",X"3E",X"CA",X"47", + X"DF",X"18",X"65",X"22",X"E4",X"42",X"34",X"AF",X"18",X"F6",X"22",X"00",X"03",X"21",X"E7",X"42", + X"EF",X"05",X"08",X"DF",X"22",X"E4",X"42",X"34",X"18",X"4F",X"22",X"E2",X"42",X"36",X"20",X"4A", + X"35",X"03",X"CE",X"4E",X"01",X"B7",X"12",X"08",X"00",X"EE",X"51",X"EF",X"22",X"E1",X"42",X"36", + X"20",X"37",X"35",X"14",X"22",X"E4",X"42",X"34",X"18",X"2F",X"22",X"E3",X"42",X"36",X"20",X"1E", + X"35",X"02",X"B7",X"29",X"E7",X"42",X"12",X"20",X"00",X"EE",X"51",X"21",X"E7",X"42",X"EF",X"29", + X"E6",X"42",X"2B",X"7E",X"B4",X"20",X"0B",X"22",X"E4",X"42",X"34",X"18",X"0C",X"29",X"E7",X"42", + X"18",X"EC",X"21",X"E6",X"42",X"22",X"E4",X"42",X"36",X"AF",X"CA",X"22",X"50",X"00",X"21",X"80", + X"42",X"22",X"24",X"0A",X"21",X"81",X"42",X"3D",X"00",X"31",X"84",X"42",X"05",X"0E",X"CE",X"7C", + X"01",X"22",X"50",X"00",X"CE",X"3C",X"01",X"CE",X"60",X"01",X"CE",X"C7",X"01",X"CA",X"29",X"80", + X"42",X"2B",X"21",X"80",X"42",X"7C",X"B6",X"3D",X"00",X"28",X"47",X"39",X"84",X"42",X"CB",X"47", + X"3D",X"00",X"28",X"0D",X"22",X"81",X"42",X"36",X"C0",X"35",X"24",X"05",X"0E",X"CE",X"7C",X"01", + X"18",X"26",X"CE",X"4E",X"01",X"12",X"09",X"00",X"39",X"84",X"42",X"CB",X"4F",X"28",X"04",X"AF", + X"EE",X"51",X"3D",X"1A",X"CE",X"3C",X"01",X"0D",X"01",X"CE",X"5A",X"07",X"22",X"83",X"42",X"36", + X"C0",X"35",X"0A",X"47",X"CE",X"7C",X"01",X"0D",X"02",X"39",X"84",X"42",X"AA",X"31",X"84",X"42", + X"AF",X"CA",X"22",X"84",X"42",X"CB",X"55",X"20",X"0D",X"CE",X"EB",X"05",X"05",X"00",X"CE",X"7C", + X"01",X"22",X"84",X"42",X"CB",X"D5",X"CA",X"05",X"00",X"CE",X"7C",X"01",X"3D",X"FF",X"CA",X"E7", + X"AF",X"31",X"C8",X"41",X"31",X"A3",X"41",X"F7",X"C3",X"62",X"0A",X"E7",X"F7",X"CA",X"E7",X"F7", + X"CA",X"DE",X"22",X"80",X"41",X"18",X"09",X"DE",X"22",X"88",X"41",X"18",X"04",X"DE",X"22",X"90", + X"41",X"DE",X"7D",X"00",X"FD",X"FF",X"28",X"06",X"CE",X"B7",X"07",X"AF",X"CA",X"AF",X"31",X"A6", + X"41",X"31",X"A5",X"41",X"3D",X"FF",X"CA",X"DE",X"36",X"02",X"C0",X"39",X"A1",X"41",X"DE",X"77", + X"02",X"DE",X"CB",X"00",X"45",X"C1",X"D6",X"07",X"DE",X"7D",X"07",X"D5",X"02",X"F9",X"D6",X"07", + X"DE",X"77",X"07",X"47",X"DF",X"DE",X"36",X"00",X"C0",X"DE",X"6D",X"01",X"DE",X"65",X"03",X"7D", + X"47",X"E5",X"1F",X"C9",X"69",X"08",X"FD",X"1F",X"C1",X"84",X"08",X"23",X"DE",X"76",X"01",X"DE", + X"74",X"03",X"78",X"E5",X"E0",X"0F",X"0F",X"0F",X"0F",X"4F",X"05",X"00",X"22",X"06",X"08",X"0A"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_SND_1.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_SND_1.vhd new file mode 100644 index 00000000..faad7684 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_SND_1.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_SND_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_SND_1 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"5E",X"23",X"56",X"D5",X"C9",X"15",X"08",X"2F",X"08",X"45",X"08",X"62",X"08",X"62",X"08",X"62", + X"08",X"62",X"08",X"62",X"08",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"4E",X"CB",X"21",X"06",X"00", + X"21",X"B3",X"08",X"09",X"5E",X"23",X"56",X"DD",X"73",X"04",X"DD",X"72",X"05",X"18",X"23",X"DD", + X"6E",X"02",X"DD",X"66",X"03",X"4E",X"06",X"00",X"21",X"4B",X"09",X"09",X"7E",X"32",X"A2",X"42", + X"DD",X"77",X"01",X"18",X"0D",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"7E",X"DD",X"77",X"06",X"DD", + X"77",X"07",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"23",X"DD",X"75",X"02",X"DD",X"74",X"03",X"C3", + X"D9",X"07",X"06",X"00",X"DF",X"DD",X"36",X"00",X"FF",X"C9",X"CD",X"72",X"08",X"06",X"00",X"DF", + X"18",X"33",X"78",X"E6",X"E0",X"07",X"07",X"07",X"47",X"3E",X"01",X"10",X"04",X"DD",X"77",X"00", + X"C9",X"07",X"18",X"F7",X"C5",X"CD",X"72",X"08",X"C1",X"78",X"E6",X"1F",X"3D",X"07",X"4F",X"06", + X"00",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"09",X"5E",X"23",X"56",X"EB",X"EF",X"DD",X"46",X"06", + X"78",X"DD",X"77",X"07",X"DF",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"23",X"DD",X"75",X"02",X"DD", + X"74",X"03",X"C9",X"D3",X"08",X"D7",X"08",X"DB",X"08",X"DF",X"08",X"E3",X"08",X"E7",X"08",X"EB", + X"08",X"EF",X"08",X"F3",X"08",X"F7",X"08",X"FB",X"08",X"FF",X"08",X"03",X"09",X"07",X"09",X"0B", + X"09",X"0F",X"09",X"6B",X"08",X"F2",X"07",X"80",X"07",X"14",X"07",X"AE",X"06",X"4E",X"06",X"F3", + X"05",X"9E",X"05",X"4E",X"05",X"01",X"05",X"B9",X"04",X"76",X"04",X"36",X"04",X"F9",X"03",X"C0", + X"03",X"8A",X"03",X"57",X"03",X"27",X"03",X"FA",X"02",X"CF",X"02",X"A7",X"02",X"81",X"02",X"5D", + X"02",X"3B",X"02",X"1B",X"02",X"FD",X"01",X"E0",X"01",X"C5",X"01",X"AC",X"01",X"94",X"01",X"7D", + X"01",X"68",X"01",X"53",X"01",X"40",X"01",X"2E",X"01",X"1D",X"01",X"0D",X"01",X"FE",X"00",X"F0", + X"00",X"E3",X"00",X"D6",X"00",X"CA",X"00",X"BE",X"00",X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97", + X"00",X"8F",X"00",X"87",X"00",X"7F",X"00",X"78",X"00",X"71",X"00",X"6B",X"00",X"65",X"00",X"5F", + X"00",X"5A",X"00",X"55",X"00",X"50",X"00",X"4C",X"00",X"47",X"00",X"04",X"08",X"34",X"2C",X"25", + X"21",X"1D",X"1A",X"18",X"16",X"14",X"13",X"11",X"10",X"0F",X"0A",X"21",X"A5",X"42",X"7E",X"A7", + X"C0",X"21",X"93",X"09",X"11",X"80",X"42",X"01",X"18",X"00",X"ED",X"B0",X"3A",X"A3",X"42",X"87", + X"4F",X"87",X"81",X"4F",X"06",X"00",X"21",X"AB",X"09",X"09",X"11",X"82",X"42",X"CD",X"89",X"09", + X"11",X"8A",X"42",X"CD",X"89",X"09",X"11",X"92",X"42",X"7E",X"12",X"CD",X"90",X"09",X"7E",X"12", + X"23",X"13",X"C9",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"47",X"0A",X"6A",X"0A",X"8D", + X"0A",X"CE",X"0A",X"E7",X"0A",X"3A",X"0B",X"FB",X"0A",X"19",X"0B",X"3A",X"0B",X"15",X"0C",X"3A", + X"0B",X"3A",X"0B",X"00",X"00",X"00",X"00",X"00",X"00",X"B5",X"0B",X"E6",X"0B",X"3A",X"0B",X"2A", + X"0C",X"55",X"0C",X"3A",X"0B",X"7E",X"0C",X"BA",X"0C",X"3A",X"0B",X"EE",X"0C",X"1A",X"0D",X"3A", + X"0B",X"43",X"0D",X"7B",X"0D",X"3A",X"0B",X"9F",X"0D",X"D2",X"0D",X"3A",X"0B",X"03",X"0E",X"5C", + X"0E",X"3A",X"0B",X"81",X"0E",X"B0",X"0E",X"3A",X"0B",X"DD",X"0E",X"13",X"0F",X"3A",X"0B",X"47", + X"0F",X"78",X"0F",X"3A",X"0B",X"A7",X"0F",X"E2",X"0F",X"3A",X"0B",X"74",X"11",X"C7",X"11",X"3A", + X"0B",X"F1",X"11",X"17",X"12",X"3A",X"0B",X"18",X"12",X"40",X"12",X"3A",X"0B",X"66",X"12",X"92", + X"12",X"3A",X"0B",X"BE",X"12",X"DD",X"12",X"3A",X"0B",X"F6",X"12",X"19",X"13",X"3A",X"0B",X"3A", + X"13",X"7A",X"13",X"3A",X"0B",X"B8",X"13",X"EC",X"13",X"3A",X"0B",X"1E",X"14",X"48",X"14",X"3A", + X"0B",X"34",X"10",X"CA",X"10",X"3A",X"0B",X"1F",X"0B",X"3F",X"0A",X"5F",X"07",X"91",X"8D",X"8D", + X"8D",X"91",X"8D",X"8D",X"8D",X"92",X"92",X"91",X"91",X"AF",X"A0",X"92",X"92",X"91",X"91",X"8F", + X"8F",X"96",X"96",X"94",X"92",X"91",X"8F",X"AD",X"A0",X"FF",X"1F",X"05",X"5F",X"07",X"8D",X"91", + X"88",X"91",X"8D",X"91",X"88",X"91",X"8F",X"92",X"88",X"92",X"8F",X"92",X"88",X"92",X"8F",X"92", + X"88",X"92",X"8F",X"92",X"88",X"92",X"8F",X"92",X"88",X"92",X"B1",X"A0",X"FF",X"1F",X"05",X"5F", + X"07",X"80",X"8D",X"80",X"8D",X"80",X"8D",X"80",X"8D",X"80",X"8F",X"80",X"8F",X"80",X"8F",X"80", + X"8F",X"80",X"8F",X"80",X"8F",X"80",X"8F",X"80",X"8F",X"80",X"8F",X"80",X"8F",X"AD",X"A0",X"FF", + X"E7",X"3E",X"01",X"32",X"A3",X"42",X"32",X"A6",X"42",X"F7",X"C3",X"61",X"09",X"DD",X"21",X"80", + X"42",X"C3",X"A1",X"07",X"E7",X"F7",X"C9",X"DD",X"21",X"88",X"42",X"C3",X"A1",X"07",X"1F",X"0C", + X"3F",X"0F",X"5F",X"07",X"AD",X"80",X"8A",X"B2",X"B2",X"B6",X"74",X"72",X"71",X"6F",X"CD",X"AB", + X"AD",X"A8",X"AD",X"AA",X"AD",X"C6",X"FF",X"1F",X"06",X"5F",X"07",X"AA",X"AD",X"AA",X"AD",X"A6", + X"AD",X"AA",X"AD",X"A8",X"AD",X"AB",X"AD",X"A6",X"AD",X"CA",X"FF",X"1F",X"0B",X"3F",X"0C",X"5F", + X"07",X"8D",X"8F",X"91",X"92",X"B4",X"B1",X"8D",X"8F",X"91",X"8F",X"AD",X"AD",X"8D",X"8F",X"91", + X"92",X"B4",X"B1",X"94",X"92",X"91",X"8F",X"CD",X"FF",X"1F",X"0B",X"5F",X"07",X"85",X"88",X"85", + X"88",X"85",X"88",X"85",X"88",X"85",X"88",X"85",X"88",X"85",X"88",X"85",X"88",X"85",X"88",X"85", + X"88",X"85",X"88",X"85",X"88",X"86",X"88",X"86",X"88",X"C5",X"FF",X"E7",X"AF",X"32",X"C8",X"42", + X"3E",X"02",X"32",X"A3",X"42",X"32",X"A6",X"42",X"F7",X"C3",X"61",X"09",X"DD",X"21",X"80",X"42", + X"C3",X"A1",X"07",X"E7",X"F7",X"C9",X"DD",X"21",X"88",X"42",X"C3",X"A1",X"07",X"E7",X"F7",X"C9", + X"DD",X"21",X"90",X"42",X"C3",X"A1",X"07",X"E7",X"21",X"A7",X"42",X"34",X"7E",X"FE",X"01",X"28", + X"10",X"FE",X"18",X"28",X"11",X"32",X"A3",X"42",X"F7",X"3E",X"01",X"32",X"A5",X"42",X"C3",X"61", + X"09",X"36",X"05",X"7E",X"18",X"EF",X"36",X"04",X"3E",X"18",X"18",X"E9",X"E7",X"F7",X"C9",X"DD", + X"21",X"80",X"42",X"C3",X"A1",X"07",X"DD",X"21",X"88",X"42",X"C3",X"A1",X"07",X"E7",X"3E",X"03", + X"32",X"A3",X"42",X"F7",X"C3",X"5B",X"09",X"3A",X"A5",X"42",X"A7",X"C2",X"B4",X"07",X"DD",X"21", + X"80",X"42",X"C3",X"A1",X"07",X"1F",X"0B",X"3F",X"0D",X"5F",X"06",X"9B",X"60",X"7D",X"BB",X"A6", + X"9B",X"60",X"7D",X"BB",X"B8",X"9B",X"60",X"7B",X"BD",X"80",X"9B",X"99",X"93",X"B8",X"A0",X"8F", + X"60",X"6F",X"8F",X"93",X"B6",X"8F",X"60",X"6F",X"8F",X"94",X"B8",X"9B",X"60",X"7B",X"BD",X"80", + X"9B",X"99",X"93",X"B4",X"A0",X"FF",X"1F",X"0B",X"5F",X"06",X"98",X"60",X"77",X"B8",X"B4",X"98", + X"60",X"77",X"B8",X"B4",X"98",X"60",X"76",X"B5",X"80",X"95",X"96",X"97",X"B4",X"A0",X"8F",X"60", + X"6F",X"8F",X"93",X"B6",X"8F",X"60",X"6D",X"8C",X"8F",X"B4",X"98",X"60",X"76",X"B4",X"80",X"93", + X"8F",X"8D",X"AC",X"A0",X"FF",X"1F",X"0B",X"3F",X"0E",X"5F",X"06",X"8F",X"60",X"6F",X"93",X"96", + X"BB",X"A0",X"98",X"60",X"78",X"9B",X"98",X"B6",X"A0",X"FF",X"1F",X"0B",X"3F",X"0D",X"5F",X"06", + X"8D",X"96",X"B6",X"80",X"97",X"B6",X"94",X"8D",X"B4",X"8D",X"97",X"B7",X"80",X"99",X"B7",X"96", + X"8D",X"B6",X"96",X"99",X"B9",X"80",X"9B",X"B9",X"97",X"96",X"94",X"92",X"91",X"94",X"9B",X"99", + X"97",X"91",X"D2",X"A0",X"FF",X"1F",X"0B",X"5F",X"06",X"8D",X"92",X"B2",X"80",X"91",X"B2",X"91", + X"8D",X"B1",X"8D",X"94",X"B4",X"80",X"96",X"B4",X"92",X"8D",X"B2",X"92",X"96",X"B6",X"80",X"97", + X"B6",X"94",X"92",X"91",X"8F",X"8D",X"91",X"97",X"96",X"94",X"8D",X"D2",X"A0",X"FF",X"1F",X"0B", + X"3F",X"0D",X"5F",X"06",X"C0",X"A0",X"94",X"60",X"75",X"96",X"9E",X"96",X"9E",X"B6",X"96",X"60", + X"75",X"94",X"9D",X"94",X"9D",X"B4",X"9D",X"60",X"73",X"B2",X"BB",X"B9",X"B8",X"B9",X"BB",X"BD", + X"94",X"60",X"75",X"96",X"92",X"96",X"92",X"B6",X"96",X"60",X"79",X"94",X"99",X"94",X"99",X"BD", + X"94",X"60",X"74",X"B4",X"BB",X"B9",X"B8",X"D9",X"C0",X"FF",X"1F",X"05",X"5F",X"06",X"E0",X"B2", + X"80",X"8D",X"92",X"AD",X"92",X"AD",X"80",X"88",X"8D",X"A8",X"8D",X"A8",X"80",X"88",X"88",X"A8", + X"88",X"AD",X"80",X"88",X"8D",X"94",X"91",X"8D",X"B2",X"80",X"8D",X"92",X"AD",X"92",X"AD",X"80", + X"88",X"8D",X"A8",X"8D",X"88",X"94",X"83",X"94",X"88",X"94",X"88",X"94",X"E0",X"FF",X"1F",X"0B", + X"3F",X"0D",X"5F",X"06",X"B8",X"80",X"96",X"96",X"94",X"B3",X"B1",X"80",X"AF",X"8D",X"AC",X"CA", + X"AF",X"B6",X"DB",X"9B",X"80",X"8C",X"8D",X"AF",X"B8",X"94",X"80",X"8C",X"8D",X"AF",X"B8",X"94", + X"80",X"98",X"99",X"B8",X"B6",X"B8",X"B6",X"D4",X"A0",X"FF",X"1F",X"05",X"5F",X"06",X"A3",X"80", + X"AF",X"8F",X"AF",X"A3",X"80",X"AF",X"8F",X"AF",X"A3",X"AF",X"AF",X"AF",X"A3",X"AF",X"8F",X"8F", + X"83",X"83",X"A8",X"B4",X"A8",X"B4",X"A8",X"B4",X"A8",X"B4",X"AA",X"B3",X"AF",X"B3",X"B4",X"AF", + X"88",X"80",X"FF",X"1F",X"0B",X"3F",X"0D",X"5F",X"06",X"98",X"98",X"98",X"98",X"98",X"98",X"96", + X"98",X"99",X"B1",X"80",X"B1",X"B1",X"96",X"96",X"96",X"96",X"B6",X"94",X"96",X"98",X"AF",X"80", + X"AF",X"AF",X"98",X"98",X"98",X"98",X"98",X"98",X"96",X"98",X"99",X"99",X"99",X"99",X"B1",X"91", + X"94",X"93",X"B3",X"80",X"8F",X"8F",X"98",X"96",X"D4",X"A0",X"FF",X"1F",X"05",X"5F",X"06",X"A8", + X"80",X"88",X"C8",X"AA",X"80",X"8A",X"CA",X"AF",X"80",X"8F",X"CF",X"B4",X"80",X"8F",X"AF",X"AC", + X"A8",X"80",X"88",X"C8",X"AA",X"80",X"8A",X"CA",X"A3",X"80",X"83",X"C3",X"A8",X"C0",X"FF",X"1F", + X"0B",X"3F",X"0D",X"5F",X"06",X"94",X"60",X"72",X"91",X"94",X"B9",X"9B",X"99",X"96",X"99",X"AF", + X"9B",X"60",X"79",X"98",X"60",X"76",X"94",X"94",X"96",X"94",X"D4",X"94",X"60",X"72",X"91",X"94", + X"B9",X"9B",X"99",X"96",X"99",X"AF",X"9B",X"60",X"79",X"98",X"60",X"76",X"94",X"94",X"96",X"98", + X"D9",X"FF",X"1F",X"0B",X"5F",X"06",X"94",X"60",X"72",X"91",X"94",X"B9",X"98",X"94",X"92",X"91", + X"B2",X"92",X"60",X"76",X"94",X"60",X"74",X"92",X"92",X"92",X"92",X"D1",X"94",X"60",X"72",X"91", + X"94",X"B9",X"98",X"94",X"92",X"91",X"B2",X"92",X"60",X"76",X"94",X"60",X"74",X"92",X"92",X"92", + X"92",X"D1",X"FF",X"1F",X"0B",X"3F",X"0D",X"5F",X"06",X"88",X"86",X"65",X"68",X"6D",X"71",X"B4", + X"80",X"92",X"71",X"74",X"6D",X"71",X"A8",X"80",X"91",X"6F",X"72",X"6C",X"6F",X"A8",X"80",X"92", + X"71",X"74",X"6D",X"71",X"A8",X"88",X"60",X"66",X"65",X"68",X"6D",X"71",X"B4",X"8D",X"60",X"6B", + X"6A",X"6D",X"72",X"76",X"B9",X"98",X"96",X"94",X"60",X"71",X"96",X"60",X"71",X"94",X"60",X"71", + X"72",X"68",X"6C",X"6F",X"B4",X"80",X"92",X"71",X"68",X"6D",X"71",X"B4",X"80",X"91",X"6F",X"68", + X"71",X"60",X"6F",X"68",X"71",X"60",X"6F",X"68",X"74",X"60",X"D9",X"FF",X"1F",X"0B",X"5F",X"06", + X"A0",X"AD",X"AC",X"A0",X"AA",X"A8",X"A0",X"A6",X"A5",X"A0",X"A8",X"A6",X"A0",X"AD",X"A7",X"A0", + X"AA",X"A8",X"A0",X"A5",X"A6",X"A5",X"A8",X"A6",X"A0",X"A8",X"A5",X"A0",X"A6",X"A8",X"A6",X"C5", + X"FF",X"1F",X"0B",X"3F",X"0D",X"5F",X"06",X"94",X"99",X"99",X"9B",X"9B",X"9D",X"9D",X"98",X"9B", + X"B9",X"B6",X"B4",X"80",X"92",X"91",X"8F",X"91",X"92",X"94",X"B4",X"99",X"98",X"94",X"96",X"98", + X"B9",X"80",X"92",X"91",X"8F",X"91",X"92",X"94",X"B4",X"99",X"98",X"94",X"96",X"98",X"B9",X"FF", + X"1F",X"0B",X"5F",X"06",X"94",X"94",X"94",X"94",X"94",X"94",X"94",X"92",X"92",X"B1",X"B3",X"B4", + X"80",X"8F",X"8D",X"8C",X"8D",X"8F",X"8F",X"8F",X"B4",X"92",X"92",X"92",X"92",X"B1",X"80",X"8F", + X"8D",X"8C",X"8D",X"8F",X"8F",X"8F",X"B4",X"92",X"92",X"92",X"92",X"B1",X"FF",X"1F",X"0B",X"3F", + X"0D",X"5F",X"06",X"87",X"60",X"68",X"AA",X"80",X"8F",X"8E",X"60",X"6C",X"CA",X"8F",X"60",X"6F", + X"6E",X"71",X"94",X"9A",X"60",X"78",X"96",X"8E",X"8F",X"93",X"8A",X"80",X"87",X"60",X"68",X"AA", + X"80",X"8F",X"8E",X"60",X"6C",X"CA",X"8F",X"60",X"6F",X"6E",X"71",X"94",X"9A",X"60",X"78",X"96", + X"8E",X"CF",X"FF",X"1F",X"0B",X"5F",X"06",X"87",X"60",X"68",X"AA",X"80",X"8F",X"8E",X"60",X"6C", + X"CA",X"8F",X"60",X"6F",X"6E",X"6E",X"91",X"96",X"60",X"74",X"91",X"88",X"87",X"88",X"87",X"80", + X"87",X"60",X"68",X"AA",X"80",X"87",X"88",X"60",X"68",X"C7",X"8F",X"60",X"6F",X"6E",X"6E",X"91", + X"96",X"60",X"74",X"91",X"88",X"C7",X"FF",X"1F",X"0B",X"3F",X"0D",X"5F",X"06",X"8A",X"8F",X"8E", + X"91",X"AA",X"8C",X"8E",X"8F",X"93",X"AA",X"8A",X"8F",X"8E",X"91",X"AA",X"8C",X"8E",X"8F",X"93", + X"AA",X"87",X"60",X"68",X"AA",X"80",X"8F",X"8E",X"60",X"6C",X"CA",X"8F",X"60",X"6F",X"6E",X"71", + X"94",X"9A",X"60",X"78",X"96",X"8E",X"CF",X"FF",X"1F",X"0B",X"5F",X"06",X"8A",X"87",X"88",X"88", + X"A8",X"88",X"88",X"87",X"8A",X"A7",X"87",X"87",X"88",X"88",X"A8",X"88",X"88",X"87",X"8A",X"A7", + X"87",X"60",X"68",X"AA",X"80",X"87",X"88",X"60",X"68",X"C7",X"8F",X"60",X"6F",X"6E",X"6E",X"91", + X"96",X"60",X"74",X"91",X"88",X"C7",X"FF",X"1F",X"0B",X"3F",X"0C",X"5F",X"06",X"B4",X"91",X"8D", + X"B9",X"98",X"96",X"B4",X"99",X"91",X"8F",X"B4",X"80",X"94",X"94",X"94",X"94",X"96",X"94",X"91", + X"8D",X"99",X"99",X"99",X"99",X"9B",X"99",X"96",X"92",X"94",X"94",X"94",X"94",X"96",X"94",X"91", + X"8D",X"99",X"99",X"99",X"99",X"9B",X"99",X"96",X"92",X"94",X"91",X"80",X"91",X"B9",X"B1",X"94", + X"CF",X"FF",X"1F",X"05",X"5F",X"06",X"D9",X"D6",X"D9",X"D8",X"8D",X"91",X"88",X"91",X"8D",X"91", + X"88",X"91",X"8D",X"92",X"8A",X"92",X"8D",X"92",X"8A",X"92",X"8D",X"91",X"88",X"91",X"8D",X"91"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_SND_2.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_SND_2.vhd new file mode 100644 index 00000000..84f07cb4 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ROM/ROM_SND_2.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_SND_2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_SND_2 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"88",X"91",X"8D",X"92",X"8A",X"92",X"8D",X"92",X"8A",X"92",X"8D",X"91",X"88",X"91",X"8D",X"91", + X"88",X"91",X"8F",X"94",X"FF",X"E7",X"AF",X"32",X"C8",X"42",X"3E",X"19",X"32",X"A3",X"42",X"F7", + X"C3",X"61",X"09",X"E7",X"F7",X"C9",X"DD",X"21",X"80",X"42",X"C3",X"A1",X"07",X"DD",X"21",X"88", + X"42",X"C3",X"A1",X"07",X"1F",X"0B",X"3F",X"0C",X"5F",X"05",X"B4",X"91",X"8D",X"B9",X"98",X"96", + X"B4",X"99",X"91",X"8F",X"B4",X"80",X"80",X"94",X"94",X"94",X"94",X"91",X"8F",X"8D",X"80",X"99", + X"99",X"99",X"9B",X"99",X"98",X"96",X"94",X"91",X"80",X"91",X"B9",X"B1",X"94",X"CF",X"80",X"A0", + X"80",X"91",X"91",X"92",X"94",X"96",X"98",X"D6",X"C0",X"80",X"92",X"92",X"94",X"B6",X"98",X"99", + X"D8",X"A0",X"B4",X"D9",X"99",X"98",X"96",X"94",X"D8",X"B6",X"B6",X"B4",X"BB",X"B9",X"B8",X"D9", + X"C0",X"99",X"99",X"99",X"99",X"99",X"99",X"98",X"96",X"D9",X"B4",X"91",X"91",X"AF",X"8F",X"8F", + X"99",X"99",X"98",X"96",X"D6",X"D4",X"94",X"91",X"91",X"91",X"B1",X"8F",X"8D",X"92",X"91",X"92", + X"94",X"B6",X"A0",X"94",X"92",X"8F",X"8F",X"AF",X"8D",X"8C",X"8D",X"8C",X"8D",X"8F",X"D1",X"94", + X"91",X"91",X"91",X"B1",X"8F",X"8D",X"92",X"91",X"92",X"94",X"B6",X"98",X"96",X"B4",X"94",X"96", + X"94",X"92",X"91",X"8F",X"CA",X"AC",X"AF",X"CD",X"C0",X"FF",X"1F",X"05",X"5F",X"05",X"D9",X"D6", + X"D9",X"D8",X"8D",X"91",X"88",X"91",X"8D",X"91",X"88",X"91",X"8D",X"92",X"8A",X"92",X"8D",X"92", + X"8A",X"92",X"8D",X"91",X"88",X"91",X"8D",X"91",X"88",X"91",X"8F",X"94",X"88",X"94",X"8A",X"94", + X"8C",X"94",X"8D",X"91",X"88",X"91",X"8D",X"91",X"88",X"91",X"8D",X"92",X"8A",X"92",X"8D",X"92", + X"8A",X"92",X"8D",X"92",X"8A",X"92",X"8D",X"92",X"8A",X"92",X"8F",X"94",X"88",X"94",X"8F",X"94", + X"88",X"94",X"8D",X"91",X"88",X"91",X"8D",X"91",X"88",X"91",X"8D",X"91",X"89",X"91",X"8A",X"92", + X"8F",X"92",X"8F",X"94",X"88",X"94",X"8F",X"94",X"88",X"94",X"8D",X"91",X"88",X"91",X"AD",X"A0", + X"D2",X"C0",X"D1",X"C0",X"DF",X"C0",X"D2",X"D2",X"8D",X"91",X"88",X"91",X"8D",X"91",X"88",X"91", + X"8D",X"92",X"8A",X"92",X"8D",X"92",X"8A",X"92",X"8F",X"94",X"88",X"94",X"8F",X"94",X"88",X"94", + X"8D",X"91",X"88",X"91",X"8D",X"91",X"88",X"91",X"8D",X"91",X"88",X"91",X"8D",X"91",X"88",X"91", + X"8D",X"92",X"8A",X"92",X"8D",X"92",X"8A",X"92",X"8F",X"94",X"88",X"94",X"8F",X"94",X"88",X"94", + X"D2",X"D4",X"8D",X"FF",X"1F",X"0B",X"3F",X"0D",X"5F",X"06",X"8F",X"60",X"6F",X"8F",X"60",X"6F", + X"91",X"60",X"71",X"93",X"60",X"73",X"74",X"74",X"74",X"60",X"94",X"60",X"76",X"D8",X"B9",X"B9", + X"98",X"60",X"B9",X"60",X"8F",X"60",X"6F",X"91",X"60",X"D2",X"60",X"94",X"60",X"76",X"94",X"60", + X"72",X"91",X"60",X"71",X"92",X"60",X"D4",X"60",X"A0",X"74",X"76",X"78",X"60",X"B9",X"B9",X"98", + X"60",X"B9",X"60",X"8F",X"60",X"6F",X"91",X"60",X"72",X"80",X"60",X"76",X"94",X"60",X"73",X"94", + X"80",X"B2",X"B1",X"8F",X"60",X"CD",X"FF",X"1F",X"05",X"5F",X"06",X"B9",X"B9",X"B9",X"B9",X"B8", + X"B2",X"B1",X"AF",X"AD",X"B4",X"B6",X"B6",X"B6",X"B6",X"B6",X"B6",X"B8",X"B8",X"B8",X"B8",X"B4", + X"B1",X"BD",X"B4",X"B4",X"B4",X"B6",X"B6",X"B6",X"B6",X"B6",X"B6",X"98",X"80",X"A0",X"B6",X"B4", + X"FF",X"1F",X"0B",X"3F",X"0D",X"5F",X"06",X"92",X"97",X"97",X"99",X"9B",X"97",X"9B",X"99",X"92", + X"97",X"97",X"99",X"9B",X"B7",X"96",X"92",X"97",X"97",X"99",X"9B",X"9C",X"9B",X"99",X"97",X"96", + X"92",X"94",X"96",X"B7",X"97",X"80",X"FF",X"FF",X"1F",X"0B",X"3F",X"0D",X"5F",X"06",X"94",X"60", + X"76",X"94",X"92",X"94",X"96",X"B7",X"92",X"60",X"74",X"92",X"90",X"8F",X"90",X"92",X"80",X"94", + X"60",X"76",X"94",X"92",X"94",X"96",X"97",X"94",X"94",X"97",X"96",X"99",X"B7",X"97",X"80",X"FF", + X"1F",X"0B",X"5F",X"06",X"90",X"60",X"70",X"90",X"92",X"90",X"90",X"B0",X"8F",X"60",X"70",X"8F", + X"8D",X"8B",X"8B",X"8B",X"80",X"90",X"60",X"70",X"90",X"92",X"90",X"90",X"90",X"90",X"8F",X"92", + X"92",X"90",X"AF",X"8F",X"80",X"FF",X"1F",X"0B",X"3F",X"0D",X"5F",X"06",X"72",X"74",X"B6",X"96", + X"B6",X"96",X"B7",X"96",X"B6",X"7B",X"7B",X"B9",X"96",X"96",X"94",X"92",X"B4",X"94",X"B4",X"80", + X"B6",X"96",X"B6",X"96",X"B7",X"96",X"B6",X"9B",X"B9",X"96",X"94",X"96",X"94",X"B2",X"92",X"B2", + X"80",X"FF",X"1F",X"0B",X"5F",X"06",X"72",X"74",X"B6",X"8D",X"8D",X"8F",X"8D",X"AF",X"92",X"B2", + X"80",X"AD",X"8D",X"8F",X"91",X"92",X"B2",X"91",X"B1",X"72",X"74",X"B6",X"8D",X"8D",X"8F",X"8D", + X"AF",X"92",X"B2",X"97",X"B6",X"92",X"91",X"92",X"9D",X"AA",X"8A",X"AA",X"80",X"FF",X"1F",X"0B", + X"3F",X"0D",X"5F",X"06",X"8A",X"AF",X"8E",X"8C",X"AA",X"80",X"8A",X"AC",X"AE",X"AF",X"8A",X"8A", + X"8C",X"8A",X"88",X"87",X"8C",X"8A",X"88",X"87",X"A5",X"AA",X"AA",X"80",X"FF",X"1F",X"0B",X"5F", + X"06",X"8A",X"AF",X"8E",X"8C",X"AA",X"80",X"8A",X"A9",X"A8",X"A7",X"87",X"83",X"88",X"87",X"85", + X"83",X"A3",X"A5",X"A1",X"80",X"FF",X"1F",X"0B",X"3F",X"0D",X"5F",X"06",X"8A",X"87",X"8A",X"8A", + X"8A",X"8C",X"8A",X"8A",X"8A",X"87",X"8A",X"8A",X"8A",X"8C",X"8A",X"8A",X"8A",X"AF",X"B1",X"93", + X"60",X"6F",X"8F",X"8F",X"B1",X"AE",X"AF",X"80",X"FF",X"1F",X"0B",X"5F",X"06",X"87",X"83",X"87", + X"87",X"87",X"86",X"87",X"87",X"87",X"83",X"87",X"87",X"87",X"87",X"85",X"87",X"88",X"AA",X"AA", + X"8A",X"60",X"67",X"87",X"8A",X"A8",X"A8",X"A7",X"80",X"FF",X"1F",X"0B",X"3F",X"0D",X"5F",X"06", + X"8F",X"93",X"B6",X"B6",X"BB",X"9A",X"98",X"96",X"96",X"93",X"94",X"96",X"80",X"BA",X"98",X"98", + X"94",X"98",X"96",X"96",X"9B",X"9B",X"9A",X"98",X"96",X"9A",X"9B",X"80",X"8F",X"93",X"B6",X"B6", + X"BB",X"9A",X"98",X"96",X"96",X"93",X"94",X"96",X"80",X"BA",X"98",X"98",X"94",X"98",X"96",X"96", + X"9B",X"9B",X"9A",X"98",X"96",X"9A",X"9B",X"80",X"A0",X"FF",X"1F",X"0B",X"5F",X"06",X"8F",X"8F", + X"B3",X"B3",X"B8",X"96",X"94",X"93",X"93",X"8F",X"91",X"93",X"80",X"B6",X"94",X"94",X"8F",X"94", + X"93",X"93",X"93",X"93",X"96",X"93",X"8F",X"91",X"93",X"80",X"8F",X"8F",X"B3",X"B3",X"B8",X"96", + X"94",X"93",X"93",X"8F",X"91",X"93",X"80",X"B6",X"94",X"94",X"8F",X"94",X"93",X"93",X"93",X"93", + X"96",X"93",X"8F",X"91",X"93",X"80",X"A0",X"FF",X"1F",X"0B",X"3F",X"0D",X"5F",X"06",X"8D",X"92", + X"96",X"B9",X"99",X"96",X"B7",X"97",X"94",X"B6",X"B9",X"80",X"96",X"97",X"99",X"BB",X"9B",X"9B", + X"9B",X"99",X"9B",X"9C",X"DD",X"A0",X"9D",X"9D",X"BD",X"9B",X"99",X"BB",X"99",X"97",X"9B",X"80", + X"B9",X"A0",X"96",X"97",X"B9",X"98",X"99",X"BB",X"99",X"97",X"D6",X"FF",X"1F",X"0B",X"5F",X"06", + X"8D",X"92",X"96",X"B6",X"96",X"92",X"B4",X"94",X"91",X"B2",X"B6",X"80",X"92",X"94",X"96",X"B7", + X"97",X"97",X"97",X"96",X"97",X"98",X"D9",X"A0",X"99",X"99",X"B9",X"97",X"96",X"B7",X"96",X"94", + X"97",X"80",X"B6",X"A0",X"92",X"94",X"B6",X"95",X"96",X"B7",X"96",X"94",X"D2",X"FF",X"1F",X"0B", + X"3F",X"0D",X"5F",X"06",X"8C",X"B1",X"91",X"94",X"B8",X"80",X"8C",X"90",X"90",X"90",X"93",X"B6", + X"A0",X"B6",X"98",X"96",X"94",X"94",X"93",X"91",X"93",X"93",X"94",X"96",X"B8",X"A0",X"96",X"76", + X"74",X"96",X"76",X"74",X"AC",X"B0",X"D1",X"FF",X"1F",X"05",X"5F",X"06",X"80",X"B1",X"B1",X"B1", + X"B1",X"AC",X"AC",X"AC",X"AC",X"AA",X"AA",X"AA",X"AA",X"AC",X"AC",X"AC",X"AC",X"8A",X"80",X"8A", + X"80",X"AC",X"AC",X"B1",X"FF",X"E7",X"3E",X"01",X"32",X"C8",X"42",X"32",X"C3",X"42",X"F7",X"C3", + X"70",X"16",X"DD",X"21",X"B0",X"42",X"DD",X"7E",X"00",X"FE",X"FF",X"28",X"25",X"CD",X"A9",X"14", + X"AF",X"C9",X"E7",X"3E",X"00",X"32",X"C3",X"42",X"F7",X"C3",X"6B",X"16",X"3A",X"C8",X"42",X"A7", + X"20",X"14",X"E7",X"DD",X"21",X"B0",X"42",X"DD",X"7E",X"00",X"FE",X"FF",X"C8",X"CD",X"A9",X"14", + X"AF",X"C9",X"AF",X"32",X"C8",X"42",X"3E",X"FF",X"C9",X"DD",X"35",X"01",X"C0",X"3A",X"C2",X"42", + X"DD",X"77",X"01",X"DD",X"7E",X"08",X"A7",X"28",X"16",X"21",X"C4",X"42",X"35",X"7E",X"A7",X"28", + X"0B",X"CD",X"4D",X"02",X"ED",X"5B",X"C5",X"42",X"19",X"EF",X"18",X"03",X"DD",X"77",X"08",X"DD", + X"CB",X"00",X"46",X"C2",X"E3",X"14",X"DD",X"7E",X"07",X"D6",X"01",X"FA",X"E3",X"14",X"DD",X"77", + X"07",X"47",X"DF",X"DD",X"35",X"00",X"C0",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"7E",X"47",X"E6", + X"1F",X"CA",X"94",X"15",X"FE",X"1F",X"C2",X"AE",X"15",X"23",X"DD",X"75",X"02",X"DD",X"74",X"03", + X"78",X"E6",X"E0",X"0F",X"0F",X"0F",X"0F",X"4F",X"06",X"00",X"21",X"16",X"15",X"09",X"5E",X"23", + X"56",X"2A",X"B2",X"42",X"D5",X"C9",X"26",X"15",X"39",X"15",X"49",X"15",X"52",X"15",X"8C",X"15", + X"8C",X"15",X"8C",X"15",X"8C",X"15",X"4E",X"CB",X"21",X"CB",X"21",X"06",X"00",X"21",X"E3",X"15", + X"09",X"DD",X"75",X"04",X"DD",X"74",X"05",X"18",X"43",X"4E",X"06",X"00",X"21",X"5B",X"16",X"09", + X"7E",X"32",X"C2",X"42",X"DD",X"77",X"01",X"18",X"33",X"7E",X"DD",X"77",X"06",X"DD",X"77",X"07", + X"18",X"2A",X"7E",X"DD",X"77",X"08",X"DD",X"77",X"09",X"A7",X"28",X"20",X"47",X"E6",X"E0",X"07", + X"07",X"07",X"32",X"C4",X"42",X"78",X"16",X"00",X"21",X"00",X"00",X"E6",X"0F",X"87",X"5F",X"78", + X"E6",X"10",X"20",X"04",X"ED",X"52",X"18",X"01",X"19",X"22",X"C5",X"42",X"DD",X"6E",X"02",X"DD", + X"66",X"03",X"23",X"DD",X"75",X"02",X"DD",X"74",X"03",X"C3",X"E7",X"14",X"06",X"00",X"DF",X"DD", + X"36",X"00",X"FF",X"C9",X"CD",X"9C",X"15",X"06",X"00",X"DF",X"18",X"39",X"78",X"E6",X"E0",X"07", + X"07",X"07",X"47",X"3E",X"01",X"10",X"04",X"DD",X"77",X"00",X"C9",X"07",X"18",X"F7",X"C5",X"CD", + X"9C",X"15",X"C1",X"78",X"E6",X"1F",X"3D",X"07",X"4F",X"06",X"00",X"DD",X"6E",X"04",X"DD",X"66", + X"05",X"09",X"5E",X"23",X"56",X"EB",X"EF",X"DD",X"7E",X"09",X"DD",X"77",X"08",X"DD",X"46",X"06", + X"78",X"DD",X"77",X"07",X"DF",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"23",X"DD",X"75",X"02",X"DD", + X"74",X"03",X"C9",X"6B",X"08",X"F2",X"07",X"80",X"07",X"14",X"07",X"AE",X"06",X"4E",X"06",X"F3", + X"05",X"9E",X"05",X"4E",X"05",X"01",X"05",X"B9",X"04",X"76",X"04",X"36",X"04",X"F9",X"03",X"C0", + X"03",X"8A",X"03",X"57",X"03",X"27",X"03",X"FA",X"02",X"CF",X"02",X"A7",X"02",X"81",X"02",X"5D", + X"02",X"3B",X"02",X"1B",X"02",X"FD",X"01",X"E0",X"01",X"C5",X"01",X"AC",X"01",X"94",X"01",X"7D", + X"01",X"68",X"01",X"53",X"01",X"40",X"01",X"2E",X"01",X"1D",X"01",X"0D",X"01",X"FE",X"00",X"F0", + X"00",X"E3",X"00",X"D6",X"00",X"CA",X"00",X"BE",X"00",X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97", + X"00",X"8F",X"00",X"87",X"00",X"7F",X"00",X"78",X"00",X"71",X"00",X"6B",X"00",X"65",X"00",X"5F", + X"00",X"5A",X"00",X"55",X"00",X"50",X"00",X"4C",X"00",X"47",X"00",X"11",X"0F",X"0D",X"0B",X"0A", + X"09",X"08",X"07",X"03",X"05",X"14",X"13",X"11",X"10",X"0F",X"0E",X"3A",X"C8",X"42",X"A7",X"C0", + X"21",X"94",X"16",X"11",X"B0",X"42",X"01",X"0A",X"00",X"ED",X"B0",X"3A",X"C3",X"42",X"87",X"4F", + X"87",X"81",X"4F",X"21",X"9E",X"16",X"09",X"11",X"B2",X"42",X"7E",X"12",X"CD",X"91",X"16",X"7E", + X"12",X"23",X"13",X"C9",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"AA",X"16", + X"CD",X"16",X"CD",X"16",X"B8",X"16",X"CD",X"16",X"CD",X"16",X"1F",X"0F",X"3F",X"09",X"5F",X"09", + X"7F",X"00",X"6D",X"71",X"74",X"79",X"D6",X"FF",X"1F",X"02",X"3F",X"07",X"5F",X"09",X"7F",X"00", + X"94",X"8D",X"88",X"94",X"8D",X"88",X"94",X"8D",X"88",X"94",X"8D",X"C8",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/ScrambleMist.sv b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ScrambleMist.sv new file mode 100644 index 00000000..a87e679a --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/ScrambleMist.sv @@ -0,0 +1,201 @@ +//============================================================================ +// Arcade: Scramble +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module ScrambleMist +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Scramble;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +//////////////////// CLOCKS /////////////////// + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6p, ce_6n, ce_12, ce_1p79; +always @(negedge clk_sys) begin + reg [1:0] div = 0; + reg [3:0] div179 = 0; + + div <= div + 1'd1; + + ce_12 <= div[0]; + ce_6p <= div[0] & ~div[1]; + ce_6n <= div[0] & div[1]; + + ce_1p79 <= 0; + div179 <= div179 - 1'd1; + if(!div179) begin + div179 <= 13; + ce_1p79 <= 1; + end +end + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [7:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [9:0] audio; +wire hsync,vsync; +assign LED = 1; + +wire hblank, vblank; +wire hs, vs; +wire [2:0] r,g; +wire [1:0] b; + +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6p), + .ce_pix_actual(ce_6p), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R(r), + .G(g), + .B(b), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; + + +scramble_top scramble +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .button_in(~{m_start2, m_fire, m_coin, m_start1, m_right, m_left, m_down, m_up}), + + .RESET(status[0] | status[6] | buttons[1]), + .clk(clk_sys), + .ena_12(ce_12), + .ena_6(ce_6p), + .ena_6b(ce_6n), + .ena_1_79(ce_1p79) +); +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/YM2149_linmix_sep.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/YM2149_linmix_sep.vhd new file mode 100644 index 00000000..6ed2498a --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/YM2149_linmix_sep.vhd @@ -0,0 +1,574 @@ +-- changes for seperate audio outputs and enable now enables cpu access as well +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + O_CHAN : out std_logic_vector(1 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal cnt_div_t1 : std_logic_vector(3 downto 0); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8; + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process(RESET_L, CLK) + begin + -- looks like registers are latches in real chip, but the address is caught at the end of the address state. + if (RESET_L = '0') then + addr <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA = '1') then + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end if; + end process; + + p_wdata : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + elsif rising_edge(CLK) then + if (ENA = '1') then + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, reg, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + -- envelope shapes + -- C AtAlH + -- 0 0 x x \___ + -- + -- 0 1 x x /___ + -- + -- 1 0 0 0 \\\\ + -- + -- 1 0 0 1 \___ + -- + -- 1 0 1 0 \/\/ + -- ___ + -- 1 0 1 1 \ + -- + -- 1 1 0 0 //// + -- ___ + -- 1 1 0 1 / + -- + -- 1 1 1 0 /\/\ + -- + -- 1 1 1 1 /___ + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + cnt_div_t1 <= cnt_div; + end if; + end process; + + p_audio_output : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_AUDIO <= (others => '0'); + O_CHAN <= (others => '0'); + elsif rising_edge(CLK) then + + if (ENA = '1') then + O_AUDIO <= dac_amp(7 downto 0); + O_CHAN <= cnt_div_t1(1 downto 0); + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then -- resync + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end if; + end process; +end architecture RTL; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/build_id.tcl b/Arcade/Scramble Hardware/Frogger_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_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/Arcade/Scramble Hardware/Frogger_MiST/rtl/build_id.v b/Arcade/Scramble Hardware/Frogger_MiST/rtl/build_id.v new file mode 100644 index 00000000..629dd9aa --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171117" +`define BUILD_TIME "105138" diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80sed.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/dac.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/dac.vhd new file mode 100644 index 00000000..47b2185e --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 10 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/dpram.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/hq2x.sv b/Arcade/Scramble Hardware/Frogger_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_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/Arcade/Scramble Hardware/Frogger_MiST/rtl/i82c55.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/i82c55.vhd new file mode 100644 index 00000000..0aadc7e6 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/i82c55.vhd @@ -0,0 +1,686 @@ +-- +-- A simulation model of Frogger hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- + +library ieee ; + use ieee.std_logic_1164.all ; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity I82C55 is + port ( + + I_ADDR : in std_logic_vector(1 downto 0); -- A1-A0 + I_DATA : in std_logic_vector(7 downto 0); -- D7-D0 + O_DATA : out std_logic_vector(7 downto 0); + O_DATA_OE_L : out std_logic; + + I_CS_L : in std_logic; + I_RD_L : in std_logic; + I_WR_L : in std_logic; + + I_PA : in std_logic_vector(7 downto 0); + O_PA : out std_logic_vector(7 downto 0); + O_PA_OE_L : out std_logic_vector(7 downto 0); + + I_PB : in std_logic_vector(7 downto 0); + O_PB : out std_logic_vector(7 downto 0); + O_PB_OE_L : out std_logic_vector(7 downto 0); + + I_PC : in std_logic_vector(7 downto 0); + O_PC : out std_logic_vector(7 downto 0); + O_PC_OE_L : out std_logic_vector(7 downto 0); + + RESET : in std_logic; + ENA : in std_logic; -- (CPU) clk enable + CLK : in std_logic + ); +end; + +architecture RTL of I82C55 is + + -- registers + signal bit_mask : std_logic_vector(7 downto 0); + signal r_porta : std_logic_vector(7 downto 0); + signal r_portb : std_logic_vector(7 downto 0); + signal r_portc : std_logic_vector(7 downto 0); + signal r_control : std_logic_vector(7 downto 0); + -- + signal porta_we : std_logic; + signal portb_we : std_logic; + signal porta_re : std_logic; + signal portb_re : std_logic; + -- + signal porta_we_t1 : std_logic; + signal portb_we_t1 : std_logic; + signal porta_re_t1 : std_logic; + signal portb_re_t1 : std_logic; + -- + signal porta_we_rising : boolean; + signal portb_we_rising : boolean; + signal porta_re_rising : boolean; + signal portb_re_rising : boolean; + -- + signal groupa_mode : std_logic_vector(1 downto 0); -- port a/c upper + signal groupb_mode : std_logic; -- port b/c lower + -- + signal porta_read : std_logic_vector(7 downto 0); + signal portb_read : std_logic_vector(7 downto 0); + signal portc_read : std_logic_vector(7 downto 0); + signal control_read : std_logic_vector(7 downto 0); + signal mode_clear : std_logic; + -- + signal a_inte1 : std_logic; + signal a_inte2 : std_logic; + signal b_inte : std_logic; + -- + signal a_intr : std_logic; + signal a_obf_l : std_logic; + signal a_ibf : std_logic; + signal a_ack_l : std_logic; + signal a_stb_l : std_logic; + signal a_ack_l_t1 : std_logic; + signal a_stb_l_t1 : std_logic; + -- + signal b_intr : std_logic; + signal b_obf_l : std_logic; + signal b_ibf : std_logic; + signal b_ack_l : std_logic; + signal b_stb_l : std_logic; + signal b_ack_l_t1 : std_logic; + signal b_stb_l_t1 : std_logic; + -- + signal a_ack_l_rising : boolean; + signal a_stb_l_rising : boolean; + signal b_ack_l_rising : boolean; + signal b_stb_l_rising : boolean; + -- + signal porta_ipreg : std_logic_vector(7 downto 0); + signal portb_ipreg : std_logic_vector(7 downto 0); +begin + -- + -- mode 0 - basic input/output + -- mode 1 - strobed input/output + -- mode 2/3 - bi-directional bus + -- + -- control word (write) + -- + -- D7 mode set flag 1 = active + -- D6..5 GROUPA mode selection (mode 0,1,2) + -- D4 GROUPA porta 1 = input, 0 = output + -- D3 GROUPA portc upper 1 = input, 0 = output + -- D2 GROUPB mode selection (mode 0 ,1) + -- D1 GROUPB portb 1 = input, 0 = output + -- D0 GROUPB portc lower 1 = input, 0 = output + -- + -- D7 bit set/reset 0 = active + -- D6..4 x + -- D3..1 bit select + -- d0 1 = set, 0 - reset + -- + -- all output registers including status are reset when mode is changed + --1. Port A: + --All Modes: Output data is cleared, input data is not cleared. + + --2. Port B: + --Mode 0: Output data is cleared, input data is not cleared. + --Mode 1 and 2: Both output and input data are cleared. + + --3. Port C: + --Mode 0:Output data is cleared, input data is not cleared. + --Mode 1 and 2: IBF and INTR are cleared and OBF# is set. + --Outputs in Port C which are not used for handshaking or interrupt signals are cleared. + --Inputs such as STB#, ACK#, or "spare" inputs are not affected. The interrupts for Ports A and B are disabled. + + p_bit_mask : process(I_DATA) + begin + bit_mask <= x"01"; + case I_DATA(3 downto 1) is + when "000" => bit_mask <= x"01"; + when "001" => bit_mask <= x"02"; + when "010" => bit_mask <= x"04"; + when "011" => bit_mask <= x"08"; + when "100" => bit_mask <= x"10"; + when "101" => bit_mask <= x"20"; + when "110" => bit_mask <= x"40"; + when "111" => bit_mask <= x"80"; + when others => null; + end case; + end process; + + p_write_reg_reset : process(RESET, CLK) + variable r_portc_masked : std_logic_vector(7 downto 0); + variable r_portc_setclr : std_logic_vector(7 downto 0); + begin + if (RESET = '1') then + r_porta <= x"00"; + r_portb <= x"00"; + r_portc <= x"00"; + r_control <= x"9B"; -- 10011011 + mode_clear <= '1'; + elsif rising_edge(CLK) then + + r_portc_masked := (not bit_mask) and r_portc; + for i in 0 to 7 loop + r_portc_setclr(i) := bit_mask(i) and I_DATA(0); + end loop; + + if (ENA = '1') then + mode_clear <= '0'; + if (I_CS_L = '0') and (I_WR_L = '0') then + case I_ADDR is + when "00" => r_porta <= I_DATA; + when "01" => r_portb <= I_DATA; + when "10" => r_portc <= I_DATA; + + when "11" => if (I_DATA(7) = '0') then -- set/clr + r_portc <= r_portc_masked or r_portc_setclr; + else + --mode_clear <= '1'; + --r_porta <= x"00"; + --r_portb <= x"00"; -- clear port b input reg + --r_portc <= x"00"; -- clear control sigs + r_control <= I_DATA; -- load new mode + end if; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_decode_control : process(r_control) + begin + groupa_mode <= r_control(6 downto 5); + groupb_mode <= r_control(2); + end process; + + p_oe : process(I_CS_L, I_RD_L) + begin + O_DATA_OE_L <= '1'; + if (I_CS_L = '0') and (I_RD_L = '0') then + O_DATA_OE_L <= '0'; + end if; + end process; + + p_read : process(I_ADDR, porta_read, portb_read, portc_read, control_read) + begin + O_DATA <= x"00"; -- default + --if (I_CS_L = '0') and (I_RD_L = '0') then -- not required + case I_ADDR is + when "00" => O_DATA <= porta_read; + when "01" => O_DATA <= portb_read; + when "10" => O_DATA <= portc_read; + when "11" => O_DATA <= control_read; + when others => null; + end case; + --end if; + end process; + control_read(7) <= '1'; -- always 1 + control_read(6 downto 0) <= r_control(6 downto 0); + + p_rw_control : process(I_CS_L, I_RD_L, I_WR_L, I_ADDR) + begin + porta_we <= '0'; + portb_we <= '0'; + porta_re <= '0'; + portb_re <= '0'; + + if (I_CS_L = '0') and (I_ADDR = "00") then + porta_we <= not I_WR_L; + porta_re <= not I_RD_L; + end if; + + if (I_CS_L = '0') and (I_ADDR = "01") then + portb_we <= not I_WR_L; + portb_re <= not I_RD_L; + end if; + end process; + + p_rw_control_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + porta_we_t1 <= porta_we; + portb_we_t1 <= portb_we; + porta_re_t1 <= porta_re; + portb_re_t1 <= portb_re; + + a_stb_l_t1 <= a_stb_l; + a_ack_l_t1 <= a_ack_l; + b_stb_l_t1 <= b_stb_l; + b_ack_l_t1 <= b_ack_l; + end if; + end process; + + porta_we_rising <= (porta_we = '0') and (porta_we_t1 = '1'); -- falling as inverted + portb_we_rising <= (portb_we = '0') and (portb_we_t1 = '1'); -- " + porta_re_rising <= (porta_re = '0') and (porta_re_t1 = '1'); -- falling as inverted + portb_re_rising <= (portb_re = '0') and (portb_re_t1 = '1'); -- " + -- + a_stb_l_rising <= (a_stb_l = '1') and (a_stb_l_t1 = '0'); + a_ack_l_rising <= (a_ack_l = '1') and (a_ack_l_t1 = '0'); + b_stb_l_rising <= (b_stb_l = '1') and (b_stb_l_t1 = '0'); + b_ack_l_rising <= (b_ack_l = '1') and (b_ack_l_t1 = '0'); + -- + -- GROUP A + -- in mode 1 + -- + -- d4=1 (porta = input) + -- pc7,6 io (d3=1 input, d3=0 output) + -- pc5 output a_ibf + -- pc4 input a_stb_l + -- pc3 output a_intr + -- + -- d4=0 (porta = output) + -- pc7 output a_obf_l + -- pc6 input a_ack_l + -- pc5,4 io (d3=1 input, d3=0 output) + -- pc3 output a_intr + -- + -- GROUP B + -- in mode 1 + -- d1=1 (portb = input) + -- pc2 input b_stb_l + -- pc1 output b_ibf + -- pc0 output b_intr + -- + -- d1=0 (portb = output) + -- pc2 input b_ack_l + -- pc1 output b_obf_l + -- pc0 output b_intr + + + -- WHEN AN INPUT + -- + -- stb_l a low on this input latches input data + -- ibf a high on this output indicates data latched. set by stb_l and reset by rising edge of RD_L + -- intr a high on this output indicates interrupt. set by stb_l high, ibf high and inte high. reset by falling edge of RD_L + -- inte A controlled by bit/set PC4 + -- inte B controlled by bit/set PC2 + + -- WHEN AN OUTPUT + -- + -- obf_l output will go low when cpu has written data + -- ack_l input - a low on this clears obf_l + -- intr output set when ack_l is high, obf_l is high and inte is one. reset by falling edge of WR_L + -- inte A controlled by bit/set PC6 + -- inte B controlled by bit/set PC2 + + -- GROUP A + -- in mode 2 + -- + -- porta = IO + -- + -- control bits 2..0 still control groupb/c lower 2..0 + -- + -- + -- PC7 output a_obf + -- PC6 input a_ack_l + -- PC5 output a_ibf + -- PC4 input a_stb_l + -- PC3 is still interrupt out + p_control_flags : process(RESET, CLK) + variable we : boolean; + variable set1 : boolean; + variable set2 : boolean; + begin + if (RESET = '1') then + a_obf_l <= '1'; + a_inte1 <= '0'; + a_ibf <= '0'; + a_inte2 <= '0'; + a_intr <= '0'; + -- + b_inte <= '0'; + b_obf_l <= '1'; + b_ibf <= '0'; + b_intr <= '0'; + elsif rising_edge(CLK) then + we := (I_CS_L = '0') and (I_WR_L = '0') and (I_ADDR = "11") and (I_DATA(7) = '0'); + + if (ENA = '1') then + if (mode_clear = '1') then + a_obf_l <= '1'; + a_inte1 <= '0'; + a_ibf <= '0'; + a_inte2 <= '0'; + a_intr <= '0'; + -- + b_inte <= '0'; + b_obf_l <= '1'; + b_ibf <= '0'; + b_intr <= '0'; + else + if (bit_mask(7) = '1') and we then + a_obf_l <= I_DATA(0); + else + if porta_we_rising then + a_obf_l <= '0'; + elsif (a_ack_l = '0') then + a_obf_l <= '1'; + end if; + end if; + -- + if (bit_mask(6) = '1') and we then a_inte1 <= I_DATA(0); end if; -- bus set when mode1 & input? + -- + if (bit_mask(5) = '1') and we then + a_ibf <= I_DATA(0); + else + if porta_re_rising then + a_ibf <= '0'; + elsif (a_stb_l = '0') then + a_ibf <= '1'; + end if; + end if; + -- + if (bit_mask(4) = '1') and we then a_inte2 <= I_DATA(0); end if; -- bus set when mode1 & output? + -- + set1 := a_ack_l_rising and (a_obf_l = '1') and (a_inte1 = '1'); + set2 := a_stb_l_rising and (a_ibf = '1') and (a_inte2 = '1'); + -- + if (bit_mask(3) = '1') and we then + a_intr <= I_DATA(0); + else + if (groupa_mode(1) = '1') then + if (porta_we = '1') or (porta_re = '1') then + a_intr <= '0'; + elsif set1 or set2 then + a_intr <= '1'; + end if; + else + if (r_control(4) = '0') then -- output + if (porta_we = '1') then -- falling ? + a_intr <= '0'; + elsif set1 then + a_intr <= '1'; + end if; + elsif (r_control(4) = '1') then -- input + if (porta_re = '1') then -- falling ? + a_intr <= '0'; + elsif set2 then + a_intr <= '1'; + end if; + end if; + end if; + end if; + -- + if (bit_mask(2) = '1') and we then b_inte <= I_DATA(0); end if; -- bus set? + + if (bit_mask(1) = '1') and we then + b_obf_l <= I_DATA(0); + else + if (r_control(1) = '0') then -- output + if portb_we_rising then + b_obf_l <= '0'; + elsif (b_ack_l = '0') then + b_obf_l <= '1'; + end if; + else + if portb_re_rising then + b_ibf <= '0'; + elsif (b_stb_l = '0') then + b_ibf <= '1'; + end if; + end if; + end if; + + if (bit_mask(0) = '1') and we then + b_intr <= I_DATA(0); + else + if (r_control(1) = '0') then -- output + if (portb_we = '1') then -- falling ? + b_intr <= '0'; + elsif b_ack_l_rising and (b_obf_l = '1') and (b_inte = '1') then + b_intr <= '1'; + end if; + else + if (portb_re = '1') then -- falling ? + b_intr <= '0'; + elsif b_stb_l_rising and (b_ibf = '1') and (b_inte = '1') then + b_intr <= '1'; + end if; + end if; + end if; + + end if; + end if; + end if; + end process; + + p_porta : process(r_control, groupa_mode, r_porta, I_PA, porta_ipreg, a_ack_l) + begin + -- D4 GROUPA porta 1 = input, 0 = output + O_PA <= x"FF"; -- if not driven, float high + O_PA_OE_L <= x"FF"; + porta_read <= x"00"; + + if (groupa_mode = "00") then -- simple io + if (r_control(4) = '0') then -- output + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= I_PA; + elsif (groupa_mode = "01") then -- strobed + if (r_control(4) = '0') then -- output + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= porta_ipreg; + else -- if (groupa_mode(1) = '1') then -- bi dir + if (a_ack_l = '0') then -- output enable + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= porta_ipreg; -- latched data + end if; + + end process; + + p_portb : process(r_control, groupb_mode, r_portb, I_PB, portb_ipreg) + begin + O_PB <= x"FF"; -- if not driven, float high + O_PB_OE_L <= x"FF"; + portb_read <= x"00"; + + if (groupb_mode = '0') then -- simple io + if (r_control(1) = '0') then -- output + O_PB <= r_portb; + O_PB_OE_L <= x"00"; + end if; + portb_read <= I_PB; + else -- strobed mode + if (r_control(1) = '0') then -- output + O_PB <= r_portb; + O_PB_OE_L <= x"00"; + end if; + portb_read <= portb_ipreg; + end if; + end process; + + p_portc_out : process(r_portc, r_control, groupa_mode, groupb_mode, + a_obf_l, a_ibf, a_intr,b_obf_l, b_ibf, b_intr) + begin + O_PC <= x"FF"; -- if not driven, float high + O_PC_OE_L <= x"FF"; + + -- bits 7..4 + if (groupa_mode = "00") then -- simple io + if (r_control(3) = '0') then -- output + O_PC (7 downto 4) <= r_portc(7 downto 4); + O_PC_OE_L(7 downto 4) <= x"0"; + end if; + elsif (groupa_mode = "01") then -- mode1 + + if (r_control(4) = '0') then -- port a output + O_PC (7) <= a_obf_l; + O_PC_OE_L(7) <= '0'; + -- 6 is ack_l input + if (r_control(3) = '0') then -- port c output + O_PC (5 downto 4) <= r_portc(5 downto 4); + O_PC_OE_L(5 downto 4) <= "00"; + end if; + else -- port a input + if (r_control(3) = '0') then -- port c output + O_PC (7 downto 6) <= r_portc(7 downto 6); + O_PC_OE_L(7 downto 6) <= "00"; + end if; + O_PC (5) <= a_ibf; + O_PC_OE_L(5) <= '0'; + -- 4 is stb_l input + end if; + + else -- if (groupa_mode(1) = '1') then -- mode2 + O_PC (7) <= a_obf_l; + O_PC_OE_L(7) <= '0'; + -- 6 is ack_l input + O_PC (5) <= a_ibf; + O_PC_OE_L(5) <= '0'; + -- 4 is stb_l input + end if; + + -- bit 3 (controlled by group a) + if (groupa_mode = "00") then -- group a steals this bit + --if (groupb_mode = '0') then -- we will let bit 3 be driven, data sheet is a bit confused about this + if (r_control(0) = '0') then -- ouput (note, groupb control bit) + O_PC (3) <= r_portc(3); + O_PC_OE_L(3) <= '0'; + end if; + -- + else -- stolen + O_PC (3) <= a_intr; + O_PC_OE_L(3) <= '0'; + end if; + + -- bits 2..0 + if (groupb_mode = '0') then -- simple io + if (r_control(0) = '0') then -- output + O_PC (2 downto 0) <= r_portc(2 downto 0); + O_PC_OE_L(2 downto 0) <= "000"; + end if; + else + -- mode 1 + -- 2 is input + if (r_control(1) = '0') then -- output + O_PC (1) <= b_obf_l; + O_PC_OE_L(1) <= '0'; + else -- input + O_PC (1) <= b_ibf; + O_PC_OE_L(1) <= '0'; + end if; + O_PC (0) <= b_intr; + O_PC_OE_L(0) <= '0'; + end if; + end process; + + p_portc_in : process(r_portc, I_PC, r_control, groupa_mode, groupb_mode, a_ibf, b_obf_l, + a_obf_l, a_inte1, a_inte2, a_intr, b_inte, b_ibf, b_intr) + begin + portc_read <= x"00"; + + a_stb_l <= '1'; + a_ack_l <= '1'; + b_stb_l <= '1'; + b_ack_l <= '1'; + + if (groupa_mode = "01") then -- mode1 or 2 + if (r_control(4) = '0') then -- port a output + a_ack_l <= I_PC(6); + else -- port a input + a_stb_l <= I_PC(4); + end if; + elsif (groupa_mode(1) = '1') then -- mode 2 + a_ack_l <= I_PC(6); + a_stb_l <= I_PC(4); + end if; + + if (groupb_mode = '1') then + if (r_control(1) = '0') then -- output + b_ack_l <= I_PC(2); + else -- input + b_stb_l <= I_PC(2); + end if; + end if; + + if (groupa_mode = "00") then -- simple io + portc_read(7 downto 3) <= I_PC(7 downto 3); + elsif (groupa_mode = "01") then + if (r_control(4) = '0') then -- port a output + portc_read(7 downto 3) <= a_obf_l & a_inte1 & I_PC(5 downto 4) & a_intr; + else -- input + portc_read(7 downto 3) <= I_PC(7 downto 6) & a_ibf & a_inte2 & a_intr; + end if; + else -- mode 2 + portc_read(7 downto 3) <= a_obf_l & a_inte1 & a_ibf & a_inte2 & a_intr; + end if; + + if (groupb_mode = '0') then -- simple io + portc_read(2 downto 0) <= I_PC(2 downto 0); + else + if (r_control(1) = '0') then -- output + portc_read(2 downto 0) <= b_inte & b_obf_l & b_intr; + else -- input + portc_read(2 downto 0) <= b_inte & b_ibf & b_intr; + end if; + end if; + end process; + + p_ipreg : process + begin + wait until rising_edge(CLK); + -- pc4 input a_stb_l + -- pc2 input b_stb_l + + if (ENA = '1') then + if (a_stb_l = '0') then + porta_ipreg <= I_PA; + end if; + + if (mode_clear = '1') then + portb_ipreg <= (others => '0'); + elsif (b_stb_l = '0') then + portb_ipreg <= I_PB; + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/keyboard.v b/Arcade/Scramble Hardware/Frogger_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Scramble Hardware/Frogger_MiST/rtl/mist_io.v b/Arcade/Scramble Hardware/Frogger_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_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/Arcade/Scramble Hardware/Frogger_MiST/rtl/osd.v b/Arcade/Scramble Hardware/Frogger_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_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/Arcade/Scramble Hardware/Frogger_MiST/rtl/pll.qip b/Arcade/Scramble Hardware/Frogger_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_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/Arcade/Scramble Hardware/Frogger_MiST/rtl/pll.v b/Arcade/Scramble Hardware/Frogger_MiST/rtl/pll.v new file mode 100644 index 00000000..1d3529bd --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 78, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 71, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "78" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.576923" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "71" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.57627100" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "78" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "71" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Scramble Hardware/Frogger_MiST/rtl/scandoubler.v b/Arcade/Scramble Hardware/Frogger_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Scramble Hardware/Frogger_MiST/rtl/scramble.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/scramble.vhd new file mode 100644 index 00000000..e496ae76 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/scramble.vhd @@ -0,0 +1,587 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE is + port ( + I_HWSEL_FROGGER : in boolean; + -- + O_VIDEO_R : out std_logic_vector(3 downto 0); + O_VIDEO_G : out std_logic_vector(3 downto 0); + O_VIDEO_B : out std_logic_vector(3 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + -- to audio board + -- + O_ADDR : out std_logic_vector(15 downto 0); + O_DATA : out std_logic_vector( 7 downto 0); + I_DATA : in std_logic_vector( 7 downto 0); + I_DATA_OE_L : in std_logic; + O_RD_L : out std_logic; + O_WR_L : out std_logic; + O_IOPC7 : out std_logic; + O_RESET_WD_L : out std_logic; + -- + ENA : in std_logic; + ENAB : in std_logic; + ENA_12 : in std_logic; + -- + RESET : in std_logic; -- active high + CLK : in std_logic + ); +end; + +architecture RTL of SCRAMBLE is + + type array_4x8 is array (0 to 3) of std_logic_vector(7 downto 0); + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal reset_wd_l : std_logic; + + -- timing decode + signal do_hsync : boolean; + signal set_vblank : boolean; + signal vsync : std_logic; + signal hsync : std_logic; + signal vblank : std_logic; + signal hblank : std_logic; + -- + -- cpu + signal cpu_ena : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_wr_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal page_4to7_l : std_logic; + + signal wren : std_logic; + + signal objen_l : std_logic; + signal waen_l : std_logic; + + signal objramrd_l : std_logic; + signal vramrd_l : std_logic; + + signal select_l : std_logic; + signal objramwr_l : std_logic; + signal vramwr_l : std_logic; + + -- control reg + signal control_reg : std_logic_vector(7 downto 0); + signal intst_l : std_logic; + signal iopc7 : std_logic; + signal pout1 : std_logic; + signal starson : std_logic; + signal hcma : std_logic; + signal vcma : std_logic; + + signal pgm_rom_dout : array_4x8; + signal rom_dout : std_logic_vector(7 downto 0); + signal ram_dout : std_logic_vector(7 downto 0); + signal ram_ena : std_logic; + + signal vram_data : std_logic_vector(7 downto 0); + +begin + + O_HBLANK <= hblank; + O_VBLANK <= vblank; + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(CLK); + if (ENA = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + p_sync_comb : process(hcnt, vcnt) + begin + vsync <= not vcnt(8); + do_hsync <= (hcnt = "010101111"); -- 0AF + set_vblank <= (vcnt = "111101111"); -- 1EF + end process; + + p_sync : process + begin + wait until rising_edge(CLK); + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + if (ENA = '1') then + if (hcnt = "010000001") then -- 081 + hblank <= '1'; + elsif (hcnt = "011111111") then -- 0f9 + hblank <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if set_vblank then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + p_video_timing_reg : process + begin + wait until rising_edge(CLK); + -- match output delay in video module + if (ENA = '1') then + O_HSYNC <= HSYNC; + O_VSYNC <= VSYNC; + end if; + end process; + + p_cpu_ena : process(hcnt, ENA) + begin + -- cpu clocked on rising edge of 1h, late + cpu_ena <= ENA and hcnt(0); -- 1h + end process; + -- + -- video + -- + u_video : entity work.SCRAMBLE_VIDEO + port map ( + I_HWSEL_FROGGER => I_HWSEL_FROGGER, + -- + I_HCNT => hcnt, + I_VCNT => vcnt, + I_VBLANK => vblank, + I_VSYNC => vsync, + + I_VCMA => vcma, + I_HCMA => hcma, + -- + I_CPU_ADDR => cpu_addr, + I_CPU_DATA => cpu_data_out, + O_VRAM_DATA => vram_data, + -- note, looks like the real hardware cannot read from object ram + -- + I_VRAMWR_L => vramwr_l, + I_VRAMRD_L => vramrd_l, + I_OBJRAMWR_L => objramwr_l, + I_OBJRAMRD_L => objramrd_l, + I_OBJEN_L => objen_l, + -- + I_STARSON => starson, + I_POUT1 => pout1, + -- + O_VIDEO_R => O_VIDEO_R, + O_VIDEO_G => O_VIDEO_G, + O_VIDEO_B => O_VIDEO_B, + -- + ENA => ENA, + ENAB => ENAB, + ENA_12 => ENA_12, + CLK => CLK + ); + + -- other cpu signals + reset_wd_l <= not RESET; -- FIX + + p_cpu_wait : process(vblank, hblank, waen_l) + begin + -- this is done a bit differently, the original had a late + -- clock to the cpu, and as mreq came out a litle early it could assert + -- wait and then gate off the write strobe to vram/objram in time. + -- + -- we are a nice synchronous system therefore we need to do this combinatorially. + -- timing is still ok. + -- + if (vblank = '1') then + cpu_wait_l <='1'; + else + cpu_wait_l <= '1'; + if (hblank = '0') and (waen_l = '0') then + cpu_wait_l <= '0'; + end if; + end if; + end process; + wren <= cpu_wait_l; + + p_cpu_int : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (intst_l = '0') then + cpu_nmi_l <= '1'; + else + if do_hsync and set_vblank then + cpu_nmi_l <= '0'; + end if; + end if; + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => reset_wd_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => open, + MREQ_n => cpu_mreq_l, + IORQ_n => open, + RD_n => cpu_rd_l, + WR_n => cpu_wr_l, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + -- + -- primary addr decode + -- + p_mem_decode : process(cpu_rfsh_l, cpu_rd_l, cpu_wr_l, cpu_mreq_l, cpu_addr, I_HWSEL_FROGGER) + begin + -- Scramble map + --0000-3fff ROM + --4000-47ff RAM + --4800-4bff Video RAM + --5000-50ff Object RAM + --5000-503f screen attributes + --5040-505f sprites + --5060-507f bullets + --5080-50ff unused? + + --read: + --7000 Watchdog Reset (Scramble) + --8100 IN0 + --8101 IN1 + --8102 IN2 (bits 5 and 7 used for protection check in Scramble) + + --write: + --6800-6807 control reg + --8200 To AY-3-8910 port A (commands for the audio CPU) + --8201 bit 3 = interrupt trigger on audio CPU bit 4 = AMPM (?) + --8202 protection check control? + + -- Frogger map + --0000-3fff ROM + --8000-87ff RAM + --a800-abff Video RAM + --b000-b0ff Object RAM + --b000-b03f screen attributes + --b040-b05f sprites + --b060-b0ff unused? + + --read: + --8800 Watchdog Reset + --e000 IN0 + --e002 IN1 + --e004 IN2 + cpu_int_l <= '1'; + cpu_busrq_l <= '1'; + + page_4to7_l <= '1'; + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + + if I_HWSEL_FROGGER then + cpu_int_l <= '0'; + cpu_busrq_l <= cpu_addr(15); + end if; + + if not I_HWSEL_FROGGER then + if (cpu_addr(15 downto 14) = "01") then page_4to7_l <= '0'; end if; + else + if (cpu_addr(15 downto 14) = "10") then page_4to7_l <= '0'; end if; + end if; + end if; + + end process; + + p_mem_decode2 : process(I_HWSEL_FROGGER, cpu_addr, page_4to7_l, cpu_rfsh_l, cpu_rd_l, cpu_wr_l, wren) + begin + waen_l <= '1'; + objen_l <= '1'; + if not I_HWSEL_FROGGER then + if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(13 downto 11) = "001") then waen_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "010") then objen_l <= '0'; end if; + end if; + else + if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(13 downto 11) = "101") then waen_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "110") then objen_l <= '0'; end if; + end if; + end if; + + -- read decode + vramrd_l <= '1'; + objramrd_l <= '1'; + + if not I_HWSEL_FROGGER then + if (page_4to7_l = '0') and (cpu_rd_l = '0') then + if (cpu_addr(13 downto 11) = "001") then vramrd_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "010") then objramrd_l <= '0'; end if; + end if; + else + if (page_4to7_l = '0') and (cpu_rd_l = '0') then + if (cpu_addr(13 downto 11) = "101") then vramrd_l <= '0'; end if; + end if; + end if; + -- write decode + vramwr_l <= '1'; + objramwr_l <= '1'; + select_l <= '1'; + + if not I_HWSEL_FROGGER then + if (page_4to7_l = '0') and (cpu_wr_l = '0') and (wren = '1') then + if (cpu_addr(13 downto 11) = "001") then vramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "010") then objramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "101") then select_l <= '0'; end if; -- control reg + end if; + else + if (page_4to7_l = '0') and (cpu_wr_l = '0') and (wren = '1') then + if (cpu_addr(13 downto 11) = "101") then vramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "110") then objramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "111") then select_l <= '0'; end if; -- control reg + end if; + end if; + end process; + + p_control_reg : process + variable addr : std_logic_vector(2 downto 0); + variable dec : std_logic_vector(7 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + -- scramble + --6801 interrupt enable + --6802 coin counter + --6803 ? (POUT1) + --6804 stars on + --6805 ? (POUT2) + --6806 screen vertical flip + --6807 screen horizontal flip + if not I_HWSEL_FROGGER then + addr := cpu_addr(2 downto 0); + else + addr := cpu_addr(4 downto 2); + end if; + + dec := "00000000"; + if (select_l = '0') then + case addr(2 downto 0) is + when "000" => dec := "00000001"; + when "001" => dec := "00000010"; + when "010" => dec := "00000100"; + when "011" => dec := "00001000"; + when "100" => dec := "00010000"; + when "101" => dec := "00100000"; + when "110" => dec := "01000000"; + when "111" => dec := "10000000"; + when others => null; + end case; + end if; + + if (reset_wd_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (dec(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + p_control_reg_assign : process(control_reg, I_HWSEL_FROGGER) + begin + if not I_HWSEL_FROGGER then + -- Scramble + intst_l <= control_reg(1); + iopc7 <= control_reg(2); + pout1 <= control_reg(3); + starson <= control_reg(4); + hcma <= control_reg(6); + vcma <= control_reg(7); + else + intst_l <= control_reg(2); + iopc7 <= control_reg(6); + pout1 <= control_reg(7); + starson <= '0'; + hcma <= control_reg(4); + vcma <= control_reg(3); + end if; + end process; + -- + -- + -- roms / rams + pgm_rom : entity work.ROM_PGM + port map (CLK => CLK, ADDR => cpu_addr(13 downto 0), DATA => rom_dout); +-- pgm_rom01 : entity work.ROM_PGM_01 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(0)); +-- pgm_rom23 : entity work.ROM_PGM_23 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(1)); +-- pgm_rom45 : entity work.ROM_PGM_45 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(2)); +-- pgm_rom56 : entity work.ROM_PGM_67 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(3)); + +-- p_rom_mux : process(cpu_addr, pgm_rom_dout) +-- begin +-- rom_dout <= (others => '0'); +-- case cpu_addr(13 downto 12) is +-- when "00" => rom_dout <= pgm_rom_dout(0); +-- when "01" => rom_dout <= pgm_rom_dout(1); +-- when "10" => rom_dout <= pgm_rom_dout(2); +-- when "11" => rom_dout <= pgm_rom_dout(3); +-- when others => null; +-- end case; +-- end process; + + u_cpu_ram : work.dpram generic map (11,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => ram_ena and (not cpu_wr_l), + + addr_a_i => cpu_addr(10 downto 0), + data_a_i => cpu_data_out, + + clk_b_i => clk, + addr_b_i => cpu_addr(10 downto 0), + data_b_o => ram_dout + ); + + p_ram_ctrl : process(cpu_addr, page_4to7_l) + begin + ram_ena <= '0'; + if (page_4to7_l = '0') and (cpu_addr(13 downto 11) = "000") then + ram_ena <= '1'; + end if; + end process; + + p_cpu_data_in_mux : process(I_HWSEL_FROGGER, cpu_addr, cpu_rd_l, cpu_mreq_l, cpu_rfsh_l, ram_dout, rom_dout, vramrd_l, vram_data, I_DATA_OE_L, I_DATA ) + variable ram_addr : std_logic_vector(1 downto 0); + begin + + if not I_HWSEL_FROGGER then + ram_addr := "01"; + else + ram_addr := "10"; + end if; + + cpu_data_in <= (others => '0'); + if (vramrd_l = '0') then + cpu_data_in <= vram_data; + -- + elsif (I_DATA_OE_L = '0') then + cpu_data_in <= I_DATA; + -- + elsif (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(15 downto 14) = "00") and (cpu_rd_l = '0') and (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + cpu_data_in <= rom_dout; + -- + elsif (cpu_addr(15 downto 14) = ram_addr) then + if (cpu_addr(13 downto 11) = "000") and (cpu_rd_l = '0') then + cpu_data_in <= ram_dout; + else + cpu_data_in <= x"FF"; + end if; + end if; + else + cpu_data_in <= x"FF"; + end if; + + end process; + + -- to audio + O_ADDR <= cpu_addr; + O_DATA <= cpu_data_out; + O_RD_L <= cpu_rd_l; + O_WR_L <= cpu_wr_l; + O_IOPC7 <= iopc7; + O_RESET_WD_L <= reset_wd_l; + +end RTL; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/scramble_audio.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/scramble_audio.vhd new file mode 100644 index 00000000..82214404 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/scramble_audio.vhd @@ -0,0 +1,842 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE_AUDIO is + port ( + I_HWSEL_FROGGER : in boolean; + -- + I_ADDR : in std_logic_vector(15 downto 0); + I_DATA : in std_logic_vector( 7 downto 0); + O_DATA : out std_logic_vector( 7 downto 0); + O_DATA_OE_L : out std_logic; + -- + I_RD_L : in std_logic; + I_WR_L : in std_logic; + I_IOPC7 : in std_logic; + -- + O_AUDIO : out std_logic_vector( 9 downto 0); + -- + I_1P_CTRL : in std_logic_vector( 6 downto 0); -- start, shoot1, shoot2, left,right,up,down + I_2P_CTRL : in std_logic_vector( 6 downto 0); -- start, shoot1, shoot2, left,right,up,down + I_SERVICE : in std_logic; + I_COIN1 : in std_logic; + I_COIN2 : in std_logic; + O_COIN_COUNTER : out std_logic; + -- + I_DIP : in std_logic_vector( 5 downto 1); + -- + I_RESET_L : in std_logic; + ENA : in std_logic; -- 6 MHz + ENA_1_79 : in std_logic; -- 1.78975 MHz + CLK : in std_logic + ); +end; + +architecture RTL of SCRAMBLE_AUDIO is + + signal reset : std_logic; + signal cpu_ena : std_logic; + signal cpu_ena_gated : std_logic; + -- + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_wr_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + -- + signal ram_cs : std_logic; + signal rom_oe : std_logic; + signal filter_load : std_logic; + signal filter_reg : std_logic_vector(11 downto 0); + -- + signal cpu_rom0_dout : std_logic_vectoR(7 downto 0); + signal cpu_rom1_dout : std_logic_vectoR(7 downto 0); + signal cpu_rom2_dout : std_logic_vectoR(7 downto 0); + signal rom_active : std_logic; + + signal rom_dout : std_logic_vector(7 downto 0); + signal ram_dout : std_logic_vector(7 downto 0); + -- + signal i8255_addr : std_logic_vector(1 downto 0); + signal i8255_1D_data : std_logic_vector(7 downto 0); + signal i8255_1D_data_oe_l : std_logic; + signal i8255_1D_cs_l : std_logic; + signal i8255_1D_pa_out : std_logic_vector(7 downto 0); + signal i8255_1D_pb_out : std_logic_vector(7 downto 0); + -- + signal i8255_1E_data : std_logic_vector(7 downto 0); + signal i8255_1E_data_oe_l : std_logic; + signal i8255_1E_cs_l : std_logic; + signal i8255_1E_pa : std_logic_vector(7 downto 0); + signal i8255_1E_pb : std_logic_vector(7 downto 0); + signal i8255_1E_pc : std_logic_vector(7 downto 0); + + -- security + signal net_1e10_i : std_logic; + signal net_1e12_i : std_logic; + signal xb : std_logic_vector(7 downto 0); + signal xbo : std_logic_vector(7 downto 0); + + signal audio_div_cnt : std_logic_vector( 8 downto 0) := (others => '0'); + signal ls90_op : std_logic_vector(3 downto 0); + signal ls90_clk : std_logic; + signal ls90_cnt : std_logic_vector( 3 downto 0) := (others => '0'); + -- ym2149 3C + signal ym2149_3C_dv : std_logic_vector(7 downto 0); + signal ym2149_3C_oe_l : std_logic; + signal ym2149_3C_bdir : std_logic; + signal ym2149_3C_bc2 : std_logic; + signal ym2149_3C_bc1 : std_logic; + signal ym2149_3C_audio : std_logic_vector(7 downto 0); + signal ym2149_3C_chan : std_logic_vector(1 downto 0); + signal ym2149_3C_chan_t1 : std_logic_vector(1 downto 0); + -- + -- ym2149 3D + signal ym2149_3D_dv : std_logic_vector(7 downto 0); + signal ym2149_3D_oe_l : std_logic; + signal ym2149_3D_bdir : std_logic; + signal ym2149_3D_bc2 : std_logic; + signal ym2149_3D_bc1 : std_logic; + signal ym2149_3D_audio : std_logic_vector(7 downto 0); + signal ym2149_3D_chan : std_logic_vector(1 downto 0); + signal ym2149_3D_chan_t1 : std_logic_vector(1 downto 0); + signal ym2149_3D_ioa_in : std_logic_vector(7 downto 0); + signal ym2149_3D_ioa_out : std_logic_vector(7 downto 0); + signal ym2149_3D_ioa_oe_l : std_logic; + signal ym2149_3D_iob_in : std_logic_vector(7 downto 0); + -- + signal ampm : std_logic; + signal sint : std_logic; + signal sint_t1 : std_logic; + -- + signal audio_3C_mix : std_logic_vector(9 downto 0); + signal audio_3C_final : std_logic_vector(9 downto 0); + signal audio_3D_mix : std_logic_vector(9 downto 0); + signal audio_3D_final : std_logic_vector(9 downto 0); + signal audio_final : std_logic_vector(10 downto 0); + + signal security_count : std_logic_vector(2 downto 0); + signal rd_l_t1 : std_logic; + -- filters + signal ym2149_3C_k : std_logic_vector(16 downto 0); + signal ym2149_3D_k : std_logic_vector(16 downto 0); + signal audio_in_m_out_3C : std_logic_vector(17 downto 0); + signal audio_in_m_out_3D : std_logic_vector(17 downto 0); + signal audio_mult_3C : std_logic_vector(35 downto 0); + signal audio_mult_3D : std_logic_vector(35 downto 0); + + + + type array_4of17 is array (3 downto 0) of std_logic_vector(16 downto 0); + constant K_Filter : array_4of17 := ('0' & x"00A3", + '0' & x"00C6", + '0' & x"039D", + '1' & x"0000" ); + + type filter_pipe is array (3 downto 0) of std_logic_vector(17 downto 0); + signal ym2149_3C_audio_pipe : filter_pipe; + signal ym2149_3D_audio_pipe : filter_pipe; + -- LP filter out = in.k + out_t1.(1-k) + -- + -- = (in-out_t1).k + out_t1 + -- + -- using + -- -(Ts.2.PI.Fc) + -- k = 1-e + -- + -- sampling freq = 1.79 MHz + -- + -- cut off freqs bit 0 1 + -- + --0.267uf ~ 713 Hz 1 1 0.00249996 x 00A3 + --0.220uf ~ 865 Hz 1 0 0.00303210 x 00C6 + --0.047uf ~ 4050 Hz 0 1 0.01411753 x 039D + -- 0 0 x10000 + +begin + -- scramble + --0000-1fff ROM + --8000-83ff RAM + + -- frogger + --0000-17ff ROM + --4000-43ff RAM + + cpu_ena <= '1'; -- run at audio clock speed + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + cpu_wait_l <= '1'; + -- + cpu_ena_gated <= ENA_1_79 and cpu_ena; + u_cpu : entity work.T80sed + port map ( + RESET_n => I_RESET_L, + CLK_n => CLK, + CLKEN => cpu_ena_gated, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => cpu_wr_l, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + + p_cpu_int : process(CLK, I_RESET_L) + begin + if (I_RESET_L = '0') then + cpu_int_l <= '1'; + sint_t1 <= '0'; + elsif rising_edge(CLK) then + if (ENA_1_79 = '1') then + sint_t1 <= sint; + + if (cpu_m1_l = '0') and (cpu_iorq_l = '0') then + cpu_int_l <= '1'; + elsif (sint = '0') and (sint_t1 = '1') then + cpu_int_l <= '0'; + end if; + end if; + end if; + end process; + + p_mem_decode_comb : process(cpu_rfsh_l, cpu_wr_l, cpu_rd_l, cpu_mreq_l, cpu_addr, I_HWSEL_FROGGER) + variable decode : std_logic; + begin + if not I_HWSEL_FROGGER then + decode := '0'; + if (cpu_rfsh_l = '1') and (cpu_mreq_l = '0') and (cpu_addr(15) = '1') then + decode := '1'; + end if; + + filter_load <= decode and cpu_addr(12) and (not cpu_wr_l); + ram_cs <= decode and (not cpu_addr(12)); + else + decode := '0'; + if (cpu_rfsh_l = '1') and (cpu_mreq_l = '0') and (cpu_addr(14) = '1') then + decode := '1'; + end if; + + filter_load <= decode and cpu_addr(13) and (not cpu_wr_l); + ram_cs <= decode and (not cpu_addr(13)); + end if; + + rom_oe <= '0'; + if not I_HWSEL_FROGGER then + if (cpu_addr(15) = '0') and (cpu_mreq_l = '0') and (cpu_rd_l = '0') then + rom_oe <= '1'; + end if; + else + if (cpu_addr(14) = '0') and (cpu_mreq_l = '0') and (cpu_rd_l = '0') then + rom_oe <= '1'; + end if; + end if; + + end process; + + u_rom_5c : entity work.ROM_SND_0 + port map ( + CLK => CLK, + ADDR => cpu_addr(10 downto 0), + DATA => cpu_rom0_dout + ); + + u_rom_5d : entity work.ROM_SND_1 + port map ( + CLK => CLK, + ADDR => cpu_addr(10 downto 0), + DATA => cpu_rom1_dout + ); + + u_rom_5e : entity work.ROM_SND_2 + port map ( + CLK => CLK, + ADDR => cpu_addr(10 downto 0), + DATA => cpu_rom2_dout + ); + + p_rom_mux : process(I_HWSEL_FROGGER, cpu_rom0_dout, cpu_rom1_dout, cpu_rom2_dout, cpu_addr, rom_oe) + variable rom_oe_decode : std_logic; + variable cpu_rom0_dout_s : std_logic_vector(7 downto 0); + begin + if not I_HWSEL_FROGGER then + cpu_rom0_dout_s := cpu_rom0_dout; + else -- swap bits 0 and 1 + cpu_rom0_dout_s := cpu_rom0_dout(7 downto 2) & cpu_rom0_dout(0) & cpu_rom0_dout(1); + end if; + + rom_dout <= (others => '0'); + rom_oe_decode := '0'; + case cpu_addr(13 downto 11) is + when "000" => rom_dout <= cpu_rom0_dout_s; rom_oe_decode := '1'; + when "001" => rom_dout <= cpu_rom1_dout; rom_oe_decode := '1'; + when "010" => rom_dout <= cpu_rom2_dout; rom_oe_decode := '1'; + when others => null; + end case; + + rom_active <= '0'; + if (rom_oe = '1') then + rom_active <= rom_oe_decode; + end if; + end process; + + u_ram_6c_6d : work.dpram generic map (10,8) + port map + ( + addr_a_i => cpu_addr(9 downto 0), + data_a_i => cpu_data_out, + clk_b_i => clk, + addr_b_i => cpu_addr(9 downto 0), + data_b_o => ram_dout, + we_i => ram_cs and (not cpu_wr_l), + en_a_i => ENA_1_79, + clk_a_i => clk + ); + + p_cpu_data_mux : process(rom_dout, rom_active, ram_dout, ym2149_3C_oe_l, ym2149_3C_dv, ym2149_3D_oe_l, ym2149_3D_dv, ram_cs, cpu_wr_l) + begin + if (rom_active = '1') then + cpu_data_in <= rom_dout; + elsif (ram_cs = '1') and (cpu_wr_l = '1') then + cpu_data_in <= ram_dout; + elsif (ym2149_3C_oe_l = '0') then + cpu_data_in <= ym2149_3C_dv; + elsif (ym2149_3D_oe_l = '0') then + cpu_data_in <= ym2149_3D_dv; + else + cpu_data_in <= (others => '1'); -- float high + end if; + end process; + + p_filter_reg : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + if (filter_load = '1') then + filter_reg <= cpu_addr(11 downto 0); + end if; + end if; + end process; + + p_8255_decode : process(I_RESET_L, I_ADDR, I_HWSEL_FROGGER) + begin + reset <= not I_RESET_L; + i8255_1D_cs_l <= '1'; + i8255_1E_cs_l <= '1'; + + if not I_HWSEL_FROGGER then + -- the interface one + if (I_ADDR(9) = '1') and (I_ADDR(15) = '1') then + i8255_1D_cs_l <= '0'; + end if; + + -- the button one + if (I_ADDR(8) = '1') and (I_ADDR(15) = '1') then + i8255_1E_cs_l <= '0'; + end if; + i8255_addr <= I_ADDR(1 downto 0); + else + -- the interface one + if (I_ADDR(12) = '1') and (I_ADDR(15 downto 14) = "11") then + i8255_1D_cs_l <= '0'; + end if; + + -- the button one + if (I_ADDR(13) = '1') and (I_ADDR(15 downto 14) = "11") then + i8255_1E_cs_l <= '0'; + end if; + i8255_addr <= I_ADDR(2 downto 1); + end if; + end process; + + p_ym_decode : process(cpu_rd_l, cpu_wr_l, cpu_iorq_l, cpu_addr, I_HWSEL_FROGGER) + variable rd_3c : std_logic; + variable wr_3c : std_logic; + variable ad_3c : std_logic; + -- + variable rd_3d : std_logic; + variable wr_3d : std_logic; + variable ad_3d : std_logic; + begin + + --bdir bc2 bc1 + -- 0 0 0 nop + -- 0 0 1 addr latch < WR_L AV4 / AV6 + -- 0 1 0 nop + -- 0 1 1 data read < RD_L AV5 / AV7 + + -- 1 0 0 addr latch + -- 1 0 1 nop + -- 1 1 0 data write < WR_L AV5 / AV7 + -- 1 1 1 addr latch + + + if not I_HWSEL_FROGGER then + rd_3c := (not cpu_rd_l) and (not cpu_iorq_l) and cpu_addr(5); + wr_3c := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(5); + ad_3c := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(4); + else + rd_3c := '0'; + wr_3c := '0'; + ad_3c := '0'; + end if; + + ym2149_3C_bdir <= wr_3c; + ym2149_3C_bc2 <= rd_3c or wr_3c; + ym2149_3C_bc1 <= rd_3c or ad_3c; + + + if not I_HWSEL_FROGGER then + rd_3d := (not cpu_rd_l) and (not cpu_iorq_l) and cpu_addr(7); + wr_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(7); + ad_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(6); + else + rd_3d := (not cpu_rd_l) and (not cpu_iorq_l) and cpu_addr(6); + wr_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(6); + ad_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(7); + end if; + + ym2149_3D_bdir <= wr_3d; + ym2149_3D_bc2 <= rd_3d or wr_3d; + ym2149_3D_bc1 <= rd_3d or ad_3d; + + end process; + + i8255_1E_pa(7) <= I_COIN1; + i8255_1E_pa(6) <= I_COIN2; + i8255_1E_pa(5) <= I_1P_CTRL(3); -- left + i8255_1E_pa(4) <= I_1P_CTRL(2); -- right + i8255_1E_pa(3) <= I_1P_CTRL(4); -- shoot1 + i8255_1E_pa(2) <= I_SERVICE; + i8255_1E_pa(1) <= I_1P_CTRL(5); -- shoot2 + i8255_1E_pa(0) <= I_2P_CTRL(1); -- up + + i8255_1E_pb(7) <= I_1P_CTRL(6); -- start + i8255_1E_pb(6) <= I_2P_CTRL(6); -- start + i8255_1E_pb(5) <= I_2P_CTRL(3); -- left + i8255_1E_pb(4) <= I_2P_CTRL(2); -- right + i8255_1E_pb(3) <= I_2P_CTRL(4); -- shoot1 + i8255_1E_pb(2) <= I_2P_CTRL(5); -- shoot2 + i8255_1E_pb(1) <= I_DIP(1); + i8255_1E_pb(0) <= I_DIP(2); + + i8255_1E_pc(7) <= net_1e10_i; + i8255_1E_pc(6) <= I_1P_CTRL(0); -- down + i8255_1E_pc(5) <= net_1e12_i; + i8255_1E_pc(4) <= I_1P_CTRL(1); -- up + i8255_1E_pc(3) <= I_DIP(3); + i8255_1E_pc(2) <= I_DIP(4); + i8255_1E_pc(1) <= I_DIP(5); + i8255_1E_pc(0) <= I_2P_CTRL(0); -- down + O_COIN_COUNTER <= not I_IOPC7; -- open drain actually + + -- + -- PIA CHIPS + -- + u_i8255_1D : entity work.I82C55 -- bus interface + port map ( + I_ADDR => i8255_addr, + I_DATA => I_DATA, + O_DATA => i8255_1D_data, + O_DATA_OE_L => i8255_1D_data_oe_l, + + I_CS_L => i8255_1D_cs_l, + I_RD_L => I_RD_L, + I_WR_L => I_WR_L, + + I_PA => i8255_1D_pa_out, + O_PA => i8255_1D_pa_out, + O_PA_OE_L => open, + + I_PB => i8255_1D_pb_out, + O_PB => i8255_1D_pb_out, + O_PB_OE_L => open, + + I_PC => xbo, + O_PC => xb, + O_PC_OE_L => open, + + RESET => reset, + ENA => ENA, + CLK => CLK + ); + + u_i8255_1E : entity work.I82C55 -- push button + port map ( + I_ADDR => i8255_addr, + I_DATA => I_DATA, + O_DATA => i8255_1E_data, + O_DATA_OE_L => i8255_1E_data_oe_l, + + I_CS_L => i8255_1E_cs_l, + I_RD_L => I_RD_L, + I_WR_L => I_WR_L, + + I_PA => i8255_1E_pa, + O_PA => open, + O_PA_OE_L => open, + + I_PB => i8255_1E_pb, + O_PB => open, + O_PB_OE_L => open, + + I_PC => i8255_1E_pc, + O_PC => open, + O_PC_OE_L => open, + + RESET => reset, + ENA => ENA, + CLK => CLK + ); + + p_i8255_1d_bus_control : process(i8255_1D_pa_out, i8255_1D_pb_out, ym2149_3D_ioa_out, ym2149_3D_ioa_oe_l) + begin + if (ym2149_3D_ioa_oe_l = '0') then + ym2149_3D_ioa_in <= ym2149_3D_ioa_out; + else + ym2149_3D_ioa_in <= i8255_1D_pa_out; + end if; + + ampm <= i8255_1D_pb_out(4); -- amp mute + sint <= i8255_1D_pb_out(3); -- set int + end process; + + p_drive_cpubus : process(i8255_1D_data, i8255_1D_data_oe_l, i8255_1E_data, i8255_1E_data_oe_l) + begin + O_DATA_OE_L <= '1'; + O_DATA <= (others => '0'); + -- + if (i8255_1D_data_oe_l = '0') then + -- + O_DATA_OE_L <= '0'; + O_DATA <= i8255_1D_data; + elsif (i8255_1E_data_oe_l = '0') then + -- + O_DATA_OE_L <= '0'; + O_DATA <= i8255_1E_data; + end if; + end process; + -- + -- AUDIO CHIPS + -- + p_audio_clockgen : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + audio_div_cnt <= audio_div_cnt - "1"; + ls90_clk <= not audio_div_cnt(8); + + if (audio_div_cnt(8 downto 0) = "000000000") then + if (ls90_cnt = x"9") then + ls90_cnt <= x"0"; + else + ls90_cnt <= ls90_cnt + "1"; + end if; + end if; + + ls90_op <= "0000"; + case ls90_cnt is --ls90 outputs DCBA + when x"0" => ls90_op <= "0000"; + when x"1" => ls90_op <= "0010"; + when x"2" => ls90_op <= "0100"; + when x"3" => ls90_op <= "0110"; + when x"4" => ls90_op <= "1000"; + when x"5" => ls90_op <= "0001"; + when x"6" => ls90_op <= "0011"; + when x"7" => ls90_op <= "0101"; + when x"8" => ls90_op <= "0111"; + when x"9" => ls90_op <= "1001"; + when others => ls90_op <= "0000"; + end case; + end if; + end process; + + p_ym2149_3d_iob_in : process(I_HWSEL_FROGGER, ls90_op, ls90_clk) + begin + if not I_HWSEL_FROGGER then + ym2149_3D_iob_in <= ls90_op(0) & ls90_op(3) & ls90_op(2) & ls90_clk & "1110"; + else + ym2149_3D_iob_in <= ls90_op(0) & ls90_op(3) & '1' & ls90_clk & ls90_op(2) & "110"; + end if; + end process; + + u_ym2149_3C : entity work.YM2149 -- not used for frogger + port map ( + -- data bus + I_DA => cpu_data_out, + O_DA => ym2149_3C_dv, + O_DA_OE_L => ym2149_3C_oe_l, + -- control + I_A9_L => '0', + I_A8 => '1', + I_BDIR => ym2149_3C_bdir, + I_BC2 => ym2149_3C_bc2, + I_BC1 => ym2149_3C_bc1, + I_SEL_L => '1', + + O_AUDIO => ym2149_3C_audio, + O_CHAN => ym2149_3C_chan, + -- port a + I_IOA => "11111111", + O_IOA => open, + O_IOA_OE_L => open, + -- port b + I_IOB => "11111111", + O_IOB => open, + O_IOB_OE_L => open, + + ENA => ENA_1_79, + RESET_L => I_RESET_L, + CLK => CLK + ); + + u_ym2149_3D : entity work.YM2149 + port map ( + -- data bus + I_DA => cpu_data_out, + O_DA => ym2149_3D_dv, + O_DA_OE_L => ym2149_3D_oe_l, + -- control + I_A9_L => '0', + I_A8 => '1', + I_BDIR => ym2149_3D_bdir, + I_BC2 => ym2149_3D_bc2, + I_BC1 => ym2149_3D_bc1, + I_SEL_L => '1', + + O_AUDIO => ym2149_3D_audio, + O_CHAN => ym2149_3D_chan, + -- port a + I_IOA => ym2149_3D_ioa_in, + O_IOA => ym2149_3D_ioa_out, + O_IOA_OE_L => ym2149_3D_ioa_oe_l, + -- port b + I_IOB => ym2149_3D_iob_in, + O_IOB => open, + O_IOB_OE_L => open, + + ENA => ENA_1_79, + RESET_L => I_RESET_L, + CLK => CLK + ); + + p_filter_coef : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + case ym2149_3C_chan is -- -1 as reg here + when "00" => -- chan 3 + ym2149_3C_k <= (others => '0'); + when "11" => -- chan 2 + ym2149_3C_k <= K_FILTER(conv_integer(filter_reg(5 downto 4))); + when "10" => -- chan 1 + ym2149_3C_k <= K_FILTER(conv_integer(filter_reg(3 downto 2))); + when "01" => -- chan 0 + ym2149_3C_k <= K_FILTER(conv_integer(filter_reg(1 downto 0))); + when others => null; + end case; + + case ym2149_3D_chan is -- -1 as reg here + when "00" => -- chan 3 + ym2149_3D_k <= (others => '0'); + when "11" => -- chan 2 + ym2149_3D_k <= K_FILTER(conv_integer(filter_reg(11 downto 10))); + when "10" => -- chan 1 + ym2149_3D_k <= K_FILTER(conv_integer(filter_reg( 9 downto 8))); + when "01" => -- chan 0 + ym2149_3D_k <= K_FILTER(conv_integer(filter_reg( 7 downto 6))); + when others => null; + end case; + end if; + end process; + + + p_ym2149_audio_process : process(ym2149_3C_audio, ym2149_3C_audio_pipe, ym2149_3D_audio, ym2149_3D_audio_pipe) + begin + audio_in_m_out_3C <= (('0' & ym2149_3C_audio & "000000000"))- ym2149_3C_audio_pipe(3); -- signed + audio_in_m_out_3D <= (('0' & ym2149_3D_audio & "000000000"))- ym2149_3D_audio_pipe(3); -- signed + end process; + + mult_3C : work.MULT18X18 + port map + ( + P => audio_mult_3C,-- 35..0 -- audio 8bit on 32..25 33 sign bit, + A => audio_in_m_out_3C, --17..0 + B(17) => '0', + B(16 downto 0) => ym2149_3C_k + ); + + mult_3D : work.MULT18X18 + port map + ( + P => audio_mult_3D,-- 35..0 -- audio 8bit on 32..25 33 sign bit, + A => audio_in_m_out_3D, --17..0 + B(17) => '0', + B(16 downto 0) => ym2149_3D_k + ); + + p_ym2149_audio_pipe : process(I_RESET_L, CLK) + begin + if (I_RESET_L = '0') then + ym2149_3C_audio_pipe <= (others => (others => '0')); + ym2149_3D_audio_pipe <= (others => (others => '0')); + elsif rising_edge(CLK) then +-- audio_mult_3C <= audio_in_m_out_3C * ym2149_3C_k; +-- audio_mult_3D <= audio_in_m_out_3D * ym2149_3D_k; + if (ENA_1_79 = '1') then + -- we need some holding registers anyway, so lets just make it a shift and save a mux + ym2149_3C_audio_pipe(3 downto 1) <= ym2149_3C_audio_pipe(2 downto 0); + ym2149_3C_audio_pipe(0) <= audio_mult_3C(33 downto 16) + ym2149_3C_audio_pipe(3); -- bit 33 sign + + ym2149_3D_audio_pipe(3 downto 1) <= ym2149_3D_audio_pipe(2 downto 0); + ym2149_3D_audio_pipe(0) <= audio_mult_3D(33 downto 16) + ym2149_3D_audio_pipe(3); -- bit 33 sign + end if; + end if; + end process; + + p_ym2149_audio_mix : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + ym2149_3C_chan_t1 <= ym2149_3C_chan; + ym2149_3D_chan_t1 <= ym2149_3D_chan; + + if (ym2149_3C_chan_t1 = "11") then + audio_3C_mix <= (others => '0'); + audio_3C_final <= audio_3C_mix; + else + audio_3C_mix <= audio_3C_mix + ("00" & ym2149_3C_audio_pipe(0)(16 downto 9)); + end if; + + if (ym2149_3D_chan_t1(1 downto 0) = "11") then + audio_3D_mix <= (others => '0'); + audio_3D_final <= audio_3D_mix; + else + audio_3D_mix <= audio_3D_mix + ("00" & ym2149_3D_audio_pipe(0)(16 downto 9)); + end if; + + audio_final <= ('0' & audio_3C_final) + ('0' & audio_3D_final); + end if; + end process; + + p_audio_out : process(CLK, I_RESET_L) + begin + if (I_RESET_L = '0') then + O_AUDIO <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA_1_79 = '1') then + if (ampm = '1') then + O_AUDIO <= (others => '0'); + else + if (audio_final(10) = '1') then + O_AUDIO <= (others => '1'); + else + O_AUDIO <= audio_final(9 downto 0); + end if; + end if; + end if; + end if; + end process; + + p_security_6J : process(xb) + begin + -- chip K10A PAL16L8 + -- equations from Mark @ http://www.leopardcats.com/ + xbo(3 downto 0) <= xb(3 downto 0); + xbo(4) <= not(xb(0) or xb(1) or xb(2) or xb(3)); + xbo(5) <= not((not xb(2) and not xb(0)) or (not xb(2) and not xb(1)) or (not xb(3) and not xb(0)) or (not xb(3) and not xb(1))); + + xbo(6) <= not(not xb(0) and not xb(3)); + xbo(7) <= not((not xb(1)) or xb(2)); + end process; + + p_security_count : process(CLK, I_RESET_L) + begin + if (I_RESET_L = '0') then + security_count <= "000"; + elsif rising_edge(CLK) then + rd_l_t1 <= i_rd_l; + if (I_ADDR = x"8102") and (I_RD_L = '0') and (rd_l_t1 = '1') then + security_count <= security_count + "1"; + end if; + end if; + end process; + + p_security_2B : process(security_count) + begin + -- I am not sure what this chip does yet, but this gets us past the initial check for now. + case security_count is + when "000" => net_1e10_i <= '0'; net_1e12_i <= '1'; + when "001" => net_1e10_i <= '0'; net_1e12_i <= '1'; + when "010" => net_1e10_i <= '1'; net_1e12_i <= '0'; + when "011" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "100" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "101" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "110" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "111" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when others => null; + end case; + end process; + +end RTL; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/scramble_top.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/scramble_top.vhd new file mode 100644 index 00000000..5e54037c --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/scramble_top.vhd @@ -0,0 +1,242 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE_TOP is +port ( + O_VIDEO_R : out std_logic_vector(3 downto 0); + O_VIDEO_G : out std_logic_vector(3 downto 0); + O_VIDEO_B : out std_logic_vector(3 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + + O_AUDIO : out std_logic_vector(9 downto 0); + + button_in : in std_logic_vector(7 downto 0); + + RESET : in std_logic; + clk : in std_logic; -- 25 + ena_12 : in std_logic; -- 6.25 x 2 + ena_6 : in std_logic; -- 6.25 (inverted) + ena_6b : in std_logic; -- 6.25 + ena_1_79 : in std_logic -- 1.786 +); +end; + +architecture RTL of SCRAMBLE_TOP is +-- this MUST be set true for frogger +-- this MUST be set false for scramble, the_end, amidar +constant I_HWSEL_FROGGER : boolean := true; + +-- ip registers +signal ip_1p : std_logic_vector(6 downto 0); +signal ip_2p : std_logic_vector(6 downto 0); +signal ip_service : std_logic; +signal ip_coin1 : std_logic; +signal ip_coin2 : std_logic; +signal ip_dip_switch : std_logic_vector(5 downto 1); + +-- ties to audio board +signal audio_addr : std_logic_vector(15 downto 0); +signal audio_data_out : std_logic_vector(7 downto 0); +signal audio_data_in : std_logic_vector(7 downto 0); +signal audio_data_oe_l : std_logic; +signal audio_rd_l : std_logic; +signal audio_wr_l : std_logic; +signal audio_iopc7 : std_logic; +signal audio_reset_l : std_logic; + +begin + +u_scramble : entity work.SCRAMBLE +port map ( + I_HWSEL_FROGGER => I_HWSEL_FROGGER, + -- + O_VIDEO_R => O_VIDEO_R, + O_VIDEO_G => O_VIDEO_G, + O_VIDEO_B => O_VIDEO_B, + O_HSYNC => O_HSYNC, + O_VSYNC => O_VSYNC, + O_HBLANK => O_HBLANK, + O_VBLANK => O_VBLANK, + -- + -- to audio board + -- + O_ADDR => audio_addr, + O_DATA => audio_data_out, + I_DATA => audio_data_in, + I_DATA_OE_L => audio_data_oe_l, + O_RD_L => audio_rd_l, + O_WR_L => audio_wr_l, + O_IOPC7 => audio_iopc7, + O_RESET_WD_L => audio_reset_l, + -- + ENA => ena_6, + ENAB => ena_6b, + ENA_12 => ena_12, + -- + RESET => reset, + CLK => clk +); + +-- +-- +-- audio subsystem +-- +u_audio : entity work.SCRAMBLE_AUDIO +port map ( + I_HWSEL_FROGGER => I_HWSEL_FROGGER, + -- + I_ADDR => audio_addr, + I_DATA => audio_data_out, + O_DATA => audio_data_in, + O_DATA_OE_L => audio_data_oe_l, + -- + I_RD_L => audio_rd_l, + I_WR_L => audio_wr_l, + I_IOPC7 => audio_iopc7, + -- + O_AUDIO => O_AUDIO, + -- + I_1P_CTRL => ip_1p, -- start, shoot1, shoot2, left,right,up,down + I_2P_CTRL => ip_2p, -- start, shoot1, shoot2, left,right,up,down + I_SERVICE => ip_service, + I_COIN1 => ip_coin1, + I_COIN2 => ip_coin2, + O_COIN_COUNTER => open, + -- + I_DIP => ip_dip_switch, + -- + I_RESET_L => audio_reset_l, + ENA => ena_6, + ENA_1_79 => ena_1_79, + CLK => clk +); + +--button_in(0) = Joystick Up +--button_in(1) = Joystick Down +--button_in(2) = Joystick Left +--button_in(3) = Joystick Right +--button_in(4) = Button Left +--button_in(5) = Button Down +--button_in(6) = Joystick Fire +--button_in(7) = Button Right + +--Buttons are connected to ground and connect to 3.3V when pressed +--Joystick has internal pullup resistor and connects to ground when pressed + +--A '0' on the input is active. Inputs are active low. + +-- assign inputs +-- start, shoot1, shoot2, left,right,up,down +ip_1p(6) <= button_in(4); -- start 1 +ip_1p(5) <= button_in(6); -- shoot1 +ip_1p(4) <= button_in(6); -- shoot2 +ip_1p(3) <= button_in(2); -- p1 left +ip_1p(2) <= button_in(3); -- p1 right +ip_1p(1) <= button_in(0); -- p1 up +ip_1p(0) <= button_in(1); -- p1 down +-- +ip_2p(6) <= button_in(7); -- start 2 +ip_2p(5) <= button_in(6); +ip_2p(4) <= button_in(6); +ip_2p(3) <= button_in(2); -- p2 left +ip_2p(2) <= button_in(3); -- p2 right +ip_2p(1) <= button_in(0); -- p2 up +ip_2p(0) <= button_in(1); -- p2 down +-- +ip_service <= '1'; +ip_coin1 <= button_in(5); -- credit +ip_coin2 <= '1'; + +-- dip switch settings +scramble_dips : if (not I_HWSEL_FROGGER) generate +begin + --SW #1 SW #2 Rockets SW #3 Cabinet + ------- ----- --------- ----- -------- + --OFF OFF Unlimited OFF Table + --OFF ON 5 ON Up Right + --ON OFF 4 + --ON ON 3 + + + --SW #4 SW #5 Coins/Play + ------- ----- ---------- + --OFF OFF 4 + --OFF ON 3 + --ON OFF 2 + --ON ON 1 + + ip_dip_switch(5 downto 4) <= not "11"; -- 1 play/coin. + ip_dip_switch(3) <= not '1'; + ip_dip_switch(2 downto 1) <= not "10"; +end generate; + +frogger_dips : if ( I_HWSEL_FROGGER) generate +begin + --1 2 3 4 5 Meaning + ------------------------------------------------------- + --On On 3 Frogs + --On Off 5 Frogs + --Off On 7 Frogs + --Off Off 256 Frogs (!) + -- + -- On Upright unit + -- Off Cocktail unit + -- + -- On On 1 coin 1 play + -- On Off 2 coins 1 play + -- Off On 3 coins 1 play + -- Off Off 1 coin 2 plays + + ip_dip_switch(5 downto 4) <= not "11"; + ip_dip_switch(3) <= not '1'; + ip_dip_switch(2 downto 1) <= not "01"; +end generate; + +end RTL; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/scramble_video.vhd b/Arcade/Scramble Hardware/Frogger_MiST/rtl/scramble_video.vhd new file mode 100644 index 00000000..47fd3641 --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_MiST/rtl/scramble_video.vhd @@ -0,0 +1,758 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE_VIDEO is + port ( + I_HWSEL_FROGGER : in boolean; + -- + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + I_VBLANK : in std_logic; + I_VSYNC : in std_logic; + + I_VCMA : in std_logic; + I_HCMA : in std_logic; + -- + I_CPU_ADDR : in std_logic_vector(15 downto 0); + I_CPU_DATA : in std_logic_vector(7 downto 0); + O_VRAM_DATA : out std_logic_vector(7 downto 0); + -- note, looks like the real hardware cannot read from object ram + -- + I_VRAMWR_L : in std_logic; + I_VRAMRD_L : in std_logic; + I_OBJRAMWR_L : in std_logic; + I_OBJRAMRD_L : in std_logic; + I_OBJEN_L : in std_logic; + -- + I_STARSON : in std_logic; + I_POUT1 : in std_logic; + -- + O_VIDEO_R : out std_logic_vector(3 downto 0); + O_VIDEO_G : out std_logic_vector(3 downto 0); + O_VIDEO_B : out std_logic_vector(3 downto 0); + -- + ENA : in std_logic; + ENAB : in std_logic; + ENA_12 : in std_logic; + CLK : in std_logic + ); +end; + +-- chars stars vidout? shell/missile +-- +-- 220R B 100 B 390R B 100R R +-- 470R B 150 B 100R G +-- 220R G 100 G blue ? +-- 470R G 150 G +-- 1K G 100 R +-- 220R R 150 R +-- 470R R +-- 1K R +architecture RTL of SCRAMBLE_VIDEO is + + type array_3x5 is array (2 downto 0) of std_logic_vector(4 downto 0); + -- timing + signal ld : std_logic; + signal h256_l : std_logic; + signal h256 : std_logic; + signal cblank_s : std_logic; + signal hcmp1_s : std_logic; + signal hcmp2_s : std_logic; + signal hcmp1 : std_logic; + signal hcmp2 : std_logic; + signal cblank_l : std_logic; + signal h256_l_s : std_logic; + signal hcnt_f : std_logic_vector(7 downto 0); + signal vcnt_f : std_logic_vector(7 downto 0); + + -- load strobes + signal vpl_load : std_logic; + signal col_load : std_logic; + signal objdata_load : std_logic; + signal missile_load : std_logic; + signal missile_reg_l : std_logic; + + signal cntr_clr : std_logic; + signal cntr_load : std_logic; + signal sld_l : std_logic; + + -- video ram + signal vram_addr_sum : std_logic_vector(8 downto 0); -- extra bit for debug + signal msld_l : std_logic; + signal vram_addr_reg : std_logic_vector(7 downto 0); + signal vram_addr_xor : std_logic_vector(3 downto 0); + signal vram_addr : std_logic_vector(9 downto 0); + signal vram_dout : std_logic_vector(7 downto 0); + signal ldout : std_logic; + + -- object ram + signal obj_addr : std_logic_vector(7 downto 0); + signal hpla : std_logic_vector(7 downto 0); + signal objdata : std_logic_vector(7 downto 0); + + signal obj_rom_addr : std_logic_vector(10 downto 0); + signal obj_rom_0_dout : std_logic_vector(7 downto 0); + signal obj_rom_1_dout : std_logic_vector(7 downto 0); + -- + signal col_reg : std_logic_vector(2 downto 0); + signal cd : std_logic_vector(2 downto 0); + + signal shift_reg_1 : std_logic_vector(7 downto 0); + signal shift_reg_0 : std_logic_vector(7 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + signal gr : std_logic_vector(1 downto 0); + signal gc : std_logic_vector(2 downto 0); + + signal vid : std_logic_vector(1 downto 0); + signal col : std_logic_vector(2 downto 0); + + signal obj_video_out_reg : std_logic_vector(4 downto 0); + signal vidout_l : std_logic; + signal obj_lut_out : std_logic_vector(7 downto 0); + + signal cntr_addr : std_logic_vector(7 downto 0); + signal cntr_addr_xor : std_logic_vector(10 downto 0); + signal sprite_sel : std_logic; + signal sprite_ram_ip : std_logic_vector(7 downto 0); + signal sprite_ram_waddr : std_logic_vector(10 downto 0); + signal sprite_ram_op : std_logic_vector(7 downto 0); + -- shell + signal shell_cnt : std_logic_vector(7 downto 0); + signal shell_ena : std_logic; + signal shell : std_logic; + signal shell_reg : std_logic; + -- stars + signal star_reg_1 : std_logic; + signal star_reg_2 : std_logic; + signal star_cnt_div : std_logic_vector(22 downto 0); + signal star_cnt : std_logic_vector(1 downto 0); + signal star_shift : std_logic_vector(16 downto 0); + signal star_shift_t1 : std_logic_vector(16 downto 0); + signal star_on : std_logic; + signal star_out_reg : std_logic; + -- frogger blue bar + signal frogger_blue_reg : std_logic; + signal frogger_blue : std_logic; + signal frogger_blue_out_reg : std_logic; + -- scramble blue + signal pout1_reg : std_logic; + + +begin + p_hcnt_decode : process(I_HCNT) + begin + ld <= '0'; + if (I_HCNT(2 downto 0) = "111") then + ld <= '1'; + end if; + h256_l <= I_HCNT(8); + h256 <= not I_HCNT(8); + + end process; + + p_timing_decode : process(h256, h256_l, I_HCMA, I_VBLANK) + begin + cblank_s <= not (I_VBLANK or h256); -- active low + hcmp1_s <= h256_l and I_HCMA; + end process; + + p_reg : process + begin + wait until rising_edge(CLK); + + if (ENA = '1') then + if (ld = '1') then + hcmp1 <= hcmp1_s; + hcmp2 <= hcmp2_s; + cblank_l <= cblank_s; + h256_l_s <= h256_l; + + if not I_HWSEL_FROGGER then + cd <= col_reg; + else + cd <= col_reg(0) & col_reg(2 downto 1); + end if; + end if; + end if; + end process; + + p_load_decode : process(ld, I_HCNT, h256) + variable obj_load : std_logic; + begin + vpl_load <= '0'; + obj_load := '0'; + col_load <= '0'; + + if (I_HCNT(2 downto 0) = "001") then vpl_load <= '1'; end if; -- 1 clock later + if (I_HCNT(2 downto 0) = "011") then obj_load := '1'; end if; -- 1 later + if (I_HCNT(2 downto 0) = "101") then col_load <= '1'; end if; -- 1 later + + objdata_load <= obj_load and h256 and (not I_HCNT(3)); + missile_load <= obj_load and h256 and ( I_HCNT(3)); + + cntr_clr <= ld and (not h256) and (not I_HCNT(3)); + cntr_load <= ld and ( h256) and (not I_HCNT(3)); + + end process; + + p_hv_flip : process(I_HCNT, I_VCNT, I_VCMA, hcmp1_s) + begin + for i in 0 to 7 loop + vcnt_f(i) <= I_VCNT(i) xor I_VCMA; + hcnt_f(i) <= I_HCNT(i) xor hcmp1_s; + end loop; + end process; + + p_video_addr_calc : process(I_HWSEL_FROGGER, vcnt_f, hpla) + begin + if not I_HWSEL_FROGGER then + vram_addr_sum <= ('0' & vcnt_f(7 downto 0)) + ('0' & hpla(7 downto 0)); + else + vram_addr_sum <= ('0' & vcnt_f(7 downto 0)) + ('0' & hpla(3 downto 0) & hpla(7 downto 4)); + end if; + end process; + + p_msld : process(vram_addr_sum) + begin + msld_l <= '1'; + if (vram_addr_sum(7 downto 0) = "11111111") then + msld_l <= '0'; + end if; + end process; + + p_video_addr_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (I_VBLANK = '1') then -- was async + vram_addr_reg <= x"00"; + elsif (vpl_load = '1') then -- vpl_l + vram_addr_reg <= vram_addr_sum(7 downto 0); + end if; + end if; + end process; + + p_vram_xor : process(vram_addr_reg, objdata, h256) + variable flip : std_logic; + begin + flip := objdata(7) and h256; + for i in 0 to 3 loop + vram_addr_xor(i) <= vram_addr_reg(i) xor flip; + end loop; + end process; + + p_vram_addr : process(vram_addr_reg, cblank_s, ld, I_CPU_ADDR, vram_addr_xor, hcnt_f) + variable match : std_logic; + begin + match := '0'; + if (vram_addr_reg(7 downto 4) = "1111") then + match := '1'; + end if; + + if (cblank_s = '0') then + ldout <= match and ld; -- blanking, sprites + else + ldout <= ld; + end if; + + if (cblank_s = '0') then -- blanking, sprites + --vram_cs <= (not I_VRAMWR_L) or (not I_VRAMRD_L); + vram_addr <= I_CPU_ADDR(9 downto 0); -- let the cpu in + else + --vram_cs <= '1'; + vram_addr <= vram_addr_reg(7 downto 4) & vram_addr_xor(3) & hcnt_f(7 downto 3); + end if; + end process; + + u_vram : work.dpram generic map (10,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => not I_VRAMWR_L, + + addr_a_i => vram_addr, + data_a_i => I_CPU_DATA, -- only cpu can write + + clk_b_i => clk, + addr_b_i => vram_addr, + data_b_o => vram_dout + ); + O_VRAM_DATA <= vram_dout; + + p_object_ram_addr : process(h256, I_HCMA, objdata, I_HCNT, hcnt_f, I_CPU_ADDR, I_OBJEN_L) + begin + -- I believe the object ram can only be written during vblank + + if (h256 = '0') then + hcmp2_s <= I_HCMA; + else + hcmp2_s <= objdata(6); + end if; + + if (I_OBJEN_L = '0') then + obj_addr <= I_CPU_ADDR(7 downto 0); + else + obj_addr(7) <= '0'; + obj_addr(6) <= h256; + + -- A + if (h256 = '0') then -- normal + obj_addr(5) <= hcnt_f(7); --128h'; + else -- sprite + obj_addr(5) <= hcnt_f(3) and I_HCNT(1);-- 8h' and 2h; + end if; + + obj_addr(4 downto 2) <= hcnt_f(6 downto 4); + + if (h256 = '0') then -- normal + obj_addr(1) <= hcnt_f(3); --8h' + obj_addr(0) <= I_HCNT(2); --4h + else + obj_addr(1) <= I_HCNT(2); --4h + obj_addr(0) <= I_HCNT(1); --2h + end if; + + end if; + end process; + + u_object_ram : work.dpram generic map (8,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => not I_OBJRAMWR_L, + + addr_a_i => obj_addr, + data_a_i => I_CPU_DATA, -- only cpu can write + + clk_b_i => clk, + addr_b_i => obj_addr, + data_b_o => hpla + ); + + p_objdata_regs : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (col_load = '1') then -- colour load + col_reg <= hpla(2 downto 0); + end if; + + if (objdata_load = '1') then -- sprite load + objdata <= hpla; + end if; + + if (I_VBLANK = '1') then -- was async + missile_reg_l <= '1'; + elsif (missile_load = '1') then + missile_reg_l <= msld_l; + end if; + end if; + end process; + + p_obj_rom_addr : process(h256, vram_addr_xor, vram_dout, objdata, I_HCNT) + begin + obj_rom_addr( 2 downto 0) <= vram_addr_xor(2 downto 0); + if (h256 = '0') then + -- a + obj_rom_addr(10 downto 3) <= vram_dout; -- background objects + else + obj_rom_addr(10 downto 3) <= objdata(5 downto 0) & vram_addr_xor(3) & (objdata(6) xor I_HCNT(3)); -- sprites + end if; + end process; + + obj_rom0 : entity work.ROM_OBJ_0 -- 5H + port map (CLK => CLK, ADDR => obj_rom_addr, DATA => obj_rom_0_dout); + obj_rom1 : entity work.ROM_OBJ_1 -- 5F + port map (CLK => CLK, ADDR => obj_rom_addr, DATA => obj_rom_1_dout); + + p_obj_rom_shift : process + variable obj_rom_0_dout_s : std_logic_vector(7 downto 0); + begin + wait until rising_edge (CLK); + if not I_HWSEL_FROGGER then + obj_rom_0_dout_s := obj_rom_0_dout; + else -- swap bits 0 and 1 + obj_rom_0_dout_s := obj_rom_0_dout(7 downto 2) & obj_rom_0_dout(0) & obj_rom_0_dout(1); + end if; + + if (ENA = '1') then + case shift_sel is + when "00" => null; -- do nothing + + when "01" => shift_reg_1 <= '0' & shift_reg_1(7 downto 1); -- right + shift_reg_0 <= '0' & shift_reg_0(7 downto 1); + + when "10" => shift_reg_1 <= shift_reg_1(6 downto 0) & '0'; -- left + shift_reg_0 <= shift_reg_0(6 downto 0) & '0'; + + when "11" => shift_reg_1 <= obj_rom_1_dout (7 downto 0); -- load + shift_reg_0 <= obj_rom_0_dout_s(7 downto 0); + when others => null; + end case; + end if; + end process; + + p_obj_rom_shift_sel : process(hcmp2, ldout, shift_reg_1, shift_reg_0) + begin + if (hcmp2 = '0') then + + shift_sel(1) <= '1'; + shift_sel(0) <= ldout; + shift_op(1) <= shift_reg_1(7); + shift_op(0) <= shift_reg_0(7); + else + + shift_sel(1) <= ldout; + shift_sel(0) <= '1'; + shift_op(1) <= shift_reg_1(0); + shift_op(0) <= shift_reg_0(0); + end if; + end process; + + p_video_out_logic : process(shift_op, cd, gr, gc) + variable vidon : std_logic; + begin + vidon := shift_op(0) or shift_op(1); + + if (gr(1 downto 0) = "00") then + vid(1 downto 0) <= shift_op(1 downto 0); + else + vid(1 downto 0) <= gr(1 downto 0); + end if; + + if (gc(2 downto 0) = "000") and (vidon = '1') then + col(2 downto 0) <= cd(2 downto 0); + else + col(2 downto 0) <= gc(2 downto 0); + end if; + end process; + + p_shell_ld : process(ld, h256, I_HCNT, missile_reg_l) + begin + sld_l <= '1'; + if (ld = '1') and (h256 = '1') and (I_HCNT(3) = '1') then + if (missile_reg_l = '0') and (I_HCNT(6 downto 4) /= "111") then + sld_l <= '0'; + end if; + end if; + + end process; + + p_shell_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + if (sld_l = '0') then + shell_cnt <= hpla; + elsif (cblank_l = '1') then + shell_cnt <= shell_cnt + "1"; + else + shell_cnt <= shell_cnt; + end if; + + if (sld_l = '0') then + shell_ena <= '1'; + elsif (shell = '1') then + shell_ena <= '0'; + end if; + end if; + end process; + + p_shell_op : process(shell_cnt, shell_ena) + begin + -- note how T input is from QD on the bottom counter + -- we get a rc from xF8 to XFF + -- so the shell is set at count xFA (rc and bit 1) + shell <= '0'; + if (shell_cnt = x"F8") then -- minus 2 as delay wrong + shell <= shell_ena; + end if; + end process; + + p_cntr_cnt : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (cntr_clr = '1') and (h256_l_s = '0') then -- async + cntr_addr <= (others => '0'); + elsif (cntr_load = '1') then + cntr_addr <= hpla(7 downto 0); + else + cntr_addr <= cntr_addr + "1"; + end if; + end if; + end process; + + p_cntr_addr : process(cntr_addr, hcmp1) + begin + cntr_addr_xor(10 downto 8) <= (others => '0'); + for i in 0 to 7 loop + cntr_addr_xor(i) <= cntr_addr(i) xor hcmp1; + end loop; + end process; + + p_sprite_sel : process(h256_l_s, cntr_addr_xor) + begin + sprite_sel <= '0'; + if (h256_l_s = '0') and (cntr_addr_xor(7 downto 4) /= "0000") then + sprite_sel <= '1'; + end if; + end process; + + p_sprite_write : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + -- delay 1 clock + sprite_ram_ip <= (others => '0'); + if (sprite_sel = '1') then + sprite_ram_ip(4 downto 2) <= col(2 downto 0); + sprite_ram_ip(1 downto 0) <= vid(1 downto 0); + end if; + + sprite_ram_waddr <= cntr_addr_xor; + end if; + end process; + + u_sprite_ram : work.dpram generic map (11,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => '1', + + addr_a_i => sprite_ram_waddr, + data_a_i => sprite_ram_ip, + + clk_b_i => clk, + addr_b_i => cntr_addr_xor, + data_b_o => sprite_ram_op + ); + + gc(2 downto 0) <= sprite_ram_op(4 downto 2); + gr(1 downto 0) <= sprite_ram_op(1 downto 0); + + p_video_out_reg : process + variable vidout_l_int : std_logic; + begin + wait until rising_edge(CLK); + -- register all objects to match increased video delay + if (ENA = '1') then + star_shift_t1 <= star_shift; + + if (cblank_l = '0') then + -- logic around the clr workes out as a sync reset + obj_video_out_reg <= (others => '0'); + shell_reg <= '0'; + frogger_blue_out_reg <= '0'; + star_out_reg <= '0'; + pout1_reg <= '0'; + else + + obj_video_out_reg(4 downto 2) <= col(2 downto 0); + obj_video_out_reg(1 downto 0) <= vid(1 downto 0); + vidout_l <= not(vid(1) or vid(0)); + -- probably wider than the original, we must be a whole 6MHz clock here or the scan-doubler will loose it. + shell_reg <= shell; + frogger_blue_out_reg <= frogger_blue; + + star_out_reg <= '0'; + if (star_shift(7 downto 0) = x"FF") and (star_on = '1') then + star_out_reg <= (vcnt_f(0) xor hcnt_f(3)) and (not star_shift(16)); + end if; + + pout1_reg <= I_POUT1; + + end if; + end if; + end process; + +-- Non BRAM (LUT) Version +-- col_rom : entity work.ROM_LUT +-- port map( +-- ADDR => obj_video_out_reg(4 downto 0), +-- DATA => obj_lut_out +-- ); + +-- BRAM Version + col_rom : entity work.ROM_LUT + port map( + CLK => CLK, + ADDR => obj_video_out_reg(4 downto 0), + DATA => obj_lut_out + ); + + p_col_rom_ce : process + variable video : array_3x5; + begin + wait until rising_edge(CLK); + if (ENA = '1') then + video(0)(4) := '0'; + video(1)(4) := '0'; + video(2)(4) := '0'; + video(0)(3) := '0'; -- b + video(1)(3) := '0'; -- g + video(2)(3) := '0'; -- r + + if (vidout_l = '0') then -- cs_l on col rom + + video(0)(2 downto 0) := obj_lut_out(7 downto 6) & '0'; + video(1)(2 downto 0) := obj_lut_out(5 downto 3); + video(2)(2 downto 0) := obj_lut_out(2 downto 0); + else + video(0)(2 downto 0) := "000"; + video(1)(2 downto 0) := "000"; + video(2)(2 downto 0) := "000"; + end if; + -- + -- end of direct assigns + -- + if I_HWSEL_FROGGER then + if (frogger_blue_out_reg = '1') and (vidout_l = '1') then + video(0) := video(0) + "00010"; + end if; + end if; + + -- add stars, background and video + if not I_HWSEL_FROGGER then + if (star_out_reg = '1') and (vidout_l = '1') then + video(0) := video(0) + ( '0' & star_shift_t1(13 downto 12) & "00"); + video(1) := video(1) + ( '0' & star_shift_t1(11 downto 10) & "00"); + video(2) := video(2) + ( '0' & star_shift_t1( 9 downto 8) & "00"); + end if; + + if (pout1_reg = '1') and (vidout_l = '1') then + video(0) := video(0) + ("00011"); + end if; + end if; + -- check for clip + for i in 0 to 2 loop + if video(i)(4) = '1' or video(i)(3) = '1' then + video(i)(2 downto 0) := (others => '1'); + end if; + end loop; + + O_VIDEO_B <= video(0)(2 downto 0) & video(0)(2); + O_VIDEO_G <= video(1)(2 downto 0) & video(1)(2); + O_VIDEO_R <= video(2)(2 downto 0) & video(2)(2); + end if; + end process; + + p_frogger_blue_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (I_HCNT(7 downto 0) = x"87") then + frogger_blue_reg <= '1'; + elsif (I_HCNT(7 downto 0) = x"07") then + frogger_blue_reg <= '0'; + end if; + end if; + end process; + frogger_blue <= not (frogger_blue_reg xor I_HCMA); + + p_stars_timer : process + begin + wait until rising_edge(CLK); + -- 555 period 0.8316 seconds + -- ~ 4DF 666 + if (ENA = '1') then + if (star_cnt_div(22 downto 17) = "100111") then + star_cnt_div <= (others => '0'); + star_cnt <= star_cnt + "1"; + else + star_cnt_div <= star_cnt_div + "1"; + end if; + end if; + end process; + + p_stars_demux : process(star_cnt, I_VCNT, star_shift) + begin + case star_cnt is + when "00" => star_on <= star_shift(8); + when "01" => star_on <= star_shift(10); + when "10" => star_on <= I_VCNT(1); + when "11" => star_on <= '1'; + when others => null; + end case; + end process; + + p_stars : process + variable star_ena : std_logic; + variable star_shift_ena : std_logic; + variable fb : std_logic; + variable star_clear : std_logic; + begin + wait until rising_edge(CLK); + -- stars clocked off 12 MHz clock + star_ena := ENA_12 and (not I_VSYNC) and h256_l_s; + + if (ENA = '1') and (I_VSYNC = '1') then + star_reg_1 <= '0'; + star_reg_2 <= '0'; + elsif (star_ena = '1') then + star_reg_1 <= '1'; + star_reg_2 <= star_reg_1; + end if; + + star_shift_ena := (star_reg_2 or I_HCMA) and star_ena; + + star_clear := I_STARSON and (not I_VBLANK); + + fb := (not star_shift(16)) xor star_shift(4); + if (star_clear = '0') then + star_shift <= (others => '0'); + elsif (star_shift_ena = '1') then + star_shift(16 downto 0) <= star_shift(15 downto 0) & fb; + end if; + end process; + +end RTL; diff --git a/Arcade/Scramble Hardware/Frogger_MiST/rtl/video_mixer.sv b/Arcade/Scramble Hardware/Frogger_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Scramble Hardware/Frogger_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/Arcade/Scramble Hardware/Scramble_MiST/README.txt b/Arcade/Scramble Hardware/Scramble_MiST/README.txt new file mode 100644 index 00000000..c28042b7 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: Scramble port to MiST by Gehstock +-- 10 November 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE : Fire+Bomb + +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + diff --git a/Arcade/Scramble Hardware/Scramble_MiST/Release/Scramble(PACE Code).rbf b/Arcade/Scramble Hardware/Scramble_MiST/Release/Scramble(PACE Code).rbf new file mode 100644 index 00000000..6d7ebdea Binary files /dev/null and b/Arcade/Scramble Hardware/Scramble_MiST/Release/Scramble(PACE Code).rbf differ diff --git a/Arcade/Scramble Hardware/Scramble_MiST/Release/Scramble.rbf b/Arcade/Scramble Hardware/Scramble_MiST/Release/Scramble.rbf new file mode 100644 index 00000000..74657581 Binary files /dev/null and b/Arcade/Scramble Hardware/Scramble_MiST/Release/Scramble.rbf differ diff --git a/Arcade/Scramble Hardware/Scramble_MiST/Scramble.qpf b/Arcade/Scramble Hardware/Scramble_MiST/Scramble.qpf new file mode 100644 index 00000000..75e0934b --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/Scramble.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "Scramble" diff --git a/Arcade/Scramble Hardware/Scramble_MiST/Scramble.qsf b/Arcade/Scramble Hardware/Scramble_MiST/Scramble.qsf new file mode 100644 index 00000000..66a68871 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/Scramble.qsf @@ -0,0 +1,170 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 05:08:48 November 15, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# Arcade-Scramble_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +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 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 ScrambleMist + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 + +# Assembler Assignments +# ===================== +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)" + +# ---------------------- +# start ENTITY(Scramble) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== + 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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(Scramble) +# -------------------- +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.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 SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_SND_2.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_SND_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_SND_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_OBJ_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_OBJ_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_LUT.vhd +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/MULT18X18.vhd +set_global_assignment -name VHDL_FILE rtl/i82c55.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VERILOG_FILE rtl/build_id.v +set_global_assignment -name VHDL_FILE rtl/YM2149_linmix_sep.vhd +set_global_assignment -name VHDL_FILE rtl/scramble_video.vhd +set_global_assignment -name VHDL_FILE rtl/scramble_top.vhd +set_global_assignment -name VHDL_FILE rtl/scramble_audio.vhd +set_global_assignment -name VHDL_FILE rtl/scramble.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/ScrambleMist.sv +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +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 USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +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" +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 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Scramble Hardware/Scramble_MiST/Scramble.srf b/Arcade/Scramble Hardware/Scramble_MiST/Scramble.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/Scramble.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Scramble Hardware/Scramble_MiST/clean.bat b/Arcade/Scramble Hardware/Scramble_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_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/Arcade/Scramble Hardware/Scramble_MiST/rtl/MULT18X18.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/MULT18X18.vhd new file mode 100644 index 00000000..32535505 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/MULT18X18.vhd @@ -0,0 +1,53 @@ + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY lpm; +USE lpm.all; + +ENTITY MULT18X18 IS + PORT + ( + A : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + B : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + P : OUT STD_LOGIC_VECTOR (35 DOWNTO 0) + ); +END MULT18X18; + + +ARCHITECTURE SYN OF mult18x18 IS + + COMPONENT lpm_mult + GENERIC ( + lpm_hint : STRING; + lpm_representation : STRING; + lpm_type : STRING; + lpm_widtha : NATURAL; + lpm_widthb : NATURAL; + lpm_widthp : NATURAL + ); + PORT ( + dataa : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + datab : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + result : OUT STD_LOGIC_VECTOR (35 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + lpm_mult_component : lpm_mult + GENERIC MAP ( + lpm_hint => "MAXIMIZE_SPEED=5", + lpm_representation => "SIGNED", + lpm_type => "LPM_MULT", + lpm_widtha => 18, + lpm_widthb => 18, + lpm_widthp => 36 + ) + PORT MAP ( + dataa => A, + datab => B, + result => P + ); + +END SYN; + diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_LUT.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_LUT.vhd new file mode 100644 index 00000000..5a3fb9a2 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_LUT.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_LUT is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_LUT is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"17",X"C7",X"F6",X"00",X"17",X"C0",X"3F",X"00",X"07",X"C0",X"3F",X"00",X"C0",X"C4",X"07", + X"00",X"C7",X"31",X"17",X"00",X"31",X"C7",X"3F",X"00",X"F6",X"07",X"F0",X"00",X"3F",X"07",X"C4"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_OBJ_0.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_OBJ_0.vhd new file mode 100644 index 00000000..2d6b038f --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_OBJ_0.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_OBJ_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_OBJ_0 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"02",X"02",X"FE",X"FE",X"42",X"02",X"00",X"00", + X"62",X"F2",X"BA",X"9A",X"9E",X"CE",X"46",X"00",X"8C",X"DE",X"F2",X"B2",X"92",X"86",X"04",X"00", + X"08",X"FE",X"FE",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BE",X"A2",X"A2",X"A2",X"E6",X"E4",X"00", + X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"C0",X"E0",X"B0",X"9E",X"8E",X"C0",X"C0",X"00", + X"0C",X"6E",X"9A",X"9A",X"B2",X"F2",X"6C",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00", + X"1C",X"08",X"1C",X"14",X"36",X"36",X"00",X"00",X"08",X"1C",X"1C",X"08",X"3E",X"2A",X"3E",X"2A", + X"00",X"00",X"00",X"18",X"18",X"00",X"00",X"00",X"18",X"28",X"38",X"2C",X"38",X"28",X"18",X"00", + X"70",X"70",X"A8",X"F8",X"A8",X"70",X"77",X"00",X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00", + X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00",X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00", + X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00",X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00", + X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00", + X"FC",X"FE",X"02",X"02",X"02",X"06",X"04",X"00",X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00", + X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00", + X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00", + X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00",X"7A",X"FC",X"8E",X"8A",X"82",X"FE",X"7C",X"00", + X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00",X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00", + X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00", + X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0",X"00",X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00", + X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00", + X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"00", + X"01",X"03",X"02",X"06",X"3C",X"60",X"C0",X"80",X"01",X"01",X"01",X"01",X"07",X"1C",X"70",X"C0", + X"07",X"1C",X"30",X"60",X"40",X"C0",X"80",X"80",X"01",X"0F",X"06",X"02",X"06",X"1C",X"30",X"E0", + X"80",X"C0",X"60",X"3C",X"06",X"02",X"03",X"01",X"C0",X"70",X"1C",X"07",X"01",X"01",X"01",X"01", + X"80",X"80",X"C0",X"40",X"60",X"30",X"1C",X"07",X"E0",X"30",X"1C",X"06",X"02",X"06",X"0F",X"01", + X"03",X"06",X"FC",X"80",X"E0",X"38",X"0E",X"03",X"F0",X"18",X"0F",X"01",X"07",X"1C",X"F0",X"80", + X"80",X"80",X"C0",X"40",X"C0",X"40",X"C0",X"80",X"03",X"06",X"06",X"03",X"01",X"01",X"03",X"01", + X"F0",X"10",X"30",X"60",X"C0",X"C0",X"60",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"18",X"3C",X"7E",X"FF",X"3C",X"3C",X"3C",X"3C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3C",X"42",X"81",X"A5",X"A5",X"99",X"42",X"3C",X"FF",X"81",X"81",X"81",X"81",X"81",X"81",X"FF", + X"00",X"00",X"02",X"02",X"3E",X"22",X"2A",X"3E",X"00",X"01",X"03",X"0F",X"3D",X"74",X"54",X"54", + X"3E",X"02",X"3E",X"20",X"28",X"3E",X"00",X"00",X"54",X"54",X"74",X"3D",X"0F",X"03",X"01",X"00", + X"07",X"08",X"08",X"08",X"07",X"00",X"07",X"08",X"C0",X"20",X"20",X"20",X"C0",X"00",X"C0",X"20", + X"08",X"08",X"07",X"00",X"00",X"0F",X"04",X"00",X"20",X"20",X"C0",X"00",X"20",X"E0",X"20",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20", + X"07",X"00",X"06",X"09",X"08",X"08",X"04",X"00",X"C0",X"00",X"20",X"20",X"A0",X"60",X"20",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20", + X"07",X"00",X"07",X"09",X"09",X"08",X"04",X"00",X"C0",X"00",X"C0",X"20",X"20",X"20",X"40",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF", + X"C0",X"60",X"3F",X"01",X"07",X"1C",X"70",X"C0",X"0F",X"18",X"F0",X"80",X"E0",X"38",X"0F",X"01", + X"0F",X"08",X"0C",X"06",X"03",X"03",X"06",X"07",X"C0",X"60",X"60",X"C0",X"80",X"80",X"C0",X"80", + X"80",X"C0",X"40",X"60",X"3C",X"06",X"03",X"01",X"80",X"F0",X"60",X"40",X"60",X"38",X"0C",X"07", + X"01",X"03",X"06",X"3C",X"60",X"40",X"C0",X"80",X"07",X"0C",X"38",X"E0",X"40",X"60",X"F0",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF", + X"00",X"00",X"00",X"01",X"04",X"07",X"0C",X"0C",X"00",X"00",X"80",X"80",X"80",X"C0",X"C0",X"A0", + X"0F",X"0C",X"04",X"07",X"01",X"00",X"00",X"00",X"E0",X"C0",X"80",X"80",X"80",X"80",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"01",X"03",X"7F",X"FF",X"00",X"00",X"00",X"00",X"FF",X"F0",X"C0",X"C0", + X"7F",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"7F",X"FF",X"00",X"00",X"00",X"00",X"FF",X"F0",X"C0",X"C0", + X"7F",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"7F",X"FF",X"00",X"00",X"00",X"00",X"FF",X"F0",X"C0",X"C0", + X"7F",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"FF",X"00",X"00",X"00",X"00",X"00", + X"0F",X"1F",X"37",X"7F",X"FF",X"BF",X"FE",X"FF",X"70",X"5C",X"46",X"7F",X"4F",X"45",X"7D",X"7F", + X"FF",X"FF",X"FD",X"FF",X"6F",X"3F",X"1B",X"0F",X"4D",X"45",X"48",X"7F",X"47",X"5E",X"7C",X"70", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"FF", + X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"81",X"FF",X"81",X"81",X"81",X"81",X"81",X"81",X"81", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"C0", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"C0", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"C0", + X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0", + X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"1D",X"3F",X"7F",X"FF",X"BF",X"FF",X"FF",X"70",X"7C",X"4E",X"46",X"7F",X"7F",X"4D",X"45", + X"FD",X"FF",X"FF",X"DF",X"7F",X"3F",X"1D",X"0F",X"4F",X"7D",X"7D",X"47",X"4E",X"7E",X"7E",X"70", + X"0F",X"09",X"01",X"03",X"01",X"07",X"03",X"02",X"78",X"48",X"40",X"A0",X"F0",X"60",X"B0",X"90", + X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"01",X"01",X"03",X"00",X"04",X"07",X"80",X"C0",X"C0",X"C0",X"E0",X"C0",X"F0",X"D0", + X"04",X"04",X"07",X"00",X"01",X"01",X"03",X"07",X"D0",X"F0",X"D0",X"C0",X"E0",X"40",X"60",X"70", + X"0F",X"09",X"01",X"03",X"07",X"05",X"0F",X"0B",X"78",X"48",X"40",X"E0",X"B0",X"F0",X"70",X"D0", + X"09",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"C0",X"80",X"C0",X"80",X"80",X"80",X"80",X"80", + X"00",X"01",X"01",X"01",X"03",X"00",X"07",X"04",X"80",X"C0",X"C0",X"C0",X"E0",X"C0",X"D0",X"F0", + X"04",X"07",X"04",X"00",X"03",X"01",X"03",X"07",X"D0",X"D0",X"F0",X"C0",X"E0",X"C0",X"E0",X"F0", + X"0F",X"09",X"01",X"01",X"02",X"03",X"07",X"05",X"78",X"48",X"40",X"E0",X"F0",X"B0",X"D0",X"48", + X"09",X"08",X"00",X"01",X"01",X"00",X"00",X"00",X"C8",X"80",X"C0",X"E0",X"A0",X"C0",X"80",X"80", + X"00",X"01",X"01",X"01",X"03",X"03",X"04",X"04",X"80",X"C0",X"C0",X"C0",X"E0",X"E0",X"D0",X"D0", + X"07",X"04",X"04",X"03",X"02",X"01",X"03",X"07",X"F0",X"D0",X"C0",X"E0",X"E0",X"C0",X"E0",X"F0", + X"0F",X"09",X"01",X"01",X"03",X"05",X"07",X"05",X"78",X"48",X"00",X"C0",X"E0",X"B0",X"F0",X"70", + X"05",X"01",X"02",X"01",X"01",X"01",X"00",X"00",X"D0",X"D0",X"C0",X"E0",X"40",X"80",X"80",X"80", + X"00",X"01",X"01",X"01",X"03",X"00",X"04",X"07",X"80",X"C0",X"C0",X"C0",X"E0",X"C0",X"F0",X"D0", + X"04",X"04",X"07",X"00",X"01",X"01",X"03",X"07",X"D0",X"F0",X"D0",X"C0",X"E0",X"40",X"60",X"70", + X"0F",X"1F",X"3F",X"7D",X"FF",X"FF",X"EF",X"FF",X"70",X"5C",X"46",X"7E",X"9E",X"45",X"4F",X"7D", + X"FF",X"FF",X"FD",X"FF",X"7F",X"37",X"1F",X"0F",X"7D",X"4F",X"4A",X"4F",X"7E",X"46",X"5C",X"70", + X"01",X"01",X"03",X"02",X"00",X"06",X"03",X"0A",X"00",X"00",X"80",X"C0",X"B0",X"E0",X"C0",X"E0", + X"0F",X"03",X"17",X"1D",X"0F",X"07",X"01",X"01",X"70",X"E0",X"D8",X"78",X"F0",X"D0",X"60",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"03",X"04",X"03",X"27",X"3E",X"6C",X"F8",X"86",X"CF",X"2F",X"C6",X"E0",X"70",X"36",X"1F", + X"FE",X"6F",X"3F",X"27",X"03",X"04",X"03",X"01",X"7F",X"F6",X"F0",X"E0",X"C6",X"2F",X"CF",X"86", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"E7",X"24",X"24",X"3C",X"3C",X"24",X"24",X"E7", + X"00",X"70",X"F8",X"8D",X"85",X"C0",X"60",X"00",X"FF",X"D3",X"81",X"C9",X"82",X"91",X"CB",X"F3", + X"00",X"00",X"00",X"01",X"01",X"03",X"04",X"06",X"80",X"80",X"00",X"00",X"80",X"C0",X"C0",X"A0", + X"15",X"0B",X"0D",X"0F",X"02",X"07",X"01",X"01",X"88",X"78",X"F8",X"B0",X"E0",X"B0",X"E0",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"40",X"20",X"20",X"20",X"20",X"20",X"A0",X"F0", + X"01",X"02",X"03",X"06",X"07",X"03",X"02",X"01",X"F0",X"A0",X"C0",X"F0",X"60",X"F0",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"00",X"00",X"00",X"00",X"40",X"40",X"E0",X"C0",X"E0", + X"07",X"05",X"0E",X"03",X"07",X"02",X"03",X"00",X"60",X"C0",X"F0",X"E8",X"B0",X"F0",X"C0",X"C0", + X"20",X"10",X"08",X"04",X"04",X"41",X"03",X"01",X"00",X"00",X"01",X"02",X"1C",X"80",X"A2",X"60", + X"06",X"13",X"20",X"40",X"00",X"02",X"10",X"00",X"40",X"CC",X"80",X"60",X"10",X"08",X"03",X"00", + X"08",X"04",X"04",X"02",X"81",X"43",X"22",X"15",X"01",X"06",X"08",X"10",X"30",X"20",X"C0",X"A0", + X"0F",X"09",X"06",X"33",X"40",X"81",X"01",X"02",X"50",X"DE",X"61",X"D0",X"10",X"18",X"08",X"04", + X"04",X"02",X"02",X"01",X"06",X"8F",X"76",X"1A",X"04",X"08",X"10",X"C0",X"B0",X"E8",X"2F",X"98", + X"1B",X"1C",X"0A",X"07",X"07",X"08",X"08",X"10",X"EC",X"CC",X"B8",X"F0",X"90",X"08",X"86",X"41", + X"80",X"40",X"25",X"1F",X"17",X"0D",X"5B",X"B2",X"21",X"41",X"42",X"B4",X"FC",X"B0",X"D8",X"EE", + X"1A",X"0F",X"05",X"1E",X"1D",X"23",X"40",X"80",X"E9",X"56",X"F8",X"DC",X"E8",X"4C",X"82",X"81", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"00",X"00",X"00",X"00",X"80",X"40",X"20",X"00", + X"40",X"80",X"80",X"80",X"00",X"11",X"21",X"23",X"20",X"10",X"10",X"20",X"90",X"88",X"80",X"88", + X"04",X"02",X"02",X"02",X"02",X"81",X"40",X"20",X"00",X"00",X"01",X"01",X"02",X"04",X"84",X"88", + X"20",X"11",X"0D",X"07",X"0A",X"C7",X"3D",X"0B",X"C8",X"70",X"B0",X"D0",X"7B",X"BC",X"D0",X"70", + X"80",X"40",X"40",X"20",X"10",X"0B",X"05",X"0B",X"40",X"40",X"40",X"80",X"81",X"02",X"84",X"48", + X"07",X"04",X"8B",X"4E",X"3B",X"37",X"2E",X"3D",X"F0",X"50",X"A0",X"6C",X"3E",X"D4",X"B0",X"54", + X"10",X"08",X"05",X"02",X"01",X"87",X"4B",X"26",X"10",X"20",X"A0",X"60",X"D0",X"48",X"F1",X"B2", + X"1C",X"0B",X"0F",X"3D",X"33",X"9E",X"75",X"57",X"DC",X"EC",X"74",X"BC",X"DD",X"76",X"D4",X"5E"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_OBJ_1.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_OBJ_1.vhd new file mode 100644 index 00000000..bd3fcb42 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_OBJ_1.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_OBJ_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_OBJ_1 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"02",X"02",X"FE",X"FE",X"42",X"02",X"00",X"00", + X"62",X"F2",X"BA",X"9A",X"9E",X"CE",X"46",X"00",X"8C",X"DE",X"F2",X"B2",X"92",X"86",X"04",X"00", + X"08",X"FE",X"FE",X"C8",X"68",X"38",X"18",X"00",X"1C",X"BE",X"A2",X"A2",X"A2",X"E6",X"E4",X"00", + X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C",X"00",X"C0",X"E0",X"B0",X"9E",X"8E",X"C0",X"C0",X"00", + X"0C",X"6E",X"9A",X"9A",X"B2",X"F2",X"6C",X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00", + X"14",X"00",X"00",X"49",X"49",X"5D",X"49",X"00",X"00",X"00",X"00",X"14",X"00",X"14",X"22",X"36", + X"00",X"00",X"00",X"18",X"18",X"00",X"00",X"00",X"18",X"38",X"34",X"14",X"04",X"10",X"00",X"00", + X"A8",X"A8",X"70",X"F8",X"70",X"A8",X"A8",X"00",X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"7E",X"C8",X"88",X"C8",X"7E",X"3E",X"00", + X"6C",X"FE",X"92",X"92",X"92",X"FE",X"FE",X"00",X"44",X"C6",X"82",X"82",X"C6",X"7C",X"38",X"00", + X"38",X"7C",X"C6",X"82",X"82",X"FE",X"FE",X"00",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00", + X"80",X"90",X"90",X"90",X"90",X"FE",X"FE",X"00",X"9E",X"9E",X"92",X"82",X"C6",X"7C",X"38",X"00", + X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00",X"00", + X"FC",X"FE",X"02",X"02",X"02",X"06",X"04",X"00",X"82",X"C6",X"6E",X"3C",X"18",X"FE",X"FE",X"00", + X"02",X"02",X"02",X"02",X"FE",X"FE",X"00",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00", + X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C",X"00", + X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00",X"7A",X"FC",X"8E",X"8A",X"82",X"FE",X"7C",X"00", + X"72",X"F6",X"9E",X"8C",X"88",X"FE",X"FE",X"00",X"0C",X"5E",X"D2",X"92",X"92",X"F6",X"64",X"00", + X"80",X"80",X"FE",X"FE",X"80",X"80",X"00",X"00",X"FC",X"FE",X"02",X"02",X"02",X"FE",X"FC",X"00", + X"F0",X"F8",X"1C",X"0E",X"1C",X"F8",X"F0",X"00",X"F8",X"FE",X"1C",X"38",X"1C",X"FE",X"F8",X"00", + X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"C0",X"F0",X"1E",X"1E",X"F0",X"C0",X"00",X"00", + X"C2",X"E2",X"F2",X"BA",X"9E",X"8E",X"86",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"00", + X"01",X"03",X"03",X"07",X"3F",X"7F",X"FF",X"FF",X"01",X"01",X"01",X"01",X"07",X"1F",X"7F",X"FF", + X"07",X"1F",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"01",X"0F",X"07",X"03",X"07",X"1F",X"3F",X"FF", + X"FF",X"FF",X"7F",X"3F",X"07",X"03",X"03",X"01",X"FF",X"7F",X"1F",X"07",X"01",X"01",X"01",X"01", + X"FF",X"FF",X"FF",X"7F",X"7F",X"3F",X"1F",X"07",X"FF",X"3F",X"1F",X"07",X"03",X"07",X"0F",X"01", + X"03",X"07",X"FF",X"FF",X"FF",X"3F",X"0F",X"03",X"FF",X"1F",X"0F",X"01",X"07",X"1F",X"FF",X"FF", + X"FF",X"FF",X"FF",X"7F",X"FF",X"7F",X"FF",X"FF",X"03",X"07",X"07",X"03",X"01",X"01",X"03",X"01", + X"FF",X"1F",X"3F",X"7F",X"FF",X"FF",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",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"18",X"DB",X"DB",X"C3",X"C3",X"DB",X"DB",X"18", + X"3C",X"42",X"81",X"A5",X"A5",X"99",X"42",X"3C",X"FF",X"81",X"81",X"81",X"81",X"81",X"81",X"FF", + X"1C",X"3E",X"7F",X"7F",X"FF",X"DD",X"D5",X"C1",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80", + X"FF",X"FF",X"FF",X"DF",X"57",X"41",X"3E",X"1C",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00", + X"07",X"08",X"08",X"08",X"07",X"00",X"07",X"08",X"C0",X"20",X"20",X"20",X"C0",X"00",X"C0",X"20", + X"08",X"08",X"07",X"00",X"00",X"0F",X"04",X"00",X"20",X"20",X"C0",X"00",X"20",X"E0",X"20",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20", + X"07",X"00",X"06",X"09",X"08",X"08",X"04",X"00",X"C0",X"00",X"20",X"20",X"A0",X"60",X"20",X"00", + X"07",X"08",X"08",X"07",X"00",X"07",X"08",X"08",X"C0",X"20",X"20",X"C0",X"00",X"C0",X"20",X"20", + X"07",X"00",X"07",X"09",X"09",X"08",X"04",X"00",X"C0",X"00",X"C0",X"20",X"20",X"20",X"40",X"00", + X"01",X"01",X"7F",X"7F",X"41",X"01",X"00",X"00",X"06",X"2F",X"69",X"49",X"49",X"7B",X"32",X"06", + X"00",X"40",X"40",X"7F",X"7F",X"40",X"40",X"00",X"00",X"71",X"59",X"4D",X"67",X"23",X"00",X"00", + X"00",X"7F",X"7F",X"06",X"1C",X"7F",X"7F",X"00",X"00",X"3E",X"63",X"41",X"41",X"7F",X"7F",X"00", + X"00",X"46",X"6F",X"79",X"59",X"4B",X"02",X"00",X"00",X"7B",X"4F",X"46",X"44",X"7F",X"7F",X"00", + X"00",X"04",X"7F",X"67",X"34",X"1C",X"0C",X"00",X"00",X"40",X"40",X"7F",X"7F",X"40",X"40",X"00", + X"00",X"7F",X"7F",X"08",X"08",X"7F",X"7F",X"00",X"00",X"4F",X"49",X"49",X"7B",X"7B",X"00",X"00", + X"C0",X"E0",X"FF",X"FF",X"FF",X"FC",X"F0",X"C0",X"FF",X"F8",X"F0",X"80",X"E0",X"F8",X"FF",X"FF", + X"FF",X"F8",X"FC",X"FE",X"FF",X"FF",X"FE",X"FF",X"C0",X"E0",X"E0",X"C0",X"80",X"80",X"C0",X"80", + X"80",X"C0",X"C0",X"E0",X"FC",X"FE",X"FF",X"FF",X"80",X"F0",X"E0",X"C0",X"E0",X"F8",X"FC",X"FF", + X"FF",X"FF",X"FE",X"FC",X"E0",X"C0",X"C0",X"80",X"FF",X"FC",X"F8",X"E0",X"C0",X"E0",X"F0",X"80", + X"00",X"36",X"7F",X"49",X"49",X"7F",X"7F",X"00",X"00",X"1F",X"3F",X"64",X"64",X"3F",X"1F",X"00", + X"00",X"00",X"00",X"49",X"49",X"49",X"7F",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"07",X"07",X"0F",X"0F",X"00",X"00",X"80",X"80",X"80",X"C0",X"C0",X"60", + X"07",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"00",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E", + X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"40",X"00",X"00",X"00",X"00",X"FF",X"F0",X"00",X"00", + X"38",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"FF",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"40",X"00",X"00",X"00",X"00",X"FF",X"F0",X"01",X"08", + X"38",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"02",X"F0",X"FF",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"40",X"00",X"00",X"00",X"00",X"FF",X"F0",X"14",X"0A", + X"38",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"14",X"F0",X"FF",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"00",X"00",X"40",X"01",X"00",X"01",X"A3",X"38",X"00",X"B0",X"3A",X"02",X"80", + X"80",X"C0",X"E2",X"F8",X"7F",X"3F",X"1F",X"0F",X"33",X"3B",X"B7",X"0F",X"7F",X"FE",X"7F",X"71", + X"00",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"00", + X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"00",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"80", + X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"80",X"00",X"80",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"80", + X"00",X"00",X"00",X"01",X"02",X"01",X"02",X"01",X"00",X"40",X"80",X"40",X"A0",X"40",X"A0",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"40", + X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0", + X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40", + X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"40",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"02",X"00",X"00",X"00",X"40",X"00",X"00",X"01",X"03",X"B0",X"38",X"00",X"80",X"32",X"3A", + X"82",X"C0",X"E0",X"F8",X"7F",X"3F",X"1F",X"0F",X"B1",X"03",X"07",X"BF",X"7E",X"7E",X"FF",X"71", + X"12",X"10",X"11",X"00",X"02",X"01",X"00",X"00",X"A4",X"84",X"C4",X"C0",X"00",X"90",X"00",X"00", + X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"02",X"40",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"20", + X"03",X"07",X"07",X"03",X"02",X"10",X"10",X"10",X"20",X"30",X"70",X"60",X"20",X"84",X"84",X"84", + X"12",X"10",X"10",X"01",X"00",X"02",X"04",X"01",X"A4",X"84",X"84",X"40",X"C0",X"20",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"10",X"00",X"00",X"00",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"00", + X"03",X"04",X"07",X"03",X"02",X"00",X"00",X"00",X"20",X"30",X"70",X"60",X"20",X"00",X"00",X"00", + X"12",X"10",X"10",X"00",X"01",X"00",X"00",X"00",X"A4",X"84",X"84",X"20",X"40",X"C0",X"00",X"80", + X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20", + X"00",X"07",X"07",X"03",X"03",X"00",X"00",X"00",X"00",X"20",X"60",X"60",X"20",X"00",X"00",X"00", + X"12",X"10",X"11",X"00",X"02",X"03",X"00",X"00",X"A4",X"84",X"84",X"80",X"20",X"40",X"80",X"A0", + X"00",X"00",X"01",X"00",X"00",X"04",X"00",X"00",X"00",X"80",X"20",X"00",X"80",X"00",X"00",X"10", + X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"20", + X"03",X"07",X"07",X"03",X"02",X"10",X"10",X"10",X"20",X"30",X"70",X"60",X"20",X"84",X"84",X"84", + X"00",X"00",X"00",X"02",X"00",X"00",X"10",X"00",X"81",X"23",X"38",X"80",X"60",X"3A",X"B0",X"02", + X"80",X"C0",X"E2",X"F8",X"7F",X"3F",X"1F",X"0F",X"02",X"B3",X"3F",X"3F",X"FF",X"7E",X"7F",X"F1", + X"00",X"04",X"00",X"01",X"00",X"01",X"04",X"01",X"00",X"00",X"00",X"10",X"40",X"00",X"A0",X"00", + X"02",X"05",X"02",X"03",X"03",X"04",X"03",X"00",X"A0",X"50",X"E0",X"A0",X"40",X"A0",X"A0",X"40", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"00", + X"FF",X"FF",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"FF",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00", + X"00",X"00",X"01",X"00",X"00",X"01",X"13",X"07",X"00",X"00",X"81",X"0E",X"10",X"80",X"C0",X"E0", + X"A7",X"7B",X"3D",X"26",X"02",X"05",X"02",X"01",X"E9",X"D6",X"90",X"30",X"48",X"A0",X"49",X"86", + X"00",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"00",X"18",X"DB",X"DB",X"C3",X"C3",X"DB",X"DB",X"18", + X"00",X"70",X"F8",X"8D",X"85",X"C0",X"60",X"00",X"00",X"2C",X"7E",X"3F",X"7F",X"7E",X"3C",X"0C", + X"00",X"00",X"05",X"00",X"02",X"00",X"01",X"01",X"00",X"20",X"00",X"00",X"40",X"80",X"10",X"40", + X"20",X"01",X"02",X"05",X"07",X"05",X"03",X"00",X"40",X"C0",X"90",X"60",X"50",X"D0",X"20",X"C0", + X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"10",X"00",X"00",X"40",X"10",X"00", + X"04",X"01",X"02",X"05",X"05",X"06",X"01",X"00",X"80",X"50",X"E0",X"90",X"B0",X"40",X"A0",X"C0", + X"00",X"00",X"01",X"04",X"00",X"00",X"01",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"20",X"40", + X"00",X"03",X"03",X"06",X"01",X"07",X"00",X"01",X"80",X"A0",X"40",X"90",X"60",X"50",X"A0",X"40", + X"00",X"00",X"00",X"00",X"11",X"0E",X"05",X"0E",X"00",X"00",X"00",X"00",X"80",X"70",X"C0",X"D0", + X"2B",X"0D",X"03",X"02",X"00",X"00",X"00",X"00",X"F0",X"A0",X"60",X"80",X"00",X"00",X"80",X"00", + X"00",X"00",X"00",X"01",X"02",X"07",X"0D",X"0A",X"00",X"00",X"00",X"00",X"E8",X"D0",X"B0",X"F8", + X"1A",X"1F",X"39",X"06",X"03",X"00",X"00",X"00",X"BC",X"28",X"F0",X"60",X"C0",X"00",X"00",X"00", + X"00",X"00",X"04",X"0E",X"0F",X"18",X"09",X"07",X"00",X"00",X"C0",X"30",X"C8",X"74",X"D0",X"64", + X"37",X"33",X"1B",X"08",X"01",X"03",X"00",X"00",X"32",X"76",X"6C",X"08",X"E8",X"80",X"00",X"00", + X"00",X"01",X"13",X"23",X"0C",X"1E",X"26",X"4D",X"00",X"02",X"B8",X"EC",X"12",X"DC",X"EC",X"58", + X"35",X"18",X"0B",X"25",X"03",X"0F",X"21",X"00",X"16",X"BB",X"6C",X"B4",X"34",X"B0",X"44",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"01",X"03",X"07",X"07",X"07",X"07",X"0F",X"0F",X"80",X"C0",X"C0",X"C0",X"C0",X"E0",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40", + X"01",X"03",X"06",X"01",X"0F",X"0A",X"06",X"1D",X"80",X"A0",X"50",X"70",X"A8",X"64",X"B8",X"C8", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"06",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"E0", + X"09",X"0B",X"1E",X"15",X"15",X"0A",X"3D",X"0A",X"20",X"F0",X"78",X"D8",X"E8",X"A8",X"5C",X"E8", + X"00",X"00",X"00",X"01",X"02",X"02",X"05",X"0D",X"00",X"00",X"00",X"A0",X"60",X"B0",X"18",X"68", + X"0B",X"16",X"3C",X"37",X"6C",X"6B",X"1E",X"69",X"A8",X"54",X"98",X"54",X"60",X"DC",X"28",X"B4"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_PGM.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_PGM.vhd new file mode 100644 index 00000000..6dbd2622 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_PGM.vhd @@ -0,0 +1,1046 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_PGM is +port ( + clk : in std_logic; + addr : in std_logic_vector(13 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_PGM is + type rom is array(0 to 16383) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"AF",X"32",X"01",X"68",X"C3",X"D1",X"00",X"FF",X"77",X"3C",X"23",X"77",X"3C",X"19",X"C9",X"FF", + X"77",X"23",X"10",X"FC",X"C9",X"FF",X"FF",X"FF",X"77",X"23",X"10",X"FC",X"0D",X"20",X"F9",X"C9", + X"85",X"6F",X"3E",X"00",X"8C",X"67",X"7E",X"C9",X"87",X"E1",X"5F",X"16",X"00",X"19",X"5E",X"23", + X"56",X"EB",X"E9",X"FF",X"FF",X"FF",X"FF",X"FF",X"E5",X"26",X"40",X"3A",X"A0",X"40",X"6F",X"CB", + X"7E",X"28",X"0E",X"72",X"2C",X"73",X"2C",X"7D",X"FE",X"C0",X"30",X"02",X"3E",X"C0",X"32",X"A0", + X"40",X"E1",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C3",X"43",X"0D",X"BC",X"4A",X"6E",X"40",X"40",X"53",X"54", + X"45",X"52",X"4E",X"40",X"40",X"31",X"39",X"38",X"31",X"3F",X"BC",X"4A",X"6E",X"40",X"4B",X"4F", + X"4E",X"41",X"4D",X"49",X"40",X"40",X"31",X"39",X"38",X"31",X"3F",X"54",X"4B",X"40",X"4F",X"55", + X"52",X"40",X"53",X"43",X"52",X"41",X"4D",X"42",X"4C",X"45",X"40",X"53",X"59",X"53",X"54",X"45", + X"4D",X"40",X"02",X"3F",X"D5",X"4A",X"32",X"40",X"43",X"4F",X"49",X"4E",X"53",X"40",X"31",X"40", + X"50",X"4C",X"41",X"59",X"3F",X"D5",X"4A",X"33",X"40",X"43",X"4F",X"49",X"4E",X"53",X"40",X"31", + X"40",X"50",X"4C",X"41",X"59",X"3F",X"AF",X"01",X"02",X"04",X"32",X"02",X"82",X"81",X"10",X"FA", + X"C9",X"3E",X"9B",X"32",X"03",X"81",X"3E",X"88",X"32",X"03",X"82",X"31",X"00",X"48",X"CD",X"C6", + X"00",X"3A",X"02",X"81",X"17",X"38",X"F7",X"21",X"00",X"40",X"01",X"00",X"08",X"71",X"2C",X"20", + X"FC",X"78",X"17",X"32",X"02",X"82",X"24",X"10",X"F4",X"3E",X"08",X"32",X"42",X"42",X"32",X"01", + X"82",X"31",X"00",X"48",X"21",X"C0",X"40",X"06",X"40",X"3E",X"FF",X"D7",X"21",X"43",X"42",X"06", + X"1C",X"D7",X"21",X"43",X"43",X"22",X"40",X"42",X"3A",X"00",X"70",X"AF",X"32",X"01",X"68",X"32", + X"05",X"70",X"32",X"06",X"68",X"32",X"07",X"68",X"32",X"02",X"82",X"21",X"C0",X"C0",X"22",X"A0", + X"40",X"3C",X"32",X"04",X"68",X"21",X"00",X"48",X"22",X"0B",X"40",X"3E",X"20",X"32",X"08",X"40", + X"3E",X"10",X"32",X"17",X"40",X"3A",X"02",X"81",X"0F",X"47",X"E6",X"03",X"32",X"00",X"40",X"78", + X"0F",X"0F",X"E6",X"01",X"32",X"0F",X"40",X"3A",X"01",X"81",X"E6",X"03",X"FE",X"03",X"28",X"07", + X"C6",X"03",X"32",X"07",X"40",X"18",X"05",X"3E",X"FF",X"32",X"07",X"40",X"CD",X"8E",X"30",X"AF", + X"3D",X"20",X"FD",X"CD",X"9D",X"30",X"06",X"04",X"D9",X"CD",X"C6",X"00",X"D9",X"10",X"F9",X"3E", + X"28",X"07",X"C6",X"32",X"67",X"E6",X"0F",X"6F",X"C6",X"63",X"77",X"01",X"02",X"0B",X"1E",X"09", + X"4F",X"57",X"70",X"06",X"03",X"DD",X"4E",X"03",X"10",X"FB",X"77",X"59",X"06",X"FA",X"80",X"77", + X"0E",X"10",X"06",X"20",X"81",X"80",X"7E",X"FE",X"6F",X"C0",X"31",X"00",X"48",X"CD",X"C6",X"00", + X"3A",X"02",X"81",X"17",X"30",X"F7",X"21",X"00",X"50",X"01",X"00",X"01",X"16",X"00",X"72",X"23", + X"0B",X"78",X"B1",X"20",X"F9",X"16",X"3F",X"21",X"00",X"48",X"01",X"00",X"08",X"72",X"3A",X"00", + X"70",X"23",X"0B",X"78",X"B1",X"20",X"F6",X"CD",X"03",X"02",X"30",X"22",X"CD",X"03",X"02",X"30", + X"1D",X"3E",X"01",X"32",X"01",X"68",X"21",X"00",X"42",X"06",X"0A",X"36",X"00",X"2C",X"36",X"00", + X"2C",X"36",X"01",X"2C",X"10",X"F5",X"21",X"AA",X"40",X"36",X"01",X"C3",X"17",X"02",X"3A",X"00", + X"70",X"18",X"FB",X"0B",X"3A",X"00",X"70",X"3A",X"01",X"81",X"07",X"D0",X"78",X"B1",X"20",X"F3", + X"3A",X"02",X"81",X"07",X"D0",X"37",X"C9",X"26",X"40",X"3A",X"A1",X"40",X"6F",X"7E",X"87",X"30", + X"05",X"CD",X"5A",X"02",X"18",X"F1",X"E6",X"0F",X"4F",X"06",X"00",X"36",X"FF",X"23",X"5E",X"36", + X"FF",X"2C",X"7D",X"FE",X"C0",X"30",X"02",X"3E",X"C0",X"32",X"A1",X"40",X"7B",X"21",X"4A",X"02", + X"09",X"5E",X"23",X"56",X"21",X"17",X"02",X"E5",X"EB",X"E9",X"C0",X"02",X"C1",X"02",X"C2",X"02", + X"20",X"03",X"B6",X"03",X"D2",X"03",X"19",X"04",X"DE",X"06",X"3A",X"5F",X"42",X"47",X"E6",X"0F", + X"CA",X"79",X"02",X"21",X"19",X"40",X"CB",X"46",X"C8",X"E6",X"03",X"CA",X"0C",X"0C",X"3D",X"CA", + X"D7",X"0B",X"3D",X"CA",X"1C",X"0B",X"C3",X"D7",X"0B",X"11",X"E0",X"FF",X"21",X"E0",X"48",X"3A", + X"0E",X"40",X"A7",X"28",X"22",X"36",X"02",X"CD",X"B1",X"02",X"21",X"40",X"4B",X"CD",X"AF",X"02", + X"3A",X"0D",X"40",X"A7",X"21",X"40",X"4B",X"28",X"03",X"21",X"E0",X"48",X"CB",X"60",X"C8",X"3A", + X"06",X"40",X"0F",X"D0",X"C3",X"B8",X"02",X"21",X"E0",X"48",X"CD",X"B8",X"02",X"18",X"DB",X"36", + X"01",X"19",X"36",X"25",X"19",X"36",X"20",X"C9",X"3E",X"10",X"77",X"19",X"77",X"19",X"77",X"C9", + X"C9",X"C9",X"3E",X"1A",X"06",X"0B",X"F5",X"C5",X"CD",X"19",X"04",X"C1",X"F1",X"3C",X"10",X"F6", + X"21",X"87",X"49",X"11",X"20",X"00",X"06",X"0A",X"DD",X"21",X"00",X"42",X"DD",X"7E",X"00",X"4F", + X"E6",X"0F",X"77",X"19",X"79",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"77",X"19",X"DD",X"23",X"DD", + X"7E",X"00",X"4F",X"E6",X"0F",X"77",X"19",X"79",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"77",X"19", + X"DD",X"23",X"DD",X"7E",X"00",X"4F",X"E6",X"0F",X"77",X"19",X"79",X"0F",X"0F",X"0F",X"0F",X"E6", + X"0F",X"28",X"01",X"77",X"11",X"62",X"FF",X"19",X"11",X"20",X"00",X"DD",X"23",X"10",X"BD",X"C9", + X"4F",X"3A",X"06",X"40",X"0F",X"D0",X"79",X"A7",X"28",X"48",X"4F",X"CD",X"7D",X"03",X"87",X"81", + X"4F",X"06",X"00",X"21",X"8C",X"03",X"09",X"A7",X"06",X"03",X"1A",X"8E",X"27",X"12",X"13",X"23", + X"10",X"F8",X"D5",X"3A",X"0D",X"40",X"0F",X"30",X"02",X"3E",X"01",X"CD",X"D2",X"03",X"D1",X"1B", + X"21",X"AA",X"40",X"06",X"03",X"1A",X"BE",X"D8",X"20",X"05",X"1B",X"2B",X"10",X"F7",X"C9",X"CD", + X"7D",X"03",X"21",X"A8",X"40",X"06",X"03",X"1A",X"77",X"13",X"23",X"10",X"FA",X"3E",X"02",X"C3", + X"D2",X"03",X"CD",X"7D",X"03",X"21",X"AB",X"40",X"A7",X"06",X"03",X"18",X"BD",X"F5",X"3A",X"0D", + X"40",X"11",X"A2",X"40",X"0F",X"30",X"03",X"11",X"A5",X"40",X"F1",X"C9",X"00",X"00",X"00",X"50", + X"00",X"00",X"00",X"01",X"00",X"50",X"01",X"00",X"80",X"00",X"00",X"00",X"01",X"00",X"00",X"02", + X"00",X"00",X"03",X"00",X"00",X"01",X"00",X"00",X"02",X"00",X"80",X"00",X"00",X"00",X"02",X"00", + X"10",X"00",X"00",X"00",X"08",X"00",X"F5",X"21",X"A2",X"40",X"A7",X"28",X"09",X"21",X"A5",X"40", + X"3D",X"28",X"03",X"21",X"A8",X"40",X"36",X"00",X"23",X"36",X"00",X"23",X"36",X"00",X"F1",X"C3", + X"D2",X"03",X"21",X"A4",X"40",X"DD",X"21",X"81",X"4B",X"A7",X"28",X"11",X"21",X"A7",X"40",X"DD", + X"21",X"21",X"49",X"3D",X"28",X"07",X"21",X"AA",X"40",X"DD",X"21",X"41",X"4A",X"11",X"E0",X"FF", + X"06",X"03",X"0E",X"04",X"7E",X"0F",X"0F",X"0F",X"0F",X"CD",X"04",X"04",X"7E",X"CD",X"04",X"04", + X"2B",X"10",X"F1",X"C9",X"E6",X"0F",X"28",X"08",X"0E",X"00",X"DD",X"77",X"00",X"DD",X"19",X"C9", + X"79",X"A7",X"28",X"F6",X"3E",X"10",X"0D",X"18",X"F1",X"87",X"F5",X"21",X"86",X"04",X"E6",X"7F", + X"5F",X"16",X"00",X"19",X"5E",X"23",X"56",X"EB",X"5E",X"23",X"56",X"23",X"EB",X"01",X"E0",X"FF", + X"F1",X"38",X"0E",X"FA",X"4B",X"04",X"1A",X"FE",X"3F",X"C8",X"D6",X"30",X"77",X"13",X"09",X"18", + X"F5",X"1A",X"FE",X"3F",X"C8",X"36",X"10",X"13",X"09",X"18",X"F6",X"22",X"B5",X"40",X"ED",X"53", + X"B3",X"40",X"EB",X"7B",X"E6",X"1F",X"47",X"87",X"C6",X"20",X"6F",X"26",X"40",X"22",X"B1",X"40", + X"CB",X"3B",X"CB",X"3B",X"7A",X"E6",X"03",X"0F",X"0F",X"B3",X"E6",X"F8",X"4F",X"21",X"00",X"48", + X"78",X"85",X"6F",X"11",X"20",X"00",X"43",X"36",X"10",X"19",X"10",X"FB",X"2A",X"B1",X"40",X"71", + X"3E",X"01",X"32",X"B0",X"40",X"C9",X"D0",X"04",X"DD",X"04",X"F1",X"04",X"FE",X"04",X"0B",X"05", + X"18",X"05",X"27",X"05",X"40",X"05",X"47",X"05",X"59",X"05",X"75",X"05",X"91",X"05",X"98",X"05", + X"A7",X"05",X"69",X"00",X"69",X"00",X"7A",X"00",X"7A",X"00",X"8B",X"00",X"A4",X"00",X"B5",X"00", + X"B9",X"05",X"CA",X"05",X"DB",X"05",X"E5",X"05",X"F7",X"05",X"0C",X"06",X"20",X"06",X"33",X"06", + X"46",X"06",X"59",X"06",X"6C",X"06",X"7F",X"06",X"92",X"06",X"A5",X"06",X"B8",X"06",X"CB",X"06", + X"96",X"4A",X"47",X"41",X"4D",X"45",X"40",X"40",X"4F",X"56",X"45",X"52",X"3F",X"F1",X"4A",X"50", + X"55",X"53",X"48",X"40",X"53",X"54",X"41",X"52",X"54",X"40",X"42",X"55",X"54",X"54",X"4F",X"4E", + X"3F",X"94",X"4A",X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"4F",X"4E",X"45",X"3F",X"94",X"4A", + X"50",X"4C",X"41",X"59",X"45",X"52",X"40",X"54",X"57",X"4F",X"3F",X"80",X"4A",X"48",X"49",X"47", + X"48",X"40",X"53",X"43",X"4F",X"52",X"45",X"3F",X"9F",X"4B",X"40",X"43",X"52",X"45",X"44",X"49", + X"54",X"40",X"40",X"40",X"40",X"40",X"3F",X"51",X"4B",X"48",X"4F",X"57",X"40",X"46",X"41",X"52", + X"40",X"43",X"41",X"4E",X"40",X"59",X"4F",X"55",X"40",X"49",X"4E",X"56",X"41",X"44",X"45",X"3F", + X"5E",X"4B",X"46",X"55",X"45",X"4C",X"3F",X"CC",X"4A",X"43",X"4F",X"4E",X"47",X"52",X"41",X"54", + X"55",X"4C",X"41",X"54",X"49",X"4F",X"4E",X"53",X"3F",X"6E",X"4B",X"59",X"4F",X"55",X"40",X"43", + X"4F",X"4D",X"50",X"4C",X"45",X"54",X"45",X"44",X"40",X"59",X"4F",X"55",X"52",X"40",X"44",X"55", + X"54",X"49",X"45",X"53",X"3F",X"70",X"4B",X"47",X"4F",X"4F",X"44",X"40",X"4C",X"55",X"43",X"4B", + X"40",X"4E",X"45",X"58",X"54",X"40",X"54",X"49",X"4D",X"45",X"40",X"41",X"47",X"41",X"49",X"4E", + X"3F",X"26",X"4A",X"50",X"4C",X"41",X"59",X"3F",X"A9",X"4A",X"5B",X"40",X"53",X"43",X"52",X"41", + X"4D",X"42",X"4C",X"45",X"40",X"5B",X"3F",X"C7",X"4A",X"5B",X"40",X"53",X"43",X"4F",X"52",X"45", + X"40",X"54",X"41",X"42",X"4C",X"45",X"40",X"5B",X"3F",X"D5",X"4A",X"31",X"40",X"43",X"4F",X"49", + X"4E",X"40",X"40",X"32",X"40",X"50",X"4C",X"41",X"59",X"3F",X"78",X"4B",X"42",X"4F",X"4E",X"55", + X"53",X"40",X"4A",X"45",X"54",X"40",X"40",X"46",X"4F",X"52",X"3F",X"58",X"49",X"30",X"30",X"30", + X"40",X"50",X"54",X"53",X"3F",X"D4",X"4A",X"4F",X"4E",X"45",X"40",X"50",X"4C",X"41",X"59",X"45", + X"52",X"40",X"4F",X"4E",X"4C",X"59",X"3F",X"F4",X"4A",X"4F",X"4E",X"45",X"40",X"4F",X"52",X"40", + X"54",X"57",X"4F",X"40",X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"3F",X"04",X"4B",X"5B",X"40", + X"53",X"43",X"4F",X"52",X"45",X"40",X"52",X"41",X"4E",X"4B",X"49",X"4E",X"47",X"40",X"5B",X"3F", + X"E7",X"4A",X"31",X"53",X"54",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50", + X"54",X"53",X"3F",X"E9",X"4A",X"32",X"4E",X"44",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"50",X"54",X"53",X"3F",X"EB",X"4A",X"33",X"52",X"44",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"50",X"54",X"53",X"3F",X"ED",X"4A",X"34",X"54",X"48",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50",X"54",X"53",X"3F",X"EF",X"4A",X"35",X"54", + X"48",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50",X"54",X"53",X"3F",X"F1", + X"4A",X"36",X"54",X"48",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50",X"54", + X"53",X"3F",X"F3",X"4A",X"37",X"54",X"48",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"50",X"54",X"53",X"3F",X"F5",X"4A",X"38",X"54",X"48",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"50",X"54",X"53",X"3F",X"F7",X"4A",X"39",X"54",X"48",X"40",X"40",X"40", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50",X"54",X"53",X"3F",X"F9",X"4A",X"31",X"30",X"54", + X"48",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"50",X"54",X"53",X"3F",X"A7",X"CA", + X"AC",X"0C",X"3D",X"CA",X"DE",X"0A",X"3D",X"CA",X"CA",X"0C",X"C3",X"87",X"0C",X"60",X"D1",X"60", + X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00",X"00",X"60", + X"D1",X"60",X"D1",X"00",X"00",X"70",X"D1",X"70",X"D1",X"00",X"01",X"60",X"D1",X"60",X"D1",X"00", + X"01",X"60",X"D1",X"60",X"D1",X"00",X"00",X"78",X"D1",X"78",X"D1",X"00",X"01",X"60",X"D1",X"60", + X"D1",X"00",X"01",X"48",X"D1",X"48",X"D1",X"00",X"00",X"58",X"D1",X"58",X"D1",X"00",X"01",X"48", + X"D1",X"48",X"D1",X"00",X"00",X"58",X"D1",X"58",X"D1",X"00",X"01",X"58",X"D1",X"58",X"D1",X"00", + X"01",X"68",X"D1",X"68",X"D1",X"00",X"01",X"68",X"D1",X"68",X"D1",X"00",X"02",X"78",X"D1",X"78", + X"D1",X"00",X"01",X"78",X"D1",X"78",X"D1",X"00",X"01",X"88",X"D1",X"88",X"D1",X"00",X"01",X"88", + X"D1",X"88",X"D1",X"00",X"02",X"98",X"D1",X"98",X"D1",X"00",X"01",X"98",X"D1",X"98",X"D1",X"00", + X"01",X"90",X"D1",X"90",X"D1",X"00",X"04",X"90",X"D1",X"90",X"D1",X"00",X"04",X"90",X"D1",X"90", + X"D1",X"00",X"01",X"90",X"D1",X"90",X"D1",X"00",X"00",X"A0",X"D1",X"A0",X"D1",X"00",X"01",X"80", + X"D1",X"80",X"D1",X"00",X"00",X"90",X"D1",X"90",X"D1",X"00",X"01",X"70",X"D1",X"70",X"D1",X"00", + X"00",X"80",X"D1",X"80",X"D1",X"00",X"01",X"60",X"D1",X"60",X"D1",X"00",X"00",X"70",X"D1",X"70", + X"D1",X"00",X"01",X"50",X"D1",X"50",X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00",X"01",X"50", + X"D1",X"50",X"D1",X"00",X"00",X"48",X"D1",X"48",X"D1",X"00",X"00",X"58",X"D1",X"58",X"D1",X"00", + X"01",X"50",X"D1",X"50",X"D1",X"00",X"00",X"50",X"D1",X"50",X"D1",X"00",X"00",X"60",X"D1",X"60", + X"D1",X"00",X"01",X"58",X"D1",X"58",X"D1",X"00",X"00",X"68",X"D1",X"68",X"D1",X"00",X"01",X"60", + X"D1",X"60",X"D1",X"00",X"00",X"70",X"D1",X"70",X"D1",X"00",X"01",X"68",X"D1",X"68",X"D1",X"00", + X"00",X"78",X"D1",X"78",X"D1",X"00",X"01",X"70",X"D1",X"70",X"D1",X"00",X"00",X"80",X"D1",X"80", + X"D1",X"00",X"01",X"80",X"D1",X"80",X"D1",X"00",X"00",X"80",X"D1",X"80",X"D1",X"00",X"00",X"80", + X"D1",X"80",X"D1",X"00",X"04",X"80",X"D1",X"80",X"D1",X"00",X"02",X"80",X"D1",X"80",X"D1",X"00", + X"04",X"80",X"D1",X"80",X"D1",X"00",X"01",X"80",X"D1",X"80",X"D1",X"00",X"01",X"78",X"D1",X"78", + X"D1",X"00",X"01",X"70",X"D1",X"70",X"D1",X"00",X"02",X"68",X"D1",X"68",X"D1",X"00",X"04",X"60", + X"D1",X"60",X"D1",X"00",X"01",X"60",X"D1",X"60",X"D1",X"00",X"01",X"58",X"D1",X"58",X"D1",X"00", + X"00",X"58",X"D1",X"58",X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00",X"01",X"48",X"D1",X"48", + X"D1",X"00",X"00",X"48",X"D1",X"48",X"D1",X"00",X"00",X"50",X"D1",X"50",X"D1",X"00",X"01",X"48", + X"D1",X"48",X"D1",X"00",X"01",X"58",X"D1",X"58",X"D1",X"00",X"01",X"48",X"D1",X"48",X"D1",X"00", + X"00",X"50",X"D1",X"50",X"D1",X"00",X"01",X"48",X"D1",X"48",X"D1",X"00",X"00",X"60",X"D1",X"60", + X"D1",X"00",X"01",X"50",X"D1",X"50",X"D1",X"00",X"02",X"40",X"D1",X"40",X"D1",X"00",X"00",X"60", + X"D1",X"60",X"D1",X"00",X"01",X"40",X"D1",X"40",X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00", + X"01",X"40",X"D1",X"40",X"D1",X"00",X"00",X"50",X"D1",X"50",X"D1",X"00",X"01",X"40",X"D1",X"40", + X"D1",X"00",X"00",X"50",X"D1",X"50",X"D1",X"00",X"01",X"60",X"D1",X"60",X"D1",X"00",X"00",X"60", + X"D1",X"60",X"D1",X"00",X"02",X"60",X"D1",X"60",X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00", + X"02",X"60",X"D1",X"60",X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00",X"02",X"70",X"D1",X"70", + X"D1",X"00",X"01",X"60",X"D1",X"60",X"D1",X"00",X"01",X"60",X"D1",X"60",X"D1",X"00",X"00",X"78", + X"D1",X"78",X"D1",X"00",X"01",X"60",X"D1",X"60",X"D1",X"00",X"01",X"48",X"D1",X"48",X"D1",X"00", + X"00",X"58",X"D1",X"58",X"D1",X"00",X"01",X"48",X"D1",X"48",X"D1",X"00",X"00",X"58",X"D1",X"58", + X"D1",X"00",X"01",X"58",X"D1",X"58",X"D1",X"00",X"01",X"68",X"D1",X"68",X"D1",X"00",X"01",X"68", + X"D1",X"68",X"D1",X"00",X"02",X"78",X"D1",X"78",X"D1",X"00",X"01",X"78",X"D1",X"78",X"D1",X"00", + X"01",X"88",X"D1",X"88",X"D1",X"00",X"01",X"88",X"D1",X"88",X"D1",X"00",X"02",X"98",X"D1",X"98", + X"D1",X"00",X"01",X"98",X"D1",X"98",X"D1",X"00",X"01",X"90",X"D1",X"90",X"D1",X"00",X"04",X"90", + X"D1",X"90",X"D1",X"00",X"04",X"90",X"D1",X"90",X"D1",X"00",X"01",X"90",X"D1",X"90",X"D1",X"00", + X"00",X"A0",X"D1",X"A0",X"D1",X"00",X"01",X"80",X"D1",X"80",X"D1",X"00",X"00",X"90",X"D1",X"90", + X"D1",X"00",X"01",X"70",X"D1",X"70",X"D1",X"00",X"00",X"80",X"D1",X"80",X"D1",X"00",X"01",X"60", + X"D1",X"60",X"D1",X"00",X"00",X"70",X"D1",X"70",X"D1",X"00",X"01",X"50",X"D1",X"50",X"D1",X"00", + X"00",X"60",X"D1",X"60",X"D1",X"00",X"01",X"50",X"D1",X"50",X"D1",X"00",X"00",X"48",X"D1",X"48", + X"D1",X"00",X"00",X"58",X"D1",X"58",X"D1",X"00",X"01",X"50",X"D1",X"50",X"D1",X"00",X"00",X"50", + X"D1",X"50",X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00",X"01",X"58",X"D1",X"58",X"D1",X"00", + X"00",X"68",X"D1",X"68",X"D1",X"00",X"01",X"60",X"D1",X"60",X"D1",X"00",X"00",X"70",X"D1",X"70", + X"D1",X"00",X"01",X"68",X"D1",X"68",X"D1",X"00",X"00",X"78",X"D1",X"78",X"D1",X"00",X"01",X"70", + X"D1",X"70",X"D1",X"00",X"00",X"80",X"D1",X"80",X"D1",X"00",X"01",X"80",X"D1",X"80",X"D1",X"00", + X"00",X"80",X"D1",X"80",X"D1",X"00",X"00",X"80",X"D1",X"80",X"D1",X"00",X"04",X"80",X"D1",X"80", + X"D1",X"00",X"02",X"80",X"D1",X"80",X"D1",X"00",X"04",X"80",X"D1",X"80",X"D1",X"00",X"01",X"80", + X"D1",X"80",X"D1",X"00",X"01",X"78",X"D1",X"78",X"D1",X"00",X"01",X"70",X"D1",X"70",X"D1",X"00", + X"02",X"68",X"D1",X"68",X"D1",X"00",X"04",X"60",X"D1",X"60",X"D1",X"00",X"01",X"60",X"D1",X"60", + X"D1",X"00",X"01",X"58",X"D1",X"58",X"D1",X"00",X"00",X"58",X"D1",X"58",X"D1",X"00",X"00",X"60", + X"D1",X"60",X"D1",X"00",X"01",X"48",X"D1",X"48",X"D1",X"00",X"00",X"48",X"D1",X"48",X"D1",X"00", + X"00",X"50",X"D1",X"50",X"D1",X"00",X"01",X"48",X"D1",X"48",X"D1",X"00",X"01",X"58",X"D1",X"58", + X"D1",X"00",X"01",X"48",X"D1",X"48",X"D1",X"00",X"00",X"50",X"D1",X"50",X"D1",X"00",X"01",X"48", + X"D1",X"48",X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00",X"01",X"50",X"D1",X"50",X"D1",X"00", + X"02",X"40",X"D1",X"40",X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00",X"01",X"40",X"D1",X"40", + X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00",X"01",X"40",X"D1",X"40",X"D1",X"00",X"00",X"50", + X"D1",X"50",X"D1",X"00",X"01",X"60",X"D1",X"60",X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00", + X"00",X"60",X"D1",X"60",X"D1",X"00",X"00",X"60",X"D1",X"60",X"D1",X"00",X"00",X"FF",X"3E",X"05", + X"CD",X"19",X"04",X"3A",X"02",X"40",X"FE",X"63",X"38",X"02",X"3E",X"63",X"CD",X"02",X"0B",X"47", + X"E6",X"F0",X"28",X"07",X"0F",X"0F",X"0F",X"0F",X"32",X"9F",X"4A",X"78",X"E6",X"0F",X"32",X"7F", + X"4A",X"C9",X"47",X"E6",X"0F",X"C6",X"00",X"27",X"4F",X"78",X"E6",X"F0",X"28",X"0B",X"0F",X"0F", + X"0F",X"0F",X"47",X"AF",X"C6",X"16",X"27",X"10",X"FB",X"81",X"27",X"C9",X"3A",X"10",X"41",X"0F", + X"D0",X"3A",X"30",X"42",X"0F",X"D0",X"2A",X"35",X"42",X"7D",X"E6",X"E0",X"6F",X"11",X"05",X"00", + X"19",X"3E",X"10",X"06",X"19",X"D7",X"11",X"07",X"00",X"19",X"06",X"19",X"D7",X"DD",X"21",X"30", + X"42",X"DD",X"7E",X"01",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"77",X"7D",X"E6",X"1F",X"47",X"3E", + X"1D",X"90",X"28",X"10",X"47",X"0E",X"39",X"3A",X"1D",X"41",X"E6",X"1C",X"28",X"02",X"0E",X"3D", + X"23",X"71",X"10",X"FC",X"DD",X"7E",X"04",X"DD",X"6E",X"05",X"DD",X"66",X"06",X"77",X"7D",X"E6", + X"1F",X"47",X"3E",X"1D",X"90",X"28",X"10",X"47",X"0E",X"39",X"3A",X"1D",X"41",X"E6",X"1C",X"28", + X"02",X"0E",X"D0",X"23",X"71",X"10",X"FC",X"DD",X"36",X"00",X"00",X"DD",X"CB",X"08",X"46",X"C8", + X"DD",X"7E",X"09",X"DD",X"6E",X"0A",X"DD",X"66",X"0B",X"77",X"7D",X"E6",X"1F",X"D6",X"05",X"28", + X"10",X"47",X"0E",X"39",X"3A",X"1D",X"41",X"E6",X"1C",X"28",X"02",X"0E",X"D0",X"2B",X"71",X"10", + X"FC",X"DD",X"7E",X"0C",X"DD",X"6E",X"0D",X"DD",X"66",X"0E",X"77",X"7D",X"E6",X"1F",X"D6",X"05", + X"28",X"10",X"47",X"0E",X"39",X"3A",X"1D",X"41",X"E6",X"1C",X"28",X"02",X"0E",X"3D",X"2B",X"71", + X"10",X"FC",X"DD",X"36",X"08",X"00",X"C9",X"11",X"04",X"00",X"06",X"08",X"DD",X"21",X"60",X"42", + X"D9",X"CD",X"EA",X"0B",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"CB",X"00",X"46",X"C8",X"DD", + X"7E",X"01",X"87",X"87",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"77",X"3C",X"23",X"77",X"3C",X"11", + X"1F",X"00",X"19",X"77",X"3C",X"23",X"77",X"DD",X"36",X"00",X"00",X"C9",X"3A",X"05",X"41",X"0F", + X"4F",X"E6",X"78",X"0F",X"0F",X"0F",X"47",X"3E",X"0F",X"90",X"21",X"BE",X"4A",X"11",X"E0",X"FF", + X"04",X"05",X"28",X"05",X"36",X"CB",X"19",X"10",X"FB",X"47",X"79",X"E6",X"07",X"D9",X"21",X"41", + X"0C",X"5F",X"16",X"00",X"19",X"7E",X"D9",X"77",X"04",X"05",X"C8",X"19",X"36",X"3C",X"10",X"FB", + X"C9",X"3C",X"C4",X"C5",X"C6",X"C7",X"C8",X"C9",X"CA",X"CD",X"0C",X"0C",X"3A",X"01",X"41",X"21", + X"64",X"4B",X"11",X"E0",X"FF",X"47",X"3E",X"18",X"90",X"04",X"05",X"28",X"05",X"36",X"0C",X"19", + X"10",X"FB",X"47",X"A7",X"28",X"05",X"36",X"10",X"19",X"10",X"FB",X"3A",X"02",X"41",X"21",X"63", + X"4B",X"47",X"3E",X"18",X"90",X"04",X"05",X"28",X"05",X"36",X"0D",X"19",X"10",X"FB",X"47",X"A7", + X"C8",X"36",X"10",X"19",X"10",X"FB",X"C9",X"21",X"BF",X"4B",X"11",X"E0",X"FF",X"06",X"0C",X"36", + X"10",X"19",X"10",X"FB",X"21",X"BF",X"4B",X"3A",X"08",X"41",X"A7",X"C8",X"FE",X"07",X"38",X"02", + X"3E",X"06",X"47",X"36",X"0A",X"19",X"36",X"0B",X"19",X"10",X"F8",X"C9",X"3A",X"00",X"41",X"E6", + X"0F",X"3C",X"47",X"3E",X"10",X"90",X"21",X"5F",X"48",X"11",X"20",X"00",X"36",X"0E",X"19",X"10", + X"FB",X"A7",X"C8",X"36",X"10",X"19",X"3D",X"20",X"FA",X"C9",X"DD",X"21",X"63",X"4B",X"11",X"E0", + X"FF",X"21",X"0B",X"0D",X"06",X"18",X"7E",X"DD",X"77",X"00",X"23",X"DD",X"19",X"10",X"F7",X"21", + X"64",X"4B",X"11",X"E0",X"FF",X"DD",X"21",X"23",X"0D",X"06",X"18",X"DD",X"7E",X"00",X"77",X"DD", + X"23",X"19",X"10",X"F7",X"3A",X"1E",X"41",X"3C",X"47",X"21",X"64",X"4B",X"36",X"81",X"19",X"36", + X"82",X"19",X"36",X"82",X"19",X"36",X"83",X"19",X"10",X"F2",X"C9",X"50",X"51",X"52",X"6D",X"53", + X"54",X"55",X"6D",X"56",X"57",X"55",X"6D",X"58",X"59",X"5A",X"6D",X"5B",X"59",X"5A",X"6D",X"64", + X"65",X"51",X"66",X"6E",X"6F",X"6F",X"80",X"6E",X"6F",X"6F",X"80",X"6E",X"6F",X"6F",X"80",X"6E", + X"6F",X"6F",X"80",X"6E",X"6F",X"6F",X"80",X"6E",X"6F",X"6F",X"80",X"6E",X"6F",X"6F",X"80",X"6E", + X"6F",X"6F",X"80",X"F5",X"C5",X"D5",X"E5",X"08",X"D9",X"F5",X"C5",X"D5",X"E5",X"DD",X"E5",X"FD", + X"E5",X"AF",X"32",X"01",X"68",X"21",X"20",X"40",X"11",X"00",X"50",X"01",X"80",X"00",X"ED",X"B0", + X"3A",X"00",X"70",X"3A",X"15",X"40",X"32",X"16",X"40",X"3A",X"13",X"40",X"32",X"15",X"40",X"2A", + X"10",X"40",X"22",X"13",X"40",X"21",X"12",X"40",X"3A",X"02",X"81",X"2F",X"77",X"2B",X"3A",X"01", + X"81",X"2F",X"77",X"2B",X"3A",X"00",X"81",X"2F",X"77",X"21",X"5F",X"42",X"35",X"CD",X"B9",X"0D", + X"CD",X"50",X"30",X"21",X"A5",X"0D",X"E5",X"3A",X"05",X"40",X"EF",X"7C",X"0E",X"7D",X"0F",X"B7", + X"11",X"DE",X"12",X"F6",X"12",X"FD",X"E1",X"DD",X"E1",X"E1",X"D1",X"C1",X"F1",X"D9",X"08",X"E1", + X"D1",X"C1",X"3E",X"01",X"32",X"01",X"68",X"F1",X"C9",X"21",X"18",X"40",X"7E",X"A7",X"28",X"03", + X"35",X"3E",X"01",X"32",X"02",X"68",X"21",X"10",X"40",X"7E",X"2C",X"2C",X"2C",X"B6",X"2C",X"2C", + X"2F",X"A6",X"2C",X"E6",X"C4",X"28",X"21",X"47",X"E6",X"C0",X"28",X"05",X"3E",X"06",X"32",X"18", + X"40",X"CD",X"34",X"0E",X"21",X"02",X"40",X"7E",X"FE",X"63",X"38",X"02",X"36",X"63",X"3A",X"06", + X"40",X"0F",X"38",X"04",X"11",X"01",X"07",X"FF",X"21",X"03",X"40",X"5E",X"16",X"06",X"1A",X"1C", + X"73",X"23",X"86",X"3D",X"77",X"3A",X"B0",X"40",X"0F",X"D0",X"2A",X"B1",X"40",X"7E",X"E6",X"07", + X"20",X"1B",X"EB",X"2A",X"B3",X"40",X"7E",X"FE",X"3F",X"28",X"11",X"23",X"22",X"B3",X"40",X"D6", + X"30",X"2A",X"B5",X"40",X"77",X"01",X"E0",X"FF",X"09",X"22",X"B5",X"40",X"EB",X"35",X"C0",X"AF", + X"32",X"B0",X"40",X"C9",X"3A",X"02",X"82",X"CB",X"67",X"28",X"03",X"E6",X"0F",X"C0",X"21",X"02", + X"40",X"78",X"E6",X"84",X"28",X"0E",X"34",X"3A",X"00",X"40",X"A7",X"C8",X"34",X"3D",X"C8",X"34", + X"3D",X"C8",X"34",X"C9",X"3A",X"00",X"40",X"2D",X"34",X"A7",X"28",X"08",X"3D",X"28",X"0A",X"3D", + X"28",X"0C",X"18",X"0F",X"7E",X"FE",X"02",X"18",X"0D",X"7E",X"FE",X"01",X"18",X"08",X"7E",X"FE", + X"03",X"18",X"03",X"7E",X"FE",X"04",X"D8",X"36",X"00",X"2C",X"34",X"C9",X"2A",X"0B",X"40",X"06", + X"20",X"3E",X"10",X"D7",X"22",X"0B",X"40",X"21",X"08",X"40",X"35",X"C0",X"2D",X"2D",X"36",X"00", + X"2D",X"36",X"01",X"AF",X"32",X"0A",X"40",X"21",X"BD",X"0E",X"CD",X"AD",X"0E",X"11",X"04",X"06", + X"FF",X"11",X"00",X"05",X"FF",X"1E",X"02",X"FF",X"AF",X"32",X"14",X"45",X"C9",X"11",X"20",X"40", + X"06",X"20",X"EB",X"36",X"00",X"2C",X"1A",X"77",X"2C",X"13",X"10",X"F7",X"C9",X"00",X"05",X"00", + X"07",X"07",X"01",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"06",X"00",X"05",X"00", + X"00",X"01",X"01",X"06",X"03",X"03",X"04",X"04",X"04",X"04",X"00",X"00",X"00",X"02",X"02",X"02", + X"00",X"00",X"00",X"04",X"04",X"04",X"04",X"04",X"06",X"06",X"06",X"06",X"06",X"00",X"05",X"02", + X"02",X"02",X"02",X"02",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"04",X"04",X"04", + X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"06",X"06",X"00",X"06",X"06",X"06",X"00",X"05",X"06", + X"06",X"06",X"06",X"06",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"06",X"00",X"05",X"04", + X"04",X"04",X"04",X"04",X"02",X"02",X"02",X"02",X"02",X"02",X"06",X"06",X"06",X"06",X"06",X"06", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"06",X"06",X"06",X"06",X"06",X"00",X"05",X"01", + X"01",X"01",X"01",X"01",X"01",X"02",X"02",X"03",X"03",X"04",X"04",X"05",X"05",X"06",X"06",X"07", + X"07",X"01",X"01",X"02",X"02",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"06",X"21",X"A9",X"11", + X"E5",X"3A",X"41",X"45",X"EF",X"99",X"0F",X"C7",X"0F",X"07",X"10",X"29",X"10",X"3E",X"10",X"DB", + X"10",X"04",X"11",X"25",X"11",X"40",X"11",X"8C",X"11",X"3E",X"01",X"32",X"04",X"68",X"3D",X"32", + X"03",X"68",X"AF",X"32",X"19",X"40",X"21",X"20",X"40",X"11",X"21",X"40",X"01",X"7F",X"00",X"36", + X"00",X"ED",X"B0",X"21",X"02",X"48",X"22",X"0B",X"40",X"21",X"09",X"40",X"36",X"20",X"21",X"41", + X"45",X"34",X"AF",X"32",X"06",X"40",X"C9",X"2A",X"0B",X"40",X"06",X"1E",X"3E",X"10",X"D7",X"11", + X"02",X"00",X"19",X"22",X"0B",X"40",X"21",X"09",X"40",X"35",X"C0",X"21",X"FD",X"0E",X"CD",X"AD", + X"0E",X"AF",X"32",X"06",X"68",X"32",X"07",X"68",X"21",X"41",X"45",X"34",X"2D",X"36",X"00",X"11", + X"01",X"07",X"FF",X"11",X"06",X"06",X"FF",X"11",X"12",X"06",X"FF",X"11",X"0F",X"06",X"FF",X"11", + X"0B",X"06",X"FF",X"1E",X"0C",X"FF",X"C9",X"21",X"40",X"45",X"35",X"C0",X"2C",X"34",X"21",X"3D", + X"0F",X"CD",X"AD",X"0E",X"11",X"86",X"06",X"FF",X"11",X"92",X"06",X"FF",X"11",X"8B",X"06",X"FF", + X"11",X"8C",X"06",X"FF",X"11",X"00",X"02",X"FF",X"C9",X"21",X"40",X"45",X"35",X"C0",X"21",X"02", + X"48",X"22",X"0B",X"40",X"21",X"09",X"40",X"36",X"20",X"21",X"41",X"45",X"34",X"C9",X"2A",X"0B", + X"40",X"06",X"1A",X"3E",X"10",X"D7",X"11",X"06",X"00",X"19",X"22",X"0B",X"40",X"21",X"09",X"40", + X"35",X"C0",X"21",X"1D",X"0F",X"CD",X"AD",X"0E",X"11",X"0D",X"06",X"FF",X"21",X"81",X"10",X"11", + X"60",X"40",X"01",X"18",X"00",X"ED",X"B0",X"21",X"99",X"10",X"22",X"44",X"45",X"21",X"4A",X"4A", + X"22",X"46",X"45",X"21",X"40",X"45",X"36",X"32",X"2C",X"34",X"2C",X"36",X"0B",X"2C",X"36",X"06", + X"C9",X"50",X"1C",X"00",X"4A",X"50",X"1E",X"00",X"62",X"50",X"1A",X"06",X"7B",X"50",X"10",X"04", + X"92",X"50",X"26",X"05",X"A9",X"50",X"33",X"01",X"C2",X"0C",X"0C",X"0C",X"10",X"10",X"05",X"00", + X"10",X"20",X"24",X"23",X"0C",X"0C",X"0C",X"10",X"10",X"08",X"00",X"10",X"20",X"24",X"23",X"0C", + X"0C",X"0C",X"10",X"01",X"00",X"00",X"10",X"20",X"24",X"23",X"0C",X"0C",X"0C",X"10",X"01",X"05", + X"00",X"10",X"20",X"24",X"23",X"0C",X"0C",X"0C",X"10",X"08",X"00",X"00",X"10",X"20",X"24",X"23", + X"0C",X"0C",X"0C",X"10",X"1D",X"29",X"23",X"24",X"15",X"22",X"29",X"21",X"40",X"45",X"35",X"C0", + X"36",X"05",X"2A",X"44",X"45",X"7E",X"23",X"22",X"44",X"45",X"2A",X"46",X"45",X"77",X"11",X"E0", + X"FF",X"19",X"22",X"46",X"45",X"21",X"42",X"45",X"35",X"C0",X"36",X"0B",X"21",X"40",X"45",X"36", + X"14",X"2C",X"34",X"C9",X"21",X"40",X"45",X"35",X"C0",X"36",X"01",X"2C",X"35",X"2A",X"46",X"45", + X"11",X"63",X"01",X"19",X"22",X"46",X"45",X"21",X"43",X"45",X"35",X"C0",X"21",X"40",X"45",X"36", + X"96",X"2C",X"34",X"34",X"C9",X"21",X"40",X"45",X"35",X"C0",X"2C",X"34",X"21",X"60",X"40",X"3E", + X"10",X"06",X"18",X"D7",X"CD",X"F6",X"18",X"CD",X"17",X"19",X"21",X"BD",X"0E",X"C3",X"AD",X"0E", + X"21",X"41",X"45",X"34",X"CD",X"CF",X"12",X"CD",X"F5",X"13",X"3E",X"01",X"32",X"19",X"40",X"21", + X"01",X"00",X"22",X"80",X"43",X"22",X"A0",X"43",X"AF",X"32",X"82",X"43",X"32",X"0D",X"40",X"21", + X"00",X"41",X"06",X"40",X"D7",X"21",X"B5",X"31",X"11",X"18",X"41",X"7E",X"12",X"23",X"13",X"7E", + X"12",X"23",X"7E",X"32",X"1D",X"41",X"11",X"02",X"07",X"FF",X"3E",X"20",X"32",X"15",X"41",X"21", + X"05",X"41",X"36",X"FF",X"2C",X"36",X"05",X"11",X"07",X"06",X"FF",X"C9",X"CD",X"4B",X"1B",X"CD", + X"37",X"25",X"CD",X"38",X"26",X"CD",X"AA",X"2A",X"CD",X"C0",X"2F",X"21",X"80",X"43",X"7E",X"2C", + X"B6",X"0F",X"D8",X"21",X"41",X"45",X"36",X"00",X"C9",X"3A",X"02",X"40",X"A7",X"C8",X"21",X"05", + X"40",X"34",X"AF",X"32",X"0A",X"40",X"C9",X"21",X"47",X"12",X"E5",X"3A",X"0A",X"40",X"EF",X"C5", + X"11",X"F3",X"11",X"39",X"12",X"AF",X"32",X"19",X"40",X"3E",X"01",X"32",X"04",X"68",X"3D",X"32", + X"03",X"68",X"21",X"DD",X"0E",X"CD",X"AD",X"0E",X"21",X"60",X"40",X"06",X"40",X"AF",X"D7",X"32", + X"B0",X"40",X"32",X"06",X"40",X"21",X"02",X"48",X"22",X"0B",X"40",X"21",X"09",X"40",X"36",X"10", + X"2C",X"34",X"C9",X"2A",X"0B",X"40",X"06",X"1D",X"3E",X"10",X"D7",X"11",X"03",X"00",X"19",X"06", + X"1D",X"D7",X"19",X"22",X"0B",X"40",X"21",X"09",X"40",X"35",X"C0",X"2C",X"34",X"AF",X"32",X"06", + X"68",X"32",X"07",X"68",X"32",X"0D",X"40",X"11",X"01",X"07",X"FF",X"11",X"01",X"06",X"FF",X"1E", + X"16",X"FF",X"1C",X"FF",X"3A",X"17",X"40",X"47",X"E6",X"0F",X"32",X"78",X"49",X"78",X"E6",X"F0", + X"C8",X"0F",X"0F",X"0F",X"0F",X"32",X"98",X"49",X"C9",X"3A",X"02",X"40",X"A7",X"C8",X"3D",X"11", + X"18",X"06",X"28",X"01",X"1C",X"FF",X"C9",X"3A",X"11",X"40",X"CB",X"7F",X"C2",X"87",X"12",X"CB", + X"77",X"C8",X"3A",X"02",X"40",X"FE",X"02",X"D8",X"D6",X"02",X"32",X"02",X"40",X"21",X"00",X"01", + X"22",X"0D",X"40",X"AF",X"32",X"0A",X"40",X"3E",X"03",X"32",X"05",X"40",X"3E",X"01",X"32",X"06", + X"40",X"11",X"04",X"06",X"FF",X"CD",X"9D",X"12",X"CD",X"0E",X"31",X"11",X"00",X"04",X"FF",X"3A", + X"0E",X"40",X"0F",X"D0",X"1C",X"FF",X"C9",X"3A",X"02",X"40",X"A7",X"28",X"0A",X"3D",X"32",X"02", + X"40",X"21",X"00",X"00",X"C3",X"60",X"12",X"3E",X"01",X"32",X"05",X"40",X"C9",X"AF",X"21",X"00", + X"41",X"47",X"D7",X"21",X"30",X"42",X"06",X"10",X"D7",X"21",X"60",X"40",X"06",X"40",X"D7",X"21", + X"60",X"42",X"01",X"02",X"B0",X"DF",X"32",X"19",X"40",X"21",X"00",X"41",X"11",X"01",X"41",X"01", + X"C0",X"00",X"36",X"00",X"ED",X"B0",X"3A",X"07",X"40",X"32",X"48",X"41",X"32",X"88",X"41",X"21", + X"C0",X"41",X"11",X"28",X"C9",X"06",X"20",X"72",X"2C",X"73",X"2C",X"10",X"FA",X"C9",X"3A",X"0A", + X"40",X"EF",X"0E",X"13",X"30",X"13",X"48",X"13",X"D2",X"13",X"FF",X"17",X"62",X"18",X"B1",X"18", + X"3F",X"19",X"03",X"1A",X"7A",X"1A",X"3A",X"0A",X"40",X"EF",X"0E",X"13",X"30",X"13",X"8D",X"13", + X"D2",X"13",X"FF",X"17",X"62",X"18",X"8E",X"19",X"C4",X"19",X"03",X"1A",X"7A",X"1A",X"AF",X"32", + X"19",X"40",X"21",X"60",X"40",X"06",X"40",X"D7",X"21",X"0A",X"40",X"34",X"2D",X"36",X"20",X"21", + X"00",X"48",X"22",X"0B",X"40",X"CD",X"17",X"19",X"3E",X"01",X"32",X"06",X"40",X"C3",X"CF",X"12", + X"2A",X"0B",X"40",X"06",X"20",X"3E",X"10",X"D7",X"22",X"0B",X"40",X"21",X"09",X"40",X"35",X"C0", + X"2C",X"34",X"21",X"BD",X"0E",X"C3",X"AD",X"0E",X"AF",X"32",X"5F",X"42",X"32",X"06",X"68",X"32", + X"07",X"68",X"32",X"0D",X"40",X"21",X"0A",X"40",X"34",X"2D",X"36",X"96",X"3A",X"0E",X"40",X"0F", + X"38",X"25",X"11",X"00",X"05",X"FF",X"1E",X"02",X"FF",X"14",X"FF",X"1E",X"04",X"FF",X"11",X"03", + X"07",X"FF",X"1E",X"00",X"FF",X"21",X"40",X"41",X"11",X"00",X"41",X"01",X"40",X"00",X"ED",X"B0", + X"2A",X"1D",X"41",X"22",X"18",X"41",X"C9",X"11",X"01",X"05",X"FF",X"18",X"D5",X"AF",X"32",X"5F", + X"42",X"3A",X"0F",X"40",X"0F",X"30",X"08",X"3E",X"01",X"32",X"06",X"68",X"32",X"07",X"68",X"3E", + X"01",X"32",X"0D",X"40",X"21",X"0A",X"40",X"34",X"2D",X"36",X"96",X"11",X"00",X"05",X"FF",X"1C", + X"FF",X"1C",X"FF",X"11",X"03",X"06",X"FF",X"1C",X"FF",X"11",X"03",X"07",X"FF",X"1E",X"00",X"FF", + X"21",X"80",X"41",X"11",X"00",X"41",X"01",X"40",X"00",X"ED",X"B0",X"2A",X"1D",X"41",X"22",X"18", + X"41",X"C9",X"21",X"09",X"40",X"35",X"C0",X"36",X"20",X"2C",X"34",X"11",X"82",X"06",X"FF",X"1E", + X"07",X"FF",X"CD",X"F6",X"18",X"CD",X"17",X"19",X"CD",X"CF",X"12",X"AF",X"32",X"19",X"40",X"21", + X"60",X"40",X"06",X"40",X"D7",X"21",X"19",X"48",X"11",X"1C",X"00",X"06",X"1E",X"3E",X"36",X"0E", + X"39",X"77",X"2C",X"71",X"2C",X"71",X"2C",X"71",X"2C",X"71",X"19",X"10",X"F4",X"C9",X"C8",X"2E", + X"D0",X"36",X"28",X"63",X"28",X"5E",X"00",X"D0",X"36",X"D0",X"2D",X"28",X"5E",X"30",X"63",X"00", + X"D8",X"36",X"D8",X"36",X"30",X"5E",X"30",X"5E",X"02",X"D8",X"2F",X"E0",X"36",X"38",X"63",X"38", + X"5E",X"00",X"E0",X"36",X"D8",X"31",X"38",X"5E",X"40",X"63",X"00",X"D0",X"30",X"C8",X"30",X"48", + X"62",X"48",X"62",X"00",X"C0",X"30",X"B8",X"31",X"48",X"5D",X"50",X"62",X"00",X"B8",X"36",X"B8", + X"35",X"50",X"5E",X"5F",X"62",X"00",X"B0",X"34",X"B8",X"2C",X"5F",X"5D",X"5F",X"60",X"00",X"C0", + X"35",X"B8",X"34",X"50",X"60",X"48",X"60",X"00",X"C0",X"2D",X"C8",X"2C",X"48",X"62",X"50",X"62", + X"00",X"D0",X"36",X"D0",X"2C",X"50",X"60",X"50",X"62",X"00",X"D8",X"2D",X"D8",X"31",X"5F",X"62", + X"5F",X"60",X"00",X"D0",X"32",X"C8",X"31",X"5F",X"62",X"5F",X"60",X"00",X"C0",X"32",X"C0",X"2F", + X"50",X"60",X"48",X"60",X"00",X"C8",X"2F",X"C8",X"33",X"48",X"62",X"48",X"60",X"00",X"C8",X"2C", + X"D0",X"2C",X"40",X"60",X"38",X"60",X"00",X"D0",X"30",X"D0",X"2D",X"38",X"62",X"40",X"62",X"00", + X"D0",X"31",X"C8",X"34",X"48",X"62",X"48",X"60",X"00",X"C8",X"30",X"C0",X"30",X"40",X"60",X"38", + X"61",X"00",X"B8",X"30",X"B0",X"30",X"38",X"62",X"40",X"63",X"00",X"B0",X"2C",X"B0",X"30",X"40", + X"60",X"38",X"61",X"00",X"B0",X"36",X"B0",X"2C",X"30",X"60",X"30",X"62",X"00",X"B8",X"2C",X"B8", + X"30",X"38",X"62",X"38",X"60",X"00",X"B8",X"2C",X"C0",X"2C",X"30",X"60",X"30",X"62",X"00",X"C8", + X"36",X"C0",X"30",X"38",X"62",X"40",X"5C",X"00",X"C0",X"2C",X"C8",X"35",X"38",X"60",X"30",X"61", + X"00",X"C0",X"30",X"C0",X"2C",X"28",X"5E",X"28",X"60",X"00",X"C0",X"31",X"B8",X"30",X"28",X"62", + X"30",X"62",X"00",X"B0",X"32",X"B0",X"36",X"38",X"62",X"40",X"62",X"00",X"B0",X"2E",X"B8",X"2D", + X"48",X"62",X"50",X"62",X"00",X"C0",X"2E",X"C8",X"2D",X"5F",X"62",X"5F",X"3A",X"00",X"D0",X"36", + X"D0",X"36",X"5F",X"3A",X"5F",X"60",X"01",X"D0",X"36",X"D0",X"36",X"50",X"3A",X"50",X"3A",X"02", + X"D0",X"36",X"D0",X"36",X"5F",X"62",X"5F",X"3A",X"01",X"D0",X"36",X"D0",X"36",X"5F",X"3A",X"5F", + X"3A",X"02",X"D0",X"36",X"D0",X"2E",X"5F",X"3A",X"5F",X"3A",X"00",X"D8",X"36",X"D8",X"36",X"5F", + X"3A",X"5F",X"60",X"04",X"D8",X"36",X"D8",X"36",X"50",X"60",X"48",X"60",X"04",X"D0",X"32",X"D0", + X"36",X"40",X"60",X"38",X"60",X"00",X"D0",X"36",X"D0",X"36",X"30",X"3A",X"30",X"3A",X"01",X"C8", + X"31",X"C0",X"32",X"30",X"3A",X"30",X"3A",X"00",X"C0",X"36",X"C0",X"36",X"30",X"3A",X"30",X"3A", + X"01",X"B8",X"31",X"B0",X"32",X"30",X"3A",X"30",X"60",X"00",X"B0",X"36",X"B0",X"36",X"28",X"3A", + X"28",X"3A",X"00",X"B0",X"36",X"B0",X"36",X"28",X"3A",X"28",X"3A",X"00",X"B0",X"2E",X"B8",X"2D", + X"30",X"62",X"30",X"3A",X"00",X"C0",X"36",X"C0",X"2E",X"30",X"3A",X"30",X"3A",X"00",X"C8",X"36", + X"C8",X"36",X"38",X"62",X"40",X"62",X"04",X"C8",X"36",X"C8",X"36",X"48",X"62",X"48",X"3A",X"01", + X"C8",X"2E",X"D0",X"36",X"48",X"3A",X"50",X"62",X"00",X"D0",X"36",X"D0",X"36",X"5F",X"62",X"5F", + X"3A",X"04",X"D0",X"36",X"D0",X"2D",X"5F",X"3A",X"5F",X"60",X"00",X"D8",X"36",X"D8",X"36",X"50", + X"60",X"48",X"60",X"01",X"D8",X"36",X"D8",X"36",X"40",X"60",X"38",X"60",X"02",X"D0",X"31",X"C8", + X"32",X"30",X"60",X"28",X"60",X"00",X"C0",X"31",X"B8",X"30",X"28",X"62",X"30",X"62",X"00",X"B0", + X"32",X"B0",X"36",X"38",X"62",X"40",X"62",X"00",X"B0",X"2E",X"B8",X"2D",X"48",X"62",X"50",X"62", + X"00",X"C0",X"2E",X"C8",X"2D",X"5F",X"62",X"5F",X"3A",X"00",X"D0",X"36",X"D0",X"36",X"5F",X"3A", + X"5F",X"60",X"01",X"D0",X"36",X"D0",X"36",X"50",X"3A",X"50",X"3A",X"01",X"D0",X"36",X"D0",X"36", + X"5F",X"62",X"5F",X"3A",X"02",X"D0",X"36",X"D0",X"36",X"5F",X"3A",X"5F",X"3A",X"02",X"D0",X"36", + X"D0",X"2E",X"5F",X"3A",X"5F",X"3A",X"00",X"D8",X"36",X"D8",X"36",X"5F",X"3A",X"5F",X"60",X"01", + X"D8",X"36",X"D8",X"36",X"50",X"60",X"48",X"60",X"01",X"D0",X"32",X"D0",X"36",X"40",X"60",X"38", + X"60",X"00",X"D0",X"36",X"D0",X"36",X"30",X"3A",X"30",X"3A",X"04",X"C8",X"31",X"C0",X"32",X"30", + X"3A",X"30",X"3A",X"00",X"C0",X"36",X"C0",X"36",X"30",X"3A",X"30",X"3A",X"01",X"B8",X"31",X"B0", + X"32",X"30",X"3A",X"30",X"60",X"00",X"B0",X"36",X"B0",X"36",X"28",X"3A",X"28",X"3A",X"00",X"B0", + X"36",X"B0",X"36",X"28",X"3A",X"28",X"3A",X"00",X"B0",X"2E",X"B8",X"2D",X"30",X"62",X"30",X"3A", + X"00",X"C0",X"36",X"C0",X"2E",X"30",X"3A",X"30",X"3A",X"00",X"C8",X"36",X"C8",X"36",X"38",X"62", + X"40",X"62",X"04",X"C8",X"36",X"C8",X"36",X"48",X"62",X"48",X"3A",X"04",X"C8",X"2E",X"D0",X"36", + X"48",X"3A",X"50",X"62",X"00",X"D0",X"36",X"D0",X"36",X"5F",X"62",X"5F",X"3A",X"01",X"D0",X"36", + X"D0",X"2D",X"5F",X"3A",X"5F",X"60",X"00",X"D8",X"36",X"D8",X"36",X"50",X"60",X"48",X"60",X"04", + X"D8",X"36",X"D8",X"36",X"40",X"60",X"38",X"60",X"04",X"D0",X"31",X"C8",X"32",X"30",X"60",X"28", + X"60",X"00",X"C8",X"2C",X"D0",X"2C",X"28",X"62",X"30",X"62",X"00",X"D8",X"2C",X"E0",X"36",X"38", + X"62",X"40",X"62",X"00",X"E0",X"36",X"E0",X"36",X"48",X"62",X"50",X"62",X"01",X"E0",X"36",X"D8", + X"34",X"5F",X"5C",X"50",X"60",X"00",X"E0",X"36",X"E0",X"36",X"48",X"60",X"40",X"60",X"02",X"E0", + X"36",X"E0",X"36",X"38",X"60",X"30",X"60",X"01",X"E0",X"36",X"E0",X"36",X"28",X"5E",X"30",X"62", + X"01",X"D8",X"34",X"E0",X"36",X"36",X"5C",X"30",X"60",X"00",X"E0",X"36",X"E0",X"36",X"28",X"5E", + X"30",X"5C",X"04",X"E0",X"36",X"E0",X"36",X"28",X"5E",X"30",X"62",X"01",X"E0",X"36",X"E0",X"36", + X"38",X"62",X"40",X"62",X"04",X"D8",X"30",X"D0",X"30",X"48",X"62",X"57",X"5C",X"00",X"C8",X"30", + X"C0",X"30",X"48",X"60",X"40",X"60",X"00",X"B8",X"30",X"B0",X"34",X"38",X"60",X"30",X"60",X"00", + X"B8",X"2C",X"C0",X"2C",X"28",X"3A",X"28",X"3A",X"00",X"C8",X"2C",X"D0",X"2C",X"28",X"3A",X"28", + X"3A",X"00",X"D8",X"2C",X"D8",X"34",X"28",X"3A",X"28",X"3A",X"00",X"E0",X"36",X"E0",X"36",X"28", + X"3A",X"30",X"5C",X"01",X"E0",X"36",X"E0",X"36",X"28",X"3A",X"28",X"3A",X"02",X"D8",X"30",X"D0", + X"34",X"28",X"3A",X"28",X"3A",X"00",X"D8",X"2C",X"E0",X"36",X"28",X"3A",X"28",X"3A",X"00",X"E0", + X"36",X"E0",X"36",X"28",X"3A",X"28",X"3A",X"01",X"E0",X"36",X"E0",X"36",X"28",X"3A",X"28",X"3A", + X"01",X"E0",X"36",X"E0",X"36",X"28",X"3A",X"28",X"3A",X"01",X"E0",X"36",X"D8",X"34",X"28",X"3A", + X"28",X"3A",X"00",X"E0",X"36",X"E0",X"36",X"28",X"3A",X"28",X"3A",X"04",X"E0",X"36",X"D8",X"30", + X"28",X"3A",X"28",X"3A",X"00",X"D0",X"30",X"C8",X"30",X"28",X"3A",X"28",X"60",X"00",X"FF",X"21", + X"09",X"40",X"35",X"C0",X"36",X"0A",X"2C",X"34",X"3E",X"01",X"32",X"19",X"40",X"21",X"01",X"00", + X"22",X"80",X"43",X"22",X"A0",X"43",X"AF",X"32",X"82",X"43",X"21",X"08",X"41",X"35",X"11",X"03", + X"07",X"FF",X"21",X"10",X"41",X"11",X"11",X"41",X"01",X"0D",X"00",X"36",X"00",X"ED",X"B0",X"21", + X"B5",X"31",X"3A",X"1E",X"41",X"47",X"87",X"80",X"5F",X"16",X"00",X"19",X"7E",X"32",X"18",X"41", + X"23",X"7E",X"32",X"19",X"41",X"23",X"7E",X"32",X"1D",X"41",X"11",X"02",X"07",X"FF",X"3E",X"08", + X"32",X"15",X"41",X"3E",X"FF",X"32",X"05",X"41",X"3E",X"05",X"32",X"06",X"41",X"11",X"00",X"07", + X"FF",X"C9",X"CD",X"4B",X"1B",X"CD",X"37",X"25",X"CD",X"38",X"26",X"CD",X"AA",X"2A",X"CD",X"C0", + X"2F",X"CD",X"1B",X"1B",X"CD",X"7B",X"31",X"CD",X"26",X"1B",X"21",X"80",X"43",X"7E",X"0F",X"38", + X"19",X"2C",X"7E",X"0F",X"D8",X"21",X"80",X"43",X"11",X"81",X"43",X"36",X"00",X"01",X"A0",X"01", + X"ED",X"B0",X"21",X"0A",X"40",X"34",X"2D",X"36",X"64",X"C9",X"3A",X"12",X"41",X"FE",X"FF",X"C0", + X"21",X"80",X"45",X"36",X"96",X"2C",X"36",X"00",X"21",X"0A",X"40",X"36",X"08",X"2D",X"36",X"64", + X"C9",X"3A",X"08",X"41",X"A7",X"20",X"28",X"CD",X"F6",X"18",X"CD",X"17",X"19",X"11",X"00",X"06", + X"FF",X"1E",X"02",X"FF",X"3E",X"01",X"32",X"04",X"68",X"3D",X"32",X"03",X"68",X"21",X"C0",X"45", + X"36",X"96",X"2C",X"36",X"00",X"3E",X"09",X"32",X"0A",X"40",X"AF",X"32",X"19",X"40",X"C9",X"3A", + X"0E",X"40",X"0F",X"38",X"09",X"21",X"0A",X"40",X"36",X"03",X"2D",X"36",X"32",X"C9",X"21",X"0A", + X"40",X"34",X"2D",X"36",X"32",X"C9",X"21",X"03",X"48",X"11",X"05",X"00",X"0E",X"20",X"3E",X"10", + X"06",X"1B",X"77",X"23",X"10",X"FC",X"19",X"0D",X"20",X"F6",X"21",X"2A",X"40",X"06",X"19",X"AF", + X"77",X"2C",X"77",X"2C",X"10",X"FA",X"C9",X"21",X"80",X"42",X"11",X"81",X"42",X"01",X"A0",X"02", + X"36",X"00",X"ED",X"B0",X"21",X"60",X"42",X"11",X"61",X"42",X"01",X"1F",X"00",X"36",X"00",X"ED", + X"B0",X"21",X"60",X"40",X"11",X"61",X"40",X"01",X"3F",X"00",X"36",X"00",X"ED",X"B0",X"C9",X"21", + X"09",X"40",X"35",X"C0",X"3A",X"08",X"41",X"A7",X"20",X"10",X"3A",X"0E",X"40",X"0F",X"38",X"19", + X"3E",X"01",X"32",X"05",X"40",X"AF",X"32",X"41",X"45",X"C9",X"3A",X"88",X"41",X"A7",X"20",X"19", + X"21",X"0A",X"40",X"36",X"03",X"2D",X"36",X"01",X"C9",X"3A",X"88",X"41",X"A7",X"20",X"0A",X"3E", + X"01",X"32",X"05",X"40",X"AF",X"32",X"41",X"45",X"C9",X"21",X"00",X"41",X"11",X"40",X"41",X"01", + X"40",X"00",X"ED",X"B0",X"AF",X"32",X"0A",X"40",X"3E",X"04",X"32",X"05",X"40",X"C9",X"3A",X"08", + X"41",X"A7",X"20",X"28",X"CD",X"F6",X"18",X"CD",X"17",X"19",X"11",X"00",X"06",X"FF",X"1E",X"03", + X"FF",X"3E",X"01",X"32",X"04",X"68",X"3D",X"32",X"03",X"68",X"21",X"C0",X"45",X"36",X"96",X"2C", + X"36",X"00",X"3E",X"09",X"32",X"0A",X"40",X"AF",X"32",X"19",X"40",X"C9",X"21",X"0A",X"40",X"34", + X"2D",X"36",X"64",X"C9",X"21",X"09",X"40",X"35",X"C0",X"3A",X"08",X"41",X"A7",X"20",X"10",X"3A", + X"48",X"41",X"A7",X"20",X"0A",X"3E",X"01",X"32",X"05",X"40",X"AF",X"32",X"41",X"45",X"C9",X"3A", + X"48",X"41",X"A7",X"20",X"09",X"21",X"0A",X"40",X"36",X"03",X"2D",X"36",X"01",X"C9",X"21",X"00", + X"41",X"11",X"80",X"41",X"01",X"40",X"00",X"ED",X"B0",X"AF",X"32",X"0A",X"40",X"3E",X"03",X"32", + X"05",X"40",X"C9",X"3A",X"81",X"45",X"EF",X"0D",X"1A",X"35",X"1A",X"50",X"1A",X"CD",X"4B",X"1B", + X"CD",X"37",X"25",X"CD",X"38",X"26",X"CD",X"C0",X"2F",X"21",X"80",X"45",X"35",X"C0",X"36",X"05", + X"2C",X"34",X"3E",X"01",X"32",X"04",X"68",X"3E",X"00",X"32",X"03",X"68",X"32",X"19",X"40",X"3E", + X"08",X"32",X"02",X"82",X"C9",X"21",X"80",X"45",X"35",X"C0",X"2C",X"34",X"CD",X"F6",X"18",X"11", + X"08",X"06",X"FF",X"1C",X"FF",X"1C",X"FF",X"21",X"5D",X"0F",X"CD",X"AD",X"0E",X"C3",X"17",X"19", + X"21",X"80",X"45",X"35",X"C0",X"21",X"08",X"41",X"34",X"21",X"00",X"41",X"34",X"11",X"00",X"07", + X"FF",X"AF",X"32",X"5F",X"42",X"21",X"0A",X"40",X"36",X"03",X"2D",X"36",X"0A",X"CD",X"CF",X"12", + X"AF",X"32",X"1E",X"41",X"21",X"BD",X"0E",X"C3",X"AD",X"0E",X"3A",X"C1",X"45",X"EF",X"84",X"1A", + X"98",X"1A",X"B7",X"1A",X"21",X"C0",X"45",X"35",X"C0",X"2C",X"34",X"11",X"80",X"06",X"FF",X"1E", + X"82",X"FF",X"21",X"3D",X"0F",X"C3",X"AD",X"0E",X"CD",X"C5",X"1A",X"7D",X"FE",X"0A",X"28",X"0B", + X"87",X"87",X"5F",X"16",X"00",X"21",X"2F",X"40",X"19",X"36",X"00",X"11",X"00",X"02",X"FF",X"21", + X"C0",X"45",X"36",X"80",X"2C",X"34",X"C9",X"21",X"C0",X"45",X"35",X"C0",X"21",X"0A",X"40",X"36", + X"07",X"2D",X"36",X"64",X"C9",X"01",X"1E",X"00",X"11",X"03",X"00",X"6A",X"DD",X"21",X"A2",X"40", + X"3A",X"0D",X"40",X"0F",X"30",X"02",X"DD",X"19",X"FD",X"21",X"00",X"42",X"DD",X"7E",X"02",X"FD", + X"BE",X"02",X"20",X"0F",X"DD",X"7E",X"01",X"FD",X"BE",X"01",X"20",X"07",X"DD",X"7E",X"00",X"FD", + X"BE",X"00",X"C8",X"30",X"09",X"FD",X"19",X"2C",X"0D",X"0D",X"0D",X"C8",X"18",X"DE",X"7D",X"21", + X"1D",X"42",X"11",X"20",X"42",X"ED",X"B8",X"6F",X"DD",X"7E",X"00",X"FD",X"77",X"00",X"DD",X"7E", + X"01",X"FD",X"77",X"01",X"DD",X"7E",X"02",X"FD",X"77",X"02",X"C9",X"3A",X"5F",X"42",X"E6",X"3F", + X"C0",X"11",X"0C",X"03",X"FF",X"C9",X"3A",X"07",X"41",X"A7",X"C0",X"21",X"A4",X"40",X"3A",X"0D", + X"40",X"0F",X"30",X"03",X"21",X"A7",X"40",X"7E",X"A7",X"C8",X"CD",X"B0",X"31",X"21",X"08",X"41", + X"34",X"11",X"03",X"07",X"FF",X"3E",X"01",X"32",X"07",X"41",X"C9",X"CD",X"24",X"1D",X"CD",X"36", + X"20",X"CD",X"4F",X"1E",X"CD",X"97",X"21",X"CD",X"BF",X"22",X"CD",X"89",X"23",X"CD",X"C8",X"24", + X"C3",X"29",X"1E",X"DD",X"7E",X"0E",X"A7",X"28",X"05",X"3D",X"DD",X"77",X"0E",X"C9",X"DD",X"6E", + X"0C",X"DD",X"66",X"0D",X"7E",X"FE",X"FF",X"28",X"15",X"DD",X"77",X"16",X"23",X"7E",X"DD",X"77", + X"12",X"23",X"7E",X"DD",X"77",X"0E",X"23",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"C9",X"23",X"7E", + X"DD",X"77",X"0C",X"23",X"7E",X"DD",X"77",X"0D",X"18",X"C9",X"DD",X"E5",X"E1",X"3E",X"07",X"85", + X"6F",X"DD",X"36",X"0A",X"00",X"DD",X"7E",X"05",X"DD",X"BE",X"03",X"28",X"04",X"38",X"1E",X"18", + X"56",X"DD",X"7E",X"06",X"DD",X"BE",X"04",X"28",X"0E",X"38",X"06",X"36",X"00",X"2C",X"36",X"01", + X"C9",X"36",X"00",X"2C",X"36",X"FF",X"C9",X"36",X"00",X"2C",X"36",X"00",X"C9",X"DD",X"7E",X"06", + X"DD",X"BE",X"04",X"28",X"2C",X"38",X"15",X"36",X"FF",X"2C",X"36",X"01",X"DD",X"7E",X"03",X"DD", + X"96",X"05",X"47",X"DD",X"7E",X"06",X"DD",X"96",X"04",X"4F",X"18",X"55",X"36",X"FF",X"2C",X"36", + X"FF",X"DD",X"7E",X"03",X"DD",X"96",X"05",X"47",X"DD",X"7E",X"04",X"DD",X"96",X"06",X"4F",X"18", + X"40",X"36",X"FF",X"2C",X"36",X"00",X"C9",X"DD",X"7E",X"06",X"DD",X"BE",X"04",X"28",X"2C",X"38", + X"15",X"36",X"01",X"2C",X"36",X"01",X"DD",X"7E",X"05",X"DD",X"96",X"03",X"47",X"DD",X"7E",X"06", + X"DD",X"96",X"04",X"4F",X"18",X"1B",X"36",X"01",X"2C",X"36",X"FF",X"DD",X"7E",X"05",X"DD",X"96", + X"03",X"47",X"DD",X"7E",X"04",X"DD",X"96",X"06",X"4F",X"18",X"06",X"36",X"01",X"2C",X"36",X"00", + X"C9",X"79",X"B8",X"28",X"16",X"38",X"0B",X"DD",X"36",X"09",X"00",X"CD",X"64",X"1C",X"DD",X"77", + X"0B",X"C9",X"DD",X"36",X"09",X"01",X"78",X"41",X"4F",X"18",X"F0",X"DD",X"36",X"09",X"01",X"DD", + X"36",X"0B",X"FF",X"C9",X"AF",X"67",X"68",X"57",X"59",X"06",X"08",X"CB",X"FF",X"07",X"29",X"A7", + X"ED",X"52",X"38",X"03",X"10",X"F5",X"C9",X"19",X"CB",X"87",X"10",X"EF",X"C9",X"DD",X"7E",X"04", + X"DD",X"BE",X"06",X"28",X"4A",X"DD",X"7E",X"03",X"DD",X"BE",X"05",X"28",X"58",X"DD",X"CB",X"09", + X"46",X"28",X"1E",X"DD",X"7E",X"07",X"DD",X"86",X"03",X"DD",X"77",X"03",X"DD",X"7E",X"0B",X"DD", + X"86",X"0A",X"DD",X"77",X"0A",X"D0",X"DD",X"7E",X"08",X"DD",X"86",X"04",X"DD",X"77",X"04",X"A7", + X"C9",X"DD",X"7E",X"08",X"DD",X"86",X"04",X"DD",X"77",X"04",X"DD",X"7E",X"0B",X"DD",X"86",X"0A", + X"DD",X"77",X"0A",X"D0",X"DD",X"7E",X"07",X"DD",X"86",X"03",X"DD",X"77",X"03",X"A7",X"C9",X"DD", + X"7E",X"03",X"DD",X"BE",X"05",X"28",X"0C",X"30",X"05",X"DD",X"34",X"03",X"A7",X"C9",X"DD",X"35", + X"03",X"A7",X"C9",X"37",X"C9",X"DD",X"7E",X"04",X"DD",X"BE",X"06",X"30",X"05",X"DD",X"34",X"04", + X"A7",X"C9",X"DD",X"35",X"04",X"A7",X"C9",X"DD",X"6E",X"13",X"DD",X"66",X"14",X"7E",X"FE",X"80", + X"20",X"0C",X"23",X"7E",X"DD",X"77",X"13",X"23",X"7E",X"DD",X"77",X"14",X"18",X"E9",X"DD",X"86", + X"03",X"DD",X"77",X"03",X"23",X"7E",X"DD",X"86",X"04",X"DD",X"77",X"04",X"23",X"DD",X"75",X"13", + X"DD",X"74",X"14",X"C9",X"DD",X"21",X"10",X"41",X"DD",X"7E",X"05",X"A7",X"20",X"12",X"DD",X"7E", + X"04",X"DD",X"77",X"05",X"DD",X"7E",X"06",X"E6",X"0F",X"CC",X"44",X"1D",X"DD",X"34",X"06",X"C9", + X"DD",X"35",X"05",X"C9",X"CD",X"4A",X"1D",X"C3",X"D8",X"1D",X"FD",X"2A",X"18",X"41",X"3E",X"01", + X"32",X"10",X"41",X"32",X"30",X"42",X"DD",X"7E",X"06",X"2F",X"E6",X"F0",X"47",X"6F",X"26",X"12", + X"29",X"29",X"E5",X"FD",X"7E",X"02",X"E6",X"F8",X"0F",X"0F",X"0F",X"5F",X"16",X"00",X"19",X"22", + X"35",X"42",X"FD",X"7E",X"03",X"32",X"34",X"42",X"E1",X"1E",X"20",X"19",X"FD",X"7E",X"00",X"E6", + X"F8",X"0F",X"0F",X"0F",X"5F",X"19",X"22",X"32",X"42",X"FD",X"7E",X"01",X"32",X"31",X"42",X"78", + X"0F",X"0F",X"5F",X"21",X"C0",X"41",X"19",X"FD",X"7E",X"02",X"77",X"2C",X"36",X"28",X"2C",X"FD", + X"7E",X"00",X"77",X"2C",X"36",X"28",X"AF",X"32",X"38",X"42",X"32",X"11",X"41",X"2A",X"18",X"41", + X"1E",X"09",X"FD",X"7E",X"04",X"A7",X"20",X"02",X"1E",X"06",X"19",X"22",X"18",X"41",X"FD",X"7E", + X"04",X"A7",X"28",X"05",X"FD",X"7E",X"08",X"18",X"03",X"FD",X"7E",X"05",X"32",X"1A",X"41",X"2A", + X"35",X"42",X"2B",X"2B",X"22",X"1B",X"41",X"C9",X"FD",X"7E",X"04",X"A7",X"C8",X"68",X"26",X"12", + X"29",X"29",X"E5",X"FD",X"7E",X"06",X"E6",X"F8",X"0F",X"0F",X"0F",X"5F",X"19",X"22",X"3D",X"42", + X"FD",X"7E",X"07",X"32",X"3C",X"42",X"E1",X"1E",X"20",X"19",X"FD",X"7E",X"04",X"E6",X"F8",X"0F", + X"0F",X"0F",X"5F",X"19",X"22",X"3A",X"42",X"FD",X"7E",X"05",X"32",X"39",X"42",X"78",X"0F",X"0F", + X"5F",X"21",X"C0",X"41",X"19",X"2C",X"FD",X"7E",X"06",X"77",X"2C",X"2C",X"FD",X"7E",X"04",X"77", + X"3E",X"01",X"32",X"11",X"41",X"32",X"38",X"42",X"C9",X"DD",X"21",X"00",X"45",X"11",X"03",X"00", + X"06",X"04",X"CD",X"3A",X"1E",X"DD",X"19",X"10",X"F9",X"C9",X"DD",X"CB",X"00",X"46",X"C8",X"DD", + X"7E",X"02",X"D6",X"03",X"DD",X"77",X"02",X"FE",X"1F",X"D0",X"DD",X"CB",X"00",X"86",X"C9",X"DD", + X"21",X"80",X"43",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"EF",X"73", + X"1E",X"9A",X"1E",X"5C",X"1F",X"8F",X"1F",X"90",X"1F",X"91",X"1F",X"92",X"1F",X"AD",X"1F",X"E6", + X"1F",X"E7",X"1F",X"DD",X"36",X"03",X"58",X"DD",X"36",X"23",X"58",X"DD",X"36",X"04",X"D0",X"DD", + X"36",X"24",X"E0",X"21",X"E8",X"1F",X"22",X"8C",X"43",X"21",X"F7",X"1F",X"22",X"AC",X"43",X"DD", + X"36",X"0E",X"00",X"DD",X"36",X"2E",X"00",X"DD",X"34",X"02",X"21",X"06",X"41",X"35",X"20",X"1B", + X"3A",X"00",X"41",X"A7",X"28",X"07",X"3D",X"28",X"08",X"36",X"04",X"18",X"06",X"36",X"06",X"18", + X"02",X"36",X"05",X"2D",X"35",X"20",X"04",X"DD",X"34",X"02",X"C9",X"DD",X"21",X"A0",X"43",X"CD", + X"63",X"1B",X"DD",X"21",X"80",X"43",X"CD",X"63",X"1B",X"CD",X"CF",X"1E",X"C3",X"25",X"1F",X"3A", + X"06",X"40",X"0F",X"30",X"1B",X"3A",X"0D",X"40",X"0F",X"38",X"33",X"3A",X"12",X"40",X"06",X"00", + X"CB",X"67",X"28",X"02",X"CB",X"C0",X"CB",X"77",X"28",X"02",X"CB",X"C8",X"78",X"0F",X"30",X"0E", + X"DD",X"7E",X"03",X"3D",X"FE",X"38",X"D8",X"DD",X"77",X"03",X"DD",X"35",X"23",X"C9",X"0F",X"D0", + X"DD",X"7E",X"03",X"3C",X"FE",X"D8",X"D0",X"DD",X"77",X"03",X"DD",X"34",X"23",X"C9",X"3A",X"12", + X"40",X"06",X"00",X"CB",X"47",X"28",X"02",X"CB",X"C8",X"3A",X"10",X"40",X"CB",X"47",X"28",X"02", + X"CB",X"C0",X"78",X"18",X"C8",X"3A",X"06",X"40",X"0F",X"30",X"1E",X"3A",X"0D",X"40",X"0F",X"38", + X"26",X"3A",X"10",X"40",X"07",X"07",X"07",X"30",X"0E",X"DD",X"7E",X"04",X"3C",X"FE",X"D0",X"D0", + X"DD",X"77",X"04",X"DD",X"34",X"24",X"C9",X"07",X"D0",X"DD",X"7E",X"04",X"3D",X"FE",X"80",X"D8", + X"DD",X"77",X"04",X"DD",X"35",X"24",X"C9",X"3A",X"11",X"40",X"18",X"D8",X"DD",X"21",X"A0",X"43", + X"CD",X"63",X"1B",X"DD",X"21",X"80",X"43",X"CD",X"63",X"1B",X"DD",X"34",X"03",X"DD",X"34",X"23", + X"DD",X"7E",X"03",X"FE",X"F0",X"D8",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD",X"36", + X"02",X"06",X"DD",X"36",X"20",X"00",X"DD",X"36",X"21",X"01",X"DD",X"36",X"22",X"06",X"C9",X"C9", + X"C9",X"C9",X"21",X"06",X"20",X"22",X"8C",X"43",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"0F",X"6F", + X"21",X"1E",X"20",X"22",X"AC",X"43",X"DD",X"36",X"2E",X"00",X"DD",X"34",X"02",X"3A",X"5F",X"42", + X"E6",X"03",X"CC",X"DC",X"1F",X"DD",X"21",X"A0",X"43",X"CD",X"63",X"1B",X"DD",X"21",X"80",X"43", + X"CD",X"63",X"1B",X"3A",X"15",X"41",X"A7",X"20",X"06",X"DD",X"34",X"04",X"DD",X"34",X"24",X"DD", + X"35",X"0F",X"C0",X"DD",X"36",X"01",X"00",X"DD",X"36",X"21",X"00",X"C9",X"3A",X"17",X"41",X"3C", + X"E6",X"07",X"32",X"17",X"41",X"C9",X"C9",X"C9",X"06",X"28",X"05",X"06",X"2A",X"05",X"06",X"2C", + X"05",X"06",X"2E",X"05",X"FF",X"E8",X"1F",X"00",X"27",X"05",X"00",X"29",X"05",X"00",X"2B",X"05", + X"00",X"2D",X"05",X"FF",X"F7",X"1F",X"04",X"3C",X"10",X"04",X"3D",X"10",X"04",X"3C",X"10",X"04", + X"3D",X"10",X"04",X"3C",X"10",X"04",X"3D",X"10",X"04",X"3E",X"10",X"FF",X"06",X"20",X"04",X"BC", + X"10",X"04",X"BD",X"10",X"04",X"BC",X"10",X"04",X"BD",X"10",X"04",X"BC",X"10",X"04",X"BD",X"10", + X"04",X"BE",X"10",X"FF",X"1E",X"20",X"DD",X"21",X"80",X"42",X"11",X"20",X"00",X"06",X"08",X"D9", + X"CD",X"49",X"20",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F", + X"D0",X"DD",X"7E",X"02",X"EF",X"69",X"20",X"B2",X"20",X"CA",X"20",X"CB",X"20",X"E5",X"20",X"E6", + X"20",X"E7",X"20",X"2A",X"21",X"47",X"21",X"48",X"21",X"2A",X"1B",X"41",X"DD",X"75",X"18",X"DD", + X"74",X"19",X"3A",X"16",X"41",X"E6",X"0F",X"C6",X"F8",X"DD",X"77",X"04",X"7D",X"E6",X"1F",X"07", + X"07",X"07",X"C6",X"08",X"DD",X"77",X"03",X"DD",X"7E",X"17",X"A7",X"28",X"15",X"3D",X"28",X"08", + X"3D",X"28",X"0A",X"21",X"5B",X"21",X"18",X"0D",X"21",X"4F",X"21",X"18",X"08",X"21",X"55",X"21", + X"18",X"03",X"21",X"49",X"21",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00",X"DD", + X"34",X"02",X"CD",X"63",X"1B",X"3A",X"15",X"41",X"A7",X"C0",X"DD",X"34",X"04",X"DD",X"7E",X"04", + X"C6",X"14",X"FE",X"08",X"D0",X"DD",X"36",X"02",X"03",X"C9",X"C9",X"DD",X"6E",X"18",X"DD",X"66", + X"19",X"3E",X"10",X"77",X"23",X"77",X"11",X"1F",X"00",X"19",X"77",X"23",X"77",X"AF",X"DD",X"77", + X"00",X"DD",X"77",X"01",X"C9",X"C9",X"C9",X"DD",X"7E",X"17",X"3D",X"28",X"05",X"3D",X"28",X"09", + X"18",X"23",X"21",X"76",X"21",X"3E",X"3F",X"18",X"21",X"DD",X"46",X"1A",X"3E",X"4F",X"05",X"28", + X"05",X"05",X"28",X"07",X"18",X"0A",X"21",X"8B",X"21",X"18",X"0F",X"21",X"91",X"21",X"18",X"0A", + X"21",X"85",X"21",X"18",X"05",X"21",X"67",X"21",X"3E",X"3F",X"DD",X"75",X"0C",X"DD",X"74",X"0D", + X"DD",X"36",X"0E",X"00",X"DD",X"77",X"0F",X"DD",X"34",X"02",X"CD",X"63",X"1B",X"DD",X"35",X"0F", + X"28",X"10",X"3A",X"15",X"41",X"A7",X"C0",X"DD",X"34",X"04",X"DD",X"7E",X"04",X"C6",X"14",X"FE", + X"08",X"D0",X"DD",X"36",X"02",X"03",X"C9",X"C9",X"C9",X"02",X"1C",X"10",X"FF",X"49",X"21",X"02", + X"10",X"10",X"FF",X"4F",X"21",X"02",X"33",X"10",X"FF",X"55",X"21",X"00",X"2F",X"06",X"00",X"26", + X"06",X"00",X"1F",X"06",X"FF",X"5B",X"21",X"02",X"38",X"10",X"02",X"39",X"10",X"02",X"3A",X"10", + X"02",X"3B",X"10",X"FF",X"67",X"21",X"02",X"38",X"10",X"02",X"39",X"10",X"02",X"3A",X"10",X"02", + X"3B",X"10",X"FF",X"76",X"21",X"02",X"11",X"50",X"FF",X"85",X"21",X"02",X"12",X"50",X"FF",X"8B", + X"21",X"02",X"13",X"50",X"FF",X"91",X"21",X"DD",X"21",X"C0",X"43",X"11",X"20",X"00",X"06",X"02", + X"D9",X"CD",X"AA",X"21",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01", + X"0F",X"D0",X"DD",X"7E",X"02",X"EF",X"CA",X"21",X"F3",X"21",X"07",X"22",X"08",X"22",X"09",X"22", + X"0A",X"22",X"0B",X"22",X"1F",X"22",X"35",X"22",X"36",X"22",X"3A",X"83",X"43",X"C6",X"04",X"DD", + X"77",X"03",X"3A",X"84",X"43",X"C6",X"08",X"DD",X"77",X"04",X"21",X"37",X"22",X"DD",X"75",X"0C", + X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00",X"21",X"5E",X"22",X"DD",X"75",X"13",X"DD",X"74",X"14", + X"DD",X"34",X"02",X"CD",X"63",X"1B",X"CD",X"F7",X"1C",X"DD",X"7E",X"03",X"FE",X"F0",X"D8",X"AF", + X"DD",X"77",X"00",X"DD",X"77",X"01",X"C9",X"C9",X"C9",X"C9",X"C9",X"21",X"4F",X"22",X"DD",X"75", + X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00",X"DD",X"36",X"0F",X"23",X"DD",X"34",X"02",X"CD", + X"63",X"1B",X"DD",X"35",X"0F",X"20",X"05",X"AF",X"DD",X"77",X"01",X"C9",X"3A",X"15",X"41",X"A7", + X"C0",X"DD",X"34",X"04",X"C9",X"C9",X"C9",X"06",X"21",X"04",X"06",X"22",X"04",X"06",X"21",X"04", + X"06",X"22",X"04",X"06",X"23",X"08",X"06",X"24",X"08",X"06",X"25",X"FE",X"FF",X"37",X"22",X"06", + X"38",X"09",X"06",X"39",X"09",X"06",X"3A",X"09",X"06",X"3B",X"09",X"FF",X"4F",X"22",X"00",X"00", + X"01",X"00",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF", + X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF", + X"01",X"FF",X"00",X"FF",X"00",X"FF",X"00",X"FF",X"01",X"FF",X"00",X"FF",X"00",X"FF",X"01",X"FF", + X"00",X"FF",X"01",X"FF",X"01",X"FF",X"00",X"FF",X"01",X"FF",X"01",X"FF",X"01",X"FF",X"01",X"00", + X"01",X"00",X"01",X"FF",X"01",X"FF",X"01",X"00",X"01",X"FF",X"01",X"00",X"01",X"FF",X"01",X"00", + X"01",X"00",X"01",X"FF",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"80",X"B4",X"22",X"3A", + X"1D",X"41",X"A7",X"28",X"03",X"FE",X"08",X"C0",X"DD",X"21",X"00",X"44",X"11",X"20",X"00",X"06", + X"04",X"D9",X"CD",X"DB",X"22",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6", + X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"EF",X"FB",X"22",X"14",X"23",X"40",X"23",X"40",X"23",X"40", + X"23",X"40",X"23",X"41",X"23",X"55",X"23",X"6B",X"23",X"6B",X"23",X"21",X"6C",X"23",X"DD",X"75", + X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00",X"21",X"84",X"23",X"DD",X"75",X"13",X"DD",X"74", + X"14",X"DD",X"34",X"02",X"CD",X"63",X"1B",X"CD",X"F7",X"1C",X"3A",X"17",X"41",X"DD",X"77",X"16", + X"3A",X"15",X"41",X"A7",X"20",X"03",X"DD",X"34",X"04",X"DD",X"7E",X"04",X"FE",X"F0",X"38",X"08", + X"AF",X"DD",X"77",X"00",X"DD",X"77",X"01",X"C9",X"DD",X"7E",X"03",X"FE",X"28",X"D0",X"18",X"F0", + X"C9",X"21",X"75",X"23",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00",X"DD",X"36", + X"0F",X"3F",X"DD",X"34",X"02",X"CD",X"63",X"1B",X"DD",X"35",X"0F",X"20",X"05",X"AF",X"DD",X"77", + X"01",X"C9",X"3A",X"15",X"41",X"A7",X"C0",X"DD",X"34",X"04",X"C9",X"C9",X"00",X"1D",X"10",X"00", + X"1E",X"10",X"FF",X"6C",X"23",X"06",X"38",X"05",X"06",X"39",X"05",X"06",X"3A",X"05",X"06",X"3B", + X"05",X"FF",X"75",X"23",X"FF",X"00",X"80",X"84",X"23",X"3A",X"1D",X"41",X"FE",X"02",X"C0",X"DD", + X"21",X"00",X"44",X"11",X"20",X"00",X"06",X"04",X"D9",X"CD",X"A2",X"23",X"D9",X"DD",X"19",X"10", + X"F7",X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"EF",X"C2",X"23", + X"DB",X"23",X"EF",X"23",X"EF",X"23",X"F0",X"23",X"F0",X"23",X"F1",X"23",X"05",X"24",X"1B",X"24", + X"1B",X"24",X"21",X"1C",X"24",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00",X"21", + X"31",X"24",X"DD",X"75",X"13",X"DD",X"74",X"14",X"DD",X"34",X"02",X"CD",X"63",X"1B",X"CD",X"F7", + X"1C",X"DD",X"7E",X"04",X"FE",X"F0",X"D8",X"AF",X"DD",X"77",X"00",X"DD",X"77",X"01",X"C9",X"C9", + X"C9",X"21",X"22",X"24",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00",X"DD",X"36", + X"0F",X"2B",X"DD",X"34",X"02",X"CD",X"63",X"1B",X"DD",X"35",X"0F",X"20",X"05",X"AF",X"DD",X"77", + X"01",X"C9",X"3A",X"15",X"41",X"A7",X"C0",X"DD",X"34",X"04",X"C9",X"C9",X"05",X"1A",X"10",X"FF", + X"1C",X"24",X"04",X"38",X"0B",X"04",X"39",X"0B",X"04",X"3A",X"0B",X"04",X"3B",X"0B",X"FF",X"22", + X"24",X"FF",X"00",X"FE",X"00",X"FE",X"00",X"FE",X"00",X"FE",X"00",X"FE",X"00",X"FE",X"00",X"FE", + X"00",X"FE",X"00",X"FE",X"02",X"FE",X"00",X"FE",X"02",X"FE",X"00",X"FE",X"02",X"FE",X"02",X"FE", + X"02",X"FE",X"02",X"00",X"02",X"00",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02", + X"02",X"02",X"02",X"02",X"00",X"02",X"02",X"02",X"00",X"02",X"02",X"02",X"00",X"02",X"02",X"02", + X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"02",X"02",X"00",X"02",X"00",X"02", + X"00",X"02",X"02",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"00",X"02",X"02",X"02",X"00",X"02", + X"02",X"02",X"00",X"02",X"00",X"02",X"02",X"02",X"02",X"02",X"02",X"00",X"02",X"00",X"02",X"00", + X"02",X"FE",X"02",X"FE",X"02",X"FE",X"02",X"FE",X"02",X"FE",X"00",X"FE",X"02",X"FE",X"00",X"FE", + X"02",X"FE",X"00",X"FE",X"02",X"FE",X"00",X"FE",X"02",X"FE",X"00",X"FE",X"00",X"FE",X"00",X"FE", + X"00",X"FE",X"00",X"FE",X"00",X"80",X"31",X"24",X"3A",X"1D",X"41",X"FE",X"01",X"C0",X"DD",X"21", + X"00",X"44",X"11",X"20",X"00",X"06",X"04",X"D9",X"CD",X"E1",X"24",X"D9",X"DD",X"19",X"10",X"F7", + X"C9",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"D0",X"DD",X"7E",X"02",X"EF",X"01",X"25",X"DB", + X"23",X"EF",X"23",X"EF",X"23",X"F0",X"23",X"F0",X"23",X"F1",X"23",X"05",X"24",X"1B",X"24",X"1B", + X"24",X"21",X"1D",X"25",X"DD",X"75",X"0C",X"DD",X"74",X"0D",X"DD",X"36",X"0E",X"00",X"21",X"32", + X"25",X"DD",X"75",X"13",X"DD",X"74",X"14",X"DD",X"34",X"02",X"C3",X"DB",X"23",X"00",X"35",X"05", + X"00",X"36",X"05",X"00",X"37",X"05",X"00",X"30",X"05",X"00",X"37",X"05",X"00",X"36",X"05",X"FF", + X"1D",X"25",X"00",X"04",X"80",X"32",X"25",X"CD",X"46",X"25",X"CD",X"5B",X"25",X"CD",X"8C",X"25", + X"CD",X"96",X"25",X"C3",X"E5",X"25",X"21",X"2A",X"40",X"06",X"19",X"3A",X"16",X"41",X"ED",X"44", + X"4F",X"3A",X"17",X"41",X"71",X"2C",X"77",X"2C",X"10",X"FA",X"C9",X"21",X"60",X"42",X"DD",X"21", + X"80",X"42",X"11",X"20",X"00",X"06",X"08",X"CD",X"6F",X"25",X"DD",X"19",X"10",X"F9",X"C9",X"DD", + X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"36",X"00",X"D0",X"36",X"01",X"2C",X"DD",X"7E",X"12",X"77", + X"2C",X"DD",X"7E",X"18",X"77",X"2C",X"DD",X"7E",X"19",X"77",X"2C",X"C9",X"DD",X"21",X"80",X"43", + X"FD",X"21",X"60",X"40",X"18",X"12",X"DD",X"21",X"00",X"44",X"FD",X"21",X"70",X"40",X"18",X"08", + X"DD",X"21",X"80",X"44",X"FD",X"21",X"70",X"40",X"01",X"08",X"04",X"DD",X"7E",X"00",X"DD",X"B6", + X"01",X"0F",X"30",X"27",X"DD",X"7E",X"16",X"FD",X"77",X"02",X"DD",X"7E",X"03",X"91",X"FD",X"77", + X"03",X"DD",X"7E",X"04",X"2F",X"91",X"FD",X"77",X"00",X"DD",X"7E",X"12",X"FD",X"77",X"01",X"11", + X"20",X"00",X"DD",X"19",X"1E",X"04",X"FD",X"19",X"10",X"D1",X"C9",X"FD",X"36",X"00",X"F8",X"FD", + X"36",X"03",X"F8",X"18",X"EA",X"DD",X"21",X"80",X"40",X"FD",X"21",X"00",X"45",X"06",X"07",X"CD", + X"FD",X"25",X"11",X"04",X"00",X"DD",X"19",X"1D",X"FD",X"19",X"10",X"F3",X"C9",X"FD",X"CB",X"00", + X"46",X"28",X"23",X"FD",X"7E",X"02",X"2F",X"DD",X"77",X"01",X"FD",X"7E",X"01",X"C6",X"05",X"DD", + X"77",X"03",X"3A",X"0F",X"40",X"0F",X"30",X"06",X"3A",X"0D",X"40",X"0F",X"38",X"11",X"DD",X"7E", + X"03",X"2F",X"DD",X"77",X"03",X"C9",X"DD",X"36",X"01",X"00",X"DD",X"36",X"03",X"00",X"C9",X"DD", + X"7E",X"03",X"D6",X"0D",X"DD",X"77",X"03",X"C9",X"CD",X"60",X"26",X"CD",X"C4",X"26",X"CD",X"E0", + X"26",X"CD",X"F6",X"26",X"CD",X"15",X"27",X"CD",X"97",X"29",X"CD",X"65",X"2A",X"CD",X"F7",X"29", + X"CD",X"8B",X"28",X"CD",X"F2",X"28",X"CD",X"2C",X"29",X"CD",X"68",X"27",X"CD",X"CC",X"27",X"C9", + X"3A",X"80",X"43",X"0F",X"D0",X"3A",X"1D",X"41",X"FE",X"02",X"C0",X"DD",X"21",X"00",X"44",X"11", + X"20",X"00",X"06",X"04",X"CD",X"7C",X"26",X"DD",X"19",X"10",X"F9",X"C9",X"DD",X"CB",X"00",X"46", + X"C8",X"21",X"83",X"43",X"7E",X"DD",X"96",X"03",X"C6",X"06",X"FE",X"0D",X"D0",X"2C",X"7E",X"C6", + X"04",X"DD",X"96",X"04",X"C6",X"0D",X"FE",X"19",X"D0",X"DD",X"CB",X"00",X"86",X"DD",X"CB",X"01", + X"C6",X"DD",X"36",X"02",X"06",X"2D",X"2D",X"36",X"06",X"2D",X"36",X"01",X"2D",X"36",X"00",X"21", + X"A0",X"43",X"36",X"00",X"2C",X"36",X"01",X"DD",X"36",X"17",X"00",X"3E",X"FF",X"32",X"15",X"41", + X"CD",X"EE",X"30",X"C9",X"3A",X"80",X"43",X"0F",X"D0",X"3A",X"1D",X"41",X"FE",X"01",X"C0",X"DD", + X"21",X"00",X"44",X"11",X"20",X"00",X"06",X"04",X"CD",X"7C",X"26",X"DD",X"19",X"10",X"F9",X"C9", + X"3A",X"80",X"43",X"0F",X"D0",X"DD",X"21",X"80",X"42",X"11",X"20",X"00",X"06",X"08",X"CD",X"7C", + X"26",X"DD",X"19",X"10",X"F9",X"C9",X"3A",X"80",X"43",X"0F",X"D0",X"3A",X"1D",X"41",X"A7",X"28", + X"03",X"FE",X"08",X"C0",X"DD",X"21",X"00",X"44",X"11",X"20",X"00",X"06",X"04",X"CD",X"7C",X"26", + X"DD",X"19",X"10",X"F9",X"C9",X"3A",X"80",X"43",X"0F",X"D0",X"3A",X"16",X"41",X"47",X"3A",X"84", + X"43",X"D6",X"04",X"90",X"E6",X"F8",X"0F",X"0F",X"C6",X"C0",X"6F",X"26",X"41",X"06",X"03",X"3A", + X"83",X"43",X"C6",X"03",X"5F",X"D6",X"06",X"57",X"7E",X"BB",X"38",X"10",X"2C",X"7E",X"BA",X"30", + X"0B",X"2C",X"28",X"03",X"10",X"F2",X"C9",X"2E",X"C0",X"10",X"ED",X"C9",X"21",X"80",X"43",X"36", + X"00",X"2C",X"36",X"01",X"2C",X"36",X"06",X"21",X"A0",X"43",X"36",X"00",X"2C",X"36",X"01",X"3E", + X"FF",X"32",X"15",X"41",X"CD",X"EE",X"30",X"C9",X"3A",X"1D",X"41",X"FE",X"02",X"C0",X"FD",X"21", + X"00",X"45",X"06",X"04",X"11",X"20",X"00",X"CD",X"83",X"27",X"FD",X"23",X"FD",X"23",X"FD",X"23", + X"10",X"F5",X"C9",X"FD",X"CB",X"00",X"46",X"C8",X"DD",X"21",X"00",X"44",X"0E",X"04",X"D9",X"CD", + X"99",X"27",X"D9",X"DD",X"19",X"0D",X"20",X"F6",X"C9",X"DD",X"CB",X"00",X"46",X"C8",X"FD",X"7E", + X"01",X"DD",X"96",X"03",X"C6",X"03",X"FE",X"07",X"D0",X"FD",X"7E",X"02",X"DD",X"96",X"04",X"C6", + X"04",X"FE",X"09",X"D0",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"06", + X"FD",X"36",X"00",X"00",X"11",X"08",X"03",X"FF",X"CD",X"E6",X"30",X"C9",X"FD",X"21",X"00",X"45", + X"06",X"04",X"11",X"20",X"00",X"CD",X"E1",X"27",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"10",X"F5", + X"C9",X"FD",X"CB",X"00",X"46",X"C8",X"DD",X"21",X"80",X"42",X"0E",X"08",X"D9",X"CD",X"F7",X"27", + X"D9",X"DD",X"19",X"0D",X"20",X"F6",X"C9",X"DD",X"CB",X"00",X"46",X"C8",X"FD",X"7E",X"01",X"DD", + X"96",X"03",X"C6",X"07",X"FE",X"0F",X"D0",X"FD",X"7E",X"02",X"DD",X"96",X"04",X"C6",X"04",X"FE", + X"09",X"D0",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"06",X"FD",X"36", + X"00",X"00",X"DD",X"7E",X"17",X"A7",X"28",X"08",X"3D",X"28",X"0D",X"3D",X"28",X"1D",X"18",X"4E", + X"11",X"01",X"03",X"FF",X"CD",X"F6",X"30",X"C9",X"21",X"05",X"41",X"7E",X"C6",X"30",X"30",X"02", + X"3E",X"FF",X"77",X"11",X"03",X"03",X"FF",X"CD",X"C9",X"30",X"C9",X"ED",X"5F",X"E6",X"03",X"A7", + X"28",X"08",X"3D",X"28",X"05",X"3D",X"28",X"0E",X"18",X"18",X"DD",X"36",X"1A",X"00",X"11",X"05", + X"03",X"FF",X"CD",X"D1",X"30",X"C9",X"DD",X"36",X"1A",X"01",X"11",X"06",X"03",X"FF",X"CD",X"D1", + X"30",X"C9",X"DD",X"36",X"1A",X"02",X"11",X"07",X"03",X"FF",X"CD",X"D1",X"30",X"C9",X"11",X"0D", + X"03",X"FF",X"CD",X"D1",X"30",X"3E",X"FF",X"32",X"12",X"41",X"C9",X"3A",X"1D",X"41",X"A7",X"28", + X"03",X"FE",X"08",X"C0",X"FD",X"21",X"00",X"45",X"06",X"04",X"11",X"20",X"00",X"CD",X"A9",X"28", + X"FD",X"23",X"FD",X"23",X"FD",X"23",X"10",X"F5",X"C9",X"FD",X"CB",X"00",X"46",X"C8",X"DD",X"21", + X"00",X"44",X"0E",X"04",X"D9",X"CD",X"BF",X"28",X"D9",X"DD",X"19",X"0D",X"20",X"F6",X"C9",X"DD", + X"CB",X"00",X"46",X"C8",X"FD",X"7E",X"01",X"DD",X"96",X"03",X"C6",X"05",X"FE",X"0B",X"D0",X"FD", + X"7E",X"02",X"DD",X"96",X"04",X"C6",X"03",X"FE",X"07",X"D0",X"DD",X"36",X"00",X"00",X"DD",X"36", + X"01",X"01",X"DD",X"36",X"02",X"06",X"FD",X"36",X"00",X"00",X"11",X"0A",X"03",X"FF",X"CD",X"F6", + X"30",X"C9",X"DD",X"21",X"00",X"45",X"11",X"03",X"00",X"06",X"04",X"D9",X"CD",X"05",X"29",X"D9", + X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"CB",X"00",X"46",X"C8",X"3A",X"16",X"41",X"47",X"DD",X"7E", + X"02",X"90",X"E6",X"F8",X"0F",X"0F",X"C6",X"C0",X"6F",X"26",X"41",X"7E",X"DD",X"BE",X"01",X"38", + X"06",X"2C",X"7E",X"DD",X"BE",X"01",X"D8",X"DD",X"36",X"00",X"00",X"C9",X"3A",X"1D",X"41",X"FE", + X"02",X"C0",X"FD",X"21",X"C0",X"43",X"06",X"02",X"11",X"20",X"00",X"CD",X"43",X"29",X"FD",X"19", + X"10",X"F9",X"C9",X"FD",X"CB",X"00",X"46",X"C8",X"DD",X"21",X"00",X"44",X"0E",X"04",X"D9",X"CD", + X"59",X"29",X"D9",X"DD",X"19",X"0D",X"20",X"F6",X"C9",X"DD",X"CB",X"00",X"46",X"C8",X"FD",X"7E", + X"03",X"DD",X"96",X"03",X"C6",X"05",X"FE",X"0B",X"D0",X"FD",X"7E",X"04",X"DD",X"96",X"04",X"C6", + X"06",X"FE",X"0D",X"D0",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"06", + X"FD",X"36",X"00",X"00",X"FD",X"36",X"01",X"01",X"FD",X"36",X"02",X"06",X"11",X"08",X"03",X"FF", + X"CD",X"D9",X"30",X"CD",X"E6",X"30",X"C9",X"FD",X"21",X"C0",X"43",X"06",X"02",X"11",X"20",X"00", + X"CD",X"A8",X"29",X"FD",X"19",X"10",X"F9",X"C9",X"FD",X"CB",X"00",X"46",X"C8",X"DD",X"21",X"80", + X"42",X"0E",X"08",X"D9",X"CD",X"BE",X"29",X"D9",X"DD",X"19",X"0D",X"20",X"F6",X"C9",X"DD",X"CB", + X"00",X"46",X"C8",X"FD",X"7E",X"03",X"DD",X"96",X"03",X"C6",X"07",X"FE",X"0E",X"D0",X"FD",X"7E", + X"04",X"DD",X"96",X"04",X"C6",X"07",X"FE",X"0E",X"D0",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01", + X"01",X"DD",X"36",X"02",X"06",X"FD",X"36",X"00",X"00",X"FD",X"36",X"01",X"01",X"FD",X"36",X"02", + X"06",X"CD",X"D9",X"30",X"C3",X"22",X"28",X"3A",X"1D",X"41",X"A7",X"28",X"03",X"FE",X"08",X"C0", + X"FD",X"21",X"C0",X"43",X"06",X"02",X"11",X"20",X"00",X"CD",X"11",X"2A",X"FD",X"19",X"10",X"F9", + X"C9",X"FD",X"CB",X"00",X"46",X"C8",X"DD",X"21",X"00",X"44",X"0E",X"04",X"D9",X"CD",X"27",X"2A", + X"D9",X"DD",X"19",X"0D",X"20",X"F6",X"C9",X"DD",X"CB",X"00",X"46",X"C8",X"FD",X"7E",X"03",X"DD", + X"96",X"03",X"C6",X"06",X"FE",X"0D",X"D0",X"FD",X"7E",X"04",X"DD",X"96",X"04",X"C6",X"04",X"FE", + X"09",X"D0",X"DD",X"36",X"00",X"00",X"DD",X"36",X"01",X"01",X"DD",X"36",X"02",X"06",X"FD",X"36", + X"00",X"00",X"FD",X"36",X"01",X"01",X"FD",X"36",X"02",X"06",X"11",X"0A",X"03",X"FF",X"CD",X"D9", + X"30",X"CD",X"F6",X"30",X"C9",X"DD",X"21",X"C0",X"43",X"06",X"02",X"11",X"20",X"00",X"D9",X"CD", + X"78",X"2A",X"D9",X"DD",X"19",X"10",X"F7",X"C9",X"DD",X"CB",X"00",X"46",X"C8",X"3A",X"16",X"41", + X"47",X"DD",X"7E",X"04",X"90",X"E6",X"F8",X"0F",X"0F",X"C6",X"C0",X"6F",X"26",X"41",X"7E",X"DD", + X"BE",X"03",X"38",X"06",X"2C",X"7E",X"DD",X"BE",X"03",X"D8",X"DD",X"36",X"00",X"00",X"DD",X"36", + X"01",X"01",X"DD",X"36",X"02",X"06",X"CD",X"D9",X"30",X"C9",X"3A",X"06",X"40",X"0F",X"38",X"19", + X"3A",X"80",X"43",X"0F",X"30",X"19",X"3A",X"5F",X"42",X"E6",X"67",X"CC",X"0A",X"2B",X"3A",X"5F", + X"42",X"E6",X"3F",X"CC",X"38",X"2C",X"C3",X"CF",X"2A",X"CD",X"13",X"2C",X"CD",X"E5",X"2A",X"CD", + X"2D",X"2B",X"CD",X"6A",X"2B",X"CD",X"D6",X"2B",X"CD",X"57",X"2C",X"CD",X"5C",X"2F",X"CD",X"2A", + X"2F",X"CD",X"8E",X"2F",X"C9",X"3A",X"80",X"43",X"0F",X"D0",X"3A",X"0D",X"40",X"0F",X"38",X"0E", + X"3A",X"10",X"40",X"CB",X"5F",X"C8",X"3A",X"13",X"40",X"CB",X"5F",X"C0",X"18",X"0C",X"3A",X"11", + X"40",X"CB",X"5F",X"C8",X"3A",X"14",X"40",X"CB",X"5F",X"C0",X"21",X"00",X"45",X"06",X"04",X"CB", + X"46",X"20",X"14",X"CB",X"C6",X"2C",X"3A",X"83",X"43",X"C6",X"02",X"77",X"2C",X"3A",X"84",X"43", + X"D6",X"07",X"77",X"CD",X"FE",X"30",X"C9",X"2C",X"2C",X"2C",X"10",X"E3",X"C9",X"3A",X"1D",X"41", + X"FE",X"02",X"C0",X"3A",X"5F",X"42",X"E6",X"3F",X"C0",X"DD",X"21",X"00",X"44",X"11",X"20",X"00", + X"06",X"04",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"30",X"05",X"DD",X"19",X"10",X"F3",X"C9", + X"DD",X"36",X"00",X"01",X"DD",X"36",X"01",X"00",X"DD",X"36",X"02",X"00",X"DD",X"36",X"03",X"88", + X"ED",X"5F",X"E6",X"0F",X"C6",X"09",X"DD",X"77",X"04",X"C9",X"3A",X"1D",X"41",X"A7",X"28",X"03", + X"FE",X"08",X"C0",X"3A",X"5F",X"42",X"E6",X"1F",X"C0",X"ED",X"5F",X"E6",X"01",X"C8",X"DD",X"21", + X"80",X"42",X"11",X"20",X"00",X"06",X"08",X"DD",X"CB",X"00",X"46",X"20",X"05",X"DD",X"19",X"10", + X"F6",X"C9",X"DD",X"7E",X"17",X"A7",X"20",X"F5",X"3A",X"A4",X"43",X"DD",X"96",X"04",X"FE",X"70", + X"30",X"EB",X"FD",X"21",X"00",X"44",X"06",X"04",X"FD",X"7E",X"00",X"FD",X"B6",X"01",X"0F",X"30", + X"05",X"FD",X"19",X"10",X"F3",X"C9",X"DD",X"36",X"02",X"03",X"DD",X"7E",X"03",X"FD",X"77",X"03", + X"DD",X"7E",X"04",X"FD",X"77",X"04",X"FD",X"36",X"00",X"01",X"FD",X"36",X"01",X"00",X"FD",X"36", + X"02",X"00",X"CD",X"08",X"31",X"C9",X"3A",X"1D",X"41",X"FE",X"01",X"C0",X"3A",X"5F",X"42",X"E6", + X"0F",X"C0",X"DD",X"21",X"00",X"44",X"11",X"20",X"00",X"06",X"04",X"DD",X"7E",X"00",X"DD",X"B6", + X"01",X"0F",X"30",X"05",X"DD",X"19",X"10",X"F3",X"C9",X"DD",X"36",X"00",X"01",X"DD",X"36",X"01", + X"00",X"DD",X"36",X"02",X"00",X"ED",X"5F",X"E6",X"7F",X"C6",X"30",X"DD",X"77",X"03",X"DD",X"36", + X"04",X"08",X"C9",X"3A",X"80",X"43",X"0F",X"D0",X"3A",X"0D",X"40",X"0F",X"38",X"0E",X"3A",X"10", + X"40",X"CB",X"4F",X"C8",X"3A",X"13",X"40",X"CB",X"4F",X"C0",X"18",X"0C",X"3A",X"11",X"40",X"CB", + X"57",X"C8",X"3A",X"14",X"40",X"CB",X"57",X"C0",X"21",X"C0",X"43",X"11",X"1F",X"00",X"06",X"02", + X"7E",X"2C",X"B6",X"0F",X"30",X"04",X"19",X"10",X"F7",X"C9",X"2D",X"36",X"01",X"2C",X"36",X"00", + X"2C",X"36",X"00",X"CD",X"03",X"31",X"C9",X"3A",X"1A",X"41",X"E6",X"02",X"C8",X"DD",X"21",X"80", + X"42",X"11",X"20",X"00",X"06",X"08",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F",X"30",X"05",X"DD", + X"19",X"10",X"F3",X"C9",X"DD",X"36",X"00",X"01",X"DD",X"36",X"01",X"00",X"DD",X"36",X"02",X"00", + X"DD",X"36",X"17",X"01",X"AF",X"32",X"1A",X"41",X"C9",X"C8",X"36",X"CB",X"2E",X"00",X"00",X"D3", + X"2C",X"DB",X"2E",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"01",X"DB",X"30",X"D3",X"33",X"00", + X"00",X"D0",X"35",X"CB",X"32",X"00",X"00",X"C3",X"33",X"B8",X"30",X"00",X"00",X"BB",X"2F",X"C3", + X"2D",X"00",X"00",X"CB",X"2E",X"D3",X"2C",X"00",X"00",X"DB",X"2E",X"E0",X"36",X"00",X"00",X"E0", + X"36",X"E0",X"36",X"00",X"01",X"E0",X"36",X"E0",X"36",X"00",X"02",X"E0",X"36",X"E0",X"36",X"00", + X"01",X"DB",X"30",X"D0",X"32",X"00",X"00",X"D3",X"2E",X"DB",X"2C",X"00",X"00",X"DB",X"30",X"D3", + X"32",X"00",X"00",X"C8",X"34",X"D3",X"2F",X"00",X"00",X"D8",X"36",X"D8",X"36",X"00",X"02",X"D3", + X"30",X"CB",X"33",X"00",X"00",X"C3",X"30",X"BB",X"33",X"00",X"00",X"B8",X"2F",X"B8",X"30",X"00", + X"00",X"B8",X"2E",X"C3",X"2D",X"00",X"00",X"CB",X"2C",X"D3",X"2F",X"00",X"00",X"D8",X"36",X"D8", + X"36",X"00",X"01",X"D8",X"36",X"DB",X"2E",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"04",X"E0", + X"36",X"E0",X"36",X"00",X"02",X"E0",X"36",X"DB",X"33",X"00",X"00",X"D3",X"30",X"C8",X"30",X"00", + X"00",X"C0",X"33",X"B8",X"34",X"00",X"00",X"C3",X"2F",X"CB",X"2D",X"00",X"00",X"D3",X"2C",X"DB", + X"2F",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"02",X"D8",X"32",X"D8",X"35",X"00",X"00",X"DB", + X"2C",X"E0",X"36",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"04",X"E0",X"36",X"E0",X"36",X"00", + X"04",X"E0",X"36",X"D8",X"34",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"02",X"E0",X"36",X"E0", + X"36",X"00",X"01",X"E0",X"36",X"E0",X"36",X"00",X"01",X"D8",X"32",X"D8",X"35",X"00",X"00",X"D0", + X"30",X"D0",X"2D",X"00",X"00",X"DB",X"2F",X"E0",X"36",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00", + X"04",X"E0",X"36",X"E0",X"36",X"00",X"04",X"E0",X"36",X"E0",X"36",X"00",X"01",X"E0",X"36",X"E0", + X"36",X"00",X"02",X"E0",X"36",X"E0",X"36",X"00",X"01",X"DB",X"30",X"D3",X"31",X"00",X"00",X"CB", + X"32",X"C3",X"33",X"00",X"00",X"BB",X"31",X"BB",X"2C",X"00",X"00",X"C3",X"2D",X"CB",X"2E",X"00", + X"00",X"D0",X"2C",X"D8",X"2E",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"02",X"E0",X"36",X"DB", + X"33",X"00",X"00",X"D0",X"33",X"CB",X"33",X"00",X"00",X"C8",X"36",X"CB",X"2E",X"00",X"00",X"D3", + X"2C",X"DB",X"2E",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"04",X"DB",X"30",X"D3",X"33",X"00", + X"00",X"D0",X"35",X"CB",X"32",X"00",X"00",X"C3",X"33",X"B8",X"30",X"00",X"00",X"BB",X"2F",X"C3", + X"2D",X"00",X"00",X"CB",X"2E",X"D3",X"2C",X"00",X"00",X"DB",X"2E",X"E0",X"36",X"00",X"00",X"E0", + X"36",X"E0",X"36",X"00",X"02",X"E0",X"36",X"E0",X"36",X"00",X"01",X"E0",X"36",X"E0",X"36",X"00", + X"01",X"DB",X"30",X"D0",X"32",X"00",X"00",X"D3",X"2E",X"DB",X"2C",X"00",X"00",X"DB",X"30",X"D3", + X"32",X"00",X"00",X"C8",X"34",X"D3",X"2F",X"00",X"00",X"D8",X"36",X"D8",X"36",X"00",X"02",X"D3", + X"30",X"CB",X"33",X"00",X"00",X"C3",X"30",X"BB",X"33",X"00",X"00",X"B8",X"2F",X"B8",X"30",X"00", + X"00",X"B8",X"2E",X"C3",X"2D",X"00",X"00",X"CB",X"2C",X"D3",X"2F",X"00",X"00",X"D8",X"36",X"D8", + X"36",X"00",X"00",X"D8",X"36",X"DB",X"2E",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"04",X"E0", + X"36",X"E0",X"36",X"00",X"02",X"E0",X"36",X"DB",X"33",X"00",X"00",X"D3",X"30",X"C8",X"30",X"00", + X"00",X"C8",X"36",X"CB",X"2E",X"00",X"00",X"D3",X"2C",X"DB",X"2E",X"00",X"00",X"E0",X"36",X"E0", + X"36",X"00",X"01",X"DB",X"30",X"D3",X"33",X"00",X"00",X"D0",X"35",X"CB",X"32",X"00",X"00",X"C3", + X"33",X"B8",X"30",X"00",X"00",X"BB",X"2F",X"C3",X"2D",X"00",X"00",X"CB",X"2E",X"D3",X"2C",X"00", + X"00",X"DB",X"2E",X"E0",X"36",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"01",X"E0",X"36",X"E0", + X"36",X"00",X"01",X"E0",X"36",X"E0",X"36",X"00",X"02",X"DB",X"30",X"D0",X"32",X"00",X"00",X"D3", + X"2E",X"DB",X"2C",X"00",X"00",X"DB",X"30",X"D3",X"32",X"00",X"00",X"C8",X"34",X"D3",X"2F",X"00", + X"00",X"D8",X"36",X"D8",X"36",X"00",X"02",X"D3",X"30",X"CB",X"33",X"00",X"00",X"C3",X"30",X"BB", + X"33",X"00",X"00",X"B8",X"2F",X"B8",X"30",X"00",X"00",X"B8",X"2E",X"C3",X"2D",X"00",X"00",X"CB", + X"2C",X"D3",X"2F",X"00",X"00",X"D8",X"36",X"D8",X"36",X"00",X"00",X"D8",X"36",X"DB",X"2E",X"00", + X"00",X"E0",X"36",X"E0",X"36",X"00",X"02",X"E0",X"36",X"E0",X"36",X"00",X"04",X"E0",X"36",X"DB", + X"33",X"00",X"00",X"D3",X"30",X"C8",X"30",X"00",X"00",X"FF",X"3A",X"1A",X"41",X"E6",X"01",X"C8", + X"DD",X"21",X"80",X"42",X"11",X"20",X"00",X"06",X"08",X"DD",X"7E",X"00",X"DD",X"B6",X"01",X"0F", + X"30",X"05",X"DD",X"19",X"10",X"F3",X"C9",X"DD",X"36",X"00",X"01",X"DD",X"36",X"01",X"00",X"DD", + X"36",X"02",X"00",X"DD",X"36",X"17",X"00",X"AF",X"32",X"1A",X"41",X"C9",X"3A",X"1A",X"41",X"E6", + X"04",X"C8",X"DD",X"21",X"80",X"42",X"11",X"20",X"00",X"06",X"08",X"DD",X"7E",X"00",X"DD",X"B6", + X"01",X"0F",X"30",X"05",X"DD",X"19",X"10",X"F3",X"C9",X"DD",X"36",X"00",X"01",X"DD",X"36",X"01", + X"00",X"DD",X"36",X"02",X"00",X"DD",X"36",X"17",X"02",X"AF",X"32",X"1A",X"41",X"C9",X"3A",X"1A", + X"41",X"E6",X"08",X"C8",X"DD",X"21",X"80",X"42",X"11",X"20",X"00",X"06",X"08",X"DD",X"7E",X"00", + X"DD",X"B6",X"01",X"0F",X"30",X"05",X"DD",X"19",X"10",X"F3",X"C9",X"DD",X"36",X"00",X"01",X"DD", + X"36",X"01",X"00",X"DD",X"36",X"02",X"00",X"DD",X"36",X"17",X"03",X"AF",X"32",X"1A",X"41",X"C9", + X"CD",X"C7",X"2F",X"CD",X"02",X"30",X"C9",X"2A",X"18",X"41",X"7E",X"FE",X"FF",X"C0",X"21",X"00", + X"44",X"11",X"01",X"44",X"01",X"80",X"00",X"36",X"00",X"ED",X"B0",X"21",X"1E",X"41",X"7E",X"FE", + X"05",X"28",X"01",X"34",X"7E",X"47",X"87",X"80",X"5F",X"16",X"00",X"21",X"B5",X"31",X"19",X"7E", + X"32",X"18",X"41",X"23",X"7E",X"32",X"19",X"41",X"23",X"7E",X"32",X"1D",X"41",X"11",X"02",X"07", + X"FF",X"C9",X"3A",X"5F",X"42",X"A7",X"C0",X"21",X"1B",X"40",X"34",X"7E",X"0F",X"D8",X"21",X"17", + X"41",X"7E",X"3C",X"E6",X"07",X"FE",X"01",X"28",X"03",X"77",X"18",X"02",X"3C",X"77",X"47",X"3A", + X"11",X"41",X"0F",X"38",X"13",X"78",X"21",X"40",X"30",X"16",X"00",X"87",X"5F",X"19",X"7E",X"32", + X"04",X"68",X"23",X"7E",X"32",X"03",X"68",X"C9",X"AF",X"32",X"04",X"68",X"32",X"03",X"68",X"C9", + X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"01",X"01",X"01",X"01",X"00",X"01",X"00", + X"11",X"41",X"42",X"1A",X"6F",X"26",X"42",X"7E",X"FE",X"FF",X"C8",X"47",X"3A",X"06",X"40",X"A7", + X"78",X"C4",X"AD",X"30",X"36",X"FF",X"7D",X"FE",X"5E",X"28",X"03",X"3C",X"12",X"C9",X"3E",X"43", + X"12",X"C9",X"C5",X"D5",X"E5",X"47",X"11",X"40",X"42",X"1A",X"6F",X"26",X"42",X"70",X"7D",X"FE", + X"5E",X"28",X"04",X"3C",X"12",X"18",X"03",X"3E",X"43",X"12",X"E1",X"D1",X"C1",X"C9",X"3A",X"42", + X"42",X"F6",X"10",X"32",X"42",X"42",X"32",X"01",X"82",X"AF",X"C3",X"AD",X"30",X"AF",X"CD",X"AD", + X"30",X"3A",X"42",X"42",X"E6",X"EF",X"32",X"42",X"42",X"32",X"01",X"82",X"C9",X"32",X"00",X"82", + X"3A",X"42",X"42",X"E6",X"F7",X"32",X"01",X"82",X"00",X"00",X"00",X"00",X"3A",X"42",X"42",X"F6", + X"08",X"32",X"01",X"82",X"C9",X"3E",X"08",X"18",X"E4",X"3E",X"01",X"CD",X"72",X"30",X"C3",X"31", + X"31",X"3E",X"01",X"CD",X"72",X"30",X"C3",X"31",X"31",X"3E",X"30",X"CD",X"72",X"30",X"3E",X"02", + X"CD",X"72",X"30",X"C3",X"31",X"31",X"3E",X"04",X"CD",X"72",X"30",X"C3",X"31",X"31",X"3E",X"05", + X"CD",X"72",X"30",X"C3",X"31",X"31",X"3E",X"03",X"CD",X"72",X"30",X"C3",X"31",X"31",X"3E",X"06", + X"C3",X"72",X"30",X"3E",X"20",X"C3",X"72",X"30",X"C9",X"3E",X"0A",X"C3",X"72",X"30",X"3E",X"09", + X"CD",X"72",X"30",X"3E",X"0A",X"C3",X"72",X"30",X"3E",X"0B",X"CD",X"72",X"30",X"3E",X"0C",X"CD", + X"72",X"30",X"3E",X"0D",X"C3",X"72",X"30",X"3E",X"0E",X"CD",X"72",X"30",X"3E",X"0F",X"C3",X"72", + X"30",X"3E",X"13",X"CD",X"72",X"30",X"3E",X"14",X"CD",X"72",X"30",X"3E",X"15",X"C3",X"72",X"30", + X"3A",X"42",X"42",X"F6",X"40",X"B0",X"32",X"42",X"42",X"32",X"01",X"82",X"C9",X"3A",X"42",X"42", + X"E6",X"BF",X"32",X"42",X"42",X"32",X"01",X"82",X"AF",X"32",X"1C",X"40",X"C9",X"3E",X"12",X"C3", + X"72",X"30",X"3E",X"21",X"C3",X"72",X"30",X"3E",X"07",X"C3",X"72",X"30",X"3E",X"22",X"CD",X"72", + X"30",X"3E",X"23",X"C3",X"72",X"30",X"3E",X"24",X"C3",X"72",X"30",X"3A",X"5F",X"42",X"E6",X"3F", + X"C0",X"3A",X"05",X"41",X"FE",X"50",X"DC",X"67",X"31",X"3A",X"1D",X"41",X"FE",X"00",X"CC",X"5D", + X"31",X"FE",X"01",X"CC",X"6C",X"31",X"FE",X"02",X"28",X"0D",X"FE",X"04",X"CC",X"76",X"31",X"FE", + X"08",X"CC",X"5D",X"31",X"C3",X"5D",X"31",X"3A",X"5F",X"42",X"E6",X"7F",X"CA",X"62",X"31",X"C9", + X"3E",X"08",X"C3",X"72",X"30",X"C7",X"31",X"00",X"0E",X"14",X"02",X"89",X"2C",X"01",X"ED",X"06", + X"08",X"B8",X"35",X"04",X"A9",X"39",X"10",X"C0",X"33",X"BC",X"31",X"00",X"00",X"B0",X"32",X"AB", + X"31",X"00",X"00",X"A0",X"33",X"9B",X"30",X"00",X"00",X"93",X"30",X"8B",X"33",X"00",X"00",X"83", + X"30",X"7B",X"31",X"00",X"00",X"70",X"32",X"68",X"32",X"00",X"00",X"60",X"34",X"6B",X"2D",X"00", + X"00",X"73",X"2D",X"7B",X"2E",X"00",X"00",X"80",X"36",X"80",X"36",X"00",X"01",X"83",X"2C",X"83", + X"30",X"00",X"00",X"80",X"36",X"80",X"36",X"00",X"01",X"80",X"36",X"80",X"36",X"00",X"00",X"80", + X"36",X"80",X"36",X"00",X"01",X"80",X"36",X"80",X"36",X"00",X"00",X"80",X"36",X"80",X"36",X"00", + X"01",X"80",X"36",X"80",X"36",X"00",X"01",X"80",X"36",X"80",X"36",X"00",X"01",X"80",X"35",X"80", + X"35",X"00",X"00",X"80",X"36",X"80",X"36",X"00",X"02",X"83",X"35",X"7B",X"30",X"00",X"00",X"73", + X"30",X"6B",X"31",X"00",X"00",X"60",X"32",X"60",X"2C",X"00",X"00",X"6B",X"2C",X"73",X"2C",X"00", + X"00",X"7B",X"2F",X"83",X"2F",X"00",X"00",X"8B",X"2E",X"93",X"2D",X"00",X"00",X"98",X"2E",X"A0", + X"2E",X"00",X"00",X"AB",X"2D",X"B0",X"2F",X"00",X"00",X"BB",X"2C",X"C3",X"2C",X"00",X"00",X"C8", + X"36",X"C8",X"2E",X"00",X"00",X"D3",X"2D",X"DB",X"2E",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00", + X"01",X"E0",X"36",X"E0",X"36",X"00",X"01",X"D8",X"32",X"D8",X"35",X"00",X"00",X"DB",X"2C",X"E0", + X"36",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"02",X"E0",X"36",X"E0",X"36",X"00",X"02",X"E0", + X"36",X"D8",X"34",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"01",X"E0",X"36",X"E0",X"36",X"00", + X"01",X"E0",X"36",X"E0",X"36",X"00",X"04",X"D8",X"32",X"D8",X"35",X"00",X"00",X"D0",X"30",X"D0", + X"2D",X"00",X"00",X"DB",X"2F",X"E0",X"36",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"00",X"E0", + X"36",X"E0",X"36",X"00",X"01",X"E0",X"36",X"E0",X"36",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00", + X"01",X"E0",X"36",X"E0",X"36",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"01",X"E0",X"36",X"E0", + X"36",X"00",X"04",X"E0",X"36",X"E0",X"36",X"00",X"02",X"D8",X"30",X"D3",X"30",X"00",X"00",X"D0", + X"2C",X"D8",X"2E",X"00",X"00",X"E0",X"36",X"E0",X"36",X"00",X"01",X"E0",X"36",X"DB",X"33",X"00", + X"00",X"D0",X"33",X"CB",X"33",X"00",X"00",X"C8",X"36",X"C8",X"36",X"00",X"01",X"C0",X"31",X"C0", + X"36",X"00",X"00",X"C0",X"36",X"C0",X"36",X"00",X"01",X"B9",X"34",X"C0",X"35",X"00",X"00",X"C0", + X"36",X"C0",X"36",X"00",X"01",X"B8",X"34",X"B8",X"33",X"00",X"00",X"B8",X"36",X"B8",X"36",X"00", + X"01",X"B8",X"36",X"B8",X"36",X"00",X"01",X"B0",X"33",X"A8",X"34",X"00",X"00",X"B0",X"36",X"B0", + X"36",X"00",X"04",X"B0",X"36",X"B0",X"36",X"00",X"02",X"A8",X"33",X"A0",X"32",X"00",X"00",X"A0", + X"36",X"A0",X"36",X"00",X"01",X"A0",X"36",X"A0",X"36",X"00",X"01",X"98",X"34",X"98",X"30",X"00", + X"00",X"98",X"2C",X"98",X"33",X"00",X"00",X"98",X"36",X"98",X"36",X"00",X"01",X"98",X"36",X"98", + X"36",X"00",X"01",X"90",X"34",X"90",X"33",X"00",X"00",X"90",X"36",X"90",X"36",X"00",X"01",X"90", + X"36",X"90",X"36",X"00",X"01",X"8B",X"32",X"83",X"31",X"00",X"00",X"7B",X"33",X"73",X"34",X"00", + X"00",X"7B",X"2D",X"83",X"2E",X"00",X"00",X"8B",X"2D",X"93",X"2F",X"00",X"00",X"9B",X"2C",X"A3", + X"2E",X"00",X"00",X"AB",X"2C",X"B3",X"2D",X"00",X"00",X"B8",X"36",X"B8",X"36",X"00",X"01",X"B8", + X"36",X"B8",X"36",X"00",X"01",X"B3",X"32",X"AB",X"33",X"00",X"00",X"A0",X"34",X"A0",X"34",X"00", + X"00",X"A8",X"36",X"A8",X"36",X"00",X"01",X"A3",X"32",X"9B",X"32",X"00",X"00",X"90",X"34",X"98", + X"35",X"00",X"00",X"98",X"36",X"98",X"36",X"00",X"01",X"93",X"30",X"8B",X"33",X"00",X"00",X"83", + X"32",X"7B",X"30",X"00",X"00",X"73",X"33",X"6B",X"31",X"00",X"00",X"60",X"34",X"6B",X"2E",X"00", + X"00",X"70",X"35",X"70",X"2E",X"00",X"00",X"78",X"36",X"78",X"36",X"00",X"01",X"7B",X"2D",X"83", + X"2D",X"00",X"00",X"88",X"36",X"88",X"36",X"00",X"02",X"8B",X"2F",X"93",X"2D",X"00",X"00",X"9B", + X"2E",X"A0",X"35",X"00",X"00",X"A0",X"36",X"A0",X"36",X"00",X"01",X"A3",X"2C",X"A3",X"30",X"00", + X"00",X"9B",X"33",X"90",X"33",X"00",X"00",X"90",X"36",X"90",X"36",X"00",X"01",X"90",X"36",X"90", + X"36",X"00",X"04",X"88",X"30",X"88",X"2C",X"00",X"00",X"90",X"36",X"90",X"36",X"00",X"01",X"88", + X"34",X"93",X"2E",X"00",X"00",X"9B",X"2D",X"A3",X"2F",X"00",X"00",X"AB",X"2C",X"B3",X"2E",X"00", + X"00",X"BB",X"2F",X"C3",X"2C",X"00",X"00",X"C8",X"36",X"CB",X"2E",X"00",X"00",X"D0",X"36",X"D0", + X"36",X"00",X"01",X"D0",X"35",X"C8",X"34",X"00",X"00",X"D0",X"36",X"D0",X"36",X"00",X"02",X"D0", + X"36",X"D0",X"36",X"00",X"02",X"CB",X"31",X"C3",X"33",X"00",X"00",X"C0",X"36",X"C0",X"36",X"00", + X"01",X"C0",X"36",X"BB",X"32",X"00",X"00",X"B0",X"30",X"B0",X"2E",X"00",X"00",X"B8",X"36",X"B3", + X"33",X"00",X"00",X"AB",X"32",X"AB",X"2C",X"00",X"00",X"B3",X"2C",X"BB",X"2C",X"00",X"00",X"C3", + X"2C",X"C8",X"36",X"00",X"00",X"C8",X"36",X"C8",X"36",X"00",X"01",X"C8",X"36",X"C8",X"35",X"00", + X"00",X"C8",X"36",X"C0",X"34",X"00",X"00",X"CB",X"2C",X"D3",X"2C",X"00",X"00",X"DB",X"2C",X"DB", + X"30",X"00",X"00",X"D8",X"36",X"D8",X"36",X"00",X"02",X"DB",X"2D",X"E0",X"36",X"00",X"00",X"E0", + X"36",X"E0",X"36",X"00",X"04",X"D8",X"34",X"D8",X"30",X"00",X"00",X"D8",X"36",X"D8",X"36",X"00", + X"01",X"D3",X"30",X"CB",X"32",X"00",X"00",X"C8",X"36",X"C8",X"36",X"00",X"01",X"C8",X"36",X"C8", + X"36",X"00",X"04",X"CB",X"2C",X"D0",X"35",X"00",X"00",X"CB",X"30",X"C8",X"36",X"00",X"00",X"C0", + X"33",X"BB",X"33",X"00",X"00",X"B3",X"31",X"AB",X"33",X"00",X"00",X"A0",X"34",X"A8",X"35",X"00", + X"00",X"A8",X"36",X"A8",X"36",X"00",X"01",X"A8",X"36",X"A8",X"36",X"00",X"01",X"A8",X"36",X"A8", + X"36",X"00",X"04",X"A8",X"36",X"A8",X"36",X"00",X"02",X"A8",X"35",X"A8",X"2C",X"00",X"00",X"B0", + X"36",X"B0",X"36",X"00",X"01",X"B0",X"36",X"B0",X"36",X"00",X"01",X"B0",X"36",X"B0",X"36",X"00", + X"01",X"B0",X"36",X"B0",X"36",X"00",X"00",X"A8",X"34",X"A8",X"31",X"00",X"00",X"A8",X"36",X"A8", + X"36",X"00",X"02",X"A8",X"36",X"A8",X"36",X"00",X"01",X"A8",X"36",X"A8",X"36",X"00",X"04",X"AB", + X"2F",X"B3",X"2E",X"00",X"00",X"BB",X"2D",X"C0",X"35",X"00",X"00",X"C0",X"36",X"C0",X"36",X"00", + X"02",X"BB",X"31",X"B3",X"32",X"00",X"00",X"AB",X"31",X"A0",X"34",X"00",X"00",X"A3",X"31",X"9B", + X"32",X"00",X"00",X"93",X"33",X"90",X"35",X"00",X"00",X"8B",X"32",X"80",X"34",X"00",X"00",X"8B", + X"2C",X"93",X"2E",X"00",X"00",X"9B",X"2F",X"A3",X"2C",X"00",X"00",X"AB",X"2D",X"B3",X"2E",X"00", + X"00",X"BB",X"2D",X"C3",X"2F",X"00",X"00",X"FF",X"60",X"D1",X"60",X"D1",X"47",X"D1",X"47",X"D1", + X"02",X"60",X"D1",X"60",X"D1",X"47",X"D1",X"47",X"D1",X"02",X"60",X"D1",X"60",X"D1",X"37",X"D1", + X"37",X"D1",X"00",X"60",X"D1",X"60",X"D1",X"37",X"D1",X"37",X"D1",X"00",X"60",X"D1",X"60",X"D1", + X"37",X"D1",X"37",X"D1",X"00",X"50",X"D1",X"50",X"D1",X"37",X"D1",X"37",X"D1",X"02",X"50",X"D1", + X"50",X"D1",X"37",X"D1",X"37",X"D1",X"00",X"60",X"D1",X"60",X"D1",X"37",X"D1",X"37",X"D1",X"00", + X"60",X"D1",X"60",X"D1",X"37",X"D1",X"37",X"D1",X"00",X"60",X"D1",X"60",X"D1",X"37",X"D1",X"37", + X"D1",X"00",X"60",X"D1",X"60",X"D1",X"47",X"D1",X"47",X"D1",X"00",X"60",X"D1",X"60",X"D1",X"47", + X"D1",X"47",X"D1",X"00",X"60",X"D1",X"60",X"D1",X"47",X"D1",X"47",X"D1",X"02",X"60",X"D1",X"60", + X"D1",X"47",X"D1",X"47",X"D1",X"02",X"60",X"D1",X"60",X"D1",X"47",X"D1",X"47",X"D1",X"02",X"60", + X"D1",X"60",X"D1",X"2F",X"D1",X"2F",X"D1",X"02",X"60",X"D1",X"60",X"D1",X"2F",X"D1",X"2F",X"D1", + X"00",X"60",X"D1",X"60",X"D1",X"2F",X"D1",X"2F",X"D1",X"00",X"40",X"D1",X"40",X"D1",X"2F",X"D1", + X"2F",X"D1",X"00",X"40",X"D1",X"40",X"D1",X"2F",X"D1",X"2F",X"D1",X"00",X"40",X"D1",X"40",X"D1", + X"2F",X"D1",X"2F",X"D1",X"00",X"40",X"D1",X"40",X"D1",X"2F",X"D1",X"2F",X"D1",X"00",X"40",X"D1", + X"40",X"D1",X"2F",X"D1",X"2F",X"D1",X"00",X"A0",X"D1",X"A0",X"D1",X"2F",X"D1",X"2F",X"D1",X"00", + X"A0",X"D1",X"A0",X"D1",X"2F",X"D1",X"2F",X"D1",X"00",X"A0",X"D1",X"A0",X"D1",X"2F",X"D1",X"2F", + X"D1",X"00",X"A0",X"D1",X"A0",X"D1",X"2F",X"D1",X"2F",X"D1",X"00",X"A0",X"D1",X"A0",X"D1",X"2F", + X"D1",X"2F",X"D1",X"02",X"A0",X"D1",X"A0",X"D1",X"2F",X"D1",X"2F",X"D1",X"02",X"A0",X"D1",X"A0", + X"D1",X"37",X"D1",X"37",X"D1",X"02",X"A0",X"D1",X"A0",X"D1",X"8F",X"D1",X"8F",X"D1",X"02",X"A0", + X"D1",X"A0",X"D1",X"8F",X"D1",X"8F",X"D1",X"02",X"A0",X"D1",X"A0",X"D1",X"8F",X"D1",X"8F",X"D1", + X"02",X"A0",X"D1",X"A0",X"D1",X"8F",X"D1",X"8F",X"D1",X"00",X"A0",X"D1",X"A0",X"D1",X"8F",X"D1", + X"8F",X"D1",X"00",X"A0",X"D1",X"A0",X"D1",X"8F",X"D1",X"8F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1", + X"8F",X"D1",X"8F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"8F",X"D1",X"8F",X"D1",X"00",X"D8",X"D1", + X"D8",X"D1",X"8F",X"D1",X"8F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"00", + X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"02",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7", + X"D1",X"02",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"02",X"D8",X"D1",X"D8",X"D1",X"C7", + X"D1",X"C7",X"D1",X"02",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"00",X"D8",X"D1",X"D8", + X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"D8", + X"D1",X"D8",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"3F",X"D1",X"3F",X"D1", + X"00",X"D8",X"D1",X"D8",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"3F",X"D1", + X"3F",X"D1",X"00",X"50",X"D1",X"50",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"50",X"D1",X"50",X"D1", + X"3F",X"D1",X"3F",X"D1",X"00",X"50",X"D1",X"50",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"50",X"D1", + X"50",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"50",X"D1",X"50",X"D1",X"3F",X"D1",X"3F",X"D1",X"00", + X"D8",X"D1",X"D8",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"3F",X"D1",X"3F", + X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"3F", + X"D1",X"3F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"D8",X"D1",X"D8", + X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"D8", + X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1", + X"00",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1", + X"C7",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"00",X"D8",X"D1",X"D8",X"D1", + X"C7",X"D1",X"C7",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"00",X"D8",X"D1", + X"D8",X"D1",X"4F",X"D1",X"4F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"4F",X"D1",X"4F",X"D1",X"00", + X"D8",X"D1",X"D8",X"D1",X"4F",X"D1",X"4F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"4F",X"D1",X"4F", + X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"4F",X"D1",X"4F",X"D1",X"00",X"60",X"D1",X"60",X"D1",X"4F", + X"D1",X"4F",X"D1",X"00",X"60",X"D1",X"60",X"D1",X"4F",X"D1",X"4F",X"D1",X"00",X"60",X"D1",X"60", + X"D1",X"4F",X"D1",X"4F",X"D1",X"00",X"60",X"D1",X"60",X"D1",X"37",X"D1",X"37",X"D1",X"00",X"60", + X"D1",X"60",X"D1",X"37",X"D1",X"37",X"D1",X"00",X"48",X"D1",X"48",X"D1",X"37",X"D1",X"37",X"D1", + X"00",X"48",X"D1",X"48",X"D1",X"37",X"D1",X"37",X"D1",X"00",X"48",X"D1",X"48",X"D1",X"37",X"D1", + X"37",X"D1",X"00",X"58",X"D1",X"58",X"D1",X"37",X"D1",X"37",X"D1",X"00",X"58",X"D1",X"58",X"D1", + X"37",X"D1",X"37",X"D1",X"00",X"58",X"D1",X"58",X"D1",X"47",X"D1",X"47",X"D1",X"00",X"58",X"D1", + X"58",X"D1",X"47",X"D1",X"47",X"D1",X"00",X"58",X"D1",X"58",X"D1",X"47",X"D1",X"47",X"D1",X"00", + X"58",X"D1",X"58",X"D1",X"47",X"D1",X"47",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"47",X"D1",X"47", + X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"47",X"D1",X"47",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"47", + X"D1",X"47",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"47",X"D1",X"47",X"D1",X"00",X"D8",X"D1",X"D8", + X"D1",X"47",X"D1",X"47",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"00",X"D8", + X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1", + X"00",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1", + X"C7",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"02",X"D8",X"D1",X"D8",X"D1", + X"C7",X"D1",X"C7",X"D1",X"02",X"D8",X"D1",X"D8",X"D1",X"C7",X"D1",X"C7",X"D1",X"02",X"D8",X"D1", + X"D8",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"3F",X"D1",X"3F",X"D1",X"00", + X"D8",X"D1",X"D8",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"3F",X"D1",X"3F", + X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"D8",X"D1",X"D8",X"D1",X"3F", + X"D1",X"3F",X"D1",X"00",X"50",X"D1",X"50",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"60",X"D1",X"60", + X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"60",X"D1",X"60",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"60", + X"D1",X"60",X"D1",X"3F",X"D1",X"3F",X"D1",X"00",X"FF",X"C8",X"D1",X"C8",X"D1",X"00",X"00",X"C8", + X"D1",X"C8",X"D1",X"00",X"00",X"90",X"D1",X"90",X"D1",X"00",X"00",X"50",X"D1",X"50",X"D1",X"00", + X"00",X"90",X"D1",X"90",X"D1",X"00",X"00",X"C8",X"D1",X"C8",X"D1",X"00",X"00",X"C8",X"D1",X"C8", + X"D1",X"00",X"00",X"98",X"D1",X"98",X"D1",X"00",X"00",X"98",X"D1",X"98",X"D1",X"00",X"00",X"98", + X"D1",X"98",X"D1",X"00",X"00",X"C8",X"D1",X"C8",X"D1",X"00",X"00",X"48",X"D1",X"48",X"D1",X"00", + X"00",X"48",X"D1",X"48",X"D1",X"00",X"00",X"48",X"D1",X"48",X"D1",X"00",X"00",X"C8",X"D1",X"C8", + X"D1",X"00",X"00",X"98",X"D1",X"98",X"D1",X"00",X"00",X"98",X"D1",X"98",X"D1",X"00",X"00",X"98", + X"D1",X"98",X"D1",X"00",X"00",X"C8",X"D1",X"C8",X"D1",X"00",X"00",X"C8",X"D1",X"C8",X"D1",X"00", + X"00",X"C8",X"D1",X"C8",X"D1",X"00",X"08",X"C8",X"D1",X"C8",X"D1",X"00",X"00",X"C8",X"D1",X"C8", + X"D1",X"00",X"00",X"C8",X"D1",X"C8",X"D1",X"00",X"00",X"70",X"D1",X"70",X"D1",X"00",X"00",X"70", + X"D1",X"70",X"D1",X"00",X"00",X"C8",X"D1",X"C8",X"D1",X"00",X"00",X"C8",X"D1",X"C8",X"D1",X"00", + X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_SND_0.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_SND_0.vhd new file mode 100644 index 00000000..98fd886c --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_SND_0.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_SND_0 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_SND_0 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"C3",X"72",X"02",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"08",X"D9",X"3E",X"0E",X"D3",X"40",X"DB",X"80", + X"B7",X"28",X"13",X"FE",X"30",X"FA",X"64",X"00",X"FE",X"40",X"F2",X"6B",X"00",X"D6",X"10",X"CD", + X"6F",X"00",X"D9",X"08",X"FB",X"C9",X"06",X"0C",X"21",X"00",X"80",X"77",X"23",X"05",X"20",X"FB", + X"D9",X"08",X"FB",X"C9",X"CD",X"E7",X"00",X"D9",X"08",X"FB",X"C9",X"D9",X"08",X"FB",X"C9",X"CD", + X"A6",X"00",X"B7",X"C8",X"FE",X"01",X"28",X"15",X"FE",X"02",X"28",X"16",X"FE",X"03",X"28",X"17", + X"FE",X"04",X"28",X"18",X"FE",X"05",X"28",X"19",X"AF",X"32",X"0A",X"80",X"C9",X"AF",X"32",X"00", + X"80",X"C9",X"AF",X"32",X"02",X"80",X"C9",X"AF",X"32",X"04",X"80",X"C9",X"AF",X"32",X"06",X"80", + X"C9",X"AF",X"32",X"08",X"80",X"C9",X"06",X"00",X"21",X"00",X"80",X"BE",X"28",X"1B",X"23",X"23", + X"BE",X"28",X"1B",X"23",X"23",X"BE",X"28",X"1B",X"23",X"23",X"BE",X"28",X"1B",X"23",X"23",X"BE", + X"28",X"1B",X"23",X"23",X"BE",X"28",X"1B",X"AF",X"C9",X"23",X"70",X"3E",X"01",X"C9",X"23",X"70", + X"3E",X"02",X"C9",X"23",X"70",X"3E",X"03",X"C9",X"23",X"70",X"3E",X"04",X"C9",X"23",X"70",X"3E", + X"05",X"C9",X"23",X"70",X"3E",X"06",X"C9",X"32",X"1A",X"80",X"CD",X"A6",X"00",X"B7",X"C0",X"AF", + X"CD",X"A6",X"00",X"B7",X"20",X"73",X"3A",X"00",X"80",X"CD",X"F1",X"01",X"32",X"12",X"80",X"3A", + X"02",X"80",X"CD",X"F1",X"01",X"32",X"13",X"80",X"3A",X"04",X"80",X"CD",X"F1",X"01",X"32",X"14", + X"80",X"3A",X"1A",X"80",X"CD",X"F1",X"01",X"32",X"15",X"80",X"CD",X"FA",X"01",X"32",X"17",X"80", + X"3A",X"06",X"80",X"CD",X"F1",X"01",X"32",X"12",X"80",X"3A",X"08",X"80",X"CD",X"F1",X"01",X"32", + X"13",X"80",X"3A",X"0A",X"80",X"CD",X"F1",X"01",X"32",X"14",X"80",X"CD",X"FA",X"01",X"32",X"18", + X"80",X"B7",X"28",X"63",X"3A",X"17",X"80",X"B7",X"28",X"79",X"3A",X"18",X"80",X"21",X"06",X"80", + X"CD",X"E3",X"01",X"CD",X"F1",X"01",X"47",X"3A",X"17",X"80",X"21",X"00",X"80",X"CD",X"E3",X"01", + X"CD",X"F1",X"01",X"B8",X"F2",X"C3",X"01",X"18",X"3E",X"FE",X"01",X"28",X"17",X"FE",X"02",X"28", + X"1A",X"FE",X"03",X"28",X"1D",X"FE",X"04",X"28",X"20",X"FE",X"05",X"28",X"23",X"3A",X"1A",X"80", + X"32",X"0A",X"80",X"C9",X"3A",X"1A",X"80",X"32",X"00",X"80",X"C9",X"3A",X"1A",X"80",X"32",X"02", + X"80",X"C9",X"3A",X"1A",X"80",X"32",X"04",X"80",X"C9",X"3A",X"1A",X"80",X"32",X"06",X"80",X"C9", + X"3A",X"1A",X"80",X"32",X"08",X"80",X"C9",X"3A",X"17",X"80",X"B7",X"C8",X"FE",X"01",X"28",X"09", + X"FE",X"02",X"28",X"0A",X"21",X"04",X"80",X"18",X"18",X"21",X"00",X"80",X"18",X"13",X"21",X"02", + X"80",X"18",X"0E",X"3A",X"18",X"80",X"FE",X"01",X"28",X"0F",X"FE",X"02",X"28",X"10",X"21",X"0A", + X"80",X"3A",X"1A",X"80",X"77",X"23",X"36",X"00",X"C9",X"21",X"06",X"80",X"18",X"F3",X"21",X"08", + X"80",X"18",X"EE",X"FE",X"01",X"28",X"08",X"23",X"23",X"FE",X"02",X"28",X"02",X"23",X"23",X"7E", + X"C9",X"21",X"42",X"02",X"5F",X"16",X"00",X"19",X"7E",X"C9",X"3A",X"12",X"80",X"21",X"13",X"80", + X"BE",X"FA",X"15",X"02",X"3A",X"14",X"80",X"BE",X"FA",X"34",X"02",X"3A",X"15",X"80",X"BE",X"FA", + X"40",X"02",X"3E",X"02",X"C9",X"21",X"14",X"80",X"BE",X"FA",X"26",X"02",X"3A",X"15",X"80",X"BE", + X"FA",X"32",X"02",X"3E",X"03",X"C9",X"21",X"15",X"80",X"BE",X"FA",X"2F",X"02",X"AF",X"C9",X"3E", + X"01",X"C9",X"AF",X"C9",X"21",X"15",X"80",X"BE",X"FA",X"3D",X"02",X"AF",X"C9",X"3E",X"03",X"C9", + X"AF",X"C9",X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"0A",X"0B",X"0C",X"0D", + X"0E",X"0F",X"10",X"11",X"12",X"13",X"14",X"15",X"16",X"17",X"18",X"19",X"1A",X"1B",X"1C",X"1D", + X"1E",X"1F",X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"28",X"29",X"2A",X"2B",X"2C",X"2D", + X"2E",X"2F",X"06",X"00",X"21",X"00",X"80",X"70",X"23",X"7C",X"FE",X"84",X"20",X"F9",X"31",X"00", + X"84",X"ED",X"56",X"21",X"00",X"90",X"22",X"0C",X"80",X"77",X"3E",X"07",X"D3",X"40",X"3E",X"3F", + X"32",X"0E",X"80",X"D3",X"80",X"3E",X"07",X"D3",X"10",X"3E",X"3F",X"32",X"0F",X"80",X"D3",X"20", + X"CD",X"2D",X"04",X"CD",X"35",X"04",X"CD",X"3D",X"04",X"CD",X"45",X"04",X"CD",X"4D",X"04",X"CD", + X"55",X"04",X"FB",X"3E",X"0F",X"D3",X"40",X"DB",X"80",X"E6",X"80",X"20",X"F6",X"3E",X"0F",X"D3", + X"40",X"DB",X"80",X"E6",X"80",X"28",X"F6",X"F3",X"3E",X"01",X"32",X"10",X"80",X"3A",X"01",X"80", + X"B7",X"CA",X"4B",X"03",X"3A",X"00",X"80",X"CD",X"04",X"08",X"FB",X"00",X"00",X"F3",X"3E",X"02", + X"32",X"10",X"80",X"3A",X"03",X"80",X"B7",X"CA",X"54",X"03",X"3A",X"02",X"80",X"CD",X"04",X"08", + X"FB",X"00",X"00",X"F3",X"3E",X"03",X"32",X"10",X"80",X"3A",X"05",X"80",X"B7",X"CA",X"5D",X"03", + X"3A",X"04",X"80",X"CD",X"04",X"08",X"FB",X"00",X"00",X"F3",X"3E",X"04",X"32",X"10",X"80",X"3A", + X"07",X"80",X"B7",X"CA",X"66",X"03",X"3A",X"06",X"80",X"CD",X"04",X"08",X"FB",X"00",X"00",X"F3", + X"3E",X"05",X"32",X"10",X"80",X"3A",X"09",X"80",X"B7",X"CA",X"6F",X"03",X"3A",X"08",X"80",X"CD", + X"04",X"08",X"FB",X"00",X"00",X"F3",X"3E",X"06",X"32",X"10",X"80",X"3A",X"0B",X"80",X"B7",X"CA", + X"78",X"03",X"3A",X"0A",X"80",X"CD",X"04",X"08",X"C3",X"B2",X"02",X"3A",X"00",X"80",X"CD",X"81", + X"03",X"C3",X"DA",X"02",X"3A",X"02",X"80",X"CD",X"81",X"03",X"C3",X"F0",X"02",X"3A",X"04",X"80", + X"CD",X"81",X"03",X"C3",X"06",X"03",X"3A",X"06",X"80",X"CD",X"81",X"03",X"C3",X"1C",X"03",X"3A", + X"08",X"80",X"CD",X"81",X"03",X"C3",X"32",X"03",X"3A",X"0A",X"80",X"CD",X"81",X"03",X"C3",X"B2", + X"02",X"21",X"92",X"03",X"E5",X"87",X"5F",X"16",X"00",X"21",X"CD",X"03",X"19",X"5E",X"23",X"56", + X"EB",X"E9",X"3A",X"10",X"80",X"FE",X"01",X"28",X"16",X"FE",X"02",X"28",X"18",X"FE",X"03",X"28", + X"1A",X"FE",X"04",X"28",X"1C",X"FE",X"05",X"28",X"1E",X"3E",X"01",X"32",X"0B",X"80",X"C9",X"3E", + X"01",X"32",X"01",X"80",X"C9",X"3E",X"01",X"32",X"03",X"80",X"C9",X"3E",X"01",X"32",X"05",X"80", + X"C9",X"3E",X"01",X"32",X"07",X"80",X"C9",X"3E",X"01",X"32",X"09",X"80",X"C9",X"5D",X"04",X"C0", + X"08",X"3C",X"09",X"B8",X"09",X"34",X"0A",X"B0",X"0A",X"F9",X"0C",X"1D",X"12",X"A9",X"13",X"B9", + X"0D",X"C7",X"0D",X"2E",X"10",X"3C",X"10",X"43",X"10",X"B2",X"10",X"C0",X"10",X"00",X"00",X"00", + X"00",X"00",X"11",X"3C",X"0B",X"E3",X"0B",X"6D",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7A",X"0D",X"80", + X"11",X"19",X"12",X"B6",X"12",X"34",X"13",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3E",X"08",X"D3", + X"40",X"AF",X"D3",X"80",X"C9",X"3E",X"09",X"D3",X"40",X"AF",X"D3",X"80",X"C9",X"3E",X"0A",X"D3", + X"40",X"AF",X"D3",X"80",X"C9",X"3E",X"08",X"D3",X"10",X"AF",X"D3",X"20",X"C9",X"3E",X"09",X"D3", + X"10",X"AF",X"D3",X"20",X"C9",X"3E",X"0A",X"D3",X"10",X"AF",X"D3",X"20",X"C9",X"3A",X"10",X"80", + X"FE",X"01",X"28",X"19",X"FE",X"02",X"28",X"1E",X"FE",X"03",X"28",X"23",X"FE",X"04",X"28",X"28", + X"FE",X"05",X"28",X"2D",X"06",X"24",X"CD",X"B8",X"04",X"CD",X"55",X"04",X"C9",X"06",X"09",X"CD", + X"AA",X"04",X"CD",X"2D",X"04",X"C9",X"06",X"12",X"CD",X"AA",X"04",X"CD",X"35",X"04",X"C9",X"06", + X"24",X"CD",X"AA",X"04",X"CD",X"3D",X"04",X"C9",X"06",X"09",X"CD",X"B8",X"04",X"CD",X"45",X"04", + X"C9",X"06",X"12",X"CD",X"B8",X"04",X"CD",X"4D",X"04",X"C9",X"3E",X"07",X"D3",X"40",X"3A",X"0E", + X"80",X"B0",X"32",X"0E",X"80",X"D3",X"80",X"C9",X"3E",X"07",X"D3",X"10",X"3A",X"0F",X"80",X"B0", + X"32",X"0F",X"80",X"D3",X"20",X"C9",X"3A",X"10",X"80",X"FE",X"01",X"28",X"20",X"FE",X"02",X"28", + X"2C",X"FE",X"03",X"28",X"2C",X"FE",X"04",X"28",X"2C",X"FE",X"05",X"28",X"2C",X"06",X"04",X"78", + X"D3",X"10",X"7D",X"D3",X"20",X"04",X"78",X"D3",X"10",X"7C",X"D3",X"20",X"C9",X"06",X"00",X"78", + X"D3",X"40",X"7D",X"D3",X"80",X"04",X"78",X"D3",X"40",X"7C",X"D3",X"80",X"C9",X"06",X"02",X"18", + X"EE",X"06",X"04",X"18",X"EA",X"06",X"00",X"18",X"D6",X"06",X"02",X"18",X"D2",X"3A",X"10",X"80", + X"FE",X"01",X"28",X"18",X"FE",X"02",X"28",X"1C",X"FE",X"03",X"28",X"1E",X"FE",X"04",X"28",X"20", + X"FE",X"05",X"28",X"22",X"16",X"FB",X"1E",X"20",X"CD",X"71",X"05",X"C9",X"16",X"FE",X"1E",X"08", + X"CD",X"62",X"05",X"C9",X"16",X"FD",X"1E",X"10",X"18",X"F6",X"16",X"FB",X"1E",X"20",X"18",X"F0", + X"16",X"FE",X"1E",X"08",X"18",X"E2",X"16",X"FD",X"1E",X"10",X"18",X"DC",X"3A",X"10",X"80",X"FE", + X"04",X"FA",X"5B",X"05",X"7A",X"D3",X"10",X"7B",X"D3",X"20",X"C9",X"7A",X"D3",X"40",X"7B",X"D3", + X"80",X"C9",X"3E",X"07",X"D3",X"40",X"3A",X"0E",X"80",X"A2",X"B3",X"32",X"0E",X"80",X"D3",X"80", + X"C9",X"3E",X"07",X"D3",X"10",X"3A",X"0F",X"80",X"A2",X"B3",X"32",X"0F",X"80",X"D3",X"20",X"C9", + X"3A",X"10",X"80",X"FE",X"01",X"28",X"18",X"FE",X"02",X"28",X"1C",X"FE",X"03",X"28",X"1E",X"FE", + X"04",X"28",X"20",X"FE",X"05",X"28",X"22",X"16",X"DF",X"1E",X"04",X"CD",X"71",X"05",X"C9",X"16", + X"F7",X"1E",X"01",X"CD",X"62",X"05",X"C9",X"16",X"EF",X"1E",X"02",X"18",X"F6",X"16",X"DF",X"1E", + X"04",X"18",X"F0",X"16",X"F7",X"1E",X"01",X"18",X"E2",X"16",X"EF",X"1E",X"02",X"18",X"DC",X"3A", + X"10",X"80",X"FE",X"01",X"28",X"18",X"FE",X"02",X"28",X"1C",X"FE",X"03",X"28",X"1E",X"FE",X"04", + X"28",X"20",X"FE",X"05",X"28",X"22",X"16",X"DB",X"1E",X"00",X"CD",X"71",X"05",X"C9",X"16",X"F6", + X"1E",X"00",X"CD",X"62",X"05",X"C9",X"16",X"ED",X"1E",X"00",X"18",X"F6",X"16",X"DB",X"1E",X"00", + X"18",X"F0",X"16",X"F6",X"1E",X"00",X"18",X"E2",X"16",X"ED",X"1E",X"00",X"18",X"DC",X"3A",X"10", + X"80",X"FE",X"01",X"28",X"18",X"FE",X"02",X"28",X"1C",X"FE",X"03",X"28",X"1C",X"FE",X"04",X"28", + X"1C",X"FE",X"05",X"28",X"1C",X"3E",X"0A",X"D3",X"10",X"78",X"D3",X"20",X"C9",X"3E",X"08",X"D3", + X"40",X"78",X"D3",X"80",X"C9",X"3E",X"09",X"18",X"F6",X"3E",X"0A",X"18",X"F2",X"3E",X"08",X"18", + X"E6",X"3E",X"09",X"18",X"E2",X"3A",X"10",X"80",X"FE",X"04",X"FA",X"44",X"06",X"7A",X"D3",X"10", + X"DB",X"20",X"5F",X"C9",X"7A",X"D3",X"40",X"DB",X"80",X"5F",X"C9",X"3A",X"10",X"80",X"FE",X"01", + X"28",X"17",X"FE",X"02",X"28",X"1A",X"FE",X"03",X"28",X"1A",X"FE",X"04",X"28",X"1A",X"FE",X"05", + X"28",X"1A",X"3E",X"0A",X"D3",X"10",X"DB",X"20",X"C9",X"3E",X"08",X"D3",X"40",X"DB",X"80",X"C9", + X"3E",X"09",X"18",X"F7",X"3E",X"0A",X"18",X"F3",X"3E",X"08",X"18",X"E8",X"3E",X"09",X"18",X"E4", + X"3A",X"10",X"80",X"FE",X"01",X"28",X"20",X"FE",X"02",X"28",X"2C",X"FE",X"03",X"28",X"2C",X"FE", + X"04",X"28",X"2C",X"FE",X"05",X"28",X"2C",X"06",X"04",X"78",X"D3",X"10",X"DB",X"20",X"6F",X"04", + X"78",X"D3",X"10",X"DB",X"20",X"67",X"C9",X"06",X"00",X"78",X"D3",X"40",X"DB",X"80",X"6F",X"04", + X"78",X"D3",X"40",X"DB",X"80",X"67",X"C9",X"06",X"02",X"18",X"EE",X"06",X"04",X"18",X"EA",X"06", + X"00",X"18",X"D6",X"06",X"02",X"18",X"D2",X"3A",X"10",X"80",X"FE",X"04",X"28",X"21",X"FE",X"05", + X"28",X"22",X"FE",X"06",X"28",X"23",X"FE",X"01",X"28",X"24",X"FE",X"02",X"28",X"25",X"11",X"FF", + X"F3",X"2A",X"0C",X"80",X"7A",X"A4",X"67",X"7B",X"A5",X"6F",X"22",X"0C",X"80",X"77",X"C9",X"11", + X"FC",X"FF",X"18",X"ED",X"11",X"F3",X"FF",X"18",X"E8",X"11",X"CF",X"FF",X"18",X"E3",X"11",X"3F", + X"FF",X"18",X"DE",X"11",X"FF",X"FC",X"18",X"D9",X"3A",X"10",X"80",X"FE",X"04",X"28",X"20",X"FE", + X"05",X"28",X"21",X"FE",X"06",X"28",X"22",X"FE",X"01",X"28",X"23",X"FE",X"02",X"28",X"24",X"11", + X"FF",X"F3",X"2A",X"0C",X"80",X"7A",X"A4",X"67",X"7B",X"A5",X"6F",X"22",X"0C",X"80",X"C9",X"11", + X"FC",X"FF",X"18",X"EE",X"11",X"F3",X"FF",X"18",X"E9",X"11",X"CF",X"FF",X"18",X"E4",X"11",X"3F", + X"FF",X"18",X"DF",X"11",X"FF",X"FC",X"18",X"DA",X"CD",X"08",X"07",X"3A",X"10",X"80",X"FE",X"04", + X"28",X"17",X"FE",X"05",X"28",X"18",X"FE",X"06",X"28",X"19",X"FE",X"01",X"28",X"1A",X"FE",X"02", + X"28",X"1B",X"11",X"00",X"08",X"CD",X"F6",X"07",X"C9",X"11",X"02",X"00",X"18",X"F7",X"11",X"08", + X"00",X"18",X"F2",X"11",X"20",X"00",X"18",X"ED",X"11",X"80",X"00",X"18",X"E8",X"11",X"00",X"02", + X"18",X"E3",X"CD",X"08",X"07",X"3A",X"10",X"80",X"FE",X"04",X"28",X"17",X"FE",X"05",X"28",X"18", + X"FE",X"06",X"28",X"19",X"FE",X"01",X"28",X"1A",X"FE",X"02",X"28",X"1B",X"11",X"00",X"04",X"CD", + X"F6",X"07",X"C9",X"11",X"01",X"00",X"18",X"F7",X"11",X"04",X"00",X"18",X"F2",X"11",X"10",X"00", + X"18",X"ED",X"11",X"40",X"00",X"18",X"E8",X"11",X"00",X"01",X"18",X"E3",X"CD",X"08",X"07",X"3A", + X"10",X"80",X"FE",X"04",X"28",X"17",X"FE",X"05",X"28",X"18",X"FE",X"06",X"28",X"19",X"FE",X"01", + X"28",X"1A",X"FE",X"02",X"28",X"1B",X"11",X"00",X"0C",X"CD",X"F6",X"07",X"C9",X"11",X"03",X"00", + X"18",X"F7",X"11",X"0C",X"00",X"18",X"F2",X"11",X"30",X"00",X"18",X"ED",X"11",X"C0",X"00",X"18", + X"E8",X"11",X"00",X"03",X"18",X"E3",X"2A",X"0C",X"80",X"7A",X"B4",X"67",X"7B",X"B5",X"6F",X"22"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_SND_1.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_SND_1.vhd new file mode 100644 index 00000000..adae5bd7 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_SND_1.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_SND_1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_SND_1 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"0C",X"80",X"77",X"C9",X"B7",X"C8",X"21",X"17",X"08",X"E5",X"87",X"5F",X"16",X"00",X"21",X"60", + X"08",X"19",X"5E",X"23",X"56",X"EB",X"E9",X"B7",X"C8",X"3A",X"10",X"80",X"FE",X"01",X"28",X"18", + X"FE",X"02",X"28",X"1C",X"FE",X"03",X"28",X"20",X"FE",X"04",X"28",X"24",X"FE",X"05",X"28",X"28", + X"AF",X"32",X"0A",X"80",X"32",X"0B",X"80",X"C9",X"AF",X"32",X"00",X"80",X"32",X"01",X"80",X"C9", + X"AF",X"32",X"02",X"80",X"32",X"03",X"80",X"C9",X"AF",X"32",X"04",X"80",X"32",X"05",X"80",X"C9", + X"AF",X"32",X"06",X"80",X"32",X"07",X"80",X"C9",X"AF",X"32",X"08",X"80",X"32",X"09",X"80",X"C9", + X"00",X"00",X"39",X"09",X"B5",X"09",X"31",X"0A",X"AD",X"0A",X"29",X"0B",X"1F",X"0D",X"4E",X"12", + X"CE",X"13",X"CE",X"0D",X"D4",X"0D",X"4A",X"10",X"51",X"10",X"58",X"10",X"C7",X"10",X"CE",X"10", + X"00",X"00",X"00",X"00",X"20",X"11",X"73",X"0B",X"12",X"0C",X"A3",X"0C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"97",X"0D",X"B1",X"11",X"1A",X"12",X"DE",X"12",X"5B",X"13",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CD",X"2C",X"0B",X"3E",X"03",X"32",X"1B",X"80",X"3E",X"0F",X"32",X"1C",X"80",X"3E",X"1F",X"32", + X"1D",X"80",X"21",X"80",X"00",X"22",X"1E",X"80",X"22",X"20",X"80",X"3E",X"04",X"32",X"22",X"80", + X"3E",X"40",X"32",X"23",X"80",X"32",X"24",X"80",X"3E",X"03",X"32",X"26",X"80",X"3E",X"0A",X"32", + X"27",X"80",X"21",X"00",X"08",X"22",X"28",X"80",X"3E",X"08",X"32",X"2A",X"80",X"32",X"2B",X"80", + X"21",X"40",X"00",X"22",X"2C",X"80",X"22",X"2E",X"80",X"3E",X"0C",X"32",X"30",X"80",X"3E",X"03", + X"32",X"32",X"80",X"3E",X"0A",X"32",X"33",X"80",X"21",X"00",X"02",X"22",X"34",X"80",X"21",X"00", + X"08",X"22",X"36",X"80",X"21",X"00",X"02",X"22",X"38",X"80",X"3E",X"08",X"32",X"3A",X"80",X"32", + X"3B",X"80",X"21",X"20",X"00",X"22",X"3D",X"80",X"C9",X"3E",X"FF",X"C9",X"CD",X"2C",X"0B",X"3E", + X"03",X"32",X"1B",X"80",X"3E",X"0F",X"32",X"1C",X"80",X"3E",X"1F",X"32",X"1D",X"80",X"21",X"80", + X"00",X"22",X"1E",X"80",X"22",X"20",X"80",X"3E",X"01",X"32",X"22",X"80",X"3E",X"20",X"32",X"23", + X"80",X"32",X"24",X"80",X"3E",X"03",X"32",X"26",X"80",X"3E",X"0D",X"32",X"27",X"80",X"21",X"00", + X"08",X"22",X"28",X"80",X"3E",X"08",X"32",X"2A",X"80",X"32",X"2B",X"80",X"21",X"40",X"00",X"22", + X"2C",X"80",X"22",X"2E",X"80",X"3E",X"02",X"32",X"30",X"80",X"3E",X"03",X"32",X"32",X"80",X"3E", + X"0E",X"32",X"33",X"80",X"21",X"00",X"02",X"22",X"34",X"80",X"21",X"00",X"08",X"22",X"36",X"80", + X"21",X"01",X"00",X"22",X"38",X"80",X"3E",X"18",X"32",X"3A",X"80",X"32",X"3B",X"80",X"21",X"00", + X"01",X"22",X"3D",X"80",X"C9",X"3E",X"FF",X"C9",X"CD",X"2C",X"0B",X"3E",X"02",X"32",X"1B",X"80", + X"3E",X"0F",X"32",X"1C",X"80",X"3E",X"08",X"32",X"1D",X"80",X"21",X"80",X"00",X"22",X"1E",X"80", + X"22",X"20",X"80",X"3E",X"01",X"32",X"22",X"80",X"3E",X"20",X"32",X"23",X"80",X"32",X"24",X"80", + X"3E",X"03",X"32",X"26",X"80",X"3E",X"0A",X"32",X"27",X"80",X"21",X"00",X"08",X"22",X"28",X"80", + X"3E",X"08",X"32",X"2A",X"80",X"32",X"2B",X"80",X"21",X"40",X"00",X"22",X"2C",X"80",X"22",X"2E", + X"80",X"3E",X"03",X"32",X"30",X"80",X"3E",X"03",X"32",X"32",X"80",X"3E",X"08",X"32",X"33",X"80", + X"21",X"00",X"02",X"22",X"34",X"80",X"21",X"00",X"08",X"22",X"36",X"80",X"21",X"01",X"00",X"22", + X"38",X"80",X"3E",X"20",X"32",X"3A",X"80",X"32",X"3B",X"80",X"21",X"20",X"00",X"22",X"3D",X"80", + X"C9",X"3E",X"FF",X"C9",X"CD",X"2C",X"0B",X"3E",X"03",X"32",X"1B",X"80",X"3E",X"0E",X"32",X"1C", + X"80",X"3E",X"1F",X"32",X"1D",X"80",X"21",X"80",X"00",X"22",X"1E",X"80",X"22",X"20",X"80",X"3E", + X"01",X"32",X"22",X"80",X"3E",X"20",X"32",X"23",X"80",X"32",X"24",X"80",X"3E",X"03",X"32",X"26", + X"80",X"3E",X"0C",X"32",X"27",X"80",X"21",X"00",X"08",X"22",X"28",X"80",X"3E",X"08",X"32",X"2A", + X"80",X"32",X"2B",X"80",X"21",X"40",X"00",X"22",X"2C",X"80",X"22",X"2E",X"80",X"3E",X"03",X"32", + X"30",X"80",X"3E",X"03",X"32",X"32",X"80",X"3E",X"0F",X"32",X"33",X"80",X"21",X"00",X"02",X"22", + X"34",X"80",X"21",X"00",X"08",X"22",X"36",X"80",X"21",X"01",X"00",X"22",X"38",X"80",X"3E",X"20", + X"32",X"3A",X"80",X"32",X"3B",X"80",X"21",X"20",X"00",X"22",X"3D",X"80",X"C9",X"3E",X"FF",X"C9", + X"CD",X"2C",X"0B",X"3E",X"03",X"32",X"1B",X"80",X"3E",X"0F",X"32",X"1C",X"80",X"3E",X"1F",X"32", + X"1D",X"80",X"21",X"80",X"00",X"22",X"1E",X"80",X"22",X"20",X"80",X"3E",X"04",X"32",X"22",X"80", + X"3E",X"40",X"32",X"23",X"80",X"32",X"24",X"80",X"3E",X"03",X"32",X"26",X"80",X"3E",X"0C",X"32", + X"27",X"80",X"21",X"00",X"08",X"22",X"28",X"80",X"3E",X"08",X"32",X"2A",X"80",X"32",X"2B",X"80", + X"21",X"30",X"00",X"22",X"2C",X"80",X"22",X"2E",X"80",X"3E",X"08",X"32",X"30",X"80",X"3E",X"03", + X"32",X"32",X"80",X"3E",X"09",X"32",X"33",X"80",X"21",X"00",X"02",X"22",X"34",X"80",X"21",X"00", + X"08",X"22",X"36",X"80",X"21",X"00",X"01",X"22",X"38",X"80",X"3E",X"01",X"32",X"3A",X"80",X"32", + X"3B",X"80",X"21",X"20",X"00",X"22",X"3D",X"80",X"C9",X"3E",X"FF",X"C9",X"3E",X"13",X"CD",X"6F", + X"00",X"3E",X"14",X"CD",X"6F",X"00",X"3E",X"15",X"CD",X"6F",X"00",X"C9",X"3A",X"1B",X"80",X"FE", + X"00",X"28",X"21",X"FE",X"01",X"28",X"22",X"FE",X"02",X"28",X"23",X"CD",X"BC",X"07",X"AF",X"32", + X"25",X"80",X"16",X"06",X"21",X"1D",X"80",X"5E",X"CD",X"4C",X"05",X"CD",X"80",X"05",X"06",X"00", + X"CD",X"FE",X"05",X"C9",X"CD",X"C7",X"06",X"18",X"E5",X"CD",X"48",X"07",X"18",X"E0",X"CD",X"82", + X"07",X"18",X"DB",X"16",X"06",X"21",X"1D",X"80",X"5E",X"CD",X"4C",X"05",X"3A",X"25",X"80",X"FE", + X"00",X"28",X"1E",X"FE",X"01",X"28",X"27",X"FE",X"02",X"28",X"3C",X"21",X"24",X"80",X"35",X"20", + X"0E",X"3A",X"23",X"80",X"77",X"CD",X"4B",X"06",X"3D",X"28",X"3E",X"47",X"CD",X"FE",X"05",X"AF", + X"C9",X"3A",X"1C",X"80",X"47",X"CD",X"FE",X"05",X"21",X"25",X"80",X"34",X"18",X"DD",X"2A",X"20", + X"80",X"2B",X"7C",X"B5",X"20",X"0C",X"2A",X"1E",X"80",X"22",X"20",X"80",X"21",X"25",X"80",X"34", + X"18",X"C9",X"22",X"20",X"80",X"18",X"C4",X"21",X"22",X"80",X"35",X"20",X"06",X"21",X"25",X"80", + X"34",X"18",X"B8",X"AF",X"32",X"25",X"80",X"18",X"B2",X"16",X"06",X"1E",X"04",X"CD",X"4C",X"05", + X"3E",X"FF",X"C9",X"3A",X"26",X"80",X"FE",X"00",X"28",X"19",X"FE",X"01",X"28",X"1A",X"FE",X"02", + X"28",X"1B",X"CD",X"BC",X"07",X"AF",X"32",X"31",X"80",X"2A",X"28",X"80",X"CD",X"C6",X"04",X"CD", + X"0D",X"05",X"C9",X"CD",X"C7",X"06",X"18",X"ED",X"CD",X"48",X"07",X"18",X"E8",X"CD",X"82",X"07", + X"18",X"E3",X"3A",X"31",X"80",X"FE",X"00",X"28",X"1F",X"FE",X"01",X"28",X"2E",X"2A",X"2E",X"80", + X"2B",X"7C",X"B5",X"20",X"40",X"2A",X"2C",X"80",X"22",X"2E",X"80",X"21",X"30",X"80",X"35",X"28", + X"39",X"21",X"31",X"80",X"36",X"00",X"AF",X"C9",X"3A",X"27",X"80",X"47",X"CD",X"FE",X"05",X"3A", + X"2A",X"80",X"32",X"2B",X"80",X"21",X"31",X"80",X"34",X"18",X"EB",X"21",X"2B",X"80",X"35",X"20", + X"CC",X"3A",X"2A",X"80",X"77",X"CD",X"4B",X"06",X"3D",X"20",X"04",X"21",X"31",X"80",X"34",X"47", + X"CD",X"FE",X"05",X"18",X"B8",X"22",X"2E",X"80",X"18",X"CC",X"3E",X"FF",X"C9",X"3A",X"32",X"80", + X"FE",X"00",X"28",X"20",X"FE",X"01",X"28",X"21",X"FE",X"02",X"28",X"22",X"CD",X"BC",X"07",X"AF", + X"32",X"3C",X"80",X"2A",X"36",X"80",X"CD",X"C6",X"04",X"CD",X"0D",X"05",X"3A",X"33",X"80",X"47", + X"CD",X"FE",X"05",X"C9",X"CD",X"C7",X"06",X"18",X"E6",X"CD",X"48",X"07",X"18",X"E1",X"CD",X"82", + X"07",X"18",X"DC",X"3A",X"3C",X"80",X"FE",X"00",X"28",X"22",X"FE",X"01",X"28",X"32",X"CD",X"80", + X"06",X"B7",X"ED",X"5B",X"3D",X"80",X"ED",X"52",X"ED",X"5B",X"34",X"80",X"7C",X"BA",X"20",X"07", + X"7D",X"BB",X"20",X"03",X"2A",X"36",X"80",X"CD",X"C6",X"04",X"AF",X"C9",X"2A",X"38",X"80",X"2B", + X"7C",X"B5",X"20",X"07",X"3E",X"01",X"32",X"3C",X"80",X"18",X"D3",X"22",X"38",X"80",X"18",X"CE", + X"21",X"3A",X"80",X"35",X"20",X"C8",X"3A",X"3B",X"80",X"77",X"CD",X"4B",X"06",X"3D",X"28",X"06", + X"47",X"CD",X"FE",X"05",X"18",X"B8",X"3E",X"FF",X"C9",X"CD",X"48",X"07",X"AF",X"32",X"43",X"80", + X"3E",X"02",X"32",X"42",X"80",X"CD",X"0D",X"05",X"3E",X"08",X"32",X"3F",X"80",X"21",X"20",X"00", + X"22",X"40",X"80",X"21",X"40",X"00",X"CD",X"C6",X"04",X"06",X"08",X"CD",X"FE",X"05",X"C9",X"3A", + X"43",X"80",X"B7",X"20",X"0B",X"2A",X"40",X"80",X"2B",X"7C",X"B5",X"28",X"37",X"22",X"40",X"80", + X"21",X"3F",X"80",X"35",X"28",X"1A",X"CD",X"80",X"06",X"11",X"10",X"00",X"19",X"11",X"00",X"02", + X"7C",X"BA",X"20",X"07",X"7D",X"BB",X"20",X"03",X"21",X"40",X"00",X"CD",X"C6",X"04",X"AF",X"C9", + X"3E",X"08",X"32",X"3F",X"80",X"CD",X"4B",X"06",X"3D",X"28",X"06",X"47",X"CD",X"FE",X"05",X"18", + X"D5",X"3E",X"FF",X"C9",X"21",X"20",X"00",X"22",X"40",X"80",X"21",X"42",X"80",X"35",X"20",X"05", + X"3E",X"01",X"32",X"43",X"80",X"CD",X"08",X"0D",X"18",X"A5",X"CD",X"82",X"07",X"3E",X"08",X"32", + X"44",X"80",X"21",X"00",X"0A",X"22",X"45",X"80",X"21",X"40",X"00",X"CD",X"C6",X"04",X"CD",X"0D", + X"05",X"06",X"0B",X"CD",X"FE",X"05",X"C9",X"2A",X"45",X"80",X"2B",X"7C",X"B5",X"28",X"17",X"22", + X"45",X"80",X"21",X"44",X"80",X"35",X"20",X"0C",X"36",X"08",X"CD",X"80",X"06",X"11",X"02",X"00", + X"19",X"CD",X"C6",X"04",X"AF",X"C9",X"3E",X"FF",X"C9",X"CD",X"C7",X"06",X"3E",X"00",X"32",X"73", + X"80",X"CD",X"0D",X"05",X"C3",X"8E",X"0F",X"CD",X"C7",X"06",X"CD",X"0D",X"05",X"C9",X"DD",X"21", + X"50",X"80",X"18",X"06",X"DD",X"21",X"58",X"80",X"18",X"00",X"DD",X"7E",X"00",X"FE",X"FF",X"C8", + X"CD",X"E5",X"0D",X"AF",X"C9",X"DD",X"35",X"01",X"C0",X"3A",X"72",X"80",X"DD",X"77",X"01",X"DD", + X"CB",X"00",X"46",X"C2",X"05",X"0E",X"DD",X"7E",X"07",X"D6",X"01",X"FA",X"05",X"0E",X"DD",X"77", + X"07",X"47",X"CD",X"FE",X"05",X"DD",X"35",X"00",X"C0",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"7E", + X"47",X"E6",X"1F",X"CA",X"9A",X"0E",X"FE",X"1F",X"C2",X"B6",X"0E",X"23",X"DD",X"75",X"02",X"DD", + X"74",X"03",X"78",X"E6",X"E0",X"0F",X"0F",X"0F",X"0F",X"4F",X"06",X"00",X"21",X"35",X"0E",X"09", + X"5E",X"23",X"56",X"D5",X"C9",X"45",X"0E",X"5D",X"0E",X"73",X"0E",X"90",X"0E",X"90",X"0E",X"90", + X"0E",X"90",X"0E",X"90",X"0E",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"4E",X"CB",X"21",X"06",X"00", + X"21",X"E6",X"0E",X"09",X"5E",X"23",X"56",X"ED",X"53",X"70",X"80",X"18",X"23",X"DD",X"6E",X"02", + X"DD",X"66",X"03",X"4E",X"06",X"00",X"21",X"7E",X"0F",X"09",X"7E",X"32",X"72",X"80",X"DD",X"77", + X"01",X"18",X"0D",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"7E",X"DD",X"77",X"06",X"DD",X"77",X"07", + X"DD",X"6E",X"02",X"DD",X"66",X"03",X"23",X"DD",X"75",X"02",X"DD",X"74",X"03",X"C3",X"09",X"0E", + X"06",X"00",X"CD",X"FE",X"05",X"DD",X"36",X"00",X"FF",X"C9",X"CD",X"A4",X"0E",X"06",X"00",X"CD", + X"FE",X"05",X"18",X"34",X"78",X"E6",X"E0",X"07",X"07",X"07",X"47",X"3E",X"01",X"10",X"04",X"DD", + X"77",X"00",X"C9",X"07",X"18",X"F7",X"C5",X"CD",X"A4",X"0E",X"C1",X"78",X"E6",X"1F",X"3D",X"07", + X"4F",X"06",X"00",X"2A",X"70",X"80",X"09",X"5E",X"23",X"56",X"EB",X"CD",X"C6",X"04",X"DD",X"46", + X"06",X"78",X"DD",X"77",X"07",X"CD",X"FE",X"05",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"23",X"DD", + X"75",X"02",X"DD",X"74",X"03",X"C9",X"06",X"0F",X"0A",X"0F",X"0E",X"0F",X"12",X"0F",X"16",X"0F", + X"1A",X"0F",X"1E",X"0F",X"22",X"0F",X"26",X"0F",X"2A",X"0F",X"2E",X"0F",X"32",X"0F",X"36",X"0F", + X"3A",X"0F",X"3E",X"0F",X"42",X"0F",X"6B",X"08",X"F2",X"07",X"80",X"07",X"14",X"07",X"AE",X"06", + X"4E",X"06",X"F3",X"05",X"9E",X"05",X"4E",X"05",X"01",X"05",X"B9",X"04",X"76",X"04",X"36",X"04", + X"F9",X"03",X"C0",X"03",X"8A",X"03",X"57",X"03",X"27",X"03",X"FA",X"02",X"CF",X"02",X"A7",X"02", + X"81",X"02",X"5D",X"02",X"3B",X"02",X"1B",X"02",X"FD",X"01",X"E0",X"01",X"C5",X"01",X"AC",X"01", + X"94",X"01",X"7D",X"01",X"68",X"01",X"53",X"01",X"40",X"01",X"2E",X"01",X"1D",X"01",X"0D",X"01", + X"FE",X"00",X"F0",X"00",X"E3",X"00",X"D6",X"00",X"CA",X"00",X"BE",X"00",X"B4",X"00",X"AA",X"00", + X"A0",X"00",X"97",X"00",X"8F",X"00",X"87",X"00",X"7F",X"00",X"78",X"00",X"71",X"00",X"6B",X"00", + X"65",X"00",X"5F",X"00",X"5A",X"00",X"55",X"00",X"50",X"00",X"4C",X"00",X"47",X"00",X"57",X"42", + X"34",X"2C",X"25",X"21",X"1D",X"1A",X"0C",X"0B",X"0A",X"09",X"08",X"07",X"06",X"05",X"21",X"C1", + X"0F",X"11",X"50",X"80",X"01",X"18",X"00",X"ED",X"B0",X"3A",X"73",X"80",X"07",X"4F",X"07",X"07", + X"91",X"4F",X"06",X"00",X"21",X"D9",X"0F",X"09",X"11",X"52",X"80",X"CD",X"B7",X"0F",X"11",X"5A", + X"80",X"CD",X"B7",X"0F",X"11",X"62",X"80",X"7E",X"12",X"CD",X"BE",X"0F",X"7E",X"12",X"23",X"13", + X"C9",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"EB",X"0F",X"0D",X"10",X"2D",X"10",X"5F", + X"10",X"7C",X"10",X"97",X"10",X"D5",X"10",X"EB",X"10",X"FF",X"10",X"1F",X"0A",X"3F",X"0D",X"5F", + X"09",X"AC",X"80",X"6C",X"6C",X"AC",X"80",X"6C",X"6C",X"8C",X"88",X"8C",X"8F",X"8C",X"88",X"8C"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_SND_2.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_SND_2.vhd new file mode 100644 index 00000000..43e9cd64 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ROM/ROM_SND_2.vhd @@ -0,0 +1,150 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_SND_2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(10 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_SND_2 is + type rom is array(0 to 2047) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"88",X"8C",X"8F",X"8C",X"88",X"8C",X"88",X"8C",X"8F",X"8C",X"88",X"AF",X"FF",X"1F",X"0A",X"5F", + X"09",X"A8",X"80",X"68",X"68",X"A8",X"80",X"68",X"68",X"88",X"83",X"88",X"8C",X"88",X"83",X"88", + X"83",X"88",X"8C",X"88",X"83",X"88",X"83",X"88",X"8C",X"88",X"83",X"AC",X"FF",X"FF",X"CD",X"C7", + X"06",X"3E",X"01",X"32",X"73",X"80",X"CD",X"0D",X"05",X"C3",X"8E",X"0F",X"CD",X"C7",X"06",X"CD", + X"0D",X"05",X"C9",X"CD",X"C7",X"06",X"CD",X"0D",X"05",X"C9",X"DD",X"21",X"50",X"80",X"C3",X"DA", + X"0D",X"DD",X"21",X"58",X"80",X"C3",X"DA",X"0D",X"DD",X"21",X"60",X"80",X"C3",X"DA",X"0D",X"1F", + X"0A",X"3F",X"0E",X"5F",X"08",X"85",X"85",X"85",X"8A",X"8A",X"8A",X"8A",X"91",X"91",X"91",X"91", + X"8F",X"8F",X"D6",X"93",X"8F",X"93",X"B6",X"93",X"8F",X"93",X"B6",X"FF",X"1F",X"0A",X"5F",X"08", + X"85",X"85",X"85",X"85",X"85",X"85",X"85",X"8E",X"8E",X"8E",X"8E",X"8C",X"8C",X"D3",X"8F",X"8C", + X"8F",X"B3",X"8F",X"8C",X"8F",X"B3",X"FF",X"1F",X"0A",X"5F",X"08",X"91",X"91",X"91",X"8A",X"8A", + X"8A",X"8A",X"96",X"96",X"96",X"96",X"94",X"94",X"D6",X"93",X"8F",X"93",X"B6",X"93",X"8F",X"93", + X"B6",X"FF",X"CD",X"C7",X"06",X"3E",X"02",X"32",X"73",X"80",X"CD",X"0D",X"05",X"C3",X"8E",X"0F", + X"CD",X"C7",X"06",X"CD",X"0D",X"05",X"C9",X"DD",X"21",X"50",X"80",X"C3",X"DA",X"0D",X"DD",X"21", + X"58",X"80",X"C3",X"DA",X"0D",X"1F",X"0A",X"3F",X"0A",X"5F",X"09",X"8D",X"8F",X"91",X"8F",X"91", + X"94",X"91",X"8F",X"8D",X"8F",X"91",X"8D",X"8F",X"8C",X"AD",X"FF",X"1F",X"0A",X"5F",X"09",X"8A", + X"8C",X"8D",X"8C",X"8D",X"8F",X"8D",X"8C",X"8A",X"8C",X"8D",X"8A",X"8C",X"88",X"AA",X"FF",X"FF", + X"CD",X"BC",X"07",X"21",X"00",X"03",X"22",X"83",X"80",X"21",X"80",X"80",X"36",X"01",X"21",X"00", + X"08",X"22",X"81",X"80",X"CD",X"C6",X"04",X"CD",X"0D",X"05",X"06",X"0B",X"CD",X"FE",X"05",X"C9", + X"2A",X"83",X"80",X"2B",X"22",X"83",X"80",X"7D",X"B4",X"28",X"52",X"3A",X"80",X"80",X"FE",X"00", + X"28",X"1E",X"FE",X"01",X"28",X"0E",X"FE",X"02",X"28",X"05",X"21",X"00",X"0A",X"18",X"08",X"21", + X"00",X"06",X"18",X"03",X"21",X"00",X"08",X"22",X"81",X"80",X"CD",X"C6",X"04",X"AF",X"18",X"28", + X"2A",X"81",X"80",X"11",X"20",X"00",X"ED",X"52",X"22",X"81",X"80",X"7C",X"FE",X"00",X"28",X"06", + X"CD",X"C6",X"04",X"AF",X"18",X"12",X"CD",X"C6",X"04",X"3A",X"80",X"80",X"3C",X"32",X"80",X"80", + X"FE",X"04",X"28",X"02",X"AF",X"C9",X"3E",X"01",X"32",X"80",X"80",X"AF",X"C9",X"3E",X"FF",X"C9", + X"CD",X"BC",X"07",X"3E",X"01",X"32",X"86",X"80",X"3E",X"20",X"32",X"87",X"80",X"3E",X"06",X"32", + X"88",X"80",X"AF",X"32",X"89",X"80",X"32",X"8A",X"80",X"21",X"00",X"03",X"22",X"8D",X"80",X"21", + X"00",X"04",X"22",X"8B",X"80",X"CD",X"C6",X"04",X"CD",X"0D",X"05",X"06",X"0B",X"CD",X"FE",X"05", + X"C9",X"2A",X"8D",X"80",X"2B",X"7C",X"B5",X"28",X"5D",X"22",X"8D",X"80",X"3A",X"89",X"80",X"FE", + X"00",X"28",X"06",X"FE",X"01",X"28",X"24",X"AF",X"C9",X"21",X"86",X"80",X"35",X"20",X"F8",X"36", + X"01",X"CD",X"80",X"06",X"B7",X"11",X"08",X"00",X"ED",X"52",X"CD",X"C6",X"04",X"21",X"87",X"80", + X"35",X"20",X"E4",X"36",X"20",X"21",X"89",X"80",X"34",X"18",X"DC",X"2A",X"8B",X"80",X"11",X"30", + X"00",X"3A",X"8A",X"80",X"E6",X"01",X"20",X"1B",X"B7",X"ED",X"52",X"22",X"8B",X"80",X"CD",X"C6", + X"04",X"21",X"88",X"80",X"35",X"20",X"06",X"36",X"06",X"21",X"8A",X"80",X"34",X"21",X"89",X"80", + X"35",X"18",X"B4",X"19",X"18",X"E5",X"3E",X"FF",X"C9",X"C9",X"3E",X"FF",X"C9",X"CD",X"82",X"07", + X"3E",X"01",X"32",X"A0",X"80",X"3E",X"20",X"32",X"A1",X"80",X"3E",X"10",X"32",X"A2",X"80",X"AF", + X"32",X"A5",X"80",X"32",X"A6",X"80",X"21",X"00",X"01",X"22",X"A3",X"80",X"21",X"00",X"05",X"22", + X"A7",X"80",X"CD",X"C6",X"04",X"CD",X"0D",X"05",X"06",X"0D",X"CD",X"FE",X"05",X"C9",X"2A",X"A3", + X"80",X"2B",X"7C",X"B5",X"28",X"5D",X"22",X"A3",X"80",X"3A",X"A5",X"80",X"FE",X"00",X"28",X"06", + X"FE",X"01",X"28",X"24",X"AF",X"C9",X"21",X"A0",X"80",X"35",X"20",X"F8",X"36",X"01",X"CD",X"80", + X"06",X"B7",X"11",X"04",X"00",X"ED",X"52",X"CD",X"C6",X"04",X"21",X"A1",X"80",X"35",X"20",X"E4", + X"36",X"20",X"21",X"A5",X"80",X"34",X"18",X"DC",X"2A",X"A7",X"80",X"11",X"50",X"00",X"3A",X"A6", + X"80",X"E6",X"01",X"20",X"1B",X"B7",X"ED",X"52",X"22",X"A7",X"80",X"CD",X"C6",X"04",X"21",X"A2", + X"80",X"35",X"20",X"06",X"36",X"10",X"21",X"A6",X"80",X"34",X"21",X"A5",X"80",X"35",X"18",X"B4", + X"19",X"18",X"E5",X"3E",X"FF",X"C9",X"CD",X"C7",X"06",X"3E",X"18",X"32",X"B0",X"80",X"21",X"00", + X"01",X"22",X"B1",X"80",X"AF",X"32",X"B3",X"80",X"21",X"00",X"02",X"22",X"B4",X"80",X"16",X"06", + X"1E",X"00",X"CD",X"4C",X"05",X"CD",X"80",X"05",X"06",X"03",X"CD",X"FE",X"05",X"C9",X"2A",X"B4", + X"80",X"2B",X"7C",X"B5",X"28",X"4B",X"22",X"B4",X"80",X"3A",X"B3",X"80",X"FE",X"00",X"28",X"1B", + X"2A",X"B1",X"80",X"2B",X"7C",X"B5",X"20",X"34",X"21",X"00",X"01",X"22",X"B1",X"80",X"16",X"06", + X"1E",X"00",X"CD",X"4C",X"05",X"AF",X"32",X"B3",X"80",X"AF",X"C9",X"21",X"B0",X"80",X"35",X"20", + X"F8",X"36",X"18",X"16",X"06",X"CD",X"35",X"06",X"1C",X"7B",X"FE",X"08",X"28",X"05",X"CD",X"4C", + X"05",X"18",X"E6",X"CD",X"4C",X"05",X"21",X"B3",X"80",X"34",X"18",X"DD",X"22",X"B1",X"80",X"18", + X"D8",X"3E",X"FF",X"C9",X"CD",X"BC",X"07",X"3E",X"01",X"32",X"C0",X"80",X"21",X"00",X"08",X"22", + X"C3",X"80",X"AF",X"32",X"C5",X"80",X"21",X"00",X"02",X"22",X"C6",X"80",X"21",X"00",X"05",X"CD", + X"C6",X"04",X"CD",X"0D",X"05",X"06",X"08",X"CD",X"FE",X"05",X"C9",X"2A",X"C6",X"80",X"2B",X"7C", + X"B5",X"28",X"43",X"22",X"C6",X"80",X"21",X"C0",X"80",X"35",X"20",X"2C",X"36",X"01",X"CD",X"80", + X"06",X"11",X"08",X"00",X"19",X"ED",X"5B",X"C3",X"80",X"7C",X"BA",X"20",X"18",X"7D",X"BB",X"20", + X"14",X"3A",X"C5",X"80",X"B7",X"20",X"13",X"21",X"00",X"0B",X"22",X"C3",X"80",X"3E",X"FF",X"32", + X"C5",X"80",X"21",X"00",X"05",X"CD",X"C6",X"04",X"AF",X"C9",X"21",X"00",X"08",X"22",X"C3",X"80", + X"AF",X"32",X"C5",X"80",X"18",X"EC",X"3E",X"FF",X"C9",X"CD",X"48",X"07",X"3E",X"08",X"32",X"D0", + X"80",X"3E",X"05",X"32",X"D1",X"80",X"3E",X"0C",X"32",X"D2",X"80",X"AF",X"32",X"D3",X"80",X"21", + X"50",X"00",X"CD",X"C6",X"04",X"CD",X"0D",X"05",X"06",X"00",X"CD",X"FE",X"05",X"C9",X"3A",X"D3", + X"80",X"FE",X"00",X"28",X"18",X"FE",X"01",X"28",X"26",X"FE",X"02",X"28",X"27",X"FE",X"03",X"28", + X"33",X"21",X"D2",X"80",X"35",X"28",X"32",X"AF",X"32",X"D3",X"80",X"AF",X"C9",X"CD",X"4B",X"06", + X"3C",X"FE",X"0A",X"20",X"04",X"21",X"D3",X"80",X"34",X"47",X"CD",X"FE",X"05",X"18",X"EC",X"CD", + X"1C",X"14",X"18",X"E7",X"CD",X"4B",X"06",X"3D",X"20",X"04",X"21",X"D3",X"80",X"34",X"47",X"CD", + X"FE",X"05",X"18",X"D7",X"CD",X"29",X"14",X"18",X"D2",X"3E",X"FF",X"C9",X"21",X"D0",X"80",X"35", + X"C0",X"3E",X"08",X"77",X"21",X"D3",X"80",X"34",X"C9",X"21",X"D1",X"80",X"35",X"C0",X"3E",X"05", + X"77",X"21",X"D3",X"80",X"34",X"C9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",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 <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/ScrambleMist.sv b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ScrambleMist.sv new file mode 100644 index 00000000..c0b2f69d --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/ScrambleMist.sv @@ -0,0 +1,200 @@ +//============================================================================ +// Arcade: Scramble +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module ScrambleMist +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Scramble;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +//////////////////// CLOCKS /////////////////// + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6p, ce_6n, ce_12, ce_1p79; +always @(negedge clk_sys) begin + reg [1:0] div = 0; + reg [3:0] div179 = 0; + + div <= div + 1'd1; + + ce_12 <= div[0]; + ce_6p <= div[0] & ~div[1]; + ce_6n <= div[0] & div[1]; + + ce_1p79 <= 0; + div179 <= div179 - 1'd1; + if(!div179) begin + div179 <= 13; + ce_1p79 <= 1; + end +end + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [9:0] audio; +wire hsync,vsync; +assign LED = 1; +wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [3:0] r,b,g; + +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6p), + .ce_pix_actual(ce_6p), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r[1:0]}), + .G({g,g[1:0]}), + .B({b,b[1:0]}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +wire m_bomb = kbjoy[8]; +wire m_Serv = kbjoy[9]; + +scramble_top scramble +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + + .O_AUDIO(audio), + + .button_in(~{m_start2, m_fire, m_coin, m_start1, m_right, m_left, m_down, m_up}), + .RESET(status[0] | status[6] | buttons[1]), + .clk(clk_sys), + .ena_12(ce_12), + .ena_6(ce_6p), + .ena_6b(ce_6n), + .ena_1_79(ce_1p79) +); +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/YM2149_linmix_sep.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/YM2149_linmix_sep.vhd new file mode 100644 index 00000000..6ed2498a --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/YM2149_linmix_sep.vhd @@ -0,0 +1,574 @@ +-- changes for seperate audio outputs and enable now enables cpu access as well +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + O_CHAN : out std_logic_vector(1 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal cnt_div_t1 : std_logic_vector(3 downto 0); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8; + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process(RESET_L, CLK) + begin + -- looks like registers are latches in real chip, but the address is caught at the end of the address state. + if (RESET_L = '0') then + addr <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA = '1') then + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end if; + end process; + + p_wdata : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + elsif rising_edge(CLK) then + if (ENA = '1') then + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, reg, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + -- envelope shapes + -- C AtAlH + -- 0 0 x x \___ + -- + -- 0 1 x x /___ + -- + -- 1 0 0 0 \\\\ + -- + -- 1 0 0 1 \___ + -- + -- 1 0 1 0 \/\/ + -- ___ + -- 1 0 1 1 \ + -- + -- 1 1 0 0 //// + -- ___ + -- 1 1 0 1 / + -- + -- 1 1 1 0 /\/\ + -- + -- 1 1 1 1 /___ + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + cnt_div_t1 <= cnt_div; + end if; + end process; + + p_audio_output : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_AUDIO <= (others => '0'); + O_CHAN <= (others => '0'); + elsif rising_edge(CLK) then + + if (ENA = '1') then + O_AUDIO <= dac_amp(7 downto 0); + O_CHAN <= cnt_div_t1(1 downto 0); + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then -- resync + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end if; + end process; +end architecture RTL; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/build_id.tcl b/Arcade/Scramble Hardware/Scramble_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_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/Arcade/Scramble Hardware/Scramble_MiST/rtl/build_id.v b/Arcade/Scramble Hardware/Scramble_MiST/rtl/build_id.v new file mode 100644 index 00000000..fe075b4c --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171120" +`define BUILD_TIME "153907" diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80sed.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/dac.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/dac.vhd new file mode 100644 index 00000000..47b2185e --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 10 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/dpram.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/hq2x.sv b/Arcade/Scramble Hardware/Scramble_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_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/Arcade/Scramble Hardware/Scramble_MiST/rtl/i82c55.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/i82c55.vhd new file mode 100644 index 00000000..d415d932 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/i82c55.vhd @@ -0,0 +1,686 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- + +library ieee ; + use ieee.std_logic_1164.all ; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity I82C55 is + port ( + + I_ADDR : in std_logic_vector(1 downto 0); -- A1-A0 + I_DATA : in std_logic_vector(7 downto 0); -- D7-D0 + O_DATA : out std_logic_vector(7 downto 0); + O_DATA_OE_L : out std_logic; + + I_CS_L : in std_logic; + I_RD_L : in std_logic; + I_WR_L : in std_logic; + + I_PA : in std_logic_vector(7 downto 0); + O_PA : out std_logic_vector(7 downto 0); + O_PA_OE_L : out std_logic_vector(7 downto 0); + + I_PB : in std_logic_vector(7 downto 0); + O_PB : out std_logic_vector(7 downto 0); + O_PB_OE_L : out std_logic_vector(7 downto 0); + + I_PC : in std_logic_vector(7 downto 0); + O_PC : out std_logic_vector(7 downto 0); + O_PC_OE_L : out std_logic_vector(7 downto 0); + + RESET : in std_logic; + ENA : in std_logic; -- (CPU) clk enable + CLK : in std_logic + ); +end; + +architecture RTL of I82C55 is + + -- registers + signal bit_mask : std_logic_vector(7 downto 0); + signal r_porta : std_logic_vector(7 downto 0); + signal r_portb : std_logic_vector(7 downto 0); + signal r_portc : std_logic_vector(7 downto 0); + signal r_control : std_logic_vector(7 downto 0); + -- + signal porta_we : std_logic; + signal portb_we : std_logic; + signal porta_re : std_logic; + signal portb_re : std_logic; + -- + signal porta_we_t1 : std_logic; + signal portb_we_t1 : std_logic; + signal porta_re_t1 : std_logic; + signal portb_re_t1 : std_logic; + -- + signal porta_we_rising : boolean; + signal portb_we_rising : boolean; + signal porta_re_rising : boolean; + signal portb_re_rising : boolean; + -- + signal groupa_mode : std_logic_vector(1 downto 0); -- port a/c upper + signal groupb_mode : std_logic; -- port b/c lower + -- + signal porta_read : std_logic_vector(7 downto 0); + signal portb_read : std_logic_vector(7 downto 0); + signal portc_read : std_logic_vector(7 downto 0); + signal control_read : std_logic_vector(7 downto 0); + signal mode_clear : std_logic; + -- + signal a_inte1 : std_logic; + signal a_inte2 : std_logic; + signal b_inte : std_logic; + -- + signal a_intr : std_logic; + signal a_obf_l : std_logic; + signal a_ibf : std_logic; + signal a_ack_l : std_logic; + signal a_stb_l : std_logic; + signal a_ack_l_t1 : std_logic; + signal a_stb_l_t1 : std_logic; + -- + signal b_intr : std_logic; + signal b_obf_l : std_logic; + signal b_ibf : std_logic; + signal b_ack_l : std_logic; + signal b_stb_l : std_logic; + signal b_ack_l_t1 : std_logic; + signal b_stb_l_t1 : std_logic; + -- + signal a_ack_l_rising : boolean; + signal a_stb_l_rising : boolean; + signal b_ack_l_rising : boolean; + signal b_stb_l_rising : boolean; + -- + signal porta_ipreg : std_logic_vector(7 downto 0); + signal portb_ipreg : std_logic_vector(7 downto 0); +begin + -- + -- mode 0 - basic input/output + -- mode 1 - strobed input/output + -- mode 2/3 - bi-directional bus + -- + -- control word (write) + -- + -- D7 mode set flag 1 = active + -- D6..5 GROUPA mode selection (mode 0,1,2) + -- D4 GROUPA porta 1 = input, 0 = output + -- D3 GROUPA portc upper 1 = input, 0 = output + -- D2 GROUPB mode selection (mode 0 ,1) + -- D1 GROUPB portb 1 = input, 0 = output + -- D0 GROUPB portc lower 1 = input, 0 = output + -- + -- D7 bit set/reset 0 = active + -- D6..4 x + -- D3..1 bit select + -- d0 1 = set, 0 - reset + -- + -- all output registers including status are reset when mode is changed + --1. Port A: + --All Modes: Output data is cleared, input data is not cleared. + + --2. Port B: + --Mode 0: Output data is cleared, input data is not cleared. + --Mode 1 and 2: Both output and input data are cleared. + + --3. Port C: + --Mode 0:Output data is cleared, input data is not cleared. + --Mode 1 and 2: IBF and INTR are cleared and OBF# is set. + --Outputs in Port C which are not used for handshaking or interrupt signals are cleared. + --Inputs such as STB#, ACK#, or "spare" inputs are not affected. The interrupts for Ports A and B are disabled. + + p_bit_mask : process(I_DATA) + begin + bit_mask <= x"01"; + case I_DATA(3 downto 1) is + when "000" => bit_mask <= x"01"; + when "001" => bit_mask <= x"02"; + when "010" => bit_mask <= x"04"; + when "011" => bit_mask <= x"08"; + when "100" => bit_mask <= x"10"; + when "101" => bit_mask <= x"20"; + when "110" => bit_mask <= x"40"; + when "111" => bit_mask <= x"80"; + when others => null; + end case; + end process; + + p_write_reg_reset : process(RESET, CLK) + variable r_portc_masked : std_logic_vector(7 downto 0); + variable r_portc_setclr : std_logic_vector(7 downto 0); + begin + if (RESET = '1') then + r_porta <= x"00"; + r_portb <= x"00"; + r_portc <= x"00"; + r_control <= x"9B"; -- 10011011 + mode_clear <= '1'; + elsif rising_edge(CLK) then + + r_portc_masked := (not bit_mask) and r_portc; + for i in 0 to 7 loop + r_portc_setclr(i) := bit_mask(i) and I_DATA(0); + end loop; + + if (ENA = '1') then + mode_clear <= '0'; + if (I_CS_L = '0') and (I_WR_L = '0') then + case I_ADDR is + when "00" => r_porta <= I_DATA; + when "01" => r_portb <= I_DATA; + when "10" => r_portc <= I_DATA; + + when "11" => if (I_DATA(7) = '0') then -- set/clr + r_portc <= r_portc_masked or r_portc_setclr; + else + --mode_clear <= '1'; + --r_porta <= x"00"; + --r_portb <= x"00"; -- clear port b input reg + --r_portc <= x"00"; -- clear control sigs + r_control <= I_DATA; -- load new mode + end if; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_decode_control : process(r_control) + begin + groupa_mode <= r_control(6 downto 5); + groupb_mode <= r_control(2); + end process; + + p_oe : process(I_CS_L, I_RD_L) + begin + O_DATA_OE_L <= '1'; + if (I_CS_L = '0') and (I_RD_L = '0') then + O_DATA_OE_L <= '0'; + end if; + end process; + + p_read : process(I_ADDR, porta_read, portb_read, portc_read, control_read) + begin + O_DATA <= x"00"; -- default + --if (I_CS_L = '0') and (I_RD_L = '0') then -- not required + case I_ADDR is + when "00" => O_DATA <= porta_read; + when "01" => O_DATA <= portb_read; + when "10" => O_DATA <= portc_read; + when "11" => O_DATA <= control_read; + when others => null; + end case; + --end if; + end process; + control_read(7) <= '1'; -- always 1 + control_read(6 downto 0) <= r_control(6 downto 0); + + p_rw_control : process(I_CS_L, I_RD_L, I_WR_L, I_ADDR) + begin + porta_we <= '0'; + portb_we <= '0'; + porta_re <= '0'; + portb_re <= '0'; + + if (I_CS_L = '0') and (I_ADDR = "00") then + porta_we <= not I_WR_L; + porta_re <= not I_RD_L; + end if; + + if (I_CS_L = '0') and (I_ADDR = "01") then + portb_we <= not I_WR_L; + portb_re <= not I_RD_L; + end if; + end process; + + p_rw_control_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + porta_we_t1 <= porta_we; + portb_we_t1 <= portb_we; + porta_re_t1 <= porta_re; + portb_re_t1 <= portb_re; + + a_stb_l_t1 <= a_stb_l; + a_ack_l_t1 <= a_ack_l; + b_stb_l_t1 <= b_stb_l; + b_ack_l_t1 <= b_ack_l; + end if; + end process; + + porta_we_rising <= (porta_we = '0') and (porta_we_t1 = '1'); -- falling as inverted + portb_we_rising <= (portb_we = '0') and (portb_we_t1 = '1'); -- " + porta_re_rising <= (porta_re = '0') and (porta_re_t1 = '1'); -- falling as inverted + portb_re_rising <= (portb_re = '0') and (portb_re_t1 = '1'); -- " + -- + a_stb_l_rising <= (a_stb_l = '1') and (a_stb_l_t1 = '0'); + a_ack_l_rising <= (a_ack_l = '1') and (a_ack_l_t1 = '0'); + b_stb_l_rising <= (b_stb_l = '1') and (b_stb_l_t1 = '0'); + b_ack_l_rising <= (b_ack_l = '1') and (b_ack_l_t1 = '0'); + -- + -- GROUP A + -- in mode 1 + -- + -- d4=1 (porta = input) + -- pc7,6 io (d3=1 input, d3=0 output) + -- pc5 output a_ibf + -- pc4 input a_stb_l + -- pc3 output a_intr + -- + -- d4=0 (porta = output) + -- pc7 output a_obf_l + -- pc6 input a_ack_l + -- pc5,4 io (d3=1 input, d3=0 output) + -- pc3 output a_intr + -- + -- GROUP B + -- in mode 1 + -- d1=1 (portb = input) + -- pc2 input b_stb_l + -- pc1 output b_ibf + -- pc0 output b_intr + -- + -- d1=0 (portb = output) + -- pc2 input b_ack_l + -- pc1 output b_obf_l + -- pc0 output b_intr + + + -- WHEN AN INPUT + -- + -- stb_l a low on this input latches input data + -- ibf a high on this output indicates data latched. set by stb_l and reset by rising edge of RD_L + -- intr a high on this output indicates interrupt. set by stb_l high, ibf high and inte high. reset by falling edge of RD_L + -- inte A controlled by bit/set PC4 + -- inte B controlled by bit/set PC2 + + -- WHEN AN OUTPUT + -- + -- obf_l output will go low when cpu has written data + -- ack_l input - a low on this clears obf_l + -- intr output set when ack_l is high, obf_l is high and inte is one. reset by falling edge of WR_L + -- inte A controlled by bit/set PC6 + -- inte B controlled by bit/set PC2 + + -- GROUP A + -- in mode 2 + -- + -- porta = IO + -- + -- control bits 2..0 still control groupb/c lower 2..0 + -- + -- + -- PC7 output a_obf + -- PC6 input a_ack_l + -- PC5 output a_ibf + -- PC4 input a_stb_l + -- PC3 is still interrupt out + p_control_flags : process(RESET, CLK) + variable we : boolean; + variable set1 : boolean; + variable set2 : boolean; + begin + if (RESET = '1') then + a_obf_l <= '1'; + a_inte1 <= '0'; + a_ibf <= '0'; + a_inte2 <= '0'; + a_intr <= '0'; + -- + b_inte <= '0'; + b_obf_l <= '1'; + b_ibf <= '0'; + b_intr <= '0'; + elsif rising_edge(CLK) then + we := (I_CS_L = '0') and (I_WR_L = '0') and (I_ADDR = "11") and (I_DATA(7) = '0'); + + if (ENA = '1') then + if (mode_clear = '1') then + a_obf_l <= '1'; + a_inte1 <= '0'; + a_ibf <= '0'; + a_inte2 <= '0'; + a_intr <= '0'; + -- + b_inte <= '0'; + b_obf_l <= '1'; + b_ibf <= '0'; + b_intr <= '0'; + else + if (bit_mask(7) = '1') and we then + a_obf_l <= I_DATA(0); + else + if porta_we_rising then + a_obf_l <= '0'; + elsif (a_ack_l = '0') then + a_obf_l <= '1'; + end if; + end if; + -- + if (bit_mask(6) = '1') and we then a_inte1 <= I_DATA(0); end if; -- bus set when mode1 & input? + -- + if (bit_mask(5) = '1') and we then + a_ibf <= I_DATA(0); + else + if porta_re_rising then + a_ibf <= '0'; + elsif (a_stb_l = '0') then + a_ibf <= '1'; + end if; + end if; + -- + if (bit_mask(4) = '1') and we then a_inte2 <= I_DATA(0); end if; -- bus set when mode1 & output? + -- + set1 := a_ack_l_rising and (a_obf_l = '1') and (a_inte1 = '1'); + set2 := a_stb_l_rising and (a_ibf = '1') and (a_inte2 = '1'); + -- + if (bit_mask(3) = '1') and we then + a_intr <= I_DATA(0); + else + if (groupa_mode(1) = '1') then + if (porta_we = '1') or (porta_re = '1') then + a_intr <= '0'; + elsif set1 or set2 then + a_intr <= '1'; + end if; + else + if (r_control(4) = '0') then -- output + if (porta_we = '1') then -- falling ? + a_intr <= '0'; + elsif set1 then + a_intr <= '1'; + end if; + elsif (r_control(4) = '1') then -- input + if (porta_re = '1') then -- falling ? + a_intr <= '0'; + elsif set2 then + a_intr <= '1'; + end if; + end if; + end if; + end if; + -- + if (bit_mask(2) = '1') and we then b_inte <= I_DATA(0); end if; -- bus set? + + if (bit_mask(1) = '1') and we then + b_obf_l <= I_DATA(0); + else + if (r_control(1) = '0') then -- output + if portb_we_rising then + b_obf_l <= '0'; + elsif (b_ack_l = '0') then + b_obf_l <= '1'; + end if; + else + if portb_re_rising then + b_ibf <= '0'; + elsif (b_stb_l = '0') then + b_ibf <= '1'; + end if; + end if; + end if; + + if (bit_mask(0) = '1') and we then + b_intr <= I_DATA(0); + else + if (r_control(1) = '0') then -- output + if (portb_we = '1') then -- falling ? + b_intr <= '0'; + elsif b_ack_l_rising and (b_obf_l = '1') and (b_inte = '1') then + b_intr <= '1'; + end if; + else + if (portb_re = '1') then -- falling ? + b_intr <= '0'; + elsif b_stb_l_rising and (b_ibf = '1') and (b_inte = '1') then + b_intr <= '1'; + end if; + end if; + end if; + + end if; + end if; + end if; + end process; + + p_porta : process(r_control, groupa_mode, r_porta, I_PA, porta_ipreg, a_ack_l) + begin + -- D4 GROUPA porta 1 = input, 0 = output + O_PA <= x"FF"; -- if not driven, float high + O_PA_OE_L <= x"FF"; + porta_read <= x"00"; + + if (groupa_mode = "00") then -- simple io + if (r_control(4) = '0') then -- output + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= I_PA; + elsif (groupa_mode = "01") then -- strobed + if (r_control(4) = '0') then -- output + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= porta_ipreg; + else -- if (groupa_mode(1) = '1') then -- bi dir + if (a_ack_l = '0') then -- output enable + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= porta_ipreg; -- latched data + end if; + + end process; + + p_portb : process(r_control, groupb_mode, r_portb, I_PB, portb_ipreg) + begin + O_PB <= x"FF"; -- if not driven, float high + O_PB_OE_L <= x"FF"; + portb_read <= x"00"; + + if (groupb_mode = '0') then -- simple io + if (r_control(1) = '0') then -- output + O_PB <= r_portb; + O_PB_OE_L <= x"00"; + end if; + portb_read <= I_PB; + else -- strobed mode + if (r_control(1) = '0') then -- output + O_PB <= r_portb; + O_PB_OE_L <= x"00"; + end if; + portb_read <= portb_ipreg; + end if; + end process; + + p_portc_out : process(r_portc, r_control, groupa_mode, groupb_mode, + a_obf_l, a_ibf, a_intr,b_obf_l, b_ibf, b_intr) + begin + O_PC <= x"FF"; -- if not driven, float high + O_PC_OE_L <= x"FF"; + + -- bits 7..4 + if (groupa_mode = "00") then -- simple io + if (r_control(3) = '0') then -- output + O_PC (7 downto 4) <= r_portc(7 downto 4); + O_PC_OE_L(7 downto 4) <= x"0"; + end if; + elsif (groupa_mode = "01") then -- mode1 + + if (r_control(4) = '0') then -- port a output + O_PC (7) <= a_obf_l; + O_PC_OE_L(7) <= '0'; + -- 6 is ack_l input + if (r_control(3) = '0') then -- port c output + O_PC (5 downto 4) <= r_portc(5 downto 4); + O_PC_OE_L(5 downto 4) <= "00"; + end if; + else -- port a input + if (r_control(3) = '0') then -- port c output + O_PC (7 downto 6) <= r_portc(7 downto 6); + O_PC_OE_L(7 downto 6) <= "00"; + end if; + O_PC (5) <= a_ibf; + O_PC_OE_L(5) <= '0'; + -- 4 is stb_l input + end if; + + else -- if (groupa_mode(1) = '1') then -- mode2 + O_PC (7) <= a_obf_l; + O_PC_OE_L(7) <= '0'; + -- 6 is ack_l input + O_PC (5) <= a_ibf; + O_PC_OE_L(5) <= '0'; + -- 4 is stb_l input + end if; + + -- bit 3 (controlled by group a) + if (groupa_mode = "00") then -- group a steals this bit + --if (groupb_mode = '0') then -- we will let bit 3 be driven, data sheet is a bit confused about this + if (r_control(0) = '0') then -- ouput (note, groupb control bit) + O_PC (3) <= r_portc(3); + O_PC_OE_L(3) <= '0'; + end if; + -- + else -- stolen + O_PC (3) <= a_intr; + O_PC_OE_L(3) <= '0'; + end if; + + -- bits 2..0 + if (groupb_mode = '0') then -- simple io + if (r_control(0) = '0') then -- output + O_PC (2 downto 0) <= r_portc(2 downto 0); + O_PC_OE_L(2 downto 0) <= "000"; + end if; + else + -- mode 1 + -- 2 is input + if (r_control(1) = '0') then -- output + O_PC (1) <= b_obf_l; + O_PC_OE_L(1) <= '0'; + else -- input + O_PC (1) <= b_ibf; + O_PC_OE_L(1) <= '0'; + end if; + O_PC (0) <= b_intr; + O_PC_OE_L(0) <= '0'; + end if; + end process; + + p_portc_in : process(r_portc, I_PC, r_control, groupa_mode, groupb_mode, a_ibf, b_obf_l, + a_obf_l, a_inte1, a_inte2, a_intr, b_inte, b_ibf, b_intr) + begin + portc_read <= x"00"; + + a_stb_l <= '1'; + a_ack_l <= '1'; + b_stb_l <= '1'; + b_ack_l <= '1'; + + if (groupa_mode = "01") then -- mode1 or 2 + if (r_control(4) = '0') then -- port a output + a_ack_l <= I_PC(6); + else -- port a input + a_stb_l <= I_PC(4); + end if; + elsif (groupa_mode(1) = '1') then -- mode 2 + a_ack_l <= I_PC(6); + a_stb_l <= I_PC(4); + end if; + + if (groupb_mode = '1') then + if (r_control(1) = '0') then -- output + b_ack_l <= I_PC(2); + else -- input + b_stb_l <= I_PC(2); + end if; + end if; + + if (groupa_mode = "00") then -- simple io + portc_read(7 downto 3) <= I_PC(7 downto 3); + elsif (groupa_mode = "01") then + if (r_control(4) = '0') then -- port a output + portc_read(7 downto 3) <= a_obf_l & a_inte1 & I_PC(5 downto 4) & a_intr; + else -- input + portc_read(7 downto 3) <= I_PC(7 downto 6) & a_ibf & a_inte2 & a_intr; + end if; + else -- mode 2 + portc_read(7 downto 3) <= a_obf_l & a_inte1 & a_ibf & a_inte2 & a_intr; + end if; + + if (groupb_mode = '0') then -- simple io + portc_read(2 downto 0) <= I_PC(2 downto 0); + else + if (r_control(1) = '0') then -- output + portc_read(2 downto 0) <= b_inte & b_obf_l & b_intr; + else -- input + portc_read(2 downto 0) <= b_inte & b_ibf & b_intr; + end if; + end if; + end process; + + p_ipreg : process + begin + wait until rising_edge(CLK); + -- pc4 input a_stb_l + -- pc2 input b_stb_l + + if (ENA = '1') then + if (a_stb_l = '0') then + porta_ipreg <= I_PA; + end if; + + if (mode_clear = '1') then + portb_ipreg <= (others => '0'); + elsif (b_stb_l = '0') then + portb_ipreg <= I_PB; + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/keyboard.v b/Arcade/Scramble Hardware/Scramble_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Scramble Hardware/Scramble_MiST/rtl/mist_io.v b/Arcade/Scramble Hardware/Scramble_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_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/Arcade/Scramble Hardware/Scramble_MiST/rtl/osd.v b/Arcade/Scramble Hardware/Scramble_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_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/Arcade/Scramble Hardware/Scramble_MiST/rtl/pll.qip b/Arcade/Scramble Hardware/Scramble_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_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/Arcade/Scramble Hardware/Scramble_MiST/rtl/pll.v b/Arcade/Scramble Hardware/Scramble_MiST/rtl/pll.v new file mode 100644 index 00000000..1d3529bd --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 78, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 71, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "78" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.576923" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "71" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.57627100" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "78" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "71" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Scramble Hardware/Scramble_MiST/rtl/scandoubler.v b/Arcade/Scramble Hardware/Scramble_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Arcade/Scramble Hardware/Scramble_MiST/rtl/scramble.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/scramble.vhd new file mode 100644 index 00000000..ff810859 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/scramble.vhd @@ -0,0 +1,587 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE is + port ( + I_HWSEL_FROGGER : in boolean; + -- + O_VIDEO_R : out std_logic_vector(3 downto 0); + O_VIDEO_G : out std_logic_vector(3 downto 0); + O_VIDEO_B : out std_logic_vector(3 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + -- to audio board + -- + O_ADDR : out std_logic_vector(15 downto 0); + O_DATA : out std_logic_vector( 7 downto 0); + I_DATA : in std_logic_vector( 7 downto 0); + I_DATA_OE_L : in std_logic; + O_RD_L : out std_logic; + O_WR_L : out std_logic; + O_IOPC7 : out std_logic; + O_RESET_WD_L : out std_logic; + -- + ENA : in std_logic; + ENAB : in std_logic; + ENA_12 : in std_logic; + -- + RESET : in std_logic; -- active high + CLK : in std_logic + ); +end; + +architecture RTL of SCRAMBLE is + + type array_4x8 is array (0 to 3) of std_logic_vector(7 downto 0); + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal reset_wd_l : std_logic; + + -- timing decode + signal do_hsync : boolean; + signal set_vblank : boolean; + signal vsync : std_logic; + signal hsync : std_logic; + signal vblank : std_logic; + signal hblank : std_logic; + -- + -- cpu + signal cpu_ena : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_wr_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal page_4to7_l : std_logic; + + signal wren : std_logic; + + signal objen_l : std_logic; + signal waen_l : std_logic; + + signal objramrd_l : std_logic; + signal vramrd_l : std_logic; + + signal select_l : std_logic; + signal objramwr_l : std_logic; + signal vramwr_l : std_logic; + + -- control reg + signal control_reg : std_logic_vector(7 downto 0); + signal intst_l : std_logic; + signal iopc7 : std_logic; + signal pout1 : std_logic; + signal starson : std_logic; + signal hcma : std_logic; + signal vcma : std_logic; + + signal pgm_rom_dout : array_4x8; + signal rom_dout : std_logic_vector(7 downto 0); + signal ram_dout : std_logic_vector(7 downto 0); + signal ram_ena : std_logic; + + signal vram_data : std_logic_vector(7 downto 0); + +begin + + O_HBLANK <= hblank; + O_VBLANK <= vblank; + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(CLK); + if (ENA = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + p_sync_comb : process(hcnt, vcnt) + begin + vsync <= not vcnt(8); + do_hsync <= (hcnt = "010101111"); -- 0AF + set_vblank <= (vcnt = "111101111"); -- 1EF + end process; + + p_sync : process + begin + wait until rising_edge(CLK); + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + if (ENA = '1') then + if (hcnt = "010000001") then -- 081 + hblank <= '1'; + elsif (hcnt = "011111111") then -- 0f9 + hblank <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if set_vblank then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + p_video_timing_reg : process + begin + wait until rising_edge(CLK); + -- match output delay in video module + if (ENA = '1') then + O_HSYNC <= HSYNC; + O_VSYNC <= VSYNC; + end if; + end process; + + p_cpu_ena : process(hcnt, ENA) + begin + -- cpu clocked on rising edge of 1h, late + cpu_ena <= ENA and hcnt(0); -- 1h + end process; + -- + -- video + -- + u_video : entity work.SCRAMBLE_VIDEO + port map ( + I_HWSEL_FROGGER => I_HWSEL_FROGGER, + -- + I_HCNT => hcnt, + I_VCNT => vcnt, + I_VBLANK => vblank, + I_VSYNC => vsync, + + I_VCMA => vcma, + I_HCMA => hcma, + -- + I_CPU_ADDR => cpu_addr, + I_CPU_DATA => cpu_data_out, + O_VRAM_DATA => vram_data, + -- note, looks like the real hardware cannot read from object ram + -- + I_VRAMWR_L => vramwr_l, + I_VRAMRD_L => vramrd_l, + I_OBJRAMWR_L => objramwr_l, + I_OBJRAMRD_L => objramrd_l, + I_OBJEN_L => objen_l, + -- + I_STARSON => starson, + I_POUT1 => pout1, + -- + O_VIDEO_R => O_VIDEO_R, + O_VIDEO_G => O_VIDEO_G, + O_VIDEO_B => O_VIDEO_B, + -- + ENA => ENA, + ENAB => ENAB, + ENA_12 => ENA_12, + CLK => CLK + ); + + -- other cpu signals + reset_wd_l <= not RESET; -- FIX + + p_cpu_wait : process(vblank, hblank, waen_l) + begin + -- this is done a bit differently, the original had a late + -- clock to the cpu, and as mreq came out a litle early it could assert + -- wait and then gate off the write strobe to vram/objram in time. + -- + -- we are a nice synchronous system therefore we need to do this combinatorially. + -- timing is still ok. + -- + if (vblank = '1') then + cpu_wait_l <='1'; + else + cpu_wait_l <= '1'; + if (hblank = '0') and (waen_l = '0') then + cpu_wait_l <= '0'; + end if; + end if; + end process; + wren <= cpu_wait_l; + + p_cpu_int : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (intst_l = '0') then + cpu_nmi_l <= '1'; + else + if do_hsync and set_vblank then + cpu_nmi_l <= '0'; + end if; + end if; + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => reset_wd_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => open, + MREQ_n => cpu_mreq_l, + IORQ_n => open, + RD_n => cpu_rd_l, + WR_n => cpu_wr_l, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + -- + -- primary addr decode + -- + p_mem_decode : process(cpu_rfsh_l, cpu_rd_l, cpu_wr_l, cpu_mreq_l, cpu_addr, I_HWSEL_FROGGER) + begin + -- Scramble map + --0000-3fff ROM + --4000-47ff RAM + --4800-4bff Video RAM + --5000-50ff Object RAM + --5000-503f screen attributes + --5040-505f sprites + --5060-507f bullets + --5080-50ff unused? + + --read: + --7000 Watchdog Reset (Scramble) + --8100 IN0 + --8101 IN1 + --8102 IN2 (bits 5 and 7 used for protection check in Scramble) + + --write: + --6800-6807 control reg + --8200 To AY-3-8910 port A (commands for the audio CPU) + --8201 bit 3 = interrupt trigger on audio CPU bit 4 = AMPM (?) + --8202 protection check control? + + -- Frogger map + --0000-3fff ROM + --8000-87ff RAM + --a800-abff Video RAM + --b000-b0ff Object RAM + --b000-b03f screen attributes + --b040-b05f sprites + --b060-b0ff unused? + + --read: + --8800 Watchdog Reset + --e000 IN0 + --e002 IN1 + --e004 IN2 + cpu_int_l <= '1'; + cpu_busrq_l <= '1'; + + page_4to7_l <= '1'; + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + + if I_HWSEL_FROGGER then + cpu_int_l <= '0'; + cpu_busrq_l <= cpu_addr(15); + end if; + + if not I_HWSEL_FROGGER then + if (cpu_addr(15 downto 14) = "01") then page_4to7_l <= '0'; end if; + else + if (cpu_addr(15 downto 14) = "10") then page_4to7_l <= '0'; end if; + end if; + end if; + + end process; + + p_mem_decode2 : process(I_HWSEL_FROGGER, cpu_addr, page_4to7_l, cpu_rfsh_l, cpu_rd_l, cpu_wr_l, wren) + begin + waen_l <= '1'; + objen_l <= '1'; + if not I_HWSEL_FROGGER then + if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(13 downto 11) = "001") then waen_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "010") then objen_l <= '0'; end if; + end if; + else + if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(13 downto 11) = "101") then waen_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "110") then objen_l <= '0'; end if; + end if; + end if; + + -- read decode + vramrd_l <= '1'; + objramrd_l <= '1'; + + if not I_HWSEL_FROGGER then + if (page_4to7_l = '0') and (cpu_rd_l = '0') then + if (cpu_addr(13 downto 11) = "001") then vramrd_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "010") then objramrd_l <= '0'; end if; + end if; + else + if (page_4to7_l = '0') and (cpu_rd_l = '0') then + if (cpu_addr(13 downto 11) = "101") then vramrd_l <= '0'; end if; + end if; + end if; + -- write decode + vramwr_l <= '1'; + objramwr_l <= '1'; + select_l <= '1'; + + if not I_HWSEL_FROGGER then + if (page_4to7_l = '0') and (cpu_wr_l = '0') and (wren = '1') then + if (cpu_addr(13 downto 11) = "001") then vramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "010") then objramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "101") then select_l <= '0'; end if; -- control reg + end if; + else + if (page_4to7_l = '0') and (cpu_wr_l = '0') and (wren = '1') then + if (cpu_addr(13 downto 11) = "101") then vramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "110") then objramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "111") then select_l <= '0'; end if; -- control reg + end if; + end if; + end process; + + p_control_reg : process + variable addr : std_logic_vector(2 downto 0); + variable dec : std_logic_vector(7 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + -- scramble + --6801 interrupt enable + --6802 coin counter + --6803 ? (POUT1) + --6804 stars on + --6805 ? (POUT2) + --6806 screen vertical flip + --6807 screen horizontal flip + if not I_HWSEL_FROGGER then + addr := cpu_addr(2 downto 0); + else + addr := cpu_addr(4 downto 2); + end if; + + dec := "00000000"; + if (select_l = '0') then + case addr(2 downto 0) is + when "000" => dec := "00000001"; + when "001" => dec := "00000010"; + when "010" => dec := "00000100"; + when "011" => dec := "00001000"; + when "100" => dec := "00010000"; + when "101" => dec := "00100000"; + when "110" => dec := "01000000"; + when "111" => dec := "10000000"; + when others => null; + end case; + end if; + + if (reset_wd_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (dec(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + p_control_reg_assign : process(control_reg, I_HWSEL_FROGGER) + begin + if not I_HWSEL_FROGGER then + -- Scramble + intst_l <= control_reg(1); + iopc7 <= control_reg(2); + pout1 <= control_reg(3); + starson <= control_reg(4); + hcma <= control_reg(6); + vcma <= control_reg(7); + else + intst_l <= control_reg(2); + iopc7 <= control_reg(6); + pout1 <= control_reg(7); + starson <= '0'; + hcma <= control_reg(4); + vcma <= control_reg(3); + end if; + end process; + -- + -- + -- roms / rams + pgm_rom : entity work.ROM_PGM + port map (CLK => CLK, ADDR => cpu_addr(13 downto 0), DATA => rom_dout); +-- pgm_rom01 : entity work.ROM_PGM_01 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(0)); +-- pgm_rom23 : entity work.ROM_PGM_23 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(1)); +-- pgm_rom45 : entity work.ROM_PGM_45 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(2)); +-- pgm_rom56 : entity work.ROM_PGM_67 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(3)); + +-- p_rom_mux : process(cpu_addr, pgm_rom_dout) +-- begin +-- rom_dout <= (others => '0'); +-- case cpu_addr(13 downto 12) is +-- when "00" => rom_dout <= pgm_rom_dout(0); +-- when "01" => rom_dout <= pgm_rom_dout(1); +-- when "10" => rom_dout <= pgm_rom_dout(2); +-- when "11" => rom_dout <= pgm_rom_dout(3); +-- when others => null; +-- end case; +-- end process; + + u_cpu_ram : work.dpram generic map (11,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => ram_ena and (not cpu_wr_l), + + addr_a_i => cpu_addr(10 downto 0), + data_a_i => cpu_data_out, + + clk_b_i => clk, + addr_b_i => cpu_addr(10 downto 0), + data_b_o => ram_dout + ); + + p_ram_ctrl : process(cpu_addr, page_4to7_l) + begin + ram_ena <= '0'; + if (page_4to7_l = '0') and (cpu_addr(13 downto 11) = "000") then + ram_ena <= '1'; + end if; + end process; + + p_cpu_data_in_mux : process(I_HWSEL_FROGGER, cpu_addr, cpu_rd_l, cpu_mreq_l, cpu_rfsh_l, ram_dout, rom_dout, vramrd_l, vram_data, I_DATA_OE_L, I_DATA ) + variable ram_addr : std_logic_vector(1 downto 0); + begin + + if not I_HWSEL_FROGGER then + ram_addr := "01"; + else + ram_addr := "10"; + end if; + + cpu_data_in <= (others => '0'); + if (vramrd_l = '0') then + cpu_data_in <= vram_data; + -- + elsif (I_DATA_OE_L = '0') then + cpu_data_in <= I_DATA; + -- + elsif (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(15 downto 14) = "00") and (cpu_rd_l = '0') and (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + cpu_data_in <= rom_dout; + -- + elsif (cpu_addr(15 downto 14) = ram_addr) then + if (cpu_addr(13 downto 11) = "000") and (cpu_rd_l = '0') then + cpu_data_in <= ram_dout; + else + cpu_data_in <= x"FF"; + end if; + end if; + else + cpu_data_in <= x"FF"; + end if; + + end process; + + -- to audio + O_ADDR <= cpu_addr; + O_DATA <= cpu_data_out; + O_RD_L <= cpu_rd_l; + O_WR_L <= cpu_wr_l; + O_IOPC7 <= iopc7; + O_RESET_WD_L <= reset_wd_l; + +end RTL; \ No newline at end of file diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/scramble_audio.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/scramble_audio.vhd new file mode 100644 index 00000000..bfa13763 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/scramble_audio.vhd @@ -0,0 +1,842 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE_AUDIO is + port ( + I_HWSEL_FROGGER : in boolean; + -- + I_ADDR : in std_logic_vector(15 downto 0); + I_DATA : in std_logic_vector( 7 downto 0); + O_DATA : out std_logic_vector( 7 downto 0); + O_DATA_OE_L : out std_logic; + -- + I_RD_L : in std_logic; + I_WR_L : in std_logic; + I_IOPC7 : in std_logic; + -- + O_AUDIO : out std_logic_vector( 9 downto 0); + -- + I_1P_CTRL : in std_logic_vector( 6 downto 0); -- start, shoot1, shoot2, left,right,up,down + I_2P_CTRL : in std_logic_vector( 6 downto 0); -- start, shoot1, shoot2, left,right,up,down + I_SERVICE : in std_logic; + I_COIN1 : in std_logic; + I_COIN2 : in std_logic; + O_COIN_COUNTER : out std_logic; + -- + I_DIP : in std_logic_vector( 5 downto 1); + -- + I_RESET_L : in std_logic; + ENA : in std_logic; -- 6 MHz + ENA_1_79 : in std_logic; -- 1.78975 MHz + CLK : in std_logic + ); +end; + +architecture RTL of SCRAMBLE_AUDIO is + + signal reset : std_logic; + signal cpu_ena : std_logic; + signal cpu_ena_gated : std_logic; + -- + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_wr_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + -- + signal ram_cs : std_logic; + signal rom_oe : std_logic; + signal filter_load : std_logic; + signal filter_reg : std_logic_vector(11 downto 0); + -- + signal cpu_rom0_dout : std_logic_vectoR(7 downto 0); + signal cpu_rom1_dout : std_logic_vectoR(7 downto 0); + signal cpu_rom2_dout : std_logic_vectoR(7 downto 0); + signal rom_active : std_logic; + + signal rom_dout : std_logic_vector(7 downto 0); + signal ram_dout : std_logic_vector(7 downto 0); + -- + signal i8255_addr : std_logic_vector(1 downto 0); + signal i8255_1D_data : std_logic_vector(7 downto 0); + signal i8255_1D_data_oe_l : std_logic; + signal i8255_1D_cs_l : std_logic; + signal i8255_1D_pa_out : std_logic_vector(7 downto 0); + signal i8255_1D_pb_out : std_logic_vector(7 downto 0); + -- + signal i8255_1E_data : std_logic_vector(7 downto 0); + signal i8255_1E_data_oe_l : std_logic; + signal i8255_1E_cs_l : std_logic; + signal i8255_1E_pa : std_logic_vector(7 downto 0); + signal i8255_1E_pb : std_logic_vector(7 downto 0); + signal i8255_1E_pc : std_logic_vector(7 downto 0); + + -- security + signal net_1e10_i : std_logic; + signal net_1e12_i : std_logic; + signal xb : std_logic_vector(7 downto 0); + signal xbo : std_logic_vector(7 downto 0); + + signal audio_div_cnt : std_logic_vector( 8 downto 0) := (others => '0'); + signal ls90_op : std_logic_vector(3 downto 0); + signal ls90_clk : std_logic; + signal ls90_cnt : std_logic_vector( 3 downto 0) := (others => '0'); + -- ym2149 3C + signal ym2149_3C_dv : std_logic_vector(7 downto 0); + signal ym2149_3C_oe_l : std_logic; + signal ym2149_3C_bdir : std_logic; + signal ym2149_3C_bc2 : std_logic; + signal ym2149_3C_bc1 : std_logic; + signal ym2149_3C_audio : std_logic_vector(7 downto 0); + signal ym2149_3C_chan : std_logic_vector(1 downto 0); + signal ym2149_3C_chan_t1 : std_logic_vector(1 downto 0); + -- + -- ym2149 3D + signal ym2149_3D_dv : std_logic_vector(7 downto 0); + signal ym2149_3D_oe_l : std_logic; + signal ym2149_3D_bdir : std_logic; + signal ym2149_3D_bc2 : std_logic; + signal ym2149_3D_bc1 : std_logic; + signal ym2149_3D_audio : std_logic_vector(7 downto 0); + signal ym2149_3D_chan : std_logic_vector(1 downto 0); + signal ym2149_3D_chan_t1 : std_logic_vector(1 downto 0); + signal ym2149_3D_ioa_in : std_logic_vector(7 downto 0); + signal ym2149_3D_ioa_out : std_logic_vector(7 downto 0); + signal ym2149_3D_ioa_oe_l : std_logic; + signal ym2149_3D_iob_in : std_logic_vector(7 downto 0); + -- + signal ampm : std_logic; + signal sint : std_logic; + signal sint_t1 : std_logic; + -- + signal audio_3C_mix : std_logic_vector(9 downto 0); + signal audio_3C_final : std_logic_vector(9 downto 0); + signal audio_3D_mix : std_logic_vector(9 downto 0); + signal audio_3D_final : std_logic_vector(9 downto 0); + signal audio_final : std_logic_vector(10 downto 0); + + signal security_count : std_logic_vector(2 downto 0); + signal rd_l_t1 : std_logic; + -- filters + signal ym2149_3C_k : std_logic_vector(16 downto 0); + signal ym2149_3D_k : std_logic_vector(16 downto 0); + signal audio_in_m_out_3C : std_logic_vector(17 downto 0); + signal audio_in_m_out_3D : std_logic_vector(17 downto 0); + signal audio_mult_3C : std_logic_vector(35 downto 0); + signal audio_mult_3D : std_logic_vector(35 downto 0); + + + + type array_4of17 is array (3 downto 0) of std_logic_vector(16 downto 0); + constant K_Filter : array_4of17 := ('0' & x"00A3", + '0' & x"00C6", + '0' & x"039D", + '1' & x"0000" ); + + type filter_pipe is array (3 downto 0) of std_logic_vector(17 downto 0); + signal ym2149_3C_audio_pipe : filter_pipe; + signal ym2149_3D_audio_pipe : filter_pipe; + -- LP filter out = in.k + out_t1.(1-k) + -- + -- = (in-out_t1).k + out_t1 + -- + -- using + -- -(Ts.2.PI.Fc) + -- k = 1-e + -- + -- sampling freq = 1.79 MHz + -- + -- cut off freqs bit 0 1 + -- + --0.267uf ~ 713 Hz 1 1 0.00249996 x 00A3 + --0.220uf ~ 865 Hz 1 0 0.00303210 x 00C6 + --0.047uf ~ 4050 Hz 0 1 0.01411753 x 039D + -- 0 0 x10000 + +begin + -- scramble + --0000-1fff ROM + --8000-83ff RAM + + -- frogger + --0000-17ff ROM + --4000-43ff RAM + + cpu_ena <= '1'; -- run at audio clock speed + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + cpu_wait_l <= '1'; + -- + cpu_ena_gated <= ENA_1_79 and cpu_ena; + u_cpu : entity work.T80sed + port map ( + RESET_n => I_RESET_L, + CLK_n => CLK, + CLKEN => cpu_ena_gated, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => cpu_wr_l, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + + p_cpu_int : process(CLK, I_RESET_L) + begin + if (I_RESET_L = '0') then + cpu_int_l <= '1'; + sint_t1 <= '0'; + elsif rising_edge(CLK) then + if (ENA_1_79 = '1') then + sint_t1 <= sint; + + if (cpu_m1_l = '0') and (cpu_iorq_l = '0') then + cpu_int_l <= '1'; + elsif (sint = '0') and (sint_t1 = '1') then + cpu_int_l <= '0'; + end if; + end if; + end if; + end process; + + p_mem_decode_comb : process(cpu_rfsh_l, cpu_wr_l, cpu_rd_l, cpu_mreq_l, cpu_addr, I_HWSEL_FROGGER) + variable decode : std_logic; + begin + if not I_HWSEL_FROGGER then + decode := '0'; + if (cpu_rfsh_l = '1') and (cpu_mreq_l = '0') and (cpu_addr(15) = '1') then + decode := '1'; + end if; + + filter_load <= decode and cpu_addr(12) and (not cpu_wr_l); + ram_cs <= decode and (not cpu_addr(12)); + else + decode := '0'; + if (cpu_rfsh_l = '1') and (cpu_mreq_l = '0') and (cpu_addr(14) = '1') then + decode := '1'; + end if; + + filter_load <= decode and cpu_addr(13) and (not cpu_wr_l); + ram_cs <= decode and (not cpu_addr(13)); + end if; + + rom_oe <= '0'; + if not I_HWSEL_FROGGER then + if (cpu_addr(15) = '0') and (cpu_mreq_l = '0') and (cpu_rd_l = '0') then + rom_oe <= '1'; + end if; + else + if (cpu_addr(14) = '0') and (cpu_mreq_l = '0') and (cpu_rd_l = '0') then + rom_oe <= '1'; + end if; + end if; + + end process; + + u_rom_5c : entity work.ROM_SND_0 + port map ( + CLK => CLK, + ADDR => cpu_addr(10 downto 0), + DATA => cpu_rom0_dout + ); + + u_rom_5d : entity work.ROM_SND_1 + port map ( + CLK => CLK, + ADDR => cpu_addr(10 downto 0), + DATA => cpu_rom1_dout + ); + + u_rom_5e : entity work.ROM_SND_2 + port map ( + CLK => CLK, + ADDR => cpu_addr(10 downto 0), + DATA => cpu_rom2_dout + ); + + p_rom_mux : process(I_HWSEL_FROGGER, cpu_rom0_dout, cpu_rom1_dout, cpu_rom2_dout, cpu_addr, rom_oe) + variable rom_oe_decode : std_logic; + variable cpu_rom0_dout_s : std_logic_vector(7 downto 0); + begin + if not I_HWSEL_FROGGER then + cpu_rom0_dout_s := cpu_rom0_dout; + else -- swap bits 0 and 1 + cpu_rom0_dout_s := cpu_rom0_dout(7 downto 2) & cpu_rom0_dout(0) & cpu_rom0_dout(1); + end if; + + rom_dout <= (others => '0'); + rom_oe_decode := '0'; + case cpu_addr(13 downto 11) is + when "000" => rom_dout <= cpu_rom0_dout_s; rom_oe_decode := '1'; + when "001" => rom_dout <= cpu_rom1_dout; rom_oe_decode := '1'; + when "010" => rom_dout <= cpu_rom2_dout; rom_oe_decode := '1'; + when others => null; + end case; + + rom_active <= '0'; + if (rom_oe = '1') then + rom_active <= rom_oe_decode; + end if; + end process; + + u_ram_6c_6d : work.dpram generic map (10,8) + port map + ( + addr_a_i => cpu_addr(9 downto 0), + data_a_i => cpu_data_out, + clk_b_i => clk, + addr_b_i => cpu_addr(9 downto 0), + data_b_o => ram_dout, + we_i => ram_cs and (not cpu_wr_l), + en_a_i => ENA_1_79, + clk_a_i => clk + ); + + p_cpu_data_mux : process(rom_dout, rom_active, ram_dout, ym2149_3C_oe_l, ym2149_3C_dv, ym2149_3D_oe_l, ym2149_3D_dv, ram_cs, cpu_wr_l) + begin + if (rom_active = '1') then + cpu_data_in <= rom_dout; + elsif (ram_cs = '1') and (cpu_wr_l = '1') then + cpu_data_in <= ram_dout; + elsif (ym2149_3C_oe_l = '0') then + cpu_data_in <= ym2149_3C_dv; + elsif (ym2149_3D_oe_l = '0') then + cpu_data_in <= ym2149_3D_dv; + else + cpu_data_in <= (others => '1'); -- float high + end if; + end process; + + p_filter_reg : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + if (filter_load = '1') then + filter_reg <= cpu_addr(11 downto 0); + end if; + end if; + end process; + + p_8255_decode : process(I_RESET_L, I_ADDR, I_HWSEL_FROGGER) + begin + reset <= not I_RESET_L; + i8255_1D_cs_l <= '1'; + i8255_1E_cs_l <= '1'; + + if not I_HWSEL_FROGGER then + -- the interface one + if (I_ADDR(9) = '1') and (I_ADDR(15) = '1') then + i8255_1D_cs_l <= '0'; + end if; + + -- the button one + if (I_ADDR(8) = '1') and (I_ADDR(15) = '1') then + i8255_1E_cs_l <= '0'; + end if; + i8255_addr <= I_ADDR(1 downto 0); + else + -- the interface one + if (I_ADDR(12) = '1') and (I_ADDR(15 downto 14) = "11") then + i8255_1D_cs_l <= '0'; + end if; + + -- the button one + if (I_ADDR(13) = '1') and (I_ADDR(15 downto 14) = "11") then + i8255_1E_cs_l <= '0'; + end if; + i8255_addr <= I_ADDR(2 downto 1); + end if; + end process; + + p_ym_decode : process(cpu_rd_l, cpu_wr_l, cpu_iorq_l, cpu_addr, I_HWSEL_FROGGER) + variable rd_3c : std_logic; + variable wr_3c : std_logic; + variable ad_3c : std_logic; + -- + variable rd_3d : std_logic; + variable wr_3d : std_logic; + variable ad_3d : std_logic; + begin + + --bdir bc2 bc1 + -- 0 0 0 nop + -- 0 0 1 addr latch < WR_L AV4 / AV6 + -- 0 1 0 nop + -- 0 1 1 data read < RD_L AV5 / AV7 + + -- 1 0 0 addr latch + -- 1 0 1 nop + -- 1 1 0 data write < WR_L AV5 / AV7 + -- 1 1 1 addr latch + + + if not I_HWSEL_FROGGER then + rd_3c := (not cpu_rd_l) and (not cpu_iorq_l) and cpu_addr(5); + wr_3c := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(5); + ad_3c := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(4); + else + rd_3c := '0'; + wr_3c := '0'; + ad_3c := '0'; + end if; + + ym2149_3C_bdir <= wr_3c; + ym2149_3C_bc2 <= rd_3c or wr_3c; + ym2149_3C_bc1 <= rd_3c or ad_3c; + + + if not I_HWSEL_FROGGER then + rd_3d := (not cpu_rd_l) and (not cpu_iorq_l) and cpu_addr(7); + wr_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(7); + ad_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(6); + else + rd_3d := (not cpu_rd_l) and (not cpu_iorq_l) and cpu_addr(6); + wr_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(6); + ad_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(7); + end if; + + ym2149_3D_bdir <= wr_3d; + ym2149_3D_bc2 <= rd_3d or wr_3d; + ym2149_3D_bc1 <= rd_3d or ad_3d; + + end process; + + i8255_1E_pa(7) <= I_COIN1; + i8255_1E_pa(6) <= I_COIN2; + i8255_1E_pa(5) <= I_1P_CTRL(3); -- left + i8255_1E_pa(4) <= I_1P_CTRL(2); -- right + i8255_1E_pa(3) <= I_1P_CTRL(4); -- shoot1 + i8255_1E_pa(2) <= I_SERVICE; + i8255_1E_pa(1) <= I_1P_CTRL(5); -- shoot2 + i8255_1E_pa(0) <= I_2P_CTRL(1); -- up + + i8255_1E_pb(7) <= I_1P_CTRL(6); -- start + i8255_1E_pb(6) <= I_2P_CTRL(6); -- start + i8255_1E_pb(5) <= I_2P_CTRL(3); -- left + i8255_1E_pb(4) <= I_2P_CTRL(2); -- right + i8255_1E_pb(3) <= I_2P_CTRL(4); -- shoot1 + i8255_1E_pb(2) <= I_2P_CTRL(5); -- shoot2 + i8255_1E_pb(1) <= I_DIP(1); + i8255_1E_pb(0) <= I_DIP(2); + + i8255_1E_pc(7) <= net_1e10_i; + i8255_1E_pc(6) <= I_1P_CTRL(0); -- down + i8255_1E_pc(5) <= net_1e12_i; + i8255_1E_pc(4) <= I_1P_CTRL(1); -- up + i8255_1E_pc(3) <= I_DIP(3); + i8255_1E_pc(2) <= I_DIP(4); + i8255_1E_pc(1) <= I_DIP(5); + i8255_1E_pc(0) <= I_2P_CTRL(0); -- down + O_COIN_COUNTER <= not I_IOPC7; -- open drain actually + + -- + -- PIA CHIPS + -- + u_i8255_1D : entity work.I82C55 -- bus interface + port map ( + I_ADDR => i8255_addr, + I_DATA => I_DATA, + O_DATA => i8255_1D_data, + O_DATA_OE_L => i8255_1D_data_oe_l, + + I_CS_L => i8255_1D_cs_l, + I_RD_L => I_RD_L, + I_WR_L => I_WR_L, + + I_PA => i8255_1D_pa_out, + O_PA => i8255_1D_pa_out, + O_PA_OE_L => open, + + I_PB => i8255_1D_pb_out, + O_PB => i8255_1D_pb_out, + O_PB_OE_L => open, + + I_PC => xbo, + O_PC => xb, + O_PC_OE_L => open, + + RESET => reset, + ENA => ENA, + CLK => CLK + ); + + u_i8255_1E : entity work.I82C55 -- push button + port map ( + I_ADDR => i8255_addr, + I_DATA => I_DATA, + O_DATA => i8255_1E_data, + O_DATA_OE_L => i8255_1E_data_oe_l, + + I_CS_L => i8255_1E_cs_l, + I_RD_L => I_RD_L, + I_WR_L => I_WR_L, + + I_PA => i8255_1E_pa, + O_PA => open, + O_PA_OE_L => open, + + I_PB => i8255_1E_pb, + O_PB => open, + O_PB_OE_L => open, + + I_PC => i8255_1E_pc, + O_PC => open, + O_PC_OE_L => open, + + RESET => reset, + ENA => ENA, + CLK => CLK + ); + + p_i8255_1d_bus_control : process(i8255_1D_pa_out, i8255_1D_pb_out, ym2149_3D_ioa_out, ym2149_3D_ioa_oe_l) + begin + if (ym2149_3D_ioa_oe_l = '0') then + ym2149_3D_ioa_in <= ym2149_3D_ioa_out; + else + ym2149_3D_ioa_in <= i8255_1D_pa_out; + end if; + + ampm <= i8255_1D_pb_out(4); -- amp mute + sint <= i8255_1D_pb_out(3); -- set int + end process; + + p_drive_cpubus : process(i8255_1D_data, i8255_1D_data_oe_l, i8255_1E_data, i8255_1E_data_oe_l) + begin + O_DATA_OE_L <= '1'; + O_DATA <= (others => '0'); + -- + if (i8255_1D_data_oe_l = '0') then + -- + O_DATA_OE_L <= '0'; + O_DATA <= i8255_1D_data; + elsif (i8255_1E_data_oe_l = '0') then + -- + O_DATA_OE_L <= '0'; + O_DATA <= i8255_1E_data; + end if; + end process; + -- + -- AUDIO CHIPS + -- + p_audio_clockgen : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + audio_div_cnt <= audio_div_cnt - "1"; + ls90_clk <= not audio_div_cnt(8); + + if (audio_div_cnt(8 downto 0) = "000000000") then + if (ls90_cnt = x"9") then + ls90_cnt <= x"0"; + else + ls90_cnt <= ls90_cnt + "1"; + end if; + end if; + + ls90_op <= "0000"; + case ls90_cnt is --ls90 outputs DCBA + when x"0" => ls90_op <= "0000"; + when x"1" => ls90_op <= "0010"; + when x"2" => ls90_op <= "0100"; + when x"3" => ls90_op <= "0110"; + when x"4" => ls90_op <= "1000"; + when x"5" => ls90_op <= "0001"; + when x"6" => ls90_op <= "0011"; + when x"7" => ls90_op <= "0101"; + when x"8" => ls90_op <= "0111"; + when x"9" => ls90_op <= "1001"; + when others => ls90_op <= "0000"; + end case; + end if; + end process; + + p_ym2149_3d_iob_in : process(I_HWSEL_FROGGER, ls90_op, ls90_clk) + begin + if not I_HWSEL_FROGGER then + ym2149_3D_iob_in <= ls90_op(0) & ls90_op(3) & ls90_op(2) & ls90_clk & "1110"; + else + ym2149_3D_iob_in <= ls90_op(0) & ls90_op(3) & '1' & ls90_clk & ls90_op(2) & "110"; + end if; + end process; + + u_ym2149_3C : entity work.YM2149 -- not used for frogger + port map ( + -- data bus + I_DA => cpu_data_out, + O_DA => ym2149_3C_dv, + O_DA_OE_L => ym2149_3C_oe_l, + -- control + I_A9_L => '0', + I_A8 => '1', + I_BDIR => ym2149_3C_bdir, + I_BC2 => ym2149_3C_bc2, + I_BC1 => ym2149_3C_bc1, + I_SEL_L => '1', + + O_AUDIO => ym2149_3C_audio, + O_CHAN => ym2149_3C_chan, + -- port a + I_IOA => "11111111", + O_IOA => open, + O_IOA_OE_L => open, + -- port b + I_IOB => "11111111", + O_IOB => open, + O_IOB_OE_L => open, + + ENA => ENA_1_79, + RESET_L => I_RESET_L, + CLK => CLK + ); + + u_ym2149_3D : entity work.YM2149 + port map ( + -- data bus + I_DA => cpu_data_out, + O_DA => ym2149_3D_dv, + O_DA_OE_L => ym2149_3D_oe_l, + -- control + I_A9_L => '0', + I_A8 => '1', + I_BDIR => ym2149_3D_bdir, + I_BC2 => ym2149_3D_bc2, + I_BC1 => ym2149_3D_bc1, + I_SEL_L => '1', + + O_AUDIO => ym2149_3D_audio, + O_CHAN => ym2149_3D_chan, + -- port a + I_IOA => ym2149_3D_ioa_in, + O_IOA => ym2149_3D_ioa_out, + O_IOA_OE_L => ym2149_3D_ioa_oe_l, + -- port b + I_IOB => ym2149_3D_iob_in, + O_IOB => open, + O_IOB_OE_L => open, + + ENA => ENA_1_79, + RESET_L => I_RESET_L, + CLK => CLK + ); + + p_filter_coef : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + case ym2149_3C_chan is -- -1 as reg here + when "00" => -- chan 3 + ym2149_3C_k <= (others => '0'); + when "11" => -- chan 2 + ym2149_3C_k <= K_FILTER(conv_integer(filter_reg(5 downto 4))); + when "10" => -- chan 1 + ym2149_3C_k <= K_FILTER(conv_integer(filter_reg(3 downto 2))); + when "01" => -- chan 0 + ym2149_3C_k <= K_FILTER(conv_integer(filter_reg(1 downto 0))); + when others => null; + end case; + + case ym2149_3D_chan is -- -1 as reg here + when "00" => -- chan 3 + ym2149_3D_k <= (others => '0'); + when "11" => -- chan 2 + ym2149_3D_k <= K_FILTER(conv_integer(filter_reg(11 downto 10))); + when "10" => -- chan 1 + ym2149_3D_k <= K_FILTER(conv_integer(filter_reg( 9 downto 8))); + when "01" => -- chan 0 + ym2149_3D_k <= K_FILTER(conv_integer(filter_reg( 7 downto 6))); + when others => null; + end case; + end if; + end process; + + + p_ym2149_audio_process : process(ym2149_3C_audio, ym2149_3C_audio_pipe, ym2149_3D_audio, ym2149_3D_audio_pipe) + begin + audio_in_m_out_3C <= (('0' & ym2149_3C_audio & "000000000"))- ym2149_3C_audio_pipe(3); -- signed + audio_in_m_out_3D <= (('0' & ym2149_3D_audio & "000000000"))- ym2149_3D_audio_pipe(3); -- signed + end process; + + mult_3C : work.MULT18X18 + port map + ( + P => audio_mult_3C,-- 35..0 -- audio 8bit on 32..25 33 sign bit, + A => audio_in_m_out_3C, --17..0 + B(17) => '0', + B(16 downto 0) => ym2149_3C_k + ); + + mult_3D : work.MULT18X18 + port map + ( + P => audio_mult_3D,-- 35..0 -- audio 8bit on 32..25 33 sign bit, + A => audio_in_m_out_3D, --17..0 + B(17) => '0', + B(16 downto 0) => ym2149_3D_k + ); + + p_ym2149_audio_pipe : process(I_RESET_L, CLK) + begin + if (I_RESET_L = '0') then + ym2149_3C_audio_pipe <= (others => (others => '0')); + ym2149_3D_audio_pipe <= (others => (others => '0')); + elsif rising_edge(CLK) then +-- audio_mult_3C <= audio_in_m_out_3C * ym2149_3C_k; +-- audio_mult_3D <= audio_in_m_out_3D * ym2149_3D_k; + if (ENA_1_79 = '1') then + -- we need some holding registers anyway, so lets just make it a shift and save a mux + ym2149_3C_audio_pipe(3 downto 1) <= ym2149_3C_audio_pipe(2 downto 0); + ym2149_3C_audio_pipe(0) <= audio_mult_3C(33 downto 16) + ym2149_3C_audio_pipe(3); -- bit 33 sign + + ym2149_3D_audio_pipe(3 downto 1) <= ym2149_3D_audio_pipe(2 downto 0); + ym2149_3D_audio_pipe(0) <= audio_mult_3D(33 downto 16) + ym2149_3D_audio_pipe(3); -- bit 33 sign + end if; + end if; + end process; + + p_ym2149_audio_mix : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + ym2149_3C_chan_t1 <= ym2149_3C_chan; + ym2149_3D_chan_t1 <= ym2149_3D_chan; + + if (ym2149_3C_chan_t1 = "11") then + audio_3C_mix <= (others => '0'); + audio_3C_final <= audio_3C_mix; + else + audio_3C_mix <= audio_3C_mix + ("00" & ym2149_3C_audio_pipe(0)(16 downto 9)); + end if; + + if (ym2149_3D_chan_t1(1 downto 0) = "11") then + audio_3D_mix <= (others => '0'); + audio_3D_final <= audio_3D_mix; + else + audio_3D_mix <= audio_3D_mix + ("00" & ym2149_3D_audio_pipe(0)(16 downto 9)); + end if; + + audio_final <= ('0' & audio_3C_final) + ('0' & audio_3D_final); + end if; + end process; + + p_audio_out : process(CLK, I_RESET_L) + begin + if (I_RESET_L = '0') then + O_AUDIO <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA_1_79 = '1') then + if (ampm = '1') then + O_AUDIO <= (others => '0'); + else + if (audio_final(10) = '1') then + O_AUDIO <= (others => '1'); + else + O_AUDIO <= audio_final(9 downto 0); + end if; + end if; + end if; + end if; + end process; + + p_security_6J : process(xb) + begin + -- chip K10A PAL16L8 + -- equations from Mark @ http://www.leopardcats.com/ + xbo(3 downto 0) <= xb(3 downto 0); + xbo(4) <= not(xb(0) or xb(1) or xb(2) or xb(3)); + xbo(5) <= not((not xb(2) and not xb(0)) or (not xb(2) and not xb(1)) or (not xb(3) and not xb(0)) or (not xb(3) and not xb(1))); + + xbo(6) <= not(not xb(0) and not xb(3)); + xbo(7) <= not((not xb(1)) or xb(2)); + end process; + + p_security_count : process(CLK, I_RESET_L) + begin + if (I_RESET_L = '0') then + security_count <= "000"; + elsif rising_edge(CLK) then + rd_l_t1 <= i_rd_l; + if (I_ADDR = x"8102") and (I_RD_L = '0') and (rd_l_t1 = '1') then + security_count <= security_count + "1"; + end if; + end if; + end process; + + p_security_2B : process(security_count) + begin + -- I am not sure what this chip does yet, but this gets us past the initial check for now. + case security_count is + when "000" => net_1e10_i <= '0'; net_1e12_i <= '1'; + when "001" => net_1e10_i <= '0'; net_1e12_i <= '1'; + when "010" => net_1e10_i <= '1'; net_1e12_i <= '0'; + when "011" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "100" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "101" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "110" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "111" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when others => null; + end case; + end process; + +end RTL; \ No newline at end of file diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/scramble_top.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/scramble_top.vhd new file mode 100644 index 00000000..823bdf6f --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/scramble_top.vhd @@ -0,0 +1,242 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE_TOP is +port ( + O_VIDEO_R : out std_logic_vector(3 downto 0); + O_VIDEO_G : out std_logic_vector(3 downto 0); + O_VIDEO_B : out std_logic_vector(3 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + + O_AUDIO : out std_logic_vector(9 downto 0); + + button_in : in std_logic_vector(7 downto 0); + + RESET : in std_logic; + clk : in std_logic; -- 25 + ena_12 : in std_logic; -- 6.25 x 2 + ena_6 : in std_logic; -- 6.25 (inverted) + ena_6b : in std_logic; -- 6.25 + ena_1_79 : in std_logic -- 1.786 +); +end; + +architecture RTL of SCRAMBLE_TOP is +-- this MUST be set true for frogger +-- this MUST be set false for scramble, the_end, amidar +constant I_HWSEL_FROGGER : boolean := false; + +-- ip registers +signal ip_1p : std_logic_vector(6 downto 0); +signal ip_2p : std_logic_vector(6 downto 0); +signal ip_service : std_logic; +signal ip_coin1 : std_logic; +signal ip_coin2 : std_logic; +signal ip_dip_switch : std_logic_vector(5 downto 1); + +-- ties to audio board +signal audio_addr : std_logic_vector(15 downto 0); +signal audio_data_out : std_logic_vector(7 downto 0); +signal audio_data_in : std_logic_vector(7 downto 0); +signal audio_data_oe_l : std_logic; +signal audio_rd_l : std_logic; +signal audio_wr_l : std_logic; +signal audio_iopc7 : std_logic; +signal audio_reset_l : std_logic; + +begin + +u_scramble : entity work.SCRAMBLE +port map ( + I_HWSEL_FROGGER => I_HWSEL_FROGGER, + -- + O_VIDEO_R => O_VIDEO_R, + O_VIDEO_G => O_VIDEO_G, + O_VIDEO_B => O_VIDEO_B, + O_HSYNC => O_HSYNC, + O_VSYNC => O_VSYNC, + O_HBLANK => O_HBLANK, + O_VBLANK => O_VBLANK, + -- + -- to audio board + -- + O_ADDR => audio_addr, + O_DATA => audio_data_out, + I_DATA => audio_data_in, + I_DATA_OE_L => audio_data_oe_l, + O_RD_L => audio_rd_l, + O_WR_L => audio_wr_l, + O_IOPC7 => audio_iopc7, + O_RESET_WD_L => audio_reset_l, + -- + ENA => ena_6, + ENAB => ena_6b, + ENA_12 => ena_12, + -- + RESET => reset, + CLK => clk +); + +-- +-- +-- audio subsystem +-- +u_audio : entity work.SCRAMBLE_AUDIO +port map ( + I_HWSEL_FROGGER => I_HWSEL_FROGGER, + -- + I_ADDR => audio_addr, + I_DATA => audio_data_out, + O_DATA => audio_data_in, + O_DATA_OE_L => audio_data_oe_l, + -- + I_RD_L => audio_rd_l, + I_WR_L => audio_wr_l, + I_IOPC7 => audio_iopc7, + -- + O_AUDIO => O_AUDIO, + -- + I_1P_CTRL => ip_1p, -- start, shoot1, shoot2, left,right,up,down + I_2P_CTRL => ip_2p, -- start, shoot1, shoot2, left,right,up,down + I_SERVICE => ip_service, + I_COIN1 => ip_coin1, + I_COIN2 => ip_coin2, + O_COIN_COUNTER => open, + -- + I_DIP => ip_dip_switch, + -- + I_RESET_L => audio_reset_l, + ENA => ena_6, + ENA_1_79 => ena_1_79, + CLK => clk +); + +--button_in(0) = Joystick Up +--button_in(1) = Joystick Down +--button_in(2) = Joystick Left +--button_in(3) = Joystick Right +--button_in(4) = Button Left +--button_in(5) = Button Down +--button_in(6) = Joystick Fire +--button_in(7) = Button Right + +--Buttons are connected to ground and connect to 3.3V when pressed +--Joystick has internal pullup resistor and connects to ground when pressed + +--A '0' on the input is active. Inputs are active low. + +-- assign inputs +-- start, shoot1, shoot2, left,right,up,down +ip_1p(6) <= button_in(4); -- start 1 +ip_1p(5) <= button_in(6); -- shoot1 +ip_1p(4) <= button_in(6); -- shoot2 +ip_1p(3) <= button_in(2); -- p1 left +ip_1p(2) <= button_in(3); -- p1 right +ip_1p(1) <= button_in(0); -- p1 up +ip_1p(0) <= button_in(1); -- p1 down +-- +ip_2p(6) <= button_in(7); -- start 2 +ip_2p(5) <= button_in(6); +ip_2p(4) <= button_in(6); +ip_2p(3) <= button_in(2); -- p2 left +ip_2p(2) <= button_in(3); -- p2 right +ip_2p(1) <= button_in(0); -- p2 up +ip_2p(0) <= button_in(1); -- p2 down +-- +ip_service <= '1'; +ip_coin1 <= button_in(5); -- credit +ip_coin2 <= '1'; + +-- dip switch settings +scramble_dips : if (not I_HWSEL_FROGGER) generate +begin + --SW #1 SW #2 Rockets SW #3 Cabinet + ------- ----- --------- ----- -------- + --OFF OFF Unlimited OFF Table + --OFF ON 5 ON Up Right + --ON OFF 4 + --ON ON 3 + + + --SW #4 SW #5 Coins/Play + ------- ----- ---------- + --OFF OFF 4 + --OFF ON 3 + --ON OFF 2 + --ON ON 1 + + ip_dip_switch(5 downto 4) <= not "11"; -- 1 play/coin. + ip_dip_switch(3) <= not '1'; + ip_dip_switch(2 downto 1) <= not "10"; +end generate; + +frogger_dips : if ( I_HWSEL_FROGGER) generate +begin + --1 2 3 4 5 Meaning + ------------------------------------------------------- + --On On 3 Frogs + --On Off 5 Frogs + --Off On 7 Frogs + --Off Off 256 Frogs (!) + -- + -- On Upright unit + -- Off Cocktail unit + -- + -- On On 1 coin 1 play + -- On Off 2 coins 1 play + -- Off On 3 coins 1 play + -- Off Off 1 coin 2 plays + + ip_dip_switch(5 downto 4) <= not "11"; + ip_dip_switch(3) <= not '1'; + ip_dip_switch(2 downto 1) <= not "01"; +end generate; + +end RTL; \ No newline at end of file diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/scramble_video.vhd b/Arcade/Scramble Hardware/Scramble_MiST/rtl/scramble_video.vhd new file mode 100644 index 00000000..6c1dcf24 --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_MiST/rtl/scramble_video.vhd @@ -0,0 +1,763 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE_VIDEO is + port ( + I_HWSEL_FROGGER : in boolean; + -- + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + I_VBLANK : in std_logic; + I_VSYNC : in std_logic; + + I_VCMA : in std_logic; + I_HCMA : in std_logic; + -- + I_CPU_ADDR : in std_logic_vector(15 downto 0); + I_CPU_DATA : in std_logic_vector(7 downto 0); + O_VRAM_DATA : out std_logic_vector(7 downto 0); + -- note, looks like the real hardware cannot read from object ram + -- + I_VRAMWR_L : in std_logic; + I_VRAMRD_L : in std_logic; + I_OBJRAMWR_L : in std_logic; + I_OBJRAMRD_L : in std_logic; + I_OBJEN_L : in std_logic; + -- + I_STARSON : in std_logic; + I_POUT1 : in std_logic; + -- + O_VIDEO_R : out std_logic_vector(3 downto 0); + O_VIDEO_G : out std_logic_vector(3 downto 0); + O_VIDEO_B : out std_logic_vector(3 downto 0); + -- + ENA : in std_logic; + ENAB : in std_logic; + ENA_12 : in std_logic; + CLK : in std_logic + ); +end; + +-- chars stars vidout? shell/missile +-- +-- 220R B 100 B 390R B 100R R +-- 470R B 150 B 100R G +-- 220R G 100 G blue ? +-- 470R G 150 G +-- 1K G 100 R +-- 220R R 150 R +-- 470R R +-- 1K R +architecture RTL of SCRAMBLE_VIDEO is + + type array_3x5 is array (2 downto 0) of std_logic_vector(4 downto 0); + -- timing + signal ld : std_logic; + signal h256_l : std_logic; + signal h256 : std_logic; + signal cblank_s : std_logic; + signal hcmp1_s : std_logic; + signal hcmp2_s : std_logic; + signal hcmp1 : std_logic; + signal hcmp2 : std_logic; + signal cblank_l : std_logic; + signal h256_l_s : std_logic; + signal hcnt_f : std_logic_vector(7 downto 0); + signal vcnt_f : std_logic_vector(7 downto 0); + + -- load strobes + signal vpl_load : std_logic; + signal col_load : std_logic; + signal objdata_load : std_logic; + signal missile_load : std_logic; + signal missile_reg_l : std_logic; + + signal cntr_clr : std_logic; + signal cntr_load : std_logic; + signal sld_l : std_logic; + + -- video ram + signal vram_addr_sum : std_logic_vector(8 downto 0); -- extra bit for debug + signal msld_l : std_logic; + signal vram_addr_reg : std_logic_vector(7 downto 0); + signal vram_addr_xor : std_logic_vector(3 downto 0); + signal vram_addr : std_logic_vector(9 downto 0); + signal vram_dout : std_logic_vector(7 downto 0); + signal ldout : std_logic; + + -- object ram + signal obj_addr : std_logic_vector(7 downto 0); + signal hpla : std_logic_vector(7 downto 0); + signal objdata : std_logic_vector(7 downto 0); + + signal obj_rom_addr : std_logic_vector(10 downto 0); + signal obj_rom_0_dout : std_logic_vector(7 downto 0); + signal obj_rom_1_dout : std_logic_vector(7 downto 0); + -- + signal col_reg : std_logic_vector(2 downto 0); + signal cd : std_logic_vector(2 downto 0); + + signal shift_reg_1 : std_logic_vector(7 downto 0); + signal shift_reg_0 : std_logic_vector(7 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + signal gr : std_logic_vector(1 downto 0); + signal gc : std_logic_vector(2 downto 0); + + signal vid : std_logic_vector(1 downto 0); + signal col : std_logic_vector(2 downto 0); + + signal obj_video_out_reg : std_logic_vector(4 downto 0); + signal vidout_l : std_logic; + signal obj_lut_out : std_logic_vector(7 downto 0); + + signal cntr_addr : std_logic_vector(7 downto 0); + signal cntr_addr_xor : std_logic_vector(10 downto 0); + signal sprite_sel : std_logic; + signal sprite_ram_ip : std_logic_vector(7 downto 0); + signal sprite_ram_waddr : std_logic_vector(10 downto 0); + signal sprite_ram_op : std_logic_vector(7 downto 0); + -- shell + signal shell_cnt : std_logic_vector(7 downto 0); + signal shell_ena : std_logic; + signal shell : std_logic; + signal shell_reg : std_logic; + -- stars + signal star_reg_1 : std_logic; + signal star_reg_2 : std_logic; + signal star_cnt_div : std_logic_vector(22 downto 0); + signal star_cnt : std_logic_vector(1 downto 0); + signal star_shift : std_logic_vector(16 downto 0); + signal star_shift_t1 : std_logic_vector(16 downto 0); + signal star_on : std_logic; + signal star_out_reg : std_logic; + -- frogger blue bar + signal frogger_blue_reg : std_logic; + signal frogger_blue : std_logic; + signal frogger_blue_out_reg : std_logic; + -- scramble blue + signal pout1_reg : std_logic; + + +begin + p_hcnt_decode : process(I_HCNT) + begin + ld <= '0'; + if (I_HCNT(2 downto 0) = "111") then + ld <= '1'; + end if; + h256_l <= I_HCNT(8); + h256 <= not I_HCNT(8); + + end process; + + p_timing_decode : process(h256, h256_l, I_HCMA, I_VBLANK) + begin + cblank_s <= not (I_VBLANK or h256); -- active low + hcmp1_s <= h256_l and I_HCMA; + end process; + + p_reg : process + begin + wait until rising_edge(CLK); + + if (ENA = '1') then + if (ld = '1') then + hcmp1 <= hcmp1_s; + hcmp2 <= hcmp2_s; + cblank_l <= cblank_s; + h256_l_s <= h256_l; + + if not I_HWSEL_FROGGER then + cd <= col_reg; + else + cd <= col_reg(0) & col_reg(2 downto 1); + end if; + end if; + end if; + end process; + + p_load_decode : process(ld, I_HCNT, h256) + variable obj_load : std_logic; + begin + vpl_load <= '0'; + obj_load := '0'; + col_load <= '0'; + + if (I_HCNT(2 downto 0) = "001") then vpl_load <= '1'; end if; -- 1 clock later + if (I_HCNT(2 downto 0) = "011") then obj_load := '1'; end if; -- 1 later + if (I_HCNT(2 downto 0) = "101") then col_load <= '1'; end if; -- 1 later + + objdata_load <= obj_load and h256 and (not I_HCNT(3)); + missile_load <= obj_load and h256 and ( I_HCNT(3)); + + cntr_clr <= ld and (not h256) and (not I_HCNT(3)); + cntr_load <= ld and ( h256) and (not I_HCNT(3)); + + end process; + + p_hv_flip : process(I_HCNT, I_VCNT, I_VCMA, hcmp1_s) + begin + for i in 0 to 7 loop + vcnt_f(i) <= I_VCNT(i) xor I_VCMA; + hcnt_f(i) <= I_HCNT(i) xor hcmp1_s; + end loop; + end process; + + p_video_addr_calc : process(I_HWSEL_FROGGER, vcnt_f, hpla) + begin + if not I_HWSEL_FROGGER then + vram_addr_sum <= ('0' & vcnt_f(7 downto 0)) + ('0' & hpla(7 downto 0)); + else + vram_addr_sum <= ('0' & vcnt_f(7 downto 0)) + ('0' & hpla(3 downto 0) & hpla(7 downto 4)); + end if; + end process; + + p_msld : process(vram_addr_sum) + begin + msld_l <= '1'; + if (vram_addr_sum(7 downto 0) = "11111111") then + msld_l <= '0'; + end if; + end process; + + p_video_addr_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (I_VBLANK = '1') then -- was async + vram_addr_reg <= x"00"; + elsif (vpl_load = '1') then -- vpl_l + vram_addr_reg <= vram_addr_sum(7 downto 0); + end if; + end if; + end process; + + p_vram_xor : process(vram_addr_reg, objdata, h256) + variable flip : std_logic; + begin + flip := objdata(7) and h256; + for i in 0 to 3 loop + vram_addr_xor(i) <= vram_addr_reg(i) xor flip; + end loop; + end process; + + p_vram_addr : process(vram_addr_reg, cblank_s, ld, I_CPU_ADDR, vram_addr_xor, hcnt_f) + variable match : std_logic; + begin + match := '0'; + if (vram_addr_reg(7 downto 4) = "1111") then + match := '1'; + end if; + + if (cblank_s = '0') then + ldout <= match and ld; -- blanking, sprites + else + ldout <= ld; + end if; + + if (cblank_s = '0') then -- blanking, sprites + --vram_cs <= (not I_VRAMWR_L) or (not I_VRAMRD_L); + vram_addr <= I_CPU_ADDR(9 downto 0); -- let the cpu in + else + --vram_cs <= '1'; + vram_addr <= vram_addr_reg(7 downto 4) & vram_addr_xor(3) & hcnt_f(7 downto 3); + end if; + end process; + + u_vram : work.dpram generic map (10,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => not I_VRAMWR_L, + + addr_a_i => vram_addr, + data_a_i => I_CPU_DATA, -- only cpu can write + + clk_b_i => clk, + addr_b_i => vram_addr, + data_b_o => vram_dout + ); + O_VRAM_DATA <= vram_dout; + + p_object_ram_addr : process(h256, I_HCMA, objdata, I_HCNT, hcnt_f, I_CPU_ADDR, I_OBJEN_L) + begin + -- I believe the object ram can only be written during vblank + + if (h256 = '0') then + hcmp2_s <= I_HCMA; + else + hcmp2_s <= objdata(6); + end if; + + if (I_OBJEN_L = '0') then + obj_addr <= I_CPU_ADDR(7 downto 0); + else + obj_addr(7) <= '0'; + obj_addr(6) <= h256; + + -- A + if (h256 = '0') then -- normal + obj_addr(5) <= hcnt_f(7); --128h'; + else -- sprite + obj_addr(5) <= hcnt_f(3) and I_HCNT(1);-- 8h' and 2h; + end if; + + obj_addr(4 downto 2) <= hcnt_f(6 downto 4); + + if (h256 = '0') then -- normal + obj_addr(1) <= hcnt_f(3); --8h' + obj_addr(0) <= I_HCNT(2); --4h + else + obj_addr(1) <= I_HCNT(2); --4h + obj_addr(0) <= I_HCNT(1); --2h + end if; + + end if; + end process; + + u_object_ram : work.dpram generic map (8,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => not I_OBJRAMWR_L, + + addr_a_i => obj_addr, + data_a_i => I_CPU_DATA, -- only cpu can write + + clk_b_i => clk, + addr_b_i => obj_addr, + data_b_o => hpla + ); + + p_objdata_regs : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (col_load = '1') then -- colour load + col_reg <= hpla(2 downto 0); + end if; + + if (objdata_load = '1') then -- sprite load + objdata <= hpla; + end if; + + if (I_VBLANK = '1') then -- was async + missile_reg_l <= '1'; + elsif (missile_load = '1') then + missile_reg_l <= msld_l; + end if; + end if; + end process; + + p_obj_rom_addr : process(h256, vram_addr_xor, vram_dout, objdata, I_HCNT) + begin + obj_rom_addr( 2 downto 0) <= vram_addr_xor(2 downto 0); + if (h256 = '0') then + -- a + obj_rom_addr(10 downto 3) <= vram_dout; -- background objects + else + obj_rom_addr(10 downto 3) <= objdata(5 downto 0) & vram_addr_xor(3) & (objdata(6) xor I_HCNT(3)); -- sprites + end if; + end process; + + obj_rom0 : entity work.ROM_OBJ_0 -- 5H + port map (CLK => CLK, ADDR => obj_rom_addr, DATA => obj_rom_0_dout); + obj_rom1 : entity work.ROM_OBJ_1 -- 5F + port map (CLK => CLK, ADDR => obj_rom_addr, DATA => obj_rom_1_dout); + + p_obj_rom_shift : process + variable obj_rom_0_dout_s : std_logic_vector(7 downto 0); + begin + wait until rising_edge (CLK); + if not I_HWSEL_FROGGER then + obj_rom_0_dout_s := obj_rom_0_dout; + else -- swap bits 0 and 1 + obj_rom_0_dout_s := obj_rom_0_dout(7 downto 2) & obj_rom_0_dout(0) & obj_rom_0_dout(1); + end if; + + if (ENA = '1') then + case shift_sel is + when "00" => null; -- do nothing + + when "01" => shift_reg_1 <= '0' & shift_reg_1(7 downto 1); -- right + shift_reg_0 <= '0' & shift_reg_0(7 downto 1); + + when "10" => shift_reg_1 <= shift_reg_1(6 downto 0) & '0'; -- left + shift_reg_0 <= shift_reg_0(6 downto 0) & '0'; + + when "11" => shift_reg_1 <= obj_rom_1_dout (7 downto 0); -- load + shift_reg_0 <= obj_rom_0_dout_s(7 downto 0); + when others => null; + end case; + end if; + end process; + + p_obj_rom_shift_sel : process(hcmp2, ldout, shift_reg_1, shift_reg_0) + begin + if (hcmp2 = '0') then + + shift_sel(1) <= '1'; + shift_sel(0) <= ldout; + shift_op(1) <= shift_reg_1(7); + shift_op(0) <= shift_reg_0(7); + else + + shift_sel(1) <= ldout; + shift_sel(0) <= '1'; + shift_op(1) <= shift_reg_1(0); + shift_op(0) <= shift_reg_0(0); + end if; + end process; + + p_video_out_logic : process(shift_op, cd, gr, gc) + variable vidon : std_logic; + begin + vidon := shift_op(0) or shift_op(1); + + if (gr(1 downto 0) = "00") then + vid(1 downto 0) <= shift_op(1 downto 0); + else + vid(1 downto 0) <= gr(1 downto 0); + end if; + + if (gc(2 downto 0) = "000") and (vidon = '1') then + col(2 downto 0) <= cd(2 downto 0); + else + col(2 downto 0) <= gc(2 downto 0); + end if; + end process; + + p_shell_ld : process(ld, h256, I_HCNT, missile_reg_l) + begin + sld_l <= '1'; + if (ld = '1') and (h256 = '1') and (I_HCNT(3) = '1') then + if (missile_reg_l = '0') and (I_HCNT(6 downto 4) /= "111") then + sld_l <= '0'; + end if; + end if; + + end process; + + p_shell_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + if (sld_l = '0') then + shell_cnt <= hpla; + elsif (cblank_l = '1') then + shell_cnt <= shell_cnt + "1"; + else + shell_cnt <= shell_cnt; + end if; + + if (sld_l = '0') then + shell_ena <= '1'; + elsif (shell = '1') then + shell_ena <= '0'; + end if; + end if; + end process; + + p_shell_op : process(shell_cnt, shell_ena) + begin + -- note how T input is from QD on the bottom counter + -- we get a rc from xF8 to XFF + -- so the shell is set at count xFA (rc and bit 1) + shell <= '0'; + if (shell_cnt = x"F8") then -- minus 2 as delay wrong + shell <= shell_ena; + end if; + end process; + + p_cntr_cnt : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (cntr_clr = '1') and (h256_l_s = '0') then -- async + cntr_addr <= (others => '0'); + elsif (cntr_load = '1') then + cntr_addr <= hpla(7 downto 0); + else + cntr_addr <= cntr_addr + "1"; + end if; + end if; + end process; + + p_cntr_addr : process(cntr_addr, hcmp1) + begin + cntr_addr_xor(10 downto 8) <= (others => '0'); + for i in 0 to 7 loop + cntr_addr_xor(i) <= cntr_addr(i) xor hcmp1; + end loop; + end process; + + p_sprite_sel : process(h256_l_s, cntr_addr_xor) + begin + sprite_sel <= '0'; + if (h256_l_s = '0') and (cntr_addr_xor(7 downto 4) /= "0000") then + sprite_sel <= '1'; + end if; + end process; + + p_sprite_write : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + -- delay 1 clock + sprite_ram_ip <= (others => '0'); + if (sprite_sel = '1') then + sprite_ram_ip(4 downto 2) <= col(2 downto 0); + sprite_ram_ip(1 downto 0) <= vid(1 downto 0); + end if; + + sprite_ram_waddr <= cntr_addr_xor; + end if; + end process; + + u_sprite_ram : work.dpram generic map (11,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => '1', + + addr_a_i => sprite_ram_waddr, + data_a_i => sprite_ram_ip, + + clk_b_i => clk, + addr_b_i => cntr_addr_xor, + data_b_o => sprite_ram_op + ); + + gc(2 downto 0) <= sprite_ram_op(4 downto 2); + gr(1 downto 0) <= sprite_ram_op(1 downto 0); + + p_video_out_reg : process + variable vidout_l_int : std_logic; + begin + wait until rising_edge(CLK); + -- register all objects to match increased video delay + if (ENA = '1') then + star_shift_t1 <= star_shift; + + if (cblank_l = '0') then + -- logic around the clr workes out as a sync reset + obj_video_out_reg <= (others => '0'); + shell_reg <= '0'; + frogger_blue_out_reg <= '0'; + star_out_reg <= '0'; + pout1_reg <= '0'; + else + + obj_video_out_reg(4 downto 2) <= col(2 downto 0); + obj_video_out_reg(1 downto 0) <= vid(1 downto 0); + vidout_l <= not(vid(1) or vid(0)); + -- probably wider than the original, we must be a whole 6MHz clock here or the scan-doubler will loose it. + shell_reg <= shell; + frogger_blue_out_reg <= frogger_blue; + + star_out_reg <= '0'; + if (star_shift(7 downto 0) = x"FF") and (star_on = '1') then + star_out_reg <= (vcnt_f(0) xor hcnt_f(3)) and (not star_shift(16)); + end if; + + pout1_reg <= I_POUT1; + + end if; + end if; + end process; + +-- Non BRAM (LUT) Version +-- col_rom : entity work.ROM_LUT +-- port map( +-- ADDR => obj_video_out_reg(4 downto 0), +-- DATA => obj_lut_out +-- ); + +-- BRAM Version + col_rom : entity work.ROM_LUT + port map( + CLK => CLK, + ADDR => obj_video_out_reg(4 downto 0), + DATA => obj_lut_out + ); + + p_col_rom_ce : process + variable video : array_3x5; + begin + wait until rising_edge(CLK); + if (ENA = '1') then + video(0)(4) := '0'; + video(1)(4) := '0'; + video(2)(4) := '0'; + video(0)(3) := '0'; -- b + video(1)(3) := '0'; -- g + video(2)(3) := '0'; -- r + + if (vidout_l = '0') then -- cs_l on col rom + + video(0)(2 downto 0) := obj_lut_out(7 downto 6) & '0'; + video(1)(2 downto 0) := obj_lut_out(5 downto 3); + video(2)(2 downto 0) := obj_lut_out(2 downto 0); + else + video(0)(2 downto 0) := "000"; + video(1)(2 downto 0) := "000"; + video(2)(2 downto 0) := "000"; + end if; + -- + -- end of direct assigns + -- + if I_HWSEL_FROGGER then + if (frogger_blue_out_reg = '1') and (vidout_l = '1') then + video(0) := video(0) + "00010"; + end if; + end if; + + if not I_HWSEL_FROGGER then + video(1) := video(1) + ("00" & shell_reg & "00"); + video(2) := video(2) + ("00" & shell_reg & "00"); + end if; + + -- add stars, background and video + if not I_HWSEL_FROGGER then + if (star_out_reg = '1') and (vidout_l = '1') then + video(0) := video(0) + ( '0' & star_shift_t1(13 downto 12) & "00"); + video(1) := video(1) + ( '0' & star_shift_t1(11 downto 10) & "00"); + video(2) := video(2) + ( '0' & star_shift_t1( 9 downto 8) & "00"); + end if; + + if (pout1_reg = '1') and (vidout_l = '1') then + video(0) := video(0) + ("00011"); + end if; + end if; + -- check for clip + for i in 0 to 2 loop + if video(i)(4) = '1' or video(i)(3) = '1' then + video(i)(2 downto 0) := (others => '1'); + end if; + end loop; + + O_VIDEO_B <= video(0)(2 downto 0) & video(0)(2); + O_VIDEO_G <= video(1)(2 downto 0) & video(1)(2); + O_VIDEO_R <= video(2)(2 downto 0) & video(2)(2); + end if; + end process; + + p_frogger_blue_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (I_HCNT(7 downto 0) = x"87") then + frogger_blue_reg <= '1'; + elsif (I_HCNT(7 downto 0) = x"07") then + frogger_blue_reg <= '0'; + end if; + end if; + end process; + frogger_blue <= not (frogger_blue_reg xor I_HCMA); + + p_stars_timer : process + begin + wait until rising_edge(CLK); + -- 555 period 0.8316 seconds + -- ~ 4DF 666 + if (ENA = '1') then + if (star_cnt_div(22 downto 17) = "100111") then + star_cnt_div <= (others => '0'); + star_cnt <= star_cnt + "1"; + else + star_cnt_div <= star_cnt_div + "1"; + end if; + end if; + end process; + + p_stars_demux : process(star_cnt, I_VCNT, star_shift) + begin + case star_cnt is + when "00" => star_on <= star_shift(8); + when "01" => star_on <= star_shift(10); + when "10" => star_on <= I_VCNT(1); + when "11" => star_on <= '1'; + when others => null; + end case; + end process; + + p_stars : process + variable star_ena : std_logic; + variable star_shift_ena : std_logic; + variable fb : std_logic; + variable star_clear : std_logic; + begin + wait until rising_edge(CLK); + -- stars clocked off 12 MHz clock + star_ena := ENA_12 and (not I_VSYNC) and h256_l_s; + + if (ENA = '1') and (I_VSYNC = '1') then + star_reg_1 <= '0'; + star_reg_2 <= '0'; + elsif (star_ena = '1') then + star_reg_1 <= '1'; + star_reg_2 <= star_reg_1; + end if; + + star_shift_ena := (star_reg_2 or I_HCMA) and star_ena; + + star_clear := I_STARSON and (not I_VBLANK); + + fb := (not star_shift(16)) xor star_shift(4); + if (star_clear = '0') then + star_shift <= (others => '0'); + elsif (star_shift_ena = '1') then + star_shift(16 downto 0) <= star_shift(15 downto 0) & fb; + end if; + end process; + +end RTL; diff --git a/Arcade/Scramble Hardware/Scramble_MiST/rtl/video_mixer.sv b/Arcade/Scramble Hardware/Scramble_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Scramble Hardware/Scramble_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/Arcade/Scramble Hardware/TheEnd_MiST/README.txt b/Arcade/Scramble Hardware/TheEnd_MiST/README.txt new file mode 100644 index 00000000..68977f8c --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/README.txt @@ -0,0 +1,26 @@ +--------------------------------------------------------------------------------- +-- +-- Arcade: The End port to MiST by Gehstock +-- 17 December 2017 +-- +--------------------------------------------------------------------------------- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +--------------------------------------------------------------------------------- +-- +-- Only controls are rotated on VGA output. +-- +-- +-- Keyboard inputs : +-- +-- ESC : Coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE : Fire + +-- UP,DOWN,LEFT,RIGHT arrows : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/Release/TheEnd.rbf b/Arcade/Scramble Hardware/TheEnd_MiST/Release/TheEnd.rbf new file mode 100644 index 00000000..b645ca7f Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/Release/TheEnd.rbf differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/TheEnd.qpf b/Arcade/Scramble Hardware/TheEnd_MiST/TheEnd.qpf new file mode 100644 index 00000000..b2c68740 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/TheEnd.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 2017 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 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "TheEnd" diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/TheEnd.qsf b/Arcade/Scramble Hardware/TheEnd_MiST/TheEnd.qsf new file mode 100644 index 00000000..1c65c75a --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/TheEnd.qsf @@ -0,0 +1,219 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 01:12:07 December 01, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# TheEnd_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 16.1.2 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/osd.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 SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VHDL_FILE rtl/cpu/T80sed.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/cpu/T80.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_SND_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_SND_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_PGM.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_OBJ_1.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_OBJ_0.vhd +set_global_assignment -name VHDL_FILE rtl/ROM/ROM_LUT.vhd +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VHDL_FILE rtl/MULT18X18.vhd +set_global_assignment -name VHDL_FILE rtl/i82c55.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VERILOG_FILE rtl/build_id.v +set_global_assignment -name VHDL_FILE rtl/YM2149_linmix_sep.vhd +set_global_assignment -name VHDL_FILE rtl/scramble_video.vhd +set_global_assignment -name VHDL_FILE rtl/scramble_top.vhd +set_global_assignment -name VHDL_FILE rtl/scramble_audio.vhd +set_global_assignment -name VHDL_FILE rtl/scramble.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/TheEnd.sv +set_global_assignment -name VERILOG_FILE rtl/mist_io.v + +# 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 PLL_1 -to "pll:pll|altpll:altpll_component" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# 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 TheEnd + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +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 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" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# 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 ENTITY(TheEnd) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(TheEnd) +# ------------------ +set_global_assignment -name LL_ENABLED ON -section_id Region_0 +set_global_assignment -name LL_AUTO_SIZE OFF -section_id Region_0 +set_global_assignment -name LL_STATE LOCKED -section_id Region_0 +set_global_assignment -name LL_RESERVED OFF -section_id Region_0 +set_global_assignment -name LL_SECURITY_ROUTING_INTERFACE OFF -section_id Region_0 +set_global_assignment -name LL_IGNORE_IO_BANK_SECURITY_CONSTRAINT OFF -section_id Region_0 +set_global_assignment -name LL_PR_REGION OFF -section_id Region_0 +set_global_assignment -name LL_ROUTING_REGION_EXPANSION_SIZE 2147483647 -section_id Region_0 +set_global_assignment -name LL_WIDTH 4 -section_id Region_0 +set_global_assignment -name LL_HEIGHT 1 -section_id Region_0 +set_global_assignment -name LL_ORIGIN X28_Y23 -section_id Region_0 +set_global_assignment -name LL_ENABLED ON -section_id Region_1 +set_global_assignment -name LL_AUTO_SIZE OFF -section_id Region_1 +set_global_assignment -name LL_STATE LOCKED -section_id Region_1 +set_global_assignment -name LL_RESERVED OFF -section_id Region_1 +set_global_assignment -name LL_SECURITY_ROUTING_INTERFACE OFF -section_id Region_1 +set_global_assignment -name LL_IGNORE_IO_BANK_SECURITY_CONSTRAINT OFF -section_id Region_1 +set_global_assignment -name LL_PR_REGION OFF -section_id Region_1 +set_global_assignment -name LL_ROUTING_REGION_EXPANSION_SIZE 2147483647 -section_id Region_1 +set_global_assignment -name LL_WIDTH 5 -section_id Region_1 +set_global_assignment -name LL_HEIGHT 7 -section_id Region_1 +set_global_assignment -name LL_ORIGIN X7_Y23 -section_id Region_1 +set_global_assignment -name LL_ENABLED ON -section_id Region_2 +set_global_assignment -name LL_AUTO_SIZE OFF -section_id Region_2 +set_global_assignment -name LL_STATE LOCKED -section_id Region_2 +set_global_assignment -name LL_RESERVED OFF -section_id Region_2 +set_global_assignment -name LL_SECURITY_ROUTING_INTERFACE OFF -section_id Region_2 +set_global_assignment -name LL_IGNORE_IO_BANK_SECURITY_CONSTRAINT OFF -section_id Region_2 +set_global_assignment -name LL_PR_REGION OFF -section_id Region_2 +set_global_assignment -name LL_ROUTING_REGION_EXPANSION_SIZE 2147483647 -section_id Region_2 +set_global_assignment -name LL_WIDTH 2 -section_id Region_2 +set_global_assignment -name LL_HEIGHT 3 -section_id Region_2 +set_global_assignment -name LL_ORIGIN X6_Y30 -section_id Region_2 +set_global_assignment -name LL_ENABLED ON -section_id Region_3 +set_global_assignment -name LL_AUTO_SIZE OFF -section_id Region_3 +set_global_assignment -name LL_STATE LOCKED -section_id Region_3 +set_global_assignment -name LL_RESERVED OFF -section_id Region_3 +set_global_assignment -name LL_SECURITY_ROUTING_INTERFACE OFF -section_id Region_3 +set_global_assignment -name LL_IGNORE_IO_BANK_SECURITY_CONSTRAINT OFF -section_id Region_3 +set_global_assignment -name LL_PR_REGION OFF -section_id Region_3 +set_global_assignment -name LL_ROUTING_REGION_EXPANSION_SIZE 2147483647 -section_id Region_3 +set_global_assignment -name LL_WIDTH 3 -section_id Region_3 +set_global_assignment -name LL_HEIGHT 8 -section_id Region_3 +set_global_assignment -name LL_ORIGIN X3_Y23 -section_id Region_3 +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/TheEnd.srf b/Arcade/Scramble Hardware/TheEnd_MiST/TheEnd.srf new file mode 100644 index 00000000..a455f0f5 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/TheEnd.srf @@ -0,0 +1,51 @@ +{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} +{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""} diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/clean.bat b/Arcade/Scramble Hardware/TheEnd_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_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/Arcade/Scramble Hardware/TheEnd_MiST/rtl/MULT18X18.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/MULT18X18.vhd new file mode 100644 index 00000000..32535505 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/MULT18X18.vhd @@ -0,0 +1,53 @@ + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY lpm; +USE lpm.all; + +ENTITY MULT18X18 IS + PORT + ( + A : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + B : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + P : OUT STD_LOGIC_VECTOR (35 DOWNTO 0) + ); +END MULT18X18; + + +ARCHITECTURE SYN OF mult18x18 IS + + COMPONENT lpm_mult + GENERIC ( + lpm_hint : STRING; + lpm_representation : STRING; + lpm_type : STRING; + lpm_widtha : NATURAL; + lpm_widthb : NATURAL; + lpm_widthp : NATURAL + ); + PORT ( + dataa : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + datab : IN STD_LOGIC_VECTOR (17 DOWNTO 0); + result : OUT STD_LOGIC_VECTOR (35 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + lpm_mult_component : lpm_mult + GENERIC MAP ( + lpm_hint => "MAXIMIZE_SPEED=5", + lpm_representation => "SIGNED", + lpm_type => "LPM_MULT", + lpm_widtha => 18, + lpm_widthb => 18, + lpm_widthp => 36 + ) + PORT MAP ( + dataa => A, + datab => B, + result => P + ); + +END SYN; + diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/6331-1j.86 b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/6331-1j.86 new file mode 100644 index 00000000..74f9c119 Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/6331-1j.86 differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/CPU1.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/CPU1.bin new file mode 100644 index 00000000..71d84b9d Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/CPU1.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/CPU2.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/CPU2.bin new file mode 100644 index 00000000..11053cc5 Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/CPU2.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/GFX1.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/GFX1.bin new file mode 100644 index 00000000..e34304aa Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/GFX1.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/Load Jumpshot.bat b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/Load Jumpshot.bat new file mode 100644 index 00000000..baedf2ff --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/Load Jumpshot.bat @@ -0,0 +1,23 @@ +@echo off + + + + +copy /b ic13_1t.bin + ic14_2t.bin + ic15_3t.bin + ic16_4t.bin + ic17_5t.bin + ic18_6t.bin CPU1.bin +romgen.exe CPU1.bin ROM_PGM_0 14 a r > rom0.vhd + +copy /b ic56_1.bin ROM_SND_0.bin +romgen.exe ROM_SND_0.bin ROM_SND_0 11 a r > ROM_SND_0.vhd + +copy /b ic55_2.bin ROM_SND_1.bin +romgen.exe ROM_SND_1.bin ROM_SND_1 11 a r > ROM_SND_1.vhd + + +copy /b ic30_2c.bin ROM_OBJ_0.bin +romgen.exe ROM_OBJ_0.bin ROM_OBJ_0 11 a r > ROM_OBJ_0.vhd + +copy /b ic31_1c.bin ROM_OBJ_1.bin +romgen.exe ROM_OBJ_1.bin ROM_OBJ_1 11 a r > ROM_OBJ_1.vhd + + +pause diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_LUT.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_LUT.vhd new file mode 100644 index 00000000..eae5cff1 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_LUT.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity ROM_LUT is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of ROM_LUT is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"F6",X"00",X"16",X"C0",X"3F",X"00",X"D8",X"07",X"3F",X"00",X"C0",X"C4",X"07", + X"00",X"C0",X"A0",X"0C",X"00",X"00",X"00",X"07",X"00",X"F6",X"07",X"F0",X"00",X"76",X"07",X"C6"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_OBJ_0.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_OBJ_0.bin new file mode 100644 index 00000000..9bd5d920 Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_OBJ_0.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_OBJ_0.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_OBJ_0.vhd new file mode 100644 index 00000000..d4d12dcb --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_OBJ_0.vhd @@ -0,0 +1,284 @@ +-- generated with romgen by MikeJ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ROM_OBJ_0 is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of ROM_OBJ_0 is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0050 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0058 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0060 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x0068 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x0070 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"00", -- 0x0158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0178 + x"70",x"38",x"1C",x"1C",x"38",x"34",x"74",x"7E", -- 0x0180 + x"FB",x"FE",x"F4",x"F4",x"F8",x"B8",x"BC",x"BE", -- 0x0188 + x"FE",x"FF",x"FF",x"F1",x"F0",x"70",x"70",x"70", -- 0x0190 + x"70",x"70",x"70",x"F0",x"F1",x"FF",x"FF",x"FE", -- 0x0198 + x"BE",x"BC",x"B8",x"F8",x"F4",x"F4",x"FE",x"FB", -- 0x01A0 + x"7E",x"74",x"34",x"38",x"1C",x"1C",x"38",x"70", -- 0x01A8 + x"FE",x"FF",x"FF",x"F1",x"F0",x"70",x"70",x"70", -- 0x01B0 + x"70",x"70",x"70",x"F0",x"F1",x"FF",x"FF",x"FE", -- 0x01B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"80", -- 0x01C8 + x"01",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D0 + x"40",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x01E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"40",x"00", -- 0x01E8 + x"00",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F0 + x"40",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x0200 + x"00",x"00",x"00",x"00",x"00",x"80",x"A0",x"80", -- 0x0208 + x"07",x"00",x"02",x"00",x"00",x"00",x"00",x"00", -- 0x0210 + x"60",x"C0",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0218 + x"00",x"00",x"00",x"00",x"00",x"00",x"04",x"03", -- 0x0220 + x"00",x"00",x"00",x"00",x"40",x"20",x"20",x"E0", -- 0x0228 + x"01",x"02",x"05",x"01",x"00",x"00",x"00",x"00", -- 0x0230 + x"18",x"E0",x"D0",x"08",x"80",x"00",x"00",x"00", -- 0x0238 + x"00",x"00",x"00",x"00",x"08",x"08",x"08",x"06", -- 0x0240 + x"00",x"00",x"00",x"00",x"10",x"10",x"10",x"60", -- 0x0248 + x"13",x"0C",x"03",x"07",x"09",x"10",x"00",x"00", -- 0x0250 + x"C8",x"30",x"C0",x"E0",x"90",x"08",x"00",x"00", -- 0x0258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0270 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0290 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0298 + x"00",x"00",x"C3",x"2C",x"10",x"11",x"00",x"00", -- 0x02A0 + x"00",x"00",x"00",x"80",x"40",x"20",x"10",x"10", -- 0x02A8 + x"00",x"FE",x"FF",x"FE",x"70",x"E0",x"FC",x"F0", -- 0x02B0 + x"08",x"08",x"14",x"14",x"38",x"48",x"10",x"20", -- 0x02B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D0 + x"FF",x"81",x"81",x"81",x"81",x"81",x"81",x"FF", -- 0x02D8 + x"FC",x"E0",x"70",x"FE",x"FF",x"FE",x"00",x"00", -- 0x02E0 + x"40",x"40",x"00",x"00",x"00",x"40",x"40",x"80", -- 0x02E8 + x"00",x"5E",x"AE",x"7E",x"EE",x"7E",x"AE",x"5E", -- 0x02F0 + x"00",x"05",x"0A",x"07",x"0E",x"07",x"0A",x"05", -- 0x02F8 + x"00",x"00",x"00",x"00",x"00",x"03",x"1E",x"7C", -- 0x0300 + x"04",x"0C",x"18",x"38",x"FC",x"9E",x"06",x"03", -- 0x0308 + x"1E",x"03",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0310 + x"06",x"9E",x"FC",x"38",x"18",x"0C",x"04",x"00", -- 0x0318 + x"80",x"E2",x"B3",x"22",x"02",x"8B",x"CE",x"88", -- 0x0320 + x"80",x"E2",x"B3",x"22",x"02",x"0B",x"0E",x"08", -- 0x0328 + x"00",x"22",x"33",x"22",x"02",x"0B",x"0E",x"08", -- 0x0330 + x"00",x"22",x"33",x"22",x"02",x"0B",x"0E",x"08", -- 0x0338 + x"00",x"02",x"03",x"02",x"02",x"0B",x"0E",x"08", -- 0x0340 + x"00",x"02",x"03",x"02",x"02",x"03",x"02",x"00", -- 0x0348 + x"00",x"02",x"03",x"02",x"02",x"03",x"02",x"00", -- 0x0350 + x"00",x"02",x"03",x"02",x"00",x"00",x"00",x"00", -- 0x0358 + x"00",x"22",x"33",x"22",x"02",x"8B",x"CE",x"88", -- 0x0360 + x"00",x"02",x"03",x"02",x"02",x"0B",x"0E",x"08", -- 0x0368 + x"00",x"02",x"03",x"02",x"02",x"0B",x"0E",x"08", -- 0x0370 + x"00",x"00",x"00",x"00",x"02",x"03",x"02",x"00", -- 0x0378 + x"00",x"00",x"01",x"00",x"0E",x"11",x"11",x"00", -- 0x0380 + x"00",x"00",x"08",x"88",x"50",x"50",x"F0",x"F8", -- 0x0388 + x"00",x"11",x"11",x"0E",x"00",x"01",x"00",x"00", -- 0x0390 + x"F8",x"F0",x"50",x"50",x"88",x"08",x"00",x"00", -- 0x0398 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"01", -- 0x03A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"E0", -- 0x03A8 + x"01",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B0 + x"E0",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x03C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"80", -- 0x03C8 + x"01",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D0 + x"80",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"03", -- 0x03E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"C0", -- 0x03E8 + x"03",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F0 + x"C0",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F8 + x"00",x"00",x"00",x"00",x"07",x"08",x"08",x"00", -- 0x0400 + x"00",x"00",x"10",x"10",x"27",x"A8",x"D8",x"5C", -- 0x0408 + x"00",x"08",x"08",x"07",x"00",x"00",x"00",x"00", -- 0x0410 + x"5C",x"D8",x"A8",x"27",x"10",x"10",x"00",x"00", -- 0x0418 + x"00",x"00",x"00",x"00",x"07",x"08",x"08",x"00", -- 0x0420 + x"00",x"00",x"41",x"22",x"24",x"A8",x"D8",x"5C", -- 0x0428 + x"00",x"08",x"08",x"07",x"00",x"00",x"00",x"00", -- 0x0430 + x"5C",x"D8",x"A8",x"24",x"22",x"41",x"00",x"00", -- 0x0438 + x"00",x"00",x"00",x"00",x"07",x"08",x"08",x"00", -- 0x0440 + x"00",x"00",x"84",x"44",x"28",x"A8",x"D8",x"5C", -- 0x0448 + x"00",x"08",x"08",x"07",x"00",x"00",x"00",x"00", -- 0x0450 + x"5C",x"D8",x"A8",x"28",x"44",x"84",x"00",x"00", -- 0x0458 + x"00",x"00",x"00",x"00",x"07",x"08",x"08",x"00", -- 0x0460 + x"00",x"00",x"90",x"48",x"28",x"A8",x"D8",x"5C", -- 0x0468 + x"00",x"08",x"08",x"07",x"00",x"00",x"00",x"00", -- 0x0470 + x"5C",x"D8",x"A8",x"28",x"48",x"90",x"00",x"00", -- 0x0478 + x"00",x"00",x"00",x"00",x"0E",x"11",x"11",x"00", -- 0x0480 + x"00",x"00",x"88",x"88",x"50",x"50",x"B0",x"B8", -- 0x0488 + x"00",x"11",x"11",x"0E",x"00",x"00",x"00",x"00", -- 0x0490 + x"B8",x"B0",x"50",x"50",x"88",x"88",x"00",x"00", -- 0x0498 + x"00",x"00",x"00",x"07",x"08",x"00",x"00",x"10", -- 0x04A0 + x"00",x"00",x"00",x"20",x"A4",x"A4",x"A8",x"B8", -- 0x04A8 + x"20",x"13",x"0E",x"00",x"03",x"02",x"00",x"00", -- 0x04B0 + x"B0",x"B8",x"70",x"A0",x"20",x"20",x"20",x"00", -- 0x04B8 + x"00",x"00",x"03",x"04",x"00",x"10",x"20",x"20", -- 0x04C0 + x"00",x"00",x"00",x"80",x"50",x"50",x"90",x"E6", -- 0x04C8 + x"13",x"0D",x"01",x"06",x"08",x"01",x"01",x"00", -- 0x04D0 + x"28",x"70",x"F0",x"70",x"80",x"00",x"00",x"00", -- 0x04D8 + x"00",x"00",x"00",x"01",x"08",x"10",x"10",x"10", -- 0x04E0 + x"00",x"00",x"80",x"40",x"20",x"20",x"60",x"4C", -- 0x04E8 + x"0F",x"00",x"1E",x"01",x"00",x"0C",x"00",x"00", -- 0x04F0 + x"F0",x"66",x"F8",x"E0",x"40",x"00",x"00",x"00", -- 0x04F8 + x"00",x"00",x"00",x"06",x"08",x"08",x"08",x"06", -- 0x0500 + x"00",x"00",x"00",x"60",x"10",x"10",x"10",x"60", -- 0x0508 + x"33",x"0C",x"03",x"07",x"31",x"00",x"00",x"00", -- 0x0510 + x"CC",x"30",x"C0",x"F0",x"8C",x"00",x"00",x"00", -- 0x0518 + x"00",x"00",x"00",x"00",x"07",x"08",x"08",x"00", -- 0x0520 + x"00",x"00",x"10",x"10",x"27",x"A8",x"D8",x"5C", -- 0x0528 + x"00",x"08",x"08",x"07",x"00",x"00",x"00",x"00", -- 0x0530 + x"5C",x"D8",x"A8",x"27",x"10",x"10",x"00",x"00", -- 0x0538 + x"00",x"00",x"00",x"00",x"00",x"07",x"08",x"08", -- 0x0540 + x"00",x"00",x"41",x"22",x"24",x"A8",x"D8",x"5C", -- 0x0548 + x"08",x"08",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0550 + x"5C",x"D8",x"A8",x"24",x"22",x"41",x"00",x"00", -- 0x0558 + x"00",x"00",x"00",x"00",x"07",x"08",x"08",x"00", -- 0x0560 + x"00",x"00",x"84",x"44",x"28",x"A8",x"D8",x"5C", -- 0x0568 + x"00",x"08",x"08",x"07",x"00",x"00",x"00",x"00", -- 0x0570 + x"5C",x"D8",x"A8",x"28",x"44",x"84",x"00",x"00", -- 0x0578 + x"00",x"00",x"00",x"00",x"00",x"07",x"08",x"08", -- 0x0580 + x"00",x"00",x"90",x"48",x"28",x"A8",x"D8",x"5C", -- 0x0588 + x"08",x"08",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0590 + x"5C",x"D8",x"A8",x"28",x"48",x"90",x"00",x"00", -- 0x0598 + x"00",x"00",x"00",x"00",x"00",x"0E",x"11",x"11", -- 0x05A0 + x"00",x"00",x"88",x"88",x"50",x"50",x"B0",x"B8", -- 0x05A8 + x"11",x"11",x"0E",x"00",x"00",x"00",x"00",x"00", -- 0x05B0 + x"B8",x"B0",x"50",x"50",x"88",x"88",x"00",x"00", -- 0x05B8 + x"00",x"00",x"00",x"07",x"08",x"00",x"00",x"10", -- 0x05C0 + x"00",x"00",x"00",x"20",x"A4",x"A4",x"A8",x"B8", -- 0x05C8 + x"20",x"13",x"0E",x"00",x"03",x"02",x"00",x"00", -- 0x05D0 + x"B0",x"B8",x"70",x"A0",x"20",x"20",x"20",x"00", -- 0x05D8 + x"00",x"00",x"03",x"04",x"00",x"10",x"20",x"20", -- 0x05E0 + x"00",x"00",x"00",x"80",x"50",x"50",x"90",x"E6", -- 0x05E8 + x"13",x"0D",x"01",x"06",x"08",x"01",x"01",x"00", -- 0x05F0 + x"28",x"70",x"F0",x"70",x"80",x"00",x"00",x"00", -- 0x05F8 + x"00",x"00",x"00",x"01",x"08",x"10",x"10",x"10", -- 0x0600 + x"00",x"00",x"80",x"40",x"20",x"20",x"60",x"4C", -- 0x0608 + x"0F",x"00",x"1E",x"01",x"00",x"0C",x"00",x"00", -- 0x0610 + x"F0",x"66",x"F8",x"E0",x"40",x"00",x"00",x"00", -- 0x0618 + x"00",x"00",x"00",x"06",x"08",x"08",x"08",x"06", -- 0x0620 + x"00",x"00",x"00",x"60",x"10",x"10",x"10",x"60", -- 0x0628 + x"33",x"0C",x"03",x"0F",x"31",x"00",x"00",x"00", -- 0x0630 + x"CC",x"30",x"C0",x"F0",x"8C",x"00",x"00",x"00", -- 0x0638 + x"00",x"EE",x"EE",x"EE",x"EE",x"EE",x"EE",x"EE", -- 0x0640 + x"00",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0", -- 0x0648 + x"00",x"0E",x"0E",x"0E",x"0E",x"0E",x"0E",x"0E", -- 0x0650 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0658 + x"00",x"06",x"0C",x"36",x"E3",x"36",x"0C",x"06", -- 0x0660 + x"3C",x"42",x"81",x"A5",x"A5",x"99",x"42",x"3C", -- 0x0668 + x"F8",x"F8",x"F8",x"F8",x"B8",x"58",x"F8",x"00", -- 0x0670 + x"12",x"6A",x"94",x"D4",x"94",x"6A",x"12",x"00", -- 0x0678 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0688 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"02", -- 0x0690 + x"00",x"02",x"07",x"0C",x"28",x"C3",x"1F",x"FF", -- 0x0698 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"03", -- 0x06A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A8 + x"A4",x"7E",x"18",x"39",x"FC",x"FE",x"FE",x"FF", -- 0x06B0 + x"20",x"00",x"00",x"00",x"80",x"80",x"20",x"00", -- 0x06B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06C0 + x"1F",x"C3",x"C8",x"0C",x"07",x"03",x"00",x"00", -- 0x06C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D8 + x"FE",x"FE",x"FC",x"39",x"18",x"7E",x"A4",x"03", -- 0x06E0 + x"40",x"80",x"80",x"00",x"00",x"00",x"80",x"00", -- 0x06E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"02", -- 0x0700 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0708 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x0710 + x"00",x"00",x"06",x"0D",x"10",x"06",x"2D",x"B6", -- 0x0718 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0720 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0728 + x"04",x"7E",x"18",x"58",x"80",x"96",x"BA",x"5B", -- 0x0730 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0738 + x"00",x"03",x"00",x"00",x"00",x"00",x"02",x"00", -- 0x0740 + x"2D",x"06",x"10",x"0D",x"06",x"00",x"00",x"00", -- 0x0748 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0750 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0758 + x"BA",x"96",x"80",x"58",x"18",x"7E",x"04",x"00", -- 0x0760 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0768 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0770 + x"80",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0778 + x"04",x"00",x"00",x"40",x"00",x"00",x"00",x"00", -- 0x0780 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0788 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0790 + x"08",x"00",x"13",x"0C",x"00",x"23",x"31",x"4F", -- 0x0798 + x"00",x"00",x"00",x"00",x"00",x"10",x"00",x"00", -- 0x07A0 + x"01",x"00",x"00",x"00",x"00",x"04",x"00",x"00", -- 0x07A8 + x"00",x"08",x"C0",x"E8",x"80",x"40",x"A2",x"F0", -- 0x07B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07C0 + x"27",x"31",x"01",x"00",x"91",x"10",x"09",x"04", -- 0x07C8 + x"00",x"00",x"00",x"00",x"10",x"00",x"00",x"00", -- 0x07D0 + x"00",x"00",x"20",x"00",x"00",x"00",x"00",x"00", -- 0x07D8 + x"CE",x"A4",x"45",x"88",x"00",x"C2",x"00",x"00", -- 0x07E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"10", -- 0x07F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"04",x"00" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_OBJ_1.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_OBJ_1.bin new file mode 100644 index 00000000..26dd1a0c Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_OBJ_1.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_OBJ_1.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_OBJ_1.vhd new file mode 100644 index 00000000..6d6d9b9e --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_OBJ_1.vhd @@ -0,0 +1,284 @@ +-- generated with romgen by MikeJ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ROM_OBJ_1 is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of ROM_OBJ_1 is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"38",x"7C",x"C2",x"82",x"86",x"7C",x"38",x"00", -- 0x0000 + x"02",x"02",x"FE",x"FE",x"42",x"02",x"00",x"00", -- 0x0008 + x"62",x"F2",x"BA",x"9A",x"9E",x"CE",x"46",x"00", -- 0x0010 + x"8C",x"DE",x"F2",x"B2",x"92",x"86",x"04",x"00", -- 0x0018 + x"08",x"FE",x"FE",x"C8",x"68",x"38",x"18",x"00", -- 0x0020 + x"1C",x"BE",x"A2",x"A2",x"A2",x"E6",x"E4",x"00", -- 0x0028 + x"0C",x"9E",x"92",x"92",x"D2",x"7E",x"3C",x"00", -- 0x0030 + x"C0",x"E0",x"B0",x"9E",x"8E",x"C0",x"C0",x"00", -- 0x0038 + x"0C",x"6E",x"9A",x"9A",x"B2",x"F2",x"6C",x"00", -- 0x0040 + x"78",x"FC",x"96",x"92",x"92",x"F2",x"60",x"00", -- 0x0048 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0050 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0058 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0060 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x0068 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x0070 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x0078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0080 + x"3E",x"7E",x"C8",x"88",x"C8",x"7E",x"3E",x"00", -- 0x0088 + x"6C",x"FE",x"92",x"92",x"92",x"FE",x"FE",x"00", -- 0x0090 + x"44",x"C6",x"82",x"82",x"C6",x"7C",x"38",x"00", -- 0x0098 + x"38",x"7C",x"C6",x"82",x"82",x"FE",x"FE",x"00", -- 0x00A0 + x"82",x"92",x"92",x"92",x"FE",x"FE",x"00",x"00", -- 0x00A8 + x"80",x"90",x"90",x"90",x"90",x"FE",x"FE",x"00", -- 0x00B0 + x"9E",x"9E",x"92",x"82",x"C6",x"7C",x"38",x"00", -- 0x00B8 + x"FE",x"FE",x"10",x"10",x"10",x"FE",x"FE",x"00", -- 0x00C0 + x"82",x"82",x"FE",x"FE",x"82",x"82",x"00",x"00", -- 0x00C8 + x"FC",x"FE",x"02",x"02",x"02",x"06",x"04",x"00", -- 0x00D0 + x"82",x"C6",x"6E",x"3C",x"18",x"FE",x"FE",x"00", -- 0x00D8 + x"02",x"02",x"02",x"02",x"FE",x"FE",x"00",x"00", -- 0x00E0 + x"FE",x"FE",x"70",x"38",x"70",x"FE",x"FE",x"00", -- 0x00E8 + x"FE",x"FE",x"1C",x"38",x"70",x"FE",x"FE",x"00", -- 0x00F0 + x"7C",x"FE",x"82",x"82",x"82",x"FE",x"7C",x"00", -- 0x00F8 + x"70",x"F8",x"88",x"88",x"88",x"FE",x"FE",x"00", -- 0x0100 + x"7A",x"FC",x"8E",x"8A",x"82",x"FE",x"7C",x"00", -- 0x0108 + x"72",x"F6",x"9E",x"8C",x"88",x"FE",x"FE",x"00", -- 0x0110 + x"0C",x"5E",x"D2",x"92",x"92",x"F6",x"64",x"00", -- 0x0118 + x"80",x"80",x"FE",x"FE",x"80",x"80",x"00",x"00", -- 0x0120 + x"FC",x"FE",x"02",x"02",x"02",x"FE",x"FC",x"00", -- 0x0128 + x"F0",x"F8",x"1C",x"0E",x"1C",x"F8",x"F0",x"00", -- 0x0130 + x"F8",x"FE",x"1C",x"38",x"1C",x"FE",x"F8",x"00", -- 0x0138 + x"C6",x"EE",x"7C",x"38",x"7C",x"EE",x"C6",x"00", -- 0x0140 + x"C0",x"F0",x"1E",x"1E",x"F0",x"C0",x"00",x"00", -- 0x0148 + x"C2",x"E2",x"F2",x"BA",x"9E",x"8E",x"86",x"00", -- 0x0150 + x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"00", -- 0x0158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0178 + x"00",x"00",x"00",x"00",x"00",x"04",x"04",x"0E", -- 0x0180 + x"0F",x"0E",x"44",x"44",x"40",x"50",x"50",x"58", -- 0x0188 + x"58",x"58",x"40",x"00",x"04",x"04",x"0F",x"0F", -- 0x0190 + x"0F",x"0F",x"04",x"04",x"00",x"40",x"58",x"58", -- 0x0198 + x"58",x"50",x"50",x"40",x"44",x"44",x"0E",x"0F", -- 0x01A0 + x"0E",x"04",x"04",x"00",x"00",x"00",x"00",x"00", -- 0x01A8 + x"58",x"58",x"40",x"00",x"00",x"00",x"00",x"00", -- 0x01B0 + x"00",x"00",x"00",x"00",x"00",x"40",x"58",x"58", -- 0x01B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"80", -- 0x01C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D0 + x"80",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"40",x"80", -- 0x01E8 + x"00",x"01",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F0 + x"80",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"01", -- 0x0200 + x"00",x"00",x"00",x"00",x"00",x"00",x"20",x"C0", -- 0x0208 + x"01",x"01",x"02",x"00",x"00",x"00",x"00",x"00", -- 0x0210 + x"A0",x"00",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x0218 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0220 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"0E", -- 0x0228 + x"01",x"03",x"04",x"01",x"00",x"00",x"00",x"00", -- 0x0230 + x"F8",x"00",x"10",x"08",x"80",x"00",x"00",x"00", -- 0x0238 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0240 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0248 + x"13",x"0F",x"00",x"04",x"08",x"10",x"00",x"00", -- 0x0250 + x"C8",x"F0",x"00",x"20",x"10",x"08",x"00",x"00", -- 0x0258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0270 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0290 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0298 + x"00",x"00",x"00",x"00",x"01",x"07",x"00",x"00", -- 0x02A0 + x"00",x"00",x"00",x"00",x"80",x"80",x"C0",x"00", -- 0x02A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02B0 + x"10",x"10",x"30",x"30",x"20",x"60",x"40",x"C0", -- 0x02B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D0 + x"FF",x"81",x"81",x"81",x"81",x"81",x"81",x"FF", -- 0x02D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E0 + x"80",x"80",x"80",x"00",x"00",x"00",x"00",x"00", -- 0x02E8 + x"00",x"0E",x"1E",x"2E",x"0E",x"2E",x"1E",x"0E", -- 0x02F0 + x"00",x"00",x"01",x"02",x"00",x"02",x"01",x"00", -- 0x02F8 + x"00",x"00",x"00",x"00",x"00",x"03",x"1F",x"7F", -- 0x0300 + x"04",x"7C",x"18",x"38",x"F0",x"E0",x"F8",x"FC", -- 0x0308 + x"1F",x"03",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0310 + x"F8",x"E0",x"F0",x"38",x"18",x"7C",x"04",x"00", -- 0x0318 + x"88",x"CE",x"8B",x"02",x"20",x"38",x"2C",x"08", -- 0x0320 + x"88",x"CE",x"8B",x"02",x"20",x"38",x"2C",x"08", -- 0x0328 + x"08",x"0E",x"0B",x"02",x"20",x"38",x"2C",x"08", -- 0x0330 + x"08",x"0E",x"0B",x"02",x"00",x"08",x"0C",x"08", -- 0x0338 + x"08",x"0E",x"0B",x"02",x"00",x"08",x"0C",x"08", -- 0x0340 + x"08",x"0E",x"0B",x"02",x"00",x"00",x"00",x"00", -- 0x0348 + x"00",x"02",x"03",x"02",x"00",x"00",x"00",x"00", -- 0x0350 + x"00",x"02",x"03",x"02",x"00",x"00",x"00",x"00", -- 0x0358 + x"08",x"0E",x"0B",x"02",x"20",x"38",x"2C",x"08", -- 0x0360 + x"08",x"0E",x"0B",x"02",x"20",x"38",x"2C",x"08", -- 0x0368 + x"00",x"02",x"03",x"02",x"00",x"08",x"0C",x"08", -- 0x0370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0378 + x"02",x"0C",x"10",x"20",x"40",x"80",x"80",x"40", -- 0x0380 + x"34",x"42",x"01",x"01",x"02",x"02",x"00",x"61", -- 0x0388 + x"40",x"80",x"80",x"40",x"20",x"10",x"0C",x"02", -- 0x0390 + x"61",x"00",x"02",x"02",x"01",x"01",x"42",x"34", -- 0x0398 + x"00",x"00",x"00",x"02",x"05",x"08",x"0C",x"18", -- 0x03A0 + x"00",x"00",x"00",x"40",x"D0",x"28",x"04",x"06", -- 0x03A8 + x"18",x"0C",x"08",x"05",x"02",x"00",x"00",x"00", -- 0x03B0 + x"06",x"04",x"28",x"D0",x"40",x"00",x"00",x"00", -- 0x03B8 + x"0B",x"36",x"22",x"20",x"40",x"20",x"62",x"80", -- 0x03C0 + x"50",x"B8",x"88",x"12",x"02",x"05",x"41",x"82", -- 0x03C8 + x"80",x"62",x"20",x"40",x"20",x"22",x"36",x"0B", -- 0x03D0 + x"82",x"41",x"05",x"02",x"12",x"88",x"B8",x"50", -- 0x03D8 + x"01",x"40",x"0A",x"00",x"12",x"00",x"24",x"81", -- 0x03E0 + x"00",x"02",x"A0",x"00",x"48",x"00",x"24",x"81", -- 0x03E8 + x"11",x"44",x"10",x"05",x"10",x"02",x"40",x"00", -- 0x03F0 + x"18",x"22",x"08",x"20",x"08",x"40",x"02",x"80", -- 0x03F8 + x"00",x"00",x"00",x"00",x"00",x"07",x"07",x"07", -- 0x0400 + x"00",x"00",x"10",x"10",x"27",x"28",x"60",x"60", -- 0x0408 + x"07",x"07",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0410 + x"60",x"60",x"28",x"27",x"10",x"10",x"00",x"00", -- 0x0418 + x"00",x"00",x"00",x"00",x"00",x"07",x"07",x"07", -- 0x0420 + x"00",x"00",x"41",x"22",x"24",x"28",x"60",x"60", -- 0x0428 + x"07",x"07",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0430 + x"60",x"60",x"28",x"24",x"22",x"41",x"00",x"00", -- 0x0438 + x"00",x"00",x"00",x"00",x"00",x"07",x"07",x"07", -- 0x0440 + x"00",x"00",x"84",x"44",x"28",x"28",x"60",x"60", -- 0x0448 + x"07",x"07",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0450 + x"60",x"60",x"28",x"28",x"44",x"84",x"00",x"00", -- 0x0458 + x"00",x"00",x"00",x"00",x"00",x"07",x"07",x"07", -- 0x0460 + x"00",x"00",x"90",x"48",x"28",x"28",x"60",x"60", -- 0x0468 + x"07",x"07",x"07",x"00",x"00",x"00",x"00",x"00", -- 0x0470 + x"60",x"60",x"28",x"28",x"48",x"90",x"00",x"00", -- 0x0478 + x"00",x"00",x"00",x"00",x"00",x"0E",x"0E",x"0E", -- 0x0480 + x"00",x"00",x"88",x"88",x"50",x"50",x"C0",x"C0", -- 0x0488 + x"0E",x"0E",x"0E",x"00",x"00",x"00",x"00",x"00", -- 0x0490 + x"C0",x"C0",x"50",x"50",x"88",x"88",x"00",x"00", -- 0x0498 + x"00",x"00",x"00",x"00",x"07",x"07",x"0F",x"0E", -- 0x04A0 + x"00",x"00",x"00",x"20",x"24",x"24",x"28",x"C8", -- 0x04A8 + x"1E",x"0D",x"00",x"00",x"03",x"02",x"00",x"00", -- 0x04B0 + x"C0",x"C0",x"80",x"A0",x"20",x"20",x"20",x"00", -- 0x04B8 + x"00",x"00",x"00",x"03",x"07",x"0F",x"1F",x"1E", -- 0x04C0 + x"00",x"00",x"00",x"00",x"90",x"90",x"10",x"E6", -- 0x04C8 + x"0D",x"01",x"01",x"06",x"08",x"01",x"01",x"00", -- 0x04D0 + x"C8",x"80",x"00",x"00",x"80",x"00",x"00",x"00", -- 0x04D8 + x"00",x"00",x"00",x"00",x"03",x"0F",x"0F",x"0E", -- 0x04E0 + x"00",x"00",x"00",x"80",x"C0",x"C0",x"80",x"4C", -- 0x04E8 + x"01",x"01",x"1F",x"00",x"03",x"0C",x"00",x"00", -- 0x04F0 + x"B0",x"86",x"18",x"00",x"00",x"00",x"00",x"00", -- 0x04F8 + x"00",x"00",x"00",x"00",x"07",x"07",x"07",x"00", -- 0x0500 + x"00",x"00",x"00",x"00",x"E0",x"E0",x"E0",x"00", -- 0x0508 + x"33",x"0F",x"00",x"0C",x"30",x"00",x"00",x"00", -- 0x0510 + x"CC",x"F0",x"00",x"30",x"0C",x"00",x"00",x"00", -- 0x0518 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0520 + x"00",x"00",x"10",x"10",x"27",x"28",x"60",x"60", -- 0x0528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0530 + x"60",x"60",x"28",x"27",x"10",x"10",x"00",x"00", -- 0x0538 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0540 + x"00",x"00",x"41",x"22",x"24",x"28",x"60",x"60", -- 0x0548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0550 + x"60",x"60",x"28",x"24",x"22",x"41",x"00",x"00", -- 0x0558 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0560 + x"00",x"00",x"84",x"44",x"28",x"28",x"60",x"60", -- 0x0568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0570 + x"60",x"60",x"28",x"28",x"44",x"84",x"00",x"00", -- 0x0578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0580 + x"00",x"00",x"90",x"48",x"28",x"28",x"60",x"60", -- 0x0588 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0590 + x"60",x"60",x"28",x"28",x"48",x"90",x"00",x"00", -- 0x0598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A0 + x"00",x"00",x"88",x"88",x"50",x"50",x"C0",x"C0", -- 0x05A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05B0 + x"C0",x"C0",x"50",x"50",x"88",x"88",x"00",x"00", -- 0x05B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C0 + x"00",x"00",x"00",x"20",x"24",x"24",x"28",x"C8", -- 0x05C8 + x"00",x"01",x"00",x"00",x"03",x"02",x"00",x"00", -- 0x05D0 + x"C0",x"C0",x"80",x"A0",x"20",x"20",x"20",x"00", -- 0x05D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E0 + x"00",x"00",x"00",x"00",x"10",x"10",x"10",x"E6", -- 0x05E8 + x"01",x"01",x"01",x"06",x"08",x"01",x"01",x"00", -- 0x05F0 + x"C8",x"80",x"00",x"00",x"80",x"00",x"00",x"00", -- 0x05F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"4C", -- 0x0608 + x"01",x"01",x"1F",x"00",x"03",x"0C",x"00",x"00", -- 0x0610 + x"B0",x"86",x"18",x"00",x"00",x"00",x"00",x"00", -- 0x0618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0620 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0628 + x"33",x"0F",x"00",x"0C",x"30",x"00",x"00",x"00", -- 0x0630 + x"CC",x"F0",x"00",x"30",x"0C",x"00",x"00",x"00", -- 0x0638 + x"00",x"EE",x"EE",x"EE",x"EE",x"EE",x"EE",x"EE", -- 0x0640 + x"00",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0", -- 0x0648 + x"00",x"0E",x"0E",x"0E",x"0E",x"0E",x"0E",x"0E", -- 0x0650 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0658 + x"00",x"1E",x"0C",x"38",x"FC",x"38",x"0C",x"1E", -- 0x0660 + x"3C",x"42",x"81",x"A5",x"A5",x"99",x"42",x"3C", -- 0x0668 + x"50",x"50",x"50",x"50",x"F0",x"F0",x"F7",x"00", -- 0x0670 + x"12",x"0A",x"08",x"C8",x"08",x"0A",x"12",x"00", -- 0x0678 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"03", -- 0x0688 + x"00",x"00",x"00",x"01",x"02",x"02",x"0C",x"12", -- 0x0690 + x"0C",x"32",x"C7",x"0C",x"28",x"C0",x"01",x"03", -- 0x0698 + x"00",x"00",x"00",x"00",x"02",x"46",x"B9",x"03", -- 0x06A0 + x"00",x"00",x"00",x"00",x"00",x"C0",x"40",x"20", -- 0x06A8 + x"A0",x"00",x"00",x"09",x"00",x"60",x"F8",x"FC", -- 0x06B0 + x"A0",x"40",x"60",x"18",x"88",x"90",x"60",x"10", -- 0x06B8 + x"0C",x"02",x"02",x"01",x"00",x"00",x"00",x"00", -- 0x06C0 + x"01",x"C0",x"C8",x"0C",x"C7",x"33",x"0C",x"03", -- 0x06C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D8 + x"F8",x"60",x"00",x"01",x"00",x"00",x"A0",x"03", -- 0x06E0 + x"60",x"90",x"88",x"18",x"60",x"40",x"A0",x"20", -- 0x06E8 + x"B9",x"46",x"02",x"00",x"00",x"00",x"00",x"00", -- 0x06F0 + x"40",x"C0",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0700 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"1C", -- 0x0708 + x"00",x"01",x"02",x"04",x"01",x"01",x"04",x"08", -- 0x0710 + x"21",x"80",x"26",x"CC",x"90",x"00",x"01",x"00", -- 0x0718 + x"00",x"00",x"00",x"00",x"00",x"00",x"46",x"61", -- 0x0720 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0728 + x"80",x"00",x"00",x"03",x"01",x"10",x"B8",x"18", -- 0x0730 + x"00",x"80",x"40",x"40",x"10",x"90",x"20",x"30", -- 0x0738 + x"04",x"01",x"01",x"04",x"02",x"01",x"00",x"01", -- 0x0740 + x"00",x"00",x"90",x"CC",x"26",x"80",x"21",x"1C", -- 0x0748 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0750 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0758 + x"B8",x"10",x"01",x"03",x"00",x"00",x"80",x"61", -- 0x0760 + x"20",x"90",x"10",x"40",x"40",x"80",x"00",x"00", -- 0x0768 + x"46",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0770 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0778 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"03", -- 0x0780 + x"00",x"31",x"43",x"88",x"00",x"60",x"C0",x"01", -- 0x0788 + x"02",x"30",x"10",x"20",x"23",x"42",x"40",x"00", -- 0x0790 + x"01",x"06",x"30",x"60",x"C2",x"AD",x"18",x"1D", -- 0x0798 + x"00",x"00",x"80",x"40",x"02",x"03",x"00",x"00", -- 0x07A0 + x"00",x"00",x"00",x"00",x"00",x"80",x"80",x"40", -- 0x07A8 + x"C0",x"68",x"50",x"82",x"F1",x"10",x"28",x"B0", -- 0x07B0 + x"40",x"08",x"04",x"02",x"82",x"C2",x"84",x"00", -- 0x07B8 + x"01",x"19",x"10",x"10",x"88",x"88",x"C4",x"40", -- 0x07C0 + x"05",x"98",x"86",x"47",x"05",x"00",x"40",x"64", -- 0x07C8 + x"60",x"20",x"00",x"04",x"03",x"00",x"00",x"00", -- 0x07D0 + x"3C",x"08",x"00",x"00",x"86",x"C1",x"00",x"00", -- 0x07D8 + x"88",x"10",x"70",x"E0",x"00",x"08",x"18",x"80", -- 0x07E0 + x"00",x"11",x"21",x"C3",x"01",x"11",x"32",x"60", -- 0x07E8 + x"00",x"00",x"04",x"08",x"70",x"C0",x"00",x"00", -- 0x07F0 + x"20",x"40",x"08",x"30",x"40",x"00",x"00",x"00" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_PGM.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_PGM.vhd new file mode 100644 index 00000000..b832742c --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_PGM.vhd @@ -0,0 +1,2076 @@ +-- generated with romgen by MikeJ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ROM_PGM is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(13 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of ROM_PGM is + + + type ROM_ARRAY is array(0 to 16383) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"AF",x"32",x"01",x"68",x"C3",x"69",x"00",x"FF", -- 0x0000 + x"77",x"3C",x"23",x"77",x"3C",x"19",x"C9",x"FF", -- 0x0008 + x"77",x"23",x"10",x"FC",x"C9",x"FF",x"FF",x"FF", -- 0x0010 + x"77",x"23",x"10",x"FC",x"0D",x"18",x"F9",x"C9", -- 0x0018 + x"85",x"6F",x"3E",x"00",x"8C",x"67",x"7E",x"C9", -- 0x0020 + x"87",x"E1",x"5F",x"16",x"00",x"19",x"5E",x"23", -- 0x0028 + x"56",x"EB",x"E9",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0030 + x"E5",x"26",x"40",x"3A",x"A0",x"40",x"6F",x"CB", -- 0x0038 + x"7E",x"28",x"0E",x"72",x"2C",x"73",x"2C",x"7D", -- 0x0040 + x"FE",x"C0",x"30",x"02",x"3E",x"C0",x"32",x"A0", -- 0x0048 + x"40",x"E1",x"C9",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0050 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0058 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"C3",x"CF", -- 0x0060 + x"07",x"21",x"00",x"40",x"11",x"01",x"40",x"01", -- 0x0068 + x"00",x"08",x"36",x"00",x"ED",x"B0",x"3E",x"93", -- 0x0070 + x"32",x"03",x"81",x"3E",x"88",x"32",x"03",x"82", -- 0x0078 + x"31",x"00",x"48",x"21",x"C0",x"40",x"06",x"40", -- 0x0080 + x"3E",x"FF",x"D7",x"3A",x"00",x"70",x"AF",x"32", -- 0x0088 + x"01",x"68",x"32",x"05",x"70",x"32",x"06",x"68", -- 0x0090 + x"32",x"07",x"68",x"21",x"C0",x"C0",x"22",x"A0", -- 0x0098 + x"40",x"3C",x"32",x"04",x"68",x"21",x"00",x"48", -- 0x00A0 + x"22",x"0B",x"40",x"3E",x"20",x"32",x"08",x"40", -- 0x00A8 + x"3E",x"05",x"32",x"17",x"40",x"3A",x"02",x"81", -- 0x00B0 + x"0F",x"47",x"E6",x"03",x"32",x"00",x"40",x"78", -- 0x00B8 + x"0F",x"0F",x"E6",x"01",x"32",x"0F",x"40",x"3A", -- 0x00C0 + x"01",x"81",x"E6",x"03",x"FE",x"03",x"28",x"05", -- 0x00C8 + x"C6",x"03",x"32",x"07",x"40",x"CD",x"C3",x"27", -- 0x00D0 + x"21",x"00",x"00",x"2B",x"3A",x"00",x"70",x"7D", -- 0x00D8 + x"B4",x"00",x"00",x"CD",x"CF",x"27",x"00",x"00", -- 0x00E0 + x"00",x"00",x"00",x"C3",x"C9",x"28",x"26",x"40", -- 0x00E8 + x"3A",x"A1",x"40",x"6F",x"7E",x"87",x"30",x"05", -- 0x00F0 + x"CD",x"31",x"01",x"18",x"F1",x"E6",x"0F",x"4F", -- 0x00F8 + x"06",x"00",x"36",x"FF",x"23",x"5E",x"36",x"FF", -- 0x0100 + x"2C",x"7D",x"FE",x"C0",x"30",x"02",x"3E",x"C0", -- 0x0108 + x"32",x"A1",x"40",x"7B",x"21",x"21",x"01",x"09", -- 0x0110 + x"5E",x"23",x"56",x"21",x"EE",x"00",x"E5",x"EB", -- 0x0118 + x"E9",x"C3",x"02",x"DE",x"02",x"EF",x"02",x"4B", -- 0x0120 + x"03",x"D7",x"03",x"F3",x"03",x"3A",x"04",x"F7", -- 0x0128 + x"06",x"3A",x"5F",x"42",x"47",x"E6",x"0F",x"CA", -- 0x0130 + x"55",x"01",x"21",x"81",x"42",x"CB",x"46",x"C0", -- 0x0138 + x"E6",x"03",x"CA",x"79",x"02",x"FE",x"01",x"28", -- 0x0140 + x"53",x"FE",x"02",x"28",x"76",x"3A",x"00",x"41", -- 0x0148 + x"A7",x"C8",x"C3",x"C3",x"02",x"11",x"E0",x"FF", -- 0x0150 + x"21",x"E0",x"48",x"3A",x"0E",x"40",x"A7",x"28", -- 0x0158 + x"22",x"36",x"02",x"CD",x"8D",x"01",x"21",x"40", -- 0x0160 + x"4B",x"CD",x"8B",x"01",x"3A",x"0D",x"40",x"A7", -- 0x0168 + x"21",x"40",x"4B",x"28",x"03",x"21",x"E0",x"48", -- 0x0170 + x"CB",x"60",x"C8",x"3A",x"06",x"40",x"0F",x"D0", -- 0x0178 + x"C3",x"94",x"01",x"21",x"E0",x"48",x"CD",x"94", -- 0x0180 + x"01",x"18",x"DB",x"36",x"01",x"19",x"36",x"25", -- 0x0188 + x"19",x"36",x"20",x"C9",x"3E",x"10",x"77",x"19", -- 0x0190 + x"77",x"19",x"77",x"C9",x"21",x"7A",x"4B",x"11", -- 0x0198 + x"4F",x"41",x"06",x"02",x"CD",x"11",x"02",x"01", -- 0x01A0 + x"E2",x"FF",x"09",x"7B",x"FE",x"3F",x"28",x"09", -- 0x01A8 + x"FE",x"2F",x"28",x"0A",x"FE",x"1F",x"20",x"EA", -- 0x01B0 + x"C9",x"21",x"3A",x"4A",x"18",x"E4",x"21",x"FA", -- 0x01B8 + x"48",x"18",x"DF",x"21",x"68",x"48",x"11",x"50", -- 0x01C0 + x"41",x"06",x"03",x"CD",x"EA",x"01",x"01",x"1D", -- 0x01C8 + x"00",x"09",x"7B",x"FE",x"80",x"28",x"09",x"FE", -- 0x01D0 + x"B0",x"28",x"0A",x"FE",x"E0",x"C8",x"18",x"E9", -- 0x01D8 + x"21",x"88",x"49",x"18",x"E4",x"21",x"A8",x"4A", -- 0x01E0 + x"18",x"DF",x"1A",x"F5",x"13",x"1A",x"4F",x"F1", -- 0x01E8 + x"CB",x"4F",x"28",x"10",x"79",x"CB",x"4F",x"28", -- 0x01F0 + x"07",x"36",x"C8",x"23",x"13",x"10",x"EB",x"C9", -- 0x01F8 + x"36",x"C9",x"18",x"F7",x"79",x"CB",x"4F",x"28", -- 0x0200 + x"04",x"36",x"CA",x"18",x"EE",x"36",x"10",x"18", -- 0x0208 + x"EA",x"E5",x"D5",x"1A",x"CB",x"4F",x"28",x"25", -- 0x0210 + x"CB",x"57",x"20",x"28",x"CB",x"5F",x"20",x"2B", -- 0x0218 + x"1D",x"1A",x"CB",x"4F",x"28",x"30",x"CB",x"57", -- 0x0220 + x"20",x"30",x"CB",x"5F",x"20",x"36",x"36",x"C8", -- 0x0228 + x"2D",x"1D",x"10",x"DF",x"D1",x"E1",x"2D",x"2D", -- 0x0230 + x"7B",x"D6",x"04",x"5F",x"C9",x"36",x"10",x"2D", -- 0x0238 + x"36",x"10",x"18",x"F0",x"CD",x"71",x"02",x"36", -- 0x0240 + x"5E",x"18",x"F4",x"D6",x"10",x"12",x"E6",x"70", -- 0x0248 + x"20",x"F5",x"1A",x"CB",x"9F",x"12",x"36",x"CA", -- 0x0250 + x"18",x"E5",x"CD",x"71",x"02",x"36",x"C8",x"2D", -- 0x0258 + x"36",x"5F",x"18",x"D0",x"D6",x"10",x"12",x"E6", -- 0x0260 + x"70",x"20",x"F2",x"1A",x"CB",x"9F",x"12",x"18", -- 0x0268 + x"CE",x"CB",x"97",x"CB",x"DF",x"F6",x"70",x"12", -- 0x0270 + x"C9",x"3A",x"BA",x"40",x"0F",x"D0",x"78",x"E6", -- 0x0278 + x"08",x"21",x"AB",x"02",x"28",x"03",x"21",x"B7", -- 0x0280 + x"02",x"06",x"06",x"11",x"20",x"00",x"DD",x"21", -- 0x0288 + x"AC",x"49",x"7E",x"DD",x"77",x"00",x"23",x"DD", -- 0x0290 + x"19",x"10",x"F7",x"06",x"06",x"DD",x"21",x"AD", -- 0x0298 + x"49",x"7E",x"DD",x"77",x"00",x"23",x"DD",x"19", -- 0x02A0 + x"10",x"F7",x"C9",x"10",x"10",x"10",x"10",x"10", -- 0x02A8 + x"10",x"30",x"31",x"32",x"33",x"34",x"35",x"10", -- 0x02B0 + x"10",x"10",x"10",x"10",x"10",x"30",x"31",x"36", -- 0x02B8 + x"37",x"34",x"35",x"21",x"A5",x"49",x"11",x"1F", -- 0x02C0 + x"00",x"DD",x"21",x"04",x"41",x"06",x"06",x"DD", -- 0x02C8 + x"7E",x"00",x"77",x"23",x"DD",x"7E",x"06",x"77", -- 0x02D0 + x"19",x"DD",x"23",x"10",x"F2",x"C9",x"21",x"A5", -- 0x02D8 + x"49",x"11",x"1F",x"00",x"06",x"06",x"3E",x"10", -- 0x02E0 + x"77",x"23",x"77",x"19",x"10",x"FA",x"C9",x"A7", -- 0x02E8 + x"28",x"39",x"3D",x"28",x"22",x"3D",x"87",x"87", -- 0x02F0 + x"87",x"87",x"2F",x"E6",x"30",x"C6",x"C0",x"21", -- 0x02F8 + x"DB",x"49",x"CD",x"38",x"03",x"21",x"DD",x"49", -- 0x0300 + x"CD",x"38",x"03",x"21",x"1B",x"4A",x"CD",x"38", -- 0x0308 + x"03",x"21",x"1D",x"4A",x"C3",x"38",x"03",x"21", -- 0x0310 + x"DB",x"49",x"11",x"1C",x"00",x"0E",x"04",x"06", -- 0x0318 + x"04",x"36",x"10",x"23",x"10",x"FB",x"19",x"0D", -- 0x0320 + x"20",x"F5",x"C9",x"CD",x"17",x"03",x"3E",x"60", -- 0x0328 + x"21",x"FC",x"49",x"C3",x"38",x"03",x"3E",x"10", -- 0x0330 + x"D5",x"11",x"1F",x"00",x"CF",x"CF",x"D1",x"C9", -- 0x0338 + x"3E",x"10",x"D5",x"11",x"DF",x"FF",x"CF",x"C6", -- 0x0340 + x"FC",x"18",x"F2",x"A7",x"28",x"48",x"4F",x"CD", -- 0x0348 + x"A1",x"03",x"87",x"81",x"4F",x"06",x"00",x"21", -- 0x0350 + x"B0",x"03",x"09",x"A7",x"06",x"03",x"1A",x"8E", -- 0x0358 + x"27",x"12",x"13",x"23",x"10",x"F8",x"D5",x"3A", -- 0x0360 + x"0D",x"40",x"0F",x"30",x"02",x"3E",x"01",x"CD", -- 0x0368 + x"F3",x"03",x"D1",x"1B",x"21",x"AA",x"40",x"06", -- 0x0370 + x"03",x"1A",x"BE",x"D8",x"20",x"05",x"1B",x"2B", -- 0x0378 + x"10",x"F7",x"C9",x"CD",x"A1",x"03",x"21",x"A8", -- 0x0380 + x"40",x"06",x"03",x"1A",x"77",x"13",x"23",x"10", -- 0x0388 + x"FA",x"3E",x"02",x"C3",x"F3",x"03",x"CD",x"A1", -- 0x0390 + x"03",x"21",x"AB",x"40",x"A7",x"06",x"03",x"18", -- 0x0398 + x"BD",x"F5",x"3A",x"0D",x"40",x"11",x"A2",x"40", -- 0x03A0 + x"0F",x"30",x"03",x"11",x"A5",x"40",x"F1",x"C9", -- 0x03A8 + x"00",x"00",x"00",x"20",x"00",x"00",x"40",x"00", -- 0x03B0 + x"00",x"60",x"00",x"00",x"80",x"00",x"00",x"00", -- 0x03B8 + x"01",x"00",x"20",x"01",x"00",x"40",x"01",x"00", -- 0x03C0 + x"60",x"01",x"00",x"80",x"01",x"00",x"00",x"02", -- 0x03C8 + x"00",x"00",x"04",x"00",x"00",x"06",x"00",x"F5", -- 0x03D0 + x"21",x"A2",x"40",x"A7",x"28",x"09",x"21",x"A5", -- 0x03D8 + x"40",x"3D",x"28",x"03",x"21",x"A8",x"40",x"36", -- 0x03E0 + x"00",x"23",x"36",x"00",x"23",x"36",x"00",x"F1", -- 0x03E8 + x"C3",x"F3",x"03",x"21",x"A4",x"40",x"DD",x"21", -- 0x03F0 + x"81",x"4B",x"A7",x"28",x"11",x"21",x"A7",x"40", -- 0x03F8 + x"DD",x"21",x"21",x"49",x"3D",x"28",x"07",x"21", -- 0x0400 + x"AA",x"40",x"DD",x"21",x"41",x"4A",x"11",x"E0", -- 0x0408 + x"FF",x"06",x"03",x"0E",x"04",x"7E",x"0F",x"0F", -- 0x0410 + x"0F",x"0F",x"CD",x"25",x"04",x"7E",x"CD",x"25", -- 0x0418 + x"04",x"2B",x"10",x"F1",x"C9",x"E6",x"0F",x"28", -- 0x0420 + x"08",x"0E",x"00",x"DD",x"77",x"00",x"DD",x"19", -- 0x0428 + x"C9",x"79",x"A7",x"28",x"F6",x"3E",x"10",x"0D", -- 0x0430 + x"18",x"F1",x"87",x"F5",x"21",x"A7",x"04",x"E6", -- 0x0438 + x"3F",x"5F",x"16",x"00",x"19",x"5E",x"23",x"56", -- 0x0440 + x"EB",x"5E",x"23",x"56",x"23",x"EB",x"01",x"E0", -- 0x0448 + x"FF",x"F1",x"38",x"0E",x"FA",x"6C",x"04",x"1A", -- 0x0450 + x"FE",x"3F",x"C8",x"D6",x"30",x"77",x"13",x"09", -- 0x0458 + x"18",x"F5",x"1A",x"FE",x"3F",x"C8",x"36",x"10", -- 0x0460 + x"13",x"09",x"18",x"F6",x"22",x"B5",x"40",x"ED", -- 0x0468 + x"53",x"B3",x"40",x"EB",x"7B",x"E6",x"1F",x"47", -- 0x0470 + x"87",x"C6",x"20",x"6F",x"26",x"40",x"22",x"B1", -- 0x0478 + x"40",x"CB",x"3B",x"CB",x"3B",x"7A",x"E6",x"03", -- 0x0480 + x"0F",x"0F",x"B3",x"E6",x"F8",x"4F",x"21",x"00", -- 0x0488 + x"48",x"78",x"85",x"6F",x"11",x"20",x"00",x"43", -- 0x0490 + x"36",x"10",x"19",x"10",x"FB",x"2A",x"B1",x"40", -- 0x0498 + x"71",x"3E",x"01",x"32",x"B0",x"40",x"C9",x"E7", -- 0x04A0 + x"04",x"F4",x"04",x"08",x"05",x"15",x"05",x"22", -- 0x04A8 + x"05",x"2F",x"05",x"4D",x"05",x"5D",x"05",x"66", -- 0x04B0 + x"05",x"74",x"05",x"80",x"05",x"88",x"05",x"8F", -- 0x04B8 + x"05",x"9D",x"05",x"B7",x"05",x"C7",x"05",x"D7", -- 0x04C0 + x"05",x"E7",x"05",x"F8",x"05",x"09",x"06",x"1A", -- 0x04C8 + x"06",x"2B",x"06",x"3C",x"06",x"4D",x"06",x"57", -- 0x04D0 + x"06",x"69",x"06",x"7E",x"06",x"98",x"06",x"AB", -- 0x04D8 + x"06",x"BE",x"06",x"D1",x"06",x"E4",x"06",x"96", -- 0x04E0 + x"4A",x"47",x"41",x"4D",x"45",x"40",x"40",x"4F", -- 0x04E8 + x"56",x"45",x"52",x"3F",x"F1",x"4A",x"50",x"55", -- 0x04F0 + x"53",x"48",x"40",x"53",x"54",x"41",x"52",x"54", -- 0x04F8 + x"40",x"42",x"55",x"54",x"54",x"4F",x"4E",x"3F", -- 0x0500 + x"94",x"4A",x"50",x"4C",x"41",x"59",x"45",x"52", -- 0x0508 + x"40",x"4F",x"4E",x"45",x"3F",x"94",x"4A",x"50", -- 0x0510 + x"4C",x"41",x"59",x"45",x"52",x"40",x"54",x"57", -- 0x0518 + x"4F",x"3F",x"80",x"4A",x"48",x"49",x"47",x"48", -- 0x0520 + x"40",x"53",x"43",x"4F",x"52",x"45",x"3F",x"9F", -- 0x0528 + x"4B",x"40",x"43",x"52",x"45",x"44",x"49",x"54", -- 0x0530 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x0538 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x0540 + x"40",x"40",x"40",x"40",x"3F",x"D1",x"4A",x"49", -- 0x0548 + x"4E",x"53",x"45",x"52",x"54",x"40",x"40",x"43", -- 0x0550 + x"4F",x"49",x"4E",x"53",x"3F",x"1E",x"49",x"40", -- 0x0558 + x"40",x"40",x"40",x"40",x"40",x"3F",x"5F",x"4A", -- 0x0560 + x"43",x"48",x"41",x"4E",x"43",x"45",x"40",x"54", -- 0x0568 + x"49",x"4D",x"45",x"3F",x"94",x"4A",x"46",x"49", -- 0x0570 + x"52",x"45",x"40",x"40",x"55",x"46",x"4F",x"3F", -- 0x0578 + x"4D",x"4A",x"40",x"40",x"40",x"40",x"40",x"3F", -- 0x0580 + x"26",x"4A",x"50",x"4C",x"41",x"59",x"3F",x"89", -- 0x0588 + x"4A",x"5B",x"40",x"54",x"48",x"45",x"40",x"45", -- 0x0590 + x"4E",x"44",x"40",x"5B",x"3F",x"4F",x"4B",x"5B", -- 0x0598 + x"40",x"53",x"43",x"4F",x"52",x"45",x"40",x"41", -- 0x05A0 + x"44",x"56",x"41",x"4E",x"43",x"45",x"40",x"54", -- 0x05A8 + x"41",x"42",x"4C",x"45",x"40",x"5B",x"3F",x"92", -- 0x05B0 + x"4A",x"34",x"30",x"40",x"40",x"40",x"40",x"40", -- 0x05B8 + x"40",x"40",x"40",x"40",x"38",x"30",x"3F",x"95", -- 0x05C0 + x"4A",x"36",x"30",x"40",x"40",x"40",x"40",x"40", -- 0x05C8 + x"40",x"40",x"40",x"31",x"32",x"30",x"3F",x"98", -- 0x05D0 + x"4A",x"31",x"30",x"30",x"40",x"40",x"40",x"40", -- 0x05D8 + x"40",x"40",x"40",x"32",x"30",x"30",x"3F",x"BC", -- 0x05E0 + x"4A",x"FD",x"40",x"4B",x"4F",x"4E",x"41",x"4D", -- 0x05E8 + x"49",x"40",x"40",x"31",x"39",x"38",x"30",x"3F", -- 0x05F0 + x"D5",x"4A",x"31",x"40",x"43",x"4F",x"49",x"4E", -- 0x05F8 + x"40",x"40",x"31",x"40",x"50",x"4C",x"41",x"59", -- 0x0600 + x"3F",x"D5",x"4A",x"32",x"40",x"43",x"4F",x"49", -- 0x0608 + x"4E",x"53",x"40",x"31",x"40",x"50",x"4C",x"41", -- 0x0610 + x"59",x"3F",x"D5",x"4A",x"33",x"40",x"43",x"4F", -- 0x0618 + x"49",x"4E",x"53",x"40",x"31",x"40",x"50",x"4C", -- 0x0620 + x"41",x"59",x"3F",x"D5",x"4A",x"31",x"40",x"43", -- 0x0628 + x"4F",x"49",x"4E",x"40",x"40",x"32",x"40",x"50", -- 0x0630 + x"4C",x"41",x"59",x"3F",x"78",x"4B",x"42",x"4F", -- 0x0638 + x"4E",x"55",x"53",x"40",x"53",x"48",x"49",x"50", -- 0x0640 + x"40",x"40",x"40",x"40",x"3F",x"58",x"49",x"30", -- 0x0648 + x"30",x"30",x"40",x"50",x"54",x"53",x"3F",x"D4", -- 0x0650 + x"4A",x"4F",x"4E",x"45",x"40",x"50",x"4C",x"41", -- 0x0658 + x"59",x"45",x"52",x"40",x"4F",x"4E",x"4C",x"59", -- 0x0660 + x"3F",x"F4",x"4A",x"4F",x"4E",x"45",x"40",x"4F", -- 0x0668 + x"52",x"40",x"54",x"57",x"4F",x"40",x"50",x"4C", -- 0x0670 + x"41",x"59",x"45",x"52",x"53",x"3F",x"4D",x"4B", -- 0x0678 + x"5B",x"40",x"53",x"43",x"4F",x"52",x"45",x"40", -- 0x0680 + x"52",x"41",x"4E",x"4B",x"49",x"4E",x"47",x"40", -- 0x0688 + x"54",x"41",x"42",x"4C",x"45",x"40",x"5B",x"3F", -- 0x0690 + x"F0",x"4A",x"31",x"53",x"54",x"40",x"40",x"40", -- 0x0698 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"50", -- 0x06A0 + x"54",x"53",x"3F",x"F2",x"4A",x"32",x"4E",x"44", -- 0x06A8 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x06B0 + x"40",x"40",x"50",x"54",x"53",x"3F",x"F4",x"4A", -- 0x06B8 + x"33",x"52",x"44",x"40",x"40",x"40",x"40",x"40", -- 0x06C0 + x"40",x"40",x"40",x"40",x"40",x"50",x"54",x"53", -- 0x06C8 + x"3F",x"F6",x"4A",x"34",x"54",x"48",x"40",x"40", -- 0x06D0 + x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x06D8 + x"50",x"54",x"53",x"3F",x"F8",x"4A",x"35",x"54", -- 0x06E0 + x"48",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x06E8 + x"40",x"40",x"40",x"50",x"54",x"53",x"3F",x"A7", -- 0x06F0 + x"CA",x"06",x"07",x"3D",x"CA",x"29",x"07",x"3D", -- 0x06F8 + x"CA",x"84",x"07",x"C3",x"67",x"07",x"21",x"9F", -- 0x0700 + x"4B",x"11",x"E0",x"FF",x"3A",x"10",x"41",x"FE", -- 0x0708 + x"15",x"38",x"02",x"3E",x"14",x"47",x"A7",x"28", -- 0x0710 + x"06",x"36",x"CE",x"19",x"3D",x"20",x"F7",x"3E", -- 0x0718 + x"14",x"90",x"47",x"36",x"10",x"19",x"10",x"FB", -- 0x0720 + x"C9",x"3E",x"05",x"CD",x"3A",x"04",x"3A",x"02", -- 0x0728 + x"40",x"FE",x"63",x"38",x"02",x"3E",x"63",x"CD", -- 0x0730 + x"4D",x"07",x"47",x"E6",x"F0",x"28",x"07",x"0F", -- 0x0738 + x"0F",x"0F",x"0F",x"32",x"9F",x"4A",x"78",x"E6", -- 0x0740 + x"0F",x"32",x"7F",x"4A",x"C9",x"47",x"E6",x"0F", -- 0x0748 + x"C6",x"00",x"27",x"4F",x"78",x"E6",x"F0",x"28", -- 0x0750 + x"0B",x"0F",x"0F",x"0F",x"0F",x"47",x"AF",x"C6", -- 0x0758 + x"16",x"27",x"10",x"FB",x"81",x"27",x"C9",x"3A", -- 0x0760 + x"1D",x"41",x"47",x"4F",x"21",x"7F",x"48",x"11", -- 0x0768 + x"20",x"00",x"A7",x"28",x"05",x"36",x"CC",x"19", -- 0x0770 + x"10",x"FB",x"3E",x"06",x"91",x"47",x"36",x"10", -- 0x0778 + x"19",x"10",x"FB",x"C9",x"DD",x"21",x"CE",x"43", -- 0x0780 + x"FD",x"21",x"38",x"4A",x"0E",x"05",x"06",x"03", -- 0x0788 + x"11",x"E0",x"FF",x"26",x"04",x"DD",x"7E",x"00", -- 0x0790 + x"0F",x"0F",x"0F",x"0F",x"CD",x"B2",x"07",x"DD", -- 0x0798 + x"7E",x"00",x"CD",x"B2",x"07",x"DD",x"2B",x"10", -- 0x07A0 + x"EC",x"11",x"BE",x"00",x"FD",x"19",x"0D",x"20", -- 0x07A8 + x"DD",x"C9",x"E6",x"0F",x"6F",x"7C",x"A7",x"20", -- 0x07B0 + x"06",x"FD",x"75",x"00",x"FD",x"19",x"C9",x"7D", -- 0x07B8 + x"A7",x"20",x"04",x"25",x"FD",x"19",x"C9",x"26", -- 0x07C0 + x"00",x"FD",x"75",x"00",x"FD",x"19",x"C9",x"F5", -- 0x07C8 + x"C5",x"D5",x"E5",x"DD",x"E5",x"FD",x"E5",x"AF", -- 0x07D0 + x"32",x"01",x"68",x"21",x"20",x"40",x"11",x"00", -- 0x07D8 + x"50",x"01",x"80",x"00",x"ED",x"B0",x"3A",x"00", -- 0x07E0 + x"70",x"3A",x"15",x"40",x"32",x"16",x"40",x"3A", -- 0x07E8 + x"13",x"40",x"32",x"15",x"40",x"2A",x"10",x"40", -- 0x07F0 + x"22",x"13",x"40",x"21",x"12",x"40",x"3A",x"02", -- 0x07F8 + x"81",x"2F",x"77",x"2B",x"3A",x"01",x"81",x"2F", -- 0x0800 + x"77",x"2B",x"3A",x"00",x"81",x"2F",x"77",x"21", -- 0x0808 + x"5F",x"42",x"35",x"CD",x"39",x"08",x"CD",x"DF", -- 0x0810 + x"27",x"21",x"2B",x"08",x"E5",x"3A",x"05",x"40", -- 0x0818 + x"EF",x"E9",x"08",x"AB",x"09",x"DD",x"0D",x"FD", -- 0x0820 + x"0F",x"21",x"10",x"FD",x"E1",x"DD",x"E1",x"E1", -- 0x0828 + x"D1",x"C1",x"3E",x"01",x"32",x"01",x"68",x"F1", -- 0x0830 + x"C9",x"21",x"18",x"40",x"7E",x"A7",x"28",x"03", -- 0x0838 + x"35",x"3E",x"80",x"32",x"02",x"81",x"21",x"10", -- 0x0840 + x"40",x"7E",x"2C",x"2C",x"2C",x"B6",x"2C",x"2C", -- 0x0848 + x"2F",x"A6",x"2C",x"A6",x"E6",x"C4",x"28",x"24", -- 0x0850 + x"E6",x"C0",x"28",x"05",x"3E",x"06",x"32",x"18", -- 0x0858 + x"40",x"CD",x"B8",x"08",x"CD",x"2E",x"28",x"21", -- 0x0860 + x"02",x"40",x"34",x"7E",x"FE",x"63",x"38",x"02", -- 0x0868 + x"36",x"63",x"3A",x"06",x"40",x"0F",x"38",x"04", -- 0x0870 + x"11",x"01",x"07",x"FF",x"21",x"03",x"40",x"5E", -- 0x0878 + x"16",x"06",x"1A",x"1C",x"73",x"23",x"86",x"3D", -- 0x0880 + x"77",x"3A",x"B0",x"40",x"0F",x"D0",x"2A",x"B1", -- 0x0888 + x"40",x"7E",x"E6",x"07",x"20",x"1B",x"EB",x"2A", -- 0x0890 + x"B3",x"40",x"7E",x"FE",x"3F",x"28",x"11",x"23", -- 0x0898 + x"22",x"B3",x"40",x"D6",x"30",x"2A",x"B5",x"40", -- 0x08A0 + x"77",x"01",x"E0",x"FF",x"09",x"22",x"B5",x"40", -- 0x08A8 + x"EB",x"35",x"C0",x"AF",x"32",x"B0",x"40",x"C9", -- 0x08B0 + x"21",x"02",x"40",x"3A",x"07",x"40",x"A7",x"20", -- 0x08B8 + x"03",x"36",x"63",x"C9",x"3A",x"00",x"40",x"A7", -- 0x08C0 + x"C8",x"3D",x"28",x"05",x"3D",x"28",x"0E",x"34", -- 0x08C8 + x"C9",x"35",x"2D",x"34",x"7E",x"FE",x"02",x"C0", -- 0x08D0 + x"36",x"00",x"2C",x"34",x"C9",x"35",x"2D",x"34", -- 0x08D8 + x"7E",x"FE",x"03",x"C0",x"36",x"00",x"2C",x"34", -- 0x08E0 + x"C9",x"2A",x"0B",x"40",x"06",x"20",x"3E",x"10", -- 0x08E8 + x"D7",x"22",x"0B",x"40",x"21",x"08",x"40",x"35", -- 0x08F0 + x"C0",x"2D",x"2D",x"36",x"00",x"2D",x"36",x"01", -- 0x08F8 + x"AF",x"32",x"0A",x"40",x"21",x"2B",x"09",x"CD", -- 0x0900 + x"1A",x"09",x"11",x"04",x"06",x"FF",x"11",x"00", -- 0x0908 + x"05",x"FF",x"1E",x"02",x"FF",x"AF",x"32",x"80", -- 0x0910 + x"42",x"C9",x"11",x"21",x"40",x"06",x"20",x"7E", -- 0x0918 + x"12",x"23",x"1C",x"EB",x"36",x"00",x"EB",x"1C", -- 0x0920 + x"10",x"F5",x"C9",x"00",x"05",x"00",x"00",x"00", -- 0x0928 + x"01",x"06",x"00",x"03",x"03",x"03",x"01",x"01", -- 0x0930 + x"01",x"01",x"00",x"00",x"00",x"00",x"05",x"05", -- 0x0938 + x"05",x"05",x"05",x"06",x"06",x"06",x"06",x"06", -- 0x0940 + x"06",x"06",x"06",x"00",x"05",x"00",x"00",x"01", -- 0x0948 + x"01",x"06",x"03",x"03",x"04",x"04",x"04",x"04", -- 0x0950 + x"00",x"00",x"00",x"06",x"06",x"06",x"00",x"00", -- 0x0958 + x"00",x"05",x"06",x"06",x"06",x"06",x"06",x"06", -- 0x0960 + x"06",x"06",x"06",x"00",x"05",x"02",x"02",x"02", -- 0x0968 + x"02",x"06",x"02",x"00",x"00",x"02",x"01",x"01", -- 0x0970 + x"01",x"01",x"05",x"06",x"06",x"06",x"06",x"06", -- 0x0978 + x"06",x"06",x"06",x"06",x"06",x"06",x"06",x"00", -- 0x0980 + x"06",x"06",x"06",x"00",x"05",x"00",x"00",x"00", -- 0x0988 + x"00",x"06",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0990 + x"00",x"00",x"00",x"05",x"05",x"02",x"02",x"06", -- 0x0998 + x"06",x"07",x"07",x"04",x"04",x"00",x"00",x"00", -- 0x09A0 + x"06",x"06",x"06",x"21",x"C1",x"0D",x"E5",x"3A", -- 0x09A8 + x"80",x"42",x"EF",x"D3",x"09",x"11",x"0A",x"4B", -- 0x09B0 + x"0A",x"6C",x"0A",x"9E",x"0A",x"B2",x"0A",x"CF", -- 0x09B8 + x"0A",x"10",x"0B",x"39",x"0B",x"3A",x"0B",x"3B", -- 0x09C0 + x"0B",x"55",x"0B",x"D1",x"0B",x"21",x"0C",x"3C", -- 0x09C8 + x"0C",x"3D",x"0C",x"CD",x"69",x"28",x"21",x"20", -- 0x09D0 + x"40",x"11",x"21",x"40",x"01",x"7F",x"00",x"36", -- 0x09D8 + x"00",x"ED",x"B0",x"21",x"00",x"41",x"11",x"01", -- 0x09E0 + x"41",x"01",x"FF",x"01",x"36",x"00",x"ED",x"B0", -- 0x09E8 + x"21",x"A0",x"42",x"11",x"A1",x"42",x"01",x"FF", -- 0x09F0 + x"00",x"36",x"00",x"ED",x"B0",x"21",x"02",x"48", -- 0x09F8 + x"22",x"0B",x"40",x"21",x"09",x"40",x"36",x"20", -- 0x0A00 + x"21",x"80",x"42",x"34",x"AF",x"32",x"06",x"40", -- 0x0A08 + x"C9",x"2A",x"0B",x"40",x"06",x"1E",x"3E",x"10", -- 0x0A10 + x"D7",x"11",x"02",x"00",x"19",x"22",x"0B",x"40", -- 0x0A18 + x"21",x"09",x"40",x"35",x"C0",x"21",x"6B",x"09", -- 0x0A20 + x"CD",x"1A",x"09",x"AF",x"32",x"06",x"68",x"32", -- 0x0A28 + x"07",x"68",x"21",x"80",x"42",x"34",x"2C",x"36", -- 0x0A30 + x"01",x"2C",x"36",x"0B",x"2C",x"36",x"1E",x"11", -- 0x0A38 + x"01",x"07",x"FF",x"11",x"11",x"06",x"FF",x"1E", -- 0x0A40 + x"07",x"FF",x"C9",x"21",x"83",x"42",x"35",x"C0", -- 0x0A48 + x"36",x"1E",x"2D",x"5E",x"34",x"16",x"06",x"FF", -- 0x0A50 + x"7B",x"FE",x"0E",x"C0",x"2D",x"2D",x"34",x"21", -- 0x0A58 + x"F8",x"0A",x"22",x"84",x"42",x"21",x"60",x"40", -- 0x0A60 + x"22",x"86",x"42",x"C9",x"21",x"83",x"42",x"35", -- 0x0A68 + x"C0",x"36",x"1E",x"2D",x"5E",x"34",x"16",x"06", -- 0x0A70 + x"FF",x"2A",x"84",x"42",x"ED",x"5B",x"86",x"42", -- 0x0A78 + x"01",x"08",x"00",x"ED",x"B0",x"22",x"84",x"42", -- 0x0A80 + x"ED",x"53",x"86",x"42",x"3A",x"82",x"42",x"FE", -- 0x0A88 + x"12",x"C0",x"21",x"80",x"42",x"34",x"2C",x"2C", -- 0x0A90 + x"36",x"0C",x"2C",x"36",x"1E",x"C9",x"21",x"83", -- 0x0A98 + x"42",x"35",x"C0",x"36",x"0F",x"11",x"0E",x"06", -- 0x0AA0 + x"FF",x"1C",x"FF",x"1C",x"FF",x"2D",x"2D",x"2D", -- 0x0AA8 + x"34",x"C9",x"21",x"83",x"42",x"35",x"C0",x"36", -- 0x0AB0 + x"0F",x"11",x"8E",x"06",x"FF",x"1C",x"FF",x"1C", -- 0x0AB8 + x"FF",x"2D",x"35",x"28",x"04",x"2D",x"2D",x"35", -- 0x0AC0 + x"C9",x"36",x"14",x"2D",x"2D",x"34",x"C9",x"21", -- 0x0AC8 + x"82",x"42",x"35",x"C0",x"36",x"96",x"11",x"8D", -- 0x0AD0 + x"06",x"FF",x"21",x"60",x"40",x"11",x"61",x"40", -- 0x0AD8 + x"01",x"1F",x"00",x"36",x"00",x"ED",x"B0",x"3A", -- 0x0AE0 + x"00",x"40",x"C6",x"12",x"5F",x"16",x"06",x"FF", -- 0x0AE8 + x"1E",x"06",x"FF",x"21",x"80",x"42",x"34",x"C9", -- 0x0AF0 + x"34",x"EB",x"07",x"8B",x"8B",x"22",x"07",x"8B", -- 0x0AF8 + x"34",x"EB",x"03",x"A3",x"8B",x"22",x"03",x"A3", -- 0x0B00 + x"34",x"EB",x"01",x"BB",x"8B",x"22",x"01",x"BB", -- 0x0B08 + x"21",x"82",x"42",x"35",x"C0",x"21",x"8B",x"09", -- 0x0B10 + x"CD",x"1A",x"09",x"11",x"92",x"06",x"FF",x"1E", -- 0x0B18 + x"86",x"FF",x"1E",x"1A",x"06",x"06",x"FF",x"1C", -- 0x0B20 + x"10",x"FC",x"11",x"02",x"07",x"FF",x"21",x"80", -- 0x0B28 + x"42",x"34",x"34",x"34",x"2C",x"2C",x"36",x"DC", -- 0x0B30 + x"C9",x"C9",x"C9",x"3A",x"5F",x"42",x"0F",x"D8", -- 0x0B38 + x"21",x"82",x"42",x"35",x"C0",x"3E",x"20",x"32", -- 0x0B40 + x"09",x"40",x"21",x"02",x"48",x"22",x"0B",x"40", -- 0x0B48 + x"21",x"80",x"42",x"34",x"C9",x"2A",x"0B",x"40", -- 0x0B50 + x"06",x"1D",x"3E",x"10",x"D7",x"11",x"03",x"00", -- 0x0B58 + x"19",x"22",x"0B",x"40",x"21",x"09",x"40",x"35", -- 0x0B60 + x"C0",x"21",x"2B",x"09",x"CD",x"1A",x"09",x"21", -- 0x0B68 + x"C0",x"0B",x"22",x"07",x"42",x"AF",x"32",x"5F", -- 0x0B70 + x"42",x"32",x"06",x"68",x"32",x"07",x"68",x"32", -- 0x0B78 + x"0D",x"40",x"21",x"1D",x"0F",x"11",x"00",x"41", -- 0x0B80 + x"01",x"E0",x"00",x"ED",x"B0",x"21",x"3E",x"0C", -- 0x0B88 + x"11",x"50",x"41",x"01",x"90",x"00",x"ED",x"B0", -- 0x0B90 + x"3E",x"01",x"32",x"00",x"41",x"3E",x"0A",x"32", -- 0x0B98 + x"1A",x"41",x"21",x"01",x"00",x"22",x"00",x"42", -- 0x0BA0 + x"3E",x"7F",x"32",x"02",x"42",x"AF",x"32",x"58", -- 0x0BA8 + x"40",x"32",x"5A",x"40",x"11",x"00",x"02",x"FF", -- 0x0BB0 + x"21",x"80",x"42",x"34",x"2C",x"36",x"00",x"C9", -- 0x0BB8 + x"08",x"08",x"08",x"08",x"08",x"08",x"08",x"08", -- 0x0BC0 + x"08",x"08",x"08",x"08",x"08",x"08",x"08",x"08", -- 0x0BC8 + x"FF",x"CD",x"38",x"1A",x"CD",x"5E",x"1A",x"CD", -- 0x0BD0 + x"53",x"16",x"CD",x"66",x"16",x"3A",x"16",x"41", -- 0x0BD8 + x"A7",x"CC",x"93",x"1A",x"CD",x"CE",x"0C",x"CD", -- 0x0BE0 + x"F7",x"15",x"CD",x"E3",x"16",x"CD",x"45",x"0D", -- 0x0BE8 + x"CD",x"35",x"18",x"3A",x"8B",x"42",x"A7",x"CC", -- 0x0BF0 + x"A4",x"19",x"CD",x"0B",x"19",x"3A",x"1A",x"41", -- 0x0BF8 + x"A7",x"28",x"07",x"3A",x"11",x"41",x"A7",x"28", -- 0x0C00 + x"01",x"C9",x"21",x"80",x"42",x"34",x"2C",x"2C", -- 0x0C08 + x"36",x"B4",x"AF",x"32",x"90",x"42",x"CD",x"70", -- 0x0C10 + x"10",x"11",x"00",x"06",x"FF",x"1E",x"02",x"FF", -- 0x0C18 + x"C9",x"CD",x"5E",x"1A",x"CD",x"53",x"16",x"CD", -- 0x0C20 + x"66",x"16",x"CD",x"AD",x"13",x"3A",x"5F",x"42", -- 0x0C28 + x"0F",x"D8",x"21",x"82",x"42",x"35",x"C0",x"2D", -- 0x0C30 + x"2D",x"36",x"00",x"C9",x"C9",x"C9",x"00",x"03", -- 0x0C38 + x"03",x"03",x"01",x"00",x"00",x"03",x"03",x"03", -- 0x0C40 + x"01",x"00",x"03",x"00",x"00",x"00",x"00",x"01", -- 0x0C48 + x"03",x"00",x"00",x"00",x"00",x"01",x"03",x"00", -- 0x0C50 + x"00",x"00",x"00",x"01",x"03",x"00",x"00",x"00", -- 0x0C58 + x"00",x"01",x"03",x"03",x"03",x"03",x"01",x"01", -- 0x0C60 + x"03",x"03",x"03",x"03",x"01",x"01",x"03",x"03", -- 0x0C68 + x"03",x"03",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0C70 + x"03",x"03",x"00",x"00",x"00",x"00",x"03",x"03", -- 0x0C78 + x"00",x"00",x"00",x"03",x"03",x"00",x"00",x"00", -- 0x0C80 + x"03",x"03",x"00",x"00",x"00",x"03",x"03",x"00", -- 0x0C88 + x"00",x"00",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0C90 + x"03",x"03",x"03",x"03",x"03",x"03",x"03",x"00", -- 0x0C98 + x"00",x"00",x"00",x"03",x"03",x"00",x"03",x"03", -- 0x0CA0 + x"00",x"03",x"03",x"00",x"03",x"03",x"00",x"03", -- 0x0CA8 + x"03",x"00",x"03",x"03",x"00",x"03",x"03",x"00", -- 0x0CB0 + x"03",x"03",x"00",x"03",x"03",x"00",x"03",x"03", -- 0x0CB8 + x"00",x"03",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0CC0 + x"03",x"03",x"03",x"03",x"03",x"03",x"3A",x"16", -- 0x0CC8 + x"41",x"A7",x"C8",x"3A",x"88",x"42",x"EF",x"DD", -- 0x0CD0 + x"0C",x"F3",x"0C",x"16",x"0D",x"ED",x"5F",x"0F", -- 0x0CD8 + x"3E",x"68",x"38",x"02",x"3E",x"B8",x"21",x"88", -- 0x0CE0 + x"42",x"34",x"2C",x"77",x"2C",x"36",x"28",x"2C", -- 0x0CE8 + x"36",x"01",x"C9",x"21",x"02",x"42",x"3A",x"89", -- 0x0CF0 + x"42",x"BE",x"28",x"11",x"38",x"03",x"34",x"18", -- 0x0CF8 + x"01",x"35",x"7E",x"2F",x"C6",x"80",x"32",x"58", -- 0x0D00 + x"40",x"32",x"5A",x"40",x"C9",x"21",x"88",x"42", -- 0x0D08 + x"34",x"AF",x"32",x"8B",x"42",x"C9",x"21",x"64", -- 0x0D10 + x"42",x"CB",x"46",x"C8",x"2C",x"3A",x"02",x"42", -- 0x0D18 + x"C6",x"08",x"96",x"D8",x"FE",x"10",x"D0",x"2C", -- 0x0D20 + x"2C",x"7E",x"FE",x"B8",x"D8",x"21",x"02",x"42", -- 0x0D28 + x"35",x"7E",x"2F",x"C6",x"80",x"32",x"58",x"40", -- 0x0D30 + x"32",x"5A",x"40",x"21",x"8A",x"42",x"35",x"C0", -- 0x0D38 + x"2D",x"2D",x"36",x"00",x"C9",x"3A",x"7C",x"42", -- 0x0D40 + x"0F",x"D8",x"DD",x"21",x"A0",x"42",x"11",x"20", -- 0x0D48 + x"00",x"06",x"08",x"D9",x"CD",x"5D",x"0D",x"D9", -- 0x0D50 + x"DD",x"19",x"10",x"F7",x"C9",x"DD",x"CB",x"00", -- 0x0D58 + x"46",x"C8",x"DD",x"CB",x"08",x"46",x"C8",x"DD", -- 0x0D60 + x"CB",x"09",x"46",x"C0",x"DD",x"7E",x"0B",x"FE", -- 0x0D68 + x"80",x"D0",x"DD",x"7E",x"03",x"FE",x"60",x"D8", -- 0x0D70 + x"FE",x"C0",x"D0",x"DD",x"4E",x"06",x"DD",x"46", -- 0x0D78 + x"08",x"3A",x"02",x"42",x"05",x"28",x"09",x"B9", -- 0x0D80 + x"D8",x"4F",x"DD",x"7E",x"04",x"91",x"18",x"05", -- 0x0D88 + x"B9",x"D0",x"DD",x"96",x"04",x"D8",x"47",x"3E", -- 0x0D90 + x"E0",x"DD",x"96",x"03",x"DD",x"CB",x"19",x"46", -- 0x0D98 + x"20",x"13",x"DD",x"4E",x"16",x"0D",x"28",x"0D", -- 0x0DA0 + x"0F",x"0F",x"0F",x"E6",x"1F",x"B8",x"C0",x"3E", -- 0x0DA8 + x"01",x"32",x"7C",x"42",x"C9",x"0F",x"0F",x"E6", -- 0x0DB0 + x"3F",x"B8",x"C0",x"3E",x"01",x"32",x"7C",x"42", -- 0x0DB8 + x"C9",x"3A",x"02",x"40",x"A7",x"C8",x"21",x"05", -- 0x0DC0 + x"40",x"34",x"AF",x"32",x"0A",x"40",x"32",x"81", -- 0x0DC8 + x"42",x"21",x"21",x"0F",x"11",x"04",x"41",x"01", -- 0x0DD0 + x"0C",x"00",x"ED",x"B0",x"C9",x"21",x"75",x"0E", -- 0x0DD8 + x"E5",x"3A",x"0A",x"40",x"EF",x"EB",x"0D",x"21", -- 0x0DE0 + x"0E",x"67",x"0E",x"AF",x"32",x"00",x"41",x"11", -- 0x0DE8 + x"00",x"01",x"FF",x"21",x"4B",x"09",x"CD",x"1A", -- 0x0DF0 + x"09",x"21",x"60",x"40",x"06",x"40",x"AF",x"D7", -- 0x0DF8 + x"21",x"60",x"42",x"D7",x"06",x"40",x"D7",x"21", -- 0x0E00 + x"20",x"41",x"06",x"C0",x"D7",x"32",x"B0",x"40", -- 0x0E08 + x"32",x"06",x"40",x"21",x"02",x"48",x"22",x"0B", -- 0x0E10 + x"40",x"21",x"09",x"40",x"36",x"10",x"2C",x"34", -- 0x0E18 + x"C9",x"2A",x"0B",x"40",x"06",x"1D",x"3E",x"10", -- 0x0E20 + x"D7",x"11",x"03",x"00",x"19",x"06",x"1D",x"D7", -- 0x0E28 + x"19",x"22",x"0B",x"40",x"21",x"09",x"40",x"35", -- 0x0E30 + x"C0",x"2C",x"34",x"AF",x"32",x"06",x"68",x"32", -- 0x0E38 + x"07",x"68",x"32",x"0D",x"40",x"11",x"01",x"07", -- 0x0E40 + x"FF",x"11",x"01",x"06",x"FF",x"1E",x"16",x"FF", -- 0x0E48 + x"1C",x"FF",x"3A",x"17",x"40",x"47",x"E6",x"0F", -- 0x0E50 + x"32",x"78",x"49",x"78",x"E6",x"F0",x"C8",x"0F", -- 0x0E58 + x"0F",x"0F",x"0F",x"32",x"98",x"49",x"C9",x"3A", -- 0x0E60 + x"02",x"40",x"A7",x"C8",x"3D",x"11",x"18",x"06", -- 0x0E68 + x"28",x"01",x"1C",x"FF",x"C9",x"3A",x"11",x"40", -- 0x0E70 + x"CB",x"7F",x"C2",x"07",x"0F",x"CB",x"77",x"C8", -- 0x0E78 + x"3A",x"02",x"40",x"FE",x"02",x"D8",x"D6",x"02", -- 0x0E80 + x"32",x"02",x"40",x"21",x"00",x"01",x"22",x"0D", -- 0x0E88 + x"40",x"AF",x"32",x"0A",x"40",x"3E",x"03",x"32", -- 0x0E90 + x"05",x"40",x"3E",x"01",x"32",x"06",x"40",x"11", -- 0x0E98 + x"04",x"06",x"FF",x"21",x"1D",x"0F",x"11",x"00", -- 0x0EA0 + x"41",x"01",x"E0",x"00",x"ED",x"B0",x"21",x"1D", -- 0x0EA8 + x"0F",x"11",x"E0",x"41",x"01",x"20",x"00",x"ED", -- 0x0EB0 + x"B0",x"DD",x"21",x"20",x"41",x"21",x"10",x"42", -- 0x0EB8 + x"0E",x"30",x"06",x"04",x"CB",x"26",x"CB",x"26", -- 0x0EC0 + x"DD",x"CB",x"00",x"46",x"28",x"02",x"CB",x"C6", -- 0x0EC8 + x"DD",x"CB",x"00",x"4E",x"28",x"02",x"CB",x"CE", -- 0x0ED0 + x"DD",x"23",x"10",x"E8",x"23",x"0D",x"20",x"E2", -- 0x0ED8 + x"3E",x"01",x"32",x"00",x"41",x"32",x"E0",x"41", -- 0x0EE0 + x"3A",x"07",x"40",x"32",x"1D",x"41",x"32",x"FD", -- 0x0EE8 + x"41",x"AF",x"32",x"52",x"40",x"32",x"54",x"40", -- 0x0EF0 + x"CD",x"36",x"28",x"11",x"00",x"04",x"FF",x"3A", -- 0x0EF8 + x"0E",x"40",x"0F",x"D0",x"1C",x"FF",x"C9",x"3A", -- 0x0F00 + x"02",x"40",x"A7",x"28",x"0A",x"3D",x"32",x"02", -- 0x0F08 + x"40",x"21",x"00",x"00",x"C3",x"8E",x"0E",x"3E", -- 0x0F10 + x"01",x"32",x"05",x"40",x"C9",x"00",x"80",x"00", -- 0x0F18 + x"06",x"6C",x"64",x"64",x"64",x"64",x"65",x"30", -- 0x0F20 + x"31",x"32",x"33",x"34",x"35",x"00",x"2E",x"00", -- 0x0F28 + x"00",x"00",x"00",x"00",x"1C",x"20",x"24",x"5E", -- 0x0F30 + x"30",x"00",x"03",x"00",x"00",x"00",x"00",x"00", -- 0x0F38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F60 + x"00",x"00",x"00",x"00",x"00",x"00",x"01",x"01", -- 0x0F68 + x"01",x"01",x"00",x"00",x"01",x"01",x"01",x"01", -- 0x0F70 + x"00",x"01",x"00",x"00",x"00",x"00",x"01",x"01", -- 0x0F78 + x"00",x"00",x"00",x"00",x"01",x"01",x"00",x"00", -- 0x0F80 + x"00",x"00",x"01",x"01",x"00",x"00",x"00",x"00", -- 0x0F88 + x"01",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x0F90 + x"01",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x0F98 + x"01",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x0FA0 + x"01",x"00",x"00",x"00",x"00",x"01",x"01",x"00", -- 0x0FA8 + x"00",x"00",x"01",x"01",x"00",x"00",x"00",x"01", -- 0x0FB0 + x"01",x"00",x"00",x"00",x"01",x"01",x"00",x"00", -- 0x0FB8 + x"00",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x0FC0 + x"01",x"01",x"01",x"01",x"01",x"01",x"00",x"00", -- 0x0FC8 + x"00",x"00",x"01",x"01",x"00",x"01",x"01",x"00", -- 0x0FD0 + x"01",x"01",x"00",x"01",x"01",x"00",x"01",x"01", -- 0x0FD8 + x"00",x"01",x"01",x"00",x"01",x"01",x"00",x"01", -- 0x0FE0 + x"01",x"00",x"01",x"01",x"00",x"01",x"01",x"00", -- 0x0FE8 + x"01",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x0FF0 + x"01",x"01",x"01",x"01",x"01",x"CD",x"38",x"1A", -- 0x0FF8 + x"CD",x"5E",x"1A",x"CD",x"53",x"16",x"CD",x"66", -- 0x1000 + x"16",x"3A",x"0A",x"40",x"EF",x"45",x"10",x"7F", -- 0x1008 + x"10",x"98",x"10",x"00",x"11",x"0E",x"11",x"48", -- 0x1010 + x"11",x"D7",x"11",x"08",x"12",x"66",x"13",x"97", -- 0x1018 + x"13",x"CD",x"38",x"1A",x"CD",x"5E",x"1A",x"CD", -- 0x1020 + x"53",x"16",x"CD",x"66",x"16",x"3A",x"0A",x"40", -- 0x1028 + x"EF",x"45",x"10",x"7F",x"10",x"CC",x"10",x"00", -- 0x1030 + x"11",x"0E",x"11",x"48",x"11",x"4A",x"12",x"6C", -- 0x1038 + x"12",x"66",x"13",x"97",x"13",x"CD",x"69",x"28", -- 0x1040 + x"AF",x"32",x"81",x"42",x"21",x"00",x"42",x"06", -- 0x1048 + x"10",x"D7",x"21",x"60",x"42",x"D7",x"06",x"40", -- 0x1050 + x"D7",x"CD",x"70",x"10",x"21",x"53",x"19",x"22", -- 0x1058 + x"07",x"42",x"21",x"0A",x"40",x"34",x"2D",x"36", -- 0x1060 + x"20",x"21",x"00",x"48",x"22",x"0B",x"40",x"C9", -- 0x1068 + x"21",x"60",x"40",x"06",x"40",x"AF",x"D7",x"AF", -- 0x1070 + x"32",x"52",x"40",x"32",x"54",x"40",x"C9",x"2A", -- 0x1078 + x"0B",x"40",x"06",x"20",x"3E",x"10",x"D7",x"22", -- 0x1080 + x"0B",x"40",x"21",x"09",x"40",x"35",x"C0",x"2C", -- 0x1088 + x"34",x"21",x"2B",x"09",x"CD",x"1A",x"09",x"C9", -- 0x1090 + x"AF",x"32",x"5F",x"42",x"32",x"06",x"68",x"32", -- 0x1098 + x"07",x"68",x"32",x"0D",x"40",x"21",x"0A",x"40", -- 0x10A0 + x"34",x"2D",x"36",x"96",x"3A",x"0E",x"40",x"0F", -- 0x10A8 + x"38",x"14",x"11",x"00",x"05",x"FF",x"1E",x"02", -- 0x10B0 + x"FF",x"14",x"FF",x"1E",x"04",x"FF",x"11",x"03", -- 0x10B8 + x"07",x"FF",x"1E",x"00",x"FF",x"C9",x"11",x"01", -- 0x10C0 + x"05",x"FF",x"18",x"E6",x"AF",x"32",x"5F",x"42", -- 0x10C8 + x"3A",x"0F",x"40",x"0F",x"30",x"08",x"3E",x"01", -- 0x10D0 + x"32",x"06",x"68",x"32",x"07",x"68",x"3E",x"01", -- 0x10D8 + x"32",x"0D",x"40",x"21",x"0A",x"40",x"34",x"2D", -- 0x10E0 + x"36",x"96",x"11",x"00",x"05",x"FF",x"1C",x"FF", -- 0x10E8 + x"1C",x"FF",x"11",x"03",x"06",x"FF",x"1C",x"FF", -- 0x10F0 + x"11",x"03",x"07",x"FF",x"1E",x"00",x"FF",x"C9", -- 0x10F8 + x"21",x"09",x"40",x"35",x"C0",x"36",x"14",x"2C", -- 0x1100 + x"34",x"11",x"82",x"06",x"FF",x"C9",x"21",x"09", -- 0x1108 + x"40",x"35",x"C0",x"36",x"0A",x"2C",x"34",x"21", -- 0x1110 + x"60",x"42",x"06",x"20",x"AF",x"D7",x"21",x"01", -- 0x1118 + x"00",x"22",x"00",x"42",x"3E",x"80",x"32",x"02", -- 0x1120 + x"42",x"AF",x"32",x"58",x"40",x"32",x"5A",x"40", -- 0x1128 + x"3A",x"07",x"40",x"A7",x"20",x"05",x"3E",x"02", -- 0x1130 + x"32",x"1D",x"41",x"21",x"1D",x"41",x"35",x"11", -- 0x1138 + x"03",x"07",x"FF",x"11",x"00",x"02",x"FF",x"C9", -- 0x1140 + x"CD",x"78",x"27",x"CD",x"56",x"15",x"CD",x"53", -- 0x1148 + x"13",x"CD",x"8D",x"15",x"CD",x"A3",x"15",x"CD", -- 0x1150 + x"F7",x"15",x"CD",x"E3",x"16",x"CD",x"B4",x"16", -- 0x1158 + x"CD",x"35",x"18",x"CD",x"D6",x"18",x"CD",x"6C", -- 0x1160 + x"19",x"CD",x"A4",x"19",x"CD",x"17",x"1A",x"CD", -- 0x1168 + x"0B",x"19",x"3A",x"1A",x"41",x"A7",x"28",x"29", -- 0x1170 + x"3A",x"11",x"41",x"A7",x"28",x"31",x"21",x"00", -- 0x1178 + x"42",x"CB",x"46",x"C0",x"23",x"CB",x"46",x"C0", -- 0x1180 + x"3A",x"7C",x"42",x"0F",x"D8",x"3A",x"60",x"42", -- 0x1188 + x"47",x"3A",x"64",x"42",x"4F",x"3A",x"68",x"42", -- 0x1190 + x"B0",x"B1",x"0F",x"D8",x"21",x"0A",x"40",x"34", -- 0x1198 + x"C9",x"3A",x"01",x"42",x"0F",x"D8",x"AF",x"32", -- 0x11A0 + x"1D",x"41",x"21",x"0A",x"40",x"34",x"C9",x"21", -- 0x11A8 + x"00",x"42",x"CB",x"46",x"20",x"06",x"2C",x"CB", -- 0x11B0 + x"46",x"C0",x"18",x"CC",x"AF",x"21",x"60",x"42", -- 0x11B8 + x"06",x"20",x"D7",x"21",x"80",x"40",x"06",x"20", -- 0x11C0 + x"D7",x"21",x"B7",x"40",x"36",x"00",x"23",x"36", -- 0x11C8 + x"00",x"3E",x"08",x"32",x"0A",x"40",x"C9",x"3A", -- 0x11D0 + x"1D",x"41",x"A7",x"20",x"14",x"11",x"00",x"06", -- 0x11D8 + x"FF",x"1E",x"02",x"FF",x"21",x"0A",x"40",x"36", -- 0x11E0 + x"09",x"2B",x"36",x"B4",x"AF",x"32",x"90",x"42", -- 0x11E8 + x"C9",x"3A",x"0E",x"40",x"0F",x"38",x"09",x"21", -- 0x11F0 + x"0A",x"40",x"36",x"04",x"2B",x"36",x"64",x"C9", -- 0x11F8 + x"21",x"0A",x"40",x"34",x"2D",x"36",x"64",x"C9", -- 0x1200 + x"21",x"09",x"40",x"35",x"C0",x"3A",x"1D",x"41", -- 0x1208 + x"A7",x"20",x"0C",x"3A",x"0E",x"40",x"0F",x"38", -- 0x1210 + x"15",x"3E",x"01",x"32",x"05",x"40",x"C9",x"3A", -- 0x1218 + x"FD",x"41",x"A7",x"20",x"15",x"21",x"0A",x"40", -- 0x1220 + x"36",x"04",x"2B",x"36",x"01",x"C9",x"3A",x"FD", -- 0x1228 + x"41",x"A7",x"20",x"06",x"3E",x"01",x"32",x"05", -- 0x1230 + x"40",x"C9",x"CD",x"A2",x"12",x"CD",x"E3",x"12", -- 0x1238 + x"AF",x"32",x"0A",x"40",x"3E",x"04",x"32",x"05", -- 0x1240 + x"40",x"C9",x"3A",x"1D",x"41",x"A7",x"20",x"14", -- 0x1248 + x"11",x"00",x"06",x"FF",x"1E",x"03",x"FF",x"21", -- 0x1250 + x"0A",x"40",x"36",x"09",x"2B",x"36",x"B4",x"AF", -- 0x1258 + x"32",x"90",x"42",x"C9",x"21",x"0A",x"40",x"34", -- 0x1260 + x"2D",x"36",x"64",x"C9",x"21",x"09",x"40",x"35", -- 0x1268 + x"C0",x"3A",x"1D",x"41",x"A7",x"20",x"0C",x"3A", -- 0x1270 + x"FD",x"41",x"A7",x"20",x"15",x"3E",x"01",x"32", -- 0x1278 + x"05",x"40",x"C9",x"3A",x"FD",x"41",x"A7",x"20", -- 0x1280 + x"09",x"21",x"0A",x"40",x"36",x"04",x"2B",x"36", -- 0x1288 + x"01",x"C9",x"CD",x"A2",x"12",x"CD",x"E3",x"12", -- 0x1290 + x"AF",x"32",x"0A",x"40",x"3E",x"03",x"32",x"05", -- 0x1298 + x"40",x"C9",x"AF",x"21",x"A0",x"42",x"11",x"20", -- 0x12A0 + x"00",x"06",x"08",x"CB",x"46",x"28",x"01",x"3C", -- 0x12A8 + x"19",x"10",x"F8",x"47",x"21",x"12",x"41",x"7E", -- 0x12B0 + x"90",x"77",x"21",x"21",x"0F",x"11",x"04",x"41", -- 0x12B8 + x"01",x"0C",x"00",x"ED",x"B0",x"3A",x"12",x"41", -- 0x12C0 + x"A7",x"C8",x"47",x"16",x"00",x"DD",x"21",x"C3", -- 0x12C8 + x"1D",x"21",x"04",x"41",x"DD",x"5E",x"00",x"19", -- 0x12D0 + x"DD",x"7E",x"01",x"77",x"1E",x"05",x"DD",x"19", -- 0x12D8 + x"10",x"EF",x"C9",x"21",x"00",x"41",x"DD",x"21", -- 0x12E0 + x"E0",x"41",x"06",x"20",x"DD",x"7E",x"00",x"4E", -- 0x12E8 + x"DD",x"71",x"00",x"77",x"DD",x"23",x"23",x"10", -- 0x12F0 + x"F3",x"DD",x"21",x"20",x"41",x"FD",x"21",x"10", -- 0x12F8 + x"42",x"06",x"30",x"FD",x"4E",x"00",x"3E",x"03", -- 0x1300 + x"A1",x"6F",x"CB",x"09",x"CB",x"09",x"3E",x"03", -- 0x1308 + x"A1",x"67",x"CB",x"09",x"CB",x"09",x"3E",x"03", -- 0x1310 + x"A1",x"5F",x"CB",x"09",x"CB",x"09",x"3E",x"03", -- 0x1318 + x"A1",x"57",x"FD",x"23",x"0E",x"04",x"CB",x"27", -- 0x1320 + x"CB",x"27",x"DD",x"CB",x"00",x"4E",x"28",x"02", -- 0x1328 + x"CB",x"CF",x"DD",x"CB",x"00",x"46",x"28",x"02", -- 0x1330 + x"CB",x"C7",x"DD",x"23",x"0D",x"20",x"E7",x"DD", -- 0x1338 + x"72",x"FC",x"DD",x"73",x"FD",x"DD",x"74",x"FE", -- 0x1340 + x"DD",x"75",x"FF",x"FD",x"77",x"FF",x"05",x"C2", -- 0x1348 + x"03",x"13",x"C9",x"3A",x"1C",x"41",x"0F",x"D0", -- 0x1350 + x"3A",x"5F",x"42",x"E6",x"10",x"11",x"08",x"06", -- 0x1358 + x"28",x"02",x"1E",x"88",x"FF",x"C9",x"3A",x"16", -- 0x1360 + x"41",x"A7",x"CC",x"93",x"1A",x"3A",x"B7",x"40", -- 0x1368 + x"EF",x"FD",x"23",x"4C",x"24",x"73",x"24",x"7E", -- 0x1370 + x"24",x"91",x"24",x"A5",x"24",x"DE",x"24",x"DF", -- 0x1378 + x"24",x"24",x"25",x"57",x"25",x"8B",x"25",x"00", -- 0x1380 + x"26",x"28",x"26",x"36",x"26",x"50",x"26",x"5D", -- 0x1388 + x"26",x"7F",x"26",x"8E",x"26",x"F4",x"26",x"CD", -- 0x1390 + x"AD",x"13",x"3A",x"5F",x"42",x"0F",x"D8",x"21", -- 0x1398 + x"09",x"40",x"35",x"C0",x"36",x"0A",x"2C",x"36", -- 0x13A0 + x"07",x"CD",x"03",x"15",x"C9",x"CD",x"BE",x"13", -- 0x13A8 + x"3A",x"90",x"42",x"EF",x"F7",x"13",x"12",x"14", -- 0x13B0 + x"6A",x"14",x"B9",x"14",x"D6",x"14",x"3A",x"5F", -- 0x13B8 + x"42",x"E6",x"07",x"C0",x"21",x"9B",x"42",x"7E", -- 0x13C0 + x"3C",x"FE",x"06",x"20",x"01",x"AF",x"77",x"21", -- 0x13C8 + x"FD",x"14",x"4F",x"06",x"00",x"09",x"7E",x"32", -- 0x13D0 + x"31",x"40",x"32",x"33",x"40",x"32",x"35",x"40", -- 0x13D8 + x"C9",x"21",x"4C",x"48",x"22",x"92",x"42",x"22", -- 0x13E0 + x"96",x"42",x"21",x"5E",x"48",x"22",x"94",x"42", -- 0x13E8 + x"21",x"AC",x"4B",x"22",x"98",x"42",x"C9",x"CD", -- 0x13F0 + x"70",x"10",x"CD",x"E1",x"13",x"21",x"90",x"42", -- 0x13F8 + x"34",x"2C",x"36",x"32",x"21",x"9A",x"42",x"36", -- 0x1400 + x"07",x"2C",x"36",x"00",x"2C",x"36",x"00",x"C3", -- 0x1408 + x"C1",x"28",x"21",x"91",x"42",x"35",x"C0",x"36", -- 0x1410 + x"01",x"2D",x"34",x"21",x"39",x"40",x"D9",x"06", -- 0x1418 + x"00",x"3A",x"9C",x"42",x"4F",x"21",x"65",x"14", -- 0x1420 + x"09",x"7E",x"D9",x"06",x"19",x"77",x"2C",x"2C", -- 0x1428 + x"10",x"FB",x"3E",x"01",x"32",x"81",x"42",x"AF", -- 0x1430 + x"06",x"18",x"21",x"30",x"40",x"77",x"2C",x"2C", -- 0x1438 + x"10",x"FB",x"21",x"4C",x"48",x"0E",x"1C",x"06", -- 0x1440 + x"13",x"36",x"10",x"23",x"10",x"FB",x"11",x"0D", -- 0x1448 + x"00",x"19",x"0D",x"20",x"F2",x"11",x"00",x"06", -- 0x1450 + x"FF",x"3A",x"0D",x"40",x"1E",x"02",x"0F",x"D2", -- 0x1458 + x"38",x"00",x"1C",x"FF",x"C9",x"06",x"02",x"03", -- 0x1460 + x"07",x"00",x"21",x"91",x"42",x"35",x"C0",x"36", -- 0x1468 + x"03",x"06",x"13",x"3E",x"C8",x"2A",x"96",x"42", -- 0x1470 + x"ED",x"5B",x"98",x"42",x"77",x"12",x"13",x"23", -- 0x1478 + x"10",x"FA",x"06",x"28",x"2A",x"92",x"42",x"11", -- 0x1480 + x"20",x"00",x"77",x"19",x"10",x"FC",x"2A",x"94", -- 0x1488 + x"42",x"06",x"1C",x"77",x"19",x"10",x"FC",x"21", -- 0x1490 + x"92",x"42",x"34",x"2C",x"2C",x"35",x"2A",x"96", -- 0x1498 + x"42",x"19",x"22",x"96",x"42",x"2A",x"98",x"42", -- 0x14A0 + x"11",x"E0",x"FF",x"19",x"22",x"98",x"42",x"21", -- 0x14A8 + x"9A",x"42",x"35",x"C0",x"21",x"90",x"42",x"34", -- 0x14B0 + x"C9",x"CD",x"E1",x"13",x"21",x"90",x"42",x"36", -- 0x14B8 + x"01",x"2C",x"36",x"0A",x"21",x"9A",x"42",x"36", -- 0x14C0 + x"07",x"2C",x"2C",x"34",x"7E",x"FE",x"05",x"C0", -- 0x14C8 + x"3E",x"04",x"32",x"90",x"42",x"C9",x"3A",x"5F", -- 0x14D0 + x"42",x"E6",x"07",x"C0",x"3A",x"9B",x"42",x"2E", -- 0x14D8 + x"13",x"11",x"39",x"40",x"06",x"00",x"D6",x"01", -- 0x14E0 + x"30",x"02",x"3E",x"05",x"4F",x"E5",x"F5",x"21", -- 0x14E8 + x"FD",x"14",x"09",x"7E",x"12",x"1C",x"1C",x"F1", -- 0x14F0 + x"E1",x"2D",x"20",x"EA",x"C9",x"00",x"03",x"02", -- 0x14F8 + x"06",x"07",x"04",x"11",x"FD",x"FF",x"DD",x"21", -- 0x1500 + x"A4",x"40",x"3A",x"0D",x"40",x"0F",x"30",x"04", -- 0x1508 + x"DD",x"21",x"A7",x"40",x"FD",x"21",x"CE",x"43", -- 0x1510 + x"06",x"05",x"FD",x"7E",x"00",x"DD",x"BE",x"00", -- 0x1518 + x"20",x"0F",x"FD",x"7E",x"FF",x"DD",x"BE",x"FF", -- 0x1520 + x"20",x"07",x"FD",x"7E",x"FE",x"DD",x"BE",x"FE", -- 0x1528 + x"C8",x"30",x"04",x"FD",x"19",x"10",x"E3",x"3E", -- 0x1530 + x"05",x"90",x"C8",x"21",x"CE",x"43",x"11",x"D1", -- 0x1538 + x"43",x"47",x"87",x"80",x"06",x"00",x"4F",x"ED", -- 0x1540 + x"B8",x"2C",x"EB",x"DD",x"E5",x"E1",x"2D",x"2D", -- 0x1548 + x"01",x"03",x"00",x"ED",x"B0",x"C9",x"3A",x"1E", -- 0x1550 + x"41",x"0F",x"D8",x"21",x"A4",x"40",x"3A",x"0D", -- 0x1558 + x"40",x"0F",x"30",x"03",x"21",x"A7",x"40",x"3A", -- 0x1560 + x"17",x"40",x"47",x"7E",x"E6",x"0F",x"07",x"07", -- 0x1568 + x"07",x"07",x"4F",x"2D",x"7E",x"E6",x"F0",x"0F", -- 0x1570 + x"0F",x"0F",x"0F",x"B1",x"B8",x"D8",x"CD",x"47", -- 0x1578 + x"28",x"21",x"1D",x"41",x"34",x"11",x"03",x"07", -- 0x1580 + x"FF",x"2C",x"36",x"01",x"C9",x"3A",x"16",x"41", -- 0x1588 + x"A7",x"C0",x"21",x"1C",x"41",x"7E",x"0F",x"D2", -- 0x1590 + x"93",x"1A",x"11",x"88",x"06",x"FF",x"36",x"00", -- 0x1598 + x"C3",x"93",x"1A",x"21",x"00",x"42",x"CB",x"46", -- 0x15A0 + x"28",x"34",x"2C",x"2C",x"3A",x"0D",x"40",x"0F", -- 0x15A8 + x"38",x"3F",x"3A",x"10",x"40",x"47",x"CB",x"67", -- 0x15B0 + x"28",x"07",x"7E",x"FE",x"17",x"38",x"02",x"35", -- 0x15B8 + x"35",x"CB",x"68",x"28",x"07",x"7E",x"FE",x"E9", -- 0x15C0 + x"30",x"02",x"34",x"34",x"7E",x"2F",x"C6",x"80", -- 0x15C8 + x"0E",x"06",x"21",x"56",x"40",x"06",x"04",x"77", -- 0x15D0 + x"2C",x"71",x"2C",x"10",x"FA",x"C9",x"2C",x"CB", -- 0x15D8 + x"46",x"20",x"05",x"2C",x"36",x"00",x"18",x"E4", -- 0x15E0 + x"2C",x"7E",x"2F",x"C6",x"80",x"0E",x"07",x"18", -- 0x15E8 + x"E1",x"3A",x"11",x"40",x"47",x"18",x"BE",x"21", -- 0x15F0 + x"7C",x"42",x"CB",x"46",x"23",x"23",x"23",x"28", -- 0x15F8 + x"0C",x"7E",x"D6",x"05",x"77",x"FE",x"34",x"30", -- 0x1600 + x"16",x"AF",x"32",x"7C",x"42",x"36",x"DF",x"2D", -- 0x1608 + x"2D",x"3A",x"00",x"42",x"0F",x"30",x"06",x"3A", -- 0x1610 + x"02",x"42",x"77",x"18",x"02",x"36",x"00",x"DD", -- 0x1618 + x"21",x"9D",x"40",x"FD",x"21",x"7D",x"42",x"3A", -- 0x1620 + x"0F",x"40",x"0F",x"30",x"06",x"3A",x"0D",x"40", -- 0x1628 + x"0F",x"38",x"11",x"FD",x"7E",x"02",x"2F",x"C6", -- 0x1630 + x"FC",x"DD",x"77",x"02",x"FD",x"7E",x"00",x"2F", -- 0x1638 + x"DD",x"77",x"00",x"C9",x"FD",x"7E",x"02",x"3D", -- 0x1640 + x"DD",x"77",x"02",x"FD",x"7E",x"00",x"2F",x"DD", -- 0x1648 + x"77",x"00",x"C9",x"DD",x"21",x"A0",x"42",x"11", -- 0x1650 + x"20",x"00",x"06",x"08",x"D9",x"CD",x"D5",x"1A", -- 0x1658 + x"D9",x"DD",x"19",x"10",x"F7",x"C9",x"DD",x"21", -- 0x1660 + x"A0",x"42",x"FD",x"21",x"60",x"40",x"01",x"08", -- 0x1668 + x"08",x"DD",x"CB",x"00",x"46",x"28",x"27",x"DD", -- 0x1670 + x"7E",x"16",x"FD",x"77",x"02",x"DD",x"7E",x"03", -- 0x1678 + x"91",x"FD",x"77",x"03",x"DD",x"7E",x"04",x"2F", -- 0x1680 + x"91",x"FD",x"77",x"00",x"DD",x"7E",x"12",x"FD", -- 0x1688 + x"77",x"01",x"11",x"20",x"00",x"DD",x"19",x"1E", -- 0x1690 + x"04",x"FD",x"19",x"10",x"D4",x"C9",x"DD",x"CB", -- 0x1698 + x"01",x"46",x"28",x"06",x"FD",x"36",x"02",x"07", -- 0x16A0 + x"18",x"CD",x"FD",x"36",x"03",x"F8",x"FD",x"36", -- 0x16A8 + x"00",x"F8",x"18",x"DE",x"3A",x"00",x"42",x"0F", -- 0x16B0 + x"D0",x"3A",x"7C",x"42",x"0F",x"D8",x"3A",x"0D", -- 0x16B8 + x"40",x"0F",x"38",x"15",x"3A",x"13",x"40",x"2F", -- 0x16C0 + x"47",x"3A",x"10",x"40",x"A0",x"E6",x"08",x"C8", -- 0x16C8 + x"3E",x"01",x"32",x"7C",x"42",x"CD",x"32",x"28", -- 0x16D0 + x"C9",x"3A",x"14",x"40",x"2F",x"47",x"3A",x"11", -- 0x16D8 + x"40",x"18",x"E9",x"CD",x"59",x"17",x"CD",x"AC", -- 0x16E0 + x"17",x"CD",x"CB",x"17",x"CD",x"0E",x"18",x"C3", -- 0x16E8 + x"F2",x"16",x"06",x"08",x"21",x"60",x"42",x"CB", -- 0x16F0 + x"46",x"20",x"07",x"2C",x"2C",x"2C",x"2C",x"10", -- 0x16F8 + x"F6",x"C9",x"2C",x"2C",x"2C",x"7E",x"C6",x"38", -- 0x1700 + x"D6",x"10",x"30",x"F2",x"2D",x"2D",x"7E",x"C6", -- 0x1708 + x"E0",x"D6",x"20",x"30",x"05",x"11",x"20",x"41", -- 0x1710 + x"18",x"14",x"D6",x"30",x"D6",x"20",x"30",x"05", -- 0x1718 + x"11",x"30",x"41",x"18",x"09",x"D6",x"30",x"D6", -- 0x1720 + x"20",x"30",x"D1",x"11",x"40",x"41",x"C6",x"20", -- 0x1728 + x"E6",x"F8",x"1F",x"83",x"5F",x"2C",x"2C",x"7E", -- 0x1730 + x"D6",x"C8",x"E6",x"0C",x"1F",x"1F",x"83",x"5F", -- 0x1738 + x"1A",x"CB",x"4F",x"28",x"B9",x"4F",x"7D",x"FE", -- 0x1740 + x"7C",x"79",x"30",x"03",x"CB",x"D7",x"12",x"0E", -- 0x1748 + x"04",x"AF",x"77",x"2D",x"0D",x"20",x"FB",x"18", -- 0x1750 + x"A2",x"DD",x"21",x"60",x"42",x"11",x"04",x"00", -- 0x1758 + x"06",x"04",x"CD",x"6A",x"17",x"DD",x"19",x"10", -- 0x1760 + x"F9",x"C9",x"DD",x"CB",x"00",x"46",x"28",x"2B", -- 0x1768 + x"DD",x"CB",x"02",x"4E",x"28",x"18",x"DD",x"34", -- 0x1770 + x"01",x"DD",x"CB",x"02",x"46",x"28",x"0F",x"DD", -- 0x1778 + x"35",x"01",x"DD",x"35",x"01",x"DD",x"7E",x"01", -- 0x1780 + x"C6",x"10",x"D6",x"21",x"38",x"0D",x"DD",x"7E", -- 0x1788 + x"03",x"C6",x"02",x"DD",x"77",x"03",x"FE",x"F8", -- 0x1790 + x"30",x"01",x"C9",x"DD",x"36",x"00",x"00",x"DD", -- 0x1798 + x"36",x"01",x"00",x"DD",x"36",x"02",x"00",x"DD", -- 0x17A0 + x"36",x"03",x"00",x"C9",x"DD",x"21",x"68",x"42", -- 0x17A8 + x"DD",x"CB",x"00",x"46",x"28",x"E5",x"3A",x"10", -- 0x17B0 + x"41",x"FE",x"05",x"30",x"03",x"AF",x"18",x"02", -- 0x17B8 + x"3E",x"02",x"DD",x"86",x"03",x"DD",x"77",x"03", -- 0x17C0 + x"C3",x"96",x"17",x"DD",x"21",x"60",x"42",x"11", -- 0x17C8 + x"04",x"00",x"06",x"03",x"CD",x"DC",x"17",x"DD", -- 0x17D0 + x"19",x"10",x"F9",x"C9",x"DD",x"CB",x"00",x"46", -- 0x17D8 + x"C8",x"DD",x"7E",x"03",x"C6",x"1F",x"D6",x"05", -- 0x17E0 + x"38",x"17",x"D6",x"09",x"D0",x"3A",x"02",x"42", -- 0x17E8 + x"DD",x"96",x"01",x"C6",x"06",x"D6",x"0D",x"D0", -- 0x17F0 + x"CD",x"9B",x"17",x"3E",x"01",x"32",x"04",x"42", -- 0x17F8 + x"C9",x"3A",x"02",x"42",x"DD",x"96",x"01",x"C6", -- 0x1800 + x"02",x"D6",x"05",x"D0",x"18",x"EA",x"21",x"81", -- 0x1808 + x"40",x"11",x"61",x"42",x"06",x"03",x"1A",x"2F", -- 0x1810 + x"77",x"2C",x"2C",x"1C",x"1C",x"1A",x"77",x"3A", -- 0x1818 + x"0F",x"40",x"0F",x"30",x"06",x"3A",x"0D",x"40", -- 0x1820 + x"0F",x"38",x"03",x"7E",x"2F",x"77",x"2C",x"2C", -- 0x1828 + x"1C",x"1C",x"10",x"E2",x"C9",x"3A",x"7C",x"42", -- 0x1830 + x"0F",x"D0",x"DD",x"21",x"A0",x"42",x"11",x"20", -- 0x1838 + x"00",x"06",x"08",x"D9",x"CD",x"4D",x"18",x"D9", -- 0x1840 + x"DD",x"19",x"10",x"F7",x"C9",x"DD",x"CB",x"00", -- 0x1848 + x"46",x"C8",x"3A",x"7F",x"42",x"6F",x"3A",x"7D", -- 0x1850 + x"42",x"67",x"DD",x"7E",x"03",x"95",x"C6",x"02", -- 0x1858 + x"FE",x"06",x"D0",x"DD",x"7E",x"04",x"94",x"C6", -- 0x1860 + x"05",x"FE",x"0C",x"D0",x"DD",x"36",x"00",x"00", -- 0x1868 + x"DD",x"36",x"01",x"01",x"DD",x"36",x"02",x"00", -- 0x1870 + x"3A",x"06",x"40",x"0F",x"30",x"30",x"DD",x"CB", -- 0x1878 + x"19",x"46",x"28",x"05",x"CD",x"43",x"28",x"18", -- 0x1880 + x"03",x"CD",x"8A",x"28",x"16",x"03",x"DD",x"7E", -- 0x1888 + x"16",x"FE",x"07",x"28",x"06",x"FE",x"03",x"28", -- 0x1890 + x"06",x"18",x"08",x"1E",x"02",x"18",x"06",x"1E", -- 0x1898 + x"03",x"18",x"02",x"1E",x"05",x"DD",x"7E",x"19", -- 0x18A0 + x"0F",x"30",x"02",x"CB",x"23",x"FF",x"AF",x"32", -- 0x18A8 + x"7C",x"42",x"21",x"11",x"41",x"35",x"DD",x"7E", -- 0x18B0 + x"18",x"DD",x"36",x"18",x"00",x"3D",x"28",x"04", -- 0x18B8 + x"3D",x"28",x"0C",x"C9",x"DD",x"7E",x"17",x"C6", -- 0x18C0 + x"20",x"6F",x"26",x"41",x"CB",x"BE",x"C9",x"DD", -- 0x18C8 + x"7E",x"17",x"C6",x"50",x"18",x"F3",x"21",x"04", -- 0x18D0 + x"42",x"CB",x"46",x"28",x"16",x"36",x"00",x"21", -- 0x18D8 + x"00",x"01",x"22",x"00",x"42",x"21",x"0A",x"04", -- 0x18E0 + x"22",x"05",x"42",x"11",x"03",x"02",x"FF",x"CD", -- 0x18E8 + x"3F",x"28",x"C9",x"3A",x"01",x"42",x"0F",x"D0", -- 0x18F0 + x"21",x"05",x"42",x"35",x"C0",x"36",x"0A",x"23", -- 0x18F8 + x"16",x"02",x"5E",x"FF",x"35",x"C0",x"AF",x"32", -- 0x1900 + x"01",x"42",x"C9",x"3A",x"12",x"41",x"FE",x"2E", -- 0x1908 + x"C8",x"3A",x"00",x"42",x"0F",x"D0",x"3A",x"16", -- 0x1910 + x"41",x"A7",x"C8",x"3A",x"5F",x"42",x"E6",x"07", -- 0x1918 + x"C0",x"3A",x"5F",x"42",x"A7",x"20",x"0E",x"2A", -- 0x1920 + x"07",x"42",x"23",x"7E",x"3C",x"20",x"03",x"21", -- 0x1928 + x"53",x"19",x"22",x"07",x"42",x"2A",x"07",x"42", -- 0x1930 + x"46",x"21",x"A0",x"42",x"11",x"1F",x"00",x"7E", -- 0x1938 + x"23",x"B6",x"0F",x"30",x"04",x"19",x"10",x"F7", -- 0x1940 + x"C9",x"23",x"36",x"00",x"2B",x"36",x"00",x"2B", -- 0x1948 + x"36",x"01",x"C9",x"08",x"08",x"04",x"04",x"04", -- 0x1950 + x"05",x"05",x"05",x"06",x"06",x"06",x"07",x"07", -- 0x1958 + x"07",x"08",x"08",x"08",x"08",x"08",x"08",x"04", -- 0x1960 + x"04",x"04",x"04",x"FF",x"3A",x"10",x"41",x"FE", -- 0x1968 + x"04",x"D8",x"3A",x"00",x"42",x"0F",x"D0",x"21", -- 0x1970 + x"B8",x"42",x"11",x"20",x"00",x"06",x"08",x"CB", -- 0x1978 + x"46",x"20",x"04",x"19",x"10",x"F9",x"C9",x"7D", -- 0x1980 + x"D6",x"15",x"6F",x"3A",x"60",x"42",x"0F",x"D8", -- 0x1988 + x"7E",x"2C",x"46",x"FE",x"C8",x"D0",x"FE",x"60", -- 0x1990 + x"D8",x"21",x"60",x"42",x"36",x"01",x"2C",x"70", -- 0x1998 + x"2C",x"2C",x"77",x"C9",x"3A",x"00",x"42",x"0F", -- 0x19A0 + x"D0",x"3A",x"02",x"42",x"4F",x"26",x"FF",x"2E", -- 0x19A8 + x"00",x"DD",x"21",x"A0",x"42",x"11",x"20",x"00", -- 0x19B0 + x"06",x"08",x"DD",x"CB",x"00",x"46",x"28",x"12", -- 0x19B8 + x"DD",x"7E",x"04",x"B9",x"30",x"06",x"79",x"DD", -- 0x19C0 + x"96",x"04",x"18",x"01",x"91",x"BC",x"30",x"02", -- 0x19C8 + x"67",x"68",x"DD",x"19",x"10",x"E4",x"7D",x"A7", -- 0x19D0 + x"C8",x"3E",x"08",x"95",x"21",x"A0",x"42",x"A7", -- 0x19D8 + x"28",x"04",x"3D",x"19",x"18",x"F9",x"2C",x"2C", -- 0x19E0 + x"2C",x"DD",x"21",x"64",x"42",x"DD",x"CB",x"00", -- 0x19E8 + x"46",x"C0",x"7E",x"FE",x"60",x"D8",x"47",x"3A", -- 0x19F0 + x"10",x"41",x"0E",x"A8",x"A7",x"28",x"07",x"0E", -- 0x19F8 + x"B8",x"3D",x"28",x"02",x"0E",x"C8",x"78",x"B9", -- 0x1A00 + x"D0",x"DD",x"36",x"00",x"01",x"7E",x"DD",x"77", -- 0x1A08 + x"03",x"2C",x"7E",x"DD",x"77",x"01",x"C9",x"3A", -- 0x1A10 + x"00",x"42",x"0F",x"D0",x"3A",x"00",x"41",x"0F", -- 0x1A18 + x"D0",x"3A",x"10",x"41",x"FE",x"02",x"D8",x"21", -- 0x1A20 + x"68",x"42",x"CB",x"46",x"C0",x"34",x"2C",x"3A", -- 0x1A28 + x"01",x"41",x"77",x"2C",x"2C",x"36",x"38",x"C9", -- 0x1A30 + x"21",x"DF",x"41",x"1E",x"06",x"0E",x"06",x"06", -- 0x1A38 + x"18",x"CB",x"4E",x"20",x"0C",x"7D",x"93",x"6F", -- 0x1A40 + x"10",x"F7",x"7D",x"C6",x"8F",x"6F",x"0D",x"20", -- 0x1A48 + x"EE",x"3E",x"40",x"41",x"0E",x"04",x"04",x"81", -- 0x1A50 + x"10",x"FD",x"32",x"1B",x"41",x"C9",x"3A",x"00", -- 0x1A58 + x"41",x"A7",x"C8",x"3A",x"5F",x"42",x"E6",x"01", -- 0x1A60 + x"C8",x"21",x"02",x"41",x"7E",x"2D",x"0F",x"38", -- 0x1A68 + x"12",x"7E",x"FE",x"27",x"38",x"15",x"3D",x"77", -- 0x1A70 + x"2F",x"C6",x"80",x"21",x"2A",x"40",x"77",x"2C", -- 0x1A78 + x"2C",x"77",x"C9",x"7E",x"FE",x"D9",x"30",x"07", -- 0x1A80 + x"3C",x"18",x"EC",x"2C",x"36",x"01",x"C9",x"2C", -- 0x1A88 + x"36",x"00",x"C9",x"3A",x"52",x"40",x"A7",x"20", -- 0x1A90 + x"0E",x"3E",x"30",x"32",x"52",x"40",x"32",x"54", -- 0x1A98 + x"40",x"21",x"20",x"41",x"C3",x"CC",x"1A",x"21", -- 0x1AA0 + x"52",x"40",x"34",x"23",x"23",x"34",x"7E",x"FE", -- 0x1AA8 + x"80",x"21",x"30",x"41",x"CA",x"CC",x"1A",x"FE", -- 0x1AB0 + x"D0",x"21",x"40",x"41",x"CA",x"CC",x"1A",x"A7", -- 0x1AB8 + x"C0",x"3E",x"10",x"21",x"13",x"41",x"06",x"03", -- 0x1AC0 + x"D7",x"36",x"30",x"C9",x"06",x"10",x"3E",x"02", -- 0x1AC8 + x"77",x"23",x"10",x"FC",x"C9",x"DD",x"CB",x"01", -- 0x1AD0 + x"46",x"C2",x"19",x"1B",x"DD",x"CB",x"00",x"46", -- 0x1AD8 + x"C8",x"DD",x"7E",x"02",x"EF",x"56",x"1D",x"0F", -- 0x1AE0 + x"1F",x"3E",x"1F",x"50",x"1F",x"5A",x"1F",x"87", -- 0x1AE8 + x"1F",x"AB",x"1F",x"B5",x"1F",x"C4",x"1F",x"42", -- 0x1AF0 + x"21",x"4C",x"21",x"5A",x"21",x"64",x"21",x"91", -- 0x1AF8 + x"21",x"9B",x"21",x"A5",x"21",x"AF",x"21",x"BC", -- 0x1B00 + x"21",x"BF",x"21",x"C9",x"21",x"D8",x"21",x"89", -- 0x1B08 + x"23",x"93",x"23",x"A1",x"23",x"AB",x"23",x"D8", -- 0x1B10 + x"23",x"DD",x"7E",x"02",x"EF",x"21",x"1B",x"31", -- 0x1B18 + x"1B",x"DD",x"36",x"10",x"04",x"DD",x"36",x"11", -- 0x1B20 + x"04",x"DD",x"36",x"12",x"1C",x"DD",x"34",x"02", -- 0x1B28 + x"C9",x"DD",x"35",x"10",x"C0",x"DD",x"36",x"10", -- 0x1B30 + x"04",x"DD",x"34",x"12",x"DD",x"35",x"11",x"C0", -- 0x1B38 + x"DD",x"36",x"01",x"00",x"C9",x"DD",x"7E",x"04", -- 0x1B40 + x"DD",x"BE",x"06",x"28",x"4A",x"DD",x"7E",x"03", -- 0x1B48 + x"DD",x"BE",x"05",x"28",x"58",x"DD",x"CB",x"09", -- 0x1B50 + x"46",x"28",x"1E",x"DD",x"7E",x"07",x"DD",x"86", -- 0x1B58 + x"03",x"DD",x"77",x"03",x"DD",x"7E",x"0B",x"DD", -- 0x1B60 + x"86",x"0A",x"DD",x"77",x"0A",x"D0",x"DD",x"7E", -- 0x1B68 + x"08",x"DD",x"86",x"04",x"DD",x"77",x"04",x"A7", -- 0x1B70 + x"C9",x"DD",x"7E",x"08",x"DD",x"86",x"04",x"DD", -- 0x1B78 + x"77",x"04",x"DD",x"7E",x"0B",x"DD",x"86",x"0A", -- 0x1B80 + x"DD",x"77",x"0A",x"D0",x"DD",x"7E",x"07",x"DD", -- 0x1B88 + x"86",x"03",x"DD",x"77",x"03",x"A7",x"C9",x"DD", -- 0x1B90 + x"7E",x"03",x"DD",x"BE",x"05",x"28",x"0C",x"30", -- 0x1B98 + x"05",x"DD",x"34",x"03",x"A7",x"C9",x"DD",x"35", -- 0x1BA0 + x"03",x"A7",x"C9",x"37",x"C9",x"DD",x"7E",x"04", -- 0x1BA8 + x"DD",x"BE",x"06",x"30",x"05",x"DD",x"34",x"04", -- 0x1BB0 + x"A7",x"C9",x"DD",x"35",x"04",x"A7",x"C9",x"DD", -- 0x1BB8 + x"35",x"0E",x"C0",x"DD",x"6E",x"0C",x"DD",x"66", -- 0x1BC0 + x"0D",x"7E",x"FE",x"FF",x"20",x"06",x"23",x"5E", -- 0x1BC8 + x"23",x"56",x"EB",x"7E",x"DD",x"77",x"12",x"23", -- 0x1BD0 + x"7E",x"DD",x"77",x"0E",x"23",x"DD",x"75",x"0C", -- 0x1BD8 + x"DD",x"74",x"0D",x"C9",x"8E",x"0A",x"8F",x"0A", -- 0x1BE0 + x"90",x"0A",x"91",x"0A",x"92",x"0A",x"F1",x"05", -- 0x1BE8 + x"F0",x"05",x"EF",x"05",x"EE",x"05",x"ED",x"05", -- 0x1BF0 + x"FF",x"12",x"1C",x"0E",x"0A",x"0F",x"0A",x"10", -- 0x1BF8 + x"0A",x"11",x"0A",x"12",x"0A",x"71",x"05",x"70", -- 0x1C00 + x"05",x"6F",x"05",x"6E",x"05",x"6D",x"05",x"FF", -- 0x1C08 + x"12",x"1C",x"E9",x"05",x"EA",x"05",x"EB",x"05", -- 0x1C10 + x"EC",x"05",x"FF",x"12",x"1C",x"6E",x"05",x"6F", -- 0x1C18 + x"05",x"6E",x"05",x"6D",x"05",x"E9",x"05",x"EA", -- 0x1C20 + x"05",x"EB",x"05",x"EC",x"05",x"ED",x"05",x"EE", -- 0x1C28 + x"05",x"EF",x"05",x"EE",x"05",x"ED",x"05",x"FF", -- 0x1C30 + x"12",x"1C",x"E4",x"03",x"E5",x"03",x"E6",x"03", -- 0x1C38 + x"E7",x"03",x"E8",x"03",x"A7",x"03",x"A6",x"03", -- 0x1C40 + x"A5",x"03",x"A4",x"03",x"FF",x"4F",x"1C",x"20", -- 0x1C48 + x"05",x"21",x"05",x"22",x"05",x"23",x"05",x"FF", -- 0x1C50 + x"4F",x"1C",x"25",x"05",x"26",x"05",x"25",x"05", -- 0x1C58 + x"24",x"05",x"20",x"05",x"21",x"05",x"22",x"05", -- 0x1C60 + x"23",x"05",x"A4",x"05",x"A5",x"05",x"A6",x"05", -- 0x1C68 + x"A5",x"05",x"A4",x"05",x"FF",x"4F",x"1C",x"2D", -- 0x1C70 + x"03",x"2E",x"03",x"2F",x"03",x"30",x"03",x"31", -- 0x1C78 + x"03",x"70",x"03",x"6F",x"03",x"6E",x"03",x"6D", -- 0x1C80 + x"03",x"FF",x"12",x"1C",x"DD",x"E5",x"E1",x"3E", -- 0x1C88 + x"07",x"85",x"6F",x"DD",x"36",x"0A",x"00",x"DD", -- 0x1C90 + x"7E",x"05",x"DD",x"BE",x"03",x"28",x"04",x"38", -- 0x1C98 + x"1E",x"18",x"56",x"DD",x"7E",x"06",x"DD",x"BE", -- 0x1CA0 + x"04",x"28",x"0E",x"38",x"06",x"36",x"00",x"2C", -- 0x1CA8 + x"36",x"01",x"C9",x"36",x"00",x"2C",x"36",x"FF", -- 0x1CB0 + x"C9",x"36",x"00",x"2C",x"36",x"00",x"C9",x"DD", -- 0x1CB8 + x"7E",x"06",x"DD",x"BE",x"04",x"28",x"2C",x"38", -- 0x1CC0 + x"15",x"36",x"FF",x"2C",x"36",x"01",x"DD",x"7E", -- 0x1CC8 + x"03",x"DD",x"96",x"05",x"47",x"DD",x"7E",x"06", -- 0x1CD0 + x"DD",x"96",x"04",x"4F",x"18",x"55",x"36",x"FF", -- 0x1CD8 + x"2C",x"36",x"FF",x"DD",x"7E",x"03",x"DD",x"96", -- 0x1CE0 + x"05",x"47",x"DD",x"7E",x"04",x"DD",x"96",x"06", -- 0x1CE8 + x"4F",x"18",x"40",x"36",x"FF",x"2C",x"36",x"00", -- 0x1CF0 + x"C9",x"DD",x"7E",x"06",x"DD",x"BE",x"04",x"28", -- 0x1CF8 + x"2C",x"38",x"15",x"36",x"01",x"2C",x"36",x"01", -- 0x1D00 + x"DD",x"7E",x"05",x"DD",x"96",x"03",x"47",x"DD", -- 0x1D08 + x"7E",x"06",x"DD",x"96",x"04",x"4F",x"18",x"1B", -- 0x1D10 + x"36",x"01",x"2C",x"36",x"FF",x"DD",x"7E",x"05", -- 0x1D18 + x"DD",x"96",x"03",x"47",x"DD",x"7E",x"04",x"DD", -- 0x1D20 + x"96",x"06",x"4F",x"18",x"06",x"36",x"01",x"2C", -- 0x1D28 + x"36",x"00",x"C9",x"79",x"B8",x"28",x"16",x"38", -- 0x1D30 + x"0B",x"DD",x"36",x"09",x"00",x"CD",x"E4",x"23", -- 0x1D38 + x"DD",x"77",x"0B",x"C9",x"DD",x"36",x"09",x"01", -- 0x1D40 + x"78",x"41",x"4F",x"18",x"F0",x"DD",x"36",x"09", -- 0x1D48 + x"01",x"DD",x"36",x"0B",x"FF",x"C9",x"DD",x"36", -- 0x1D50 + x"18",x"00",x"DD",x"36",x"19",x"00",x"21",x"A7", -- 0x1D58 + x"1E",x"DD",x"75",x"13",x"DD",x"74",x"14",x"DD", -- 0x1D60 + x"36",x"10",x"30",x"DD",x"36",x"0E",x"01",x"21", -- 0x1D68 + x"12",x"41",x"7E",x"34",x"47",x"87",x"87",x"80", -- 0x1D70 + x"5F",x"16",x"00",x"21",x"C1",x"1D",x"19",x"3E", -- 0x1D78 + x"30",x"86",x"DD",x"77",x"03",x"23",x"3A",x"01", -- 0x1D80 + x"41",x"86",x"DD",x"77",x"04",x"23",x"5E",x"23", -- 0x1D88 + x"46",x"23",x"7E",x"DD",x"77",x"16",x"21",x"04", -- 0x1D90 + x"41",x"19",x"70",x"DD",x"36",x"12",x"0B",x"3A", -- 0x1D98 + x"01",x"41",x"FE",x"80",x"30",x"11",x"DD",x"36", -- 0x1DA0 + x"15",x"00",x"21",x"E4",x"1B",x"DD",x"75",x"0C", -- 0x1DA8 + x"DD",x"74",x"0D",x"DD",x"34",x"02",x"C9",x"DD", -- 0x1DB0 + x"36",x"15",x"01",x"21",x"FB",x"1B",x"C3",x"AD", -- 0x1DB8 + x"1D",x"F1",x"EF",x"00",x"66",x"07",x"F1",x"12", -- 0x1DC0 + x"05",x"66",x"07",x"F3",x"EB",x"00",x"6D",x"07", -- 0x1DC8 + x"F3",x"16",x"05",x"67",x"07",x"F3",x"EE",x"00", -- 0x1DD0 + x"68",x"07",x"F3",x"13",x"05",x"68",x"07",x"F5", -- 0x1DD8 + x"EA",x"00",x"6E",x"07",x"F5",x"17",x"05",x"69", -- 0x1DE0 + x"07",x"F5",x"EF",x"00",x"6A",x"03",x"F5",x"12", -- 0x1DE8 + x"05",x"6A",x"03",x"F7",x"EB",x"00",x"6F",x"01", -- 0x1DF0 + x"F7",x"16",x"05",x"6B",x"01",x"F7",x"EE",x"00", -- 0x1DF8 + x"10",x"07",x"F7",x"13",x"05",x"10",x"03",x"F1", -- 0x1E00 + x"F2",x"01",x"6C",x"01",x"F1",x"0F",x"04",x"65", -- 0x1E08 + x"07",x"F1",x"F7",x"01",x"66",x"03",x"F1",x"0A", -- 0x1E10 + x"04",x"66",x"01",x"F3",x"F3",x"01",x"6D",x"07", -- 0x1E18 + x"F3",x"0E",x"04",x"67",x"03",x"F3",x"F6",x"01", -- 0x1E20 + x"68",x"01",x"F3",x"0B",x"04",x"68",x"07",x"F5", -- 0x1E28 + x"F2",x"01",x"6E",x"03",x"F5",x"0F",x"04",x"69", -- 0x1E30 + x"01",x"F5",x"F7",x"01",x"6A",x"07",x"F5",x"0A", -- 0x1E38 + x"04",x"6A",x"03",x"F7",x"F3",x"01",x"6F",x"03", -- 0x1E40 + x"F7",x"0E",x"04",x"6B",x"07",x"F7",x"F6",x"01", -- 0x1E48 + x"10",x"03",x"F7",x"0B",x"04",x"10",x"03",x"F1", -- 0x1E50 + x"FA",x"02",x"6C",x"07",x"F1",x"07",x"03",x"65", -- 0x1E58 + x"03",x"F1",x"FF",x"02",x"66",x"01",x"F1",x"02", -- 0x1E60 + x"03",x"66",x"07",x"F3",x"FB",x"02",x"6D",x"03", -- 0x1E68 + x"F3",x"06",x"03",x"67",x"01",x"F3",x"FE",x"02", -- 0x1E70 + x"68",x"07",x"F3",x"03",x"03",x"68",x"03",x"F5", -- 0x1E78 + x"FA",x"02",x"6E",x"03",x"F5",x"07",x"03",x"69", -- 0x1E80 + x"07",x"F5",x"FF",x"02",x"6A",x"03",x"F5",x"02", -- 0x1E88 + x"03",x"6A",x"03",x"F7",x"FB",x"02",x"6F",x"07", -- 0x1E90 + x"F7",x"06",x"03",x"6B",x"03",x"F7",x"FE",x"02", -- 0x1E98 + x"10",x"03",x"F7",x"03",x"03",x"10",x"07",x"FF", -- 0x1EA0 + x"00",x"FF",x"00",x"FF",x"00",x"FF",x"01",x"FF", -- 0x1EA8 + x"00",x"FF",x"00",x"FF",x"01",x"FF",x"00",x"FF", -- 0x1EB0 + x"01",x"FF",x"00",x"00",x"01",x"FF",x"00",x"FF", -- 0x1EB8 + x"01",x"00",x"01",x"FF",x"00",x"00",x"01",x"FF", -- 0x1EC0 + x"01",x"00",x"01",x"FF",x"01",x"00",x"01",x"00", -- 0x1EC8 + x"01",x"FF",x"01",x"00",x"01",x"00",x"01",x"00", -- 0x1ED0 + x"01",x"00",x"01",x"00",x"01",x"00",x"01",x"01", -- 0x1ED8 + x"01",x"00",x"01",x"00",x"01",x"01",x"01",x"00", -- 0x1EE0 + x"01",x"01",x"01",x"00",x"01",x"01",x"00",x"00", -- 0x1EE8 + x"01",x"01",x"01",x"01",x"00",x"00",x"01",x"01", -- 0x1EF0 + x"00",x"01",x"01",x"01",x"00",x"01",x"01",x"01", -- 0x1EF8 + x"00",x"01",x"00",x"01",x"01",x"01",x"00",x"01", -- 0x1F00 + x"00",x"01",x"00",x"01",x"00",x"01",x"00",x"DD", -- 0x1F08 + x"35",x"10",x"28",x"27",x"DD",x"6E",x"13",x"DD", -- 0x1F10 + x"66",x"14",x"DD",x"7E",x"03",x"86",x"DD",x"77", -- 0x1F18 + x"03",x"23",x"7E",x"23",x"DD",x"75",x"13",x"DD", -- 0x1F20 + x"74",x"14",x"DD",x"CB",x"15",x"46",x"28",x"02", -- 0x1F28 + x"ED",x"44",x"DD",x"86",x"04",x"DD",x"77",x"04", -- 0x1F30 + x"C3",x"BF",x"1B",x"DD",x"34",x"02",x"3A",x"1B", -- 0x1F38 + x"41",x"DD",x"77",x"05",x"DD",x"7E",x"04",x"DD", -- 0x1F40 + x"77",x"06",x"CD",x"8C",x"1C",x"DD",x"34",x"02", -- 0x1F48 + x"CD",x"BF",x"1B",x"CD",x"45",x"1B",x"D0",x"DD", -- 0x1F50 + x"34",x"02",x"3A",x"1C",x"41",x"0F",x"3E",x"01", -- 0x1F58 + x"30",x"1F",x"3E",x"03",x"18",x"1B",x"3A",x"04", -- 0x1F60 + x"40",x"47",x"3A",x"10",x"41",x"A7",x"28",x"07", -- 0x1F68 + x"3D",x"28",x"0A",x"3E",x"01",x"18",x"0A",x"3E", -- 0x1F70 + x"03",x"A0",x"3C",x"18",x"04",x"3E",x"01",x"A0", -- 0x1F78 + x"3C",x"DD",x"77",x"10",x"DD",x"34",x"02",x"3A", -- 0x1F80 + x"04",x"40",x"47",x"E6",x"70",x"FE",x"60",x"38", -- 0x1F88 + x"02",x"D6",x"20",x"C6",x"58",x"DD",x"77",x"05", -- 0x1F90 + x"78",x"FE",x"D0",x"38",x"02",x"D6",x"80",x"C6", -- 0x1F98 + x"18",x"DD",x"77",x"06",x"CD",x"8C",x"1C",x"DD", -- 0x1FA0 + x"34",x"02",x"C9",x"CD",x"BF",x"1B",x"CD",x"45", -- 0x1FA8 + x"1B",x"D0",x"DD",x"34",x"02",x"DD",x"35",x"10", -- 0x1FB0 + x"28",x"07",x"DD",x"35",x"02",x"DD",x"35",x"02", -- 0x1FB8 + x"C9",x"DD",x"34",x"02",x"DD",x"36",x"02",x"04", -- 0x1FC0 + x"3A",x"00",x"42",x"0F",x"D0",x"3A",x"16",x"41", -- 0x1FC8 + x"A7",x"C8",x"ED",x"5F",x"E6",x"03",x"28",x"13", -- 0x1FD0 + x"3D",x"28",x"44",x"3D",x"28",x"72",x"3A",x"02", -- 0x1FD8 + x"42",x"FE",x"58",x"38",x"6B",x"FE",x"A8",x"38", -- 0x1FE0 + x"02",x"18",x"34",x"21",x"20",x"41",x"CD",x"AA", -- 0x1FE8 + x"20",x"DA",x"81",x"20",x"21",x"2C",x"41",x"CD", -- 0x1FF0 + x"C6",x"20",x"DA",x"81",x"20",x"21",x"30",x"41", -- 0x1FF8 + x"CD",x"AA",x"20",x"DA",x"81",x"20",x"21",x"3C", -- 0x2000 + x"41",x"CD",x"C6",x"20",x"38",x"73",x"21",x"40", -- 0x2008 + x"41",x"CD",x"AA",x"20",x"38",x"6B",x"21",x"4C", -- 0x2010 + x"41",x"CD",x"C6",x"20",x"38",x"63",x"C9",x"21", -- 0x2018 + x"3C",x"41",x"CD",x"C6",x"20",x"38",x"5A",x"21", -- 0x2020 + x"30",x"41",x"CD",x"AA",x"20",x"38",x"52",x"21", -- 0x2028 + x"4C",x"41",x"CD",x"C6",x"20",x"38",x"4A",x"21", -- 0x2030 + x"40",x"41",x"CD",x"AA",x"20",x"38",x"42",x"21", -- 0x2038 + x"20",x"41",x"CD",x"AA",x"20",x"38",x"3A",x"21", -- 0x2040 + x"2C",x"41",x"CD",x"C6",x"20",x"38",x"32",x"C9", -- 0x2048 + x"21",x"40",x"41",x"CD",x"AA",x"20",x"38",x"29", -- 0x2050 + x"21",x"4C",x"41",x"CD",x"C6",x"20",x"38",x"21", -- 0x2058 + x"21",x"20",x"41",x"CD",x"AA",x"20",x"38",x"19", -- 0x2060 + x"21",x"2C",x"41",x"CD",x"C6",x"20",x"38",x"11", -- 0x2068 + x"21",x"30",x"41",x"CD",x"AA",x"20",x"38",x"09", -- 0x2070 + x"21",x"3C",x"41",x"CD",x"C6",x"20",x"38",x"01", -- 0x2078 + x"C9",x"CB",x"FE",x"7D",x"D6",x"20",x"DD",x"77", -- 0x2080 + x"17",x"DD",x"36",x"18",x"01",x"87",x"5F",x"16", -- 0x2088 + x"00",x"21",x"E2",x"20",x"19",x"7E",x"D6",x"10", -- 0x2090 + x"DD",x"77",x"05",x"23",x"7E",x"DD",x"77",x"06", -- 0x2098 + x"CD",x"8C",x"1C",x"DD",x"36",x"02",x"09",x"C3", -- 0x20A0 + x"42",x"21",x"11",x"0F",x"04",x"4A",x"42",x"CB", -- 0x20A8 + x"4E",x"20",x"0D",x"7D",x"82",x"6F",x"10",x"F7", -- 0x20B0 + x"7D",x"93",x"6F",x"0D",x"20",x"F0",x"A7",x"C9", -- 0x20B8 + x"A7",x"CB",x"7E",x"C0",x"37",x"C9",x"11",x"11", -- 0x20C0 + x"04",x"4A",x"42",x"CB",x"4E",x"20",x"0D",x"7D", -- 0x20C8 + x"92",x"6F",x"10",x"F7",x"7D",x"83",x"6F",x"0D", -- 0x20D0 + x"20",x"F0",x"A7",x"C9",x"A7",x"CB",x"7E",x"C0", -- 0x20D8 + x"37",x"C9",x"C8",x"24",x"CC",x"24",x"D0",x"24", -- 0x20E0 + x"D4",x"24",x"C8",x"2C",x"CC",x"2C",x"D0",x"2C", -- 0x20E8 + x"D4",x"2C",x"C8",x"34",x"CC",x"34",x"D0",x"34", -- 0x20F0 + x"D4",x"34",x"C8",x"3C",x"CC",x"3C",x"D0",x"3C", -- 0x20F8 + x"D4",x"3C",x"C8",x"74",x"CC",x"74",x"D0",x"74", -- 0x2100 + x"D4",x"74",x"C8",x"7C",x"CC",x"7C",x"D0",x"7C", -- 0x2108 + x"D4",x"7C",x"C8",x"84",x"CC",x"84",x"D0",x"84", -- 0x2110 + x"D4",x"84",x"C8",x"8C",x"CC",x"8C",x"D0",x"8C", -- 0x2118 + x"D4",x"8C",x"C8",x"C4",x"CC",x"C4",x"D0",x"C4", -- 0x2120 + x"D4",x"C4",x"C8",x"CC",x"CC",x"CC",x"D0",x"CC", -- 0x2128 + x"D4",x"CC",x"C8",x"D4",x"CC",x"D4",x"D0",x"D4", -- 0x2130 + x"D4",x"D4",x"C8",x"DC",x"CC",x"DC",x"D0",x"DC", -- 0x2138 + x"D4",x"DC",x"CD",x"BF",x"1B",x"CD",x"45",x"1B", -- 0x2140 + x"D0",x"DD",x"34",x"02",x"DD",x"7E",x"05",x"C6", -- 0x2148 + x"10",x"DD",x"77",x"05",x"CD",x"8C",x"1C",x"DD", -- 0x2150 + x"34",x"02",x"CD",x"BF",x"1B",x"CD",x"45",x"1B", -- 0x2158 + x"D0",x"DD",x"34",x"02",x"CD",x"9E",x"28",x"21", -- 0x2160 + x"3A",x"1C",x"DD",x"75",x"0C",x"DD",x"74",x"0D", -- 0x2168 + x"DD",x"36",x"0E",x"01",x"DD",x"36",x"10",x"0F", -- 0x2170 + x"DD",x"36",x"18",x"00",x"DD",x"36",x"19",x"01", -- 0x2178 + x"DD",x"7E",x"17",x"C6",x"20",x"6F",x"26",x"41", -- 0x2180 + x"36",x"00",x"21",x"16",x"41",x"35",x"DD",x"34", -- 0x2188 + x"02",x"CD",x"BF",x"1B",x"DD",x"35",x"10",x"C0", -- 0x2190 + x"DD",x"34",x"02",x"DD",x"36",x"05",x"B8",x"CD", -- 0x2198 + x"8C",x"1C",x"DD",x"34",x"02",x"CD",x"BF",x"1B", -- 0x21A0 + x"CD",x"45",x"1B",x"D0",x"DD",x"34",x"02",x"3A", -- 0x21A8 + x"04",x"40",x"E6",x"03",x"3E",x"01",x"DD",x"77", -- 0x21B0 + x"10",x"DD",x"34",x"02",x"CD",x"87",x"1F",x"CD", -- 0x21B8 + x"BF",x"1B",x"CD",x"45",x"1B",x"D0",x"DD",x"34", -- 0x21C0 + x"02",x"DD",x"35",x"10",x"28",x"07",x"DD",x"35", -- 0x21C8 + x"02",x"DD",x"35",x"02",x"C9",x"DD",x"34",x"02", -- 0x21D0 + x"3A",x"04",x"40",x"E6",x"03",x"21",x"50",x"41", -- 0x21D8 + x"3D",x"28",x"09",x"21",x"80",x"41",x"3D",x"28", -- 0x21E0 + x"03",x"21",x"B0",x"41",x"CD",x"14",x"22",x"DD", -- 0x21E8 + x"36",x"02",x"10",x"D0",x"DD",x"6E",x"17",x"26", -- 0x21F0 + x"00",x"29",x"EB",x"21",x"69",x"22",x"19",x"7E", -- 0x21F8 + x"C6",x"10",x"DD",x"77",x"05",x"23",x"7E",x"DD", -- 0x2200 + x"77",x"06",x"CD",x"8C",x"1C",x"DD",x"36",x"02", -- 0x2208 + x"15",x"C3",x"89",x"23",x"08",x"3E",x"01",x"08", -- 0x2210 + x"16",x"06",x"ED",x"5F",x"E6",x"07",x"4F",x"87", -- 0x2218 + x"47",x"87",x"80",x"85",x"6F",x"1E",x"08",x"7B", -- 0x2220 + x"91",x"47",x"7E",x"CB",x"46",x"20",x"24",x"7D", -- 0x2228 + x"C6",x"06",x"6F",x"1D",x"10",x"F4",x"7B",x"A7", -- 0x2230 + x"28",x"0A",x"7D",x"D6",x"30",x"6F",x"43",x"08", -- 0x2238 + x"AF",x"08",x"18",x"E6",x"08",x"A7",x"28",x"04", -- 0x2240 + x"7D",x"D6",x"30",x"6F",x"08",x"2C",x"15",x"20", -- 0x2248 + x"D4",x"A7",x"C9",x"CB",x"4E",x"20",x"D8",x"A7", -- 0x2250 + x"CB",x"7E",x"C0",x"CB",x"FE",x"7D",x"D6",x"50", -- 0x2258 + x"DD",x"77",x"17",x"DD",x"36",x"18",x"02",x"37", -- 0x2260 + x"C9",x"44",x"1C",x"48",x"1C",x"4C",x"1C",x"50", -- 0x2268 + x"1C",x"54",x"1C",x"58",x"1C",x"44",x"24",x"48", -- 0x2270 + x"24",x"4C",x"24",x"50",x"24",x"54",x"24",x"58", -- 0x2278 + x"24",x"44",x"2C",x"48",x"2C",x"4C",x"2C",x"50", -- 0x2280 + x"2C",x"54",x"2C",x"58",x"2C",x"44",x"34",x"48", -- 0x2288 + x"34",x"4C",x"34",x"50",x"34",x"54",x"34",x"58", -- 0x2290 + x"34",x"44",x"3C",x"48",x"3C",x"4C",x"3C",x"50", -- 0x2298 + x"3C",x"54",x"3C",x"58",x"3C",x"44",x"44",x"48", -- 0x22A0 + x"44",x"4C",x"44",x"50",x"44",x"54",x"44",x"58", -- 0x22A8 + x"44",x"44",x"4C",x"48",x"4C",x"4C",x"4C",x"50", -- 0x22B0 + x"4C",x"54",x"4C",x"58",x"4C",x"44",x"54",x"48", -- 0x22B8 + x"54",x"4C",x"54",x"50",x"54",x"54",x"54",x"58", -- 0x22C0 + x"54",x"44",x"64",x"48",x"64",x"4C",x"64",x"50", -- 0x22C8 + x"64",x"54",x"64",x"58",x"64",x"44",x"6C",x"48", -- 0x22D0 + x"6C",x"4C",x"6C",x"50",x"6C",x"54",x"6C",x"58", -- 0x22D8 + x"6C",x"44",x"74",x"48",x"74",x"4C",x"74",x"50", -- 0x22E0 + x"74",x"54",x"74",x"58",x"74",x"44",x"7C",x"48", -- 0x22E8 + x"7C",x"4C",x"7C",x"50",x"7C",x"54",x"7C",x"58", -- 0x22F0 + x"7C",x"44",x"84",x"48",x"84",x"4C",x"84",x"50", -- 0x22F8 + x"84",x"54",x"84",x"58",x"84",x"44",x"8C",x"48", -- 0x2300 + x"8C",x"4C",x"8C",x"50",x"8C",x"54",x"8C",x"58", -- 0x2308 + x"8C",x"44",x"94",x"48",x"94",x"4C",x"94",x"50", -- 0x2310 + x"94",x"54",x"94",x"58",x"94",x"44",x"9C",x"48", -- 0x2318 + x"9C",x"4C",x"9C",x"50",x"9C",x"54",x"9C",x"58", -- 0x2320 + x"9C",x"44",x"AC",x"48",x"AC",x"4C",x"AC",x"50", -- 0x2328 + x"AC",x"54",x"AC",x"58",x"AC",x"44",x"B4",x"48", -- 0x2330 + x"B4",x"4C",x"B4",x"50",x"B4",x"54",x"B4",x"58", -- 0x2338 + x"B4",x"44",x"BC",x"48",x"BC",x"4C",x"BC",x"50", -- 0x2340 + x"BC",x"54",x"BC",x"58",x"BC",x"44",x"C4",x"48", -- 0x2348 + x"C4",x"4C",x"C4",x"50",x"C4",x"54",x"C4",x"58", -- 0x2350 + x"C4",x"44",x"CC",x"48",x"CC",x"4C",x"CC",x"50", -- 0x2358 + x"CC",x"54",x"CC",x"58",x"CC",x"44",x"D4",x"48", -- 0x2360 + x"D4",x"4C",x"D4",x"50",x"D4",x"54",x"D4",x"58", -- 0x2368 + x"D4",x"44",x"DC",x"48",x"DC",x"4C",x"DC",x"50", -- 0x2370 + x"DC",x"54",x"DC",x"58",x"DC",x"44",x"E4",x"48", -- 0x2378 + x"E4",x"4C",x"E4",x"50",x"E4",x"54",x"E4",x"58", -- 0x2380 + x"E4",x"CD",x"BF",x"1B",x"CD",x"45",x"1B",x"D0", -- 0x2388 + x"DD",x"34",x"02",x"DD",x"7E",x"05",x"D6",x"10", -- 0x2390 + x"DD",x"77",x"05",x"CD",x"8C",x"1C",x"DD",x"34", -- 0x2398 + x"02",x"CD",x"BF",x"1B",x"CD",x"45",x"1B",x"D0", -- 0x23A0 + x"DD",x"34",x"02",x"CD",x"A8",x"28",x"21",x"77", -- 0x23A8 + x"1C",x"DD",x"75",x"0C",x"DD",x"74",x"0D",x"DD", -- 0x23B0 + x"36",x"0E",x"01",x"DD",x"7E",x"17",x"C6",x"50", -- 0x23B8 + x"6F",x"26",x"41",x"36",x"03",x"DD",x"36",x"18", -- 0x23C0 + x"00",x"DD",x"36",x"19",x"00",x"21",x"1A",x"41", -- 0x23C8 + x"35",x"DD",x"36",x"10",x"0F",x"DD",x"34",x"02", -- 0x23D0 + x"CD",x"BF",x"1B",x"DD",x"35",x"10",x"C0",x"DD", -- 0x23D8 + x"36",x"02",x"02",x"C9",x"AF",x"67",x"68",x"57", -- 0x23E0 + x"59",x"06",x"08",x"CB",x"FF",x"07",x"29",x"A7", -- 0x23E8 + x"ED",x"52",x"38",x"03",x"10",x"F5",x"C9",x"19", -- 0x23F0 + x"CB",x"87",x"10",x"EF",x"C9",x"CD",x"69",x"28", -- 0x23F8 + x"21",x"B8",x"40",x"35",x"C0",x"2D",x"3A",x"1C", -- 0x2400 + x"41",x"47",x"0F",x"38",x"17",x"3A",x"1A",x"41", -- 0x2408 + x"FE",x"2C",x"30",x"36",x"78",x"A7",x"20",x"32", -- 0x2410 + x"3E",x"01",x"32",x"1C",x"41",x"11",x"08",x"06", -- 0x2418 + x"FF",x"36",x"02",x"C9",x"AF",x"32",x"1C",x"41", -- 0x2420 + x"11",x"88",x"06",x"FF",x"36",x"07",x"26",x"40", -- 0x2428 + x"2E",x"AE",x"36",x"20",x"2E",x"BF",x"36",x"12", -- 0x2430 + x"7C",x"C6",x"42",x"67",x"2E",x"02",x"36",x"0A", -- 0x2438 + x"7E",x"E6",x"F0",x"C8",x"26",x"40",x"2E",x"A1", -- 0x2440 + x"34",x"C9",x"34",x"C9",x"21",x"10",x"41",x"34", -- 0x2448 + x"11",x"00",x"07",x"FF",x"21",x"21",x"0F",x"11", -- 0x2450 + x"04",x"41",x"01",x"0C",x"00",x"ED",x"B0",x"21", -- 0x2458 + x"11",x"41",x"36",x"2E",x"23",x"36",x"00",x"3E", -- 0x2460 + x"05",x"32",x"0A",x"40",x"21",x"53",x"19",x"22", -- 0x2468 + x"07",x"42",x"C9",x"21",x"B7",x"40",x"34",x"2C", -- 0x2470 + x"36",x"06",x"23",x"36",x"0A",x"C9",x"21",x"B9", -- 0x2478 + x"40",x"35",x"C0",x"36",x"0A",x"21",x"20",x"41", -- 0x2480 + x"AF",x"06",x"30",x"D7",x"21",x"B7",x"40",x"34", -- 0x2488 + x"C9",x"21",x"B9",x"40",x"35",x"C0",x"36",x"0A", -- 0x2490 + x"21",x"20",x"41",x"3E",x"02",x"06",x"30",x"D7", -- 0x2498 + x"21",x"B7",x"40",x"34",x"C9",x"21",x"B8",x"40", -- 0x24A0 + x"35",x"20",x"29",x"2D",x"36",x"00",x"3E",x"30", -- 0x24A8 + x"32",x"16",x"41",x"21",x"10",x"41",x"34",x"11", -- 0x24B0 + x"00",x"07",x"FF",x"21",x"D8",x"24",x"11",x"04", -- 0x24B8 + x"41",x"01",x"06",x"00",x"ED",x"B0",x"21",x"11", -- 0x24C0 + x"41",x"36",x"18",x"2C",x"36",x"16",x"3E",x"05", -- 0x24C8 + x"32",x"0A",x"40",x"C9",x"2D",x"36",x"03",x"C9", -- 0x24D0 + x"10",x"68",x"64",x"64",x"68",x"10",x"C9",x"21", -- 0x24D8 + x"00",x"41",x"36",x"00",x"2C",x"34",x"7E",x"47", -- 0x24E0 + x"2F",x"C6",x"80",x"32",x"2A",x"40",x"32",x"2C", -- 0x24E8 + x"40",x"78",x"FE",x"FF",x"C0",x"36",x"80",x"21", -- 0x24F0 + x"B7",x"40",x"34",x"16",x"01",x"FF",x"23",x"36", -- 0x24F8 + x"19",x"26",x"40",x"2E",x"AE",x"7E",x"34",x"C6", -- 0x2500 + x"62",x"67",x"16",x"40",x"1E",x"BF",x"1A",x"D6", -- 0x2508 + x"10",x"6F",x"C6",x"0A",x"77",x"3D",x"77",x"AF", -- 0x2510 + x"86",x"E6",x"F0",x"C6",x"E0",x"C8",x"3E",x"01", -- 0x2518 + x"32",x"0A",x"40",x"C9",x"21",x"B8",x"40",x"35", -- 0x2520 + x"C0",x"3E",x"F7",x"32",x"BB",x"40",x"2F",x"32", -- 0x2528 + x"38",x"40",x"32",x"3A",x"40",x"21",x"B7",x"40", -- 0x2530 + x"34",x"CD",x"8F",x"28",x"11",x"09",x"06",x"FF", -- 0x2538 + x"26",x"40",x"2E",x"AE",x"7E",x"C6",x"61",x"67", -- 0x2540 + x"2E",x"02",x"36",x"0C",x"36",x"06",x"7E",x"E6", -- 0x2548 + x"F0",x"C8",x"21",x"1A",x"41",x"34",x"C9",x"21", -- 0x2550 + x"BA",x"40",x"36",x"01",x"2C",x"35",x"7E",x"47", -- 0x2558 + x"2F",x"C6",x"80",x"32",x"38",x"40",x"32",x"3A", -- 0x2560 + x"40",x"78",x"FE",x"80",x"C0",x"11",x"89",x"06", -- 0x2568 + x"FF",x"16",x"40",x"23",x"1E",x"BF",x"36",x"00", -- 0x2570 + x"21",x"B7",x"40",x"34",x"1A",x"C6",x"70",x"67", -- 0x2578 + x"D6",x"80",x"6F",x"C6",x"0A",x"77",x"3C",x"77", -- 0x2580 + x"3D",x"77",x"C9",x"CD",x"A3",x"15",x"CD",x"F7", -- 0x2588 + x"15",x"CD",x"B4",x"16",x"21",x"BC",x"40",x"7E", -- 0x2590 + x"2D",x"0F",x"38",x"08",x"35",x"7E",x"FE",x"27", -- 0x2598 + x"38",x"13",x"18",x"06",x"34",x"7E",x"FE",x"D9", -- 0x25A0 + x"30",x"0B",x"2F",x"C6",x"80",x"32",x"38",x"40", -- 0x25A8 + x"32",x"3A",x"40",x"18",x"02",x"2C",x"34",x"CD", -- 0x25B0 + x"E6",x"25",x"38",x"13",x"3A",x"BC",x"40",x"FE", -- 0x25B8 + x"0A",x"C0",x"AF",x"32",x"9D",x"40",x"11",x"89", -- 0x25C0 + x"06",x"FF",x"21",x"B7",x"40",x"34",x"C9",x"CD", -- 0x25C8 + x"4B",x"28",x"AF",x"32",x"9D",x"40",x"11",x"89", -- 0x25D0 + x"06",x"FF",x"21",x"B7",x"40",x"36",x"0D",x"2C", -- 0x25D8 + x"36",x"0A",x"2C",x"36",x"06",x"C9",x"21",x"7C", -- 0x25E0 + x"42",x"7E",x"0F",x"D0",x"23",x"3A",x"BB",x"40", -- 0x25E8 + x"C6",x"02",x"96",x"FE",x"05",x"D0",x"2C",x"2C", -- 0x25F0 + x"7E",x"FE",x"6E",x"D0",x"FE",x"69",x"3F",x"C9", -- 0x25F8 + x"CD",x"94",x"28",x"AF",x"32",x"BA",x"40",x"32", -- 0x2600 + x"7C",x"42",x"21",x"BB",x"40",x"35",x"7E",x"47", -- 0x2608 + x"2F",x"C6",x"80",x"32",x"38",x"40",x"32",x"3A", -- 0x2610 + x"40",x"78",x"FE",x"08",x"C0",x"CD",x"0E",x"27", -- 0x2618 + x"21",x"B7",x"40",x"34",x"2C",x"36",x"64",x"C9", -- 0x2620 + x"21",x"B8",x"40",x"35",x"C0",x"3E",x"01",x"32", -- 0x2628 + x"00",x"41",x"32",x"B7",x"40",x"C9",x"CD",x"94", -- 0x2630 + x"28",x"21",x"B8",x"40",x"35",x"C0",x"CD",x"4B", -- 0x2638 + x"28",x"AF",x"32",x"BA",x"40",x"32",x"7C",x"42", -- 0x2640 + x"36",x"0A",x"CD",x"0E",x"27",x"2D",x"34",x"C9", -- 0x2648 + x"21",x"B8",x"40",x"35",x"C0",x"36",x"0A",x"CD", -- 0x2650 + x"21",x"27",x"2D",x"34",x"C9",x"21",x"B9",x"40", -- 0x2658 + x"35",x"20",x"17",x"CD",x"0E",x"27",x"11",x"AB", -- 0x2660 + x"40",x"AF",x"12",x"1C",x"12",x"1C",x"12",x"E5", -- 0x2668 + x"CD",x"AC",x"26",x"E1",x"36",x"64",x"2D",x"2D", -- 0x2670 + x"34",x"C9",x"2D",x"2D",x"36",x"0D",x"C9",x"21", -- 0x2678 + x"B9",x"40",x"35",x"C0",x"11",x"8A",x"06",x"FF", -- 0x2680 + x"36",x"0A",x"2D",x"2D",x"34",x"C9",x"21",x"B9", -- 0x2688 + x"40",x"35",x"C0",x"36",x"0A",x"CD",x"47",x"27", -- 0x2690 + x"38",x"09",x"CD",x"AC",x"26",x"CD",x"59",x"27", -- 0x2698 + x"C3",x"99",x"28",x"21",x"B7",x"40",x"34",x"2C", -- 0x26A0 + x"2C",x"36",x"46",x"C9",x"3A",x"BC",x"40",x"47", -- 0x26A8 + x"3E",x"0A",x"90",x"07",x"07",x"07",x"07",x"E6", -- 0x26B0 + x"F0",x"00",x"00",x"21",x"AB",x"40",x"86",x"27", -- 0x26B8 + x"77",x"23",x"3E",x"00",x"8E",x"27",x"77",x"2D", -- 0x26C0 + x"7E",x"E6",x"0F",x"32",x"CD",x"49",x"7E",x"0F", -- 0x26C8 + x"0F",x"0F",x"0F",x"E6",x"0F",x"32",x"ED",x"49", -- 0x26D0 + x"2C",x"7E",x"E6",x"F0",x"28",x"0E",x"0F",x"0F", -- 0x26D8 + x"0F",x"0F",x"32",x"2D",x"4A",x"7E",x"E6",x"0F", -- 0x26E0 + x"32",x"0D",x"4A",x"C9",x"7E",x"E6",x"0F",x"C8", -- 0x26E8 + x"32",x"0D",x"4A",x"C9",x"21",x"B9",x"40",x"35", -- 0x26F0 + x"C0",x"11",x"8A",x"06",x"FF",x"11",x"00",x"03", -- 0x26F8 + x"FF",x"2D",x"2D",x"3E",x"01",x"77",x"32",x"00", -- 0x2700 + x"41",x"AF",x"32",x"16",x"41",x"C9",x"E5",x"06", -- 0x2708 + x"06",x"21",x"AC",x"49",x"11",x"1F",x"00",x"36", -- 0x2710 + x"10",x"23",x"36",x"10",x"19",x"10",x"F8",x"E1", -- 0x2718 + x"C9",x"E5",x"06",x"06",x"21",x"AC",x"49",x"11", -- 0x2720 + x"20",x"00",x"DD",x"21",x"AB",x"02",x"DD",x"7E", -- 0x2728 + x"00",x"77",x"19",x"DD",x"23",x"10",x"F7",x"06", -- 0x2730 + x"06",x"21",x"AD",x"49",x"DD",x"7E",x"00",x"77", -- 0x2738 + x"19",x"DD",x"23",x"10",x"F7",x"E1",x"C9",x"06", -- 0x2740 + x"30",x"21",x"20",x"41",x"CB",x"4E",x"20",x"05", -- 0x2748 + x"23",x"10",x"F9",x"37",x"C9",x"CB",x"8E",x"A7", -- 0x2750 + x"C9",x"21",x"55",x"41",x"11",x"06",x"00",x"4B", -- 0x2758 + x"06",x"18",x"CB",x"4E",x"20",x"0B",x"19",x"10", -- 0x2760 + x"F9",x"7D",x"D6",x"91",x"6F",x"0D",x"20",x"F0", -- 0x2768 + x"C9",x"36",x"01",x"21",x"1A",x"41",x"34",x"C9", -- 0x2770 + x"21",x"A0",x"42",x"11",x"20",x"00",x"06",x"08", -- 0x2778 + x"AF",x"B6",x"19",x"10",x"FC",x"0F",x"D0",x"3A", -- 0x2780 + x"1A",x"41",x"FE",x"04",x"38",x"0B",x"FE",x"07", -- 0x2788 + x"38",x"15",x"FE",x"0B",x"38",x"1F",x"C3",x"4F", -- 0x2790 + x"28",x"21",x"09",x"42",x"CB",x"46",x"C0",x"CD", -- 0x2798 + x"69",x"28",x"36",x"01",x"C3",x"AD",x"28",x"21", -- 0x27A0 + x"0A",x"42",x"CB",x"46",x"C0",x"CD",x"69",x"28", -- 0x27A8 + x"36",x"01",x"C3",x"B2",x"28",x"21",x"0B",x"42", -- 0x27B0 + x"CB",x"46",x"C0",x"CD",x"69",x"28",x"36",x"01", -- 0x27B8 + x"C3",x"B7",x"28",x"3E",x"18",x"32",x"A0",x"43", -- 0x27C0 + x"32",x"01",x"82",x"AF",x"C3",x"14",x"28",x"AF", -- 0x27C8 + x"CD",x"14",x"28",x"3A",x"A0",x"43",x"E6",x"EF", -- 0x27D0 + x"32",x"A0",x"43",x"32",x"01",x"82",x"C9",x"21", -- 0x27D8 + x"A2",x"43",x"7E",x"A7",x"C8",x"35",x"3A",x"A3", -- 0x27E0 + x"43",x"47",x"3A",x"06",x"40",x"0F",x"78",x"DC", -- 0x27E8 + x"14",x"28",x"21",x"A4",x"43",x"11",x"A3",x"43", -- 0x27F0 + x"01",x"0C",x"00",x"ED",x"B0",x"C9",x"E5",x"C5", -- 0x27F8 + x"47",x"21",x"A2",x"43",x"7E",x"FE",x"0D",x"30", -- 0x2800 + x"08",x"34",x"7E",x"C6",x"A2",x"6F",x"26",x"43", -- 0x2808 + x"70",x"C1",x"E1",x"C9",x"32",x"00",x"82",x"3A", -- 0x2810 + x"A0",x"43",x"E6",x"10",x"32",x"01",x"82",x"00", -- 0x2818 + x"00",x"00",x"00",x"3A",x"A0",x"43",x"E6",x"10", -- 0x2820 + x"F6",x"48",x"32",x"01",x"82",x"C9",x"3E",x"01", -- 0x2828 + x"18",x"E2",x"3E",x"02",x"18",x"C8",x"AF",x"CD", -- 0x2830 + x"FE",x"27",x"3E",x"04",x"C3",x"FE",x"27",x"3E", -- 0x2838 + x"05",x"18",x"BB",x"3E",x"0A",x"18",x"B7",x"3E", -- 0x2840 + x"08",x"18",x"B3",x"3E",x"09",x"18",x"AF",x"21", -- 0x2848 + x"A1",x"43",x"CB",x"46",x"C0",x"21",x"09",x"42", -- 0x2850 + x"AF",x"B6",x"2C",x"B6",x"2C",x"B6",x"C0",x"3E", -- 0x2858 + x"01",x"32",x"A1",x"43",x"3E",x"30",x"C3",x"FE", -- 0x2860 + x"27",x"AF",x"32",x"A1",x"43",x"32",x"09",x"42", -- 0x2868 + x"32",x"0A",x"42",x"32",x"0B",x"42",x"3E",x"40", -- 0x2870 + x"CD",x"FE",x"27",x"3E",x"60",x"CD",x"FE",x"27", -- 0x2878 + x"3E",x"80",x"CD",x"FE",x"27",x"3E",x"A0",x"C3", -- 0x2880 + x"FE",x"27",x"3E",x"06",x"C3",x"FE",x"27",x"3E", -- 0x2888 + x"10",x"C3",x"FE",x"27",x"3E",x"20",x"C3",x"FE", -- 0x2890 + x"27",x"3E",x"0B",x"C3",x"FE",x"27",x"3E",x"03", -- 0x2898 + x"C3",x"FE",x"27",x"3E",x"07",x"C3",x"FE",x"27", -- 0x28A0 + x"3E",x"0C",x"C3",x"FE",x"27",x"3E",x"90",x"C3", -- 0x28A8 + x"FE",x"27",x"3E",x"70",x"C3",x"FE",x"27",x"3E", -- 0x28B0 + x"07",x"CD",x"FE",x"27",x"3E",x"50",x"C3",x"FE", -- 0x28B8 + x"27",x"CD",x"69",x"28",x"3E",x"0D",x"C3",x"FE", -- 0x28C0 + x"27",x"21",x"00",x"50",x"01",x"00",x"01",x"16", -- 0x28C8 + x"00",x"72",x"23",x"0B",x"78",x"B1",x"20",x"F9", -- 0x28D0 + x"16",x"5B",x"21",x"00",x"48",x"01",x"00",x"08", -- 0x28D8 + x"72",x"3A",x"00",x"70",x"23",x"0B",x"78",x"B1", -- 0x28E0 + x"20",x"F6",x"CD",x"01",x"29",x"30",x"0D",x"CD", -- 0x28E8 + x"01",x"29",x"30",x"08",x"3E",x"01",x"32",x"01", -- 0x28F0 + x"68",x"C3",x"EE",x"00",x"3A",x"00",x"70",x"18", -- 0x28F8 + x"FB",x"0B",x"3A",x"00",x"70",x"3A",x"01",x"81", -- 0x2900 + x"07",x"D0",x"78",x"B1",x"20",x"F3",x"37",x"C9", -- 0x2908 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2910 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2918 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2920 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2928 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2930 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2938 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2940 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2948 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2950 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2958 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2960 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2968 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2970 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2978 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2980 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2988 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2990 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2998 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x29A0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x29A8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x29B0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x29B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x29C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x29C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x29D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x29D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x29E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x29E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x29F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x29F8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2A98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2AF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2B98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2BF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2C98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2CF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2D98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2DF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2E98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2ED0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2ED8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2EF8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F00 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F08 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F10 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F18 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F20 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F28 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F30 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F38 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F40 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F48 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F50 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F58 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F60 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F68 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F70 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F78 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F80 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F88 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F90 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2F98 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FA0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FA8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FB0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FB8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FC0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FC8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FD0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FD8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FE0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FE8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FF0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x2FF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3000 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3008 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3010 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3018 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3020 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3028 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3030 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3038 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3040 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3048 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3050 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3058 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3060 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3068 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3070 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3078 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3080 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3088 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3090 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3098 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x30F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3100 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3108 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3110 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3118 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3120 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3128 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3130 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3138 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3140 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3148 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3150 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3158 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3160 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3168 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3170 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3178 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3180 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3188 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3190 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3198 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x31F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3200 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3208 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3210 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3218 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3220 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3228 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3230 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3238 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3240 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3248 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3250 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3258 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3260 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3268 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3270 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3278 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3280 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3288 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3290 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3298 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x32F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3300 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3308 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3310 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3318 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3320 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3328 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3330 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3338 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3340 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3348 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3350 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3358 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3360 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3368 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3370 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3378 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3380 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3388 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3390 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3398 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x33F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3400 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3408 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3410 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3418 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3420 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3428 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3430 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3438 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3440 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3448 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3450 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3458 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3460 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3468 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3470 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3478 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3480 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3488 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3490 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3498 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x34F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3500 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3508 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3510 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3518 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3520 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3528 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3530 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3538 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3540 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3548 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3550 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3558 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3560 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3568 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3570 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3578 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3580 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3588 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3590 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3598 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x35F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3600 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3608 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3610 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3618 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3620 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3628 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3630 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3638 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3640 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3648 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3650 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3658 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3660 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3668 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3670 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3678 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3680 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3688 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3690 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3698 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x36F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3700 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3708 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3710 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3718 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3720 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3728 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3730 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3738 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3740 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3748 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3750 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3758 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3760 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3768 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3770 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3778 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3780 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3788 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3790 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3798 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x37F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3800 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3808 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3810 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3818 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3820 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3828 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3830 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3838 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3840 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3848 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3850 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3858 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3860 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3868 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3870 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3878 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3880 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3888 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3890 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3898 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x38F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3900 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3908 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3910 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3918 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3920 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3928 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3930 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3938 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3940 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3948 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3950 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3958 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3960 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3968 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3970 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3978 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3980 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3988 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3990 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3998 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39A0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39A8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39B0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39B8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39C0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39C8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39D0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39D8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39E0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39E8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39F0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x39F8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3A98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3AF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3B98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3BF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3C98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3CF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3D98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3DF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3E98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3ED0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3ED8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3EF8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F00 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F08 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F10 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F18 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F20 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F28 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F30 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F38 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F40 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F48 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F50 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F58 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F60 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F68 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F70 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F78 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F80 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F88 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F90 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3F98 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FA0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FA8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FB0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FB8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FC0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FC8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FD0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FD8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FE0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FE8 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x3FF0 + x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x3FF8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_SND_0.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_SND_0.bin new file mode 100644 index 00000000..c7acec5e Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_SND_0.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_SND_0.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_SND_0.vhd new file mode 100644 index 00000000..8d55c20e --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_SND_0.vhd @@ -0,0 +1,284 @@ +-- generated with romgen by MikeJ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ROM_SND_0 is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of ROM_SND_0 is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"C3",x"CE",x"01",x"01",x"F7",x"00",x"01",x"DC", -- 0x0000 + x"00",x"01",x"15",x"01",x"01",x"F7",x"00",x"01", -- 0x0008 + x"DC",x"00",x"01",x"D0",x"00",x"01",x"F7",x"00", -- 0x0010 + x"01",x"DC",x"00",x"01",x"D0",x"00",x"01",x"B9", -- 0x0018 + x"00",x"01",x"DC",x"00",x"01",x"D0",x"00",x"01", -- 0x0020 + x"00",x"00",x"01",x"68",x"00",x"FF",x"FF",x"FF", -- 0x0028 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0030 + x"08",x"D9",x"3E",x"0E",x"D3",x"40",x"DB",x"80", -- 0x0038 + x"B7",x"28",x"32",x"57",x"E6",x"0F",x"20",x"3B", -- 0x0040 + x"7A",x"FE",x"10",x"28",x"3E",x"FE",x"20",x"28", -- 0x0048 + x"43",x"FE",x"30",x"28",x"48",x"FE",x"40",x"28", -- 0x0050 + x"4D",x"FE",x"50",x"28",x"52",x"FE",x"60",x"28", -- 0x0058 + x"57",x"FE",x"70",x"28",x"5C",x"FE",x"80",x"28", -- 0x0060 + x"61",x"FE",x"90",x"28",x"66",x"FE",x"A0",x"28", -- 0x0068 + x"6B",x"D9",x"08",x"FB",x"C9",x"06",x"06",x"21", -- 0x0070 + x"00",x"80",x"77",x"23",x"05",x"20",x"FB",x"D9", -- 0x0078 + x"08",x"FB",x"C9",x"7A",x"CD",x"01",x"01",x"D9", -- 0x0080 + x"08",x"FB",x"C9",x"3E",x"11",x"CD",x"01",x"01", -- 0x0088 + x"D9",x"08",x"FB",x"C9",x"3E",x"11",x"CD",x"E5", -- 0x0090 + x"00",x"D9",x"08",x"FB",x"C9",x"3E",x"12",x"CD", -- 0x0098 + x"01",x"01",x"D9",x"08",x"FB",x"C9",x"3E",x"12", -- 0x00A0 + x"CD",x"E5",x"00",x"D9",x"08",x"FB",x"C9",x"3E", -- 0x00A8 + x"13",x"CD",x"01",x"01",x"D9",x"08",x"FB",x"C9", -- 0x00B0 + x"3E",x"13",x"CD",x"E5",x"00",x"D9",x"08",x"FB", -- 0x00B8 + x"C9",x"3E",x"14",x"CD",x"01",x"01",x"D9",x"08", -- 0x00C0 + x"FB",x"C9",x"3E",x"14",x"CD",x"E5",x"00",x"D9", -- 0x00C8 + x"08",x"FB",x"C9",x"3E",x"15",x"CD",x"01",x"01", -- 0x00D0 + x"D9",x"08",x"FB",x"C9",x"3E",x"15",x"CD",x"E5", -- 0x00D8 + x"00",x"D9",x"08",x"FB",x"C9",x"CD",x"99",x"01", -- 0x00E0 + x"B7",x"C8",x"FE",x"01",x"28",x"09",x"FE",x"02", -- 0x00E8 + x"28",x"0A",x"AF",x"32",x"04",x"80",x"C9",x"AF", -- 0x00F0 + x"32",x"00",x"80",x"C9",x"AF",x"32",x"02",x"80", -- 0x00F8 + x"C9",x"32",x"06",x"80",x"CD",x"99",x"01",x"B7", -- 0x0100 + x"C0",x"AF",x"CD",x"99",x"01",x"B7",x"20",x"41", -- 0x0108 + x"3A",x"00",x"80",x"CD",x"BC",x"01",x"32",x"07", -- 0x0110 + x"80",x"3A",x"02",x"80",x"CD",x"BC",x"01",x"32", -- 0x0118 + x"08",x"80",x"3A",x"04",x"80",x"CD",x"BC",x"01", -- 0x0120 + x"32",x"09",x"80",x"3A",x"06",x"80",x"CD",x"BC", -- 0x0128 + x"01",x"32",x"0A",x"80",x"3A",x"07",x"80",x"21", -- 0x0130 + x"08",x"80",x"BE",x"FA",x"6E",x"01",x"3A",x"09", -- 0x0138 + x"80",x"BE",x"FA",x"8D",x"01",x"3A",x"0A",x"80", -- 0x0140 + x"BE",x"F8",x"21",x"02",x"80",x"CD",x"C5",x"01", -- 0x0148 + x"C9",x"FE",x"01",x"28",x"0B",x"FE",x"02",x"28", -- 0x0150 + x"0E",x"3A",x"06",x"80",x"32",x"04",x"80",x"C9", -- 0x0158 + x"3A",x"06",x"80",x"32",x"00",x"80",x"C9",x"3A", -- 0x0160 + x"06",x"80",x"32",x"02",x"80",x"C9",x"21",x"09", -- 0x0168 + x"80",x"BE",x"FA",x"81",x"01",x"3A",x"0A",x"80", -- 0x0170 + x"BE",x"F8",x"21",x"04",x"80",x"CD",x"C5",x"01", -- 0x0178 + x"C9",x"21",x"0A",x"80",x"BE",x"F0",x"21",x"00", -- 0x0180 + x"80",x"CD",x"C5",x"01",x"C9",x"21",x"0A",x"80", -- 0x0188 + x"BE",x"F0",x"21",x"04",x"80",x"CD",x"C5",x"01", -- 0x0190 + x"C9",x"06",x"00",x"21",x"00",x"80",x"BE",x"28", -- 0x0198 + x"0C",x"23",x"23",x"BE",x"28",x"0C",x"23",x"23", -- 0x01A0 + x"BE",x"28",x"0C",x"AF",x"C9",x"23",x"70",x"3E", -- 0x01A8 + x"01",x"C9",x"23",x"70",x"3E",x"02",x"C9",x"23", -- 0x01B0 + x"70",x"3E",x"03",x"C9",x"21",x"A1",x"04",x"5F", -- 0x01B8 + x"16",x"00",x"19",x"7E",x"C9",x"3A",x"06",x"80", -- 0x01C0 + x"77",x"3E",x"00",x"23",x"77",x"C9",x"06",x"00", -- 0x01C8 + x"21",x"00",x"80",x"70",x"23",x"7C",x"FE",x"84", -- 0x01D0 + x"20",x"F9",x"31",x"00",x"84",x"ED",x"56",x"3E", -- 0x01D8 + x"07",x"D3",x"40",x"3E",x"3F",x"32",x"0C",x"80", -- 0x01E0 + x"D3",x"80",x"CD",x"FA",x"03",x"CD",x"02",x"04", -- 0x01E8 + x"CD",x"0A",x"04",x"FB",x"3E",x"0F",x"D3",x"40", -- 0x01F0 + x"DB",x"80",x"E6",x"80",x"20",x"F6",x"3E",x"0F", -- 0x01F8 + x"D3",x"40",x"DB",x"80",x"E6",x"80",x"28",x"F6", -- 0x0200 + x"F3",x"3E",x"01",x"32",x"0B",x"80",x"3A",x"01", -- 0x0208 + x"80",x"B7",x"28",x"34",x"3A",x"00",x"80",x"CD", -- 0x0210 + x"2B",x"03",x"FB",x"00",x"00",x"00",x"F3",x"3E", -- 0x0218 + x"02",x"32",x"0B",x"80",x"3A",x"03",x"80",x"B7", -- 0x0220 + x"28",x"26",x"3A",x"02",x"80",x"CD",x"2B",x"03", -- 0x0228 + x"FB",x"00",x"00",x"00",x"F3",x"3E",x"03",x"32", -- 0x0230 + x"0B",x"80",x"3A",x"05",x"80",x"B7",x"28",x"18", -- 0x0238 + x"3A",x"04",x"80",x"CD",x"2B",x"03",x"18",x"AB", -- 0x0240 + x"3A",x"00",x"80",x"CD",x"60",x"02",x"18",x"CA", -- 0x0248 + x"3A",x"02",x"80",x"CD",x"60",x"02",x"18",x"D8", -- 0x0250 + x"3A",x"04",x"80",x"CD",x"60",x"02",x"18",x"93", -- 0x0258 + x"FE",x"01",x"28",x"5C",x"FE",x"02",x"28",x"5D", -- 0x0260 + x"FE",x"03",x"28",x"5E",x"FE",x"04",x"28",x"5F", -- 0x0268 + x"FE",x"05",x"28",x"60",x"FE",x"06",x"28",x"61", -- 0x0270 + x"FE",x"07",x"28",x"62",x"FE",x"08",x"28",x"63", -- 0x0278 + x"FE",x"09",x"28",x"64",x"FE",x"0A",x"28",x"65", -- 0x0280 + x"FE",x"0B",x"28",x"66",x"FE",x"0C",x"28",x"67", -- 0x0288 + x"FE",x"0D",x"28",x"68",x"FE",x"0E",x"28",x"69", -- 0x0290 + x"FE",x"11",x"28",x"6A",x"FE",x"12",x"28",x"6B", -- 0x0298 + x"FE",x"13",x"28",x"6C",x"FE",x"14",x"28",x"6D", -- 0x02A0 + x"FE",x"15",x"28",x"6E",x"CD",x"B7",x"04",x"3A", -- 0x02A8 + x"0B",x"80",x"FE",x"01",x"28",x"69",x"FE",x"02", -- 0x02B0 + x"28",x"6B",x"3E",x"01",x"32",x"05",x"80",x"C9", -- 0x02B8 + x"CD",x"2A",x"05",x"18",x"EA",x"CD",x"90",x"05", -- 0x02C0 + x"18",x"E5",x"CD",x"D8",x"05",x"18",x"E0",x"CD", -- 0x02C8 + x"3A",x"06",x"18",x"DB",x"CD",x"F7",x"08",x"18", -- 0x02D0 + x"D6",x"CD",x"68",x"09",x"18",x"D1",x"CD",x"53", -- 0x02D8 + x"0F",x"18",x"CC",x"CD",x"AE",x"09",x"18",x"C7", -- 0x02E0 + x"CD",x"38",x"0A",x"18",x"C2",x"CD",x"0F",x"0B", -- 0x02E8 + x"18",x"BD",x"CD",x"78",x"0B",x"18",x"B8",x"CD", -- 0x02F0 + x"A3",x"0B",x"18",x"B3",x"CD",x"05",x"0C",x"18", -- 0x02F8 + x"AE",x"CD",x"BA",x"07",x"18",x"A9",x"CD",x"6E", -- 0x0300 + x"0C",x"18",x"A4",x"CD",x"CE",x"0C",x"18",x"9F", -- 0x0308 + x"CD",x"32",x"0E",x"18",x"9A",x"CD",x"F5",x"0E", -- 0x0310 + x"18",x"95",x"CD",x"24",x"0F",x"18",x"90",x"3E", -- 0x0318 + x"01",x"32",x"01",x"80",x"C9",x"3E",x"01",x"32", -- 0x0320 + x"03",x"80",x"C9",x"FE",x"01",x"28",x"49",x"FE", -- 0x0328 + x"02",x"28",x"4A",x"FE",x"03",x"28",x"4B",x"FE", -- 0x0330 + x"04",x"28",x"4C",x"FE",x"05",x"28",x"4D",x"FE", -- 0x0338 + x"06",x"28",x"4E",x"FE",x"07",x"28",x"4F",x"FE", -- 0x0340 + x"08",x"28",x"50",x"FE",x"09",x"28",x"6A",x"FE", -- 0x0348 + x"0A",x"28",x"4D",x"FE",x"0B",x"28",x"4E",x"FE", -- 0x0350 + x"0C",x"28",x"4F",x"FE",x"0D",x"28",x"50",x"FE", -- 0x0358 + x"0E",x"28",x"51",x"FE",x"11",x"28",x"57",x"FE", -- 0x0360 + x"12",x"28",x"58",x"FE",x"13",x"28",x"59",x"FE", -- 0x0368 + x"14",x"28",x"5A",x"FE",x"15",x"28",x"5B",x"C9", -- 0x0370 + x"CD",x"4D",x"05",x"18",x"58",x"CD",x"A4",x"05", -- 0x0378 + x"18",x"53",x"CD",x"EF",x"05",x"18",x"4E",x"CD", -- 0x0380 + x"67",x"06",x"18",x"49",x"CD",x"21",x"09",x"18", -- 0x0388 + x"44",x"CD",x"7C",x"09",x"18",x"3F",x"CD",x"76", -- 0x0390 + x"0F",x"18",x"3A",x"CD",x"D0",x"09",x"18",x"35", -- 0x0398 + x"CD",x"2C",x"0B",x"18",x"30",x"CD",x"8C",x"0B", -- 0x03A0 + x"18",x"2B",x"CD",x"BA",x"0B",x"18",x"26",x"CD", -- 0x03A8 + x"22",x"0C",x"18",x"21",x"CD",x"E0",x"07",x"18", -- 0x03B0 + x"1C",x"CD",x"5E",x"0A",x"18",x"17",x"CD",x"8C", -- 0x03B8 + x"0C",x"18",x"12",x"CD",x"E3",x"0C",x"18",x"0D", -- 0x03C0 + x"CD",x"5E",x"0E",x"18",x"08",x"CD",x"21",x"0F", -- 0x03C8 + x"18",x"03",x"CD",x"50",x"0F",x"B7",x"C8",x"3A", -- 0x03D0 + x"0B",x"80",x"FE",x"01",x"28",x"0C",x"FE",x"02", -- 0x03D8 + x"28",x"10",x"AF",x"32",x"04",x"80",x"32",x"05", -- 0x03E0 + x"80",x"C9",x"AF",x"32",x"00",x"80",x"32",x"01", -- 0x03E8 + x"80",x"C9",x"AF",x"32",x"02",x"80",x"32",x"03", -- 0x03F0 + x"80",x"C9",x"3E",x"08",x"D3",x"40",x"AF",x"D3", -- 0x03F8 + x"80",x"C9",x"3E",x"09",x"D3",x"40",x"AF",x"D3", -- 0x0400 + x"80",x"C9",x"3E",x"0A",x"D3",x"40",x"AF",x"D3", -- 0x0408 + x"80",x"C9",x"3A",x"0B",x"80",x"FE",x"01",x"28", -- 0x0410 + x"14",x"FE",x"02",x"28",x"14",x"06",x"04",x"78", -- 0x0418 + x"D3",x"40",x"7D",x"D3",x"80",x"04",x"78",x"D3", -- 0x0420 + x"40",x"7C",x"D3",x"80",x"C9",x"06",x"00",x"18", -- 0x0428 + x"EE",x"06",x"02",x"18",x"EA",x"3A",x"0B",x"80", -- 0x0430 + x"FE",x"01",x"28",x"14",x"FE",x"02",x"28",x"14", -- 0x0438 + x"06",x"04",x"78",x"D3",x"40",x"DB",x"80",x"6F", -- 0x0440 + x"04",x"78",x"D3",x"40",x"DB",x"80",x"67",x"C9", -- 0x0448 + x"06",x"00",x"18",x"EE",x"06",x"02",x"18",x"EA", -- 0x0450 + x"3A",x"0B",x"80",x"FE",x"01",x"28",x"0C",x"FE", -- 0x0458 + x"02",x"28",x"0E",x"06",x"FB",x"1E",x"20",x"CD", -- 0x0460 + x"77",x"04",x"C9",x"06",x"FE",x"1E",x"08",x"18", -- 0x0468 + x"F6",x"06",x"FD",x"1E",x"10",x"18",x"F0",x"3E", -- 0x0470 + x"07",x"D3",x"40",x"3A",x"0C",x"80",x"A0",x"B3", -- 0x0478 + x"32",x"0C",x"80",x"D3",x"80",x"C9",x"3A",x"0B", -- 0x0480 + x"80",x"FE",x"01",x"28",x"0C",x"FE",x"02",x"28", -- 0x0488 + x"0C",x"3E",x"0A",x"D3",x"40",x"78",x"D3",x"80", -- 0x0490 + x"C9",x"3E",x"08",x"18",x"F6",x"3E",x"09",x"18", -- 0x0498 + x"F2",x"00",x"0B",x"06",x"01",x"0C",x"08",x"04", -- 0x04A0 + x"09",x"07",x"0A",x"05",x"03",x"02",x"0D",x"0E", -- 0x04A8 + x"0F",x"10",x"11",x"12",x"13",x"14",x"15",x"3A", -- 0x04B0 + x"0B",x"80",x"FE",x"01",x"28",x"0D",x"FE",x"02", -- 0x04B8 + x"28",x"12",x"06",x"24",x"CD",x"DD",x"04",x"CD", -- 0x04C0 + x"0A",x"04",x"C9",x"06",x"09",x"CD",x"DD",x"04", -- 0x04C8 + x"CD",x"FA",x"03",x"C9",x"06",x"12",x"CD",x"DD", -- 0x04D0 + x"04",x"CD",x"02",x"04",x"C9",x"3E",x"07",x"D3", -- 0x04D8 + x"40",x"3A",x"0C",x"80",x"B0",x"32",x"0C",x"80", -- 0x04E0 + x"D3",x"80",x"C9",x"3A",x"0B",x"80",x"FE",x"01", -- 0x04E8 + x"28",x"0C",x"FE",x"02",x"28",x"0E",x"06",x"DF", -- 0x04F0 + x"1E",x"04",x"CD",x"77",x"04",x"C9",x"06",x"F7", -- 0x04F8 + x"1E",x"01",x"18",x"F6",x"06",x"EF",x"1E",x"02", -- 0x0500 + x"18",x"F0",x"D3",x"40",x"78",x"D3",x"80",x"C9", -- 0x0508 + x"3A",x"0B",x"80",x"FE",x"01",x"28",x"0B",x"FE", -- 0x0510 + x"02",x"28",x"0B",x"3E",x"0A",x"D3",x"40",x"DB", -- 0x0518 + x"80",x"C9",x"3E",x"08",x"18",x"F7",x"3E",x"09", -- 0x0520 + x"18",x"F3",x"3E",x"02",x"32",x"10",x"80",x"21", -- 0x0528 + x"00",x"01",x"22",x"11",x"80",x"3E",x"01",x"32", -- 0x0530 + x"13",x"80",x"AF",x"32",x"14",x"80",x"21",x"C0", -- 0x0538 + x"00",x"CD",x"12",x"04",x"CD",x"58",x"04",x"06", -- 0x0540 + x"0F",x"CD",x"86",x"04",x"C9",x"21",x"10",x"80", -- 0x0548 + x"35",x"20",x"0A",x"3E",x"02",x"77",x"CD",x"35", -- 0x0550 + x"04",x"2B",x"CD",x"12",x"04",x"3A",x"14",x"80", -- 0x0558 + x"FE",x"00",x"28",x"15",x"21",x"13",x"80",x"35", -- 0x0560 + x"20",x"0D",x"3E",x"01",x"77",x"CD",x"10",x"05", -- 0x0568 + x"3D",x"28",x"1A",x"47",x"CD",x"86",x"04",x"AF", -- 0x0570 + x"C9",x"2A",x"11",x"80",x"2B",x"7C",x"B5",x"28", -- 0x0578 + x"05",x"22",x"11",x"80",x"18",x"F1",x"3E",x"01", -- 0x0580 + x"32",x"14",x"80",x"18",x"EA",x"3E",x"FF",x"C9", -- 0x0588 + x"3E",x"10",x"32",x"16",x"80",x"21",x"80",x"00", -- 0x0590 + x"CD",x"12",x"04",x"CD",x"58",x"04",x"06",x"0F", -- 0x0598 + x"CD",x"86",x"04",x"C9",x"21",x"16",x"80",x"35", -- 0x05A0 + x"28",x"1A",x"CD",x"35",x"04",x"11",x"04",x"00", -- 0x05A8 + x"19",x"11",x"00",x"01",x"7C",x"BA",x"20",x"07", -- 0x05B0 + x"7D",x"BB",x"20",x"03",x"21",x"80",x"00",x"CD", -- 0x05B8 + x"12",x"04",x"AF",x"C9",x"3E",x"10",x"32",x"16", -- 0x05C0 + x"80",x"CD",x"10",x"05",x"3D",x"28",x"06",x"47", -- 0x05C8 + x"CD",x"86",x"04",x"18",x"D5",x"3E",x"FF",x"C9", -- 0x05D0 + x"3E",x"01",x"32",x"18",x"80",x"3E",x"08",x"32", -- 0x05D8 + x"19",x"80",x"AF",x"32",x"1A",x"80",x"CD",x"58", -- 0x05E0 + x"04",x"06",x"00",x"CD",x"86",x"04",x"C9",x"3A", -- 0x05E8 + x"1A",x"80",x"FE",x"00",x"28",x"24",x"FE",x"01", -- 0x05F0 + x"28",x"31",x"CD",x"35",x"04",x"01",x"40",x"00", -- 0x05F8 + x"B7",x"ED",x"42",x"CD",x"12",x"04",x"21",x"19", -- 0x0600 + x"80",x"35",x"20",x"0C",x"36",x"08",x"CD",x"10", -- 0x0608 + x"05",x"3D",x"28",x"23",x"47",x"CD",x"86",x"04", -- 0x0610 + x"AF",x"C9",x"21",x"00",x"04",x"CD",x"12",x"04", -- 0x0618 + x"06",x"0F",x"CD",x"86",x"04",x"21",x"1A",x"80", -- 0x0620 + x"34",x"18",x"ED",x"21",x"18",x"80",x"35",x"20", -- 0x0628 + x"E7",x"21",x"1A",x"80",x"34",x"18",x"E1",x"3E", -- 0x0630 + x"FF",x"C9",x"3E",x"0B",x"32",x"1C",x"80",x"32", -- 0x0638 + x"1D",x"80",x"21",x"18",x"07",x"22",x"1E",x"80", -- 0x0640 + x"AF",x"32",x"20",x"80",x"32",x"21",x"80",x"21", -- 0x0648 + x"8A",x"00",x"CD",x"12",x"04",x"CD",x"58",x"04", -- 0x0650 + x"06",x"0F",x"CD",x"86",x"04",x"3E",x"0E",x"32", -- 0x0658 + x"04",x"80",x"AF",x"32",x"05",x"80",x"C9",x"3A", -- 0x0660 + x"20",x"80",x"FE",x"01",x"28",x"14",x"FE",x"02", -- 0x0668 + x"28",x"24",x"3A",x"21",x"80",x"FE",x"44",x"28", -- 0x0670 + x"3E",x"E6",x"01",x"20",x"49",x"CD",x"F0",x"06", -- 0x0678 + x"AF",x"C9",x"CD",x"10",x"05",x"C6",x"05",x"FE", -- 0x0680 + x"0F",x"20",x"05",x"21",x"20",x"80",x"36",x"00", -- 0x0688 + x"47",x"CD",x"86",x"04",x"18",x"EA",x"CD",x"10", -- 0x0690 + x"05",x"D6",x"05",x"20",x"05",x"21",x"20",x"80", -- 0x0698 + x"36",x"00",x"47",x"CD",x"86",x"04",x"3A",x"20", -- 0x06A0 + x"80",x"FE",x"00",x"20",x"D3",x"3A",x"21",x"80", -- 0x06A8 + x"FE",x"44",x"20",x"CC",x"3E",x"FF",x"C9",x"CD", -- 0x06B0 + x"04",x"07",x"B7",x"20",x"02",x"18",x"C1",x"21", -- 0x06B8 + x"20",x"80",x"36",x"02",x"18",x"BA",x"CD",x"CB", -- 0x06C0 + x"06",x"18",x"B5",x"CD",x"04",x"07",x"B7",x"C8", -- 0x06C8 + x"ED",x"5B",x"1E",x"80",x"1A",x"32",x"1D",x"80", -- 0x06D0 + x"13",x"1A",x"6F",x"13",x"1A",x"67",x"13",x"ED", -- 0x06D8 + x"53",x"1E",x"80",x"CD",x"12",x"04",x"21",x"21", -- 0x06E0 + x"80",x"34",x"21",x"20",x"80",x"36",x"01",x"C9", -- 0x06E8 + x"CD",x"04",x"07",x"B7",x"C8",x"3E",x"01",x"32", -- 0x06F0 + x"1D",x"80",x"21",x"21",x"80",x"34",x"21",x"20", -- 0x06F8 + x"80",x"36",x"02",x"C9",x"21",x"1C",x"80",x"35", -- 0x0700 + x"20",x"0C",x"3E",x"0B",x"77",x"21",x"1D",x"80", -- 0x0708 + x"35",x"20",x"03",x"3E",x"FF",x"C9",x"AF",x"C9", -- 0x0710 + x"01",x"8A",x"00",x"01",x"8A",x"00",x"0B",x"8A", -- 0x0718 + x"00",x"01",x"8A",x"00",x"01",x"8A",x"00",x"03", -- 0x0720 + x"8A",x"00",x"03",x"A5",x"00",x"03",x"D0",x"00", -- 0x0728 + x"03",x"A5",x"00",x"03",x"8A",x"00",x"03",x"A5", -- 0x0730 + x"00",x"03",x"8A",x"00",x"03",x"68",x"00",x"03", -- 0x0738 + x"8A",x"00",x"03",x"A5",x"00",x"03",x"D0",x"00", -- 0x0740 + x"03",x"A5",x"00",x"03",x"8A",x"00",x"03",x"A5", -- 0x0748 + x"00",x"03",x"8A",x"00",x"03",x"68",x"00",x"0B", -- 0x0750 + x"8A",x"00",x"01",x"8A",x"00",x"01",x"8A",x"00", -- 0x0758 + x"0B",x"8A",x"00",x"01",x"8A",x"00",x"01",x"8A", -- 0x0760 + x"00",x"0B",x"8A",x"00",x"01",x"8A",x"00",x"01", -- 0x0768 + x"8A",x"00",x"0B",x"8A",x"00",x"01",x"8A",x"00", -- 0x0770 + x"01",x"8A",x"00",x"20",x"8A",x"00",x"01",x"8A", -- 0x0778 + x"00",x"01",x"8A",x"00",x"03",x"8A",x"00",x"03", -- 0x0780 + x"8A",x"00",x"03",x"8A",x"00",x"01",x"8A",x"00", -- 0x0788 + x"01",x"8A",x"00",x"03",x"8A",x"00",x"03",x"8A", -- 0x0790 + x"00",x"03",x"8A",x"00",x"01",x"8A",x"00",x"01", -- 0x0798 + x"8A",x"00",x"03",x"8A",x"00",x"03",x"8A",x"00", -- 0x07A0 + x"03",x"8A",x"00",x"01",x"8A",x"00",x"01",x"8A", -- 0x07A8 + x"00",x"03",x"8A",x"00",x"03",x"8A",x"00",x"20", -- 0x07B0 + x"8A",x"00",x"3E",x"0B",x"32",x"22",x"80",x"3E", -- 0x07B8 + x"0D",x"32",x"23",x"80",x"21",x"91",x"08",x"22", -- 0x07C0 + x"24",x"80",x"AF",x"32",x"26",x"80",x"32",x"27", -- 0x07C8 + x"80",x"21",x"15",x"01",x"CD",x"12",x"04",x"CD", -- 0x07D0 + x"58",x"04",x"06",x"0F",x"CD",x"86",x"04",x"C9", -- 0x07D8 + x"3A",x"26",x"80",x"FE",x"01",x"28",x"14",x"FE", -- 0x07E0 + x"02",x"28",x"24",x"3A",x"27",x"80",x"FE",x"44", -- 0x07E8 + x"28",x"3E",x"E6",x"01",x"20",x"49",x"CD",x"69", -- 0x07F0 + x"08",x"AF",x"C9",x"CD",x"10",x"05",x"C6",x"05" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_SND_1.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_SND_1.bin new file mode 100644 index 00000000..7cb06c57 Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_SND_1.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_SND_1.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_SND_1.vhd new file mode 100644 index 00000000..6a72782a --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ROM_SND_1.vhd @@ -0,0 +1,284 @@ +-- generated with romgen by MikeJ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ROM_SND_1 is + port ( + CLK : in std_logic; + ADDR : in std_logic_vector(10 downto 0); + DATA : out std_logic_vector(7 downto 0) + ); +end; + +architecture RTL of ROM_SND_1 is + + + type ROM_ARRAY is array(0 to 2047) of std_logic_vector(7 downto 0); + constant ROM : ROM_ARRAY := ( + x"FE",x"0F",x"20",x"05",x"21",x"26",x"80",x"36", -- 0x0000 + x"00",x"47",x"CD",x"86",x"04",x"18",x"EA",x"CD", -- 0x0008 + x"10",x"05",x"D6",x"05",x"20",x"05",x"21",x"26", -- 0x0010 + x"80",x"36",x"00",x"47",x"CD",x"86",x"04",x"3A", -- 0x0018 + x"26",x"80",x"FE",x"00",x"20",x"D3",x"3A",x"27", -- 0x0020 + x"80",x"FE",x"44",x"20",x"CC",x"3E",x"FF",x"C9", -- 0x0028 + x"CD",x"7D",x"08",x"B7",x"20",x"02",x"18",x"C1", -- 0x0030 + x"21",x"26",x"80",x"36",x"02",x"18",x"BA",x"CD", -- 0x0038 + x"44",x"08",x"18",x"B5",x"CD",x"7D",x"08",x"B7", -- 0x0040 + x"C8",x"ED",x"5B",x"24",x"80",x"1A",x"32",x"23", -- 0x0048 + x"80",x"13",x"1A",x"6F",x"13",x"1A",x"67",x"13", -- 0x0050 + x"ED",x"53",x"24",x"80",x"CD",x"12",x"04",x"21", -- 0x0058 + x"27",x"80",x"34",x"21",x"26",x"80",x"36",x"01", -- 0x0060 + x"C9",x"CD",x"7D",x"08",x"B7",x"C8",x"3E",x"01", -- 0x0068 + x"32",x"23",x"80",x"21",x"27",x"80",x"34",x"21", -- 0x0070 + x"26",x"80",x"36",x"02",x"C9",x"21",x"22",x"80", -- 0x0078 + x"35",x"20",x"0C",x"3E",x"0B",x"77",x"21",x"23", -- 0x0080 + x"80",x"35",x"20",x"03",x"3E",x"FF",x"C9",x"AF", -- 0x0088 + x"C9",x"01",x"15",x"01",x"01",x"15",x"01",x"0B", -- 0x0090 + x"15",x"01",x"01",x"15",x"01",x"01",x"15",x"01", -- 0x0098 + x"03",x"15",x"01",x"03",x"4A",x"01",x"03",x"A0", -- 0x00A0 + x"01",x"03",x"4A",x"01",x"03",x"15",x"01",x"03", -- 0x00A8 + x"4A",x"01",x"03",x"15",x"01",x"03",x"D0",x"00", -- 0x00B0 + x"03",x"15",x"01",x"03",x"4A",x"01",x"03",x"A0", -- 0x00B8 + x"01",x"03",x"4A",x"01",x"03",x"15",x"01",x"03", -- 0x00C0 + x"4A",x"01",x"03",x"15",x"01",x"03",x"D0",x"00", -- 0x00C8 + x"0B",x"15",x"01",x"01",x"15",x"01",x"01",x"15", -- 0x00D0 + x"01",x"0B",x"15",x"01",x"01",x"15",x"01",x"01", -- 0x00D8 + x"15",x"01",x"0B",x"15",x"01",x"01",x"15",x"01", -- 0x00E0 + x"01",x"15",x"01",x"0B",x"15",x"01",x"01",x"15", -- 0x00E8 + x"01",x"01",x"15",x"01",x"20",x"15",x"01",x"3E", -- 0x00F0 + x"20",x"32",x"29",x"80",x"3E",x"08",x"32",x"2A", -- 0x00F8 + x"80",x"3E",x"FF",x"32",x"2B",x"80",x"AF",x"32", -- 0x0100 + x"2C",x"80",x"3E",x"0B",x"06",x"00",x"CD",x"0A", -- 0x0108 + x"05",x"3E",x"0C",x"06",x"20",x"CD",x"0A",x"05", -- 0x0110 + x"CD",x"EB",x"04",x"06",x"10",x"CD",x"86",x"04", -- 0x0118 + x"C9",x"3E",x"06",x"06",x"12",x"CD",x"0A",x"05", -- 0x0120 + x"3A",x"2C",x"80",x"FE",x"00",x"28",x"0C",x"FE", -- 0x0128 + x"01",x"28",x"16",x"21",x"2B",x"80",x"35",x"28", -- 0x0130 + x"2C",x"AF",x"C9",x"3E",x"0D",x"06",x"09",x"CD", -- 0x0138 + x"0A",x"05",x"3E",x"01",x"32",x"2C",x"80",x"18", -- 0x0140 + x"F0",x"21",x"29",x"80",x"35",x"20",x"EA",x"3E", -- 0x0148 + x"20",x"77",x"21",x"2A",x"80",x"35",x"20",x"07", -- 0x0150 + x"3E",x"02",x"32",x"2C",x"80",x"18",x"DA",x"AF", -- 0x0158 + x"32",x"2C",x"80",x"18",x"D4",x"3E",x"FF",x"C9", -- 0x0160 + x"3E",x"10",x"32",x"2E",x"80",x"21",x"F0",x"00", -- 0x0168 + x"CD",x"12",x"04",x"CD",x"58",x"04",x"06",x"0F", -- 0x0170 + x"CD",x"86",x"04",x"C9",x"21",x"2E",x"80",x"35", -- 0x0178 + x"20",x"0D",x"3E",x"10",x"77",x"CD",x"10",x"05", -- 0x0180 + x"3D",x"28",x"20",x"47",x"CD",x"86",x"04",x"CD", -- 0x0188 + x"35",x"04",x"B7",x"11",x"08",x"00",x"ED",x"52", -- 0x0190 + x"11",x"10",x"00",x"7C",x"BA",x"20",x"07",x"7D", -- 0x0198 + x"BB",x"20",x"03",x"21",x"F0",x"00",x"CD",x"12", -- 0x01A0 + x"04",x"AF",x"C9",x"3E",x"FF",x"C9",x"3E",x"08", -- 0x01A8 + x"32",x"30",x"80",x"3E",x"05",x"32",x"31",x"80", -- 0x01B0 + x"3E",x"0C",x"32",x"32",x"80",x"AF",x"32",x"33", -- 0x01B8 + x"80",x"21",x"50",x"00",x"CD",x"12",x"04",x"CD", -- 0x01C0 + x"58",x"04",x"06",x"00",x"CD",x"86",x"04",x"C9", -- 0x01C8 + x"3A",x"33",x"80",x"FE",x"00",x"28",x"18",x"FE", -- 0x01D0 + x"01",x"28",x"26",x"FE",x"02",x"28",x"27",x"FE", -- 0x01D8 + x"03",x"28",x"33",x"21",x"32",x"80",x"35",x"28", -- 0x01E0 + x"32",x"AF",x"32",x"33",x"80",x"AF",x"C9",x"CD", -- 0x01E8 + x"10",x"05",x"3C",x"FE",x"0F",x"20",x"04",x"21", -- 0x01F0 + x"33",x"80",x"34",x"47",x"CD",x"86",x"04",x"18", -- 0x01F8 + x"EC",x"CD",x"1E",x"0A",x"18",x"E7",x"CD",x"10", -- 0x0200 + x"05",x"3D",x"20",x"04",x"21",x"33",x"80",x"34", -- 0x0208 + x"47",x"CD",x"86",x"04",x"18",x"D7",x"CD",x"2B", -- 0x0210 + x"0A",x"18",x"D2",x"3E",x"FF",x"C9",x"21",x"30", -- 0x0218 + x"80",x"35",x"C0",x"3E",x"08",x"77",x"21",x"33", -- 0x0220 + x"80",x"34",x"C9",x"21",x"31",x"80",x"35",x"C0", -- 0x0228 + x"3E",x"05",x"77",x"21",x"33",x"80",x"34",x"C9", -- 0x0230 + x"3E",x"08",x"32",x"35",x"80",x"3E",x"01",x"32", -- 0x0238 + x"36",x"80",x"21",x"03",x"00",x"22",x"37",x"80", -- 0x0240 + x"AF",x"32",x"39",x"80",x"32",x"3A",x"80",x"21", -- 0x0248 + x"15",x"01",x"CD",x"12",x"04",x"CD",x"58",x"04", -- 0x0250 + x"06",x"0F",x"CD",x"86",x"04",x"C9",x"3A",x"39", -- 0x0258 + x"80",x"FE",x"01",x"28",x"14",x"FE",x"02",x"28", -- 0x0260 + x"24",x"3A",x"3A",x"80",x"FE",x"1C",x"28",x"3E", -- 0x0268 + x"E6",x"01",x"20",x"49",x"CD",x"E7",x"0A",x"AF", -- 0x0270 + x"C9",x"CD",x"10",x"05",x"C6",x"05",x"FE",x"0F", -- 0x0278 + x"20",x"05",x"21",x"39",x"80",x"36",x"00",x"47", -- 0x0280 + x"CD",x"86",x"04",x"18",x"EA",x"CD",x"10",x"05", -- 0x0288 + x"D6",x"01",x"20",x"05",x"21",x"39",x"80",x"36", -- 0x0290 + x"00",x"47",x"CD",x"86",x"04",x"3A",x"39",x"80", -- 0x0298 + x"FE",x"00",x"20",x"D3",x"3A",x"3A",x"80",x"FE", -- 0x02A0 + x"1C",x"20",x"CC",x"3E",x"FF",x"C9",x"CD",x"FB", -- 0x02A8 + x"0A",x"B7",x"20",x"02",x"18",x"C1",x"21",x"39", -- 0x02B0 + x"80",x"36",x"02",x"18",x"BA",x"CD",x"C2",x"0A", -- 0x02B8 + x"18",x"B5",x"CD",x"FB",x"0A",x"B7",x"C8",x"ED", -- 0x02C0 + x"5B",x"37",x"80",x"1A",x"32",x"36",x"80",x"13", -- 0x02C8 + x"1A",x"6F",x"13",x"1A",x"67",x"13",x"ED",x"53", -- 0x02D0 + x"37",x"80",x"CD",x"12",x"04",x"21",x"3A",x"80", -- 0x02D8 + x"34",x"21",x"39",x"80",x"36",x"01",x"C9",x"CD", -- 0x02E0 + x"FB",x"0A",x"B7",x"C8",x"3E",x"01",x"32",x"36", -- 0x02E8 + x"80",x"21",x"3A",x"80",x"34",x"21",x"39",x"80", -- 0x02F0 + x"36",x"02",x"C9",x"21",x"35",x"80",x"35",x"20", -- 0x02F8 + x"0C",x"3E",x"08",x"77",x"21",x"36",x"80",x"35", -- 0x0300 + x"20",x"03",x"3E",x"FF",x"C9",x"AF",x"C9",x"3E", -- 0x0308 + x"40",x"32",x"3C",x"80",x"3E",x"20",x"32",x"3D", -- 0x0310 + x"80",x"AF",x"32",x"3E",x"80",x"21",x"00",x"08", -- 0x0318 + x"CD",x"12",x"04",x"CD",x"58",x"04",x"06",x"0F", -- 0x0320 + x"CD",x"86",x"04",x"C9",x"3A",x"3E",x"80",x"FE", -- 0x0328 + x"00",x"28",x"20",x"FE",x"01",x"28",x"29",x"CD", -- 0x0330 + x"35",x"04",x"B7",x"11",x"20",x"00",x"ED",x"52", -- 0x0338 + x"11",x"00",x"02",x"7C",x"BA",x"20",x"07",x"7D", -- 0x0340 + x"BB",x"20",x"03",x"21",x"00",x"08",x"CD",x"12", -- 0x0348 + x"04",x"AF",x"C9",x"21",x"3C",x"80",x"35",x"20", -- 0x0350 + x"DE",x"3E",x"01",x"32",x"3E",x"80",x"18",x"D7", -- 0x0358 + x"21",x"3D",x"80",x"35",x"20",x"D1",x"3E",x"20", -- 0x0360 + x"77",x"CD",x"10",x"05",x"3D",x"28",x"06",x"47", -- 0x0368 + x"CD",x"86",x"04",x"18",x"C2",x"3E",x"FF",x"C9", -- 0x0370 + x"3E",x"05",x"32",x"40",x"80",x"21",x"50",x"00", -- 0x0378 + x"CD",x"12",x"04",x"CD",x"58",x"04",x"06",x"0F", -- 0x0380 + x"CD",x"86",x"04",x"C9",x"21",x"40",x"80",x"35", -- 0x0388 + x"20",x"0C",x"36",x"05",x"CD",x"10",x"05",x"3D", -- 0x0390 + x"28",x"06",x"47",x"CD",x"86",x"04",x"AF",x"C9", -- 0x0398 + x"3E",x"FF",x"C9",x"3E",x"04",x"32",x"42",x"80", -- 0x03A0 + x"3E",x"03",x"32",x"43",x"80",x"AF",x"32",x"44", -- 0x03A8 + x"80",x"CD",x"58",x"04",x"06",x"00",x"CD",x"86", -- 0x03B0 + x"04",x"C9",x"3A",x"44",x"80",x"FE",x"00",x"28", -- 0x03B8 + x"24",x"FE",x"01",x"28",x"31",x"CD",x"35",x"04", -- 0x03C0 + x"01",x"20",x"00",x"B7",x"09",x"CD",x"12",x"04", -- 0x03C8 + x"21",x"43",x"80",x"35",x"20",x"0D",x"36",x"03", -- 0x03D0 + x"CD",x"10",x"05",x"D6",x"03",x"28",x"23",x"47", -- 0x03D8 + x"CD",x"86",x"04",x"AF",x"C9",x"21",x"10",x"00", -- 0x03E0 + x"CD",x"12",x"04",x"06",x"0F",x"CD",x"86",x"04", -- 0x03E8 + x"21",x"44",x"80",x"34",x"18",x"ED",x"21",x"42", -- 0x03F0 + x"80",x"35",x"20",x"E7",x"21",x"44",x"80",x"34", -- 0x03F8 + x"18",x"E1",x"3E",x"FF",x"C9",x"3E",x"02",x"32", -- 0x0400 + x"46",x"80",x"3E",x"20",x"32",x"47",x"80",x"AF", -- 0x0408 + x"32",x"48",x"80",x"21",x"10",x"00",x"CD",x"12", -- 0x0410 + x"04",x"CD",x"58",x"04",x"06",x"00",x"CD",x"86", -- 0x0418 + x"04",x"C9",x"21",x"46",x"80",x"35",x"20",x"09", -- 0x0420 + x"36",x"02",x"CD",x"35",x"04",x"23",x"CD",x"12", -- 0x0428 + x"04",x"3A",x"48",x"80",x"FE",x"00",x"28",x"11", -- 0x0430 + x"FE",x"01",x"28",x"1F",x"21",x"47",x"80",x"35", -- 0x0438 + x"28",x"29",x"21",x"48",x"80",x"36",x"00",x"AF", -- 0x0440 + x"C9",x"CD",x"10",x"05",x"3C",x"FE",x"0F",x"20", -- 0x0448 + x"04",x"21",x"48",x"80",x"34",x"47",x"CD",x"86", -- 0x0450 + x"04",x"18",x"EC",x"CD",x"10",x"05",x"3D",x"20", -- 0x0458 + x"04",x"21",x"48",x"80",x"34",x"47",x"CD",x"86", -- 0x0460 + x"04",x"18",x"DC",x"3E",x"FF",x"C9",x"3E",x"03", -- 0x0468 + x"32",x"4A",x"80",x"21",x"00",x"04",x"22",x"4C", -- 0x0470 + x"80",x"AF",x"32",x"4B",x"80",x"21",x"00",x"02", -- 0x0478 + x"CD",x"12",x"04",x"CD",x"58",x"04",x"06",x"0A", -- 0x0480 + x"CD",x"86",x"04",x"C9",x"21",x"4A",x"80",x"35", -- 0x0488 + x"20",x"2E",x"36",x"03",x"CD",x"35",x"04",x"11", -- 0x0490 + x"20",x"00",x"19",x"ED",x"5B",x"4C",x"80",x"7C", -- 0x0498 + x"BA",x"20",x"18",x"7D",x"BB",x"20",x"14",x"3A", -- 0x04A0 + x"4B",x"80",x"B7",x"20",x"15",x"21",x"00",x"08", -- 0x04A8 + x"22",x"4C",x"80",x"3E",x"FF",x"32",x"4B",x"80", -- 0x04B0 + x"21",x"00",x"02",x"CD",x"12",x"04",x"AF",x"C9", -- 0x04B8 + x"AF",x"C9",x"21",x"00",x"04",x"22",x"4C",x"80", -- 0x04C0 + x"AF",x"32",x"4B",x"80",x"18",x"EA",x"3E",x"10", -- 0x04C8 + x"32",x"4F",x"80",x"AF",x"32",x"50",x"80",x"32", -- 0x04D0 + x"51",x"80",x"CD",x"58",x"04",x"06",x"00",x"CD", -- 0x04D8 + x"86",x"04",x"C9",x"3A",x"51",x"80",x"FE",x"00", -- 0x04E0 + x"CA",x"51",x"0D",x"FE",x"01",x"CA",x"5E",x"0D", -- 0x04E8 + x"FE",x"02",x"CA",x"69",x"0D",x"FE",x"03",x"CA", -- 0x04F0 + x"6F",x"0D",x"FE",x"04",x"CA",x"7A",x"0D",x"FE", -- 0x04F8 + x"05",x"CA",x"80",x"0D",x"FE",x"06",x"CA",x"8D", -- 0x0500 + x"0D",x"FE",x"07",x"CA",x"98",x"0D",x"FE",x"08", -- 0x0508 + x"CA",x"9E",x"0D",x"FE",x"09",x"CA",x"A9",x"0D", -- 0x0510 + x"FE",x"0A",x"CA",x"AF",x"0D",x"FE",x"0B",x"CA", -- 0x0518 + x"BC",x"0D",x"FE",x"0C",x"CA",x"C7",x"0D",x"FE", -- 0x0520 + x"0D",x"CA",x"CD",x"0D",x"FE",x"0E",x"CA",x"D8", -- 0x0528 + x"0D",x"FE",x"0F",x"CA",x"DE",x"0D",x"FE",x"10", -- 0x0530 + x"CA",x"EB",x"0D",x"FE",x"11",x"CA",x"F6",x"0D", -- 0x0538 + x"FE",x"12",x"CA",x"FC",x"0D",x"FE",x"13",x"CA", -- 0x0540 + x"07",x"0E",x"21",x"51",x"80",x"36",x"00",x"AF", -- 0x0548 + x"C9",x"21",x"E7",x"0B",x"CD",x"12",x"04",x"21", -- 0x0550 + x"51",x"80",x"34",x"C3",x"4F",x"0D",x"CD",x"0D", -- 0x0558 + x"0E",x"21",x"50",x"80",x"36",x"05",x"C3",x"4F", -- 0x0560 + x"0D",x"CD",x"21",x"0E",x"C3",x"4F",x"0D",x"CD", -- 0x0568 + x"17",x"0E",x"21",x"50",x"80",x"36",x"01",x"C3", -- 0x0570 + x"4F",x"0D",x"CD",x"21",x"0E",x"C3",x"4F",x"0D", -- 0x0578 + x"21",x"00",x"0A",x"CD",x"12",x"04",x"21",x"51", -- 0x0580 + x"80",x"34",x"C3",x"4F",x"0D",x"CD",x"0D",x"0E", -- 0x0588 + x"21",x"50",x"80",x"36",x"05",x"C3",x"4F",x"0D", -- 0x0590 + x"CD",x"21",x"0E",x"C3",x"4F",x"0D",x"CD",x"17", -- 0x0598 + x"0E",x"21",x"50",x"80",x"36",x"01",x"C3",x"4F", -- 0x05A0 + x"0D",x"CD",x"21",x"0E",x"C3",x"4F",x"0D",x"21", -- 0x05A8 + x"99",x"0A",x"CD",x"12",x"04",x"21",x"51",x"80", -- 0x05B0 + x"34",x"C3",x"4F",x"0D",x"CD",x"0D",x"0E",x"21", -- 0x05B8 + x"50",x"80",x"36",x"05",x"C3",x"4F",x"0D",x"CD", -- 0x05C0 + x"21",x"0E",x"C3",x"4F",x"0D",x"CD",x"17",x"0E", -- 0x05C8 + x"21",x"50",x"80",x"36",x"01",x"C3",x"4F",x"0D", -- 0x05D0 + x"CD",x"21",x"0E",x"C3",x"4F",x"0D",x"21",x"3B", -- 0x05D8 + x"0B",x"CD",x"12",x"04",x"21",x"51",x"80",x"34", -- 0x05E0 + x"C3",x"4F",x"0D",x"CD",x"0D",x"0E",x"21",x"50", -- 0x05E8 + x"80",x"36",x"05",x"C3",x"4F",x"0D",x"CD",x"21", -- 0x05F0 + x"0E",x"C3",x"4F",x"0D",x"CD",x"17",x"0E",x"21", -- 0x05F8 + x"50",x"80",x"36",x"01",x"C3",x"4F",x"0D",x"CD", -- 0x0600 + x"21",x"0E",x"C3",x"4F",x"0D",x"06",x"0A",x"CD", -- 0x0608 + x"86",x"04",x"21",x"51",x"80",x"34",x"C9",x"06", -- 0x0610 + x"00",x"CD",x"86",x"04",x"21",x"51",x"80",x"34", -- 0x0618 + x"C9",x"21",x"4F",x"80",x"35",x"C0",x"36",x"10", -- 0x0620 + x"21",x"50",x"80",x"35",x"C0",x"21",x"51",x"80", -- 0x0628 + x"34",x"C9",x"21",x"40",x"01",x"22",x"53",x"80", -- 0x0630 + x"11",x"01",x"00",x"ED",x"53",x"55",x"80",x"3E", -- 0x0638 + x"03",x"32",x"57",x"80",x"3E",x"20",x"32",x"58", -- 0x0640 + x"80",x"3E",x"40",x"32",x"59",x"80",x"32",x"5A", -- 0x0648 + x"80",x"AF",x"32",x"5B",x"80",x"CD",x"58",x"04", -- 0x0650 + x"06",x"00",x"CD",x"86",x"04",x"C9",x"3A",x"5B", -- 0x0658 + x"80",x"FE",x"00",x"28",x"29",x"FE",x"01",x"28", -- 0x0660 + x"31",x"FE",x"02",x"28",x"40",x"FE",x"03",x"28", -- 0x0668 + x"4F",x"FE",x"04",x"28",x"70",x"21",x"59",x"80", -- 0x0670 + x"35",x"20",x"11",x"3A",x"5A",x"80",x"32",x"59", -- 0x0678 + x"80",x"11",x"01",x"00",x"ED",x"53",x"55",x"80", -- 0x0680 + x"AF",x"32",x"5B",x"80",x"AF",x"C9",x"2A",x"53", -- 0x0688 + x"80",x"CD",x"12",x"04",x"21",x"5B",x"80",x"34", -- 0x0690 + x"18",x"F2",x"CD",x"10",x"05",x"C6",x"02",x"FE", -- 0x0698 + x"08",x"20",x"04",x"21",x"5B",x"80",x"34",x"47", -- 0x06A0 + x"CD",x"86",x"04",x"18",x"DF",x"CD",x"35",x"04", -- 0x06A8 + x"B7",x"ED",x"5B",x"55",x"80",x"ED",x"52",x"CD", -- 0x06B0 + x"12",x"04",x"21",x"5B",x"80",x"34",x"18",x"CC", -- 0x06B8 + x"21",x"57",x"80",x"35",x"20",x"0B",x"36",x"03", -- 0x06C0 + x"ED",x"5B",x"55",x"80",x"13",x"ED",x"53",x"55", -- 0x06C8 + x"80",x"21",x"58",x"80",x"35",x"20",x"08",x"36", -- 0x06D0 + x"20",x"21",x"5B",x"80",x"34",x"18",x"AD",x"21", -- 0x06D8 + x"5B",x"80",x"35",x"18",x"A7",x"CD",x"10",x"05", -- 0x06E0 + x"3D",x"20",x"04",x"21",x"5B",x"80",x"34",x"47", -- 0x06E8 + x"CD",x"86",x"04",x"18",x"97",x"21",x"20",x"01", -- 0x06F0 + x"22",x"53",x"80",x"11",x"01",x"00",x"ED",x"53", -- 0x06F8 + x"55",x"80",x"3E",x"03",x"32",x"57",x"80",x"3E", -- 0x0700 + x"20",x"32",x"58",x"80",x"3E",x"30",x"32",x"59", -- 0x0708 + x"80",x"32",x"5A",x"80",x"AF",x"32",x"5B",x"80", -- 0x0710 + x"CD",x"58",x"04",x"06",x"00",x"CD",x"86",x"04", -- 0x0718 + x"C9",x"C3",x"5E",x"0E",x"21",x"00",x"01",x"22", -- 0x0720 + x"53",x"80",x"11",x"01",x"00",x"ED",x"53",x"55", -- 0x0728 + x"80",x"3E",x"03",x"32",x"57",x"80",x"3E",x"20", -- 0x0730 + x"32",x"58",x"80",x"3E",x"20",x"32",x"59",x"80", -- 0x0738 + x"32",x"5A",x"80",x"AF",x"32",x"5B",x"80",x"CD", -- 0x0740 + x"58",x"04",x"06",x"00",x"CD",x"86",x"04",x"C9", -- 0x0748 + x"C3",x"5E",x"0E",x"3E",x"10",x"32",x"5D",x"80", -- 0x0750 + x"3E",x"03",x"32",x"5E",x"80",x"AF",x"32",x"5F", -- 0x0758 + x"80",x"21",x"E3",x"0F",x"22",x"60",x"80",x"21", -- 0x0760 + x"15",x"01",x"CD",x"12",x"04",x"CD",x"58",x"04", -- 0x0768 + x"06",x"0F",x"CD",x"86",x"04",x"C9",x"3A",x"5F", -- 0x0770 + x"80",x"FE",x"0A",x"20",x"08",x"CD",x"AA",x"0F", -- 0x0778 + x"B7",x"20",x"10",x"AF",x"C9",x"E6",x"01",x"28", -- 0x0780 + x"05",x"CD",x"BE",x"0F",x"18",x"F5",x"CD",x"96", -- 0x0788 + x"0F",x"18",x"F0",x"3E",x"FF",x"C9",x"CD",x"AA", -- 0x0790 + x"0F",x"B7",x"C8",x"3E",x"01",x"32",x"5E",x"80", -- 0x0798 + x"21",x"5F",x"80",x"34",x"06",x"00",x"CD",x"86", -- 0x07A0 + x"04",x"C9",x"21",x"5D",x"80",x"35",x"20",x"0C", -- 0x07A8 + x"3E",x"10",x"77",x"21",x"5E",x"80",x"35",x"20", -- 0x07B0 + x"03",x"3E",x"FF",x"C9",x"AF",x"C9",x"CD",x"AA", -- 0x07B8 + x"0F",x"B7",x"C8",x"ED",x"5B",x"60",x"80",x"1A", -- 0x07C0 + x"32",x"5E",x"80",x"13",x"1A",x"6F",x"13",x"1A", -- 0x07C8 + x"67",x"13",x"ED",x"53",x"60",x"80",x"CD",x"12", -- 0x07D0 + x"04",x"21",x"5F",x"80",x"34",x"06",x"0F",x"CD", -- 0x07D8 + x"86",x"04",x"C9",x"01",x"15",x"01",x"08",x"D0", -- 0x07E0 + x"00",x"03",x"15",x"01",x"01",x"D0",x"00",x"08", -- 0x07E8 + x"A5",x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x07F0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF" -- 0x07F8 + ); + +begin + + p_rom : process + begin + wait until rising_edge(CLK); + DATA <= ROM(to_integer(unsigned(ADDR))); + end process; +end RTL; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic13_1t.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic13_1t.bin new file mode 100644 index 00000000..c59be147 Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic13_1t.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic14_2t.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic14_2t.bin new file mode 100644 index 00000000..9afe3845 Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic14_2t.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic15_3t.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic15_3t.bin new file mode 100644 index 00000000..e74e9ee7 Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic15_3t.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic16_4t.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic16_4t.bin new file mode 100644 index 00000000..3eb48ce8 Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic16_4t.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic17_5t.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic17_5t.bin new file mode 100644 index 00000000..6c42a736 Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic17_5t.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic18_6t.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic18_6t.bin new file mode 100644 index 00000000..c92fe220 Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic18_6t.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic30_2c.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic30_2c.bin new file mode 100644 index 00000000..9bd5d920 Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic30_2c.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic31_1c.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic31_1c.bin new file mode 100644 index 00000000..26dd1a0c Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic31_1c.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic55_2.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic55_2.bin new file mode 100644 index 00000000..7cb06c57 Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic55_2.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic56_1.bin b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic56_1.bin new file mode 100644 index 00000000..c7acec5e Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/ic56_1.bin differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/romgen.exe b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/romgen.exe new file mode 100644 index 00000000..4536903c Binary files /dev/null and b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/ROM/romgen.exe differ diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/TheEnd.sv b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/TheEnd.sv new file mode 100644 index 00000000..7680c5ff --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/TheEnd.sv @@ -0,0 +1,198 @@ +//============================================================================ +// Arcade: The End +// +// Port to MiSTer +// Copyright (C) 2017 Sorgelig +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module TheEnd +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "TheEnd;;", + "O2,Joystick Control,Upright,Normal;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T6,Reset;", + "V,v1.00.",`BUILD_DATE +}; + + +//////////////////// CLOCKS /////////////////// + +wire clk_sys; +wire pll_locked; + +pll pll +( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_sys), + .locked(pll_locked) +); + +reg ce_6, ce_star, ce_1p79; +always @(negedge clk_sys) begin + reg [2:0] div = 0; + reg [4:0] div179 = 0; + + div <= div + 1'd1; + if(div == 5) div <= 0; + + ce_6 <= (div == 0); + ce_star <= ((div == 3) | (div == 5)); + + ce_1p79 <= 0; + div179 <= div179 + 1'd1; + if(div179 == 19) begin + div179 <= 0; + ce_1p79 <= 1; + end +end + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [9:0] audio; +wire hsync,vsync; +assign LED = 1; +wire blankn = ~(hblank | vblank); +wire hblank, vblank; +wire hs, vs; +wire [2:0] r,b,g; + +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(ce_6), + .ce_pix_actual(ce_6), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r}), + .G({g,g}), + .B({b,b}), + .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(scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_sys ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + + + +keyboard keyboard( + .clk(clk_sys), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + +wire m_up = status[2] ? kbjoy[6] | joystick_0[1] | joystick_1[1] : kbjoy[4] | joystick_0[3] | joystick_1[3]; +wire m_down = status[2] ? kbjoy[7] | joystick_0[0] | joystick_1[0] : kbjoy[5] | joystick_0[2] | joystick_1[2]; +wire m_left = status[2] ? kbjoy[5] | joystick_0[2] | joystick_1[2] : kbjoy[6] | joystick_0[1] | joystick_1[1]; +wire m_right = status[2] ? kbjoy[4] | joystick_0[3] | joystick_1[3] : kbjoy[7] | joystick_0[0] | joystick_1[0]; + +wire m_fire = kbjoy[0] | joystick_0[4] | joystick_1[4]; +wire m_start1 = kbjoy[1]; +wire m_start2 = kbjoy[2]; +wire m_coin = kbjoy[3]; +//wire m_bomb = kbjoy[8]; +//wire m_Serv = kbjoy[9]; + +scramble_top theend +( + .O_VIDEO_R(r), + .O_VIDEO_G(g), + .O_VIDEO_B(b), + .O_HSYNC(hs), + .O_VSYNC(vs), + .O_HBLANK(hblank), + .O_VBLANK(vblank), + .O_AUDIO(audio), + .button_in(~{m_start2, m_fire, m_coin, m_start1, m_right, m_left, m_down, m_up}), + .RESET(status[0] | status[6] | buttons[1]), + .clk(clk_sys), + .ena_star(ce_star), + .ena_6(ce_6), + .ena_1_79(ce_1p79) +); + +dac dac +( + .clk_i(clk_sys), + .res_n_i(1), + .dac_i(audio), + .dac_o(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + + +endmodule diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/YM2149_linmix_sep.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/YM2149_linmix_sep.vhd new file mode 100644 index 00000000..6ed2498a --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/YM2149_linmix_sep.vhd @@ -0,0 +1,574 @@ +-- changes for seperate audio outputs and enable now enables cpu access as well +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + O_CHAN : out std_logic_vector(1 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal cnt_div_t1 : std_logic_vector(3 downto 0); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8; + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process(RESET_L, CLK) + begin + -- looks like registers are latches in real chip, but the address is caught at the end of the address state. + if (RESET_L = '0') then + addr <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA = '1') then + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end if; + end process; + + p_wdata : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + elsif rising_edge(CLK) then + if (ENA = '1') then + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, reg, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + -- envelope shapes + -- C AtAlH + -- 0 0 x x \___ + -- + -- 0 1 x x /___ + -- + -- 1 0 0 0 \\\\ + -- + -- 1 0 0 1 \___ + -- + -- 1 0 1 0 \/\/ + -- ___ + -- 1 0 1 1 \ + -- + -- 1 1 0 0 //// + -- ___ + -- 1 1 0 1 / + -- + -- 1 1 1 0 /\/\ + -- + -- 1 1 1 1 /___ + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + cnt_div_t1 <= cnt_div; + end if; + end process; + + p_audio_output : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_AUDIO <= (others => '0'); + O_CHAN <= (others => '0'); + elsif rising_edge(CLK) then + + if (ENA = '1') then + O_AUDIO <= dac_amp(7 downto 0); + O_CHAN <= cnt_div_t1(1 downto 0); + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then -- resync + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end if; + end process; +end architecture RTL; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/build_id.tcl b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_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/Arcade/Scramble Hardware/TheEnd_MiST/rtl/build_id.v b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/build_id.v new file mode 100644 index 00000000..4e62f060 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171217" +`define BUILD_TIME "232358" diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80.vhd new file mode 100644 index 00000000..da01f6b4 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80.vhd @@ -0,0 +1,1080 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusB <= "--------"; + end case; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80_ALU.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80_MCode.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80_MCode.vhd new file mode 100644 index 00000000..43cea1b5 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80_MCode.vhd @@ -0,0 +1,1944 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80_Pack.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80_Pack.vhd new file mode 100644 index 00000000..42cf6105 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80_Pack.vhd @@ -0,0 +1,217 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80_Reg.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80_Reg.vhd new file mode 100644 index 00000000..828485fb --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80_Reg.vhd @@ -0,0 +1,105 @@ +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80sed.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80sed.vhd new file mode 100644 index 00000000..0c28ec21 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/cpu/T80sed.vhd @@ -0,0 +1,179 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- ** CUSTOM 2 CLOCK MEMORY ACCESS FOR PACMAN, MIKEJ ** +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0238 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0235 : First release +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80sed is + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80sed; + +architecture rtl of T80sed is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map( + Mode => 0, + IOWait => 1) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or TState = "010") and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if ((TState = "001") or (TState = "010")) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/dac.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/dac.vhd new file mode 100644 index 00000000..47b2185e --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 10 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/dpram.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/dpram.vhd new file mode 100644 index 00000000..78823ec4 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/dpram.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- $Id: dpram.vhd,v 1.1 2006/02/23 21:46:45 arnim Exp $ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dpram is + +generic ( + addr_width_g : integer := 8; + data_width_g : integer := 8 +); +port ( + clk_a_i : in std_logic; + en_a_i : in std_logic; + we_i : in std_logic; + addr_a_i : in std_logic_vector(addr_width_g-1 downto 0); + data_a_i : in std_logic_vector(data_width_g-1 downto 0); + data_a_o : out std_logic_vector(data_width_g-1 downto 0); + clk_b_i : in std_logic; + addr_b_i : in std_logic_vector(addr_width_g-1 downto 0); + data_b_o : out std_logic_vector(data_width_g-1 downto 0) +); + +end dpram; + + +library ieee; +use ieee.numeric_std.all; + +architecture rtl of dpram is + + type ram_t is array (natural range 2**addr_width_g-1 downto 0) of std_logic_vector(data_width_g-1 downto 0); + signal ram_q : ram_t; + +begin + + mem_a: process (clk_a_i) + begin + if rising_edge(clk_a_i) then + if we_i = '1' and en_a_i = '1' then + ram_q(to_integer(unsigned(addr_a_i))) <= data_a_i; + data_a_o <= data_a_i; + else + data_a_o <= ram_q(to_integer(unsigned(addr_a_i))); + end if; + end if; + end process mem_a; + + mem_b: process (clk_b_i) + begin + if rising_edge(clk_b_i) then + data_b_o <= ram_q(to_integer(unsigned(addr_b_i))); + end if; + end process mem_b; + +end rtl; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/hq2x.sv b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_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/Arcade/Scramble Hardware/TheEnd_MiST/rtl/i82c55.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/i82c55.vhd new file mode 100644 index 00000000..d415d932 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/i82c55.vhd @@ -0,0 +1,686 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- + +library ieee ; + use ieee.std_logic_1164.all ; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity I82C55 is + port ( + + I_ADDR : in std_logic_vector(1 downto 0); -- A1-A0 + I_DATA : in std_logic_vector(7 downto 0); -- D7-D0 + O_DATA : out std_logic_vector(7 downto 0); + O_DATA_OE_L : out std_logic; + + I_CS_L : in std_logic; + I_RD_L : in std_logic; + I_WR_L : in std_logic; + + I_PA : in std_logic_vector(7 downto 0); + O_PA : out std_logic_vector(7 downto 0); + O_PA_OE_L : out std_logic_vector(7 downto 0); + + I_PB : in std_logic_vector(7 downto 0); + O_PB : out std_logic_vector(7 downto 0); + O_PB_OE_L : out std_logic_vector(7 downto 0); + + I_PC : in std_logic_vector(7 downto 0); + O_PC : out std_logic_vector(7 downto 0); + O_PC_OE_L : out std_logic_vector(7 downto 0); + + RESET : in std_logic; + ENA : in std_logic; -- (CPU) clk enable + CLK : in std_logic + ); +end; + +architecture RTL of I82C55 is + + -- registers + signal bit_mask : std_logic_vector(7 downto 0); + signal r_porta : std_logic_vector(7 downto 0); + signal r_portb : std_logic_vector(7 downto 0); + signal r_portc : std_logic_vector(7 downto 0); + signal r_control : std_logic_vector(7 downto 0); + -- + signal porta_we : std_logic; + signal portb_we : std_logic; + signal porta_re : std_logic; + signal portb_re : std_logic; + -- + signal porta_we_t1 : std_logic; + signal portb_we_t1 : std_logic; + signal porta_re_t1 : std_logic; + signal portb_re_t1 : std_logic; + -- + signal porta_we_rising : boolean; + signal portb_we_rising : boolean; + signal porta_re_rising : boolean; + signal portb_re_rising : boolean; + -- + signal groupa_mode : std_logic_vector(1 downto 0); -- port a/c upper + signal groupb_mode : std_logic; -- port b/c lower + -- + signal porta_read : std_logic_vector(7 downto 0); + signal portb_read : std_logic_vector(7 downto 0); + signal portc_read : std_logic_vector(7 downto 0); + signal control_read : std_logic_vector(7 downto 0); + signal mode_clear : std_logic; + -- + signal a_inte1 : std_logic; + signal a_inte2 : std_logic; + signal b_inte : std_logic; + -- + signal a_intr : std_logic; + signal a_obf_l : std_logic; + signal a_ibf : std_logic; + signal a_ack_l : std_logic; + signal a_stb_l : std_logic; + signal a_ack_l_t1 : std_logic; + signal a_stb_l_t1 : std_logic; + -- + signal b_intr : std_logic; + signal b_obf_l : std_logic; + signal b_ibf : std_logic; + signal b_ack_l : std_logic; + signal b_stb_l : std_logic; + signal b_ack_l_t1 : std_logic; + signal b_stb_l_t1 : std_logic; + -- + signal a_ack_l_rising : boolean; + signal a_stb_l_rising : boolean; + signal b_ack_l_rising : boolean; + signal b_stb_l_rising : boolean; + -- + signal porta_ipreg : std_logic_vector(7 downto 0); + signal portb_ipreg : std_logic_vector(7 downto 0); +begin + -- + -- mode 0 - basic input/output + -- mode 1 - strobed input/output + -- mode 2/3 - bi-directional bus + -- + -- control word (write) + -- + -- D7 mode set flag 1 = active + -- D6..5 GROUPA mode selection (mode 0,1,2) + -- D4 GROUPA porta 1 = input, 0 = output + -- D3 GROUPA portc upper 1 = input, 0 = output + -- D2 GROUPB mode selection (mode 0 ,1) + -- D1 GROUPB portb 1 = input, 0 = output + -- D0 GROUPB portc lower 1 = input, 0 = output + -- + -- D7 bit set/reset 0 = active + -- D6..4 x + -- D3..1 bit select + -- d0 1 = set, 0 - reset + -- + -- all output registers including status are reset when mode is changed + --1. Port A: + --All Modes: Output data is cleared, input data is not cleared. + + --2. Port B: + --Mode 0: Output data is cleared, input data is not cleared. + --Mode 1 and 2: Both output and input data are cleared. + + --3. Port C: + --Mode 0:Output data is cleared, input data is not cleared. + --Mode 1 and 2: IBF and INTR are cleared and OBF# is set. + --Outputs in Port C which are not used for handshaking or interrupt signals are cleared. + --Inputs such as STB#, ACK#, or "spare" inputs are not affected. The interrupts for Ports A and B are disabled. + + p_bit_mask : process(I_DATA) + begin + bit_mask <= x"01"; + case I_DATA(3 downto 1) is + when "000" => bit_mask <= x"01"; + when "001" => bit_mask <= x"02"; + when "010" => bit_mask <= x"04"; + when "011" => bit_mask <= x"08"; + when "100" => bit_mask <= x"10"; + when "101" => bit_mask <= x"20"; + when "110" => bit_mask <= x"40"; + when "111" => bit_mask <= x"80"; + when others => null; + end case; + end process; + + p_write_reg_reset : process(RESET, CLK) + variable r_portc_masked : std_logic_vector(7 downto 0); + variable r_portc_setclr : std_logic_vector(7 downto 0); + begin + if (RESET = '1') then + r_porta <= x"00"; + r_portb <= x"00"; + r_portc <= x"00"; + r_control <= x"9B"; -- 10011011 + mode_clear <= '1'; + elsif rising_edge(CLK) then + + r_portc_masked := (not bit_mask) and r_portc; + for i in 0 to 7 loop + r_portc_setclr(i) := bit_mask(i) and I_DATA(0); + end loop; + + if (ENA = '1') then + mode_clear <= '0'; + if (I_CS_L = '0') and (I_WR_L = '0') then + case I_ADDR is + when "00" => r_porta <= I_DATA; + when "01" => r_portb <= I_DATA; + when "10" => r_portc <= I_DATA; + + when "11" => if (I_DATA(7) = '0') then -- set/clr + r_portc <= r_portc_masked or r_portc_setclr; + else + --mode_clear <= '1'; + --r_porta <= x"00"; + --r_portb <= x"00"; -- clear port b input reg + --r_portc <= x"00"; -- clear control sigs + r_control <= I_DATA; -- load new mode + end if; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_decode_control : process(r_control) + begin + groupa_mode <= r_control(6 downto 5); + groupb_mode <= r_control(2); + end process; + + p_oe : process(I_CS_L, I_RD_L) + begin + O_DATA_OE_L <= '1'; + if (I_CS_L = '0') and (I_RD_L = '0') then + O_DATA_OE_L <= '0'; + end if; + end process; + + p_read : process(I_ADDR, porta_read, portb_read, portc_read, control_read) + begin + O_DATA <= x"00"; -- default + --if (I_CS_L = '0') and (I_RD_L = '0') then -- not required + case I_ADDR is + when "00" => O_DATA <= porta_read; + when "01" => O_DATA <= portb_read; + when "10" => O_DATA <= portc_read; + when "11" => O_DATA <= control_read; + when others => null; + end case; + --end if; + end process; + control_read(7) <= '1'; -- always 1 + control_read(6 downto 0) <= r_control(6 downto 0); + + p_rw_control : process(I_CS_L, I_RD_L, I_WR_L, I_ADDR) + begin + porta_we <= '0'; + portb_we <= '0'; + porta_re <= '0'; + portb_re <= '0'; + + if (I_CS_L = '0') and (I_ADDR = "00") then + porta_we <= not I_WR_L; + porta_re <= not I_RD_L; + end if; + + if (I_CS_L = '0') and (I_ADDR = "01") then + portb_we <= not I_WR_L; + portb_re <= not I_RD_L; + end if; + end process; + + p_rw_control_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + porta_we_t1 <= porta_we; + portb_we_t1 <= portb_we; + porta_re_t1 <= porta_re; + portb_re_t1 <= portb_re; + + a_stb_l_t1 <= a_stb_l; + a_ack_l_t1 <= a_ack_l; + b_stb_l_t1 <= b_stb_l; + b_ack_l_t1 <= b_ack_l; + end if; + end process; + + porta_we_rising <= (porta_we = '0') and (porta_we_t1 = '1'); -- falling as inverted + portb_we_rising <= (portb_we = '0') and (portb_we_t1 = '1'); -- " + porta_re_rising <= (porta_re = '0') and (porta_re_t1 = '1'); -- falling as inverted + portb_re_rising <= (portb_re = '0') and (portb_re_t1 = '1'); -- " + -- + a_stb_l_rising <= (a_stb_l = '1') and (a_stb_l_t1 = '0'); + a_ack_l_rising <= (a_ack_l = '1') and (a_ack_l_t1 = '0'); + b_stb_l_rising <= (b_stb_l = '1') and (b_stb_l_t1 = '0'); + b_ack_l_rising <= (b_ack_l = '1') and (b_ack_l_t1 = '0'); + -- + -- GROUP A + -- in mode 1 + -- + -- d4=1 (porta = input) + -- pc7,6 io (d3=1 input, d3=0 output) + -- pc5 output a_ibf + -- pc4 input a_stb_l + -- pc3 output a_intr + -- + -- d4=0 (porta = output) + -- pc7 output a_obf_l + -- pc6 input a_ack_l + -- pc5,4 io (d3=1 input, d3=0 output) + -- pc3 output a_intr + -- + -- GROUP B + -- in mode 1 + -- d1=1 (portb = input) + -- pc2 input b_stb_l + -- pc1 output b_ibf + -- pc0 output b_intr + -- + -- d1=0 (portb = output) + -- pc2 input b_ack_l + -- pc1 output b_obf_l + -- pc0 output b_intr + + + -- WHEN AN INPUT + -- + -- stb_l a low on this input latches input data + -- ibf a high on this output indicates data latched. set by stb_l and reset by rising edge of RD_L + -- intr a high on this output indicates interrupt. set by stb_l high, ibf high and inte high. reset by falling edge of RD_L + -- inte A controlled by bit/set PC4 + -- inte B controlled by bit/set PC2 + + -- WHEN AN OUTPUT + -- + -- obf_l output will go low when cpu has written data + -- ack_l input - a low on this clears obf_l + -- intr output set when ack_l is high, obf_l is high and inte is one. reset by falling edge of WR_L + -- inte A controlled by bit/set PC6 + -- inte B controlled by bit/set PC2 + + -- GROUP A + -- in mode 2 + -- + -- porta = IO + -- + -- control bits 2..0 still control groupb/c lower 2..0 + -- + -- + -- PC7 output a_obf + -- PC6 input a_ack_l + -- PC5 output a_ibf + -- PC4 input a_stb_l + -- PC3 is still interrupt out + p_control_flags : process(RESET, CLK) + variable we : boolean; + variable set1 : boolean; + variable set2 : boolean; + begin + if (RESET = '1') then + a_obf_l <= '1'; + a_inte1 <= '0'; + a_ibf <= '0'; + a_inte2 <= '0'; + a_intr <= '0'; + -- + b_inte <= '0'; + b_obf_l <= '1'; + b_ibf <= '0'; + b_intr <= '0'; + elsif rising_edge(CLK) then + we := (I_CS_L = '0') and (I_WR_L = '0') and (I_ADDR = "11") and (I_DATA(7) = '0'); + + if (ENA = '1') then + if (mode_clear = '1') then + a_obf_l <= '1'; + a_inte1 <= '0'; + a_ibf <= '0'; + a_inte2 <= '0'; + a_intr <= '0'; + -- + b_inte <= '0'; + b_obf_l <= '1'; + b_ibf <= '0'; + b_intr <= '0'; + else + if (bit_mask(7) = '1') and we then + a_obf_l <= I_DATA(0); + else + if porta_we_rising then + a_obf_l <= '0'; + elsif (a_ack_l = '0') then + a_obf_l <= '1'; + end if; + end if; + -- + if (bit_mask(6) = '1') and we then a_inte1 <= I_DATA(0); end if; -- bus set when mode1 & input? + -- + if (bit_mask(5) = '1') and we then + a_ibf <= I_DATA(0); + else + if porta_re_rising then + a_ibf <= '0'; + elsif (a_stb_l = '0') then + a_ibf <= '1'; + end if; + end if; + -- + if (bit_mask(4) = '1') and we then a_inte2 <= I_DATA(0); end if; -- bus set when mode1 & output? + -- + set1 := a_ack_l_rising and (a_obf_l = '1') and (a_inte1 = '1'); + set2 := a_stb_l_rising and (a_ibf = '1') and (a_inte2 = '1'); + -- + if (bit_mask(3) = '1') and we then + a_intr <= I_DATA(0); + else + if (groupa_mode(1) = '1') then + if (porta_we = '1') or (porta_re = '1') then + a_intr <= '0'; + elsif set1 or set2 then + a_intr <= '1'; + end if; + else + if (r_control(4) = '0') then -- output + if (porta_we = '1') then -- falling ? + a_intr <= '0'; + elsif set1 then + a_intr <= '1'; + end if; + elsif (r_control(4) = '1') then -- input + if (porta_re = '1') then -- falling ? + a_intr <= '0'; + elsif set2 then + a_intr <= '1'; + end if; + end if; + end if; + end if; + -- + if (bit_mask(2) = '1') and we then b_inte <= I_DATA(0); end if; -- bus set? + + if (bit_mask(1) = '1') and we then + b_obf_l <= I_DATA(0); + else + if (r_control(1) = '0') then -- output + if portb_we_rising then + b_obf_l <= '0'; + elsif (b_ack_l = '0') then + b_obf_l <= '1'; + end if; + else + if portb_re_rising then + b_ibf <= '0'; + elsif (b_stb_l = '0') then + b_ibf <= '1'; + end if; + end if; + end if; + + if (bit_mask(0) = '1') and we then + b_intr <= I_DATA(0); + else + if (r_control(1) = '0') then -- output + if (portb_we = '1') then -- falling ? + b_intr <= '0'; + elsif b_ack_l_rising and (b_obf_l = '1') and (b_inte = '1') then + b_intr <= '1'; + end if; + else + if (portb_re = '1') then -- falling ? + b_intr <= '0'; + elsif b_stb_l_rising and (b_ibf = '1') and (b_inte = '1') then + b_intr <= '1'; + end if; + end if; + end if; + + end if; + end if; + end if; + end process; + + p_porta : process(r_control, groupa_mode, r_porta, I_PA, porta_ipreg, a_ack_l) + begin + -- D4 GROUPA porta 1 = input, 0 = output + O_PA <= x"FF"; -- if not driven, float high + O_PA_OE_L <= x"FF"; + porta_read <= x"00"; + + if (groupa_mode = "00") then -- simple io + if (r_control(4) = '0') then -- output + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= I_PA; + elsif (groupa_mode = "01") then -- strobed + if (r_control(4) = '0') then -- output + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= porta_ipreg; + else -- if (groupa_mode(1) = '1') then -- bi dir + if (a_ack_l = '0') then -- output enable + O_PA <= r_porta; + O_PA_OE_L <= x"00"; + end if; + porta_read <= porta_ipreg; -- latched data + end if; + + end process; + + p_portb : process(r_control, groupb_mode, r_portb, I_PB, portb_ipreg) + begin + O_PB <= x"FF"; -- if not driven, float high + O_PB_OE_L <= x"FF"; + portb_read <= x"00"; + + if (groupb_mode = '0') then -- simple io + if (r_control(1) = '0') then -- output + O_PB <= r_portb; + O_PB_OE_L <= x"00"; + end if; + portb_read <= I_PB; + else -- strobed mode + if (r_control(1) = '0') then -- output + O_PB <= r_portb; + O_PB_OE_L <= x"00"; + end if; + portb_read <= portb_ipreg; + end if; + end process; + + p_portc_out : process(r_portc, r_control, groupa_mode, groupb_mode, + a_obf_l, a_ibf, a_intr,b_obf_l, b_ibf, b_intr) + begin + O_PC <= x"FF"; -- if not driven, float high + O_PC_OE_L <= x"FF"; + + -- bits 7..4 + if (groupa_mode = "00") then -- simple io + if (r_control(3) = '0') then -- output + O_PC (7 downto 4) <= r_portc(7 downto 4); + O_PC_OE_L(7 downto 4) <= x"0"; + end if; + elsif (groupa_mode = "01") then -- mode1 + + if (r_control(4) = '0') then -- port a output + O_PC (7) <= a_obf_l; + O_PC_OE_L(7) <= '0'; + -- 6 is ack_l input + if (r_control(3) = '0') then -- port c output + O_PC (5 downto 4) <= r_portc(5 downto 4); + O_PC_OE_L(5 downto 4) <= "00"; + end if; + else -- port a input + if (r_control(3) = '0') then -- port c output + O_PC (7 downto 6) <= r_portc(7 downto 6); + O_PC_OE_L(7 downto 6) <= "00"; + end if; + O_PC (5) <= a_ibf; + O_PC_OE_L(5) <= '0'; + -- 4 is stb_l input + end if; + + else -- if (groupa_mode(1) = '1') then -- mode2 + O_PC (7) <= a_obf_l; + O_PC_OE_L(7) <= '0'; + -- 6 is ack_l input + O_PC (5) <= a_ibf; + O_PC_OE_L(5) <= '0'; + -- 4 is stb_l input + end if; + + -- bit 3 (controlled by group a) + if (groupa_mode = "00") then -- group a steals this bit + --if (groupb_mode = '0') then -- we will let bit 3 be driven, data sheet is a bit confused about this + if (r_control(0) = '0') then -- ouput (note, groupb control bit) + O_PC (3) <= r_portc(3); + O_PC_OE_L(3) <= '0'; + end if; + -- + else -- stolen + O_PC (3) <= a_intr; + O_PC_OE_L(3) <= '0'; + end if; + + -- bits 2..0 + if (groupb_mode = '0') then -- simple io + if (r_control(0) = '0') then -- output + O_PC (2 downto 0) <= r_portc(2 downto 0); + O_PC_OE_L(2 downto 0) <= "000"; + end if; + else + -- mode 1 + -- 2 is input + if (r_control(1) = '0') then -- output + O_PC (1) <= b_obf_l; + O_PC_OE_L(1) <= '0'; + else -- input + O_PC (1) <= b_ibf; + O_PC_OE_L(1) <= '0'; + end if; + O_PC (0) <= b_intr; + O_PC_OE_L(0) <= '0'; + end if; + end process; + + p_portc_in : process(r_portc, I_PC, r_control, groupa_mode, groupb_mode, a_ibf, b_obf_l, + a_obf_l, a_inte1, a_inte2, a_intr, b_inte, b_ibf, b_intr) + begin + portc_read <= x"00"; + + a_stb_l <= '1'; + a_ack_l <= '1'; + b_stb_l <= '1'; + b_ack_l <= '1'; + + if (groupa_mode = "01") then -- mode1 or 2 + if (r_control(4) = '0') then -- port a output + a_ack_l <= I_PC(6); + else -- port a input + a_stb_l <= I_PC(4); + end if; + elsif (groupa_mode(1) = '1') then -- mode 2 + a_ack_l <= I_PC(6); + a_stb_l <= I_PC(4); + end if; + + if (groupb_mode = '1') then + if (r_control(1) = '0') then -- output + b_ack_l <= I_PC(2); + else -- input + b_stb_l <= I_PC(2); + end if; + end if; + + if (groupa_mode = "00") then -- simple io + portc_read(7 downto 3) <= I_PC(7 downto 3); + elsif (groupa_mode = "01") then + if (r_control(4) = '0') then -- port a output + portc_read(7 downto 3) <= a_obf_l & a_inte1 & I_PC(5 downto 4) & a_intr; + else -- input + portc_read(7 downto 3) <= I_PC(7 downto 6) & a_ibf & a_inte2 & a_intr; + end if; + else -- mode 2 + portc_read(7 downto 3) <= a_obf_l & a_inte1 & a_ibf & a_inte2 & a_intr; + end if; + + if (groupb_mode = '0') then -- simple io + portc_read(2 downto 0) <= I_PC(2 downto 0); + else + if (r_control(1) = '0') then -- output + portc_read(2 downto 0) <= b_inte & b_obf_l & b_intr; + else -- input + portc_read(2 downto 0) <= b_inte & b_ibf & b_intr; + end if; + end if; + end process; + + p_ipreg : process + begin + wait until rising_edge(CLK); + -- pc4 input a_stb_l + -- pc2 input b_stb_l + + if (ENA = '1') then + if (a_stb_l = '0') then + porta_ipreg <= I_PA; + end if; + + if (mode_clear = '1') then + portb_ipreg <= (others => '0'); + elsif (b_stb_l = '0') then + portb_ipreg <= I_PB; + end if; + end if; + end process; + +end architecture RTL; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/keyboard.v b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/keyboard.v new file mode 100644 index 00000000..c2b7b86e --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[9: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[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[8] <= ~release_btn; // Left Alt + 'h0d: joystick[9] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + 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/Arcade/Scramble Hardware/TheEnd_MiST/rtl/mist_io.v b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_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/Arcade/Scramble Hardware/TheEnd_MiST/rtl/osd.v b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_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/Arcade/Scramble Hardware/TheEnd_MiST/rtl/pll.qip b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_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/Arcade/Scramble Hardware/TheEnd_MiST/rtl/pll.v b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/pll.v new file mode 100644 index 00000000..4bec713f --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/pll.v @@ -0,0 +1,320 @@ +// 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 ( + areset, + inclk0, + c0, + locked); + + input areset; + input inclk0; + output c0; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire sub_wire0; + wire [4:0] sub_wire1; + wire [0:0] sub_wire5 = 1'h0; + wire locked = sub_wire0; + wire [0:0] sub_wire2 = sub_wire1[0:0]; + wire c0 = sub_wire2; + wire sub_wire3 = inclk0; + wire [1:0] sub_wire4 = {sub_wire5, sub_wire3}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire4), + .locked (sub_wire0), + .clk (sub_wire1), + .activeclock (), + .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 (), + .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 = 3, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 4, + altpll_component.clk0_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_USED", + 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_USED", + 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_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + 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.self_reset_on_loss_lock = "OFF", + 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 "3" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "36.000000" +// 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 "1" +// 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: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "4" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "36.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 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_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: 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_CLKENA0 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 "3" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "4" +// Retrieval info: CONSTANT: CLK0_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_USED" +// 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_USED" +// 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_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scandoubler.v b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..36e71ed2 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_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/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scramble.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scramble.vhd new file mode 100644 index 00000000..dcca3248 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scramble.vhd @@ -0,0 +1,585 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE is + port ( + I_HWSEL_FROGGER : in boolean; + -- + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(2 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + -- + -- to audio board + -- + O_ADDR : out std_logic_vector(15 downto 0); + O_DATA : out std_logic_vector( 7 downto 0); + I_DATA : in std_logic_vector( 7 downto 0); + I_DATA_OE_L : in std_logic; + O_RD_L : out std_logic; + O_WR_L : out std_logic; + O_IOPC7 : out std_logic; + O_RESET_WD_L : out std_logic; + -- + ENA : in std_logic; + ENA_STAR : in std_logic; + -- + RESET : in std_logic; -- active high + CLK : in std_logic + ); +end; + +architecture RTL of SCRAMBLE is + + type array_4x8 is array (0 to 3) of std_logic_vector(7 downto 0); + -- timing + signal hcnt : std_logic_vector(8 downto 0) := "010000000"; -- 80 + signal vcnt : std_logic_vector(8 downto 0) := "011111000"; -- 0F8 + + signal reset_wd_l : std_logic; + + -- timing decode + signal do_hsync : boolean; + signal set_vblank : boolean; + signal vsync : std_logic; + signal hsync : std_logic; + signal vblank : std_logic; + signal hblank : std_logic; + -- + -- cpu + signal cpu_ena : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_wr_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + + signal page_4to7_l : std_logic; + + signal wren : std_logic; + + signal objen_l : std_logic; + signal waen_l : std_logic; + + signal objramrd_l : std_logic; + signal vramrd_l : std_logic; + + signal select_l : std_logic; + signal objramwr_l : std_logic; + signal vramwr_l : std_logic; + + -- control reg + signal control_reg : std_logic_vector(7 downto 0); + signal intst_l : std_logic; + signal iopc7 : std_logic; + signal pout1 : std_logic; + signal starson : std_logic; + signal hcma : std_logic; + signal vcma : std_logic; + + signal pgm_rom_dout : array_4x8; + signal rom_dout : std_logic_vector(7 downto 0); + signal ram_dout : std_logic_vector(7 downto 0); + signal ram_ena : std_logic; + + signal vram_data : std_logic_vector(7 downto 0); + +begin + + O_HBLANK <= hblank; + O_VBLANK <= vblank; + + -- + -- video timing + -- + p_hvcnt : process + variable hcarry,vcarry : boolean; + begin + wait until rising_edge(CLK); + if (ENA = '1') then + hcarry := (hcnt = "111111111"); + if hcarry then + hcnt <= "010000000"; -- 080 + else + hcnt <= hcnt +"1"; + end if; + -- hcnt 8 on circuit is 256H_L + vcarry := (vcnt = "111111111"); + if do_hsync then + if vcarry then + vcnt <= "011111000"; -- 0F8 + else + vcnt <= vcnt +"1"; + end if; + end if; + end if; + end process; + + p_sync_comb : process(hcnt, vcnt) + begin + vsync <= not vcnt(8); + do_hsync <= (hcnt = "010101111"); -- 0AF + set_vblank <= (vcnt = "111101111"); -- 1EF + end process; + + p_sync : process + begin + wait until rising_edge(CLK); + -- Timing hardware is coded differently to the real hw + -- to avoid the use of multiple clocks. Result is identical. + if (ENA = '1') then + if (hcnt = "010001001") then -- 081 + hblank <= '1'; + elsif (hcnt = "011111111") then -- 0f9 + hblank <= '0'; + end if; + + if do_hsync then + hsync <= '1'; + elsif (hcnt = "011001111") then -- 0CF + hsync <= '0'; + end if; + + if do_hsync then + if set_vblank then -- 1EF + vblank <= '1'; + elsif (vcnt = "100001111") then -- 10F + vblank <= '0'; + end if; + end if; + end if; + end process; + + p_video_timing_reg : process + begin + wait until rising_edge(CLK); + -- match output delay in video module + if (ENA = '1') then + O_HSYNC <= HSYNC; + O_VSYNC <= VSYNC; + end if; + end process; + + p_cpu_ena : process(hcnt, ENA) + begin + -- cpu clocked on rising edge of 1h, late + cpu_ena <= ENA and hcnt(0); -- 1h + end process; + -- + -- video + -- + u_video : entity work.SCRAMBLE_VIDEO + port map ( + I_HWSEL_FROGGER => I_HWSEL_FROGGER, + -- + I_HCNT => hcnt, + I_VCNT => vcnt, + I_VBLANK => vblank, + I_VSYNC => vsync, + + I_VCMA => vcma, + I_HCMA => hcma, + -- + I_CPU_ADDR => cpu_addr, + I_CPU_DATA => cpu_data_out, + O_VRAM_DATA => vram_data, + -- note, looks like the real hardware cannot read from object ram + -- + I_VRAMWR_L => vramwr_l, + I_VRAMRD_L => vramrd_l, + I_OBJRAMWR_L => objramwr_l, + I_OBJRAMRD_L => objramrd_l, + I_OBJEN_L => objen_l, + -- + I_STARSON => starson, + I_POUT1 => pout1, + -- + O_VIDEO_R => O_VIDEO_R, + O_VIDEO_G => O_VIDEO_G, + O_VIDEO_B => O_VIDEO_B, + -- + ENA => ENA, + ENA_STAR => ENA_STAR, + CLK => CLK + ); + + -- other cpu signals + reset_wd_l <= not RESET; -- FIX + + p_cpu_wait : process(vblank, hblank, waen_l) + begin + -- this is done a bit differently, the original had a late + -- clock to the cpu, and as mreq came out a litle early it could assert + -- wait and then gate off the write strobe to vram/objram in time. + -- + -- we are a nice synchronous system therefore we need to do this combinatorially. + -- timing is still ok. + -- + if (vblank = '1') then + cpu_wait_l <='1'; + else + cpu_wait_l <= '1'; + if (hblank = '0') and (waen_l = '0') then + cpu_wait_l <= '0'; + end if; + end if; + end process; + wren <= cpu_wait_l; + + p_cpu_int : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (intst_l = '0') then + cpu_nmi_l <= '1'; + else + if do_hsync and set_vblank then + cpu_nmi_l <= '0'; + end if; + end if; + end if; + end process; + + u_cpu : entity work.T80sed + port map ( + RESET_n => reset_wd_l, + CLK_n => clk, + CLKEN => cpu_ena, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => open, + MREQ_n => cpu_mreq_l, + IORQ_n => open, + RD_n => cpu_rd_l, + WR_n => cpu_wr_l, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + -- + -- primary addr decode + -- + p_mem_decode : process(cpu_rfsh_l, cpu_rd_l, cpu_wr_l, cpu_mreq_l, cpu_addr, I_HWSEL_FROGGER) + begin + -- Scramble map + --0000-3fff ROM + --4000-47ff RAM + --4800-4bff Video RAM + --5000-50ff Object RAM + --5000-503f screen attributes + --5040-505f sprites + --5060-507f bullets + --5080-50ff unused? + + --read: + --7000 Watchdog Reset (Scramble) + --8100 IN0 + --8101 IN1 + --8102 IN2 (bits 5 and 7 used for protection check in Scramble) + + --write: + --6800-6807 control reg + --8200 To AY-3-8910 port A (commands for the audio CPU) + --8201 bit 3 = interrupt trigger on audio CPU bit 4 = AMPM (?) + --8202 protection check control? + + -- Frogger map + --0000-3fff ROM + --8000-87ff RAM + --a800-abff Video RAM + --b000-b0ff Object RAM + --b000-b03f screen attributes + --b040-b05f sprites + --b060-b0ff unused? + + --read: + --8800 Watchdog Reset + --e000 IN0 + --e002 IN1 + --e004 IN2 + cpu_int_l <= '1'; + cpu_busrq_l <= '1'; + + page_4to7_l <= '1'; + if (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + + if I_HWSEL_FROGGER then + cpu_int_l <= '0'; + cpu_busrq_l <= cpu_addr(15); + end if; + + if not I_HWSEL_FROGGER then + if (cpu_addr(15 downto 14) = "01") then page_4to7_l <= '0'; end if; + else + if (cpu_addr(15 downto 14) = "10") then page_4to7_l <= '0'; end if; + end if; + end if; + + end process; + + p_mem_decode2 : process(I_HWSEL_FROGGER, cpu_addr, page_4to7_l, cpu_rfsh_l, cpu_rd_l, cpu_wr_l, wren) + begin + waen_l <= '1'; + objen_l <= '1'; + if not I_HWSEL_FROGGER then + if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(13 downto 11) = "001") then waen_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "010") then objen_l <= '0'; end if; + end if; + else + if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(13 downto 11) = "101") then waen_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "110") then objen_l <= '0'; end if; + end if; + end if; + + -- read decode + vramrd_l <= '1'; + objramrd_l <= '1'; + + if not I_HWSEL_FROGGER then + if (page_4to7_l = '0') and (cpu_rd_l = '0') then + if (cpu_addr(13 downto 11) = "001") then vramrd_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "010") then objramrd_l <= '0'; end if; + end if; + else + if (page_4to7_l = '0') and (cpu_rd_l = '0') then + if (cpu_addr(13 downto 11) = "101") then vramrd_l <= '0'; end if; + end if; + end if; + -- write decode + vramwr_l <= '1'; + objramwr_l <= '1'; + select_l <= '1'; + + if not I_HWSEL_FROGGER then + if (page_4to7_l = '0') and (cpu_wr_l = '0') and (wren = '1') then + if (cpu_addr(13 downto 11) = "001") then vramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "010") then objramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "101") then select_l <= '0'; end if; -- control reg + end if; + else + if (page_4to7_l = '0') and (cpu_wr_l = '0') and (wren = '1') then + if (cpu_addr(13 downto 11) = "101") then vramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "110") then objramwr_l <= '0'; end if; + if (cpu_addr(13 downto 11) = "111") then select_l <= '0'; end if; -- control reg + end if; + end if; + end process; + + p_control_reg : process + variable addr : std_logic_vector(2 downto 0); + variable dec : std_logic_vector(7 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + -- scramble + --6801 interrupt enable + --6802 coin counter + --6803 ? (POUT1) + --6804 stars on + --6805 ? (POUT2) + --6806 screen vertical flip + --6807 screen horizontal flip + if not I_HWSEL_FROGGER then + addr := cpu_addr(2 downto 0); + else + addr := cpu_addr(4 downto 2); + end if; + + dec := "00000000"; + if (select_l = '0') then + case addr(2 downto 0) is + when "000" => dec := "00000001"; + when "001" => dec := "00000010"; + when "010" => dec := "00000100"; + when "011" => dec := "00001000"; + when "100" => dec := "00010000"; + when "101" => dec := "00100000"; + when "110" => dec := "01000000"; + when "111" => dec := "10000000"; + when others => null; + end case; + end if; + + if (reset_wd_l = '0') then + control_reg <= (others => '0'); + else + for i in 0 to 7 loop + if (dec(i) = '1') then + control_reg(i) <= cpu_data_out(0); + end if; + end loop; + end if; + end if; + end process; + + p_control_reg_assign : process(control_reg, I_HWSEL_FROGGER) + begin + if not I_HWSEL_FROGGER then + -- Scramble + intst_l <= control_reg(1); + iopc7 <= control_reg(2); + pout1 <= control_reg(3); + starson <= control_reg(4); + hcma <= control_reg(6); + vcma <= control_reg(7); + else + intst_l <= control_reg(2); + iopc7 <= control_reg(6); + pout1 <= control_reg(7); + starson <= '0'; + hcma <= control_reg(4); + vcma <= control_reg(3); + end if; + end process; + -- + -- + -- roms / rams + pgm_rom : entity work.ROM_PGM + port map (CLK => CLK, ADDR => cpu_addr(13 downto 0), DATA => rom_dout); +-- pgm_rom01 : entity work.ROM_PGM_01 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(0)); +-- pgm_rom23 : entity work.ROM_PGM_23 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(1)); +-- pgm_rom45 : entity work.ROM_PGM_45 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(2)); +-- pgm_rom56 : entity work.ROM_PGM_67 +-- port map (CLK => CLK, ENA => ENA, ADDR => cpu_addr(11 downto 0), DATA => pgm_rom_dout(3)); + +-- p_rom_mux : process(cpu_addr, pgm_rom_dout) +-- begin +-- rom_dout <= (others => '0'); +-- case cpu_addr(13 downto 12) is +-- when "00" => rom_dout <= pgm_rom_dout(0); +-- when "01" => rom_dout <= pgm_rom_dout(1); +-- when "10" => rom_dout <= pgm_rom_dout(2); +-- when "11" => rom_dout <= pgm_rom_dout(3); +-- when others => null; +-- end case; +-- end process; + + u_cpu_ram : work.dpram generic map (11,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => ram_ena and (not cpu_wr_l), + + addr_a_i => cpu_addr(10 downto 0), + data_a_i => cpu_data_out, + + clk_b_i => clk, + addr_b_i => cpu_addr(10 downto 0), + data_b_o => ram_dout + ); + + p_ram_ctrl : process(cpu_addr, page_4to7_l) + begin + ram_ena <= '0'; + if (page_4to7_l = '0') and (cpu_addr(13 downto 11) = "000") then + ram_ena <= '1'; + end if; + end process; + + p_cpu_data_in_mux : process(I_HWSEL_FROGGER, cpu_addr, cpu_rd_l, cpu_mreq_l, cpu_rfsh_l, ram_dout, rom_dout, vramrd_l, vram_data, I_DATA_OE_L, I_DATA ) + variable ram_addr : std_logic_vector(1 downto 0); + begin + + if not I_HWSEL_FROGGER then + ram_addr := "01"; + else + ram_addr := "10"; + end if; + + cpu_data_in <= (others => '0'); + if (vramrd_l = '0') then + cpu_data_in <= vram_data; + -- + elsif (I_DATA_OE_L = '0') then + cpu_data_in <= I_DATA; + -- + elsif (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + if (cpu_addr(15 downto 14) = "00") and (cpu_rd_l = '0') and (cpu_mreq_l = '0') and (cpu_rfsh_l = '1') then + cpu_data_in <= rom_dout; + -- + elsif (cpu_addr(15 downto 14) = ram_addr) then + if (cpu_addr(13 downto 11) = "000") and (cpu_rd_l = '0') then + cpu_data_in <= ram_dout; + else + cpu_data_in <= x"FF"; + end if; + end if; + else + cpu_data_in <= x"FF"; + end if; + + end process; + + -- to audio + O_ADDR <= cpu_addr; + O_DATA <= cpu_data_out; + O_RD_L <= cpu_rd_l; + O_WR_L <= cpu_wr_l; + O_IOPC7 <= iopc7; + O_RESET_WD_L <= reset_wd_l; + +end RTL; \ No newline at end of file diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scramble_audio.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scramble_audio.vhd new file mode 100644 index 00000000..57684539 --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scramble_audio.vhd @@ -0,0 +1,842 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE_AUDIO is + port ( + I_HWSEL_FROGGER : in boolean; + -- + I_ADDR : in std_logic_vector(15 downto 0); + I_DATA : in std_logic_vector( 7 downto 0); + O_DATA : out std_logic_vector( 7 downto 0); + O_DATA_OE_L : out std_logic; + -- + I_RD_L : in std_logic; + I_WR_L : in std_logic; + I_IOPC7 : in std_logic; + -- + O_AUDIO : out std_logic_vector( 9 downto 0); + -- + I_1P_CTRL : in std_logic_vector( 6 downto 0); -- start, shoot1, shoot2, left,right,up,down + I_2P_CTRL : in std_logic_vector( 6 downto 0); -- start, shoot1, shoot2, left,right,up,down + I_SERVICE : in std_logic; + I_COIN1 : in std_logic; + I_COIN2 : in std_logic; + O_COIN_COUNTER : out std_logic; + -- + I_DIP : in std_logic_vector( 5 downto 1); + -- + I_RESET_L : in std_logic; + ENA : in std_logic; -- 6 MHz + ENA_1_79 : in std_logic; -- 1.78975 MHz + CLK : in std_logic + ); +end; + +architecture RTL of SCRAMBLE_AUDIO is + + signal reset : std_logic; + signal cpu_ena : std_logic; + signal cpu_ena_gated : std_logic; + -- + signal cpu_m1_l : std_logic; + signal cpu_mreq_l : std_logic; + signal cpu_iorq_l : std_logic; + signal cpu_rd_l : std_logic; + signal cpu_wr_l : std_logic; + signal cpu_rfsh_l : std_logic; + signal cpu_wait_l : std_logic; + signal cpu_int_l : std_logic; + signal cpu_nmi_l : std_logic; + signal cpu_busrq_l : std_logic; + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_data_out : std_logic_vector(7 downto 0); + signal cpu_data_in : std_logic_vector(7 downto 0); + -- + signal ram_cs : std_logic; + signal rom_oe : std_logic; + signal filter_load : std_logic; + signal filter_reg : std_logic_vector(11 downto 0); + -- + signal cpu_rom0_dout : std_logic_vectoR(7 downto 0); + signal cpu_rom1_dout : std_logic_vectoR(7 downto 0); + signal cpu_rom2_dout : std_logic_vectoR(7 downto 0); + signal rom_active : std_logic; + + signal rom_dout : std_logic_vector(7 downto 0); + signal ram_dout : std_logic_vector(7 downto 0); + -- + signal i8255_addr : std_logic_vector(1 downto 0); + signal i8255_1D_data : std_logic_vector(7 downto 0); + signal i8255_1D_data_oe_l : std_logic; + signal i8255_1D_cs_l : std_logic; + signal i8255_1D_pa_out : std_logic_vector(7 downto 0); + signal i8255_1D_pb_out : std_logic_vector(7 downto 0); + -- + signal i8255_1E_data : std_logic_vector(7 downto 0); + signal i8255_1E_data_oe_l : std_logic; + signal i8255_1E_cs_l : std_logic; + signal i8255_1E_pa : std_logic_vector(7 downto 0); + signal i8255_1E_pb : std_logic_vector(7 downto 0); + signal i8255_1E_pc : std_logic_vector(7 downto 0); + + -- security + signal net_1e10_i : std_logic; + signal net_1e12_i : std_logic; + signal xb : std_logic_vector(7 downto 0); + signal xbo : std_logic_vector(7 downto 0); + + signal audio_div_cnt : std_logic_vector( 8 downto 0) := (others => '0'); + signal ls90_op : std_logic_vector(3 downto 0); + signal ls90_clk : std_logic; + signal ls90_cnt : std_logic_vector( 3 downto 0) := (others => '0'); + -- ym2149 3C + signal ym2149_3C_dv : std_logic_vector(7 downto 0); + signal ym2149_3C_oe_l : std_logic; + signal ym2149_3C_bdir : std_logic; + signal ym2149_3C_bc2 : std_logic; + signal ym2149_3C_bc1 : std_logic; + signal ym2149_3C_audio : std_logic_vector(7 downto 0); + signal ym2149_3C_chan : std_logic_vector(1 downto 0); + signal ym2149_3C_chan_t1 : std_logic_vector(1 downto 0); + -- + -- ym2149 3D + signal ym2149_3D_dv : std_logic_vector(7 downto 0); + signal ym2149_3D_oe_l : std_logic; + signal ym2149_3D_bdir : std_logic; + signal ym2149_3D_bc2 : std_logic; + signal ym2149_3D_bc1 : std_logic; + signal ym2149_3D_audio : std_logic_vector(7 downto 0); + signal ym2149_3D_chan : std_logic_vector(1 downto 0); + signal ym2149_3D_chan_t1 : std_logic_vector(1 downto 0); + signal ym2149_3D_ioa_in : std_logic_vector(7 downto 0); + signal ym2149_3D_ioa_out : std_logic_vector(7 downto 0); + signal ym2149_3D_ioa_oe_l : std_logic; + signal ym2149_3D_iob_in : std_logic_vector(7 downto 0); + -- + signal ampm : std_logic; + signal sint : std_logic; + signal sint_t1 : std_logic; + -- + signal audio_3C_mix : std_logic_vector(9 downto 0); + signal audio_3C_final : std_logic_vector(9 downto 0); + signal audio_3D_mix : std_logic_vector(9 downto 0); + signal audio_3D_final : std_logic_vector(9 downto 0); + signal audio_final : std_logic_vector(10 downto 0); + + signal security_count : std_logic_vector(2 downto 0); + signal rd_l_t1 : std_logic; + -- filters + signal ym2149_3C_k : std_logic_vector(16 downto 0); + signal ym2149_3D_k : std_logic_vector(16 downto 0); + signal audio_in_m_out_3C : std_logic_vector(17 downto 0); + signal audio_in_m_out_3D : std_logic_vector(17 downto 0); + signal audio_mult_3C : std_logic_vector(35 downto 0); + signal audio_mult_3D : std_logic_vector(35 downto 0); + + + + type array_4of17 is array (3 downto 0) of std_logic_vector(16 downto 0); + constant K_Filter : array_4of17 := ('0' & x"00A3", + '0' & x"00C6", + '0' & x"039D", + '1' & x"0000" ); + + type filter_pipe is array (3 downto 0) of std_logic_vector(17 downto 0); + signal ym2149_3C_audio_pipe : filter_pipe; + signal ym2149_3D_audio_pipe : filter_pipe; + -- LP filter out = in.k + out_t1.(1-k) + -- + -- = (in-out_t1).k + out_t1 + -- + -- using + -- -(Ts.2.PI.Fc) + -- k = 1-e + -- + -- sampling freq = 1.79 MHz + -- + -- cut off freqs bit 0 1 + -- + --0.267uf ~ 713 Hz 1 1 0.00249996 x 00A3 + --0.220uf ~ 865 Hz 1 0 0.00303210 x 00C6 + --0.047uf ~ 4050 Hz 0 1 0.01411753 x 039D + -- 0 0 x10000 + +begin + -- scramble + --0000-1fff ROM + --8000-83ff RAM + + -- frogger + --0000-17ff ROM + --4000-43ff RAM + + cpu_ena <= '1'; -- run at audio clock speed + -- other cpu signals + cpu_busrq_l <= '1'; + cpu_nmi_l <= '1'; + cpu_wait_l <= '1'; + -- + cpu_ena_gated <= ENA_1_79 and cpu_ena; + u_cpu : entity work.T80sed + port map ( + RESET_n => I_RESET_L, + CLK_n => CLK, + CLKEN => cpu_ena_gated, + WAIT_n => cpu_wait_l, + INT_n => cpu_int_l, + NMI_n => cpu_nmi_l, + BUSRQ_n => cpu_busrq_l, + M1_n => cpu_m1_l, + MREQ_n => cpu_mreq_l, + IORQ_n => cpu_iorq_l, + RD_n => cpu_rd_l, + WR_n => cpu_wr_l, + RFSH_n => cpu_rfsh_l, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_data_in, + DO => cpu_data_out + ); + + p_cpu_int : process(CLK, I_RESET_L) + begin + if (I_RESET_L = '0') then + cpu_int_l <= '1'; + sint_t1 <= '0'; + elsif rising_edge(CLK) then + if (ENA_1_79 = '1') then + sint_t1 <= sint; + + if (cpu_m1_l = '0') and (cpu_iorq_l = '0') then + cpu_int_l <= '1'; + elsif (sint = '0') and (sint_t1 = '1') then + cpu_int_l <= '0'; + end if; + end if; + end if; + end process; + + p_mem_decode_comb : process(cpu_rfsh_l, cpu_wr_l, cpu_rd_l, cpu_mreq_l, cpu_addr, I_HWSEL_FROGGER) + variable decode : std_logic; + begin + if not I_HWSEL_FROGGER then + decode := '0'; + if (cpu_rfsh_l = '1') and (cpu_mreq_l = '0') and (cpu_addr(15) = '1') then + decode := '1'; + end if; + + filter_load <= decode and cpu_addr(12) and (not cpu_wr_l); + ram_cs <= decode and (not cpu_addr(12)); + else + decode := '0'; + if (cpu_rfsh_l = '1') and (cpu_mreq_l = '0') and (cpu_addr(14) = '1') then + decode := '1'; + end if; + + filter_load <= decode and cpu_addr(13) and (not cpu_wr_l); + ram_cs <= decode and (not cpu_addr(13)); + end if; + + rom_oe <= '0'; + if not I_HWSEL_FROGGER then + if (cpu_addr(15) = '0') and (cpu_mreq_l = '0') and (cpu_rd_l = '0') then + rom_oe <= '1'; + end if; + else + if (cpu_addr(14) = '0') and (cpu_mreq_l = '0') and (cpu_rd_l = '0') then + rom_oe <= '1'; + end if; + end if; + + end process; + + u_rom_5c : entity work.ROM_SND_0 + port map ( + CLK => CLK, + ADDR => cpu_addr(10 downto 0), + DATA => cpu_rom0_dout + ); + + u_rom_5d : entity work.ROM_SND_1 + port map ( + CLK => CLK, + ADDR => cpu_addr(10 downto 0), + DATA => cpu_rom1_dout + ); + + --u_rom_5e : entity work.ROM_SND_2 + -- port map ( + -- CLK => CLK, + -- ADDR => cpu_addr(10 downto 0), + -- DATA => cpu_rom2_dout + -- ); + + p_rom_mux : process(I_HWSEL_FROGGER, cpu_rom0_dout, cpu_rom1_dout, cpu_rom2_dout, cpu_addr, rom_oe) + variable rom_oe_decode : std_logic; + variable cpu_rom0_dout_s : std_logic_vector(7 downto 0); + begin + if not I_HWSEL_FROGGER then + cpu_rom0_dout_s := cpu_rom0_dout; + else -- swap bits 0 and 1 + cpu_rom0_dout_s := cpu_rom0_dout(7 downto 2) & cpu_rom0_dout(0) & cpu_rom0_dout(1); + end if; + + rom_dout <= (others => '0'); + rom_oe_decode := '0'; + case cpu_addr(13 downto 11) is + when "000" => rom_dout <= cpu_rom0_dout_s; rom_oe_decode := '1'; + when "001" => rom_dout <= cpu_rom1_dout; rom_oe_decode := '1'; + when "010" => rom_dout <= cpu_rom2_dout; rom_oe_decode := '1'; + when others => null; + end case; + + rom_active <= '0'; + if (rom_oe = '1') then + rom_active <= rom_oe_decode; + end if; + end process; + + u_ram_6c_6d : work.dpram generic map (10,8) + port map + ( + addr_a_i => cpu_addr(9 downto 0), + data_a_i => cpu_data_out, + clk_b_i => clk, + addr_b_i => cpu_addr(9 downto 0), + data_b_o => ram_dout, + we_i => ram_cs and (not cpu_wr_l), + en_a_i => ENA_1_79, + clk_a_i => clk + ); + + p_cpu_data_mux : process(rom_dout, rom_active, ram_dout, ym2149_3C_oe_l, ym2149_3C_dv, ym2149_3D_oe_l, ym2149_3D_dv, ram_cs, cpu_wr_l) + begin + if (rom_active = '1') then + cpu_data_in <= rom_dout; + elsif (ram_cs = '1') and (cpu_wr_l = '1') then + cpu_data_in <= ram_dout; + elsif (ym2149_3C_oe_l = '0') then + cpu_data_in <= ym2149_3C_dv; + elsif (ym2149_3D_oe_l = '0') then + cpu_data_in <= ym2149_3D_dv; + else + cpu_data_in <= (others => '1'); -- float high + end if; + end process; + + p_filter_reg : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + if (filter_load = '1') then + filter_reg <= cpu_addr(11 downto 0); + end if; + end if; + end process; + + p_8255_decode : process(I_RESET_L, I_ADDR, I_HWSEL_FROGGER) + begin + reset <= not I_RESET_L; + i8255_1D_cs_l <= '1'; + i8255_1E_cs_l <= '1'; + + if not I_HWSEL_FROGGER then + -- the interface one + if (I_ADDR(9) = '1') and (I_ADDR(15) = '1') then + i8255_1D_cs_l <= '0'; + end if; + + -- the button one + if (I_ADDR(8) = '1') and (I_ADDR(15) = '1') then + i8255_1E_cs_l <= '0'; + end if; + i8255_addr <= I_ADDR(1 downto 0); + else + -- the interface one + if (I_ADDR(12) = '1') and (I_ADDR(15 downto 14) = "11") then + i8255_1D_cs_l <= '0'; + end if; + + -- the button one + if (I_ADDR(13) = '1') and (I_ADDR(15 downto 14) = "11") then + i8255_1E_cs_l <= '0'; + end if; + i8255_addr <= I_ADDR(2 downto 1); + end if; + end process; + + p_ym_decode : process(cpu_rd_l, cpu_wr_l, cpu_iorq_l, cpu_addr, I_HWSEL_FROGGER) + variable rd_3c : std_logic; + variable wr_3c : std_logic; + variable ad_3c : std_logic; + -- + variable rd_3d : std_logic; + variable wr_3d : std_logic; + variable ad_3d : std_logic; + begin + + --bdir bc2 bc1 + -- 0 0 0 nop + -- 0 0 1 addr latch < WR_L AV4 / AV6 + -- 0 1 0 nop + -- 0 1 1 data read < RD_L AV5 / AV7 + + -- 1 0 0 addr latch + -- 1 0 1 nop + -- 1 1 0 data write < WR_L AV5 / AV7 + -- 1 1 1 addr latch + + + if not I_HWSEL_FROGGER then + rd_3c := (not cpu_rd_l) and (not cpu_iorq_l) and cpu_addr(5); + wr_3c := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(5); + ad_3c := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(4); + else + rd_3c := '0'; + wr_3c := '0'; + ad_3c := '0'; + end if; + + ym2149_3C_bdir <= wr_3c; + ym2149_3C_bc2 <= rd_3c or wr_3c; + ym2149_3C_bc1 <= rd_3c or ad_3c; + + + if not I_HWSEL_FROGGER then + rd_3d := (not cpu_rd_l) and (not cpu_iorq_l) and cpu_addr(7); + wr_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(7); + ad_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(6); + else + rd_3d := (not cpu_rd_l) and (not cpu_iorq_l) and cpu_addr(6); + wr_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(6); + ad_3d := (not cpu_wr_l) and (not cpu_iorq_l) and cpu_addr(7); + end if; + + ym2149_3D_bdir <= wr_3d; + ym2149_3D_bc2 <= rd_3d or wr_3d; + ym2149_3D_bc1 <= rd_3d or ad_3d; + + end process; + + i8255_1E_pa(7) <= I_COIN1; + i8255_1E_pa(6) <= I_COIN2; + i8255_1E_pa(5) <= I_1P_CTRL(3); -- left + i8255_1E_pa(4) <= I_1P_CTRL(2); -- right + i8255_1E_pa(3) <= I_1P_CTRL(4); -- shoot1 + i8255_1E_pa(2) <= I_SERVICE; + i8255_1E_pa(1) <= I_1P_CTRL(5); -- shoot2 + i8255_1E_pa(0) <= I_2P_CTRL(1); -- up + + i8255_1E_pb(7) <= I_1P_CTRL(6); -- start + i8255_1E_pb(6) <= I_2P_CTRL(6); -- start + i8255_1E_pb(5) <= I_2P_CTRL(3); -- left + i8255_1E_pb(4) <= I_2P_CTRL(2); -- right + i8255_1E_pb(3) <= I_2P_CTRL(4); -- shoot1 + i8255_1E_pb(2) <= I_2P_CTRL(5); -- shoot2 + i8255_1E_pb(1) <= I_DIP(1); + i8255_1E_pb(0) <= I_DIP(2); + + i8255_1E_pc(7) <= net_1e10_i; + i8255_1E_pc(6) <= I_1P_CTRL(0); -- down + i8255_1E_pc(5) <= net_1e12_i; + i8255_1E_pc(4) <= I_1P_CTRL(1); -- up + i8255_1E_pc(3) <= I_DIP(3); + i8255_1E_pc(2) <= I_DIP(4); + i8255_1E_pc(1) <= I_DIP(5); + i8255_1E_pc(0) <= I_2P_CTRL(0); -- down + O_COIN_COUNTER <= not I_IOPC7; -- open drain actually + + -- + -- PIA CHIPS + -- + u_i8255_1D : entity work.I82C55 -- bus interface + port map ( + I_ADDR => i8255_addr, + I_DATA => I_DATA, + O_DATA => i8255_1D_data, + O_DATA_OE_L => i8255_1D_data_oe_l, + + I_CS_L => i8255_1D_cs_l, + I_RD_L => I_RD_L, + I_WR_L => I_WR_L, + + I_PA => i8255_1D_pa_out, + O_PA => i8255_1D_pa_out, + O_PA_OE_L => open, + + I_PB => i8255_1D_pb_out, + O_PB => i8255_1D_pb_out, + O_PB_OE_L => open, + + I_PC => xbo, + O_PC => xb, + O_PC_OE_L => open, + + RESET => reset, + ENA => ENA, + CLK => CLK + ); + + u_i8255_1E : entity work.I82C55 -- push button + port map ( + I_ADDR => i8255_addr, + I_DATA => I_DATA, + O_DATA => i8255_1E_data, + O_DATA_OE_L => i8255_1E_data_oe_l, + + I_CS_L => i8255_1E_cs_l, + I_RD_L => I_RD_L, + I_WR_L => I_WR_L, + + I_PA => i8255_1E_pa, + O_PA => open, + O_PA_OE_L => open, + + I_PB => i8255_1E_pb, + O_PB => open, + O_PB_OE_L => open, + + I_PC => i8255_1E_pc, + O_PC => open, + O_PC_OE_L => open, + + RESET => reset, + ENA => ENA, + CLK => CLK + ); + + p_i8255_1d_bus_control : process(i8255_1D_pa_out, i8255_1D_pb_out, ym2149_3D_ioa_out, ym2149_3D_ioa_oe_l) + begin + if (ym2149_3D_ioa_oe_l = '0') then + ym2149_3D_ioa_in <= ym2149_3D_ioa_out; + else + ym2149_3D_ioa_in <= i8255_1D_pa_out; + end if; + + ampm <= i8255_1D_pb_out(4); -- amp mute + sint <= i8255_1D_pb_out(3); -- set int + end process; + + p_drive_cpubus : process(i8255_1D_data, i8255_1D_data_oe_l, i8255_1E_data, i8255_1E_data_oe_l) + begin + O_DATA_OE_L <= '1'; + O_DATA <= (others => '0'); + -- + if (i8255_1D_data_oe_l = '0') then + -- + O_DATA_OE_L <= '0'; + O_DATA <= i8255_1D_data; + elsif (i8255_1E_data_oe_l = '0') then + -- + O_DATA_OE_L <= '0'; + O_DATA <= i8255_1E_data; + end if; + end process; + -- + -- AUDIO CHIPS + -- + p_audio_clockgen : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + audio_div_cnt <= audio_div_cnt - "1"; + ls90_clk <= not audio_div_cnt(8); + + if (audio_div_cnt(8 downto 0) = "000000000") then + if (ls90_cnt = x"9") then + ls90_cnt <= x"0"; + else + ls90_cnt <= ls90_cnt + "1"; + end if; + end if; + + ls90_op <= "0000"; + case ls90_cnt is --ls90 outputs DCBA + when x"0" => ls90_op <= "0000"; + when x"1" => ls90_op <= "0010"; + when x"2" => ls90_op <= "0100"; + when x"3" => ls90_op <= "0110"; + when x"4" => ls90_op <= "1000"; + when x"5" => ls90_op <= "0001"; + when x"6" => ls90_op <= "0011"; + when x"7" => ls90_op <= "0101"; + when x"8" => ls90_op <= "0111"; + when x"9" => ls90_op <= "1001"; + when others => ls90_op <= "0000"; + end case; + end if; + end process; + + p_ym2149_3d_iob_in : process(I_HWSEL_FROGGER, ls90_op, ls90_clk) + begin + if not I_HWSEL_FROGGER then + ym2149_3D_iob_in <= ls90_op(0) & ls90_op(3) & ls90_op(2) & ls90_clk & "1110"; + else + ym2149_3D_iob_in <= ls90_op(0) & ls90_op(3) & '1' & ls90_clk & ls90_op(2) & "110"; + end if; + end process; + + u_ym2149_3C : entity work.YM2149 -- not used for frogger + port map ( + -- data bus + I_DA => cpu_data_out, + O_DA => ym2149_3C_dv, + O_DA_OE_L => ym2149_3C_oe_l, + -- control + I_A9_L => '0', + I_A8 => '1', + I_BDIR => ym2149_3C_bdir, + I_BC2 => ym2149_3C_bc2, + I_BC1 => ym2149_3C_bc1, + I_SEL_L => '1', + + O_AUDIO => ym2149_3C_audio, + O_CHAN => ym2149_3C_chan, + -- port a + I_IOA => "11111111", + O_IOA => open, + O_IOA_OE_L => open, + -- port b + I_IOB => "11111111", + O_IOB => open, + O_IOB_OE_L => open, + + ENA => ENA_1_79, + RESET_L => I_RESET_L, + CLK => CLK + ); + + u_ym2149_3D : entity work.YM2149 + port map ( + -- data bus + I_DA => cpu_data_out, + O_DA => ym2149_3D_dv, + O_DA_OE_L => ym2149_3D_oe_l, + -- control + I_A9_L => '0', + I_A8 => '1', + I_BDIR => ym2149_3D_bdir, + I_BC2 => ym2149_3D_bc2, + I_BC1 => ym2149_3D_bc1, + I_SEL_L => '1', + + O_AUDIO => ym2149_3D_audio, + O_CHAN => ym2149_3D_chan, + -- port a + I_IOA => ym2149_3D_ioa_in, + O_IOA => ym2149_3D_ioa_out, + O_IOA_OE_L => ym2149_3D_ioa_oe_l, + -- port b + I_IOB => ym2149_3D_iob_in, + O_IOB => open, + O_IOB_OE_L => open, + + ENA => ENA_1_79, + RESET_L => I_RESET_L, + CLK => CLK + ); + + p_filter_coef : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + case ym2149_3C_chan is -- -1 as reg here + when "00" => -- chan 3 + ym2149_3C_k <= (others => '0'); + when "11" => -- chan 2 + ym2149_3C_k <= K_FILTER(conv_integer(filter_reg(5 downto 4))); + when "10" => -- chan 1 + ym2149_3C_k <= K_FILTER(conv_integer(filter_reg(3 downto 2))); + when "01" => -- chan 0 + ym2149_3C_k <= K_FILTER(conv_integer(filter_reg(1 downto 0))); + when others => null; + end case; + + case ym2149_3D_chan is -- -1 as reg here + when "00" => -- chan 3 + ym2149_3D_k <= (others => '0'); + when "11" => -- chan 2 + ym2149_3D_k <= K_FILTER(conv_integer(filter_reg(11 downto 10))); + when "10" => -- chan 1 + ym2149_3D_k <= K_FILTER(conv_integer(filter_reg( 9 downto 8))); + when "01" => -- chan 0 + ym2149_3D_k <= K_FILTER(conv_integer(filter_reg( 7 downto 6))); + when others => null; + end case; + end if; + end process; + + + p_ym2149_audio_process : process(ym2149_3C_audio, ym2149_3C_audio_pipe, ym2149_3D_audio, ym2149_3D_audio_pipe) + begin + audio_in_m_out_3C <= (('0' & ym2149_3C_audio & "000000000"))- ym2149_3C_audio_pipe(3); -- signed + audio_in_m_out_3D <= (('0' & ym2149_3D_audio & "000000000"))- ym2149_3D_audio_pipe(3); -- signed + end process; + + mult_3C : work.MULT18X18 + port map + ( + P => audio_mult_3C,-- 35..0 -- audio 8bit on 32..25 33 sign bit, + A => audio_in_m_out_3C, --17..0 + B(17) => '0', + B(16 downto 0) => ym2149_3C_k + ); + + mult_3D : work.MULT18X18 + port map + ( + P => audio_mult_3D,-- 35..0 -- audio 8bit on 32..25 33 sign bit, + A => audio_in_m_out_3D, --17..0 + B(17) => '0', + B(16 downto 0) => ym2149_3D_k + ); + + p_ym2149_audio_pipe : process(I_RESET_L, CLK) + begin + if (I_RESET_L = '0') then + ym2149_3C_audio_pipe <= (others => (others => '0')); + ym2149_3D_audio_pipe <= (others => (others => '0')); + elsif rising_edge(CLK) then +-- audio_mult_3C <= audio_in_m_out_3C * ym2149_3C_k; +-- audio_mult_3D <= audio_in_m_out_3D * ym2149_3D_k; + if (ENA_1_79 = '1') then + -- we need some holding registers anyway, so lets just make it a shift and save a mux + ym2149_3C_audio_pipe(3 downto 1) <= ym2149_3C_audio_pipe(2 downto 0); + ym2149_3C_audio_pipe(0) <= audio_mult_3C(33 downto 16) + ym2149_3C_audio_pipe(3); -- bit 33 sign + + ym2149_3D_audio_pipe(3 downto 1) <= ym2149_3D_audio_pipe(2 downto 0); + ym2149_3D_audio_pipe(0) <= audio_mult_3D(33 downto 16) + ym2149_3D_audio_pipe(3); -- bit 33 sign + end if; + end if; + end process; + + p_ym2149_audio_mix : process + begin + wait until rising_edge(CLK); + if (ENA_1_79 = '1') then + ym2149_3C_chan_t1 <= ym2149_3C_chan; + ym2149_3D_chan_t1 <= ym2149_3D_chan; + + if (ym2149_3C_chan_t1 = "11") then + audio_3C_mix <= (others => '0'); + audio_3C_final <= audio_3C_mix; + else + audio_3C_mix <= audio_3C_mix + ("00" & ym2149_3C_audio_pipe(0)(16 downto 9)); + end if; + + if (ym2149_3D_chan_t1(1 downto 0) = "11") then + audio_3D_mix <= (others => '0'); + audio_3D_final <= audio_3D_mix; + else + audio_3D_mix <= audio_3D_mix + ("00" & ym2149_3D_audio_pipe(0)(16 downto 9)); + end if; + + audio_final <= ('0' & audio_3C_final) + ('0' & audio_3D_final); + end if; + end process; + + p_audio_out : process(CLK, I_RESET_L) + begin + if (I_RESET_L = '0') then + O_AUDIO <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA_1_79 = '1') then + if (ampm = '1') then + O_AUDIO <= (others => '0'); + else + if (audio_final(10) = '1') then + O_AUDIO <= (others => '1'); + else + O_AUDIO <= audio_final(9 downto 0); + end if; + end if; + end if; + end if; + end process; + + p_security_6J : process(xb) + begin + -- chip K10A PAL16L8 + -- equations from Mark @ http://www.leopardcats.com/ + xbo(3 downto 0) <= xb(3 downto 0); + xbo(4) <= not(xb(0) or xb(1) or xb(2) or xb(3)); + xbo(5) <= not((not xb(2) and not xb(0)) or (not xb(2) and not xb(1)) or (not xb(3) and not xb(0)) or (not xb(3) and not xb(1))); + + xbo(6) <= not(not xb(0) and not xb(3)); + xbo(7) <= not((not xb(1)) or xb(2)); + end process; + + p_security_count : process(CLK, I_RESET_L) + begin + if (I_RESET_L = '0') then + security_count <= "000"; + elsif rising_edge(CLK) then + rd_l_t1 <= i_rd_l; + if (I_ADDR = x"8102") and (I_RD_L = '0') and (rd_l_t1 = '1') then + security_count <= security_count + "1"; + end if; + end if; + end process; + + p_security_2B : process(security_count) + begin + -- I am not sure what this chip does yet, but this gets us past the initial check for now. + case security_count is + when "000" => net_1e10_i <= '0'; net_1e12_i <= '1'; + when "001" => net_1e10_i <= '0'; net_1e12_i <= '1'; + when "010" => net_1e10_i <= '1'; net_1e12_i <= '0'; + when "011" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "100" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "101" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "110" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when "111" => net_1e10_i <= '1'; net_1e12_i <= '1'; + when others => null; + end case; + end process; + +end RTL; \ No newline at end of file diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scramble_top.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scramble_top.vhd new file mode 100644 index 00000000..d0e257bb --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scramble_top.vhd @@ -0,0 +1,240 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE_TOP is +port ( + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(2 downto 0); + O_HSYNC : out std_logic; + O_VSYNC : out std_logic; + O_HBLANK : out std_logic; + O_VBLANK : out std_logic; + + O_AUDIO : out std_logic_vector(9 downto 0); + + button_in : in std_logic_vector(7 downto 0); + + RESET : in std_logic; + clk : in std_logic; -- 25 + ena_star : in std_logic; + ena_6 : in std_logic; -- 6.25 + ena_1_79 : in std_logic -- 1.786 +); +end; + +architecture RTL of SCRAMBLE_TOP is +-- this MUST be set true for frogger +-- this MUST be set false for scramble, the_end, amidar +constant I_HWSEL_FROGGER : boolean := false; + +-- ip registers +signal ip_1p : std_logic_vector(6 downto 0); +signal ip_2p : std_logic_vector(6 downto 0); +signal ip_service : std_logic; +signal ip_coin1 : std_logic; +signal ip_coin2 : std_logic; +signal ip_dip_switch : std_logic_vector(5 downto 1); + +-- ties to audio board +signal audio_addr : std_logic_vector(15 downto 0); +signal audio_data_out : std_logic_vector(7 downto 0); +signal audio_data_in : std_logic_vector(7 downto 0); +signal audio_data_oe_l : std_logic; +signal audio_rd_l : std_logic; +signal audio_wr_l : std_logic; +signal audio_iopc7 : std_logic; +signal audio_reset_l : std_logic; + +begin + +u_scramble : entity work.SCRAMBLE +port map ( + I_HWSEL_FROGGER => I_HWSEL_FROGGER, + -- + O_VIDEO_R => O_VIDEO_R, + O_VIDEO_G => O_VIDEO_G, + O_VIDEO_B => O_VIDEO_B, + O_HSYNC => O_HSYNC, + O_VSYNC => O_VSYNC, + O_HBLANK => O_HBLANK, + O_VBLANK => O_VBLANK, + -- + -- to audio board + -- + O_ADDR => audio_addr, + O_DATA => audio_data_out, + I_DATA => audio_data_in, + I_DATA_OE_L => audio_data_oe_l, + O_RD_L => audio_rd_l, + O_WR_L => audio_wr_l, + O_IOPC7 => audio_iopc7, + O_RESET_WD_L => audio_reset_l, + -- + ENA => ena_6, + ENA_STAR => ena_star, + -- + RESET => reset, + CLK => clk +); + +-- +-- +-- audio subsystem +-- +u_audio : entity work.SCRAMBLE_AUDIO +port map ( + I_HWSEL_FROGGER => I_HWSEL_FROGGER, + -- + I_ADDR => audio_addr, + I_DATA => audio_data_out, + O_DATA => audio_data_in, + O_DATA_OE_L => audio_data_oe_l, + -- + I_RD_L => audio_rd_l, + I_WR_L => audio_wr_l, + I_IOPC7 => audio_iopc7, + -- + O_AUDIO => O_AUDIO, + -- + I_1P_CTRL => ip_1p, -- start, shoot1, shoot2, left,right,up,down + I_2P_CTRL => ip_2p, -- start, shoot1, shoot2, left,right,up,down + I_SERVICE => ip_service, + I_COIN1 => ip_coin1, + I_COIN2 => ip_coin2, + O_COIN_COUNTER => open, + -- + I_DIP => ip_dip_switch, + -- + I_RESET_L => audio_reset_l, + ENA => ena_6, + ENA_1_79 => ena_1_79, + CLK => clk +); + +--button_in(0) = Joystick Up +--button_in(1) = Joystick Down +--button_in(2) = Joystick Left +--button_in(3) = Joystick Right +--button_in(4) = Button Left +--button_in(5) = Button Down +--button_in(6) = Joystick Fire +--button_in(7) = Button Right + +--Buttons are connected to ground and connect to 3.3V when pressed +--Joystick has internal pullup resistor and connects to ground when pressed + +--A '0' on the input is active. Inputs are active low. + +-- assign inputs +-- start, shoot1, shoot2, left,right,up,down +ip_1p(6) <= button_in(4); -- start 1 +ip_1p(5) <= button_in(6); -- shoot1 +ip_1p(4) <= button_in(6); -- shoot2 +ip_1p(3) <= button_in(2); -- p1 left +ip_1p(2) <= button_in(3); -- p1 right +ip_1p(1) <= button_in(0); -- p1 up +ip_1p(0) <= button_in(1); -- p1 down +-- +ip_2p(6) <= button_in(7); -- start 2 +ip_2p(5) <= button_in(6); +ip_2p(4) <= button_in(6); +ip_2p(3) <= button_in(2); -- p2 left +ip_2p(2) <= button_in(3); -- p2 right +ip_2p(1) <= button_in(0); -- p2 up +ip_2p(0) <= button_in(1); -- p2 down +-- +ip_service <= '1'; +ip_coin1 <= button_in(5); -- credit +ip_coin2 <= '1'; + +-- dip switch settings +scramble_dips : if (not I_HWSEL_FROGGER) generate +begin + --SW #1 SW #2 Rockets SW #3 Cabinet + ------- ----- --------- ----- -------- + --OFF OFF Unlimited OFF Table + --OFF ON 5 ON Up Right + --ON OFF 4 + --ON ON 3 + + + --SW #4 SW #5 Coins/Play + ------- ----- ---------- + --OFF OFF 4 + --OFF ON 3 + --ON OFF 2 + --ON ON 1 + + ip_dip_switch(5 downto 4) <= not "11"; -- 1 play/coin. + ip_dip_switch(3) <= not '1'; + ip_dip_switch(2 downto 1) <= not "10"; +end generate; + +frogger_dips : if ( I_HWSEL_FROGGER) generate +begin + --1 2 3 4 5 Meaning + ------------------------------------------------------- + --On On 3 Frogs + --On Off 5 Frogs + --Off On 7 Frogs + --Off Off 256 Frogs (!) + -- + -- On Upright unit + -- Off Cocktail unit + -- + -- On On 1 coin 1 play + -- On Off 2 coins 1 play + -- Off On 3 coins 1 play + -- Off Off 1 coin 2 plays + + ip_dip_switch(5 downto 4) <= not "11"; + ip_dip_switch(3) <= not '1'; + ip_dip_switch(2 downto 1) <= not "01"; +end generate; + +end RTL; \ No newline at end of file diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scramble_video.vhd b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scramble_video.vhd new file mode 100644 index 00000000..f6fd981a --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/scramble_video.vhd @@ -0,0 +1,848 @@ +-- +-- A simulation model of Scramble hardware +-- Copyright (c) MikeJ - Feb 2007 +-- +-- 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 CODE 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. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity SCRAMBLE_VIDEO is + port ( + I_HWSEL_FROGGER : in boolean; + -- + I_HCNT : in std_logic_vector(8 downto 0); + I_VCNT : in std_logic_vector(8 downto 0); + I_VBLANK : in std_logic; + I_VSYNC : in std_logic; + + I_VCMA : in std_logic; + I_HCMA : in std_logic; + -- + I_CPU_ADDR : in std_logic_vector(15 downto 0); + I_CPU_DATA : in std_logic_vector(7 downto 0); + O_VRAM_DATA : out std_logic_vector(7 downto 0); + -- note, looks like the real hardware cannot read from object ram + -- + I_VRAMWR_L : in std_logic; + I_VRAMRD_L : in std_logic; + I_OBJRAMWR_L : in std_logic; + I_OBJRAMRD_L : in std_logic; + I_OBJEN_L : in std_logic; + -- + I_STARSON : in std_logic; + I_POUT1 : in std_logic; + -- + O_VIDEO_R : out std_logic_vector(2 downto 0); + O_VIDEO_G : out std_logic_vector(2 downto 0); + O_VIDEO_B : out std_logic_vector(2 downto 0); + -- + ENA : in std_logic; + ENA_STAR : in std_logic; + CLK : in std_logic + ); +end; + +-- chars stars vidout? shell/missile +-- +-- 220R B 100 B 390R B 100R R +-- 470R B 150 B 100R G +-- 220R G 100 G blue ? +-- 470R G 150 G +-- 1K G 100 R +-- 220R R 150 R +-- 470R R +-- 1K R +architecture RTL of SCRAMBLE_VIDEO is + + type array_3x5 is array (2 downto 0) of std_logic_vector(2 downto 0); + -- timing + signal ld : std_logic; + signal h256_l : std_logic; + signal h256 : std_logic; + signal cblank_s : std_logic; + signal hcmp1_s : std_logic; + signal hcmp2_s : std_logic; + signal hcmp1 : std_logic; + signal hcmp2 : std_logic; + signal cblank_l : std_logic; + signal h256_l_s : std_logic; + signal hcnt_f : std_logic_vector(7 downto 0); + signal vcnt_f : std_logic_vector(7 downto 0); + + -- load strobes + signal vpl_load : std_logic; + signal col_load : std_logic; + signal objdata_load : std_logic; + signal missile_load : std_logic; + signal missile_reg_l : std_logic; + + signal cntr_clr : std_logic; + signal cntr_load : std_logic; + signal sld_l : std_logic; + signal mld_l : std_logic; + + -- video ram + signal vram_addr_sum : std_logic_vector(8 downto 0); -- extra bit for debug + signal msld_l : std_logic; + signal vram_addr_reg : std_logic_vector(7 downto 0); + signal vram_addr_xor : std_logic_vector(3 downto 0); + signal vram_addr : std_logic_vector(9 downto 0); + signal vram_dout : std_logic_vector(7 downto 0); + signal ldout : std_logic; + + -- object ram + signal obj_addr : std_logic_vector(7 downto 0); + signal hpla : std_logic_vector(7 downto 0); + signal objdata : std_logic_vector(7 downto 0); + + signal obj_rom_addr : std_logic_vector(10 downto 0); + signal obj_rom_0_dout : std_logic_vector(7 downto 0); + signal obj_rom_1_dout : std_logic_vector(7 downto 0); + -- + signal col_reg : std_logic_vector(2 downto 0); + signal cd : std_logic_vector(2 downto 0); + + signal shift_reg_1 : std_logic_vector(7 downto 0); + signal shift_reg_0 : std_logic_vector(7 downto 0); + signal shift_op : std_logic_vector(1 downto 0); + signal shift_sel : std_logic_vector(1 downto 0); + signal gr : std_logic_vector(1 downto 0); + signal gc : std_logic_vector(2 downto 0); + + signal vid : std_logic_vector(1 downto 0); + signal col : std_logic_vector(2 downto 0); + + signal obj_video_out_reg : std_logic_vector(4 downto 0); + signal vidout_l : std_logic; + signal obj_lut_out : std_logic_vector(7 downto 0); + + signal cntr_addr : std_logic_vector(7 downto 0); + signal cntr_addr_xor : std_logic_vector(10 downto 0); + signal sprite_sel : std_logic; + signal sprite_ram_ip : std_logic_vector(7 downto 0); + signal sprite_ram_waddr : std_logic_vector(10 downto 0); + signal sprite_ram_op : std_logic_vector(7 downto 0); + -- shell + signal shell_cnt : std_logic_vector(7 downto 0); + signal shell_ena : std_logic; + signal shell : std_logic; + signal shell_reg : std_logic; + -- missile + signal missile_cnt : std_logic_vector(7 downto 0); + signal missile_ena : std_logic; + signal missile : std_logic; + signal missile_reg : std_logic; + -- stars + signal star_r : std_logic_vector(1 downto 0); + signal star_g : std_logic_vector(1 downto 0); + signal star_b : std_logic_vector(1 downto 0); + -- frogger blue bar + signal frogger_blue_reg : std_logic; + signal frogger_blue : std_logic; + signal frogger_blue_out_reg : std_logic; + -- scramble blue + signal pout1_reg : std_logic; + + +begin + p_hcnt_decode : process(I_HCNT) + begin + ld <= '0'; + if (I_HCNT(2 downto 0) = "111") then + ld <= '1'; + end if; + h256_l <= I_HCNT(8); + h256 <= not I_HCNT(8); + + end process; + + p_timing_decode : process(h256, h256_l, I_HCMA, I_VBLANK) + begin + cblank_s <= not (I_VBLANK or h256); -- active low + hcmp1_s <= h256_l and I_HCMA; + end process; + + p_reg : process + begin + wait until rising_edge(CLK); + + if (ENA = '1') then + if (ld = '1') then + hcmp1 <= hcmp1_s; + hcmp2 <= hcmp2_s; + cblank_l <= cblank_s; + h256_l_s <= h256_l; + + if not I_HWSEL_FROGGER then + cd <= col_reg; + else + cd <= col_reg(0) & col_reg(2 downto 1); + end if; + end if; + end if; + end process; + + p_load_decode : process(ld, I_HCNT, h256) + variable obj_load : std_logic; + begin + vpl_load <= '0'; + obj_load := '0'; + col_load <= '0'; + + if (I_HCNT(2 downto 0) = "001") then vpl_load <= '1'; end if; -- 1 clock later + if (I_HCNT(2 downto 0) = "011") then obj_load := '1'; end if; -- 1 later + if (I_HCNT(2 downto 0) = "101") then col_load <= '1'; end if; -- 1 later + + objdata_load <= obj_load and h256 and (not I_HCNT(3)); + missile_load <= obj_load and h256 and ( I_HCNT(3)); + + cntr_clr <= ld and (not h256) and (not I_HCNT(3)); + cntr_load <= ld and ( h256) and (not I_HCNT(3)); + + end process; + + p_hv_flip : process(I_HCNT, I_VCNT, I_VCMA, hcmp1_s) + begin + for i in 0 to 7 loop + vcnt_f(i) <= I_VCNT(i) xor I_VCMA; + hcnt_f(i) <= I_HCNT(i) xor hcmp1_s; + end loop; + end process; + + p_video_addr_calc : process(I_HWSEL_FROGGER, vcnt_f, hpla) + begin + if not I_HWSEL_FROGGER then + vram_addr_sum <= ('0' & vcnt_f(7 downto 0)) + ('0' & hpla(7 downto 0)); + else + vram_addr_sum <= ('0' & vcnt_f(7 downto 0)) + ('0' & hpla(3 downto 0) & hpla(7 downto 4)); + end if; + end process; + + p_msld : process(vram_addr_sum) + begin + msld_l <= '1'; + if (vram_addr_sum(7 downto 0) = "11111111") then + msld_l <= '0'; + end if; + end process; + + p_video_addr_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (I_VBLANK = '1') then -- was async + vram_addr_reg <= x"00"; + elsif (vpl_load = '1') then -- vpl_l + vram_addr_reg <= vram_addr_sum(7 downto 0); + end if; + end if; + end process; + + p_vram_xor : process(vram_addr_reg, objdata, h256) + variable flip : std_logic; + begin + flip := objdata(7) and h256; + for i in 0 to 3 loop + vram_addr_xor(i) <= vram_addr_reg(i) xor flip; + end loop; + end process; + + p_vram_addr : process(vram_addr_reg, cblank_s, ld, I_CPU_ADDR, vram_addr_xor, hcnt_f) + variable match : std_logic; + begin + match := '0'; + if (vram_addr_reg(7 downto 4) = "1111") then + match := '1'; + end if; + + if (cblank_s = '0') then + ldout <= match and ld; -- blanking, sprites + else + ldout <= ld; + end if; + + if (cblank_s = '0') then -- blanking, sprites + --vram_cs <= (not I_VRAMWR_L) or (not I_VRAMRD_L); + vram_addr <= I_CPU_ADDR(9 downto 0); -- let the cpu in + else + --vram_cs <= '1'; + vram_addr <= vram_addr_reg(7 downto 4) & vram_addr_xor(3) & hcnt_f(7 downto 3); + end if; + end process; + + u_vram : work.dpram generic map (10,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => not I_VRAMWR_L, + + addr_a_i => vram_addr, + data_a_i => I_CPU_DATA, -- only cpu can write + + clk_b_i => clk, + addr_b_i => vram_addr, + data_b_o => vram_dout + ); + O_VRAM_DATA <= vram_dout; + + p_object_ram_addr : process(h256, I_HCMA, objdata, I_HCNT, hcnt_f, I_CPU_ADDR, I_OBJEN_L) + begin + -- I believe the object ram can only be written during vblank + + if (h256 = '0') then + hcmp2_s <= I_HCMA; + else + hcmp2_s <= objdata(6); + end if; + + if (I_OBJEN_L = '0') then + obj_addr <= I_CPU_ADDR(7 downto 0); + else + obj_addr(7) <= '0'; + obj_addr(6) <= h256; + + -- A + if (h256 = '0') then -- normal + obj_addr(5) <= hcnt_f(7); --128h'; + else -- sprite + obj_addr(5) <= hcnt_f(3) and I_HCNT(1);-- 8h' and 2h; + end if; + + obj_addr(4 downto 2) <= hcnt_f(6 downto 4); + + if (h256 = '0') then -- normal + obj_addr(1) <= hcnt_f(3); --8h' + obj_addr(0) <= I_HCNT(2); --4h + else + obj_addr(1) <= I_HCNT(2); --4h + obj_addr(0) <= I_HCNT(1); --2h + end if; + + end if; + end process; + + u_object_ram : work.dpram generic map (8,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => not I_OBJRAMWR_L, + + addr_a_i => obj_addr, + data_a_i => I_CPU_DATA, -- only cpu can write + + clk_b_i => clk, + addr_b_i => obj_addr, + data_b_o => hpla + ); + + p_objdata_regs : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (col_load = '1') then -- colour load + col_reg <= hpla(2 downto 0); + end if; + + if (objdata_load = '1') then -- sprite load + objdata <= hpla; + end if; + + if (I_VBLANK = '1') then -- was async + missile_reg_l <= '1'; + elsif (missile_load = '1') then + missile_reg_l <= msld_l; + end if; + end if; + end process; + + p_obj_rom_addr : process(h256, vram_addr_xor, vram_dout, objdata, I_HCNT) + begin + obj_rom_addr( 2 downto 0) <= vram_addr_xor(2 downto 0); + if (h256 = '0') then + -- a + obj_rom_addr(10 downto 3) <= vram_dout; -- background objects + else + obj_rom_addr(10 downto 3) <= objdata(5 downto 0) & vram_addr_xor(3) & (objdata(6) xor I_HCNT(3)); -- sprites + end if; + end process; + + obj_rom0 : entity work.ROM_OBJ_0 -- 5H + port map (CLK => CLK, ADDR => obj_rom_addr, DATA => obj_rom_0_dout); + obj_rom1 : entity work.ROM_OBJ_1 -- 5F + port map (CLK => CLK, ADDR => obj_rom_addr, DATA => obj_rom_1_dout); + + p_obj_rom_shift : process + variable obj_rom_0_dout_s : std_logic_vector(7 downto 0); + begin + wait until rising_edge (CLK); + if not I_HWSEL_FROGGER then + obj_rom_0_dout_s := obj_rom_0_dout; + else -- swap bits 0 and 1 + obj_rom_0_dout_s := obj_rom_0_dout(7 downto 2) & obj_rom_0_dout(0) & obj_rom_0_dout(1); + end if; + + if (ENA = '1') then + case shift_sel is + when "00" => null; -- do nothing + + when "01" => shift_reg_1 <= '0' & shift_reg_1(7 downto 1); -- right + shift_reg_0 <= '0' & shift_reg_0(7 downto 1); + + when "10" => shift_reg_1 <= shift_reg_1(6 downto 0) & '0'; -- left + shift_reg_0 <= shift_reg_0(6 downto 0) & '0'; + + when "11" => shift_reg_1 <= obj_rom_1_dout (7 downto 0); -- load + shift_reg_0 <= obj_rom_0_dout_s(7 downto 0); + when others => null; + end case; + end if; + end process; + + p_obj_rom_shift_sel : process(hcmp2, ldout, shift_reg_1, shift_reg_0) + begin + if (hcmp2 = '0') then + + shift_sel(1) <= '1'; + shift_sel(0) <= ldout; + shift_op(1) <= shift_reg_1(7); + shift_op(0) <= shift_reg_0(7); + else + + shift_sel(1) <= ldout; + shift_sel(0) <= '1'; + shift_op(1) <= shift_reg_1(0); + shift_op(0) <= shift_reg_0(0); + end if; + end process; + + p_video_out_logic : process(shift_op, cd, gr, gc) + variable vidon : std_logic; + begin + vidon := shift_op(0) or shift_op(1); + + if (gr(1 downto 0) = "00") then + vid(1 downto 0) <= shift_op(1 downto 0); + else + vid(1 downto 0) <= gr(1 downto 0); + end if; + + if (gc(2 downto 0) = "000") and (vidon = '1') then + col(2 downto 0) <= cd(2 downto 0); + else + col(2 downto 0) <= gc(2 downto 0); + end if; + end process; + + p_shell_ld : process(ld, h256, I_HCNT, missile_reg_l) + begin + sld_l <= '1'; + mld_l <= '1'; + if (ld = '1') and (h256 = '1') and (I_HCNT(3) = '1') then --4D:Y3 + if (missile_reg_l = '0') and (I_HCNT(6 downto 3) /= "1111") then -- tweak to mimic galaxian hw ! + sld_l <= '0'; + end if; + + if (missile_reg_l = '0') and (I_HCNT(6 downto 3) = "1111") then -- tweak to mimic galaxian hw ! + mld_l <= '0'; + end if; + + end if; + + end process; + + p_shell_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + if (sld_l = '0') then + shell_cnt <= hpla; + elsif (cblank_l = '1') then + shell_cnt <= shell_cnt + "1"; + else + shell_cnt <= shell_cnt; + end if; + + if (sld_l = '0') then + shell_ena <= '1'; + elsif (shell_cnt = "11111110") then + shell_ena <= '0'; + end if; + end if; + end process; + + p_shell_op : process(shell_cnt, shell_ena) + begin + -- note how T input is from QD on the bottom counter + -- we get a rc from xF8 to XFF + -- so the shell is set at count xFA (rc and bit 1) + shell <= '0'; + if (shell_cnt > x"F8") then -- minus 2 as delay wrong + shell <= shell_ena; + end if; + end process; + + p_missile_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + if (mld_l = '0') then + missile_cnt <= hpla; + elsif (cblank_l = '1') then + missile_cnt <= missile_cnt + "1"; + else + missile_cnt <= missile_cnt; + end if; + + if (mld_l = '0') then + missile_ena <= '1'; + elsif (missile_cnt = "11111110") then + missile_ena <= '0'; + end if; + end if; + end process; + + p_missile_op : process(missile_cnt, missile_ena) + begin + -- note how T input is from QD on the bottom counter + -- we get a rc from xF8 to XFF + -- so the shell is set at count xFA (rc and bit 1) + missile <= '0'; + if (missile_cnt > x"F8") then -- minus 2 as delay wrong + missile <= missile_ena; + end if; + end process; + + p_cntr_cnt : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (cntr_clr = '1') and (h256_l_s = '0') then -- async + cntr_addr <= (others => '0'); + elsif (cntr_load = '1') then + cntr_addr <= hpla(7 downto 0); + else + cntr_addr <= cntr_addr + "1"; + end if; + end if; + end process; + + p_cntr_addr : process(cntr_addr, hcmp1) + begin + cntr_addr_xor(10 downto 8) <= (others => '0'); + for i in 0 to 7 loop + cntr_addr_xor(i) <= cntr_addr(i) xor hcmp1; + end loop; + end process; + + p_sprite_sel : process(h256_l_s, cntr_addr_xor) + begin + sprite_sel <= '0'; + if (h256_l_s = '0') and (cntr_addr_xor(7 downto 4) /= "0000") then + sprite_sel <= '1'; + end if; + end process; + + p_sprite_write : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + -- delay 1 clock + sprite_ram_ip <= (others => '0'); + if (sprite_sel = '1') then + sprite_ram_ip(4 downto 2) <= col(2 downto 0); + sprite_ram_ip(1 downto 0) <= vid(1 downto 0); + end if; + + sprite_ram_waddr <= cntr_addr_xor; + end if; + end process; + + + u_sprite_ram : work.dpram generic map (11,8) + port map + ( + clk_a_i => clk, + en_a_i => ena, + we_i => '1', + + addr_a_i => sprite_ram_waddr, + data_a_i => sprite_ram_ip, + + clk_b_i => clk, + addr_b_i => cntr_addr_xor, + data_b_o => sprite_ram_op + ); + + gc(2 downto 0) <= sprite_ram_op(4 downto 2); + gr(1 downto 0) <= sprite_ram_op(1 downto 0); + + p_video_out_reg : process + variable vidout_l_int : std_logic; + begin + wait until rising_edge(CLK); + -- register all objects to match increased video delay + if (ENA = '1') then + + if (cblank_l = '0') then + -- logic around the clr workes out as a sync reset + obj_video_out_reg <= (others => '0'); + shell_reg <= '0'; + frogger_blue_out_reg <= '0'; + pout1_reg <= '0'; + else + + obj_video_out_reg(4 downto 2) <= col(2 downto 0); + obj_video_out_reg(1 downto 0) <= vid(1 downto 0); + vidout_l <= not(vid(1) or vid(0)); + -- probably wider than the original, we must be a whole 6MHz clock here or the scan-doubler will loose it. + shell_reg <= shell; + missile_reg <= missile; + frogger_blue_out_reg <= frogger_blue; + + pout1_reg <= I_POUT1; + + end if; + end if; + end process; + +-- Non BRAM (LUT) Version +-- col_rom : entity work.ROM_LUT +-- port map( +-- ADDR => obj_video_out_reg(4 downto 0), +-- DATA => obj_lut_out +-- ); + +-- BRAM Version + col_rom : entity work.ROM_LUT + port map( + CLK => CLK, + ADDR => obj_video_out_reg(4 downto 0), + DATA => obj_lut_out + ); + + p_col_rom_ce : process + variable video : array_3x5; + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (vidout_l = '0') then -- cs_l on col rom + video(0)(2 downto 0) := obj_lut_out(7 downto 6) & '0'; -- b + video(1)(2 downto 0) := obj_lut_out(5 downto 3); -- g + video(2)(2 downto 0) := obj_lut_out(2 downto 0); -- r + else + video(0)(2 downto 0) := "000"; + video(1)(2 downto 0) := "000"; + video(2)(2 downto 0) := "000"; + end if; + -- + -- end of direct assigns + -- + if I_HWSEL_FROGGER then + if (frogger_blue_out_reg = '1') and (vidout_l = '1') then + video(0) := video(0) or "010"; + end if; + end if; + + if not I_HWSEL_FROGGER then + if shell_reg = '1' then + video(0) := "110"; -- b + video(1) := "110"; -- g + video(2) := "110"; -- r + elsif missile_reg = '1' then + video(0) := "110"; -- b + video(1) := "000"; -- g + video(2) := "110"; -- r + end if; + end if; + + -- add stars, background and video + if not I_HWSEL_FROGGER then + video(0) := video(0) or ( star_b & '0'); + video(1) := video(1) or ( star_g & '0'); + video(2) := video(2) or ( star_r & '0'); + + if (pout1_reg = '1') and (vidout_l = '1') then + video(0) := video(0) or ("011"); + end if; + end if; + + O_VIDEO_B <= video(0); + O_VIDEO_G <= video(1); + O_VIDEO_R <= video(2); + end if; + end process; + + stars : work.MC_STARS + port map ( + I_CLK => CLK, + I_ENA => ENA_STAR, + I_H_FLIP => '0', + I_V_SYNC => I_VSYNC, + I_8HF => I_HCNT(3), + I_256HnX => h256_l, + I_1VF => I_VCNT(0), + I_2V => I_VCNT(1), + I_STARS_ON => I_STARSON, + I_STARS_OFFn => '1', + + O_R => star_r, + O_G => star_g, + O_B => star_b + ); + + p_frogger_blue_reg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then + if (I_HCNT(7 downto 0) = x"87") then + frogger_blue_reg <= '1'; + elsif (I_HCNT(7 downto 0) = x"07") then + frogger_blue_reg <= '0'; + end if; + end if; + end process; + frogger_blue <= not (frogger_blue_reg xor I_HCMA); + +end RTL; + +------------------------------------------------------------------------------ +-- FPGA STARS +-- +-- Version : 2.00 +-- +-- Copyright(c) 2004 Katsumi Degawa , All rights reserved +-- +-- Important ! +-- +-- This program is freeware for non-commercial use. +-- The author does not guarantee this program. +-- You can use this at your own risk. +-- +------------------------------------------------------------------------------ +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity MC_STARS is + port ( + I_CLK : in std_logic; + I_ENA : in std_logic; + I_H_FLIP : in std_logic; + I_V_SYNC : in std_logic; + I_8HF : in std_logic; + I_256HnX : in std_logic; + I_1VF : in std_logic; + I_2V : in std_logic; + I_STARS_ON : in std_logic; + I_STARS_OFFn : in std_logic; + + O_R : out std_logic_vector(1 downto 0); + O_G : out std_logic_vector(1 downto 0); + O_B : out std_logic_vector(1 downto 0); + O_NOISE : out std_logic + ); +end; + +architecture RTL of MC_STARS is + signal CLK_1C : std_logic := '0'; + signal CLK_1Cd : std_logic := '0'; + signal W_2D_Qn : std_logic := '0'; + + signal W_3B : std_logic := '0'; + signal noise : std_logic := '0'; + signal W_2A : std_logic := '0'; + signal W_4P : std_logic := '0'; + signal CLK_1AB : std_logic := '0'; + signal CLK_1ABd : std_logic := '0'; + signal W_1AB_Q : std_logic_vector(15 downto 0) := (others => '0'); + signal W_1C_Q : std_logic_vector( 1 downto 0) := (others => '0'); +begin + O_R <= (W_1AB_Q( 9) & W_1AB_Q (8) ) when (W_2A = '0' and W_4P = '0' and I_256HnX = '1') else (others => '0'); + O_G <= (W_1AB_Q(11) & W_1AB_Q(10) ) when (W_2A = '0' and W_4P = '0' and I_256HnX = '1') else (others => '0'); + O_B <= (W_1AB_Q(13) & W_1AB_Q(12) ) when (W_2A = '0' and W_4P = '0' and I_256HnX = '1') else (others => '0'); + + CLK_1C <= not (I_ENA and (not I_V_SYNC) and I_256HnX); + CLK_1AB <= not (CLK_1C or (not (I_H_FLIP or W_1C_Q(1)))); + W_3B <= W_2D_Qn xor W_1AB_Q(4); + + W_2A <= '0' when (W_1AB_Q(7 downto 0) = x"ff") else '1'; + W_4P <= not (( I_8HF xor I_1VF ) and W_2D_Qn and I_STARS_OFFn); + + O_NOISE <= noise ; + + process(I_2V) + begin + if rising_edge(I_2V) then + noise <= W_2D_Qn; + end if; + end process; + + process(I_CLK, I_V_SYNC) + begin + if(I_V_SYNC = '1') then + W_1C_Q <= (others => '0'); + elsif rising_edge(I_CLK) then + CLK_1Cd <= CLK_1C; + if CLK_1Cd = '0' and CLK_1C = '1' then + W_1C_Q <= W_1C_Q(0) & '1'; + end if; + end if; + end process; + + process(I_CLK, I_STARS_ON) + begin + if(I_STARS_ON = '0') then + W_1AB_Q <= (others => '0'); + W_2D_Qn <= '1'; + elsif rising_edge(I_CLK) then + CLK_1ABd <= CLK_1AB; + if CLK_1ABd = '0' and CLK_1AB = '1' then + W_1AB_Q <= W_1AB_Q(14 downto 0) & W_3B; + W_2D_Qn <= not W_1AB_Q(15); + end if; + end if; + end process; +end RTL; diff --git a/Arcade/Scramble Hardware/TheEnd_MiST/rtl/video_mixer.sv b/Arcade/Scramble Hardware/TheEnd_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Arcade/Scramble Hardware/TheEnd_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/Commodore - 64_Mist/C64_mist.qpf b/Commodore - 64_Mist/C64_mist.qpf new file mode 100644 index 00000000..6c07b7e4 --- /dev/null +++ b/Commodore - 64_Mist/C64_mist.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 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.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 09:30:37 July 09, 2015 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "09:30:37 July 09, 2015" + +# Revisions + +PROJECT_REVISION = "C64_mist" diff --git a/Commodore - 64_Mist/C64_mist.qsf b/Commodore - 64_Mist/C64_mist.qsf new file mode 100644 index 00000000..51757546 --- /dev/null +++ b/Commodore - 64_Mist/C64_mist.qsf @@ -0,0 +1,370 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 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.4 Build 182 03/12/2014 SJ Full Version +# Date created = 01:27:30 May 03, 2016 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# C64_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 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:40:24 MAY 17, 2014" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name FLOW_ENABLE_IO_ASSIGNMENT_ANALYSIS ON + +# 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_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" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE SPEED +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY c64_mist +set_global_assignment -name DEVICE_FILTER_PACKAGE TQFP +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON +set_global_assignment -name SAVE_DISK_SPACE OFF + +# Fitter Assignments +# ================== +set_global_assignment -name FITTER_EARLY_TIMING_ESTIMATE_MODE OPTIMISTIC +set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC ON +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING ON +set_global_assignment -name PHYSICAL_SYNTHESIS_ASYNCHRONOUS_SIGNAL_PIPELINING ON +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION ON +set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC_FOR_AREA ON +set_global_assignment -name PHYSICAL_SYNTHESIS_MAP_LOGIC_TO_MEMORY_FOR_AREA ON +set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT EXTRA +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +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" +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON +set_global_assignment -name FITTER_EFFORT "FAST FIT" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# SignalTap II Assignments +# ======================== +set_global_assignment -name ENABLE_SIGNALTAP ON +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp + +# 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 ENTITY(C64_MiST) + +# Pin & Location Assignments +# ========================== +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[0] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[1] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[2] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[3] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[4] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[5] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[6] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[7] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[8] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[9] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[10] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[11] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[12] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[13] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[14] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[15] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[0] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[1] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[2] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[3] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[4] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[5] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[6] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[7] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[8] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[9] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[10] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[11] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[12] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[0] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[1] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQMH +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQML +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nRAS +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCAS +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nWE +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCS +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[0] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[1] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[2] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[3] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[4] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[5] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[6] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[7] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[8] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[9] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[10] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[11] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[12] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[13] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[14] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[15] + +# Fitter Assignments +# ================== +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[8] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[9] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[10] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[11] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[12] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[8] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[9] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[10] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[11] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[12] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[13] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[14] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[15] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_BA[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_BA[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQML +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQMH +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nRAS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nCAS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nWE +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nCS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_CKE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CLK +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_R[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_R[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_R[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_R[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_R[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_R[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_G[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_G[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_G[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_G[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_G[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_G[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_B[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_B[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_B[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_B[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_B[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_B[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_HS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_VS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to LED +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to AUDIO_L +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to AUDIO_R +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SPI_DO +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to CONF_DATA0 + +# start DESIGN_PARTITION(Top) +# --------------------------- + +# Incremental Compilation Assignments +# =================================== +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 + +# end DESIGN_PARTITION(Top) +# ------------------------- + +# end ENTITY(C64_MiST) +# ---------------------- +set_global_assignment -name VHDL_FILE rtl/c64_mist.vhd +set_global_assignment -name VHDL_FILE rtl/sid/wave_map.vhd +set_global_assignment -name VHDL_FILE rtl/sid/sid_top.vhd +set_global_assignment -name VHDL_FILE rtl/sid/sid_regs.vhd +set_global_assignment -name VHDL_FILE rtl/sid/sid_mixer.vhd +set_global_assignment -name VHDL_FILE rtl/sid/sid_filter.vhd +set_global_assignment -name VHDL_FILE rtl/sid/sid_debug_pkg.vhd +set_global_assignment -name VHDL_FILE rtl/sid/sid_ctrl.vhd +set_global_assignment -name VHDL_FILE rtl/sid/Q_table.vhd +set_global_assignment -name VHDL_FILE rtl/sid/oscillator.vhd +set_global_assignment -name VHDL_FILE rtl/sid/my_math_pkg.vhd +set_global_assignment -name VHDL_FILE rtl/sid/mult_acc.vhd +set_global_assignment -name VHDL_FILE rtl/sid/adsr_multi.vhd +set_global_assignment -name VHDL_FILE rtl/video_vicII_656x_e.vhd +set_global_assignment -name VHDL_FILE rtl/video_vicII_656x_a.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/trkbuf.v +set_global_assignment -name VERILOG_FILE rtl/sigma_delta_dac.v +set_global_assignment -name VERILOG_FILE rtl/sdram.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/sd_card.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VHDL_FILE rtl/rom_C1541.vhd +set_global_assignment -name VHDL_FILE rtl/rom_c64_chargen.vhd +set_global_assignment -name VHDL_FILE rtl/rom_C64.vhd +set_global_assignment -name VHDL_FILE rtl/pll.vhd +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +set_global_assignment -name VHDL_FILE rtl/m6522.vhd +set_global_assignment -name VHDL_FILE rtl/io_ps2_keyboard.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/hq2x.sv +set_global_assignment -name VHDL_FILE rtl/gen_ram.vhd +set_global_assignment -name VHDL_FILE rtl/gcr_floppy.vhd +set_global_assignment -name VHDL_FILE rtl/fpga64_sid_iec.vhd +set_global_assignment -name VHDL_FILE rtl/fpga64_rgbcolor.vhd +set_global_assignment -name VHDL_FILE rtl/fpga64_keyboard_matrix_mark_mcdougall.vhd +set_global_assignment -name VHDL_FILE rtl/fpga64_bustiming.vhd +set_global_assignment -name VHDL_FILE rtl/fpga64_buslogic_roms_mmu.vhd +set_global_assignment -name VHDL_FILE rtl/cpu65xx_fast.vhd +set_global_assignment -name VHDL_FILE rtl/cpu65xx_e.vhd +set_global_assignment -name VHDL_FILE rtl/cpu_6510.vhd +set_global_assignment -name VHDL_FILE rtl/composite_sync.vhd +set_global_assignment -name VHDL_FILE rtl/cia6526.vhd +set_global_assignment -name VERILOG_FILE rtl/cartridge.v +set_global_assignment -name VHDL_FILE rtl/c1541_sd.vhd +set_global_assignment -name VHDL_FILE rtl/c1541_logic.vhd +set_global_assignment -name VHDL_FILE rtl/rom_GS64.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Commodore - 64_Mist/README.txt b/Commodore - 64_Mist/README.txt new file mode 100644 index 00000000..e43d2daf --- /dev/null +++ b/Commodore - 64_Mist/README.txt @@ -0,0 +1,56 @@ +--------------------------------------------------------------------------------- +-- FPGA64_027 and 1541_SD by Dar (darfpga@aol.fr) release 0001- 26/07/2015 +-- +-- http://darfpga.blogspot.fr +-- +-- FPGA64 is Copyrighted 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- +-- Main features +-- 15KHz(TV) / 31Khz(VGA) +-- PAL(50Hz) / NTSC(60Hz) +-- PS2 keyboard input with portA / portB joystick emulation +-- SID sound output +-- +-- +-- Internal emulated 1541 on raw SD card (READ ONLY) : D64 images start at 256KB boundaries +-- Use hexadecimal disk editor such as HxD (www.mh-nexus.de) to build SD card. +-- Cut D64 file and paste at 0x00000 (first), 0x40000 (second), 0x80000 (third), +-- 0xC0000(fourth), 0x100000(fith), 0x140000 (sixth) and so on. +-- BE CAREFUL NOT WRITING ON YOUR OWN HARDDRIVE +-- +-- Use only SIMPLE D64 files : 174 848 octets (without disk error management) +-- +--------------------------------------------------------------------------------- +-- +-- c1541_sd reads D64 data from raw SD card, produces GCR data, feeds c1541_logic +-- Raw SD data : each D64 image must start on 256KB boundaries +-- disk_num allow to select D64 image +-- +-- c1541_logic from : Mark McDougall +-- spi_controller from : Michel Stempin, Stephen A. Edwards +-- via6522 from : Arnim Laeuger, Mark McDougall, MikeJ +-- T65 from : Daniel Wallner, MikeJ, ehenciak +-- +-- c1541_logic modified for : slow down CPU (EOI ack missed by real c64) +-- : remove IEC internal OR wired +-- : synched atn_in (sometime no IRQ to CPU with real c64) +-- spi_controller modified for : sector start and size adapted + busy signal +-- via6522 modified for : no modification +-- +--------------------------------------------------------------------------------- + +FPGA64_027 Keyboard specific keys : + + Escape : run stop + [ : @ + ] : * + \ : up arrow + ' : semi colon + ` : left arrow + F9 : £ + F10 : + + Left Alt : commodore key + + +END diff --git a/Commodore - 64_Mist/c64_mist.sdc b/Commodore - 64_Mist/c64_mist.sdc new file mode 100644 index 00000000..3eba3b05 --- /dev/null +++ b/Commodore - 64_Mist/c64_mist.sdc @@ -0,0 +1,33 @@ +#************************************************************ +# THIS IS A WIZARD-GENERATED FILE. +# +# Version 13.1.4 Build 182 03/12/2014 SJ Full Version +# +#************************************************************ + +# Copyright (C) 1991-2014 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. + + + +# Clock constraints + +create_clock -name "CLOCK_27" -period 37.037 [get_ports {CLOCK_27}] +create_clock -name {SPI_SCK} -period 10.000 -waveform { 0.000 0.500 } [get_ports {SPI_SCK}] + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty diff --git a/Commodore - 64_Mist/clean.bat b/Commodore - 64_Mist/clean.bat new file mode 100644 index 00000000..d76d65c1 --- /dev/null +++ b/Commodore - 64_Mist/clean.bat @@ -0,0 +1,13 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +pause diff --git a/Commodore - 64_Mist/release/C64GS_mist.rbf b/Commodore - 64_Mist/release/C64GS_mist.rbf new file mode 100644 index 00000000..db2383f0 Binary files /dev/null and b/Commodore - 64_Mist/release/C64GS_mist.rbf differ diff --git a/Commodore - 64_Mist/release/C64_mist.rbf b/Commodore - 64_Mist/release/C64_mist.rbf new file mode 100644 index 00000000..0a012e95 Binary files /dev/null and b/Commodore - 64_Mist/release/C64_mist.rbf differ diff --git a/Commodore - 64_Mist/rtl/c1541_logic.vhd b/Commodore - 64_Mist/rtl/c1541_logic.vhd new file mode 100644 index 00000000..82364fe2 --- /dev/null +++ b/Commodore - 64_Mist/rtl/c1541_logic.vhd @@ -0,0 +1,366 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.all; + +--use work.platform_pkg.all; +--use work.project_pkg.all; + +-- +-- Model 1541B +-- + +entity c1541_logic is +port +( + clk_32M : in std_logic; + reset : in std_logic; + + -- serial bus + sb_data_oe : out std_logic; + sb_data_in : in std_logic; + sb_clk_oe : out std_logic; + sb_clk_in : in std_logic; + sb_atn_oe : out std_logic; + sb_atn_in : in std_logic; + + c1541rom_addr : in std_logic_vector(13 downto 0); + c1541rom_data : in std_logic_vector(7 downto 0); + c1541rom_wr : in std_logic; + + -- drive-side interface + ds : in std_logic_vector(1 downto 0); -- device select + di : in std_logic_vector(7 downto 0); -- disk read data + do : out std_logic_vector(7 downto 0); -- disk write data + mode : out std_logic; -- read/write + stp : out std_logic_vector(1 downto 0); -- stepper motor control + mtr : out std_logic; -- stepper motor on/off + freq : out std_logic_vector(1 downto 0); -- motor frequency + sync_n : in std_logic; -- reading SYNC bytes + byte_n : in std_logic; -- byte ready + wps_n : in std_logic; -- write-protect sense + tr00_sense_n : in std_logic; -- track 0 sense (unused?) + act : out std_logic -- activity LED +); +end c1541_logic; + +architecture SYN of c1541_logic is + + -- clocks, reset + signal reset_n : std_logic; + signal clk_4M_en : std_logic; + signal p2_h : std_logic; + signal clk_1M_pulse : std_logic; + + -- cpu signals + signal cpu_a : unsigned(15 downto 0); + signal cpu_di : unsigned(7 downto 0); + signal cpu_do : unsigned(7 downto 0); + signal cpu_a_l : std_logic_vector(23 downto 0); + signal cpu_do_l : std_logic_vector(7 downto 0); + signal cpu_rw : std_logic; + signal cpu_rw_n : std_logic; + signal cpu_irq_n : std_logic; + signal cpu_so_n : std_logic; + + -- rom signals + signal rom_cs : std_logic; + signal rom_do : std_logic_vector(cpu_di'range); + + -- ram signals + signal ram_cs : std_logic; + signal ram_wr : std_logic; + signal ram_do : std_logic_vector(cpu_di'range); + + -- UC1 (VIA6522) signals + signal uc1_do : std_logic_vector(7 downto 0); + signal uc1_cs1 : std_logic; + signal uc1_cs2_n : std_logic; + signal uc1_irq_n : std_logic; + signal uc1_ca1_i : std_logic; + signal uc1_pa_i : std_logic_vector(7 downto 0); + signal uc1_pb_i : std_logic_vector(7 downto 0) := (others => '0'); + signal uc1_pb_o : std_logic_vector(7 downto 0); + signal uc1_pb_oe_n : std_logic_vector(7 downto 0); + + -- UC3 (VIA6522) signals + signal uc3_do : std_logic_vector(7 downto 0); + signal uc3_cs1 : std_logic; + signal uc3_cs2_n : std_logic; + signal uc3_irq_n : std_logic; + signal uc3_ca1_i : std_logic; + signal uc3_ca2_o : std_logic; + signal uc3_ca2_oe_n : std_logic; + signal uc3_pa_i : std_logic_vector(7 downto 0); + signal uc3_pa_o : std_logic_vector(7 downto 0); + signal uc3_cb2_o : std_logic; + signal uc3_cb2_oe_n : std_logic; + signal uc3_pa_oe_n : std_logic_vector(7 downto 0); + signal uc3_pb_i : std_logic_vector(7 downto 0); + signal uc3_pb_o : std_logic_vector(7 downto 0); + signal uc3_pb_oe_n : std_logic_vector(7 downto 0); + + -- internal signals + signal atna : std_logic; -- ATN ACK - input gate array + signal atn : std_logic; -- attention + signal soe : std_logic; -- set overflow enable + + type t_byte_array is array(2047 downto 0) of std_logic_vector(7 downto 0); + signal ram : t_byte_array; + +begin + + reset_n <= not reset; + + process (clk_32M, reset) + variable count : std_logic_vector(8 downto 0) := (others => '0'); + alias hcnt : std_logic_vector(1 downto 0) is count(4 downto 3); + begin + if rising_edge(clk_32M) then + -- generate 1MHz pulse + clk_1M_pulse <= '0'; + --if count(4 downto 0) = "00111" then + if count(4 downto 0) = "01000" then + clk_1M_pulse <= '1'; + end if; + -- if count = "000100000" then -- DAR divide by 33 (otherwise real c64 miss EOI acknowledge) + if count = "000011111" then -- TH: divide by 32 + count := (others => '0'); -- DAR + else -- DAR + count := std_logic_vector(unsigned(count) + 1); + end if; -- DAR + end if; + p2_h <= not hcnt(1); + + -- for original m6522 design that requires a real clock +-- clk_4M_en <= not count(2); + + -- for version 002 with clock enable + if count(2 downto 0) = "111" then + clk_4M_en <= '1'; + else + clk_4M_en <= '0'; + end if; + end process; + + -- decode logic + -- RAM $0000-$07FF (2KB) + ram_cs <= '1' when STD_MATCH(cpu_a(15 downto 0), "00000-----------") else '0'; + -- UC1 (VIA6522) $1800-$180F + uc1_cs2_n <= '0' when STD_MATCH(cpu_a(15 downto 0), "000110000000----") else '1'; + -- UC3 (VIA6522) $1C00-$1C0F + uc3_cs2_n <= '0' when STD_MATCH(cpu_a(15 downto 0), "000111000000----") else '1'; + -- ROM $C000-$FFFF (16KB) + rom_cs <= '1' when STD_MATCH(cpu_a(15 downto 0), "11--------------") else '0'; + + -- qualified write signals + ram_wr <= '1' when ram_cs = '1' and cpu_rw = '1' else '0'; + + -- + -- hook up UC1 ports + -- + + uc1_cs1 <= cpu_a(11); + --uc1_cs2_n: see decode logic above + -- CA1 + --uc1_ca1_i <= not sb_atn_in; -- DAR comment : synched with clk_4M_en see below + -- PA + uc1_pa_i(0) <= tr00_sense_n; + uc1_pa_i(7 downto 1) <= (others => '0'); -- NC + -- PB + uc1_pb_i(0) <= '1' when sb_data_in = '0' else + '1' when (uc1_pb_o(1) = '1' and uc1_pb_oe_n(1) = '0') else -- DAR comment : external OR wired + '1' when atn = '1' else -- DAR comment : external OR wired + '0'; + sb_data_oe <= '1' when (uc1_pb_o(1) = '1' and uc1_pb_oe_n(1) = '0') else + '1' when atn = '1' else + '0'; + uc1_pb_i(2) <= '1' when sb_clk_in = '0' else + '1' when (uc1_pb_o(3) = '1' and uc1_pb_oe_n(3) = '0') else -- DAR comment : external OR wired + '0'; + sb_clk_oe <= '1' when (uc1_pb_o(3) = '1' and uc1_pb_oe_n(3) = '0') else '0'; + + atna <= uc1_pb_o(4); -- when uc1_pc_oe = '1' + uc1_pb_i(6 downto 5) <= ds; -- allows override + uc1_pb_i(7) <= not sb_atn_in; + + -- + -- hook up UC3 ports + -- + + uc3_cs1 <= cpu_a(11); + --uc3_cs2_n: see decode logic above + -- CA1 + uc3_ca1_i <= cpu_so_n; -- byte ready gated with soe + -- CA2 + soe <= uc3_ca2_o or uc3_ca2_oe_n; + -- PA + uc3_pa_i <= di; + do <= uc3_pa_o or uc3_pa_oe_n; + -- CB2 + mode <= uc3_cb2_o or uc3_cb2_oe_n; + -- PB + stp(1) <= uc3_pb_o(0) or uc3_pb_oe_n(0); + stp(0) <= uc3_pb_o(1) or uc3_pb_oe_n(1); + mtr <= uc3_pb_o(2) or uc3_pb_oe_n(2); + act <= uc3_pb_o(3) or uc3_pb_oe_n(3); + freq <= uc3_pb_o(6 downto 5) or uc3_pb_oe_n(6 downto 5); + uc3_pb_i <= sync_n & "11" & wps_n & "1111"; + + -- + -- CPU connections + -- + cpu_di <= unsigned(rom_do) when rom_cs = '1' else + unsigned(ram_do) when ram_cs = '1' else + unsigned(uc1_do) when (uc1_cs1 = '1' and uc1_cs2_n = '0') else + unsigned(uc3_do) when (uc3_cs1 = '1' and uc3_cs2_n = '0') else + (others => '1'); + cpu_irq_n <= uc1_irq_n and uc3_irq_n; + cpu_so_n <= byte_n or not soe; + + -- internal connections + atn <= atna xor (not sb_atn_in); + + -- external connections + -- ATN never driven by the 1541 + sb_atn_oe <= '0'; + + + -- DAR + process (clk_32M) + begin + if rising_edge(clk_32M) then + if clk_4M_en = '1' then + uc1_ca1_i <= not sb_atn_in; -- DAR sample external atn to ensure not missing edge within VIA + end if; + end if; + end process; + + cpu: entity work.cpu65xx + generic map ( + pipelineOpcode => false, + pipelineAluMux => false, + pipelineAluOut => false + ) + port map ( + clk => clk_32M, + enable => clk_1M_pulse, + reset => reset, + nmi_n => '1', + irq_n => cpu_irq_n, + so_n => cpu_so_n, + di => cpu_di, + do => cpu_do, + addr => cpu_a, + we => cpu_rw + ); + + rom_inst: entity work.rom_C1541 + port map ( + clock => clk_32M, + + wren => c1541rom_wr, + data => c1541rom_data, + wraddress => c1541rom_addr, + + rdaddress => std_logic_vector(cpu_a(13 downto 0)), + q => rom_do + ); + + process (clk_32M) + begin + if rising_edge(clk_32M) then + ram_do <= ram(to_integer(cpu_a(13 downto 0))); + if ram_wr = '1' then + ram(to_integer(cpu_a(13 downto 0))) <= std_logic_vector(cpu_do); + end if; + end if; + end process; + + + uc1_via6522_inst : entity work.M6522 + port map + ( + I_RS => std_logic_vector(cpu_a(3 downto 0)), + I_DATA => std_logic_vector(cpu_do), + O_DATA => uc1_do, + O_DATA_OE_L => open, + + I_RW_L => not cpu_rw, + I_CS1 => uc1_cs1, + I_CS2_L => uc1_cs2_n, + + O_IRQ_L => uc1_irq_n, + + -- port a + I_CA1 => uc1_ca1_i, + I_CA2 => '0', + O_CA2 => open, + O_CA2_OE_L => open, + + I_PA => uc1_pa_i, + O_PA => open, + O_PA_OE_L => open, + + -- port b + I_CB1 => '0', + O_CB1 => open, + O_CB1_OE_L => open, + + I_CB2 => '0', + O_CB2 => open, + O_CB2_OE_L => open, + + I_PB => uc1_pb_i, + O_PB => uc1_pb_o, + O_PB_OE_L => uc1_pb_oe_n, + + RESET_L => reset_n, + CLK => clk_32M, + I_P2_H => p2_h, -- high for phase 2 clock ____----__ + ENA_4 => clk_4M_en -- 4x system clock (4MHZ) _-_-_-_-_- + ); + + uc3_via6522_inst : entity work.M6522 + port map + ( + I_RS => std_logic_vector(cpu_a(3 downto 0)), + I_DATA => std_logic_vector(cpu_do), + O_DATA => uc3_do, + O_DATA_OE_L => open, + + I_RW_L => not cpu_rw, + I_CS1 => cpu_a(11), + I_CS2_L => uc3_cs2_n, + + O_IRQ_L => uc3_irq_n, + + -- port a + I_CA1 => uc3_ca1_i, + I_CA2 => '0', + O_CA2 => uc3_ca2_o, + O_CA2_OE_L => uc3_ca2_oe_n, + + I_PA => uc3_pa_i, + O_PA => uc3_pa_o, + O_PA_OE_L => uc3_pa_oe_n, + + -- port b + I_CB1 => '0', + O_CB1 => open, + O_CB1_OE_L => open, + + I_CB2 => '0', + O_CB2 => uc3_cb2_o, + O_CB2_OE_L => uc3_cb2_oe_n, + + I_PB => uc3_pb_i, + O_PB => uc3_pb_o, + O_PB_OE_L => uc3_pb_oe_n, + + RESET_L => reset_n, + CLK => clk_32M, + I_P2_H => p2_h, -- high for phase 2 clock ____----__ + ENA_4 => clk_4M_en -- 4x system clock (4MHZ) _-_-_-_-_- + ); + +end SYN; diff --git a/Commodore - 64_Mist/rtl/c1541_sd.vhd b/Commodore - 64_Mist/rtl/c1541_sd.vhd new file mode 100644 index 00000000..d2ed45c0 --- /dev/null +++ b/Commodore - 64_Mist/rtl/c1541_sd.vhd @@ -0,0 +1,266 @@ +--------------------------------------------------------------------------------- +-- Commodore 1541 to SD card (read only) by Dar (darfpga@aol.fr) 02-April-2015 +-- http://darfpga.blogspot.fr +-- +-- c1541_sd reads D64 data from raw SD card, produces GCR data, feeds c1541_logic +-- Raw SD data : each D64 image must start on 256KB boundaries +-- disk_num allow to select D64 image +-- +-- c1541_logic from : Mark McDougall +-- spi_controller from : Michel Stempin, Stephen A. Edwards +-- via6522 from : Arnim Laeuger, Mark McDougall, MikeJ +-- +-- c1541_logic modified for : slow down CPU (EOI ack missed by real c64) +-- : remove iec internal OR wired +-- : synched atn_in (sometime no IRQ with real c64) +-- spi_controller modified for : sector start and size adapted + busy signal +-- via6522 modified for : no modification +-- +-- +-- Input clk 32MHz +-- +--------------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.ALL; +use IEEE.numeric_std.all; + +entity c1541_sd is +port +( + clk32 : in std_logic; + reset : in std_logic; + + disk_change : in std_logic; + disk_readonly : in std_logic; + + iec_atn_i : in std_logic; + iec_data_i : in std_logic; + iec_clk_i : in std_logic; + + iec_atn_o : out std_logic; + iec_data_o : out std_logic; + iec_clk_o : out std_logic; + + sd_lba : out std_logic_vector(31 downto 0); + sd_rd : out std_logic; + sd_wr : out std_logic; + sd_ack : in std_logic; + sd_ack_conf : in std_logic; + + sd_sdhc : out std_logic; + sd_conf : out std_logic; + sd_buff_addr : in std_logic_vector(8 downto 0); + sd_buff_dout : in std_logic_vector(7 downto 0); + sd_buff_din : out std_logic_vector(7 downto 0); + sd_buff_wr : in std_logic; + + led : out std_logic; + + c1541rom_addr : in std_logic_vector(13 downto 0); + c1541rom_data : in std_logic_vector(7 downto 0); + c1541rom_wr : in std_logic +); +end c1541_sd; + +architecture struct of c1541_sd is + + component sd_card port + ( + sd_lba : out std_logic_vector(31 downto 0); + sd_rd : out std_logic; + sd_wr : out std_logic; + sd_ack : in std_logic; + sd_ack_conf : in std_logic; + sd_sdhc : out std_logic; + sd_conf : out std_logic; + + sd_buff_addr : in std_logic_vector(8 downto 0); + sd_buff_dout : in std_logic_vector(7 downto 0); + sd_buff_din : out std_logic_vector(7 downto 0); + sd_buff_wr : in std_logic; + + buff_addr : in std_logic_vector(7 downto 0); + buff_dout : out std_logic_vector(7 downto 0); + buff_din : in std_logic_vector(7 downto 0); + buff_we : in std_logic; + + save_track : in std_logic; + + change : in std_logic; -- Force reload as disk may have changed + track : in std_logic_vector(5 downto 0); -- Track number (0-34) + sector : in std_logic_vector(4 downto 0); -- Sector number (0-20) + busy : out std_logic; + + clk : in std_logic; -- System clock + reset : in std_logic + ); + end component sd_card; + + signal buff_dout : std_logic_vector(7 downto 0); + signal buff_din : std_logic_vector(7 downto 0); + signal buff_we : std_logic; + signal do : std_logic_vector(7 downto 0); -- disk read data + signal di : std_logic_vector(7 downto 0); -- disk write data + signal mode : std_logic; -- read/write + signal stp : std_logic_vector(1 downto 0); -- stepper motor control + signal stp_r : std_logic_vector(1 downto 0); -- stepper motor control + signal mtr : std_logic ; -- stepper motor on/off + signal sync_n : std_logic; -- reading SYNC bytes + signal byte_n : std_logic; -- byte ready + signal act : std_logic; -- activity LED + signal act_r : std_logic; -- activity LED + signal sd_busy : std_logic; + signal sector : std_logic_vector(4 downto 0); + signal byte_addr : std_logic_vector(7 downto 0); + signal track_num_dbl : std_logic_vector(6 downto 0); + signal track : std_logic_vector(5 downto 0); + + signal tr00_sense_n : std_logic; + signal save_track : std_logic; + signal track_modified : std_logic; + +begin + + tr00_sense_n <= '1' when (track > "000000") else '0'; + + c1541 : entity work.c1541_logic + port map + ( + clk_32M => clk32, + reset => reset, + + -- serial bus + sb_data_oe => iec_data_o, + sb_clk_oe => iec_clk_o, + sb_atn_oe => iec_atn_o, + + sb_data_in => not iec_data_i, + sb_clk_in => not iec_clk_i, + sb_atn_in => not iec_atn_i, + + c1541rom_addr => c1541rom_addr, + c1541rom_data => c1541rom_data, + c1541rom_wr => c1541rom_wr, + + -- drive-side interface + ds => "00", -- device select + di => do, -- disk read data + do => di, -- disk write data + mode => mode, -- read/write + stp => stp, -- stepper motor control + mtr => mtr, -- motor on/off + freq => open, -- motor frequency + sync_n => sync_n, -- reading SYNC bytes + byte_n => byte_n, -- byte ready + wps_n => not disk_readonly, -- write-protect sense + tr00_sense_n => tr00_sense_n, -- track 0 sense (unused?) + act => act -- activity LED + ); + + floppy : entity work.gcr_floppy + port map + ( + clk32 => clk32, + + dout => do, -- disk read data + din => di, + mode => mode, + mtr => mtr, -- stepper motor on/off + sync_n => sync_n, -- reading SYNC bytes + byte_n => byte_n, -- byte ready + + track => track, + sector => sector, + + byte_addr => byte_addr, + + ram_do => buff_dout, + ram_di => buff_din, + ram_we => buff_we, + + ram_ready => not sd_busy + ); + + sd : sd_card + port map + ( + sd_lba => sd_lba, + sd_rd => sd_rd, + sd_wr => sd_wr, + sd_ack => sd_ack, + sd_conf => sd_conf, + sd_sdhc => sd_sdhc, + sd_ack_conf => sd_ack_conf, + + sd_buff_addr => sd_buff_addr, + sd_buff_dout => sd_buff_dout, + sd_buff_din => sd_buff_din, + sd_buff_wr => sd_buff_wr, + + buff_addr => byte_addr, + buff_dout => buff_dout, + buff_din => buff_din, + buff_we => buff_we, + + save_track => save_track, + change => disk_change, + track => track, + sector => sector, + + clk => clk32, + reset => reset, + busy => sd_busy + ); + + led <= act or sd_busy; + + process (clk32) + begin + if rising_edge(clk32) then + stp_r <= stp; + act_r <= act; + save_track <= '0'; + track <= track_num_dbl(6 downto 1); + + if buff_we = '1' then track_modified <= '1'; end if; + if disk_change = '1' then track_modified <= '0'; end if; + + if reset = '1' then + track_num_dbl <= "0100100";--"0000010"; + track_modified <= '0'; + else + if mtr = '1' then + if( (stp_r = "00" and stp = "10") + or (stp_r = "10" and stp = "01") + or (stp_r = "01" and stp = "11") + or (stp_r = "11" and stp = "00")) then + if track_num_dbl < "1010000" then + track_num_dbl <= track_num_dbl + '1'; + end if; + save_track <= track_modified; + track_modified <= '0'; + end if; + + if( (stp_r = "00" and stp = "11") + or (stp_r = "10" and stp = "00") + or (stp_r = "01" and stp = "10") + or (stp_r = "11" and stp = "01")) then + if track_num_dbl > "0000001" then + track_num_dbl <= track_num_dbl - '1'; + end if; + save_track <= track_modified; + track_modified <= '0'; + end if; + end if; + + if act_r = '1' and act = '0' then -- stopping activity + save_track <= track_modified; + track_modified <= '0'; + end if; + end if; + end if; -- rising edge clock + end process; + +end struct; diff --git a/Commodore - 64_Mist/rtl/c64_mist.vhd b/Commodore - 64_Mist/rtl/c64_mist.vhd new file mode 100644 index 00000000..ece31cac --- /dev/null +++ b/Commodore - 64_Mist/rtl/c64_mist.vhd @@ -0,0 +1,1012 @@ +--------------------------------------------------------------------------------- +-- DE2-35 Top level for FPGA64_027 by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +-- +-- FPGA64 is Copyrighted 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- +-- Main features +-- 15KHz(TV) / 31Khz(VGA) : board switch(0) +-- PAL(50Hz) / NTSC(60Hz) : board switch(1) and F12 key +-- PS2 keyboard input with portA / portB joystick emulation : F11 key +-- wm8731 sound output +-- 64Ko of board SRAM used +-- External IEC bus available at gpio_1 (for drive 1541 or IEC/SD ...) +-- activated by switch(5) (activated with no hardware will stuck IEC bus) +-- +-- Internal emulated 1541 on raw SD card : D64 images start at 25x6KB boundaries +-- Use hexidecimal disk editor such as HxD (www.mh-nexus.de) to build SD card. +-- Cut D64 file and paste at 0x00000 (first), 0x40000 (second), 0x80000 (third), +-- 0xC0000(fourth), 0x100000(fith), 0x140000 (sixth) and so on. +-- BE CAREFUL NOT WRITING ON YOUR OWN HARDDRIVE +-- +-- Uses only one pll for 32MHz and 18MHz generation from 50MHz +-- DE1 and DE0 nano Top level also available +-- +--------------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.ALL; +use IEEE.numeric_std.all; + +entity c64_mist is port +( + -- Clocks + CLOCK_27 : in std_logic; + + -- LED + LED : out std_logic; + + -- VGA + VGA_R : out std_logic_vector(5 downto 0); + VGA_G : out std_logic_vector(5 downto 0); + VGA_B : out std_logic_vector(5 downto 0); + VGA_HS : out std_logic; + VGA_VS : out std_logic; + + -- SDRAM + SDRAM_A : out std_logic_vector(12 downto 0); + SDRAM_DQ : inout std_logic_vector(15 downto 0); + SDRAM_DQML : out std_logic; + SDRAM_DQMH : out std_logic; + SDRAM_nWE : out std_logic; + SDRAM_nCAS : out std_logic; + SDRAM_nRAS : out std_logic; + SDRAM_nCS : out std_logic; + SDRAM_BA : out std_logic_vector(1 downto 0); + SDRAM_CLK : out std_logic; + SDRAM_CKE : out std_logic; + + -- AUDIO + AUDIO_L : out std_logic; + AUDIO_R : out std_logic; + + -- SPI interface to io controller + SPI_SCK : in std_logic; + SPI_DO : inout std_logic; + SPI_DI : in std_logic; + SPI_SS2 : in std_logic; + SPI_SS3 : in std_logic; + CONF_DATA0 : in std_logic +); +end c64_mist; + +architecture struct of c64_mist is + +component sdram is port +( + -- interface to the MT48LC16M16 chip + sd_addr : out std_logic_vector(12 downto 0); + sd_cs : out std_logic; + sd_ba : out std_logic_vector(1 downto 0); + sd_we : out std_logic; + sd_ras : out std_logic; + sd_cas : out std_logic; + + -- system interface + clk : in std_logic; + init : in std_logic; + + -- cpu/chipset interface + addr : in std_logic_vector(24 downto 0); + refresh : in std_logic; + we : in std_logic; + ce : in std_logic +); +end component; + +component sram is port +( + init : in std_logic; + clk : in std_logic; + SDRAM_DQ : inout std_logic_vector(15 downto 0); + SDRAM_A : out std_logic_vector(12 downto 0); + SDRAM_DQML : out std_logic; + SDRAM_DQMH : out std_logic; + SDRAM_BA : out std_logic_vector(1 downto 0); + SDRAM_nCS : out std_logic; + SDRAM_nWE : out std_logic; + SDRAM_nRAS : out std_logic; + SDRAM_nCAS : out std_logic; + SDRAM_CKE : out std_logic; + + wtbt : in std_logic_vector(1 downto 0); + addr : in std_logic_vector(24 downto 0); + dout : out std_logic_vector(15 downto 0); + din : in std_logic_vector(15 downto 0); + we : in std_logic; + rd : in std_logic; + ready : out std_logic +); +end component; + +--------- +-- Mist IO +--------- + +-- config string used by the io controller to fill the OSD +--constant CONF_STR : string := "C64;PRG;S1,D64;O2,Video standard,PAL,NTSC;O8A,Scandoubler Fx,None,HQ2x-320,HQ2x-160,CRT 25%,CRT 50%;O3,Joysticks,normal,swapped;O6,Audio filter,On,Off;T5,Reset;V0,v0.27.33"; +constant CONF_STR : string := "C64;;"& +"S,D64,Mount Disk;"& +"F,PRG,Load File;"& +"F,CRT,Load Cartridge;" & +"O2,Video standard,PAL,NTSC;"& +"O8A,Scandoubler Fx,None,HQ2x-320,HQ2x-160,CRT 25%,CRT 50%;"& +"O3,Joysticks,normal,swapped;"& +"O6,Audio filter,On,Off;"& +--"OB,BIOS,C64,C64GS;" & +--"T5,Reset;"& +"V0,v0.30.30"; + +-- convert string to std_logic_vector to be given to user_io +function to_slv(s: string) return std_logic_vector is + constant ss: string(1 to s'length) := s; + variable rval: std_logic_vector(1 to 8 * s'length); + variable p: integer; + variable c: integer; +begin + for i in ss'range loop + p := 8 * i; + c := character'pos(ss(i)); + rval(p - 7 to p) := std_logic_vector(to_unsigned(c,8)); + end loop; + return rval; +end function; + + +component mist_io generic(STRLEN : integer := 0 ); port +( + clk_sys : in std_logic; + + SPI_SCK : in std_logic; + CONF_DATA0 : in std_logic; + SPI_SS2 : in std_logic; + SPI_DI : in std_logic; + SPI_DO : out std_logic; + conf_str : in std_logic_vector(8*STRLEN-1 downto 0); + + switches : out std_logic_vector(1 downto 0); + buttons : out std_logic_vector(1 downto 0); + scandoubler_disable : out std_logic; + ypbpr : out std_logic; + + joystick_0 : out std_logic_vector(7 downto 0); + joystick_1 : out std_logic_vector(7 downto 0); + joystick_analog_0 : out std_logic_vector(15 downto 0); + joystick_analog_1 : out std_logic_vector(15 downto 0); + status : out std_logic_vector(31 downto 0); + + sd_lba : in std_logic_vector(31 downto 0); + sd_rd : in std_logic; + sd_wr : in std_logic; + sd_ack : out std_logic; + sd_ack_conf : out std_logic; + sd_conf : in std_logic; + sd_sdhc : in std_logic; + img_mounted : out std_logic; + + sd_buff_addr : out std_logic_vector(8 downto 0); + sd_buff_dout : out std_logic_vector(7 downto 0); + sd_buff_din : in std_logic_vector(7 downto 0); + sd_buff_wr : out std_logic; + + ps2_kbd_clk : out std_logic; + ps2_kbd_data : out std_logic; + + ps2_mouse_clk : out std_logic; + ps2_mouse_data : out std_logic; + + ioctl_force_erase : in std_logic; + ioctl_download : out std_logic; + ioctl_erasing : out std_logic; + ioctl_index : out std_logic_vector(7 downto 0); + ioctl_wr : out std_logic; + ioctl_addr : out std_logic_vector(24 downto 0); + ioctl_dout : out std_logic_vector(7 downto 0) + ); +end component mist_io; + +component video_mixer + generic ( LINE_LENGTH : integer := 512; HALF_DEPTH : integer := 0 ); + port ( + clk_sys, ce_pix, ce_pix_actual : in std_logic; + SPI_SCK, SPI_SS3, SPI_DI : in std_logic; + scanlines : in std_logic_vector(1 downto 0); + scandoubler_disable, hq2x, ypbpr, ypbpr_full : in std_logic; + + R, G, B : in std_logic_vector(5 downto 0); + HSync, VSync, line_start, mono : in std_logic; + + VGA_R,VGA_G, VGA_B : out std_logic_vector(5 downto 0); + VGA_VS, VGA_HS : out std_logic + ); +end component video_mixer; + +--------- +-- OSD +--------- + +component osd generic ( OSD_COLOR : std_logic_vector(2 downto 0)); port +( + clk_sys : in std_logic; + ce_pix : in std_logic; + + SPI_SCK : in std_logic; + SPI_SS3 : in std_logic; + SPI_DI : in std_logic; + + -- VGA signals coming from core + VGA_Rx : in std_logic_vector(5 downto 0); + VGA_Gx : in std_logic_vector(5 downto 0); + VGA_Bx : in std_logic_vector(5 downto 0); + OSD_HS : in std_logic; + OSD_VS : in std_logic; + + -- VGA signals going to video connector + VGA_R : out std_logic_vector(5 downto 0); + VGA_G : out std_logic_vector(5 downto 0); + VGA_B : out std_logic_vector(5 downto 0) +); +end component osd; + +--------- +-- Scan doubler +--------- +component scandoubler is port +( + clk_sys : in std_logic; + ce_x2 : in std_logic; + ce_x1 : in std_logic; + scanlines : in std_logic_vector(1 downto 0); + + -- c64 input + r_in : in std_logic_vector(5 downto 0); + g_in : in std_logic_vector(5 downto 0); + b_in : in std_logic_vector(5 downto 0); + hs_in : in std_logic; + vs_in : in std_logic; + + -- vga output + r_out : out std_logic_vector(5 downto 0); + g_out : out std_logic_vector(5 downto 0); + b_out : out std_logic_vector(5 downto 0); + hs_out : out std_logic; + vs_out : out std_logic +); +end component; + +--------- +-- audio +--------- + +component sigma_delta_dac port +( + CLK : in std_logic; + RESET : in std_logic; + DACin : in std_logic_vector(14 downto 0); + DACout : out std_logic +); + +end component sigma_delta_dac; + + +-------------------------- +-- cartridge - LCA mar17 - +-------------------------- +component cartridge port +( + romL : in std_logic; -- romL signal in + romH : in std_logic; -- romH signal in + UMAXromH : in std_logic; -- VIC II ultimax read access flag + mem_write : in std_logic; -- memory write active + mem_ce : in std_logic; + mem_ce_out : out std_logic; + IOE : in std_logic; -- IOE signal &DE00 + IOF : in std_logic; -- IOF signal &DF00 + + clk32 : in std_logic; -- 32mhz clock source + reset : in std_logic; -- reset signal + reset_out : out std_logic; -- reset signal + + cart_id : in std_logic_vector(15 downto 0); -- cart ID or cart type + cart_exrom : in std_logic_vector(7 downto 0); -- CRT file EXROM status + cart_game : in std_logic_vector(7 downto 0); -- CRT file GAME status + + cart_bank_laddr : in std_logic_vector(15 downto 0); -- 1st bank loading address + cart_bank_size : in std_logic_vector(15 downto 0); -- length of each bank + cart_bank_num : in std_logic_vector(15 downto 0); + cart_bank_type : in std_logic_vector(7 downto 0); + cart_bank_raddr : in std_logic_vector(24 downto 0); -- chip packet address + cart_bank_wr : in std_logic; + + cart_attached: in std_logic; -- FLAG to say cart has been loaded + cart_loading : in std_logic; + + c64_mem_address_in: in std_logic_vector(15 downto 0); -- address from cpu + c64_data_out: in std_logic_vector(7 downto 0); -- data from cpu going to sdram + + sdram_address_out: out std_logic_vector(24 downto 0); -- translated address output + exrom : out std_logic; -- exrom line + game : out std_logic; -- game line + IOE_ena : out std_logic; + IOF_ena : out std_logic; + max_ram : out std_logic; + freeze_key : in std_logic; + nmi : out std_logic; + nmi_ack : in std_logic +); + +end component cartridge; + + signal pll_locked_in: std_logic_vector(1 downto 0); + signal pll_locked: std_logic; + signal c1541_reset: std_logic; + signal idle: std_logic; + signal ces: std_logic_vector(3 downto 0); + signal iec_cycle: std_logic; + signal iec_cycleD: std_logic; + signal buttons: std_logic_vector(1 downto 0); + + -- signals to connect "data_io" for direct PRG injection + signal ioctl_wr: std_logic; + signal ioctl_addr: std_logic_vector(24 downto 0); + signal ioctl_data: std_logic_vector(7 downto 0); + signal ioctl_index: std_logic_vector(7 downto 0); + signal ioctl_ram_addr: std_logic_vector(24 downto 0); + signal ioctl_ram_data: std_logic_vector(7 downto 0); + signal ioctl_load_addr : std_logic_vector(24 downto 0); + signal ioctl_ram_wr: std_logic; + signal ioctl_iec_cycle_used: std_logic; + signal ioctl_force_erase: std_logic; + signal ioctl_erasing: std_logic; + signal ioctl_download: std_logic; + signal c64_addr: std_logic_vector(15 downto 0); + signal c64_data_in: std_logic_vector(7 downto 0); + signal c64_data_out: std_logic_vector(7 downto 0); + signal sdram_addr: std_logic_vector(24 downto 0); + signal sdram_data_out: std_logic_vector(7 downto 0); + + + +-- cartridge signals LCA + signal cart_id : std_logic_vector(15 downto 0); -- cart ID or cart type + signal cart_bank_laddr : std_logic_vector(15 downto 0) := (others => '0'); -- 1st bank loading address + signal cart_bank_size : std_logic_vector(15 downto 0) := (others => '0'); -- length of each bank + signal cart_bank_num : std_logic_vector(15 downto 0) := (others => '0'); -- bank number + signal cart_bank_type : std_logic_vector(7 downto 0) := (others => '0'); -- bank type + signal cart_exrom : std_logic_vector(7 downto 0); -- CRT file EXROM status + signal cart_game : std_logic_vector(7 downto 0); -- CRT file GAME status + signal cart_attached : std_logic; + signal game : std_logic; -- game line to cpu + signal exrom : std_logic; -- exrom line to cpu + signal IOE_rom : std_logic; + signal IOF_rom : std_logic; + signal max_ram : std_logic; + signal cart_loading : std_logic; + + signal cart_hdr_wr : std_logic; + + signal IOE : std_logic; -- IOE signal + signal IOF : std_logic; -- IOF signal + signal cartridge_reset : std_logic; -- FLAG to reset once cart loaded + signal reset_crt : std_logic; + signal romL : std_logic; -- cart romL from buslogic LCA + signal romH : std_logic; -- cart romH from buslogic LCA + signal UMAXromH : std_logic; -- VIC II Ultimax access - LCA + + signal CPU_hasbus : std_logic; + + signal c1541rom_wr : std_logic; + signal c64rom_wr : std_logic; + + signal joyA : std_logic_vector(7 downto 0); + signal joyB : std_logic_vector(7 downto 0); + signal joyA_int : std_logic_vector(6 downto 0); + signal joyB_int : std_logic_vector(6 downto 0); + signal joyA_c64 : std_logic_vector(6 downto 0); + signal joyB_c64 : std_logic_vector(6 downto 0); + signal reset_key : std_logic; + signal cart_detach_key :std_logic; -- cartridge detach key CTRL-D - LCA + + signal c64_r : std_logic_vector(5 downto 0); + signal c64_g : std_logic_vector(5 downto 0); + signal c64_b : std_logic_vector(5 downto 0); + + signal status : std_logic_vector(31 downto 0); + signal scanlines : std_logic_vector(1 downto 0); + signal hq2x : std_logic; + signal ce_pix_actual : std_logic; + signal sd_lba : std_logic_vector(31 downto 0); + signal sd_rd : std_logic; + signal sd_wr : std_logic; + signal sd_ack : std_logic; + signal sd_ack_conf : std_logic; + signal sd_conf : std_logic; + signal sd_sdhc : std_logic; + signal sd_buff_addr : std_logic_vector(8 downto 0); + signal sd_buff_dout : std_logic_vector(7 downto 0); + signal sd_buff_din : std_logic_vector(7 downto 0); + signal sd_buff_wr : std_logic; + signal sd_change : std_logic; + signal disk_readonly : std_logic; + signal old_download : std_logic; + -- these need to be redirected to the SDRAM + signal sdram_we : std_logic; + signal sdram_ce : std_logic; + + signal ps2_clk : std_logic; + signal ps2_dat : std_logic; + + signal c64_iec_atn_i : std_logic; + signal c64_iec_clk_o : std_logic; + signal c64_iec_data_o : std_logic; + signal c64_iec_atn_o : std_logic; + signal c64_iec_data_i : std_logic; + signal c64_iec_clk_i : std_logic; + + signal c1541_iec_atn_i : std_logic; + signal c1541_iec_clk_o : std_logic; + signal c1541_iec_data_o : std_logic; + signal c1541_iec_atn_o : std_logic; + signal c1541_iec_data_i : std_logic; + signal c1541_iec_clk_i : std_logic; + + signal tv15Khz_mode : std_logic; + signal ypbpr : std_logic; + signal ntsc_init_mode : std_logic; + + alias c64_addr_int : unsigned is unsigned(c64_addr); + alias c64_data_in_int : unsigned is unsigned(c64_data_in); + signal c64_data_in16: std_logic_vector(15 downto 0); + alias c64_data_out_int : unsigned is unsigned(c64_data_out); + + signal clk_ram : std_logic; + signal clk32 : std_logic; + signal clk16 : std_logic; + signal ce_8 : std_logic; + signal ce_4 : std_logic; + signal hq2x160 : std_logic; + signal osdclk : std_logic; + signal clkdiv : std_logic_vector(9 downto 0); + + signal ram_ce : std_logic; + signal ram_we : std_logic; + signal r : unsigned(7 downto 0); + signal g : unsigned(7 downto 0); + signal b : unsigned(7 downto 0); + signal hsync : std_logic; + signal vsync : std_logic; + signal blank : std_logic; + + signal old_vsync : std_logic; + signal hsync_out : std_logic; + signal vsync_out : std_logic; + + signal audio_data : std_logic_vector(17 downto 0); + + signal reset_counter : integer; + signal reset_n : std_logic; + signal led_disk : std_logic; + signal freeze_key : std_logic; + signal nmi : std_logic; + signal nmi_ack : std_logic; + signal erasing : std_logic; +-- temporary signal to extend c64_addr to 24bit LCA + signal c64_addr_temp : std_logic_vector(24 downto 0); + signal cart_blk_len : std_logic_vector(31 downto 0); + signal cart_hdr_cnt : std_logic_vector(3 downto 0); + signal erase_cram : std_logic := '0'; + signal force_erase : std_logic; + signal erase_to : std_logic_vector(4 downto 0) := (others => '0'); + signal mem_ce : std_logic; +begin + + -- 1541 activity led + LED <= not led_disk; + + iec_cycle <= '1' when ces = "1011" else '0'; + + -- User io + mist_io_d : mist_io + generic map (STRLEN => CONF_STR'length) + port map ( + clk_sys => clk32, + + SPI_SCK => SPI_SCK, + CONF_DATA0 => CONF_DATA0, + SPI_SS2 => SPI_SS2, + SPI_DO => SPI_DO, + SPI_DI => SPI_DI, + + joystick_0 => joyA, + joystick_1 => joyB, + + conf_str => to_slv(CONF_STR), + + status => status, + buttons => buttons, + scandoubler_disable => tv15Khz_mode, + ypbpr => ypbpr, + + sd_lba => sd_lba, + sd_rd => sd_rd, + sd_wr => sd_wr, + sd_ack => sd_ack, + sd_ack_conf => sd_ack_conf, + sd_conf => sd_conf, + sd_sdhc => sd_sdhc, + sd_buff_addr => sd_buff_addr, + sd_buff_dout => sd_buff_dout, + sd_buff_din => sd_buff_din, + sd_buff_wr => sd_buff_wr, + img_mounted => sd_change, + ps2_kbd_clk => ps2_clk, + ps2_kbd_data => ps2_dat, + ioctl_download => ioctl_download, + ioctl_force_erase => ioctl_force_erase, + ioctl_erasing => ioctl_erasing, + ioctl_index => ioctl_index, + ioctl_wr => ioctl_wr, + ioctl_addr => ioctl_addr, + ioctl_dout => ioctl_data +); + + + cart_loading <= '1' when ioctl_download = '1' and ioctl_index = 3 else '0'; + + cart : cartridge + port map ( + romL => romL, + romH => romH, + UMAXromH => UMAXromH, + IOE => IOE, + IOF => IOF, + mem_write => not ram_we, + mem_ce => not ram_ce, + mem_ce_out => mem_ce, + + clk32 => clk32, + reset => reset_n, + reset_out => reset_crt, + + cart_id => cart_id, + cart_exrom => cart_exrom, + cart_game => cart_game, + + cart_bank_laddr => cart_bank_laddr, + cart_bank_size => cart_bank_size, + cart_bank_num => cart_bank_num, + cart_bank_type => cart_bank_type, + cart_bank_raddr => ioctl_load_addr, + cart_bank_wr => cart_hdr_wr, + + cart_attached => cart_attached, + cart_loading => cart_loading, + + c64_mem_address_in => c64_addr, + c64_data_out => c64_data_out, + + sdram_address_out => c64_addr_temp, + exrom => exrom, + game => game, + IOE_ena => ioE_rom, + IOF_ena => ioF_rom, + max_ram => max_ram, + freeze_key => freeze_key, + nmi => nmi, + nmi_ack => nmi_ack + ); + + -- rearrange joystick contacta for c64 + joyA_int <= joyA(6 downto 4) & joyA(0) & joyA(1) & joyA(2) & joyA(3); + joyB_int <= joyB(6 downto 4) & joyB(0) & joyB(1) & joyB(2) & joyB(3); + + -- swap joysticks if requested + joyA_c64 <= joyB_int when status(3)='1' else joyA_int; + joyB_c64 <= joyA_int when status(3)='1' else joyB_int; + + sdram_addr <= c64_addr_temp when iec_cycle='0' else ioctl_ram_addr; + sdram_data_out <= c64_data_out when iec_cycle='0' else ioctl_ram_data; + + -- ram_we and ce are active low + sdram_ce <= mem_ce when iec_cycle='0' else ioctl_iec_cycle_used; + sdram_we <= not ram_we when iec_cycle='0' else ioctl_iec_cycle_used; + + process(clk32) + begin + if falling_edge(clk32) then + + old_download <= ioctl_download; + iec_cycleD <= iec_cycle; + cart_hdr_wr <= '0'; + + if(iec_cycle='1' and iec_cycleD='0' and ioctl_ram_wr='1') then + ioctl_ram_wr <= '0'; + ioctl_iec_cycle_used <= '1'; + ioctl_ram_addr <= ioctl_load_addr; + ioctl_load_addr <= ioctl_load_addr + "1"; + if erasing = '1' then + ioctl_ram_data <= (others => '0'); + else + ioctl_ram_data <= ioctl_data; + end if; + else + if(iec_cycle='0') then + ioctl_iec_cycle_used <= '0'; + end if; + end if; + + if ioctl_wr='1' then + if ioctl_index = 2 then + if ioctl_addr = 0 then + ioctl_load_addr(7 downto 0) <= ioctl_data; + elsif(ioctl_addr = 1) then + ioctl_load_addr(15 downto 8) <= ioctl_data; + else + ioctl_ram_wr <= '1'; + end if; + end if; + + if ioctl_index = 3 then--CRT, e0(MAX) + if ioctl_addr = 0 then + ioctl_load_addr <= '0' & X"100000"; + cart_blk_len <= (others => '0'); + cart_hdr_cnt <= (others => '0'); + end if; + + if(ioctl_addr = X"16") then cart_id(15 downto 8) <= ioctl_data; end if; + if(ioctl_addr = X"17") then cart_id(7 downto 0) <= ioctl_data; end if; + if(ioctl_addr = X"18") then cart_exrom(7 downto 0)<= ioctl_data; end if; + if(ioctl_addr = X"19") then cart_game(7 downto 0) <= ioctl_data; end if; + + if(ioctl_addr >= X"40") then + if cart_blk_len = 0 and cart_hdr_cnt = 0 then + cart_hdr_cnt <= X"1"; + if ioctl_load_addr(12 downto 0) /= 0 then + -- align to 8KB boundary + ioctl_load_addr(12 downto 0) <= '0' & X"000"; + ioctl_load_addr(24 downto 13) <= ioctl_load_addr(24 downto 13) + "1"; + end if; + elsif cart_hdr_cnt /= 0 then + cart_hdr_cnt <= cart_hdr_cnt + "1"; + if(cart_hdr_cnt = 4) then cart_blk_len(31 downto 24) <= ioctl_data; end if; + if(cart_hdr_cnt = 5) then cart_blk_len(23 downto 16) <= ioctl_data; end if; + if(cart_hdr_cnt = 6) then cart_blk_len(15 downto 8) <= ioctl_data; end if; + if(cart_hdr_cnt = 7) then cart_blk_len(7 downto 0) <= ioctl_data; end if; + if(cart_hdr_cnt = 8) then cart_blk_len <= cart_blk_len - X"10"; end if; + if(cart_hdr_cnt = 9) then cart_bank_type <= ioctl_data; end if; + if(cart_hdr_cnt = 10) then cart_bank_num(15 downto 8) <= ioctl_data; end if; + if(cart_hdr_cnt = 11) then cart_bank_num(7 downto 0) <= ioctl_data; end if; + if(cart_hdr_cnt = 12) then cart_bank_laddr(15 downto 8)<= ioctl_data; end if; + if(cart_hdr_cnt = 13) then cart_bank_laddr(7 downto 0) <= ioctl_data; end if; + if(cart_hdr_cnt = 14) then cart_bank_size(15 downto 8) <= ioctl_data; end if; + if(cart_hdr_cnt = 15) then cart_bank_size(7 downto 0) <= ioctl_data; end if; + if(cart_hdr_cnt = 15) then cart_hdr_wr <= '1'; end if; + else + cart_blk_len <= cart_blk_len - "1"; + ioctl_ram_wr <= '1'; + end if; + end if; + end if; + end if; + + if old_download /= ioctl_download and ioctl_index = 3 then + cart_attached <= old_download; + erase_cram <= '1'; + end if; + + if status(5)='1' or buttons(1)='1' then + cart_attached <= '0'; + end if; + + if erasing='0' and force_erase = '1' then + erasing <='1'; + ioctl_load_addr <= (others => '0'); + end if; + + if erasing = '1' and ioctl_ram_wr = '0' then + erase_to <= erase_to + "1"; + if erase_to = "11111" then + if ioctl_load_addr < (erase_cram & X"FFFF") then + ioctl_ram_wr <= '1'; + else + erasing <= '0'; + erase_cram <= '0'; + end if; + end if; + end if; + end if; + end process; + + c64rom_wr <= ioctl_wr when (ioctl_index = 0) and (ioctl_addr(14) = '0') and (ioctl_download = '1') else '0'; + c1541rom_wr <= ioctl_wr when (ioctl_index = 0) and (ioctl_addr(14) = '1') and (ioctl_download = '1') else '0'; + + process(clk32) + begin + if rising_edge(clk32) then + clk16 <= not clk16; + clkdiv <= std_logic_vector(unsigned(clkdiv)+1); + if(clkdiv(1 downto 0) = "00") then + ce_8 <= '1'; + else + ce_8 <= '0'; + end if; + if(clkdiv(2 downto 0) = "000") then + ce_4 <= '1'; + else + ce_4 <= '0'; + end if; + end if; + end process; + + ntsc_init_mode <= status(2); + + -- second to generate 64mhz clock and phase shifted ram clock + pll : entity work.pll + port map( + inclk0 => CLOCK_27, + c0 => clk_ram, + c1 => SDRAM_CLK, + c2 => clk32, + locked => pll_locked + ); + + process(clk32) + begin + if rising_edge(clk32) then + -- Reset by: + -- Button at device, IO controller reboot, OSD or FPGA startup + if status(0)='1' or pll_locked = '0' then + reset_counter <= 1000000; + reset_n <= '0'; + elsif buttons(1)='1' or status(5)='1' or reset_key = '1' or reset_crt='1' or (ioctl_download='1' and ioctl_index = 3) then + reset_counter <= 255; + reset_n <= '0'; + elsif ioctl_download ='1' then + elsif erasing ='1' then + force_erase <= '0'; + else + if reset_counter = 0 then + reset_n <= '1'; + else + reset_counter <= reset_counter - 1; + if reset_counter = 100 then + force_erase <='1'; + end if; + end if; + end if; + end if; + end process; + + SDRAM_DQ(15 downto 8) <= (others => 'Z') when sdram_we='0' else (others => '0'); + SDRAM_DQ(7 downto 0) <= (others => 'Z') when sdram_we='0' else sdram_data_out; + + -- read from sdram + c64_data_in <= SDRAM_DQ(7 downto 0); + -- clock is always enabled and memory is never masked as we only + -- use one byte + SDRAM_CKE <= '1'; + SDRAM_DQML <= '0'; + SDRAM_DQMH <= '0'; + + sdr: sdram port map( + sd_addr => SDRAM_A, + sd_ba => SDRAM_BA, + sd_cs => SDRAM_nCS, + sd_we => SDRAM_nWE, + sd_ras => SDRAM_nRAS, + sd_cas => SDRAM_nCAS, + + clk => clk_ram, + addr => sdram_addr, + init => not pll_locked, + we => sdram_we, + refresh => idle, + ce => sdram_ce + ); + + + -- decode audio + dac_l : sigma_delta_dac + port map ( + CLK => clk32, + DACin => not audio_data(17) & audio_data(16 downto 3), + DACout => AUDIO_L, + RESET => '0' + ); + + dac_r : sigma_delta_dac + port map ( + CLK => clk32, + DACin => not audio_data(17) & audio_data(16 downto 3), + DACout => AUDIO_R, + RESET => '0' + ); + + fpga64 : entity work.fpga64_sid_iec + port map( + clk32 => clk32, + reset_n => reset_n, + c64gs => status(11), + kbd_clk => not ps2_clk, + kbd_dat => ps2_dat, + ramAddr => c64_addr_int, + ramDataOut => c64_data_out_int, + ramDataIn => c64_data_in_int, + ramCE => ram_ce, + ramWe => ram_we, + ntscInitMode => ntsc_init_mode, + hsync => hsync, + vsync => vsync, + r => r, + g => g, + b => b, + game => game, + exrom => exrom, + UMAXromH => UMAXromH, + CPU_hasbus => CPU_hasbus, + ioE_rom => ioE_rom, + ioF_rom => ioF_rom, + max_ram => max_ram, + irq_n => '1', + nmi_n => not nmi, + nmi_ack => nmi_ack, + freeze_key => freeze_key, + dma_n => '1', + romL => romL, + romH => romH, + IOE => IOE, + IOF => IOF, + ba => open, + joyA => unsigned(joyA_c64), + joyB => unsigned(joyB_c64), + serioclk => open, + ces => ces, + SIDclk => open, + still => open, + idle => idle, + audio_data => audio_data, + extfilter_en => not status(6), + iec_data_o => c64_iec_data_o, + iec_atn_o => c64_iec_atn_o, + iec_clk_o => c64_iec_clk_o, + iec_data_i => not c64_iec_data_i, + iec_clk_i => not c64_iec_clk_i, + iec_atn_i => not c64_iec_atn_i, + disk_num => open, + c64rom_addr => ioctl_addr(13 downto 0), + c64rom_data => ioctl_data, + c64rom_wr => c64rom_wr, + cart_detach_key => cart_detach_key, + reset_key => reset_key + ); + + + c64_iec_atn_i <= not ((not c64_iec_atn_o) and (not c1541_iec_atn_o) ); + c64_iec_data_i <= not ((not c64_iec_data_o) and (not c1541_iec_data_o)); + c64_iec_clk_i <= not ((not c64_iec_clk_o) and (not c1541_iec_clk_o) ); + + c1541_iec_atn_i <= c64_iec_atn_i; + c1541_iec_data_i <= c64_iec_data_i; + c1541_iec_clk_i <= c64_iec_clk_i; + + process(clk32, reset_n) + variable reset_cnt : integer range 0 to 32000000; + begin + if reset_n = '0' then + reset_cnt := 100000; + elsif rising_edge(clk32) then + if reset_cnt /= 0 then + reset_cnt := reset_cnt - 1; + end if; + end if; + + if reset_cnt = 0 then + c1541_reset <= '0'; + else + c1541_reset <= '1'; + end if; + end process; + + c1541_sd : entity work.c1541_sd + port map + ( + clk32 => clk32, + reset => c1541_reset, + + c1541rom_addr => ioctl_addr(13 downto 0), + c1541rom_data => ioctl_data, + c1541rom_wr => c1541rom_wr, + + disk_change => sd_change, + disk_readonly => disk_readonly, + + iec_atn_i => c1541_iec_atn_i, + iec_data_i => c1541_iec_data_i, + iec_clk_i => c1541_iec_clk_i, + + iec_atn_o => c1541_iec_atn_o, + iec_data_o => c1541_iec_data_o, + iec_clk_o => c1541_iec_clk_o, + + sd_lba => sd_lba, + sd_rd => sd_rd, + sd_wr => sd_wr, + sd_ack => sd_ack, + sd_ack_conf => sd_ack_conf, + sd_conf => sd_conf, + sd_sdhc => sd_sdhc, + sd_buff_addr => sd_buff_addr, + sd_buff_dout => sd_buff_dout, + sd_buff_din => sd_buff_din, + sd_buff_wr => sd_buff_wr, + + led => led_disk + ); + + comp_sync : entity work.composite_sync + port map( + clk32 => clk32, + hsync => hsync, + vsync => vsync, + ntsc => ntsc_init_mode, + hsync_out => hsync_out, + vsync_out => vsync_out, + blank => blank + ); + + c64_r <= (others => '0') when blank = '1' else std_logic_vector(r(7 downto 2)); + c64_g <= (others => '0') when blank = '1' else std_logic_vector(g(7 downto 2)); + c64_b <= (others => '0') when blank = '1' else std_logic_vector(b(7 downto 2)); + + scanlines <= status(10 downto 9); + hq2x <= status(9) xor status(8); + ce_pix_actual <= ce_4 when hq2x160='1' else ce_8; + + process(clk32) + begin + if rising_edge(clk32) then + if((old_vsync = '0') and (vsync_out = '1')) then + if(status(10 downto 8)="010") then + hq2x160 <= '1'; + else + hq2x160 <= '0'; + end if; + end if; + old_vsync <= vsync_out; + end if; + end process; + + vmixer : video_mixer + port map ( + clk_sys => clk_ram, + ce_pix => ce_8, + ce_pix_actual => ce_pix_actual, + + SPI_SCK => SPI_SCK, + SPI_SS3 => SPI_SS3, + SPI_DI => SPI_DI, + + scanlines => scanlines, + scandoubler_disable => tv15Khz_mode, + hq2x => hq2x, + ypbpr => ypbpr, + ypbpr_full => '1', + + R => c64_r, + G => c64_g, + B => c64_b, + HSync => hsync_out, + VSync => vsync_out, + line_start => '0', + mono => '0', + + VGA_R => VGA_R, + VGA_G => VGA_G, + VGA_B => VGA_B, + VGA_VS => VGA_VS, + VGA_HS => VGA_HS + ); + +end struct; diff --git a/Commodore - 64_Mist/rtl/cartridge.v b/Commodore - 64_Mist/rtl/cartridge.v new file mode 100644 index 00000000..f8b4f3b2 --- /dev/null +++ b/Commodore - 64_Mist/rtl/cartridge.v @@ -0,0 +1,566 @@ +module cartridge +( + input romL, // romL signal in + input romH, // romH signal in + input UMAXromH, // romH VIC II address signal + input IOE, // IOE control signal + input IOF, // IOF control signal + input mem_write, // memory write active + input mem_ce, + output mem_ce_out, + + input clk32, // 32mhz clock source + input reset, // reset signal + output reg reset_out, // reset signal + + input [15:0] cart_id, // cart ID or cart type + input [7:0] cart_exrom, // CRT file EXROM status + input [7:0] cart_game, // CRT file GAME status + + input [15:0] cart_bank_laddr, // bank loading address + input [15:0] cart_bank_size, // length of each bank + input [15:0] cart_bank_num, + input [7:0] cart_bank_type, + input [24:0] cart_bank_raddr, // chip packet address + input cart_bank_wr, + + input cart_attached, // FLAG to say cart has been loaded + input cart_loading, + + input [15:0] c64_mem_address_in, // address from cpu + input [7:0] c64_data_out, // data from cpu going to sdram + + output [24:0] sdram_address_out, // translated address output + output exrom, // exrom line + output game, // game line + output reg IOE_ena, // FLAG to enable IOE address relocation + output reg IOF_ena, // FLAG to enable IOF address relocation + output reg max_ram, // Enable whole C64 RAM in Ultimax mode + + input freeze_key, + output reg nmi, + input nmi_ack +); + +reg [24:0] addr_out; +assign sdram_address_out = addr_out; + +reg [6:0] bank_lo; +reg [6:0] bank_hi; +reg [12:0] mask_lo; + +reg [6:0] IOE_bank; +reg [6:0] IOF_bank; +reg IOE_wr_ena; +reg IOF_wr_ena; + +reg exrom_overide; +reg game_overide; +assign exrom = ~cart_attached | exrom_overide; +assign game = ~cart_attached | game_overide; + +(* ramstyle = "logic" *) reg [6:0] lobanks[0:63]; +(* ramstyle = "logic" *) reg [6:0] hibanks[0:63]; + +reg [7:0] bank_cnt; +always @(posedge clk32) begin + reg old_loading; + old_loading <= cart_loading; + + if(~old_loading & cart_loading) bank_cnt <= 0; + if(cart_bank_wr) begin + bank_cnt <= bank_cnt + 1'd1; + if(cart_bank_num<64) begin + if(cart_bank_laddr <= 'h8000) begin + lobanks[cart_bank_num[5:0]] <= cart_bank_raddr[19:13]; + if(cart_bank_size > 'h2000) hibanks[cart_bank_num[5:0]] <= cart_bank_raddr[19:13]+1'd1; + end + else hibanks[cart_bank_num[5:0]] <= cart_bank_raddr[19:13]; + end + end +end + +reg romL_we = 0; +reg romH_we = 0; + +reg old_ioe, old_iof; +always @(posedge clk32) begin + old_ioe <= IOE; + old_iof <= IOF; +end + +wire stb_ioe = (~old_ioe & IOE); +wire stb_iof = (~old_iof & IOF); + +wire ioe_wr = stb_ioe & mem_write; +wire ioe_rd = stb_ioe & ~mem_write; + +wire iof_wr = stb_iof & mem_write; +//wire iof_rd = stb_iof & ~mem_write; + +reg old_freeze = 0; +wire freeze_req = (~old_freeze & freeze_key); + +reg old_nmiack = 0; +wire freeze_ack = (nmi & ~old_nmiack & nmi_ack); + +// 0018 - EXROM line status +// 0019 - GAME line status + +always @(posedge clk32) begin + reg init_n = 0; + reg allow_freeze = 0; + reg saved_d6 = 0; + reg [15:0] count; + reg count_ena; + reg cart_disable = 0; + + old_freeze <= freeze_key; + if(freeze_req & allow_freeze) nmi <= 1; + + old_nmiack <= nmi_ack; + if(freeze_ack) nmi <= 0; + + if(!reset) begin + cart_disable <= 0; + bank_lo <= 0; + bank_hi <= 0; + IOE_ena <= 0; + IOF_ena <= 0; + IOE_wr_ena <= 0; + IOF_wr_ena <= 0; + romL_we <= 0; + romH_we <= 0; + reset_out <= 0; + init_n <= 0; + allow_freeze <= 1; + nmi <= 0; + saved_d6 <= 0; + mask_lo <= 13'h1FFF; + exrom_overide <= 1; + game_overide <= 1; + max_ram <= 0; + end + else + case(cart_id) + + // Generic 8k(exrom=0,game=1), 16k(exrom=0,game=0), ULTIMAX(exrom=1,game=0) + 0: begin + exrom_overide <= cart_exrom[0]; + game_overide <= cart_game[0]; + bank_lo <= lobanks[0]; + bank_hi <= hibanks[0]; + end + + // Action Replay v4+ - (32k 4x8k banks + 8K RAM) + // controlled by DE00 + 1: begin + if(nmi) allow_freeze <= 0; + if(!init_n || freeze_ack) begin + cart_disable <= 0; + exrom_overide <= 1; + game_overide <= 0; + romL_we <= 0; + bank_lo <= 0; + bank_hi <= 0; + IOF_bank <= 0; + IOF_wr_ena <= 0; + IOF_ena <= 1; + if(~init_n) begin + init_n <= 1; + exrom_overide <= 0; + game_overide <= 1; + end + end + else if(cart_disable) begin + exrom_overide <= 1; + game_overide <= 1; + IOF_ena <= 0; + IOF_wr_ena <= 0; + romL_we <= 0; + allow_freeze <= 1; + end else begin + if(ioe_wr) begin + cart_disable <= c64_data_out[2]; + bank_lo <= c64_data_out[4:3]; + bank_hi <= c64_data_out[4:3]; + IOF_bank <= c64_data_out[4:3]; + + if(c64_data_out[6] | allow_freeze) begin + allow_freeze <= 1; + game_overide <= ~c64_data_out[0]; + exrom_overide <= c64_data_out[1]; + IOF_wr_ena <= c64_data_out[5]; + romL_we <= c64_data_out[5]; + if(c64_data_out[5]) begin + bank_lo <= 0; + IOF_bank<= 0; + end + end + end + end + end + + // Final Cart III - (64k 4x16k banks) + // all banks @ $8000-$BFFF - switching by $DFFF + 3: begin + if(!init_n) begin + init_n <= 1; + game_overide <= 0; + exrom_overide<= 0; + cart_disable <= 0; + bank_lo <= 0; + bank_hi <= 1; + IOE_ena <= 1; + IOE_bank<= 0; + IOF_ena <= 1; + IOF_bank<= 0; + end + else if(!cart_disable) begin + if(iof_wr && &c64_mem_address_in[7:0]) begin + bank_lo <= {c64_data_out[1:0],1'd0}; + bank_hi <= {c64_data_out[1:0],1'd1}; + IOE_bank<= {c64_data_out[1:0],1'd0}; + IOF_bank<= {c64_data_out[1:0],1'd0}; + exrom_overide <= c64_data_out[4]; + game_overide <= c64_data_out[5]; + saved_d6 <= c64_data_out[6]; + if(~freeze_key & saved_d6 & ~c64_data_out[6]) nmi <= 1; + if(c64_data_out[6]) allow_freeze <= 1; + cart_disable <= c64_data_out[7]; + end + end + if(freeze_ack) begin + cart_disable <= 0; + game_overide <= 0; + allow_freeze <= 0; + end + end + + // Simons Basic - (game=0, exrom=0, 2 banks by 8k) + // Read to IOE switches 8k config + // Write to IOE switches 16k config + 4: begin + if(!init_n) begin + init_n <= 1; + exrom_overide <= 0; + game_overide <= 0; + bank_lo <= 0; + bank_hi <= 1; + end + if(ioe_wr) game_overide <= 0; + if(ioe_rd) game_overide <= 1; + end + + // Ocean Type 1 - (game=0, exrom=0, 128k,256k or 512k in 8k banks) + // BANK is written to lower 6 bits of $DE00 - bit 8 is always set + // best to mirror banks at $8000 and $A000 + 5: begin + exrom_overide <= 0; + game_overide <= 0; + if(ioe_wr) begin + bank_lo <= c64_data_out[5:0]; + bank_hi <= c64_data_out[5:0]; + end + end + + // PowerPlay, FunPlay + 7: begin + if(~init_n) begin + init_n <= 1; + exrom_overide <= 0; + game_overide <= 1; + end + + if(ioe_wr) begin + bank_lo <= {c64_data_out[0],c64_data_out[5:3]}; + if({c64_data_out[7:6],c64_data_out[2:1]} == 'b1011) exrom_overide <= 1; + if({c64_data_out[7:6],c64_data_out[2:1]} == 'b0000) exrom_overide <= 0; + end + end + + // "Super Games" + 8: begin + if(~init_n) begin + init_n <= 1; + exrom_overide <= 0; + game_overide <= 0; + bank_lo <= 0; + bank_hi <= 1; + end + + if(~cart_disable & iof_wr) begin + bank_lo <= {c64_data_out[1:0],1'd0}; + bank_hi <= {c64_data_out[1:0],1'd1}; + game_overide <= c64_data_out[2]; + exrom_overide <= c64_data_out[2]; + cart_disable <= c64_data_out[3]; + end + end + + // Epyx Fastload - (game=1, exrom=0, 8k bank) + // any access to romL or $DE00 charges a capacitor + // Once discharged the exrom drops to ON disabling cart + 10: begin + if(!init_n) count_ena <= 0; + if(IOE || romL) count_ena <= 1; + + if(!init_n || IOE || romL) begin + init_n <= 1; + game_overide <= 1; + exrom_overide <= 0; + count <= 16384; + IOF_ena <= 1; + IOF_bank<= 0; + end + else + if(count_ena) begin + if(count) count <= count - 1'd1; + else exrom_overide <= 1; + end + end + + // FINAL CARTRIDGE 1,2 + // 16k rom - IOE turns off rom / IOF turns rom on + 13: begin + if(!init_n) begin + init_n <= 1; + + bank_lo <= 0; + bank_hi <= 1; + game_overide <= 0; + exrom_overide <= 0; + + // Last 2 pages visible at IOE / IOF + IOE_bank <= 0; + IOF_bank <= 0; + IOE_ena <= 1; + IOF_ena <= 1; + end + + if(freeze_ack) begin + game_overide <= 0; + allow_freeze <= 0; + end + + if(IOE) begin + game_overide <= 1; + exrom_overide <= 1; + allow_freeze <= 1; + end + + if(IOF) begin + game_overide <= 0; + exrom_overide <= 0; + end + end + + // C64GS - (game=1, exrom=0, 64 banks by 8k) + // 8k config + // Reading from IOE ($DE00 $DEFF) switches to bank 0 + 15: begin + game_overide <= 1; + exrom_overide <= 0; + if(ioe_rd) bank_lo <= 0; + if(ioe_wr) bank_lo <= c64_mem_address_in[5:0]; + end + + // Dinamic - (game=1, exrom=0, 16 banks by 8k) + 17: begin + game_overide <= 1; + exrom_overide <= 0; + if(ioe_rd) bank_lo <= c64_mem_address_in[3:0]; + end + + // Zaxxon, Super Zaxxon (game=0, exrom=0 - 4Kb + 2x8KB) + 18: begin + mask_lo <= 'hFFF; + game_overide <= 0; + exrom_overide <= 0; + if(romL & mem_ce & ~c64_mem_address_in[12]) bank_hi <= 1; + if(romL & mem_ce & c64_mem_address_in[12]) bank_hi <= 2; + end + + // Magic Desk - (game=1, exrom=0 = 4/8/16 8k banks) + 19: begin + if(!init_n) begin + init_n <= 1; + game_overide <= 1; + exrom_overide <= 0; + bank_lo <= 0; + end + + if(ioe_wr) begin + bank_lo <= c64_data_out[3:0]; + exrom_overide <= c64_data_out[7]; + end + end + + // Super Snapshot v5 -(64k rom 8*8k banks/4*16k banks, 32k ram 4*8k banks) + 20: begin + if(!init_n || freeze_ack) begin + init_n <= 1; + romL_we <= 1; + bank_lo <= 0; + bank_hi <= 1; + game_overide <= 0; + exrom_overide <= 1; + IOE_bank <= 0; + IOE_ena <= 1; + cart_disable <= 0; + end + else + if(~cart_disable & ioe_wr) begin + game_overide <= c64_data_out[0] | c64_data_out[3]; + exrom_overide<= ~c64_data_out[1] | c64_data_out[3]; + bank_lo <= {c64_data_out[4], c64_data_out[2], 1'b0}; + bank_hi <= {c64_data_out[4], c64_data_out[2], 1'b1}; + IOE_bank<= {c64_data_out[4], c64_data_out[2], 1'b0}; + cart_disable <= c64_data_out[3]; + IOE_ena <= ~c64_data_out[3]; + + //RAM overlay + if(~c64_data_out[1]) bank_lo <= {c64_data_out[4], c64_data_out[2]}; + romL_we <= ~c64_data_out[1]; + end + end + + // Comal80 - (game=0, exrom=0, 4 banks by 16k) + 21: begin + if(!init_n) begin + init_n <= 1; + bank_lo <= 0; + bank_hi <= 1; + game_overide <= 0; + exrom_overide <= 0; + end + if(ioe_wr) begin + case(c64_data_out[7:5]) + 'b010: + begin + exrom_overide <= 0; + game_overide <= 1; + end + 'b111: + begin + exrom_overide <= 1; + game_overide <= 1; + end + default: + begin + exrom_overide <= 0; + game_overide <= 0; + end + endcase + + bank_lo <= {c64_data_out[1:0], 1'b0}; + bank_hi <= {c64_data_out[1:0], 1'b1}; + end + end + + // Mikro Assembler - (game=1, exrom=0, 8k) + 28: begin + game_overide <= 1; + exrom_overide <= 0; + IOE_bank <= 0; + IOE_ena <= 1; + IOF_bank <= 0; + IOF_ena <= 1; + end + + // EASYFLASH - 1mb 128x8k/64x16k, XBank format(33) looks the same + // upd: original Easyflash(32) boots in ultimax mode. + // Only one XBank(33) cart has been found: soulless-xbank. It doesn't boot in ultimax mode. + 32, + 33: begin + if(!init_n) begin + init_n <= 1; + IOF_bank<= 0; + IOF_ena <= 1; + IOF_wr_ena <= 1; + exrom_overide <= (cart_id==32); + game_overide <= 0; + bank_lo <= lobanks[0]; + bank_hi <= hibanks[0]; + end + + if(ioe_wr) begin + if(c64_mem_address_in[1]) begin + game_overide <= ~c64_data_out[0] & c64_data_out[2]; //assume jumper in boot position bit2=0 -> game=0 + exrom_overide <= ~c64_data_out[1]; + end + else begin + bank_lo <= lobanks[c64_data_out[5:0]]; + bank_hi <= hibanks[c64_data_out[5:0]]; + end + end + end + + // Kingsoft Business Basic + 54: begin + max_ram <= 1; + + if(!init_n || ioe_rd) begin + init_n <= 1; + game_overide <= 0; + exrom_overide <= 0; + bank_lo <= 0; + bank_hi <= 1; + end + + if(ioe_wr) begin + game_overide <= 0; + exrom_overide <= 1; + bank_lo <= 0; + bank_hi <= 2; + end + end + + // RGCD (game=1, exrom=0, 8 banks by 8k) + 57: begin + if(!init_n) begin + init_n <= 1; + game_overide <= 1; + exrom_overide <= 0; + bank_lo <= 0; + end + + if(~cart_disable & ioe_wr) begin + bank_lo <= c64_data_out[2:0]; + if(c64_data_out[3]) begin + cart_disable <= 1; + game_overide <= 1; + exrom_overide <= 1; + end + end + end + endcase +end + +// ************************************************************************************************************ +// ****** Address handling - Redirection to SDRAM CRT file +// ************************************************************************************************************ + +wire ioe_ce = (IOE && (mem_write ? IOE_wr_ena : IOE_ena)); +wire iof_ce = (IOF && (mem_write ? IOF_wr_ena : IOF_ena)); + +assign mem_ce_out = mem_ce | ioe_ce | iof_ce; + +//RAM banks are remapped to 64K-128K space +always @(*) begin + addr_out = c64_mem_address_in; + if(cart_attached) begin + if(romH & (romH_we | ~mem_write)) addr_out[24:13] = romH_we ? {1'b1, bank_hi[2:0]} : {1'b1, bank_hi}; + if(romL & (romL_we | ~mem_write)) begin + addr_out[24:13] = romL_we ? {1'b1, bank_lo[2:0]} : {1'b1, bank_lo}; + addr_out[12:0] = c64_mem_address_in[12:0] & mask_lo; + end + + if(ioe_ce) addr_out[24:13] = IOE_wr_ena ? {1'b1, IOE_bank[2:0]} : {1'b1, IOE_bank}; // read/write to DExx + if(iof_ce) addr_out[24:13] = IOF_wr_ena ? {1'b1, IOF_bank[2:0]} : {1'b1, IOF_bank}; // read/write to DFxx + + if(UMAXromH && !mem_write) addr_out[24:12] = {1'b1, bank_hi, 1'b1}; // ULTIMAX CharROM + end +end + +endmodule diff --git a/Commodore - 64_Mist/rtl/cia6526.vhd b/Commodore - 64_Mist/rtl/cia6526.vhd new file mode 100644 index 00000000..25eb4255 --- /dev/null +++ b/Commodore - 64_Mist/rtl/cia6526.vhd @@ -0,0 +1,782 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- 6526 Complex Interface Adapter +-- +-- rev 1 - june17 / TOD alarms +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity cia6526 is + generic ( + todEnabled : std_logic := '1' + ); + port ( + clk: in std_logic; + todClk: in std_logic; + reset: in std_logic; + enable: in std_logic; + cs: in std_logic; + we: in std_logic; -- Write strobe + rd: in std_logic; -- Read strobe + + addr: in unsigned(3 downto 0); + di: in unsigned(7 downto 0); + do: out unsigned(7 downto 0); + + ppai: in unsigned(7 downto 0); + ppao: out unsigned(7 downto 0); + ppad: out unsigned(7 downto 0); + + ppbi: in unsigned(7 downto 0); + ppbo: out unsigned(7 downto 0); + ppbd: out unsigned(7 downto 0); + + flag_n: in std_logic; + + irq_n: out std_logic + ); +end cia6526; + +-- ----------------------------------------------------------------------- + +architecture Behavioral of cia6526 is + -- IO ports + signal pra: unsigned(7 downto 0); + signal prb: unsigned(7 downto 0); + signal ddra: unsigned(7 downto 0); + signal ddrb: unsigned(7 downto 0); + + -- Timer to IO ports + signal timerAPulse : std_logic; + signal timerAToggle : std_logic; + signal timerBPulse : std_logic; + signal timerBToggle : std_logic; + + -- Timer A reload registers + signal talo: unsigned(7 downto 0) := (others => '1'); + signal tahi: unsigned(7 downto 0) := (others => '1'); + + -- Timer B reload registers + signal tblo: unsigned(7 downto 0) := (others => '1'); + signal tbhi: unsigned(7 downto 0) := (others => '1'); + + -- Timer A and B internal registers + signal timerA : unsigned(15 downto 0); + signal forceTimerA : std_logic; + signal loadTimerA : std_logic; + signal clkTimerA : std_logic; -- internal timer clock + + signal timerB: unsigned(15 downto 0); + signal forceTimerB : std_logic; + signal loadTimerB : std_logic; + signal clkTimerB : std_logic; -- internal timer clock + + signal WR_Delay_offset : std_logic; -- adjustable WR signal delay - LCA jun17 + + -- Config register A + signal cra_start : std_logic; + signal cra_pbon : std_logic; + signal cra_outmode : std_logic; + signal cra_runmode : std_logic; + signal cra_runmode_reg : std_logic; + signal cra_inmode : std_logic; + signal cra_spmode : std_logic; + signal cra_todin : std_logic; + + -- Config register B + signal crb_start : std_logic; + signal crb_pbon : std_logic; + signal crb_outmode : std_logic; + signal crb_runmode : std_logic; + signal crb_runmode_reg : std_logic; + signal crb_inmode5 : std_logic; + signal crb_inmode6 : std_logic; + signal crb_alarm : std_logic; + + -- TOD 50/60 hz clock + signal todTick : std_logic; + signal oldTodClk : std_logic; + signal tod_clkcnt: unsigned(2 downto 0); + + -- TOD counters + signal tod_running: std_logic; + signal tod_10ths: unsigned(3 downto 0); + signal tod_secs: unsigned(6 downto 0); + signal tod_mins: unsigned(6 downto 0); + signal tod_hrs: unsigned(7 downto 0); + signal tod_pm: std_logic; + + -- TOD latches + signal tod_latched: std_logic; + signal tod_latch_10ths: unsigned(3 downto 0); + signal tod_latch_secs: unsigned(6 downto 0); + signal tod_latch_mins: unsigned(6 downto 0); + signal tod_latch_hrs: unsigned(7 downto 0); + constant tod_latch_pm: std_logic := '0'; + + -- TOD alarms - LCA + signal tod_10ths_alarm: unsigned(3 downto 0); + signal tod_secs_alarm: unsigned(6 downto 0); + signal tod_mins_alarm: unsigned(6 downto 0); + signal tod_hrs_alarm: unsigned(7 downto 0); + signal tod_pm_alarm: std_logic; + + -- Interrupt processing + signal resetIrq : boolean; + signal intr_flagn : std_logic; + signal intr_serial : std_logic; + signal intr_alarm : std_logic; -- LCA + signal intr_timerA : std_logic; + signal intr_timerB : std_logic; + signal mask_timerA : std_logic; + signal mask_timerB : std_logic; + signal mask_alarm : std_logic; -- LCA + signal mask_serial : std_logic; + signal mask_flagn : std_logic; + signal ir: std_logic; + + signal prevFlag_n: std_logic; + + signal myWr : std_logic; + signal myRd : std_logic; +begin +-- ----------------------------------------------------------------------- +-- chip-select signals +-- ----------------------------------------------------------------------- + myWr <= cs and we; + myRd <= cs and rd; + +-- ----------------------------------------------------------------------- +-- I/O ports +-- ----------------------------------------------------------------------- + -- Port A + process(pra, ddra) + begin + ppad <= ddra; + ppao <= pra or (not ddra); + end process; + + -- Port B + process(prb, ddrb, cra_pbon, cra_outmode, crb_pbon, crb_outmode, timerAPulse, timerAToggle, timerBPulse, timerBToggle) + begin + ppbd <= ddrb; + ppbo <= prb or (not ddrb); + if cra_pbon = '1' then + ppbo(6) <= timerAPulse or (not ddrb(6)); + if cra_outmode = '1' then + ppbo(6) <= timerAToggle or (not ddrb(6)); + end if; + end if; + if crb_pbon = '1' then + ppbo(7) <= timerBPulse or (not ddrb(7)); + if crb_outmode = '1' then + ppbo(7) <= timerBToggle or (not ddrb(7)); + end if; + end if; + end process; + + -- I/O port registers + process(clk) + begin + if rising_edge(clk) then + if myWr = '1' then + case addr is + when X"0" => pra <= di; + when X"1" => prb <= di; + when X"2" => ddra <= di; + when X"3" => ddrb <= di; + when others => null; + end case; + end if; + if reset = '1' then + pra <= (others => '0'); + prb <= (others => '0'); + ddra <= (others => '0'); + ddrb <= (others => '0'); + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- TOD - time of day +-- ----------------------------------------------------------------------- + process(clk) + begin + -- Process rising edge on the todClk. + -- There is a prescaler of 5 or 6 to get 10ths of seconds from + -- 50 Hz or 60 Hz line frequency. + -- + -- Output is a 'todTick' signal synchronished with enable signal (@ 1Mhz). + if rising_edge(clk) then + if todEnabled = '1' then + if enable = '1' then + todTick <= '0'; + end if; + + if todClk = '1' and oldTodClk = '0' then + -- Divide by 5 or 6 dependng on 50/60 Hz flag. + if tod_clkcnt /= "000" then + tod_clkcnt <= tod_clkcnt - 1; + else + todTick <= tod_running; + tod_clkcnt <= "101"; -- 60 Hz + if cra_todin = '1' then + tod_clkcnt <= "100"; -- 50 Hz + end if; + end if; + end if; + oldTodClk <= todClk; + else + todTick <= '0'; + end if; + end if; + end process; + + process(clk) + variable new_10ths : unsigned(3 downto 0); + variable new_secsL : unsigned(3 downto 0); + variable new_secsH : unsigned(2 downto 0); + variable new_minsL : unsigned(3 downto 0); + variable new_minsH : unsigned(2 downto 0); + variable new_hrsL : unsigned(3 downto 0); + variable new_hrsH : std_logic; + variable new_hrs_byte : unsigned(7 downto 0); -- LCA am/pm and hours + begin + if rising_edge(clk) then + new_10ths := tod_10ths; + new_secsL := tod_secs(3 downto 0); + new_secsH := tod_secs(6 downto 4); + new_minsL := tod_mins(3 downto 0); + new_minsH := tod_mins(6 downto 4); +-- new_hrsL := tod_hrs(3 downto 0); +-- new_hrsH := tod_hrs(4); + new_hrs_byte := tod_hrs (7 downto 0); -- LCA am/pm and hours +-- new_hrs_byte := new_hrsH & new_hrsL; + + if enable = '1' + and todTick = '1' then + if new_10ths /= "1001" then + new_10ths := new_10ths + 1; + else + new_10ths := "0000"; + if new_secsL /= "1001" then + new_secsL := new_secsL + 1; + else + new_secsL := "0000"; + if new_secsH /= "101" then + new_secsH := new_secsH + 1; + else + new_secsH := "000"; + if new_minsL /= "1001" then + new_minsL := new_minsL + 1; + else + new_minsL := "0000"; + if new_minsH /= "101" then + new_minsH := new_minsH + 1; + else + new_minsH := "000"; + -- hrs were missing jun17 LCA + -- I mean completely absent from code :) !!!!!! + -- case to lookup then handles oddities in others + -- retarded am/pm flag flip madness handled at register load below (REG B) + + case tod_hrs is -- case state to set hours and am/pm + when "00010010" => + new_hrs_byte := "00000001"; -- 1 am set + when "00000001" => + new_hrs_byte := "00000010"; + when "00000010" => + new_hrs_byte := "00000011"; + when "00000011" => + new_hrs_byte := "00000100"; + when "00000100" => + new_hrs_byte := "00000101"; + when "00000101" => + new_hrs_byte := "00000110"; + when "00000110" => + new_hrs_byte := "00000111"; + when "00000111" => + new_hrs_byte := "00001000"; + when "00001000" => + new_hrs_byte := "00001001"; + when "00001001" => + new_hrs_byte := "00010000"; + when "00010000" => + new_hrs_byte := "00010001"; -- 11am set + when "00010001" => + new_hrs_byte := "10010010"; -- 12pm set + when "10010010" => + new_hrs_byte := "10000001"; -- 1 pm set + + when "10000001" => + new_hrs_byte := "10000010"; + when "10000010" => + new_hrs_byte := "10000011"; + when "10000011" => + new_hrs_byte := "10000100"; + when "10000100" => + new_hrs_byte := "10000101"; + when "10000101" => + new_hrs_byte := "10000110"; + when "10000110" => + new_hrs_byte := "10000111"; + when "10000111" => + new_hrs_byte := "10001000"; + when "10001000" => + new_hrs_byte := "10001001"; + when "10001001" => + new_hrs_byte := "10010000"; -- 10pm set + when "10010000" => + new_hrs_byte := "10010001"; -- 11pm set + when "10010001" => + new_hrs_byte := "00010010"; -- 12am set (midnight) + when others => + new_hrs_byte (3 downto 0) := new_hrs_byte (3 downto 0) + 1; + --null; + end case; + + end if; + end if; + end if; + end if; + end if; + end if; + + if myWr = '1' then + if crb_alarm = '0' then + case addr is + when X"8" => + new_10ths := di(3 downto 0); + tod_running <= '1'; + when X"9" => + new_secsL := di(3 downto 0); + new_secsH := di(6 downto 4); + when X"A" => + new_minsL := di(3 downto 0); + new_minsH := di(6 downto 4); + when X"B" => + new_hrs_byte := di(7) & "00" & di(4 downto 0); -- LCA + tod_running <= '0'; + if di(7 downto 0) = "10010010" or di(7 downto 0) = "00010010" then -- super bodge because cbm flips am/pm flag at 12 am or pm (its retarded!!!!!) + new_hrs_byte(7) := not new_hrs_byte(7); -- This P.O.S. now mimics real commodore 64 !!!!! LCA + end if; + when others => + null; + end case; + else -- TOD ALARM UPDATE + case addr is + when X"8" => + tod_10ths_alarm <= di(3 downto 0); + when X"9" => + tod_secs_alarm <= di(6 downto 0); + when X"A" => + tod_mins_alarm <= di(6 downto 0); + when X"B" => +-- tod_hrs_alarm <= di(4 downto 0); +-- tod_pm_alarm <= di(7); + tod_hrs_alarm <= di(7) & "00" & di(4 downto 0); -- LCA + if di(7 downto 0) = "10010010" or di(7 downto 0) = "00010010" then -- super bodge because cbm flips am/pm flag at 12 am or pm (its retarded!!!!!) + tod_hrs_alarm(7) <= not tod_hrs_alarm(7); -- This P.O.S. now mimics real commodore 64 !!!!! LCA + end if; + when others => + null; + end case; + end if; + end if; + + -- Update state + tod_10ths <= new_10ths; + tod_secs <= new_secsH & new_secsL; + tod_mins <= new_minsH & new_minsL; + tod_hrs <= new_hrs_byte; -- LCA + + if tod_latched = '0' then + tod_latch_10ths <= new_10ths; + tod_latch_secs <= new_secsH & new_secsL; + tod_latch_mins <= new_minsH & new_minsL; + tod_latch_hrs <= new_hrs_byte; -- LCA + end if; + + -- TOD ALARM test for match - LCA + if (tod_10ths = tod_10ths_alarm) and + (tod_secs = tod_secs_alarm) and + (tod_mins = tod_mins_alarm) and + (tod_hrs = tod_hrs_alarm) and + (crb_alarm = '1') then + intr_alarm <= '1' ; + end if; + + if reset = '1' then + tod_running <= '0'; + tod_10ths_alarm <= "0000" ; + tod_secs_alarm <= "0000000" ; + tod_mins_alarm <= "0000000" ; + tod_hrs_alarm <= "00000000" ; + tod_pm_alarm <= '0' ; + end if; + + if resetIrq then + intr_alarm <= '0' ; + end if; + end if; + end process; + + -- Control TOD output latch + -- Reading the hours latches the output until + -- the 10ths of seconds are read. While latched the + -- clock continues to run in the bankground. + process(clk) + begin + if rising_edge(clk) then + if myRd = '1' then + case addr is + when X"8" => tod_latched <= '0'; + when X"B" => tod_latched <= '1'; + when others => null; + end case; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- Timer A and B +-- ----------------------------------------------------------------------- + + +-- adjustable time delay jun17 - LCA + +-- ----------------------------------------------------------------------- +-- ----------------------------------------------------------------------- + + process(clk) + variable WR_delay : unsigned(15 downto 0); + begin + if rising_edge(clk) then + if (myWr = '0' or reset = '1') then + WR_delay := "0000000000000000"; + WR_Delay_offset <= '0'; +-- end if; + elsif (myWr = '1' and (WR_delay < 31)) then + WR_delay := WR_delay + 1; +-- end if; + elsif (WR_delay > 8) then -- adds a (1/32mhz * value) qualifier to WR signal in timers - LCA jun17 + WR_Delay_offset <= '1'; + else + WR_Delay_offset <= '0'; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- + + process(clk) + variable newTimerA : unsigned(15 downto 0); + variable nextClkTimerA : std_logic; + variable timerBInput : std_logic; + variable newTimerB : unsigned(15 downto 0); + variable nextClkTimerB : std_logic; + variable new_cra_runmode : std_logic; + variable new_crb_runmode : std_logic; + begin + if rising_edge(clk) then + loadTimerA <= '0'; + loadTimerB <= '0'; + new_cra_runmode := cra_runmode; + new_crb_runmode := crb_runmode; + + if resetIrq then + intr_timerA <= '0'; + intr_timerB <= '0'; + end if; + + if myWr = '1' then +-- if (myWr = '1' and WR_Delay_offset = '1') then -- x/32mhz offset to qualify WR signal LCA jun17 + case addr is + when X"4" => + talo <= di; + when X"5" => + tahi <= di; + if cra_start = '0' then + loadTimerA <= '1'; + end if; + when X"6" => + tblo <= di; + when X"7" => + tbhi <= di; + if crb_start = '0' then + loadTimerB <= '1'; + end if; + when X"E" => + if cra_start = '0' then + -- Only set on rising edge + timerAToggle <= timerAToggle or di(0); + end if; + cra_start <= di(0); + new_cra_runmode := di(3); + when X"F" => + if crb_start = '0' then + -- Only set on rising edge + timerBToggle <= timerBToggle or di(0); + end if; + crb_start <= di(0); + new_crb_runmode := di(3); + when others => null; + end case; + end if; + + if reset = '1' then + new_cra_runmode := '0'; + new_crb_runmode := '0'; + end if; + + cra_runmode <= new_cra_runmode; + crb_runmode <= new_crb_runmode; + + if enable = '1' then + -- + -- process timer A + -- + timerAPulse <= '0'; + newTimerA := timerA; + + -- CNT is not emulated so don't count when inmode = 1 + nextClkTimerA := cra_start and (not cra_inmode); + if clkTimerA = '1' then + newTimerA := newTimerA - 1; + end if; + if nextClkTimerA = '1' + and newTimerA = 0 then + intr_timerA <= '1'; + loadTimerA <= '1'; + timerAPulse <= '1'; + timerAToggle <= not timerAToggle; + if (new_cra_runmode or cra_runmode) = '1' then + cra_start <= '0'; + end if; + end if; + if forceTimerA = '1' then + loadTimerA <= '1'; + end if; + clkTimerA <= nextClkTimerA; + timerA <= newTimerA; + + -- + -- process timer B + -- + timerBPulse <= '0'; + newTimerB := timerB; + + if crb_inmode6 = '1' then + -- count timerA underflows + timerBInput := timerAPulse; + elsif crb_inmode5 = '0' then + -- count clock pulses + timerBInput := '1'; + else + -- CNT is not emulated so don't count + timerBInput := '0'; + end if; + nextClkTimerB := timerBInput and crb_start; + if clkTimerB = '1' then + newTimerB := newTimerB - 1; + end if; + if nextClkTimerB = '1' + and newTimerB = 0 then + intr_timerB <= '1'; + loadTimerB <= '1'; + timerBPulse <= '1'; + timerBToggle <= not timerBToggle; + if (new_crb_runmode or crb_runmode) = '1' then + crb_start <= '0'; + end if; + end if; + if forceTimerB = '1' then + loadTimerB <= '1'; + end if; + clkTimerB <= nextClkTimerB; + timerB <= newTimerB; + end if; + + if loadTimerA = '1' then + timerA <= tahi & talo; + clkTimerA <= '0'; + end if; + + if loadTimerB = '1' then + timerB <= tbhi & tblo; + clkTimerB <= '0'; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- Interrupts +-- ----------------------------------------------------------------------- + resetIrq <= ((myRd = '1') and (addr = X"D")) or (reset = '1'); + irq_n <= not(ir); + intr_serial <= '0'; + + process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + ir <= ir + or (intr_timerA and mask_timerA) + or (intr_timerB and mask_timerB) + or (intr_alarm and mask_alarm) + or (intr_serial and mask_serial) + or (intr_flagn and mask_flagn); + end if; + + if myWr = '1' then + case addr is + when X"D" => + if di(7) ='0' then + mask_timerA <= mask_timerA and (not di(0)); + mask_timerB <= mask_timerB and (not di(1)); + mask_alarm <= mask_alarm and (not di(2)); -- LCA + mask_serial <= mask_serial and (not di(3)); + mask_flagn <= mask_flagn and (not di(4)); + else + mask_timerA <= mask_timerA or di(0); + mask_timerB <= mask_timerB or di(1); + mask_alarm <= mask_alarm or di(2); -- LCA + mask_serial <= mask_serial or di(3); + mask_flagn <= mask_flagn or di(4); + end if; + when others => + null; + end case; + end if; + + if resetIrq then + ir <= '0'; + end if; + + if reset = '1' then + mask_timerA <= '0'; + mask_timerB <= '0'; + mask_alarm <= '0' ; + mask_serial <= '0'; + mask_flagn <= '0'; + end if; + end if; + end process; + + + + +-- ----------------------------------------------------------------------- +-- FLAG_N input +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + prevFlag_n <= flag_n; + if (flag_n = '0') and (prevFlag_n = '1') then + intr_flagn <= '1'; + end if; + if resetIrq then + intr_flagn <= '0'; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- Write registers +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then +-- resetIrq <= '0'; + if enable = '1' then + forceTimerA <= '0'; + forceTimerB <= '0'; +-- cra_runmode_reg <= cra_runmode; +-- crb_runmode_reg <= crb_runmode; + end if; + if myWr = '1' then + case addr is + when X"E" => + cra_pbon <= di(1); + cra_outmode <= di(2); +-- cra_runmode <= di(3); + forceTimerA <= di(4); + cra_inmode <= di(5); + cra_spmode <= di(6); + cra_todin <= di(7); + when X"F" => + crb_pbon <= di(1); + crb_outmode <= di(2); +-- crb_runmode <= di(3); + forceTimerB <= di(4); + crb_inmode5 <= di(5); + crb_inmode6 <= di(6); + crb_alarm <= di(7); + when others => null; + end case; + end if; + if reset = '1' then + cra_pbon <= '0'; + cra_outmode <= '0'; +-- cra_runmode <= '0'; + cra_inmode <= '0'; + cra_spmode <= '0'; + cra_todin <= '0'; + crb_pbon <= '0'; + crb_outmode <= '0'; +-- crb_runmode <= '0'; + crb_inmode5 <= '0'; + crb_inmode6 <= '0'; + crb_alarm <= '0'; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- Read registers +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + case addr is + when X"0" => do <= ppai; + when X"1" => do <= ppbi; + when X"2" => do <= DDRA; + when X"3" => do <= DDRB; + when X"4" => do <= timera(7 downto 0); + when X"5" => do <= timera(15 downto 8); + when X"6" => do <= timerb(7 downto 0); + when X"7" => do <= timerb(15 downto 8); + when X"8" => do <= "0000" & tod_latch_10ths; + when X"9" => do <= "0" & tod_latch_secs; + when X"A" => do <= "0" & tod_latch_mins; +-- when X"B" => do <= tod_latch_pm & "00" & tod_latch_hrs; + when X"B" => do <= tod_latch_hrs; -- LCA + when X"C" => do <= (others => '0'); + when X"D" => do <= ir & "00" & intr_flagn & intr_serial & intr_alarm & intr_timerB & intr_timerA; + when X"E" => do <= cra_todin & cra_spmode & cra_inmode & '0' & cra_runmode & cra_outmode & cra_pbon & cra_start; + when X"F" => do <= crb_alarm & crb_inmode6 & crb_inmode5 & '0' & crb_runmode & crb_outmode & crb_pbon & crb_start; + when others => do <= (others => '-'); + end case; + end if; + end process; +end Behavioral; diff --git a/Commodore - 64_Mist/rtl/composite_sync.vhd b/Commodore - 64_Mist/rtl/composite_sync.vhd new file mode 100644 index 00000000..216cece4 --- /dev/null +++ b/Commodore - 64_Mist/rtl/composite_sync.vhd @@ -0,0 +1,96 @@ +--------------------------------------------------------------------------------- +-- composite_sync by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +-- +-- Generate composite sync and blank for tv mode from h/v syncs +-- +--------------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; + +entity composite_sync is +port( + clk32 : in std_logic; + hsync : in std_logic; + vsync : in std_logic; + ntsc : in std_logic; + hsync_out : out std_logic; + vsync_out : out std_logic; + blank : out std_logic +); +end composite_sync ; + +architecture struct of composite_sync is + + signal clk_cnt : std_logic_vector(1 downto 0); + signal vsync_r : std_logic; + signal hsync_r : std_logic; + signal hsync_r0 : std_logic; + signal vblank : std_logic; + signal hblank : std_logic; + +begin + +blank <= hblank or vblank; + +process(clk32) + variable dot_count : integer range 0 to 1023 := 0; + variable line_count : integer range 0 to 511 := 0; + begin + if falling_edge(clk32) then + hsync_r0 <= hsync; + if hsync_r0 = '0' and hsync = '1' then + clk_cnt <= "00"; + else + clk_cnt <= clk_cnt + '1'; + end if; + end if; + + if rising_edge(clk32) then + if clk_cnt = "00" then + vsync_r <= vsync; + hsync_r <= hsync; + + if hsync_r = '0' and hsync = '1' then + dot_count := 0; + line_count := line_count + 1; + else + dot_count := dot_count + 1; + end if; + + if vsync_r = '0' and vsync = '1' then + line_count := 0; + end if; + + if ntsc = '1' then + if dot_count = 510 then hblank <= '1'; end if; + if dot_count = 010 then hsync_out <= '1'; end if; + if dot_count = 048 then hsync_out <= '0'; end if; + if dot_count = 096 then hblank <= '0'; end if; + + if line_count = 260 then vblank <= '1'; end if; + if line_count = 262 then vsync_out <= '1'; end if; + if line_count = 008 then vsync_out <= '0'; end if; + if line_count = 010 then vblank <= '0'; end if; + else + if dot_count = 495 then hblank <= '1'; end if; + if dot_count = 010 then hsync_out <= '1'; end if; + if dot_count = 048 then hsync_out <= '0'; end if; + if dot_count = 094 then hblank <= '0'; end if; + + if line_count = 306 then vblank <= '1'; end if; + if line_count = 308 then vsync_out <= '1'; end if; + if line_count = 004 then vsync_out <= '0'; end if; + if line_count = 006 then vblank <= '0'; end if; + end if; + + end if; + end if; +end process; + + + +end architecture; \ No newline at end of file diff --git a/Commodore - 64_Mist/rtl/cpu65xx_e.vhd b/Commodore - 64_Mist/rtl/cpu65xx_e.vhd new file mode 100644 index 00000000..27166e7a --- /dev/null +++ b/Commodore - 64_Mist/rtl/cpu65xx_e.vhd @@ -0,0 +1,49 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- Interface to 6502/6510 core +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use ieee.std_logic_1164.ALL; +use ieee.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity cpu65xx is + generic ( + pipelineOpcode : boolean; + pipelineAluMux : boolean; + pipelineAluOut : boolean + ); + port ( + clk : in std_logic; + enable : in std_logic; + reset : in std_logic; + nmi_n : in std_logic; + nmi_ack : out std_logic; + irq_n : in std_logic; + so_n : in std_logic := '1'; + + di : in unsigned(7 downto 0); + do : out unsigned(7 downto 0); + addr : out unsigned(15 downto 0); + we : out std_logic; + + debugOpcode : out unsigned(7 downto 0); + debugPc : out unsigned(15 downto 0); + debugA : out unsigned(7 downto 0); + debugX : out unsigned(7 downto 0); + debugY : out unsigned(7 downto 0); + debugS : out unsigned(7 downto 0) + ); +end cpu65xx; \ No newline at end of file diff --git a/Commodore - 64_Mist/rtl/cpu65xx_fast.vhd b/Commodore - 64_Mist/rtl/cpu65xx_fast.vhd new file mode 100644 index 00000000..a387b37d --- /dev/null +++ b/Commodore - 64_Mist/rtl/cpu65xx_fast.vhd @@ -0,0 +1,1565 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- Table driven, cycle exact 6502/6510 core +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use ieee.std_logic_1164.ALL; +use ieee.std_logic_unsigned.ALL; +use ieee.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +-- Store Zp (3) => fetch, cycle2, cycleEnd +-- Store Zp,x (4) => fetch, cycle2, preWrite, cycleEnd +-- Read Zp,x (4) => fetch, cycle2, cycleRead, cycleRead2 +-- Rmw Zp,x (6) => fetch, cycle2, cycleRead, cycleRead2, cycleRmw, cycleEnd +-- Store Abs (4) => fetch, cycle2, cycle3, cycleEnd +-- Store Abs,x (5) => fetch, cycle2, cycle3, preWrite, cycleEnd +-- Rts (6) => fetch, cycle2, cycle3, cycleRead, cycleJump, cycleIncrEnd +-- Rti (6) => fetch, cycle2, stack1, stack2, stack3, cycleJump +-- Jsr (6) => fetch, cycle2, .. cycle5, cycle6, cycleJump +-- Jmp abs (-) => fetch, cycle2, .., cycleJump +-- Jmp (ind) (-) => fetch, cycle2, .., cycleJump +-- Brk / irq (6) => fetch, cycle2, stack2, stack3, stack4 +-- ----------------------------------------------------------------------- + +architecture fast of cpu65xx is +-- Statemachine + type cpuCycles is ( + opcodeFetch, -- New opcode is read and registers updated + cycle2, + cycle3, + cyclePreIndirect, + cycleIndirect, + cycleBranchTaken, + cycleBranchPage, + cyclePreRead, -- Cycle before read while doing zeropage indexed addressing. + cycleRead, -- Read cycle + cycleRead2, -- Second read cycle after page-boundary crossing. + cycleRmw, -- Calculate ALU output for read-modify-write instr. + cyclePreWrite, -- Cycle before write when doing indexed addressing. + cycleWrite, -- Write cycle for zeropage or absolute addressing. + cycleStack1, + cycleStack2, + cycleStack3, + cycleStack4, + cycleJump, -- Last cycle of Jsr, Jmp. Next fetch address is target addr. + cycleEnd + ); + signal theCpuCycle : cpuCycles; + signal nextCpuCycle : cpuCycles; + signal updateRegisters : boolean; + signal processIrq : std_logic; + signal nmiReg: std_logic; + signal nmiEdge: std_logic; + signal irqReg : std_logic; -- Delay IRQ input with one clock cycle. + signal soReg : std_logic; -- SO pin edge detection + +-- Opcode decoding + constant opcUpdateA : integer := 0; + constant opcUpdateX : integer := 1; + constant opcUpdateY : integer := 2; + constant opcUpdateS : integer := 3; + constant opcUpdateN : integer := 4; + constant opcUpdateV : integer := 5; + constant opcUpdateD : integer := 6; + constant opcUpdateI : integer := 7; + constant opcUpdateZ : integer := 8; + constant opcUpdateC : integer := 9; + + constant opcSecondByte : integer := 10; + constant opcAbsolute : integer := 11; + constant opcZeroPage : integer := 12; + constant opcIndirect : integer := 13; + constant opcStackAddr : integer := 14; -- Push/Pop address + constant opcStackData : integer := 15; -- Push/Pop status/data + constant opcJump : integer := 16; + constant opcBranch : integer := 17; + constant indexX : integer := 18; + constant indexY : integer := 19; + constant opcStackUp : integer := 20; + constant opcWrite : integer := 21; + constant opcRmw : integer := 22; + constant opcIncrAfter : integer := 23; -- Insert extra cycle to increment PC (RTS) + constant opcRti : integer := 24; + constant opcIRQ : integer := 25; + + constant opcInA : integer := 26; + constant opcInE : integer := 27; + constant opcInX : integer := 28; + constant opcInY : integer := 29; + constant opcInS : integer := 30; + constant opcInT : integer := 31; + constant opcInH : integer := 32; + constant opcInClear : integer := 33; + constant aluMode1From : integer := 34; + -- + constant aluMode1To : integer := 37; + constant aluMode2From : integer := 38; + -- + constant aluMode2To : integer := 40; + -- + constant opcInCmp : integer := 41; + constant opcInCpx : integer := 42; + constant opcInCpy : integer := 43; + + + subtype addrDef is unsigned(0 to 15); + -- + -- is Interrupt -----------------+ + -- instruction is RTI ----------------+| + -- PC++ on last cycle (RTS) ---------------+|| + -- RMW --------------+||| + -- Write -------------+|||| + -- Pop/Stack up -------------+||||| + -- Branch ---------+ |||||| + -- Jump ----------+| |||||| + -- Push or Pop data -------+|| |||||| + -- Push or Pop addr ------+||| |||||| + -- Indirect -----+|||| |||||| + -- ZeroPage ----+||||| |||||| + -- Absolute ---+|||||| |||||| + -- PC++ on cycle2 --+||||||| |||||| + -- |AZI||JBXY|WM||| + constant immediate : addrDef := "1000000000000000"; + constant implied : addrDef := "0000000000000000"; + -- Zero page + constant readZp : addrDef := "1010000000000000"; + constant writeZp : addrDef := "1010000000010000"; + constant rmwZp : addrDef := "1010000000001000"; + -- Zero page indexed + constant readZpX : addrDef := "1010000010000000"; + constant writeZpX : addrDef := "1010000010010000"; + constant rmwZpX : addrDef := "1010000010001000"; + constant readZpY : addrDef := "1010000001000000"; + constant writeZpY : addrDef := "1010000001010000"; + constant rmwZpY : addrDef := "1010000001001000"; + -- Zero page indirect + constant readIndX : addrDef := "1001000010000000"; + constant writeIndX : addrDef := "1001000010010000"; + constant rmwIndX : addrDef := "1001000010001000"; + constant readIndY : addrDef := "1001000001000000"; + constant writeIndY : addrDef := "1001000001010000"; + constant rmwIndY : addrDef := "1001000001001000"; + -- |AZI||JBXY|WM|| + -- Absolute + constant readAbs : addrDef := "1100000000000000"; + constant writeAbs : addrDef := "1100000000010000"; + constant rmwAbs : addrDef := "1100000000001000"; + constant readAbsX : addrDef := "1100000010000000"; + constant writeAbsX : addrDef := "1100000010010000"; + constant rmwAbsX : addrDef := "1100000010001000"; + constant readAbsY : addrDef := "1100000001000000"; + constant writeAbsY : addrDef := "1100000001010000"; + constant rmwAbsY : addrDef := "1100000001001000"; + -- PHA PHP + constant push : addrDef := "0000010000000000"; + -- PLA PLP + constant pop : addrDef := "0000010000100000"; + -- Jumps + constant jsr : addrDef := "1000101000000000"; + constant jumpAbs : addrDef := "1000001000000000"; + constant jumpInd : addrDef := "1100001000000000"; + constant relative : addrDef := "1000000100000000"; + -- Specials + constant rts : addrDef := "0000101000100100"; + constant rti : addrDef := "0000111000100010"; + constant brk : addrDef := "1000111000000001"; +-- constant : unsigned(0 to 0) := "0"; + constant xxxxxxxx : addrDef := "----------0---00"; + + -- A = accu + -- E = Accu | 0xEE (for ANE, LXA) + -- X = index X + -- Y = index Y + -- S = Stack pointer + -- H = indexH + -- + -- AEXYSTHc + constant aluInA : unsigned(0 to 7) := "10000000"; + constant aluInE : unsigned(0 to 7) := "01000000"; + constant aluInEXT : unsigned(0 to 7) := "01100100"; + constant aluInET : unsigned(0 to 7) := "01000100"; + constant aluInX : unsigned(0 to 7) := "00100000"; + constant aluInXH : unsigned(0 to 7) := "00100010"; + constant aluInY : unsigned(0 to 7) := "00010000"; + constant aluInYH : unsigned(0 to 7) := "00010010"; + constant aluInS : unsigned(0 to 7) := "00001000"; + constant aluInT : unsigned(0 to 7) := "00000100"; + constant aluInAX : unsigned(0 to 7) := "10100000"; + constant aluInAXH : unsigned(0 to 7) := "10100010"; + constant aluInAT : unsigned(0 to 7) := "10000100"; + constant aluInXT : unsigned(0 to 7) := "00100100"; + constant aluInST : unsigned(0 to 7) := "00001100"; + constant aluInSet : unsigned(0 to 7) := "00000000"; + constant aluInClr : unsigned(0 to 7) := "00000001"; + constant aluInXXX : unsigned(0 to 7) := "--------"; + + -- Most of the aluModes are just like the opcodes. + -- aluModeInp -> input is output. calculate N and Z + -- aluModeCmp -> Compare for CMP, CPX, CPY + -- aluModeFlg -> input to flags needed for PLP, RTI and CLC, SEC, CLV + -- aluModeInc -> for INC but also INX, INY + -- aluModeDec -> for DEC but also DEX, DEY + + subtype aluMode1 is unsigned(0 to 3); + subtype aluMode2 is unsigned(0 to 2); + subtype aluMode is unsigned(0 to 9); + + -- Logic/Shift ALU + constant aluModeInp : aluMode1 := "0000"; + constant aluModeP : aluMode1 := "0001"; + constant aluModeInc : aluMode1 := "0010"; + constant aluModeDec : aluMode1 := "0011"; + constant aluModeFlg : aluMode1 := "0100"; + constant aluModeBit : aluMode1 := "0101"; + -- 0110 + -- 0111 + constant aluModeLsr : aluMode1 := "1000"; + constant aluModeRor : aluMode1 := "1001"; + constant aluModeAsl : aluMode1 := "1010"; + constant aluModeRol : aluMode1 := "1011"; + -- 1100 + -- 1101 + -- 1110 + constant aluModeAnc : aluMode1 := "1111"; + + -- Arithmetic ALU + constant aluModePss : aluMode2 := "000"; + constant aluModeCmp : aluMode2 := "001"; + constant aluModeAdc : aluMode2 := "010"; + constant aluModeSbc : aluMode2 := "011"; + constant aluModeAnd : aluMode2 := "100"; + constant aluModeOra : aluMode2 := "101"; + constant aluModeEor : aluMode2 := "110"; + constant aluModeArr : aluMode2 := "111"; + + + constant aluInp : aluMode := aluModeInp & aluModePss & "---"; + constant aluP : aluMode := aluModeP & aluModePss & "---"; + constant aluInc : aluMode := aluModeInc & aluModePss & "---"; + constant aluDec : aluMode := aluModeDec & aluModePss & "---"; + constant aluFlg : aluMode := aluModeFlg & aluModePss & "---"; + constant aluBit : aluMode := aluModeBit & aluModeAnd & "---"; + constant aluRor : aluMode := aluModeRor & aluModePss & "---"; + constant aluLsr : aluMode := aluModeLsr & aluModePss & "---"; + constant aluRol : aluMode := aluModeRol & aluModePss & "---"; + constant aluAsl : aluMode := aluModeAsl & aluModePss & "---"; + + constant aluCmp : aluMode := aluModeInp & aluModeCmp & "100"; + constant aluCpx : aluMode := aluModeInp & aluModeCmp & "010"; + constant aluCpy : aluMode := aluModeInp & aluModeCmp & "001"; + constant aluAdc : aluMode := aluModeInp & aluModeAdc & "---"; + constant aluSbc : aluMode := aluModeInp & aluModeSbc & "---"; + constant aluAnd : aluMode := aluModeInp & aluModeAnd & "---"; + constant aluOra : aluMode := aluModeInp & aluModeOra & "---"; + constant aluEor : aluMode := aluModeInp & aluModeEor & "---"; + + constant aluSlo : aluMode := aluModeAsl & aluModeOra & "---"; + constant aluSre : aluMode := aluModeLsr & aluModeEor & "---"; + constant aluRra : aluMode := aluModeRor & aluModeAdc & "---"; + constant aluRla : aluMode := aluModeRol & aluModeAnd & "---"; + constant aluDcp : aluMode := aluModeDec & aluModeCmp & "100"; + constant aluIsc : aluMode := aluModeInc & aluModeSbc & "---"; + constant aluAnc : aluMode := aluModeAnc & aluModeAnd & "---"; + constant aluArr : aluMode := aluModeRor & aluModeArr & "---"; + constant aluSbx : aluMode := aluModeInp & aluModeCmp & "110"; + + constant aluXXX : aluMode := (others => '-'); + + + -- Stack operations. Push/Pop/None + constant stackInc : unsigned(0 to 0) := "0"; + constant stackDec : unsigned(0 to 0) := "1"; + constant stackXXX : unsigned(0 to 0) := "-"; + + subtype decodedBitsDef is unsigned(0 to 43); + type opcodeInfoTableDef is array(0 to 255) of decodedBitsDef; + constant opcodeInfoTable : opcodeInfoTableDef := ( + -- +------- Update register A + -- |+------ Update register X + -- ||+----- Update register Y + -- |||+---- Update register S + -- |||| +-- Update Flags + -- |||| | + -- |||| _|__ + -- |||| / \ + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "000100" & brk & aluInXXX & aluP, -- 00 BRK + "1000" & "100010" & readIndX & aluInT & aluOra, -- 01 ORA (zp,x) + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 02 *** JAM *** + "1000" & "100011" & rmwIndX & aluInT & aluSlo, -- 03 iSLO (zp,x) + "0000" & "000000" & readZp & aluInXXX & aluXXX, -- 04 iNOP zp + "1000" & "100010" & readZp & aluInT & aluOra, -- 05 ORA zp + "0000" & "100011" & rmwZp & aluInT & aluAsl, -- 06 ASL zp + "1000" & "100011" & rmwZp & aluInT & aluSlo, -- 07 iSLO zp + "0000" & "000000" & push & aluInXXX & aluP, -- 08 PHP + "1000" & "100010" & immediate & aluInT & aluOra, -- 09 ORA imm + "1000" & "100011" & implied & aluInA & aluAsl, -- 0A ASL accu + "1000" & "100011" & immediate & aluInT & aluAnc, -- 0B iANC imm + "0000" & "000000" & readAbs & aluInXXX & aluXXX, -- 0C iNOP abs + "1000" & "100010" & readAbs & aluInT & aluOra, -- 0D ORA abs + "0000" & "100011" & rmwAbs & aluInT & aluAsl, -- 0E ASL abs + "1000" & "100011" & rmwAbs & aluInT & aluSlo, -- 0F iSLO abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 10 BPL + "1000" & "100010" & readIndY & aluInT & aluOra, -- 11 ORA (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 12 *** JAM *** + "1000" & "100011" & rmwIndY & aluInT & aluSlo, -- 13 iSLO (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- 14 iNOP zp,x + "1000" & "100010" & readZpX & aluInT & aluOra, -- 15 ORA zp,x + "0000" & "100011" & rmwZpX & aluInT & aluAsl, -- 16 ASL zp,x + "1000" & "100011" & rmwZpX & aluInT & aluSlo, -- 17 iSLO zp,x + "0000" & "000001" & implied & aluInClr & aluFlg, -- 18 CLC + "1000" & "100010" & readAbsY & aluInT & aluOra, -- 19 ORA abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- 1A iNOP implied + "1000" & "100011" & rmwAbsY & aluInT & aluSlo, -- 1B iSLO abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- 1C iNOP abs,x + "1000" & "100010" & readAbsX & aluInT & aluOra, -- 1D ORA abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluAsl, -- 1E ASL abs,x + "1000" & "100011" & rmwAbsX & aluInT & aluSlo, -- 1F iSLO abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "000000" & jsr & aluInXXX & aluXXX, -- 20 JSR + "1000" & "100010" & readIndX & aluInT & aluAnd, -- 21 AND (zp,x) + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 22 *** JAM *** + "1000" & "100011" & rmwIndX & aluInT & aluRla, -- 23 iRLA (zp,x) + "0000" & "110010" & readZp & aluInT & aluBit, -- 24 BIT zp + "1000" & "100010" & readZp & aluInT & aluAnd, -- 25 AND zp + "0000" & "100011" & rmwZp & aluInT & aluRol, -- 26 ROL zp + "1000" & "100011" & rmwZp & aluInT & aluRla, -- 27 iRLA zp + "0000" & "111111" & pop & aluInT & aluFlg, -- 28 PLP + "1000" & "100010" & immediate & aluInT & aluAnd, -- 29 AND imm + "1000" & "100011" & implied & aluInA & aluRol, -- 2A ROL accu + "1000" & "100011" & immediate & aluInT & aluAnc, -- 2B iANC imm + "0000" & "110010" & readAbs & aluInT & aluBit, -- 2C BIT abs + "1000" & "100010" & readAbs & aluInT & aluAnd, -- 2D AND abs + "0000" & "100011" & rmwAbs & aluInT & aluRol, -- 2E ROL abs + "1000" & "100011" & rmwAbs & aluInT & aluRla, -- 2F iRLA abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 30 BMI + "1000" & "100010" & readIndY & aluInT & aluAnd, -- 31 AND (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 32 *** JAM *** + "1000" & "100011" & rmwIndY & aluInT & aluRla, -- 33 iRLA (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- 34 iNOP zp,x + "1000" & "100010" & readZpX & aluInT & aluAnd, -- 35 AND zp,x + "0000" & "100011" & rmwZpX & aluInT & aluRol, -- 36 ROL zp,x + "1000" & "100011" & rmwZpX & aluInT & aluRla, -- 37 iRLA zp,x + "0000" & "000001" & implied & aluInSet & aluFlg, -- 38 SEC + "1000" & "100010" & readAbsY & aluInT & aluAnd, -- 39 AND abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- 3A iNOP implied + "1000" & "100011" & rmwAbsY & aluInT & aluRla, -- 3B iRLA abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- 3C iNOP abs,x + "1000" & "100010" & readAbsX & aluInT & aluAnd, -- 3D AND abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluRol, -- 3E ROL abs,x + "1000" & "100011" & rmwAbsX & aluInT & aluRla, -- 3F iRLA abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "111111" & rti & aluInT & aluFlg, -- 40 RTI + "1000" & "100010" & readIndX & aluInT & aluEor, -- 41 EOR (zp,x) + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 42 *** JAM *** + "1000" & "100011" & rmwIndX & aluInT & aluSre, -- 43 iSRE (zp,x) + "0000" & "000000" & readZp & aluInXXX & aluXXX, -- 44 iNOP zp + "1000" & "100010" & readZp & aluInT & aluEor, -- 45 EOR zp + "0000" & "100011" & rmwZp & aluInT & aluLsr, -- 46 LSR zp + "1000" & "100011" & rmwZp & aluInT & aluSre, -- 47 iSRE zp + "0000" & "000000" & push & aluInA & aluInp, -- 48 PHA + "1000" & "100010" & immediate & aluInT & aluEor, -- 49 EOR imm + "1000" & "100011" & implied & aluInA & aluLsr, -- 4A LSR accu + "1000" & "100011" & immediate & aluInAT & aluLsr, -- 4B iALR imm + "0000" & "000000" & jumpAbs & aluInXXX & aluXXX, -- 4C JMP abs + "1000" & "100010" & readAbs & aluInT & aluEor, -- 4D EOR abs + "0000" & "100011" & rmwAbs & aluInT & aluLsr, -- 4E LSR abs + "1000" & "100011" & rmwAbs & aluInT & aluSre, -- 4F iSRE abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 50 BVC + "1000" & "100010" & readIndY & aluInT & aluEor, -- 51 EOR (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 52 *** JAM *** + "1000" & "100011" & rmwIndY & aluInT & aluSre, -- 53 iSRE (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- 54 iNOP zp,x + "1000" & "100010" & readZpX & aluInT & aluEor, -- 55 EOR zp,x + "0000" & "100011" & rmwZpX & aluInT & aluLsr, -- 56 LSR zp,x + "1000" & "100011" & rmwZpX & aluInT & aluSre, -- 57 SRE zp,x + "0000" & "000100" & implied & aluInClr & aluXXX, -- 58 CLI + "1000" & "100010" & readAbsY & aluInT & aluEor, -- 59 EOR abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- 5A iNOP implied + "1000" & "100011" & rmwAbsY & aluInT & aluSre, -- 5B iSRE abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- 5C iNOP abs,x + "1000" & "100010" & readAbsX & aluInT & aluEor, -- 5D EOR abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluLsr, -- 5E LSR abs,x + "1000" & "100011" & rmwAbsX & aluInT & aluSre, -- 5F SRE abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "000000" & rts & aluInXXX & aluXXX, -- 60 RTS + "1000" & "110011" & readIndX & aluInT & aluAdc, -- 61 ADC (zp,x) + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 62 *** JAM *** + "1000" & "110011" & rmwIndX & aluInT & aluRra, -- 63 iRRA (zp,x) + "0000" & "000000" & readZp & aluInXXX & aluXXX, -- 64 iNOP zp + "1000" & "110011" & readZp & aluInT & aluAdc, -- 65 ADC zp + "0000" & "100011" & rmwZp & aluInT & aluRor, -- 66 ROR zp + "1000" & "110011" & rmwZp & aluInT & aluRra, -- 67 iRRA zp + "1000" & "100010" & pop & aluInT & aluInp, -- 68 PLA + "1000" & "110011" & immediate & aluInT & aluAdc, -- 69 ADC imm + "1000" & "100011" & implied & aluInA & aluRor, -- 6A ROR accu + "1000" & "110011" & immediate & aluInAT & aluArr, -- 6B iARR imm + "0000" & "000000" & jumpInd & aluInXXX & aluXXX, -- 6C JMP indirect + "1000" & "110011" & readAbs & aluInT & aluAdc, -- 6D ADC abs + "0000" & "100011" & rmwAbs & aluInT & aluRor, -- 6E ROR abs + "1000" & "110011" & rmwAbs & aluInT & aluRra, -- 6F iRRA abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 70 BVS + "1000" & "110011" & readIndY & aluInT & aluAdc, -- 71 ADC (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 72 *** JAM *** + "1000" & "110011" & rmwIndY & aluInT & aluRra, -- 73 iRRA (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- 74 iNOP zp,x + "1000" & "110011" & readZpX & aluInT & aluAdc, -- 75 ADC zp,x + "0000" & "100011" & rmwZpX & aluInT & aluRor, -- 76 ROR zp,x + "1000" & "110011" & rmwZpX & aluInT & aluRra, -- 77 iRRA zp,x + "0000" & "000100" & implied & aluInSet & aluXXX, -- 78 SEI + "1000" & "110011" & readAbsY & aluInT & aluAdc, -- 79 ADC abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- 7A iNOP implied + "1000" & "110011" & rmwAbsY & aluInT & aluRra, -- 7B iRRA abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- 7C iNOP abs,x + "1000" & "110011" & readAbsX & aluInT & aluAdc, -- 7D ADC abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluRor, -- 7E ROR abs,x + "1000" & "110011" & rmwAbsX & aluInT & aluRra, -- 7F iRRA abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- 80 iNOP imm + "0000" & "000000" & writeIndX & aluInA & aluInp, -- 81 STA (zp,x) + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- 82 iNOP imm + "0000" & "000000" & writeIndX & aluInAX & aluInp, -- 83 iSAX (zp,x) + "0000" & "000000" & writeZp & aluInY & aluInp, -- 84 STY zp + "0000" & "000000" & writeZp & aluInA & aluInp, -- 85 STA zp + "0000" & "000000" & writeZp & aluInX & aluInp, -- 86 STX zp + "0000" & "000000" & writeZp & aluInAX & aluInp, -- 87 iSAX zp + "0010" & "100010" & implied & aluInY & aluDec, -- 88 DEY + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- 84 iNOP imm + "1000" & "100010" & implied & aluInX & aluInp, -- 8A TXA + "1000" & "100010" & immediate & aluInEXT & aluInp, -- 8B iANE imm + "0000" & "000000" & writeAbs & aluInY & aluInp, -- 8C STY abs + "0000" & "000000" & writeAbs & aluInA & aluInp, -- 8D STA abs + "0000" & "000000" & writeAbs & aluInX & aluInp, -- 8E STX abs + "0000" & "000000" & writeAbs & aluInAX & aluInp, -- 8F iSAX abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 90 BCC + "0000" & "000000" & writeIndY & aluInA & aluInp, -- 91 STA (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 92 *** JAM *** + "0000" & "000000" & writeIndY & aluInAXH & aluInp, -- 93 iAHX (zp),y + "0000" & "000000" & writeZpX & aluInY & aluInp, -- 94 STY zp,x + "0000" & "000000" & writeZpX & aluInA & aluInp, -- 95 STA zp,x + "0000" & "000000" & writeZpY & aluInX & aluInp, -- 96 STX zp,y + "0000" & "000000" & writeZpY & aluInAX & aluInp, -- 97 iSAX zp,y + "1000" & "100010" & implied & aluInY & aluInp, -- 98 TYA + "0000" & "000000" & writeAbsY & aluInA & aluInp, -- 99 STA abs,y + "0001" & "000000" & implied & aluInX & aluInp, -- 9A TXS + "0001" & "000000" & writeAbsY & aluInAXH & aluInp, -- 9B iSHS abs,y + "0000" & "000000" & writeAbsX & aluInYH & aluInp, -- 9C iSHY abs,x + "0000" & "000000" & writeAbsX & aluInA & aluInp, -- 9D STA abs,x + "0000" & "000000" & writeAbsY & aluInXH & aluInp, -- 9E iSHX abs,y + "0000" & "000000" & writeAbsY & aluInAXH & aluInp, -- 9F iAHX abs,y + -- AXYS NVDIZC addressing aluInput aluMode + "0010" & "100010" & immediate & aluInT & aluInp, -- A0 LDY imm + "1000" & "100010" & readIndX & aluInT & aluInp, -- A1 LDA (zp,x) + "0100" & "100010" & immediate & aluInT & aluInp, -- A2 LDX imm + "1100" & "100010" & readIndX & aluInT & aluInp, -- A3 LAX (zp,x) + "0010" & "100010" & readZp & aluInT & aluInp, -- A4 LDY zp + "1000" & "100010" & readZp & aluInT & aluInp, -- A5 LDA zp + "0100" & "100010" & readZp & aluInT & aluInp, -- A6 LDX zp + "1100" & "100010" & readZp & aluInT & aluInp, -- A7 iLAX zp + "0010" & "100010" & implied & aluInA & aluInp, -- A8 TAY + "1000" & "100010" & immediate & aluInT & aluInp, -- A9 LDA imm + "0100" & "100010" & implied & aluInA & aluInp, -- AA TAX + "1100" & "100010" & immediate & aluInET & aluInp, -- AB iLXA imm + "0010" & "100010" & readAbs & aluInT & aluInp, -- AC LDY abs + "1000" & "100010" & readAbs & aluInT & aluInp, -- AD LDA abs + "0100" & "100010" & readAbs & aluInT & aluInp, -- AE LDX abs + "1100" & "100010" & readAbs & aluInT & aluInp, -- AF iLAX abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- B0 BCS + "1000" & "100010" & readIndY & aluInT & aluInp, -- B1 LDA (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- B2 *** JAM *** + "1100" & "100010" & readIndY & aluInT & aluInp, -- B3 iLAX (zp),y + "0010" & "100010" & readZpX & aluInT & aluInp, -- B4 LDY zp,x + "1000" & "100010" & readZpX & aluInT & aluInp, -- B5 LDA zp,x + "0100" & "100010" & readZpY & aluInT & aluInp, -- B6 LDX zp,y + "1100" & "100010" & readZpY & aluInT & aluInp, -- B7 iLAX zp,y + "0000" & "010000" & implied & aluInClr & aluFlg, -- B8 CLV + "1000" & "100010" & readAbsY & aluInT & aluInp, -- B9 LDA abs,y + "0100" & "100010" & implied & aluInS & aluInp, -- BA TSX + "1101" & "100010" & readAbsY & aluInST & aluInp, -- BB iLAS abs,y + "0010" & "100010" & readAbsX & aluInT & aluInp, -- BC LDY abs,x + "1000" & "100010" & readAbsX & aluInT & aluInp, -- BD LDA abs,x + "0100" & "100010" & readAbsY & aluInT & aluInp, -- BE LDX abs,y + "1100" & "100010" & readAbsY & aluInT & aluInp, -- BF iLAX abs,y + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "100011" & immediate & aluInT & aluCpy, -- C0 CPY imm + "0000" & "100011" & readIndX & aluInT & aluCmp, -- C1 CMP (zp,x) + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- C2 iNOP imm + "0000" & "100011" & rmwIndX & aluInT & aluDcp, -- C3 iDCP (zp,x) + "0000" & "100011" & readZp & aluInT & aluCpy, -- C4 CPY zp + "0000" & "100011" & readZp & aluInT & aluCmp, -- C5 CMP zp + "0000" & "100010" & rmwZp & aluInT & aluDec, -- C6 DEC zp + "0000" & "100011" & rmwZp & aluInT & aluDcp, -- C7 iDCP zp + "0010" & "100010" & implied & aluInY & aluInc, -- C8 INY + "0000" & "100011" & immediate & aluInT & aluCmp, -- C9 CMP imm + "0100" & "100010" & implied & aluInX & aluDec, -- CA DEX + "0100" & "100011" & immediate & aluInT & aluSbx, -- CB SBX imm + "0000" & "100011" & readAbs & aluInT & aluCpy, -- CC CPY abs + "0000" & "100011" & readAbs & aluInT & aluCmp, -- CD CMP abs + "0000" & "100010" & rmwAbs & aluInT & aluDec, -- CE DEC abs + "0000" & "100011" & rmwAbs & aluInT & aluDcp, -- CF iDCP abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- D0 BNE + "0000" & "100011" & readIndY & aluInT & aluCmp, -- D1 CMP (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- D2 *** JAM *** + "0000" & "100011" & rmwIndY & aluInT & aluDcp, -- D3 iDCP (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- D4 iNOP zp,x + "0000" & "100011" & readZpX & aluInT & aluCmp, -- D5 CMP zp,x + "0000" & "100010" & rmwZpX & aluInT & aluDec, -- D6 DEC zp,x + "0000" & "100011" & rmwZpX & aluInT & aluDcp, -- D7 iDCP zp,x + "0000" & "001000" & implied & aluInClr & aluXXX, -- D8 CLD + "0000" & "100011" & readAbsY & aluInT & aluCmp, -- D9 CMP abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- DA iNOP implied + "0000" & "100011" & rmwAbsY & aluInT & aluDcp, -- DB iDCP abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- DC iNOP abs,x + "0000" & "100011" & readAbsX & aluInT & aluCmp, -- DD CMP abs,x + "0000" & "100010" & rmwAbsX & aluInT & aluDec, -- DE DEC abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluDcp, -- DF iDCP abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "100011" & immediate & aluInT & aluCpx, -- E0 CPX imm + "1000" & "110011" & readIndX & aluInT & aluSbc, -- E1 SBC (zp,x) + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- E2 iNOP imm + "1000" & "110011" & rmwIndX & aluInT & aluIsc, -- E3 iISC (zp,x) + "0000" & "100011" & readZp & aluInT & aluCpx, -- E4 CPX zp + "1000" & "110011" & readZp & aluInT & aluSbc, -- E5 SBC zp + "0000" & "100010" & rmwZp & aluInT & aluInc, -- E6 INC zp + "1000" & "110011" & rmwZp & aluInT & aluIsc, -- E7 iISC zp + "0100" & "100010" & implied & aluInX & aluInc, -- E8 INX + "1000" & "110011" & immediate & aluInT & aluSbc, -- E9 SBC imm + "0000" & "000000" & implied & aluInXXX & aluXXX, -- EA NOP + "1000" & "110011" & immediate & aluInT & aluSbc, -- EB SBC imm (illegal opc) + "0000" & "100011" & readAbs & aluInT & aluCpx, -- EC CPX abs + "1000" & "110011" & readAbs & aluInT & aluSbc, -- ED SBC abs + "0000" & "100010" & rmwAbs & aluInT & aluInc, -- EE INC abs + "1000" & "110011" & rmwAbs & aluInT & aluIsc, -- EF iISC abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- F0 BEQ + "1000" & "110011" & readIndY & aluInT & aluSbc, -- F1 SBC (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- F2 *** JAM *** + "1000" & "110011" & rmwIndY & aluInT & aluIsc, -- F3 iISC (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- F4 iNOP zp,x + "1000" & "110011" & readZpX & aluInT & aluSbc, -- F5 SBC zp,x + "0000" & "100010" & rmwZpX & aluInT & aluInc, -- F6 INC zp,x + "1000" & "110011" & rmwZpX & aluInT & aluIsc, -- F7 iISC zp,x + "0000" & "001000" & implied & aluInSet & aluXXX, -- F8 SED + "1000" & "110011" & readAbsY & aluInT & aluSbc, -- F9 SBC abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- FA iNOP implied + "1000" & "110011" & rmwAbsY & aluInT & aluIsc, -- FB iISC abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- FC iNOP abs,x + "1000" & "110011" & readAbsX & aluInT & aluSbc, -- FD SBC abs,x + "0000" & "100010" & rmwAbsX & aluInT & aluInc, -- FE INC abs,x + "1000" & "110011" & rmwAbsX & aluInT & aluIsc -- FF iISC abs,x + ); + signal opcInfo : decodedBitsDef; + signal nextOpcInfo : decodedBitsDef; -- Next opcode (decoded) + signal nextOpcInfoReg : decodedBitsDef; -- Next opcode (decoded) pipelined + signal theOpcode : unsigned(7 downto 0); + signal nextOpcode : unsigned(7 downto 0); + +-- Program counter + signal PC : unsigned(15 downto 0); -- Program counter + +-- Address generation + type nextAddrDef is ( + nextAddrHold, + nextAddrIncr, + nextAddrIncrL, -- Increment low bits only (zeropage accesses) + nextAddrIncrH, -- Increment high bits only (page-boundary) + nextAddrDecrH, -- Decrement high bits (branch backwards) + nextAddrPc, + nextAddrIrq, + nextAddrReset, + nextAddrAbs, + nextAddrAbsIndexed, + nextAddrZeroPage, + nextAddrZPIndexed, + nextAddrStack, + nextAddrRelative + ); + signal nextAddr : nextAddrDef; + signal myAddr : unsigned(15 downto 0); + signal myAddrIncr : unsigned(15 downto 0); + signal myAddrIncrH : unsigned(7 downto 0); + signal myAddrDecrH : unsigned(7 downto 0); + signal theWe : std_logic; + + signal irqActive : std_logic; + +-- Output register + signal doReg : unsigned(7 downto 0); + +-- Buffer register + signal T : unsigned(7 downto 0); + +-- General registers + signal A: unsigned(7 downto 0); -- Accumulator + signal X: unsigned(7 downto 0); -- Index X + signal Y: unsigned(7 downto 0); -- Index Y + signal S: unsigned(7 downto 0); -- stack pointer + +-- Status register + signal C: std_logic; -- Carry + signal Z: std_logic; -- Zero flag + signal I: std_logic; -- Interrupt flag + signal D: std_logic; -- Decimal mode + signal V: std_logic; -- Overflow + signal N: std_logic; -- Negative + +-- ALU + -- ALU input + signal aluInput : unsigned(7 downto 0); + signal aluCmpInput : unsigned(7 downto 0); + -- ALU output + signal aluRegisterOut : unsigned(7 downto 0); + signal aluRmwOut : unsigned(7 downto 0); + signal aluC : std_logic; + signal aluZ : std_logic; + signal aluV : std_logic; + signal aluN : std_logic; + -- Pipeline registers + signal aluInputReg : unsigned(7 downto 0); + signal aluCmpInputReg : unsigned(7 downto 0); + signal aluRmwReg : unsigned(7 downto 0); + signal aluNineReg : unsigned(7 downto 0); + signal aluCReg : std_logic; + signal aluZReg : std_logic; + signal aluVReg : std_logic; + signal aluNReg : std_logic; + +-- Indexing + signal indexOut : unsigned(8 downto 0); + +begin +processAluInput: process(clk, opcInfo, A, X, Y, T, S) + variable temp : unsigned(7 downto 0); + begin + temp := (others => '1'); + if opcInfo(opcInA) = '1' then + temp := temp and A; + end if; + if opcInfo(opcInE) = '1' then + temp := temp and (A or X"EE"); + end if; + if opcInfo(opcInX) = '1' then + temp := temp and X; + end if; + if opcInfo(opcInY) = '1' then + temp := temp and Y; + end if; + if opcInfo(opcInS) = '1' then + temp := temp and S; + end if; + if opcInfo(opcInT) = '1' then + temp := temp and T; + end if; + if opcInfo(opcInClear) = '1' then + temp := (others => '0'); + end if; + if rising_edge(clk) then + aluInputReg <= temp; + end if; + + aluInput <= temp; + if pipelineAluMux then + aluInput <= aluInputReg; + end if; + end process; + +processCmpInput: process(clk, opcInfo, A, X, Y) + variable temp : unsigned(7 downto 0); + begin + temp := (others => '1'); + if opcInfo(opcInCmp) = '1' then + temp := temp and A; + end if; + if opcInfo(opcInCpx) = '1' then + temp := temp and X; + end if; + if opcInfo(opcInCpy) = '1' then + temp := temp and Y; + end if; + if rising_edge(clk) then + aluCmpInputReg <= temp; + end if; + + aluCmpInput <= temp; + if pipelineAluMux then + aluCmpInput <= aluCmpInputReg; + end if; + end process; + + -- ALU consists of two parts + -- Read-Modify-Write or index instructions: INC/DEC/ASL/LSR/ROR/ROL + -- Accumulator instructions: ADC, SBC, EOR, AND, EOR, ORA + -- Some instructions are both RMW and accumulator so for most + -- instructions the rmw results are routed through accu alu too. +processAlu: process(clk, opcInfo, aluInput, aluCmpInput, A, T, irqActive, N, V, D, I, Z, C) + variable lowBits: unsigned(5 downto 0); + variable nineBits: unsigned(8 downto 0); + variable rmwBits: unsigned(8 downto 0); + + variable varC : std_logic; + variable varZ : std_logic; + variable varV : std_logic; + variable varN : std_logic; + begin + lowBits := (others => '-'); + nineBits := (others => '-'); + rmwBits := (others => '-'); + varV := aluInput(6); -- Default for BIT / PLP / RTI + + -- Shift unit + case opcInfo(aluMode1From to aluMode1To) is + when aluModeInp => + rmwBits := C & aluInput; + when aluModeP => + rmwBits := C & N & V & '1' & (not irqActive) & D & I & Z & C; + when aluModeInc => + rmwBits := C & (aluInput + 1); + when aluModeDec => + rmwBits := C & (aluInput - 1); + when aluModeAsl => + rmwBits := aluInput & "0"; + when aluModeFlg => + rmwBits := aluInput(0) & aluInput; + when aluModeLsr => + rmwBits := aluInput(0) & "0" & aluInput(7 downto 1); + when aluModeRol => + rmwBits := aluInput & C; + when aluModeRoR => + rmwBits := aluInput(0) & C & aluInput(7 downto 1); + when aluModeAnc => + rmwBits := (aluInput(7) and A(7)) & aluInput; + when others => + rmwBits := C & aluInput; + end case; + + -- ALU + case opcInfo(aluMode2From to aluMode2To) is + when aluModeAdc => + lowBits := ("0" & A(3 downto 0) & rmwBits(8)) + ("0" & rmwBits(3 downto 0) & "1"); + ninebits := ("0" & A) + ("0" & rmwBits(7 downto 0)) + (B"00000000" & rmwBits(8)); + when aluModeSbc => + lowBits := ("0" & A(3 downto 0) & rmwBits(8)) + ("0" & (not rmwBits(3 downto 0)) & "1"); + ninebits := ("0" & A) + ("0" & (not rmwBits(7 downto 0))) + (B"00000000" & rmwBits(8)); + when aluModeCmp => + ninebits := ("0" & aluCmpInput) + ("0" & (not rmwBits(7 downto 0))) + "000000001"; + when aluModeAnd => + ninebits := rmwBits(8) & (A and rmwBits(7 downto 0)); + when aluModeEor => + ninebits := rmwBits(8) & (A xor rmwBits(7 downto 0)); + when aluModeOra => + ninebits := rmwBits(8) & (A or rmwBits(7 downto 0)); + when others => + ninebits := rmwBits; + end case; + + if (opcInfo(aluMode1From to aluMode1To) = aluModeFlg) then + varZ := rmwBits(1); + elsif ninebits(7 downto 0) = X"00" then + varZ := '1'; + else + varZ := '0'; + end if; + + case opcInfo(aluMode2From to aluMode2To) is + when aluModeAdc => + -- decimal mode low bits correction, is done after setting Z flag. + if D = '1' then + if lowBits(5 downto 1) > 9 then + ninebits(3 downto 0) := ninebits(3 downto 0) + 6; + if lowBits(5) = '0' then + ninebits(8 downto 4) := ninebits(8 downto 4) + 1; + end if; + end if; + end if; + when others => + null; + end case; + + if (opcInfo(aluMode1From to aluMode1To) = aluModeBit) + or (opcInfo(aluMode1From to aluMode1To) = aluModeFlg) then + varN := rmwBits(7); + else + varN := nineBits(7); + end if; + varC := ninebits(8); + if opcInfo(aluMode2From to aluMode2To) = aluModeArr then + varC := aluInput(7); + varV := aluInput(7) xor aluInput(6); + end if; + + case opcInfo(aluMode2From to aluMode2To) is + when aluModeAdc => + -- decimal mode high bits correction, is done after setting Z and N flags + varV := (A(7) xor ninebits(7)) and (rmwBits(7) xor ninebits(7)); + if D = '1' then + if ninebits(8 downto 4) > 9 then + ninebits(8 downto 4) := ninebits(8 downto 4) + 6; + varC := '1'; + end if; + end if; + when aluModeSbc => + varV := (A(7) xor ninebits(7)) and ((not rmwBits(7)) xor ninebits(7)); + if D = '1' then + -- Check for borrow (lower 4 bits) + if lowBits(5) = '0' then + ninebits(3 downto 0) := ninebits(3 downto 0) - 6; + end if; + -- Check for borrow (upper 4 bits) + if ninebits(8) = '0' then + ninebits(8 downto 4) := ninebits(8 downto 4) - 6; + end if; + end if; + when aluModeArr => + if D = '1' then + if (("0" & aluInput(3 downto 0)) + ("0000" & aluInput(0))) > 5 then + ninebits(3 downto 0) := ninebits(3 downto 0) + 6; + end if; + if (("0" & aluInput(7 downto 4)) + ("0000" & aluInput(4))) > 5 then + ninebits(8 downto 4) := ninebits(8 downto 4) + 6; + varC := '1'; + else + varC := '0'; + end if; + end if; + when others => + null; + end case; + + if rising_edge(clk) then + aluRmwReg <= rmwBits(7 downto 0); + aluNineReg <= ninebits(7 downto 0); + aluCReg <= varC; + aluZReg <= varZ; + aluVReg <= varV; + aluNReg <= varN; + end if; + + aluRmwOut <= rmwBits(7 downto 0); + aluRegisterOut <= ninebits(7 downto 0); + aluC <= varC; + aluZ <= varZ; + aluV <= varV; + aluN <= varN; + if pipelineAluOut then + aluRmwOut <= aluRmwReg; + aluRegisterOut <= aluNineReg; + aluC <= aluCReg; + aluZ <= aluZReg; + aluV <= aluVReg; + aluN <= aluNReg; + end if; + end process; + +calcInterrupt: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + if theCpuCycle = cycleStack4 + or reset = '1' then + nmiReg <= '1'; + end if; + + if nextCpuCycle /= cycleBranchTaken + and nextCpuCycle /= opcodeFetch then + irqReg <= irq_n; + nmiEdge <= nmi_n; + if (nmiEdge = '1') and (nmi_n = '0') then + nmiReg <= '0'; + end if; + end if; + -- The 'or opcInfo(opcSetI)' prevents NMI immediately after BRK or IRQ. + -- Presumably this is done in the real 6502/6510 to prevent a double IRQ. + processIrq <= not ((nmiReg and (irqReg or I)) or opcInfo(opcIRQ)); + end if; + end if; + end process; + +calcNextOpcode: process(clk, di, reset, processIrq) + variable myNextOpcode : unsigned(7 downto 0); + begin + -- Next opcode is read from input unless a reset or IRQ is pending. + myNextOpcode := di; + if reset = '1' then + myNextOpcode := X"4C"; + elsif processIrq = '1' then + myNextOpcode := X"00"; + end if; + + nextOpcode <= myNextOpcode; + end process; + + nextOpcInfo <= opcodeInfoTable(to_integer(nextOpcode)); + process(clk) + begin + if rising_edge(clk) then + nextOpcInfoReg <= nextOpcInfo; + end if; + end process; + + -- Read bits and flags from opcodeInfoTable and store in opcInfo. + -- This info is used to control the execution of the opcode. +calcOpcInfo: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + if (reset = '1') or (theCpuCycle = opcodeFetch) then + opcInfo <= nextOpcInfo; + if pipelineOpcode then + opcInfo <= nextOpcInfoReg; + end if; + end if; + end if; + end if; + end process; + +calcTheOpcode: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + if theCpuCycle = opcodeFetch then + irqActive <= '0'; + if processIrq = '1' then + irqActive <= '1'; + end if; + -- Fetch opcode + theOpcode <= nextOpcode; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- State machine +-- ----------------------------------------------------------------------- + process(enable, theCpuCycle, opcInfo) + begin + updateRegisters <= false; + if enable = '1' then + if opcInfo(opcRti) = '1' then + if theCpuCycle = cycleRead then + updateRegisters <= true; + end if; + elsif theCpuCycle = opcodeFetch then + updateRegisters <= true; + end if; + end if; + end process; + + debugOpcode <= theOpcode; + process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + theCpuCycle <= nextCpuCycle; + end if; + if reset = '1' then + theCpuCycle <= cycle2; + end if; + end if; + end process; + + -- Determine the next cpu cycle. After the last cycle we always + -- go to opcodeFetch to get the next opcode. +calcNextCpuCycle: process(theCpuCycle, opcInfo, theOpcode, indexOut, T, N, V, C, Z) + begin + nextCpuCycle <= opcodeFetch; + + case theCpuCycle is + when opcodeFetch => + nextCpuCycle <= cycle2; + when cycle2 => + if opcInfo(opcBranch) = '1' then + if (N = theOpcode(5) and theOpcode(7 downto 6) = "00") + or (V = theOpcode(5) and theOpcode(7 downto 6) = "01") + or (C = theOpcode(5) and theOpcode(7 downto 6) = "10") + or (Z = theOpcode(5) and theOpcode(7 downto 6) = "11") then + -- Branch condition is true + nextCpuCycle <= cycleBranchTaken; + end if; + elsif (opcInfo(opcStackUp) = '1') then + nextCpuCycle <= cycleStack1; + elsif opcInfo(opcStackAddr) = '1' + and opcInfo(opcStackData) = '1' then + nextCpuCycle <= cycleStack2; + elsif opcInfo(opcStackAddr) = '1' then + nextCpuCycle <= cycleStack1; + elsif opcInfo(opcStackData) = '1' then + nextCpuCycle <= cycleWrite; + elsif opcInfo(opcAbsolute) = '1' then + nextCpuCycle <= cycle3; + elsif opcInfo(opcIndirect) = '1' then + if opcInfo(indexX) = '1' then + nextCpuCycle <= cyclePreIndirect; + else + nextCpuCycle <= cycleIndirect; + end if; + elsif opcInfo(opcZeroPage) = '1' then + if opcInfo(opcWrite) = '1' then + if (opcInfo(indexX) = '1') + or (opcInfo(indexY) = '1') then + nextCpuCycle <= cyclePreWrite; + else + nextCpuCycle <= cycleWrite; + end if; + else + if (opcInfo(indexX) = '1') + or (opcInfo(indexY) = '1') then + nextCpuCycle <= cyclePreRead; + else + nextCpuCycle <= cycleRead2; + end if; + end if; + elsif opcInfo(opcJump) = '1' then + nextCpuCycle <= cycleJump; + end if; + when cycle3 => + nextCpuCycle <= cycleRead; + if opcInfo(opcWrite) = '1' then + if (opcInfo(indexX) = '1') + or (opcInfo(indexY) = '1') then + nextCpuCycle <= cyclePreWrite; + else + nextCpuCycle <= cycleWrite; + end if; + end if; + if (opcInfo(opcIndirect) = '1') + and (opcInfo(indexX) = '1') then + if opcInfo(opcWrite) = '1' then + nextCpuCycle <= cycleWrite; + else + nextCpuCycle <= cycleRead2; + end if; + end if; + when cyclePreIndirect => + nextCpuCycle <= cycleIndirect; + when cycleIndirect => + nextCpuCycle <= cycle3; + when cycleBranchTaken => + if indexOut(8) /= T(7) then + -- Page boundary crossing during branch. + nextCpuCycle <= cycleBranchPage; + end if; + when cyclePreRead => + if opcInfo(opcZeroPage) = '1' then + nextCpuCycle <= cycleRead2; + end if; + when cycleRead => + if opcInfo(opcJump) = '1' then + nextCpuCycle <= cycleJump; + elsif indexOut(8) = '1' then + -- Page boundary crossing while indexed addressing. + nextCpuCycle <= cycleRead2; + elsif opcInfo(opcRmw) = '1' then + nextCpuCycle <= cycleRmw; + if opcInfo(indexX) = '1' + or opcInfo(indexY) = '1' then + -- 6510 needs extra cycle for indexed addressing + -- combined with RMW indexing + nextCpuCycle <= cycleRead2; + end if; + end if; + when cycleRead2 => + if opcInfo(opcRmw) = '1' then + nextCpuCycle <= cycleRmw; + end if; + when cycleRmw => + nextCpuCycle <= cycleWrite; + when cyclePreWrite => + nextCpuCycle <= cycleWrite; + when cycleStack1 => + nextCpuCycle <= cycleRead; + if opcInfo(opcStackAddr) = '1' then + nextCpuCycle <= cycleStack2; + end if; + when cycleStack2 => + nextCpuCycle <= cycleStack3; + if opcInfo(opcRti) = '1' then + nextCpuCycle <= cycleRead; + end if; + if opcInfo(opcStackData) = '0' + and opcInfo(opcStackUp) = '1' then + nextCpuCycle <= cycleJump; + end if; + when cycleStack3 => + nextCpuCycle <= cycleRead; + if opcInfo(opcStackData) = '0' + or opcInfo(opcStackUp) = '1' then + nextCpuCycle <= cycleJump; + elsif opcInfo(opcStackAddr) = '1' then + nextCpuCycle <= cycleStack4; + end if; + when cycleStack4 => + nextCpuCycle <= cycleRead; + when cycleJump => + if opcInfo(opcIncrAfter) = '1' then + -- Insert extra cycle + nextCpuCycle <= cycleEnd; + end if; + when others => + null; + end case; + end process; + +-- ----------------------------------------------------------------------- +-- T register +-- ----------------------------------------------------------------------- +calcT: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + case theCpuCycle is + when cycle2 => + T <= di; + when cycleStack1 | cycleStack2 => + if opcInfo(opcStackUp) = '1' then + -- Read from stack + T <= di; + end if; + when cycleIndirect | cycleRead | cycleRead2 => + T <= di; + when others => + null; + end case; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- A register +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateA) = '1' then + A <= aluRegisterOut; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- X register +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateX) = '1' then + X <= aluRegisterOut; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Y register +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateY) = '1' then + Y <= aluRegisterOut; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- C flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateC) = '1' then + C <= aluC; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Z flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateZ) = '1' then + Z <= aluZ; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- I flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateI) = '1' then + I <= aluInput(2); + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- D flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateD) = '1' then + D <= aluInput(3); + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- V flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateV) = '1' then + V <= aluV; + end if; + end if; + if enable = '1' then + if soReg = '1' and so_n = '0' then + V <= '1'; + end if; + soReg <= so_n; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- N flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateN) = '1' then + N <= aluN; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Stack pointer +-- ----------------------------------------------------------------------- + process(clk) + variable sIncDec : unsigned(7 downto 0); + variable updateFlag : boolean; + begin + if rising_edge(clk) then + + if opcInfo(opcStackUp) = '1' then + sIncDec := S + 1; + else + sIncDec := S - 1; + end if; + + if enable = '1' then + updateFlag := false; + case nextCpuCycle is + when cycleStack1 => + if (opcInfo(opcStackUp) = '1') + or (opcInfo(opcStackData) = '1') then + updateFlag := true; + end if; + when cycleStack2 => + updateFlag := true; + when cycleStack3 => + updateFlag := true; + when cycleStack4 => + updateFlag := true; + when cycleRead => + if opcInfo(opcRti) = '1' then + updateFlag := true; + end if; + when cycleWrite => + if opcInfo(opcStackData) = '1' then + updateFlag := true; + end if; + when others => + null; + end case; + if updateFlag then + S <= sIncDec; + end if; + end if; + if updateRegisters then + if opcInfo(opcUpdateS) = '1' then + S <= aluRegisterOut; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Data out +-- ----------------------------------------------------------------------- +--calcDo: process(cpuNo, theCpuCycle, aluOut, PC, T) +calcDo: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + doReg <= aluRmwOut; + if opcInfo(opcInH) = '1' then + -- For illegal opcodes SHA, SHX, SHY, SHS + doReg <= aluRmwOut and myAddrIncrH; + end if; + + case nextCpuCycle is + when cycleStack2 => + if opcInfo(opcIRQ) = '1' + and irqActive = '0' then + doReg <= myAddrIncr(15 downto 8); + else + doReg <= PC(15 downto 8); + end if; + when cycleStack3 => + doReg <= PC(7 downto 0); + when cycleRmw => +-- do <= T; -- Read-modify-write write old value first. + doReg <= di; -- Read-modify-write write old value first. + when others => null; + end case; + end if; + end if; + end process; + do <= doReg; + + + +-- ----------------------------------------------------------------------- +-- Write enable +-- ----------------------------------------------------------------------- +calcWe: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + theWe <= '0'; + case nextCpuCycle is + when cycleStack1 => + if opcInfo(opcStackUp) = '0' + and ((opcInfo(opcStackAddr) = '0') + or (opcInfo(opcStackData) = '1')) then + theWe <= '1'; + end if; + when cycleStack2 | cycleStack3 | cycleStack4 => + if opcInfo(opcStackUp) = '0' then + theWe <= '1'; + end if; + when cycleRmw => + theWe <= '1'; + when cycleWrite => + theWe <= '1'; + when others => + null; + end case; + end if; + end if; + end process; + we <= theWe; + +-- ----------------------------------------------------------------------- +-- Program counter +-- ----------------------------------------------------------------------- +calcPC: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + case theCpuCycle is + when opcodeFetch => + PC <= myAddr; + when cycle2 => + if irqActive = '0' then + if opcInfo(opcSecondByte) = '1' then + PC <= myAddrIncr; + else + PC <= myAddr; + end if; + end if; + when cycle3 => + if opcInfo(opcAbsolute) = '1' then + PC <= myAddrIncr; + end if; + when others => + null; + end case; + end if; + end if; + end process; + debugPc <= PC; + +-- ----------------------------------------------------------------------- +-- Address generation +-- ----------------------------------------------------------------------- +calcNextAddr: process(theCpuCycle, opcInfo, indexOut, T, reset) + begin + nextAddr <= nextAddrIncr; + case theCpuCycle is + when cycle2 => + if opcInfo(opcStackAddr) = '1' + or opcInfo(opcStackData) = '1' then + nextAddr <= nextAddrStack; + elsif opcInfo(opcAbsolute) = '1' then + nextAddr <= nextAddrIncr; + elsif opcInfo(opcZeroPage) = '1' then + nextAddr <= nextAddrZeroPage; + elsif opcInfo(opcIndirect) = '1' then + nextAddr <= nextAddrZeroPage; + elsif opcInfo(opcSecondByte) = '1' then + nextAddr <= nextAddrIncr; + else + nextAddr <= nextAddrHold; + end if; + when cycle3 => + if (opcInfo(opcIndirect) = '1') + and (opcInfo(indexX) = '1') then + nextAddr <= nextAddrAbs; + else + nextAddr <= nextAddrAbsIndexed; + end if; + when cyclePreIndirect => + nextAddr <= nextAddrZPIndexed; + when cycleIndirect => + nextAddr <= nextAddrIncrL; + when cycleBranchTaken => + nextAddr <= nextAddrRelative; + when cycleBranchPage => + if T(7) = '0' then + nextAddr <= nextAddrIncrH; + else + nextAddr <= nextAddrDecrH; + end if; + when cyclePreRead => + nextAddr <= nextAddrZPIndexed; + when cycleRead => + nextAddr <= nextAddrPc; + if opcInfo(opcJump) = '1' then + -- Emulate 6510 bug, jmp(xxFF) fetches from same page. + -- Replace with nextAddrIncr if emulating 65C02 or later cpu. + nextAddr <= nextAddrIncrL; + elsif indexOut(8) = '1' then + nextAddr <= nextAddrIncrH; + elsif opcInfo(opcRmw) = '1' then + nextAddr <= nextAddrHold; + end if; + when cycleRead2 => + nextAddr <= nextAddrPc; + if opcInfo(opcRmw) = '1' then + nextAddr <= nextAddrHold; + end if; + when cycleRmw => + nextAddr <= nextAddrHold; + when cyclePreWrite => + nextAddr <= nextAddrHold; + if opcInfo(opcZeroPage) = '1' then + nextAddr <= nextAddrZPIndexed; + elsif indexOut(8) = '1' then + nextAddr <= nextAddrIncrH; + end if; + when cycleWrite => + nextAddr <= nextAddrPc; + when cycleStack1 => + nextAddr <= nextAddrStack; + when cycleStack2 => + nextAddr <= nextAddrStack; + when cycleStack3 => + nextAddr <= nextAddrStack; + if opcInfo(opcStackData) = '0' then + nextAddr <= nextAddrPc; + end if; + when cycleStack4 => + nextAddr <= nextAddrIrq; + when cycleJump => + nextAddr <= nextAddrAbs; + when others => + null; + end case; + if reset = '1' then + nextAddr <= nextAddrReset; + end if; + end process; + +indexAlu: process(opcInfo, myAddr, T, X, Y) + begin + if opcInfo(indexX) = '1' then + indexOut <= (B"0" & T) + (B"0" & X); + elsif opcInfo(indexY) = '1' then + indexOut <= (B"0" & T) + (B"0" & Y); + elsif opcInfo(opcBranch) = '1' then + indexOut <= (B"0" & T) + (B"0" & myAddr(7 downto 0)); + else + indexOut <= B"0" & T; + end if; + end process; + +calcAddr: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + case nextAddr is + when nextAddrIncr => myAddr <= myAddrIncr; + when nextAddrIncrL => myAddr(7 downto 0) <= myAddrIncr(7 downto 0); + when nextAddrIncrH => myAddr(15 downto 8) <= myAddrIncrH; + when nextAddrDecrH => myAddr(15 downto 8) <= myAddrDecrH; + when nextAddrPc => myAddr <= PC; + when nextAddrIrq => + myAddr <= X"FFFE"; + if nmiReg = '0' then + myAddr <= X"FFFA"; + end if; + when nextAddrReset => myAddr <= X"FFFC"; + when nextAddrAbs => myAddr <= di & T; + when nextAddrAbsIndexed => myAddr <= di & indexOut(7 downto 0); + when nextAddrZeroPage => myAddr <= "00000000" & di; + when nextAddrZPIndexed => myAddr <= "00000000" & indexOut(7 downto 0); + when nextAddrStack => myAddr <= "00000001" & S; + when nextAddrRelative => myAddr(7 downto 0) <= indexOut(7 downto 0); + when others => null; + end case; + end if; + end if; + end process; + + myAddrIncr <= myAddr + 1; + myAddrIncrH <= myAddr(15 downto 8) + 1; + myAddrDecrH <= myAddr(15 downto 8) - 1; + + addr <= myAddr; + + debugA <= A; + debugX <= X; + debugY <= Y; + debugS <= S; + +end architecture; + + diff --git a/Commodore - 64_Mist/rtl/cpu_6510.vhd b/Commodore - 64_Mist/rtl/cpu_6510.vhd new file mode 100644 index 00000000..a1a8d2ba --- /dev/null +++ b/Commodore - 64_Mist/rtl/cpu_6510.vhd @@ -0,0 +1,150 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- 6510 wrapper for 65xx core +-- Adds 8 bit I/O port mapped at addresses $0000 to $0001 +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use ieee.std_logic_1164.ALL; +use ieee.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity cpu_6510 is + generic ( + pipelineOpcode : boolean; + pipelineAluMux : boolean; + pipelineAluOut : boolean + ); + port ( + clk : in std_logic; + enable : in std_logic; + reset : in std_logic; + nmi_n : in std_logic; + nmi_ack : out std_logic; + irq_n : in std_logic; + + di : in unsigned(7 downto 0); + do : out unsigned(7 downto 0); + addr : out unsigned(15 downto 0); + we : out std_logic; + + diIO : in unsigned(7 downto 0); + doIO : out unsigned(7 downto 0); + + debugOpcode : out unsigned(7 downto 0); + debugPc : out unsigned(15 downto 0); + debugA : out unsigned(7 downto 0); + debugX : out unsigned(7 downto 0); + debugY : out unsigned(7 downto 0); + debugS : out unsigned(7 downto 0) + ); +end cpu_6510; + +-- ----------------------------------------------------------------------- + +architecture rtl of cpu_6510 is + signal localA : unsigned(15 downto 0); + signal localDi : unsigned(7 downto 0); + signal localDo : unsigned(7 downto 0); + signal localWe : std_logic; + + signal currentIO : unsigned(7 downto 0); + signal ioDir : unsigned(7 downto 0); + signal ioData : unsigned(7 downto 0); + + signal accessIO : std_logic; +begin + cpuInstance: entity work.cpu65xx(fast) + generic map ( + pipelineOpcode => pipelineOpcode, + pipelineAluMux => pipelineAluMux, + pipelineAluOut => pipelineAluOut + ) + port map ( + clk => clk, + enable => enable, + reset => reset, + nmi_n => nmi_n, + nmi_ack => nmi_ack, + irq_n => irq_n, + + di => localDi, + do => localDo, + addr => localA, + we => localWe, + + debugOpcode => debugOpcode, + debugPc => debugPc, + debugA => debugA, + debugX => debugX, + debugY => debugY, + debugS => debugS + ); + + process(localA) + begin + accessIO <= '0'; + if localA(15 downto 1) = 0 then + accessIO <= '1'; + end if; + end process; + + process(di, localA, ioDir, currentIO, accessIO) + begin + localDi <= di; + if accessIO = '1' then + if localA(0) = '0' then + localDi <= ioDir; + else + localDi <= currentIO; + end if; + end if; + end process; + + process(clk) + begin + if rising_edge(clk) then + if accessIO = '1' then + if localWe = '1' + and enable = '1' then + if localA(0) = '0' then + ioDir <= localDo; + else + ioData <= localDo; + end if; + end if; + end if; + if reset = '1' then + ioDir <= (others => '0'); + end if; + end if; + end process; + + process(ioDir, ioData, diIO) + begin + for i in 0 to 7 loop + if ioDir(i) = '0' then + currentIO(i) <= diIO(i); + else + currentIO(i) <= ioData(i); + end if; + end loop; + end process; + + -- Cunnect zee wires + addr <= localA; + do <= localDo; + we <= localWe; + doIO <= currentIO; +end architecture; diff --git a/Commodore - 64_Mist/rtl/fpga64_buslogic_roms_mmu.vhd b/Commodore - 64_Mist/rtl/fpga64_buslogic_roms_mmu.vhd new file mode 100644 index 00000000..933c436e --- /dev/null +++ b/Commodore - 64_Mist/rtl/fpga64_buslogic_roms_mmu.vhd @@ -0,0 +1,339 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- + +-- ----------------------------------------------------------------------- +-- Dar 08/03/2014 +-- +-- Based on mixing both fpga64_buslogic_roms and fpga64_buslogic_nommu +-- RAM should be external SRAM +-- Basic, Char and Kernel ROMs are included +-- Original Kernel replaced by JiffyDos +-- ----------------------------------------------------------------------- + +library IEEE; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; + +entity fpga64_buslogic is + port ( + clk : in std_logic; + reset : in std_logic; + c64gs : in std_logic; + + cpuHasBus : in std_logic; + + ramData: in unsigned(7 downto 0); + + -- 2 CHAREN + -- 1 HIRAM + -- 0 LORAM + bankSwitch: in unsigned(2 downto 0); + + -- From cartridge port + game : in std_logic; + exrom : in std_logic; + ioE_rom : in std_logic; + ioF_rom : in std_logic; + max_ram : in std_logic; + + c64rom_addr: in std_logic_vector(13 downto 0); + c64rom_data: in std_logic_vector(7 downto 0); + c64rom_wr: in std_logic; + + cpuWe: in std_logic; + cpuAddr: in unsigned(15 downto 0); + cpuData: in unsigned(7 downto 0); + vicAddr: in unsigned(15 downto 0); + vicData: in unsigned(7 downto 0); + sidData: in unsigned(7 downto 0); + colorData: in unsigned(3 downto 0); + cia1Data: in unsigned(7 downto 0); + cia2Data: in unsigned(7 downto 0); + lastVicData : in unsigned(7 downto 0); + + systemWe: out std_logic; + systemAddr: out unsigned(15 downto 0); + dataToCpu : out unsigned(7 downto 0); + dataToVic : out unsigned(7 downto 0); + + cs_vic: out std_logic; + cs_sid: out std_logic; + cs_color : out std_logic; + cs_cia1: out std_logic; + cs_cia2: out std_logic; + cs_ram: out std_logic; + + -- To catridge port + cs_ioE: out std_logic; + cs_ioF: out std_logic; + cs_romL : out std_logic; + cs_romH : out std_logic; + cs_UMAXromH : out std_logic + ); +end fpga64_buslogic; + +-- ----------------------------------------------------------------------- + +architecture rtl of fpga64_buslogic is + component fpga64_colorram is + port ( + clk: in std_logic; + cs: in std_logic; + we: in std_logic; + + addr: in unsigned(9 downto 0); + di: in unsigned(3 downto 0); + do: out unsigned(3 downto 0) + ); + end component; + + signal charData: unsigned(7 downto 0); + signal basicData: unsigned(7 downto 0); + signal romData: std_logic_vector(7 downto 0); + signal romData_c64: std_logic_vector(7 downto 0); + signal romData_c64gs: std_logic_vector(7 downto 0); + signal c64gs_ena : std_logic := '0'; + + signal cs_CharReg : std_logic; + signal cs_romReg : std_logic; + signal vicCharReg : std_logic; + + signal cs_ramReg : std_logic; + signal cs_vicReg : std_logic; + signal cs_sidReg : std_logic; + signal cs_colorReg : std_logic; + signal cs_cia1Reg : std_logic; + signal cs_cia2Reg : std_logic; + signal cs_ioEReg : std_logic; + signal cs_ioFReg : std_logic; + signal cs_romLReg : std_logic; + signal cs_romHReg : std_logic; + signal cs_UMAXromHReg : std_logic; + signal ultimax : std_logic; + + signal currentAddr: unsigned(15 downto 0); + +begin + charrom: entity work.rom_c64_chargen + port map ( + clk => clk, + addr => currentAddr(11 downto 0), + do => charData + ); + + kernelrom: entity work.rom_C64 + port map + ( + clock => clk, + + wren => c64rom_wr, + data => c64rom_data, + wraddress => c64rom_addr, + + rdaddress => std_logic_vector(cpuAddr(14) & cpuAddr(12 downto 0)), + q => romData_c64 + ); + +-- kernelromGS: entity work.rom_GS64 +-- port map +-- ( +-- clock => clk, + +-- wren => '0', +-- data => (others => '0'), +-- wraddress => (others => '0'), + +-- rdaddress => std_logic_vector(cpuAddr(14) & cpuAddr(12 downto 0)), +-- q => romData_c64gs +-- ); + + + romData <= romData_c64gs when c64gs_ena = '1' else romData_c64; + process(clk) + begin + if rising_edge(clk) then + if reset = '1' then + c64gs_ena <= c64gs; + end if; + end if; + end process; + + -- + --begin + process(ramData, vicData, sidData, colorData, + cia1Data, cia2Data, charData, romData, + cs_romHReg, cs_romLReg, cs_romReg, cs_CharReg, + cs_ramReg, cs_vicReg, cs_sidReg, cs_colorReg, + cs_cia1Reg, cs_cia2Reg, lastVicData, + cs_ioEReg, cs_ioFReg, ioE_rom, ioF_rom) + begin + -- If no hardware is addressed the bus is floating. + -- It will contain the last data read by the VIC. (if a C64 is shielded correctly) + dataToCpu <= lastVicData; + if cs_CharReg = '1' then + dataToCpu <= charData; + elsif cs_romReg = '1' then + dataToCpu <= unsigned(romData); + elsif cs_ramReg = '1' then + dataToCpu <= ramData; + elsif cs_vicReg = '1' then + dataToCpu <= vicData; + elsif cs_sidReg = '1' then + dataToCpu <= sidData; + elsif cs_colorReg = '1' then + dataToCpu(3 downto 0) <= colorData; + elsif cs_cia1Reg = '1' then + dataToCpu <= cia1Data; + elsif cs_cia2Reg = '1' then + dataToCpu <= cia2Data; + elsif cs_romLReg = '1' then + dataToCpu <= ramData; + elsif cs_romHReg = '1' then + dataToCpu <= ramData; + elsif cs_ioEReg = '1' and ioE_rom = '1' then + dataToCpu <= ramData; + elsif cs_ioFReg = '1' and ioF_rom = '1' then + dataToCpu <= ramData; + end if; + end process; + + ultimax <= exrom and (not game); + + process(clk) + begin + if rising_edge(clk) then + currentAddr <= (others => '1'); -- Prevent generation of a latch when neither vic or cpu is using the bus. + + systemWe <= '0'; + vicCharReg <= '0'; + cs_CharReg <= '0'; + cs_romReg <= '0'; + cs_ramReg <= '0'; + cs_vicReg <= '0'; + cs_sidReg <= '0'; + cs_colorReg <= '0'; + cs_cia1Reg <= '0'; + cs_cia2Reg <= '0'; + cs_ioEReg <= '0'; + cs_ioFReg <= '0'; + cs_romLReg <= '0'; + cs_romHReg <= '0'; + cs_UMAXromHReg <= '0'; -- Ultimax flag for the VIC access - LCA + + if (cpuHasBus = '1') then + -- The 6502 CPU has the bus. + currentAddr <= cpuAddr; + case cpuAddr(15 downto 12) is + when X"E" | X"F" => + if ultimax = '1' and cpuWe = '0' then + -- ULTIMAX MODE - drop out the kernal - LCA + cs_romHReg <= '1'; + elsif cpuWe = '0' and bankSwitch(1) = '1' then + -- Read kernal + cs_romReg <= '1'; + else + -- 64Kbyte RAM layout + cs_ramReg <= '1'; + end if; + when X"D" => + if (ultimax = '0' or max_ram = '1') and bankSwitch(1) = '0' and bankSwitch(0) = '0' then + -- 64Kbyte RAM layout + cs_ramReg <= '1'; + elsif ultimax = '1' or bankSwitch(2) = '1' then + case cpuAddr(11 downto 8) is + when X"0" | X"1" | X"2" | X"3" => + cs_vicReg <= '1'; + when X"4" | X"5" | X"6" | X"7" => + cs_sidReg <= '1'; + when X"8" | X"9" | X"A" | X"B" => + cs_colorReg <= '1'; + when X"C" => + cs_cia1Reg <= '1'; + when X"D" => + cs_cia2Reg <= '1'; + when X"E" => + cs_ioEReg <= '1'; + when X"F" => + cs_ioFReg <= '1'; + when others => + null; + end case; + else + -- I/O space turned off. Read from charrom or write to RAM. + if cpuWe = '0' then + cs_CharReg <= '1'; + else + cs_ramReg <= '1'; + end if; + end if; + when X"A" | X"B" => + if exrom = '0' and game = '0' and cpuWe = '0' and bankSwitch(1) = '1' then + -- Access cartridge with romH + cs_romHReg <= '1'; + elsif ultimax = '0' and cpuWe = '0' and bankSwitch(1) = '1' and bankSwitch(0) = '1' then + -- Access basic rom + -- May need turning off if kernal banked out LCA + cs_romReg <= '1'; + elsif ultimax = '0' or max_ram = '1' then + -- If not in Ultimax mode access ram + cs_ramReg <= '1'; + end if; + when X"8" | X"9" => + if ultimax = '1' then + -- Ultimax access with romL + cs_romLReg <= '1'; + elsif exrom = '0' and bankSwitch(1) = '1' and bankSwitch(0) = '1' then + -- Access cartridge with romL + cs_romLReg <= '1'; + else + cs_ramReg <= '1'; + end if; + when X"0" => + cs_ramReg <= '1'; + when others => + -- If not in Ultimax mode access ram + if ultimax = '0' or max_ram = '1' then + cs_ramReg <= '1'; + end if; + end case; + + systemWe <= cpuWe; + else + -- The VIC-II has the bus. + currentAddr <= vicAddr; + + if ultimax = '0' and vicAddr(14 downto 12)="001" then + vicCharReg <= '1'; + elsif ultimax = '1' and vicAddr(13 downto 12)="11" then + -- ultimax mode changes vic addressing - LCA + cs_UMAXromHReg <= '1'; + else + cs_ramReg <= '1'; + end if; + end if; + end if; + end process; + + cs_ram <= cs_ramReg or cs_romLReg or cs_romHReg or cs_UMAXromHReg; -- need to keep ram active for cartridges LCA + cs_vic <= cs_vicReg; + cs_sid <= cs_sidReg; + cs_color <= cs_colorReg; + cs_cia1 <= cs_cia1Reg; + cs_cia2 <= cs_cia2Reg; + cs_ioE <= cs_ioEReg; + cs_ioF <= cs_ioFReg; + cs_romL <= cs_romLReg; + cs_romH <= cs_romHReg; + cs_UMAXromH <= cs_UMAXromHReg; + + dataToVic <= charData when vicCharReg = '1' else ramData; + systemAddr <= currentAddr; +end architecture; diff --git a/Commodore - 64_Mist/rtl/fpga64_bustiming.vhd b/Commodore - 64_Mist/rtl/fpga64_bustiming.vhd new file mode 100644 index 00000000..715020b6 --- /dev/null +++ b/Commodore - 64_Mist/rtl/fpga64_bustiming.vhd @@ -0,0 +1,74 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- Reset circuit +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.std_logic_unsigned.ALL; +use IEEE.numeric_std.all; + +entity fpga64_busTiming is + generic ( + resetCycles: integer := 15; + noofBusCycles : integer := 52 + ); + port ( + clkIn : in std_logic; + rstIn : in std_logic; + rstOut : out std_logic; + endOfCycle : out std_logic; -- Signal is 1 on last count of current cycle. + busCycle : out unsigned(5 downto 0) + ); +end fpga64_busTiming; + +-- ----------------------------------------------------------------------- + +architecture rtl of fpga64_busTiming is +signal clk33 : std_logic; +signal nextCycle : std_logic; +signal resetCycleCounter : integer range 0 to resetCycles := 0; +signal busCycleCounter : unsigned(5 downto 0) := (others => '0'); +begin + clk33 <= clkIn; + + process(clk33) + begin + if rising_edge(clk33) then + if (busCycleCounter = (noofBusCycles - 2) ) then + nextCycle <= '1'; + else + nextCycle <= '0'; + end if; + if nextCycle = '1' then + busCycleCounter <= (others => '0'); + else + busCycleCounter <= busCycleCounter + 1; + end if; + if resetCycleCounter = resetCycles then + rstOut <= '0'; + else + rstOut <= '1'; + if nextCycle = '1' then + resetCycleCounter <= resetCycleCounter + 1; + end if; + end if; + if rstIn = '1' then +-- nextCycle <= '0'; + resetCycleCounter <= 0; + end if; + end if; + end process; + busCycle <= busCycleCounter; + endOfCycle <= nextCycle; +end architecture; diff --git a/Commodore - 64_Mist/rtl/fpga64_keyboard_matrix_mark_mcdougall.vhd b/Commodore - 64_Mist/rtl/fpga64_keyboard_matrix_mark_mcdougall.vhd new file mode 100644 index 00000000..ae1ebc0a --- /dev/null +++ b/Commodore - 64_Mist/rtl/fpga64_keyboard_matrix_mark_mcdougall.vhd @@ -0,0 +1,475 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- 'Joystick emulation on keypad' additions by +-- Mark McDougall (msmcdoug@iinet.net.au) +-- ----------------------------------------------------------------------- +-- +-- VIC20/C64 Keyboard matrix +-- +-- Hardware huh? +-- In original machine if a key is pressed a contact is made. +-- Bidirectional reading is possible on real hardware, which is difficult +-- to emulate. (set backwardsReadingEnabled to '1' if you want this enabled). +-- Then we have the joysticks, one of which is normally connected +-- to a OUTPUT pin. +-- +-- Emulation: +-- All pins are high except when one is driven low and there is a +-- connection. This is consistent with joysticks that force a line +-- low too. CIA will put '1's when set to input to help this emulation. +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.std_logic_unsigned.ALL; +use IEEE.numeric_std.ALL; + +entity fpga64_keyboard_matrix is + port ( + clk: in std_logic; + theScanCode: in unsigned(7 downto 0); + newScanCode: in std_logic; + + joyA: in unsigned(4 downto 0); + joyB: in unsigned(4 downto 0); + + pai: in unsigned(7 downto 0); + pbi: in unsigned(7 downto 0); + pao: out unsigned(7 downto 0); + pbo: out unsigned(7 downto 0); + + reset_key : out std_logic; + restore_key : out std_logic; + videoKey : out std_logic; + traceKey : out std_logic; + trace2Key : out std_logic; + disk_num : out std_logic_vector(7 downto 0); + + cart_detach_key : out std_logic; -- CTRL D - remove active cartridge signal - LCA + + -- Config + -- backwardsReadingEnabled = 1 allows reversal of PIA registers to still work. + -- not needed for kernel/normal operation only for some specific programs. + -- set to 0 to save some hardware. + backwardsReadingEnabled : in std_logic + ); +end fpga64_keyboard_matrix; + +architecture rtl of fpga64_keyboard_matrix is + signal extendedFlag: std_logic := '0'; + signal releaseFlag: std_logic := '0'; + + signal key_del: std_logic := '0'; + signal key_return: std_logic := '0'; + signal key_left: std_logic := '0'; + signal key_right: std_logic := '0'; + signal key_f7: std_logic := '0'; + signal key_f1: std_logic := '0'; + signal key_f3: std_logic := '0'; + signal key_f5: std_logic := '0'; + signal key_up: std_logic := '0'; + signal key_down: std_logic := '0'; + + signal key_3: std_logic := '0'; + signal key_W: std_logic := '0'; + signal key_A: std_logic := '0'; + signal key_4: std_logic := '0'; + signal key_Z: std_logic := '0'; + signal key_S: std_logic := '0'; + signal key_E: std_logic := '0'; + signal key_shiftl: std_logic := '0'; + + signal key_5: std_logic := '0'; + signal key_R: std_logic := '0'; + signal key_D: std_logic := '0'; + signal key_6: std_logic := '0'; + signal key_C: std_logic := '0'; + signal key_F: std_logic := '0'; + signal key_T: std_logic := '0'; + signal key_X: std_logic := '0'; + + signal key_7: std_logic := '0'; + signal key_Y: std_logic := '0'; + signal key_G: std_logic := '0'; + signal key_8: std_logic := '0'; + signal key_B: std_logic := '0'; + signal key_H: std_logic := '0'; + signal key_U: std_logic := '0'; + signal key_V: std_logic := '0'; + + signal key_9: std_logic := '0'; + signal key_I: std_logic := '0'; + signal key_J: std_logic := '0'; + signal key_0: std_logic := '0'; + signal key_M: std_logic := '0'; + signal key_K: std_logic := '0'; + signal key_O: std_logic := '0'; + signal key_N: std_logic := '0'; + + signal key_plus: std_logic := '0'; + signal key_P: std_logic := '0'; + signal key_L: std_logic := '0'; + signal key_minus: std_logic := '0'; + signal key_dot: std_logic := '0'; + signal key_colon: std_logic := '0'; + signal key_at: std_logic := '0'; + signal key_comma: std_logic := '0'; + + signal key_pound: std_logic := '0'; + signal key_star: std_logic := '0'; + signal key_semicolon: std_logic := '0'; + signal key_home: std_logic := '0'; + signal key_shiftr: std_logic := '0'; + signal key_equal: std_logic := '0'; + signal key_arrowup: std_logic := '0'; + signal key_slash: std_logic := '0'; + + signal key_1: std_logic := '0'; + signal key_arrowleft: std_logic := '0'; + signal key_ctrl: std_logic := '0'; + signal key_2: std_logic := '0'; + signal key_space: std_logic := '0'; + signal key_commodore: std_logic := '0'; + signal key_Q: std_logic := '0'; + signal key_runstop: std_logic := '0'; + + -- for joystick emulation on PS2 + signal joySelKey : std_logic; + signal joyKeys : std_logic_vector(joyA'range); -- active high + signal joyA_s : unsigned(joyA'range); -- active low + signal joyB_s : unsigned(joyB'range); -- active low + signal joySel : std_logic_vector(1 downto 0) := "00"; + + -- for disk image selection + signal diskChgKey : std_logic; + signal disk_nb : std_logic_vector(7 downto 0); + +begin + + process (clk) + begin + if rising_edge(clk) then + if diskChgKey = '1' then + if key_shiftl = '1' then + disk_nb <= disk_nb - 1; + else + disk_nb <= disk_nb + 1; + end if; + end if; + end if; + end process; + + disk_num <= disk_nb; + -- + -- cycle though joystick emulation options on + -- + -- "00" - PORTA = JOYA or JOYKEYS, PORTB = JOYB + -- "01" - PORTA = JOYA, PORTB = JOYB or JOYKEYS + -- "10" - PORTA = JOYA, PORTB = JOYKEYS + -- "11" - PORTA = JOYKEYS, PORTB = JOYA + + process (clk) --, reset) + begin + if rising_edge(clk) then + if joySelKey = '1' then + joySel <= joySel + 1; + end if; + end if; + end process; + + joyA_s <= joyA and not unsigned(joyKeys) when joySel = "00" else + not unsigned(joyKeys) when joySel = "11" else + joyA; + joyB_s <= joyB when joySel = "00" else + joyB and not unsigned(joyKeys) when joySel = "01" else + not unsigned(joyKeys) when joySel = "10" else + joyA; + + matrix: process(clk) + begin + --if reset = '1' then + -- joySelKey <= '0'; + -- joyKeys <= (others => '0'); + if rising_edge(clk) then + -- reading A, scan pattern on B + pao(0) <= pai(0) and joyA_s(0) and + ((not backwardsReadingEnabled) or + ((pbi(0) or not key_del) and + (pbi(1) or not key_return) and + (pbi(2) or not (key_left or key_right)) and + (pbi(3) or not key_f7) and + (pbi(4) or not key_f1) and + (pbi(5) or not key_f3) and + (pbi(6) or not key_f5) and + (pbi(7) or not (key_up or key_down)))); + pao(1) <= pai(1) and joyA_s(1) and + ((not backwardsReadingEnabled) or + ((pbi(0) or not key_3) and + (pbi(1) or not key_W) and + (pbi(2) or not key_A) and + (pbi(3) or not key_4) and + (pbi(4) or not key_Z) and + (pbi(5) or not key_S) and + (pbi(6) or not key_E) and + (pbi(7) or not (key_left or key_up or key_shiftL)))); + pao(2) <= pai(2) and joyA_s(2) and + ((not backwardsReadingEnabled) or + ((pbi(0) or not key_5) and + (pbi(1) or not key_R) and + (pbi(2) or not key_D) and + (pbi(3) or not key_6) and + (pbi(4) or not key_C) and + (pbi(5) or not key_F) and + (pbi(6) or not key_T) and + (pbi(7) or not key_X))); + pao(3) <= pai(3) and joyA_s(3) and + ((not backwardsReadingEnabled) or + ((pbi(0) or not key_7) and + (pbi(1) or not key_Y) and + (pbi(2) or not key_G) and + (pbi(3) or not key_8) and + (pbi(4) or not key_B) and + (pbi(5) or not key_H) and + (pbi(6) or not key_U) and + (pbi(7) or not key_V))); + pao(4) <= pai(4) and joyA_s(4) and + ((not backwardsReadingEnabled) or + ((pbi(0) or not key_9) and + (pbi(1) or not key_I) and + (pbi(2) or not key_J) and + (pbi(3) or not key_0) and + (pbi(4) or not key_M) and + (pbi(5) or not key_K) and + (pbi(6) or not key_O) and + (pbi(7) or not key_N))); + pao(5) <= pai(5) and + ((not backwardsReadingEnabled) or + ((pbi(0) or not key_plus) and + (pbi(1) or not key_P) and + (pbi(2) or not key_L) and + (pbi(3) or not key_minus) and + (pbi(4) or not key_dot) and + (pbi(5) or not key_colon) and + (pbi(6) or not key_at) and + (pbi(7) or not key_comma))); + pao(6) <= pai(6) and + ((not backwardsReadingEnabled) or + ((pbi(0) or not key_pound) and + (pbi(1) or not key_star) and + (pbi(2) or not key_semicolon) and + (pbi(3) or not key_home) and + (pbi(4) or not key_shiftr) and + (pbi(5) or not key_equal) and + (pbi(6) or not key_arrowup) and + (pbi(7) or not key_slash))); + pao(7) <= pai(7) and + ((not backwardsReadingEnabled) or + ((pbi(0) or not key_1) and + (pbi(1) or not key_arrowleft) and + (pbi(2) or not key_ctrl) and + (pbi(3) or not key_2) and + (pbi(4) or not key_space) and + (pbi(5) or not key_commodore) and + (pbi(6) or not key_Q) and + (pbi(7) or not key_runstop))); + + -- reading B, scan pattern on A + pbo(0) <= pbi(0) and joyB_s(0) and + (pai(0) or not key_del) and + (pai(1) or not key_3) and + (pai(2) or not key_5) and + (pai(3) or not key_7) and + (pai(4) or not key_9) and + (pai(5) or not key_plus) and + (pai(6) or not key_pound) and + (pai(7) or not key_1); + pbo(1) <= pbi(1) and joyB_s(1) and + (pai(0) or not key_return) and + (pai(1) or not key_W) and + (pai(2) or not key_R) and + (pai(3) or not key_Y) and + (pai(4) or not key_I) and + (pai(5) or not key_P) and + (pai(6) or not key_star) and + (pai(7) or not key_arrowleft); + pbo(2) <= pbi(2) and joyB_s(2) and + (pai(0) or not (key_left or key_right)) and + (pai(1) or not key_A) and + (pai(2) or not key_D) and + (pai(3) or not key_G) and + (pai(4) or not key_J) and + (pai(5) or not key_L) and + (pai(6) or not key_semicolon) and + (pai(7) or not key_ctrl); + pbo(3) <= pbi(3) and joyB_s(3) and + (pai(0) or not key_F7) and + (pai(1) or not key_4) and + (pai(2) or not key_6) and + (pai(3) or not key_8) and + (pai(4) or not key_0) and + (pai(5) or not key_minus) and + (pai(6) or not key_home) and + (pai(7) or not key_2); + pbo(4) <= pbi(4) and joyB_s(4) and + (pai(0) or not key_F1) and + (pai(1) or not key_Z) and + (pai(2) or not key_C) and + (pai(3) or not key_B) and + (pai(4) or not key_M) and + (pai(5) or not key_dot) and + (pai(6) or not key_shiftr) and + (pai(7) or not key_space); + pbo(5) <= pbi(5) and + (pai(0) or not key_F3) and + (pai(1) or not key_S) and + (pai(2) or not key_F) and + (pai(3) or not key_H) and + (pai(4) or not key_K) and + (pai(5) or not key_colon) and + (pai(6) or not key_equal) and + (pai(7) or not key_commodore); + pbo(6) <= pbi(6) and + (pai(0) or not key_F5) and + (pai(1) or not key_E) and + (pai(2) or not key_T) and + (pai(3) or not key_U) and + (pai(4) or not key_O) and + (pai(5) or not key_at) and + (pai(6) or not key_arrowup) and + (pai(7) or not key_Q); + pbo(7) <= pbi(7) and + (pai(0) or not (key_up or key_down)) and + (pai(1) or not (key_left or key_up or key_shiftL)) and + (pai(2) or not key_X) and + (pai(3) or not key_V) and + (pai(4) or not key_N) and + (pai(5) or not key_comma) and + (pai(6) or not key_slash) and + (pai(7) or not key_runstop); + + traceKey <= '0'; + trace2Key <= '0'; + videoKey <= '0'; + joySelKey <= '0'; + diskChgKey <= '0'; + cart_detach_key <= '0'; + if newScanCode = '1' then + if theScanCode=X"F0" then + releaseFlag <= '1'; + elsif theScanCode=X"E0" then + extendedFlag <= '1'; + else + releaseFlag <= '0'; + extendedFlag <= '0'; + case theScanCode is + when X"01" => key_pound <= not releaseFlag; + when X"03" => key_F5 <= not releaseFlag; + when X"04" => key_F3 <= not releaseFlag; + when X"05" => key_F1 <= not releaseFlag; + when X"06" => -- F2 + if releaseFlag = '0' then + traceKey <= '1'; + end if; + when X"09" => key_plus <= not releaseFlag; + when X"0A" => -- F8 + if releaseFlag = '0' then + diskChgKey <= '1'; + end if; + when X"0B" => -- F6 + if releaseFlag = '0' then + trace2Key <= '1'; + end if; + when X"0C" => restore_key <= not releaseFlag; -- F4 + when X"83" => key_F7 <= not releaseFlag; + when X"0E" => key_arrowleft <= not releaseFlag; + when X"11" => key_commodore <= not releaseFlag; + when X"12" => if extendedFlag = '0' then key_shiftl <= not releaseFlag; end if; + when X"14" => key_ctrl <= not releaseFlag; + when X"15" => key_Q <= not releaseFlag; + when X"16" => key_1 <= not releaseFlag; + when X"1A" => key_Z <= not releaseFlag; + when X"1B" => key_S <= not releaseFlag; + when X"1C" => key_A <= not releaseFlag; + when X"1D" => key_W <= not releaseFlag; + when X"1E" => key_2 <= not releaseFlag; + when X"21" => key_C <= not releaseFlag; + when X"22" => key_X <= not releaseFlag; + when X"23" => -- key_D - if CTRL-D the detach cartridge else its a "D" - LCA + if key_ctrl = '1' then + cart_detach_key <= '1'; + else +-- if releaseFlag = '0' then + key_D <= not releaseFlag; +-- end if; + end if; + when X"24" => key_E <= not releaseFlag; + when X"25" => key_4 <= not releaseFlag; + when X"26" => key_3 <= not releaseFlag; + when X"29" => key_space <= not releaseFlag; + when X"2A" => key_V <= not releaseFlag; + when X"2B" => key_F <= not releaseFlag; + when X"2C" => key_T <= not releaseFlag; + when X"2D" => key_R <= not releaseFlag; + when X"2E" => key_5 <= not releaseFlag; + when X"31" => key_N <= not releaseFlag; + when X"32" => key_B <= not releaseFlag; + when X"33" => key_H <= not releaseFlag; + when X"34" => key_G <= not releaseFlag; + when X"35" => key_Y <= not releaseFlag; + when X"36" => key_6 <= not releaseFlag; + when X"3A" => key_M <= not releaseFlag; + when X"3B" => key_J <= not releaseFlag; + when X"3C" => key_U <= not releaseFlag; + when X"3D" => key_7 <= not releaseFlag; + when X"3E" => key_8 <= not releaseFlag; + when X"41" => key_comma <= not releaseFlag; + when X"42" => key_K <= not releaseFlag; + when X"43" => key_I <= not releaseFlag; + when X"44" => key_O <= not releaseFlag; + when X"45" => key_0 <= not releaseFlag; + when X"46" => key_9 <= not releaseFlag; + when X"49" => key_dot <= not releaseFlag; + when X"4A" => key_slash <= not releaseFlag; + when X"4B" => key_L <= not releaseFlag; + when X"4C" => key_colon <= not releaseFlag; + when X"4D" => key_P <= not releaseFlag; + when X"4E" => key_minus <= not releaseFlag; + when X"52" => key_semicolon <= not releaseFlag; + when X"54" => key_at <= not releaseFlag; + when X"55" => key_equal <= not releaseFlag; + when X"59" => if extendedFlag = '0' then key_shiftr <= not releaseFlag; end if; + when X"5A" => key_Return <= not releaseFlag; + when X"5B" => key_star <= not releaseFlag; + when X"5D" => key_arrowup <= not releaseFlag; + when X"6B" => if extendedFlag = '0' then joyKeys(2) <= not releaseFlag; else key_left <= not releaseFlag; end if; + when X"6C" => key_home <= not releaseFlag; + when X"66" => key_del <= not releaseFlag; + when X"70" => if extendedFlag = '0' then joyKeys(4) <= not releaseFlag; end if; + when X"72" => if extendedFlag = '0' then joyKeys(1) <= not releaseFlag; else key_down <= not releaseFlag; end if; + when X"74" => if extendedFlag = '0' then joyKeys(3) <= not releaseFlag; else key_right <= not releaseFlag; end if; + when X"75" => if extendedFlag = '0' then joyKeys(0) <= not releaseFlag; else key_up <= not releaseFlag; end if; + when X"76" => key_runstop <= not releaseFlag; + when X"78" => -- F11 + if key_ctrl = '1' then + reset_key <= not releaseFlag; + else + if releaseFlag = '0' then + joySelKey <= '1'; + end if; + end if; + when others => null; + end case; + end if; + end if; + end if; + end process; +end architecture; diff --git a/Commodore - 64_Mist/rtl/fpga64_rgbcolor.vhd b/Commodore - 64_Mist/rtl/fpga64_rgbcolor.vhd new file mode 100644 index 00000000..1fc4eb9a --- /dev/null +++ b/Commodore - 64_Mist/rtl/fpga64_rgbcolor.vhd @@ -0,0 +1,56 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- C64 palette index to 24 bit RGB color +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.all; + +-- ----------------------------------------------------------------------- + +entity fpga64_rgbcolor is + port ( + index: in unsigned(3 downto 0); + r: out unsigned(7 downto 0); + g: out unsigned(7 downto 0); + b: out unsigned(7 downto 0) + ); +end fpga64_rgbcolor; + +-- ----------------------------------------------------------------------- + +architecture Behavioral of fpga64_rgbcolor is +begin + process(index) + begin + case index is + when X"0" => r <= X"00"; g <= X"00"; b <= X"00"; + when X"1" => r <= X"FF"; g <= X"FF"; b <= X"FF"; + when X"2" => r <= X"68"; g <= X"37"; b <= X"2B"; + when X"3" => r <= X"70"; g <= X"A4"; b <= X"B2"; + when X"4" => r <= X"6F"; g <= X"3D"; b <= X"86"; + when X"5" => r <= X"58"; g <= X"8D"; b <= X"43"; + when X"6" => r <= X"35"; g <= X"28"; b <= X"79"; + when X"7" => r <= X"B8"; g <= X"C7"; b <= X"6F"; + when X"8" => r <= X"6F"; g <= X"4F"; b <= X"25"; + when X"9" => r <= X"43"; g <= X"39"; b <= X"00"; + when X"A" => r <= X"9A"; g <= X"67"; b <= X"59"; + when X"B" => r <= X"44"; g <= X"44"; b <= X"44"; + when X"C" => r <= X"6C"; g <= X"6C"; b <= X"6C"; + when X"D" => r <= X"9A"; g <= X"D2"; b <= X"84"; + when X"E" => r <= X"6C"; g <= X"5E"; b <= X"B5"; + when X"F" => r <= X"95"; g <= X"95"; b <= X"95"; + end case; + end process; +end Behavioral; diff --git a/Commodore - 64_Mist/rtl/fpga64_sid_iec.vhd b/Commodore - 64_Mist/rtl/fpga64_sid_iec.vhd new file mode 100644 index 00000000..29787b61 --- /dev/null +++ b/Commodore - 64_Mist/rtl/fpga64_sid_iec.vhd @@ -0,0 +1,824 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- System runs on 32 Mhz (derived from a 50MHz clock). +-- The VIC-II runs in the first 4 cycles of 32 Mhz clock. +-- The CPU runs in the last 16 cycles. Effective cpu speed is 1 Mhz. +-- 4 additional cycles are used to interface with the C-One IEC port. +-- +-- ----------------------------------------------------------------------- +-- Dar 08/03/2014 +-- +-- Based on fpga64_cone +-- add external selection for 15KHz(TV)/31KHz(VGA) +-- add external selection for power on NTSC(60Hz)/PAL(50Hz) +-- add external conection in/out for IEC signal +-- add sid entity +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.std_logic_unsigned.ALL; +use IEEE.numeric_std.all; + +-- ----------------------------------------------------------------------- + +entity fpga64_sid_iec is + generic ( + resetCycles : integer := 4095 + ); + port( + clk32 : in std_logic; + reset_n : in std_logic; + c64gs : in std_logic; + -- keyboard interface (use any ordinairy PS2 keyboard) + kbd_clk : in std_logic; + kbd_dat : in std_logic; + reset_key : out std_logic; + cart_detach_key : out std_logic; + + -- external memory + ramAddr : out unsigned(15 downto 0); + ramDataIn : in unsigned(7 downto 0); + ramDataOut : out unsigned(7 downto 0); + + ramCE : out std_logic; + ramWe : out std_logic; + + idle : out std_logic; + + -- VGA/SCART interface + ntscInitMode: in std_logic; + hsync : out std_logic; + vsync : out std_logic; + r : out unsigned(7 downto 0); + g : out unsigned(7 downto 0); + b : out unsigned(7 downto 0); + + -- cartridge port + game : in std_logic; + exrom : in std_logic; + ioE_rom : in std_logic; + ioF_rom : in std_logic; + max_ram : in std_logic; + irq_n : inout std_logic; + nmi_n : in std_logic; + nmi_ack : out std_logic; + dma_n : in std_logic; + ba : out std_logic; + romL : out std_logic; -- cart signals LCA + romH : out std_logic; -- cart signals LCA + UMAXromH : out std_logic; -- cart signals LCA + IOE : out std_logic; -- cart signals LCA + IOF : out std_logic; -- cart signals LCA + CPU_hasbus : out std_logic; -- CPU has the bus STROBE + freeze_key : out std_logic; + + -- joystick interface + joyA : in unsigned(6 downto 0); + joyB : in unsigned(6 downto 0); + + -- serial port, for connection to pheripherals + serioclk : out std_logic; + ces : out std_logic_vector(3 downto 0); + + --Connector to the SID + SIDclk : out std_logic; + still : out unsigned(15 downto 0); + audio_data : out std_logic_vector(17 downto 0); + extfilter_en: in std_logic; + + -- IEC + iec_data_o : out std_logic; + iec_data_i : in std_logic; + iec_clk_o : out std_logic; + iec_clk_i : in std_logic; + iec_atn_o : out std_logic; + iec_atn_i : in std_logic; + + disk_num : out std_logic_vector(7 downto 0); + + c64rom_addr : in std_logic_vector(13 downto 0); + c64rom_data : in std_logic_vector(7 downto 0); + c64rom_wr : in std_logic +); +end fpga64_sid_iec; + +-- ----------------------------------------------------------------------- + +architecture rtl of fpga64_sid_iec is + -- System state machine + type sysCycleDef is ( + CYCLE_IDLE0, CYCLE_IDLE1, CYCLE_IDLE2, CYCLE_IDLE3, + CYCLE_IDLE4, CYCLE_IDLE5, CYCLE_IDLE6, CYCLE_IDLE7, + CYCLE_IDLE8, + CYCLE_IEC0, CYCLE_IEC1, CYCLE_IEC2, CYCLE_IEC3, + CYCLE_VIC0, CYCLE_VIC1, CYCLE_VIC2, CYCLE_VIC3, + CYCLE_CPU0, CYCLE_CPU1, CYCLE_CPU2, CYCLE_CPU3, + CYCLE_CPU4, CYCLE_CPU5, CYCLE_CPU6, CYCLE_CPU7, + CYCLE_CPUP, CYCLE_CPUQ, + CYCLE_CPU8, CYCLE_CPU9, CYCLE_CPUA, CYCLE_CPUB, + CYCLE_CPUC, CYCLE_CPUD, CYCLE_CPUE, CYCLE_CPUF + ); + + signal sysCycle : sysCycleDef := sysCycleDef'low; + signal sysCycleCnt : unsigned(2 downto 0); + signal phi0_cpu : std_logic; + signal phi0_vic : std_logic; + signal cpuHasBus : std_logic; + + signal cycleRestart : std_logic; + signal cycleRestartReg1 : std_logic; + signal cycleRestartReg2 : std_logic; + signal cycleRestartEdge : std_logic; + + signal baLoc: std_logic; + signal irqLoc: std_logic; + signal nmiLoc: std_logic; + + signal enableCpu: std_logic; + signal enableVic : std_logic; + signal enablePixel : std_logic; + + signal irq_cia1: std_logic; + signal irq_cia2: std_logic; + signal irq_vic: std_logic; + + signal systemWe: std_logic; + signal pulseWrRam: std_logic; + signal pulseWrIo: std_logic; + signal pulseRd: std_logic; + signal colorWe : std_logic; + signal systemAddr: unsigned(15 downto 0); + signal ramDataReg : unsigned(7 downto 0); + + signal cs_vic: std_logic; + signal cs_sid: std_logic; + signal cs_color: std_logic; + signal cs_cia1: std_logic; + signal cs_cia2: std_logic; + signal cs_ram: std_logic; + signal cs_ioE: std_logic; + signal cs_ioF: std_logic; + signal cs_romL: std_logic; + signal cs_romH: std_logic; + signal cs_UMAXromH: std_logic; -- romH VIC II read flag + + signal reset: std_logic := '1'; + signal reset_cnt: integer range 0 to resetCycles := 0; + + signal bankSwitch: unsigned(2 downto 0); + + -- SID signals + signal sid_do : std_logic_vector(7 downto 0); + + -- CIA signals + signal enableCia : std_logic; + signal cia1Do: unsigned(7 downto 0); + signal cia2Do: unsigned(7 downto 0); + +-- keyboard + signal newScanCode: std_logic; + signal theScanCode: unsigned(7 downto 0); + + -- I/O + signal cia1_pai: unsigned(7 downto 0); + signal cia1_pao: unsigned(7 downto 0); + signal cia1_pad: unsigned(7 downto 0); + signal cia1_pbi: unsigned(7 downto 0); + signal cia1_pbo: unsigned(7 downto 0); + signal cia1_pbd: unsigned(7 downto 0); + signal cia2_pai: unsigned(7 downto 0); + signal cia2_pao: unsigned(7 downto 0); + signal cia2_pad: unsigned(7 downto 0); + signal cia2_pbi: unsigned(7 downto 0); + signal cia2_pbo: unsigned(7 downto 0); + signal cia2_pbd: unsigned(7 downto 0); + + signal debugWE: std_logic := '0'; + signal debugData: unsigned(7 downto 0) := (others => '0'); + signal debugAddr: integer range 2047 downto 0 := 0; + + signal cpuWe: std_logic; + signal cpuAddr: unsigned(15 downto 0); + signal cpuDi: unsigned(7 downto 0); + signal cpuDo: unsigned(7 downto 0); + signal cpuIO: unsigned(7 downto 0); + + signal vicDi: unsigned(7 downto 0); + signal vicAddr: unsigned(15 downto 0); + signal vicData: unsigned(7 downto 0); + signal lastVicDi : unsigned(7 downto 0); + + signal colorQ : unsigned(3 downto 0); + signal colorData : unsigned(3 downto 0); + + signal cpuStep : std_logic; + signal traceKey : std_logic; + signal trace2Key : std_logic; + + -- video + signal vicColorIndex : unsigned(3 downto 0); + signal vicHSync : std_logic; + signal vicVSync : std_logic; + + signal vgaColorIndex : unsigned(3 downto 0); + alias vgaColorIndex_int : std_logic_vector is std_logic_vector(vgaColorIndex); + signal vgaR : unsigned(7 downto 0); + signal vgaG : unsigned(7 downto 0); + signal vgaB : unsigned(7 downto 0); + signal vgaVSync : std_logic; + signal vgaHSync : std_logic; + signal debuggerOn : std_logic; + signal traceStep : std_logic; + signal scanline : std_logic; + + -- config + signal videoKey : std_logic; + signal ntscMode : std_logic; + signal ntscModeInvert : std_logic := '0' ; + signal restore_key : std_logic; + + signal clk_1MHz : std_logic_vector(31 downto 0); + signal voice_volume : signed(17 downto 0); +begin +-- ----------------------------------------------------------------------- +-- Local signal to outside world +-- ----------------------------------------------------------------------- + ba <= baLoc; + + idle <= '1' when + (sysCycle = CYCLE_IDLE0) or (sysCycle = CYCLE_IDLE1) or + (sysCycle = CYCLE_IDLE2) or (sysCycle = CYCLE_IDLE3) or + (sysCycle = CYCLE_IDLE4) or (sysCycle = CYCLE_IDLE5) or + (sysCycle = CYCLE_IDLE6) or (sysCycle = CYCLE_IDLE7) or + (sysCycle = CYCLE_IDLE8) else '0'; + +-- ----------------------------------------------------------------------- +-- System state machine, controls bus accesses +-- and triggers enables of other components +-- ----------------------------------------------------------------------- + process(clk32) + begin + if rising_edge(clk32) then + if sysCycle = sysCycleDef'high then + sysCycle <= sysCycleDef'low; + elsif sysCycle = CYCLE_CPU6 then + sysCycle <= CYCLE_CPU8; + else + sysCycle <= sysCycleDef'succ(sysCycle); + end if; + end if; + end process; + + iecClock: process(clk32) + begin + if rising_edge(clk32) then + serioclk <= '1'; + if sysCycle = CYCLE_IEC0 + or sysCycle = CYCLE_IEC1 then + serioclk <= '0'; --for iec write + end if; + end if; + end process; + + sidClock: process(clk32) + begin + if rising_edge(clk32) then + -- Toggle SIDclk early to compensate for the delay caused by the gbridge + if sysCycle = CYCLE_VIC3 then + SIDclk <= '1'; + end if; + if sysCycle = CYCLE_CPUD then + SIDclk <= '0'; + end if; + end if; + end process; + + -- PHI0/2-clock emulation + process(clk32) + begin + if rising_edge(clk32) then + if sysCycle = sysCycleDef'pred(CYCLE_CPU0) then + phi0_cpu <= '1'; + if baLoc = '1' or cpuWe = '1' then + cpuHasBus <= '1'; + end if; + end if; + if sysCycle = sysCycleDef'high then + phi0_cpu <= '0'; + cpuHasBus <= '0'; + end if; + if sysCycle = sysCycleDef'pred(CYCLE_VIC0) then + phi0_vic <= '1'; + end if; + if sysCycle = CYCLE_VIC3 then + phi0_vic <= '0'; + end if; + end if; + end process; + + process(clk32) + begin + if rising_edge(clk32) then + enableVic <= '0'; + enableCia <= '0'; + enableCpu <= '0'; + + case sysCycle is + when CYCLE_VIC2 => + enableVic <= '1'; + when CYCLE_CPUE => + enableCia <= '1'; + enableVic <= '1'; + if baLoc = '1' + or cpuWe = '1' then + enableCpu <= '1'; + end if; + when others => + null; + end case; + end if; + end process; + + hSync <= vicHSync; + vSync <= vicVSync; + + c64colors: entity work.fpga64_rgbcolor + port map ( + index => vicColorIndex, + r => r, + g => g, + b => b + ); +-- ----------------------------------------------------------------------- +-- Color RAM +-- ----------------------------------------------------------------------- + colorram: entity work.gen_ram + generic map ( + dWidth => 4, + aWidth => 10 + ) + port map ( + clk => clk32, + we => colorWe, + addr => systemAddr(9 downto 0), + d => cpuDo(3 downto 0), + q => colorQ + ); + + process(clk32) + begin + if rising_edge(clk32) then + colorWe <= (cs_color and pulseWrRam); + colorData <= colorQ; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- PLA and bus-switches +-- ----------------------------------------------------------------------- + buslogic: entity work.fpga64_buslogic + port map ( + clk => clk32, + reset => reset, + c64gs => c64gs, + cpuHasBus => cpuHasBus, + + bankSwitch => cpuIO(2 downto 0), + + game => game, + exrom => exrom, + ioE_rom => ioE_rom, + ioF_rom => ioF_rom, + max_ram => max_ram, + + ramData => ramDataReg, + + cpuWe => cpuWe, + cpuAddr => cpuAddr, + cpuData => cpuDo, + vicAddr => vicAddr, + vicData => vicData, + sidData => unsigned(sid_do), + colorData => colorData, + cia1Data => cia1Do, + cia2Data => cia2Do, + lastVicData => lastVicDi, + + systemWe => systemWe, + systemAddr => systemAddr, + dataToCpu => cpuDi, + dataToVic => vicDi, + + cs_vic => cs_vic, + cs_sid => cs_sid, + cs_color => cs_color, + cs_cia1 => cs_cia1, + cs_cia2 => cs_cia2, + cs_ram => cs_ram, + cs_ioE => cs_ioE, + cs_ioF => cs_ioF, + cs_romL => cs_romL, + cs_romH => cs_romH, + cs_UMAXromH => cs_UMAXromH, + + c64rom_addr => c64rom_addr, + c64rom_data => c64rom_data, + c64rom_wr => c64rom_wr + ); + + process(clk32) + begin + if rising_edge(clk32) then + pulseWrRam <= '0'; + pulseWrIo <= '0'; + pulseRd <= '0'; + if cpuWe = '1' then + if sysCycle = CYCLE_CPUC then + pulseWrRam <= '1'; + end if; + if sysCycle = CYCLE_CPUC then + pulseWrIo <= '1'; + end if; + else + if sysCycle = CYCLE_CPUE then + pulseRd <= '1'; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- VIC-II video interface chip +-- ----------------------------------------------------------------------- + vic: entity work.video_vicii_656x + generic map ( + registeredAddress => false, + emulateRefresh => false, + emulateLightpen => true, + emulateGraphics => true + ) + port map ( + clk => clk32, + reset => reset, + enaPixel => enablePixel, + enaData => enableVic, + phi => phi0_cpu, + + baSync => '0', + ba => baLoc, + + mode6569 => (not ntscMode), + mode6567old => '0', + mode6567R8 => ntscMode, + mode6572 => '0', + + cs => cs_vic, + we => pulseWrIo, + rd => pulseRd, + lp_n => cia1_pbi(4), + + aRegisters => cpuAddr(5 downto 0), + diRegisters => cpuDo, + di => vicDi, + diColor => colorData, + do => vicData, + + vicAddr => vicAddr(13 downto 0), + + hsync => vicHSync, + vsync => vicVSync, + colorIndex => vicColorIndex, + + irq_n => irq_vic + ); + + -- Pixel timing + process(clk32) + begin + if rising_edge(clk32) then + enablePixel <= '0'; + if sysCycle = CYCLE_VIC2 + or sysCycle = CYCLE_IDLE3 -- IDLE2 + or sysCycle = CYCLE_IDLE7 -- IDLE6 + or sysCycle = CYCLE_IEC2 + or sysCycle = CYCLE_CPU2 + or sysCycle = CYCLE_CPU6 + or sysCycle = CYCLE_CPUB -- CPUA + or sysCycle = CYCLE_CPUF then -- CPUE + enablePixel <= '1'; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- SID +-- ----------------------------------------------------------------------- + div1m: process(clk32) -- this process devides 32 MHz to 1MHz (for the SID) + begin + if (rising_edge(clk32)) then + if (reset = '1') then + clk_1MHz <= "00000000000000000000000000000001"; + else + clk_1MHz(31 downto 1) <= clk_1MHz(30 downto 0); + clk_1MHz(0) <= clk_1MHz(31); + end if; + end if; + end process; + + audio_data <= std_logic_vector(voice_volume); + + sid: entity work.sid_top + port map ( + clock => clk32, + reset => reset, + + addr => "000" & cpuAddr(4 downto 0), + wren => pulseWrRam and phi0_cpu and cs_sid, + wdata => std_logic_vector(cpuDo), + rdata => sid_do, + + potx => not std_logic((cia1_pao(7) and JoyA(5)) or (cia1_pao(6) and JoyB(5))), + poty => not std_logic((cia1_pao(7) and JoyA(6)) or (cia1_pao(6) and JoyB(6))), + comb_wave_l => '0', + comb_wave_r => '0', + + extfilter_en => extfilter_en, + + start_iter => clk_1MHz(31), + sample_left => voice_volume, + sample_right => open + ); + +-- ----------------------------------------------------------------------- +-- CIAs +-- ----------------------------------------------------------------------- + cia1: entity work.cia6526 + port map ( + clk => clk32, + todClk => vicVSync, + reset => reset, + enable => enableCia, + cs => cs_cia1, + we => pulseWrIo, + rd => pulseRd, + + addr => cpuAddr(3 downto 0), + di => cpuDo, + do => cia1Do, + + ppai => cia1_pai, + ppao => cia1_pao, + ppbi => cia1_pbi, + ppbo => cia1_pbo, + + flag_n => '1', + + irq_n => irq_cia1 + ); + + cia2: entity work.cia6526 + port map ( + clk => clk32, + todClk => vicVSync, + reset => reset, + enable => enableCia, + cs => cs_cia2, + we => pulseWrIo, + rd => pulseRd, + + addr => cpuAddr(3 downto 0), + di => cpuDo, + do => cia2Do, + + ppai => cia2_pai, + ppao => cia2_pao, + ppbi => cia2_pbi, + ppbo => cia2_pbo, + + flag_n => '1', + + irq_n => irq_cia2 + ); + +-- ----------------------------------------------------------------------- +-- 6510 CPU +-- ----------------------------------------------------------------------- + cpu: entity work.cpu_6510 + generic map ( + pipelineOpcode => false, + pipelineAluMux => false, + pipelineAluOut => false + ) + port map ( + clk => clk32, + reset => reset, + enable => enableCpu, + nmi_n => nmiLoc, + nmi_ack => nmi_ack, + irq_n => irqLoc, + + di => cpuDi, + addr => cpuAddr, + do => cpuDo, + we => cpuWe, + + diIO => "00010111", + doIO => cpuIO, + + debugOpcode => open, + debugPc => open, + debugA => open, + debugX => open, + debugY => open, + debugS => open + ); + +-- ----------------------------------------------------------------------- +-- Keyboard +-- ----------------------------------------------------------------------- + myKeyboard: entity work.io_ps2_keyboard + port map ( + clk => clk32, + kbd_clk => kbd_clk, + kbd_dat => kbd_dat, + interrupt => newScanCode, + scanCode => theScanCode + ); + + myKeyboardMatrix: entity work.fpga64_keyboard_matrix + port map ( + clk => clk32, + theScanCode => theScanCode, + newScanCode => newScanCode, + + joyA => (not joyA(4 downto 0)), + joyB => (not joyB(4 downto 0)), + pai => cia1_pao, + pbi => cia1_pbo, + pao => cia1_pai, + pbo => cia1_pbi, + + videoKey => videoKey, + traceKey => open, + trace2Key => trace2Key, + reset_key => reset_key, + restore_key => restore_key, + cart_detach_key => cart_detach_key, -- cartridge detach key CTRL-D - LCA + disk_num => disk_num, + + backwardsReadingEnabled => '1' + ); + +-- ----------------------------------------------------------------------- +-- Reset button +-- ----------------------------------------------------------------------- + calcReset: process(clk32) + begin + if rising_edge(clk32) then + if sysCycle = sysCycleDef'high then + if reset_cnt = resetCycles then + reset <= '0'; + else + reset <= '1'; + reset_cnt <= reset_cnt + 1; + end if; + end if; + if reset_n = '0' + or dma_n = '0' then -- temp reset fix + reset_cnt <= 0; + end if; + end if; + end process; + + -- Video modes + ntscMode <= ntscInitMode xor ntscModeInvert; + process(clk32) + begin + if rising_edge(clk32) then + if videoKey = '1' then + ntscModeInvert <= not ntscModeInvert; + end if; + end if; + end process; + + iec_data_o <= cia2_pao(5); + iec_clk_o <= cia2_pao(4); + iec_atn_o <= cia2_pao(3); + ramDataOut <= "00" & cia2_pao(5 downto 3) & "000" when sysCycle >= CYCLE_IEC0 and sysCycle <= CYCLE_IEC3 else cpuDo; + ramAddr <= systemAddr when (phi0_cpu = '1') or (phi0_vic = '1') else (others => '0'); + ramWe <= '0' when sysCycle = CYCLE_IEC2 or sysCycle = CYCLE_IEC3 else not systemWe; + ramCE <= '0' when sysCycle /= CYCLE_IDLE0 and sysCycle /= CYCLE_IDLE1 and sysCycle /= CYCLE_IDLE2 and + sysCycle /= CYCLE_IDLE3 and sysCycle /= CYCLE_IDLE4 and sysCycle /= CYCLE_IDLE5 and + sysCycle /= CYCLE_IDLE6 and sysCycle /= CYCLE_IDLE7 and sysCycle /= CYCLE_IDLE8 and + sysCycle /= CYCLE_IEC0 and sysCycle /= CYCLE_IEC1 and sysCycle /= CYCLE_IEC2 and + sysCycle /= CYCLE_IEC3 and sysCycle /= CYCLE_CPU0 and sysCycle /= CYCLE_CPU1 and sysCycle /= CYCLE_CPUF and + cs_ram = '1' else '1'; + + process(clk32) + begin + if rising_edge(clk32) then + if sysCycle = CYCLE_CPUD + or sysCycle = CYCLE_VIC2 then + ramDataReg <= unsigned(ramDataIn); + end if; + end if; + end process; + +--serialBus and SID + serialBus: process(clk32, sysCycle, cs_sid, cs_ioE, cs_ioF, cs_romL, cs_romH, cpuWe) + begin + ces <= "1111"; + if sysCycle = CYCLE_IEC0 + or sysCycle = CYCLE_IEC1 + or sysCycle = CYCLE_IEC2 + or sysCycle = CYCLE_IEC3 then + ces <= "1011";--iec port + end if; + if cs_sid = '1' then + ces <= "0011"; --SID 1 + end if; + if cs_romL = '1' then + ces <= "0000"; + end if; + if cs_romH = '1' then + ces <= "0100"; + end if; + if sysCycle /= CYCLE_CPU0 + and sysCycle /= CYCLE_CPU1 + and sysCycle /= CYCLE_CPUF then + if cs_ioE = '1' then + ces <= "0101"; + end if; + if cs_ioF = '1' then + ces <= "0001"; + end if; + end if; + if rising_edge(clk32) then + if sysCycle = CYCLE_IEC1 then + cia2_pai(7) <= iec_data_i; + cia2_pai(6) <= iec_clk_i; + end if; + end if; + end process; + + process(clk32) + begin + if rising_edge(clk32) then + if phi0_vic = '1' then + lastVicDi <= vicDi; + end if; + end if; + end process; + + process(clk32) + begin + if rising_edge(clk32) then + if trace2Key = '1' then + debuggerOn <= not debuggerOn; + end if; + end if; + end process; + + cia2_pai(5 downto 0) <= cia2_pao(5 downto 0); + cia2_pbi(7 downto 0) <= cia2_pbo; + +-- ----------------------------------------------------------------------- +-- VIC bank to address lines +-- ----------------------------------------------------------------------- + vicAddr(14) <= (not cia2_pao(0)); + vicAddr(15) <= (not cia2_pao(1)); + +-- ----------------------------------------------------------------------- +-- Interrupt lines +-- ----------------------------------------------------------------------- + irq_n <= 'Z'; + irqLoc <= irq_cia1 and irq_vic and irq_n; + nmiLoc <= irq_cia2 and nmi_n; + freeze_key <= restore_key; + +-- ----------------------------------------------------------------------- +-- Dummy silence audio output +-- ----------------------------------------------------------------------- + still <= X"4000"; + + +-- ----------------------------------------------------------------------- +-- Cartridge port lines LCA +-- ----------------------------------------------------------------------- + romL <= cs_romL; + romH <= cs_romH; + IOE <= cs_ioE; + IOF <= cs_ioF; + UMAXromH <= cs_UMAXromH; + CPU_hasbus <= cpuHasBus; +end architecture; diff --git a/Commodore - 64_Mist/rtl/gcr_floppy.vhd b/Commodore - 64_Mist/rtl/gcr_floppy.vhd new file mode 100644 index 00000000..b25229f3 --- /dev/null +++ b/Commodore - 64_Mist/rtl/gcr_floppy.vhd @@ -0,0 +1,316 @@ +--------------------------------------------------------------------------------- +-- Commodore 1541 gcr floppy (read/write) by Dar (darfpga@aol.fr) 23-May-2017 +-- http://darfpga.blogspot.fr +-- +-- produces GCR data, byte(ready) and sync signal to feed c1541_logic from current +-- track buffer ram which contains D64 data +-- +-- gets GCR data from c1541_logic, while producing byte(ready) signal. Data feed +-- track buffer ram after conversion +-- +-- Input clk 32MHz +-- +--------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity gcr_floppy is +port( + clk32 : in std_logic; + dout : out std_logic_vector(7 downto 0); -- data from ram to 1541 logic + din : in std_logic_vector(7 downto 0); -- data from 1541 logic to ram + mode : in std_logic; -- read/write + mtr : in std_logic; -- stepper motor on/off + sync_n : out std_logic; -- reading SYNC bytes + byte_n : out std_logic; -- byte ready + + track : in std_logic_vector(5 downto 0); + sector : out std_logic_vector(4 downto 0); + byte_addr : out std_logic_vector(7 downto 0); + + ram_do : in std_logic_vector(7 downto 0); + ram_di : buffer std_logic_vector(7 downto 0); + ram_we : out std_logic; + ram_ready : in std_logic +); +end gcr_floppy; + +architecture struct of gcr_floppy is + +signal bit_clk_en : std_logic; +signal sync_cnt : std_logic_vector(5 downto 0) := (others => '0'); +signal byte_cnt : std_logic_vector(8 downto 0) := (others => '0'); +signal nibble : std_logic := '0'; +signal gcr_bit_cnt : std_logic_vector(3 downto 0) := (others => '0'); +signal bit_cnt : std_logic_vector(2 downto 0) := (others => '0'); + +signal sync_in_n : std_logic; +signal byte_in_n : std_logic; + +signal sector_dbl : std_logic_vector(4 downto 0) := (others => '0'); +signal state : std_logic := '0'; + +signal data_header : std_logic_vector(7 downto 0); +signal data_body : std_logic_vector(7 downto 0); +signal data : std_logic_vector(7 downto 0); +signal data_cks : std_logic_vector(7 downto 0); +signal gcr_nibble : std_logic_vector(4 downto 0); +signal gcr_bit : std_logic; +signal gcr_byte : std_logic_vector(7 downto 0); + +signal mode_r1 : std_logic; +signal mode_r2 : std_logic; + +type gcr_array is array(0 to 15) of std_logic_vector(4 downto 0); + +signal gcr_lut : gcr_array := + ("01010","11010","01001","11001", + "01110","11110","01101","11101", + "10010","10011","01011","11011", + "10110","10111","01111","10101"); + +signal sector_max : std_logic_vector(4 downto 0); + +signal gcr_byte_out : std_logic_vector(7 downto 0); +signal gcr_bit_out : std_logic; +signal gcr_nibble_out : std_logic_vector(4 downto 0); +signal nibble_out : std_logic_vector(3 downto 0); + +signal autorise_write : std_logic; +signal autorise_count : std_logic; + +begin + +sync_n <= sync_in_n when mtr = '1' and ram_ready = '1' else '1'; + +sector <= sector_dbl; + +with byte_cnt select + data_header <= + X"08" when "000000000", + "00"&track xor "000"§or_dbl when "000000001", + "000"§or_dbl when "000000010", + "00"&track when "000000011", + X"20" when "000000100", + X"20" when "000000101", + X"0F" when others; + +with byte_cnt select + data_body <= + X"07" when "000000000", + data_cks when "100000001", + X"00" when "100000010", + X"00" when "100000011", + X"0F" when "100000100", + X"0F" when "100000101", + X"0F" when "100000110", + X"0F" when "100000111", + X"0F" when "100001000", + X"0F" when "100001001", + X"0F" when "100001010", + X"0F" when "100001011", + X"0F" when "100001100", + X"0F" when "100001101", + X"0F" when "100001110", + X"0F" when "100001111", + X"0F" when "100010000", + X"0F" when "100010001", + ram_do when others; +with state select + data <= data_header when '0', data_body when others; + +with nibble select + gcr_nibble <= + gcr_lut(to_integer(unsigned(data(7 downto 4)))) when '0', + gcr_lut(to_integer(unsigned(data(3 downto 0)))) when others; + +gcr_bit <= gcr_nibble(to_integer(unsigned(gcr_bit_cnt))); + +sector_max <= "10100" when track < std_logic_vector(to_unsigned(18,6)) else + "10010" when track < std_logic_vector(to_unsigned(25,6)) else + "10001" when track < std_logic_vector(to_unsigned(31,6)) else + "10000" ; + +gcr_bit_out <= gcr_byte_out(to_integer(unsigned(not bit_cnt))); + +with gcr_nibble_out select + nibble_out <= X"0" when "01010",--"01010", + X"1" when "01011",--"11010", + X"2" when "10010",--"01001", + X"3" when "10011",--"11001", + X"4" when "01110",--"01110", + X"5" when "01111",--"11110", + X"6" when "10110",--"01101", + X"7" when "10111",--"11101", + X"8" when "01001",--"10010", + X"9" when "11001",--"10011", + X"A" when "11010",--"01011", + X"B" when "11011",--"11011", + X"C" when "01101",--"10110", + X"D" when "11101",--"10111", + X"E" when "11110",--"01111", + X"F" when others; --"10101", + +process (clk32) + variable bit_clk_cnt : std_logic_vector(7 downto 0) := (others => '0'); +begin + if rising_edge(clk32) then + + mode_r1 <= mode; + + if (mode_r1 xor mode) = '1' then -- read <-> write change + bit_clk_cnt := (others => '0'); + byte_n <= '1'; + bit_clk_en <= '0'; + else + + bit_clk_en <= '0'; + if bit_clk_cnt = X"6F" then + bit_clk_en <= '1'; + bit_clk_cnt := (others => '0'); + else + bit_clk_cnt := bit_clk_cnt + '1'; + end if; + + byte_n <= '1'; + if byte_in_n = '0' and mtr = '1' and ram_ready = '1' then + if bit_clk_cnt > X"10" then + if bit_clk_cnt < X"5E" then + byte_n <= '0'; + end if; + end if; + end if; + + end if; + + end if; +end process; + +read_write_process : process (clk32, bit_clk_en) +begin + if rising_edge(clk32) then + + ram_we <= '0'; + if bit_clk_en = '1' then + mode_r2 <= mode; + if mode = '1' then autorise_write <= '0'; end if; + + if (mode xor mode_r2) = '1' then + if mode = '1' then -- leaving write mode + sync_in_n <= '0'; + sync_cnt <= (others => '0'); + state <= '0'; + else -- entering write mode + byte_cnt <= (others => '0'); + nibble <= '0'; + gcr_bit_cnt <= (others => '0'); + bit_cnt <= (others => '0'); + gcr_byte <= (others => '0'); + data_cks <= (others => '0'); + end if; + end if; + + if sync_in_n = '0' and mode = '1' then + + byte_cnt <= (others => '0'); + nibble <= '0'; + gcr_bit_cnt <= (others => '0'); + bit_cnt <= (others => '0'); + dout <= (others => '0'); + gcr_byte <= (others => '0'); + data_cks <= (others => '0'); + + if sync_cnt = X"31" then + sync_cnt <= (others => '0'); + sync_in_n <= '1'; + else + sync_cnt <= sync_cnt + '1'; + + end if; + + end if; + + if sync_in_n = '1' or mode = '0' then + + gcr_bit_cnt <= gcr_bit_cnt + '1'; + if gcr_bit_cnt = X"4" then + gcr_bit_cnt <= (others => '0'); + if nibble = '1' then + nibble <= '0'; + byte_addr <= byte_cnt(7 downto 0); + if byte_cnt = "000000000" then + data_cks <= (others => '0'); + else + data_cks <= data_cks xor data; + end if; + if mode = '1' or (mode = '0' and autorise_count = '1') then + byte_cnt <= byte_cnt + '1'; + end if; + else + nibble <= '1'; + if mode = '0' and ram_di = X"07" then + autorise_write <= '1'; + autorise_count <= '1'; + end if; + if byte_cnt >= "100000000" then + autorise_write <= '0'; + autorise_count <= '0'; + end if; + end if; + end if; + + bit_cnt <= bit_cnt + '1'; + byte_in_n <= '1'; + if bit_cnt = X"7" then + byte_in_n <= '0'; + gcr_byte_out <= din; + end if; + + if state = '0' then + if byte_cnt = "000010000" then + sync_in_n <= '0'; + state<= '1'; + end if; + else + if byte_cnt = "100010001" then + sync_in_n <= '0'; + state <= '0'; + if sector_dbl = sector_max then + sector_dbl <= (others=>'0'); + else + sector_dbl <= sector_dbl + '1'; + end if; + end if; + end if; + -- demux byte from floppy (ram) + gcr_byte <= gcr_byte(6 downto 0) & gcr_bit; + if bit_cnt = X"7" then + dout <= gcr_byte(6 downto 0) & gcr_bit; + end if; + + -- serialise/convert byte to floppy (ram) + gcr_nibble_out <= gcr_nibble_out(3 downto 0) & gcr_bit_out; + + if gcr_bit_cnt = X"0" then + if nibble = '0' then + ram_di(3 downto 0) <= nibble_out; + else + ram_di(7 downto 4) <= nibble_out; + end if; + end if; + + if gcr_bit_cnt = X"1" and nibble = '0' then + if autorise_write = '1' then + ram_we <= '1'; + end if; + end if; + + end if; + end if; + end if; + +end process; + +end struct; diff --git a/Commodore - 64_Mist/rtl/gen_ram.vhd b/Commodore - 64_Mist/rtl/gen_ram.vhd new file mode 100644 index 00000000..21f24dde --- /dev/null +++ b/Commodore - 64_Mist/rtl/gen_ram.vhd @@ -0,0 +1,76 @@ +-- ----------------------------------------------------------------------- +-- +-- Syntiac's generic VHDL support files. +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- gen_rwram.vhd +-- +-- ----------------------------------------------------------------------- +-- +-- generic ram. +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity gen_ram is + generic ( + dWidth : integer := 8; + aWidth : integer := 10 + ); + port ( + clk : in std_logic; + we : in std_logic; + addr : in unsigned((aWidth-1) downto 0); + d : in unsigned((dWidth-1) downto 0); + q : out unsigned((dWidth-1) downto 0) + ); +end entity; + +-- ----------------------------------------------------------------------- + +architecture rtl of gen_ram is + subtype addressRange is integer range 0 to ((2**aWidth)-1); + type ramDef is array(addressRange) of unsigned((dWidth-1) downto 0); + signal ram: ramDef; + + signal rAddrReg : unsigned((aWidth-1) downto 0); + signal qReg : unsigned((dWidth-1) downto 0); +begin +-- ----------------------------------------------------------------------- +-- Signals to entity interface +-- ----------------------------------------------------------------------- + q <= qReg; + +-- ----------------------------------------------------------------------- +-- Memory write +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if we = '1' then + ram(to_integer(addr)) <= d; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Memory read +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + qReg <= ram(to_integer(rAddrReg)); + rAddrReg <= addr; + end if; + end process; +end architecture; + diff --git a/Commodore - 64_Mist/rtl/hq2x.sv b/Commodore - 64_Mist/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Commodore - 64_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/Commodore - 64_Mist/rtl/io_ps2_keyboard.vhd b/Commodore - 64_Mist/rtl/io_ps2_keyboard.vhd new file mode 100644 index 00000000..38285c50 --- /dev/null +++ b/Commodore - 64_Mist/rtl/io_ps2_keyboard.vhd @@ -0,0 +1,77 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +entity io_ps2_keyboard is + port ( + clk: in std_logic; + kbd_clk: in std_logic; + kbd_dat: in std_logic; + + interrupt: out std_logic; + scanCode: out unsigned(7 downto 0) + ); +end io_ps2_keyboard; + +architecture Behavioral of io_ps2_keyboard is + signal clk_reg: std_logic; + signal clk_waitNextBit: std_logic; + signal clk_filter: integer range 0 to 15; + signal shift_reg: unsigned(10 downto 0) := (others => '0'); + + signal bitsCount: integer range 0 to 10 := 0; + signal timeout: integer range 0 to 5000 := 0; -- 2* 50 us at 50 Mhz +begin + process(clk) + begin + if rising_edge(clk) then + -- Interrupt is edge triggered. Only 1 clock high. + interrupt <= '0'; + + -- Timeout if keyboard does not send anymore. + if timeout /= 0 then + timeout <= timeout - 1; + else + bitsCount <= 0; + end if; + + -- Filter glitches on the clock + if (clk_reg /= kbd_clk) then + clk_filter <= 15; -- Wait 15 ticks + clk_reg <= kbd_clk; -- Store clock edge to detect changes + clk_waitNextBit <= '0'; -- Next bit comming up... + elsif (clk_filter /= 0) then + -- Wait for clock to stabilise + -- Clock must be stable before we sample the data line. + clk_filter <= clk_filter - 1; + elsif (clk_reg = '1') and (clk_waitNextBit = '0') then + -- We have a stable clock, so assume stable data too. + clk_waitNextBit <= '1'; + + -- Move data into shift register + shift_reg <= kbd_dat & shift_reg(10 downto 1); + timeout <= 5000; + if bitsCount < 10 then + bitsCount <= bitsCount + 1; + else + -- 10 bits received. Output new scancode + bitsCount <= 0; + interrupt <= '1'; + scanCode <= shift_reg(9 downto 2); + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/Commodore - 64_Mist/rtl/m6522.vhd b/Commodore - 64_Mist/rtl/m6522.vhd new file mode 100644 index 00000000..e9bd0603 --- /dev/null +++ b/Commodore - 64_Mist/rtl/m6522.vhd @@ -0,0 +1,919 @@ + -- + -- A simulation model of VIC20 hardware - VIA implementation + -- Copyright (c) MikeJ - March 2003 + -- + -- 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 CODE 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. + -- + -- You are responsible for any legal issues arising from your use of this code. + -- + -- The latest version of this file can be found at: www.fpgaarcade.com + -- + -- Email vic20@fpgaarcade.com + -- + -- + -- Revision list + -- + -- version 004 fixes to PB7 T1 control and Mode 0 Shift Register operation + -- version 003 fix reset of T1/T2 IFR flags if T1/T2 is reload via reg5/reg9 from wolfgang (WoS) + -- Ported to numeric_std and simulation fix for signal initializations from arnim laeuger + -- version 002 fix from Mark McDougall, untested + -- version 001 initial release + -- not very sure about the shift register, documentation is a bit light. + + library ieee ; + use ieee.std_logic_1164.all ; + use ieee.numeric_std.all; + + entity M6522 is + port ( + + I_RS : in std_logic_vector(3 downto 0); + I_DATA : in std_logic_vector(7 downto 0); + O_DATA : out std_logic_vector(7 downto 0); + O_DATA_OE_L : out std_logic; + + I_RW_L : in std_logic; + I_CS1 : in std_logic; + I_CS2_L : in std_logic; + + O_IRQ_L : out std_logic; -- note, not open drain + -- port a + I_CA1 : in std_logic; + I_CA2 : in std_logic; + O_CA2 : out std_logic; + O_CA2_OE_L : out std_logic; + + I_PA : in std_logic_vector(7 downto 0); + O_PA : out std_logic_vector(7 downto 0); + O_PA_OE_L : out std_logic_vector(7 downto 0); + + -- port b + I_CB1 : in std_logic; + O_CB1 : out std_logic; + O_CB1_OE_L : out std_logic; + + I_CB2 : in std_logic; + O_CB2 : out std_logic; + O_CB2_OE_L : out std_logic; + + I_PB : in std_logic_vector(7 downto 0); + O_PB : out std_logic_vector(7 downto 0); + O_PB_OE_L : out std_logic_vector(7 downto 0); + + I_P2_H : in std_logic; -- high for phase 2 clock ____----__ + RESET_L : in std_logic; + ENA_4 : in std_logic; -- clk enable + CLK : in std_logic + ); + end; + + architecture RTL of M6522 is + + signal phase : std_logic_vector(1 downto 0):="00"; + signal p2_h_t1 : std_logic; + signal cs : std_logic; + + -- registers + signal r_ddra : std_logic_vector(7 downto 0); + signal r_ora : std_logic_vector(7 downto 0); + signal r_ira : std_logic_vector(7 downto 0); + + signal r_ddrb : std_logic_vector(7 downto 0); + signal r_orb : std_logic_vector(7 downto 0); + signal r_irb : std_logic_vector(7 downto 0); + + signal r_t1l_l : std_logic_vector(7 downto 0); + signal r_t1l_h : std_logic_vector(7 downto 0); + signal r_t2l_l : std_logic_vector(7 downto 0); + signal r_t2l_h : std_logic_vector(7 downto 0); -- not in real chip + signal r_sr : std_logic_vector(7 downto 0); + signal r_acr : std_logic_vector(7 downto 0); + signal r_pcr : std_logic_vector(7 downto 0); + signal r_ifr : std_logic_vector(7 downto 0); + signal r_ier : std_logic_vector(6 downto 0); + + signal sr_write_ena : boolean; + signal sr_read_ena : boolean; + signal ifr_write_ena : boolean; + signal ier_write_ena : boolean; + signal clear_irq : std_logic_vector(7 downto 0); + signal load_data : std_logic_vector(7 downto 0); + + -- timer 1 + signal t1c : std_logic_vector(15 downto 0) := (others => '1'); -- simulators may not catch up w/o init here... + signal t1c_active : boolean; + signal t1c_done : boolean; + signal t1_w_reset_int : boolean; + signal t1_r_reset_int : boolean; + signal t1_load_counter : boolean; + signal t1_reload_counter : boolean; + signal t1_toggle : std_logic; + signal t1_irq : std_logic := '0'; + + -- timer 2 + signal t2c : std_logic_vector(15 downto 0) := (others => '1'); -- simulators may not catch up w/o init here... + signal t2c_active : boolean; + signal t2c_done : boolean; + signal t2_pb6 : std_logic; + signal t2_pb6_t1 : std_logic; + signal t2_w_reset_int : boolean; + signal t2_r_reset_int : boolean; + signal t2_load_counter : boolean; + signal t2_reload_counter : boolean; + signal t2_irq : std_logic := '0'; + signal t2_sr_ena : boolean; + + -- shift reg + signal sr_cnt : std_logic_vector(3 downto 0); + signal sr_cb1_oe_l : std_logic; + signal sr_cb1_out : std_logic; + signal sr_drive_cb2 : std_logic; + signal sr_strobe : std_logic; + signal sr_strobe_t1 : std_logic; + signal sr_strobe_falling : boolean; + signal sr_strobe_rising : boolean; + signal sr_irq : std_logic; + signal sr_out : std_logic; + signal sr_off_delay : std_logic; + + -- io + signal w_orb_hs : std_logic; + signal w_ora_hs : std_logic; + signal r_irb_hs : std_logic; + signal r_ira_hs : std_logic; + + signal ca_hs_sr : std_logic; + signal ca_hs_pulse : std_logic; + signal cb_hs_sr : std_logic; + signal cb_hs_pulse : std_logic; + + signal cb1_in_mux : std_logic; + signal ca1_ip_reg : std_logic; + signal cb1_ip_reg : std_logic; + signal ca1_int : boolean; + signal cb1_int : boolean; + signal ca1_irq : std_logic; + signal cb1_irq : std_logic; + + signal ca2_ip_reg : std_logic; + signal cb2_ip_reg : std_logic; + signal ca2_int : boolean; + signal cb2_int : boolean; + signal ca2_irq : std_logic; + signal cb2_irq : std_logic; + + signal final_irq : std_logic; + begin + + p_phase : process + begin + -- internal clock phase + wait until rising_edge(CLK); + if (ENA_4 = '1') then + p2_h_t1 <= I_P2_H; + if (p2_h_t1 = '0') and (I_P2_H = '1') then + phase <= "11"; + else + phase <= std_logic_vector(unsigned(phase) + 1); + end if; + end if; + end process; + + p_cs : process(I_CS1, I_CS2_L, I_P2_H) + begin + cs <= '0'; + if (I_CS1 = '1') and (I_CS2_L = '0') and (I_P2_H = '1') then + cs <= '1'; + end if; + end process; + + -- peripheral control reg (pcr) + -- 0 ca1 interrupt control (0 +ve edge, 1 -ve edge) + -- 3..1 ca2 operation + -- 000 input -ve edge + -- 001 independend interrupt input -ve edge + -- 010 input +ve edge + -- 011 independend interrupt input +ve edge + -- 100 handshake output + -- 101 pulse output + -- 110 low output + -- 111 high output + -- 7..4 as 3..0 for cb1,cb2 + + -- auxiliary control reg (acr) + -- 0 input latch PA (0 disable, 1 enable) + -- 1 input latch PB (0 disable, 1 enable) + -- 4..2 shift reg control + -- 000 disable + -- 001 shift in using t2 + -- 010 shift in using o2 + -- 011 shift in using ext clk + -- 100 shift out free running t2 rate + -- 101 shift out using t2 + -- 101 shift out using o2 + -- 101 shift out using ext clk + -- 5 t2 timer control (0 timed interrupt, 1 count down with pulses on pb6) + -- 7..6 t1 timer control + -- 00 timed interrupt each time t1 is loaded pb7 disable + -- 01 continuous interrupts pb7 disable + -- 00 timed interrupt each time t1 is loaded pb7 one shot output + -- 01 continuous interrupts pb7 square wave output + -- + + p_write_reg_reset : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + r_ora <= x"00"; r_orb <= x"00"; + r_ddra <= x"00"; r_ddrb <= x"00"; + r_acr <= x"00"; r_pcr <= x"00"; + + w_orb_hs <= '0'; + w_ora_hs <= '0'; + elsif rising_edge(CLK) then + if (ENA_4 = '1') then + w_orb_hs <= '0'; + w_ora_hs <= '0'; + if (cs = '1') and (I_RW_L = '0') then + case I_RS is + when x"0" => r_orb <= I_DATA; w_orb_hs <= '1'; + when x"1" => r_ora <= I_DATA; w_ora_hs <= '1'; + when x"2" => r_ddrb <= I_DATA; + when x"3" => r_ddra <= I_DATA; + + when x"B" => r_acr <= I_DATA; + when x"C" => r_pcr <= I_DATA; + when x"F" => r_ora <= I_DATA; + + when others => null; + end case; + end if; + + if r_acr(7) = '1' then + -- DMB: Forgetting to clear B7 broke Acornsoft Planetoid + if t1_load_counter then + r_orb(7) <= '0'; -- writing T1C-H resets bit 7 + elsif t1_toggle = '1' then + r_orb(7) <= not r_orb(7); -- toggle + end if; + end if; + end if; + end if; + end process; + + p_write_reg : process (RESET_L, CLK) is + begin + if (RESET_L = '0') then + -- The spec says, this is not reset. + -- Fact is that the 1541 VIA1 timer won't work, + -- as the firmware ONLY sets the r_t1l_h latch!!!! + r_t1l_l <= (others => '0'); + r_t1l_h <= (others => '0'); + r_t2l_l <= (others => '0'); + r_t2l_h <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA_4 = '1') then + t1_w_reset_int <= false; + t1_load_counter <= false; + + t2_w_reset_int <= false; + t2_load_counter <= false; + + load_data <= x"00"; + sr_write_ena <= false; + ifr_write_ena <= false; + ier_write_ena <= false; + + if (cs = '1') and (I_RW_L = '0') then + load_data <= I_DATA; + case I_RS is + when x"4" => r_t1l_l <= I_DATA; + when x"5" => r_t1l_h <= I_DATA; t1_w_reset_int <= true; + t1_load_counter <= true; + + when x"6" => r_t1l_l <= I_DATA; + when x"7" => r_t1l_h <= I_DATA; t1_w_reset_int <= true; + + when x"8" => r_t2l_l <= I_DATA; + when x"9" => r_t2l_h <= I_DATA; t2_w_reset_int <= true; + t2_load_counter <= true; + + when x"A" => sr_write_ena <= true; + when x"D" => ifr_write_ena <= true; + when x"E" => ier_write_ena <= true; + + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_oe : process(cs, I_RW_L) + begin + O_DATA_OE_L <= '1'; + if (cs = '1') and (I_RW_L = '1') then + O_DATA_OE_L <= '0'; + end if; + end process; + + p_read : process(cs, I_RW_L, I_RS, r_irb, r_ira, r_ddrb, r_ddra, t1c, r_t1l_l, + r_t1l_h, t2c, r_sr, r_acr, r_pcr, r_ifr, r_ier, r_orb) + begin + t1_r_reset_int <= false; + t2_r_reset_int <= false; + sr_read_ena <= false; + r_irb_hs <= '0'; + r_ira_hs <= '0'; + O_DATA <= x"00"; -- default + if (cs = '1') and (I_RW_L = '1') then + case I_RS is + --when x"0" => O_DATA <= r_irb; r_irb_hs <= '1'; + -- fix from Mark McDougall, untested + when x"0" => O_DATA <= (r_irb and not r_ddrb) or (r_orb and r_ddrb); r_irb_hs <= '1'; + when x"1" => O_DATA <= (r_ira and not r_ddra) or (r_ora and r_ddra); r_ira_hs <= '1'; + when x"2" => O_DATA <= r_ddrb; + when x"3" => O_DATA <= r_ddra; + when x"4" => O_DATA <= t1c( 7 downto 0); t1_r_reset_int <= true; + when x"5" => O_DATA <= t1c(15 downto 8); + when x"6" => O_DATA <= r_t1l_l; + when x"7" => O_DATA <= r_t1l_h; + when x"8" => O_DATA <= t2c( 7 downto 0); t2_r_reset_int <= true; + when x"9" => O_DATA <= t2c(15 downto 8); + when x"A" => O_DATA <= r_sr; sr_read_ena <= true; + when x"B" => O_DATA <= r_acr; + when x"C" => O_DATA <= r_pcr; + when x"D" => O_DATA <= r_ifr; + when x"E" => O_DATA <= ('0' & r_ier); + when x"F" => O_DATA <= r_ira; + when others => null; + end case; + end if; + + end process; + -- + -- IO + -- + p_ca1_cb1_sel : process(sr_cb1_oe_l, sr_cb1_out, I_CB1) + begin + -- if the shift register is enabled, cb1 may be an output + -- in this case, we should listen to the CB1_OUT for the interrupt + if (sr_cb1_oe_l = '1') then + cb1_in_mux <= I_CB1; + else + cb1_in_mux <= sr_cb1_out; + end if; + end process; + + p_ca1_cb1_int : process(r_pcr, ca1_ip_reg, I_CA1, cb1_ip_reg, cb1_in_mux) + begin + if (r_pcr(0) = '0') then -- ca1 control + -- negative edge + ca1_int <= (ca1_ip_reg = '1') and (I_CA1 = '0'); + else + -- positive edge + ca1_int <= (ca1_ip_reg = '0') and (I_CA1 = '1'); + end if; + + if (r_pcr(4) = '0') then -- cb1 control + -- negative edge + cb1_int <= (cb1_ip_reg = '1') and (cb1_in_mux = '0'); + else + -- positive edge + cb1_int <= (cb1_ip_reg = '0') and (cb1_in_mux = '1'); + end if; + end process; + + p_ca2_cb2_int : process(r_pcr, ca2_ip_reg, I_CA2, cb2_ip_reg, I_CB2) + begin + ca2_int <= false; + if (r_pcr(3) = '0') then -- ca2 input + if (r_pcr(2) = '0') then -- ca2 edge + -- negative edge + ca2_int <= (ca2_ip_reg = '1') and (I_CA2 = '0'); + else + -- positive edge + ca2_int <= (ca2_ip_reg = '0') and (I_CA2 = '1'); + end if; + end if; + + cb2_int <= false; + if (r_pcr(7) = '0') then -- cb2 input + if (r_pcr(6) = '0') then -- cb2 edge + -- negative edge + cb2_int <= (cb2_ip_reg = '1') and (I_CB2 = '0'); + else + -- positive edge + cb2_int <= (cb2_ip_reg = '0') and (I_CB2 = '1'); + end if; + end if; + end process; + + p_ca2_cb2 : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_CA2 <= '0'; + O_CA2_OE_L <= '1'; + O_CB2 <= '0'; + O_CB2_OE_L <= '1'; + + ca_hs_sr <= '0'; + ca_hs_pulse <= '0'; + cb_hs_sr <= '0'; + cb_hs_pulse <= '0'; + elsif rising_edge(CLK) then + if (ENA_4 = '1') then + -- ca + if (phase = "00") and ((w_ora_hs = '1') or (r_ira_hs = '1')) then + ca_hs_sr <= '1'; + elsif ca1_int then + ca_hs_sr <= '0'; + end if; + + if (phase = "00") then + ca_hs_pulse <= w_ora_hs or r_ira_hs; + end if; + + O_CA2_OE_L <= not r_pcr(3); -- ca2 output + case r_pcr(3 downto 1) is + when "000" => O_CA2 <= '0'; -- input + when "001" => O_CA2 <= '0'; -- input + when "010" => O_CA2 <= '0'; -- input + when "011" => O_CA2 <= '0'; -- input + when "100" => O_CA2 <= not (ca_hs_sr); -- handshake + when "101" => O_CA2 <= not (ca_hs_pulse); -- pulse + when "110" => O_CA2 <= '0'; -- low + when "111" => O_CA2 <= '1'; -- high + when others => null; + end case; + + -- cb + if (phase = "00") and (w_orb_hs = '1') then + cb_hs_sr <= '1'; + elsif cb1_int then + cb_hs_sr <= '0'; + end if; + + if (phase = "00") then + cb_hs_pulse <= w_orb_hs; + end if; + + O_CB2_OE_L <= not (r_pcr(7) or sr_drive_cb2); -- cb2 output or serial + if (sr_drive_cb2 = '1') then -- serial output + O_CB2 <= sr_out; + else + case r_pcr(7 downto 5) is + when "000" => O_CB2 <= '0'; -- input + when "001" => O_CB2 <= '0'; -- input + when "010" => O_CB2 <= '0'; -- input + when "011" => O_CB2 <= '0'; -- input + when "100" => O_CB2 <= not (cb_hs_sr); -- handshake + when "101" => O_CB2 <= not (cb_hs_pulse); -- pulse + when "110" => O_CB2 <= '0'; -- low + when "111" => O_CB2 <= '1'; -- high + when others => null; + end case; + end if; + end if; + end if; + end process; + O_CB1 <= sr_cb1_out; + O_CB1_OE_L <= sr_cb1_oe_l; + + p_ca_cb_irq : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + ca1_irq <= '0'; + ca2_irq <= '0'; + cb1_irq <= '0'; + cb2_irq <= '0'; + elsif rising_edge(CLK) then + if (ENA_4 = '1') then + -- not pretty + if ca1_int then + ca1_irq <= '1'; + elsif (r_ira_hs = '1') or (w_ora_hs = '1') or (clear_irq(1) = '1') then + ca1_irq <= '0'; + end if; + + if ca2_int then + ca2_irq <= '1'; + else + if (((r_ira_hs = '1') or (w_ora_hs = '1')) and (r_pcr(1) = '0')) or + (clear_irq(0) = '1') then + ca2_irq <= '0'; + end if; + end if; + + if cb1_int then + cb1_irq <= '1'; + elsif (r_irb_hs = '1') or (w_orb_hs = '1') or (clear_irq(4) = '1') then + cb1_irq <= '0'; + end if; + + if cb2_int then + cb2_irq <= '1'; + else + if (((r_irb_hs = '1') or (w_orb_hs = '1')) and (r_pcr(5) = '0')) or + (clear_irq(3) = '1') then + cb2_irq <= '0'; + end if; + end if; + end if; + end if; + end process; + + p_input_reg : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + ca1_ip_reg <= '0'; + cb1_ip_reg <= '0'; + + ca2_ip_reg <= '0'; + cb2_ip_reg <= '0'; + + r_ira <= x"00"; + r_irb <= x"00"; + + elsif rising_edge(CLK) then + if (ENA_4 = '1') then + -- we have a fast clock, so we can have input registers + ca1_ip_reg <= I_CA1; + cb1_ip_reg <= cb1_in_mux; + + ca2_ip_reg <= I_CA2; + cb2_ip_reg <= I_CB2; + + if (r_acr(0) = '0') then + r_ira <= I_PA; + else -- enable latching + if ca1_int then + r_ira <= I_PA; + end if; + end if; + + if (r_acr(1) = '0') then + r_irb <= I_PB; + else -- enable latching + if cb1_int then + r_irb <= I_PB; + end if; + end if; + end if; + end if; + end process; + + + p_buffers : process(r_ddra, r_ora, r_ddrb, r_acr, r_orb) + begin + -- data direction reg (ddr) 0 = input, 1 = output + O_PA <= r_ora; + O_PA_OE_L <= not r_ddra; + + if (r_acr(7) = '1') then -- not clear if r_ddrb(7) must be 1 as well + O_PB_OE_L(7) <= '0'; -- an output if under t1 control + else + O_PB_OE_L(7) <= not (r_ddrb(7)); + end if; + + O_PB_OE_L(6 downto 0) <= not r_ddrb(6 downto 0); + O_PB(7 downto 0) <= r_orb(7 downto 0); + + end process; + -- + -- Timer 1 + -- + p_timer1_done : process + variable done : boolean; + begin + wait until rising_edge(CLK); + if (ENA_4 = '1') then + done := (t1c = x"0000"); + t1c_done <= done and (phase = "11"); + if (phase = "11") then + t1_reload_counter <= done and (r_acr(6) = '1'); + end if; + if t1_load_counter then -- done reset on load! + t1c_done <= false; + end if; + end if; + end process; + + p_timer1 : process + begin + wait until rising_edge(CLK); + if (ENA_4 = '1') then + if t1_load_counter or (t1_reload_counter and phase = "11") then + t1c( 7 downto 0) <= r_t1l_l; + t1c(15 downto 8) <= r_t1l_h; + elsif (phase="11") then + t1c <= std_logic_vector(unsigned(t1c) - 1); + end if; + + if t1_load_counter or t1_reload_counter then + t1c_active <= true; + elsif t1c_done then + t1c_active <= false; + end if; + + t1_toggle <= '0'; + if t1c_active and t1c_done then + t1_toggle <= '1'; + t1_irq <= '1'; + elsif t1_w_reset_int or t1_r_reset_int or (clear_irq(6) = '1') then + t1_irq <= '0'; + end if; + if t1_load_counter then -- irq reset on load! + t1_irq <= '0'; + end if; + end if; + end process; + -- + -- Timer2 + -- + p_timer2_pb6_input : process + begin + wait until rising_edge(CLK); + if (ENA_4 = '1') then + if (phase = "01") then -- leading edge p2_h + t2_pb6 <= I_PB(6); + t2_pb6_t1 <= t2_pb6; + end if; + end if; + end process; + + p_timer2_done : process + variable done : boolean; + begin + wait until rising_edge(CLK); + if (ENA_4 = '1') then + done := (t2c = x"0000"); + t2c_done <= done and (phase = "11"); + if (phase = "11") then + t2_reload_counter <= done; + end if; + if t2_load_counter then -- done reset on load! + t2c_done <= false; + end if; + end if; + end process; + + p_timer2 : process + variable ena : boolean; + begin + wait until rising_edge(CLK); + if (ENA_4 = '1') then + if (r_acr(5) = '0') then + ena := true; + else + ena := (t2_pb6_t1 = '1') and (t2_pb6 = '0'); -- falling edge + end if; + + if t2_load_counter or (t2_reload_counter and phase = "11") then + -- not sure if t2c_reload should be here. Does timer2 just continue to + -- count down, or is it reloaded ? Reloaded makes more sense if using + -- it to generate a clock for the shift register. + t2c( 7 downto 0) <= r_t2l_l; + t2c(15 downto 8) <= r_t2l_h; + else + if (phase="11") and ena then -- or count mode + t2c <= std_logic_vector(unsigned(t2c) - 1); + end if; + end if; + + t2_sr_ena <= (t2c(7 downto 0) = x"00") and (phase = "11"); + + if t2_load_counter then + t2c_active <= true; + elsif t2c_done then + t2c_active <= false; + end if; + + if t2c_active and t2c_done then + t2_irq <= '1'; + elsif t2_w_reset_int or t2_r_reset_int or (clear_irq(5) = '1') then + t2_irq <= '0'; + end if; + if t2_load_counter then -- irq reset on load! + t2_irq <= '0'; + end if; + end if; + end process; + -- + -- Shift Register + -- + p_sr : process(RESET_L, CLK) + variable dir_out : std_logic; + variable ena : std_logic; + variable cb1_op : std_logic; + variable cb1_ip : std_logic; + variable use_t2 : std_logic; + variable free_run : std_logic; + variable sr_count_ena : boolean; + begin + if (RESET_L = '0') then + r_sr <= x"00"; + sr_drive_cb2 <= '0'; + sr_cb1_oe_l <= '1'; + sr_cb1_out <= '0'; + sr_strobe <= '1'; + sr_cnt <= "0000"; + sr_irq <= '0'; + sr_out <= '1'; + sr_off_delay <= '0'; + elsif rising_edge(CLK) then + if (ENA_4 = '1') then + -- decode mode + dir_out := r_acr(4); -- output on cb2 + cb1_op := '0'; + cb1_ip := '0'; + use_t2 := '0'; + free_run := '0'; + + -- DMB: SR still runs even in disabled mode (on rising edge of CB1). + -- It just doesn't generate any interrupts. + -- Ref BBC micro advanced user guide p409 + + case r_acr(4 downto 2) is + -- DMB: in disabled mode, configure cb1 as an input + when "000" => ena := '0'; cb1_ip := '1'; + when "001" => ena := '1'; cb1_op := '1'; use_t2 := '1'; + when "010" => ena := '1'; cb1_op := '1'; + when "011" => ena := '1'; cb1_ip := '1'; + when "100" => ena := '1'; use_t2 := '1'; free_run := '1'; + when "101" => ena := '1'; cb1_op := '1'; use_t2 := '1'; + when "110" => ena := '1'; --free_run := '1'; -- hack + when "111" => ena := '1'; cb1_ip := '1'; + when others => null; + end case; + + -- clock select + -- DMB: in disabled mode, strobe from cb1 + if (cb1_ip = '1') then + sr_strobe <= I_CB1; + else + if (sr_cnt(3) = '0') and (free_run = '0') then + sr_strobe <= '1'; + else + if ((use_t2 = '1') and t2_sr_ena) or + ((use_t2 = '0') and (phase = "00")) then + sr_strobe <= not sr_strobe; + end if; + end if; + end if; + + -- latch on rising edge, shift on falling edge + if sr_write_ena then + r_sr <= load_data; + + else + -- DMB: allow shifting in all modes + if (dir_out = '0') then + -- input + if (sr_cnt(3) = '1') or (cb1_ip = '1') then + if sr_strobe_rising then + r_sr(0) <= I_CB2; + elsif sr_strobe_falling then + r_sr(7 downto 1) <= r_sr(6 downto 0); + end if; + end if; + sr_out <= '1'; + else + -- output + if (sr_cnt(3) = '1') or (sr_off_delay = '1') or (cb1_ip = '1') or (free_run = '1') then + if sr_strobe_falling then + r_sr(7 downto 1) <= r_sr(6 downto 0); + r_sr(0) <= r_sr(7); + sr_out <= r_sr(7); + end if; + else + sr_out <= '1'; + end if; + end if; + end if; + + sr_count_ena := sr_strobe_rising; + + -- DMB: reseting sr_count when not enabled cause the sr to + -- start running immediately it was enabled, which is incorrect + -- and broke the latest SmartSPI ROM on the BBC Micro + if ena = '1' and (sr_write_ena or sr_read_ena) then + -- some documentation says sr bit in IFR must be set as well ? + sr_cnt <= "1000"; + elsif sr_count_ena and (sr_cnt(3) = '1') then + sr_cnt <= std_logic_vector(unsigned(sr_cnt) + 1); + end if; + + if (phase = "00") then + sr_off_delay <= sr_cnt(3); -- give some hold time when shifting out + end if; + + if sr_count_ena and (sr_cnt = "1111") and (ena = '1') and (free_run = '0') then + sr_irq <= '1'; + elsif sr_write_ena or sr_read_ena or (clear_irq(2) = '1') then + sr_irq <= '0'; + end if; + + -- assign ops + sr_drive_cb2 <= dir_out; + sr_cb1_oe_l <= not cb1_op; + sr_cb1_out <= sr_strobe; + end if; + end if; + end process; + + p_sr_strobe_rise_fall : process + begin + wait until rising_edge(CLK); + if (ENA_4 = '1') then + sr_strobe_t1 <= sr_strobe; + sr_strobe_rising <= (sr_strobe_t1 = '0') and (sr_strobe = '1'); + sr_strobe_falling <= (sr_strobe_t1 = '1') and (sr_strobe = '0'); + end if; + end process; + -- + -- Interrupts + -- + p_ier : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + r_ier <= "0000000"; + elsif rising_edge(CLK) then + if (ENA_4 = '1') then + if ier_write_ena then + if (load_data(7) = '1') then + -- set + r_ier <= r_ier or load_data(6 downto 0); + else + -- clear + r_ier <= r_ier and not load_data(6 downto 0); + end if; + end if; + end if; + end if; + end process; + + p_ifr : process(t1_irq, t2_irq, final_irq, ca1_irq, ca2_irq, sr_irq, + cb1_irq, cb2_irq) + begin + r_ifr(7) <= final_irq; + r_ifr(6) <= t1_irq; + r_ifr(5) <= t2_irq; + r_ifr(4) <= cb1_irq; + r_ifr(3) <= cb2_irq; + r_ifr(2) <= sr_irq; + r_ifr(1) <= ca1_irq; + r_ifr(0) <= ca2_irq; + + O_IRQ_L <= not final_irq; + end process; + + p_irq : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + final_irq <= '0'; + elsif rising_edge(CLK) then + if (ENA_4 = '1') then + if ((r_ifr(6 downto 0) and r_ier(6 downto 0)) = "0000000") then + final_irq <= '0'; -- no interrupts + else + final_irq <= '1'; + end if; + end if; + end if; + end process; + + p_clear_irq : process(ifr_write_ena, load_data) + begin + clear_irq <= x"00"; + if ifr_write_ena then + clear_irq <= load_data; + end if; + end process; + + end architecture RTL; \ No newline at end of file diff --git a/Commodore - 64_Mist/rtl/mist_io.v b/Commodore - 64_Mist/rtl/mist_io.v new file mode 100644 index 00000000..107c0f69 --- /dev/null +++ b/Commodore - 64_Mist/rtl/mist_io.v @@ -0,0 +1,521 @@ +// +// 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 + input ioctl_force_erase, + output reg ioctl_download = 0, // signal indicating an active download + output reg ioctl_erasing = 0, // signal indicating an active erase + output reg [7:0] ioctl_index, // menu index used to upload the file + output reg ioctl_wr = 0, + 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 + +reg [24:0] erase_mask; +wire [24:0] next_erase = (ioctl_addr + 1'd1) & erase_mask; + +always@(posedge clk_sys) begin + reg rclkD, rclkD2; + reg old_force = 0; + reg [6:0] erase_clk_div; + reg [24:0] end_addr; + + rclkD <= rclk; + rclkD2 <= rclkD; + ioctl_wr <= 0; + + if(rclkD & ~rclkD2) begin + ioctl_dout <= data_w; + ioctl_addr <= addr_w; + ioctl_wr <= 1; + end + + if(ioctl_download) begin + old_force <= 0; + ioctl_erasing <= 0; + end else begin + + old_force <= ioctl_force_erase; + if(ioctl_force_erase & ~old_force) begin + ioctl_addr <= 'h1FFFF; + erase_mask <= 'h1FFFF; + end_addr <= 'h10002; + erase_clk_div <= 1; + ioctl_erasing <= 1; + end else if(ioctl_erasing) begin + erase_clk_div <= erase_clk_div + 1'd1; + if(!erase_clk_div) begin + if(next_erase == end_addr) ioctl_erasing <= 0; + else begin + ioctl_addr <= next_erase; + ioctl_dout <= 0; + ioctl_wr <= 1; + end + end + end + end +end + +endmodule \ No newline at end of file diff --git a/Commodore - 64_Mist/rtl/osd.v b/Commodore - 64_Mist/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Commodore - 64_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/Commodore - 64_Mist/rtl/pll.vhd b/Commodore - 64_Mist/rtl/pll.vhd new file mode 100644 index 00000000..1e72638b --- /dev/null +++ b/Commodore - 64_Mist/rtl/pll.vhd @@ -0,0 +1,421 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Full Version +-- ************************************************************ + + +--Copyright (C) 1991-2014 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + locked <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 64, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 64, + clk1_phase_shift => "-2604", + clk2_divide_by => 27, + clk2_duty_cycle => 50, + clk2_multiply_by => 32, + clk2_phase_shift => "0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll", + lpm_type => "altpll", + operation_mode => "NO_COMPENSATION", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "ON", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire6, + clk => sub_wire0, + locked => sub_wire2 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "High" +-- 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 "1" +-- 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 "9" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "3" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "1" +-- 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 "64.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "64.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "32.000000" +-- 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 "26.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 "1" +-- 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 "48" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "7" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "64.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "64.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "32.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "1" +-- 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 "-60.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 "ps" +-- 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 "1" +-- 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 "64" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "64" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "-2604" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "32" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- 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 "NO_COMPENSATION" +-- 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_USED" +-- 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: SELF_RESET_ON_LOSS_LOCK STRING "ON" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..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: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- 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: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Commodore - 64_Mist/rtl/rom_C1541.vhd b/Commodore - 64_Mist/rtl/rom_C1541.vhd new file mode 100644 index 00000000..f25b3691 --- /dev/null +++ b/Commodore - 64_Mist/rtl/rom_C1541.vhd @@ -0,0 +1,198 @@ +-- megafunction wizard: %RAM: 2-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: rom_C1541.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Full Version +-- ************************************************************ + + +--Copyright (C) 1991-2014 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY rom_C1541 IS + PORT + ( + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); + rdaddress : IN STD_LOGIC_VECTOR (13 DOWNTO 0); + wraddress : IN STD_LOGIC_VECTOR (13 DOWNTO 0); + wren : IN STD_LOGIC := '0'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END rom_C1541; + + +ARCHITECTURE SYN OF rom_c1541 IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_b => "NONE", + address_reg_b => "CLOCK0", + clock_enable_input_a => "BYPASS", + clock_enable_input_b => "BYPASS", + clock_enable_output_b => "BYPASS", + init_file => "roms/std_C1541.mif", + intended_device_family => "Cyclone III", + lpm_type => "altsyncram", + numwords_a => 16384, + numwords_b => 16384, + operation_mode => "DUAL_PORT", + outdata_aclr_b => "NONE", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_mixed_ports => "DONT_CARE", + widthad_a => 14, + widthad_b => 14, + width_a => 8, + width_b => 8, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => wraddress, + clock0 => clock, + data_a => data, + wren_a => wren, + address_b => rdaddress, + q_b => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0" +-- Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0" +-- Retrieval info: PRIVATE: CLRdata NUMERIC "0" +-- Retrieval info: PRIVATE: CLRq NUMERIC "0" +-- Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0" +-- Retrieval info: PRIVATE: CLRrren NUMERIC "0" +-- Retrieval info: PRIVATE: CLRwraddress NUMERIC "0" +-- Retrieval info: PRIVATE: CLRwren NUMERIC "0" +-- Retrieval info: PRIVATE: Clock NUMERIC "0" +-- Retrieval info: PRIVATE: Clock_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clock_B NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INDATA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: INDATA_REG_B NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_B" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MEMSIZE NUMERIC "131072" +-- Retrieval info: PRIVATE: MEM_IN_BITS NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "./roms/std_C1541.mif" +-- Retrieval info: PRIVATE: OPERATION_MODE NUMERIC "2" +-- Retrieval info: PRIVATE: OUTDATA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: OUTDATA_REG_B NUMERIC "0" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_MIXED_PORTS NUMERIC "2" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_B NUMERIC "3" +-- Retrieval info: PRIVATE: REGdata NUMERIC "1" +-- Retrieval info: PRIVATE: REGq NUMERIC "1" +-- Retrieval info: PRIVATE: REGrdaddress NUMERIC "1" +-- Retrieval info: PRIVATE: REGrren NUMERIC "1" +-- Retrieval info: PRIVATE: REGwraddress NUMERIC "1" +-- Retrieval info: PRIVATE: REGwren NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_DIFF_CLKEN NUMERIC "0" +-- Retrieval info: PRIVATE: UseDPRAM NUMERIC "1" +-- Retrieval info: PRIVATE: VarWidth NUMERIC "0" +-- Retrieval info: PRIVATE: WIDTH_READ_A NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_READ_B NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_WRITE_A NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_WRITE_B NUMERIC "8" +-- Retrieval info: PRIVATE: WRADDR_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: WRADDR_REG_B NUMERIC "0" +-- Retrieval info: PRIVATE: WRCTRL_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: enable NUMERIC "0" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_ACLR_B STRING "NONE" +-- Retrieval info: CONSTANT: ADDRESS_REG_B STRING "CLOCK0" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_B STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_B STRING "BYPASS" +-- Retrieval info: CONSTANT: INIT_FILE STRING "./roms/std_C1541.mif" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "16384" +-- Retrieval info: CONSTANT: NUMWORDS_B NUMERIC "16384" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "DUAL_PORT" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_B STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_B STRING "UNREGISTERED" +-- Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +-- Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_MIXED_PORTS STRING "DONT_CARE" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "14" +-- Retrieval info: CONSTANT: WIDTHAD_B NUMERIC "14" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_B NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data[7..0]" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +-- Retrieval info: USED_PORT: rdaddress 0 0 14 0 INPUT NODEFVAL "rdaddress[13..0]" +-- Retrieval info: USED_PORT: wraddress 0 0 14 0 INPUT NODEFVAL "wraddress[13..0]" +-- Retrieval info: USED_PORT: wren 0 0 0 0 INPUT GND "wren" +-- Retrieval info: CONNECT: @address_a 0 0 14 0 wraddress 0 0 14 0 +-- Retrieval info: CONNECT: @address_b 0 0 14 0 rdaddress 0 0 14 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: @data_a 0 0 8 0 data 0 0 8 0 +-- Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 8 0 @q_b 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_C1541.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_C1541.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_C1541.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_C1541.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_C1541_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Commodore - 64_Mist/rtl/rom_C64.vhd b/Commodore - 64_Mist/rtl/rom_C64.vhd new file mode 100644 index 00000000..e422e4a6 --- /dev/null +++ b/Commodore - 64_Mist/rtl/rom_C64.vhd @@ -0,0 +1,198 @@ +-- megafunction wizard: %RAM: 2-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: rom_C64.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Full Version +-- ************************************************************ + + +--Copyright (C) 1991-2014 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY rom_C64 IS + PORT + ( + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); + rdaddress : IN STD_LOGIC_VECTOR (13 DOWNTO 0); + wraddress : IN STD_LOGIC_VECTOR (13 DOWNTO 0); + wren : IN STD_LOGIC := '0'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END rom_C64; + + +ARCHITECTURE SYN OF rom_c64 IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_b => "NONE", + address_reg_b => "CLOCK0", + clock_enable_input_a => "BYPASS", + clock_enable_input_b => "BYPASS", + clock_enable_output_b => "BYPASS", + init_file => "roms/std_C64.mif", + intended_device_family => "Cyclone III", + lpm_type => "altsyncram", + numwords_a => 16384, + numwords_b => 16384, + operation_mode => "DUAL_PORT", + outdata_aclr_b => "NONE", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_mixed_ports => "DONT_CARE", + widthad_a => 14, + widthad_b => 14, + width_a => 8, + width_b => 8, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => wraddress, + clock0 => clock, + data_a => data, + wren_a => wren, + address_b => rdaddress, + q_b => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0" +-- Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0" +-- Retrieval info: PRIVATE: CLRdata NUMERIC "0" +-- Retrieval info: PRIVATE: CLRq NUMERIC "0" +-- Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0" +-- Retrieval info: PRIVATE: CLRrren NUMERIC "0" +-- Retrieval info: PRIVATE: CLRwraddress NUMERIC "0" +-- Retrieval info: PRIVATE: CLRwren NUMERIC "0" +-- Retrieval info: PRIVATE: Clock NUMERIC "0" +-- Retrieval info: PRIVATE: Clock_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clock_B NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INDATA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: INDATA_REG_B NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_B" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MEMSIZE NUMERIC "131072" +-- Retrieval info: PRIVATE: MEM_IN_BITS NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "std_C64.mif" +-- Retrieval info: PRIVATE: OPERATION_MODE NUMERIC "2" +-- Retrieval info: PRIVATE: OUTDATA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: OUTDATA_REG_B NUMERIC "0" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_MIXED_PORTS NUMERIC "2" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_B NUMERIC "3" +-- Retrieval info: PRIVATE: REGdata NUMERIC "1" +-- Retrieval info: PRIVATE: REGq NUMERIC "1" +-- Retrieval info: PRIVATE: REGrdaddress NUMERIC "1" +-- Retrieval info: PRIVATE: REGrren NUMERIC "1" +-- Retrieval info: PRIVATE: REGwraddress NUMERIC "1" +-- Retrieval info: PRIVATE: REGwren NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_DIFF_CLKEN NUMERIC "0" +-- Retrieval info: PRIVATE: UseDPRAM NUMERIC "1" +-- Retrieval info: PRIVATE: VarWidth NUMERIC "0" +-- Retrieval info: PRIVATE: WIDTH_READ_A NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_READ_B NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_WRITE_A NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_WRITE_B NUMERIC "8" +-- Retrieval info: PRIVATE: WRADDR_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: WRADDR_REG_B NUMERIC "0" +-- Retrieval info: PRIVATE: WRCTRL_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: enable NUMERIC "0" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_ACLR_B STRING "NONE" +-- Retrieval info: CONSTANT: ADDRESS_REG_B STRING "CLOCK0" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_B STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_B STRING "BYPASS" +-- Retrieval info: CONSTANT: INIT_FILE STRING "std_C64.mif" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "16384" +-- Retrieval info: CONSTANT: NUMWORDS_B NUMERIC "16384" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "DUAL_PORT" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_B STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_B STRING "UNREGISTERED" +-- Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +-- Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_MIXED_PORTS STRING "DONT_CARE" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "14" +-- Retrieval info: CONSTANT: WIDTHAD_B NUMERIC "14" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_B NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data[7..0]" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +-- Retrieval info: USED_PORT: rdaddress 0 0 14 0 INPUT NODEFVAL "rdaddress[13..0]" +-- Retrieval info: USED_PORT: wraddress 0 0 14 0 INPUT NODEFVAL "wraddress[13..0]" +-- Retrieval info: USED_PORT: wren 0 0 0 0 INPUT GND "wren" +-- Retrieval info: CONNECT: @address_a 0 0 14 0 wraddress 0 0 14 0 +-- Retrieval info: CONNECT: @address_b 0 0 14 0 rdaddress 0 0 14 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: @data_a 0 0 8 0 data 0 0 8 0 +-- Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 8 0 @q_b 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_C64.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_C64.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_C64.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_C64.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_C64_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Commodore - 64_Mist/rtl/rom_GS64.vhd b/Commodore - 64_Mist/rtl/rom_GS64.vhd new file mode 100644 index 00000000..0afeb249 --- /dev/null +++ b/Commodore - 64_Mist/rtl/rom_GS64.vhd @@ -0,0 +1,198 @@ +-- megafunction wizard: %RAM: 2-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: rom_GS64.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Full Version +-- ************************************************************ + + +--Copyright (C) 1991-2014 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY rom_GS64 IS + PORT + ( + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); + rdaddress : IN STD_LOGIC_VECTOR (13 DOWNTO 0); + wraddress : IN STD_LOGIC_VECTOR (13 DOWNTO 0); + wren : IN STD_LOGIC := '0'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END rom_GS64; + + +ARCHITECTURE SYN OF rom_GS64 IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_b => "NONE", + address_reg_b => "CLOCK0", + clock_enable_input_a => "BYPASS", + clock_enable_input_b => "BYPASS", + clock_enable_output_b => "BYPASS", + init_file => "roms/std_C64GS.mif", + intended_device_family => "Cyclone III", + lpm_type => "altsyncram", + numwords_a => 16384, + numwords_b => 16384, + operation_mode => "DUAL_PORT", + outdata_aclr_b => "NONE", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_mixed_ports => "DONT_CARE", + widthad_a => 14, + widthad_b => 14, + width_a => 8, + width_b => 8, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => wraddress, + clock0 => clock, + data_a => data, + wren_a => wren, + address_b => rdaddress, + q_b => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0" +-- Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0" +-- Retrieval info: PRIVATE: CLRdata NUMERIC "0" +-- Retrieval info: PRIVATE: CLRq NUMERIC "0" +-- Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0" +-- Retrieval info: PRIVATE: CLRrren NUMERIC "0" +-- Retrieval info: PRIVATE: CLRwraddress NUMERIC "0" +-- Retrieval info: PRIVATE: CLRwren NUMERIC "0" +-- Retrieval info: PRIVATE: Clock NUMERIC "0" +-- Retrieval info: PRIVATE: Clock_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clock_B NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INDATA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: INDATA_REG_B NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_B" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MEMSIZE NUMERIC "131072" +-- Retrieval info: PRIVATE: MEM_IN_BITS NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "std_GS64.mif" +-- Retrieval info: PRIVATE: OPERATION_MODE NUMERIC "2" +-- Retrieval info: PRIVATE: OUTDATA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: OUTDATA_REG_B NUMERIC "0" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_MIXED_PORTS NUMERIC "2" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_B NUMERIC "3" +-- Retrieval info: PRIVATE: REGdata NUMERIC "1" +-- Retrieval info: PRIVATE: REGq NUMERIC "1" +-- Retrieval info: PRIVATE: REGrdaddress NUMERIC "1" +-- Retrieval info: PRIVATE: REGrren NUMERIC "1" +-- Retrieval info: PRIVATE: REGwraddress NUMERIC "1" +-- Retrieval info: PRIVATE: REGwren NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_DIFF_CLKEN NUMERIC "0" +-- Retrieval info: PRIVATE: UseDPRAM NUMERIC "1" +-- Retrieval info: PRIVATE: VarWidth NUMERIC "0" +-- Retrieval info: PRIVATE: WIDTH_READ_A NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_READ_B NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_WRITE_A NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_WRITE_B NUMERIC "8" +-- Retrieval info: PRIVATE: WRADDR_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: WRADDR_REG_B NUMERIC "0" +-- Retrieval info: PRIVATE: WRCTRL_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: enable NUMERIC "0" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_ACLR_B STRING "NONE" +-- Retrieval info: CONSTANT: ADDRESS_REG_B STRING "CLOCK0" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_B STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_B STRING "BYPASS" +-- Retrieval info: CONSTANT: INIT_FILE STRING "std_C64.mif" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "16384" +-- Retrieval info: CONSTANT: NUMWORDS_B NUMERIC "16384" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "DUAL_PORT" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_B STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_B STRING "UNREGISTERED" +-- Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +-- Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_MIXED_PORTS STRING "DONT_CARE" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "14" +-- Retrieval info: CONSTANT: WIDTHAD_B NUMERIC "14" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_B NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data[7..0]" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +-- Retrieval info: USED_PORT: rdaddress 0 0 14 0 INPUT NODEFVAL "rdaddress[13..0]" +-- Retrieval info: USED_PORT: wraddress 0 0 14 0 INPUT NODEFVAL "wraddress[13..0]" +-- Retrieval info: USED_PORT: wren 0 0 0 0 INPUT GND "wren" +-- Retrieval info: CONNECT: @address_a 0 0 14 0 wraddress 0 0 14 0 +-- Retrieval info: CONNECT: @address_b 0 0 14 0 rdaddress 0 0 14 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: @data_a 0 0 8 0 data 0 0 8 0 +-- Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 8 0 @q_b 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_GS64.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_GS64.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_GS64.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_GS64.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL rom_GS64_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Commodore - 64_Mist/rtl/rom_c64_chargen.vhd b/Commodore - 64_Mist/rtl/rom_c64_chargen.vhd new file mode 100644 index 00000000..d4784e0a --- /dev/null +++ b/Commodore - 64_Mist/rtl/rom_c64_chargen.vhd @@ -0,0 +1,283 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +entity rom_c64_chargen is + port ( + clk: in std_logic; + addr: in unsigned(11 downto 0); + do: out unsigned(7 downto 0) + ); +end entity; + +architecture rtl of rom_c64_chargen is + type romDef is array(0 to 4095) of unsigned(7 downto 0); + constant romData: romDef := ( + X"3C", X"66", X"6E", X"6E", X"60", X"62", X"3C", X"00", X"18", X"3C", X"66", X"7E", X"66", X"66", X"66", X"00", + X"7C", X"66", X"66", X"7C", X"66", X"66", X"7C", X"00", X"3C", X"66", X"60", X"60", X"60", X"66", X"3C", X"00", + X"78", X"6C", X"66", X"66", X"66", X"6C", X"78", X"00", X"7E", X"60", X"60", X"78", X"60", X"60", X"7E", X"00", + X"7E", X"60", X"60", X"78", X"60", X"60", X"60", X"00", X"3C", X"66", X"60", X"6E", X"66", X"66", X"3C", X"00", + X"66", X"66", X"66", X"7E", X"66", X"66", X"66", X"00", X"3C", X"18", X"18", X"18", X"18", X"18", X"3C", X"00", + X"1E", X"0C", X"0C", X"0C", X"0C", X"6C", X"38", X"00", X"66", X"6C", X"78", X"70", X"78", X"6C", X"66", X"00", + X"60", X"60", X"60", X"60", X"60", X"60", X"7E", X"00", X"63", X"77", X"7F", X"6B", X"63", X"63", X"63", X"00", + X"66", X"76", X"7E", X"7E", X"6E", X"66", X"66", X"00", X"3C", X"66", X"66", X"66", X"66", X"66", X"3C", X"00", + X"7C", X"66", X"66", X"7C", X"60", X"60", X"60", X"00", X"3C", X"66", X"66", X"66", X"66", X"3C", X"0E", X"00", + X"7C", X"66", X"66", X"7C", X"78", X"6C", X"66", X"00", X"3C", X"66", X"60", X"3C", X"06", X"66", X"3C", X"00", + X"7E", X"18", X"18", X"18", X"18", X"18", X"18", X"00", X"66", X"66", X"66", X"66", X"66", X"66", X"3C", X"00", + X"66", X"66", X"66", X"66", X"66", X"3C", X"18", X"00", X"63", X"63", X"63", X"6B", X"7F", X"77", X"63", X"00", + X"66", X"66", X"3C", X"18", X"3C", X"66", X"66", X"00", X"66", X"66", X"66", X"3C", X"18", X"18", X"18", X"00", + X"7E", X"06", X"0C", X"18", X"30", X"60", X"7E", X"00", X"3C", X"30", X"30", X"30", X"30", X"30", X"3C", X"00", + X"0C", X"12", X"30", X"7C", X"30", X"62", X"FC", X"00", X"3C", X"0C", X"0C", X"0C", X"0C", X"0C", X"3C", X"00", + X"00", X"18", X"3C", X"7E", X"18", X"18", X"18", X"18", X"00", X"10", X"30", X"7F", X"7F", X"30", X"10", X"00", + X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"18", X"18", X"18", X"18", X"00", X"00", X"18", X"00", + X"66", X"66", X"66", X"00", X"00", X"00", X"00", X"00", X"66", X"66", X"FF", X"66", X"FF", X"66", X"66", X"00", + X"18", X"3E", X"60", X"3C", X"06", X"7C", X"18", X"00", X"62", X"66", X"0C", X"18", X"30", X"66", X"46", X"00", + X"3C", X"66", X"3C", X"38", X"67", X"66", X"3F", X"00", X"06", X"0C", X"18", X"00", X"00", X"00", X"00", X"00", + X"0C", X"18", X"30", X"30", X"30", X"18", X"0C", X"00", X"30", X"18", X"0C", X"0C", X"0C", X"18", X"30", X"00", + X"00", X"66", X"3C", X"FF", X"3C", X"66", X"00", X"00", X"00", X"18", X"18", X"7E", X"18", X"18", X"00", X"00", + X"00", X"00", X"00", X"00", X"00", X"18", X"18", X"30", X"00", X"00", X"00", X"7E", X"00", 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"03", X"06", X"0C", X"18", X"30", X"60", X"00", + X"3C", X"66", X"6E", X"76", X"66", X"66", X"3C", X"00", X"18", X"18", X"38", X"18", X"18", X"18", X"7E", X"00", + X"3C", X"66", X"06", X"0C", X"30", X"60", X"7E", X"00", X"3C", X"66", X"06", X"1C", X"06", X"66", X"3C", X"00", + X"06", X"0E", X"1E", X"66", X"7F", X"06", X"06", X"00", X"7E", X"60", X"7C", X"06", X"06", X"66", X"3C", X"00", + X"3C", X"66", X"60", X"7C", X"66", X"66", X"3C", X"00", X"7E", X"66", X"0C", X"18", X"18", X"18", X"18", X"00", + X"3C", X"66", X"66", X"3C", X"66", X"66", X"3C", X"00", X"3C", X"66", X"66", X"3E", X"06", X"66", X"3C", X"00", + X"00", X"00", X"18", X"00", X"00", X"18", X"00", X"00", X"00", X"00", X"18", X"00", X"00", X"18", X"18", X"30", + X"0E", X"18", X"30", X"60", X"30", X"18", X"0E", X"00", X"00", X"00", X"7E", X"00", X"7E", X"00", X"00", X"00", + X"70", X"18", X"0C", X"06", X"0C", X"18", X"70", X"00", X"3C", X"66", X"06", X"0C", X"18", X"00", X"18", X"00", + X"00", X"00", X"00", X"FF", X"FF", X"00", X"00", X"00", X"08", X"1C", X"3E", X"7F", X"7F", X"1C", X"3E", X"00", + X"18", X"18", X"18", X"18", X"18", X"18", X"18", X"18", X"00", X"00", X"00", X"FF", X"FF", X"00", X"00", X"00", + X"00", X"00", X"FF", X"FF", X"00", X"00", X"00", X"00", X"00", X"FF", X"FF", X"00", X"00", X"00", X"00", X"00", + X"00", X"00", X"00", X"00", X"FF", X"FF", X"00", X"00", X"30", X"30", X"30", X"30", X"30", X"30", X"30", X"30", + X"0C", X"0C", X"0C", X"0C", X"0C", X"0C", X"0C", X"0C", X"00", X"00", X"00", X"E0", X"F0", X"38", X"18", X"18", + X"18", X"18", X"1C", X"0F", X"07", X"00", X"00", X"00", X"18", X"18", X"38", X"F0", X"E0", X"00", X"00", X"00", + X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", X"FF", X"FF", X"C0", X"E0", X"70", X"38", X"1C", X"0E", X"07", X"03", + X"03", X"07", X"0E", X"1C", X"38", X"70", X"E0", X"C0", X"FF", X"FF", X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", + X"FF", X"FF", X"03", X"03", X"03", X"03", X"03", X"03", X"00", X"3C", X"7E", X"7E", X"7E", X"7E", X"3C", X"00", + X"00", X"00", X"00", X"00", X"00", X"FF", X"FF", X"00", X"36", X"7F", X"7F", X"7F", X"3E", X"1C", X"08", X"00", + X"60", X"60", X"60", X"60", X"60", X"60", X"60", X"60", X"00", X"00", X"00", X"07", X"0F", X"1C", X"18", X"18", + X"C3", X"E7", X"7E", X"3C", X"3C", X"7E", X"E7", X"C3", X"00", X"3C", X"7E", X"66", X"66", X"7E", X"3C", X"00", + X"18", X"18", X"66", X"66", X"18", X"18", X"3C", X"00", X"06", X"06", X"06", X"06", X"06", X"06", X"06", X"06", + X"08", X"1C", X"3E", X"7F", X"3E", X"1C", X"08", X"00", X"18", X"18", X"18", X"FF", X"FF", X"18", X"18", X"18", + X"C0", X"C0", X"30", X"30", X"C0", X"C0", X"30", X"30", X"18", X"18", X"18", X"18", X"18", X"18", X"18", X"18", + X"00", X"00", X"03", X"3E", X"76", X"36", X"36", X"00", X"FF", X"7F", X"3F", X"1F", X"0F", X"07", X"03", X"01", + X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"F0", X"F0", X"F0", X"F0", X"F0", X"F0", X"F0", X"F0", + X"00", X"00", X"00", X"00", X"FF", X"FF", X"FF", X"FF", X"FF", X"00", X"00", X"00", X"00", X"00", X"00", X"00", + X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"FF", X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", + X"CC", X"CC", X"33", X"33", X"CC", X"CC", X"33", X"33", X"03", X"03", X"03", X"03", X"03", X"03", X"03", X"03", + X"00", X"00", X"00", X"00", X"CC", X"CC", X"33", X"33", X"FF", X"FE", X"FC", X"F8", X"F0", X"E0", X"C0", X"80", + X"03", X"03", X"03", X"03", X"03", X"03", X"03", X"03", X"18", X"18", X"18", X"1F", X"1F", X"18", X"18", X"18", + X"00", X"00", X"00", X"00", X"0F", X"0F", X"0F", X"0F", X"18", X"18", X"18", X"1F", X"1F", X"00", X"00", X"00", + X"00", X"00", X"00", X"F8", X"F8", X"18", X"18", X"18", X"00", X"00", X"00", X"00", X"00", X"00", X"FF", X"FF", + X"00", X"00", X"00", X"1F", X"1F", X"18", X"18", X"18", X"18", X"18", X"18", X"FF", X"FF", X"00", X"00", X"00", + X"00", X"00", X"00", X"FF", X"FF", X"18", X"18", X"18", X"18", X"18", X"18", X"F8", X"F8", X"18", X"18", X"18", + X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", X"E0", X"E0", X"E0", X"E0", X"E0", X"E0", X"E0", X"E0", + X"07", X"07", X"07", X"07", X"07", X"07", X"07", X"07", X"FF", X"FF", X"00", X"00", X"00", X"00", X"00", X"00", + X"FF", X"FF", X"FF", X"00", 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"03", X"03", X"03", X"03", X"03", X"03", X"FF", X"FF", X"00", X"00", X"00", X"00", X"F0", X"F0", X"F0", X"F0", + X"0F", X"0F", X"0F", X"0F", X"00", X"00", X"00", X"00", X"18", X"18", X"18", X"F8", X"F8", X"00", X"00", X"00", + X"F0", X"F0", X"F0", X"F0", X"00", X"00", X"00", X"00", X"F0", X"F0", X"F0", X"F0", X"0F", X"0F", X"0F", X"0F", + X"C3", X"99", X"91", X"91", X"9F", X"99", X"C3", X"FF", X"E7", X"C3", X"99", X"81", X"99", X"99", X"99", X"FF", + X"83", X"99", X"99", X"83", X"99", X"99", X"83", X"FF", X"C3", X"99", X"9F", X"9F", X"9F", X"99", X"C3", X"FF", + X"87", X"93", X"99", X"99", X"99", X"93", X"87", X"FF", X"81", X"9F", X"9F", X"87", X"9F", X"9F", X"81", X"FF", + X"81", X"9F", X"9F", X"87", X"9F", X"9F", X"9F", X"FF", X"C3", X"99", X"9F", X"91", X"99", X"99", X"C3", X"FF", + X"99", X"99", X"99", X"81", X"99", X"99", X"99", X"FF", X"C3", X"E7", X"E7", X"E7", X"E7", X"E7", X"C3", X"FF", + X"E1", X"F3", X"F3", X"F3", X"F3", X"93", X"C7", X"FF", X"99", X"93", X"87", X"8F", X"87", X"93", X"99", X"FF", + X"9F", X"9F", X"9F", X"9F", X"9F", X"9F", X"81", X"FF", X"9C", X"88", X"80", X"94", X"9C", X"9C", X"9C", X"FF", + X"99", X"89", X"81", X"81", X"91", X"99", X"99", X"FF", X"C3", X"99", X"99", X"99", X"99", X"99", X"C3", X"FF", + X"83", X"99", X"99", X"83", X"9F", X"9F", X"9F", X"FF", X"C3", X"99", X"99", X"99", X"99", X"C3", X"F1", X"FF", + X"83", X"99", X"99", X"83", X"87", X"93", X"99", X"FF", X"C3", X"99", X"9F", X"C3", X"F9", X"99", X"C3", X"FF", + X"81", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"FF", X"99", X"99", X"99", X"99", X"99", X"99", X"C3", X"FF", + X"99", X"99", X"99", X"99", X"99", X"C3", X"E7", X"FF", X"9C", X"9C", X"9C", X"94", X"80", X"88", X"9C", X"FF", + X"99", X"99", X"C3", X"E7", X"C3", X"99", X"99", X"FF", X"99", X"99", X"99", X"C3", X"E7", X"E7", X"E7", X"FF", + X"81", X"F9", X"F3", X"E7", X"CF", X"9F", X"81", X"FF", X"C3", X"CF", X"CF", X"CF", X"CF", X"CF", X"C3", X"FF", + X"F3", X"ED", X"CF", X"83", X"CF", X"9D", X"03", X"FF", X"C3", X"F3", X"F3", X"F3", X"F3", X"F3", X"C3", X"FF", + X"FF", X"E7", X"C3", X"81", X"E7", X"E7", X"E7", X"E7", X"FF", X"EF", X"CF", X"80", X"80", X"CF", X"EF", X"FF", + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"E7", X"E7", X"E7", X"E7", X"FF", X"FF", X"E7", X"FF", + X"99", X"99", X"99", X"FF", X"FF", X"FF", X"FF", X"FF", X"99", X"99", X"00", X"99", X"00", X"99", X"99", X"FF", + X"E7", X"C1", X"9F", X"C3", X"F9", X"83", X"E7", X"FF", X"9D", X"99", X"F3", X"E7", X"CF", X"99", X"B9", X"FF", + X"C3", X"99", X"C3", X"C7", X"98", X"99", X"C0", X"FF", X"F9", X"F3", X"E7", X"FF", X"FF", X"FF", X"FF", X"FF", + X"F3", X"E7", X"CF", X"CF", X"CF", X"E7", X"F3", X"FF", X"CF", X"E7", X"F3", X"F3", X"F3", X"E7", X"CF", X"FF", + X"FF", X"99", X"C3", X"00", X"C3", X"99", X"FF", X"FF", X"FF", X"E7", X"E7", X"81", X"E7", X"E7", X"FF", X"FF", + X"FF", X"FF", X"FF", X"FF", X"FF", X"E7", X"E7", X"CF", X"FF", X"FF", X"FF", X"81", X"FF", X"FF", X"FF", X"FF", + X"FF", X"FF", X"FF", X"FF", X"FF", X"E7", X"E7", X"FF", X"FF", X"FC", X"F9", X"F3", X"E7", X"CF", X"9F", X"FF", + X"C3", X"99", X"91", X"89", X"99", X"99", X"C3", X"FF", X"E7", X"E7", X"C7", X"E7", X"E7", X"E7", X"81", X"FF", + X"C3", X"99", X"F9", X"F3", X"CF", X"9F", X"81", X"FF", X"C3", X"99", X"F9", X"E3", X"F9", X"99", X"C3", X"FF", + X"F9", X"F1", X"E1", X"99", X"80", X"F9", X"F9", X"FF", X"81", X"9F", X"83", X"F9", X"F9", X"99", X"C3", X"FF", + X"C3", X"99", X"9F", X"83", X"99", X"99", X"C3", X"FF", X"81", X"99", X"F3", X"E7", X"E7", X"E7", X"E7", X"FF", + X"C3", X"99", X"99", X"C3", X"99", X"99", X"C3", X"FF", X"C3", X"99", X"99", X"C1", X"F9", X"99", X"C3", X"FF", + X"FF", X"FF", X"E7", X"FF", X"FF", X"E7", X"FF", X"FF", X"FF", X"FF", X"E7", X"FF", X"FF", X"E7", X"E7", X"CF", + X"F1", X"E7", X"CF", X"9F", X"CF", X"E7", X"F1", X"FF", X"FF", X"FF", X"81", X"FF", X"81", X"FF", X"FF", X"FF", + X"8F", X"E7", X"F3", X"F9", X"F3", X"E7", X"8F", X"FF", X"C3", X"99", X"F9", X"F3", X"E7", X"FF", X"E7", X"FF", + X"FF", X"FF", X"FF", X"00", X"00", X"FF", X"FF", X"FF", X"F7", X"E3", X"C1", X"80", X"80", X"E3", X"C1", X"FF", + X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"FF", X"FF", X"FF", X"00", X"00", X"FF", X"FF", X"FF", + X"FF", X"FF", X"00", X"00", X"FF", X"FF", X"FF", X"FF", X"FF", X"00", X"00", X"FF", X"FF", X"FF", X"FF", X"FF", + X"FF", X"FF", X"FF", X"FF", X"00", X"00", X"FF", X"FF", X"CF", X"CF", X"CF", X"CF", X"CF", X"CF", X"CF", X"CF", + X"F3", X"F3", X"F3", X"F3", X"F3", X"F3", X"F3", X"F3", X"FF", X"FF", X"FF", X"1F", X"0F", X"C7", X"E7", X"E7", + X"E7", X"E7", X"E3", X"F0", X"F8", X"FF", X"FF", X"FF", X"E7", X"E7", X"C7", X"0F", X"1F", X"FF", X"FF", X"FF", + X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", X"00", X"00", X"3F", X"1F", X"8F", X"C7", X"E3", X"F1", X"F8", X"FC", + X"FC", X"F8", X"F1", X"E3", X"C7", X"8F", X"1F", X"3F", X"00", X"00", X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", + X"00", X"00", X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", X"FF", X"C3", X"81", X"81", X"81", X"81", X"C3", X"FF", + X"FF", X"FF", X"FF", X"FF", X"FF", X"00", X"00", X"FF", X"C9", X"80", X"80", X"80", X"C1", X"E3", X"F7", X"FF", + X"9F", X"9F", X"9F", X"9F", X"9F", X"9F", X"9F", X"9F", X"FF", X"FF", X"FF", X"F8", X"F0", X"E3", X"E7", X"E7", + X"3C", X"18", X"81", X"C3", X"C3", X"81", X"18", X"3C", X"FF", X"C3", X"81", X"99", X"99", X"81", X"C3", X"FF", + X"E7", X"E7", X"99", X"99", X"E7", X"E7", X"C3", X"FF", X"F9", X"F9", X"F9", X"F9", X"F9", X"F9", X"F9", X"F9", + X"F7", X"E3", X"C1", X"80", X"C1", X"E3", X"F7", X"FF", X"E7", X"E7", X"E7", X"00", X"00", X"E7", X"E7", X"E7", + X"3F", X"3F", X"CF", X"CF", X"3F", X"3F", X"CF", X"CF", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", + X"FF", X"FF", X"FC", X"C1", X"89", X"C9", X"C9", X"FF", X"00", X"80", X"C0", X"E0", X"F0", X"F8", X"FC", X"FE", + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"0F", X"0F", X"0F", X"0F", X"0F", X"0F", X"0F", X"0F", + X"FF", X"FF", X"FF", X"FF", 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"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"00", X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", + X"33", X"33", X"CC", X"CC", X"33", X"33", X"CC", X"CC", X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", + X"FF", X"FF", X"FF", X"FF", X"33", X"33", X"CC", X"CC", X"00", X"01", X"03", X"07", X"0F", X"1F", X"3F", X"7F", + X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", X"E7", X"E7", X"E7", X"E0", X"E0", X"E7", X"E7", X"E7", + X"FF", X"FF", X"FF", X"FF", X"F0", X"F0", X"F0", X"F0", X"E7", X"E7", X"E7", X"E0", X"E0", X"FF", X"FF", X"FF", + X"FF", X"FF", X"FF", X"07", X"07", X"E7", X"E7", X"E7", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"00", X"00", + X"FF", X"FF", X"FF", X"E0", X"E0", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"00", X"00", X"FF", X"FF", X"FF", + X"FF", X"FF", X"FF", X"00", X"00", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"07", X"07", X"E7", X"E7", X"E7", + X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", X"1F", X"1F", X"1F", X"1F", X"1F", X"1F", X"1F", X"1F", + X"F8", X"F8", X"F8", X"F8", X"F8", X"F8", X"F8", X"F8", X"00", X"00", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", + X"00", X"00", X"00", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"00", X"00", X"00", + X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", X"00", X"00", X"FF", X"FF", X"FF", X"FF", X"0F", X"0F", X"0F", X"0F", + X"F0", X"F0", X"F0", X"F0", X"FF", X"FF", X"FF", X"FF", X"E7", X"E7", X"E7", X"07", X"07", X"FF", X"FF", X"FF", + X"0F", X"0F", X"0F", X"0F", X"FF", X"FF", X"FF", X"FF", X"0F", X"0F", X"0F", X"0F", X"F0", X"F0", X"F0", X"F0", + X"3C", X"66", X"6E", X"6E", X"60", X"62", X"3C", X"00", X"00", X"00", X"3C", X"06", X"3E", X"66", X"3E", X"00", + X"00", X"60", X"60", X"7C", X"66", X"66", X"7C", X"00", X"00", X"00", X"3C", X"60", X"60", X"60", X"3C", X"00", + X"00", X"06", X"06", X"3E", X"66", X"66", X"3E", X"00", X"00", X"00", X"3C", X"66", X"7E", X"60", X"3C", X"00", + X"00", X"0E", X"18", X"3E", X"18", X"18", X"18", X"00", X"00", X"00", X"3E", X"66", X"66", X"3E", X"06", X"7C", + X"00", X"60", X"60", X"7C", X"66", X"66", X"66", X"00", X"00", X"18", X"00", X"38", X"18", X"18", X"3C", X"00", + X"00", X"06", X"00", X"06", X"06", X"06", X"06", X"3C", X"00", X"60", X"60", X"6C", X"78", X"6C", X"66", X"00", + X"00", X"38", X"18", X"18", X"18", X"18", X"3C", X"00", X"00", X"00", X"66", X"7F", X"7F", X"6B", X"63", X"00", + X"00", X"00", X"7C", X"66", X"66", X"66", X"66", X"00", X"00", X"00", X"3C", X"66", X"66", X"66", X"3C", X"00", + X"00", X"00", X"7C", X"66", X"66", X"7C", X"60", X"60", X"00", X"00", X"3E", X"66", X"66", X"3E", X"06", X"06", + X"00", X"00", X"7C", X"66", X"60", X"60", X"60", X"00", X"00", X"00", X"3E", X"60", X"3C", X"06", X"7C", X"00", + X"00", X"18", X"7E", X"18", X"18", X"18", X"0E", X"00", X"00", X"00", X"66", X"66", X"66", X"66", X"3E", X"00", + X"00", X"00", X"66", X"66", X"66", X"3C", X"18", X"00", X"00", X"00", X"63", X"6B", X"7F", X"3E", X"36", X"00", + X"00", X"00", X"66", X"3C", X"18", X"3C", X"66", X"00", X"00", X"00", X"66", X"66", X"66", X"3E", X"0C", X"78", + X"00", X"00", X"7E", X"0C", X"18", X"30", X"7E", X"00", X"3C", X"30", X"30", X"30", X"30", X"30", X"3C", X"00", + X"0C", X"12", X"30", X"7C", X"30", X"62", X"FC", X"00", X"3C", X"0C", X"0C", X"0C", X"0C", X"0C", X"3C", X"00", + X"00", X"18", X"3C", X"7E", X"18", X"18", X"18", X"18", X"00", X"10", X"30", X"7F", X"7F", X"30", X"10", X"00", + X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"18", X"18", X"18", X"18", X"00", X"00", X"18", X"00", + X"66", X"66", X"66", X"00", X"00", X"00", X"00", X"00", X"66", X"66", X"FF", X"66", X"FF", X"66", X"66", X"00", + X"18", X"3E", X"60", X"3C", X"06", X"7C", X"18", X"00", X"62", X"66", X"0C", X"18", X"30", X"66", X"46", X"00", + X"3C", X"66", X"3C", X"38", X"67", X"66", X"3F", X"00", X"06", X"0C", X"18", X"00", X"00", X"00", X"00", X"00", + X"0C", X"18", X"30", X"30", X"30", X"18", X"0C", X"00", X"30", X"18", X"0C", X"0C", X"0C", X"18", X"30", X"00", + X"00", X"66", X"3C", X"FF", X"3C", X"66", X"00", X"00", X"00", X"18", X"18", X"7E", X"18", X"18", X"00", X"00", + X"00", X"00", X"00", X"00", X"00", X"18", X"18", X"30", X"00", X"00", X"00", X"7E", X"00", 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"03", X"06", X"0C", X"18", X"30", X"60", X"00", + X"3C", X"66", X"6E", X"76", X"66", X"66", X"3C", X"00", X"18", X"18", X"38", X"18", X"18", X"18", X"7E", X"00", + X"3C", X"66", X"06", X"0C", X"30", X"60", X"7E", X"00", X"3C", X"66", X"06", X"1C", X"06", X"66", X"3C", X"00", + X"06", X"0E", X"1E", X"66", X"7F", X"06", X"06", X"00", X"7E", X"60", X"7C", X"06", X"06", X"66", X"3C", X"00", + X"3C", X"66", X"60", X"7C", X"66", X"66", X"3C", X"00", X"7E", X"66", X"0C", X"18", X"18", X"18", X"18", X"00", + X"3C", X"66", X"66", X"3C", X"66", X"66", X"3C", X"00", X"3C", X"66", X"66", X"3E", X"06", X"66", X"3C", X"00", + X"00", X"00", X"18", X"00", X"00", X"18", X"00", X"00", X"00", X"00", X"18", X"00", X"00", X"18", X"18", X"30", + X"0E", X"18", X"30", X"60", X"30", X"18", X"0E", X"00", X"00", X"00", X"7E", X"00", X"7E", X"00", X"00", X"00", + X"70", X"18", X"0C", X"06", X"0C", X"18", X"70", X"00", X"3C", X"66", X"06", X"0C", X"18", X"00", X"18", X"00", + X"00", X"00", X"00", X"FF", X"FF", X"00", X"00", X"00", X"18", X"3C", X"66", X"7E", X"66", X"66", X"66", X"00", + X"7C", X"66", X"66", X"7C", X"66", X"66", X"7C", X"00", X"3C", X"66", X"60", X"60", X"60", X"66", X"3C", X"00", + X"78", X"6C", X"66", X"66", X"66", X"6C", X"78", X"00", X"7E", X"60", X"60", X"78", X"60", X"60", X"7E", X"00", + X"7E", X"60", X"60", X"78", X"60", X"60", X"60", X"00", X"3C", X"66", X"60", X"6E", X"66", X"66", X"3C", X"00", + X"66", X"66", X"66", X"7E", X"66", X"66", X"66", X"00", X"3C", X"18", X"18", X"18", X"18", X"18", X"3C", X"00", + X"1E", X"0C", X"0C", X"0C", X"0C", X"6C", X"38", X"00", X"66", X"6C", X"78", X"70", X"78", X"6C", X"66", X"00", + X"60", X"60", X"60", X"60", X"60", X"60", X"7E", X"00", X"63", X"77", X"7F", X"6B", X"63", X"63", X"63", X"00", + X"66", X"76", X"7E", X"7E", X"6E", X"66", X"66", X"00", X"3C", X"66", X"66", X"66", X"66", X"66", X"3C", X"00", + X"7C", X"66", X"66", X"7C", X"60", X"60", X"60", X"00", X"3C", X"66", X"66", X"66", X"66", X"3C", X"0E", X"00", + X"7C", X"66", X"66", X"7C", X"78", X"6C", X"66", X"00", X"3C", X"66", X"60", X"3C", X"06", X"66", X"3C", X"00", + X"7E", X"18", X"18", X"18", X"18", X"18", X"18", X"00", X"66", X"66", X"66", X"66", X"66", X"66", X"3C", X"00", + X"66", X"66", X"66", X"66", X"66", X"3C", X"18", X"00", X"63", X"63", X"63", X"6B", X"7F", X"77", X"63", X"00", + X"66", X"66", X"3C", X"18", X"3C", X"66", X"66", X"00", X"66", X"66", X"66", X"3C", X"18", X"18", X"18", X"00", + X"7E", X"06", X"0C", X"18", X"30", X"60", X"7E", X"00", X"18", X"18", X"18", X"FF", X"FF", X"18", X"18", X"18", + X"C0", X"C0", X"30", X"30", X"C0", X"C0", X"30", X"30", X"18", X"18", X"18", X"18", X"18", X"18", X"18", X"18", + X"33", X"33", X"CC", X"CC", X"33", X"33", X"CC", X"CC", X"33", X"99", X"CC", X"66", X"33", X"99", X"CC", X"66", + X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"F0", X"F0", X"F0", X"F0", X"F0", X"F0", X"F0", X"F0", + X"00", X"00", X"00", X"00", X"FF", X"FF", X"FF", X"FF", X"FF", X"00", X"00", X"00", X"00", X"00", X"00", X"00", + X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"FF", X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", + X"CC", X"CC", X"33", X"33", X"CC", X"CC", X"33", X"33", X"03", X"03", X"03", X"03", X"03", X"03", X"03", X"03", + X"00", X"00", X"00", X"00", X"CC", X"CC", X"33", X"33", X"CC", X"99", X"33", X"66", X"CC", X"99", X"33", X"66", + X"03", X"03", X"03", X"03", X"03", X"03", X"03", X"03", X"18", X"18", X"18", X"1F", X"1F", X"18", X"18", X"18", + X"00", X"00", X"00", X"00", X"0F", X"0F", X"0F", X"0F", X"18", X"18", X"18", X"1F", X"1F", X"00", X"00", X"00", + X"00", X"00", X"00", X"F8", X"F8", X"18", X"18", X"18", X"00", X"00", X"00", X"00", X"00", X"00", X"FF", X"FF", + X"00", X"00", X"00", X"1F", X"1F", X"18", X"18", X"18", X"18", X"18", X"18", X"FF", X"FF", X"00", X"00", X"00", + X"00", X"00", X"00", X"FF", X"FF", X"18", X"18", X"18", X"18", X"18", X"18", X"F8", X"F8", X"18", X"18", X"18", + X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", X"C0", X"E0", X"E0", X"E0", X"E0", X"E0", X"E0", X"E0", X"E0", + X"07", X"07", X"07", X"07", X"07", X"07", X"07", X"07", X"FF", X"FF", X"00", X"00", X"00", X"00", X"00", X"00", + X"FF", X"FF", X"FF", X"00", 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"01", X"03", X"06", X"6C", X"78", X"70", X"60", X"00", X"00", X"00", X"00", X"00", X"F0", X"F0", X"F0", X"F0", + X"0F", X"0F", X"0F", X"0F", X"00", X"00", X"00", X"00", X"18", X"18", X"18", X"F8", X"F8", X"00", X"00", X"00", + X"F0", X"F0", X"F0", X"F0", X"00", X"00", X"00", X"00", X"F0", X"F0", X"F0", X"F0", X"0F", X"0F", X"0F", X"0F", + X"C3", X"99", X"91", X"91", X"9F", X"99", X"C3", X"FF", X"FF", X"FF", X"C3", X"F9", X"C1", X"99", X"C1", X"FF", + X"FF", X"9F", X"9F", X"83", X"99", X"99", X"83", X"FF", X"FF", X"FF", X"C3", X"9F", X"9F", X"9F", X"C3", X"FF", + X"FF", X"F9", X"F9", X"C1", X"99", X"99", X"C1", X"FF", X"FF", X"FF", X"C3", X"99", X"81", X"9F", X"C3", X"FF", + X"FF", X"F1", X"E7", X"C1", X"E7", X"E7", X"E7", X"FF", X"FF", X"FF", X"C1", X"99", X"99", X"C1", X"F9", X"83", + X"FF", X"9F", X"9F", X"83", X"99", X"99", X"99", X"FF", X"FF", X"E7", X"FF", X"C7", X"E7", X"E7", X"C3", X"FF", + X"FF", X"F9", X"FF", X"F9", X"F9", X"F9", X"F9", X"C3", X"FF", X"9F", X"9F", X"93", X"87", X"93", X"99", X"FF", + X"FF", X"C7", X"E7", X"E7", X"E7", X"E7", X"C3", X"FF", X"FF", X"FF", X"99", X"80", X"80", X"94", X"9C", X"FF", + X"FF", X"FF", X"83", X"99", X"99", X"99", X"99", X"FF", X"FF", X"FF", X"C3", X"99", X"99", X"99", X"C3", X"FF", + X"FF", X"FF", X"83", X"99", X"99", X"83", X"9F", X"9F", X"FF", X"FF", X"C1", X"99", X"99", X"C1", X"F9", X"F9", + X"FF", X"FF", X"83", X"99", X"9F", X"9F", X"9F", X"FF", X"FF", X"FF", X"C1", X"9F", X"C3", X"F9", X"83", X"FF", + X"FF", X"E7", X"81", X"E7", X"E7", X"E7", X"F1", X"FF", X"FF", X"FF", X"99", X"99", X"99", X"99", X"C1", X"FF", + X"FF", X"FF", X"99", X"99", X"99", X"C3", X"E7", X"FF", X"FF", X"FF", X"9C", X"94", X"80", X"C1", X"C9", X"FF", + X"FF", X"FF", X"99", X"C3", X"E7", X"C3", X"99", X"FF", X"FF", X"FF", X"99", X"99", X"99", X"C1", X"F3", X"87", + X"FF", X"FF", X"81", X"F3", X"E7", X"CF", X"81", X"FF", X"C3", X"CF", X"CF", X"CF", X"CF", X"CF", X"C3", X"FF", + X"F3", X"ED", X"CF", X"83", X"CF", X"9D", X"03", X"FF", X"C3", X"F3", X"F3", X"F3", X"F3", X"F3", X"C3", X"FF", + X"FF", X"E7", X"C3", X"81", X"E7", X"E7", X"E7", X"E7", X"FF", X"EF", X"CF", X"80", X"80", X"CF", X"EF", X"FF", + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"E7", X"E7", X"E7", X"E7", X"FF", X"FF", X"E7", X"FF", + X"99", X"99", X"99", X"FF", X"FF", X"FF", X"FF", X"FF", X"99", X"99", X"00", X"99", X"00", X"99", X"99", X"FF", + X"E7", X"C1", X"9F", X"C3", X"F9", X"83", X"E7", X"FF", X"9D", X"99", X"F3", X"E7", X"CF", X"99", X"B9", X"FF", + X"C3", X"99", X"C3", X"C7", X"98", X"99", X"C0", X"FF", X"F9", X"F3", X"E7", X"FF", X"FF", X"FF", X"FF", X"FF", + X"F3", X"E7", X"CF", X"CF", X"CF", X"E7", X"F3", X"FF", X"CF", X"E7", X"F3", X"F3", X"F3", X"E7", X"CF", X"FF", + X"FF", X"99", X"C3", X"00", X"C3", X"99", X"FF", X"FF", X"FF", X"E7", X"E7", X"81", X"E7", X"E7", X"FF", X"FF", + X"FF", X"FF", X"FF", X"FF", X"FF", X"E7", X"E7", X"CF", X"FF", X"FF", X"FF", X"81", X"FF", X"FF", X"FF", X"FF", + X"FF", X"FF", X"FF", X"FF", X"FF", X"E7", X"E7", X"FF", X"FF", X"FC", X"F9", X"F3", X"E7", X"CF", X"9F", X"FF", + X"C3", X"99", X"91", X"89", X"99", X"99", X"C3", X"FF", X"E7", X"E7", X"C7", X"E7", X"E7", X"E7", X"81", X"FF", + X"C3", X"99", X"F9", X"F3", X"CF", X"9F", X"81", X"FF", X"C3", X"99", X"F9", X"E3", X"F9", X"99", X"C3", X"FF", + X"F9", X"F1", X"E1", X"99", X"80", X"F9", X"F9", X"FF", X"81", X"9F", X"83", X"F9", X"F9", X"99", X"C3", X"FF", + X"C3", X"99", X"9F", X"83", X"99", X"99", X"C3", X"FF", X"81", X"99", X"F3", X"E7", X"E7", X"E7", X"E7", X"FF", + X"C3", X"99", X"99", X"C3", X"99", X"99", X"C3", X"FF", X"C3", X"99", X"99", X"C1", X"F9", X"99", X"C3", X"FF", + X"FF", X"FF", X"E7", X"FF", X"FF", X"E7", X"FF", X"FF", X"FF", X"FF", X"E7", X"FF", X"FF", X"E7", X"E7", X"CF", + X"F1", X"E7", X"CF", X"9F", X"CF", X"E7", X"F1", X"FF", X"FF", X"FF", X"81", X"FF", X"81", X"FF", X"FF", X"FF", + X"8F", X"E7", X"F3", X"F9", X"F3", X"E7", X"8F", X"FF", X"C3", X"99", X"F9", X"F3", X"E7", X"FF", X"E7", X"FF", + X"FF", X"FF", X"FF", X"00", X"00", X"FF", X"FF", X"FF", X"E7", X"C3", X"99", X"81", X"99", X"99", X"99", X"FF", + X"83", X"99", X"99", X"83", X"99", X"99", X"83", X"FF", X"C3", X"99", X"9F", X"9F", X"9F", X"99", X"C3", X"FF", + X"87", X"93", X"99", X"99", X"99", X"93", X"87", X"FF", X"81", X"9F", X"9F", X"87", X"9F", X"9F", X"81", X"FF", + X"81", X"9F", X"9F", X"87", X"9F", X"9F", X"9F", X"FF", X"C3", X"99", X"9F", X"91", X"99", X"99", X"C3", X"FF", + X"99", X"99", X"99", X"81", X"99", X"99", X"99", X"FF", X"C3", X"E7", X"E7", X"E7", X"E7", X"E7", X"C3", X"FF", + X"E1", X"F3", X"F3", X"F3", X"F3", X"93", X"C7", X"FF", X"99", X"93", X"87", X"8F", X"87", X"93", X"99", X"FF", + X"9F", X"9F", X"9F", X"9F", X"9F", X"9F", X"81", X"FF", X"9C", X"88", X"80", X"94", X"9C", X"9C", X"9C", X"FF", + X"99", X"89", X"81", X"81", X"91", X"99", X"99", X"FF", X"C3", X"99", X"99", X"99", X"99", X"99", X"C3", X"FF", + X"83", X"99", X"99", X"83", X"9F", X"9F", X"9F", X"FF", X"C3", X"99", X"99", X"99", X"99", X"C3", X"F1", X"FF", + X"83", X"99", X"99", X"83", X"87", X"93", X"99", X"FF", X"C3", X"99", X"9F", X"C3", X"F9", X"99", X"C3", X"FF", + X"81", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"FF", X"99", X"99", X"99", X"99", X"99", X"99", X"C3", X"FF", + X"99", X"99", X"99", X"99", X"99", X"C3", X"E7", X"FF", X"9C", X"9C", X"9C", X"94", X"80", X"88", X"9C", X"FF", + X"99", X"99", X"C3", X"E7", X"C3", X"99", X"99", X"FF", X"99", X"99", X"99", X"C3", X"E7", X"E7", X"E7", X"FF", + X"81", X"F9", X"F3", X"E7", X"CF", X"9F", X"81", X"FF", X"E7", X"E7", X"E7", X"00", X"00", X"E7", X"E7", X"E7", + X"3F", X"3F", X"CF", X"CF", X"3F", X"3F", X"CF", X"CF", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", + X"CC", X"CC", X"33", X"33", X"CC", X"CC", X"33", X"33", X"CC", X"66", X"33", X"99", X"CC", X"66", X"33", X"99", + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"0F", X"0F", X"0F", X"0F", X"0F", X"0F", X"0F", X"0F", + X"FF", X"FF", X"FF", X"FF", 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"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"00", X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", + X"33", X"33", X"CC", X"CC", X"33", X"33", X"CC", X"CC", X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", + X"FF", X"FF", X"FF", X"FF", X"33", X"33", X"CC", X"CC", X"33", X"66", X"CC", X"99", X"33", X"66", X"CC", X"99", + X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", X"FC", X"E7", X"E7", X"E7", X"E0", X"E0", X"E7", X"E7", X"E7", + X"FF", X"FF", X"FF", X"FF", X"F0", X"F0", X"F0", X"F0", X"E7", X"E7", X"E7", X"E0", X"E0", X"FF", X"FF", X"FF", + X"FF", X"FF", X"FF", X"07", X"07", X"E7", X"E7", X"E7", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"00", X"00", + X"FF", X"FF", X"FF", X"E0", X"E0", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"00", X"00", X"FF", X"FF", X"FF", + X"FF", X"FF", X"FF", X"00", X"00", X"E7", X"E7", X"E7", X"E7", X"E7", X"E7", X"07", X"07", X"E7", X"E7", X"E7", + X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", X"3F", X"1F", X"1F", X"1F", X"1F", X"1F", X"1F", X"1F", X"1F", + X"F8", X"F8", X"F8", X"F8", X"F8", X"F8", X"F8", X"F8", X"00", X"00", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", + X"00", X"00", X"00", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"00", X"00", X"00", + X"FE", X"FC", X"F9", X"93", X"87", X"8F", X"9F", X"FF", X"FF", X"FF", X"FF", X"FF", X"0F", X"0F", X"0F", X"0F", + X"F0", X"F0", X"F0", X"F0", X"FF", X"FF", X"FF", X"FF", X"E7", X"E7", X"E7", X"07", X"07", X"FF", X"FF", X"FF", + X"0F", X"0F", X"0F", X"0F", X"FF", X"FF", X"FF", X"FF", X"0F", X"0F", X"0F", X"0F", X"F0", X"F0", X"F0", X"F0" + ); + +begin + + process(clk) + begin + if rising_edge(clk) then + do <= romData(to_integer(addr(11 downto 0))) after 2 ns; + end if; + end process; + +end architecture; \ No newline at end of file diff --git a/Commodore - 64_Mist/rtl/roms/std_C1541.mif b/Commodore - 64_Mist/rtl/roms/std_C1541.mif new file mode 100644 index 00000000..d0d3cf05 --- /dev/null +++ b/Commodore - 64_Mist/rtl/roms/std_C1541.mif @@ -0,0 +1,15762 @@ +-- Copyright (C) 1991-2014 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 generated Memory Initialization File (.mif) + +WIDTH=8; +DEPTH=16384; + +ADDRESS_RADIX=HEX; +DATA_RADIX=HEX; + +CONTENT BEGIN + 0000 : 97; + [0001..00FF] : AA; + 0100 : 78; + 0101 : A9; + 0102 : F7; + 0103 : 2D; + 0104 : 00; + 0105 : 1C; + 0106 : 48; + 0107 : A5; + 0108 : 7F; + 0109 : F0; + 010A : 05; + 010B : 68; + 010C : 09; + 010D : 00; + 010E : D0; + 010F : 03; + 0110 : 68; + 0111 : 09; + 0112 : 08; + 0113 : 8D; + 0114 : 00; + 0115 : 1C; + 0116 : 58; + 0117 : 60; + 0118 : 78; + 0119 : A9; + 011A : 08; + 011B : 0D; + 011C : 00; + 011D : 1C; + 011E : 8D; + 011F : 00; + 0120 : 1C; + 0121 : 58; + 0122 : 60; + 0123 : A9; + 0124 : 00; + 0125 : 8D; + 0126 : 6C; + 0127 : 02; + 0128 : 8D; + 0129 : 6D; + 012A : 02; + 012B : 60; + 012C : 78; + 012D : 8A; + 012E : 48; + 012F : A9; + 0130 : 50; + 0131 : 8D; + 0132 : 6C; + 0133 : 02; + 0134 : A2; + 0135 : 00; + 0136 : BD; + 0137 : CA; + 0138 : FE; + 0139 : 8D; + 013A : 6D; + 013B : 02; + 013C : 0D; + 013D : 00; + 013E : 1C; + 013F : 8D; + 0140 : 00; + 0141 : 1C; + 0142 : 68; + 0143 : AA; + 0144 : 58; + 0145 : 60; + 0146 : A9; + 0147 : 00; + 0148 : 8D; + 0149 : F9; + 014A : 02; + 014B : AD; + 014C : 8E; + 014D : 02; + 014E : 85; + 014F : 7F; + 0150 : 20; + 0151 : BC; + 0152 : E6; + 0153 : A5; + 0154 : 84; + 0155 : 10; + 0156 : 09; + 0157 : 29; + 0158 : 0F; + 0159 : C9; + 015A : 0F; + 015B : F0; + 015C : 03; + 015D : 4C; + 015E : B4; + 015F : D7; + 0160 : 20; + 0161 : B3; + 0162 : C2; + 0163 : B1; + 0164 : A3; + 0165 : 8D; + 0166 : 75; + 0167 : 02; + 0168 : A2; + 0169 : 0B; + 016A : BD; + 016B : 89; + 016C : FE; + 016D : CD; + 016E : 75; + 016F : 02; + 0170 : F0; + 0171 : 08; + 0172 : CA; + 0173 : 10; + 0174 : F5; + 0175 : A9; + 0176 : 31; + 0177 : 4C; + 0178 : C8; + 0179 : C1; + 017A : 8E; + 017B : 2A; + 017C : 02; + 017D : E0; + 017E : 09; + 017F : 90; + 0180 : 03; + 0181 : 20; + 0182 : EE; + 0183 : C1; + 0184 : AE; + 0185 : 2A; + 0186 : 02; + 0187 : BD; + 0188 : 95; + 0189 : FE; + 018A : 85; + 018B : 6F; + 018C : BD; + 018D : A1; + 018E : FE; + 018F : 85; + 0190 : 70; + 0191 : 6C; + 0192 : 6F; + 0193 : 00; + 0194 : A9; + 0195 : 00; + 0196 : 8D; + 0197 : F9; + 0198 : 02; + 0199 : AD; + 019A : 6C; + 019B : 02; + 019C : D0; + 019D : 2A; + 019E : A0; + 019F : 00; + 01A0 : 98; + 01A1 : 84; + 01A2 : 80; + 01A3 : 84; + 01A4 : 81; + 01A5 : 84; + 01A6 : A3; + 01A7 : 20; + 01A8 : C7; + 01A9 : E6; + 01AA : 20; + 01AB : 23; + 01AC : C1; + 01AD : A5; + 01AE : 7F; + 01AF : 8D; + 01B0 : 8E; + 01B1 : 02; + 01B2 : AA; + 01B3 : A9; + 01B4 : 00; + 01B5 : 95; + 01B6 : FF; + 01B7 : 20; + 01B8 : BD; + 01B9 : C1; + 01BA : 4C; + 01BB : DA; + 01BC : D4; + 01BD : A0; + 01BE : 28; + 01BF : A9; + 01C0 : 00; + 01C1 : 99; + 01C2 : 00; + 01C3 : 02; + 01C4 : 88; + 01C5 : 10; + 01C6 : FA; + 01C7 : 60; + 01C8 : A0; + 01C9 : 00; + 01CA : 84; + 01CB : 80; + 01CC : 84; + 01CD : 81; + 01CE : 4C; + 01CF : 45; + 01D0 : E6; + 01D1 : A2; + 01D2 : 00; + 01D3 : 8E; + 01D4 : 7A; + 01D5 : 02; + 01D6 : A9; + 01D7 : 3A; + 01D8 : 20; + 01D9 : 68; + 01DA : C2; + 01DB : F0; + 01DC : 05; + [01DD..01DE] : 88; + 01DF : 8C; + 01E0 : 7A; + 01E1 : 02; + 01E2 : 4C; + 01E3 : 68; + 01E4 : C3; + 01E5 : A0; + 01E6 : 00; + 01E7 : A2; + 01E8 : 00; + 01E9 : A9; + 01EA : 3A; + 01EB : 4C; + 01EC : 68; + 01ED : C2; + 01EE : 20; + 01EF : E5; + 01F0 : C1; + 01F1 : D0; + 01F2 : 05; + 01F3 : A9; + 01F4 : 34; + 01F5 : 4C; + 01F6 : C8; + 01F7 : C1; + [01F8..01F9] : 88; + 01FA : 8C; + 01FB : 7A; + 01FC : 02; + 01FD : 8A; + 01FE : D0; + 01FF : F3; + 0200 : A9; + 0201 : 3D; + 0202 : 20; + 0203 : 68; + 0204 : C2; + 0205 : 8A; + 0206 : F0; + 0207 : 02; + 0208 : A9; + 0209 : 40; + 020A : 09; + 020B : 21; + 020C : 8D; + 020D : 8B; + 020E : 02; + 020F : E8; + 0210 : 8E; + 0211 : 77; + 0212 : 02; + 0213 : 8E; + 0214 : 78; + 0215 : 02; + 0216 : AD; + 0217 : 8A; + 0218 : 02; + 0219 : F0; + 021A : 0D; + 021B : A9; + 021C : 80; + 021D : 0D; + 021E : 8B; + 021F : 02; + 0220 : 8D; + 0221 : 8B; + 0222 : 02; + 0223 : A9; + 0224 : 00; + 0225 : 8D; + 0226 : 8A; + 0227 : 02; + 0228 : 98; + 0229 : F0; + 022A : 29; + 022B : 9D; + 022C : 7A; + 022D : 02; + 022E : AD; + 022F : 77; + 0230 : 02; + 0231 : 8D; + 0232 : 79; + 0233 : 02; + 0234 : A9; + 0235 : 8D; + 0236 : 20; + 0237 : 68; + 0238 : C2; + 0239 : E8; + 023A : 8E; + 023B : 78; + 023C : 02; + 023D : CA; + 023E : AD; + 023F : 8A; + 0240 : 02; + 0241 : F0; + 0242 : 02; + 0243 : A9; + 0244 : 08; + 0245 : EC; + 0246 : 77; + 0247 : 02; + 0248 : F0; + 0249 : 02; + 024A : 09; + 024B : 04; + 024C : 09; + 024D : 03; + 024E : 4D; + 024F : 8B; + 0250 : 02; + 0251 : 8D; + 0252 : 8B; + 0253 : 02; + 0254 : AD; + 0255 : 8B; + 0256 : 02; + 0257 : AE; + 0258 : 2A; + 0259 : 02; + 025A : 3D; + 025B : A5; + 025C : FE; + 025D : D0; + 025E : 01; + 025F : 60; + 0260 : 8D; + 0261 : 6C; + 0262 : 02; + 0263 : A9; + 0264 : 30; + 0265 : 4C; + 0266 : C8; + 0267 : C1; + 0268 : 8D; + 0269 : 75; + 026A : 02; + 026B : CC; + 026C : 74; + 026D : 02; + 026E : B0; + 026F : 2E; + 0270 : B1; + 0271 : A3; + 0272 : C8; + 0273 : CD; + 0274 : 75; + 0275 : 02; + 0276 : F0; + 0277 : 28; + 0278 : C9; + 0279 : 2A; + 027A : F0; + 027B : 04; + 027C : C9; + 027D : 3F; + 027E : D0; + 027F : 03; + 0280 : EE; + 0281 : 8A; + 0282 : 02; + 0283 : C9; + 0284 : 2C; + 0285 : D0; + 0286 : E4; + 0287 : 98; + 0288 : 9D; + 0289 : 7B; + 028A : 02; + 028B : AD; + 028C : 8A; + 028D : 02; + 028E : 29; + 028F : 7F; + 0290 : F0; + 0291 : 07; + 0292 : A9; + 0293 : 80; + 0294 : 95; + 0295 : E7; + 0296 : 8D; + 0297 : 8A; + 0298 : 02; + 0299 : E8; + 029A : E0; + 029B : 04; + 029C : 90; + 029D : CD; + 029E : A0; + 029F : 00; + 02A0 : AD; + 02A1 : 74; + 02A2 : 02; + 02A3 : 9D; + 02A4 : 7B; + 02A5 : 02; + 02A6 : AD; + 02A7 : 8A; + 02A8 : 02; + 02A9 : 29; + 02AA : 7F; + 02AB : F0; + 02AC : 04; + 02AD : A9; + 02AE : 80; + 02AF : 95; + 02B0 : E7; + 02B1 : 98; + 02B2 : 60; + 02B3 : A4; + 02B4 : A3; + 02B5 : F0; + 02B6 : 14; + 02B7 : 88; + 02B8 : F0; + 02B9 : 10; + 02BA : B9; + 02BB : 00; + 02BC : 02; + 02BD : C9; + 02BE : 0D; + 02BF : F0; + 02C0 : 0A; + 02C1 : 88; + 02C2 : B9; + 02C3 : 00; + 02C4 : 02; + 02C5 : C9; + 02C6 : 0D; + 02C7 : F0; + 02C8 : 02; + [02C9..02CA] : C8; + 02CB : 8C; + 02CC : 74; + 02CD : 02; + 02CE : C0; + 02CF : 2A; + 02D0 : A0; + 02D1 : FF; + 02D2 : 90; + 02D3 : 08; + 02D4 : 8C; + 02D5 : 2A; + 02D6 : 02; + 02D7 : A9; + 02D8 : 32; + 02D9 : 4C; + 02DA : C8; + 02DB : C1; + 02DC : A0; + 02DD : 00; + 02DE : 98; + 02DF : 85; + 02E0 : A3; + 02E1 : 8D; + 02E2 : 58; + 02E3 : 02; + 02E4 : 8D; + 02E5 : 4A; + 02E6 : 02; + 02E7 : 8D; + 02E8 : 96; + 02E9 : 02; + 02EA : 85; + 02EB : D3; + 02EC : 8D; + 02ED : 79; + 02EE : 02; + 02EF : 8D; + 02F0 : 77; + 02F1 : 02; + 02F2 : 8D; + 02F3 : 78; + 02F4 : 02; + 02F5 : 8D; + 02F6 : 8A; + 02F7 : 02; + 02F8 : 8D; + 02F9 : 6C; + 02FA : 02; + 02FB : A2; + 02FC : 05; + 02FD : 9D; + 02FE : 79; + 02FF : 02; + 0300 : 95; + 0301 : D7; + 0302 : 95; + 0303 : DC; + 0304 : 95; + 0305 : E1; + 0306 : 95; + 0307 : E6; + 0308 : 9D; + 0309 : 7F; + 030A : 02; + 030B : 9D; + 030C : 84; + 030D : 02; + 030E : CA; + 030F : D0; + 0310 : EC; + 0311 : 60; + 0312 : AD; + 0313 : 78; + 0314 : 02; + 0315 : 8D; + 0316 : 77; + 0317 : 02; + 0318 : A9; + 0319 : 01; + 031A : 8D; + 031B : 78; + 031C : 02; + 031D : 8D; + 031E : 79; + 031F : 02; + 0320 : AC; + 0321 : 8E; + 0322 : 02; + 0323 : A2; + 0324 : 00; + 0325 : 86; + 0326 : D3; + 0327 : BD; + 0328 : 7A; + 0329 : 02; + 032A : 20; + 032B : 3C; + 032C : C3; + 032D : A6; + 032E : D3; + 032F : 9D; + 0330 : 7A; + 0331 : 02; + 0332 : 98; + 0333 : 95; + 0334 : E2; + 0335 : E8; + 0336 : EC; + 0337 : 78; + 0338 : 02; + 0339 : 90; + 033A : EA; + 033B : 60; + 033C : AA; + 033D : A0; + 033E : 00; + 033F : A9; + 0340 : 3A; + 0341 : DD; + 0342 : 01; + 0343 : 02; + 0344 : F0; + 0345 : 0C; + 0346 : DD; + 0347 : 00; + 0348 : 02; + 0349 : D0; + 034A : 16; + 034B : E8; + 034C : 98; + 034D : 29; + 034E : 01; + 034F : A8; + 0350 : 8A; + 0351 : 60; + 0352 : BD; + 0353 : 00; + 0354 : 02; + [0355..0356] : E8; + 0357 : C9; + 0358 : 30; + 0359 : F0; + 035A : F2; + 035B : C9; + 035C : 31; + 035D : F0; + 035E : EE; + 035F : D0; + 0360 : EB; + 0361 : 98; + 0362 : 09; + 0363 : 80; + 0364 : 29; + 0365 : 81; + 0366 : D0; + 0367 : E7; + 0368 : A9; + 0369 : 00; + 036A : 8D; + 036B : 8B; + 036C : 02; + 036D : AC; + 036E : 7A; + 036F : 02; + 0370 : B1; + 0371 : A3; + 0372 : 20; + 0373 : BD; + 0374 : C3; + 0375 : 10; + 0376 : 11; + 0377 : C8; + 0378 : CC; + 0379 : 74; + 037A : 02; + 037B : B0; + 037C : 06; + 037D : AC; + 037E : 74; + 037F : 02; + 0380 : 88; + 0381 : D0; + 0382 : ED; + 0383 : CE; + 0384 : 8B; + 0385 : 02; + 0386 : A9; + 0387 : 00; + 0388 : 29; + 0389 : 01; + 038A : 85; + 038B : 7F; + 038C : 4C; + 038D : 00; + 038E : C1; + 038F : A5; + 0390 : 7F; + 0391 : 49; + 0392 : 01; + 0393 : 29; + 0394 : 01; + 0395 : 85; + 0396 : 7F; + 0397 : 60; + 0398 : A0; + 0399 : 00; + 039A : AD; + 039B : 77; + 039C : 02; + 039D : CD; + 039E : 78; + 039F : 02; + 03A0 : F0; + 03A1 : 16; + 03A2 : CE; + 03A3 : 78; + 03A4 : 02; + 03A5 : AC; + 03A6 : 78; + 03A7 : 02; + 03A8 : B9; + 03A9 : 7A; + 03AA : 02; + 03AB : A8; + 03AC : B1; + 03AD : A3; + 03AE : A0; + 03AF : 04; + 03B0 : D9; + 03B1 : BB; + 03B2 : FE; + 03B3 : F0; + 03B4 : 03; + 03B5 : 88; + 03B6 : D0; + 03B7 : F8; + 03B8 : 98; + 03B9 : 8D; + 03BA : 96; + 03BB : 02; + 03BC : 60; + 03BD : C9; + 03BE : 30; + 03BF : F0; + 03C0 : 06; + 03C1 : C9; + 03C2 : 31; + 03C3 : F0; + 03C4 : 02; + 03C5 : 09; + 03C6 : 80; + 03C7 : 29; + 03C8 : 81; + 03C9 : 60; + 03CA : A9; + 03CB : 00; + 03CC : 85; + 03CD : 6F; + [03CE..03CF] : 8D; + 03D0 : 02; + 03D1 : 48; + 03D2 : AE; + 03D3 : 78; + 03D4 : 02; + 03D5 : 68; + 03D6 : 05; + 03D7 : 6F; + 03D8 : 48; + 03D9 : A9; + 03DA : 01; + 03DB : 85; + 03DC : 6F; + 03DD : CA; + 03DE : 30; + 03DF : 0F; + 03E0 : B5; + 03E1 : E2; + 03E2 : 10; + 03E3 : 04; + 03E4 : 06; + 03E5 : 6F; + 03E6 : 06; + 03E7 : 6F; + 03E8 : 4A; + 03E9 : 90; + 03EA : EA; + 03EB : 06; + 03EC : 6F; + 03ED : D0; + 03EE : E6; + 03EF : 68; + 03F0 : AA; + 03F1 : BD; + 03F2 : 3F; + 03F3 : C4; + 03F4 : 48; + 03F5 : 29; + 03F6 : 03; + 03F7 : 8D; + 03F8 : 8C; + 03F9 : 02; + 03FA : 68; + 03FB : 0A; + 03FC : 10; + 03FD : 3E; + 03FE : A5; + 03FF : E2; + 0400 : 29; + 0401 : 01; + 0402 : 85; + 0403 : 7F; + 0404 : AD; + 0405 : 8C; + 0406 : 02; + 0407 : F0; + 0408 : 2B; + 0409 : 20; + 040A : 3D; + 040B : C6; + 040C : F0; + 040D : 12; + 040E : 20; + 040F : 8F; + 0410 : C3; + 0411 : A9; + 0412 : 00; + 0413 : 8D; + 0414 : 8C; + 0415 : 02; + 0416 : 20; + 0417 : 3D; + 0418 : C6; + 0419 : F0; + 041A : 1E; + 041B : A9; + 041C : 74; + 041D : 20; + 041E : C8; + 041F : C1; + 0420 : 20; + 0421 : 8F; + 0422 : C3; + 0423 : 20; + 0424 : 3D; + 0425 : C6; + 0426 : 08; + 0427 : 20; + 0428 : 8F; + 0429 : C3; + 042A : 28; + 042B : F0; + 042C : 0C; + 042D : A9; + 042E : 00; + 042F : 8D; + 0430 : 8C; + 0431 : 02; + 0432 : F0; + 0433 : 05; + 0434 : 20; + 0435 : 3D; + 0436 : C6; + 0437 : D0; + 0438 : E2; + 0439 : 4C; + 043A : 00; + 043B : C1; + 043C : 2A; + 043D : 4C; + 043E : 00; + 043F : C4; + 0440 : 00; + 0441 : 80; + 0442 : 41; + [0443..0446] : 01; + [0447..044A] : 81; + [044B..044E] : 42; + 044F : 20; + 0450 : CA; + 0451 : C3; + 0452 : A9; + 0453 : 00; + 0454 : 8D; + 0455 : 92; + 0456 : 02; + 0457 : 20; + 0458 : AC; + 0459 : C5; + 045A : D0; + 045B : 19; + 045C : CE; + 045D : 8C; + 045E : 02; + 045F : 10; + 0460 : 01; + 0461 : 60; + 0462 : A9; + 0463 : 01; + [0464..0465] : 8D; + 0466 : 02; + 0467 : 20; + 0468 : 8F; + 0469 : C3; + 046A : 20; + 046B : 00; + 046C : C1; + 046D : 4C; + 046E : 52; + 046F : C4; + 0470 : 20; + 0471 : 17; + 0472 : C6; + 0473 : F0; + 0474 : 10; + 0475 : 20; + 0476 : D8; + 0477 : C4; + 0478 : AD; + 0479 : 8F; + 047A : 02; + 047B : F0; + 047C : 01; + 047D : 60; + 047E : AD; + 047F : 53; + 0480 : 02; + 0481 : 30; + 0482 : ED; + 0483 : 10; + 0484 : F0; + 0485 : AD; + 0486 : 8F; + 0487 : 02; + 0488 : F0; + 0489 : D2; + 048A : 60; + 048B : 20; + 048C : 04; + 048D : C6; + 048E : F0; + 048F : 1A; + 0490 : D0; + 0491 : 28; + 0492 : A9; + 0493 : 01; + [0494..0495] : 8D; + 0496 : 02; + 0497 : 20; + 0498 : 8F; + 0499 : C3; + 049A : 20; + 049B : 00; + 049C : C1; + 049D : A9; + 049E : 00; + 049F : 8D; + 04A0 : 92; + 04A1 : 02; + 04A2 : 20; + 04A3 : AC; + 04A4 : C5; + 04A5 : D0; + 04A6 : 13; + 04A7 : 8D; + 04A8 : 8F; + 04A9 : 02; + 04AA : AD; + 04AB : 8F; + 04AC : 02; + 04AD : D0; + 04AE : 28; + 04AF : CE; + 04B0 : 8C; + 04B1 : 02; + 04B2 : 10; + 04B3 : DE; + 04B4 : 60; + 04B5 : 20; + 04B6 : 17; + 04B7 : C6; + [04B8..04B9] : F0; + 04BA : 20; + 04BB : D8; + 04BC : C4; + 04BD : AE; + 04BE : 53; + 04BF : 02; + 04C0 : 10; + 04C1 : 07; + 04C2 : AD; + 04C3 : 8F; + 04C4 : 02; + 04C5 : F0; + 04C6 : EE; + 04C7 : D0; + 04C8 : 0E; + 04C9 : AD; + 04CA : 96; + 04CB : 02; + 04CC : F0; + 04CD : 09; + 04CE : B5; + 04CF : E7; + 04D0 : 29; + 04D1 : 07; + 04D2 : CD; + 04D3 : 96; + 04D4 : 02; + 04D5 : D0; + 04D6 : DE; + 04D7 : 60; + 04D8 : A2; + 04D9 : FF; + 04DA : 8E; + 04DB : 53; + 04DC : 02; + 04DD : E8; + 04DE : 8E; + 04DF : 8A; + 04E0 : 02; + 04E1 : 20; + 04E2 : 89; + 04E3 : C5; + 04E4 : F0; + 04E5 : 06; + 04E6 : 60; + 04E7 : 20; + 04E8 : 94; + 04E9 : C5; + 04EA : D0; + 04EB : FA; + 04EC : A5; + 04ED : 7F; + 04EE : 55; + 04EF : E2; + 04F0 : 4A; + 04F1 : 90; + 04F2 : 0B; + 04F3 : 29; + 04F4 : 40; + [04F5..04F6] : F0; + 04F7 : A9; + 04F8 : 02; + 04F9 : CD; + 04FA : 8C; + 04FB : 02; + 04FC : F0; + 04FD : E9; + 04FE : BD; + 04FF : 7A; + 0500 : 02; + 0501 : AA; + 0502 : 20; + 0503 : A6; + 0504 : C6; + 0505 : A0; + 0506 : 03; + 0507 : 4C; + 0508 : 1D; + 0509 : C5; + 050A : BD; + 050B : 00; + 050C : 02; + 050D : D1; + 050E : 94; + 050F : F0; + 0510 : 0A; + 0511 : C9; + 0512 : 3F; + 0513 : D0; + 0514 : D2; + 0515 : B1; + 0516 : 94; + 0517 : C9; + 0518 : A0; + 0519 : F0; + 051A : CC; + 051B : E8; + 051C : C8; + 051D : EC; + 051E : 76; + 051F : 02; + 0520 : B0; + 0521 : 09; + 0522 : BD; + 0523 : 00; + 0524 : 02; + 0525 : C9; + 0526 : 2A; + 0527 : F0; + 0528 : 0C; + 0529 : D0; + 052A : DF; + 052B : C0; + 052C : 13; + 052D : B0; + 052E : 06; + 052F : B1; + 0530 : 94; + 0531 : C9; + 0532 : A0; + 0533 : D0; + 0534 : B2; + 0535 : AE; + 0536 : 79; + 0537 : 02; + 0538 : 8E; + 0539 : 53; + 053A : 02; + 053B : B5; + 053C : E7; + 053D : 29; + 053E : 80; + 053F : 8D; + 0540 : 8A; + 0541 : 02; + 0542 : AD; + 0543 : 94; + 0544 : 02; + 0545 : 95; + 0546 : DD; + 0547 : A5; + 0548 : 81; + 0549 : 95; + 054A : D8; + 054B : A0; + 054C : 00; + 054D : B1; + 054E : 94; + 054F : C8; + 0550 : 48; + 0551 : 29; + 0552 : 40; + 0553 : 85; + 0554 : 6F; + 0555 : 68; + 0556 : 29; + 0557 : DF; + 0558 : 30; + 0559 : 02; + 055A : 09; + 055B : 20; + 055C : 29; + 055D : 27; + 055E : 05; + 055F : 6F; + 0560 : 85; + 0561 : 6F; + 0562 : A9; + 0563 : 80; + 0564 : 35; + 0565 : E7; + 0566 : 05; + 0567 : 6F; + 0568 : 95; + 0569 : E7; + 056A : B5; + 056B : E2; + 056C : 29; + 056D : 80; + 056E : 05; + 056F : 7F; + 0570 : 95; + 0571 : E2; + 0572 : B1; + 0573 : 94; + 0574 : 9D; + 0575 : 80; + 0576 : 02; + 0577 : C8; + 0578 : B1; + 0579 : 94; + 057A : 9D; + 057B : 85; + 057C : 02; + 057D : AD; + 057E : 58; + 057F : 02; + 0580 : D0; + 0581 : 07; + 0582 : A0; + 0583 : 15; + 0584 : B1; + 0585 : 94; + 0586 : 8D; + 0587 : 58; + 0588 : 02; + 0589 : A9; + 058A : FF; + 058B : 8D; + 058C : 8F; + 058D : 02; + 058E : AD; + 058F : 78; + 0590 : 02; + 0591 : 8D; + 0592 : 79; + 0593 : 02; + 0594 : CE; + 0595 : 79; + 0596 : 02; + 0597 : 10; + 0598 : 01; + 0599 : 60; + 059A : AE; + 059B : 79; + 059C : 02; + 059D : B5; + 059E : E7; + 059F : 30; + 05A0 : 05; + 05A1 : BD; + 05A2 : 80; + 05A3 : 02; + 05A4 : D0; + 05A5 : EE; + 05A6 : A9; + 05A7 : 00; + 05A8 : 8D; + 05A9 : 8F; + 05AA : 02; + 05AB : 60; + 05AC : A0; + 05AD : 00; + 05AE : 8C; + 05AF : 91; + 05B0 : 02; + 05B1 : 88; + 05B2 : 8C; + 05B3 : 53; + 05B4 : 02; + 05B5 : AD; + 05B6 : 85; + 05B7 : FE; + 05B8 : 85; + 05B9 : 80; + 05BA : A9; + 05BB : 01; + 05BC : 85; + 05BD : 81; + 05BE : 8D; + 05BF : 93; + 05C0 : 02; + 05C1 : 20; + 05C2 : 75; + 05C3 : D4; + 05C4 : AD; + 05C5 : 93; + 05C6 : 02; + 05C7 : D0; + 05C8 : 01; + 05C9 : 60; + 05CA : A9; + 05CB : 07; + 05CC : 8D; + 05CD : 95; + 05CE : 02; + 05CF : A9; + 05D0 : 00; + 05D1 : 20; + 05D2 : F6; + 05D3 : D4; + 05D4 : 8D; + 05D5 : 93; + 05D6 : 02; + 05D7 : 20; + 05D8 : E8; + 05D9 : D4; + 05DA : CE; + 05DB : 95; + 05DC : 02; + 05DD : A0; + 05DE : 00; + 05DF : B1; + 05E0 : 94; + 05E1 : D0; + 05E2 : 18; + 05E3 : AD; + 05E4 : 91; + 05E5 : 02; + 05E6 : D0; + 05E7 : 2F; + 05E8 : 20; + 05E9 : 3B; + 05EA : DE; + 05EB : A5; + 05EC : 81; + 05ED : 8D; + 05EE : 91; + 05EF : 02; + 05F0 : A5; + 05F1 : 94; + 05F2 : AE; + 05F3 : 92; + 05F4 : 02; + 05F5 : 8D; + 05F6 : 92; + 05F7 : 02; + 05F8 : F0; + 05F9 : 1D; + 05FA : 60; + 05FB : A2; + 05FC : 01; + 05FD : EC; + 05FE : 92; + 05FF : 02; + 0600 : D0; + 0601 : 2D; + 0602 : F0; + 0603 : 13; + 0604 : AD; + 0605 : 85; + 0606 : FE; + 0607 : 85; + 0608 : 80; + 0609 : AD; + 060A : 90; + 060B : 02; + 060C : 85; + 060D : 81; + 060E : 20; + 060F : 75; + 0610 : D4; + 0611 : AD; + 0612 : 94; + 0613 : 02; + 0614 : 20; + 0615 : C8; + 0616 : D4; + 0617 : A9; + 0618 : FF; + 0619 : 8D; + 061A : 53; + 061B : 02; + 061C : AD; + 061D : 95; + 061E : 02; + 061F : 30; + 0620 : 08; + 0621 : A9; + [0622..0623] : 20; + 0624 : C6; + 0625 : D1; + 0626 : 4C; + 0627 : D7; + 0628 : C5; + 0629 : 20; + 062A : 4D; + 062B : D4; + 062C : 4C; + 062D : C4; + 062E : C5; + 062F : A5; + 0630 : 94; + 0631 : 8D; + 0632 : 94; + 0633 : 02; + 0634 : 20; + 0635 : 3B; + 0636 : DE; + 0637 : A5; + 0638 : 81; + 0639 : 8D; + 063A : 90; + 063B : 02; + 063C : 60; + 063D : A5; + 063E : 68; + 063F : D0; + 0640 : 28; + 0641 : A6; + 0642 : 7F; + 0643 : 56; + 0644 : 1C; + 0645 : 90; + 0646 : 22; + 0647 : A9; + 0648 : FF; + 0649 : 8D; + 064A : 98; + 064B : 02; + 064C : 20; + 064D : 0E; + 064E : D0; + 064F : A0; + 0650 : FF; + 0651 : C9; + 0652 : 02; + 0653 : F0; + 0654 : 0A; + 0655 : C9; + 0656 : 03; + 0657 : F0; + 0658 : 06; + 0659 : C9; + 065A : 0F; + 065B : F0; + 065C : 02; + 065D : A0; + 065E : 00; + 065F : A6; + 0660 : 7F; + 0661 : 98; + 0662 : 95; + 0663 : FF; + 0664 : D0; + 0665 : 03; + 0666 : 20; + 0667 : 42; + 0668 : D0; + 0669 : A6; + 066A : 7F; + 066B : B5; + 066C : FF; + 066D : 60; + 066E : 48; + 066F : 20; + 0670 : A6; + 0671 : C6; + 0672 : 20; + 0673 : 88; + 0674 : C6; + 0675 : 68; + 0676 : 38; + 0677 : ED; + 0678 : 4B; + 0679 : 02; + 067A : AA; + 067B : F0; + 067C : 0A; + 067D : 90; + 067E : 08; + 067F : A9; + 0680 : A0; + 0681 : 91; + 0682 : 94; + 0683 : C8; + 0684 : CA; + 0685 : D0; + 0686 : FA; + 0687 : 60; + 0688 : 98; + 0689 : 0A; + 068A : A8; + 068B : B9; + 068C : 99; + 068D : 00; + 068E : 85; + 068F : 94; + 0690 : B9; + 0691 : 9A; + 0692 : 00; + 0693 : 85; + 0694 : 95; + 0695 : A0; + 0696 : 00; + 0697 : BD; + 0698 : 00; + 0699 : 02; + 069A : 91; + 069B : 94; + 069C : C8; + 069D : F0; + 069E : 06; + 069F : E8; + 06A0 : EC; + 06A1 : 76; + 06A2 : 02; + 06A3 : 90; + 06A4 : F2; + 06A5 : 60; + 06A6 : A9; + 06A7 : 00; + 06A8 : 8D; + 06A9 : 4B; + 06AA : 02; + 06AB : 8A; + 06AC : 48; + 06AD : BD; + 06AE : 00; + 06AF : 02; + 06B0 : C9; + 06B1 : 2C; + 06B2 : F0; + 06B3 : 14; + 06B4 : C9; + 06B5 : 3D; + 06B6 : F0; + 06B7 : 10; + 06B8 : EE; + 06B9 : 4B; + 06BA : 02; + 06BB : E8; + 06BC : A9; + 06BD : 0F; + 06BE : CD; + 06BF : 4B; + 06C0 : 02; + 06C1 : 90; + 06C2 : 05; + 06C3 : EC; + 06C4 : 74; + 06C5 : 02; + 06C6 : 90; + 06C7 : E5; + 06C8 : 8E; + 06C9 : 76; + 06CA : 02; + 06CB : 68; + 06CC : AA; + 06CD : 60; + 06CE : A5; + 06CF : 83; + 06D0 : 48; + 06D1 : A5; + 06D2 : 82; + 06D3 : 48; + 06D4 : 20; + 06D5 : DE; + 06D6 : C6; + 06D7 : 68; + 06D8 : 85; + 06D9 : 82; + 06DA : 68; + 06DB : 85; + 06DC : 83; + 06DD : 60; + 06DE : A9; + 06DF : 11; + 06E0 : 85; + 06E1 : 83; + 06E2 : 20; + 06E3 : EB; + 06E4 : D0; + 06E5 : 20; + 06E6 : E8; + 06E7 : D4; + 06E8 : AD; + 06E9 : 53; + 06EA : 02; + 06EB : 10; + 06EC : 0A; + 06ED : AD; + 06EE : 8D; + 06EF : 02; + 06F0 : D0; + 06F1 : 0A; + 06F2 : 20; + 06F3 : 06; + 06F4 : C8; + 06F5 : 18; + 06F6 : 60; + 06F7 : AD; + 06F8 : 8D; + 06F9 : 02; + 06FA : F0; + 06FB : 1F; + 06FC : CE; + 06FD : 8D; + 06FE : 02; + 06FF : D0; + 0700 : 0D; + 0701 : CE; + 0702 : 8D; + 0703 : 02; + 0704 : 20; + 0705 : 8F; + 0706 : C3; + 0707 : 20; + 0708 : 06; + 0709 : C8; + 070A : 38; + 070B : 4C; + 070C : 8F; + 070D : C3; + 070E : A9; + 070F : 00; + 0710 : 8D; + 0711 : 73; + 0712 : 02; + [0713..0714] : 8D; + 0715 : 02; + 0716 : 20; + 0717 : B7; + 0718 : C7; + 0719 : 38; + 071A : 60; + 071B : A2; + 071C : 18; + 071D : A0; + 071E : 1D; + 071F : B1; + 0720 : 94; + 0721 : 8D; + 0722 : 73; + 0723 : 02; + 0724 : F0; + 0725 : 02; + 0726 : A2; + 0727 : 16; + 0728 : 88; + 0729 : B1; + 072A : 94; + 072B : 8D; + 072C : 72; + 072D : 02; + 072E : E0; + 072F : 16; + 0730 : F0; + 0731 : 0A; + 0732 : C9; + 0733 : 0A; + 0734 : 90; + 0735 : 06; + 0736 : CA; + 0737 : C9; + 0738 : 64; + 0739 : 90; + 073A : 01; + 073B : CA; + 073C : 20; + 073D : AC; + 073E : C7; + 073F : B1; + 0740 : 94; + 0741 : 48; + 0742 : 0A; + 0743 : 10; + 0744 : 05; + 0745 : A9; + 0746 : 3C; + 0747 : 9D; + 0748 : B2; + 0749 : 02; + 074A : 68; + 074B : 29; + 074C : 0F; + 074D : A8; + 074E : B9; + 074F : C5; + 0750 : FE; + 0751 : 9D; + 0752 : B1; + 0753 : 02; + 0754 : CA; + 0755 : B9; + 0756 : C0; + 0757 : FE; + 0758 : 9D; + 0759 : B1; + 075A : 02; + 075B : CA; + 075C : B9; + 075D : BB; + 075E : FE; + 075F : 9D; + 0760 : B1; + 0761 : 02; + [0762..0763] : CA; + 0764 : B0; + 0765 : 05; + 0766 : A9; + 0767 : 2A; + 0768 : 9D; + 0769 : B2; + 076A : 02; + 076B : A9; + 076C : A0; + 076D : 9D; + 076E : B1; + 076F : 02; + 0770 : CA; + 0771 : A0; + 0772 : 12; + 0773 : B1; + 0774 : 94; + 0775 : 9D; + 0776 : B1; + 0777 : 02; + 0778 : CA; + 0779 : 88; + 077A : C0; + 077B : 03; + 077C : B0; + 077D : F5; + 077E : A9; + 077F : 22; + 0780 : 9D; + 0781 : B1; + 0782 : 02; + 0783 : E8; + 0784 : E0; + 0785 : 20; + 0786 : B0; + 0787 : 0B; + 0788 : BD; + 0789 : B1; + 078A : 02; + 078B : C9; + 078C : 22; + 078D : F0; + 078E : 04; + 078F : C9; + 0790 : A0; + 0791 : D0; + 0792 : F0; + 0793 : A9; + 0794 : 22; + 0795 : 9D; + 0796 : B1; + 0797 : 02; + 0798 : E8; + 0799 : E0; + 079A : 20; + 079B : B0; + 079C : 0A; + 079D : A9; + 079E : 7F; + 079F : 3D; + 07A0 : B1; + 07A1 : 02; + 07A2 : 9D; + 07A3 : B1; + 07A4 : 02; + 07A5 : 10; + 07A6 : F1; + 07A7 : 20; + 07A8 : B5; + 07A9 : C4; + 07AA : 38; + 07AB : 60; + 07AC : A0; + 07AD : 1B; + 07AE : A9; + 07AF : 20; + 07B0 : 99; + 07B1 : B0; + 07B2 : 02; + 07B3 : 88; + 07B4 : D0; + 07B5 : FA; + 07B6 : 60; + 07B7 : 20; + 07B8 : 19; + 07B9 : F1; + 07BA : 20; + 07BB : DF; + 07BC : F0; + 07BD : 20; + 07BE : AC; + 07BF : C7; + 07C0 : A9; + 07C1 : FF; + 07C2 : 85; + 07C3 : 6F; + 07C4 : A6; + 07C5 : 7F; + 07C6 : 8E; + 07C7 : 72; + 07C8 : 02; + 07C9 : A9; + 07CA : 00; + 07CB : 8D; + 07CC : 73; + 07CD : 02; + 07CE : A6; + 07CF : F9; + 07D0 : BD; + 07D1 : E0; + 07D2 : FE; + 07D3 : 85; + 07D4 : 95; + 07D5 : AD; + 07D6 : 88; + 07D7 : FE; + 07D8 : 85; + 07D9 : 94; + 07DA : A0; + 07DB : 16; + 07DC : B1; + 07DD : 94; + 07DE : C9; + 07DF : A0; + 07E0 : D0; + 07E1 : 0B; + 07E2 : A9; + 07E3 : 31; + 07E4 : 2C; + 07E5 : B1; + 07E6 : 94; + 07E7 : C9; + 07E8 : A0; + 07E9 : D0; + 07EA : 02; + 07EB : A9; + 07EC : 20; + 07ED : 99; + 07EE : B3; + 07EF : 02; + 07F0 : 88; + 07F1 : 10; + 07F2 : F2; + 07F3 : A9; + 07F4 : 12; + 07F5 : 8D; + 07F6 : B1; + 07F7 : 02; + 07F8 : A9; + 07F9 : 22; + 07FA : 8D; + 07FB : B2; + 07FC : 02; + 07FD : 8D; + 07FE : C3; + 07FF : 02; + 0800 : A9; + 0801 : 20; + 0802 : 8D; + 0803 : C4; + 0804 : 02; + 0805 : 60; + 0806 : 20; + 0807 : AC; + 0808 : C7; + 0809 : A0; + 080A : 0B; + 080B : B9; + 080C : 17; + 080D : C8; + 080E : 99; + 080F : B1; + 0810 : 02; + 0811 : 88; + 0812 : 10; + 0813 : F7; + 0814 : 4C; + 0815 : 4D; + 0816 : EF; + 0817 : 42; + 0818 : 4C; + 0819 : 4F; + 081A : 43; + 081B : 4B; + 081C : 53; + 081D : 20; + 081E : 46; + 081F : 52; + [0820..0821] : 45; + 0822 : 2E; + 0823 : 20; + 0824 : 98; + 0825 : C3; + [0826..0827] : 20; + 0828 : C3; + 0829 : 20; + 082A : CA; + 082B : C3; + 082C : A9; + 082D : 00; + 082E : 85; + 082F : 86; + 0830 : 20; + 0831 : 9D; + 0832 : C4; + 0833 : 30; + 0834 : 3D; + 0835 : 20; + 0836 : B7; + 0837 : DD; + 0838 : 90; + 0839 : 33; + 083A : A0; + 083B : 00; + 083C : B1; + 083D : 94; + 083E : 29; + 083F : 40; + 0840 : D0; + 0841 : 2B; + 0842 : 20; + 0843 : B6; + 0844 : C8; + 0845 : A0; + 0846 : 13; + 0847 : B1; + 0848 : 94; + 0849 : F0; + 084A : 0A; + 084B : 85; + 084C : 80; + 084D : C8; + 084E : B1; + 084F : 94; + 0850 : 85; + 0851 : 81; + 0852 : 20; + 0853 : 7D; + 0854 : C8; + 0855 : AE; + 0856 : 53; + 0857 : 02; + 0858 : A9; + 0859 : 20; + 085A : 35; + 085B : E7; + 085C : D0; + 085D : 0D; + 085E : BD; + 085F : 80; + 0860 : 02; + 0861 : 85; + 0862 : 80; + 0863 : BD; + 0864 : 85; + 0865 : 02; + 0866 : 85; + 0867 : 81; + 0868 : 20; + 0869 : 7D; + 086A : C8; + 086B : E6; + 086C : 86; + 086D : 20; + 086E : 8B; + 086F : C4; + 0870 : 10; + 0871 : C3; + 0872 : A5; + 0873 : 86; + 0874 : 85; + 0875 : 80; + 0876 : A9; + 0877 : 01; + 0878 : A0; + 0879 : 00; + 087A : 4C; + 087B : A3; + 087C : C1; + 087D : 20; + 087E : 5F; + 087F : EF; + 0880 : 20; + 0881 : 75; + 0882 : D4; + 0883 : 20; + 0884 : 19; + 0885 : F1; + 0886 : B5; + 0887 : A7; + 0888 : C9; + 0889 : FF; + 088A : F0; + 088B : 08; + 088C : AD; + 088D : F9; + 088E : 02; + 088F : 09; + 0890 : 40; + 0891 : 8D; + 0892 : F9; + 0893 : 02; + 0894 : A9; + 0895 : 00; + 0896 : 20; + 0897 : C8; + 0898 : D4; + 0899 : 20; + 089A : 56; + 089B : D1; + 089C : 85; + 089D : 80; + 089E : 20; + 089F : 56; + 08A0 : D1; + 08A1 : 85; + 08A2 : 81; + 08A3 : A5; + 08A4 : 80; + 08A5 : D0; + 08A6 : 06; + 08A7 : 20; + 08A8 : F4; + 08A9 : EE; + 08AA : 4C; + 08AB : 27; + 08AC : D2; + 08AD : 20; + 08AE : 5F; + 08AF : EF; + 08B0 : 20; + 08B1 : 4D; + 08B2 : D4; + 08B3 : 4C; + 08B4 : 94; + 08B5 : C8; + 08B6 : A0; + 08B7 : 00; + 08B8 : 98; + 08B9 : 91; + 08BA : 94; + 08BB : 20; + 08BC : 5E; + 08BD : DE; + 08BE : 4C; + 08BF : 99; + 08C0 : D5; + 08C1 : A9; + 08C2 : 31; + 08C3 : 4C; + 08C4 : C8; + 08C5 : C1; + 08C6 : A9; + 08C7 : 4C; + 08C8 : 8D; + 08C9 : 00; + 08CA : 06; + 08CB : A9; + 08CC : C7; + 08CD : 8D; + 08CE : 01; + 08CF : 06; + 08D0 : A9; + 08D1 : FA; + 08D2 : 8D; + 08D3 : 02; + 08D4 : 06; + 08D5 : A9; + 08D6 : 03; + 08D7 : 20; + 08D8 : D3; + 08D9 : D6; + 08DA : A5; + 08DB : 7F; + 08DC : 09; + 08DD : E0; + 08DE : 85; + 08DF : 03; + 08E0 : A5; + 08E1 : 03; + 08E2 : 30; + 08E3 : FC; + 08E4 : C9; + 08E5 : 02; + 08E6 : 90; + 08E7 : 07; + 08E8 : A9; + 08E9 : 03; + 08EA : A2; + 08EB : 00; + 08EC : 4C; + 08ED : 0A; + 08EE : E6; + 08EF : 60; + 08F0 : A9; + 08F1 : E0; + 08F2 : 8D; + 08F3 : 4F; + 08F4 : 02; + 08F5 : 20; + 08F6 : D1; + 08F7 : F0; + 08F8 : 20; + 08F9 : 19; + 08FA : F1; + 08FB : A9; + 08FC : FF; + 08FD : 95; + 08FE : A7; + 08FF : A9; + 0900 : 0F; + 0901 : 8D; + 0902 : 56; + 0903 : 02; + 0904 : 20; + 0905 : E5; + 0906 : C1; + 0907 : D0; + 0908 : 03; + 0909 : 4C; + 090A : C1; + 090B : C8; + 090C : 20; + 090D : F8; + 090E : C1; + [090F..0910] : 20; + 0911 : C3; + 0912 : AD; + 0913 : 8B; + 0914 : 02; + 0915 : 29; + 0916 : 55; + 0917 : D0; + 0918 : 0F; + 0919 : AE; + 091A : 7A; + 091B : 02; + 091C : BD; + 091D : 00; + 091E : 02; + 091F : C9; + 0920 : 2A; + 0921 : D0; + 0922 : 05; + 0923 : A9; + 0924 : 30; + 0925 : 4C; + 0926 : C8; + 0927 : C1; + 0928 : AD; + 0929 : 8B; + 092A : 02; + 092B : 29; + 092C : D9; + 092D : D0; + 092E : F4; + 092F : 4C; + 0930 : 52; + 0931 : C9; + 0932 : A9; + 0933 : 00; + 0934 : 8D; + 0935 : 58; + 0936 : 02; + 0937 : 8D; + 0938 : 8C; + 0939 : 02; + 093A : 8D; + 093B : 80; + 093C : 02; + 093D : 8D; + 093E : 81; + 093F : 02; + 0940 : A5; + 0941 : E3; + 0942 : 29; + 0943 : 01; + 0944 : 85; + 0945 : 7F; + 0946 : 09; + 0947 : 01; + 0948 : 8D; + 0949 : 91; + 094A : 02; + 094B : AD; + 094C : 7B; + 094D : 02; + 094E : 8D; + 094F : 7A; + 0950 : 02; + 0951 : 60; + 0952 : 20; + 0953 : 4F; + 0954 : C4; + 0955 : AD; + 0956 : 78; + 0957 : 02; + 0958 : C9; + 0959 : 03; + 095A : 90; + 095B : 45; + 095C : A5; + 095D : E2; + 095E : C5; + 095F : E3; + 0960 : D0; + 0961 : 3F; + 0962 : A5; + 0963 : DD; + 0964 : C5; + 0965 : DE; + 0966 : D0; + 0967 : 39; + 0968 : A5; + 0969 : D8; + 096A : C5; + 096B : D9; + 096C : D0; + 096D : 33; + 096E : 20; + 096F : CC; + 0970 : CA; + 0971 : A9; + 0972 : 01; + 0973 : 8D; + 0974 : 79; + 0975 : 02; + 0976 : 20; + 0977 : FA; + 0978 : C9; + 0979 : 20; + 097A : 25; + 097B : D1; + 097C : F0; + 097D : 04; + 097E : C9; + 097F : 02; + 0980 : D0; + 0981 : 05; + 0982 : A9; + 0983 : 64; + 0984 : 20; + 0985 : C8; + 0986 : C1; + 0987 : A9; + 0988 : 12; + 0989 : 85; + 098A : 83; + 098B : AD; + 098C : 3C; + 098D : 02; + 098E : 8D; + 098F : 3D; + 0990 : 02; + 0991 : A9; + 0992 : FF; + 0993 : 8D; + 0994 : 3C; + 0995 : 02; + 0996 : 20; + 0997 : 2A; + 0998 : DA; + 0999 : A2; + 099A : 02; + 099B : 20; + 099C : B9; + 099D : C9; + 099E : 4C; + 099F : 94; + 09A0 : C1; + 09A1 : 20; + 09A2 : A7; + 09A3 : C9; + 09A4 : 4C; + 09A5 : 94; + 09A6 : C1; + 09A7 : 20; + 09A8 : E7; + 09A9 : CA; + 09AA : A5; + 09AB : E2; + 09AC : 29; + 09AD : 01; + 09AE : 85; + 09AF : 7F; + 09B0 : 20; + 09B1 : 86; + 09B2 : D4; + 09B3 : 20; + 09B4 : E4; + 09B5 : D6; + 09B6 : AE; + 09B7 : 77; + 09B8 : 02; + 09B9 : 8E; + 09BA : 79; + 09BB : 02; + 09BC : 20; + 09BD : FA; + 09BE : C9; + 09BF : A9; + 09C0 : 11; + 09C1 : 85; + 09C2 : 83; + 09C3 : 20; + 09C4 : EB; + 09C5 : D0; + 09C6 : 20; + 09C7 : 25; + 09C8 : D1; + 09C9 : D0; + 09CA : 03; + 09CB : 20; + 09CC : 53; + 09CD : CA; + 09CE : A9; + 09CF : 08; + 09D0 : 85; + 09D1 : F8; + 09D2 : 4C; + 09D3 : D8; + 09D4 : C9; + 09D5 : 20; + 09D6 : 9B; + 09D7 : CF; + 09D8 : 20; + 09D9 : 35; + 09DA : CA; + 09DB : A9; + 09DC : 80; + 09DD : 20; + 09DE : A6; + 09DF : DD; + 09E0 : F0; + 09E1 : F3; + 09E2 : 20; + 09E3 : 25; + 09E4 : D1; + 09E5 : F0; + 09E6 : 03; + 09E7 : 20; + 09E8 : 9B; + 09E9 : CF; + 09EA : AE; + 09EB : 79; + 09EC : 02; + 09ED : E8; + 09EE : EC; + 09EF : 78; + 09F0 : 02; + 09F1 : 90; + 09F2 : C6; + 09F3 : A9; + 09F4 : 12; + 09F5 : 85; + 09F6 : 83; + 09F7 : 4C; + 09F8 : 02; + 09F9 : DB; + 09FA : AE; + 09FB : 79; + 09FC : 02; + 09FD : B5; + 09FE : E2; + 09FF : 29; + 0A00 : 01; + 0A01 : 85; + 0A02 : 7F; + 0A03 : AD; + 0A04 : 85; + 0A05 : FE; + 0A06 : 85; + 0A07 : 80; + 0A08 : B5; + 0A09 : D8; + 0A0A : 85; + 0A0B : 81; + 0A0C : 20; + 0A0D : 75; + 0A0E : D4; + 0A0F : AE; + 0A10 : 79; + 0A11 : 02; + 0A12 : B5; + 0A13 : DD; + 0A14 : 20; + 0A15 : C8; + 0A16 : D4; + 0A17 : AE; + 0A18 : 79; + 0A19 : 02; + 0A1A : B5; + 0A1B : E7; + 0A1C : 29; + 0A1D : 07; + 0A1E : 8D; + 0A1F : 4A; + 0A20 : 02; + 0A21 : A9; + 0A22 : 00; + 0A23 : 8D; + 0A24 : 58; + 0A25 : 02; + 0A26 : 20; + 0A27 : A0; + 0A28 : D9; + 0A29 : A0; + 0A2A : 01; + 0A2B : 20; + 0A2C : 25; + 0A2D : D1; + 0A2E : F0; + 0A2F : 01; + 0A30 : C8; + 0A31 : 98; + 0A32 : 4C; + 0A33 : C8; + 0A34 : D4; + 0A35 : A9; + 0A36 : 11; + 0A37 : 85; + 0A38 : 83; + 0A39 : 20; + 0A3A : 9B; + 0A3B : D3; + [0A3C..0A3D] : 85; + 0A3E : A6; + 0A3F : 82; + 0A40 : B5; + 0A41 : F2; + 0A42 : 29; + 0A43 : 08; + 0A44 : 85; + 0A45 : F8; + 0A46 : D0; + 0A47 : 0A; + 0A48 : 20; + 0A49 : 25; + 0A4A : D1; + 0A4B : F0; + 0A4C : 05; + 0A4D : A9; + 0A4E : 80; + 0A4F : 20; + 0A50 : 97; + 0A51 : DD; + 0A52 : 60; + 0A53 : 20; + 0A54 : D3; + 0A55 : D1; + 0A56 : 20; + 0A57 : CB; + 0A58 : E1; + 0A59 : A5; + 0A5A : D6; + 0A5B : 48; + 0A5C : A5; + 0A5D : D5; + 0A5E : 48; + 0A5F : A9; + 0A60 : 12; + 0A61 : 85; + 0A62 : 83; + 0A63 : 20; + 0A64 : 07; + 0A65 : D1; + 0A66 : 20; + 0A67 : D3; + 0A68 : D1; + 0A69 : 20; + 0A6A : CB; + 0A6B : E1; + 0A6C : 20; + 0A6D : 9C; + 0A6E : E2; + 0A6F : A5; + 0A70 : D6; + 0A71 : 85; + 0A72 : 87; + 0A73 : A5; + 0A74 : D5; + 0A75 : 85; + 0A76 : 86; + 0A77 : A9; + 0A78 : 00; + 0A79 : 85; + 0A7A : 88; + 0A7B : 85; + 0A7C : D4; + 0A7D : 85; + 0A7E : D7; + 0A7F : 68; + 0A80 : 85; + 0A81 : D5; + 0A82 : 68; + 0A83 : 85; + 0A84 : D6; + 0A85 : 4C; + 0A86 : 3B; + 0A87 : E3; + [0A88..0A89] : 20; + 0A8A : C3; + 0A8B : A5; + 0A8C : E3; + 0A8D : 29; + 0A8E : 01; + 0A8F : 85; + 0A90 : E3; + 0A91 : C5; + 0A92 : E2; + 0A93 : F0; + 0A94 : 02; + 0A95 : 09; + 0A96 : 80; + 0A97 : 85; + 0A98 : E2; + 0A99 : 20; + 0A9A : 4F; + 0A9B : C4; + 0A9C : 20; + 0A9D : E7; + 0A9E : CA; + 0A9F : A5; + 0AA0 : E3; + 0AA1 : 29; + 0AA2 : 01; + 0AA3 : 85; + 0AA4 : 7F; + 0AA5 : A5; + 0AA6 : D9; + 0AA7 : 85; + 0AA8 : 81; + 0AA9 : 20; + 0AAA : 57; + 0AAB : DE; + 0AAC : 20; + 0AAD : 99; + 0AAE : D5; + 0AAF : A5; + 0AB0 : DE; + 0AB1 : 18; + 0AB2 : 69; + 0AB3 : 03; + 0AB4 : 20; + 0AB5 : C8; + 0AB6 : D4; + 0AB7 : 20; + 0AB8 : 93; + 0AB9 : DF; + 0ABA : A8; + 0ABB : AE; + 0ABC : 7A; + 0ABD : 02; + 0ABE : A9; + 0ABF : 10; + 0AC0 : 20; + 0AC1 : 6E; + 0AC2 : C6; + 0AC3 : 20; + 0AC4 : 5E; + 0AC5 : DE; + 0AC6 : 20; + 0AC7 : 99; + 0AC8 : D5; + 0AC9 : 4C; + 0ACA : 94; + 0ACB : C1; + 0ACC : A5; + 0ACD : E8; + 0ACE : 29; + 0ACF : 07; + 0AD0 : 8D; + 0AD1 : 4A; + 0AD2 : 02; + 0AD3 : AE; + 0AD4 : 78; + 0AD5 : 02; + 0AD6 : CA; + 0AD7 : EC; + 0AD8 : 77; + 0AD9 : 02; + 0ADA : 90; + 0ADB : 0A; + 0ADC : BD; + 0ADD : 80; + 0ADE : 02; + 0ADF : D0; + 0AE0 : F5; + 0AE1 : A9; + 0AE2 : 62; + 0AE3 : 4C; + 0AE4 : C8; + 0AE5 : C1; + 0AE6 : 60; + 0AE7 : 20; + 0AE8 : CC; + 0AE9 : CA; + 0AEA : BD; + 0AEB : 80; + 0AEC : 02; + 0AED : F0; + 0AEE : 05; + 0AEF : A9; + 0AF0 : 63; + 0AF1 : 4C; + 0AF2 : C8; + 0AF3 : C1; + 0AF4 : CA; + 0AF5 : 10; + 0AF6 : F3; + 0AF7 : 60; + 0AF8 : AD; + 0AF9 : 01; + 0AFA : 02; + 0AFB : C9; + 0AFC : 2D; + 0AFD : D0; + 0AFE : 4C; + 0AFF : AD; + 0B00 : 03; + 0B01 : 02; + 0B02 : 85; + 0B03 : 6F; + 0B04 : AD; + 0B05 : 04; + 0B06 : 02; + 0B07 : 85; + 0B08 : 70; + 0B09 : A0; + 0B0A : 00; + 0B0B : AD; + [0B0C..0B0D] : 02; + 0B0E : C9; + 0B0F : 52; + 0B10 : F0; + 0B11 : 0E; + 0B12 : 20; + 0B13 : 58; + 0B14 : F2; + 0B15 : C9; + 0B16 : 57; + 0B17 : F0; + 0B18 : 37; + 0B19 : C9; + 0B1A : 45; + 0B1B : D0; + 0B1C : 2E; + 0B1D : 6C; + 0B1E : 6F; + 0B1F : 00; + 0B20 : B1; + 0B21 : 6F; + [0B22..0B23] : 85; + 0B24 : AD; + 0B25 : 74; + 0B26 : 02; + 0B27 : C9; + 0B28 : 06; + 0B29 : 90; + 0B2A : 1A; + 0B2B : AE; + 0B2C : 05; + 0B2D : 02; + 0B2E : CA; + 0B2F : F0; + 0B30 : 14; + 0B31 : 8A; + 0B32 : 18; + 0B33 : 65; + 0B34 : 6F; + 0B35 : E6; + 0B36 : 6F; + 0B37 : 8D; + 0B38 : 49; + 0B39 : 02; + 0B3A : A5; + 0B3B : 6F; + 0B3C : 85; + [0B3D..0B3E] : A5; + 0B3F : 70; + 0B40 : 85; + 0B41 : A6; + 0B42 : 4C; + 0B43 : 43; + 0B44 : D4; + 0B45 : 20; + 0B46 : EB; + 0B47 : D0; + 0B48 : 4C; + 0B49 : 3A; + 0B4A : D4; + 0B4B : A9; + 0B4C : 31; + 0B4D : 4C; + 0B4E : C8; + 0B4F : C1; + 0B50 : B9; + 0B51 : 06; + 0B52 : 02; + 0B53 : 91; + 0B54 : 6F; + 0B55 : C8; + 0B56 : CC; + 0B57 : 05; + 0B58 : 02; + 0B59 : 90; + 0B5A : F5; + 0B5B : 60; + 0B5C : AC; + 0B5D : 01; + 0B5E : 02; + 0B5F : C0; + 0B60 : 30; + 0B61 : D0; + 0B62 : 09; + 0B63 : A9; + 0B64 : EA; + 0B65 : 85; + 0B66 : 6B; + 0B67 : A9; + 0B68 : FF; + 0B69 : 85; + 0B6A : 6C; + 0B6B : 60; + 0B6C : 20; + 0B6D : 72; + 0B6E : CB; + 0B6F : 4C; + 0B70 : 94; + 0B71 : C1; + 0B72 : 88; + 0B73 : 98; + 0B74 : 29; + 0B75 : 0F; + 0B76 : 0A; + 0B77 : A8; + 0B78 : B1; + 0B79 : 6B; + 0B7A : 85; + 0B7B : 75; + 0B7C : C8; + 0B7D : B1; + 0B7E : 6B; + 0B7F : 85; + 0B80 : 76; + 0B81 : 6C; + 0B82 : 75; + 0B83 : 00; + 0B84 : AD; + 0B85 : 8E; + 0B86 : 02; + 0B87 : 85; + 0B88 : 7F; + 0B89 : A5; + 0B8A : 83; + 0B8B : 48; + 0B8C : 20; + 0B8D : 3D; + 0B8E : C6; + 0B8F : 68; + 0B90 : 85; + 0B91 : 83; + 0B92 : AE; + 0B93 : 74; + 0B94 : 02; + 0B95 : CA; + 0B96 : D0; + 0B97 : 0D; + 0B98 : A9; + 0B99 : 01; + 0B9A : 20; + 0B9B : E2; + 0B9C : D1; + 0B9D : 4C; + 0B9E : F1; + 0B9F : CB; + 0BA0 : A9; + 0BA1 : 70; + 0BA2 : 4C; + 0BA3 : C8; + 0BA4 : C1; + 0BA5 : A0; + 0BA6 : 01; + 0BA7 : 20; + 0BA8 : 7C; + 0BA9 : CC; + 0BAA : AE; + 0BAB : 85; + 0BAC : 02; + 0BAD : E0; + 0BAE : 05; + 0BAF : B0; + 0BB0 : EF; + 0BB1 : A9; + 0BB2 : 00; + 0BB3 : 85; + 0BB4 : 6F; + 0BB5 : 85; + 0BB6 : 70; + 0BB7 : 38; + 0BB8 : 26; + 0BB9 : 6F; + 0BBA : 26; + 0BBB : 70; + 0BBC : CA; + 0BBD : 10; + 0BBE : F9; + 0BBF : A5; + 0BC0 : 6F; + 0BC1 : 2D; + 0BC2 : 4F; + 0BC3 : 02; + 0BC4 : D0; + 0BC5 : DA; + 0BC6 : A5; + 0BC7 : 70; + 0BC8 : 2D; + 0BC9 : 50; + 0BCA : 02; + 0BCB : D0; + 0BCC : D3; + 0BCD : A5; + 0BCE : 6F; + 0BCF : 0D; + 0BD0 : 4F; + 0BD1 : 02; + 0BD2 : 8D; + 0BD3 : 4F; + 0BD4 : 02; + 0BD5 : A5; + 0BD6 : 70; + 0BD7 : 0D; + 0BD8 : 50; + 0BD9 : 02; + 0BDA : 8D; + 0BDB : 50; + 0BDC : 02; + 0BDD : A9; + 0BDE : 00; + 0BDF : 20; + 0BE0 : E2; + 0BE1 : D1; + 0BE2 : A6; + 0BE3 : 82; + 0BE4 : AD; + 0BE5 : 85; + 0BE6 : 02; + 0BE7 : 95; + 0BE8 : A7; + 0BE9 : AA; + 0BEA : A5; + 0BEB : 7F; + 0BEC : 95; + 0BED : 00; + 0BEE : 9D; + 0BEF : 5B; + 0BF0 : 02; + 0BF1 : A6; + 0BF2 : 83; + 0BF3 : BD; + 0BF4 : 2B; + 0BF5 : 02; + 0BF6 : 09; + 0BF7 : 40; + 0BF8 : 9D; + 0BF9 : 2B; + 0BFA : 02; + 0BFB : A4; + 0BFC : 82; + 0BFD : A9; + 0BFE : FF; + 0BFF : 99; + 0C00 : 44; + 0C01 : 02; + 0C02 : A9; + 0C03 : 89; + 0C04 : 99; + 0C05 : F2; + 0C06 : 00; + 0C07 : B9; + 0C08 : A7; + 0C09 : 00; + 0C0A : 99; + 0C0B : 3E; + 0C0C : 02; + 0C0D : 0A; + 0C0E : AA; + 0C0F : A9; + 0C10 : 01; + 0C11 : 95; + 0C12 : 99; + 0C13 : A9; + 0C14 : 0E; + 0C15 : 99; + 0C16 : EC; + 0C17 : 00; + 0C18 : 4C; + 0C19 : 94; + 0C1A : C1; + 0C1B : A0; + 0C1C : 00; + 0C1D : A2; + 0C1E : 00; + 0C1F : A9; + 0C20 : 2D; + 0C21 : 20; + 0C22 : 68; + 0C23 : C2; + 0C24 : D0; + 0C25 : 0A; + 0C26 : A9; + 0C27 : 31; + 0C28 : 4C; + 0C29 : C8; + 0C2A : C1; + 0C2B : A9; + 0C2C : 30; + 0C2D : 4C; + 0C2E : C8; + 0C2F : C1; + 0C30 : 8A; + 0C31 : D0; + 0C32 : F8; + 0C33 : A2; + 0C34 : 05; + 0C35 : B9; + 0C36 : 00; + 0C37 : 02; + 0C38 : DD; + 0C39 : 5D; + 0C3A : CC; + 0C3B : F0; + 0C3C : 05; + 0C3D : CA; + 0C3E : 10; + 0C3F : F8; + 0C40 : 30; + 0C41 : E4; + 0C42 : 8A; + 0C43 : 09; + 0C44 : 80; + 0C45 : 8D; + 0C46 : 2A; + 0C47 : 02; + 0C48 : 20; + 0C49 : 6F; + 0C4A : CC; + 0C4B : AD; + 0C4C : 2A; + 0C4D : 02; + 0C4E : 0A; + 0C4F : AA; + 0C50 : BD; + 0C51 : 64; + 0C52 : CC; + 0C53 : 85; + 0C54 : 70; + 0C55 : BD; + 0C56 : 63; + 0C57 : CC; + 0C58 : 85; + 0C59 : 6F; + 0C5A : 6C; + 0C5B : 6F; + 0C5C : 00; + 0C5D : 41; + 0C5E : 46; + 0C5F : 52; + 0C60 : 57; + 0C61 : 45; + 0C62 : 50; + 0C63 : 03; + 0C64 : CD; + 0C65 : F5; + 0C66 : CC; + 0C67 : 56; + 0C68 : CD; + 0C69 : 73; + 0C6A : CD; + 0C6B : A3; + 0C6C : CD; + 0C6D : BD; + 0C6E : CD; + 0C6F : A0; + 0C70 : 00; + 0C71 : A2; + 0C72 : 00; + 0C73 : A9; + 0C74 : 3A; + 0C75 : 20; + 0C76 : 68; + 0C77 : C2; + 0C78 : D0; + 0C79 : 02; + 0C7A : A0; + 0C7B : 03; + 0C7C : B9; + 0C7D : 00; + 0C7E : 02; + 0C7F : C9; + 0C80 : 20; + 0C81 : F0; + 0C82 : 08; + 0C83 : C9; + 0C84 : 1D; + 0C85 : F0; + 0C86 : 04; + 0C87 : C9; + 0C88 : 2C; + 0C89 : D0; + 0C8A : 07; + 0C8B : C8; + 0C8C : CC; + 0C8D : 74; + 0C8E : 02; + 0C8F : 90; + 0C90 : EB; + 0C91 : 60; + 0C92 : 20; + 0C93 : A1; + 0C94 : CC; + 0C95 : EE; + 0C96 : 77; + 0C97 : 02; + 0C98 : AC; + 0C99 : 79; + 0C9A : 02; + 0C9B : E0; + 0C9C : 04; + 0C9D : 90; + 0C9E : EC; + 0C9F : B0; + 0CA0 : 8A; + 0CA1 : A9; + 0CA2 : 00; + 0CA3 : 85; + 0CA4 : 6F; + 0CA5 : 85; + 0CA6 : 70; + 0CA7 : 85; + 0CA8 : 72; + 0CA9 : A2; + 0CAA : FF; + 0CAB : B9; + 0CAC : 00; + 0CAD : 02; + 0CAE : C9; + 0CAF : 40; + 0CB0 : B0; + 0CB1 : 18; + 0CB2 : C9; + 0CB3 : 30; + 0CB4 : 90; + 0CB5 : 14; + 0CB6 : 29; + 0CB7 : 0F; + 0CB8 : 48; + 0CB9 : A5; + 0CBA : 70; + 0CBB : 85; + 0CBC : 71; + 0CBD : A5; + 0CBE : 6F; + 0CBF : 85; + 0CC0 : 70; + 0CC1 : 68; + 0CC2 : 85; + 0CC3 : 6F; + 0CC4 : C8; + 0CC5 : CC; + 0CC6 : 74; + 0CC7 : 02; + 0CC8 : 90; + 0CC9 : E1; + 0CCA : 8C; + 0CCB : 79; + 0CCC : 02; + 0CCD : 18; + 0CCE : A9; + 0CCF : 00; + 0CD0 : E8; + 0CD1 : E0; + 0CD2 : 03; + 0CD3 : B0; + 0CD4 : 0F; + 0CD5 : B4; + 0CD6 : 6F; + 0CD7 : 88; + 0CD8 : 30; + 0CD9 : F6; + 0CDA : 7D; + 0CDB : F2; + 0CDC : CC; + 0CDD : 90; + 0CDE : F8; + 0CDF : 18; + 0CE0 : E6; + 0CE1 : 72; + 0CE2 : D0; + 0CE3 : F3; + 0CE4 : 48; + 0CE5 : AE; + 0CE6 : 77; + 0CE7 : 02; + 0CE8 : A5; + 0CE9 : 72; + 0CEA : 9D; + 0CEB : 80; + 0CEC : 02; + 0CED : 68; + 0CEE : 9D; + 0CEF : 85; + 0CF0 : 02; + 0CF1 : 60; + 0CF2 : 01; + 0CF3 : 0A; + 0CF4 : 64; + 0CF5 : 20; + 0CF6 : F5; + 0CF7 : CD; + 0CF8 : 20; + 0CF9 : 5F; + 0CFA : EF; + 0CFB : 4C; + 0CFC : 94; + 0CFD : C1; + 0CFE : A9; + 0CFF : 01; + 0D00 : 8D; + 0D01 : F9; + 0D02 : 02; + 0D03 : 20; + 0D04 : F5; + 0D05 : CD; + 0D06 : A5; + 0D07 : 81; + 0D08 : 48; + 0D09 : 20; + 0D0A : FA; + 0D0B : F1; + 0D0C : F0; + 0D0D : 0B; + 0D0E : 68; + 0D0F : C5; + 0D10 : 81; + 0D11 : D0; + 0D12 : 19; + 0D13 : 20; + 0D14 : 90; + 0D15 : EF; + 0D16 : 4C; + 0D17 : 94; + 0D18 : C1; + 0D19 : 68; + 0D1A : A9; + 0D1B : 00; + 0D1C : 85; + 0D1D : 81; + 0D1E : E6; + 0D1F : 80; + 0D20 : A5; + 0D21 : 80; + 0D22 : CD; + 0D23 : D7; + 0D24 : FE; + 0D25 : B0; + 0D26 : 0A; + 0D27 : 20; + 0D28 : FA; + 0D29 : F1; + 0D2A : F0; + 0D2B : EE; + 0D2C : A9; + 0D2D : 65; + 0D2E : 20; + 0D2F : 45; + 0D30 : E6; + 0D31 : A9; + 0D32 : 65; + 0D33 : 20; + 0D34 : C8; + 0D35 : C1; + 0D36 : 20; + 0D37 : F2; + 0D38 : CD; + 0D39 : 4C; + 0D3A : 60; + 0D3B : D4; + 0D3C : 20; + 0D3D : 2F; + 0D3E : D1; + 0D3F : A1; + 0D40 : 99; + 0D41 : 60; + 0D42 : 20; + 0D43 : 36; + 0D44 : CD; + 0D45 : A9; + 0D46 : 00; + 0D47 : 20; + 0D48 : C8; + 0D49 : D4; + 0D4A : 20; + 0D4B : 3C; + 0D4C : CD; + 0D4D : 99; + 0D4E : 44; + 0D4F : 02; + 0D50 : A9; + 0D51 : 89; + 0D52 : 99; + 0D53 : F2; + 0D54 : 00; + 0D55 : 60; + 0D56 : 20; + 0D57 : 42; + 0D58 : CD; + 0D59 : 20; + 0D5A : EC; + 0D5B : D3; + 0D5C : 4C; + 0D5D : 94; + 0D5E : C1; + 0D5F : 20; + 0D60 : 6F; + 0D61 : CC; + 0D62 : 20; + 0D63 : 42; + 0D64 : CD; + 0D65 : B9; + 0D66 : 44; + 0D67 : 02; + 0D68 : 99; + 0D69 : 3E; + 0D6A : 02; + 0D6B : A9; + 0D6C : FF; + 0D6D : 99; + 0D6E : 44; + 0D6F : 02; + 0D70 : 4C; + 0D71 : 94; + 0D72 : C1; + 0D73 : 20; + 0D74 : F2; + 0D75 : CD; + 0D76 : 20; + 0D77 : E8; + 0D78 : D4; + 0D79 : A8; + 0D7A : 88; + 0D7B : C9; + 0D7C : 02; + 0D7D : B0; + 0D7E : 02; + 0D7F : A0; + 0D80 : 01; + 0D81 : A9; + 0D82 : 00; + 0D83 : 20; + 0D84 : C8; + 0D85 : D4; + 0D86 : 98; + 0D87 : 20; + 0D88 : F1; + 0D89 : CF; + 0D8A : 8A; + 0D8B : 48; + 0D8C : 20; + 0D8D : 64; + 0D8E : D4; + 0D8F : 68; + 0D90 : AA; + 0D91 : 20; + 0D92 : EE; + 0D93 : D3; + 0D94 : 4C; + 0D95 : 94; + 0D96 : C1; + 0D97 : 20; + 0D98 : 6F; + 0D99 : CC; + 0D9A : 20; + 0D9B : F2; + 0D9C : CD; + 0D9D : 20; + 0D9E : 64; + 0D9F : D4; + 0DA0 : 4C; + 0DA1 : 94; + 0DA2 : C1; + 0DA3 : 20; + 0DA4 : 58; + 0DA5 : F2; + 0DA6 : 20; + 0DA7 : 36; + 0DA8 : CD; + 0DA9 : A9; + 0DAA : 00; + 0DAB : 85; + 0DAC : 6F; + 0DAD : A6; + 0DAE : F9; + 0DAF : BD; + 0DB0 : E0; + 0DB1 : FE; + 0DB2 : 85; + 0DB3 : 70; + 0DB4 : 20; + 0DB5 : BA; + 0DB6 : CD; + 0DB7 : 4C; + 0DB8 : 94; + 0DB9 : C1; + 0DBA : 6C; + 0DBB : 6F; + 0DBC : 00; + 0DBD : 20; + 0DBE : D2; + 0DBF : CD; + 0DC0 : A5; + 0DC1 : F9; + 0DC2 : 0A; + 0DC3 : AA; + 0DC4 : AD; + 0DC5 : 86; + 0DC6 : 02; + 0DC7 : 95; + 0DC8 : 99; + 0DC9 : 20; + 0DCA : 2F; + 0DCB : D1; + 0DCC : 20; + 0DCD : EE; + 0DCE : D3; + 0DCF : 4C; + 0DD0 : 94; + 0DD1 : C1; + 0DD2 : A6; + 0DD3 : D3; + 0DD4 : E6; + 0DD5 : D3; + 0DD6 : BD; + 0DD7 : 85; + 0DD8 : 02; + 0DD9 : A8; + [0DDA..0DDB] : 88; + 0DDC : C0; + 0DDD : 0C; + 0DDE : 90; + 0DDF : 05; + 0DE0 : A9; + 0DE1 : 70; + 0DE2 : 4C; + 0DE3 : C8; + 0DE4 : C1; + 0DE5 : 85; + 0DE6 : 83; + 0DE7 : 20; + 0DE8 : EB; + 0DE9 : D0; + 0DEA : B0; + 0DEB : F4; + 0DEC : 20; + 0DED : 93; + 0DEE : DF; + 0DEF : 85; + 0DF0 : F9; + 0DF1 : 60; + 0DF2 : 20; + 0DF3 : D2; + 0DF4 : CD; + 0DF5 : A6; + 0DF6 : D3; + 0DF7 : BD; + 0DF8 : 85; + 0DF9 : 02; + 0DFA : 29; + 0DFB : 01; + 0DFC : 85; + 0DFD : 7F; + 0DFE : BD; + 0DFF : 87; + 0E00 : 02; + 0E01 : 85; + 0E02 : 81; + 0E03 : BD; + 0E04 : 86; + 0E05 : 02; + 0E06 : 85; + 0E07 : 80; + 0E08 : 20; + 0E09 : 5F; + 0E0A : D5; + 0E0B : 4C; + 0E0C : 00; + 0E0D : C1; + 0E0E : 20; + 0E0F : 2C; + 0E10 : CE; + 0E11 : 20; + 0E12 : 6E; + 0E13 : CE; + 0E14 : A5; + 0E15 : 90; + 0E16 : 85; + 0E17 : D7; + 0E18 : 20; + 0E19 : 71; + 0E1A : CE; + 0E1B : E6; + 0E1C : D7; + 0E1D : E6; + 0E1E : D7; + 0E1F : A5; + 0E20 : 8B; + 0E21 : 85; + 0E22 : D5; + 0E23 : A5; + 0E24 : 90; + 0E25 : 0A; + 0E26 : 18; + 0E27 : 69; + 0E28 : 10; + 0E29 : 85; + 0E2A : D6; + 0E2B : 60; + 0E2C : 20; + 0E2D : D9; + 0E2E : CE; + 0E2F : 85; + 0E30 : 92; + 0E31 : A6; + 0E32 : 82; + [0E33..0E34] : B5; + 0E35 : 85; + 0E36 : 90; + 0E37 : B5; + 0E38 : BB; + 0E39 : 85; + 0E3A : 91; + 0E3B : D0; + 0E3C : 04; + 0E3D : A5; + 0E3E : 90; + 0E3F : F0; + 0E40 : 0B; + 0E41 : A5; + 0E42 : 90; + 0E43 : 38; + 0E44 : E9; + 0E45 : 01; + 0E46 : 85; + 0E47 : 90; + 0E48 : B0; + 0E49 : 02; + 0E4A : C6; + 0E4B : 91; + 0E4C : B5; + 0E4D : C7; + 0E4E : 85; + 0E4F : 6F; + 0E50 : 46; + 0E51 : 6F; + 0E52 : 90; + 0E53 : 03; + 0E54 : 20; + 0E55 : ED; + 0E56 : CE; + 0E57 : 20; + 0E58 : E5; + 0E59 : CE; + 0E5A : A5; + 0E5B : 6F; + 0E5C : D0; + 0E5D : F2; + 0E5E : A5; + 0E5F : D4; + 0E60 : 18; + 0E61 : 65; + 0E62 : 8B; + 0E63 : 85; + 0E64 : 8B; + 0E65 : 90; + 0E66 : 06; + 0E67 : E6; + 0E68 : 8C; + 0E69 : D0; + 0E6A : 02; + 0E6B : E6; + 0E6C : 8D; + 0E6D : 60; + 0E6E : A9; + 0E6F : FE; + 0E70 : 2C; + 0E71 : A9; + 0E72 : 78; + 0E73 : 85; + 0E74 : 6F; + 0E75 : A2; + 0E76 : 03; + 0E77 : B5; + 0E78 : 8F; + 0E79 : 48; + 0E7A : B5; + 0E7B : 8A; + 0E7C : 95; + 0E7D : 8F; + 0E7E : 68; + 0E7F : 95; + 0E80 : 8A; + 0E81 : CA; + 0E82 : D0; + 0E83 : F3; + 0E84 : 20; + 0E85 : D9; + 0E86 : CE; + 0E87 : A2; + 0E88 : 00; + 0E89 : B5; + 0E8A : 90; + 0E8B : 95; + 0E8C : 8F; + 0E8D : E8; + 0E8E : E0; + 0E8F : 04; + 0E90 : 90; + 0E91 : F7; + 0E92 : A9; + 0E93 : 00; + 0E94 : 85; + 0E95 : 92; + 0E96 : 24; + 0E97 : 6F; + 0E98 : 30; + 0E99 : 09; + 0E9A : 06; + 0E9B : 8F; + 0E9C : 08; + 0E9D : 46; + 0E9E : 8F; + 0E9F : 28; + 0EA0 : 20; + 0EA1 : E6; + 0EA2 : CE; + 0EA3 : 20; + 0EA4 : ED; + 0EA5 : CE; + 0EA6 : 20; + 0EA7 : E5; + 0EA8 : CE; + 0EA9 : 24; + 0EAA : 6F; + 0EAB : 30; + 0EAC : 03; + 0EAD : 20; + 0EAE : E2; + 0EAF : CE; + 0EB0 : A5; + 0EB1 : 8F; + 0EB2 : 18; + 0EB3 : 65; + 0EB4 : 90; + 0EB5 : 85; + [0EB6..0EB7] : 90; + 0EB8 : 06; + 0EB9 : E6; + 0EBA : 91; + 0EBB : D0; + 0EBC : 02; + 0EBD : E6; + 0EBE : 92; + 0EBF : A5; + 0EC0 : 92; + 0EC1 : 05; + 0EC2 : 91; + 0EC3 : D0; + 0EC4 : C2; + 0EC5 : A5; + 0EC6 : 90; + 0EC7 : 38; + 0EC8 : E5; + 0EC9 : 6F; + 0ECA : 90; + 0ECB : 0C; + 0ECC : E6; + 0ECD : 8B; + 0ECE : D0; + 0ECF : 06; + 0ED0 : E6; + 0ED1 : 8C; + 0ED2 : D0; + 0ED3 : 02; + 0ED4 : E6; + 0ED5 : 8D; + 0ED6 : 85; + 0ED7 : 90; + 0ED8 : 60; + 0ED9 : A9; + 0EDA : 00; + 0EDB : 85; + 0EDC : 8B; + 0EDD : 85; + 0EDE : 8C; + 0EDF : 85; + 0EE0 : 8D; + 0EE1 : 60; + 0EE2 : 20; + 0EE3 : E5; + 0EE4 : CE; + 0EE5 : 18; + 0EE6 : 26; + 0EE7 : 90; + 0EE8 : 26; + 0EE9 : 91; + 0EEA : 26; + 0EEB : 92; + 0EEC : 60; + 0EED : 18; + 0EEE : A2; + 0EEF : FD; + 0EF0 : B5; + 0EF1 : 8E; + 0EF2 : 75; + 0EF3 : 93; + 0EF4 : 95; + 0EF5 : 8E; + 0EF6 : E8; + 0EF7 : D0; + 0EF8 : F7; + 0EF9 : 60; + 0EFA : A2; + 0EFB : 00; + 0EFC : 8A; + 0EFD : 95; + 0EFE : FA; + 0EFF : E8; + 0F00 : E0; + 0F01 : 04; + 0F02 : D0; + 0F03 : F8; + 0F04 : A9; + 0F05 : 06; + 0F06 : 95; + 0F07 : FA; + 0F08 : 60; + 0F09 : A0; + 0F0A : 04; + 0F0B : A6; + 0F0C : 82; + 0F0D : B9; + 0F0E : FA; + 0F0F : 00; + 0F10 : 96; + 0F11 : FA; + 0F12 : C5; + 0F13 : 82; + 0F14 : F0; + 0F15 : 07; + 0F16 : 88; + 0F17 : 30; + 0F18 : E1; + 0F19 : AA; + 0F1A : 4C; + 0F1B : 0D; + 0F1C : CF; + 0F1D : 60; + 0F1E : 20; + 0F1F : 09; + 0F20 : CF; + 0F21 : 20; + 0F22 : B7; + 0F23 : DF; + 0F24 : D0; + 0F25 : 46; + 0F26 : 20; + 0F27 : D3; + 0F28 : D1; + 0F29 : 20; + 0F2A : 8E; + 0F2B : D2; + 0F2C : 30; + 0F2D : 48; + 0F2E : 20; + 0F2F : C2; + 0F30 : DF; + 0F31 : A5; + 0F32 : 80; + 0F33 : 48; + 0F34 : A5; + 0F35 : 81; + 0F36 : 48; + 0F37 : A9; + 0F38 : 01; + 0F39 : 20; + 0F3A : F6; + 0F3B : D4; + 0F3C : 85; + 0F3D : 81; + 0F3E : A9; + 0F3F : 00; + 0F40 : 20; + 0F41 : F6; + 0F42 : D4; + 0F43 : 85; + 0F44 : 80; + 0F45 : F0; + 0F46 : 1F; + 0F47 : 20; + 0F48 : 25; + 0F49 : D1; + 0F4A : F0; + 0F4B : 0B; + 0F4C : 20; + 0F4D : AB; + 0F4E : DD; + 0F4F : D0; + 0F50 : 06; + 0F51 : 20; + 0F52 : 8C; + 0F53 : CF; + 0F54 : 4C; + 0F55 : 5D; + 0F56 : CF; + 0F57 : 20; + 0F58 : 8C; + 0F59 : CF; + 0F5A : 20; + 0F5B : 57; + 0F5C : DE; + 0F5D : 68; + 0F5E : 85; + 0F5F : 81; + 0F60 : 68; + 0F61 : 85; + 0F62 : 80; + 0F63 : 4C; + 0F64 : 6F; + 0F65 : CF; + 0F66 : 68; + 0F67 : 85; + 0F68 : 81; + 0F69 : 68; + 0F6A : 85; + 0F6B : 80; + 0F6C : 20; + 0F6D : 8C; + 0F6E : CF; + 0F6F : 20; + 0F70 : 93; + 0F71 : DF; + 0F72 : AA; + 0F73 : 4C; + 0F74 : 99; + 0F75 : D5; + 0F76 : A9; + 0F77 : 70; + 0F78 : 4C; + 0F79 : C8; + 0F7A : C1; + 0F7B : 20; + 0F7C : 09; + 0F7D : CF; + 0F7E : 20; + 0F7F : B7; + 0F80 : DF; + 0F81 : D0; + 0F82 : 08; + 0F83 : 20; + 0F84 : 8E; + 0F85 : D2; + 0F86 : 30; + 0F87 : EE; + 0F88 : 20; + 0F89 : C2; + 0F8A : DF; + 0F8B : 60; + 0F8C : A6; + 0F8D : 82; + 0F8E : B5; + 0F8F : A7; + 0F90 : 49; + 0F91 : 80; + 0F92 : 95; + 0F93 : A7; + 0F94 : B5; + 0F95 : AE; + 0F96 : 49; + 0F97 : 80; + 0F98 : 95; + 0F99 : AE; + 0F9A : 60; + 0F9B : A2; + 0F9C : 12; + 0F9D : 86; + 0F9E : 83; + 0F9F : 20; + 0FA0 : 07; + 0FA1 : D1; + 0FA2 : 20; + 0FA3 : 00; + 0FA4 : C1; + 0FA5 : 20; + 0FA6 : 25; + 0FA7 : D1; + 0FA8 : 90; + 0FA9 : 05; + 0FAA : A9; + [0FAB..0FAC] : 20; + 0FAD : 9D; + 0FAE : DD; + 0FAF : A5; + 0FB0 : 83; + 0FB1 : C9; + 0FB2 : 0F; + 0FB3 : F0; + 0FB4 : 23; + 0FB5 : D0; + 0FB6 : 08; + 0FB7 : A5; + 0FB8 : 84; + 0FB9 : 29; + 0FBA : 8F; + 0FBB : C9; + 0FBC : 0F; + 0FBD : B0; + 0FBE : 19; + 0FBF : 20; + 0FC0 : 25; + 0FC1 : D1; + 0FC2 : B0; + 0FC3 : 05; + 0FC4 : A5; + 0FC5 : 85; + 0FC6 : 4C; + 0FC7 : 9D; + 0FC8 : D1; + 0FC9 : D0; + 0FCA : 03; + 0FCB : 4C; + 0FCC : AB; + 0FCD : E0; + 0FCE : A5; + 0FCF : 85; + 0FD0 : 20; + 0FD1 : F1; + 0FD2 : CF; + 0FD3 : A4; + 0FD4 : 82; + 0FD5 : 4C; + 0FD6 : EE; + 0FD7 : D3; + 0FD8 : A9; + 0FD9 : 04; + 0FDA : 85; + 0FDB : 82; + 0FDC : 20; + 0FDD : E8; + 0FDE : D4; + 0FDF : C9; + 0FE0 : 2A; + 0FE1 : F0; + 0FE2 : 05; + 0FE3 : A5; + 0FE4 : 85; + 0FE5 : 20; + 0FE6 : F1; + 0FE7 : CF; + 0FE8 : A5; + 0FE9 : F8; + 0FEA : F0; + 0FEB : 01; + 0FEC : 60; + 0FED : EE; + 0FEE : 55; + 0FEF : 02; + 0FF0 : 60; + 0FF1 : 48; + 0FF2 : 20; + 0FF3 : 93; + 0FF4 : DF; + 0FF5 : 10; + 0FF6 : 06; + 0FF7 : 68; + 0FF8 : A9; + 0FF9 : 61; + 0FFA : 4C; + 0FFB : C8; + 0FFC : C1; + 0FFD : 0A; + 0FFE : AA; + 0FFF : 68; + 1000 : 81; + 1001 : 99; + 1002 : F6; + 1003 : 99; + 1004 : 60; + 1005 : 20; + 1006 : D1; + 1007 : C1; + 1008 : 20; + 1009 : 42; + 100A : D0; + 100B : 4C; + 100C : 94; + 100D : C1; + 100E : 20; + 100F : 0F; + 1010 : F1; + 1011 : A8; + 1012 : B6; + 1013 : A7; + 1014 : E0; + 1015 : FF; + 1016 : D0; + 1017 : 14; + 1018 : 48; + 1019 : 20; + 101A : 8E; + 101B : D2; + 101C : AA; + 101D : 10; + 101E : 05; + 101F : A9; + 1020 : 70; + 1021 : 20; + 1022 : 48; + 1023 : E6; + 1024 : 68; + 1025 : A8; + 1026 : 8A; + 1027 : 09; + 1028 : 80; + 1029 : 99; + 102A : A7; + 102B : 00; + 102C : 8A; + 102D : 29; + 102E : 0F; + 102F : 85; + 1030 : F9; + 1031 : A2; + 1032 : 00; + 1033 : 86; + 1034 : 81; + 1035 : AE; + 1036 : 85; + 1037 : FE; + 1038 : 86; + 1039 : 80; + 103A : 20; + 103B : D3; + 103C : D6; + 103D : A9; + 103E : B0; + 103F : 4C; + 1040 : 8C; + 1041 : D5; + 1042 : 20; + 1043 : D1; + 1044 : F0; + 1045 : 20; + 1046 : 13; + 1047 : D3; + 1048 : 20; + 1049 : 0E; + 104A : D0; + 104B : A6; + 104C : 7F; + 104D : A9; + 104E : 00; + 104F : 9D; + 1050 : 51; + 1051 : 02; + 1052 : 8A; + 1053 : 0A; + 1054 : AA; + 1055 : A5; + 1056 : 16; + 1057 : 95; + 1058 : 12; + 1059 : A5; + 105A : 17; + 105B : 95; + 105C : 13; + 105D : 20; + 105E : 86; + 105F : D5; + 1060 : A5; + 1061 : F9; + 1062 : 0A; + 1063 : AA; + 1064 : A9; + 1065 : 02; + 1066 : 95; + 1067 : 99; + 1068 : A1; + 1069 : 99; + 106A : A6; + 106B : 7F; + 106C : 9D; + [106D..106E] : 01; + 106F : A9; + 1070 : 00; + 1071 : 95; + 1072 : 1C; + 1073 : 95; + 1074 : FF; + 1075 : 20; + 1076 : 3A; + 1077 : EF; + 1078 : A0; + 1079 : 04; + 107A : A9; + 107B : 00; + 107C : AA; + 107D : 18; + 107E : 71; + 107F : 6D; + 1080 : 90; + 1081 : 01; + 1082 : E8; + [1083..1086] : C8; + 1087 : C0; + 1088 : 48; + 1089 : F0; + 108A : F8; + 108B : C0; + 108C : 90; + 108D : D0; + 108E : EE; + 108F : 48; + 1090 : 8A; + 1091 : A6; + 1092 : 7F; + 1093 : 9D; + 1094 : FC; + 1095 : 02; + 1096 : 68; + 1097 : 9D; + 1098 : FA; + 1099 : 02; + 109A : 60; + 109B : 20; + 109C : D0; + 109D : D6; + 109E : 20; + 109F : C3; + 10A0 : D0; + 10A1 : 20; + 10A2 : 99; + 10A3 : D5; + 10A4 : 20; + 10A5 : 37; + 10A6 : D1; + 10A7 : 85; + 10A8 : 80; + 10A9 : 20; + 10AA : 37; + 10AB : D1; + 10AC : 85; + 10AD : 81; + 10AE : 60; + 10AF : 20; + 10B0 : 9B; + 10B1 : D0; + 10B2 : A5; + 10B3 : 80; + 10B4 : D0; + 10B5 : 01; + 10B6 : 60; + 10B7 : 20; + 10B8 : 1E; + 10B9 : CF; + 10BA : 20; + 10BB : D0; + 10BC : D6; + 10BD : 20; + 10BE : C3; + 10BF : D0; + 10C0 : 4C; + 10C1 : 1E; + 10C2 : CF; + 10C3 : A9; + 10C4 : 80; + 10C5 : D0; + 10C6 : 02; + 10C7 : A9; + 10C8 : 90; + 10C9 : 8D; + 10CA : 4D; + 10CB : 02; + 10CC : 20; + 10CD : 93; + 10CE : DF; + 10CF : AA; + 10D0 : 20; + 10D1 : 06; + 10D2 : D5; + 10D3 : 8A; + 10D4 : 48; + 10D5 : 0A; + 10D6 : AA; + 10D7 : A9; + 10D8 : 00; + 10D9 : 95; + 10DA : 99; + 10DB : 20; + 10DC : 25; + 10DD : D1; + 10DE : C9; + 10DF : 04; + 10E0 : B0; + 10E1 : 06; + 10E2 : F6; + 10E3 : B5; + 10E4 : D0; + 10E5 : 02; + 10E6 : F6; + 10E7 : BB; + 10E8 : 68; + 10E9 : AA; + 10EA : 60; + 10EB : A5; + 10EC : 83; + 10ED : C9; + 10EE : 13; + 10EF : 90; + 10F0 : 02; + 10F1 : 29; + 10F2 : 0F; + 10F3 : C9; + 10F4 : 0F; + 10F5 : D0; + 10F6 : 02; + 10F7 : A9; + 10F8 : 10; + 10F9 : AA; + 10FA : 38; + 10FB : BD; + 10FC : 2B; + 10FD : 02; + 10FE : 30; + 10FF : 06; + 1100 : 29; + 1101 : 0F; + 1102 : 85; + 1103 : 82; + 1104 : AA; + 1105 : 18; + 1106 : 60; + 1107 : A5; + 1108 : 83; + 1109 : C9; + 110A : 13; + 110B : 90; + 110C : 02; + 110D : 29; + 110E : 0F; + 110F : AA; + 1110 : BD; + 1111 : 2B; + 1112 : 02; + 1113 : A8; + 1114 : 0A; + 1115 : 90; + 1116 : 0A; + 1117 : 30; + 1118 : 0A; + 1119 : 98; + 111A : 29; + 111B : 0F; + 111C : 85; + 111D : 82; + 111E : AA; + 111F : 18; + 1120 : 60; + 1121 : 30; + 1122 : F6; + 1123 : 38; + 1124 : 60; + 1125 : A6; + 1126 : 82; + 1127 : B5; + 1128 : EC; + 1129 : 4A; + 112A : 29; + 112B : 07; + 112C : C9; + 112D : 04; + 112E : 60; + 112F : 20; + 1130 : 93; + 1131 : DF; + 1132 : 0A; + 1133 : AA; + 1134 : A4; + 1135 : 82; + 1136 : 60; + 1137 : 20; + 1138 : 2F; + 1139 : D1; + 113A : B9; + 113B : 44; + 113C : 02; + 113D : F0; + 113E : 12; + 113F : A1; + 1140 : 99; + 1141 : 48; + 1142 : B5; + 1143 : 99; + 1144 : D9; + 1145 : 44; + 1146 : 02; + 1147 : D0; + 1148 : 04; + 1149 : A9; + 114A : FF; + 114B : 95; + 114C : 99; + 114D : 68; + 114E : F6; + 114F : 99; + 1150 : 60; + 1151 : A1; + 1152 : 99; + 1153 : F6; + 1154 : 99; + 1155 : 60; + 1156 : 20; + 1157 : 37; + 1158 : D1; + 1159 : D0; + 115A : 36; + [115B..115C] : 85; + 115D : B9; + 115E : 44; + 115F : 02; + 1160 : F0; + 1161 : 08; + 1162 : A9; + 1163 : 80; + 1164 : 99; + 1165 : F2; + 1166 : 00; + 1167 : A5; + 1168 : 85; + 1169 : 60; + 116A : 20; + 116B : 1E; + 116C : CF; + 116D : A9; + 116E : 00; + 116F : 20; + 1170 : C8; + 1171 : D4; + 1172 : 20; + 1173 : 37; + 1174 : D1; + 1175 : C9; + 1176 : 00; + 1177 : F0; + 1178 : 19; + 1179 : 85; + 117A : 80; + 117B : 20; + 117C : 37; + 117D : D1; + 117E : 85; + 117F : 81; + 1180 : 20; + 1181 : 1E; + 1182 : CF; + 1183 : 20; + 1184 : D3; + 1185 : D1; + 1186 : 20; + 1187 : D0; + 1188 : D6; + 1189 : 20; + 118A : C3; + 118B : D0; + 118C : 20; + 118D : 1E; + 118E : CF; + 118F : A5; + 1190 : 85; + 1191 : 60; + 1192 : 20; + 1193 : 37; + 1194 : D1; + 1195 : A4; + 1196 : 82; + 1197 : 99; + 1198 : 44; + 1199 : 02; + 119A : A5; + 119B : 85; + 119C : 60; + 119D : 20; + 119E : F1; + 119F : CF; + 11A0 : F0; + 11A1 : 01; + 11A2 : 60; + 11A3 : 20; + 11A4 : D3; + 11A5 : D1; + 11A6 : 20; + 11A7 : 1E; + 11A8 : F1; + 11A9 : A9; + 11AA : 00; + 11AB : 20; + 11AC : C8; + 11AD : D4; + 11AE : A5; + 11AF : 80; + 11B0 : 20; + 11B1 : F1; + 11B2 : CF; + 11B3 : A5; + 11B4 : 81; + 11B5 : 20; + 11B6 : F1; + 11B7 : CF; + 11B8 : 20; + 11B9 : C7; + 11BA : D0; + 11BB : 20; + 11BC : 1E; + 11BD : CF; + 11BE : 20; + 11BF : D0; + 11C0 : D6; + 11C1 : A9; + 11C2 : 02; + 11C3 : 4C; + 11C4 : C8; + 11C5 : D4; + 11C6 : 85; + 11C7 : 6F; + 11C8 : 20; + 11C9 : E8; + 11CA : D4; + 11CB : 18; + 11CC : 65; + 11CD : 6F; + 11CE : 95; + 11CF : 99; + 11D0 : 85; + 11D1 : 94; + 11D2 : 60; + 11D3 : 20; + 11D4 : 93; + 11D5 : DF; + 11D6 : AA; + 11D7 : BD; + 11D8 : 5B; + 11D9 : 02; + 11DA : 29; + 11DB : 01; + 11DC : 85; + 11DD : 7F; + 11DE : 60; + 11DF : 38; + 11E0 : B0; + 11E1 : 01; + 11E2 : 18; + 11E3 : 08; + 11E4 : 85; + 11E5 : 6F; + 11E6 : 20; + 11E7 : 27; + 11E8 : D2; + 11E9 : 20; + 11EA : 7F; + 11EB : D3; + 11EC : 85; + 11ED : 82; + 11EE : A6; + 11EF : 83; + 11F0 : 28; + 11F1 : 90; + 11F2 : 02; + 11F3 : 09; + 11F4 : 80; + 11F5 : 9D; + 11F6 : 2B; + 11F7 : 02; + 11F8 : 29; + 11F9 : 3F; + 11FA : A8; + 11FB : A9; + 11FC : FF; + 11FD : 99; + 11FE : A7; + 11FF : 00; + 1200 : 99; + 1201 : AE; + 1202 : 00; + 1203 : 99; + 1204 : CD; + 1205 : 00; + 1206 : C6; + 1207 : 6F; + 1208 : 30; + 1209 : 1C; + 120A : 20; + 120B : 8E; + 120C : D2; + 120D : 10; + 120E : 08; + 120F : 20; + 1210 : 5A; + 1211 : D2; + 1212 : A9; + 1213 : 70; + 1214 : 4C; + 1215 : C8; + 1216 : C1; + 1217 : 99; + 1218 : A7; + 1219 : 00; + 121A : C6; + 121B : 6F; + 121C : 30; + 121D : 08; + 121E : 20; + 121F : 8E; + 1220 : D2; + 1221 : 30; + 1222 : EC; + 1223 : 99; + 1224 : AE; + 1225 : 00; + 1226 : 60; + 1227 : A5; + 1228 : 83; + 1229 : C9; + 122A : 0F; + 122B : D0; + 122C : 01; + 122D : 60; + 122E : A6; + 122F : 83; + 1230 : BD; + 1231 : 2B; + 1232 : 02; + 1233 : C9; + 1234 : FF; + 1235 : F0; + 1236 : 22; + 1237 : 29; + 1238 : 3F; + 1239 : 85; + 123A : 82; + 123B : A9; + 123C : FF; + 123D : 9D; + 123E : 2B; + 123F : 02; + 1240 : A6; + 1241 : 82; + 1242 : A9; + 1243 : 00; + 1244 : 95; + 1245 : F2; + 1246 : 20; + 1247 : 5A; + 1248 : D2; + 1249 : A6; + 124A : 82; + 124B : A9; + 124C : 01; + 124D : CA; + 124E : 30; + 124F : 03; + 1250 : 0A; + 1251 : D0; + 1252 : FA; + 1253 : 0D; + 1254 : 56; + 1255 : 02; + 1256 : 8D; + 1257 : 56; + 1258 : 02; + 1259 : 60; + 125A : A6; + 125B : 82; + 125C : B5; + 125D : A7; + 125E : C9; + 125F : FF; + 1260 : F0; + 1261 : 09; + 1262 : 48; + 1263 : A9; + 1264 : FF; + 1265 : 95; + 1266 : A7; + 1267 : 68; + 1268 : 20; + 1269 : F3; + 126A : D2; + 126B : A6; + 126C : 82; + 126D : B5; + 126E : AE; + 126F : C9; + 1270 : FF; + 1271 : F0; + 1272 : 09; + 1273 : 48; + 1274 : A9; + 1275 : FF; + 1276 : 95; + 1277 : AE; + 1278 : 68; + 1279 : 20; + 127A : F3; + 127B : D2; + 127C : A6; + 127D : 82; + 127E : B5; + 127F : CD; + 1280 : C9; + 1281 : FF; + 1282 : F0; + 1283 : 09; + 1284 : 48; + 1285 : A9; + 1286 : FF; + 1287 : 95; + 1288 : CD; + 1289 : 68; + 128A : 20; + 128B : F3; + 128C : D2; + 128D : 60; + 128E : 98; + 128F : 48; + 1290 : A0; + 1291 : 01; + 1292 : 20; + 1293 : BA; + 1294 : D2; + 1295 : 10; + 1296 : 0C; + 1297 : 88; + 1298 : 20; + 1299 : BA; + 129A : D2; + 129B : 10; + 129C : 06; + 129D : 20; + 129E : 39; + 129F : D3; + 12A0 : AA; + 12A1 : 30; + 12A2 : 13; + 12A3 : B5; + 12A4 : 00; + 12A5 : 30; + 12A6 : FC; + 12A7 : A5; + 12A8 : 7F; + 12A9 : 95; + 12AA : 00; + 12AB : 9D; + 12AC : 5B; + 12AD : 02; + 12AE : 8A; + 12AF : 0A; + 12B0 : A8; + 12B1 : A9; + 12B2 : 02; + [12B3..12B4] : 99; + 12B5 : 00; + 12B6 : 68; + 12B7 : A8; + 12B8 : 8A; + 12B9 : 60; + 12BA : A2; + 12BB : 07; + 12BC : B9; + 12BD : 4F; + 12BE : 02; + 12BF : 3D; + 12C0 : E9; + 12C1 : EF; + 12C2 : F0; + 12C3 : 04; + 12C4 : CA; + 12C5 : 10; + 12C6 : F5; + 12C7 : 60; + 12C8 : B9; + 12C9 : 4F; + 12CA : 02; + 12CB : 5D; + 12CC : E9; + 12CD : EF; + 12CE : 99; + 12CF : 4F; + 12D0 : 02; + 12D1 : 8A; + 12D2 : 88; + 12D3 : 30; + 12D4 : 03; + 12D5 : 18; + 12D6 : 69; + 12D7 : 08; + 12D8 : AA; + 12D9 : 60; + 12DA : A6; + 12DB : 82; + 12DC : B5; + 12DD : A7; + 12DE : 30; + 12DF : 09; + 12E0 : 8A; + 12E1 : 18; + 12E2 : 69; + 12E3 : 07; + 12E4 : AA; + 12E5 : B5; + 12E6 : A7; + 12E7 : 10; + 12E8 : F0; + 12E9 : C9; + 12EA : FF; + 12EB : F0; + 12EC : EC; + 12ED : 48; + 12EE : A9; + 12EF : FF; + 12F0 : 95; + 12F1 : A7; + 12F2 : 68; + 12F3 : 29; + 12F4 : 0F; + 12F5 : A8; + 12F6 : C8; + 12F7 : A2; + 12F8 : 10; + 12F9 : 6E; + 12FA : 50; + 12FB : 02; + 12FC : 6E; + 12FD : 4F; + 12FE : 02; + 12FF : 88; + 1300 : D0; + 1301 : 01; + 1302 : 18; + 1303 : CA; + 1304 : 10; + 1305 : F3; + 1306 : 60; + 1307 : A9; + 1308 : 0E; + 1309 : 85; + 130A : 83; + 130B : 20; + 130C : 27; + 130D : D2; + 130E : C6; + 130F : 83; + 1310 : D0; + 1311 : F9; + 1312 : 60; + 1313 : A9; + 1314 : 0E; + 1315 : 85; + 1316 : 83; + 1317 : A6; + 1318 : 83; + 1319 : BD; + 131A : 2B; + 131B : 02; + 131C : C9; + 131D : FF; + 131E : F0; + 131F : 14; + 1320 : 29; + 1321 : 3F; + 1322 : 85; + 1323 : 82; + 1324 : 20; + 1325 : 93; + 1326 : DF; + 1327 : AA; + 1328 : BD; + 1329 : 5B; + 132A : 02; + 132B : 29; + 132C : 01; + 132D : C5; + 132E : 7F; + 132F : D0; + 1330 : 03; + 1331 : 20; + 1332 : 27; + 1333 : D2; + 1334 : C6; + 1335 : 83; + 1336 : 10; + 1337 : DF; + 1338 : 60; + 1339 : A5; + 133A : 6F; + 133B : 48; + 133C : A0; + 133D : 00; + 133E : B6; + 133F : FA; + 1340 : B5; + 1341 : A7; + 1342 : 10; + 1343 : 04; + 1344 : C9; + 1345 : FF; + 1346 : D0; + 1347 : 16; + 1348 : 8A; + 1349 : 18; + 134A : 69; + 134B : 07; + 134C : AA; + 134D : B5; + 134E : A7; + 134F : 10; + 1350 : 04; + 1351 : C9; + 1352 : FF; + 1353 : D0; + 1354 : 09; + 1355 : C8; + 1356 : C0; + 1357 : 05; + 1358 : 90; + 1359 : E4; + 135A : A2; + 135B : FF; + 135C : D0; + 135D : 1C; + 135E : 86; + 135F : 6F; + 1360 : 29; + 1361 : 3F; + 1362 : AA; + 1363 : B5; + 1364 : 00; + 1365 : 30; + 1366 : FC; + 1367 : C9; + 1368 : 02; + 1369 : 90; + 136A : 08; + 136B : A6; + 136C : 6F; + 136D : E0; + 136E : 07; + 136F : 90; + 1370 : D7; + 1371 : B0; + 1372 : E2; + 1373 : A4; + 1374 : 6F; + 1375 : A9; + 1376 : FF; + 1377 : 99; + 1378 : A7; + 1379 : 00; + 137A : 68; + 137B : 85; + 137C : 6F; + 137D : 8A; + 137E : 60; + 137F : A0; + 1380 : 00; + 1381 : A9; + 1382 : 01; + 1383 : 2C; + 1384 : 56; + 1385 : 02; + 1386 : D0; + 1387 : 09; + 1388 : C8; + 1389 : 0A; + 138A : D0; + 138B : F7; + 138C : A9; + 138D : 70; + 138E : 4C; + 138F : C8; + 1390 : C1; + 1391 : 49; + 1392 : FF; + 1393 : 2D; + 1394 : 56; + 1395 : 02; + 1396 : 8D; + 1397 : 56; + 1398 : 02; + 1399 : 98; + 139A : 60; + 139B : 20; + 139C : EB; + 139D : D0; + 139E : 20; + 139F : 00; + 13A0 : C1; + 13A1 : 20; + 13A2 : AA; + 13A3 : D3; + 13A4 : A6; + 13A5 : 82; + 13A6 : BD; + 13A7 : 3E; + 13A8 : 02; + 13A9 : 60; + 13AA : A6; + 13AB : 82; + 13AC : 20; + 13AD : 25; + 13AE : D1; + 13AF : D0; + 13B0 : 03; + 13B1 : 4C; + 13B2 : 20; + 13B3 : E1; + 13B4 : A5; + 13B5 : 83; + 13B6 : C9; + 13B7 : 0F; + 13B8 : F0; + 13B9 : 5A; + 13BA : B5; + 13BB : F2; + 13BC : 29; + 13BD : 08; + 13BE : D0; + 13BF : 13; + 13C0 : 20; + 13C1 : 25; + 13C2 : D1; + 13C3 : C9; + 13C4 : 07; + 13C5 : D0; + 13C6 : 07; + 13C7 : A9; + 13C8 : 89; + 13C9 : 95; + 13CA : F2; + 13CB : 4C; + 13CC : DE; + 13CD : D3; + 13CE : A9; + 13CF : 00; + 13D0 : 95; + 13D1 : F2; + 13D2 : 60; + 13D3 : A5; + 13D4 : 83; + 13D5 : F0; + 13D6 : 32; + 13D7 : 20; + 13D8 : 25; + 13D9 : D1; + 13DA : C9; + 13DB : 04; + 13DC : 90; + 13DD : 22; + 13DE : 20; + 13DF : 2F; + 13E0 : D1; + 13E1 : B5; + 13E2 : 99; + 13E3 : D9; + 13E4 : 44; + 13E5 : 02; + 13E6 : D0; + 13E7 : 04; + 13E8 : A9; + 13E9 : 00; + 13EA : 95; + 13EB : 99; + 13EC : F6; + 13ED : 99; + 13EE : A1; + [13EF..13F0] : 99; + 13F1 : 3E; + 13F2 : 02; + 13F3 : B5; + 13F4 : 99; + 13F5 : D9; + 13F6 : 44; + 13F7 : 02; + 13F8 : D0; + 13F9 : 05; + 13FA : A9; + 13FB : 81; + 13FC : 99; + 13FD : F2; + 13FE : 00; + 13FF : 60; + 1400 : 20; + 1401 : 56; + 1402 : D1; + 1403 : A6; + 1404 : 82; + 1405 : 9D; + 1406 : 3E; + 1407 : 02; + 1408 : 60; + 1409 : AD; + 140A : 54; + 140B : 02; + 140C : F0; + 140D : F2; + 140E : 20; + 140F : 67; + 1410 : ED; + 1411 : 4C; + 1412 : 03; + 1413 : D4; + 1414 : 20; + 1415 : E8; + 1416 : D4; + 1417 : C9; + 1418 : D4; + 1419 : D0; + 141A : 18; + 141B : A5; + 141C : 95; + 141D : C9; + 141E : 02; + 141F : D0; + 1420 : 12; + 1421 : A9; + 1422 : 0D; + [1423..1424] : 85; + 1425 : 20; + 1426 : 23; + 1427 : C1; + 1428 : A9; + 1429 : 00; + 142A : 20; + 142B : C1; + 142C : E6; + 142D : C6; + 142E : A5; + 142F : A9; + 1430 : 80; + 1431 : D0; + 1432 : 12; + 1433 : 20; + 1434 : 37; + 1435 : D1; + [1436..1437] : 85; + 1438 : D0; + 1439 : 09; + 143A : A9; + 143B : D4; + 143C : 20; + 143D : C8; + 143E : D4; + 143F : A9; + 1440 : 02; + 1441 : 95; + 1442 : 9A; + 1443 : A9; + 1444 : 88; + 1445 : 85; + 1446 : F7; + 1447 : A5; + 1448 : 85; + 1449 : 8D; + 144A : 43; + 144B : 02; + 144C : 60; + 144D : 20; + 144E : 93; + 144F : DF; + 1450 : 0A; + 1451 : AA; + 1452 : A9; + 1453 : 00; + 1454 : 95; + 1455 : 99; + 1456 : A1; + 1457 : 99; + 1458 : F0; + 1459 : 05; + 145A : D6; + 145B : 99; + 145C : 4C; + 145D : 56; + 145E : D1; + 145F : 60; + 1460 : A9; + 1461 : 80; + 1462 : D0; + 1463 : 02; + 1464 : A9; + 1465 : 90; + 1466 : 05; + 1467 : 7F; + 1468 : 8D; + 1469 : 4D; + 146A : 02; + 146B : A5; + 146C : F9; + 146D : 20; + 146E : D3; + 146F : D6; + 1470 : A6; + 1471 : F9; + 1472 : 4C; + 1473 : 93; + 1474 : D5; + 1475 : A9; + 1476 : 01; + 1477 : 8D; + 1478 : 4A; + 1479 : 02; + 147A : A9; + 147B : 11; + 147C : 85; + 147D : 83; + 147E : 20; + 147F : 46; + 1480 : DC; + 1481 : A9; + 1482 : 02; + 1483 : 4C; + 1484 : C8; + 1485 : D4; + 1486 : A9; + 1487 : 12; + 1488 : 85; + 1489 : 83; + 148A : 4C; + 148B : DA; + 148C : DC; + 148D : 20; + 148E : 3B; + 148F : DE; + 1490 : A9; + 1491 : 01; + 1492 : 85; + 1493 : 6F; + 1494 : A5; + 1495 : 69; + 1496 : 48; + 1497 : A9; + 1498 : 03; + 1499 : 85; + 149A : 69; + 149B : 20; + 149C : 2D; + 149D : F1; + 149E : 68; + 149F : 85; + 14A0 : 69; + 14A1 : A9; + 14A2 : 00; + 14A3 : 20; + 14A4 : C8; + 14A5 : D4; + 14A6 : A5; + 14A7 : 80; + 14A8 : 20; + 14A9 : F1; + 14AA : CF; + 14AB : A5; + 14AC : 81; + 14AD : 20; + 14AE : F1; + 14AF : CF; + 14B0 : 20; + 14B1 : C7; + 14B2 : D0; + 14B3 : 20; + 14B4 : 99; + 14B5 : D5; + 14B6 : A9; + 14B7 : 00; + 14B8 : 20; + 14B9 : C8; + 14BA : D4; + 14BB : 20; + 14BC : F1; + 14BD : CF; + 14BE : D0; + 14BF : FB; + 14C0 : 20; + 14C1 : F1; + 14C2 : CF; + 14C3 : A9; + 14C4 : FF; + 14C5 : 4C; + 14C6 : F1; + 14C7 : CF; + 14C8 : 85; + 14C9 : 6F; + 14CA : 20; + 14CB : 93; + 14CC : DF; + 14CD : 0A; + 14CE : AA; + 14CF : B5; + 14D0 : 9A; + 14D1 : 85; + 14D2 : 95; + 14D3 : A5; + 14D4 : 6F; + 14D5 : 95; + 14D6 : 99; + 14D7 : 85; + 14D8 : 94; + 14D9 : 60; + 14DA : A9; + 14DB : 11; + 14DC : 85; + 14DD : 83; + 14DE : 20; + 14DF : 27; + 14E0 : D2; + 14E1 : A9; + 14E2 : 12; + 14E3 : 85; + 14E4 : 83; + 14E5 : 4C; + 14E6 : 27; + 14E7 : D2; + 14E8 : 20; + 14E9 : 93; + 14EA : DF; + 14EB : 0A; + 14EC : AA; + 14ED : B5; + 14EE : 9A; + 14EF : 85; + 14F0 : 95; + 14F1 : B5; + 14F2 : 99; + 14F3 : 85; + 14F4 : 94; + 14F5 : 60; + 14F6 : 85; + 14F7 : 71; + 14F8 : 20; + 14F9 : 93; + 14FA : DF; + 14FB : AA; + 14FC : BD; + 14FD : E0; + 14FE : FE; + 14FF : 85; + 1500 : 72; + 1501 : A0; + 1502 : 00; + 1503 : B1; + 1504 : 71; + 1505 : 60; + 1506 : BD; + 1507 : 5B; + 1508 : 02; + 1509 : 29; + 150A : 01; + 150B : 0D; + 150C : 4D; + 150D : 02; + 150E : 48; + 150F : 86; + 1510 : F9; + 1511 : 8A; + 1512 : 0A; + 1513 : AA; + 1514 : B5; + 1515 : 07; + 1516 : 8D; + 1517 : 4D; + 1518 : 02; + 1519 : B5; + 151A : 06; + 151B : F0; + 151C : 2D; + 151D : CD; + 151E : D7; + 151F : FE; + 1520 : B0; + 1521 : 28; + 1522 : AA; + 1523 : 68; + 1524 : 48; + 1525 : 29; + 1526 : F0; + 1527 : C9; + 1528 : 90; + 1529 : D0; + 152A : 4F; + 152B : 68; + 152C : 48; + 152D : 4A; + 152E : B0; + 152F : 05; + 1530 : AD; + [1531..1532] : 01; + 1533 : 90; + 1534 : 03; + 1535 : AD; + 1536 : 02; + 1537 : 01; + 1538 : F0; + 1539 : 05; + 153A : CD; + 153B : D5; + 153C : FE; + 153D : D0; + 153E : 33; + 153F : 8A; + 1540 : 20; + 1541 : 4B; + 1542 : F2; + 1543 : CD; + 1544 : 4D; + 1545 : 02; + 1546 : F0; + 1547 : 02; + 1548 : B0; + 1549 : 30; + 154A : 20; + 154B : 52; + 154C : D5; + 154D : A9; + 154E : 66; + 154F : 4C; + 1550 : 45; + 1551 : E6; + 1552 : A5; + 1553 : F9; + 1554 : 0A; + 1555 : AA; + 1556 : B5; + 1557 : 06; + 1558 : 85; + 1559 : 80; + 155A : B5; + 155B : 07; + 155C : 85; + 155D : 81; + 155E : 60; + 155F : A5; + 1560 : 80; + 1561 : F0; + 1562 : EA; + 1563 : CD; + 1564 : D7; + 1565 : FE; + 1566 : B0; + 1567 : E5; + 1568 : 20; + 1569 : 4B; + 156A : F2; + 156B : C5; + 156C : 81; + 156D : F0; + 156E : DE; + 156F : 90; + 1570 : DC; + 1571 : 60; + 1572 : 20; + 1573 : 52; + 1574 : D5; + 1575 : A9; + 1576 : 73; + 1577 : 4C; + 1578 : 45; + 1579 : E6; + 157A : A6; + 157B : F9; + 157C : 68; + 157D : 8D; + 157E : 4D; + 157F : 02; + 1580 : 95; + 1581 : 00; + 1582 : 9D; + 1583 : 5B; + 1584 : 02; + 1585 : 60; + 1586 : A9; + 1587 : 80; + 1588 : D0; + 1589 : 02; + 158A : A9; + 158B : 90; + 158C : 05; + 158D : 7F; + 158E : A6; + 158F : F9; + 1590 : 8D; + 1591 : 4D; + 1592 : 02; + 1593 : AD; + 1594 : 4D; + 1595 : 02; + 1596 : 20; + 1597 : 0E; + 1598 : D5; + 1599 : 20; + 159A : A6; + 159B : D5; + 159C : B0; + 159D : FB; + 159E : 48; + 159F : A9; + 15A0 : 00; + 15A1 : 8D; + 15A2 : 98; + 15A3 : 02; + 15A4 : 68; + 15A5 : 60; + 15A6 : B5; + 15A7 : 00; + 15A8 : 30; + 15A9 : 1A; + 15AA : C9; + 15AB : 02; + 15AC : 90; + 15AD : 14; + 15AE : C9; + 15AF : 08; + 15B0 : F0; + 15B1 : 08; + 15B2 : C9; + 15B3 : 0B; + 15B4 : F0; + 15B5 : 04; + 15B6 : C9; + 15B7 : 0F; + 15B8 : D0; + 15B9 : 0C; + 15BA : 2C; + 15BB : 98; + 15BC : 02; + 15BD : 30; + 15BE : 03; + 15BF : 4C; + 15C0 : 3F; + 15C1 : D6; + 15C2 : 18; + 15C3 : 60; + 15C4 : 38; + 15C5 : 60; + 15C6 : 98; + 15C7 : 48; + 15C8 : A5; + 15C9 : 7F; + 15CA : 48; + 15CB : BD; + 15CC : 5B; + 15CD : 02; + 15CE : 29; + 15CF : 01; + 15D0 : 85; + 15D1 : 7F; + 15D2 : A8; + 15D3 : B9; + 15D4 : CA; + 15D5 : FE; + 15D6 : 8D; + 15D7 : 6D; + 15D8 : 02; + 15D9 : 20; + 15DA : A6; + 15DB : D6; + 15DC : C9; + 15DD : 02; + 15DE : B0; + 15DF : 03; + 15E0 : 4C; + 15E1 : 6D; + 15E2 : D6; + 15E3 : BD; + 15E4 : 5B; + 15E5 : 02; + 15E6 : 29; + 15E7 : F0; + 15E8 : 48; + 15E9 : C9; + 15EA : 90; + 15EB : D0; + 15EC : 07; + 15ED : A5; + 15EE : 7F; + 15EF : 09; + 15F0 : B8; + 15F1 : 9D; + 15F2 : 5B; + 15F3 : 02; + 15F4 : 24; + 15F5 : 6A; + 15F6 : 70; + 15F7 : 39; + 15F8 : A9; + 15F9 : 00; + 15FA : 8D; + 15FB : 99; + 15FC : 02; + 15FD : 8D; + 15FE : 9A; + 15FF : 02; + 1600 : AC; + 1601 : 99; + 1602 : 02; + 1603 : AD; + 1604 : 9A; + 1605 : 02; + 1606 : 38; + 1607 : F9; + 1608 : DB; + 1609 : FE; + 160A : 8D; + 160B : 9A; + 160C : 02; + 160D : B9; + 160E : DB; + 160F : FE; + 1610 : 20; + 1611 : 76; + 1612 : D6; + 1613 : EE; + 1614 : 99; + 1615 : 02; + 1616 : 20; + 1617 : A6; + 1618 : D6; + 1619 : C9; + 161A : 02; + 161B : 90; + 161C : 08; + 161D : AC; + 161E : 99; + 161F : 02; + 1620 : B9; + 1621 : DB; + 1622 : FE; + 1623 : D0; + 1624 : DB; + 1625 : AD; + 1626 : 9A; + 1627 : 02; + 1628 : 20; + 1629 : 76; + 162A : D6; + 162B : B5; + 162C : 00; + 162D : C9; + 162E : 02; + 162F : 90; + 1630 : 2B; + 1631 : 24; + 1632 : 6A; + 1633 : 10; + 1634 : 0F; + 1635 : 68; + 1636 : C9; + 1637 : 90; + 1638 : D0; + [1639..163A] : 05; + 163B : 7F; + 163C : 9D; + 163D : 5B; + 163E : 02; + 163F : B5; + 1640 : 00; + 1641 : 20; + 1642 : 0A; + 1643 : E6; + 1644 : 68; + 1645 : 2C; + 1646 : 98; + 1647 : 02; + 1648 : 30; + 1649 : 23; + 164A : 48; + 164B : A9; + 164C : C0; + 164D : 05; + 164E : 7F; + 164F : 95; + 1650 : 00; + 1651 : B5; + 1652 : 00; + 1653 : 30; + 1654 : FC; + 1655 : 20; + 1656 : A6; + 1657 : D6; + 1658 : C9; + 1659 : 02; + 165A : B0; + 165B : D9; + 165C : 68; + 165D : C9; + 165E : 90; + 165F : D0; + 1660 : 0C; + 1661 : 05; + 1662 : 7F; + 1663 : 9D; + 1664 : 5B; + 1665 : 02; + 1666 : 20; + 1667 : A6; + 1668 : D6; + 1669 : C9; + 166A : 02; + 166B : B0; + 166C : D2; + 166D : 68; + 166E : 85; + 166F : 7F; + 1670 : 68; + 1671 : A8; + 1672 : B5; + 1673 : 00; + 1674 : 18; + 1675 : 60; + 1676 : C9; + 1677 : 00; + 1678 : F0; + 1679 : 18; + 167A : 30; + 167B : 0C; + 167C : A0; + 167D : 01; + 167E : 20; + 167F : 93; + 1680 : D6; + 1681 : 38; + 1682 : E9; + 1683 : 01; + 1684 : D0; + 1685 : F6; + 1686 : F0; + 1687 : 0A; + 1688 : A0; + 1689 : FF; + 168A : 20; + 168B : 93; + 168C : D6; + 168D : 18; + 168E : 69; + 168F : 01; + 1690 : D0; + 1691 : F6; + 1692 : 60; + 1693 : 48; + 1694 : 98; + 1695 : A4; + 1696 : 7F; + 1697 : 99; + 1698 : FE; + 1699 : 02; + 169A : D9; + 169B : FE; + 169C : 02; + 169D : F0; + 169E : FB; + 169F : A9; + 16A0 : 00; + 16A1 : 99; + 16A2 : FE; + 16A3 : 02; + 16A4 : 68; + 16A5 : 60; + 16A6 : A5; + 16A7 : 6A; + 16A8 : 29; + 16A9 : 3F; + 16AA : A8; + 16AB : AD; + 16AC : 6D; + 16AD : 02; + 16AE : 4D; + 16AF : 00; + 16B0 : 1C; + 16B1 : 8D; + 16B2 : 00; + 16B3 : 1C; + 16B4 : BD; + 16B5 : 5B; + 16B6 : 02; + 16B7 : 95; + 16B8 : 00; + 16B9 : B5; + 16BA : 00; + 16BB : 30; + 16BC : FC; + 16BD : C9; + 16BE : 02; + 16BF : 90; + 16C0 : 03; + 16C1 : 88; + 16C2 : D0; + 16C3 : E7; + 16C4 : 48; + 16C5 : AD; + 16C6 : 6D; + 16C7 : 02; + 16C8 : 0D; + 16C9 : 00; + 16CA : 1C; + 16CB : 8D; + 16CC : 00; + 16CD : 1C; + 16CE : 68; + 16CF : 60; + 16D0 : 20; + 16D1 : 93; + 16D2 : DF; + 16D3 : 0A; + 16D4 : A8; + 16D5 : A5; + 16D6 : 80; + 16D7 : 99; + 16D8 : 06; + 16D9 : 00; + 16DA : A5; + 16DB : 81; + 16DC : 99; + 16DD : 07; + 16DE : 00; + 16DF : A5; + 16E0 : 7F; + 16E1 : 0A; + 16E2 : AA; + 16E3 : 60; + 16E4 : A5; + 16E5 : 83; + 16E6 : 48; + 16E7 : A5; + 16E8 : 82; + 16E9 : 48; + 16EA : A5; + 16EB : 81; + 16EC : 48; + 16ED : A5; + 16EE : 80; + 16EF : 48; + 16F0 : A9; + 16F1 : 11; + 16F2 : 85; + 16F3 : 83; + 16F4 : 20; + 16F5 : 3B; + 16F6 : DE; + 16F7 : AD; + 16F8 : 4A; + 16F9 : 02; + 16FA : 48; + 16FB : A5; + 16FC : E2; + 16FD : 29; + 16FE : 01; + 16FF : 85; + 1700 : 7F; + 1701 : A6; + 1702 : F9; + 1703 : 5D; + 1704 : 5B; + 1705 : 02; + 1706 : 4A; + 1707 : 90; + 1708 : 0C; + 1709 : A2; + 170A : 01; + 170B : 8E; + 170C : 92; + 170D : 02; + 170E : 20; + 170F : AC; + 1710 : C5; + 1711 : F0; + 1712 : 1D; + 1713 : D0; + 1714 : 28; + 1715 : AD; + 1716 : 91; + 1717 : 02; + 1718 : F0; + 1719 : 0C; + 171A : C5; + 171B : 81; + 171C : F0; + 171D : 1F; + 171E : 85; + 171F : 81; + 1720 : 20; + 1721 : 60; + 1722 : D4; + 1723 : 4C; + 1724 : 3D; + 1725 : D7; + 1726 : A9; + 1727 : 01; + 1728 : 8D; + 1729 : 92; + 172A : 02; + 172B : 20; + 172C : 17; + 172D : C6; + 172E : D0; + 172F : 0D; + 1730 : 20; + 1731 : 8D; + 1732 : D4; + 1733 : A5; + 1734 : 81; + 1735 : 8D; + 1736 : 91; + 1737 : 02; + 1738 : A9; + 1739 : 02; + 173A : 8D; + 173B : 92; + 173C : 02; + 173D : AD; + 173E : 92; + 173F : 02; + 1740 : 20; + 1741 : C8; + 1742 : D4; + 1743 : 68; + 1744 : 8D; + 1745 : 4A; + 1746 : 02; + 1747 : C9; + 1748 : 04; + 1749 : D0; + 174A : 02; + 174B : 09; + 174C : 80; + 174D : 20; + 174E : F1; + 174F : CF; + 1750 : 68; + 1751 : 8D; + 1752 : 80; + 1753 : 02; + 1754 : 20; + 1755 : F1; + 1756 : CF; + 1757 : 68; + 1758 : 8D; + 1759 : 85; + 175A : 02; + 175B : 20; + 175C : F1; + 175D : CF; + 175E : 20; + 175F : 93; + 1760 : DF; + 1761 : A8; + 1762 : AD; + 1763 : 7A; + 1764 : 02; + 1765 : AA; + 1766 : A9; + 1767 : 10; + 1768 : 20; + 1769 : 6E; + 176A : C6; + 176B : A0; + 176C : 10; + 176D : A9; + 176E : 00; + 176F : 91; + 1770 : 94; + 1771 : C8; + 1772 : C0; + 1773 : 1B; + 1774 : 90; + 1775 : F9; + 1776 : AD; + 1777 : 4A; + 1778 : 02; + 1779 : C9; + 177A : 04; + 177B : D0; + 177C : 13; + 177D : A0; + 177E : 10; + 177F : AD; + 1780 : 59; + 1781 : 02; + 1782 : 91; + 1783 : 94; + 1784 : C8; + 1785 : AD; + 1786 : 5A; + 1787 : 02; + 1788 : 91; + 1789 : 94; + 178A : C8; + 178B : AD; + 178C : 58; + 178D : 02; + 178E : 91; + 178F : 94; + 1790 : 20; + 1791 : 64; + 1792 : D4; + 1793 : 68; + 1794 : 85; + 1795 : 82; + 1796 : AA; + 1797 : 68; + 1798 : 85; + 1799 : 83; + 179A : AD; + 179B : 91; + 179C : 02; + 179D : 85; + 179E : D8; + 179F : 9D; + 17A0 : 60; + 17A1 : 02; + 17A2 : AD; + 17A3 : 92; + 17A4 : 02; + 17A5 : 85; + 17A6 : DD; + 17A7 : 9D; + 17A8 : 66; + 17A9 : 02; + 17AA : AD; + 17AB : 4A; + 17AC : 02; + 17AD : 85; + 17AE : E7; + 17AF : A5; + 17B0 : 7F; + 17B1 : 85; + 17B2 : E2; + 17B3 : 60; + 17B4 : A5; + 17B5 : 83; + 17B6 : 8D; + 17B7 : 4C; + 17B8 : 02; + 17B9 : 20; + 17BA : B3; + 17BB : C2; + 17BC : 8E; + 17BD : 2A; + 17BE : 02; + 17BF : AE; + 17C0 : 00; + 17C1 : 02; + 17C2 : AD; + 17C3 : 4C; + 17C4 : 02; + 17C5 : D0; + 17C6 : 2C; + 17C7 : E0; + 17C8 : 2A; + 17C9 : D0; + 17CA : 28; + 17CB : A5; + 17CC : 7E; + 17CD : F0; + 17CE : 4D; + 17CF : 85; + 17D0 : 80; + 17D1 : AD; + 17D2 : 6E; + 17D3 : 02; + 17D4 : 85; + 17D5 : 7F; + 17D6 : 85; + 17D7 : E2; + 17D8 : A9; + 17D9 : 02; + 17DA : 85; + 17DB : E7; + 17DC : AD; + 17DD : 6F; + 17DE : 02; + 17DF : 85; + 17E0 : 81; + 17E1 : 20; + 17E2 : 00; + 17E3 : C1; + 17E4 : 20; + 17E5 : 46; + 17E6 : DC; + 17E7 : A9; + 17E8 : 04; + 17E9 : 05; + 17EA : 7F; + 17EB : A6; + 17EC : 82; + 17ED : 99; + 17EE : EC; + 17EF : 00; + 17F0 : 4C; + 17F1 : 94; + 17F2 : C1; + 17F3 : E0; + 17F4 : 24; + 17F5 : D0; + 17F6 : 1E; + 17F7 : AD; + 17F8 : 4C; + 17F9 : 02; + 17FA : D0; + 17FB : 03; + 17FC : 4C; + 17FD : 55; + 17FE : DA; + 17FF : 20; + 1800 : D1; + 1801 : C1; + 1802 : AD; + 1803 : 85; + 1804 : FE; + 1805 : 85; + 1806 : 80; + 1807 : A9; + 1808 : 00; + 1809 : 85; + 180A : 81; + 180B : 20; + 180C : 46; + 180D : DC; + 180E : A5; + 180F : 7F; + 1810 : 09; + 1811 : 02; + 1812 : 4C; + 1813 : EB; + 1814 : D7; + 1815 : E0; + 1816 : 23; + 1817 : D0; + 1818 : 12; + 1819 : 4C; + 181A : 84; + 181B : CB; + 181C : A9; + 181D : 02; + 181E : 8D; + 181F : 96; + 1820 : 02; + 1821 : A9; + 1822 : 00; + 1823 : 85; + 1824 : 7F; + 1825 : 8D; + 1826 : 8E; + 1827 : 02; + 1828 : 20; + 1829 : 42; + 182A : D0; + 182B : 20; + 182C : E5; + 182D : C1; + 182E : D0; + 182F : 04; + 1830 : A2; + 1831 : 00; + 1832 : F0; + 1833 : 0C; + 1834 : 8A; + 1835 : F0; + 1836 : 05; + 1837 : A9; + 1838 : 30; + 1839 : 4C; + 183A : C8; + 183B : C1; + 183C : 88; + 183D : F0; + 183E : 01; + 183F : 88; + 1840 : 8C; + 1841 : 7A; + 1842 : 02; + 1843 : A9; + 1844 : 8D; + 1845 : 20; + 1846 : 68; + 1847 : C2; + 1848 : E8; + 1849 : 8E; + 184A : 78; + 184B : 02; + 184C : 20; + 184D : 12; + 184E : C3; + 184F : 20; + 1850 : CA; + 1851 : C3; + 1852 : 20; + 1853 : 9D; + 1854 : C4; + 1855 : A2; + 1856 : 00; + 1857 : 8E; + 1858 : 58; + 1859 : 02; + 185A : 8E; + 185B : 97; + 185C : 02; + 185D : 8E; + 185E : 4A; + 185F : 02; + 1860 : E8; + 1861 : EC; + 1862 : 77; + 1863 : 02; + 1864 : B0; + 1865 : 10; + 1866 : 20; + 1867 : 09; + 1868 : DA; + 1869 : E8; + 186A : EC; + 186B : 77; + 186C : 02; + 186D : B0; + 186E : 07; + 186F : C0; + 1870 : 04; + 1871 : F0; + 1872 : 3E; + 1873 : 20; + 1874 : 09; + 1875 : DA; + 1876 : AE; + 1877 : 4C; + 1878 : 02; + 1879 : 86; + 187A : 83; + 187B : E0; + 187C : 02; + 187D : B0; + 187E : 12; + 187F : 8E; + 1880 : 97; + 1881 : 02; + 1882 : A9; + 1883 : 40; + 1884 : 8D; + 1885 : F9; + 1886 : 02; + 1887 : AD; + 1888 : 4A; + 1889 : 02; + 188A : D0; + 188B : 1B; + 188C : A9; + 188D : 02; + 188E : 8D; + 188F : 4A; + 1890 : 02; + 1891 : AD; + 1892 : 4A; + 1893 : 02; + 1894 : D0; + 1895 : 11; + 1896 : A5; + 1897 : E7; + 1898 : 29; + 1899 : 07; + 189A : 8D; + 189B : 4A; + 189C : 02; + 189D : AD; + 189E : 80; + 189F : 02; + 18A0 : D0; + 18A1 : 05; + 18A2 : A9; + 18A3 : 01; + 18A4 : 8D; + 18A5 : 4A; + 18A6 : 02; + 18A7 : AD; + 18A8 : 97; + 18A9 : 02; + 18AA : C9; + 18AB : 01; + 18AC : F0; + 18AD : 18; + 18AE : 4C; + 18AF : 40; + 18B0 : D9; + 18B1 : BC; + 18B2 : 7A; + 18B3 : 02; + 18B4 : B9; + 18B5 : 00; + 18B6 : 02; + 18B7 : 8D; + 18B8 : 58; + 18B9 : 02; + 18BA : AD; + 18BB : 80; + 18BC : 02; + 18BD : D0; + 18BE : B7; + 18BF : A9; + 18C0 : 01; + 18C1 : 8D; + 18C2 : 97; + 18C3 : 02; + 18C4 : D0; + 18C5 : B0; + 18C6 : A5; + 18C7 : E7; + 18C8 : 29; + 18C9 : 80; + 18CA : AA; + 18CB : D0; + 18CC : 14; + 18CD : A9; + 18CE : 20; + 18CF : 24; + 18D0 : E7; + 18D1 : F0; + 18D2 : 06; + 18D3 : 20; + 18D4 : B6; + 18D5 : C8; + 18D6 : 4C; + 18D7 : E3; + 18D8 : D9; + 18D9 : AD; + 18DA : 80; + 18DB : 02; + 18DC : D0; + 18DD : 03; + 18DE : 4C; + 18DF : E3; + 18E0 : D9; + 18E1 : AD; + 18E2 : 00; + 18E3 : 02; + 18E4 : C9; + 18E5 : 40; + 18E6 : F0; + 18E7 : 0D; + 18E8 : 8A; + 18E9 : D0; + 18EA : 05; + 18EB : A9; + 18EC : 63; + 18ED : 4C; + 18EE : C8; + 18EF : C1; + 18F0 : A9; + 18F1 : 33; + 18F2 : 4C; + 18F3 : C8; + 18F4 : C1; + 18F5 : A5; + 18F6 : E7; + 18F7 : 29; + 18F8 : 07; + 18F9 : CD; + 18FA : 4A; + 18FB : 02; + 18FC : D0; + 18FD : 67; + 18FE : C9; + 18FF : 04; + 1900 : F0; + 1901 : 63; + 1902 : 20; + 1903 : DA; + 1904 : DC; + 1905 : A5; + 1906 : 82; + 1907 : 8D; + 1908 : 70; + 1909 : 02; + 190A : A9; + 190B : 11; + 190C : 85; + 190D : 83; + 190E : 20; + 190F : EB; + 1910 : D0; + 1911 : AD; + 1912 : 94; + 1913 : 02; + 1914 : 20; + 1915 : C8; + 1916 : D4; + 1917 : A0; + 1918 : 00; + 1919 : B1; + 191A : 94; + 191B : 09; + 191C : 20; + 191D : 91; + 191E : 94; + 191F : A0; + 1920 : 1A; + 1921 : A5; + 1922 : 80; + 1923 : 91; + 1924 : 94; + 1925 : C8; + 1926 : A5; + 1927 : 81; + 1928 : 91; + 1929 : 94; + 192A : AE; + 192B : 70; + 192C : 02; + 192D : A5; + 192E : D8; + 192F : 9D; + 1930 : 60; + 1931 : 02; + 1932 : A5; + 1933 : DD; + 1934 : 9D; + 1935 : 66; + 1936 : 02; + 1937 : 20; + 1938 : 3B; + 1939 : DE; + 193A : 20; + 193B : 64; + 193C : D4; + 193D : 4C; + 193E : EF; + 193F : D9; + 1940 : AD; + 1941 : 80; + 1942 : 02; + 1943 : D0; + 1944 : 05; + 1945 : A9; + 1946 : 62; + 1947 : 4C; + 1948 : C8; + 1949 : C1; + 194A : AD; + 194B : 97; + 194C : 02; + 194D : C9; + 194E : 03; + 194F : F0; + 1950 : 0B; + 1951 : A9; + 1952 : 20; + 1953 : 24; + 1954 : E7; + 1955 : F0; + 1956 : 05; + 1957 : A9; + 1958 : 60; + 1959 : 4C; + 195A : C8; + 195B : C1; + 195C : A5; + 195D : E7; + 195E : 29; + 195F : 07; + 1960 : CD; + 1961 : 4A; + 1962 : 02; + 1963 : F0; + 1964 : 05; + 1965 : A9; + 1966 : 64; + 1967 : 4C; + 1968 : C8; + 1969 : C1; + 196A : A0; + 196B : 00; + 196C : 8C; + 196D : 79; + 196E : 02; + 196F : AE; + 1970 : 97; + 1971 : 02; + 1972 : E0; + 1973 : 02; + 1974 : D0; + 1975 : 1A; + 1976 : C9; + 1977 : 04; + 1978 : F0; + 1979 : EB; + 197A : B1; + 197B : 94; + 197C : 29; + 197D : 4F; + 197E : 91; + 197F : 94; + 1980 : A5; + 1981 : 83; + 1982 : 48; + 1983 : A9; + 1984 : 11; + 1985 : 85; + 1986 : 83; + 1987 : 20; + 1988 : 3B; + 1989 : DE; + 198A : 20; + 198B : 64; + 198C : D4; + 198D : 68; + 198E : 85; + 198F : 83; + 1990 : 20; + 1991 : A0; + 1992 : D9; + 1993 : AD; + 1994 : 97; + 1995 : 02; + 1996 : C9; + 1997 : 02; + 1998 : D0; + 1999 : 55; + 199A : 20; + 199B : 2A; + 199C : DA; + 199D : 4C; + 199E : 94; + 199F : C1; + 19A0 : A0; + 19A1 : 13; + 19A2 : B1; + 19A3 : 94; + 19A4 : 8D; + 19A5 : 59; + 19A6 : 02; + 19A7 : C8; + 19A8 : B1; + 19A9 : 94; + 19AA : 8D; + 19AB : 5A; + 19AC : 02; + 19AD : C8; + 19AE : B1; + 19AF : 94; + 19B0 : AE; + 19B1 : 58; + 19B2 : 02; + 19B3 : 8D; + 19B4 : 58; + 19B5 : 02; + 19B6 : 8A; + 19B7 : F0; + 19B8 : 0A; + 19B9 : CD; + 19BA : 58; + 19BB : 02; + 19BC : F0; + 19BD : 05; + 19BE : A9; + 19BF : 50; + 19C0 : 20; + 19C1 : C8; + 19C2 : C1; + 19C3 : AE; + 19C4 : 79; + 19C5 : 02; + 19C6 : BD; + 19C7 : 80; + 19C8 : 02; + 19C9 : 85; + 19CA : 80; + 19CB : BD; + 19CC : 85; + 19CD : 02; + 19CE : 85; + 19CF : 81; + 19D0 : 20; + 19D1 : 46; + 19D2 : DC; + 19D3 : A4; + 19D4 : 82; + 19D5 : AE; + 19D6 : 79; + 19D7 : 02; + 19D8 : B5; + 19D9 : D8; + 19DA : 99; + 19DB : 60; + 19DC : 02; + 19DD : B5; + 19DE : DD; + 19DF : 99; + 19E0 : 66; + 19E1 : 02; + 19E2 : 60; + 19E3 : A5; + 19E4 : E2; + 19E5 : 29; + 19E6 : 01; + 19E7 : 85; + 19E8 : 7F; + 19E9 : 20; + 19EA : DA; + 19EB : DC; + 19EC : 20; + 19ED : E4; + 19EE : D6; + 19EF : A5; + 19F0 : 83; + 19F1 : C9; + 19F2 : 02; + 19F3 : B0; + 19F4 : 11; + 19F5 : 20; + 19F6 : 3E; + 19F7 : DE; + 19F8 : A5; + 19F9 : 80; + 19FA : 85; + 19FB : 7E; + 19FC : A5; + 19FD : 7F; + 19FE : 8D; + 19FF : 6E; + 1A00 : 02; + 1A01 : A5; + 1A02 : 81; + 1A03 : 8D; + 1A04 : 6F; + 1A05 : 02; + 1A06 : 4C; + 1A07 : 99; + 1A08 : C1; + 1A09 : BC; + 1A0A : 7A; + 1A0B : 02; + 1A0C : B9; + 1A0D : 00; + 1A0E : 02; + 1A0F : A0; + 1A10 : 04; + 1A11 : 88; + 1A12 : 30; + 1A13 : 08; + 1A14 : D9; + 1A15 : B2; + 1A16 : FE; + 1A17 : D0; + 1A18 : F8; + 1A19 : 8C; + 1A1A : 97; + 1A1B : 02; + 1A1C : A0; + 1A1D : 05; + 1A1E : 88; + 1A1F : 30; + 1A20 : 08; + 1A21 : D9; + 1A22 : B6; + 1A23 : FE; + 1A24 : D0; + 1A25 : F8; + 1A26 : 8C; + 1A27 : 4A; + 1A28 : 02; + 1A29 : 60; + 1A2A : 20; + 1A2B : 39; + 1A2C : CA; + 1A2D : A9; + 1A2E : 80; + 1A2F : 20; + 1A30 : A6; + 1A31 : DD; + 1A32 : F0; + 1A33 : F6; + 1A34 : 20; + 1A35 : 95; + 1A36 : DE; + 1A37 : A6; + 1A38 : 81; + 1A39 : E8; + 1A3A : 8A; + 1A3B : D0; + 1A3C : 05; + 1A3D : 20; + 1A3E : A3; + 1A3F : D1; + 1A40 : A9; + 1A41 : 02; + 1A42 : 20; + 1A43 : C8; + 1A44 : D4; + 1A45 : A6; + 1A46 : 82; + 1A47 : A9; + 1A48 : 01; + 1A49 : 95; + 1A4A : F2; + 1A4B : A9; + 1A4C : 80; + 1A4D : 05; + 1A4E : 82; + 1A4F : A6; + 1A50 : 83; + 1A51 : 9D; + 1A52 : 2B; + 1A53 : 02; + 1A54 : 60; + 1A55 : A9; + 1A56 : 0C; + 1A57 : 8D; + 1A58 : 2A; + 1A59 : 02; + 1A5A : A9; + 1A5B : 00; + 1A5C : AE; + 1A5D : 74; + 1A5E : 02; + 1A5F : CA; + 1A60 : F0; + 1A61 : 0B; + 1A62 : CA; + 1A63 : D0; + 1A64 : 21; + 1A65 : AD; + 1A66 : 01; + 1A67 : 02; + 1A68 : 20; + 1A69 : BD; + 1A6A : C3; + 1A6B : 30; + 1A6C : 19; + 1A6D : 85; + 1A6E : E2; + 1A6F : EE; + 1A70 : 77; + 1A71 : 02; + 1A72 : EE; + 1A73 : 78; + 1A74 : 02; + 1A75 : EE; + 1A76 : 7A; + 1A77 : 02; + 1A78 : A9; + 1A79 : 80; + 1A7A : 85; + 1A7B : E7; + 1A7C : A9; + 1A7D : 2A; + 1A7E : 8D; + 1A7F : 00; + 1A80 : 02; + 1A81 : 8D; + 1A82 : 01; + 1A83 : 02; + 1A84 : D0; + 1A85 : 18; + 1A86 : 20; + 1A87 : E5; + 1A88 : C1; + 1A89 : D0; + 1A8A : 05; + 1A8B : 20; + 1A8C : DC; + 1A8D : C2; + 1A8E : A0; + 1A8F : 03; + [1A90..1A91] : 88; + 1A92 : 8C; + 1A93 : 7A; + 1A94 : 02; + 1A95 : 20; + 1A96 : 00; + 1A97 : C2; + 1A98 : 20; + 1A99 : 98; + 1A9A : C3; + [1A9B..1A9C] : 20; + 1A9D : C3; + 1A9E : 20; + 1A9F : CA; + 1AA0 : C3; + 1AA1 : 20; + 1AA2 : B7; + 1AA3 : C7; + 1AA4 : 20; + 1AA5 : 9D; + 1AA6 : C4; + 1AA7 : 20; + 1AA8 : 9E; + 1AA9 : EC; + 1AAA : 20; + 1AAB : 37; + 1AAC : D1; + 1AAD : A6; + 1AAE : 82; + 1AAF : 9D; + 1AB0 : 3E; + 1AB1 : 02; + 1AB2 : A5; + 1AB3 : 7F; + 1AB4 : 8D; + 1AB5 : 8E; + 1AB6 : 02; + 1AB7 : 09; + 1AB8 : 04; + 1AB9 : 95; + 1ABA : EC; + 1ABB : A9; + 1ABC : 00; + 1ABD : 85; + 1ABE : A3; + 1ABF : 60; + 1AC0 : A9; + 1AC1 : 00; + 1AC2 : 8D; + 1AC3 : F9; + 1AC4 : 02; + 1AC5 : A5; + 1AC6 : 83; + 1AC7 : D0; + 1AC8 : 0B; + 1AC9 : A9; + 1ACA : 00; + 1ACB : 8D; + 1ACC : 54; + 1ACD : 02; + 1ACE : 20; + 1ACF : 27; + 1AD0 : D2; + 1AD1 : 4C; + 1AD2 : DA; + 1AD3 : D4; + 1AD4 : C9; + 1AD5 : 0F; + 1AD6 : F0; + 1AD7 : 14; + 1AD8 : 20; + 1AD9 : 02; + 1ADA : DB; + 1ADB : A5; + 1ADC : 83; + 1ADD : C9; + 1ADE : 02; + 1ADF : 90; + 1AE0 : F0; + 1AE1 : AD; + 1AE2 : 6C; + 1AE3 : 02; + 1AE4 : D0; + 1AE5 : 03; + 1AE6 : 4C; + 1AE7 : 94; + 1AE8 : C1; + 1AE9 : 4C; + 1AEA : AD; + 1AEB : C1; + 1AEC : A9; + 1AED : 0E; + 1AEE : 85; + 1AEF : 83; + 1AF0 : 20; + 1AF1 : 02; + 1AF2 : DB; + 1AF3 : C6; + 1AF4 : 83; + 1AF5 : 10; + 1AF6 : F9; + 1AF7 : AD; + 1AF8 : 6C; + 1AF9 : 02; + 1AFA : D0; + 1AFB : 03; + 1AFC : 4C; + 1AFD : 94; + 1AFE : C1; + 1AFF : 4C; + 1B00 : AD; + 1B01 : C1; + 1B02 : A6; + 1B03 : 83; + 1B04 : BD; + 1B05 : 2B; + 1B06 : 02; + 1B07 : C9; + 1B08 : FF; + 1B09 : D0; + 1B0A : 01; + 1B0B : 60; + 1B0C : 29; + 1B0D : 0F; + 1B0E : 85; + 1B0F : 82; + 1B10 : 20; + 1B11 : 25; + 1B12 : D1; + 1B13 : C9; + 1B14 : 07; + 1B15 : F0; + 1B16 : 0F; + 1B17 : C9; + 1B18 : 04; + 1B19 : F0; + 1B1A : 11; + 1B1B : 20; + 1B1C : 07; + 1B1D : D1; + 1B1E : B0; + 1B1F : 09; + 1B20 : 20; + 1B21 : 62; + 1B22 : DB; + 1B23 : 20; + 1B24 : A5; + 1B25 : DB; + 1B26 : 20; + 1B27 : F4; + 1B28 : EE; + 1B29 : 4C; + 1B2A : 27; + 1B2B : D2; + 1B2C : 20; + 1B2D : F1; + 1B2E : DD; + 1B2F : 20; + 1B30 : 1E; + 1B31 : CF; + 1B32 : 20; + 1B33 : CB; + 1B34 : E1; + 1B35 : A6; + 1B36 : D5; + 1B37 : 86; + 1B38 : 73; + 1B39 : E6; + 1B3A : 73; + 1B3B : A9; + 1B3C : 00; + 1B3D : 85; + 1B3E : 70; + 1B3F : 85; + 1B40 : 71; + 1B41 : A5; + 1B42 : D6; + 1B43 : 38; + 1B44 : E9; + 1B45 : 0E; + 1B46 : 85; + 1B47 : 72; + 1B48 : 20; + 1B49 : 51; + 1B4A : DF; + 1B4B : A6; + 1B4C : 82; + 1B4D : A5; + 1B4E : 70; + 1B4F : 95; + 1B50 : B5; + 1B51 : A5; + 1B52 : 71; + 1B53 : 95; + 1B54 : BB; + 1B55 : A9; + 1B56 : 40; + 1B57 : 20; + 1B58 : A6; + 1B59 : DD; + 1B5A : F0; + 1B5B : 03; + 1B5C : 20; + 1B5D : A5; + 1B5E : DB; + 1B5F : 4C; + 1B60 : 27; + 1B61 : D2; + 1B62 : A6; + 1B63 : 82; + [1B64..1B65] : B5; + 1B66 : 15; + 1B67 : BB; + 1B68 : D0; + 1B69 : 0C; + 1B6A : 20; + 1B6B : E8; + 1B6C : D4; + 1B6D : C9; + 1B6E : 02; + 1B6F : D0; + 1B70 : 05; + 1B71 : A9; + 1B72 : 0D; + 1B73 : 20; + 1B74 : F1; + 1B75 : CF; + 1B76 : 20; + 1B77 : E8; + 1B78 : D4; + 1B79 : C9; + 1B7A : 02; + 1B7B : D0; + 1B7C : 0F; + 1B7D : 20; + 1B7E : 1E; + 1B7F : CF; + 1B80 : A6; + 1B81 : 82; + [1B82..1B83] : B5; + 1B84 : D0; + 1B85 : 02; + 1B86 : D6; + 1B87 : BB; + 1B88 : D6; + 1B89 : B5; + 1B8A : A9; + 1B8B : 00; + 1B8C : 38; + 1B8D : E9; + 1B8E : 01; + 1B8F : 48; + 1B90 : A9; + 1B91 : 00; + 1B92 : 20; + 1B93 : C8; + 1B94 : D4; + 1B95 : 20; + 1B96 : F1; + 1B97 : CF; + 1B98 : 68; + 1B99 : 20; + 1B9A : F1; + 1B9B : CF; + 1B9C : 20; + 1B9D : C7; + 1B9E : D0; + 1B9F : 20; + 1BA0 : 99; + 1BA1 : D5; + 1BA2 : 4C; + 1BA3 : 1E; + 1BA4 : CF; + 1BA5 : A6; + 1BA6 : 82; + 1BA7 : 8E; + 1BA8 : 70; + 1BA9 : 02; + 1BAA : A5; + 1BAB : 83; + 1BAC : 48; + 1BAD : BD; + 1BAE : 60; + 1BAF : 02; + 1BB0 : 85; + 1BB1 : 81; + 1BB2 : BD; + 1BB3 : 66; + 1BB4 : 02; + 1BB5 : 8D; + 1BB6 : 94; + 1BB7 : 02; + 1BB8 : B5; + 1BB9 : EC; + 1BBA : 29; + 1BBB : 01; + 1BBC : 85; + 1BBD : 7F; + 1BBE : AD; + 1BBF : 85; + 1BC0 : FE; + 1BC1 : 85; + 1BC2 : 80; + 1BC3 : 20; + 1BC4 : 93; + 1BC5 : DF; + 1BC6 : 48; + 1BC7 : 85; + 1BC8 : F9; + 1BC9 : 20; + 1BCA : 60; + 1BCB : D4; + 1BCC : A0; + 1BCD : 00; + 1BCE : BD; + 1BCF : E0; + 1BD0 : FE; + 1BD1 : 85; + 1BD2 : 87; + 1BD3 : AD; + 1BD4 : 94; + 1BD5 : 02; + 1BD6 : 85; + 1BD7 : 86; + 1BD8 : B1; + 1BD9 : 86; + 1BDA : 29; + 1BDB : 20; + 1BDC : F0; + 1BDD : 43; + 1BDE : 20; + 1BDF : 25; + 1BE0 : D1; + 1BE1 : C9; + 1BE2 : 04; + 1BE3 : F0; + 1BE4 : 44; + 1BE5 : B1; + 1BE6 : 86; + 1BE7 : 29; + 1BE8 : 8F; + 1BE9 : 91; + 1BEA : 86; + 1BEB : C8; + 1BEC : B1; + 1BED : 86; + 1BEE : 85; + 1BEF : 80; + 1BF0 : 84; + 1BF1 : 71; + 1BF2 : A0; + 1BF3 : 1B; + 1BF4 : B1; + 1BF5 : 86; + 1BF6 : 48; + 1BF7 : 88; + 1BF8 : B1; + 1BF9 : 86; + 1BFA : D0; + 1BFB : 0A; + 1BFC : 85; + 1BFD : 80; + 1BFE : 68; + 1BFF : 85; + 1C00 : 81; + 1C01 : A9; + 1C02 : 67; + 1C03 : 20; + 1C04 : 45; + 1C05 : E6; + 1C06 : 48; + 1C07 : A9; + 1C08 : 00; + 1C09 : 91; + 1C0A : 86; + 1C0B : C8; + 1C0C : 91; + 1C0D : 86; + 1C0E : 68; + 1C0F : A4; + 1C10 : 71; + 1C11 : 91; + 1C12 : 86; + 1C13 : C8; + 1C14 : B1; + 1C15 : 86; + 1C16 : 85; + 1C17 : 81; + 1C18 : 68; + 1C19 : 91; + 1C1A : 86; + 1C1B : 20; + 1C1C : 7D; + 1C1D : C8; + 1C1E : 4C; + 1C1F : 29; + 1C20 : DC; + 1C21 : B1; + 1C22 : 86; + 1C23 : 29; + 1C24 : 0F; + 1C25 : 09; + 1C26 : 80; + 1C27 : 91; + 1C28 : 86; + 1C29 : AE; + 1C2A : 70; + 1C2B : 02; + 1C2C : A0; + 1C2D : 1C; + [1C2E..1C2F] : B5; + 1C30 : 91; + 1C31 : 86; + 1C32 : C8; + 1C33 : B5; + 1C34 : BB; + 1C35 : 91; + 1C36 : 86; + 1C37 : 68; + 1C38 : AA; + 1C39 : A9; + 1C3A : 90; + 1C3B : 05; + 1C3C : 7F; + 1C3D : 20; + 1C3E : 90; + 1C3F : D5; + 1C40 : 68; + 1C41 : 85; + 1C42 : 83; + 1C43 : 4C; + 1C44 : 07; + 1C45 : D1; + 1C46 : A9; + 1C47 : 01; + 1C48 : 20; + 1C49 : E2; + 1C4A : D1; + 1C4B : 20; + 1C4C : B6; + 1C4D : DC; + 1C4E : AD; + 1C4F : 4A; + 1C50 : 02; + 1C51 : 48; + 1C52 : 0A; + 1C53 : 05; + 1C54 : 7F; + 1C55 : 95; + 1C56 : EC; + 1C57 : 20; + 1C58 : 9B; + 1C59 : D0; + 1C5A : A6; + 1C5B : 82; + 1C5C : A5; + 1C5D : 80; + 1C5E : D0; + 1C5F : 05; + 1C60 : A5; + 1C61 : 81; + 1C62 : 9D; + 1C63 : 44; + 1C64 : 02; + 1C65 : 68; + 1C66 : C9; + 1C67 : 04; + 1C68 : D0; + 1C69 : 3F; + 1C6A : A4; + 1C6B : 83; + 1C6C : B9; + 1C6D : 2B; + 1C6E : 02; + 1C6F : 09; + 1C70 : 40; + 1C71 : 99; + 1C72 : 2B; + 1C73 : 02; + 1C74 : AD; + 1C75 : 58; + 1C76 : 02; + 1C77 : 95; + 1C78 : C7; + 1C79 : 20; + 1C7A : 8E; + 1C7B : D2; + 1C7C : 10; + 1C7D : 03; + 1C7E : 4C; + 1C7F : 0F; + 1C80 : D2; + 1C81 : A6; + 1C82 : 82; + 1C83 : 95; + 1C84 : CD; + 1C85 : AC; + 1C86 : 59; + 1C87 : 02; + 1C88 : 84; + 1C89 : 80; + 1C8A : AC; + 1C8B : 5A; + 1C8C : 02; + 1C8D : 84; + 1C8E : 81; + 1C8F : 20; + 1C90 : D3; + 1C91 : D6; + 1C92 : 20; + 1C93 : 73; + 1C94 : DE; + 1C95 : 20; + 1C96 : 99; + 1C97 : D5; + 1C98 : A6; + 1C99 : 82; + 1C9A : A9; + 1C9B : 02; + 1C9C : 95; + 1C9D : C1; + 1C9E : A9; + 1C9F : 00; + 1CA0 : 20; + 1CA1 : C8; + 1CA2 : D4; + 1CA3 : 20; + 1CA4 : 53; + 1CA5 : E1; + 1CA6 : 4C; + 1CA7 : 3E; + 1CA8 : DE; + 1CA9 : 20; + 1CAA : 56; + 1CAB : D1; + 1CAC : A6; + 1CAD : 82; + 1CAE : 9D; + 1CAF : 3E; + 1CB0 : 02; + 1CB1 : A9; + 1CB2 : 88; + 1CB3 : 95; + 1CB4 : F2; + 1CB5 : 60; + 1CB6 : A6; + 1CB7 : 82; + 1CB8 : B5; + 1CB9 : A7; + 1CBA : 0A; + 1CBB : A8; + 1CBC : A9; + 1CBD : 02; + [1CBE..1CBF] : 99; + 1CC0 : 00; + 1CC1 : B5; + 1CC2 : AE; + 1CC3 : 09; + 1CC4 : 80; + 1CC5 : 95; + 1CC6 : AE; + 1CC7 : 0A; + 1CC8 : A8; + 1CC9 : A9; + 1CCA : 02; + [1CCB..1CCC] : 99; + 1CCD : 00; + 1CCE : A9; + 1CCF : 00; + 1CD0 : 95; + 1CD1 : B5; + 1CD2 : 95; + 1CD3 : BB; + 1CD4 : A9; + 1CD5 : 00; + 1CD6 : 9D; + 1CD7 : 44; + 1CD8 : 02; + 1CD9 : 60; + 1CDA : 20; + 1CDB : A9; + 1CDC : F1; + 1CDD : A9; + 1CDE : 01; + 1CDF : 20; + 1CE0 : DF; + 1CE1 : D1; + 1CE2 : 20; + 1CE3 : D0; + 1CE4 : D6; + 1CE5 : 20; + 1CE6 : B6; + 1CE7 : DC; + 1CE8 : A6; + 1CE9 : 82; + 1CEA : AD; + 1CEB : 4A; + 1CEC : 02; + 1CED : 48; + 1CEE : 0A; + 1CEF : 05; + 1CF0 : 7F; + 1CF1 : 95; + 1CF2 : EC; + 1CF3 : 68; + 1CF4 : C9; + 1CF5 : 04; + 1CF6 : F0; + 1CF7 : 05; + 1CF8 : A9; + 1CF9 : 01; + 1CFA : 95; + 1CFB : F2; + 1CFC : 60; + 1CFD : A4; + 1CFE : 83; + 1CFF : B9; + 1D00 : 2B; + 1D01 : 02; + 1D02 : 29; + 1D03 : 3F; + 1D04 : 09; + 1D05 : 40; + 1D06 : 99; + 1D07 : 2B; + 1D08 : 02; + 1D09 : AD; + 1D0A : 58; + 1D0B : 02; + 1D0C : 95; + 1D0D : C7; + 1D0E : 20; + 1D0F : 8E; + 1D10 : D2; + 1D11 : 10; + 1D12 : 03; + 1D13 : 4C; + 1D14 : 0F; + 1D15 : D2; + 1D16 : A6; + 1D17 : 82; + 1D18 : 95; + 1D19 : CD; + 1D1A : 20; + 1D1B : C1; + 1D1C : DE; + 1D1D : 20; + 1D1E : 1E; + 1D1F : F1; + 1D20 : A5; + 1D21 : 80; + 1D22 : 8D; + 1D23 : 59; + 1D24 : 02; + 1D25 : A5; + 1D26 : 81; + 1D27 : 8D; + 1D28 : 5A; + 1D29 : 02; + 1D2A : A6; + 1D2B : 82; + 1D2C : B5; + 1D2D : CD; + 1D2E : 20; + 1D2F : D3; + 1D30 : D6; + 1D31 : A9; + 1D32 : 00; + 1D33 : 20; + 1D34 : E9; + 1D35 : DE; + 1D36 : A9; + 1D37 : 00; + 1D38 : 20; + 1D39 : 8D; + 1D3A : DD; + 1D3B : A9; + 1D3C : 11; + 1D3D : 20; + 1D3E : 8D; + 1D3F : DD; + 1D40 : A9; + 1D41 : 00; + 1D42 : 20; + 1D43 : 8D; + 1D44 : DD; + 1D45 : AD; + 1D46 : 58; + 1D47 : 02; + 1D48 : 20; + 1D49 : 8D; + 1D4A : DD; + 1D4B : A5; + 1D4C : 80; + 1D4D : 20; + 1D4E : 8D; + 1D4F : DD; + 1D50 : A5; + 1D51 : 81; + 1D52 : 20; + 1D53 : 8D; + 1D54 : DD; + 1D55 : A9; + 1D56 : 10; + 1D57 : 20; + 1D58 : E9; + 1D59 : DE; + 1D5A : 20; + 1D5B : 3E; + 1D5C : DE; + 1D5D : A5; + 1D5E : 80; + 1D5F : 20; + 1D60 : 8D; + 1D61 : DD; + 1D62 : A5; + 1D63 : 81; + 1D64 : 20; + 1D65 : 8D; + 1D66 : DD; + 1D67 : 20; + 1D68 : 6C; + 1D69 : DE; + 1D6A : 20; + 1D6B : 99; + 1D6C : D5; + 1D6D : A9; + 1D6E : 02; + 1D6F : 20; + 1D70 : C8; + 1D71 : D4; + 1D72 : A6; + 1D73 : 82; + 1D74 : 38; + 1D75 : A9; + 1D76 : 00; + 1D77 : F5; + 1D78 : C7; + 1D79 : 95; + 1D7A : C1; + 1D7B : 20; + [1D7C..1D7D] : E2; + 1D7E : 20; + 1D7F : 19; + 1D80 : DE; + 1D81 : 20; + 1D82 : 5E; + 1D83 : DE; + 1D84 : 20; + 1D85 : 99; + 1D86 : D5; + 1D87 : 20; + 1D88 : F4; + 1D89 : EE; + 1D8A : 4C; + 1D8B : 98; + 1D8C : DC; + 1D8D : 48; + 1D8E : A6; + 1D8F : 82; + 1D90 : B5; + 1D91 : CD; + 1D92 : 4C; + 1D93 : FD; + 1D94 : CF; + 1D95 : 90; + 1D96 : 06; + 1D97 : A6; + 1D98 : 82; + 1D99 : 15; + 1D9A : EC; + 1D9B : D0; + 1D9C : 06; + 1D9D : A6; + 1D9E : 82; + 1D9F : 49; + 1DA0 : FF; + 1DA1 : 35; + 1DA2 : EC; + 1DA3 : 95; + 1DA4 : EC; + 1DA5 : 60; + 1DA6 : A6; + 1DA7 : 82; + 1DA8 : 35; + 1DA9 : EC; + 1DAA : 60; + 1DAB : 20; + 1DAC : 93; + 1DAD : DF; + 1DAE : AA; + 1DAF : BD; + 1DB0 : 5B; + 1DB1 : 02; + 1DB2 : 29; + 1DB3 : F0; + 1DB4 : C9; + 1DB5 : 90; + 1DB6 : 60; + 1DB7 : A2; + 1DB8 : 00; + 1DB9 : 86; + 1DBA : 71; + 1DBB : BD; + 1DBC : 2B; + 1DBD : 02; + 1DBE : C9; + 1DBF : FF; + 1DC0 : D0; + 1DC1 : 08; + 1DC2 : A6; + 1DC3 : 71; + 1DC4 : E8; + 1DC5 : E0; + 1DC6 : 10; + 1DC7 : 90; + 1DC8 : F0; + 1DC9 : 60; + 1DCA : 86; + 1DCB : 71; + 1DCC : 29; + 1DCD : 3F; + 1DCE : A8; + 1DCF : B9; + 1DD0 : EC; + 1DD1 : 00; + 1DD2 : 29; + 1DD3 : 01; + 1DD4 : 85; + 1DD5 : 70; + 1DD6 : AE; + 1DD7 : 53; + 1DD8 : 02; + 1DD9 : B5; + 1DDA : E2; + 1DDB : 29; + 1DDC : 01; + 1DDD : C5; + 1DDE : 70; + 1DDF : D0; + 1DE0 : E1; + 1DE1 : B9; + 1DE2 : 60; + 1DE3 : 02; + 1DE4 : D5; + 1DE5 : D8; + 1DE6 : D0; + 1DE7 : DA; + 1DE8 : B9; + 1DE9 : 66; + 1DEA : 02; + 1DEB : D5; + 1DEC : DD; + 1DED : D0; + 1DEE : D3; + 1DEF : 18; + 1DF0 : 60; + 1DF1 : 20; + 1DF2 : 9E; + 1DF3 : DF; + 1DF4 : 50; + 1DF5 : 06; + 1DF6 : 20; + 1DF7 : 5E; + 1DF8 : DE; + 1DF9 : 20; + 1DFA : 99; + 1DFB : D5; + 1DFC : 60; + 1DFD : 20; + 1DFE : 2B; + 1DFF : DE; + 1E00 : A5; + 1E01 : 80; + 1E02 : 91; + 1E03 : 94; + 1E04 : C8; + 1E05 : A5; + 1E06 : 81; + 1E07 : 91; + 1E08 : 94; + 1E09 : 4C; + 1E0A : 05; + 1E0B : E1; + 1E0C : 20; + 1E0D : 2B; + 1E0E : DE; + 1E0F : B1; + 1E10 : 94; + 1E11 : 85; + 1E12 : 80; + 1E13 : C8; + 1E14 : B1; + 1E15 : 94; + 1E16 : 85; + 1E17 : 81; + 1E18 : 60; + 1E19 : 20; + 1E1A : 2B; + 1E1B : DE; + 1E1C : A9; + 1E1D : 00; + 1E1E : 91; + 1E1F : 94; + 1E20 : C8; + 1E21 : A6; + 1E22 : 82; + 1E23 : B5; + 1E24 : C1; + 1E25 : AA; + 1E26 : CA; + 1E27 : 8A; + 1E28 : 91; + 1E29 : 94; + 1E2A : 60; + 1E2B : 20; + 1E2C : 93; + 1E2D : DF; + 1E2E : 0A; + 1E2F : AA; + 1E30 : B5; + 1E31 : 9A; + 1E32 : 85; + 1E33 : 95; + 1E34 : A9; + 1E35 : 00; + 1E36 : 85; + 1E37 : 94; + 1E38 : A0; + 1E39 : 00; + 1E3A : 60; + 1E3B : 20; + 1E3C : EB; + 1E3D : D0; + 1E3E : 20; + 1E3F : 93; + 1E40 : DF; + 1E41 : 85; + 1E42 : F9; + 1E43 : 0A; + 1E44 : A8; + 1E45 : B9; + 1E46 : 06; + 1E47 : 00; + 1E48 : 85; + 1E49 : 80; + 1E4A : B9; + 1E4B : 07; + 1E4C : 00; + 1E4D : 85; + 1E4E : 81; + 1E4F : 60; + 1E50 : A9; + 1E51 : 90; + 1E52 : 8D; + 1E53 : 4D; + 1E54 : 02; + 1E55 : D0; + 1E56 : 28; + 1E57 : A9; + 1E58 : 80; + 1E59 : 8D; + 1E5A : 4D; + 1E5B : 02; + 1E5C : D0; + 1E5D : 21; + 1E5E : A9; + 1E5F : 90; + 1E60 : 8D; + 1E61 : 4D; + 1E62 : 02; + 1E63 : D0; + 1E64 : 26; + 1E65 : A9; + 1E66 : 80; + 1E67 : 8D; + 1E68 : 4D; + 1E69 : 02; + 1E6A : D0; + 1E6B : 1F; + 1E6C : A9; + 1E6D : 90; + 1E6E : 8D; + 1E6F : 4D; + 1E70 : 02; + 1E71 : D0; + 1E72 : 02; + 1E73 : A9; + 1E74 : 80; + 1E75 : 8D; + 1E76 : 4D; + 1E77 : 02; + 1E78 : A6; + 1E79 : 82; + 1E7A : B5; + 1E7B : CD; + 1E7C : AA; + 1E7D : 10; + 1E7E : 13; + 1E7F : 20; + 1E80 : D0; + 1E81 : D6; + 1E82 : 20; + 1E83 : 93; + 1E84 : DF; + 1E85 : AA; + 1E86 : A5; + 1E87 : 7F; + 1E88 : 9D; + 1E89 : 5B; + 1E8A : 02; + 1E8B : 20; + 1E8C : 15; + 1E8D : E1; + 1E8E : 20; + 1E8F : 93; + 1E90 : DF; + 1E91 : AA; + 1E92 : 4C; + 1E93 : 06; + 1E94 : D5; + 1E95 : A9; + 1E96 : 00; + 1E97 : 20; + 1E98 : C8; + 1E99 : D4; + 1E9A : 20; + 1E9B : 37; + 1E9C : D1; + 1E9D : 85; + 1E9E : 80; + 1E9F : 20; + 1EA0 : 37; + 1EA1 : D1; + 1EA2 : 85; + 1EA3 : 81; + 1EA4 : 60; + 1EA5 : 48; + 1EA6 : A9; + 1EA7 : 00; + 1EA8 : 85; + 1EA9 : 6F; + 1EAA : 85; + 1EAB : 71; + 1EAC : B9; + 1EAD : E0; + 1EAE : FE; + 1EAF : 85; + 1EB0 : 70; + 1EB1 : BD; + 1EB2 : E0; + 1EB3 : FE; + 1EB4 : 85; + 1EB5 : 72; + 1EB6 : 68; + 1EB7 : A8; + 1EB8 : 88; + 1EB9 : B1; + 1EBA : 6F; + 1EBB : 91; + 1EBC : 71; + 1EBD : 88; + 1EBE : 10; + 1EBF : F9; + 1EC0 : 60; + 1EC1 : A8; + 1EC2 : B9; + 1EC3 : E0; + 1EC4 : FE; + 1EC5 : 85; + 1EC6 : 70; + 1EC7 : A9; + 1EC8 : 00; + 1EC9 : 85; + 1ECA : 6F; + 1ECB : A8; + 1ECC : 91; + 1ECD : 6F; + 1ECE : C8; + 1ECF : D0; + 1ED0 : FB; + 1ED1 : 60; + 1ED2 : A9; + 1ED3 : 00; + 1ED4 : 20; + 1ED5 : DC; + 1ED6 : DE; + 1ED7 : A0; + 1ED8 : 02; + 1ED9 : B1; + 1EDA : 94; + 1EDB : 60; + 1EDC : 85; + 1EDD : 94; + 1EDE : A6; + 1EDF : 82; + 1EE0 : B5; + 1EE1 : CD; + 1EE2 : AA; + 1EE3 : BD; + 1EE4 : E0; + 1EE5 : FE; + 1EE6 : 85; + 1EE7 : 95; + 1EE8 : 60; + 1EE9 : 48; + 1EEA : 20; + 1EEB : DC; + 1EEC : DE; + 1EED : 48; + 1EEE : 8A; + 1EEF : 0A; + 1EF0 : AA; + 1EF1 : 68; + 1EF2 : 95; + 1EF3 : 9A; + 1EF4 : 68; + 1EF5 : 95; + 1EF6 : 99; + 1EF7 : 60; + 1EF8 : 20; + 1EF9 : 66; + 1EFA : DF; + 1EFB : 30; + 1EFC : 0E; + 1EFD : 50; + 1EFE : 13; + 1EFF : A6; + 1F00 : 82; + 1F01 : B5; + 1F02 : CD; + 1F03 : 20; + 1F04 : 1B; + 1F05 : DF; + 1F06 : 20; + 1F07 : 66; + 1F08 : DF; + 1F09 : 10; + 1F0A : 07; + 1F0B : 20; + 1F0C : CB; + 1F0D : E1; + 1F0E : 2C; + 1F0F : CE; + 1F10 : FE; + 1F11 : 60; + 1F12 : A5; + 1F13 : D6; + 1F14 : 20; + 1F15 : E9; + 1F16 : DE; + 1F17 : 2C; + 1F18 : CD; + 1F19 : FE; + 1F1A : 60; + 1F1B : 85; + 1F1C : F9; + 1F1D : A9; + 1F1E : 80; + 1F1F : D0; + 1F20 : 04; + 1F21 : 85; + 1F22 : F9; + 1F23 : A9; + 1F24 : 90; + 1F25 : 48; + 1F26 : B5; + 1F27 : EC; + 1F28 : 29; + 1F29 : 01; + 1F2A : 85; + 1F2B : 7F; + 1F2C : 68; + 1F2D : 05; + 1F2E : 7F; + 1F2F : 8D; + 1F30 : 4D; + 1F31 : 02; + 1F32 : B1; + 1F33 : 94; + 1F34 : 85; + 1F35 : 80; + 1F36 : C8; + 1F37 : B1; + 1F38 : 94; + 1F39 : 85; + 1F3A : 81; + 1F3B : A5; + 1F3C : F9; + 1F3D : 20; + 1F3E : D3; + 1F3F : D6; + 1F40 : A6; + 1F41 : F9; + 1F42 : 4C; + 1F43 : 93; + 1F44 : D5; + 1F45 : A6; + 1F46 : 82; + 1F47 : B5; + 1F48 : CD; + 1F49 : 4C; + 1F4A : EB; + 1F4B : D4; + 1F4C : A9; + 1F4D : 78; + 1F4E : 20; + 1F4F : 5C; + 1F50 : DF; + 1F51 : CA; + 1F52 : 10; + 1F53 : F8; + 1F54 : A5; + 1F55 : 72; + 1F56 : 4A; + 1F57 : 20; + 1F58 : 5C; + 1F59 : DF; + 1F5A : A5; + 1F5B : 73; + 1F5C : 18; + 1F5D : 65; + 1F5E : 70; + 1F5F : 85; + 1F60 : 70; + 1F61 : 90; + 1F62 : 02; + 1F63 : E6; + 1F64 : 71; + 1F65 : 60; + 1F66 : 20; + 1F67 : D2; + 1F68 : DE; + 1F69 : C5; + 1F6A : D5; + 1F6B : D0; + 1F6C : 0E; + 1F6D : A4; + 1F6E : D6; + 1F6F : B1; + 1F70 : 94; + 1F71 : F0; + 1F72 : 04; + 1F73 : 2C; + 1F74 : CD; + 1F75 : FE; + 1F76 : 60; + 1F77 : 2C; + 1F78 : CF; + 1F79 : FE; + 1F7A : 60; + 1F7B : A5; + 1F7C : D5; + 1F7D : C9; + 1F7E : 06; + 1F7F : B0; + [1F80..1F81] : 0A; + 1F82 : A8; + 1F83 : A9; + 1F84 : 04; + 1F85 : 85; + 1F86 : 94; + 1F87 : B1; + 1F88 : 94; + 1F89 : D0; + 1F8A : 04; + 1F8B : 2C; + 1F8C : D0; + 1F8D : FE; + 1F8E : 60; + 1F8F : 2C; + 1F90 : CE; + 1F91 : FE; + 1F92 : 60; + 1F93 : A6; + 1F94 : 82; + 1F95 : B5; + 1F96 : A7; + 1F97 : 10; + 1F98 : 02; + 1F99 : B5; + 1F9A : AE; + 1F9B : 29; + 1F9C : BF; + 1F9D : 60; + 1F9E : A6; + 1F9F : 82; + 1FA0 : 8E; + 1FA1 : 57; + 1FA2 : 02; + 1FA3 : B5; + 1FA4 : A7; + 1FA5 : 10; + 1FA6 : 09; + 1FA7 : 8A; + 1FA8 : 18; + 1FA9 : 69; + 1FAA : 07; + 1FAB : 8D; + 1FAC : 57; + 1FAD : 02; + 1FAE : B5; + 1FAF : AE; + 1FB0 : 85; + 1FB1 : 70; + 1FB2 : 29; + 1FB3 : 1F; + 1FB4 : 24; + 1FB5 : 70; + 1FB6 : 60; + 1FB7 : A6; + 1FB8 : 82; + 1FB9 : B5; + 1FBA : A7; + 1FBB : 30; + 1FBC : 02; + 1FBD : B5; + 1FBE : AE; + 1FBF : C9; + 1FC0 : FF; + 1FC1 : 60; + 1FC2 : A6; + 1FC3 : 82; + 1FC4 : 09; + 1FC5 : 80; + 1FC6 : B4; + 1FC7 : A7; + 1FC8 : 10; + 1FC9 : 03; + 1FCA : 95; + 1FCB : A7; + 1FCC : 60; + 1FCD : 95; + 1FCE : AE; + 1FCF : 60; + 1FD0 : A9; + [1FD1..1FD2] : 20; + 1FD3 : 9D; + 1FD4 : DD; + 1FD5 : A9; + 1FD6 : 80; + 1FD7 : 20; + 1FD8 : A6; + 1FD9 : DD; + 1FDA : D0; + 1FDB : 41; + 1FDC : A6; + 1FDD : 82; + 1FDE : F6; + 1FDF : B5; + 1FE0 : D0; + 1FE1 : 02; + 1FE2 : F6; + 1FE3 : BB; + 1FE4 : A6; + 1FE5 : 82; + 1FE6 : B5; + 1FE7 : C1; + 1FE8 : F0; + 1FE9 : 2E; + 1FEA : 20; + 1FEB : E8; + 1FEC : D4; + 1FED : A6; + 1FEE : 82; + 1FEF : D5; + 1FF0 : C1; + 1FF1 : 90; + 1FF2 : 03; + 1FF3 : 20; + 1FF4 : 3C; + 1FF5 : E0; + 1FF6 : A6; + 1FF7 : 82; + 1FF8 : B5; + 1FF9 : C1; + 1FFA : 20; + 1FFB : C8; + 1FFC : D4; + 1FFD : A1; + 1FFE : 99; + [1FFF..2000] : 85; + 2001 : A9; + [2002..2003] : 20; + 2004 : 9D; + 2005 : DD; + 2006 : 20; + 2007 : 04; + 2008 : E3; + 2009 : 48; + 200A : 90; + 200B : 28; + 200C : A9; + 200D : 00; + 200E : 20; + 200F : F6; + 2010 : D4; + 2011 : D0; + 2012 : 21; + 2013 : 68; + 2014 : C9; + 2015 : 02; + 2016 : F0; + 2017 : 12; + 2018 : A9; + 2019 : 80; + 201A : 20; + 201B : 97; + 201C : DD; + 201D : 20; + 201E : 2F; + 201F : D1; + 2020 : B5; + [2021..2022] : 99; + 2023 : 44; + 2024 : 02; + 2025 : A9; + 2026 : 0D; + [2027..2028] : 85; + 2029 : 60; + 202A : 20; + 202B : 35; + 202C : E0; + 202D : A6; + 202E : 82; + 202F : A9; + 2030 : 00; + 2031 : 95; + 2032 : C1; + 2033 : 60; + 2034 : 68; + 2035 : A6; + 2036 : 82; + 2037 : 95; + 2038 : C1; + 2039 : 4C; + 203A : 6E; + 203B : E1; + 203C : 20; + 203D : D3; + 203E : D1; + 203F : 20; + 2040 : 95; + 2041 : DE; + 2042 : 20; + 2043 : 9E; + 2044 : DF; + 2045 : 50; + 2046 : 16; + 2047 : 20; + 2048 : 5E; + 2049 : DE; + 204A : 20; + 204B : 1E; + 204C : CF; + 204D : A9; + 204E : 02; + 204F : 20; + 2050 : C8; + 2051 : D4; + 2052 : 20; + 2053 : AB; + 2054 : DD; + 2055 : D0; + 2056 : 24; + 2057 : 20; + 2058 : 57; + 2059 : DE; + 205A : 4C; + 205B : 99; + 205C : D5; + 205D : 20; + 205E : 1E; + 205F : CF; + 2060 : 20; + 2061 : AB; + 2062 : DD; + 2063 : D0; + 2064 : 06; + 2065 : 20; + 2066 : 57; + 2067 : DE; + 2068 : 20; + 2069 : 99; + 206A : D5; + 206B : 20; + 206C : 95; + 206D : DE; + 206E : A5; + 206F : 80; + 2070 : F0; + 2071 : 09; + 2072 : 20; + 2073 : 1E; + 2074 : CF; + 2075 : 20; + 2076 : 57; + 2077 : DE; + 2078 : 20; + 2079 : 1E; + 207A : CF; + 207B : 60; + 207C : 20; + 207D : 05; + 207E : E1; + 207F : 20; + 2080 : 93; + 2081 : DF; + 2082 : 0A; + 2083 : AA; + 2084 : A5; + 2085 : 85; + 2086 : 81; + 2087 : 99; + 2088 : B4; + 2089 : 99; + 208A : C8; + 208B : D0; + 208C : 09; + 208D : A4; + 208E : 82; + 208F : B9; + 2090 : C1; + 2091 : 00; + 2092 : F0; + 2093 : 0A; + 2094 : A0; + 2095 : 02; + 2096 : 98; + 2097 : A4; + 2098 : 82; + 2099 : D9; + 209A : C1; + 209B : 00; + 209C : D0; + 209D : 05; + 209E : A9; + 209F : 20; + 20A0 : 4C; + 20A1 : 97; + 20A2 : DD; + 20A3 : F6; + 20A4 : 99; + 20A5 : D0; + 20A6 : 03; + 20A7 : 20; + 20A8 : 3C; + 20A9 : E0; + 20AA : 60; + 20AB : A9; + 20AC : A0; + 20AD : 20; + 20AE : A6; + 20AF : DD; + 20B0 : D0; + 20B1 : 27; + 20B2 : A5; + 20B3 : 85; + 20B4 : 20; + 20B5 : 7C; + 20B6 : E0; + 20B7 : A5; + 20B8 : F8; + 20B9 : F0; + 20BA : 0D; + 20BB : 60; + 20BC : A9; + [20BD..20BE] : 20; + 20BF : A6; + 20C0 : DD; + 20C1 : F0; + 20C2 : 05; + 20C3 : A9; + 20C4 : 51; + 20C5 : 8D; + 20C6 : 6C; + 20C7 : 02; + 20C8 : 20; + 20C9 : F3; + 20CA : E0; + 20CB : 20; + 20CC : 53; + 20CD : E1; + 20CE : AD; + 20CF : 6C; + 20D0 : 02; + 20D1 : F0; + 20D2 : 03; + 20D3 : 4C; + 20D4 : C8; + 20D5 : C1; + 20D6 : 4C; + 20D7 : BC; + 20D8 : E6; + 20D9 : 29; + 20DA : 80; + 20DB : D0; + 20DC : 05; + 20DD : A5; + 20DE : F8; + 20DF : F0; + 20E0 : DB; + 20E1 : 60; + 20E2 : A5; + 20E3 : 85; + 20E4 : 48; + 20E5 : 20; + 20E6 : 1C; + 20E7 : E3; + 20E8 : 68; + [20E9..20EA] : 85; + 20EB : A9; + 20EC : 80; + 20ED : 20; + 20EE : 9D; + 20EF : DD; + 20F0 : 4C; + 20F1 : B2; + 20F2 : E0; + 20F3 : A9; + [20F4..20F5] : 20; + 20F6 : A6; + 20F7 : DD; + 20F8 : D0; + 20F9 : 0A; + 20FA : A9; + 20FB : 00; + [20FC..20FD] : 85; + 20FE : 20; + 20FF : 7C; + 2100 : E0; + 2101 : 4C; + 2102 : F3; + 2103 : E0; + 2104 : 60; + 2105 : A9; + 2106 : 40; + 2107 : 20; + 2108 : 97; + 2109 : DD; + 210A : 20; + 210B : 9E; + 210C : DF; + 210D : 09; + 210E : 40; + 210F : AE; + 2110 : 57; + 2111 : 02; + 2112 : 95; + 2113 : A7; + 2114 : 60; + 2115 : 20; + 2116 : 9E; + 2117 : DF; + 2118 : 29; + 2119 : BF; + 211A : AE; + 211B : 57; + 211C : 02; + 211D : 95; + 211E : A7; + 211F : 60; + 2120 : A9; + 2121 : 80; + 2122 : 20; + 2123 : A6; + 2124 : DD; + 2125 : D0; + 2126 : 37; + 2127 : 20; + 2128 : 2F; + 2129 : D1; + 212A : B5; + 212B : 99; + 212C : D9; + 212D : 44; + 212E : 02; + 212F : F0; + 2130 : 22; + 2131 : F6; + 2132 : 99; + 2133 : D0; + 2134 : 06; + 2135 : 20; + 2136 : 3C; + 2137 : E0; + 2138 : 20; + 2139 : 2F; + 213A : D1; + 213B : A1; + [213C..213D] : 99; + 213E : 3E; + 213F : 02; + 2140 : A9; + 2141 : 89; + 2142 : 99; + 2143 : F2; + 2144 : 00; + 2145 : B5; + 2146 : 99; + 2147 : D9; + 2148 : 44; + 2149 : 02; + 214A : F0; + 214B : 01; + 214C : 60; + 214D : A9; + 214E : 81; + 214F : 99; + 2150 : F2; + 2151 : 00; + 2152 : 60; + 2153 : 20; + 2154 : D0; + 2155 : DF; + 2156 : 20; + 2157 : 2F; + 2158 : D1; + 2159 : A5; + 215A : 85; + 215B : 4C; + 215C : 3D; + 215D : E1; + 215E : A6; + 215F : 82; + 2160 : A9; + 2161 : 0D; + 2162 : 9D; + 2163 : 3E; + 2164 : 02; + 2165 : A9; + 2166 : 81; + 2167 : 95; + 2168 : F2; + 2169 : A9; + 216A : 50; + 216B : 20; + 216C : C8; + 216D : C1; + 216E : A6; + 216F : 82; + 2170 : B5; + 2171 : C1; + 2172 : 85; + 2173 : 87; + 2174 : C6; + 2175 : 87; + 2176 : C9; + 2177 : 02; + 2178 : D0; + 2179 : 04; + 217A : A9; + 217B : FF; + 217C : 85; + 217D : 87; + 217E : B5; + 217F : C7; + 2180 : 85; + 2181 : 88; + 2182 : 20; + 2183 : E8; + 2184 : D4; + 2185 : A6; + 2186 : 82; + 2187 : C5; + 2188 : 87; + 2189 : 90; + 218A : 19; + 218B : F0; + 218C : 17; + 218D : 20; + 218E : 1E; + 218F : CF; + 2190 : 20; + 2191 : B2; + 2192 : E1; + 2193 : 90; + 2194 : 08; + 2195 : A6; + 2196 : 82; + 2197 : 9D; + 2198 : 44; + 2199 : 02; + 219A : 4C; + 219B : 1E; + 219C : CF; + 219D : 20; + 219E : 1E; + 219F : CF; + 21A0 : A9; + 21A1 : FF; + 21A2 : 85; + 21A3 : 87; + 21A4 : 20; + 21A5 : B2; + 21A6 : E1; + 21A7 : B0; + 21A8 : 03; + 21A9 : 20; + 21AA : E8; + 21AB : D4; + 21AC : A6; + 21AD : 82; + 21AE : 9D; + 21AF : 44; + 21B0 : 02; + 21B1 : 60; + 21B2 : 20; + 21B3 : 2B; + 21B4 : DE; + 21B5 : A4; + 21B6 : 87; + 21B7 : B1; + 21B8 : 94; + 21B9 : D0; + 21BA : 0D; + 21BB : 88; + 21BC : C0; + 21BD : 02; + 21BE : 90; + 21BF : 04; + 21C0 : C6; + 21C1 : 88; + 21C2 : D0; + 21C3 : F3; + 21C4 : C6; + 21C5 : 88; + 21C6 : 18; + 21C7 : 60; + 21C8 : 98; + 21C9 : 38; + 21CA : 60; + 21CB : 20; + 21CC : D2; + 21CD : DE; + 21CE : 85; + 21CF : D5; + 21D0 : A9; + 21D1 : 04; + 21D2 : 85; + 21D3 : 94; + 21D4 : A0; + 21D5 : 0A; + 21D6 : D0; + 21D7 : 04; + [21D8..21D9] : 88; + 21DA : 30; + 21DB : 26; + 21DC : B1; + 21DD : 94; + 21DE : F0; + 21DF : F8; + 21E0 : 98; + 21E1 : 4A; + 21E2 : C5; + 21E3 : D5; + 21E4 : F0; + 21E5 : 09; + 21E6 : 85; + 21E7 : D5; + 21E8 : A6; + 21E9 : 82; + 21EA : B5; + 21EB : CD; + 21EC : 20; + 21ED : 1B; + 21EE : DF; + 21EF : A0; + 21F0 : 00; + 21F1 : 84; + 21F2 : 94; + 21F3 : B1; + 21F4 : 94; + 21F5 : D0; + 21F6 : 0B; + 21F7 : C8; + 21F8 : B1; + 21F9 : 94; + 21FA : A8; + 21FB : 88; + 21FC : 84; + 21FD : D6; + 21FE : 98; + 21FF : 4C; + 2200 : E9; + 2201 : DE; + 2202 : A9; + 2203 : 67; + 2204 : 20; + 2205 : 45; + 2206 : E6; + 2207 : 20; + 2208 : B3; + 2209 : C2; + 220A : AD; + 220B : 01; + 220C : 02; + 220D : 85; + 220E : 83; + 220F : 20; + 2210 : EB; + 2211 : D0; + 2212 : 90; + 2213 : 05; + 2214 : A9; + 2215 : 70; + 2216 : 20; + 2217 : C8; + 2218 : C1; + 2219 : A9; + 221A : A0; + 221B : 20; + 221C : 9D; + 221D : DD; + 221E : 20; + 221F : 25; + 2220 : D1; + 2221 : F0; + 2222 : 05; + 2223 : A9; + 2224 : 64; + 2225 : 20; + 2226 : C8; + 2227 : C1; + 2228 : B5; + 2229 : EC; + 222A : 29; + 222B : 01; + 222C : 85; + 222D : 7F; + 222E : AD; + [222F..2230] : 02; + 2231 : 95; + 2232 : B5; + 2233 : AD; + 2234 : 03; + 2235 : 02; + 2236 : 95; + 2237 : BB; + 2238 : A6; + 2239 : 82; + 223A : A9; + 223B : 89; + 223C : 95; + 223D : F2; + 223E : AD; + 223F : 04; + 2240 : 02; + 2241 : F0; + 2242 : 10; + 2243 : 38; + 2244 : E9; + 2245 : 01; + 2246 : F0; + 2247 : 0B; + 2248 : D5; + 2249 : C7; + 224A : 90; + 224B : 07; + 224C : A9; + 224D : 51; + 224E : 8D; + 224F : 6C; + 2250 : 02; + 2251 : A9; + 2252 : 00; + 2253 : 85; + 2254 : D4; + 2255 : 20; + 2256 : 0E; + 2257 : CE; + 2258 : 20; + 2259 : F8; + 225A : DE; + 225B : 50; + 225C : 08; + 225D : A9; + 225E : 80; + 225F : 20; + 2260 : 97; + 2261 : DD; + 2262 : 4C; + 2263 : 5E; + 2264 : E1; + 2265 : 20; + 2266 : 75; + 2267 : E2; + 2268 : A9; + 2269 : 80; + 226A : 20; + 226B : A6; + 226C : DD; + 226D : F0; + 226E : 03; + 226F : 4C; + 2270 : 5E; + 2271 : E1; + 2272 : 4C; + 2273 : 94; + 2274 : C1; + 2275 : 20; + 2276 : 9C; + 2277 : E2; + 2278 : A5; + 2279 : D7; + 227A : 20; + 227B : C8; + 227C : D4; + 227D : A6; + 227E : 82; + 227F : B5; + 2280 : C7; + 2281 : 38; + 2282 : E5; + 2283 : D4; + 2284 : B0; + 2285 : 03; + 2286 : 4C; + 2287 : 02; + 2288 : E2; + 2289 : 18; + 228A : 65; + 228B : D7; + 228C : 90; + 228D : 03; + 228E : 69; + 228F : 01; + 2290 : 38; + 2291 : 20; + 2292 : 09; + 2293 : E0; + 2294 : 4C; + 2295 : 38; + 2296 : E1; + 2297 : A9; + 2298 : 51; + 2299 : 20; + 229A : C8; + 229B : C1; + 229C : A5; + 229D : 94; + 229E : 85; + 229F : 89; + 22A0 : A5; + 22A1 : 95; + 22A2 : 85; + 22A3 : 8A; + 22A4 : 20; + 22A5 : D0; + 22A6 : E2; + 22A7 : D0; + 22A8 : 01; + 22A9 : 60; + 22AA : 20; + 22AB : F1; + 22AC : DD; + 22AD : 20; + 22AE : 0C; + 22AF : DE; + 22B0 : A5; + 22B1 : 80; + 22B2 : F0; + 22B3 : 0E; + 22B4 : 20; + 22B5 : D3; + 22B6 : E2; + 22B7 : D0; + 22B8 : 06; + 22B9 : 20; + 22BA : 1E; + 22BB : CF; + 22BC : 4C; + 22BD : DA; + 22BE : D2; + 22BF : 20; + 22C0 : DA; + 22C1 : D2; + 22C2 : A0; + 22C3 : 00; + 22C4 : B1; + 22C5 : 89; + 22C6 : 85; + 22C7 : 80; + 22C8 : C8; + 22C9 : B1; + 22CA : 89; + 22CB : 85; + 22CC : 81; + 22CD : 4C; + 22CE : AF; + 22CF : D0; + 22D0 : 20; + 22D1 : 3E; + 22D2 : DE; + 22D3 : A0; + 22D4 : 00; + 22D5 : B1; + 22D6 : 89; + 22D7 : C5; + 22D8 : 80; + 22D9 : F0; + 22DA : 01; + 22DB : 60; + 22DC : C8; + 22DD : B1; + 22DE : 89; + 22DF : C5; + 22E0 : 81; + 22E1 : 60; + 22E2 : 20; + 22E3 : 2B; + 22E4 : DE; + 22E5 : A0; + 22E6 : 02; + 22E7 : A9; + 22E8 : 00; + 22E9 : 91; + 22EA : 94; + 22EB : C8; + 22EC : D0; + 22ED : FB; + 22EE : 20; + 22EF : 04; + 22F0 : E3; + 22F1 : 95; + 22F2 : C1; + 22F3 : A8; + 22F4 : A9; + 22F5 : FF; + 22F6 : 91; + 22F7 : 94; + 22F8 : 20; + 22F9 : 04; + 22FA : E3; + 22FB : 90; + 22FC : F4; + 22FD : D0; + 22FE : 04; + 22FF : A9; + 2300 : 00; + 2301 : 95; + 2302 : C1; + 2303 : 60; + 2304 : A6; + 2305 : 82; + 2306 : B5; + 2307 : C1; + 2308 : 38; + 2309 : F0; + 230A : 0D; + 230B : 18; + 230C : 75; + 230D : C7; + 230E : 90; + 230F : 0B; + 2310 : D0; + 2311 : 06; + 2312 : A9; + 2313 : 02; + 2314 : 2C; + 2315 : CC; + 2316 : FE; + 2317 : 60; + 2318 : 69; + 2319 : 01; + 231A : 38; + 231B : 60; + 231C : 20; + 231D : D3; + 231E : D1; + 231F : 20; + 2320 : CB; + 2321 : E1; + 2322 : 20; + 2323 : 9C; + 2324 : E2; + 2325 : 20; + 2326 : 7B; + 2327 : CF; + 2328 : A5; + 2329 : D6; + 232A : 85; + 232B : 87; + 232C : A5; + 232D : D5; + 232E : 85; + 232F : 86; + 2330 : A9; + 2331 : 00; + 2332 : 85; + 2333 : 88; + 2334 : A9; + 2335 : 00; + 2336 : 85; + 2337 : D4; + 2338 : 20; + 2339 : 0E; + 233A : CE; + 233B : 20; + 233C : 4D; + 233D : EF; + 233E : A4; + 233F : 82; + 2340 : B6; + 2341 : C7; + 2342 : CA; + 2343 : 8A; + 2344 : 18; + 2345 : 65; + 2346 : D7; + 2347 : 90; + 2348 : 0C; + 2349 : E6; + 234A : D6; + 234B : E6; + 234C : D6; + 234D : D0; + 234E : 06; + 234F : E6; + 2350 : D5; + 2351 : A9; + 2352 : 10; + 2353 : 85; + 2354 : D6; + 2355 : A5; + 2356 : 87; + 2357 : 18; + 2358 : 69; + 2359 : 02; + 235A : 20; + 235B : E9; + 235C : DE; + 235D : A5; + 235E : D5; + 235F : C9; + 2360 : 06; + 2361 : 90; + 2362 : 05; + 2363 : A9; + 2364 : 52; + 2365 : 20; + 2366 : C8; + 2367 : C1; + 2368 : A5; + 2369 : D6; + 236A : 38; + 236B : E5; + 236C : 87; + 236D : B0; + 236E : 03; + 236F : E9; + 2370 : 0F; + 2371 : 18; + 2372 : 85; + 2373 : 72; + 2374 : A5; + 2375 : D5; + 2376 : E5; + 2377 : 86; + 2378 : 85; + 2379 : 73; + 237A : A2; + 237B : 00; + 237C : 86; + 237D : 70; + 237E : 86; + 237F : 71; + 2380 : AA; + 2381 : 20; + 2382 : 51; + 2383 : DF; + 2384 : A5; + 2385 : 71; + 2386 : D0; + 2387 : 07; + 2388 : A6; + 2389 : 70; + 238A : CA; + 238B : D0; + 238C : 02; + 238D : E6; + 238E : 88; + 238F : CD; + 2390 : 73; + 2391 : 02; + 2392 : 90; + 2393 : 09; + 2394 : D0; + 2395 : CD; + 2396 : AD; + 2397 : 72; + 2398 : 02; + 2399 : C5; + 239A : 70; + 239B : 90; + 239C : C6; + 239D : A9; + 239E : 01; + 239F : 20; + 23A0 : F6; + 23A1 : D4; + 23A2 : 18; + 23A3 : 69; + 23A4 : 01; + 23A5 : A6; + 23A6 : 82; + 23A7 : 95; + 23A8 : C1; + 23A9 : 20; + 23AA : 1E; + 23AB : F1; + 23AC : 20; + 23AD : FD; + 23AE : DD; + 23AF : A5; + 23B0 : 88; + 23B1 : D0; + 23B2 : 15; + 23B3 : 20; + 23B4 : 5E; + 23B5 : DE; + 23B6 : 20; + 23B7 : 1E; + 23B8 : CF; + 23B9 : 20; + 23BA : D0; + 23BB : D6; + 23BC : 20; + 23BD : 1E; + 23BE : F1; + 23BF : 20; + 23C0 : FD; + 23C1 : DD; + 23C2 : 20; + [23C3..23C4] : E2; + 23C5 : 4C; + 23C6 : D4; + 23C7 : E3; + 23C8 : 20; + 23C9 : 1E; + 23CA : CF; + 23CB : 20; + 23CC : D0; + 23CD : D6; + 23CE : 20; + [23CF..23D0] : E2; + 23D1 : 20; + 23D2 : 19; + 23D3 : DE; + 23D4 : 20; + 23D5 : 5E; + 23D6 : DE; + 23D7 : 20; + 23D8 : 0C; + 23D9 : DE; + 23DA : A5; + 23DB : 80; + 23DC : 48; + 23DD : A5; + 23DE : 81; + 23DF : 48; + 23E0 : 20; + 23E1 : 3E; + 23E2 : DE; + 23E3 : A5; + 23E4 : 81; + 23E5 : 48; + 23E6 : A5; + 23E7 : 80; + 23E8 : 48; + 23E9 : 20; + 23EA : 45; + 23EB : DF; + 23EC : AA; + 23ED : D0; + 23EE : 0A; + 23EF : 20; + 23F0 : 4E; + 23F1 : E4; + 23F2 : A9; + 23F3 : 10; + 23F4 : 20; + 23F5 : E9; + 23F6 : DE; + 23F7 : E6; + 23F8 : 86; + 23F9 : 68; + 23FA : 20; + 23FB : 8D; + 23FC : DD; + 23FD : 68; + 23FE : 20; + 23FF : 8D; + 2400 : DD; + 2401 : 68; + 2402 : 85; + 2403 : 81; + 2404 : 68; + 2405 : 85; + 2406 : 80; + 2407 : F0; + 2408 : 0F; + 2409 : A5; + 240A : 86; + 240B : C5; + 240C : D5; + 240D : D0; + 240E : A7; + 240F : 20; + 2410 : 45; + 2411 : DF; + 2412 : C5; + 2413 : D6; + 2414 : 90; + 2415 : A0; + 2416 : F0; + 2417 : B0; + 2418 : 20; + 2419 : 45; + 241A : DF; + 241B : 48; + 241C : A9; + 241D : 00; + 241E : 20; + 241F : DC; + 2420 : DE; + 2421 : A9; + 2422 : 00; + 2423 : A8; + 2424 : 91; + 2425 : 94; + 2426 : C8; + 2427 : 68; + 2428 : 38; + 2429 : E9; + 242A : 01; + 242B : 91; + 242C : 94; + 242D : 20; + 242E : 6C; + 242F : DE; + 2430 : 20; + 2431 : 99; + 2432 : D5; + 2433 : 20; + 2434 : F4; + 2435 : EE; + 2436 : 20; + 2437 : 0E; + 2438 : CE; + 2439 : 20; + 243A : 1E; + 243B : CF; + 243C : 20; + 243D : F8; + 243E : DE; + 243F : 70; + 2440 : 03; + 2441 : 4C; + 2442 : 75; + 2443 : E2; + 2444 : A9; + 2445 : 80; + 2446 : 20; + 2447 : 97; + 2448 : DD; + 2449 : A9; + 244A : 50; + 244B : 20; + 244C : C8; + 244D : C1; + 244E : 20; + 244F : 1E; + 2450 : F1; + 2451 : 20; + 2452 : 1E; + 2453 : CF; + 2454 : 20; + 2455 : F1; + 2456 : DD; + 2457 : 20; + 2458 : 93; + 2459 : DF; + 245A : 48; + 245B : 20; + 245C : C1; + 245D : DE; + 245E : A6; + 245F : 82; + 2460 : B5; + 2461 : CD; + 2462 : A8; + 2463 : 68; + 2464 : AA; + 2465 : A9; + 2466 : 10; + 2467 : 20; + 2468 : A5; + 2469 : DE; + 246A : A9; + 246B : 00; + 246C : 20; + 246D : DC; + 246E : DE; + 246F : A0; + 2470 : 02; + 2471 : B1; + 2472 : 94; + 2473 : 48; + 2474 : A9; + 2475 : 00; + 2476 : 20; + 2477 : C8; + 2478 : D4; + 2479 : 68; + 247A : 18; + 247B : 69; + 247C : 01; + 247D : 91; + 247E : 94; + 247F : 0A; + 2480 : 69; + 2481 : 04; + 2482 : 85; + 2483 : 89; + 2484 : A8; + 2485 : 38; + 2486 : E9; + 2487 : 02; + 2488 : 85; + 2489 : 8A; + 248A : A5; + 248B : 80; + 248C : 85; + 248D : 87; + 248E : 91; + 248F : 94; + 2490 : C8; + 2491 : A5; + 2492 : 81; + 2493 : 85; + 2494 : 88; + 2495 : 91; + 2496 : 94; + 2497 : A0; + 2498 : 00; + 2499 : 98; + 249A : 91; + 249B : 94; + 249C : C8; + 249D : A9; + 249E : 11; + 249F : 91; + 24A0 : 94; + 24A1 : A9; + 24A2 : 10; + 24A3 : 20; + 24A4 : C8; + 24A5 : D4; + 24A6 : 20; + 24A7 : 50; + 24A8 : DE; + 24A9 : 20; + 24AA : 99; + 24AB : D5; + 24AC : A6; + 24AD : 82; + 24AE : B5; + 24AF : CD; + 24B0 : 48; + 24B1 : 20; + 24B2 : 9E; + 24B3 : DF; + 24B4 : A6; + 24B5 : 82; + 24B6 : 95; + 24B7 : CD; + 24B8 : 68; + 24B9 : AE; + 24BA : 57; + 24BB : 02; + 24BC : 95; + 24BD : A7; + 24BE : A9; + 24BF : 00; + 24C0 : 20; + 24C1 : C8; + 24C2 : D4; + 24C3 : A0; + 24C4 : 00; + 24C5 : A5; + 24C6 : 80; + 24C7 : 91; + 24C8 : 94; + 24C9 : C8; + 24CA : A5; + 24CB : 81; + 24CC : 91; + 24CD : 94; + 24CE : 4C; + 24CF : DE; + 24D0 : E4; + 24D1 : 20; + 24D2 : 93; + 24D3 : DF; + 24D4 : A6; + 24D5 : 82; + 24D6 : 20; + 24D7 : 1B; + 24D8 : DF; + 24D9 : A9; + 24DA : 00; + 24DB : 20; + 24DC : C8; + 24DD : D4; + 24DE : C6; + 24DF : 8A; + 24E0 : C6; + 24E1 : 8A; + 24E2 : A4; + 24E3 : 89; + 24E4 : A5; + 24E5 : 87; + 24E6 : 91; + 24E7 : 94; + 24E8 : C8; + 24E9 : A5; + 24EA : 88; + 24EB : 91; + 24EC : 94; + 24ED : 20; + 24EE : 5E; + 24EF : DE; + 24F0 : 20; + 24F1 : 99; + 24F2 : D5; + 24F3 : A4; + 24F4 : 8A; + 24F5 : C0; + 24F6 : 03; + 24F7 : B0; + 24F8 : D8; + 24F9 : 4C; + 24FA : 1E; + 24FB : CF; + 24FC : 00; + 24FD : A0; + 24FE : 4F; + 24FF : CB; + 2500 : 20; + 2501 : 21; + 2502 : 22; + 2503 : 23; + 2504 : 24; + 2505 : 27; + 2506 : D2; + 2507 : 45; + 2508 : 41; + 2509 : 44; + 250A : 89; + 250B : 52; + 250C : 83; + 250D : 20; + 250E : 54; + [250F..2510] : 4F; + 2511 : 20; + 2512 : 4C; + 2513 : 41; + 2514 : 52; + 2515 : 47; + 2516 : C5; + 2517 : 50; + 2518 : 8B; + 2519 : 06; + 251A : 20; + 251B : 50; + 251C : 52; + 251D : 45; + 251E : 53; + 251F : 45; + 2520 : 4E; + 2521 : D4; + 2522 : 51; + 2523 : CF; + 2524 : 56; + 2525 : 45; + 2526 : 52; + 2527 : 46; + 2528 : 4C; + 2529 : 4F; + 252A : 57; + 252B : 20; + 252C : 49; + 252D : 4E; + 252E : 8B; + 252F : 25; + 2530 : 28; + 2531 : 8A; + 2532 : 89; + 2533 : 26; + 2534 : 8A; + 2535 : 20; + 2536 : 50; + 2537 : 52; + 2538 : 4F; + 2539 : 54; + 253A : 45; + 253B : 43; + 253C : 54; + 253D : 20; + 253E : 4F; + 253F : CE; + 2540 : 29; + 2541 : 88; + 2542 : 20; + 2543 : 49; + 2544 : 44; + 2545 : 85; + 2546 : 30; + 2547 : 31; + 2548 : 32; + 2549 : 33; + 254A : 34; + 254B : D3; + 254C : 59; + 254D : 4E; + 254E : 54; + 254F : 41; + 2550 : 58; + 2551 : 89; + 2552 : 60; + 2553 : 8A; + 2554 : 03; + 2555 : 84; + 2556 : 63; + 2557 : 83; + 2558 : 20; + 2559 : 45; + 255A : 58; + 255B : 49; + 255C : 53; + 255D : 54; + 255E : D3; + 255F : 64; + 2560 : 83; + 2561 : 20; + 2562 : 54; + 2563 : 59; + 2564 : 50; + 2565 : 45; + 2566 : 85; + 2567 : 65; + 2568 : CE; + 2569 : 4F; + 256A : 20; + 256B : 42; + 256C : 4C; + 256D : 4F; + 256E : 43; + 256F : CB; + 2570 : 66; + 2571 : 67; + 2572 : C9; + [2573..2574] : 4C; + 2575 : 45; + 2576 : 47; + 2577 : 41; + 2578 : 4C; + 2579 : 20; + 257A : 54; + 257B : 52; + 257C : 41; + 257D : 43; + 257E : 4B; + 257F : 20; + 2580 : 4F; + 2581 : 52; + 2582 : 20; + 2583 : 53; + 2584 : 45; + 2585 : 43; + 2586 : 54; + 2587 : 4F; + 2588 : D2; + 2589 : 61; + 258A : 83; + 258B : 06; + 258C : 84; + 258D : 39; + 258E : 62; + 258F : 83; + 2590 : 06; + 2591 : 87; + 2592 : 01; + 2593 : 83; + 2594 : 53; + 2595 : 20; + 2596 : 53; + 2597 : 43; + 2598 : 52; + 2599 : 41; + 259A : 54; + 259B : 43; + 259C : 48; + 259D : 45; + 259E : C4; + 259F : 70; + 25A0 : CE; + 25A1 : 4F; + 25A2 : 20; + 25A3 : 43; + 25A4 : 48; + 25A5 : 41; + [25A6..25A7] : 4E; + 25A8 : 45; + 25A9 : CC; + 25AA : 71; + 25AB : C4; + 25AC : 49; + 25AD : 52; + 25AE : 89; + 25AF : 72; + 25B0 : 88; + 25B1 : 20; + 25B2 : 46; + 25B3 : 55; + 25B4 : 4C; + 25B5 : CC; + 25B6 : 73; + 25B7 : C3; + 25B8 : 42; + 25B9 : 4D; + 25BA : 20; + 25BB : 44; + 25BC : 4F; + 25BD : 53; + 25BE : 20; + 25BF : 56; + 25C0 : 32; + 25C1 : 2E; + 25C2 : 36; + 25C3 : 20; + 25C4 : 31; + 25C5 : 35; + 25C6 : 34; + 25C7 : B1; + 25C8 : 74; + 25C9 : C4; + 25CA : 52; + 25CB : 49; + 25CC : 56; + 25CD : 45; + 25CE : 06; + 25CF : 20; + 25D0 : 52; + 25D1 : 45; + 25D2 : 41; + 25D3 : 44; + 25D4 : D9; + 25D5 : 09; + 25D6 : C5; + [25D7..25D8] : 52; + 25D9 : 4F; + 25DA : D2; + 25DB : 0A; + 25DC : D7; + 25DD : 52; + 25DE : 49; + 25DF : 54; + 25E0 : C5; + 25E1 : 03; + 25E2 : C6; + 25E3 : 49; + 25E4 : 4C; + 25E5 : C5; + 25E6 : 04; + 25E7 : CF; + 25E8 : 50; + 25E9 : 45; + 25EA : CE; + 25EB : 05; + 25EC : CD; + 25ED : 49; + 25EE : 53; + 25EF : 4D; + 25F0 : 41; + 25F1 : 54; + 25F2 : 43; + 25F3 : C8; + 25F4 : 06; + 25F5 : CE; + 25F6 : 4F; + 25F7 : D4; + 25F8 : 07; + 25F9 : C6; + 25FA : 4F; + 25FB : 55; + 25FC : 4E; + 25FD : C4; + 25FE : 08; + 25FF : C4; + 2600 : 49; + 2601 : 53; + 2602 : CB; + 2603 : 0B; + 2604 : D2; + 2605 : 45; + 2606 : 43; + 2607 : 4F; + 2608 : 52; + 2609 : C4; + 260A : 48; + 260B : 86; + 260C : F9; + 260D : 8A; + 260E : 0A; + 260F : AA; + 2610 : B5; + 2611 : 06; + 2612 : 85; + 2613 : 80; + 2614 : B5; + 2615 : 07; + 2616 : 85; + 2617 : 81; + 2618 : 68; + 2619 : 29; + 261A : 0F; + 261B : F0; + 261C : 08; + 261D : C9; + 261E : 0F; + 261F : D0; + 2620 : 06; + 2621 : A9; + 2622 : 74; + 2623 : D0; + 2624 : 08; + 2625 : A9; + 2626 : 06; + 2627 : 09; + 2628 : 20; + 2629 : AA; + [262A..262B] : CA; + 262C : 8A; + 262D : 48; + 262E : AD; + 262F : 2A; + 2630 : 02; + 2631 : C9; + 2632 : 00; + 2633 : D0; + 2634 : 0F; + 2635 : A9; + 2636 : FF; + 2637 : 8D; + 2638 : 2A; + 2639 : 02; + 263A : 68; + 263B : 20; + 263C : C7; + 263D : E6; + 263E : 20; + 263F : 42; + 2640 : D0; + 2641 : 4C; + 2642 : 48; + 2643 : E6; + 2644 : 68; + 2645 : 20; + 2646 : C7; + 2647 : E6; + 2648 : 20; + 2649 : BD; + 264A : C1; + 264B : A9; + 264C : 00; + 264D : 8D; + 264E : F9; + 264F : 02; + 2650 : 20; + 2651 : 2C; + 2652 : C1; + 2653 : 20; + 2654 : DA; + 2655 : D4; + 2656 : A9; + 2657 : 00; + 2658 : 85; + 2659 : A3; + 265A : A2; + 265B : 45; + 265C : 9A; + 265D : A5; + 265E : 84; + 265F : 29; + 2660 : 0F; + 2661 : 85; + 2662 : 83; + 2663 : C9; + 2664 : 0F; + 2665 : F0; + 2666 : 31; + 2667 : 78; + 2668 : A5; + 2669 : 79; + 266A : D0; + 266B : 1C; + 266C : A5; + 266D : 7A; + 266E : D0; + 266F : 10; + 2670 : A6; + 2671 : 83; + 2672 : BD; + 2673 : 2B; + 2674 : 02; + 2675 : C9; + 2676 : FF; + 2677 : F0; + 2678 : 1F; + 2679 : 29; + 267A : 0F; + 267B : 85; + 267C : 82; + 267D : 4C; + 267E : 8E; + 267F : E6; + 2680 : 20; + 2681 : EB; + 2682 : D0; + [2683..2685] : EA; + 2686 : D0; + 2687 : 06; + 2688 : 20; + 2689 : 07; + 268A : D1; + [268B..268D] : EA; + 268E : 20; + 268F : 25; + 2690 : D1; + 2691 : C9; + 2692 : 04; + 2693 : B0; + 2694 : 03; + 2695 : 20; + 2696 : 27; + 2697 : D2; + 2698 : 4C; + 2699 : E7; + 269A : EB; + 269B : AA; + 269C : A9; + 269D : 00; + 269E : F8; + 269F : E0; + 26A0 : 00; + 26A1 : F0; + 26A2 : 07; + 26A3 : 18; + 26A4 : 69; + 26A5 : 01; + 26A6 : CA; + 26A7 : 4C; + 26A8 : 9F; + 26A9 : E6; + 26AA : D8; + 26AB : AA; + [26AC..26AF] : 4A; + 26B0 : 20; + 26B1 : B4; + 26B2 : E6; + 26B3 : 8A; + 26B4 : 29; + 26B5 : 0F; + 26B6 : 09; + 26B7 : 30; + 26B8 : 91; + 26B9 : A5; + 26BA : C8; + 26BB : 60; + 26BC : 20; + 26BD : 23; + 26BE : C1; + 26BF : A9; + 26C0 : 00; + 26C1 : A0; + 26C2 : 00; + 26C3 : 84; + 26C4 : 80; + 26C5 : 84; + 26C6 : 81; + 26C7 : A0; + 26C8 : 00; + 26C9 : A2; + 26CA : D5; + 26CB : 86; + 26CC : A5; + 26CD : A2; + 26CE : 02; + 26CF : 86; + 26D0 : A6; + 26D1 : 20; + 26D2 : AB; + 26D3 : E6; + 26D4 : A9; + 26D5 : 2C; + 26D6 : 91; + 26D7 : A5; + 26D8 : C8; + 26D9 : AD; + 26DA : D5; + 26DB : 02; + 26DC : 8D; + 26DD : 43; + 26DE : 02; + 26DF : 8A; + 26E0 : 20; + 26E1 : 06; + 26E2 : E7; + 26E3 : A9; + 26E4 : 2C; + 26E5 : 91; + 26E6 : A5; + 26E7 : C8; + 26E8 : A5; + 26E9 : 80; + 26EA : 20; + 26EB : 9B; + 26EC : E6; + 26ED : A9; + 26EE : 2C; + 26EF : 91; + 26F0 : A5; + 26F1 : C8; + 26F2 : A5; + 26F3 : 81; + 26F4 : 20; + 26F5 : 9B; + 26F6 : E6; + 26F7 : 88; + 26F8 : 98; + 26F9 : 18; + 26FA : 69; + 26FB : D5; + 26FC : 8D; + 26FD : 49; + 26FE : 02; + 26FF : E6; + 2700 : A5; + 2701 : A9; + 2702 : 88; + 2703 : 85; + 2704 : F7; + 2705 : 60; + 2706 : AA; + 2707 : A5; + 2708 : 86; + 2709 : 48; + 270A : A5; + 270B : 87; + 270C : 48; + 270D : A9; + 270E : FC; + 270F : 85; + 2710 : 86; + 2711 : A9; + 2712 : E4; + 2713 : 85; + 2714 : 87; + 2715 : 8A; + 2716 : A2; + 2717 : 00; + 2718 : C1; + 2719 : 86; + 271A : F0; + 271B : 21; + 271C : 48; + 271D : 20; + 271E : 75; + 271F : E7; + 2720 : 90; + 2721 : 05; + 2722 : 20; + 2723 : 75; + 2724 : E7; + 2725 : 90; + 2726 : FB; + 2727 : A5; + 2728 : 87; + 2729 : C9; + 272A : E6; + 272B : 90; + 272C : 08; + 272D : D0; + 272E : 0A; + 272F : A9; + 2730 : 0A; + 2731 : C5; + 2732 : 86; + 2733 : 90; + 2734 : 04; + 2735 : 68; + 2736 : 4C; + 2737 : 18; + 2738 : E7; + 2739 : 68; + 273A : 4C; + 273B : 4D; + 273C : E7; + 273D : 20; + 273E : 67; + 273F : E7; + 2740 : 90; + 2741 : FB; + 2742 : 20; + 2743 : 54; + 2744 : E7; + 2745 : 20; + 2746 : 67; + 2747 : E7; + 2748 : 90; + 2749 : F8; + 274A : 20; + 274B : 54; + 274C : E7; + 274D : 68; + 274E : 85; + 274F : 87; + 2750 : 68; + 2751 : 85; + 2752 : 86; + 2753 : 60; + 2754 : C9; + 2755 : 20; + 2756 : B0; + 2757 : 0B; + 2758 : AA; + 2759 : A9; + 275A : 20; + 275B : 91; + 275C : A5; + 275D : C8; + 275E : 8A; + 275F : 20; + 2760 : 06; + 2761 : E7; + 2762 : 60; + 2763 : 91; + 2764 : A5; + 2765 : C8; + 2766 : 60; + 2767 : E6; + 2768 : 86; + 2769 : D0; + 276A : 02; + 276B : E6; + 276C : 87; + 276D : A1; + 276E : 86; + 276F : 0A; + 2770 : A1; + 2771 : 86; + 2772 : 29; + 2773 : 7F; + 2774 : 60; + 2775 : 20; + 2776 : 6D; + 2777 : E7; + 2778 : E6; + 2779 : 86; + 277A : D0; + 277B : 02; + 277C : E6; + 277D : 87; + [277E..2780] : 60; + [2781..27A1] : EA; + 27A2 : 60; + 27A3 : A9; + 27A4 : 8D; + 27A5 : 20; + 27A6 : 68; + 27A7 : C2; + 27A8 : 20; + 27A9 : 58; + 27AA : F2; + 27AB : AD; + 27AC : 78; + 27AD : 02; + 27AE : 48; + 27AF : A9; + 27B0 : 01; + 27B1 : 8D; + 27B2 : 78; + 27B3 : 02; + 27B4 : A9; + 27B5 : FF; + 27B6 : 85; + 27B7 : 86; + 27B8 : 20; + 27B9 : 4F; + 27BA : C4; + 27BB : AD; + 27BC : 80; + 27BD : 02; + 27BE : D0; + 27BF : 05; + 27C0 : A9; + 27C1 : 39; + 27C2 : 20; + 27C3 : C8; + 27C4 : C1; + 27C5 : 68; + 27C6 : 8D; + 27C7 : 78; + 27C8 : 02; + 27C9 : AD; + 27CA : 80; + 27CB : 02; + 27CC : 85; + 27CD : 80; + 27CE : AD; + 27CF : 85; + 27D0 : 02; + 27D1 : 85; + 27D2 : 81; + 27D3 : A9; + 27D4 : 03; + 27D5 : 20; + 27D6 : 77; + 27D7 : D4; + 27D8 : A9; + 27D9 : 00; + 27DA : 85; + 27DB : 87; + 27DC : 20; + 27DD : 39; + 27DE : E8; + 27DF : 85; + 27E0 : 88; + 27E1 : 20; + 27E2 : 4B; + 27E3 : E8; + 27E4 : 20; + 27E5 : 39; + 27E6 : E8; + 27E7 : 85; + 27E8 : 89; + 27E9 : 20; + 27EA : 4B; + 27EB : E8; + 27EC : A5; + 27ED : 86; + 27EE : F0; + 27EF : 0A; + 27F0 : A5; + 27F1 : 88; + 27F2 : 48; + 27F3 : A5; + 27F4 : 89; + 27F5 : 48; + 27F6 : A9; + 27F7 : 00; + 27F8 : 85; + 27F9 : 86; + 27FA : 20; + 27FB : 39; + 27FC : E8; + 27FD : 85; + 27FE : 8A; + 27FF : 20; + 2800 : 4B; + 2801 : E8; + 2802 : 20; + 2803 : 39; + 2804 : E8; + 2805 : A0; + 2806 : 00; + 2807 : 91; + 2808 : 88; + 2809 : 20; + 280A : 4B; + 280B : E8; + 280C : A5; + 280D : 88; + 280E : 18; + 280F : 69; + 2810 : 01; + 2811 : 85; + 2812 : 88; + 2813 : 90; + 2814 : 02; + 2815 : E6; + 2816 : 89; + 2817 : C6; + 2818 : 8A; + 2819 : D0; + 281A : E7; + 281B : 20; + 281C : 35; + 281D : CA; + 281E : A5; + 281F : 85; + 2820 : C5; + 2821 : 87; + 2822 : F0; + 2823 : 08; + 2824 : 20; + 2825 : 3E; + 2826 : DE; + 2827 : A9; + 2828 : 50; + 2829 : 20; + 282A : 45; + 282B : E6; + 282C : A5; + 282D : F8; + 282E : D0; + 282F : A8; + 2830 : 68; + 2831 : 85; + 2832 : 89; + 2833 : 68; + 2834 : 85; + 2835 : 88; + 2836 : 6C; + 2837 : 88; + 2838 : 00; + 2839 : 20; + 283A : 35; + 283B : CA; + 283C : A5; + 283D : F8; + 283E : D0; + 283F : 08; + 2840 : 20; + 2841 : 3E; + 2842 : DE; + 2843 : A9; + 2844 : 51; + 2845 : 20; + 2846 : 45; + 2847 : E6; + 2848 : A5; + 2849 : 85; + 284A : 60; + 284B : 18; + 284C : 65; + 284D : 87; + 284E : 69; + 284F : 00; + 2850 : 85; + 2851 : 87; + 2852 : 60; + 2853 : AD; + 2854 : 01; + 2855 : 18; + 2856 : A9; + 2857 : 01; + 2858 : 85; + 2859 : 7C; + 285A : 60; + 285B : 78; + 285C : A9; + 285D : 00; + 285E : 85; + 285F : 7C; + 2860 : 85; + 2861 : 79; + 2862 : 85; + 2863 : 7A; + 2864 : A2; + 2865 : 45; + 2866 : 9A; + 2867 : A9; + 2868 : 80; + 2869 : 85; + 286A : F8; + 286B : 85; + 286C : 7D; + 286D : 20; + 286E : B7; + 286F : E9; + 2870 : 20; + 2871 : A5; + 2872 : E9; + 2873 : AD; + 2874 : 00; + 2875 : 18; + 2876 : 09; + 2877 : 10; + 2878 : 8D; + 2879 : 00; + 287A : 18; + 287B : AD; + 287C : 00; + 287D : 18; + 287E : 10; + 287F : 57; + 2880 : 29; + 2881 : 04; + 2882 : D0; + 2883 : F7; + 2884 : 20; + 2885 : C9; + 2886 : E9; + 2887 : C9; + 2888 : 3F; + 2889 : D0; + 288A : 06; + 288B : A9; + 288C : 00; + 288D : 85; + 288E : 79; + 288F : F0; + 2890 : 71; + 2891 : C9; + 2892 : 5F; + 2893 : D0; + 2894 : 06; + 2895 : A9; + 2896 : 00; + 2897 : 85; + 2898 : 7A; + 2899 : F0; + 289A : 67; + 289B : C5; + 289C : 78; + 289D : D0; + 289E : 0A; + 289F : A9; + 28A0 : 01; + 28A1 : 85; + 28A2 : 7A; + 28A3 : A9; + 28A4 : 00; + 28A5 : 85; + 28A6 : 79; + 28A7 : F0; + 28A8 : 29; + 28A9 : C5; + 28AA : 77; + 28AB : D0; + 28AC : 0A; + 28AD : A9; + 28AE : 01; + 28AF : 85; + 28B0 : 79; + 28B1 : A9; + 28B2 : 00; + 28B3 : 85; + 28B4 : 7A; + 28B5 : F0; + 28B6 : 1B; + 28B7 : AA; + 28B8 : 29; + 28B9 : 60; + 28BA : C9; + 28BB : 60; + 28BC : D0; + 28BD : 3F; + 28BE : 8A; + 28BF : 85; + 28C0 : 84; + 28C1 : 29; + 28C2 : 0F; + 28C3 : 85; + 28C4 : 83; + 28C5 : A5; + 28C6 : 84; + 28C7 : 29; + 28C8 : F0; + 28C9 : C9; + 28CA : E0; + 28CB : D0; + 28CC : 35; + 28CD : 58; + 28CE : 20; + 28CF : C0; + 28D0 : DA; + 28D1 : 78; + 28D2 : 2C; + 28D3 : 00; + 28D4 : 18; + 28D5 : 30; + 28D6 : AD; + 28D7 : A9; + 28D8 : 00; + 28D9 : 85; + 28DA : 7D; + 28DB : AD; + 28DC : 00; + 28DD : 18; + 28DE : 29; + 28DF : EF; + 28E0 : 8D; + 28E1 : 00; + 28E2 : 18; + 28E3 : A5; + 28E4 : 79; + 28E5 : F0; + 28E6 : 06; + 28E7 : 20; + 28E8 : 2E; + 28E9 : EA; + 28EA : 4C; + 28EB : E7; + 28EC : EB; + 28ED : A5; + 28EE : 7A; + 28EF : F0; + 28F0 : 09; + 28F1 : 20; + 28F2 : 9C; + 28F3 : E9; + 28F4 : 20; + 28F5 : AE; + 28F6 : E9; + 28F7 : 20; + 28F8 : 09; + 28F9 : E9; + 28FA : 4C; + 28FB : 4E; + 28FC : EA; + 28FD : A9; + 28FE : 10; + 28FF : 8D; + 2900 : 00; + 2901 : 18; + 2902 : 2C; + 2903 : 00; + 2904 : 18; + 2905 : 10; + 2906 : D0; + 2907 : 30; + 2908 : F9; + 2909 : 78; + 290A : 20; + 290B : EB; + 290C : D0; + 290D : B0; + 290E : 06; + 290F : A6; + 2910 : 82; + 2911 : B5; + 2912 : F2; + 2913 : 30; + 2914 : 01; + 2915 : 60; + 2916 : 20; + 2917 : 59; + 2918 : EA; + 2919 : 20; + 291A : C0; + 291B : E9; + 291C : 29; + 291D : 01; + 291E : 08; + 291F : 20; + 2920 : B7; + 2921 : E9; + 2922 : 28; + 2923 : F0; + 2924 : 12; + 2925 : 20; + 2926 : 59; + 2927 : EA; + 2928 : 20; + 2929 : C0; + 292A : E9; + 292B : 29; + 292C : 01; + 292D : D0; + 292E : F6; + 292F : A6; + 2930 : 82; + 2931 : B5; + 2932 : F2; + 2933 : 29; + 2934 : 08; + 2935 : D0; + 2936 : 14; + 2937 : 20; + 2938 : 59; + 2939 : EA; + 293A : 20; + 293B : C0; + 293C : E9; + 293D : 29; + 293E : 01; + 293F : D0; + 2940 : F6; + 2941 : 20; + 2942 : 59; + 2943 : EA; + 2944 : 20; + 2945 : C0; + 2946 : E9; + 2947 : 29; + 2948 : 01; + 2949 : F0; + 294A : F6; + 294B : 20; + 294C : AE; + 294D : E9; + 294E : 20; + 294F : 59; + 2950 : EA; + 2951 : 20; + 2952 : C0; + 2953 : E9; + 2954 : 29; + 2955 : 01; + 2956 : D0; + 2957 : F3; + 2958 : A9; + 2959 : 08; + 295A : 85; + 295B : 98; + 295C : 20; + 295D : C0; + 295E : E9; + 295F : 29; + 2960 : 01; + 2961 : D0; + 2962 : 36; + 2963 : A6; + 2964 : 82; + 2965 : BD; + 2966 : 3E; + 2967 : 02; + 2968 : 6A; + 2969 : 9D; + 296A : 3E; + 296B : 02; + 296C : B0; + 296D : 05; + 296E : 20; + 296F : A5; + 2970 : E9; + 2971 : D0; + 2972 : 03; + 2973 : 20; + 2974 : 9C; + 2975 : E9; + 2976 : 20; + 2977 : B7; + 2978 : E9; + 2979 : A5; + 297A : 23; + 297B : D0; + 297C : 03; + 297D : 20; + 297E : F3; + 297F : FE; + 2980 : 20; + 2981 : FB; + 2982 : FE; + 2983 : C6; + 2984 : 98; + 2985 : D0; + 2986 : D5; + 2987 : 20; + 2988 : 59; + 2989 : EA; + 298A : 20; + 298B : C0; + 298C : E9; + 298D : 29; + 298E : 01; + 298F : F0; + 2990 : F6; + 2991 : 58; + 2992 : 20; + 2993 : AA; + 2994 : D3; + 2995 : 78; + 2996 : 4C; + 2997 : 0F; + 2998 : E9; + 2999 : 4C; + 299A : 4E; + 299B : EA; + 299C : AD; + 299D : 00; + 299E : 18; + 299F : 29; + 29A0 : FD; + 29A1 : 8D; + 29A2 : 00; + 29A3 : 18; + 29A4 : 60; + 29A5 : AD; + 29A6 : 00; + 29A7 : 18; + 29A8 : 09; + 29A9 : 02; + 29AA : 8D; + 29AB : 00; + 29AC : 18; + 29AD : 60; + 29AE : AD; + 29AF : 00; + 29B0 : 18; + 29B1 : 09; + 29B2 : 08; + 29B3 : 8D; + 29B4 : 00; + 29B5 : 18; + 29B6 : 60; + 29B7 : AD; + 29B8 : 00; + 29B9 : 18; + 29BA : 29; + 29BB : F7; + 29BC : 8D; + 29BD : 00; + 29BE : 18; + 29BF : 60; + 29C0 : AD; + 29C1 : 00; + 29C2 : 18; + 29C3 : CD; + 29C4 : 00; + 29C5 : 18; + 29C6 : D0; + 29C7 : F8; + 29C8 : 60; + 29C9 : A9; + 29CA : 08; + 29CB : 85; + 29CC : 98; + 29CD : 20; + 29CE : 59; + 29CF : EA; + 29D0 : 20; + 29D1 : C0; + 29D2 : E9; + 29D3 : 29; + 29D4 : 04; + 29D5 : D0; + 29D6 : F6; + 29D7 : 20; + 29D8 : 9C; + 29D9 : E9; + 29DA : A9; + 29DB : 01; + 29DC : 4C; + 29DD : 20; + 29DE : FF; + 29DF : 20; + 29E0 : 59; + 29E1 : EA; + 29E2 : AD; + 29E3 : 0D; + 29E4 : 18; + 29E5 : 29; + 29E6 : 40; + 29E7 : D0; + 29E8 : 09; + 29E9 : 20; + 29EA : C0; + 29EB : E9; + 29EC : 29; + 29ED : 04; + 29EE : F0; + 29EF : EF; + 29F0 : D0; + 29F1 : 19; + 29F2 : 20; + 29F3 : A5; + 29F4 : E9; + 29F5 : A2; + 29F6 : 0A; + 29F7 : CA; + 29F8 : D0; + 29F9 : FD; + 29FA : 20; + 29FB : 9C; + 29FC : E9; + 29FD : 20; + 29FE : 59; + 29FF : EA; + 2A00 : 20; + 2A01 : C0; + 2A02 : E9; + 2A03 : 29; + 2A04 : 04; + 2A05 : F0; + 2A06 : F6; + 2A07 : A9; + 2A08 : 00; + 2A09 : 85; + 2A0A : F8; + 2A0B : AD; + 2A0C : 00; + 2A0D : 18; + 2A0E : 49; + 2A0F : 01; + 2A10 : 4A; + 2A11 : 29; + 2A12 : 02; + 2A13 : D0; + 2A14 : F6; + [2A15..2A17] : EA; + 2A18 : 66; + 2A19 : 85; + 2A1A : 20; + 2A1B : 59; + 2A1C : EA; + 2A1D : 20; + 2A1E : C0; + 2A1F : E9; + 2A20 : 29; + 2A21 : 04; + 2A22 : F0; + 2A23 : F6; + 2A24 : C6; + 2A25 : 98; + 2A26 : D0; + 2A27 : E3; + 2A28 : 20; + 2A29 : A5; + 2A2A : E9; + 2A2B : A5; + 2A2C : 85; + 2A2D : 60; + 2A2E : 78; + 2A2F : 20; + 2A30 : 07; + 2A31 : D1; + 2A32 : B0; + 2A33 : 05; + 2A34 : B5; + 2A35 : F2; + 2A36 : 6A; + 2A37 : B0; + 2A38 : 0B; + 2A39 : A5; + 2A3A : 84; + 2A3B : 29; + 2A3C : F0; + 2A3D : C9; + [2A3E..2A3F] : F0; + 2A40 : 03; + 2A41 : 4C; + 2A42 : 4E; + 2A43 : EA; + 2A44 : 20; + 2A45 : C9; + 2A46 : E9; + 2A47 : 58; + 2A48 : 20; + 2A49 : B7; + 2A4A : CF; + 2A4B : 4C; + 2A4C : 2E; + 2A4D : EA; + 2A4E : A9; + 2A4F : 00; + 2A50 : 8D; + 2A51 : 00; + 2A52 : 18; + 2A53 : 4C; + 2A54 : E7; + 2A55 : EB; + 2A56 : 4C; + 2A57 : 5B; + 2A58 : E8; + 2A59 : A5; + 2A5A : 7D; + 2A5B : F0; + 2A5C : 06; + 2A5D : AD; + 2A5E : 00; + 2A5F : 18; + 2A60 : 10; + 2A61 : 09; + 2A62 : 60; + 2A63 : AD; + 2A64 : 00; + 2A65 : 18; + 2A66 : 10; + 2A67 : FA; + 2A68 : 4C; + 2A69 : 5B; + 2A6A : E8; + 2A6B : 4C; + 2A6C : D7; + 2A6D : E8; + 2A6E : A2; + 2A6F : 00; + 2A70 : 2C; + 2A71 : A6; + 2A72 : 6F; + 2A73 : 9A; + 2A74 : BA; + 2A75 : A9; + 2A76 : 08; + 2A77 : 0D; + 2A78 : 00; + 2A79 : 1C; + 2A7A : 4C; + 2A7B : EA; + 2A7C : FE; + 2A7D : 98; + 2A7E : 18; + 2A7F : 69; + 2A80 : 01; + 2A81 : D0; + 2A82 : FC; + 2A83 : 88; + 2A84 : D0; + 2A85 : F8; + 2A86 : AD; + 2A87 : 00; + 2A88 : 1C; + 2A89 : 29; + 2A8A : F7; + 2A8B : 8D; + 2A8C : 00; + 2A8D : 1C; + 2A8E : 98; + 2A8F : 18; + 2A90 : 69; + 2A91 : 01; + 2A92 : D0; + 2A93 : FC; + 2A94 : 88; + 2A95 : D0; + 2A96 : F8; + 2A97 : CA; + 2A98 : 10; + 2A99 : DB; + 2A9A : E0; + 2A9B : FC; + 2A9C : D0; + [2A9D..2A9E] : F0; + 2A9F : D4; + 2AA0 : 78; + 2AA1 : D8; + 2AA2 : A2; + 2AA3 : FF; + 2AA4 : 4C; + 2AA5 : 10; + 2AA6 : FF; + 2AA7 : E8; + 2AA8 : A0; + 2AA9 : 00; + 2AAA : A2; + 2AAB : 00; + 2AAC : 8A; + 2AAD : 95; + 2AAE : 00; + 2AAF : E8; + 2AB0 : D0; + 2AB1 : FA; + 2AB2 : 8A; + 2AB3 : D5; + 2AB4 : 00; + 2AB5 : D0; + 2AB6 : B7; + 2AB7 : F6; + 2AB8 : 00; + 2AB9 : C8; + 2ABA : D0; + 2ABB : FB; + 2ABC : D5; + 2ABD : 00; + 2ABE : D0; + 2ABF : AE; + 2AC0 : 94; + 2AC1 : 00; + 2AC2 : B5; + 2AC3 : 00; + 2AC4 : D0; + 2AC5 : A8; + 2AC6 : E8; + 2AC7 : D0; + 2AC8 : E9; + 2AC9 : E6; + 2ACA : 6F; + 2ACB : 86; + 2ACC : 76; + 2ACD : A9; + 2ACE : 00; + 2ACF : 85; + 2AD0 : 75; + 2AD1 : A8; + 2AD2 : A2; + 2AD3 : 20; + 2AD4 : 18; + 2AD5 : C6; + 2AD6 : 76; + 2AD7 : 71; + 2AD8 : 75; + 2AD9 : C8; + 2ADA : D0; + 2ADB : FB; + 2ADC : CA; + 2ADD : D0; + 2ADE : F6; + 2ADF : 69; + 2AE0 : 00; + 2AE1 : AA; + 2AE2 : C5; + 2AE3 : 76; + 2AE4 : D0; + 2AE5 : 39; + 2AE6 : E0; + 2AE7 : C0; + 2AE8 : D0; + 2AE9 : DF; + 2AEA : A9; + 2AEB : 01; + 2AEC : 85; + 2AED : 76; + 2AEE : E6; + 2AEF : 6F; + 2AF0 : A2; + 2AF1 : 07; + 2AF2 : 98; + 2AF3 : 18; + 2AF4 : 65; + 2AF5 : 76; + 2AF6 : 91; + 2AF7 : 75; + 2AF8 : C8; + 2AF9 : D0; + 2AFA : F7; + 2AFB : E6; + 2AFC : 76; + 2AFD : CA; + 2AFE : D0; + 2AFF : F2; + 2B00 : A2; + 2B01 : 07; + 2B02 : C6; + 2B03 : 76; + 2B04 : 88; + 2B05 : 98; + 2B06 : 18; + 2B07 : 65; + 2B08 : 76; + 2B09 : D1; + 2B0A : 75; + 2B0B : D0; + 2B0C : 12; + 2B0D : 49; + 2B0E : FF; + 2B0F : 91; + 2B10 : 75; + 2B11 : 51; + 2B12 : 75; + 2B13 : 91; + 2B14 : 75; + 2B15 : D0; + 2B16 : 08; + 2B17 : 98; + 2B18 : D0; + 2B19 : EA; + 2B1A : CA; + 2B1B : D0; + 2B1C : E5; + 2B1D : F0; + 2B1E : 03; + 2B1F : 4C; + 2B20 : 71; + 2B21 : EA; + 2B22 : A2; + 2B23 : 45; + 2B24 : 9A; + 2B25 : AD; + 2B26 : 00; + 2B27 : 1C; + 2B28 : 29; + 2B29 : F7; + 2B2A : 8D; + 2B2B : 00; + 2B2C : 1C; + 2B2D : A9; + 2B2E : 01; + 2B2F : 8D; + 2B30 : 0C; + 2B31 : 18; + 2B32 : A9; + 2B33 : 82; + 2B34 : 8D; + 2B35 : 0D; + 2B36 : 18; + 2B37 : 8D; + 2B38 : 0E; + 2B39 : 18; + 2B3A : AD; + 2B3B : 00; + 2B3C : 18; + 2B3D : 29; + 2B3E : 60; + 2B3F : 0A; + [2B40..2B42] : 2A; + 2B43 : 09; + 2B44 : 48; + 2B45 : 85; + 2B46 : 78; + 2B47 : 49; + 2B48 : 60; + 2B49 : 85; + 2B4A : 77; + 2B4B : A2; + 2B4C : 00; + 2B4D : A0; + 2B4E : 00; + 2B4F : A9; + 2B50 : 00; + 2B51 : 95; + 2B52 : 99; + 2B53 : E8; + 2B54 : B9; + 2B55 : E0; + 2B56 : FE; + 2B57 : 95; + 2B58 : 99; + 2B59 : E8; + 2B5A : C8; + 2B5B : C0; + 2B5C : 05; + 2B5D : D0; + 2B5E : F0; + 2B5F : A9; + 2B60 : 00; + 2B61 : 95; + 2B62 : 99; + 2B63 : E8; + 2B64 : A9; + 2B65 : 02; + 2B66 : 95; + 2B67 : 99; + 2B68 : E8; + 2B69 : A9; + 2B6A : D5; + 2B6B : 95; + 2B6C : 99; + 2B6D : E8; + 2B6E : A9; + 2B6F : 02; + 2B70 : 95; + 2B71 : 99; + 2B72 : A9; + 2B73 : FF; + 2B74 : A2; + 2B75 : 12; + 2B76 : 9D; + 2B77 : 2B; + 2B78 : 02; + 2B79 : CA; + 2B7A : 10; + 2B7B : FA; + 2B7C : A2; + 2B7D : 05; + 2B7E : 95; + 2B7F : A7; + 2B80 : 95; + 2B81 : AE; + 2B82 : 95; + 2B83 : CD; + 2B84 : CA; + 2B85 : 10; + 2B86 : F7; + 2B87 : A9; + 2B88 : 05; + 2B89 : 85; + 2B8A : AB; + 2B8B : A9; + 2B8C : 06; + 2B8D : 85; + 2B8E : AC; + 2B8F : A9; + 2B90 : FF; + 2B91 : 85; + 2B92 : AD; + 2B93 : 85; + 2B94 : B4; + 2B95 : A9; + 2B96 : 05; + 2B97 : 8D; + 2B98 : 3B; + 2B99 : 02; + 2B9A : A9; + 2B9B : 84; + 2B9C : 8D; + 2B9D : 3A; + 2B9E : 02; + 2B9F : A9; + 2BA0 : 0F; + 2BA1 : 8D; + 2BA2 : 56; + 2BA3 : 02; + 2BA4 : A9; + 2BA5 : 01; + 2BA6 : 85; + 2BA7 : F6; + 2BA8 : A9; + 2BA9 : 88; + 2BAA : 85; + 2BAB : F7; + 2BAC : A9; + 2BAD : E0; + 2BAE : 8D; + 2BAF : 4F; + 2BB0 : 02; + 2BB1 : A9; + 2BB2 : FF; + 2BB3 : 8D; + 2BB4 : 50; + 2BB5 : 02; + 2BB6 : A9; + 2BB7 : 01; + 2BB8 : 85; + 2BB9 : 1C; + 2BBA : 85; + 2BBB : 1D; + 2BBC : 20; + 2BBD : 63; + 2BBE : CB; + 2BBF : 20; + 2BC0 : FA; + 2BC1 : CE; + 2BC2 : 20; + 2BC3 : 59; + 2BC4 : F2; + 2BC5 : A9; + 2BC6 : 22; + 2BC7 : 85; + 2BC8 : 65; + 2BC9 : A9; + 2BCA : EB; + 2BCB : 85; + 2BCC : 66; + 2BCD : A9; + 2BCE : 0A; + 2BCF : 85; + 2BD0 : 69; + 2BD1 : A9; + 2BD2 : 05; + 2BD3 : 85; + 2BD4 : 6A; + 2BD5 : A9; + 2BD6 : 73; + 2BD7 : 20; + 2BD8 : C1; + 2BD9 : E6; + 2BDA : A9; + 2BDB : 00; + 2BDC : 8D; + 2BDD : 00; + 2BDE : 18; + 2BDF : A9; + 2BE0 : 1A; + 2BE1 : 8D; + 2BE2 : 02; + 2BE3 : 18; + 2BE4 : 20; + 2BE5 : 80; + 2BE6 : E7; + 2BE7 : 58; + 2BE8 : AD; + 2BE9 : 00; + 2BEA : 18; + 2BEB : 29; + 2BEC : E5; + 2BED : 8D; + 2BEE : 00; + 2BEF : 18; + 2BF0 : AD; + 2BF1 : 55; + 2BF2 : 02; + 2BF3 : F0; + 2BF4 : 0A; + 2BF5 : A9; + 2BF6 : 00; + 2BF7 : 8D; + 2BF8 : 55; + 2BF9 : 02; + 2BFA : 85; + 2BFB : 67; + 2BFC : 20; + 2BFD : 46; + 2BFE : C1; + 2BFF : 58; + 2C00 : A5; + 2C01 : 7C; + 2C02 : F0; + 2C03 : 03; + 2C04 : 4C; + 2C05 : 5B; + 2C06 : E8; + 2C07 : 58; + 2C08 : A9; + 2C09 : 0E; + 2C0A : 85; + 2C0B : 72; + 2C0C : A9; + 2C0D : 00; + 2C0E : 85; + 2C0F : 6F; + 2C10 : 85; + 2C11 : 70; + 2C12 : A6; + 2C13 : 72; + 2C14 : BD; + 2C15 : 2B; + 2C16 : 02; + 2C17 : C9; + 2C18 : FF; + 2C19 : F0; + 2C1A : 10; + 2C1B : 29; + 2C1C : 3F; + 2C1D : 85; + 2C1E : 82; + 2C1F : 20; + 2C20 : 93; + 2C21 : DF; + 2C22 : AA; + 2C23 : BD; + 2C24 : 5B; + 2C25 : 02; + 2C26 : 29; + 2C27 : 01; + 2C28 : AA; + 2C29 : F6; + 2C2A : 6F; + 2C2B : C6; + 2C2C : 72; + 2C2D : 10; + 2C2E : E3; + 2C2F : A0; + 2C30 : 04; + 2C31 : B9; + [2C32..2C33] : 00; + 2C34 : 10; + 2C35 : 05; + 2C36 : 29; + 2C37 : 01; + 2C38 : AA; + 2C39 : F6; + 2C3A : 6F; + 2C3B : 88; + 2C3C : 10; + 2C3D : F3; + 2C3E : 78; + 2C3F : AD; + 2C40 : 00; + 2C41 : 1C; + 2C42 : 29; + 2C43 : F7; + 2C44 : 48; + 2C45 : A5; + 2C46 : 7F; + 2C47 : 85; + 2C48 : 86; + 2C49 : A9; + 2C4A : 00; + 2C4B : 85; + 2C4C : 7F; + 2C4D : A5; + 2C4E : 6F; + 2C4F : F0; + 2C50 : 0B; + 2C51 : A5; + 2C52 : 1C; + 2C53 : F0; + 2C54 : 03; + 2C55 : 20; + 2C56 : 13; + 2C57 : D3; + 2C58 : 68; + 2C59 : 09; + 2C5A : 08; + 2C5B : 48; + 2C5C : E6; + 2C5D : 7F; + 2C5E : A5; + 2C5F : 70; + 2C60 : F0; + 2C61 : 0B; + 2C62 : A5; + 2C63 : 1D; + 2C64 : F0; + 2C65 : 03; + 2C66 : 20; + 2C67 : 13; + 2C68 : D3; + 2C69 : 68; + 2C6A : 09; + 2C6B : 00; + 2C6C : 48; + 2C6D : A5; + 2C6E : 86; + 2C6F : 85; + 2C70 : 7F; + 2C71 : 68; + 2C72 : AE; + 2C73 : 6C; + 2C74 : 02; + 2C75 : F0; + 2C76 : 21; + 2C77 : AD; + 2C78 : 00; + 2C79 : 1C; + 2C7A : E0; + 2C7B : 80; + 2C7C : D0; + 2C7D : 03; + 2C7E : 4C; + 2C7F : 8B; + 2C80 : EC; + 2C81 : AE; + 2C82 : 05; + 2C83 : 18; + 2C84 : 30; + 2C85 : 12; + 2C86 : A2; + 2C87 : A0; + 2C88 : 8E; + 2C89 : 05; + 2C8A : 18; + 2C8B : CE; + 2C8C : 6C; + 2C8D : 02; + 2C8E : D0; + 2C8F : 08; + 2C90 : 4D; + 2C91 : 6D; + 2C92 : 02; + 2C93 : A2; + 2C94 : 10; + 2C95 : 8E; + 2C96 : 6C; + 2C97 : 02; + 2C98 : 8D; + 2C99 : 00; + 2C9A : 1C; + 2C9B : 4C; + 2C9C : FF; + 2C9D : EB; + 2C9E : A9; + 2C9F : 00; + 2CA0 : 85; + 2CA1 : 83; + 2CA2 : A9; + 2CA3 : 01; + 2CA4 : 20; + 2CA5 : E2; + 2CA6 : D1; + 2CA7 : A9; + 2CA8 : 00; + 2CA9 : 20; + 2CAA : C8; + 2CAB : D4; + 2CAC : A6; + 2CAD : 82; + 2CAE : A9; + 2CAF : 00; + 2CB0 : 9D; + 2CB1 : 44; + 2CB2 : 02; + 2CB3 : 20; + 2CB4 : 93; + 2CB5 : DF; + 2CB6 : AA; + 2CB7 : A5; + 2CB8 : 7F; + 2CB9 : 9D; + 2CBA : 5B; + 2CBB : 02; + 2CBC : A9; + 2CBD : 01; + 2CBE : 20; + 2CBF : F1; + 2CC0 : CF; + 2CC1 : A9; + 2CC2 : 04; + 2CC3 : 20; + 2CC4 : F1; + 2CC5 : CF; + 2CC6 : A9; + 2CC7 : 01; + 2CC8 : 20; + 2CC9 : F1; + 2CCA : CF; + 2CCB : 20; + 2CCC : F1; + 2CCD : CF; + 2CCE : AD; + 2CCF : 72; + 2CD0 : 02; + 2CD1 : 20; + 2CD2 : F1; + 2CD3 : CF; + 2CD4 : A9; + 2CD5 : 00; + 2CD6 : 20; + 2CD7 : F1; + 2CD8 : CF; + 2CD9 : 20; + 2CDA : 59; + 2CDB : ED; + 2CDC : 20; + 2CDD : 93; + 2CDE : DF; + 2CDF : 0A; + 2CE0 : AA; + 2CE1 : D6; + 2CE2 : 99; + 2CE3 : D6; + 2CE4 : 99; + 2CE5 : A9; + 2CE6 : 00; + 2CE7 : 20; + 2CE8 : F1; + 2CE9 : CF; + 2CEA : A9; + 2CEB : 01; + 2CEC : 20; + 2CED : F1; + 2CEE : CF; + 2CEF : 20; + 2CF0 : F1; + 2CF1 : CF; + 2CF2 : 20; + 2CF3 : CE; + 2CF4 : C6; + 2CF5 : 90; + 2CF6 : 2C; + 2CF7 : AD; + 2CF8 : 72; + 2CF9 : 02; + 2CFA : 20; + 2CFB : F1; + 2CFC : CF; + 2CFD : AD; + 2CFE : 73; + 2CFF : 02; + 2D00 : 20; + 2D01 : F1; + 2D02 : CF; + 2D03 : 20; + 2D04 : 59; + 2D05 : ED; + 2D06 : A9; + 2D07 : 00; + 2D08 : 20; + 2D09 : F1; + 2D0A : CF; + 2D0B : D0; + 2D0C : DD; + 2D0D : 20; + 2D0E : 93; + 2D0F : DF; + 2D10 : 0A; + 2D11 : AA; + 2D12 : A9; + 2D13 : 00; + 2D14 : 95; + 2D15 : 99; + 2D16 : A9; + 2D17 : 88; + 2D18 : A4; + 2D19 : 82; + 2D1A : 8D; + 2D1B : 54; + 2D1C : 02; + 2D1D : 99; + 2D1E : F2; + 2D1F : 00; + 2D20 : A5; + 2D21 : 85; + 2D22 : 60; + 2D23 : AD; + 2D24 : 72; + 2D25 : 02; + 2D26 : 20; + 2D27 : F1; + 2D28 : CF; + 2D29 : AD; + 2D2A : 73; + 2D2B : 02; + 2D2C : 20; + 2D2D : F1; + 2D2E : CF; + 2D2F : 20; + 2D30 : 59; + 2D31 : ED; + 2D32 : 20; + 2D33 : 93; + 2D34 : DF; + 2D35 : 0A; + 2D36 : AA; + 2D37 : D6; + 2D38 : 99; + 2D39 : D6; + 2D3A : 99; + 2D3B : A9; + 2D3C : 00; + 2D3D : 20; + 2D3E : F1; + 2D3F : CF; + 2D40 : 20; + 2D41 : F1; + 2D42 : CF; + 2D43 : 20; + 2D44 : F1; + 2D45 : CF; + 2D46 : 20; + 2D47 : 93; + 2D48 : DF; + 2D49 : 0A; + 2D4A : A8; + 2D4B : B9; + 2D4C : 99; + 2D4D : 00; + 2D4E : A6; + 2D4F : 82; + 2D50 : 9D; + 2D51 : 44; + 2D52 : 02; + 2D53 : DE; + 2D54 : 44; + 2D55 : 02; + 2D56 : 4C; + 2D57 : 0D; + 2D58 : ED; + 2D59 : A0; + 2D5A : 00; + 2D5B : B9; + 2D5C : B1; + 2D5D : 02; + 2D5E : 20; + 2D5F : F1; + 2D60 : CF; + 2D61 : C8; + 2D62 : C0; + 2D63 : 1B; + 2D64 : D0; + 2D65 : F5; + 2D66 : 60; + 2D67 : 20; + 2D68 : 37; + 2D69 : D1; + 2D6A : F0; + 2D6B : 01; + 2D6C : 60; + [2D6D..2D6E] : 85; + 2D6F : A4; + 2D70 : 82; + 2D71 : B9; + 2D72 : 44; + 2D73 : 02; + 2D74 : F0; + 2D75 : 08; + 2D76 : A9; + 2D77 : 80; + 2D78 : 99; + 2D79 : F2; + 2D7A : 00; + 2D7B : A5; + 2D7C : 85; + 2D7D : 60; + 2D7E : 48; + 2D7F : 20; + 2D80 : EA; + 2D81 : EC; + 2D82 : 68; + 2D83 : 60; + 2D84 : 20; + 2D85 : D1; + 2D86 : C1; + 2D87 : 20; + 2D88 : 42; + 2D89 : D0; + 2D8A : A9; + 2D8B : 40; + 2D8C : 8D; + 2D8D : F9; + 2D8E : 02; + 2D8F : 20; + 2D90 : B7; + 2D91 : EE; + 2D92 : A9; + 2D93 : 00; + 2D94 : 8D; + 2D95 : 92; + 2D96 : 02; + 2D97 : 20; + 2D98 : AC; + 2D99 : C5; + 2D9A : D0; + 2D9B : 3D; + 2D9C : A9; + 2D9D : 00; + 2D9E : 85; + 2D9F : 81; + 2DA0 : AD; + 2DA1 : 85; + 2DA2 : FE; + 2DA3 : 85; + 2DA4 : 80; + 2DA5 : 20; + 2DA6 : E5; + 2DA7 : ED; + 2DA8 : A9; + 2DA9 : 00; + 2DAA : 8D; + 2DAB : F9; + 2DAC : 02; + 2DAD : 20; + 2DAE : FF; + 2DAF : EE; + 2DB0 : 4C; + 2DB1 : 94; + 2DB2 : C1; + 2DB3 : C8; + 2DB4 : B1; + 2DB5 : 94; + 2DB6 : 48; + 2DB7 : C8; + 2DB8 : B1; + 2DB9 : 94; + 2DBA : 48; + 2DBB : A0; + 2DBC : 13; + 2DBD : B1; + 2DBE : 94; + 2DBF : F0; + 2DC0 : 0A; + 2DC1 : 85; + 2DC2 : 80; + 2DC3 : C8; + 2DC4 : B1; + 2DC5 : 94; + 2DC6 : 85; + 2DC7 : 81; + 2DC8 : 20; + 2DC9 : E5; + 2DCA : ED; + 2DCB : 68; + 2DCC : 85; + 2DCD : 81; + 2DCE : 68; + 2DCF : 85; + 2DD0 : 80; + 2DD1 : 20; + 2DD2 : E5; + 2DD3 : ED; + 2DD4 : 20; + 2DD5 : 04; + 2DD6 : C6; + 2DD7 : F0; + 2DD8 : C3; + 2DD9 : A0; + 2DDA : 00; + 2DDB : B1; + 2DDC : 94; + 2DDD : 30; + 2DDE : D4; + 2DDF : 20; + 2DE0 : B6; + 2DE1 : C8; + 2DE2 : 4C; + 2DE3 : D4; + 2DE4 : ED; + 2DE5 : 20; + 2DE6 : 5F; + 2DE7 : D5; + 2DE8 : 20; + 2DE9 : 90; + 2DEA : EF; + 2DEB : 20; + 2DEC : 75; + 2DED : D4; + 2DEE : A9; + 2DEF : 00; + 2DF0 : 20; + 2DF1 : C8; + 2DF2 : D4; + 2DF3 : 20; + 2DF4 : 37; + 2DF5 : D1; + 2DF6 : 85; + 2DF7 : 80; + 2DF8 : 20; + 2DF9 : 37; + 2DFA : D1; + 2DFB : 85; + 2DFC : 81; + 2DFD : A5; + 2DFE : 80; + 2DFF : D0; + 2E00 : 03; + 2E01 : 4C; + 2E02 : 27; + 2E03 : D2; + 2E04 : 20; + 2E05 : 90; + 2E06 : EF; + 2E07 : 20; + 2E08 : 4D; + 2E09 : D4; + 2E0A : 4C; + 2E0B : EE; + 2E0C : ED; + 2E0D : 20; + 2E0E : 12; + 2E0F : C3; + 2E10 : A5; + 2E11 : E2; + 2E12 : 10; + 2E13 : 05; + 2E14 : A9; + 2E15 : 33; + 2E16 : 4C; + 2E17 : C8; + 2E18 : C1; + 2E19 : 29; + 2E1A : 01; + 2E1B : 85; + 2E1C : 7F; + 2E1D : 20; + 2E1E : 00; + 2E1F : C1; + 2E20 : A5; + 2E21 : 7F; + 2E22 : 0A; + 2E23 : AA; + 2E24 : AC; + 2E25 : 7B; + 2E26 : 02; + 2E27 : CC; + 2E28 : 74; + 2E29 : 02; + 2E2A : F0; + 2E2B : 1A; + 2E2C : B9; + 2E2D : 00; + 2E2E : 02; + 2E2F : 95; + 2E30 : 12; + 2E31 : B9; + 2E32 : 01; + 2E33 : 02; + 2E34 : 95; + 2E35 : 13; + 2E36 : 20; + 2E37 : 07; + 2E38 : D3; + 2E39 : A9; + 2E3A : 01; + 2E3B : 85; + 2E3C : 80; + 2E3D : 20; + 2E3E : 2F; + 2E3F : FF; + 2E40 : 20; + 2E41 : 05; + 2E42 : F0; + 2E43 : 4C; + 2E44 : 56; + 2E45 : EE; + 2E46 : 20; + 2E47 : 42; + 2E48 : D0; + 2E49 : A6; + 2E4A : 7F; + 2E4B : BD; + [2E4C..2E4D] : 01; + 2E4E : CD; + 2E4F : D5; + 2E50 : FE; + 2E51 : F0; + 2E52 : 03; + 2E53 : 4C; + 2E54 : 72; + 2E55 : D5; + 2E56 : 20; + 2E57 : B7; + 2E58 : EE; + 2E59 : A5; + 2E5A : F9; + 2E5B : A8; + 2E5C : 0A; + 2E5D : AA; + 2E5E : AD; + 2E5F : 88; + 2E60 : FE; + 2E61 : 95; + 2E62 : 99; + 2E63 : AE; + 2E64 : 7A; + 2E65 : 02; + 2E66 : A9; + 2E67 : 1B; + 2E68 : 20; + 2E69 : 6E; + 2E6A : C6; + 2E6B : A0; + 2E6C : 12; + 2E6D : A6; + 2E6E : 7F; + 2E6F : AD; + 2E70 : D5; + 2E71 : FE; + 2E72 : 9D; + [2E73..2E74] : 01; + 2E75 : 8A; + 2E76 : 0A; + 2E77 : AA; + 2E78 : B5; + 2E79 : 12; + 2E7A : 91; + 2E7B : 94; + 2E7C : C8; + 2E7D : B5; + 2E7E : 13; + 2E7F : 91; + 2E80 : 94; + [2E81..2E82] : C8; + 2E83 : A9; + 2E84 : 32; + 2E85 : 91; + 2E86 : 94; + 2E87 : C8; + 2E88 : AD; + 2E89 : D5; + 2E8A : FE; + 2E8B : 91; + 2E8C : 94; + 2E8D : A0; + 2E8E : 02; + 2E8F : 91; + 2E90 : 6D; + 2E91 : AD; + 2E92 : 85; + 2E93 : FE; + 2E94 : 85; + 2E95 : 80; + 2E96 : 20; + 2E97 : 93; + 2E98 : EF; + 2E99 : A9; + 2E9A : 01; + 2E9B : 85; + 2E9C : 81; + 2E9D : 20; + 2E9E : 93; + 2E9F : EF; + 2EA0 : 20; + 2EA1 : FF; + 2EA2 : EE; + 2EA3 : 20; + 2EA4 : 05; + 2EA5 : F0; + 2EA6 : A0; + 2EA7 : 01; + 2EA8 : A9; + 2EA9 : FF; + 2EAA : 91; + 2EAB : 6D; + 2EAC : 20; + 2EAD : 64; + 2EAE : D4; + 2EAF : C6; + 2EB0 : 81; + 2EB1 : 20; + 2EB2 : 60; + 2EB3 : D4; + 2EB4 : 4C; + 2EB5 : 94; + 2EB6 : C1; + 2EB7 : 20; + 2EB8 : D1; + 2EB9 : F0; + 2EBA : A0; + 2EBB : 00; + 2EBC : A9; + 2EBD : 12; + 2EBE : 91; + 2EBF : 6D; + 2EC0 : C8; + 2EC1 : 98; + 2EC2 : 91; + 2EC3 : 6D; + [2EC4..2EC6] : C8; + 2EC7 : A9; + 2EC8 : 00; + 2EC9 : 85; + 2ECA : 6F; + 2ECB : 85; + 2ECC : 70; + 2ECD : 85; + 2ECE : 71; + 2ECF : 98; + [2ED0..2ED1] : 4A; + 2ED2 : 20; + 2ED3 : 4B; + 2ED4 : F2; + 2ED5 : 91; + 2ED6 : 6D; + 2ED7 : C8; + 2ED8 : AA; + 2ED9 : 38; + 2EDA : 26; + 2EDB : 6F; + 2EDC : 26; + 2EDD : 70; + 2EDE : 26; + 2EDF : 71; + 2EE0 : CA; + 2EE1 : D0; + 2EE2 : F6; + 2EE3 : B5; + 2EE4 : 6F; + 2EE5 : 91; + 2EE6 : 6D; + 2EE7 : C8; + 2EE8 : E8; + 2EE9 : E0; + 2EEA : 03; + 2EEB : 90; + 2EEC : F6; + 2EED : C0; + [2EEE..2EEF] : 90; + 2EF0 : D6; + 2EF1 : 4C; + 2EF2 : 75; + 2EF3 : D0; + 2EF4 : 20; + 2EF5 : 93; + 2EF6 : DF; + 2EF7 : AA; + 2EF8 : BD; + 2EF9 : 5B; + 2EFA : 02; + 2EFB : 29; + 2EFC : 01; + 2EFD : 85; + 2EFE : 7F; + 2EFF : A4; + 2F00 : 7F; + 2F01 : B9; + 2F02 : 51; + 2F03 : 02; + 2F04 : D0; + 2F05 : 01; + 2F06 : 60; + 2F07 : A9; + 2F08 : 00; + 2F09 : 99; + 2F0A : 51; + 2F0B : 02; + 2F0C : 20; + 2F0D : 3A; + 2F0E : EF; + 2F0F : A5; + 2F10 : 7F; + 2F11 : 0A; + 2F12 : 48; + 2F13 : 20; + 2F14 : A5; + 2F15 : F0; + 2F16 : 68; + 2F17 : 18; + 2F18 : 69; + 2F19 : 01; + 2F1A : 20; + 2F1B : A5; + 2F1C : F0; + 2F1D : A5; + 2F1E : 80; + 2F1F : 48; + 2F20 : A9; + 2F21 : 01; + 2F22 : 85; + 2F23 : 80; + [2F24..2F25] : 0A; + 2F26 : 85; + 2F27 : 6D; + [2F28..2F29] : 20; + 2F2A : F2; + 2F2B : E6; + 2F2C : 80; + 2F2D : A5; + 2F2E : 80; + 2F2F : CD; + 2F30 : D7; + 2F31 : FE; + 2F32 : 90; + 2F33 : F0; + 2F34 : 68; + 2F35 : 85; + 2F36 : 80; + 2F37 : 4C; + 2F38 : 8A; + 2F39 : D5; + 2F3A : 20; + 2F3B : 0F; + 2F3C : F1; + 2F3D : AA; + 2F3E : 20; + 2F3F : DF; + 2F40 : F0; + 2F41 : A6; + 2F42 : F9; + 2F43 : BD; + 2F44 : E0; + 2F45 : FE; + 2F46 : 85; + 2F47 : 6E; + 2F48 : A9; + 2F49 : 00; + 2F4A : 85; + 2F4B : 6D; + 2F4C : 60; + 2F4D : A6; + 2F4E : 7F; + 2F4F : BD; + 2F50 : FA; + 2F51 : 02; + 2F52 : 8D; + 2F53 : 72; + 2F54 : 02; + 2F55 : BD; + 2F56 : FC; + 2F57 : 02; + 2F58 : 8D; + 2F59 : 73; + 2F5A : 02; + 2F5B : 60; + 2F5C : 20; + 2F5D : F1; + 2F5E : EF; + 2F5F : 20; + 2F60 : CF; + 2F61 : EF; + 2F62 : 38; + 2F63 : D0; + 2F64 : 22; + 2F65 : B1; + 2F66 : 6D; + 2F67 : 1D; + 2F68 : E9; + 2F69 : EF; + 2F6A : 91; + 2F6B : 6D; + 2F6C : 20; + 2F6D : 88; + 2F6E : EF; + 2F6F : A4; + 2F70 : 6F; + 2F71 : 18; + 2F72 : B1; + 2F73 : 6D; + 2F74 : 69; + 2F75 : 01; + 2F76 : 91; + 2F77 : 6D; + 2F78 : A5; + 2F79 : 80; + 2F7A : CD; + 2F7B : 85; + 2F7C : FE; + 2F7D : F0; + 2F7E : 3B; + 2F7F : FE; + 2F80 : FA; + 2F81 : 02; + 2F82 : D0; + 2F83 : 03; + 2F84 : FE; + 2F85 : FC; + 2F86 : 02; + 2F87 : 60; + 2F88 : A6; + 2F89 : 7F; + 2F8A : A9; + 2F8B : 01; + 2F8C : 9D; + 2F8D : 51; + 2F8E : 02; + 2F8F : 60; + 2F90 : 20; + 2F91 : F1; + 2F92 : EF; + 2F93 : 20; + 2F94 : CF; + 2F95 : EF; + 2F96 : F0; + 2F97 : 36; + 2F98 : B1; + 2F99 : 6D; + 2F9A : 5D; + 2F9B : E9; + 2F9C : EF; + 2F9D : 91; + 2F9E : 6D; + 2F9F : 20; + 2FA0 : 88; + 2FA1 : EF; + 2FA2 : A4; + 2FA3 : 6F; + 2FA4 : B1; + 2FA5 : 6D; + 2FA6 : 38; + 2FA7 : E9; + 2FA8 : 01; + 2FA9 : 91; + 2FAA : 6D; + 2FAB : A5; + 2FAC : 80; + 2FAD : CD; + 2FAE : 85; + 2FAF : FE; + 2FB0 : F0; + 2FB1 : 0B; + 2FB2 : BD; + 2FB3 : FA; + 2FB4 : 02; + 2FB5 : D0; + 2FB6 : 03; + 2FB7 : DE; + 2FB8 : FC; + 2FB9 : 02; + 2FBA : DE; + 2FBB : FA; + 2FBC : 02; + 2FBD : BD; + 2FBE : FC; + 2FBF : 02; + 2FC0 : D0; + 2FC1 : 0C; + 2FC2 : BD; + 2FC3 : FA; + 2FC4 : 02; + 2FC5 : C9; + 2FC6 : 03; + 2FC7 : B0; + 2FC8 : 05; + 2FC9 : A9; + 2FCA : 72; + 2FCB : 20; + 2FCC : C7; + 2FCD : E6; + 2FCE : 60; + 2FCF : 20; + 2FD0 : 11; + 2FD1 : F0; + 2FD2 : 98; + 2FD3 : 85; + 2FD4 : 6F; + 2FD5 : A5; + 2FD6 : 81; + [2FD7..2FD9] : 4A; + 2FDA : 38; + 2FDB : 65; + 2FDC : 6F; + 2FDD : A8; + 2FDE : A5; + 2FDF : 81; + 2FE0 : 29; + 2FE1 : 07; + 2FE2 : AA; + 2FE3 : B1; + 2FE4 : 6D; + 2FE5 : 3D; + 2FE6 : E9; + 2FE7 : EF; + 2FE8 : 60; + 2FE9 : 01; + 2FEA : 02; + 2FEB : 04; + 2FEC : 08; + 2FED : 10; + 2FEE : 20; + 2FEF : 40; + 2FF0 : 80; + 2FF1 : A9; + 2FF2 : FF; + 2FF3 : 2C; + 2FF4 : F9; + 2FF5 : 02; + 2FF6 : F0; + 2FF7 : 0C; + 2FF8 : 10; + 2FF9 : 0A; + 2FFA : 70; + 2FFB : 08; + 2FFC : A9; + 2FFD : 00; + 2FFE : 8D; + 2FFF : F9; + 3000 : 02; + 3001 : 4C; + 3002 : 8A; + 3003 : D5; + 3004 : 60; + 3005 : 20; + 3006 : 3A; + 3007 : EF; + 3008 : A0; + 3009 : 00; + 300A : 98; + 300B : 91; + 300C : 6D; + 300D : C8; + 300E : D0; + 300F : FB; + 3010 : 60; + 3011 : A5; + 3012 : 6F; + 3013 : 48; + 3014 : A5; + 3015 : 70; + 3016 : 48; + 3017 : A6; + 3018 : 7F; + 3019 : B5; + 301A : FF; + 301B : F0; + 301C : 05; + 301D : A9; + 301E : 74; + 301F : 20; + 3020 : 48; + 3021 : E6; + 3022 : 20; + 3023 : 0F; + 3024 : F1; + 3025 : 85; + 3026 : 6F; + 3027 : 8A; + 3028 : 0A; + 3029 : 85; + 302A : 70; + 302B : AA; + 302C : A5; + 302D : 80; + 302E : DD; + 302F : 9D; + 3030 : 02; + 3031 : F0; + 3032 : 0B; + 3033 : E8; + 3034 : 86; + 3035 : 70; + 3036 : DD; + 3037 : 9D; + 3038 : 02; + 3039 : F0; + 303A : 03; + 303B : 20; + 303C : 5B; + 303D : F0; + 303E : A5; + 303F : 70; + 3040 : A6; + 3041 : 7F; + 3042 : 9D; + 3043 : 9B; + 3044 : 02; + [3045..3046] : 0A; + 3047 : 18; + 3048 : 69; + 3049 : A1; + 304A : 85; + 304B : 6D; + 304C : A9; + 304D : 02; + 304E : 69; + 304F : 00; + 3050 : 85; + 3051 : 6E; + 3052 : A0; + 3053 : 00; + 3054 : 68; + 3055 : 85; + 3056 : 70; + 3057 : 68; + 3058 : 85; + 3059 : 6F; + 305A : 60; + 305B : A6; + 305C : 6F; + 305D : 20; + 305E : DF; + 305F : F0; + 3060 : A5; + 3061 : 7F; + 3062 : AA; + 3063 : 0A; + 3064 : 1D; + 3065 : 9B; + 3066 : 02; + 3067 : 49; + 3068 : 01; + 3069 : 29; + 306A : 03; + 306B : 85; + 306C : 70; + 306D : 20; + 306E : A5; + 306F : F0; + 3070 : A5; + 3071 : F9; + 3072 : 0A; + 3073 : AA; + 3074 : A5; + 3075 : 80; + [3076..3077] : 0A; + 3078 : 95; + 3079 : 99; + 307A : A5; + 307B : 70; + [307C..307D] : 0A; + 307E : A8; + 307F : A1; + [3080..3081] : 99; + 3082 : A1; + 3083 : 02; + 3084 : A9; + 3085 : 00; + 3086 : 81; + 3087 : 99; + 3088 : F6; + 3089 : 99; + 308A : C8; + 308B : 98; + 308C : 29; + 308D : 03; + 308E : D0; + 308F : EF; + 3090 : A6; + 3091 : 70; + 3092 : A5; + 3093 : 80; + [3094..3095] : 9D; + 3096 : 02; + 3097 : AD; + 3098 : F9; + 3099 : 02; + 309A : D0; + 309B : 03; + 309C : 4C; + 309D : 8A; + 309E : D5; + 309F : 09; + 30A0 : 80; + 30A1 : 8D; + 30A2 : F9; + 30A3 : 02; + 30A4 : 60; + 30A5 : A8; + 30A6 : B9; + 30A7 : 9D; + 30A8 : 02; + 30A9 : F0; + 30AA : 25; + 30AB : 48; + 30AC : A9; + 30AD : 00; + 30AE : 99; + 30AF : 9D; + 30B0 : 02; + 30B1 : A5; + 30B2 : F9; + 30B3 : 0A; + 30B4 : AA; + 30B5 : 68; + [30B6..30B7] : 0A; + 30B8 : 95; + 30B9 : 99; + 30BA : 98; + [30BB..30BC] : 0A; + 30BD : A8; + 30BE : B9; + 30BF : A1; + 30C0 : 02; + 30C1 : 81; + 30C2 : 99; + 30C3 : A9; + 30C4 : 00; + 30C5 : 99; + 30C6 : A1; + 30C7 : 02; + 30C8 : F6; + 30C9 : 99; + 30CA : C8; + 30CB : 98; + 30CC : 29; + 30CD : 03; + 30CE : D0; + 30CF : EE; + 30D0 : 60; + 30D1 : A5; + 30D2 : 7F; + 30D3 : 0A; + 30D4 : AA; + 30D5 : A9; + 30D6 : 00; + [30D7..30D8] : 9D; + 30D9 : 02; + 30DA : E8; + [30DB..30DC] : 9D; + 30DD : 02; + 30DE : 60; + 30DF : B5; + 30E0 : A7; + 30E1 : C9; + 30E2 : FF; + 30E3 : D0; + 30E4 : 25; + 30E5 : 8A; + 30E6 : 48; + 30E7 : 20; + 30E8 : 8E; + 30E9 : D2; + 30EA : AA; + 30EB : 10; + 30EC : 05; + 30ED : A9; + 30EE : 70; + 30EF : 20; + 30F0 : C8; + 30F1 : C1; + 30F2 : 86; + 30F3 : F9; + 30F4 : 68; + 30F5 : A8; + 30F6 : 8A; + 30F7 : 09; + 30F8 : 80; + 30F9 : 99; + 30FA : A7; + 30FB : 00; + 30FC : 0A; + 30FD : AA; + 30FE : AD; + 30FF : 85; + 3100 : FE; + 3101 : 95; + 3102 : 06; + 3103 : A9; + 3104 : 00; + 3105 : 95; + 3106 : 07; + 3107 : 4C; + 3108 : 86; + 3109 : D5; + 310A : 29; + 310B : 0F; + 310C : 85; + 310D : F9; + 310E : 60; + 310F : A9; + 3110 : 06; + 3111 : A6; + 3112 : 7F; + 3113 : D0; + 3114 : 03; + 3115 : 18; + 3116 : 69; + 3117 : 07; + 3118 : 60; + 3119 : 20; + 311A : 0F; + 311B : F1; + 311C : AA; + 311D : 60; + 311E : 20; + 311F : 3E; + 3120 : DE; + 3121 : A9; + 3122 : 03; + 3123 : 85; + 3124 : 6F; + 3125 : A9; + 3126 : 01; + 3127 : 0D; + 3128 : F9; + 3129 : 02; + 312A : 8D; + 312B : F9; + 312C : 02; + 312D : A5; + 312E : 6F; + 312F : 48; + 3130 : 20; + 3131 : 11; + 3132 : F0; + 3133 : 68; + 3134 : 85; + 3135 : 6F; + 3136 : B1; + 3137 : 6D; + 3138 : D0; + 3139 : 39; + 313A : A5; + 313B : 80; + 313C : CD; + 313D : 85; + 313E : FE; + 313F : F0; + 3140 : 19; + 3141 : 90; + 3142 : 1C; + 3143 : E6; + 3144 : 80; + 3145 : A5; + 3146 : 80; + 3147 : CD; + 3148 : D7; + 3149 : FE; + 314A : D0; + 314B : E1; + 314C : AE; + 314D : 85; + 314E : FE; + 314F : CA; + 3150 : 86; + 3151 : 80; + 3152 : A9; + 3153 : 00; + 3154 : 85; + 3155 : 81; + 3156 : C6; + 3157 : 6F; + 3158 : D0; + 3159 : D3; + 315A : A9; + 315B : 72; + 315C : 20; + 315D : C8; + 315E : C1; + 315F : C6; + 3160 : 80; + 3161 : D0; + 3162 : CA; + 3163 : AE; + 3164 : 85; + 3165 : FE; + 3166 : E8; + 3167 : 86; + 3168 : 80; + 3169 : A9; + 316A : 00; + 316B : 85; + 316C : 81; + 316D : C6; + 316E : 6F; + 316F : D0; + 3170 : BC; + 3171 : F0; + 3172 : E7; + 3173 : A5; + 3174 : 81; + 3175 : 18; + 3176 : 65; + 3177 : 69; + 3178 : 85; + 3179 : 81; + 317A : A5; + 317B : 80; + 317C : 20; + 317D : 4B; + 317E : F2; + 317F : 8D; + 3180 : 4E; + 3181 : 02; + 3182 : 8D; + 3183 : 4D; + 3184 : 02; + 3185 : C5; + 3186 : 81; + 3187 : B0; + 3188 : 0C; + 3189 : 38; + 318A : A5; + 318B : 81; + 318C : ED; + 318D : 4E; + 318E : 02; + 318F : 85; + 3190 : 81; + 3191 : F0; + 3192 : 02; + 3193 : C6; + 3194 : 81; + 3195 : 20; + 3196 : FA; + 3197 : F1; + 3198 : F0; + 3199 : 03; + 319A : 4C; + 319B : 90; + 319C : EF; + 319D : A9; + 319E : 00; + 319F : 85; + 31A0 : 81; + 31A1 : 20; + 31A2 : FA; + 31A3 : F1; + 31A4 : D0; + 31A5 : F4; + 31A6 : 4C; + 31A7 : F5; + 31A8 : F1; + 31A9 : A9; + 31AA : 01; + 31AB : 0D; + 31AC : F9; + 31AD : 02; + 31AE : 8D; + 31AF : F9; + 31B0 : 02; + 31B1 : A5; + 31B2 : 86; + 31B3 : 48; + 31B4 : A9; + 31B5 : 01; + 31B6 : 85; + 31B7 : 86; + 31B8 : AD; + 31B9 : 85; + 31BA : FE; + 31BB : 38; + 31BC : E5; + 31BD : 86; + 31BE : 85; + 31BF : 80; + 31C0 : 90; + 31C1 : 09; + 31C2 : F0; + 31C3 : 07; + 31C4 : 20; + 31C5 : 11; + 31C6 : F0; + 31C7 : B1; + 31C8 : 6D; + 31C9 : D0; + 31CA : 1B; + 31CB : AD; + 31CC : 85; + 31CD : FE; + 31CE : 18; + 31CF : 65; + 31D0 : 86; + 31D1 : 85; + 31D2 : 80; + 31D3 : E6; + 31D4 : 86; + 31D5 : CD; + 31D6 : D7; + 31D7 : FE; + 31D8 : 90; + 31D9 : 05; + 31DA : A9; + 31DB : 67; + 31DC : 20; + 31DD : 45; + 31DE : E6; + 31DF : 20; + 31E0 : 11; + 31E1 : F0; + 31E2 : B1; + 31E3 : 6D; + 31E4 : F0; + 31E5 : D2; + 31E6 : 68; + 31E7 : 85; + 31E8 : 86; + 31E9 : A9; + 31EA : 00; + 31EB : 85; + 31EC : 81; + 31ED : 20; + 31EE : FA; + 31EF : F1; + 31F0 : F0; + 31F1 : 03; + 31F2 : 4C; + 31F3 : 90; + 31F4 : EF; + 31F5 : A9; + 31F6 : 71; + 31F7 : 20; + 31F8 : 45; + 31F9 : E6; + 31FA : 20; + 31FB : 11; + 31FC : F0; + 31FD : 98; + 31FE : 48; + [31FF..3200] : 20; + 3201 : F2; + 3202 : A5; + 3203 : 80; + 3204 : 20; + 3205 : 4B; + 3206 : F2; + 3207 : 8D; + 3208 : 4E; + 3209 : 02; + 320A : 68; + 320B : 85; + 320C : 6F; + 320D : A5; + 320E : 81; + 320F : CD; + 3210 : 4E; + 3211 : 02; + 3212 : B0; + 3213 : 09; + 3214 : 20; + 3215 : D5; + 3216 : EF; + 3217 : D0; + 3218 : 06; + 3219 : E6; + 321A : 81; + 321B : D0; + 321C : F0; + 321D : A9; + 321E : 00; + 321F : 60; + 3220 : A5; + 3221 : 6F; + 3222 : 48; + 3223 : A9; + 3224 : 00; + 3225 : 85; + 3226 : 6F; + 3227 : AC; + 3228 : 86; + 3229 : FE; + 322A : 88; + 322B : A2; + 322C : 07; + 322D : B1; + 322E : 6D; + 322F : 3D; + 3230 : E9; + 3231 : EF; + 3232 : F0; + 3233 : 02; + 3234 : E6; + 3235 : 6F; + 3236 : CA; + 3237 : 10; + 3238 : F4; + 3239 : 88; + 323A : D0; + 323B : EF; + 323C : B1; + 323D : 6D; + 323E : C5; + 323F : 6F; + 3240 : D0; + 3241 : 04; + 3242 : 68; + 3243 : 85; + 3244 : 6F; + 3245 : 60; + 3246 : A9; + 3247 : 71; + 3248 : 20; + 3249 : 45; + 324A : E6; + 324B : AE; + 324C : D6; + 324D : FE; + 324E : DD; + 324F : D6; + 3250 : FE; + 3251 : CA; + 3252 : B0; + 3253 : FA; + 3254 : BD; + 3255 : D1; + 3256 : FE; + [3257..3258] : 60; + 3259 : A9; + 325A : 6F; + 325B : 8D; + 325C : 02; + 325D : 1C; + 325E : 29; + 325F : F0; + 3260 : 8D; + 3261 : 00; + 3262 : 1C; + 3263 : AD; + 3264 : 0C; + 3265 : 1C; + 3266 : 29; + 3267 : FE; + 3268 : 09; + 3269 : 0E; + 326A : 09; + 326B : E0; + 326C : 8D; + 326D : 0C; + 326E : 1C; + 326F : A9; + 3270 : 41; + 3271 : 8D; + 3272 : 0B; + 3273 : 1C; + 3274 : A9; + 3275 : 00; + 3276 : 8D; + 3277 : 06; + 3278 : 1C; + 3279 : A9; + 327A : 3A; + 327B : 8D; + 327C : 07; + 327D : 1C; + 327E : 8D; + 327F : 05; + 3280 : 1C; + 3281 : A9; + 3282 : 7F; + 3283 : 8D; + 3284 : 0E; + 3285 : 1C; + 3286 : A9; + 3287 : C0; + 3288 : 8D; + 3289 : 0D; + 328A : 1C; + 328B : 8D; + 328C : 0E; + 328D : 1C; + 328E : A9; + 328F : FF; + 3290 : 85; + 3291 : 3E; + 3292 : 85; + 3293 : 51; + 3294 : A9; + 3295 : 08; + 3296 : 85; + 3297 : 39; + 3298 : A9; + 3299 : 07; + 329A : 85; + 329B : 47; + 329C : A9; + 329D : 05; + 329E : 85; + 329F : 62; + 32A0 : A9; + 32A1 : FA; + 32A2 : 85; + 32A3 : 63; + 32A4 : A9; + 32A5 : C8; + 32A6 : 85; + 32A7 : 64; + 32A8 : A9; + 32A9 : 04; + 32AA : 85; + 32AB : 5E; + 32AC : A9; + 32AD : 04; + 32AE : 85; + 32AF : 5F; + 32B0 : BA; + 32B1 : 86; + 32B2 : 49; + 32B3 : AD; + 32B4 : 04; + 32B5 : 1C; + 32B6 : AD; + 32B7 : 0C; + 32B8 : 1C; + 32B9 : 09; + 32BA : 0E; + 32BB : 8D; + 32BC : 0C; + 32BD : 1C; + 32BE : A0; + 32BF : 05; + 32C0 : B9; + [32C1..32C2] : 00; + 32C3 : 10; + 32C4 : 2E; + 32C5 : C9; + [32C6..32C7] : D0; + 32C8 : 04; + 32C9 : 98; + 32CA : 4C; + 32CB : 70; + 32CC : F3; + 32CD : 29; + 32CE : 01; + 32CF : F0; + 32D0 : 07; + 32D1 : 84; + 32D2 : 3F; + 32D3 : A9; + 32D4 : 0F; + 32D5 : 4C; + 32D6 : 69; + 32D7 : F9; + 32D8 : AA; + 32D9 : 85; + 32DA : 3D; + 32DB : C5; + 32DC : 3E; + 32DD : F0; + 32DE : 0A; + 32DF : 20; + 32E0 : 7E; + 32E1 : F9; + 32E2 : A5; + 32E3 : 3D; + 32E4 : 85; + 32E5 : 3E; + 32E6 : 4C; + 32E7 : 9C; + 32E8 : F9; + 32E9 : A5; + 32EA : 20; + 32EB : 30; + 32EC : 03; + 32ED : 0A; + 32EE : 10; + 32EF : 09; + 32F0 : 4C; + 32F1 : 9C; + 32F2 : F9; + 32F3 : 88; + 32F4 : 10; + 32F5 : CA; + 32F6 : 4C; + 32F7 : 9C; + 32F8 : F9; + 32F9 : A9; + 32FA : 20; + 32FB : 85; + 32FC : 20; + 32FD : A0; + 32FE : 05; + 32FF : 84; + 3300 : 3F; + 3301 : 20; + 3302 : 93; + 3303 : F3; + 3304 : 30; + 3305 : 1A; + 3306 : C6; + 3307 : 3F; + 3308 : 10; + 3309 : F7; + 330A : A4; + 330B : 41; + 330C : 20; + 330D : 95; + 330E : F3; + 330F : A5; + 3310 : 42; + 3311 : 85; + 3312 : 4A; + 3313 : 06; + 3314 : 4A; + 3315 : A9; + 3316 : 60; + 3317 : 85; + 3318 : 20; + 3319 : B1; + 331A : 32; + 331B : 85; + 331C : 22; + 331D : 4C; + 331E : 9C; + 331F : F9; + 3320 : 29; + 3321 : 01; + 3322 : C5; + 3323 : 3D; + 3324 : D0; + 3325 : E0; + 3326 : A5; + 3327 : 22; + 3328 : F0; + 3329 : 12; + 332A : 38; + 332B : F1; + 332C : 32; + 332D : F0; + 332E : 0D; + 332F : 49; + 3330 : FF; + 3331 : 85; + 3332 : 42; + 3333 : E6; + 3334 : 42; + 3335 : A5; + 3336 : 3F; + 3337 : 85; + 3338 : 41; + 3339 : 4C; + 333A : 06; + 333B : F3; + 333C : A2; + 333D : 04; + 333E : B1; + 333F : 32; + 3340 : 85; + 3341 : 40; + 3342 : DD; + 3343 : D6; + 3344 : FE; + 3345 : CA; + 3346 : B0; + 3347 : FA; + 3348 : BD; + 3349 : D1; + 334A : FE; + 334B : 85; + 334C : 43; + 334D : 8A; + [334E..3352] : 0A; + 3353 : 85; + 3354 : 44; + 3355 : AD; + 3356 : 00; + 3357 : 1C; + 3358 : 29; + 3359 : 9F; + 335A : 05; + 335B : 44; + 335C : 8D; + 335D : 00; + 335E : 1C; + 335F : A6; + 3360 : 3D; + 3361 : A5; + 3362 : 45; + 3363 : C9; + 3364 : 40; + 3365 : F0; + 3366 : 15; + 3367 : C9; + 3368 : 60; + 3369 : F0; + 336A : 03; + 336B : 4C; + 336C : B1; + 336D : F3; + 336E : A5; + 336F : 3F; + 3370 : 18; + 3371 : 69; + 3372 : 03; + 3373 : 85; + 3374 : 31; + 3375 : A9; + 3376 : 00; + 3377 : 85; + 3378 : 30; + 3379 : 6C; + 337A : 30; + 337B : 00; + 337C : A9; + 337D : 60; + 337E : 85; + 337F : 20; + 3380 : AD; + 3381 : 00; + 3382 : 1C; + 3383 : 29; + 3384 : FC; + 3385 : 8D; + 3386 : 00; + 3387 : 1C; + 3388 : A9; + 3389 : A4; + 338A : 85; + 338B : 4A; + 338C : A9; + 338D : 01; + 338E : 85; + 338F : 22; + 3390 : 4C; + 3391 : 69; + 3392 : F9; + 3393 : A4; + 3394 : 3F; + 3395 : B9; + [3396..3397] : 00; + 3398 : 48; + [3399..339A] : 10; + 339B : 29; + 339C : 78; + 339D : 85; + 339E : 45; + 339F : 98; + 33A0 : 0A; + 33A1 : 69; + 33A2 : 06; + 33A3 : 85; + 33A4 : 32; + 33A5 : 98; + 33A6 : 18; + 33A7 : 69; + 33A8 : 03; + 33A9 : 85; + 33AA : 31; + 33AB : A0; + 33AC : 00; + 33AD : 84; + 33AE : 30; + 33AF : 68; + 33B0 : 60; + 33B1 : A2; + 33B2 : 5A; + 33B3 : 86; + 33B4 : 4B; + 33B5 : A2; + 33B6 : 00; + 33B7 : A9; + 33B8 : 52; + 33B9 : 85; + 33BA : 24; + 33BB : 20; + 33BC : 56; + 33BD : F5; + 33BE : 50; + 33BF : FE; + 33C0 : B8; + 33C1 : AD; + 33C2 : 01; + 33C3 : 1C; + 33C4 : C5; + 33C5 : 24; + 33C6 : D0; + 33C7 : 3F; + 33C8 : 50; + 33C9 : FE; + 33CA : B8; + 33CB : AD; + 33CC : 01; + 33CD : 1C; + 33CE : 95; + 33CF : 25; + 33D0 : E8; + 33D1 : E0; + 33D2 : 07; + 33D3 : D0; + 33D4 : F3; + 33D5 : 20; + 33D6 : 97; + 33D7 : F4; + 33D8 : A0; + 33D9 : 04; + 33DA : A9; + 33DB : 00; + 33DC : 59; + 33DD : 16; + 33DE : 00; + 33DF : 88; + 33E0 : 10; + 33E1 : FA; + 33E2 : C9; + 33E3 : 00; + 33E4 : D0; + 33E5 : 38; + 33E6 : A6; + 33E7 : 3E; + 33E8 : A5; + 33E9 : 18; + 33EA : 95; + 33EB : 22; + 33EC : A5; + 33ED : 45; + 33EE : C9; + 33EF : 30; + 33F0 : F0; + 33F1 : 1E; + 33F2 : A5; + 33F3 : 3E; + 33F4 : 0A; + 33F5 : A8; + 33F6 : B9; + 33F7 : 12; + 33F8 : 00; + 33F9 : C5; + 33FA : 16; + 33FB : D0; + 33FC : 1E; + 33FD : B9; + 33FE : 13; + 33FF : 00; + 3400 : C5; + 3401 : 17; + 3402 : D0; + 3403 : 17; + 3404 : 4C; + 3405 : 23; + 3406 : F4; + 3407 : C6; + 3408 : 4B; + 3409 : D0; + 340A : B0; + 340B : A9; + 340C : 02; + 340D : 20; + 340E : 69; + 340F : F9; + 3410 : A5; + 3411 : 16; + 3412 : 85; + 3413 : 12; + 3414 : A5; + 3415 : 17; + 3416 : 85; + 3417 : 13; + 3418 : A9; + 3419 : 01; + 341A : 2C; + 341B : A9; + 341C : 0B; + 341D : 2C; + 341E : A9; + 341F : 09; + 3420 : 4C; + 3421 : 69; + 3422 : F9; + 3423 : A9; + 3424 : 7F; + 3425 : 85; + 3426 : 4C; + 3427 : A5; + 3428 : 19; + 3429 : 18; + 342A : 69; + 342B : 02; + 342C : C5; + 342D : 43; + 342E : 90; + 342F : 02; + 3430 : E5; + 3431 : 43; + 3432 : 85; + 3433 : 4D; + 3434 : A2; + 3435 : 05; + 3436 : 86; + 3437 : 3F; + 3438 : A2; + 3439 : FF; + 343A : 20; + 343B : 93; + 343C : F3; + 343D : 10; + 343E : 44; + 343F : 85; + 3440 : 44; + 3441 : 29; + 3442 : 01; + 3443 : C5; + 3444 : 3E; + 3445 : D0; + 3446 : 3C; + 3447 : A0; + 3448 : 00; + 3449 : B1; + 344A : 32; + 344B : C5; + 344C : 40; + 344D : D0; + 344E : 34; + 344F : A5; + 3450 : 45; + 3451 : C9; + 3452 : 60; + 3453 : F0; + 3454 : 0C; + 3455 : A0; + 3456 : 01; + 3457 : 38; + 3458 : B1; + 3459 : 32; + 345A : E5; + 345B : 4D; + 345C : 10; + 345D : 03; + 345E : 18; + 345F : 65; + 3460 : 43; + 3461 : C5; + 3462 : 4C; + 3463 : B0; + 3464 : 1E; + 3465 : 48; + 3466 : A5; + 3467 : 45; + 3468 : F0; + 3469 : 14; + 346A : 68; + 346B : C9; + 346C : 09; + 346D : 90; + 346E : 14; + 346F : C9; + 3470 : 0C; + 3471 : B0; + 3472 : 10; + 3473 : 85; + 3474 : 4C; + 3475 : A5; + 3476 : 3F; + 3477 : AA; + 3478 : 69; + 3479 : 03; + 347A : 85; + 347B : 31; + 347C : D0; + 347D : 05; + 347E : 68; + 347F : C9; + 3480 : 06; + 3481 : 90; + 3482 : F0; + 3483 : C6; + 3484 : 3F; + 3485 : 10; + 3486 : B3; + 3487 : 8A; + 3488 : 10; + 3489 : 03; + 348A : 4C; + 348B : 9C; + 348C : F9; + 348D : 86; + 348E : 3F; + 348F : 20; + 3490 : 93; + 3491 : F3; + 3492 : A5; + 3493 : 45; + 3494 : 4C; + 3495 : CA; + 3496 : F4; + 3497 : A5; + 3498 : 30; + 3499 : 48; + 349A : A5; + 349B : 31; + 349C : 48; + 349D : A9; + 349E : 24; + 349F : 85; + 34A0 : 30; + 34A1 : A9; + 34A2 : 00; + 34A3 : 85; + 34A4 : 31; + 34A5 : A9; + 34A6 : 00; + 34A7 : 85; + 34A8 : 34; + 34A9 : 20; + 34AA : E6; + 34AB : F7; + 34AC : A5; + 34AD : 55; + 34AE : 85; + 34AF : 18; + 34B0 : A5; + 34B1 : 54; + 34B2 : 85; + 34B3 : 19; + 34B4 : A5; + 34B5 : 53; + 34B6 : 85; + 34B7 : 1A; + 34B8 : 20; + 34B9 : E6; + 34BA : F7; + 34BB : A5; + 34BC : 52; + 34BD : 85; + 34BE : 17; + 34BF : A5; + 34C0 : 53; + 34C1 : 85; + 34C2 : 16; + 34C3 : 68; + 34C4 : 85; + 34C5 : 31; + 34C6 : 68; + 34C7 : 85; + 34C8 : 30; + 34C9 : 60; + 34CA : C9; + 34CB : 00; + 34CC : F0; + 34CD : 03; + 34CE : 4C; + 34CF : 6E; + 34D0 : F5; + 34D1 : 20; + 34D2 : 0A; + 34D3 : F5; + 34D4 : 50; + 34D5 : FE; + 34D6 : B8; + 34D7 : AD; + 34D8 : 01; + 34D9 : 1C; + 34DA : 91; + 34DB : 30; + 34DC : C8; + 34DD : D0; + 34DE : F5; + 34DF : A0; + 34E0 : BA; + 34E1 : 50; + 34E2 : FE; + 34E3 : B8; + 34E4 : AD; + 34E5 : 01; + 34E6 : 1C; + 34E7 : 99; + 34E8 : 00; + 34E9 : 01; + 34EA : C8; + 34EB : D0; + 34EC : F4; + 34ED : 20; + 34EE : E0; + 34EF : F8; + 34F0 : A5; + 34F1 : 38; + 34F2 : C5; + 34F3 : 47; + 34F4 : F0; + 34F5 : 05; + 34F6 : A9; + 34F7 : 04; + 34F8 : 4C; + 34F9 : 69; + 34FA : F9; + 34FB : 20; + 34FC : E9; + 34FD : F5; + 34FE : C5; + 34FF : 3A; + 3500 : F0; + 3501 : 03; + 3502 : A9; + 3503 : 05; + 3504 : 2C; + 3505 : A9; + 3506 : 01; + 3507 : 4C; + 3508 : 69; + 3509 : F9; + 350A : 20; + 350B : 10; + 350C : F5; + 350D : 4C; + 350E : 56; + 350F : F5; + 3510 : A5; + 3511 : 3D; + 3512 : 0A; + 3513 : AA; + 3514 : B5; + 3515 : 12; + 3516 : 85; + 3517 : 16; + 3518 : B5; + 3519 : 13; + 351A : 85; + 351B : 17; + 351C : A0; + 351D : 00; + 351E : B1; + 351F : 32; + 3520 : 85; + 3521 : 18; + 3522 : C8; + 3523 : B1; + 3524 : 32; + 3525 : 85; + 3526 : 19; + 3527 : A9; + 3528 : 00; + 3529 : 45; + 352A : 16; + 352B : 45; + 352C : 17; + 352D : 45; + 352E : 18; + 352F : 45; + 3530 : 19; + 3531 : 85; + 3532 : 1A; + 3533 : 20; + 3534 : 34; + 3535 : F9; + 3536 : A2; + 3537 : 5A; + 3538 : 20; + 3539 : 56; + 353A : F5; + 353B : A0; + 353C : 00; + 353D : 50; + 353E : FE; + 353F : B8; + 3540 : AD; + 3541 : 01; + 3542 : 1C; + 3543 : D9; + 3544 : 24; + 3545 : 00; + 3546 : D0; + 3547 : 06; + 3548 : C8; + 3549 : C0; + 354A : 08; + 354B : D0; + 354C : F0; + 354D : 60; + 354E : CA; + 354F : D0; + 3550 : E7; + 3551 : A9; + 3552 : 02; + 3553 : 4C; + 3554 : 69; + 3555 : F9; + 3556 : A9; + 3557 : D0; + 3558 : 8D; + 3559 : 05; + 355A : 18; + 355B : A9; + 355C : 03; + 355D : 2C; + 355E : 05; + 355F : 18; + 3560 : 10; + 3561 : F1; + 3562 : 2C; + 3563 : 00; + 3564 : 1C; + 3565 : 30; + 3566 : F6; + 3567 : AD; + 3568 : 01; + 3569 : 1C; + 356A : B8; + 356B : A0; + 356C : 00; + 356D : 60; + 356E : C9; + 356F : 10; + 3570 : F0; + 3571 : 03; + 3572 : 4C; + 3573 : 91; + 3574 : F6; + 3575 : 20; + 3576 : E9; + 3577 : F5; + 3578 : 85; + 3579 : 3A; + 357A : AD; + 357B : 00; + 357C : 1C; + 357D : 29; + 357E : 10; + 357F : D0; + 3580 : 05; + 3581 : A9; + 3582 : 08; + 3583 : 4C; + 3584 : 69; + 3585 : F9; + 3586 : 20; + 3587 : 8F; + 3588 : F7; + 3589 : 20; + 358A : 10; + 358B : F5; + 358C : A2; + 358D : 09; + 358E : 50; + 358F : FE; + 3590 : B8; + 3591 : CA; + 3592 : D0; + 3593 : FA; + 3594 : A9; + 3595 : FF; + 3596 : 8D; + 3597 : 03; + 3598 : 1C; + 3599 : AD; + 359A : 0C; + 359B : 1C; + 359C : 29; + 359D : 1F; + 359E : 09; + 359F : C0; + 35A0 : 8D; + 35A1 : 0C; + 35A2 : 1C; + 35A3 : A9; + 35A4 : FF; + 35A5 : A2; + 35A6 : 05; + 35A7 : 8D; + 35A8 : 01; + 35A9 : 1C; + 35AA : B8; + 35AB : 50; + 35AC : FE; + 35AD : B8; + 35AE : CA; + 35AF : D0; + 35B0 : FA; + 35B1 : A0; + 35B2 : BB; + 35B3 : B9; + 35B4 : 00; + 35B5 : 01; + 35B6 : 50; + 35B7 : FE; + 35B8 : B8; + 35B9 : 8D; + 35BA : 01; + 35BB : 1C; + 35BC : C8; + 35BD : D0; + 35BE : F4; + 35BF : B1; + 35C0 : 30; + 35C1 : 50; + 35C2 : FE; + 35C3 : B8; + 35C4 : 8D; + 35C5 : 01; + 35C6 : 1C; + 35C7 : C8; + 35C8 : D0; + 35C9 : F5; + 35CA : 50; + 35CB : FE; + 35CC : AD; + 35CD : 0C; + 35CE : 1C; + 35CF : 09; + 35D0 : E0; + 35D1 : 8D; + 35D2 : 0C; + 35D3 : 1C; + 35D4 : A9; + 35D5 : 00; + 35D6 : 8D; + 35D7 : 03; + 35D8 : 1C; + 35D9 : 20; + 35DA : F2; + 35DB : F5; + 35DC : A4; + 35DD : 3F; + 35DE : B9; + [35DF..35E0] : 00; + 35E1 : 49; + 35E2 : 30; + 35E3 : 99; + [35E4..35E5] : 00; + 35E6 : 4C; + 35E7 : B1; + 35E8 : F3; + 35E9 : A9; + 35EA : 00; + 35EB : A8; + 35EC : 51; + 35ED : 30; + 35EE : C8; + 35EF : D0; + 35F0 : FB; + 35F1 : 60; + 35F2 : A9; + 35F3 : 00; + 35F4 : 85; + 35F5 : 2E; + 35F6 : 85; + 35F7 : 30; + 35F8 : 85; + 35F9 : 4F; + 35FA : A5; + 35FB : 31; + 35FC : 85; + 35FD : 4E; + 35FE : A9; + 35FF : 01; + 3600 : 85; + 3601 : 31; + 3602 : 85; + 3603 : 2F; + 3604 : A9; + 3605 : BB; + 3606 : 85; + 3607 : 34; + 3608 : 85; + 3609 : 36; + 360A : 20; + 360B : E6; + 360C : F7; + 360D : A5; + 360E : 52; + 360F : 85; + 3610 : 38; + 3611 : A4; + 3612 : 36; + 3613 : A5; + 3614 : 53; + 3615 : 91; + 3616 : 2E; + 3617 : C8; + 3618 : A5; + 3619 : 54; + 361A : 91; + 361B : 2E; + 361C : C8; + 361D : A5; + 361E : 55; + 361F : 91; + 3620 : 2E; + 3621 : C8; + 3622 : 84; + 3623 : 36; + 3624 : 20; + 3625 : E6; + 3626 : F7; + 3627 : A4; + 3628 : 36; + 3629 : A5; + 362A : 52; + 362B : 91; + 362C : 2E; + 362D : C8; + 362E : A5; + 362F : 53; + 3630 : 91; + 3631 : 2E; + 3632 : C8; + 3633 : F0; + 3634 : 0E; + 3635 : A5; + 3636 : 54; + 3637 : 91; + 3638 : 2E; + 3639 : C8; + 363A : A5; + 363B : 55; + 363C : 91; + 363D : 2E; + 363E : C8; + 363F : 84; + 3640 : 36; + 3641 : D0; + 3642 : E1; + 3643 : A5; + 3644 : 54; + 3645 : 91; + 3646 : 30; + 3647 : C8; + 3648 : A5; + 3649 : 55; + 364A : 91; + 364B : 30; + 364C : C8; + 364D : 84; + 364E : 36; + 364F : 20; + 3650 : E6; + 3651 : F7; + 3652 : A4; + 3653 : 36; + 3654 : A5; + 3655 : 52; + 3656 : 91; + 3657 : 30; + 3658 : C8; + 3659 : A5; + 365A : 53; + 365B : 91; + 365C : 30; + 365D : C8; + 365E : A5; + 365F : 54; + 3660 : 91; + 3661 : 30; + 3662 : C8; + 3663 : A5; + 3664 : 55; + 3665 : 91; + 3666 : 30; + 3667 : C8; + 3668 : 84; + 3669 : 36; + 366A : C0; + 366B : BB; + 366C : 90; + 366D : E1; + 366E : A9; + 366F : 45; + 3670 : 85; + 3671 : 2E; + 3672 : A5; + 3673 : 31; + 3674 : 85; + 3675 : 2F; + 3676 : A0; + 3677 : BA; + 3678 : B1; + 3679 : 30; + 367A : 91; + 367B : 2E; + 367C : 88; + 367D : D0; + 367E : F9; + 367F : B1; + 3680 : 30; + 3681 : 91; + 3682 : 2E; + 3683 : A2; + 3684 : BB; + 3685 : BD; + 3686 : 00; + 3687 : 01; + 3688 : 91; + 3689 : 30; + 368A : C8; + 368B : E8; + 368C : D0; + 368D : F7; + 368E : 86; + 368F : 50; + 3690 : 60; + 3691 : C9; + 3692 : 20; + 3693 : F0; + 3694 : 03; + 3695 : 4C; + 3696 : CA; + 3697 : F6; + 3698 : 20; + 3699 : E9; + 369A : F5; + 369B : 85; + 369C : 3A; + 369D : 20; + 369E : 8F; + 369F : F7; + 36A0 : 20; + 36A1 : 0A; + 36A2 : F5; + 36A3 : A0; + 36A4 : BB; + 36A5 : B9; + 36A6 : 00; + 36A7 : 01; + 36A8 : 50; + 36A9 : FE; + 36AA : B8; + 36AB : 4D; + 36AC : 01; + 36AD : 1C; + 36AE : D0; + 36AF : 15; + 36B0 : C8; + 36B1 : D0; + 36B2 : F2; + 36B3 : B1; + 36B4 : 30; + 36B5 : 50; + 36B6 : FE; + 36B7 : B8; + 36B8 : 4D; + 36B9 : 01; + 36BA : 1C; + 36BB : D0; + 36BC : 08; + 36BD : C8; + 36BE : C0; + 36BF : FD; + 36C0 : D0; + 36C1 : F1; + 36C2 : 4C; + 36C3 : 18; + 36C4 : F4; + 36C5 : A9; + 36C6 : 07; + 36C7 : 4C; + 36C8 : 69; + 36C9 : F9; + 36CA : 20; + 36CB : 10; + 36CC : F5; + 36CD : 4C; + 36CE : 18; + 36CF : F4; + 36D0 : A9; + 36D1 : 00; + 36D2 : 85; + 36D3 : 57; + 36D4 : 85; + 36D5 : 5A; + 36D6 : A4; + 36D7 : 34; + 36D8 : A5; + 36D9 : 52; + 36DA : 29; + 36DB : F0; + [36DC..36DF] : 4A; + 36E0 : AA; + 36E1 : BD; + 36E2 : 7F; + 36E3 : F7; + [36E4..36E6] : 0A; + 36E7 : 85; + 36E8 : 56; + 36E9 : A5; + 36EA : 52; + 36EB : 29; + 36EC : 0F; + 36ED : AA; + 36EE : BD; + 36EF : 7F; + 36F0 : F7; + 36F1 : 6A; + 36F2 : 66; + 36F3 : 57; + 36F4 : 6A; + 36F5 : 66; + 36F6 : 57; + 36F7 : 29; + 36F8 : 07; + 36F9 : 05; + 36FA : 56; + 36FB : 91; + 36FC : 30; + 36FD : C8; + 36FE : A5; + 36FF : 53; + 3700 : 29; + 3701 : F0; + [3702..3705] : 4A; + 3706 : AA; + 3707 : BD; + 3708 : 7F; + 3709 : F7; + 370A : 0A; + 370B : 05; + 370C : 57; + 370D : 85; + 370E : 57; + 370F : A5; + 3710 : 53; + 3711 : 29; + 3712 : 0F; + 3713 : AA; + 3714 : BD; + 3715 : 7F; + 3716 : F7; + [3717..371A] : 2A; + 371B : 85; + 371C : 58; + 371D : 2A; + 371E : 29; + 371F : 01; + 3720 : 05; + 3721 : 57; + 3722 : 91; + 3723 : 30; + 3724 : C8; + 3725 : A5; + 3726 : 54; + 3727 : 29; + 3728 : F0; + [3729..372C] : 4A; + 372D : AA; + 372E : BD; + 372F : 7F; + 3730 : F7; + 3731 : 18; + 3732 : 6A; + 3733 : 05; + 3734 : 58; + 3735 : 91; + 3736 : 30; + 3737 : C8; + 3738 : 6A; + 3739 : 29; + 373A : 80; + 373B : 85; + 373C : 59; + 373D : A5; + 373E : 54; + 373F : 29; + 3740 : 0F; + 3741 : AA; + 3742 : BD; + 3743 : 7F; + 3744 : F7; + [3745..3746] : 0A; + 3747 : 29; + 3748 : 7C; + 3749 : 05; + 374A : 59; + 374B : 85; + 374C : 59; + 374D : A5; + 374E : 55; + 374F : 29; + 3750 : F0; + [3751..3754] : 4A; + 3755 : AA; + 3756 : BD; + 3757 : 7F; + 3758 : F7; + 3759 : 6A; + 375A : 66; + 375B : 5A; + 375C : 6A; + 375D : 66; + 375E : 5A; + 375F : 6A; + 3760 : 66; + 3761 : 5A; + 3762 : 29; + 3763 : 03; + 3764 : 05; + 3765 : 59; + 3766 : 91; + 3767 : 30; + 3768 : C8; + 3769 : D0; + 376A : 04; + 376B : A5; + 376C : 2F; + 376D : 85; + 376E : 31; + 376F : A5; + 3770 : 55; + 3771 : 29; + 3772 : 0F; + 3773 : AA; + 3774 : BD; + 3775 : 7F; + 3776 : F7; + 3777 : 05; + 3778 : 5A; + 3779 : 91; + 377A : 30; + 377B : C8; + 377C : 84; + 377D : 34; + 377E : 60; + 377F : 0A; + 3780 : 0B; + 3781 : 12; + 3782 : 13; + 3783 : 0E; + 3784 : 0F; + 3785 : 16; + 3786 : 17; + 3787 : 09; + 3788 : 19; + 3789 : 1A; + 378A : 1B; + 378B : 0D; + 378C : 1D; + 378D : 1E; + 378E : 15; + 378F : A9; + 3790 : 00; + 3791 : 85; + 3792 : 30; + 3793 : 85; + 3794 : 2E; + 3795 : 85; + 3796 : 36; + 3797 : A9; + 3798 : BB; + 3799 : 85; + 379A : 34; + 379B : 85; + 379C : 50; + 379D : A5; + 379E : 31; + 379F : 85; + 37A0 : 2F; + 37A1 : A9; + 37A2 : 01; + 37A3 : 85; + 37A4 : 31; + 37A5 : A5; + 37A6 : 47; + 37A7 : 85; + 37A8 : 52; + 37A9 : A4; + 37AA : 36; + 37AB : B1; + 37AC : 2E; + 37AD : 85; + 37AE : 53; + 37AF : C8; + 37B0 : B1; + 37B1 : 2E; + 37B2 : 85; + 37B3 : 54; + 37B4 : C8; + 37B5 : B1; + 37B6 : 2E; + 37B7 : 85; + 37B8 : 55; + 37B9 : C8; + 37BA : 84; + 37BB : 36; + 37BC : 20; + 37BD : D0; + 37BE : F6; + 37BF : A4; + 37C0 : 36; + 37C1 : B1; + 37C2 : 2E; + 37C3 : 85; + 37C4 : 52; + 37C5 : C8; + 37C6 : F0; + 37C7 : 11; + 37C8 : B1; + 37C9 : 2E; + 37CA : 85; + 37CB : 53; + 37CC : C8; + 37CD : B1; + 37CE : 2E; + 37CF : 85; + 37D0 : 54; + 37D1 : C8; + 37D2 : B1; + 37D3 : 2E; + 37D4 : 85; + 37D5 : 55; + 37D6 : C8; + 37D7 : D0; + 37D8 : E1; + 37D9 : A5; + 37DA : 3A; + 37DB : 85; + 37DC : 53; + 37DD : A9; + 37DE : 00; + 37DF : 85; + 37E0 : 54; + 37E1 : 85; + 37E2 : 55; + 37E3 : 4C; + 37E4 : D0; + 37E5 : F6; + 37E6 : A4; + 37E7 : 34; + 37E8 : B1; + 37E9 : 30; + 37EA : 29; + 37EB : F8; + [37EC..37EE] : 4A; + 37EF : 85; + 37F0 : 56; + 37F1 : B1; + 37F2 : 30; + 37F3 : 29; + 37F4 : 07; + [37F5..37F6] : 0A; + 37F7 : 85; + 37F8 : 57; + 37F9 : C8; + 37FA : D0; + 37FB : 06; + 37FC : A5; + 37FD : 4E; + 37FE : 85; + 37FF : 31; + 3800 : A4; + 3801 : 4F; + 3802 : B1; + 3803 : 30; + 3804 : 29; + 3805 : C0; + [3806..3808] : 2A; + 3809 : 05; + 380A : 57; + 380B : 85; + 380C : 57; + 380D : B1; + 380E : 30; + 380F : 29; + 3810 : 3E; + 3811 : 4A; + 3812 : 85; + 3813 : 58; + 3814 : B1; + 3815 : 30; + 3816 : 29; + 3817 : 01; + [3818..381B] : 0A; + 381C : 85; + 381D : 59; + 381E : C8; + 381F : B1; + 3820 : 30; + 3821 : 29; + 3822 : F0; + [3823..3826] : 4A; + 3827 : 05; + 3828 : 59; + 3829 : 85; + 382A : 59; + 382B : B1; + 382C : 30; + 382D : 29; + 382E : 0F; + 382F : 0A; + 3830 : 85; + 3831 : 5A; + 3832 : C8; + 3833 : B1; + 3834 : 30; + 3835 : 29; + 3836 : 80; + 3837 : 18; + [3838..3839] : 2A; + 383A : 29; + 383B : 01; + 383C : 05; + 383D : 5A; + 383E : 85; + 383F : 5A; + 3840 : B1; + 3841 : 30; + 3842 : 29; + 3843 : 7C; + [3844..3845] : 4A; + 3846 : 85; + 3847 : 5B; + 3848 : B1; + 3849 : 30; + 384A : 29; + 384B : 03; + [384C..384E] : 0A; + 384F : 85; + 3850 : 5C; + 3851 : C8; + 3852 : D0; + 3853 : 06; + 3854 : A5; + 3855 : 4E; + 3856 : 85; + 3857 : 31; + 3858 : A4; + 3859 : 4F; + 385A : B1; + 385B : 30; + 385C : 29; + 385D : E0; + [385E..3861] : 2A; + 3862 : 05; + 3863 : 5C; + 3864 : 85; + 3865 : 5C; + 3866 : B1; + 3867 : 30; + 3868 : 29; + 3869 : 1F; + 386A : 85; + 386B : 5D; + 386C : C8; + 386D : 84; + 386E : 34; + 386F : A6; + 3870 : 56; + 3871 : BD; + 3872 : A0; + 3873 : F8; + 3874 : A6; + 3875 : 57; + 3876 : 1D; + 3877 : C0; + 3878 : F8; + 3879 : 85; + 387A : 52; + 387B : A6; + 387C : 58; + 387D : BD; + 387E : A0; + 387F : F8; + 3880 : A6; + 3881 : 59; + 3882 : 1D; + 3883 : C0; + 3884 : F8; + 3885 : 85; + 3886 : 53; + 3887 : A6; + 3888 : 5A; + 3889 : BD; + 388A : A0; + 388B : F8; + 388C : A6; + 388D : 5B; + 388E : 1D; + 388F : C0; + 3890 : F8; + 3891 : 85; + 3892 : 54; + 3893 : A6; + 3894 : 5C; + 3895 : BD; + 3896 : A0; + 3897 : F8; + 3898 : A6; + 3899 : 5D; + 389A : 1D; + 389B : C0; + 389C : F8; + 389D : 85; + 389E : 55; + 389F : 60; + [38A0..38A8] : FF; + 38A9 : 80; + 38AA : 00; + 38AB : 10; + 38AC : FF; + 38AD : C0; + 38AE : 40; + 38AF : 50; + [38B0..38B1] : FF; + 38B2 : 20; + 38B3 : 30; + 38B4 : FF; + 38B5 : F0; + 38B6 : 60; + 38B7 : 70; + 38B8 : FF; + 38B9 : 90; + 38BA : A0; + 38BB : B0; + 38BC : FF; + 38BD : D0; + 38BE : E0; + [38BF..38C8] : FF; + 38C9 : 08; + 38CA : 00; + 38CB : 01; + 38CC : FF; + 38CD : 0C; + 38CE : 04; + 38CF : 05; + [38D0..38D1] : FF; + 38D2 : 02; + 38D3 : 03; + 38D4 : FF; + 38D5 : 0F; + 38D6 : 06; + 38D7 : 07; + 38D8 : FF; + 38D9 : 09; + 38DA : 0A; + 38DB : 0B; + 38DC : FF; + 38DD : 0D; + 38DE : 0E; + 38DF : FF; + 38E0 : A9; + 38E1 : 00; + 38E2 : 85; + 38E3 : 34; + 38E4 : 85; + 38E5 : 2E; + 38E6 : 85; + 38E7 : 36; + 38E8 : A9; + 38E9 : 01; + 38EA : 85; + 38EB : 4E; + 38EC : A9; + 38ED : BA; + 38EE : 85; + 38EF : 4F; + 38F0 : A5; + 38F1 : 31; + 38F2 : 85; + 38F3 : 2F; + 38F4 : 20; + 38F5 : E6; + 38F6 : F7; + 38F7 : A5; + 38F8 : 52; + 38F9 : 85; + 38FA : 38; + 38FB : A4; + 38FC : 36; + 38FD : A5; + 38FE : 53; + 38FF : 91; + 3900 : 2E; + 3901 : C8; + 3902 : A5; + 3903 : 54; + 3904 : 91; + 3905 : 2E; + 3906 : C8; + 3907 : A5; + 3908 : 55; + 3909 : 91; + 390A : 2E; + 390B : C8; + 390C : 84; + 390D : 36; + 390E : 20; + 390F : E6; + 3910 : F7; + 3911 : A4; + 3912 : 36; + 3913 : A5; + 3914 : 52; + 3915 : 91; + 3916 : 2E; + 3917 : C8; + 3918 : F0; + 3919 : 11; + 391A : A5; + 391B : 53; + 391C : 91; + 391D : 2E; + 391E : C8; + 391F : A5; + 3920 : 54; + 3921 : 91; + 3922 : 2E; + 3923 : C8; + 3924 : A5; + 3925 : 55; + 3926 : 91; + 3927 : 2E; + 3928 : C8; + 3929 : D0; + 392A : E1; + 392B : A5; + 392C : 53; + 392D : 85; + 392E : 3A; + 392F : A5; + 3930 : 2F; + 3931 : 85; + 3932 : 31; + 3933 : 60; + 3934 : A5; + 3935 : 31; + 3936 : 85; + 3937 : 2F; + 3938 : A9; + 3939 : 00; + 393A : 85; + 393B : 31; + 393C : A9; + 393D : 24; + 393E : 85; + 393F : 34; + 3940 : A5; + 3941 : 39; + 3942 : 85; + 3943 : 52; + 3944 : A5; + 3945 : 1A; + 3946 : 85; + 3947 : 53; + 3948 : A5; + 3949 : 19; + 394A : 85; + 394B : 54; + 394C : A5; + 394D : 18; + 394E : 85; + 394F : 55; + 3950 : 20; + 3951 : D0; + 3952 : F6; + 3953 : A5; + 3954 : 17; + 3955 : 85; + 3956 : 52; + 3957 : A5; + 3958 : 16; + 3959 : 85; + 395A : 53; + 395B : A9; + 395C : 00; + 395D : 85; + 395E : 54; + 395F : 85; + 3960 : 55; + 3961 : 20; + 3962 : D0; + 3963 : F6; + 3964 : A5; + 3965 : 2F; + 3966 : 85; + 3967 : 31; + 3968 : 60; + 3969 : A4; + 396A : 3F; + 396B : 99; + [396C..396D] : 00; + 396E : A5; + 396F : 50; + 3970 : F0; + 3971 : 03; + 3972 : 20; + 3973 : F2; + 3974 : F5; + 3975 : 20; + 3976 : 8F; + 3977 : F9; + 3978 : A6; + 3979 : 49; + 397A : 9A; + 397B : 4C; + 397C : BE; + 397D : F2; + 397E : A9; + 397F : A0; + 3980 : 85; + 3981 : 20; + 3982 : AD; + 3983 : 00; + 3984 : 1C; + 3985 : 09; + 3986 : 04; + 3987 : 8D; + 3988 : 00; + 3989 : 1C; + 398A : A9; + 398B : 3C; + 398C : 85; + 398D : 48; + 398E : 60; + 398F : A6; + 3990 : 3E; + 3991 : A5; + 3992 : 20; + 3993 : 09; + 3994 : 10; + 3995 : 85; + 3996 : 20; + 3997 : A9; + 3998 : FF; + 3999 : 85; + 399A : 48; + 399B : 60; + 399C : AD; + 399D : 07; + 399E : 1C; + 399F : 8D; + 39A0 : 05; + 39A1 : 1C; + 39A2 : AD; + 39A3 : 00; + 39A4 : 1C; + 39A5 : 29; + 39A6 : 10; + 39A7 : C5; + 39A8 : 1E; + 39A9 : 85; + 39AA : 1E; + 39AB : F0; + 39AC : 04; + 39AD : A9; + 39AE : 01; + 39AF : 85; + 39B0 : 1C; + 39B1 : AD; + 39B2 : FE; + 39B3 : 02; + 39B4 : F0; + 39B5 : 15; + 39B6 : C9; + 39B7 : 02; + 39B8 : D0; + 39B9 : 07; + 39BA : A9; + 39BB : 00; + 39BC : 8D; + 39BD : FE; + 39BE : 02; + 39BF : F0; + 39C0 : 0A; + 39C1 : 85; + 39C2 : 4A; + 39C3 : A9; + 39C4 : 02; + 39C5 : 8D; + 39C6 : FE; + 39C7 : 02; + 39C8 : 4C; + 39C9 : 2E; + 39CA : FA; + 39CB : A6; + 39CC : 3E; + 39CD : 30; + 39CE : 07; + 39CF : A5; + 39D0 : 20; + 39D1 : A8; + 39D2 : C9; + 39D3 : 20; + 39D4 : D0; + 39D5 : 03; + 39D6 : 4C; + 39D7 : BE; + 39D8 : FA; + 39D9 : C6; + 39DA : 48; + 39DB : D0; + 39DC : 1D; + 39DD : 98; + 39DE : 10; + 39DF : 04; + 39E0 : 29; + 39E1 : 7F; + 39E2 : 85; + 39E3 : 20; + 39E4 : 29; + 39E5 : 10; + 39E6 : F0; + 39E7 : 12; + 39E8 : AD; + 39E9 : 00; + 39EA : 1C; + 39EB : 29; + 39EC : FB; + 39ED : 8D; + 39EE : 00; + 39EF : 1C; + 39F0 : A9; + 39F1 : FF; + 39F2 : 85; + 39F3 : 3E; + 39F4 : A9; + 39F5 : 00; + 39F6 : 85; + 39F7 : 20; + 39F8 : F0; + 39F9 : DC; + 39FA : 98; + 39FB : 29; + 39FC : 40; + 39FD : D0; + 39FE : 03; + 39FF : 4C; + 3A00 : BE; + 3A01 : FA; + 3A02 : 6C; + 3A03 : 62; + 3A04 : 00; + 3A05 : A5; + 3A06 : 4A; + 3A07 : 10; + 3A08 : 05; + 3A09 : 49; + 3A0A : FF; + 3A0B : 18; + 3A0C : 69; + 3A0D : 01; + 3A0E : C5; + 3A0F : 64; + 3A10 : B0; + 3A11 : 0A; + 3A12 : A9; + 3A13 : 3B; + 3A14 : 85; + 3A15 : 62; + 3A16 : A9; + 3A17 : FA; + 3A18 : 85; + 3A19 : 63; + 3A1A : D0; + 3A1B : 12; + 3A1C : E5; + 3A1D : 5E; + 3A1E : E5; + 3A1F : 5E; + 3A20 : 85; + 3A21 : 61; + 3A22 : A5; + 3A23 : 5E; + 3A24 : 85; + 3A25 : 60; + 3A26 : A9; + 3A27 : 7B; + 3A28 : 85; + 3A29 : 62; + 3A2A : A9; + 3A2B : FA; + 3A2C : 85; + 3A2D : 63; + 3A2E : A5; + 3A2F : 4A; + 3A30 : 10; + 3A31 : 31; + 3A32 : E6; + 3A33 : 4A; + 3A34 : AE; + 3A35 : 00; + 3A36 : 1C; + 3A37 : CA; + 3A38 : 4C; + 3A39 : 69; + 3A3A : FA; + 3A3B : A5; + 3A3C : 4A; + 3A3D : D0; + 3A3E : EF; + 3A3F : A9; + 3A40 : 4E; + 3A41 : 85; + 3A42 : 62; + 3A43 : A9; + 3A44 : FA; + 3A45 : 85; + 3A46 : 63; + 3A47 : A9; + 3A48 : 05; + 3A49 : 85; + 3A4A : 60; + 3A4B : 4C; + 3A4C : BE; + 3A4D : FA; + 3A4E : C6; + 3A4F : 60; + 3A50 : D0; + 3A51 : 6C; + 3A52 : A5; + 3A53 : 20; + 3A54 : 29; + 3A55 : BF; + 3A56 : 85; + 3A57 : 20; + 3A58 : A9; + 3A59 : 05; + 3A5A : 85; + 3A5B : 62; + 3A5C : A9; + 3A5D : FA; + 3A5E : 85; + 3A5F : 63; + 3A60 : 4C; + 3A61 : BE; + 3A62 : FA; + 3A63 : C6; + 3A64 : 4A; + 3A65 : AE; + 3A66 : 00; + 3A67 : 1C; + 3A68 : E8; + 3A69 : 8A; + 3A6A : 29; + 3A6B : 03; + 3A6C : 85; + 3A6D : 4B; + 3A6E : AD; + 3A6F : 00; + 3A70 : 1C; + 3A71 : 29; + 3A72 : FC; + 3A73 : 05; + 3A74 : 4B; + 3A75 : 8D; + 3A76 : 00; + 3A77 : 1C; + 3A78 : 4C; + 3A79 : BE; + 3A7A : FA; + 3A7B : 38; + 3A7C : AD; + 3A7D : 07; + 3A7E : 1C; + 3A7F : E5; + 3A80 : 5F; + 3A81 : 8D; + 3A82 : 05; + 3A83 : 1C; + 3A84 : C6; + 3A85 : 60; + 3A86 : D0; + 3A87 : 0C; + 3A88 : A5; + 3A89 : 5E; + 3A8A : 85; + 3A8B : 60; + 3A8C : A9; + 3A8D : 97; + 3A8E : 85; + 3A8F : 62; + 3A90 : A9; + 3A91 : FA; + 3A92 : 85; + 3A93 : 63; + 3A94 : 4C; + 3A95 : 2E; + 3A96 : FA; + 3A97 : C6; + 3A98 : 61; + 3A99 : D0; + 3A9A : F9; + 3A9B : A9; + 3A9C : A5; + 3A9D : 85; + 3A9E : 62; + 3A9F : A9; + 3AA0 : FA; + 3AA1 : 85; + 3AA2 : 63; + 3AA3 : D0; + 3AA4 : EF; + 3AA5 : AD; + 3AA6 : 07; + 3AA7 : 1C; + 3AA8 : 18; + 3AA9 : 65; + 3AAA : 5F; + 3AAB : 8D; + 3AAC : 05; + 3AAD : 1C; + 3AAE : C6; + 3AAF : 60; + 3AB0 : D0; + 3AB1 : E2; + 3AB2 : A9; + 3AB3 : 4E; + 3AB4 : 85; + 3AB5 : 62; + 3AB6 : A9; + 3AB7 : FA; + 3AB8 : 85; + 3AB9 : 63; + 3ABA : A9; + 3ABB : 05; + 3ABC : 85; + 3ABD : 60; + 3ABE : AD; + 3ABF : 0C; + 3AC0 : 1C; + 3AC1 : 29; + 3AC2 : FD; + 3AC3 : 8D; + 3AC4 : 0C; + 3AC5 : 1C; + 3AC6 : 60; + 3AC7 : A5; + 3AC8 : 51; + 3AC9 : 10; + 3ACA : 2A; + 3ACB : A6; + 3ACC : 3D; + 3ACD : A9; + 3ACE : 60; + 3ACF : 95; + 3AD0 : 20; + 3AD1 : A9; + 3AD2 : 01; + 3AD3 : 95; + 3AD4 : 22; + 3AD5 : 85; + 3AD6 : 51; + 3AD7 : A9; + 3AD8 : A4; + 3AD9 : 85; + 3ADA : 4A; + 3ADB : AD; + 3ADC : 00; + 3ADD : 1C; + 3ADE : 29; + 3ADF : FC; + 3AE0 : 8D; + 3AE1 : 00; + 3AE2 : 1C; + 3AE3 : A9; + 3AE4 : 0A; + 3AE5 : 8D; + 3AE6 : 20; + 3AE7 : 06; + 3AE8 : A9; + 3AE9 : A0; + 3AEA : 8D; + 3AEB : 21; + 3AEC : 06; + 3AED : A9; + 3AEE : 0F; + 3AEF : 8D; + 3AF0 : 22; + 3AF1 : 06; + 3AF2 : 4C; + 3AF3 : 9C; + 3AF4 : F9; + 3AF5 : A0; + 3AF6 : 00; + 3AF7 : D1; + 3AF8 : 32; + 3AF9 : F0; + 3AFA : 05; + 3AFB : 91; + 3AFC : 32; + 3AFD : 4C; + 3AFE : 9C; + 3AFF : F9; + 3B00 : AD; + 3B01 : 00; + 3B02 : 1C; + 3B03 : 29; + 3B04 : 10; + 3B05 : D0; + 3B06 : 05; + 3B07 : A9; + 3B08 : 08; + 3B09 : 4C; + 3B0A : D3; + 3B0B : FD; + 3B0C : 20; + 3B0D : A3; + 3B0E : FD; + 3B0F : 20; + 3B10 : C3; + 3B11 : FD; + 3B12 : A9; + 3B13 : 55; + 3B14 : 8D; + 3B15 : 01; + 3B16 : 1C; + 3B17 : 20; + 3B18 : C3; + 3B19 : FD; + 3B1A : 20; + 3B1B : 00; + 3B1C : FE; + 3B1D : 20; + 3B1E : 56; + 3B1F : F5; + 3B20 : A9; + 3B21 : 40; + 3B22 : 0D; + 3B23 : 0B; + 3B24 : 18; + 3B25 : 8D; + 3B26 : 0B; + 3B27 : 18; + 3B28 : A9; + 3B29 : 62; + 3B2A : 8D; + 3B2B : 06; + 3B2C : 18; + 3B2D : A9; + 3B2E : 00; + 3B2F : 8D; + 3B30 : 07; + 3B31 : 18; + 3B32 : 8D; + 3B33 : 05; + 3B34 : 18; + 3B35 : A0; + 3B36 : 00; + 3B37 : A2; + 3B38 : 00; + 3B39 : 2C; + 3B3A : 00; + 3B3B : 1C; + 3B3C : 30; + 3B3D : FB; + 3B3E : 2C; + 3B3F : 00; + 3B40 : 1C; + 3B41 : 10; + 3B42 : FB; + 3B43 : AD; + 3B44 : 04; + 3B45 : 18; + 3B46 : 2C; + 3B47 : 00; + 3B48 : 1C; + 3B49 : 10; + 3B4A : 11; + 3B4B : AD; + 3B4C : 0D; + 3B4D : 18; + 3B4E : 0A; + 3B4F : 10; + 3B50 : F5; + 3B51 : E8; + 3B52 : D0; + 3B53 : EF; + 3B54 : C8; + 3B55 : D0; + 3B56 : EC; + 3B57 : A9; + 3B58 : 02; + 3B59 : 4C; + 3B5A : D3; + 3B5B : FD; + 3B5C : 86; + 3B5D : 71; + 3B5E : 84; + 3B5F : 72; + 3B60 : A2; + 3B61 : 00; + 3B62 : A0; + 3B63 : 00; + 3B64 : AD; + 3B65 : 04; + 3B66 : 18; + 3B67 : 2C; + 3B68 : 00; + 3B69 : 1C; + 3B6A : 30; + 3B6B : 11; + 3B6C : AD; + 3B6D : 0D; + 3B6E : 18; + 3B6F : 0A; + 3B70 : 10; + 3B71 : F5; + 3B72 : E8; + 3B73 : D0; + 3B74 : EF; + 3B75 : C8; + 3B76 : D0; + 3B77 : EC; + 3B78 : A9; + 3B79 : 02; + 3B7A : 4C; + 3B7B : D3; + 3B7C : FD; + 3B7D : 38; + 3B7E : 8A; + 3B7F : E5; + 3B80 : 71; + 3B81 : AA; + 3B82 : 85; + 3B83 : 70; + 3B84 : 98; + 3B85 : E5; + 3B86 : 72; + 3B87 : A8; + 3B88 : 85; + 3B89 : 71; + 3B8A : 10; + 3B8B : 0B; + 3B8C : 49; + 3B8D : FF; + 3B8E : A8; + 3B8F : 8A; + 3B90 : 49; + 3B91 : FF; + 3B92 : AA; + 3B93 : E8; + 3B94 : D0; + 3B95 : 01; + 3B96 : C8; + 3B97 : 98; + 3B98 : D0; + 3B99 : 04; + 3B9A : E0; + 3B9B : 04; + 3B9C : 90; + 3B9D : 18; + 3B9E : 06; + 3B9F : 70; + 3BA0 : 26; + 3BA1 : 71; + 3BA2 : 18; + 3BA3 : A5; + 3BA4 : 70; + 3BA5 : 6D; + 3BA6 : 21; + 3BA7 : 06; + 3BA8 : 8D; + 3BA9 : 21; + 3BAA : 06; + 3BAB : A5; + 3BAC : 71; + 3BAD : 6D; + 3BAE : 22; + 3BAF : 06; + 3BB0 : 8D; + 3BB1 : 22; + 3BB2 : 06; + 3BB3 : 4C; + 3BB4 : 0C; + 3BB5 : FB; + 3BB6 : A2; + 3BB7 : 00; + 3BB8 : A0; + 3BB9 : 00; + 3BBA : B8; + 3BBB : AD; + 3BBC : 00; + 3BBD : 1C; + 3BBE : 10; + 3BBF : 0E; + 3BC0 : 50; + 3BC1 : F9; + 3BC2 : B8; + 3BC3 : E8; + 3BC4 : D0; + 3BC5 : F5; + 3BC6 : C8; + 3BC7 : D0; + 3BC8 : F2; + 3BC9 : A9; + 3BCA : 03; + 3BCB : 4C; + 3BCC : D3; + 3BCD : FD; + 3BCE : 8A; + 3BCF : 0A; + 3BD0 : 8D; + 3BD1 : 25; + 3BD2 : 06; + 3BD3 : 98; + 3BD4 : 2A; + 3BD5 : 8D; + 3BD6 : 24; + 3BD7 : 06; + 3BD8 : A9; + 3BD9 : BF; + 3BDA : 2D; + 3BDB : 0B; + 3BDC : 18; + 3BDD : 8D; + 3BDE : 0B; + 3BDF : 18; + 3BE0 : A9; + 3BE1 : 66; + 3BE2 : 8D; + 3BE3 : 26; + 3BE4 : 06; + 3BE5 : A6; + 3BE6 : 43; + 3BE7 : A0; + 3BE8 : 00; + 3BE9 : 98; + 3BEA : 18; + 3BEB : 6D; + 3BEC : 26; + 3BED : 06; + 3BEE : 90; + 3BEF : 01; + [3BF0..3BF1] : C8; + 3BF2 : CA; + 3BF3 : D0; + 3BF4 : F5; + 3BF5 : 49; + 3BF6 : FF; + 3BF7 : 38; + 3BF8 : 69; + 3BF9 : 00; + 3BFA : 18; + 3BFB : 6D; + 3BFC : 25; + 3BFD : 06; + 3BFE : B0; + 3BFF : 03; + 3C00 : CE; + 3C01 : 24; + 3C02 : 06; + 3C03 : AA; + 3C04 : 98; + 3C05 : 49; + 3C06 : FF; + 3C07 : 38; + 3C08 : 69; + 3C09 : 00; + 3C0A : 18; + 3C0B : 6D; + 3C0C : 24; + 3C0D : 06; + 3C0E : 10; + 3C0F : 05; + 3C10 : A9; + 3C11 : 04; + 3C12 : 4C; + 3C13 : D3; + 3C14 : FD; + 3C15 : A8; + 3C16 : 8A; + 3C17 : A2; + 3C18 : 00; + 3C19 : 38; + 3C1A : E5; + 3C1B : 43; + 3C1C : B0; + 3C1D : 03; + 3C1E : 88; + 3C1F : 30; + 3C20 : 03; + 3C21 : E8; + 3C22 : D0; + 3C23 : F5; + 3C24 : 8E; + 3C25 : 26; + 3C26 : 06; + 3C27 : E0; + 3C28 : 04; + 3C29 : B0; + 3C2A : 05; + 3C2B : A9; + 3C2C : 05; + 3C2D : 4C; + 3C2E : D3; + 3C2F : FD; + 3C30 : 18; + 3C31 : 65; + 3C32 : 43; + 3C33 : 8D; + 3C34 : 27; + 3C35 : 06; + 3C36 : A9; + 3C37 : 00; + 3C38 : 8D; + 3C39 : 28; + 3C3A : 06; + 3C3B : A0; + 3C3C : 00; + 3C3D : A6; + 3C3E : 3D; + 3C3F : A5; + 3C40 : 39; + 3C41 : 99; + 3C42 : 00; + 3C43 : 03; + [3C44..3C45] : C8; + 3C46 : AD; + 3C47 : 28; + 3C48 : 06; + 3C49 : 99; + 3C4A : 00; + 3C4B : 03; + 3C4C : C8; + 3C4D : A5; + 3C4E : 51; + 3C4F : 99; + 3C50 : 00; + 3C51 : 03; + 3C52 : C8; + 3C53 : B5; + 3C54 : 13; + 3C55 : 99; + 3C56 : 00; + 3C57 : 03; + 3C58 : C8; + 3C59 : B5; + 3C5A : 12; + 3C5B : 99; + 3C5C : 00; + 3C5D : 03; + 3C5E : C8; + 3C5F : A9; + 3C60 : 0F; + 3C61 : 99; + 3C62 : 00; + 3C63 : 03; + 3C64 : C8; + 3C65 : 99; + 3C66 : 00; + 3C67 : 03; + 3C68 : C8; + 3C69 : A9; + 3C6A : 00; + 3C6B : 59; + 3C6C : FA; + 3C6D : 02; + 3C6E : 59; + 3C6F : FB; + 3C70 : 02; + 3C71 : 59; + 3C72 : FC; + 3C73 : 02; + 3C74 : 59; + 3C75 : FD; + 3C76 : 02; + 3C77 : 99; + 3C78 : F9; + 3C79 : 02; + 3C7A : EE; + 3C7B : 28; + 3C7C : 06; + 3C7D : AD; + 3C7E : 28; + 3C7F : 06; + 3C80 : C5; + 3C81 : 43; + 3C82 : 90; + 3C83 : BB; + 3C84 : 98; + 3C85 : 48; + 3C86 : E8; + 3C87 : 8A; + 3C88 : 9D; + 3C89 : 00; + 3C8A : 05; + 3C8B : E8; + 3C8C : D0; + 3C8D : FA; + 3C8E : A9; + 3C8F : 03; + 3C90 : 85; + 3C91 : 31; + 3C92 : 20; + 3C93 : 30; + 3C94 : FE; + 3C95 : 68; + 3C96 : A8; + 3C97 : 88; + 3C98 : 20; + 3C99 : E5; + 3C9A : FD; + 3C9B : 20; + 3C9C : F5; + 3C9D : FD; + 3C9E : A9; + 3C9F : 05; + 3CA0 : 85; + 3CA1 : 31; + 3CA2 : 20; + 3CA3 : E9; + 3CA4 : F5; + 3CA5 : 85; + 3CA6 : 3A; + 3CA7 : 20; + 3CA8 : 8F; + 3CA9 : F7; + 3CAA : A9; + 3CAB : 00; + 3CAC : 85; + 3CAD : 32; + 3CAE : 20; + 3CAF : 0E; + 3CB0 : FE; + 3CB1 : A9; + 3CB2 : FF; + 3CB3 : 8D; + 3CB4 : 01; + 3CB5 : 1C; + 3CB6 : A2; + 3CB7 : 05; + 3CB8 : 50; + 3CB9 : FE; + 3CBA : B8; + 3CBB : CA; + 3CBC : D0; + 3CBD : FA; + 3CBE : A2; + 3CBF : 0A; + 3CC0 : A4; + 3CC1 : 32; + 3CC2 : 50; + 3CC3 : FE; + 3CC4 : B8; + 3CC5 : B9; + 3CC6 : 00; + 3CC7 : 03; + 3CC8 : 8D; + 3CC9 : 01; + 3CCA : 1C; + 3CCB : C8; + 3CCC : CA; + 3CCD : D0; + 3CCE : F3; + 3CCF : A2; + 3CD0 : 09; + 3CD1 : 50; + 3CD2 : FE; + 3CD3 : B8; + 3CD4 : A9; + 3CD5 : 55; + 3CD6 : 8D; + 3CD7 : 01; + 3CD8 : 1C; + 3CD9 : CA; + 3CDA : D0; + 3CDB : F5; + 3CDC : A9; + 3CDD : FF; + 3CDE : A2; + 3CDF : 05; + 3CE0 : 50; + 3CE1 : FE; + 3CE2 : B8; + 3CE3 : 8D; + 3CE4 : 01; + 3CE5 : 1C; + 3CE6 : CA; + 3CE7 : D0; + 3CE8 : F7; + 3CE9 : A2; + 3CEA : BB; + 3CEB : 50; + 3CEC : FE; + 3CED : B8; + 3CEE : BD; + 3CEF : 00; + 3CF0 : 01; + 3CF1 : 8D; + 3CF2 : 01; + 3CF3 : 1C; + 3CF4 : E8; + 3CF5 : D0; + 3CF6 : F4; + 3CF7 : A0; + 3CF8 : 00; + 3CF9 : 50; + 3CFA : FE; + 3CFB : B8; + 3CFC : B1; + 3CFD : 30; + 3CFE : 8D; + 3CFF : 01; + 3D00 : 1C; + 3D01 : C8; + 3D02 : D0; + 3D03 : F5; + 3D04 : A9; + 3D05 : 55; + 3D06 : AE; + 3D07 : 26; + 3D08 : 06; + 3D09 : 50; + 3D0A : FE; + 3D0B : B8; + 3D0C : 8D; + 3D0D : 01; + 3D0E : 1C; + 3D0F : CA; + 3D10 : D0; + 3D11 : F7; + 3D12 : A5; + 3D13 : 32; + 3D14 : 18; + 3D15 : 69; + 3D16 : 0A; + 3D17 : 85; + 3D18 : 32; + 3D19 : CE; + 3D1A : 28; + 3D1B : 06; + 3D1C : D0; + 3D1D : 93; + 3D1E : 50; + 3D1F : FE; + 3D20 : B8; + 3D21 : 50; + 3D22 : FE; + 3D23 : B8; + 3D24 : 20; + 3D25 : 00; + 3D26 : FE; + 3D27 : A9; + 3D28 : C8; + 3D29 : 8D; + 3D2A : 23; + 3D2B : 06; + 3D2C : A9; + 3D2D : 00; + 3D2E : 85; + 3D2F : 30; + 3D30 : A9; + 3D31 : 03; + 3D32 : 85; + 3D33 : 31; + 3D34 : A5; + 3D35 : 43; + 3D36 : 8D; + 3D37 : 28; + 3D38 : 06; + 3D39 : 20; + 3D3A : 56; + 3D3B : F5; + 3D3C : A2; + 3D3D : 0A; + 3D3E : A0; + 3D3F : 00; + 3D40 : 50; + 3D41 : FE; + 3D42 : B8; + 3D43 : AD; + 3D44 : 01; + 3D45 : 1C; + 3D46 : D1; + 3D47 : 30; + 3D48 : D0; + 3D49 : 0E; + 3D4A : C8; + 3D4B : CA; + 3D4C : D0; + 3D4D : F2; + 3D4E : 18; + 3D4F : A5; + 3D50 : 30; + 3D51 : 69; + 3D52 : 0A; + 3D53 : 85; + 3D54 : 30; + 3D55 : 4C; + 3D56 : 62; + 3D57 : FD; + 3D58 : CE; + 3D59 : 23; + 3D5A : 06; + 3D5B : D0; + 3D5C : CF; + 3D5D : A9; + 3D5E : 06; + 3D5F : 4C; + 3D60 : D3; + 3D61 : FD; + 3D62 : 20; + 3D63 : 56; + 3D64 : F5; + 3D65 : A0; + 3D66 : BB; + 3D67 : 50; + 3D68 : FE; + 3D69 : B8; + 3D6A : AD; + 3D6B : 01; + 3D6C : 1C; + 3D6D : D9; + 3D6E : 00; + 3D6F : 01; + 3D70 : D0; + 3D71 : E6; + 3D72 : C8; + 3D73 : D0; + 3D74 : F2; + 3D75 : A2; + 3D76 : FC; + 3D77 : 50; + 3D78 : FE; + 3D79 : B8; + 3D7A : AD; + 3D7B : 01; + 3D7C : 1C; + 3D7D : D9; + 3D7E : 00; + 3D7F : 05; + 3D80 : D0; + 3D81 : D6; + 3D82 : C8; + 3D83 : CA; + 3D84 : D0; + 3D85 : F1; + 3D86 : CE; + 3D87 : 28; + 3D88 : 06; + 3D89 : D0; + 3D8A : AE; + 3D8B : E6; + 3D8C : 51; + 3D8D : A5; + 3D8E : 51; + 3D8F : C9; + 3D90 : 24; + 3D91 : B0; + 3D92 : 03; + 3D93 : 4C; + 3D94 : 9C; + 3D95 : F9; + 3D96 : A9; + 3D97 : FF; + 3D98 : 85; + 3D99 : 51; + 3D9A : A9; + 3D9B : 00; + 3D9C : 85; + 3D9D : 50; + 3D9E : A9; + 3D9F : 01; + 3DA0 : 4C; + 3DA1 : 69; + 3DA2 : F9; + 3DA3 : AD; + 3DA4 : 0C; + 3DA5 : 1C; + 3DA6 : 29; + 3DA7 : 1F; + 3DA8 : 09; + 3DA9 : C0; + 3DAA : 8D; + 3DAB : 0C; + 3DAC : 1C; + 3DAD : A9; + 3DAE : FF; + 3DAF : 8D; + 3DB0 : 03; + 3DB1 : 1C; + 3DB2 : 8D; + 3DB3 : 01; + 3DB4 : 1C; + 3DB5 : A2; + 3DB6 : 28; + 3DB7 : A0; + 3DB8 : 00; + 3DB9 : 50; + 3DBA : FE; + 3DBB : B8; + 3DBC : 88; + 3DBD : D0; + 3DBE : FA; + 3DBF : CA; + 3DC0 : D0; + 3DC1 : F7; + 3DC2 : 60; + 3DC3 : AE; + 3DC4 : 21; + 3DC5 : 06; + 3DC6 : AC; + 3DC7 : 22; + 3DC8 : 06; + 3DC9 : 50; + 3DCA : FE; + 3DCB : B8; + 3DCC : CA; + 3DCD : D0; + 3DCE : FA; + 3DCF : 88; + 3DD0 : 10; + 3DD1 : F7; + 3DD2 : 60; + 3DD3 : CE; + 3DD4 : 20; + 3DD5 : 06; + 3DD6 : F0; + 3DD7 : 03; + 3DD8 : 4C; + 3DD9 : 9C; + 3DDA : F9; + 3DDB : A0; + 3DDC : FF; + 3DDD : 84; + 3DDE : 51; + 3DDF : C8; + 3DE0 : 84; + 3DE1 : 50; + 3DE2 : 4C; + 3DE3 : 69; + 3DE4 : F9; + 3DE5 : B9; + 3DE6 : 00; + 3DE7 : 03; + 3DE8 : 99; + 3DE9 : 45; + 3DEA : 03; + 3DEB : 88; + 3DEC : D0; + 3DED : F7; + 3DEE : AD; + 3DEF : 00; + 3DF0 : 03; + 3DF1 : 8D; + 3DF2 : 45; + 3DF3 : 03; + 3DF4 : 60; + 3DF5 : A0; + 3DF6 : 44; + 3DF7 : B9; + 3DF8 : BB; + 3DF9 : 01; + 3DFA : 91; + 3DFB : 30; + 3DFC : 88; + 3DFD : 10; + 3DFE : F8; + 3DFF : 60; + 3E00 : AD; + 3E01 : 0C; + 3E02 : 1C; + 3E03 : 09; + 3E04 : E0; + 3E05 : 8D; + 3E06 : 0C; + 3E07 : 1C; + 3E08 : A9; + 3E09 : 00; + 3E0A : 8D; + 3E0B : 03; + 3E0C : 1C; + 3E0D : 60; + 3E0E : AD; + 3E0F : 0C; + 3E10 : 1C; + 3E11 : 29; + 3E12 : 1F; + 3E13 : 09; + 3E14 : C0; + 3E15 : 8D; + 3E16 : 0C; + 3E17 : 1C; + 3E18 : A9; + 3E19 : FF; + 3E1A : 8D; + 3E1B : 03; + 3E1C : 1C; + 3E1D : A9; + 3E1E : 55; + 3E1F : 8D; + 3E20 : 01; + 3E21 : 1C; + 3E22 : A2; + 3E23 : 28; + 3E24 : A0; + 3E25 : 00; + 3E26 : 50; + 3E27 : FE; + 3E28 : B8; + 3E29 : 88; + 3E2A : D0; + 3E2B : FA; + 3E2C : CA; + 3E2D : D0; + 3E2E : F7; + 3E2F : 60; + 3E30 : A9; + 3E31 : 00; + 3E32 : 85; + 3E33 : 30; + 3E34 : 85; + 3E35 : 2E; + 3E36 : 85; + 3E37 : 36; + 3E38 : A9; + 3E39 : BB; + 3E3A : 85; + 3E3B : 34; + 3E3C : A5; + 3E3D : 31; + 3E3E : 85; + 3E3F : 2F; + 3E40 : A9; + 3E41 : 01; + 3E42 : 85; + 3E43 : 31; + 3E44 : A4; + 3E45 : 36; + 3E46 : B1; + 3E47 : 2E; + 3E48 : 85; + 3E49 : 52; + 3E4A : C8; + 3E4B : B1; + 3E4C : 2E; + 3E4D : 85; + 3E4E : 53; + 3E4F : C8; + 3E50 : B1; + 3E51 : 2E; + 3E52 : 85; + 3E53 : 54; + 3E54 : C8; + 3E55 : B1; + 3E56 : 2E; + 3E57 : 85; + 3E58 : 55; + 3E59 : C8; + 3E5A : F0; + 3E5B : 08; + 3E5C : 84; + 3E5D : 36; + 3E5E : 20; + 3E5F : D0; + 3E60 : F6; + 3E61 : 4C; + 3E62 : 44; + 3E63 : FE; + 3E64 : 4C; + 3E65 : D0; + 3E66 : F6; + 3E67 : 48; + 3E68 : 8A; + 3E69 : 48; + 3E6A : 98; + 3E6B : 48; + 3E6C : AD; + 3E6D : 0D; + 3E6E : 18; + 3E6F : 29; + 3E70 : 02; + 3E71 : F0; + 3E72 : 03; + 3E73 : 20; + 3E74 : 53; + 3E75 : E8; + 3E76 : AD; + 3E77 : 0D; + 3E78 : 1C; + 3E79 : 0A; + 3E7A : 10; + 3E7B : 03; + 3E7C : 20; + 3E7D : B0; + 3E7E : F2; + 3E7F : 68; + 3E80 : A8; + 3E81 : 68; + 3E82 : AA; + 3E83 : 68; + 3E84 : 40; + 3E85 : 12; + [3E86..3E87] : 04; + 3E88 : 90; + 3E89 : 56; + 3E8A : 49; + 3E8B : 44; + 3E8C : 4D; + 3E8D : 42; + 3E8E : 55; + 3E8F : 50; + 3E90 : 26; + 3E91 : 43; + 3E92 : 52; + 3E93 : 53; + 3E94 : 4E; + 3E95 : 84; + 3E96 : 05; + 3E97 : C1; + 3E98 : F8; + 3E99 : 1B; + 3E9A : 5C; + 3E9B : 07; + 3E9C : A3; + 3E9D : F0; + 3E9E : 88; + 3E9F : 23; + 3EA0 : 0D; + 3EA1 : ED; + 3EA2 : D0; + 3EA3 : C8; + 3EA4 : CA; + 3EA5 : CC; + 3EA6 : CB; + 3EA7 : E2; + 3EA8 : E7; + 3EA9 : C8; + 3EAA : CA; + 3EAB : C8; + 3EAC : EE; + 3EAD : 51; + 3EAE : DD; + 3EAF : 1C; + 3EB0 : 9E; + 3EB1 : 1C; + 3EB2 : 52; + 3EB3 : 57; + 3EB4 : 41; + 3EB5 : 4D; + 3EB6 : 44; + 3EB7 : 53; + 3EB8 : 50; + 3EB9 : 55; + 3EBA : 4C; + 3EBB : 44; + 3EBC : 53; + 3EBD : 50; + 3EBE : 55; + 3EBF : 52; + [3EC0..3EC1] : 45; + 3EC2 : 52; + 3EC3 : 53; + 3EC4 : 45; + 3EC5 : 4C; + 3EC6 : 51; + 3EC7 : 47; + 3EC8 : 52; + 3EC9 : 4C; + 3ECA : 08; + [3ECB..3ECC] : 00; + 3ECD : 3F; + 3ECE : 7F; + 3ECF : BF; + 3ED0 : FF; + 3ED1 : 11; + 3ED2 : 12; + 3ED3 : 13; + 3ED4 : 15; + 3ED5 : 41; + 3ED6 : 04; + 3ED7 : 24; + 3ED8 : 1F; + 3ED9 : 19; + 3EDA : 12; + 3EDB : 01; + [3EDC..3EDD] : FF; + 3EDE : 01; + 3EDF : 00; + 3EE0 : 03; + 3EE1 : 04; + 3EE2 : 05; + 3EE3 : 06; + [3EE4..3EE5] : 07; + 3EE6 : EC; + 3EE7 : 6C; + 3EE8 : 65; + 3EE9 : 00; + 3EEA : 8D; + 3EEB : 00; + 3EEC : 1C; + 3EED : 8D; + 3EEE : 02; + 3EEF : 1C; + 3EF0 : 4C; + 3EF1 : 7D; + 3EF2 : EA; + 3EF3 : 8A; + 3EF4 : A2; + 3EF5 : 05; + 3EF6 : CA; + 3EF7 : D0; + 3EF8 : FD; + 3EF9 : AA; + 3EFA : 60; + 3EFB : 20; + 3EFC : AE; + 3EFD : E9; + 3EFE : 4C; + 3EFF : 9C; + 3F00 : E9; + 3F01 : AD; + [3F02..3F03] : 02; + 3F04 : C9; + 3F05 : 2D; + 3F06 : F0; + 3F07 : 05; + 3F08 : 38; + 3F09 : E9; + 3F0A : 2B; + 3F0B : D0; + 3F0C : DA; + 3F0D : 85; + 3F0E : 23; + 3F0F : 60; + 3F10 : 8E; + 3F11 : 03; + 3F12 : 18; + 3F13 : A9; + 3F14 : 02; + 3F15 : 8D; + 3F16 : 00; + 3F17 : 18; + 3F18 : A9; + 3F19 : 1A; + 3F1A : 8D; + 3F1B : 02; + 3F1C : 18; + 3F1D : 4C; + 3F1E : A7; + 3F1F : EA; + 3F20 : AD; + 3F21 : 00; + 3F22 : 18; + 3F23 : 29; + 3F24 : 01; + 3F25 : D0; + 3F26 : F9; + 3F27 : A9; + 3F28 : 01; + 3F29 : 8D; + 3F2A : 05; + 3F2B : 18; + 3F2C : 4C; + 3F2D : DF; + 3F2E : E9; + 3F2F : A9; + 3F30 : FF; + 3F31 : 85; + 3F32 : 51; + 3F33 : 4C; + 3F34 : C6; + 3F35 : C8; + [3F36..3FE5] : AA; + 3FE6 : C6; + 3FE7 : C8; + 3FE8 : 8F; + 3FE9 : F9; + 3FEA : 5F; + 3FEB : CD; + 3FEC : 97; + 3FED : CD; + 3FEE : 00; + 3FEF : 05; + 3FF0 : 03; + 3FF1 : 05; + 3FF2 : 06; + 3FF3 : 05; + 3FF4 : 09; + 3FF5 : 05; + 3FF6 : 0C; + 3FF7 : 05; + 3FF8 : 0F; + 3FF9 : 05; + 3FFA : 01; + 3FFB : FF; + 3FFC : A0; + 3FFD : EA; + 3FFE : 67; + 3FFF : FE; +END; diff --git a/Commodore - 64_Mist/rtl/roms/std_C64.mif b/Commodore - 64_Mist/rtl/roms/std_C64.mif new file mode 100644 index 00000000..9ab99201 --- /dev/null +++ b/Commodore - 64_Mist/rtl/roms/std_C64.mif @@ -0,0 +1,16169 @@ +-- Copyright (C) 1991-2014 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 generated Memory Initialization File (.mif) + +WIDTH=8; +DEPTH=16384; + +ADDRESS_RADIX=HEX; +DATA_RADIX=HEX; + +CONTENT BEGIN + 0000 : 94; + 0001 : E3; + 0002 : 7B; + 0003 : E3; + 0004 : 43; + 0005 : 42; + 0006 : 4D; + 0007 : 42; + 0008 : 41; + 0009 : 53; + 000A : 49; + 000B : 43; + 000C : 30; + 000D : A8; + 000E : 41; + 000F : A7; + 0010 : 1D; + 0011 : AD; + 0012 : F7; + 0013 : A8; + 0014 : A4; + 0015 : AB; + 0016 : BE; + 0017 : AB; + 0018 : 80; + 0019 : B0; + 001A : 05; + 001B : AC; + 001C : A4; + 001D : A9; + 001E : 9F; + 001F : A8; + 0020 : 70; + 0021 : A8; + 0022 : 27; + 0023 : A9; + 0024 : 1C; + 0025 : A8; + 0026 : 82; + 0027 : A8; + 0028 : D1; + 0029 : A8; + 002A : 3A; + 002B : A9; + 002C : 2E; + 002D : A8; + 002E : 4A; + 002F : A9; + 0030 : 2C; + 0031 : B8; + 0032 : 67; + 0033 : E1; + 0034 : 55; + 0035 : E1; + 0036 : 64; + 0037 : E1; + 0038 : B2; + 0039 : B3; + 003A : 23; + 003B : B8; + 003C : 7F; + 003D : AA; + 003E : 9F; + 003F : AA; + 0040 : 56; + 0041 : A8; + 0042 : 9B; + 0043 : A6; + 0044 : 5D; + 0045 : A6; + 0046 : 85; + 0047 : AA; + 0048 : 29; + 0049 : E1; + 004A : BD; + 004B : E1; + 004C : C6; + 004D : E1; + 004E : 7A; + 004F : AB; + 0050 : 41; + 0051 : A6; + 0052 : 39; + 0053 : BC; + 0054 : CC; + 0055 : BC; + 0056 : 58; + 0057 : BC; + 0058 : 10; + 0059 : 03; + 005A : 7D; + 005B : B3; + 005C : 9E; + 005D : B3; + 005E : 71; + 005F : BF; + 0060 : 97; + 0061 : E0; + 0062 : EA; + 0063 : B9; + 0064 : ED; + 0065 : BF; + 0066 : 64; + 0067 : E2; + 0068 : 6B; + 0069 : E2; + 006A : B4; + 006B : E2; + 006C : 0E; + 006D : E3; + 006E : 0D; + 006F : B8; + 0070 : 7C; + 0071 : B7; + 0072 : 65; + 0073 : B4; + 0074 : AD; + 0075 : B7; + 0076 : 8B; + 0077 : B7; + 0078 : EC; + 0079 : B6; + 007A : 00; + 007B : B7; + 007C : 2C; + 007D : B7; + 007E : 37; + 007F : B7; + 0080 : 79; + 0081 : 69; + 0082 : B8; + 0083 : 79; + 0084 : 52; + 0085 : B8; + 0086 : 7B; + 0087 : 2A; + 0088 : BA; + 0089 : 7B; + 008A : 11; + 008B : BB; + 008C : 7F; + 008D : 7A; + 008E : BF; + 008F : 50; + 0090 : E8; + 0091 : AF; + 0092 : 46; + 0093 : E5; + 0094 : AF; + 0095 : 7D; + 0096 : B3; + 0097 : BF; + 0098 : 5A; + 0099 : D3; + 009A : AE; + 009B : 64; + 009C : 15; + 009D : B0; + 009E : 45; + 009F : 4E; + 00A0 : C4; + 00A1 : 46; + 00A2 : 4F; + 00A3 : D2; + 00A4 : 4E; + 00A5 : 45; + 00A6 : 58; + 00A7 : D4; + 00A8 : 44; + 00A9 : 41; + 00AA : 54; + 00AB : C1; + 00AC : 49; + 00AD : 4E; + 00AE : 50; + 00AF : 55; + 00B0 : 54; + 00B1 : A3; + 00B2 : 49; + 00B3 : 4E; + 00B4 : 50; + 00B5 : 55; + 00B6 : D4; + 00B7 : 44; + 00B8 : 49; + 00B9 : CD; + 00BA : 52; + 00BB : 45; + 00BC : 41; + 00BD : C4; + 00BE : 4C; + 00BF : 45; + 00C0 : D4; + 00C1 : 47; + 00C2 : 4F; + 00C3 : 54; + 00C4 : CF; + 00C5 : 52; + 00C6 : 55; + 00C7 : CE; + 00C8 : 49; + 00C9 : C6; + 00CA : 52; + 00CB : 45; + 00CC : 53; + 00CD : 54; + 00CE : 4F; + 00CF : 52; + 00D0 : C5; + 00D1 : 47; + 00D2 : 4F; + 00D3 : 53; + 00D4 : 55; + 00D5 : C2; + 00D6 : 52; + 00D7 : 45; + 00D8 : 54; + 00D9 : 55; + 00DA : 52; + 00DB : CE; + 00DC : 52; + 00DD : 45; + 00DE : CD; + 00DF : 53; + 00E0 : 54; + 00E1 : 4F; + 00E2 : D0; + 00E3 : 4F; + 00E4 : CE; + 00E5 : 57; + 00E6 : 41; + 00E7 : 49; + 00E8 : D4; + 00E9 : 4C; + 00EA : 4F; + 00EB : 41; + 00EC : C4; + 00ED : 53; + 00EE : 41; + 00EF : 56; + 00F0 : C5; + 00F1 : 56; + 00F2 : 45; + 00F3 : 52; + 00F4 : 49; + 00F5 : 46; + 00F6 : D9; + 00F7 : 44; + 00F8 : 45; + 00F9 : C6; + 00FA : 50; + 00FB : 4F; + 00FC : 4B; + 00FD : C5; + 00FE : 50; + 00FF : 52; + 0100 : 49; + 0101 : 4E; + 0102 : 54; + 0103 : A3; + 0104 : 50; + 0105 : 52; + 0106 : 49; + 0107 : 4E; + 0108 : D4; + 0109 : 43; + 010A : 4F; + 010B : 4E; + 010C : D4; + 010D : 4C; + 010E : 49; + 010F : 53; + 0110 : D4; + 0111 : 43; + 0112 : 4C; + 0113 : D2; + 0114 : 43; + 0115 : 4D; + 0116 : C4; + 0117 : 53; + 0118 : 59; + 0119 : D3; + 011A : 4F; + 011B : 50; + 011C : 45; + 011D : CE; + 011E : 43; + 011F : 4C; + 0120 : 4F; + 0121 : 53; + 0122 : C5; + 0123 : 47; + 0124 : 45; + 0125 : D4; + 0126 : 4E; + 0127 : 45; + 0128 : D7; + 0129 : 54; + 012A : 41; + 012B : 42; + 012C : A8; + 012D : 54; + 012E : CF; + 012F : 46; + 0130 : CE; + 0131 : 53; + 0132 : 50; + 0133 : 43; + 0134 : A8; + 0135 : 54; + 0136 : 48; + 0137 : 45; + 0138 : CE; + 0139 : 4E; + 013A : 4F; + 013B : D4; + 013C : 53; + 013D : 54; + 013E : 45; + 013F : D0; + 0140 : AB; + 0141 : AD; + 0142 : AA; + 0143 : AF; + 0144 : DE; + 0145 : 41; + 0146 : 4E; + 0147 : C4; + 0148 : 4F; + 0149 : D2; + 014A : BE; + 014B : BD; + 014C : BC; + 014D : 53; + 014E : 47; + 014F : CE; + 0150 : 49; + 0151 : 4E; + 0152 : D4; + 0153 : 41; + 0154 : 42; + 0155 : D3; + 0156 : 55; + 0157 : 53; + 0158 : D2; + 0159 : 46; + 015A : 52; + 015B : C5; + 015C : 50; + 015D : 4F; + 015E : D3; + 015F : 53; + 0160 : 51; + 0161 : D2; + 0162 : 52; + 0163 : 4E; + 0164 : C4; + 0165 : 4C; + 0166 : 4F; + 0167 : C7; + 0168 : 45; + 0169 : 58; + 016A : D0; + 016B : 43; + 016C : 4F; + 016D : D3; + 016E : 53; + 016F : 49; + 0170 : CE; + 0171 : 54; + 0172 : 41; + 0173 : CE; + 0174 : 41; + 0175 : 54; + 0176 : CE; + 0177 : 50; + [0178..0179] : 45; + 017A : CB; + 017B : 4C; + 017C : 45; + 017D : CE; + 017E : 53; + 017F : 54; + 0180 : 52; + 0181 : A4; + 0182 : 56; + 0183 : 41; + 0184 : CC; + 0185 : 41; + 0186 : 53; + 0187 : C3; + 0188 : 43; + 0189 : 48; + 018A : 52; + 018B : A4; + 018C : 4C; + 018D : 45; + 018E : 46; + 018F : 54; + 0190 : A4; + 0191 : 52; + 0192 : 49; + 0193 : 47; + 0194 : 48; + 0195 : 54; + 0196 : A4; + 0197 : 4D; + 0198 : 49; + 0199 : 44; + 019A : A4; + 019B : 47; + 019C : CF; + 019D : 00; + 019E : 54; + [019F..01A0] : 4F; + 01A1 : 20; + 01A2 : 4D; + 01A3 : 41; + 01A4 : 4E; + 01A5 : 59; + 01A6 : 20; + 01A7 : 46; + 01A8 : 49; + 01A9 : 4C; + 01AA : 45; + 01AB : D3; + 01AC : 46; + 01AD : 49; + 01AE : 4C; + 01AF : 45; + 01B0 : 20; + 01B1 : 4F; + 01B2 : 50; + 01B3 : 45; + 01B4 : CE; + 01B5 : 46; + 01B6 : 49; + 01B7 : 4C; + 01B8 : 45; + 01B9 : 20; + 01BA : 4E; + 01BB : 4F; + 01BC : 54; + 01BD : 20; + 01BE : 4F; + 01BF : 50; + 01C0 : 45; + 01C1 : CE; + 01C2 : 46; + 01C3 : 49; + 01C4 : 4C; + 01C5 : 45; + 01C6 : 20; + 01C7 : 4E; + 01C8 : 4F; + 01C9 : 54; + 01CA : 20; + 01CB : 46; + 01CC : 4F; + 01CD : 55; + 01CE : 4E; + 01CF : C4; + 01D0 : 44; + 01D1 : 45; + 01D2 : 56; + 01D3 : 49; + 01D4 : 43; + 01D5 : 45; + 01D6 : 20; + 01D7 : 4E; + 01D8 : 4F; + 01D9 : 54; + 01DA : 20; + 01DB : 50; + 01DC : 52; + 01DD : 45; + 01DE : 53; + 01DF : 45; + 01E0 : 4E; + 01E1 : D4; + 01E2 : 4E; + 01E3 : 4F; + 01E4 : 54; + 01E5 : 20; + 01E6 : 49; + 01E7 : 4E; + 01E8 : 50; + 01E9 : 55; + 01EA : 54; + 01EB : 20; + 01EC : 46; + 01ED : 49; + 01EE : 4C; + 01EF : C5; + 01F0 : 4E; + 01F1 : 4F; + 01F2 : 54; + 01F3 : 20; + 01F4 : 4F; + 01F5 : 55; + 01F6 : 54; + 01F7 : 50; + 01F8 : 55; + 01F9 : 54; + 01FA : 20; + 01FB : 46; + 01FC : 49; + 01FD : 4C; + 01FE : C5; + 01FF : 4D; + 0200 : 49; + [0201..0202] : 53; + 0203 : 49; + 0204 : 4E; + 0205 : 47; + 0206 : 20; + 0207 : 46; + 0208 : 49; + 0209 : 4C; + 020A : 45; + 020B : 20; + 020C : 4E; + 020D : 41; + 020E : 4D; + 020F : C5; + 0210 : 49; + [0211..0212] : 4C; + 0213 : 45; + 0214 : 47; + 0215 : 41; + 0216 : 4C; + 0217 : 20; + 0218 : 44; + 0219 : 45; + 021A : 56; + 021B : 49; + 021C : 43; + 021D : 45; + 021E : 20; + 021F : 4E; + 0220 : 55; + 0221 : 4D; + 0222 : 42; + 0223 : 45; + 0224 : D2; + 0225 : 4E; + 0226 : 45; + 0227 : 58; + 0228 : 54; + 0229 : 20; + 022A : 57; + 022B : 49; + 022C : 54; + 022D : 48; + 022E : 4F; + 022F : 55; + 0230 : 54; + 0231 : 20; + 0232 : 46; + 0233 : 4F; + 0234 : D2; + 0235 : 53; + 0236 : 59; + 0237 : 4E; + 0238 : 54; + 0239 : 41; + 023A : D8; + 023B : 52; + 023C : 45; + 023D : 54; + 023E : 55; + 023F : 52; + 0240 : 4E; + 0241 : 20; + 0242 : 57; + 0243 : 49; + 0244 : 54; + 0245 : 48; + 0246 : 4F; + 0247 : 55; + 0248 : 54; + 0249 : 20; + 024A : 47; + 024B : 4F; + 024C : 53; + 024D : 55; + 024E : C2; + 024F : 4F; + 0250 : 55; + 0251 : 54; + 0252 : 20; + 0253 : 4F; + 0254 : 46; + 0255 : 20; + 0256 : 44; + 0257 : 41; + 0258 : 54; + 0259 : C1; + 025A : 49; + [025B..025C] : 4C; + 025D : 45; + 025E : 47; + 025F : 41; + 0260 : 4C; + 0261 : 20; + 0262 : 51; + 0263 : 55; + 0264 : 41; + 0265 : 4E; + 0266 : 54; + 0267 : 49; + 0268 : 54; + 0269 : D9; + 026A : 4F; + 026B : 56; + 026C : 45; + 026D : 52; + 026E : 46; + 026F : 4C; + 0270 : 4F; + 0271 : D7; + 0272 : 4F; + 0273 : 55; + 0274 : 54; + 0275 : 20; + 0276 : 4F; + 0277 : 46; + 0278 : 20; + 0279 : 4D; + 027A : 45; + 027B : 4D; + 027C : 4F; + 027D : 52; + 027E : D9; + 027F : 55; + 0280 : 4E; + 0281 : 44; + 0282 : 45; + 0283 : 46; + 0284 : 27; + 0285 : 44; + 0286 : 20; + 0287 : 53; + 0288 : 54; + 0289 : 41; + 028A : 54; + 028B : 45; + 028C : 4D; + 028D : 45; + 028E : 4E; + 028F : D4; + 0290 : 42; + 0291 : 41; + 0292 : 44; + 0293 : 20; + 0294 : 53; + 0295 : 55; + 0296 : 42; + 0297 : 53; + 0298 : 43; + 0299 : 52; + 029A : 49; + 029B : 50; + 029C : D4; + 029D : 52; + 029E : 45; + 029F : 44; + 02A0 : 49; + 02A1 : 4D; + 02A2 : 27; + 02A3 : 44; + 02A4 : 20; + 02A5 : 41; + [02A6..02A7] : 52; + 02A8 : 41; + 02A9 : D9; + 02AA : 44; + 02AB : 49; + 02AC : 56; + 02AD : 49; + 02AE : 53; + 02AF : 49; + 02B0 : 4F; + 02B1 : 4E; + 02B2 : 20; + 02B3 : 42; + 02B4 : 59; + 02B5 : 20; + 02B6 : 5A; + 02B7 : 45; + 02B8 : 52; + 02B9 : CF; + 02BA : 49; + [02BB..02BC] : 4C; + 02BD : 45; + 02BE : 47; + 02BF : 41; + 02C0 : 4C; + 02C1 : 20; + 02C2 : 44; + 02C3 : 49; + 02C4 : 52; + 02C5 : 45; + 02C6 : 43; + 02C7 : D4; + 02C8 : 54; + 02C9 : 59; + 02CA : 50; + 02CB : 45; + 02CC : 20; + 02CD : 4D; + 02CE : 49; + 02CF : 53; + 02D0 : 4D; + 02D1 : 41; + 02D2 : 54; + 02D3 : 43; + 02D4 : C8; + 02D5 : 53; + 02D6 : 54; + 02D7 : 52; + 02D8 : 49; + 02D9 : 4E; + 02DA : 47; + 02DB : 20; + 02DC : 54; + [02DD..02DE] : 4F; + 02DF : 20; + 02E0 : 4C; + 02E1 : 4F; + 02E2 : 4E; + 02E3 : C7; + 02E4 : 46; + 02E5 : 49; + 02E6 : 4C; + 02E7 : 45; + 02E8 : 20; + 02E9 : 44; + 02EA : 41; + 02EB : 54; + 02EC : C1; + 02ED : 46; + 02EE : 4F; + 02EF : 52; + 02F0 : 4D; + 02F1 : 55; + 02F2 : 4C; + 02F3 : 41; + 02F4 : 20; + 02F5 : 54; + [02F6..02F7] : 4F; + 02F8 : 20; + 02F9 : 43; + 02FA : 4F; + 02FB : 4D; + 02FC : 50; + 02FD : 4C; + 02FE : 45; + 02FF : D8; + 0300 : 43; + 0301 : 41; + 0302 : 4E; + 0303 : 27; + 0304 : 54; + 0305 : 20; + 0306 : 43; + 0307 : 4F; + 0308 : 4E; + 0309 : 54; + 030A : 49; + 030B : 4E; + 030C : 55; + 030D : C5; + 030E : 55; + 030F : 4E; + 0310 : 44; + 0311 : 45; + 0312 : 46; + 0313 : 27; + 0314 : 44; + 0315 : 20; + 0316 : 46; + 0317 : 55; + 0318 : 4E; + 0319 : 43; + 031A : 54; + 031B : 49; + 031C : 4F; + 031D : CE; + 031E : 56; + 031F : 45; + 0320 : 52; + 0321 : 49; + 0322 : 46; + 0323 : D9; + 0324 : 4C; + 0325 : 4F; + 0326 : 41; + 0327 : C4; + 0328 : 9E; + 0329 : A1; + 032A : AC; + 032B : A1; + 032C : B5; + 032D : A1; + 032E : C2; + 032F : A1; + 0330 : D0; + 0331 : A1; + 0332 : E2; + 0333 : A1; + 0334 : F0; + 0335 : A1; + 0336 : FF; + 0337 : A1; + 0338 : 10; + 0339 : A2; + 033A : 25; + 033B : A2; + 033C : 35; + 033D : A2; + 033E : 3B; + 033F : A2; + 0340 : 4F; + 0341 : A2; + 0342 : 5A; + 0343 : A2; + 0344 : 6A; + 0345 : A2; + 0346 : 72; + 0347 : A2; + 0348 : 7F; + 0349 : A2; + 034A : 90; + 034B : A2; + 034C : 9D; + 034D : A2; + 034E : AA; + 034F : A2; + 0350 : BA; + 0351 : A2; + 0352 : C8; + 0353 : A2; + 0354 : D5; + 0355 : A2; + 0356 : E4; + 0357 : A2; + 0358 : ED; + 0359 : A2; + 035A : 00; + 035B : A3; + 035C : 0E; + 035D : A3; + 035E : 1E; + 035F : A3; + 0360 : 24; + 0361 : A3; + 0362 : 83; + 0363 : A3; + 0364 : 0D; + 0365 : 4F; + 0366 : 4B; + 0367 : 0D; + 0368 : 00; + [0369..036A] : 20; + 036B : 45; + [036C..036D] : 52; + 036E : 4F; + 036F : 52; + 0370 : 00; + 0371 : 20; + 0372 : 49; + 0373 : 4E; + 0374 : 20; + 0375 : 00; + 0376 : 0D; + 0377 : 0A; + 0378 : 52; + 0379 : 45; + 037A : 41; + 037B : 44; + 037C : 59; + 037D : 2E; + 037E : 0D; + 037F : 0A; + 0380 : 00; + 0381 : 0D; + 0382 : 0A; + 0383 : 42; + 0384 : 52; + 0385 : 45; + 0386 : 41; + 0387 : 4B; + 0388 : 00; + 0389 : A0; + 038A : BA; + [038B..038E] : E8; + 038F : BD; + [0390..0391] : 01; + 0392 : C9; + 0393 : 81; + 0394 : D0; + 0395 : 21; + 0396 : A5; + 0397 : 4A; + 0398 : D0; + 0399 : 0A; + 039A : BD; + 039B : 02; + 039C : 01; + 039D : 85; + 039E : 49; + 039F : BD; + 03A0 : 03; + 03A1 : 01; + 03A2 : 85; + 03A3 : 4A; + 03A4 : DD; + 03A5 : 03; + 03A6 : 01; + 03A7 : D0; + 03A8 : 07; + 03A9 : A5; + 03AA : 49; + 03AB : DD; + 03AC : 02; + 03AD : 01; + 03AE : F0; + 03AF : 07; + 03B0 : 8A; + 03B1 : 18; + 03B2 : 69; + 03B3 : 12; + 03B4 : AA; + 03B5 : D0; + 03B6 : D8; + 03B7 : 60; + 03B8 : 20; + 03B9 : 08; + 03BA : A4; + 03BB : 85; + 03BC : 31; + 03BD : 84; + 03BE : 32; + 03BF : 38; + 03C0 : A5; + 03C1 : 5A; + 03C2 : E5; + 03C3 : 5F; + 03C4 : 85; + 03C5 : 22; + 03C6 : A8; + 03C7 : A5; + 03C8 : 5B; + 03C9 : E5; + 03CA : 60; + 03CB : AA; + 03CC : E8; + 03CD : 98; + 03CE : F0; + 03CF : 23; + 03D0 : A5; + 03D1 : 5A; + 03D2 : 38; + 03D3 : E5; + 03D4 : 22; + 03D5 : 85; + 03D6 : 5A; + 03D7 : B0; + 03D8 : 03; + 03D9 : C6; + 03DA : 5B; + 03DB : 38; + 03DC : A5; + 03DD : 58; + 03DE : E5; + 03DF : 22; + 03E0 : 85; + 03E1 : 58; + 03E2 : B0; + 03E3 : 08; + 03E4 : C6; + 03E5 : 59; + 03E6 : 90; + 03E7 : 04; + 03E8 : B1; + 03E9 : 5A; + 03EA : 91; + 03EB : 58; + 03EC : 88; + 03ED : D0; + 03EE : F9; + 03EF : B1; + 03F0 : 5A; + 03F1 : 91; + 03F2 : 58; + 03F3 : C6; + 03F4 : 5B; + 03F5 : C6; + 03F6 : 59; + 03F7 : CA; + 03F8 : D0; + 03F9 : F2; + 03FA : 60; + 03FB : 0A; + 03FC : 69; + 03FD : 3E; + 03FE : B0; + 03FF : 35; + 0400 : 85; + 0401 : 22; + 0402 : BA; + 0403 : E4; + 0404 : 22; + 0405 : 90; + 0406 : 2E; + 0407 : 60; + 0408 : C4; + 0409 : 34; + 040A : 90; + 040B : 28; + 040C : D0; + 040D : 04; + 040E : C5; + 040F : 33; + 0410 : 90; + 0411 : 22; + 0412 : 48; + 0413 : A2; + 0414 : 09; + 0415 : 98; + 0416 : 48; + 0417 : B5; + 0418 : 57; + 0419 : CA; + 041A : 10; + 041B : FA; + 041C : 20; + 041D : 26; + 041E : B5; + 041F : A2; + 0420 : F7; + 0421 : 68; + 0422 : 95; + 0423 : 61; + 0424 : E8; + 0425 : 30; + 0426 : FA; + 0427 : 68; + 0428 : A8; + 0429 : 68; + 042A : C4; + 042B : 34; + 042C : 90; + 042D : 06; + 042E : D0; + 042F : 05; + 0430 : C5; + 0431 : 33; + 0432 : B0; + 0433 : 01; + 0434 : 60; + 0435 : A2; + 0436 : 10; + 0437 : 6C; + 0438 : 00; + 0439 : 03; + 043A : 8A; + 043B : 0A; + 043C : AA; + 043D : BD; + 043E : 26; + 043F : A3; + 0440 : 85; + 0441 : 22; + 0442 : BD; + 0443 : 27; + 0444 : A3; + 0445 : 85; + 0446 : 23; + 0447 : 20; + 0448 : CC; + 0449 : FF; + 044A : A9; + 044B : 00; + 044C : 85; + 044D : 13; + 044E : 20; + 044F : D7; + 0450 : AA; + 0451 : 20; + 0452 : 45; + 0453 : AB; + 0454 : A0; + 0455 : 00; + 0456 : B1; + 0457 : 22; + 0458 : 48; + 0459 : 29; + 045A : 7F; + 045B : 20; + 045C : 47; + 045D : AB; + 045E : C8; + 045F : 68; + 0460 : 10; + 0461 : F4; + 0462 : 20; + 0463 : 7A; + 0464 : A6; + 0465 : A9; + 0466 : 69; + 0467 : A0; + 0468 : A3; + 0469 : 20; + 046A : 1E; + 046B : AB; + 046C : A4; + 046D : 3A; + 046E : C8; + 046F : F0; + 0470 : 03; + 0471 : 20; + 0472 : C2; + 0473 : BD; + 0474 : A9; + 0475 : 76; + 0476 : A0; + 0477 : A3; + 0478 : 20; + 0479 : 1E; + 047A : AB; + 047B : A9; + 047C : 80; + 047D : 20; + 047E : 90; + 047F : FF; + 0480 : 6C; + 0481 : 02; + 0482 : 03; + 0483 : 20; + 0484 : 60; + 0485 : A5; + 0486 : 86; + 0487 : 7A; + 0488 : 84; + 0489 : 7B; + 048A : 20; + 048B : 73; + 048C : 00; + 048D : AA; + [048E..048F] : F0; + 0490 : A2; + 0491 : FF; + 0492 : 86; + 0493 : 3A; + 0494 : 90; + 0495 : 06; + 0496 : 20; + 0497 : 79; + 0498 : A5; + 0499 : 4C; + 049A : E1; + 049B : A7; + 049C : 20; + 049D : 6B; + 049E : A9; + 049F : 20; + 04A0 : 79; + 04A1 : A5; + 04A2 : 84; + 04A3 : 0B; + 04A4 : 20; + 04A5 : 13; + 04A6 : A6; + 04A7 : 90; + 04A8 : 44; + 04A9 : A0; + 04AA : 01; + 04AB : B1; + 04AC : 5F; + 04AD : 85; + 04AE : 23; + 04AF : A5; + 04B0 : 2D; + 04B1 : 85; + 04B2 : 22; + 04B3 : A5; + 04B4 : 60; + 04B5 : 85; + 04B6 : 25; + 04B7 : A5; + 04B8 : 5F; + 04B9 : 88; + 04BA : F1; + 04BB : 5F; + 04BC : 18; + 04BD : 65; + 04BE : 2D; + 04BF : 85; + 04C0 : 2D; + 04C1 : 85; + 04C2 : 24; + 04C3 : A5; + 04C4 : 2E; + 04C5 : 69; + 04C6 : FF; + 04C7 : 85; + 04C8 : 2E; + 04C9 : E5; + 04CA : 60; + 04CB : AA; + 04CC : 38; + 04CD : A5; + 04CE : 5F; + 04CF : E5; + 04D0 : 2D; + 04D1 : A8; + 04D2 : B0; + 04D3 : 03; + 04D4 : E8; + 04D5 : C6; + 04D6 : 25; + 04D7 : 18; + 04D8 : 65; + 04D9 : 22; + 04DA : 90; + 04DB : 03; + 04DC : C6; + 04DD : 23; + 04DE : 18; + 04DF : B1; + 04E0 : 22; + 04E1 : 91; + 04E2 : 24; + 04E3 : C8; + 04E4 : D0; + 04E5 : F9; + 04E6 : E6; + 04E7 : 23; + 04E8 : E6; + 04E9 : 25; + 04EA : CA; + 04EB : D0; + 04EC : F2; + 04ED : 20; + 04EE : 59; + 04EF : A6; + 04F0 : 20; + 04F1 : 33; + 04F2 : A5; + 04F3 : AD; + 04F4 : 00; + 04F5 : 02; + 04F6 : F0; + 04F7 : 88; + 04F8 : 18; + 04F9 : A5; + 04FA : 2D; + 04FB : 85; + 04FC : 5A; + 04FD : 65; + 04FE : 0B; + 04FF : 85; + 0500 : 58; + 0501 : A4; + 0502 : 2E; + 0503 : 84; + 0504 : 5B; + 0505 : 90; + 0506 : 01; + 0507 : C8; + 0508 : 84; + 0509 : 59; + 050A : 20; + 050B : B8; + 050C : A3; + 050D : A5; + 050E : 14; + 050F : A4; + 0510 : 15; + 0511 : 8D; + 0512 : FE; + 0513 : 01; + 0514 : 8C; + 0515 : FF; + 0516 : 01; + 0517 : A5; + 0518 : 31; + 0519 : A4; + 051A : 32; + 051B : 85; + 051C : 2D; + 051D : 84; + 051E : 2E; + 051F : A4; + 0520 : 0B; + 0521 : 88; + 0522 : B9; + 0523 : FC; + 0524 : 01; + 0525 : 91; + 0526 : 5F; + 0527 : 88; + 0528 : 10; + 0529 : F8; + 052A : 20; + 052B : 59; + 052C : A6; + 052D : 20; + 052E : 33; + 052F : A5; + 0530 : 4C; + 0531 : 80; + 0532 : A4; + 0533 : A5; + 0534 : 2B; + 0535 : A4; + 0536 : 2C; + 0537 : 85; + 0538 : 22; + 0539 : 84; + 053A : 23; + 053B : 18; + 053C : A0; + 053D : 01; + 053E : B1; + 053F : 22; + 0540 : F0; + 0541 : 1D; + 0542 : A0; + 0543 : 04; + 0544 : C8; + 0545 : B1; + 0546 : 22; + 0547 : D0; + 0548 : FB; + 0549 : C8; + 054A : 98; + 054B : 65; + 054C : 22; + 054D : AA; + 054E : A0; + 054F : 00; + 0550 : 91; + 0551 : 22; + 0552 : A5; + 0553 : 23; + 0554 : 69; + 0555 : 00; + 0556 : C8; + 0557 : 91; + 0558 : 22; + 0559 : 86; + 055A : 22; + 055B : 85; + 055C : 23; + 055D : 90; + 055E : DD; + 055F : 60; + 0560 : A2; + 0561 : 00; + 0562 : 20; + 0563 : 12; + 0564 : E1; + 0565 : C9; + 0566 : 0D; + 0567 : F0; + 0568 : 0D; + 0569 : 9D; + 056A : 00; + 056B : 02; + 056C : E8; + 056D : E0; + 056E : 59; + 056F : 90; + 0570 : F1; + 0571 : A2; + 0572 : 17; + 0573 : 4C; + 0574 : 37; + 0575 : A4; + 0576 : 4C; + 0577 : CA; + 0578 : AA; + 0579 : 6C; + 057A : 04; + 057B : 03; + 057C : A6; + 057D : 7A; + 057E : A0; + 057F : 04; + 0580 : 84; + 0581 : 0F; + 0582 : BD; + 0583 : 00; + 0584 : 02; + 0585 : 10; + 0586 : 07; + 0587 : C9; + 0588 : FF; + 0589 : F0; + 058A : 3E; + 058B : E8; + 058C : D0; + 058D : F4; + 058E : C9; + 058F : 20; + 0590 : F0; + 0591 : 37; + 0592 : 85; + 0593 : 08; + 0594 : C9; + 0595 : 22; + 0596 : F0; + 0597 : 56; + 0598 : 24; + 0599 : 0F; + 059A : 70; + 059B : 2D; + 059C : C9; + 059D : 3F; + 059E : D0; + 059F : 04; + 05A0 : A9; + 05A1 : 99; + 05A2 : D0; + 05A3 : 25; + 05A4 : C9; + 05A5 : 30; + 05A6 : 90; + 05A7 : 04; + 05A8 : C9; + 05A9 : 3C; + 05AA : 90; + 05AB : 1D; + 05AC : 84; + 05AD : 71; + 05AE : A0; + 05AF : 00; + 05B0 : 84; + 05B1 : 0B; + 05B2 : 88; + 05B3 : 86; + 05B4 : 7A; + 05B5 : CA; + 05B6 : C8; + 05B7 : E8; + 05B8 : BD; + 05B9 : 00; + 05BA : 02; + 05BB : 38; + 05BC : F9; + 05BD : 9E; + 05BE : A0; + 05BF : F0; + 05C0 : F5; + 05C1 : C9; + 05C2 : 80; + 05C3 : D0; + 05C4 : 30; + 05C5 : 05; + 05C6 : 0B; + 05C7 : A4; + 05C8 : 71; + 05C9 : E8; + 05CA : C8; + 05CB : 99; + 05CC : FB; + 05CD : 01; + 05CE : B9; + 05CF : FB; + 05D0 : 01; + 05D1 : F0; + 05D2 : 36; + 05D3 : 38; + 05D4 : E9; + 05D5 : 3A; + 05D6 : F0; + 05D7 : 04; + 05D8 : C9; + 05D9 : 49; + 05DA : D0; + 05DB : 02; + 05DC : 85; + 05DD : 0F; + 05DE : 38; + 05DF : E9; + 05E0 : 55; + 05E1 : D0; + 05E2 : 9F; + 05E3 : 85; + 05E4 : 08; + 05E5 : BD; + 05E6 : 00; + 05E7 : 02; + 05E8 : F0; + 05E9 : DF; + 05EA : C5; + 05EB : 08; + 05EC : F0; + 05ED : DB; + 05EE : C8; + 05EF : 99; + 05F0 : FB; + 05F1 : 01; + 05F2 : E8; + 05F3 : D0; + 05F4 : F0; + 05F5 : A6; + 05F6 : 7A; + 05F7 : E6; + 05F8 : 0B; + 05F9 : C8; + 05FA : B9; + 05FB : 9D; + 05FC : A0; + 05FD : 10; + 05FE : FA; + 05FF : B9; + 0600 : 9E; + 0601 : A0; + 0602 : D0; + 0603 : B4; + 0604 : BD; + 0605 : 00; + 0606 : 02; + 0607 : 10; + 0608 : BE; + 0609 : 99; + 060A : FD; + 060B : 01; + 060C : C6; + 060D : 7B; + 060E : A9; + 060F : FF; + 0610 : 85; + 0611 : 7A; + 0612 : 60; + 0613 : A5; + 0614 : 2B; + 0615 : A6; + 0616 : 2C; + 0617 : A0; + 0618 : 01; + 0619 : 85; + 061A : 5F; + 061B : 86; + 061C : 60; + 061D : B1; + 061E : 5F; + 061F : F0; + 0620 : 1F; + [0621..0622] : C8; + 0623 : A5; + 0624 : 15; + 0625 : D1; + 0626 : 5F; + 0627 : 90; + 0628 : 18; + 0629 : F0; + 062A : 03; + 062B : 88; + 062C : D0; + 062D : 09; + 062E : A5; + 062F : 14; + 0630 : 88; + 0631 : D1; + 0632 : 5F; + 0633 : 90; + 0634 : 0C; + 0635 : F0; + 0636 : 0A; + 0637 : 88; + 0638 : B1; + 0639 : 5F; + 063A : AA; + 063B : 88; + 063C : B1; + 063D : 5F; + 063E : B0; + 063F : D7; + 0640 : 18; + 0641 : 60; + 0642 : D0; + 0643 : FD; + 0644 : A9; + 0645 : 00; + 0646 : A8; + 0647 : 91; + 0648 : 2B; + 0649 : C8; + 064A : 91; + 064B : 2B; + 064C : A5; + 064D : 2B; + 064E : 18; + 064F : 69; + 0650 : 02; + 0651 : 85; + 0652 : 2D; + 0653 : A5; + 0654 : 2C; + 0655 : 69; + 0656 : 00; + 0657 : 85; + 0658 : 2E; + 0659 : 20; + 065A : 8E; + 065B : A6; + 065C : A9; + 065D : 00; + 065E : D0; + 065F : 2D; + 0660 : 20; + 0661 : E7; + 0662 : FF; + 0663 : A5; + 0664 : 37; + 0665 : A4; + 0666 : 38; + 0667 : 85; + 0668 : 33; + 0669 : 84; + 066A : 34; + 066B : A5; + 066C : 2D; + 066D : A4; + 066E : 2E; + 066F : 85; + 0670 : 2F; + 0671 : 84; + 0672 : 30; + 0673 : 85; + 0674 : 31; + 0675 : 84; + 0676 : 32; + 0677 : 20; + 0678 : 1D; + 0679 : A8; + 067A : A2; + 067B : 19; + 067C : 86; + 067D : 16; + 067E : 68; + 067F : A8; + 0680 : 68; + 0681 : A2; + 0682 : FA; + 0683 : 9A; + 0684 : 48; + 0685 : 98; + 0686 : 48; + 0687 : A9; + 0688 : 00; + 0689 : 85; + 068A : 3E; + 068B : 85; + 068C : 10; + 068D : 60; + 068E : 18; + 068F : A5; + 0690 : 2B; + 0691 : 69; + 0692 : FF; + 0693 : 85; + 0694 : 7A; + 0695 : A5; + 0696 : 2C; + 0697 : 69; + 0698 : FF; + 0699 : 85; + 069A : 7B; + 069B : 60; + 069C : 90; + 069D : 06; + 069E : F0; + 069F : 04; + 06A0 : C9; + 06A1 : AB; + 06A2 : D0; + 06A3 : E9; + 06A4 : 20; + 06A5 : 6B; + 06A6 : A9; + 06A7 : 20; + 06A8 : 13; + 06A9 : A6; + 06AA : 20; + 06AB : 79; + 06AC : 00; + 06AD : F0; + 06AE : 0C; + 06AF : C9; + 06B0 : AB; + 06B1 : D0; + 06B2 : 8E; + 06B3 : 20; + 06B4 : 73; + 06B5 : 00; + 06B6 : 20; + 06B7 : 6B; + 06B8 : A9; + 06B9 : D0; + 06BA : 86; + [06BB..06BC] : 68; + 06BD : A5; + 06BE : 14; + 06BF : 05; + 06C0 : 15; + 06C1 : D0; + 06C2 : 06; + 06C3 : A9; + 06C4 : FF; + 06C5 : 85; + 06C6 : 14; + 06C7 : 85; + 06C8 : 15; + 06C9 : A0; + 06CA : 01; + 06CB : 84; + 06CC : 0F; + 06CD : B1; + 06CE : 5F; + 06CF : F0; + 06D0 : 43; + 06D1 : 20; + 06D2 : 2C; + 06D3 : A8; + 06D4 : 20; + 06D5 : D7; + 06D6 : AA; + 06D7 : C8; + 06D8 : B1; + 06D9 : 5F; + 06DA : AA; + 06DB : C8; + 06DC : B1; + 06DD : 5F; + 06DE : C5; + 06DF : 15; + 06E0 : D0; + 06E1 : 04; + 06E2 : E4; + 06E3 : 14; + 06E4 : F0; + 06E5 : 02; + 06E6 : B0; + 06E7 : 2C; + 06E8 : 84; + 06E9 : 49; + 06EA : 20; + 06EB : CD; + 06EC : BD; + 06ED : A9; + 06EE : 20; + 06EF : A4; + 06F0 : 49; + 06F1 : 29; + 06F2 : 7F; + 06F3 : 20; + 06F4 : 47; + 06F5 : AB; + 06F6 : C9; + 06F7 : 22; + 06F8 : D0; + 06F9 : 06; + 06FA : A5; + 06FB : 0F; + 06FC : 49; + 06FD : FF; + 06FE : 85; + 06FF : 0F; + 0700 : C8; + 0701 : F0; + 0702 : 11; + 0703 : B1; + 0704 : 5F; + 0705 : D0; + 0706 : 10; + 0707 : A8; + 0708 : B1; + 0709 : 5F; + 070A : AA; + 070B : C8; + 070C : B1; + 070D : 5F; + 070E : 86; + 070F : 5F; + 0710 : 85; + 0711 : 60; + 0712 : D0; + 0713 : B5; + 0714 : 4C; + 0715 : 86; + 0716 : E3; + 0717 : 6C; + 0718 : 06; + 0719 : 03; + 071A : 10; + 071B : D7; + 071C : C9; + 071D : FF; + 071E : F0; + 071F : D3; + 0720 : 24; + 0721 : 0F; + 0722 : 30; + 0723 : CF; + 0724 : 38; + 0725 : E9; + 0726 : 7F; + 0727 : AA; + 0728 : 84; + 0729 : 49; + 072A : A0; + 072B : FF; + 072C : CA; + 072D : F0; + 072E : 08; + 072F : C8; + 0730 : B9; + 0731 : 9E; + 0732 : A0; + 0733 : 10; + 0734 : FA; + 0735 : 30; + 0736 : F5; + 0737 : C8; + 0738 : B9; + 0739 : 9E; + 073A : A0; + 073B : 30; + 073C : B2; + 073D : 20; + 073E : 47; + 073F : AB; + 0740 : D0; + 0741 : F5; + 0742 : A9; + 0743 : 80; + 0744 : 85; + 0745 : 10; + 0746 : 20; + 0747 : A5; + 0748 : A9; + 0749 : 20; + 074A : 8A; + 074B : A3; + 074C : D0; + 074D : 05; + 074E : 8A; + 074F : 69; + 0750 : 0F; + 0751 : AA; + 0752 : 9A; + [0753..0754] : 68; + 0755 : A9; + 0756 : 09; + 0757 : 20; + 0758 : FB; + 0759 : A3; + 075A : 20; + 075B : 06; + 075C : A9; + 075D : 18; + 075E : 98; + 075F : 65; + 0760 : 7A; + 0761 : 48; + 0762 : A5; + 0763 : 7B; + 0764 : 69; + 0765 : 00; + 0766 : 48; + 0767 : A5; + 0768 : 3A; + 0769 : 48; + 076A : A5; + 076B : 39; + 076C : 48; + 076D : A9; + 076E : A4; + 076F : 20; + 0770 : FF; + 0771 : AE; + 0772 : 20; + 0773 : 8D; + 0774 : AD; + 0775 : 20; + 0776 : 8A; + 0777 : AD; + 0778 : A5; + 0779 : 66; + 077A : 09; + 077B : 7F; + 077C : 25; + 077D : 62; + 077E : 85; + 077F : 62; + 0780 : A9; + 0781 : 8B; + 0782 : A0; + 0783 : A7; + 0784 : 85; + 0785 : 22; + 0786 : 84; + 0787 : 23; + 0788 : 4C; + 0789 : 43; + 078A : AE; + 078B : A9; + 078C : BC; + 078D : A0; + 078E : B9; + 078F : 20; + 0790 : A2; + 0791 : BB; + 0792 : 20; + 0793 : 79; + 0794 : 00; + 0795 : C9; + 0796 : A9; + 0797 : D0; + 0798 : 06; + 0799 : 20; + 079A : 73; + 079B : 00; + 079C : 20; + 079D : 8A; + 079E : AD; + 079F : 20; + 07A0 : 2B; + 07A1 : BC; + 07A2 : 20; + 07A3 : 38; + 07A4 : AE; + 07A5 : A5; + 07A6 : 4A; + 07A7 : 48; + 07A8 : A5; + 07A9 : 49; + 07AA : 48; + 07AB : A9; + 07AC : 81; + 07AD : 48; + 07AE : 20; + 07AF : 2C; + 07B0 : A8; + 07B1 : A5; + 07B2 : 7A; + 07B3 : A4; + 07B4 : 7B; + 07B5 : C0; + 07B6 : 02; + 07B7 : EA; + 07B8 : F0; + 07B9 : 04; + 07BA : 85; + 07BB : 3D; + 07BC : 84; + 07BD : 3E; + 07BE : A0; + 07BF : 00; + 07C0 : B1; + 07C1 : 7A; + 07C2 : D0; + 07C3 : 43; + 07C4 : A0; + 07C5 : 02; + 07C6 : B1; + 07C7 : 7A; + 07C8 : 18; + 07C9 : D0; + 07CA : 03; + 07CB : 4C; + 07CC : 4B; + 07CD : A8; + 07CE : C8; + 07CF : B1; + 07D0 : 7A; + 07D1 : 85; + 07D2 : 39; + 07D3 : C8; + 07D4 : B1; + 07D5 : 7A; + 07D6 : 85; + 07D7 : 3A; + 07D8 : 98; + 07D9 : 65; + 07DA : 7A; + 07DB : 85; + 07DC : 7A; + 07DD : 90; + 07DE : 02; + 07DF : E6; + 07E0 : 7B; + 07E1 : 6C; + 07E2 : 08; + 07E3 : 03; + 07E4 : 20; + 07E5 : 73; + 07E6 : 00; + 07E7 : 20; + 07E8 : ED; + 07E9 : A7; + 07EA : 4C; + 07EB : AE; + 07EC : A7; + 07ED : F0; + 07EE : 3C; + 07EF : E9; + 07F0 : 80; + 07F1 : 90; + 07F2 : 11; + 07F3 : C9; + 07F4 : 23; + 07F5 : B0; + 07F6 : 17; + 07F7 : 0A; + 07F8 : A8; + 07F9 : B9; + 07FA : 0D; + 07FB : A0; + 07FC : 48; + 07FD : B9; + 07FE : 0C; + 07FF : A0; + 0800 : 48; + 0801 : 4C; + 0802 : 73; + 0803 : 00; + 0804 : 4C; + 0805 : A5; + 0806 : A9; + 0807 : C9; + 0808 : 3A; + 0809 : F0; + 080A : D6; + 080B : 4C; + 080C : 08; + 080D : AF; + 080E : C9; + 080F : 4B; + 0810 : D0; + 0811 : F9; + 0812 : 20; + 0813 : 73; + 0814 : 00; + 0815 : A9; + 0816 : A4; + 0817 : 20; + 0818 : FF; + 0819 : AE; + 081A : 4C; + 081B : A0; + 081C : A8; + 081D : 38; + 081E : A5; + 081F : 2B; + 0820 : E9; + 0821 : 01; + 0822 : A4; + 0823 : 2C; + 0824 : B0; + 0825 : 01; + 0826 : 88; + 0827 : 85; + 0828 : 41; + 0829 : 84; + 082A : 42; + 082B : 60; + 082C : 20; + 082D : E1; + 082E : FF; + 082F : B0; + 0830 : 01; + 0831 : 18; + 0832 : D0; + 0833 : 3C; + 0834 : A5; + 0835 : 7A; + 0836 : A4; + 0837 : 7B; + 0838 : A6; + 0839 : 3A; + 083A : E8; + 083B : F0; + 083C : 0C; + 083D : 85; + 083E : 3D; + 083F : 84; + 0840 : 3E; + 0841 : A5; + 0842 : 39; + 0843 : A4; + 0844 : 3A; + 0845 : 85; + 0846 : 3B; + 0847 : 84; + 0848 : 3C; + [0849..084A] : 68; + 084B : A9; + 084C : 81; + 084D : A0; + 084E : A3; + 084F : 90; + 0850 : 03; + 0851 : 4C; + 0852 : 69; + 0853 : A4; + 0854 : 4C; + 0855 : 86; + 0856 : E3; + 0857 : D0; + 0858 : 17; + 0859 : A2; + 085A : 1A; + 085B : A4; + 085C : 3E; + 085D : D0; + 085E : 03; + 085F : 4C; + 0860 : 37; + 0861 : A4; + 0862 : A5; + 0863 : 3D; + 0864 : 85; + 0865 : 7A; + 0866 : 84; + 0867 : 7B; + 0868 : A5; + 0869 : 3B; + 086A : A4; + 086B : 3C; + 086C : 85; + 086D : 39; + 086E : 84; + 086F : 3A; + 0870 : 60; + 0871 : 08; + 0872 : A9; + 0873 : 00; + 0874 : 20; + 0875 : 90; + 0876 : FF; + 0877 : 28; + 0878 : D0; + 0879 : 03; + 087A : 4C; + 087B : 59; + 087C : A6; + 087D : 20; + 087E : 60; + 087F : A6; + 0880 : 4C; + 0881 : 97; + 0882 : A8; + 0883 : A9; + 0884 : 03; + 0885 : 20; + 0886 : FB; + 0887 : A3; + 0888 : A5; + 0889 : 7B; + 088A : 48; + 088B : A5; + 088C : 7A; + 088D : 48; + 088E : A5; + 088F : 3A; + 0890 : 48; + 0891 : A5; + 0892 : 39; + 0893 : 48; + 0894 : A9; + 0895 : 8D; + 0896 : 48; + 0897 : 20; + 0898 : 79; + 0899 : 00; + 089A : 20; + 089B : A0; + 089C : A8; + 089D : 4C; + 089E : AE; + 089F : A7; + 08A0 : 20; + 08A1 : 6B; + 08A2 : A9; + 08A3 : 20; + 08A4 : 09; + 08A5 : A9; + 08A6 : 38; + 08A7 : A5; + 08A8 : 39; + 08A9 : E5; + 08AA : 14; + 08AB : A5; + 08AC : 3A; + 08AD : E5; + 08AE : 15; + 08AF : B0; + 08B0 : 0B; + 08B1 : 98; + 08B2 : 38; + 08B3 : 65; + 08B4 : 7A; + 08B5 : A6; + 08B6 : 7B; + 08B7 : 90; + 08B8 : 07; + 08B9 : E8; + 08BA : B0; + 08BB : 04; + 08BC : A5; + 08BD : 2B; + 08BE : A6; + 08BF : 2C; + 08C0 : 20; + 08C1 : 17; + 08C2 : A6; + 08C3 : 90; + 08C4 : 1E; + 08C5 : A5; + 08C6 : 5F; + 08C7 : E9; + 08C8 : 01; + 08C9 : 85; + 08CA : 7A; + 08CB : A5; + 08CC : 60; + 08CD : E9; + 08CE : 00; + 08CF : 85; + 08D0 : 7B; + 08D1 : 60; + 08D2 : D0; + 08D3 : FD; + 08D4 : A9; + 08D5 : FF; + 08D6 : 85; + 08D7 : 4A; + 08D8 : 20; + 08D9 : 8A; + 08DA : A3; + 08DB : 9A; + 08DC : C9; + 08DD : 8D; + 08DE : F0; + 08DF : 0B; + 08E0 : A2; + 08E1 : 0C; + 08E2 : 2C; + 08E3 : A2; + 08E4 : 11; + 08E5 : 4C; + 08E6 : 37; + 08E7 : A4; + 08E8 : 4C; + 08E9 : 08; + 08EA : AF; + [08EB..08EC] : 68; + 08ED : 85; + 08EE : 39; + 08EF : 68; + 08F0 : 85; + 08F1 : 3A; + 08F2 : 68; + 08F3 : 85; + 08F4 : 7A; + 08F5 : 68; + 08F6 : 85; + 08F7 : 7B; + 08F8 : 20; + 08F9 : 06; + 08FA : A9; + 08FB : 98; + 08FC : 18; + 08FD : 65; + 08FE : 7A; + 08FF : 85; + 0900 : 7A; + 0901 : 90; + 0902 : 02; + 0903 : E6; + 0904 : 7B; + 0905 : 60; + 0906 : A2; + 0907 : 3A; + 0908 : 2C; + 0909 : A2; + 090A : 00; + 090B : 86; + 090C : 07; + 090D : A0; + 090E : 00; + 090F : 84; + 0910 : 08; + 0911 : A5; + 0912 : 08; + 0913 : A6; + 0914 : 07; + 0915 : 85; + 0916 : 07; + 0917 : 86; + 0918 : 08; + 0919 : B1; + 091A : 7A; + 091B : F0; + 091C : E8; + 091D : C5; + 091E : 08; + 091F : F0; + 0920 : E4; + 0921 : C8; + 0922 : C9; + 0923 : 22; + 0924 : D0; + 0925 : F3; + 0926 : F0; + 0927 : E9; + 0928 : 20; + 0929 : 9E; + 092A : AD; + 092B : 20; + 092C : 79; + 092D : 00; + 092E : C9; + 092F : 89; + 0930 : F0; + 0931 : 05; + 0932 : A9; + 0933 : A7; + 0934 : 20; + 0935 : FF; + 0936 : AE; + 0937 : A5; + 0938 : 61; + 0939 : D0; + 093A : 05; + 093B : 20; + 093C : 09; + 093D : A9; + 093E : F0; + 093F : BB; + 0940 : 20; + 0941 : 79; + 0942 : 00; + 0943 : B0; + 0944 : 03; + 0945 : 4C; + 0946 : A0; + 0947 : A8; + 0948 : 4C; + 0949 : ED; + 094A : A7; + 094B : 20; + 094C : 9E; + 094D : B7; + 094E : 48; + 094F : C9; + 0950 : 8D; + 0951 : F0; + 0952 : 04; + 0953 : C9; + 0954 : 89; + 0955 : D0; + 0956 : 91; + 0957 : C6; + 0958 : 65; + 0959 : D0; + 095A : 04; + 095B : 68; + 095C : 4C; + 095D : EF; + 095E : A7; + 095F : 20; + 0960 : 73; + 0961 : 00; + 0962 : 20; + 0963 : 6B; + 0964 : A9; + 0965 : C9; + 0966 : 2C; + 0967 : F0; + 0968 : EE; + 0969 : 68; + 096A : 60; + 096B : A2; + 096C : 00; + 096D : 86; + 096E : 14; + 096F : 86; + 0970 : 15; + 0971 : B0; + 0972 : F7; + 0973 : E9; + 0974 : 2F; + 0975 : 85; + 0976 : 07; + 0977 : A5; + 0978 : 15; + 0979 : 85; + 097A : 22; + 097B : C9; + 097C : 19; + 097D : B0; + 097E : D4; + 097F : A5; + 0980 : 14; + 0981 : 0A; + 0982 : 26; + 0983 : 22; + 0984 : 0A; + 0985 : 26; + 0986 : 22; + 0987 : 65; + 0988 : 14; + 0989 : 85; + 098A : 14; + 098B : A5; + 098C : 22; + 098D : 65; + 098E : 15; + 098F : 85; + 0990 : 15; + 0991 : 06; + 0992 : 14; + 0993 : 26; + 0994 : 15; + 0995 : A5; + 0996 : 14; + 0997 : 65; + 0998 : 07; + 0999 : 85; + 099A : 14; + 099B : 90; + 099C : 02; + 099D : E6; + 099E : 15; + 099F : 20; + 09A0 : 73; + 09A1 : 00; + 09A2 : 4C; + 09A3 : 71; + 09A4 : A9; + 09A5 : 20; + 09A6 : 8B; + 09A7 : B0; + 09A8 : 85; + 09A9 : 49; + 09AA : 84; + 09AB : 4A; + 09AC : A9; + 09AD : B2; + 09AE : 20; + 09AF : FF; + 09B0 : AE; + 09B1 : A5; + 09B2 : 0E; + 09B3 : 48; + 09B4 : A5; + 09B5 : 0D; + 09B6 : 48; + 09B7 : 20; + 09B8 : 9E; + 09B9 : AD; + 09BA : 68; + 09BB : 2A; + 09BC : 20; + 09BD : 90; + 09BE : AD; + 09BF : D0; + 09C0 : 18; + 09C1 : 68; + 09C2 : 10; + 09C3 : 12; + 09C4 : 20; + 09C5 : 1B; + 09C6 : BC; + 09C7 : 20; + 09C8 : BF; + 09C9 : B1; + 09CA : A0; + 09CB : 00; + 09CC : A5; + 09CD : 64; + 09CE : 91; + 09CF : 49; + 09D0 : C8; + 09D1 : A5; + 09D2 : 65; + 09D3 : 91; + 09D4 : 49; + 09D5 : 60; + 09D6 : 4C; + 09D7 : D0; + 09D8 : BB; + 09D9 : 68; + 09DA : A4; + 09DB : 4A; + 09DC : C0; + 09DD : BF; + 09DE : D0; + 09DF : 4C; + 09E0 : 20; + 09E1 : A6; + 09E2 : B6; + 09E3 : C9; + 09E4 : 06; + 09E5 : D0; + 09E6 : 3D; + 09E7 : A0; + 09E8 : 00; + 09E9 : 84; + 09EA : 61; + 09EB : 84; + 09EC : 66; + 09ED : 84; + 09EE : 71; + 09EF : 20; + 09F0 : 1D; + 09F1 : AA; + 09F2 : 20; + 09F3 : E2; + 09F4 : BA; + 09F5 : E6; + 09F6 : 71; + 09F7 : A4; + 09F8 : 71; + 09F9 : 20; + 09FA : 1D; + 09FB : AA; + 09FC : 20; + 09FD : 0C; + 09FE : BC; + 09FF : AA; + 0A00 : F0; + 0A01 : 05; + 0A02 : E8; + 0A03 : 8A; + 0A04 : 20; + 0A05 : ED; + 0A06 : BA; + 0A07 : A4; + 0A08 : 71; + 0A09 : C8; + 0A0A : C0; + 0A0B : 06; + 0A0C : D0; + 0A0D : DF; + 0A0E : 20; + 0A0F : E2; + 0A10 : BA; + 0A11 : 20; + 0A12 : 9B; + 0A13 : BC; + 0A14 : A6; + 0A15 : 64; + 0A16 : A4; + 0A17 : 63; + 0A18 : A5; + 0A19 : 65; + 0A1A : 4C; + 0A1B : DB; + 0A1C : FF; + 0A1D : B1; + 0A1E : 22; + 0A1F : 20; + 0A20 : 80; + 0A21 : 00; + 0A22 : 90; + 0A23 : 03; + 0A24 : 4C; + 0A25 : 48; + 0A26 : B2; + 0A27 : E9; + 0A28 : 2F; + 0A29 : 4C; + 0A2A : 7E; + 0A2B : BD; + 0A2C : A0; + 0A2D : 02; + 0A2E : B1; + 0A2F : 64; + 0A30 : C5; + 0A31 : 34; + 0A32 : 90; + 0A33 : 17; + 0A34 : D0; + 0A35 : 07; + 0A36 : 88; + 0A37 : B1; + 0A38 : 64; + 0A39 : C5; + 0A3A : 33; + 0A3B : 90; + 0A3C : 0E; + 0A3D : A4; + 0A3E : 65; + 0A3F : C4; + 0A40 : 2E; + 0A41 : 90; + 0A42 : 08; + 0A43 : D0; + 0A44 : 0D; + 0A45 : A5; + 0A46 : 64; + 0A47 : C5; + 0A48 : 2D; + 0A49 : B0; + 0A4A : 07; + 0A4B : A5; + 0A4C : 64; + 0A4D : A4; + 0A4E : 65; + 0A4F : 4C; + 0A50 : 68; + 0A51 : AA; + 0A52 : A0; + 0A53 : 00; + 0A54 : B1; + 0A55 : 64; + 0A56 : 20; + 0A57 : 75; + 0A58 : B4; + 0A59 : A5; + 0A5A : 50; + 0A5B : A4; + 0A5C : 51; + 0A5D : 85; + 0A5E : 6F; + 0A5F : 84; + 0A60 : 70; + 0A61 : 20; + 0A62 : 7A; + 0A63 : B6; + 0A64 : A9; + 0A65 : 61; + 0A66 : A0; + 0A67 : 00; + 0A68 : 85; + 0A69 : 50; + 0A6A : 84; + 0A6B : 51; + 0A6C : 20; + 0A6D : DB; + 0A6E : B6; + 0A6F : A0; + 0A70 : 00; + 0A71 : B1; + 0A72 : 50; + 0A73 : 91; + 0A74 : 49; + 0A75 : C8; + 0A76 : B1; + 0A77 : 50; + 0A78 : 91; + 0A79 : 49; + 0A7A : C8; + 0A7B : B1; + 0A7C : 50; + 0A7D : 91; + 0A7E : 49; + 0A7F : 60; + 0A80 : 20; + 0A81 : 86; + 0A82 : AA; + 0A83 : 4C; + 0A84 : B5; + 0A85 : AB; + 0A86 : 20; + 0A87 : 9E; + 0A88 : B7; + 0A89 : F0; + 0A8A : 05; + 0A8B : A9; + 0A8C : 2C; + 0A8D : 20; + 0A8E : FF; + 0A8F : AE; + 0A90 : 08; + 0A91 : 86; + 0A92 : 13; + 0A93 : 20; + 0A94 : 18; + 0A95 : E1; + 0A96 : 28; + 0A97 : 4C; + 0A98 : A0; + 0A99 : AA; + 0A9A : 20; + 0A9B : 21; + 0A9C : AB; + 0A9D : 20; + 0A9E : 79; + 0A9F : 00; + 0AA0 : F0; + 0AA1 : 35; + 0AA2 : F0; + 0AA3 : 43; + 0AA4 : C9; + 0AA5 : A3; + 0AA6 : F0; + 0AA7 : 50; + 0AA8 : C9; + 0AA9 : A6; + 0AAA : 18; + 0AAB : F0; + 0AAC : 4B; + 0AAD : C9; + 0AAE : 2C; + 0AAF : F0; + 0AB0 : 37; + 0AB1 : C9; + 0AB2 : 3B; + 0AB3 : F0; + 0AB4 : 5E; + 0AB5 : 20; + 0AB6 : 9E; + 0AB7 : AD; + 0AB8 : 24; + 0AB9 : 0D; + 0ABA : 30; + 0ABB : DE; + 0ABC : 20; + 0ABD : DD; + 0ABE : BD; + 0ABF : 20; + 0AC0 : 87; + 0AC1 : B4; + 0AC2 : 20; + 0AC3 : 21; + 0AC4 : AB; + 0AC5 : 20; + 0AC6 : 3B; + 0AC7 : AB; + 0AC8 : D0; + 0AC9 : D3; + 0ACA : A9; + 0ACB : 00; + 0ACC : 9D; + 0ACD : 00; + 0ACE : 02; + 0ACF : A2; + 0AD0 : FF; + 0AD1 : A0; + 0AD2 : 01; + 0AD3 : A5; + 0AD4 : 13; + 0AD5 : D0; + 0AD6 : 10; + 0AD7 : A9; + 0AD8 : 0D; + 0AD9 : 20; + 0ADA : 47; + 0ADB : AB; + 0ADC : 24; + 0ADD : 13; + 0ADE : 10; + 0ADF : 05; + 0AE0 : A9; + 0AE1 : 0A; + 0AE2 : 20; + 0AE3 : 47; + 0AE4 : AB; + 0AE5 : 49; + 0AE6 : FF; + 0AE7 : 60; + 0AE8 : 38; + 0AE9 : 20; + 0AEA : F0; + 0AEB : FF; + 0AEC : 98; + 0AED : 38; + 0AEE : E9; + 0AEF : 0A; + 0AF0 : B0; + 0AF1 : FC; + 0AF2 : 49; + 0AF3 : FF; + 0AF4 : 69; + 0AF5 : 01; + 0AF6 : D0; + 0AF7 : 16; + 0AF8 : 08; + 0AF9 : 38; + 0AFA : 20; + 0AFB : F0; + 0AFC : FF; + 0AFD : 84; + 0AFE : 09; + 0AFF : 20; + 0B00 : 9B; + 0B01 : B7; + 0B02 : C9; + 0B03 : 29; + 0B04 : D0; + 0B05 : 59; + 0B06 : 28; + 0B07 : 90; + 0B08 : 06; + 0B09 : 8A; + 0B0A : E5; + 0B0B : 09; + 0B0C : 90; + 0B0D : 05; + 0B0E : AA; + 0B0F : E8; + 0B10 : CA; + 0B11 : D0; + 0B12 : 06; + 0B13 : 20; + 0B14 : 73; + 0B15 : 00; + 0B16 : 4C; + 0B17 : A2; + 0B18 : AA; + 0B19 : 20; + 0B1A : 3B; + 0B1B : AB; + 0B1C : D0; + 0B1D : F2; + 0B1E : 20; + 0B1F : 87; + 0B20 : B4; + 0B21 : 20; + 0B22 : A6; + 0B23 : B6; + 0B24 : AA; + 0B25 : A0; + 0B26 : 00; + 0B27 : E8; + 0B28 : CA; + 0B29 : F0; + 0B2A : BC; + 0B2B : B1; + 0B2C : 22; + 0B2D : 20; + 0B2E : 47; + 0B2F : AB; + 0B30 : C8; + 0B31 : C9; + 0B32 : 0D; + 0B33 : D0; + 0B34 : F3; + 0B35 : 20; + 0B36 : E5; + 0B37 : AA; + 0B38 : 4C; + 0B39 : 28; + 0B3A : AB; + 0B3B : A5; + 0B3C : 13; + 0B3D : F0; + 0B3E : 03; + 0B3F : A9; + 0B40 : 20; + 0B41 : 2C; + 0B42 : A9; + 0B43 : 1D; + 0B44 : 2C; + 0B45 : A9; + 0B46 : 3F; + 0B47 : 20; + 0B48 : 0C; + 0B49 : E1; + 0B4A : 29; + 0B4B : FF; + 0B4C : 60; + 0B4D : A5; + 0B4E : 11; + 0B4F : F0; + 0B50 : 11; + 0B51 : 30; + 0B52 : 04; + 0B53 : A0; + 0B54 : FF; + 0B55 : D0; + 0B56 : 04; + 0B57 : A5; + 0B58 : 3F; + 0B59 : A4; + 0B5A : 40; + 0B5B : 85; + 0B5C : 39; + 0B5D : 84; + 0B5E : 3A; + 0B5F : 4C; + 0B60 : 08; + 0B61 : AF; + 0B62 : A5; + 0B63 : 13; + 0B64 : F0; + 0B65 : 05; + 0B66 : A2; + 0B67 : 18; + 0B68 : 4C; + 0B69 : 37; + 0B6A : A4; + 0B6B : A9; + 0B6C : 0C; + 0B6D : A0; + 0B6E : AD; + 0B6F : 20; + 0B70 : 1E; + 0B71 : AB; + 0B72 : A5; + 0B73 : 3D; + 0B74 : A4; + 0B75 : 3E; + 0B76 : 85; + 0B77 : 7A; + 0B78 : 84; + 0B79 : 7B; + 0B7A : 60; + 0B7B : 20; + 0B7C : A6; + 0B7D : B3; + 0B7E : C9; + 0B7F : 23; + 0B80 : D0; + 0B81 : 10; + 0B82 : 20; + 0B83 : 73; + 0B84 : 00; + 0B85 : 20; + 0B86 : 9E; + 0B87 : B7; + 0B88 : A9; + 0B89 : 2C; + 0B8A : 20; + 0B8B : FF; + 0B8C : AE; + 0B8D : 86; + 0B8E : 13; + 0B8F : 20; + 0B90 : 1E; + 0B91 : E1; + 0B92 : A2; + 0B93 : 01; + 0B94 : A0; + 0B95 : 02; + 0B96 : A9; + 0B97 : 00; + 0B98 : 8D; + 0B99 : 01; + 0B9A : 02; + 0B9B : A9; + 0B9C : 40; + 0B9D : 20; + 0B9E : 0F; + 0B9F : AC; + 0BA0 : A6; + 0BA1 : 13; + 0BA2 : D0; + 0BA3 : 13; + 0BA4 : 60; + 0BA5 : 20; + 0BA6 : 9E; + 0BA7 : B7; + 0BA8 : A9; + 0BA9 : 2C; + 0BAA : 20; + 0BAB : FF; + 0BAC : AE; + 0BAD : 86; + 0BAE : 13; + 0BAF : 20; + 0BB0 : 1E; + 0BB1 : E1; + 0BB2 : 20; + 0BB3 : CE; + 0BB4 : AB; + 0BB5 : A5; + 0BB6 : 13; + 0BB7 : 20; + 0BB8 : CC; + 0BB9 : FF; + 0BBA : A2; + 0BBB : 00; + 0BBC : 86; + 0BBD : 13; + 0BBE : 60; + 0BBF : C9; + 0BC0 : 22; + 0BC1 : D0; + 0BC2 : 0B; + 0BC3 : 20; + 0BC4 : BD; + 0BC5 : AE; + 0BC6 : A9; + 0BC7 : 3B; + 0BC8 : 20; + 0BC9 : FF; + 0BCA : AE; + 0BCB : 20; + 0BCC : 21; + 0BCD : AB; + 0BCE : 20; + 0BCF : A6; + 0BD0 : B3; + 0BD1 : A9; + 0BD2 : 2C; + 0BD3 : 8D; + 0BD4 : FF; + 0BD5 : 01; + 0BD6 : 20; + 0BD7 : F9; + 0BD8 : AB; + 0BD9 : A5; + 0BDA : 13; + 0BDB : F0; + 0BDC : 0D; + 0BDD : 20; + 0BDE : B7; + 0BDF : FF; + 0BE0 : 29; + 0BE1 : 02; + 0BE2 : F0; + 0BE3 : 06; + 0BE4 : 20; + 0BE5 : B5; + 0BE6 : AB; + 0BE7 : 4C; + 0BE8 : F8; + 0BE9 : A8; + 0BEA : AD; + 0BEB : 00; + 0BEC : 02; + 0BED : D0; + 0BEE : 1E; + 0BEF : A5; + 0BF0 : 13; + 0BF1 : D0; + 0BF2 : E3; + 0BF3 : 20; + 0BF4 : 06; + 0BF5 : A9; + 0BF6 : 4C; + 0BF7 : FB; + 0BF8 : A8; + 0BF9 : A5; + 0BFA : 13; + 0BFB : D0; + 0BFC : 06; + 0BFD : 20; + 0BFE : 45; + 0BFF : AB; + 0C00 : 20; + 0C01 : 3B; + 0C02 : AB; + 0C03 : 4C; + 0C04 : 60; + 0C05 : A5; + 0C06 : A6; + 0C07 : 41; + 0C08 : A4; + 0C09 : 42; + 0C0A : A9; + 0C0B : 98; + 0C0C : 2C; + 0C0D : A9; + 0C0E : 00; + 0C0F : 85; + 0C10 : 11; + 0C11 : 86; + 0C12 : 43; + 0C13 : 84; + 0C14 : 44; + 0C15 : 20; + 0C16 : 8B; + 0C17 : B0; + 0C18 : 85; + 0C19 : 49; + 0C1A : 84; + 0C1B : 4A; + 0C1C : A5; + 0C1D : 7A; + 0C1E : A4; + 0C1F : 7B; + 0C20 : 85; + 0C21 : 4B; + 0C22 : 84; + 0C23 : 4C; + 0C24 : A6; + 0C25 : 43; + 0C26 : A4; + 0C27 : 44; + 0C28 : 86; + 0C29 : 7A; + 0C2A : 84; + 0C2B : 7B; + 0C2C : 20; + 0C2D : 79; + 0C2E : 00; + 0C2F : D0; + 0C30 : 20; + 0C31 : 24; + 0C32 : 11; + 0C33 : 50; + 0C34 : 0C; + 0C35 : 20; + 0C36 : 24; + 0C37 : E1; + 0C38 : 8D; + 0C39 : 00; + 0C3A : 02; + 0C3B : A2; + 0C3C : FF; + 0C3D : A0; + 0C3E : 01; + 0C3F : D0; + 0C40 : 0C; + 0C41 : 30; + 0C42 : 75; + 0C43 : A5; + 0C44 : 13; + 0C45 : D0; + 0C46 : 03; + 0C47 : 20; + 0C48 : 45; + 0C49 : AB; + 0C4A : 20; + 0C4B : F9; + 0C4C : AB; + 0C4D : 86; + 0C4E : 7A; + 0C4F : 84; + 0C50 : 7B; + 0C51 : 20; + 0C52 : 73; + 0C53 : 00; + 0C54 : 24; + 0C55 : 0D; + 0C56 : 10; + 0C57 : 31; + 0C58 : 24; + 0C59 : 11; + 0C5A : 50; + 0C5B : 09; + 0C5C : E8; + 0C5D : 86; + 0C5E : 7A; + 0C5F : A9; + 0C60 : 00; + 0C61 : 85; + 0C62 : 07; + 0C63 : F0; + 0C64 : 0C; + 0C65 : 85; + 0C66 : 07; + 0C67 : C9; + 0C68 : 22; + 0C69 : F0; + 0C6A : 07; + 0C6B : A9; + 0C6C : 3A; + 0C6D : 85; + 0C6E : 07; + 0C6F : A9; + 0C70 : 2C; + 0C71 : 18; + 0C72 : 85; + 0C73 : 08; + 0C74 : A5; + 0C75 : 7A; + 0C76 : A4; + 0C77 : 7B; + 0C78 : 69; + 0C79 : 00; + 0C7A : 90; + 0C7B : 01; + 0C7C : C8; + 0C7D : 20; + 0C7E : 8D; + 0C7F : B4; + 0C80 : 20; + 0C81 : E2; + 0C82 : B7; + 0C83 : 20; + 0C84 : DA; + 0C85 : A9; + 0C86 : 4C; + 0C87 : 91; + 0C88 : AC; + 0C89 : 20; + 0C8A : F3; + 0C8B : BC; + 0C8C : A5; + 0C8D : 0E; + 0C8E : 20; + 0C8F : C2; + 0C90 : A9; + 0C91 : 20; + 0C92 : 79; + 0C93 : 00; + 0C94 : F0; + 0C95 : 07; + 0C96 : C9; + 0C97 : 2C; + 0C98 : F0; + 0C99 : 03; + 0C9A : 4C; + 0C9B : 4D; + 0C9C : AB; + 0C9D : A5; + 0C9E : 7A; + 0C9F : A4; + 0CA0 : 7B; + 0CA1 : 85; + 0CA2 : 43; + 0CA3 : 84; + 0CA4 : 44; + 0CA5 : A5; + 0CA6 : 4B; + 0CA7 : A4; + 0CA8 : 4C; + 0CA9 : 85; + 0CAA : 7A; + 0CAB : 84; + 0CAC : 7B; + 0CAD : 20; + 0CAE : 79; + 0CAF : 00; + 0CB0 : F0; + 0CB1 : 2D; + 0CB2 : 20; + 0CB3 : FD; + 0CB4 : AE; + 0CB5 : 4C; + 0CB6 : 15; + 0CB7 : AC; + 0CB8 : 20; + 0CB9 : 06; + 0CBA : A9; + 0CBB : C8; + 0CBC : AA; + 0CBD : D0; + 0CBE : 12; + 0CBF : A2; + 0CC0 : 0D; + 0CC1 : C8; + 0CC2 : B1; + 0CC3 : 7A; + 0CC4 : F0; + 0CC5 : 6C; + 0CC6 : C8; + 0CC7 : B1; + 0CC8 : 7A; + 0CC9 : 85; + 0CCA : 3F; + 0CCB : C8; + 0CCC : B1; + 0CCD : 7A; + 0CCE : C8; + 0CCF : 85; + 0CD0 : 40; + 0CD1 : 20; + 0CD2 : FB; + 0CD3 : A8; + 0CD4 : 20; + 0CD5 : 79; + 0CD6 : 00; + 0CD7 : AA; + 0CD8 : E0; + 0CD9 : 83; + 0CDA : D0; + 0CDB : DC; + 0CDC : 4C; + 0CDD : 51; + 0CDE : AC; + 0CDF : A5; + 0CE0 : 43; + 0CE1 : A4; + 0CE2 : 44; + 0CE3 : A6; + 0CE4 : 11; + 0CE5 : 10; + 0CE6 : 03; + 0CE7 : 4C; + 0CE8 : 27; + 0CE9 : A8; + 0CEA : A0; + 0CEB : 00; + 0CEC : B1; + 0CED : 43; + 0CEE : F0; + 0CEF : 0B; + 0CF0 : A5; + 0CF1 : 13; + 0CF2 : D0; + 0CF3 : 07; + 0CF4 : A9; + 0CF5 : FC; + 0CF6 : A0; + 0CF7 : AC; + 0CF8 : 4C; + 0CF9 : 1E; + 0CFA : AB; + 0CFB : 60; + 0CFC : 3F; + 0CFD : 45; + 0CFE : 58; + 0CFF : 54; + 0D00 : 52; + 0D01 : 41; + 0D02 : 20; + 0D03 : 49; + 0D04 : 47; + 0D05 : 4E; + 0D06 : 4F; + 0D07 : 52; + 0D08 : 45; + 0D09 : 44; + 0D0A : 0D; + 0D0B : 00; + 0D0C : 3F; + 0D0D : 52; + 0D0E : 45; + 0D0F : 44; + 0D10 : 4F; + 0D11 : 20; + 0D12 : 46; + 0D13 : 52; + 0D14 : 4F; + 0D15 : 4D; + 0D16 : 20; + 0D17 : 53; + 0D18 : 54; + 0D19 : 41; + 0D1A : 52; + 0D1B : 54; + 0D1C : 0D; + 0D1D : 00; + 0D1E : D0; + 0D1F : 04; + 0D20 : A0; + 0D21 : 00; + 0D22 : F0; + 0D23 : 03; + 0D24 : 20; + 0D25 : 8B; + 0D26 : B0; + 0D27 : 85; + 0D28 : 49; + 0D29 : 84; + 0D2A : 4A; + 0D2B : 20; + 0D2C : 8A; + 0D2D : A3; + 0D2E : F0; + 0D2F : 05; + 0D30 : A2; + 0D31 : 0A; + 0D32 : 4C; + 0D33 : 37; + 0D34 : A4; + 0D35 : 9A; + 0D36 : 8A; + 0D37 : 18; + 0D38 : 69; + 0D39 : 04; + 0D3A : 48; + 0D3B : 69; + 0D3C : 06; + 0D3D : 85; + 0D3E : 24; + 0D3F : 68; + 0D40 : A0; + 0D41 : 01; + 0D42 : 20; + 0D43 : A2; + 0D44 : BB; + 0D45 : BA; + 0D46 : BD; + 0D47 : 09; + 0D48 : 01; + 0D49 : 85; + 0D4A : 66; + 0D4B : A5; + 0D4C : 49; + 0D4D : A4; + 0D4E : 4A; + 0D4F : 20; + 0D50 : 67; + 0D51 : B8; + 0D52 : 20; + 0D53 : D0; + 0D54 : BB; + 0D55 : A0; + 0D56 : 01; + 0D57 : 20; + 0D58 : 5D; + 0D59 : BC; + 0D5A : BA; + 0D5B : 38; + 0D5C : FD; + 0D5D : 09; + 0D5E : 01; + 0D5F : F0; + 0D60 : 17; + 0D61 : BD; + 0D62 : 0F; + 0D63 : 01; + 0D64 : 85; + 0D65 : 39; + 0D66 : BD; + 0D67 : 10; + 0D68 : 01; + 0D69 : 85; + 0D6A : 3A; + 0D6B : BD; + 0D6C : 12; + 0D6D : 01; + 0D6E : 85; + 0D6F : 7A; + 0D70 : BD; + 0D71 : 11; + 0D72 : 01; + 0D73 : 85; + 0D74 : 7B; + 0D75 : 4C; + 0D76 : AE; + 0D77 : A7; + 0D78 : 8A; + 0D79 : 69; + 0D7A : 11; + 0D7B : AA; + 0D7C : 9A; + 0D7D : 20; + 0D7E : 79; + 0D7F : 00; + 0D80 : C9; + 0D81 : 2C; + 0D82 : D0; + 0D83 : F1; + 0D84 : 20; + 0D85 : 73; + 0D86 : 00; + 0D87 : 20; + 0D88 : 24; + 0D89 : AD; + 0D8A : 20; + 0D8B : 9E; + 0D8C : AD; + 0D8D : 18; + 0D8E : 24; + 0D8F : 38; + 0D90 : 24; + 0D91 : 0D; + 0D92 : 30; + 0D93 : 03; + 0D94 : B0; + 0D95 : 03; + 0D96 : 60; + 0D97 : B0; + 0D98 : FD; + 0D99 : A2; + 0D9A : 16; + 0D9B : 4C; + 0D9C : 37; + 0D9D : A4; + 0D9E : A6; + 0D9F : 7A; + 0DA0 : D0; + 0DA1 : 02; + 0DA2 : C6; + 0DA3 : 7B; + 0DA4 : C6; + 0DA5 : 7A; + 0DA6 : A2; + 0DA7 : 00; + 0DA8 : 24; + 0DA9 : 48; + 0DAA : 8A; + 0DAB : 48; + 0DAC : A9; + 0DAD : 01; + 0DAE : 20; + 0DAF : FB; + 0DB0 : A3; + 0DB1 : 20; + 0DB2 : 83; + 0DB3 : AE; + 0DB4 : A9; + 0DB5 : 00; + 0DB6 : 85; + 0DB7 : 4D; + 0DB8 : 20; + 0DB9 : 79; + 0DBA : 00; + 0DBB : 38; + 0DBC : E9; + 0DBD : B1; + 0DBE : 90; + 0DBF : 17; + 0DC0 : C9; + 0DC1 : 03; + 0DC2 : B0; + 0DC3 : 13; + 0DC4 : C9; + 0DC5 : 01; + 0DC6 : 2A; + 0DC7 : 49; + 0DC8 : 01; + 0DC9 : 45; + 0DCA : 4D; + 0DCB : C5; + 0DCC : 4D; + 0DCD : 90; + 0DCE : 61; + 0DCF : 85; + 0DD0 : 4D; + 0DD1 : 20; + 0DD2 : 73; + 0DD3 : 00; + 0DD4 : 4C; + 0DD5 : BB; + 0DD6 : AD; + 0DD7 : A6; + 0DD8 : 4D; + 0DD9 : D0; + 0DDA : 2C; + 0DDB : B0; + 0DDC : 7B; + 0DDD : 69; + 0DDE : 07; + 0DDF : 90; + 0DE0 : 77; + 0DE1 : 65; + 0DE2 : 0D; + 0DE3 : D0; + 0DE4 : 03; + 0DE5 : 4C; + 0DE6 : 3D; + 0DE7 : B6; + 0DE8 : 69; + 0DE9 : FF; + 0DEA : 85; + 0DEB : 22; + 0DEC : 0A; + 0DED : 65; + 0DEE : 22; + 0DEF : A8; + 0DF0 : 68; + 0DF1 : D9; + 0DF2 : 80; + 0DF3 : A0; + 0DF4 : B0; + 0DF5 : 67; + 0DF6 : 20; + 0DF7 : 8D; + 0DF8 : AD; + 0DF9 : 48; + [0DFA..0DFB] : 20; + 0DFC : AE; + 0DFD : 68; + 0DFE : A4; + 0DFF : 4B; + 0E00 : 10; + 0E01 : 17; + 0E02 : AA; + 0E03 : F0; + 0E04 : 56; + 0E05 : D0; + 0E06 : 5F; + 0E07 : 46; + 0E08 : 0D; + 0E09 : 8A; + 0E0A : 2A; + 0E0B : A6; + 0E0C : 7A; + 0E0D : D0; + 0E0E : 02; + 0E0F : C6; + 0E10 : 7B; + 0E11 : C6; + 0E12 : 7A; + 0E13 : A0; + 0E14 : 1B; + 0E15 : 85; + 0E16 : 4D; + 0E17 : D0; + 0E18 : D7; + 0E19 : D9; + 0E1A : 80; + 0E1B : A0; + 0E1C : B0; + 0E1D : 48; + 0E1E : 90; + 0E1F : D9; + 0E20 : B9; + 0E21 : 82; + 0E22 : A0; + 0E23 : 48; + 0E24 : B9; + 0E25 : 81; + 0E26 : A0; + 0E27 : 48; + 0E28 : 20; + 0E29 : 33; + 0E2A : AE; + 0E2B : A5; + 0E2C : 4D; + 0E2D : 4C; + 0E2E : A9; + 0E2F : AD; + 0E30 : 4C; + 0E31 : 08; + 0E32 : AF; + 0E33 : A5; + 0E34 : 66; + 0E35 : BE; + 0E36 : 80; + 0E37 : A0; + 0E38 : A8; + 0E39 : 68; + 0E3A : 85; + 0E3B : 22; + 0E3C : E6; + 0E3D : 22; + 0E3E : 68; + 0E3F : 85; + 0E40 : 23; + 0E41 : 98; + 0E42 : 48; + 0E43 : 20; + 0E44 : 1B; + 0E45 : BC; + 0E46 : A5; + 0E47 : 65; + 0E48 : 48; + 0E49 : A5; + 0E4A : 64; + 0E4B : 48; + 0E4C : A5; + 0E4D : 63; + 0E4E : 48; + 0E4F : A5; + 0E50 : 62; + 0E51 : 48; + 0E52 : A5; + 0E53 : 61; + 0E54 : 48; + 0E55 : 6C; + 0E56 : 22; + 0E57 : 00; + 0E58 : A0; + 0E59 : FF; + 0E5A : 68; + 0E5B : F0; + 0E5C : 23; + 0E5D : C9; + 0E5E : 64; + 0E5F : F0; + 0E60 : 03; + 0E61 : 20; + 0E62 : 8D; + 0E63 : AD; + 0E64 : 84; + 0E65 : 4B; + 0E66 : 68; + 0E67 : 4A; + 0E68 : 85; + 0E69 : 12; + 0E6A : 68; + 0E6B : 85; + 0E6C : 69; + 0E6D : 68; + 0E6E : 85; + 0E6F : 6A; + 0E70 : 68; + 0E71 : 85; + 0E72 : 6B; + 0E73 : 68; + 0E74 : 85; + 0E75 : 6C; + 0E76 : 68; + 0E77 : 85; + 0E78 : 6D; + 0E79 : 68; + 0E7A : 85; + 0E7B : 6E; + 0E7C : 45; + 0E7D : 66; + 0E7E : 85; + 0E7F : 6F; + 0E80 : A5; + 0E81 : 61; + 0E82 : 60; + 0E83 : 6C; + 0E84 : 0A; + 0E85 : 03; + 0E86 : A9; + 0E87 : 00; + 0E88 : 85; + 0E89 : 0D; + 0E8A : 20; + 0E8B : 73; + 0E8C : 00; + 0E8D : B0; + 0E8E : 03; + 0E8F : 4C; + 0E90 : F3; + 0E91 : BC; + 0E92 : 20; + 0E93 : 13; + 0E94 : B1; + 0E95 : 90; + 0E96 : 03; + 0E97 : 4C; + 0E98 : 28; + 0E99 : AF; + 0E9A : C9; + 0E9B : FF; + 0E9C : D0; + 0E9D : 0F; + 0E9E : A9; + 0E9F : A8; + 0EA0 : A0; + 0EA1 : AE; + 0EA2 : 20; + 0EA3 : A2; + 0EA4 : BB; + 0EA5 : 4C; + 0EA6 : 73; + 0EA7 : 00; + 0EA8 : 82; + 0EA9 : 49; + 0EAA : 0F; + 0EAB : DA; + 0EAC : A1; + 0EAD : C9; + 0EAE : 2E; + 0EAF : F0; + 0EB0 : DE; + 0EB1 : C9; + 0EB2 : AB; + 0EB3 : F0; + 0EB4 : 58; + 0EB5 : C9; + 0EB6 : AA; + 0EB7 : F0; + 0EB8 : D1; + 0EB9 : C9; + 0EBA : 22; + 0EBB : D0; + 0EBC : 0F; + 0EBD : A5; + 0EBE : 7A; + 0EBF : A4; + 0EC0 : 7B; + 0EC1 : 69; + 0EC2 : 00; + 0EC3 : 90; + 0EC4 : 01; + 0EC5 : C8; + 0EC6 : 20; + 0EC7 : 87; + 0EC8 : B4; + 0EC9 : 4C; + 0ECA : E2; + 0ECB : B7; + 0ECC : C9; + 0ECD : A8; + 0ECE : D0; + 0ECF : 13; + 0ED0 : A0; + 0ED1 : 18; + 0ED2 : D0; + 0ED3 : 3B; + 0ED4 : 20; + 0ED5 : BF; + 0ED6 : B1; + 0ED7 : A5; + 0ED8 : 65; + 0ED9 : 49; + 0EDA : FF; + 0EDB : A8; + 0EDC : A5; + 0EDD : 64; + 0EDE : 49; + 0EDF : FF; + 0EE0 : 4C; + 0EE1 : 91; + 0EE2 : B3; + 0EE3 : C9; + 0EE4 : A5; + 0EE5 : D0; + 0EE6 : 03; + 0EE7 : 4C; + 0EE8 : F4; + 0EE9 : B3; + 0EEA : C9; + 0EEB : B4; + 0EEC : 90; + 0EED : 03; + 0EEE : 4C; + 0EEF : A7; + 0EF0 : AF; + 0EF1 : 20; + 0EF2 : FA; + 0EF3 : AE; + 0EF4 : 20; + 0EF5 : 9E; + 0EF6 : AD; + 0EF7 : A9; + 0EF8 : 29; + 0EF9 : 2C; + 0EFA : A9; + 0EFB : 28; + 0EFC : 2C; + 0EFD : A9; + 0EFE : 2C; + 0EFF : A0; + 0F00 : 00; + 0F01 : D1; + 0F02 : 7A; + 0F03 : D0; + 0F04 : 03; + 0F05 : 4C; + 0F06 : 73; + 0F07 : 00; + 0F08 : A2; + 0F09 : 0B; + 0F0A : 4C; + 0F0B : 37; + 0F0C : A4; + 0F0D : A0; + 0F0E : 15; + [0F0F..0F10] : 68; + 0F11 : 4C; + 0F12 : FA; + 0F13 : AD; + 0F14 : 38; + 0F15 : A5; + 0F16 : 64; + 0F17 : E9; + 0F18 : 00; + 0F19 : A5; + 0F1A : 65; + 0F1B : E9; + 0F1C : A0; + 0F1D : 90; + 0F1E : 08; + 0F1F : A9; + 0F20 : A2; + 0F21 : E5; + 0F22 : 64; + 0F23 : A9; + 0F24 : E3; + 0F25 : E5; + 0F26 : 65; + 0F27 : 60; + 0F28 : 20; + 0F29 : 8B; + 0F2A : B0; + 0F2B : 85; + 0F2C : 64; + 0F2D : 84; + 0F2E : 65; + 0F2F : A6; + 0F30 : 45; + 0F31 : A4; + 0F32 : 46; + 0F33 : A5; + 0F34 : 0D; + 0F35 : F0; + 0F36 : 26; + 0F37 : A9; + 0F38 : 00; + 0F39 : 85; + 0F3A : 70; + 0F3B : 20; + 0F3C : 14; + 0F3D : AF; + 0F3E : 90; + 0F3F : 1C; + 0F40 : E0; + 0F41 : 54; + 0F42 : D0; + 0F43 : 18; + 0F44 : C0; + 0F45 : C9; + 0F46 : D0; + 0F47 : 14; + 0F48 : 20; + 0F49 : 84; + 0F4A : AF; + 0F4B : 84; + 0F4C : 5E; + 0F4D : 88; + 0F4E : 84; + 0F4F : 71; + 0F50 : A0; + 0F51 : 06; + 0F52 : 84; + 0F53 : 5D; + 0F54 : A0; + 0F55 : 24; + 0F56 : 20; + 0F57 : 68; + 0F58 : BE; + 0F59 : 4C; + 0F5A : 6F; + 0F5B : B4; + 0F5C : 60; + 0F5D : 24; + 0F5E : 0E; + 0F5F : 10; + 0F60 : 0D; + 0F61 : A0; + 0F62 : 00; + 0F63 : B1; + 0F64 : 64; + 0F65 : AA; + 0F66 : C8; + 0F67 : B1; + 0F68 : 64; + 0F69 : A8; + 0F6A : 8A; + 0F6B : 4C; + 0F6C : 91; + 0F6D : B3; + 0F6E : 20; + 0F6F : 14; + 0F70 : AF; + 0F71 : 90; + 0F72 : 2D; + 0F73 : E0; + 0F74 : 54; + 0F75 : D0; + 0F76 : 1B; + 0F77 : C0; + 0F78 : 49; + 0F79 : D0; + 0F7A : 25; + 0F7B : 20; + 0F7C : 84; + 0F7D : AF; + 0F7E : 98; + 0F7F : A2; + 0F80 : A0; + 0F81 : 4C; + 0F82 : 4F; + 0F83 : BC; + 0F84 : 20; + 0F85 : DE; + 0F86 : FF; + 0F87 : 86; + 0F88 : 64; + 0F89 : 84; + 0F8A : 63; + 0F8B : 85; + 0F8C : 65; + 0F8D : A0; + 0F8E : 00; + 0F8F : 84; + 0F90 : 62; + 0F91 : 60; + 0F92 : E0; + 0F93 : 53; + 0F94 : D0; + 0F95 : 0A; + 0F96 : C0; + 0F97 : 54; + 0F98 : D0; + 0F99 : 06; + 0F9A : 20; + 0F9B : B7; + 0F9C : FF; + 0F9D : 4C; + 0F9E : 3C; + 0F9F : BC; + 0FA0 : A5; + 0FA1 : 64; + 0FA2 : A4; + 0FA3 : 65; + 0FA4 : 4C; + 0FA5 : A2; + 0FA6 : BB; + 0FA7 : 0A; + 0FA8 : 48; + 0FA9 : AA; + 0FAA : 20; + 0FAB : 73; + 0FAC : 00; + 0FAD : E0; + 0FAE : 8F; + 0FAF : 90; + [0FB0..0FB1] : 20; + 0FB2 : FA; + 0FB3 : AE; + 0FB4 : 20; + 0FB5 : 9E; + 0FB6 : AD; + 0FB7 : 20; + 0FB8 : FD; + 0FB9 : AE; + 0FBA : 20; + 0FBB : 8F; + 0FBC : AD; + 0FBD : 68; + 0FBE : AA; + 0FBF : A5; + 0FC0 : 65; + 0FC1 : 48; + 0FC2 : A5; + 0FC3 : 64; + 0FC4 : 48; + 0FC5 : 8A; + 0FC6 : 48; + 0FC7 : 20; + 0FC8 : 9E; + 0FC9 : B7; + 0FCA : 68; + 0FCB : A8; + 0FCC : 8A; + 0FCD : 48; + 0FCE : 4C; + 0FCF : D6; + 0FD0 : AF; + 0FD1 : 20; + 0FD2 : F1; + 0FD3 : AE; + 0FD4 : 68; + 0FD5 : A8; + 0FD6 : B9; + 0FD7 : EA; + 0FD8 : 9F; + 0FD9 : 85; + 0FDA : 55; + 0FDB : B9; + 0FDC : EB; + 0FDD : 9F; + 0FDE : 85; + 0FDF : 56; + 0FE0 : 20; + 0FE1 : 54; + 0FE2 : 00; + 0FE3 : 4C; + 0FE4 : 8D; + 0FE5 : AD; + 0FE6 : A0; + 0FE7 : FF; + 0FE8 : 2C; + 0FE9 : A0; + 0FEA : 00; + 0FEB : 84; + 0FEC : 0B; + 0FED : 20; + 0FEE : BF; + 0FEF : B1; + 0FF0 : A5; + 0FF1 : 64; + 0FF2 : 45; + 0FF3 : 0B; + 0FF4 : 85; + 0FF5 : 07; + 0FF6 : A5; + 0FF7 : 65; + 0FF8 : 45; + 0FF9 : 0B; + 0FFA : 85; + 0FFB : 08; + 0FFC : 20; + 0FFD : FC; + 0FFE : BB; + 0FFF : 20; + 1000 : BF; + 1001 : B1; + 1002 : A5; + 1003 : 65; + 1004 : 45; + 1005 : 0B; + 1006 : 25; + 1007 : 08; + 1008 : 45; + 1009 : 0B; + 100A : A8; + 100B : A5; + 100C : 64; + 100D : 45; + 100E : 0B; + 100F : 25; + 1010 : 07; + 1011 : 45; + 1012 : 0B; + 1013 : 4C; + 1014 : 91; + 1015 : B3; + 1016 : 20; + 1017 : 90; + 1018 : AD; + 1019 : B0; + 101A : 13; + 101B : A5; + 101C : 6E; + 101D : 09; + 101E : 7F; + 101F : 25; + 1020 : 6A; + 1021 : 85; + 1022 : 6A; + 1023 : A9; + 1024 : 69; + 1025 : A0; + 1026 : 00; + 1027 : 20; + 1028 : 5B; + 1029 : BC; + 102A : AA; + 102B : 4C; + 102C : 61; + 102D : B0; + 102E : A9; + 102F : 00; + 1030 : 85; + 1031 : 0D; + 1032 : C6; + 1033 : 4D; + 1034 : 20; + 1035 : A6; + 1036 : B6; + 1037 : 85; + 1038 : 61; + 1039 : 86; + 103A : 62; + 103B : 84; + 103C : 63; + 103D : A5; + 103E : 6C; + 103F : A4; + 1040 : 6D; + 1041 : 20; + 1042 : AA; + 1043 : B6; + 1044 : 86; + 1045 : 6C; + 1046 : 84; + 1047 : 6D; + 1048 : AA; + 1049 : 38; + 104A : E5; + 104B : 61; + 104C : F0; + 104D : 08; + 104E : A9; + 104F : 01; + 1050 : 90; + 1051 : 04; + 1052 : A6; + 1053 : 61; + 1054 : A9; + 1055 : FF; + 1056 : 85; + 1057 : 66; + 1058 : A0; + 1059 : FF; + 105A : E8; + 105B : C8; + 105C : CA; + 105D : D0; + 105E : 07; + 105F : A6; + 1060 : 66; + 1061 : 30; + 1062 : 0F; + 1063 : 18; + 1064 : 90; + 1065 : 0C; + 1066 : B1; + 1067 : 6C; + 1068 : D1; + 1069 : 62; + 106A : F0; + 106B : EF; + 106C : A2; + 106D : FF; + 106E : B0; + 106F : 02; + 1070 : A2; + 1071 : 01; + 1072 : E8; + 1073 : 8A; + 1074 : 2A; + 1075 : 25; + 1076 : 12; + 1077 : F0; + 1078 : 02; + 1079 : A9; + 107A : FF; + 107B : 4C; + 107C : 3C; + 107D : BC; + 107E : 20; + 107F : FD; + 1080 : AE; + 1081 : AA; + 1082 : 20; + 1083 : 90; + 1084 : B0; + 1085 : 20; + 1086 : 79; + 1087 : 00; + 1088 : D0; + 1089 : F4; + 108A : 60; + 108B : A2; + 108C : 00; + 108D : 20; + 108E : 79; + 108F : 00; + 1090 : 86; + 1091 : 0C; + 1092 : 85; + 1093 : 45; + 1094 : 20; + 1095 : 79; + 1096 : 00; + 1097 : 20; + 1098 : 13; + 1099 : B1; + 109A : B0; + 109B : 03; + 109C : 4C; + 109D : 08; + 109E : AF; + 109F : A2; + 10A0 : 00; + 10A1 : 86; + 10A2 : 0D; + 10A3 : 86; + 10A4 : 0E; + 10A5 : 20; + 10A6 : 73; + 10A7 : 00; + 10A8 : 90; + 10A9 : 05; + 10AA : 20; + 10AB : 13; + 10AC : B1; + 10AD : 90; + 10AE : 0B; + 10AF : AA; + 10B0 : 20; + 10B1 : 73; + 10B2 : 00; + 10B3 : 90; + 10B4 : FB; + 10B5 : 20; + 10B6 : 13; + 10B7 : B1; + 10B8 : B0; + 10B9 : F6; + 10BA : C9; + 10BB : 24; + 10BC : D0; + 10BD : 06; + 10BE : A9; + 10BF : FF; + 10C0 : 85; + 10C1 : 0D; + 10C2 : D0; + 10C3 : 10; + 10C4 : C9; + 10C5 : 25; + 10C6 : D0; + 10C7 : 13; + 10C8 : A5; + 10C9 : 10; + [10CA..10CB] : D0; + 10CC : A9; + 10CD : 80; + 10CE : 85; + 10CF : 0E; + 10D0 : 05; + 10D1 : 45; + 10D2 : 85; + 10D3 : 45; + 10D4 : 8A; + 10D5 : 09; + 10D6 : 80; + 10D7 : AA; + 10D8 : 20; + 10D9 : 73; + 10DA : 00; + 10DB : 86; + 10DC : 46; + 10DD : 38; + 10DE : 05; + 10DF : 10; + 10E0 : E9; + 10E1 : 28; + 10E2 : D0; + 10E3 : 03; + 10E4 : 4C; + 10E5 : D1; + 10E6 : B1; + 10E7 : A0; + 10E8 : 00; + 10E9 : 84; + 10EA : 10; + 10EB : A5; + 10EC : 2D; + 10ED : A6; + 10EE : 2E; + 10EF : 86; + 10F0 : 60; + 10F1 : 85; + 10F2 : 5F; + 10F3 : E4; + 10F4 : 30; + 10F5 : D0; + 10F6 : 04; + 10F7 : C5; + 10F8 : 2F; + 10F9 : F0; + 10FA : 22; + 10FB : A5; + 10FC : 45; + 10FD : D1; + 10FE : 5F; + 10FF : D0; + 1100 : 08; + 1101 : A5; + 1102 : 46; + 1103 : C8; + 1104 : D1; + 1105 : 5F; + 1106 : F0; + 1107 : 7D; + 1108 : 88; + 1109 : 18; + 110A : A5; + 110B : 5F; + 110C : 69; + 110D : 07; + 110E : 90; + 110F : E1; + 1110 : E8; + 1111 : D0; + 1112 : DC; + 1113 : C9; + 1114 : 41; + 1115 : 90; + 1116 : 05; + 1117 : E9; + 1118 : 5B; + 1119 : 38; + 111A : E9; + 111B : A5; + 111C : 60; + 111D : 68; + 111E : 48; + 111F : C9; + 1120 : 2A; + 1121 : D0; + 1122 : 05; + 1123 : A9; + 1124 : 13; + 1125 : A0; + 1126 : BF; + 1127 : 60; + 1128 : A5; + 1129 : 45; + 112A : A4; + 112B : 46; + 112C : C9; + 112D : 54; + 112E : D0; + 112F : 0B; + 1130 : C0; + 1131 : C9; + 1132 : F0; + 1133 : EF; + 1134 : C0; + 1135 : 49; + 1136 : D0; + 1137 : 03; + 1138 : 4C; + 1139 : 08; + 113A : AF; + 113B : C9; + 113C : 53; + 113D : D0; + 113E : 04; + 113F : C0; + 1140 : 54; + 1141 : F0; + 1142 : F5; + 1143 : A5; + 1144 : 2F; + 1145 : A4; + 1146 : 30; + 1147 : 85; + 1148 : 5F; + 1149 : 84; + 114A : 60; + 114B : A5; + 114C : 31; + 114D : A4; + 114E : 32; + 114F : 85; + 1150 : 5A; + 1151 : 84; + 1152 : 5B; + 1153 : 18; + 1154 : 69; + 1155 : 07; + 1156 : 90; + 1157 : 01; + 1158 : C8; + 1159 : 85; + 115A : 58; + 115B : 84; + 115C : 59; + 115D : 20; + 115E : B8; + 115F : A3; + 1160 : A5; + 1161 : 58; + 1162 : A4; + 1163 : 59; + 1164 : C8; + 1165 : 85; + 1166 : 2F; + 1167 : 84; + 1168 : 30; + 1169 : A0; + 116A : 00; + 116B : A5; + 116C : 45; + 116D : 91; + 116E : 5F; + 116F : C8; + 1170 : A5; + 1171 : 46; + 1172 : 91; + 1173 : 5F; + 1174 : A9; + 1175 : 00; + 1176 : C8; + 1177 : 91; + 1178 : 5F; + 1179 : C8; + 117A : 91; + 117B : 5F; + 117C : C8; + 117D : 91; + 117E : 5F; + 117F : C8; + 1180 : 91; + 1181 : 5F; + 1182 : C8; + 1183 : 91; + 1184 : 5F; + 1185 : A5; + 1186 : 5F; + 1187 : 18; + 1188 : 69; + 1189 : 02; + 118A : A4; + 118B : 60; + 118C : 90; + 118D : 01; + 118E : C8; + 118F : 85; + 1190 : 47; + 1191 : 84; + 1192 : 48; + 1193 : 60; + 1194 : A5; + 1195 : 0B; + 1196 : 0A; + 1197 : 69; + 1198 : 05; + 1199 : 65; + 119A : 5F; + 119B : A4; + 119C : 60; + 119D : 90; + 119E : 01; + 119F : C8; + 11A0 : 85; + 11A1 : 58; + 11A2 : 84; + 11A3 : 59; + 11A4 : 60; + 11A5 : 90; + 11A6 : 80; + [11A7..11A9] : 00; + 11AA : 20; + 11AB : BF; + 11AC : B1; + 11AD : A5; + 11AE : 64; + 11AF : A4; + 11B0 : 65; + 11B1 : 60; + 11B2 : 20; + 11B3 : 73; + 11B4 : 00; + 11B5 : 20; + 11B6 : 9E; + 11B7 : AD; + 11B8 : 20; + 11B9 : 8D; + 11BA : AD; + 11BB : A5; + 11BC : 66; + 11BD : 30; + 11BE : 0D; + 11BF : A5; + 11C0 : 61; + 11C1 : C9; + [11C2..11C3] : 90; + 11C4 : 09; + 11C5 : A9; + 11C6 : A5; + 11C7 : A0; + 11C8 : B1; + 11C9 : 20; + 11CA : 5B; + 11CB : BC; + 11CC : D0; + 11CD : 7A; + 11CE : 4C; + 11CF : 9B; + 11D0 : BC; + 11D1 : A5; + 11D2 : 0C; + 11D3 : 05; + 11D4 : 0E; + 11D5 : 48; + 11D6 : A5; + 11D7 : 0D; + 11D8 : 48; + 11D9 : A0; + 11DA : 00; + 11DB : 98; + 11DC : 48; + 11DD : A5; + 11DE : 46; + 11DF : 48; + 11E0 : A5; + 11E1 : 45; + 11E2 : 48; + 11E3 : 20; + 11E4 : B2; + 11E5 : B1; + 11E6 : 68; + 11E7 : 85; + 11E8 : 45; + 11E9 : 68; + 11EA : 85; + 11EB : 46; + 11EC : 68; + 11ED : A8; + 11EE : BA; + 11EF : BD; + 11F0 : 02; + 11F1 : 01; + 11F2 : 48; + 11F3 : BD; + [11F4..11F5] : 01; + 11F6 : 48; + 11F7 : A5; + 11F8 : 64; + 11F9 : 9D; + 11FA : 02; + 11FB : 01; + 11FC : A5; + 11FD : 65; + 11FE : 9D; + [11FF..1200] : 01; + 1201 : C8; + 1202 : 20; + 1203 : 79; + 1204 : 00; + 1205 : C9; + 1206 : 2C; + 1207 : F0; + 1208 : D2; + 1209 : 84; + 120A : 0B; + 120B : 20; + 120C : F7; + 120D : AE; + 120E : 68; + 120F : 85; + 1210 : 0D; + 1211 : 68; + 1212 : 85; + 1213 : 0E; + 1214 : 29; + 1215 : 7F; + 1216 : 85; + 1217 : 0C; + 1218 : A6; + 1219 : 2F; + 121A : A5; + 121B : 30; + 121C : 86; + 121D : 5F; + 121E : 85; + 121F : 60; + 1220 : C5; + 1221 : 32; + 1222 : D0; + 1223 : 04; + 1224 : E4; + 1225 : 31; + 1226 : F0; + 1227 : 39; + 1228 : A0; + 1229 : 00; + 122A : B1; + 122B : 5F; + 122C : C8; + 122D : C5; + 122E : 45; + 122F : D0; + 1230 : 06; + 1231 : A5; + 1232 : 46; + 1233 : D1; + 1234 : 5F; + 1235 : F0; + 1236 : 16; + 1237 : C8; + 1238 : B1; + 1239 : 5F; + 123A : 18; + 123B : 65; + 123C : 5F; + 123D : AA; + 123E : C8; + 123F : B1; + 1240 : 5F; + 1241 : 65; + 1242 : 60; + 1243 : 90; + 1244 : D7; + 1245 : A2; + 1246 : 12; + 1247 : 2C; + 1248 : A2; + 1249 : 0E; + 124A : 4C; + 124B : 37; + 124C : A4; + 124D : A2; + 124E : 13; + 124F : A5; + 1250 : 0C; + 1251 : D0; + 1252 : F7; + 1253 : 20; + 1254 : 94; + 1255 : B1; + 1256 : A5; + 1257 : 0B; + 1258 : A0; + 1259 : 04; + 125A : D1; + 125B : 5F; + 125C : D0; + 125D : E7; + 125E : 4C; + 125F : EA; + 1260 : B2; + 1261 : 20; + 1262 : 94; + 1263 : B1; + 1264 : 20; + 1265 : 08; + 1266 : A4; + 1267 : A0; + 1268 : 00; + 1269 : 84; + 126A : 72; + 126B : A2; + 126C : 05; + 126D : A5; + 126E : 45; + 126F : 91; + 1270 : 5F; + 1271 : 10; + 1272 : 01; + 1273 : CA; + 1274 : C8; + 1275 : A5; + 1276 : 46; + 1277 : 91; + 1278 : 5F; + 1279 : 10; + 127A : 02; + [127B..127C] : CA; + 127D : 86; + 127E : 71; + 127F : A5; + 1280 : 0B; + [1281..1283] : C8; + 1284 : 91; + 1285 : 5F; + 1286 : A2; + 1287 : 0B; + 1288 : A9; + 1289 : 00; + 128A : 24; + 128B : 0C; + 128C : 50; + 128D : 08; + 128E : 68; + 128F : 18; + 1290 : 69; + 1291 : 01; + 1292 : AA; + 1293 : 68; + 1294 : 69; + 1295 : 00; + 1296 : C8; + 1297 : 91; + 1298 : 5F; + 1299 : C8; + 129A : 8A; + 129B : 91; + 129C : 5F; + 129D : 20; + 129E : 4C; + 129F : B3; + 12A0 : 86; + 12A1 : 71; + 12A2 : 85; + 12A3 : 72; + 12A4 : A4; + 12A5 : 22; + 12A6 : C6; + 12A7 : 0B; + 12A8 : D0; + 12A9 : DC; + 12AA : 65; + 12AB : 59; + 12AC : B0; + 12AD : 5D; + 12AE : 85; + 12AF : 59; + 12B0 : A8; + 12B1 : 8A; + 12B2 : 65; + 12B3 : 58; + 12B4 : 90; + 12B5 : 03; + 12B6 : C8; + 12B7 : F0; + 12B8 : 52; + 12B9 : 20; + 12BA : 08; + 12BB : A4; + 12BC : 85; + 12BD : 31; + 12BE : 84; + 12BF : 32; + 12C0 : A9; + 12C1 : 00; + 12C2 : E6; + 12C3 : 72; + 12C4 : A4; + 12C5 : 71; + 12C6 : F0; + 12C7 : 05; + 12C8 : 88; + 12C9 : 91; + 12CA : 58; + 12CB : D0; + 12CC : FB; + 12CD : C6; + 12CE : 59; + 12CF : C6; + 12D0 : 72; + 12D1 : D0; + 12D2 : F5; + 12D3 : E6; + 12D4 : 59; + 12D5 : 38; + 12D6 : A5; + 12D7 : 31; + 12D8 : E5; + 12D9 : 5F; + 12DA : A0; + 12DB : 02; + 12DC : 91; + 12DD : 5F; + 12DE : A5; + 12DF : 32; + 12E0 : C8; + 12E1 : E5; + 12E2 : 60; + 12E3 : 91; + 12E4 : 5F; + 12E5 : A5; + 12E6 : 0C; + 12E7 : D0; + 12E8 : 62; + 12E9 : C8; + 12EA : B1; + 12EB : 5F; + 12EC : 85; + 12ED : 0B; + 12EE : A9; + 12EF : 00; + 12F0 : 85; + 12F1 : 71; + 12F2 : 85; + 12F3 : 72; + 12F4 : C8; + 12F5 : 68; + 12F6 : AA; + 12F7 : 85; + 12F8 : 64; + 12F9 : 68; + 12FA : 85; + 12FB : 65; + 12FC : D1; + 12FD : 5F; + 12FE : 90; + 12FF : 0E; + 1300 : D0; + 1301 : 06; + 1302 : C8; + 1303 : 8A; + 1304 : D1; + 1305 : 5F; + 1306 : 90; + 1307 : 07; + 1308 : 4C; + 1309 : 45; + 130A : B2; + 130B : 4C; + 130C : 35; + 130D : A4; + 130E : C8; + 130F : A5; + 1310 : 72; + 1311 : 05; + 1312 : 71; + 1313 : 18; + 1314 : F0; + 1315 : 0A; + 1316 : 20; + 1317 : 4C; + 1318 : B3; + 1319 : 8A; + 131A : 65; + 131B : 64; + 131C : AA; + 131D : 98; + 131E : A4; + 131F : 22; + [1320..1321] : 65; + 1322 : 86; + 1323 : 71; + 1324 : C6; + 1325 : 0B; + 1326 : D0; + 1327 : CA; + 1328 : 85; + 1329 : 72; + 132A : A2; + 132B : 05; + 132C : A5; + 132D : 45; + 132E : 10; + 132F : 01; + 1330 : CA; + 1331 : A5; + 1332 : 46; + 1333 : 10; + 1334 : 02; + [1335..1336] : CA; + 1337 : 86; + 1338 : 28; + 1339 : A9; + 133A : 00; + 133B : 20; + 133C : 55; + 133D : B3; + 133E : 8A; + 133F : 65; + 1340 : 58; + 1341 : 85; + 1342 : 47; + 1343 : 98; + 1344 : 65; + 1345 : 59; + 1346 : 85; + 1347 : 48; + 1348 : A8; + 1349 : A5; + 134A : 47; + 134B : 60; + 134C : 84; + 134D : 22; + 134E : B1; + 134F : 5F; + 1350 : 85; + 1351 : 28; + 1352 : 88; + 1353 : B1; + 1354 : 5F; + 1355 : 85; + 1356 : 29; + 1357 : A9; + 1358 : 10; + 1359 : 85; + 135A : 5D; + 135B : A2; + 135C : 00; + 135D : A0; + 135E : 00; + 135F : 8A; + 1360 : 0A; + 1361 : AA; + 1362 : 98; + 1363 : 2A; + 1364 : A8; + 1365 : B0; + 1366 : A4; + 1367 : 06; + 1368 : 71; + 1369 : 26; + 136A : 72; + 136B : 90; + 136C : 0B; + 136D : 18; + 136E : 8A; + 136F : 65; + 1370 : 28; + 1371 : AA; + 1372 : 98; + 1373 : 65; + 1374 : 29; + 1375 : A8; + 1376 : B0; + 1377 : 93; + 1378 : C6; + 1379 : 5D; + 137A : D0; + 137B : E3; + 137C : 60; + 137D : A5; + 137E : 0D; + 137F : F0; + 1380 : 03; + 1381 : 20; + 1382 : A6; + 1383 : B6; + 1384 : 20; + 1385 : 26; + 1386 : B5; + 1387 : 38; + 1388 : A5; + 1389 : 33; + 138A : E5; + 138B : 31; + 138C : A8; + 138D : A5; + 138E : 34; + 138F : E5; + 1390 : 32; + 1391 : A2; + 1392 : 00; + 1393 : 86; + 1394 : 0D; + 1395 : 85; + 1396 : 62; + 1397 : 84; + 1398 : 63; + 1399 : A2; + 139A : 90; + 139B : 4C; + 139C : 44; + 139D : BC; + 139E : 38; + 139F : 20; + 13A0 : F0; + 13A1 : FF; + 13A2 : A9; + 13A3 : 00; + 13A4 : F0; + 13A5 : EB; + 13A6 : A6; + 13A7 : 3A; + 13A8 : E8; + 13A9 : D0; + 13AA : A0; + 13AB : A2; + 13AC : 15; + 13AD : 2C; + 13AE : A2; + 13AF : 1B; + 13B0 : 4C; + 13B1 : 37; + 13B2 : A4; + 13B3 : 20; + 13B4 : E1; + 13B5 : B3; + 13B6 : 20; + 13B7 : A6; + 13B8 : B3; + 13B9 : 20; + 13BA : FA; + 13BB : AE; + 13BC : A9; + 13BD : 80; + 13BE : 85; + 13BF : 10; + 13C0 : 20; + 13C1 : 8B; + 13C2 : B0; + 13C3 : 20; + 13C4 : 8D; + 13C5 : AD; + 13C6 : 20; + 13C7 : F7; + 13C8 : AE; + 13C9 : A9; + 13CA : B2; + 13CB : 20; + 13CC : FF; + 13CD : AE; + 13CE : 48; + 13CF : A5; + [13D0..13D1] : 48; + 13D2 : A5; + 13D3 : 47; + 13D4 : 48; + 13D5 : A5; + 13D6 : 7B; + 13D7 : 48; + 13D8 : A5; + 13D9 : 7A; + 13DA : 48; + 13DB : 20; + 13DC : F8; + 13DD : A8; + 13DE : 4C; + 13DF : 4F; + 13E0 : B4; + 13E1 : A9; + 13E2 : A5; + 13E3 : 20; + 13E4 : FF; + 13E5 : AE; + 13E6 : 09; + 13E7 : 80; + 13E8 : 85; + 13E9 : 10; + 13EA : 20; + 13EB : 92; + 13EC : B0; + 13ED : 85; + 13EE : 4E; + 13EF : 84; + 13F0 : 4F; + 13F1 : 4C; + 13F2 : 8D; + 13F3 : AD; + 13F4 : 20; + 13F5 : E1; + 13F6 : B3; + 13F7 : A5; + 13F8 : 4F; + 13F9 : 48; + 13FA : A5; + 13FB : 4E; + 13FC : 48; + 13FD : 20; + 13FE : F1; + 13FF : AE; + 1400 : 20; + 1401 : 8D; + 1402 : AD; + 1403 : 68; + 1404 : 85; + 1405 : 4E; + 1406 : 68; + 1407 : 85; + 1408 : 4F; + 1409 : A0; + 140A : 02; + 140B : B1; + 140C : 4E; + 140D : 85; + 140E : 47; + 140F : AA; + 1410 : C8; + 1411 : B1; + 1412 : 4E; + 1413 : F0; + 1414 : 99; + 1415 : 85; + 1416 : 48; + 1417 : C8; + 1418 : B1; + 1419 : 47; + 141A : 48; + 141B : 88; + 141C : 10; + 141D : FA; + 141E : A4; + 141F : 48; + 1420 : 20; + 1421 : D4; + 1422 : BB; + 1423 : A5; + 1424 : 7B; + 1425 : 48; + 1426 : A5; + 1427 : 7A; + 1428 : 48; + 1429 : B1; + 142A : 4E; + 142B : 85; + 142C : 7A; + 142D : C8; + 142E : B1; + 142F : 4E; + 1430 : 85; + 1431 : 7B; + 1432 : A5; + [1433..1434] : 48; + 1435 : A5; + 1436 : 47; + 1437 : 48; + 1438 : 20; + 1439 : 8A; + 143A : AD; + 143B : 68; + 143C : 85; + 143D : 4E; + 143E : 68; + 143F : 85; + 1440 : 4F; + 1441 : 20; + 1442 : 79; + 1443 : 00; + 1444 : F0; + 1445 : 03; + 1446 : 4C; + 1447 : 08; + 1448 : AF; + 1449 : 68; + 144A : 85; + 144B : 7A; + 144C : 68; + 144D : 85; + 144E : 7B; + 144F : A0; + 1450 : 00; + 1451 : 68; + 1452 : 91; + 1453 : 4E; + 1454 : 68; + 1455 : C8; + 1456 : 91; + 1457 : 4E; + 1458 : 68; + 1459 : C8; + 145A : 91; + 145B : 4E; + 145C : 68; + 145D : C8; + 145E : 91; + 145F : 4E; + 1460 : 68; + 1461 : C8; + 1462 : 91; + 1463 : 4E; + 1464 : 60; + 1465 : 20; + 1466 : 8D; + 1467 : AD; + 1468 : A0; + 1469 : 00; + 146A : 20; + 146B : DF; + 146C : BD; + [146D..146E] : 68; + 146F : A9; + 1470 : FF; + 1471 : A0; + 1472 : 00; + 1473 : F0; + 1474 : 12; + 1475 : A6; + 1476 : 64; + 1477 : A4; + 1478 : 65; + 1479 : 86; + 147A : 50; + 147B : 84; + 147C : 51; + 147D : 20; + 147E : F4; + 147F : B4; + 1480 : 86; + 1481 : 62; + 1482 : 84; + 1483 : 63; + 1484 : 85; + 1485 : 61; + 1486 : 60; + 1487 : A2; + 1488 : 22; + 1489 : 86; + 148A : 07; + 148B : 86; + 148C : 08; + 148D : 85; + 148E : 6F; + 148F : 84; + 1490 : 70; + 1491 : 85; + 1492 : 62; + 1493 : 84; + 1494 : 63; + 1495 : A0; + 1496 : FF; + 1497 : C8; + 1498 : B1; + 1499 : 6F; + 149A : F0; + 149B : 0C; + 149C : C5; + 149D : 07; + 149E : F0; + 149F : 04; + 14A0 : C5; + 14A1 : 08; + 14A2 : D0; + 14A3 : F3; + 14A4 : C9; + 14A5 : 22; + 14A6 : F0; + 14A7 : 01; + 14A8 : 18; + 14A9 : 84; + 14AA : 61; + 14AB : 98; + 14AC : 65; + 14AD : 6F; + 14AE : 85; + 14AF : 71; + 14B0 : A6; + 14B1 : 70; + 14B2 : 90; + 14B3 : 01; + 14B4 : E8; + 14B5 : 86; + 14B6 : 72; + 14B7 : A5; + 14B8 : 70; + 14B9 : F0; + 14BA : 04; + 14BB : C9; + 14BC : 02; + 14BD : D0; + 14BE : 0B; + 14BF : 98; + 14C0 : 20; + 14C1 : 75; + 14C2 : B4; + 14C3 : A6; + 14C4 : 6F; + 14C5 : A4; + 14C6 : 70; + 14C7 : 20; + 14C8 : 88; + 14C9 : B6; + 14CA : A6; + 14CB : 16; + 14CC : E0; + 14CD : 22; + 14CE : D0; + 14CF : 05; + 14D0 : A2; + 14D1 : 19; + 14D2 : 4C; + 14D3 : 37; + 14D4 : A4; + 14D5 : A5; + 14D6 : 61; + 14D7 : 95; + 14D8 : 00; + 14D9 : A5; + 14DA : 62; + 14DB : 95; + 14DC : 01; + 14DD : A5; + 14DE : 63; + 14DF : 95; + 14E0 : 02; + 14E1 : A0; + 14E2 : 00; + 14E3 : 86; + 14E4 : 64; + 14E5 : 84; + 14E6 : 65; + 14E7 : 84; + 14E8 : 70; + 14E9 : 88; + 14EA : 84; + 14EB : 0D; + 14EC : 86; + 14ED : 17; + [14EE..14F0] : E8; + 14F1 : 86; + 14F2 : 16; + 14F3 : 60; + 14F4 : 46; + 14F5 : 0F; + 14F6 : 48; + 14F7 : 49; + 14F8 : FF; + 14F9 : 38; + 14FA : 65; + 14FB : 33; + 14FC : A4; + 14FD : 34; + 14FE : B0; + 14FF : 01; + 1500 : 88; + 1501 : C4; + 1502 : 32; + 1503 : 90; + 1504 : 11; + 1505 : D0; + 1506 : 04; + 1507 : C5; + 1508 : 31; + 1509 : 90; + 150A : 0B; + 150B : 85; + 150C : 33; + 150D : 84; + 150E : 34; + 150F : 85; + 1510 : 35; + 1511 : 84; + 1512 : 36; + 1513 : AA; + 1514 : 68; + 1515 : 60; + 1516 : A2; + 1517 : 10; + 1518 : A5; + 1519 : 0F; + 151A : 30; + 151B : B6; + 151C : 20; + 151D : 26; + 151E : B5; + 151F : A9; + 1520 : 80; + 1521 : 85; + 1522 : 0F; + 1523 : 68; + [1524..1525] : D0; + 1526 : A6; + 1527 : 37; + 1528 : A5; + 1529 : 38; + 152A : 86; + 152B : 33; + 152C : 85; + 152D : 34; + 152E : A0; + 152F : 00; + 1530 : 84; + 1531 : 4F; + 1532 : 84; + 1533 : 4E; + 1534 : A5; + 1535 : 31; + 1536 : A6; + 1537 : 32; + 1538 : 85; + 1539 : 5F; + 153A : 86; + 153B : 60; + 153C : A9; + 153D : 19; + 153E : A2; + 153F : 00; + 1540 : 85; + 1541 : 22; + 1542 : 86; + 1543 : 23; + 1544 : C5; + 1545 : 16; + 1546 : F0; + 1547 : 05; + 1548 : 20; + 1549 : C7; + 154A : B5; + 154B : F0; + 154C : F7; + 154D : A9; + 154E : 07; + 154F : 85; + 1550 : 53; + 1551 : A5; + 1552 : 2D; + 1553 : A6; + 1554 : 2E; + 1555 : 85; + 1556 : 22; + 1557 : 86; + 1558 : 23; + 1559 : E4; + 155A : 30; + 155B : D0; + 155C : 04; + 155D : C5; + 155E : 2F; + 155F : F0; + 1560 : 05; + 1561 : 20; + 1562 : BD; + 1563 : B5; + 1564 : F0; + 1565 : F3; + 1566 : 85; + 1567 : 58; + 1568 : 86; + 1569 : 59; + 156A : A9; + 156B : 03; + 156C : 85; + 156D : 53; + 156E : A5; + 156F : 58; + 1570 : A6; + 1571 : 59; + 1572 : E4; + 1573 : 32; + 1574 : D0; + 1575 : 07; + 1576 : C5; + 1577 : 31; + 1578 : D0; + 1579 : 03; + 157A : 4C; + 157B : 06; + 157C : B6; + 157D : 85; + 157E : 22; + 157F : 86; + 1580 : 23; + 1581 : A0; + 1582 : 00; + 1583 : B1; + 1584 : 22; + 1585 : AA; + 1586 : C8; + 1587 : B1; + 1588 : 22; + 1589 : 08; + 158A : C8; + 158B : B1; + 158C : 22; + 158D : 65; + 158E : 58; + 158F : 85; + 1590 : 58; + 1591 : C8; + 1592 : B1; + 1593 : 22; + 1594 : 65; + 1595 : 59; + 1596 : 85; + 1597 : 59; + 1598 : 28; + 1599 : 10; + 159A : D3; + 159B : 8A; + 159C : 30; + 159D : D0; + 159E : C8; + 159F : B1; + 15A0 : 22; + 15A1 : A0; + 15A2 : 00; + 15A3 : 0A; + 15A4 : 69; + 15A5 : 05; + 15A6 : 65; + 15A7 : 22; + 15A8 : 85; + 15A9 : 22; + 15AA : 90; + 15AB : 02; + 15AC : E6; + 15AD : 23; + 15AE : A6; + 15AF : 23; + 15B0 : E4; + 15B1 : 59; + 15B2 : D0; + 15B3 : 04; + 15B4 : C5; + 15B5 : 58; + 15B6 : F0; + 15B7 : BA; + 15B8 : 20; + 15B9 : C7; + 15BA : B5; + 15BB : F0; + 15BC : F3; + 15BD : B1; + 15BE : 22; + 15BF : 30; + 15C0 : 35; + 15C1 : C8; + 15C2 : B1; + 15C3 : 22; + 15C4 : 10; + 15C5 : 30; + 15C6 : C8; + 15C7 : B1; + 15C8 : 22; + 15C9 : F0; + 15CA : 2B; + 15CB : C8; + 15CC : B1; + 15CD : 22; + 15CE : AA; + 15CF : C8; + 15D0 : B1; + 15D1 : 22; + 15D2 : C5; + 15D3 : 34; + 15D4 : 90; + 15D5 : 06; + 15D6 : D0; + 15D7 : 1E; + 15D8 : E4; + 15D9 : 33; + 15DA : B0; + 15DB : 1A; + 15DC : C5; + 15DD : 60; + 15DE : 90; + 15DF : 16; + 15E0 : D0; + 15E1 : 04; + 15E2 : E4; + 15E3 : 5F; + 15E4 : 90; + 15E5 : 10; + 15E6 : 86; + 15E7 : 5F; + 15E8 : 85; + 15E9 : 60; + 15EA : A5; + 15EB : 22; + 15EC : A6; + 15ED : 23; + 15EE : 85; + 15EF : 4E; + 15F0 : 86; + 15F1 : 4F; + 15F2 : A5; + 15F3 : 53; + 15F4 : 85; + 15F5 : 55; + 15F6 : A5; + 15F7 : 53; + 15F8 : 18; + 15F9 : 65; + 15FA : 22; + 15FB : 85; + 15FC : 22; + 15FD : 90; + 15FE : 02; + 15FF : E6; + 1600 : 23; + 1601 : A6; + 1602 : 23; + 1603 : A0; + 1604 : 00; + 1605 : 60; + 1606 : A5; + 1607 : 4F; + 1608 : 05; + 1609 : 4E; + 160A : F0; + 160B : F5; + 160C : A5; + 160D : 55; + 160E : 29; + 160F : 04; + 1610 : 4A; + 1611 : A8; + 1612 : 85; + 1613 : 55; + 1614 : B1; + 1615 : 4E; + 1616 : 65; + 1617 : 5F; + 1618 : 85; + 1619 : 5A; + 161A : A5; + 161B : 60; + 161C : 69; + 161D : 00; + 161E : 85; + 161F : 5B; + 1620 : A5; + 1621 : 33; + 1622 : A6; + 1623 : 34; + 1624 : 85; + 1625 : 58; + 1626 : 86; + 1627 : 59; + 1628 : 20; + 1629 : BF; + 162A : A3; + 162B : A4; + 162C : 55; + 162D : C8; + 162E : A5; + 162F : 58; + 1630 : 91; + 1631 : 4E; + 1632 : AA; + 1633 : E6; + 1634 : 59; + 1635 : A5; + 1636 : 59; + 1637 : C8; + 1638 : 91; + 1639 : 4E; + 163A : 4C; + 163B : 2A; + 163C : B5; + 163D : A5; + 163E : 65; + 163F : 48; + 1640 : A5; + 1641 : 64; + 1642 : 48; + 1643 : 20; + 1644 : 83; + 1645 : AE; + 1646 : 20; + 1647 : 8F; + 1648 : AD; + 1649 : 68; + 164A : 85; + 164B : 6F; + 164C : 68; + 164D : 85; + 164E : 70; + 164F : A0; + 1650 : 00; + 1651 : B1; + 1652 : 6F; + 1653 : 18; + 1654 : 71; + 1655 : 64; + 1656 : 90; + 1657 : 05; + 1658 : A2; + 1659 : 17; + 165A : 4C; + 165B : 37; + 165C : A4; + 165D : 20; + 165E : 75; + 165F : B4; + 1660 : 20; + 1661 : 7A; + 1662 : B6; + 1663 : A5; + 1664 : 50; + 1665 : A4; + 1666 : 51; + 1667 : 20; + 1668 : AA; + 1669 : B6; + 166A : 20; + 166B : 8C; + 166C : B6; + 166D : A5; + 166E : 6F; + 166F : A4; + 1670 : 70; + 1671 : 20; + 1672 : AA; + 1673 : B6; + 1674 : 20; + 1675 : CA; + 1676 : B4; + 1677 : 4C; + 1678 : B8; + 1679 : AD; + 167A : A0; + 167B : 00; + 167C : B1; + 167D : 6F; + 167E : 48; + 167F : C8; + 1680 : B1; + 1681 : 6F; + 1682 : AA; + 1683 : C8; + 1684 : B1; + 1685 : 6F; + 1686 : A8; + 1687 : 68; + 1688 : 86; + 1689 : 22; + 168A : 84; + 168B : 23; + 168C : A8; + 168D : F0; + 168E : 0A; + 168F : 48; + 1690 : 88; + 1691 : B1; + 1692 : 22; + 1693 : 91; + 1694 : 35; + 1695 : 98; + 1696 : D0; + 1697 : F8; + 1698 : 68; + 1699 : 18; + 169A : 65; + 169B : 35; + 169C : 85; + 169D : 35; + 169E : 90; + 169F : 02; + 16A0 : E6; + 16A1 : 36; + 16A2 : 60; + 16A3 : 20; + 16A4 : 8F; + 16A5 : AD; + 16A6 : A5; + 16A7 : 64; + 16A8 : A4; + 16A9 : 65; + 16AA : 85; + 16AB : 22; + 16AC : 84; + 16AD : 23; + 16AE : 20; + 16AF : DB; + 16B0 : B6; + 16B1 : 08; + 16B2 : A0; + 16B3 : 00; + 16B4 : B1; + 16B5 : 22; + 16B6 : 48; + 16B7 : C8; + 16B8 : B1; + 16B9 : 22; + 16BA : AA; + 16BB : C8; + 16BC : B1; + 16BD : 22; + 16BE : A8; + 16BF : 68; + 16C0 : 28; + 16C1 : D0; + 16C2 : 13; + 16C3 : C4; + 16C4 : 34; + 16C5 : D0; + 16C6 : 0F; + 16C7 : E4; + 16C8 : 33; + 16C9 : D0; + 16CA : 0B; + 16CB : 48; + 16CC : 18; + 16CD : 65; + 16CE : 33; + 16CF : 85; + 16D0 : 33; + 16D1 : 90; + 16D2 : 02; + 16D3 : E6; + 16D4 : 34; + 16D5 : 68; + 16D6 : 86; + 16D7 : 22; + 16D8 : 84; + 16D9 : 23; + 16DA : 60; + 16DB : C4; + 16DC : 18; + 16DD : D0; + 16DE : 0C; + 16DF : C5; + 16E0 : 17; + 16E1 : D0; + 16E2 : 08; + 16E3 : 85; + 16E4 : 16; + 16E5 : E9; + 16E6 : 03; + 16E7 : 85; + 16E8 : 17; + 16E9 : A0; + 16EA : 00; + 16EB : 60; + 16EC : 20; + 16ED : A1; + 16EE : B7; + 16EF : 8A; + 16F0 : 48; + 16F1 : A9; + 16F2 : 01; + 16F3 : 20; + 16F4 : 7D; + 16F5 : B4; + 16F6 : 68; + 16F7 : A0; + 16F8 : 00; + 16F9 : 91; + 16FA : 62; + [16FB..16FC] : 68; + 16FD : 4C; + 16FE : CA; + 16FF : B4; + 1700 : 20; + 1701 : 61; + 1702 : B7; + 1703 : D1; + 1704 : 50; + 1705 : 98; + 1706 : 90; + 1707 : 04; + 1708 : B1; + 1709 : 50; + 170A : AA; + 170B : 98; + 170C : 48; + 170D : 8A; + 170E : 48; + 170F : 20; + 1710 : 7D; + 1711 : B4; + 1712 : A5; + 1713 : 50; + 1714 : A4; + 1715 : 51; + 1716 : 20; + 1717 : AA; + 1718 : B6; + 1719 : 68; + 171A : A8; + 171B : 68; + 171C : 18; + 171D : 65; + 171E : 22; + 171F : 85; + 1720 : 22; + 1721 : 90; + 1722 : 02; + 1723 : E6; + 1724 : 23; + 1725 : 98; + 1726 : 20; + 1727 : 8C; + 1728 : B6; + 1729 : 4C; + 172A : CA; + 172B : B4; + 172C : 20; + 172D : 61; + 172E : B7; + 172F : 18; + 1730 : F1; + 1731 : 50; + 1732 : 49; + 1733 : FF; + 1734 : 4C; + 1735 : 06; + 1736 : B7; + 1737 : A9; + 1738 : FF; + 1739 : 85; + 173A : 65; + 173B : 20; + 173C : 79; + 173D : 00; + 173E : C9; + 173F : 29; + 1740 : F0; + 1741 : 06; + 1742 : 20; + 1743 : FD; + 1744 : AE; + 1745 : 20; + 1746 : 9E; + 1747 : B7; + 1748 : 20; + 1749 : 61; + 174A : B7; + 174B : F0; + 174C : 4B; + 174D : CA; + 174E : 8A; + 174F : 48; + 1750 : 18; + 1751 : A2; + 1752 : 00; + 1753 : F1; + 1754 : 50; + 1755 : B0; + 1756 : B6; + 1757 : 49; + 1758 : FF; + 1759 : C5; + 175A : 65; + 175B : 90; + 175C : B1; + 175D : A5; + 175E : 65; + 175F : B0; + 1760 : AD; + 1761 : 20; + 1762 : F7; + 1763 : AE; + 1764 : 68; + 1765 : A8; + 1766 : 68; + 1767 : 85; + 1768 : 55; + [1769..176B] : 68; + 176C : AA; + 176D : 68; + 176E : 85; + 176F : 50; + 1770 : 68; + 1771 : 85; + 1772 : 51; + 1773 : A5; + 1774 : 55; + 1775 : 48; + 1776 : 98; + 1777 : 48; + 1778 : A0; + 1779 : 00; + 177A : 8A; + 177B : 60; + 177C : 20; + 177D : 82; + 177E : B7; + 177F : 4C; + 1780 : A2; + 1781 : B3; + 1782 : 20; + 1783 : A3; + 1784 : B6; + 1785 : A2; + 1786 : 00; + 1787 : 86; + 1788 : 0D; + 1789 : A8; + 178A : 60; + 178B : 20; + 178C : 82; + 178D : B7; + 178E : F0; + 178F : 08; + 1790 : A0; + 1791 : 00; + 1792 : B1; + 1793 : 22; + 1794 : A8; + 1795 : 4C; + 1796 : A2; + 1797 : B3; + 1798 : 4C; + 1799 : 48; + 179A : B2; + 179B : 20; + 179C : 73; + 179D : 00; + 179E : 20; + 179F : 8A; + 17A0 : AD; + 17A1 : 20; + 17A2 : B8; + 17A3 : B1; + 17A4 : A6; + 17A5 : 64; + 17A6 : D0; + 17A7 : F0; + 17A8 : A6; + 17A9 : 65; + 17AA : 4C; + 17AB : 79; + 17AC : 00; + 17AD : 20; + 17AE : 82; + 17AF : B7; + 17B0 : D0; + 17B1 : 03; + 17B2 : 4C; + 17B3 : F7; + 17B4 : B8; + 17B5 : A6; + 17B6 : 7A; + 17B7 : A4; + 17B8 : 7B; + 17B9 : 86; + 17BA : 71; + 17BB : 84; + 17BC : 72; + 17BD : A6; + 17BE : 22; + 17BF : 86; + 17C0 : 7A; + 17C1 : 18; + 17C2 : 65; + 17C3 : 22; + 17C4 : 85; + 17C5 : 24; + 17C6 : A6; + 17C7 : 23; + 17C8 : 86; + 17C9 : 7B; + 17CA : 90; + 17CB : 01; + 17CC : E8; + 17CD : 86; + 17CE : 25; + 17CF : A0; + 17D0 : 00; + 17D1 : B1; + 17D2 : 24; + 17D3 : 48; + 17D4 : 98; + 17D5 : 91; + 17D6 : 24; + 17D7 : 20; + 17D8 : 79; + 17D9 : 00; + 17DA : 20; + 17DB : F3; + 17DC : BC; + 17DD : 68; + 17DE : A0; + 17DF : 00; + 17E0 : 91; + 17E1 : 24; + 17E2 : A6; + 17E3 : 71; + 17E4 : A4; + 17E5 : 72; + 17E6 : 86; + 17E7 : 7A; + 17E8 : 84; + 17E9 : 7B; + 17EA : 60; + 17EB : 20; + 17EC : 8A; + 17ED : AD; + 17EE : 20; + 17EF : F7; + 17F0 : B7; + 17F1 : 20; + 17F2 : FD; + 17F3 : AE; + 17F4 : 4C; + 17F5 : 9E; + 17F6 : B7; + 17F7 : A5; + 17F8 : 66; + 17F9 : 30; + 17FA : 9D; + 17FB : A5; + 17FC : 61; + 17FD : C9; + 17FE : 91; + 17FF : B0; + 1800 : 97; + 1801 : 20; + 1802 : 9B; + 1803 : BC; + 1804 : A5; + 1805 : 64; + 1806 : A4; + 1807 : 65; + 1808 : 84; + 1809 : 14; + 180A : 85; + 180B : 15; + 180C : 60; + 180D : A5; + 180E : 15; + 180F : 48; + 1810 : A5; + 1811 : 14; + 1812 : 48; + 1813 : 20; + 1814 : F7; + 1815 : B7; + 1816 : A0; + 1817 : 00; + 1818 : B1; + 1819 : 14; + 181A : A8; + 181B : 68; + 181C : 85; + 181D : 14; + 181E : 68; + 181F : 85; + 1820 : 15; + 1821 : 4C; + 1822 : A2; + 1823 : B3; + 1824 : 20; + 1825 : EB; + 1826 : B7; + 1827 : 8A; + 1828 : A0; + 1829 : 00; + 182A : 91; + 182B : 14; + 182C : 60; + 182D : 20; + 182E : EB; + 182F : B7; + 1830 : 86; + 1831 : 49; + 1832 : A2; + 1833 : 00; + 1834 : 20; + 1835 : 79; + 1836 : 00; + 1837 : F0; + 1838 : 03; + 1839 : 20; + 183A : F1; + 183B : B7; + 183C : 86; + 183D : 4A; + 183E : A0; + 183F : 00; + 1840 : B1; + 1841 : 14; + 1842 : 45; + 1843 : 4A; + 1844 : 25; + 1845 : 49; + 1846 : F0; + 1847 : F8; + 1848 : 60; + 1849 : A9; + 184A : 11; + 184B : A0; + 184C : BF; + 184D : 4C; + 184E : 67; + 184F : B8; + 1850 : 20; + 1851 : 8C; + 1852 : BA; + 1853 : A5; + 1854 : 66; + 1855 : 49; + 1856 : FF; + 1857 : 85; + 1858 : 66; + 1859 : 45; + 185A : 6E; + 185B : 85; + 185C : 6F; + 185D : A5; + 185E : 61; + 185F : 4C; + 1860 : 6A; + 1861 : B8; + 1862 : 20; + 1863 : 99; + 1864 : B9; + 1865 : 90; + 1866 : 3C; + 1867 : 20; + 1868 : 8C; + 1869 : BA; + 186A : D0; + 186B : 03; + 186C : 4C; + 186D : FC; + 186E : BB; + 186F : A6; + 1870 : 70; + 1871 : 86; + 1872 : 56; + 1873 : A2; + 1874 : 69; + 1875 : A5; + 1876 : 69; + 1877 : A8; + 1878 : F0; + 1879 : CE; + 187A : 38; + 187B : E5; + 187C : 61; + 187D : F0; + 187E : 24; + 187F : 90; + 1880 : 12; + 1881 : 84; + 1882 : 61; + 1883 : A4; + 1884 : 6E; + 1885 : 84; + 1886 : 66; + 1887 : 49; + 1888 : FF; + 1889 : 69; + 188A : 00; + 188B : A0; + 188C : 00; + 188D : 84; + 188E : 56; + 188F : A2; + 1890 : 61; + 1891 : D0; + 1892 : 04; + 1893 : A0; + 1894 : 00; + 1895 : 84; + 1896 : 70; + 1897 : C9; + 1898 : F9; + 1899 : 30; + 189A : C7; + 189B : A8; + 189C : A5; + 189D : 70; + 189E : 56; + 189F : 01; + 18A0 : 20; + 18A1 : B0; + 18A2 : B9; + 18A3 : 24; + 18A4 : 6F; + 18A5 : 10; + 18A6 : 57; + 18A7 : A0; + 18A8 : 61; + 18A9 : E0; + 18AA : 69; + 18AB : F0; + 18AC : 02; + 18AD : A0; + 18AE : 69; + 18AF : 38; + 18B0 : 49; + 18B1 : FF; + 18B2 : 65; + 18B3 : 56; + 18B4 : 85; + 18B5 : 70; + 18B6 : B9; + 18B7 : 04; + 18B8 : 00; + 18B9 : F5; + 18BA : 04; + 18BB : 85; + 18BC : 65; + 18BD : B9; + 18BE : 03; + 18BF : 00; + 18C0 : F5; + 18C1 : 03; + 18C2 : 85; + 18C3 : 64; + 18C4 : B9; + 18C5 : 02; + 18C6 : 00; + 18C7 : F5; + 18C8 : 02; + 18C9 : 85; + 18CA : 63; + 18CB : B9; + 18CC : 01; + 18CD : 00; + 18CE : F5; + 18CF : 01; + 18D0 : 85; + 18D1 : 62; + 18D2 : B0; + 18D3 : 03; + 18D4 : 20; + 18D5 : 47; + 18D6 : B9; + 18D7 : A0; + 18D8 : 00; + 18D9 : 98; + 18DA : 18; + 18DB : A6; + 18DC : 62; + 18DD : D0; + 18DE : 4A; + 18DF : A6; + 18E0 : 63; + 18E1 : 86; + 18E2 : 62; + 18E3 : A6; + 18E4 : 64; + 18E5 : 86; + 18E6 : 63; + 18E7 : A6; + 18E8 : 65; + 18E9 : 86; + 18EA : 64; + 18EB : A6; + 18EC : 70; + 18ED : 86; + 18EE : 65; + 18EF : 84; + 18F0 : 70; + 18F1 : 69; + 18F2 : 08; + 18F3 : C9; + 18F4 : 20; + 18F5 : D0; + 18F6 : E4; + 18F7 : A9; + 18F8 : 00; + 18F9 : 85; + 18FA : 61; + 18FB : 85; + 18FC : 66; + 18FD : 60; + 18FE : 65; + 18FF : 56; + 1900 : 85; + 1901 : 70; + 1902 : A5; + [1903..1904] : 65; + 1905 : 6D; + 1906 : 85; + 1907 : 65; + 1908 : A5; + 1909 : 64; + 190A : 65; + 190B : 6C; + 190C : 85; + 190D : 64; + 190E : A5; + 190F : 63; + 1910 : 65; + 1911 : 6B; + 1912 : 85; + 1913 : 63; + 1914 : A5; + 1915 : 62; + 1916 : 65; + 1917 : 6A; + 1918 : 85; + 1919 : 62; + 191A : 4C; + 191B : 36; + 191C : B9; + 191D : 69; + 191E : 01; + 191F : 06; + 1920 : 70; + 1921 : 26; + 1922 : 65; + 1923 : 26; + 1924 : 64; + 1925 : 26; + 1926 : 63; + 1927 : 26; + 1928 : 62; + 1929 : 10; + 192A : F2; + 192B : 38; + 192C : E5; + 192D : 61; + 192E : B0; + 192F : C7; + 1930 : 49; + 1931 : FF; + 1932 : 69; + 1933 : 01; + 1934 : 85; + 1935 : 61; + 1936 : 90; + 1937 : 0E; + 1938 : E6; + 1939 : 61; + 193A : F0; + 193B : 42; + 193C : 66; + 193D : 62; + 193E : 66; + 193F : 63; + 1940 : 66; + 1941 : 64; + 1942 : 66; + 1943 : 65; + 1944 : 66; + 1945 : 70; + 1946 : 60; + 1947 : A5; + 1948 : 66; + 1949 : 49; + 194A : FF; + 194B : 85; + 194C : 66; + 194D : A5; + 194E : 62; + 194F : 49; + 1950 : FF; + 1951 : 85; + 1952 : 62; + 1953 : A5; + 1954 : 63; + 1955 : 49; + 1956 : FF; + 1957 : 85; + 1958 : 63; + 1959 : A5; + 195A : 64; + 195B : 49; + 195C : FF; + 195D : 85; + 195E : 64; + 195F : A5; + 1960 : 65; + 1961 : 49; + 1962 : FF; + 1963 : 85; + 1964 : 65; + 1965 : A5; + 1966 : 70; + 1967 : 49; + 1968 : FF; + 1969 : 85; + 196A : 70; + 196B : E6; + 196C : 70; + 196D : D0; + 196E : 0E; + 196F : E6; + 1970 : 65; + 1971 : D0; + 1972 : 0A; + 1973 : E6; + 1974 : 64; + 1975 : D0; + 1976 : 06; + 1977 : E6; + 1978 : 63; + 1979 : D0; + 197A : 02; + 197B : E6; + 197C : 62; + 197D : 60; + 197E : A2; + 197F : 0F; + 1980 : 4C; + 1981 : 37; + 1982 : A4; + 1983 : A2; + 1984 : 25; + 1985 : B4; + 1986 : 04; + 1987 : 84; + 1988 : 70; + 1989 : B4; + 198A : 03; + 198B : 94; + 198C : 04; + 198D : B4; + 198E : 02; + 198F : 94; + 1990 : 03; + 1991 : B4; + 1992 : 01; + 1993 : 94; + 1994 : 02; + 1995 : A4; + 1996 : 68; + 1997 : 94; + 1998 : 01; + 1999 : 69; + 199A : 08; + 199B : 30; + 199C : E8; + 199D : F0; + 199E : E6; + 199F : E9; + 19A0 : 08; + 19A1 : A8; + 19A2 : A5; + 19A3 : 70; + 19A4 : B0; + 19A5 : 14; + 19A6 : 16; + 19A7 : 01; + 19A8 : 90; + 19A9 : 02; + 19AA : F6; + 19AB : 01; + 19AC : 76; + 19AD : 01; + 19AE : 76; + 19AF : 01; + 19B0 : 76; + 19B1 : 02; + 19B2 : 76; + 19B3 : 03; + 19B4 : 76; + 19B5 : 04; + 19B6 : 6A; + 19B7 : C8; + 19B8 : D0; + 19B9 : EC; + 19BA : 18; + 19BB : 60; + 19BC : 81; + [19BD..19C0] : 00; + 19C1 : 03; + 19C2 : 7F; + 19C3 : 5E; + 19C4 : 56; + 19C5 : CB; + 19C6 : 79; + 19C7 : 80; + 19C8 : 13; + 19C9 : 9B; + 19CA : 0B; + 19CB : 64; + 19CC : 80; + 19CD : 76; + 19CE : 38; + 19CF : 93; + 19D0 : 16; + 19D1 : 82; + 19D2 : 38; + 19D3 : AA; + 19D4 : 3B; + 19D5 : 20; + 19D6 : 80; + 19D7 : 35; + 19D8 : 04; + 19D9 : F3; + 19DA : 34; + 19DB : 81; + 19DC : 35; + 19DD : 04; + 19DE : F3; + 19DF : 34; + [19E0..19E1] : 80; + [19E2..19E4] : 00; + 19E5 : 80; + 19E6 : 31; + 19E7 : 72; + 19E8 : 17; + 19E9 : F8; + 19EA : 20; + 19EB : 2B; + 19EC : BC; + 19ED : F0; + 19EE : 02; + 19EF : 10; + 19F0 : 03; + 19F1 : 4C; + 19F2 : 48; + 19F3 : B2; + 19F4 : A5; + 19F5 : 61; + 19F6 : E9; + 19F7 : 7F; + 19F8 : 48; + 19F9 : A9; + 19FA : 80; + 19FB : 85; + 19FC : 61; + 19FD : A9; + 19FE : D6; + 19FF : A0; + 1A00 : B9; + 1A01 : 20; + 1A02 : 67; + 1A03 : B8; + 1A04 : A9; + 1A05 : DB; + 1A06 : A0; + 1A07 : B9; + 1A08 : 20; + 1A09 : 0F; + 1A0A : BB; + 1A0B : A9; + 1A0C : BC; + 1A0D : A0; + 1A0E : B9; + 1A0F : 20; + 1A10 : 50; + 1A11 : B8; + 1A12 : A9; + 1A13 : C1; + 1A14 : A0; + 1A15 : B9; + 1A16 : 20; + 1A17 : 43; + 1A18 : E0; + 1A19 : A9; + 1A1A : E0; + 1A1B : A0; + 1A1C : B9; + 1A1D : 20; + 1A1E : 67; + 1A1F : B8; + 1A20 : 68; + 1A21 : 20; + 1A22 : 7E; + 1A23 : BD; + 1A24 : A9; + 1A25 : E5; + 1A26 : A0; + 1A27 : B9; + 1A28 : 20; + 1A29 : 8C; + 1A2A : BA; + 1A2B : D0; + 1A2C : 03; + 1A2D : 4C; + 1A2E : 8B; + 1A2F : BA; + 1A30 : 20; + 1A31 : B7; + 1A32 : BA; + 1A33 : A9; + 1A34 : 00; + 1A35 : 85; + 1A36 : 26; + 1A37 : 85; + 1A38 : 27; + 1A39 : 85; + 1A3A : 28; + 1A3B : 85; + 1A3C : 29; + 1A3D : A5; + 1A3E : 70; + 1A3F : 20; + 1A40 : 59; + 1A41 : BA; + 1A42 : A5; + 1A43 : 65; + 1A44 : 20; + 1A45 : 59; + 1A46 : BA; + 1A47 : A5; + 1A48 : 64; + 1A49 : 20; + 1A4A : 59; + 1A4B : BA; + 1A4C : A5; + 1A4D : 63; + 1A4E : 20; + 1A4F : 59; + 1A50 : BA; + 1A51 : A5; + 1A52 : 62; + 1A53 : 20; + 1A54 : 5E; + 1A55 : BA; + 1A56 : 4C; + 1A57 : 8F; + 1A58 : BB; + 1A59 : D0; + 1A5A : 03; + 1A5B : 4C; + 1A5C : 83; + 1A5D : B9; + 1A5E : 4A; + 1A5F : 09; + 1A60 : 80; + 1A61 : A8; + 1A62 : 90; + 1A63 : 19; + 1A64 : 18; + 1A65 : A5; + 1A66 : 29; + 1A67 : 65; + 1A68 : 6D; + 1A69 : 85; + 1A6A : 29; + 1A6B : A5; + 1A6C : 28; + 1A6D : 65; + 1A6E : 6C; + 1A6F : 85; + 1A70 : 28; + 1A71 : A5; + 1A72 : 27; + 1A73 : 65; + 1A74 : 6B; + 1A75 : 85; + 1A76 : 27; + 1A77 : A5; + 1A78 : 26; + 1A79 : 65; + 1A7A : 6A; + 1A7B : 85; + 1A7C : 26; + 1A7D : 66; + 1A7E : 26; + 1A7F : 66; + 1A80 : 27; + 1A81 : 66; + 1A82 : 28; + 1A83 : 66; + 1A84 : 29; + 1A85 : 66; + 1A86 : 70; + 1A87 : 98; + 1A88 : 4A; + 1A89 : D0; + 1A8A : D6; + 1A8B : 60; + 1A8C : 85; + 1A8D : 22; + 1A8E : 84; + 1A8F : 23; + 1A90 : A0; + 1A91 : 04; + 1A92 : B1; + 1A93 : 22; + 1A94 : 85; + 1A95 : 6D; + 1A96 : 88; + 1A97 : B1; + 1A98 : 22; + 1A99 : 85; + 1A9A : 6C; + 1A9B : 88; + 1A9C : B1; + 1A9D : 22; + 1A9E : 85; + 1A9F : 6B; + 1AA0 : 88; + 1AA1 : B1; + 1AA2 : 22; + 1AA3 : 85; + 1AA4 : 6E; + 1AA5 : 45; + 1AA6 : 66; + 1AA7 : 85; + 1AA8 : 6F; + 1AA9 : A5; + 1AAA : 6E; + 1AAB : 09; + 1AAC : 80; + 1AAD : 85; + 1AAE : 6A; + 1AAF : 88; + 1AB0 : B1; + 1AB1 : 22; + 1AB2 : 85; + 1AB3 : 69; + 1AB4 : A5; + 1AB5 : 61; + 1AB6 : 60; + 1AB7 : A5; + 1AB8 : 69; + 1AB9 : F0; + 1ABA : 1F; + 1ABB : 18; + 1ABC : 65; + 1ABD : 61; + 1ABE : 90; + 1ABF : 04; + 1AC0 : 30; + 1AC1 : 1D; + 1AC2 : 18; + 1AC3 : 2C; + 1AC4 : 10; + 1AC5 : 14; + 1AC6 : 69; + 1AC7 : 80; + 1AC8 : 85; + 1AC9 : 61; + 1ACA : D0; + 1ACB : 03; + 1ACC : 4C; + 1ACD : FB; + 1ACE : B8; + 1ACF : A5; + 1AD0 : 6F; + 1AD1 : 85; + 1AD2 : 66; + 1AD3 : 60; + 1AD4 : A5; + 1AD5 : 66; + 1AD6 : 49; + 1AD7 : FF; + 1AD8 : 30; + 1AD9 : 05; + [1ADA..1ADB] : 68; + 1ADC : 4C; + 1ADD : F7; + 1ADE : B8; + 1ADF : 4C; + 1AE0 : 7E; + 1AE1 : B9; + 1AE2 : 20; + 1AE3 : 0C; + 1AE4 : BC; + 1AE5 : AA; + 1AE6 : F0; + 1AE7 : 10; + 1AE8 : 18; + 1AE9 : 69; + 1AEA : 02; + 1AEB : B0; + 1AEC : F2; + 1AED : A2; + 1AEE : 00; + 1AEF : 86; + 1AF0 : 6F; + 1AF1 : 20; + 1AF2 : 77; + 1AF3 : B8; + 1AF4 : E6; + 1AF5 : 61; + 1AF6 : F0; + 1AF7 : E7; + 1AF8 : 60; + 1AF9 : 84; + 1AFA : 20; + [1AFB..1AFD] : 00; + 1AFE : 20; + 1AFF : 0C; + 1B00 : BC; + 1B01 : A9; + 1B02 : F9; + 1B03 : A0; + 1B04 : BA; + 1B05 : A2; + 1B06 : 00; + 1B07 : 86; + 1B08 : 6F; + 1B09 : 20; + 1B0A : A2; + 1B0B : BB; + 1B0C : 4C; + 1B0D : 12; + 1B0E : BB; + 1B0F : 20; + 1B10 : 8C; + 1B11 : BA; + 1B12 : F0; + 1B13 : 76; + 1B14 : 20; + 1B15 : 1B; + 1B16 : BC; + 1B17 : A9; + 1B18 : 00; + 1B19 : 38; + 1B1A : E5; + 1B1B : 61; + 1B1C : 85; + 1B1D : 61; + 1B1E : 20; + 1B1F : B7; + 1B20 : BA; + 1B21 : E6; + 1B22 : 61; + 1B23 : F0; + 1B24 : BA; + 1B25 : A2; + 1B26 : FC; + 1B27 : A9; + 1B28 : 01; + 1B29 : A4; + 1B2A : 6A; + 1B2B : C4; + 1B2C : 62; + 1B2D : D0; + 1B2E : 10; + 1B2F : A4; + 1B30 : 6B; + 1B31 : C4; + 1B32 : 63; + 1B33 : D0; + 1B34 : 0A; + 1B35 : A4; + 1B36 : 6C; + 1B37 : C4; + 1B38 : 64; + 1B39 : D0; + 1B3A : 04; + 1B3B : A4; + 1B3C : 6D; + 1B3D : C4; + 1B3E : 65; + 1B3F : 08; + 1B40 : 2A; + 1B41 : 90; + 1B42 : 09; + 1B43 : E8; + 1B44 : 95; + 1B45 : 29; + 1B46 : F0; + 1B47 : 32; + 1B48 : 10; + 1B49 : 34; + 1B4A : A9; + 1B4B : 01; + 1B4C : 28; + 1B4D : B0; + 1B4E : 0E; + 1B4F : 06; + 1B50 : 6D; + 1B51 : 26; + 1B52 : 6C; + 1B53 : 26; + 1B54 : 6B; + 1B55 : 26; + 1B56 : 6A; + 1B57 : B0; + 1B58 : E6; + 1B59 : 30; + 1B5A : CE; + 1B5B : 10; + 1B5C : E2; + 1B5D : A8; + 1B5E : A5; + 1B5F : 6D; + 1B60 : E5; + 1B61 : 65; + 1B62 : 85; + 1B63 : 6D; + 1B64 : A5; + 1B65 : 6C; + 1B66 : E5; + 1B67 : 64; + 1B68 : 85; + 1B69 : 6C; + 1B6A : A5; + 1B6B : 6B; + 1B6C : E5; + 1B6D : 63; + 1B6E : 85; + 1B6F : 6B; + 1B70 : A5; + 1B71 : 6A; + 1B72 : E5; + 1B73 : 62; + 1B74 : 85; + 1B75 : 6A; + 1B76 : 98; + 1B77 : 4C; + 1B78 : 4F; + 1B79 : BB; + 1B7A : A9; + 1B7B : 40; + 1B7C : D0; + 1B7D : CE; + [1B7E..1B83] : 0A; + 1B84 : 85; + 1B85 : 70; + 1B86 : 28; + 1B87 : 4C; + 1B88 : 8F; + 1B89 : BB; + 1B8A : A2; + 1B8B : 14; + 1B8C : 4C; + 1B8D : 37; + 1B8E : A4; + 1B8F : A5; + 1B90 : 26; + 1B91 : 85; + 1B92 : 62; + 1B93 : A5; + 1B94 : 27; + 1B95 : 85; + 1B96 : 63; + 1B97 : A5; + 1B98 : 28; + 1B99 : 85; + 1B9A : 64; + 1B9B : A5; + 1B9C : 29; + 1B9D : 85; + 1B9E : 65; + 1B9F : 4C; + 1BA0 : D7; + 1BA1 : B8; + 1BA2 : 85; + 1BA3 : 22; + 1BA4 : 84; + 1BA5 : 23; + 1BA6 : A0; + 1BA7 : 04; + 1BA8 : B1; + 1BA9 : 22; + 1BAA : 85; + 1BAB : 65; + 1BAC : 88; + 1BAD : B1; + 1BAE : 22; + 1BAF : 85; + 1BB0 : 64; + 1BB1 : 88; + 1BB2 : B1; + 1BB3 : 22; + 1BB4 : 85; + 1BB5 : 63; + 1BB6 : 88; + 1BB7 : B1; + 1BB8 : 22; + 1BB9 : 85; + 1BBA : 66; + 1BBB : 09; + 1BBC : 80; + 1BBD : 85; + 1BBE : 62; + 1BBF : 88; + 1BC0 : B1; + 1BC1 : 22; + 1BC2 : 85; + 1BC3 : 61; + 1BC4 : 84; + 1BC5 : 70; + 1BC6 : 60; + 1BC7 : A2; + 1BC8 : 5C; + 1BC9 : 2C; + 1BCA : A2; + 1BCB : 57; + 1BCC : A0; + 1BCD : 00; + 1BCE : F0; + 1BCF : 04; + 1BD0 : A6; + 1BD1 : 49; + 1BD2 : A4; + 1BD3 : 4A; + 1BD4 : 20; + 1BD5 : 1B; + 1BD6 : BC; + 1BD7 : 86; + 1BD8 : 22; + 1BD9 : 84; + 1BDA : 23; + 1BDB : A0; + 1BDC : 04; + 1BDD : A5; + 1BDE : 65; + 1BDF : 91; + 1BE0 : 22; + 1BE1 : 88; + 1BE2 : A5; + 1BE3 : 64; + 1BE4 : 91; + 1BE5 : 22; + 1BE6 : 88; + 1BE7 : A5; + 1BE8 : 63; + 1BE9 : 91; + 1BEA : 22; + 1BEB : 88; + 1BEC : A5; + 1BED : 66; + 1BEE : 09; + 1BEF : 7F; + 1BF0 : 25; + 1BF1 : 62; + 1BF2 : 91; + 1BF3 : 22; + 1BF4 : 88; + 1BF5 : A5; + 1BF6 : 61; + 1BF7 : 91; + 1BF8 : 22; + 1BF9 : 84; + 1BFA : 70; + 1BFB : 60; + 1BFC : A5; + 1BFD : 6E; + 1BFE : 85; + 1BFF : 66; + 1C00 : A2; + 1C01 : 05; + 1C02 : B5; + 1C03 : 68; + 1C04 : 95; + 1C05 : 60; + 1C06 : CA; + 1C07 : D0; + 1C08 : F9; + 1C09 : 86; + 1C0A : 70; + 1C0B : 60; + 1C0C : 20; + 1C0D : 1B; + 1C0E : BC; + 1C0F : A2; + 1C10 : 06; + 1C11 : B5; + 1C12 : 60; + 1C13 : 95; + 1C14 : 68; + 1C15 : CA; + 1C16 : D0; + 1C17 : F9; + 1C18 : 86; + 1C19 : 70; + 1C1A : 60; + 1C1B : A5; + 1C1C : 61; + 1C1D : F0; + 1C1E : FB; + 1C1F : 06; + 1C20 : 70; + 1C21 : 90; + 1C22 : F7; + 1C23 : 20; + 1C24 : 6F; + 1C25 : B9; + 1C26 : D0; + 1C27 : F2; + 1C28 : 4C; + 1C29 : 38; + 1C2A : B9; + 1C2B : A5; + 1C2C : 61; + 1C2D : F0; + 1C2E : 09; + 1C2F : A5; + 1C30 : 66; + 1C31 : 2A; + 1C32 : A9; + 1C33 : FF; + 1C34 : B0; + 1C35 : 02; + 1C36 : A9; + 1C37 : 01; + 1C38 : 60; + 1C39 : 20; + 1C3A : 2B; + 1C3B : BC; + 1C3C : 85; + 1C3D : 62; + 1C3E : A9; + 1C3F : 00; + 1C40 : 85; + 1C41 : 63; + 1C42 : A2; + 1C43 : 88; + 1C44 : A5; + 1C45 : 62; + 1C46 : 49; + 1C47 : FF; + 1C48 : 2A; + 1C49 : A9; + 1C4A : 00; + 1C4B : 85; + 1C4C : 65; + 1C4D : 85; + 1C4E : 64; + 1C4F : 86; + 1C50 : 61; + 1C51 : 85; + 1C52 : 70; + 1C53 : 85; + 1C54 : 66; + 1C55 : 4C; + 1C56 : D2; + 1C57 : B8; + 1C58 : 46; + 1C59 : 66; + 1C5A : 60; + 1C5B : 85; + 1C5C : 24; + 1C5D : 84; + 1C5E : 25; + 1C5F : A0; + 1C60 : 00; + 1C61 : B1; + 1C62 : 24; + 1C63 : C8; + 1C64 : AA; + 1C65 : F0; + 1C66 : C4; + 1C67 : B1; + 1C68 : 24; + 1C69 : 45; + 1C6A : 66; + 1C6B : 30; + 1C6C : C2; + 1C6D : E4; + 1C6E : 61; + 1C6F : D0; + 1C70 : 21; + 1C71 : B1; + 1C72 : 24; + 1C73 : 09; + 1C74 : 80; + 1C75 : C5; + 1C76 : 62; + 1C77 : D0; + 1C78 : 19; + 1C79 : C8; + 1C7A : B1; + 1C7B : 24; + 1C7C : C5; + 1C7D : 63; + 1C7E : D0; + 1C7F : 12; + 1C80 : C8; + 1C81 : B1; + 1C82 : 24; + 1C83 : C5; + 1C84 : 64; + 1C85 : D0; + 1C86 : 0B; + 1C87 : C8; + 1C88 : A9; + 1C89 : 7F; + 1C8A : C5; + 1C8B : 70; + 1C8C : B1; + 1C8D : 24; + 1C8E : E5; + 1C8F : 65; + 1C90 : F0; + 1C91 : 28; + 1C92 : A5; + 1C93 : 66; + 1C94 : 90; + 1C95 : 02; + 1C96 : 49; + 1C97 : FF; + 1C98 : 4C; + 1C99 : 31; + 1C9A : BC; + 1C9B : A5; + 1C9C : 61; + 1C9D : F0; + 1C9E : 4A; + 1C9F : 38; + 1CA0 : E9; + 1CA1 : A0; + 1CA2 : 24; + 1CA3 : 66; + 1CA4 : 10; + 1CA5 : 09; + 1CA6 : AA; + 1CA7 : A9; + 1CA8 : FF; + 1CA9 : 85; + 1CAA : 68; + 1CAB : 20; + 1CAC : 4D; + 1CAD : B9; + 1CAE : 8A; + 1CAF : A2; + 1CB0 : 61; + 1CB1 : C9; + 1CB2 : F9; + 1CB3 : 10; + 1CB4 : 06; + 1CB5 : 20; + 1CB6 : 99; + 1CB7 : B9; + 1CB8 : 84; + 1CB9 : 68; + 1CBA : 60; + 1CBB : A8; + 1CBC : A5; + 1CBD : 66; + 1CBE : 29; + 1CBF : 80; + 1CC0 : 46; + 1CC1 : 62; + 1CC2 : 05; + 1CC3 : 62; + 1CC4 : 85; + 1CC5 : 62; + 1CC6 : 20; + 1CC7 : B0; + 1CC8 : B9; + 1CC9 : 84; + 1CCA : 68; + 1CCB : 60; + 1CCC : A5; + 1CCD : 61; + 1CCE : C9; + 1CCF : A0; + 1CD0 : B0; + [1CD1..1CD2] : 20; + 1CD3 : 9B; + 1CD4 : BC; + 1CD5 : 84; + 1CD6 : 70; + 1CD7 : A5; + 1CD8 : 66; + 1CD9 : 84; + 1CDA : 66; + 1CDB : 49; + 1CDC : 80; + 1CDD : 2A; + 1CDE : A9; + 1CDF : A0; + 1CE0 : 85; + 1CE1 : 61; + 1CE2 : A5; + 1CE3 : 65; + 1CE4 : 85; + 1CE5 : 07; + 1CE6 : 4C; + 1CE7 : D2; + 1CE8 : B8; + 1CE9 : 85; + 1CEA : 62; + 1CEB : 85; + 1CEC : 63; + 1CED : 85; + 1CEE : 64; + 1CEF : 85; + 1CF0 : 65; + 1CF1 : A8; + 1CF2 : 60; + 1CF3 : A0; + 1CF4 : 00; + 1CF5 : A2; + 1CF6 : 0A; + 1CF7 : 94; + 1CF8 : 5D; + 1CF9 : CA; + 1CFA : 10; + 1CFB : FB; + 1CFC : 90; + 1CFD : 0F; + 1CFE : C9; + 1CFF : 2D; + 1D00 : D0; + 1D01 : 04; + 1D02 : 86; + 1D03 : 67; + 1D04 : F0; + 1D05 : 04; + 1D06 : C9; + 1D07 : 2B; + 1D08 : D0; + 1D09 : 05; + 1D0A : 20; + 1D0B : 73; + 1D0C : 00; + 1D0D : 90; + 1D0E : 5B; + 1D0F : C9; + 1D10 : 2E; + 1D11 : F0; + 1D12 : 2E; + 1D13 : C9; + 1D14 : 45; + 1D15 : D0; + 1D16 : 30; + 1D17 : 20; + 1D18 : 73; + 1D19 : 00; + 1D1A : 90; + 1D1B : 17; + 1D1C : C9; + 1D1D : AB; + 1D1E : F0; + 1D1F : 0E; + 1D20 : C9; + 1D21 : 2D; + 1D22 : F0; + 1D23 : 0A; + 1D24 : C9; + 1D25 : AA; + 1D26 : F0; + 1D27 : 08; + 1D28 : C9; + 1D29 : 2B; + 1D2A : F0; + 1D2B : 04; + 1D2C : D0; + 1D2D : 07; + 1D2E : 66; + 1D2F : 60; + 1D30 : 20; + 1D31 : 73; + 1D32 : 00; + 1D33 : 90; + 1D34 : 5C; + 1D35 : 24; + 1D36 : 60; + 1D37 : 10; + 1D38 : 0E; + 1D39 : A9; + 1D3A : 00; + 1D3B : 38; + 1D3C : E5; + 1D3D : 5E; + 1D3E : 4C; + 1D3F : 49; + 1D40 : BD; + 1D41 : 66; + 1D42 : 5F; + 1D43 : 24; + 1D44 : 5F; + 1D45 : 50; + 1D46 : C3; + 1D47 : A5; + 1D48 : 5E; + 1D49 : 38; + 1D4A : E5; + 1D4B : 5D; + 1D4C : 85; + 1D4D : 5E; + 1D4E : F0; + 1D4F : 12; + 1D50 : 10; + 1D51 : 09; + 1D52 : 20; + 1D53 : FE; + 1D54 : BA; + 1D55 : E6; + 1D56 : 5E; + 1D57 : D0; + 1D58 : F9; + 1D59 : F0; + 1D5A : 07; + 1D5B : 20; + 1D5C : E2; + 1D5D : BA; + 1D5E : C6; + 1D5F : 5E; + 1D60 : D0; + 1D61 : F9; + 1D62 : A5; + 1D63 : 67; + 1D64 : 30; + 1D65 : 01; + 1D66 : 60; + 1D67 : 4C; + 1D68 : B4; + 1D69 : BF; + 1D6A : 48; + 1D6B : 24; + 1D6C : 5F; + 1D6D : 10; + 1D6E : 02; + 1D6F : E6; + 1D70 : 5D; + 1D71 : 20; + 1D72 : E2; + 1D73 : BA; + 1D74 : 68; + 1D75 : 38; + 1D76 : E9; + 1D77 : 30; + 1D78 : 20; + 1D79 : 7E; + 1D7A : BD; + 1D7B : 4C; + 1D7C : 0A; + 1D7D : BD; + 1D7E : 48; + 1D7F : 20; + 1D80 : 0C; + 1D81 : BC; + 1D82 : 68; + 1D83 : 20; + 1D84 : 3C; + 1D85 : BC; + 1D86 : A5; + 1D87 : 6E; + 1D88 : 45; + 1D89 : 66; + 1D8A : 85; + 1D8B : 6F; + 1D8C : A6; + 1D8D : 61; + 1D8E : 4C; + 1D8F : 6A; + 1D90 : B8; + 1D91 : A5; + 1D92 : 5E; + 1D93 : C9; + 1D94 : 0A; + 1D95 : 90; + 1D96 : 09; + 1D97 : A9; + 1D98 : 64; + 1D99 : 24; + 1D9A : 60; + 1D9B : 30; + 1D9C : 11; + 1D9D : 4C; + 1D9E : 7E; + 1D9F : B9; + [1DA0..1DA1] : 0A; + 1DA2 : 18; + 1DA3 : 65; + 1DA4 : 5E; + 1DA5 : 0A; + 1DA6 : 18; + 1DA7 : A0; + 1DA8 : 00; + 1DA9 : 71; + 1DAA : 7A; + 1DAB : 38; + 1DAC : E9; + 1DAD : 30; + 1DAE : 85; + 1DAF : 5E; + 1DB0 : 4C; + 1DB1 : 30; + 1DB2 : BD; + 1DB3 : 9B; + 1DB4 : 3E; + 1DB5 : BC; + 1DB6 : 1F; + 1DB7 : FD; + 1DB8 : 9E; + 1DB9 : 6E; + 1DBA : 6B; + 1DBB : 27; + 1DBC : FD; + 1DBD : 9E; + 1DBE : 6E; + 1DBF : 6B; + 1DC0 : 28; + 1DC1 : 00; + 1DC2 : A9; + 1DC3 : 71; + 1DC4 : A0; + 1DC5 : A3; + 1DC6 : 20; + 1DC7 : DA; + 1DC8 : BD; + 1DC9 : A5; + 1DCA : 3A; + 1DCB : A6; + 1DCC : 39; + 1DCD : 85; + 1DCE : 62; + 1DCF : 86; + 1DD0 : 63; + 1DD1 : A2; + 1DD2 : 90; + 1DD3 : 38; + 1DD4 : 20; + 1DD5 : 49; + 1DD6 : BC; + 1DD7 : 20; + 1DD8 : DF; + 1DD9 : BD; + 1DDA : 4C; + 1DDB : 1E; + 1DDC : AB; + 1DDD : A0; + 1DDE : 01; + 1DDF : A9; + 1DE0 : 20; + 1DE1 : 24; + 1DE2 : 66; + 1DE3 : 10; + 1DE4 : 02; + 1DE5 : A9; + 1DE6 : 2D; + 1DE7 : 99; + 1DE8 : FF; + 1DE9 : 00; + 1DEA : 85; + 1DEB : 66; + 1DEC : 84; + 1DED : 71; + 1DEE : C8; + 1DEF : A9; + 1DF0 : 30; + 1DF1 : A6; + 1DF2 : 61; + 1DF3 : D0; + 1DF4 : 03; + 1DF5 : 4C; + 1DF6 : 04; + 1DF7 : BF; + 1DF8 : A9; + 1DF9 : 00; + 1DFA : E0; + 1DFB : 80; + 1DFC : F0; + 1DFD : 02; + 1DFE : B0; + 1DFF : 09; + 1E00 : A9; + 1E01 : BD; + 1E02 : A0; + 1E03 : BD; + 1E04 : 20; + 1E05 : 28; + 1E06 : BA; + 1E07 : A9; + 1E08 : F7; + 1E09 : 85; + 1E0A : 5D; + 1E0B : A9; + 1E0C : B8; + 1E0D : A0; + 1E0E : BD; + 1E0F : 20; + 1E10 : 5B; + 1E11 : BC; + 1E12 : F0; + 1E13 : 1E; + 1E14 : 10; + 1E15 : 12; + 1E16 : A9; + 1E17 : B3; + 1E18 : A0; + 1E19 : BD; + 1E1A : 20; + 1E1B : 5B; + 1E1C : BC; + 1E1D : F0; + 1E1E : 02; + 1E1F : 10; + 1E20 : 0E; + 1E21 : 20; + 1E22 : E2; + 1E23 : BA; + 1E24 : C6; + 1E25 : 5D; + 1E26 : D0; + 1E27 : EE; + 1E28 : 20; + 1E29 : FE; + 1E2A : BA; + 1E2B : E6; + 1E2C : 5D; + 1E2D : D0; + 1E2E : DC; + 1E2F : 20; + 1E30 : 49; + 1E31 : B8; + 1E32 : 20; + 1E33 : 9B; + 1E34 : BC; + 1E35 : A2; + 1E36 : 01; + 1E37 : A5; + 1E38 : 5D; + 1E39 : 18; + 1E3A : 69; + 1E3B : 0A; + 1E3C : 30; + 1E3D : 09; + 1E3E : C9; + 1E3F : 0B; + 1E40 : B0; + 1E41 : 06; + 1E42 : 69; + 1E43 : FF; + 1E44 : AA; + 1E45 : A9; + 1E46 : 02; + 1E47 : 38; + 1E48 : E9; + 1E49 : 02; + 1E4A : 85; + 1E4B : 5E; + 1E4C : 86; + 1E4D : 5D; + 1E4E : 8A; + 1E4F : F0; + 1E50 : 02; + 1E51 : 10; + 1E52 : 13; + 1E53 : A4; + 1E54 : 71; + 1E55 : A9; + 1E56 : 2E; + 1E57 : C8; + 1E58 : 99; + 1E59 : FF; + 1E5A : 00; + 1E5B : 8A; + 1E5C : F0; + 1E5D : 06; + 1E5E : A9; + 1E5F : 30; + 1E60 : C8; + 1E61 : 99; + 1E62 : FF; + 1E63 : 00; + 1E64 : 84; + 1E65 : 71; + 1E66 : A0; + 1E67 : 00; + 1E68 : A2; + 1E69 : 80; + 1E6A : A5; + 1E6B : 65; + 1E6C : 18; + 1E6D : 79; + 1E6E : 19; + 1E6F : BF; + 1E70 : 85; + 1E71 : 65; + 1E72 : A5; + 1E73 : 64; + 1E74 : 79; + 1E75 : 18; + 1E76 : BF; + 1E77 : 85; + 1E78 : 64; + 1E79 : A5; + 1E7A : 63; + 1E7B : 79; + 1E7C : 17; + 1E7D : BF; + 1E7E : 85; + 1E7F : 63; + 1E80 : A5; + 1E81 : 62; + 1E82 : 79; + 1E83 : 16; + 1E84 : BF; + 1E85 : 85; + 1E86 : 62; + 1E87 : E8; + 1E88 : B0; + 1E89 : 04; + 1E8A : 10; + 1E8B : DE; + 1E8C : 30; + 1E8D : 02; + 1E8E : 30; + 1E8F : DA; + 1E90 : 8A; + 1E91 : 90; + 1E92 : 04; + 1E93 : 49; + 1E94 : FF; + 1E95 : 69; + 1E96 : 0A; + 1E97 : 69; + 1E98 : 2F; + [1E99..1E9C] : C8; + 1E9D : 84; + 1E9E : 47; + 1E9F : A4; + 1EA0 : 71; + 1EA1 : C8; + 1EA2 : AA; + 1EA3 : 29; + 1EA4 : 7F; + 1EA5 : 99; + 1EA6 : FF; + 1EA7 : 00; + 1EA8 : C6; + 1EA9 : 5D; + 1EAA : D0; + 1EAB : 06; + 1EAC : A9; + 1EAD : 2E; + 1EAE : C8; + 1EAF : 99; + 1EB0 : FF; + 1EB1 : 00; + 1EB2 : 84; + 1EB3 : 71; + 1EB4 : A4; + 1EB5 : 47; + 1EB6 : 8A; + 1EB7 : 49; + 1EB8 : FF; + 1EB9 : 29; + 1EBA : 80; + 1EBB : AA; + 1EBC : C0; + 1EBD : 24; + 1EBE : F0; + 1EBF : 04; + 1EC0 : C0; + 1EC1 : 3C; + 1EC2 : D0; + 1EC3 : A6; + 1EC4 : A4; + 1EC5 : 71; + 1EC6 : B9; + 1EC7 : FF; + 1EC8 : 00; + 1EC9 : 88; + 1ECA : C9; + 1ECB : 30; + 1ECC : F0; + 1ECD : F8; + 1ECE : C9; + 1ECF : 2E; + 1ED0 : F0; + 1ED1 : 01; + 1ED2 : C8; + 1ED3 : A9; + 1ED4 : 2B; + 1ED5 : A6; + 1ED6 : 5E; + 1ED7 : F0; + 1ED8 : 2E; + 1ED9 : 10; + 1EDA : 08; + 1EDB : A9; + 1EDC : 00; + 1EDD : 38; + 1EDE : E5; + 1EDF : 5E; + 1EE0 : AA; + 1EE1 : A9; + 1EE2 : 2D; + 1EE3 : 99; + [1EE4..1EE5] : 01; + 1EE6 : A9; + 1EE7 : 45; + 1EE8 : 99; + 1EE9 : 00; + 1EEA : 01; + 1EEB : 8A; + 1EEC : A2; + 1EED : 2F; + 1EEE : 38; + 1EEF : E8; + 1EF0 : E9; + 1EF1 : 0A; + 1EF2 : B0; + 1EF3 : FB; + 1EF4 : 69; + 1EF5 : 3A; + 1EF6 : 99; + 1EF7 : 03; + 1EF8 : 01; + 1EF9 : 8A; + 1EFA : 99; + 1EFB : 02; + 1EFC : 01; + 1EFD : A9; + 1EFE : 00; + 1EFF : 99; + 1F00 : 04; + 1F01 : 01; + 1F02 : F0; + 1F03 : 08; + 1F04 : 99; + 1F05 : FF; + 1F06 : 00; + 1F07 : A9; + 1F08 : 00; + 1F09 : 99; + 1F0A : 00; + 1F0B : 01; + 1F0C : A9; + 1F0D : 00; + 1F0E : A0; + 1F0F : 01; + 1F10 : 60; + 1F11 : 80; + [1F12..1F15] : 00; + 1F16 : FA; + 1F17 : 0A; + 1F18 : 1F; + [1F19..1F1A] : 00; + 1F1B : 98; + 1F1C : 96; + 1F1D : 80; + 1F1E : FF; + 1F1F : F0; + 1F20 : BD; + 1F21 : C0; + 1F22 : 00; + 1F23 : 01; + 1F24 : 86; + 1F25 : A0; + [1F26..1F27] : FF; + 1F28 : D8; + 1F29 : F0; + [1F2A..1F2B] : 00; + 1F2C : 03; + 1F2D : E8; + [1F2E..1F30] : FF; + 1F31 : 9C; + [1F32..1F34] : 00; + 1F35 : 0A; + [1F36..1F3A] : FF; + 1F3B : DF; + 1F3C : 0A; + 1F3D : 80; + 1F3E : 00; + 1F3F : 03; + 1F40 : 4B; + 1F41 : C0; + [1F42..1F43] : FF; + 1F44 : 73; + 1F45 : 60; + [1F46..1F47] : 00; + 1F48 : 0E; + 1F49 : 10; + [1F4A..1F4B] : FF; + 1F4C : FD; + 1F4D : A8; + [1F4E..1F50] : 00; + 1F51 : 3C; + 1F52 : EC; + [1F53..1F70] : AA; + 1F71 : 20; + 1F72 : 0C; + 1F73 : BC; + 1F74 : A9; + 1F75 : 11; + 1F76 : A0; + 1F77 : BF; + 1F78 : 20; + 1F79 : A2; + 1F7A : BB; + 1F7B : F0; + 1F7C : 70; + 1F7D : A5; + 1F7E : 69; + 1F7F : D0; + 1F80 : 03; + 1F81 : 4C; + 1F82 : F9; + 1F83 : B8; + 1F84 : A2; + 1F85 : 4E; + 1F86 : A0; + 1F87 : 00; + 1F88 : 20; + 1F89 : D4; + 1F8A : BB; + 1F8B : A5; + 1F8C : 6E; + 1F8D : 10; + 1F8E : 0F; + 1F8F : 20; + 1F90 : CC; + 1F91 : BC; + 1F92 : A9; + 1F93 : 4E; + 1F94 : A0; + 1F95 : 00; + 1F96 : 20; + 1F97 : 5B; + 1F98 : BC; + 1F99 : D0; + 1F9A : 03; + 1F9B : 98; + 1F9C : A4; + 1F9D : 07; + 1F9E : 20; + 1F9F : FE; + 1FA0 : BB; + 1FA1 : 98; + 1FA2 : 48; + 1FA3 : 20; + 1FA4 : EA; + 1FA5 : B9; + 1FA6 : A9; + 1FA7 : 4E; + 1FA8 : A0; + 1FA9 : 00; + 1FAA : 20; + 1FAB : 28; + 1FAC : BA; + 1FAD : 20; + 1FAE : ED; + 1FAF : BF; + 1FB0 : 68; + 1FB1 : 4A; + 1FB2 : 90; + 1FB3 : 0A; + 1FB4 : A5; + 1FB5 : 61; + 1FB6 : F0; + 1FB7 : 06; + 1FB8 : A5; + 1FB9 : 66; + 1FBA : 49; + 1FBB : FF; + 1FBC : 85; + 1FBD : 66; + 1FBE : 60; + 1FBF : 81; + 1FC0 : 38; + 1FC1 : AA; + 1FC2 : 3B; + 1FC3 : 29; + 1FC4 : 07; + 1FC5 : 71; + 1FC6 : 34; + 1FC7 : 58; + 1FC8 : 3E; + 1FC9 : 56; + 1FCA : 74; + 1FCB : 16; + 1FCC : 7E; + 1FCD : B3; + 1FCE : 1B; + 1FCF : 77; + 1FD0 : 2F; + 1FD1 : EE; + 1FD2 : E3; + 1FD3 : 85; + 1FD4 : 7A; + 1FD5 : 1D; + 1FD6 : 84; + 1FD7 : 1C; + 1FD8 : 2A; + 1FD9 : 7C; + 1FDA : 63; + 1FDB : 59; + 1FDC : 58; + 1FDD : 0A; + 1FDE : 7E; + 1FDF : 75; + 1FE0 : FD; + 1FE1 : E7; + 1FE2 : C6; + 1FE3 : 80; + 1FE4 : 31; + 1FE5 : 72; + 1FE6 : 18; + 1FE7 : 10; + 1FE8 : 81; + [1FE9..1FEC] : 00; + 1FED : A9; + 1FEE : BF; + 1FEF : A0; + 1FF0 : BF; + 1FF1 : 20; + 1FF2 : 28; + 1FF3 : BA; + 1FF4 : A5; + 1FF5 : 70; + 1FF6 : 69; + 1FF7 : 50; + 1FF8 : 90; + 1FF9 : 03; + 1FFA : 20; + 1FFB : 23; + 1FFC : BC; + 1FFD : 4C; + 1FFE : 00; + 1FFF : E0; + 2000 : 85; + 2001 : 56; + 2002 : 20; + 2003 : 0F; + 2004 : BC; + 2005 : A5; + 2006 : 61; + 2007 : C9; + 2008 : 88; + 2009 : 90; + 200A : 03; + 200B : 20; + 200C : D4; + 200D : BA; + 200E : 20; + 200F : CC; + 2010 : BC; + 2011 : A5; + 2012 : 07; + 2013 : 18; + 2014 : 69; + 2015 : 81; + 2016 : F0; + 2017 : F3; + 2018 : 38; + 2019 : E9; + 201A : 01; + 201B : 48; + 201C : A2; + 201D : 05; + 201E : B5; + 201F : 69; + 2020 : B4; + 2021 : 61; + 2022 : 95; + 2023 : 61; + 2024 : 94; + 2025 : 69; + 2026 : CA; + 2027 : 10; + 2028 : F5; + 2029 : A5; + 202A : 56; + 202B : 85; + 202C : 70; + 202D : 20; + 202E : 53; + 202F : B8; + 2030 : 20; + 2031 : B4; + 2032 : BF; + 2033 : A9; + 2034 : C4; + 2035 : A0; + 2036 : BF; + 2037 : 20; + 2038 : 59; + 2039 : E0; + 203A : A9; + 203B : 00; + 203C : 85; + 203D : 6F; + 203E : 68; + 203F : 20; + 2040 : B9; + 2041 : BA; + 2042 : 60; + 2043 : 85; + 2044 : 71; + 2045 : 84; + 2046 : 72; + 2047 : 20; + 2048 : CA; + 2049 : BB; + 204A : A9; + 204B : 57; + 204C : 20; + 204D : 28; + 204E : BA; + 204F : 20; + 2050 : 5D; + 2051 : E0; + 2052 : A9; + 2053 : 57; + 2054 : A0; + 2055 : 00; + 2056 : 4C; + 2057 : 28; + 2058 : BA; + 2059 : 85; + 205A : 71; + 205B : 84; + 205C : 72; + 205D : 20; + 205E : C7; + 205F : BB; + 2060 : B1; + 2061 : 71; + 2062 : 85; + 2063 : 67; + 2064 : A4; + 2065 : 71; + 2066 : C8; + 2067 : 98; + 2068 : D0; + 2069 : 02; + 206A : E6; + 206B : 72; + 206C : 85; + 206D : 71; + 206E : A4; + 206F : 72; + 2070 : 20; + 2071 : 28; + 2072 : BA; + 2073 : A5; + 2074 : 71; + 2075 : A4; + 2076 : 72; + 2077 : 18; + 2078 : 69; + 2079 : 05; + 207A : 90; + 207B : 01; + 207C : C8; + 207D : 85; + 207E : 71; + 207F : 84; + 2080 : 72; + 2081 : 20; + 2082 : 67; + 2083 : B8; + 2084 : A9; + 2085 : 5C; + 2086 : A0; + 2087 : 00; + 2088 : C6; + 2089 : 67; + 208A : D0; + 208B : E4; + 208C : 60; + 208D : 98; + 208E : 35; + 208F : 44; + 2090 : 7A; + 2091 : 00; + 2092 : 68; + 2093 : 28; + 2094 : B1; + 2095 : 46; + 2096 : 00; + 2097 : 20; + 2098 : 2B; + 2099 : BC; + 209A : 30; + 209B : 37; + 209C : D0; + [209D..209E] : 20; + 209F : F3; + 20A0 : FF; + 20A1 : 86; + 20A2 : 22; + 20A3 : 84; + 20A4 : 23; + 20A5 : A0; + 20A6 : 04; + 20A7 : B1; + 20A8 : 22; + 20A9 : 85; + 20AA : 62; + 20AB : C8; + 20AC : B1; + 20AD : 22; + 20AE : 85; + 20AF : 64; + 20B0 : A0; + 20B1 : 08; + 20B2 : B1; + 20B3 : 22; + 20B4 : 85; + 20B5 : 63; + 20B6 : C8; + 20B7 : B1; + 20B8 : 22; + 20B9 : 85; + 20BA : 65; + 20BB : 4C; + 20BC : E3; + 20BD : E0; + 20BE : A9; + 20BF : 8B; + 20C0 : A0; + 20C1 : 00; + 20C2 : 20; + 20C3 : A2; + 20C4 : BB; + 20C5 : A9; + 20C6 : 8D; + 20C7 : A0; + 20C8 : E0; + 20C9 : 20; + 20CA : 28; + 20CB : BA; + 20CC : A9; + 20CD : 92; + 20CE : A0; + 20CF : E0; + 20D0 : 20; + 20D1 : 67; + 20D2 : B8; + 20D3 : A6; + 20D4 : 65; + 20D5 : A5; + 20D6 : 62; + 20D7 : 85; + 20D8 : 65; + 20D9 : 86; + 20DA : 62; + 20DB : A6; + 20DC : 63; + 20DD : A5; + 20DE : 64; + 20DF : 85; + 20E0 : 63; + 20E1 : 86; + 20E2 : 64; + 20E3 : A9; + 20E4 : 00; + 20E5 : 85; + 20E6 : 66; + 20E7 : A5; + 20E8 : 61; + 20E9 : 85; + 20EA : 70; + 20EB : A9; + 20EC : 80; + 20ED : 85; + 20EE : 61; + 20EF : 20; + 20F0 : D7; + 20F1 : B8; + 20F2 : A2; + 20F3 : 8B; + 20F4 : A0; + 20F5 : 00; + 20F6 : 4C; + 20F7 : D4; + 20F8 : BB; + 20F9 : C9; + 20FA : F0; + 20FB : D0; + 20FC : 07; + 20FD : 84; + 20FE : 38; + 20FF : 86; + 2100 : 37; + 2101 : 4C; + 2102 : 63; + 2103 : A6; + 2104 : AA; + 2105 : D0; + 2106 : 02; + 2107 : A2; + 2108 : 1E; + 2109 : 4C; + 210A : 37; + 210B : A4; + 210C : 20; + 210D : D2; + 210E : FF; + 210F : B0; + 2110 : E8; + 2111 : 60; + 2112 : 20; + 2113 : CF; + 2114 : FF; + 2115 : B0; + 2116 : E2; + 2117 : 60; + 2118 : 20; + 2119 : AD; + 211A : E4; + 211B : B0; + 211C : DC; + 211D : 60; + 211E : 20; + 211F : C6; + 2120 : FF; + 2121 : B0; + 2122 : D6; + 2123 : 60; + 2124 : 20; + 2125 : E4; + 2126 : FF; + 2127 : B0; + 2128 : D0; + 2129 : 60; + 212A : 20; + 212B : 8A; + 212C : AD; + 212D : 20; + 212E : F7; + 212F : B7; + 2130 : A9; + 2131 : E1; + 2132 : 48; + 2133 : A9; + 2134 : 46; + 2135 : 48; + 2136 : AD; + 2137 : 0F; + 2138 : 03; + 2139 : 48; + 213A : AD; + 213B : 0C; + 213C : 03; + 213D : AE; + 213E : 0D; + 213F : 03; + 2140 : AC; + 2141 : 0E; + 2142 : 03; + 2143 : 28; + 2144 : 6C; + 2145 : 14; + 2146 : 00; + 2147 : 08; + 2148 : 8D; + 2149 : 0C; + 214A : 03; + 214B : 8E; + 214C : 0D; + 214D : 03; + 214E : 8C; + 214F : 0E; + 2150 : 03; + 2151 : 68; + 2152 : 8D; + 2153 : 0F; + 2154 : 03; + 2155 : 60; + 2156 : 20; + 2157 : D4; + 2158 : E1; + 2159 : A6; + 215A : 2D; + 215B : A4; + 215C : 2E; + 215D : A9; + 215E : 2B; + 215F : 20; + 2160 : D8; + 2161 : FF; + 2162 : B0; + 2163 : 95; + 2164 : 60; + 2165 : A9; + 2166 : 01; + 2167 : 2C; + 2168 : A9; + 2169 : 00; + 216A : 85; + 216B : 0A; + 216C : 20; + 216D : D4; + 216E : E1; + 216F : A5; + 2170 : 0A; + 2171 : A6; + 2172 : 2B; + 2173 : A4; + 2174 : 2C; + 2175 : 20; + 2176 : D5; + 2177 : FF; + 2178 : B0; + 2179 : 57; + 217A : A5; + 217B : 0A; + 217C : F0; + 217D : 17; + 217E : A2; + 217F : 1C; + 2180 : 20; + 2181 : B7; + 2182 : FF; + 2183 : 29; + 2184 : 10; + 2185 : D0; + 2186 : 17; + 2187 : A5; + 2188 : 7A; + 2189 : C9; + 218A : 02; + 218B : F0; + 218C : 07; + 218D : A9; + 218E : 64; + 218F : A0; + 2190 : A3; + 2191 : 4C; + 2192 : 1E; + 2193 : AB; + 2194 : 60; + 2195 : 20; + 2196 : B7; + 2197 : FF; + 2198 : 29; + 2199 : BF; + 219A : F0; + 219B : 05; + 219C : A2; + 219D : 1D; + 219E : 4C; + 219F : 37; + 21A0 : A4; + 21A1 : A5; + 21A2 : 7B; + 21A3 : C9; + 21A4 : 02; + 21A5 : D0; + 21A6 : 0E; + 21A7 : 86; + 21A8 : 2D; + 21A9 : 84; + 21AA : 2E; + 21AB : A9; + 21AC : 76; + 21AD : A0; + 21AE : A3; + 21AF : 20; + 21B0 : 1E; + 21B1 : AB; + 21B2 : 4C; + 21B3 : 2A; + 21B4 : A5; + 21B5 : 20; + 21B6 : 8E; + 21B7 : A6; + 21B8 : 20; + 21B9 : 33; + 21BA : A5; + 21BB : 4C; + 21BC : 77; + 21BD : A6; + 21BE : 20; + 21BF : 19; + 21C0 : E2; + 21C1 : 20; + 21C2 : C0; + 21C3 : FF; + 21C4 : B0; + 21C5 : 0B; + 21C6 : 60; + 21C7 : 20; + 21C8 : 19; + 21C9 : E2; + 21CA : A5; + 21CB : 49; + 21CC : 20; + 21CD : C3; + 21CE : FF; + 21CF : 90; + 21D0 : C3; + 21D1 : 4C; + 21D2 : F9; + 21D3 : E0; + 21D4 : A9; + 21D5 : 00; + 21D6 : 20; + 21D7 : BD; + 21D8 : FF; + 21D9 : A2; + 21DA : 01; + 21DB : A0; + 21DC : 00; + 21DD : 20; + 21DE : BA; + 21DF : FF; + 21E0 : 20; + 21E1 : 06; + 21E2 : E2; + 21E3 : 20; + 21E4 : 57; + 21E5 : E2; + 21E6 : 20; + 21E7 : 06; + 21E8 : E2; + 21E9 : 20; + 21EA : 00; + 21EB : E2; + 21EC : A0; + 21ED : 00; + 21EE : 86; + 21EF : 49; + 21F0 : 20; + 21F1 : BA; + 21F2 : FF; + 21F3 : 20; + 21F4 : 06; + 21F5 : E2; + 21F6 : 20; + 21F7 : 00; + 21F8 : E2; + 21F9 : 8A; + 21FA : A8; + 21FB : A6; + 21FC : 49; + 21FD : 4C; + 21FE : BA; + 21FF : FF; + 2200 : 20; + 2201 : 0E; + 2202 : E2; + 2203 : 4C; + 2204 : 9E; + 2205 : B7; + 2206 : 20; + 2207 : 79; + 2208 : 00; + 2209 : D0; + 220A : 02; + [220B..220C] : 68; + 220D : 60; + 220E : 20; + 220F : FD; + 2210 : AE; + 2211 : 20; + 2212 : 79; + 2213 : 00; + 2214 : D0; + 2215 : F7; + 2216 : 4C; + 2217 : 08; + 2218 : AF; + 2219 : A9; + 221A : 00; + 221B : 20; + 221C : BD; + 221D : FF; + 221E : 20; + 221F : 11; + 2220 : E2; + 2221 : 20; + 2222 : 9E; + 2223 : B7; + 2224 : 86; + 2225 : 49; + 2226 : 8A; + 2227 : A2; + 2228 : 01; + 2229 : A0; + 222A : 00; + 222B : 20; + 222C : BA; + 222D : FF; + 222E : 20; + 222F : 06; + 2230 : E2; + 2231 : 20; + 2232 : 00; + 2233 : E2; + 2234 : 86; + 2235 : 4A; + 2236 : A0; + 2237 : 00; + 2238 : A5; + 2239 : 49; + 223A : E0; + 223B : 03; + 223C : 90; + 223D : 01; + 223E : 88; + 223F : 20; + 2240 : BA; + 2241 : FF; + 2242 : 20; + 2243 : 06; + 2244 : E2; + 2245 : 20; + 2246 : 00; + 2247 : E2; + 2248 : 8A; + 2249 : A8; + 224A : A6; + 224B : 4A; + 224C : A5; + 224D : 49; + 224E : 20; + 224F : BA; + 2250 : FF; + 2251 : 20; + 2252 : 06; + 2253 : E2; + 2254 : 20; + 2255 : 0E; + 2256 : E2; + 2257 : 20; + 2258 : 9E; + 2259 : AD; + 225A : 20; + 225B : A3; + 225C : B6; + 225D : A6; + 225E : 22; + 225F : A4; + 2260 : 23; + 2261 : 4C; + 2262 : BD; + 2263 : FF; + 2264 : A9; + 2265 : E0; + 2266 : A0; + 2267 : E2; + 2268 : 20; + 2269 : 67; + 226A : B8; + 226B : 20; + 226C : 0C; + 226D : BC; + 226E : A9; + 226F : E5; + 2270 : A0; + 2271 : E2; + 2272 : A6; + 2273 : 6E; + 2274 : 20; + 2275 : 07; + 2276 : BB; + 2277 : 20; + 2278 : 0C; + 2279 : BC; + 227A : 20; + 227B : CC; + 227C : BC; + 227D : A9; + 227E : 00; + 227F : 85; + 2280 : 6F; + 2281 : 20; + 2282 : 53; + 2283 : B8; + 2284 : A9; + 2285 : EA; + 2286 : A0; + 2287 : E2; + 2288 : 20; + 2289 : 50; + 228A : B8; + 228B : A5; + 228C : 66; + 228D : 48; + 228E : 10; + 228F : 0D; + 2290 : 20; + 2291 : 49; + 2292 : B8; + 2293 : A5; + 2294 : 66; + 2295 : 30; + 2296 : 09; + 2297 : A5; + 2298 : 12; + 2299 : 49; + 229A : FF; + 229B : 85; + 229C : 12; + 229D : 20; + 229E : B4; + 229F : BF; + 22A0 : A9; + 22A1 : EA; + 22A2 : A0; + 22A3 : E2; + 22A4 : 20; + 22A5 : 67; + 22A6 : B8; + 22A7 : 68; + 22A8 : 10; + 22A9 : 03; + 22AA : 20; + 22AB : B4; + 22AC : BF; + 22AD : A9; + 22AE : EF; + 22AF : A0; + 22B0 : E2; + 22B1 : 4C; + 22B2 : 43; + 22B3 : E0; + 22B4 : 20; + 22B5 : CA; + 22B6 : BB; + 22B7 : A9; + 22B8 : 00; + 22B9 : 85; + 22BA : 12; + 22BB : 20; + 22BC : 6B; + 22BD : E2; + 22BE : A2; + 22BF : 4E; + 22C0 : A0; + 22C1 : 00; + 22C2 : 20; + 22C3 : F6; + 22C4 : E0; + 22C5 : A9; + 22C6 : 57; + 22C7 : A0; + 22C8 : 00; + 22C9 : 20; + 22CA : A2; + 22CB : BB; + 22CC : A9; + 22CD : 00; + 22CE : 85; + 22CF : 66; + 22D0 : A5; + 22D1 : 12; + 22D2 : 20; + 22D3 : DC; + 22D4 : E2; + 22D5 : A9; + 22D6 : 4E; + 22D7 : A0; + 22D8 : 00; + 22D9 : 4C; + 22DA : 0F; + 22DB : BB; + 22DC : 48; + 22DD : 4C; + 22DE : 9D; + 22DF : E2; + 22E0 : 81; + 22E1 : 49; + 22E2 : 0F; + 22E3 : DA; + 22E4 : A2; + 22E5 : 83; + 22E6 : 49; + 22E7 : 0F; + 22E8 : DA; + 22E9 : A2; + 22EA : 7F; + [22EB..22EE] : 00; + 22EF : 05; + 22F0 : 84; + 22F1 : E6; + 22F2 : 1A; + 22F3 : 2D; + 22F4 : 1B; + 22F5 : 86; + 22F6 : 28; + 22F7 : 07; + 22F8 : FB; + 22F9 : F8; + 22FA : 87; + 22FB : 99; + 22FC : 68; + 22FD : 89; + 22FE : 01; + 22FF : 87; + 2300 : 23; + 2301 : 35; + 2302 : DF; + 2303 : E1; + 2304 : 86; + 2305 : A5; + 2306 : 5D; + 2307 : E7; + 2308 : 28; + 2309 : 83; + 230A : 49; + 230B : 0F; + 230C : DA; + 230D : A2; + 230E : A5; + 230F : 66; + 2310 : 48; + 2311 : 10; + 2312 : 03; + 2313 : 20; + 2314 : B4; + 2315 : BF; + 2316 : A5; + 2317 : 61; + 2318 : 48; + 2319 : C9; + 231A : 81; + 231B : 90; + 231C : 07; + 231D : A9; + 231E : BC; + 231F : A0; + 2320 : B9; + 2321 : 20; + 2322 : 0F; + 2323 : BB; + 2324 : A9; + 2325 : 3E; + 2326 : A0; + 2327 : E3; + 2328 : 20; + 2329 : 43; + 232A : E0; + 232B : 68; + 232C : C9; + 232D : 81; + 232E : 90; + 232F : 07; + 2330 : A9; + 2331 : E0; + 2332 : A0; + 2333 : E2; + 2334 : 20; + 2335 : 50; + 2336 : B8; + 2337 : 68; + 2338 : 10; + 2339 : 03; + 233A : 4C; + 233B : B4; + 233C : BF; + 233D : 60; + 233E : 0B; + 233F : 76; + 2340 : B3; + 2341 : 83; + 2342 : BD; + 2343 : D3; + 2344 : 79; + 2345 : 1E; + 2346 : F4; + 2347 : A6; + 2348 : F5; + 2349 : 7B; + 234A : 83; + 234B : FC; + 234C : B0; + 234D : 10; + 234E : 7C; + 234F : 0C; + 2350 : 1F; + 2351 : 67; + 2352 : CA; + 2353 : 7C; + 2354 : DE; + 2355 : 53; + 2356 : CB; + 2357 : C1; + 2358 : 7D; + 2359 : 14; + 235A : 64; + 235B : 70; + 235C : 4C; + 235D : 7D; + 235E : B7; + 235F : EA; + 2360 : 51; + 2361 : 7A; + 2362 : 7D; + 2363 : 63; + 2364 : 30; + 2365 : 88; + [2366..2367] : 7E; + 2368 : 92; + 2369 : 44; + 236A : 99; + 236B : 3A; + 236C : 7E; + 236D : 4C; + 236E : CC; + 236F : 91; + 2370 : C7; + 2371 : 7F; + [2372..2374] : AA; + 2375 : 13; + 2376 : 81; + [2377..237A] : 00; + 237B : 20; + 237C : CC; + 237D : FF; + 237E : A9; + 237F : 00; + 2380 : 85; + 2381 : 13; + 2382 : 20; + 2383 : 7A; + 2384 : A6; + 2385 : 58; + 2386 : A2; + 2387 : 80; + 2388 : 6C; + 2389 : 00; + 238A : 03; + 238B : 8A; + 238C : 30; + 238D : 03; + 238E : 4C; + 238F : 3A; + 2390 : A4; + 2391 : 4C; + 2392 : 74; + 2393 : A4; + 2394 : 20; + 2395 : 53; + 2396 : E4; + 2397 : 20; + 2398 : BF; + 2399 : E3; + 239A : 20; + 239B : 22; + 239C : E4; + 239D : A2; + 239E : FB; + 239F : 9A; + 23A0 : D0; + 23A1 : E4; + 23A2 : E6; + 23A3 : 7A; + 23A4 : D0; + 23A5 : 02; + 23A6 : E6; + 23A7 : 7B; + 23A8 : AD; + 23A9 : 60; + 23AA : EA; + 23AB : C9; + 23AC : 3A; + 23AD : B0; + 23AE : 0A; + 23AF : C9; + 23B0 : 20; + 23B1 : F0; + 23B2 : EF; + 23B3 : 38; + 23B4 : E9; + 23B5 : 30; + 23B6 : 38; + 23B7 : E9; + 23B8 : D0; + 23B9 : 60; + 23BA : 80; + 23BB : 4F; + 23BC : C7; + 23BD : 52; + 23BE : 58; + 23BF : A9; + 23C0 : 4C; + 23C1 : 85; + 23C2 : 54; + 23C3 : 8D; + 23C4 : 10; + 23C5 : 03; + 23C6 : A9; + 23C7 : 48; + 23C8 : A0; + 23C9 : B2; + 23CA : 8D; + 23CB : 11; + 23CC : 03; + 23CD : 8C; + 23CE : 12; + 23CF : 03; + 23D0 : A9; + 23D1 : 91; + 23D2 : A0; + 23D3 : B3; + 23D4 : 85; + 23D5 : 05; + 23D6 : 84; + 23D7 : 06; + 23D8 : A9; + 23D9 : AA; + 23DA : A0; + 23DB : B1; + 23DC : 85; + 23DD : 03; + 23DE : 84; + 23DF : 04; + 23E0 : A2; + 23E1 : 1C; + 23E2 : BD; + 23E3 : A2; + 23E4 : E3; + 23E5 : 95; + 23E6 : 73; + 23E7 : CA; + 23E8 : 10; + 23E9 : F8; + 23EA : A9; + 23EB : 03; + 23EC : 85; + 23ED : 53; + 23EE : A9; + 23EF : 00; + 23F0 : 85; + 23F1 : 68; + 23F2 : 85; + 23F3 : 13; + 23F4 : 85; + 23F5 : 18; + 23F6 : A2; + 23F7 : 01; + 23F8 : 8E; + 23F9 : FD; + 23FA : 01; + 23FB : 8E; + 23FC : FC; + 23FD : 01; + 23FE : A2; + 23FF : 19; + 2400 : 86; + 2401 : 16; + 2402 : 38; + 2403 : 20; + 2404 : 9C; + 2405 : FF; + 2406 : 86; + 2407 : 2B; + 2408 : 84; + 2409 : 2C; + 240A : 38; + 240B : 20; + 240C : 99; + 240D : FF; + 240E : 86; + 240F : 37; + 2410 : 84; + 2411 : 38; + 2412 : 86; + 2413 : 33; + 2414 : 84; + 2415 : 34; + 2416 : A0; + 2417 : 00; + 2418 : 98; + 2419 : 91; + 241A : 2B; + 241B : E6; + 241C : 2B; + 241D : D0; + 241E : 02; + 241F : E6; + 2420 : 2C; + 2421 : 60; + 2422 : A5; + 2423 : 2B; + 2424 : A4; + 2425 : 2C; + 2426 : 20; + 2427 : 08; + 2428 : A4; + 2429 : A9; + 242A : 73; + 242B : A0; + 242C : E4; + 242D : 20; + 242E : 1E; + 242F : AB; + 2430 : A5; + 2431 : 37; + 2432 : 38; + 2433 : E5; + 2434 : 2B; + 2435 : AA; + 2436 : A5; + 2437 : 38; + 2438 : E5; + 2439 : 2C; + 243A : 20; + 243B : CD; + 243C : BD; + 243D : A9; + 243E : 60; + 243F : A0; + 2440 : E4; + 2441 : 20; + 2442 : 1E; + 2443 : AB; + 2444 : 4C; + 2445 : 44; + 2446 : A6; + 2447 : 8B; + 2448 : E3; + 2449 : 83; + 244A : A4; + 244B : 7C; + 244C : A5; + 244D : 1A; + 244E : A7; + 244F : E4; + 2450 : A7; + 2451 : 86; + 2452 : AE; + 2453 : A2; + 2454 : 0B; + 2455 : BD; + 2456 : 47; + 2457 : E4; + 2458 : 9D; + 2459 : 00; + 245A : 03; + 245B : CA; + 245C : 10; + 245D : F7; + 245E : 60; + 245F : 00; + 2460 : 20; + 2461 : 42; + 2462 : 41; + 2463 : 53; + 2464 : 49; + 2465 : 43; + 2466 : 20; + 2467 : 42; + 2468 : 59; + 2469 : 54; + 246A : 45; + 246B : 53; + 246C : 20; + 246D : 46; + 246E : 52; + [246F..2470] : 45; + 2471 : 0D; + 2472 : 00; + 2473 : 93; + 2474 : 0D; + [2475..2478] : 20; + [2479..247C] : 2A; + 247D : 20; + 247E : 43; + 247F : 4F; + [2480..2481] : 4D; + 2482 : 4F; + 2483 : 44; + 2484 : 4F; + 2485 : 52; + 2486 : 45; + 2487 : 20; + 2488 : 36; + 2489 : 34; + 248A : 20; + 248B : 42; + 248C : 41; + 248D : 53; + 248E : 49; + 248F : 43; + 2490 : 20; + 2491 : 56; + 2492 : 32; + 2493 : 20; + [2494..2497] : 2A; + [2498..2499] : 0D; + 249A : 20; + 249B : 36; + 249C : 34; + 249D : 4B; + 249E : 20; + 249F : 52; + 24A0 : 41; + 24A1 : 4D; + 24A2 : 20; + 24A3 : 53; + 24A4 : 59; + 24A5 : 53; + 24A6 : 54; + 24A7 : 45; + 24A8 : 4D; + [24A9..24AA] : 20; + 24AB : 00; + 24AC : 81; + 24AD : 48; + 24AE : 20; + 24AF : C9; + 24B0 : FF; + 24B1 : AA; + 24B2 : 68; + 24B3 : 90; + 24B4 : 01; + 24B5 : 8A; + 24B6 : 60; + [24B7..24D2] : AA; + 24D3 : 85; + [24D4..24D5] : A9; + 24D6 : 01; + 24D7 : 85; + 24D8 : AB; + 24D9 : 60; + 24DA : AD; + 24DB : 86; + 24DC : 02; + 24DD : 91; + 24DE : F3; + 24DF : 60; + 24E0 : 69; + 24E1 : 02; + 24E2 : A4; + 24E3 : 91; + 24E4 : C8; + 24E5 : D0; + 24E6 : 04; + 24E7 : C5; + 24E8 : A1; + 24E9 : D0; + 24EA : F7; + 24EB : 60; + 24EC : 19; + 24ED : 26; + 24EE : 44; + 24EF : 19; + 24F0 : 1A; + 24F1 : 11; + 24F2 : E8; + 24F3 : 0D; + 24F4 : 70; + 24F5 : 0C; + [24F6..24F7] : 06; + 24F8 : D1; + 24F9 : 02; + 24FA : 37; + 24FB : 01; + 24FC : AE; + 24FD : 00; + 24FE : 69; + 24FF : 00; + 2500 : A2; + 2501 : 00; + 2502 : A0; + 2503 : DC; + 2504 : 60; + 2505 : A2; + 2506 : 28; + 2507 : A0; + 2508 : 19; + 2509 : 60; + 250A : B0; + 250B : 07; + 250C : 86; + 250D : D6; + 250E : 84; + 250F : D3; + 2510 : 20; + 2511 : 6C; + 2512 : E5; + 2513 : A6; + 2514 : D6; + 2515 : A4; + 2516 : D3; + 2517 : 60; + 2518 : 20; + 2519 : A0; + 251A : E5; + 251B : A9; + 251C : 00; + 251D : 8D; + 251E : 91; + 251F : 02; + 2520 : 85; + 2521 : CF; + 2522 : A9; + 2523 : 48; + 2524 : 8D; + 2525 : 8F; + 2526 : 02; + 2527 : A9; + 2528 : EB; + 2529 : 8D; + 252A : 90; + 252B : 02; + 252C : A9; + 252D : 0A; + 252E : 8D; + 252F : 89; + 2530 : 02; + 2531 : 8D; + 2532 : 8C; + 2533 : 02; + 2534 : A9; + 2535 : 0E; + 2536 : 8D; + 2537 : 86; + 2538 : 02; + 2539 : A9; + 253A : 04; + 253B : 8D; + 253C : 8B; + 253D : 02; + 253E : A9; + 253F : 0C; + 2540 : 85; + 2541 : CD; + 2542 : 85; + 2543 : CC; + 2544 : AD; + 2545 : 88; + 2546 : 02; + 2547 : 09; + 2548 : 80; + 2549 : A8; + 254A : A9; + 254B : 00; + 254C : AA; + 254D : 94; + 254E : D9; + 254F : 18; + 2550 : 69; + 2551 : 28; + 2552 : 90; + 2553 : 01; + 2554 : C8; + 2555 : E8; + 2556 : E0; + 2557 : 1A; + 2558 : D0; + 2559 : F3; + 255A : A9; + 255B : FF; + 255C : 95; + 255D : D9; + 255E : A2; + 255F : 18; + 2560 : 20; + 2561 : FF; + 2562 : E9; + 2563 : CA; + 2564 : 10; + 2565 : FA; + 2566 : A0; + 2567 : 00; + 2568 : 84; + 2569 : D3; + 256A : 84; + 256B : D6; + 256C : A6; + 256D : D6; + 256E : A5; + 256F : D3; + 2570 : B4; + 2571 : D9; + 2572 : 30; + 2573 : 08; + 2574 : 18; + 2575 : 69; + 2576 : 28; + 2577 : 85; + 2578 : D3; + 2579 : CA; + 257A : 10; + 257B : F4; + 257C : 20; + 257D : F0; + 257E : E9; + 257F : A9; + 2580 : 27; + 2581 : E8; + 2582 : B4; + 2583 : D9; + 2584 : 30; + 2585 : 06; + 2586 : 18; + 2587 : 69; + 2588 : 28; + 2589 : E8; + 258A : 10; + 258B : F6; + 258C : 85; + 258D : D5; + 258E : 4C; + 258F : 24; + 2590 : EA; + 2591 : E4; + 2592 : C9; + 2593 : F0; + 2594 : 03; + 2595 : 4C; + 2596 : ED; + 2597 : E6; + 2598 : 60; + 2599 : EA; + 259A : 20; + 259B : A0; + 259C : E5; + 259D : 4C; + 259E : 66; + 259F : E5; + 25A0 : A9; + 25A1 : 03; + 25A2 : 85; + 25A3 : 9A; + 25A4 : A9; + 25A5 : 00; + 25A6 : 85; + 25A7 : 99; + 25A8 : A2; + 25A9 : 2F; + 25AA : BD; + 25AB : B8; + 25AC : EC; + 25AD : 9D; + 25AE : FF; + 25AF : CF; + 25B0 : CA; + 25B1 : D0; + 25B2 : F7; + 25B3 : 60; + 25B4 : AC; + 25B5 : 77; + 25B6 : 02; + 25B7 : A2; + 25B8 : 00; + 25B9 : BD; + 25BA : 78; + 25BB : 02; + 25BC : 9D; + 25BD : 77; + 25BE : 02; + 25BF : E8; + 25C0 : E4; + 25C1 : C6; + 25C2 : D0; + 25C3 : F5; + [25C4..25C5] : C6; + 25C6 : 98; + 25C7 : 58; + 25C8 : 18; + 25C9 : 60; + 25CA : 20; + 25CB : 16; + 25CC : E7; + 25CD : A5; + 25CE : C6; + 25CF : 85; + 25D0 : CC; + 25D1 : 8D; + 25D2 : 92; + 25D3 : 02; + 25D4 : F0; + 25D5 : F7; + 25D6 : 78; + 25D7 : A5; + 25D8 : CF; + 25D9 : F0; + 25DA : 0C; + 25DB : A5; + 25DC : CE; + 25DD : AE; + 25DE : 87; + 25DF : 02; + 25E0 : A0; + 25E1 : 00; + 25E2 : 84; + 25E3 : CF; + 25E4 : 20; + 25E5 : 13; + 25E6 : EA; + 25E7 : 20; + 25E8 : B4; + 25E9 : E5; + 25EA : C9; + 25EB : 83; + 25EC : D0; + 25ED : 10; + 25EE : A2; + 25EF : 09; + 25F0 : 78; + 25F1 : 86; + 25F2 : C6; + 25F3 : BD; + 25F4 : E6; + 25F5 : EC; + 25F6 : 9D; + 25F7 : 76; + 25F8 : 02; + 25F9 : CA; + 25FA : D0; + 25FB : F7; + 25FC : F0; + 25FD : CF; + 25FE : C9; + 25FF : 0D; + 2600 : D0; + 2601 : C8; + 2602 : A4; + 2603 : D5; + 2604 : 84; + 2605 : D0; + 2606 : B1; + 2607 : D1; + 2608 : C9; + 2609 : 20; + 260A : D0; + 260B : 03; + 260C : 88; + 260D : D0; + 260E : F7; + 260F : C8; + 2610 : 84; + 2611 : C8; + 2612 : A0; + 2613 : 00; + 2614 : 8C; + 2615 : 92; + 2616 : 02; + 2617 : 84; + 2618 : D3; + 2619 : 84; + 261A : D4; + 261B : A5; + 261C : C9; + 261D : 30; + 261E : 1B; + 261F : A6; + 2620 : D6; + 2621 : 20; + 2622 : 91; + 2623 : E5; + 2624 : E4; + 2625 : C9; + 2626 : D0; + 2627 : 12; + 2628 : A5; + 2629 : CA; + 262A : 85; + 262B : D3; + 262C : C5; + 262D : C8; + 262E : 90; + 262F : 0A; + 2630 : B0; + 2631 : 2B; + 2632 : 98; + 2633 : 48; + 2634 : 8A; + 2635 : 48; + 2636 : A5; + 2637 : D0; + 2638 : F0; + 2639 : 93; + 263A : A4; + 263B : D3; + 263C : B1; + 263D : D1; + 263E : 85; + 263F : D7; + 2640 : 29; + 2641 : 3F; + 2642 : 06; + 2643 : D7; + 2644 : 24; + 2645 : D7; + 2646 : 10; + 2647 : 02; + 2648 : 09; + 2649 : 80; + 264A : 90; + 264B : 04; + 264C : A6; + 264D : D4; + 264E : D0; + 264F : 04; + 2650 : 70; + 2651 : 02; + 2652 : 09; + 2653 : 40; + 2654 : E6; + 2655 : D3; + 2656 : 20; + 2657 : 84; + 2658 : E6; + 2659 : C4; + 265A : C8; + 265B : D0; + 265C : 17; + 265D : A9; + 265E : 00; + 265F : 85; + 2660 : D0; + 2661 : A9; + 2662 : 0D; + 2663 : A6; + 2664 : 99; + 2665 : E0; + 2666 : 03; + 2667 : F0; + 2668 : 06; + 2669 : A6; + 266A : 9A; + 266B : E0; + 266C : 03; + 266D : F0; + 266E : 03; + 266F : 20; + 2670 : 16; + 2671 : E7; + 2672 : A9; + 2673 : 0D; + 2674 : 85; + 2675 : D7; + 2676 : 68; + 2677 : AA; + 2678 : 68; + 2679 : A8; + 267A : A5; + 267B : D7; + 267C : C9; + 267D : DE; + 267E : D0; + 267F : 02; + 2680 : A9; + 2681 : FF; + 2682 : 18; + 2683 : 60; + 2684 : C9; + 2685 : 22; + 2686 : D0; + 2687 : 08; + 2688 : A5; + 2689 : D4; + 268A : 49; + 268B : 01; + 268C : 85; + 268D : D4; + 268E : A9; + 268F : 22; + 2690 : 60; + 2691 : 09; + 2692 : 40; + 2693 : A6; + 2694 : C7; + 2695 : F0; + 2696 : 02; + 2697 : 09; + 2698 : 80; + 2699 : A6; + 269A : D8; + 269B : F0; + 269C : 02; + 269D : C6; + 269E : D8; + 269F : AE; + 26A0 : 86; + 26A1 : 02; + 26A2 : 20; + 26A3 : 13; + 26A4 : EA; + 26A5 : 20; + 26A6 : B6; + 26A7 : E6; + 26A8 : 68; + 26A9 : A8; + 26AA : A5; + 26AB : D8; + 26AC : F0; + 26AD : 02; + 26AE : 46; + 26AF : D4; + 26B0 : 68; + 26B1 : AA; + 26B2 : 68; + 26B3 : 18; + 26B4 : 58; + 26B5 : 60; + 26B6 : 20; + 26B7 : B3; + 26B8 : E8; + 26B9 : E6; + 26BA : D3; + 26BB : A5; + 26BC : D5; + 26BD : C5; + 26BE : D3; + 26BF : B0; + 26C0 : 3F; + 26C1 : C9; + 26C2 : 4F; + 26C3 : F0; + 26C4 : 32; + 26C5 : AD; + 26C6 : 92; + 26C7 : 02; + 26C8 : F0; + 26C9 : 03; + 26CA : 4C; + 26CB : 67; + 26CC : E9; + 26CD : A6; + 26CE : D6; + 26CF : E0; + 26D0 : 19; + 26D1 : 90; + 26D2 : 07; + 26D3 : 20; + 26D4 : EA; + 26D5 : E8; + 26D6 : C6; + 26D7 : D6; + 26D8 : A6; + 26D9 : D6; + 26DA : 16; + 26DB : D9; + 26DC : 56; + 26DD : D9; + 26DE : E8; + 26DF : B5; + 26E0 : D9; + 26E1 : 09; + 26E2 : 80; + 26E3 : 95; + 26E4 : D9; + 26E5 : CA; + 26E6 : A5; + 26E7 : D5; + 26E8 : 18; + 26E9 : 69; + 26EA : 28; + 26EB : 85; + 26EC : D5; + 26ED : B5; + 26EE : D9; + 26EF : 30; + 26F0 : 03; + 26F1 : CA; + 26F2 : D0; + 26F3 : F9; + 26F4 : 4C; + 26F5 : F0; + 26F6 : E9; + 26F7 : C6; + 26F8 : D6; + 26F9 : 20; + 26FA : 7C; + 26FB : E8; + 26FC : A9; + 26FD : 00; + 26FE : 85; + 26FF : D3; + 2700 : 60; + 2701 : A6; + 2702 : D6; + 2703 : D0; + 2704 : 06; + 2705 : 86; + 2706 : D3; + [2707..2708] : 68; + 2709 : D0; + 270A : 9D; + 270B : CA; + 270C : 86; + 270D : D6; + 270E : 20; + 270F : 6C; + 2710 : E5; + 2711 : A4; + 2712 : D5; + 2713 : 84; + 2714 : D3; + 2715 : 60; + 2716 : 48; + 2717 : 85; + 2718 : D7; + 2719 : 8A; + 271A : 48; + 271B : 98; + 271C : 48; + 271D : A9; + 271E : 00; + 271F : 85; + 2720 : D0; + 2721 : A4; + 2722 : D3; + 2723 : A5; + 2724 : D7; + 2725 : 10; + 2726 : 03; + 2727 : 4C; + 2728 : D4; + 2729 : E7; + 272A : C9; + 272B : 0D; + 272C : D0; + 272D : 03; + 272E : 4C; + 272F : 91; + 2730 : E8; + 2731 : C9; + 2732 : 20; + 2733 : 90; + 2734 : 10; + 2735 : C9; + 2736 : 60; + 2737 : 90; + 2738 : 04; + 2739 : 29; + 273A : DF; + 273B : D0; + 273C : 02; + 273D : 29; + 273E : 3F; + 273F : 20; + 2740 : 84; + 2741 : E6; + 2742 : 4C; + 2743 : 93; + 2744 : E6; + 2745 : A6; + 2746 : D8; + 2747 : F0; + 2748 : 03; + 2749 : 4C; + 274A : 97; + 274B : E6; + 274C : C9; + 274D : 14; + 274E : D0; + 274F : 2E; + 2750 : 98; + 2751 : D0; + 2752 : 06; + 2753 : 20; + 2754 : 01; + 2755 : E7; + 2756 : 4C; + 2757 : 73; + 2758 : E7; + 2759 : 20; + 275A : A1; + 275B : E8; + 275C : 88; + 275D : 84; + 275E : D3; + 275F : 20; + 2760 : 24; + 2761 : EA; + 2762 : C8; + 2763 : B1; + 2764 : D1; + 2765 : 88; + 2766 : 91; + 2767 : D1; + 2768 : C8; + 2769 : B1; + 276A : F3; + 276B : 88; + 276C : 91; + 276D : F3; + 276E : C8; + 276F : C4; + 2770 : D5; + 2771 : D0; + 2772 : EF; + 2773 : A9; + 2774 : 20; + 2775 : 91; + 2776 : D1; + 2777 : AD; + 2778 : 86; + 2779 : 02; + 277A : 91; + 277B : F3; + 277C : 10; + 277D : 4D; + 277E : A6; + 277F : D4; + 2780 : F0; + 2781 : 03; + 2782 : 4C; + 2783 : 97; + 2784 : E6; + 2785 : C9; + 2786 : 12; + 2787 : D0; + 2788 : 02; + 2789 : 85; + 278A : C7; + 278B : C9; + 278C : 13; + 278D : D0; + 278E : 03; + 278F : 20; + 2790 : 66; + 2791 : E5; + 2792 : C9; + 2793 : 1D; + 2794 : D0; + 2795 : 17; + 2796 : C8; + 2797 : 20; + 2798 : B3; + 2799 : E8; + 279A : 84; + 279B : D3; + 279C : 88; + 279D : C4; + 279E : D5; + 279F : 90; + 27A0 : 09; + 27A1 : C6; + 27A2 : D6; + 27A3 : 20; + 27A4 : 7C; + 27A5 : E8; + 27A6 : A0; + 27A7 : 00; + 27A8 : 84; + 27A9 : D3; + 27AA : 4C; + 27AB : A8; + 27AC : E6; + 27AD : C9; + 27AE : 11; + 27AF : D0; + 27B0 : 1D; + 27B1 : 18; + 27B2 : 98; + 27B3 : 69; + 27B4 : 28; + 27B5 : A8; + 27B6 : E6; + 27B7 : D6; + 27B8 : C5; + 27B9 : D5; + 27BA : 90; + 27BB : EC; + 27BC : F0; + 27BD : EA; + 27BE : C6; + 27BF : D6; + 27C0 : E9; + 27C1 : 28; + 27C2 : 90; + 27C3 : 04; + 27C4 : 85; + 27C5 : D3; + 27C6 : D0; + 27C7 : F8; + 27C8 : 20; + 27C9 : 7C; + 27CA : E8; + 27CB : 4C; + 27CC : A8; + 27CD : E6; + 27CE : 20; + 27CF : CB; + 27D0 : E8; + 27D1 : 4C; + 27D2 : 44; + 27D3 : EC; + 27D4 : 29; + 27D5 : 7F; + 27D6 : C9; + 27D7 : 7F; + 27D8 : D0; + 27D9 : 02; + 27DA : A9; + 27DB : 5E; + 27DC : C9; + 27DD : 20; + 27DE : 90; + 27DF : 03; + 27E0 : 4C; + 27E1 : 91; + 27E2 : E6; + 27E3 : C9; + 27E4 : 0D; + 27E5 : D0; + 27E6 : 03; + 27E7 : 4C; + 27E8 : 91; + 27E9 : E8; + 27EA : A6; + 27EB : D4; + 27EC : D0; + 27ED : 3F; + 27EE : C9; + 27EF : 14; + 27F0 : D0; + 27F1 : 37; + 27F2 : A4; + 27F3 : D5; + 27F4 : B1; + 27F5 : D1; + 27F6 : C9; + 27F7 : 20; + 27F8 : D0; + 27F9 : 04; + 27FA : C4; + 27FB : D3; + 27FC : D0; + 27FD : 07; + 27FE : C0; + 27FF : 4F; + 2800 : F0; + 2801 : 24; + 2802 : 20; + 2803 : 65; + 2804 : E9; + 2805 : A4; + 2806 : D5; + 2807 : 20; + 2808 : 24; + 2809 : EA; + 280A : 88; + 280B : B1; + 280C : D1; + 280D : C8; + 280E : 91; + 280F : D1; + 2810 : 88; + 2811 : B1; + 2812 : F3; + 2813 : C8; + 2814 : 91; + 2815 : F3; + 2816 : 88; + 2817 : C4; + 2818 : D3; + 2819 : D0; + 281A : EF; + 281B : A9; + 281C : 20; + 281D : 91; + 281E : D1; + 281F : AD; + 2820 : 86; + 2821 : 02; + 2822 : 91; + 2823 : F3; + 2824 : E6; + 2825 : D8; + 2826 : 4C; + 2827 : A8; + 2828 : E6; + 2829 : A6; + 282A : D8; + 282B : F0; + 282C : 05; + 282D : 09; + 282E : 40; + 282F : 4C; + 2830 : 97; + 2831 : E6; + 2832 : C9; + 2833 : 11; + 2834 : D0; + 2835 : 16; + 2836 : A6; + 2837 : D6; + 2838 : F0; + 2839 : 37; + 283A : C6; + 283B : D6; + 283C : A5; + 283D : D3; + 283E : 38; + 283F : E9; + 2840 : 28; + 2841 : 90; + 2842 : 04; + 2843 : 85; + 2844 : D3; + 2845 : 10; + 2846 : 2A; + 2847 : 20; + 2848 : 6C; + 2849 : E5; + 284A : D0; + 284B : 25; + 284C : C9; + 284D : 12; + 284E : D0; + 284F : 04; + 2850 : A9; + 2851 : 00; + 2852 : 85; + 2853 : C7; + 2854 : C9; + 2855 : 1D; + 2856 : D0; + 2857 : 12; + 2858 : 98; + 2859 : F0; + 285A : 09; + 285B : 20; + 285C : A1; + 285D : E8; + 285E : 88; + 285F : 84; + 2860 : D3; + 2861 : 4C; + 2862 : A8; + 2863 : E6; + 2864 : 20; + 2865 : 01; + 2866 : E7; + 2867 : 4C; + 2868 : A8; + 2869 : E6; + 286A : C9; + 286B : 13; + 286C : D0; + 286D : 06; + 286E : 20; + 286F : 44; + 2870 : E5; + 2871 : 4C; + 2872 : A8; + 2873 : E6; + 2874 : 09; + 2875 : 80; + 2876 : 20; + 2877 : CB; + 2878 : E8; + 2879 : 4C; + 287A : 4F; + 287B : EC; + 287C : 46; + 287D : C9; + 287E : A6; + 287F : D6; + 2880 : E8; + 2881 : E0; + 2882 : 19; + 2883 : D0; + 2884 : 03; + 2885 : 20; + 2886 : EA; + 2887 : E8; + 2888 : B5; + 2889 : D9; + 288A : 10; + 288B : F4; + 288C : 86; + 288D : D6; + 288E : 4C; + 288F : 6C; + 2890 : E5; + 2891 : A2; + 2892 : 00; + 2893 : 86; + 2894 : D8; + 2895 : 86; + 2896 : C7; + 2897 : 86; + 2898 : D4; + 2899 : 86; + 289A : D3; + 289B : 20; + 289C : 7C; + 289D : E8; + 289E : 4C; + 289F : A8; + 28A0 : E6; + 28A1 : A2; + 28A2 : 02; + 28A3 : A9; + 28A4 : 00; + 28A5 : C5; + 28A6 : D3; + 28A7 : F0; + 28A8 : 07; + 28A9 : 18; + 28AA : 69; + 28AB : 28; + 28AC : CA; + 28AD : D0; + 28AE : F6; + 28AF : 60; + 28B0 : C6; + 28B1 : D6; + 28B2 : 60; + 28B3 : A2; + 28B4 : 02; + 28B5 : A9; + 28B6 : 27; + 28B7 : C5; + 28B8 : D3; + 28B9 : F0; + 28BA : 07; + 28BB : 18; + 28BC : 69; + 28BD : 28; + 28BE : CA; + 28BF : D0; + 28C0 : F6; + 28C1 : 60; + 28C2 : A6; + 28C3 : D6; + 28C4 : E0; + 28C5 : 19; + 28C6 : F0; + 28C7 : 02; + 28C8 : E6; + 28C9 : D6; + 28CA : 60; + 28CB : A2; + 28CC : 0F; + 28CD : DD; + 28CE : DA; + 28CF : E8; + 28D0 : F0; + 28D1 : 04; + 28D2 : CA; + 28D3 : 10; + 28D4 : F8; + 28D5 : 60; + 28D6 : 8E; + 28D7 : 86; + 28D8 : 02; + 28D9 : 60; + 28DA : 90; + 28DB : 05; + 28DC : 1C; + 28DD : 9F; + 28DE : 9C; + 28DF : 1E; + 28E0 : 1F; + 28E1 : 9E; + 28E2 : 81; + 28E3 : 95; + 28E4 : 96; + 28E5 : 97; + 28E6 : 98; + 28E7 : 99; + 28E8 : 9A; + 28E9 : 9B; + 28EA : A5; + 28EB : AC; + 28EC : 48; + 28ED : A5; + 28EE : AD; + 28EF : 48; + 28F0 : A5; + 28F1 : AE; + 28F2 : 48; + 28F3 : A5; + 28F4 : AF; + 28F5 : 48; + 28F6 : A2; + 28F7 : FF; + 28F8 : C6; + 28F9 : D6; + 28FA : C6; + 28FB : C9; + 28FC : CE; + 28FD : A5; + 28FE : 02; + 28FF : E8; + 2900 : 20; + 2901 : F0; + 2902 : E9; + 2903 : E0; + 2904 : 18; + 2905 : B0; + 2906 : 0C; + 2907 : BD; + 2908 : F1; + 2909 : EC; + 290A : 85; + 290B : AC; + 290C : B5; + 290D : DA; + 290E : 20; + 290F : C8; + 2910 : E9; + 2911 : 30; + 2912 : EC; + 2913 : 20; + 2914 : FF; + 2915 : E9; + 2916 : A2; + 2917 : 00; + 2918 : B5; + 2919 : D9; + 291A : 29; + 291B : 7F; + 291C : B4; + 291D : DA; + 291E : 10; + 291F : 02; + 2920 : 09; + 2921 : 80; + 2922 : 95; + 2923 : D9; + 2924 : E8; + 2925 : E0; + 2926 : 18; + 2927 : D0; + 2928 : EF; + 2929 : A5; + 292A : F1; + 292B : 09; + 292C : 80; + 292D : 85; + 292E : F1; + 292F : A5; + 2930 : D9; + 2931 : 10; + 2932 : C3; + 2933 : E6; + 2934 : D6; + 2935 : EE; + 2936 : A5; + 2937 : 02; + 2938 : A9; + 2939 : 7F; + 293A : 8D; + 293B : 00; + 293C : DC; + 293D : AD; + 293E : 01; + 293F : DC; + 2940 : C9; + 2941 : FB; + 2942 : 08; + 2943 : A9; + 2944 : 7F; + 2945 : 8D; + 2946 : 00; + 2947 : DC; + 2948 : 28; + 2949 : D0; + 294A : 0B; + 294B : A0; + 294C : 00; + 294D : EA; + 294E : CA; + 294F : D0; + 2950 : FC; + 2951 : 88; + 2952 : D0; + 2953 : F9; + 2954 : 84; + 2955 : C6; + 2956 : A6; + 2957 : D6; + 2958 : 68; + 2959 : 85; + 295A : AF; + 295B : 68; + 295C : 85; + 295D : AE; + 295E : 68; + 295F : 85; + 2960 : AD; + 2961 : 68; + 2962 : 85; + 2963 : AC; + 2964 : 60; + 2965 : A6; + 2966 : D6; + 2967 : E8; + 2968 : B5; + 2969 : D9; + 296A : 10; + 296B : FB; + 296C : 8E; + 296D : A5; + 296E : 02; + 296F : E0; + 2970 : 18; + 2971 : F0; + 2972 : 0E; + 2973 : 90; + 2974 : 0C; + 2975 : 20; + 2976 : EA; + 2977 : E8; + 2978 : AE; + 2979 : A5; + 297A : 02; + 297B : CA; + 297C : C6; + 297D : D6; + 297E : 4C; + 297F : DA; + 2980 : E6; + 2981 : A5; + 2982 : AC; + 2983 : 48; + 2984 : A5; + 2985 : AD; + 2986 : 48; + 2987 : A5; + 2988 : AE; + 2989 : 48; + 298A : A5; + 298B : AF; + 298C : 48; + 298D : A2; + 298E : 19; + 298F : CA; + 2990 : 20; + 2991 : F0; + 2992 : E9; + 2993 : EC; + 2994 : A5; + 2995 : 02; + 2996 : 90; + 2997 : 0E; + 2998 : F0; + 2999 : 0C; + 299A : BD; + 299B : EF; + 299C : EC; + 299D : 85; + 299E : AC; + 299F : B5; + 29A0 : D8; + 29A1 : 20; + 29A2 : C8; + 29A3 : E9; + 29A4 : 30; + 29A5 : E9; + 29A6 : 20; + 29A7 : FF; + 29A8 : E9; + 29A9 : A2; + 29AA : 17; + 29AB : EC; + 29AC : A5; + 29AD : 02; + 29AE : 90; + 29AF : 0F; + 29B0 : B5; + 29B1 : DA; + 29B2 : 29; + 29B3 : 7F; + 29B4 : B4; + 29B5 : D9; + 29B6 : 10; + 29B7 : 02; + 29B8 : 09; + 29B9 : 80; + 29BA : 95; + 29BB : DA; + 29BC : CA; + 29BD : D0; + 29BE : EC; + 29BF : AE; + 29C0 : A5; + 29C1 : 02; + 29C2 : 20; + 29C3 : DA; + 29C4 : E6; + 29C5 : 4C; + 29C6 : 58; + 29C7 : E9; + 29C8 : 29; + 29C9 : 03; + 29CA : 0D; + 29CB : 88; + 29CC : 02; + 29CD : 85; + 29CE : AD; + 29CF : 20; + 29D0 : E0; + 29D1 : E9; + 29D2 : A0; + 29D3 : 27; + 29D4 : B1; + 29D5 : AC; + 29D6 : 91; + 29D7 : D1; + 29D8 : B1; + 29D9 : AE; + 29DA : 91; + 29DB : F3; + 29DC : 88; + 29DD : 10; + 29DE : F5; + 29DF : 60; + 29E0 : 20; + 29E1 : 24; + 29E2 : EA; + 29E3 : A5; + 29E4 : AC; + 29E5 : 85; + 29E6 : AE; + 29E7 : A5; + 29E8 : AD; + 29E9 : 29; + 29EA : 03; + 29EB : 09; + 29EC : D8; + 29ED : 85; + 29EE : AF; + 29EF : 60; + 29F0 : BD; + 29F1 : F0; + 29F2 : EC; + 29F3 : 85; + 29F4 : D1; + 29F5 : B5; + 29F6 : D9; + 29F7 : 29; + 29F8 : 03; + 29F9 : 0D; + 29FA : 88; + 29FB : 02; + 29FC : 85; + 29FD : D2; + 29FE : 60; + 29FF : A0; + 2A00 : 27; + 2A01 : 20; + 2A02 : F0; + 2A03 : E9; + 2A04 : 20; + 2A05 : 24; + 2A06 : EA; + 2A07 : 20; + 2A08 : DA; + 2A09 : E4; + 2A0A : A9; + 2A0B : 20; + 2A0C : 91; + 2A0D : D1; + 2A0E : 88; + 2A0F : 10; + 2A10 : F6; + 2A11 : 60; + 2A12 : EA; + 2A13 : A8; + 2A14 : A9; + 2A15 : 02; + 2A16 : 85; + 2A17 : CD; + 2A18 : 20; + 2A19 : 24; + 2A1A : EA; + 2A1B : 98; + 2A1C : A4; + 2A1D : D3; + 2A1E : 91; + 2A1F : D1; + 2A20 : 8A; + 2A21 : 91; + 2A22 : F3; + 2A23 : 60; + 2A24 : A5; + 2A25 : D1; + 2A26 : 85; + 2A27 : F3; + 2A28 : A5; + 2A29 : D2; + 2A2A : 29; + 2A2B : 03; + 2A2C : 09; + 2A2D : D8; + 2A2E : 85; + 2A2F : F4; + 2A30 : 60; + 2A31 : 20; + 2A32 : EA; + 2A33 : FF; + 2A34 : A5; + 2A35 : CC; + 2A36 : D0; + 2A37 : 29; + 2A38 : C6; + 2A39 : CD; + 2A3A : D0; + 2A3B : 25; + 2A3C : A9; + 2A3D : 14; + 2A3E : 85; + 2A3F : CD; + 2A40 : A4; + 2A41 : D3; + 2A42 : 46; + 2A43 : CF; + 2A44 : AE; + 2A45 : 87; + 2A46 : 02; + 2A47 : B1; + 2A48 : D1; + 2A49 : B0; + 2A4A : 11; + 2A4B : E6; + 2A4C : CF; + 2A4D : 85; + 2A4E : CE; + 2A4F : 20; + 2A50 : 24; + 2A51 : EA; + 2A52 : B1; + 2A53 : F3; + 2A54 : 8D; + 2A55 : 87; + 2A56 : 02; + 2A57 : AE; + 2A58 : 86; + 2A59 : 02; + 2A5A : A5; + 2A5B : CE; + 2A5C : 49; + 2A5D : 80; + 2A5E : 20; + 2A5F : 1C; + 2A60 : EA; + 2A61 : A5; + 2A62 : 01; + 2A63 : 29; + 2A64 : 10; + 2A65 : F0; + 2A66 : 0A; + 2A67 : A0; + 2A68 : 00; + 2A69 : 84; + 2A6A : C0; + 2A6B : A5; + 2A6C : 01; + 2A6D : 09; + 2A6E : 20; + 2A6F : D0; + 2A70 : 08; + 2A71 : A5; + 2A72 : C0; + 2A73 : D0; + 2A74 : 06; + 2A75 : A5; + 2A76 : 01; + 2A77 : 29; + 2A78 : 1F; + 2A79 : 85; + 2A7A : 01; + 2A7B : 20; + 2A7C : 87; + 2A7D : EA; + 2A7E : AD; + 2A7F : 0D; + 2A80 : DC; + 2A81 : 68; + 2A82 : A8; + 2A83 : 68; + 2A84 : AA; + 2A85 : 68; + 2A86 : 40; + 2A87 : A9; + 2A88 : 00; + [2A89..2A8A] : 8D; + 2A8B : 02; + 2A8C : A0; + 2A8D : 40; + 2A8E : 84; + 2A8F : CB; + 2A90 : 8D; + 2A91 : 00; + 2A92 : DC; + 2A93 : AE; + 2A94 : 01; + 2A95 : DC; + 2A96 : E0; + 2A97 : FF; + 2A98 : F0; + 2A99 : 61; + 2A9A : A8; + 2A9B : A9; + 2A9C : 81; + 2A9D : 85; + 2A9E : F5; + 2A9F : A9; + 2AA0 : EB; + 2AA1 : 85; + 2AA2 : F6; + 2AA3 : A9; + 2AA4 : FE; + 2AA5 : 8D; + 2AA6 : 00; + 2AA7 : DC; + 2AA8 : A2; + 2AA9 : 08; + 2AAA : 48; + 2AAB : AD; + 2AAC : 01; + 2AAD : DC; + 2AAE : CD; + 2AAF : 01; + 2AB0 : DC; + 2AB1 : D0; + 2AB2 : F8; + 2AB3 : 4A; + 2AB4 : B0; + 2AB5 : 16; + 2AB6 : 48; + 2AB7 : B1; + 2AB8 : F5; + 2AB9 : C9; + 2ABA : 05; + 2ABB : B0; + 2ABC : 0C; + 2ABD : C9; + 2ABE : 03; + 2ABF : F0; + 2AC0 : 08; + 2AC1 : 0D; + 2AC2 : 8D; + 2AC3 : 02; + [2AC4..2AC5] : 8D; + 2AC6 : 02; + 2AC7 : 10; + 2AC8 : 02; + 2AC9 : 84; + 2ACA : CB; + 2ACB : 68; + 2ACC : C8; + 2ACD : C0; + 2ACE : 41; + 2ACF : B0; + 2AD0 : 0B; + 2AD1 : CA; + 2AD2 : D0; + 2AD3 : DF; + 2AD4 : 38; + 2AD5 : 68; + 2AD6 : 2A; + 2AD7 : 8D; + 2AD8 : 00; + 2AD9 : DC; + 2ADA : D0; + 2ADB : CC; + 2ADC : 68; + 2ADD : 6C; + 2ADE : 8F; + 2ADF : 02; + 2AE0 : A4; + 2AE1 : CB; + 2AE2 : B1; + 2AE3 : F5; + 2AE4 : AA; + 2AE5 : C4; + 2AE6 : C5; + 2AE7 : F0; + 2AE8 : 07; + 2AE9 : A0; + 2AEA : 10; + [2AEB..2AEC] : 8C; + 2AED : 02; + 2AEE : D0; + 2AEF : 36; + 2AF0 : 29; + 2AF1 : 7F; + 2AF2 : 2C; + 2AF3 : 8A; + 2AF4 : 02; + 2AF5 : 30; + 2AF6 : 16; + 2AF7 : 70; + 2AF8 : 49; + 2AF9 : C9; + 2AFA : 7F; + 2AFB : F0; + 2AFC : 29; + 2AFD : C9; + 2AFE : 14; + 2AFF : F0; + 2B00 : 0C; + 2B01 : C9; + 2B02 : 20; + 2B03 : F0; + 2B04 : 08; + 2B05 : C9; + 2B06 : 1D; + 2B07 : F0; + 2B08 : 04; + 2B09 : C9; + 2B0A : 11; + 2B0B : D0; + 2B0C : 35; + 2B0D : AC; + 2B0E : 8C; + 2B0F : 02; + 2B10 : F0; + 2B11 : 05; + 2B12 : CE; + 2B13 : 8C; + 2B14 : 02; + 2B15 : D0; + 2B16 : 2B; + 2B17 : CE; + 2B18 : 8B; + 2B19 : 02; + 2B1A : D0; + 2B1B : 26; + 2B1C : A0; + 2B1D : 04; + 2B1E : 8C; + 2B1F : 8B; + 2B20 : 02; + 2B21 : A4; + 2B22 : C6; + 2B23 : 88; + 2B24 : 10; + 2B25 : 1C; + 2B26 : A4; + 2B27 : CB; + 2B28 : 84; + 2B29 : C5; + 2B2A : AC; + 2B2B : 8D; + 2B2C : 02; + 2B2D : 8C; + 2B2E : 8E; + 2B2F : 02; + 2B30 : E0; + 2B31 : FF; + 2B32 : F0; + 2B33 : 0E; + 2B34 : 8A; + 2B35 : A6; + 2B36 : C6; + 2B37 : EC; + 2B38 : 89; + 2B39 : 02; + 2B3A : B0; + 2B3B : 06; + 2B3C : 9D; + 2B3D : 77; + 2B3E : 02; + 2B3F : E8; + 2B40 : 86; + 2B41 : C6; + 2B42 : A9; + 2B43 : 7F; + 2B44 : 8D; + 2B45 : 00; + 2B46 : DC; + 2B47 : 60; + 2B48 : AD; + 2B49 : 8D; + 2B4A : 02; + 2B4B : C9; + 2B4C : 03; + 2B4D : D0; + 2B4E : 15; + 2B4F : CD; + 2B50 : 8E; + 2B51 : 02; + 2B52 : F0; + 2B53 : EE; + 2B54 : AD; + 2B55 : 91; + 2B56 : 02; + 2B57 : 30; + 2B58 : 1D; + 2B59 : AD; + 2B5A : 18; + 2B5B : D0; + 2B5C : 49; + 2B5D : 02; + 2B5E : 8D; + 2B5F : 18; + 2B60 : D0; + 2B61 : 4C; + 2B62 : 76; + 2B63 : EB; + 2B64 : 0A; + 2B65 : C9; + 2B66 : 08; + 2B67 : 90; + 2B68 : 02; + 2B69 : A9; + 2B6A : 06; + 2B6B : AA; + 2B6C : BD; + 2B6D : 79; + 2B6E : EB; + 2B6F : 85; + 2B70 : F5; + 2B71 : BD; + 2B72 : 7A; + 2B73 : EB; + 2B74 : 85; + 2B75 : F6; + 2B76 : 4C; + 2B77 : E0; + 2B78 : EA; + 2B79 : 81; + 2B7A : EB; + 2B7B : C2; + 2B7C : EB; + 2B7D : 03; + 2B7E : EC; + 2B7F : 78; + 2B80 : EC; + 2B81 : 14; + 2B82 : 0D; + 2B83 : 1D; + 2B84 : 88; + 2B85 : 85; + 2B86 : 86; + 2B87 : 87; + 2B88 : 11; + 2B89 : 33; + 2B8A : 57; + 2B8B : 41; + 2B8C : 34; + 2B8D : 5A; + 2B8E : 53; + 2B8F : 45; + 2B90 : 01; + 2B91 : 35; + 2B92 : 52; + 2B93 : 44; + 2B94 : 36; + 2B95 : 43; + 2B96 : 46; + 2B97 : 54; + 2B98 : 58; + 2B99 : 37; + 2B9A : 59; + 2B9B : 47; + 2B9C : 38; + 2B9D : 42; + 2B9E : 48; + 2B9F : 55; + 2BA0 : 56; + 2BA1 : 39; + 2BA2 : 49; + 2BA3 : 4A; + 2BA4 : 30; + 2BA5 : 4D; + 2BA6 : 4B; + 2BA7 : 4F; + 2BA8 : 4E; + 2BA9 : 2B; + 2BAA : 50; + 2BAB : 4C; + 2BAC : 2D; + 2BAD : 2E; + 2BAE : 3A; + 2BAF : 40; + 2BB0 : 2C; + 2BB1 : 5C; + 2BB2 : 2A; + 2BB3 : 3B; + 2BB4 : 13; + 2BB5 : 01; + 2BB6 : 3D; + 2BB7 : 5E; + 2BB8 : 2F; + 2BB9 : 31; + 2BBA : 5F; + 2BBB : 04; + 2BBC : 32; + 2BBD : 20; + 2BBE : 02; + 2BBF : 51; + 2BC0 : 03; + 2BC1 : FF; + 2BC2 : 94; + 2BC3 : 8D; + 2BC4 : 9D; + 2BC5 : 8C; + 2BC6 : 89; + 2BC7 : 8A; + 2BC8 : 8B; + 2BC9 : 91; + 2BCA : 23; + 2BCB : D7; + 2BCC : C1; + 2BCD : 24; + 2BCE : DA; + 2BCF : D3; + 2BD0 : C5; + 2BD1 : 01; + 2BD2 : 25; + 2BD3 : D2; + 2BD4 : C4; + 2BD5 : 26; + 2BD6 : C3; + 2BD7 : C6; + 2BD8 : D4; + 2BD9 : D8; + 2BDA : 27; + 2BDB : D9; + 2BDC : C7; + 2BDD : 28; + 2BDE : C2; + 2BDF : C8; + 2BE0 : D5; + 2BE1 : D6; + 2BE2 : 29; + 2BE3 : C9; + 2BE4 : CA; + 2BE5 : 30; + 2BE6 : CD; + 2BE7 : CB; + 2BE8 : CF; + 2BE9 : CE; + 2BEA : DB; + 2BEB : D0; + 2BEC : CC; + 2BED : DD; + 2BEE : 3E; + 2BEF : 5B; + 2BF0 : BA; + 2BF1 : 3C; + 2BF2 : A9; + 2BF3 : C0; + 2BF4 : 5D; + 2BF5 : 93; + 2BF6 : 01; + 2BF7 : 3D; + 2BF8 : DE; + 2BF9 : 3F; + 2BFA : 21; + 2BFB : 5F; + 2BFC : 04; + 2BFD : 22; + 2BFE : A0; + 2BFF : 02; + 2C00 : D1; + 2C01 : 83; + 2C02 : FF; + 2C03 : 94; + 2C04 : 8D; + 2C05 : 9D; + 2C06 : 8C; + 2C07 : 89; + 2C08 : 8A; + 2C09 : 8B; + 2C0A : 91; + 2C0B : 96; + 2C0C : B3; + 2C0D : B0; + 2C0E : 97; + 2C0F : AD; + 2C10 : AE; + 2C11 : B1; + 2C12 : 01; + 2C13 : 98; + 2C14 : B2; + 2C15 : AC; + 2C16 : 99; + 2C17 : BC; + 2C18 : BB; + 2C19 : A3; + 2C1A : BD; + 2C1B : 9A; + 2C1C : B7; + 2C1D : A5; + 2C1E : 9B; + 2C1F : BF; + 2C20 : B4; + 2C21 : B8; + 2C22 : BE; + 2C23 : 29; + 2C24 : A2; + 2C25 : B5; + 2C26 : 30; + 2C27 : A7; + 2C28 : A1; + 2C29 : B9; + 2C2A : AA; + 2C2B : A6; + 2C2C : AF; + 2C2D : B6; + 2C2E : DC; + 2C2F : 3E; + 2C30 : 5B; + 2C31 : A4; + 2C32 : 3C; + 2C33 : A8; + 2C34 : DF; + 2C35 : 5D; + 2C36 : 93; + 2C37 : 01; + 2C38 : 3D; + 2C39 : DE; + 2C3A : 3F; + 2C3B : 81; + 2C3C : 5F; + 2C3D : 04; + 2C3E : 95; + 2C3F : A0; + 2C40 : 02; + 2C41 : AB; + 2C42 : 83; + 2C43 : FF; + 2C44 : C9; + 2C45 : 0E; + 2C46 : D0; + 2C47 : 07; + 2C48 : AD; + 2C49 : 18; + 2C4A : D0; + 2C4B : 09; + 2C4C : 02; + 2C4D : D0; + 2C4E : 09; + 2C4F : C9; + 2C50 : 8E; + 2C51 : D0; + 2C52 : 0B; + 2C53 : AD; + 2C54 : 18; + 2C55 : D0; + 2C56 : 29; + 2C57 : FD; + 2C58 : 8D; + 2C59 : 18; + 2C5A : D0; + 2C5B : 4C; + 2C5C : A8; + 2C5D : E6; + 2C5E : C9; + 2C5F : 08; + 2C60 : D0; + 2C61 : 07; + 2C62 : A9; + 2C63 : 80; + 2C64 : 0D; + 2C65 : 91; + 2C66 : 02; + 2C67 : 30; + 2C68 : 09; + 2C69 : C9; + 2C6A : 09; + 2C6B : D0; + 2C6C : EE; + 2C6D : A9; + 2C6E : 7F; + 2C6F : 2D; + 2C70 : 91; + 2C71 : 02; + 2C72 : 8D; + 2C73 : 91; + 2C74 : 02; + 2C75 : 4C; + 2C76 : A8; + 2C77 : E6; + [2C78..2C7F] : FF; + 2C80 : 1C; + 2C81 : 17; + 2C82 : 01; + 2C83 : 9F; + 2C84 : 1A; + 2C85 : 13; + 2C86 : 05; + 2C87 : FF; + 2C88 : 9C; + 2C89 : 12; + 2C8A : 04; + 2C8B : 1E; + 2C8C : 03; + 2C8D : 06; + 2C8E : 14; + 2C8F : 18; + 2C90 : 1F; + 2C91 : 19; + 2C92 : 07; + 2C93 : 9E; + 2C94 : 02; + 2C95 : 08; + 2C96 : 15; + 2C97 : 16; + 2C98 : 12; + 2C99 : 09; + 2C9A : 0A; + 2C9B : 92; + 2C9C : 0D; + 2C9D : 0B; + 2C9E : 0F; + 2C9F : 0E; + 2CA0 : FF; + 2CA1 : 10; + 2CA2 : 0C; + [2CA3..2CA4] : FF; + 2CA5 : 1B; + 2CA6 : 00; + 2CA7 : FF; + 2CA8 : 1C; + 2CA9 : FF; + 2CAA : 1D; + [2CAB..2CAC] : FF; + 2CAD : 1F; + 2CAE : 1E; + 2CAF : FF; + 2CB0 : 90; + 2CB1 : 06; + 2CB2 : FF; + 2CB3 : 05; + [2CB4..2CB5] : FF; + 2CB6 : 11; + [2CB7..2CB8] : FF; + [2CB9..2CC9] : 00; + 2CCA : 9B; + 2CCB : 37; + [2CCC..2CCE] : 00; + 2CCF : 08; + 2CD0 : 00; + 2CD1 : 14; + 2CD2 : 0F; + [2CD3..2CD8] : 00; + 2CD9 : 0E; + 2CDA : 06; + 2CDB : 01; + 2CDC : 02; + 2CDD : 03; + 2CDE : 04; + 2CDF : 00; + 2CE0 : 01; + 2CE1 : 02; + 2CE2 : 03; + 2CE3 : 04; + 2CE4 : 05; + 2CE5 : 06; + 2CE6 : 07; + 2CE7 : 4C; + 2CE8 : 4F; + 2CE9 : 41; + 2CEA : 44; + 2CEB : 0D; + 2CEC : 52; + 2CED : 55; + 2CEE : 4E; + 2CEF : 0D; + 2CF0 : 00; + 2CF1 : 28; + 2CF2 : 50; + 2CF3 : 78; + 2CF4 : A0; + 2CF5 : C8; + 2CF6 : F0; + 2CF7 : 18; + 2CF8 : 40; + 2CF9 : 68; + 2CFA : 90; + 2CFB : B8; + 2CFC : E0; + 2CFD : 08; + 2CFE : 30; + 2CFF : 58; + 2D00 : 80; + 2D01 : A8; + 2D02 : D0; + 2D03 : F8; + 2D04 : 20; + 2D05 : 48; + 2D06 : 70; + 2D07 : 98; + 2D08 : C0; + 2D09 : 09; + 2D0A : 40; + 2D0B : 2C; + 2D0C : 09; + [2D0D..2D0E] : 20; + 2D0F : A4; + 2D10 : F0; + 2D11 : 48; + 2D12 : 24; + 2D13 : 94; + 2D14 : 10; + 2D15 : 0A; + 2D16 : 38; + 2D17 : 66; + 2D18 : A3; + 2D19 : 20; + 2D1A : 40; + 2D1B : ED; + 2D1C : 46; + 2D1D : 94; + 2D1E : 46; + 2D1F : A3; + 2D20 : 68; + 2D21 : 85; + 2D22 : 95; + 2D23 : 78; + 2D24 : 20; + 2D25 : 97; + 2D26 : EE; + 2D27 : C9; + 2D28 : 3F; + 2D29 : D0; + 2D2A : 03; + 2D2B : 20; + 2D2C : 85; + 2D2D : EE; + 2D2E : AD; + 2D2F : 00; + 2D30 : DD; + 2D31 : 09; + 2D32 : 08; + 2D33 : 8D; + 2D34 : 00; + 2D35 : DD; + 2D36 : 78; + 2D37 : 20; + 2D38 : 8E; + 2D39 : EE; + 2D3A : 20; + 2D3B : 97; + 2D3C : EE; + 2D3D : 20; + 2D3E : B3; + 2D3F : EE; + 2D40 : 78; + 2D41 : 20; + 2D42 : 97; + 2D43 : EE; + 2D44 : 20; + 2D45 : A9; + 2D46 : EE; + 2D47 : B0; + 2D48 : 64; + 2D49 : 20; + 2D4A : 85; + 2D4B : EE; + 2D4C : 24; + 2D4D : A3; + 2D4E : 10; + 2D4F : 0A; + 2D50 : 20; + 2D51 : A9; + 2D52 : EE; + 2D53 : 90; + 2D54 : FB; + 2D55 : 20; + 2D56 : A9; + 2D57 : EE; + 2D58 : B0; + 2D59 : FB; + 2D5A : 20; + 2D5B : A9; + 2D5C : EE; + 2D5D : 90; + 2D5E : FB; + 2D5F : 20; + 2D60 : 8E; + 2D61 : EE; + 2D62 : A9; + 2D63 : 08; + 2D64 : 85; + 2D65 : A5; + 2D66 : AD; + 2D67 : 00; + 2D68 : DD; + 2D69 : CD; + 2D6A : 00; + 2D6B : DD; + 2D6C : D0; + 2D6D : F8; + 2D6E : 0A; + 2D6F : 90; + 2D70 : 3F; + 2D71 : 66; + 2D72 : 95; + 2D73 : B0; + 2D74 : 05; + 2D75 : 20; + 2D76 : A0; + 2D77 : EE; + 2D78 : D0; + 2D79 : 03; + 2D7A : 20; + 2D7B : 97; + 2D7C : EE; + 2D7D : 20; + 2D7E : 85; + 2D7F : EE; + [2D80..2D83] : EA; + 2D84 : AD; + 2D85 : 00; + 2D86 : DD; + 2D87 : 29; + 2D88 : DF; + 2D89 : 09; + 2D8A : 10; + 2D8B : 8D; + 2D8C : 00; + 2D8D : DD; + 2D8E : C6; + 2D8F : A5; + 2D90 : D0; + 2D91 : D4; + 2D92 : A9; + 2D93 : 04; + 2D94 : 8D; + 2D95 : 07; + 2D96 : DC; + 2D97 : A9; + 2D98 : 19; + 2D99 : 8D; + 2D9A : 0F; + 2D9B : DC; + 2D9C : AD; + 2D9D : 0D; + 2D9E : DC; + 2D9F : AD; + 2DA0 : 0D; + 2DA1 : DC; + 2DA2 : 29; + 2DA3 : 02; + 2DA4 : D0; + 2DA5 : 0A; + 2DA6 : 20; + 2DA7 : A9; + 2DA8 : EE; + 2DA9 : B0; + 2DAA : F4; + 2DAB : 58; + 2DAC : 60; + 2DAD : A9; + 2DAE : 80; + 2DAF : 2C; + 2DB0 : A9; + 2DB1 : 03; + 2DB2 : 20; + 2DB3 : 1C; + 2DB4 : FE; + 2DB5 : 58; + 2DB6 : 18; + 2DB7 : 90; + 2DB8 : 4A; + 2DB9 : 85; + 2DBA : 95; + 2DBB : 20; + 2DBC : 36; + 2DBD : ED; + 2DBE : AD; + 2DBF : 00; + 2DC0 : DD; + 2DC1 : 29; + 2DC2 : F7; + 2DC3 : 8D; + 2DC4 : 00; + 2DC5 : DD; + 2DC6 : 60; + 2DC7 : 85; + 2DC8 : 95; + 2DC9 : 20; + 2DCA : 36; + 2DCB : ED; + 2DCC : 78; + 2DCD : 20; + 2DCE : A0; + 2DCF : EE; + 2DD0 : 20; + 2DD1 : BE; + 2DD2 : ED; + 2DD3 : 20; + 2DD4 : 85; + 2DD5 : EE; + 2DD6 : 20; + 2DD7 : A9; + 2DD8 : EE; + 2DD9 : 30; + 2DDA : FB; + 2DDB : 58; + 2DDC : 60; + 2DDD : 24; + 2DDE : 94; + 2DDF : 30; + 2DE0 : 05; + 2DE1 : 38; + 2DE2 : 66; + 2DE3 : 94; + 2DE4 : D0; + 2DE5 : 05; + 2DE6 : 48; + 2DE7 : 20; + 2DE8 : 40; + 2DE9 : ED; + 2DEA : 68; + 2DEB : 85; + 2DEC : 95; + 2DED : 18; + 2DEE : 60; + 2DEF : 78; + 2DF0 : 20; + 2DF1 : 8E; + 2DF2 : EE; + 2DF3 : AD; + 2DF4 : 00; + 2DF5 : DD; + 2DF6 : 09; + 2DF7 : 08; + 2DF8 : 8D; + 2DF9 : 00; + 2DFA : DD; + 2DFB : A9; + 2DFC : 5F; + 2DFD : 2C; + 2DFE : A9; + 2DFF : 3F; + 2E00 : 20; + 2E01 : 11; + 2E02 : ED; + 2E03 : 20; + 2E04 : BE; + 2E05 : ED; + 2E06 : 8A; + 2E07 : A2; + 2E08 : 0A; + 2E09 : CA; + 2E0A : D0; + 2E0B : FD; + 2E0C : AA; + 2E0D : 20; + 2E0E : 85; + 2E0F : EE; + 2E10 : 4C; + 2E11 : 97; + 2E12 : EE; + 2E13 : 78; + 2E14 : A9; + 2E15 : 00; + 2E16 : 85; + 2E17 : A5; + 2E18 : 20; + 2E19 : 85; + 2E1A : EE; + 2E1B : 20; + 2E1C : A9; + 2E1D : EE; + 2E1E : 10; + 2E1F : FB; + 2E20 : A9; + 2E21 : 01; + 2E22 : 8D; + 2E23 : 07; + 2E24 : DC; + 2E25 : A9; + 2E26 : 19; + 2E27 : 8D; + 2E28 : 0F; + 2E29 : DC; + 2E2A : 20; + 2E2B : 97; + 2E2C : EE; + 2E2D : AD; + 2E2E : 0D; + 2E2F : DC; + 2E30 : AD; + 2E31 : 0D; + 2E32 : DC; + 2E33 : 29; + 2E34 : 02; + 2E35 : D0; + 2E36 : 07; + 2E37 : 20; + 2E38 : A9; + 2E39 : EE; + 2E3A : 30; + 2E3B : F4; + 2E3C : 10; + 2E3D : 18; + [2E3E..2E3F] : A5; + 2E40 : F0; + 2E41 : 05; + 2E42 : A9; + 2E43 : 02; + 2E44 : 4C; + 2E45 : B2; + 2E46 : ED; + 2E47 : 20; + 2E48 : A0; + 2E49 : EE; + 2E4A : 20; + 2E4B : 85; + 2E4C : EE; + 2E4D : A9; + 2E4E : 40; + 2E4F : 20; + 2E50 : 1C; + 2E51 : FE; + 2E52 : E6; + 2E53 : A5; + 2E54 : D0; + 2E55 : CA; + 2E56 : A9; + 2E57 : 08; + 2E58 : 85; + 2E59 : A5; + 2E5A : AD; + 2E5B : 00; + 2E5C : DD; + 2E5D : CD; + 2E5E : 00; + 2E5F : DD; + 2E60 : D0; + 2E61 : F8; + 2E62 : 0A; + 2E63 : 10; + 2E64 : F5; + 2E65 : 66; + 2E66 : A4; + 2E67 : AD; + 2E68 : 00; + 2E69 : DD; + 2E6A : CD; + 2E6B : 00; + 2E6C : DD; + 2E6D : D0; + 2E6E : F8; + 2E6F : 0A; + 2E70 : 30; + 2E71 : F5; + 2E72 : C6; + 2E73 : A5; + 2E74 : D0; + 2E75 : E4; + 2E76 : 20; + 2E77 : A0; + 2E78 : EE; + 2E79 : 24; + 2E7A : 90; + 2E7B : 50; + 2E7C : 03; + 2E7D : 20; + 2E7E : 06; + 2E7F : EE; + 2E80 : A5; + 2E81 : A4; + 2E82 : 58; + 2E83 : 18; + 2E84 : 60; + 2E85 : AD; + 2E86 : 00; + 2E87 : DD; + 2E88 : 29; + 2E89 : EF; + 2E8A : 8D; + 2E8B : 00; + 2E8C : DD; + 2E8D : 60; + 2E8E : AD; + 2E8F : 00; + 2E90 : DD; + 2E91 : 09; + 2E92 : 10; + 2E93 : 8D; + 2E94 : 00; + 2E95 : DD; + 2E96 : 60; + 2E97 : AD; + 2E98 : 00; + 2E99 : DD; + 2E9A : 29; + 2E9B : DF; + 2E9C : 8D; + 2E9D : 00; + 2E9E : DD; + 2E9F : 60; + 2EA0 : AD; + 2EA1 : 00; + 2EA2 : DD; + 2EA3 : 09; + 2EA4 : 20; + 2EA5 : 8D; + 2EA6 : 00; + 2EA7 : DD; + 2EA8 : 60; + 2EA9 : AD; + 2EAA : 00; + 2EAB : DD; + 2EAC : CD; + 2EAD : 00; + 2EAE : DD; + 2EAF : D0; + 2EB0 : F8; + 2EB1 : 0A; + 2EB2 : 60; + 2EB3 : 8A; + 2EB4 : A2; + 2EB5 : B8; + 2EB6 : CA; + 2EB7 : D0; + 2EB8 : FD; + 2EB9 : AA; + 2EBA : 60; + 2EBB : A5; + 2EBC : B4; + 2EBD : F0; + 2EBE : 47; + 2EBF : 30; + 2EC0 : 3F; + 2EC1 : 46; + 2EC2 : B6; + 2EC3 : A2; + 2EC4 : 00; + 2EC5 : 90; + 2EC6 : 01; + 2EC7 : CA; + 2EC8 : 8A; + 2EC9 : 45; + 2ECA : BD; + 2ECB : 85; + 2ECC : BD; + 2ECD : C6; + 2ECE : B4; + 2ECF : F0; + 2ED0 : 06; + 2ED1 : 8A; + 2ED2 : 29; + 2ED3 : 04; + 2ED4 : 85; + 2ED5 : B5; + 2ED6 : 60; + 2ED7 : A9; + 2ED8 : 20; + 2ED9 : 2C; + 2EDA : 94; + 2EDB : 02; + 2EDC : F0; + 2EDD : 14; + 2EDE : 30; + 2EDF : 1C; + 2EE0 : 70; + 2EE1 : 14; + 2EE2 : A5; + 2EE3 : BD; + 2EE4 : D0; + 2EE5 : 01; + 2EE6 : CA; + 2EE7 : C6; + 2EE8 : B4; + 2EE9 : AD; + 2EEA : 93; + 2EEB : 02; + 2EEC : 10; + 2EED : E3; + 2EEE : C6; + 2EEF : B4; + 2EF0 : D0; + 2EF1 : DF; + 2EF2 : E6; + 2EF3 : B4; + 2EF4 : D0; + 2EF5 : F0; + 2EF6 : A5; + 2EF7 : BD; + 2EF8 : F0; + 2EF9 : ED; + 2EFA : D0; + 2EFB : EA; + 2EFC : 70; + 2EFD : E9; + 2EFE : 50; + [2EFF..2F00] : E6; + 2F01 : B4; + 2F02 : A2; + 2F03 : FF; + 2F04 : D0; + 2F05 : CB; + 2F06 : AD; + 2F07 : 94; + 2F08 : 02; + 2F09 : 4A; + 2F0A : 90; + 2F0B : 07; + 2F0C : 2C; + 2F0D : 01; + 2F0E : DD; + 2F0F : 10; + 2F10 : 1D; + 2F11 : 50; + 2F12 : 1E; + 2F13 : A9; + 2F14 : 00; + 2F15 : 85; + 2F16 : BD; + 2F17 : 85; + 2F18 : B5; + 2F19 : AE; + 2F1A : 98; + 2F1B : 02; + 2F1C : 86; + 2F1D : B4; + 2F1E : AC; + 2F1F : 9D; + 2F20 : 02; + 2F21 : CC; + 2F22 : 9E; + 2F23 : 02; + 2F24 : F0; + 2F25 : 13; + 2F26 : B1; + 2F27 : F9; + 2F28 : 85; + 2F29 : B6; + 2F2A : EE; + 2F2B : 9D; + 2F2C : 02; + 2F2D : 60; + 2F2E : A9; + 2F2F : 40; + 2F30 : 2C; + 2F31 : A9; + 2F32 : 10; + 2F33 : 0D; + 2F34 : 97; + 2F35 : 02; + 2F36 : 8D; + 2F37 : 97; + 2F38 : 02; + 2F39 : A9; + 2F3A : 01; + 2F3B : 8D; + 2F3C : 0D; + 2F3D : DD; + 2F3E : 4D; + 2F3F : A1; + 2F40 : 02; + 2F41 : 09; + 2F42 : 80; + 2F43 : 8D; + 2F44 : A1; + 2F45 : 02; + 2F46 : 8D; + 2F47 : 0D; + 2F48 : DD; + 2F49 : 60; + 2F4A : A2; + 2F4B : 09; + 2F4C : A9; + 2F4D : 20; + 2F4E : 2C; + 2F4F : 93; + 2F50 : 02; + 2F51 : F0; + 2F52 : 01; + 2F53 : CA; + 2F54 : 50; + 2F55 : 02; + [2F56..2F57] : CA; + 2F58 : 60; + 2F59 : A6; + 2F5A : A9; + 2F5B : D0; + 2F5C : 33; + 2F5D : C6; + 2F5E : A8; + 2F5F : F0; + 2F60 : 36; + 2F61 : 30; + 2F62 : 0D; + 2F63 : A5; + 2F64 : A7; + 2F65 : 45; + 2F66 : AB; + 2F67 : 85; + 2F68 : AB; + 2F69 : 46; + 2F6A : A7; + 2F6B : 66; + 2F6C : AA; + 2F6D : 60; + 2F6E : C6; + 2F6F : A8; + 2F70 : A5; + 2F71 : A7; + 2F72 : F0; + 2F73 : 67; + 2F74 : AD; + 2F75 : 93; + 2F76 : 02; + 2F77 : 0A; + 2F78 : A9; + 2F79 : 01; + 2F7A : 65; + 2F7B : A8; + 2F7C : D0; + 2F7D : EF; + 2F7E : A9; + 2F7F : 90; + 2F80 : 8D; + 2F81 : 0D; + 2F82 : DD; + 2F83 : 0D; + 2F84 : A1; + 2F85 : 02; + 2F86 : 8D; + 2F87 : A1; + 2F88 : 02; + 2F89 : 85; + [2F8A..2F8B] : A9; + 2F8C : 02; + 2F8D : 4C; + 2F8E : 3B; + 2F8F : EF; + 2F90 : A5; + 2F91 : A7; + 2F92 : D0; + 2F93 : EA; + 2F94 : 4C; + 2F95 : D3; + 2F96 : E4; + 2F97 : AC; + 2F98 : 9B; + 2F99 : 02; + 2F9A : C8; + 2F9B : CC; + 2F9C : 9C; + 2F9D : 02; + 2F9E : F0; + 2F9F : 2A; + 2FA0 : 8C; + 2FA1 : 9B; + 2FA2 : 02; + 2FA3 : 88; + 2FA4 : A5; + 2FA5 : AA; + 2FA6 : AE; + 2FA7 : 98; + 2FA8 : 02; + 2FA9 : E0; + 2FAA : 09; + 2FAB : F0; + 2FAC : 04; + 2FAD : 4A; + 2FAE : E8; + 2FAF : D0; + 2FB0 : F8; + 2FB1 : 91; + 2FB2 : F7; + 2FB3 : A9; + 2FB4 : 20; + 2FB5 : 2C; + 2FB6 : 94; + 2FB7 : 02; + 2FB8 : F0; + 2FB9 : B4; + 2FBA : 30; + 2FBB : B1; + 2FBC : A5; + 2FBD : A7; + 2FBE : 45; + 2FBF : AB; + 2FC0 : F0; + 2FC1 : 03; + 2FC2 : 70; + 2FC3 : A9; + 2FC4 : 2C; + 2FC5 : 50; + 2FC6 : A6; + 2FC7 : A9; + 2FC8 : 01; + 2FC9 : 2C; + 2FCA : A9; + 2FCB : 04; + 2FCC : 2C; + 2FCD : A9; + 2FCE : 80; + 2FCF : 2C; + 2FD0 : A9; + 2FD1 : 02; + 2FD2 : 0D; + 2FD3 : 97; + 2FD4 : 02; + 2FD5 : 8D; + 2FD6 : 97; + 2FD7 : 02; + 2FD8 : 4C; + 2FD9 : 7E; + 2FDA : EF; + 2FDB : A5; + 2FDC : AA; + 2FDD : D0; + 2FDE : F1; + 2FDF : F0; + 2FE0 : EC; + 2FE1 : 85; + 2FE2 : 9A; + 2FE3 : AD; + 2FE4 : 94; + 2FE5 : 02; + 2FE6 : 4A; + 2FE7 : 90; + 2FE8 : 29; + 2FE9 : A9; + 2FEA : 02; + 2FEB : 2C; + 2FEC : 01; + 2FED : DD; + 2FEE : 10; + 2FEF : 1D; + 2FF0 : D0; + 2FF1 : 20; + 2FF2 : AD; + 2FF3 : A1; + 2FF4 : 02; + 2FF5 : 29; + 2FF6 : 02; + 2FF7 : D0; + 2FF8 : F9; + 2FF9 : 2C; + 2FFA : 01; + 2FFB : DD; + 2FFC : 70; + 2FFD : FB; + 2FFE : AD; + 2FFF : 01; + 3000 : DD; + 3001 : 09; + 3002 : 02; + 3003 : 8D; + 3004 : 01; + 3005 : DD; + 3006 : 2C; + 3007 : 01; + 3008 : DD; + 3009 : 70; + 300A : 07; + 300B : 30; + 300C : F9; + 300D : A9; + 300E : 40; + 300F : 8D; + 3010 : 97; + 3011 : 02; + 3012 : 18; + 3013 : 60; + 3014 : 20; + 3015 : 28; + 3016 : F0; + 3017 : AC; + 3018 : 9E; + 3019 : 02; + 301A : C8; + 301B : CC; + 301C : 9D; + 301D : 02; + 301E : F0; + 301F : F4; + 3020 : 8C; + 3021 : 9E; + 3022 : 02; + 3023 : 88; + 3024 : A5; + 3025 : 9E; + 3026 : 91; + 3027 : F9; + 3028 : AD; + 3029 : A1; + 302A : 02; + 302B : 4A; + 302C : B0; + 302D : 1E; + 302E : A9; + 302F : 10; + 3030 : 8D; + 3031 : 0E; + 3032 : DD; + 3033 : AD; + 3034 : 99; + 3035 : 02; + 3036 : 8D; + 3037 : 04; + 3038 : DD; + 3039 : AD; + 303A : 9A; + 303B : 02; + 303C : 8D; + 303D : 05; + 303E : DD; + 303F : A9; + 3040 : 81; + 3041 : 20; + 3042 : 3B; + 3043 : EF; + 3044 : 20; + 3045 : 06; + 3046 : EF; + 3047 : A9; + 3048 : 11; + 3049 : 8D; + 304A : 0E; + 304B : DD; + 304C : 60; + 304D : 85; + 304E : 99; + 304F : AD; + 3050 : 94; + 3051 : 02; + 3052 : 4A; + 3053 : 90; + 3054 : 28; + 3055 : 29; + 3056 : 08; + 3057 : F0; + 3058 : 24; + 3059 : A9; + 305A : 02; + 305B : 2C; + 305C : 01; + 305D : DD; + 305E : 10; + 305F : AD; + 3060 : F0; + 3061 : 22; + 3062 : AD; + 3063 : A1; + 3064 : 02; + 3065 : 4A; + 3066 : B0; + 3067 : FA; + 3068 : AD; + 3069 : 01; + 306A : DD; + 306B : 29; + 306C : FD; + 306D : 8D; + 306E : 01; + 306F : DD; + 3070 : AD; + 3071 : 01; + 3072 : DD; + 3073 : 29; + 3074 : 04; + 3075 : F0; + 3076 : F9; + 3077 : A9; + 3078 : 90; + 3079 : 18; + 307A : 4C; + 307B : 3B; + 307C : EF; + 307D : AD; + 307E : A1; + 307F : 02; + 3080 : 29; + 3081 : 12; + 3082 : F0; + 3083 : F3; + 3084 : 18; + 3085 : 60; + 3086 : AD; + 3087 : 97; + 3088 : 02; + 3089 : AC; + 308A : 9C; + 308B : 02; + 308C : CC; + 308D : 9B; + 308E : 02; + 308F : F0; + 3090 : 0B; + 3091 : 29; + 3092 : F7; + 3093 : 8D; + 3094 : 97; + 3095 : 02; + 3096 : B1; + 3097 : F7; + 3098 : EE; + 3099 : 9C; + 309A : 02; + 309B : 60; + 309C : 09; + 309D : 08; + 309E : 8D; + 309F : 97; + 30A0 : 02; + 30A1 : A9; + 30A2 : 00; + 30A3 : 60; + 30A4 : 48; + 30A5 : AD; + 30A6 : A1; + 30A7 : 02; + 30A8 : F0; + 30A9 : 11; + 30AA : AD; + 30AB : A1; + 30AC : 02; + 30AD : 29; + 30AE : 03; + 30AF : D0; + 30B0 : F9; + 30B1 : A9; + 30B2 : 10; + 30B3 : 8D; + 30B4 : 0D; + 30B5 : DD; + 30B6 : A9; + 30B7 : 00; + 30B8 : 8D; + 30B9 : A1; + 30BA : 02; + 30BB : 68; + 30BC : 60; + 30BD : 0D; + 30BE : 49; + 30BF : 2F; + 30C0 : 4F; + 30C1 : 20; + 30C2 : 45; + [30C3..30C4] : 52; + 30C5 : 4F; + 30C6 : 52; + 30C7 : 20; + 30C8 : A3; + 30C9 : 0D; + 30CA : 53; + 30CB : 45; + 30CC : 41; + 30CD : 52; + 30CE : 43; + 30CF : 48; + 30D0 : 49; + 30D1 : 4E; + 30D2 : 47; + 30D3 : A0; + 30D4 : 46; + 30D5 : 4F; + 30D6 : 52; + 30D7 : A0; + 30D8 : 0D; + 30D9 : 50; + 30DA : 52; + 30DB : 45; + [30DC..30DD] : 53; + 30DE : 20; + 30DF : 50; + 30E0 : 4C; + 30E1 : 41; + 30E2 : 59; + 30E3 : 20; + 30E4 : 4F; + 30E5 : 4E; + 30E6 : 20; + 30E7 : 54; + 30E8 : 41; + 30E9 : 50; + 30EA : C5; + 30EB : 50; + 30EC : 52; + 30ED : 45; + [30EE..30EF] : 53; + 30F0 : 20; + 30F1 : 52; + 30F2 : 45; + 30F3 : 43; + 30F4 : 4F; + 30F5 : 52; + 30F6 : 44; + 30F7 : 20; + 30F8 : 26; + 30F9 : 20; + 30FA : 50; + 30FB : 4C; + 30FC : 41; + 30FD : 59; + 30FE : 20; + 30FF : 4F; + 3100 : 4E; + 3101 : 20; + 3102 : 54; + 3103 : 41; + 3104 : 50; + 3105 : C5; + 3106 : 0D; + 3107 : 4C; + 3108 : 4F; + 3109 : 41; + 310A : 44; + 310B : 49; + 310C : 4E; + 310D : C7; + 310E : 0D; + 310F : 53; + 3110 : 41; + 3111 : 56; + 3112 : 49; + 3113 : 4E; + 3114 : 47; + 3115 : A0; + 3116 : 0D; + 3117 : 56; + 3118 : 45; + 3119 : 52; + 311A : 49; + 311B : 46; + 311C : 59; + 311D : 49; + 311E : 4E; + 311F : C7; + 3120 : 0D; + 3121 : 46; + 3122 : 4F; + 3123 : 55; + 3124 : 4E; + 3125 : 44; + 3126 : A0; + 3127 : 0D; + 3128 : 4F; + 3129 : 4B; + 312A : 8D; + 312B : 24; + 312C : 9D; + 312D : 10; + 312E : 0D; + 312F : B9; + 3130 : BD; + 3131 : F0; + 3132 : 08; + 3133 : 29; + 3134 : 7F; + 3135 : 20; + 3136 : D2; + 3137 : FF; + 3138 : C8; + 3139 : 28; + 313A : 10; + 313B : F3; + 313C : 18; + 313D : 60; + 313E : A5; + 313F : 99; + 3140 : D0; + 3141 : 08; + 3142 : A5; + 3143 : C6; + 3144 : F0; + 3145 : 0F; + 3146 : 78; + 3147 : 4C; + 3148 : B4; + 3149 : E5; + 314A : C9; + 314B : 02; + 314C : D0; + 314D : 18; + 314E : 84; + 314F : 97; + 3150 : 20; + 3151 : 86; + 3152 : F0; + 3153 : A4; + 3154 : 97; + 3155 : 18; + 3156 : 60; + 3157 : A5; + 3158 : 99; + 3159 : D0; + 315A : 0B; + 315B : A5; + 315C : D3; + 315D : 85; + 315E : CA; + 315F : A5; + 3160 : D6; + 3161 : 85; + 3162 : C9; + 3163 : 4C; + 3164 : 32; + 3165 : E6; + 3166 : C9; + 3167 : 03; + 3168 : D0; + 3169 : 09; + 316A : 85; + 316B : D0; + 316C : A5; + 316D : D5; + 316E : 85; + 316F : C8; + 3170 : 4C; + 3171 : 32; + 3172 : E6; + 3173 : B0; + 3174 : 38; + 3175 : C9; + 3176 : 02; + 3177 : F0; + 3178 : 3F; + 3179 : 86; + 317A : 97; + 317B : 20; + 317C : 99; + 317D : F1; + 317E : B0; + 317F : 16; + 3180 : 48; + 3181 : 20; + 3182 : 99; + 3183 : F1; + 3184 : B0; + 3185 : 0D; + 3186 : D0; + 3187 : 05; + 3188 : A9; + 3189 : 40; + 318A : 20; + 318B : 1C; + 318C : FE; + 318D : C6; + [318E..318F] : A6; + 3190 : 97; + 3191 : 68; + 3192 : 60; + 3193 : AA; + 3194 : 68; + 3195 : 8A; + 3196 : A6; + 3197 : 97; + 3198 : 60; + 3199 : 20; + 319A : 0D; + 319B : F8; + 319C : D0; + 319D : 0B; + 319E : 20; + 319F : 41; + 31A0 : F8; + 31A1 : B0; + 31A2 : 11; + 31A3 : A9; + 31A4 : 00; + 31A5 : 85; + 31A6 : A6; + [31A7..31A8] : F0; + 31A9 : B1; + 31AA : B2; + 31AB : 18; + 31AC : 60; + 31AD : A5; + 31AE : 90; + 31AF : F0; + 31B0 : 04; + 31B1 : A9; + 31B2 : 0D; + 31B3 : 18; + 31B4 : 60; + 31B5 : 4C; + 31B6 : 13; + 31B7 : EE; + 31B8 : 20; + 31B9 : 4E; + 31BA : F1; + 31BB : B0; + 31BC : F7; + 31BD : C9; + 31BE : 00; + 31BF : D0; + 31C0 : F2; + 31C1 : AD; + 31C2 : 97; + 31C3 : 02; + 31C4 : 29; + 31C5 : 60; + 31C6 : D0; + 31C7 : E9; + 31C8 : F0; + 31C9 : EE; + 31CA : 48; + 31CB : A5; + 31CC : 9A; + 31CD : C9; + 31CE : 03; + 31CF : D0; + 31D0 : 04; + 31D1 : 68; + 31D2 : 4C; + 31D3 : 16; + 31D4 : E7; + 31D5 : 90; + 31D6 : 04; + 31D7 : 68; + 31D8 : 4C; + 31D9 : DD; + 31DA : ED; + 31DB : 4A; + 31DC : 68; + 31DD : 85; + 31DE : 9E; + 31DF : 8A; + 31E0 : 48; + 31E1 : 98; + 31E2 : 48; + 31E3 : 90; + 31E4 : 23; + 31E5 : 20; + 31E6 : 0D; + 31E7 : F8; + 31E8 : D0; + 31E9 : 0E; + 31EA : 20; + 31EB : 64; + 31EC : F8; + 31ED : B0; + 31EE : 0E; + 31EF : A9; + 31F0 : 02; + 31F1 : A0; + 31F2 : 00; + 31F3 : 91; + 31F4 : B2; + 31F5 : C8; + 31F6 : 84; + 31F7 : A6; + 31F8 : A5; + 31F9 : 9E; + 31FA : 91; + 31FB : B2; + 31FC : 18; + 31FD : 68; + 31FE : A8; + 31FF : 68; + 3200 : AA; + 3201 : A5; + 3202 : 9E; + 3203 : 90; + 3204 : 02; + 3205 : A9; + 3206 : 00; + 3207 : 60; + 3208 : 20; + 3209 : 17; + 320A : F0; + 320B : 4C; + 320C : FC; + 320D : F1; + 320E : 20; + 320F : 0F; + 3210 : F3; + 3211 : F0; + 3212 : 03; + 3213 : 4C; + 3214 : 01; + 3215 : F7; + 3216 : 20; + 3217 : 1F; + 3218 : F3; + 3219 : A5; + 321A : BA; + 321B : F0; + 321C : 16; + 321D : C9; + 321E : 03; + 321F : F0; + 3220 : 12; + 3221 : B0; + 3222 : 14; + 3223 : C9; + 3224 : 02; + 3225 : D0; + 3226 : 03; + 3227 : 4C; + 3228 : 4D; + 3229 : F0; + 322A : A6; + 322B : B9; + 322C : E0; + 322D : 60; + 322E : F0; + 322F : 03; + 3230 : 4C; + 3231 : 0A; + 3232 : F7; + 3233 : 85; + 3234 : 99; + 3235 : 18; + 3236 : 60; + 3237 : AA; + 3238 : 20; + 3239 : 09; + 323A : ED; + 323B : A5; + 323C : B9; + 323D : 10; + 323E : 06; + 323F : 20; + 3240 : CC; + 3241 : ED; + 3242 : 4C; + 3243 : 48; + 3244 : F2; + 3245 : 20; + 3246 : C7; + 3247 : ED; + 3248 : 8A; + 3249 : 24; + 324A : 90; + 324B : 10; + 324C : E6; + 324D : 4C; + 324E : 07; + 324F : F7; + 3250 : 20; + 3251 : 0F; + 3252 : F3; + 3253 : F0; + 3254 : 03; + 3255 : 4C; + 3256 : 01; + 3257 : F7; + 3258 : 20; + 3259 : 1F; + 325A : F3; + 325B : A5; + 325C : BA; + 325D : D0; + 325E : 03; + 325F : 4C; + 3260 : 0D; + 3261 : F7; + 3262 : C9; + 3263 : 03; + 3264 : F0; + 3265 : 0F; + 3266 : B0; + 3267 : 11; + 3268 : C9; + 3269 : 02; + 326A : D0; + 326B : 03; + 326C : 4C; + 326D : E1; + 326E : EF; + 326F : A6; + 3270 : B9; + 3271 : E0; + 3272 : 60; + 3273 : F0; + 3274 : EA; + 3275 : 85; + 3276 : 9A; + 3277 : 18; + 3278 : 60; + 3279 : AA; + 327A : 20; + 327B : 0C; + 327C : ED; + 327D : A5; + 327E : B9; + 327F : 10; + 3280 : 05; + 3281 : 20; + 3282 : BE; + 3283 : ED; + 3284 : D0; + 3285 : 03; + 3286 : 20; + 3287 : B9; + 3288 : ED; + 3289 : 8A; + 328A : 24; + 328B : 90; + 328C : 10; + 328D : E7; + 328E : 4C; + 328F : 07; + 3290 : F7; + 3291 : 20; + 3292 : 14; + 3293 : F3; + 3294 : F0; + 3295 : 02; + 3296 : 18; + 3297 : 60; + 3298 : 20; + 3299 : 1F; + 329A : F3; + 329B : 8A; + 329C : 48; + 329D : A5; + 329E : BA; + 329F : F0; + 32A0 : 50; + 32A1 : C9; + 32A2 : 03; + 32A3 : F0; + 32A4 : 4C; + 32A5 : B0; + 32A6 : 47; + 32A7 : C9; + 32A8 : 02; + 32A9 : D0; + 32AA : 1D; + 32AB : 68; + 32AC : 20; + [32AD..32AE] : F2; + 32AF : 20; + 32B0 : 83; + 32B1 : F4; + 32B2 : 20; + 32B3 : 27; + 32B4 : FE; + 32B5 : A5; + 32B6 : F8; + 32B7 : F0; + 32B8 : 01; + 32B9 : C8; + 32BA : A5; + 32BB : FA; + 32BC : F0; + 32BD : 01; + 32BE : C8; + 32BF : A9; + 32C0 : 00; + 32C1 : 85; + 32C2 : F8; + 32C3 : 85; + 32C4 : FA; + 32C5 : 4C; + 32C6 : 7D; + 32C7 : F4; + 32C8 : A5; + 32C9 : B9; + 32CA : 29; + 32CB : 0F; + 32CC : F0; + 32CD : 23; + 32CE : 20; + 32CF : D0; + 32D0 : F7; + 32D1 : A9; + 32D2 : 00; + 32D3 : 38; + 32D4 : 20; + 32D5 : DD; + 32D6 : F1; + 32D7 : 20; + 32D8 : 64; + 32D9 : F8; + 32DA : 90; + 32DB : 04; + 32DC : 68; + 32DD : A9; + 32DE : 00; + 32DF : 60; + 32E0 : A5; + 32E1 : B9; + 32E2 : C9; + 32E3 : 62; + 32E4 : D0; + 32E5 : 0B; + 32E6 : A9; + 32E7 : 05; + 32E8 : 20; + 32E9 : 6A; + 32EA : F7; + 32EB : 4C; + 32EC : F1; + 32ED : F2; + 32EE : 20; + 32EF : 42; + 32F0 : F6; + 32F1 : 68; + 32F2 : AA; + 32F3 : C6; + 32F4 : 98; + 32F5 : E4; + 32F6 : 98; + 32F7 : F0; + 32F8 : 14; + 32F9 : A4; + 32FA : 98; + 32FB : B9; + 32FC : 59; + 32FD : 02; + 32FE : 9D; + 32FF : 59; + 3300 : 02; + 3301 : B9; + 3302 : 63; + 3303 : 02; + 3304 : 9D; + 3305 : 63; + 3306 : 02; + 3307 : B9; + 3308 : 6D; + 3309 : 02; + 330A : 9D; + 330B : 6D; + 330C : 02; + 330D : 18; + 330E : 60; + 330F : A9; + 3310 : 00; + 3311 : 85; + 3312 : 90; + 3313 : 8A; + 3314 : A6; + 3315 : 98; + 3316 : CA; + 3317 : 30; + 3318 : 15; + 3319 : DD; + 331A : 59; + 331B : 02; + 331C : D0; + 331D : F8; + 331E : 60; + 331F : BD; + 3320 : 59; + 3321 : 02; + 3322 : 85; + 3323 : B8; + 3324 : BD; + 3325 : 63; + 3326 : 02; + 3327 : 85; + 3328 : BA; + 3329 : BD; + 332A : 6D; + 332B : 02; + 332C : 85; + 332D : B9; + 332E : 60; + 332F : A9; + 3330 : 00; + 3331 : 85; + 3332 : 98; + 3333 : A2; + 3334 : 03; + 3335 : E4; + 3336 : 9A; + 3337 : B0; + 3338 : 03; + 3339 : 20; + 333A : FE; + 333B : ED; + 333C : E4; + 333D : 99; + 333E : B0; + 333F : 03; + 3340 : 20; + 3341 : EF; + 3342 : ED; + 3343 : 86; + 3344 : 9A; + 3345 : A9; + 3346 : 00; + 3347 : 85; + 3348 : 99; + 3349 : 60; + 334A : A6; + 334B : B8; + 334C : D0; + 334D : 03; + 334E : 4C; + 334F : 0A; + 3350 : F7; + 3351 : 20; + 3352 : 0F; + 3353 : F3; + 3354 : D0; + 3355 : 03; + 3356 : 4C; + 3357 : FE; + 3358 : F6; + 3359 : A6; + 335A : 98; + 335B : E0; + 335C : 0A; + 335D : 90; + 335E : 03; + 335F : 4C; + 3360 : FB; + 3361 : F6; + 3362 : E6; + 3363 : 98; + 3364 : A5; + 3365 : B8; + 3366 : 9D; + 3367 : 59; + 3368 : 02; + 3369 : A5; + 336A : B9; + 336B : 09; + 336C : 60; + 336D : 85; + 336E : B9; + 336F : 9D; + 3370 : 6D; + 3371 : 02; + 3372 : A5; + 3373 : BA; + 3374 : 9D; + 3375 : 63; + 3376 : 02; + 3377 : F0; + 3378 : 5A; + 3379 : C9; + 337A : 03; + 337B : F0; + 337C : 56; + 337D : 90; + 337E : 05; + 337F : 20; + 3380 : D5; + 3381 : F3; + 3382 : 90; + 3383 : 4F; + 3384 : C9; + 3385 : 02; + 3386 : D0; + 3387 : 03; + 3388 : 4C; + 3389 : 09; + 338A : F4; + 338B : 20; + 338C : D0; + 338D : F7; + 338E : B0; + 338F : 03; + 3390 : 4C; + 3391 : 13; + 3392 : F7; + 3393 : A5; + 3394 : B9; + 3395 : 29; + 3396 : 0F; + 3397 : D0; + 3398 : 1F; + 3399 : 20; + 339A : 17; + 339B : F8; + 339C : B0; + 339D : 36; + 339E : 20; + 339F : AF; + 33A0 : F5; + 33A1 : A5; + 33A2 : B7; + 33A3 : F0; + 33A4 : 0A; + 33A5 : 20; + 33A6 : EA; + 33A7 : F7; + 33A8 : 90; + 33A9 : 18; + 33AA : F0; + 33AB : 28; + 33AC : 4C; + 33AD : 04; + 33AE : F7; + 33AF : 20; + 33B0 : 2C; + 33B1 : F7; + 33B2 : F0; + 33B3 : 20; + 33B4 : 90; + 33B5 : 0C; + 33B6 : B0; + 33B7 : F4; + 33B8 : 20; + 33B9 : 38; + 33BA : F8; + 33BB : B0; + 33BC : 17; + 33BD : A9; + 33BE : 04; + 33BF : 20; + 33C0 : 6A; + 33C1 : F7; + 33C2 : A9; + 33C3 : BF; + 33C4 : A4; + 33C5 : B9; + 33C6 : C0; + 33C7 : 60; + 33C8 : F0; + 33C9 : 07; + 33CA : A0; + 33CB : 00; + 33CC : A9; + 33CD : 02; + 33CE : 91; + 33CF : B2; + 33D0 : 98; + 33D1 : 85; + 33D2 : A6; + 33D3 : 18; + 33D4 : 60; + 33D5 : A5; + 33D6 : B9; + 33D7 : 30; + 33D8 : FA; + 33D9 : A4; + 33DA : B7; + 33DB : F0; + 33DC : F6; + 33DD : A9; + 33DE : 00; + 33DF : 85; + 33E0 : 90; + 33E1 : A5; + 33E2 : BA; + 33E3 : 20; + 33E4 : 0C; + 33E5 : ED; + 33E6 : A5; + 33E7 : B9; + 33E8 : 09; + 33E9 : F0; + 33EA : 20; + 33EB : B9; + 33EC : ED; + 33ED : A5; + 33EE : 90; + 33EF : 10; + 33F0 : 05; + [33F1..33F2] : 68; + 33F3 : 4C; + 33F4 : 07; + 33F5 : F7; + 33F6 : A5; + 33F7 : B7; + 33F8 : F0; + 33F9 : 0C; + 33FA : A0; + 33FB : 00; + 33FC : B1; + 33FD : BB; + 33FE : 20; + 33FF : DD; + 3400 : ED; + 3401 : C8; + 3402 : C4; + 3403 : B7; + 3404 : D0; + 3405 : F6; + 3406 : 4C; + 3407 : 54; + 3408 : F6; + 3409 : 20; + 340A : 83; + 340B : F4; + 340C : 8C; + 340D : 97; + 340E : 02; + 340F : C4; + 3410 : B7; + 3411 : F0; + 3412 : 0A; + 3413 : B1; + 3414 : BB; + 3415 : 99; + 3416 : 93; + 3417 : 02; + 3418 : C8; + 3419 : C0; + 341A : 04; + 341B : D0; + 341C : F2; + 341D : 20; + 341E : 4A; + 341F : EF; + 3420 : 8E; + 3421 : 98; + 3422 : 02; + 3423 : AD; + 3424 : 93; + 3425 : 02; + 3426 : 29; + 3427 : 0F; + 3428 : F0; + 3429 : 1C; + 342A : 0A; + 342B : AA; + 342C : AD; + 342D : A6; + 342E : 02; + 342F : D0; + 3430 : 09; + 3431 : BC; + 3432 : C1; + 3433 : FE; + 3434 : BD; + 3435 : C0; + 3436 : FE; + 3437 : 4C; + 3438 : 40; + 3439 : F4; + 343A : BC; + 343B : EB; + 343C : E4; + 343D : BD; + 343E : EA; + 343F : E4; + 3440 : 8C; + 3441 : 96; + 3442 : 02; + 3443 : 8D; + 3444 : 95; + 3445 : 02; + 3446 : AD; + 3447 : 95; + 3448 : 02; + 3449 : 0A; + 344A : 20; + 344B : 2E; + 344C : FF; + 344D : AD; + 344E : 94; + 344F : 02; + 3450 : 4A; + 3451 : 90; + 3452 : 09; + 3453 : AD; + 3454 : 01; + 3455 : DD; + 3456 : 0A; + 3457 : B0; + 3458 : 03; + 3459 : 20; + 345A : 0D; + 345B : F0; + 345C : AD; + 345D : 9B; + 345E : 02; + 345F : 8D; + 3460 : 9C; + 3461 : 02; + 3462 : AD; + 3463 : 9E; + 3464 : 02; + 3465 : 8D; + 3466 : 9D; + 3467 : 02; + 3468 : 20; + 3469 : 27; + 346A : FE; + 346B : A5; + 346C : F8; + 346D : D0; + 346E : 05; + 346F : 88; + 3470 : 84; + 3471 : F8; + 3472 : 86; + 3473 : F7; + 3474 : A5; + 3475 : FA; + 3476 : D0; + 3477 : 05; + 3478 : 88; + 3479 : 84; + 347A : FA; + 347B : 86; + 347C : F9; + 347D : 38; + 347E : A9; + 347F : F0; + 3480 : 4C; + 3481 : 2D; + 3482 : FE; + 3483 : A9; + 3484 : 7F; + 3485 : 8D; + 3486 : 0D; + 3487 : DD; + 3488 : A9; + 3489 : 06; + 348A : 8D; + 348B : 03; + 348C : DD; + 348D : 8D; + 348E : 01; + 348F : DD; + 3490 : A9; + 3491 : 04; + 3492 : 0D; + 3493 : 00; + 3494 : DD; + 3495 : 8D; + 3496 : 00; + 3497 : DD; + 3498 : A0; + 3499 : 00; + 349A : 8C; + 349B : A1; + 349C : 02; + 349D : 60; + 349E : 86; + 349F : C3; + 34A0 : 84; + 34A1 : C4; + 34A2 : 6C; + 34A3 : 30; + 34A4 : 03; + 34A5 : 85; + 34A6 : 93; + 34A7 : A9; + 34A8 : 00; + 34A9 : 85; + 34AA : 90; + 34AB : A5; + 34AC : BA; + 34AD : D0; + 34AE : 03; + 34AF : 4C; + 34B0 : 13; + 34B1 : F7; + 34B2 : C9; + 34B3 : 03; + 34B4 : F0; + 34B5 : F9; + 34B6 : 90; + 34B7 : 7B; + 34B8 : A4; + 34B9 : B7; + 34BA : D0; + 34BB : 03; + 34BC : 4C; + 34BD : 10; + 34BE : F7; + 34BF : A6; + 34C0 : B9; + 34C1 : 20; + 34C2 : AF; + 34C3 : F5; + 34C4 : A9; + 34C5 : 60; + 34C6 : 85; + 34C7 : B9; + 34C8 : 20; + 34C9 : D5; + 34CA : F3; + 34CB : A5; + 34CC : BA; + 34CD : 20; + 34CE : 09; + 34CF : ED; + 34D0 : A5; + 34D1 : B9; + 34D2 : 20; + 34D3 : C7; + 34D4 : ED; + 34D5 : 20; + 34D6 : 13; + 34D7 : EE; + 34D8 : 85; + 34D9 : AE; + 34DA : A5; + 34DB : 90; + [34DC..34DD] : 4A; + 34DE : B0; + 34DF : 50; + 34E0 : 20; + 34E1 : 13; + 34E2 : EE; + 34E3 : 85; + 34E4 : AF; + 34E5 : 8A; + 34E6 : D0; + 34E7 : 08; + 34E8 : A5; + 34E9 : C3; + 34EA : 85; + 34EB : AE; + 34EC : A5; + 34ED : C4; + 34EE : 85; + 34EF : AF; + 34F0 : 20; + 34F1 : D2; + 34F2 : F5; + 34F3 : A9; + 34F4 : FD; + 34F5 : 25; + 34F6 : 90; + 34F7 : 85; + 34F8 : 90; + 34F9 : 20; + 34FA : E1; + 34FB : FF; + 34FC : D0; + 34FD : 03; + 34FE : 4C; + 34FF : 33; + 3500 : F6; + 3501 : 20; + 3502 : 13; + 3503 : EE; + 3504 : AA; + 3505 : A5; + 3506 : 90; + [3507..3508] : 4A; + 3509 : B0; + 350A : E8; + 350B : 8A; + 350C : A4; + 350D : 93; + 350E : F0; + 350F : 0C; + 3510 : A0; + 3511 : 00; + 3512 : D1; + 3513 : AE; + 3514 : F0; + 3515 : 08; + 3516 : A9; + 3517 : 10; + 3518 : 20; + 3519 : 1C; + 351A : FE; + 351B : 2C; + 351C : 91; + 351D : AE; + 351E : E6; + 351F : AE; + 3520 : D0; + 3521 : 02; + 3522 : E6; + 3523 : AF; + 3524 : 24; + 3525 : 90; + 3526 : 50; + 3527 : CB; + 3528 : 20; + 3529 : EF; + 352A : ED; + 352B : 20; + 352C : 42; + 352D : F6; + 352E : 90; + 352F : 79; + 3530 : 4C; + 3531 : 04; + 3532 : F7; + 3533 : 4A; + 3534 : B0; + 3535 : 03; + 3536 : 4C; + 3537 : 13; + 3538 : F7; + 3539 : 20; + 353A : D0; + 353B : F7; + 353C : B0; + 353D : 03; + 353E : 4C; + 353F : 13; + 3540 : F7; + 3541 : 20; + 3542 : 17; + 3543 : F8; + 3544 : B0; + 3545 : 68; + 3546 : 20; + 3547 : AF; + 3548 : F5; + 3549 : A5; + 354A : B7; + 354B : F0; + 354C : 09; + 354D : 20; + 354E : EA; + 354F : F7; + 3550 : 90; + 3551 : 0B; + 3552 : F0; + 3553 : 5A; + 3554 : B0; + 3555 : DA; + 3556 : 20; + 3557 : 2C; + 3558 : F7; + 3559 : F0; + 355A : 53; + 355B : B0; + 355C : D3; + 355D : A5; + 355E : 90; + 355F : 29; + 3560 : 10; + 3561 : 38; + 3562 : D0; + 3563 : 4A; + 3564 : E0; + 3565 : 01; + 3566 : F0; + 3567 : 11; + 3568 : E0; + 3569 : 03; + 356A : D0; + 356B : DD; + 356C : A0; + 356D : 01; + 356E : B1; + 356F : B2; + 3570 : 85; + 3571 : C3; + 3572 : C8; + 3573 : B1; + 3574 : B2; + 3575 : 85; + 3576 : C4; + 3577 : B0; + 3578 : 04; + 3579 : A5; + 357A : B9; + 357B : D0; + 357C : EF; + 357D : A0; + 357E : 03; + 357F : B1; + 3580 : B2; + 3581 : A0; + 3582 : 01; + 3583 : F1; + 3584 : B2; + 3585 : AA; + 3586 : A0; + 3587 : 04; + 3588 : B1; + 3589 : B2; + 358A : A0; + 358B : 02; + 358C : F1; + 358D : B2; + 358E : A8; + 358F : 18; + 3590 : 8A; + 3591 : 65; + 3592 : C3; + 3593 : 85; + 3594 : AE; + 3595 : 98; + 3596 : 65; + 3597 : C4; + 3598 : 85; + 3599 : AF; + 359A : A5; + 359B : C3; + 359C : 85; + 359D : C1; + 359E : A5; + 359F : C4; + 35A0 : 85; + 35A1 : C2; + 35A2 : 20; + 35A3 : D2; + 35A4 : F5; + 35A5 : 20; + 35A6 : 4A; + 35A7 : F8; + 35A8 : 24; + 35A9 : 18; + 35AA : A6; + 35AB : AE; + 35AC : A4; + 35AD : AF; + 35AE : 60; + 35AF : A5; + 35B0 : 9D; + 35B1 : 10; + 35B2 : 1E; + 35B3 : A0; + 35B4 : 0C; + 35B5 : 20; + 35B6 : 2F; + 35B7 : F1; + 35B8 : A5; + 35B9 : B7; + 35BA : F0; + 35BB : 15; + 35BC : A0; + 35BD : 17; + 35BE : 20; + 35BF : 2F; + 35C0 : F1; + 35C1 : A4; + 35C2 : B7; + 35C3 : F0; + 35C4 : 0C; + 35C5 : A0; + 35C6 : 00; + 35C7 : B1; + 35C8 : BB; + 35C9 : 20; + 35CA : D2; + 35CB : FF; + 35CC : C8; + 35CD : C4; + 35CE : B7; + 35CF : D0; + 35D0 : F6; + 35D1 : 60; + 35D2 : A0; + 35D3 : 49; + 35D4 : A5; + 35D5 : 93; + 35D6 : F0; + 35D7 : 02; + 35D8 : A0; + 35D9 : 59; + 35DA : 4C; + 35DB : 2B; + 35DC : F1; + 35DD : 86; + 35DE : AE; + 35DF : 84; + 35E0 : AF; + 35E1 : AA; + 35E2 : B5; + 35E3 : 00; + 35E4 : 85; + 35E5 : C1; + 35E6 : B5; + 35E7 : 01; + 35E8 : 85; + 35E9 : C2; + 35EA : 6C; + 35EB : 32; + 35EC : 03; + 35ED : A5; + 35EE : BA; + 35EF : D0; + 35F0 : 03; + 35F1 : 4C; + 35F2 : 13; + 35F3 : F7; + 35F4 : C9; + 35F5 : 03; + 35F6 : F0; + 35F7 : F9; + 35F8 : 90; + 35F9 : 5F; + 35FA : A9; + 35FB : 61; + 35FC : 85; + 35FD : B9; + 35FE : A4; + 35FF : B7; + 3600 : D0; + 3601 : 03; + 3602 : 4C; + 3603 : 10; + 3604 : F7; + 3605 : 20; + 3606 : D5; + 3607 : F3; + 3608 : 20; + 3609 : 8F; + 360A : F6; + 360B : A5; + 360C : BA; + 360D : 20; + 360E : 0C; + 360F : ED; + 3610 : A5; + 3611 : B9; + 3612 : 20; + 3613 : B9; + 3614 : ED; + 3615 : A0; + 3616 : 00; + 3617 : 20; + 3618 : 8E; + 3619 : FB; + 361A : A5; + 361B : AC; + 361C : 20; + 361D : DD; + 361E : ED; + 361F : A5; + 3620 : AD; + 3621 : 20; + 3622 : DD; + 3623 : ED; + 3624 : 20; + 3625 : D1; + 3626 : FC; + 3627 : B0; + 3628 : 16; + 3629 : B1; + 362A : AC; + 362B : 20; + 362C : DD; + 362D : ED; + 362E : 20; + 362F : E1; + 3630 : FF; + 3631 : D0; + 3632 : 07; + 3633 : 20; + 3634 : 42; + 3635 : F6; + 3636 : A9; + 3637 : 00; + 3638 : 38; + 3639 : 60; + 363A : 20; + 363B : DB; + 363C : FC; + 363D : D0; + 363E : E5; + 363F : 20; + 3640 : FE; + 3641 : ED; + 3642 : 24; + 3643 : B9; + 3644 : 30; + 3645 : 11; + 3646 : A5; + 3647 : BA; + 3648 : 20; + 3649 : 0C; + 364A : ED; + 364B : A5; + 364C : B9; + 364D : 29; + 364E : EF; + 364F : 09; + 3650 : E0; + 3651 : 20; + 3652 : B9; + 3653 : ED; + 3654 : 20; + 3655 : FE; + 3656 : ED; + 3657 : 18; + 3658 : 60; + 3659 : 4A; + 365A : B0; + 365B : 03; + 365C : 4C; + 365D : 13; + 365E : F7; + 365F : 20; + 3660 : D0; + 3661 : F7; + 3662 : 90; + 3663 : 8D; + 3664 : 20; + 3665 : 38; + 3666 : F8; + 3667 : B0; + 3668 : 25; + 3669 : 20; + 366A : 8F; + 366B : F6; + 366C : A2; + 366D : 03; + 366E : A5; + 366F : B9; + 3670 : 29; + 3671 : 01; + 3672 : D0; + 3673 : 02; + 3674 : A2; + 3675 : 01; + 3676 : 8A; + 3677 : 20; + 3678 : 6A; + 3679 : F7; + 367A : B0; + 367B : 12; + 367C : 20; + 367D : 67; + 367E : F8; + 367F : B0; + 3680 : 0D; + 3681 : A5; + 3682 : B9; + 3683 : 29; + 3684 : 02; + 3685 : F0; + 3686 : 06; + 3687 : A9; + 3688 : 05; + 3689 : 20; + 368A : 6A; + 368B : F7; + 368C : 24; + 368D : 18; + 368E : 60; + 368F : A5; + 3690 : 9D; + 3691 : 10; + 3692 : FB; + 3693 : A0; + 3694 : 51; + 3695 : 20; + 3696 : 2F; + 3697 : F1; + 3698 : 4C; + 3699 : C1; + 369A : F5; + 369B : A2; + 369C : 00; + 369D : E6; + 369E : A2; + 369F : D0; + 36A0 : 06; + 36A1 : E6; + 36A2 : A1; + 36A3 : D0; + 36A4 : 02; + 36A5 : E6; + 36A6 : A0; + 36A7 : 38; + 36A8 : A5; + 36A9 : A2; + 36AA : E9; + 36AB : 01; + 36AC : A5; + 36AD : A1; + 36AE : E9; + 36AF : 1A; + 36B0 : A5; + 36B1 : A0; + 36B2 : E9; + 36B3 : 4F; + 36B4 : 90; + 36B5 : 06; + 36B6 : 86; + 36B7 : A0; + 36B8 : 86; + 36B9 : A1; + 36BA : 86; + 36BB : A2; + 36BC : AD; + 36BD : 01; + 36BE : DC; + 36BF : CD; + 36C0 : 01; + 36C1 : DC; + 36C2 : D0; + 36C3 : F8; + 36C4 : AA; + 36C5 : 30; + 36C6 : 13; + 36C7 : A2; + 36C8 : BD; + 36C9 : 8E; + 36CA : 00; + 36CB : DC; + 36CC : AE; + 36CD : 01; + 36CE : DC; + 36CF : EC; + 36D0 : 01; + 36D1 : DC; + 36D2 : D0; + 36D3 : F8; + 36D4 : 8D; + 36D5 : 00; + 36D6 : DC; + 36D7 : E8; + 36D8 : D0; + 36D9 : 02; + 36DA : 85; + 36DB : 91; + 36DC : 60; + 36DD : 78; + 36DE : A5; + 36DF : A2; + 36E0 : A6; + 36E1 : A1; + 36E2 : A4; + 36E3 : A0; + 36E4 : 78; + 36E5 : 85; + 36E6 : A2; + 36E7 : 86; + 36E8 : A1; + 36E9 : 84; + 36EA : A0; + 36EB : 58; + 36EC : 60; + 36ED : A5; + 36EE : 91; + 36EF : C9; + 36F0 : 7F; + 36F1 : D0; + 36F2 : 07; + 36F3 : 08; + 36F4 : 20; + 36F5 : CC; + 36F6 : FF; + 36F7 : 85; + 36F8 : C6; + 36F9 : 28; + 36FA : 60; + 36FB : A9; + 36FC : 01; + 36FD : 2C; + 36FE : A9; + 36FF : 02; + 3700 : 2C; + 3701 : A9; + 3702 : 03; + 3703 : 2C; + 3704 : A9; + 3705 : 04; + 3706 : 2C; + 3707 : A9; + 3708 : 05; + 3709 : 2C; + 370A : A9; + 370B : 06; + 370C : 2C; + 370D : A9; + 370E : 07; + 370F : 2C; + 3710 : A9; + 3711 : 08; + 3712 : 2C; + 3713 : A9; + 3714 : 09; + 3715 : 48; + 3716 : 20; + 3717 : CC; + 3718 : FF; + 3719 : A0; + 371A : 00; + 371B : 24; + 371C : 9D; + 371D : 50; + 371E : 0A; + 371F : 20; + 3720 : 2F; + 3721 : F1; + 3722 : 68; + 3723 : 48; + 3724 : 09; + 3725 : 30; + 3726 : 20; + 3727 : D2; + 3728 : FF; + 3729 : 68; + 372A : 38; + 372B : 60; + 372C : A5; + 372D : 93; + 372E : 48; + 372F : 20; + 3730 : 41; + 3731 : F8; + 3732 : 68; + 3733 : 85; + 3734 : 93; + 3735 : B0; + 3736 : 32; + 3737 : A0; + 3738 : 00; + 3739 : B1; + 373A : B2; + 373B : C9; + 373C : 05; + 373D : F0; + 373E : 2A; + 373F : C9; + 3740 : 01; + 3741 : F0; + 3742 : 08; + 3743 : C9; + 3744 : 03; + 3745 : F0; + 3746 : 04; + 3747 : C9; + 3748 : 04; + 3749 : D0; + 374A : E1; + 374B : AA; + 374C : 24; + 374D : 9D; + 374E : 10; + 374F : 17; + 3750 : A0; + 3751 : 63; + 3752 : 20; + 3753 : 2F; + 3754 : F1; + 3755 : A0; + 3756 : 05; + 3757 : B1; + 3758 : B2; + 3759 : 20; + 375A : D2; + 375B : FF; + 375C : C8; + 375D : C0; + 375E : 15; + 375F : D0; + 3760 : F6; + 3761 : A5; + 3762 : A1; + 3763 : 20; + 3764 : E0; + 3765 : E4; + 3766 : EA; + 3767 : 18; + 3768 : 88; + 3769 : 60; + 376A : 85; + 376B : 9E; + 376C : 20; + 376D : D0; + 376E : F7; + 376F : 90; + 3770 : 5E; + 3771 : A5; + 3772 : C2; + 3773 : 48; + 3774 : A5; + 3775 : C1; + 3776 : 48; + 3777 : A5; + 3778 : AF; + 3779 : 48; + 377A : A5; + 377B : AE; + 377C : 48; + 377D : A0; + 377E : BF; + 377F : A9; + 3780 : 20; + 3781 : 91; + 3782 : B2; + 3783 : 88; + 3784 : D0; + 3785 : FB; + 3786 : A5; + 3787 : 9E; + 3788 : 91; + 3789 : B2; + 378A : C8; + 378B : A5; + 378C : C1; + 378D : 91; + 378E : B2; + 378F : C8; + 3790 : A5; + 3791 : C2; + 3792 : 91; + 3793 : B2; + 3794 : C8; + 3795 : A5; + 3796 : AE; + 3797 : 91; + 3798 : B2; + 3799 : C8; + 379A : A5; + 379B : AF; + 379C : 91; + 379D : B2; + 379E : C8; + 379F : 84; + 37A0 : 9F; + 37A1 : A0; + 37A2 : 00; + 37A3 : 84; + 37A4 : 9E; + 37A5 : A4; + 37A6 : 9E; + 37A7 : C4; + 37A8 : B7; + 37A9 : F0; + 37AA : 0C; + 37AB : B1; + 37AC : BB; + 37AD : A4; + 37AE : 9F; + 37AF : 91; + 37B0 : B2; + 37B1 : E6; + 37B2 : 9E; + 37B3 : E6; + 37B4 : 9F; + 37B5 : D0; + 37B6 : EE; + 37B7 : 20; + 37B8 : D7; + 37B9 : F7; + 37BA : A9; + 37BB : 69; + 37BC : 85; + 37BD : AB; + 37BE : 20; + 37BF : 6B; + 37C0 : F8; + 37C1 : A8; + 37C2 : 68; + 37C3 : 85; + 37C4 : AE; + 37C5 : 68; + 37C6 : 85; + 37C7 : AF; + 37C8 : 68; + 37C9 : 85; + 37CA : C1; + 37CB : 68; + 37CC : 85; + 37CD : C2; + 37CE : 98; + 37CF : 60; + 37D0 : A6; + 37D1 : B2; + 37D2 : A4; + 37D3 : B3; + 37D4 : C0; + 37D5 : 02; + 37D6 : 60; + 37D7 : 20; + 37D8 : D0; + 37D9 : F7; + 37DA : 8A; + 37DB : 85; + 37DC : C1; + 37DD : 18; + 37DE : 69; + 37DF : C0; + 37E0 : 85; + 37E1 : AE; + 37E2 : 98; + 37E3 : 85; + 37E4 : C2; + 37E5 : 69; + 37E6 : 00; + 37E7 : 85; + 37E8 : AF; + 37E9 : 60; + 37EA : 20; + 37EB : 2C; + 37EC : F7; + 37ED : B0; + 37EE : 1D; + 37EF : A0; + 37F0 : 05; + 37F1 : 84; + 37F2 : 9F; + 37F3 : A0; + 37F4 : 00; + 37F5 : 84; + 37F6 : 9E; + 37F7 : C4; + 37F8 : B7; + 37F9 : F0; + 37FA : 10; + 37FB : B1; + 37FC : BB; + 37FD : A4; + 37FE : 9F; + 37FF : D1; + 3800 : B2; + 3801 : D0; + 3802 : E7; + 3803 : E6; + 3804 : 9E; + 3805 : E6; + 3806 : 9F; + 3807 : A4; + 3808 : 9E; + 3809 : D0; + 380A : EC; + 380B : 18; + 380C : 60; + 380D : 20; + 380E : D0; + 380F : F7; + 3810 : E6; + 3811 : A6; + 3812 : A4; + 3813 : A6; + [3814..3815] : C0; + 3816 : 60; + 3817 : 20; + 3818 : 2E; + 3819 : F8; + 381A : F0; + 381B : 1A; + 381C : A0; + 381D : 1B; + 381E : 20; + 381F : 2F; + 3820 : F1; + 3821 : 20; + 3822 : D0; + 3823 : F8; + 3824 : 20; + 3825 : 2E; + 3826 : F8; + 3827 : D0; + 3828 : F8; + 3829 : A0; + 382A : 6A; + 382B : 4C; + 382C : 2F; + 382D : F1; + 382E : A9; + 382F : 10; + 3830 : 24; + 3831 : 01; + 3832 : D0; + 3833 : 02; + 3834 : 24; + 3835 : 01; + 3836 : 18; + 3837 : 60; + 3838 : 20; + 3839 : 2E; + 383A : F8; + 383B : F0; + 383C : F9; + 383D : A0; + 383E : 2E; + 383F : D0; + 3840 : DD; + 3841 : A9; + 3842 : 00; + 3843 : 85; + 3844 : 90; + 3845 : 85; + 3846 : 93; + 3847 : 20; + 3848 : D7; + 3849 : F7; + 384A : 20; + 384B : 17; + 384C : F8; + 384D : B0; + 384E : 1F; + 384F : 78; + 3850 : A9; + 3851 : 00; + 3852 : 85; + 3853 : AA; + 3854 : 85; + 3855 : B4; + 3856 : 85; + 3857 : B0; + 3858 : 85; + 3859 : 9E; + 385A : 85; + 385B : 9F; + 385C : 85; + 385D : 9C; + 385E : A9; + 385F : 90; + 3860 : A2; + 3861 : 0E; + 3862 : D0; + 3863 : 11; + 3864 : 20; + 3865 : D7; + 3866 : F7; + 3867 : A9; + 3868 : 14; + 3869 : 85; + 386A : AB; + 386B : 20; + 386C : 38; + 386D : F8; + 386E : B0; + 386F : 6C; + 3870 : 78; + 3871 : A9; + 3872 : 82; + 3873 : A2; + 3874 : 08; + 3875 : A0; + 3876 : 7F; + 3877 : 8C; + 3878 : 0D; + 3879 : DC; + 387A : 8D; + 387B : 0D; + 387C : DC; + 387D : AD; + 387E : 0E; + 387F : DC; + 3880 : 09; + 3881 : 19; + 3882 : 8D; + 3883 : 0F; + 3884 : DC; + 3885 : 29; + 3886 : 91; + 3887 : 8D; + 3888 : A2; + 3889 : 02; + 388A : 20; + 388B : A4; + 388C : F0; + 388D : AD; + 388E : 11; + 388F : D0; + 3890 : 29; + 3891 : EF; + 3892 : 8D; + 3893 : 11; + 3894 : D0; + 3895 : AD; + 3896 : 14; + 3897 : 03; + 3898 : 8D; + 3899 : 9F; + 389A : 02; + 389B : AD; + 389C : 15; + 389D : 03; + 389E : 8D; + 389F : A0; + 38A0 : 02; + 38A1 : 20; + 38A2 : BD; + 38A3 : FC; + 38A4 : A9; + 38A5 : 02; + 38A6 : 85; + 38A7 : BE; + 38A8 : 20; + 38A9 : 97; + 38AA : FB; + 38AB : A5; + 38AC : 01; + 38AD : 29; + 38AE : 1F; + 38AF : 85; + 38B0 : 01; + 38B1 : 85; + 38B2 : C0; + 38B3 : A2; + 38B4 : FF; + 38B5 : A0; + 38B6 : FF; + 38B7 : 88; + 38B8 : D0; + 38B9 : FD; + 38BA : CA; + 38BB : D0; + 38BC : F8; + 38BD : 58; + 38BE : AD; + 38BF : A0; + 38C0 : 02; + 38C1 : CD; + 38C2 : 15; + 38C3 : 03; + 38C4 : 18; + 38C5 : F0; + 38C6 : 15; + 38C7 : 20; + 38C8 : D0; + 38C9 : F8; + 38CA : 20; + 38CB : BC; + 38CC : F6; + 38CD : 4C; + 38CE : BE; + 38CF : F8; + 38D0 : 20; + 38D1 : E1; + 38D2 : FF; + 38D3 : 18; + 38D4 : D0; + 38D5 : 0B; + 38D6 : 20; + 38D7 : 93; + 38D8 : FC; + 38D9 : 38; + [38DA..38DB] : 68; + 38DC : A9; + 38DD : 00; + 38DE : 8D; + 38DF : A0; + 38E0 : 02; + 38E1 : 60; + 38E2 : 86; + 38E3 : B1; + 38E4 : A5; + 38E5 : B0; + [38E6..38E7] : 0A; + 38E8 : 18; + 38E9 : 65; + 38EA : B0; + 38EB : 18; + 38EC : 65; + 38ED : B1; + 38EE : 85; + 38EF : B1; + 38F0 : A9; + 38F1 : 00; + 38F2 : 24; + 38F3 : B0; + 38F4 : 30; + 38F5 : 01; + 38F6 : 2A; + 38F7 : 06; + 38F8 : B1; + 38F9 : 2A; + 38FA : 06; + 38FB : B1; + 38FC : 2A; + 38FD : AA; + 38FE : AD; + 38FF : 06; + 3900 : DC; + 3901 : C9; + 3902 : 16; + 3903 : 90; + 3904 : F9; + 3905 : 65; + 3906 : B1; + 3907 : 8D; + 3908 : 04; + 3909 : DC; + 390A : 8A; + 390B : 6D; + 390C : 07; + 390D : DC; + 390E : 8D; + 390F : 05; + 3910 : DC; + 3911 : AD; + 3912 : A2; + 3913 : 02; + 3914 : 8D; + 3915 : 0E; + 3916 : DC; + 3917 : 8D; + 3918 : A4; + 3919 : 02; + 391A : AD; + 391B : 0D; + 391C : DC; + 391D : 29; + 391E : 10; + 391F : F0; + 3920 : 09; + 3921 : A9; + 3922 : F9; + 3923 : 48; + 3924 : A9; + 3925 : 2A; + 3926 : 48; + 3927 : 4C; + 3928 : 43; + 3929 : FF; + 392A : 58; + 392B : 60; + 392C : AE; + 392D : 07; + 392E : DC; + 392F : A0; + 3930 : FF; + 3931 : 98; + 3932 : ED; + 3933 : 06; + 3934 : DC; + 3935 : EC; + 3936 : 07; + 3937 : DC; + 3938 : D0; + 3939 : F2; + 393A : 86; + 393B : B1; + 393C : AA; + 393D : 8C; + 393E : 06; + 393F : DC; + 3940 : 8C; + 3941 : 07; + 3942 : DC; + 3943 : A9; + 3944 : 19; + 3945 : 8D; + 3946 : 0F; + 3947 : DC; + 3948 : AD; + 3949 : 0D; + 394A : DC; + 394B : 8D; + 394C : A3; + 394D : 02; + 394E : 98; + 394F : E5; + 3950 : B1; + 3951 : 86; + 3952 : B1; + 3953 : 4A; + 3954 : 66; + 3955 : B1; + 3956 : 4A; + 3957 : 66; + 3958 : B1; + 3959 : A5; + 395A : B0; + 395B : 18; + 395C : 69; + 395D : 3C; + 395E : C5; + 395F : B1; + 3960 : B0; + 3961 : 4A; + 3962 : A6; + 3963 : 9C; + 3964 : F0; + 3965 : 03; + 3966 : 4C; + 3967 : 60; + 3968 : FA; + 3969 : A6; + 396A : A3; + 396B : 30; + 396C : 1B; + 396D : A2; + 396E : 00; + 396F : 69; + 3970 : 30; + 3971 : 65; + 3972 : B0; + 3973 : C5; + 3974 : B1; + 3975 : B0; + 3976 : 1C; + 3977 : E8; + 3978 : 69; + 3979 : 26; + 397A : 65; + 397B : B0; + 397C : C5; + 397D : B1; + 397E : B0; + 397F : 17; + 3980 : 69; + 3981 : 2C; + 3982 : 65; + 3983 : B0; + 3984 : C5; + 3985 : B1; + 3986 : 90; + 3987 : 03; + 3988 : 4C; + 3989 : 10; + 398A : FA; + 398B : A5; + 398C : B4; + 398D : F0; + 398E : 1D; + 398F : 85; + 3990 : A8; + 3991 : D0; + 3992 : 19; + 3993 : E6; + 3994 : A9; + 3995 : B0; + 3996 : 02; + 3997 : C6; + 3998 : A9; + 3999 : 38; + 399A : E9; + 399B : 13; + 399C : E5; + 399D : B1; + 399E : 65; + 399F : 92; + 39A0 : 85; + 39A1 : 92; + 39A2 : A5; + 39A3 : A4; + 39A4 : 49; + 39A5 : 01; + 39A6 : 85; + 39A7 : A4; + 39A8 : F0; + 39A9 : 2B; + 39AA : 86; + 39AB : D7; + 39AC : A5; + 39AD : B4; + 39AE : F0; + 39AF : 22; + 39B0 : AD; + 39B1 : A3; + 39B2 : 02; + 39B3 : 29; + 39B4 : 01; + 39B5 : D0; + 39B6 : 05; + 39B7 : AD; + 39B8 : A4; + 39B9 : 02; + 39BA : D0; + 39BB : 16; + 39BC : A9; + 39BD : 00; + 39BE : 85; + 39BF : A4; + 39C0 : 8D; + 39C1 : A4; + 39C2 : 02; + 39C3 : A5; + 39C4 : A3; + 39C5 : 10; + [39C6..39C7] : 30; + 39C8 : BF; + 39C9 : A2; + 39CA : A6; + 39CB : 20; + 39CC : E2; + 39CD : F8; + 39CE : A5; + 39CF : 9B; + 39D0 : D0; + 39D1 : B9; + 39D2 : 4C; + 39D3 : BC; + 39D4 : FE; + 39D5 : A5; + 39D6 : 92; + 39D7 : F0; + 39D8 : 07; + 39D9 : 30; + 39DA : 03; + 39DB : C6; + 39DC : B0; + 39DD : 2C; + 39DE : E6; + 39DF : B0; + 39E0 : A9; + 39E1 : 00; + 39E2 : 85; + 39E3 : 92; + 39E4 : E4; + 39E5 : D7; + 39E6 : D0; + 39E7 : 0F; + 39E8 : 8A; + 39E9 : D0; + 39EA : A0; + 39EB : A5; + 39EC : A9; + 39ED : 30; + 39EE : BD; + 39EF : C9; + 39F0 : 10; + 39F1 : 90; + 39F2 : B9; + 39F3 : 85; + 39F4 : 96; + 39F5 : B0; + 39F6 : B5; + 39F7 : 8A; + 39F8 : 45; + 39F9 : 9B; + 39FA : 85; + 39FB : 9B; + 39FC : A5; + 39FD : B4; + 39FE : F0; + 39FF : D2; + 3A00 : C6; + 3A01 : A3; + 3A02 : 30; + 3A03 : C5; + 3A04 : 46; + 3A05 : D7; + 3A06 : 66; + 3A07 : BF; + 3A08 : A2; + 3A09 : DA; + 3A0A : 20; + 3A0B : E2; + 3A0C : F8; + 3A0D : 4C; + 3A0E : BC; + 3A0F : FE; + 3A10 : A5; + 3A11 : 96; + 3A12 : F0; + 3A13 : 04; + 3A14 : A5; + 3A15 : B4; + 3A16 : F0; + 3A17 : 07; + 3A18 : A5; + 3A19 : A3; + 3A1A : 30; + 3A1B : 03; + 3A1C : 4C; + 3A1D : 97; + 3A1E : F9; + 3A1F : 46; + 3A20 : B1; + 3A21 : A9; + 3A22 : 93; + 3A23 : 38; + 3A24 : E5; + 3A25 : B1; + 3A26 : 65; + 3A27 : B0; + 3A28 : 0A; + 3A29 : AA; + 3A2A : 20; + 3A2B : E2; + 3A2C : F8; + 3A2D : E6; + 3A2E : 9C; + 3A2F : A5; + 3A30 : B4; + 3A31 : D0; + 3A32 : 11; + 3A33 : A5; + 3A34 : 96; + 3A35 : F0; + 3A36 : 26; + 3A37 : 85; + 3A38 : A8; + 3A39 : A9; + 3A3A : 00; + 3A3B : 85; + 3A3C : 96; + 3A3D : A9; + 3A3E : 81; + 3A3F : 8D; + 3A40 : 0D; + 3A41 : DC; + 3A42 : 85; + 3A43 : B4; + 3A44 : A5; + 3A45 : 96; + 3A46 : 85; + 3A47 : B5; + 3A48 : F0; + 3A49 : 09; + 3A4A : A9; + 3A4B : 00; + 3A4C : 85; + 3A4D : B4; + 3A4E : A9; + 3A4F : 01; + 3A50 : 8D; + 3A51 : 0D; + 3A52 : DC; + 3A53 : A5; + 3A54 : BF; + 3A55 : 85; + 3A56 : BD; + 3A57 : A5; + 3A58 : A8; + 3A59 : 05; + 3A5A : A9; + 3A5B : 85; + 3A5C : B6; + 3A5D : 4C; + 3A5E : BC; + 3A5F : FE; + 3A60 : 20; + 3A61 : 97; + 3A62 : FB; + 3A63 : 85; + 3A64 : 9C; + 3A65 : A2; + 3A66 : DA; + 3A67 : 20; + 3A68 : E2; + 3A69 : F8; + 3A6A : A5; + 3A6B : BE; + 3A6C : F0; + 3A6D : 02; + 3A6E : 85; + 3A6F : A7; + 3A70 : A9; + 3A71 : 0F; + 3A72 : 24; + 3A73 : AA; + 3A74 : 10; + 3A75 : 17; + 3A76 : A5; + 3A77 : B5; + 3A78 : D0; + 3A79 : 0C; + 3A7A : A6; + 3A7B : BE; + 3A7C : CA; + 3A7D : D0; + 3A7E : 0B; + 3A7F : A9; + 3A80 : 08; + 3A81 : 20; + 3A82 : 1C; + 3A83 : FE; + 3A84 : D0; + 3A85 : 04; + 3A86 : A9; + 3A87 : 00; + 3A88 : 85; + 3A89 : AA; + 3A8A : 4C; + 3A8B : BC; + 3A8C : FE; + 3A8D : 70; + 3A8E : 31; + 3A8F : D0; + 3A90 : 18; + 3A91 : A5; + 3A92 : B5; + 3A93 : D0; + 3A94 : F5; + 3A95 : A5; + 3A96 : B6; + 3A97 : D0; + 3A98 : F1; + 3A99 : A5; + 3A9A : A7; + 3A9B : 4A; + 3A9C : A5; + 3A9D : BD; + 3A9E : 30; + 3A9F : 03; + 3AA0 : 90; + [3AA1..3AA2] : 18; + 3AA3 : B0; + 3AA4 : 15; + 3AA5 : 29; + 3AA6 : 0F; + 3AA7 : 85; + 3AA8 : AA; + 3AA9 : C6; + 3AAA : AA; + 3AAB : D0; + 3AAC : DD; + 3AAD : A9; + 3AAE : 40; + 3AAF : 85; + 3AB0 : AA; + 3AB1 : 20; + 3AB2 : 8E; + 3AB3 : FB; + 3AB4 : A9; + 3AB5 : 00; + 3AB6 : 85; + 3AB7 : AB; + 3AB8 : F0; + 3AB9 : D0; + 3ABA : A9; + 3ABB : 80; + 3ABC : 85; + 3ABD : AA; + 3ABE : D0; + 3ABF : CA; + 3AC0 : A5; + 3AC1 : B5; + 3AC2 : F0; + 3AC3 : 0A; + 3AC4 : A9; + 3AC5 : 04; + 3AC6 : 20; + 3AC7 : 1C; + 3AC8 : FE; + 3AC9 : A9; + 3ACA : 00; + 3ACB : 4C; + 3ACC : 4A; + 3ACD : FB; + 3ACE : 20; + 3ACF : D1; + 3AD0 : FC; + 3AD1 : 90; + 3AD2 : 03; + 3AD3 : 4C; + 3AD4 : 48; + 3AD5 : FB; + 3AD6 : A6; + 3AD7 : A7; + 3AD8 : CA; + 3AD9 : F0; + 3ADA : 2D; + 3ADB : A5; + 3ADC : 93; + 3ADD : F0; + 3ADE : 0C; + 3ADF : A0; + 3AE0 : 00; + 3AE1 : A5; + 3AE2 : BD; + 3AE3 : D1; + 3AE4 : AC; + 3AE5 : F0; + 3AE6 : 04; + 3AE7 : A9; + 3AE8 : 01; + 3AE9 : 85; + 3AEA : B6; + 3AEB : A5; + 3AEC : B6; + 3AED : F0; + 3AEE : 4B; + 3AEF : A2; + 3AF0 : 3D; + 3AF1 : E4; + 3AF2 : 9E; + 3AF3 : 90; + 3AF4 : 3E; + 3AF5 : A6; + 3AF6 : 9E; + 3AF7 : A5; + 3AF8 : AD; + 3AF9 : 9D; + [3AFA..3AFB] : 01; + 3AFC : A5; + 3AFD : AC; + 3AFE : 9D; + 3AFF : 00; + 3B00 : 01; + [3B01..3B02] : E8; + 3B03 : 86; + 3B04 : 9E; + 3B05 : 4C; + 3B06 : 3A; + 3B07 : FB; + 3B08 : A6; + 3B09 : 9F; + 3B0A : E4; + 3B0B : 9E; + 3B0C : F0; + 3B0D : 35; + 3B0E : A5; + 3B0F : AC; + 3B10 : DD; + 3B11 : 00; + 3B12 : 01; + 3B13 : D0; + 3B14 : 2E; + 3B15 : A5; + 3B16 : AD; + 3B17 : DD; + [3B18..3B19] : 01; + 3B1A : D0; + 3B1B : 27; + 3B1C : E6; + 3B1D : 9F; + 3B1E : E6; + 3B1F : 9F; + 3B20 : A5; + 3B21 : 93; + 3B22 : F0; + 3B23 : 0B; + 3B24 : A5; + 3B25 : BD; + 3B26 : A0; + 3B27 : 00; + 3B28 : D1; + 3B29 : AC; + 3B2A : F0; + 3B2B : 17; + 3B2C : C8; + 3B2D : 84; + 3B2E : B6; + 3B2F : A5; + 3B30 : B6; + 3B31 : F0; + 3B32 : 07; + 3B33 : A9; + 3B34 : 10; + 3B35 : 20; + 3B36 : 1C; + 3B37 : FE; + 3B38 : D0; + 3B39 : 09; + 3B3A : A5; + 3B3B : 93; + 3B3C : D0; + 3B3D : 05; + 3B3E : A8; + 3B3F : A5; + 3B40 : BD; + 3B41 : 91; + 3B42 : AC; + 3B43 : 20; + 3B44 : DB; + 3B45 : FC; + 3B46 : D0; + 3B47 : 43; + 3B48 : A9; + 3B49 : 80; + 3B4A : 85; + 3B4B : AA; + 3B4C : 78; + 3B4D : A2; + 3B4E : 01; + 3B4F : 8E; + 3B50 : 0D; + 3B51 : DC; + 3B52 : AE; + 3B53 : 0D; + 3B54 : DC; + 3B55 : A6; + 3B56 : BE; + 3B57 : CA; + 3B58 : 30; + 3B59 : 02; + 3B5A : 86; + 3B5B : BE; + 3B5C : C6; + 3B5D : A7; + 3B5E : F0; + 3B5F : 08; + 3B60 : A5; + 3B61 : 9E; + 3B62 : D0; + 3B63 : 27; + 3B64 : 85; + 3B65 : BE; + 3B66 : F0; + 3B67 : 23; + 3B68 : 20; + 3B69 : 93; + 3B6A : FC; + 3B6B : 20; + 3B6C : 8E; + 3B6D : FB; + 3B6E : A0; + 3B6F : 00; + 3B70 : 84; + 3B71 : AB; + 3B72 : B1; + 3B73 : AC; + 3B74 : 45; + 3B75 : AB; + 3B76 : 85; + 3B77 : AB; + 3B78 : 20; + 3B79 : DB; + 3B7A : FC; + 3B7B : 20; + 3B7C : D1; + 3B7D : FC; + 3B7E : 90; + 3B7F : F2; + 3B80 : A5; + 3B81 : AB; + 3B82 : 45; + 3B83 : BD; + 3B84 : F0; + 3B85 : 05; + 3B86 : A9; + [3B87..3B88] : 20; + 3B89 : 1C; + 3B8A : FE; + 3B8B : 4C; + 3B8C : BC; + 3B8D : FE; + 3B8E : A5; + 3B8F : C2; + 3B90 : 85; + 3B91 : AD; + 3B92 : A5; + 3B93 : C1; + 3B94 : 85; + 3B95 : AC; + 3B96 : 60; + 3B97 : A9; + 3B98 : 08; + 3B99 : 85; + 3B9A : A3; + 3B9B : A9; + 3B9C : 00; + 3B9D : 85; + 3B9E : A4; + 3B9F : 85; + 3BA0 : A8; + 3BA1 : 85; + 3BA2 : 9B; + 3BA3 : 85; + 3BA4 : A9; + 3BA5 : 60; + 3BA6 : A5; + 3BA7 : BD; + 3BA8 : 4A; + 3BA9 : A9; + 3BAA : 60; + 3BAB : 90; + 3BAC : 02; + 3BAD : A9; + 3BAE : B0; + 3BAF : A2; + 3BB0 : 00; + 3BB1 : 8D; + 3BB2 : 06; + 3BB3 : DC; + 3BB4 : 8E; + 3BB5 : 07; + 3BB6 : DC; + 3BB7 : AD; + 3BB8 : 0D; + 3BB9 : DC; + 3BBA : A9; + 3BBB : 19; + 3BBC : 8D; + 3BBD : 0F; + 3BBE : DC; + 3BBF : A5; + 3BC0 : 01; + 3BC1 : 49; + 3BC2 : 08; + 3BC3 : 85; + 3BC4 : 01; + 3BC5 : 29; + 3BC6 : 08; + 3BC7 : 60; + 3BC8 : 38; + 3BC9 : 66; + 3BCA : B6; + 3BCB : 30; + 3BCC : 3C; + 3BCD : A5; + 3BCE : A8; + 3BCF : D0; + 3BD0 : 12; + 3BD1 : A9; + 3BD2 : 10; + 3BD3 : A2; + 3BD4 : 01; + 3BD5 : 20; + 3BD6 : B1; + 3BD7 : FB; + 3BD8 : D0; + 3BD9 : 2F; + 3BDA : E6; + 3BDB : A8; + 3BDC : A5; + 3BDD : B6; + 3BDE : 10; + 3BDF : 29; + 3BE0 : 4C; + 3BE1 : 57; + 3BE2 : FC; + 3BE3 : A5; + 3BE4 : A9; + 3BE5 : D0; + 3BE6 : 09; + 3BE7 : 20; + 3BE8 : AD; + 3BE9 : FB; + 3BEA : D0; + 3BEB : 1D; + 3BEC : E6; + 3BED : A9; + 3BEE : D0; + 3BEF : 19; + 3BF0 : 20; + 3BF1 : A6; + 3BF2 : FB; + 3BF3 : D0; + 3BF4 : 14; + 3BF5 : A5; + 3BF6 : A4; + 3BF7 : 49; + 3BF8 : 01; + 3BF9 : 85; + 3BFA : A4; + 3BFB : F0; + 3BFC : 0F; + 3BFD : A5; + 3BFE : BD; + 3BFF : 49; + 3C00 : 01; + 3C01 : 85; + 3C02 : BD; + 3C03 : 29; + 3C04 : 01; + 3C05 : 45; + 3C06 : 9B; + 3C07 : 85; + 3C08 : 9B; + 3C09 : 4C; + 3C0A : BC; + 3C0B : FE; + 3C0C : 46; + 3C0D : BD; + 3C0E : C6; + 3C0F : A3; + 3C10 : A5; + 3C11 : A3; + 3C12 : F0; + 3C13 : 3A; + 3C14 : 10; + 3C15 : F3; + 3C16 : 20; + 3C17 : 97; + 3C18 : FB; + 3C19 : 58; + [3C1A..3C1B] : A5; + 3C1C : F0; + 3C1D : 12; + 3C1E : A2; + 3C1F : 00; + 3C20 : 86; + 3C21 : D7; + 3C22 : C6; + 3C23 : A5; + 3C24 : A6; + 3C25 : BE; + 3C26 : E0; + 3C27 : 02; + 3C28 : D0; + 3C29 : 02; + 3C2A : 09; + 3C2B : 80; + 3C2C : 85; + 3C2D : BD; + 3C2E : D0; + 3C2F : D9; + 3C30 : 20; + 3C31 : D1; + 3C32 : FC; + 3C33 : 90; + 3C34 : 0A; + 3C35 : D0; + 3C36 : 91; + 3C37 : E6; + 3C38 : AD; + 3C39 : A5; + 3C3A : D7; + 3C3B : 85; + 3C3C : BD; + 3C3D : B0; + 3C3E : CA; + 3C3F : A0; + 3C40 : 00; + 3C41 : B1; + 3C42 : AC; + 3C43 : 85; + 3C44 : BD; + 3C45 : 45; + 3C46 : D7; + 3C47 : 85; + 3C48 : D7; + 3C49 : 20; + 3C4A : DB; + 3C4B : FC; + 3C4C : D0; + 3C4D : BB; + 3C4E : A5; + 3C4F : 9B; + 3C50 : 49; + 3C51 : 01; + 3C52 : 85; + 3C53 : BD; + 3C54 : 4C; + 3C55 : BC; + 3C56 : FE; + 3C57 : C6; + 3C58 : BE; + 3C59 : D0; + 3C5A : 03; + 3C5B : 20; + 3C5C : CA; + 3C5D : FC; + 3C5E : A9; + 3C5F : 50; + 3C60 : 85; + 3C61 : A7; + 3C62 : A2; + 3C63 : 08; + 3C64 : 78; + 3C65 : 20; + 3C66 : BD; + 3C67 : FC; + 3C68 : D0; + 3C69 : EA; + 3C6A : A9; + 3C6B : 78; + 3C6C : 20; + 3C6D : AF; + 3C6E : FB; + 3C6F : D0; + 3C70 : E3; + 3C71 : C6; + 3C72 : A7; + 3C73 : D0; + 3C74 : DF; + 3C75 : 20; + 3C76 : 97; + 3C77 : FB; + 3C78 : C6; + 3C79 : AB; + 3C7A : 10; + 3C7B : D8; + 3C7C : A2; + 3C7D : 0A; + 3C7E : 20; + 3C7F : BD; + 3C80 : FC; + 3C81 : 58; + 3C82 : E6; + 3C83 : AB; + 3C84 : A5; + 3C85 : BE; + 3C86 : F0; + 3C87 : 30; + 3C88 : 20; + 3C89 : 8E; + 3C8A : FB; + 3C8B : A2; + 3C8C : 09; + 3C8D : 86; + 3C8E : A5; + 3C8F : 86; + 3C90 : B6; + 3C91 : D0; + 3C92 : 83; + 3C93 : 08; + 3C94 : 78; + 3C95 : AD; + 3C96 : 11; + 3C97 : D0; + 3C98 : 09; + 3C99 : 10; + 3C9A : 8D; + 3C9B : 11; + 3C9C : D0; + 3C9D : 20; + 3C9E : CA; + 3C9F : FC; + 3CA0 : A9; + 3CA1 : 7F; + 3CA2 : 8D; + 3CA3 : 0D; + 3CA4 : DC; + 3CA5 : 20; + 3CA6 : DD; + 3CA7 : FD; + 3CA8 : AD; + 3CA9 : A0; + 3CAA : 02; + 3CAB : F0; + 3CAC : 09; + 3CAD : 8D; + 3CAE : 15; + 3CAF : 03; + 3CB0 : AD; + 3CB1 : 9F; + 3CB2 : 02; + 3CB3 : 8D; + 3CB4 : 14; + 3CB5 : 03; + 3CB6 : 28; + 3CB7 : 60; + 3CB8 : 20; + 3CB9 : 93; + 3CBA : FC; + 3CBB : F0; + 3CBC : 97; + 3CBD : BD; + 3CBE : 93; + 3CBF : FD; + 3CC0 : 8D; + 3CC1 : 14; + 3CC2 : 03; + 3CC3 : BD; + 3CC4 : 94; + 3CC5 : FD; + 3CC6 : 8D; + 3CC7 : 15; + 3CC8 : 03; + 3CC9 : 60; + 3CCA : A5; + 3CCB : 01; + 3CCC : 09; + 3CCD : 20; + 3CCE : 85; + 3CCF : 01; + 3CD0 : 60; + 3CD1 : 38; + 3CD2 : A5; + 3CD3 : AC; + 3CD4 : E5; + 3CD5 : AE; + 3CD6 : A5; + 3CD7 : AD; + 3CD8 : E5; + 3CD9 : AF; + 3CDA : 60; + 3CDB : E6; + 3CDC : AC; + 3CDD : D0; + 3CDE : 02; + 3CDF : E6; + 3CE0 : AD; + 3CE1 : 60; + 3CE2 : A2; + 3CE3 : FF; + 3CE4 : 78; + 3CE5 : 9A; + 3CE6 : D8; + 3CE7 : 20; + 3CE8 : 02; + 3CE9 : FD; + 3CEA : D0; + 3CEB : 03; + 3CEC : 6C; + 3CED : 00; + 3CEE : 80; + 3CEF : 8E; + 3CF0 : 16; + 3CF1 : D0; + 3CF2 : 20; + 3CF3 : A3; + 3CF4 : FD; + 3CF5 : 20; + 3CF6 : 50; + 3CF7 : FD; + 3CF8 : 20; + 3CF9 : 15; + 3CFA : FD; + 3CFB : 20; + 3CFC : 5B; + 3CFD : FF; + 3CFE : 58; + 3CFF : 6C; + 3D00 : 00; + 3D01 : A0; + 3D02 : A2; + 3D03 : 05; + 3D04 : BD; + 3D05 : 0F; + 3D06 : FD; + 3D07 : DD; + 3D08 : 03; + 3D09 : 80; + 3D0A : D0; + 3D0B : 03; + 3D0C : CA; + 3D0D : D0; + 3D0E : F5; + 3D0F : 60; + 3D10 : C3; + 3D11 : C2; + 3D12 : CD; + 3D13 : 38; + 3D14 : 30; + 3D15 : A2; + 3D16 : 30; + 3D17 : A0; + 3D18 : FD; + 3D19 : 18; + 3D1A : 86; + 3D1B : C3; + 3D1C : 84; + 3D1D : C4; + 3D1E : A0; + 3D1F : 1F; + 3D20 : B9; + 3D21 : 14; + 3D22 : 03; + 3D23 : B0; + 3D24 : 02; + 3D25 : B1; + 3D26 : C3; + 3D27 : 91; + 3D28 : C3; + 3D29 : 99; + 3D2A : 14; + 3D2B : 03; + 3D2C : 88; + 3D2D : 10; + 3D2E : F1; + 3D2F : 60; + 3D30 : 31; + 3D31 : EA; + 3D32 : 66; + 3D33 : FE; + 3D34 : 47; + 3D35 : FE; + 3D36 : 4A; + 3D37 : F3; + 3D38 : 91; + 3D39 : F2; + 3D3A : 0E; + 3D3B : F2; + 3D3C : 50; + 3D3D : F2; + 3D3E : 33; + 3D3F : F3; + 3D40 : 57; + 3D41 : F1; + 3D42 : CA; + 3D43 : F1; + 3D44 : ED; + 3D45 : F6; + 3D46 : 3E; + 3D47 : F1; + 3D48 : 2F; + 3D49 : F3; + 3D4A : 66; + 3D4B : FE; + 3D4C : A5; + 3D4D : F4; + 3D4E : ED; + 3D4F : F5; + 3D50 : A9; + 3D51 : 00; + 3D52 : A8; + 3D53 : 99; + 3D54 : 02; + 3D55 : 00; + 3D56 : 99; + 3D57 : 00; + 3D58 : 02; + 3D59 : 99; + 3D5A : 00; + 3D5B : 03; + 3D5C : C8; + 3D5D : D0; + 3D5E : F4; + 3D5F : A2; + 3D60 : 3C; + 3D61 : A0; + 3D62 : 03; + 3D63 : 86; + 3D64 : B2; + 3D65 : 84; + 3D66 : B3; + 3D67 : A8; + 3D68 : A9; + 3D69 : 03; + 3D6A : 85; + 3D6B : C2; + 3D6C : E6; + 3D6D : C2; + 3D6E : B1; + 3D6F : C1; + 3D70 : AA; + 3D71 : A9; + 3D72 : 55; + 3D73 : 91; + 3D74 : C1; + 3D75 : D1; + 3D76 : C1; + 3D77 : D0; + 3D78 : 0F; + 3D79 : 2A; + 3D7A : 91; + 3D7B : C1; + 3D7C : D1; + 3D7D : C1; + 3D7E : D0; + 3D7F : 08; + 3D80 : 8A; + 3D81 : 91; + 3D82 : C1; + 3D83 : C8; + 3D84 : D0; + 3D85 : E8; + 3D86 : F0; + 3D87 : E4; + 3D88 : 98; + 3D89 : AA; + 3D8A : A4; + 3D8B : C2; + 3D8C : 18; + 3D8D : 20; + 3D8E : 2D; + 3D8F : FE; + 3D90 : A9; + 3D91 : 08; + 3D92 : 8D; + 3D93 : 82; + 3D94 : 02; + 3D95 : A9; + 3D96 : 04; + 3D97 : 8D; + 3D98 : 88; + 3D99 : 02; + 3D9A : 60; + 3D9B : 6A; + 3D9C : FC; + 3D9D : CD; + 3D9E : FB; + 3D9F : 31; + 3DA0 : EA; + 3DA1 : 2C; + 3DA2 : F9; + 3DA3 : A9; + 3DA4 : 7F; + 3DA5 : 8D; + 3DA6 : 0D; + 3DA7 : DC; + 3DA8 : 8D; + 3DA9 : 0D; + 3DAA : DD; + 3DAB : 8D; + 3DAC : 00; + 3DAD : DC; + 3DAE : A9; + 3DAF : 08; + 3DB0 : 8D; + 3DB1 : 0E; + 3DB2 : DC; + 3DB3 : 8D; + 3DB4 : 0E; + 3DB5 : DD; + 3DB6 : 8D; + 3DB7 : 0F; + 3DB8 : DC; + 3DB9 : 8D; + 3DBA : 0F; + 3DBB : DD; + 3DBC : A2; + 3DBD : 00; + 3DBE : 8E; + 3DBF : 03; + 3DC0 : DC; + 3DC1 : 8E; + 3DC2 : 03; + 3DC3 : DD; + 3DC4 : 8E; + 3DC5 : 18; + 3DC6 : D4; + 3DC7 : CA; + 3DC8 : 8E; + 3DC9 : 02; + 3DCA : DC; + 3DCB : A9; + 3DCC : 07; + 3DCD : 8D; + 3DCE : 00; + 3DCF : DD; + 3DD0 : A9; + 3DD1 : 3F; + 3DD2 : 8D; + 3DD3 : 02; + 3DD4 : DD; + 3DD5 : A9; + 3DD6 : E7; + 3DD7 : 85; + 3DD8 : 01; + 3DD9 : A9; + 3DDA : 2F; + 3DDB : 85; + 3DDC : 00; + 3DDD : AD; + 3DDE : A6; + 3DDF : 02; + 3DE0 : F0; + 3DE1 : 0A; + 3DE2 : A9; + 3DE3 : 25; + 3DE4 : 8D; + 3DE5 : 04; + 3DE6 : DC; + 3DE7 : A9; + 3DE8 : 40; + 3DE9 : 4C; + 3DEA : F3; + 3DEB : FD; + 3DEC : A9; + 3DED : 95; + 3DEE : 8D; + 3DEF : 04; + 3DF0 : DC; + 3DF1 : A9; + 3DF2 : 42; + 3DF3 : 8D; + 3DF4 : 05; + 3DF5 : DC; + 3DF6 : 4C; + 3DF7 : 6E; + 3DF8 : FF; + 3DF9 : 85; + 3DFA : B7; + 3DFB : 86; + 3DFC : BB; + 3DFD : 84; + 3DFE : BC; + 3DFF : 60; + 3E00 : 85; + 3E01 : B8; + 3E02 : 86; + 3E03 : BA; + 3E04 : 84; + 3E05 : B9; + 3E06 : 60; + 3E07 : A5; + 3E08 : BA; + 3E09 : C9; + 3E0A : 02; + 3E0B : D0; + 3E0C : 0D; + 3E0D : AD; + 3E0E : 97; + 3E0F : 02; + 3E10 : 48; + 3E11 : A9; + 3E12 : 00; + 3E13 : 8D; + 3E14 : 97; + 3E15 : 02; + 3E16 : 68; + 3E17 : 60; + 3E18 : 85; + 3E19 : 9D; + 3E1A : A5; + 3E1B : 90; + 3E1C : 05; + 3E1D : 90; + 3E1E : 85; + 3E1F : 90; + 3E20 : 60; + 3E21 : 8D; + 3E22 : 85; + 3E23 : 02; + 3E24 : 60; + 3E25 : 90; + 3E26 : 06; + 3E27 : AE; + 3E28 : 83; + 3E29 : 02; + 3E2A : AC; + 3E2B : 84; + 3E2C : 02; + 3E2D : 8E; + 3E2E : 83; + 3E2F : 02; + 3E30 : 8C; + 3E31 : 84; + 3E32 : 02; + 3E33 : 60; + 3E34 : 90; + 3E35 : 06; + 3E36 : AE; + 3E37 : 81; + 3E38 : 02; + 3E39 : AC; + 3E3A : 82; + 3E3B : 02; + 3E3C : 8E; + 3E3D : 81; + 3E3E : 02; + 3E3F : 8C; + 3E40 : 82; + 3E41 : 02; + 3E42 : 60; + 3E43 : 78; + 3E44 : 6C; + 3E45 : 18; + 3E46 : 03; + 3E47 : 48; + 3E48 : 8A; + 3E49 : 48; + 3E4A : 98; + 3E4B : 48; + 3E4C : A9; + 3E4D : 7F; + 3E4E : 8D; + 3E4F : 0D; + 3E50 : DD; + 3E51 : AC; + 3E52 : 0D; + 3E53 : DD; + 3E54 : 30; + 3E55 : 1C; + 3E56 : 20; + 3E57 : 02; + 3E58 : FD; + 3E59 : D0; + 3E5A : 03; + 3E5B : 6C; + 3E5C : 02; + 3E5D : 80; + 3E5E : 20; + 3E5F : BC; + 3E60 : F6; + 3E61 : 20; + 3E62 : E1; + 3E63 : FF; + 3E64 : D0; + 3E65 : 0C; + 3E66 : 20; + 3E67 : 15; + 3E68 : FD; + 3E69 : 20; + 3E6A : A3; + 3E6B : FD; + 3E6C : 20; + 3E6D : 18; + 3E6E : E5; + 3E6F : 6C; + 3E70 : 02; + 3E71 : A0; + 3E72 : 98; + 3E73 : 2D; + 3E74 : A1; + 3E75 : 02; + 3E76 : AA; + 3E77 : 29; + 3E78 : 01; + 3E79 : F0; + 3E7A : 28; + 3E7B : AD; + 3E7C : 00; + 3E7D : DD; + 3E7E : 29; + 3E7F : FB; + 3E80 : 05; + 3E81 : B5; + 3E82 : 8D; + 3E83 : 00; + 3E84 : DD; + 3E85 : AD; + 3E86 : A1; + 3E87 : 02; + 3E88 : 8D; + 3E89 : 0D; + 3E8A : DD; + 3E8B : 8A; + 3E8C : 29; + 3E8D : 12; + 3E8E : F0; + 3E8F : 0D; + 3E90 : 29; + 3E91 : 02; + 3E92 : F0; + 3E93 : 06; + 3E94 : 20; + 3E95 : D6; + 3E96 : FE; + 3E97 : 4C; + 3E98 : 9D; + 3E99 : FE; + 3E9A : 20; + 3E9B : 07; + 3E9C : FF; + 3E9D : 20; + 3E9E : BB; + 3E9F : EE; + 3EA0 : 4C; + 3EA1 : B6; + 3EA2 : FE; + 3EA3 : 8A; + 3EA4 : 29; + 3EA5 : 02; + 3EA6 : F0; + 3EA7 : 06; + 3EA8 : 20; + 3EA9 : D6; + 3EAA : FE; + 3EAB : 4C; + 3EAC : B6; + 3EAD : FE; + 3EAE : 8A; + 3EAF : 29; + 3EB0 : 10; + 3EB1 : F0; + 3EB2 : 03; + 3EB3 : 20; + 3EB4 : 07; + 3EB5 : FF; + 3EB6 : AD; + 3EB7 : A1; + 3EB8 : 02; + 3EB9 : 8D; + 3EBA : 0D; + 3EBB : DD; + 3EBC : 68; + 3EBD : A8; + 3EBE : 68; + 3EBF : AA; + 3EC0 : 68; + 3EC1 : 40; + 3EC2 : C1; + 3EC3 : 27; + 3EC4 : 3E; + 3EC5 : 1A; + 3EC6 : C5; + 3EC7 : 11; + 3EC8 : 74; + 3EC9 : 0E; + 3ECA : ED; + 3ECB : 0C; + 3ECC : 45; + 3ECD : 06; + 3ECE : F0; + 3ECF : 02; + 3ED0 : 46; + 3ED1 : 01; + 3ED2 : B8; + 3ED3 : 00; + 3ED4 : 71; + 3ED5 : 00; + 3ED6 : AD; + 3ED7 : 01; + 3ED8 : DD; + 3ED9 : 29; + 3EDA : 01; + 3EDB : 85; + 3EDC : A7; + 3EDD : AD; + 3EDE : 06; + 3EDF : DD; + 3EE0 : E9; + 3EE1 : 1C; + 3EE2 : 6D; + 3EE3 : 99; + 3EE4 : 02; + 3EE5 : 8D; + 3EE6 : 06; + 3EE7 : DD; + 3EE8 : AD; + 3EE9 : 07; + 3EEA : DD; + 3EEB : 6D; + 3EEC : 9A; + 3EED : 02; + 3EEE : 8D; + 3EEF : 07; + 3EF0 : DD; + 3EF1 : A9; + 3EF2 : 11; + 3EF3 : 8D; + 3EF4 : 0F; + 3EF5 : DD; + 3EF6 : AD; + 3EF7 : A1; + 3EF8 : 02; + 3EF9 : 8D; + 3EFA : 0D; + 3EFB : DD; + 3EFC : A9; + 3EFD : FF; + 3EFE : 8D; + 3EFF : 06; + 3F00 : DD; + 3F01 : 8D; + 3F02 : 07; + 3F03 : DD; + 3F04 : 4C; + 3F05 : 59; + 3F06 : EF; + 3F07 : AD; + 3F08 : 95; + 3F09 : 02; + 3F0A : 8D; + 3F0B : 06; + 3F0C : DD; + 3F0D : AD; + 3F0E : 96; + 3F0F : 02; + 3F10 : 8D; + 3F11 : 07; + 3F12 : DD; + 3F13 : A9; + 3F14 : 11; + 3F15 : 8D; + 3F16 : 0F; + 3F17 : DD; + 3F18 : A9; + 3F19 : 12; + 3F1A : 4D; + 3F1B : A1; + 3F1C : 02; + 3F1D : 8D; + 3F1E : A1; + 3F1F : 02; + 3F20 : A9; + 3F21 : FF; + 3F22 : 8D; + 3F23 : 06; + 3F24 : DD; + 3F25 : 8D; + 3F26 : 07; + 3F27 : DD; + 3F28 : AE; + 3F29 : 98; + 3F2A : 02; + 3F2B : 86; + 3F2C : A8; + 3F2D : 60; + 3F2E : AA; + 3F2F : AD; + 3F30 : 96; + 3F31 : 02; + 3F32 : 2A; + 3F33 : A8; + 3F34 : 8A; + 3F35 : 69; + 3F36 : C8; + 3F37 : 8D; + 3F38 : 99; + 3F39 : 02; + 3F3A : 98; + 3F3B : 69; + 3F3C : 00; + 3F3D : 8D; + 3F3E : 9A; + 3F3F : 02; + 3F40 : 60; + [3F41..3F42] : EA; + 3F43 : 08; + 3F44 : 68; + 3F45 : 29; + 3F46 : EF; + [3F47..3F48] : 48; + 3F49 : 8A; + 3F4A : 48; + 3F4B : 98; + 3F4C : 48; + 3F4D : BA; + 3F4E : BD; + 3F4F : 04; + 3F50 : 01; + 3F51 : 29; + 3F52 : 10; + 3F53 : F0; + 3F54 : 03; + 3F55 : 6C; + 3F56 : 16; + 3F57 : 03; + 3F58 : 6C; + 3F59 : 14; + 3F5A : 03; + 3F5B : 20; + 3F5C : 18; + 3F5D : E5; + 3F5E : AD; + 3F5F : 12; + [3F60..3F61] : D0; + 3F62 : FB; + 3F63 : AD; + 3F64 : 19; + 3F65 : D0; + 3F66 : 29; + 3F67 : 01; + 3F68 : 8D; + 3F69 : A6; + 3F6A : 02; + 3F6B : 4C; + 3F6C : DD; + 3F6D : FD; + 3F6E : A9; + 3F6F : 81; + 3F70 : 8D; + 3F71 : 0D; + 3F72 : DC; + 3F73 : AD; + 3F74 : 0E; + 3F75 : DC; + 3F76 : 29; + 3F77 : 80; + 3F78 : 09; + 3F79 : 11; + 3F7A : 8D; + 3F7B : 0E; + 3F7C : DC; + 3F7D : 4C; + 3F7E : 8E; + 3F7F : EE; + 3F80 : 03; + 3F81 : 4C; + 3F82 : 5B; + 3F83 : FF; + 3F84 : 4C; + 3F85 : A3; + 3F86 : FD; + 3F87 : 4C; + 3F88 : 50; + 3F89 : FD; + 3F8A : 4C; + 3F8B : 15; + 3F8C : FD; + 3F8D : 4C; + 3F8E : 1A; + 3F8F : FD; + 3F90 : 4C; + 3F91 : 18; + 3F92 : FE; + 3F93 : 4C; + 3F94 : B9; + 3F95 : ED; + 3F96 : 4C; + 3F97 : C7; + 3F98 : ED; + 3F99 : 4C; + 3F9A : 25; + 3F9B : FE; + 3F9C : 4C; + 3F9D : 34; + 3F9E : FE; + 3F9F : 4C; + 3FA0 : 87; + 3FA1 : EA; + 3FA2 : 4C; + 3FA3 : 21; + 3FA4 : FE; + 3FA5 : 4C; + 3FA6 : 13; + 3FA7 : EE; + 3FA8 : 4C; + 3FA9 : DD; + 3FAA : ED; + 3FAB : 4C; + 3FAC : EF; + 3FAD : ED; + 3FAE : 4C; + 3FAF : FE; + 3FB0 : ED; + 3FB1 : 4C; + 3FB2 : 0C; + 3FB3 : ED; + 3FB4 : 4C; + 3FB5 : 09; + 3FB6 : ED; + 3FB7 : 4C; + 3FB8 : 07; + 3FB9 : FE; + 3FBA : 4C; + 3FBB : 00; + 3FBC : FE; + 3FBD : 4C; + 3FBE : F9; + 3FBF : FD; + 3FC0 : 6C; + 3FC1 : 1A; + 3FC2 : 03; + 3FC3 : 6C; + 3FC4 : 1C; + 3FC5 : 03; + 3FC6 : 6C; + 3FC7 : 1E; + 3FC8 : 03; + 3FC9 : 6C; + 3FCA : 20; + 3FCB : 03; + 3FCC : 6C; + 3FCD : 22; + 3FCE : 03; + 3FCF : 6C; + 3FD0 : 24; + 3FD1 : 03; + 3FD2 : 6C; + 3FD3 : 26; + 3FD4 : 03; + 3FD5 : 4C; + 3FD6 : 9E; + 3FD7 : F4; + 3FD8 : 4C; + 3FD9 : DD; + 3FDA : F5; + 3FDB : 4C; + 3FDC : E4; + 3FDD : F6; + 3FDE : 4C; + 3FDF : DD; + 3FE0 : F6; + 3FE1 : 6C; + 3FE2 : 28; + 3FE3 : 03; + 3FE4 : 6C; + 3FE5 : 2A; + 3FE6 : 03; + 3FE7 : 6C; + 3FE8 : 2C; + 3FE9 : 03; + 3FEA : 4C; + 3FEB : 9B; + 3FEC : F6; + 3FED : 4C; + 3FEE : 05; + 3FEF : E5; + 3FF0 : 4C; + 3FF1 : 0A; + 3FF2 : E5; + 3FF3 : 4C; + 3FF4 : 00; + 3FF5 : E5; + [3FF6..3FF7] : 52; + 3FF8 : 42; + 3FF9 : 59; + 3FFA : 43; + 3FFB : FE; + 3FFC : E2; + 3FFD : FC; + 3FFE : 48; + 3FFF : FF; +END; diff --git a/Commodore - 64_Mist/rtl/roms/std_C64GS.mif b/Commodore - 64_Mist/rtl/roms/std_C64GS.mif new file mode 100644 index 00000000..5bffbfe2 --- /dev/null +++ b/Commodore - 64_Mist/rtl/roms/std_C64GS.mif @@ -0,0 +1,15800 @@ +-- Copyright (C) 2017 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 generated Memory Initialization File (.mif) + +WIDTH=8; +DEPTH=16384; + +ADDRESS_RADIX=HEX; +DATA_RADIX=HEX; + +CONTENT BEGIN + 0000 : 94; + 0001 : E3; + 0002 : 7B; + 0003 : E3; + 0004 : 43; + 0005 : 42; + 0006 : 4D; + 0007 : 42; + 0008 : 41; + 0009 : 53; + 000A : 49; + 000B : 43; + 000C : 30; + 000D : A8; + 000E : 41; + 000F : A7; + 0010 : 1D; + 0011 : AD; + 0012 : F7; + 0013 : A8; + 0014 : A4; + 0015 : AB; + 0016 : BE; + 0017 : AB; + 0018 : 80; + 0019 : B0; + 001A : 05; + 001B : AC; + 001C : A4; + 001D : A9; + 001E : 9F; + 001F : A8; + 0020 : 70; + 0021 : A8; + 0022 : 27; + 0023 : A9; + 0024 : 1C; + 0025 : A8; + 0026 : 82; + 0027 : A8; + 0028 : D1; + 0029 : A8; + 002A : 3A; + 002B : A9; + 002C : 2E; + 002D : A8; + 002E : 4A; + 002F : A9; + 0030 : 2C; + 0031 : B8; + 0032 : 67; + 0033 : E1; + 0034 : 55; + 0035 : E1; + 0036 : 64; + 0037 : E1; + 0038 : B2; + 0039 : B3; + 003A : 23; + 003B : B8; + 003C : 7F; + 003D : AA; + 003E : 9F; + 003F : AA; + 0040 : 56; + 0041 : A8; + 0042 : 9B; + 0043 : A6; + 0044 : 5D; + 0045 : A6; + 0046 : 85; + 0047 : AA; + 0048 : 29; + 0049 : E1; + 004A : BD; + 004B : E1; + 004C : C6; + 004D : E1; + 004E : 7A; + 004F : AB; + 0050 : 41; + 0051 : A6; + 0052 : 39; + 0053 : BC; + 0054 : CC; + 0055 : BC; + 0056 : 58; + 0057 : BC; + 0058 : 10; + 0059 : 03; + 005A : 7D; + 005B : B3; + 005C : 9E; + 005D : B3; + 005E : 71; + 005F : BF; + 0060 : 97; + 0061 : E0; + 0062 : EA; + 0063 : B9; + 0064 : ED; + 0065 : BF; + 0066 : 64; + 0067 : E2; + 0068 : 6B; + 0069 : E2; + 006A : B4; + 006B : E2; + 006C : 0E; + 006D : E3; + 006E : 0D; + 006F : B8; + 0070 : 7C; + 0071 : B7; + 0072 : 65; + 0073 : B4; + 0074 : AD; + 0075 : B7; + 0076 : 8B; + 0077 : B7; + 0078 : EC; + 0079 : B6; + 007A : 00; + 007B : B7; + 007C : 2C; + 007D : B7; + 007E : 37; + 007F : B7; + 0080 : 79; + 0081 : 69; + 0082 : B8; + 0083 : 79; + 0084 : 52; + 0085 : B8; + 0086 : 7B; + 0087 : 2A; + 0088 : BA; + 0089 : 7B; + 008A : 11; + 008B : BB; + 008C : 7F; + 008D : 7A; + 008E : BF; + 008F : 50; + 0090 : E8; + 0091 : AF; + 0092 : 46; + 0093 : E5; + 0094 : AF; + 0095 : 7D; + 0096 : B3; + 0097 : BF; + 0098 : 5A; + 0099 : D3; + 009A : AE; + 009B : 64; + 009C : 15; + 009D : B0; + 009E : 45; + 009F : 4E; + 00A0 : C4; + 00A1 : 46; + 00A2 : 4F; + 00A3 : D2; + 00A4 : 4E; + 00A5 : 45; + 00A6 : 58; + 00A7 : D4; + 00A8 : 44; + 00A9 : 41; + 00AA : 54; + 00AB : C1; + 00AC : 49; + 00AD : 4E; + 00AE : 50; + 00AF : 55; + 00B0 : 54; + 00B1 : A3; + 00B2 : 49; + 00B3 : 4E; + 00B4 : 50; + 00B5 : 55; + 00B6 : D4; + 00B7 : 44; + 00B8 : 49; + 00B9 : CD; + 00BA : 52; + 00BB : 45; + 00BC : 41; + 00BD : C4; + 00BE : 4C; + 00BF : 45; + 00C0 : D4; + 00C1 : 47; + 00C2 : 4F; + 00C3 : 54; + 00C4 : CF; + 00C5 : 52; + 00C6 : 55; + 00C7 : CE; + 00C8 : 49; + 00C9 : C6; + 00CA : 52; + 00CB : 45; + 00CC : 53; + 00CD : 54; + 00CE : 4F; + 00CF : 52; + 00D0 : C5; + 00D1 : 47; + 00D2 : 4F; + 00D3 : 53; + 00D4 : 55; + 00D5 : C2; + 00D6 : 52; + 00D7 : 45; + 00D8 : 54; + 00D9 : 55; + 00DA : 52; + 00DB : CE; + 00DC : 52; + 00DD : 45; + 00DE : CD; + 00DF : 53; + 00E0 : 54; + 00E1 : 4F; + 00E2 : D0; + 00E3 : 4F; + 00E4 : CE; + 00E5 : 57; + 00E6 : 41; + 00E7 : 49; + 00E8 : D4; + 00E9 : 4C; + 00EA : 4F; + 00EB : 41; + 00EC : C4; + 00ED : 53; + 00EE : 41; + 00EF : 56; + 00F0 : C5; + 00F1 : 56; + 00F2 : 45; + 00F3 : 52; + 00F4 : 49; + 00F5 : 46; + 00F6 : D9; + 00F7 : 44; + 00F8 : 45; + 00F9 : C6; + 00FA : 50; + 00FB : 4F; + 00FC : 4B; + 00FD : C5; + 00FE : 50; + 00FF : 52; + 0100 : 49; + 0101 : 4E; + 0102 : 54; + 0103 : A3; + 0104 : 50; + 0105 : 52; + 0106 : 49; + 0107 : 4E; + 0108 : D4; + 0109 : 43; + 010A : 4F; + 010B : 4E; + 010C : D4; + 010D : 4C; + 010E : 49; + 010F : 53; + 0110 : D4; + 0111 : 43; + 0112 : 4C; + 0113 : D2; + 0114 : 43; + 0115 : 4D; + 0116 : C4; + 0117 : 53; + 0118 : 59; + 0119 : D3; + 011A : 4F; + 011B : 50; + 011C : 45; + 011D : CE; + 011E : 43; + 011F : 4C; + 0120 : 4F; + 0121 : 53; + 0122 : C5; + 0123 : 47; + 0124 : 45; + 0125 : D4; + 0126 : 4E; + 0127 : 45; + 0128 : D7; + 0129 : 54; + 012A : 41; + 012B : 42; + 012C : A8; + 012D : 54; + 012E : CF; + 012F : 46; + 0130 : CE; + 0131 : 53; + 0132 : 50; + 0133 : 43; + 0134 : A8; + 0135 : 54; + 0136 : 48; + 0137 : 45; + 0138 : CE; + 0139 : 4E; + 013A : 4F; + 013B : D4; + 013C : 53; + 013D : 54; + 013E : 45; + 013F : D0; + 0140 : AB; + 0141 : AD; + 0142 : AA; + 0143 : AF; + 0144 : DE; + 0145 : 41; + 0146 : 4E; + 0147 : C4; + 0148 : 4F; + 0149 : D2; + 014A : BE; + 014B : BD; + 014C : BC; + 014D : 53; + 014E : 47; + 014F : CE; + 0150 : 49; + 0151 : 4E; + 0152 : D4; + 0153 : 41; + 0154 : 42; + 0155 : D3; + 0156 : 55; + 0157 : 53; + 0158 : D2; + 0159 : 46; + 015A : 52; + 015B : C5; + 015C : 50; + 015D : 4F; + 015E : D3; + 015F : 53; + 0160 : 51; + 0161 : D2; + 0162 : 52; + 0163 : 4E; + 0164 : C4; + 0165 : 4C; + 0166 : 4F; + 0167 : C7; + 0168 : 45; + 0169 : 58; + 016A : D0; + 016B : 43; + 016C : 4F; + 016D : D3; + 016E : 53; + 016F : 49; + 0170 : CE; + 0171 : 54; + 0172 : 41; + 0173 : CE; + 0174 : 41; + 0175 : 54; + 0176 : CE; + 0177 : 50; + [0178..0179] : 45; + 017A : CB; + 017B : 4C; + 017C : 45; + 017D : CE; + 017E : 53; + 017F : 54; + 0180 : 52; + 0181 : A4; + 0182 : 56; + 0183 : 41; + 0184 : CC; + 0185 : 41; + 0186 : 53; + 0187 : C3; + 0188 : 43; + 0189 : 48; + 018A : 52; + 018B : A4; + 018C : 4C; + 018D : 45; + 018E : 46; + 018F : 54; + 0190 : A4; + 0191 : 52; + 0192 : 49; + 0193 : 47; + 0194 : 48; + 0195 : 54; + 0196 : A4; + 0197 : 4D; + 0198 : 49; + 0199 : 44; + 019A : A4; + 019B : 47; + 019C : CF; + 019D : 00; + 019E : 54; + [019F..01A0] : 4F; + 01A1 : 20; + 01A2 : 4D; + 01A3 : 41; + 01A4 : 4E; + 01A5 : 59; + 01A6 : 20; + 01A7 : 46; + 01A8 : 49; + 01A9 : 4C; + 01AA : 45; + 01AB : D3; + 01AC : 46; + 01AD : 49; + 01AE : 4C; + 01AF : 45; + 01B0 : 20; + 01B1 : 4F; + 01B2 : 50; + 01B3 : 45; + 01B4 : CE; + 01B5 : 46; + 01B6 : 49; + 01B7 : 4C; + 01B8 : 45; + 01B9 : 20; + 01BA : 4E; + 01BB : 4F; + 01BC : 54; + 01BD : 20; + 01BE : 4F; + 01BF : 50; + 01C0 : 45; + 01C1 : CE; + 01C2 : 46; + 01C3 : 49; + 01C4 : 4C; + 01C5 : 45; + 01C6 : 20; + 01C7 : 4E; + 01C8 : 4F; + 01C9 : 54; + 01CA : 20; + 01CB : 46; + 01CC : 4F; + 01CD : 55; + 01CE : 4E; + 01CF : C4; + 01D0 : 44; + 01D1 : 45; + 01D2 : 56; + 01D3 : 49; + 01D4 : 43; + 01D5 : 45; + 01D6 : 20; + 01D7 : 4E; + 01D8 : 4F; + 01D9 : 54; + 01DA : 20; + 01DB : 50; + 01DC : 52; + 01DD : 45; + 01DE : 53; + 01DF : 45; + 01E0 : 4E; + 01E1 : D4; + 01E2 : 4E; + 01E3 : 4F; + 01E4 : 54; + 01E5 : 20; + 01E6 : 49; + 01E7 : 4E; + 01E8 : 50; + 01E9 : 55; + 01EA : 54; + 01EB : 20; + 01EC : 46; + 01ED : 49; + 01EE : 4C; + 01EF : C5; + 01F0 : 4E; + 01F1 : 4F; + 01F2 : 54; + 01F3 : 20; + 01F4 : 4F; + 01F5 : 55; + 01F6 : 54; + 01F7 : 50; + 01F8 : 55; + 01F9 : 54; + 01FA : 20; + 01FB : 46; + 01FC : 49; + 01FD : 4C; + 01FE : C5; + 01FF : 4D; + 0200 : 49; + [0201..0202] : 53; + 0203 : 49; + 0204 : 4E; + 0205 : 47; + 0206 : 20; + 0207 : 46; + 0208 : 49; + 0209 : 4C; + 020A : 45; + 020B : 20; + 020C : 4E; + 020D : 41; + 020E : 4D; + 020F : C5; + 0210 : 49; + [0211..0212] : 4C; + 0213 : 45; + 0214 : 47; + 0215 : 41; + 0216 : 4C; + 0217 : 20; + 0218 : 44; + 0219 : 45; + 021A : 56; + 021B : 49; + 021C : 43; + 021D : 45; + 021E : 20; + 021F : 4E; + 0220 : 55; + 0221 : 4D; + 0222 : 42; + 0223 : 45; + 0224 : D2; + 0225 : 4E; + 0226 : 45; + 0227 : 58; + 0228 : 54; + 0229 : 20; + 022A : 57; + 022B : 49; + 022C : 54; + 022D : 48; + 022E : 4F; + 022F : 55; + 0230 : 54; + 0231 : 20; + 0232 : 46; + 0233 : 4F; + 0234 : D2; + 0235 : 53; + 0236 : 59; + 0237 : 4E; + 0238 : 54; + 0239 : 41; + 023A : D8; + 023B : 52; + 023C : 45; + 023D : 54; + 023E : 55; + 023F : 52; + 0240 : 4E; + 0241 : 20; + 0242 : 57; + 0243 : 49; + 0244 : 54; + 0245 : 48; + 0246 : 4F; + 0247 : 55; + 0248 : 54; + 0249 : 20; + 024A : 47; + 024B : 4F; + 024C : 53; + 024D : 55; + 024E : C2; + 024F : 4F; + 0250 : 55; + 0251 : 54; + 0252 : 20; + 0253 : 4F; + 0254 : 46; + 0255 : 20; + 0256 : 44; + 0257 : 41; + 0258 : 54; + 0259 : C1; + 025A : 49; + [025B..025C] : 4C; + 025D : 45; + 025E : 47; + 025F : 41; + 0260 : 4C; + 0261 : 20; + 0262 : 51; + 0263 : 55; + 0264 : 41; + 0265 : 4E; + 0266 : 54; + 0267 : 49; + 0268 : 54; + 0269 : D9; + 026A : 4F; + 026B : 56; + 026C : 45; + 026D : 52; + 026E : 46; + 026F : 4C; + 0270 : 4F; + 0271 : D7; + 0272 : 4F; + 0273 : 55; + 0274 : 54; + 0275 : 20; + 0276 : 4F; + 0277 : 46; + 0278 : 20; + 0279 : 4D; + 027A : 45; + 027B : 4D; + 027C : 4F; + 027D : 52; + 027E : D9; + 027F : 55; + 0280 : 4E; + 0281 : 44; + 0282 : 45; + 0283 : 46; + 0284 : 27; + 0285 : 44; + 0286 : 20; + 0287 : 53; + 0288 : 54; + 0289 : 41; + 028A : 54; + 028B : 45; + 028C : 4D; + 028D : 45; + 028E : 4E; + 028F : D4; + 0290 : 42; + 0291 : 41; + 0292 : 44; + 0293 : 20; + 0294 : 53; + 0295 : 55; + 0296 : 42; + 0297 : 53; + 0298 : 43; + 0299 : 52; + 029A : 49; + 029B : 50; + 029C : D4; + 029D : 52; + 029E : 45; + 029F : 44; + 02A0 : 49; + 02A1 : 4D; + 02A2 : 27; + 02A3 : 44; + 02A4 : 20; + 02A5 : 41; + [02A6..02A7] : 52; + 02A8 : 41; + 02A9 : D9; + 02AA : 44; + 02AB : 49; + 02AC : 56; + 02AD : 49; + 02AE : 53; + 02AF : 49; + 02B0 : 4F; + 02B1 : 4E; + 02B2 : 20; + 02B3 : 42; + 02B4 : 59; + 02B5 : 20; + 02B6 : 5A; + 02B7 : 45; + 02B8 : 52; + 02B9 : CF; + 02BA : 49; + [02BB..02BC] : 4C; + 02BD : 45; + 02BE : 47; + 02BF : 41; + 02C0 : 4C; + 02C1 : 20; + 02C2 : 44; + 02C3 : 49; + 02C4 : 52; + 02C5 : 45; + 02C6 : 43; + 02C7 : D4; + 02C8 : 54; + 02C9 : 59; + 02CA : 50; + 02CB : 45; + 02CC : 20; + 02CD : 4D; + 02CE : 49; + 02CF : 53; + 02D0 : 4D; + 02D1 : 41; + 02D2 : 54; + 02D3 : 43; + 02D4 : C8; + 02D5 : 53; + 02D6 : 54; + 02D7 : 52; + 02D8 : 49; + 02D9 : 4E; + 02DA : 47; + 02DB : 20; + 02DC : 54; + [02DD..02DE] : 4F; + 02DF : 20; + 02E0 : 4C; + 02E1 : 4F; + 02E2 : 4E; + 02E3 : C7; + 02E4 : 46; + 02E5 : 49; + 02E6 : 4C; + 02E7 : 45; + 02E8 : 20; + 02E9 : 44; + 02EA : 41; + 02EB : 54; + 02EC : C1; + 02ED : 46; + 02EE : 4F; + 02EF : 52; + 02F0 : 4D; + 02F1 : 55; + 02F2 : 4C; + 02F3 : 41; + 02F4 : 20; + 02F5 : 54; + [02F6..02F7] : 4F; + 02F8 : 20; + 02F9 : 43; + 02FA : 4F; + 02FB : 4D; + 02FC : 50; + 02FD : 4C; + 02FE : 45; + 02FF : D8; + 0300 : 43; + 0301 : 41; + 0302 : 4E; + 0303 : 27; + 0304 : 54; + 0305 : 20; + 0306 : 43; + 0307 : 4F; + 0308 : 4E; + 0309 : 54; + 030A : 49; + 030B : 4E; + 030C : 55; + 030D : C5; + 030E : 55; + 030F : 4E; + 0310 : 44; + 0311 : 45; + 0312 : 46; + 0313 : 27; + 0314 : 44; + 0315 : 20; + 0316 : 46; + 0317 : 55; + 0318 : 4E; + 0319 : 43; + 031A : 54; + 031B : 49; + 031C : 4F; + 031D : CE; + 031E : 56; + 031F : 45; + 0320 : 52; + 0321 : 49; + 0322 : 46; + 0323 : D9; + 0324 : 4C; + 0325 : 4F; + 0326 : 41; + 0327 : C4; + 0328 : 9E; + 0329 : A1; + 032A : AC; + 032B : A1; + 032C : B5; + 032D : A1; + 032E : C2; + 032F : A1; + 0330 : D0; + 0331 : A1; + 0332 : E2; + 0333 : A1; + 0334 : F0; + 0335 : A1; + 0336 : FF; + 0337 : A1; + 0338 : 10; + 0339 : A2; + 033A : 25; + 033B : A2; + 033C : 35; + 033D : A2; + 033E : 3B; + 033F : A2; + 0340 : 4F; + 0341 : A2; + 0342 : 5A; + 0343 : A2; + 0344 : 6A; + 0345 : A2; + 0346 : 72; + 0347 : A2; + 0348 : 7F; + 0349 : A2; + 034A : 90; + 034B : A2; + 034C : 9D; + 034D : A2; + 034E : AA; + 034F : A2; + 0350 : BA; + 0351 : A2; + 0352 : C8; + 0353 : A2; + 0354 : D5; + 0355 : A2; + 0356 : E4; + 0357 : A2; + 0358 : ED; + 0359 : A2; + 035A : 00; + 035B : A3; + 035C : 0E; + 035D : A3; + 035E : 1E; + 035F : A3; + 0360 : 24; + 0361 : A3; + 0362 : 83; + 0363 : A3; + 0364 : 0D; + 0365 : 4F; + 0366 : 4B; + 0367 : 0D; + 0368 : 00; + [0369..036A] : 20; + 036B : 45; + [036C..036D] : 52; + 036E : 4F; + 036F : 52; + 0370 : 00; + 0371 : 20; + 0372 : 49; + 0373 : 4E; + 0374 : 20; + 0375 : 00; + 0376 : 0D; + 0377 : 0A; + 0378 : 52; + 0379 : 45; + 037A : 41; + 037B : 44; + 037C : 59; + 037D : 2E; + 037E : 0D; + 037F : 0A; + 0380 : 00; + 0381 : 0D; + 0382 : 0A; + 0383 : 42; + 0384 : 52; + 0385 : 45; + 0386 : 41; + 0387 : 4B; + 0388 : 00; + 0389 : A0; + 038A : BA; + [038B..038E] : E8; + 038F : BD; + [0390..0391] : 01; + 0392 : C9; + 0393 : 81; + 0394 : D0; + 0395 : 21; + 0396 : A5; + 0397 : 4A; + 0398 : D0; + 0399 : 0A; + 039A : BD; + 039B : 02; + 039C : 01; + 039D : 85; + 039E : 49; + 039F : BD; + 03A0 : 03; + 03A1 : 01; + 03A2 : 85; + 03A3 : 4A; + 03A4 : DD; + 03A5 : 03; + 03A6 : 01; + 03A7 : D0; + 03A8 : 07; + 03A9 : A5; + 03AA : 49; + 03AB : DD; + 03AC : 02; + 03AD : 01; + 03AE : F0; + 03AF : 07; + 03B0 : 8A; + 03B1 : 18; + 03B2 : 69; + 03B3 : 12; + 03B4 : AA; + 03B5 : D0; + 03B6 : D8; + 03B7 : 60; + 03B8 : 20; + 03B9 : 08; + 03BA : A4; + 03BB : 85; + 03BC : 31; + 03BD : 84; + 03BE : 32; + 03BF : 38; + 03C0 : A5; + 03C1 : 5A; + 03C2 : E5; + 03C3 : 5F; + 03C4 : 85; + 03C5 : 22; + 03C6 : A8; + 03C7 : A5; + 03C8 : 5B; + 03C9 : E5; + 03CA : 60; + 03CB : AA; + 03CC : E8; + 03CD : 98; + 03CE : F0; + 03CF : 23; + 03D0 : A5; + 03D1 : 5A; + 03D2 : 38; + 03D3 : E5; + 03D4 : 22; + 03D5 : 85; + 03D6 : 5A; + 03D7 : B0; + 03D8 : 03; + 03D9 : C6; + 03DA : 5B; + 03DB : 38; + 03DC : A5; + 03DD : 58; + 03DE : E5; + 03DF : 22; + 03E0 : 85; + 03E1 : 58; + 03E2 : B0; + 03E3 : 08; + 03E4 : C6; + 03E5 : 59; + 03E6 : 90; + 03E7 : 04; + 03E8 : B1; + 03E9 : 5A; + 03EA : 91; + 03EB : 58; + 03EC : 88; + 03ED : D0; + 03EE : F9; + 03EF : B1; + 03F0 : 5A; + 03F1 : 91; + 03F2 : 58; + 03F3 : C6; + 03F4 : 5B; + 03F5 : C6; + 03F6 : 59; + 03F7 : CA; + 03F8 : D0; + 03F9 : F2; + 03FA : 60; + 03FB : 0A; + 03FC : 69; + 03FD : 3E; + 03FE : B0; + 03FF : 35; + 0400 : 85; + 0401 : 22; + 0402 : BA; + 0403 : E4; + 0404 : 22; + 0405 : 90; + 0406 : 2E; + 0407 : 60; + 0408 : C4; + 0409 : 34; + 040A : 90; + 040B : 28; + 040C : D0; + 040D : 04; + 040E : C5; + 040F : 33; + 0410 : 90; + 0411 : 22; + 0412 : 48; + 0413 : A2; + 0414 : 09; + 0415 : 98; + 0416 : 48; + 0417 : B5; + 0418 : 57; + 0419 : CA; + 041A : 10; + 041B : FA; + 041C : 20; + 041D : 26; + 041E : B5; + 041F : A2; + 0420 : F7; + 0421 : 68; + 0422 : 95; + 0423 : 61; + 0424 : E8; + 0425 : 30; + 0426 : FA; + 0427 : 68; + 0428 : A8; + 0429 : 68; + 042A : C4; + 042B : 34; + 042C : 90; + 042D : 06; + 042E : D0; + 042F : 05; + 0430 : C5; + 0431 : 33; + 0432 : B0; + 0433 : 01; + 0434 : 60; + 0435 : A2; + 0436 : 10; + 0437 : 6C; + 0438 : 00; + 0439 : 03; + 043A : 8A; + 043B : 0A; + 043C : AA; + 043D : BD; + 043E : 26; + 043F : A3; + 0440 : 85; + 0441 : 22; + 0442 : BD; + 0443 : 27; + 0444 : A3; + 0445 : 85; + 0446 : 23; + 0447 : 20; + 0448 : CC; + 0449 : FF; + 044A : A9; + 044B : 00; + 044C : 85; + 044D : 13; + 044E : 20; + 044F : D7; + 0450 : AA; + 0451 : 20; + 0452 : 45; + 0453 : AB; + 0454 : A0; + 0455 : 00; + 0456 : B1; + 0457 : 22; + 0458 : 48; + 0459 : 29; + 045A : 7F; + 045B : 20; + 045C : 47; + 045D : AB; + 045E : C8; + 045F : 68; + 0460 : 10; + 0461 : F4; + 0462 : 20; + 0463 : 7A; + 0464 : A6; + 0465 : A9; + 0466 : 69; + 0467 : A0; + 0468 : A3; + 0469 : 20; + 046A : 1E; + 046B : AB; + 046C : A4; + 046D : 3A; + 046E : C8; + 046F : F0; + 0470 : 03; + 0471 : 20; + 0472 : C2; + 0473 : BD; + 0474 : A9; + 0475 : 76; + 0476 : A0; + 0477 : A3; + 0478 : 20; + 0479 : 1E; + 047A : AB; + 047B : A9; + 047C : 80; + 047D : 20; + 047E : 90; + 047F : FF; + 0480 : 6C; + 0481 : 02; + 0482 : 03; + 0483 : 20; + 0484 : 60; + 0485 : A5; + 0486 : 86; + 0487 : 7A; + 0488 : 84; + 0489 : 7B; + 048A : 20; + 048B : 73; + 048C : 00; + 048D : AA; + [048E..048F] : F0; + 0490 : A2; + 0491 : FF; + 0492 : 86; + 0493 : 3A; + 0494 : 90; + 0495 : 06; + 0496 : 20; + 0497 : 79; + 0498 : A5; + 0499 : 4C; + 049A : E1; + 049B : A7; + 049C : 20; + 049D : 6B; + 049E : A9; + 049F : 20; + 04A0 : 79; + 04A1 : A5; + 04A2 : 84; + 04A3 : 0B; + 04A4 : 20; + 04A5 : 13; + 04A6 : A6; + 04A7 : 90; + 04A8 : 44; + 04A9 : A0; + 04AA : 01; + 04AB : B1; + 04AC : 5F; + 04AD : 85; + 04AE : 23; + 04AF : A5; + 04B0 : 2D; + 04B1 : 85; + 04B2 : 22; + 04B3 : A5; + 04B4 : 60; + 04B5 : 85; + 04B6 : 25; + 04B7 : A5; + 04B8 : 5F; + 04B9 : 88; + 04BA : F1; + 04BB : 5F; + 04BC : 18; + 04BD : 65; + 04BE : 2D; + 04BF : 85; + 04C0 : 2D; + 04C1 : 85; + 04C2 : 24; + 04C3 : A5; + 04C4 : 2E; + 04C5 : 69; + 04C6 : FF; + 04C7 : 85; + 04C8 : 2E; + 04C9 : E5; + 04CA : 60; + 04CB : AA; + 04CC : 38; + 04CD : A5; + 04CE : 5F; + 04CF : E5; + 04D0 : 2D; + 04D1 : A8; + 04D2 : B0; + 04D3 : 03; + 04D4 : E8; + 04D5 : C6; + 04D6 : 25; + 04D7 : 18; + 04D8 : 65; + 04D9 : 22; + 04DA : 90; + 04DB : 03; + 04DC : C6; + 04DD : 23; + 04DE : 18; + 04DF : B1; + 04E0 : 22; + 04E1 : 91; + 04E2 : 24; + 04E3 : C8; + 04E4 : D0; + 04E5 : F9; + 04E6 : E6; + 04E7 : 23; + 04E8 : E6; + 04E9 : 25; + 04EA : CA; + 04EB : D0; + 04EC : F2; + 04ED : 20; + 04EE : 59; + 04EF : A6; + 04F0 : 20; + 04F1 : 33; + 04F2 : A5; + 04F3 : AD; + 04F4 : 00; + 04F5 : 02; + 04F6 : F0; + 04F7 : 88; + 04F8 : 18; + 04F9 : A5; + 04FA : 2D; + 04FB : 85; + 04FC : 5A; + 04FD : 65; + 04FE : 0B; + 04FF : 85; + 0500 : 58; + 0501 : A4; + 0502 : 2E; + 0503 : 84; + 0504 : 5B; + 0505 : 90; + 0506 : 01; + 0507 : C8; + 0508 : 84; + 0509 : 59; + 050A : 20; + 050B : B8; + 050C : A3; + 050D : A5; + 050E : 14; + 050F : A4; + 0510 : 15; + 0511 : 8D; + 0512 : FE; + 0513 : 01; + 0514 : 8C; + 0515 : FF; + 0516 : 01; + 0517 : A5; + 0518 : 31; + 0519 : A4; + 051A : 32; + 051B : 85; + 051C : 2D; + 051D : 84; + 051E : 2E; + 051F : A4; + 0520 : 0B; + 0521 : 88; + 0522 : B9; + 0523 : FC; + 0524 : 01; + 0525 : 91; + 0526 : 5F; + 0527 : 88; + 0528 : 10; + 0529 : F8; + 052A : 20; + 052B : 59; + 052C : A6; + 052D : 20; + 052E : 33; + 052F : A5; + 0530 : 4C; + 0531 : 80; + 0532 : A4; + 0533 : A5; + 0534 : 2B; + 0535 : A4; + 0536 : 2C; + 0537 : 85; + 0538 : 22; + 0539 : 84; + 053A : 23; + 053B : 18; + 053C : A0; + 053D : 01; + 053E : B1; + 053F : 22; + 0540 : F0; + 0541 : 1D; + 0542 : A0; + 0543 : 04; + 0544 : C8; + 0545 : B1; + 0546 : 22; + 0547 : D0; + 0548 : FB; + 0549 : C8; + 054A : 98; + 054B : 65; + 054C : 22; + 054D : AA; + 054E : A0; + 054F : 00; + 0550 : 91; + 0551 : 22; + 0552 : A5; + 0553 : 23; + 0554 : 69; + 0555 : 00; + 0556 : C8; + 0557 : 91; + 0558 : 22; + 0559 : 86; + 055A : 22; + 055B : 85; + 055C : 23; + 055D : 90; + 055E : DD; + 055F : 60; + 0560 : A2; + 0561 : 00; + 0562 : 20; + 0563 : 12; + 0564 : E1; + 0565 : C9; + 0566 : 0D; + 0567 : F0; + 0568 : 0D; + 0569 : 9D; + 056A : 00; + 056B : 02; + 056C : E8; + 056D : E0; + 056E : 59; + 056F : 90; + 0570 : F1; + 0571 : A2; + 0572 : 17; + 0573 : 4C; + 0574 : 37; + 0575 : A4; + 0576 : 4C; + 0577 : CA; + 0578 : AA; + 0579 : 6C; + 057A : 04; + 057B : 03; + 057C : A6; + 057D : 7A; + 057E : A0; + 057F : 04; + 0580 : 84; + 0581 : 0F; + 0582 : BD; + 0583 : 00; + 0584 : 02; + 0585 : 10; + 0586 : 07; + 0587 : C9; + 0588 : FF; + 0589 : F0; + 058A : 3E; + 058B : E8; + 058C : D0; + 058D : F4; + 058E : C9; + 058F : 20; + 0590 : F0; + 0591 : 37; + 0592 : 85; + 0593 : 08; + 0594 : C9; + 0595 : 22; + 0596 : F0; + 0597 : 56; + 0598 : 24; + 0599 : 0F; + 059A : 70; + 059B : 2D; + 059C : C9; + 059D : 3F; + 059E : D0; + 059F : 04; + 05A0 : A9; + 05A1 : 99; + 05A2 : D0; + 05A3 : 25; + 05A4 : C9; + 05A5 : 30; + 05A6 : 90; + 05A7 : 04; + 05A8 : C9; + 05A9 : 3C; + 05AA : 90; + 05AB : 1D; + 05AC : 84; + 05AD : 71; + 05AE : A0; + 05AF : 00; + 05B0 : 84; + 05B1 : 0B; + 05B2 : 88; + 05B3 : 86; + 05B4 : 7A; + 05B5 : CA; + 05B6 : C8; + 05B7 : E8; + 05B8 : BD; + 05B9 : 00; + 05BA : 02; + 05BB : 38; + 05BC : F9; + 05BD : 9E; + 05BE : A0; + 05BF : F0; + 05C0 : F5; + 05C1 : C9; + 05C2 : 80; + 05C3 : D0; + 05C4 : 30; + 05C5 : 05; + 05C6 : 0B; + 05C7 : A4; + 05C8 : 71; + 05C9 : E8; + 05CA : C8; + 05CB : 99; + 05CC : FB; + 05CD : 01; + 05CE : B9; + 05CF : FB; + 05D0 : 01; + 05D1 : F0; + 05D2 : 36; + 05D3 : 38; + 05D4 : E9; + 05D5 : 3A; + 05D6 : F0; + 05D7 : 04; + 05D8 : C9; + 05D9 : 49; + 05DA : D0; + 05DB : 02; + 05DC : 85; + 05DD : 0F; + 05DE : 38; + 05DF : E9; + 05E0 : 55; + 05E1 : D0; + 05E2 : 9F; + 05E3 : 85; + 05E4 : 08; + 05E5 : BD; + 05E6 : 00; + 05E7 : 02; + 05E8 : F0; + 05E9 : DF; + 05EA : C5; + 05EB : 08; + 05EC : F0; + 05ED : DB; + 05EE : C8; + 05EF : 99; + 05F0 : FB; + 05F1 : 01; + 05F2 : E8; + 05F3 : D0; + 05F4 : F0; + 05F5 : A6; + 05F6 : 7A; + 05F7 : E6; + 05F8 : 0B; + 05F9 : C8; + 05FA : B9; + 05FB : 9D; + 05FC : A0; + 05FD : 10; + 05FE : FA; + 05FF : B9; + 0600 : 9E; + 0601 : A0; + 0602 : D0; + 0603 : B4; + 0604 : BD; + 0605 : 00; + 0606 : 02; + 0607 : 10; + 0608 : BE; + 0609 : 99; + 060A : FD; + 060B : 01; + 060C : C6; + 060D : 7B; + 060E : A9; + 060F : FF; + 0610 : 85; + 0611 : 7A; + 0612 : 60; + 0613 : A5; + 0614 : 2B; + 0615 : A6; + 0616 : 2C; + 0617 : A0; + 0618 : 01; + 0619 : 85; + 061A : 5F; + 061B : 86; + 061C : 60; + 061D : B1; + 061E : 5F; + 061F : F0; + 0620 : 1F; + [0621..0622] : C8; + 0623 : A5; + 0624 : 15; + 0625 : D1; + 0626 : 5F; + 0627 : 90; + 0628 : 18; + 0629 : F0; + 062A : 03; + 062B : 88; + 062C : D0; + 062D : 09; + 062E : A5; + 062F : 14; + 0630 : 88; + 0631 : D1; + 0632 : 5F; + 0633 : 90; + 0634 : 0C; + 0635 : F0; + 0636 : 0A; + 0637 : 88; + 0638 : B1; + 0639 : 5F; + 063A : AA; + 063B : 88; + 063C : B1; + 063D : 5F; + 063E : B0; + 063F : D7; + 0640 : 18; + 0641 : 60; + 0642 : D0; + 0643 : FD; + 0644 : A9; + 0645 : 00; + 0646 : A8; + 0647 : 91; + 0648 : 2B; + 0649 : C8; + 064A : 91; + 064B : 2B; + 064C : A5; + 064D : 2B; + 064E : 18; + 064F : 69; + 0650 : 02; + 0651 : 85; + 0652 : 2D; + 0653 : A5; + 0654 : 2C; + 0655 : 69; + 0656 : 00; + 0657 : 85; + 0658 : 2E; + 0659 : 20; + 065A : 8E; + 065B : A6; + 065C : A9; + 065D : 00; + 065E : D0; + 065F : 2D; + 0660 : 20; + 0661 : E7; + 0662 : FF; + 0663 : A5; + 0664 : 37; + 0665 : A4; + 0666 : 38; + 0667 : 85; + 0668 : 33; + 0669 : 84; + 066A : 34; + 066B : A5; + 066C : 2D; + 066D : A4; + 066E : 2E; + 066F : 85; + 0670 : 2F; + 0671 : 84; + 0672 : 30; + 0673 : 85; + 0674 : 31; + 0675 : 84; + 0676 : 32; + 0677 : 20; + 0678 : 1D; + 0679 : A8; + 067A : A2; + 067B : 19; + 067C : 86; + 067D : 16; + 067E : 68; + 067F : A8; + 0680 : 68; + 0681 : A2; + 0682 : FA; + 0683 : 9A; + 0684 : 48; + 0685 : 98; + 0686 : 48; + 0687 : A9; + 0688 : 00; + 0689 : 85; + 068A : 3E; + 068B : 85; + 068C : 10; + 068D : 60; + 068E : 18; + 068F : A5; + 0690 : 2B; + 0691 : 69; + 0692 : FF; + 0693 : 85; + 0694 : 7A; + 0695 : A5; + 0696 : 2C; + 0697 : 69; + 0698 : FF; + 0699 : 85; + 069A : 7B; + 069B : 60; + 069C : 90; + 069D : 06; + 069E : F0; + 069F : 04; + 06A0 : C9; + 06A1 : AB; + 06A2 : D0; + 06A3 : E9; + 06A4 : 20; + 06A5 : 6B; + 06A6 : A9; + 06A7 : 20; + 06A8 : 13; + 06A9 : A6; + 06AA : 20; + 06AB : 79; + 06AC : 00; + 06AD : F0; + 06AE : 0C; + 06AF : C9; + 06B0 : AB; + 06B1 : D0; + 06B2 : 8E; + 06B3 : 20; + 06B4 : 73; + 06B5 : 00; + 06B6 : 20; + 06B7 : 6B; + 06B8 : A9; + 06B9 : D0; + 06BA : 86; + [06BB..06BC] : 68; + 06BD : A5; + 06BE : 14; + 06BF : 05; + 06C0 : 15; + 06C1 : D0; + 06C2 : 06; + 06C3 : A9; + 06C4 : FF; + 06C5 : 85; + 06C6 : 14; + 06C7 : 85; + 06C8 : 15; + 06C9 : A0; + 06CA : 01; + 06CB : 84; + 06CC : 0F; + 06CD : B1; + 06CE : 5F; + 06CF : F0; + 06D0 : 43; + 06D1 : 20; + 06D2 : 2C; + 06D3 : A8; + 06D4 : 20; + 06D5 : D7; + 06D6 : AA; + 06D7 : C8; + 06D8 : B1; + 06D9 : 5F; + 06DA : AA; + 06DB : C8; + 06DC : B1; + 06DD : 5F; + 06DE : C5; + 06DF : 15; + 06E0 : D0; + 06E1 : 04; + 06E2 : E4; + 06E3 : 14; + 06E4 : F0; + 06E5 : 02; + 06E6 : B0; + 06E7 : 2C; + 06E8 : 84; + 06E9 : 49; + 06EA : 20; + 06EB : CD; + 06EC : BD; + 06ED : A9; + 06EE : 20; + 06EF : A4; + 06F0 : 49; + 06F1 : 29; + 06F2 : 7F; + 06F3 : 20; + 06F4 : 47; + 06F5 : AB; + 06F6 : C9; + 06F7 : 22; + 06F8 : D0; + 06F9 : 06; + 06FA : A5; + 06FB : 0F; + 06FC : 49; + 06FD : FF; + 06FE : 85; + 06FF : 0F; + 0700 : C8; + 0701 : F0; + 0702 : 11; + 0703 : B1; + 0704 : 5F; + 0705 : D0; + 0706 : 10; + 0707 : A8; + 0708 : B1; + 0709 : 5F; + 070A : AA; + 070B : C8; + 070C : B1; + 070D : 5F; + 070E : 86; + 070F : 5F; + 0710 : 85; + 0711 : 60; + 0712 : D0; + 0713 : B5; + 0714 : 4C; + 0715 : 86; + 0716 : E3; + 0717 : 6C; + 0718 : 06; + 0719 : 03; + 071A : 10; + 071B : D7; + 071C : C9; + 071D : FF; + 071E : F0; + 071F : D3; + 0720 : 24; + 0721 : 0F; + 0722 : 30; + 0723 : CF; + 0724 : 38; + 0725 : E9; + 0726 : 7F; + 0727 : AA; + 0728 : 84; + 0729 : 49; + 072A : A0; + 072B : FF; + 072C : CA; + 072D : F0; + 072E : 08; + 072F : C8; + 0730 : B9; + 0731 : 9E; + 0732 : A0; + 0733 : 10; + 0734 : FA; + 0735 : 30; + 0736 : F5; + 0737 : C8; + 0738 : B9; + 0739 : 9E; + 073A : A0; + 073B : 30; + 073C : B2; + 073D : 20; + 073E : 47; + 073F : AB; + 0740 : D0; + 0741 : F5; + 0742 : A9; + 0743 : 80; + 0744 : 85; + 0745 : 10; + 0746 : 20; + 0747 : A5; + 0748 : A9; + 0749 : 20; + 074A : 8A; + 074B : A3; + 074C : D0; + 074D : 05; + 074E : 8A; + 074F : 69; + 0750 : 0F; + 0751 : AA; + 0752 : 9A; + [0753..0754] : 68; + 0755 : A9; + 0756 : 09; + 0757 : 20; + 0758 : FB; + 0759 : A3; + 075A : 20; + 075B : 06; + 075C : A9; + 075D : 18; + 075E : 98; + 075F : 65; + 0760 : 7A; + 0761 : 48; + 0762 : A5; + 0763 : 7B; + 0764 : 69; + 0765 : 00; + 0766 : 48; + 0767 : A5; + 0768 : 3A; + 0769 : 48; + 076A : A5; + 076B : 39; + 076C : 48; + 076D : A9; + 076E : A4; + 076F : 20; + 0770 : FF; + 0771 : AE; + 0772 : 20; + 0773 : 8D; + 0774 : AD; + 0775 : 20; + 0776 : 8A; + 0777 : AD; + 0778 : A5; + 0779 : 66; + 077A : 09; + 077B : 7F; + 077C : 25; + 077D : 62; + 077E : 85; + 077F : 62; + 0780 : A9; + 0781 : 8B; + 0782 : A0; + 0783 : A7; + 0784 : 85; + 0785 : 22; + 0786 : 84; + 0787 : 23; + 0788 : 4C; + 0789 : 43; + 078A : AE; + 078B : A9; + 078C : BC; + 078D : A0; + 078E : B9; + 078F : 20; + 0790 : A2; + 0791 : BB; + 0792 : 20; + 0793 : 79; + 0794 : 00; + 0795 : C9; + 0796 : A9; + 0797 : D0; + 0798 : 06; + 0799 : 20; + 079A : 73; + 079B : 00; + 079C : 20; + 079D : 8A; + 079E : AD; + 079F : 20; + 07A0 : 2B; + 07A1 : BC; + 07A2 : 20; + 07A3 : 38; + 07A4 : AE; + 07A5 : A5; + 07A6 : 4A; + 07A7 : 48; + 07A8 : A5; + 07A9 : 49; + 07AA : 48; + 07AB : A9; + 07AC : 81; + 07AD : 48; + 07AE : 20; + 07AF : 2C; + 07B0 : A8; + 07B1 : A5; + 07B2 : 7A; + 07B3 : A4; + 07B4 : 7B; + 07B5 : C0; + 07B6 : 02; + 07B7 : EA; + 07B8 : F0; + 07B9 : 04; + 07BA : 85; + 07BB : 3D; + 07BC : 84; + 07BD : 3E; + 07BE : A0; + 07BF : 00; + 07C0 : B1; + 07C1 : 7A; + 07C2 : D0; + 07C3 : 43; + 07C4 : A0; + 07C5 : 02; + 07C6 : B1; + 07C7 : 7A; + 07C8 : 18; + 07C9 : D0; + 07CA : 03; + 07CB : 4C; + 07CC : 4B; + 07CD : A8; + 07CE : C8; + 07CF : B1; + 07D0 : 7A; + 07D1 : 85; + 07D2 : 39; + 07D3 : C8; + 07D4 : B1; + 07D5 : 7A; + 07D6 : 85; + 07D7 : 3A; + 07D8 : 98; + 07D9 : 65; + 07DA : 7A; + 07DB : 85; + 07DC : 7A; + 07DD : 90; + 07DE : 02; + 07DF : E6; + 07E0 : 7B; + 07E1 : 6C; + 07E2 : 08; + 07E3 : 03; + 07E4 : 20; + 07E5 : 73; + 07E6 : 00; + 07E7 : 20; + 07E8 : ED; + 07E9 : A7; + 07EA : 4C; + 07EB : AE; + 07EC : A7; + 07ED : F0; + 07EE : 3C; + 07EF : E9; + 07F0 : 80; + 07F1 : 90; + 07F2 : 11; + 07F3 : C9; + 07F4 : 23; + 07F5 : B0; + 07F6 : 17; + 07F7 : 0A; + 07F8 : A8; + 07F9 : B9; + 07FA : 0D; + 07FB : A0; + 07FC : 48; + 07FD : B9; + 07FE : 0C; + 07FF : A0; + 0800 : 48; + 0801 : 4C; + 0802 : 73; + 0803 : 00; + 0804 : 4C; + 0805 : A5; + 0806 : A9; + 0807 : C9; + 0808 : 3A; + 0809 : F0; + 080A : D6; + 080B : 4C; + 080C : 08; + 080D : AF; + 080E : C9; + 080F : 4B; + 0810 : D0; + 0811 : F9; + 0812 : 20; + 0813 : 73; + 0814 : 00; + 0815 : A9; + 0816 : A4; + 0817 : 20; + 0818 : FF; + 0819 : AE; + 081A : 4C; + 081B : A0; + 081C : A8; + 081D : 38; + 081E : A5; + 081F : 2B; + 0820 : E9; + 0821 : 01; + 0822 : A4; + 0823 : 2C; + 0824 : B0; + 0825 : 01; + 0826 : 88; + 0827 : 85; + 0828 : 41; + 0829 : 84; + 082A : 42; + 082B : 60; + 082C : 20; + 082D : E1; + 082E : FF; + 082F : B0; + 0830 : 01; + 0831 : 18; + 0832 : D0; + 0833 : 3C; + 0834 : A5; + 0835 : 7A; + 0836 : A4; + 0837 : 7B; + 0838 : A6; + 0839 : 3A; + 083A : E8; + 083B : F0; + 083C : 0C; + 083D : 85; + 083E : 3D; + 083F : 84; + 0840 : 3E; + 0841 : A5; + 0842 : 39; + 0843 : A4; + 0844 : 3A; + 0845 : 85; + 0846 : 3B; + 0847 : 84; + 0848 : 3C; + [0849..084A] : 68; + 084B : A9; + 084C : 81; + 084D : A0; + 084E : A3; + 084F : 90; + 0850 : 03; + 0851 : 4C; + 0852 : 69; + 0853 : A4; + 0854 : 4C; + 0855 : 86; + 0856 : E3; + 0857 : D0; + 0858 : 17; + 0859 : A2; + 085A : 1A; + 085B : A4; + 085C : 3E; + 085D : D0; + 085E : 03; + 085F : 4C; + 0860 : 37; + 0861 : A4; + 0862 : A5; + 0863 : 3D; + 0864 : 85; + 0865 : 7A; + 0866 : 84; + 0867 : 7B; + 0868 : A5; + 0869 : 3B; + 086A : A4; + 086B : 3C; + 086C : 85; + 086D : 39; + 086E : 84; + 086F : 3A; + 0870 : 60; + 0871 : 08; + 0872 : A9; + 0873 : 00; + 0874 : 20; + 0875 : 90; + 0876 : FF; + 0877 : 28; + 0878 : D0; + 0879 : 03; + 087A : 4C; + 087B : 59; + 087C : A6; + 087D : 20; + 087E : 60; + 087F : A6; + 0880 : 4C; + 0881 : 97; + 0882 : A8; + 0883 : A9; + 0884 : 03; + 0885 : 20; + 0886 : FB; + 0887 : A3; + 0888 : A5; + 0889 : 7B; + 088A : 48; + 088B : A5; + 088C : 7A; + 088D : 48; + 088E : A5; + 088F : 3A; + 0890 : 48; + 0891 : A5; + 0892 : 39; + 0893 : 48; + 0894 : A9; + 0895 : 8D; + 0896 : 48; + 0897 : 20; + 0898 : 79; + 0899 : 00; + 089A : 20; + 089B : A0; + 089C : A8; + 089D : 4C; + 089E : AE; + 089F : A7; + 08A0 : 20; + 08A1 : 6B; + 08A2 : A9; + 08A3 : 20; + 08A4 : 09; + 08A5 : A9; + 08A6 : 38; + 08A7 : A5; + 08A8 : 39; + 08A9 : E5; + 08AA : 14; + 08AB : A5; + 08AC : 3A; + 08AD : E5; + 08AE : 15; + 08AF : B0; + 08B0 : 0B; + 08B1 : 98; + 08B2 : 38; + 08B3 : 65; + 08B4 : 7A; + 08B5 : A6; + 08B6 : 7B; + 08B7 : 90; + 08B8 : 07; + 08B9 : E8; + 08BA : B0; + 08BB : 04; + 08BC : A5; + 08BD : 2B; + 08BE : A6; + 08BF : 2C; + 08C0 : 20; + 08C1 : 17; + 08C2 : A6; + 08C3 : 90; + 08C4 : 1E; + 08C5 : A5; + 08C6 : 5F; + 08C7 : E9; + 08C8 : 01; + 08C9 : 85; + 08CA : 7A; + 08CB : A5; + 08CC : 60; + 08CD : E9; + 08CE : 00; + 08CF : 85; + 08D0 : 7B; + 08D1 : 60; + 08D2 : D0; + 08D3 : FD; + 08D4 : A9; + 08D5 : FF; + 08D6 : 85; + 08D7 : 4A; + 08D8 : 20; + 08D9 : 8A; + 08DA : A3; + 08DB : 9A; + 08DC : C9; + 08DD : 8D; + 08DE : F0; + 08DF : 0B; + 08E0 : A2; + 08E1 : 0C; + 08E2 : 2C; + 08E3 : A2; + 08E4 : 11; + 08E5 : 4C; + 08E6 : 37; + 08E7 : A4; + 08E8 : 4C; + 08E9 : 08; + 08EA : AF; + [08EB..08EC] : 68; + 08ED : 85; + 08EE : 39; + 08EF : 68; + 08F0 : 85; + 08F1 : 3A; + 08F2 : 68; + 08F3 : 85; + 08F4 : 7A; + 08F5 : 68; + 08F6 : 85; + 08F7 : 7B; + 08F8 : 20; + 08F9 : 06; + 08FA : A9; + 08FB : 98; + 08FC : 18; + 08FD : 65; + 08FE : 7A; + 08FF : 85; + 0900 : 7A; + 0901 : 90; + 0902 : 02; + 0903 : E6; + 0904 : 7B; + 0905 : 60; + 0906 : A2; + 0907 : 3A; + 0908 : 2C; + 0909 : A2; + 090A : 00; + 090B : 86; + 090C : 07; + 090D : A0; + 090E : 00; + 090F : 84; + 0910 : 08; + 0911 : A5; + 0912 : 08; + 0913 : A6; + 0914 : 07; + 0915 : 85; + 0916 : 07; + 0917 : 86; + 0918 : 08; + 0919 : B1; + 091A : 7A; + 091B : F0; + 091C : E8; + 091D : C5; + 091E : 08; + 091F : F0; + 0920 : E4; + 0921 : C8; + 0922 : C9; + 0923 : 22; + 0924 : D0; + 0925 : F3; + 0926 : F0; + 0927 : E9; + 0928 : 20; + 0929 : 9E; + 092A : AD; + 092B : 20; + 092C : 79; + 092D : 00; + 092E : C9; + 092F : 89; + 0930 : F0; + 0931 : 05; + 0932 : A9; + 0933 : A7; + 0934 : 20; + 0935 : FF; + 0936 : AE; + 0937 : A5; + 0938 : 61; + 0939 : D0; + 093A : 05; + 093B : 20; + 093C : 09; + 093D : A9; + 093E : F0; + 093F : BB; + 0940 : 20; + 0941 : 79; + 0942 : 00; + 0943 : B0; + 0944 : 03; + 0945 : 4C; + 0946 : A0; + 0947 : A8; + 0948 : 4C; + 0949 : ED; + 094A : A7; + 094B : 20; + 094C : 9E; + 094D : B7; + 094E : 48; + 094F : C9; + 0950 : 8D; + 0951 : F0; + 0952 : 04; + 0953 : C9; + 0954 : 89; + 0955 : D0; + 0956 : 91; + 0957 : C6; + 0958 : 65; + 0959 : D0; + 095A : 04; + 095B : 68; + 095C : 4C; + 095D : EF; + 095E : A7; + 095F : 20; + 0960 : 73; + 0961 : 00; + 0962 : 20; + 0963 : 6B; + 0964 : A9; + 0965 : C9; + 0966 : 2C; + 0967 : F0; + 0968 : EE; + 0969 : 68; + 096A : 60; + 096B : A2; + 096C : 00; + 096D : 86; + 096E : 14; + 096F : 86; + 0970 : 15; + 0971 : B0; + 0972 : F7; + 0973 : E9; + 0974 : 2F; + 0975 : 85; + 0976 : 07; + 0977 : A5; + 0978 : 15; + 0979 : 85; + 097A : 22; + 097B : C9; + 097C : 19; + 097D : B0; + 097E : D4; + 097F : A5; + 0980 : 14; + 0981 : 0A; + 0982 : 26; + 0983 : 22; + 0984 : 0A; + 0985 : 26; + 0986 : 22; + 0987 : 65; + 0988 : 14; + 0989 : 85; + 098A : 14; + 098B : A5; + 098C : 22; + 098D : 65; + 098E : 15; + 098F : 85; + 0990 : 15; + 0991 : 06; + 0992 : 14; + 0993 : 26; + 0994 : 15; + 0995 : A5; + 0996 : 14; + 0997 : 65; + 0998 : 07; + 0999 : 85; + 099A : 14; + 099B : 90; + 099C : 02; + 099D : E6; + 099E : 15; + 099F : 20; + 09A0 : 73; + 09A1 : 00; + 09A2 : 4C; + 09A3 : 71; + 09A4 : A9; + 09A5 : 20; + 09A6 : 8B; + 09A7 : B0; + 09A8 : 85; + 09A9 : 49; + 09AA : 84; + 09AB : 4A; + 09AC : A9; + 09AD : B2; + 09AE : 20; + 09AF : FF; + 09B0 : AE; + 09B1 : A5; + 09B2 : 0E; + 09B3 : 48; + 09B4 : A5; + 09B5 : 0D; + 09B6 : 48; + 09B7 : 20; + 09B8 : 9E; + 09B9 : AD; + 09BA : 68; + 09BB : 2A; + 09BC : 20; + 09BD : 90; + 09BE : AD; + 09BF : D0; + 09C0 : 18; + 09C1 : 68; + 09C2 : 10; + 09C3 : 12; + 09C4 : 20; + 09C5 : 1B; + 09C6 : BC; + 09C7 : 20; + 09C8 : BF; + 09C9 : B1; + 09CA : A0; + 09CB : 00; + 09CC : A5; + 09CD : 64; + 09CE : 91; + 09CF : 49; + 09D0 : C8; + 09D1 : A5; + 09D2 : 65; + 09D3 : 91; + 09D4 : 49; + 09D5 : 60; + 09D6 : 4C; + 09D7 : D0; + 09D8 : BB; + 09D9 : 68; + 09DA : A4; + 09DB : 4A; + 09DC : C0; + 09DD : BF; + 09DE : D0; + 09DF : 4C; + 09E0 : 20; + 09E1 : A6; + 09E2 : B6; + 09E3 : C9; + 09E4 : 06; + 09E5 : D0; + 09E6 : 3D; + 09E7 : A0; + 09E8 : 00; + 09E9 : 84; + 09EA : 61; + 09EB : 84; + 09EC : 66; + 09ED : 84; + 09EE : 71; + 09EF : 20; + 09F0 : 1D; + 09F1 : AA; + 09F2 : 20; + 09F3 : E2; + 09F4 : BA; + 09F5 : E6; + 09F6 : 71; + 09F7 : A4; + 09F8 : 71; + 09F9 : 20; + 09FA : 1D; + 09FB : AA; + 09FC : 20; + 09FD : 0C; + 09FE : BC; + 09FF : AA; + 0A00 : F0; + 0A01 : 05; + 0A02 : E8; + 0A03 : 8A; + 0A04 : 20; + 0A05 : ED; + 0A06 : BA; + 0A07 : A4; + 0A08 : 71; + 0A09 : C8; + 0A0A : C0; + 0A0B : 06; + 0A0C : D0; + 0A0D : DF; + 0A0E : 20; + 0A0F : E2; + 0A10 : BA; + 0A11 : 20; + 0A12 : 9B; + 0A13 : BC; + 0A14 : A6; + 0A15 : 64; + 0A16 : A4; + 0A17 : 63; + 0A18 : A5; + 0A19 : 65; + 0A1A : 4C; + 0A1B : DB; + 0A1C : FF; + 0A1D : B1; + 0A1E : 22; + 0A1F : 20; + 0A20 : 80; + 0A21 : 00; + 0A22 : 90; + 0A23 : 03; + 0A24 : 4C; + 0A25 : 48; + 0A26 : B2; + 0A27 : E9; + 0A28 : 2F; + 0A29 : 4C; + 0A2A : 7E; + 0A2B : BD; + 0A2C : A0; + 0A2D : 02; + 0A2E : B1; + 0A2F : 64; + 0A30 : C5; + 0A31 : 34; + 0A32 : 90; + 0A33 : 17; + 0A34 : D0; + 0A35 : 07; + 0A36 : 88; + 0A37 : B1; + 0A38 : 64; + 0A39 : C5; + 0A3A : 33; + 0A3B : 90; + 0A3C : 0E; + 0A3D : A4; + 0A3E : 65; + 0A3F : C4; + 0A40 : 2E; + 0A41 : 90; + 0A42 : 08; + 0A43 : D0; + 0A44 : 0D; + 0A45 : A5; + 0A46 : 64; + 0A47 : C5; + 0A48 : 2D; + 0A49 : B0; + 0A4A : 07; + 0A4B : A5; + 0A4C : 64; + 0A4D : A4; + 0A4E : 65; + 0A4F : 4C; + 0A50 : 68; + 0A51 : AA; + 0A52 : A0; + 0A53 : 00; + 0A54 : B1; + 0A55 : 64; + 0A56 : 20; + 0A57 : 75; + 0A58 : B4; + 0A59 : A5; + 0A5A : 50; + 0A5B : A4; + 0A5C : 51; + 0A5D : 85; + 0A5E : 6F; + 0A5F : 84; + 0A60 : 70; + 0A61 : 20; + 0A62 : 7A; + 0A63 : B6; + 0A64 : A9; + 0A65 : 61; + 0A66 : A0; + 0A67 : 00; + 0A68 : 85; + 0A69 : 50; + 0A6A : 84; + 0A6B : 51; + 0A6C : 20; + 0A6D : DB; + 0A6E : B6; + 0A6F : A0; + 0A70 : 00; + 0A71 : B1; + 0A72 : 50; + 0A73 : 91; + 0A74 : 49; + 0A75 : C8; + 0A76 : B1; + 0A77 : 50; + 0A78 : 91; + 0A79 : 49; + 0A7A : C8; + 0A7B : B1; + 0A7C : 50; + 0A7D : 91; + 0A7E : 49; + 0A7F : 60; + 0A80 : 20; + 0A81 : 86; + 0A82 : AA; + 0A83 : 4C; + 0A84 : B5; + 0A85 : AB; + 0A86 : 20; + 0A87 : 9E; + 0A88 : B7; + 0A89 : F0; + 0A8A : 05; + 0A8B : A9; + 0A8C : 2C; + 0A8D : 20; + 0A8E : FF; + 0A8F : AE; + 0A90 : 08; + 0A91 : 86; + 0A92 : 13; + 0A93 : 20; + 0A94 : 18; + 0A95 : E1; + 0A96 : 28; + 0A97 : 4C; + 0A98 : A0; + 0A99 : AA; + 0A9A : 20; + 0A9B : 21; + 0A9C : AB; + 0A9D : 20; + 0A9E : 79; + 0A9F : 00; + 0AA0 : F0; + 0AA1 : 35; + 0AA2 : F0; + 0AA3 : 43; + 0AA4 : C9; + 0AA5 : A3; + 0AA6 : F0; + 0AA7 : 50; + 0AA8 : C9; + 0AA9 : A6; + 0AAA : 18; + 0AAB : F0; + 0AAC : 4B; + 0AAD : C9; + 0AAE : 2C; + 0AAF : F0; + 0AB0 : 37; + 0AB1 : C9; + 0AB2 : 3B; + 0AB3 : F0; + 0AB4 : 5E; + 0AB5 : 20; + 0AB6 : 9E; + 0AB7 : AD; + 0AB8 : 24; + 0AB9 : 0D; + 0ABA : 30; + 0ABB : DE; + 0ABC : 20; + 0ABD : DD; + 0ABE : BD; + 0ABF : 20; + 0AC0 : 87; + 0AC1 : B4; + 0AC2 : 20; + 0AC3 : 21; + 0AC4 : AB; + 0AC5 : 20; + 0AC6 : 3B; + 0AC7 : AB; + 0AC8 : D0; + 0AC9 : D3; + 0ACA : A9; + 0ACB : 00; + 0ACC : 9D; + 0ACD : 00; + 0ACE : 02; + 0ACF : A2; + 0AD0 : FF; + 0AD1 : A0; + 0AD2 : 01; + 0AD3 : A5; + 0AD4 : 13; + 0AD5 : D0; + 0AD6 : 10; + 0AD7 : A9; + 0AD8 : 0D; + 0AD9 : 20; + 0ADA : 47; + 0ADB : AB; + 0ADC : 24; + 0ADD : 13; + 0ADE : 10; + 0ADF : 05; + 0AE0 : A9; + 0AE1 : 0A; + 0AE2 : 20; + 0AE3 : 47; + 0AE4 : AB; + 0AE5 : 49; + 0AE6 : FF; + 0AE7 : 60; + 0AE8 : 38; + 0AE9 : 20; + 0AEA : F0; + 0AEB : FF; + 0AEC : 98; + 0AED : 38; + 0AEE : E9; + 0AEF : 0A; + 0AF0 : B0; + 0AF1 : FC; + 0AF2 : 49; + 0AF3 : FF; + 0AF4 : 69; + 0AF5 : 01; + 0AF6 : D0; + 0AF7 : 16; + 0AF8 : 08; + 0AF9 : 38; + 0AFA : 20; + 0AFB : F0; + 0AFC : FF; + 0AFD : 84; + 0AFE : 09; + 0AFF : 20; + 0B00 : 9B; + 0B01 : B7; + 0B02 : C9; + 0B03 : 29; + 0B04 : D0; + 0B05 : 59; + 0B06 : 28; + 0B07 : 90; + 0B08 : 06; + 0B09 : 8A; + 0B0A : E5; + 0B0B : 09; + 0B0C : 90; + 0B0D : 05; + 0B0E : AA; + 0B0F : E8; + 0B10 : CA; + 0B11 : D0; + 0B12 : 06; + 0B13 : 20; + 0B14 : 73; + 0B15 : 00; + 0B16 : 4C; + 0B17 : A2; + 0B18 : AA; + 0B19 : 20; + 0B1A : 3B; + 0B1B : AB; + 0B1C : D0; + 0B1D : F2; + 0B1E : 20; + 0B1F : 87; + 0B20 : B4; + 0B21 : 20; + 0B22 : A6; + 0B23 : B6; + 0B24 : AA; + 0B25 : A0; + 0B26 : 00; + 0B27 : E8; + 0B28 : CA; + 0B29 : F0; + 0B2A : BC; + 0B2B : B1; + 0B2C : 22; + 0B2D : 20; + 0B2E : 47; + 0B2F : AB; + 0B30 : C8; + 0B31 : C9; + 0B32 : 0D; + 0B33 : D0; + 0B34 : F3; + 0B35 : 20; + 0B36 : E5; + 0B37 : AA; + 0B38 : 4C; + 0B39 : 28; + 0B3A : AB; + 0B3B : A5; + 0B3C : 13; + 0B3D : F0; + 0B3E : 03; + 0B3F : A9; + 0B40 : 20; + 0B41 : 2C; + 0B42 : A9; + 0B43 : 1D; + 0B44 : 2C; + 0B45 : A9; + 0B46 : 3F; + 0B47 : 20; + 0B48 : 0C; + 0B49 : E1; + 0B4A : 29; + 0B4B : FF; + 0B4C : 60; + 0B4D : A5; + 0B4E : 11; + 0B4F : F0; + 0B50 : 11; + 0B51 : 30; + 0B52 : 04; + 0B53 : A0; + 0B54 : FF; + 0B55 : D0; + 0B56 : 04; + 0B57 : A5; + 0B58 : 3F; + 0B59 : A4; + 0B5A : 40; + 0B5B : 85; + 0B5C : 39; + 0B5D : 84; + 0B5E : 3A; + 0B5F : 4C; + 0B60 : 08; + 0B61 : AF; + 0B62 : A5; + 0B63 : 13; + 0B64 : F0; + 0B65 : 05; + 0B66 : A2; + 0B67 : 18; + 0B68 : 4C; + 0B69 : 37; + 0B6A : A4; + 0B6B : A9; + 0B6C : 0C; + 0B6D : A0; + 0B6E : AD; + 0B6F : 20; + 0B70 : 1E; + 0B71 : AB; + 0B72 : A5; + 0B73 : 3D; + 0B74 : A4; + 0B75 : 3E; + 0B76 : 85; + 0B77 : 7A; + 0B78 : 84; + 0B79 : 7B; + 0B7A : 60; + 0B7B : 20; + 0B7C : A6; + 0B7D : B3; + 0B7E : C9; + 0B7F : 23; + 0B80 : D0; + 0B81 : 10; + 0B82 : 20; + 0B83 : 73; + 0B84 : 00; + 0B85 : 20; + 0B86 : 9E; + 0B87 : B7; + 0B88 : A9; + 0B89 : 2C; + 0B8A : 20; + 0B8B : FF; + 0B8C : AE; + 0B8D : 86; + 0B8E : 13; + 0B8F : 20; + 0B90 : 1E; + 0B91 : E1; + 0B92 : A2; + 0B93 : 01; + 0B94 : A0; + 0B95 : 02; + 0B96 : A9; + 0B97 : 00; + 0B98 : 8D; + 0B99 : 01; + 0B9A : 02; + 0B9B : A9; + 0B9C : 40; + 0B9D : 20; + 0B9E : 0F; + 0B9F : AC; + 0BA0 : A6; + 0BA1 : 13; + 0BA2 : D0; + 0BA3 : 13; + 0BA4 : 60; + 0BA5 : 20; + 0BA6 : 9E; + 0BA7 : B7; + 0BA8 : A9; + 0BA9 : 2C; + 0BAA : 20; + 0BAB : FF; + 0BAC : AE; + 0BAD : 86; + 0BAE : 13; + 0BAF : 20; + 0BB0 : 1E; + 0BB1 : E1; + 0BB2 : 20; + 0BB3 : CE; + 0BB4 : AB; + 0BB5 : A5; + 0BB6 : 13; + 0BB7 : 20; + 0BB8 : CC; + 0BB9 : FF; + 0BBA : A2; + 0BBB : 00; + 0BBC : 86; + 0BBD : 13; + 0BBE : 60; + 0BBF : C9; + 0BC0 : 22; + 0BC1 : D0; + 0BC2 : 0B; + 0BC3 : 20; + 0BC4 : BD; + 0BC5 : AE; + 0BC6 : A9; + 0BC7 : 3B; + 0BC8 : 20; + 0BC9 : FF; + 0BCA : AE; + 0BCB : 20; + 0BCC : 21; + 0BCD : AB; + 0BCE : 20; + 0BCF : A6; + 0BD0 : B3; + 0BD1 : A9; + 0BD2 : 2C; + 0BD3 : 8D; + 0BD4 : FF; + 0BD5 : 01; + 0BD6 : 20; + 0BD7 : F9; + 0BD8 : AB; + 0BD9 : A5; + 0BDA : 13; + 0BDB : F0; + 0BDC : 0D; + 0BDD : 20; + 0BDE : B7; + 0BDF : FF; + 0BE0 : 29; + 0BE1 : 02; + 0BE2 : F0; + 0BE3 : 06; + 0BE4 : 20; + 0BE5 : B5; + 0BE6 : AB; + 0BE7 : 4C; + 0BE8 : F8; + 0BE9 : A8; + 0BEA : AD; + 0BEB : 00; + 0BEC : 02; + 0BED : D0; + 0BEE : 1E; + 0BEF : A5; + 0BF0 : 13; + 0BF1 : D0; + 0BF2 : E3; + 0BF3 : 20; + 0BF4 : 06; + 0BF5 : A9; + 0BF6 : 4C; + 0BF7 : FB; + 0BF8 : A8; + 0BF9 : A5; + 0BFA : 13; + 0BFB : D0; + 0BFC : 06; + 0BFD : 20; + 0BFE : 45; + 0BFF : AB; + 0C00 : 20; + 0C01 : 3B; + 0C02 : AB; + 0C03 : 4C; + 0C04 : 60; + 0C05 : A5; + 0C06 : A6; + 0C07 : 41; + 0C08 : A4; + 0C09 : 42; + 0C0A : A9; + 0C0B : 98; + 0C0C : 2C; + 0C0D : A9; + 0C0E : 00; + 0C0F : 85; + 0C10 : 11; + 0C11 : 86; + 0C12 : 43; + 0C13 : 84; + 0C14 : 44; + 0C15 : 20; + 0C16 : 8B; + 0C17 : B0; + 0C18 : 85; + 0C19 : 49; + 0C1A : 84; + 0C1B : 4A; + 0C1C : A5; + 0C1D : 7A; + 0C1E : A4; + 0C1F : 7B; + 0C20 : 85; + 0C21 : 4B; + 0C22 : 84; + 0C23 : 4C; + 0C24 : A6; + 0C25 : 43; + 0C26 : A4; + 0C27 : 44; + 0C28 : 86; + 0C29 : 7A; + 0C2A : 84; + 0C2B : 7B; + 0C2C : 20; + 0C2D : 79; + 0C2E : 00; + 0C2F : D0; + 0C30 : 20; + 0C31 : 24; + 0C32 : 11; + 0C33 : 50; + 0C34 : 0C; + 0C35 : 20; + 0C36 : 24; + 0C37 : E1; + 0C38 : 8D; + 0C39 : 00; + 0C3A : 02; + 0C3B : A2; + 0C3C : FF; + 0C3D : A0; + 0C3E : 01; + 0C3F : D0; + 0C40 : 0C; + 0C41 : 30; + 0C42 : 75; + 0C43 : A5; + 0C44 : 13; + 0C45 : D0; + 0C46 : 03; + 0C47 : 20; + 0C48 : 45; + 0C49 : AB; + 0C4A : 20; + 0C4B : F9; + 0C4C : AB; + 0C4D : 86; + 0C4E : 7A; + 0C4F : 84; + 0C50 : 7B; + 0C51 : 20; + 0C52 : 73; + 0C53 : 00; + 0C54 : 24; + 0C55 : 0D; + 0C56 : 10; + 0C57 : 31; + 0C58 : 24; + 0C59 : 11; + 0C5A : 50; + 0C5B : 09; + 0C5C : E8; + 0C5D : 86; + 0C5E : 7A; + 0C5F : A9; + 0C60 : 00; + 0C61 : 85; + 0C62 : 07; + 0C63 : F0; + 0C64 : 0C; + 0C65 : 85; + 0C66 : 07; + 0C67 : C9; + 0C68 : 22; + 0C69 : F0; + 0C6A : 07; + 0C6B : A9; + 0C6C : 3A; + 0C6D : 85; + 0C6E : 07; + 0C6F : A9; + 0C70 : 2C; + 0C71 : 18; + 0C72 : 85; + 0C73 : 08; + 0C74 : A5; + 0C75 : 7A; + 0C76 : A4; + 0C77 : 7B; + 0C78 : 69; + 0C79 : 00; + 0C7A : 90; + 0C7B : 01; + 0C7C : C8; + 0C7D : 20; + 0C7E : 8D; + 0C7F : B4; + 0C80 : 20; + 0C81 : E2; + 0C82 : B7; + 0C83 : 20; + 0C84 : DA; + 0C85 : A9; + 0C86 : 4C; + 0C87 : 91; + 0C88 : AC; + 0C89 : 20; + 0C8A : F3; + 0C8B : BC; + 0C8C : A5; + 0C8D : 0E; + 0C8E : 20; + 0C8F : C2; + 0C90 : A9; + 0C91 : 20; + 0C92 : 79; + 0C93 : 00; + 0C94 : F0; + 0C95 : 07; + 0C96 : C9; + 0C97 : 2C; + 0C98 : F0; + 0C99 : 03; + 0C9A : 4C; + 0C9B : 4D; + 0C9C : AB; + 0C9D : A5; + 0C9E : 7A; + 0C9F : A4; + 0CA0 : 7B; + 0CA1 : 85; + 0CA2 : 43; + 0CA3 : 84; + 0CA4 : 44; + 0CA5 : A5; + 0CA6 : 4B; + 0CA7 : A4; + 0CA8 : 4C; + 0CA9 : 85; + 0CAA : 7A; + 0CAB : 84; + 0CAC : 7B; + 0CAD : 20; + 0CAE : 79; + 0CAF : 00; + 0CB0 : F0; + 0CB1 : 2D; + 0CB2 : 20; + 0CB3 : FD; + 0CB4 : AE; + 0CB5 : 4C; + 0CB6 : 15; + 0CB7 : AC; + 0CB8 : 20; + 0CB9 : 06; + 0CBA : A9; + 0CBB : C8; + 0CBC : AA; + 0CBD : D0; + 0CBE : 12; + 0CBF : A2; + 0CC0 : 0D; + 0CC1 : C8; + 0CC2 : B1; + 0CC3 : 7A; + 0CC4 : F0; + 0CC5 : 6C; + 0CC6 : C8; + 0CC7 : B1; + 0CC8 : 7A; + 0CC9 : 85; + 0CCA : 3F; + 0CCB : C8; + 0CCC : B1; + 0CCD : 7A; + 0CCE : C8; + 0CCF : 85; + 0CD0 : 40; + 0CD1 : 20; + 0CD2 : FB; + 0CD3 : A8; + 0CD4 : 20; + 0CD5 : 79; + 0CD6 : 00; + 0CD7 : AA; + 0CD8 : E0; + 0CD9 : 83; + 0CDA : D0; + 0CDB : DC; + 0CDC : 4C; + 0CDD : 51; + 0CDE : AC; + 0CDF : A5; + 0CE0 : 43; + 0CE1 : A4; + 0CE2 : 44; + 0CE3 : A6; + 0CE4 : 11; + 0CE5 : 10; + 0CE6 : 03; + 0CE7 : 4C; + 0CE8 : 27; + 0CE9 : A8; + 0CEA : A0; + 0CEB : 00; + 0CEC : B1; + 0CED : 43; + 0CEE : F0; + 0CEF : 0B; + 0CF0 : A5; + 0CF1 : 13; + 0CF2 : D0; + 0CF3 : 07; + 0CF4 : A9; + 0CF5 : FC; + 0CF6 : A0; + 0CF7 : AC; + 0CF8 : 4C; + 0CF9 : 1E; + 0CFA : AB; + 0CFB : 60; + 0CFC : 3F; + 0CFD : 45; + 0CFE : 58; + 0CFF : 54; + 0D00 : 52; + 0D01 : 41; + 0D02 : 20; + 0D03 : 49; + 0D04 : 47; + 0D05 : 4E; + 0D06 : 4F; + 0D07 : 52; + 0D08 : 45; + 0D09 : 44; + 0D0A : 0D; + 0D0B : 00; + 0D0C : 3F; + 0D0D : 52; + 0D0E : 45; + 0D0F : 44; + 0D10 : 4F; + 0D11 : 20; + 0D12 : 46; + 0D13 : 52; + 0D14 : 4F; + 0D15 : 4D; + 0D16 : 20; + 0D17 : 53; + 0D18 : 54; + 0D19 : 41; + 0D1A : 52; + 0D1B : 54; + 0D1C : 0D; + 0D1D : 00; + 0D1E : D0; + 0D1F : 04; + 0D20 : A0; + 0D21 : 00; + 0D22 : F0; + 0D23 : 03; + 0D24 : 20; + 0D25 : 8B; + 0D26 : B0; + 0D27 : 85; + 0D28 : 49; + 0D29 : 84; + 0D2A : 4A; + 0D2B : 20; + 0D2C : 8A; + 0D2D : A3; + 0D2E : F0; + 0D2F : 05; + 0D30 : A2; + 0D31 : 0A; + 0D32 : 4C; + 0D33 : 37; + 0D34 : A4; + 0D35 : 9A; + 0D36 : 8A; + 0D37 : 18; + 0D38 : 69; + 0D39 : 04; + 0D3A : 48; + 0D3B : 69; + 0D3C : 06; + 0D3D : 85; + 0D3E : 24; + 0D3F : 68; + 0D40 : A0; + 0D41 : 01; + 0D42 : 20; + 0D43 : A2; + 0D44 : BB; + 0D45 : BA; + 0D46 : BD; + 0D47 : 09; + 0D48 : 01; + 0D49 : 85; + 0D4A : 66; + 0D4B : A5; + 0D4C : 49; + 0D4D : A4; + 0D4E : 4A; + 0D4F : 20; + 0D50 : 67; + 0D51 : B8; + 0D52 : 20; + 0D53 : D0; + 0D54 : BB; + 0D55 : A0; + 0D56 : 01; + 0D57 : 20; + 0D58 : 5D; + 0D59 : BC; + 0D5A : BA; + 0D5B : 38; + 0D5C : FD; + 0D5D : 09; + 0D5E : 01; + 0D5F : F0; + 0D60 : 17; + 0D61 : BD; + 0D62 : 0F; + 0D63 : 01; + 0D64 : 85; + 0D65 : 39; + 0D66 : BD; + 0D67 : 10; + 0D68 : 01; + 0D69 : 85; + 0D6A : 3A; + 0D6B : BD; + 0D6C : 12; + 0D6D : 01; + 0D6E : 85; + 0D6F : 7A; + 0D70 : BD; + 0D71 : 11; + 0D72 : 01; + 0D73 : 85; + 0D74 : 7B; + 0D75 : 4C; + 0D76 : AE; + 0D77 : A7; + 0D78 : 8A; + 0D79 : 69; + 0D7A : 11; + 0D7B : AA; + 0D7C : 9A; + 0D7D : 20; + 0D7E : 79; + 0D7F : 00; + 0D80 : C9; + 0D81 : 2C; + 0D82 : D0; + 0D83 : F1; + 0D84 : 20; + 0D85 : 73; + 0D86 : 00; + 0D87 : 20; + 0D88 : 24; + 0D89 : AD; + 0D8A : 20; + 0D8B : 9E; + 0D8C : AD; + 0D8D : 18; + 0D8E : 24; + 0D8F : 38; + 0D90 : 24; + 0D91 : 0D; + 0D92 : 30; + 0D93 : 03; + 0D94 : B0; + 0D95 : 03; + 0D96 : 60; + 0D97 : B0; + 0D98 : FD; + 0D99 : A2; + 0D9A : 16; + 0D9B : 4C; + 0D9C : 37; + 0D9D : A4; + 0D9E : A6; + 0D9F : 7A; + 0DA0 : D0; + 0DA1 : 02; + 0DA2 : C6; + 0DA3 : 7B; + 0DA4 : C6; + 0DA5 : 7A; + 0DA6 : A2; + 0DA7 : 00; + 0DA8 : 24; + 0DA9 : 48; + 0DAA : 8A; + 0DAB : 48; + 0DAC : A9; + 0DAD : 01; + 0DAE : 20; + 0DAF : FB; + 0DB0 : A3; + 0DB1 : 20; + 0DB2 : 83; + 0DB3 : AE; + 0DB4 : A9; + 0DB5 : 00; + 0DB6 : 85; + 0DB7 : 4D; + 0DB8 : 20; + 0DB9 : 79; + 0DBA : 00; + 0DBB : 38; + 0DBC : E9; + 0DBD : B1; + 0DBE : 90; + 0DBF : 17; + 0DC0 : C9; + 0DC1 : 03; + 0DC2 : B0; + 0DC3 : 13; + 0DC4 : C9; + 0DC5 : 01; + 0DC6 : 2A; + 0DC7 : 49; + 0DC8 : 01; + 0DC9 : 45; + 0DCA : 4D; + 0DCB : C5; + 0DCC : 4D; + 0DCD : 90; + 0DCE : 61; + 0DCF : 85; + 0DD0 : 4D; + 0DD1 : 20; + 0DD2 : 73; + 0DD3 : 00; + 0DD4 : 4C; + 0DD5 : BB; + 0DD6 : AD; + 0DD7 : A6; + 0DD8 : 4D; + 0DD9 : D0; + 0DDA : 2C; + 0DDB : B0; + 0DDC : 7B; + 0DDD : 69; + 0DDE : 07; + 0DDF : 90; + 0DE0 : 77; + 0DE1 : 65; + 0DE2 : 0D; + 0DE3 : D0; + 0DE4 : 03; + 0DE5 : 4C; + 0DE6 : 3D; + 0DE7 : B6; + 0DE8 : 69; + 0DE9 : FF; + 0DEA : 85; + 0DEB : 22; + 0DEC : 0A; + 0DED : 65; + 0DEE : 22; + 0DEF : A8; + 0DF0 : 68; + 0DF1 : D9; + 0DF2 : 80; + 0DF3 : A0; + 0DF4 : B0; + 0DF5 : 67; + 0DF6 : 20; + 0DF7 : 8D; + 0DF8 : AD; + 0DF9 : 48; + [0DFA..0DFB] : 20; + 0DFC : AE; + 0DFD : 68; + 0DFE : A4; + 0DFF : 4B; + 0E00 : 10; + 0E01 : 17; + 0E02 : AA; + 0E03 : F0; + 0E04 : 56; + 0E05 : D0; + 0E06 : 5F; + 0E07 : 46; + 0E08 : 0D; + 0E09 : 8A; + 0E0A : 2A; + 0E0B : A6; + 0E0C : 7A; + 0E0D : D0; + 0E0E : 02; + 0E0F : C6; + 0E10 : 7B; + 0E11 : C6; + 0E12 : 7A; + 0E13 : A0; + 0E14 : 1B; + 0E15 : 85; + 0E16 : 4D; + 0E17 : D0; + 0E18 : D7; + 0E19 : D9; + 0E1A : 80; + 0E1B : A0; + 0E1C : B0; + 0E1D : 48; + 0E1E : 90; + 0E1F : D9; + 0E20 : B9; + 0E21 : 82; + 0E22 : A0; + 0E23 : 48; + 0E24 : B9; + 0E25 : 81; + 0E26 : A0; + 0E27 : 48; + 0E28 : 20; + 0E29 : 33; + 0E2A : AE; + 0E2B : A5; + 0E2C : 4D; + 0E2D : 4C; + 0E2E : A9; + 0E2F : AD; + 0E30 : 4C; + 0E31 : 08; + 0E32 : AF; + 0E33 : A5; + 0E34 : 66; + 0E35 : BE; + 0E36 : 80; + 0E37 : A0; + 0E38 : A8; + 0E39 : 68; + 0E3A : 85; + 0E3B : 22; + 0E3C : E6; + 0E3D : 22; + 0E3E : 68; + 0E3F : 85; + 0E40 : 23; + 0E41 : 98; + 0E42 : 48; + 0E43 : 20; + 0E44 : 1B; + 0E45 : BC; + 0E46 : A5; + 0E47 : 65; + 0E48 : 48; + 0E49 : A5; + 0E4A : 64; + 0E4B : 48; + 0E4C : A5; + 0E4D : 63; + 0E4E : 48; + 0E4F : A5; + 0E50 : 62; + 0E51 : 48; + 0E52 : A5; + 0E53 : 61; + 0E54 : 48; + 0E55 : 6C; + 0E56 : 22; + 0E57 : 00; + 0E58 : A0; + 0E59 : FF; + 0E5A : 68; + 0E5B : F0; + 0E5C : 23; + 0E5D : C9; + 0E5E : 64; + 0E5F : F0; + 0E60 : 03; + 0E61 : 20; + 0E62 : 8D; + 0E63 : AD; + 0E64 : 84; + 0E65 : 4B; + 0E66 : 68; + 0E67 : 4A; + 0E68 : 85; + 0E69 : 12; + 0E6A : 68; + 0E6B : 85; + 0E6C : 69; + 0E6D : 68; + 0E6E : 85; + 0E6F : 6A; + 0E70 : 68; + 0E71 : 85; + 0E72 : 6B; + 0E73 : 68; + 0E74 : 85; + 0E75 : 6C; + 0E76 : 68; + 0E77 : 85; + 0E78 : 6D; + 0E79 : 68; + 0E7A : 85; + 0E7B : 6E; + 0E7C : 45; + 0E7D : 66; + 0E7E : 85; + 0E7F : 6F; + 0E80 : A5; + 0E81 : 61; + 0E82 : 60; + 0E83 : 6C; + 0E84 : 0A; + 0E85 : 03; + 0E86 : A9; + 0E87 : 00; + 0E88 : 85; + 0E89 : 0D; + 0E8A : 20; + 0E8B : 73; + 0E8C : 00; + 0E8D : B0; + 0E8E : 03; + 0E8F : 4C; + 0E90 : F3; + 0E91 : BC; + 0E92 : 20; + 0E93 : 13; + 0E94 : B1; + 0E95 : 90; + 0E96 : 03; + 0E97 : 4C; + 0E98 : 28; + 0E99 : AF; + 0E9A : C9; + 0E9B : FF; + 0E9C : D0; + 0E9D : 0F; + 0E9E : A9; + 0E9F : A8; + 0EA0 : A0; + 0EA1 : AE; + 0EA2 : 20; + 0EA3 : A2; + 0EA4 : BB; + 0EA5 : 4C; + 0EA6 : 73; + 0EA7 : 00; + 0EA8 : 82; + 0EA9 : 49; + 0EAA : 0F; + 0EAB : DA; + 0EAC : A1; + 0EAD : C9; + 0EAE : 2E; + 0EAF : F0; + 0EB0 : DE; + 0EB1 : C9; + 0EB2 : AB; + 0EB3 : F0; + 0EB4 : 58; + 0EB5 : C9; + 0EB6 : AA; + 0EB7 : F0; + 0EB8 : D1; + 0EB9 : C9; + 0EBA : 22; + 0EBB : D0; + 0EBC : 0F; + 0EBD : A5; + 0EBE : 7A; + 0EBF : A4; + 0EC0 : 7B; + 0EC1 : 69; + 0EC2 : 00; + 0EC3 : 90; + 0EC4 : 01; + 0EC5 : C8; + 0EC6 : 20; + 0EC7 : 87; + 0EC8 : B4; + 0EC9 : 4C; + 0ECA : E2; + 0ECB : B7; + 0ECC : C9; + 0ECD : A8; + 0ECE : D0; + 0ECF : 13; + 0ED0 : A0; + 0ED1 : 18; + 0ED2 : D0; + 0ED3 : 3B; + 0ED4 : 20; + 0ED5 : BF; + 0ED6 : B1; + 0ED7 : A5; + 0ED8 : 65; + 0ED9 : 49; + 0EDA : FF; + 0EDB : A8; + 0EDC : A5; + 0EDD : 64; + 0EDE : 49; + 0EDF : FF; + 0EE0 : 4C; + 0EE1 : 91; + 0EE2 : B3; + 0EE3 : C9; + 0EE4 : A5; + 0EE5 : D0; + 0EE6 : 03; + 0EE7 : 4C; + 0EE8 : F4; + 0EE9 : B3; + 0EEA : C9; + 0EEB : B4; + 0EEC : 90; + 0EED : 03; + 0EEE : 4C; + 0EEF : A7; + 0EF0 : AF; + 0EF1 : 20; + 0EF2 : FA; + 0EF3 : AE; + 0EF4 : 20; + 0EF5 : 9E; + 0EF6 : AD; + 0EF7 : A9; + 0EF8 : 29; + 0EF9 : 2C; + 0EFA : A9; + 0EFB : 28; + 0EFC : 2C; + 0EFD : A9; + 0EFE : 2C; + 0EFF : A0; + 0F00 : 00; + 0F01 : D1; + 0F02 : 7A; + 0F03 : D0; + 0F04 : 03; + 0F05 : 4C; + 0F06 : 73; + 0F07 : 00; + 0F08 : A2; + 0F09 : 0B; + 0F0A : 4C; + 0F0B : 37; + 0F0C : A4; + 0F0D : A0; + 0F0E : 15; + [0F0F..0F10] : 68; + 0F11 : 4C; + 0F12 : FA; + 0F13 : AD; + 0F14 : 38; + 0F15 : A5; + 0F16 : 64; + 0F17 : E9; + 0F18 : 00; + 0F19 : A5; + 0F1A : 65; + 0F1B : E9; + 0F1C : A0; + 0F1D : 90; + 0F1E : 08; + 0F1F : A9; + 0F20 : A2; + 0F21 : E5; + 0F22 : 64; + 0F23 : A9; + 0F24 : E3; + 0F25 : E5; + 0F26 : 65; + 0F27 : 60; + 0F28 : 20; + 0F29 : 8B; + 0F2A : B0; + 0F2B : 85; + 0F2C : 64; + 0F2D : 84; + 0F2E : 65; + 0F2F : A6; + 0F30 : 45; + 0F31 : A4; + 0F32 : 46; + 0F33 : A5; + 0F34 : 0D; + 0F35 : F0; + 0F36 : 26; + 0F37 : A9; + 0F38 : 00; + 0F39 : 85; + 0F3A : 70; + 0F3B : 20; + 0F3C : 14; + 0F3D : AF; + 0F3E : 90; + 0F3F : 1C; + 0F40 : E0; + 0F41 : 54; + 0F42 : D0; + 0F43 : 18; + 0F44 : C0; + 0F45 : C9; + 0F46 : D0; + 0F47 : 14; + 0F48 : 20; + 0F49 : 84; + 0F4A : AF; + 0F4B : 84; + 0F4C : 5E; + 0F4D : 88; + 0F4E : 84; + 0F4F : 71; + 0F50 : A0; + 0F51 : 06; + 0F52 : 84; + 0F53 : 5D; + 0F54 : A0; + 0F55 : 24; + 0F56 : 20; + 0F57 : 68; + 0F58 : BE; + 0F59 : 4C; + 0F5A : 6F; + 0F5B : B4; + 0F5C : 60; + 0F5D : 24; + 0F5E : 0E; + 0F5F : 10; + 0F60 : 0D; + 0F61 : A0; + 0F62 : 00; + 0F63 : B1; + 0F64 : 64; + 0F65 : AA; + 0F66 : C8; + 0F67 : B1; + 0F68 : 64; + 0F69 : A8; + 0F6A : 8A; + 0F6B : 4C; + 0F6C : 91; + 0F6D : B3; + 0F6E : 20; + 0F6F : 14; + 0F70 : AF; + 0F71 : 90; + 0F72 : 2D; + 0F73 : E0; + 0F74 : 54; + 0F75 : D0; + 0F76 : 1B; + 0F77 : C0; + 0F78 : 49; + 0F79 : D0; + 0F7A : 25; + 0F7B : 20; + 0F7C : 84; + 0F7D : AF; + 0F7E : 98; + 0F7F : A2; + 0F80 : A0; + 0F81 : 4C; + 0F82 : 4F; + 0F83 : BC; + 0F84 : 20; + 0F85 : DE; + 0F86 : FF; + 0F87 : 86; + 0F88 : 64; + 0F89 : 84; + 0F8A : 63; + 0F8B : 85; + 0F8C : 65; + 0F8D : A0; + 0F8E : 00; + 0F8F : 84; + 0F90 : 62; + 0F91 : 60; + 0F92 : E0; + 0F93 : 53; + 0F94 : D0; + 0F95 : 0A; + 0F96 : C0; + 0F97 : 54; + 0F98 : D0; + 0F99 : 06; + 0F9A : 20; + 0F9B : B7; + 0F9C : FF; + 0F9D : 4C; + 0F9E : 3C; + 0F9F : BC; + 0FA0 : A5; + 0FA1 : 64; + 0FA2 : A4; + 0FA3 : 65; + 0FA4 : 4C; + 0FA5 : A2; + 0FA6 : BB; + 0FA7 : 0A; + 0FA8 : 48; + 0FA9 : AA; + 0FAA : 20; + 0FAB : 73; + 0FAC : 00; + 0FAD : E0; + 0FAE : 8F; + 0FAF : 90; + [0FB0..0FB1] : 20; + 0FB2 : FA; + 0FB3 : AE; + 0FB4 : 20; + 0FB5 : 9E; + 0FB6 : AD; + 0FB7 : 20; + 0FB8 : FD; + 0FB9 : AE; + 0FBA : 20; + 0FBB : 8F; + 0FBC : AD; + 0FBD : 68; + 0FBE : AA; + 0FBF : A5; + 0FC0 : 65; + 0FC1 : 48; + 0FC2 : A5; + 0FC3 : 64; + 0FC4 : 48; + 0FC5 : 8A; + 0FC6 : 48; + 0FC7 : 20; + 0FC8 : 9E; + 0FC9 : B7; + 0FCA : 68; + 0FCB : A8; + 0FCC : 8A; + 0FCD : 48; + 0FCE : 4C; + 0FCF : D6; + 0FD0 : AF; + 0FD1 : 20; + 0FD2 : F1; + 0FD3 : AE; + 0FD4 : 68; + 0FD5 : A8; + 0FD6 : B9; + 0FD7 : EA; + 0FD8 : 9F; + 0FD9 : 85; + 0FDA : 55; + 0FDB : B9; + 0FDC : EB; + 0FDD : 9F; + 0FDE : 85; + 0FDF : 56; + 0FE0 : 20; + 0FE1 : 54; + 0FE2 : 00; + 0FE3 : 4C; + 0FE4 : 8D; + 0FE5 : AD; + 0FE6 : A0; + 0FE7 : FF; + 0FE8 : 2C; + 0FE9 : A0; + 0FEA : 00; + 0FEB : 84; + 0FEC : 0B; + 0FED : 20; + 0FEE : BF; + 0FEF : B1; + 0FF0 : A5; + 0FF1 : 64; + 0FF2 : 45; + 0FF3 : 0B; + 0FF4 : 85; + 0FF5 : 07; + 0FF6 : A5; + 0FF7 : 65; + 0FF8 : 45; + 0FF9 : 0B; + 0FFA : 85; + 0FFB : 08; + 0FFC : 20; + 0FFD : FC; + 0FFE : BB; + 0FFF : 20; + 1000 : BF; + 1001 : B1; + 1002 : A5; + 1003 : 65; + 1004 : 45; + 1005 : 0B; + 1006 : 25; + 1007 : 08; + 1008 : 45; + 1009 : 0B; + 100A : A8; + 100B : A5; + 100C : 64; + 100D : 45; + 100E : 0B; + 100F : 25; + 1010 : 07; + 1011 : 45; + 1012 : 0B; + 1013 : 4C; + 1014 : 91; + 1015 : B3; + 1016 : 20; + 1017 : 90; + 1018 : AD; + 1019 : B0; + 101A : 13; + 101B : A5; + 101C : 6E; + 101D : 09; + 101E : 7F; + 101F : 25; + 1020 : 6A; + 1021 : 85; + 1022 : 6A; + 1023 : A9; + 1024 : 69; + 1025 : A0; + 1026 : 00; + 1027 : 20; + 1028 : 5B; + 1029 : BC; + 102A : AA; + 102B : 4C; + 102C : 61; + 102D : B0; + 102E : A9; + 102F : 00; + 1030 : 85; + 1031 : 0D; + 1032 : C6; + 1033 : 4D; + 1034 : 20; + 1035 : A6; + 1036 : B6; + 1037 : 85; + 1038 : 61; + 1039 : 86; + 103A : 62; + 103B : 84; + 103C : 63; + 103D : A5; + 103E : 6C; + 103F : A4; + 1040 : 6D; + 1041 : 20; + 1042 : AA; + 1043 : B6; + 1044 : 86; + 1045 : 6C; + 1046 : 84; + 1047 : 6D; + 1048 : AA; + 1049 : 38; + 104A : E5; + 104B : 61; + 104C : F0; + 104D : 08; + 104E : A9; + 104F : 01; + 1050 : 90; + 1051 : 04; + 1052 : A6; + 1053 : 61; + 1054 : A9; + 1055 : FF; + 1056 : 85; + 1057 : 66; + 1058 : A0; + 1059 : FF; + 105A : E8; + 105B : C8; + 105C : CA; + 105D : D0; + 105E : 07; + 105F : A6; + 1060 : 66; + 1061 : 30; + 1062 : 0F; + 1063 : 18; + 1064 : 90; + 1065 : 0C; + 1066 : B1; + 1067 : 6C; + 1068 : D1; + 1069 : 62; + 106A : F0; + 106B : EF; + 106C : A2; + 106D : FF; + 106E : B0; + 106F : 02; + 1070 : A2; + 1071 : 01; + 1072 : E8; + 1073 : 8A; + 1074 : 2A; + 1075 : 25; + 1076 : 12; + 1077 : F0; + 1078 : 02; + 1079 : A9; + 107A : FF; + 107B : 4C; + 107C : 3C; + 107D : BC; + 107E : 20; + 107F : FD; + 1080 : AE; + 1081 : AA; + 1082 : 20; + 1083 : 90; + 1084 : B0; + 1085 : 20; + 1086 : 79; + 1087 : 00; + 1088 : D0; + 1089 : F4; + 108A : 60; + 108B : A2; + 108C : 00; + 108D : 20; + 108E : 79; + 108F : 00; + 1090 : 86; + 1091 : 0C; + 1092 : 85; + 1093 : 45; + 1094 : 20; + 1095 : 79; + 1096 : 00; + 1097 : 20; + 1098 : 13; + 1099 : B1; + 109A : B0; + 109B : 03; + 109C : 4C; + 109D : 08; + 109E : AF; + 109F : A2; + 10A0 : 00; + 10A1 : 86; + 10A2 : 0D; + 10A3 : 86; + 10A4 : 0E; + 10A5 : 20; + 10A6 : 73; + 10A7 : 00; + 10A8 : 90; + 10A9 : 05; + 10AA : 20; + 10AB : 13; + 10AC : B1; + 10AD : 90; + 10AE : 0B; + 10AF : AA; + 10B0 : 20; + 10B1 : 73; + 10B2 : 00; + 10B3 : 90; + 10B4 : FB; + 10B5 : 20; + 10B6 : 13; + 10B7 : B1; + 10B8 : B0; + 10B9 : F6; + 10BA : C9; + 10BB : 24; + 10BC : D0; + 10BD : 06; + 10BE : A9; + 10BF : FF; + 10C0 : 85; + 10C1 : 0D; + 10C2 : D0; + 10C3 : 10; + 10C4 : C9; + 10C5 : 25; + 10C6 : D0; + 10C7 : 13; + 10C8 : A5; + 10C9 : 10; + [10CA..10CB] : D0; + 10CC : A9; + 10CD : 80; + 10CE : 85; + 10CF : 0E; + 10D0 : 05; + 10D1 : 45; + 10D2 : 85; + 10D3 : 45; + 10D4 : 8A; + 10D5 : 09; + 10D6 : 80; + 10D7 : AA; + 10D8 : 20; + 10D9 : 73; + 10DA : 00; + 10DB : 86; + 10DC : 46; + 10DD : 38; + 10DE : 05; + 10DF : 10; + 10E0 : E9; + 10E1 : 28; + 10E2 : D0; + 10E3 : 03; + 10E4 : 4C; + 10E5 : D1; + 10E6 : B1; + 10E7 : A0; + 10E8 : 00; + 10E9 : 84; + 10EA : 10; + 10EB : A5; + 10EC : 2D; + 10ED : A6; + 10EE : 2E; + 10EF : 86; + 10F0 : 60; + 10F1 : 85; + 10F2 : 5F; + 10F3 : E4; + 10F4 : 30; + 10F5 : D0; + 10F6 : 04; + 10F7 : C5; + 10F8 : 2F; + 10F9 : F0; + 10FA : 22; + 10FB : A5; + 10FC : 45; + 10FD : D1; + 10FE : 5F; + 10FF : D0; + 1100 : 08; + 1101 : A5; + 1102 : 46; + 1103 : C8; + 1104 : D1; + 1105 : 5F; + 1106 : F0; + 1107 : 7D; + 1108 : 88; + 1109 : 18; + 110A : A5; + 110B : 5F; + 110C : 69; + 110D : 07; + 110E : 90; + 110F : E1; + 1110 : E8; + 1111 : D0; + 1112 : DC; + 1113 : C9; + 1114 : 41; + 1115 : 90; + 1116 : 05; + 1117 : E9; + 1118 : 5B; + 1119 : 38; + 111A : E9; + 111B : A5; + 111C : 60; + 111D : 68; + 111E : 48; + 111F : C9; + 1120 : 2A; + 1121 : D0; + 1122 : 05; + 1123 : A9; + 1124 : 13; + 1125 : A0; + 1126 : BF; + 1127 : 60; + 1128 : A5; + 1129 : 45; + 112A : A4; + 112B : 46; + 112C : C9; + 112D : 54; + 112E : D0; + 112F : 0B; + 1130 : C0; + 1131 : C9; + 1132 : F0; + 1133 : EF; + 1134 : C0; + 1135 : 49; + 1136 : D0; + 1137 : 03; + 1138 : 4C; + 1139 : 08; + 113A : AF; + 113B : C9; + 113C : 53; + 113D : D0; + 113E : 04; + 113F : C0; + 1140 : 54; + 1141 : F0; + 1142 : F5; + 1143 : A5; + 1144 : 2F; + 1145 : A4; + 1146 : 30; + 1147 : 85; + 1148 : 5F; + 1149 : 84; + 114A : 60; + 114B : A5; + 114C : 31; + 114D : A4; + 114E : 32; + 114F : 85; + 1150 : 5A; + 1151 : 84; + 1152 : 5B; + 1153 : 18; + 1154 : 69; + 1155 : 07; + 1156 : 90; + 1157 : 01; + 1158 : C8; + 1159 : 85; + 115A : 58; + 115B : 84; + 115C : 59; + 115D : 20; + 115E : B8; + 115F : A3; + 1160 : A5; + 1161 : 58; + 1162 : A4; + 1163 : 59; + 1164 : C8; + 1165 : 85; + 1166 : 2F; + 1167 : 84; + 1168 : 30; + 1169 : A0; + 116A : 00; + 116B : A5; + 116C : 45; + 116D : 91; + 116E : 5F; + 116F : C8; + 1170 : A5; + 1171 : 46; + 1172 : 91; + 1173 : 5F; + 1174 : A9; + 1175 : 00; + 1176 : C8; + 1177 : 91; + 1178 : 5F; + 1179 : C8; + 117A : 91; + 117B : 5F; + 117C : C8; + 117D : 91; + 117E : 5F; + 117F : C8; + 1180 : 91; + 1181 : 5F; + 1182 : C8; + 1183 : 91; + 1184 : 5F; + 1185 : A5; + 1186 : 5F; + 1187 : 18; + 1188 : 69; + 1189 : 02; + 118A : A4; + 118B : 60; + 118C : 90; + 118D : 01; + 118E : C8; + 118F : 85; + 1190 : 47; + 1191 : 84; + 1192 : 48; + 1193 : 60; + 1194 : A5; + 1195 : 0B; + 1196 : 0A; + 1197 : 69; + 1198 : 05; + 1199 : 65; + 119A : 5F; + 119B : A4; + 119C : 60; + 119D : 90; + 119E : 01; + 119F : C8; + 11A0 : 85; + 11A1 : 58; + 11A2 : 84; + 11A3 : 59; + 11A4 : 60; + 11A5 : 90; + 11A6 : 80; + [11A7..11A9] : 00; + 11AA : 20; + 11AB : BF; + 11AC : B1; + 11AD : A5; + 11AE : 64; + 11AF : A4; + 11B0 : 65; + 11B1 : 60; + 11B2 : 20; + 11B3 : 73; + 11B4 : 00; + 11B5 : 20; + 11B6 : 9E; + 11B7 : AD; + 11B8 : 20; + 11B9 : 8D; + 11BA : AD; + 11BB : A5; + 11BC : 66; + 11BD : 30; + 11BE : 0D; + 11BF : A5; + 11C0 : 61; + 11C1 : C9; + [11C2..11C3] : 90; + 11C4 : 09; + 11C5 : A9; + 11C6 : A5; + 11C7 : A0; + 11C8 : B1; + 11C9 : 20; + 11CA : 5B; + 11CB : BC; + 11CC : D0; + 11CD : 7A; + 11CE : 4C; + 11CF : 9B; + 11D0 : BC; + 11D1 : A5; + 11D2 : 0C; + 11D3 : 05; + 11D4 : 0E; + 11D5 : 48; + 11D6 : A5; + 11D7 : 0D; + 11D8 : 48; + 11D9 : A0; + 11DA : 00; + 11DB : 98; + 11DC : 48; + 11DD : A5; + 11DE : 46; + 11DF : 48; + 11E0 : A5; + 11E1 : 45; + 11E2 : 48; + 11E3 : 20; + 11E4 : B2; + 11E5 : B1; + 11E6 : 68; + 11E7 : 85; + 11E8 : 45; + 11E9 : 68; + 11EA : 85; + 11EB : 46; + 11EC : 68; + 11ED : A8; + 11EE : BA; + 11EF : BD; + 11F0 : 02; + 11F1 : 01; + 11F2 : 48; + 11F3 : BD; + [11F4..11F5] : 01; + 11F6 : 48; + 11F7 : A5; + 11F8 : 64; + 11F9 : 9D; + 11FA : 02; + 11FB : 01; + 11FC : A5; + 11FD : 65; + 11FE : 9D; + [11FF..1200] : 01; + 1201 : C8; + 1202 : 20; + 1203 : 79; + 1204 : 00; + 1205 : C9; + 1206 : 2C; + 1207 : F0; + 1208 : D2; + 1209 : 84; + 120A : 0B; + 120B : 20; + 120C : F7; + 120D : AE; + 120E : 68; + 120F : 85; + 1210 : 0D; + 1211 : 68; + 1212 : 85; + 1213 : 0E; + 1214 : 29; + 1215 : 7F; + 1216 : 85; + 1217 : 0C; + 1218 : A6; + 1219 : 2F; + 121A : A5; + 121B : 30; + 121C : 86; + 121D : 5F; + 121E : 85; + 121F : 60; + 1220 : C5; + 1221 : 32; + 1222 : D0; + 1223 : 04; + 1224 : E4; + 1225 : 31; + 1226 : F0; + 1227 : 39; + 1228 : A0; + 1229 : 00; + 122A : B1; + 122B : 5F; + 122C : C8; + 122D : C5; + 122E : 45; + 122F : D0; + 1230 : 06; + 1231 : A5; + 1232 : 46; + 1233 : D1; + 1234 : 5F; + 1235 : F0; + 1236 : 16; + 1237 : C8; + 1238 : B1; + 1239 : 5F; + 123A : 18; + 123B : 65; + 123C : 5F; + 123D : AA; + 123E : C8; + 123F : B1; + 1240 : 5F; + 1241 : 65; + 1242 : 60; + 1243 : 90; + 1244 : D7; + 1245 : A2; + 1246 : 12; + 1247 : 2C; + 1248 : A2; + 1249 : 0E; + 124A : 4C; + 124B : 37; + 124C : A4; + 124D : A2; + 124E : 13; + 124F : A5; + 1250 : 0C; + 1251 : D0; + 1252 : F7; + 1253 : 20; + 1254 : 94; + 1255 : B1; + 1256 : A5; + 1257 : 0B; + 1258 : A0; + 1259 : 04; + 125A : D1; + 125B : 5F; + 125C : D0; + 125D : E7; + 125E : 4C; + 125F : EA; + 1260 : B2; + 1261 : 20; + 1262 : 94; + 1263 : B1; + 1264 : 20; + 1265 : 08; + 1266 : A4; + 1267 : A0; + 1268 : 00; + 1269 : 84; + 126A : 72; + 126B : A2; + 126C : 05; + 126D : A5; + 126E : 45; + 126F : 91; + 1270 : 5F; + 1271 : 10; + 1272 : 01; + 1273 : CA; + 1274 : C8; + 1275 : A5; + 1276 : 46; + 1277 : 91; + 1278 : 5F; + 1279 : 10; + 127A : 02; + [127B..127C] : CA; + 127D : 86; + 127E : 71; + 127F : A5; + 1280 : 0B; + [1281..1283] : C8; + 1284 : 91; + 1285 : 5F; + 1286 : A2; + 1287 : 0B; + 1288 : A9; + 1289 : 00; + 128A : 24; + 128B : 0C; + 128C : 50; + 128D : 08; + 128E : 68; + 128F : 18; + 1290 : 69; + 1291 : 01; + 1292 : AA; + 1293 : 68; + 1294 : 69; + 1295 : 00; + 1296 : C8; + 1297 : 91; + 1298 : 5F; + 1299 : C8; + 129A : 8A; + 129B : 91; + 129C : 5F; + 129D : 20; + 129E : 4C; + 129F : B3; + 12A0 : 86; + 12A1 : 71; + 12A2 : 85; + 12A3 : 72; + 12A4 : A4; + 12A5 : 22; + 12A6 : C6; + 12A7 : 0B; + 12A8 : D0; + 12A9 : DC; + 12AA : 65; + 12AB : 59; + 12AC : B0; + 12AD : 5D; + 12AE : 85; + 12AF : 59; + 12B0 : A8; + 12B1 : 8A; + 12B2 : 65; + 12B3 : 58; + 12B4 : 90; + 12B5 : 03; + 12B6 : C8; + 12B7 : F0; + 12B8 : 52; + 12B9 : 20; + 12BA : 08; + 12BB : A4; + 12BC : 85; + 12BD : 31; + 12BE : 84; + 12BF : 32; + 12C0 : A9; + 12C1 : 00; + 12C2 : E6; + 12C3 : 72; + 12C4 : A4; + 12C5 : 71; + 12C6 : F0; + 12C7 : 05; + 12C8 : 88; + 12C9 : 91; + 12CA : 58; + 12CB : D0; + 12CC : FB; + 12CD : C6; + 12CE : 59; + 12CF : C6; + 12D0 : 72; + 12D1 : D0; + 12D2 : F5; + 12D3 : E6; + 12D4 : 59; + 12D5 : 38; + 12D6 : A5; + 12D7 : 31; + 12D8 : E5; + 12D9 : 5F; + 12DA : A0; + 12DB : 02; + 12DC : 91; + 12DD : 5F; + 12DE : A5; + 12DF : 32; + 12E0 : C8; + 12E1 : E5; + 12E2 : 60; + 12E3 : 91; + 12E4 : 5F; + 12E5 : A5; + 12E6 : 0C; + 12E7 : D0; + 12E8 : 62; + 12E9 : C8; + 12EA : B1; + 12EB : 5F; + 12EC : 85; + 12ED : 0B; + 12EE : A9; + 12EF : 00; + 12F0 : 85; + 12F1 : 71; + 12F2 : 85; + 12F3 : 72; + 12F4 : C8; + 12F5 : 68; + 12F6 : AA; + 12F7 : 85; + 12F8 : 64; + 12F9 : 68; + 12FA : 85; + 12FB : 65; + 12FC : D1; + 12FD : 5F; + 12FE : 90; + 12FF : 0E; + 1300 : D0; + 1301 : 06; + 1302 : C8; + 1303 : 8A; + 1304 : D1; + 1305 : 5F; + 1306 : 90; + 1307 : 07; + 1308 : 4C; + 1309 : 45; + 130A : B2; + 130B : 4C; + 130C : 35; + 130D : A4; + 130E : C8; + 130F : A5; + 1310 : 72; + 1311 : 05; + 1312 : 71; + 1313 : 18; + 1314 : F0; + 1315 : 0A; + 1316 : 20; + 1317 : 4C; + 1318 : B3; + 1319 : 8A; + 131A : 65; + 131B : 64; + 131C : AA; + 131D : 98; + 131E : A4; + 131F : 22; + [1320..1321] : 65; + 1322 : 86; + 1323 : 71; + 1324 : C6; + 1325 : 0B; + 1326 : D0; + 1327 : CA; + 1328 : 85; + 1329 : 72; + 132A : A2; + 132B : 05; + 132C : A5; + 132D : 45; + 132E : 10; + 132F : 01; + 1330 : CA; + 1331 : A5; + 1332 : 46; + 1333 : 10; + 1334 : 02; + [1335..1336] : CA; + 1337 : 86; + 1338 : 28; + 1339 : A9; + 133A : 00; + 133B : 20; + 133C : 55; + 133D : B3; + 133E : 8A; + 133F : 65; + 1340 : 58; + 1341 : 85; + 1342 : 47; + 1343 : 98; + 1344 : 65; + 1345 : 59; + 1346 : 85; + 1347 : 48; + 1348 : A8; + 1349 : A5; + 134A : 47; + 134B : 60; + 134C : 84; + 134D : 22; + 134E : B1; + 134F : 5F; + 1350 : 85; + 1351 : 28; + 1352 : 88; + 1353 : B1; + 1354 : 5F; + 1355 : 85; + 1356 : 29; + 1357 : A9; + 1358 : 10; + 1359 : 85; + 135A : 5D; + 135B : A2; + 135C : 00; + 135D : A0; + 135E : 00; + 135F : 8A; + 1360 : 0A; + 1361 : AA; + 1362 : 98; + 1363 : 2A; + 1364 : A8; + 1365 : B0; + 1366 : A4; + 1367 : 06; + 1368 : 71; + 1369 : 26; + 136A : 72; + 136B : 90; + 136C : 0B; + 136D : 18; + 136E : 8A; + 136F : 65; + 1370 : 28; + 1371 : AA; + 1372 : 98; + 1373 : 65; + 1374 : 29; + 1375 : A8; + 1376 : B0; + 1377 : 93; + 1378 : C6; + 1379 : 5D; + 137A : D0; + 137B : E3; + 137C : 60; + 137D : A5; + 137E : 0D; + 137F : F0; + 1380 : 03; + 1381 : 20; + 1382 : A6; + 1383 : B6; + 1384 : 20; + 1385 : 26; + 1386 : B5; + 1387 : 38; + 1388 : A5; + 1389 : 33; + 138A : E5; + 138B : 31; + 138C : A8; + 138D : A5; + 138E : 34; + 138F : E5; + 1390 : 32; + 1391 : A2; + 1392 : 00; + 1393 : 86; + 1394 : 0D; + 1395 : 85; + 1396 : 62; + 1397 : 84; + 1398 : 63; + 1399 : A2; + 139A : 90; + 139B : 4C; + 139C : 44; + 139D : BC; + 139E : 38; + 139F : 20; + 13A0 : F0; + 13A1 : FF; + 13A2 : A9; + 13A3 : 00; + 13A4 : F0; + 13A5 : EB; + 13A6 : A6; + 13A7 : 3A; + 13A8 : E8; + 13A9 : D0; + 13AA : A0; + 13AB : A2; + 13AC : 15; + 13AD : 2C; + 13AE : A2; + 13AF : 1B; + 13B0 : 4C; + 13B1 : 37; + 13B2 : A4; + 13B3 : 20; + 13B4 : E1; + 13B5 : B3; + 13B6 : 20; + 13B7 : A6; + 13B8 : B3; + 13B9 : 20; + 13BA : FA; + 13BB : AE; + 13BC : A9; + 13BD : 80; + 13BE : 85; + 13BF : 10; + 13C0 : 20; + 13C1 : 8B; + 13C2 : B0; + 13C3 : 20; + 13C4 : 8D; + 13C5 : AD; + 13C6 : 20; + 13C7 : F7; + 13C8 : AE; + 13C9 : A9; + 13CA : B2; + 13CB : 20; + 13CC : FF; + 13CD : AE; + 13CE : 48; + 13CF : A5; + [13D0..13D1] : 48; + 13D2 : A5; + 13D3 : 47; + 13D4 : 48; + 13D5 : A5; + 13D6 : 7B; + 13D7 : 48; + 13D8 : A5; + 13D9 : 7A; + 13DA : 48; + 13DB : 20; + 13DC : F8; + 13DD : A8; + 13DE : 4C; + 13DF : 4F; + 13E0 : B4; + 13E1 : A9; + 13E2 : A5; + 13E3 : 20; + 13E4 : FF; + 13E5 : AE; + 13E6 : 09; + 13E7 : 80; + 13E8 : 85; + 13E9 : 10; + 13EA : 20; + 13EB : 92; + 13EC : B0; + 13ED : 85; + 13EE : 4E; + 13EF : 84; + 13F0 : 4F; + 13F1 : 4C; + 13F2 : 8D; + 13F3 : AD; + 13F4 : 20; + 13F5 : E1; + 13F6 : B3; + 13F7 : A5; + 13F8 : 4F; + 13F9 : 48; + 13FA : A5; + 13FB : 4E; + 13FC : 48; + 13FD : 20; + 13FE : F1; + 13FF : AE; + 1400 : 20; + 1401 : 8D; + 1402 : AD; + 1403 : 68; + 1404 : 85; + 1405 : 4E; + 1406 : 68; + 1407 : 85; + 1408 : 4F; + 1409 : A0; + 140A : 02; + 140B : B1; + 140C : 4E; + 140D : 85; + 140E : 47; + 140F : AA; + 1410 : C8; + 1411 : B1; + 1412 : 4E; + 1413 : F0; + 1414 : 99; + 1415 : 85; + 1416 : 48; + 1417 : C8; + 1418 : B1; + 1419 : 47; + 141A : 48; + 141B : 88; + 141C : 10; + 141D : FA; + 141E : A4; + 141F : 48; + 1420 : 20; + 1421 : D4; + 1422 : BB; + 1423 : A5; + 1424 : 7B; + 1425 : 48; + 1426 : A5; + 1427 : 7A; + 1428 : 48; + 1429 : B1; + 142A : 4E; + 142B : 85; + 142C : 7A; + 142D : C8; + 142E : B1; + 142F : 4E; + 1430 : 85; + 1431 : 7B; + 1432 : A5; + [1433..1434] : 48; + 1435 : A5; + 1436 : 47; + 1437 : 48; + 1438 : 20; + 1439 : 8A; + 143A : AD; + 143B : 68; + 143C : 85; + 143D : 4E; + 143E : 68; + 143F : 85; + 1440 : 4F; + 1441 : 20; + 1442 : 79; + 1443 : 00; + 1444 : F0; + 1445 : 03; + 1446 : 4C; + 1447 : 08; + 1448 : AF; + 1449 : 68; + 144A : 85; + 144B : 7A; + 144C : 68; + 144D : 85; + 144E : 7B; + 144F : A0; + 1450 : 00; + 1451 : 68; + 1452 : 91; + 1453 : 4E; + 1454 : 68; + 1455 : C8; + 1456 : 91; + 1457 : 4E; + 1458 : 68; + 1459 : C8; + 145A : 91; + 145B : 4E; + 145C : 68; + 145D : C8; + 145E : 91; + 145F : 4E; + 1460 : 68; + 1461 : C8; + 1462 : 91; + 1463 : 4E; + 1464 : 60; + 1465 : 20; + 1466 : 8D; + 1467 : AD; + 1468 : A0; + 1469 : 00; + 146A : 20; + 146B : DF; + 146C : BD; + [146D..146E] : 68; + 146F : A9; + 1470 : FF; + 1471 : A0; + 1472 : 00; + 1473 : F0; + 1474 : 12; + 1475 : A6; + 1476 : 64; + 1477 : A4; + 1478 : 65; + 1479 : 86; + 147A : 50; + 147B : 84; + 147C : 51; + 147D : 20; + 147E : F4; + 147F : B4; + 1480 : 86; + 1481 : 62; + 1482 : 84; + 1483 : 63; + 1484 : 85; + 1485 : 61; + 1486 : 60; + 1487 : A2; + 1488 : 22; + 1489 : 86; + 148A : 07; + 148B : 86; + 148C : 08; + 148D : 85; + 148E : 6F; + 148F : 84; + 1490 : 70; + 1491 : 85; + 1492 : 62; + 1493 : 84; + 1494 : 63; + 1495 : A0; + 1496 : FF; + 1497 : C8; + 1498 : B1; + 1499 : 6F; + 149A : F0; + 149B : 0C; + 149C : C5; + 149D : 07; + 149E : F0; + 149F : 04; + 14A0 : C5; + 14A1 : 08; + 14A2 : D0; + 14A3 : F3; + 14A4 : C9; + 14A5 : 22; + 14A6 : F0; + 14A7 : 01; + 14A8 : 18; + 14A9 : 84; + 14AA : 61; + 14AB : 98; + 14AC : 65; + 14AD : 6F; + 14AE : 85; + 14AF : 71; + 14B0 : A6; + 14B1 : 70; + 14B2 : 90; + 14B3 : 01; + 14B4 : E8; + 14B5 : 86; + 14B6 : 72; + 14B7 : A5; + 14B8 : 70; + 14B9 : F0; + 14BA : 04; + 14BB : C9; + 14BC : 02; + 14BD : D0; + 14BE : 0B; + 14BF : 98; + 14C0 : 20; + 14C1 : 75; + 14C2 : B4; + 14C3 : A6; + 14C4 : 6F; + 14C5 : A4; + 14C6 : 70; + 14C7 : 20; + 14C8 : 88; + 14C9 : B6; + 14CA : A6; + 14CB : 16; + 14CC : E0; + 14CD : 22; + 14CE : D0; + 14CF : 05; + 14D0 : A2; + 14D1 : 19; + 14D2 : 4C; + 14D3 : 37; + 14D4 : A4; + 14D5 : A5; + 14D6 : 61; + 14D7 : 95; + 14D8 : 00; + 14D9 : A5; + 14DA : 62; + 14DB : 95; + 14DC : 01; + 14DD : A5; + 14DE : 63; + 14DF : 95; + 14E0 : 02; + 14E1 : A0; + 14E2 : 00; + 14E3 : 86; + 14E4 : 64; + 14E5 : 84; + 14E6 : 65; + 14E7 : 84; + 14E8 : 70; + 14E9 : 88; + 14EA : 84; + 14EB : 0D; + 14EC : 86; + 14ED : 17; + [14EE..14F0] : E8; + 14F1 : 86; + 14F2 : 16; + 14F3 : 60; + 14F4 : 46; + 14F5 : 0F; + 14F6 : 48; + 14F7 : 49; + 14F8 : FF; + 14F9 : 38; + 14FA : 65; + 14FB : 33; + 14FC : A4; + 14FD : 34; + 14FE : B0; + 14FF : 01; + 1500 : 88; + 1501 : C4; + 1502 : 32; + 1503 : 90; + 1504 : 11; + 1505 : D0; + 1506 : 04; + 1507 : C5; + 1508 : 31; + 1509 : 90; + 150A : 0B; + 150B : 85; + 150C : 33; + 150D : 84; + 150E : 34; + 150F : 85; + 1510 : 35; + 1511 : 84; + 1512 : 36; + 1513 : AA; + 1514 : 68; + 1515 : 60; + 1516 : A2; + 1517 : 10; + 1518 : A5; + 1519 : 0F; + 151A : 30; + 151B : B6; + 151C : 20; + 151D : 26; + 151E : B5; + 151F : A9; + 1520 : 80; + 1521 : 85; + 1522 : 0F; + 1523 : 68; + [1524..1525] : D0; + 1526 : A6; + 1527 : 37; + 1528 : A5; + 1529 : 38; + 152A : 86; + 152B : 33; + 152C : 85; + 152D : 34; + 152E : A0; + 152F : 00; + 1530 : 84; + 1531 : 4F; + 1532 : 84; + 1533 : 4E; + 1534 : A5; + 1535 : 31; + 1536 : A6; + 1537 : 32; + 1538 : 85; + 1539 : 5F; + 153A : 86; + 153B : 60; + 153C : A9; + 153D : 19; + 153E : A2; + 153F : 00; + 1540 : 85; + 1541 : 22; + 1542 : 86; + 1543 : 23; + 1544 : C5; + 1545 : 16; + 1546 : F0; + 1547 : 05; + 1548 : 20; + 1549 : C7; + 154A : B5; + 154B : F0; + 154C : F7; + 154D : A9; + 154E : 07; + 154F : 85; + 1550 : 53; + 1551 : A5; + 1552 : 2D; + 1553 : A6; + 1554 : 2E; + 1555 : 85; + 1556 : 22; + 1557 : 86; + 1558 : 23; + 1559 : E4; + 155A : 30; + 155B : D0; + 155C : 04; + 155D : C5; + 155E : 2F; + 155F : F0; + 1560 : 05; + 1561 : 20; + 1562 : BD; + 1563 : B5; + 1564 : F0; + 1565 : F3; + 1566 : 85; + 1567 : 58; + 1568 : 86; + 1569 : 59; + 156A : A9; + 156B : 03; + 156C : 85; + 156D : 53; + 156E : A5; + 156F : 58; + 1570 : A6; + 1571 : 59; + 1572 : E4; + 1573 : 32; + 1574 : D0; + 1575 : 07; + 1576 : C5; + 1577 : 31; + 1578 : D0; + 1579 : 03; + 157A : 4C; + 157B : 06; + 157C : B6; + 157D : 85; + 157E : 22; + 157F : 86; + 1580 : 23; + 1581 : A0; + 1582 : 00; + 1583 : B1; + 1584 : 22; + 1585 : AA; + 1586 : C8; + 1587 : B1; + 1588 : 22; + 1589 : 08; + 158A : C8; + 158B : B1; + 158C : 22; + 158D : 65; + 158E : 58; + 158F : 85; + 1590 : 58; + 1591 : C8; + 1592 : B1; + 1593 : 22; + 1594 : 65; + 1595 : 59; + 1596 : 85; + 1597 : 59; + 1598 : 28; + 1599 : 10; + 159A : D3; + 159B : 8A; + 159C : 30; + 159D : D0; + 159E : C8; + 159F : B1; + 15A0 : 22; + 15A1 : A0; + 15A2 : 00; + 15A3 : 0A; + 15A4 : 69; + 15A5 : 05; + 15A6 : 65; + 15A7 : 22; + 15A8 : 85; + 15A9 : 22; + 15AA : 90; + 15AB : 02; + 15AC : E6; + 15AD : 23; + 15AE : A6; + 15AF : 23; + 15B0 : E4; + 15B1 : 59; + 15B2 : D0; + 15B3 : 04; + 15B4 : C5; + 15B5 : 58; + 15B6 : F0; + 15B7 : BA; + 15B8 : 20; + 15B9 : C7; + 15BA : B5; + 15BB : F0; + 15BC : F3; + 15BD : B1; + 15BE : 22; + 15BF : 30; + 15C0 : 35; + 15C1 : C8; + 15C2 : B1; + 15C3 : 22; + 15C4 : 10; + 15C5 : 30; + 15C6 : C8; + 15C7 : B1; + 15C8 : 22; + 15C9 : F0; + 15CA : 2B; + 15CB : C8; + 15CC : B1; + 15CD : 22; + 15CE : AA; + 15CF : C8; + 15D0 : B1; + 15D1 : 22; + 15D2 : C5; + 15D3 : 34; + 15D4 : 90; + 15D5 : 06; + 15D6 : D0; + 15D7 : 1E; + 15D8 : E4; + 15D9 : 33; + 15DA : B0; + 15DB : 1A; + 15DC : C5; + 15DD : 60; + 15DE : 90; + 15DF : 16; + 15E0 : D0; + 15E1 : 04; + 15E2 : E4; + 15E3 : 5F; + 15E4 : 90; + 15E5 : 10; + 15E6 : 86; + 15E7 : 5F; + 15E8 : 85; + 15E9 : 60; + 15EA : A5; + 15EB : 22; + 15EC : A6; + 15ED : 23; + 15EE : 85; + 15EF : 4E; + 15F0 : 86; + 15F1 : 4F; + 15F2 : A5; + 15F3 : 53; + 15F4 : 85; + 15F5 : 55; + 15F6 : A5; + 15F7 : 53; + 15F8 : 18; + 15F9 : 65; + 15FA : 22; + 15FB : 85; + 15FC : 22; + 15FD : 90; + 15FE : 02; + 15FF : E6; + 1600 : 23; + 1601 : A6; + 1602 : 23; + 1603 : A0; + 1604 : 00; + 1605 : 60; + 1606 : A5; + 1607 : 4F; + 1608 : 05; + 1609 : 4E; + 160A : F0; + 160B : F5; + 160C : A5; + 160D : 55; + 160E : 29; + 160F : 04; + 1610 : 4A; + 1611 : A8; + 1612 : 85; + 1613 : 55; + 1614 : B1; + 1615 : 4E; + 1616 : 65; + 1617 : 5F; + 1618 : 85; + 1619 : 5A; + 161A : A5; + 161B : 60; + 161C : 69; + 161D : 00; + 161E : 85; + 161F : 5B; + 1620 : A5; + 1621 : 33; + 1622 : A6; + 1623 : 34; + 1624 : 85; + 1625 : 58; + 1626 : 86; + 1627 : 59; + 1628 : 20; + 1629 : BF; + 162A : A3; + 162B : A4; + 162C : 55; + 162D : C8; + 162E : A5; + 162F : 58; + 1630 : 91; + 1631 : 4E; + 1632 : AA; + 1633 : E6; + 1634 : 59; + 1635 : A5; + 1636 : 59; + 1637 : C8; + 1638 : 91; + 1639 : 4E; + 163A : 4C; + 163B : 2A; + 163C : B5; + 163D : A5; + 163E : 65; + 163F : 48; + 1640 : A5; + 1641 : 64; + 1642 : 48; + 1643 : 20; + 1644 : 83; + 1645 : AE; + 1646 : 20; + 1647 : 8F; + 1648 : AD; + 1649 : 68; + 164A : 85; + 164B : 6F; + 164C : 68; + 164D : 85; + 164E : 70; + 164F : A0; + 1650 : 00; + 1651 : B1; + 1652 : 6F; + 1653 : 18; + 1654 : 71; + 1655 : 64; + 1656 : 90; + 1657 : 05; + 1658 : A2; + 1659 : 17; + 165A : 4C; + 165B : 37; + 165C : A4; + 165D : 20; + 165E : 75; + 165F : B4; + 1660 : 20; + 1661 : 7A; + 1662 : B6; + 1663 : A5; + 1664 : 50; + 1665 : A4; + 1666 : 51; + 1667 : 20; + 1668 : AA; + 1669 : B6; + 166A : 20; + 166B : 8C; + 166C : B6; + 166D : A5; + 166E : 6F; + 166F : A4; + 1670 : 70; + 1671 : 20; + 1672 : AA; + 1673 : B6; + 1674 : 20; + 1675 : CA; + 1676 : B4; + 1677 : 4C; + 1678 : B8; + 1679 : AD; + 167A : A0; + 167B : 00; + 167C : B1; + 167D : 6F; + 167E : 48; + 167F : C8; + 1680 : B1; + 1681 : 6F; + 1682 : AA; + 1683 : C8; + 1684 : B1; + 1685 : 6F; + 1686 : A8; + 1687 : 68; + 1688 : 86; + 1689 : 22; + 168A : 84; + 168B : 23; + 168C : A8; + 168D : F0; + 168E : 0A; + 168F : 48; + 1690 : 88; + 1691 : B1; + 1692 : 22; + 1693 : 91; + 1694 : 35; + 1695 : 98; + 1696 : D0; + 1697 : F8; + 1698 : 68; + 1699 : 18; + 169A : 65; + 169B : 35; + 169C : 85; + 169D : 35; + 169E : 90; + 169F : 02; + 16A0 : E6; + 16A1 : 36; + 16A2 : 60; + 16A3 : 20; + 16A4 : 8F; + 16A5 : AD; + 16A6 : A5; + 16A7 : 64; + 16A8 : A4; + 16A9 : 65; + 16AA : 85; + 16AB : 22; + 16AC : 84; + 16AD : 23; + 16AE : 20; + 16AF : DB; + 16B0 : B6; + 16B1 : 08; + 16B2 : A0; + 16B3 : 00; + 16B4 : B1; + 16B5 : 22; + 16B6 : 48; + 16B7 : C8; + 16B8 : B1; + 16B9 : 22; + 16BA : AA; + 16BB : C8; + 16BC : B1; + 16BD : 22; + 16BE : A8; + 16BF : 68; + 16C0 : 28; + 16C1 : D0; + 16C2 : 13; + 16C3 : C4; + 16C4 : 34; + 16C5 : D0; + 16C6 : 0F; + 16C7 : E4; + 16C8 : 33; + 16C9 : D0; + 16CA : 0B; + 16CB : 48; + 16CC : 18; + 16CD : 65; + 16CE : 33; + 16CF : 85; + 16D0 : 33; + 16D1 : 90; + 16D2 : 02; + 16D3 : E6; + 16D4 : 34; + 16D5 : 68; + 16D6 : 86; + 16D7 : 22; + 16D8 : 84; + 16D9 : 23; + 16DA : 60; + 16DB : C4; + 16DC : 18; + 16DD : D0; + 16DE : 0C; + 16DF : C5; + 16E0 : 17; + 16E1 : D0; + 16E2 : 08; + 16E3 : 85; + 16E4 : 16; + 16E5 : E9; + 16E6 : 03; + 16E7 : 85; + 16E8 : 17; + 16E9 : A0; + 16EA : 00; + 16EB : 60; + 16EC : 20; + 16ED : A1; + 16EE : B7; + 16EF : 8A; + 16F0 : 48; + 16F1 : A9; + 16F2 : 01; + 16F3 : 20; + 16F4 : 7D; + 16F5 : B4; + 16F6 : 68; + 16F7 : A0; + 16F8 : 00; + 16F9 : 91; + 16FA : 62; + [16FB..16FC] : 68; + 16FD : 4C; + 16FE : CA; + 16FF : B4; + 1700 : 20; + 1701 : 61; + 1702 : B7; + 1703 : D1; + 1704 : 50; + 1705 : 98; + 1706 : 90; + 1707 : 04; + 1708 : B1; + 1709 : 50; + 170A : AA; + 170B : 98; + 170C : 48; + 170D : 8A; + 170E : 48; + 170F : 20; + 1710 : 7D; + 1711 : B4; + 1712 : A5; + 1713 : 50; + 1714 : A4; + 1715 : 51; + 1716 : 20; + 1717 : AA; + 1718 : B6; + 1719 : 68; + 171A : A8; + 171B : 68; + 171C : 18; + 171D : 65; + 171E : 22; + 171F : 85; + 1720 : 22; + 1721 : 90; + 1722 : 02; + 1723 : E6; + 1724 : 23; + 1725 : 98; + 1726 : 20; + 1727 : 8C; + 1728 : B6; + 1729 : 4C; + 172A : CA; + 172B : B4; + 172C : 20; + 172D : 61; + 172E : B7; + 172F : 18; + 1730 : F1; + 1731 : 50; + 1732 : 49; + 1733 : FF; + 1734 : 4C; + 1735 : 06; + 1736 : B7; + 1737 : A9; + 1738 : FF; + 1739 : 85; + 173A : 65; + 173B : 20; + 173C : 79; + 173D : 00; + 173E : C9; + 173F : 29; + 1740 : F0; + 1741 : 06; + 1742 : 20; + 1743 : FD; + 1744 : AE; + 1745 : 20; + 1746 : 9E; + 1747 : B7; + 1748 : 20; + 1749 : 61; + 174A : B7; + 174B : F0; + 174C : 4B; + 174D : CA; + 174E : 8A; + 174F : 48; + 1750 : 18; + 1751 : A2; + 1752 : 00; + 1753 : F1; + 1754 : 50; + 1755 : B0; + 1756 : B6; + 1757 : 49; + 1758 : FF; + 1759 : C5; + 175A : 65; + 175B : 90; + 175C : B1; + 175D : A5; + 175E : 65; + 175F : B0; + 1760 : AD; + 1761 : 20; + 1762 : F7; + 1763 : AE; + 1764 : 68; + 1765 : A8; + 1766 : 68; + 1767 : 85; + 1768 : 55; + [1769..176B] : 68; + 176C : AA; + 176D : 68; + 176E : 85; + 176F : 50; + 1770 : 68; + 1771 : 85; + 1772 : 51; + 1773 : A5; + 1774 : 55; + 1775 : 48; + 1776 : 98; + 1777 : 48; + 1778 : A0; + 1779 : 00; + 177A : 8A; + 177B : 60; + 177C : 20; + 177D : 82; + 177E : B7; + 177F : 4C; + 1780 : A2; + 1781 : B3; + 1782 : 20; + 1783 : A3; + 1784 : B6; + 1785 : A2; + 1786 : 00; + 1787 : 86; + 1788 : 0D; + 1789 : A8; + 178A : 60; + 178B : 20; + 178C : 82; + 178D : B7; + 178E : F0; + 178F : 08; + 1790 : A0; + 1791 : 00; + 1792 : B1; + 1793 : 22; + 1794 : A8; + 1795 : 4C; + 1796 : A2; + 1797 : B3; + 1798 : 4C; + 1799 : 48; + 179A : B2; + 179B : 20; + 179C : 73; + 179D : 00; + 179E : 20; + 179F : 8A; + 17A0 : AD; + 17A1 : 20; + 17A2 : B8; + 17A3 : B1; + 17A4 : A6; + 17A5 : 64; + 17A6 : D0; + 17A7 : F0; + 17A8 : A6; + 17A9 : 65; + 17AA : 4C; + 17AB : 79; + 17AC : 00; + 17AD : 20; + 17AE : 82; + 17AF : B7; + 17B0 : D0; + 17B1 : 03; + 17B2 : 4C; + 17B3 : F7; + 17B4 : B8; + 17B5 : A6; + 17B6 : 7A; + 17B7 : A4; + 17B8 : 7B; + 17B9 : 86; + 17BA : 71; + 17BB : 84; + 17BC : 72; + 17BD : A6; + 17BE : 22; + 17BF : 86; + 17C0 : 7A; + 17C1 : 18; + 17C2 : 65; + 17C3 : 22; + 17C4 : 85; + 17C5 : 24; + 17C6 : A6; + 17C7 : 23; + 17C8 : 86; + 17C9 : 7B; + 17CA : 90; + 17CB : 01; + 17CC : E8; + 17CD : 86; + 17CE : 25; + 17CF : A0; + 17D0 : 00; + 17D1 : B1; + 17D2 : 24; + 17D3 : 48; + 17D4 : 98; + 17D5 : 91; + 17D6 : 24; + 17D7 : 20; + 17D8 : 79; + 17D9 : 00; + 17DA : 20; + 17DB : F3; + 17DC : BC; + 17DD : 68; + 17DE : A0; + 17DF : 00; + 17E0 : 91; + 17E1 : 24; + 17E2 : A6; + 17E3 : 71; + 17E4 : A4; + 17E5 : 72; + 17E6 : 86; + 17E7 : 7A; + 17E8 : 84; + 17E9 : 7B; + 17EA : 60; + 17EB : 20; + 17EC : 8A; + 17ED : AD; + 17EE : 20; + 17EF : F7; + 17F0 : B7; + 17F1 : 20; + 17F2 : FD; + 17F3 : AE; + 17F4 : 4C; + 17F5 : 9E; + 17F6 : B7; + 17F7 : A5; + 17F8 : 66; + 17F9 : 30; + 17FA : 9D; + 17FB : A5; + 17FC : 61; + 17FD : C9; + 17FE : 91; + 17FF : B0; + 1800 : 97; + 1801 : 20; + 1802 : 9B; + 1803 : BC; + 1804 : A5; + 1805 : 64; + 1806 : A4; + 1807 : 65; + 1808 : 84; + 1809 : 14; + 180A : 85; + 180B : 15; + 180C : 60; + 180D : A5; + 180E : 15; + 180F : 48; + 1810 : A5; + 1811 : 14; + 1812 : 48; + 1813 : 20; + 1814 : F7; + 1815 : B7; + 1816 : A0; + 1817 : 00; + 1818 : B1; + 1819 : 14; + 181A : A8; + 181B : 68; + 181C : 85; + 181D : 14; + 181E : 68; + 181F : 85; + 1820 : 15; + 1821 : 4C; + 1822 : A2; + 1823 : B3; + 1824 : 20; + 1825 : EB; + 1826 : B7; + 1827 : 8A; + 1828 : A0; + 1829 : 00; + 182A : 91; + 182B : 14; + 182C : 60; + 182D : 20; + 182E : EB; + 182F : B7; + 1830 : 86; + 1831 : 49; + 1832 : A2; + 1833 : 00; + 1834 : 20; + 1835 : 79; + 1836 : 00; + 1837 : F0; + 1838 : 03; + 1839 : 20; + 183A : F1; + 183B : B7; + 183C : 86; + 183D : 4A; + 183E : A0; + 183F : 00; + 1840 : B1; + 1841 : 14; + 1842 : 45; + 1843 : 4A; + 1844 : 25; + 1845 : 49; + 1846 : F0; + 1847 : F8; + 1848 : 60; + 1849 : A9; + 184A : 11; + 184B : A0; + 184C : BF; + 184D : 4C; + 184E : 67; + 184F : B8; + 1850 : 20; + 1851 : 8C; + 1852 : BA; + 1853 : A5; + 1854 : 66; + 1855 : 49; + 1856 : FF; + 1857 : 85; + 1858 : 66; + 1859 : 45; + 185A : 6E; + 185B : 85; + 185C : 6F; + 185D : A5; + 185E : 61; + 185F : 4C; + 1860 : 6A; + 1861 : B8; + 1862 : 20; + 1863 : 99; + 1864 : B9; + 1865 : 90; + 1866 : 3C; + 1867 : 20; + 1868 : 8C; + 1869 : BA; + 186A : D0; + 186B : 03; + 186C : 4C; + 186D : FC; + 186E : BB; + 186F : A6; + 1870 : 70; + 1871 : 86; + 1872 : 56; + 1873 : A2; + 1874 : 69; + 1875 : A5; + 1876 : 69; + 1877 : A8; + 1878 : F0; + 1879 : CE; + 187A : 38; + 187B : E5; + 187C : 61; + 187D : F0; + 187E : 24; + 187F : 90; + 1880 : 12; + 1881 : 84; + 1882 : 61; + 1883 : A4; + 1884 : 6E; + 1885 : 84; + 1886 : 66; + 1887 : 49; + 1888 : FF; + 1889 : 69; + 188A : 00; + 188B : A0; + 188C : 00; + 188D : 84; + 188E : 56; + 188F : A2; + 1890 : 61; + 1891 : D0; + 1892 : 04; + 1893 : A0; + 1894 : 00; + 1895 : 84; + 1896 : 70; + 1897 : C9; + 1898 : F9; + 1899 : 30; + 189A : C7; + 189B : A8; + 189C : A5; + 189D : 70; + 189E : 56; + 189F : 01; + 18A0 : 20; + 18A1 : B0; + 18A2 : B9; + 18A3 : 24; + 18A4 : 6F; + 18A5 : 10; + 18A6 : 57; + 18A7 : A0; + 18A8 : 61; + 18A9 : E0; + 18AA : 69; + 18AB : F0; + 18AC : 02; + 18AD : A0; + 18AE : 69; + 18AF : 38; + 18B0 : 49; + 18B1 : FF; + 18B2 : 65; + 18B3 : 56; + 18B4 : 85; + 18B5 : 70; + 18B6 : B9; + 18B7 : 04; + 18B8 : 00; + 18B9 : F5; + 18BA : 04; + 18BB : 85; + 18BC : 65; + 18BD : B9; + 18BE : 03; + 18BF : 00; + 18C0 : F5; + 18C1 : 03; + 18C2 : 85; + 18C3 : 64; + 18C4 : B9; + 18C5 : 02; + 18C6 : 00; + 18C7 : F5; + 18C8 : 02; + 18C9 : 85; + 18CA : 63; + 18CB : B9; + 18CC : 01; + 18CD : 00; + 18CE : F5; + 18CF : 01; + 18D0 : 85; + 18D1 : 62; + 18D2 : B0; + 18D3 : 03; + 18D4 : 20; + 18D5 : 47; + 18D6 : B9; + 18D7 : A0; + 18D8 : 00; + 18D9 : 98; + 18DA : 18; + 18DB : A6; + 18DC : 62; + 18DD : D0; + 18DE : 4A; + 18DF : A6; + 18E0 : 63; + 18E1 : 86; + 18E2 : 62; + 18E3 : A6; + 18E4 : 64; + 18E5 : 86; + 18E6 : 63; + 18E7 : A6; + 18E8 : 65; + 18E9 : 86; + 18EA : 64; + 18EB : A6; + 18EC : 70; + 18ED : 86; + 18EE : 65; + 18EF : 84; + 18F0 : 70; + 18F1 : 69; + 18F2 : 08; + 18F3 : C9; + 18F4 : 20; + 18F5 : D0; + 18F6 : E4; + 18F7 : A9; + 18F8 : 00; + 18F9 : 85; + 18FA : 61; + 18FB : 85; + 18FC : 66; + 18FD : 60; + 18FE : 65; + 18FF : 56; + 1900 : 85; + 1901 : 70; + 1902 : A5; + [1903..1904] : 65; + 1905 : 6D; + 1906 : 85; + 1907 : 65; + 1908 : A5; + 1909 : 64; + 190A : 65; + 190B : 6C; + 190C : 85; + 190D : 64; + 190E : A5; + 190F : 63; + 1910 : 65; + 1911 : 6B; + 1912 : 85; + 1913 : 63; + 1914 : A5; + 1915 : 62; + 1916 : 65; + 1917 : 6A; + 1918 : 85; + 1919 : 62; + 191A : 4C; + 191B : 36; + 191C : B9; + 191D : 69; + 191E : 01; + 191F : 06; + 1920 : 70; + 1921 : 26; + 1922 : 65; + 1923 : 26; + 1924 : 64; + 1925 : 26; + 1926 : 63; + 1927 : 26; + 1928 : 62; + 1929 : 10; + 192A : F2; + 192B : 38; + 192C : E5; + 192D : 61; + 192E : B0; + 192F : C7; + 1930 : 49; + 1931 : FF; + 1932 : 69; + 1933 : 01; + 1934 : 85; + 1935 : 61; + 1936 : 90; + 1937 : 0E; + 1938 : E6; + 1939 : 61; + 193A : F0; + 193B : 42; + 193C : 66; + 193D : 62; + 193E : 66; + 193F : 63; + 1940 : 66; + 1941 : 64; + 1942 : 66; + 1943 : 65; + 1944 : 66; + 1945 : 70; + 1946 : 60; + 1947 : A5; + 1948 : 66; + 1949 : 49; + 194A : FF; + 194B : 85; + 194C : 66; + 194D : A5; + 194E : 62; + 194F : 49; + 1950 : FF; + 1951 : 85; + 1952 : 62; + 1953 : A5; + 1954 : 63; + 1955 : 49; + 1956 : FF; + 1957 : 85; + 1958 : 63; + 1959 : A5; + 195A : 64; + 195B : 49; + 195C : FF; + 195D : 85; + 195E : 64; + 195F : A5; + 1960 : 65; + 1961 : 49; + 1962 : FF; + 1963 : 85; + 1964 : 65; + 1965 : A5; + 1966 : 70; + 1967 : 49; + 1968 : FF; + 1969 : 85; + 196A : 70; + 196B : E6; + 196C : 70; + 196D : D0; + 196E : 0E; + 196F : E6; + 1970 : 65; + 1971 : D0; + 1972 : 0A; + 1973 : E6; + 1974 : 64; + 1975 : D0; + 1976 : 06; + 1977 : E6; + 1978 : 63; + 1979 : D0; + 197A : 02; + 197B : E6; + 197C : 62; + 197D : 60; + 197E : A2; + 197F : 0F; + 1980 : 4C; + 1981 : 37; + 1982 : A4; + 1983 : A2; + 1984 : 25; + 1985 : B4; + 1986 : 04; + 1987 : 84; + 1988 : 70; + 1989 : B4; + 198A : 03; + 198B : 94; + 198C : 04; + 198D : B4; + 198E : 02; + 198F : 94; + 1990 : 03; + 1991 : B4; + 1992 : 01; + 1993 : 94; + 1994 : 02; + 1995 : A4; + 1996 : 68; + 1997 : 94; + 1998 : 01; + 1999 : 69; + 199A : 08; + 199B : 30; + 199C : E8; + 199D : F0; + 199E : E6; + 199F : E9; + 19A0 : 08; + 19A1 : A8; + 19A2 : A5; + 19A3 : 70; + 19A4 : B0; + 19A5 : 14; + 19A6 : 16; + 19A7 : 01; + 19A8 : 90; + 19A9 : 02; + 19AA : F6; + 19AB : 01; + 19AC : 76; + 19AD : 01; + 19AE : 76; + 19AF : 01; + 19B0 : 76; + 19B1 : 02; + 19B2 : 76; + 19B3 : 03; + 19B4 : 76; + 19B5 : 04; + 19B6 : 6A; + 19B7 : C8; + 19B8 : D0; + 19B9 : EC; + 19BA : 18; + 19BB : 60; + 19BC : 81; + [19BD..19C0] : 00; + 19C1 : 03; + 19C2 : 7F; + 19C3 : 5E; + 19C4 : 56; + 19C5 : CB; + 19C6 : 79; + 19C7 : 80; + 19C8 : 13; + 19C9 : 9B; + 19CA : 0B; + 19CB : 64; + 19CC : 80; + 19CD : 76; + 19CE : 38; + 19CF : 93; + 19D0 : 16; + 19D1 : 82; + 19D2 : 38; + 19D3 : AA; + 19D4 : 3B; + 19D5 : 20; + 19D6 : 80; + 19D7 : 35; + 19D8 : 04; + 19D9 : F3; + 19DA : 34; + 19DB : 81; + 19DC : 35; + 19DD : 04; + 19DE : F3; + 19DF : 34; + [19E0..19E1] : 80; + [19E2..19E4] : 00; + 19E5 : 80; + 19E6 : 31; + 19E7 : 72; + 19E8 : 17; + 19E9 : F8; + 19EA : 20; + 19EB : 2B; + 19EC : BC; + 19ED : F0; + 19EE : 02; + 19EF : 10; + 19F0 : 03; + 19F1 : 4C; + 19F2 : 48; + 19F3 : B2; + 19F4 : A5; + 19F5 : 61; + 19F6 : E9; + 19F7 : 7F; + 19F8 : 48; + 19F9 : A9; + 19FA : 80; + 19FB : 85; + 19FC : 61; + 19FD : A9; + 19FE : D6; + 19FF : A0; + 1A00 : B9; + 1A01 : 20; + 1A02 : 67; + 1A03 : B8; + 1A04 : A9; + 1A05 : DB; + 1A06 : A0; + 1A07 : B9; + 1A08 : 20; + 1A09 : 0F; + 1A0A : BB; + 1A0B : A9; + 1A0C : BC; + 1A0D : A0; + 1A0E : B9; + 1A0F : 20; + 1A10 : 50; + 1A11 : B8; + 1A12 : A9; + 1A13 : C1; + 1A14 : A0; + 1A15 : B9; + 1A16 : 20; + 1A17 : 43; + 1A18 : E0; + 1A19 : A9; + 1A1A : E0; + 1A1B : A0; + 1A1C : B9; + 1A1D : 20; + 1A1E : 67; + 1A1F : B8; + 1A20 : 68; + 1A21 : 20; + 1A22 : 7E; + 1A23 : BD; + 1A24 : A9; + 1A25 : E5; + 1A26 : A0; + 1A27 : B9; + 1A28 : 20; + 1A29 : 8C; + 1A2A : BA; + 1A2B : D0; + 1A2C : 03; + 1A2D : 4C; + 1A2E : 8B; + 1A2F : BA; + 1A30 : 20; + 1A31 : B7; + 1A32 : BA; + 1A33 : A9; + 1A34 : 00; + 1A35 : 85; + 1A36 : 26; + 1A37 : 85; + 1A38 : 27; + 1A39 : 85; + 1A3A : 28; + 1A3B : 85; + 1A3C : 29; + 1A3D : A5; + 1A3E : 70; + 1A3F : 20; + 1A40 : 59; + 1A41 : BA; + 1A42 : A5; + 1A43 : 65; + 1A44 : 20; + 1A45 : 59; + 1A46 : BA; + 1A47 : A5; + 1A48 : 64; + 1A49 : 20; + 1A4A : 59; + 1A4B : BA; + 1A4C : A5; + 1A4D : 63; + 1A4E : 20; + 1A4F : 59; + 1A50 : BA; + 1A51 : A5; + 1A52 : 62; + 1A53 : 20; + 1A54 : 5E; + 1A55 : BA; + 1A56 : 4C; + 1A57 : 8F; + 1A58 : BB; + 1A59 : D0; + 1A5A : 03; + 1A5B : 4C; + 1A5C : 83; + 1A5D : B9; + 1A5E : 4A; + 1A5F : 09; + 1A60 : 80; + 1A61 : A8; + 1A62 : 90; + 1A63 : 19; + 1A64 : 18; + 1A65 : A5; + 1A66 : 29; + 1A67 : 65; + 1A68 : 6D; + 1A69 : 85; + 1A6A : 29; + 1A6B : A5; + 1A6C : 28; + 1A6D : 65; + 1A6E : 6C; + 1A6F : 85; + 1A70 : 28; + 1A71 : A5; + 1A72 : 27; + 1A73 : 65; + 1A74 : 6B; + 1A75 : 85; + 1A76 : 27; + 1A77 : A5; + 1A78 : 26; + 1A79 : 65; + 1A7A : 6A; + 1A7B : 85; + 1A7C : 26; + 1A7D : 66; + 1A7E : 26; + 1A7F : 66; + 1A80 : 27; + 1A81 : 66; + 1A82 : 28; + 1A83 : 66; + 1A84 : 29; + 1A85 : 66; + 1A86 : 70; + 1A87 : 98; + 1A88 : 4A; + 1A89 : D0; + 1A8A : D6; + 1A8B : 60; + 1A8C : 85; + 1A8D : 22; + 1A8E : 84; + 1A8F : 23; + 1A90 : A0; + 1A91 : 04; + 1A92 : B1; + 1A93 : 22; + 1A94 : 85; + 1A95 : 6D; + 1A96 : 88; + 1A97 : B1; + 1A98 : 22; + 1A99 : 85; + 1A9A : 6C; + 1A9B : 88; + 1A9C : B1; + 1A9D : 22; + 1A9E : 85; + 1A9F : 6B; + 1AA0 : 88; + 1AA1 : B1; + 1AA2 : 22; + 1AA3 : 85; + 1AA4 : 6E; + 1AA5 : 45; + 1AA6 : 66; + 1AA7 : 85; + 1AA8 : 6F; + 1AA9 : A5; + 1AAA : 6E; + 1AAB : 09; + 1AAC : 80; + 1AAD : 85; + 1AAE : 6A; + 1AAF : 88; + 1AB0 : B1; + 1AB1 : 22; + 1AB2 : 85; + 1AB3 : 69; + 1AB4 : A5; + 1AB5 : 61; + 1AB6 : 60; + 1AB7 : A5; + 1AB8 : 69; + 1AB9 : F0; + 1ABA : 1F; + 1ABB : 18; + 1ABC : 65; + 1ABD : 61; + 1ABE : 90; + 1ABF : 04; + 1AC0 : 30; + 1AC1 : 1D; + 1AC2 : 18; + 1AC3 : 2C; + 1AC4 : 10; + 1AC5 : 14; + 1AC6 : 69; + 1AC7 : 80; + 1AC8 : 85; + 1AC9 : 61; + 1ACA : D0; + 1ACB : 03; + 1ACC : 4C; + 1ACD : FB; + 1ACE : B8; + 1ACF : A5; + 1AD0 : 6F; + 1AD1 : 85; + 1AD2 : 66; + 1AD3 : 60; + 1AD4 : A5; + 1AD5 : 66; + 1AD6 : 49; + 1AD7 : FF; + 1AD8 : 30; + 1AD9 : 05; + [1ADA..1ADB] : 68; + 1ADC : 4C; + 1ADD : F7; + 1ADE : B8; + 1ADF : 4C; + 1AE0 : 7E; + 1AE1 : B9; + 1AE2 : 20; + 1AE3 : 0C; + 1AE4 : BC; + 1AE5 : AA; + 1AE6 : F0; + 1AE7 : 10; + 1AE8 : 18; + 1AE9 : 69; + 1AEA : 02; + 1AEB : B0; + 1AEC : F2; + 1AED : A2; + 1AEE : 00; + 1AEF : 86; + 1AF0 : 6F; + 1AF1 : 20; + 1AF2 : 77; + 1AF3 : B8; + 1AF4 : E6; + 1AF5 : 61; + 1AF6 : F0; + 1AF7 : E7; + 1AF8 : 60; + 1AF9 : 84; + 1AFA : 20; + [1AFB..1AFD] : 00; + 1AFE : 20; + 1AFF : 0C; + 1B00 : BC; + 1B01 : A9; + 1B02 : F9; + 1B03 : A0; + 1B04 : BA; + 1B05 : A2; + 1B06 : 00; + 1B07 : 86; + 1B08 : 6F; + 1B09 : 20; + 1B0A : A2; + 1B0B : BB; + 1B0C : 4C; + 1B0D : 12; + 1B0E : BB; + 1B0F : 20; + 1B10 : 8C; + 1B11 : BA; + 1B12 : F0; + 1B13 : 76; + 1B14 : 20; + 1B15 : 1B; + 1B16 : BC; + 1B17 : A9; + 1B18 : 00; + 1B19 : 38; + 1B1A : E5; + 1B1B : 61; + 1B1C : 85; + 1B1D : 61; + 1B1E : 20; + 1B1F : B7; + 1B20 : BA; + 1B21 : E6; + 1B22 : 61; + 1B23 : F0; + 1B24 : BA; + 1B25 : A2; + 1B26 : FC; + 1B27 : A9; + 1B28 : 01; + 1B29 : A4; + 1B2A : 6A; + 1B2B : C4; + 1B2C : 62; + 1B2D : D0; + 1B2E : 10; + 1B2F : A4; + 1B30 : 6B; + 1B31 : C4; + 1B32 : 63; + 1B33 : D0; + 1B34 : 0A; + 1B35 : A4; + 1B36 : 6C; + 1B37 : C4; + 1B38 : 64; + 1B39 : D0; + 1B3A : 04; + 1B3B : A4; + 1B3C : 6D; + 1B3D : C4; + 1B3E : 65; + 1B3F : 08; + 1B40 : 2A; + 1B41 : 90; + 1B42 : 09; + 1B43 : E8; + 1B44 : 95; + 1B45 : 29; + 1B46 : F0; + 1B47 : 32; + 1B48 : 10; + 1B49 : 34; + 1B4A : A9; + 1B4B : 01; + 1B4C : 28; + 1B4D : B0; + 1B4E : 0E; + 1B4F : 06; + 1B50 : 6D; + 1B51 : 26; + 1B52 : 6C; + 1B53 : 26; + 1B54 : 6B; + 1B55 : 26; + 1B56 : 6A; + 1B57 : B0; + 1B58 : E6; + 1B59 : 30; + 1B5A : CE; + 1B5B : 10; + 1B5C : E2; + 1B5D : A8; + 1B5E : A5; + 1B5F : 6D; + 1B60 : E5; + 1B61 : 65; + 1B62 : 85; + 1B63 : 6D; + 1B64 : A5; + 1B65 : 6C; + 1B66 : E5; + 1B67 : 64; + 1B68 : 85; + 1B69 : 6C; + 1B6A : A5; + 1B6B : 6B; + 1B6C : E5; + 1B6D : 63; + 1B6E : 85; + 1B6F : 6B; + 1B70 : A5; + 1B71 : 6A; + 1B72 : E5; + 1B73 : 62; + 1B74 : 85; + 1B75 : 6A; + 1B76 : 98; + 1B77 : 4C; + 1B78 : 4F; + 1B79 : BB; + 1B7A : A9; + 1B7B : 40; + 1B7C : D0; + 1B7D : CE; + [1B7E..1B83] : 0A; + 1B84 : 85; + 1B85 : 70; + 1B86 : 28; + 1B87 : 4C; + 1B88 : 8F; + 1B89 : BB; + 1B8A : A2; + 1B8B : 14; + 1B8C : 4C; + 1B8D : 37; + 1B8E : A4; + 1B8F : A5; + 1B90 : 26; + 1B91 : 85; + 1B92 : 62; + 1B93 : A5; + 1B94 : 27; + 1B95 : 85; + 1B96 : 63; + 1B97 : A5; + 1B98 : 28; + 1B99 : 85; + 1B9A : 64; + 1B9B : A5; + 1B9C : 29; + 1B9D : 85; + 1B9E : 65; + 1B9F : 4C; + 1BA0 : D7; + 1BA1 : B8; + 1BA2 : 85; + 1BA3 : 22; + 1BA4 : 84; + 1BA5 : 23; + 1BA6 : A0; + 1BA7 : 04; + 1BA8 : B1; + 1BA9 : 22; + 1BAA : 85; + 1BAB : 65; + 1BAC : 88; + 1BAD : B1; + 1BAE : 22; + 1BAF : 85; + 1BB0 : 64; + 1BB1 : 88; + 1BB2 : B1; + 1BB3 : 22; + 1BB4 : 85; + 1BB5 : 63; + 1BB6 : 88; + 1BB7 : B1; + 1BB8 : 22; + 1BB9 : 85; + 1BBA : 66; + 1BBB : 09; + 1BBC : 80; + 1BBD : 85; + 1BBE : 62; + 1BBF : 88; + 1BC0 : B1; + 1BC1 : 22; + 1BC2 : 85; + 1BC3 : 61; + 1BC4 : 84; + 1BC5 : 70; + 1BC6 : 60; + 1BC7 : A2; + 1BC8 : 5C; + 1BC9 : 2C; + 1BCA : A2; + 1BCB : 57; + 1BCC : A0; + 1BCD : 00; + 1BCE : F0; + 1BCF : 04; + 1BD0 : A6; + 1BD1 : 49; + 1BD2 : A4; + 1BD3 : 4A; + 1BD4 : 20; + 1BD5 : 1B; + 1BD6 : BC; + 1BD7 : 86; + 1BD8 : 22; + 1BD9 : 84; + 1BDA : 23; + 1BDB : A0; + 1BDC : 04; + 1BDD : A5; + 1BDE : 65; + 1BDF : 91; + 1BE0 : 22; + 1BE1 : 88; + 1BE2 : A5; + 1BE3 : 64; + 1BE4 : 91; + 1BE5 : 22; + 1BE6 : 88; + 1BE7 : A5; + 1BE8 : 63; + 1BE9 : 91; + 1BEA : 22; + 1BEB : 88; + 1BEC : A5; + 1BED : 66; + 1BEE : 09; + 1BEF : 7F; + 1BF0 : 25; + 1BF1 : 62; + 1BF2 : 91; + 1BF3 : 22; + 1BF4 : 88; + 1BF5 : A5; + 1BF6 : 61; + 1BF7 : 91; + 1BF8 : 22; + 1BF9 : 84; + 1BFA : 70; + 1BFB : 60; + 1BFC : A5; + 1BFD : 6E; + 1BFE : 85; + 1BFF : 66; + 1C00 : A2; + 1C01 : 05; + 1C02 : B5; + 1C03 : 68; + 1C04 : 95; + 1C05 : 60; + 1C06 : CA; + 1C07 : D0; + 1C08 : F9; + 1C09 : 86; + 1C0A : 70; + 1C0B : 60; + 1C0C : 20; + 1C0D : 1B; + 1C0E : BC; + 1C0F : A2; + 1C10 : 06; + 1C11 : B5; + 1C12 : 60; + 1C13 : 95; + 1C14 : 68; + 1C15 : CA; + 1C16 : D0; + 1C17 : F9; + 1C18 : 86; + 1C19 : 70; + 1C1A : 60; + 1C1B : A5; + 1C1C : 61; + 1C1D : F0; + 1C1E : FB; + 1C1F : 06; + 1C20 : 70; + 1C21 : 90; + 1C22 : F7; + 1C23 : 20; + 1C24 : 6F; + 1C25 : B9; + 1C26 : D0; + 1C27 : F2; + 1C28 : 4C; + 1C29 : 38; + 1C2A : B9; + 1C2B : A5; + 1C2C : 61; + 1C2D : F0; + 1C2E : 09; + 1C2F : A5; + 1C30 : 66; + 1C31 : 2A; + 1C32 : A9; + 1C33 : FF; + 1C34 : B0; + 1C35 : 02; + 1C36 : A9; + 1C37 : 01; + 1C38 : 60; + 1C39 : 20; + 1C3A : 2B; + 1C3B : BC; + 1C3C : 85; + 1C3D : 62; + 1C3E : A9; + 1C3F : 00; + 1C40 : 85; + 1C41 : 63; + 1C42 : A2; + 1C43 : 88; + 1C44 : A5; + 1C45 : 62; + 1C46 : 49; + 1C47 : FF; + 1C48 : 2A; + 1C49 : A9; + 1C4A : 00; + 1C4B : 85; + 1C4C : 65; + 1C4D : 85; + 1C4E : 64; + 1C4F : 86; + 1C50 : 61; + 1C51 : 85; + 1C52 : 70; + 1C53 : 85; + 1C54 : 66; + 1C55 : 4C; + 1C56 : D2; + 1C57 : B8; + 1C58 : 46; + 1C59 : 66; + 1C5A : 60; + 1C5B : 85; + 1C5C : 24; + 1C5D : 84; + 1C5E : 25; + 1C5F : A0; + 1C60 : 00; + 1C61 : B1; + 1C62 : 24; + 1C63 : C8; + 1C64 : AA; + 1C65 : F0; + 1C66 : C4; + 1C67 : B1; + 1C68 : 24; + 1C69 : 45; + 1C6A : 66; + 1C6B : 30; + 1C6C : C2; + 1C6D : E4; + 1C6E : 61; + 1C6F : D0; + 1C70 : 21; + 1C71 : B1; + 1C72 : 24; + 1C73 : 09; + 1C74 : 80; + 1C75 : C5; + 1C76 : 62; + 1C77 : D0; + 1C78 : 19; + 1C79 : C8; + 1C7A : B1; + 1C7B : 24; + 1C7C : C5; + 1C7D : 63; + 1C7E : D0; + 1C7F : 12; + 1C80 : C8; + 1C81 : B1; + 1C82 : 24; + 1C83 : C5; + 1C84 : 64; + 1C85 : D0; + 1C86 : 0B; + 1C87 : C8; + 1C88 : A9; + 1C89 : 7F; + 1C8A : C5; + 1C8B : 70; + 1C8C : B1; + 1C8D : 24; + 1C8E : E5; + 1C8F : 65; + 1C90 : F0; + 1C91 : 28; + 1C92 : A5; + 1C93 : 66; + 1C94 : 90; + 1C95 : 02; + 1C96 : 49; + 1C97 : FF; + 1C98 : 4C; + 1C99 : 31; + 1C9A : BC; + 1C9B : A5; + 1C9C : 61; + 1C9D : F0; + 1C9E : 4A; + 1C9F : 38; + 1CA0 : E9; + 1CA1 : A0; + 1CA2 : 24; + 1CA3 : 66; + 1CA4 : 10; + 1CA5 : 09; + 1CA6 : AA; + 1CA7 : A9; + 1CA8 : FF; + 1CA9 : 85; + 1CAA : 68; + 1CAB : 20; + 1CAC : 4D; + 1CAD : B9; + 1CAE : 8A; + 1CAF : A2; + 1CB0 : 61; + 1CB1 : C9; + 1CB2 : F9; + 1CB3 : 10; + 1CB4 : 06; + 1CB5 : 20; + 1CB6 : 99; + 1CB7 : B9; + 1CB8 : 84; + 1CB9 : 68; + 1CBA : 60; + 1CBB : A8; + 1CBC : A5; + 1CBD : 66; + 1CBE : 29; + 1CBF : 80; + 1CC0 : 46; + 1CC1 : 62; + 1CC2 : 05; + 1CC3 : 62; + 1CC4 : 85; + 1CC5 : 62; + 1CC6 : 20; + 1CC7 : B0; + 1CC8 : B9; + 1CC9 : 84; + 1CCA : 68; + 1CCB : 60; + 1CCC : A5; + 1CCD : 61; + 1CCE : C9; + 1CCF : A0; + 1CD0 : B0; + [1CD1..1CD2] : 20; + 1CD3 : 9B; + 1CD4 : BC; + 1CD5 : 84; + 1CD6 : 70; + 1CD7 : A5; + 1CD8 : 66; + 1CD9 : 84; + 1CDA : 66; + 1CDB : 49; + 1CDC : 80; + 1CDD : 2A; + 1CDE : A9; + 1CDF : A0; + 1CE0 : 85; + 1CE1 : 61; + 1CE2 : A5; + 1CE3 : 65; + 1CE4 : 85; + 1CE5 : 07; + 1CE6 : 4C; + 1CE7 : D2; + 1CE8 : B8; + 1CE9 : 85; + 1CEA : 62; + 1CEB : 85; + 1CEC : 63; + 1CED : 85; + 1CEE : 64; + 1CEF : 85; + 1CF0 : 65; + 1CF1 : A8; + 1CF2 : 60; + 1CF3 : A0; + 1CF4 : 00; + 1CF5 : A2; + 1CF6 : 0A; + 1CF7 : 94; + 1CF8 : 5D; + 1CF9 : CA; + 1CFA : 10; + 1CFB : FB; + 1CFC : 90; + 1CFD : 0F; + 1CFE : C9; + 1CFF : 2D; + 1D00 : D0; + 1D01 : 04; + 1D02 : 86; + 1D03 : 67; + 1D04 : F0; + 1D05 : 04; + 1D06 : C9; + 1D07 : 2B; + 1D08 : D0; + 1D09 : 05; + 1D0A : 20; + 1D0B : 73; + 1D0C : 00; + 1D0D : 90; + 1D0E : 5B; + 1D0F : C9; + 1D10 : 2E; + 1D11 : F0; + 1D12 : 2E; + 1D13 : C9; + 1D14 : 45; + 1D15 : D0; + 1D16 : 30; + 1D17 : 20; + 1D18 : 73; + 1D19 : 00; + 1D1A : 90; + 1D1B : 17; + 1D1C : C9; + 1D1D : AB; + 1D1E : F0; + 1D1F : 0E; + 1D20 : C9; + 1D21 : 2D; + 1D22 : F0; + 1D23 : 0A; + 1D24 : C9; + 1D25 : AA; + 1D26 : F0; + 1D27 : 08; + 1D28 : C9; + 1D29 : 2B; + 1D2A : F0; + 1D2B : 04; + 1D2C : D0; + 1D2D : 07; + 1D2E : 66; + 1D2F : 60; + 1D30 : 20; + 1D31 : 73; + 1D32 : 00; + 1D33 : 90; + 1D34 : 5C; + 1D35 : 24; + 1D36 : 60; + 1D37 : 10; + 1D38 : 0E; + 1D39 : A9; + 1D3A : 00; + 1D3B : 38; + 1D3C : E5; + 1D3D : 5E; + 1D3E : 4C; + 1D3F : 49; + 1D40 : BD; + 1D41 : 66; + 1D42 : 5F; + 1D43 : 24; + 1D44 : 5F; + 1D45 : 50; + 1D46 : C3; + 1D47 : A5; + 1D48 : 5E; + 1D49 : 38; + 1D4A : E5; + 1D4B : 5D; + 1D4C : 85; + 1D4D : 5E; + 1D4E : F0; + 1D4F : 12; + 1D50 : 10; + 1D51 : 09; + 1D52 : 20; + 1D53 : FE; + 1D54 : BA; + 1D55 : E6; + 1D56 : 5E; + 1D57 : D0; + 1D58 : F9; + 1D59 : F0; + 1D5A : 07; + 1D5B : 20; + 1D5C : E2; + 1D5D : BA; + 1D5E : C6; + 1D5F : 5E; + 1D60 : D0; + 1D61 : F9; + 1D62 : A5; + 1D63 : 67; + 1D64 : 30; + 1D65 : 01; + 1D66 : 60; + 1D67 : 4C; + 1D68 : B4; + 1D69 : BF; + 1D6A : 48; + 1D6B : 24; + 1D6C : 5F; + 1D6D : 10; + 1D6E : 02; + 1D6F : E6; + 1D70 : 5D; + 1D71 : 20; + 1D72 : E2; + 1D73 : BA; + 1D74 : 68; + 1D75 : 38; + 1D76 : E9; + 1D77 : 30; + 1D78 : 20; + 1D79 : 7E; + 1D7A : BD; + 1D7B : 4C; + 1D7C : 0A; + 1D7D : BD; + 1D7E : 48; + 1D7F : 20; + 1D80 : 0C; + 1D81 : BC; + 1D82 : 68; + 1D83 : 20; + 1D84 : 3C; + 1D85 : BC; + 1D86 : A5; + 1D87 : 6E; + 1D88 : 45; + 1D89 : 66; + 1D8A : 85; + 1D8B : 6F; + 1D8C : A6; + 1D8D : 61; + 1D8E : 4C; + 1D8F : 6A; + 1D90 : B8; + 1D91 : A5; + 1D92 : 5E; + 1D93 : C9; + 1D94 : 0A; + 1D95 : 90; + 1D96 : 09; + 1D97 : A9; + 1D98 : 64; + 1D99 : 24; + 1D9A : 60; + 1D9B : 30; + 1D9C : 11; + 1D9D : 4C; + 1D9E : 7E; + 1D9F : B9; + [1DA0..1DA1] : 0A; + 1DA2 : 18; + 1DA3 : 65; + 1DA4 : 5E; + 1DA5 : 0A; + 1DA6 : 18; + 1DA7 : A0; + 1DA8 : 00; + 1DA9 : 71; + 1DAA : 7A; + 1DAB : 38; + 1DAC : E9; + 1DAD : 30; + 1DAE : 85; + 1DAF : 5E; + 1DB0 : 4C; + 1DB1 : 30; + 1DB2 : BD; + 1DB3 : 9B; + 1DB4 : 3E; + 1DB5 : BC; + 1DB6 : 1F; + 1DB7 : FD; + 1DB8 : 9E; + 1DB9 : 6E; + 1DBA : 6B; + 1DBB : 27; + 1DBC : FD; + 1DBD : 9E; + 1DBE : 6E; + 1DBF : 6B; + 1DC0 : 28; + 1DC1 : 00; + 1DC2 : A9; + 1DC3 : 71; + 1DC4 : A0; + 1DC5 : A3; + 1DC6 : 20; + 1DC7 : DA; + 1DC8 : BD; + 1DC9 : A5; + 1DCA : 3A; + 1DCB : A6; + 1DCC : 39; + 1DCD : 85; + 1DCE : 62; + 1DCF : 86; + 1DD0 : 63; + 1DD1 : A2; + 1DD2 : 90; + 1DD3 : 38; + 1DD4 : 20; + 1DD5 : 49; + 1DD6 : BC; + 1DD7 : 20; + 1DD8 : DF; + 1DD9 : BD; + 1DDA : 4C; + 1DDB : 1E; + 1DDC : AB; + 1DDD : A0; + 1DDE : 01; + 1DDF : A9; + 1DE0 : 20; + 1DE1 : 24; + 1DE2 : 66; + 1DE3 : 10; + 1DE4 : 02; + 1DE5 : A9; + 1DE6 : 2D; + 1DE7 : 99; + 1DE8 : FF; + 1DE9 : 00; + 1DEA : 85; + 1DEB : 66; + 1DEC : 84; + 1DED : 71; + 1DEE : C8; + 1DEF : A9; + 1DF0 : 30; + 1DF1 : A6; + 1DF2 : 61; + 1DF3 : D0; + 1DF4 : 03; + 1DF5 : 4C; + 1DF6 : 04; + 1DF7 : BF; + 1DF8 : A9; + 1DF9 : 00; + 1DFA : E0; + 1DFB : 80; + 1DFC : F0; + 1DFD : 02; + 1DFE : B0; + 1DFF : 09; + 1E00 : A9; + 1E01 : BD; + 1E02 : A0; + 1E03 : BD; + 1E04 : 20; + 1E05 : 28; + 1E06 : BA; + 1E07 : A9; + 1E08 : F7; + 1E09 : 85; + 1E0A : 5D; + 1E0B : A9; + 1E0C : B8; + 1E0D : A0; + 1E0E : BD; + 1E0F : 20; + 1E10 : 5B; + 1E11 : BC; + 1E12 : F0; + 1E13 : 1E; + 1E14 : 10; + 1E15 : 12; + 1E16 : A9; + 1E17 : B3; + 1E18 : A0; + 1E19 : BD; + 1E1A : 20; + 1E1B : 5B; + 1E1C : BC; + 1E1D : F0; + 1E1E : 02; + 1E1F : 10; + 1E20 : 0E; + 1E21 : 20; + 1E22 : E2; + 1E23 : BA; + 1E24 : C6; + 1E25 : 5D; + 1E26 : D0; + 1E27 : EE; + 1E28 : 20; + 1E29 : FE; + 1E2A : BA; + 1E2B : E6; + 1E2C : 5D; + 1E2D : D0; + 1E2E : DC; + 1E2F : 20; + 1E30 : 49; + 1E31 : B8; + 1E32 : 20; + 1E33 : 9B; + 1E34 : BC; + 1E35 : A2; + 1E36 : 01; + 1E37 : A5; + 1E38 : 5D; + 1E39 : 18; + 1E3A : 69; + 1E3B : 0A; + 1E3C : 30; + 1E3D : 09; + 1E3E : C9; + 1E3F : 0B; + 1E40 : B0; + 1E41 : 06; + 1E42 : 69; + 1E43 : FF; + 1E44 : AA; + 1E45 : A9; + 1E46 : 02; + 1E47 : 38; + 1E48 : E9; + 1E49 : 02; + 1E4A : 85; + 1E4B : 5E; + 1E4C : 86; + 1E4D : 5D; + 1E4E : 8A; + 1E4F : F0; + 1E50 : 02; + 1E51 : 10; + 1E52 : 13; + 1E53 : A4; + 1E54 : 71; + 1E55 : A9; + 1E56 : 2E; + 1E57 : C8; + 1E58 : 99; + 1E59 : FF; + 1E5A : 00; + 1E5B : 8A; + 1E5C : F0; + 1E5D : 06; + 1E5E : A9; + 1E5F : 30; + 1E60 : C8; + 1E61 : 99; + 1E62 : FF; + 1E63 : 00; + 1E64 : 84; + 1E65 : 71; + 1E66 : A0; + 1E67 : 00; + 1E68 : A2; + 1E69 : 80; + 1E6A : A5; + 1E6B : 65; + 1E6C : 18; + 1E6D : 79; + 1E6E : 19; + 1E6F : BF; + 1E70 : 85; + 1E71 : 65; + 1E72 : A5; + 1E73 : 64; + 1E74 : 79; + 1E75 : 18; + 1E76 : BF; + 1E77 : 85; + 1E78 : 64; + 1E79 : A5; + 1E7A : 63; + 1E7B : 79; + 1E7C : 17; + 1E7D : BF; + 1E7E : 85; + 1E7F : 63; + 1E80 : A5; + 1E81 : 62; + 1E82 : 79; + 1E83 : 16; + 1E84 : BF; + 1E85 : 85; + 1E86 : 62; + 1E87 : E8; + 1E88 : B0; + 1E89 : 04; + 1E8A : 10; + 1E8B : DE; + 1E8C : 30; + 1E8D : 02; + 1E8E : 30; + 1E8F : DA; + 1E90 : 8A; + 1E91 : 90; + 1E92 : 04; + 1E93 : 49; + 1E94 : FF; + 1E95 : 69; + 1E96 : 0A; + 1E97 : 69; + 1E98 : 2F; + [1E99..1E9C] : C8; + 1E9D : 84; + 1E9E : 47; + 1E9F : A4; + 1EA0 : 71; + 1EA1 : C8; + 1EA2 : AA; + 1EA3 : 29; + 1EA4 : 7F; + 1EA5 : 99; + 1EA6 : FF; + 1EA7 : 00; + 1EA8 : C6; + 1EA9 : 5D; + 1EAA : D0; + 1EAB : 06; + 1EAC : A9; + 1EAD : 2E; + 1EAE : C8; + 1EAF : 99; + 1EB0 : FF; + 1EB1 : 00; + 1EB2 : 84; + 1EB3 : 71; + 1EB4 : A4; + 1EB5 : 47; + 1EB6 : 8A; + 1EB7 : 49; + 1EB8 : FF; + 1EB9 : 29; + 1EBA : 80; + 1EBB : AA; + 1EBC : C0; + 1EBD : 24; + 1EBE : F0; + 1EBF : 04; + 1EC0 : C0; + 1EC1 : 3C; + 1EC2 : D0; + 1EC3 : A6; + 1EC4 : A4; + 1EC5 : 71; + 1EC6 : B9; + 1EC7 : FF; + 1EC8 : 00; + 1EC9 : 88; + 1ECA : C9; + 1ECB : 30; + 1ECC : F0; + 1ECD : F8; + 1ECE : C9; + 1ECF : 2E; + 1ED0 : F0; + 1ED1 : 01; + 1ED2 : C8; + 1ED3 : A9; + 1ED4 : 2B; + 1ED5 : A6; + 1ED6 : 5E; + 1ED7 : F0; + 1ED8 : 2E; + 1ED9 : 10; + 1EDA : 08; + 1EDB : A9; + 1EDC : 00; + 1EDD : 38; + 1EDE : E5; + 1EDF : 5E; + 1EE0 : AA; + 1EE1 : A9; + 1EE2 : 2D; + 1EE3 : 99; + [1EE4..1EE5] : 01; + 1EE6 : A9; + 1EE7 : 45; + 1EE8 : 99; + 1EE9 : 00; + 1EEA : 01; + 1EEB : 8A; + 1EEC : A2; + 1EED : 2F; + 1EEE : 38; + 1EEF : E8; + 1EF0 : E9; + 1EF1 : 0A; + 1EF2 : B0; + 1EF3 : FB; + 1EF4 : 69; + 1EF5 : 3A; + 1EF6 : 99; + 1EF7 : 03; + 1EF8 : 01; + 1EF9 : 8A; + 1EFA : 99; + 1EFB : 02; + 1EFC : 01; + 1EFD : A9; + 1EFE : 00; + 1EFF : 99; + 1F00 : 04; + 1F01 : 01; + 1F02 : F0; + 1F03 : 08; + 1F04 : 99; + 1F05 : FF; + 1F06 : 00; + 1F07 : A9; + 1F08 : 00; + 1F09 : 99; + 1F0A : 00; + 1F0B : 01; + 1F0C : A9; + 1F0D : 00; + 1F0E : A0; + 1F0F : 01; + 1F10 : 60; + 1F11 : 80; + [1F12..1F15] : 00; + 1F16 : FA; + 1F17 : 0A; + 1F18 : 1F; + [1F19..1F1A] : 00; + 1F1B : 98; + 1F1C : 96; + 1F1D : 80; + 1F1E : FF; + 1F1F : F0; + 1F20 : BD; + 1F21 : C0; + 1F22 : 00; + 1F23 : 01; + 1F24 : 86; + 1F25 : A0; + [1F26..1F27] : FF; + 1F28 : D8; + 1F29 : F0; + [1F2A..1F2B] : 00; + 1F2C : 03; + 1F2D : E8; + [1F2E..1F30] : FF; + 1F31 : 9C; + [1F32..1F34] : 00; + 1F35 : 0A; + [1F36..1F3A] : FF; + 1F3B : DF; + 1F3C : 0A; + 1F3D : 80; + 1F3E : 00; + 1F3F : 03; + 1F40 : 4B; + 1F41 : C0; + [1F42..1F43] : FF; + 1F44 : 73; + 1F45 : 60; + [1F46..1F47] : 00; + 1F48 : 0E; + 1F49 : 10; + [1F4A..1F4B] : FF; + 1F4C : FD; + 1F4D : A8; + [1F4E..1F50] : 00; + 1F51 : 3C; + 1F52 : EC; + [1F53..1F70] : 00; + 1F71 : 20; + 1F72 : 0C; + 1F73 : BC; + 1F74 : A9; + 1F75 : 11; + 1F76 : A0; + 1F77 : BF; + 1F78 : 20; + 1F79 : A2; + 1F7A : BB; + 1F7B : F0; + 1F7C : 70; + 1F7D : A5; + 1F7E : 69; + 1F7F : D0; + 1F80 : 03; + 1F81 : 4C; + 1F82 : F9; + 1F83 : B8; + 1F84 : A2; + 1F85 : 4E; + 1F86 : A0; + 1F87 : 00; + 1F88 : 20; + 1F89 : D4; + 1F8A : BB; + 1F8B : A5; + 1F8C : 6E; + 1F8D : 10; + 1F8E : 0F; + 1F8F : 20; + 1F90 : CC; + 1F91 : BC; + 1F92 : A9; + 1F93 : 4E; + 1F94 : A0; + 1F95 : 00; + 1F96 : 20; + 1F97 : 5B; + 1F98 : BC; + 1F99 : D0; + 1F9A : 03; + 1F9B : 98; + 1F9C : A4; + 1F9D : 07; + 1F9E : 20; + 1F9F : FE; + 1FA0 : BB; + 1FA1 : 98; + 1FA2 : 48; + 1FA3 : 20; + 1FA4 : EA; + 1FA5 : B9; + 1FA6 : A9; + 1FA7 : 4E; + 1FA8 : A0; + 1FA9 : 00; + 1FAA : 20; + 1FAB : 28; + 1FAC : BA; + 1FAD : 20; + 1FAE : ED; + 1FAF : BF; + 1FB0 : 68; + 1FB1 : 4A; + 1FB2 : 90; + 1FB3 : 0A; + 1FB4 : A5; + 1FB5 : 61; + 1FB6 : F0; + 1FB7 : 06; + 1FB8 : A5; + 1FB9 : 66; + 1FBA : 49; + 1FBB : FF; + 1FBC : 85; + 1FBD : 66; + 1FBE : 60; + 1FBF : 81; + 1FC0 : 38; + 1FC1 : AA; + 1FC2 : 3B; + 1FC3 : 29; + 1FC4 : 07; + 1FC5 : 71; + 1FC6 : 34; + 1FC7 : 58; + 1FC8 : 3E; + 1FC9 : 56; + 1FCA : 74; + 1FCB : 16; + 1FCC : 7E; + 1FCD : B3; + 1FCE : 1B; + 1FCF : 77; + 1FD0 : 2F; + 1FD1 : EE; + 1FD2 : E3; + 1FD3 : 85; + 1FD4 : 7A; + 1FD5 : 1D; + 1FD6 : 84; + 1FD7 : 1C; + 1FD8 : 2A; + 1FD9 : 7C; + 1FDA : 63; + 1FDB : 59; + 1FDC : 58; + 1FDD : 0A; + 1FDE : 7E; + 1FDF : 75; + 1FE0 : FD; + 1FE1 : E7; + 1FE2 : C6; + 1FE3 : 80; + 1FE4 : 31; + 1FE5 : 72; + 1FE6 : 18; + 1FE7 : 10; + 1FE8 : 81; + [1FE9..1FEC] : 00; + 1FED : A9; + 1FEE : BF; + 1FEF : A0; + 1FF0 : BF; + 1FF1 : 20; + 1FF2 : 28; + 1FF3 : BA; + 1FF4 : A5; + 1FF5 : 70; + 1FF6 : 69; + 1FF7 : 50; + 1FF8 : 90; + 1FF9 : 03; + 1FFA : 20; + 1FFB : 23; + 1FFC : BC; + 1FFD : 4C; + 1FFE : 00; + 1FFF : E0; + 2000 : 85; + 2001 : 56; + 2002 : 20; + 2003 : 0F; + 2004 : BC; + 2005 : A5; + 2006 : 61; + 2007 : C9; + 2008 : 88; + 2009 : 90; + 200A : 03; + 200B : 20; + 200C : D4; + 200D : BA; + 200E : 20; + 200F : CC; + 2010 : BC; + 2011 : A5; + 2012 : 07; + 2013 : 18; + 2014 : 69; + 2015 : 81; + 2016 : F0; + 2017 : F3; + 2018 : 38; + 2019 : E9; + 201A : 01; + 201B : 48; + 201C : A2; + 201D : 05; + 201E : B5; + 201F : 69; + 2020 : B4; + 2021 : 61; + 2022 : 95; + 2023 : 61; + 2024 : 94; + 2025 : 69; + 2026 : CA; + 2027 : 10; + 2028 : F5; + 2029 : A5; + 202A : 56; + 202B : 85; + 202C : 70; + 202D : 20; + 202E : 53; + 202F : B8; + 2030 : 20; + 2031 : B4; + 2032 : BF; + 2033 : A9; + 2034 : C4; + 2035 : A0; + 2036 : BF; + 2037 : 20; + 2038 : 59; + 2039 : E0; + 203A : A9; + 203B : 00; + 203C : 85; + 203D : 6F; + 203E : 68; + 203F : 20; + 2040 : B9; + 2041 : BA; + 2042 : 60; + 2043 : 85; + 2044 : 71; + 2045 : 84; + 2046 : 72; + 2047 : 20; + 2048 : CA; + 2049 : BB; + 204A : A9; + 204B : 57; + 204C : 20; + 204D : 28; + 204E : BA; + 204F : 20; + 2050 : 5D; + 2051 : E0; + 2052 : A9; + 2053 : 57; + 2054 : A0; + 2055 : 00; + 2056 : 4C; + 2057 : 28; + 2058 : BA; + 2059 : 85; + 205A : 71; + 205B : 84; + 205C : 72; + 205D : 20; + 205E : C7; + 205F : BB; + 2060 : B1; + 2061 : 71; + 2062 : 85; + 2063 : 67; + 2064 : A4; + 2065 : 71; + 2066 : C8; + 2067 : 98; + 2068 : D0; + 2069 : 02; + 206A : E6; + 206B : 72; + 206C : 85; + 206D : 71; + 206E : A4; + 206F : 72; + 2070 : 20; + 2071 : 28; + 2072 : BA; + 2073 : A5; + 2074 : 71; + 2075 : A4; + 2076 : 72; + 2077 : 18; + 2078 : 69; + 2079 : 05; + 207A : 90; + 207B : 01; + 207C : C8; + 207D : 85; + 207E : 71; + 207F : 84; + 2080 : 72; + 2081 : 20; + 2082 : 67; + 2083 : B8; + 2084 : A9; + 2085 : 5C; + 2086 : A0; + 2087 : 00; + 2088 : C6; + 2089 : 67; + 208A : D0; + 208B : E4; + 208C : 60; + 208D : 98; + 208E : 35; + 208F : 44; + 2090 : 7A; + 2091 : 00; + 2092 : 68; + 2093 : 28; + 2094 : B1; + 2095 : 46; + 2096 : 00; + 2097 : 20; + 2098 : 2B; + 2099 : BC; + 209A : 30; + 209B : 37; + 209C : D0; + [209D..209E] : 20; + 209F : F3; + 20A0 : FF; + 20A1 : 86; + 20A2 : 22; + 20A3 : 84; + 20A4 : 23; + 20A5 : A0; + 20A6 : 04; + 20A7 : B1; + 20A8 : 22; + 20A9 : 85; + 20AA : 62; + 20AB : C8; + 20AC : B1; + 20AD : 22; + 20AE : 85; + 20AF : 64; + 20B0 : A0; + 20B1 : 08; + 20B2 : B1; + 20B3 : 22; + 20B4 : 85; + 20B5 : 63; + 20B6 : C8; + 20B7 : B1; + 20B8 : 22; + 20B9 : 85; + 20BA : 65; + 20BB : 4C; + 20BC : E3; + 20BD : E0; + 20BE : A9; + 20BF : 8B; + 20C0 : A0; + 20C1 : 00; + 20C2 : 20; + 20C3 : A2; + 20C4 : BB; + 20C5 : A9; + 20C6 : 8D; + 20C7 : A0; + 20C8 : E0; + 20C9 : 20; + 20CA : 28; + 20CB : BA; + 20CC : A9; + 20CD : 92; + 20CE : A0; + 20CF : E0; + 20D0 : 20; + 20D1 : 67; + 20D2 : B8; + 20D3 : A6; + 20D4 : 65; + 20D5 : A5; + 20D6 : 62; + 20D7 : 85; + 20D8 : 65; + 20D9 : 86; + 20DA : 62; + 20DB : A6; + 20DC : 63; + 20DD : A5; + 20DE : 64; + 20DF : 85; + 20E0 : 63; + 20E1 : 86; + 20E2 : 64; + 20E3 : A9; + 20E4 : 00; + 20E5 : 85; + 20E6 : 66; + 20E7 : A5; + 20E8 : 61; + 20E9 : 85; + 20EA : 70; + 20EB : A9; + 20EC : 80; + 20ED : 85; + 20EE : 61; + 20EF : 20; + 20F0 : D7; + 20F1 : B8; + 20F2 : A2; + 20F3 : 8B; + 20F4 : A0; + 20F5 : 00; + 20F6 : 4C; + 20F7 : D4; + 20F8 : BB; + 20F9 : C9; + 20FA : F0; + 20FB : D0; + 20FC : 07; + 20FD : 84; + 20FE : 38; + 20FF : 86; + 2100 : 37; + 2101 : 4C; + 2102 : 63; + 2103 : A6; + 2104 : AA; + 2105 : D0; + 2106 : 02; + 2107 : A2; + 2108 : 1E; + 2109 : 4C; + 210A : 37; + 210B : A4; + 210C : 20; + 210D : D2; + 210E : FF; + 210F : B0; + 2110 : E8; + 2111 : 60; + 2112 : 20; + 2113 : CF; + 2114 : FF; + 2115 : B0; + 2116 : E2; + 2117 : 60; + 2118 : 20; + 2119 : AD; + 211A : E4; + 211B : B0; + 211C : DC; + 211D : 60; + 211E : 20; + 211F : C6; + 2120 : FF; + 2121 : B0; + 2122 : D6; + 2123 : 60; + 2124 : 20; + 2125 : E4; + 2126 : FF; + 2127 : B0; + 2128 : D0; + 2129 : 60; + 212A : 20; + 212B : 8A; + 212C : AD; + 212D : 20; + 212E : F7; + 212F : B7; + 2130 : A9; + 2131 : E1; + 2132 : 48; + 2133 : A9; + 2134 : 46; + 2135 : 48; + 2136 : AD; + 2137 : 0F; + 2138 : 03; + 2139 : 48; + 213A : AD; + 213B : 0C; + 213C : 03; + 213D : AE; + 213E : 0D; + 213F : 03; + 2140 : AC; + 2141 : 0E; + 2142 : 03; + 2143 : 28; + 2144 : 6C; + 2145 : 14; + 2146 : 00; + 2147 : 08; + 2148 : 8D; + 2149 : 0C; + 214A : 03; + 214B : 8E; + 214C : 0D; + 214D : 03; + 214E : 8C; + 214F : 0E; + 2150 : 03; + 2151 : 68; + 2152 : 8D; + 2153 : 0F; + 2154 : 03; + 2155 : 60; + 2156 : 20; + 2157 : D4; + 2158 : E1; + 2159 : A6; + 215A : 2D; + 215B : A4; + 215C : 2E; + 215D : A9; + 215E : 2B; + 215F : 20; + 2160 : D8; + 2161 : FF; + 2162 : B0; + 2163 : 95; + 2164 : 60; + 2165 : A9; + 2166 : 01; + 2167 : 2C; + 2168 : A9; + 2169 : 00; + 216A : 85; + 216B : 0A; + 216C : 20; + 216D : D4; + 216E : E1; + 216F : A5; + 2170 : 0A; + 2171 : A6; + 2172 : 2B; + 2173 : A4; + 2174 : 2C; + 2175 : 20; + 2176 : D5; + 2177 : FF; + 2178 : B0; + 2179 : 57; + 217A : A5; + 217B : 0A; + 217C : F0; + 217D : 17; + 217E : A2; + 217F : 1C; + 2180 : 20; + 2181 : B7; + 2182 : FF; + 2183 : 29; + 2184 : 10; + 2185 : D0; + 2186 : 17; + 2187 : A5; + 2188 : 7A; + 2189 : C9; + 218A : 02; + 218B : F0; + 218C : 07; + 218D : A9; + 218E : 64; + 218F : A0; + 2190 : A3; + 2191 : 4C; + 2192 : 1E; + 2193 : AB; + 2194 : 60; + 2195 : 20; + 2196 : B7; + 2197 : FF; + 2198 : 29; + 2199 : BF; + 219A : F0; + 219B : 05; + 219C : A2; + 219D : 1D; + 219E : 4C; + 219F : 37; + 21A0 : A4; + 21A1 : A5; + 21A2 : 7B; + 21A3 : C9; + 21A4 : 02; + 21A5 : D0; + 21A6 : 0E; + 21A7 : 86; + 21A8 : 2D; + 21A9 : 84; + 21AA : 2E; + 21AB : A9; + 21AC : 76; + 21AD : A0; + 21AE : A3; + 21AF : 20; + 21B0 : 1E; + 21B1 : AB; + 21B2 : 4C; + 21B3 : 2A; + 21B4 : A5; + 21B5 : 20; + 21B6 : 8E; + 21B7 : A6; + 21B8 : 20; + 21B9 : 33; + 21BA : A5; + 21BB : 4C; + 21BC : 77; + 21BD : A6; + 21BE : 20; + 21BF : 19; + 21C0 : E2; + 21C1 : 20; + 21C2 : C0; + 21C3 : FF; + 21C4 : B0; + 21C5 : 0B; + 21C6 : 60; + 21C7 : 20; + 21C8 : 19; + 21C9 : E2; + 21CA : A5; + 21CB : 49; + 21CC : 20; + 21CD : C3; + 21CE : FF; + 21CF : 90; + 21D0 : C3; + 21D1 : 4C; + 21D2 : F9; + 21D3 : E0; + 21D4 : A9; + 21D5 : 00; + 21D6 : 20; + 21D7 : BD; + 21D8 : FF; + 21D9 : A2; + 21DA : 01; + 21DB : A0; + 21DC : 00; + 21DD : 20; + 21DE : BA; + 21DF : FF; + 21E0 : 20; + 21E1 : 06; + 21E2 : E2; + 21E3 : 20; + 21E4 : 57; + 21E5 : E2; + 21E6 : 20; + 21E7 : 06; + 21E8 : E2; + 21E9 : 20; + 21EA : 00; + 21EB : E2; + 21EC : A0; + 21ED : 00; + 21EE : 86; + 21EF : 49; + 21F0 : 20; + 21F1 : BA; + 21F2 : FF; + 21F3 : 20; + 21F4 : 06; + 21F5 : E2; + 21F6 : 20; + 21F7 : 00; + 21F8 : E2; + 21F9 : 8A; + 21FA : A8; + 21FB : A6; + 21FC : 49; + 21FD : 4C; + 21FE : BA; + 21FF : FF; + 2200 : 20; + 2201 : 0E; + 2202 : E2; + 2203 : 4C; + 2204 : 9E; + 2205 : B7; + 2206 : 20; + 2207 : 79; + 2208 : 00; + 2209 : D0; + 220A : 02; + [220B..220C] : 68; + 220D : 60; + 220E : 20; + 220F : FD; + 2210 : AE; + 2211 : 20; + 2212 : 79; + 2213 : 00; + 2214 : D0; + 2215 : F7; + 2216 : 4C; + 2217 : 08; + 2218 : AF; + 2219 : A9; + 221A : 00; + 221B : 20; + 221C : BD; + 221D : FF; + 221E : 20; + 221F : 11; + 2220 : E2; + 2221 : 20; + 2222 : 9E; + 2223 : B7; + 2224 : 86; + 2225 : 49; + 2226 : 8A; + 2227 : A2; + 2228 : 01; + 2229 : A0; + 222A : 00; + 222B : 20; + 222C : BA; + 222D : FF; + 222E : 20; + 222F : 06; + 2230 : E2; + 2231 : 20; + 2232 : 00; + 2233 : E2; + 2234 : 86; + 2235 : 4A; + 2236 : A0; + 2237 : 00; + 2238 : A5; + 2239 : 49; + 223A : E0; + 223B : 03; + 223C : 90; + 223D : 01; + 223E : 88; + 223F : 20; + 2240 : BA; + 2241 : FF; + 2242 : 20; + 2243 : 06; + 2244 : E2; + 2245 : 20; + 2246 : 00; + 2247 : E2; + 2248 : 8A; + 2249 : A8; + 224A : A6; + 224B : 4A; + 224C : A5; + 224D : 49; + 224E : 20; + 224F : BA; + 2250 : FF; + 2251 : 20; + 2252 : 06; + 2253 : E2; + 2254 : 20; + 2255 : 0E; + 2256 : E2; + 2257 : 20; + 2258 : 9E; + 2259 : AD; + 225A : 20; + 225B : A3; + 225C : B6; + 225D : A6; + 225E : 22; + 225F : A4; + 2260 : 23; + 2261 : 4C; + 2262 : BD; + 2263 : FF; + 2264 : A9; + 2265 : E0; + 2266 : A0; + 2267 : E2; + 2268 : 20; + 2269 : 67; + 226A : B8; + 226B : 20; + 226C : 0C; + 226D : BC; + 226E : A9; + 226F : E5; + 2270 : A0; + 2271 : E2; + 2272 : A6; + 2273 : 6E; + 2274 : 20; + 2275 : 07; + 2276 : BB; + 2277 : 20; + 2278 : 0C; + 2279 : BC; + 227A : 20; + 227B : CC; + 227C : BC; + 227D : A9; + 227E : 00; + 227F : 85; + 2280 : 6F; + 2281 : 20; + 2282 : 53; + 2283 : B8; + 2284 : A9; + 2285 : EA; + 2286 : A0; + 2287 : E2; + 2288 : 20; + 2289 : 50; + 228A : B8; + 228B : A5; + 228C : 66; + 228D : 48; + 228E : 10; + 228F : 0D; + 2290 : 20; + 2291 : 49; + 2292 : B8; + 2293 : A5; + 2294 : 66; + 2295 : 30; + 2296 : 09; + 2297 : A5; + 2298 : 12; + 2299 : 49; + 229A : FF; + 229B : 85; + 229C : 12; + 229D : 20; + 229E : B4; + 229F : BF; + 22A0 : A9; + 22A1 : EA; + 22A2 : A0; + 22A3 : E2; + 22A4 : 20; + 22A5 : 67; + 22A6 : B8; + 22A7 : 68; + 22A8 : 10; + 22A9 : 03; + 22AA : 20; + 22AB : B4; + 22AC : BF; + 22AD : A9; + 22AE : EF; + 22AF : A0; + 22B0 : E2; + 22B1 : 4C; + 22B2 : 43; + 22B3 : E0; + 22B4 : 20; + 22B5 : CA; + 22B6 : BB; + 22B7 : A9; + 22B8 : 00; + 22B9 : 85; + 22BA : 12; + 22BB : 20; + 22BC : 6B; + 22BD : E2; + 22BE : A2; + 22BF : 4E; + 22C0 : A0; + 22C1 : 00; + 22C2 : 20; + 22C3 : F6; + 22C4 : E0; + 22C5 : A9; + 22C6 : 57; + 22C7 : A0; + 22C8 : 00; + 22C9 : 20; + 22CA : A2; + 22CB : BB; + 22CC : A9; + 22CD : 00; + 22CE : 85; + 22CF : 66; + 22D0 : A5; + 22D1 : 12; + 22D2 : 20; + 22D3 : DC; + 22D4 : E2; + 22D5 : A9; + 22D6 : 4E; + 22D7 : A0; + 22D8 : 00; + 22D9 : 4C; + 22DA : 0F; + 22DB : BB; + 22DC : 48; + 22DD : 4C; + 22DE : 9D; + 22DF : E2; + 22E0 : 81; + 22E1 : 49; + 22E2 : 0F; + 22E3 : DA; + 22E4 : A2; + 22E5 : 83; + 22E6 : 49; + 22E7 : 0F; + 22E8 : DA; + 22E9 : A2; + 22EA : 7F; + [22EB..22EE] : 00; + 22EF : 05; + 22F0 : 84; + 22F1 : E6; + 22F2 : 1A; + 22F3 : 2D; + 22F4 : 1B; + 22F5 : 86; + 22F6 : 28; + 22F7 : 07; + 22F8 : FB; + 22F9 : F8; + 22FA : 87; + 22FB : 99; + 22FC : 68; + 22FD : 89; + 22FE : 01; + 22FF : 87; + 2300 : 23; + 2301 : 35; + 2302 : DF; + 2303 : E1; + 2304 : 86; + 2305 : A5; + 2306 : 5D; + 2307 : E7; + 2308 : 28; + 2309 : 83; + 230A : 49; + 230B : 0F; + 230C : DA; + 230D : A2; + 230E : A5; + 230F : 66; + 2310 : 48; + 2311 : 10; + 2312 : 03; + 2313 : 20; + 2314 : B4; + 2315 : BF; + 2316 : A5; + 2317 : 61; + 2318 : 48; + 2319 : C9; + 231A : 81; + 231B : 90; + 231C : 07; + 231D : A9; + 231E : BC; + 231F : A0; + 2320 : B9; + 2321 : 20; + 2322 : 0F; + 2323 : BB; + 2324 : A9; + 2325 : 3E; + 2326 : A0; + 2327 : E3; + 2328 : 20; + 2329 : 43; + 232A : E0; + 232B : 68; + 232C : C9; + 232D : 81; + 232E : 90; + 232F : 07; + 2330 : A9; + 2331 : E0; + 2332 : A0; + 2333 : E2; + 2334 : 20; + 2335 : 50; + 2336 : B8; + 2337 : 68; + 2338 : 10; + 2339 : 03; + 233A : 4C; + 233B : B4; + 233C : BF; + 233D : 60; + 233E : 0B; + 233F : 76; + 2340 : B3; + 2341 : 83; + 2342 : BD; + 2343 : D3; + 2344 : 79; + 2345 : 1E; + 2346 : F4; + 2347 : A6; + 2348 : F5; + 2349 : 7B; + 234A : 83; + 234B : FC; + 234C : B0; + 234D : 10; + 234E : 7C; + 234F : 0C; + 2350 : 1F; + 2351 : 67; + 2352 : CA; + 2353 : 7C; + 2354 : DE; + 2355 : 53; + 2356 : CB; + 2357 : C1; + 2358 : 7D; + 2359 : 14; + 235A : 64; + 235B : 70; + 235C : 4C; + 235D : 7D; + 235E : B7; + 235F : EA; + 2360 : 51; + 2361 : 7A; + 2362 : 7D; + 2363 : 63; + 2364 : 30; + 2365 : 88; + [2366..2367] : 7E; + 2368 : 92; + 2369 : 44; + 236A : 99; + 236B : 3A; + 236C : 7E; + 236D : 4C; + 236E : CC; + 236F : 91; + 2370 : C7; + 2371 : 7F; + [2372..2374] : AA; + 2375 : 13; + 2376 : 81; + [2377..237A] : 00; + 237B : 20; + 237C : CC; + 237D : FF; + 237E : A9; + 237F : 00; + 2380 : 85; + 2381 : 13; + 2382 : 20; + 2383 : 7A; + 2384 : A6; + 2385 : 58; + 2386 : A2; + 2387 : 80; + 2388 : 6C; + 2389 : 00; + 238A : 03; + 238B : 8A; + 238C : 30; + 238D : 03; + 238E : 4C; + 238F : 3A; + 2390 : A4; + 2391 : 4C; + 2392 : 74; + 2393 : A4; + 2394 : 20; + 2395 : 53; + 2396 : E4; + 2397 : 20; + 2398 : BF; + 2399 : E3; + 239A : 20; + 239B : 22; + 239C : E4; + 239D : A2; + 239E : FB; + 239F : 9A; + 23A0 : D0; + 23A1 : E4; + 23A2 : E6; + 23A3 : 7A; + 23A4 : D0; + 23A5 : 02; + 23A6 : E6; + 23A7 : 7B; + 23A8 : AD; + 23A9 : 60; + 23AA : EA; + 23AB : C9; + 23AC : 3A; + 23AD : B0; + 23AE : 0A; + 23AF : C9; + 23B0 : 20; + 23B1 : F0; + 23B2 : EF; + 23B3 : 38; + 23B4 : E9; + 23B5 : 30; + 23B6 : 38; + 23B7 : E9; + 23B8 : D0; + 23B9 : 60; + 23BA : 80; + 23BB : 4F; + 23BC : C7; + 23BD : 52; + 23BE : 58; + 23BF : A9; + 23C0 : 4C; + 23C1 : 85; + 23C2 : 54; + 23C3 : 8D; + 23C4 : 10; + 23C5 : 03; + 23C6 : A9; + 23C7 : 48; + 23C8 : A0; + 23C9 : B2; + 23CA : 8D; + 23CB : 11; + 23CC : 03; + 23CD : 8C; + 23CE : 12; + 23CF : 03; + 23D0 : A9; + 23D1 : 91; + 23D2 : A0; + 23D3 : B3; + 23D4 : 85; + 23D5 : 05; + 23D6 : 84; + 23D7 : 06; + 23D8 : A9; + 23D9 : AA; + 23DA : A0; + 23DB : B1; + 23DC : 85; + 23DD : 03; + 23DE : 84; + 23DF : 04; + 23E0 : A2; + 23E1 : 1C; + 23E2 : BD; + 23E3 : A2; + 23E4 : E3; + 23E5 : 95; + 23E6 : 73; + 23E7 : CA; + 23E8 : 10; + 23E9 : F8; + 23EA : A9; + 23EB : 03; + 23EC : 85; + 23ED : 53; + 23EE : A9; + 23EF : 00; + 23F0 : 85; + 23F1 : 68; + 23F2 : 85; + 23F3 : 13; + 23F4 : 85; + 23F5 : 18; + 23F6 : A2; + 23F7 : 01; + 23F8 : 8E; + 23F9 : FD; + 23FA : 01; + 23FB : 8E; + 23FC : FC; + 23FD : 01; + 23FE : A2; + 23FF : 19; + 2400 : 86; + 2401 : 16; + 2402 : 38; + 2403 : 20; + 2404 : 9C; + 2405 : FF; + 2406 : 86; + 2407 : 2B; + 2408 : 84; + 2409 : 2C; + 240A : 38; + 240B : 20; + 240C : 99; + 240D : FF; + 240E : 86; + 240F : 37; + 2410 : 84; + 2411 : 38; + 2412 : 86; + 2413 : 33; + 2414 : 84; + 2415 : 34; + 2416 : A0; + 2417 : 00; + 2418 : 98; + 2419 : 91; + 241A : 2B; + 241B : E6; + 241C : 2B; + 241D : D0; + 241E : 02; + 241F : E6; + 2420 : 2C; + 2421 : 60; + 2422 : A5; + 2423 : 2B; + 2424 : A4; + 2425 : 2C; + 2426 : 20; + 2427 : 08; + 2428 : A4; + 2429 : A9; + 242A : 73; + 242B : A0; + 242C : E4; + 242D : 20; + 242E : 1E; + 242F : AB; + 2430 : A5; + 2431 : 37; + 2432 : 38; + 2433 : E5; + 2434 : 2B; + 2435 : AA; + 2436 : A5; + 2437 : 38; + 2438 : E5; + 2439 : 2C; + 243A : 20; + 243B : CD; + 243C : BD; + 243D : A9; + 243E : 60; + 243F : A0; + 2440 : E4; + 2441 : 20; + 2442 : 1E; + 2443 : AB; + 2444 : 4C; + 2445 : 44; + 2446 : A6; + 2447 : 8B; + 2448 : E3; + 2449 : 2E; + 244A : F7; + 244B : 7C; + 244C : A5; + 244D : 1A; + 244E : A7; + 244F : E4; + 2450 : A7; + 2451 : 86; + 2452 : AE; + 2453 : A2; + 2454 : 0B; + 2455 : BD; + 2456 : 47; + 2457 : E4; + 2458 : 9D; + 2459 : 00; + 245A : 03; + 245B : CA; + 245C : 10; + 245D : F7; + 245E : 60; + 245F : 00; + 2460 : 20; + 2461 : 42; + 2462 : 41; + 2463 : 53; + 2464 : 49; + 2465 : 43; + 2466 : 20; + 2467 : 42; + 2468 : 59; + 2469 : 54; + 246A : 45; + 246B : 53; + 246C : 20; + 246D : 46; + 246E : 52; + [246F..2470] : 45; + 2471 : 0D; + 2472 : 00; + 2473 : 93; + 2474 : 0D; + [2475..2478] : 20; + [2479..247C] : 2A; + 247D : 20; + 247E : 43; + 247F : 4F; + [2480..2481] : 4D; + 2482 : 4F; + 2483 : 44; + 2484 : 4F; + 2485 : 52; + 2486 : 45; + 2487 : 20; + 2488 : 36; + 2489 : 34; + 248A : 20; + 248B : 42; + 248C : 41; + 248D : 53; + 248E : 49; + 248F : 43; + 2490 : 20; + 2491 : 56; + 2492 : 32; + 2493 : 20; + [2494..2497] : 2A; + [2498..2499] : 0D; + 249A : 20; + 249B : 36; + 249C : 34; + 249D : 4B; + 249E : 20; + 249F : 52; + 24A0 : 41; + 24A1 : 4D; + 24A2 : 20; + 24A3 : 53; + 24A4 : 59; + 24A5 : 53; + 24A6 : 54; + 24A7 : 45; + 24A8 : 4D; + [24A9..24AA] : 20; + 24AB : 00; + 24AC : 81; + 24AD : 48; + 24AE : 20; + 24AF : C9; + 24B0 : FF; + 24B1 : AA; + 24B2 : 68; + 24B3 : 90; + 24B4 : 01; + 24B5 : 8A; + 24B6 : 60; + [24B7..24D2] : 00; + 24D3 : 85; + [24D4..24D5] : A9; + 24D6 : 01; + 24D7 : 85; + 24D8 : AB; + 24D9 : 60; + 24DA : AD; + 24DB : 86; + 24DC : 02; + 24DD : 91; + 24DE : F3; + 24DF : 60; + 24E0 : 69; + 24E1 : 02; + 24E2 : A4; + 24E3 : 91; + 24E4 : C8; + 24E5 : D0; + 24E6 : 04; + 24E7 : C5; + 24E8 : A1; + 24E9 : D0; + 24EA : F7; + 24EB : 60; + 24EC : 19; + 24ED : 26; + 24EE : 44; + 24EF : 19; + 24F0 : 1A; + 24F1 : 11; + 24F2 : E8; + 24F3 : 0D; + 24F4 : 70; + 24F5 : 0C; + [24F6..24F7] : 06; + 24F8 : D1; + 24F9 : 02; + 24FA : 37; + 24FB : 01; + 24FC : AE; + 24FD : 00; + 24FE : 69; + 24FF : 00; + 2500 : A2; + 2501 : 00; + 2502 : A0; + 2503 : DC; + 2504 : 60; + 2505 : A2; + 2506 : 28; + 2507 : A0; + 2508 : 19; + 2509 : 60; + 250A : B0; + 250B : 07; + 250C : 86; + 250D : D6; + 250E : 84; + 250F : D3; + 2510 : 20; + 2511 : 6C; + 2512 : E5; + 2513 : A6; + 2514 : D6; + 2515 : A4; + 2516 : D3; + 2517 : 60; + 2518 : 20; + 2519 : A0; + 251A : E5; + 251B : A9; + 251C : 00; + 251D : 8D; + 251E : 91; + 251F : 02; + 2520 : 85; + 2521 : CF; + 2522 : A9; + 2523 : 48; + 2524 : 8D; + 2525 : 8F; + 2526 : 02; + 2527 : A9; + 2528 : EB; + 2529 : 8D; + 252A : 90; + 252B : 02; + 252C : A9; + 252D : 0A; + 252E : 8D; + 252F : 89; + 2530 : 02; + 2531 : 8D; + 2532 : 8C; + 2533 : 02; + 2534 : A9; + 2535 : 0E; + 2536 : 8D; + 2537 : 86; + 2538 : 02; + 2539 : A9; + 253A : 04; + 253B : 8D; + 253C : 8B; + 253D : 02; + 253E : A9; + 253F : 0C; + 2540 : 85; + 2541 : CD; + 2542 : 85; + 2543 : CC; + 2544 : AD; + 2545 : 88; + 2546 : 02; + 2547 : 09; + 2548 : 80; + 2549 : A8; + 254A : A9; + 254B : 00; + 254C : AA; + 254D : 94; + 254E : D9; + 254F : 18; + 2550 : 69; + 2551 : 28; + 2552 : 90; + 2553 : 01; + 2554 : C8; + 2555 : E8; + 2556 : E0; + 2557 : 1A; + 2558 : D0; + 2559 : F3; + 255A : A9; + 255B : FF; + 255C : 95; + 255D : D9; + 255E : A2; + 255F : 18; + 2560 : 20; + 2561 : FF; + 2562 : E9; + 2563 : CA; + 2564 : 10; + 2565 : FA; + 2566 : A0; + 2567 : 00; + 2568 : 84; + 2569 : D3; + 256A : 84; + 256B : D6; + 256C : A6; + 256D : D6; + 256E : A5; + 256F : D3; + 2570 : B4; + 2571 : D9; + 2572 : 30; + 2573 : 08; + 2574 : 18; + 2575 : 69; + 2576 : 28; + 2577 : 85; + 2578 : D3; + 2579 : CA; + 257A : 10; + 257B : F4; + 257C : 20; + 257D : F0; + 257E : E9; + 257F : A9; + 2580 : 27; + 2581 : E8; + 2582 : B4; + 2583 : D9; + 2584 : 30; + 2585 : 06; + 2586 : 18; + 2587 : 69; + 2588 : 28; + 2589 : E8; + 258A : 10; + 258B : F6; + 258C : 85; + 258D : D5; + 258E : 4C; + 258F : 24; + 2590 : EA; + 2591 : E4; + 2592 : C9; + 2593 : F0; + 2594 : 03; + 2595 : 4C; + 2596 : ED; + 2597 : E6; + 2598 : 60; + 2599 : EA; + 259A : 20; + 259B : A0; + 259C : E5; + 259D : 4C; + 259E : 66; + 259F : E5; + 25A0 : A9; + 25A1 : 03; + 25A2 : 85; + 25A3 : 9A; + 25A4 : A9; + 25A5 : 00; + 25A6 : 85; + 25A7 : 99; + 25A8 : A2; + 25A9 : 2F; + 25AA : BD; + 25AB : B8; + 25AC : EC; + 25AD : 9D; + 25AE : FF; + 25AF : CF; + 25B0 : CA; + 25B1 : D0; + 25B2 : F7; + 25B3 : 60; + 25B4 : AC; + 25B5 : 77; + 25B6 : 02; + 25B7 : A2; + 25B8 : 00; + 25B9 : BD; + 25BA : 78; + 25BB : 02; + 25BC : 9D; + 25BD : 77; + 25BE : 02; + 25BF : E8; + 25C0 : E4; + 25C1 : C6; + 25C2 : D0; + 25C3 : F5; + [25C4..25C5] : C6; + 25C6 : 98; + 25C7 : 58; + 25C8 : 18; + 25C9 : 60; + 25CA : 20; + 25CB : 16; + 25CC : E7; + 25CD : A5; + 25CE : C6; + 25CF : 85; + 25D0 : CC; + 25D1 : 8D; + 25D2 : 92; + 25D3 : 02; + 25D4 : F0; + 25D5 : F7; + 25D6 : 78; + 25D7 : A5; + 25D8 : CF; + 25D9 : F0; + 25DA : 0C; + 25DB : A5; + 25DC : CE; + 25DD : AE; + 25DE : 87; + 25DF : 02; + 25E0 : A0; + 25E1 : 00; + 25E2 : 84; + 25E3 : CF; + 25E4 : 20; + 25E5 : 13; + 25E6 : EA; + 25E7 : 20; + 25E8 : B4; + 25E9 : E5; + 25EA : C9; + 25EB : 83; + 25EC : D0; + 25ED : 10; + 25EE : A2; + 25EF : 09; + 25F0 : 78; + 25F1 : 86; + 25F2 : C6; + 25F3 : BD; + 25F4 : E6; + 25F5 : EC; + 25F6 : 9D; + 25F7 : 76; + 25F8 : 02; + 25F9 : CA; + 25FA : D0; + 25FB : F7; + 25FC : F0; + 25FD : CF; + 25FE : C9; + 25FF : 0D; + 2600 : D0; + 2601 : C8; + 2602 : A4; + 2603 : D5; + 2604 : 84; + 2605 : D0; + 2606 : B1; + 2607 : D1; + 2608 : C9; + 2609 : 20; + 260A : D0; + 260B : 03; + 260C : 88; + 260D : D0; + 260E : F7; + 260F : C8; + 2610 : 84; + 2611 : C8; + 2612 : A0; + 2613 : 00; + 2614 : 8C; + 2615 : 92; + 2616 : 02; + 2617 : 84; + 2618 : D3; + 2619 : 84; + 261A : D4; + 261B : A5; + 261C : C9; + 261D : 30; + 261E : 1B; + 261F : A6; + 2620 : D6; + 2621 : 20; + 2622 : 91; + 2623 : E5; + 2624 : E4; + 2625 : C9; + 2626 : D0; + 2627 : 12; + 2628 : A5; + 2629 : CA; + 262A : 85; + 262B : D3; + 262C : C5; + 262D : C8; + 262E : 90; + 262F : 0A; + 2630 : B0; + 2631 : 2B; + 2632 : 98; + 2633 : 48; + 2634 : 8A; + 2635 : 48; + 2636 : A5; + 2637 : D0; + 2638 : F0; + 2639 : 93; + 263A : A4; + 263B : D3; + 263C : B1; + 263D : D1; + 263E : 85; + 263F : D7; + 2640 : 29; + 2641 : 3F; + 2642 : 06; + 2643 : D7; + 2644 : 24; + 2645 : D7; + 2646 : 10; + 2647 : 02; + 2648 : 09; + 2649 : 80; + 264A : 90; + 264B : 04; + 264C : A6; + 264D : D4; + 264E : D0; + 264F : 04; + 2650 : 70; + 2651 : 02; + 2652 : 09; + 2653 : 40; + 2654 : E6; + 2655 : D3; + 2656 : 20; + 2657 : 84; + 2658 : E6; + 2659 : C4; + 265A : C8; + 265B : D0; + 265C : 17; + 265D : A9; + 265E : 00; + 265F : 85; + 2660 : D0; + 2661 : A9; + 2662 : 0D; + 2663 : A6; + 2664 : 99; + 2665 : E0; + 2666 : 03; + 2667 : F0; + 2668 : 06; + 2669 : A6; + 266A : 9A; + 266B : E0; + 266C : 03; + 266D : F0; + 266E : 03; + 266F : 20; + 2670 : 16; + 2671 : E7; + 2672 : A9; + 2673 : 0D; + 2674 : 85; + 2675 : D7; + 2676 : 68; + 2677 : AA; + 2678 : 68; + 2679 : A8; + 267A : A5; + 267B : D7; + 267C : C9; + 267D : DE; + 267E : D0; + 267F : 02; + 2680 : A9; + 2681 : FF; + 2682 : 18; + 2683 : 60; + 2684 : C9; + 2685 : 22; + 2686 : D0; + 2687 : 08; + 2688 : A5; + 2689 : D4; + 268A : 49; + 268B : 01; + 268C : 85; + 268D : D4; + 268E : A9; + 268F : 22; + 2690 : 60; + 2691 : 09; + 2692 : 40; + 2693 : A6; + 2694 : C7; + 2695 : F0; + 2696 : 02; + 2697 : 09; + 2698 : 80; + 2699 : A6; + 269A : D8; + 269B : F0; + 269C : 02; + 269D : C6; + 269E : D8; + 269F : AE; + 26A0 : 86; + 26A1 : 02; + 26A2 : 20; + 26A3 : 13; + 26A4 : EA; + 26A5 : 20; + 26A6 : B6; + 26A7 : E6; + 26A8 : 68; + 26A9 : A8; + 26AA : A5; + 26AB : D8; + 26AC : F0; + 26AD : 02; + 26AE : 46; + 26AF : D4; + 26B0 : 68; + 26B1 : AA; + 26B2 : 68; + 26B3 : 18; + 26B4 : 58; + 26B5 : 60; + 26B6 : 20; + 26B7 : B3; + 26B8 : E8; + 26B9 : E6; + 26BA : D3; + 26BB : A5; + 26BC : D5; + 26BD : C5; + 26BE : D3; + 26BF : B0; + 26C0 : 3F; + 26C1 : C9; + 26C2 : 4F; + 26C3 : F0; + 26C4 : 32; + 26C5 : AD; + 26C6 : 92; + 26C7 : 02; + 26C8 : F0; + 26C9 : 03; + 26CA : 4C; + 26CB : 67; + 26CC : E9; + 26CD : A6; + 26CE : D6; + 26CF : E0; + 26D0 : 19; + 26D1 : 90; + 26D2 : 07; + 26D3 : 20; + 26D4 : EA; + 26D5 : E8; + 26D6 : C6; + 26D7 : D6; + 26D8 : A6; + 26D9 : D6; + 26DA : 16; + 26DB : D9; + 26DC : 56; + 26DD : D9; + 26DE : E8; + 26DF : B5; + 26E0 : D9; + 26E1 : 09; + 26E2 : 80; + 26E3 : 95; + 26E4 : D9; + 26E5 : CA; + 26E6 : A5; + 26E7 : D5; + 26E8 : 18; + 26E9 : 69; + 26EA : 28; + 26EB : 85; + 26EC : D5; + 26ED : B5; + 26EE : D9; + 26EF : 30; + 26F0 : 03; + 26F1 : CA; + 26F2 : D0; + 26F3 : F9; + 26F4 : 4C; + 26F5 : F0; + 26F6 : E9; + 26F7 : C6; + 26F8 : D6; + 26F9 : 20; + 26FA : 7C; + 26FB : E8; + 26FC : A9; + 26FD : 00; + 26FE : 85; + 26FF : D3; + 2700 : 60; + 2701 : A6; + 2702 : D6; + 2703 : D0; + 2704 : 06; + 2705 : 86; + 2706 : D3; + [2707..2708] : 68; + 2709 : D0; + 270A : 9D; + 270B : CA; + 270C : 86; + 270D : D6; + 270E : 20; + 270F : 6C; + 2710 : E5; + 2711 : A4; + 2712 : D5; + 2713 : 84; + 2714 : D3; + 2715 : 60; + 2716 : 48; + 2717 : 85; + 2718 : D7; + 2719 : 8A; + 271A : 48; + 271B : 98; + 271C : 48; + 271D : A9; + 271E : 00; + 271F : 85; + 2720 : D0; + 2721 : A4; + 2722 : D3; + 2723 : A5; + 2724 : D7; + 2725 : 10; + 2726 : 03; + 2727 : 4C; + 2728 : D4; + 2729 : E7; + 272A : C9; + 272B : 0D; + 272C : D0; + 272D : 03; + 272E : 4C; + 272F : 91; + 2730 : E8; + 2731 : C9; + 2732 : 20; + 2733 : 90; + 2734 : 10; + 2735 : C9; + 2736 : 60; + 2737 : 90; + 2738 : 04; + 2739 : 29; + 273A : DF; + 273B : D0; + 273C : 02; + 273D : 29; + 273E : 3F; + 273F : 20; + 2740 : 84; + 2741 : E6; + 2742 : 4C; + 2743 : 93; + 2744 : E6; + 2745 : A6; + 2746 : D8; + 2747 : F0; + 2748 : 03; + 2749 : 4C; + 274A : 97; + 274B : E6; + 274C : C9; + 274D : 14; + 274E : D0; + 274F : 2E; + 2750 : 98; + 2751 : D0; + 2752 : 06; + 2753 : 20; + 2754 : 01; + 2755 : E7; + 2756 : 4C; + 2757 : 73; + 2758 : E7; + 2759 : 20; + 275A : A1; + 275B : E8; + 275C : 88; + 275D : 84; + 275E : D3; + 275F : 20; + 2760 : 24; + 2761 : EA; + 2762 : C8; + 2763 : B1; + 2764 : D1; + 2765 : 88; + 2766 : 91; + 2767 : D1; + 2768 : C8; + 2769 : B1; + 276A : F3; + 276B : 88; + 276C : 91; + 276D : F3; + 276E : C8; + 276F : C4; + 2770 : D5; + 2771 : D0; + 2772 : EF; + 2773 : A9; + 2774 : 20; + 2775 : 91; + 2776 : D1; + 2777 : AD; + 2778 : 86; + 2779 : 02; + 277A : 91; + 277B : F3; + 277C : 10; + 277D : 4D; + 277E : A6; + 277F : D4; + 2780 : F0; + 2781 : 03; + 2782 : 4C; + 2783 : 97; + 2784 : E6; + 2785 : C9; + 2786 : 12; + 2787 : D0; + 2788 : 02; + 2789 : 85; + 278A : C7; + 278B : C9; + 278C : 13; + 278D : D0; + 278E : 03; + 278F : 20; + 2790 : 66; + 2791 : E5; + 2792 : C9; + 2793 : 1D; + 2794 : D0; + 2795 : 17; + 2796 : C8; + 2797 : 20; + 2798 : B3; + 2799 : E8; + 279A : 84; + 279B : D3; + 279C : 88; + 279D : C4; + 279E : D5; + 279F : 90; + 27A0 : 09; + 27A1 : C6; + 27A2 : D6; + 27A3 : 20; + 27A4 : 7C; + 27A5 : E8; + 27A6 : A0; + 27A7 : 00; + 27A8 : 84; + 27A9 : D3; + 27AA : 4C; + 27AB : A8; + 27AC : E6; + 27AD : C9; + 27AE : 11; + 27AF : D0; + 27B0 : 1D; + 27B1 : 18; + 27B2 : 98; + 27B3 : 69; + 27B4 : 28; + 27B5 : A8; + 27B6 : E6; + 27B7 : D6; + 27B8 : C5; + 27B9 : D5; + 27BA : 90; + 27BB : EC; + 27BC : F0; + 27BD : EA; + 27BE : C6; + 27BF : D6; + 27C0 : E9; + 27C1 : 28; + 27C2 : 90; + 27C3 : 04; + 27C4 : 85; + 27C5 : D3; + 27C6 : D0; + 27C7 : F8; + 27C8 : 20; + 27C9 : 7C; + 27CA : E8; + 27CB : 4C; + 27CC : A8; + 27CD : E6; + 27CE : 20; + 27CF : CB; + 27D0 : E8; + 27D1 : 4C; + 27D2 : 44; + 27D3 : EC; + 27D4 : 29; + 27D5 : 7F; + 27D6 : C9; + 27D7 : 7F; + 27D8 : D0; + 27D9 : 02; + 27DA : A9; + 27DB : 5E; + 27DC : C9; + 27DD : 20; + 27DE : 90; + 27DF : 03; + 27E0 : 4C; + 27E1 : 91; + 27E2 : E6; + 27E3 : C9; + 27E4 : 0D; + 27E5 : D0; + 27E6 : 03; + 27E7 : 4C; + 27E8 : 91; + 27E9 : E8; + 27EA : A6; + 27EB : D4; + 27EC : D0; + 27ED : 3F; + 27EE : C9; + 27EF : 14; + 27F0 : D0; + 27F1 : 37; + 27F2 : A4; + 27F3 : D5; + 27F4 : B1; + 27F5 : D1; + 27F6 : C9; + 27F7 : 20; + 27F8 : D0; + 27F9 : 04; + 27FA : C4; + 27FB : D3; + 27FC : D0; + 27FD : 07; + 27FE : C0; + 27FF : 4F; + 2800 : F0; + 2801 : 24; + 2802 : 20; + 2803 : 65; + 2804 : E9; + 2805 : A4; + 2806 : D5; + 2807 : 20; + 2808 : 24; + 2809 : EA; + 280A : 88; + 280B : B1; + 280C : D1; + 280D : C8; + 280E : 91; + 280F : D1; + 2810 : 88; + 2811 : B1; + 2812 : F3; + 2813 : C8; + 2814 : 91; + 2815 : F3; + 2816 : 88; + 2817 : C4; + 2818 : D3; + 2819 : D0; + 281A : EF; + 281B : A9; + 281C : 20; + 281D : 91; + 281E : D1; + 281F : AD; + 2820 : 86; + 2821 : 02; + 2822 : 91; + 2823 : F3; + 2824 : E6; + 2825 : D8; + 2826 : 4C; + 2827 : A8; + 2828 : E6; + 2829 : A6; + 282A : D8; + 282B : F0; + 282C : 05; + 282D : 09; + 282E : 40; + 282F : 4C; + 2830 : 97; + 2831 : E6; + 2832 : C9; + 2833 : 11; + 2834 : D0; + 2835 : 16; + 2836 : A6; + 2837 : D6; + 2838 : F0; + 2839 : 37; + 283A : C6; + 283B : D6; + 283C : A5; + 283D : D3; + 283E : 38; + 283F : E9; + 2840 : 28; + 2841 : 90; + 2842 : 04; + 2843 : 85; + 2844 : D3; + 2845 : 10; + 2846 : 2A; + 2847 : 20; + 2848 : 6C; + 2849 : E5; + 284A : D0; + 284B : 25; + 284C : C9; + 284D : 12; + 284E : D0; + 284F : 04; + 2850 : A9; + 2851 : 00; + 2852 : 85; + 2853 : C7; + 2854 : C9; + 2855 : 1D; + 2856 : D0; + 2857 : 12; + 2858 : 98; + 2859 : F0; + 285A : 09; + 285B : 20; + 285C : A1; + 285D : E8; + 285E : 88; + 285F : 84; + 2860 : D3; + 2861 : 4C; + 2862 : A8; + 2863 : E6; + 2864 : 20; + 2865 : 01; + 2866 : E7; + 2867 : 4C; + 2868 : A8; + 2869 : E6; + 286A : C9; + 286B : 13; + 286C : D0; + 286D : 06; + 286E : 20; + 286F : 44; + 2870 : E5; + 2871 : 4C; + 2872 : A8; + 2873 : E6; + 2874 : 09; + 2875 : 80; + 2876 : 20; + 2877 : CB; + 2878 : E8; + 2879 : 4C; + 287A : 4F; + 287B : EC; + 287C : 46; + 287D : C9; + 287E : A6; + 287F : D6; + 2880 : E8; + 2881 : E0; + 2882 : 19; + 2883 : D0; + 2884 : 03; + 2885 : 20; + 2886 : EA; + 2887 : E8; + 2888 : B5; + 2889 : D9; + 288A : 10; + 288B : F4; + 288C : 86; + 288D : D6; + 288E : 4C; + 288F : 6C; + 2890 : E5; + 2891 : A2; + 2892 : 00; + 2893 : 86; + 2894 : D8; + 2895 : 86; + 2896 : C7; + 2897 : 86; + 2898 : D4; + 2899 : 86; + 289A : D3; + 289B : 20; + 289C : 7C; + 289D : E8; + 289E : 4C; + 289F : A8; + 28A0 : E6; + 28A1 : A2; + 28A2 : 02; + 28A3 : A9; + 28A4 : 00; + 28A5 : C5; + 28A6 : D3; + 28A7 : F0; + 28A8 : 07; + 28A9 : 18; + 28AA : 69; + 28AB : 28; + 28AC : CA; + 28AD : D0; + 28AE : F6; + 28AF : 60; + 28B0 : C6; + 28B1 : D6; + 28B2 : 60; + 28B3 : A2; + 28B4 : 02; + 28B5 : A9; + 28B6 : 27; + 28B7 : C5; + 28B8 : D3; + 28B9 : F0; + 28BA : 07; + 28BB : 18; + 28BC : 69; + 28BD : 28; + 28BE : CA; + 28BF : D0; + 28C0 : F6; + 28C1 : 60; + 28C2 : A6; + 28C3 : D6; + 28C4 : E0; + 28C5 : 19; + 28C6 : F0; + 28C7 : 02; + 28C8 : E6; + 28C9 : D6; + 28CA : 60; + 28CB : A2; + 28CC : 0F; + 28CD : DD; + 28CE : DA; + 28CF : E8; + 28D0 : F0; + 28D1 : 04; + 28D2 : CA; + 28D3 : 10; + 28D4 : F8; + 28D5 : 60; + 28D6 : 8E; + 28D7 : 86; + 28D8 : 02; + 28D9 : 60; + 28DA : 90; + 28DB : 05; + 28DC : 1C; + 28DD : 9F; + 28DE : 9C; + 28DF : 1E; + 28E0 : 1F; + 28E1 : 9E; + 28E2 : 81; + 28E3 : 95; + 28E4 : 96; + 28E5 : 97; + 28E6 : 98; + 28E7 : 99; + 28E8 : 9A; + 28E9 : 9B; + 28EA : A5; + 28EB : AC; + 28EC : 48; + 28ED : A5; + 28EE : AD; + 28EF : 48; + 28F0 : A5; + 28F1 : AE; + 28F2 : 48; + 28F3 : A5; + 28F4 : AF; + 28F5 : 48; + 28F6 : A2; + 28F7 : FF; + 28F8 : C6; + 28F9 : D6; + 28FA : C6; + 28FB : C9; + 28FC : CE; + 28FD : A5; + 28FE : 02; + 28FF : E8; + 2900 : 20; + 2901 : F0; + 2902 : E9; + 2903 : E0; + 2904 : 18; + 2905 : B0; + 2906 : 0C; + 2907 : BD; + 2908 : F1; + 2909 : EC; + 290A : 85; + 290B : AC; + 290C : B5; + 290D : DA; + 290E : 20; + 290F : C8; + 2910 : E9; + 2911 : 30; + 2912 : EC; + 2913 : 20; + 2914 : FF; + 2915 : E9; + 2916 : A2; + 2917 : 00; + 2918 : B5; + 2919 : D9; + 291A : 29; + 291B : 7F; + 291C : B4; + 291D : DA; + 291E : 10; + 291F : 02; + 2920 : 09; + 2921 : 80; + 2922 : 95; + 2923 : D9; + 2924 : E8; + 2925 : E0; + 2926 : 18; + 2927 : D0; + 2928 : EF; + 2929 : A5; + 292A : F1; + 292B : 09; + 292C : 80; + 292D : 85; + 292E : F1; + 292F : A5; + 2930 : D9; + 2931 : 10; + 2932 : C3; + 2933 : E6; + 2934 : D6; + 2935 : EE; + 2936 : A5; + 2937 : 02; + 2938 : A9; + 2939 : 7F; + 293A : 8D; + 293B : 00; + 293C : DC; + 293D : AD; + 293E : 01; + 293F : DC; + 2940 : C9; + 2941 : FB; + 2942 : 08; + 2943 : A9; + 2944 : 7F; + 2945 : 8D; + 2946 : 00; + 2947 : DC; + 2948 : 28; + 2949 : D0; + 294A : 0B; + 294B : A0; + 294C : 00; + 294D : EA; + 294E : CA; + 294F : D0; + 2950 : FC; + 2951 : 88; + 2952 : D0; + 2953 : F9; + 2954 : 84; + 2955 : C6; + 2956 : A6; + 2957 : D6; + 2958 : 68; + 2959 : 85; + 295A : AF; + 295B : 68; + 295C : 85; + 295D : AE; + 295E : 68; + 295F : 85; + 2960 : AD; + 2961 : 68; + 2962 : 85; + 2963 : AC; + 2964 : 60; + 2965 : A6; + 2966 : D6; + 2967 : E8; + 2968 : B5; + 2969 : D9; + 296A : 10; + 296B : FB; + 296C : 8E; + 296D : A5; + 296E : 02; + 296F : E0; + 2970 : 18; + 2971 : F0; + 2972 : 0E; + 2973 : 90; + 2974 : 0C; + 2975 : 20; + 2976 : EA; + 2977 : E8; + 2978 : AE; + 2979 : A5; + 297A : 02; + 297B : CA; + 297C : C6; + 297D : D6; + 297E : 4C; + 297F : DA; + 2980 : E6; + 2981 : A5; + 2982 : AC; + 2983 : 48; + 2984 : A5; + 2985 : AD; + 2986 : 48; + 2987 : A5; + 2988 : AE; + 2989 : 48; + 298A : A5; + 298B : AF; + 298C : 48; + 298D : A2; + 298E : 19; + 298F : CA; + 2990 : 20; + 2991 : F0; + 2992 : E9; + 2993 : EC; + 2994 : A5; + 2995 : 02; + 2996 : 90; + 2997 : 0E; + 2998 : F0; + 2999 : 0C; + 299A : BD; + 299B : EF; + 299C : EC; + 299D : 85; + 299E : AC; + 299F : B5; + 29A0 : D8; + 29A1 : 20; + 29A2 : C8; + 29A3 : E9; + 29A4 : 30; + 29A5 : E9; + 29A6 : 20; + 29A7 : FF; + 29A8 : E9; + 29A9 : A2; + 29AA : 17; + 29AB : EC; + 29AC : A5; + 29AD : 02; + 29AE : 90; + 29AF : 0F; + 29B0 : B5; + 29B1 : DA; + 29B2 : 29; + 29B3 : 7F; + 29B4 : B4; + 29B5 : D9; + 29B6 : 10; + 29B7 : 02; + 29B8 : 09; + 29B9 : 80; + 29BA : 95; + 29BB : DA; + 29BC : CA; + 29BD : D0; + 29BE : EC; + 29BF : AE; + 29C0 : A5; + 29C1 : 02; + 29C2 : 20; + 29C3 : DA; + 29C4 : E6; + 29C5 : 4C; + 29C6 : 58; + 29C7 : E9; + 29C8 : 29; + 29C9 : 03; + 29CA : 0D; + 29CB : 88; + 29CC : 02; + 29CD : 85; + 29CE : AD; + 29CF : 20; + 29D0 : E0; + 29D1 : E9; + 29D2 : A0; + 29D3 : 27; + 29D4 : B1; + 29D5 : AC; + 29D6 : 91; + 29D7 : D1; + 29D8 : B1; + 29D9 : AE; + 29DA : 91; + 29DB : F3; + 29DC : 88; + 29DD : 10; + 29DE : F5; + 29DF : 60; + 29E0 : 20; + 29E1 : 24; + 29E2 : EA; + 29E3 : A5; + 29E4 : AC; + 29E5 : 85; + 29E6 : AE; + 29E7 : A5; + 29E8 : AD; + 29E9 : 29; + 29EA : 03; + 29EB : 09; + 29EC : D8; + 29ED : 85; + 29EE : AF; + 29EF : 60; + 29F0 : BD; + 29F1 : F0; + 29F2 : EC; + 29F3 : 85; + 29F4 : D1; + 29F5 : B5; + 29F6 : D9; + 29F7 : 29; + 29F8 : 03; + 29F9 : 0D; + 29FA : 88; + 29FB : 02; + 29FC : 85; + 29FD : D2; + 29FE : 60; + 29FF : A0; + 2A00 : 27; + 2A01 : 20; + 2A02 : F0; + 2A03 : E9; + 2A04 : 20; + 2A05 : 24; + 2A06 : EA; + 2A07 : 20; + 2A08 : DA; + 2A09 : E4; + 2A0A : A9; + 2A0B : 20; + 2A0C : 91; + 2A0D : D1; + 2A0E : 88; + 2A0F : 10; + 2A10 : F6; + 2A11 : 60; + 2A12 : EA; + 2A13 : A8; + 2A14 : A9; + 2A15 : 02; + 2A16 : 85; + 2A17 : CD; + 2A18 : 20; + 2A19 : 24; + 2A1A : EA; + 2A1B : 98; + 2A1C : A4; + 2A1D : D3; + 2A1E : 91; + 2A1F : D1; + 2A20 : 8A; + 2A21 : 91; + 2A22 : F3; + 2A23 : 60; + 2A24 : A5; + 2A25 : D1; + 2A26 : 85; + 2A27 : F3; + 2A28 : A5; + 2A29 : D2; + 2A2A : 29; + 2A2B : 03; + 2A2C : 09; + 2A2D : D8; + 2A2E : 85; + 2A2F : F4; + 2A30 : 60; + 2A31 : 20; + 2A32 : EA; + 2A33 : FF; + 2A34 : A5; + 2A35 : CC; + 2A36 : D0; + 2A37 : 29; + 2A38 : C6; + 2A39 : CD; + 2A3A : D0; + 2A3B : 25; + 2A3C : A9; + 2A3D : 14; + 2A3E : 85; + 2A3F : CD; + 2A40 : A4; + 2A41 : D3; + 2A42 : 46; + 2A43 : CF; + 2A44 : AE; + 2A45 : 87; + 2A46 : 02; + 2A47 : B1; + 2A48 : D1; + 2A49 : B0; + 2A4A : 11; + 2A4B : E6; + 2A4C : CF; + 2A4D : 85; + 2A4E : CE; + 2A4F : 20; + 2A50 : 24; + 2A51 : EA; + 2A52 : B1; + 2A53 : F3; + 2A54 : 8D; + 2A55 : 87; + 2A56 : 02; + 2A57 : AE; + 2A58 : 86; + 2A59 : 02; + 2A5A : A5; + 2A5B : CE; + 2A5C : 49; + 2A5D : 80; + 2A5E : 20; + 2A5F : 1C; + 2A60 : EA; + 2A61 : A5; + 2A62 : 01; + 2A63 : 29; + 2A64 : 10; + 2A65 : F0; + 2A66 : 0A; + 2A67 : A0; + 2A68 : 00; + 2A69 : 84; + 2A6A : C0; + 2A6B : A5; + 2A6C : 01; + 2A6D : 09; + 2A6E : 20; + 2A6F : D0; + 2A70 : 08; + 2A71 : A5; + 2A72 : C0; + 2A73 : D0; + 2A74 : 06; + 2A75 : A5; + 2A76 : 01; + 2A77 : 29; + 2A78 : 1F; + 2A79 : 85; + 2A7A : 01; + 2A7B : 20; + 2A7C : 87; + 2A7D : EA; + 2A7E : AD; + 2A7F : 0D; + 2A80 : DC; + 2A81 : 68; + 2A82 : A8; + 2A83 : 68; + 2A84 : AA; + 2A85 : 68; + 2A86 : 40; + 2A87 : A9; + 2A88 : 00; + [2A89..2A8A] : 8D; + 2A8B : 02; + 2A8C : A0; + 2A8D : 40; + 2A8E : 84; + 2A8F : CB; + 2A90 : 8D; + 2A91 : 00; + 2A92 : DC; + 2A93 : AE; + 2A94 : 01; + 2A95 : DC; + 2A96 : E0; + 2A97 : FF; + 2A98 : F0; + 2A99 : 61; + 2A9A : A8; + 2A9B : A9; + 2A9C : 81; + 2A9D : 85; + 2A9E : F5; + 2A9F : A9; + 2AA0 : EB; + 2AA1 : 85; + 2AA2 : F6; + 2AA3 : A9; + 2AA4 : FE; + 2AA5 : 8D; + 2AA6 : 00; + 2AA7 : DC; + 2AA8 : A2; + 2AA9 : 08; + 2AAA : 48; + 2AAB : AD; + 2AAC : 01; + 2AAD : DC; + 2AAE : CD; + 2AAF : 01; + 2AB0 : DC; + 2AB1 : D0; + 2AB2 : F8; + 2AB3 : 4A; + 2AB4 : B0; + 2AB5 : 16; + 2AB6 : 48; + 2AB7 : B1; + 2AB8 : F5; + 2AB9 : C9; + 2ABA : 05; + 2ABB : B0; + 2ABC : 0C; + 2ABD : C9; + 2ABE : 03; + 2ABF : F0; + 2AC0 : 08; + 2AC1 : 0D; + 2AC2 : 8D; + 2AC3 : 02; + [2AC4..2AC5] : 8D; + 2AC6 : 02; + 2AC7 : 10; + 2AC8 : 02; + 2AC9 : 84; + 2ACA : CB; + 2ACB : 68; + 2ACC : C8; + 2ACD : C0; + 2ACE : 41; + 2ACF : B0; + 2AD0 : 0B; + 2AD1 : CA; + 2AD2 : D0; + 2AD3 : DF; + 2AD4 : 38; + 2AD5 : 68; + 2AD6 : 2A; + 2AD7 : 8D; + 2AD8 : 00; + 2AD9 : DC; + 2ADA : D0; + 2ADB : CC; + 2ADC : 68; + 2ADD : 6C; + 2ADE : 8F; + 2ADF : 02; + 2AE0 : A4; + 2AE1 : CB; + 2AE2 : B1; + 2AE3 : F5; + 2AE4 : AA; + 2AE5 : C4; + 2AE6 : C5; + 2AE7 : F0; + 2AE8 : 07; + 2AE9 : A0; + 2AEA : 10; + [2AEB..2AEC] : 8C; + 2AED : 02; + 2AEE : D0; + 2AEF : 36; + 2AF0 : 29; + 2AF1 : 7F; + 2AF2 : 2C; + 2AF3 : 8A; + 2AF4 : 02; + 2AF5 : 30; + 2AF6 : 16; + 2AF7 : 70; + 2AF8 : 49; + 2AF9 : C9; + 2AFA : 7F; + 2AFB : F0; + 2AFC : 29; + 2AFD : C9; + 2AFE : 14; + 2AFF : F0; + 2B00 : 0C; + 2B01 : C9; + 2B02 : 20; + 2B03 : F0; + 2B04 : 08; + 2B05 : C9; + 2B06 : 1D; + 2B07 : F0; + 2B08 : 04; + 2B09 : C9; + 2B0A : 11; + 2B0B : D0; + 2B0C : 35; + 2B0D : AC; + 2B0E : 8C; + 2B0F : 02; + 2B10 : F0; + 2B11 : 05; + 2B12 : CE; + 2B13 : 8C; + 2B14 : 02; + 2B15 : D0; + 2B16 : 2B; + 2B17 : CE; + 2B18 : 8B; + 2B19 : 02; + 2B1A : D0; + 2B1B : 26; + 2B1C : A0; + 2B1D : 04; + 2B1E : 8C; + 2B1F : 8B; + 2B20 : 02; + 2B21 : A4; + 2B22 : C6; + 2B23 : 88; + 2B24 : 10; + 2B25 : 1C; + 2B26 : A4; + 2B27 : CB; + 2B28 : 84; + 2B29 : C5; + 2B2A : AC; + 2B2B : 8D; + 2B2C : 02; + 2B2D : 8C; + 2B2E : 8E; + 2B2F : 02; + 2B30 : E0; + 2B31 : FF; + 2B32 : F0; + 2B33 : 0E; + 2B34 : 8A; + 2B35 : A6; + 2B36 : C6; + 2B37 : EC; + 2B38 : 89; + 2B39 : 02; + 2B3A : B0; + 2B3B : 06; + 2B3C : 9D; + 2B3D : 77; + 2B3E : 02; + 2B3F : E8; + 2B40 : 86; + 2B41 : C6; + 2B42 : A9; + 2B43 : 7F; + 2B44 : 8D; + 2B45 : 00; + 2B46 : DC; + 2B47 : 60; + 2B48 : AD; + 2B49 : 8D; + 2B4A : 02; + 2B4B : C9; + 2B4C : 03; + 2B4D : D0; + 2B4E : 15; + 2B4F : CD; + 2B50 : 8E; + 2B51 : 02; + 2B52 : F0; + 2B53 : EE; + 2B54 : AD; + 2B55 : 91; + 2B56 : 02; + 2B57 : 30; + 2B58 : 1D; + 2B59 : AD; + 2B5A : 18; + 2B5B : D0; + 2B5C : 49; + 2B5D : 02; + 2B5E : 8D; + 2B5F : 18; + 2B60 : D0; + 2B61 : 4C; + 2B62 : 76; + 2B63 : EB; + 2B64 : 0A; + 2B65 : C9; + 2B66 : 08; + 2B67 : 90; + 2B68 : 02; + 2B69 : A9; + 2B6A : 06; + 2B6B : AA; + 2B6C : BD; + 2B6D : 79; + 2B6E : EB; + 2B6F : 85; + 2B70 : F5; + 2B71 : BD; + 2B72 : 7A; + 2B73 : EB; + 2B74 : 85; + 2B75 : F6; + 2B76 : 4C; + 2B77 : E0; + 2B78 : EA; + 2B79 : 81; + 2B7A : EB; + 2B7B : C2; + 2B7C : EB; + 2B7D : 03; + 2B7E : EC; + 2B7F : 78; + 2B80 : EC; + 2B81 : 14; + 2B82 : 0D; + 2B83 : 1D; + 2B84 : 88; + 2B85 : 85; + 2B86 : 86; + 2B87 : 87; + 2B88 : 11; + 2B89 : 33; + 2B8A : 57; + 2B8B : 41; + 2B8C : 34; + 2B8D : 5A; + 2B8E : 53; + 2B8F : 45; + 2B90 : 01; + 2B91 : 35; + 2B92 : 52; + 2B93 : 44; + 2B94 : 36; + 2B95 : 43; + 2B96 : 46; + 2B97 : 54; + 2B98 : 58; + 2B99 : 37; + 2B9A : 59; + 2B9B : 47; + 2B9C : 38; + 2B9D : 42; + 2B9E : 48; + 2B9F : 55; + 2BA0 : 56; + 2BA1 : 39; + 2BA2 : 49; + 2BA3 : 4A; + 2BA4 : 30; + 2BA5 : 4D; + 2BA6 : 4B; + 2BA7 : 4F; + 2BA8 : 4E; + 2BA9 : 2B; + 2BAA : 50; + 2BAB : 4C; + 2BAC : 2D; + 2BAD : 2E; + 2BAE : 3A; + 2BAF : 40; + 2BB0 : 2C; + 2BB1 : 5C; + 2BB2 : 2A; + 2BB3 : 3B; + 2BB4 : 13; + 2BB5 : 01; + 2BB6 : 3D; + 2BB7 : 5E; + 2BB8 : 2F; + 2BB9 : 31; + 2BBA : 5F; + 2BBB : 04; + 2BBC : 32; + 2BBD : 20; + 2BBE : 02; + 2BBF : 51; + 2BC0 : 03; + 2BC1 : FF; + 2BC2 : 94; + 2BC3 : 8D; + 2BC4 : 9D; + 2BC5 : 8C; + 2BC6 : 89; + 2BC7 : 8A; + 2BC8 : 8B; + 2BC9 : 91; + 2BCA : 23; + 2BCB : D7; + 2BCC : C1; + 2BCD : 24; + 2BCE : DA; + 2BCF : D3; + 2BD0 : C5; + 2BD1 : 01; + 2BD2 : 25; + 2BD3 : D2; + 2BD4 : C4; + 2BD5 : 26; + 2BD6 : C3; + 2BD7 : C6; + 2BD8 : D4; + 2BD9 : D8; + 2BDA : 27; + 2BDB : D9; + 2BDC : C7; + 2BDD : 28; + 2BDE : C2; + 2BDF : C8; + 2BE0 : D5; + 2BE1 : D6; + 2BE2 : 29; + 2BE3 : C9; + 2BE4 : CA; + 2BE5 : 30; + 2BE6 : CD; + 2BE7 : CB; + 2BE8 : CF; + 2BE9 : CE; + 2BEA : DB; + 2BEB : D0; + 2BEC : CC; + 2BED : DD; + 2BEE : 3E; + 2BEF : 5B; + 2BF0 : BA; + 2BF1 : 3C; + 2BF2 : A9; + 2BF3 : C0; + 2BF4 : 5D; + 2BF5 : 93; + 2BF6 : 01; + 2BF7 : 3D; + 2BF8 : DE; + 2BF9 : 3F; + 2BFA : 21; + 2BFB : 5F; + 2BFC : 04; + 2BFD : 22; + 2BFE : A0; + 2BFF : 02; + 2C00 : D1; + 2C01 : 83; + 2C02 : FF; + 2C03 : 94; + 2C04 : 8D; + 2C05 : 9D; + 2C06 : 8C; + 2C07 : 89; + 2C08 : 8A; + 2C09 : 8B; + 2C0A : 91; + 2C0B : 96; + 2C0C : B3; + 2C0D : B0; + 2C0E : 97; + 2C0F : AD; + 2C10 : AE; + 2C11 : B1; + 2C12 : 01; + 2C13 : 98; + 2C14 : B2; + 2C15 : AC; + 2C16 : 99; + 2C17 : BC; + 2C18 : BB; + 2C19 : A3; + 2C1A : BD; + 2C1B : 9A; + 2C1C : B7; + 2C1D : A5; + 2C1E : 9B; + 2C1F : BF; + 2C20 : B4; + 2C21 : B8; + 2C22 : BE; + 2C23 : 29; + 2C24 : A2; + 2C25 : B5; + 2C26 : 30; + 2C27 : A7; + 2C28 : A1; + 2C29 : B9; + 2C2A : AA; + 2C2B : A6; + 2C2C : AF; + 2C2D : B6; + 2C2E : DC; + 2C2F : 3E; + 2C30 : 5B; + 2C31 : A4; + 2C32 : 3C; + 2C33 : A8; + 2C34 : DF; + 2C35 : 5D; + 2C36 : 93; + 2C37 : 01; + 2C38 : 3D; + 2C39 : DE; + 2C3A : 3F; + 2C3B : 81; + 2C3C : 5F; + 2C3D : 04; + 2C3E : 95; + 2C3F : A0; + 2C40 : 02; + 2C41 : AB; + 2C42 : 83; + 2C43 : FF; + 2C44 : C9; + 2C45 : 0E; + 2C46 : D0; + 2C47 : 07; + 2C48 : AD; + 2C49 : 18; + 2C4A : D0; + 2C4B : 09; + 2C4C : 02; + 2C4D : D0; + 2C4E : 09; + 2C4F : C9; + 2C50 : 8E; + 2C51 : D0; + 2C52 : 0B; + 2C53 : AD; + 2C54 : 18; + 2C55 : D0; + 2C56 : 29; + 2C57 : FD; + 2C58 : 8D; + 2C59 : 18; + 2C5A : D0; + 2C5B : 4C; + 2C5C : A8; + 2C5D : E6; + 2C5E : C9; + 2C5F : 08; + 2C60 : D0; + 2C61 : 07; + 2C62 : A9; + 2C63 : 80; + 2C64 : 0D; + 2C65 : 91; + 2C66 : 02; + 2C67 : 30; + 2C68 : 09; + 2C69 : C9; + 2C6A : 09; + 2C6B : D0; + 2C6C : EE; + 2C6D : A9; + 2C6E : 7F; + 2C6F : 2D; + 2C70 : 91; + 2C71 : 02; + 2C72 : 8D; + 2C73 : 91; + 2C74 : 02; + 2C75 : 4C; + 2C76 : A8; + 2C77 : E6; + [2C78..2C7F] : FF; + 2C80 : 1C; + 2C81 : 17; + 2C82 : 01; + 2C83 : 9F; + 2C84 : 1A; + 2C85 : 13; + 2C86 : 05; + 2C87 : FF; + 2C88 : 9C; + 2C89 : 12; + 2C8A : 04; + 2C8B : 1E; + 2C8C : 03; + 2C8D : 06; + 2C8E : 14; + 2C8F : 18; + 2C90 : 1F; + 2C91 : 19; + 2C92 : 07; + 2C93 : 9E; + 2C94 : 02; + 2C95 : 08; + 2C96 : 15; + 2C97 : 16; + 2C98 : 12; + 2C99 : 09; + 2C9A : 0A; + 2C9B : 92; + 2C9C : 0D; + 2C9D : 0B; + 2C9E : 0F; + 2C9F : 0E; + 2CA0 : FF; + 2CA1 : 10; + 2CA2 : 0C; + [2CA3..2CA4] : FF; + 2CA5 : 1B; + 2CA6 : 00; + 2CA7 : FF; + 2CA8 : 1C; + 2CA9 : FF; + 2CAA : 1D; + [2CAB..2CAC] : FF; + 2CAD : 1F; + 2CAE : 1E; + 2CAF : FF; + 2CB0 : 90; + 2CB1 : 06; + 2CB2 : FF; + 2CB3 : 05; + [2CB4..2CB5] : FF; + 2CB6 : 11; + [2CB7..2CB8] : FF; + [2CB9..2CC9] : 00; + 2CCA : 9B; + 2CCB : 37; + [2CCC..2CCE] : 00; + 2CCF : 08; + 2CD0 : 00; + 2CD1 : 14; + 2CD2 : 0F; + [2CD3..2CD8] : 00; + 2CD9 : 0E; + 2CDA : 06; + 2CDB : 01; + 2CDC : 02; + 2CDD : 03; + 2CDE : 04; + 2CDF : 00; + 2CE0 : 01; + 2CE1 : 02; + 2CE2 : 03; + 2CE3 : 04; + 2CE4 : 05; + 2CE5 : 06; + 2CE6 : 07; + 2CE7 : 4C; + 2CE8 : 4F; + 2CE9 : 41; + 2CEA : 44; + 2CEB : 0D; + 2CEC : 52; + 2CED : 55; + 2CEE : 4E; + 2CEF : 0D; + 2CF0 : 00; + 2CF1 : 28; + 2CF2 : 50; + 2CF3 : 78; + 2CF4 : A0; + 2CF5 : C8; + 2CF6 : F0; + 2CF7 : 18; + 2CF8 : 40; + 2CF9 : 68; + 2CFA : 90; + 2CFB : B8; + 2CFC : E0; + 2CFD : 08; + 2CFE : 30; + 2CFF : 58; + 2D00 : 80; + 2D01 : A8; + 2D02 : D0; + 2D03 : F8; + 2D04 : 20; + 2D05 : 48; + 2D06 : 70; + 2D07 : 98; + 2D08 : C0; + 2D09 : 09; + 2D0A : 40; + 2D0B : 2C; + 2D0C : 09; + [2D0D..2D0E] : 20; + 2D0F : A4; + 2D10 : F0; + 2D11 : 48; + 2D12 : 24; + 2D13 : 94; + 2D14 : 10; + 2D15 : 0A; + 2D16 : 38; + 2D17 : 66; + 2D18 : A3; + 2D19 : 20; + 2D1A : 40; + 2D1B : ED; + 2D1C : 46; + 2D1D : 94; + 2D1E : 46; + 2D1F : A3; + 2D20 : 68; + 2D21 : 85; + 2D22 : 95; + 2D23 : 78; + 2D24 : 20; + 2D25 : 97; + 2D26 : EE; + 2D27 : C9; + 2D28 : 3F; + 2D29 : D0; + 2D2A : 03; + 2D2B : 20; + 2D2C : 85; + 2D2D : EE; + 2D2E : AD; + 2D2F : 00; + 2D30 : DD; + 2D31 : 09; + 2D32 : 08; + 2D33 : 8D; + 2D34 : 00; + 2D35 : DD; + 2D36 : 78; + 2D37 : 20; + 2D38 : 8E; + 2D39 : EE; + 2D3A : 20; + 2D3B : 97; + 2D3C : EE; + 2D3D : 20; + 2D3E : B3; + 2D3F : EE; + 2D40 : 78; + 2D41 : 20; + 2D42 : 97; + 2D43 : EE; + 2D44 : 20; + 2D45 : A9; + 2D46 : EE; + 2D47 : B0; + 2D48 : 64; + 2D49 : 20; + 2D4A : 85; + 2D4B : EE; + 2D4C : 24; + 2D4D : A3; + 2D4E : 10; + 2D4F : 0A; + 2D50 : 20; + 2D51 : A9; + 2D52 : EE; + 2D53 : 90; + 2D54 : FB; + 2D55 : 20; + 2D56 : A9; + 2D57 : EE; + 2D58 : B0; + 2D59 : FB; + 2D5A : 20; + 2D5B : A9; + 2D5C : EE; + 2D5D : 90; + 2D5E : FB; + 2D5F : 20; + 2D60 : 8E; + 2D61 : EE; + 2D62 : A9; + 2D63 : 08; + 2D64 : 85; + 2D65 : A5; + 2D66 : AD; + 2D67 : 00; + 2D68 : DD; + 2D69 : CD; + 2D6A : 00; + 2D6B : DD; + 2D6C : D0; + 2D6D : F8; + 2D6E : 0A; + 2D6F : 90; + 2D70 : 3F; + 2D71 : 66; + 2D72 : 95; + 2D73 : B0; + 2D74 : 05; + 2D75 : 20; + 2D76 : A0; + 2D77 : EE; + 2D78 : D0; + 2D79 : 03; + 2D7A : 20; + 2D7B : 97; + 2D7C : EE; + 2D7D : 20; + 2D7E : 85; + 2D7F : EE; + [2D80..2D83] : EA; + 2D84 : AD; + 2D85 : 00; + 2D86 : DD; + 2D87 : 29; + 2D88 : DF; + 2D89 : 09; + 2D8A : 10; + 2D8B : 8D; + 2D8C : 00; + 2D8D : DD; + 2D8E : C6; + 2D8F : A5; + 2D90 : D0; + 2D91 : D4; + 2D92 : A9; + 2D93 : 04; + 2D94 : 8D; + 2D95 : 07; + 2D96 : DC; + 2D97 : A9; + 2D98 : 19; + 2D99 : 8D; + 2D9A : 0F; + 2D9B : DC; + 2D9C : AD; + 2D9D : 0D; + 2D9E : DC; + 2D9F : AD; + 2DA0 : 0D; + 2DA1 : DC; + 2DA2 : 29; + 2DA3 : 02; + 2DA4 : D0; + 2DA5 : 0A; + 2DA6 : 20; + 2DA7 : A9; + 2DA8 : EE; + 2DA9 : B0; + 2DAA : F4; + 2DAB : 58; + 2DAC : 60; + 2DAD : A9; + 2DAE : 80; + 2DAF : 2C; + 2DB0 : A9; + 2DB1 : 03; + 2DB2 : 20; + 2DB3 : 1C; + 2DB4 : FE; + 2DB5 : 58; + 2DB6 : 18; + 2DB7 : 90; + 2DB8 : 4A; + 2DB9 : 85; + 2DBA : 95; + 2DBB : 20; + 2DBC : 36; + 2DBD : ED; + 2DBE : AD; + 2DBF : 00; + 2DC0 : DD; + 2DC1 : 29; + 2DC2 : F7; + 2DC3 : 8D; + 2DC4 : 00; + 2DC5 : DD; + 2DC6 : 60; + 2DC7 : 85; + 2DC8 : 95; + 2DC9 : 20; + 2DCA : 36; + 2DCB : ED; + 2DCC : 78; + 2DCD : 20; + 2DCE : A0; + 2DCF : EE; + 2DD0 : 20; + 2DD1 : BE; + 2DD2 : ED; + 2DD3 : 20; + 2DD4 : 85; + 2DD5 : EE; + 2DD6 : 20; + 2DD7 : A9; + 2DD8 : EE; + 2DD9 : 30; + 2DDA : FB; + 2DDB : 58; + 2DDC : 60; + 2DDD : 24; + 2DDE : 94; + 2DDF : 30; + 2DE0 : 05; + 2DE1 : 38; + 2DE2 : 66; + 2DE3 : 94; + 2DE4 : D0; + 2DE5 : 05; + 2DE6 : 48; + 2DE7 : 20; + 2DE8 : 40; + 2DE9 : ED; + 2DEA : 68; + 2DEB : 85; + 2DEC : 95; + 2DED : 18; + 2DEE : 60; + 2DEF : 78; + 2DF0 : 20; + 2DF1 : 8E; + 2DF2 : EE; + 2DF3 : AD; + 2DF4 : 00; + 2DF5 : DD; + 2DF6 : 09; + 2DF7 : 08; + 2DF8 : 8D; + 2DF9 : 00; + 2DFA : DD; + 2DFB : A9; + 2DFC : 5F; + 2DFD : 2C; + 2DFE : A9; + 2DFF : 3F; + 2E00 : 20; + 2E01 : 11; + 2E02 : ED; + 2E03 : 20; + 2E04 : BE; + 2E05 : ED; + 2E06 : 8A; + 2E07 : A2; + 2E08 : 0A; + 2E09 : CA; + 2E0A : D0; + 2E0B : FD; + 2E0C : AA; + 2E0D : 20; + 2E0E : 85; + 2E0F : EE; + 2E10 : 4C; + 2E11 : 97; + 2E12 : EE; + 2E13 : 78; + 2E14 : A9; + 2E15 : 00; + 2E16 : 85; + 2E17 : A5; + 2E18 : 20; + 2E19 : 85; + 2E1A : EE; + 2E1B : 20; + 2E1C : A9; + 2E1D : EE; + 2E1E : 10; + 2E1F : FB; + 2E20 : A9; + 2E21 : 01; + 2E22 : 8D; + 2E23 : 07; + 2E24 : DC; + 2E25 : A9; + 2E26 : 19; + 2E27 : 8D; + 2E28 : 0F; + 2E29 : DC; + 2E2A : 20; + 2E2B : 97; + 2E2C : EE; + 2E2D : AD; + 2E2E : 0D; + 2E2F : DC; + 2E30 : AD; + 2E31 : 0D; + 2E32 : DC; + 2E33 : 29; + 2E34 : 02; + 2E35 : D0; + 2E36 : 07; + 2E37 : 20; + 2E38 : A9; + 2E39 : EE; + 2E3A : 30; + 2E3B : F4; + 2E3C : 10; + 2E3D : 18; + [2E3E..2E3F] : A5; + 2E40 : F0; + 2E41 : 05; + 2E42 : A9; + 2E43 : 02; + 2E44 : 4C; + 2E45 : B2; + 2E46 : ED; + 2E47 : 20; + 2E48 : A0; + 2E49 : EE; + 2E4A : 20; + 2E4B : 85; + 2E4C : EE; + 2E4D : A9; + 2E4E : 40; + 2E4F : 20; + 2E50 : 1C; + 2E51 : FE; + 2E52 : E6; + 2E53 : A5; + 2E54 : D0; + 2E55 : CA; + 2E56 : A9; + 2E57 : 08; + 2E58 : 85; + 2E59 : A5; + 2E5A : AD; + 2E5B : 00; + 2E5C : DD; + 2E5D : CD; + 2E5E : 00; + 2E5F : DD; + 2E60 : D0; + 2E61 : F8; + 2E62 : 0A; + 2E63 : 10; + 2E64 : F5; + 2E65 : 66; + 2E66 : A4; + 2E67 : AD; + 2E68 : 00; + 2E69 : DD; + 2E6A : CD; + 2E6B : 00; + 2E6C : DD; + 2E6D : D0; + 2E6E : F8; + 2E6F : 0A; + 2E70 : 30; + 2E71 : F5; + 2E72 : C6; + 2E73 : A5; + 2E74 : D0; + 2E75 : E4; + 2E76 : 20; + 2E77 : A0; + 2E78 : EE; + 2E79 : 24; + 2E7A : 90; + 2E7B : 50; + 2E7C : 03; + 2E7D : 20; + 2E7E : 06; + 2E7F : EE; + 2E80 : A5; + 2E81 : A4; + 2E82 : 58; + 2E83 : 18; + 2E84 : 60; + 2E85 : AD; + 2E86 : 00; + 2E87 : DD; + 2E88 : 29; + 2E89 : EF; + 2E8A : 8D; + 2E8B : 00; + 2E8C : DD; + 2E8D : 60; + 2E8E : AD; + 2E8F : 00; + 2E90 : DD; + 2E91 : 09; + 2E92 : 10; + 2E93 : 8D; + 2E94 : 00; + 2E95 : DD; + 2E96 : 60; + 2E97 : AD; + 2E98 : 00; + 2E99 : DD; + 2E9A : 29; + 2E9B : DF; + 2E9C : 8D; + 2E9D : 00; + 2E9E : DD; + 2E9F : 60; + 2EA0 : AD; + 2EA1 : 00; + 2EA2 : DD; + 2EA3 : 09; + 2EA4 : 20; + 2EA5 : 8D; + 2EA6 : 00; + 2EA7 : DD; + 2EA8 : 60; + 2EA9 : AD; + 2EAA : 00; + 2EAB : DD; + 2EAC : CD; + 2EAD : 00; + 2EAE : DD; + 2EAF : D0; + 2EB0 : F8; + 2EB1 : 0A; + 2EB2 : 60; + 2EB3 : 8A; + 2EB4 : A2; + 2EB5 : B8; + 2EB6 : CA; + 2EB7 : D0; + 2EB8 : FD; + 2EB9 : AA; + 2EBA : 60; + 2EBB : A5; + 2EBC : B4; + 2EBD : F0; + 2EBE : 47; + 2EBF : 30; + 2EC0 : 3F; + 2EC1 : 46; + 2EC2 : B6; + 2EC3 : A2; + 2EC4 : 00; + 2EC5 : 90; + 2EC6 : 01; + 2EC7 : CA; + 2EC8 : 8A; + 2EC9 : 45; + 2ECA : BD; + 2ECB : 85; + 2ECC : BD; + 2ECD : C6; + 2ECE : B4; + 2ECF : F0; + 2ED0 : 06; + 2ED1 : 8A; + 2ED2 : 29; + 2ED3 : 04; + 2ED4 : 85; + 2ED5 : B5; + 2ED6 : 60; + 2ED7 : A9; + 2ED8 : 20; + 2ED9 : 2C; + 2EDA : 94; + 2EDB : 02; + 2EDC : F0; + 2EDD : 14; + 2EDE : 30; + 2EDF : 1C; + 2EE0 : 70; + 2EE1 : 14; + 2EE2 : A5; + 2EE3 : BD; + 2EE4 : D0; + 2EE5 : 01; + 2EE6 : CA; + 2EE7 : C6; + 2EE8 : B4; + 2EE9 : AD; + 2EEA : 93; + 2EEB : 02; + 2EEC : 10; + 2EED : E3; + 2EEE : C6; + 2EEF : B4; + 2EF0 : D0; + 2EF1 : DF; + 2EF2 : E6; + 2EF3 : B4; + 2EF4 : D0; + 2EF5 : F0; + 2EF6 : A5; + 2EF7 : BD; + 2EF8 : F0; + 2EF9 : ED; + 2EFA : D0; + 2EFB : EA; + 2EFC : 70; + 2EFD : E9; + 2EFE : 50; + [2EFF..2F00] : E6; + 2F01 : B4; + 2F02 : A2; + 2F03 : FF; + 2F04 : D0; + 2F05 : CB; + 2F06 : AD; + 2F07 : 94; + 2F08 : 02; + 2F09 : 4A; + 2F0A : 90; + 2F0B : 07; + 2F0C : 2C; + 2F0D : 01; + 2F0E : DD; + 2F0F : 10; + 2F10 : 1D; + 2F11 : 50; + 2F12 : 1E; + 2F13 : A9; + 2F14 : 00; + 2F15 : 85; + 2F16 : BD; + 2F17 : 85; + 2F18 : B5; + 2F19 : AE; + 2F1A : 98; + 2F1B : 02; + 2F1C : 86; + 2F1D : B4; + 2F1E : AC; + 2F1F : 9D; + 2F20 : 02; + 2F21 : CC; + 2F22 : 9E; + 2F23 : 02; + 2F24 : F0; + 2F25 : 13; + 2F26 : B1; + 2F27 : F9; + 2F28 : 85; + 2F29 : B6; + 2F2A : EE; + 2F2B : 9D; + 2F2C : 02; + 2F2D : 60; + 2F2E : A9; + 2F2F : 40; + 2F30 : 2C; + 2F31 : A9; + 2F32 : 10; + 2F33 : 0D; + 2F34 : 97; + 2F35 : 02; + 2F36 : 8D; + 2F37 : 97; + 2F38 : 02; + 2F39 : A9; + 2F3A : 01; + 2F3B : 8D; + 2F3C : 0D; + 2F3D : DD; + 2F3E : 4D; + 2F3F : A1; + 2F40 : 02; + 2F41 : 09; + 2F42 : 80; + 2F43 : 8D; + 2F44 : A1; + 2F45 : 02; + 2F46 : 8D; + 2F47 : 0D; + 2F48 : DD; + 2F49 : 60; + 2F4A : A2; + 2F4B : 09; + 2F4C : A9; + 2F4D : 20; + 2F4E : 2C; + 2F4F : 93; + 2F50 : 02; + 2F51 : F0; + 2F52 : 01; + 2F53 : CA; + 2F54 : 50; + 2F55 : 02; + [2F56..2F57] : CA; + 2F58 : 60; + 2F59 : A6; + 2F5A : A9; + 2F5B : D0; + 2F5C : 33; + 2F5D : C6; + 2F5E : A8; + 2F5F : F0; + 2F60 : 36; + 2F61 : 30; + 2F62 : 0D; + 2F63 : A5; + 2F64 : A7; + 2F65 : 45; + 2F66 : AB; + 2F67 : 85; + 2F68 : AB; + 2F69 : 46; + 2F6A : A7; + 2F6B : 66; + 2F6C : AA; + 2F6D : 60; + 2F6E : C6; + 2F6F : A8; + 2F70 : A5; + 2F71 : A7; + 2F72 : F0; + 2F73 : 67; + 2F74 : AD; + 2F75 : 93; + 2F76 : 02; + 2F77 : 0A; + 2F78 : A9; + 2F79 : 01; + 2F7A : 65; + 2F7B : A8; + 2F7C : D0; + 2F7D : EF; + 2F7E : A9; + 2F7F : 90; + 2F80 : 8D; + 2F81 : 0D; + 2F82 : DD; + 2F83 : 0D; + 2F84 : A1; + 2F85 : 02; + 2F86 : 8D; + 2F87 : A1; + 2F88 : 02; + 2F89 : 85; + [2F8A..2F8B] : A9; + 2F8C : 02; + 2F8D : 4C; + 2F8E : 3B; + 2F8F : EF; + 2F90 : A5; + 2F91 : A7; + 2F92 : D0; + 2F93 : EA; + 2F94 : 4C; + 2F95 : D3; + 2F96 : E4; + 2F97 : AC; + 2F98 : 9B; + 2F99 : 02; + 2F9A : C8; + 2F9B : CC; + 2F9C : 9C; + 2F9D : 02; + 2F9E : F0; + 2F9F : 2A; + 2FA0 : 8C; + 2FA1 : 9B; + 2FA2 : 02; + 2FA3 : 88; + 2FA4 : A5; + 2FA5 : AA; + 2FA6 : AE; + 2FA7 : 98; + 2FA8 : 02; + 2FA9 : E0; + 2FAA : 09; + 2FAB : F0; + 2FAC : 04; + 2FAD : 4A; + 2FAE : E8; + 2FAF : D0; + 2FB0 : F8; + 2FB1 : 91; + 2FB2 : F7; + 2FB3 : A9; + 2FB4 : 20; + 2FB5 : 2C; + 2FB6 : 94; + 2FB7 : 02; + 2FB8 : F0; + 2FB9 : B4; + 2FBA : 30; + 2FBB : B1; + 2FBC : A5; + 2FBD : A7; + 2FBE : 45; + 2FBF : AB; + 2FC0 : F0; + 2FC1 : 03; + 2FC2 : 70; + 2FC3 : A9; + 2FC4 : 2C; + 2FC5 : 50; + 2FC6 : A6; + 2FC7 : A9; + 2FC8 : 01; + 2FC9 : 2C; + 2FCA : A9; + 2FCB : 04; + 2FCC : 2C; + 2FCD : A9; + 2FCE : 80; + 2FCF : 2C; + 2FD0 : A9; + 2FD1 : 02; + 2FD2 : 0D; + 2FD3 : 97; + 2FD4 : 02; + 2FD5 : 8D; + 2FD6 : 97; + 2FD7 : 02; + 2FD8 : 4C; + 2FD9 : 7E; + 2FDA : EF; + 2FDB : A5; + 2FDC : AA; + 2FDD : D0; + 2FDE : F1; + 2FDF : F0; + 2FE0 : EC; + 2FE1 : 85; + 2FE2 : 9A; + 2FE3 : AD; + 2FE4 : 94; + 2FE5 : 02; + 2FE6 : 4A; + 2FE7 : 90; + 2FE8 : 29; + 2FE9 : A9; + 2FEA : 02; + 2FEB : 2C; + 2FEC : 01; + 2FED : DD; + 2FEE : 10; + 2FEF : 1D; + 2FF0 : D0; + 2FF1 : 20; + 2FF2 : AD; + 2FF3 : A1; + 2FF4 : 02; + 2FF5 : 29; + 2FF6 : 02; + 2FF7 : D0; + 2FF8 : F9; + 2FF9 : 2C; + 2FFA : 01; + 2FFB : DD; + 2FFC : 70; + 2FFD : FB; + 2FFE : AD; + 2FFF : 01; + 3000 : DD; + 3001 : 09; + 3002 : 02; + 3003 : 8D; + 3004 : 01; + 3005 : DD; + 3006 : 2C; + 3007 : 01; + 3008 : DD; + 3009 : 70; + 300A : 07; + 300B : 30; + 300C : F9; + 300D : A9; + 300E : 40; + 300F : 8D; + 3010 : 97; + 3011 : 02; + 3012 : 18; + 3013 : 60; + 3014 : 20; + 3015 : 28; + 3016 : F0; + 3017 : AC; + 3018 : 9E; + 3019 : 02; + 301A : C8; + 301B : CC; + 301C : 9D; + 301D : 02; + 301E : F0; + 301F : F4; + 3020 : 8C; + 3021 : 9E; + 3022 : 02; + 3023 : 88; + 3024 : A5; + 3025 : 9E; + 3026 : 91; + 3027 : F9; + 3028 : AD; + 3029 : A1; + 302A : 02; + 302B : 4A; + 302C : B0; + 302D : 1E; + 302E : A9; + 302F : 10; + 3030 : 8D; + 3031 : 0E; + 3032 : DD; + 3033 : AD; + 3034 : 99; + 3035 : 02; + 3036 : 8D; + 3037 : 04; + 3038 : DD; + 3039 : AD; + 303A : 9A; + 303B : 02; + 303C : 8D; + 303D : 05; + 303E : DD; + 303F : A9; + 3040 : 81; + 3041 : 20; + 3042 : 3B; + 3043 : EF; + 3044 : 20; + 3045 : 06; + 3046 : EF; + 3047 : A9; + 3048 : 11; + 3049 : 8D; + 304A : 0E; + 304B : DD; + 304C : 60; + 304D : 85; + 304E : 99; + 304F : AD; + 3050 : 94; + 3051 : 02; + 3052 : 4A; + 3053 : 90; + 3054 : 28; + 3055 : 29; + 3056 : 08; + 3057 : F0; + 3058 : 24; + 3059 : A9; + 305A : 02; + 305B : 2C; + 305C : 01; + 305D : DD; + 305E : 10; + 305F : AD; + 3060 : F0; + 3061 : 22; + 3062 : AD; + 3063 : A1; + 3064 : 02; + 3065 : 4A; + 3066 : B0; + 3067 : FA; + 3068 : AD; + 3069 : 01; + 306A : DD; + 306B : 29; + 306C : FD; + 306D : 8D; + 306E : 01; + 306F : DD; + 3070 : AD; + 3071 : 01; + 3072 : DD; + 3073 : 29; + 3074 : 04; + 3075 : F0; + 3076 : F9; + 3077 : A9; + 3078 : 90; + 3079 : 18; + 307A : 4C; + 307B : 3B; + 307C : EF; + 307D : AD; + 307E : A1; + 307F : 02; + 3080 : 29; + 3081 : 12; + 3082 : F0; + 3083 : F3; + 3084 : 18; + 3085 : 60; + 3086 : AD; + 3087 : 97; + 3088 : 02; + 3089 : AC; + 308A : 9C; + 308B : 02; + 308C : CC; + 308D : 9B; + 308E : 02; + 308F : F0; + 3090 : 0B; + 3091 : 29; + 3092 : F7; + 3093 : 8D; + 3094 : 97; + 3095 : 02; + 3096 : B1; + 3097 : F7; + 3098 : EE; + 3099 : 9C; + 309A : 02; + 309B : 60; + 309C : 09; + 309D : 08; + 309E : 8D; + 309F : 97; + 30A0 : 02; + 30A1 : A9; + 30A2 : 00; + 30A3 : 60; + 30A4 : 48; + 30A5 : AD; + 30A6 : A1; + 30A7 : 02; + 30A8 : F0; + 30A9 : 11; + 30AA : AD; + 30AB : A1; + 30AC : 02; + 30AD : 29; + 30AE : 03; + 30AF : D0; + 30B0 : F9; + 30B1 : A9; + 30B2 : 10; + 30B3 : 8D; + 30B4 : 0D; + 30B5 : DD; + 30B6 : A9; + 30B7 : 00; + 30B8 : 8D; + 30B9 : A1; + 30BA : 02; + 30BB : 68; + 30BC : 60; + 30BD : 0D; + 30BE : 49; + 30BF : 2F; + 30C0 : 4F; + 30C1 : 20; + 30C2 : 45; + [30C3..30C4] : 52; + 30C5 : 4F; + 30C6 : 52; + 30C7 : 20; + 30C8 : A3; + 30C9 : 0D; + 30CA : 53; + 30CB : 45; + 30CC : 41; + 30CD : 52; + 30CE : 43; + 30CF : 48; + 30D0 : 49; + 30D1 : 4E; + 30D2 : 47; + 30D3 : A0; + 30D4 : 46; + 30D5 : 4F; + 30D6 : 52; + 30D7 : A0; + 30D8 : 0D; + 30D9 : 50; + 30DA : 52; + 30DB : 45; + [30DC..30DD] : 53; + 30DE : 20; + 30DF : 50; + 30E0 : 4C; + 30E1 : 41; + 30E2 : 59; + 30E3 : 20; + 30E4 : 4F; + 30E5 : 4E; + 30E6 : 20; + 30E7 : 54; + 30E8 : 41; + 30E9 : 50; + 30EA : C5; + 30EB : 50; + 30EC : 52; + 30ED : 45; + [30EE..30EF] : 53; + 30F0 : 20; + 30F1 : 52; + 30F2 : 45; + 30F3 : 43; + 30F4 : 4F; + 30F5 : 52; + 30F6 : 44; + 30F7 : 20; + 30F8 : 26; + 30F9 : 20; + 30FA : 50; + 30FB : 4C; + 30FC : 41; + 30FD : 59; + 30FE : 20; + 30FF : 4F; + 3100 : 4E; + 3101 : 20; + 3102 : 54; + 3103 : 41; + 3104 : 50; + 3105 : C5; + 3106 : 0D; + 3107 : 4C; + 3108 : 4F; + 3109 : 41; + 310A : 44; + 310B : 49; + 310C : 4E; + 310D : C7; + 310E : 0D; + 310F : 53; + 3110 : 41; + 3111 : 56; + 3112 : 49; + 3113 : 4E; + 3114 : 47; + 3115 : A0; + 3116 : 0D; + 3117 : 56; + 3118 : 45; + 3119 : 52; + 311A : 49; + 311B : 46; + 311C : 59; + 311D : 49; + 311E : 4E; + 311F : C7; + 3120 : 0D; + 3121 : 46; + 3122 : 4F; + 3123 : 55; + 3124 : 4E; + 3125 : 44; + 3126 : A0; + 3127 : 0D; + 3128 : 4F; + 3129 : 4B; + 312A : 8D; + 312B : 24; + 312C : 9D; + 312D : 10; + 312E : 0D; + 312F : B9; + 3130 : BD; + 3131 : F0; + 3132 : 08; + 3133 : 29; + 3134 : 7F; + 3135 : 20; + 3136 : D2; + 3137 : FF; + 3138 : C8; + 3139 : 28; + 313A : 10; + 313B : F3; + 313C : 18; + 313D : 60; + 313E : A5; + 313F : 99; + 3140 : D0; + 3141 : 08; + 3142 : A5; + 3143 : C6; + 3144 : F0; + 3145 : 0F; + 3146 : 78; + 3147 : 4C; + 3148 : B4; + 3149 : E5; + 314A : C9; + 314B : 02; + 314C : D0; + 314D : 18; + 314E : 84; + 314F : 97; + 3150 : 20; + 3151 : 86; + 3152 : F0; + 3153 : A4; + 3154 : 97; + 3155 : 18; + 3156 : 60; + 3157 : A5; + 3158 : 99; + 3159 : D0; + 315A : 0B; + 315B : A5; + 315C : D3; + 315D : 85; + 315E : CA; + 315F : A5; + 3160 : D6; + 3161 : 85; + 3162 : C9; + 3163 : 4C; + 3164 : 32; + 3165 : E6; + 3166 : C9; + 3167 : 03; + 3168 : D0; + 3169 : 09; + 316A : 85; + 316B : D0; + 316C : A5; + 316D : D5; + 316E : 85; + 316F : C8; + 3170 : 4C; + 3171 : 32; + 3172 : E6; + 3173 : B0; + 3174 : 38; + 3175 : C9; + 3176 : 02; + 3177 : F0; + 3178 : 3F; + 3179 : 86; + 317A : 97; + 317B : 20; + 317C : 99; + 317D : F1; + 317E : B0; + 317F : 16; + 3180 : 48; + 3181 : 20; + 3182 : 99; + 3183 : F1; + 3184 : B0; + 3185 : 0D; + 3186 : D0; + 3187 : 05; + 3188 : A9; + 3189 : 40; + 318A : 20; + 318B : 1C; + 318C : FE; + 318D : C6; + [318E..318F] : A6; + 3190 : 97; + 3191 : 68; + 3192 : 60; + 3193 : AA; + 3194 : 68; + 3195 : 8A; + 3196 : A6; + 3197 : 97; + 3198 : 60; + 3199 : 20; + 319A : 4D; + 319B : FB; + 319C : D0; + 319D : 0B; + 319E : 20; + 319F : 4D; + 31A0 : FB; + 31A1 : B0; + 31A2 : 11; + 31A3 : A9; + 31A4 : 00; + 31A5 : 85; + 31A6 : A6; + [31A7..31A8] : F0; + 31A9 : B1; + 31AA : B2; + 31AB : 18; + 31AC : 60; + 31AD : A5; + 31AE : 90; + 31AF : F0; + 31B0 : 04; + 31B1 : A9; + 31B2 : 0D; + 31B3 : 18; + 31B4 : 60; + 31B5 : 4C; + 31B6 : 13; + 31B7 : EE; + 31B8 : 20; + 31B9 : 4E; + 31BA : F1; + 31BB : B0; + 31BC : F7; + 31BD : C9; + 31BE : 00; + 31BF : D0; + 31C0 : F2; + 31C1 : AD; + 31C2 : 97; + 31C3 : 02; + 31C4 : 29; + 31C5 : 60; + 31C6 : D0; + 31C7 : E9; + 31C8 : F0; + 31C9 : EE; + 31CA : 48; + 31CB : A5; + 31CC : 9A; + 31CD : C9; + 31CE : 03; + 31CF : D0; + 31D0 : 04; + 31D1 : 68; + 31D2 : 4C; + 31D3 : 16; + 31D4 : E7; + 31D5 : 90; + 31D6 : 04; + 31D7 : 68; + 31D8 : 4C; + 31D9 : DD; + 31DA : ED; + 31DB : 4A; + 31DC : 68; + 31DD : 85; + 31DE : 9E; + 31DF : 8A; + 31E0 : 48; + 31E1 : 98; + 31E2 : 48; + 31E3 : 90; + 31E4 : 23; + 31E5 : 20; + 31E6 : 4D; + 31E7 : FB; + 31E8 : D0; + 31E9 : 0E; + 31EA : 20; + 31EB : 4D; + 31EC : FB; + 31ED : B0; + 31EE : 0E; + 31EF : A9; + 31F0 : 02; + 31F1 : A0; + 31F2 : 00; + 31F3 : 91; + 31F4 : B2; + 31F5 : C8; + 31F6 : 84; + 31F7 : A6; + 31F8 : A5; + 31F9 : 9E; + 31FA : 91; + 31FB : B2; + 31FC : 18; + 31FD : 68; + 31FE : A8; + 31FF : 68; + 3200 : AA; + 3201 : A5; + 3202 : 9E; + 3203 : 90; + 3204 : 02; + 3205 : A9; + 3206 : 00; + 3207 : 60; + 3208 : 20; + 3209 : 17; + 320A : F0; + 320B : 4C; + 320C : FC; + 320D : F1; + 320E : 20; + 320F : 0F; + 3210 : F3; + 3211 : F0; + 3212 : 03; + 3213 : 4C; + 3214 : 01; + 3215 : F7; + 3216 : 20; + 3217 : 1F; + 3218 : F3; + 3219 : A5; + 321A : BA; + 321B : F0; + 321C : 16; + 321D : C9; + 321E : 03; + 321F : F0; + 3220 : 12; + 3221 : B0; + 3222 : 14; + 3223 : C9; + 3224 : 02; + 3225 : D0; + 3226 : 03; + 3227 : 4C; + 3228 : 4D; + 3229 : F0; + 322A : A6; + 322B : B9; + 322C : E0; + 322D : 60; + 322E : F0; + 322F : 03; + 3230 : 4C; + 3231 : 0A; + 3232 : F7; + 3233 : 85; + 3234 : 99; + 3235 : 18; + 3236 : 60; + 3237 : AA; + 3238 : 20; + 3239 : 09; + 323A : ED; + 323B : A5; + 323C : B9; + 323D : 10; + 323E : 06; + 323F : 20; + 3240 : CC; + 3241 : ED; + 3242 : 4C; + 3243 : 48; + 3244 : F2; + 3245 : 20; + 3246 : C7; + 3247 : ED; + 3248 : 8A; + 3249 : 24; + 324A : 90; + 324B : 10; + 324C : E6; + 324D : 4C; + 324E : 07; + 324F : F7; + 3250 : 20; + 3251 : 0F; + 3252 : F3; + 3253 : F0; + 3254 : 03; + 3255 : 4C; + 3256 : 01; + 3257 : F7; + 3258 : 20; + 3259 : 1F; + 325A : F3; + 325B : A5; + 325C : BA; + 325D : D0; + 325E : 03; + 325F : 4C; + 3260 : 0D; + 3261 : F7; + 3262 : C9; + 3263 : 03; + 3264 : F0; + 3265 : 0F; + 3266 : B0; + 3267 : 11; + 3268 : C9; + 3269 : 02; + 326A : D0; + 326B : 03; + 326C : 4C; + 326D : E1; + 326E : EF; + 326F : A6; + 3270 : B9; + 3271 : E0; + 3272 : 60; + 3273 : F0; + 3274 : EA; + 3275 : 85; + 3276 : 9A; + 3277 : 18; + 3278 : 60; + 3279 : AA; + 327A : 20; + 327B : 0C; + 327C : ED; + 327D : A5; + 327E : B9; + 327F : 10; + 3280 : 05; + 3281 : 20; + 3282 : BE; + 3283 : ED; + 3284 : D0; + 3285 : 03; + 3286 : 20; + 3287 : B9; + 3288 : ED; + 3289 : 8A; + 328A : 24; + 328B : 90; + 328C : 10; + 328D : E7; + 328E : 4C; + 328F : 07; + 3290 : F7; + 3291 : 20; + 3292 : 14; + 3293 : F3; + 3294 : F0; + 3295 : 02; + 3296 : 18; + 3297 : 60; + 3298 : 20; + 3299 : 1F; + 329A : F3; + 329B : 8A; + 329C : 48; + 329D : A5; + 329E : BA; + 329F : F0; + 32A0 : 50; + 32A1 : C9; + 32A2 : 03; + 32A3 : F0; + 32A4 : 4C; + 32A5 : B0; + 32A6 : 47; + 32A7 : C9; + 32A8 : 02; + 32A9 : D0; + 32AA : 1D; + 32AB : 68; + 32AC : 20; + [32AD..32AE] : F2; + 32AF : 20; + 32B0 : 83; + 32B1 : F4; + 32B2 : 20; + 32B3 : 27; + 32B4 : FE; + 32B5 : A5; + 32B6 : F8; + 32B7 : F0; + 32B8 : 01; + 32B9 : C8; + 32BA : A5; + 32BB : FA; + 32BC : F0; + 32BD : 01; + 32BE : C8; + 32BF : A9; + 32C0 : 00; + 32C1 : 85; + 32C2 : F8; + 32C3 : 85; + 32C4 : FA; + 32C5 : 4C; + 32C6 : 7D; + 32C7 : F4; + 32C8 : A5; + 32C9 : B9; + 32CA : 29; + 32CB : 0F; + 32CC : F0; + 32CD : 23; + 32CE : 20; + 32CF : 4D; + 32D0 : FB; + 32D1 : A9; + 32D2 : 00; + 32D3 : 38; + 32D4 : 20; + 32D5 : DD; + 32D6 : F1; + 32D7 : 20; + 32D8 : 4D; + 32D9 : FB; + 32DA : 90; + 32DB : 04; + 32DC : 68; + 32DD : A9; + 32DE : 00; + 32DF : 60; + 32E0 : A5; + 32E1 : B9; + 32E2 : C9; + 32E3 : 62; + 32E4 : D0; + 32E5 : 0B; + 32E6 : A9; + 32E7 : 05; + 32E8 : 20; + 32E9 : 4D; + 32EA : FB; + 32EB : 4C; + 32EC : F1; + 32ED : F2; + 32EE : 20; + 32EF : 42; + 32F0 : F6; + 32F1 : 68; + 32F2 : AA; + 32F3 : C6; + 32F4 : 98; + 32F5 : E4; + 32F6 : 98; + 32F7 : F0; + 32F8 : 14; + 32F9 : A4; + 32FA : 98; + 32FB : B9; + 32FC : 59; + 32FD : 02; + 32FE : 9D; + 32FF : 59; + 3300 : 02; + 3301 : B9; + 3302 : 63; + 3303 : 02; + 3304 : 9D; + 3305 : 63; + 3306 : 02; + 3307 : B9; + 3308 : 6D; + 3309 : 02; + 330A : 9D; + 330B : 6D; + 330C : 02; + 330D : 18; + 330E : 60; + 330F : A9; + 3310 : 00; + 3311 : 85; + 3312 : 90; + 3313 : 8A; + 3314 : A6; + 3315 : 98; + 3316 : CA; + 3317 : 30; + 3318 : 15; + 3319 : DD; + 331A : 59; + 331B : 02; + 331C : D0; + 331D : F8; + 331E : 60; + 331F : BD; + 3320 : 59; + 3321 : 02; + 3322 : 85; + 3323 : B8; + 3324 : BD; + 3325 : 63; + 3326 : 02; + 3327 : 85; + 3328 : BA; + 3329 : BD; + 332A : 6D; + 332B : 02; + 332C : 85; + 332D : B9; + 332E : 60; + 332F : A9; + 3330 : 00; + 3331 : 85; + 3332 : 98; + 3333 : A2; + 3334 : 03; + 3335 : E4; + 3336 : 9A; + 3337 : B0; + 3338 : 03; + 3339 : 20; + 333A : FE; + 333B : ED; + 333C : E4; + 333D : 99; + 333E : B0; + 333F : 03; + 3340 : 20; + 3341 : EF; + 3342 : ED; + 3343 : 86; + 3344 : 9A; + 3345 : A9; + 3346 : 00; + 3347 : 85; + 3348 : 99; + 3349 : 60; + 334A : A6; + 334B : B8; + 334C : D0; + 334D : 03; + 334E : 4C; + 334F : 0A; + 3350 : F7; + 3351 : 20; + 3352 : 0F; + 3353 : F3; + 3354 : D0; + 3355 : 03; + 3356 : 4C; + 3357 : FE; + 3358 : F6; + 3359 : A6; + 335A : 98; + 335B : E0; + 335C : 0A; + 335D : 90; + 335E : 03; + 335F : 4C; + 3360 : FB; + 3361 : F6; + 3362 : E6; + 3363 : 98; + 3364 : A5; + 3365 : B8; + 3366 : 9D; + 3367 : 59; + 3368 : 02; + 3369 : A5; + 336A : B9; + 336B : 09; + 336C : 60; + 336D : 85; + 336E : B9; + 336F : 9D; + 3370 : 6D; + 3371 : 02; + 3372 : A5; + 3373 : BA; + 3374 : 9D; + 3375 : 63; + 3376 : 02; + 3377 : F0; + 3378 : 5A; + 3379 : C9; + 337A : 03; + 337B : F0; + 337C : 56; + 337D : 90; + 337E : 05; + 337F : 20; + 3380 : D5; + 3381 : F3; + 3382 : 90; + 3383 : 4F; + 3384 : C9; + 3385 : 02; + 3386 : D0; + 3387 : 03; + 3388 : 4C; + 3389 : 09; + 338A : F4; + 338B : 20; + 338C : 4D; + 338D : FB; + 338E : B0; + 338F : 03; + 3390 : 4C; + 3391 : 13; + 3392 : F7; + 3393 : A5; + 3394 : B9; + 3395 : 29; + 3396 : 0F; + 3397 : D0; + 3398 : 1F; + 3399 : 20; + 339A : 4D; + 339B : FB; + 339C : B0; + 339D : 36; + 339E : 20; + 339F : AF; + 33A0 : F5; + 33A1 : A5; + 33A2 : B7; + 33A3 : F0; + 33A4 : 0A; + 33A5 : 20; + 33A6 : 4D; + 33A7 : FB; + 33A8 : 90; + 33A9 : 18; + 33AA : F0; + 33AB : 28; + 33AC : 4C; + 33AD : 04; + 33AE : F7; + 33AF : 20; + 33B0 : 4D; + 33B1 : FB; + 33B2 : F0; + 33B3 : 20; + 33B4 : 90; + 33B5 : 0C; + 33B6 : B0; + 33B7 : F4; + 33B8 : 20; + 33B9 : 4D; + 33BA : FB; + 33BB : B0; + 33BC : 17; + 33BD : A9; + 33BE : 04; + 33BF : 20; + 33C0 : 4D; + 33C1 : FB; + 33C2 : A9; + 33C3 : BF; + 33C4 : A4; + 33C5 : B9; + 33C6 : C0; + 33C7 : 60; + 33C8 : F0; + 33C9 : 07; + 33CA : A0; + 33CB : 00; + 33CC : A9; + 33CD : 02; + 33CE : 91; + 33CF : B2; + 33D0 : 98; + 33D1 : 85; + 33D2 : A6; + 33D3 : 18; + 33D4 : 60; + 33D5 : A5; + 33D6 : B9; + 33D7 : 30; + 33D8 : FA; + 33D9 : A4; + 33DA : B7; + 33DB : F0; + 33DC : F6; + 33DD : A9; + 33DE : 00; + 33DF : 85; + 33E0 : 90; + 33E1 : A5; + 33E2 : BA; + 33E3 : 20; + 33E4 : 0C; + 33E5 : ED; + 33E6 : A5; + 33E7 : B9; + 33E8 : 09; + 33E9 : F0; + 33EA : 20; + 33EB : B9; + 33EC : ED; + 33ED : A5; + 33EE : 90; + 33EF : 10; + 33F0 : 05; + [33F1..33F2] : 68; + 33F3 : 4C; + 33F4 : 07; + 33F5 : F7; + 33F6 : A5; + 33F7 : B7; + 33F8 : F0; + 33F9 : 0C; + 33FA : A0; + 33FB : 00; + 33FC : B1; + 33FD : BB; + 33FE : 20; + 33FF : DD; + 3400 : ED; + 3401 : C8; + 3402 : C4; + 3403 : B7; + 3404 : D0; + 3405 : F6; + 3406 : 4C; + 3407 : 54; + 3408 : F6; + 3409 : 20; + 340A : 83; + 340B : F4; + 340C : 8C; + 340D : 97; + 340E : 02; + 340F : C4; + 3410 : B7; + 3411 : F0; + 3412 : 0A; + 3413 : B1; + 3414 : BB; + 3415 : 99; + 3416 : 93; + 3417 : 02; + 3418 : C8; + 3419 : C0; + 341A : 04; + 341B : D0; + 341C : F2; + 341D : 20; + 341E : 4A; + 341F : EF; + 3420 : 8E; + 3421 : 98; + 3422 : 02; + 3423 : AD; + 3424 : 93; + 3425 : 02; + 3426 : 29; + 3427 : 0F; + 3428 : F0; + 3429 : 1C; + 342A : 0A; + 342B : AA; + 342C : AD; + 342D : A6; + 342E : 02; + 342F : D0; + 3430 : 09; + 3431 : BC; + 3432 : C1; + 3433 : FE; + 3434 : BD; + 3435 : C0; + 3436 : FE; + 3437 : 4C; + 3438 : 40; + 3439 : F4; + 343A : BC; + 343B : EB; + 343C : E4; + 343D : BD; + 343E : EA; + 343F : E4; + 3440 : 8C; + 3441 : 96; + 3442 : 02; + 3443 : 8D; + 3444 : 95; + 3445 : 02; + 3446 : AD; + 3447 : 95; + 3448 : 02; + 3449 : 0A; + 344A : 20; + 344B : 2E; + 344C : FF; + 344D : AD; + 344E : 94; + 344F : 02; + 3450 : 4A; + 3451 : 90; + 3452 : 09; + 3453 : AD; + 3454 : 01; + 3455 : DD; + 3456 : 0A; + 3457 : B0; + 3458 : 03; + 3459 : 20; + 345A : 0D; + 345B : F0; + 345C : AD; + 345D : 9B; + 345E : 02; + 345F : 8D; + 3460 : 9C; + 3461 : 02; + 3462 : AD; + 3463 : 9E; + 3464 : 02; + 3465 : 8D; + 3466 : 9D; + 3467 : 02; + 3468 : 20; + 3469 : 27; + 346A : FE; + 346B : A5; + 346C : F8; + 346D : D0; + 346E : 05; + 346F : 88; + 3470 : 84; + 3471 : F8; + 3472 : 86; + 3473 : F7; + 3474 : A5; + 3475 : FA; + 3476 : D0; + 3477 : 05; + 3478 : 88; + 3479 : 84; + 347A : FA; + 347B : 86; + 347C : F9; + 347D : 38; + 347E : A9; + 347F : F0; + 3480 : 4C; + 3481 : 2D; + 3482 : FE; + 3483 : A9; + 3484 : 7F; + 3485 : 8D; + 3486 : 0D; + 3487 : DD; + 3488 : A9; + 3489 : 06; + 348A : 8D; + 348B : 03; + 348C : DD; + 348D : 8D; + 348E : 01; + 348F : DD; + 3490 : A9; + 3491 : 04; + 3492 : 0D; + 3493 : 00; + 3494 : DD; + 3495 : 8D; + 3496 : 00; + 3497 : DD; + 3498 : A0; + 3499 : 00; + 349A : 8C; + 349B : A1; + 349C : 02; + 349D : 60; + 349E : 86; + 349F : C3; + 34A0 : 84; + 34A1 : C4; + 34A2 : 6C; + 34A3 : 30; + 34A4 : 03; + 34A5 : 85; + 34A6 : 93; + 34A7 : A9; + 34A8 : 00; + 34A9 : 85; + 34AA : 90; + 34AB : A5; + 34AC : BA; + 34AD : D0; + 34AE : 03; + 34AF : 4C; + 34B0 : 13; + 34B1 : F7; + 34B2 : C9; + 34B3 : 03; + 34B4 : F0; + 34B5 : F9; + 34B6 : 90; + 34B7 : 7B; + 34B8 : A4; + 34B9 : B7; + 34BA : D0; + 34BB : 03; + 34BC : 4C; + 34BD : 10; + 34BE : F7; + 34BF : A6; + 34C0 : B9; + 34C1 : 20; + 34C2 : AF; + 34C3 : F5; + 34C4 : A9; + 34C5 : 60; + 34C6 : 85; + 34C7 : B9; + 34C8 : 20; + 34C9 : D5; + 34CA : F3; + 34CB : A5; + 34CC : BA; + 34CD : 20; + 34CE : 09; + 34CF : ED; + 34D0 : A5; + 34D1 : B9; + 34D2 : 20; + 34D3 : C7; + 34D4 : ED; + 34D5 : 20; + 34D6 : 13; + 34D7 : EE; + 34D8 : 85; + 34D9 : AE; + 34DA : A5; + 34DB : 90; + [34DC..34DD] : 4A; + 34DE : B0; + 34DF : 50; + 34E0 : 20; + 34E1 : 13; + 34E2 : EE; + 34E3 : 85; + 34E4 : AF; + 34E5 : 8A; + 34E6 : D0; + 34E7 : 08; + 34E8 : A5; + 34E9 : C3; + 34EA : 85; + 34EB : AE; + 34EC : A5; + 34ED : C4; + 34EE : 85; + 34EF : AF; + 34F0 : 20; + 34F1 : D2; + 34F2 : F5; + 34F3 : A9; + 34F4 : FD; + 34F5 : 25; + 34F6 : 90; + 34F7 : 85; + 34F8 : 90; + 34F9 : 20; + 34FA : E1; + 34FB : FF; + 34FC : D0; + 34FD : 03; + 34FE : 4C; + 34FF : 33; + 3500 : F6; + 3501 : 20; + 3502 : 13; + 3503 : EE; + 3504 : AA; + 3505 : A5; + 3506 : 90; + [3507..3508] : 4A; + 3509 : B0; + 350A : E8; + 350B : 8A; + 350C : A4; + 350D : 93; + 350E : F0; + 350F : 0C; + 3510 : A0; + 3511 : 00; + 3512 : D1; + 3513 : AE; + 3514 : F0; + 3515 : 08; + 3516 : A9; + 3517 : 10; + 3518 : 20; + 3519 : 1C; + 351A : FE; + 351B : 2C; + 351C : 91; + 351D : AE; + 351E : E6; + 351F : AE; + 3520 : D0; + 3521 : 02; + 3522 : E6; + 3523 : AF; + 3524 : 24; + 3525 : 90; + 3526 : 50; + 3527 : CB; + 3528 : 20; + 3529 : EF; + 352A : ED; + 352B : 20; + 352C : 42; + 352D : F6; + 352E : 90; + 352F : 79; + 3530 : 4C; + 3531 : 04; + 3532 : F7; + 3533 : 4A; + 3534 : B0; + 3535 : 03; + 3536 : 4C; + 3537 : 13; + 3538 : F7; + 3539 : 20; + 353A : 4D; + 353B : FB; + 353C : B0; + 353D : 03; + 353E : 4C; + 353F : 13; + 3540 : F7; + 3541 : 20; + 3542 : 4D; + 3543 : FB; + 3544 : B0; + 3545 : 68; + 3546 : 20; + 3547 : AF; + 3548 : F5; + 3549 : A5; + 354A : B7; + 354B : F0; + 354C : 09; + 354D : 20; + 354E : 4D; + 354F : FB; + 3550 : 90; + 3551 : 0B; + 3552 : F0; + 3553 : 5A; + 3554 : B0; + 3555 : DA; + 3556 : 20; + 3557 : 4D; + 3558 : FB; + 3559 : F0; + 355A : 53; + 355B : B0; + 355C : D3; + 355D : A5; + 355E : 90; + 355F : 29; + 3560 : 10; + 3561 : 38; + 3562 : D0; + 3563 : 4A; + 3564 : E0; + 3565 : 01; + 3566 : F0; + 3567 : 11; + 3568 : E0; + 3569 : 03; + 356A : D0; + 356B : DD; + 356C : A0; + 356D : 01; + 356E : B1; + 356F : B2; + 3570 : 85; + 3571 : C3; + 3572 : C8; + 3573 : B1; + 3574 : B2; + 3575 : 85; + 3576 : C4; + 3577 : B0; + 3578 : 04; + 3579 : A5; + 357A : B9; + 357B : D0; + 357C : EF; + 357D : A0; + 357E : 03; + 357F : B1; + 3580 : B2; + 3581 : A0; + 3582 : 01; + 3583 : F1; + 3584 : B2; + 3585 : AA; + 3586 : A0; + 3587 : 04; + 3588 : B1; + 3589 : B2; + 358A : A0; + 358B : 02; + 358C : F1; + 358D : B2; + 358E : A8; + 358F : 18; + 3590 : 8A; + 3591 : 65; + 3592 : C3; + 3593 : 85; + 3594 : AE; + 3595 : 98; + 3596 : 65; + 3597 : C4; + 3598 : 85; + 3599 : AF; + 359A : A5; + 359B : C3; + 359C : 85; + 359D : C1; + 359E : A5; + 359F : C4; + 35A0 : 85; + 35A1 : C2; + 35A2 : 20; + 35A3 : D2; + 35A4 : F5; + 35A5 : 20; + 35A6 : 4D; + 35A7 : FB; + 35A8 : 24; + 35A9 : 18; + 35AA : A6; + 35AB : AE; + 35AC : A4; + 35AD : AF; + 35AE : 60; + 35AF : A5; + 35B0 : 9D; + 35B1 : 10; + 35B2 : 1E; + 35B3 : A0; + 35B4 : 0C; + 35B5 : 20; + 35B6 : 2F; + 35B7 : F1; + 35B8 : A5; + 35B9 : B7; + 35BA : F0; + 35BB : 15; + 35BC : A0; + 35BD : 17; + 35BE : 20; + 35BF : 2F; + 35C0 : F1; + 35C1 : A4; + 35C2 : B7; + 35C3 : F0; + 35C4 : 0C; + 35C5 : A0; + 35C6 : 00; + 35C7 : B1; + 35C8 : BB; + 35C9 : 20; + 35CA : D2; + 35CB : FF; + 35CC : C8; + 35CD : C4; + 35CE : B7; + 35CF : D0; + 35D0 : F6; + 35D1 : 60; + 35D2 : A0; + 35D3 : 49; + 35D4 : A5; + 35D5 : 93; + 35D6 : F0; + 35D7 : 02; + 35D8 : A0; + 35D9 : 59; + 35DA : 4C; + 35DB : 2B; + 35DC : F1; + 35DD : 86; + 35DE : AE; + 35DF : 84; + 35E0 : AF; + 35E1 : AA; + 35E2 : B5; + 35E3 : 00; + 35E4 : 85; + 35E5 : C1; + 35E6 : B5; + 35E7 : 01; + 35E8 : 85; + 35E9 : C2; + 35EA : 6C; + 35EB : 32; + 35EC : 03; + 35ED : A5; + 35EE : BA; + 35EF : D0; + 35F0 : 03; + 35F1 : 4C; + 35F2 : 13; + 35F3 : F7; + 35F4 : C9; + 35F5 : 03; + 35F6 : F0; + 35F7 : F9; + 35F8 : 90; + 35F9 : 5F; + 35FA : A9; + 35FB : 61; + 35FC : 85; + 35FD : B9; + 35FE : A4; + 35FF : B7; + 3600 : D0; + 3601 : 03; + 3602 : 4C; + 3603 : 10; + 3604 : F7; + 3605 : 20; + 3606 : D5; + 3607 : F3; + 3608 : 20; + 3609 : 8F; + 360A : F6; + 360B : A5; + 360C : BA; + 360D : 20; + 360E : 0C; + 360F : ED; + 3610 : A5; + 3611 : B9; + 3612 : 20; + 3613 : B9; + 3614 : ED; + 3615 : A0; + 3616 : 00; + 3617 : 20; + 3618 : 8E; + 3619 : FB; + 361A : A5; + 361B : AC; + 361C : 20; + 361D : DD; + 361E : ED; + 361F : A5; + 3620 : AD; + 3621 : 20; + 3622 : DD; + 3623 : ED; + 3624 : 20; + 3625 : D1; + 3626 : FC; + 3627 : B0; + 3628 : 16; + 3629 : B1; + 362A : AC; + 362B : 20; + 362C : DD; + 362D : ED; + 362E : 20; + 362F : E1; + 3630 : FF; + 3631 : D0; + 3632 : 07; + 3633 : 20; + 3634 : 42; + 3635 : F6; + 3636 : A9; + 3637 : 00; + 3638 : 38; + 3639 : 60; + 363A : 20; + 363B : DB; + 363C : FC; + 363D : D0; + 363E : E5; + 363F : 20; + 3640 : FE; + 3641 : ED; + 3642 : 24; + 3643 : B9; + 3644 : 30; + 3645 : 11; + 3646 : A5; + 3647 : BA; + 3648 : 20; + 3649 : 0C; + 364A : ED; + 364B : A5; + 364C : B9; + 364D : 29; + 364E : EF; + 364F : 09; + 3650 : E0; + 3651 : 20; + 3652 : B9; + 3653 : ED; + 3654 : 20; + 3655 : FE; + 3656 : ED; + 3657 : 18; + 3658 : 60; + 3659 : 4A; + 365A : B0; + 365B : 03; + 365C : 4C; + 365D : 13; + 365E : F7; + 365F : 20; + 3660 : 4D; + 3661 : FB; + 3662 : 90; + 3663 : 8D; + 3664 : 20; + 3665 : 4D; + 3666 : FB; + 3667 : B0; + 3668 : 25; + 3669 : 20; + 366A : 8F; + 366B : F6; + 366C : A2; + 366D : 03; + 366E : A5; + 366F : B9; + 3670 : 29; + 3671 : 01; + 3672 : D0; + 3673 : 02; + 3674 : A2; + 3675 : 01; + 3676 : 8A; + 3677 : 20; + 3678 : 4D; + 3679 : FB; + 367A : B0; + 367B : 12; + 367C : 20; + 367D : 4D; + 367E : FB; + 367F : B0; + 3680 : 0D; + 3681 : A5; + 3682 : B9; + 3683 : 29; + 3684 : 02; + 3685 : F0; + 3686 : 06; + 3687 : A9; + 3688 : 05; + 3689 : 20; + 368A : 4D; + 368B : FB; + 368C : 24; + 368D : 18; + 368E : 60; + 368F : A5; + 3690 : 9D; + 3691 : 10; + 3692 : FB; + 3693 : A0; + 3694 : 51; + 3695 : 20; + 3696 : 2F; + 3697 : F1; + 3698 : 4C; + 3699 : C1; + 369A : F5; + 369B : A2; + 369C : 00; + 369D : E6; + 369E : A2; + 369F : D0; + 36A0 : 06; + 36A1 : E6; + 36A2 : A1; + 36A3 : D0; + 36A4 : 02; + 36A5 : E6; + 36A6 : A0; + 36A7 : 38; + 36A8 : A5; + 36A9 : A2; + 36AA : E9; + 36AB : 01; + 36AC : A5; + 36AD : A1; + 36AE : E9; + 36AF : 1A; + 36B0 : A5; + 36B1 : A0; + 36B2 : E9; + 36B3 : 4F; + 36B4 : 90; + 36B5 : 06; + 36B6 : 86; + 36B7 : A0; + 36B8 : 86; + 36B9 : A1; + 36BA : 86; + 36BB : A2; + 36BC : AD; + 36BD : 01; + 36BE : DC; + 36BF : CD; + 36C0 : 01; + 36C1 : DC; + 36C2 : D0; + 36C3 : F8; + 36C4 : AA; + 36C5 : 30; + 36C6 : 13; + 36C7 : A2; + 36C8 : BD; + 36C9 : 8E; + 36CA : 00; + 36CB : DC; + 36CC : AE; + 36CD : 01; + 36CE : DC; + 36CF : EC; + 36D0 : 01; + 36D1 : DC; + 36D2 : D0; + 36D3 : F8; + 36D4 : 8D; + 36D5 : 00; + 36D6 : DC; + 36D7 : E8; + 36D8 : D0; + 36D9 : 02; + 36DA : 85; + 36DB : 91; + 36DC : 60; + 36DD : 78; + 36DE : A5; + 36DF : A2; + 36E0 : A6; + 36E1 : A1; + 36E2 : A4; + 36E3 : A0; + 36E4 : 78; + 36E5 : 85; + 36E6 : A2; + 36E7 : 86; + 36E8 : A1; + 36E9 : 84; + 36EA : A0; + 36EB : 58; + 36EC : 60; + 36ED : A5; + 36EE : 91; + 36EF : C9; + 36F0 : 7F; + 36F1 : D0; + 36F2 : 07; + 36F3 : 08; + 36F4 : 20; + 36F5 : CC; + 36F6 : FF; + 36F7 : 85; + 36F8 : C6; + 36F9 : 28; + 36FA : 60; + 36FB : A9; + 36FC : 01; + 36FD : 2C; + 36FE : A9; + 36FF : 02; + 3700 : 2C; + 3701 : A9; + 3702 : 03; + 3703 : 2C; + 3704 : A9; + 3705 : 04; + 3706 : 2C; + 3707 : A9; + 3708 : 05; + 3709 : 2C; + 370A : A9; + 370B : 06; + 370C : 2C; + 370D : A9; + 370E : 07; + 370F : 2C; + 3710 : A9; + 3711 : 08; + 3712 : 2C; + 3713 : A9; + 3714 : 09; + 3715 : 48; + 3716 : 20; + 3717 : CC; + 3718 : FF; + 3719 : A0; + 371A : 00; + 371B : 24; + 371C : 9D; + 371D : 50; + 371E : 0A; + 371F : 20; + 3720 : 2F; + 3721 : F1; + 3722 : 68; + 3723 : 48; + 3724 : 09; + 3725 : 30; + 3726 : 20; + 3727 : D2; + 3728 : FF; + 3729 : 68; + 372A : 38; + 372B : 60; + 372C : 38; + 372D : 24; + 372E : 18; + 372F : 66; + 3730 : FB; + 3731 : 08; + 3732 : 78; + 3733 : A9; + 3734 : 0B; + 3735 : 8D; + 3736 : 11; + 3737 : D0; + 3738 : A9; + 3739 : 17; + 373A : 8D; + 373B : 18; + 373C : D0; + 373D : A2; + 373E : 00; + 373F : A9; + 3740 : 00; + 3741 : 9D; + 3742 : 00; + 3743 : D8; + 3744 : 9D; + 3745 : 00; + 3746 : D9; + 3747 : 9D; + 3748 : 00; + 3749 : DA; + 374A : 9D; + 374B : 00; + 374C : DB; + 374D : A9; + 374E : 20; + 374F : 9D; + 3750 : 00; + 3751 : 04; + 3752 : 9D; + 3753 : 00; + 3754 : 05; + 3755 : 9D; + 3756 : 00; + 3757 : 06; + 3758 : 9D; + 3759 : 00; + 375A : 07; + 375B : E8; + 375C : D0; + 375D : E1; + 375E : A9; + 375F : 53; + 3760 : 85; + 3761 : FC; + 3762 : A9; + 3763 : 04; + 3764 : 85; + 3765 : FD; + 3766 : A2; + 3767 : 15; + 3768 : A0; + 3769 : 21; + 376A : A9; + 376B : A0; + 376C : 91; + 376D : FC; + 376E : 88; + 376F : D0; + 3770 : FB; + 3771 : 18; + 3772 : A5; + 3773 : FC; + 3774 : 69; + 3775 : 28; + 3776 : 85; + 3777 : FC; + 3778 : 90; + 3779 : 02; + 377A : E6; + 377B : FD; + 377C : CA; + 377D : D0; + 377E : E9; + 377F : A9; + 3780 : 20; + 3781 : 8D; + 3782 : 74; + 3783 : 04; + 3784 : 8D; + 3785 : 74; + 3786 : 07; + 3787 : A9; + 3788 : 0E; + 3789 : A2; + 378A : 1F; + 378B : 9D; + 378C : 54; + 378D : D8; + 378E : 9D; + 378F : 7C; + 3790 : D8; + 3791 : 9D; + 3792 : A4; + 3793 : D8; + 3794 : 9D; + 3795 : 24; + 3796 : DB; + 3797 : 9D; + 3798 : 4C; + 3799 : DB; + 379A : CA; + 379B : 10; + 379C : EE; + 379D : A2; + 379E : CC; + 379F : 86; + 37A0 : FC; + 37A1 : A2; + 37A2 : D8; + 37A3 : 86; + 37A4 : FD; + 37A5 : A2; + 37A6 : 0F; + 37A7 : A9; + 37A8 : 0E; + 37A9 : A0; + 37AA : 00; + 37AB : 91; + 37AC : FC; + 37AD : A0; + 37AE : 1F; + 37AF : 91; + 37B0 : FC; + 37B1 : 18; + 37B2 : A5; + 37B3 : FC; + 37B4 : 69; + 37B5 : 28; + 37B6 : 85; + 37B7 : FC; + 37B8 : 90; + 37B9 : 02; + 37BA : E6; + 37BB : FD; + 37BC : CA; + 37BD : D0; + 37BE : E8; + 37BF : 24; + 37C0 : FB; + 37C1 : 10; + 37C2 : 07; + 37C3 : A9; + 37C4 : 1B; + 37C5 : 8D; + 37C6 : 11; + 37C7 : D0; + 37C8 : 28; + 37C9 : 60; + 37CA : A2; + 37CB : 00; + 37CC : BD; + 37CD : CA; + 37CE : F8; + 37CF : F0; + 37D0 : 08; + 37D1 : 9D; + 37D2 : 81; + 37D3 : 04; + 37D4 : E8; + 37D5 : 10; + 37D6 : F5; + 37D7 : A2; + 37D8 : 07; + 37D9 : BD; + 37DA : E5; + 37DB : F8; + 37DC : 9D; + 37DD : F8; + 37DE : 07; + 37DF : CA; + 37E0 : 10; + 37E1 : F7; + 37E2 : A2; + 37E3 : 3F; + 37E4 : BD; + 37E5 : 0D; + 37E6 : F9; + 37E7 : 9D; + 37E8 : 00; + 37E9 : 0E; + 37EA : BD; + 37EB : 4D; + 37EC : F9; + 37ED : 9D; + 37EE : 40; + 37EF : 0E; + 37F0 : BD; + 37F1 : 8D; + 37F2 : F9; + 37F3 : 9D; + 37F4 : 80; + 37F5 : 0E; + 37F6 : BD; + 37F7 : CD; + 37F8 : F9; + 37F9 : 9D; + 37FA : C0; + 37FB : 0E; + 37FC : BD; + 37FD : 0D; + 37FE : FA; + 37FF : 9D; + 3800 : 00; + 3801 : 0F; + 3802 : BD; + 3803 : 4D; + 3804 : FA; + 3805 : 9D; + 3806 : 40; + 3807 : 0F; + 3808 : BD; + 3809 : 8D; + 380A : FA; + 380B : 9D; + 380C : 80; + 380D : 0F; + 380E : CA; + 380F : 10; + 3810 : D3; + 3811 : A9; + 3812 : 04; + 3813 : 8D; + 3814 : 1C; + 3815 : D0; + 3816 : A9; + 3817 : 73; + 3818 : 8D; + 3819 : 1D; + 381A : D0; + 381B : A2; + 381C : 3F; + 381D : BD; + 381E : CD; + 381F : FA; + 3820 : 9D; + 3821 : C0; + 3822 : 0F; + 3823 : CA; + 3824 : 10; + 3825 : F7; + 3826 : A2; + 3827 : 0F; + 3828 : BD; + 3829 : ED; + 382A : F8; + 382B : 9D; + 382C : 1F; + 382D : D0; + 382E : BD; + 382F : FD; + 3830 : F8; + 3831 : 9D; + 3832 : 00; + 3833 : D0; + 3834 : CA; + 3835 : 10; + 3836 : F1; + 3837 : A9; + 3838 : 1B; + 3839 : 8D; + 383A : 11; + 383B : D0; + 383C : A9; + 383D : BE; + 383E : 8D; + 383F : 15; + 3840 : D0; + 3841 : 20; + 3842 : 9F; + 3843 : F8; + 3844 : A9; + 3845 : FC; + 3846 : 8D; + 3847 : 15; + 3848 : D0; + 3849 : 20; + 384A : AB; + 384B : F8; + 384C : A9; + 384D : BD; + 384E : 8D; + 384F : 15; + 3850 : D0; + 3851 : 20; + 3852 : A8; + 3853 : F8; + 3854 : A9; + 3855 : 3D; + 3856 : 8D; + 3857 : 15; + 3858 : D0; + 3859 : 20; + 385A : A8; + 385B : F8; + 385C : EE; + 385D : 07; + 385E : D0; + 385F : 20; + 3860 : AE; + 3861 : F8; + 3862 : AE; + 3863 : 07; + 3864 : D0; + 3865 : E0; + 3866 : 7C; + 3867 : 90; + 3868 : F3; + 3869 : 20; + 386A : A8; + 386B : F8; + 386C : A2; + 386D : 3F; + 386E : BD; + 386F : 0D; + 3870 : FB; + 3871 : 9D; + 3872 : C0; + 3873 : 0F; + 3874 : CA; + 3875 : 10; + 3876 : F7; + 3877 : A9; + 3878 : 05; + 3879 : 8D; + 387A : 2E; + 387B : D0; + 387C : A9; + 387D : 7C; + 387E : 8D; + 387F : 15; + 3880 : D0; + 3881 : 20; + 3882 : AB; + 3883 : F8; + 3884 : A9; + 3885 : 3E; + 3886 : 8D; + 3887 : 15; + 3888 : D0; + 3889 : 20; + 388A : A8; + 388B : F8; + 388C : A9; + 388D : BE; + 388E : 8D; + 388F : 15; + 3890 : D0; + 3891 : 20; + 3892 : 9F; + 3893 : F8; + 3894 : A9; + 3895 : 04; + 3896 : 8D; + 3897 : 15; + 3898 : D0; + 3899 : 20; + 389A : A8; + 389B : F8; + 389C : 4C; + 389D : 1B; + 389E : F8; + 389F : 20; + 38A0 : A8; + 38A1 : F8; + 38A2 : 20; + 38A3 : A8; + 38A4 : F8; + 38A5 : 20; + 38A6 : A8; + 38A7 : F8; + 38A8 : A0; + 38A9 : 28; + 38AA : 2C; + 38AB : A0; + 38AC : 06; + 38AD : 2C; + 38AE : A0; + 38AF : 02; + 38B0 : 20; + 38B1 : BF; + 38B2 : F8; + 38B3 : 88; + 38B4 : D0; + 38B5 : FA; + 38B6 : 20; + 38B7 : 02; + 38B8 : FD; + 38B9 : F0; + 38BA : 01; + 38BB : 60; + 38BC : 6C; + 38BD : FC; + 38BE : FF; + 38BF : 2C; + 38C0 : 11; + 38C1 : D0; + 38C2 : 30; + 38C3 : FB; + 38C4 : 2C; + 38C5 : 11; + 38C6 : D0; + 38C7 : 10; + 38C8 : FB; + 38C9 : 60; + 38CA : C3; + 38CB : 8F; + [38CC..38CD] : 8D; + 38CE : 8F; + 38CF : 84; + 38D0 : 8F; + 38D1 : 92; + 38D2 : 85; + 38D3 : A0; + 38D4 : C3; + 38D5 : B6; + 38D6 : B4; + 38D7 : A0; + 38D8 : C7; + 38D9 : 81; + 38DA : 8D; + 38DB : 85; + 38DC : 93; + 38DD : A0; + 38DE : D3; + 38DF : 99; + 38E0 : 93; + 38E1 : 94; + 38E2 : 85; + 38E3 : 8D; + 38E4 : 00; + 38E5 : 38; + 38E6 : 39; + 38E7 : 3A; + 38E8 : 3B; + 38E9 : 3C; + 38EA : 3D; + 38EB : 3E; + 38EC : 3F; + 38ED : 00; + [38EE..38EF] : 06; + 38F0 : 01; + 38F1 : 02; + 38F2 : 03; + 38F3 : 06; + 38F4 : 01; + [38F5..38F6] : 0F; + 38F7 : 0A; + [38F8..38FB] : 0F; + 38FC : 02; + 38FD : E0; + 38FE : 7E; + 38FF : E0; + 3900 : 7E; + [3901..3902] : 43; + 3903 : 94; + 3904 : 64; + 3905 : 90; + 3906 : 82; + 3907 : 60; + 3908 : 82; + 3909 : E0; + 390A : 7E; + 390B : AC; + 390C : A7; + 390D : 80; + [390E..390F] : 00; + 3910 : 80; + [3911..3912] : 00; + 3913 : FF; + 3914 : C0; + 3915 : 00; + 3916 : C0; + 3917 : 40; + 3918 : 00; + 3919 : C0; + 391A : 40; + 391B : 00; + 391C : C0; + 391D : 40; + 391E : 00; + [391F..3920] : C0; + 3921 : 00; + 3922 : C1; + 3923 : 80; + 3924 : 00; + 3925 : C3; + [3926..3927] : 00; + 3928 : C6; + 3929 : 00; + 392A : 60; + 392B : CC; + 392C : 00; + 392D : 90; + 392E : C8; + 392F : 00; + 3930 : 90; + 3931 : C8; + 3932 : 40; + 3933 : 90; + 3934 : C8; + 3935 : 80; + 3936 : 90; + 3937 : C9; + 3938 : F8; + 3939 : 60; + 393A : C8; + 393B : 80; + 393C : 00; + 393D : C8; + 393E : 46; + 393F : 77; + 3940 : D8; + 3941 : 09; + 3942 : 44; + 3943 : F0; + 3944 : 09; + 3945 : 66; + 3946 : 80; + 3947 : 09; + 3948 : 44; + 3949 : 80; + 394A : 06; + 394B : 44; + 394C : 00; + 394D : 80; + 394E : 00; + 394F : 40; + 3950 : 80; + 3951 : 00; + 3952 : 40; + 3953 : F0; + 3954 : 00; + 3955 : 40; + 3956 : D8; + [3957..3958] : 40; + 3959 : C8; + 395A : 80; + 395B : 40; + 395C : C9; + 395D : F8; + 395E : 40; + 395F : C8; + 3960 : 80; + 3961 : 00; + 3962 : C8; + 3963 : 43; + 3964 : 24; + 3965 : C8; + 3966 : 04; + 3967 : B4; + 3968 : C8; + 3969 : 04; + 396A : AC; + 396B : C8; + 396C : 04; + 396D : A4; + 396E : CC; + 396F : 03; + 3970 : 24; + 3971 : C6; + [3972..3973] : 00; + 3974 : C3; + [3975..3976] : 00; + 3977 : C1; + 3978 : 80; + 3979 : 00; + 397A : C0; + 397B : 80; + 397C : 00; + 397D : C0; + 397E : 80; + 397F : 00; + 3980 : C0; + 3981 : 80; + 3982 : 00; + 3983 : FF; + 3984 : 80; + 3985 : 00; + 3986 : 80; + [3987..3988] : 00; + 3989 : 80; + [398A..3995] : 00; + 3996 : 01; + 3997 : 54; + 3998 : 00; + 3999 : 05; + 399A : 54; + 399B : 00; + 399C : 05; + 399D : 54; + 399E : 00; + 399F : 15; + 39A0 : 54; + 39A1 : 00; + 39A2 : 15; + 39A3 : 02; + 39A4 : A8; + 39A5 : 14; + 39A6 : 02; + 39A7 : A0; + 39A8 : 14; + 39A9 : 02; + 39AA : 80; + 39AB : 14; + [39AC..39AD] : 00; + 39AE : 14; + 39AF : 03; + 39B0 : C0; + 39B1 : 14; + 39B2 : 03; + 39B3 : F0; + 39B4 : 15; + 39B5 : 03; + 39B6 : FC; + 39B7 : 15; + 39B8 : 54; + 39B9 : 00; + 39BA : 05; + 39BB : 54; + 39BC : 00; + 39BD : 05; + 39BE : 54; + 39BF : 00; + 39C0 : 01; + 39C1 : 54; + [39C2..39CC] : 00; + 39CD : 1F; + 39CE : FF; + 39CF : E0; + 39D0 : 30; + 39D1 : 00; + 39D2 : A0; + 39D3 : 3F; + 39D4 : FF; + 39D5 : A0; + 39D6 : 3F; + 39D7 : FF; + 39D8 : A0; + 39D9 : 20; + 39DA : 00; + 39DB : A0; + 39DC : 20; + 39DD : 00; + 39DE : A0; + 39DF : 20; + 39E0 : 00; + 39E1 : A0; + 39E2 : 3F; + 39E3 : FF; + 39E4 : A0; + 39E5 : 3F; + 39E6 : FF; + 39E7 : A0; + 39E8 : 3F; + 39E9 : FF; + 39EA : A0; + 39EB : 3F; + 39EC : FF; + 39ED : A0; + 39EE : 3F; + 39EF : FF; + 39F0 : C0; + 39F1 : 3F; + 39F2 : FF; + 39F3 : 80; + [39F4..39F7] : 00; + 39F8 : 60; + [39F9..39FA] : 00; + 39FB : 60; + [39FC..39FD] : 00; + 39FE : 60; + 39FF : 00; + 3A00 : 03; + 3A01 : 6C; + 3A02 : 00; + 3A03 : 01; + 3A04 : F8; + [3A05..3A06] : 00; + 3A07 : F0; + [3A08..3A09] : 00; + 3A0A : 60; + [3A0B..3A12] : 00; + 3A13 : BF; + 3A14 : FF; + 3A15 : 7C; + 3A16 : BF; + 3A17 : FF; + 3A18 : 7D; + 3A19 : 7F; + 3A1A : FE; + 3A1B : F9; + 3A1C : 60; + 3A1D : 06; + 3A1E : FB; + 3A1F : DF; + 3A20 : ED; + 3A21 : F3; + 3A22 : 80; + 3A23 : 1D; + 3A24 : F6; + 3A25 : FF; + 3A26 : FB; + 3A27 : E6; + 3A28 : FF; + 3A29 : FB; + 3A2A : EC; + 3A2B : FF; + 3A2C : F7; + 3A2D : CC; + 3A2E : FF; + 3A2F : F7; + 3A30 : D8; + 3A31 : FF; + 3A32 : EF; + 3A33 : 98; + 3A34 : FF; + 3A35 : EF; + 3A36 : B0; + 3A37 : FF; + 3A38 : DF; + 3A39 : 30; + [3A3A..3A3B] : 00; + 3A3C : 60; + [3A3D..3A3E] : FF; + 3A3F : 60; + [3A40..3A41] : FF; + 3A42 : C0; + [3A43..3A44] : FF; + 3A45 : C0; + [3A46..3A52] : 00; + 3A53 : 03; + [3A54..3A55] : FF; + 3A56 : 03; + [3A57..3A58] : FF; + 3A59 : 07; + [3A5A..3A5B] : FF; + 3A5C : 07; + [3A5D..3A5E] : FF; + 3A5F : 0F; + 3A60 : FF; + 3A61 : FE; + 3A62 : 0F; + 3A63 : FF; + 3A64 : FE; + 3A65 : 1F; + 3A66 : FF; + 3A67 : FD; + 3A68 : 1F; + 3A69 : FF; + 3A6A : FD; + 3A6B : 3F; + 3A6C : FF; + 3A6D : FB; + 3A6E : 3F; + 3A6F : FF; + 3A70 : FB; + 3A71 : 7F; + 3A72 : FF; + 3A73 : F7; + 3A74 : 7F; + 3A75 : FF; + 3A76 : F7; + [3A77..3A78] : FF; + 3A79 : EF; + 3A7A : 80; + [3A7B..3A7C] : 00; + [3A7D..3A85] : FF; + [3A86..3A8C] : 00; + 3A8D : 80; + [3A8E..3A8F] : 00; + 3A90 : 80; + [3A91..3A92] : 00; + 3A93 : FE; + [3A94..3A95] : 00; + 3A96 : C1; + [3A97..3A98] : 00; + 3A99 : C1; + [3A9A..3A9B] : 00; + 3A9C : C2; + [3A9D..3A9E] : 00; + 3A9F : C2; + [3AA0..3AA1] : 00; + 3AA2 : C4; + [3AA3..3AA4] : 00; + 3AA5 : C4; + [3AA6..3AA7] : 00; + 3AA8 : C8; + [3AA9..3AAA] : 00; + 3AAB : C8; + [3AAC..3AAD] : 00; + 3AAE : C8; + [3AAF..3AB0] : 00; + 3AB1 : C4; + [3AB2..3AB3] : 00; + 3AB4 : C4; + [3AB5..3AB6] : 00; + 3AB7 : C2; + [3AB8..3AB9] : 00; + 3ABA : C2; + [3ABB..3ABC] : 00; + 3ABD : C1; + [3ABE..3ABF] : 00; + 3AC0 : C1; + [3AC1..3AC2] : 00; + 3AC3 : FE; + [3AC4..3AC5] : 00; + 3AC6 : 80; + [3AC7..3AC8] : 00; + 3AC9 : 80; + [3ACA..3ACF] : 00; + 3AD0 : E0; + 3AD1 : 00; + 3AD2 : 38; + 3AD3 : F0; + 3AD4 : 00; + [3AD5..3AD6] : 78; + 3AD7 : 00; + 3AD8 : F0; + 3AD9 : 3C; + 3ADA : 01; + 3ADB : E0; + 3ADC : 1E; + 3ADD : 03; + 3ADE : C0; + 3ADF : 0F; + 3AE0 : 07; + 3AE1 : 80; + 3AE2 : 07; + 3AE3 : 8F; + 3AE4 : 00; + 3AE5 : 03; + 3AE6 : DE; + 3AE7 : 00; + 3AE8 : 01; + 3AE9 : FC; + [3AEA..3AEB] : 00; + 3AEC : F8; + [3AED..3AEE] : 00; + 3AEF : F8; + 3AF0 : 00; + 3AF1 : 01; + 3AF2 : FC; + 3AF3 : 00; + 3AF4 : 03; + 3AF5 : DE; + 3AF6 : 00; + 3AF7 : 07; + 3AF8 : 8F; + 3AF9 : 00; + 3AFA : 0F; + 3AFB : 07; + 3AFC : 80; + 3AFD : 1E; + 3AFE : 03; + 3AFF : C0; + 3B00 : 3C; + 3B01 : 01; + 3B02 : E0; + 3B03 : 78; + 3B04 : 00; + [3B05..3B06] : F0; + 3B07 : 00; + 3B08 : 78; + 3B09 : E0; + 3B0A : 00; + 3B0B : 38; + [3B0C..3B11] : 00; + 3B12 : 38; + [3B13..3B14] : 00; + 3B15 : 78; + [3B16..3B17] : 00; + 3B18 : F0; + 3B19 : 00; + 3B1A : 01; + 3B1B : E0; + 3B1C : 00; + 3B1D : 03; + 3B1E : C0; + 3B1F : 00; + 3B20 : 07; + 3B21 : 80; + 3B22 : 00; + 3B23 : 0F; + [3B24..3B25] : 00; + 3B26 : 1E; + [3B27..3B28] : 00; + 3B29 : 3C; + 3B2A : 00; + 3B2B : 60; + 3B2C : 78; + 3B2D : 00; + 3B2E : E0; + 3B2F : F0; + 3B30 : 00; + 3B31 : E1; + 3B32 : E0; + 3B33 : 00; + 3B34 : E3; + 3B35 : C0; + 3B36 : 00; + 3B37 : E7; + 3B38 : 80; + 3B39 : 00; + 3B3A : EF; + [3B3B..3B3C] : 00; + 3B3D : FE; + [3B3E..3B3F] : 00; + 3B40 : FC; + [3B41..3B42] : 00; + 3B43 : F8; + [3B44..3B45] : 00; + 3B46 : F0; + [3B47..3B48] : 00; + 3B49 : E0; + [3B4A..3B4C] : 00; + 3B4D : 4C; + 3B4E : 07; + 3B4F : F7; + [3B50..3B8D] : 00; + 3B8E : A5; + 3B8F : C2; + 3B90 : 85; + 3B91 : AD; + 3B92 : A5; + 3B93 : C1; + 3B94 : 85; + 3B95 : AC; + 3B96 : 60; + [3B97..3BFF] : 00; + 3C00 : 43; + 3C01 : 4F; + 3C02 : 50; + 3C03 : 59; + 3C04 : 52; + 3C05 : 49; + 3C06 : 47; + 3C07 : 48; + 3C08 : 54; + 3C09 : 20; + 3C0A : 31; + [3C0B..3C0C] : 39; + 3C0D : 30; + 3C0E : 20; + 3C0F : 43; + 3C10 : 4F; + [3C11..3C12] : 4D; + 3C13 : 4F; + 3C14 : 44; + 3C15 : 4F; + 3C16 : 52; + 3C17 : 45; + 3C18 : 20; + 3C19 : 45; + 3C1A : 4C; + 3C1B : 45; + 3C1C : 43; + 3C1D : 54; + 3C1E : 52; + 3C1F : 4F; + 3C20 : 4E; + 3C21 : 49; + 3C22 : 43; + 3C23 : 53; + 3C24 : 20; + 3C25 : 4C; + 3C26 : 54; + 3C27 : 44; + 3C28 : 2E; + 3C29 : 20; + 3C2A : 41; + [3C2B..3C2C] : 4C; + 3C2D : 20; + 3C2E : 52; + 3C2F : 49; + 3C30 : 47; + 3C31 : 48; + 3C32 : 54; + 3C33 : 53; + 3C34 : 20; + 3C35 : 52; + 3C36 : 45; + 3C37 : 53; + 3C38 : 45; + 3C39 : 52; + 3C3A : 56; + 3C3B : 45; + 3C3C : 44; + 3C3D : 2E; + [3C3E..3C53] : 00; + 3C54 : 4C; + 3C55 : BC; + 3C56 : FE; + [3C57..3C92] : 00; + 3C93 : 08; + 3C94 : 78; + 3C95 : AD; + 3C96 : 11; + 3C97 : D0; + 3C98 : 09; + 3C99 : 10; + 3C9A : 8D; + 3C9B : 11; + 3C9C : D0; + 3C9D : 20; + 3C9E : CA; + 3C9F : FC; + 3CA0 : A9; + 3CA1 : 7F; + 3CA2 : 8D; + 3CA3 : 0D; + 3CA4 : DC; + 3CA5 : 20; + 3CA6 : DD; + 3CA7 : FD; + 3CA8 : AD; + 3CA9 : A0; + 3CAA : 02; + 3CAB : F0; + 3CAC : 09; + 3CAD : 8D; + 3CAE : 15; + 3CAF : 03; + 3CB0 : AD; + 3CB1 : 9F; + 3CB2 : 02; + 3CB3 : 8D; + 3CB4 : 14; + 3CB5 : 03; + 3CB6 : 28; + 3CB7 : 60; + 3CB8 : 20; + 3CB9 : 93; + 3CBA : FC; + 3CBB : F0; + 3CBC : 97; + 3CBD : BD; + 3CBE : 93; + 3CBF : FD; + 3CC0 : 8D; + 3CC1 : 14; + 3CC2 : 03; + 3CC3 : BD; + 3CC4 : 94; + 3CC5 : FD; + 3CC6 : 8D; + 3CC7 : 15; + 3CC8 : 03; + 3CC9 : 60; + 3CCA : A5; + 3CCB : 01; + 3CCC : 09; + 3CCD : 20; + 3CCE : 85; + 3CCF : 01; + 3CD0 : 60; + 3CD1 : 38; + 3CD2 : A5; + 3CD3 : AC; + 3CD4 : E5; + 3CD5 : AE; + 3CD6 : A5; + 3CD7 : AD; + 3CD8 : E5; + 3CD9 : AF; + 3CDA : 60; + 3CDB : E6; + 3CDC : AC; + 3CDD : D0; + 3CDE : 02; + 3CDF : E6; + 3CE0 : AD; + 3CE1 : 60; + 3CE2 : A2; + 3CE3 : FF; + 3CE4 : 78; + 3CE5 : 9A; + 3CE6 : D8; + 3CE7 : 20; + 3CE8 : 02; + 3CE9 : FD; + 3CEA : D0; + 3CEB : 03; + 3CEC : 6C; + 3CED : 00; + 3CEE : 80; + 3CEF : 8E; + 3CF0 : 16; + 3CF1 : D0; + 3CF2 : 20; + 3CF3 : A3; + 3CF4 : FD; + 3CF5 : 20; + 3CF6 : 50; + 3CF7 : FD; + 3CF8 : 20; + 3CF9 : 15; + 3CFA : FD; + 3CFB : 20; + 3CFC : 5B; + 3CFD : FF; + 3CFE : 58; + 3CFF : 6C; + 3D00 : 00; + 3D01 : A0; + 3D02 : A2; + 3D03 : 05; + 3D04 : BD; + 3D05 : 0F; + 3D06 : FD; + 3D07 : DD; + 3D08 : 03; + 3D09 : 80; + 3D0A : D0; + 3D0B : 03; + 3D0C : CA; + 3D0D : D0; + 3D0E : F5; + 3D0F : 60; + 3D10 : C3; + 3D11 : C2; + 3D12 : CD; + 3D13 : 38; + 3D14 : 30; + 3D15 : A2; + 3D16 : 30; + 3D17 : A0; + 3D18 : FD; + 3D19 : 18; + 3D1A : 86; + 3D1B : C3; + 3D1C : 84; + 3D1D : C4; + 3D1E : A0; + 3D1F : 1F; + 3D20 : B9; + 3D21 : 14; + 3D22 : 03; + 3D23 : B0; + 3D24 : 02; + 3D25 : B1; + 3D26 : C3; + 3D27 : 91; + 3D28 : C3; + 3D29 : 99; + 3D2A : 14; + 3D2B : 03; + 3D2C : 88; + 3D2D : 10; + 3D2E : F1; + 3D2F : 60; + 3D30 : 31; + 3D31 : EA; + 3D32 : 66; + 3D33 : FE; + 3D34 : 47; + 3D35 : FE; + 3D36 : 4A; + 3D37 : F3; + 3D38 : 91; + 3D39 : F2; + 3D3A : 0E; + 3D3B : F2; + 3D3C : 50; + 3D3D : F2; + 3D3E : 33; + 3D3F : F3; + 3D40 : 57; + 3D41 : F1; + 3D42 : CA; + 3D43 : F1; + 3D44 : ED; + 3D45 : F6; + 3D46 : 3E; + 3D47 : F1; + 3D48 : 2F; + 3D49 : F3; + 3D4A : 66; + 3D4B : FE; + 3D4C : A5; + 3D4D : F4; + 3D4E : ED; + 3D4F : F5; + 3D50 : A9; + 3D51 : 00; + 3D52 : A8; + 3D53 : 99; + 3D54 : 02; + 3D55 : 00; + 3D56 : 99; + 3D57 : 00; + 3D58 : 02; + 3D59 : 99; + 3D5A : 00; + 3D5B : 03; + 3D5C : C8; + 3D5D : D0; + 3D5E : F4; + 3D5F : A2; + 3D60 : 3C; + 3D61 : A0; + 3D62 : 03; + 3D63 : 86; + 3D64 : B2; + 3D65 : 84; + 3D66 : B3; + 3D67 : A8; + 3D68 : A9; + 3D69 : 03; + 3D6A : 85; + 3D6B : C2; + 3D6C : E6; + 3D6D : C2; + 3D6E : B1; + 3D6F : C1; + 3D70 : AA; + 3D71 : A9; + 3D72 : 55; + 3D73 : 91; + 3D74 : C1; + 3D75 : D1; + 3D76 : C1; + 3D77 : D0; + 3D78 : 0F; + 3D79 : 2A; + 3D7A : 91; + 3D7B : C1; + 3D7C : D1; + 3D7D : C1; + 3D7E : D0; + 3D7F : 08; + 3D80 : 8A; + 3D81 : 91; + 3D82 : C1; + 3D83 : EA; + 3D84 : D0; + 3D85 : E6; + 3D86 : F0; + 3D87 : E4; + 3D88 : 98; + 3D89 : AA; + 3D8A : A4; + 3D8B : C2; + 3D8C : 18; + 3D8D : 20; + 3D8E : 2D; + 3D8F : FE; + 3D90 : A9; + 3D91 : 08; + 3D92 : 8D; + 3D93 : 82; + 3D94 : 02; + 3D95 : A9; + 3D96 : 04; + 3D97 : 8D; + 3D98 : 88; + 3D99 : 02; + 3D9A : 60; + 3D9B : BC; + 3D9C : FE; + 3D9D : BC; + 3D9E : FE; + 3D9F : BC; + 3DA0 : FE; + 3DA1 : BC; + 3DA2 : FE; + 3DA3 : A9; + 3DA4 : 7F; + 3DA5 : 8D; + 3DA6 : 0D; + 3DA7 : DC; + 3DA8 : 8D; + 3DA9 : 0D; + 3DAA : DD; + 3DAB : 8D; + 3DAC : 00; + 3DAD : DC; + 3DAE : A9; + 3DAF : 08; + 3DB0 : 8D; + 3DB1 : 0E; + 3DB2 : DC; + 3DB3 : 8D; + 3DB4 : 0E; + 3DB5 : DD; + 3DB6 : 8D; + 3DB7 : 0F; + 3DB8 : DC; + 3DB9 : 8D; + 3DBA : 0F; + 3DBB : DD; + 3DBC : A2; + 3DBD : 00; + 3DBE : 8E; + 3DBF : 03; + 3DC0 : DC; + 3DC1 : 8E; + 3DC2 : 03; + 3DC3 : DD; + 3DC4 : 8E; + 3DC5 : 18; + 3DC6 : D4; + 3DC7 : CA; + 3DC8 : 8E; + 3DC9 : 02; + 3DCA : DC; + 3DCB : A9; + 3DCC : 07; + 3DCD : 8D; + 3DCE : 00; + 3DCF : DD; + 3DD0 : A9; + 3DD1 : 3F; + 3DD2 : 8D; + 3DD3 : 02; + 3DD4 : DD; + 3DD5 : A9; + 3DD6 : E7; + 3DD7 : 85; + 3DD8 : 01; + 3DD9 : A9; + 3DDA : 2F; + 3DDB : 85; + 3DDC : 00; + 3DDD : AD; + 3DDE : A6; + 3DDF : 02; + 3DE0 : F0; + 3DE1 : 0A; + 3DE2 : A9; + 3DE3 : 25; + 3DE4 : 8D; + 3DE5 : 04; + 3DE6 : DC; + 3DE7 : A9; + 3DE8 : 40; + 3DE9 : 4C; + 3DEA : F3; + 3DEB : FD; + 3DEC : A9; + 3DED : 95; + 3DEE : 8D; + 3DEF : 04; + 3DF0 : DC; + 3DF1 : A9; + 3DF2 : 42; + 3DF3 : 8D; + 3DF4 : 05; + 3DF5 : DC; + 3DF6 : 4C; + 3DF7 : 6E; + 3DF8 : FF; + 3DF9 : 85; + 3DFA : B7; + 3DFB : 86; + 3DFC : BB; + 3DFD : 84; + 3DFE : BC; + 3DFF : 60; + 3E00 : 85; + 3E01 : B8; + 3E02 : 86; + 3E03 : BA; + 3E04 : 84; + 3E05 : B9; + 3E06 : 60; + 3E07 : A5; + 3E08 : BA; + 3E09 : C9; + 3E0A : 02; + 3E0B : D0; + 3E0C : 0D; + 3E0D : AD; + 3E0E : 97; + 3E0F : 02; + 3E10 : 48; + 3E11 : A9; + 3E12 : 00; + 3E13 : 8D; + 3E14 : 97; + 3E15 : 02; + 3E16 : 68; + 3E17 : 60; + 3E18 : 85; + 3E19 : 9D; + 3E1A : A5; + 3E1B : 90; + 3E1C : 05; + 3E1D : 90; + 3E1E : 85; + 3E1F : 90; + 3E20 : 60; + 3E21 : 8D; + 3E22 : 85; + 3E23 : 02; + 3E24 : 60; + 3E25 : 90; + 3E26 : 06; + 3E27 : AE; + 3E28 : 83; + 3E29 : 02; + 3E2A : AC; + 3E2B : 84; + 3E2C : 02; + 3E2D : 8E; + 3E2E : 83; + 3E2F : 02; + 3E30 : 8C; + 3E31 : 84; + 3E32 : 02; + 3E33 : 60; + 3E34 : 90; + 3E35 : 06; + 3E36 : AE; + 3E37 : 81; + 3E38 : 02; + 3E39 : AC; + 3E3A : 82; + 3E3B : 02; + 3E3C : 8E; + 3E3D : 81; + 3E3E : 02; + 3E3F : 8C; + 3E40 : 82; + 3E41 : 02; + 3E42 : 60; + 3E43 : 78; + 3E44 : 6C; + 3E45 : 18; + 3E46 : 03; + 3E47 : 48; + 3E48 : 8A; + 3E49 : 48; + 3E4A : 98; + 3E4B : 48; + 3E4C : A9; + 3E4D : 7F; + 3E4E : 8D; + 3E4F : 0D; + 3E50 : DD; + 3E51 : AC; + 3E52 : 0D; + 3E53 : DD; + 3E54 : 30; + 3E55 : 1C; + 3E56 : 20; + 3E57 : 02; + 3E58 : FD; + 3E59 : D0; + 3E5A : 03; + 3E5B : 6C; + 3E5C : 02; + 3E5D : 80; + 3E5E : 20; + 3E5F : BC; + 3E60 : F6; + 3E61 : 20; + 3E62 : E1; + 3E63 : FF; + 3E64 : D0; + 3E65 : 0C; + 3E66 : 20; + 3E67 : 15; + 3E68 : FD; + 3E69 : 20; + 3E6A : A3; + 3E6B : FD; + 3E6C : 20; + 3E6D : 18; + 3E6E : E5; + 3E6F : 6C; + 3E70 : 02; + 3E71 : A0; + 3E72 : 98; + 3E73 : 2D; + 3E74 : A1; + 3E75 : 02; + 3E76 : AA; + 3E77 : 29; + 3E78 : 01; + 3E79 : F0; + 3E7A : 28; + 3E7B : AD; + 3E7C : 00; + 3E7D : DD; + 3E7E : 29; + 3E7F : FB; + 3E80 : 05; + 3E81 : B5; + 3E82 : 8D; + 3E83 : 00; + 3E84 : DD; + 3E85 : AD; + 3E86 : A1; + 3E87 : 02; + 3E88 : 8D; + 3E89 : 0D; + 3E8A : DD; + 3E8B : 8A; + 3E8C : 29; + 3E8D : 12; + 3E8E : F0; + 3E8F : 0D; + 3E90 : 29; + 3E91 : 02; + 3E92 : F0; + 3E93 : 06; + 3E94 : 20; + 3E95 : D6; + 3E96 : FE; + 3E97 : 4C; + 3E98 : 9D; + 3E99 : FE; + 3E9A : 20; + 3E9B : 07; + 3E9C : FF; + 3E9D : 20; + 3E9E : BB; + 3E9F : EE; + 3EA0 : 4C; + 3EA1 : B6; + 3EA2 : FE; + 3EA3 : 8A; + 3EA4 : 29; + 3EA5 : 02; + 3EA6 : F0; + 3EA7 : 06; + 3EA8 : 20; + 3EA9 : D6; + 3EAA : FE; + 3EAB : 4C; + 3EAC : B6; + 3EAD : FE; + 3EAE : 8A; + 3EAF : 29; + 3EB0 : 10; + 3EB1 : F0; + 3EB2 : 03; + 3EB3 : 20; + 3EB4 : 07; + 3EB5 : FF; + 3EB6 : AD; + 3EB7 : A1; + 3EB8 : 02; + 3EB9 : 8D; + 3EBA : 0D; + 3EBB : DD; + 3EBC : 68; + 3EBD : A8; + 3EBE : 68; + 3EBF : AA; + 3EC0 : 68; + 3EC1 : 40; + 3EC2 : C1; + 3EC3 : 27; + 3EC4 : 3E; + 3EC5 : 1A; + 3EC6 : C5; + 3EC7 : 11; + 3EC8 : 74; + 3EC9 : 0E; + 3ECA : ED; + 3ECB : 0C; + 3ECC : 45; + 3ECD : 06; + 3ECE : F0; + 3ECF : 02; + 3ED0 : 46; + 3ED1 : 01; + 3ED2 : B8; + 3ED3 : 00; + 3ED4 : 71; + 3ED5 : 00; + 3ED6 : AD; + 3ED7 : 01; + 3ED8 : DD; + 3ED9 : 29; + 3EDA : 01; + 3EDB : 85; + 3EDC : A7; + 3EDD : AD; + 3EDE : 06; + 3EDF : DD; + 3EE0 : E9; + 3EE1 : 1C; + 3EE2 : 6D; + 3EE3 : 99; + 3EE4 : 02; + 3EE5 : 8D; + 3EE6 : 06; + 3EE7 : DD; + 3EE8 : AD; + 3EE9 : 07; + 3EEA : DD; + 3EEB : 6D; + 3EEC : 9A; + 3EED : 02; + 3EEE : 8D; + 3EEF : 07; + 3EF0 : DD; + 3EF1 : A9; + 3EF2 : 11; + 3EF3 : 8D; + 3EF4 : 0F; + 3EF5 : DD; + 3EF6 : AD; + 3EF7 : A1; + 3EF8 : 02; + 3EF9 : 8D; + 3EFA : 0D; + 3EFB : DD; + 3EFC : A9; + 3EFD : FF; + 3EFE : 8D; + 3EFF : 06; + 3F00 : DD; + 3F01 : 8D; + 3F02 : 07; + 3F03 : DD; + 3F04 : 4C; + 3F05 : 59; + 3F06 : EF; + 3F07 : AD; + 3F08 : 95; + 3F09 : 02; + 3F0A : 8D; + 3F0B : 06; + 3F0C : DD; + 3F0D : AD; + 3F0E : 96; + 3F0F : 02; + 3F10 : 8D; + 3F11 : 07; + 3F12 : DD; + 3F13 : A9; + 3F14 : 11; + 3F15 : 8D; + 3F16 : 0F; + 3F17 : DD; + 3F18 : A9; + 3F19 : 12; + 3F1A : 4D; + 3F1B : A1; + 3F1C : 02; + 3F1D : 8D; + 3F1E : A1; + 3F1F : 02; + 3F20 : A9; + 3F21 : FF; + 3F22 : 8D; + 3F23 : 06; + 3F24 : DD; + 3F25 : 8D; + 3F26 : 07; + 3F27 : DD; + 3F28 : AE; + 3F29 : 98; + 3F2A : 02; + 3F2B : 86; + 3F2C : A8; + 3F2D : 60; + 3F2E : AA; + 3F2F : AD; + 3F30 : 96; + 3F31 : 02; + 3F32 : 2A; + 3F33 : A8; + 3F34 : 8A; + 3F35 : 69; + 3F36 : C8; + 3F37 : 8D; + 3F38 : 99; + 3F39 : 02; + 3F3A : 98; + 3F3B : 69; + 3F3C : 00; + 3F3D : 8D; + 3F3E : 9A; + 3F3F : 02; + 3F40 : 60; + [3F41..3F42] : EA; + 3F43 : 08; + 3F44 : 68; + 3F45 : 29; + 3F46 : EF; + [3F47..3F48] : 48; + 3F49 : 8A; + 3F4A : 48; + 3F4B : 98; + 3F4C : 48; + 3F4D : BA; + 3F4E : BD; + 3F4F : 04; + 3F50 : 01; + 3F51 : 29; + 3F52 : 10; + 3F53 : F0; + 3F54 : 03; + 3F55 : 6C; + 3F56 : 16; + 3F57 : 03; + 3F58 : 6C; + 3F59 : 14; + 3F5A : 03; + 3F5B : 20; + 3F5C : 18; + 3F5D : E5; + 3F5E : AD; + 3F5F : 12; + [3F60..3F61] : D0; + 3F62 : FB; + 3F63 : AD; + 3F64 : 19; + 3F65 : D0; + 3F66 : 29; + 3F67 : 01; + 3F68 : 8D; + 3F69 : A6; + 3F6A : 02; + 3F6B : 4C; + 3F6C : DD; + 3F6D : FD; + 3F6E : A9; + 3F6F : 81; + 3F70 : 8D; + 3F71 : 0D; + 3F72 : DC; + 3F73 : AD; + 3F74 : 0E; + 3F75 : DC; + 3F76 : 29; + 3F77 : 80; + 3F78 : 09; + 3F79 : 11; + 3F7A : 8D; + 3F7B : 0E; + 3F7C : DC; + 3F7D : 4C; + 3F7E : 8E; + 3F7F : EE; + 3F80 : 03; + 3F81 : 4C; + 3F82 : 5B; + 3F83 : FF; + 3F84 : 4C; + 3F85 : A3; + 3F86 : FD; + 3F87 : 4C; + 3F88 : 50; + 3F89 : FD; + 3F8A : 4C; + 3F8B : 15; + 3F8C : FD; + 3F8D : 4C; + 3F8E : 1A; + 3F8F : FD; + 3F90 : 4C; + 3F91 : 18; + 3F92 : FE; + 3F93 : 4C; + 3F94 : B9; + 3F95 : ED; + 3F96 : 4C; + 3F97 : C7; + 3F98 : ED; + 3F99 : 4C; + 3F9A : 25; + 3F9B : FE; + 3F9C : 4C; + 3F9D : 34; + 3F9E : FE; + 3F9F : 4C; + 3FA0 : 87; + 3FA1 : EA; + 3FA2 : 4C; + 3FA3 : 21; + 3FA4 : FE; + 3FA5 : 4C; + 3FA6 : 13; + 3FA7 : EE; + 3FA8 : 4C; + 3FA9 : DD; + 3FAA : ED; + 3FAB : 4C; + 3FAC : EF; + 3FAD : ED; + 3FAE : 4C; + 3FAF : FE; + 3FB0 : ED; + 3FB1 : 4C; + 3FB2 : 0C; + 3FB3 : ED; + 3FB4 : 4C; + 3FB5 : 09; + 3FB6 : ED; + 3FB7 : 4C; + 3FB8 : 07; + 3FB9 : FE; + 3FBA : 4C; + 3FBB : 00; + 3FBC : FE; + 3FBD : 4C; + 3FBE : F9; + 3FBF : FD; + 3FC0 : 6C; + 3FC1 : 1A; + 3FC2 : 03; + 3FC3 : 6C; + 3FC4 : 1C; + 3FC5 : 03; + 3FC6 : 6C; + 3FC7 : 1E; + 3FC8 : 03; + 3FC9 : 6C; + 3FCA : 20; + 3FCB : 03; + 3FCC : 6C; + 3FCD : 22; + 3FCE : 03; + 3FCF : 6C; + 3FD0 : 24; + 3FD1 : 03; + 3FD2 : 6C; + 3FD3 : 26; + 3FD4 : 03; + 3FD5 : 4C; + 3FD6 : 9E; + 3FD7 : F4; + 3FD8 : 4C; + 3FD9 : DD; + 3FDA : F5; + 3FDB : 4C; + 3FDC : E4; + 3FDD : F6; + 3FDE : 4C; + 3FDF : DD; + 3FE0 : F6; + 3FE1 : 6C; + 3FE2 : 28; + 3FE3 : 03; + 3FE4 : 6C; + 3FE5 : 2A; + 3FE6 : 03; + 3FE7 : 6C; + 3FE8 : 2C; + 3FE9 : 03; + 3FEA : 4C; + 3FEB : 9B; + 3FEC : F6; + 3FED : 4C; + 3FEE : 05; + 3FEF : E5; + 3FF0 : 4C; + 3FF1 : 0A; + 3FF2 : E5; + 3FF3 : 4C; + 3FF4 : 00; + 3FF5 : E5; + [3FF6..3FF7] : 52; + 3FF8 : 42; + 3FF9 : 59; + 3FFA : 43; + 3FFB : FE; + 3FFC : E2; + 3FFD : FC; + 3FFE : 48; + 3FFF : FF; +END; diff --git a/Commodore - 64_Mist/rtl/scandoubler.v b/Commodore - 64_Mist/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Commodore - 64_Mist/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Commodore - 64_Mist/rtl/sd_card.sv b/Commodore - 64_Mist/rtl/sd_card.sv new file mode 100644 index 00000000..41eafaba --- /dev/null +++ b/Commodore - 64_Mist/rtl/sd_card.sv @@ -0,0 +1,142 @@ +// +// sd_card.v +// +// Copyright (c) 2016 Sorgelig +// +// This source file is free software: you can redistribute it and/or modify +// it under the terms of the Lesser 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 . +// +// +///////////////////////////////////////////////////////////////////////// + +module sd_card +( + input clk, + input reset, + + output [31:0] sd_lba, + output reg sd_rd, + output reg sd_wr, + input sd_ack, + input sd_ack_conf, + output sd_conf, + output sd_sdhc, + + input [8:0] sd_buff_addr, + input [7:0] sd_buff_dout, + output [7:0] sd_buff_din, + input sd_buff_wr, + + input save_track, + input change, + input [5:0] track, + input [4:0] sector, + input [7:0] buff_addr, + output [7:0] buff_dout, + input [7:0] buff_din, + input buff_we, + output reg busy +); + +assign sd_lba = lba; +assign sd_conf = 0; +assign sd_sdhc = 1; + +trkbuf buffer +( + .clock(~clk), + + .address_a(sd_buff_base + base_fix + sd_buff_addr), + .data_a(sd_buff_dout), + .wren_a(sd_ack & sd_buff_wr), + .q_a(sd_buff_din), + + .address_b({sector, buff_addr}), + .data_b(buff_din), + .wren_b(buff_we), + .q_b(buff_dout) +); + +wire [9:0] start_sectors[41] = + '{ 0, 0, 21, 42, 63, 84,105,126,147,168,189,210,231,252,273,294,315,336,357,376,395, + 414,433,452,471,490,508,526,544,562,580,598,615,632,649,666,683,700,717,734,751}; + +reg [31:0] lba; +reg [12:0] base_fix; +reg [12:0] sd_buff_base; + +always @(posedge clk) begin + reg [5:0] ack; + reg [5:0] cur_track = 0; + reg old_change, ready = 0; + reg saving = 0; + + old_change <= change; + if(~old_change & change) ready <= 1; + + ack <= {ack[4:0], sd_ack}; + if(ack[5:4] == 2'b01) {sd_rd,sd_wr} <= 0; + + if(reset) begin + cur_track <= 'b111111; + busy <= 0; + sd_rd <= 0; + sd_wr <= 0; + saving<= 0; + end + + else + if(busy) begin + if(ack[5:4] == 2'b10) begin + if(sd_buff_base < 'h1800) begin + sd_buff_base <= sd_buff_base + 13'd512; + lba <= lba + 1'd1; + if(saving) sd_wr <= 1; + else sd_rd <= 1; + end + else + if(saving && (cur_track != track)) begin + saving <= 0; + cur_track <= track; + sd_buff_base <= 0; + base_fix <= start_sectors[track][0] ? 13'h1F00 : 13'h0000; + lba <= start_sectors[track][9:1]; + sd_rd <= 1; + end else begin + busy <= 0; + end + end + end + else + if(ready) begin + if(save_track && cur_track != 'b111111) begin + saving <= 1; + sd_buff_base <= 0; + lba <= start_sectors[cur_track][9:1]; + sd_wr <= 1; + busy <= 1; + end + else + if((cur_track != track) || (old_change && ~change)) begin + saving <= 0; + cur_track <= track; + sd_buff_base <= 0; + base_fix <= start_sectors[track][0] ? 13'h1F00 : 13'h0000; + lba <= start_sectors[track][9:1]; + sd_rd <= 1; + busy <= 1; + end + end +end + +endmodule diff --git a/Commodore - 64_Mist/rtl/sdram.v b/Commodore - 64_Mist/rtl/sdram.v new file mode 100644 index 00000000..f8497d55 --- /dev/null +++ b/Commodore - 64_Mist/rtl/sdram.v @@ -0,0 +1,147 @@ +// +// sdram.v +// +// sdram controller implementation for the MiST board +// http://code.google.com/p/mist-board/ +// +// Copyright (c) 2013 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 . +// + +module sdram ( + + // interface to the MT48LC16M16 chip + output [12:0] sd_addr, // 13 bit multiplexed address bus + output [1:0] sd_ba, // two banks + output sd_cs, // a single chip select + output sd_we, // write enable + output sd_ras, // row address select + output sd_cas, // columns address select + + // cpu/chipset interface + input init, // init signal after FPGA config to initialize RAM + input clk, // sdram is accessed at up to 128MHz + +// input [15:0] addr, // 25 bit byte address + input [24:0] addr, // 25 bit byte address + input refresh, // refresh cycle + input ce, // cpu/chipset access + input we // cpu/chipset requests write +); + +// no burst configured +localparam RASCAS_DELAY = 3'd2; // tRCD>=20ns -> 2 cycles@64MHz +localparam BURST_LENGTH = 3'b000; // 000=none, 001=2, 010=4, 011=8 +localparam ACCESS_TYPE = 1'b0; // 0=sequential, 1=interleaved +localparam CAS_LATENCY = 3'd2; // 2/3 allowed +localparam OP_MODE = 2'b00; // only 00 (standard operation) allowed +localparam NO_WRITE_BURST = 1'b1; // 0= write burst enabled, 1=only single access write + +localparam MODE = { 3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, BURST_LENGTH}; + +// --------------------------------------------------------------------- +// ------------------------ cycle state machine ------------------------ +// --------------------------------------------------------------------- + +localparam STATE_IDLE = 3'd0; // first state in cycle +localparam STATE_CMD_START = 3'd1; // state in which a new command can be started +localparam STATE_CMD_CONT = STATE_CMD_START + RASCAS_DELAY - 3'd1; // 4 command can be continued +localparam STATE_LAST = 3'd7; // last state in cycle + +reg [2:0] q /* synthesis noprune */; +reg last_ce, last_refresh; +always @(posedge clk) begin + last_ce <= ce; + last_refresh <= refresh; + + // start a new cycle in rising edge of ce or refresh + if((ce && !last_ce) || (refresh && !last_refresh)) + q <= 3'd1; + + if(q != 0) + q <= q + 3'd1; +end + +// --------------------------------------------------------------------- +// --------------------------- startup/reset --------------------------- +// --------------------------------------------------------------------- + +// wait 1ms (32 clkref cycles) after FPGA config is done before going +// into normal operation. Initialize the ram in the last 16 reset cycles (cycles 15-0) +reg [4:0] reset; +always @(posedge clk) begin + if(init) reset <= 5'h1f; + else if((q == STATE_LAST) && (reset != 0)) + reset <= reset - 5'd1; +end + +// --------------------------------------------------------------------- +// ------------------ generate ram control signals --------------------- +// --------------------------------------------------------------------- + +// all possible commands +localparam CMD_INHIBIT = 4'b1111; +localparam CMD_NOP = 4'b0111; +localparam CMD_ACTIVE = 4'b0011; +localparam CMD_READ = 4'b0101; +localparam CMD_WRITE = 4'b0100; +localparam CMD_BURST_TERMINATE = 4'b0110; +localparam CMD_PRECHARGE = 4'b0010; +localparam CMD_AUTO_REFRESH = 4'b0001; +localparam CMD_LOAD_MODE = 4'b0000; + +reg [3:0] sd_cmd; // current command sent to sd ram + +// drive control signals according to current command +assign sd_cs = sd_cmd[3]; +assign sd_ras = sd_cmd[2]; +assign sd_cas = sd_cmd[1]; +assign sd_we = sd_cmd[0]; + +// assign sd_data = we?{din, din}:16'bZZZZZZZZZZZZZZZZ; +// assign dout = sd_data[7:0]; + +always @(posedge clk) begin + sd_cmd <= CMD_INHIBIT; + + if(reset != 0) begin + if(q == STATE_IDLE) begin + if(reset == 13) sd_cmd <= CMD_PRECHARGE; + if(reset == 2) sd_cmd <= CMD_LOAD_MODE; + end + end else begin + if(q == STATE_IDLE) begin + if(ce && !last_ce) sd_cmd <= CMD_ACTIVE; + if(refresh && !last_refresh) sd_cmd <= CMD_AUTO_REFRESH; + end else if((q == STATE_CMD_CONT)&&(!refresh)) begin + if(we) sd_cmd <= CMD_WRITE; + else if(ce) sd_cmd <= CMD_READ; + end + end +end + +wire [12:0] reset_addr = (reset == 13)?13'b0010000000000:MODE; + +wire [12:0] run_addr = +// (q == STATE_CMD_START)?{ 5'b00000, addr[15:8]}:{ 5'b00100, addr[7:0]}; +//(q == STATE_CMD_START)?addr[21:9]:{ 4'b0010, addr[8:0]}; //possibly try this LCA 6mar17 + (q == STATE_CMD_START)?addr[20:8]:{ 4'b0010, addr[23], addr[7:0]}; + +assign sd_addr = (reset != 0)?reset_addr:run_addr; + +//assign sd_ba = 2'b00; +assign sd_ba = addr[22:21]; + +endmodule diff --git a/Commodore - 64_Mist/rtl/sid/Q_table.vhd b/Commodore - 64_Mist/rtl/sid/Q_table.vhd new file mode 100644 index 00000000..61dfd33b --- /dev/null +++ b/Commodore - 64_Mist/rtl/sid/Q_table.vhd @@ -0,0 +1,45 @@ +------------------------------------------------------------------------------- +-- +-- (C) COPYRIGHT 2010 Gideon's Logic Architectures' +-- +------------------------------------------------------------------------------- +-- +-- Author: Gideon Zweijtzer (gideon.zweijtzer (at) gmail.com) +-- +-- Note that this file is copyrighted, and is not supposed to be used in other +-- projects without written permission from the author. +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity Q_table is +port ( + Q_reg : in unsigned(3 downto 0); + filter_q : out signed(17 downto 0) ); +end Q_table; + +architecture Gideon of Q_table is + + type t_18_bit_array is array(natural range <>) of signed(17 downto 0); + function create_factors(max_Q: real) return t_18_bit_array is + constant critical : real := 0.70710678; -- no resonance at 0.5*sqrt(2) + variable q_step : real; + variable q : real; + variable scaled : real; + variable ret : t_18_bit_array(0 to 15); + begin + q_step := (max_Q - critical) / 15.0; -- linear + for i in 0 to 15 loop + q := critical + (real(i) * q_step); + scaled := 65536.0 / q; + ret(i) := to_signed(integer(scaled), 18); + end loop; + return ret; + end function; + + constant c_table : t_18_bit_array(0 to 15) := create_factors(1.8); +begin + filter_q <= c_table(to_integer(Q_reg)); +end Gideon; diff --git a/Commodore - 64_Mist/rtl/sid/adsr_multi.vhd b/Commodore - 64_Mist/rtl/sid/adsr_multi.vhd new file mode 100644 index 00000000..0387df45 --- /dev/null +++ b/Commodore - 64_Mist/rtl/sid/adsr_multi.vhd @@ -0,0 +1,220 @@ +------------------------------------------------------------------------------- +-- +-- (C) COPYRIGHT 2010 Gideon's Logic Architectures' +-- +------------------------------------------------------------------------------- +-- +-- Author: Gideon Zweijtzer (gideon.zweijtzer (at) gmail.com) +-- +-- Note that this file is copyrighted, and is not supposed to be used in other +-- projects without written permission from the author. +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use work.sid_debug_pkg.all; + +-- LUT: 195, FF:68 + +entity adsr_multi is +generic ( + g_num_voices : integer := 8 ); +port ( + clock : in std_logic; + reset : in std_logic; + + voice_i : in unsigned(3 downto 0); + enable_i : in std_logic; + voice_o : out unsigned(3 downto 0); + enable_o : out std_logic; + + gate : in std_logic; + attack : in std_logic_vector(3 downto 0); + decay : in std_logic_vector(3 downto 0); + sustain : in std_logic_vector(3 downto 0); + release : in std_logic_vector(3 downto 0); + + env_state: out std_logic_vector(1 downto 0); -- for testing only + env_out : out unsigned(7 downto 0) ); + +end adsr_multi; + +-- 158 1 62 .. FF +-- 45 2 35 .. 61 +-- 26 4 1C .. 34 +-- 13 8 0D .. 1B +-- 6 16 07 .. 0C +-- 7 30 00 .. 06 + +architecture gideon of adsr_multi is + + type presc_array_t is array(natural range <>) of unsigned(15 downto 0); + constant prescalers : presc_array_t(0 to 15) := ( + X"0008", X"001F", X"003E", X"005E", + X"0094", X"00DB", X"010A", X"0138", + X"0187", X"03D0", X"07A1", X"0C35", + X"0F42", X"2DC7", X"4C4B", X"7A12" ); + + + signal enveloppe : unsigned(7 downto 0) := (others => '0'); + signal state : unsigned(1 downto 0) := (others => '0'); + + constant st_release : unsigned(1 downto 0) := "00"; + constant st_attack : unsigned(1 downto 0) := "01"; + constant st_decay : unsigned(1 downto 0) := "11"; + + type state_array_t is array(natural range <>) of unsigned(29 downto 0); + signal state_array : state_array_t(0 to g_num_voices-1) := (others => (others => '0')); +begin + env_out <= enveloppe; + env_state <= std_logic_vector(state); + + -- FF-5E 01 + -- 5D-37 02 + -- 36-1B 04 + -- 1A-0F 08 + -- 0E-07 10 + -- 06-01 1E + process(clock) + function logarithmic(lev: unsigned(7 downto 0)) return unsigned is + variable res : unsigned(4 downto 0); + begin + if lev = X"00" then + res := "00000"; -- prescaler off + elsif lev < X"07" then + res := "11101"; -- 1E-1 + elsif lev < X"0F" then + res := "01111"; -- 10-1 + elsif lev < X"1B" then + res := "00111"; -- 08-1 + elsif lev < X"37" then + res := "00011"; -- 04-1 + elsif lev < X"5E" then + res := "00001"; -- 02-1 + else + res := "00000"; -- 01-1 + end if; + return res; + end function logarithmic; + + variable presc_select : integer range 0 to 15; + variable cur_state : unsigned(1 downto 0); + variable cur_env : unsigned(7 downto 0); + variable cur_pre15 : unsigned(14 downto 0); + variable cur_pre5 : unsigned(4 downto 0); + variable next_state : unsigned(1 downto 0); + variable next_env : unsigned(7 downto 0); + variable next_pre15 : unsigned(14 downto 0); + variable next_pre5 : unsigned(4 downto 0); + variable presc_val : unsigned(14 downto 0); + variable log_div : unsigned(4 downto 0); + variable do_count_15 : std_logic; + variable do_count_5 : std_logic; + begin + if rising_edge(clock) then + cur_state := state_array(0)(1 downto 0); + cur_env := state_array(0)(9 downto 2); + cur_pre15 := state_array(0)(24 downto 10); + cur_pre5 := state_array(0)(29 downto 25); + + voice_o <= voice_i; + enable_o <= enable_i; + + next_state := cur_state; + next_env := cur_env; + next_pre15 := cur_pre15; + next_pre5 := cur_pre5; + + + -- PRESCALER LOGIC, output: do_count -- + -- 15 bit prescaler select -- + case cur_state is + when st_attack => + presc_select := to_integer(unsigned(attack)); + when st_decay => + presc_select := to_integer(unsigned(decay)); + when others => -- includes release and idle + presc_select := to_integer(unsigned(release)); + end case; + presc_val := prescalers(presc_select)(14 downto 0); + + -- 15 bit prescaler counter -- + do_count_15 := '0'; + if cur_pre15 = presc_val then + next_pre15 := (others => '0'); + do_count_15 := '1'; + else + next_pre15 := cur_pre15 + 1; + end if; + + -- 5 bit prescaler -- + log_div := logarithmic(cur_env); + do_count_5 := '0'; + if do_count_15='1' then + if (cur_state = st_attack) or cur_pre5 = log_div then + next_pre5 := "00000"; + do_count_5 := '1'; + else + next_pre5 := cur_pre5 + 1; + end if; + end if; + -- END PRESCALER LOGIC -- + + case cur_state is + + when st_attack => + if gate = '0' then + next_state := st_release; + elsif cur_env = X"FF" then + next_state := st_decay; + end if; + + if do_count_15='1' then + next_env := cur_env + 1; +-- if cur_env = X"FE" or cur_env = X"FF" then -- result could be FF, but also 00!! +-- next_state := st_decay; +-- end if; + end if; + + when st_decay => + if gate = '0' then + next_state := st_release; + end if; + + if do_count_15='1' and do_count_5='1' and + std_logic_vector(cur_env) /= (sustain & sustain) and + cur_env /= X"00" then + next_env := cur_env - 1; + end if; + + when st_release => + if gate = '1' then + next_state := st_attack; + end if; + + if do_count_15='1' and do_count_5='1' and + cur_env /= X"00" then + next_env := cur_env - 1; + end if; + + when others => + next_state := st_release; + + end case; + + if enable_i='1' then + state_array(0 to g_num_voices-2) <= state_array(1 to g_num_voices-1); + state_array(g_num_voices-1) <= next_pre5 & next_pre15 & next_env & next_state; + enveloppe <= next_env; + state <= next_state; + end if; + + if reset='1' then + state <= "00"; + enveloppe <= (others => '0'); + enable_o <= '0'; + end if; + end if; + end process; +end gideon; diff --git a/Commodore - 64_Mist/rtl/sid/mult_acc.vhd b/Commodore - 64_Mist/rtl/sid/mult_acc.vhd new file mode 100644 index 00000000..fbabfd0a --- /dev/null +++ b/Commodore - 64_Mist/rtl/sid/mult_acc.vhd @@ -0,0 +1,209 @@ +------------------------------------------------------------------------------- +-- +-- (C) COPYRIGHT 2010 Gideon's Logic Architectures' +-- +------------------------------------------------------------------------------- +-- +-- Author: Gideon Zweijtzer (gideon.zweijtzer (at) gmail.com) +-- +-- Note that this file is copyrighted, and is not supposed to be used in other +-- projects without written permission from the author. +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.my_math_pkg.all; + +entity mult_acc is +port ( + clock : in std_logic; + reset : in std_logic; + + voice_i : in unsigned(3 downto 0); + enable_i : in std_logic; + voice3_off_l : in std_logic; + voice3_off_r : in std_logic; + + filter_en : in std_logic := '0'; + + enveloppe : in unsigned(7 downto 0); + waveform : in unsigned(11 downto 0); + + -- + osc3 : out std_logic_vector(7 downto 0); + env3 : out std_logic_vector(7 downto 0); + + -- + valid_out : out std_logic; + + direct_out_L : out signed(17 downto 0); + direct_out_R : out signed(17 downto 0); + + filter_out_L : out signed(17 downto 0); + filter_out_R : out signed(17 downto 0) ); +end mult_acc; + +-- architecture unsigned_wave of mult_acc is +-- signal filter_m : std_logic; +-- signal voice_m : unsigned(3 downto 0); +-- signal mult_m : unsigned(19 downto 0); +-- signal accu_f : unsigned(17 downto 0); +-- signal accu_u : unsigned(17 downto 0); +-- signal enable_d : std_logic; +-- signal direct_i : unsigned(17 downto 0); +-- signal filter_i : unsigned(17 downto 0); +-- begin +-- process(clock) +-- variable mult_ext : unsigned(21 downto 0); +-- variable mult_trunc : unsigned(21 downto 4); +-- begin +-- if rising_edge(clock) then +-- -- latch outputs +-- if reset='1' then +-- osc3 <= (others => '0'); +-- env3 <= (others => '0'); +-- elsif voice_i = X"2" then +-- osc3 <= std_logic_vector(waveform(11 downto 4)); +-- env3 <= std_logic_vector(enveloppe); +-- end if; +-- +-- mult_ext := extend(mult_m, mult_ext'length); +-- mult_trunc := mult_ext(mult_trunc'range); +-- filter_m <= filter_en; +-- voice_m <= voice_i; +-- mult_m <= enveloppe * waveform; +-- valid_out <= '0'; +-- enable_d <= enable_i; +-- +-- if enable_d='1' then +-- if voice_m = 0 then +-- valid_out <= '1'; +-- direct_i <= accu_u; +-- filter_i <= accu_f; +-- if filter_m='1' then +-- accu_f <= mult_trunc; +-- accu_u <= (others => '0'); +-- else +-- accu_f <= (others => '0'); +-- accu_u <= mult_trunc; +-- end if; +-- else +-- valid_out <= '0'; +-- if filter_m='1' then +-- accu_f <= sum_limit(accu_f, mult_trunc); +-- else +-- if (voice_m /= 2) or (voice3_off = '0') then +-- accu_u <= sum_limit(accu_u, mult_trunc); +-- end if; +-- end if; +-- end if; +-- end if; +-- +-- if reset = '1' then +-- valid_out <= '0'; +-- accu_u <= (others => '0'); +-- accu_f <= (others => '0'); +-- direct_i <= (others => '0'); +-- filter_i <= (others => '0'); +-- end if; +-- end if; +-- end process; +-- +-- direct_out <= '0' & signed(direct_i(17 downto 1)); +-- filter_out <= '0' & signed(filter_i(17 downto 1)); +-- end unsigned_wave; +-- + +architecture signed_wave of mult_acc is + signal filter_m : std_logic; + signal voice_m : unsigned(3 downto 0); + signal mult_m : signed(20 downto 0); + signal accu_fl : signed(17 downto 0); + signal accu_fr : signed(17 downto 0); + signal accu_ul : signed(17 downto 0); + signal accu_ur : signed(17 downto 0); + signal enable_d : std_logic; +begin + process(clock) + variable mult_ext : signed(21 downto 0); + variable mult_trunc : signed(21 downto 4); + variable env_signed : signed(8 downto 0); + variable wave_signed: signed(11 downto 0); + begin + if rising_edge(clock) then + -- latch outputs + if reset='1' then + osc3 <= (others => '0'); + env3 <= (others => '0'); + elsif voice_i = X"2" then + osc3 <= std_logic_vector(waveform(11 downto 4)); + env3 <= std_logic_vector(enveloppe); + end if; + + env_signed := '0' & signed(enveloppe); + wave_signed := not waveform(11) & signed(waveform(10 downto 0)); + + mult_ext := extend(mult_m, mult_ext'length); + mult_trunc := mult_ext(mult_trunc'range); + filter_m <= filter_en; + voice_m <= voice_i; + mult_m <= env_signed * wave_signed; + valid_out <= '0'; + enable_d <= enable_i; + if enable_d='1' then + if voice_m = 0 then + valid_out <= '1'; + direct_out_l <= accu_ul; + direct_out_r <= accu_ur; + filter_out_l <= accu_fl; + filter_out_r <= accu_fr; + accu_fr <= (others => '0'); + accu_ur <= (others => '0'); + if filter_m='1' then + accu_fl <= mult_trunc; + accu_ul <= (others => '0'); + else + accu_fl <= (others => '0'); + accu_ul <= mult_trunc; + end if; + elsif voice_m(3)='0' then + valid_out <= '0'; + if filter_m='1' then + accu_fl <= sum_limit(accu_fl, mult_trunc); + else + if (voice_m /= 2) or (voice3_off_l = '0') then + accu_ul <= sum_limit(accu_ul, mult_trunc); + end if; + end if; + else -- upper 8 voices go to right + valid_out <= '0'; + if filter_m='1' then + accu_fr <= sum_limit(accu_fr, mult_trunc); + else + if (voice_m /= 10) or (voice3_off_r = '0') then + accu_ur <= sum_limit(accu_ur, mult_trunc); + end if; + end if; + end if; + + end if; + + if reset = '1' then + valid_out <= '0'; + accu_ul <= (others => '0'); + accu_fl <= (others => '0'); + accu_ur <= (others => '0'); + accu_fr <= (others => '0'); + direct_out_l <= (others => '0'); + direct_out_r <= (others => '0'); + filter_out_l <= (others => '0'); + filter_out_r <= (others => '0'); + end if; + end if; + end process; + + +end signed_wave; diff --git a/Commodore - 64_Mist/rtl/sid/my_math_pkg.vhd b/Commodore - 64_Mist/rtl/sid/my_math_pkg.vhd new file mode 100644 index 00000000..40f77fdf --- /dev/null +++ b/Commodore - 64_Mist/rtl/sid/my_math_pkg.vhd @@ -0,0 +1,120 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +package my_math_pkg is + + function sum_limit(i1, i2 : signed) return signed; + function sub_limit(i1, i2 : signed) return signed; + function sum_limit(i1, i2 : unsigned) return unsigned; + function extend(x : signed; len : natural) return signed; + function extend(x : unsigned; len : natural) return unsigned; + function left_align(x : signed; len : natural) return signed; + function left_scale(x : signed; sh : natural) return signed; + +-- function shift_right(x : signed; positions: natural) return signed; +end; + +package body my_math_pkg is + + function sum_limit(i1, i2 : signed) return signed is + variable o : signed(i1'range); + begin + assert i1'length = i2'length + report "i1 and i2 should have the same length!" + severity failure; + o := i1 + i2; + if (i1(i1'left) = i2(i2'left)) and (o(o'left) /= i1(i1'left)) then + if i1(i1'left)='1' then + o := to_signed(-(2**(o'length-1)), o'length); + else + o := to_signed(2**(o'length-1) - 1, o'length); + end if; + end if; + return o; + end function; + + function sub_limit(i1, i2 : signed) return signed is + variable o : signed(i1'range); + begin + assert i1'length = i2'length + report "i1 and i2 should have the same length!" + severity failure; + o := i1 - i2; + if (i1(i1'left) /= i2(i2'left)) and (o(o'left) /= i1(i1'left)) then + if i1(i1'left)='1' then + o := to_signed(-(2**(o'length-1)), o'length); + else + o := to_signed(2**(o'length-1) - 1, o'length); + end if; + end if; + return o; + end function; + + function sum_limit(i1, i2 : unsigned) return unsigned is + variable o : unsigned(i1'length downto 0); + begin + o := ('0' & i1) + i2; + if o(o'left)='1' then + o := (others => '1'); + end if; + return o(i1'length-1 downto 0); + end function; + + function extend(x : signed; len : natural) return signed is + variable ret : signed(len-1 downto 0); + alias a : signed(x'length-1 downto 0) is x; + begin + ret := (others => x(x'left)); + ret(a'range) := a; + return ret; + end function extend; + + function extend(x : unsigned; len : natural) return unsigned is + variable ret : unsigned(len-1 downto 0); + alias a : unsigned(x'length-1 downto 0) is x; + begin + ret := (others => '0'); + ret(a'range) := a; + return ret; + end function extend; + + function left_align(x : signed; len : natural) return signed is + variable ret : signed(len-1 downto 0); + begin + ret := (others => '0'); + ret(len-1 downto len-x'length) := x; + return ret; + end function left_align; + + function left_scale(x : signed; sh : natural) return signed is + alias a : signed(x'length-1 downto 0) is x; + variable ret : signed(x'length-(1+sh) downto 0); + variable top : signed(sh downto 0); + begin + if sh=0 then + return x; + end if; + + top := a(a'high downto a'high-sh); + if (top = -1) or (top = 0) then -- can shift without getting punished! + ret := a(ret'range); + elsif a(a'high)='1' then -- negative and can't shift, so max neg: + ret := (others => '0'); + ret(ret'high) := '1'; + else -- positive and can't shift, so max pos + ret := (others => '1'); + ret(ret'high) := '0'; + end if; + return ret; + end function left_scale; + +-- function shift_right(x : signed; positions: natural) return signed is +-- alias a : signed(x'length-1 downto 0) is x; +-- variable ret : signed(x'length-1 downto 0); +-- begin +-- ret := (others => x(x'left)); +-- ret(a'left-positions downto 0) := a(a'left downto positions); +-- return ret; +-- end function shift_right; +end; diff --git a/Commodore - 64_Mist/rtl/sid/oscillator.vhd b/Commodore - 64_Mist/rtl/sid/oscillator.vhd new file mode 100644 index 00000000..543cfdcd --- /dev/null +++ b/Commodore - 64_Mist/rtl/sid/oscillator.vhd @@ -0,0 +1,92 @@ +------------------------------------------------------------------------------- +-- +-- (C) COPYRIGHT 2010 Gideon's Logic Architectures' +-- +------------------------------------------------------------------------------- +-- +-- Author: Gideon Zweijtzer (gideon.zweijtzer (at) gmail.com) +-- +-- Note that this file is copyrighted, and is not supposed to be used in other +-- projects without written permission from the author. +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity oscillator is +generic ( + g_num_voices : integer := 8); +port ( + clock : in std_logic; + reset : in std_logic; + + enable_i : in std_logic; + voice_i : in unsigned(3 downto 0); + freq : in unsigned(15 downto 0); + test : in std_logic := '0'; + sync : in std_logic := '0'; + + voice_o : out unsigned(3 downto 0); + enable_o : out std_logic; + test_o : out std_logic; + osc_val : out unsigned(23 downto 0); + carry_20 : out std_logic; + msb_other: out std_logic ); + +end oscillator; + + +architecture Gideon of oscillator is + type accu_array_t is array (natural range <>) of unsigned(23 downto 0); + signal accu_reg : accu_array_t(0 to g_num_voices-1) := (others => (others => '0')); + + type int4_array is array (natural range <>) of integer range 0 to 15; + + constant voice_linkage : int4_array(0 to 15) := ( 2, 0, 1, 7, 3, 4, 5, 6, + 10, 8, 9, 15, 11, 12, 13, 14 ); + + signal ring_index : integer range 0 to 15; + signal sync_index : integer range 0 to 15; + signal msb_register : std_logic_vector(0 to 15) := (others => '0'); + signal car_register : std_logic_vector(0 to 15) := (others => '0'); + signal do_sync : std_logic; +begin + sync_index <= voice_linkage(to_integer(voice_i)); + do_sync <= sync and car_register(sync_index); + ring_index <= voice_linkage(to_integer(voice_i)); + + process(clock) + variable cur_accu : unsigned(23 downto 0); + variable new_accu : unsigned(24 downto 0); + variable cur_20 : std_logic; + begin + if rising_edge(clock) then + cur_accu := accu_reg(0); + cur_20 := cur_accu(20); + + if reset='1' or test='1' or do_sync='1' then + new_accu := (others => '0'); + else + new_accu := ('0' & cur_accu) + freq; + end if; + + osc_val <= new_accu(23 downto 0); +-- carry <= new_accu(24); + carry_20 <= new_accu(20) xor cur_20; + msb_other <= msb_register(ring_index); + voice_o <= voice_i; + enable_o <= enable_i; + test_o <= test; + + if enable_i='1' then + accu_reg(0 to g_num_voices-2) <= accu_reg(1 to g_num_voices-1); + accu_reg(g_num_voices-1) <= new_accu(23 downto 0); + + car_register(to_integer(voice_i)) <= new_accu(24); + msb_register(to_integer(voice_i)) <= cur_accu(23); + end if; + end if; + end process; + +end Gideon; diff --git a/Commodore - 64_Mist/rtl/sid/sid_ctrl.vhd b/Commodore - 64_Mist/rtl/sid/sid_ctrl.vhd new file mode 100644 index 00000000..5b2bb3c8 --- /dev/null +++ b/Commodore - 64_Mist/rtl/sid/sid_ctrl.vhd @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +-- +-- (C) COPYRIGHT 2010 Gideon's Logic Architectures' +-- +------------------------------------------------------------------------------- +-- +-- Author: Gideon Zweijtzer (gideon.zweijtzer (at) gmail.com) +-- +-- Note that this file is copyrighted, and is not supposed to be used in other +-- projects without written permission from the author. +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sid_ctrl is +generic ( + g_num_voices : natural := 8 ); +port ( + clock : in std_logic; + reset : in std_logic; + + start_iter : in std_logic; + + voice_osc : out unsigned(3 downto 0); + enable_osc : out std_logic ); + +end sid_ctrl; + +architecture gideon of sid_ctrl is + + signal voice_cnt : unsigned(3 downto 0); + signal enable : std_logic; + +begin + process(clock) + begin + if rising_edge(clock) then + if reset='1' then + voice_cnt <= X"0"; + enable <= '0'; + elsif start_iter='1' then + voice_cnt <= X"0"; + enable <= '1'; + elsif voice_cnt = g_num_voices-1 then + voice_cnt <= X"0"; + enable <= '0'; + elsif enable='1' then + voice_cnt <= voice_cnt + 1; + enable <= '1'; + end if; + end if; + end process; + + voice_osc <= voice_cnt; + enable_osc <= enable; +end gideon; diff --git a/Commodore - 64_Mist/rtl/sid/sid_debug_pkg.vhd b/Commodore - 64_Mist/rtl/sid/sid_debug_pkg.vhd new file mode 100644 index 00000000..13452751 --- /dev/null +++ b/Commodore - 64_Mist/rtl/sid/sid_debug_pkg.vhd @@ -0,0 +1,35 @@ +------------------------------------------------------------------------------- +-- +-- (C) COPYRIGHT 2010 Gideon's Logic Architectures' +-- +------------------------------------------------------------------------------- +-- +-- Author: Gideon Zweijtzer (gideon.zweijtzer (at) gmail.com) +-- +-- Note that this file is copyrighted, and is not supposed to be used in other +-- projects without written permission from the author. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +package sid_debug_pkg is + + type t_voice_debug is record + state : unsigned(1 downto 0); + enveloppe : unsigned(7 downto 0); + pre15 : unsigned(14 downto 0); + pre5 : unsigned(4 downto 0); + presc : unsigned(14 downto 0); + gate : std_logic; + attack : std_logic_vector(3 downto 0); + decay : std_logic_vector(3 downto 0); + sustain : std_logic_vector(3 downto 0); + release : std_logic_vector(3 downto 0); + end record; + + type t_voice_debug_array is array(natural range <>) of t_voice_debug; + +end; diff --git a/Commodore - 64_Mist/rtl/sid/sid_filter.vhd b/Commodore - 64_Mist/rtl/sid/sid_filter.vhd new file mode 100644 index 00000000..cfadd865 --- /dev/null +++ b/Commodore - 64_Mist/rtl/sid/sid_filter.vhd @@ -0,0 +1,309 @@ +------------------------------------------------------------------------------- +-- +-- (C) COPYRIGHT 2010 Gideon's Logic Architectures' +-- +------------------------------------------------------------------------------- +-- +-- Author: Gideon Zweijtzer (gideon.zweijtzer (at) gmail.com) +-- +-- Note that this file is copyrighted, and is not supposed to be used in other +-- projects without written permission from the author. +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.my_math_pkg.all; + +entity sid_filter is +generic ( + g_divider : natural := 221 ); +port ( + clock : in std_logic; + reset : in std_logic; + enable : in std_logic; + + filt_co : in unsigned(10 downto 0); + filt_res : in unsigned(3 downto 0); + + valid_in : in std_logic := '0'; + error_out : out std_logic; + input : in signed(17 downto 0); + high_pass : out signed(17 downto 0); + band_pass : out signed(17 downto 0); + low_pass : out signed(17 downto 0); + + valid_out : out std_logic ); +end sid_filter; + +architecture dsvf of sid_filter is + signal filter_q : signed(17 downto 0); + signal filter_f : signed(17 downto 0); + signal input_sc : signed(17 downto 0); + signal filt_ram : std_logic_vector(15 downto 0); + signal xa : signed(17 downto 0); + signal xb : signed(17 downto 0); + signal sum_b : signed(17 downto 0); + signal sub_a : signed(17 downto 0); + signal sub_b : signed(17 downto 0); + signal x_reg : signed(17 downto 0) := (others => '0'); + signal bp_reg : signed(17 downto 0); + signal hp_reg : signed(17 downto 0); + signal lp_reg : signed(17 downto 0); + signal temp_reg : signed(17 downto 0); + signal error : std_logic := '0'; + signal divider : integer range 0 to g_divider-1; + + signal instruction : std_logic_vector(7 downto 0); + type t_byte_array is array(natural range <>) of std_logic_vector(7 downto 0); + constant c_program : t_byte_array := (X"80", X"12", X"81", X"4C", X"82", X"20"); + + type t_word_array is array(1023 downto 0) of signed(15 downto 0); + constant coef : t_word_array := + ( + X"fff6", X"ffe5", X"ffd4", X"ffc3", X"ffb2", X"ffa0", X"ff8f", X"ff7e", + X"ff6d", X"ff5c", X"ff4a", X"ff39", X"ff28", X"ff17", X"ff06", X"fef4", + X"fee3", X"fed2", X"fec1", X"feb0", X"fe9e", X"fe8d", X"fe7c", X"fe6b", + X"fe5a", X"fe48", X"fe37", X"fe26", X"fe15", X"fe04", X"fdf2", X"fde1", + X"fdd0", X"fdbf", X"fdae", X"fd9c", X"fd8b", X"fd7a", X"fd69", X"fd58", + X"fd46", X"fd35", X"fd24", X"fd13", X"fd02", X"fcf0", X"fcdf", X"fcce", + X"fcbd", X"fcac", X"fc9a", X"fc89", X"fc78", X"fc67", X"fc56", X"fc44", + X"fc33", X"fc22", X"fc11", X"fc00", X"fbee", X"fbdd", X"fbcc", X"fbbb", + X"fb99", X"fb76", X"fb54", X"fb32", X"fb10", X"faee", X"facc", X"faaa", + X"fa88", X"fa65", X"fa43", X"fa21", X"f9ff", X"f9dd", X"f9bb", X"f999", + X"f976", X"f954", X"f932", X"f910", X"f8ee", X"f8cc", X"f8aa", X"f888", + X"f865", X"f843", X"f821", X"f7ff", X"f7dd", X"f7bb", X"f799", X"f776", + X"f754", X"f732", X"f710", X"f6ee", X"f6cc", X"f6aa", X"f688", X"f665", + X"f643", X"f621", X"f5ff", X"f5dd", X"f5bb", X"f599", X"f576", X"f554", + X"f532", X"f510", X"f4ee", X"f4cc", X"f4aa", X"f488", X"f465", X"f443", + X"f421", X"f3ff", X"f3dd", X"f3bb", X"f399", X"f376", X"f354", X"f332", + X"f2f4", X"f2b5", X"f276", X"f238", X"f1f9", X"f1bb", X"f17c", X"f13e", + X"f0ff", X"f0c0", X"f082", X"f043", X"f005", X"efc6", X"ef88", X"ef49", + X"ef0a", X"eecc", X"ee8d", X"ee4f", X"ee10", X"edd2", X"ed93", X"ed54", + X"ed16", X"ecd7", X"ec99", X"ec5a", X"ec1b", X"ebdd", X"eb9e", X"eb60", + X"eb21", X"eae3", X"eaa4", X"ea65", X"ea27", X"e9e8", X"e9aa", X"e96b", + X"e92d", X"e8ee", X"e8af", X"e871", X"e832", X"e7f4", X"e7b5", X"e777", + X"e738", X"e6f9", X"e6bb", X"e67c", X"e63e", X"e5ff", X"e5c0", X"e582", + X"e543", X"e505", X"e4c6", X"e488", X"e449", X"e40a", X"e3cc", X"e38d", + X"e338", X"e2e3", X"e28d", X"e238", X"e1e3", X"e18d", X"e138", X"e0e3", + X"e08d", X"e038", X"dfe3", X"df8d", X"df38", X"dee3", X"de8d", X"de38", + X"dde3", X"dd8d", X"dd38", X"dce3", X"dc8d", X"dc38", X"dbe3", X"db8d", + X"db38", X"dae3", X"da8d", X"da38", X"d9e3", X"d98d", X"d938", X"d8e3", + X"d88d", X"d838", X"d7e3", X"d78d", X"d738", X"d6e3", X"d68d", X"d638", + X"d5e3", X"d58d", X"d538", X"d4e3", X"d48d", X"d438", X"d3e3", X"d38d", + X"d338", X"d2e3", X"d28d", X"d238", X"d1e3", X"d18d", X"d138", X"d0e3", + X"d08d", X"d038", X"cfe3", X"cf8d", X"cf38", X"cee3", X"ce8d", X"ce38", + X"cdaa", X"cd1c", X"cc8d", X"cbff", X"cb71", X"cae3", X"ca54", X"c9c6", + X"c938", X"c8aa", X"c81c", X"c78d", X"c6ff", X"c671", X"c5e3", X"c554", + X"c4c6", X"c438", X"c3aa", X"c31c", X"c28d", X"c1ff", X"c171", X"c0e3", + X"c054", X"bfc6", X"bf38", X"beaa", X"be1c", X"bd8d", X"bcff", X"bc71", + X"bbe3", X"bb54", X"bac6", X"ba38", X"b9aa", X"b91c", X"b88d", X"b7ff", + X"b771", X"b6e3", X"b654", X"b5c6", X"b538", X"b4aa", X"b41c", X"b38d", + X"b2ff", X"b271", X"b1e3", X"b154", X"b0c6", X"b038", X"afaa", X"af1c", + X"ae8d", X"adff", X"ad71", X"ace3", X"ac54", X"abc6", X"ab38", X"aaaa", + X"aa1c", X"a98d", X"a8ff", X"a871", X"a7e3", X"a755", X"a6c6", X"a638", + X"a5aa", X"a51c", X"a48d", X"a3ff", X"a371", X"a2e3", X"a255", X"a1c6", + X"a138", X"a0aa", X"a01c", X"9f8d", X"9eff", X"9e71", X"9de3", X"9d55", + X"9cc6", X"9c38", X"9baa", X"9b1c", X"9a8d", X"99ff", X"9971", X"98e3", + X"9855", X"97c6", X"9738", X"96aa", X"961c", X"958d", X"94ff", X"9471", + X"93e3", X"9355", X"92c6", X"9238", X"91aa", X"911c", X"908d", X"8fff", + X"8f71", X"8ee3", X"8e55", X"8dc6", X"8d38", X"8caa", X"8c1c", X"8b8d", + X"8aff", X"8a71", X"89e3", X"8955", X"88c6", X"8838", X"87aa", X"871c", + X"8699", X"8616", X"8593", X"8510", X"848d", X"840b", X"8388", X"8305", + X"8282", X"81ff", X"817c", X"80fa", X"8077", X"7ff4", X"7f71", X"7eee", + X"7e6b", X"7de8", X"7d66", X"7ce3", X"7c60", X"7bdd", X"7b5a", X"7ad7", + X"7a55", X"79d2", X"794f", X"78cc", X"7849", X"77c6", X"7744", X"76c1", + X"763e", X"75bb", X"7538", X"74b5", X"7432", X"73b0", X"732d", X"72aa", + X"7227", X"71a4", X"7121", X"709f", X"701c", X"6f99", X"6f16", X"6e93", + X"6e10", X"6d8e", X"6d0b", X"6c88", X"6c05", X"6b82", X"6aff", X"6a7c", + X"69fa", X"6977", X"68f4", X"6871", X"67ee", X"676b", X"66e9", X"6666", + X"65dd", X"6555", X"64cc", X"6444", X"63bb", X"6333", X"62aa", X"6221", + X"6199", X"6110", X"6088", X"5fff", X"5f77", X"5eee", X"5e66", X"5ddd", + X"5d55", X"5ccc", X"5c44", X"5bbb", X"5b33", X"5aaa", X"5a21", X"5999", + X"5910", X"5888", X"57ff", X"5777", X"56ee", X"5666", X"55dd", X"5555", + X"54b5", X"5416", X"5377", X"52d8", X"5238", X"5199", X"50fa", X"505a", + X"4fbb", X"4f1c", X"4e7d", X"4ddd", X"4d3e", X"4c9f", X"4bff", X"4b60", + X"4ac8", X"4a31", X"4999", X"4901", X"486a", X"47d2", X"473a", X"46a2", + X"460b", X"4573", X"44db", X"4444", X"438e", X"42d8", X"4222", X"416b", + X"54b9", X"5381", X"5248", X"5110", X"4fff", X"4eee", X"4ddd", X"4ccc", + X"4c16", X"4b60", X"4aaa", X"49f4", X"493e", X"4888", X"47d2", X"471c", + X"467d", X"45dd", X"453e", X"449f", X"43ff", X"4360", X"42c1", X"4222", + X"4182", X"40e3", X"4044", X"3fa4", X"3f05", X"3e66", X"3dc6", X"3d27", + X"3caa", X"3c2d", X"3bb0", X"3b33", X"3ab5", X"3a38", X"39bb", X"393e", + X"38c1", X"3844", X"37c7", X"3749", X"36cc", X"364f", X"35d2", X"3555", + X"34d8", X"345a", X"33dd", X"3360", X"32e3", X"3266", X"31e9", X"316b", + X"30ee", X"3071", X"2ff4", X"2f77", X"2efa", X"2e7d", X"2dff", X"2d82", + X"2d1c", X"2cb5", X"2c4f", X"2be9", X"2b82", X"2b1c", X"2ab5", X"2a4f", + X"29e9", X"2982", X"291c", X"28b5", X"284f", X"27e9", X"2782", X"271c", + X"26b5", X"264f", X"25e9", X"2582", X"251c", X"24b5", X"244f", X"23e9", + X"2382", X"231c", X"22b5", X"224f", X"21e9", X"2182", X"211c", X"20b5", + X"2066", X"2016", X"1fc7", X"1f77", X"1f27", X"1ed8", X"1e88", X"1e38", + X"1de9", X"1d99", X"1d49", X"1cfa", X"1caa", X"1c5a", X"1c0b", X"1bbb", + X"1b6c", X"1b1c", X"1acc", X"1a7d", X"1a2d", X"19dd", X"198e", X"193e", + X"18ee", X"189f", X"184f", X"17ff", X"17b0", X"1760", X"1711", X"16c1", + X"1692", X"1664", X"1635", X"1606", X"15d8", X"15a9", X"157a", X"154c", + X"151d", X"14ee", X"14c0", X"1491", X"1462", X"1434", X"1405", X"13d7", + X"13a8", X"1379", X"134b", X"131c", X"12ed", X"12bf", X"1290", X"1261", + X"1233", X"1204", X"11d5", X"11a7", X"1178", X"1149", X"111b", X"10ec", + X"10bd", X"108f", X"1060", X"1032", X"1003", X"0fd4", X"0fa6", X"0f77", + X"0f48", X"0f1a", X"0eeb", X"0ebc", X"0e8e", X"0e5f", X"0e30", X"0e02", + X"0dd3", X"0da4", X"0d76", X"0d47", X"0d19", X"0cea", X"0cbb", X"0c8d", + X"0c5e", X"0c2f", X"0c01", X"0bd2", X"0ba3", X"0b75", X"0b46", X"0b17", + X"0b03", X"0aee", X"0ada", X"0ac5", X"0ab1", X"0a9c", X"0a88", X"0a74", + X"0a5f", X"0a4b", X"0a36", X"0a22", X"0a0d", X"09f9", X"09e4", X"09d0", + X"09bb", X"09a7", X"0992", X"097e", X"0969", X"0955", X"0940", X"092c", + X"0917", X"0903", X"08ee", X"08da", X"08c5", X"08b1", X"089c", X"0888", + X"0874", X"085f", X"084b", X"0836", X"0822", X"080d", X"07f9", X"07e4", + X"07d0", X"07bb", X"07a7", X"0792", X"077e", X"0769", X"0755", X"0740", + X"072c", X"0717", X"0703", X"06ee", X"06da", X"06c5", X"06b1", X"069d", + X"0688", X"0674", X"065f", X"064b", X"0636", X"0622", X"060d", X"05f9", + X"05f2", X"05eb", X"05e4", X"05dd", X"05d7", X"05d0", X"05c9", X"05c2", + X"05bb", X"05b4", X"05ae", X"05a7", X"05a0", X"0599", X"0592", X"058b", + X"0585", X"057e", X"0577", X"0570", X"0569", X"0562", X"055c", X"0555", + X"054e", X"0547", X"0540", X"053a", X"0533", X"052c", X"0525", X"051e", + X"0517", X"0511", X"050a", X"0503", X"04fc", X"04f5", X"04ee", X"04e8", + X"04e1", X"04da", X"04d3", X"04cc", X"04c5", X"04bf", X"04b8", X"04b1", + X"04aa", X"04a3", X"049d", X"0496", X"048f", X"0488", X"0481", X"047a", + X"0474", X"046d", X"0466", X"045f", X"0458", X"0451", X"044b", X"0444", + X"0441", X"043e", X"043b", X"0438", X"0436", X"0433", X"0430", X"042d", + X"042a", X"0427", X"0424", X"0422", X"041f", X"041c", X"0419", X"0416", + X"0413", X"0411", X"040e", X"040b", X"0408", X"0405", X"0402", X"03ff", + X"03fd", X"03fa", X"03f7", X"03f4", X"03f1", X"03ee", X"03ec", X"03e9", + X"03e6", X"03e3", X"03e0", X"03dd", X"03db", X"03d8", X"03d5", X"03d2", + X"03cf", X"03cc", X"03c9", X"03c7", X"03c4", X"03c1", X"03be", X"03bb", + X"03b8", X"03b6", X"03b3", X"03b0", X"03ad", X"03aa", X"03a7", X"03a4", + X"03a2", X"039f", X"039c", X"0399", X"0396", X"0393", X"0391", X"038e", + X"038d", X"038b", X"038a", X"0389", X"0388", X"0387", X"0386", X"0385", + X"0383", X"0382", X"0381", X"0380", X"037f", X"037e", X"037d", X"037c", + X"037a", X"0379", X"0378", X"0377", X"0376", X"0375", X"0374", X"0372", + X"0371", X"0370", X"036f", X"036e", X"036d", X"036c", X"036a", X"0369", + X"0368", X"0367", X"0366", X"0365", X"0364", X"0362", X"0361", X"0360", + X"035f", X"035e", X"035d", X"035c", X"035b", X"0359", X"0358", X"0357", + X"0356", X"0355", X"0354", X"0353", X"0351", X"0350", X"034f", X"034e", + X"034d", X"034c", X"034b", X"0349", X"0348", X"0347", X"0346", X"0345", + X"0344", X"0344", X"0343", X"0343", X"0342", X"0341", X"0341", X"0340", + X"0340", X"033f", X"033f", X"033e", X"033e", X"033d", X"033c", X"033c", + X"033b", X"033b", X"033a", X"033a", X"0339", X"0338", X"0338", X"0337", + X"0337", X"0336", X"0336", X"0335", X"0334", X"0334", X"0333", X"0333", + X"0332", X"0332", X"0331", X"0330", X"0330", X"032f", X"032f", X"032e", + X"032e", X"032d", X"032c", X"032c", X"032b", X"032b", X"032a", X"032a", + X"0329", X"0328", X"0328", X"0327", X"0327", X"0326", X"0326", X"0325", + X"0324", X"0324", X"0323", X"0323", X"0322", X"0322", X"0321", X"0320" + ); + + alias xa_select : std_logic is instruction(0); + alias xb_select : std_logic is instruction(1); + alias sub_a_sel : std_logic is instruction(2); + alias sub_b_sel : std_logic is instruction(3); + alias sum_to_lp : std_logic is instruction(4); + alias sum_to_bp : std_logic is instruction(5); + alias sub_to_hp : std_logic is instruction(6); + alias mult_enable : std_logic is instruction(7); + +begin + -- Derive the actual 'f' and 'q' parameters + i_q_table: entity work.Q_table + port map ( + Q_reg => filt_res, + filter_q => filter_q ); -- 2.16 format + + process(clock) + begin + if rising_edge(clock) then + if(enable = '1') then + filter_f <= "00" & coef(to_integer(filt_co(10 downto 1))); + else + filter_f <= "001111111111111111"; + end if; + end if; + end process; + + --input_sc <= input; + input_sc <= shift_right(input, 1); + + -- operations to execute the filter: + -- bp_f = f * bp_reg + -- q_contrib = q * bp_reg + -- lp = bp_f + lp_reg + -- temp = input - lp + -- hp = temp - q_contrib + -- hp_f = f * hp + -- bp = hp_f + bp_reg + -- bp_reg = bp + -- lp_reg = lp + + -- x_reg = f * bp_reg -- 10000000 -- 80 + -- lp_reg = x_reg + lp_reg -- 00010010 -- 12 + -- q_contrib = q * bp_reg -- 10000001 -- 81 + -- temp = input - lp -- 00000000 -- 00 (can be merged with previous!) + -- hp_reg = temp - q_contrib -- 01001100 -- 4C + -- x_reg = f * hp_reg -- 10000010 -- 82 + -- bp_reg = x_reg + bp_reg -- 00100000 -- 20 + + + -- now perform the arithmetic + xa <= filter_f when xa_select='0' else filter_q; + xb <= bp_reg when xb_select='0' else hp_reg; + sum_b <= bp_reg when xb_select='0' else lp_reg; + sub_a <= input_sc when sub_a_sel='0' else temp_reg; + sub_b <= lp_reg when sub_b_sel='0' else x_reg; + + process(clock) + variable x_result : signed(35 downto 0); + variable sum_result : signed(17 downto 0); + variable sub_result : signed(17 downto 0); + begin + if rising_edge(clock) then + x_result := xa * xb; + if mult_enable='1' then + x_reg <= x_result(33 downto 16); + if (x_result(35 downto 33) /= "000") and (x_result(35 downto 33) /= "111") then + error <= not error; + end if; + end if; + + sum_result := sum_limit(x_reg, sum_b); + temp_reg <= sum_result; + if sum_to_lp='1' then + lp_reg <= sum_result; + end if; + if sum_to_bp='1' then + bp_reg <= sum_result; + end if; + + sub_result := sub_limit(sub_a, sub_b); + temp_reg <= sub_result; + if sub_to_hp='1' then + hp_reg <= sub_result; + end if; + + -- control part + instruction <= (others => '0'); + if reset='1' then + hp_reg <= (others => '0'); + lp_reg <= (others => '0'); + bp_reg <= (others => '0'); + divider <= 0; + elsif divider = g_divider-1 then + divider <= 0; + else + divider <= divider + 1; + if divider < c_program'length then + instruction <= c_program(divider); + end if; + end if; + if divider = c_program'length then + valid_out <= '1'; + else + valid_out <= '0'; + end if; + end if; + end process; + + high_pass <= hp_reg; + band_pass <= bp_reg; + low_pass <= lp_reg; + error_out <= error; +end dsvf; diff --git a/Commodore - 64_Mist/rtl/sid/sid_mixer.vhd b/Commodore - 64_Mist/rtl/sid/sid_mixer.vhd new file mode 100644 index 00000000..0b6c090f --- /dev/null +++ b/Commodore - 64_Mist/rtl/sid/sid_mixer.vhd @@ -0,0 +1,115 @@ +------------------------------------------------------------------------------- +-- +-- (C) COPYRIGHT 2010 Gideon's Logic Architectures' +-- +------------------------------------------------------------------------------- +-- +-- Author: Gideon Zweijtzer (gideon.zweijtzer (at) gmail.com) +-- +-- Note that this file is copyrighted, and is not supposed to be used in other +-- projects without written permission from the author. +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.my_math_pkg.all; + +entity sid_mixer is +port ( + clock : in std_logic; + reset : in std_logic; + + valid_in : in std_logic := '0'; + + direct_out : in signed(17 downto 0); + high_pass : in signed(17 downto 0); + band_pass : in signed(17 downto 0); + low_pass : in signed(17 downto 0); + + filter_hp : in std_logic; + filter_bp : in std_logic; + filter_lp : in std_logic; + + volume : in unsigned(3 downto 0); + + mixed_out : out signed(17 downto 0); + valid_out : out std_logic ); +end sid_mixer; + +architecture arith of sid_mixer is + signal mix_i : signed(17 downto 0); + signal mix_uns : unsigned(16 downto 0); + signal vol_uns : unsigned(16 downto 0); + signal vol_s : signed(16 downto 0); + signal state : integer range 0 to 7; + signal p_mul : unsigned(33 downto 0); + signal p_mul_s : signed(34 downto 0); + + type t_volume_lut is array(natural range <>) of unsigned(15 downto 0); + constant c_volume_lut : t_volume_lut(0 to 15) := ( + X"0000", X"0EEF", X"1DDE", X"2CCD", X"3BBC", X"4AAA", X"5999", X"6888", + X"7777", X"8666", X"9555", X"A444", X"B333", X"C221", X"D110", X"DFFF" ); + + +begin + process(clock) + variable mix_total : signed(17 downto 0); + begin + if rising_edge(clock) then + valid_out <= '0'; + + state <= state + 1; + case state is + when 0 => + if valid_in = '1' then + mix_i <= sum_limit(direct_out, to_signed(16384, 18)); + else + state <= 0; + end if; + + when 1 => + if filter_hp='1' then + mix_i <= sum_limit(mix_i, high_pass); + end if; + + when 2 => + if filter_bp='1' then + mix_i <= sum_limit(mix_i, band_pass); + end if; + + when 3 => + if filter_lp='1' then + mix_i <= sum_limit(mix_i, low_pass); + end if; + + when 4 => +-- p_mul <= mix_uns * vol_uns; + p_mul_s <= mix_i * vol_s; + valid_out <= '1'; + state <= 0; + + when others => + state <= 0; + + end case; + +-- mix_total := not(p_mul(32)) & signed(p_mul(31 downto 15)); +-- mixed_out <= mix_total; -- + to_signed(16384, 18); + mixed_out <= p_mul_s(33 downto 16); + + if reset='1' then + mix_i <= (others => '0'); + state <= 0; + end if; + end if; + end process; + +-- vol_uns <= "0" & volume & volume & volume & volume; +-- vol_uns <= '0' & c_volume_lut(to_integer(volume)); +-- mix_uns <= not mix_i(17) & unsigned(mix_i(16 downto 1)); + + vol_s <= '0' & signed(c_volume_lut(to_integer(volume))); +end arith; diff --git a/Commodore - 64_Mist/rtl/sid/sid_regs.vhd b/Commodore - 64_Mist/rtl/sid/sid_regs.vhd new file mode 100644 index 00000000..8586f25e --- /dev/null +++ b/Commodore - 64_Mist/rtl/sid/sid_regs.vhd @@ -0,0 +1,242 @@ +------------------------------------------------------------------------------- +-- +-- (C) COPYRIGHT 2010 Gideon's Logic Architectures' +-- +------------------------------------------------------------------------------- +-- +-- Author: Gideon Zweijtzer (gideon.zweijtzer (at) gmail.com) +-- +-- Note that this file is copyrighted, and is not supposed to be used in other +-- projects without written permission from the author. +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sid_regs is +port ( + clock : in std_logic; + reset : in std_logic; + + addr : in unsigned(7 downto 0); + wren : in std_logic; + wdata : in std_logic_vector(7 downto 0); + rdata : out std_logic_vector(7 downto 0); + potx : in std_logic; + poty : in std_logic;--- + comb_wave_l : in std_logic; + comb_wave_r : in std_logic; +--- + voice_osc : in unsigned(3 downto 0); + voice_wave : in unsigned(3 downto 0); + voice_adsr : in unsigned(3 downto 0); + voice_mul : in unsigned(3 downto 0); + + -- Oscillator parameters + freq : out unsigned(15 downto 0); + test : out std_logic; + sync : out std_logic; + + -- Wave map parameters + comb_mode : out std_logic; + ring_mod : out std_logic; + wave_sel : out std_logic_vector(3 downto 0); + sq_width : out unsigned(11 downto 0); + + -- ADSR parameters + gate : out std_logic; + attack : out std_logic_vector(3 downto 0); + decay : out std_logic_vector(3 downto 0); + sustain : out std_logic_vector(3 downto 0); + release : out std_logic_vector(3 downto 0); + + -- mixer 1 parameters + filter_en : out std_logic; + + -- globals + volume_l : out unsigned(3 downto 0) := (others => '0'); + filter_co_l : out unsigned(10 downto 0) := (others => '0'); + filter_res_l : out unsigned(3 downto 0) := (others => '0'); + filter_ex_l : out std_logic := '0'; + filter_hp_l : out std_logic := '0'; + filter_bp_l : out std_logic := '0'; + filter_lp_l : out std_logic := '0'; + voice3_off_l : out std_logic := '0'; + + volume_r : out unsigned(3 downto 0) := (others => '0'); + filter_co_r : out unsigned(10 downto 0) := (others => '0'); + filter_res_r : out unsigned(3 downto 0) := (others => '0'); + filter_ex_r : out std_logic := '0'; + filter_hp_r : out std_logic := '0'; + filter_bp_r : out std_logic := '0'; + filter_lp_r : out std_logic := '0'; + voice3_off_r : out std_logic := '0'; + + -- readback + osc3 : in std_logic_vector(7 downto 0); + env3 : in std_logic_vector(7 downto 0) ); + + attribute ramstyle : string; + +end sid_regs; + +architecture gideon of sid_regs is + attribute ramstyle of gideon : architecture is "logic"; + + type byte_array_t is array(natural range <>) of std_logic_vector(7 downto 0); + type nibble_array_t is array(natural range <>) of std_logic_vector(3 downto 0); + signal freq_lo : byte_array_t(0 to 15) := (others => (others => '0')); + signal freq_hi : byte_array_t(0 to 15) := (others => (others => '0')); + signal phase_lo : byte_array_t(0 to 15) := (others => (others => '0')); + signal phase_hi : nibble_array_t(0 to 15):= (others => (others => '0')); + signal control : byte_array_t(0 to 15) := (others => (others => '0')); + signal att_dec : byte_array_t(0 to 15) := (others => (others => '0')); + signal sust_rel : byte_array_t(0 to 15) := (others => (others => '0')); + signal do_write : std_logic; + signal wdata_d : std_logic_vector(7 downto 0); + signal filt_en_i: std_logic_vector(15 downto 0) := (others => '0'); + + constant address_remap : byte_array_t(0 to 255) := ( + X"00", X"01", X"02", X"03", X"04", X"05", X"06", -- 00 Voice 1 + X"10", X"11", X"12", X"13", X"14", X"15", X"16", -- 07 Voice 2 + X"20", X"21", X"22", X"23", X"24", X"25", X"26", -- 0E Voice 3 + + X"08", X"09", X"0A", X"0B", -- 15 + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- 19 + + X"30", X"31", X"32", X"33", X"34", X"35", X"36", -- 20 Voice 4 + X"40", X"41", X"42", X"43", X"44", X"45", X"46", -- 27 Voice 5 + X"50", X"51", X"52", X"53", X"54", X"55", X"56", -- 2E Voice 6 + X"60", X"61", X"62", X"63", X"64", X"65", X"66", -- 35 Voice 7 + X"70", X"71", X"72", X"73", X"74", X"75", X"76", -- 3C Voice 8 + X"0C", X"0D", X"0E", -- 43 + + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- 46 + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- 4D + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- 54 + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- 5B + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- 62 + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- 69 + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- 70 + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- 77 + X"FF", X"FF", -- 7E + + X"80", X"81", X"82", X"83", X"84", X"85", X"86", -- 80 Voice 9 + X"90", X"91", X"92", X"93", X"94", X"95", X"96", -- 87 Voice 10 + X"A0", X"A1", X"A2", X"A3", X"A4", X"A5", X"A6", -- 8E Voice 11 + + X"88", X"89", X"8A", X"8B", -- 95 + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- 99 + + X"B0", X"B1", X"B2", X"B3", X"B4", X"B5", X"B6", -- A0 Voice 12 + X"C0", X"C1", X"C2", X"C3", X"C4", X"C5", X"C6", -- A7 Voice 13 + X"D0", X"D1", X"D2", X"D3", X"D4", X"D5", X"D6", -- AE Voice 14 + X"E0", X"E1", X"E2", X"E3", X"E4", X"E5", X"E6", -- B5 Voice 15 + X"F0", X"F1", X"F2", X"F3", X"F4", X"F5", X"F6", -- BC Voice 16 + X"8C", X"8D", X"8E", -- C3 + + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- C6 + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- CD + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- D4 + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- DB + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- E2 + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- E9 + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- F0 + X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", X"FF", -- F7 + X"FF", X"FF" ); -- FE + + signal address : unsigned(7 downto 0); +begin + process(clock) + begin + if rising_edge(clock) then + address <= unsigned(address_remap(to_integer(addr))); + do_write <= wren; + wdata_d <= wdata; + + if do_write='0' and wren='1' then + if address(3)='0' then -- Voice register + case address(2 downto 0) is + when "000" => freq_lo(to_integer(address(7 downto 4))) <= wdata_d; + when "001" => freq_hi(to_integer(address(7 downto 4))) <= wdata_d; + when "010" => phase_lo(to_integer(address(7 downto 4))) <= wdata_d; + when "011" => phase_hi(to_integer(address(7 downto 4))) <= wdata_d(3 downto 0); + when "100" => control(to_integer(address(7 downto 4))) <= wdata_d; + when "101" => att_dec(to_integer(address(7 downto 4))) <= wdata_d; + when "110" => sust_rel(to_integer(address(7 downto 4))) <= wdata_d; + when others => null; + end case; + elsif address(7)='0' then -- Global register for left + case address(2 downto 0) is + when "000" => filter_co_l(2 downto 0) <= unsigned(wdata_d(2 downto 0)); + when "001" => filter_co_l(10 downto 3) <= unsigned(wdata_d); + when "010" => filter_res_l <= unsigned(wdata_d(7 downto 4)); + filter_ex_l <= wdata_d(3); + filt_en_i(2 downto 0) <= wdata_d(2 downto 0); + when "011" => voice3_off_l <= wdata_d(7); + filter_hp_l <= wdata_d(6); + filter_bp_l <= wdata_d(5); + filter_lp_l <= wdata_d(4); + volume_l <= unsigned(wdata_d(3 downto 0)); + when "100" => filt_en_i(7 downto 0) <= wdata_d; + when others => null; + end case; + else -- Global register for right + case address(2 downto 0) is + when "000" => filter_co_r(2 downto 0) <= unsigned(wdata_d(2 downto 0)); + when "001" => filter_co_r(10 downto 3) <= unsigned(wdata_d); + when "010" => filter_res_r <= unsigned(wdata_d(7 downto 4)); + filter_ex_r <= wdata_d(3); + filt_en_i(10 downto 8) <= wdata_d(2 downto 0); + when "011" => voice3_off_r <= wdata_d(7); + filter_hp_r <= wdata_d(6); + filter_bp_r <= wdata_d(5); + filter_lp_r <= wdata_d(4); + volume_r <= unsigned(wdata_d(3 downto 0)); + when "100" => filt_en_i(15 downto 8) <= wdata_d; + when others => null; + end case; + end if; + end if; + + -- Readback (unmapped address) + case addr is + when "00011001" => rdata <= potx & potx & potx & potx & potx & potx & potx & potx; + when "00011010" => rdata <= poty & poty & poty & poty & poty & poty & poty & poty; + when "00011011" => rdata <= osc3; + when "00011100" => rdata <= env3; + when others => rdata <= (others => '0'); + end case; + + if reset='1' then + filt_en_i <= (others => '0'); + voice3_off_l <= '0'; + voice3_off_r <= '0'; + volume_l <= X"0"; + volume_r <= X"0"; + end if; + end if; + end process; + + freq <= unsigned(freq_hi(to_integer(voice_osc))) & unsigned(freq_lo(to_integer(voice_osc))); + test <= control(to_integer(voice_osc))(3); + sync <= control(to_integer(voice_osc))(1); + + -- Wave map parameters + ring_mod <= control(to_integer(voice_wave))(2); + wave_sel <= control(to_integer(voice_wave))(7 downto 4); + sq_width <= unsigned(phase_hi(to_integer(voice_wave))) & unsigned(phase_lo(to_integer(voice_wave))); + comb_mode <= (voice_wave(3) and comb_wave_r) or (not voice_wave(3) and comb_wave_l); + + -- ADSR parameters + gate <= control(to_integer(voice_adsr))(0); + attack <= att_dec(to_integer(voice_adsr))(7 downto 4); + decay <= att_dec(to_integer(voice_adsr))(3 downto 0); + sustain <= sust_rel(to_integer(voice_adsr))(7 downto 4); + release <= sust_rel(to_integer(voice_adsr))(3 downto 0); + + -- Mixer 1 parameters + filter_en <= filt_en_i(to_integer(voice_mul)); + +end gideon; diff --git a/Commodore - 64_Mist/rtl/sid/sid_top.vhd b/Commodore - 64_Mist/rtl/sid/sid_top.vhd new file mode 100644 index 00000000..374d3ce9 --- /dev/null +++ b/Commodore - 64_Mist/rtl/sid/sid_top.vhd @@ -0,0 +1,409 @@ +------------------------------------------------------------------------------- +-- +-- (C) COPYRIGHT 2010 Gideon's Logic Architectures' +-- +------------------------------------------------------------------------------- +-- +-- Author: Gideon Zweijtzer (gideon.zweijtzer (at) gmail.com) +-- +-- Note that this file is copyrighted, and is not supposed to be used in other +-- projects without written permission from the author. +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; + +entity sid_top is +generic ( + g_filter_div : natural := 141; --for 32 MHz (221; -- for 50 MHz) + g_num_voices : natural := 3 ); +port ( + clock : in std_logic; + reset : in std_logic; + + addr : in unsigned(7 downto 0); + wren : in std_logic; + wdata : in std_logic_vector(7 downto 0); + rdata : out std_logic_vector(7 downto 0); + potx : in std_logic; + poty : in std_logic; + + comb_wave_l : in std_logic := '0'; + comb_wave_r : in std_logic := '0'; + + start_iter : in std_logic; + sample_left : out signed(17 downto 0); + sample_right : out signed(17 downto 0); + + extfilter_en : in std_logic +); +end sid_top; + + +architecture structural of sid_top is + + -- Voice index in pipe + signal voice_osc : unsigned(3 downto 0); + signal voice_wave : unsigned(3 downto 0); + signal voice_mul : unsigned(3 downto 0); + signal enable_osc : std_logic; + signal enable_wave : std_logic; + signal enable_mul : std_logic; + + -- Oscillator parameters + signal freq : unsigned(15 downto 0); + signal test : std_logic; + signal sync : std_logic; + + -- Wave map parameters + signal msb_other : std_logic; + signal comb_mode : std_logic; + signal ring_mod : std_logic; + signal wave_sel : std_logic_vector(3 downto 0); + signal sq_width : unsigned(11 downto 0); + + -- ADSR parameters + signal gate : std_logic; + signal attack : std_logic_vector(3 downto 0); + signal decay : std_logic_vector(3 downto 0); + signal sustain : std_logic_vector(3 downto 0); + signal release : std_logic_vector(3 downto 0); + + -- Filter enable + signal filter_en : std_logic; + + -- globals + signal volume_l : unsigned(3 downto 0); + signal filter_co_l : unsigned(10 downto 0); + signal filter_res_l : unsigned(3 downto 0); + signal filter_hp_l : std_logic; + signal filter_bp_l : std_logic; + signal filter_lp_l : std_logic; + signal voice3_off_l : std_logic; + + signal volume_r : unsigned(3 downto 0); + signal filter_co_r : unsigned(10 downto 0); + signal filter_res_r : unsigned(3 downto 0); + signal filter_hp_r : std_logic; + signal filter_bp_r : std_logic; + signal filter_lp_r : std_logic; + signal voice3_off_r : std_logic; + + -- readback + signal osc3 : std_logic_vector(7 downto 0); + signal env3 : std_logic_vector(7 downto 0); + + -- intermediate flags and signals + signal test_wave : std_logic; + signal osc_val : unsigned(23 downto 0); + signal carry_20 : std_logic; + signal enveloppe : unsigned(7 downto 0); + signal waveform : unsigned(11 downto 0); + + signal valid_sum : std_logic; + signal valid_filt : std_logic; + signal valid_mix : std_logic; + + signal filter_out_l: signed(17 downto 0) := (others => '0'); + signal direct_out_l: signed(17 downto 0) := (others => '0'); + signal high_pass_l : signed(17 downto 0) := (others => '0'); + signal band_pass_l : signed(17 downto 0) := (others => '0'); + signal low_pass_l : signed(17 downto 0) := (others => '0'); + signal mixed_out_l : signed(17 downto 0) := (others => '0'); + + signal filter_out_r: signed(17 downto 0) := (others => '0'); + signal direct_out_r: signed(17 downto 0) := (others => '0'); + signal high_pass_r : signed(17 downto 0) := (others => '0'); + signal band_pass_r : signed(17 downto 0) := (others => '0'); + signal low_pass_r : signed(17 downto 0) := (others => '0'); + signal mixed_out_r : signed(17 downto 0) := (others => '0'); +begin + + i_regs: entity work.sid_regs + port map + ( + clock => clock, + reset => reset, + + addr => addr, + wren => wren, + wdata => wdata, + rdata => rdata, + potx => potx, + poty => poty, + + comb_wave_l => comb_wave_l, + comb_wave_r => comb_wave_r, + + voice_osc => voice_osc, + voice_wave => voice_wave, + voice_adsr => voice_wave, + voice_mul => voice_mul, + + -- Oscillator parameters + freq => freq, + test => test, + sync => sync, + + -- Wave map parameters + comb_mode => comb_mode, + ring_mod => ring_mod, + wave_sel => wave_sel, + sq_width => sq_width, + + -- ADSR parameters + gate => gate, + attack => attack, + decay => decay, + sustain => sustain, + release => release, + + -- mixer parameters + filter_en => filter_en, + + -- globals + volume_l => volume_l, + filter_co_l => filter_co_l, + filter_res_l=> filter_res_l, + filter_ex_l => open, + filter_hp_l => filter_hp_l, + filter_bp_l => filter_bp_l, + filter_lp_l => filter_lp_l, + voice3_off_l=> voice3_off_l, + + volume_r => volume_r, + filter_co_r => filter_co_r, + filter_res_r=> filter_res_r, + filter_ex_r => open, + filter_hp_r => filter_hp_r, + filter_bp_r => filter_bp_r, + filter_lp_r => filter_lp_r, + voice3_off_r=> voice3_off_r, + + -- readback + osc3 => osc3, + env3 => env3 + ); + + i_ctrl: entity work.sid_ctrl + generic map + ( + g_num_voices => g_num_voices + ) + port map + ( + clock => clock, + reset => reset, + start_iter => start_iter, + voice_osc => voice_osc, + enable_osc => enable_osc + ); + + + osc: entity work.oscillator + generic map + ( + g_num_voices + ) + port map + ( + clock => clock, + reset => reset, + + voice_i => voice_osc, + voice_o => voice_wave, + + enable_i => enable_osc, + enable_o => enable_wave, + + freq => freq, + test => test, + sync => sync, + + osc_val => osc_val, + test_o => test_wave, + carry_20 => carry_20, + msb_other => msb_other + ); + + wmap: entity work.wave_map + generic map + ( + g_num_voices => g_num_voices, + g_sample_bits => 12 + ) + port map + ( + clock => clock, + reset => reset, + test => test_wave, + + osc_val => osc_val, + carry_20 => carry_20, + msb_other => msb_other, + + voice_i => voice_wave, + enable_i => enable_wave, + comb_mode => comb_mode, + wave_sel => wave_sel, + ring_mod => ring_mod, + sq_width => sq_width, + + voice_o => voice_mul, + enable_o => enable_mul, + wave_out => waveform + ); + + adsr: entity work.adsr_multi + generic map + ( + g_num_voices => g_num_voices + ) + port map + ( + clock => clock, + reset => reset, + + voice_i => voice_wave, + enable_i => enable_wave, + voice_o => open, + enable_o => open, + + gate => gate, + attack => attack, + decay => decay, + sustain => sustain, + release => release, + + env_state=> open, -- for testing only + env_out => enveloppe + ); + + sum: entity work.mult_acc(signed_wave) + port map + ( + clock => clock, + reset => reset, + + voice_i => voice_mul, + enable_i => enable_mul, + voice3_off_l=> voice3_off_l, + voice3_off_r=> voice3_off_r, + + enveloppe => enveloppe, + waveform => waveform, + filter_en => filter_en, + + osc3 => osc3, + env3 => env3, + + valid_out => valid_sum, + filter_out_L => filter_out_L, + filter_out_R => filter_out_R, + direct_out_L => direct_out_L, + direct_out_R => direct_out_R + ); + + i_filt_left: entity work.sid_filter + generic map + ( + g_divider => g_filter_div + ) + port map + ( + clock => clock, + reset => reset, + enable => extfilter_en, + + filt_co => filter_co_l, + filt_res => filter_res_l, + + valid_in => valid_sum, + + input => filter_out_L, + high_pass => high_pass_L, + band_pass => band_pass_L, + low_pass => low_pass_L, + + error_out => open, + valid_out => valid_filt + ); + + mix: entity work.sid_mixer + port map + ( + clock => clock, + reset => reset, + + valid_in => valid_filt, + + direct_out => direct_out_L, + high_pass => high_pass_L, + band_pass => band_pass_L, + low_pass => low_pass_L, + + filter_hp => filter_hp_l, + filter_bp => filter_bp_l, + filter_lp => filter_lp_l, + + volume => volume_l, + + mixed_out => mixed_out_L, + valid_out => open + ); + + i_filt_right: entity work.sid_filter + generic map + ( + g_divider => g_filter_div + ) + port map + ( + clock => clock, + reset => reset, + enable => extfilter_en, + + filt_co => filter_co_r, + filt_res => filter_res_r, + + valid_in => valid_sum, + + input => filter_out_R, + high_pass => high_pass_R, + band_pass => band_pass_R, + low_pass => low_pass_R, + + error_out => open, + valid_out => open + ); + + mix_right: entity work.sid_mixer + port map + ( + clock => clock, + reset => reset, + + valid_in => valid_filt, + + direct_out => direct_out_R, + high_pass => high_pass_R, + band_pass => band_pass_R, + low_pass => low_pass_R, + + filter_hp => filter_hp_r, + filter_bp => filter_bp_r, + filter_lp => filter_lp_r, + + volume => volume_r, + + mixed_out => mixed_out_R, + valid_out => open + ); + + sample_left <= mixed_out_L; + sample_right <= mixed_out_R; + +end structural; diff --git a/Commodore - 64_Mist/rtl/sid/wave_map.vhd b/Commodore - 64_Mist/rtl/sid/wave_map.vhd new file mode 100644 index 00000000..47e79854 --- /dev/null +++ b/Commodore - 64_Mist/rtl/sid/wave_map.vhd @@ -0,0 +1,178 @@ +------------------------------------------------------------------------------- +-- +-- (C) COPYRIGHT 2010 Gideon's Logic Architectures' +-- +------------------------------------------------------------------------------- +-- +-- Author: Gideon Zweijtzer (gideon.zweijtzer (at) gmail.com) +-- +-- Note that this file is copyrighted, and is not supposed to be used in other +-- projects without written permission from the author. +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity wave_map is +generic ( + g_num_voices : integer := 8; -- 8 or 16, clock should then be 8 or 16 MHz, too! + g_sample_bits : integer := 8 ); +port ( + clock : in std_logic; + reset : in std_logic; + + osc_val : in unsigned(23 downto 0); + carry_20 : in std_logic; + + msb_other: in std_logic := '0'; + ring_mod : in std_logic := '0'; + test : in std_logic := '0'; + + voice_i : in unsigned(3 downto 0); + comb_mode: in std_logic; + enable_i : in std_logic; + wave_sel : in std_logic_vector(3 downto 0); + sq_width : in unsigned(11 downto 0); + + voice_o : out unsigned(3 downto 0); + enable_o : out std_logic; + wave_out : out unsigned(g_sample_bits-1 downto 0) ); + +end wave_map; + + +architecture Gideon of wave_map is + type noise_array_t is array (natural range <>) of unsigned(22 downto 0); + signal noise_reg : noise_array_t(0 to g_num_voices-1) := (others => (0 => '1', others => '0')); + type voice_array_t is array (natural range <>) of unsigned(g_sample_bits-1 downto 0); + signal voice_reg : voice_array_t(0 to g_num_voices-1) := (others => (others => '0')); + + type t_byte_array is array(natural range <>) of unsigned(7 downto 0); + constant c_wave_TP : t_byte_array(0 to 255) := ( + 16#FF# => X"FF", 16#F7# => X"F7", 16#EF# => X"EF", 16#E7# => X"E0", + 16#FE# => X"FE", 16#F6# => X"F0", 16#EE# => X"E0", 16#E6# => X"00", + 16#FD# => X"FD", 16#F5# => X"FD", 16#ED# => X"E0", 16#E5# => X"00", + 16#FC# => X"F8", 16#F4# => X"80", 16#EC# => X"00", 16#E4# => X"00", + 16#FB# => X"FB", 16#F3# => X"F0", 16#EB# => X"E0", 16#E3# => X"00", + 16#FA# => X"F8", 16#F2# => X"08", 16#EA# => X"00", 16#E2# => X"00", + 16#F9# => X"F0", 16#F1# => X"00", 16#E9# => X"00", 16#E1# => X"00", + 16#F8# => X"80", 16#F0# => X"00", 16#E8# => X"00", 16#E0# => X"00", + + 16#DF# => X"DF", 16#DE# => X"D0", 16#DD# => X"C0", 16#DB# => X"C0", + 16#D7# => X"C0", 16#CF# => X"C0", 16#BF# => X"BF", 16#BE# => X"B0", + 16#BD# => X"A0", 16#B9# => X"80", 16#B7# => X"80", 16#AF# => X"80", + + 16#7F# => X"7F", 16#7E# => X"70", 16#7D# => X"70", 16#7B# => X"60", + 16#77# => X"40", others => X"00" ); + + constant c_wave_TS : t_byte_array(0 to 255) := ( + 16#7F# => X"1E", 16#FE# => X"18", 16#FF# => X"3E", others => X"00" ); + +begin + process(clock) + variable noise_tmp : unsigned(22 downto 0); + variable voice_tmp : unsigned(g_sample_bits-1 downto 0); + variable triangle : unsigned(g_sample_bits-1 downto 0); + variable square : unsigned(g_sample_bits-1 downto 0); + variable sawtooth : unsigned(g_sample_bits-1 downto 0); + variable out_tmp : unsigned(g_sample_bits-1 downto 0); + variable new_bit : std_logic; + begin + if rising_edge(clock) then + -- take top of list + voice_tmp := voice_reg(0); + noise_tmp := noise_reg(0); + + if reset='1' or test='1' then + noise_tmp := (others => '1'); -- seed not equal to zero + elsif carry_20='1' then + new_bit := noise_tmp(22) xor noise_tmp(21) xor noise_tmp(20) xor noise_tmp(15); + noise_tmp := noise_tmp(21 downto 0) & new_bit; + end if; + + if osc_val(23)='1' then + triangle := not osc_val(22 downto 23-g_sample_bits); + else + triangle := osc_val(22 downto 23-g_sample_bits); + end if; + if ring_mod='1' and msb_other='0' then + triangle := not triangle; + end if; + + sawtooth := osc_val(23 downto 24-g_sample_bits); + if osc_val(23 downto 12) < sq_width then + square := (others => '0'); + else + square := (others => '1'); + end if; + + out_tmp := (others => '0'); + case wave_sel is + when X"0" => + out_tmp := voice_tmp; + when X"1" => + out_tmp := triangle; + when X"2" => + out_tmp := sawtooth; + when X"3" => + if comb_mode='0' then + out_tmp(g_sample_bits-1 downto g_sample_bits-8) := + c_wave_TS(to_integer(osc_val(23 downto 23-g_sample_bits))); + else -- 8580 + out_tmp := triangle and sawtooth; + end if; + when X"4" => + out_tmp := square; + when X"5" => -- combined triangle and square + if comb_mode='0' then + if square(0)='1' then + out_tmp(g_sample_bits-1 downto g_sample_bits-8) := + c_wave_TP(to_integer(triangle(g_sample_bits-1 downto g_sample_bits-8))); + end if; + else -- 8580 + out_tmp := triangle and square; + end if; + when X"6" => -- combined saw and pulse + if comb_mode='1' then + out_tmp := sawtooth and square; + end if; + + when X"7" => -- combined triangle, saw and pulse + if comb_mode='1' then + out_tmp := triangle and sawtooth and square; + end if; + + when X"8" => + out_tmp(g_sample_bits-1) := noise_tmp(22); -- unsure.. 21? + out_tmp(g_sample_bits-2) := noise_tmp(20); + out_tmp(g_sample_bits-3) := noise_tmp(16); + out_tmp(g_sample_bits-4) := noise_tmp(13); + out_tmp(g_sample_bits-5) := noise_tmp(11); + out_tmp(g_sample_bits-6) := noise_tmp(7); + out_tmp(g_sample_bits-7) := noise_tmp(4); + out_tmp(g_sample_bits-8) := noise_tmp(2); + +-- when X"9"|X"A"|X"B"|X"C"|X"D"|X"E"|X"F" => +-- out_tmp := noise_tmp(20 downto 21-g_sample_bits); +-- noise_tmp := (others => '0'); + when others => + null; + end case; + + if enable_i='1' then + noise_reg(g_num_voices-1) <= noise_tmp; + noise_reg(0 to g_num_voices-2) <= noise_reg(1 to g_num_voices-1); + voice_reg(g_num_voices-1) <= out_tmp; + voice_reg(0 to g_num_voices-2) <= voice_reg(1 to g_num_voices-1); + end if; + + --out_tmp(out_tmp'high) := not out_tmp(out_tmp'high); + wave_out <= unsigned(out_tmp); + + voice_o <= voice_i; + enable_o <= enable_i; + end if; + end process; + +end Gideon; diff --git a/Commodore - 64_Mist/rtl/sigma_delta_dac.v b/Commodore - 64_Mist/rtl/sigma_delta_dac.v new file mode 100644 index 00000000..d692f3a0 --- /dev/null +++ b/Commodore - 64_Mist/rtl/sigma_delta_dac.v @@ -0,0 +1,29 @@ + +module sigma_delta_dac #(parameter MSBI=14, parameter INV=1'b1) +( + output reg DACout = INV, //Average Output feeding analog lowpass + input [MSBI:0] DACin, //DAC input (excess 2**MSBI) + input CLK, + input RESET +); + +reg [MSBI+2:0] DeltaAdder; //Output of Delta Adder +reg [MSBI+2:0] SigmaAdder; //Output of Sigma Adder +reg [MSBI+2:0] SigmaLatch; //Latches output of Sigma Adder +reg [MSBI+2:0] DeltaB; //B input of Delta Adder + +always @(*) DeltaB = {SigmaLatch[MSBI+2], SigmaLatch[MSBI+2]} << (MSBI+1); +always @(*) DeltaAdder = DACin + DeltaB; +always @(*) SigmaAdder = DeltaAdder + SigmaLatch; + +always @(posedge CLK or posedge RESET) begin + if(RESET) begin + SigmaLatch <= 1'b1 << (MSBI+1); + DACout <= INV; + end else begin + SigmaLatch <= SigmaAdder; + DACout <= SigmaLatch[MSBI+2] ^ INV; + end +end + +endmodule diff --git a/Commodore - 64_Mist/rtl/trkbuf.v b/Commodore - 64_Mist/rtl/trkbuf.v new file mode 100644 index 00000000..b91fea12 --- /dev/null +++ b/Commodore - 64_Mist/rtl/trkbuf.v @@ -0,0 +1,242 @@ +// megafunction wizard: %RAM: 2-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: trkbuf.v +// Megafunction Name(s): +// altsyncram +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Full Version +// ************************************************************ + + +//Copyright (C) 1991-2014 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 trkbuf ( + address_a, + address_b, + clock, + data_a, + data_b, + wren_a, + wren_b, + q_a, + q_b); + + input [12:0] address_a; + input [12:0] address_b; + input clock; + input [7:0] data_a; + input [7:0] data_b; + input wren_a; + input wren_b; + output [7:0] q_a; + output [7:0] q_b; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; + tri0 wren_a; + tri0 wren_b; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [7:0] sub_wire0; + wire [7:0] sub_wire1; + wire [7:0] q_a = sub_wire0[7:0]; + wire [7:0] q_b = sub_wire1[7:0]; + + altsyncram altsyncram_component ( + .clock0 (clock), + .wren_a (wren_a), + .address_b (address_b), + .data_b (data_b), + .wren_b (wren_b), + .address_a (address_a), + .data_a (data_a), + .q_a (sub_wire0), + .q_b (sub_wire1), + .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), + .eccstatus (), + .rden_a (1'b1), + .rden_b (1'b1)); + defparam + 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_a = "BYPASS", + altsyncram_component.clock_enable_output_b = "BYPASS", + altsyncram_component.indata_reg_b = "CLOCK0", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 8192, + altsyncram_component.numwords_b = 8192, + altsyncram_component.operation_mode = "BIDIR_DUAL_PORT", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_aclr_b = "NONE", + altsyncram_component.outdata_reg_a = "UNREGISTERED", + altsyncram_component.outdata_reg_b = "UNREGISTERED", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.read_during_write_mode_mixed_ports = "DONT_CARE", + altsyncram_component.read_during_write_mode_port_a = "NEW_DATA_NO_NBE_READ", + altsyncram_component.read_during_write_mode_port_b = "NEW_DATA_NO_NBE_READ", + altsyncram_component.widthad_a = 13, + altsyncram_component.widthad_b = 13, + altsyncram_component.width_a = 8, + altsyncram_component.width_b = 8, + altsyncram_component.width_byteena_a = 1, + altsyncram_component.width_byteena_b = 1, + altsyncram_component.wrcontrol_wraddress_reg_b = "CLOCK0"; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0" +// Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "1" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0" +// Retrieval info: PRIVATE: CLRdata NUMERIC "0" +// Retrieval info: PRIVATE: CLRq NUMERIC "0" +// Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0" +// Retrieval info: PRIVATE: CLRrren NUMERIC "0" +// Retrieval info: PRIVATE: CLRwraddress NUMERIC "0" +// Retrieval info: PRIVATE: CLRwren NUMERIC "0" +// Retrieval info: PRIVATE: Clock NUMERIC "0" +// Retrieval info: PRIVATE: Clock_A NUMERIC "0" +// Retrieval info: PRIVATE: Clock_B NUMERIC "0" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INDATA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: INDATA_REG_B NUMERIC "1" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MEMSIZE NUMERIC "65536" +// Retrieval info: PRIVATE: MEM_IN_BITS NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "" +// Retrieval info: PRIVATE: OPERATION_MODE NUMERIC "3" +// Retrieval info: PRIVATE: OUTDATA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: OUTDATA_REG_B NUMERIC "0" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_MIXED_PORTS NUMERIC "2" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_B NUMERIC "3" +// Retrieval info: PRIVATE: REGdata NUMERIC "1" +// Retrieval info: PRIVATE: REGq NUMERIC "0" +// Retrieval info: PRIVATE: REGrdaddress NUMERIC "0" +// Retrieval info: PRIVATE: REGrren NUMERIC "0" +// Retrieval info: PRIVATE: REGwraddress NUMERIC "1" +// Retrieval info: PRIVATE: REGwren NUMERIC "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_DIFF_CLKEN NUMERIC "0" +// Retrieval info: PRIVATE: UseDPRAM NUMERIC "1" +// Retrieval info: PRIVATE: VarWidth NUMERIC "0" +// Retrieval info: PRIVATE: WIDTH_READ_A NUMERIC "8" +// Retrieval info: PRIVATE: WIDTH_READ_B NUMERIC "8" +// Retrieval info: PRIVATE: WIDTH_WRITE_A NUMERIC "8" +// Retrieval info: PRIVATE: WIDTH_WRITE_B NUMERIC "8" +// Retrieval info: PRIVATE: WRADDR_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: WRADDR_REG_B NUMERIC "1" +// Retrieval info: PRIVATE: WRCTRL_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: enable NUMERIC "0" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: ADDRESS_REG_B STRING "CLOCK0" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_B STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_B STRING "BYPASS" +// Retrieval info: CONSTANT: INDATA_REG_B STRING "CLOCK0" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "8192" +// Retrieval info: CONSTANT: NUMWORDS_B NUMERIC "8192" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "BIDIR_DUAL_PORT" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_ACLR_B STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED" +// Retrieval info: CONSTANT: OUTDATA_REG_B STRING "UNREGISTERED" +// Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_MIXED_PORTS STRING "DONT_CARE" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_A STRING "NEW_DATA_NO_NBE_READ" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_B STRING "NEW_DATA_NO_NBE_READ" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13" +// Retrieval info: CONSTANT: WIDTHAD_B NUMERIC "13" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_B NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_B NUMERIC "1" +// Retrieval info: CONSTANT: WRCONTROL_WRADDRESS_REG_B STRING "CLOCK0" +// Retrieval info: USED_PORT: address_a 0 0 13 0 INPUT NODEFVAL "address_a[12..0]" +// Retrieval info: USED_PORT: address_b 0 0 13 0 INPUT NODEFVAL "address_b[12..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: data_a 0 0 8 0 INPUT NODEFVAL "data_a[7..0]" +// Retrieval info: USED_PORT: data_b 0 0 8 0 INPUT NODEFVAL "data_b[7..0]" +// Retrieval info: USED_PORT: q_a 0 0 8 0 OUTPUT NODEFVAL "q_a[7..0]" +// Retrieval info: USED_PORT: q_b 0 0 8 0 OUTPUT NODEFVAL "q_b[7..0]" +// Retrieval info: USED_PORT: wren_a 0 0 0 0 INPUT GND "wren_a" +// Retrieval info: USED_PORT: wren_b 0 0 0 0 INPUT GND "wren_b" +// Retrieval info: CONNECT: @address_a 0 0 13 0 address_a 0 0 13 0 +// Retrieval info: CONNECT: @address_b 0 0 13 0 address_b 0 0 13 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: @data_a 0 0 8 0 data_a 0 0 8 0 +// Retrieval info: CONNECT: @data_b 0 0 8 0 data_b 0 0 8 0 +// Retrieval info: CONNECT: @wren_a 0 0 0 0 wren_a 0 0 0 0 +// Retrieval info: CONNECT: @wren_b 0 0 0 0 wren_b 0 0 0 0 +// Retrieval info: CONNECT: q_a 0 0 8 0 @q_a 0 0 8 0 +// Retrieval info: CONNECT: q_b 0 0 8 0 @q_b 0 0 8 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL trkbuf.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL trkbuf.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL trkbuf.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL trkbuf.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL trkbuf_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL trkbuf_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Commodore - 64_Mist/rtl/unused/Header_buffer.sv b/Commodore - 64_Mist/rtl/unused/Header_buffer.sv new file mode 100644 index 00000000..2058965a --- /dev/null +++ b/Commodore - 64_Mist/rtl/unused/Header_buffer.sv @@ -0,0 +1,20 @@ +// 64 byte buffer for loading files +// used to interrogate file type +// L.C.Ashmore 17 +// +// + + +module header_buffer +( +inout reg [7:0] header_buff [0:63] +); + +integer i; + +initial begin + for (i = 0; i < 64; i = i +1) + header_buff [i] = 0; + end +endmodule + \ No newline at end of file diff --git a/Commodore - 64_Mist/rtl/unused/block_transfer.v b/Commodore - 64_Mist/rtl/unused/block_transfer.v new file mode 100644 index 00000000..5db33b45 --- /dev/null +++ b/Commodore - 64_Mist/rtl/unused/block_transfer.v @@ -0,0 +1,46 @@ +// memory block transfer routine +// L.C.Ashmore feb17 +// +// PRG T64 CRT TAP files load to intermediate buffer 0x200000 (2m) +// +// this routine reads 1st 16bytes to determine file type then either: +// 1, if CRT or TAP move to 0x100000 (1m) and sets cartridge or tap attached flags +// 2, if PRG or T64 moves directly into c64 memory map (injection) +// T64 format pain in the arse so only basic function !! + +module block_transfer +( +input clk32, +input [31:0] addr_total_size, +input sdram_we, +input sdram_data_out, +output cart_attached, +output reg [24:0] sdram_read_addr, +output reg [24:0] sdram_write_addr, +inout reg [7:0] sdram_data +); + +localparam buffer_address2m = 'h200000; +localparam buffer_address1m = 'h100000; + +reg [24:0] block_addr; +//reg [24:0] sdram_read_addr; +//reg [24:0] sdram_write_addr; +//reg [7:0] sdram_data; +reg transfer_active; +reg read_flag; + +always @(negedge clk32) + begin + if (sdram_we == 1 && transfer_active && !read_flag) //sdram in read cycle - not yet read + begin + sdram_read_addr <= block_addr + buffer_address2m; + sdram_data <= sdram_data_out; + read_flag = 1; + end + if (sdram_we == 0 && read_flag) + begin + sdram_write_addr <= block_addr +buffer_address1m; + end + end +endmodule diff --git a/Commodore - 64_Mist/rtl/video_mixer.sv b/Commodore - 64_Mist/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Commodore - 64_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/Commodore - 64_Mist/rtl/video_vicII_656x_a.vhd b/Commodore - 64_Mist/rtl/video_vicII_656x_a.vhd new file mode 100644 index 00000000..ab15e7cb --- /dev/null +++ b/Commodore - 64_Mist/rtl/video_vicII_656x_a.vhd @@ -0,0 +1,1447 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- VIC-II - Video Interface Chip no 2 +-- +-- ----------------------------------------------------------------------- +-- Dar 08/03/2014 : shift hsync to sprite #3 +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +architecture rtl of video_vicii_656x is + type vicCycles is ( + cycleRefresh1, cycleRefresh2, cycleRefresh3, cycleRefresh4, cycleRefresh5, + cycleIdle1, + cycleChar, + cycleCalcSprites, cycleSpriteBa1, cycleSpriteBa2, cycleSpriteBa3, + cycleSpriteA, cycleSpriteB + ); + subtype ColorDef is unsigned(3 downto 0); + type MFlags is array(0 to 7) of boolean; + type MXdef is array(0 to 7) of unsigned(8 downto 0); + type MYdef is array(0 to 7) of unsigned(7 downto 0); + type MCntDef is array(0 to 7) of unsigned(5 downto 0); + type MPixelsDef is array(0 to 7) of unsigned(23 downto 0); + type MCurrentPixelDef is array(0 to 7) of unsigned(1 downto 0); + type charStoreDef is array(38 downto 0) of unsigned(11 downto 0); + type spriteColorsDef is array(7 downto 0) of unsigned(3 downto 0); + type pixelColorStoreDef is array(7 downto 0) of unsigned(3 downto 0); + +-- State machine + signal lastLineFlag : boolean; -- True for on last line of the frame. + signal beyondFrameFlag : boolean; -- Y>frame lines + signal vicCycle : vicCycles := cycleRefresh1; + signal sprite : unsigned(2 downto 0) := "000"; + signal shiftChars : boolean; + signal idle: std_logic := '1'; + signal rasterIrqDone : std_logic; -- Only one interrupt each rasterLine + signal rasterEnable: std_logic; + +-- BA signal + signal badLine : boolean; -- true if we have a badline condition + signal baLoc : std_logic; + signal baCnt : unsigned(2 downto 0); + + signal baChars : std_logic; + signal baSprite04 : std_logic; + signal baSprite15 : std_logic; + signal baSprite26 : std_logic; + signal baSprite37 : std_logic; + +-- Memory refresh cycles + signal refreshCounter : unsigned(7 downto 0); + +-- User registers + signal MX : MXdef; -- Sprite X + signal MY : MYdef; -- Sprite Y + signal ME : unsigned(7 downto 0); -- Sprite enable + signal MXE : unsigned(7 downto 0); -- Sprite X expansion + signal MYE : unsigned(7 downto 0); -- Sprite Y expansion + signal MPRIO : unsigned(7 downto 0); -- Sprite priority + signal MC : unsigned(7 downto 0); -- sprite multi color + + -- !!! Krestage 3 hacks + signal MCDelay : unsigned(7 downto 0); -- sprite multi color + + -- mode + signal BMM: std_logic; -- Bitmap mode + signal ECM: std_logic; -- Extended color mode + signal MCM: std_logic; -- Multi color mode + signal DEN: std_logic; -- DMA enable + signal RSEL: std_logic; -- Visible rows selection (24/25) + signal CSEL: std_logic; -- Visible columns selection (38/40) + + signal RES: std_logic; + + signal VM: unsigned(13 downto 10); + signal CB: unsigned(13 downto 11); + + signal EC : ColorDef; -- border color + signal B0C : ColorDef; -- background color 0 + signal B1C : ColorDef; -- background color 1 + signal B2C : ColorDef; -- background color 2 + signal B3C : ColorDef; -- background color 3 + signal MM0 : ColorDef; -- sprite multicolor 0 + signal MM1 : ColorDef; -- sprite multicolor 1 + signal spriteColors: spriteColorsDef; + +-- borders and blanking + signal LRBorder: std_logic; + signal TBBorder: std_logic; + signal hBlack: std_logic; + signal vBlanking : std_logic; + signal hBlanking : std_logic; + signal xscroll: unsigned(2 downto 0); + signal yscroll: unsigned(2 downto 0); + signal rasterCmp : unsigned(8 downto 0); + +-- Address generator + signal vicAddrReg : unsigned(13 downto 0); + signal vicAddrLoc : unsigned(13 downto 0); + +-- Address counters + signal ColCounter: unsigned(9 downto 0) := (others => '0'); + signal ColRestart: unsigned(9 downto 0) := (others => '0'); + signal RowCounter: unsigned(2 downto 0) := (others => '0'); + +-- IRQ Registers + signal IRST: std_logic := '0'; + signal ERST: std_logic := '0'; + signal IMBC: std_logic := '0'; + signal EMBC: std_logic := '0'; + signal IMMC: std_logic := '0'; + signal EMMC: std_logic := '0'; + signal ILP: std_logic := '0'; + signal ELP: std_logic := '0'; + signal IRQ: std_logic; + +-- Collision detection registers + signal M2M: unsigned(7 downto 0); -- Sprite to sprite collision + signal M2D: unsigned(7 downto 0); -- Sprite to character collision + signal M2Mhit : std_logic; + signal M2Dhit : std_logic; + +-- Raster counters + signal rasterX : unsigned(9 downto 0) := (others => '0'); + signal rasterY : unsigned(8 downto 0) := (others => '0'); + +-- Light pen + signal lightPenHit: std_logic; + signal lpX : unsigned(7 downto 0); + signal lpY : unsigned(7 downto 0); + +-- IRQ Resets + signal resetLightPenIrq: std_logic; + signal resetIMMC : std_logic; + signal resetIMBC : std_logic; + signal resetRasterIrq : std_logic; + +-- Character generation + signal charStore: charStoreDef; + signal nextChar : unsigned(11 downto 0); + -- Char/Pixels just coming from memory + signal readChar : unsigned(11 downto 0); + signal readPixels : unsigned(7 downto 0); + -- Char/Pixels pair waiting to be shifted + signal waitingChar : unsigned(11 downto 0); + signal waitingPixels : unsigned(7 downto 0); + -- Stores colorinfo and the Pixels that are currently in shift register + signal shiftingChar : unsigned(11 downto 0); + signal shiftingPixels : unsigned(7 downto 0); + signal shifting_ff : std_logic; -- Multicolor shift-regiter status bit. + +-- Sprite work registers + signal MPtr : unsigned(7 downto 0); -- sprite base pointer + signal MPixels : MPixelsDef; -- Sprite 24 bit shift register + signal MActive : MFlags; -- Sprite is active (derived from MCnt) + signal MCnt : MCntDef; + signal MXE_ff : unsigned(7 downto 0); -- Sprite X expansion flipflop + signal MYE_ff : unsigned(7 downto 0); -- Sprite Y expansion flipflop + signal MC_ff : unsigned(7 downto 0); -- controls sprite shift-register in multicolor + signal MShift : MFlags; -- Sprite is shifting + signal MCurrentPixel : MCurrentPixelDef; + +-- Current colors and pixels + signal pixelColor: ColorDef; + signal pixelBgFlag: std_logic; -- For collision detection + signal pixelDelay: pixelColorStoreDef; + +-- Read/Write lines + signal myWr : std_logic; + signal myRd : std_logic; + +begin +-- ----------------------------------------------------------------------- +-- Ouput signals +-- ----------------------------------------------------------------------- + ba <= baLoc; + vicAddr <= vicAddrReg when registeredAddress else vicAddrLoc; + hSync <= hBlanking; + vSync <= vBlanking; + irq_n <= not IRQ; + +-- ----------------------------------------------------------------------- +-- chip-select signals +-- ----------------------------------------------------------------------- + myWr <= cs and we; + myRd <= cs and rd; + +-- ----------------------------------------------------------------------- +-- debug signals +-- ----------------------------------------------------------------------- + debugX <= rasterX; + debugY <= rasterY; + +-- ----------------------------------------------------------------------- +-- Badline condition +-- ----------------------------------------------------------------------- + process(rasterY, yscroll, rasterEnable) + begin + badLine <= false; + if (rasterY(2 downto 0) = yscroll) + and (rasterEnable = '1') then + badLine <= true; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- BA=low counter +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if baLoc = '0' then + if phi = '0' + and enaData = '1' + and baCnt(2) = '0' then + baCnt <= baCnt + 1; + end if; + else + baCnt <= (others => '0'); + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Calculate lastLineFlag +-- ----------------------------------------------------------------------- + process(clk) + variable rasterLines : integer range 0 to 312; + begin + if rising_edge(clk) then + lastLineFlag <= false; + + rasterLines := 311; -- PAL + if mode6567old = '1' then + rasterLines := 261; -- NTSC (R7 and earlier have 262 lines) + end if; + if mode6567R8 = '1' then + rasterLines := 262; -- NTSC (R8 and newer have 263 lines) + end if; + if rasterY = rasterLines then + lastLineFlag <= true; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- State machine +-- ----------------------------------------------------------------------- +vicStateMachine: process(clk) + begin + if rising_edge(clk) then + if enaData = '1' + and baSync = '0' then + if phi = '0' then + case vicCycle is + when cycleRefresh1 => + vicCycle <= cycleRefresh2; + if ((mode6567old or mode6567R8) = '1') then + vicCycle <= cycleIdle1; + end if; + when cycleIdle1 => vicCycle <= cycleRefresh2; + when cycleRefresh2 => vicCycle <= cycleRefresh3; + when cycleRefresh3 => vicCycle <= cycleRefresh4; + when cycleRefresh4 => vicCycle <= cycleRefresh5; -- X=0..7 on this cycle + when cycleRefresh5 => vicCycle <= cycleChar; + when cycleChar => + if ((mode6569 = '1') and rasterX(9 downto 3) = "0100111") -- PAL + or ((mode6567old = '1') and rasterX(9 downto 3) = "0100111") -- Old NTSC + or ((mode6567R8 = '1') and rasterX(9 downto 3) = "0101000") -- New NTSC + or ((mode6572 = '1') and rasterX(9 downto 3) = "0101000") then -- PAL-N + vicCycle <= cycleCalcSprites; + end if; + when cycleCalcSprites => vicCycle <= cycleSpriteBa1; + when cycleSpriteBa1 => vicCycle <= cycleSpriteBa2; + when cycleSpriteBa2 => vicCycle <= cycleSpriteBa3; + when others => + null; + end case; + else + case vicCycle is + when cycleSpriteBa3 => vicCycle <= cycleSpriteA; + when cycleSpriteA => + vicCycle <= cycleSpriteB; + when cycleSpriteB => + vicCycle <= cycleSpriteA; + if sprite = 7 then + vicCycle <= cycleRefresh1; + end if; + when others => + null; + end case; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Iterate through all sprites. +-- Only used when state-machine above is in any sprite cycles. +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '1' + and enaData = '1' + and vicCycle = cycleSpriteB + and baSync = '0' then + sprite <= sprite + 1; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Address generator +-- ----------------------------------------------------------------------- + process(phi, vicCycle, sprite, shiftChars, idle, + VM, CB, ECM, BMM, nextChar, colCounter, rowCounter, MPtr, MCnt) + begin + -- + -- Default case ($3FFF fetches) + vicAddrLoc <= (others => '1'); + if (idle = '0') + and shiftChars then + if BMM = '1' then + vicAddrLoc <= CB(13) & colCounter & rowCounter; + else + vicAddrLoc <= CB & nextChar(7 downto 0) & rowCounter; + end if; + end if; + if ECM = '1' then + vicAddrLoc(10 downto 9) <= "00"; + end if; + + case vicCycle is + when cycleRefresh1 | cycleRefresh2 | cycleRefresh3 | cycleRefresh4 | cycleRefresh5 => + if emulateRefresh then + vicAddrLoc <= "111111" & refreshCounter; + else + vicAddrLoc <= (others => '-'); + end if; + when cycleSpriteBa1 | cycleSpriteBa2 | cycleSpriteBa3 => + vicAddrLoc <= (others => '1'); + when cycleSpriteA => + vicAddrLoc <= VM & "1111111" & sprite; + if phi = '1' then + vicAddrLoc <= MPtr & MCnt(to_integer(sprite)); + end if; + when cycleSpriteB => + vicAddrLoc <= MPtr & MCnt(to_integer(sprite)); + when others => + if phi = '1' then + vicAddrLoc <= VM & colCounter; + end if; + end case; + end process; + + -- Registered address + process(clk) + begin + if rising_edge(clk) then + vicAddrReg <= vicAddrLoc; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Character storage +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if enaData = '1' + and shiftChars + and phi = '1' then + if badLine then + nextChar(7 downto 0) <= di; + nextChar(11 downto 8) <= diColor; + else + nextChar <= charStore(38); + end if; + charStore <= charStore(37 downto 0) & nextChar; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Sprite base pointer (MPtr) +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '0' + and enaData = '1' + and vicCycle = cycleSpriteA then + MPtr <= (others => '1'); + if MActive(to_integer(sprite)) then + MPtr <= di; + end if; + + -- If refresh counter is not emulated we don't care about + -- MPtr having the correct value in idle state. + if not emulateRefresh then + MPtr <= di; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Refresh counter +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + vicRefresh <= '0'; + case vicCycle is + when cycleRefresh1 | cycleRefresh2 | cycleRefresh3 | cycleRefresh4 | cycleRefresh5 => + vicRefresh <= '1'; + if phi = '0' + and enaData = '1' + and baSync = '0' then + refreshCounter <= refreshCounter - 1; + end if; + when others => + null; + end case; + if lastLineFlag then + refreshCounter <= (others => '1'); + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Generate Raster Enable +-- ----------------------------------------------------------------------- + process(clk) + begin + -- Enable screen and character display. + -- This is only possible in line 48 on the VIC-II. + -- On other lines any DEN changes are ignored. + if rising_edge(clk) then + if (rasterY = 48) and (DEN = '1') then + rasterEnable <= '1'; + end if; + if (rasterY = 248) then + rasterEnable <= '0'; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- BA generator (Text/Bitmap) +-- ----------------------------------------------------------------------- +-- +-- For Text/Bitmap BA goes low 3 cycles before real access. So BA starts +-- going low during refresh2 state. See diagram below for timing: +-- +-- X 0 0 0 0 0 +-- 0 0 0 0 1 +-- 0 4 8 C 0 +-- +-- phi ___ ___ ___ ___ ___ ___ ___ ___... +-- ___ ___ ___ ___ ___ ___ ___ ... +-- +-- | | | | | | |... +-- rfr2 rfr3 rfr4 rfr5 char1 char2 char3 +-- +-- BA _______ +-- \\\_______________________________________ +-- | 1 | 2 | 3 | +-- +-- BACnt 000 001 | 010 | 011 | 100 100 100 ... +-- +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '0' then + baChars <= '1'; + case vicCycle is + when cycleRefresh2 | cycleRefresh3 | cycleRefresh4 | cycleRefresh5 => + if badLine then + baChars <= '0'; + end if; + when others => + if rasterX(9 downto 3) < "0101000" + and badLine then + baChars <= '0'; + end if; + end case; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- BA generator (Sprites) +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '0' then + if sprite = 1 then + baSprite04 <= '1'; + end if; + if sprite = 2 then + baSprite15 <= '1'; + end if; + if sprite = 3 then + baSprite26 <= '1'; + end if; + if sprite = 4 then + baSprite37 <= '1'; + end if; + if sprite = 5 then + baSprite04 <= '1'; + end if; + if sprite = 6 then + baSprite15 <= '1'; + end if; + if sprite = 7 then + baSprite26 <= '1'; + end if; + if vicCycle = cycleRefresh1 then + baSprite37 <= '1'; + end if; + + if MActive(0) and (vicCycle = cycleCalcSprites) then + baSprite04 <= '0'; + end if; + if MActive(1) and (vicCycle = cycleSpriteBa2) then + baSprite15 <= '0'; + end if; + if MActive(2) and (vicCycle = cycleSpriteB) and (sprite = 0) then + baSprite26 <= '0'; + end if; + if MActive(3) and (vicCycle = cycleSpriteB) and (sprite = 1) then + baSprite37 <= '0'; + end if; + if MActive(4) and (vicCycle = cycleSpriteB) and (sprite = 2) then + baSprite04 <= '0'; + end if; + if MActive(5) and (vicCycle = cycleSpriteB) and (sprite = 3) then + baSprite15 <= '0'; + end if; + if MActive(6) and (vicCycle = cycleSpriteB) and (sprite = 4) then + baSprite26 <= '0'; + end if; + if MActive(7) and (vicCycle = cycleSpriteB) and (sprite = 5) then + baSprite37 <= '0'; + end if; + end if; + end if; + end process; + baLoc <= baChars and baSprite04 and baSprite15 and baSprite26 and baSprite37; + +-- ----------------------------------------------------------------------- +-- Address valid? +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + addrValid <= '0'; + if phi = '0' + or baCnt(2) = '1' then + addrValid <= '1'; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Generate ShiftChars flag +-- ----------------------------------------------------------------------- + process(rasterX) + begin + shiftChars <= false; + if rasterX(9 downto 3) > "0000000" + and rasterX(9 downto 3) < "0101001" then + shiftChars <= true; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- RowCounter and ColCounter +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '0' + and enaData = '1' + and baSync = '0' then + if shiftChars + and idle = '0' then + colCounter <= colCounter + 1; + end if; + case vicCycle is + when cycleRefresh4 => + colCounter <= colRestart; + if badline then + rowCounter <= (others => '0'); + end if; + when cycleSpriteA => + if sprite = "000" then + if rowCounter = 7 then + colRestart <= colCounter; + idle <= '1'; + else + rowCounter <= rowCounter + 1; + end if; + if badline then + rowCounter <= rowCounter + 1; + end if; + end if; + when others => + null; + end case; + if lastLineFlag then + -- Reset column counter outside visible range. + colRestart <= (others => '0'); + end if; + + -- Set display mode (leave idle-mode) as soon as + -- there is a badline condition. + if badline then + idle <= '0'; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- X/Y Raster counter +-- ----------------------------------------------------------------------- +rasterCounters: process(clk) + begin + if rising_edge(clk) then + if enaPixel = '1' then + rasterX(2 downto 0) <= rasterX(2 downto 0) + 1; + end if; + if phi = '0' + and enaData = '1' + and baSync = '0' then + rasterX(9 downto 3) <= rasterX(9 downto 3) + 1; + rasterX(2 downto 0) <= (others => '0'); + if vicCycle = cycleRefresh4 then + rasterX <= (others => '0'); + end if; + end if; + if phi = '1' + and enaData = '1' + and baSync = '0' then + beyondFrameFlag <= false; + if (vicCycle = cycleSpriteB) + and (sprite = 2) then + rasterY <= rasterY + 1; + beyondFrameFlag <= lastLineFlag; + end if; + if beyondFrameFlag then + rasterY <= (others => '0'); + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Raster IRQ +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '1' + and enaData = '1' + and baSync = '0' + and (vicCycle = cycleSpriteB) + and (sprite = 2) then + rasterIrqDone <= '0'; + end if; + if resetRasterIrq = '1' then + IRST <= '0'; + end if; + if (rasterIrqDone = '0') + and (rasterY = rasterCmp) then + rasterIrqDone <= '1'; + IRST <= '1'; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- Light pen +-- ----------------------------------------------------------------------- +-- On a negative edge on the LP input, the current position of the raster beam +-- is latched in the registers LPX ($d013) and LPY ($d014). LPX contains the +-- upper 8 bits (of 9) of the X position and LPY the lower 8 bits (likewise of +-- 9) of the Y position. So the horizontal resolution of the light pen is +-- limited to 2 pixels. + +-- Only one negative edge on LP is recognized per frame. If multiple edges +-- occur on LP, all following ones are ignored. The trigger is not released +-- until the next vertical blanking interval. +-- ----------------------------------------------------------------------- +lightPen: process(clk) + begin + if rising_edge(clk) then + if emulateLightpen then + if resetLightPenIrq = '1' then + -- Reset light pen interrupt + ILP <= '0'; + end if; + if lastLineFlag then + -- Reset lightpen state at beginning of frame + lightPenHit <= '0'; + elsif (lightPenHit = '0') and (lp_n = '0') then + -- One hit/frame + lightPenHit <= '1'; + -- Toggle Interrupt + ILP <= '1'; + -- Store position of beam + lpx <= rasterX(8 downto 1); + lpy <= rasterY(7 downto 0); + end if; + else + ILP <= '0'; + lpx <= (others => '1'); + lpy <= (others => '1'); + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- VSync +-- ----------------------------------------------------------------------- +doVBlanking: process(clk, mode6569, mode6567old, mode6567R8) + variable rasterBlank : integer range 0 to 300; + begin + rasterBlank := 300; + if (mode6567old or mode6567R8) = '1' then + rasterBlank := 12; + end if; + if rising_edge(clk) then + vBlanking <= '0'; + if rasterY = rasterBlank then + vBlanking <= '1'; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- HSync +-- ----------------------------------------------------------------------- +doHBlanking: process(clk) + begin + if rising_edge(clk) then + if sprite = 3 then + hBlack <= '1'; + end if; + if vicCycle = cycleRefresh1 then + hBlack <= '0'; + end if; + if sprite = 3 then -- dar 5 then + hBlanking <= '1'; + else + hBlanking <= '0'; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Borders +-- ----------------------------------------------------------------------- +calcBorders: process(clk) + variable newTBBorder: std_logic; + begin + if rising_edge(clk) then + if enaPixel = '1' then + -- + -- Calc top/bottom border + newTBBorder := TBBorder; +-- if (rasterY = 55) and (RSEL = '0') and (rasterEnable = '1') then + if (rasterY = 55) and (rasterEnable = '1') then + newTBBorder := '0'; + end if; + if (rasterY = 51) and (RSEL = '1') and (rasterEnable = '1') then + newTBBorder := '0'; + end if; + if (rasterY = 247) and (RSEL = '0') then + newTBBorder := '1'; + end if; + if (rasterY = 251) and (RSEL = '1') then + newTBBorder := '1'; + end if; + + -- + -- Calc left/right border + if (rasterX = (31+1)) and (CSEL = '0') then + LRBorder <= newTBBorder; + TBBorder <= newTBBorder; + end if; + if (rasterX = (24+1)) and (CSEL = '1') then + LRBorder <= newTBBorder; + TBBorder <= newTBBorder; + end if; + if (rasterX = (335+1)) and (CSEL = '0') then + LRBorder <= '1'; + end if; + if (rasterX = (344+1)) and (CSEL = '1') then + LRBorder <= '1'; + end if; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- Pixel generator for Text/Bitmap screen +-- ----------------------------------------------------------------------- +calcBitmap: process(clk) + variable multiColor : std_logic; + begin + if rising_edge(clk) then + if enaPixel = '1' then + -- + -- Toggle flipflop for multicolor 2-bits shift. + shifting_ff <= not shifting_ff; + + -- + -- Multicolor mode is active with MCM, but for character + -- mode it depends on bit3 of color ram too. + multiColor := MCM and (BMM or ECM or shiftingChar(11)); + + -- + -- Reload shift register when xscroll=rasterX + -- otherwise shift pixels + if xscroll = rasterX(2 downto 0) then + shifting_ff <= '0'; + shiftingChar <= waitingChar; + shiftingPixels <= waitingPixels; + elsif multiColor = '0' then + shiftingPixels <= shiftingPixels(6 downto 0) & '0'; + elsif shifting_ff = '1' then + shiftingPixels <= shiftingPixels(5 downto 0) & "00"; + end if; + + -- + -- Calculate if pixel is in foreground or background + pixelBgFlag <= shiftingPixels(7); + + -- + -- Calculate color of next pixel + pixelColor <= B0C; + if (BMM = '0') and (ECM='0') then + if (multiColor = '0') then + -- normal character mode + if shiftingPixels(7) = '1' then + pixelColor <= shiftingChar(11 downto 8); + end if; + else + -- multi-color character mode + case shiftingPixels(7 downto 6) is + when "01" => pixelColor <= B1C; + when "10" => pixelColor <= B2C; + when "11" => pixelColor <= '0' & shiftingChar(10 downto 8); + when others => null; + end case; + end if; + elsif (MCM = '0') and (BMM = '0') and (ECM='1') then + -- extended-color character mode + -- multiple background colors but only 64 characters + if shiftingPixels(7) = '1' then + pixelColor <= shiftingChar(11 downto 8); + else + case shiftingChar(7 downto 6) is + when "01" => pixelColor <= B1C; + when "10" => pixelColor <= B2C; + when "11" => pixelColor <= B3C; + when others => null; + end case; + end if; + elsif emulateGraphics and (MCM = '0') and (BMM = '1') and (ECM='0') then + -- highres bitmap mode + if shiftingPixels(7) = '1' then + pixelColor <= shiftingChar(7 downto 4); + else + pixelColor <= shiftingChar(3 downto 0); + end if; + elsif emulateGraphics and (MCM = '1') and (BMM = '1') and (ECM='0') then + -- Multi-color bitmap mode + case shiftingPixels(7 downto 6) is + when "01" => pixelColor <= shiftingChar(7 downto 4); + when "10" => pixelColor <= shiftingChar(3 downto 0); + when "11" => pixelColor <= shiftingChar(11 downto 8); + when others => null; + end case; + else + -- illegal display mode, the output is black + pixelColor <= "0000"; + end if; + end if; + + -- + -- Store fetched pixels, until current pixels are displayed + -- and shift-register is empty. + if enaData = '1' + and phi = '0' then + readPixels <= (others => '0'); + if shiftChars then + readPixels <= di; + readChar <= (others => '0'); + if idle = '0' then + readChar <= nextChar; + end if; + end if; + -- Store the characters until shiftregister is empty + waitingPixels <= readPixels; + waitingChar <= readChar; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Which sprites are active? +-- ----------------------------------------------------------------------- + process(MCnt) + begin + for i in 0 to 7 loop + MActive(i) <= false; + if MCnt(i) /= 63 then + MActive(i) <= true; + end if; + end loop; + end process; + +-- ----------------------------------------------------------------------- +-- Sprite byte counter +-- Y expansion flipflop +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '0' + and enaData = '1' then + case vicCycle is + when cycleRefresh5 => + for i in 0 to 7 loop + MYE_ff(i) <= not MYE_ff(i); + if MActive(i) then + if MYE_ff(i) = MYE(i) then + MCnt(i) <= MCnt(i) + 1; + else + MCnt(i) <= MCnt(i) - 2; + end if; + end if; + end loop; + when others => + null; + end case; + end if; + for i in 0 to 7 loop + if MYE(i) = '0' + or not MActive(i) then + MYE_ff(i) <= '0'; + end if; + end loop; + + -- + -- On cycleCalcSprite check for each inactive sprite if + -- there is a Y match. Reset MCnt if this is so. + -- + -- The RasterX counter is used here to multiplex the compare logic. + -- This saves a few logic cells in the FPGA. + if vicCycle = cycleCalcSprites then + if (not MActive(to_integer(RasterX(2 downto 0)))) + and (ME(to_integer(RasterX(2 downto 0))) = '1') + and (rasterY(7 downto 0) = MY(to_integer(RasterX(2 downto 0)))) then + MCnt(to_integer(RasterX(2 downto 0))) <= (others => '0'); + end if; + end if; + -- + -- Original non-multiplexed version +-- if vicCycle = cycleCalcSprites then +-- for i in 0 to 7 loop +-- if (not MActive(i)) +-- and (ME(i) = '1') +-- and (rasterY(7 downto 0) = MY(i)) then +-- MCnt(i) <= (others => '0'); +-- end if; +-- end loop; +-- end if; + + -- + -- Increment MCnt after fetching data. + if enaData = '1' then + if (vicCycle = cycleSpriteA and phi = '1') + or (vicCycle = cycleSpriteB and phi = '0') then + if MActive(to_integer(sprite)) then + MCnt(to_integer(sprite)) <= MCnt(to_integer(sprite)) + 1; + end if; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Sprite pixel Shift register +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if enaPixel = '1' then + -- Enable sprites on the correct X position + for i in 0 to 7 loop + if rasterX = MX(i) then + MShift(i) <= true; + end if; + end loop; + + -- Shift one pixel of the sprite from the shift register. + for i in 0 to 7 loop + if MShift(i) then + MXE_ff(i) <= (not MXE_ff(i)) and MXE(i); + if MXE_ff(i) = '0' then + MC_ff(i) <= (not MC_ff(i)) and MC(i); + if MC_ff(i) = '0' then + MCurrentPixel(i) <= MPixels(i)(23 downto 22); + end if; + MPixels(i) <= MPixels(i)(22 downto 0) & '0'; + end if; + else + MXE_ff(i) <= '0'; + MC_ff(i) <= '0'; + MCurrentPixel(i) <= "00"; + end if; + end loop; + end if; + + -- + -- Fill Sprite shift-register with new data. + if enaData = '1' then + if phi = '0' + and vicCycle = cycleSpriteA then + MShift(to_integer(sprite)) <= false; + end if; + + if Mactive(to_integer(sprite)) then + if phi = '0' then + case vicCycle is + when cycleSpriteB => + MPixels(to_integer(sprite)) <= MPixels(to_integer(sprite))(15 downto 0) & di; + when others => null; + end case; + else + case vicCycle is + when cycleSpriteA | cycleSpriteB => + MPixels(to_integer(sprite)) <= MPixels(to_integer(sprite))(15 downto 0) & di; + when others => null; + end case; + end if; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Video output +-- ----------------------------------------------------------------------- + process(clk) + variable myColor: unsigned(3 downto 0); + variable muxSprite : unsigned(2 downto 0); + variable muxColor : unsigned(1 downto 0); + -- 00 = pixels + -- 01 = MM0 + -- 10 = Sprite + -- 11 = MM1 + begin + if rising_edge(clk) then + muxColor := "00"; + muxSprite := (others => '-'); + for i in 7 downto 0 loop + if (MPRIO(i) = '0') or (pixelBgFlag = '0') then + if MC(i) = '1' then + if MCurrentPixel(i) /= "00" then + muxColor := MCurrentPixel(i); + muxSprite := to_unsigned(i, 3); + end if; + elsif MCurrentPixel(i)(1) = '1' then + muxColor := "10"; + muxSprite := to_unsigned(i, 3); + end if; + end if; + end loop; + + myColor := pixelColor; + case muxColor is + when "01" => myColor := MM0; + when "10" => myColor := spriteColors(to_integer(muxSprite)); + when "11" => myColor := MM1; + when others => + null; + end case; + + +-- myColor := pixelColor; +-- for i in 7 downto 0 loop +-- if (MPRIO(i) = '0') or (pixelBgFlag = '0') then +-- if MC(i) = '1' then +-- case MCurrentPixel(i) is +-- when "01" => myColor := MM0; +-- when "10" => myColor := spriteColors(i); +-- when "11" => myColor := MM1; +-- when others => null; +-- end case; +-- elsif MCurrentPixel(i)(1) = '1' then +-- myColor := spriteColors(i); +-- end if; +-- end if; +-- end loop; + + if enaPixel = '1' then + colorIndex <= myColor; + +-- Krestage 3 debugging routine +-- if (cs = '1' and aRegisters = "011100") then +-- colorIndex <= "1111"; +-- end if; + if (LRBorder = '1') or (TBBorder = '1') then + colorIndex <= EC; + end if; + if (hBlack = '1') then + colorIndex <= (others => '0'); + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Sprite to sprite collision +-- ----------------------------------------------------------------------- +spriteSpriteCollision: process(clk) + variable collision : unsigned(7 downto 0); + begin + if rising_edge(clk) then + if resetIMMC = '1' then + IMMC <= '0'; + end if; + + if (myRd = '1') + and (aRegisters = "011110") then + M2M <= (others => '0'); + M2Mhit <= '0'; + end if; + + for i in 0 to 7 loop + collision(i) := MCurrentPixel(i)(1); + end loop; + if (collision /= "00000000") + and (collision /= "00000001") + and (collision /= "00000010") + and (collision /= "00000100") + and (collision /= "00001000") + and (collision /= "00010000") + and (collision /= "00100000") + and (collision /= "01000000") + and (collision /= "10000000") + and (TBBorder = '0') then + M2M <= M2M or collision; + + -- Give collision interrupt but only once until clear of register + if M2Mhit = '0' then + IMMC <= '1'; + M2Mhit <= '1'; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Sprite to background collision +-- ----------------------------------------------------------------------- +spriteBackgroundCollision: process(clk) + begin + if rising_edge(clk) then + if resetIMBC = '1' then + IMBC <= '0'; + end if; + + if (myRd = '1') + and (aRegisters = "011111") then + M2D <= (others => '0'); + M2Dhit <= '0'; + end if; + + for i in 0 to 7 loop + if MCurrentPixel(i)(1) = '1' + and pixelBgFlag = '1' + and (TBBorder = '0') then + M2D(i) <= '1'; + + -- Give collision interrupt but only once until clear of register + if M2Dhit = '0' then + IMBC <= '1'; + M2Dhit <= '1'; + end if; + end if; + end loop; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Generate IRQ signal +-- ----------------------------------------------------------------------- + IRQ <= (ILP and ELP) or (IMMC and EMMC) or (IMBC and EMBC) or (IRST and ERST); + +-- ----------------------------------------------------------------------- +-- Krestage 3 hack +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '1' + and enaData = '1' then + MC <= MCDelay; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Write registers +-- ----------------------------------------------------------------------- +writeRegisters: process(clk) + begin + if rising_edge(clk) then + resetLightPenIrq <= '0'; + resetIMMC <= '0'; + resetIMBC <= '0'; + resetRasterIrq <= '0'; + + -- + -- write to registers + if(reset = '1') then + MX(0) <= (others => '0'); + MX(1) <= (others => '0'); + MX(2) <= (others => '0'); + MX(3) <= (others => '0'); + MX(4) <= (others => '0'); + MX(5) <= (others => '0'); + MX(6) <= (others => '0'); + MX(7) <= (others => '0'); + rasterCmp <= (others => '0'); + ECM <= '0'; + BMM <= '0'; + DEN <= '0'; + RSEL <= '0'; + yscroll <= (others => '0'); + ME <= (others => '0'); + RES <= '0'; + MCM <= '0'; + CSEL <= '0'; + xscroll <= (others => '0'); + MYE <= (others => '0'); + VM <= (others => '0'); + CB <= (others => '0'); + resetLightPenIrq <= '0'; + resetIMMC <= '0'; + resetIMBC <= '0'; + resetRasterIrq <= '0'; + ELP <= '0'; + EMMC <= '0'; + EMBC <= '0'; + ERST <= '0'; + MPRIO <= (others => '0'); + MCDelay <= (others => '0'); + MXE <= (others => '0'); + EC <= (others => '0'); + B0C <= (others => '0'); + B1C <= (others => '0'); + B2C <=(others => '0'); + B3C <= (others => '0'); + MM0 <= (others => '0'); + MM1 <= (others => '0'); + spriteColors(0) <= (others => '0'); + spriteColors(1) <= (others => '0'); + spriteColors(2) <= (others => '0'); + spriteColors(3) <= (others => '0'); + spriteColors(4) <= (others => '0'); + spriteColors(5) <= (others => '0'); + spriteColors(6) <= (others => '0'); + spriteColors(7) <= (others => '0'); + + elsif (myWr = '1') then + case aRegisters is + when "000000" => MX(0)(7 downto 0) <= diRegisters; + when "000001" => MY(0) <= diRegisters; + when "000010" => MX(1)(7 downto 0) <= diRegisters; + when "000011" => MY(1) <= diRegisters; + when "000100" => MX(2)(7 downto 0) <= diRegisters; + when "000101" => MY(2) <= diRegisters; + when "000110" => MX(3)(7 downto 0) <= diRegisters; + when "000111" => MY(3) <= diRegisters; + when "001000" => MX(4)(7 downto 0) <= diRegisters; + when "001001" => MY(4) <= diRegisters; + when "001010" => MX(5)(7 downto 0) <= diRegisters; + when "001011" => MY(5) <= diRegisters; + when "001100" => MX(6)(7 downto 0) <= diRegisters; + when "001101" => MY(6) <= diRegisters; + when "001110" => MX(7)(7 downto 0) <= diRegisters; + when "001111" => MY(7) <= diRegisters; + when "010000" => + MX(0)(8) <= diRegisters(0); + MX(1)(8) <= diRegisters(1); + MX(2)(8) <= diRegisters(2); + MX(3)(8) <= diRegisters(3); + MX(4)(8) <= diRegisters(4); + MX(5)(8) <= diRegisters(5); + MX(6)(8) <= diRegisters(6); + MX(7)(8) <= diRegisters(7); + when "010001" => + rasterCmp(8) <= diRegisters(7); + ECM <= diRegisters(6); + BMM <= diRegisters(5); + DEN <= diRegisters(4); + RSEL <= diRegisters(3); + yscroll <= diRegisters(2 downto 0); + when "010010" => + rasterCmp(7 downto 0) <= diRegisters; + when "010101" => + ME <= diRegisters; + when "010110" => + RES <= diRegisters(5); + MCM <= diRegisters(4); + CSEL <= diRegisters(3); + xscroll <= diRegisters(2 downto 0); + + when "010111" => MYE <= diRegisters; + when "011000" => + VM <= diRegisters(7 downto 4); + CB <= diRegisters(3 downto 1); + when "011001" => + resetLightPenIrq <= diRegisters(3); + resetIMMC <= diRegisters(2); + resetIMBC <= diRegisters(1); + resetRasterIrq <= diRegisters(0); + when "011010" => + ELP <= diRegisters(3); + EMMC <= diRegisters(2); + EMBC <= diRegisters(1); + ERST <= diRegisters(0); + when "011011" => MPRIO <= diRegisters; + when "011100" => + -- MC <= diRegisters; + MCDelay <= diRegisters; -- !!! Krestage 3 hack + when "011101" => MXE <= diRegisters; + when "100000" => EC <= diRegisters(3 downto 0); + when "100001" => B0C <= diRegisters(3 downto 0); + when "100010" => B1C <= diRegisters(3 downto 0); + when "100011" => B2C <= diRegisters(3 downto 0); + when "100100" => B3C <= diRegisters(3 downto 0); + when "100101" => MM0 <= diRegisters(3 downto 0); + when "100110" => MM1 <= diRegisters(3 downto 0); + when "100111" => spriteColors(0) <= diRegisters(3 downto 0); + when "101000" => spriteColors(1) <= diRegisters(3 downto 0); + when "101001" => spriteColors(2) <= diRegisters(3 downto 0); + when "101010" => spriteColors(3) <= diRegisters(3 downto 0); + when "101011" => spriteColors(4) <= diRegisters(3 downto 0); + when "101100" => spriteColors(5) <= diRegisters(3 downto 0); + when "101101" => spriteColors(6) <= diRegisters(3 downto 0); + when "101110" => spriteColors(7) <= diRegisters(3 downto 0); + when others => null; + end case; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Read registers +-- ----------------------------------------------------------------------- +readRegisters: process(clk) + begin + if rising_edge(clk) then + case aRegisters is + when "000000" => do <= MX(0)(7 downto 0); + when "000001" => do <= MY(0); + when "000010" => do <= MX(1)(7 downto 0); + when "000011" => do <= MY(1); + when "000100" => do <= MX(2)(7 downto 0); + when "000101" => do <= MY(2); + when "000110" => do <= MX(3)(7 downto 0); + when "000111" => do <= MY(3); + when "001000" => do <= MX(4)(7 downto 0); + when "001001" => do <= MY(4); + when "001010" => do <= MX(5)(7 downto 0); + when "001011" => do <= MY(5); + when "001100" => do <= MX(6)(7 downto 0); + when "001101" => do <= MY(6); + when "001110" => do <= MX(7)(7 downto 0); + when "001111" => do <= MY(7); + when "010000" => + do <= MX(7)(8) & MX(6)(8) & MX(5)(8) & MX(4)(8) + & MX(3)(8) & MX(2)(8) & MX(1)(8) & MX(0)(8); + when "010001" => do <= rasterY(8) & ECM & BMM & DEN & RSEL & yscroll; + when "010010" => do <= rasterY(7 downto 0); + when "010011" => do <= lpX; + when "010100" => do <= lpY; + when "010101" => do <= ME; + when "010110" => do <= "11" & RES & MCM & CSEL & xscroll; + when "010111" => do <= MYE; + when "011000" => do <= VM & CB & '1'; + when "011001" => do <= IRQ & "111" & ILP & IMMC & IMBC & IRST; + when "011010" => do <= "1111" & ELP & EMMC & EMBC & ERST; + when "011011" => do <= MPRIO; + when "011100" => do <= MC; + when "011101" => do <= MXE; + when "011110" => do <= M2M; + when "011111" => do <= M2D; + when "100000" => do <= "1111" & EC; + when "100001" => do <= "1111" & B0C; + when "100010" => do <= "1111" & B1C; + when "100011" => do <= "1111" & B2C; + when "100100" => do <= "1111" & B3C; + when "100101" => do <= "1111" & MM0; + when "100110" => do <= "1111" & MM1; + when "100111" => do <= "1111" & spriteColors(0); + when "101000" => do <= "1111" & spriteColors(1); + when "101001" => do <= "1111" & spriteColors(2); + when "101010" => do <= "1111" & spriteColors(3); + when "101011" => do <= "1111" & spriteColors(4); + when "101100" => do <= "1111" & spriteColors(5); + when "101101" => do <= "1111" & spriteColors(6); + when "101110" => do <= "1111" & spriteColors(7); + when others => do <= (others => '1'); + end case; + end if; + end process; +end architecture; diff --git a/Commodore - 64_Mist/rtl/video_vicII_656x_e.vhd b/Commodore - 64_Mist/rtl/video_vicII_656x_e.vhd new file mode 100644 index 00000000..86eedc63 --- /dev/null +++ b/Commodore - 64_Mist/rtl/video_vicII_656x_e.vhd @@ -0,0 +1,73 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- VIC-II - Video Interface Chip no 2 +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity video_vicii_656x is + generic ( + registeredAddress : boolean; + emulateRefresh : boolean := false; + emulateLightpen : boolean := false; + emulateGraphics : boolean := true + ); + port ( + clk: in std_logic; + -- phi = 0 is VIC cycle + -- phi = 1 is CPU cycle (only used by VIC when BA is low) + phi : in std_logic; + enaData : in std_logic; + enaPixel : in std_logic; + + baSync : in std_logic; + ba: out std_logic; + + mode6569 : in std_logic; -- PAL 63 cycles and 312 lines + mode6567old : in std_logic; -- old NTSC 64 cycles and 262 line + mode6567R8 : in std_logic; -- new NTSC 65 cycles and 263 line + mode6572 : in std_logic; -- PAL-N 65 cycles and 312 lines + + reset : in std_logic; + cs : in std_logic; + we : in std_logic; + rd : in std_logic; + lp_n : in std_logic; + + aRegisters: in unsigned(5 downto 0); + diRegisters: in unsigned(7 downto 0); + + di: in unsigned(7 downto 0); + diColor: in unsigned(3 downto 0); + do: out unsigned(7 downto 0); + + vicAddr: out unsigned(13 downto 0); + irq_n: out std_logic; + + -- Video output + hSync : out std_logic; + vSync : out std_logic; + colorIndex : out unsigned(3 downto 0); + + -- Debug outputs + debugX : out unsigned(9 downto 0); + debugY : out unsigned(8 downto 0); + vicRefresh : out std_logic; + addrValid : out std_logic + ); +end entity; + diff --git a/Commodore - Pet2001_MiST/Pet2001.qpf b/Commodore - Pet2001_MiST/Pet2001.qpf new file mode 100644 index 00000000..bf0dbc76 --- /dev/null +++ b/Commodore - Pet2001_MiST/Pet2001.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 10:56:12 January 03, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "10:56:12 January 03, 2017" + +# Revisions + +PROJECT_REVISION = "Pet2001" diff --git a/Commodore - Pet2001_MiST/Pet2001.qsf b/Commodore - Pet2001_MiST/Pet2001.qsf new file mode 100644 index 00000000..a99b9bc2 --- /dev/null +++ b/Commodore - Pet2001_MiST/Pet2001.qsf @@ -0,0 +1,329 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 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.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 08:30:59 December 07, 2015 +# +# -------------------------------------------------------------------------- # + + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:40:24 MAY 17, 2014" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL + +# 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_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" + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE SPEED +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY Pet2001 +set_global_assignment -name DEVICE_FILTER_PACKAGE TQFP +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name ALLOW_POWER_UP_DONT_CARE ON +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON + +# Fitter Assignments +# ================== +set_global_assignment -name FITTER_EARLY_TIMING_ESTIMATE_MODE OPTIMISTIC +set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC ON +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING ON +set_global_assignment -name PHYSICAL_SYNTHESIS_ASYNCHRONOUS_SIGNAL_PIPELINING ON +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION ON +set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC_FOR_AREA ON +set_global_assignment -name PHYSICAL_SYNTHESIS_MAP_LOGIC_TO_MEMORY_FOR_AREA ON +set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT EXTRA +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +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" +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON +set_global_assignment -name FITTER_EFFORT "STANDARD FIT" + +# Assembler Assignments +# ===================== +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF + +# SignalTap II Assignments +# ======================== +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp + +# 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 ENTITY(pet2001_mist) + +# Pin & Location Assignments +# ========================== +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[0] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[1] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[2] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[3] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[4] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[5] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[6] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[7] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[8] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[9] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[10] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[11] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[12] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[13] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[14] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[15] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[0] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[1] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[2] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[3] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[4] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[5] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[6] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[7] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[8] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[9] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[10] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[11] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[12] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[0] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[1] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQMH +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQML +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nRAS +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCAS +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nWE +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCS +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[0] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[1] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[2] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[3] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[4] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[5] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[6] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[7] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[8] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[9] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[10] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[11] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[12] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[13] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[14] +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[15] + +# Fitter Assignments +# ================== +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[8] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[9] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[10] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[11] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[12] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[8] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[9] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[10] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[11] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[12] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[13] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[14] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[15] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_BA[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_BA[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQML +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQMH +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nRAS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nCAS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nWE +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nCS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_CKE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CLK +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_R[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_G[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_B[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_HS +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_VS +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to LED +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to AUDIO_L +set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to AUDIO_R +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SPI_DO +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to CONF_DATA0 + +# end ENTITY(pet2001_mist) +# ---------------------- +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name SAVE_DISK_SPACE OFF +set_global_assignment -name FLOW_ENABLE_IO_ASSIGNMENT_ANALYSIS ON + +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 PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" + +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/via6522.v +set_global_assignment -name VERILOG_FILE rtl/tape.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/sram.sv +set_global_assignment -name VERILOG_FILE rtl/sigma_delta_dac.v +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/pll.v +set_global_assignment -name VERILOG_FILE rtl/pia6520.v +set_global_assignment -name VERILOG_FILE rtl/pet2001vram.v +set_global_assignment -name VERILOG_FILE rtl/pet2001video.v +set_global_assignment -name VERILOG_FILE rtl/pet2001rom.v +set_global_assignment -name VERILOG_FILE rtl/pet2001ram.v +set_global_assignment -name VERILOG_FILE rtl/pet2001io.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/pet2001hw.sv +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/keyboard.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/hq2x.sv +set_global_assignment -name VHDL_FILE rtl/cpu65xx_fast.vhd +set_global_assignment -name VHDL_FILE rtl/cpu65xx_e.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/Pet2001.sv +set_global_assignment -name CDF_FILE output_files/Chain1.cdf +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Commodore - Pet2001_MiST/Pet2001.sdc b/Commodore - Pet2001_MiST/Pet2001.sdc new file mode 100644 index 00000000..3eba3b05 --- /dev/null +++ b/Commodore - Pet2001_MiST/Pet2001.sdc @@ -0,0 +1,33 @@ +#************************************************************ +# THIS IS A WIZARD-GENERATED FILE. +# +# Version 13.1.4 Build 182 03/12/2014 SJ Full Version +# +#************************************************************ + +# Copyright (C) 1991-2014 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. + + + +# Clock constraints + +create_clock -name "CLOCK_27" -period 37.037 [get_ports {CLOCK_27}] +create_clock -name {SPI_SCK} -period 10.000 -waveform { 0.000 0.500 } [get_ports {SPI_SCK}] + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty diff --git a/Commodore - Pet2001_MiST/clean.bat b/Commodore - Pet2001_MiST/clean.bat new file mode 100644 index 00000000..83fb0c47 --- /dev/null +++ b/Commodore - Pet2001_MiST/clean.bat @@ -0,0 +1,15 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +del *.ddb +pause diff --git a/Commodore - Pet2001_MiST/release/Pet2001.rbf b/Commodore - Pet2001_MiST/release/Pet2001.rbf new file mode 100644 index 00000000..5a5844d3 Binary files /dev/null and b/Commodore - Pet2001_MiST/release/Pet2001.rbf differ diff --git a/Commodore - Pet2001_MiST/rtl/Pet2001.sv b/Commodore - Pet2001_MiST/rtl/Pet2001.sv new file mode 100644 index 00000000..92912118 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/Pet2001.sv @@ -0,0 +1,301 @@ +`timescale 1ns / 1ps +//Pet2001 Mist Toplevel 2017 Gehstock + +module Pet2001 +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27, + + output [12:0] SDRAM_A, + inout [15:0] SDRAM_DQ, + output SDRAM_DQML, + output SDRAM_DQMH, + output SDRAM_nWE, + output SDRAM_nCAS, + output SDRAM_nRAS, + output SDRAM_nCS, + output [1:0] SDRAM_BA, + output SDRAM_CLK, + output SDRAM_CKE +); + + +////////////////////////////////////////////////////////////////////// +// MiST I/O // +////////////////////////////////////////////////////////////////////// + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +`include "rtl\build_id.v" + +localparam CONF_STR = +{ + "PET2001;TAPPRG;", + "O78,TAP mode,Fast,Normal,Normal+Sound;", + "O9A,CPU Speed,Normal,x2,x4,x8;", + "O2,Screen Color,White,Green;", + "O3,Diag,Off,On(needs Reset);", + "O56,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T7,Reset;", + "V,v0.61.",`BUILD_DATE + +}; + +wire ioctl_download; +wire [7:0] ioctl_index; +wire ioctl_wr; +wire [24:0] ioctl_addr; +wire [7:0] ioctl_dout; + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .ps2_caps_led (shift_lock ), + .status (status ), + .ioctl_download (ioctl_download ), + .ioctl_index (ioctl_index ), + .ioctl_wr (ioctl_wr ), + .ioctl_addr (ioctl_addr ), + .ioctl_dout (ioctl_dout ) +); + + +////////////////////////////////////////////////////////////////////// +// Global Clock and System Reset. // +////////////////////////////////////////////////////////////////////// + +wire clk, sdram_clk; +wire locked; + +pll pll +( + .inclk0(CLOCK_27), + .c0(sdram_clk), //112Mhz + .c1(SDRAM_CLK), //112Mhz + .c2(clk), //56MHz + .locked(locked) +); + +reg reset = 1; +wire RESET = status[0] | buttons[1] | status[7]; +always @(posedge clk) begin + integer initRESET = 20000000; + reg [3:0] reset_cnt; + + if ((!RESET && reset_cnt==4'd14) && !initRESET) + reset <= 0; + else begin + if(initRESET) initRESET <= initRESET - 1; + reset <= 1; + reset_cnt <= reset_cnt+4'd1; + end +end + + +//////////////////////////////////////////////////////////////////// +// Clocks +//////////////////////////////////////////////////////////////////// + +reg ce_7mp; +reg ce_7mn; +reg ce_1m; +wire [6:0] cpu_rates[4] = '{55, 27, 13, 6}; + +always @(negedge clk) begin + reg [4:0] div = 0; + reg [6:0] cpu_div = 0; + reg [6:0] cpu_rate = 55; + + div <= div + 1'd1; + ce_7mp <= !div[2] & !div[1:0]; + ce_7mn <= div[2] & !div[1:0]; + + cpu_div <= cpu_div + 1'd1; + if(cpu_div == cpu_rate) begin + cpu_div <= 0; + cpu_rate <= (tape_active && !status[8:7]) ? 7'd2 : cpu_rates[status[10:9]]; + end + ce_1m <= ~(tape_active & ~ram_ready) && !cpu_div; +end + + +/////////////////////////////////////////////////// +// RAM +/////////////////////////////////////////////////// + +wire ram_ready; + +sram ram +( + .*, + .clk(sdram_clk), + .init(~locked), + .dout(tape_data), + .din (ioctl_dout), + .addr(ioctl_download ? ioctl_addr : tape_addr), + .wtbt(0), + .we( ioctl_download && ioctl_wr && (ioctl_index == 1)), + .rd(!ioctl_download && tape_rd), + .ready(ram_ready) +); + + +/////////////////////////////////////////////////// +// CPU +/////////////////////////////////////////////////// + +wire [15:0] addr; +wire [7:0] cpu_data_out; +wire [7:0] cpu_data_in; + +wire we; +wire irq; + +cpu6502 cpu +( + .clk(clk), + .ce(ce_1m), + .reset(reset), + .nmi(0), + .irq(irq), + .din(cpu_data_in), + .dout(cpu_data_out), + .addr(addr), + .we(we) +); + + +/////////////////////////////////////////////////// +// Commodore Pet hardware +/////////////////////////////////////////////////// + +wire pix; +wire HSync, VSync; +wire audioDat; + +pet2001hw hw +( + .*, + .data_out(cpu_data_in), + .data_in(cpu_data_out), + + .cass_motor_n(), + .cass_write(tape_write), + .audio(audioDat), + .cass_sense_n(0), + .cass_read(tape_audio), + .diag_l(!status[3]), + + .dma_addr(dma_off[13:0]+ioctl_addr[13:0]-2'd2), + .dma_din(ioctl_dout), + .dma_dout(), + .dma_we(ioctl_wr && ioctl_download && (ioctl_index == 8'h41) && (ioctl_addr>1)), + + .clk_speed(0), + .clk_stop(0) +); + +reg [15:0] dma_off; +always @(posedge clk) begin + if(ioctl_wr && ioctl_download && (ioctl_index == 8'h41)) begin + if(ioctl_addr == 0) dma_off[7:0] <= ioctl_dout; + if(ioctl_addr == 1) dma_off[15:8] <= ioctl_dout; + end +end + + +//////////////////////////////////////////////////////////////////// +// Video // +//////////////////////////////////////////////////////////////////// + +wire [2:0] G = {3{pix}}; +wire [2:0] R = status[2] ? 3'd0 : G; +wire [2:0] B = R; + +video_mixer #(.LINE_LENGTH(448), .HALF_DEPTH(1)) video_mixer +( + .*, + .clk_sys(clk), + .ce_pix(ce_7mp), + .ce_pix_actual(ce_7mp), + + .scanlines(scandoubler_disable ? 2'b00 : {status[6:5] == 3, status[6:5] == 2}), + .hq2x(status[6:5]==1), + + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + + +//////////////////////////////////////////////////////////////////// +// Audio // +//////////////////////////////////////////////////////////////////// + +assign AUDIO_R = AUDIO_L; +sigma_delta_dac #(.MSBI(1)) dac +( + .CLK(clk), + .RESET(reset), + .DACin({audioDat ^ tape_write, tape_audio & tape_active & (status[8:7] == 2)}), + .DACout(AUDIO_L) +); + +assign LED = ~(tape_led | ioctl_download); + +wire tape_audio; +wire tape_rd; +wire [24:0] tape_addr; +wire [7:0] tape_data; +wire tape_pause = 0; +wire tape_active; +wire tape_write; + +tape tape(.*, .ioctl_download(ioctl_download && (ioctl_index==1))); + +reg [18:0] act_cnt; +wire tape_led = act_cnt[18] ? act_cnt[17:10] <= act_cnt[7:0] : act_cnt[17:10] > act_cnt[7:0]; +always @(posedge clk) if((|status[8:7] ? ce_1m : ce_7mp) && (tape_active || act_cnt[18] || act_cnt[17:0])) act_cnt <= act_cnt + 1'd1; + + +////////////////////////////////////////////////////////////////////// +// PS/2 to PET keyboard interface +////////////////////////////////////////////////////////////////////// +wire [7:0] keyin; +wire [3:0] keyrow; +wire shift_lock; + +keyboard keyboard(.*, .Fn(), .mod()); + +endmodule // pet2001 + diff --git a/Commodore - Pet2001_MiST/rtl/build_id.tcl b/Commodore - Pet2001_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Commodore - Pet2001_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/Commodore - Pet2001_MiST/rtl/build_id.v b/Commodore - Pet2001_MiST/rtl/build_id.v new file mode 100644 index 00000000..c05d8a9d --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171120" +`define BUILD_TIME "173612" diff --git a/Commodore - Pet2001_MiST/rtl/cpu65xx_e.vhd b/Commodore - Pet2001_MiST/rtl/cpu65xx_e.vhd new file mode 100644 index 00000000..72e4b6cd --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/cpu65xx_e.vhd @@ -0,0 +1,87 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- Interface to 6502/6510 core +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use ieee.std_logic_1164.ALL; +use ieee.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity cpu65xx is + generic ( + pipelineOpcode : boolean; + pipelineAluMux : boolean; + pipelineAluOut : boolean + ); + port ( + clk : in std_logic; + enable : in std_logic; + reset : in std_logic; + nmi_n : in std_logic; + irq_n : in std_logic; + so_n : in std_logic := '1'; + + di : in unsigned(7 downto 0); + do : out unsigned(7 downto 0); + addr : out unsigned(15 downto 0); + we : out std_logic; + + debugOpcode : out unsigned(7 downto 0); + debugPc : out unsigned(15 downto 0); + debugA : out unsigned(7 downto 0); + debugX : out unsigned(7 downto 0); + debugY : out unsigned(7 downto 0); + debugS : out unsigned(7 downto 0) + ); +end cpu65xx; + +library IEEE; +use ieee.std_logic_1164.ALL; +use ieee.numeric_std.ALL; + +entity cpu6502 is + port( + clk : in std_logic; + ce : in std_logic; + reset : in std_logic; + nmi : in std_logic; + irq : in std_logic; + din : in unsigned(7 downto 0); + dout : out unsigned(7 downto 0); + addr : out unsigned(15 downto 0); + we : out std_logic + ); +end cpu6502; + +architecture cpu6502 of cpu6502 is +begin + cpuInstance: entity work.cpu65xx(fast) + generic map ( + pipelineOpcode => false, + pipelineAluMux => false, + pipelineAluOut => false + ) + port map ( + clk => clk, + enable=> ce, + reset => reset, + nmi_n => not nmi, + irq_n => not irq, + di => din, + do => dout, + addr => addr, + we => we + ); +end architecture; diff --git a/Commodore - Pet2001_MiST/rtl/cpu65xx_fast.vhd b/Commodore - Pet2001_MiST/rtl/cpu65xx_fast.vhd new file mode 100644 index 00000000..a387b37d --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/cpu65xx_fast.vhd @@ -0,0 +1,1565 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- Table driven, cycle exact 6502/6510 core +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use ieee.std_logic_1164.ALL; +use ieee.std_logic_unsigned.ALL; +use ieee.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +-- Store Zp (3) => fetch, cycle2, cycleEnd +-- Store Zp,x (4) => fetch, cycle2, preWrite, cycleEnd +-- Read Zp,x (4) => fetch, cycle2, cycleRead, cycleRead2 +-- Rmw Zp,x (6) => fetch, cycle2, cycleRead, cycleRead2, cycleRmw, cycleEnd +-- Store Abs (4) => fetch, cycle2, cycle3, cycleEnd +-- Store Abs,x (5) => fetch, cycle2, cycle3, preWrite, cycleEnd +-- Rts (6) => fetch, cycle2, cycle3, cycleRead, cycleJump, cycleIncrEnd +-- Rti (6) => fetch, cycle2, stack1, stack2, stack3, cycleJump +-- Jsr (6) => fetch, cycle2, .. cycle5, cycle6, cycleJump +-- Jmp abs (-) => fetch, cycle2, .., cycleJump +-- Jmp (ind) (-) => fetch, cycle2, .., cycleJump +-- Brk / irq (6) => fetch, cycle2, stack2, stack3, stack4 +-- ----------------------------------------------------------------------- + +architecture fast of cpu65xx is +-- Statemachine + type cpuCycles is ( + opcodeFetch, -- New opcode is read and registers updated + cycle2, + cycle3, + cyclePreIndirect, + cycleIndirect, + cycleBranchTaken, + cycleBranchPage, + cyclePreRead, -- Cycle before read while doing zeropage indexed addressing. + cycleRead, -- Read cycle + cycleRead2, -- Second read cycle after page-boundary crossing. + cycleRmw, -- Calculate ALU output for read-modify-write instr. + cyclePreWrite, -- Cycle before write when doing indexed addressing. + cycleWrite, -- Write cycle for zeropage or absolute addressing. + cycleStack1, + cycleStack2, + cycleStack3, + cycleStack4, + cycleJump, -- Last cycle of Jsr, Jmp. Next fetch address is target addr. + cycleEnd + ); + signal theCpuCycle : cpuCycles; + signal nextCpuCycle : cpuCycles; + signal updateRegisters : boolean; + signal processIrq : std_logic; + signal nmiReg: std_logic; + signal nmiEdge: std_logic; + signal irqReg : std_logic; -- Delay IRQ input with one clock cycle. + signal soReg : std_logic; -- SO pin edge detection + +-- Opcode decoding + constant opcUpdateA : integer := 0; + constant opcUpdateX : integer := 1; + constant opcUpdateY : integer := 2; + constant opcUpdateS : integer := 3; + constant opcUpdateN : integer := 4; + constant opcUpdateV : integer := 5; + constant opcUpdateD : integer := 6; + constant opcUpdateI : integer := 7; + constant opcUpdateZ : integer := 8; + constant opcUpdateC : integer := 9; + + constant opcSecondByte : integer := 10; + constant opcAbsolute : integer := 11; + constant opcZeroPage : integer := 12; + constant opcIndirect : integer := 13; + constant opcStackAddr : integer := 14; -- Push/Pop address + constant opcStackData : integer := 15; -- Push/Pop status/data + constant opcJump : integer := 16; + constant opcBranch : integer := 17; + constant indexX : integer := 18; + constant indexY : integer := 19; + constant opcStackUp : integer := 20; + constant opcWrite : integer := 21; + constant opcRmw : integer := 22; + constant opcIncrAfter : integer := 23; -- Insert extra cycle to increment PC (RTS) + constant opcRti : integer := 24; + constant opcIRQ : integer := 25; + + constant opcInA : integer := 26; + constant opcInE : integer := 27; + constant opcInX : integer := 28; + constant opcInY : integer := 29; + constant opcInS : integer := 30; + constant opcInT : integer := 31; + constant opcInH : integer := 32; + constant opcInClear : integer := 33; + constant aluMode1From : integer := 34; + -- + constant aluMode1To : integer := 37; + constant aluMode2From : integer := 38; + -- + constant aluMode2To : integer := 40; + -- + constant opcInCmp : integer := 41; + constant opcInCpx : integer := 42; + constant opcInCpy : integer := 43; + + + subtype addrDef is unsigned(0 to 15); + -- + -- is Interrupt -----------------+ + -- instruction is RTI ----------------+| + -- PC++ on last cycle (RTS) ---------------+|| + -- RMW --------------+||| + -- Write -------------+|||| + -- Pop/Stack up -------------+||||| + -- Branch ---------+ |||||| + -- Jump ----------+| |||||| + -- Push or Pop data -------+|| |||||| + -- Push or Pop addr ------+||| |||||| + -- Indirect -----+|||| |||||| + -- ZeroPage ----+||||| |||||| + -- Absolute ---+|||||| |||||| + -- PC++ on cycle2 --+||||||| |||||| + -- |AZI||JBXY|WM||| + constant immediate : addrDef := "1000000000000000"; + constant implied : addrDef := "0000000000000000"; + -- Zero page + constant readZp : addrDef := "1010000000000000"; + constant writeZp : addrDef := "1010000000010000"; + constant rmwZp : addrDef := "1010000000001000"; + -- Zero page indexed + constant readZpX : addrDef := "1010000010000000"; + constant writeZpX : addrDef := "1010000010010000"; + constant rmwZpX : addrDef := "1010000010001000"; + constant readZpY : addrDef := "1010000001000000"; + constant writeZpY : addrDef := "1010000001010000"; + constant rmwZpY : addrDef := "1010000001001000"; + -- Zero page indirect + constant readIndX : addrDef := "1001000010000000"; + constant writeIndX : addrDef := "1001000010010000"; + constant rmwIndX : addrDef := "1001000010001000"; + constant readIndY : addrDef := "1001000001000000"; + constant writeIndY : addrDef := "1001000001010000"; + constant rmwIndY : addrDef := "1001000001001000"; + -- |AZI||JBXY|WM|| + -- Absolute + constant readAbs : addrDef := "1100000000000000"; + constant writeAbs : addrDef := "1100000000010000"; + constant rmwAbs : addrDef := "1100000000001000"; + constant readAbsX : addrDef := "1100000010000000"; + constant writeAbsX : addrDef := "1100000010010000"; + constant rmwAbsX : addrDef := "1100000010001000"; + constant readAbsY : addrDef := "1100000001000000"; + constant writeAbsY : addrDef := "1100000001010000"; + constant rmwAbsY : addrDef := "1100000001001000"; + -- PHA PHP + constant push : addrDef := "0000010000000000"; + -- PLA PLP + constant pop : addrDef := "0000010000100000"; + -- Jumps + constant jsr : addrDef := "1000101000000000"; + constant jumpAbs : addrDef := "1000001000000000"; + constant jumpInd : addrDef := "1100001000000000"; + constant relative : addrDef := "1000000100000000"; + -- Specials + constant rts : addrDef := "0000101000100100"; + constant rti : addrDef := "0000111000100010"; + constant brk : addrDef := "1000111000000001"; +-- constant : unsigned(0 to 0) := "0"; + constant xxxxxxxx : addrDef := "----------0---00"; + + -- A = accu + -- E = Accu | 0xEE (for ANE, LXA) + -- X = index X + -- Y = index Y + -- S = Stack pointer + -- H = indexH + -- + -- AEXYSTHc + constant aluInA : unsigned(0 to 7) := "10000000"; + constant aluInE : unsigned(0 to 7) := "01000000"; + constant aluInEXT : unsigned(0 to 7) := "01100100"; + constant aluInET : unsigned(0 to 7) := "01000100"; + constant aluInX : unsigned(0 to 7) := "00100000"; + constant aluInXH : unsigned(0 to 7) := "00100010"; + constant aluInY : unsigned(0 to 7) := "00010000"; + constant aluInYH : unsigned(0 to 7) := "00010010"; + constant aluInS : unsigned(0 to 7) := "00001000"; + constant aluInT : unsigned(0 to 7) := "00000100"; + constant aluInAX : unsigned(0 to 7) := "10100000"; + constant aluInAXH : unsigned(0 to 7) := "10100010"; + constant aluInAT : unsigned(0 to 7) := "10000100"; + constant aluInXT : unsigned(0 to 7) := "00100100"; + constant aluInST : unsigned(0 to 7) := "00001100"; + constant aluInSet : unsigned(0 to 7) := "00000000"; + constant aluInClr : unsigned(0 to 7) := "00000001"; + constant aluInXXX : unsigned(0 to 7) := "--------"; + + -- Most of the aluModes are just like the opcodes. + -- aluModeInp -> input is output. calculate N and Z + -- aluModeCmp -> Compare for CMP, CPX, CPY + -- aluModeFlg -> input to flags needed for PLP, RTI and CLC, SEC, CLV + -- aluModeInc -> for INC but also INX, INY + -- aluModeDec -> for DEC but also DEX, DEY + + subtype aluMode1 is unsigned(0 to 3); + subtype aluMode2 is unsigned(0 to 2); + subtype aluMode is unsigned(0 to 9); + + -- Logic/Shift ALU + constant aluModeInp : aluMode1 := "0000"; + constant aluModeP : aluMode1 := "0001"; + constant aluModeInc : aluMode1 := "0010"; + constant aluModeDec : aluMode1 := "0011"; + constant aluModeFlg : aluMode1 := "0100"; + constant aluModeBit : aluMode1 := "0101"; + -- 0110 + -- 0111 + constant aluModeLsr : aluMode1 := "1000"; + constant aluModeRor : aluMode1 := "1001"; + constant aluModeAsl : aluMode1 := "1010"; + constant aluModeRol : aluMode1 := "1011"; + -- 1100 + -- 1101 + -- 1110 + constant aluModeAnc : aluMode1 := "1111"; + + -- Arithmetic ALU + constant aluModePss : aluMode2 := "000"; + constant aluModeCmp : aluMode2 := "001"; + constant aluModeAdc : aluMode2 := "010"; + constant aluModeSbc : aluMode2 := "011"; + constant aluModeAnd : aluMode2 := "100"; + constant aluModeOra : aluMode2 := "101"; + constant aluModeEor : aluMode2 := "110"; + constant aluModeArr : aluMode2 := "111"; + + + constant aluInp : aluMode := aluModeInp & aluModePss & "---"; + constant aluP : aluMode := aluModeP & aluModePss & "---"; + constant aluInc : aluMode := aluModeInc & aluModePss & "---"; + constant aluDec : aluMode := aluModeDec & aluModePss & "---"; + constant aluFlg : aluMode := aluModeFlg & aluModePss & "---"; + constant aluBit : aluMode := aluModeBit & aluModeAnd & "---"; + constant aluRor : aluMode := aluModeRor & aluModePss & "---"; + constant aluLsr : aluMode := aluModeLsr & aluModePss & "---"; + constant aluRol : aluMode := aluModeRol & aluModePss & "---"; + constant aluAsl : aluMode := aluModeAsl & aluModePss & "---"; + + constant aluCmp : aluMode := aluModeInp & aluModeCmp & "100"; + constant aluCpx : aluMode := aluModeInp & aluModeCmp & "010"; + constant aluCpy : aluMode := aluModeInp & aluModeCmp & "001"; + constant aluAdc : aluMode := aluModeInp & aluModeAdc & "---"; + constant aluSbc : aluMode := aluModeInp & aluModeSbc & "---"; + constant aluAnd : aluMode := aluModeInp & aluModeAnd & "---"; + constant aluOra : aluMode := aluModeInp & aluModeOra & "---"; + constant aluEor : aluMode := aluModeInp & aluModeEor & "---"; + + constant aluSlo : aluMode := aluModeAsl & aluModeOra & "---"; + constant aluSre : aluMode := aluModeLsr & aluModeEor & "---"; + constant aluRra : aluMode := aluModeRor & aluModeAdc & "---"; + constant aluRla : aluMode := aluModeRol & aluModeAnd & "---"; + constant aluDcp : aluMode := aluModeDec & aluModeCmp & "100"; + constant aluIsc : aluMode := aluModeInc & aluModeSbc & "---"; + constant aluAnc : aluMode := aluModeAnc & aluModeAnd & "---"; + constant aluArr : aluMode := aluModeRor & aluModeArr & "---"; + constant aluSbx : aluMode := aluModeInp & aluModeCmp & "110"; + + constant aluXXX : aluMode := (others => '-'); + + + -- Stack operations. Push/Pop/None + constant stackInc : unsigned(0 to 0) := "0"; + constant stackDec : unsigned(0 to 0) := "1"; + constant stackXXX : unsigned(0 to 0) := "-"; + + subtype decodedBitsDef is unsigned(0 to 43); + type opcodeInfoTableDef is array(0 to 255) of decodedBitsDef; + constant opcodeInfoTable : opcodeInfoTableDef := ( + -- +------- Update register A + -- |+------ Update register X + -- ||+----- Update register Y + -- |||+---- Update register S + -- |||| +-- Update Flags + -- |||| | + -- |||| _|__ + -- |||| / \ + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "000100" & brk & aluInXXX & aluP, -- 00 BRK + "1000" & "100010" & readIndX & aluInT & aluOra, -- 01 ORA (zp,x) + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 02 *** JAM *** + "1000" & "100011" & rmwIndX & aluInT & aluSlo, -- 03 iSLO (zp,x) + "0000" & "000000" & readZp & aluInXXX & aluXXX, -- 04 iNOP zp + "1000" & "100010" & readZp & aluInT & aluOra, -- 05 ORA zp + "0000" & "100011" & rmwZp & aluInT & aluAsl, -- 06 ASL zp + "1000" & "100011" & rmwZp & aluInT & aluSlo, -- 07 iSLO zp + "0000" & "000000" & push & aluInXXX & aluP, -- 08 PHP + "1000" & "100010" & immediate & aluInT & aluOra, -- 09 ORA imm + "1000" & "100011" & implied & aluInA & aluAsl, -- 0A ASL accu + "1000" & "100011" & immediate & aluInT & aluAnc, -- 0B iANC imm + "0000" & "000000" & readAbs & aluInXXX & aluXXX, -- 0C iNOP abs + "1000" & "100010" & readAbs & aluInT & aluOra, -- 0D ORA abs + "0000" & "100011" & rmwAbs & aluInT & aluAsl, -- 0E ASL abs + "1000" & "100011" & rmwAbs & aluInT & aluSlo, -- 0F iSLO abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 10 BPL + "1000" & "100010" & readIndY & aluInT & aluOra, -- 11 ORA (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 12 *** JAM *** + "1000" & "100011" & rmwIndY & aluInT & aluSlo, -- 13 iSLO (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- 14 iNOP zp,x + "1000" & "100010" & readZpX & aluInT & aluOra, -- 15 ORA zp,x + "0000" & "100011" & rmwZpX & aluInT & aluAsl, -- 16 ASL zp,x + "1000" & "100011" & rmwZpX & aluInT & aluSlo, -- 17 iSLO zp,x + "0000" & "000001" & implied & aluInClr & aluFlg, -- 18 CLC + "1000" & "100010" & readAbsY & aluInT & aluOra, -- 19 ORA abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- 1A iNOP implied + "1000" & "100011" & rmwAbsY & aluInT & aluSlo, -- 1B iSLO abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- 1C iNOP abs,x + "1000" & "100010" & readAbsX & aluInT & aluOra, -- 1D ORA abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluAsl, -- 1E ASL abs,x + "1000" & "100011" & rmwAbsX & aluInT & aluSlo, -- 1F iSLO abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "000000" & jsr & aluInXXX & aluXXX, -- 20 JSR + "1000" & "100010" & readIndX & aluInT & aluAnd, -- 21 AND (zp,x) + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 22 *** JAM *** + "1000" & "100011" & rmwIndX & aluInT & aluRla, -- 23 iRLA (zp,x) + "0000" & "110010" & readZp & aluInT & aluBit, -- 24 BIT zp + "1000" & "100010" & readZp & aluInT & aluAnd, -- 25 AND zp + "0000" & "100011" & rmwZp & aluInT & aluRol, -- 26 ROL zp + "1000" & "100011" & rmwZp & aluInT & aluRla, -- 27 iRLA zp + "0000" & "111111" & pop & aluInT & aluFlg, -- 28 PLP + "1000" & "100010" & immediate & aluInT & aluAnd, -- 29 AND imm + "1000" & "100011" & implied & aluInA & aluRol, -- 2A ROL accu + "1000" & "100011" & immediate & aluInT & aluAnc, -- 2B iANC imm + "0000" & "110010" & readAbs & aluInT & aluBit, -- 2C BIT abs + "1000" & "100010" & readAbs & aluInT & aluAnd, -- 2D AND abs + "0000" & "100011" & rmwAbs & aluInT & aluRol, -- 2E ROL abs + "1000" & "100011" & rmwAbs & aluInT & aluRla, -- 2F iRLA abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 30 BMI + "1000" & "100010" & readIndY & aluInT & aluAnd, -- 31 AND (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 32 *** JAM *** + "1000" & "100011" & rmwIndY & aluInT & aluRla, -- 33 iRLA (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- 34 iNOP zp,x + "1000" & "100010" & readZpX & aluInT & aluAnd, -- 35 AND zp,x + "0000" & "100011" & rmwZpX & aluInT & aluRol, -- 36 ROL zp,x + "1000" & "100011" & rmwZpX & aluInT & aluRla, -- 37 iRLA zp,x + "0000" & "000001" & implied & aluInSet & aluFlg, -- 38 SEC + "1000" & "100010" & readAbsY & aluInT & aluAnd, -- 39 AND abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- 3A iNOP implied + "1000" & "100011" & rmwAbsY & aluInT & aluRla, -- 3B iRLA abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- 3C iNOP abs,x + "1000" & "100010" & readAbsX & aluInT & aluAnd, -- 3D AND abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluRol, -- 3E ROL abs,x + "1000" & "100011" & rmwAbsX & aluInT & aluRla, -- 3F iRLA abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "111111" & rti & aluInT & aluFlg, -- 40 RTI + "1000" & "100010" & readIndX & aluInT & aluEor, -- 41 EOR (zp,x) + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 42 *** JAM *** + "1000" & "100011" & rmwIndX & aluInT & aluSre, -- 43 iSRE (zp,x) + "0000" & "000000" & readZp & aluInXXX & aluXXX, -- 44 iNOP zp + "1000" & "100010" & readZp & aluInT & aluEor, -- 45 EOR zp + "0000" & "100011" & rmwZp & aluInT & aluLsr, -- 46 LSR zp + "1000" & "100011" & rmwZp & aluInT & aluSre, -- 47 iSRE zp + "0000" & "000000" & push & aluInA & aluInp, -- 48 PHA + "1000" & "100010" & immediate & aluInT & aluEor, -- 49 EOR imm + "1000" & "100011" & implied & aluInA & aluLsr, -- 4A LSR accu + "1000" & "100011" & immediate & aluInAT & aluLsr, -- 4B iALR imm + "0000" & "000000" & jumpAbs & aluInXXX & aluXXX, -- 4C JMP abs + "1000" & "100010" & readAbs & aluInT & aluEor, -- 4D EOR abs + "0000" & "100011" & rmwAbs & aluInT & aluLsr, -- 4E LSR abs + "1000" & "100011" & rmwAbs & aluInT & aluSre, -- 4F iSRE abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 50 BVC + "1000" & "100010" & readIndY & aluInT & aluEor, -- 51 EOR (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 52 *** JAM *** + "1000" & "100011" & rmwIndY & aluInT & aluSre, -- 53 iSRE (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- 54 iNOP zp,x + "1000" & "100010" & readZpX & aluInT & aluEor, -- 55 EOR zp,x + "0000" & "100011" & rmwZpX & aluInT & aluLsr, -- 56 LSR zp,x + "1000" & "100011" & rmwZpX & aluInT & aluSre, -- 57 SRE zp,x + "0000" & "000100" & implied & aluInClr & aluXXX, -- 58 CLI + "1000" & "100010" & readAbsY & aluInT & aluEor, -- 59 EOR abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- 5A iNOP implied + "1000" & "100011" & rmwAbsY & aluInT & aluSre, -- 5B iSRE abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- 5C iNOP abs,x + "1000" & "100010" & readAbsX & aluInT & aluEor, -- 5D EOR abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluLsr, -- 5E LSR abs,x + "1000" & "100011" & rmwAbsX & aluInT & aluSre, -- 5F SRE abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "000000" & rts & aluInXXX & aluXXX, -- 60 RTS + "1000" & "110011" & readIndX & aluInT & aluAdc, -- 61 ADC (zp,x) + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 62 *** JAM *** + "1000" & "110011" & rmwIndX & aluInT & aluRra, -- 63 iRRA (zp,x) + "0000" & "000000" & readZp & aluInXXX & aluXXX, -- 64 iNOP zp + "1000" & "110011" & readZp & aluInT & aluAdc, -- 65 ADC zp + "0000" & "100011" & rmwZp & aluInT & aluRor, -- 66 ROR zp + "1000" & "110011" & rmwZp & aluInT & aluRra, -- 67 iRRA zp + "1000" & "100010" & pop & aluInT & aluInp, -- 68 PLA + "1000" & "110011" & immediate & aluInT & aluAdc, -- 69 ADC imm + "1000" & "100011" & implied & aluInA & aluRor, -- 6A ROR accu + "1000" & "110011" & immediate & aluInAT & aluArr, -- 6B iARR imm + "0000" & "000000" & jumpInd & aluInXXX & aluXXX, -- 6C JMP indirect + "1000" & "110011" & readAbs & aluInT & aluAdc, -- 6D ADC abs + "0000" & "100011" & rmwAbs & aluInT & aluRor, -- 6E ROR abs + "1000" & "110011" & rmwAbs & aluInT & aluRra, -- 6F iRRA abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 70 BVS + "1000" & "110011" & readIndY & aluInT & aluAdc, -- 71 ADC (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 72 *** JAM *** + "1000" & "110011" & rmwIndY & aluInT & aluRra, -- 73 iRRA (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- 74 iNOP zp,x + "1000" & "110011" & readZpX & aluInT & aluAdc, -- 75 ADC zp,x + "0000" & "100011" & rmwZpX & aluInT & aluRor, -- 76 ROR zp,x + "1000" & "110011" & rmwZpX & aluInT & aluRra, -- 77 iRRA zp,x + "0000" & "000100" & implied & aluInSet & aluXXX, -- 78 SEI + "1000" & "110011" & readAbsY & aluInT & aluAdc, -- 79 ADC abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- 7A iNOP implied + "1000" & "110011" & rmwAbsY & aluInT & aluRra, -- 7B iRRA abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- 7C iNOP abs,x + "1000" & "110011" & readAbsX & aluInT & aluAdc, -- 7D ADC abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluRor, -- 7E ROR abs,x + "1000" & "110011" & rmwAbsX & aluInT & aluRra, -- 7F iRRA abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- 80 iNOP imm + "0000" & "000000" & writeIndX & aluInA & aluInp, -- 81 STA (zp,x) + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- 82 iNOP imm + "0000" & "000000" & writeIndX & aluInAX & aluInp, -- 83 iSAX (zp,x) + "0000" & "000000" & writeZp & aluInY & aluInp, -- 84 STY zp + "0000" & "000000" & writeZp & aluInA & aluInp, -- 85 STA zp + "0000" & "000000" & writeZp & aluInX & aluInp, -- 86 STX zp + "0000" & "000000" & writeZp & aluInAX & aluInp, -- 87 iSAX zp + "0010" & "100010" & implied & aluInY & aluDec, -- 88 DEY + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- 84 iNOP imm + "1000" & "100010" & implied & aluInX & aluInp, -- 8A TXA + "1000" & "100010" & immediate & aluInEXT & aluInp, -- 8B iANE imm + "0000" & "000000" & writeAbs & aluInY & aluInp, -- 8C STY abs + "0000" & "000000" & writeAbs & aluInA & aluInp, -- 8D STA abs + "0000" & "000000" & writeAbs & aluInX & aluInp, -- 8E STX abs + "0000" & "000000" & writeAbs & aluInAX & aluInp, -- 8F iSAX abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 90 BCC + "0000" & "000000" & writeIndY & aluInA & aluInp, -- 91 STA (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 92 *** JAM *** + "0000" & "000000" & writeIndY & aluInAXH & aluInp, -- 93 iAHX (zp),y + "0000" & "000000" & writeZpX & aluInY & aluInp, -- 94 STY zp,x + "0000" & "000000" & writeZpX & aluInA & aluInp, -- 95 STA zp,x + "0000" & "000000" & writeZpY & aluInX & aluInp, -- 96 STX zp,y + "0000" & "000000" & writeZpY & aluInAX & aluInp, -- 97 iSAX zp,y + "1000" & "100010" & implied & aluInY & aluInp, -- 98 TYA + "0000" & "000000" & writeAbsY & aluInA & aluInp, -- 99 STA abs,y + "0001" & "000000" & implied & aluInX & aluInp, -- 9A TXS + "0001" & "000000" & writeAbsY & aluInAXH & aluInp, -- 9B iSHS abs,y + "0000" & "000000" & writeAbsX & aluInYH & aluInp, -- 9C iSHY abs,x + "0000" & "000000" & writeAbsX & aluInA & aluInp, -- 9D STA abs,x + "0000" & "000000" & writeAbsY & aluInXH & aluInp, -- 9E iSHX abs,y + "0000" & "000000" & writeAbsY & aluInAXH & aluInp, -- 9F iAHX abs,y + -- AXYS NVDIZC addressing aluInput aluMode + "0010" & "100010" & immediate & aluInT & aluInp, -- A0 LDY imm + "1000" & "100010" & readIndX & aluInT & aluInp, -- A1 LDA (zp,x) + "0100" & "100010" & immediate & aluInT & aluInp, -- A2 LDX imm + "1100" & "100010" & readIndX & aluInT & aluInp, -- A3 LAX (zp,x) + "0010" & "100010" & readZp & aluInT & aluInp, -- A4 LDY zp + "1000" & "100010" & readZp & aluInT & aluInp, -- A5 LDA zp + "0100" & "100010" & readZp & aluInT & aluInp, -- A6 LDX zp + "1100" & "100010" & readZp & aluInT & aluInp, -- A7 iLAX zp + "0010" & "100010" & implied & aluInA & aluInp, -- A8 TAY + "1000" & "100010" & immediate & aluInT & aluInp, -- A9 LDA imm + "0100" & "100010" & implied & aluInA & aluInp, -- AA TAX + "1100" & "100010" & immediate & aluInET & aluInp, -- AB iLXA imm + "0010" & "100010" & readAbs & aluInT & aluInp, -- AC LDY abs + "1000" & "100010" & readAbs & aluInT & aluInp, -- AD LDA abs + "0100" & "100010" & readAbs & aluInT & aluInp, -- AE LDX abs + "1100" & "100010" & readAbs & aluInT & aluInp, -- AF iLAX abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- B0 BCS + "1000" & "100010" & readIndY & aluInT & aluInp, -- B1 LDA (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- B2 *** JAM *** + "1100" & "100010" & readIndY & aluInT & aluInp, -- B3 iLAX (zp),y + "0010" & "100010" & readZpX & aluInT & aluInp, -- B4 LDY zp,x + "1000" & "100010" & readZpX & aluInT & aluInp, -- B5 LDA zp,x + "0100" & "100010" & readZpY & aluInT & aluInp, -- B6 LDX zp,y + "1100" & "100010" & readZpY & aluInT & aluInp, -- B7 iLAX zp,y + "0000" & "010000" & implied & aluInClr & aluFlg, -- B8 CLV + "1000" & "100010" & readAbsY & aluInT & aluInp, -- B9 LDA abs,y + "0100" & "100010" & implied & aluInS & aluInp, -- BA TSX + "1101" & "100010" & readAbsY & aluInST & aluInp, -- BB iLAS abs,y + "0010" & "100010" & readAbsX & aluInT & aluInp, -- BC LDY abs,x + "1000" & "100010" & readAbsX & aluInT & aluInp, -- BD LDA abs,x + "0100" & "100010" & readAbsY & aluInT & aluInp, -- BE LDX abs,y + "1100" & "100010" & readAbsY & aluInT & aluInp, -- BF iLAX abs,y + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "100011" & immediate & aluInT & aluCpy, -- C0 CPY imm + "0000" & "100011" & readIndX & aluInT & aluCmp, -- C1 CMP (zp,x) + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- C2 iNOP imm + "0000" & "100011" & rmwIndX & aluInT & aluDcp, -- C3 iDCP (zp,x) + "0000" & "100011" & readZp & aluInT & aluCpy, -- C4 CPY zp + "0000" & "100011" & readZp & aluInT & aluCmp, -- C5 CMP zp + "0000" & "100010" & rmwZp & aluInT & aluDec, -- C6 DEC zp + "0000" & "100011" & rmwZp & aluInT & aluDcp, -- C7 iDCP zp + "0010" & "100010" & implied & aluInY & aluInc, -- C8 INY + "0000" & "100011" & immediate & aluInT & aluCmp, -- C9 CMP imm + "0100" & "100010" & implied & aluInX & aluDec, -- CA DEX + "0100" & "100011" & immediate & aluInT & aluSbx, -- CB SBX imm + "0000" & "100011" & readAbs & aluInT & aluCpy, -- CC CPY abs + "0000" & "100011" & readAbs & aluInT & aluCmp, -- CD CMP abs + "0000" & "100010" & rmwAbs & aluInT & aluDec, -- CE DEC abs + "0000" & "100011" & rmwAbs & aluInT & aluDcp, -- CF iDCP abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- D0 BNE + "0000" & "100011" & readIndY & aluInT & aluCmp, -- D1 CMP (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- D2 *** JAM *** + "0000" & "100011" & rmwIndY & aluInT & aluDcp, -- D3 iDCP (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- D4 iNOP zp,x + "0000" & "100011" & readZpX & aluInT & aluCmp, -- D5 CMP zp,x + "0000" & "100010" & rmwZpX & aluInT & aluDec, -- D6 DEC zp,x + "0000" & "100011" & rmwZpX & aluInT & aluDcp, -- D7 iDCP zp,x + "0000" & "001000" & implied & aluInClr & aluXXX, -- D8 CLD + "0000" & "100011" & readAbsY & aluInT & aluCmp, -- D9 CMP abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- DA iNOP implied + "0000" & "100011" & rmwAbsY & aluInT & aluDcp, -- DB iDCP abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- DC iNOP abs,x + "0000" & "100011" & readAbsX & aluInT & aluCmp, -- DD CMP abs,x + "0000" & "100010" & rmwAbsX & aluInT & aluDec, -- DE DEC abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluDcp, -- DF iDCP abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "100011" & immediate & aluInT & aluCpx, -- E0 CPX imm + "1000" & "110011" & readIndX & aluInT & aluSbc, -- E1 SBC (zp,x) + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- E2 iNOP imm + "1000" & "110011" & rmwIndX & aluInT & aluIsc, -- E3 iISC (zp,x) + "0000" & "100011" & readZp & aluInT & aluCpx, -- E4 CPX zp + "1000" & "110011" & readZp & aluInT & aluSbc, -- E5 SBC zp + "0000" & "100010" & rmwZp & aluInT & aluInc, -- E6 INC zp + "1000" & "110011" & rmwZp & aluInT & aluIsc, -- E7 iISC zp + "0100" & "100010" & implied & aluInX & aluInc, -- E8 INX + "1000" & "110011" & immediate & aluInT & aluSbc, -- E9 SBC imm + "0000" & "000000" & implied & aluInXXX & aluXXX, -- EA NOP + "1000" & "110011" & immediate & aluInT & aluSbc, -- EB SBC imm (illegal opc) + "0000" & "100011" & readAbs & aluInT & aluCpx, -- EC CPX abs + "1000" & "110011" & readAbs & aluInT & aluSbc, -- ED SBC abs + "0000" & "100010" & rmwAbs & aluInT & aluInc, -- EE INC abs + "1000" & "110011" & rmwAbs & aluInT & aluIsc, -- EF iISC abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- F0 BEQ + "1000" & "110011" & readIndY & aluInT & aluSbc, -- F1 SBC (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- F2 *** JAM *** + "1000" & "110011" & rmwIndY & aluInT & aluIsc, -- F3 iISC (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- F4 iNOP zp,x + "1000" & "110011" & readZpX & aluInT & aluSbc, -- F5 SBC zp,x + "0000" & "100010" & rmwZpX & aluInT & aluInc, -- F6 INC zp,x + "1000" & "110011" & rmwZpX & aluInT & aluIsc, -- F7 iISC zp,x + "0000" & "001000" & implied & aluInSet & aluXXX, -- F8 SED + "1000" & "110011" & readAbsY & aluInT & aluSbc, -- F9 SBC abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- FA iNOP implied + "1000" & "110011" & rmwAbsY & aluInT & aluIsc, -- FB iISC abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- FC iNOP abs,x + "1000" & "110011" & readAbsX & aluInT & aluSbc, -- FD SBC abs,x + "0000" & "100010" & rmwAbsX & aluInT & aluInc, -- FE INC abs,x + "1000" & "110011" & rmwAbsX & aluInT & aluIsc -- FF iISC abs,x + ); + signal opcInfo : decodedBitsDef; + signal nextOpcInfo : decodedBitsDef; -- Next opcode (decoded) + signal nextOpcInfoReg : decodedBitsDef; -- Next opcode (decoded) pipelined + signal theOpcode : unsigned(7 downto 0); + signal nextOpcode : unsigned(7 downto 0); + +-- Program counter + signal PC : unsigned(15 downto 0); -- Program counter + +-- Address generation + type nextAddrDef is ( + nextAddrHold, + nextAddrIncr, + nextAddrIncrL, -- Increment low bits only (zeropage accesses) + nextAddrIncrH, -- Increment high bits only (page-boundary) + nextAddrDecrH, -- Decrement high bits (branch backwards) + nextAddrPc, + nextAddrIrq, + nextAddrReset, + nextAddrAbs, + nextAddrAbsIndexed, + nextAddrZeroPage, + nextAddrZPIndexed, + nextAddrStack, + nextAddrRelative + ); + signal nextAddr : nextAddrDef; + signal myAddr : unsigned(15 downto 0); + signal myAddrIncr : unsigned(15 downto 0); + signal myAddrIncrH : unsigned(7 downto 0); + signal myAddrDecrH : unsigned(7 downto 0); + signal theWe : std_logic; + + signal irqActive : std_logic; + +-- Output register + signal doReg : unsigned(7 downto 0); + +-- Buffer register + signal T : unsigned(7 downto 0); + +-- General registers + signal A: unsigned(7 downto 0); -- Accumulator + signal X: unsigned(7 downto 0); -- Index X + signal Y: unsigned(7 downto 0); -- Index Y + signal S: unsigned(7 downto 0); -- stack pointer + +-- Status register + signal C: std_logic; -- Carry + signal Z: std_logic; -- Zero flag + signal I: std_logic; -- Interrupt flag + signal D: std_logic; -- Decimal mode + signal V: std_logic; -- Overflow + signal N: std_logic; -- Negative + +-- ALU + -- ALU input + signal aluInput : unsigned(7 downto 0); + signal aluCmpInput : unsigned(7 downto 0); + -- ALU output + signal aluRegisterOut : unsigned(7 downto 0); + signal aluRmwOut : unsigned(7 downto 0); + signal aluC : std_logic; + signal aluZ : std_logic; + signal aluV : std_logic; + signal aluN : std_logic; + -- Pipeline registers + signal aluInputReg : unsigned(7 downto 0); + signal aluCmpInputReg : unsigned(7 downto 0); + signal aluRmwReg : unsigned(7 downto 0); + signal aluNineReg : unsigned(7 downto 0); + signal aluCReg : std_logic; + signal aluZReg : std_logic; + signal aluVReg : std_logic; + signal aluNReg : std_logic; + +-- Indexing + signal indexOut : unsigned(8 downto 0); + +begin +processAluInput: process(clk, opcInfo, A, X, Y, T, S) + variable temp : unsigned(7 downto 0); + begin + temp := (others => '1'); + if opcInfo(opcInA) = '1' then + temp := temp and A; + end if; + if opcInfo(opcInE) = '1' then + temp := temp and (A or X"EE"); + end if; + if opcInfo(opcInX) = '1' then + temp := temp and X; + end if; + if opcInfo(opcInY) = '1' then + temp := temp and Y; + end if; + if opcInfo(opcInS) = '1' then + temp := temp and S; + end if; + if opcInfo(opcInT) = '1' then + temp := temp and T; + end if; + if opcInfo(opcInClear) = '1' then + temp := (others => '0'); + end if; + if rising_edge(clk) then + aluInputReg <= temp; + end if; + + aluInput <= temp; + if pipelineAluMux then + aluInput <= aluInputReg; + end if; + end process; + +processCmpInput: process(clk, opcInfo, A, X, Y) + variable temp : unsigned(7 downto 0); + begin + temp := (others => '1'); + if opcInfo(opcInCmp) = '1' then + temp := temp and A; + end if; + if opcInfo(opcInCpx) = '1' then + temp := temp and X; + end if; + if opcInfo(opcInCpy) = '1' then + temp := temp and Y; + end if; + if rising_edge(clk) then + aluCmpInputReg <= temp; + end if; + + aluCmpInput <= temp; + if pipelineAluMux then + aluCmpInput <= aluCmpInputReg; + end if; + end process; + + -- ALU consists of two parts + -- Read-Modify-Write or index instructions: INC/DEC/ASL/LSR/ROR/ROL + -- Accumulator instructions: ADC, SBC, EOR, AND, EOR, ORA + -- Some instructions are both RMW and accumulator so for most + -- instructions the rmw results are routed through accu alu too. +processAlu: process(clk, opcInfo, aluInput, aluCmpInput, A, T, irqActive, N, V, D, I, Z, C) + variable lowBits: unsigned(5 downto 0); + variable nineBits: unsigned(8 downto 0); + variable rmwBits: unsigned(8 downto 0); + + variable varC : std_logic; + variable varZ : std_logic; + variable varV : std_logic; + variable varN : std_logic; + begin + lowBits := (others => '-'); + nineBits := (others => '-'); + rmwBits := (others => '-'); + varV := aluInput(6); -- Default for BIT / PLP / RTI + + -- Shift unit + case opcInfo(aluMode1From to aluMode1To) is + when aluModeInp => + rmwBits := C & aluInput; + when aluModeP => + rmwBits := C & N & V & '1' & (not irqActive) & D & I & Z & C; + when aluModeInc => + rmwBits := C & (aluInput + 1); + when aluModeDec => + rmwBits := C & (aluInput - 1); + when aluModeAsl => + rmwBits := aluInput & "0"; + when aluModeFlg => + rmwBits := aluInput(0) & aluInput; + when aluModeLsr => + rmwBits := aluInput(0) & "0" & aluInput(7 downto 1); + when aluModeRol => + rmwBits := aluInput & C; + when aluModeRoR => + rmwBits := aluInput(0) & C & aluInput(7 downto 1); + when aluModeAnc => + rmwBits := (aluInput(7) and A(7)) & aluInput; + when others => + rmwBits := C & aluInput; + end case; + + -- ALU + case opcInfo(aluMode2From to aluMode2To) is + when aluModeAdc => + lowBits := ("0" & A(3 downto 0) & rmwBits(8)) + ("0" & rmwBits(3 downto 0) & "1"); + ninebits := ("0" & A) + ("0" & rmwBits(7 downto 0)) + (B"00000000" & rmwBits(8)); + when aluModeSbc => + lowBits := ("0" & A(3 downto 0) & rmwBits(8)) + ("0" & (not rmwBits(3 downto 0)) & "1"); + ninebits := ("0" & A) + ("0" & (not rmwBits(7 downto 0))) + (B"00000000" & rmwBits(8)); + when aluModeCmp => + ninebits := ("0" & aluCmpInput) + ("0" & (not rmwBits(7 downto 0))) + "000000001"; + when aluModeAnd => + ninebits := rmwBits(8) & (A and rmwBits(7 downto 0)); + when aluModeEor => + ninebits := rmwBits(8) & (A xor rmwBits(7 downto 0)); + when aluModeOra => + ninebits := rmwBits(8) & (A or rmwBits(7 downto 0)); + when others => + ninebits := rmwBits; + end case; + + if (opcInfo(aluMode1From to aluMode1To) = aluModeFlg) then + varZ := rmwBits(1); + elsif ninebits(7 downto 0) = X"00" then + varZ := '1'; + else + varZ := '0'; + end if; + + case opcInfo(aluMode2From to aluMode2To) is + when aluModeAdc => + -- decimal mode low bits correction, is done after setting Z flag. + if D = '1' then + if lowBits(5 downto 1) > 9 then + ninebits(3 downto 0) := ninebits(3 downto 0) + 6; + if lowBits(5) = '0' then + ninebits(8 downto 4) := ninebits(8 downto 4) + 1; + end if; + end if; + end if; + when others => + null; + end case; + + if (opcInfo(aluMode1From to aluMode1To) = aluModeBit) + or (opcInfo(aluMode1From to aluMode1To) = aluModeFlg) then + varN := rmwBits(7); + else + varN := nineBits(7); + end if; + varC := ninebits(8); + if opcInfo(aluMode2From to aluMode2To) = aluModeArr then + varC := aluInput(7); + varV := aluInput(7) xor aluInput(6); + end if; + + case opcInfo(aluMode2From to aluMode2To) is + when aluModeAdc => + -- decimal mode high bits correction, is done after setting Z and N flags + varV := (A(7) xor ninebits(7)) and (rmwBits(7) xor ninebits(7)); + if D = '1' then + if ninebits(8 downto 4) > 9 then + ninebits(8 downto 4) := ninebits(8 downto 4) + 6; + varC := '1'; + end if; + end if; + when aluModeSbc => + varV := (A(7) xor ninebits(7)) and ((not rmwBits(7)) xor ninebits(7)); + if D = '1' then + -- Check for borrow (lower 4 bits) + if lowBits(5) = '0' then + ninebits(3 downto 0) := ninebits(3 downto 0) - 6; + end if; + -- Check for borrow (upper 4 bits) + if ninebits(8) = '0' then + ninebits(8 downto 4) := ninebits(8 downto 4) - 6; + end if; + end if; + when aluModeArr => + if D = '1' then + if (("0" & aluInput(3 downto 0)) + ("0000" & aluInput(0))) > 5 then + ninebits(3 downto 0) := ninebits(3 downto 0) + 6; + end if; + if (("0" & aluInput(7 downto 4)) + ("0000" & aluInput(4))) > 5 then + ninebits(8 downto 4) := ninebits(8 downto 4) + 6; + varC := '1'; + else + varC := '0'; + end if; + end if; + when others => + null; + end case; + + if rising_edge(clk) then + aluRmwReg <= rmwBits(7 downto 0); + aluNineReg <= ninebits(7 downto 0); + aluCReg <= varC; + aluZReg <= varZ; + aluVReg <= varV; + aluNReg <= varN; + end if; + + aluRmwOut <= rmwBits(7 downto 0); + aluRegisterOut <= ninebits(7 downto 0); + aluC <= varC; + aluZ <= varZ; + aluV <= varV; + aluN <= varN; + if pipelineAluOut then + aluRmwOut <= aluRmwReg; + aluRegisterOut <= aluNineReg; + aluC <= aluCReg; + aluZ <= aluZReg; + aluV <= aluVReg; + aluN <= aluNReg; + end if; + end process; + +calcInterrupt: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + if theCpuCycle = cycleStack4 + or reset = '1' then + nmiReg <= '1'; + end if; + + if nextCpuCycle /= cycleBranchTaken + and nextCpuCycle /= opcodeFetch then + irqReg <= irq_n; + nmiEdge <= nmi_n; + if (nmiEdge = '1') and (nmi_n = '0') then + nmiReg <= '0'; + end if; + end if; + -- The 'or opcInfo(opcSetI)' prevents NMI immediately after BRK or IRQ. + -- Presumably this is done in the real 6502/6510 to prevent a double IRQ. + processIrq <= not ((nmiReg and (irqReg or I)) or opcInfo(opcIRQ)); + end if; + end if; + end process; + +calcNextOpcode: process(clk, di, reset, processIrq) + variable myNextOpcode : unsigned(7 downto 0); + begin + -- Next opcode is read from input unless a reset or IRQ is pending. + myNextOpcode := di; + if reset = '1' then + myNextOpcode := X"4C"; + elsif processIrq = '1' then + myNextOpcode := X"00"; + end if; + + nextOpcode <= myNextOpcode; + end process; + + nextOpcInfo <= opcodeInfoTable(to_integer(nextOpcode)); + process(clk) + begin + if rising_edge(clk) then + nextOpcInfoReg <= nextOpcInfo; + end if; + end process; + + -- Read bits and flags from opcodeInfoTable and store in opcInfo. + -- This info is used to control the execution of the opcode. +calcOpcInfo: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + if (reset = '1') or (theCpuCycle = opcodeFetch) then + opcInfo <= nextOpcInfo; + if pipelineOpcode then + opcInfo <= nextOpcInfoReg; + end if; + end if; + end if; + end if; + end process; + +calcTheOpcode: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + if theCpuCycle = opcodeFetch then + irqActive <= '0'; + if processIrq = '1' then + irqActive <= '1'; + end if; + -- Fetch opcode + theOpcode <= nextOpcode; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- State machine +-- ----------------------------------------------------------------------- + process(enable, theCpuCycle, opcInfo) + begin + updateRegisters <= false; + if enable = '1' then + if opcInfo(opcRti) = '1' then + if theCpuCycle = cycleRead then + updateRegisters <= true; + end if; + elsif theCpuCycle = opcodeFetch then + updateRegisters <= true; + end if; + end if; + end process; + + debugOpcode <= theOpcode; + process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + theCpuCycle <= nextCpuCycle; + end if; + if reset = '1' then + theCpuCycle <= cycle2; + end if; + end if; + end process; + + -- Determine the next cpu cycle. After the last cycle we always + -- go to opcodeFetch to get the next opcode. +calcNextCpuCycle: process(theCpuCycle, opcInfo, theOpcode, indexOut, T, N, V, C, Z) + begin + nextCpuCycle <= opcodeFetch; + + case theCpuCycle is + when opcodeFetch => + nextCpuCycle <= cycle2; + when cycle2 => + if opcInfo(opcBranch) = '1' then + if (N = theOpcode(5) and theOpcode(7 downto 6) = "00") + or (V = theOpcode(5) and theOpcode(7 downto 6) = "01") + or (C = theOpcode(5) and theOpcode(7 downto 6) = "10") + or (Z = theOpcode(5) and theOpcode(7 downto 6) = "11") then + -- Branch condition is true + nextCpuCycle <= cycleBranchTaken; + end if; + elsif (opcInfo(opcStackUp) = '1') then + nextCpuCycle <= cycleStack1; + elsif opcInfo(opcStackAddr) = '1' + and opcInfo(opcStackData) = '1' then + nextCpuCycle <= cycleStack2; + elsif opcInfo(opcStackAddr) = '1' then + nextCpuCycle <= cycleStack1; + elsif opcInfo(opcStackData) = '1' then + nextCpuCycle <= cycleWrite; + elsif opcInfo(opcAbsolute) = '1' then + nextCpuCycle <= cycle3; + elsif opcInfo(opcIndirect) = '1' then + if opcInfo(indexX) = '1' then + nextCpuCycle <= cyclePreIndirect; + else + nextCpuCycle <= cycleIndirect; + end if; + elsif opcInfo(opcZeroPage) = '1' then + if opcInfo(opcWrite) = '1' then + if (opcInfo(indexX) = '1') + or (opcInfo(indexY) = '1') then + nextCpuCycle <= cyclePreWrite; + else + nextCpuCycle <= cycleWrite; + end if; + else + if (opcInfo(indexX) = '1') + or (opcInfo(indexY) = '1') then + nextCpuCycle <= cyclePreRead; + else + nextCpuCycle <= cycleRead2; + end if; + end if; + elsif opcInfo(opcJump) = '1' then + nextCpuCycle <= cycleJump; + end if; + when cycle3 => + nextCpuCycle <= cycleRead; + if opcInfo(opcWrite) = '1' then + if (opcInfo(indexX) = '1') + or (opcInfo(indexY) = '1') then + nextCpuCycle <= cyclePreWrite; + else + nextCpuCycle <= cycleWrite; + end if; + end if; + if (opcInfo(opcIndirect) = '1') + and (opcInfo(indexX) = '1') then + if opcInfo(opcWrite) = '1' then + nextCpuCycle <= cycleWrite; + else + nextCpuCycle <= cycleRead2; + end if; + end if; + when cyclePreIndirect => + nextCpuCycle <= cycleIndirect; + when cycleIndirect => + nextCpuCycle <= cycle3; + when cycleBranchTaken => + if indexOut(8) /= T(7) then + -- Page boundary crossing during branch. + nextCpuCycle <= cycleBranchPage; + end if; + when cyclePreRead => + if opcInfo(opcZeroPage) = '1' then + nextCpuCycle <= cycleRead2; + end if; + when cycleRead => + if opcInfo(opcJump) = '1' then + nextCpuCycle <= cycleJump; + elsif indexOut(8) = '1' then + -- Page boundary crossing while indexed addressing. + nextCpuCycle <= cycleRead2; + elsif opcInfo(opcRmw) = '1' then + nextCpuCycle <= cycleRmw; + if opcInfo(indexX) = '1' + or opcInfo(indexY) = '1' then + -- 6510 needs extra cycle for indexed addressing + -- combined with RMW indexing + nextCpuCycle <= cycleRead2; + end if; + end if; + when cycleRead2 => + if opcInfo(opcRmw) = '1' then + nextCpuCycle <= cycleRmw; + end if; + when cycleRmw => + nextCpuCycle <= cycleWrite; + when cyclePreWrite => + nextCpuCycle <= cycleWrite; + when cycleStack1 => + nextCpuCycle <= cycleRead; + if opcInfo(opcStackAddr) = '1' then + nextCpuCycle <= cycleStack2; + end if; + when cycleStack2 => + nextCpuCycle <= cycleStack3; + if opcInfo(opcRti) = '1' then + nextCpuCycle <= cycleRead; + end if; + if opcInfo(opcStackData) = '0' + and opcInfo(opcStackUp) = '1' then + nextCpuCycle <= cycleJump; + end if; + when cycleStack3 => + nextCpuCycle <= cycleRead; + if opcInfo(opcStackData) = '0' + or opcInfo(opcStackUp) = '1' then + nextCpuCycle <= cycleJump; + elsif opcInfo(opcStackAddr) = '1' then + nextCpuCycle <= cycleStack4; + end if; + when cycleStack4 => + nextCpuCycle <= cycleRead; + when cycleJump => + if opcInfo(opcIncrAfter) = '1' then + -- Insert extra cycle + nextCpuCycle <= cycleEnd; + end if; + when others => + null; + end case; + end process; + +-- ----------------------------------------------------------------------- +-- T register +-- ----------------------------------------------------------------------- +calcT: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + case theCpuCycle is + when cycle2 => + T <= di; + when cycleStack1 | cycleStack2 => + if opcInfo(opcStackUp) = '1' then + -- Read from stack + T <= di; + end if; + when cycleIndirect | cycleRead | cycleRead2 => + T <= di; + when others => + null; + end case; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- A register +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateA) = '1' then + A <= aluRegisterOut; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- X register +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateX) = '1' then + X <= aluRegisterOut; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Y register +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateY) = '1' then + Y <= aluRegisterOut; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- C flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateC) = '1' then + C <= aluC; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Z flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateZ) = '1' then + Z <= aluZ; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- I flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateI) = '1' then + I <= aluInput(2); + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- D flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateD) = '1' then + D <= aluInput(3); + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- V flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateV) = '1' then + V <= aluV; + end if; + end if; + if enable = '1' then + if soReg = '1' and so_n = '0' then + V <= '1'; + end if; + soReg <= so_n; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- N flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateN) = '1' then + N <= aluN; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Stack pointer +-- ----------------------------------------------------------------------- + process(clk) + variable sIncDec : unsigned(7 downto 0); + variable updateFlag : boolean; + begin + if rising_edge(clk) then + + if opcInfo(opcStackUp) = '1' then + sIncDec := S + 1; + else + sIncDec := S - 1; + end if; + + if enable = '1' then + updateFlag := false; + case nextCpuCycle is + when cycleStack1 => + if (opcInfo(opcStackUp) = '1') + or (opcInfo(opcStackData) = '1') then + updateFlag := true; + end if; + when cycleStack2 => + updateFlag := true; + when cycleStack3 => + updateFlag := true; + when cycleStack4 => + updateFlag := true; + when cycleRead => + if opcInfo(opcRti) = '1' then + updateFlag := true; + end if; + when cycleWrite => + if opcInfo(opcStackData) = '1' then + updateFlag := true; + end if; + when others => + null; + end case; + if updateFlag then + S <= sIncDec; + end if; + end if; + if updateRegisters then + if opcInfo(opcUpdateS) = '1' then + S <= aluRegisterOut; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Data out +-- ----------------------------------------------------------------------- +--calcDo: process(cpuNo, theCpuCycle, aluOut, PC, T) +calcDo: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + doReg <= aluRmwOut; + if opcInfo(opcInH) = '1' then + -- For illegal opcodes SHA, SHX, SHY, SHS + doReg <= aluRmwOut and myAddrIncrH; + end if; + + case nextCpuCycle is + when cycleStack2 => + if opcInfo(opcIRQ) = '1' + and irqActive = '0' then + doReg <= myAddrIncr(15 downto 8); + else + doReg <= PC(15 downto 8); + end if; + when cycleStack3 => + doReg <= PC(7 downto 0); + when cycleRmw => +-- do <= T; -- Read-modify-write write old value first. + doReg <= di; -- Read-modify-write write old value first. + when others => null; + end case; + end if; + end if; + end process; + do <= doReg; + + + +-- ----------------------------------------------------------------------- +-- Write enable +-- ----------------------------------------------------------------------- +calcWe: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + theWe <= '0'; + case nextCpuCycle is + when cycleStack1 => + if opcInfo(opcStackUp) = '0' + and ((opcInfo(opcStackAddr) = '0') + or (opcInfo(opcStackData) = '1')) then + theWe <= '1'; + end if; + when cycleStack2 | cycleStack3 | cycleStack4 => + if opcInfo(opcStackUp) = '0' then + theWe <= '1'; + end if; + when cycleRmw => + theWe <= '1'; + when cycleWrite => + theWe <= '1'; + when others => + null; + end case; + end if; + end if; + end process; + we <= theWe; + +-- ----------------------------------------------------------------------- +-- Program counter +-- ----------------------------------------------------------------------- +calcPC: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + case theCpuCycle is + when opcodeFetch => + PC <= myAddr; + when cycle2 => + if irqActive = '0' then + if opcInfo(opcSecondByte) = '1' then + PC <= myAddrIncr; + else + PC <= myAddr; + end if; + end if; + when cycle3 => + if opcInfo(opcAbsolute) = '1' then + PC <= myAddrIncr; + end if; + when others => + null; + end case; + end if; + end if; + end process; + debugPc <= PC; + +-- ----------------------------------------------------------------------- +-- Address generation +-- ----------------------------------------------------------------------- +calcNextAddr: process(theCpuCycle, opcInfo, indexOut, T, reset) + begin + nextAddr <= nextAddrIncr; + case theCpuCycle is + when cycle2 => + if opcInfo(opcStackAddr) = '1' + or opcInfo(opcStackData) = '1' then + nextAddr <= nextAddrStack; + elsif opcInfo(opcAbsolute) = '1' then + nextAddr <= nextAddrIncr; + elsif opcInfo(opcZeroPage) = '1' then + nextAddr <= nextAddrZeroPage; + elsif opcInfo(opcIndirect) = '1' then + nextAddr <= nextAddrZeroPage; + elsif opcInfo(opcSecondByte) = '1' then + nextAddr <= nextAddrIncr; + else + nextAddr <= nextAddrHold; + end if; + when cycle3 => + if (opcInfo(opcIndirect) = '1') + and (opcInfo(indexX) = '1') then + nextAddr <= nextAddrAbs; + else + nextAddr <= nextAddrAbsIndexed; + end if; + when cyclePreIndirect => + nextAddr <= nextAddrZPIndexed; + when cycleIndirect => + nextAddr <= nextAddrIncrL; + when cycleBranchTaken => + nextAddr <= nextAddrRelative; + when cycleBranchPage => + if T(7) = '0' then + nextAddr <= nextAddrIncrH; + else + nextAddr <= nextAddrDecrH; + end if; + when cyclePreRead => + nextAddr <= nextAddrZPIndexed; + when cycleRead => + nextAddr <= nextAddrPc; + if opcInfo(opcJump) = '1' then + -- Emulate 6510 bug, jmp(xxFF) fetches from same page. + -- Replace with nextAddrIncr if emulating 65C02 or later cpu. + nextAddr <= nextAddrIncrL; + elsif indexOut(8) = '1' then + nextAddr <= nextAddrIncrH; + elsif opcInfo(opcRmw) = '1' then + nextAddr <= nextAddrHold; + end if; + when cycleRead2 => + nextAddr <= nextAddrPc; + if opcInfo(opcRmw) = '1' then + nextAddr <= nextAddrHold; + end if; + when cycleRmw => + nextAddr <= nextAddrHold; + when cyclePreWrite => + nextAddr <= nextAddrHold; + if opcInfo(opcZeroPage) = '1' then + nextAddr <= nextAddrZPIndexed; + elsif indexOut(8) = '1' then + nextAddr <= nextAddrIncrH; + end if; + when cycleWrite => + nextAddr <= nextAddrPc; + when cycleStack1 => + nextAddr <= nextAddrStack; + when cycleStack2 => + nextAddr <= nextAddrStack; + when cycleStack3 => + nextAddr <= nextAddrStack; + if opcInfo(opcStackData) = '0' then + nextAddr <= nextAddrPc; + end if; + when cycleStack4 => + nextAddr <= nextAddrIrq; + when cycleJump => + nextAddr <= nextAddrAbs; + when others => + null; + end case; + if reset = '1' then + nextAddr <= nextAddrReset; + end if; + end process; + +indexAlu: process(opcInfo, myAddr, T, X, Y) + begin + if opcInfo(indexX) = '1' then + indexOut <= (B"0" & T) + (B"0" & X); + elsif opcInfo(indexY) = '1' then + indexOut <= (B"0" & T) + (B"0" & Y); + elsif opcInfo(opcBranch) = '1' then + indexOut <= (B"0" & T) + (B"0" & myAddr(7 downto 0)); + else + indexOut <= B"0" & T; + end if; + end process; + +calcAddr: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + case nextAddr is + when nextAddrIncr => myAddr <= myAddrIncr; + when nextAddrIncrL => myAddr(7 downto 0) <= myAddrIncr(7 downto 0); + when nextAddrIncrH => myAddr(15 downto 8) <= myAddrIncrH; + when nextAddrDecrH => myAddr(15 downto 8) <= myAddrDecrH; + when nextAddrPc => myAddr <= PC; + when nextAddrIrq => + myAddr <= X"FFFE"; + if nmiReg = '0' then + myAddr <= X"FFFA"; + end if; + when nextAddrReset => myAddr <= X"FFFC"; + when nextAddrAbs => myAddr <= di & T; + when nextAddrAbsIndexed => myAddr <= di & indexOut(7 downto 0); + when nextAddrZeroPage => myAddr <= "00000000" & di; + when nextAddrZPIndexed => myAddr <= "00000000" & indexOut(7 downto 0); + when nextAddrStack => myAddr <= "00000001" & S; + when nextAddrRelative => myAddr(7 downto 0) <= indexOut(7 downto 0); + when others => null; + end case; + end if; + end if; + end process; + + myAddrIncr <= myAddr + 1; + myAddrIncrH <= myAddr(15 downto 8) + 1; + myAddrDecrH <= myAddr(15 downto 8) - 1; + + addr <= myAddr; + + debugA <= A; + debugX <= X; + debugY <= Y; + debugS <= S; + +end architecture; + + diff --git a/Commodore - Pet2001_MiST/rtl/hq2x.sv b/Commodore - Pet2001_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Commodore - Pet2001_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/Commodore - Pet2001_MiST/rtl/keyboard.sv b/Commodore - Pet2001_MiST/rtl/keyboard.sv new file mode 100644 index 00000000..dbb26c24 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/keyboard.sv @@ -0,0 +1,286 @@ + +module keyboard +( + input reset, + input clk, + + input ps2_kbd_clk, + input ps2_kbd_data, + + input [3:0] keyrow, + output [7:0] keyin, + output reg shift_lock, + + output reg [11:1] Fn = 0, + output reg [2:0] mod = 0 +); + +reg [3:0] prev_clk = 0; +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 [7:0] keys[10]; +reg release_btn = 0; +reg [7:0] code; + +assign keyin = keys[keyrow]; + +reg input_strobe = 0; +wire shift = mod[0]; + +always @(negedge clk) begin + reg old_reset = 0; + + old_reset <= reset; + + if(~old_reset & reset)begin + keys[0] <= 8'hFF; + keys[1] <= 8'hFF; + keys[2] <= 8'hFF; + keys[3] <= 8'hFF; + keys[4] <= 8'hFF; + keys[5] <= 8'hFF; + keys[6] <= 8'hFF; + keys[7] <= 8'hFF; + keys[8] <= 8'hFF; + keys[9] <= 8'hFF; + shift_lock <= 0; + end + + if(input_strobe) begin + case(code) + 8'h59: mod[0]<= ~release_btn; // right shift + 8'h12: mod[0]<= ~release_btn; // Left shift + 8'h11: mod[1]<= ~release_btn; // alt + 8'h14: mod[2]<= ~release_btn; // ctrl + 8'h05: Fn[1] <= ~release_btn; // F1 + 8'h06: Fn[2] <= ~release_btn; // F2 + 8'h04: Fn[3] <= ~release_btn; // F3 + 8'h0C: Fn[4] <= ~release_btn; // F4 + 8'h03: Fn[5] <= ~release_btn; // F5 + 8'h0B: Fn[6] <= ~release_btn; // F6 + 8'h83: Fn[7] <= ~release_btn; // F7 + 8'h0A: Fn[8] <= ~release_btn; // F8 + 8'h01: Fn[9] <= ~release_btn; // F9 + 8'h09: Fn[10]<= ~release_btn; // F10 + 8'h78: Fn[11]<= ~release_btn; // F11 + endcase + + case(code) + 'h76: begin + keys[9][4] <= release_btn; // ESC -> STOP + if(~release_btn) keys[8][5] <= 1; + else keys[8][5] <= ~shift_lock; + end + 'h05: begin + keys[9][4] <= release_btn; // F1 -> RUN + if(~release_btn) keys[8][5] <= 0; + else keys[8][5] <= ~shift_lock; + end + 'h06: begin + keys[0][6] <= release_btn; // F2 -> CLR + if(~release_btn) keys[8][5] <= 0; + else keys[8][5] <= ~shift_lock; + end + 'h71: begin + keys[1][7] <= release_btn; // DEL + if(~release_btn) keys[8][5] <= 1; + else keys[8][5] <= ~shift_lock; + end + 'h70: begin + keys[1][7] <= release_btn; // INSERT + if(~release_btn) keys[8][5] <= 0; + else keys[8][5] <= ~shift_lock; + end + 'h6C: begin + keys[0][6] <= release_btn; // HOME + if(~release_btn) keys[8][5] <= 1; + else keys[8][5] <= ~shift_lock; + end + 'h72: begin + keys[1][6] <= release_btn; // DOWN + if(~release_btn) keys[8][5] <= 1; + else keys[8][5] <= ~shift_lock; + end + 'h75: begin + keys[1][6] <= release_btn; // UP + if(~release_btn) keys[8][5] <= 0; + else keys[8][5] <= ~shift_lock; + end + 'h74: begin + keys[0][7] <= release_btn; // RIGHT + if(~release_btn) keys[8][5] <= 1; + else keys[8][5] <= ~shift_lock; + end + 'h6B: begin + keys[0][7] <= release_btn; // LEFT + if(~release_btn) keys[8][5] <= 0; + else keys[8][5] <= ~shift_lock; + end + + 'h58: begin + keys[8][5] <= release_btn ^ shift_lock; // CAPS -> R SHIFT + if(~release_btn) shift_lock <= ~shift_lock; + end + + 'h11: keys[8][5] <= release_btn ^ shift_lock; // ALT -> R SHIFT + 'h14: keys[8][0] <= release_btn; // CTRL -> L SHIFT + 'h1F: keys[9][0] <= release_btn; // L GUI -> REV ON/OFF + 'h5A: keys[6][5] <= release_btn; // RETURN + 'h66: keys[1][7] <= release_btn; // BKSP -> DEL + + 'h1C: keys[4][0] <= release_btn; // a + 'h32: keys[6][2] <= release_btn; // b + 'h21: keys[6][1] <= release_btn; // c + 'h23: keys[4][1] <= release_btn; // d + 'h24: keys[2][1] <= release_btn; // e + 'h2B: keys[5][1] <= release_btn; // f + 'h34: keys[4][2] <= release_btn; // g + 'h33: keys[5][2] <= release_btn; // h + 'h43: keys[3][3] <= release_btn; // i + 'h3B: keys[4][3] <= release_btn; // j + 'h42: keys[5][3] <= release_btn; // k + 'h4B: keys[4][4] <= release_btn; // l + 'h3A: keys[6][3] <= release_btn; // m + 'h31: keys[7][2] <= release_btn; // n + 'h44: keys[2][4] <= release_btn; // o + 'h4D: keys[3][4] <= release_btn; // p + 'h15: keys[2][0] <= release_btn; // q + 'h2D: keys[3][1] <= release_btn; // r + 'h1B: keys[5][0] <= release_btn; // s + 'h2C: keys[2][2] <= release_btn; // t + 'h3C: keys[2][3] <= release_btn; // u + 'h2A: keys[7][1] <= release_btn; // v + 'h1D: keys[3][0] <= release_btn; // w + 'h22: keys[7][0] <= release_btn; // x + 'h35: keys[3][2] <= release_btn; // y + 'h1A: keys[6][0] <= release_btn; // z + + 'h54: keys[9][1] <= release_btn; // [ + 'h5B: keys[8][2] <= release_btn; // ] + 'h5D: keys[1][3] <= release_btn; // \ + 'h29: keys[9][2] <= release_btn; // SPACE + + 'h16: begin + keys[6][6] <= release_btn | shift; // 1 + keys[0][0] <= release_btn | ~shift; // ! + end + + 'h1E: begin + keys[7][6] <= release_btn | shift; // 2 + keys[8][1] <= release_btn | ~shift; // @ + end + + 'h26: begin + keys[6][7] <= release_btn | shift; // 3 + keys[0][1] <= release_btn | ~shift; // # + end + + 'h25: begin + keys[4][6] <= release_btn | shift; // 4 + keys[1][1] <= release_btn | ~shift; // $ + end + + 'h2E: begin + keys[5][6] <= release_btn | shift; // 5 + keys[0][2] <= release_btn | ~shift; // % + end + + 'h36: begin + keys[4][7] <= release_btn | shift; // 6 + keys[2][5] <= release_btn | ~shift; // ^ + end + + 'h3D: begin + keys[2][6] <= release_btn | shift; // 7 + keys[0][3] <= release_btn | ~shift; // & + end + + 'h3E: begin + keys[3][6] <= release_btn | shift; // 8 + keys[5][7] <= release_btn | ~shift; // * + end + + 'h46: begin + keys[2][7] <= release_btn | shift; // 9 + keys[0][4] <= release_btn | ~shift; // ( + end + + 'h45: begin + keys[8][6] <= release_btn | shift; // 0 + keys[1][4] <= release_btn | ~shift; // ) + end + + 'h41: begin + keys[7][3] <= release_btn | shift; // , + keys[9][3] <= release_btn | ~shift; // < + end + + 'h49: begin + keys[9][6] <= release_btn | shift; // . + keys[8][4] <= release_btn | ~shift; // > + end + + 'h4A: begin + keys[3][7] <= release_btn | shift; // / + keys[7][4] <= release_btn | ~shift; // ? + end + + 'h4C: begin + keys[6][4] <= release_btn | shift; // ; + keys[5][4] <= release_btn | ~shift; // : + end + + 'h4E: begin + keys[8][7] <= release_btn | shift; // - + keys[0][5] <= release_btn | ~shift; // _ + end + + 'h52: begin + keys[1][2] <= release_btn | shift; // ' + keys[1][0] <= release_btn | ~shift; // " + end + + 'h55: begin + keys[9][7] <= release_btn | shift; // = + keys[7][7] <= release_btn | ~shift; // + + end + + default:; + endcase + end +end + +always @(posedge clk) begin + 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/Commodore - Pet2001_MiST/rtl/mist_io.v b/Commodore - Pet2001_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Commodore - Pet2001_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/Commodore - Pet2001_MiST/rtl/osd.v b/Commodore - Pet2001_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Commodore - Pet2001_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/Commodore - Pet2001_MiST/rtl/pet2001hw.sv b/Commodore - Pet2001_MiST/rtl/pet2001hw.sv new file mode 100644 index 00000000..3098936b --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/pet2001hw.sv @@ -0,0 +1,186 @@ +`timescale 1ns / 1ps +/////////////////////////////////////////////////////////////////////////////// +// +// Engineer: Thomas Skibo +// +// Create Date: Sep 23, 2011 +// +// Module Name: pet2001hw +// +// Description: Encapsulate all Pet hardware except cpu. +// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2011, Thomas Skibo. All rights reserved. +// +// Redistribution and use in source and binary 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 binary 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. +// * The names of contributors may not 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 Thomas Skibo 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. +// +////////////////////////////////////////////////////////////////////////////// + +module pet2001hw +( + input [15:0] addr, // CPU Interface + input [7:0] data_in, + output reg [7:0] data_out, + input we, + output irq, + + output pix, + output HSync, + output VSync, + + output [3:0] keyrow, // Keyboard + input [7:0] keyin, + + output cass_motor_n, // Cassette + output cass_write, + input cass_sense_n, + input cass_read, + output audio, // CB2 audio + + input [13:0] dma_addr, + input [7:0] dma_din, + output [7:0] dma_dout, + input dma_we, + + input clk_speed, + input clk_stop, + input diag_l, + input clk, + input ce_7mp, + input ce_7mn, + input ce_1m, + input reset +); + +///////////////////////////////////////////////////////////// +// Pet ROMS incuding character ROM. Character data is read +// out second port. This brings total ROM to 16K which is +// easy to arrange. +///////////////////////////////////////////////////////////// +wire [7:0] rom_data; + +wire [10:0] charaddr; +wire [7:0] chardata; + +pet2001rom rom +( + .q_a(rom_data), + .q_b(chardata), + .address_a(addr[13:0]), + .address_b({3'b101,charaddr}), + .clock(clk) +); + + +////////////////////////////////////////////////////////////// +// Pet RAM and video RAM. Video RAM is dual ported. +////////////////////////////////////////////////////////////// +wire [7:0] ram_data; +wire [7:0] vram_data; +wire [7:0] video_data; +wire [10:0] video_addr; + +wire ram_we = we && (addr[15:14] == 2'b00); +wire vram_we = we && (addr[15:11] == 5'b1000_0); + +pet2001ram ram +( + .clock(clk), + + .q_a(ram_data), + .data_a(data_in), + .address_a(addr[13:0]), + .wren_a(ram_we), + + .q_b(dma_dout), + .data_b(dma_din), + .address_b(dma_addr), + .wren_b(dma_we) +); + +pet2001vram vidram +( + .clock(clk), + + .address_a(addr[10:0]), + .data_a(data_in), + .wren_a(vram_we), + .q_a(vram_data), + + .address_b(video_addr), + .data_b(0), + .wren_b(0), + .q_b(video_data) +); + +////////////////////////////////////// +// Video hardware. +////////////////////////////////////// +wire video_on; // signal indicating VGA is scanning visible + // rows. Used to generate tick interrupts. +wire video_blank; // blank screen during scrolling +wire video_gfx; // display graphic characters vs. lower-case + +pet2001video vid(.*); + +//////////////////////////////////////////////////////// +// I/O hardware +//////////////////////////////////////////////////////// +wire [7:0] io_read_data; +wire io_we = we && (addr[15:11] == 5'b1110_1); + +pet2001io io +( + .*, + .ce(ce_1m), + .data_out(io_read_data), + .data_in(data_in), + .addr(addr[10:0]), + .we(io_we), + .video_sync(video_on) +); + +///////////////////////////////////// +// Read data mux (to CPU) +///////////////////////////////////// +always @(*) +casex(addr[15:11]) + 5'b1111_x: // F000-FFFF + data_out = rom_data; + 5'b1110_1: // E800-EFFF + data_out = io_read_data; + 5'b1110_0: // E000-E7FF + data_out = rom_data; + 5'b110x_x: // C000-DFFF + data_out = rom_data; + 5'b1000_0: // 8000-87FF + data_out = vram_data; + 5'b00xx_x: // 0000-3FFF + data_out = ram_data; + default: + data_out = 8'h55; +endcase + +endmodule // pet2001hw diff --git a/Commodore - Pet2001_MiST/rtl/pet2001io.v b/Commodore - Pet2001_MiST/rtl/pet2001io.v new file mode 100644 index 00000000..59fd8ae6 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/pet2001io.v @@ -0,0 +1,208 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////// +// +// Engineer: Thomas Skibo +// +// Create Date: Sep 24, 2011 +// +// Module Name: pet2001io +// +// Description: +// I/O devices for Pet emulator. Includes two PIAs and a VIA and a +// module that converts a PS2 keyboard into a PET keyboard. +// +// I/O is mapped into region 0xE800-0xEFFF. +// +// 0xE810-0xE813 PIA1 +// 0xE820-0xE823 PIA2 +// 0xE840-0xE84F VIA +// +///////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2011, Thomas Skibo. All rights reserved. +// +// Redistribution and use in source and binary 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 binary 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. +// * The names of contributors may not 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 Thomas Skibo 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. +// +////////////////////////////////////////////////////////////////////////////// + +module pet2001io +( + output reg [7:0] data_out, // CPU interface + input [7:0] data_in, + input [10:0] addr, + input we, + + output irq, + + output [3:0] keyrow, // Keyboard + input [7:0] keyin, + + output video_blank, // Video controls + output video_gfx, + input video_sync, + + output cass_motor_n, // Cassette #1 interface + output cass_write, + input cass_sense_n, + input cass_read, + output audio, // CB2 audio + + input diag_l, // diag jumper input + + input ce, + input clk, + input reset +); + +//delay ce for io for stability. +reg strobe_io; +always @(negedge clk) strobe_io <= ce; + +/////////////////////////// 6520 PIA1 //////////////////////////////////// +// +wire pia1_strobe = strobe_io && (addr[10:2] == 9'b000_0001_00); +wire [7:0] pia1_data_out; +wire pia1_irq; +wire [7:0] pia1_porta_out; +wire [7:0] pia1_porta_in = {diag_l, 2'b00, cass_sense_n, 4'b0000}; +wire pia1_ca1_in = !cass_read; +wire pia1_ca2_out; + +pia6520 pia1 +( + .data_out(pia1_data_out), + .data_in(data_in), + .addr(addr[1:0]), + .strobe(pia1_strobe), + .we(we), + + .irq(pia1_irq), + .porta_out(pia1_porta_out), + .porta_in(pia1_porta_in), + .portb_out(), + .portb_in(keyin), + + .ca1_in(pia1_ca1_in), + .ca2_out(pia1_ca2_out), + .ca2_in(1'b0), + + .cb1_in(video_sync), + .cb2_out(cass_motor_n), + .cb2_in(1'b0), + + .clk(clk), + .reset(reset) +); + +assign video_blank = !pia1_ca2_out; +assign keyrow = pia1_porta_out[3:0]; + + +////////////////////////// 6520 PIA2 //////////////////////////////////// +// (does nothing for now) +wire pia2_strobe = strobe_io && (addr[10:2] == 9'b000_0010_00); +wire [7:0] pia2_data_out; +wire pia2_irq; + +pia6520 pia2 +( + .data_out(pia2_data_out), + .data_in(data_in), + .addr(addr[1:0]), + .strobe(pia2_strobe), + .we(we), + + .irq(pia2_irq), + .porta_out(), + .porta_in(8'h00), + .portb_out(), + .portb_in(8'h00), + + .ca1_in(1'b0), + .ca2_out(), + .ca2_in(1'b0), + + .cb1_in(1'b0), + .cb2_out(), + .cb2_in(1'b0), + + .clk(clk), + .reset(reset) +); + + +/////////////////////////// 6522 VIA //////////////////////////////////// +// +wire via_strobe = strobe_io && (addr[10:4] == 7'b000_0100); +wire [7:0] via_data_out; +wire via_irq; +wire [7:0] via_portb_out; +wire [7:0] via_portb_in = {2'b00, video_sync, 5'b0_0000}; + +via6522 via +( + .data_out(via_data_out), + .data_in(data_in), + .addr(addr[3:0]), + .strobe(via_strobe), + .we(we), + + .irq(via_irq), + .porta_out(), + .porta_in(8'h00), + .portb_out(via_portb_out), + .portb_in(via_portb_in), + + .ca1_in(1'b0), + .ca2_out(video_gfx), + .ca2_in(1'b0), + + .cb1_out(), + .cb1_in(1'b0), + .cb2_out(audio), + .cb2_in(1'b0), + + .ce(ce), + + .clk(clk), + .reset(reset) +); + +assign cass_write = via_portb_out[3]; + + +/////////////// Read data mux ///////////////////////// +// register I/O stuff, therefore RDY must be delayed a cycle! +// +always @(posedge clk) +casex (addr[10:2]) + 9'b000_0001_00: data_out <= pia1_data_out; + 9'b000_0010_00: data_out <= pia2_data_out; + 9'b000_0100_xx: data_out <= via_data_out; + default: data_out <= 8'hXX; +endcase + +assign irq = pia1_irq || pia2_irq || via_irq; + +endmodule // pet2001io diff --git a/Commodore - Pet2001_MiST/rtl/pet2001ram.v b/Commodore - Pet2001_MiST/rtl/pet2001ram.v new file mode 100644 index 00000000..1eeed5c0 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/pet2001ram.v @@ -0,0 +1,242 @@ +// megafunction wizard: %RAM: 2-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: pet2001ram.v +// Megafunction Name(s): +// altsyncram +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Full Version +// ************************************************************ + + +//Copyright (C) 1991-2014 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 pet2001ram ( + address_a, + address_b, + clock, + data_a, + data_b, + wren_a, + wren_b, + q_a, + q_b); + + input [13:0] address_a; + input [13:0] address_b; + input clock; + input [7:0] data_a; + input [7:0] data_b; + input wren_a; + input wren_b; + output [7:0] q_a; + output [7:0] q_b; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; + tri0 wren_a; + tri0 wren_b; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [7:0] sub_wire0; + wire [7:0] sub_wire1; + wire [7:0] q_a = sub_wire0[7:0]; + wire [7:0] q_b = sub_wire1[7:0]; + + altsyncram altsyncram_component ( + .clock0 (clock), + .wren_a (wren_a), + .address_b (address_b), + .data_b (data_b), + .wren_b (wren_b), + .address_a (address_a), + .data_a (data_a), + .q_a (sub_wire0), + .q_b (sub_wire1), + .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), + .eccstatus (), + .rden_a (1'b1), + .rden_b (1'b1)); + defparam + 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_a = "BYPASS", + altsyncram_component.clock_enable_output_b = "BYPASS", + altsyncram_component.indata_reg_b = "CLOCK0", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 16384, + altsyncram_component.numwords_b = 16384, + altsyncram_component.operation_mode = "BIDIR_DUAL_PORT", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_aclr_b = "NONE", + altsyncram_component.outdata_reg_a = "UNREGISTERED", + altsyncram_component.outdata_reg_b = "UNREGISTERED", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.read_during_write_mode_mixed_ports = "DONT_CARE", + altsyncram_component.read_during_write_mode_port_a = "NEW_DATA_NO_NBE_READ", + altsyncram_component.read_during_write_mode_port_b = "NEW_DATA_NO_NBE_READ", + altsyncram_component.widthad_a = 14, + altsyncram_component.widthad_b = 14, + altsyncram_component.width_a = 8, + altsyncram_component.width_b = 8, + altsyncram_component.width_byteena_a = 1, + altsyncram_component.width_byteena_b = 1, + altsyncram_component.wrcontrol_wraddress_reg_b = "CLOCK0"; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0" +// Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "1" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0" +// Retrieval info: PRIVATE: CLRdata NUMERIC "0" +// Retrieval info: PRIVATE: CLRq NUMERIC "0" +// Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0" +// Retrieval info: PRIVATE: CLRrren NUMERIC "0" +// Retrieval info: PRIVATE: CLRwraddress NUMERIC "0" +// Retrieval info: PRIVATE: CLRwren NUMERIC "0" +// Retrieval info: PRIVATE: Clock NUMERIC "0" +// Retrieval info: PRIVATE: Clock_A NUMERIC "0" +// Retrieval info: PRIVATE: Clock_B NUMERIC "0" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INDATA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: INDATA_REG_B NUMERIC "1" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MEMSIZE NUMERIC "131072" +// Retrieval info: PRIVATE: MEM_IN_BITS NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "" +// Retrieval info: PRIVATE: OPERATION_MODE NUMERIC "3" +// Retrieval info: PRIVATE: OUTDATA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: OUTDATA_REG_B NUMERIC "0" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_MIXED_PORTS NUMERIC "2" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_B NUMERIC "3" +// Retrieval info: PRIVATE: REGdata NUMERIC "1" +// Retrieval info: PRIVATE: REGq NUMERIC "0" +// Retrieval info: PRIVATE: REGrdaddress NUMERIC "0" +// Retrieval info: PRIVATE: REGrren NUMERIC "0" +// Retrieval info: PRIVATE: REGwraddress NUMERIC "1" +// Retrieval info: PRIVATE: REGwren NUMERIC "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_DIFF_CLKEN NUMERIC "0" +// Retrieval info: PRIVATE: UseDPRAM NUMERIC "1" +// Retrieval info: PRIVATE: VarWidth NUMERIC "0" +// Retrieval info: PRIVATE: WIDTH_READ_A NUMERIC "8" +// Retrieval info: PRIVATE: WIDTH_READ_B NUMERIC "8" +// Retrieval info: PRIVATE: WIDTH_WRITE_A NUMERIC "8" +// Retrieval info: PRIVATE: WIDTH_WRITE_B NUMERIC "8" +// Retrieval info: PRIVATE: WRADDR_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: WRADDR_REG_B NUMERIC "1" +// Retrieval info: PRIVATE: WRCTRL_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: enable NUMERIC "0" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: ADDRESS_REG_B STRING "CLOCK0" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_B STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_B STRING "BYPASS" +// Retrieval info: CONSTANT: INDATA_REG_B STRING "CLOCK0" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "16384" +// Retrieval info: CONSTANT: NUMWORDS_B NUMERIC "16384" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "BIDIR_DUAL_PORT" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_ACLR_B STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED" +// Retrieval info: CONSTANT: OUTDATA_REG_B STRING "UNREGISTERED" +// Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_MIXED_PORTS STRING "DONT_CARE" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_A STRING "NEW_DATA_NO_NBE_READ" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_B STRING "NEW_DATA_NO_NBE_READ" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "14" +// Retrieval info: CONSTANT: WIDTHAD_B NUMERIC "14" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_B NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_B NUMERIC "1" +// Retrieval info: CONSTANT: WRCONTROL_WRADDRESS_REG_B STRING "CLOCK0" +// Retrieval info: USED_PORT: address_a 0 0 14 0 INPUT NODEFVAL "address_a[13..0]" +// Retrieval info: USED_PORT: address_b 0 0 14 0 INPUT NODEFVAL "address_b[13..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: data_a 0 0 8 0 INPUT NODEFVAL "data_a[7..0]" +// Retrieval info: USED_PORT: data_b 0 0 8 0 INPUT NODEFVAL "data_b[7..0]" +// Retrieval info: USED_PORT: q_a 0 0 8 0 OUTPUT NODEFVAL "q_a[7..0]" +// Retrieval info: USED_PORT: q_b 0 0 8 0 OUTPUT NODEFVAL "q_b[7..0]" +// Retrieval info: USED_PORT: wren_a 0 0 0 0 INPUT GND "wren_a" +// Retrieval info: USED_PORT: wren_b 0 0 0 0 INPUT GND "wren_b" +// Retrieval info: CONNECT: @address_a 0 0 14 0 address_a 0 0 14 0 +// Retrieval info: CONNECT: @address_b 0 0 14 0 address_b 0 0 14 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: @data_a 0 0 8 0 data_a 0 0 8 0 +// Retrieval info: CONNECT: @data_b 0 0 8 0 data_b 0 0 8 0 +// Retrieval info: CONNECT: @wren_a 0 0 0 0 wren_a 0 0 0 0 +// Retrieval info: CONNECT: @wren_b 0 0 0 0 wren_b 0 0 0 0 +// Retrieval info: CONNECT: q_a 0 0 8 0 @q_a 0 0 8 0 +// Retrieval info: CONNECT: q_b 0 0 8 0 @q_b 0 0 8 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001ram.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001ram.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001ram.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001ram.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001ram_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001ram_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Commodore - Pet2001_MiST/rtl/pet2001rom.v b/Commodore - Pet2001_MiST/rtl/pet2001rom.v new file mode 100644 index 00000000..0d4d90ea --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/pet2001rom.v @@ -0,0 +1,228 @@ +// megafunction wizard: %ROM: 2-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: pet2001rom.v +// Megafunction Name(s): +// altsyncram +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Full Version +// ************************************************************ + + +//Copyright (C) 1991-2014 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 pet2001rom ( + address_a, + address_b, + clock, + q_a, + q_b); + + input [13:0] address_a; + input [13:0] address_b; + input clock; + output [7:0] q_a; + output [7:0] q_b; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [7:0] sub_wire0; + wire [7:0] sub_wire1; + wire sub_wire2 = 1'h0; + wire [7:0] sub_wire3 = 8'h0; + wire [7:0] q_b = sub_wire0[7:0]; + wire [7:0] q_a = sub_wire1[7:0]; + + altsyncram altsyncram_component ( + .clock0 (clock), + .wren_a (sub_wire2), + .address_b (address_b), + .data_b (sub_wire3), + .wren_b (sub_wire2), + .address_a (address_a), + .data_a (sub_wire3), + .q_b (sub_wire0), + .q_a (sub_wire1) + // synopsys translate_off + , + .aclr0 (), + .aclr1 (), + .addressstall_a (), + .addressstall_b (), + .byteena_a (), + .byteena_b (), + .clock1 (), + .clocken0 (), + .clocken1 (), + .clocken2 (), + .clocken3 (), + .eccstatus (), + .rden_a (), + .rden_b () + // synopsys translate_on + ); + defparam + 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_a = "BYPASS", + altsyncram_component.clock_enable_output_b = "BYPASS", + altsyncram_component.indata_reg_b = "CLOCK0", + altsyncram_component.init_file = "./roms/Pet2001_RomType2.mif", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 16384, + altsyncram_component.numwords_b = 16384, + altsyncram_component.operation_mode = "BIDIR_DUAL_PORT", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_aclr_b = "NONE", + altsyncram_component.outdata_reg_a = "UNREGISTERED", + altsyncram_component.outdata_reg_b = "UNREGISTERED", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.widthad_a = 14, + altsyncram_component.widthad_b = 14, + altsyncram_component.width_a = 8, + altsyncram_component.width_b = 8, + altsyncram_component.width_byteena_a = 1, + altsyncram_component.width_byteena_b = 1, + altsyncram_component.wrcontrol_wraddress_reg_b = "CLOCK0"; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0" +// Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "1" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0" +// Retrieval info: PRIVATE: CLRdata NUMERIC "0" +// Retrieval info: PRIVATE: CLRq NUMERIC "0" +// Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0" +// Retrieval info: PRIVATE: CLRrren NUMERIC "0" +// Retrieval info: PRIVATE: CLRwraddress NUMERIC "0" +// Retrieval info: PRIVATE: CLRwren NUMERIC "0" +// Retrieval info: PRIVATE: Clock NUMERIC "0" +// Retrieval info: PRIVATE: Clock_A NUMERIC "0" +// Retrieval info: PRIVATE: Clock_B NUMERIC "0" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INDATA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: INDATA_REG_B NUMERIC "1" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MEMSIZE NUMERIC "131072" +// Retrieval info: PRIVATE: MEM_IN_BITS NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "./roms/Pet2001_RomType2.mif" +// Retrieval info: PRIVATE: OPERATION_MODE NUMERIC "3" +// Retrieval info: PRIVATE: OUTDATA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: OUTDATA_REG_B NUMERIC "0" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_MIXED_PORTS NUMERIC "2" +// Retrieval info: PRIVATE: REGdata NUMERIC "1" +// Retrieval info: PRIVATE: REGq NUMERIC "0" +// Retrieval info: PRIVATE: REGrdaddress NUMERIC "0" +// Retrieval info: PRIVATE: REGrren NUMERIC "0" +// Retrieval info: PRIVATE: REGwraddress NUMERIC "1" +// Retrieval info: PRIVATE: REGwren NUMERIC "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_DIFF_CLKEN NUMERIC "0" +// Retrieval info: PRIVATE: UseDPRAM NUMERIC "1" +// Retrieval info: PRIVATE: VarWidth NUMERIC "0" +// Retrieval info: PRIVATE: WIDTH_READ_A NUMERIC "8" +// Retrieval info: PRIVATE: WIDTH_READ_B NUMERIC "8" +// Retrieval info: PRIVATE: WIDTH_WRITE_A NUMERIC "8" +// Retrieval info: PRIVATE: WIDTH_WRITE_B NUMERIC "8" +// Retrieval info: PRIVATE: WRADDR_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: WRADDR_REG_B NUMERIC "1" +// Retrieval info: PRIVATE: WRCTRL_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: enable NUMERIC "0" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: ADDRESS_REG_B STRING "CLOCK0" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_B STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_B STRING "BYPASS" +// Retrieval info: CONSTANT: INDATA_REG_B STRING "CLOCK0" +// Retrieval info: CONSTANT: INIT_FILE STRING "./roms/Pet2001_RomType2.mif" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "16384" +// Retrieval info: CONSTANT: NUMWORDS_B NUMERIC "16384" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "BIDIR_DUAL_PORT" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_ACLR_B STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED" +// Retrieval info: CONSTANT: OUTDATA_REG_B STRING "UNREGISTERED" +// Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "14" +// Retrieval info: CONSTANT: WIDTHAD_B NUMERIC "14" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_B NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_B NUMERIC "1" +// Retrieval info: CONSTANT: WRCONTROL_WRADDRESS_REG_B STRING "CLOCK0" +// Retrieval info: USED_PORT: address_a 0 0 14 0 INPUT NODEFVAL "address_a[13..0]" +// Retrieval info: USED_PORT: address_b 0 0 14 0 INPUT NODEFVAL "address_b[13..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: q_a 0 0 8 0 OUTPUT NODEFVAL "q_a[7..0]" +// Retrieval info: USED_PORT: q_b 0 0 8 0 OUTPUT NODEFVAL "q_b[7..0]" +// Retrieval info: CONNECT: @address_a 0 0 14 0 address_a 0 0 14 0 +// Retrieval info: CONNECT: @address_b 0 0 14 0 address_b 0 0 14 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: @data_a 0 0 8 0 GND 0 0 8 0 +// Retrieval info: CONNECT: @data_b 0 0 8 0 GND 0 0 8 0 +// Retrieval info: CONNECT: @wren_a 0 0 0 0 GND 0 0 0 0 +// Retrieval info: CONNECT: @wren_b 0 0 0 0 GND 0 0 0 0 +// Retrieval info: CONNECT: q_a 0 0 8 0 @q_a 0 0 8 0 +// Retrieval info: CONNECT: q_b 0 0 8 0 @q_b 0 0 8 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001rom.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001rom.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001rom.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001rom.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001rom_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001rom_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Commodore - Pet2001_MiST/rtl/pet2001video.v b/Commodore - Pet2001_MiST/rtl/pet2001video.v new file mode 100644 index 00000000..cfe0af32 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/pet2001video.v @@ -0,0 +1,60 @@ +`timescale 1ns / 1ps + +module pet2001video +( + output pix, + output reg HSync, + output reg VSync, + + output [10:0] video_addr, // Video RAM intf + input [7:0] video_data, + + output [10:0] charaddr, // char rom intf + input [7:0] chardata, + output video_on, // control sigs + input video_blank, + input video_gfx, + input clk, + input ce_7mp, + input ce_7mn +); + +assign video_on = (vc < 200); +assign video_addr = {vc[8:3], 5'b00000}+{vc[8:3], 3'b000}+hc[8:3]; +assign charaddr = {video_gfx, video_data[6:0], vc[2:0]}; + +reg [8:0] hc; +reg [8:0] vc; + +always @(posedge clk) begin + if(ce_7mp) begin + hc <= hc + 1'd1; + if(hc == 447) begin + hc <=0; + vc <= vc + 1'd1; + if(vc == 261) vc <= 0; + end + end + + if(ce_7mn) begin + if(hc == 358) HSync <= 1; + if(hc == 391) HSync <= 0; + if(vc == 225) VSync <= 1; + if(vc == 234) VSync <= 0; + end +end + +reg [7:0] vdata; +reg inv; +assign pix = (vdata[7] ^ inv) & ~video_blank; + +always @(posedge clk) begin + if(ce_7mn) begin + if(!hc[2:0]) {inv, vdata} <= ((hc<320) && (vc<200)) ? {video_data[7], chardata} : 9'd0; + else vdata <= {vdata[6:0], 1'b0}; + end +end + + +endmodule // pet2001video + diff --git a/Commodore - Pet2001_MiST/rtl/pet2001vram.v b/Commodore - Pet2001_MiST/rtl/pet2001vram.v new file mode 100644 index 00000000..02c78a2b --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/pet2001vram.v @@ -0,0 +1,242 @@ +// megafunction wizard: %RAM: 2-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: pet2001vram.v +// Megafunction Name(s): +// altsyncram +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Full Version +// ************************************************************ + + +//Copyright (C) 1991-2014 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 pet2001vram ( + address_a, + address_b, + clock, + data_a, + data_b, + wren_a, + wren_b, + q_a, + q_b); + + input [10:0] address_a; + input [10:0] address_b; + input clock; + input [7:0] data_a; + input [7:0] data_b; + input wren_a; + input wren_b; + output [7:0] q_a; + output [7:0] q_b; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; + tri0 wren_a; + tri0 wren_b; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [7:0] sub_wire0; + wire [7:0] sub_wire1; + wire [7:0] q_a = sub_wire0[7:0]; + wire [7:0] q_b = sub_wire1[7:0]; + + altsyncram altsyncram_component ( + .clock0 (clock), + .wren_a (wren_a), + .address_b (address_b), + .data_b (data_b), + .wren_b (wren_b), + .address_a (address_a), + .data_a (data_a), + .q_a (sub_wire0), + .q_b (sub_wire1), + .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), + .eccstatus (), + .rden_a (1'b1), + .rden_b (1'b1)); + defparam + 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_a = "BYPASS", + altsyncram_component.clock_enable_output_b = "BYPASS", + altsyncram_component.indata_reg_b = "CLOCK0", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 2048, + altsyncram_component.numwords_b = 2048, + altsyncram_component.operation_mode = "BIDIR_DUAL_PORT", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_aclr_b = "NONE", + altsyncram_component.outdata_reg_a = "UNREGISTERED", + altsyncram_component.outdata_reg_b = "UNREGISTERED", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.read_during_write_mode_mixed_ports = "DONT_CARE", + altsyncram_component.read_during_write_mode_port_a = "NEW_DATA_NO_NBE_READ", + altsyncram_component.read_during_write_mode_port_b = "NEW_DATA_NO_NBE_READ", + altsyncram_component.widthad_a = 11, + altsyncram_component.widthad_b = 11, + altsyncram_component.width_a = 8, + altsyncram_component.width_b = 8, + altsyncram_component.width_byteena_a = 1, + altsyncram_component.width_byteena_b = 1, + altsyncram_component.wrcontrol_wraddress_reg_b = "CLOCK0"; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0" +// Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "1" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0" +// Retrieval info: PRIVATE: CLRdata NUMERIC "0" +// Retrieval info: PRIVATE: CLRq NUMERIC "0" +// Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0" +// Retrieval info: PRIVATE: CLRrren NUMERIC "0" +// Retrieval info: PRIVATE: CLRwraddress NUMERIC "0" +// Retrieval info: PRIVATE: CLRwren NUMERIC "0" +// Retrieval info: PRIVATE: Clock NUMERIC "0" +// Retrieval info: PRIVATE: Clock_A NUMERIC "0" +// Retrieval info: PRIVATE: Clock_B NUMERIC "0" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INDATA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: INDATA_REG_B NUMERIC "1" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MEMSIZE NUMERIC "16384" +// Retrieval info: PRIVATE: MEM_IN_BITS NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "" +// Retrieval info: PRIVATE: OPERATION_MODE NUMERIC "3" +// Retrieval info: PRIVATE: OUTDATA_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: OUTDATA_REG_B NUMERIC "0" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_MIXED_PORTS NUMERIC "2" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_B NUMERIC "3" +// Retrieval info: PRIVATE: REGdata NUMERIC "1" +// Retrieval info: PRIVATE: REGq NUMERIC "0" +// Retrieval info: PRIVATE: REGrdaddress NUMERIC "0" +// Retrieval info: PRIVATE: REGrren NUMERIC "0" +// Retrieval info: PRIVATE: REGwraddress NUMERIC "1" +// Retrieval info: PRIVATE: REGwren NUMERIC "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_DIFF_CLKEN NUMERIC "0" +// Retrieval info: PRIVATE: UseDPRAM NUMERIC "1" +// Retrieval info: PRIVATE: VarWidth NUMERIC "0" +// Retrieval info: PRIVATE: WIDTH_READ_A NUMERIC "8" +// Retrieval info: PRIVATE: WIDTH_READ_B NUMERIC "8" +// Retrieval info: PRIVATE: WIDTH_WRITE_A NUMERIC "8" +// Retrieval info: PRIVATE: WIDTH_WRITE_B NUMERIC "8" +// Retrieval info: PRIVATE: WRADDR_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: WRADDR_REG_B NUMERIC "1" +// Retrieval info: PRIVATE: WRCTRL_ACLR_B NUMERIC "0" +// Retrieval info: PRIVATE: enable NUMERIC "0" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: ADDRESS_REG_B STRING "CLOCK0" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_B STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_B STRING "BYPASS" +// Retrieval info: CONSTANT: INDATA_REG_B STRING "CLOCK0" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "2048" +// Retrieval info: CONSTANT: NUMWORDS_B NUMERIC "2048" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "BIDIR_DUAL_PORT" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_ACLR_B STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED" +// Retrieval info: CONSTANT: OUTDATA_REG_B STRING "UNREGISTERED" +// Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_MIXED_PORTS STRING "DONT_CARE" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_A STRING "NEW_DATA_NO_NBE_READ" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_B STRING "NEW_DATA_NO_NBE_READ" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "11" +// Retrieval info: CONSTANT: WIDTHAD_B NUMERIC "11" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_B NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_B NUMERIC "1" +// Retrieval info: CONSTANT: WRCONTROL_WRADDRESS_REG_B STRING "CLOCK0" +// Retrieval info: USED_PORT: address_a 0 0 11 0 INPUT NODEFVAL "address_a[10..0]" +// Retrieval info: USED_PORT: address_b 0 0 11 0 INPUT NODEFVAL "address_b[10..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: data_a 0 0 8 0 INPUT NODEFVAL "data_a[7..0]" +// Retrieval info: USED_PORT: data_b 0 0 8 0 INPUT NODEFVAL "data_b[7..0]" +// Retrieval info: USED_PORT: q_a 0 0 8 0 OUTPUT NODEFVAL "q_a[7..0]" +// Retrieval info: USED_PORT: q_b 0 0 8 0 OUTPUT NODEFVAL "q_b[7..0]" +// Retrieval info: USED_PORT: wren_a 0 0 0 0 INPUT GND "wren_a" +// Retrieval info: USED_PORT: wren_b 0 0 0 0 INPUT GND "wren_b" +// Retrieval info: CONNECT: @address_a 0 0 11 0 address_a 0 0 11 0 +// Retrieval info: CONNECT: @address_b 0 0 11 0 address_b 0 0 11 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: @data_a 0 0 8 0 data_a 0 0 8 0 +// Retrieval info: CONNECT: @data_b 0 0 8 0 data_b 0 0 8 0 +// Retrieval info: CONNECT: @wren_a 0 0 0 0 wren_a 0 0 0 0 +// Retrieval info: CONNECT: @wren_b 0 0 0 0 wren_b 0 0 0 0 +// Retrieval info: CONNECT: q_a 0 0 8 0 @q_a 0 0 8 0 +// Retrieval info: CONNECT: q_b 0 0 8 0 @q_b 0 0 8 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001vram.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001vram.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001vram.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001vram.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001vram_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pet2001vram_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Commodore - Pet2001_MiST/rtl/pia6520.v b/Commodore - Pet2001_MiST/rtl/pia6520.v new file mode 100644 index 00000000..ae4770e6 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/pia6520.v @@ -0,0 +1,230 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////// +// +// Engineer: Thomas Skibo +// +// Create Date: Sep 24, 2011 +// +// Module Name: pia6520 +// +// Description: +// +// A simple implementation of the 6520 Peripheral Interface Adapter (PIA). +// Tri-state lines aren't used. Instead, All PIA I/O signals have +// seperate "in" and "out" signals. Wire or ignore appropriately. +// +///////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2011, Thomas Skibo. All rights reserved. +// +// Redistribution and use in source and binary 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 binary 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. +// * The names of contributors may not 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 Thomas Skibo 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. +// +////////////////////////////////////////////////////////////////////////////// + +module pia6520 +( + output reg [7:0] data_out, // cpu interface + input [7:0] data_in, + input [1:0] addr, + input strobe, + input we, + + output irq, + + output reg [7:0] porta_out, + input [7:0] porta_in, + output reg [7:0] portb_out, + input [7:0] portb_in, + + input ca1_in, + output reg ca2_out, + input ca2_in, + input cb1_in, + output reg cb2_out, + input cb2_in, + + input clk, + input reset +); + +reg [7:0] ddra; +reg [5:0] cra; +reg irqa1; +reg irqa2; + +reg [7:0] ddrb; +reg [5:0] crb; +reg irqb1; +reg irqb2; + +// Register address offsets +parameter [1:0] + ADDR_PORTA = 2'b00, + ADDR_CRA = 2'b01, + ADDR_PORTB = 2'b10, + ADDR_CRB = 2'b11; + +wire wr_strobe = strobe && we; +wire rd_strobe = strobe && !we; +wire porta_rd_strobe = rd_strobe && addr == ADDR_PORTA; +wire portb_rd_strobe = rd_strobe && addr == ADDR_PORTB; +wire portb_wr_strobe = wr_strobe && addr == ADDR_PORTB; + +// Implement CRA[5:0] +always @(posedge clk) begin + if (reset) cra <= 6'b00_0000; + else if (wr_strobe && addr == ADDR_CRA) cra <= data_in[5:0]; +end + +// Implement CRB[5:0] +always @(posedge clk) begin + if (reset) crb <= 6'b00_0000; + else if (wr_strobe && addr == ADDR_CRB) crb <= data_in[5:0]; +end + +// Implement PORTA (out) +always @(posedge clk) begin + if (reset) porta_out <= 8'h00; + else if (wr_strobe && addr == ADDR_PORTA && cra[2]) porta_out <= data_in; +end + +// Implement DDRA +always @(posedge clk) begin + if (reset) ddra <= 8'h00; + else if (wr_strobe && addr == ADDR_PORTA && !cra[2]) ddra <= data_in; +end + +// Implement PORTB (out) +always @(posedge clk) begin + if (reset) portb_out <= 8'h00; + else if (wr_strobe && addr == ADDR_PORTB && crb[2]) portb_out <= data_in; +end + +// Implement DDRB +always @(posedge clk) begin + if (reset) ddrb <= 8'h00; + else if (wr_strobe && addr == ADDR_PORTB && !crb[2]) ddrb <= data_in; +end + +//////////////////////////////////////////////////////// +// IRQA logic + +// register ca1_in and ca2_in to detect transitions. +reg ca1_in_1; +reg ca2_in_1; +always @(posedge clk) begin + ca1_in_1 <= ca1_in; + ca2_in_1 <= ca2_in; +end + +// detect "active" transitions +wire ca1_act_trans = ((ca1_in && !ca1_in_1 && cra[1]) || (!ca1_in && ca1_in_1 && !cra[1])); +wire ca2_act_trans = ((ca2_in && !ca2_in_1 && cra[4]) || (!ca2_in && ca2_in_1 && !cra[4])); + +// IRQA1 +always @(posedge clk) begin + if (reset || (porta_rd_strobe && !ca1_act_trans)) irqa1 <= 1'b0; + else if (ca1_act_trans) irqa1 <= 1'b1; +end + +// IRQA2 +always @(posedge clk) begin + if (reset || (porta_rd_strobe && !ca2_act_trans)) irqa2 <= 1'b0; + else if (ca2_act_trans && !cra[5]) irqa2 <= 1'b1; +end + + +//////////////////////////////////////////////////////// +// IRQB logic + +// register cb1_in and cb2_in to detect transitions. +reg cb1_in_1; +reg cb2_in_1; +always @(posedge clk) begin + cb1_in_1 <= cb1_in; + cb2_in_1 <= cb2_in; +end + +// detect "active" transitions +wire cb1_act_trans = ((cb1_in && !cb1_in_1 && crb[1]) || (!cb1_in && cb1_in_1 && !crb[1])); +wire cb2_act_trans = ((cb2_in && !cb2_in_1 && crb[4]) || (!cb2_in && cb2_in_1 && !crb[4])); + +// IRQB1 +always @(posedge clk) begin + if (reset || (portb_rd_strobe && !cb1_act_trans)) irqb1 <= 1'b0; + else if (cb1_act_trans) irqb1 <= 1'b1; +end + +// IRQB2 +always @(posedge clk) begin + if (reset || (portb_rd_strobe && !cb2_act_trans)) irqb2 <= 1'b0; + else if (cb2_act_trans && !crb[5]) irqb2 <= 1'b1; +end + + +// IRQ and enable logic. +assign irq = (irqa1 && cra[0]) || (irqa2 && cra[3]) || + (irqb1 && crb[0]) || (irqb2 && crb[3]); + +/////////////////////////////////////////////////// +// CA2 and CB2 output modes +always @(posedge clk) begin + case (cra[5:3]) + 3'b100: ca2_out <= irqa1; + 3'b101: ca2_out <= !ca1_act_trans; + 3'b111: ca2_out <= 1'b1; + default: ca2_out <= 1'b0; + endcase +end + +reg cb2_out_r; +always @(posedge clk) begin + if (reset || (portb_wr_strobe && !cb1_act_trans)) cb2_out_r <= 1'b0; + else if (cb1_act_trans) cb2_out_r <= 1'b1; +end + +always @(posedge clk) begin + case (crb[5:3]) + 3'b100: cb2_out <= cb2_out_r; + 3'b101: cb2_out <= !portb_wr_strobe; + 3'b111: cb2_out <= 1'b1; + default: cb2_out <= 1'b0; + endcase +end + +/////////////////////////////////////////////////// +// Read data mux +wire [7:0] porta = (porta_out & ddra) | (porta_in & ~ddra); +wire [7:0] portb = (portb_out & ddrb) | (portb_in & ~ddrb); + +always @(*) begin + case (addr) + ADDR_PORTA: data_out = cra[2] ? porta : ddra; + ADDR_CRA: data_out = { irqa1, irqa2, cra }; + ADDR_PORTB: data_out = crb[2] ? portb : ddrb; + ADDR_CRB: data_out = { irqb1, irqb2, crb }; + endcase +end + +endmodule // pia6520 diff --git a/Commodore - Pet2001_MiST/rtl/pll.v b/Commodore - Pet2001_MiST/rtl/pll.v new file mode 100644 index 00000000..18c60289 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/pll.v @@ -0,0 +1,363 @@ +// 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.4 Build 182 03/12/2014 SJ Full Version +// ************************************************************ + + +//Copyright (C) 1991-2014 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, + locked); + + input inclk0; + output c0; + output c1; + output c2; + output locked; + + wire [4:0] sub_wire0; + wire sub_wire2; + wire [0:0] sub_wire7 = 1'h0; + wire [2:2] sub_wire4 = sub_wire0[2:2]; + wire [0:0] sub_wire3 = sub_wire0[0:0]; + wire [1:1] sub_wire1 = sub_wire0[1:1]; + wire c1 = sub_wire1; + wire locked = sub_wire2; + wire c0 = sub_wire3; + wire c2 = sub_wire4; + wire sub_wire5 = inclk0; + wire [1:0] sub_wire6 = {sub_wire7, sub_wire5}; + + altpll altpll_component ( + .inclk (sub_wire6), + .clk (sub_wire0), + .locked (sub_wire2), + .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 (), + .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 = 112, + altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 27, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 112, + altpll_component.clk1_phase_shift = "-1488", + altpll_component.clk2_divide_by = 27, + altpll_component.clk2_duty_cycle = 50, + altpll_component.clk2_multiply_by = 56, + altpll_component.clk2_phase_shift = "0", + 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 = "NO_COMPENSATION", + 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_USED", + 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.self_reset_on_loss_lock = "ON", + 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 "1" +// 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 "1" +// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "1" +// Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "1" +// 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 "112.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "112.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "56.000000" +// 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 "1" +// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "10000" +// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "0" +// 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 "50.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 "1" +// 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 "1" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "1" +// Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "1" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "112.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "112.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "56.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "1" +// 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 "-60.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 "ps" +// 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 "1" +// 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 "112" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "112" +// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "-1488" +// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "27" +// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "56" +// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +// 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 "NO_COMPENSATION" +// 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_USED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "ON" +// 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: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// 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: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Commodore - Pet2001_MiST/rtl/roms/Pet2001_RomType1.mif b/Commodore - Pet2001_MiST/rtl/roms/Pet2001_RomType1.mif new file mode 100644 index 00000000..180c40e4 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/roms/Pet2001_RomType1.mif @@ -0,0 +1,15354 @@ +-- Copyright (C) 1991-2014 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 generated Memory Initialization File (.mif) + +WIDTH=8; +DEPTH=16384; + +ADDRESS_RADIX=HEX; +DATA_RADIX=HEX; + +CONTENT BEGIN + 0000 : 1D; + 0001 : C7; + 0002 : 48; + 0003 : C6; + 0004 : 35; + 0005 : CC; + 0006 : EF; + 0007 : C7; + 0008 : C5; + 0009 : CA; + 000A : DF; + 000B : CA; + 000C : 70; + 000D : CF; + 000E : 23; + 000F : CB; + 0010 : 9C; + 0011 : C8; + 0012 : 9C; + 0013 : C7; + 0014 : 74; + 0015 : C7; + 0016 : 1F; + 0017 : C8; + 0018 : 0C; + 0019 : C7; + 001A : 7F; + 001B : C7; + 001C : C9; + 001D : C7; + 001E : 32; + 001F : C8; + 0020 : 1B; + 0021 : C7; + 0022 : 42; + 0023 : C8; + 0024 : 01; + 0025 : D7; + 0026 : D4; + 0027 : FF; + 0028 : D7; + 0029 : FF; + 002A : DA; + 002B : FF; + 002C : 94; + 002D : D2; + 002E : F8; + 002F : D6; + 0030 : 7E; + 0031 : C9; + 0032 : 9E; + 0033 : C9; + 0034 : 44; + 0035 : C7; + 0036 : A7; + 0037 : C5; + 0038 : 6F; + 0039 : C7; + 003A : 84; + 003B : C9; + 003C : DD; + 003D : FF; + 003E : BF; + 003F : FF; + 0040 : C2; + 0041 : FF; + 0042 : 9E; + 0043 : CA; + 0044 : 50; + 0045 : C5; + 0046 : 0B; + 0047 : DB; + 0048 : 9E; + 0049 : DB; + 004A : 2A; + 004B : DB; + [004C..004D] : 00; + 004E : 64; + 004F : D2; + 0050 : 85; + 0051 : D2; + 0052 : 24; + 0053 : DE; + 0054 : 45; + 0055 : DF; + 0056 : BF; + 0057 : D8; + 0058 : A0; + 0059 : DE; + 005A : 9E; + 005B : DF; + 005C : A5; + 005D : DF; + 005E : EE; + 005F : DF; + 0060 : 48; + 0061 : E0; + 0062 : E6; + 0063 : D6; + 0064 : 54; + 0065 : D6; + 0066 : 49; + 0067 : D3; + 0068 : 85; + 0069 : D6; + 006A : 63; + 006B : D6; + 006C : C4; + 006D : D5; + 006E : D8; + 006F : D5; + 0070 : 04; + 0071 : D6; + 0072 : 0F; + 0073 : D6; + 0074 : 79; + 0075 : 3E; + 0076 : D7; + 0077 : 79; + 0078 : 27; + 0079 : D7; + 007A : 7B; + 007B : FF; + 007C : D8; + 007D : 7B; + 007E : E3; + 007F : D9; + 0080 : 7F; + 0081 : 2D; + 0082 : DE; + 0083 : 50; + 0084 : D8; + 0085 : CE; + 0086 : 46; + 0087 : D5; + 0088 : CE; + 0089 : 7D; + 008A : 66; + 008B : DE; + 008C : 5A; + 008D : E7; + 008E : CD; + 008F : 64; + 0090 : 05; + 0091 : CF; + 0092 : 45; + 0093 : 4E; + 0094 : C4; + 0095 : 46; + 0096 : 4F; + 0097 : D2; + 0098 : 4E; + 0099 : 45; + 009A : 58; + 009B : D4; + 009C : 44; + 009D : 41; + 009E : 54; + 009F : C1; + 00A0 : 49; + 00A1 : 4E; + 00A2 : 50; + 00A3 : 55; + 00A4 : 54; + 00A5 : A3; + 00A6 : 49; + 00A7 : 4E; + 00A8 : 50; + 00A9 : 55; + 00AA : D4; + 00AB : 44; + 00AC : 49; + 00AD : CD; + 00AE : 52; + 00AF : 45; + 00B0 : 41; + 00B1 : C4; + 00B2 : 4C; + 00B3 : 45; + 00B4 : D4; + 00B5 : 47; + 00B6 : 4F; + 00B7 : 54; + 00B8 : CF; + 00B9 : 52; + 00BA : 55; + 00BB : CE; + 00BC : 49; + 00BD : C6; + 00BE : 52; + 00BF : 45; + 00C0 : 53; + 00C1 : 54; + 00C2 : 4F; + 00C3 : 52; + 00C4 : C5; + 00C5 : 47; + 00C6 : 4F; + 00C7 : 53; + 00C8 : 55; + 00C9 : C2; + 00CA : 52; + 00CB : 45; + 00CC : 54; + 00CD : 55; + 00CE : 52; + 00CF : CE; + 00D0 : 52; + 00D1 : 45; + 00D2 : CD; + 00D3 : 53; + 00D4 : 54; + 00D5 : 4F; + 00D6 : D0; + 00D7 : 4F; + 00D8 : CE; + 00D9 : 57; + 00DA : 41; + 00DB : 49; + 00DC : D4; + 00DD : 4C; + 00DE : 4F; + 00DF : 41; + 00E0 : C4; + 00E1 : 53; + 00E2 : 41; + 00E3 : 56; + 00E4 : C5; + 00E5 : 56; + 00E6 : 45; + 00E7 : 52; + 00E8 : 49; + 00E9 : 46; + 00EA : D9; + 00EB : 44; + 00EC : 45; + 00ED : C6; + 00EE : 50; + 00EF : 4F; + 00F0 : 4B; + 00F1 : C5; + 00F2 : 50; + 00F3 : 52; + 00F4 : 49; + 00F5 : 4E; + 00F6 : 54; + 00F7 : A3; + 00F8 : 50; + 00F9 : 52; + 00FA : 49; + 00FB : 4E; + 00FC : D4; + 00FD : 43; + 00FE : 4F; + 00FF : 4E; + 0100 : D4; + 0101 : 4C; + 0102 : 49; + 0103 : 53; + 0104 : D4; + 0105 : 43; + 0106 : 4C; + 0107 : D2; + 0108 : 43; + 0109 : 4D; + 010A : C4; + 010B : 53; + 010C : 59; + 010D : D3; + 010E : 4F; + 010F : 50; + 0110 : 45; + 0111 : CE; + 0112 : 43; + 0113 : 4C; + 0114 : 4F; + 0115 : 53; + 0116 : C5; + 0117 : 47; + 0118 : 45; + 0119 : D4; + 011A : 4E; + 011B : 45; + 011C : D7; + 011D : 54; + 011E : 41; + 011F : 42; + 0120 : A8; + 0121 : 54; + 0122 : CF; + 0123 : 46; + 0124 : CE; + 0125 : 53; + 0126 : 50; + 0127 : 43; + 0128 : A8; + 0129 : 54; + 012A : 48; + 012B : 45; + 012C : CE; + 012D : 4E; + 012E : 4F; + 012F : D4; + 0130 : 53; + 0131 : 54; + 0132 : 45; + 0133 : D0; + 0134 : AB; + 0135 : AD; + 0136 : AA; + 0137 : AF; + 0138 : DE; + 0139 : 41; + 013A : 4E; + 013B : C4; + 013C : 4F; + 013D : D2; + 013E : BE; + 013F : BD; + 0140 : BC; + 0141 : 53; + 0142 : 47; + 0143 : CE; + 0144 : 49; + 0145 : 4E; + 0146 : D4; + 0147 : 41; + 0148 : 42; + 0149 : D3; + 014A : 55; + 014B : 53; + 014C : D2; + 014D : 46; + 014E : 52; + 014F : C5; + 0150 : 50; + 0151 : 4F; + 0152 : D3; + 0153 : 53; + 0154 : 51; + 0155 : D2; + 0156 : 52; + 0157 : 4E; + 0158 : C4; + 0159 : 4C; + 015A : 4F; + 015B : C7; + 015C : 45; + 015D : 58; + 015E : D0; + 015F : 43; + 0160 : 4F; + 0161 : D3; + 0162 : 53; + 0163 : 49; + 0164 : CE; + 0165 : 54; + 0166 : 41; + 0167 : CE; + 0168 : 41; + 0169 : 54; + 016A : CE; + 016B : 50; + [016C..016D] : 45; + 016E : CB; + 016F : 4C; + 0170 : 45; + 0171 : CE; + 0172 : 53; + 0173 : 54; + 0174 : 52; + 0175 : A4; + 0176 : 56; + 0177 : 41; + 0178 : CC; + 0179 : 41; + 017A : 53; + 017B : C3; + 017C : 43; + 017D : 48; + 017E : 52; + 017F : A4; + 0180 : 4C; + 0181 : 45; + 0182 : 46; + 0183 : 54; + 0184 : A4; + 0185 : 52; + 0186 : 49; + 0187 : 47; + 0188 : 48; + 0189 : 54; + 018A : A4; + 018B : 4D; + 018C : 49; + 018D : 44; + 018E : A4; + 018F : 00; + 0190 : 4E; + 0191 : 45; + 0192 : 58; + 0193 : 54; + 0194 : 20; + 0195 : 57; + 0196 : 49; + 0197 : 54; + 0198 : 48; + 0199 : 4F; + 019A : 55; + 019B : 54; + 019C : 20; + 019D : 46; + 019E : 4F; + 019F : D2; + 01A0 : 53; + 01A1 : 59; + 01A2 : 4E; + 01A3 : 54; + 01A4 : 41; + 01A5 : D8; + 01A6 : 52; + 01A7 : 45; + 01A8 : 54; + 01A9 : 55; + 01AA : 52; + 01AB : 4E; + 01AC : 20; + 01AD : 57; + 01AE : 49; + 01AF : 54; + 01B0 : 48; + 01B1 : 4F; + 01B2 : 55; + 01B3 : 54; + 01B4 : 20; + 01B5 : 47; + 01B6 : 4F; + 01B7 : 53; + 01B8 : 55; + 01B9 : C2; + 01BA : 4F; + 01BB : 55; + 01BC : 54; + 01BD : 20; + 01BE : 4F; + 01BF : 46; + 01C0 : 20; + 01C1 : 44; + 01C2 : 41; + 01C3 : 54; + 01C4 : C1; + 01C5 : 49; + [01C6..01C7] : 4C; + 01C8 : 45; + 01C9 : 47; + 01CA : 41; + 01CB : 4C; + 01CC : 20; + 01CD : 51; + 01CE : 55; + 01CF : 41; + 01D0 : 4E; + 01D1 : 54; + 01D2 : 49; + 01D3 : 54; + 01D4 : D9; + [01D5..01D9] : 00; + 01DA : 4F; + 01DB : 56; + 01DC : 45; + 01DD : 52; + 01DE : 46; + 01DF : 4C; + 01E0 : 4F; + 01E1 : D7; + 01E2 : 4F; + 01E3 : 55; + 01E4 : 54; + 01E5 : 20; + 01E6 : 4F; + 01E7 : 46; + 01E8 : 20; + 01E9 : 4D; + 01EA : 45; + 01EB : 4D; + 01EC : 4F; + 01ED : 52; + 01EE : D9; + 01EF : 55; + 01F0 : 4E; + 01F1 : 44; + 01F2 : 45; + 01F3 : 46; + 01F4 : 27; + 01F5 : 44; + 01F6 : 20; + 01F7 : 53; + 01F8 : 54; + 01F9 : 41; + 01FA : 54; + 01FB : 45; + 01FC : 4D; + 01FD : 45; + 01FE : 4E; + 01FF : D4; + 0200 : 42; + 0201 : 41; + 0202 : 44; + 0203 : 20; + 0204 : 53; + 0205 : 55; + 0206 : 42; + 0207 : 53; + 0208 : 43; + 0209 : 52; + 020A : 49; + 020B : 50; + 020C : D4; + 020D : 52; + 020E : 45; + 020F : 44; + 0210 : 49; + 0211 : 4D; + 0212 : 27; + 0213 : 44; + 0214 : 20; + 0215 : 41; + [0216..0217] : 52; + 0218 : 41; + 0219 : D9; + 021A : 44; + 021B : 49; + 021C : 56; + 021D : 49; + 021E : 53; + 021F : 49; + 0220 : 4F; + 0221 : 4E; + 0222 : 20; + 0223 : 42; + 0224 : 59; + 0225 : 20; + 0226 : 5A; + 0227 : 45; + 0228 : 52; + 0229 : CF; + 022A : 49; + [022B..022C] : 4C; + 022D : 45; + 022E : 47; + 022F : 41; + 0230 : 4C; + 0231 : 20; + 0232 : 44; + 0233 : 49; + 0234 : 52; + 0235 : 45; + 0236 : 43; + 0237 : D4; + 0238 : 54; + 0239 : 59; + 023A : 50; + 023B : 45; + 023C : 20; + 023D : 4D; + 023E : 49; + 023F : 53; + 0240 : 4D; + 0241 : 41; + 0242 : 54; + 0243 : 43; + 0244 : C8; + 0245 : 53; + 0246 : 54; + 0247 : 52; + 0248 : 49; + 0249 : 4E; + 024A : 47; + 024B : 20; + 024C : 54; + [024D..024E] : 4F; + 024F : 20; + 0250 : 4C; + 0251 : 4F; + 0252 : 4E; + 0253 : C7; + 0254 : 42; + 0255 : 41; + 0256 : 44; + 0257 : 20; + 0258 : 44; + 0259 : 41; + 025A : 54; + 025B : C1; + 025C : 46; + 025D : 4F; + 025E : 52; + 025F : 4D; + 0260 : 55; + 0261 : 4C; + 0262 : 41; + 0263 : 20; + 0264 : 54; + [0265..0266] : 4F; + 0267 : 20; + 0268 : 43; + 0269 : 4F; + 026A : 4D; + 026B : 50; + 026C : 4C; + 026D : 45; + 026E : D8; + 026F : 43; + 0270 : 41; + 0271 : 4E; + 0272 : 27; + 0273 : 54; + 0274 : 20; + 0275 : 43; + 0276 : 4F; + 0277 : 4E; + 0278 : 54; + 0279 : 49; + 027A : 4E; + 027B : 55; + 027C : C5; + 027D : 55; + 027E : 4E; + 027F : 44; + 0280 : 45; + 0281 : 46; + 0282 : 27; + 0283 : 44; + 0284 : 20; + 0285 : 46; + 0286 : 55; + 0287 : 4E; + 0288 : 43; + 0289 : 54; + 028A : 49; + 028B : 4F; + 028C : CE; + 028D : 20; + 028E : 45; + [028F..0290] : 52; + 0291 : 4F; + 0292 : 52; + 0293 : 00; + 0294 : 20; + 0295 : 49; + 0296 : 4E; + 0297 : 20; + 0298 : 00; + 0299 : 0D; + 029A : 0A; + 029B : 52; + 029C : 45; + 029D : 41; + 029E : 44; + 029F : 59; + 02A0 : 2E; + 02A1 : 0D; + 02A2 : 0A; + 02A3 : 00; + 02A4 : 0D; + 02A5 : 0A; + 02A6 : 42; + 02A7 : 52; + 02A8 : 45; + 02A9 : 41; + 02AA : 4B; + 02AB : 00; + 02AC : BA; + [02AD..02B0] : E8; + 02B1 : BD; + [02B2..02B3] : 01; + 02B4 : C9; + 02B5 : 81; + 02B6 : D0; + 02B7 : 21; + 02B8 : A5; + 02B9 : 99; + 02BA : D0; + 02BB : 0A; + 02BC : BD; + 02BD : 02; + 02BE : 01; + 02BF : 85; + 02C0 : 98; + 02C1 : BD; + 02C2 : 03; + 02C3 : 01; + 02C4 : 85; + 02C5 : 99; + 02C6 : DD; + 02C7 : 03; + 02C8 : 01; + 02C9 : D0; + 02CA : 07; + 02CB : A5; + 02CC : 98; + 02CD : DD; + 02CE : 02; + 02CF : 01; + 02D0 : F0; + 02D1 : 07; + 02D2 : 8A; + 02D3 : 18; + 02D4 : 69; + 02D5 : 12; + 02D6 : AA; + 02D7 : D0; + 02D8 : D8; + 02D9 : 60; + 02DA : 20; + 02DB : 2A; + 02DC : C3; + 02DD : 85; + 02DE : 80; + 02DF : 84; + 02E0 : 81; + 02E1 : 38; + 02E2 : A5; + 02E3 : A9; + 02E4 : E5; + 02E5 : AE; + 02E6 : 85; + 02E7 : 71; + 02E8 : A8; + 02E9 : A5; + 02EA : AA; + 02EB : E5; + 02EC : AF; + 02ED : AA; + 02EE : E8; + 02EF : 98; + 02F0 : F0; + 02F1 : 23; + 02F2 : A5; + 02F3 : A9; + 02F4 : 38; + 02F5 : E5; + 02F6 : 71; + 02F7 : 85; + 02F8 : A9; + 02F9 : B0; + 02FA : 03; + 02FB : C6; + 02FC : AA; + 02FD : 38; + 02FE : A5; + 02FF : A7; + 0300 : E5; + 0301 : 71; + 0302 : 85; + 0303 : A7; + 0304 : B0; + 0305 : 08; + 0306 : C6; + 0307 : A8; + 0308 : 90; + 0309 : 04; + 030A : B1; + 030B : A9; + 030C : 91; + 030D : A7; + 030E : 88; + 030F : D0; + 0310 : F9; + 0311 : B1; + 0312 : A9; + 0313 : 91; + 0314 : A7; + 0315 : C6; + 0316 : AA; + 0317 : C6; + 0318 : A8; + 0319 : CA; + 031A : D0; + 031B : F2; + 031C : 60; + 031D : 0A; + 031E : 69; + 031F : 36; + 0320 : B0; + 0321 : 35; + 0322 : 85; + 0323 : 71; + 0324 : BA; + 0325 : E4; + 0326 : 71; + 0327 : 90; + 0328 : 2E; + 0329 : 60; + 032A : C4; + 032B : 83; + 032C : 90; + 032D : 28; + 032E : D0; + 032F : 04; + 0330 : C5; + 0331 : 82; + 0332 : 90; + 0333 : 22; + 0334 : 48; + 0335 : A2; + 0336 : 09; + 0337 : 98; + 0338 : 48; + 0339 : B5; + 033A : A6; + 033B : CA; + 033C : 10; + 033D : FA; + 033E : 20; + 033F : 04; + 0340 : D4; + 0341 : A2; + 0342 : F7; + 0343 : 68; + 0344 : 95; + 0345 : B0; + 0346 : E8; + 0347 : 30; + 0348 : FA; + 0349 : 68; + 034A : A8; + 034B : 68; + 034C : C4; + 034D : 83; + 034E : 90; + 034F : 06; + 0350 : D0; + 0351 : 05; + 0352 : C5; + 0353 : 82; + 0354 : B0; + 0355 : 01; + 0356 : 60; + 0357 : A2; + 0358 : 52; + 0359 : 46; + 035A : 64; + 035B : A5; + 035C : 03; + 035D : F0; + 035E : 07; + 035F : 20; + 0360 : CC; + 0361 : FF; + 0362 : A9; + 0363 : 00; + 0364 : 85; + 0365 : 03; + 0366 : 20; + 0367 : D2; + 0368 : C9; + 0369 : 20; + 036A : 47; + 036B : CA; + 036C : BD; + 036D : 90; + 036E : C1; + 036F : 48; + 0370 : 29; + 0371 : 7F; + 0372 : 20; + 0373 : 49; + 0374 : CA; + 0375 : E8; + 0376 : 68; + 0377 : 10; + 0378 : F3; + 0379 : 20; + 037A : 84; + 037B : C5; + 037C : A9; + 037D : 8D; + 037E : A0; + 037F : C2; + 0380 : 20; + 0381 : 27; + 0382 : CA; + 0383 : A4; + 0384 : 89; + 0385 : C8; + 0386 : F0; + 0387 : 03; + 0388 : 20; + 0389 : 94; + 038A : DC; + 038B : 46; + 038C : 64; + 038D : A9; + 038E : 99; + 038F : A0; + 0390 : C2; + 0391 : 20; + 0392 : 27; + 0393 : CA; + 0394 : 20; + 0395 : 68; + 0396 : C4; + 0397 : 86; + 0398 : C9; + 0399 : 84; + 039A : CA; + 039B : 20; + 039C : C2; + 039D : 00; + 039E : F0; + 039F : F4; + 03A0 : A2; + 03A1 : FF; + 03A2 : 86; + 03A3 : 89; + 03A4 : 90; + 03A5 : 06; + 03A6 : 20; + 03A7 : 8D; + 03A8 : C4; + 03A9 : 4C; + 03AA : E9; + 03AB : C6; + 03AC : 20; + 03AD : 63; + 03AE : C8; + 03AF : 20; + 03B0 : 8D; + 03B1 : C4; + 03B2 : 84; + 03B3 : 5C; + 03B4 : 20; + 03B5 : 22; + 03B6 : C5; + 03B7 : 90; + 03B8 : 44; + 03B9 : A0; + 03BA : 01; + 03BB : B1; + 03BC : AE; + 03BD : 85; + 03BE : 72; + 03BF : A5; + 03C0 : 7C; + 03C1 : 85; + 03C2 : 71; + 03C3 : A5; + 03C4 : AF; + 03C5 : 85; + 03C6 : 74; + 03C7 : A5; + 03C8 : AE; + 03C9 : 88; + 03CA : F1; + 03CB : AE; + 03CC : 18; + 03CD : 65; + 03CE : 7C; + 03CF : 85; + 03D0 : 7C; + 03D1 : 85; + 03D2 : 73; + 03D3 : A5; + 03D4 : 7D; + 03D5 : 69; + 03D6 : FF; + 03D7 : 85; + 03D8 : 7D; + 03D9 : E5; + 03DA : AF; + 03DB : AA; + 03DC : 38; + 03DD : A5; + 03DE : AE; + 03DF : E5; + 03E0 : 7C; + 03E1 : A8; + 03E2 : B0; + 03E3 : 03; + 03E4 : E8; + 03E5 : C6; + 03E6 : 74; + 03E7 : 18; + 03E8 : 65; + 03E9 : 71; + 03EA : 90; + 03EB : 03; + 03EC : C6; + 03ED : 72; + 03EE : 18; + 03EF : B1; + 03F0 : 71; + 03F1 : 91; + 03F2 : 73; + 03F3 : C8; + 03F4 : D0; + 03F5 : F9; + 03F6 : E6; + 03F7 : 72; + 03F8 : E6; + 03F9 : 74; + 03FA : CA; + 03FB : D0; + 03FC : F2; + 03FD : A5; + 03FE : 0A; + 03FF : F0; + 0400 : 2F; + 0401 : A5; + 0402 : 86; + 0403 : A4; + 0404 : 87; + 0405 : 85; + 0406 : 82; + 0407 : 84; + 0408 : 83; + 0409 : A5; + 040A : 7C; + 040B : 85; + 040C : A9; + 040D : 65; + 040E : 5C; + 040F : 85; + 0410 : A7; + 0411 : A4; + 0412 : 7D; + 0413 : 84; + 0414 : AA; + 0415 : 90; + 0416 : 01; + 0417 : C8; + 0418 : 84; + 0419 : A8; + 041A : 20; + 041B : DA; + 041C : C2; + 041D : A5; + 041E : 80; + 041F : A4; + 0420 : 81; + 0421 : 85; + 0422 : 7C; + 0423 : 84; + 0424 : 7D; + 0425 : A4; + 0426 : 5C; + 0427 : 88; + 0428 : B9; + 0429 : 06; + 042A : 00; + 042B : 91; + 042C : AE; + 042D : 88; + 042E : 10; + 042F : F8; + 0430 : 20; + 0431 : 67; + 0432 : C5; + 0433 : A5; + 0434 : 7A; + 0435 : A4; + 0436 : 7B; + 0437 : 85; + 0438 : 71; + 0439 : 84; + 043A : 72; + 043B : 18; + 043C : A0; + 043D : 01; + 043E : B1; + 043F : 71; + 0440 : D0; + 0441 : 03; + 0442 : 4C; + 0443 : 94; + 0444 : C3; + 0445 : A0; + 0446 : 04; + 0447 : C8; + 0448 : B1; + 0449 : 71; + 044A : D0; + 044B : FB; + 044C : C8; + 044D : 98; + 044E : 65; + 044F : 71; + 0450 : AA; + 0451 : A0; + 0452 : 00; + 0453 : 91; + 0454 : 71; + 0455 : A5; + 0456 : 72; + 0457 : 69; + 0458 : 00; + 0459 : C8; + 045A : 91; + 045B : 71; + 045C : 86; + 045D : 71; + 045E : 85; + 045F : 72; + 0460 : 90; + 0461 : DA; + 0462 : CA; + 0463 : 10; + 0464 : 05; + 0465 : 20; + 0466 : D2; + 0467 : C9; + 0468 : A2; + 0469 : 00; + 046A : 20; + 046B : 79; + 046C : C4; + 046D : C9; + 046E : 0D; + 046F : F0; + 0470 : 05; + 0471 : 95; + 0472 : 0A; + 0473 : E8; + 0474 : D0; + 0475 : F4; + 0476 : 4C; + 0477 : C8; + 0478 : C9; + 0479 : 20; + 047A : CF; + 047B : FF; + 047C : A4; + 047D : 03; + 047E : D0; + 047F : 0C; + 0480 : C9; + 0481 : 0F; + 0482 : D0; + 0483 : 08; + 0484 : 48; + 0485 : A5; + 0486 : 64; + 0487 : 49; + 0488 : FF; + 0489 : 85; + 048A : 64; + 048B : 68; + 048C : 60; + 048D : A6; + 048E : C9; + 048F : A0; + 0490 : 04; + 0491 : 84; + 0492 : 60; + 0493 : B5; + 0494 : 00; + 0495 : 10; + 0496 : 07; + 0497 : C9; + 0498 : FF; + 0499 : F0; + 049A : 41; + 049B : E8; + 049C : D0; + 049D : F5; + 049E : C9; + 049F : 20; + 04A0 : F0; + 04A1 : 3A; + 04A2 : 85; + 04A3 : 5B; + 04A4 : C9; + 04A5 : 22; + 04A6 : F0; + 04A7 : 58; + 04A8 : 24; + 04A9 : 60; + 04AA : 70; + 04AB : 30; + 04AC : C9; + 04AD : 3F; + 04AE : D0; + 04AF : 04; + 04B0 : A9; + 04B1 : 99; + 04B2 : D0; + 04B3 : 28; + 04B4 : C9; + 04B5 : 30; + 04B6 : 90; + 04B7 : 04; + 04B8 : C9; + 04B9 : 3C; + 04BA : 90; + 04BB : 20; + 04BC : 84; + 04BD : C0; + 04BE : A0; + 04BF : 00; + 04C0 : 84; + 04C1 : 5C; + 04C2 : 88; + 04C3 : 86; + 04C4 : C9; + 04C5 : CA; + 04C6 : C8; + 04C7 : E8; + 04C8 : B5; + 04C9 : 00; + 04CA : C9; + 04CB : 20; + 04CC : F0; + 04CD : F9; + 04CE : 38; + 04CF : F9; + 04D0 : 92; + 04D1 : C0; + 04D2 : F0; + 04D3 : F2; + 04D4 : C9; + 04D5 : 80; + 04D6 : D0; + 04D7 : 2F; + 04D8 : 05; + 04D9 : 5C; + 04DA : A4; + 04DB : C0; + 04DC : E8; + 04DD : C8; + 04DE : 99; + 04DF : 05; + 04E0 : 00; + 04E1 : B9; + 04E2 : 05; + 04E3 : 00; + 04E4 : F0; + 04E5 : 34; + 04E6 : 38; + 04E7 : E9; + 04E8 : 3A; + 04E9 : F0; + 04EA : 04; + 04EB : C9; + 04EC : 49; + 04ED : D0; + 04EE : 02; + 04EF : 85; + 04F0 : 60; + 04F1 : 38; + 04F2 : E9; + 04F3 : 55; + 04F4 : D0; + 04F5 : 9D; + 04F6 : 85; + 04F7 : 5B; + 04F8 : B5; + 04F9 : 00; + 04FA : F0; + 04FB : E0; + 04FC : C5; + 04FD : 5B; + 04FE : F0; + 04FF : DC; + 0500 : C8; + 0501 : 99; + 0502 : 05; + 0503 : 00; + 0504 : E8; + 0505 : D0; + 0506 : F1; + 0507 : A6; + 0508 : C9; + 0509 : E6; + 050A : 5C; + 050B : C8; + 050C : B9; + 050D : 91; + 050E : C0; + 050F : 10; + 0510 : FA; + 0511 : B9; + 0512 : 92; + 0513 : C0; + 0514 : D0; + 0515 : B2; + 0516 : B5; + 0517 : 00; + 0518 : 10; + 0519 : C0; + 051A : 99; + 051B : 07; + 051C : 00; + 051D : A9; + 051E : 09; + 051F : 85; + 0520 : C9; + 0521 : 60; + 0522 : A5; + 0523 : 7A; + 0524 : A6; + 0525 : 7B; + 0526 : A0; + 0527 : 01; + 0528 : 85; + 0529 : AE; + 052A : 86; + 052B : AF; + 052C : B1; + 052D : AE; + 052E : F0; + 052F : 1F; + [0530..0531] : C8; + 0532 : A5; + 0533 : 09; + 0534 : D1; + 0535 : AE; + 0536 : 90; + 0537 : 18; + 0538 : F0; + 0539 : 03; + 053A : 88; + 053B : D0; + 053C : 09; + 053D : A5; + 053E : 08; + 053F : 88; + 0540 : D1; + 0541 : AE; + 0542 : 90; + 0543 : 0C; + 0544 : F0; + 0545 : 0A; + 0546 : 88; + 0547 : B1; + 0548 : AE; + 0549 : AA; + 054A : 88; + 054B : B1; + 054C : AE; + 054D : B0; + 054E : D7; + 054F : 18; + 0550 : 60; + 0551 : D0; + 0552 : FD; + 0553 : A9; + 0554 : 00; + 0555 : A8; + 0556 : 91; + 0557 : 7A; + 0558 : C8; + 0559 : 91; + 055A : 7A; + 055B : A5; + 055C : 7A; + 055D : 69; + 055E : 02; + 055F : 85; + 0560 : 7C; + 0561 : A5; + 0562 : 7B; + 0563 : 69; + 0564 : 00; + 0565 : 85; + 0566 : 7D; + 0567 : 20; + 0568 : 9A; + 0569 : C5; + 056A : A5; + 056B : 86; + 056C : A4; + 056D : 87; + 056E : 85; + 056F : 82; + 0570 : 84; + 0571 : 83; + 0572 : 20; + 0573 : E7; + 0574 : FF; + 0575 : A5; + 0576 : 7C; + 0577 : A4; + 0578 : 7D; + 0579 : 85; + 057A : 7E; + 057B : 84; + 057C : 7F; + 057D : 85; + 057E : 80; + 057F : 84; + 0580 : 81; + 0581 : 20; + 0582 : 0D; + 0583 : C7; + 0584 : A2; + 0585 : 68; + 0586 : 86; + 0587 : 65; + 0588 : 68; + 0589 : A8; + 058A : 68; + 058B : A2; + 058C : FE; + 058D : 9A; + 058E : 48; + 058F : 98; + 0590 : 48; + 0591 : A9; + 0592 : 00; + 0593 : 85; + 0594 : 8D; + 0595 : 85; + 0596 : 61; + 0597 : 60; + 0598 : 51; + 0599 : 60; + 059A : 18; + 059B : A5; + 059C : 7A; + 059D : 69; + 059E : FF; + 059F : 85; + 05A0 : C9; + 05A1 : A5; + 05A2 : 7B; + 05A3 : 69; + 05A4 : FF; + 05A5 : 85; + 05A6 : CA; + 05A7 : 60; + 05A8 : 90; + 05A9 : 06; + 05AA : F0; + 05AB : 04; + 05AC : C9; + 05AD : AB; + 05AE : D0; + 05AF : E9; + 05B0 : 20; + 05B1 : 63; + 05B2 : C8; + 05B3 : 20; + 05B4 : 22; + 05B5 : C5; + 05B6 : 20; + 05B7 : C8; + 05B8 : 00; + 05B9 : F0; + 05BA : 0C; + 05BB : C9; + 05BC : AB; + 05BD : D0; + 05BE : 91; + 05BF : 20; + 05C0 : C2; + 05C1 : 00; + 05C2 : 20; + 05C3 : 63; + 05C4 : C8; + 05C5 : D0; + 05C6 : 89; + [05C7..05C8] : 68; + 05C9 : A5; + 05CA : 08; + 05CB : 05; + 05CC : 09; + 05CD : D0; + 05CE : 06; + 05CF : A9; + 05D0 : FF; + 05D1 : 85; + 05D2 : 08; + 05D3 : 85; + 05D4 : 09; + 05D5 : A0; + 05D6 : 01; + 05D7 : 84; + 05D8 : 60; + 05D9 : B1; + 05DA : AE; + 05DB : F0; + 05DC : 41; + 05DD : 20; + 05DE : E1; + 05DF : FF; + 05E0 : 20; + 05E1 : D2; + 05E2 : C9; + 05E3 : C8; + 05E4 : B1; + 05E5 : AE; + 05E6 : AA; + 05E7 : C8; + 05E8 : B1; + 05E9 : AE; + 05EA : C5; + 05EB : 09; + 05EC : D0; + 05ED : 04; + 05EE : E4; + 05EF : 08; + 05F0 : F0; + 05F1 : 02; + 05F2 : B0; + 05F3 : 2A; + 05F4 : 84; + 05F5 : 98; + 05F6 : 20; + 05F7 : 9F; + 05F8 : DC; + 05F9 : A9; + 05FA : 20; + 05FB : A4; + 05FC : 98; + 05FD : 29; + 05FE : 7F; + 05FF : 20; + 0600 : 49; + 0601 : CA; + 0602 : C9; + 0603 : 22; + 0604 : D0; + 0605 : 06; + 0606 : A5; + 0607 : 60; + 0608 : 49; + 0609 : FF; + 060A : 85; + 060B : 60; + 060C : C8; + 060D : B1; + 060E : AE; + 060F : D0; + 0610 : 10; + 0611 : A8; + 0612 : B1; + 0613 : AE; + 0614 : AA; + 0615 : C8; + 0616 : B1; + 0617 : AE; + 0618 : 86; + 0619 : AE; + 061A : 85; + 061B : AF; + 061C : D0; + 061D : B7; + 061E : 4C; + 061F : 8B; + 0620 : C3; + 0621 : 10; + 0622 : DC; + 0623 : C9; + 0624 : FF; + 0625 : F0; + 0626 : D8; + 0627 : 24; + 0628 : 60; + 0629 : 30; + 062A : D4; + 062B : 38; + 062C : E9; + 062D : 7F; + 062E : AA; + 062F : 84; + 0630 : 98; + 0631 : A0; + 0632 : FF; + 0633 : CA; + 0634 : F0; + 0635 : 08; + 0636 : C8; + 0637 : B9; + 0638 : 92; + 0639 : C0; + 063A : 10; + 063B : FA; + 063C : 30; + 063D : F5; + 063E : C8; + 063F : B9; + 0640 : 92; + 0641 : C0; + 0642 : 30; + 0643 : B7; + 0644 : 20; + 0645 : 49; + 0646 : CA; + 0647 : D0; + 0648 : F5; + 0649 : A9; + 064A : 80; + 064B : 85; + 064C : 61; + 064D : 20; + 064E : 9D; + 064F : C8; + 0650 : 20; + 0651 : AC; + 0652 : C2; + 0653 : D0; + 0654 : 05; + 0655 : 8A; + 0656 : 69; + 0657 : 0F; + 0658 : AA; + 0659 : 9A; + [065A..065B] : 68; + 065C : A9; + 065D : 09; + 065E : 20; + 065F : 1D; + 0660 : C3; + 0661 : 20; + 0662 : FE; + 0663 : C7; + 0664 : 18; + 0665 : 98; + 0666 : 65; + 0667 : C9; + 0668 : 48; + 0669 : A5; + 066A : CA; + 066B : 69; + 066C : 00; + 066D : 48; + 066E : A5; + 066F : 89; + 0670 : 48; + 0671 : A5; + 0672 : 88; + 0673 : 48; + 0674 : A9; + 0675 : A4; + 0676 : 20; + 0677 : 13; + 0678 : CE; + 0679 : 20; + 067A : A7; + 067B : CC; + 067C : 20; + 067D : A4; + 067E : CC; + 067F : A5; + 0680 : B5; + 0681 : 09; + 0682 : 7F; + 0683 : 25; + 0684 : B1; + 0685 : 85; + 0686 : B1; + 0687 : A9; + 0688 : 92; + 0689 : A0; + 068A : C6; + 068B : 85; + 068C : 71; + 068D : 84; + 068E : 72; + 068F : 4C; + 0690 : 5D; + 0691 : CD; + 0692 : A9; + 0693 : 91; + 0694 : A0; + 0695 : D8; + 0696 : 20; + 0697 : 74; + 0698 : DA; + 0699 : 20; + 069A : C8; + 069B : 00; + 069C : C9; + 069D : A9; + 069E : D0; + 069F : 06; + 06A0 : 20; + 06A1 : C2; + 06A2 : 00; + 06A3 : 20; + 06A4 : A4; + 06A5 : CC; + 06A6 : 20; + 06A7 : FD; + 06A8 : DA; + 06A9 : 20; + 06AA : 52; + 06AB : CD; + 06AC : A5; + 06AD : 99; + 06AE : 48; + 06AF : A5; + 06B0 : 98; + 06B1 : 48; + 06B2 : A9; + 06B3 : 81; + 06B4 : 48; + 06B5 : 20; + 06B6 : E1; + 06B7 : FF; + 06B8 : A5; + 06B9 : C9; + 06BA : A4; + 06BB : CA; + 06BC : F0; + 06BD : 06; + 06BE : 85; + 06BF : 8C; + 06C0 : 84; + 06C1 : 8D; + 06C2 : A0; + 06C3 : 00; + 06C4 : B1; + 06C5 : C9; + 06C6 : F0; + 06C7 : 07; + 06C8 : C9; + 06C9 : 3A; + 06CA : F0; + 06CB : 1D; + 06CC : 4C; + 06CD : 1C; + 06CE : CE; + 06CF : A0; + 06D0 : 02; + 06D1 : B1; + 06D2 : C9; + 06D3 : 18; + 06D4 : F0; + 06D5 : 5F; + 06D6 : C8; + 06D7 : B1; + 06D8 : C9; + 06D9 : 85; + 06DA : 88; + 06DB : C8; + 06DC : B1; + 06DD : C9; + 06DE : 85; + 06DF : 89; + 06E0 : 98; + 06E1 : 65; + 06E2 : C9; + 06E3 : 85; + 06E4 : C9; + 06E5 : 90; + 06E6 : 02; + 06E7 : E6; + 06E8 : CA; + 06E9 : 20; + 06EA : C2; + 06EB : 00; + 06EC : 20; + 06ED : F2; + 06EE : C6; + 06EF : 4C; + 06F0 : B5; + 06F1 : C6; + 06F2 : F0; + 06F3 : 6A; + 06F4 : 38; + 06F5 : E9; + 06F6 : 80; + 06F7 : B0; + 06F8 : 03; + 06F9 : 4C; + 06FA : 9D; + 06FB : C8; + 06FC : C9; + 06FD : 23; + 06FE : B0; + 06FF : CC; + 0700 : 0A; + 0701 : A8; + 0702 : B9; + 0703 : 01; + 0704 : C0; + 0705 : 48; + 0706 : B9; + 0707 : 00; + 0708 : C0; + 0709 : 48; + 070A : 4C; + 070B : C2; + 070C : 00; + 070D : 38; + 070E : A5; + 070F : 7A; + 0710 : E9; + 0711 : 01; + 0712 : A4; + 0713 : 7B; + 0714 : B0; + 0715 : 01; + 0716 : 88; + 0717 : 85; + 0718 : 90; + 0719 : 84; + 071A : 91; + 071B : 60; + 071C : B0; + 071D : 01; + 071E : 18; + 071F : D0; + 0720 : 3D; + 0721 : A5; + 0722 : C9; + 0723 : A4; + 0724 : CA; + 0725 : F0; + 0726 : 0C; + 0727 : 85; + 0728 : 8C; + 0729 : 84; + 072A : 8D; + 072B : A5; + 072C : 88; + 072D : A4; + 072E : 89; + 072F : 85; + 0730 : 8A; + 0731 : 84; + 0732 : 8B; + [0733..0734] : 68; + 0735 : A9; + 0736 : A4; + 0737 : A0; + 0738 : C2; + 0739 : A2; + 073A : 00; + 073B : 86; + 073C : 64; + 073D : 90; + 073E : 03; + 073F : 4C; + 0740 : 80; + 0741 : C3; + 0742 : 4C; + 0743 : 8B; + 0744 : C3; + 0745 : D0; + 0746 : 17; + 0747 : A2; + 0748 : DF; + 0749 : A4; + 074A : 8D; + 074B : D0; + 074C : 03; + 074D : 4C; + 074E : 59; + 074F : C3; + 0750 : A5; + 0751 : 8C; + 0752 : 85; + 0753 : C9; + 0754 : 84; + 0755 : CA; + 0756 : A5; + 0757 : 8A; + 0758 : A4; + 0759 : 8B; + 075A : 85; + 075B : 88; + 075C : 84; + 075D : 89; + 075E : 60; + 075F : 20; + 0760 : 76; + 0761 : D6; + 0762 : D0; + 0763 : FA; + 0764 : E8; + 0765 : E0; + 0766 : 0A; + 0767 : B0; + 0768 : 04; + 0769 : CA; + 076A : 86; + 076B : 04; + 076C : 60; + 076D : 4C; + 076E : 30; + 076F : D1; + 0770 : D0; + 0771 : EC; + 0772 : 4C; + 0773 : 6A; + 0774 : C5; + 0775 : D0; + 0776 : 03; + 0777 : 4C; + 0778 : 67; + 0779 : C5; + 077A : 20; + 077B : 6A; + 077C : C5; + 077D : 4C; + 077E : 94; + 077F : C7; + 0780 : A9; + 0781 : 03; + 0782 : 20; + 0783 : 1D; + 0784 : C3; + 0785 : A5; + 0786 : CA; + 0787 : 48; + 0788 : A5; + 0789 : C9; + 078A : 48; + 078B : A5; + 078C : 89; + 078D : 48; + 078E : A5; + 078F : 88; + 0790 : 48; + 0791 : A9; + 0792 : 8D; + 0793 : 48; + 0794 : 20; + 0795 : C8; + 0796 : 00; + 0797 : 20; + 0798 : 9D; + 0799 : C7; + 079A : 4C; + 079B : B5; + 079C : C6; + 079D : 20; + 079E : 63; + 079F : C8; + 07A0 : 20; + 07A1 : 01; + 07A2 : C8; + 07A3 : A5; + 07A4 : 89; + 07A5 : C5; + 07A6 : 09; + 07A7 : B0; + 07A8 : 0B; + 07A9 : 98; + 07AA : 38; + 07AB : 65; + 07AC : C9; + 07AD : A6; + 07AE : CA; + 07AF : 90; + 07B0 : 07; + 07B1 : E8; + 07B2 : B0; + 07B3 : 04; + 07B4 : A5; + 07B5 : 7A; + 07B6 : A6; + 07B7 : 7B; + 07B8 : 20; + 07B9 : 26; + 07BA : C5; + 07BB : 90; + 07BC : 1E; + 07BD : A5; + 07BE : AE; + 07BF : E9; + 07C0 : 01; + 07C1 : 85; + 07C2 : C9; + 07C3 : A5; + 07C4 : AF; + 07C5 : E9; + 07C6 : 00; + 07C7 : 85; + 07C8 : CA; + 07C9 : 60; + 07CA : D0; + 07CB : FD; + 07CC : A9; + 07CD : FF; + 07CE : 85; + 07CF : 98; + 07D0 : 20; + 07D1 : AC; + 07D2 : C2; + 07D3 : 9A; + 07D4 : C9; + 07D5 : 8D; + 07D6 : F0; + 07D7 : 0B; + 07D8 : A2; + 07D9 : 16; + 07DA : 2C; + 07DB : A2; + 07DC : 5F; + 07DD : 4C; + 07DE : 59; + 07DF : C3; + 07E0 : 4C; + 07E1 : 1C; + 07E2 : CE; + [07E3..07E4] : 68; + 07E5 : 85; + 07E6 : 88; + 07E7 : 68; + 07E8 : 85; + 07E9 : 89; + 07EA : 68; + 07EB : 85; + 07EC : C9; + 07ED : 68; + 07EE : 85; + 07EF : CA; + 07F0 : 20; + 07F1 : FE; + 07F2 : C7; + 07F3 : 98; + 07F4 : 18; + 07F5 : 65; + 07F6 : C9; + 07F7 : 85; + 07F8 : C9; + 07F9 : 90; + 07FA : 02; + 07FB : E6; + 07FC : CA; + 07FD : 60; + 07FE : A2; + 07FF : 3A; + 0800 : 2C; + 0801 : A2; + 0802 : 00; + 0803 : 86; + 0804 : 5A; + 0805 : A0; + 0806 : 00; + 0807 : 84; + 0808 : 5B; + 0809 : A5; + 080A : 5B; + 080B : A6; + 080C : 5A; + 080D : 85; + 080E : 5A; + 080F : 86; + 0810 : 5B; + 0811 : B1; + 0812 : C9; + 0813 : F0; + 0814 : E8; + 0815 : C5; + 0816 : 5B; + 0817 : F0; + 0818 : E4; + 0819 : C8; + 081A : C9; + 081B : 22; + 081C : F0; + 081D : EB; + 081E : D0; + 081F : F1; + 0820 : 20; + 0821 : B8; + 0822 : CC; + 0823 : 20; + 0824 : C8; + 0825 : 00; + 0826 : C9; + 0827 : 89; + 0828 : F0; + 0829 : 05; + 082A : A9; + 082B : A7; + 082C : 20; + 082D : 13; + 082E : CE; + 082F : A5; + 0830 : B0; + 0831 : D0; + 0832 : 05; + 0833 : 20; + 0834 : 01; + 0835 : C8; + 0836 : F0; + 0837 : BB; + 0838 : 20; + 0839 : C8; + 083A : 00; + 083B : B0; + 083C : 03; + 083D : 4C; + 083E : 9D; + 083F : C7; + 0840 : 4C; + 0841 : F2; + 0842 : C6; + 0843 : 20; + 0844 : 76; + 0845 : D6; + 0846 : 48; + 0847 : C9; + 0848 : 8D; + 0849 : F0; + 084A : 04; + 084B : C9; + 084C : 89; + 084D : D0; + 084E : 91; + 084F : C6; + 0850 : B4; + 0851 : D0; + 0852 : 04; + 0853 : 68; + 0854 : 4C; + 0855 : F5; + 0856 : C6; + 0857 : 20; + 0858 : C2; + 0859 : 00; + 085A : 20; + 085B : 63; + 085C : C8; + 085D : C9; + 085E : 2C; + 085F : F0; + 0860 : EE; + 0861 : 68; + 0862 : 60; + 0863 : A2; + 0864 : 00; + 0865 : 86; + 0866 : 08; + 0867 : 86; + 0868 : 09; + 0869 : B0; + 086A : F7; + 086B : E9; + 086C : 2F; + 086D : 85; + 086E : 5A; + 086F : A5; + 0870 : 09; + 0871 : 85; + 0872 : 71; + 0873 : C9; + 0874 : 19; + 0875 : B0; + 0876 : D4; + 0877 : A5; + 0878 : 08; + 0879 : 0A; + 087A : 26; + 087B : 71; + 087C : 0A; + 087D : 26; + 087E : 71; + 087F : 65; + 0880 : 08; + 0881 : 85; + 0882 : 08; + 0883 : A5; + 0884 : 71; + 0885 : 65; + 0886 : 09; + 0887 : 85; + 0888 : 09; + 0889 : 06; + 088A : 08; + 088B : 26; + 088C : 09; + 088D : A5; + 088E : 08; + 088F : 65; + 0890 : 5A; + 0891 : 85; + 0892 : 08; + 0893 : 90; + 0894 : 02; + 0895 : E6; + 0896 : 09; + 0897 : 20; + 0898 : C2; + 0899 : 00; + 089A : 4C; + 089B : 69; + 089C : C8; + 089D : 20; + 089E : 7B; + 089F : CF; + 08A0 : 85; + 08A1 : 98; + 08A2 : 84; + 08A3 : 99; + 08A4 : A9; + 08A5 : B2; + 08A6 : 20; + 08A7 : 13; + 08A8 : CE; + 08A9 : A5; + 08AA : 5F; + 08AB : 48; + 08AC : A5; + 08AD : 5E; + 08AE : 48; + 08AF : 20; + 08B0 : B8; + 08B1 : CC; + 08B2 : 68; + 08B3 : 2A; + 08B4 : 20; + 08B5 : AA; + 08B6 : CC; + 08B7 : D0; + 08B8 : 18; + 08B9 : 68; + 08BA : 10; + 08BB : 12; + 08BC : 20; + 08BD : ED; + 08BE : DA; + 08BF : 20; + 08C0 : A7; + 08C1 : D0; + 08C2 : A0; + 08C3 : 00; + 08C4 : A5; + 08C5 : B3; + 08C6 : 91; + 08C7 : 98; + 08C8 : C8; + 08C9 : A5; + 08CA : B4; + 08CB : 91; + 08CC : 98; + 08CD : 60; + 08CE : 4C; + 08CF : A2; + 08D0 : DA; + 08D1 : 68; + 08D2 : A4; + 08D3 : 99; + 08D4 : C0; + [08D5..08D6] : D0; + 08D7 : 53; + 08D8 : 20; + 08D9 : 7E; + 08DA : D5; + 08DB : C9; + 08DC : 06; + 08DD : F0; + 08DE : 03; + 08DF : 4C; + 08E0 : 30; + 08E1 : D1; + 08E2 : A0; + 08E3 : 00; + 08E4 : 84; + 08E5 : B0; + 08E6 : 84; + 08E7 : B5; + 08E8 : 84; + 08E9 : C0; + 08EA : 20; + 08EB : 1C; + 08EC : C9; + 08ED : 20; + 08EE : B4; + 08EF : D9; + 08F0 : E6; + 08F1 : C0; + 08F2 : A4; + 08F3 : C0; + 08F4 : 20; + 08F5 : 1C; + 08F6 : C9; + 08F7 : 20; + 08F8 : DE; + 08F9 : DA; + 08FA : AA; + 08FB : F0; + 08FC : 05; + 08FD : E8; + 08FE : 8A; + 08FF : 20; + 0900 : BF; + 0901 : D9; + 0902 : A4; + 0903 : C0; + 0904 : C8; + 0905 : C0; + 0906 : 06; + 0907 : D0; + 0908 : DF; + 0909 : 20; + 090A : B4; + 090B : D9; + 090C : 20; + 090D : 6D; + 090E : DB; + 090F : A2; + 0910 : 02; + 0911 : 78; + 0912 : B5; + 0913 : B2; + 0914 : 9D; + 0915 : 00; + 0916 : 02; + 0917 : CA; + 0918 : 10; + 0919 : F8; + 091A : 58; + 091B : 60; + 091C : B1; + 091D : 71; + 091E : 20; + 091F : CF; + 0920 : 00; + 0921 : 90; + 0922 : 03; + 0923 : 4C; + 0924 : 30; + 0925 : D1; + 0926 : E9; + 0927 : 2F; + 0928 : 4C; + 0929 : 50; + 092A : DC; + 092B : A0; + 092C : 02; + 092D : B1; + 092E : B3; + 092F : C5; + 0930 : 83; + 0931 : 90; + 0932 : 17; + 0933 : D0; + 0934 : 07; + 0935 : 88; + 0936 : B1; + 0937 : B3; + 0938 : C5; + 0939 : 82; + 093A : 90; + 093B : 0E; + 093C : A4; + 093D : B4; + 093E : C4; + 093F : 7D; + 0940 : 90; + 0941 : 08; + 0942 : D0; + 0943 : 0D; + 0944 : A5; + 0945 : B3; + 0946 : C5; + 0947 : 7C; + 0948 : B0; + 0949 : 07; + 094A : A5; + 094B : B3; + 094C : A4; + 094D : B4; + 094E : 4C; + 094F : 67; + 0950 : C9; + 0951 : A0; + 0952 : 00; + 0953 : B1; + 0954 : B3; + 0955 : 20; + 0956 : 59; + 0957 : D3; + 0958 : A5; + 0959 : 9F; + 095A : A4; + 095B : A0; + 095C : 85; + 095D : BE; + 095E : 84; + 095F : BF; + 0960 : 20; + 0961 : 52; + 0962 : D5; + 0963 : A9; + 0964 : B0; + 0965 : A0; + 0966 : 00; + 0967 : 85; + 0968 : 9F; + 0969 : 84; + 096A : A0; + 096B : 20; + 096C : B3; + 096D : D5; + 096E : A0; + 096F : 00; + 0970 : B1; + 0971 : 9F; + 0972 : 91; + 0973 : 98; + 0974 : C8; + 0975 : B1; + 0976 : 9F; + 0977 : 91; + 0978 : 98; + 0979 : C8; + 097A : B1; + 097B : 9F; + 097C : 91; + 097D : 98; + 097E : 60; + 097F : 20; + 0980 : 85; + 0981 : C9; + 0982 : 4C; + 0983 : D6; + 0984 : CA; + 0985 : 20; + 0986 : 76; + 0987 : D6; + 0988 : F0; + 0989 : 05; + 098A : A9; + 098B : 2C; + 098C : 20; + 098D : 13; + 098E : CE; + 098F : 08; + 0990 : 20; + 0991 : C9; + 0992 : FF; + 0993 : 86; + 0994 : 03; + 0995 : 28; + 0996 : 4C; + 0997 : 9F; + 0998 : C9; + 0999 : 20; + 099A : 2A; + 099B : CA; + 099C : 20; + 099D : C8; + 099E : 00; + 099F : F0; + 09A0 : 31; + 09A1 : F0; + 09A2 : 55; + 09A3 : C9; + 09A4 : A3; + 09A5 : F0; + 09A6 : 5F; + 09A7 : C9; + 09A8 : A6; + 09A9 : F0; + 09AA : 5B; + 09AB : C9; + 09AC : 2C; + 09AD : F0; + 09AE : 4A; + 09AF : C9; + 09B0 : 3B; + 09B1 : F0; + 09B2 : 6E; + 09B3 : 20; + 09B4 : B8; + 09B5 : CC; + 09B6 : 24; + 09B7 : 5E; + 09B8 : 30; + 09B9 : DF; + 09BA : 20; + 09BB : AF; + 09BC : DC; + 09BD : 20; + 09BE : 6B; + 09BF : D3; + 09C0 : 20; + 09C1 : 2A; + 09C2 : CA; + 09C3 : 20; + 09C4 : 44; + 09C5 : CA; + 09C6 : D0; + 09C7 : D4; + 09C8 : A0; + 09C9 : 00; + 09CA : 94; + 09CB : 0A; + 09CC : A2; + 09CD : 09; + 09CE : A5; + 09CF : 03; + 09D0 : D0; + 09D1 : 26; + 09D2 : A5; + 09D3 : 03; + 09D4 : D0; + 09D5 : 02; + 09D6 : 85; + 09D7 : 05; + 09D8 : A9; + 09D9 : 0D; + 09DA : 20; + 09DB : 49; + 09DC : CA; + 09DD : A9; + 09DE : 0A; + 09DF : 20; + 09E0 : 49; + 09E1 : CA; + 09E2 : A5; + 09E3 : 03; + 09E4 : D0; + 09E5 : 12; + 09E6 : 8A; + 09E7 : 48; + 09E8 : A6; + 09E9 : 04; + 09EA : F0; + 09EB : 08; + 09EC : A9; + 09ED : 00; + 09EE : 20; + 09EF : 49; + [09F0..09F1] : CA; + 09F2 : D0; + 09F3 : FA; + 09F4 : 86; + 09F5 : 05; + 09F6 : 68; + 09F7 : AA; + 09F8 : 60; + 09F9 : A5; + 09FA : 05; + 09FB : 38; + 09FC : E9; + 09FD : 0A; + 09FE : B0; + 09FF : FC; + 0A00 : 49; + 0A01 : FF; + 0A02 : 69; + 0A03 : 01; + 0A04 : D0; + 0A05 : 14; + 0A06 : 48; + 0A07 : 20; + 0A08 : 73; + 0A09 : D6; + 0A0A : C9; + 0A0B : 29; + 0A0C : D0; + 0A0D : 75; + 0A0E : 68; + 0A0F : C9; + 0A10 : A3; + 0A11 : D0; + 0A12 : 08; + 0A13 : 8A; + 0A14 : E5; + 0A15 : 05; + 0A16 : 90; + 0A17 : 09; + 0A18 : F0; + 0A19 : 07; + 0A1A : AA; + 0A1B : 20; + 0A1C : 44; + [0A1D..0A1E] : CA; + 0A1F : D0; + 0A20 : FA; + 0A21 : 20; + 0A22 : C2; + 0A23 : 00; + 0A24 : 4C; + 0A25 : A1; + 0A26 : C9; + 0A27 : 20; + 0A28 : 6B; + 0A29 : D3; + 0A2A : 20; + 0A2B : 7E; + 0A2C : D5; + 0A2D : AA; + 0A2E : A0; + 0A2F : 00; + 0A30 : E8; + 0A31 : CA; + 0A32 : F0; + 0A33 : C4; + 0A34 : B1; + 0A35 : 71; + 0A36 : 20; + 0A37 : 49; + 0A38 : CA; + 0A39 : C8; + 0A3A : C9; + 0A3B : 0D; + 0A3C : D0; + 0A3D : F3; + 0A3E : 20; + 0A3F : E2; + 0A40 : C9; + 0A41 : 4C; + 0A42 : 31; + 0A43 : CA; + 0A44 : A9; + 0A45 : 1D; + 0A46 : 2C; + 0A47 : A9; + 0A48 : 3F; + 0A49 : 24; + 0A4A : 64; + 0A4B : 30; + 0A4C : 27; + 0A4D : 48; + 0A4E : C9; + 0A4F : 1D; + 0A50 : F0; + 0A51 : 18; + 0A52 : C9; + 0A53 : 9D; + 0A54 : F0; + 0A55 : 04; + 0A56 : C9; + 0A57 : 14; + 0A58 : D0; + 0A59 : 0A; + 0A5A : A5; + 0A5B : 05; + 0A5C : F0; + 0A5D : 12; + 0A5E : A5; + 0A5F : 03; + 0A60 : D0; + 0A61 : 0E; + 0A62 : C6; + 0A63 : 05; + 0A64 : 29; + 0A65 : 7F; + 0A66 : C9; + 0A67 : 20; + 0A68 : 90; + 0A69 : 06; + 0A6A : A5; + 0A6B : 03; + 0A6C : 20; + 0A6D : CC; + 0A6E : E1; + 0A6F : EA; + 0A70 : 68; + 0A71 : 20; + 0A72 : D2; + 0A73 : FF; + 0A74 : 29; + 0A75 : FF; + 0A76 : 60; + 0A77 : A5; + 0A78 : 62; + 0A79 : F0; + 0A7A : 0B; + 0A7B : 20; + 0A7C : C2; + 0A7D : E1; + 0A7E : EA; + 0A7F : 85; + 0A80 : 88; + 0A81 : 84; + 0A82 : 89; + 0A83 : 4C; + 0A84 : 1C; + 0A85 : CE; + 0A86 : A5; + 0A87 : 03; + 0A88 : F0; + 0A89 : 05; + 0A8A : A2; + 0A8B : C4; + 0A8C : 4C; + 0A8D : 59; + 0A8E : C3; + 0A8F : A9; + 0A90 : 23; + 0A91 : A0; + 0A92 : CC; + 0A93 : 20; + 0A94 : 27; + 0A95 : CA; + 0A96 : A5; + 0A97 : 8C; + 0A98 : A4; + 0A99 : 8D; + 0A9A : 85; + 0A9B : C9; + 0A9C : 84; + 0A9D : CA; + 0A9E : 60; + 0A9F : 20; + 0AA0 : 8B; + 0AA1 : D2; + 0AA2 : C9; + 0AA3 : 23; + 0AA4 : D0; + 0AA5 : 10; + 0AA6 : 20; + 0AA7 : C2; + 0AA8 : 00; + 0AA9 : 20; + 0AAA : 76; + 0AAB : D6; + 0AAC : A9; + 0AAD : 2C; + 0AAE : 20; + 0AAF : 13; + 0AB0 : CE; + 0AB1 : 20; + 0AB2 : C6; + 0AB3 : FF; + 0AB4 : 86; + 0AB5 : 03; + 0AB6 : A2; + 0AB7 : 0B; + 0AB8 : A0; + 0AB9 : 00; + 0ABA : 84; + 0ABB : 0B; + 0ABC : A9; + 0ABD : 40; + 0ABE : 20; + 0ABF : 2A; + 0AC0 : CB; + 0AC1 : A6; + 0AC2 : 03; + 0AC3 : D0; + 0AC4 : 13; + 0AC5 : 60; + 0AC6 : 20; + 0AC7 : 76; + 0AC8 : D6; + 0AC9 : A9; + 0ACA : 2C; + 0ACB : 20; + 0ACC : 13; + 0ACD : CE; + 0ACE : 20; + 0ACF : C6; + 0AD0 : FF; + 0AD1 : 86; + 0AD2 : 03; + 0AD3 : 20; + 0AD4 : F1; + 0AD5 : CA; + 0AD6 : A5; + 0AD7 : 03; + 0AD8 : 20; + 0AD9 : CC; + 0ADA : FF; + 0ADB : A2; + 0ADC : 00; + 0ADD : 86; + 0ADE : 03; + 0ADF : 60; + 0AE0 : 46; + 0AE1 : 64; + 0AE2 : C9; + 0AE3 : 22; + 0AE4 : D0; + 0AE5 : 0B; + 0AE6 : 20; + 0AE7 : D1; + 0AE8 : CD; + 0AE9 : A9; + 0AEA : 3B; + 0AEB : 20; + 0AEC : 13; + 0AED : CE; + 0AEE : 20; + 0AEF : 2A; + 0AF0 : CA; + 0AF1 : 20; + 0AF2 : 8B; + 0AF3 : D2; + 0AF4 : A9; + 0AF5 : 2C; + 0AF6 : 85; + 0AF7 : 09; + 0AF8 : 20; + 0AF9 : 17; + 0AFA : CB; + 0AFB : A5; + 0AFC : 03; + 0AFD : F0; + 0AFE : 0D; + 0AFF : AD; + 0B00 : 0C; + 0B01 : 02; + 0B02 : 29; + 0B03 : 02; + 0B04 : F0; + 0B05 : 06; + 0B06 : 20; + 0B07 : D6; + 0B08 : CA; + 0B09 : 4C; + 0B0A : F0; + 0B0B : C7; + 0B0C : A5; + 0B0D : 0A; + 0B0E : D0; + 0B0F : 19; + 0B10 : A5; + 0B11 : 03; + 0B12 : D0; + 0B13 : E4; + 0B14 : 4C; + 0B15 : 9B; + 0B16 : E1; + 0B17 : A5; + 0B18 : 03; + 0B19 : D0; + 0B1A : 06; + 0B1B : 20; + 0B1C : 47; + 0B1D : CA; + 0B1E : 20; + 0B1F : 44; + 0B20 : CA; + 0B21 : 4C; + 0B22 : 68; + 0B23 : C4; + 0B24 : A6; + 0B25 : 90; + 0B26 : A4; + 0B27 : 91; + 0B28 : A9; + 0B29 : 98; + 0B2A : 85; + 0B2B : 62; + 0B2C : 86; + 0B2D : 92; + 0B2E : 84; + 0B2F : 93; + 0B30 : 20; + 0B31 : 7B; + 0B32 : CF; + 0B33 : 85; + 0B34 : 98; + 0B35 : 84; + 0B36 : 99; + 0B37 : A5; + 0B38 : C9; + 0B39 : A4; + 0B3A : CA; + 0B3B : 85; + 0B3C : 08; + 0B3D : 84; + 0B3E : 09; + 0B3F : A6; + 0B40 : 92; + 0B41 : A4; + 0B42 : 93; + 0B43 : 86; + 0B44 : C9; + 0B45 : 84; + 0B46 : CA; + 0B47 : 20; + 0B48 : C8; + 0B49 : 00; + 0B4A : D0; + 0B4B : 1F; + 0B4C : 24; + 0B4D : 62; + 0B4E : 50; + 0B4F : 0B; + 0B50 : 20; + 0B51 : E4; + 0B52 : FF; + 0B53 : 85; + 0B54 : 0A; + 0B55 : A0; + 0B56 : 00; + 0B57 : A2; + 0B58 : 09; + 0B59 : D0; + 0B5A : 0C; + 0B5B : 30; + 0B5C : 72; + 0B5D : A5; + 0B5E : 03; + 0B5F : D0; + 0B60 : 03; + 0B61 : 20; + 0B62 : 47; + 0B63 : CA; + 0B64 : 20; + 0B65 : 17; + 0B66 : CB; + 0B67 : 86; + 0B68 : C9; + 0B69 : 84; + 0B6A : CA; + 0B6B : 20; + 0B6C : C2; + 0B6D : 00; + 0B6E : 24; + 0B6F : 5E; + 0B70 : 10; + 0B71 : 2E; + 0B72 : 24; + 0B73 : 62; + 0B74 : 50; + 0B75 : 06; + 0B76 : A9; + 0B77 : 00; + 0B78 : 20; + 0B79 : BC; + 0B7A : E1; + 0B7B : EA; + 0B7C : 85; + 0B7D : 5A; + 0B7E : C9; + 0B7F : 22; + 0B80 : F0; + 0B81 : 07; + 0B82 : A9; + 0B83 : 3A; + 0B84 : 85; + 0B85 : 5A; + 0B86 : A9; + 0B87 : 2C; + 0B88 : 18; + 0B89 : 85; + 0B8A : 5B; + 0B8B : A5; + 0B8C : C9; + 0B8D : A4; + 0B8E : CA; + 0B8F : 69; + 0B90 : 00; + 0B91 : 90; + 0B92 : 01; + 0B93 : C8; + 0B94 : 20; + 0B95 : 71; + 0B96 : D3; + 0B97 : 20; + 0B98 : BB; + 0B99 : D6; + 0B9A : 20; + 0B9B : D2; + 0B9C : C8; + 0B9D : 4C; + 0B9E : A8; + 0B9F : CB; + 0BA0 : 20; + 0BA1 : C5; + 0BA2 : DB; + 0BA3 : A5; + 0BA4 : 5F; + 0BA5 : 20; + 0BA6 : BA; + 0BA7 : C8; + 0BA8 : 20; + 0BA9 : C8; + 0BAA : 00; + 0BAB : F0; + 0BAC : 07; + 0BAD : C9; + 0BAE : 2C; + 0BAF : F0; + 0BB0 : 03; + 0BB1 : 4C; + 0BB2 : 77; + 0BB3 : CA; + 0BB4 : A5; + 0BB5 : C9; + 0BB6 : A4; + 0BB7 : CA; + 0BB8 : 85; + 0BB9 : 92; + 0BBA : 84; + 0BBB : 93; + 0BBC : A5; + 0BBD : 08; + 0BBE : A4; + 0BBF : 09; + 0BC0 : 85; + 0BC1 : C9; + 0BC2 : 84; + 0BC3 : CA; + 0BC4 : 20; + 0BC5 : C8; + 0BC6 : 00; + 0BC7 : F0; + 0BC8 : 2C; + 0BC9 : 20; + 0BCA : 11; + 0BCB : CE; + 0BCC : 4C; + 0BCD : 30; + 0BCE : CB; + 0BCF : 20; + 0BD0 : FE; + 0BD1 : C7; + 0BD2 : C8; + 0BD3 : AA; + 0BD4 : D0; + 0BD5 : 12; + 0BD6 : A2; + 0BD7 : 2A; + 0BD8 : C8; + 0BD9 : B1; + 0BDA : C9; + 0BDB : F0; + 0BDC : 6D; + 0BDD : C8; + 0BDE : B1; + 0BDF : C9; + 0BE0 : 85; + 0BE1 : 8E; + 0BE2 : C8; + 0BE3 : B1; + 0BE4 : C9; + 0BE5 : C8; + 0BE6 : 85; + 0BE7 : 8F; + 0BE8 : B1; + 0BE9 : C9; + 0BEA : AA; + 0BEB : 20; + 0BEC : F3; + 0BED : C7; + 0BEE : E0; + 0BEF : 83; + 0BF0 : D0; + 0BF1 : DD; + 0BF2 : 4C; + 0BF3 : 6B; + 0BF4 : CB; + 0BF5 : A5; + 0BF6 : 92; + 0BF7 : A4; + 0BF8 : 93; + 0BF9 : A6; + 0BFA : 62; + 0BFB : 10; + 0BFC : 03; + 0BFD : 4C; + 0BFE : 17; + 0BFF : C7; + 0C00 : A0; + 0C01 : 00; + 0C02 : B1; + 0C03 : 92; + 0C04 : F0; + 0C05 : 0B; + 0C06 : A5; + 0C07 : 03; + 0C08 : D0; + 0C09 : 07; + 0C0A : A9; + 0C0B : 12; + 0C0C : A0; + 0C0D : CC; + 0C0E : 4C; + 0C0F : 27; + 0C10 : CA; + 0C11 : 60; + 0C12 : 3F; + 0C13 : 45; + 0C14 : 58; + 0C15 : 54; + 0C16 : 52; + 0C17 : 41; + 0C18 : 20; + 0C19 : 49; + 0C1A : 47; + 0C1B : 4E; + 0C1C : 4F; + 0C1D : 52; + 0C1E : 45; + 0C1F : 44; + 0C20 : 0D; + 0C21 : 0A; + 0C22 : 00; + 0C23 : 3F; + 0C24 : 52; + 0C25 : 45; + 0C26 : 44; + 0C27 : 4F; + 0C28 : 20; + 0C29 : 46; + 0C2A : 52; + 0C2B : 4F; + 0C2C : 4D; + 0C2D : 20; + 0C2E : 53; + 0C2F : 54; + 0C30 : 41; + 0C31 : 52; + 0C32 : 54; + 0C33 : 0D; + 0C34 : 0A; + 0C35 : 00; + 0C36 : D0; + 0C37 : 04; + 0C38 : A0; + 0C39 : 00; + 0C3A : F0; + 0C3B : 03; + 0C3C : 20; + 0C3D : 7B; + 0C3E : CF; + 0C3F : 85; + 0C40 : 98; + 0C41 : 84; + 0C42 : 99; + 0C43 : 20; + 0C44 : AC; + 0C45 : C2; + 0C46 : F0; + 0C47 : 04; + 0C48 : A2; + 0C49 : 00; + 0C4A : F0; + 0C4B : 69; + 0C4C : 9A; + [0C4D..0C50] : E8; + 0C51 : 8A; + [0C52..0C57] : E8; + 0C58 : 86; + 0C59 : 73; + 0C5A : A0; + 0C5B : 01; + 0C5C : 20; + 0C5D : 74; + 0C5E : DA; + 0C5F : BA; + 0C60 : BD; + 0C61 : 09; + 0C62 : 01; + 0C63 : 85; + 0C64 : B5; + 0C65 : A5; + 0C66 : 98; + 0C67 : A4; + 0C68 : 99; + 0C69 : 20; + 0C6A : 3C; + 0C6B : D7; + 0C6C : 20; + 0C6D : A2; + 0C6E : DA; + 0C6F : A0; + 0C70 : 01; + 0C71 : 20; + 0C72 : 2F; + 0C73 : DB; + 0C74 : BA; + 0C75 : 38; + 0C76 : FD; + 0C77 : 09; + 0C78 : 01; + 0C79 : F0; + 0C7A : 17; + 0C7B : BD; + 0C7C : 0F; + 0C7D : 01; + 0C7E : 85; + 0C7F : 88; + 0C80 : BD; + 0C81 : 10; + 0C82 : 01; + 0C83 : 85; + 0C84 : 89; + 0C85 : BD; + 0C86 : 12; + 0C87 : 01; + 0C88 : 85; + 0C89 : C9; + 0C8A : BD; + 0C8B : 11; + 0C8C : 01; + 0C8D : 85; + 0C8E : CA; + 0C8F : 4C; + 0C90 : B5; + 0C91 : C6; + 0C92 : 8A; + 0C93 : 69; + 0C94 : 11; + 0C95 : AA; + 0C96 : 9A; + 0C97 : 20; + 0C98 : C8; + 0C99 : 00; + 0C9A : C9; + 0C9B : 2C; + 0C9C : D0; + 0C9D : F1; + 0C9E : 20; + 0C9F : C2; + 0CA0 : 00; + 0CA1 : 20; + 0CA2 : 3C; + 0CA3 : CC; + 0CA4 : 20; + 0CA5 : B8; + 0CA6 : CC; + 0CA7 : 18; + 0CA8 : 24; + 0CA9 : 38; + 0CAA : 24; + 0CAB : 5E; + 0CAC : 30; + 0CAD : 03; + 0CAE : B0; + 0CAF : 03; + 0CB0 : 60; + 0CB1 : B0; + 0CB2 : FD; + 0CB3 : A2; + 0CB4 : A8; + 0CB5 : 4C; + 0CB6 : 59; + 0CB7 : C3; + 0CB8 : A6; + 0CB9 : C9; + 0CBA : D0; + 0CBB : 02; + 0CBC : C6; + 0CBD : CA; + 0CBE : C6; + 0CBF : C9; + 0CC0 : A2; + 0CC1 : 00; + 0CC2 : 24; + 0CC3 : 48; + 0CC4 : 8A; + 0CC5 : 48; + 0CC6 : A9; + 0CC7 : 01; + 0CC8 : 20; + 0CC9 : 1D; + 0CCA : C3; + 0CCB : 20; + 0CCC : 9D; + 0CCD : CD; + 0CCE : A9; + 0CCF : 00; + 0CD0 : 85; + 0CD1 : 9C; + 0CD2 : 20; + 0CD3 : C8; + 0CD4 : 00; + 0CD5 : 38; + 0CD6 : E9; + 0CD7 : B1; + 0CD8 : 90; + 0CD9 : 17; + 0CDA : C9; + 0CDB : 03; + 0CDC : B0; + 0CDD : 13; + 0CDE : C9; + 0CDF : 01; + 0CE0 : 2A; + 0CE1 : 49; + 0CE2 : 01; + 0CE3 : 45; + 0CE4 : 9C; + 0CE5 : C5; + 0CE6 : 9C; + 0CE7 : 90; + 0CE8 : 61; + 0CE9 : 85; + 0CEA : 9C; + 0CEB : 20; + 0CEC : C2; + 0CED : 00; + 0CEE : 4C; + 0CEF : D5; + 0CF0 : CC; + 0CF1 : A6; + 0CF2 : 9C; + 0CF3 : D0; + 0CF4 : 2C; + 0CF5 : B0; + 0CF6 : 7B; + 0CF7 : 69; + 0CF8 : 07; + 0CF9 : 90; + 0CFA : 77; + 0CFB : 65; + 0CFC : 5E; + 0CFD : D0; + 0CFE : 03; + 0CFF : 4C; + 0D00 : 15; + 0D01 : D5; + 0D02 : 69; + 0D03 : FF; + 0D04 : 85; + 0D05 : 71; + 0D06 : 0A; + 0D07 : 65; + 0D08 : 71; + 0D09 : A8; + 0D0A : 68; + 0D0B : D9; + 0D0C : 74; + 0D0D : C0; + 0D0E : B0; + 0D0F : 67; + 0D10 : 20; + 0D11 : A7; + 0D12 : CC; + 0D13 : 48; + 0D14 : 20; + 0D15 : 3A; + 0D16 : CD; + 0D17 : 68; + 0D18 : A4; + 0D19 : 9A; + 0D1A : 10; + 0D1B : 17; + 0D1C : AA; + 0D1D : F0; + 0D1E : 56; + 0D1F : D0; + 0D20 : 5F; + 0D21 : 46; + 0D22 : 5E; + 0D23 : 8A; + 0D24 : 2A; + 0D25 : A6; + 0D26 : C9; + 0D27 : D0; + 0D28 : 02; + 0D29 : C6; + 0D2A : CA; + 0D2B : C6; + 0D2C : C9; + 0D2D : A0; + 0D2E : 1B; + 0D2F : 85; + 0D30 : 9C; + 0D31 : D0; + 0D32 : D7; + 0D33 : D9; + 0D34 : 74; + 0D35 : C0; + 0D36 : B0; + 0D37 : 48; + 0D38 : 90; + 0D39 : D9; + 0D3A : B9; + 0D3B : 76; + 0D3C : C0; + 0D3D : 48; + 0D3E : B9; + 0D3F : 75; + 0D40 : C0; + 0D41 : 48; + 0D42 : 20; + 0D43 : 4D; + 0D44 : CD; + 0D45 : A5; + 0D46 : 9C; + 0D47 : 4C; + 0D48 : C3; + 0D49 : CC; + 0D4A : 4C; + 0D4B : 1C; + 0D4C : CE; + 0D4D : A5; + 0D4E : B5; + 0D4F : BE; + 0D50 : 74; + 0D51 : C0; + 0D52 : A8; + 0D53 : 68; + 0D54 : 85; + 0D55 : 71; + 0D56 : E6; + 0D57 : 71; + 0D58 : 68; + 0D59 : 85; + 0D5A : 72; + 0D5B : 98; + 0D5C : 48; + 0D5D : 20; + 0D5E : ED; + 0D5F : DA; + 0D60 : A5; + 0D61 : B4; + 0D62 : 48; + 0D63 : A5; + 0D64 : B3; + 0D65 : 48; + 0D66 : A5; + 0D67 : B2; + 0D68 : 48; + 0D69 : A5; + 0D6A : B1; + 0D6B : 48; + 0D6C : A5; + 0D6D : B0; + 0D6E : 48; + 0D6F : 6C; + 0D70 : 71; + 0D71 : 00; + 0D72 : A0; + 0D73 : FF; + 0D74 : 68; + 0D75 : F0; + 0D76 : 23; + 0D77 : C9; + 0D78 : 64; + 0D79 : F0; + 0D7A : 03; + 0D7B : 20; + 0D7C : A7; + 0D7D : CC; + 0D7E : 84; + 0D7F : 9A; + 0D80 : 68; + 0D81 : 4A; + 0D82 : 85; + 0D83 : 63; + 0D84 : 68; + 0D85 : 85; + 0D86 : B8; + 0D87 : 68; + 0D88 : 85; + 0D89 : B9; + 0D8A : 68; + 0D8B : 85; + 0D8C : BA; + 0D8D : 68; + 0D8E : 85; + 0D8F : BB; + 0D90 : 68; + 0D91 : 85; + 0D92 : BC; + 0D93 : 68; + 0D94 : 85; + 0D95 : BD; + 0D96 : 45; + 0D97 : B5; + 0D98 : 85; + 0D99 : BE; + 0D9A : A5; + 0D9B : B0; + 0D9C : 60; + 0D9D : A9; + 0D9E : 00; + 0D9F : 85; + 0DA0 : 5E; + 0DA1 : 20; + 0DA2 : C2; + 0DA3 : 00; + 0DA4 : B0; + 0DA5 : 03; + 0DA6 : 4C; + 0DA7 : C5; + 0DA8 : DB; + 0DA9 : 20; + 0DAA : 05; + 0DAB : D0; + 0DAC : B0; + 0DAD : 7A; + 0DAE : C9; + 0DAF : FF; + 0DB0 : D0; + 0DB1 : 0F; + 0DB2 : A9; + 0DB3 : BC; + 0DB4 : A0; + 0DB5 : CD; + 0DB6 : 20; + 0DB7 : 74; + 0DB8 : DA; + 0DB9 : 4C; + 0DBA : C2; + 0DBB : 00; + 0DBC : 82; + 0DBD : 49; + 0DBE : 0F; + 0DBF : DA; + 0DC0 : A1; + 0DC1 : C9; + 0DC2 : 2E; + 0DC3 : F0; + 0DC4 : E1; + 0DC5 : C9; + 0DC6 : AB; + 0DC7 : F0; + 0DC8 : 58; + 0DC9 : C9; + 0DCA : AA; + 0DCB : F0; + 0DCC : D4; + 0DCD : C9; + 0DCE : 22; + 0DCF : D0; + 0DD0 : 0F; + 0DD1 : A5; + 0DD2 : C9; + 0DD3 : A4; + 0DD4 : CA; + 0DD5 : 69; + 0DD6 : 00; + 0DD7 : 90; + 0DD8 : 01; + 0DD9 : C8; + 0DDA : 20; + 0DDB : 6B; + 0DDC : D3; + 0DDD : 4C; + 0DDE : BB; + 0DDF : D6; + 0DE0 : C9; + 0DE1 : A8; + 0DE2 : D0; + 0DE3 : 13; + 0DE4 : A0; + 0DE5 : 18; + 0DE6 : D0; + 0DE7 : 3B; + 0DE8 : 20; + 0DE9 : A7; + 0DEA : D0; + 0DEB : A5; + 0DEC : B4; + 0DED : 49; + 0DEE : FF; + 0DEF : A8; + 0DF0 : A5; + 0DF1 : B3; + 0DF2 : 49; + 0DF3 : FF; + 0DF4 : 4C; + 0DF5 : 78; + 0DF6 : D2; + 0DF7 : C9; + 0DF8 : A5; + 0DF9 : D0; + 0DFA : 03; + 0DFB : 4C; + 0DFC : D6; + 0DFD : D2; + 0DFE : C9; + 0DFF : B4; + 0E00 : 90; + 0E01 : 03; + 0E02 : 4C; + 0E03 : 97; + 0E04 : CE; + 0E05 : 20; + 0E06 : 0E; + 0E07 : CE; + 0E08 : 20; + 0E09 : B8; + 0E0A : CC; + 0E0B : A9; + 0E0C : 29; + 0E0D : 2C; + 0E0E : A9; + 0E0F : 28; + 0E10 : 2C; + 0E11 : A9; + 0E12 : 2C; + 0E13 : A0; + 0E14 : 00; + 0E15 : D1; + 0E16 : C9; + 0E17 : D0; + 0E18 : 03; + 0E19 : 4C; + 0E1A : C2; + 0E1B : 00; + 0E1C : A2; + 0E1D : 10; + 0E1E : 4C; + 0E1F : 59; + 0E20 : C3; + 0E21 : A0; + 0E22 : 15; + [0E23..0E24] : 68; + 0E25 : 4C; + 0E26 : 14; + 0E27 : CD; + 0E28 : 20; + 0E29 : 7B; + 0E2A : CF; + 0E2B : 85; + 0E2C : B3; + 0E2D : 84; + 0E2E : B4; + 0E2F : A5; + 0E30 : 94; + 0E31 : A4; + 0E32 : 95; + 0E33 : A6; + 0E34 : 5E; + 0E35 : F0; + 0E36 : 1D; + 0E37 : 4C; + 0E38 : 9F; + 0E39 : E1; + 0E3A : 18; + 0E3B : C0; + 0E3C : C9; + 0E3D : D0; + 0E3E : 14; + 0E3F : 20; + 0E40 : 76; + 0E41 : CE; + 0E42 : 84; + 0E43 : AD; + 0E44 : 88; + 0E45 : 84; + 0E46 : C0; + 0E47 : A0; + 0E48 : 06; + 0E49 : 84; + 0E4A : AC; + 0E4B : A0; + 0E4C : 24; + 0E4D : 20; + 0E4E : 3A; + 0E4F : DD; + 0E50 : 4C; + 0E51 : 53; + 0E52 : D3; + 0E53 : 60; + 0E54 : A6; + 0E55 : 5F; + 0E56 : 10; + 0E57 : 0D; + 0E58 : A0; + 0E59 : 00; + 0E5A : B1; + 0E5B : B3; + 0E5C : AA; + 0E5D : C8; + 0E5E : B1; + 0E5F : B3; + 0E60 : A8; + 0E61 : 8A; + 0E62 : 4C; + 0E63 : 78; + 0E64 : D2; + 0E65 : 4C; + 0E66 : AB; + 0E67 : E1; + 0E68 : 19; + 0E69 : C0; + 0E6A : 49; + 0E6B : D0; + 0E6C : 15; + 0E6D : 20; + 0E6E : 76; + 0E6F : CE; + 0E70 : 98; + 0E71 : A2; + 0E72 : A0; + 0E73 : 4C; + 0E74 : 21; + 0E75 : DB; + 0E76 : A9; + 0E77 : FE; + 0E78 : A0; + 0E79 : 01; + 0E7A : 78; + 0E7B : 20; + 0E7C : 74; + 0E7D : DA; + 0E7E : 58; + 0E7F : 84; + 0E80 : B1; + 0E81 : 60; + 0E82 : C9; + 0E83 : 53; + 0E84 : D0; + 0E85 : 0A; + 0E86 : C0; + 0E87 : 54; + 0E88 : D0; + 0E89 : 06; + 0E8A : AD; + 0E8B : 0C; + 0E8C : 02; + 0E8D : 4C; + 0E8E : 0E; + 0E8F : DB; + 0E90 : A5; + 0E91 : B3; + 0E92 : A4; + 0E93 : B4; + 0E94 : 4C; + 0E95 : 74; + 0E96 : DA; + 0E97 : 0A; + 0E98 : 48; + 0E99 : AA; + 0E9A : 20; + 0E9B : C2; + 0E9C : 00; + 0E9D : E0; + 0E9E : 8F; + 0E9F : 90; + [0EA0..0EA1] : 20; + 0EA2 : 0E; + 0EA3 : CE; + 0EA4 : 20; + 0EA5 : B8; + 0EA6 : CC; + 0EA7 : 20; + 0EA8 : 11; + 0EA9 : CE; + 0EAA : 20; + 0EAB : A9; + 0EAC : CC; + 0EAD : 68; + 0EAE : AA; + 0EAF : A5; + 0EB0 : B4; + 0EB1 : 48; + 0EB2 : A5; + 0EB3 : B3; + 0EB4 : 48; + 0EB5 : 8A; + 0EB6 : 48; + 0EB7 : 20; + 0EB8 : 76; + 0EB9 : D6; + 0EBA : 68; + 0EBB : A8; + 0EBC : 8A; + 0EBD : 48; + 0EBE : 4C; + 0EBF : C6; + 0EC0 : CE; + 0EC1 : 20; + 0EC2 : 05; + 0EC3 : CE; + 0EC4 : 68; + 0EC5 : A8; + 0EC6 : B9; + 0EC7 : DE; + 0EC8 : BF; + 0EC9 : 85; + 0ECA : A4; + 0ECB : B9; + 0ECC : DF; + 0ECD : BF; + 0ECE : 85; + 0ECF : A5; + 0ED0 : 20; + 0ED1 : A3; + 0ED2 : 00; + 0ED3 : 4C; + 0ED4 : A7; + 0ED5 : CC; + 0ED6 : A0; + 0ED7 : FF; + 0ED8 : 2C; + 0ED9 : A0; + 0EDA : 00; + 0EDB : 84; + 0EDC : 5C; + 0EDD : 20; + 0EDE : A7; + 0EDF : D0; + 0EE0 : A5; + 0EE1 : B3; + 0EE2 : 45; + 0EE3 : 5C; + 0EE4 : 85; + 0EE5 : 5A; + 0EE6 : A5; + 0EE7 : B4; + 0EE8 : 45; + 0EE9 : 5C; + 0EEA : 85; + 0EEB : 5B; + 0EEC : 20; + 0EED : CE; + 0EEE : DA; + 0EEF : 20; + 0EF0 : A7; + 0EF1 : D0; + 0EF2 : A5; + 0EF3 : B4; + 0EF4 : 45; + 0EF5 : 5C; + 0EF6 : 25; + 0EF7 : 5B; + 0EF8 : 45; + 0EF9 : 5C; + 0EFA : A8; + 0EFB : A5; + 0EFC : B3; + 0EFD : 45; + 0EFE : 5C; + 0EFF : 25; + 0F00 : 5A; + 0F01 : 45; + 0F02 : 5C; + 0F03 : 4C; + 0F04 : 78; + 0F05 : D2; + 0F06 : 20; + 0F07 : AA; + 0F08 : CC; + 0F09 : B0; + 0F0A : 13; + 0F0B : A5; + 0F0C : BD; + 0F0D : 09; + 0F0E : 7F; + 0F0F : 25; + 0F10 : B9; + 0F11 : 85; + 0F12 : B9; + 0F13 : A9; + 0F14 : B8; + 0F15 : A0; + 0F16 : 00; + 0F17 : 20; + 0F18 : 2D; + 0F19 : DB; + 0F1A : AA; + 0F1B : 4C; + 0F1C : 51; + 0F1D : CF; + 0F1E : A9; + 0F1F : 00; + 0F20 : 85; + 0F21 : 5E; + 0F22 : C6; + 0F23 : 9C; + 0F24 : 20; + 0F25 : 7E; + 0F26 : D5; + 0F27 : 85; + 0F28 : B0; + 0F29 : 86; + 0F2A : B1; + 0F2B : 84; + 0F2C : B2; + 0F2D : A5; + 0F2E : BB; + 0F2F : A4; + 0F30 : BC; + 0F31 : 20; + 0F32 : 82; + 0F33 : D5; + 0F34 : 86; + 0F35 : BB; + 0F36 : 84; + 0F37 : BC; + 0F38 : AA; + 0F39 : 38; + 0F3A : E5; + 0F3B : B0; + 0F3C : F0; + 0F3D : 08; + 0F3E : A9; + 0F3F : 01; + 0F40 : 90; + 0F41 : 04; + 0F42 : A6; + 0F43 : B0; + 0F44 : A9; + 0F45 : FF; + 0F46 : 85; + 0F47 : B5; + 0F48 : A0; + 0F49 : FF; + 0F4A : E8; + 0F4B : C8; + 0F4C : CA; + 0F4D : D0; + 0F4E : 07; + 0F4F : A6; + 0F50 : B5; + 0F51 : 30; + 0F52 : 0F; + 0F53 : 18; + 0F54 : 90; + 0F55 : 0C; + 0F56 : B1; + 0F57 : BB; + 0F58 : D1; + 0F59 : B1; + 0F5A : F0; + 0F5B : EF; + 0F5C : A2; + 0F5D : FF; + 0F5E : B0; + 0F5F : 02; + 0F60 : A2; + 0F61 : 01; + 0F62 : E8; + 0F63 : 8A; + 0F64 : 2A; + 0F65 : 25; + 0F66 : 63; + 0F67 : F0; + 0F68 : 02; + 0F69 : A9; + 0F6A : FF; + 0F6B : 4C; + 0F6C : 0E; + 0F6D : DB; + 0F6E : 20; + 0F6F : 11; + 0F70 : CE; + 0F71 : AA; + 0F72 : 20; + 0F73 : 80; + 0F74 : CF; + 0F75 : 20; + 0F76 : C8; + 0F77 : 00; + 0F78 : D0; + 0F79 : F4; + 0F7A : 60; + 0F7B : A2; + 0F7C : 00; + 0F7D : 20; + 0F7E : C8; + 0F7F : 00; + 0F80 : 86; + 0F81 : 5D; + 0F82 : 85; + 0F83 : 94; + 0F84 : 20; + 0F85 : C8; + 0F86 : 00; + 0F87 : 20; + 0F88 : 05; + 0F89 : D0; + 0F8A : B0; + 0F8B : 03; + 0F8C : 4C; + 0F8D : 1C; + 0F8E : CE; + 0F8F : A2; + 0F90 : 00; + 0F91 : 86; + 0F92 : 5E; + 0F93 : 86; + 0F94 : 5F; + 0F95 : 20; + 0F96 : C2; + 0F97 : 00; + 0F98 : 90; + 0F99 : 05; + 0F9A : 20; + 0F9B : 05; + 0F9C : D0; + 0F9D : 90; + 0F9E : 0B; + 0F9F : AA; + 0FA0 : 20; + 0FA1 : C2; + 0FA2 : 00; + 0FA3 : 90; + 0FA4 : FB; + 0FA5 : 20; + 0FA6 : 05; + 0FA7 : D0; + 0FA8 : B0; + 0FA9 : F6; + 0FAA : C9; + 0FAB : 24; + 0FAC : D0; + 0FAD : 06; + 0FAE : A9; + 0FAF : FF; + 0FB0 : 85; + 0FB1 : 5E; + 0FB2 : D0; + 0FB3 : 10; + 0FB4 : C9; + 0FB5 : 25; + 0FB6 : D0; + 0FB7 : 13; + 0FB8 : A5; + 0FB9 : 61; + [0FBA..0FBB] : D0; + 0FBC : A9; + 0FBD : 80; + 0FBE : 85; + 0FBF : 5F; + 0FC0 : 05; + 0FC1 : 94; + 0FC2 : 85; + 0FC3 : 94; + 0FC4 : 8A; + 0FC5 : 09; + 0FC6 : 80; + 0FC7 : AA; + 0FC8 : 20; + 0FC9 : C2; + 0FCA : 00; + 0FCB : 86; + 0FCC : 95; + 0FCD : 38; + 0FCE : 05; + 0FCF : 61; + 0FD0 : E9; + 0FD1 : 28; + 0FD2 : D0; + 0FD3 : 03; + 0FD4 : 4C; + 0FD5 : B9; + 0FD6 : D0; + 0FD7 : A9; + 0FD8 : 00; + 0FD9 : 85; + 0FDA : 61; + 0FDB : A5; + 0FDC : 7C; + 0FDD : A6; + 0FDE : 7D; + 0FDF : A0; + 0FE0 : 00; + 0FE1 : 86; + 0FE2 : AF; + 0FE3 : 85; + 0FE4 : AE; + 0FE5 : E4; + 0FE6 : 7F; + 0FE7 : D0; + 0FE8 : 04; + 0FE9 : C5; + 0FEA : 7E; + 0FEB : F0; + 0FEC : 22; + 0FED : A5; + 0FEE : 94; + 0FEF : D1; + 0FF0 : AE; + 0FF1 : D0; + 0FF2 : 08; + 0FF3 : A5; + 0FF4 : 95; + 0FF5 : C8; + 0FF6 : D1; + 0FF7 : AE; + 0FF8 : F0; + 0FF9 : 7F; + 0FFA : 88; + 0FFB : 18; + 0FFC : A5; + 0FFD : AE; + 0FFE : 69; + 0FFF : 07; + 1000 : 90; + 1001 : E1; + 1002 : E8; + 1003 : D0; + 1004 : DC; + 1005 : C9; + 1006 : 41; + 1007 : 90; + 1008 : 05; + 1009 : E9; + 100A : 5B; + 100B : 38; + 100C : E9; + 100D : A5; + 100E : 60; + 100F : 68; + 1010 : 48; + 1011 : C9; + 1012 : 2A; + 1013 : D0; + 1014 : 07; + 1015 : A9; + 1016 : 1A; + 1017 : A0; + 1018 : D0; + 1019 : 60; + [101A..101B] : 00; + 101C : A5; + 101D : 94; + 101E : A4; + 101F : 95; + 1020 : C9; + 1021 : 54; + 1022 : D0; + 1023 : 0B; + 1024 : C0; + 1025 : C9; + 1026 : F0; + 1027 : ED; + 1028 : C0; + 1029 : 49; + 102A : D0; + 102B : 03; + 102C : 4C; + 102D : 1C; + 102E : CE; + 102F : C9; + 1030 : 53; + 1031 : D0; + 1032 : 04; + 1033 : C0; + 1034 : 54; + 1035 : F0; + 1036 : F5; + 1037 : A5; + 1038 : 7E; + 1039 : A4; + 103A : 7F; + 103B : 85; + 103C : AE; + 103D : 84; + 103E : AF; + 103F : A5; + 1040 : 80; + 1041 : A4; + 1042 : 81; + 1043 : 85; + 1044 : A9; + 1045 : 84; + 1046 : AA; + 1047 : 18; + 1048 : 69; + 1049 : 07; + 104A : 90; + 104B : 01; + 104C : C8; + 104D : 85; + 104E : A7; + 104F : 84; + 1050 : A8; + 1051 : 20; + 1052 : DA; + 1053 : C2; + 1054 : A5; + 1055 : A7; + 1056 : A4; + 1057 : A8; + 1058 : C8; + 1059 : 85; + 105A : 7E; + 105B : 84; + 105C : 7F; + 105D : A0; + 105E : 00; + 105F : A5; + 1060 : 94; + 1061 : 91; + 1062 : AE; + 1063 : C8; + 1064 : A5; + 1065 : 95; + 1066 : 91; + 1067 : AE; + 1068 : A9; + 1069 : 00; + 106A : C8; + 106B : 91; + 106C : AE; + 106D : C8; + 106E : 91; + 106F : AE; + 1070 : C8; + 1071 : 91; + 1072 : AE; + 1073 : C8; + 1074 : 91; + 1075 : AE; + 1076 : C8; + 1077 : 91; + 1078 : AE; + 1079 : A5; + 107A : AE; + 107B : 18; + 107C : 69; + 107D : 02; + 107E : A4; + 107F : AF; + 1080 : 90; + 1081 : 01; + 1082 : C8; + 1083 : 85; + 1084 : 96; + 1085 : 84; + 1086 : 97; + 1087 : 60; + 1088 : A5; + 1089 : 5C; + 108A : 0A; + 108B : 69; + 108C : 05; + 108D : 65; + 108E : AE; + 108F : A4; + 1090 : AF; + 1091 : 90; + 1092 : 01; + 1093 : C8; + 1094 : 85; + 1095 : A7; + 1096 : 84; + 1097 : A8; + 1098 : 60; + 1099 : 90; + 109A : 80; + [109B..109C] : 00; + 109D : 20; + 109E : C2; + 109F : 00; + 10A0 : 20; + 10A1 : A4; + 10A2 : CC; + 10A3 : A5; + 10A4 : B5; + 10A5 : 30; + 10A6 : 0D; + 10A7 : A5; + 10A8 : B0; + 10A9 : C9; + [10AA..10AB] : 90; + 10AC : 09; + 10AD : A9; + 10AE : 99; + 10AF : A0; + 10B0 : D0; + 10B1 : 20; + 10B2 : 2D; + 10B3 : DB; + 10B4 : D0; + 10B5 : 7A; + 10B6 : 4C; + 10B7 : 6D; + 10B8 : DB; + 10B9 : A5; + 10BA : 5D; + 10BB : 05; + 10BC : 5F; + 10BD : 48; + 10BE : A5; + 10BF : 5E; + 10C0 : 48; + 10C1 : A0; + 10C2 : 00; + 10C3 : 98; + 10C4 : 48; + 10C5 : A5; + 10C6 : 95; + 10C7 : 48; + 10C8 : A5; + 10C9 : 94; + 10CA : 48; + 10CB : 20; + 10CC : 9D; + 10CD : D0; + 10CE : 68; + 10CF : 85; + 10D0 : 94; + 10D1 : 68; + 10D2 : 85; + 10D3 : 95; + 10D4 : 68; + 10D5 : A8; + 10D6 : BA; + 10D7 : BD; + 10D8 : 02; + 10D9 : 01; + 10DA : 48; + 10DB : BD; + [10DC..10DD] : 01; + 10DE : 48; + 10DF : A5; + 10E0 : B3; + 10E1 : 9D; + 10E2 : 02; + 10E3 : 01; + 10E4 : A5; + 10E5 : B4; + 10E6 : 9D; + [10E7..10E8] : 01; + 10E9 : C8; + 10EA : 20; + 10EB : C8; + 10EC : 00; + 10ED : C9; + 10EE : 2C; + 10EF : F0; + 10F0 : D2; + 10F1 : 84; + 10F2 : 5C; + 10F3 : 20; + 10F4 : 0B; + 10F5 : CE; + 10F6 : 68; + 10F7 : 85; + 10F8 : 5E; + 10F9 : 68; + 10FA : 85; + 10FB : 5F; + 10FC : 29; + 10FD : 7F; + 10FE : 85; + 10FF : 5D; + 1100 : A6; + 1101 : 7E; + 1102 : A5; + 1103 : 7F; + 1104 : 86; + 1105 : AE; + 1106 : 85; + 1107 : AF; + 1108 : C5; + 1109 : 81; + 110A : D0; + 110B : 04; + 110C : E4; + 110D : 80; + 110E : F0; + 110F : 39; + 1110 : A0; + 1111 : 00; + 1112 : B1; + 1113 : AE; + 1114 : C8; + 1115 : C5; + 1116 : 94; + 1117 : D0; + 1118 : 06; + 1119 : A5; + 111A : 95; + 111B : D1; + 111C : AE; + 111D : F0; + 111E : 16; + 111F : C8; + 1120 : B1; + 1121 : AE; + 1122 : 18; + 1123 : 65; + 1124 : AE; + 1125 : AA; + 1126 : C8; + 1127 : B1; + 1128 : AE; + 1129 : 65; + 112A : AF; + 112B : 90; + 112C : D7; + 112D : A2; + 112E : 70; + 112F : 2C; + 1130 : A2; + 1131 : 35; + 1132 : 4C; + 1133 : 59; + 1134 : C3; + 1135 : A2; + 1136 : 7D; + 1137 : A5; + 1138 : 5D; + 1139 : D0; + 113A : F7; + 113B : 20; + 113C : 88; + 113D : D0; + 113E : A5; + 113F : 5C; + 1140 : A0; + 1141 : 04; + 1142 : D1; + 1143 : AE; + 1144 : D0; + 1145 : E7; + 1146 : 4C; + 1147 : D3; + 1148 : D1; + 1149 : 20; + 114A : 88; + 114B : D0; + 114C : 20; + 114D : 2A; + 114E : C3; + 114F : A9; + 1150 : 00; + 1151 : A8; + 1152 : 85; + 1153 : C1; + 1154 : A2; + 1155 : 05; + 1156 : A5; + 1157 : 94; + 1158 : 91; + 1159 : AE; + 115A : 10; + 115B : 01; + 115C : CA; + 115D : C8; + 115E : A5; + 115F : 95; + 1160 : 91; + 1161 : AE; + 1162 : 10; + 1163 : 02; + [1164..1165] : CA; + 1166 : 86; + 1167 : C0; + 1168 : A5; + 1169 : 5C; + [116A..116C] : C8; + 116D : 91; + 116E : AE; + 116F : A2; + 1170 : 0B; + 1171 : A9; + 1172 : 00; + 1173 : 24; + 1174 : 5D; + 1175 : 50; + 1176 : 08; + 1177 : 68; + 1178 : 18; + 1179 : 69; + 117A : 01; + 117B : AA; + 117C : 68; + 117D : 69; + 117E : 00; + 117F : C8; + 1180 : 91; + 1181 : AE; + 1182 : C8; + 1183 : 8A; + 1184 : 91; + 1185 : AE; + 1186 : 20; + 1187 : 33; + 1188 : D2; + 1189 : 86; + 118A : C0; + 118B : 85; + 118C : C1; + 118D : A4; + 118E : 71; + 118F : C6; + 1190 : 5C; + 1191 : D0; + 1192 : DC; + 1193 : 65; + 1194 : A8; + 1195 : B0; + 1196 : 5D; + 1197 : 85; + [1198..1199] : A8; + 119A : 8A; + 119B : 65; + 119C : A7; + 119D : 90; + 119E : 03; + 119F : C8; + 11A0 : F0; + 11A1 : 52; + 11A2 : 20; + 11A3 : 2A; + 11A4 : C3; + 11A5 : 85; + 11A6 : 80; + 11A7 : 84; + 11A8 : 81; + 11A9 : A9; + 11AA : 00; + 11AB : E6; + 11AC : C1; + 11AD : A4; + 11AE : C0; + 11AF : F0; + 11B0 : 05; + 11B1 : 88; + 11B2 : 91; + 11B3 : A7; + 11B4 : D0; + 11B5 : FB; + 11B6 : C6; + 11B7 : A8; + 11B8 : C6; + 11B9 : C1; + 11BA : D0; + 11BB : F5; + 11BC : E6; + 11BD : A8; + 11BE : 38; + 11BF : A5; + 11C0 : 80; + 11C1 : E5; + 11C2 : AE; + 11C3 : A0; + 11C4 : 02; + 11C5 : 91; + 11C6 : AE; + 11C7 : A5; + 11C8 : 81; + 11C9 : C8; + 11CA : E5; + 11CB : AF; + 11CC : 91; + 11CD : AE; + 11CE : A5; + 11CF : 5D; + 11D0 : D0; + 11D1 : 60; + 11D2 : C8; + 11D3 : B1; + 11D4 : AE; + 11D5 : 85; + 11D6 : 5C; + 11D7 : A9; + 11D8 : 00; + 11D9 : 85; + 11DA : C0; + 11DB : 85; + 11DC : C1; + 11DD : C8; + 11DE : 68; + 11DF : AA; + 11E0 : 85; + 11E1 : B3; + 11E2 : 68; + 11E3 : 85; + 11E4 : B4; + 11E5 : D1; + 11E6 : AE; + 11E7 : 90; + 11E8 : 0E; + 11E9 : D0; + 11EA : 06; + 11EB : C8; + 11EC : 8A; + 11ED : D1; + 11EE : AE; + 11EF : 90; + 11F0 : 07; + 11F1 : 4C; + 11F2 : 2D; + 11F3 : D1; + 11F4 : 4C; + 11F5 : 57; + 11F6 : C3; + 11F7 : C8; + 11F8 : A5; + 11F9 : C1; + 11FA : 05; + 11FB : C0; + 11FC : 18; + 11FD : F0; + 11FE : 0A; + 11FF : 20; + 1200 : 33; + 1201 : D2; + 1202 : 8A; + 1203 : 65; + 1204 : B3; + 1205 : AA; + 1206 : 98; + 1207 : A4; + 1208 : 71; + 1209 : 65; + 120A : B4; + 120B : 86; + 120C : C0; + 120D : C6; + 120E : 5C; + 120F : D0; + 1210 : CA; + 1211 : A2; + 1212 : 05; + 1213 : A5; + 1214 : 94; + 1215 : 10; + 1216 : 01; + 1217 : CA; + 1218 : A5; + 1219 : 95; + 121A : 10; + 121B : 02; + [121C..121D] : CA; + 121E : 86; + 121F : 77; + 1220 : A9; + 1221 : 00; + 1222 : 20; + 1223 : 3C; + 1224 : D2; + 1225 : 8A; + 1226 : 65; + 1227 : A7; + 1228 : 85; + 1229 : 96; + 122A : 98; + 122B : 65; + 122C : A8; + 122D : 85; + 122E : 97; + 122F : A8; + 1230 : A5; + 1231 : 96; + 1232 : 60; + 1233 : 84; + 1234 : 71; + 1235 : B1; + 1236 : AE; + 1237 : 85; + 1238 : 77; + 1239 : 88; + 123A : B1; + 123B : AE; + 123C : 85; + 123D : 78; + 123E : A9; + 123F : 10; + 1240 : 85; + 1241 : AC; + 1242 : A2; + 1243 : 00; + 1244 : A0; + 1245 : 00; + 1246 : 8A; + 1247 : 0A; + 1248 : AA; + 1249 : 98; + 124A : 2A; + 124B : A8; + 124C : B0; + 124D : A6; + 124E : 06; + 124F : C0; + 1250 : 26; + 1251 : C1; + 1252 : 90; + 1253 : 0B; + 1254 : 18; + 1255 : 8A; + 1256 : 65; + 1257 : 77; + 1258 : AA; + 1259 : 98; + 125A : 65; + 125B : 78; + 125C : A8; + 125D : B0; + 125E : 95; + 125F : C6; + 1260 : AC; + 1261 : D0; + 1262 : E3; + 1263 : 60; + 1264 : A5; + 1265 : 5E; + 1266 : F0; + 1267 : 03; + 1268 : 20; + 1269 : 7E; + 126A : D5; + 126B : 20; + 126C : 04; + 126D : D4; + 126E : 38; + 126F : A5; + 1270 : 82; + 1271 : E5; + 1272 : 80; + 1273 : A8; + 1274 : A5; + 1275 : 83; + 1276 : E5; + 1277 : 81; + 1278 : A2; + 1279 : 00; + 127A : 86; + 127B : 5E; + 127C : 85; + 127D : B1; + 127E : 84; + 127F : B2; + 1280 : A2; + 1281 : 90; + 1282 : 4C; + 1283 : 16; + 1284 : DB; + 1285 : A4; + 1286 : 05; + 1287 : A9; + 1288 : 00; + 1289 : F0; + 128A : ED; + 128B : A6; + 128C : 89; + 128D : E8; + 128E : D0; + [128F..1290] : A2; + 1291 : 9A; + 1292 : 4C; + 1293 : 59; + 1294 : C3; + 1295 : 20; + 1296 : C3; + 1297 : D2; + 1298 : 20; + 1299 : 8B; + 129A : D2; + 129B : 20; + 129C : 0E; + 129D : CE; + 129E : A9; + 129F : 80; + 12A0 : 85; + 12A1 : 61; + 12A2 : 20; + 12A3 : 7B; + 12A4 : CF; + 12A5 : 20; + 12A6 : A7; + 12A7 : CC; + 12A8 : 20; + 12A9 : 0B; + 12AA : CE; + 12AB : A9; + 12AC : B2; + 12AD : 20; + 12AE : 13; + 12AF : CE; + 12B0 : 48; + 12B1 : A5; + 12B2 : 97; + 12B3 : 48; + 12B4 : A5; + 12B5 : 96; + 12B6 : 48; + 12B7 : A5; + 12B8 : CA; + 12B9 : 48; + 12BA : A5; + 12BB : C9; + 12BC : 48; + 12BD : 20; + 12BE : F0; + 12BF : C7; + 12C0 : 4C; + 12C1 : 33; + 12C2 : D3; + 12C3 : A9; + 12C4 : A5; + 12C5 : 20; + 12C6 : 13; + 12C7 : CE; + 12C8 : 09; + 12C9 : 80; + 12CA : 85; + 12CB : 61; + 12CC : 20; + 12CD : 82; + 12CE : CF; + 12CF : 85; + 12D0 : 9D; + 12D1 : 84; + 12D2 : 9E; + 12D3 : 4C; + 12D4 : A7; + 12D5 : CC; + 12D6 : 20; + 12D7 : C3; + 12D8 : D2; + 12D9 : A5; + 12DA : 9E; + 12DB : 48; + 12DC : A5; + 12DD : 9D; + 12DE : 48; + 12DF : 20; + 12E0 : 05; + 12E1 : CE; + 12E2 : 20; + 12E3 : A7; + 12E4 : CC; + 12E5 : 68; + 12E6 : 85; + 12E7 : 9D; + 12E8 : 68; + 12E9 : 85; + 12EA : 9E; + 12EB : A0; + 12EC : 02; + 12ED : A2; + 12EE : ED; + 12EF : B1; + 12F0 : 9D; + 12F1 : F0; + 12F2 : 9F; + 12F3 : 85; + 12F4 : 96; + 12F5 : AA; + 12F6 : C8; + 12F7 : B1; + 12F8 : 9D; + 12F9 : 85; + 12FA : 97; + 12FB : C8; + 12FC : B1; + 12FD : 96; + 12FE : 48; + 12FF : 88; + 1300 : 10; + 1301 : FA; + 1302 : A4; + 1303 : 97; + 1304 : 20; + 1305 : A6; + 1306 : DA; + 1307 : A5; + 1308 : CA; + 1309 : 48; + 130A : A5; + 130B : C9; + 130C : 48; + 130D : B1; + 130E : 9D; + 130F : 85; + 1310 : C9; + 1311 : C8; + 1312 : B1; + 1313 : 9D; + 1314 : 85; + 1315 : CA; + 1316 : A5; + 1317 : 97; + 1318 : 48; + 1319 : A5; + 131A : 96; + 131B : 48; + 131C : 20; + 131D : A4; + 131E : CC; + 131F : 68; + 1320 : 85; + 1321 : 9D; + 1322 : 68; + 1323 : 85; + 1324 : 9E; + 1325 : 20; + 1326 : C8; + 1327 : 00; + 1328 : F0; + 1329 : 03; + 132A : 4C; + 132B : 1C; + 132C : CE; + 132D : 68; + 132E : 85; + 132F : C9; + 1330 : 68; + 1331 : 85; + 1332 : CA; + 1333 : A0; + 1334 : 00; + 1335 : 68; + 1336 : 91; + 1337 : 9D; + 1338 : 68; + 1339 : C8; + 133A : 91; + 133B : 9D; + 133C : 68; + 133D : C8; + 133E : 91; + 133F : 9D; + 1340 : 68; + 1341 : C8; + 1342 : 91; + 1343 : 9D; + 1344 : 68; + 1345 : C8; + 1346 : 91; + 1347 : 9D; + 1348 : 60; + 1349 : 20; + 134A : A7; + 134B : CC; + 134C : A0; + 134D : 00; + 134E : 20; + 134F : B1; + 1350 : DC; + [1351..1352] : 68; + 1353 : A9; + 1354 : FF; + 1355 : A0; + 1356 : 00; + 1357 : F0; + 1358 : 12; + 1359 : A6; + 135A : B3; + 135B : A4; + 135C : B4; + 135D : 86; + 135E : 9F; + 135F : 84; + 1360 : A0; + 1361 : 20; + 1362 : D2; + 1363 : D3; + 1364 : 86; + 1365 : B1; + 1366 : 84; + 1367 : B2; + 1368 : 85; + 1369 : B0; + 136A : 60; + 136B : A2; + 136C : 22; + 136D : 86; + 136E : 5A; + 136F : 86; + 1370 : 5B; + 1371 : 85; + 1372 : BE; + 1373 : 84; + 1374 : BF; + 1375 : 85; + 1376 : B1; + 1377 : 84; + 1378 : B2; + 1379 : A0; + 137A : FF; + 137B : C8; + 137C : B1; + 137D : BE; + 137E : F0; + 137F : 0C; + 1380 : C5; + 1381 : 5A; + 1382 : F0; + 1383 : 04; + 1384 : C5; + 1385 : 5B; + 1386 : D0; + 1387 : F3; + 1388 : C9; + 1389 : 22; + 138A : F0; + 138B : 01; + 138C : 18; + 138D : 84; + 138E : B0; + 138F : 98; + 1390 : 65; + 1391 : BE; + 1392 : 85; + 1393 : C0; + 1394 : A6; + 1395 : BF; + 1396 : 90; + 1397 : 01; + 1398 : E8; + 1399 : 86; + 139A : C1; + 139B : A5; + 139C : BF; + 139D : D0; + 139E : 0B; + 139F : 98; + 13A0 : 20; + 13A1 : 59; + 13A2 : D3; + 13A3 : A6; + 13A4 : BE; + 13A5 : A4; + 13A6 : BF; + 13A7 : 20; + 13A8 : 60; + 13A9 : D5; + 13AA : A6; + 13AB : 65; + 13AC : E0; + 13AD : 71; + 13AE : D0; + 13AF : 05; + 13B0 : A2; + 13B1 : CC; + 13B2 : 4C; + 13B3 : 59; + 13B4 : C3; + 13B5 : A5; + 13B6 : B0; + 13B7 : 95; + 13B8 : 00; + 13B9 : A5; + 13BA : B1; + 13BB : 95; + 13BC : 01; + 13BD : A5; + 13BE : B2; + 13BF : 95; + 13C0 : 02; + 13C1 : A0; + 13C2 : 00; + 13C3 : 86; + 13C4 : B3; + 13C5 : 84; + 13C6 : B4; + 13C7 : 88; + 13C8 : 84; + 13C9 : 5E; + 13CA : 86; + 13CB : 66; + [13CC..13CE] : E8; + 13CF : 86; + 13D0 : 65; + 13D1 : 60; + 13D2 : 46; + 13D3 : 60; + 13D4 : 48; + 13D5 : 49; + 13D6 : FF; + 13D7 : 38; + 13D8 : 65; + 13D9 : 82; + 13DA : A4; + 13DB : 83; + 13DC : B0; + 13DD : 01; + 13DE : 88; + 13DF : C4; + 13E0 : 81; + 13E1 : 90; + 13E2 : 11; + 13E3 : D0; + 13E4 : 04; + 13E5 : C5; + 13E6 : 80; + 13E7 : 90; + 13E8 : 0B; + 13E9 : 85; + 13EA : 82; + 13EB : 84; + 13EC : 83; + 13ED : 85; + [13EE..13EF] : 84; + 13F0 : 85; + 13F1 : AA; + 13F2 : 68; + 13F3 : 60; + 13F4 : A2; + 13F5 : 52; + 13F6 : A5; + 13F7 : 60; + 13F8 : 30; + 13F9 : B8; + 13FA : 20; + 13FB : 04; + 13FC : D4; + 13FD : A9; + 13FE : 80; + 13FF : 85; + 1400 : 60; + 1401 : 68; + [1402..1403] : D0; + 1404 : A6; + 1405 : 86; + 1406 : A5; + 1407 : 87; + 1408 : 86; + 1409 : 82; + 140A : 85; + 140B : 83; + 140C : A0; + 140D : 00; + 140E : 84; + 140F : 9E; + 1410 : A5; + 1411 : 80; + 1412 : A6; + 1413 : 81; + 1414 : 85; + 1415 : AE; + 1416 : 86; + 1417 : AF; + 1418 : A9; + 1419 : 68; + 141A : A2; + 141B : 00; + 141C : 85; + 141D : 71; + 141E : 86; + 141F : 72; + 1420 : C5; + 1421 : 65; + 1422 : F0; + 1423 : 05; + 1424 : 20; + 1425 : A1; + 1426 : D4; + 1427 : F0; + 1428 : F7; + 1429 : A9; + 142A : 07; + 142B : 85; + 142C : A2; + 142D : A5; + 142E : 7C; + 142F : A6; + 1430 : 7D; + 1431 : 85; + 1432 : 71; + 1433 : 86; + 1434 : 72; + 1435 : E4; + 1436 : 7F; + 1437 : D0; + 1438 : 04; + 1439 : C5; + 143A : 7E; + 143B : F0; + 143C : 05; + 143D : 20; + 143E : 97; + 143F : D4; + 1440 : F0; + 1441 : F3; + 1442 : 85; + 1443 : A7; + 1444 : 86; + 1445 : A8; + 1446 : A9; + 1447 : 03; + 1448 : 85; + 1449 : A2; + 144A : A5; + 144B : A7; + 144C : A6; + 144D : A8; + 144E : E4; + 144F : 81; + 1450 : D0; + 1451 : 07; + 1452 : C5; + 1453 : 80; + 1454 : D0; + 1455 : 03; + 1456 : 4C; + 1457 : E0; + 1458 : D4; + 1459 : 85; + 145A : 71; + 145B : 86; + 145C : 72; + 145D : A0; + 145E : 00; + 145F : B1; + 1460 : 71; + 1461 : AA; + 1462 : C8; + 1463 : B1; + 1464 : 71; + 1465 : 08; + 1466 : C8; + 1467 : B1; + 1468 : 71; + 1469 : 65; + 146A : A7; + 146B : 85; + 146C : A7; + 146D : C8; + 146E : B1; + 146F : 71; + 1470 : 65; + 1471 : A8; + 1472 : 85; + 1473 : A8; + 1474 : 28; + 1475 : 10; + 1476 : D3; + 1477 : 8A; + 1478 : 30; + 1479 : D0; + 147A : C8; + 147B : B1; + 147C : 71; + 147D : 20; + 147E : F3; + 147F : E7; + 1480 : 65; + 1481 : 71; + 1482 : 85; + 1483 : 71; + 1484 : 90; + 1485 : 02; + 1486 : E6; + 1487 : 72; + 1488 : A6; + 1489 : 72; + 148A : E4; + 148B : A8; + 148C : D0; + 148D : 04; + 148E : C5; + 148F : A7; + 1490 : F0; + 1491 : BC; + 1492 : 20; + 1493 : A1; + 1494 : D4; + 1495 : F0; + 1496 : F3; + 1497 : B1; + 1498 : 71; + 1499 : 30; + 149A : 35; + 149B : C8; + 149C : B1; + 149D : 71; + 149E : 10; + 149F : 30; + 14A0 : C8; + 14A1 : B1; + 14A2 : 71; + 14A3 : F0; + 14A4 : 2B; + 14A5 : C8; + 14A6 : B1; + 14A7 : 71; + 14A8 : AA; + 14A9 : C8; + 14AA : B1; + 14AB : 71; + 14AC : C5; + 14AD : 83; + 14AE : 90; + 14AF : 06; + 14B0 : D0; + 14B1 : 1E; + 14B2 : E4; + 14B3 : 82; + 14B4 : B0; + 14B5 : 1A; + 14B6 : C5; + 14B7 : AF; + 14B8 : 90; + 14B9 : 16; + 14BA : D0; + 14BB : 04; + 14BC : E4; + 14BD : AE; + 14BE : 90; + 14BF : 10; + 14C0 : 86; + 14C1 : AE; + 14C2 : 85; + 14C3 : AF; + 14C4 : A5; + 14C5 : 71; + 14C6 : A6; + 14C7 : 72; + 14C8 : 85; + 14C9 : 9D; + 14CA : 86; + 14CB : 9E; + 14CC : A5; + 14CD : A2; + 14CE : 85; + 14CF : A4; + 14D0 : A5; + 14D1 : A2; + 14D2 : 18; + 14D3 : 65; + 14D4 : 71; + 14D5 : 85; + 14D6 : 71; + 14D7 : 90; + 14D8 : 02; + 14D9 : E6; + 14DA : 72; + 14DB : A6; + 14DC : 72; + 14DD : A0; + 14DE : 00; + 14DF : 60; + 14E0 : A6; + 14E1 : 9E; + 14E2 : F0; + 14E3 : F7; + 14E4 : A5; + 14E5 : A4; + 14E6 : E9; + 14E7 : 03; + 14E8 : 4A; + 14E9 : A8; + 14EA : 85; + 14EB : A4; + 14EC : B1; + 14ED : 9D; + 14EE : 65; + 14EF : AE; + 14F0 : 85; + 14F1 : A9; + 14F2 : A5; + 14F3 : AF; + 14F4 : 69; + 14F5 : 00; + 14F6 : 85; + 14F7 : AA; + 14F8 : A5; + 14F9 : 82; + 14FA : A6; + 14FB : 83; + 14FC : 85; + 14FD : A7; + 14FE : 86; + 14FF : A8; + 1500 : 20; + 1501 : E1; + 1502 : C2; + [1503..1504] : A4; + 1505 : C8; + 1506 : A5; + 1507 : A7; + 1508 : 91; + 1509 : 9D; + 150A : AA; + 150B : E6; + 150C : A8; + 150D : A5; + 150E : A8; + 150F : C8; + 1510 : 91; + 1511 : 9D; + 1512 : 4C; + 1513 : 08; + 1514 : D4; + 1515 : A5; + 1516 : B4; + 1517 : 48; + 1518 : A5; + 1519 : B3; + 151A : 48; + 151B : 20; + 151C : 9D; + 151D : CD; + 151E : 20; + 151F : A9; + 1520 : CC; + 1521 : 68; + 1522 : 85; + 1523 : BE; + 1524 : 68; + 1525 : 85; + 1526 : BF; + 1527 : A0; + 1528 : 00; + 1529 : B1; + 152A : BE; + 152B : 18; + 152C : 71; + 152D : B3; + 152E : 90; + 152F : 05; + 1530 : A2; + 1531 : B5; + 1532 : 4C; + 1533 : 59; + 1534 : C3; + 1535 : 20; + 1536 : 59; + 1537 : D3; + 1538 : 20; + 1539 : 52; + 153A : D5; + 153B : A5; + 153C : 9F; + 153D : A4; + 153E : A0; + 153F : 20; + 1540 : 82; + 1541 : D5; + 1542 : 20; + 1543 : 64; + 1544 : D5; + 1545 : A5; + 1546 : BE; + 1547 : A4; + 1548 : BF; + 1549 : 20; + 154A : 82; + 154B : D5; + 154C : 20; + 154D : AA; + 154E : D3; + 154F : 4C; + 1550 : D2; + 1551 : CC; + 1552 : A0; + 1553 : 00; + 1554 : B1; + 1555 : BE; + 1556 : 48; + 1557 : C8; + 1558 : B1; + 1559 : BE; + 155A : AA; + 155B : C8; + 155C : B1; + 155D : BE; + 155E : A8; + 155F : 68; + 1560 : 86; + 1561 : 71; + 1562 : 84; + 1563 : 72; + 1564 : A8; + 1565 : F0; + 1566 : 0A; + 1567 : 48; + 1568 : 88; + 1569 : B1; + 156A : 71; + 156B : 91; + 156C : 84; + 156D : 98; + 156E : D0; + 156F : F8; + 1570 : 68; + 1571 : 18; + 1572 : 65; + 1573 : 84; + 1574 : 85; + 1575 : 84; + 1576 : 90; + 1577 : 02; + 1578 : E6; + 1579 : 85; + 157A : 60; + 157B : 20; + 157C : A9; + 157D : CC; + 157E : A5; + 157F : B3; + 1580 : A4; + 1581 : B4; + 1582 : 85; + 1583 : 71; + 1584 : 84; + 1585 : 72; + 1586 : 20; + 1587 : B3; + 1588 : D5; + 1589 : 08; + 158A : A0; + 158B : 00; + 158C : B1; + 158D : 71; + 158E : 48; + 158F : C8; + 1590 : B1; + 1591 : 71; + 1592 : AA; + 1593 : C8; + 1594 : B1; + 1595 : 71; + 1596 : A8; + 1597 : 68; + 1598 : 28; + 1599 : D0; + 159A : 13; + 159B : C4; + 159C : 83; + 159D : D0; + 159E : 0F; + 159F : E4; + 15A0 : 82; + 15A1 : D0; + 15A2 : 0B; + 15A3 : 48; + 15A4 : 18; + 15A5 : 65; + 15A6 : 82; + 15A7 : 85; + 15A8 : 82; + 15A9 : 90; + 15AA : 02; + 15AB : E6; + 15AC : 83; + 15AD : 68; + 15AE : 86; + 15AF : 71; + 15B0 : 84; + 15B1 : 72; + 15B2 : 60; + 15B3 : C4; + 15B4 : 67; + 15B5 : D0; + 15B6 : 0C; + 15B7 : C5; + 15B8 : 66; + 15B9 : D0; + 15BA : 08; + 15BB : 85; + 15BC : 65; + 15BD : E9; + 15BE : 03; + 15BF : 85; + 15C0 : 66; + 15C1 : A0; + 15C2 : 00; + 15C3 : 60; + 15C4 : 20; + 15C5 : 79; + 15C6 : D6; + 15C7 : 8A; + 15C8 : 48; + 15C9 : A9; + 15CA : 01; + 15CB : 20; + 15CC : 61; + 15CD : D3; + 15CE : 68; + 15CF : A0; + 15D0 : 00; + 15D1 : 91; + 15D2 : B1; + [15D3..15D4] : 68; + 15D5 : 4C; + 15D6 : AA; + 15D7 : D3; + 15D8 : 20; + 15D9 : 37; + 15DA : D6; + 15DB : D1; + 15DC : 9F; + 15DD : 98; + 15DE : 90; + 15DF : 04; + 15E0 : B1; + 15E1 : 9F; + 15E2 : AA; + 15E3 : 98; + 15E4 : 48; + 15E5 : 8A; + 15E6 : 48; + 15E7 : 20; + 15E8 : 61; + 15E9 : D3; + 15EA : A5; + 15EB : 9F; + 15EC : A4; + 15ED : A0; + 15EE : 20; + 15EF : 82; + 15F0 : D5; + 15F1 : 68; + 15F2 : A8; + 15F3 : 68; + 15F4 : 18; + 15F5 : 65; + 15F6 : 71; + 15F7 : 85; + 15F8 : 71; + 15F9 : 90; + 15FA : 02; + 15FB : E6; + 15FC : 72; + 15FD : 98; + 15FE : 20; + 15FF : 64; + 1600 : D5; + 1601 : 4C; + 1602 : AA; + 1603 : D3; + 1604 : 20; + 1605 : 37; + 1606 : D6; + 1607 : 18; + 1608 : F1; + 1609 : 9F; + 160A : 49; + 160B : FF; + 160C : 4C; + 160D : DE; + 160E : D5; + 160F : A9; + 1610 : FF; + 1611 : 85; + 1612 : B4; + 1613 : 20; + 1614 : C8; + 1615 : 00; + 1616 : C9; + 1617 : 29; + 1618 : F0; + 1619 : 06; + 161A : 20; + 161B : 11; + 161C : CE; + 161D : 20; + 161E : 76; + 161F : D6; + 1620 : 20; + 1621 : 37; + 1622 : D6; + 1623 : CA; + 1624 : 8A; + 1625 : 48; + 1626 : 18; + 1627 : A2; + 1628 : 00; + 1629 : F1; + 162A : 9F; + 162B : B0; + 162C : B8; + 162D : 49; + 162E : FF; + 162F : C5; + 1630 : B4; + 1631 : 90; + 1632 : B3; + 1633 : A5; + 1634 : B4; + 1635 : B0; + 1636 : AF; + 1637 : 20; + 1638 : 0B; + 1639 : CE; + 163A : 68; + 163B : 85; + 163C : A4; + 163D : 68; + 163E : 85; + 163F : A5; + [1640..1642] : 68; + 1643 : AA; + 1644 : 68; + 1645 : 85; + 1646 : 9F; + 1647 : 68; + 1648 : 85; + [1649..164A] : A0; + 164B : 00; + 164C : 8A; + 164D : F0; + 164E : 21; + 164F : E6; + 1650 : A4; + 1651 : 6C; + 1652 : A4; + 1653 : 00; + 1654 : 20; + 1655 : 5A; + 1656 : D6; + 1657 : 4C; + 1658 : 87; + 1659 : D2; + 165A : 20; + 165B : 7B; + 165C : D5; + 165D : A2; + 165E : 00; + 165F : 86; + 1660 : 5E; + 1661 : A8; + 1662 : 60; + 1663 : 20; + 1664 : 5A; + 1665 : D6; + 1666 : F0; + 1667 : 08; + 1668 : A0; + 1669 : 00; + 166A : B1; + 166B : 71; + 166C : A8; + 166D : 4C; + 166E : 57; + 166F : D6; + 1670 : 4C; + 1671 : 30; + 1672 : D1; + 1673 : 20; + 1674 : C2; + 1675 : 00; + 1676 : 20; + 1677 : A4; + 1678 : CC; + 1679 : 20; + 167A : A3; + 167B : D0; + 167C : A6; + 167D : B3; + 167E : D0; + 167F : F0; + 1680 : A6; + 1681 : B4; + 1682 : 4C; + 1683 : C8; + 1684 : 00; + 1685 : 20; + 1686 : 5A; + 1687 : D6; + 1688 : D0; + 1689 : 03; + 168A : 4C; + 168B : CC; + 168C : D7; + 168D : A6; + 168E : C9; + 168F : A4; + 1690 : CA; + 1691 : 86; + 1692 : C0; + 1693 : 84; + 1694 : C1; + 1695 : A6; + 1696 : 71; + 1697 : 86; + 1698 : C9; + 1699 : 18; + 169A : 65; + 169B : 71; + 169C : 85; + 169D : 73; + 169E : A6; + 169F : 72; + 16A0 : 86; + 16A1 : CA; + 16A2 : 90; + 16A3 : 01; + 16A4 : E8; + 16A5 : 86; + 16A6 : 74; + 16A7 : A0; + 16A8 : 00; + 16A9 : B1; + 16AA : 73; + 16AB : 48; + 16AC : A9; + 16AD : 00; + 16AE : 91; + 16AF : 73; + 16B0 : 20; + 16B1 : C8; + 16B2 : 00; + 16B3 : 20; + 16B4 : C5; + 16B5 : DB; + 16B6 : 68; + 16B7 : A0; + 16B8 : 00; + 16B9 : 91; + 16BA : 73; + 16BB : A6; + 16BC : C0; + 16BD : A4; + 16BE : C1; + 16BF : 86; + 16C0 : C9; + 16C1 : 84; + 16C2 : CA; + 16C3 : 60; + 16C4 : 20; + 16C5 : A4; + 16C6 : CC; + 16C7 : 20; + 16C8 : D0; + 16C9 : D6; + 16CA : 20; + 16CB : 11; + 16CC : CE; + 16CD : 4C; + 16CE : 76; + 16CF : D6; + 16D0 : A5; + 16D1 : B5; + 16D2 : 30; + 16D3 : 9C; + 16D4 : A5; + 16D5 : B0; + 16D6 : C9; + 16D7 : 91; + 16D8 : B0; + 16D9 : 96; + 16DA : 20; + 16DB : 6D; + 16DC : DB; + 16DD : A5; + 16DE : B3; + 16DF : A4; + 16E0 : B4; + 16E1 : 84; + 16E2 : 08; + 16E3 : 85; + 16E4 : 09; + 16E5 : 60; + 16E6 : 20; + 16E7 : D0; + 16E8 : D6; + 16E9 : A0; + 16EA : 00; + 16EB : C9; + 16EC : C0; + 16ED : 90; + 16EE : 04; + 16EF : C9; + 16F0 : E1; + 16F1 : 90; + 16F2 : 03; + 16F3 : B1; + 16F4 : 08; + 16F5 : A8; + 16F6 : 4C; + 16F7 : 87; + 16F8 : D2; + 16F9 : 20; + 16FA : C4; + 16FB : D6; + 16FC : 8A; + 16FD : A0; + 16FE : 00; + 16FF : 91; + 1700 : 08; + 1701 : 60; + 1702 : 20; + 1703 : C4; + 1704 : D6; + 1705 : 86; + 1706 : 98; + 1707 : A2; + 1708 : 00; + 1709 : 20; + 170A : C8; + 170B : 00; + 170C : F0; + 170D : 03; + 170E : 20; + 170F : CA; + 1710 : D6; + 1711 : 86; + 1712 : 99; + 1713 : A0; + 1714 : 00; + 1715 : B1; + 1716 : 08; + 1717 : 45; + 1718 : 99; + 1719 : 25; + 171A : 98; + 171B : F0; + 171C : F8; + 171D : 60; + 171E : A9; + 171F : E3; + 1720 : A0; + 1721 : DD; + 1722 : 4C; + 1723 : 3C; + 1724 : D7; + 1725 : 20; + 1726 : 5E; + 1727 : D9; + 1728 : A5; + 1729 : B5; + 172A : 49; + 172B : FF; + 172C : 85; + 172D : B5; + 172E : 45; + 172F : BD; + 1730 : 85; + 1731 : BE; + 1732 : A5; + 1733 : B0; + 1734 : 4C; + 1735 : 3F; + 1736 : D7; + 1737 : 20; + 1738 : 6E; + 1739 : D8; + 173A : 90; + 173B : 3C; + 173C : 20; + 173D : 5E; + 173E : D9; + 173F : D0; + 1740 : 03; + 1741 : 4C; + 1742 : CE; + 1743 : DA; + 1744 : A6; + 1745 : BF; + 1746 : 86; + 1747 : A5; + 1748 : A2; + 1749 : B8; + 174A : A5; + 174B : B8; + 174C : A8; + 174D : F0; + 174E : CE; + 174F : 38; + 1750 : E5; + 1751 : B0; + 1752 : F0; + 1753 : 24; + 1754 : 90; + 1755 : 12; + 1756 : 84; + 1757 : B0; + 1758 : A4; + 1759 : BD; + 175A : 84; + 175B : B5; + 175C : 49; + 175D : FF; + 175E : 69; + 175F : 00; + 1760 : A0; + 1761 : 00; + 1762 : 84; + 1763 : A5; + 1764 : A2; + 1765 : B0; + 1766 : D0; + 1767 : 04; + 1768 : A0; + 1769 : 00; + 176A : 84; + 176B : BF; + 176C : C9; + 176D : F9; + 176E : 30; + 176F : C7; + 1770 : A8; + 1771 : A5; + 1772 : BF; + 1773 : 56; + 1774 : 01; + 1775 : 20; + 1776 : 85; + 1777 : D8; + 1778 : 24; + 1779 : BE; + 177A : 10; + 177B : 57; + 177C : A0; + 177D : B0; + 177E : E0; + 177F : B8; + 1780 : F0; + 1781 : 02; + 1782 : A0; + 1783 : B8; + 1784 : 38; + 1785 : 49; + 1786 : FF; + 1787 : 65; + 1788 : A5; + 1789 : 85; + 178A : BF; + 178B : B9; + 178C : 04; + 178D : 00; + 178E : F5; + 178F : 04; + 1790 : 85; + 1791 : B4; + 1792 : B9; + 1793 : 03; + 1794 : 00; + 1795 : F5; + 1796 : 03; + 1797 : 85; + 1798 : B3; + 1799 : B9; + 179A : 02; + 179B : 00; + 179C : F5; + 179D : 02; + 179E : 85; + 179F : B2; + 17A0 : B9; + 17A1 : 01; + 17A2 : 00; + 17A3 : F5; + 17A4 : 01; + 17A5 : 85; + 17A6 : B1; + 17A7 : B0; + 17A8 : 03; + 17A9 : 20; + 17AA : 1C; + 17AB : D8; + 17AC : A0; + 17AD : 00; + 17AE : 98; + 17AF : 18; + 17B0 : A6; + 17B1 : B1; + 17B2 : D0; + 17B3 : 4A; + 17B4 : A6; + 17B5 : B2; + 17B6 : 86; + 17B7 : B1; + 17B8 : A6; + 17B9 : B3; + 17BA : 86; + 17BB : B2; + 17BC : A6; + 17BD : B4; + 17BE : 86; + 17BF : B3; + 17C0 : A6; + 17C1 : BF; + 17C2 : 86; + 17C3 : B4; + 17C4 : 84; + 17C5 : BF; + 17C6 : 69; + 17C7 : 08; + 17C8 : C9; + 17C9 : 20; + 17CA : D0; + 17CB : E4; + 17CC : A9; + 17CD : 00; + 17CE : 85; + 17CF : B0; + 17D0 : 85; + 17D1 : B5; + 17D2 : 60; + 17D3 : 65; + 17D4 : A5; + 17D5 : 85; + 17D6 : BF; + 17D7 : A5; + 17D8 : B4; + 17D9 : 65; + 17DA : BC; + 17DB : 85; + 17DC : B4; + 17DD : A5; + 17DE : B3; + 17DF : 65; + 17E0 : BB; + 17E1 : 85; + 17E2 : B3; + 17E3 : A5; + 17E4 : B2; + 17E5 : 65; + 17E6 : BA; + 17E7 : 85; + 17E8 : B2; + 17E9 : A5; + 17EA : B1; + 17EB : 65; + 17EC : B9; + 17ED : 85; + 17EE : B1; + 17EF : 4C; + 17F0 : 0B; + 17F1 : D8; + 17F2 : 69; + 17F3 : 01; + 17F4 : 06; + 17F5 : BF; + 17F6 : 26; + 17F7 : B4; + 17F8 : 26; + 17F9 : B3; + 17FA : 26; + 17FB : B2; + 17FC : 26; + 17FD : B1; + 17FE : 10; + 17FF : F2; + 1800 : 38; + 1801 : E5; + [1802..1803] : B0; + 1804 : C7; + 1805 : 49; + 1806 : FF; + 1807 : 69; + 1808 : 01; + 1809 : 85; + 180A : B0; + 180B : 90; + 180C : 0E; + 180D : E6; + 180E : B0; + 180F : F0; + 1810 : 42; + 1811 : 66; + 1812 : B1; + 1813 : 66; + 1814 : B2; + 1815 : 66; + 1816 : B3; + 1817 : 66; + 1818 : B4; + 1819 : 66; + 181A : BF; + 181B : 60; + 181C : A5; + 181D : B5; + 181E : 49; + 181F : FF; + 1820 : 85; + 1821 : B5; + 1822 : A5; + 1823 : B1; + 1824 : 49; + 1825 : FF; + 1826 : 85; + 1827 : B1; + 1828 : A5; + 1829 : B2; + 182A : 49; + 182B : FF; + 182C : 85; + 182D : B2; + 182E : A5; + 182F : B3; + 1830 : 49; + 1831 : FF; + 1832 : 85; + 1833 : B3; + 1834 : A5; + 1835 : B4; + 1836 : 49; + 1837 : FF; + 1838 : 85; + 1839 : B4; + 183A : A5; + 183B : BF; + 183C : 49; + 183D : FF; + 183E : 85; + 183F : BF; + 1840 : E6; + 1841 : BF; + 1842 : D0; + 1843 : 0E; + 1844 : E6; + 1845 : B4; + 1846 : D0; + 1847 : 0A; + 1848 : E6; + 1849 : B3; + 184A : D0; + 184B : 06; + 184C : E6; + 184D : B2; + 184E : D0; + 184F : 02; + 1850 : E6; + 1851 : B1; + 1852 : 60; + 1853 : A2; + 1854 : 4A; + 1855 : 4C; + 1856 : 59; + 1857 : C3; + 1858 : A2; + 1859 : 74; + 185A : B4; + 185B : 04; + 185C : 84; + 185D : BF; + 185E : B4; + 185F : 03; + 1860 : 94; + 1861 : 04; + 1862 : B4; + 1863 : 02; + 1864 : 94; + 1865 : 03; + 1866 : B4; + 1867 : 01; + 1868 : 94; + 1869 : 02; + 186A : A4; + 186B : B7; + 186C : 94; + 186D : 01; + 186E : 69; + 186F : 08; + 1870 : 30; + 1871 : E8; + 1872 : F0; + 1873 : E6; + 1874 : E9; + 1875 : 08; + 1876 : A8; + 1877 : A5; + 1878 : BF; + 1879 : B0; + 187A : 14; + 187B : 16; + 187C : 01; + 187D : 90; + 187E : 02; + 187F : F6; + 1880 : 01; + 1881 : 76; + 1882 : 01; + 1883 : 76; + 1884 : 01; + 1885 : 76; + 1886 : 02; + 1887 : 76; + 1888 : 03; + 1889 : 76; + 188A : 04; + 188B : 6A; + 188C : C8; + 188D : D0; + 188E : EC; + 188F : 18; + 1890 : 60; + 1891 : 81; + [1892..1895] : 00; + 1896 : 03; + 1897 : 7F; + 1898 : 5E; + 1899 : 56; + 189A : CB; + 189B : 79; + 189C : 80; + 189D : 13; + 189E : 9B; + 189F : 0B; + 18A0 : 64; + 18A1 : 80; + 18A2 : 76; + 18A3 : 38; + 18A4 : 93; + 18A5 : 16; + 18A6 : 82; + 18A7 : 38; + 18A8 : AA; + 18A9 : 3B; + 18AA : 20; + 18AB : 80; + 18AC : 35; + 18AD : 04; + 18AE : F3; + 18AF : 34; + 18B0 : 81; + 18B1 : 35; + 18B2 : 04; + 18B3 : F3; + 18B4 : 34; + [18B5..18B6] : 80; + [18B7..18B9] : 00; + 18BA : 80; + 18BB : 31; + 18BC : 72; + 18BD : 17; + 18BE : F8; + 18BF : 20; + 18C0 : FD; + 18C1 : DA; + 18C2 : F0; + 18C3 : 02; + 18C4 : 10; + 18C5 : 03; + 18C6 : 4C; + 18C7 : 30; + 18C8 : D1; + 18C9 : A5; + 18CA : B0; + 18CB : E9; + 18CC : 7F; + 18CD : 48; + 18CE : A9; + 18CF : 80; + 18D0 : 85; + 18D1 : B0; + 18D2 : A9; + 18D3 : AB; + 18D4 : A0; + 18D5 : D8; + 18D6 : 20; + 18D7 : 3C; + 18D8 : D7; + 18D9 : A9; + 18DA : B0; + 18DB : A0; + 18DC : D8; + 18DD : 20; + 18DE : E1; + 18DF : D9; + 18E0 : A9; + 18E1 : 91; + 18E2 : A0; + 18E3 : D8; + 18E4 : 20; + 18E5 : 25; + 18E6 : D7; + 18E7 : A9; + 18E8 : 96; + 18E9 : A0; + 18EA : D8; + 18EB : 20; + 18EC : F3; + 18ED : DE; + 18EE : A9; + 18EF : B5; + 18F0 : A0; + 18F1 : D8; + 18F2 : 20; + 18F3 : 3C; + 18F4 : D7; + 18F5 : 68; + 18F6 : 20; + 18F7 : 50; + 18F8 : DC; + 18F9 : A9; + 18FA : BA; + 18FB : A0; + 18FC : D8; + 18FD : 20; + 18FE : 5E; + 18FF : D9; + 1900 : F0; + 1901 : 5B; + 1902 : 20; + 1903 : 89; + 1904 : D9; + 1905 : A9; + 1906 : 00; + 1907 : 85; + 1908 : 75; + 1909 : 85; + 190A : 76; + 190B : 85; + 190C : 77; + 190D : 85; + 190E : 78; + 190F : A5; + 1910 : BF; + 1911 : 20; + 1912 : 2B; + 1913 : D9; + 1914 : A5; + 1915 : B4; + 1916 : 20; + 1917 : 2B; + 1918 : D9; + 1919 : A5; + 191A : B3; + 191B : 20; + 191C : 2B; + 191D : D9; + 191E : A5; + 191F : B2; + 1920 : 20; + 1921 : 2B; + 1922 : D9; + 1923 : A5; + 1924 : B1; + 1925 : 20; + 1926 : 30; + 1927 : D9; + 1928 : 4C; + 1929 : 61; + 192A : DA; + 192B : D0; + 192C : 03; + 192D : 4C; + 192E : 58; + 192F : D8; + 1930 : 4A; + 1931 : 09; + 1932 : 80; + 1933 : A8; + 1934 : 90; + 1935 : 19; + 1936 : 18; + 1937 : A5; + 1938 : 78; + 1939 : 65; + 193A : BC; + 193B : 85; + 193C : 78; + 193D : A5; + 193E : 77; + 193F : 65; + 1940 : BB; + 1941 : 85; + 1942 : 77; + 1943 : A5; + 1944 : 76; + 1945 : 65; + 1946 : BA; + 1947 : 85; + 1948 : 76; + 1949 : A5; + 194A : 75; + 194B : 65; + 194C : B9; + 194D : 85; + 194E : 75; + 194F : 66; + 1950 : 75; + 1951 : 66; + 1952 : 76; + 1953 : 66; + 1954 : 77; + 1955 : 66; + 1956 : 78; + 1957 : 66; + 1958 : BF; + 1959 : 98; + 195A : 4A; + 195B : D0; + 195C : D6; + 195D : 60; + 195E : 85; + 195F : 71; + 1960 : 84; + 1961 : 72; + 1962 : A0; + 1963 : 04; + 1964 : B1; + 1965 : 71; + 1966 : 85; + 1967 : BC; + 1968 : 88; + 1969 : B1; + 196A : 71; + 196B : 85; + 196C : BB; + 196D : 88; + 196E : B1; + 196F : 71; + 1970 : 85; + 1971 : BA; + 1972 : 88; + 1973 : B1; + 1974 : 71; + 1975 : 85; + 1976 : BD; + 1977 : 45; + 1978 : B5; + 1979 : 85; + 197A : BE; + 197B : A5; + 197C : BD; + 197D : 09; + 197E : 80; + 197F : 85; + 1980 : B9; + 1981 : 88; + 1982 : B1; + 1983 : 71; + 1984 : 85; + 1985 : B8; + 1986 : A5; + 1987 : B0; + 1988 : 60; + 1989 : A5; + 198A : B8; + 198B : F0; + 198C : 1F; + 198D : 18; + 198E : 65; + 198F : B0; + 1990 : 90; + 1991 : 04; + 1992 : 30; + 1993 : 1D; + 1994 : 18; + 1995 : 2C; + 1996 : 10; + 1997 : 14; + 1998 : 69; + 1999 : 80; + 199A : 85; + 199B : B0; + 199C : D0; + 199D : 03; + 199E : 4C; + 199F : D0; + 19A0 : D7; + 19A1 : A5; + 19A2 : BE; + 19A3 : 85; + 19A4 : B5; + 19A5 : 60; + 19A6 : A5; + 19A7 : B5; + 19A8 : 49; + 19A9 : FF; + 19AA : 30; + 19AB : 05; + [19AC..19AD] : 68; + 19AE : 4C; + 19AF : CC; + 19B0 : D7; + 19B1 : 4C; + 19B2 : 53; + 19B3 : D8; + 19B4 : 20; + 19B5 : DE; + 19B6 : DA; + 19B7 : AA; + 19B8 : F0; + 19B9 : 10; + 19BA : 18; + 19BB : 69; + 19BC : 02; + 19BD : B0; + 19BE : F2; + 19BF : A2; + 19C0 : 00; + 19C1 : 86; + 19C2 : BE; + 19C3 : 20; + 19C4 : 4C; + 19C5 : D7; + 19C6 : E6; + 19C7 : B0; + 19C8 : F0; + 19C9 : E7; + 19CA : 60; + 19CB : 84; + 19CC : 20; + [19CD..19CF] : 00; + 19D0 : 20; + 19D1 : DE; + 19D2 : DA; + 19D3 : A9; + 19D4 : CB; + 19D5 : A0; + 19D6 : D9; + 19D7 : A2; + 19D8 : 00; + 19D9 : 86; + 19DA : BE; + 19DB : 20; + 19DC : 74; + 19DD : DA; + 19DE : 4C; + 19DF : E4; + 19E0 : D9; + 19E1 : 20; + 19E2 : 5E; + 19E3 : D9; + 19E4 : F0; + 19E5 : 76; + 19E6 : 20; + 19E7 : ED; + 19E8 : DA; + 19E9 : A9; + 19EA : 00; + 19EB : 38; + 19EC : E5; + 19ED : B0; + 19EE : 85; + 19EF : B0; + 19F0 : 20; + 19F1 : 89; + 19F2 : D9; + 19F3 : E6; + 19F4 : B0; + 19F5 : F0; + 19F6 : BA; + 19F7 : A2; + 19F8 : FC; + 19F9 : A9; + 19FA : 01; + 19FB : A4; + 19FC : B9; + 19FD : C4; + 19FE : B1; + 19FF : D0; + 1A00 : 10; + 1A01 : A4; + 1A02 : BA; + 1A03 : C4; + 1A04 : B2; + 1A05 : D0; + 1A06 : 0A; + 1A07 : A4; + 1A08 : BB; + 1A09 : C4; + 1A0A : B3; + 1A0B : D0; + 1A0C : 04; + 1A0D : A4; + 1A0E : BC; + 1A0F : C4; + 1A10 : B4; + 1A11 : 08; + 1A12 : 2A; + 1A13 : 90; + 1A14 : 09; + 1A15 : E8; + 1A16 : 95; + 1A17 : 78; + 1A18 : F0; + 1A19 : 32; + 1A1A : 10; + 1A1B : 34; + 1A1C : A9; + 1A1D : 01; + 1A1E : 28; + 1A1F : B0; + 1A20 : 0E; + 1A21 : 06; + 1A22 : BC; + 1A23 : 26; + 1A24 : BB; + 1A25 : 26; + 1A26 : BA; + 1A27 : 26; + 1A28 : B9; + 1A29 : B0; + 1A2A : E6; + 1A2B : 30; + 1A2C : CE; + 1A2D : 10; + 1A2E : E2; + 1A2F : A8; + 1A30 : A5; + 1A31 : BC; + 1A32 : E5; + 1A33 : B4; + 1A34 : 85; + 1A35 : BC; + 1A36 : A5; + 1A37 : BB; + 1A38 : E5; + 1A39 : B3; + 1A3A : 85; + 1A3B : BB; + 1A3C : A5; + 1A3D : BA; + 1A3E : E5; + 1A3F : B2; + 1A40 : 85; + 1A41 : BA; + 1A42 : A5; + 1A43 : B9; + 1A44 : E5; + 1A45 : B1; + 1A46 : 85; + 1A47 : B9; + 1A48 : 98; + 1A49 : 4C; + 1A4A : 21; + 1A4B : DA; + 1A4C : A9; + 1A4D : 40; + 1A4E : D0; + 1A4F : CE; + [1A50..1A55] : 0A; + 1A56 : 85; + 1A57 : BF; + 1A58 : 28; + 1A59 : 4C; + 1A5A : 61; + 1A5B : DA; + 1A5C : A2; + 1A5D : 8A; + 1A5E : 4C; + 1A5F : 59; + 1A60 : C3; + 1A61 : A5; + 1A62 : 75; + 1A63 : 85; + 1A64 : B1; + 1A65 : A5; + 1A66 : 76; + 1A67 : 85; + 1A68 : B2; + 1A69 : A5; + 1A6A : 77; + 1A6B : 85; + 1A6C : B3; + 1A6D : A5; + 1A6E : 78; + 1A6F : 85; + 1A70 : B4; + 1A71 : 4C; + 1A72 : AC; + 1A73 : D7; + 1A74 : 85; + 1A75 : 71; + 1A76 : 84; + 1A77 : 72; + 1A78 : A0; + 1A79 : 04; + 1A7A : B1; + 1A7B : 71; + 1A7C : 85; + 1A7D : B4; + 1A7E : 88; + 1A7F : B1; + 1A80 : 71; + 1A81 : 85; + 1A82 : B3; + 1A83 : 88; + 1A84 : B1; + 1A85 : 71; + 1A86 : 85; + 1A87 : B2; + 1A88 : 88; + 1A89 : B1; + 1A8A : 71; + 1A8B : 85; + 1A8C : B5; + 1A8D : 09; + 1A8E : 80; + 1A8F : 85; + 1A90 : B1; + 1A91 : 88; + 1A92 : B1; + 1A93 : 71; + 1A94 : 85; + 1A95 : B0; + 1A96 : 84; + 1A97 : BF; + 1A98 : 60; + 1A99 : A2; + 1A9A : AB; + 1A9B : 2C; + 1A9C : A2; + 1A9D : A6; + 1A9E : A0; + 1A9F : 00; + 1AA0 : F0; + 1AA1 : 04; + 1AA2 : A6; + 1AA3 : 98; + 1AA4 : A4; + 1AA5 : 99; + 1AA6 : 20; + 1AA7 : ED; + 1AA8 : DA; + 1AA9 : 86; + 1AAA : 71; + 1AAB : 84; + 1AAC : 72; + 1AAD : A0; + 1AAE : 04; + 1AAF : A5; + 1AB0 : B4; + 1AB1 : 91; + 1AB2 : 71; + 1AB3 : 88; + 1AB4 : A5; + 1AB5 : B3; + 1AB6 : 91; + 1AB7 : 71; + 1AB8 : 88; + 1AB9 : A5; + 1ABA : B2; + 1ABB : 91; + 1ABC : 71; + 1ABD : 88; + 1ABE : A5; + 1ABF : B5; + 1AC0 : 09; + 1AC1 : 7F; + 1AC2 : 25; + 1AC3 : B1; + 1AC4 : 91; + 1AC5 : 71; + 1AC6 : 88; + 1AC7 : A5; + 1AC8 : B0; + 1AC9 : 91; + 1ACA : 71; + 1ACB : 84; + 1ACC : BF; + 1ACD : 60; + 1ACE : A5; + 1ACF : BD; + 1AD0 : 85; + 1AD1 : B5; + 1AD2 : A2; + 1AD3 : 05; + 1AD4 : B5; + 1AD5 : B7; + 1AD6 : 95; + 1AD7 : AF; + 1AD8 : CA; + 1AD9 : D0; + 1ADA : F9; + 1ADB : 86; + 1ADC : BF; + 1ADD : 60; + 1ADE : 20; + 1ADF : ED; + 1AE0 : DA; + 1AE1 : A2; + 1AE2 : 06; + 1AE3 : B5; + 1AE4 : AF; + 1AE5 : 95; + 1AE6 : B7; + 1AE7 : CA; + 1AE8 : D0; + 1AE9 : F9; + 1AEA : 86; + 1AEB : BF; + 1AEC : 60; + 1AED : A5; + 1AEE : B0; + 1AEF : F0; + 1AF0 : FB; + 1AF1 : 06; + 1AF2 : BF; + 1AF3 : 90; + 1AF4 : F7; + 1AF5 : 20; + 1AF6 : 44; + 1AF7 : D8; + 1AF8 : D0; + 1AF9 : F2; + 1AFA : 4C; + 1AFB : 0D; + 1AFC : D8; + 1AFD : A5; + 1AFE : B0; + 1AFF : F0; + 1B00 : 09; + 1B01 : A5; + 1B02 : B5; + 1B03 : 2A; + 1B04 : A9; + 1B05 : FF; + 1B06 : B0; + 1B07 : 02; + 1B08 : A9; + 1B09 : 01; + 1B0A : 60; + 1B0B : 20; + 1B0C : FD; + 1B0D : DA; + 1B0E : 85; + 1B0F : B1; + 1B10 : A9; + 1B11 : 00; + 1B12 : 85; + 1B13 : B2; + 1B14 : A2; + 1B15 : 88; + 1B16 : A5; + 1B17 : B1; + 1B18 : 49; + 1B19 : FF; + 1B1A : 2A; + 1B1B : A9; + 1B1C : 00; + 1B1D : 85; + 1B1E : B4; + 1B1F : 85; + 1B20 : B3; + 1B21 : 86; + 1B22 : B0; + 1B23 : 85; + 1B24 : BF; + 1B25 : 85; + 1B26 : B5; + 1B27 : 4C; + 1B28 : A7; + 1B29 : D7; + 1B2A : 46; + 1B2B : B5; + 1B2C : 60; + 1B2D : 85; + 1B2E : 73; + 1B2F : 84; + 1B30 : 74; + 1B31 : A0; + 1B32 : 00; + 1B33 : B1; + 1B34 : 73; + 1B35 : C8; + 1B36 : AA; + 1B37 : F0; + 1B38 : C4; + 1B39 : B1; + 1B3A : 73; + 1B3B : 45; + 1B3C : B5; + 1B3D : 30; + 1B3E : C2; + 1B3F : E4; + 1B40 : B0; + 1B41 : D0; + 1B42 : 21; + 1B43 : B1; + 1B44 : 73; + 1B45 : 09; + 1B46 : 80; + 1B47 : C5; + 1B48 : B1; + 1B49 : D0; + 1B4A : 19; + 1B4B : C8; + 1B4C : B1; + 1B4D : 73; + 1B4E : C5; + 1B4F : B2; + 1B50 : D0; + 1B51 : 12; + 1B52 : C8; + 1B53 : B1; + 1B54 : 73; + 1B55 : C5; + 1B56 : B3; + 1B57 : D0; + 1B58 : 0B; + 1B59 : C8; + 1B5A : A9; + 1B5B : 7F; + 1B5C : C5; + 1B5D : BF; + 1B5E : B1; + 1B5F : 73; + 1B60 : E5; + 1B61 : B4; + 1B62 : F0; + 1B63 : 28; + 1B64 : A5; + 1B65 : B5; + 1B66 : 90; + 1B67 : 02; + 1B68 : 49; + 1B69 : FF; + 1B6A : 4C; + 1B6B : 03; + 1B6C : DB; + 1B6D : A5; + 1B6E : B0; + 1B6F : F0; + 1B70 : 4A; + 1B71 : 38; + 1B72 : E9; + 1B73 : A0; + 1B74 : 24; + 1B75 : B5; + 1B76 : 10; + 1B77 : 09; + 1B78 : AA; + 1B79 : A9; + 1B7A : FF; + 1B7B : 85; + 1B7C : B7; + 1B7D : 20; + 1B7E : 22; + 1B7F : D8; + 1B80 : 8A; + 1B81 : A2; + 1B82 : B0; + 1B83 : C9; + 1B84 : F9; + 1B85 : 10; + 1B86 : 06; + 1B87 : 20; + 1B88 : 6E; + 1B89 : D8; + 1B8A : 84; + 1B8B : B7; + 1B8C : 60; + 1B8D : A8; + 1B8E : A5; + 1B8F : B5; + 1B90 : 29; + 1B91 : 80; + 1B92 : 46; + 1B93 : B1; + 1B94 : 05; + 1B95 : B1; + 1B96 : 85; + 1B97 : B1; + 1B98 : 20; + 1B99 : 85; + 1B9A : D8; + 1B9B : 84; + 1B9C : B7; + 1B9D : 60; + 1B9E : A5; + 1B9F : B0; + 1BA0 : C9; + 1BA1 : A0; + 1BA2 : B0; + [1BA3..1BA4] : 20; + 1BA5 : 6D; + 1BA6 : DB; + 1BA7 : 84; + 1BA8 : BF; + 1BA9 : A5; + 1BAA : B5; + 1BAB : 84; + 1BAC : B5; + 1BAD : 49; + 1BAE : 80; + 1BAF : 2A; + 1BB0 : A9; + 1BB1 : A0; + 1BB2 : 85; + 1BB3 : B0; + 1BB4 : A5; + 1BB5 : B4; + 1BB6 : 85; + 1BB7 : 5A; + 1BB8 : 4C; + 1BB9 : A7; + 1BBA : D7; + 1BBB : 85; + 1BBC : B1; + 1BBD : 85; + 1BBE : B2; + 1BBF : 85; + 1BC0 : B3; + 1BC1 : 85; + 1BC2 : B4; + 1BC3 : A8; + 1BC4 : 60; + 1BC5 : A0; + 1BC6 : 00; + 1BC7 : A2; + 1BC8 : 0A; + 1BC9 : 94; + 1BCA : AC; + 1BCB : CA; + 1BCC : 10; + 1BCD : FB; + 1BCE : 90; + 1BCF : 0F; + 1BD0 : C9; + 1BD1 : 2D; + 1BD2 : D0; + 1BD3 : 04; + 1BD4 : 86; + 1BD5 : B6; + 1BD6 : F0; + 1BD7 : 04; + 1BD8 : C9; + 1BD9 : 2B; + 1BDA : D0; + 1BDB : 05; + 1BDC : 20; + 1BDD : C2; + 1BDE : 00; + 1BDF : 90; + 1BE0 : 5B; + 1BE1 : C9; + 1BE2 : 2E; + 1BE3 : F0; + 1BE4 : 2E; + 1BE5 : C9; + 1BE6 : 45; + 1BE7 : D0; + 1BE8 : 30; + 1BE9 : 20; + 1BEA : C2; + 1BEB : 00; + 1BEC : 90; + 1BED : 17; + 1BEE : C9; + 1BEF : AB; + 1BF0 : F0; + 1BF1 : 0E; + 1BF2 : C9; + 1BF3 : 2D; + 1BF4 : F0; + 1BF5 : 0A; + 1BF6 : C9; + 1BF7 : AA; + 1BF8 : F0; + 1BF9 : 08; + 1BFA : C9; + 1BFB : 2B; + 1BFC : F0; + 1BFD : 04; + 1BFE : D0; + 1BFF : 07; + 1C00 : 66; + 1C01 : AF; + 1C02 : 20; + 1C03 : C2; + 1C04 : 00; + 1C05 : 90; + 1C06 : 5C; + 1C07 : 24; + 1C08 : AF; + 1C09 : 10; + 1C0A : 0E; + 1C0B : A9; + 1C0C : 00; + 1C0D : 38; + 1C0E : E5; + 1C0F : AD; + 1C10 : 4C; + 1C11 : 1B; + 1C12 : DC; + 1C13 : 66; + 1C14 : AE; + 1C15 : 24; + 1C16 : AE; + 1C17 : 50; + 1C18 : C3; + 1C19 : A5; + 1C1A : AD; + 1C1B : 38; + 1C1C : E5; + 1C1D : AC; + 1C1E : 85; + 1C1F : AD; + 1C20 : F0; + 1C21 : 12; + 1C22 : 10; + 1C23 : 09; + 1C24 : 20; + 1C25 : D0; + 1C26 : D9; + 1C27 : E6; + 1C28 : AD; + 1C29 : D0; + 1C2A : F9; + 1C2B : F0; + 1C2C : 07; + 1C2D : 20; + 1C2E : B4; + 1C2F : D9; + 1C30 : C6; + 1C31 : AD; + 1C32 : D0; + 1C33 : F9; + 1C34 : A5; + 1C35 : B6; + 1C36 : 30; + 1C37 : 01; + 1C38 : 60; + 1C39 : 4C; + 1C3A : 67; + 1C3B : DE; + 1C3C : 48; + 1C3D : 24; + 1C3E : AE; + 1C3F : 10; + 1C40 : 02; + 1C41 : E6; + 1C42 : AC; + 1C43 : 20; + 1C44 : B4; + 1C45 : D9; + 1C46 : 68; + 1C47 : 38; + 1C48 : E9; + 1C49 : 30; + 1C4A : 20; + 1C4B : 50; + 1C4C : DC; + 1C4D : 4C; + 1C4E : DC; + 1C4F : DB; + 1C50 : 48; + 1C51 : 20; + 1C52 : DE; + 1C53 : DA; + 1C54 : 68; + 1C55 : 20; + 1C56 : 0E; + 1C57 : DB; + 1C58 : A5; + 1C59 : BD; + 1C5A : 45; + 1C5B : B5; + 1C5C : 85; + 1C5D : BE; + 1C5E : A6; + 1C5F : B0; + 1C60 : 4C; + 1C61 : 3F; + 1C62 : D7; + 1C63 : A5; + 1C64 : AD; + 1C65 : C9; + 1C66 : 0C; + 1C67 : 90; + 1C68 : 09; + 1C69 : 24; + 1C6A : AF; + 1C6B : 30; + 1C6C : 03; + 1C6D : 4C; + 1C6E : 53; + 1C6F : D8; + 1C70 : A9; + 1C71 : 0B; + [1C72..1C73] : 0A; + 1C74 : 18; + 1C75 : 65; + 1C76 : AD; + 1C77 : 0A; + 1C78 : 18; + 1C79 : A0; + 1C7A : 00; + 1C7B : 71; + 1C7C : C9; + 1C7D : 38; + 1C7E : E9; + 1C7F : 30; + 1C80 : 85; + 1C81 : AD; + 1C82 : 4C; + 1C83 : 02; + 1C84 : DC; + 1C85 : 9B; + 1C86 : 3E; + 1C87 : BC; + 1C88 : 1F; + 1C89 : FD; + 1C8A : 9E; + 1C8B : 6E; + 1C8C : 6B; + 1C8D : 27; + 1C8E : FE; + 1C8F : 9E; + 1C90 : 6E; + 1C91 : 6B; + 1C92 : 28; + 1C93 : 00; + 1C94 : A9; + 1C95 : 94; + 1C96 : A0; + 1C97 : C2; + 1C98 : 20; + 1C99 : AC; + 1C9A : DC; + 1C9B : A5; + 1C9C : 89; + 1C9D : A6; + 1C9E : 88; + 1C9F : 85; + 1CA0 : B1; + 1CA1 : 86; + 1CA2 : B2; + 1CA3 : A2; + 1CA4 : 90; + 1CA5 : 38; + 1CA6 : 20; + 1CA7 : 1B; + 1CA8 : DB; + 1CA9 : 20; + 1CAA : AF; + 1CAB : DC; + 1CAC : 4C; + 1CAD : 27; + 1CAE : CA; + 1CAF : A0; + 1CB0 : 01; + 1CB1 : A9; + 1CB2 : 20; + 1CB3 : 24; + 1CB4 : B5; + 1CB5 : 10; + 1CB6 : 02; + 1CB7 : A9; + 1CB8 : 2D; + 1CB9 : 99; + 1CBA : FF; + 1CBB : 00; + 1CBC : 85; + 1CBD : B5; + 1CBE : 84; + 1CBF : C0; + 1CC0 : C8; + 1CC1 : A9; + 1CC2 : 30; + 1CC3 : A6; + 1CC4 : B0; + 1CC5 : D0; + 1CC6 : 03; + 1CC7 : 4C; + 1CC8 : D6; + 1CC9 : DD; + 1CCA : A9; + 1CCB : 00; + 1CCC : E0; + 1CCD : 80; + 1CCE : F0; + 1CCF : 02; + 1CD0 : B0; + 1CD1 : 09; + 1CD2 : A9; + 1CD3 : 8F; + 1CD4 : A0; + 1CD5 : DC; + 1CD6 : 20; + 1CD7 : FD; + 1CD8 : D8; + 1CD9 : A9; + 1CDA : F7; + 1CDB : 85; + 1CDC : AC; + 1CDD : A9; + 1CDE : 8A; + 1CDF : A0; + 1CE0 : DC; + 1CE1 : 20; + 1CE2 : 2D; + 1CE3 : DB; + 1CE4 : F0; + 1CE5 : 1E; + 1CE6 : 10; + 1CE7 : 12; + 1CE8 : A9; + 1CE9 : 85; + 1CEA : A0; + 1CEB : DC; + 1CEC : 20; + 1CED : 2D; + 1CEE : DB; + 1CEF : F0; + 1CF0 : 02; + 1CF1 : 10; + 1CF2 : 0E; + 1CF3 : 20; + 1CF4 : B4; + 1CF5 : D9; + 1CF6 : C6; + 1CF7 : AC; + 1CF8 : D0; + 1CF9 : EE; + 1CFA : 20; + 1CFB : D0; + 1CFC : D9; + 1CFD : E6; + 1CFE : AC; + 1CFF : D0; + 1D00 : DC; + 1D01 : 20; + 1D02 : 1E; + 1D03 : D7; + 1D04 : 20; + 1D05 : 6D; + 1D06 : DB; + 1D07 : A2; + 1D08 : 01; + 1D09 : A5; + 1D0A : AC; + 1D0B : 18; + 1D0C : 69; + 1D0D : 0A; + 1D0E : 30; + 1D0F : 09; + 1D10 : C9; + 1D11 : 0B; + 1D12 : B0; + 1D13 : 06; + 1D14 : 69; + 1D15 : FF; + 1D16 : AA; + 1D17 : A9; + 1D18 : 02; + 1D19 : 38; + 1D1A : E9; + 1D1B : 02; + 1D1C : 85; + 1D1D : AD; + 1D1E : 86; + 1D1F : AC; + 1D20 : 8A; + 1D21 : F0; + 1D22 : 02; + 1D23 : 10; + 1D24 : 13; + 1D25 : A4; + 1D26 : C0; + 1D27 : A9; + 1D28 : 2E; + 1D29 : C8; + 1D2A : 99; + 1D2B : FF; + 1D2C : 00; + 1D2D : 8A; + 1D2E : F0; + 1D2F : 06; + 1D30 : A9; + 1D31 : 30; + 1D32 : C8; + 1D33 : 99; + 1D34 : FF; + 1D35 : 00; + 1D36 : 84; + 1D37 : C0; + 1D38 : A0; + 1D39 : 00; + 1D3A : A2; + 1D3B : 80; + 1D3C : A5; + 1D3D : B4; + 1D3E : 18; + 1D3F : 79; + 1D40 : EB; + 1D41 : DD; + 1D42 : 85; + 1D43 : B4; + 1D44 : A5; + 1D45 : B3; + 1D46 : 79; + 1D47 : EA; + 1D48 : DD; + 1D49 : 85; + 1D4A : B3; + 1D4B : A5; + 1D4C : B2; + 1D4D : 79; + 1D4E : E9; + 1D4F : DD; + 1D50 : 85; + 1D51 : B2; + 1D52 : A5; + 1D53 : B1; + 1D54 : 79; + 1D55 : E8; + 1D56 : DD; + 1D57 : 85; + 1D58 : B1; + 1D59 : E8; + 1D5A : B0; + 1D5B : 04; + 1D5C : 10; + 1D5D : DE; + 1D5E : 30; + 1D5F : 02; + 1D60 : 30; + 1D61 : DA; + 1D62 : 8A; + 1D63 : 90; + 1D64 : 04; + 1D65 : 49; + 1D66 : FF; + 1D67 : 69; + 1D68 : 0A; + 1D69 : 69; + 1D6A : 2F; + [1D6B..1D6E] : C8; + 1D6F : 84; + 1D70 : 96; + 1D71 : A4; + 1D72 : C0; + 1D73 : C8; + 1D74 : AA; + 1D75 : 29; + 1D76 : 7F; + 1D77 : 99; + 1D78 : FF; + 1D79 : 00; + 1D7A : C6; + 1D7B : AC; + 1D7C : D0; + 1D7D : 06; + 1D7E : A9; + 1D7F : 2E; + 1D80 : C8; + 1D81 : 99; + 1D82 : FF; + 1D83 : 00; + 1D84 : 84; + 1D85 : C0; + 1D86 : A4; + 1D87 : 96; + 1D88 : 8A; + 1D89 : 49; + 1D8A : FF; + 1D8B : 29; + 1D8C : 80; + 1D8D : AA; + 1D8E : C0; + 1D8F : 24; + 1D90 : F0; + 1D91 : 04; + 1D92 : C0; + 1D93 : 3C; + 1D94 : D0; + 1D95 : A6; + 1D96 : A4; + 1D97 : C0; + 1D98 : B9; + 1D99 : FF; + 1D9A : 00; + 1D9B : 88; + 1D9C : C9; + 1D9D : 30; + 1D9E : F0; + 1D9F : F8; + 1DA0 : C9; + 1DA1 : 2E; + 1DA2 : F0; + 1DA3 : 01; + 1DA4 : C8; + 1DA5 : A9; + 1DA6 : 2B; + 1DA7 : A6; + 1DA8 : AD; + 1DA9 : F0; + 1DAA : 2E; + 1DAB : 10; + 1DAC : 08; + 1DAD : A9; + 1DAE : 00; + 1DAF : 38; + 1DB0 : E5; + 1DB1 : AD; + 1DB2 : AA; + 1DB3 : A9; + 1DB4 : 2D; + 1DB5 : 99; + [1DB6..1DB7] : 01; + 1DB8 : A9; + 1DB9 : 45; + 1DBA : 99; + 1DBB : 00; + 1DBC : 01; + 1DBD : 8A; + 1DBE : A2; + 1DBF : 2F; + 1DC0 : 38; + 1DC1 : E8; + 1DC2 : E9; + 1DC3 : 0A; + 1DC4 : B0; + 1DC5 : FB; + 1DC6 : 69; + 1DC7 : 3A; + 1DC8 : 99; + 1DC9 : 03; + 1DCA : 01; + 1DCB : 8A; + 1DCC : 99; + 1DCD : 02; + 1DCE : 01; + 1DCF : A9; + 1DD0 : 00; + 1DD1 : 99; + 1DD2 : 04; + 1DD3 : 01; + 1DD4 : F0; + 1DD5 : 08; + 1DD6 : 99; + 1DD7 : FF; + 1DD8 : 00; + 1DD9 : A9; + 1DDA : 00; + 1DDB : 99; + 1DDC : 00; + 1DDD : 01; + 1DDE : A9; + 1DDF : 00; + 1DE0 : A0; + 1DE1 : 01; + 1DE2 : 60; + 1DE3 : 80; + [1DE4..1DE7] : 00; + 1DE8 : FA; + 1DE9 : 0A; + 1DEA : 1F; + [1DEB..1DEC] : 00; + 1DED : 98; + 1DEE : 96; + 1DEF : 80; + 1DF0 : FF; + 1DF1 : F0; + 1DF2 : BD; + 1DF3 : C0; + 1DF4 : 00; + 1DF5 : 01; + 1DF6 : 86; + 1DF7 : A0; + [1DF8..1DF9] : FF; + 1DFA : D8; + 1DFB : F0; + [1DFC..1DFD] : 00; + 1DFE : 03; + 1DFF : E8; + [1E00..1E02] : FF; + 1E03 : 9C; + [1E04..1E06] : 00; + 1E07 : 0A; + [1E08..1E0C] : FF; + 1E0D : DF; + 1E0E : 0A; + 1E0F : 80; + 1E10 : 00; + 1E11 : 03; + 1E12 : 4B; + 1E13 : C0; + [1E14..1E15] : FF; + 1E16 : 73; + 1E17 : 60; + [1E18..1E19] : 00; + 1E1A : 0E; + 1E1B : 10; + [1E1C..1E1D] : FF; + 1E1E : FD; + 1E1F : A8; + [1E20..1E22] : 00; + 1E23 : 3C; + 1E24 : 20; + 1E25 : DE; + 1E26 : DA; + 1E27 : A9; + 1E28 : E3; + 1E29 : A0; + 1E2A : DD; + 1E2B : 20; + 1E2C : 74; + 1E2D : DA; + 1E2E : F0; + 1E2F : 70; + 1E30 : A5; + 1E31 : B8; + 1E32 : D0; + 1E33 : 03; + 1E34 : 4C; + 1E35 : CE; + 1E36 : D7; + 1E37 : A2; + 1E38 : 9D; + 1E39 : A0; + 1E3A : 00; + 1E3B : 20; + 1E3C : A6; + 1E3D : DA; + 1E3E : A5; + 1E3F : BD; + 1E40 : 10; + 1E41 : 0F; + 1E42 : 20; + 1E43 : 9E; + 1E44 : DB; + 1E45 : A9; + 1E46 : 9D; + 1E47 : A0; + 1E48 : 00; + 1E49 : 20; + 1E4A : 2D; + 1E4B : DB; + 1E4C : D0; + 1E4D : 03; + 1E4E : 98; + 1E4F : A4; + 1E50 : 5A; + 1E51 : 20; + 1E52 : D0; + 1E53 : DA; + 1E54 : 98; + 1E55 : 48; + 1E56 : 20; + 1E57 : BF; + 1E58 : D8; + 1E59 : A9; + 1E5A : 9D; + 1E5B : A0; + 1E5C : 00; + 1E5D : 20; + 1E5E : FD; + 1E5F : D8; + 1E60 : 20; + 1E61 : A0; + 1E62 : DE; + 1E63 : 68; + 1E64 : 4A; + 1E65 : 90; + 1E66 : 0A; + 1E67 : A5; + 1E68 : B0; + 1E69 : F0; + 1E6A : 06; + 1E6B : A5; + 1E6C : B5; + 1E6D : 49; + 1E6E : FF; + 1E6F : 85; + 1E70 : B5; + 1E71 : 60; + 1E72 : 81; + 1E73 : 38; + 1E74 : AA; + 1E75 : 3B; + 1E76 : 29; + 1E77 : 07; + 1E78 : 71; + 1E79 : 34; + 1E7A : 58; + 1E7B : 3E; + 1E7C : 56; + 1E7D : 74; + 1E7E : 16; + 1E7F : 7E; + 1E80 : B3; + 1E81 : 1B; + 1E82 : 77; + 1E83 : 2F; + 1E84 : EE; + 1E85 : E3; + 1E86 : 85; + 1E87 : 7A; + 1E88 : 1D; + 1E89 : 84; + 1E8A : 1C; + 1E8B : 2A; + 1E8C : 7C; + 1E8D : 63; + 1E8E : 59; + 1E8F : 58; + 1E90 : 0A; + 1E91 : 7E; + 1E92 : 75; + 1E93 : FD; + 1E94 : E7; + 1E95 : C6; + 1E96 : 80; + 1E97 : 31; + 1E98 : 72; + 1E99 : 18; + 1E9A : 10; + 1E9B : 81; + [1E9C..1E9F] : 00; + 1EA0 : A9; + 1EA1 : 72; + 1EA2 : A0; + 1EA3 : DE; + 1EA4 : 20; + 1EA5 : FD; + 1EA6 : D8; + 1EA7 : A5; + 1EA8 : BF; + 1EA9 : 69; + 1EAA : 50; + 1EAB : 90; + 1EAC : 03; + 1EAD : 20; + 1EAE : F5; + 1EAF : DA; + 1EB0 : 85; + 1EB1 : A5; + 1EB2 : 20; + 1EB3 : E1; + 1EB4 : DA; + 1EB5 : A5; + 1EB6 : B0; + 1EB7 : C9; + 1EB8 : 88; + 1EB9 : 90; + 1EBA : 03; + 1EBB : 20; + 1EBC : A6; + 1EBD : D9; + 1EBE : 20; + 1EBF : 9E; + 1EC0 : DB; + 1EC1 : A5; + 1EC2 : 5A; + 1EC3 : 18; + 1EC4 : 69; + 1EC5 : 81; + 1EC6 : F0; + 1EC7 : F3; + 1EC8 : 38; + 1EC9 : E9; + 1ECA : 01; + 1ECB : 48; + 1ECC : A2; + 1ECD : 05; + 1ECE : B5; + 1ECF : B8; + 1ED0 : B4; + 1ED1 : B0; + 1ED2 : 95; + 1ED3 : B0; + 1ED4 : 94; + 1ED5 : B8; + 1ED6 : CA; + 1ED7 : 10; + 1ED8 : F5; + [1ED9..1EDA] : A5; + 1EDB : 85; + 1EDC : BF; + 1EDD : 20; + 1EDE : 28; + 1EDF : D7; + 1EE0 : 20; + 1EE1 : 67; + 1EE2 : DE; + 1EE3 : A9; + 1EE4 : 77; + 1EE5 : A0; + 1EE6 : DE; + 1EE7 : 20; + 1EE8 : 09; + 1EE9 : DF; + 1EEA : A9; + 1EEB : 00; + 1EEC : 85; + 1EED : BE; + 1EEE : 68; + 1EEF : 20; + 1EF0 : 8B; + 1EF1 : D9; + 1EF2 : 60; + 1EF3 : 85; + 1EF4 : C0; + 1EF5 : 84; + 1EF6 : C1; + 1EF7 : 20; + 1EF8 : 9C; + 1EF9 : DA; + 1EFA : A9; + 1EFB : A6; + 1EFC : 20; + 1EFD : FD; + 1EFE : D8; + 1EFF : 20; + 1F00 : 0D; + 1F01 : DF; + 1F02 : A9; + 1F03 : A6; + 1F04 : A0; + 1F05 : 00; + 1F06 : 4C; + 1F07 : FD; + 1F08 : D8; + 1F09 : 85; + 1F0A : C0; + 1F0B : 84; + 1F0C : C1; + 1F0D : 20; + 1F0E : 99; + 1F0F : DA; + 1F10 : B1; + 1F11 : C0; + 1F12 : 85; + 1F13 : B6; + 1F14 : A4; + 1F15 : C0; + 1F16 : C8; + 1F17 : 98; + 1F18 : D0; + 1F19 : 02; + 1F1A : E6; + 1F1B : C1; + 1F1C : 85; + 1F1D : C0; + 1F1E : A4; + 1F1F : C1; + 1F20 : 20; + 1F21 : FD; + 1F22 : D8; + 1F23 : A5; + 1F24 : C0; + 1F25 : A4; + 1F26 : C1; + 1F27 : 18; + 1F28 : 69; + 1F29 : 05; + 1F2A : 90; + 1F2B : 01; + 1F2C : C8; + 1F2D : 85; + 1F2E : C0; + 1F2F : 84; + 1F30 : C1; + 1F31 : 20; + 1F32 : 3C; + 1F33 : D7; + 1F34 : A9; + 1F35 : AB; + 1F36 : A0; + 1F37 : 00; + 1F38 : C6; + 1F39 : B6; + 1F3A : D0; + 1F3B : E4; + 1F3C : 60; + 1F3D : 98; + 1F3E : 35; + 1F3F : 44; + 1F40 : 7A; + 1F41 : 68; + 1F42 : 28; + 1F43 : B1; + 1F44 : 46; + 1F45 : 20; + 1F46 : FD; + 1F47 : DA; + 1F48 : 30; + 1F49 : 2E; + 1F4A : D0; + 1F4B : 17; + 1F4C : AD; + 1F4D : 44; + 1F4E : 90; + 1F4F : 85; + 1F50 : B1; + 1F51 : AD; + 1F52 : 48; + 1F53 : 90; + 1F54 : 85; + 1F55 : B2; + 1F56 : AD; + 1F57 : 45; + 1F58 : 90; + 1F59 : 85; + 1F5A : B3; + 1F5B : AD; + 1F5C : 49; + 1F5D : 90; + 1F5E : 85; + 1F5F : B4; + 1F60 : 4C; + 1F61 : 88; + 1F62 : DF; + 1F63 : A9; + 1F64 : DA; + 1F65 : A0; + 1F66 : 00; + 1F67 : 20; + 1F68 : 74; + 1F69 : DA; + 1F6A : A9; + 1F6B : 3D; + 1F6C : A0; + 1F6D : DF; + 1F6E : 20; + 1F6F : FD; + 1F70 : D8; + 1F71 : A9; + 1F72 : 41; + 1F73 : A0; + 1F74 : DF; + 1F75 : 20; + 1F76 : 3C; + 1F77 : D7; + 1F78 : A6; + 1F79 : B4; + 1F7A : A5; + 1F7B : B1; + 1F7C : 85; + 1F7D : B4; + 1F7E : 86; + 1F7F : B1; + 1F80 : A6; + 1F81 : B2; + 1F82 : A5; + 1F83 : B3; + 1F84 : 85; + 1F85 : B2; + 1F86 : 86; + 1F87 : B3; + 1F88 : A9; + 1F89 : 00; + 1F8A : 85; + 1F8B : B5; + 1F8C : A5; + 1F8D : B0; + 1F8E : 85; + 1F8F : BF; + 1F90 : A9; + 1F91 : 80; + 1F92 : 85; + 1F93 : B0; + 1F94 : 20; + 1F95 : AC; + 1F96 : D7; + 1F97 : A2; + 1F98 : DA; + 1F99 : A0; + 1F9A : 00; + 1F9B : 4C; + 1F9C : A6; + 1F9D : DA; + 1F9E : A9; + 1F9F : 1A; + 1FA0 : A0; + 1FA1 : E0; + 1FA2 : 20; + 1FA3 : 3C; + 1FA4 : D7; + 1FA5 : 20; + 1FA6 : DE; + 1FA7 : DA; + 1FA8 : A9; + 1FA9 : 1F; + 1FAA : A0; + 1FAB : E0; + 1FAC : A6; + 1FAD : BD; + 1FAE : 20; + [1FAF..1FB0] : D9; + 1FB1 : 20; + 1FB2 : DE; + 1FB3 : DA; + 1FB4 : 20; + 1FB5 : 9E; + 1FB6 : DB; + 1FB7 : A9; + 1FB8 : 00; + 1FB9 : 85; + 1FBA : BE; + 1FBB : 20; + 1FBC : 28; + 1FBD : D7; + 1FBE : A9; + 1FBF : 24; + 1FC0 : A0; + 1FC1 : E0; + 1FC2 : 20; + 1FC3 : 25; + 1FC4 : D7; + 1FC5 : A5; + 1FC6 : B5; + 1FC7 : 48; + 1FC8 : 10; + 1FC9 : 0D; + 1FCA : 20; + 1FCB : 1E; + 1FCC : D7; + 1FCD : A5; + 1FCE : B5; + 1FCF : 30; + 1FD0 : 09; + 1FD1 : A5; + 1FD2 : 63; + 1FD3 : 49; + 1FD4 : FF; + 1FD5 : 85; + 1FD6 : 63; + 1FD7 : 20; + 1FD8 : 67; + 1FD9 : DE; + 1FDA : A9; + 1FDB : 24; + 1FDC : A0; + 1FDD : E0; + 1FDE : 20; + 1FDF : 3C; + 1FE0 : D7; + 1FE1 : 68; + 1FE2 : 10; + 1FE3 : 03; + 1FE4 : 20; + 1FE5 : 67; + 1FE6 : DE; + 1FE7 : A9; + 1FE8 : 29; + 1FE9 : A0; + 1FEA : E0; + 1FEB : 4C; + 1FEC : F3; + 1FED : DE; + 1FEE : 20; + 1FEF : 9C; + 1FF0 : DA; + 1FF1 : A9; + 1FF2 : 00; + 1FF3 : 85; + 1FF4 : 63; + 1FF5 : 20; + 1FF6 : A5; + 1FF7 : DF; + 1FF8 : A2; + 1FF9 : 9D; + 1FFA : A0; + 1FFB : 00; + 1FFC : 20; + 1FFD : 9B; + 1FFE : DF; + 1FFF : A9; + 2000 : A6; + 2001 : A0; + 2002 : 00; + 2003 : 20; + 2004 : 74; + 2005 : DA; + 2006 : A9; + 2007 : 00; + 2008 : 85; + 2009 : B5; + 200A : A5; + 200B : 63; + 200C : 20; + 200D : 16; + 200E : E0; + 200F : A9; + 2010 : 9D; + 2011 : A0; + 2012 : 00; + 2013 : 4C; + 2014 : E1; + 2015 : D9; + 2016 : 48; + 2017 : 4C; + 2018 : D7; + 2019 : DF; + 201A : 81; + 201B : 49; + 201C : 0F; + 201D : DA; + 201E : A2; + 201F : 83; + 2020 : 49; + 2021 : 0F; + 2022 : DA; + 2023 : A2; + 2024 : 7F; + [2025..2028] : 00; + 2029 : 05; + 202A : 84; + 202B : E6; + 202C : 1A; + 202D : 2D; + 202E : 1B; + 202F : 86; + 2030 : 28; + 2031 : 07; + 2032 : FB; + 2033 : F8; + 2034 : 87; + 2035 : 99; + 2036 : 68; + 2037 : 89; + 2038 : 01; + 2039 : 87; + 203A : 23; + 203B : 35; + 203C : DF; + 203D : E1; + 203E : 86; + 203F : A5; + 2040 : 5D; + 2041 : E7; + 2042 : 28; + 2043 : 83; + 2044 : 49; + 2045 : 0F; + 2046 : DA; + 2047 : A2; + 2048 : A5; + 2049 : B5; + 204A : 48; + 204B : 10; + 204C : 03; + 204D : 20; + 204E : 67; + 204F : DE; + 2050 : A5; + 2051 : B0; + 2052 : 48; + 2053 : C9; + 2054 : 81; + 2055 : 90; + 2056 : 07; + 2057 : A9; + 2058 : 91; + 2059 : A0; + 205A : D8; + 205B : 20; + 205C : E1; + 205D : D9; + 205E : A9; + 205F : 78; + 2060 : A0; + 2061 : E0; + 2062 : 20; + 2063 : F3; + 2064 : DE; + 2065 : 68; + 2066 : C9; + 2067 : 81; + 2068 : 90; + 2069 : 07; + 206A : A9; + 206B : 1A; + 206C : A0; + 206D : E0; + 206E : 20; + 206F : 25; + 2070 : D7; + 2071 : 68; + 2072 : 10; + 2073 : 03; + 2074 : 4C; + 2075 : 67; + 2076 : DE; + 2077 : 60; + 2078 : 0B; + 2079 : 76; + 207A : B3; + 207B : 83; + 207C : BD; + 207D : D3; + 207E : 79; + 207F : 1E; + 2080 : F4; + 2081 : A6; + 2082 : F5; + 2083 : 7B; + 2084 : 83; + 2085 : FC; + 2086 : B0; + 2087 : 10; + 2088 : 7C; + 2089 : 0C; + 208A : 1F; + 208B : 67; + 208C : CA; + 208D : 7C; + 208E : DE; + 208F : 53; + 2090 : CB; + 2091 : C1; + 2092 : 7D; + 2093 : 14; + 2094 : 64; + 2095 : 70; + 2096 : 4C; + 2097 : 7D; + 2098 : B7; + 2099 : EA; + 209A : 51; + 209B : 7A; + 209C : 7D; + 209D : 63; + 209E : 30; + 209F : 88; + [20A0..20A1] : 7E; + 20A2 : 92; + 20A3 : 44; + 20A4 : 99; + 20A5 : 3A; + 20A6 : 7E; + 20A7 : 4C; + 20A8 : CC; + 20A9 : 91; + 20AA : C7; + 20AB : 7F; + [20AC..20AE] : AA; + 20AF : 13; + 20B0 : 81; + [20B1..20B4] : 00; + 20B5 : E6; + 20B6 : C9; + 20B7 : D0; + 20B8 : 02; + 20B9 : E6; + 20BA : CA; + 20BB : AD; + 20BC : 60; + 20BD : EA; + 20BE : C9; + 20BF : 3A; + 20C0 : B0; + 20C1 : 0A; + 20C2 : C9; + 20C3 : 20; + 20C4 : F0; + 20C5 : EF; + 20C6 : 38; + 20C7 : E9; + 20C8 : 30; + 20C9 : 38; + 20CA : E9; + 20CB : D0; + 20CC : 60; + 20CD : 80; + 20CE : 4F; + 20CF : C7; + 20D0 : 52; + 20D1 : 59; + 20D2 : A2; + 20D3 : FF; + 20D4 : 86; + 20D5 : 89; + 20D6 : 9A; + 20D7 : A9; + 20D8 : 4C; + 20D9 : 85; + 20DA : A3; + 20DB : 85; + 20DC : 00; + 20DD : A9; + 20DE : 30; + 20DF : A0; + 20E0 : D1; + 20E1 : 85; + 20E2 : 01; + 20E3 : 84; + 20E4 : 02; + 20E5 : A2; + 20E6 : 1C; + 20E7 : BD; + 20E8 : B4; + 20E9 : E0; + 20EA : 95; + 20EB : C1; + 20EC : CA; + 20ED : D0; + 20EE : F8; + 20EF : 8A; + 20F0 : 85; + 20F1 : B7; + 20F2 : 85; + 20F3 : 03; + 20F4 : 85; + 20F5 : 67; + 20F6 : 85; + 20F7 : 04; + 20F8 : 85; + 20F9 : 05; + 20FA : 48; + 20FB : 85; + 20FC : 64; + 20FD : A9; + 20FE : 03; + 20FF : 85; + 2100 : A2; + 2101 : A9; + 2102 : 2C; + 2103 : 85; + 2104 : 09; + 2105 : 20; + 2106 : D2; + 2107 : C9; + 2108 : A2; + 2109 : 68; + 210A : 86; + 210B : 65; + 210C : A9; + 210D : 00; + 210E : A0; + 210F : 04; + 2110 : 85; + 2111 : 08; + 2112 : 84; + 2113 : 09; + 2114 : A0; + 2115 : 00; + 2116 : E6; + 2117 : 08; + 2118 : D0; + 2119 : 08; + 211A : E6; + 211B : 09; + 211C : A5; + 211D : 09; + 211E : C9; + 211F : 80; + 2120 : F0; + 2121 : 0F; + 2122 : A9; + 2123 : 92; + 2124 : 91; + 2125 : 08; + 2126 : D1; + 2127 : 08; + 2128 : D0; + 2129 : 07; + 212A : 0A; + 212B : 91; + 212C : 08; + 212D : D1; + 212E : 08; + 212F : F0; + 2130 : E5; + 2131 : A5; + 2132 : 08; + 2133 : A4; + 2134 : 09; + 2135 : 85; + 2136 : 86; + 2137 : 84; + 2138 : 87; + 2139 : 85; + 213A : 82; + 213B : 84; + 213C : 83; + 213D : A2; + 213E : 00; + 213F : A0; + 2140 : 04; + 2141 : 86; + 2142 : 7A; + 2143 : 84; + 2144 : 7B; + 2145 : A0; + 2146 : 00; + 2147 : 98; + 2148 : 91; + 2149 : 7A; + 214A : E6; + 214B : 7A; + 214C : D0; + 214D : 02; + 214E : E6; + 214F : 7B; + 2150 : A5; + 2151 : 7A; + 2152 : A4; + 2153 : 7B; + 2154 : 20; + 2155 : 2A; + 2156 : C3; + 2157 : 20; + 2158 : D2; + 2159 : C9; + 215A : A5; + 215B : 86; + 215C : 38; + 215D : E5; + 215E : 7A; + 215F : AA; + 2160 : A5; + 2161 : 87; + 2162 : E5; + 2163 : 7B; + 2164 : 20; + 2165 : 9F; + 2166 : DC; + 2167 : A9; + 2168 : 74; + 2169 : A0; + 216A : E1; + 216B : 20; + 216C : 27; + 216D : CA; + 216E : 20; + 216F : 53; + 2170 : C5; + 2171 : 4C; + 2172 : 8B; + 2173 : C3; + 2174 : 20; + 2175 : 42; + 2176 : 59; + 2177 : 54; + 2178 : 45; + 2179 : 53; + 217A : 20; + 217B : 46; + 217C : 52; + [217D..217E] : 45; + 217F : 13; + [2180..2182] : 2A; + 2183 : 20; + 2184 : 43; + 2185 : 4F; + [2186..2187] : 4D; + 2188 : 4F; + 2189 : 44; + 218A : 4F; + 218B : 52; + 218C : 45; + 218D : 20; + 218E : 42; + 218F : 41; + 2190 : 53; + 2191 : 49; + 2192 : 43; + 2193 : 20; + [2194..2196] : 2A; + [2197..2199] : 11; + 219A : 00; + 219B : 18; + 219C : 4C; + 219D : 2B; + 219E : C7; + 219F : 24; + 21A0 : B4; + 21A1 : 10; + 21A2 : 07; + 21A3 : C9; + 21A4 : 54; + 21A5 : D0; + 21A6 : 03; + 21A7 : 4C; + 21A8 : 3B; + 21A9 : CE; + 21AA : 60; + 21AB : 24; + 21AC : B4; + 21AD : 30; + 21AE : 03; + 21AF : 4C; + 21B0 : 90; + 21B1 : CE; + 21B2 : C9; + 21B3 : 54; + 21B4 : F0; + 21B5 : 03; + 21B6 : 4C; + 21B7 : 82; + 21B8 : CE; + 21B9 : 4C; + 21BA : 69; + 21BB : CE; + 21BC : 85; + 21BD : 5A; + 21BE : E8; + 21BF : 4C; + 21C0 : D9; + 21C1 : E1; + 21C2 : 10; + 21C3 : 05; + 21C4 : A5; + 21C5 : 8E; + 21C6 : A4; + 21C7 : 8F; + 21C8 : 60; + 21C9 : A0; + 21CA : FF; + 21CB : 60; + 21CC : D0; + 21CD : 0A; + 21CE : E6; + 21CF : 05; + 21D0 : D0; + 21D1 : 06; + 21D2 : A5; + 21D3 : E2; + 21D4 : 85; + 21D5 : 05; + 21D6 : D0; + 21D7 : F6; + 21D8 : 60; + 21D9 : 86; + 21DA : C9; + [21DB..21DC] : 68; + 21DD : 98; + 21DE : 4C; + 21DF : 88; + 21E0 : CB; + 21E1 : A9; + 21E2 : 7F; + 21E3 : 8D; + 21E4 : 4E; + 21E5 : E8; + 21E6 : 85; + 21E7 : 06; + 21E8 : 85; + 21E9 : 07; + 21EA : A2; + 21EB : 00; + 21EC : 8A; + 21ED : 9D; + 21EE : 00; + 21EF : 02; + 21F0 : CA; + 21F1 : D0; + 21F2 : FA; + 21F3 : CA; + 21F4 : A9; + 21F5 : 85; + 21F6 : 8D; + 21F7 : 19; + 21F8 : 02; + 21F9 : A9; + 21FA : E6; + 21FB : 8D; + 21FC : 1A; + 21FD : 02; + 21FE : A9; + 21FF : 03; + 2200 : 8D; + 2201 : 64; + 2202 : 02; + 2203 : A9; + 2204 : 0F; + 2205 : 8D; + 2206 : 10; + 2207 : E8; + 2208 : 0A; + 2209 : 8D; + 220A : 40; + 220B : E8; + 220C : 8D; + 220D : 42; + 220E : E8; + 220F : 8E; + 2210 : 22; + 2211 : E8; + 2212 : 8E; + 2213 : 45; + 2214 : E8; + 2215 : A9; + 2216 : 3D; + 2217 : 8D; + 2218 : 13; + 2219 : E8; + 221A : 2C; + 221B : 12; + 221C : E8; + 221D : A9; + 221E : 3C; + 221F : 8D; + 2220 : 21; + 2221 : E8; + 2222 : 8D; + 2223 : 23; + 2224 : E8; + 2225 : 8D; + 2226 : 11; + 2227 : E8; + 2228 : 8E; + 2229 : 22; + 222A : E8; + 222B : A9; + 222C : 0C; + 222D : 8D; + 222E : 4C; + 222F : E8; + 2230 : 8D; + 2231 : 25; + 2232 : 02; + 2233 : 8D; + 2234 : 24; + 2235 : 02; + 2236 : A0; + 2237 : 00; + 2238 : 8C; + 2239 : 0E; + 223A : 02; + 223B : 84; + 223C : E0; + 223D : A9; + 223E : 84; + 223F : 85; + 2240 : E1; + 2241 : A9; + 2242 : 20; + 2243 : C6; + 2244 : E1; + 2245 : 91; + 2246 : E0; + 2247 : 88; + 2248 : D0; + 2249 : FB; + 224A : A5; + 224B : E1; + 224C : C9; + 224D : 80; + 224E : D0; + 224F : F1; + 2250 : A9; + 2251 : 80; + 2252 : A2; + 2253 : 19; + 2254 : 9D; + 2255 : 28; + 2256 : 02; + 2257 : CA; + 2258 : D0; + 2259 : FA; + 225A : A0; + 225B : 12; + 225C : 20; + 225D : 73; + 225E : E2; + 225F : A0; + 2260 : 0C; + 2261 : 20; + 2262 : 73; + 2263 : E2; + 2264 : A0; + 2265 : 05; + 2266 : 20; + 2267 : 73; + 2268 : E2; + 2269 : A0; + 226A : 00; + 226B : 84; + 226C : E2; + 226D : 84; + 226E : F5; + 226F : 20; + 2270 : DB; + 2271 : E5; + 2272 : 60; + 2273 : A2; + 2274 : 18; + 2275 : FE; + 2276 : 29; + 2277 : 02; + 2278 : CA; + 2279 : 88; + 227A : D0; + 227B : F9; + 227C : 60; + 227D : AC; + 227E : 0F; + 227F : 02; + 2280 : A2; + 2281 : 00; + 2282 : BD; + 2283 : 10; + 2284 : 02; + 2285 : 9D; + 2286 : 0F; + 2287 : 02; + 2288 : E8; + 2289 : EC; + 228A : 0D; + 228B : 02; + 228C : D0; + 228D : F4; + 228E : CE; + 228F : 0D; + 2290 : 02; + 2291 : 98; + 2292 : 58; + 2293 : 60; + 2294 : 20; + 2295 : EA; + 2296 : E3; + 2297 : AD; + 2298 : 0D; + 2299 : 02; + 229A : 8D; + 229B : 24; + 229C : 02; + 229D : F0; + 229E : F8; + 229F : 78; + 22A0 : AD; + 22A1 : 27; + 22A2 : 02; + 22A3 : F0; + 22A4 : 0B; + 22A5 : AD; + 22A6 : 26; + 22A7 : 02; + 22A8 : A0; + 22A9 : 00; + 22AA : 8C; + 22AB : 27; + 22AC : 02; + 22AD : 20; + 22AE : AC; + 22AF : E7; + 22B0 : 20; + 22B1 : 7D; + 22B2 : E2; + 22B3 : C9; + 22B4 : 83; + 22B5 : D0; + 22B6 : 11; + 22B7 : 78; + 22B8 : A2; + 22B9 : 09; + 22BA : 8E; + 22BB : 0D; + 22BC : 02; + 22BD : BD; + 22BE : D4; + 22BF : E7; + 22C0 : 9D; + 22C1 : 0E; + 22C2 : 02; + 22C3 : CA; + 22C4 : D0; + 22C5 : F7; + 22C6 : F0; + 22C7 : CF; + 22C8 : C9; + 22C9 : 0D; + 22CA : D0; + 22CB : C8; + 22CC : A4; + 22CD : F2; + 22CE : 8C; + 22CF : 60; + 22D0 : 02; + 22D1 : B1; + 22D2 : E0; + 22D3 : C9; + 22D4 : 20; + 22D5 : D0; + 22D6 : 03; + 22D7 : 88; + 22D8 : D0; + 22D9 : F7; + 22DA : C8; + 22DB : 8C; + 22DC : 1E; + 22DD : 02; + 22DE : A0; + 22DF : 00; + 22E0 : 84; + 22E1 : E2; + 22E2 : 84; + 22E3 : EA; + 22E4 : AD; + 22E5 : 20; + 22E6 : 02; + 22E7 : 30; + 22E8 : 1A; + 22E9 : C5; + 22EA : F5; + 22EB : D0; + 22EC : 16; + 22ED : AD; + 22EE : 21; + 22EF : 02; + 22F0 : 85; + 22F1 : E2; + 22F2 : CD; + 22F3 : 1E; + 22F4 : 02; + 22F5 : 90; + 22F6 : 0C; + 22F7 : 4C; + 22F8 : 27; + 22F9 : E3; + 22FA : 98; + 22FB : 48; + 22FC : 8A; + 22FD : 48; + 22FE : AD; + 22FF : 60; + 2300 : 02; + 2301 : F0; + 2302 : 94; + 2303 : A4; + 2304 : E2; + 2305 : B1; + 2306 : E0; + 2307 : 85; + 2308 : F6; + 2309 : 29; + 230A : 3F; + 230B : 06; + 230C : F6; + 230D : 24; + 230E : F6; + 230F : 10; + 2310 : 02; + 2311 : 09; + 2312 : 80; + 2313 : 90; + 2314 : 04; + 2315 : A6; + 2316 : EA; + 2317 : D0; + 2318 : 04; + 2319 : 70; + 231A : 02; + 231B : 09; + 231C : 40; + 231D : E6; + 231E : E2; + 231F : 20; + 2320 : 49; + 2321 : E3; + 2322 : CC; + 2323 : 1E; + 2324 : 02; + 2325 : D0; + 2326 : 13; + 2327 : A9; + 2328 : 00; + 2329 : 8D; + 232A : 60; + 232B : 02; + 232C : A9; + 232D : 0D; + 232E : AE; + 232F : 64; + 2330 : 02; + 2331 : E0; + 2332 : 03; + 2333 : F0; + 2334 : 03; + 2335 : 20; + 2336 : EA; + 2337 : E3; + 2338 : A9; + 2339 : 0D; + 233A : 85; + 233B : F6; + 233C : 68; + 233D : AA; + 233E : 68; + 233F : A8; + 2340 : A5; + 2341 : F6; + 2342 : C9; + 2343 : DE; + 2344 : D0; + 2345 : 02; + 2346 : A9; + 2347 : FF; + 2348 : 60; + 2349 : C9; + 234A : 22; + 234B : D0; + 234C : 08; + 234D : A5; + 234E : EA; + 234F : 49; + 2350 : 01; + 2351 : 85; + 2352 : EA; + 2353 : A9; + 2354 : 22; + 2355 : 60; + 2356 : 09; + 2357 : 40; + 2358 : AE; + 2359 : 0E; + 235A : 02; + 235B : F0; + 235C : 02; + 235D : 09; + 235E : 80; + 235F : A6; + 2360 : FB; + 2361 : F0; + 2362 : 02; + 2363 : C6; + 2364 : FB; + 2365 : 20; + 2366 : AC; + 2367 : E7; + 2368 : E6; + 2369 : E2; + 236A : A4; + 236B : F2; + 236C : C4; + 236D : E2; + 236E : B0; + 236F : 1A; + 2370 : A6; + 2371 : F5; + 2372 : C0; + 2373 : 4F; + 2374 : D0; + 2375 : 0D; + 2376 : 20; + 2377 : 97; + 2378 : E3; + 2379 : 20; + 237A : 30; + 237B : E5; + 237C : A9; + 237D : 00; + 237E : 85; + 237F : E2; + 2380 : 4C; + 2381 : 8A; + 2382 : E3; + 2383 : E0; + 2384 : 18; + 2385 : D0; + 2386 : 1D; + 2387 : 20; + 2388 : AA; + 2389 : E3; + 238A : 68; + 238B : A8; + 238C : A5; + 238D : FB; + 238E : F0; + 238F : 02; + 2390 : 46; + 2391 : EA; + 2392 : 68; + 2393 : AA; + 2394 : 68; + 2395 : 58; + 2396 : 60; + 2397 : E0; + 2398 : 17; + 2399 : B0; + 239A : 08; + 239B : BD; + 239C : 2B; + 239D : 02; + 239E : 09; + 239F : 80; + 23A0 : 9D; + 23A1 : 2B; + 23A2 : 02; + 23A3 : 60; + 23A4 : 20; + 23A5 : B1; + 23A6 : E3; + 23A7 : 4C; + 23A8 : 8A; + 23A9 : E3; + 23AA : 20; + 23AB : 59; + 23AC : E5; + 23AD : C6; + 23AE : F5; + 23AF : A6; + 23B0 : F5; + 23B1 : 1E; + 23B2 : 2A; + 23B3 : 02; + 23B4 : 5E; + 23B5 : 2A; + 23B6 : 02; + 23B7 : 20; + 23B8 : 97; + 23B9 : E3; + 23BA : A5; + 23BB : E2; + 23BC : 48; + 23BD : 20; + 23BE : DB; + 23BF : E5; + 23C0 : 68; + 23C1 : 85; + 23C2 : E2; + 23C3 : 60; + 23C4 : A0; + 23C5 : 27; + 23C6 : A6; + 23C7 : F5; + 23C8 : D0; + 23C9 : 06; + 23CA : 86; + 23CB : E2; + [23CC..23CD] : 68; + 23CE : D0; + 23CF : BA; + 23D0 : BD; + 23D1 : 28; + 23D2 : 02; + 23D3 : 30; + 23D4 : 06; + 23D5 : CA; + 23D6 : BD; + 23D7 : 28; + 23D8 : 02; + 23D9 : A0; + 23DA : 4F; + 23DB : CA; + 23DC : 86; + 23DD : F5; + 23DE : 85; + 23DF : E1; + 23E0 : BD; + 23E1 : BC; + 23E2 : E7; + 23E3 : 85; + 23E4 : E0; + 23E5 : 84; + 23E6 : E2; + 23E7 : 84; + 23E8 : F2; + 23E9 : 60; + 23EA : 48; + 23EB : 85; + 23EC : F6; + 23ED : 8A; + 23EE : 48; + 23EF : 98; + 23F0 : 48; + 23F1 : A9; + 23F2 : 00; + 23F3 : 8D; + 23F4 : 60; + 23F5 : 02; + 23F6 : A4; + 23F7 : E2; + 23F8 : A5; + 23F9 : F6; + 23FA : 10; + 23FB : 03; + 23FC : 4C; + 23FD : 8F; + 23FE : E4; + 23FF : C9; + 2400 : 0D; + 2401 : D0; + 2402 : 03; + 2403 : 4C; + 2404 : 48; + 2405 : E5; + 2406 : C9; + 2407 : 20; + 2408 : 90; + 2409 : 08; + 240A : 29; + 240B : 3F; + 240C : 20; + 240D : 49; + 240E : E3; + 240F : 4C; + 2410 : 58; + 2411 : E3; + 2412 : A6; + 2413 : FB; + 2414 : F0; + 2415 : 03; + 2416 : 4C; + 2417 : 5D; + 2418 : E3; + 2419 : C9; + 241A : 14; + 241B : D0; + 241C : 1C; + 241D : 88; + 241E : 84; + 241F : E2; + 2420 : 10; + 2421 : 06; + 2422 : 20; + 2423 : C4; + 2424 : E3; + 2425 : 4C; + 2426 : 33; + 2427 : E4; + 2428 : C8; + 2429 : B1; + 242A : E0; + 242B : 88; + 242C : 91; + 242D : E0; + 242E : C8; + 242F : C4; + 2430 : F2; + 2431 : D0; + 2432 : F5; + 2433 : A9; + 2434 : 20; + 2435 : 91; + 2436 : E0; + 2437 : D0; + 2438 : 3D; + 2439 : A6; + 243A : EA; + 243B : F0; + 243C : 03; + 243D : 4C; + 243E : 5D; + 243F : E3; + 2440 : C9; + 2441 : 12; + 2442 : D0; + 2443 : 03; + 2444 : 8D; + 2445 : 0E; + 2446 : 02; + 2447 : C9; + 2448 : 13; + 2449 : D0; + 244A : 03; + 244B : 20; + 244C : 69; + 244D : E2; + 244E : C9; + 244F : 1D; + 2450 : D0; + 2451 : 12; + 2452 : C8; + 2453 : 84; + 2454 : E2; + 2455 : 88; + 2456 : C4; + 2457 : F2; + 2458 : 90; + 2459 : 07; + 245A : 20; + 245B : 30; + 245C : E5; + 245D : A0; + 245E : 00; + 245F : 84; + 2460 : E2; + 2461 : 4C; + 2462 : 8A; + 2463 : E3; + 2464 : C9; + 2465 : 11; + 2466 : D0; + 2467 : 0E; + 2468 : 18; + 2469 : 98; + 246A : 69; + 246B : 28; + 246C : A8; + 246D : C5; + 246E : F2; + 246F : 90; + 2470 : EE; + 2471 : F0; + 2472 : EC; + 2473 : 20; + 2474 : 30; + 2475 : E5; + 2476 : 4C; + 2477 : 8A; + 2478 : E3; + 2479 : E8; + 247A : 85; + 247B : F5; + 247C : 98; + 247D : E9; + 247E : 28; + 247F : 85; + 2480 : E2; + 2481 : E6; + 2482 : F5; + 2483 : AD; + 2484 : BC; + 2485 : E7; + 2486 : 85; + 2487 : E0; + 2488 : AD; + 2489 : 29; + 248A : 02; + 248B : 85; + 248C : E1; + 248D : D0; + 248E : E7; + 248F : 29; + 2490 : 7F; + 2491 : C9; + 2492 : 7F; + 2493 : D0; + 2494 : 02; + 2495 : A9; + 2496 : 5E; + 2497 : C9; + 2498 : 20; + 2499 : 90; + 249A : 03; + 249B : 4C; + 249C : 56; + 249D : E3; + 249E : C9; + 249F : 0D; + 24A0 : D0; + 24A1 : 03; + 24A2 : 4C; + 24A3 : 48; + 24A4 : E5; + 24A5 : A6; + 24A6 : EA; + 24A7 : D0; + 24A8 : 30; + 24A9 : C9; + 24AA : 14; + 24AB : D0; + 24AC : 28; + 24AD : A4; + 24AE : F2; + 24AF : B1; + 24B0 : E0; + 24B1 : C9; + 24B2 : 20; + 24B3 : D0; + 24B4 : 04; + 24B5 : C4; + 24B6 : E2; + 24B7 : D0; + 24B8 : 07; + 24B9 : C0; + 24BA : 4F; + 24BB : F0; + 24BC : B9; + 24BD : 20; + 24BE : 05; + 24BF : E6; + 24C0 : A4; + 24C1 : F2; + 24C2 : 88; + 24C3 : B1; + 24C4 : E0; + 24C5 : C8; + 24C6 : 91; + 24C7 : E0; + 24C8 : 88; + 24C9 : C4; + 24CA : E2; + 24CB : D0; + 24CC : F5; + 24CD : A9; + 24CE : 20; + 24CF : 91; + 24D0 : E0; + 24D1 : E6; + 24D2 : FB; + 24D3 : D0; + 24D4 : 58; + 24D5 : A6; + 24D6 : FB; + 24D7 : F0; + 24D8 : 05; + 24D9 : 09; + 24DA : 40; + 24DB : 4C; + 24DC : 5D; + 24DD : E3; + 24DE : C9; + 24DF : 11; + 24E0 : D0; + 24E1 : 2C; + 24E2 : A5; + 24E3 : E2; + 24E4 : C9; + 24E5 : 28; + 24E6 : 90; + 24E7 : 06; + 24E8 : E9; + 24E9 : 28; + 24EA : 85; + 24EB : E2; + 24EC : B0; + 24ED : 3F; + 24EE : A6; + 24EF : F5; + 24F0 : F0; + 24F1 : 3B; + 24F2 : BD; + 24F3 : 28; + 24F4 : 02; + 24F5 : 10; + 24F6 : 07; + 24F7 : C6; + 24F8 : F5; + 24F9 : 20; + 24FA : DB; + 24FB : E5; + 24FC : 90; + 24FD : 2F; + [24FE..24FF] : CA; + 2500 : 86; + 2501 : F5; + 2502 : 20; + 2503 : DB; + 2504 : E5; + 2505 : A5; + 2506 : E2; + 2507 : 18; + 2508 : 69; + 2509 : 28; + 250A : 85; + 250B : E2; + 250C : D0; + 250D : 1F; + 250E : C9; + 250F : 12; + 2510 : D0; + 2511 : 05; + 2512 : A9; + 2513 : 00; + 2514 : 8D; + 2515 : 0E; + 2516 : 02; + 2517 : C9; + 2518 : 1D; + 2519 : D0; + 251A : 0B; + 251B : 88; + 251C : 84; + 251D : E2; + 251E : 10; + 251F : 0D; + 2520 : 20; + 2521 : C4; + 2522 : E3; + 2523 : 4C; + 2524 : 8A; + 2525 : E3; + 2526 : C9; + 2527 : 13; + 2528 : D0; + 2529 : 03; + 252A : 20; + 252B : 36; + 252C : E2; + 252D : 4C; + 252E : 8A; + 252F : E3; + 2530 : 38; + 2531 : 4E; + 2532 : 20; + 2533 : 02; + 2534 : A6; + 2535 : F5; + 2536 : E8; + 2537 : E0; + 2538 : 19; + 2539 : D0; + 253A : 03; + 253B : 20; + 253C : 59; + 253D : E5; + 253E : BD; + 253F : 29; + 2540 : 02; + 2541 : 10; + 2542 : F3; + 2543 : 86; + 2544 : F5; + 2545 : 4C; + 2546 : DB; + 2547 : E5; + 2548 : A9; + 2549 : 00; + 254A : 85; + 254B : FB; + 254C : 8D; + 254D : 0E; + 254E : 02; + 254F : 85; + 2550 : EA; + 2551 : 85; + 2552 : E2; + 2553 : 20; + 2554 : 30; + 2555 : E5; + 2556 : 4C; + 2557 : 8A; + 2558 : E3; + 2559 : 78; + 255A : A0; + 255B : 00; + 255C : 84; + 255D : E0; + 255E : A9; + 255F : 80; + 2560 : 85; + 2561 : E4; + 2562 : 85; + 2563 : E1; + 2564 : A9; + 2565 : 28; + 2566 : 2C; + 2567 : 2A; + 2568 : 02; + 2569 : 30; + 256A : 02; + 256B : A9; + 256C : 50; + 256D : 85; + 256E : E3; + 256F : A9; + 2570 : 34; + 2571 : 8D; + 2572 : 11; + 2573 : E8; + 2574 : B1; + 2575 : E3; + 2576 : 91; + 2577 : E0; + 2578 : C8; + 2579 : D0; + 257A : F9; + 257B : E6; + 257C : E4; + 257D : E6; + 257E : E1; + 257F : A9; + 2580 : 84; + 2581 : C5; + 2582 : E4; + 2583 : D0; + 2584 : EF; + 2585 : A9; + 2586 : E8; + 2587 : 85; + 2588 : E0; + 2589 : C6; + 258A : E1; + 258B : A9; + 258C : 20; + 258D : C6; + 258E : E0; + 258F : C6; + 2590 : E3; + 2591 : 91; + 2592 : E0; + 2593 : D0; + 2594 : F8; + 2595 : A2; + 2596 : 19; + 2597 : 86; + 2598 : F5; + 2599 : A2; + 259A : 00; + 259B : C6; + 259C : F5; + 259D : BD; + 259E : 29; + 259F : 02; + 25A0 : 29; + 25A1 : 7F; + 25A2 : BC; + 25A3 : 2A; + 25A4 : 02; + 25A5 : 10; + 25A6 : 02; + 25A7 : 09; + 25A8 : 80; + 25A9 : 9D; + 25AA : 29; + 25AB : 02; + 25AC : E8; + 25AD : E0; + 25AE : 19; + 25AF : D0; + 25B0 : EC; + 25B1 : A9; + 25B2 : 83; + 25B3 : 8D; + 25B4 : 41; + 25B5 : 02; + 25B6 : AD; + 25B7 : 29; + 25B8 : 02; + 25B9 : 10; + 25BA : DE; + 25BB : A9; + 25BC : 3C; + 25BD : 8D; + 25BE : 11; + 25BF : E8; + 25C0 : 58; + 25C1 : A9; + 25C2 : FE; + 25C3 : CD; + 25C4 : 12; + 25C5 : E8; + 25C6 : D0; + 25C7 : 10; + 25C8 : A0; + 25C9 : 08; + 25CA : 8D; + 25CB : 45; + 25CC : E8; + 25CD : 2C; + 25CE : 4D; + 25CF : E8; + 25D0 : 50; + 25D1 : FB; + 25D2 : 88; + 25D3 : D0; + 25D4 : F5; + 25D5 : 8C; + 25D6 : 0D; + 25D7 : 02; + 25D8 : A6; + 25D9 : F5; + 25DA : 60; + 25DB : A6; + 25DC : F5; + 25DD : BD; + 25DE : 29; + 25DF : 02; + 25E0 : 09; + 25E1 : 80; + 25E2 : 85; + 25E3 : E1; + 25E4 : BD; + 25E5 : BC; + 25E6 : E7; + 25E7 : 85; + 25E8 : E0; + 25E9 : A9; + 25EA : 27; + 25EB : 85; + 25EC : F2; + 25ED : E0; + 25EE : 18; + 25EF : F0; + 25F0 : 09; + 25F1 : BD; + 25F2 : 2A; + 25F3 : 02; + 25F4 : 30; + 25F5 : 04; + 25F6 : A9; + 25F7 : 4F; + 25F8 : 85; + 25F9 : F2; + 25FA : A5; + 25FB : E2; + 25FC : C9; + 25FD : 28; + 25FE : 90; + 25FF : 04; + 2600 : E9; + 2601 : 28; + 2602 : 85; + 2603 : E2; + 2604 : 60; + 2605 : A6; + 2606 : F5; + 2607 : E8; + 2608 : 78; + 2609 : A9; + 260A : 34; + 260B : 8D; + 260C : 11; + 260D : E8; + 260E : E0; + 260F : 17; + 2610 : F0; + 2611 : 36; + 2612 : 90; + 2613 : 03; + 2614 : 4C; + 2615 : AA; + 2616 : E3; + 2617 : A2; + 2618 : 17; + 2619 : BD; + 261A : 2A; + 261B : 02; + 261C : 09; + 261D : 80; + 261E : 85; + 261F : E4; + 2620 : BC; + 2621 : 29; + 2622 : 02; + 2623 : 30; + 2624 : 02; + 2625 : 29; + 2626 : 7F; + 2627 : 9D; + 2628 : 2A; + 2629 : 02; + 262A : 98; + 262B : 09; + 262C : 80; + 262D : 85; + 262E : E1; + 262F : A0; + 2630 : 27; + [2631..2632] : BD; + 2633 : E7; + 2634 : 85; + 2635 : E3; + 2636 : BD; + 2637 : BC; + 2638 : E7; + 2639 : 85; + 263A : E0; + 263B : B1; + 263C : E0; + 263D : 91; + 263E : E3; + 263F : 88; + 2640 : 10; + 2641 : F9; + 2642 : CA; + 2643 : E4; + 2644 : F5; + 2645 : D0; + 2646 : D2; + 2647 : E8; + 2648 : BD; + 2649 : 29; + 264A : 02; + 264B : 09; + 264C : 80; + 264D : 85; + 264E : E1; + 264F : 29; + 2650 : 7F; + 2651 : 9D; + 2652 : 29; + 2653 : 02; + 2654 : BD; + 2655 : BC; + 2656 : E7; + 2657 : 85; + 2658 : E0; + 2659 : A0; + 265A : 27; + 265B : A9; + 265C : 20; + 265D : 91; + 265E : E0; + 265F : 88; + 2660 : 10; + 2661 : FB; + 2662 : A9; + 2663 : 3C; + 2664 : 8D; + 2665 : 11; + 2666 : E8; + 2667 : 58; + 2668 : 4C; + 2669 : DB; + 266A : E5; + 266B : 48; + 266C : 8A; + 266D : 48; + 266E : 98; + 266F : 48; + 2670 : BA; + 2671 : BD; + 2672 : 04; + 2673 : 01; + 2674 : 29; + 2675 : 10; + 2676 : F0; + 2677 : 03; + 2678 : 6C; + 2679 : 1B; + 267A : 02; + 267B : 6C; + 267C : 19; + 267D : 02; + 267E : 68; + 267F : A8; + 2680 : 68; + 2681 : AA; + 2682 : 68; + 2683 : 40; + 2684 : 60; + 2685 : 20; + 2686 : EA; + 2687 : FF; + 2688 : AD; + 2689 : 24; + 268A : 02; + 268B : D0; + 268C : 23; + 268D : CE; + 268E : 25; + 268F : 02; + 2690 : D0; + 2691 : 1E; + 2692 : A9; + 2693 : 14; + 2694 : 8D; + 2695 : 25; + 2696 : 02; + 2697 : A4; + 2698 : E2; + 2699 : 4E; + 269A : 27; + 269B : 02; + 269C : B1; + 269D : E0; + 269E : B0; + 269F : 06; + 26A0 : EE; + 26A1 : 27; + 26A2 : 02; + 26A3 : 8D; + 26A4 : 26; + 26A5 : 02; + 26A6 : 0A; + 26A7 : B0; + 26A8 : 03; + 26A9 : 38; + 26AA : B0; + 26AB : 01; + 26AC : 18; + 26AD : 6A; + 26AE : 91; + 26AF : E0; + 26B0 : A2; + 26B1 : FF; + 26B2 : 8E; + 26B3 : 23; + 26B4 : 02; + 26B5 : E8; + 26B6 : 8E; + 26B7 : 04; + 26B8 : 02; + 26B9 : A2; + 26BA : 50; + 26BB : AD; + 26BC : 10; + 26BD : E8; + 26BE : 29; + 26BF : F0; + 26C0 : 8D; + 26C1 : 10; + 26C2 : E8; + 26C3 : A0; + 26C4 : 00; + 26C5 : AD; + 26C6 : 10; + 26C7 : E8; + [26C8..26CA] : 0A; + 26CB : 10; + 26CC : 07; + 26CD : 8C; + 26CE : 07; + 26CF : 02; + 26D0 : A9; + 26D1 : 3D; + 26D2 : D0; + 26D3 : 07; + 26D4 : AD; + 26D5 : 07; + 26D6 : 02; + 26D7 : D0; + 26D8 : 05; + 26D9 : A9; + 26DA : 35; + 26DB : 8D; + 26DC : 13; + 26DD : E8; + 26DE : 90; + 26DF : 0A; + 26E0 : 8C; + 26E1 : 08; + 26E2 : 02; + 26E3 : AD; + 26E4 : 40; + 26E5 : E8; + 26E6 : 09; + 26E7 : 10; + 26E8 : D0; + 26E9 : 0A; + 26EA : AD; + 26EB : 08; + 26EC : 02; + 26ED : D0; + 26EE : 08; + 26EF : AD; + 26F0 : 40; + 26F1 : E8; + 26F2 : 29; + 26F3 : EF; + 26F4 : 8D; + 26F5 : 40; + 26F6 : E8; + 26F7 : A0; + 26F8 : 08; + 26F9 : AD; + 26FA : 12; + 26FB : E8; + 26FC : CD; + 26FD : 12; + 26FE : E8; + 26FF : D0; + 2700 : F6; + 2701 : 4A; + 2702 : B0; + 2703 : 05; + 2704 : 48; + 2705 : 20; + 2706 : 3F; + 2707 : E7; + 2708 : 68; + 2709 : CA; + 270A : F0; + 270B : 08; + 270C : 88; + 270D : D0; + 270E : F2; + 270F : EE; + 2710 : 10; + 2711 : E8; + 2712 : D0; + 2713 : E3; + 2714 : AD; + 2715 : 23; + 2716 : 02; + 2717 : CD; + 2718 : 03; + 2719 : 02; + 271A : F0; + 271B : 20; + 271C : 8D; + 271D : 03; + 271E : 02; + 271F : AA; + 2720 : 30; + 2721 : 1A; + 2722 : BD; + 2723 : 5B; + 2724 : E7; + 2725 : 4E; + 2726 : 04; + 2727 : 02; + 2728 : 90; + 2729 : 02; + 272A : 09; + 272B : 80; + 272C : AE; + 272D : 0D; + 272E : 02; + 272F : 9D; + 2730 : 0F; + 2731 : 02; + 2732 : E8; + 2733 : E0; + 2734 : 0A; + 2735 : D0; + 2736 : 02; + 2737 : A2; + 2738 : 00; + 2739 : 8E; + 273A : 0D; + 273B : 02; + 273C : 4C; + 273D : 7E; + 273E : E6; + 273F : BD; + 2740 : 5B; + 2741 : E7; + 2742 : D0; + 2743 : 07; + 2744 : A9; + 2745 : 01; + 2746 : 8D; + 2747 : 04; + 2748 : 02; + 2749 : D0; + 274A : 10; + 274B : C9; + 274C : FF; + 274D : F0; + 274E : 0C; + 274F : C9; + 2750 : 3C; + 2751 : D0; + 2752 : 05; + 2753 : 2C; + 2754 : 11; + 2755 : E8; + 2756 : 30; + 2757 : 03; + 2758 : 8E; + 2759 : 23; + 275A : 02; + 275B : 60; + 275C : 3D; + 275D : 2E; + 275E : FF; + 275F : 03; + 2760 : 3C; + 2761 : 20; + 2762 : 5B; + 2763 : 12; + 2764 : 2D; + 2765 : 30; + 2766 : 00; + 2767 : 3E; + 2768 : FF; + 2769 : 5D; + 276A : 40; + 276B : 00; + 276C : 2B; + 276D : 32; + 276E : FF; + 276F : 3F; + 2770 : 2C; + 2771 : 4E; + 2772 : 56; + 2773 : 58; + 2774 : 33; + 2775 : 31; + 2776 : 0D; + 2777 : 3B; + 2778 : 4D; + 2779 : 42; + 277A : 43; + 277B : 5A; + 277C : 2A; + 277D : 35; + 277E : FF; + 277F : 3A; + 2780 : 4B; + 2781 : 48; + 2782 : 46; + 2783 : 53; + 2784 : 36; + 2785 : 34; + 2786 : FF; + 2787 : 4C; + 2788 : 4A; + 2789 : 47; + 278A : 44; + 278B : 41; + 278C : 2F; + 278D : 38; + 278E : FF; + 278F : 50; + 2790 : 49; + 2791 : 59; + 2792 : 52; + 2793 : 57; + 2794 : 39; + 2795 : 37; + 2796 : 5E; + 2797 : 4F; + 2798 : 55; + 2799 : 54; + 279A : 45; + 279B : 51; + 279C : 14; + 279D : 11; + 279E : FF; + 279F : 29; + 27A0 : 5C; + 27A1 : 27; + 27A2 : 24; + 27A3 : 22; + 27A4 : 1D; + 27A5 : 13; + 27A6 : 5F; + 27A7 : 28; + 27A8 : 26; + 27A9 : 25; + 27AA : 23; + 27AB : 21; + 27AC : A8; + 27AD : AD; + 27AE : 40; + 27AF : E8; + 27B0 : 29; + 27B1 : 20; + 27B2 : D0; + 27B3 : F9; + 27B4 : 98; + 27B5 : A4; + 27B6 : E2; + 27B7 : 91; + 27B8 : E0; + 27B9 : 60; + 27BA : 68; + 27BB : 60; + 27BC : 00; + 27BD : 28; + 27BE : 50; + 27BF : 78; + 27C0 : A0; + 27C1 : C8; + 27C2 : F0; + 27C3 : 18; + 27C4 : 40; + 27C5 : 68; + 27C6 : 90; + 27C7 : B8; + 27C8 : E0; + 27C9 : 08; + 27CA : 30; + 27CB : 58; + 27CC : 80; + 27CD : A8; + 27CE : D0; + 27CF : F8; + 27D0 : 20; + 27D1 : 48; + 27D2 : 70; + 27D3 : 98; + 27D4 : C0; + 27D5 : 4C; + 27D6 : 4F; + 27D7 : 41; + 27D8 : 44; + 27D9 : 0D; + 27DA : 52; + 27DB : 55; + 27DC : 4E; + 27DD : 0D; + 27DE : B9; + 27DF : 00; + 27E0 : F0; + 27E1 : 08; + 27E2 : 29; + 27E3 : 7F; + 27E4 : 20; + 27E5 : EA; + 27E6 : E3; + 27E7 : C8; + 27E8 : 28; + 27E9 : 10; + 27EA : F3; + 27EB : 60; + [27EC..27F2] : 00; + 27F3 : 0A; + 27F4 : 69; + 27F5 : 05; + 27F6 : A0; + 27F7 : 00; + 27F8 : 60; + [27F9..27FF] : 00; + 2800 : 1C; + 2801 : 22; + 2802 : 4A; + 2803 : 56; + 2804 : 4C; + 2805 : 20; + 2806 : 1E; + 2807 : 00; + 2808 : 18; + 2809 : 24; + 280A : 42; + 280B : 7E; + [280C..280E] : 42; + 280F : 00; + 2810 : 7C; + [2811..2812] : 22; + 2813 : 3C; + [2814..2815] : 22; + 2816 : 7C; + 2817 : 00; + 2818 : 1C; + 2819 : 22; + [281A..281C] : 40; + 281D : 22; + 281E : 1C; + 281F : 00; + 2820 : 78; + 2821 : 24; + [2822..2824] : 22; + 2825 : 24; + 2826 : 78; + 2827 : 00; + 2828 : 7E; + [2829..282A] : 40; + 282B : 78; + [282C..282D] : 40; + 282E : 7E; + 282F : 00; + 2830 : 7E; + [2831..2832] : 40; + 2833 : 78; + [2834..2836] : 40; + 2837 : 00; + 2838 : 1C; + 2839 : 22; + 283A : 40; + 283B : 4E; + 283C : 42; + 283D : 22; + 283E : 1C; + 283F : 00; + [2840..2842] : 42; + 2843 : 7E; + [2844..2846] : 42; + 2847 : 00; + 2848 : 1C; + [2849..284D] : 08; + 284E : 1C; + 284F : 00; + 2850 : 0E; + [2851..2854] : 04; + 2855 : 44; + 2856 : 38; + 2857 : 00; + 2858 : 42; + 2859 : 44; + 285A : 48; + 285B : 70; + 285C : 48; + 285D : 44; + 285E : 42; + 285F : 00; + [2860..2865] : 40; + 2866 : 7E; + 2867 : 00; + 2868 : 42; + 2869 : 66; + [286A..286B] : 5A; + [286C..286E] : 42; + 286F : 00; + 2870 : 42; + 2871 : 62; + 2872 : 52; + 2873 : 4A; + 2874 : 46; + [2875..2876] : 42; + 2877 : 00; + 2878 : 18; + 2879 : 24; + [287A..287C] : 42; + 287D : 24; + 287E : 18; + 287F : 00; + 2880 : 7C; + [2881..2882] : 42; + 2883 : 7C; + [2884..2886] : 40; + 2887 : 00; + 2888 : 18; + 2889 : 24; + [288A..288B] : 42; + 288C : 4A; + 288D : 24; + 288E : 1A; + 288F : 00; + 2890 : 7C; + [2891..2892] : 42; + 2893 : 7C; + 2894 : 48; + 2895 : 44; + 2896 : 42; + 2897 : 00; + 2898 : 3C; + 2899 : 42; + 289A : 40; + 289B : 3C; + 289C : 02; + 289D : 42; + 289E : 3C; + 289F : 00; + 28A0 : 3E; + [28A1..28A6] : 08; + 28A7 : 00; + [28A8..28AD] : 42; + 28AE : 3C; + 28AF : 00; + [28B0..28B2] : 42; + [28B3..28B4] : 24; + [28B5..28B6] : 18; + 28B7 : 00; + [28B8..28BA] : 42; + [28BB..28BC] : 5A; + 28BD : 66; + 28BE : 42; + 28BF : 00; + [28C0..28C1] : 42; + 28C2 : 24; + 28C3 : 18; + 28C4 : 24; + [28C5..28C6] : 42; + 28C7 : 00; + [28C8..28CA] : 22; + 28CB : 1C; + [28CC..28CE] : 08; + 28CF : 00; + 28D0 : 7E; + 28D1 : 02; + 28D2 : 04; + 28D3 : 18; + 28D4 : 20; + 28D5 : 40; + 28D6 : 7E; + 28D7 : 00; + 28D8 : 3C; + [28D9..28DD] : 20; + 28DE : 3C; + [28DF..28E0] : 00; + 28E1 : 40; + 28E2 : 20; + 28E3 : 10; + 28E4 : 08; + 28E5 : 04; + 28E6 : 02; + 28E7 : 00; + 28E8 : 3C; + [28E9..28ED] : 04; + 28EE : 3C; + [28EF..28F0] : 00; + 28F1 : 08; + 28F2 : 1C; + 28F3 : 2A; + [28F4..28F7] : 08; + [28F8..28F9] : 00; + 28FA : 10; + 28FB : 20; + 28FC : 7F; + 28FD : 20; + 28FE : 10; + [28FF..2907] : 00; + [2908..290B] : 08; + [290C..290D] : 00; + 290E : 08; + 290F : 00; + [2910..2912] : 24; + [2913..2917] : 00; + [2918..2919] : 24; + 291A : 7E; + 291B : 24; + 291C : 7E; + [291D..291E] : 24; + 291F : 00; + 2920 : 08; + 2921 : 1E; + 2922 : 28; + 2923 : 1C; + 2924 : 0A; + 2925 : 3C; + 2926 : 08; + [2927..2928] : 00; + 2929 : 62; + 292A : 64; + 292B : 08; + 292C : 10; + 292D : 26; + 292E : 46; + 292F : 00; + 2930 : 30; + [2931..2932] : 48; + 2933 : 30; + 2934 : 4A; + 2935 : 44; + 2936 : 3A; + 2937 : 00; + 2938 : 04; + 2939 : 08; + 293A : 10; + [293B..293F] : 00; + 2940 : 04; + 2941 : 08; + [2942..2944] : 10; + 2945 : 08; + 2946 : 04; + 2947 : 00; + 2948 : 20; + 2949 : 10; + [294A..294C] : 08; + 294D : 10; + 294E : 20; + 294F : 00; + 2950 : 08; + 2951 : 2A; + 2952 : 1C; + 2953 : 3E; + 2954 : 1C; + 2955 : 2A; + 2956 : 08; + [2957..2958] : 00; + [2959..295A] : 08; + 295B : 3E; + [295C..295D] : 08; + [295E..2964] : 00; + [2965..2966] : 08; + 2967 : 10; + [2968..296A] : 00; + 296B : 7E; + [296C..2974] : 00; + [2975..2976] : 18; + [2977..2978] : 00; + 2979 : 02; + 297A : 04; + 297B : 08; + 297C : 10; + 297D : 20; + 297E : 40; + 297F : 00; + 2980 : 3C; + 2981 : 42; + 2982 : 46; + 2983 : 5A; + 2984 : 62; + 2985 : 42; + 2986 : 3C; + 2987 : 00; + 2988 : 08; + 2989 : 18; + 298A : 28; + [298B..298D] : 08; + 298E : 3E; + 298F : 00; + 2990 : 3C; + 2991 : 42; + 2992 : 02; + 2993 : 0C; + 2994 : 30; + 2995 : 40; + 2996 : 7E; + 2997 : 00; + 2998 : 3C; + 2999 : 42; + 299A : 02; + 299B : 1C; + 299C : 02; + 299D : 42; + 299E : 3C; + 299F : 00; + 29A0 : 04; + 29A1 : 0C; + 29A2 : 14; + 29A3 : 24; + 29A4 : 7E; + [29A5..29A6] : 04; + 29A7 : 00; + 29A8 : 7E; + 29A9 : 40; + 29AA : 78; + 29AB : 04; + 29AC : 02; + 29AD : 44; + 29AE : 38; + 29AF : 00; + 29B0 : 1C; + 29B1 : 20; + 29B2 : 40; + 29B3 : 7C; + [29B4..29B5] : 42; + 29B6 : 3C; + 29B7 : 00; + 29B8 : 7E; + 29B9 : 42; + 29BA : 04; + 29BB : 08; + [29BC..29BE] : 10; + 29BF : 00; + 29C0 : 3C; + [29C1..29C2] : 42; + 29C3 : 3C; + [29C4..29C5] : 42; + 29C6 : 3C; + 29C7 : 00; + 29C8 : 3C; + [29C9..29CA] : 42; + 29CB : 3E; + 29CC : 02; + 29CD : 04; + 29CE : 38; + [29CF..29D1] : 00; + 29D2 : 08; + [29D3..29D4] : 00; + 29D5 : 08; + [29D6..29D9] : 00; + 29DA : 08; + [29DB..29DC] : 00; + [29DD..29DE] : 08; + 29DF : 10; + 29E0 : 0E; + 29E1 : 18; + 29E2 : 30; + 29E3 : 60; + 29E4 : 30; + 29E5 : 18; + 29E6 : 0E; + [29E7..29E9] : 00; + 29EA : 7E; + 29EB : 00; + 29EC : 7E; + [29ED..29EF] : 00; + 29F0 : 70; + 29F1 : 18; + 29F2 : 0C; + 29F3 : 06; + 29F4 : 0C; + 29F5 : 18; + 29F6 : 70; + 29F7 : 00; + 29F8 : 3C; + 29F9 : 42; + 29FA : 02; + 29FB : 0C; + 29FC : 10; + 29FD : 00; + 29FE : 10; + [29FF..2A03] : 00; + 2A04 : FF; + [2A05..2A07] : 00; + 2A08 : 08; + 2A09 : 1C; + 2A0A : 3E; + [2A0B..2A0C] : 7F; + 2A0D : 1C; + 2A0E : 3E; + 2A0F : 00; + [2A10..2A17] : 10; + [2A18..2A1A] : 00; + 2A1B : FF; + [2A1C..2A21] : 00; + 2A22 : FF; + [2A23..2A28] : 00; + 2A29 : FF; + [2A2A..2A34] : 00; + 2A35 : FF; + [2A36..2A37] : 00; + [2A38..2A3F] : 20; + [2A40..2A47] : 04; + [2A48..2A4B] : 00; + 2A4C : E0; + 2A4D : 10; + [2A4E..2A52] : 08; + 2A53 : 04; + 2A54 : 03; + [2A55..2A57] : 00; + [2A58..2A5A] : 08; + 2A5B : 10; + 2A5C : E0; + [2A5D..2A5F] : 00; + [2A60..2A66] : 80; + 2A67 : FF; + 2A68 : 80; + 2A69 : 40; + 2A6A : 20; + 2A6B : 10; + 2A6C : 08; + 2A6D : 04; + 2A6E : 02; + [2A6F..2A70] : 01; + 2A71 : 02; + 2A72 : 04; + 2A73 : 08; + 2A74 : 10; + 2A75 : 20; + 2A76 : 40; + 2A77 : 80; + 2A78 : FF; + [2A79..2A7F] : 80; + 2A80 : FF; + [2A81..2A87] : 01; + 2A88 : 00; + 2A89 : 3C; + [2A8A..2A8D] : 7E; + 2A8E : 3C; + [2A8F..2A95] : 00; + 2A96 : FF; + 2A97 : 00; + 2A98 : 36; + [2A99..2A9B] : 7F; + 2A9C : 3E; + 2A9D : 1C; + 2A9E : 08; + 2A9F : 00; + [2AA0..2AA7] : 40; + [2AA8..2AAB] : 00; + 2AAC : 03; + 2AAD : 04; + [2AAE..2AAF] : 08; + 2AB0 : 81; + 2AB1 : 42; + 2AB2 : 24; + [2AB3..2AB4] : 18; + 2AB5 : 24; + 2AB6 : 42; + 2AB7 : 81; + 2AB8 : 00; + 2AB9 : 3C; + [2ABA..2ABD] : 42; + 2ABE : 3C; + 2ABF : 00; + 2AC0 : 08; + 2AC1 : 1C; + 2AC2 : 2A; + 2AC3 : 77; + 2AC4 : 2A; + [2AC5..2AC6] : 08; + 2AC7 : 00; + [2AC8..2ACF] : 02; + 2AD0 : 08; + 2AD1 : 1C; + 2AD2 : 3E; + 2AD3 : 7F; + 2AD4 : 3E; + 2AD5 : 1C; + 2AD6 : 08; + 2AD7 : 00; + [2AD8..2ADB] : 08; + 2ADC : FF; + [2ADD..2ADF] : 08; + 2AE0 : A0; + 2AE1 : 50; + 2AE2 : A0; + 2AE3 : 50; + 2AE4 : A0; + 2AE5 : 50; + 2AE6 : A0; + 2AE7 : 50; + [2AE8..2AEF] : 08; + [2AF0..2AF1] : 00; + 2AF2 : 01; + 2AF3 : 3E; + 2AF4 : 54; + [2AF5..2AF6] : 14; + 2AF7 : 00; + 2AF8 : FF; + 2AF9 : 7F; + 2AFA : 3F; + 2AFB : 1F; + 2AFC : 0F; + 2AFD : 07; + 2AFE : 03; + 2AFF : 01; + [2B00..2B07] : 00; + [2B08..2B0F] : F0; + [2B10..2B13] : 00; + [2B14..2B18] : FF; + [2B19..2B26] : 00; + 2B27 : FF; + [2B28..2B2F] : 80; + 2B30 : AA; + 2B31 : 55; + 2B32 : AA; + 2B33 : 55; + 2B34 : AA; + 2B35 : 55; + 2B36 : AA; + 2B37 : 55; + [2B38..2B3F] : 01; + [2B40..2B43] : 00; + 2B44 : AA; + 2B45 : 55; + 2B46 : AA; + 2B47 : 55; + 2B48 : FF; + 2B49 : FE; + 2B4A : FC; + 2B4B : F8; + 2B4C : F0; + 2B4D : E0; + 2B4E : C0; + 2B4F : 80; + [2B50..2B57] : 03; + [2B58..2B5B] : 08; + 2B5C : 0F; + [2B5D..2B5F] : 08; + [2B60..2B63] : 00; + [2B64..2B67] : 0F; + [2B68..2B6B] : 08; + 2B6C : 0F; + [2B6D..2B73] : 00; + 2B74 : F8; + [2B75..2B77] : 08; + [2B78..2B7D] : 00; + [2B7E..2B7F] : FF; + [2B80..2B83] : 00; + 2B84 : 0F; + [2B85..2B8B] : 08; + 2B8C : FF; + [2B8D..2B93] : 00; + 2B94 : FF; + [2B95..2B9B] : 08; + 2B9C : F8; + [2B9D..2B9F] : 08; + [2BA0..2BA7] : C0; + [2BA8..2BAF] : E0; + [2BB0..2BB7] : 07; + [2BB8..2BB9] : FF; + [2BBA..2BBF] : 00; + [2BC0..2BC2] : FF; + [2BC3..2BCC] : 00; + [2BCD..2BCF] : FF; + [2BD0..2BD6] : 01; + 2BD7 : FF; + [2BD8..2BDB] : 00; + [2BDC..2BDF] : F0; + [2BE0..2BE3] : 0F; + [2BE4..2BE7] : 00; + [2BE8..2BEB] : 08; + 2BEC : F8; + [2BED..2BEF] : 00; + [2BF0..2BF3] : F0; + [2BF4..2BF7] : 00; + [2BF8..2BFB] : F0; + [2BFC..2BFF] : 0F; + 2C00 : 1C; + 2C01 : 22; + 2C02 : 4A; + 2C03 : 56; + 2C04 : 4C; + 2C05 : 20; + 2C06 : 1E; + 2C07 : 00; + 2C08 : 18; + 2C09 : 24; + 2C0A : 42; + 2C0B : 7E; + [2C0C..2C0E] : 42; + 2C0F : 00; + 2C10 : 7C; + [2C11..2C12] : 22; + 2C13 : 3C; + [2C14..2C15] : 22; + 2C16 : 7C; + 2C17 : 00; + 2C18 : 1C; + 2C19 : 22; + [2C1A..2C1C] : 40; + 2C1D : 22; + 2C1E : 1C; + 2C1F : 00; + 2C20 : 78; + 2C21 : 24; + [2C22..2C24] : 22; + 2C25 : 24; + 2C26 : 78; + 2C27 : 00; + 2C28 : 7E; + [2C29..2C2A] : 40; + 2C2B : 78; + [2C2C..2C2D] : 40; + 2C2E : 7E; + 2C2F : 00; + 2C30 : 7E; + [2C31..2C32] : 40; + 2C33 : 78; + [2C34..2C36] : 40; + 2C37 : 00; + 2C38 : 1C; + 2C39 : 22; + 2C3A : 40; + 2C3B : 4E; + 2C3C : 42; + 2C3D : 22; + 2C3E : 1C; + 2C3F : 00; + [2C40..2C42] : 42; + 2C43 : 7E; + [2C44..2C46] : 42; + 2C47 : 00; + 2C48 : 1C; + [2C49..2C4D] : 08; + 2C4E : 1C; + 2C4F : 00; + 2C50 : 0E; + [2C51..2C54] : 04; + 2C55 : 44; + 2C56 : 38; + 2C57 : 00; + 2C58 : 42; + 2C59 : 44; + 2C5A : 48; + 2C5B : 70; + 2C5C : 48; + 2C5D : 44; + 2C5E : 42; + 2C5F : 00; + [2C60..2C65] : 40; + 2C66 : 7E; + 2C67 : 00; + 2C68 : 42; + 2C69 : 66; + [2C6A..2C6B] : 5A; + [2C6C..2C6E] : 42; + 2C6F : 00; + 2C70 : 42; + 2C71 : 62; + 2C72 : 52; + 2C73 : 4A; + 2C74 : 46; + [2C75..2C76] : 42; + 2C77 : 00; + 2C78 : 18; + 2C79 : 24; + [2C7A..2C7C] : 42; + 2C7D : 24; + 2C7E : 18; + 2C7F : 00; + 2C80 : 7C; + [2C81..2C82] : 42; + 2C83 : 7C; + [2C84..2C86] : 40; + 2C87 : 00; + 2C88 : 18; + 2C89 : 24; + [2C8A..2C8B] : 42; + 2C8C : 4A; + 2C8D : 24; + 2C8E : 1A; + 2C8F : 00; + 2C90 : 7C; + [2C91..2C92] : 42; + 2C93 : 7C; + 2C94 : 48; + 2C95 : 44; + 2C96 : 42; + 2C97 : 00; + 2C98 : 3C; + 2C99 : 42; + 2C9A : 40; + 2C9B : 3C; + 2C9C : 02; + 2C9D : 42; + 2C9E : 3C; + 2C9F : 00; + 2CA0 : 3E; + [2CA1..2CA6] : 08; + 2CA7 : 00; + [2CA8..2CAD] : 42; + 2CAE : 3C; + 2CAF : 00; + [2CB0..2CB2] : 42; + [2CB3..2CB4] : 24; + [2CB5..2CB6] : 18; + 2CB7 : 00; + [2CB8..2CBA] : 42; + [2CBB..2CBC] : 5A; + 2CBD : 66; + 2CBE : 42; + 2CBF : 00; + [2CC0..2CC1] : 42; + 2CC2 : 24; + 2CC3 : 18; + 2CC4 : 24; + [2CC5..2CC6] : 42; + 2CC7 : 00; + [2CC8..2CCA] : 22; + 2CCB : 1C; + [2CCC..2CCE] : 08; + 2CCF : 00; + 2CD0 : 7E; + 2CD1 : 02; + 2CD2 : 04; + 2CD3 : 18; + 2CD4 : 20; + 2CD5 : 40; + 2CD6 : 7E; + 2CD7 : 00; + 2CD8 : 3C; + [2CD9..2CDD] : 20; + 2CDE : 3C; + [2CDF..2CE0] : 00; + 2CE1 : 40; + 2CE2 : 20; + 2CE3 : 10; + 2CE4 : 08; + 2CE5 : 04; + 2CE6 : 02; + 2CE7 : 00; + 2CE8 : 3C; + [2CE9..2CED] : 04; + 2CEE : 3C; + [2CEF..2CF0] : 00; + 2CF1 : 08; + 2CF2 : 1C; + 2CF3 : 2A; + [2CF4..2CF7] : 08; + [2CF8..2CF9] : 00; + 2CFA : 10; + 2CFB : 20; + 2CFC : 7F; + 2CFD : 20; + 2CFE : 10; + [2CFF..2D07] : 00; + [2D08..2D0B] : 08; + [2D0C..2D0D] : 00; + 2D0E : 08; + 2D0F : 00; + [2D10..2D12] : 24; + [2D13..2D17] : 00; + [2D18..2D19] : 24; + 2D1A : 7E; + 2D1B : 24; + 2D1C : 7E; + [2D1D..2D1E] : 24; + 2D1F : 00; + 2D20 : 08; + 2D21 : 1E; + 2D22 : 28; + 2D23 : 1C; + 2D24 : 0A; + 2D25 : 3C; + 2D26 : 08; + [2D27..2D28] : 00; + 2D29 : 62; + 2D2A : 64; + 2D2B : 08; + 2D2C : 10; + 2D2D : 26; + 2D2E : 46; + 2D2F : 00; + 2D30 : 30; + [2D31..2D32] : 48; + 2D33 : 30; + 2D34 : 4A; + 2D35 : 44; + 2D36 : 3A; + 2D37 : 00; + 2D38 : 04; + 2D39 : 08; + 2D3A : 10; + [2D3B..2D3F] : 00; + 2D40 : 04; + 2D41 : 08; + [2D42..2D44] : 10; + 2D45 : 08; + 2D46 : 04; + 2D47 : 00; + 2D48 : 20; + 2D49 : 10; + [2D4A..2D4C] : 08; + 2D4D : 10; + 2D4E : 20; + 2D4F : 00; + 2D50 : 08; + 2D51 : 2A; + 2D52 : 1C; + 2D53 : 3E; + 2D54 : 1C; + 2D55 : 2A; + 2D56 : 08; + [2D57..2D58] : 00; + [2D59..2D5A] : 08; + 2D5B : 3E; + [2D5C..2D5D] : 08; + [2D5E..2D64] : 00; + [2D65..2D66] : 08; + 2D67 : 10; + [2D68..2D6A] : 00; + 2D6B : 7E; + [2D6C..2D74] : 00; + [2D75..2D76] : 18; + [2D77..2D78] : 00; + 2D79 : 02; + 2D7A : 04; + 2D7B : 08; + 2D7C : 10; + 2D7D : 20; + 2D7E : 40; + 2D7F : 00; + 2D80 : 3C; + 2D81 : 42; + 2D82 : 46; + 2D83 : 5A; + 2D84 : 62; + 2D85 : 42; + 2D86 : 3C; + 2D87 : 00; + 2D88 : 08; + 2D89 : 18; + 2D8A : 28; + [2D8B..2D8D] : 08; + 2D8E : 3E; + 2D8F : 00; + 2D90 : 3C; + 2D91 : 42; + 2D92 : 02; + 2D93 : 0C; + 2D94 : 30; + 2D95 : 40; + 2D96 : 7E; + 2D97 : 00; + 2D98 : 3C; + 2D99 : 42; + 2D9A : 02; + 2D9B : 1C; + 2D9C : 02; + 2D9D : 42; + 2D9E : 3C; + 2D9F : 00; + 2DA0 : 04; + 2DA1 : 0C; + 2DA2 : 14; + 2DA3 : 24; + 2DA4 : 7E; + [2DA5..2DA6] : 04; + 2DA7 : 00; + 2DA8 : 7E; + 2DA9 : 40; + 2DAA : 78; + 2DAB : 04; + 2DAC : 02; + 2DAD : 44; + 2DAE : 38; + 2DAF : 00; + 2DB0 : 1C; + 2DB1 : 20; + 2DB2 : 40; + 2DB3 : 7C; + [2DB4..2DB5] : 42; + 2DB6 : 3C; + 2DB7 : 00; + 2DB8 : 7E; + 2DB9 : 42; + 2DBA : 04; + 2DBB : 08; + [2DBC..2DBE] : 10; + 2DBF : 00; + 2DC0 : 3C; + [2DC1..2DC2] : 42; + 2DC3 : 3C; + [2DC4..2DC5] : 42; + 2DC6 : 3C; + 2DC7 : 00; + 2DC8 : 3C; + [2DC9..2DCA] : 42; + 2DCB : 3E; + 2DCC : 02; + 2DCD : 04; + 2DCE : 38; + [2DCF..2DD1] : 00; + 2DD2 : 08; + [2DD3..2DD4] : 00; + 2DD5 : 08; + [2DD6..2DD9] : 00; + 2DDA : 08; + [2DDB..2DDC] : 00; + [2DDD..2DDE] : 08; + 2DDF : 10; + 2DE0 : 0E; + 2DE1 : 18; + 2DE2 : 30; + 2DE3 : 60; + 2DE4 : 30; + 2DE5 : 18; + 2DE6 : 0E; + [2DE7..2DE9] : 00; + 2DEA : 7E; + 2DEB : 00; + 2DEC : 7E; + [2DED..2DEF] : 00; + 2DF0 : 70; + 2DF1 : 18; + 2DF2 : 0C; + 2DF3 : 06; + 2DF4 : 0C; + 2DF5 : 18; + 2DF6 : 70; + 2DF7 : 00; + 2DF8 : 3C; + 2DF9 : 42; + 2DFA : 02; + 2DFB : 0C; + 2DFC : 10; + 2DFD : 00; + 2DFE : 10; + [2DFF..2E03] : 00; + 2E04 : FF; + [2E05..2E09] : 00; + 2E0A : 38; + 2E0B : 04; + 2E0C : 3C; + 2E0D : 44; + 2E0E : 3A; + 2E0F : 00; + [2E10..2E11] : 40; + 2E12 : 5C; + 2E13 : 62; + 2E14 : 42; + 2E15 : 62; + 2E16 : 5C; + [2E17..2E19] : 00; + 2E1A : 3C; + 2E1B : 42; + 2E1C : 40; + 2E1D : 42; + 2E1E : 3C; + 2E1F : 00; + [2E20..2E21] : 02; + 2E22 : 3A; + 2E23 : 46; + 2E24 : 42; + 2E25 : 46; + 2E26 : 3A; + [2E27..2E29] : 00; + 2E2A : 3C; + 2E2B : 42; + 2E2C : 7E; + 2E2D : 40; + 2E2E : 3C; + 2E2F : 00; + 2E30 : 0C; + 2E31 : 12; + 2E32 : 10; + 2E33 : 7C; + [2E34..2E36] : 10; + [2E37..2E39] : 00; + 2E3A : 3A; + [2E3B..2E3C] : 46; + 2E3D : 3A; + 2E3E : 02; + 2E3F : 3C; + [2E40..2E41] : 40; + 2E42 : 5C; + 2E43 : 62; + [2E44..2E46] : 42; + 2E47 : 00; + 2E48 : 08; + 2E49 : 00; + 2E4A : 18; + [2E4B..2E4D] : 08; + 2E4E : 1C; + 2E4F : 00; + 2E50 : 04; + 2E51 : 00; + 2E52 : 0C; + [2E53..2E55] : 04; + 2E56 : 44; + 2E57 : 38; + [2E58..2E59] : 40; + 2E5A : 44; + 2E5B : 48; + 2E5C : 50; + 2E5D : 68; + 2E5E : 44; + 2E5F : 00; + 2E60 : 18; + [2E61..2E65] : 08; + 2E66 : 1C; + [2E67..2E69] : 00; + 2E6A : 76; + [2E6B..2E6E] : 49; + [2E6F..2E71] : 00; + 2E72 : 5C; + 2E73 : 62; + [2E74..2E76] : 42; + [2E77..2E79] : 00; + 2E7A : 3C; + [2E7B..2E7D] : 42; + 2E7E : 3C; + [2E7F..2E81] : 00; + 2E82 : 5C; + [2E83..2E84] : 62; + 2E85 : 5C; + [2E86..2E87] : 40; + [2E88..2E89] : 00; + 2E8A : 3A; + [2E8B..2E8C] : 46; + 2E8D : 3A; + [2E8E..2E8F] : 02; + [2E90..2E91] : 00; + 2E92 : 5C; + 2E93 : 62; + [2E94..2E96] : 40; + [2E97..2E99] : 00; + 2E9A : 3E; + 2E9B : 40; + 2E9C : 3C; + 2E9D : 02; + 2E9E : 7C; + 2E9F : 00; + [2EA0..2EA1] : 10; + 2EA2 : 7C; + [2EA3..2EA4] : 10; + 2EA5 : 12; + 2EA6 : 0C; + [2EA7..2EA9] : 00; + [2EAA..2EAC] : 42; + 2EAD : 46; + 2EAE : 3A; + [2EAF..2EB1] : 00; + [2EB2..2EB4] : 42; + 2EB5 : 24; + 2EB6 : 18; + [2EB7..2EB9] : 00; + 2EBA : 41; + [2EBB..2EBD] : 49; + 2EBE : 36; + [2EBF..2EC1] : 00; + 2EC2 : 42; + 2EC3 : 24; + 2EC4 : 18; + 2EC5 : 24; + 2EC6 : 42; + [2EC7..2EC9] : 00; + [2ECA..2ECB] : 42; + 2ECC : 46; + 2ECD : 3A; + 2ECE : 02; + 2ECF : 3C; + [2ED0..2ED1] : 00; + 2ED2 : 7E; + 2ED3 : 04; + 2ED4 : 18; + 2ED5 : 20; + 2ED6 : 7E; + 2ED7 : 00; + [2ED8..2EDB] : 08; + 2EDC : FF; + [2EDD..2EDF] : 08; + 2EE0 : A0; + 2EE1 : 50; + 2EE2 : A0; + 2EE3 : 50; + 2EE4 : A0; + 2EE5 : 50; + 2EE6 : A0; + 2EE7 : 50; + [2EE8..2EEF] : 08; + [2EF0..2EF1] : CC; + [2EF2..2EF3] : 33; + [2EF4..2EF5] : CC; + [2EF6..2EF7] : 33; + 2EF8 : CC; + 2EF9 : 66; + 2EFA : 33; + 2EFB : 99; + 2EFC : CC; + 2EFD : 66; + 2EFE : 33; + 2EFF : 99; + [2F00..2F07] : 00; + [2F08..2F0F] : F0; + [2F10..2F13] : 00; + [2F14..2F18] : FF; + [2F19..2F26] : 00; + 2F27 : FF; + [2F28..2F2F] : 80; + 2F30 : AA; + 2F31 : 55; + 2F32 : AA; + 2F33 : 55; + 2F34 : AA; + 2F35 : 55; + 2F36 : AA; + 2F37 : 55; + [2F38..2F3F] : 01; + [2F40..2F43] : 00; + 2F44 : AA; + 2F45 : 55; + 2F46 : AA; + 2F47 : 55; + 2F48 : 99; + 2F49 : 33; + 2F4A : 66; + 2F4B : CC; + 2F4C : 99; + 2F4D : 33; + 2F4E : 66; + 2F4F : CC; + [2F50..2F57] : 03; + [2F58..2F5B] : 08; + 2F5C : 0F; + [2F5D..2F5F] : 08; + [2F60..2F63] : 00; + [2F64..2F67] : 0F; + [2F68..2F6B] : 08; + 2F6C : 0F; + [2F6D..2F73] : 00; + 2F74 : F8; + [2F75..2F77] : 08; + [2F78..2F7D] : 00; + [2F7E..2F7F] : FF; + [2F80..2F83] : 00; + 2F84 : 0F; + [2F85..2F8B] : 08; + 2F8C : FF; + [2F8D..2F93] : 00; + 2F94 : FF; + [2F95..2F9B] : 08; + 2F9C : F8; + [2F9D..2F9F] : 08; + [2FA0..2FA7] : C0; + [2FA8..2FAF] : E0; + [2FB0..2FB7] : 07; + [2FB8..2FB9] : FF; + [2FBA..2FBF] : 00; + [2FC0..2FC2] : FF; + [2FC3..2FCC] : 00; + [2FCD..2FCF] : FF; + 2FD0 : 01; + 2FD1 : 02; + 2FD2 : 44; + 2FD3 : 48; + 2FD4 : 50; + 2FD5 : 60; + 2FD6 : 40; + [2FD7..2FDB] : 00; + [2FDC..2FDF] : F0; + [2FE0..2FE3] : 0F; + [2FE4..2FE7] : 00; + [2FE8..2FEB] : 08; + 2FEC : F8; + [2FED..2FEF] : 00; + [2FF0..2FF3] : F0; + [2FF4..2FF7] : 00; + [2FF8..2FFB] : F0; + [2FFC..2FFF] : 0F; + 3000 : 54; + [3001..3002] : 4F; + 3003 : 20; + 3004 : 4D; + 3005 : 41; + 3006 : 4E; + 3007 : 59; + 3008 : 20; + 3009 : 46; + 300A : 49; + 300B : 4C; + 300C : 45; + 300D : D3; + 300E : 46; + 300F : 49; + 3010 : 4C; + 3011 : 45; + 3012 : 20; + 3013 : 4F; + 3014 : 50; + 3015 : 45; + 3016 : CE; + 3017 : 46; + 3018 : 49; + 3019 : 4C; + 301A : 45; + 301B : 20; + 301C : 4E; + 301D : 4F; + 301E : 54; + 301F : 20; + 3020 : 4F; + 3021 : 50; + 3022 : 45; + 3023 : CE; + 3024 : 46; + 3025 : 49; + 3026 : 4C; + 3027 : 45; + 3028 : 20; + 3029 : 4E; + 302A : 4F; + 302B : 54; + 302C : 20; + 302D : 46; + 302E : 4F; + 302F : 55; + 3030 : 4E; + 3031 : C4; + 3032 : 0D; + 3033 : 53; + 3034 : 45; + 3035 : 41; + 3036 : 52; + 3037 : 43; + 3038 : 48; + 3039 : 49; + 303A : 4E; + 303B : 47; + 303C : A0; + 303D : 46; + 303E : 4F; + 303F : 52; + 3040 : A0; + 3041 : 0D; + 3042 : 50; + 3043 : 52; + 3044 : 45; + [3045..3046] : 53; + 3047 : 20; + 3048 : 50; + 3049 : 4C; + 304A : 41; + 304B : 59; + 304C : A0; + 304D : 26; + 304E : 20; + 304F : 52; + 3050 : 45; + 3051 : 43; + 3052 : 4F; + 3053 : 52; + 3054 : 44; + 3055 : A0; + 3056 : 4F; + 3057 : 4E; + 3058 : 20; + 3059 : 54; + 305A : 41; + 305B : 50; + 305C : 45; + 305D : 20; + 305E : A3; + 305F : 0D; + 3060 : 4C; + 3061 : 4F; + 3062 : 41; + 3063 : C4; + 3064 : 0D; + 3065 : 57; + 3066 : 52; + 3067 : 49; + 3068 : 54; + 3069 : 49; + 306A : 4E; + 306B : 47; + 306C : A0; + 306D : 0D; + 306E : 56; + 306F : 45; + 3070 : 52; + 3071 : 49; + 3072 : 46; + 3073 : D9; + 3074 : 44; + 3075 : 45; + 3076 : 56; + 3077 : 49; + 3078 : 43; + 3079 : 45; + 307A : 20; + 307B : 4E; + 307C : 4F; + 307D : 54; + 307E : 20; + 307F : 50; + 3080 : 52; + 3081 : 45; + 3082 : 53; + 3083 : 45; + 3084 : 4E; + 3085 : D4; + 3086 : 4E; + 3087 : 4F; + 3088 : 54; + 3089 : 20; + 308A : 49; + 308B : 4E; + 308C : 50; + 308D : 55; + 308E : 54; + 308F : 20; + 3090 : 46; + 3091 : 49; + 3092 : 4C; + 3093 : C5; + 3094 : 4E; + 3095 : 4F; + 3096 : 54; + 3097 : 20; + 3098 : 4F; + 3099 : 55; + 309A : 54; + 309B : 50; + 309C : 55; + 309D : 54; + 309E : 20; + 309F : 46; + 30A0 : 49; + 30A1 : 4C; + 30A2 : C5; + 30A3 : 0D; + 30A4 : 46; + 30A5 : 4F; + 30A6 : 55; + 30A7 : 4E; + 30A8 : 44; + 30A9 : A0; + 30AA : 0D; + 30AB : 4F; + 30AC : 4B; + 30AD : 8D; + 30AE : 0D; + 30AF : 52; + 30B0 : 45; + 30B1 : 41; + 30B2 : 44; + 30B3 : 59; + 30B4 : 2E; + 30B5 : 8D; + 30B6 : A9; + 30B7 : 40; + 30B8 : D0; + 30B9 : 02; + 30BA : A9; + 30BB : 20; + 30BC : 48; + 30BD : AD; + 30BE : 40; + 30BF : E8; + 30C0 : 09; + 30C1 : 02; + 30C2 : 8D; + 30C3 : 40; + 30C4 : E8; + 30C5 : A9; + 30C6 : 3C; + 30C7 : 8D; + 30C8 : 21; + 30C9 : E8; + 30CA : 2C; + 30CB : 1D; + 30CC : 02; + 30CD : F0; + 30CE : 12; + 30CF : A9; + 30D0 : 34; + 30D1 : 8D; + 30D2 : 11; + 30D3 : E8; + 30D4 : 20; + 30D5 : F1; + 30D6 : F0; + 30D7 : A9; + 30D8 : 00; + 30D9 : 8D; + 30DA : 1D; + 30DB : 02; + 30DC : A9; + 30DD : 3C; + 30DE : 8D; + 30DF : 11; + 30E0 : E8; + 30E1 : 68; + 30E2 : 05; + 30E3 : F1; + 30E4 : 8D; + 30E5 : 22; + 30E6 : 02; + 30E7 : AD; + 30E8 : 40; + 30E9 : E8; + 30EA : 10; + 30EB : FB; + 30EC : 29; + 30ED : FB; + 30EE : 8D; + 30EF : 40; + 30F0 : E8; + 30F1 : A9; + 30F2 : 3C; + 30F3 : 8D; + 30F4 : 23; + 30F5 : E8; + 30F6 : AD; + 30F7 : 40; + 30F8 : E8; + 30F9 : 29; + 30FA : 41; + 30FB : C9; + 30FC : 41; + 30FD : F0; + 30FE : 43; + 30FF : AD; + 3100 : 22; + 3101 : 02; + 3102 : 49; + 3103 : FF; + 3104 : 8D; + 3105 : 22; + 3106 : E8; + 3107 : 2C; + 3108 : 40; + 3109 : E8; + 310A : 50; + 310B : FB; + 310C : A9; + 310D : 34; + 310E : 8D; + 310F : 23; + 3110 : E8; + 3111 : A9; + 3112 : FF; + 3113 : 8D; + 3114 : 45; + 3115 : E8; + 3116 : AD; + 3117 : 40; + 3118 : E8; + 3119 : 2C; + 311A : 4D; + 311B : E8; + 311C : 70; + 311D : 1D; + 311E : 4A; + 311F : 90; + 3120 : F5; + 3121 : A9; + 3122 : 3C; + 3123 : 8D; + 3124 : 23; + 3125 : E8; + 3126 : A9; + 3127 : FF; + 3128 : 8D; + 3129 : 22; + 312A : E8; + 312B : 60; + 312C : 8D; + 312D : 22; + 312E : 02; + 312F : 20; + 3130 : F1; + 3131 : F0; + 3132 : AD; + 3133 : 40; + 3134 : E8; + 3135 : 09; + 3136 : 04; + 3137 : 8D; + 3138 : 40; + 3139 : E8; + 313A : 60; + 313B : A9; + 313C : 01; + 313D : 20; + 313E : E5; + 313F : FB; + 3140 : D0; + 3141 : DF; + 3142 : A9; + 3143 : 80; + 3144 : 30; + 3145 : F7; + 3146 : A9; + 3147 : 02; + 3148 : 20; + 3149 : E5; + 314A : FB; + 314B : AD; + 314C : 40; + 314D : E8; + 314E : 29; + 314F : FD; + 3150 : 8D; + 3151 : 40; + 3152 : E8; + 3153 : A9; + 3154 : 34; + 3155 : 8D; + 3156 : 21; + 3157 : E8; + 3158 : A9; + 3159 : 0D; + 315A : 60; + 315B : 8D; + 315C : 22; + 315D : 02; + 315E : 20; + 315F : F1; + 3160 : F0; + 3161 : 20; + 3162 : 4B; + 3163 : F1; + 3164 : 4C; + 3165 : 32; + 3166 : F1; + 3167 : 2C; + 3168 : 1D; + 3169 : 02; + 316A : 30; + 316B : 05; + 316C : CE; + 316D : 1D; + 316E : 02; + 316F : D0; + 3170 : 05; + 3171 : 48; + 3172 : 20; + 3173 : F1; + 3174 : F0; + 3175 : 68; + 3176 : 8D; + 3177 : 22; + 3178 : 02; + 3179 : 60; + 317A : A9; + 317B : 5F; + 317C : D0; + 317D : 02; + 317E : A9; + 317F : 3F; + 3180 : 85; + 3181 : F1; + 3182 : 20; + 3183 : BC; + 3184 : F0; + 3185 : D0; + 3186 : AB; + 3187 : A9; + 3188 : 34; + 3189 : 8D; + 318A : 21; + 318B : E8; + 318C : AD; + 318D : 40; + 318E : E8; + 318F : 09; + 3190 : 02; + 3191 : 8D; + 3192 : 40; + 3193 : E8; + 3194 : A9; + 3195 : FF; + 3196 : 8D; + 3197 : 45; + 3198 : E8; + 3199 : 2C; + 319A : 4D; + 319B : E8; + 319C : 70; + 319D : A8; + 319E : 2C; + 319F : 40; + 31A0 : E8; + 31A1 : 30; + 31A2 : F6; + 31A3 : AD; + 31A4 : 40; + 31A5 : E8; + 31A6 : 29; + 31A7 : FD; + 31A8 : 8D; + 31A9 : 40; + 31AA : E8; + 31AB : 2C; + 31AC : 10; + 31AD : E8; + 31AE : 70; + 31AF : 05; + 31B0 : A9; + 31B1 : 40; + 31B2 : 20; + 31B3 : E5; + 31B4 : FB; + 31B5 : AD; + 31B6 : 20; + 31B7 : E8; + 31B8 : 49; + 31B9 : FF; + 31BA : 48; + 31BB : A9; + 31BC : 3C; + 31BD : 8D; + 31BE : 21; + 31BF : E8; + 31C0 : 2C; + 31C1 : 40; + 31C2 : E8; + 31C3 : 10; + 31C4 : FB; + 31C5 : A9; + 31C6 : 34; + 31C7 : 8D; + 31C8 : 21; + 31C9 : E8; + 31CA : 68; + 31CB : 60; + 31CC : A9; + 31CD : 00; + 31CE : 8D; + 31CF : 0C; + 31D0 : 02; + 31D1 : AD; + 31D2 : 63; + 31D3 : 02; + 31D4 : D0; + 31D5 : 1B; + 31D6 : AD; + 31D7 : 0D; + 31D8 : 02; + 31D9 : F0; + 31DA : 51; + 31DB : 78; + 31DC : 4C; + 31DD : 7D; + 31DE : E2; + 31DF : AD; + 31E0 : 63; + 31E1 : 02; + 31E2 : D0; + 31E3 : 0D; + 31E4 : A5; + 31E5 : E2; + 31E6 : 8D; + 31E7 : 21; + 31E8 : 02; + 31E9 : A5; + 31EA : F5; + 31EB : 8D; + 31EC : 20; + 31ED : 02; + 31EE : 4C; + 31EF : FA; + 31F0 : E2; + 31F1 : C9; + 31F2 : 03; + 31F3 : D0; + 31F4 : 0B; + 31F5 : 8D; + 31F6 : 60; + 31F7 : 02; + 31F8 : A5; + 31F9 : F2; + 31FA : 8D; + 31FB : 1E; + 31FC : 02; + 31FD : 4C; + 31FE : FA; + 31FF : E2; + 3200 : B0; + 3201 : 25; + 3202 : 8E; + 3203 : 61; + 3204 : 02; + 3205 : 20; + 3206 : 2D; + 3207 : F8; + 3208 : D0; + 3209 : 0E; + 320A : 20; + 320B : 7F; + 320C : F8; + 320D : A0; + 320E : 00; + 320F : 98; + 3210 : A6; + 3211 : F1; + 3212 : 9D; + 3213 : 70; + 3214 : 02; + 3215 : 4C; + 3216 : 05; + 3217 : F2; + 3218 : B1; + 3219 : F3; + 321A : D0; + 321B : 07; + 321C : A9; + 321D : 40; + 321E : 20; + 321F : E5; + 3220 : FB; + 3221 : D0; + 3222 : E2; + 3223 : AE; + 3224 : 61; + 3225 : 02; + 3226 : 60; + 3227 : AD; + 3228 : 0C; + 3229 : 02; + 322A : F0; + 322B : 01; + 322C : 60; + 322D : 4C; + 322E : 87; + 322F : F1; + 3230 : 48; + 3231 : AD; + 3232 : 64; + 3233 : 02; + 3234 : D0; + 3235 : 03; + 3236 : 4C; + 3237 : 79; + 3238 : C3; + 3239 : C9; + 323A : 03; + 323B : D0; + 323C : 04; + 323D : 68; + 323E : 4C; + 323F : EA; + 3240 : E3; + 3241 : 30; + 3242 : 04; + 3243 : 68; + 3244 : 4C; + 3245 : 67; + 3246 : F1; + 3247 : 68; + 3248 : 85; + 3249 : E9; + 324A : C9; + 324B : 1D; + 324C : D0; + 324D : 05; + 324E : EE; + 324F : 6A; + 3250 : 02; + 3251 : F0; + 3252 : D9; + 3253 : C9; + 3254 : 0A; + 3255 : F0; + 3256 : D5; + 3257 : 48; + 3258 : 8A; + 3259 : 48; + 325A : 98; + 325B : 48; + 325C : 20; + 325D : 2D; + 325E : F8; + 325F : D0; + 3260 : 12; + 3261 : 20; + 3262 : B9; + 3263 : F8; + 3264 : A6; + 3265 : F1; + 3266 : A9; + 3267 : 01; + 3268 : 9D; + 3269 : 70; + 326A : 02; + 326B : 20; + 326C : E3; + 326D : F5; + 326E : A9; + 326F : 02; + 3270 : 91; + 3271 : F3; + 3272 : C8; + 3273 : A5; + 3274 : E9; + 3275 : 91; + 3276 : F3; + 3277 : 68; + 3278 : A8; + 3279 : 68; + 327A : AA; + 327B : 68; + 327C : 60; + 327D : AD; + 327E : 64; + 327F : 02; + 3280 : F0; + 3281 : 09; + 3282 : C9; + 3283 : 03; + 3284 : F0; + 3285 : 05; + 3286 : 30; + 3287 : 03; + 3288 : 20; + 3289 : 7E; + 328A : F1; + 328B : AD; + 328C : 63; + 328D : 02; + 328E : F0; + 328F : 09; + 3290 : C9; + 3291 : 03; + 3292 : F0; + 3293 : 05; + 3294 : 30; + 3295 : 03; + 3296 : 20; + 3297 : 7A; + 3298 : F1; + 3299 : A9; + 329A : 00; + 329B : 8D; + 329C : 63; + 329D : 02; + 329E : A9; + 329F : 03; + 32A0 : 8D; + 32A1 : 64; + 32A2 : 02; + 32A3 : 60; + 32A4 : A9; + 32A5 : 00; + 32A6 : 8D; + 32A7 : 62; + 32A8 : 02; + 32A9 : F0; + 32AA : D2; + 32AB : AE; + 32AC : 62; + 32AD : 02; + 32AE : CA; + 32AF : 30; + 32B0 : 16; + 32B1 : DD; + 32B2 : 42; + 32B3 : 02; + 32B4 : F0; + 32B5 : 11; + 32B6 : D0; + 32B7 : F6; + 32B8 : BD; + 32B9 : 42; + 32BA : 02; + 32BB : 85; + 32BC : EF; + 32BD : BD; + 32BE : 4C; + 32BF : 02; + 32C0 : 85; + 32C1 : F1; + 32C2 : BD; + 32C3 : 56; + 32C4 : 02; + 32C5 : 85; + 32C6 : F0; + 32C7 : 60; + 32C8 : 20; + 32C9 : D4; + 32CA : F4; + 32CB : A5; + 32CC : EF; + 32CD : 20; + 32CE : AB; + 32CF : F2; + 32D0 : D0; + 32D1 : 57; + 32D2 : 20; + 32D3 : B8; + 32D4 : F2; + 32D5 : 8A; + 32D6 : 48; + 32D7 : A5; + 32D8 : F1; + 32D9 : F0; + 32DA : 2F; + 32DB : C9; + 32DC : 03; + 32DD : F0; + 32DE : 2B; + 32DF : B0; + 32E0 : 26; + 32E1 : A5; + [32E2..32E3] : F0; + 32E4 : 25; + 32E5 : 20; + 32E6 : 67; + 32E7 : F6; + 32E8 : A2; + 32E9 : 02; + 32EA : BD; + 32EB : 04; + 32EC : F3; + 32ED : 20; + 32EE : 48; + 32EF : F2; + 32F0 : CA; + 32F1 : 10; + 32F2 : F7; + 32F3 : 20; + 32F4 : B9; + 32F5 : F8; + 32F6 : A5; + 32F7 : F0; + 32F8 : C9; + 32F9 : 02; + 32FA : D0; + 32FB : 0E; + 32FC : A9; + 32FD : 05; + 32FE : 20; + 32FF : ED; + 3300 : F5; + 3301 : 4C; + 3302 : 0A; + 3303 : F3; + 3304 : 0D; + 3305 : 31; + 3306 : 00; + 3307 : 20; + 3308 : E6; + 3309 : F6; + 330A : 68; + 330B : AA; + 330C : CE; + 330D : 62; + 330E : 02; + 330F : EC; + 3310 : 62; + 3311 : 02; + 3312 : F0; + 3313 : 15; + 3314 : AC; + 3315 : 62; + 3316 : 02; + 3317 : B9; + 3318 : 42; + 3319 : 02; + 331A : 9D; + 331B : 42; + 331C : 02; + 331D : B9; + 331E : 4C; + 331F : 02; + 3320 : 9D; + 3321 : 4C; + 3322 : 02; + 3323 : B9; + 3324 : 56; + 3325 : 02; + 3326 : 9D; + 3327 : 56; + 3328 : 02; + 3329 : 60; + 332A : AD; + 332B : 09; + 332C : 02; + 332D : C9; + 332E : EF; + 332F : D0; + 3330 : 07; + 3331 : 08; + 3332 : A9; + 3333 : 00; + 3334 : 8D; + 3335 : 0D; + 3336 : 02; + 3337 : 28; + 3338 : 60; + 3339 : 20; + 333A : 2A; + 333B : F3; + 333C : 4C; + 333D : 1C; + 333E : C7; + 333F : A5; + 3340 : CA; + 3341 : D0; + 3342 : F5; + 3343 : 4C; + 3344 : DE; + 3345 : E7; + 3346 : A9; + 3347 : 00; + 3348 : 8D; + 3349 : 0B; + 334A : 02; + 334B : 20; + 334C : 33; + 334D : F4; + 334E : A9; + 334F : FF; + 3350 : CD; + 3351 : 09; + 3352 : 02; + 3353 : D0; + 3354 : FB; + 3355 : CD; + 3356 : 09; + 3357 : 02; + 3358 : D0; + 3359 : F6; + 335A : A9; + 335B : 04; + 335C : 85; + 335D : F8; + 335E : A9; + 335F : 00; + 3360 : 85; + 3361 : F7; + 3362 : A5; + 3363 : F1; + 3364 : D0; + 3365 : 03; + 3366 : 4C; + 3367 : 1C; + 3368 : CE; + 3369 : C9; + 336A : 03; + 336B : F0; + 336C : F9; + 336D : 90; + 336E : 36; + 336F : 20; + 3370 : 1C; + 3371 : F7; + 3372 : 20; + 3373 : FF; + 3374 : F3; + 3375 : 20; + 3376 : 62; + 3377 : F4; + 3378 : 20; + 3379 : B6; + 337A : F0; + 337B : 20; + 337C : 22; + 337D : F4; + 337E : 20; + 337F : 39; + 3380 : F3; + 3381 : 20; + 3382 : 87; + 3383 : F1; + 3384 : AE; + 3385 : 0C; + 3386 : 02; + 3387 : 30; + 3388 : 43; + 3389 : AC; + 338A : 0B; + 338B : 02; + 338C : F0; + 338D : 0C; + 338E : 88; + 338F : D1; + 3390 : F7; + 3391 : F0; + 3392 : 09; + 3393 : A2; + 3394 : 02; + 3395 : 8E; + 3396 : 0C; + 3397 : 02; + 3398 : D0; + 3399 : 02; + 339A : 91; + 339B : F7; + 339C : E6; + 339D : F7; + 339E : D0; + 339F : DE; + 33A0 : E6; + 33A1 : F8; + 33A2 : 4C; + 33A3 : 7E; + 33A4 : F3; + 33A5 : 20; + 33A6 : 67; + 33A7 : F6; + 33A8 : 20; + 33A9 : 3B; + 33AA : F8; + 33AB : 20; + 33AC : FF; + 33AD : F3; + 33AE : A5; + 33AF : EE; + 33B0 : F0; + 33B1 : 08; + 33B2 : 20; + 33B3 : 95; + 33B4 : F4; + 33B5 : D0; + 33B6 : 08; + 33B7 : 4C; + 33B8 : 79; + 33B9 : F5; + 33BA : 20; + 33BB : AE; + 33BC : F5; + 33BD : F0; + 33BE : F8; + 33BF : E0; + 33C0 : 01; + 33C1 : D0; + 33C2 : EB; + 33C3 : 20; + 33C4 : 4D; + 33C5 : F6; + 33C6 : 20; + 33C7 : 22; + 33C8 : F4; + 33C9 : 20; + 33CA : 8A; + 33CB : F8; + 33CC : AD; + 33CD : 0B; + 33CE : 02; + 33CF : D0; + 33D0 : 50; + 33D1 : 20; + 33D2 : 13; + 33D3 : F9; + 33D4 : AD; + 33D5 : 0C; + 33D6 : 02; + 33D7 : 29; + 33D8 : 10; + 33D9 : F0; + 33DA : 0A; + 33DB : A0; + 33DC : 00; + 33DD : 8C; + 33DE : 0D; + 33DF : 02; + 33E0 : A0; + 33E1 : 60; + 33E2 : 4C; + 33E3 : 7B; + 33E4 : F5; + 33E5 : A0; + 33E6 : AE; + 33E7 : 20; + 33E8 : 3F; + 33E9 : F3; + 33EA : A5; + 33EB : CA; + 33EC : D0; + 33ED : 0B; + 33EE : A5; + 33EF : E6; + 33F0 : 85; + 33F1 : 7D; + 33F2 : A5; + 33F3 : E5; + 33F4 : 85; + 33F5 : 7C; + 33F6 : 4C; + 33F7 : 30; + 33F8 : C4; + 33F9 : 20; + 33FA : 9A; + 33FB : C5; + 33FC : 4C; + 33FD : 81; + 33FE : C5; + 33FF : A5; + 3400 : CA; + 3401 : D0; + 3402 : 1E; + 3403 : A0; + 3404 : 32; + 3405 : 20; + 3406 : DE; + 3407 : E7; + 3408 : A5; + 3409 : EE; + 340A : F0; + 340B : 15; + 340C : A0; + 340D : 3D; + 340E : 20; + 340F : DE; + 3410 : E7; + 3411 : A4; + 3412 : EE; + 3413 : F0; + 3414 : 0C; + 3415 : A0; + 3416 : 00; + 3417 : B1; + 3418 : F9; + 3419 : 20; + 341A : EA; + 341B : E3; + 341C : C8; + 341D : C4; + 341E : EE; + 341F : D0; + 3420 : F6; + 3421 : 60; + 3422 : A0; + 3423 : 5F; + 3424 : AD; + 3425 : 0B; + 3426 : 02; + 3427 : F0; + 3428 : 02; + 3429 : A0; + 342A : 6D; + 342B : 20; + 342C : 3F; + 342D : F3; + 342E : A0; + 342F : 39; + 3430 : 4C; + 3431 : 3F; + 3432 : F3; + 3433 : A2; + 3434 : 00; + 3435 : 8E; + 3436 : 0C; + 3437 : 02; + 3438 : 86; + 3439 : E5; + 343A : 86; + 343B : EE; + 343C : 86; + 343D : F0; + 343E : E8; + 343F : 86; + 3440 : F1; + 3441 : A9; + 3442 : 04; + 3443 : 86; + 3444 : E6; + 3445 : 20; + 3446 : 15; + 3447 : F5; + 3448 : 20; + 3449 : 04; + 344A : F5; + 344B : 20; + 344C : 15; + 344D : F5; + 344E : 20; + 344F : 5C; + 3450 : F4; + 3451 : 86; + 3452 : F1; + 3453 : 20; + 3454 : 15; + 3455 : F5; + 3456 : 20; + 3457 : 5C; + 3458 : F4; + 3459 : 86; + 345A : F0; + 345B : 60; + 345C : 20; + 345D : 1D; + 345E : F5; + 345F : 4C; + 3460 : 76; + 3461 : D6; + 3462 : A5; + 3463 : F0; + 3464 : 30; + 3465 : F5; + 3466 : A4; + 3467 : EE; + 3468 : F0; + 3469 : F1; + 346A : 20; + 346B : BA; + 346C : F0; + 346D : A5; + 346E : F0; + 346F : 09; + 3470 : 40; + 3471 : 85; + 3472 : F0; + 3473 : 09; + 3474 : F0; + 3475 : 20; + 3476 : 2C; + 3477 : F1; + 3478 : AD; + 3479 : 0C; + 347A : 02; + 347B : 10; + 347C : 05; + 347D : A0; + 347E : 74; + 347F : 4C; + 3480 : 7B; + 3481 : F5; + 3482 : A5; + 3483 : EE; + 3484 : F0; + 3485 : 0C; + 3486 : A0; + 3487 : 00; + 3488 : B1; + 3489 : F9; + 348A : 20; + 348B : 67; + 348C : F1; + 348D : C8; + 348E : C4; + 348F : EE; + 3490 : D0; + 3491 : F6; + 3492 : 4C; + 3493 : 7E; + 3494 : F1; + 3495 : 20; + 3496 : AE; + 3497 : F5; + 3498 : F0; + 3499 : 20; + 349A : A0; + 349B : 05; + 349C : 8C; + 349D : 68; + 349E : 02; + 349F : A0; + 34A0 : 00; + 34A1 : 84; + 34A2 : E9; + 34A3 : C4; + 34A4 : EE; + 34A5 : F0; + 34A6 : 12; + 34A7 : B1; + 34A8 : F9; + 34A9 : AC; + 34AA : 68; + 34AB : 02; + 34AC : D1; + 34AD : F3; + 34AE : D0; + 34AF : E5; + 34B0 : E6; + 34B1 : E9; + 34B2 : EE; + 34B3 : 68; + 34B4 : 02; + 34B5 : A4; + 34B6 : E9; + 34B7 : D0; + 34B8 : EA; + 34B9 : 98; + 34BA : 60; + 34BB : A9; + 34BC : 01; + 34BD : 8D; + 34BE : 0B; + 34BF : 02; + 34C0 : 20; + 34C1 : 4B; + 34C2 : F3; + 34C3 : AD; + 34C4 : 0C; + 34C5 : 02; + 34C6 : 29; + 34C7 : 10; + 34C8 : F0; + 34C9 : 05; + 34CA : A0; + 34CB : 6E; + 34CC : 4C; + 34CD : 7B; + 34CE : F5; + 34CF : A0; + 34D0 : AA; + 34D1 : 4C; + 34D2 : DE; + 34D3 : E7; + 34D4 : A2; + 34D5 : 00; + 34D6 : 86; + 34D7 : F0; + 34D8 : 8E; + 34D9 : 0C; + 34DA : 02; + 34DB : 86; + 34DC : EE; + 34DD : E8; + 34DE : 86; + 34DF : F1; + 34E0 : 20; + 34E1 : 22; + 34E2 : F5; + 34E3 : 20; + 34E4 : 76; + 34E5 : D6; + 34E6 : 86; + 34E7 : EF; + 34E8 : 20; + 34E9 : 15; + 34EA : F5; + 34EB : 20; + 34EC : 5C; + 34ED : F4; + 34EE : 86; + 34EF : F1; + 34F0 : E0; + 34F1 : 03; + 34F2 : 90; + 34F3 : 02; + 34F4 : C6; + 34F5 : F0; + 34F6 : 20; + 34F7 : 15; + 34F8 : F5; + 34F9 : 20; + 34FA : 5C; + 34FB : F4; + 34FC : 86; + 34FD : F0; + 34FE : 20; + 34FF : 15; + 3500 : F5; + 3501 : 20; + 3502 : 1D; + 3503 : F5; + 3504 : 20; + 3505 : B8; + 3506 : CC; + 3507 : 20; + 3508 : 7B; + 3509 : D5; + 350A : 85; + 350B : EE; + 350C : A5; + 350D : 71; + 350E : 85; + 350F : F9; + 3510 : A5; + 3511 : 72; + 3512 : 85; + 3513 : FA; + 3514 : 60; + 3515 : 20; + 3516 : C8; + 3517 : 00; + 3518 : D0; + 3519 : 02; + [351A..351B] : 68; + 351C : 60; + 351D : A9; + 351E : 2C; + 351F : 20; + 3520 : 13; + 3521 : CE; + 3522 : 20; + 3523 : C8; + 3524 : 00; + 3525 : D0; + 3526 : F5; + 3527 : 4C; + 3528 : 1C; + 3529 : CE; + 352A : 20; + 352B : D4; + 352C : F4; + 352D : A5; + 352E : EF; + 352F : D0; + 3530 : 03; + 3531 : 4C; + 3532 : 1C; + 3533 : CE; + 3534 : 20; + 3535 : AB; + 3536 : F2; + 3537 : D0; + 3538 : 04; + 3539 : A0; + 353A : 0E; + 353B : D0; + 353C : 3E; + 353D : AE; + 353E : 62; + 353F : 02; + 3540 : A0; + 3541 : 00; + 3542 : 8C; + 3543 : 0C; + 3544 : 02; + 3545 : E0; + 3546 : 0A; + 3547 : F0; + 3548 : F2; + 3549 : EE; + 354A : 62; + 354B : 02; + 354C : A5; + 354D : EF; + 354E : 9D; + 354F : 42; + 3550 : 02; + 3551 : A5; + 3552 : F0; + 3553 : 9D; + 3554 : 56; + 3555 : 02; + 3556 : A5; + 3557 : F1; + 3558 : 9D; + 3559 : 4C; + 355A : 02; + 355B : F0; + 355C : 50; + 355D : C9; + 355E : 03; + 355F : F0; + 3560 : 4C; + 3561 : 90; + 3562 : 03; + 3563 : 4C; + 3564 : 62; + 3565 : F4; + 3566 : A5; + 3567 : F0; + 3568 : D0; + 3569 : 28; + 356A : 20; + 356B : 3B; + 356C : F8; + 356D : 20; + 356E : FF; + 356F : F3; + 3570 : A5; + 3571 : EE; + 3572 : F0; + 3573 : 17; + 3574 : 20; + 3575 : 95; + 3576 : F4; + 3577 : D0; + 3578 : 21; + 3579 : A0; + 357A : 24; + 357B : A9; + 357C : 0D; + 357D : 20; + 357E : EA; + 357F : E3; + 3580 : A9; + 3581 : 3F; + 3582 : 20; + 3583 : EA; + 3584 : E3; + 3585 : 20; + 3586 : DE; + 3587 : E7; + 3588 : 4C; + 3589 : 79; + 358A : C3; + 358B : 20; + 358C : AE; + 358D : F5; + 358E : F0; + 358F : E9; + 3590 : D0; + 3591 : 08; + 3592 : 20; + 3593 : 71; + 3594 : F8; + 3595 : A9; + 3596 : 04; + 3597 : 20; + 3598 : ED; + 3599 : F5; + 359A : A6; + 359B : F1; + 359C : A9; + 359D : BF; + 359E : A4; + [359F..35A0] : F0; + 35A1 : 08; + 35A2 : 20; + 35A3 : E3; + 35A4 : F5; + 35A5 : A9; + 35A6 : 02; + 35A7 : 91; + 35A8 : F3; + 35A9 : 98; + 35AA : 9D; + 35AB : 70; + 35AC : 02; + 35AD : 60; + 35AE : AD; + 35AF : 0B; + 35B0 : 02; + 35B1 : 48; + 35B2 : 20; + 35B3 : 7F; + 35B4 : F8; + 35B5 : A0; + 35B6 : 00; + 35B7 : B1; + 35B8 : F3; + 35B9 : C9; + 35BA : 05; + 35BB : F0; + 35BC : 20; + 35BD : C9; + 35BE : 01; + 35BF : F0; + 35C0 : 04; + 35C1 : C9; + 35C2 : 04; + 35C3 : D0; + 35C4 : ED; + 35C5 : AA; + 35C6 : A5; + 35C7 : CA; + 35C8 : D0; + 35C9 : 11; + 35CA : A0; + 35CB : A3; + 35CC : 20; + 35CD : DE; + 35CE : E7; + 35CF : A0; + 35D0 : 05; + 35D1 : B1; + 35D2 : F3; + 35D3 : 20; + 35D4 : EA; + 35D5 : E3; + 35D6 : C8; + 35D7 : C0; + 35D8 : 15; + 35D9 : D0; + 35DA : F6; + 35DB : A0; + 35DC : 01; + 35DD : 68; + 35DE : 8D; + 35DF : 0B; + 35E0 : 02; + 35E1 : 98; + 35E2 : 60; + 35E3 : A0; + 35E4 : BF; + 35E5 : A9; + 35E6 : 20; + 35E7 : 91; + 35E8 : F3; + 35E9 : 88; + 35EA : D0; + 35EB : FB; + 35EC : 60; + 35ED : 85; + 35EE : E9; + 35EF : A5; + 35F0 : F8; + 35F1 : 48; + 35F2 : A5; + 35F3 : F7; + 35F4 : 48; + 35F5 : A5; + 35F6 : E6; + 35F7 : 48; + 35F8 : A5; + 35F9 : E5; + 35FA : 48; + 35FB : 20; + 35FC : E3; + 35FD : F5; + 35FE : A5; + 35FF : E9; + 3600 : 91; + 3601 : F3; + 3602 : C8; + 3603 : A5; + 3604 : F7; + 3605 : 91; + 3606 : F3; + 3607 : C8; + 3608 : A5; + 3609 : F8; + 360A : 91; + 360B : F3; + 360C : C8; + 360D : A5; + 360E : E5; + 360F : 91; + 3610 : F3; + 3611 : C8; + 3612 : A5; + 3613 : E6; + 3614 : 91; + 3615 : F3; + 3616 : C8; + 3617 : 8C; + 3618 : 68; + 3619 : 02; + 361A : A0; + 361B : 00; + 361C : 84; + 361D : E9; + 361E : A4; + 361F : E9; + 3620 : C4; + 3621 : EE; + 3622 : F0; + 3623 : 0E; + 3624 : B1; + 3625 : F9; + 3626 : AC; + 3627 : 68; + 3628 : 02; + 3629 : 91; + 362A : F3; + 362B : E6; + 362C : E9; + 362D : EE; + 362E : 68; + 362F : 02; + 3630 : D0; + 3631 : EC; + 3632 : 20; + 3633 : 7D; + 3634 : F6; + 3635 : 20; + 3636 : 13; + 3637 : F9; + 3638 : A9; + 3639 : 69; + 363A : 8D; + 363B : 79; + 363C : 02; + 363D : 20; + 363E : C4; + 363F : F8; + 3640 : 68; + 3641 : 85; + 3642 : E5; + 3643 : 68; + 3644 : 85; + 3645 : E6; + 3646 : 68; + 3647 : 85; + 3648 : F7; + 3649 : 68; + 364A : 85; + 364B : F8; + 364C : 60; + 364D : 20; + 364E : 13; + 364F : F9; + 3650 : A2; + 3651 : 00; + 3652 : A0; + 3653 : 01; + 3654 : B1; + 3655 : F3; + 3656 : 95; + 3657 : E3; + 3658 : E8; + 3659 : C8; + 365A : E0; + 365B : 04; + 365C : D0; + 365D : F6; + 365E : A5; + 365F : E3; + 3660 : 85; + 3661 : F7; + 3662 : A5; + 3663 : E4; + 3664 : 85; + 3665 : F8; + 3666 : 60; + 3667 : A9; + 3668 : 7A; + 3669 : 85; + 366A : F3; + 366B : A9; + 366C : 02; + 366D : 85; + 366E : F4; + 366F : A5; + 3670 : F1; + 3671 : 4A; + 3672 : B0; + 3673 : 08; + 3674 : A9; + 3675 : 3A; + 3676 : 85; + 3677 : F3; + 3678 : A9; + 3679 : 03; + 367A : 85; + 367B : F4; + 367C : 60; + 367D : 20; + 367E : 13; + 367F : F9; + 3680 : 20; + 3681 : 67; + 3682 : F6; + 3683 : A5; + 3684 : F3; + 3685 : 85; + 3686 : F7; + 3687 : 18; + 3688 : 69; + 3689 : C0; + 368A : 85; + 368B : E5; + 368C : A5; + 368D : F4; + 368E : 85; + 368F : F8; + 3690 : 69; + 3691 : 00; + 3692 : 85; + 3693 : E6; + 3694 : 60; + 3695 : 20; + 3696 : A4; + 3697 : CC; + 3698 : 20; + 3699 : D0; + 369A : D6; + 369B : 6C; + 369C : 08; + 369D : 00; + 369E : 20; + 369F : 33; + 36A0 : F4; + 36A1 : A5; + 36A2 : 7C; + 36A3 : 85; + 36A4 : E5; + 36A5 : A5; + 36A6 : 7D; + 36A7 : 85; + 36A8 : E6; + 36A9 : A9; + 36AA : 04; + 36AB : 85; + 36AC : F8; + 36AD : A9; + 36AE : 00; + 36AF : 85; + 36B0 : F7; + 36B1 : A5; + 36B2 : F1; + 36B3 : D0; + 36B4 : 05; + 36B5 : A0; + 36B6 : 74; + 36B7 : 4C; + 36B8 : 7B; + 36B9 : F5; + 36BA : C9; + 36BB : 03; + 36BC : F0; + 36BD : F7; + 36BE : 90; + 36BF : 36; + 36C0 : 20; + 36C1 : 1C; + 36C2 : F7; + 36C3 : 20; + 36C4 : 62; + 36C5 : F4; + 36C6 : 20; + 36C7 : BA; + 36C8 : F0; + 36C9 : A0; + 36CA : 00; + 36CB : 20; + 36CC : DC; + 36CD : FB; + 36CE : 20; + 36CF : 90; + 36D0 : FD; + 36D1 : F0; + 36D2 : 10; + 36D3 : B1; + 36D4 : E3; + 36D5 : 20; + 36D6 : 67; + 36D7 : F1; + 36D8 : 20; + 36D9 : 39; + 36DA : F3; + 36DB : E6; + 36DC : E3; + 36DD : D0; + 36DE : EF; + 36DF : E6; + 36E0 : E4; + 36E1 : D0; + 36E2 : EB; + 36E3 : 20; + 36E4 : 7E; + 36E5 : F1; + 36E6 : 24; + 36E7 : F0; + 36E8 : 30; + 36E9 : 4B; + 36EA : 20; + 36EB : BA; + 36EC : F0; + 36ED : A5; + 36EE : F0; + 36EF : 29; + 36F0 : EF; + 36F1 : 09; + 36F2 : E0; + 36F3 : 4C; + 36F4 : 2C; + 36F5 : F1; + 36F6 : 20; + 36F7 : 67; + 36F8 : F6; + 36F9 : 20; + 36FA : 71; + 36FB : F8; + 36FC : A5; + 36FD : CA; + 36FE : D0; + 36FF : 08; + 3700 : A0; + 3701 : 64; + 3702 : 20; + 3703 : DE; + 3704 : E7; + 3705 : 20; + 3706 : 11; + 3707 : F4; + 3708 : A9; + 3709 : 01; + 370A : 20; + 370B : ED; + 370C : F5; + 370D : 20; + 370E : BC; + 370F : F8; + 3710 : A6; + [3711..3712] : F0; + 3713 : 21; + 3714 : CA; + 3715 : F0; + 3716 : 1E; + 3717 : A9; + 3718 : 05; + 3719 : 4C; + 371A : ED; + 371B : F5; + 371C : A2; + 371D : 00; + 371E : 86; + 371F : F0; + 3720 : A2; + 3721 : 00; + 3722 : E6; + 3723 : F0; + 3724 : EC; + 3725 : 62; + 3726 : 02; + 3727 : F0; + 3728 : 5E; + 3729 : BD; + 372A : 56; + 372B : 02; + 372C : 29; + 372D : 1F; + 372E : C5; + [372F..3730] : F0; + 3731 : EE; + 3732 : E8; + 3733 : D0; + 3734 : EF; + 3735 : 60; + 3736 : AD; + 3737 : 05; + 3738 : 02; + 3739 : 69; + 373A : 01; + 373B : 8D; + 373C : 05; + 373D : 02; + 373E : 90; + 373F : 03; + 3740 : EE; + 3741 : 06; + 3742 : 02; + 3743 : C9; + 3744 : 6F; + 3745 : D0; + 3746 : 07; + 3747 : AD; + 3748 : 06; + 3749 : 02; + 374A : C9; + 374B : 02; + 374C : F0; + 374D : 26; + 374E : EE; + [374F..3750] : 02; + 3751 : D0; + 3752 : 08; + 3753 : EE; + 3754 : 01; + 3755 : 02; + 3756 : D0; + 3757 : 03; + 3758 : EE; + 3759 : 00; + 375A : 02; + 375B : A2; + 375C : 00; + 375D : BD; + 375E : 00; + 375F : 02; + 3760 : DD; + 3761 : 88; + 3762 : F7; + 3763 : 90; + 3764 : 17; + 3765 : E8; + 3766 : E0; + 3767 : 03; + 3768 : D0; + 3769 : F3; + 376A : A9; + 376B : 00; + 376C : 9D; + 376D : FF; + 376E : 01; + 376F : CA; + 3770 : D0; + 3771 : FA; + 3772 : F0; + 3773 : 08; + 3774 : A9; + 3775 : 00; + 3776 : 8D; + 3777 : 05; + 3778 : 02; + 3779 : 8D; + 377A : 06; + 377B : 02; + 377C : AD; + 377D : 12; + 377E : E8; + 377F : CD; + 3780 : 12; + 3781 : E8; + 3782 : D0; + 3783 : F8; + 3784 : 8D; + 3785 : 09; + 3786 : 02; + 3787 : 60; + 3788 : 4F; + 3789 : 1A; + 378A : 01; + 378B : 48; + 378C : 8A; + 378D : 48; + 378E : 98; + 378F : 48; + 3790 : A9; + 3791 : 00; + 3792 : 8D; + 3793 : 0C; + 3794 : 02; + 3795 : 8A; + 3796 : 20; + 3797 : AB; + 3798 : F2; + 3799 : F0; + 379A : 05; + 379B : A0; + 379C : 17; + 379D : 4C; + 379E : 7B; + 379F : F5; + 37A0 : 20; + 37A1 : B8; + 37A2 : F2; + 37A3 : A5; + 37A4 : F1; + 37A5 : F0; + 37A6 : 0E; + 37A7 : C9; + 37A8 : 03; + 37A9 : F0; + 37AA : 0A; + 37AB : B0; + 37AC : 0E; + 37AD : A6; + [37AE..37AF] : F0; + 37B0 : 04; + 37B1 : A0; + 37B2 : 86; + 37B3 : D0; + 37B4 : E8; + 37B5 : 8D; + 37B6 : 63; + 37B7 : 02; + 37B8 : 4C; + 37B9 : 77; + 37BA : F2; + 37BB : 48; + 37BC : 20; + 37BD : B6; + 37BE : F0; + 37BF : A5; + 37C0 : F0; + 37C1 : 10; + 37C2 : 06; + 37C3 : 20; + 37C4 : 61; + 37C5 : F1; + 37C6 : 4C; + 37C7 : D0; + 37C8 : F7; + 37C9 : 29; + 37CA : 1F; + 37CB : 09; + 37CC : 60; + 37CD : 20; + 37CE : 5B; + 37CF : F1; + 37D0 : AD; + 37D1 : 0C; + 37D2 : 02; + 37D3 : 10; + 37D4 : 03; + 37D5 : 4C; + 37D6 : 7D; + 37D7 : F4; + 37D8 : 68; + 37D9 : 4C; + 37DA : B5; + 37DB : F7; + 37DC : 48; + 37DD : 8A; + 37DE : 48; + 37DF : 98; + 37E0 : 48; + 37E1 : A9; + 37E2 : 00; + 37E3 : 8D; + 37E4 : 0C; + 37E5 : 02; + 37E6 : A9; + 37E7 : FF; + 37E8 : 8D; + 37E9 : 6A; + 37EA : 02; + 37EB : 8A; + 37EC : 20; + 37ED : AB; + 37EE : F2; + 37EF : D0; + 37F0 : AA; + 37F1 : 20; + 37F2 : B8; + 37F3 : F2; + 37F4 : A5; + 37F5 : F1; + 37F6 : F0; + 37F7 : A3; + 37F8 : C9; + 37F9 : 03; + 37FA : F0; + 37FB : 0A; + 37FC : 10; + 37FD : 0E; + 37FE : A6; + 37FF : F0; + 3800 : D0; + 3801 : 04; + 3802 : A0; + 3803 : 94; + 3804 : D0; + 3805 : 97; + 3806 : 8D; + 3807 : 64; + 3808 : 02; + 3809 : 4C; + 380A : 77; + 380B : F2; + 380C : 48; + 380D : 20; + 380E : BA; + 380F : F0; + 3810 : A5; + 3811 : F0; + 3812 : 10; + 3813 : 06; + 3814 : 20; + 3815 : 32; + 3816 : F1; + 3817 : 4C; + 3818 : 21; + 3819 : F8; + 381A : 29; + 381B : 1F; + 381C : 09; + 381D : 60; + 381E : 20; + 381F : 2C; + 3820 : F1; + 3821 : AD; + 3822 : 0C; + 3823 : 02; + 3824 : 10; + 3825 : 03; + 3826 : 4C; + 3827 : 7D; + 3828 : F4; + 3829 : 68; + 382A : 4C; + 382B : 06; + 382C : F8; + 382D : 20; + 382E : 67; + 382F : F6; + 3830 : A6; + 3831 : F1; + 3832 : FE; + 3833 : 70; + 3834 : 02; + 3835 : BC; + 3836 : 70; + 3837 : 02; + [3838..3839] : C0; + 383A : 60; + 383B : 20; + 383C : 5E; + 383D : F8; + 383E : F0; + 383F : 30; + 3840 : A0; + 3841 : 41; + 3842 : 20; + 3843 : DE; + 3844 : E7; + 3845 : A0; + 3846 : 56; + 3847 : 20; + 3848 : DE; + 3849 : E7; + 384A : A5; + 384B : F1; + 384C : 09; + 384D : 30; + 384E : 20; + 384F : EA; + 3850 : E3; + 3851 : 20; + 3852 : 39; + 3853 : F3; + 3854 : 20; + 3855 : 5E; + 3856 : F8; + 3857 : D0; + 3858 : F8; + 3859 : A0; + 385A : AA; + 385B : 4C; + 385C : DE; + 385D : E7; + 385E : A9; + 385F : 10; + 3860 : A6; + 3861 : F1; + 3862 : E0; + 3863 : 01; + 3864 : F0; + 3865 : 02; + 3866 : A9; + 3867 : 20; + 3868 : 2C; + 3869 : 10; + 386A : E8; + 386B : D0; + 386C : 03; + 386D : 2C; + 386E : 10; + 386F : E8; + 3870 : 60; + 3871 : 20; + 3872 : 5E; + 3873 : F8; + 3874 : F0; + 3875 : FA; + 3876 : A0; + 3877 : 41; + 3878 : 20; + 3879 : DE; + 387A : E7; + 387B : A0; + 387C : 4D; + 387D : D0; + 387E : C3; + 387F : A9; + 3880 : 00; + 3881 : 8D; + 3882 : 0C; + 3883 : 02; + 3884 : 8D; + 3885 : 0B; + 3886 : 02; + 3887 : 20; + 3888 : 7D; + 3889 : F6; + 388A : 20; + 388B : 13; + 388C : F9; + 388D : 20; + 388E : 3B; + 388F : F8; + 3890 : 78; + 3891 : A9; + 3892 : 00; + 3893 : 8D; + 3894 : 78; + 3895 : 02; + 3896 : 85; + 3897 : EB; + 3898 : 85; + 3899 : E7; + 389A : 8D; + 389B : 76; + 389C : 02; + 389D : 8D; + 389E : 77; + 389F : 02; + 38A0 : 8D; + 38A1 : 66; + 38A2 : 02; + 38A3 : A2; + 38A4 : 0E; + 38A5 : 20; + 38A6 : 1B; + 38A7 : FD; + 38A8 : A6; + 38A9 : F1; + 38AA : CA; + 38AB : F0; + 38AC : 07; + 38AD : A9; + 38AE : 90; + 38AF : 8D; + 38B0 : 4E; + 38B1 : E8; + 38B2 : D0; + 38B3 : 1E; + 38B4 : EE; + 38B5 : 11; + 38B6 : E8; + 38B7 : D0; + 38B8 : 19; + 38B9 : 20; + 38BA : 7D; + 38BB : F6; + 38BC : 20; + 38BD : 13; + 38BE : F9; + 38BF : A9; + 38C0 : 14; + 38C1 : 8D; + 38C2 : 79; + 38C3 : 02; + 38C4 : 20; + 38C5 : 71; + 38C6 : F8; + 38C7 : 78; + 38C8 : A9; + 38C9 : A0; + 38CA : 8D; + 38CB : 4E; + 38CC : E8; + 38CD : A2; + 38CE : 08; + 38CF : 20; + 38D0 : 1B; + 38D1 : FD; + 38D2 : A9; + 38D3 : 02; + 38D4 : 85; + 38D5 : FD; + 38D6 : 20; + 38D7 : EC; + 38D8 : FB; + 38D9 : CE; + 38DA : 13; + 38DB : E8; + 38DC : A6; + 38DD : F1; + 38DE : CA; + 38DF : D0; + 38E0 : 0A; + 38E1 : A9; + 38E2 : 34; + 38E3 : 8D; + 38E4 : 13; + 38E5 : E8; + 38E6 : 8D; + 38E7 : 07; + 38E8 : 02; + 38E9 : D0; + 38EA : 0B; + 38EB : AD; + 38EC : 40; + 38ED : E8; + 38EE : 8E; + 38EF : 08; + 38F0 : 02; + 38F1 : 29; + 38F2 : EF; + 38F3 : 8D; + 38F4 : 40; + 38F5 : E8; + 38F6 : 8D; + 38F7 : 49; + 38F8 : E8; + 38F9 : 58; + 38FA : A9; + 38FB : E6; + 38FC : CD; + 38FD : 1A; + 38FE : 02; + 38FF : F0; + 3900 : 11; + 3901 : 20; + 3902 : 1E; + 3903 : F9; + 3904 : 2C; + 3905 : 13; + 3906 : E8; + 3907 : 10; + 3908 : F1; + 3909 : 2C; + 390A : 12; + 390B : E8; + 390C : 20; + 390D : 36; + 390E : F7; + 390F : 4C; + 3910 : FA; + 3911 : F8; + 3912 : 60; + 3913 : 20; + 3914 : 1E; + 3915 : F9; + 3916 : A9; + 3917 : E6; + 3918 : CD; + 3919 : 1A; + 391A : 02; + 391B : D0; + 391C : F6; + 391D : 60; + 391E : 20; + 391F : 2A; + 3920 : F3; + 3921 : D0; + [3922..3923] : 08; + 3924 : 20; + 3925 : FB; + 3926 : FC; + 3927 : 20; + 3928 : 99; + 3929 : F2; + 392A : 28; + 392B : 4C; + 392C : 1C; + 392D : C7; + 392E : 86; + 392F : E8; + 3930 : A5; + 3931 : E7; + [3932..3933] : 0A; + 3934 : 18; + 3935 : 65; + 3936 : E7; + 3937 : 18; + 3938 : 65; + 3939 : E8; + 393A : 85; + 393B : E8; + 393C : A9; + 393D : 00; + 393E : 24; + 393F : E7; + 3940 : 30; + 3941 : 01; + 3942 : 2A; + 3943 : 06; + 3944 : E8; + 3945 : 2A; + 3946 : 06; + 3947 : E8; + 3948 : 2A; + 3949 : AA; + 394A : AD; + 394B : 48; + 394C : E8; + 394D : C9; + 394E : 15; + 394F : 90; + 3950 : F9; + 3951 : 65; + 3952 : E8; + 3953 : 8D; + 3954 : 44; + 3955 : E8; + 3956 : 8A; + 3957 : 6D; + 3958 : 49; + 3959 : E8; + 395A : 8D; + 395B : 45; + 395C : E8; + 395D : 58; + 395E : 60; + 395F : AE; + 3960 : 49; + 3961 : E8; + 3962 : A0; + 3963 : FF; + 3964 : 98; + 3965 : ED; + 3966 : 48; + 3967 : E8; + 3968 : EC; + 3969 : 49; + 396A : E8; + 396B : D0; + 396C : F2; + 396D : 86; + 396E : E8; + 396F : AA; + 3970 : 8C; + 3971 : 48; + 3972 : E8; + 3973 : 8C; + 3974 : 49; + 3975 : E8; + 3976 : 98; + 3977 : E5; + 3978 : E8; + 3979 : 86; + 397A : E8; + 397B : 4A; + 397C : 66; + 397D : E8; + 397E : 4A; + 397F : 66; + 3980 : E8; + 3981 : A5; + 3982 : E7; + 3983 : 18; + 3984 : 69; + 3985 : 3C; + 3986 : 2C; + 3987 : 40; + 3988 : E8; + 3989 : 2C; + 398A : 10; + 398B : E8; + 398C : C5; + 398D : E8; + 398E : B0; + 398F : 55; + 3990 : AE; + 3991 : 66; + 3992 : 02; + 3993 : F0; + 3994 : 03; + 3995 : 4C; + 3996 : A3; + 3997 : FA; + 3998 : AE; + 3999 : 6C; + 399A : 02; + 399B : 30; + 399C : 1B; + 399D : A2; + 399E : 00; + 399F : 69; + 39A0 : 30; + 39A1 : 65; + 39A2 : E7; + 39A3 : C5; + 39A4 : E8; + 39A5 : B0; + 39A6 : 1E; + 39A7 : E8; + 39A8 : 69; + 39A9 : 26; + 39AA : 65; + 39AB : E7; + 39AC : C5; + 39AD : E8; + 39AE : B0; + 39AF : 1B; + 39B0 : 69; + 39B1 : 2C; + 39B2 : 65; + 39B3 : E7; + 39B4 : C5; + 39B5 : E8; + 39B6 : 90; + 39B7 : 03; + 39B8 : 4C; + 39B9 : 4A; + 39BA : FA; + 39BB : EA; + 39BC : A5; + 39BD : EB; + 39BE : F0; + 39BF : 25; + 39C0 : 8D; + 39C1 : 74; + 39C2 : 02; + 39C3 : D0; + 39C4 : 20; + 39C5 : EE; + 39C6 : 75; + 39C7 : 02; + 39C8 : B0; + 39C9 : 04; + 39CA : EA; + 39CB : CE; + 39CC : 75; + 39CD : 02; + 39CE : 38; + 39CF : E9; + 39D0 : 13; + 39D1 : E5; + 39D2 : E8; + 39D3 : 6D; + 39D4 : 0A; + 39D5 : 02; + 39D6 : 8D; + 39D7 : 0A; + 39D8 : 02; + 39D9 : AD; + 39DA : 6F; + 39DB : 02; + 39DC : 49; + 39DD : 01; + 39DE : 8D; + 39DF : 6F; + 39E0 : 02; + 39E1 : F0; + 39E2 : 24; + 39E3 : 86; + 39E4 : F6; + 39E5 : A5; + 39E6 : EB; + 39E7 : F0; + 39E8 : 1B; + 39E9 : 2C; + 39EA : 4D; + 39EB : E8; + 39EC : 50; + 39ED : 16; + 39EE : A9; + 39EF : 00; + 39F0 : 8D; + 39F1 : 6F; + 39F2 : 02; + 39F3 : AD; + 39F4 : 6C; + 39F5 : 02; + 39F6 : 10; + 39F7 : 36; + 39F8 : 30; + 39F9 : BE; + 39FA : A2; + 39FB : A6; + 39FC : 20; + 39FD : 2E; + 39FE : F9; + 39FF : AD; + 3A00 : 65; + 3A01 : 02; + 3A02 : D0; + 3A03 : B8; + 3A04 : 4C; + 3A05 : 7E; + 3A06 : E6; + 3A07 : AD; + 3A08 : 0A; + 3A09 : 02; + 3A0A : F0; + 3A0B : 08; + 3A0C : 30; + 3A0D : 04; + 3A0E : C6; + 3A0F : E7; + 3A10 : C6; + 3A11 : E7; + 3A12 : E6; + 3A13 : E7; + 3A14 : A9; + 3A15 : 00; + 3A16 : 8D; + 3A17 : 0A; + 3A18 : 02; + 3A19 : E4; + 3A1A : F6; + 3A1B : D0; + 3A1C : 11; + 3A1D : 8A; + 3A1E : D0; + 3A1F : 9C; + 3A20 : AD; + 3A21 : 75; + 3A22 : 02; + 3A23 : 30; + 3A24 : C0; + 3A25 : C9; + 3A26 : 10; + 3A27 : 90; + 3A28 : BC; + 3A29 : 8D; + 3A2A : 28; + 3A2B : 02; + 3A2C : B0; + 3A2D : B7; + 3A2E : 8A; + 3A2F : 4D; + 3A30 : 65; + 3A31 : 02; + 3A32 : 8D; + 3A33 : 65; + 3A34 : 02; + 3A35 : A5; + 3A36 : EB; + 3A37 : F0; + 3A38 : CB; + 3A39 : CE; + 3A3A : 6C; + 3A3B : 02; + 3A3C : 30; + 3A3D : BC; + 3A3E : 46; + 3A3F : F6; + 3A40 : 66; + 3A41 : FE; + 3A42 : A2; + 3A43 : DA; + 3A44 : 20; + 3A45 : 2E; + 3A46 : F9; + 3A47 : 4C; + 3A48 : 7E; + 3A49 : E6; + 3A4A : AD; + 3A4B : 28; + 3A4C : 02; + 3A4D : F0; + 3A4E : 04; + 3A4F : A5; + 3A50 : EB; + 3A51 : F0; + 3A52 : 08; + 3A53 : AD; + 3A54 : 6C; + 3A55 : 02; + 3A56 : 30; + 3A57 : 03; + 3A58 : 4C; + 3A59 : CA; + 3A5A : F9; + 3A5B : 46; + 3A5C : E8; + 3A5D : A9; + 3A5E : 93; + 3A5F : 38; + 3A60 : E5; + 3A61 : E8; + 3A62 : 65; + 3A63 : E7; + 3A64 : 0A; + 3A65 : AA; + 3A66 : 20; + 3A67 : 2E; + 3A68 : F9; + 3A69 : EE; + 3A6A : 66; + 3A6B : 02; + 3A6C : A5; + 3A6D : EB; + 3A6E : D0; + 3A6F : 14; + 3A70 : AD; + 3A71 : 28; + 3A72 : 02; + 3A73 : F0; + 3A74 : 2B; + 3A75 : 8D; + 3A76 : 74; + 3A77 : 02; + 3A78 : A9; + 3A79 : 00; + 3A7A : 8D; + 3A7B : 28; + 3A7C : 02; + 3A7D : A9; + 3A7E : C0; + 3A7F : 8D; + 3A80 : 4E; + 3A81 : E8; + 3A82 : 85; + 3A83 : EB; + 3A84 : AD; + 3A85 : 28; + 3A86 : 02; + 3A87 : 85; + 3A88 : EC; + 3A89 : F0; + 3A8A : 09; + 3A8B : A9; + 3A8C : 00; + 3A8D : 85; + 3A8E : EB; + 3A8F : A9; + 3A90 : 40; + 3A91 : 8D; + 3A92 : 4E; + 3A93 : E8; + 3A94 : A5; + 3A95 : FE; + 3A96 : 85; + 3A97 : FC; + 3A98 : AD; + 3A99 : 74; + 3A9A : 02; + 3A9B : 0D; + 3A9C : 75; + 3A9D : 02; + 3A9E : 85; + 3A9F : ED; + 3AA0 : 4C; + 3AA1 : 7E; + 3AA2 : E6; + 3AA3 : 20; + 3AA4 : EC; + 3AA5 : FB; + 3AA6 : 8D; + 3AA7 : 66; + 3AA8 : 02; + 3AA9 : A2; + 3AAA : DA; + 3AAB : 20; + 3AAC : 2E; + 3AAD : F9; + 3AAE : A5; + 3AAF : FD; + 3AB0 : F0; + 3AB1 : 03; + 3AB2 : 8D; + 3AB3 : 73; + 3AB4 : 02; + 3AB5 : A9; + 3AB6 : 0F; + 3AB7 : 2C; + 3AB8 : 78; + 3AB9 : 02; + 3ABA : 10; + 3ABB : 18; + 3ABC : A5; + 3ABD : EC; + 3ABE : D0; + 3ABF : 0C; + 3AC0 : A6; + 3AC1 : FD; + 3AC2 : CA; + 3AC3 : D0; + 3AC4 : 0C; + 3AC5 : A9; + 3AC6 : 08; + 3AC7 : 20; + 3AC8 : E5; + 3AC9 : FB; + 3ACA : D0; + 3ACB : 05; + 3ACC : A9; + 3ACD : 00; + 3ACE : 8D; + 3ACF : 78; + 3AD0 : 02; + 3AD1 : 4C; + 3AD2 : 7E; + 3AD3 : E6; + 3AD4 : 70; + 3AD5 : 37; + 3AD6 : D0; + 3AD7 : 1A; + 3AD8 : A5; + 3AD9 : EC; + 3ADA : D0; + 3ADB : F5; + 3ADC : A5; + 3ADD : ED; + 3ADE : D0; + 3ADF : F1; + 3AE0 : AD; + 3AE1 : 73; + 3AE2 : 02; + 3AE3 : 4A; + 3AE4 : A5; + 3AE5 : FC; + 3AE6 : 30; + 3AE7 : 03; + 3AE8 : 90; + 3AE9 : 1C; + 3AEA : 18; + 3AEB : B0; + 3AEC : 19; + 3AED : 29; + 3AEE : 0F; + 3AEF : 8D; + 3AF0 : 78; + 3AF1 : 02; + 3AF2 : CE; + 3AF3 : 78; + 3AF4 : 02; + 3AF5 : D0; + 3AF6 : DA; + 3AF7 : A9; + 3AF8 : 40; + 3AF9 : 8D; + 3AFA : 78; + 3AFB : 02; + 3AFC : 20; + 3AFD : DC; + 3AFE : FB; + 3AFF : A9; + 3B00 : 00; + 3B01 : 8D; + 3B02 : 79; + 3B03 : 02; + 3B04 : F0; + 3B05 : CB; + 3B06 : A9; + 3B07 : 80; + 3B08 : 8D; + 3B09 : 78; + 3B0A : 02; + 3B0B : D0; + 3B0C : C4; + 3B0D : A5; + 3B0E : EC; + 3B0F : F0; + 3B10 : 0A; + 3B11 : A9; + 3B12 : 04; + 3B13 : 20; + 3B14 : E5; + 3B15 : FB; + 3B16 : A9; + 3B17 : 00; + 3B18 : 4C; + 3B19 : A7; + 3B1A : FB; + 3B1B : 20; + 3B1C : 90; + 3B1D : FD; + 3B1E : D0; + 3B1F : 03; + 3B20 : 4C; + 3B21 : A5; + 3B22 : FB; + 3B23 : AE; + 3B24 : 73; + 3B25 : 02; + 3B26 : CA; + 3B27 : F0; + 3B28 : 31; + 3B29 : AD; + 3B2A : 0B; + 3B2B : 02; + 3B2C : F0; + 3B2D : 0C; + 3B2E : A0; + 3B2F : 00; + 3B30 : A5; + 3B31 : FC; + 3B32 : D1; + 3B33 : E3; + 3B34 : F0; + 3B35 : 04; + 3B36 : A9; + 3B37 : 01; + 3B38 : 85; + 3B39 : ED; + 3B3A : A5; + 3B3B : ED; + 3B3C : F0; + 3B3D : 54; + 3B3E : A2; + 3B3F : 3D; + 3B40 : EC; + 3B41 : 76; + 3B42 : 02; + 3B43 : 90; + 3B44 : 46; + 3B45 : AE; + 3B46 : 76; + 3B47 : 02; + 3B48 : A5; + 3B49 : E4; + 3B4A : 9D; + [3B4B..3B4C] : 01; + 3B4D : A5; + 3B4E : E3; + 3B4F : 9D; + 3B50 : 00; + 3B51 : 01; + [3B52..3B53] : E8; + 3B54 : 8E; + 3B55 : 76; + 3B56 : 02; + 3B57 : 4C; + 3B58 : 92; + 3B59 : FB; + 3B5A : AE; + 3B5B : 77; + 3B5C : 02; + 3B5D : EC; + 3B5E : 76; + 3B5F : 02; + 3B60 : F0; + 3B61 : 3B; + 3B62 : A5; + 3B63 : E3; + 3B64 : DD; + 3B65 : 00; + 3B66 : 01; + 3B67 : D0; + 3B68 : 34; + 3B69 : A5; + 3B6A : E4; + 3B6B : DD; + [3B6C..3B6D] : 01; + 3B6E : D0; + 3B6F : 2D; + 3B70 : EE; + 3B71 : 77; + 3B72 : 02; + 3B73 : EE; + 3B74 : 77; + 3B75 : 02; + 3B76 : AD; + 3B77 : 0B; + 3B78 : 02; + 3B79 : F0; + 3B7A : 0C; + 3B7B : A5; + 3B7C : FC; + 3B7D : A0; + 3B7E : 00; + 3B7F : D1; + 3B80 : E3; + 3B81 : F0; + 3B82 : 1A; + 3B83 : A9; + 3B84 : 01; + 3B85 : 85; + 3B86 : ED; + 3B87 : A5; + 3B88 : ED; + 3B89 : F0; + 3B8A : 07; + 3B8B : A9; + 3B8C : 10; + 3B8D : 20; + 3B8E : E5; + 3B8F : FB; + 3B90 : D0; + 3B91 : 0B; + 3B92 : AD; + 3B93 : 0B; + 3B94 : 02; + 3B95 : D0; + 3B96 : 06; + 3B97 : A5; + 3B98 : FC; + 3B99 : A0; + 3B9A : 00; + 3B9B : 91; + 3B9C : E3; + 3B9D : E6; + 3B9E : E3; + 3B9F : D0; + 3BA0 : 38; + 3BA1 : E6; + 3BA2 : E4; + 3BA3 : D0; + 3BA4 : 34; + 3BA5 : A9; + 3BA6 : 80; + 3BA7 : 8D; + 3BA8 : 78; + 3BA9 : 02; + 3BAA : A6; + 3BAB : FD; + 3BAC : CA; + 3BAD : 30; + 3BAE : 02; + 3BAF : 86; + 3BB0 : FD; + 3BB1 : CE; + 3BB2 : 73; + 3BB3 : 02; + 3BB4 : F0; + 3BB5 : 09; + 3BB6 : AD; + 3BB7 : 76; + 3BB8 : 02; + 3BB9 : D0; + 3BBA : 1E; + 3BBB : 85; + 3BBC : FD; + 3BBD : F0; + 3BBE : 1A; + 3BBF : 20; + 3BC0 : FB; + 3BC1 : FC; + 3BC2 : 20; + 3BC3 : DC; + 3BC4 : FB; + 3BC5 : A0; + 3BC6 : 00; + 3BC7 : 8C; + 3BC8 : 79; + 3BC9 : 02; + 3BCA : 20; + 3BCB : 7C; + 3BCC : FD; + 3BCD : AD; + 3BCE : 79; + 3BCF : 02; + 3BD0 : 45; + 3BD1 : FC; + 3BD2 : F0; + 3BD3 : 05; + 3BD4 : A9; + [3BD5..3BD6] : 20; + 3BD7 : E5; + 3BD8 : FB; + 3BD9 : 4C; + 3BDA : 7E; + 3BDB : E6; + 3BDC : A5; + 3BDD : F8; + 3BDE : 85; + 3BDF : E4; + 3BE0 : A5; + 3BE1 : F7; + 3BE2 : 85; + 3BE3 : E3; + 3BE4 : 60; + 3BE5 : 0D; + 3BE6 : 0C; + 3BE7 : 02; + 3BE8 : 8D; + 3BE9 : 0C; + 3BEA : 02; + 3BEB : 60; + 3BEC : A9; + 3BED : 08; + 3BEE : 8D; + 3BEF : 6C; + 3BF0 : 02; + 3BF1 : A9; + 3BF2 : 00; + 3BF3 : 8D; + 3BF4 : 6F; + 3BF5 : 02; + 3BF6 : 8D; + 3BF7 : 74; + 3BF8 : 02; + 3BF9 : 8D; + 3BFA : 65; + 3BFB : 02; + 3BFC : 8D; + 3BFD : 75; + 3BFE : 02; + 3BFF : 60; + 3C00 : A5; + 3C01 : FC; + 3C02 : 4A; + 3C03 : A9; + 3C04 : 60; + 3C05 : 90; + 3C06 : 02; + 3C07 : A9; + 3C08 : B0; + 3C09 : A2; + 3C0A : 00; + 3C0B : 8D; + 3C0C : 48; + 3C0D : E8; + 3C0E : 8E; + 3C0F : 49; + 3C10 : E8; + 3C11 : AD; + 3C12 : 40; + 3C13 : E8; + 3C14 : 49; + 3C15 : 08; + 3C16 : 8D; + 3C17 : 40; + 3C18 : E8; + 3C19 : 29; + 3C1A : 08; + 3C1B : 60; + 3C1C : 38; + 3C1D : 66; + 3C1E : E4; + 3C1F : 30; + 3C20 : 44; + 3C21 : AD; + 3C22 : 74; + 3C23 : 02; + 3C24 : D0; + 3C25 : 13; + 3C26 : A9; + 3C27 : 10; + 3C28 : A2; + 3C29 : 01; + 3C2A : 20; + 3C2B : 0B; + 3C2C : FC; + 3C2D : D0; + 3C2E : 36; + 3C2F : EE; + 3C30 : 74; + 3C31 : 02; + 3C32 : A5; + 3C33 : E4; + 3C34 : 10; + 3C35 : 2F; + 3C36 : 4C; + 3C37 : BB; + 3C38 : FC; + 3C39 : AD; + 3C3A : 75; + 3C3B : 02; + 3C3C : D0; + 3C3D : 0A; + 3C3E : 20; + 3C3F : 07; + 3C40 : FC; + 3C41 : D0; + 3C42 : 22; + 3C43 : EE; + 3C44 : 75; + 3C45 : 02; + 3C46 : D0; + 3C47 : 1D; + 3C48 : 20; + 3C49 : 00; + 3C4A : FC; + 3C4B : D0; + 3C4C : 18; + 3C4D : AD; + 3C4E : 6F; + 3C4F : 02; + 3C50 : 49; + 3C51 : 01; + 3C52 : 8D; + 3C53 : 6F; + 3C54 : 02; + 3C55 : F0; + 3C56 : 11; + 3C57 : A5; + 3C58 : FC; + 3C59 : 49; + 3C5A : 01; + 3C5B : 85; + 3C5C : FC; + 3C5D : 29; + 3C5E : 01; + 3C5F : 4D; + 3C60 : 65; + 3C61 : 02; + 3C62 : 8D; + 3C63 : 65; + 3C64 : 02; + 3C65 : 4C; + 3C66 : 7E; + 3C67 : E6; + 3C68 : 46; + 3C69 : FC; + 3C6A : CE; + 3C6B : 6C; + 3C6C : 02; + 3C6D : AD; + 3C6E : 6C; + 3C6F : 02; + 3C70 : F0; + 3C71 : 3F; + 3C72 : 10; + 3C73 : F1; + 3C74 : 20; + 3C75 : EC; + 3C76 : FB; + 3C77 : 58; + 3C78 : AD; + 3C79 : 70; + 3C7A : 02; + 3C7B : F0; + 3C7C : 13; + 3C7D : A2; + 3C7E : 00; + 3C7F : 86; + 3C80 : F6; + 3C81 : CE; + 3C82 : 70; + 3C83 : 02; + 3C84 : A6; + 3C85 : FD; + 3C86 : E0; + 3C87 : 02; + 3C88 : D0; + 3C89 : 02; + 3C8A : 09; + 3C8B : 80; + 3C8C : 85; + 3C8D : FC; + 3C8E : D0; + 3C8F : D5; + 3C90 : 20; + 3C91 : 90; + 3C92 : FD; + 3C93 : 90; + 3C94 : 0A; + 3C95 : D0; + 3C96 : 85; + 3C97 : E6; + 3C98 : E4; + 3C99 : A5; + 3C9A : F6; + 3C9B : 85; + 3C9C : FC; + 3C9D : B0; + 3C9E : C6; + 3C9F : A0; + 3CA0 : 00; + 3CA1 : B1; + 3CA2 : E3; + 3CA3 : 85; + 3CA4 : FC; + 3CA5 : 45; + 3CA6 : F6; + 3CA7 : 85; + 3CA8 : F6; + 3CA9 : E6; + 3CAA : E3; + 3CAB : D0; + 3CAC : B8; + 3CAD : E6; + 3CAE : E4; + 3CAF : D0; + 3CB0 : B4; + 3CB1 : AD; + 3CB2 : 65; + 3CB3 : 02; + 3CB4 : 49; + 3CB5 : 01; + 3CB6 : 85; + 3CB7 : FC; + 3CB8 : 4C; + 3CB9 : 7E; + 3CBA : E6; + 3CBB : C6; + 3CBC : FD; + 3CBD : D0; + 3CBE : 03; + 3CBF : 20; + 3CC0 : ED; + 3CC1 : FF; + 3CC2 : A9; + 3CC3 : 50; + 3CC4 : 8D; + 3CC5 : 73; + 3CC6 : 02; + 3CC7 : A2; + 3CC8 : 08; + 3CC9 : 78; + 3CCA : 20; + 3CCB : 1B; + 3CCC : FD; + 3CCD : D0; + 3CCE : E9; + 3CCF : A9; + 3CD0 : 78; + 3CD1 : 20; + 3CD2 : 09; + 3CD3 : FC; + 3CD4 : D0; + 3CD5 : E2; + 3CD6 : CE; + 3CD7 : 73; + 3CD8 : 02; + 3CD9 : D0; + 3CDA : DD; + 3CDB : 20; + 3CDC : EC; + 3CDD : FB; + 3CDE : CE; + 3CDF : 79; + 3CE0 : 02; + 3CE1 : 10; + 3CE2 : D5; + 3CE3 : A2; + 3CE4 : 0A; + 3CE5 : 20; + 3CE6 : 1B; + 3CE7 : FD; + 3CE8 : 58; + 3CE9 : EE; + 3CEA : 79; + 3CEB : 02; + 3CEC : A5; + 3CED : FD; + 3CEE : F0; + 3CEF : 26; + 3CF0 : 20; + 3CF1 : DC; + 3CF2 : FB; + 3CF3 : A2; + 3CF4 : 09; + 3CF5 : 8E; + 3CF6 : 70; + 3CF7 : 02; + 3CF8 : 4C; + 3CF9 : 74; + 3CFA : FC; + 3CFB : 08; + 3CFC : 78; + 3CFD : 20; + 3CFE : ED; + 3CFF : FF; + 3D00 : A9; + 3D01 : 7F; + 3D02 : 8D; + 3D03 : 4E; + 3D04 : E8; + 3D05 : A9; + 3D06 : 3C; + 3D07 : 8D; + 3D08 : 11; + 3D09 : E8; + 3D0A : A9; + 3D0B : 3D; + 3D0C : 8D; + 3D0D : 13; + 3D0E : E8; + 3D0F : A2; + 3D10 : 0C; + 3D11 : 20; + 3D12 : 1B; + 3D13 : FD; + 3D14 : 28; + 3D15 : 60; + 3D16 : 20; + 3D17 : FB; + 3D18 : FC; + 3D19 : F0; + 3D1A : 9D; + 3D1B : BD; + 3D1C : 28; + 3D1D : FD; + 3D1E : 8D; + 3D1F : 19; + 3D20 : 02; + 3D21 : BD; + 3D22 : 29; + 3D23 : FD; + 3D24 : 8D; + 3D25 : 1A; + 3D26 : 02; + 3D27 : 60; + 3D28 : C2; + 3D29 : FD; + 3D2A : 80; + 3D2B : FE; + [3D2C..3D2D] : 00; + 3D2E : 9E; + 3D2F : FE; + 3D30 : CF; + 3D31 : FC; + 3D32 : 21; + 3D33 : FC; + 3D34 : 85; + 3D35 : E6; + 3D36 : 5F; + 3D37 : F9; + 3D38 : A2; + 3D39 : FF; + 3D3A : 9A; + 3D3B : D8; + 3D3C : 20; + [3D3D..3D3E] : E1; + 3D3F : AD; + 3D40 : 10; + 3D41 : E8; + 3D42 : 10; + 3D43 : 57; + 3D44 : 58; + 3D45 : 4C; + 3D46 : D2; + 3D47 : E0; + 3D48 : 84; + 3D49 : 00; + 3D4A : 84; + 3D4B : 01; + 3D4C : A0; + 3D4D : 03; + 3D4E : 98; + 3D4F : 18; + 3D50 : 65; + 3D51 : 01; + 3D52 : 45; + 3D53 : 02; + 3D54 : 91; + 3D55 : 00; + 3D56 : C8; + 3D57 : D0; + 3D58 : F5; + 3D59 : E6; + 3D5A : 01; + 3D5B : E4; + 3D5C : 01; + 3D5D : D0; + 3D5E : EF; + 3D5F : 84; + 3D60 : 00; + 3D61 : 84; + 3D62 : 01; + 3D63 : A0; + 3D64 : 03; + 3D65 : 98; + 3D66 : 18; + 3D67 : 65; + 3D68 : 01; + 3D69 : 45; + 3D6A : 02; + 3D6B : D1; + 3D6C : 00; + 3D6D : D0; + 3D6E : FE; + 3D6F : C8; + 3D70 : D0; + 3D71 : F3; + 3D72 : E6; + 3D73 : 01; + 3D74 : E4; + 3D75 : 01; + 3D76 : D0; + 3D77 : ED; + 3D78 : 4C; + 3D79 : 2D; + 3D7A : FE; + 3D7B : 00; + 3D7C : B1; + 3D7D : E3; + 3D7E : 4D; + 3D7F : 79; + 3D80 : 02; + 3D81 : 8D; + 3D82 : 79; + 3D83 : 02; + 3D84 : E6; + 3D85 : E3; + 3D86 : D0; + 3D87 : 02; + 3D88 : E6; + 3D89 : E4; + 3D8A : 20; + 3D8B : 90; + 3D8C : FD; + 3D8D : D0; + 3D8E : ED; + 3D8F : 60; + 3D90 : A5; + 3D91 : E4; + 3D92 : C5; + 3D93 : E6; + 3D94 : D0; + 3D95 : 04; + 3D96 : A5; + 3D97 : E3; + 3D98 : C5; + 3D99 : E5; + 3D9A : 60; + 3D9B : 8E; + 3D9C : 11; + 3D9D : E8; + 3D9E : 8E; + 3D9F : 10; + 3DA0 : E8; + 3DA1 : A9; + 3DA2 : 04; + 3DA3 : 8D; + 3DA4 : 11; + 3DA5 : E8; + 3DA6 : 8D; + 3DA7 : 10; + 3DA8 : E8; + 3DA9 : 20; + 3DAA : 1B; + 3DAB : FD; + 3DAC : CA; + 3DAD : 8E; + 3DAE : 44; + 3DAF : E8; + 3DB0 : 2C; + 3DB1 : 12; + 3DB2 : E8; + 3DB3 : 2C; + 3DB4 : 13; + 3DB5 : E8; + 3DB6 : 10; + 3DB7 : FB; + 3DB8 : 8E; + 3DB9 : 45; + 3DBA : E8; + 3DBB : 2C; + 3DBC : 12; + 3DBD : E8; + 3DBE : 58; + 3DBF : 4C; + 3DC0 : BF; + 3DC1 : FD; + 3DC2 : AD; + 3DC3 : 44; + 3DC4 : E8; + 3DC5 : AC; + 3DC6 : 45; + 3DC7 : E8; + 3DC8 : 2C; + 3DC9 : 13; + 3DCA : E8; + 3DCB : 10; + 3DCC : FE; + 3DCD : 29; + 3DCE : C0; + 3DCF : C9; + 3DD0 : C0; + 3DD1 : D0; + 3DD2 : FE; + 3DD3 : C0; + 3DD4 : BE; + 3DD5 : D0; + 3DD6 : FE; + 3DD7 : CE; + 3DD8 : 13; + 3DD9 : E8; + 3DDA : 2C; + 3DDB : 12; + 3DDC : E8; + 3DDD : A9; + 3DDE : 00; + 3DDF : 8D; + 3DE0 : 79; + 3DE1 : 02; + 3DE2 : 85; + 3DE3 : E3; + 3DE4 : 85; + 3DE5 : E5; + 3DE6 : A8; + 3DE7 : A2; + 3DE8 : C0; + 3DE9 : 86; + 3DEA : E4; + 3DEB : A2; + 3DEC : E8; + 3DED : 86; + 3DEE : E6; + 3DEF : 20; + 3DF0 : 7C; + 3DF1 : FD; + 3DF2 : A2; + 3DF3 : F0; + 3DF4 : 86; + 3DF5 : E4; + 3DF6 : 84; + 3DF7 : E6; + 3DF8 : 20; + 3DF9 : 7C; + 3DFA : FD; + 3DFB : CC; + 3DFC : 79; + 3DFD : 02; + 3DFE : D0; + 3DFF : FE; + 3E00 : A0; + 3E01 : FF; + 3E02 : 84; + 3E03 : 02; + 3E04 : C8; + 3E05 : 84; + 3E06 : 00; + 3E07 : A9; + 3E08 : 10; + 3E09 : 85; + 3E0A : 01; + 3E0B : A2; + 3E0C : 20; + 3E0D : B1; + 3E0E : 00; + 3E0F : 45; + 3E10 : 02; + 3E11 : 91; + 3E12 : 00; + 3E13 : D1; + 3E14 : 00; + 3E15 : F0; + 3E16 : 01; + 3E17 : C8; + 3E18 : E6; + 3E19 : 01; + 3E1A : E4; + 3E1B : 01; + 3E1C : D0; + 3E1D : EF; + 3E1E : C0; + 3E1F : 00; + 3E20 : F0; + 3E21 : 08; + 3E22 : C0; + 3E23 : 10; + 3E24 : D0; + 3E25 : FE; + 3E26 : A2; + 3E27 : 10; + 3E28 : A0; + 3E29 : 00; + 3E2A : 4C; + 3E2B : 48; + 3E2C : FD; + 3E2D : E6; + 3E2E : 02; + 3E2F : C4; + 3E30 : 02; + 3E31 : F0; + 3E32 : F7; + 3E33 : 8C; + 3E34 : 11; + 3E35 : E8; + 3E36 : A9; + 3E37 : 0F; + 3E38 : 8D; + 3E39 : 10; + 3E3A : E8; + 3E3B : A9; + 3E3C : 3C; + 3E3D : 8D; + 3E3E : 11; + 3E3F : E8; + 3E40 : A9; + 3E41 : FD; + 3E42 : A2; + 3E43 : 09; + 3E44 : 8E; + 3E45 : 10; + 3E46 : E8; + 3E47 : CD; + 3E48 : 12; + 3E49 : E8; + 3E4A : D0; + 3E4B : FE; + 3E4C : 4A; + 3E4D : 90; + 3E4E : 02; + 3E4F : 09; + 3E50 : 80; + 3E51 : CA; + 3E52 : 10; + 3E53 : F0; + 3E54 : 8E; + 3E55 : 10; + 3E56 : E8; + 3E57 : EC; + 3E58 : 12; + 3E59 : E8; + 3E5A : D0; + 3E5B : FE; + 3E5C : 8C; + 3E5D : 11; + 3E5E : E8; + 3E5F : 8C; + 3E60 : 10; + 3E61 : E8; + 3E62 : A9; + 3E63 : 3C; + 3E64 : 8D; + 3E65 : 11; + 3E66 : E8; + 3E67 : A2; + 3E68 : 02; + 3E69 : 20; + 3E6A : 1B; + 3E6B : FD; + 3E6C : A2; + 3E6D : F7; + 3E6E : 8E; + 3E6F : 40; + 3E70 : E8; + 3E71 : EE; + 3E72 : 11; + 3E73 : E8; + 3E74 : 2C; + 3E75 : 10; + 3E76 : E8; + 3E77 : 58; + 3E78 : 0E; + 3E79 : 40; + 3E7A : E8; + 3E7B : 4E; + 3E7C : 40; + 3E7D : E8; + 3E7E : D0; + 3E7F : FE; + 3E80 : CE; + 3E81 : 11; + 3E82 : E8; + 3E83 : 10; + 3E84 : FE; + 3E85 : 2C; + 3E86 : 10; + 3E87 : E8; + 3E88 : A2; + 3E89 : 06; + 3E8A : 20; + 3E8B : 1B; + 3E8C : FD; + 3E8D : 2C; + 3E8E : 40; + 3E8F : E8; + 3E90 : A9; + 3E91 : 90; + 3E92 : 8D; + 3E93 : 4E; + 3E94 : E8; + 3E95 : 58; + 3E96 : 0E; + 3E97 : 40; + 3E98 : E8; + 3E99 : 4E; + 3E9A : 40; + 3E9B : E8; + 3E9C : D0; + 3E9D : FE; + 3E9E : 2C; + 3E9F : 4D; + 3EA0 : E8; + 3EA1 : 10; + 3EA2 : FE; + 3EA3 : A9; + 3EA4 : 7F; + 3EA5 : 8D; + 3EA6 : 4E; + 3EA7 : E8; + 3EA8 : 2C; + 3EA9 : 40; + 3EAA : E8; + 3EAB : 4C; + 3EAC : C3; + 3EAD : FE; + 3EAE : 2C; + 3EAF : 41; + 3EB0 : E8; + 3EB1 : 70; + 3EB2 : FB; + 3EB3 : 2C; + 3EB4 : 4F; + 3EB5 : E8; + 3EB6 : 50; + 3EB7 : FB; + 3EB8 : 2C; + 3EB9 : 4F; + 3EBA : E8; + 3EBB : 70; + 3EBC : FB; + 3EBD : AD; + 3EBE : 4D; + 3EBF : E8; + 3EC0 : 29; + 3EC1 : 02; + 3EC2 : 60; + 3EC3 : A2; + 3EC4 : 0A; + 3EC5 : 2C; + 3EC6 : 41; + 3EC7 : E8; + 3EC8 : 10; + 3EC9 : FB; + 3ECA : 2C; + 3ECB : 41; + 3ECC : E8; + 3ECD : 30; + 3ECE : FB; + 3ECF : CA; + 3ED0 : D0; + 3ED1 : FD; + 3ED2 : 2C; + 3ED3 : 41; + 3ED4 : E8; + 3ED5 : 30; + 3ED6 : 02; + 3ED7 : 10; + 3ED8 : FE; + 3ED9 : EE; + [3EDA..3EDB] : FF; + 3EDC : 2C; + 3EDD : 41; + 3EDE : E8; + 3EDF : 30; + 3EE0 : FE; + 3EE1 : 2C; + 3EE2 : 41; + 3EE3 : E8; + 3EE4 : 50; + 3EE5 : FB; + 3EE6 : 2C; + 3EE7 : 41; + 3EE8 : E8; + 3EE9 : 70; + 3EEA : FB; + 3EEB : 2C; + 3EEC : 41; + 3EED : E8; + 3EEE : 50; + 3EEF : FB; + 3EF0 : 2C; + 3EF1 : 41; + 3EF2 : E8; + 3EF3 : 70; + 3EF4 : FB; + 3EF5 : 20; + 3EF6 : F0; + 3EF7 : E1; + 3EF8 : 20; + 3EF9 : AE; + 3EFA : FE; + 3EFB : D0; + 3EFC : FE; + 3EFD : A0; + 3EFE : 00; + 3EFF : A9; + 3F00 : A0; + 3F01 : 91; + 3F02 : E0; + 3F03 : 20; + 3F04 : AE; + 3F05 : FE; + 3F06 : F0; + 3F07 : FE; + 3F08 : A9; + 3F09 : 20; + 3F0A : 91; + 3F0B : E0; + 3F0C : 20; + 3F0D : AE; + 3F0E : FE; + 3F0F : D0; + 3F10 : FE; + 3F11 : C0; + 3F12 : E7; + 3F13 : D0; + 3F14 : 06; + 3F15 : A9; + 3F16 : 83; + 3F17 : C5; + 3F18 : E1; + 3F19 : F0; + 3F1A : 09; + 3F1B : C8; + 3F1C : D0; + 3F1D : E1; + 3F1E : E6; + 3F1F : E1; + 3F20 : D0; + 3F21 : DD; + 3F22 : F0; + 3F23 : FE; + 3F24 : 98; + 3F25 : 91; + 3F26 : E0; + 3F27 : 88; + 3F28 : C0; + 3F29 : FF; + 3F2A : D0; + 3F2B : F8; + 3F2C : C6; + 3F2D : E1; + 3F2E : A9; + 3F2F : 7F; + 3F30 : C5; + 3F31 : E1; + 3F32 : D0; + 3F33 : F0; + 3F34 : A9; + 3F35 : 34; + 3F36 : 8D; + 3F37 : 11; + 3F38 : E8; + 3F39 : 20; + 3F3A : AE; + 3F3B : FE; + 3F3C : D0; + 3F3D : FE; + 3F3E : A9; + 3F3F : 3C; + 3F40 : 8D; + 3F41 : 11; + 3F42 : E8; + 3F43 : A6; + 3F44 : 00; + 3F45 : 8E; + 3F46 : 22; + 3F47 : E8; + 3F48 : EC; + 3F49 : 20; + 3F4A : E8; + 3F4B : D0; + 3F4C : FE; + 3F4D : E8; + 3F4E : D0; + 3F4F : F5; + 3F50 : 2C; + 3F51 : 20; + 3F52 : E8; + 3F53 : A9; + 3F54 : FB; + 3F55 : 8D; + 3F56 : 40; + 3F57 : E8; + 3F58 : 2C; + 3F59 : 21; + 3F5A : E8; + 3F5B : 10; + 3F5C : FE; + 3F5D : 2C; + 3F5E : 40; + 3F5F : E8; + 3F60 : 50; + 3F61 : FE; + 3F62 : 4A; + 3F63 : 8D; + 3F64 : 40; + 3F65 : E8; + 3F66 : 2C; + 3F67 : 40; + 3F68 : E8; + 3F69 : 70; + 3F6A : FE; + 3F6B : 10; + 3F6C : FE; + 3F6D : A9; + 3F6E : 34; + 3F6F : 8D; + 3F70 : 23; + 3F71 : E8; + 3F72 : AD; + 3F73 : 40; + 3F74 : E8; + 3F75 : 30; + 3F76 : FE; + 3F77 : 4A; + 3F78 : 90; + 3F79 : FE; + 3F7A : A9; + 3F7B : 34; + 3F7C : 8D; + 3F7D : 21; + 3F7E : E8; + 3F7F : 4E; + 3F80 : 40; + 3F81 : E8; + 3F82 : B0; + 3F83 : FE; + 3F84 : A9; + 3F85 : 02; + 3F86 : 8D; + 3F87 : 43; + 3F88 : E8; + 3F89 : 8D; + 3F8A : 41; + 3F8B : E8; + 3F8C : 2C; + 3F8D : 10; + 3F8E : E8; + 3F8F : 50; + 3F90 : FE; + 3F91 : 8E; + 3F92 : 41; + 3F93 : E8; + 3F94 : 2C; + 3F95 : 10; + 3F96 : E8; + 3F97 : 50; + 3F98 : 05; + [3F99..3F9A] : EA; + 3F9B : 4C; + 3F9C : 9B; + 3F9D : FF; + 3F9E : 8E; + 3F9F : 11; + 3FA0 : E8; + 3FA1 : A0; + 3FA2 : 0F; + 3FA3 : 8C; + 3FA4 : 10; + 3FA5 : E8; + 3FA6 : 0A; + 3FA7 : 8D; + 3FA8 : 11; + 3FA9 : E8; + 3FAA : 49; + 3FAB : FF; + 3FAC : 8D; + 3FAD : 10; + 3FAE : E8; + 3FAF : 4C; + 3FB0 : AF; + 3FB1 : FF; + 3FB2 : 61; + [3FB3..3FBF] : 00; + 3FC0 : 4C; + 3FC1 : 2A; + 3FC2 : F5; + 3FC3 : 4C; + 3FC4 : C8; + 3FC5 : F2; + 3FC6 : 4C; + 3FC7 : 8B; + 3FC8 : F7; + 3FC9 : 4C; + 3FCA : DC; + 3FCB : F7; + 3FCC : 4C; + 3FCD : 7D; + 3FCE : F2; + 3FCF : 4C; + 3FD0 : DF; + 3FD1 : F1; + 3FD2 : 4C; + 3FD3 : 30; + 3FD4 : F2; + 3FD5 : 4C; + 3FD6 : 46; + 3FD7 : F3; + 3FD8 : 4C; + 3FD9 : 9E; + 3FDA : F6; + 3FDB : 4C; + 3FDC : BB; + 3FDD : F4; + 3FDE : 4C; + 3FDF : 95; + 3FE0 : F6; + 3FE1 : 4C; + 3FE2 : 39; + 3FE3 : F3; + 3FE4 : 4C; + 3FE5 : CC; + 3FE6 : F1; + 3FE7 : 4C; + 3FE8 : A4; + 3FE9 : F2; + 3FEA : 4C; + 3FEB : 36; + 3FEC : F7; + 3FED : A9; + 3FEE : 3C; + 3FEF : 8D; + 3FF0 : 13; + 3FF1 : E8; + 3FF2 : AD; + 3FF3 : 40; + 3FF4 : E8; + 3FF5 : 09; + 3FF6 : 10; + 3FF7 : 8D; + 3FF8 : 40; + 3FF9 : E8; + 3FFA : 60; + 3FFB : CA; + 3FFC : 38; + 3FFD : FD; + 3FFE : 6B; + 3FFF : E6; +END; diff --git a/Commodore - Pet2001_MiST/rtl/roms/Pet2001_RomType2.mif b/Commodore - Pet2001_MiST/rtl/roms/Pet2001_RomType2.mif new file mode 100644 index 00000000..72f6ec61 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/roms/Pet2001_RomType2.mif @@ -0,0 +1,15344 @@ +-- Copyright (C) 1991-2014 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 generated Memory Initialization File (.mif) + +WIDTH=8; +DEPTH=16384; + +ADDRESS_RADIX=HEX; +DATA_RADIX=HEX; + +CONTENT BEGIN + 0000 : 40; + 0001 : C7; + 0002 : 57; + 0003 : C6; + 0004 : 1F; + 0005 : CC; + 0006 : FF; + 0007 : C7; + 0008 : A6; + 0009 : CA; + 000A : C0; + 000B : CA; + 000C : 62; + 000D : CF; + 000E : 06; + 000F : CB; + 0010 : AC; + 0011 : C8; + 0012 : AC; + 0013 : C7; + 0014 : 84; + 0015 : C7; + 0016 : 2F; + 0017 : C8; + 0018 : 2F; + 0019 : C7; + 001A : 8F; + 001B : C7; + 001C : D9; + 001D : C7; + 001E : 42; + 001F : C8; + 0020 : 3E; + 0021 : C7; + 0022 : 52; + 0023 : C8; + 0024 : 0F; + 0025 : D7; + 0026 : D4; + 0027 : FF; + 0028 : D7; + 0029 : FF; + 002A : DA; + 002B : FF; + 002C : 8C; + 002D : D2; + 002E : 06; + 002F : D7; + 0030 : 8A; + 0031 : C9; + 0032 : AA; + 0033 : C9; + 0034 : 6A; + 0035 : C7; + 0036 : B4; + 0037 : C5; + 0038 : 76; + 0039 : C5; + 003A : 90; + 003B : C9; + 003C : DD; + 003D : FF; + 003E : BF; + 003F : FF; + 0040 : C2; + 0041 : FF; + 0042 : 7C; + 0043 : CA; + 0044 : 5A; + 0045 : C5; + 0046 : 45; + 0047 : DB; + 0048 : D8; + 0049 : DB; + 004A : 64; + 004B : DB; + [004C..004D] : 00; + 004E : 59; + 004F : D2; + 0050 : 7A; + 0051 : D2; + 0052 : 5E; + 0053 : DE; + 0054 : 7F; + 0055 : DF; + 0056 : F6; + 0057 : D8; + 0058 : DA; + 0059 : DE; + 005A : D8; + [005B..005D] : DF; + 005E : 28; + 005F : E0; + 0060 : 8C; + 0061 : E0; + 0062 : E8; + 0063 : D6; + 0064 : 56; + 0065 : D6; + 0066 : 3F; + 0067 : D3; + 0068 : 87; + 0069 : D6; + 006A : 65; + 006B : D6; + 006C : C6; + 006D : D5; + 006E : DA; + 006F : D5; + 0070 : 06; + 0071 : D6; + 0072 : 11; + 0073 : D6; + 0074 : 79; + 0075 : 75; + 0076 : D7; + 0077 : 79; + 0078 : 35; + 0079 : D7; + 007A : 7B; + 007B : 36; + 007C : D9; + 007D : 7B; + 007E : 1D; + 007F : DA; + 0080 : 7F; + 0081 : 67; + 0082 : DE; + 0083 : 50; + 0084 : CA; + 0085 : CE; + 0086 : 46; + 0087 : C7; + 0088 : CE; + 0089 : 7D; + 008A : A0; + 008B : DE; + 008C : 5A; + 008D : CE; + 008E : CD; + 008F : 64; + 0090 : F7; + 0091 : CE; + 0092 : 45; + 0093 : 4E; + 0094 : C4; + 0095 : 46; + 0096 : 4F; + 0097 : D2; + 0098 : 4E; + 0099 : 45; + 009A : 58; + 009B : D4; + 009C : 44; + 009D : 41; + 009E : 54; + 009F : C1; + 00A0 : 49; + 00A1 : 4E; + 00A2 : 50; + 00A3 : 55; + 00A4 : 54; + 00A5 : A3; + 00A6 : 49; + 00A7 : 4E; + 00A8 : 50; + 00A9 : 55; + 00AA : D4; + 00AB : 44; + 00AC : 49; + 00AD : CD; + 00AE : 52; + 00AF : 45; + 00B0 : 41; + 00B1 : C4; + 00B2 : 4C; + 00B3 : 45; + 00B4 : D4; + 00B5 : 47; + 00B6 : 4F; + 00B7 : 54; + 00B8 : CF; + 00B9 : 52; + 00BA : 55; + 00BB : CE; + 00BC : 49; + 00BD : C6; + 00BE : 52; + 00BF : 45; + 00C0 : 53; + 00C1 : 54; + 00C2 : 4F; + 00C3 : 52; + 00C4 : C5; + 00C5 : 47; + 00C6 : 4F; + 00C7 : 53; + 00C8 : 55; + 00C9 : C2; + 00CA : 52; + 00CB : 45; + 00CC : 54; + 00CD : 55; + 00CE : 52; + 00CF : CE; + 00D0 : 52; + 00D1 : 45; + 00D2 : CD; + 00D3 : 53; + 00D4 : 54; + 00D5 : 4F; + 00D6 : D0; + 00D7 : 4F; + 00D8 : CE; + 00D9 : 57; + 00DA : 41; + 00DB : 49; + 00DC : D4; + 00DD : 4C; + 00DE : 4F; + 00DF : 41; + 00E0 : C4; + 00E1 : 53; + 00E2 : 41; + 00E3 : 56; + 00E4 : C5; + 00E5 : 56; + 00E6 : 45; + 00E7 : 52; + 00E8 : 49; + 00E9 : 46; + 00EA : D9; + 00EB : 44; + 00EC : 45; + 00ED : C6; + 00EE : 50; + 00EF : 4F; + 00F0 : 4B; + 00F1 : C5; + 00F2 : 50; + 00F3 : 52; + 00F4 : 49; + 00F5 : 4E; + 00F6 : 54; + 00F7 : A3; + 00F8 : 50; + 00F9 : 52; + 00FA : 49; + 00FB : 4E; + 00FC : D4; + 00FD : 43; + 00FE : 4F; + 00FF : 4E; + 0100 : D4; + 0101 : 4C; + 0102 : 49; + 0103 : 53; + 0104 : D4; + 0105 : 43; + 0106 : 4C; + 0107 : D2; + 0108 : 43; + 0109 : 4D; + 010A : C4; + 010B : 53; + 010C : 59; + 010D : D3; + 010E : 4F; + 010F : 50; + 0110 : 45; + 0111 : CE; + 0112 : 43; + 0113 : 4C; + 0114 : 4F; + 0115 : 53; + 0116 : C5; + 0117 : 47; + 0118 : 45; + 0119 : D4; + 011A : 4E; + 011B : 45; + 011C : D7; + 011D : 54; + 011E : 41; + 011F : 42; + 0120 : A8; + 0121 : 54; + 0122 : CF; + 0123 : 46; + 0124 : CE; + 0125 : 53; + 0126 : 50; + 0127 : 43; + 0128 : A8; + 0129 : 54; + 012A : 48; + 012B : 45; + 012C : CE; + 012D : 4E; + 012E : 4F; + 012F : D4; + 0130 : 53; + 0131 : 54; + 0132 : 45; + 0133 : D0; + 0134 : AB; + 0135 : AD; + 0136 : AA; + 0137 : AF; + 0138 : DE; + 0139 : 41; + 013A : 4E; + 013B : C4; + 013C : 4F; + 013D : D2; + 013E : BE; + 013F : BD; + 0140 : BC; + 0141 : 53; + 0142 : 47; + 0143 : CE; + 0144 : 49; + 0145 : 4E; + 0146 : D4; + 0147 : 41; + 0148 : 42; + 0149 : D3; + 014A : 55; + 014B : 53; + 014C : D2; + 014D : 46; + 014E : 52; + 014F : C5; + 0150 : 50; + 0151 : 4F; + 0152 : D3; + 0153 : 53; + 0154 : 51; + 0155 : D2; + 0156 : 52; + 0157 : 4E; + 0158 : C4; + 0159 : 4C; + 015A : 4F; + 015B : C7; + 015C : 45; + 015D : 58; + 015E : D0; + 015F : 43; + 0160 : 4F; + 0161 : D3; + 0162 : 53; + 0163 : 49; + 0164 : CE; + 0165 : 54; + 0166 : 41; + 0167 : CE; + 0168 : 41; + 0169 : 54; + 016A : CE; + 016B : 50; + [016C..016D] : 45; + 016E : CB; + 016F : 4C; + 0170 : 45; + 0171 : CE; + 0172 : 53; + 0173 : 54; + 0174 : 52; + 0175 : A4; + 0176 : 56; + 0177 : 41; + 0178 : CC; + 0179 : 41; + 017A : 53; + 017B : C3; + 017C : 43; + 017D : 48; + 017E : 52; + 017F : A4; + 0180 : 4C; + 0181 : 45; + 0182 : 46; + 0183 : 54; + 0184 : A4; + 0185 : 52; + 0186 : 49; + 0187 : 47; + 0188 : 48; + 0189 : 54; + 018A : A4; + 018B : 4D; + 018C : 49; + 018D : 44; + 018E : A4; + 018F : 47; + 0190 : CF; + 0191 : 00; + 0192 : 4E; + 0193 : 45; + 0194 : 58; + 0195 : 54; + 0196 : 20; + 0197 : 57; + 0198 : 49; + 0199 : 54; + 019A : 48; + 019B : 4F; + 019C : 55; + 019D : 54; + 019E : 20; + 019F : 46; + 01A0 : 4F; + 01A1 : D2; + 01A2 : 53; + 01A3 : 59; + 01A4 : 4E; + 01A5 : 54; + 01A6 : 41; + 01A7 : D8; + 01A8 : 52; + 01A9 : 45; + 01AA : 54; + 01AB : 55; + 01AC : 52; + 01AD : 4E; + 01AE : 20; + 01AF : 57; + 01B0 : 49; + 01B1 : 54; + 01B2 : 48; + 01B3 : 4F; + 01B4 : 55; + 01B5 : 54; + 01B6 : 20; + 01B7 : 47; + 01B8 : 4F; + 01B9 : 53; + 01BA : 55; + 01BB : C2; + 01BC : 4F; + 01BD : 55; + 01BE : 54; + 01BF : 20; + 01C0 : 4F; + 01C1 : 46; + 01C2 : 20; + 01C3 : 44; + 01C4 : 41; + 01C5 : 54; + 01C6 : C1; + 01C7 : 49; + [01C8..01C9] : 4C; + 01CA : 45; + 01CB : 47; + 01CC : 41; + 01CD : 4C; + 01CE : 20; + 01CF : 51; + 01D0 : 55; + 01D1 : 41; + 01D2 : 4E; + 01D3 : 54; + 01D4 : 49; + 01D5 : 54; + 01D6 : D9; + 01D7 : 4F; + 01D8 : 56; + 01D9 : 45; + 01DA : 52; + 01DB : 46; + 01DC : 4C; + 01DD : 4F; + 01DE : D7; + 01DF : 4F; + 01E0 : 55; + 01E1 : 54; + 01E2 : 20; + 01E3 : 4F; + 01E4 : 46; + 01E5 : 20; + 01E6 : 4D; + 01E7 : 45; + 01E8 : 4D; + 01E9 : 4F; + 01EA : 52; + 01EB : D9; + 01EC : 55; + 01ED : 4E; + 01EE : 44; + 01EF : 45; + 01F0 : 46; + 01F1 : 27; + 01F2 : 44; + 01F3 : 20; + 01F4 : 53; + 01F5 : 54; + 01F6 : 41; + 01F7 : 54; + 01F8 : 45; + 01F9 : 4D; + 01FA : 45; + 01FB : 4E; + 01FC : D4; + 01FD : 42; + 01FE : 41; + 01FF : 44; + 0200 : 20; + 0201 : 53; + 0202 : 55; + 0203 : 42; + 0204 : 53; + 0205 : 43; + 0206 : 52; + 0207 : 49; + 0208 : 50; + 0209 : D4; + 020A : 52; + 020B : 45; + 020C : 44; + 020D : 49; + 020E : 4D; + 020F : 27; + 0210 : 44; + 0211 : 20; + 0212 : 41; + [0213..0214] : 52; + 0215 : 41; + 0216 : D9; + 0217 : 44; + 0218 : 49; + 0219 : 56; + 021A : 49; + 021B : 53; + 021C : 49; + 021D : 4F; + 021E : 4E; + 021F : 20; + 0220 : 42; + 0221 : 59; + 0222 : 20; + 0223 : 5A; + 0224 : 45; + 0225 : 52; + 0226 : CF; + 0227 : 49; + [0228..0229] : 4C; + 022A : 45; + 022B : 47; + 022C : 41; + 022D : 4C; + 022E : 20; + 022F : 44; + 0230 : 49; + 0231 : 52; + 0232 : 45; + 0233 : 43; + 0234 : D4; + 0235 : 54; + 0236 : 59; + 0237 : 50; + 0238 : 45; + 0239 : 20; + 023A : 4D; + 023B : 49; + 023C : 53; + 023D : 4D; + 023E : 41; + 023F : 54; + 0240 : 43; + 0241 : C8; + 0242 : 53; + 0243 : 54; + 0244 : 52; + 0245 : 49; + 0246 : 4E; + 0247 : 47; + 0248 : 20; + 0249 : 54; + [024A..024B] : 4F; + 024C : 20; + 024D : 4C; + 024E : 4F; + 024F : 4E; + 0250 : C7; + 0251 : 46; + 0252 : 49; + 0253 : 4C; + 0254 : 45; + 0255 : 20; + 0256 : 44; + 0257 : 41; + 0258 : 54; + 0259 : C1; + 025A : 46; + 025B : 4F; + 025C : 52; + 025D : 4D; + 025E : 55; + 025F : 4C; + 0260 : 41; + 0261 : 20; + 0262 : 54; + [0263..0264] : 4F; + 0265 : 20; + 0266 : 43; + 0267 : 4F; + 0268 : 4D; + 0269 : 50; + 026A : 4C; + 026B : 45; + 026C : D8; + 026D : 43; + 026E : 41; + 026F : 4E; + 0270 : 27; + 0271 : 54; + 0272 : 20; + 0273 : 43; + 0274 : 4F; + 0275 : 4E; + 0276 : 54; + 0277 : 49; + 0278 : 4E; + 0279 : 55; + 027A : C5; + 027B : 55; + 027C : 4E; + 027D : 44; + 027E : 45; + 027F : 46; + 0280 : 27; + 0281 : 44; + 0282 : 20; + 0283 : 46; + 0284 : 55; + 0285 : 4E; + 0286 : 43; + 0287 : 54; + 0288 : 49; + 0289 : 4F; + 028A : CE; + 028B : 20; + 028C : 45; + [028D..028E] : 52; + 028F : 4F; + 0290 : 52; + 0291 : 00; + 0292 : 20; + 0293 : 49; + 0294 : 4E; + 0295 : 20; + 0296 : 00; + 0297 : 0D; + 0298 : 0A; + 0299 : 52; + 029A : 45; + 029B : 41; + 029C : 44; + 029D : 59; + 029E : 2E; + 029F : 0D; + 02A0 : 0A; + 02A1 : 00; + 02A2 : 0D; + 02A3 : 0A; + 02A4 : 42; + 02A5 : 52; + 02A6 : 45; + 02A7 : 41; + 02A8 : 4B; + 02A9 : 00; + 02AA : BA; + [02AB..02AE] : E8; + 02AF : BD; + [02B0..02B1] : 01; + 02B2 : C9; + 02B3 : 81; + 02B4 : D0; + 02B5 : 21; + 02B6 : A5; + 02B7 : 47; + 02B8 : D0; + 02B9 : 0A; + 02BA : BD; + 02BB : 02; + 02BC : 01; + 02BD : 85; + 02BE : 46; + 02BF : BD; + 02C0 : 03; + 02C1 : 01; + 02C2 : 85; + 02C3 : 47; + 02C4 : DD; + 02C5 : 03; + 02C6 : 01; + 02C7 : D0; + 02C8 : 07; + 02C9 : A5; + 02CA : 46; + 02CB : DD; + 02CC : 02; + 02CD : 01; + 02CE : F0; + 02CF : 07; + 02D0 : 8A; + 02D1 : 18; + 02D2 : 69; + 02D3 : 12; + 02D4 : AA; + 02D5 : D0; + 02D6 : D8; + 02D7 : 60; + 02D8 : 20; + 02D9 : 28; + 02DA : C3; + 02DB : 85; + 02DC : 2E; + 02DD : 84; + 02DE : 2F; + 02DF : 38; + 02E0 : A5; + 02E1 : 57; + 02E2 : E5; + 02E3 : 5C; + 02E4 : 85; + 02E5 : 1F; + 02E6 : A8; + 02E7 : A5; + 02E8 : 58; + 02E9 : E5; + 02EA : 5D; + 02EB : AA; + 02EC : E8; + 02ED : 98; + 02EE : F0; + 02EF : 23; + 02F0 : A5; + 02F1 : 57; + 02F2 : 38; + 02F3 : E5; + 02F4 : 1F; + 02F5 : 85; + 02F6 : 57; + 02F7 : B0; + 02F8 : 03; + 02F9 : C6; + 02FA : 58; + 02FB : 38; + 02FC : A5; + 02FD : 55; + 02FE : E5; + 02FF : 1F; + 0300 : 85; + 0301 : 55; + 0302 : B0; + 0303 : 08; + 0304 : C6; + 0305 : 56; + 0306 : 90; + 0307 : 04; + 0308 : B1; + 0309 : 57; + 030A : 91; + 030B : 55; + 030C : 88; + 030D : D0; + 030E : F9; + 030F : B1; + 0310 : 57; + 0311 : 91; + 0312 : 55; + 0313 : C6; + 0314 : 58; + 0315 : C6; + 0316 : 56; + 0317 : CA; + 0318 : D0; + 0319 : F2; + 031A : 60; + 031B : 0A; + 031C : 69; + 031D : 3E; + 031E : B0; + 031F : 35; + 0320 : 85; + 0321 : 1F; + 0322 : BA; + 0323 : E4; + 0324 : 1F; + 0325 : 90; + 0326 : 2E; + 0327 : 60; + 0328 : C4; + 0329 : 31; + 032A : 90; + 032B : 28; + 032C : D0; + 032D : 04; + 032E : C5; + 032F : 30; + 0330 : 90; + 0331 : 22; + 0332 : 48; + 0333 : A2; + 0334 : 09; + 0335 : 98; + 0336 : 48; + 0337 : B5; + 0338 : 54; + 0339 : CA; + 033A : 10; + 033B : FA; + 033C : 20; + 033D : 00; + 033E : D4; + 033F : A2; + 0340 : F7; + 0341 : 68; + 0342 : 95; + 0343 : 5E; + 0344 : E8; + 0345 : 30; + 0346 : FA; + 0347 : 68; + 0348 : A8; + 0349 : 68; + 034A : C4; + 034B : 31; + 034C : 90; + 034D : 06; + 034E : D0; + 034F : 05; + 0350 : C5; + 0351 : 30; + 0352 : B0; + 0353 : 01; + 0354 : 60; + 0355 : A2; + 0356 : 4D; + 0357 : 46; + 0358 : 0D; + 0359 : A5; + 035A : 0E; + 035B : F0; + 035C : 07; + 035D : 20; + 035E : CC; + 035F : FF; + 0360 : A9; + 0361 : 00; + 0362 : 85; + 0363 : 0E; + 0364 : 20; + 0365 : E2; + 0366 : C9; + 0367 : 20; + 0368 : 43; + 0369 : CA; + 036A : BD; + 036B : 92; + 036C : C1; + 036D : 48; + 036E : 29; + 036F : 7F; + 0370 : 20; + 0371 : 45; + 0372 : CA; + 0373 : E8; + 0374 : 68; + 0375 : 10; + 0376 : F3; + 0377 : 20; + 0378 : 93; + 0379 : C5; + 037A : A9; + 037B : 8B; + 037C : A0; + 037D : C2; + 037E : 20; + 037F : 1C; + 0380 : CA; + 0381 : A4; + 0382 : 37; + 0383 : C8; + 0384 : F0; + 0385 : 03; + 0386 : 20; + 0387 : CE; + 0388 : DC; + 0389 : 46; + 038A : 0D; + 038B : A9; + 038C : 97; + 038D : A0; + 038E : C2; + 038F : 20; + 0390 : 1C; + 0391 : CA; + 0392 : 20; + 0393 : 6F; + 0394 : C4; + 0395 : 86; + 0396 : 77; + 0397 : 84; + 0398 : 78; + 0399 : 20; + 039A : 70; + 039B : 00; + 039C : AA; + 039D : F0; + 039E : F3; + 039F : A2; + 03A0 : FF; + 03A1 : 86; + 03A2 : 37; + 03A3 : 90; + 03A4 : 06; + 03A5 : 20; + 03A6 : 95; + 03A7 : C4; + 03A8 : 4C; + 03A9 : F7; + 03AA : C6; + 03AB : 20; + 03AC : 73; + 03AD : C8; + 03AE : 20; + 03AF : 95; + 03B0 : C4; + 03B1 : 84; + 03B2 : 05; + 03B3 : 20; + 03B4 : 2C; + 03B5 : C5; + 03B6 : 90; + 03B7 : 44; + 03B8 : A0; + 03B9 : 01; + 03BA : B1; + 03BB : 5C; + 03BC : 85; + 03BD : 20; + 03BE : A5; + 03BF : 2A; + 03C0 : 85; + 03C1 : 1F; + 03C2 : A5; + 03C3 : 5D; + 03C4 : 85; + 03C5 : 22; + 03C6 : A5; + 03C7 : 5C; + 03C8 : 88; + 03C9 : F1; + 03CA : 5C; + 03CB : 18; + 03CC : 65; + 03CD : 2A; + 03CE : 85; + 03CF : 2A; + 03D0 : 85; + 03D1 : 21; + 03D2 : A5; + 03D3 : 2B; + 03D4 : 69; + 03D5 : FF; + 03D6 : 85; + 03D7 : 2B; + 03D8 : E5; + 03D9 : 5D; + 03DA : AA; + 03DB : 38; + 03DC : A5; + 03DD : 5C; + 03DE : E5; + 03DF : 2A; + 03E0 : A8; + 03E1 : B0; + 03E2 : 03; + 03E3 : E8; + 03E4 : C6; + 03E5 : 22; + 03E6 : 18; + 03E7 : 65; + 03E8 : 1F; + 03E9 : 90; + 03EA : 03; + 03EB : C6; + 03EC : 20; + 03ED : 18; + 03EE : B1; + 03EF : 1F; + 03F0 : 91; + 03F1 : 21; + 03F2 : C8; + 03F3 : D0; + 03F4 : F9; + 03F5 : E6; + 03F6 : 20; + 03F7 : E6; + 03F8 : 22; + 03F9 : CA; + 03FA : D0; + 03FB : F2; + 03FC : 20; + 03FD : 72; + 03FE : C5; + 03FF : 20; + 0400 : 42; + 0401 : C4; + 0402 : AD; + 0403 : 00; + 0404 : 02; + 0405 : F0; + 0406 : 8B; + 0407 : 18; + 0408 : A5; + 0409 : 2A; + 040A : 85; + 040B : 57; + 040C : 65; + 040D : 05; + 040E : 85; + 040F : 55; + 0410 : A4; + 0411 : 2B; + 0412 : 84; + 0413 : 58; + 0414 : 90; + 0415 : 01; + 0416 : C8; + 0417 : 84; + 0418 : 56; + 0419 : 20; + 041A : D8; + 041B : C2; + 041C : A5; + 041D : 11; + 041E : A4; + 041F : 12; + 0420 : 8D; + 0421 : FE; + 0422 : 01; + 0423 : 8C; + 0424 : FF; + 0425 : 01; + 0426 : A5; + 0427 : 2E; + 0428 : A4; + 0429 : 2F; + 042A : 85; + 042B : 2A; + 042C : 84; + 042D : 2B; + 042E : A4; + 042F : 05; + 0430 : 88; + 0431 : B9; + 0432 : FC; + 0433 : 01; + 0434 : 91; + 0435 : 5C; + 0436 : 88; + 0437 : 10; + 0438 : F8; + 0439 : 20; + 043A : 72; + 043B : C5; + 043C : 20; + 043D : 42; + 043E : C4; + 043F : 4C; + 0440 : 92; + 0441 : C3; + 0442 : A5; + 0443 : 28; + 0444 : A4; + 0445 : 29; + 0446 : 85; + 0447 : 1F; + 0448 : 84; + 0449 : 20; + 044A : 18; + 044B : A0; + 044C : 01; + 044D : B1; + 044E : 1F; + 044F : F0; + 0450 : 1D; + 0451 : A0; + 0452 : 04; + 0453 : C8; + 0454 : B1; + 0455 : 1F; + 0456 : D0; + 0457 : FB; + 0458 : C8; + 0459 : 98; + 045A : 65; + 045B : 1F; + 045C : AA; + 045D : A0; + 045E : 00; + 045F : 91; + 0460 : 1F; + 0461 : A5; + 0462 : 20; + 0463 : 69; + 0464 : 00; + 0465 : C8; + 0466 : 91; + 0467 : 1F; + 0468 : 86; + 0469 : 1F; + 046A : 85; + 046B : 20; + 046C : 90; + 046D : DD; + 046E : 60; + 046F : A2; + 0470 : 00; + 0471 : 20; + 0472 : 81; + 0473 : C4; + 0474 : C9; + 0475 : 0D; + 0476 : F0; + 0477 : 06; + 0478 : 9D; + 0479 : 00; + 047A : 02; + 047B : E8; + 047C : D0; + 047D : F3; + 047E : 4C; + 047F : D5; + 0480 : C9; + 0481 : 20; + 0482 : CF; + 0483 : FF; + 0484 : A4; + 0485 : 0E; + 0486 : D0; + 0487 : 0C; + 0488 : C9; + 0489 : 0F; + 048A : D0; + 048B : 08; + 048C : 48; + 048D : A5; + 048E : 0D; + 048F : 49; + 0490 : FF; + 0491 : 85; + 0492 : 0D; + 0493 : 68; + 0494 : 60; + 0495 : A6; + 0496 : 77; + 0497 : A0; + 0498 : 04; + 0499 : 84; + 049A : 09; + 049B : BD; + 049C : 00; + 049D : 02; + 049E : 10; + 049F : 07; + 04A0 : C9; + 04A1 : FF; + 04A2 : F0; + 04A3 : 3E; + 04A4 : E8; + 04A5 : D0; + 04A6 : F4; + 04A7 : C9; + 04A8 : 20; + 04A9 : F0; + 04AA : 37; + 04AB : 85; + 04AC : 04; + 04AD : C9; + 04AE : 22; + 04AF : F0; + 04B0 : 56; + 04B1 : 24; + 04B2 : 09; + 04B3 : 70; + 04B4 : 2D; + 04B5 : C9; + 04B6 : 3F; + 04B7 : D0; + 04B8 : 04; + 04B9 : A9; + 04BA : 99; + 04BB : D0; + 04BC : 25; + 04BD : C9; + 04BE : 30; + 04BF : 90; + 04C0 : 04; + 04C1 : C9; + 04C2 : 3C; + 04C3 : 90; + 04C4 : 1D; + 04C5 : 84; + 04C6 : 6E; + 04C7 : A0; + 04C8 : 00; + 04C9 : 84; + 04CA : 05; + 04CB : 88; + 04CC : 86; + 04CD : 77; + 04CE : CA; + 04CF : C8; + 04D0 : E8; + 04D1 : BD; + 04D2 : 00; + 04D3 : 02; + 04D4 : 38; + 04D5 : F9; + 04D6 : 92; + 04D7 : C0; + 04D8 : F0; + 04D9 : F5; + 04DA : C9; + 04DB : 80; + 04DC : D0; + 04DD : 30; + [04DE..04DF] : 05; + 04E0 : A4; + 04E1 : 6E; + 04E2 : E8; + 04E3 : C8; + 04E4 : 99; + 04E5 : FB; + 04E6 : 01; + 04E7 : B9; + 04E8 : FB; + 04E9 : 01; + 04EA : F0; + 04EB : 36; + 04EC : 38; + 04ED : E9; + 04EE : 3A; + 04EF : F0; + 04F0 : 04; + 04F1 : C9; + 04F2 : 49; + 04F3 : D0; + 04F4 : 02; + 04F5 : 85; + 04F6 : 09; + 04F7 : 38; + 04F8 : E9; + 04F9 : 55; + 04FA : D0; + 04FB : 9F; + 04FC : 85; + 04FD : 04; + 04FE : BD; + 04FF : 00; + 0500 : 02; + 0501 : F0; + 0502 : DF; + 0503 : C5; + 0504 : 04; + 0505 : F0; + 0506 : DB; + 0507 : C8; + 0508 : 99; + 0509 : FB; + 050A : 01; + 050B : E8; + 050C : D0; + 050D : F0; + 050E : A6; + 050F : 77; + 0510 : E6; + 0511 : 05; + 0512 : C8; + 0513 : B9; + 0514 : 91; + 0515 : C0; + 0516 : 10; + 0517 : FA; + 0518 : B9; + 0519 : 92; + 051A : C0; + 051B : D0; + 051C : B4; + 051D : BD; + 051E : 00; + 051F : 02; + 0520 : 10; + 0521 : BE; + 0522 : 99; + 0523 : FD; + 0524 : 01; + 0525 : C6; + 0526 : 78; + 0527 : A9; + 0528 : FF; + 0529 : 85; + 052A : 77; + 052B : 60; + 052C : A5; + 052D : 28; + 052E : A6; + 052F : 29; + 0530 : A0; + 0531 : 01; + 0532 : 85; + 0533 : 5C; + 0534 : 86; + 0535 : 5D; + 0536 : B1; + 0537 : 5C; + 0538 : F0; + 0539 : 1F; + [053A..053B] : C8; + 053C : A5; + 053D : 12; + 053E : D1; + 053F : 5C; + 0540 : 90; + 0541 : 18; + 0542 : F0; + 0543 : 03; + 0544 : 88; + 0545 : D0; + 0546 : 09; + 0547 : A5; + 0548 : 11; + 0549 : 88; + 054A : D1; + 054B : 5C; + 054C : 90; + 054D : 0C; + 054E : F0; + 054F : 0A; + 0550 : 88; + 0551 : B1; + 0552 : 5C; + 0553 : AA; + 0554 : 88; + 0555 : B1; + 0556 : 5C; + 0557 : B0; + 0558 : D7; + 0559 : 18; + 055A : 60; + 055B : D0; + 055C : FD; + 055D : A9; + 055E : 00; + 055F : A8; + 0560 : 91; + 0561 : 28; + 0562 : C8; + 0563 : 91; + 0564 : 28; + 0565 : A5; + 0566 : 28; + 0567 : 18; + 0568 : 69; + 0569 : 02; + 056A : 85; + 056B : 2A; + 056C : A5; + 056D : 29; + 056E : 69; + 056F : 00; + 0570 : 85; + 0571 : 2B; + 0572 : 20; + 0573 : A7; + 0574 : C5; + 0575 : A9; + 0576 : 00; + 0577 : D0; + 0578 : 2D; + 0579 : A5; + 057A : 34; + 057B : A4; + 057C : 35; + 057D : 85; + 057E : 30; + 057F : 84; + 0580 : 31; + 0581 : 20; + 0582 : E7; + 0583 : FF; + 0584 : A5; + 0585 : 2A; + 0586 : A4; + 0587 : 2B; + 0588 : 85; + 0589 : 2C; + 058A : 84; + 058B : 2D; + 058C : 85; + 058D : 2E; + 058E : 84; + 058F : 2F; + 0590 : 20; + 0591 : 30; + 0592 : C7; + 0593 : A2; + 0594 : 16; + 0595 : 86; + 0596 : 13; + 0597 : 68; + 0598 : A8; + 0599 : 68; + 059A : A2; + 059B : FA; + 059C : 9A; + 059D : 48; + 059E : 98; + 059F : 48; + 05A0 : A9; + 05A1 : 00; + 05A2 : 85; + 05A3 : 3B; + 05A4 : 85; + 05A5 : 0A; + 05A6 : 60; + 05A7 : 18; + 05A8 : A5; + 05A9 : 28; + 05AA : 69; + 05AB : FF; + 05AC : 85; + 05AD : 77; + 05AE : A5; + 05AF : 29; + 05B0 : 69; + 05B1 : FF; + 05B2 : 85; + 05B3 : 78; + 05B4 : 60; + 05B5 : 90; + 05B6 : 06; + 05B7 : F0; + 05B8 : 04; + 05B9 : C9; + 05BA : AB; + 05BB : D0; + 05BC : E9; + 05BD : 20; + 05BE : 73; + 05BF : C8; + 05C0 : 20; + 05C1 : 2C; + 05C2 : C5; + 05C3 : 20; + 05C4 : 76; + 05C5 : 00; + 05C6 : F0; + 05C7 : 0C; + 05C8 : C9; + 05C9 : AB; + 05CA : D0; + 05CB : 8E; + 05CC : 20; + 05CD : 70; + 05CE : 00; + 05CF : 20; + 05D0 : 73; + 05D1 : C8; + 05D2 : D0; + 05D3 : 86; + [05D4..05D5] : 68; + 05D6 : A5; + 05D7 : 11; + 05D8 : 05; + 05D9 : 12; + 05DA : D0; + 05DB : 06; + 05DC : A9; + 05DD : FF; + 05DE : 85; + 05DF : 11; + 05E0 : 85; + 05E1 : 12; + 05E2 : A0; + 05E3 : 01; + 05E4 : 84; + 05E5 : 09; + 05E6 : B1; + 05E7 : 5C; + 05E8 : F0; + 05E9 : 43; + 05EA : 20; + 05EB : E1; + 05EC : FF; + 05ED : 20; + 05EE : E2; + 05EF : C9; + 05F0 : C8; + 05F1 : B1; + 05F2 : 5C; + 05F3 : AA; + 05F4 : C8; + 05F5 : B1; + 05F6 : 5C; + 05F7 : C5; + 05F8 : 12; + 05F9 : D0; + 05FA : 04; + 05FB : E4; + 05FC : 11; + 05FD : F0; + 05FE : 02; + 05FF : B0; + 0600 : 2C; + 0601 : 84; + 0602 : 46; + 0603 : 20; + 0604 : D9; + 0605 : DC; + 0606 : A9; + 0607 : 20; + 0608 : A4; + 0609 : 46; + 060A : 29; + 060B : 7F; + 060C : 20; + 060D : 45; + 060E : CA; + 060F : C9; + 0610 : 22; + 0611 : D0; + 0612 : 06; + 0613 : A5; + 0614 : 09; + 0615 : 49; + 0616 : FF; + 0617 : 85; + 0618 : 09; + 0619 : C8; + 061A : F0; + 061B : 11; + 061C : B1; + 061D : 5C; + 061E : D0; + 061F : 10; + 0620 : A8; + 0621 : B1; + 0622 : 5C; + 0623 : AA; + 0624 : C8; + 0625 : B1; + 0626 : 5C; + 0627 : 86; + 0628 : 5C; + 0629 : 85; + 062A : 5D; + 062B : D0; + 062C : B5; + 062D : 4C; + 062E : 89; + 062F : C3; + 0630 : 10; + 0631 : DA; + 0632 : C9; + 0633 : FF; + 0634 : F0; + 0635 : D6; + 0636 : 24; + 0637 : 09; + 0638 : 30; + 0639 : D2; + 063A : 38; + 063B : E9; + 063C : 7F; + 063D : AA; + 063E : 84; + 063F : 46; + 0640 : A0; + 0641 : FF; + 0642 : CA; + 0643 : F0; + 0644 : 08; + 0645 : C8; + 0646 : B9; + 0647 : 92; + 0648 : C0; + 0649 : 10; + 064A : FA; + 064B : 30; + 064C : F5; + 064D : C8; + 064E : B9; + 064F : 92; + 0650 : C0; + 0651 : 30; + 0652 : B5; + 0653 : 20; + 0654 : 45; + 0655 : CA; + 0656 : D0; + 0657 : F5; + 0658 : A9; + 0659 : 80; + 065A : 85; + 065B : 0A; + 065C : 20; + 065D : AD; + 065E : C8; + 065F : 20; + 0660 : AA; + 0661 : C2; + 0662 : D0; + 0663 : 05; + 0664 : 8A; + 0665 : 69; + 0666 : 0F; + 0667 : AA; + 0668 : 9A; + [0669..066A] : 68; + 066B : A9; + 066C : 09; + 066D : 20; + 066E : 1B; + 066F : C3; + 0670 : 20; + 0671 : 0E; + 0672 : C8; + 0673 : 18; + 0674 : 98; + 0675 : 65; + 0676 : 77; + 0677 : 48; + 0678 : A5; + 0679 : 78; + 067A : 69; + 067B : 00; + 067C : 48; + 067D : A5; + 067E : 37; + 067F : 48; + 0680 : A5; + 0681 : 36; + 0682 : 48; + 0683 : A9; + 0684 : A4; + 0685 : 20; + 0686 : FA; + 0687 : CD; + 0688 : 20; + 0689 : 8E; + 068A : CC; + 068B : 20; + 068C : 8B; + 068D : CC; + 068E : A5; + 068F : 63; + 0690 : 09; + 0691 : 7F; + 0692 : 25; + 0693 : 5F; + 0694 : 85; + 0695 : 5F; + 0696 : A9; + 0697 : A1; + 0698 : A0; + 0699 : C6; + 069A : 85; + 069B : 1F; + 069C : 84; + 069D : 20; + 069E : 4C; + 069F : 44; + 06A0 : CD; + 06A1 : A9; + 06A2 : C8; + 06A3 : A0; + 06A4 : D8; + 06A5 : 20; + 06A6 : AE; + 06A7 : DA; + 06A8 : 20; + 06A9 : 76; + 06AA : 00; + 06AB : C9; + 06AC : A9; + 06AD : D0; + 06AE : 06; + 06AF : 20; + 06B0 : 70; + 06B1 : 00; + 06B2 : 20; + 06B3 : 8B; + 06B4 : CC; + 06B5 : 20; + 06B6 : 37; + 06B7 : DB; + 06B8 : 20; + 06B9 : 39; + 06BA : CD; + 06BB : A5; + 06BC : 47; + 06BD : 48; + 06BE : A5; + 06BF : 46; + 06C0 : 48; + 06C1 : A9; + 06C2 : 81; + 06C3 : 48; + 06C4 : 20; + 06C5 : E1; + 06C6 : FF; + 06C7 : A5; + 06C8 : 77; + 06C9 : A4; + 06CA : 78; + 06CB : C0; + 06CC : 02; + 06CD : EA; + 06CE : F0; + 06CF : 04; + 06D0 : 85; + 06D1 : 3A; + 06D2 : 84; + 06D3 : 3B; + 06D4 : A0; + 06D5 : 00; + 06D6 : B1; + 06D7 : 77; + 06D8 : D0; + 06D9 : 40; + 06DA : A0; + 06DB : 02; + 06DC : B1; + 06DD : 77; + 06DE : 18; + 06DF : D0; + 06E0 : 03; + 06E1 : 4C; + 06E2 : 5B; + 06E3 : C7; + 06E4 : C8; + 06E5 : B1; + 06E6 : 77; + 06E7 : 85; + 06E8 : 36; + 06E9 : C8; + 06EA : B1; + 06EB : 77; + 06EC : 85; + 06ED : 37; + 06EE : 98; + 06EF : 65; + 06F0 : 77; + 06F1 : 85; + 06F2 : 77; + 06F3 : 90; + 06F4 : 02; + 06F5 : E6; + 06F6 : 78; + 06F7 : 20; + 06F8 : 70; + 06F9 : 00; + 06FA : 20; + 06FB : 00; + 06FC : C7; + 06FD : 4C; + 06FE : C4; + 06FF : C6; + 0700 : F0; + 0701 : 3C; + 0702 : E9; + 0703 : 80; + 0704 : 90; + 0705 : 11; + 0706 : C9; + 0707 : 23; + 0708 : B0; + 0709 : 17; + 070A : 0A; + 070B : A8; + 070C : B9; + 070D : 01; + 070E : C0; + 070F : 48; + 0710 : B9; + 0711 : 00; + 0712 : C0; + 0713 : 48; + 0714 : 4C; + 0715 : 70; + 0716 : 00; + 0717 : 4C; + 0718 : AD; + 0719 : C8; + 071A : C9; + 071B : 3A; + 071C : F0; + 071D : D9; + 071E : 4C; + 071F : 03; + 0720 : CE; + 0721 : C9; + 0722 : 4B; + 0723 : D0; + 0724 : F9; + 0725 : 20; + 0726 : 70; + 0727 : 00; + 0728 : A9; + 0729 : A4; + 072A : 20; + 072B : FA; + 072C : CD; + 072D : 4C; + 072E : AD; + 072F : C7; + 0730 : 38; + 0731 : A5; + 0732 : 28; + 0733 : E9; + 0734 : 01; + 0735 : A4; + 0736 : 29; + 0737 : B0; + 0738 : 01; + 0739 : 88; + 073A : 85; + 073B : 3E; + 073C : 84; + 073D : 3F; + 073E : 60; + 073F : B0; + 0740 : 01; + 0741 : 18; + 0742 : D0; + 0743 : 40; + 0744 : A5; + 0745 : 77; + 0746 : A4; + 0747 : 78; + 0748 : A6; + 0749 : 37; + 074A : E8; + 074B : F0; + 074C : 0C; + 074D : 85; + 074E : 3A; + 074F : 84; + 0750 : 3B; + 0751 : A5; + 0752 : 36; + 0753 : A4; + 0754 : 37; + 0755 : 85; + 0756 : 38; + 0757 : 84; + 0758 : 39; + [0759..075A] : 68; + 075B : A9; + 075C : A2; + 075D : A0; + 075E : C2; + 075F : A2; + 0760 : 00; + 0761 : 86; + 0762 : 0D; + 0763 : 90; + 0764 : 03; + 0765 : 4C; + 0766 : 7E; + 0767 : C3; + 0768 : 4C; + 0769 : 89; + 076A : C3; + 076B : D0; + 076C : 17; + 076D : A2; + 076E : DB; + 076F : A4; + 0770 : 3B; + 0771 : D0; + 0772 : 03; + 0773 : 4C; + 0774 : 57; + 0775 : C3; + 0776 : A5; + 0777 : 3A; + 0778 : 85; + 0779 : 77; + 077A : 84; + 077B : 78; + 077C : A5; + 077D : 38; + 077E : A4; + 077F : 39; + 0780 : 85; + 0781 : 36; + 0782 : 84; + 0783 : 37; + 0784 : 60; + 0785 : D0; + 0786 : 03; + 0787 : 4C; + 0788 : 72; + 0789 : C5; + 078A : 20; + 078B : 79; + 078C : C5; + 078D : 4C; + 078E : A4; + 078F : C7; + 0790 : A9; + 0791 : 03; + 0792 : 20; + 0793 : 1B; + 0794 : C3; + 0795 : A5; + 0796 : 78; + 0797 : 48; + 0798 : A5; + 0799 : 77; + 079A : 48; + 079B : A5; + 079C : 37; + 079D : 48; + 079E : A5; + 079F : 36; + 07A0 : 48; + 07A1 : A9; + 07A2 : 8D; + 07A3 : 48; + 07A4 : 20; + 07A5 : 76; + 07A6 : 00; + 07A7 : 20; + 07A8 : AD; + 07A9 : C7; + 07AA : 4C; + 07AB : C4; + 07AC : C6; + 07AD : 20; + 07AE : 73; + 07AF : C8; + 07B0 : 20; + 07B1 : 11; + 07B2 : C8; + 07B3 : A5; + 07B4 : 37; + 07B5 : C5; + 07B6 : 12; + 07B7 : B0; + 07B8 : 0B; + 07B9 : 98; + 07BA : 38; + 07BB : 65; + 07BC : 77; + 07BD : A6; + 07BE : 78; + 07BF : 90; + 07C0 : 07; + 07C1 : E8; + 07C2 : B0; + 07C3 : 04; + 07C4 : A5; + 07C5 : 28; + 07C6 : A6; + 07C7 : 29; + 07C8 : 20; + 07C9 : 30; + 07CA : C5; + 07CB : 90; + 07CC : 1E; + 07CD : A5; + 07CE : 5C; + 07CF : E9; + 07D0 : 01; + 07D1 : 85; + 07D2 : 77; + 07D3 : A5; + 07D4 : 5D; + 07D5 : E9; + 07D6 : 00; + 07D7 : 85; + 07D8 : 78; + 07D9 : 60; + 07DA : D0; + 07DB : FD; + 07DC : A9; + 07DD : FF; + 07DE : 85; + 07DF : 47; + 07E0 : 20; + 07E1 : AA; + 07E2 : C2; + 07E3 : 9A; + 07E4 : C9; + 07E5 : 8D; + 07E6 : F0; + 07E7 : 0B; + 07E8 : A2; + 07E9 : 16; + 07EA : 2C; + 07EB : A2; + 07EC : 5A; + 07ED : 4C; + 07EE : 57; + 07EF : C3; + 07F0 : 4C; + 07F1 : 03; + 07F2 : CE; + [07F3..07F4] : 68; + 07F5 : 85; + 07F6 : 36; + 07F7 : 68; + 07F8 : 85; + 07F9 : 37; + 07FA : 68; + 07FB : 85; + 07FC : 77; + 07FD : 68; + 07FE : 85; + 07FF : 78; + 0800 : 20; + 0801 : 0E; + 0802 : C8; + 0803 : 98; + 0804 : 18; + 0805 : 65; + 0806 : 77; + 0807 : 85; + 0808 : 77; + 0809 : 90; + 080A : 02; + 080B : E6; + 080C : 78; + 080D : 60; + 080E : A2; + 080F : 3A; + 0810 : 2C; + 0811 : A2; + 0812 : 00; + 0813 : 86; + 0814 : 03; + 0815 : A0; + 0816 : 00; + 0817 : 84; + 0818 : 04; + 0819 : A5; + 081A : 04; + 081B : A6; + 081C : 03; + 081D : 85; + 081E : 03; + 081F : 86; + 0820 : 04; + 0821 : B1; + 0822 : 77; + 0823 : F0; + 0824 : E8; + 0825 : C5; + 0826 : 04; + 0827 : F0; + 0828 : E4; + 0829 : C8; + 082A : C9; + 082B : 22; + 082C : D0; + 082D : F3; + 082E : F0; + 082F : E9; + 0830 : 20; + 0831 : 9F; + 0832 : CC; + 0833 : 20; + 0834 : 76; + 0835 : 00; + 0836 : C9; + 0837 : 89; + 0838 : F0; + 0839 : 05; + 083A : A9; + 083B : A7; + 083C : 20; + 083D : FA; + 083E : CD; + 083F : A5; + 0840 : 5E; + 0841 : D0; + 0842 : 05; + 0843 : 20; + 0844 : 11; + 0845 : C8; + 0846 : F0; + 0847 : BB; + 0848 : 20; + 0849 : 76; + 084A : 00; + 084B : B0; + 084C : 03; + 084D : 4C; + 084E : AD; + 084F : C7; + 0850 : 4C; + 0851 : 00; + 0852 : C7; + 0853 : 20; + 0854 : 78; + 0855 : D6; + 0856 : 48; + 0857 : C9; + 0858 : 8D; + 0859 : F0; + 085A : 04; + 085B : C9; + 085C : 89; + 085D : D0; + 085E : 91; + 085F : C6; + 0860 : 62; + 0861 : D0; + 0862 : 04; + 0863 : 68; + 0864 : 4C; + 0865 : 02; + 0866 : C7; + 0867 : 20; + 0868 : 70; + 0869 : 00; + 086A : 20; + 086B : 73; + 086C : C8; + 086D : C9; + 086E : 2C; + 086F : F0; + 0870 : EE; + 0871 : 68; + 0872 : 60; + 0873 : A2; + 0874 : 00; + 0875 : 86; + 0876 : 11; + 0877 : 86; + 0878 : 12; + 0879 : B0; + 087A : F7; + 087B : E9; + 087C : 2F; + 087D : 85; + 087E : 03; + 087F : A5; + 0880 : 12; + 0881 : 85; + 0882 : 1F; + 0883 : C9; + 0884 : 19; + 0885 : B0; + 0886 : D4; + 0887 : A5; + 0888 : 11; + 0889 : 0A; + 088A : 26; + 088B : 1F; + 088C : 0A; + 088D : 26; + 088E : 1F; + 088F : 65; + 0890 : 11; + 0891 : 85; + 0892 : 11; + 0893 : A5; + 0894 : 1F; + 0895 : 65; + 0896 : 12; + 0897 : 85; + 0898 : 12; + 0899 : 06; + 089A : 11; + 089B : 26; + 089C : 12; + 089D : A5; + 089E : 11; + 089F : 65; + 08A0 : 03; + 08A1 : 85; + 08A2 : 11; + 08A3 : 90; + 08A4 : 02; + 08A5 : E6; + 08A6 : 12; + 08A7 : 20; + 08A8 : 70; + 08A9 : 00; + 08AA : 4C; + 08AB : 79; + 08AC : C8; + 08AD : 20; + 08AE : 6D; + 08AF : CF; + 08B0 : 85; + 08B1 : 46; + 08B2 : 84; + 08B3 : 47; + 08B4 : A9; + 08B5 : B2; + 08B6 : 20; + 08B7 : FA; + 08B8 : CD; + 08B9 : A5; + 08BA : 08; + 08BB : 48; + 08BC : A5; + 08BD : 07; + 08BE : 48; + 08BF : 20; + 08C0 : 9F; + 08C1 : CC; + 08C2 : 68; + 08C3 : 2A; + 08C4 : 20; + 08C5 : 91; + 08C6 : CC; + 08C7 : D0; + 08C8 : 18; + 08C9 : 68; + 08CA : 10; + 08CB : 12; + 08CC : 20; + 08CD : 27; + 08CE : DB; + 08CF : 20; + 08D0 : 9A; + 08D1 : D0; + 08D2 : A0; + 08D3 : 00; + 08D4 : A5; + 08D5 : 61; + 08D6 : 91; + 08D7 : 46; + 08D8 : C8; + 08D9 : A5; + 08DA : 62; + 08DB : 91; + 08DC : 46; + 08DD : 60; + 08DE : 4C; + 08DF : DC; + 08E0 : DA; + 08E1 : 68; + 08E2 : A4; + 08E3 : 47; + 08E4 : C0; + 08E5 : DE; + 08E6 : D0; + 08E7 : 4F; + 08E8 : 20; + 08E9 : 80; + 08EA : D5; + 08EB : C9; + 08EC : 06; + 08ED : D0; + 08EE : 40; + 08EF : A0; + 08F0 : 00; + 08F1 : 84; + 08F2 : 5E; + 08F3 : 84; + 08F4 : 63; + 08F5 : 84; + 08F6 : 6E; + 08F7 : 20; + 08F8 : 28; + 08F9 : C9; + 08FA : 20; + 08FB : EE; + 08FC : D9; + 08FD : E6; + 08FE : 6E; + 08FF : A4; + 0900 : 6E; + 0901 : 20; + 0902 : 28; + 0903 : C9; + 0904 : 20; + 0905 : 18; + 0906 : DB; + 0907 : AA; + 0908 : F0; + 0909 : 05; + 090A : E8; + 090B : 8A; + 090C : 20; + 090D : F9; + 090E : D9; + 090F : A4; + 0910 : 6E; + 0911 : C8; + 0912 : C0; + 0913 : 06; + 0914 : D0; + 0915 : DF; + 0916 : 20; + 0917 : EE; + 0918 : D9; + 0919 : 20; + 091A : A7; + 091B : DB; + 091C : A2; + 091D : 02; + 091E : 78; + 091F : B5; + 0920 : 60; + 0921 : 95; + 0922 : 8D; + 0923 : CA; + 0924 : 10; + 0925 : F9; + 0926 : 58; + 0927 : 60; + 0928 : B1; + 0929 : 1F; + 092A : 20; + 092B : 7D; + 092C : 00; + 092D : 90; + 092E : 03; + 092F : 4C; + 0930 : 23; + 0931 : D1; + 0932 : E9; + 0933 : 2F; + 0934 : 4C; + 0935 : 8A; + 0936 : DC; + 0937 : A0; + 0938 : 02; + 0939 : B1; + 093A : 61; + 093B : C5; + 093C : 31; + 093D : 90; + 093E : 17; + 093F : D0; + 0940 : 07; + 0941 : 88; + 0942 : B1; + 0943 : 61; + 0944 : C5; + 0945 : 30; + 0946 : 90; + 0947 : 0E; + 0948 : A4; + 0949 : 62; + 094A : C4; + 094B : 2B; + 094C : 90; + 094D : 08; + 094E : D0; + 094F : 0D; + 0950 : A5; + 0951 : 61; + 0952 : C5; + 0953 : 2A; + 0954 : B0; + 0955 : 07; + 0956 : A5; + 0957 : 61; + 0958 : A4; + 0959 : 62; + 095A : 4C; + 095B : 73; + 095C : C9; + 095D : A0; + 095E : 00; + 095F : B1; + 0960 : 61; + 0961 : 20; + 0962 : 4F; + 0963 : D3; + 0964 : A5; + 0965 : 4D; + 0966 : A4; + 0967 : 4E; + 0968 : 85; + 0969 : 6C; + 096A : 84; + 096B : 6D; + 096C : 20; + 096D : 54; + 096E : D5; + 096F : A9; + 0970 : 5E; + 0971 : A0; + 0972 : 00; + 0973 : 85; + 0974 : 4D; + 0975 : 84; + 0976 : 4E; + 0977 : 20; + 0978 : B5; + 0979 : D5; + 097A : A0; + 097B : 00; + 097C : B1; + 097D : 4D; + 097E : 91; + 097F : 46; + 0980 : C8; + 0981 : B1; + 0982 : 4D; + 0983 : 91; + 0984 : 46; + 0985 : C8; + 0986 : B1; + 0987 : 4D; + 0988 : 91; + 0989 : 46; + 098A : 60; + 098B : 20; + 098C : 91; + 098D : C9; + 098E : 4C; + 098F : B7; + 0990 : CA; + 0991 : 20; + 0992 : 78; + 0993 : D6; + 0994 : F0; + 0995 : 05; + 0996 : A9; + 0997 : 2C; + 0998 : 20; + 0999 : FA; + 099A : CD; + 099B : 08; + 099C : 20; + 099D : C9; + 099E : FF; + 099F : 86; + 09A0 : 0E; + 09A1 : 28; + 09A2 : 4C; + 09A3 : AB; + 09A4 : C9; + 09A5 : 20; + 09A6 : 1F; + 09A7 : CA; + 09A8 : 20; + 09A9 : 76; + 09AA : 00; + 09AB : F0; + 09AC : 35; + 09AD : F0; + 09AE : 3F; + 09AF : C9; + 09B0 : A3; + 09B1 : F0; + 09B2 : 49; + 09B3 : C9; + 09B4 : A6; + 09B5 : 18; + 09B6 : F0; + 09B7 : 44; + 09B8 : C9; + 09B9 : 2C; + 09BA : F0; + 09BB : 33; + 09BC : C9; + 09BD : 3B; + 09BE : F0; + 09BF : 51; + 09C0 : 20; + 09C1 : 9F; + 09C2 : CC; + 09C3 : 24; + 09C4 : 07; + 09C5 : 30; + 09C6 : DE; + 09C7 : 20; + 09C8 : E9; + 09C9 : DC; + 09CA : 20; + 09CB : 61; + 09CC : D3; + 09CD : 20; + 09CE : 1F; + 09CF : CA; + 09D0 : 20; + 09D1 : 39; + 09D2 : CA; + 09D3 : D0; + 09D4 : D3; + 09D5 : A9; + 09D6 : 00; + 09D7 : 9D; + 09D8 : 00; + 09D9 : 02; + 09DA : A2; + 09DB : FF; + 09DC : A0; + 09DD : 01; + 09DE : A5; + 09DF : 0E; + 09E0 : D0; + 09E1 : 0C; + 09E2 : A9; + 09E3 : 0D; + 09E4 : 20; + 09E5 : 45; + 09E6 : CA; + 09E7 : A9; + 09E8 : 0A; + 09E9 : 20; + 09EA : 45; + 09EB : CA; + 09EC : 49; + 09ED : FF; + 09EE : 60; + 09EF : A5; + 09F0 : C6; + 09F1 : 38; + 09F2 : E9; + 09F3 : 0A; + 09F4 : B0; + 09F5 : FC; + 09F6 : 49; + 09F7 : FF; + 09F8 : 69; + 09F9 : 01; + 09FA : D0; + 09FB : 10; + 09FC : 08; + 09FD : 20; + 09FE : 75; + 09FF : D6; + 0A00 : C9; + 0A01 : 29; + 0A02 : D0; + 0A03 : 5D; + 0A04 : 28; + 0A05 : 90; + 0A06 : 06; + 0A07 : 8A; + 0A08 : E5; + 0A09 : C6; + 0A0A : 90; + 0A0B : 05; + 0A0C : AA; + 0A0D : E8; + 0A0E : CA; + 0A0F : D0; + 0A10 : 06; + 0A11 : 20; + 0A12 : 70; + 0A13 : 00; + 0A14 : 4C; + 0A15 : AD; + 0A16 : C9; + 0A17 : 20; + 0A18 : 39; + 0A19 : CA; + 0A1A : D0; + 0A1B : F2; + 0A1C : 20; + 0A1D : 61; + 0A1E : D3; + 0A1F : 20; + 0A20 : 80; + 0A21 : D5; + 0A22 : AA; + 0A23 : A0; + 0A24 : 00; + 0A25 : E8; + 0A26 : CA; + 0A27 : F0; + 0A28 : C5; + 0A29 : B1; + 0A2A : 1F; + 0A2B : 20; + 0A2C : 45; + 0A2D : CA; + 0A2E : C8; + 0A2F : C9; + 0A30 : 0D; + 0A31 : D0; + 0A32 : F3; + 0A33 : 20; + 0A34 : EC; + 0A35 : C9; + 0A36 : 4C; + 0A37 : 26; + 0A38 : CA; + 0A39 : A5; + 0A3A : 0E; + 0A3B : F0; + 0A3C : 03; + 0A3D : A9; + 0A3E : 20; + 0A3F : 2C; + 0A40 : A9; + 0A41 : 1D; + 0A42 : 2C; + 0A43 : A9; + 0A44 : 3F; + 0A45 : 24; + 0A46 : 0D; + 0A47 : 30; + 0A48 : 03; + 0A49 : 20; + 0A4A : D2; + 0A4B : FF; + 0A4C : 29; + 0A4D : FF; + 0A4E : 60; + 0A4F : A5; + 0A50 : 0B; + 0A51 : F0; + 0A52 : 11; + 0A53 : 30; + 0A54 : 04; + 0A55 : A0; + 0A56 : FF; + 0A57 : D0; + 0A58 : 04; + 0A59 : A5; + 0A5A : 3C; + 0A5B : A4; + 0A5C : 3D; + 0A5D : 85; + 0A5E : 36; + 0A5F : 84; + 0A60 : 37; + 0A61 : 4C; + 0A62 : 03; + 0A63 : CE; + 0A64 : A5; + 0A65 : 0E; + 0A66 : F0; + 0A67 : 05; + 0A68 : A2; + 0A69 : BF; + 0A6A : 4C; + 0A6B : 57; + 0A6C : C3; + 0A6D : A9; + 0A6E : 0D; + 0A6F : A0; + 0A70 : CC; + 0A71 : 20; + 0A72 : 1C; + 0A73 : CA; + 0A74 : A5; + 0A75 : 3A; + 0A76 : A4; + 0A77 : 3B; + 0A78 : 85; + 0A79 : 77; + 0A7A : 84; + 0A7B : 78; + 0A7C : 60; + 0A7D : 20; + 0A7E : 80; + 0A7F : D2; + 0A80 : C9; + 0A81 : 23; + 0A82 : D0; + 0A83 : 10; + 0A84 : 20; + 0A85 : 70; + 0A86 : 00; + 0A87 : 20; + 0A88 : 78; + 0A89 : D6; + 0A8A : A9; + 0A8B : 2C; + 0A8C : 20; + 0A8D : FA; + 0A8E : CD; + 0A8F : 20; + 0A90 : C6; + 0A91 : FF; + 0A92 : 86; + 0A93 : 0E; + 0A94 : A2; + 0A95 : 01; + 0A96 : A0; + 0A97 : 02; + 0A98 : A9; + 0A99 : 00; + 0A9A : 8D; + 0A9B : 01; + 0A9C : 02; + 0A9D : A9; + 0A9E : 40; + 0A9F : 20; + 0AA0 : 10; + 0AA1 : CB; + 0AA2 : A6; + 0AA3 : 0E; + 0AA4 : D0; + 0AA5 : 13; + 0AA6 : 60; + 0AA7 : 20; + 0AA8 : 78; + 0AA9 : D6; + 0AAA : A9; + 0AAB : 2C; + 0AAC : 20; + 0AAD : FA; + 0AAE : CD; + 0AAF : 20; + 0AB0 : C6; + 0AB1 : FF; + 0AB2 : 86; + 0AB3 : 0E; + 0AB4 : 20; + 0AB5 : D2; + 0AB6 : CA; + 0AB7 : A5; + 0AB8 : 0E; + 0AB9 : 20; + 0ABA : CC; + 0ABB : FF; + 0ABC : A2; + 0ABD : 00; + 0ABE : 86; + 0ABF : 0E; + 0AC0 : 60; + 0AC1 : 46; + 0AC2 : 0D; + 0AC3 : C9; + 0AC4 : 22; + 0AC5 : D0; + 0AC6 : 0B; + 0AC7 : 20; + 0AC8 : B8; + 0AC9 : CD; + 0ACA : A9; + 0ACB : 3B; + 0ACC : 20; + 0ACD : FA; + 0ACE : CD; + 0ACF : 20; + 0AD0 : 1F; + 0AD1 : CA; + 0AD2 : 20; + 0AD3 : 80; + 0AD4 : D2; + 0AD5 : A9; + 0AD6 : 2C; + 0AD7 : 8D; + 0AD8 : FF; + 0AD9 : 01; + 0ADA : 20; + 0ADB : FA; + 0ADC : CA; + 0ADD : A5; + 0ADE : 0E; + 0ADF : F0; + 0AE0 : 0C; + 0AE1 : A5; + 0AE2 : 96; + 0AE3 : 29; + 0AE4 : 02; + 0AE5 : F0; + 0AE6 : 06; + 0AE7 : 20; + 0AE8 : B7; + 0AE9 : CA; + 0AEA : 4C; + 0AEB : 00; + 0AEC : C8; + 0AED : AD; + 0AEE : 00; + 0AEF : 02; + 0AF0 : D0; + 0AF1 : 1C; + 0AF2 : A5; + 0AF3 : 0E; + 0AF4 : D0; + 0AF5 : E4; + 0AF6 : 18; + 0AF7 : 4C; + 0AF8 : 51; + 0AF9 : C7; + 0AFA : A5; + 0AFB : 0E; + 0AFC : D0; + 0AFD : 06; + 0AFE : 20; + 0AFF : 43; + 0B00 : CA; + 0B01 : 20; + 0B02 : 39; + 0B03 : CA; + 0B04 : 4C; + 0B05 : 6F; + 0B06 : C4; + 0B07 : A6; + 0B08 : 3E; + 0B09 : A4; + 0B0A : 3F; + 0B0B : A9; + 0B0C : 98; + 0B0D : 2C; + 0B0E : A9; + 0B0F : 00; + 0B10 : 85; + 0B11 : 0B; + 0B12 : 86; + 0B13 : 40; + 0B14 : 84; + 0B15 : 41; + 0B16 : 20; + 0B17 : 6D; + 0B18 : CF; + 0B19 : 85; + 0B1A : 46; + 0B1B : 84; + 0B1C : 47; + 0B1D : A5; + 0B1E : 77; + 0B1F : A4; + 0B20 : 78; + 0B21 : 85; + 0B22 : 48; + 0B23 : 84; + 0B24 : 49; + 0B25 : A6; + 0B26 : 40; + 0B27 : A4; + 0B28 : 41; + 0B29 : 86; + 0B2A : 77; + 0B2B : 84; + 0B2C : 78; + 0B2D : 20; + 0B2E : 76; + 0B2F : 00; + 0B30 : D0; + 0B31 : 20; + 0B32 : 24; + 0B33 : 0B; + 0B34 : 50; + 0B35 : 0C; + 0B36 : 20; + 0B37 : E4; + 0B38 : FF; + 0B39 : 8D; + 0B3A : 00; + 0B3B : 02; + 0B3C : A2; + 0B3D : FF; + 0B3E : A0; + 0B3F : 01; + 0B40 : D0; + 0B41 : 0C; + 0B42 : 30; + 0B43 : 75; + 0B44 : A5; + 0B45 : 0E; + 0B46 : D0; + 0B47 : 03; + 0B48 : 20; + 0B49 : 43; + 0B4A : CA; + 0B4B : 20; + 0B4C : FA; + 0B4D : CA; + 0B4E : 86; + 0B4F : 77; + 0B50 : 84; + 0B51 : 78; + 0B52 : 20; + 0B53 : 70; + 0B54 : 00; + 0B55 : 24; + 0B56 : 07; + 0B57 : 10; + 0B58 : 31; + 0B59 : 24; + 0B5A : 0B; + 0B5B : 50; + 0B5C : 09; + 0B5D : E8; + 0B5E : 86; + 0B5F : 77; + 0B60 : A9; + 0B61 : 00; + 0B62 : 85; + 0B63 : 03; + 0B64 : F0; + 0B65 : 0C; + 0B66 : 85; + 0B67 : 03; + 0B68 : C9; + 0B69 : 22; + 0B6A : F0; + 0B6B : 07; + 0B6C : A9; + 0B6D : 3A; + 0B6E : 85; + 0B6F : 03; + 0B70 : A9; + 0B71 : 2C; + 0B72 : 18; + 0B73 : 85; + 0B74 : 04; + 0B75 : A5; + 0B76 : 77; + 0B77 : A4; + 0B78 : 78; + 0B79 : 69; + 0B7A : 00; + 0B7B : 90; + 0B7C : 01; + 0B7D : C8; + 0B7E : 20; + 0B7F : 67; + 0B80 : D3; + 0B81 : 20; + 0B82 : BD; + 0B83 : D6; + 0B84 : 20; + 0B85 : E2; + 0B86 : C8; + 0B87 : 4C; + 0B88 : 92; + 0B89 : CB; + 0B8A : 20; + 0B8B : FF; + 0B8C : DB; + 0B8D : A5; + 0B8E : 08; + 0B8F : 20; + 0B90 : CA; + 0B91 : C8; + 0B92 : 20; + 0B93 : 76; + 0B94 : 00; + 0B95 : F0; + 0B96 : 07; + 0B97 : C9; + 0B98 : 2C; + 0B99 : F0; + 0B9A : 03; + 0B9B : 4C; + 0B9C : 4F; + 0B9D : CA; + 0B9E : A5; + 0B9F : 77; + 0BA0 : A4; + 0BA1 : 78; + 0BA2 : 85; + 0BA3 : 40; + 0BA4 : 84; + 0BA5 : 41; + 0BA6 : A5; + 0BA7 : 48; + 0BA8 : A4; + 0BA9 : 49; + 0BAA : 85; + 0BAB : 77; + 0BAC : 84; + 0BAD : 78; + 0BAE : 20; + 0BAF : 76; + 0BB0 : 00; + 0BB1 : F0; + 0BB2 : 2C; + 0BB3 : 20; + 0BB4 : F8; + 0BB5 : CD; + 0BB6 : 4C; + 0BB7 : 16; + 0BB8 : CB; + 0BB9 : 20; + 0BBA : 0E; + [0BBB..0BBC] : C8; + 0BBD : AA; + 0BBE : D0; + 0BBF : 12; + 0BC0 : A2; + 0BC1 : 2A; + 0BC2 : C8; + 0BC3 : B1; + 0BC4 : 77; + 0BC5 : F0; + 0BC6 : 6D; + 0BC7 : C8; + 0BC8 : B1; + 0BC9 : 77; + 0BCA : 85; + 0BCB : 3C; + 0BCC : C8; + 0BCD : B1; + 0BCE : 77; + 0BCF : C8; + 0BD0 : 85; + 0BD1 : 3D; + 0BD2 : B1; + 0BD3 : 77; + 0BD4 : AA; + 0BD5 : 20; + 0BD6 : 03; + 0BD7 : C8; + 0BD8 : E0; + 0BD9 : 83; + 0BDA : D0; + 0BDB : DD; + 0BDC : 4C; + 0BDD : 52; + 0BDE : CB; + 0BDF : A5; + 0BE0 : 40; + 0BE1 : A4; + 0BE2 : 41; + 0BE3 : A6; + 0BE4 : 0B; + 0BE5 : 10; + 0BE6 : 03; + 0BE7 : 4C; + 0BE8 : 3A; + 0BE9 : C7; + 0BEA : A0; + 0BEB : 00; + 0BEC : B1; + 0BED : 40; + 0BEE : F0; + 0BEF : 0B; + 0BF0 : A5; + 0BF1 : 0E; + 0BF2 : D0; + 0BF3 : 07; + 0BF4 : A9; + 0BF5 : FC; + 0BF6 : A0; + 0BF7 : CB; + 0BF8 : 4C; + 0BF9 : 1C; + 0BFA : CA; + 0BFB : 60; + 0BFC : 3F; + 0BFD : 45; + 0BFE : 58; + 0BFF : 54; + 0C00 : 52; + 0C01 : 41; + 0C02 : 20; + 0C03 : 49; + 0C04 : 47; + 0C05 : 4E; + 0C06 : 4F; + 0C07 : 52; + 0C08 : 45; + 0C09 : 44; + 0C0A : 0D; + 0C0B : 0A; + 0C0C : 00; + 0C0D : 3F; + 0C0E : 52; + 0C0F : 45; + 0C10 : 44; + 0C11 : 4F; + 0C12 : 20; + 0C13 : 46; + 0C14 : 52; + 0C15 : 4F; + 0C16 : 4D; + 0C17 : 20; + 0C18 : 53; + 0C19 : 54; + 0C1A : 41; + 0C1B : 52; + 0C1C : 54; + 0C1D : 0D; + 0C1E : 0A; + 0C1F : 00; + 0C20 : D0; + 0C21 : 04; + 0C22 : A0; + 0C23 : 00; + 0C24 : F0; + 0C25 : 03; + 0C26 : 20; + 0C27 : 6D; + 0C28 : CF; + 0C29 : 85; + 0C2A : 46; + 0C2B : 84; + 0C2C : 47; + 0C2D : 20; + 0C2E : AA; + 0C2F : C2; + 0C30 : F0; + 0C31 : 04; + 0C32 : A2; + 0C33 : 00; + 0C34 : F0; + 0C35 : 66; + 0C36 : 9A; + 0C37 : 8A; + 0C38 : 18; + 0C39 : 69; + 0C3A : 04; + 0C3B : 48; + 0C3C : 69; + 0C3D : 06; + 0C3E : 85; + 0C3F : 21; + 0C40 : 68; + 0C41 : A0; + 0C42 : 01; + 0C43 : 20; + 0C44 : AE; + 0C45 : DA; + 0C46 : BA; + 0C47 : BD; + 0C48 : 09; + 0C49 : 01; + 0C4A : 85; + 0C4B : 63; + 0C4C : A5; + 0C4D : 46; + 0C4E : A4; + 0C4F : 47; + 0C50 : 20; + 0C51 : 73; + 0C52 : D7; + 0C53 : 20; + 0C54 : DC; + 0C55 : DA; + 0C56 : A0; + 0C57 : 01; + 0C58 : 20; + 0C59 : 69; + 0C5A : DB; + 0C5B : BA; + 0C5C : 38; + 0C5D : FD; + 0C5E : 09; + 0C5F : 01; + 0C60 : F0; + 0C61 : 17; + 0C62 : BD; + 0C63 : 0F; + 0C64 : 01; + 0C65 : 85; + 0C66 : 36; + 0C67 : BD; + 0C68 : 10; + 0C69 : 01; + 0C6A : 85; + 0C6B : 37; + 0C6C : BD; + 0C6D : 12; + 0C6E : 01; + 0C6F : 85; + 0C70 : 77; + 0C71 : BD; + 0C72 : 11; + 0C73 : 01; + 0C74 : 85; + 0C75 : 78; + 0C76 : 4C; + 0C77 : C4; + 0C78 : C6; + 0C79 : 8A; + 0C7A : 69; + 0C7B : 11; + 0C7C : AA; + 0C7D : 9A; + 0C7E : 20; + 0C7F : 76; + 0C80 : 00; + 0C81 : C9; + 0C82 : 2C; + 0C83 : D0; + 0C84 : F1; + 0C85 : 20; + 0C86 : 70; + 0C87 : 00; + 0C88 : 20; + 0C89 : 26; + 0C8A : CC; + 0C8B : 20; + 0C8C : 9F; + 0C8D : CC; + 0C8E : 18; + 0C8F : 24; + 0C90 : 38; + 0C91 : 24; + 0C92 : 07; + 0C93 : 30; + 0C94 : 03; + 0C95 : B0; + 0C96 : 03; + 0C97 : 60; + 0C98 : B0; + 0C99 : FD; + 0C9A : A2; + 0C9B : A3; + 0C9C : 4C; + 0C9D : 57; + 0C9E : C3; + 0C9F : A6; + 0CA0 : 77; + 0CA1 : D0; + 0CA2 : 02; + 0CA3 : C6; + 0CA4 : 78; + 0CA5 : C6; + 0CA6 : 77; + 0CA7 : A2; + 0CA8 : 00; + 0CA9 : 24; + 0CAA : 48; + 0CAB : 8A; + 0CAC : 48; + 0CAD : A9; + 0CAE : 01; + 0CAF : 20; + 0CB0 : 1B; + 0CB1 : C3; + 0CB2 : 20; + 0CB3 : 84; + 0CB4 : CD; + 0CB5 : A9; + 0CB6 : 00; + 0CB7 : 85; + 0CB8 : 4A; + 0CB9 : 20; + 0CBA : 76; + 0CBB : 00; + 0CBC : 38; + 0CBD : E9; + 0CBE : B1; + 0CBF : 90; + 0CC0 : 17; + 0CC1 : C9; + 0CC2 : 03; + 0CC3 : B0; + 0CC4 : 13; + 0CC5 : C9; + 0CC6 : 01; + 0CC7 : 2A; + 0CC8 : 49; + 0CC9 : 01; + 0CCA : 45; + 0CCB : 4A; + 0CCC : C5; + 0CCD : 4A; + 0CCE : 90; + 0CCF : 61; + 0CD0 : 85; + 0CD1 : 4A; + 0CD2 : 20; + 0CD3 : 70; + 0CD4 : 00; + 0CD5 : 4C; + 0CD6 : BC; + 0CD7 : CC; + 0CD8 : A6; + 0CD9 : 4A; + 0CDA : D0; + 0CDB : 2C; + 0CDC : B0; + 0CDD : 7B; + 0CDE : 69; + 0CDF : 07; + 0CE0 : 90; + 0CE1 : 77; + 0CE2 : 65; + 0CE3 : 07; + 0CE4 : D0; + 0CE5 : 03; + 0CE6 : 4C; + 0CE7 : 17; + 0CE8 : D5; + 0CE9 : 69; + 0CEA : FF; + 0CEB : 85; + 0CEC : 1F; + 0CED : 0A; + 0CEE : 65; + 0CEF : 1F; + 0CF0 : A8; + 0CF1 : 68; + 0CF2 : D9; + 0CF3 : 74; + 0CF4 : C0; + 0CF5 : B0; + 0CF6 : 67; + 0CF7 : 20; + 0CF8 : 8E; + 0CF9 : CC; + 0CFA : 48; + 0CFB : 20; + 0CFC : 21; + 0CFD : CD; + 0CFE : 68; + 0CFF : A4; + 0D00 : 48; + 0D01 : 10; + 0D02 : 17; + 0D03 : AA; + 0D04 : F0; + 0D05 : 56; + 0D06 : D0; + 0D07 : 5F; + 0D08 : 46; + 0D09 : 07; + 0D0A : 8A; + 0D0B : 2A; + 0D0C : A6; + 0D0D : 77; + 0D0E : D0; + 0D0F : 02; + 0D10 : C6; + 0D11 : 78; + 0D12 : C6; + 0D13 : 77; + 0D14 : A0; + 0D15 : 1B; + 0D16 : 85; + 0D17 : 4A; + 0D18 : D0; + 0D19 : D7; + 0D1A : D9; + 0D1B : 74; + 0D1C : C0; + 0D1D : B0; + 0D1E : 48; + 0D1F : 90; + 0D20 : D9; + 0D21 : B9; + 0D22 : 76; + 0D23 : C0; + 0D24 : 48; + 0D25 : B9; + 0D26 : 75; + 0D27 : C0; + 0D28 : 48; + 0D29 : 20; + 0D2A : 34; + 0D2B : CD; + 0D2C : A5; + 0D2D : 4A; + 0D2E : 4C; + 0D2F : AA; + 0D30 : CC; + 0D31 : 4C; + 0D32 : 03; + 0D33 : CE; + 0D34 : A5; + 0D35 : 63; + 0D36 : BE; + 0D37 : 74; + 0D38 : C0; + 0D39 : A8; + 0D3A : 68; + 0D3B : 85; + 0D3C : 1F; + 0D3D : E6; + 0D3E : 1F; + 0D3F : 68; + 0D40 : 85; + 0D41 : 20; + 0D42 : 98; + 0D43 : 48; + 0D44 : 20; + 0D45 : 27; + 0D46 : DB; + 0D47 : A5; + 0D48 : 62; + 0D49 : 48; + 0D4A : A5; + 0D4B : 61; + 0D4C : 48; + 0D4D : A5; + 0D4E : 60; + 0D4F : 48; + 0D50 : A5; + 0D51 : 5F; + 0D52 : 48; + 0D53 : A5; + 0D54 : 5E; + 0D55 : 48; + 0D56 : 6C; + 0D57 : 1F; + 0D58 : 00; + 0D59 : A0; + 0D5A : FF; + 0D5B : 68; + 0D5C : F0; + 0D5D : 23; + 0D5E : C9; + 0D5F : 64; + 0D60 : F0; + 0D61 : 03; + 0D62 : 20; + 0D63 : 8E; + 0D64 : CC; + 0D65 : 84; + 0D66 : 48; + 0D67 : 68; + 0D68 : 4A; + 0D69 : 85; + 0D6A : 0C; + 0D6B : 68; + 0D6C : 85; + 0D6D : 66; + 0D6E : 68; + 0D6F : 85; + 0D70 : 67; + 0D71 : 68; + 0D72 : 85; + [0D73..0D74] : 68; + 0D75 : 85; + 0D76 : 69; + 0D77 : 68; + 0D78 : 85; + 0D79 : 6A; + 0D7A : 68; + 0D7B : 85; + 0D7C : 6B; + 0D7D : 45; + 0D7E : 63; + 0D7F : 85; + 0D80 : 6C; + 0D81 : A5; + 0D82 : 5E; + 0D83 : 60; + 0D84 : A9; + 0D85 : 00; + 0D86 : 85; + 0D87 : 07; + 0D88 : 20; + 0D89 : 70; + 0D8A : 00; + 0D8B : B0; + 0D8C : 03; + 0D8D : 4C; + 0D8E : FF; + 0D8F : DB; + 0D90 : 20; + 0D91 : F7; + 0D92 : CF; + 0D93 : B0; + 0D94 : 7A; + 0D95 : C9; + 0D96 : FF; + 0D97 : D0; + 0D98 : 0F; + 0D99 : A9; + 0D9A : A3; + 0D9B : A0; + 0D9C : CD; + 0D9D : 20; + 0D9E : AE; + 0D9F : DA; + 0DA0 : 4C; + 0DA1 : 70; + 0DA2 : 00; + 0DA3 : 82; + 0DA4 : 49; + 0DA5 : 0F; + 0DA6 : DA; + 0DA7 : A1; + 0DA8 : C9; + 0DA9 : 2E; + 0DAA : F0; + 0DAB : E1; + 0DAC : C9; + 0DAD : AB; + 0DAE : F0; + 0DAF : 58; + 0DB0 : C9; + 0DB1 : AA; + 0DB2 : F0; + 0DB3 : D4; + 0DB4 : C9; + 0DB5 : 22; + 0DB6 : D0; + 0DB7 : 0F; + 0DB8 : A5; + 0DB9 : 77; + 0DBA : A4; + 0DBB : 78; + 0DBC : 69; + 0DBD : 00; + 0DBE : 90; + 0DBF : 01; + 0DC0 : C8; + 0DC1 : 20; + 0DC2 : 61; + 0DC3 : D3; + 0DC4 : 4C; + 0DC5 : BD; + 0DC6 : D6; + 0DC7 : C9; + 0DC8 : A8; + 0DC9 : D0; + 0DCA : 13; + 0DCB : A0; + 0DCC : 18; + 0DCD : D0; + 0DCE : 3B; + 0DCF : 20; + 0DD0 : 9A; + 0DD1 : D0; + 0DD2 : A5; + 0DD3 : 62; + 0DD4 : 49; + 0DD5 : FF; + 0DD6 : A8; + 0DD7 : A5; + 0DD8 : 61; + 0DD9 : 49; + 0DDA : FF; + 0DDB : 4C; + 0DDC : 6D; + 0DDD : D2; + 0DDE : C9; + 0DDF : A5; + 0DE0 : D0; + 0DE1 : 03; + 0DE2 : 4C; + 0DE3 : CE; + 0DE4 : D2; + 0DE5 : C9; + 0DE6 : B4; + 0DE7 : 90; + 0DE8 : 03; + 0DE9 : 4C; + 0DEA : 89; + 0DEB : CE; + 0DEC : 20; + 0DED : F5; + 0DEE : CD; + 0DEF : 20; + 0DF0 : 9F; + 0DF1 : CC; + 0DF2 : A9; + 0DF3 : 29; + 0DF4 : 2C; + 0DF5 : A9; + 0DF6 : 28; + 0DF7 : 2C; + 0DF8 : A9; + 0DF9 : 2C; + 0DFA : A0; + 0DFB : 00; + 0DFC : D1; + 0DFD : 77; + 0DFE : D0; + 0DFF : 03; + 0E00 : 4C; + 0E01 : 70; + 0E02 : 00; + 0E03 : A2; + 0E04 : 10; + 0E05 : 4C; + 0E06 : 57; + 0E07 : C3; + 0E08 : A0; + 0E09 : 15; + [0E0A..0E0B] : 68; + 0E0C : 4C; + 0E0D : FB; + 0E0E : CC; + 0E0F : 20; + 0E10 : 6D; + 0E11 : CF; + 0E12 : 85; + 0E13 : 61; + 0E14 : 84; + 0E15 : 62; + 0E16 : A5; + 0E17 : 42; + 0E18 : A4; + 0E19 : 43; + 0E1A : A6; + 0E1B : 07; + 0E1C : F0; + 0E1D : 25; + 0E1E : A2; + 0E1F : 00; + 0E20 : 86; + 0E21 : 6D; + 0E22 : 24; + 0E23 : 62; + 0E24 : 10; + 0E25 : 1C; + 0E26 : C9; + 0E27 : 54; + 0E28 : D0; + 0E29 : 18; + 0E2A : C0; + 0E2B : C9; + 0E2C : D0; + 0E2D : 14; + 0E2E : 20; + 0E2F : 69; + 0E30 : CE; + 0E31 : 84; + 0E32 : 5B; + 0E33 : 88; + 0E34 : 84; + 0E35 : 6E; + 0E36 : A0; + 0E37 : 06; + 0E38 : 84; + 0E39 : 5A; + 0E3A : A0; + 0E3B : 24; + 0E3C : 20; + 0E3D : 74; + 0E3E : DD; + 0E3F : 4C; + 0E40 : 49; + 0E41 : D3; + 0E42 : 60; + 0E43 : A6; + 0E44 : 08; + 0E45 : 10; + 0E46 : 0D; + 0E47 : A0; + 0E48 : 00; + 0E49 : B1; + 0E4A : 61; + 0E4B : AA; + 0E4C : C8; + 0E4D : B1; + 0E4E : 61; + 0E4F : A8; + 0E50 : 8A; + 0E51 : 4C; + 0E52 : 6D; + 0E53 : D2; + 0E54 : 24; + 0E55 : 62; + 0E56 : 10; + 0E57 : 2A; + 0E58 : C9; + 0E59 : 54; + 0E5A : D0; + 0E5B : 19; + 0E5C : C0; + 0E5D : 49; + 0E5E : D0; + 0E5F : 22; + 0E60 : 20; + 0E61 : 69; + 0E62 : CE; + 0E63 : 98; + 0E64 : A2; + 0E65 : A0; + 0E66 : 4C; + 0E67 : 5B; + 0E68 : DB; + 0E69 : A9; + 0E6A : 8B; + 0E6B : A0; + 0E6C : 00; + 0E6D : 78; + 0E6E : 20; + 0E6F : AE; + 0E70 : DA; + 0E71 : 58; + 0E72 : 84; + 0E73 : 5F; + 0E74 : 60; + 0E75 : C9; + 0E76 : 53; + 0E77 : D0; + 0E78 : 09; + 0E79 : C0; + 0E7A : 54; + 0E7B : D0; + 0E7C : 05; + 0E7D : A5; + 0E7E : 96; + 0E7F : 4C; + 0E80 : 48; + 0E81 : DB; + 0E82 : A5; + 0E83 : 61; + 0E84 : A4; + 0E85 : 62; + 0E86 : 4C; + 0E87 : AE; + 0E88 : DA; + 0E89 : 0A; + 0E8A : 48; + 0E8B : AA; + 0E8C : 20; + 0E8D : 70; + 0E8E : 00; + 0E8F : E0; + 0E90 : 8F; + 0E91 : 90; + [0E92..0E93] : 20; + 0E94 : F5; + 0E95 : CD; + 0E96 : 20; + 0E97 : 9F; + 0E98 : CC; + 0E99 : 20; + 0E9A : F8; + 0E9B : CD; + 0E9C : 20; + 0E9D : 90; + 0E9E : CC; + 0E9F : 68; + 0EA0 : AA; + 0EA1 : A5; + 0EA2 : 62; + 0EA3 : 48; + 0EA4 : A5; + 0EA5 : 61; + 0EA6 : 48; + 0EA7 : 8A; + 0EA8 : 48; + 0EA9 : 20; + 0EAA : 78; + 0EAB : D6; + 0EAC : 68; + 0EAD : A8; + 0EAE : 8A; + 0EAF : 48; + 0EB0 : 4C; + 0EB1 : B8; + 0EB2 : CE; + 0EB3 : 20; + 0EB4 : EC; + 0EB5 : CD; + 0EB6 : 68; + 0EB7 : A8; + 0EB8 : B9; + 0EB9 : DE; + 0EBA : BF; + 0EBB : 85; + 0EBC : 52; + 0EBD : B9; + 0EBE : DF; + 0EBF : BF; + 0EC0 : 85; + 0EC1 : 53; + 0EC2 : 20; + 0EC3 : 51; + 0EC4 : 00; + 0EC5 : 4C; + 0EC6 : 8E; + 0EC7 : CC; + 0EC8 : A0; + 0EC9 : FF; + 0ECA : 2C; + 0ECB : A0; + 0ECC : 00; + 0ECD : 84; + 0ECE : 05; + 0ECF : 20; + 0ED0 : 9A; + 0ED1 : D0; + 0ED2 : A5; + 0ED3 : 61; + 0ED4 : 45; + 0ED5 : 05; + 0ED6 : 85; + 0ED7 : 03; + 0ED8 : A5; + 0ED9 : 62; + 0EDA : 45; + 0EDB : 05; + 0EDC : 85; + 0EDD : 04; + 0EDE : 20; + 0EDF : 08; + 0EE0 : DB; + 0EE1 : 20; + 0EE2 : 9A; + 0EE3 : D0; + 0EE4 : A5; + 0EE5 : 62; + 0EE6 : 45; + 0EE7 : 05; + 0EE8 : 25; + 0EE9 : 04; + 0EEA : 45; + 0EEB : 05; + 0EEC : A8; + 0EED : A5; + 0EEE : 61; + 0EEF : 45; + 0EF0 : 05; + 0EF1 : 25; + 0EF2 : 03; + 0EF3 : 45; + 0EF4 : 05; + 0EF5 : 4C; + 0EF6 : 6D; + 0EF7 : D2; + 0EF8 : 20; + 0EF9 : 91; + 0EFA : CC; + 0EFB : B0; + 0EFC : 13; + 0EFD : A5; + 0EFE : 6B; + 0EFF : 09; + 0F00 : 7F; + 0F01 : 25; + 0F02 : 67; + 0F03 : 85; + 0F04 : 67; + 0F05 : A9; + 0F06 : 66; + 0F07 : A0; + 0F08 : 00; + 0F09 : 20; + 0F0A : 67; + 0F0B : DB; + 0F0C : AA; + 0F0D : 4C; + 0F0E : 43; + 0F0F : CF; + 0F10 : A9; + 0F11 : 00; + 0F12 : 85; + 0F13 : 07; + 0F14 : C6; + 0F15 : 4A; + 0F16 : 20; + 0F17 : 80; + 0F18 : D5; + 0F19 : 85; + 0F1A : 5E; + 0F1B : 86; + 0F1C : 5F; + 0F1D : 84; + 0F1E : 60; + 0F1F : A5; + 0F20 : 69; + 0F21 : A4; + 0F22 : 6A; + 0F23 : 20; + 0F24 : 84; + 0F25 : D5; + 0F26 : 86; + 0F27 : 69; + 0F28 : 84; + 0F29 : 6A; + 0F2A : AA; + 0F2B : 38; + 0F2C : E5; + 0F2D : 5E; + 0F2E : F0; + 0F2F : 08; + 0F30 : A9; + 0F31 : 01; + 0F32 : 90; + 0F33 : 04; + 0F34 : A6; + 0F35 : 5E; + 0F36 : A9; + 0F37 : FF; + 0F38 : 85; + 0F39 : 63; + 0F3A : A0; + 0F3B : FF; + 0F3C : E8; + 0F3D : C8; + 0F3E : CA; + 0F3F : D0; + 0F40 : 07; + 0F41 : A6; + 0F42 : 63; + 0F43 : 30; + 0F44 : 0F; + 0F45 : 18; + 0F46 : 90; + 0F47 : 0C; + 0F48 : B1; + 0F49 : 69; + 0F4A : D1; + 0F4B : 5F; + 0F4C : F0; + 0F4D : EF; + 0F4E : A2; + 0F4F : FF; + 0F50 : B0; + 0F51 : 02; + 0F52 : A2; + 0F53 : 01; + 0F54 : E8; + 0F55 : 8A; + 0F56 : 2A; + 0F57 : 25; + 0F58 : 0C; + 0F59 : F0; + 0F5A : 02; + 0F5B : A9; + 0F5C : FF; + 0F5D : 4C; + 0F5E : 48; + 0F5F : DB; + 0F60 : 20; + 0F61 : F8; + 0F62 : CD; + 0F63 : AA; + 0F64 : 20; + 0F65 : 72; + 0F66 : CF; + 0F67 : 20; + 0F68 : 76; + 0F69 : 00; + 0F6A : D0; + 0F6B : F4; + 0F6C : 60; + 0F6D : A2; + 0F6E : 00; + 0F6F : 20; + 0F70 : 76; + 0F71 : 00; + 0F72 : 86; + 0F73 : 06; + 0F74 : 85; + 0F75 : 42; + 0F76 : 20; + 0F77 : 76; + 0F78 : 00; + 0F79 : 20; + 0F7A : F7; + 0F7B : CF; + 0F7C : B0; + 0F7D : 03; + 0F7E : 4C; + 0F7F : 03; + 0F80 : CE; + 0F81 : A2; + 0F82 : 00; + 0F83 : 86; + 0F84 : 07; + 0F85 : 86; + 0F86 : 08; + 0F87 : 20; + 0F88 : 70; + 0F89 : 00; + 0F8A : 90; + 0F8B : 05; + 0F8C : 20; + 0F8D : F7; + 0F8E : CF; + 0F8F : 90; + 0F90 : 0B; + 0F91 : AA; + 0F92 : 20; + 0F93 : 70; + 0F94 : 00; + 0F95 : 90; + 0F96 : FB; + 0F97 : 20; + 0F98 : F7; + 0F99 : CF; + 0F9A : B0; + 0F9B : F6; + 0F9C : C9; + 0F9D : 24; + 0F9E : D0; + 0F9F : 06; + 0FA0 : A9; + 0FA1 : FF; + 0FA2 : 85; + 0FA3 : 07; + 0FA4 : D0; + 0FA5 : 10; + 0FA6 : C9; + 0FA7 : 25; + 0FA8 : D0; + 0FA9 : 13; + 0FAA : A5; + 0FAB : 0A; + [0FAC..0FAD] : D0; + 0FAE : A9; + 0FAF : 80; + 0FB0 : 85; + 0FB1 : 08; + 0FB2 : 05; + 0FB3 : 42; + 0FB4 : 85; + 0FB5 : 42; + 0FB6 : 8A; + 0FB7 : 09; + 0FB8 : 80; + 0FB9 : AA; + 0FBA : 20; + 0FBB : 70; + 0FBC : 00; + 0FBD : 86; + 0FBE : 43; + 0FBF : 38; + 0FC0 : 05; + 0FC1 : 0A; + 0FC2 : E9; + 0FC3 : 28; + 0FC4 : D0; + 0FC5 : 03; + 0FC6 : 4C; + 0FC7 : AC; + 0FC8 : D0; + 0FC9 : A9; + 0FCA : 00; + 0FCB : 85; + 0FCC : 0A; + 0FCD : A5; + 0FCE : 2A; + 0FCF : A6; + 0FD0 : 2B; + 0FD1 : A0; + 0FD2 : 00; + 0FD3 : 86; + 0FD4 : 5D; + 0FD5 : 85; + 0FD6 : 5C; + 0FD7 : E4; + 0FD8 : 2D; + 0FD9 : D0; + 0FDA : 04; + 0FDB : C5; + 0FDC : 2C; + 0FDD : F0; + 0FDE : 22; + 0FDF : A5; + 0FE0 : 42; + 0FE1 : D1; + 0FE2 : 5C; + 0FE3 : D0; + 0FE4 : 08; + 0FE5 : A5; + 0FE6 : 43; + 0FE7 : C8; + 0FE8 : D1; + 0FE9 : 5C; + 0FEA : F0; + 0FEB : 7D; + 0FEC : 88; + 0FED : 18; + 0FEE : A5; + 0FEF : 5C; + 0FF0 : 69; + 0FF1 : 07; + 0FF2 : 90; + 0FF3 : E1; + 0FF4 : E8; + 0FF5 : D0; + 0FF6 : DC; + 0FF7 : C9; + 0FF8 : 41; + 0FF9 : 90; + 0FFA : 05; + 0FFB : E9; + 0FFC : 5B; + 0FFD : 38; + 0FFE : E9; + 0FFF : A5; + 1000 : 60; + 1001 : 68; + 1002 : 48; + 1003 : C9; + 1004 : 11; + 1005 : D0; + 1006 : 05; + 1007 : A9; + 1008 : 1F; + 1009 : A0; + 100A : DE; + 100B : 60; + 100C : A5; + 100D : 42; + 100E : A4; + 100F : 43; + 1010 : C9; + 1011 : 54; + 1012 : D0; + 1013 : 0B; + 1014 : C0; + 1015 : C9; + 1016 : F0; + 1017 : EF; + 1018 : C0; + 1019 : 49; + 101A : D0; + 101B : 03; + 101C : 4C; + 101D : 03; + 101E : CE; + 101F : C9; + 1020 : 53; + 1021 : D0; + 1022 : 04; + 1023 : C0; + 1024 : 54; + 1025 : F0; + 1026 : F5; + 1027 : A5; + 1028 : 2C; + 1029 : A4; + 102A : 2D; + 102B : 85; + 102C : 5C; + 102D : 84; + 102E : 5D; + 102F : A5; + 1030 : 2E; + 1031 : A4; + 1032 : 2F; + 1033 : 85; + 1034 : 57; + 1035 : 84; + 1036 : 58; + 1037 : 18; + 1038 : 69; + 1039 : 07; + 103A : 90; + 103B : 01; + 103C : C8; + 103D : 85; + 103E : 55; + 103F : 84; + 1040 : 56; + 1041 : 20; + 1042 : D8; + 1043 : C2; + 1044 : A5; + 1045 : 55; + 1046 : A4; + 1047 : 56; + 1048 : C8; + 1049 : 85; + 104A : 2C; + 104B : 84; + 104C : 2D; + 104D : A0; + 104E : 00; + 104F : A5; + 1050 : 42; + 1051 : 91; + 1052 : 5C; + 1053 : C8; + 1054 : A5; + 1055 : 43; + 1056 : 91; + 1057 : 5C; + 1058 : A9; + 1059 : 00; + 105A : C8; + 105B : 91; + 105C : 5C; + 105D : C8; + 105E : 91; + 105F : 5C; + 1060 : C8; + 1061 : 91; + 1062 : 5C; + 1063 : C8; + 1064 : 91; + 1065 : 5C; + 1066 : C8; + 1067 : 91; + 1068 : 5C; + 1069 : A5; + 106A : 5C; + 106B : 18; + 106C : 69; + 106D : 02; + 106E : A4; + 106F : 5D; + 1070 : 90; + 1071 : 01; + 1072 : C8; + 1073 : 85; + 1074 : 44; + 1075 : 84; + 1076 : 45; + 1077 : 60; + 1078 : A5; + 1079 : 05; + 107A : 0A; + 107B : 69; + 107C : 05; + 107D : 65; + 107E : 5C; + 107F : A4; + 1080 : 5D; + 1081 : 90; + 1082 : 01; + 1083 : C8; + 1084 : 85; + 1085 : 55; + 1086 : 84; + 1087 : 56; + 1088 : 60; + 1089 : 90; + 108A : 80; + [108B..108C] : 00; + 108D : 20; + 108E : 70; + 108F : 00; + 1090 : 20; + 1091 : 9F; + 1092 : CC; + 1093 : 20; + 1094 : 8E; + 1095 : CC; + 1096 : A5; + 1097 : 63; + 1098 : 30; + 1099 : 0D; + 109A : A5; + 109B : 5E; + 109C : C9; + [109D..109E] : 90; + 109F : 09; + 10A0 : A9; + 10A1 : 89; + 10A2 : A0; + 10A3 : D0; + 10A4 : 20; + 10A5 : 67; + 10A6 : DB; + 10A7 : D0; + 10A8 : 7A; + 10A9 : 4C; + 10AA : A7; + 10AB : DB; + 10AC : A5; + 10AD : 06; + 10AE : 05; + 10AF : 08; + 10B0 : 48; + 10B1 : A5; + 10B2 : 07; + 10B3 : 48; + 10B4 : A0; + 10B5 : 00; + 10B6 : 98; + 10B7 : 48; + 10B8 : A5; + 10B9 : 43; + 10BA : 48; + 10BB : A5; + 10BC : 42; + 10BD : 48; + 10BE : 20; + 10BF : 8D; + 10C0 : D0; + 10C1 : 68; + 10C2 : 85; + 10C3 : 42; + 10C4 : 68; + 10C5 : 85; + 10C6 : 43; + 10C7 : 68; + 10C8 : A8; + 10C9 : BA; + 10CA : BD; + 10CB : 02; + 10CC : 01; + 10CD : 48; + 10CE : BD; + [10CF..10D0] : 01; + 10D1 : 48; + 10D2 : A5; + 10D3 : 61; + 10D4 : 9D; + 10D5 : 02; + 10D6 : 01; + 10D7 : A5; + 10D8 : 62; + 10D9 : 9D; + [10DA..10DB] : 01; + 10DC : C8; + 10DD : 20; + 10DE : 76; + 10DF : 00; + 10E0 : C9; + 10E1 : 2C; + 10E2 : F0; + 10E3 : D2; + 10E4 : 84; + 10E5 : 05; + 10E6 : 20; + 10E7 : F2; + 10E8 : CD; + 10E9 : 68; + 10EA : 85; + 10EB : 07; + 10EC : 68; + 10ED : 85; + 10EE : 08; + 10EF : 29; + 10F0 : 7F; + 10F1 : 85; + 10F2 : 06; + 10F3 : A6; + 10F4 : 2C; + 10F5 : A5; + 10F6 : 2D; + 10F7 : 86; + 10F8 : 5C; + 10F9 : 85; + 10FA : 5D; + 10FB : C5; + 10FC : 2F; + 10FD : D0; + 10FE : 04; + 10FF : E4; + 1100 : 2E; + 1101 : F0; + 1102 : 39; + 1103 : A0; + 1104 : 00; + 1105 : B1; + 1106 : 5C; + 1107 : C8; + 1108 : C5; + 1109 : 42; + 110A : D0; + 110B : 06; + 110C : A5; + 110D : 43; + 110E : D1; + 110F : 5C; + 1110 : F0; + 1111 : 16; + 1112 : C8; + 1113 : B1; + 1114 : 5C; + 1115 : 18; + 1116 : 65; + 1117 : 5C; + 1118 : AA; + 1119 : C8; + 111A : B1; + 111B : 5C; + 111C : 65; + 111D : 5D; + 111E : 90; + 111F : D7; + 1120 : A2; + 1121 : 6B; + 1122 : 2C; + 1123 : A2; + 1124 : 35; + 1125 : 4C; + 1126 : 57; + 1127 : C3; + 1128 : A2; + 1129 : 78; + 112A : A5; + 112B : 06; + 112C : D0; + 112D : F7; + 112E : 20; + 112F : 78; + 1130 : D0; + 1131 : A5; + 1132 : 05; + 1133 : A0; + 1134 : 04; + 1135 : D1; + 1136 : 5C; + 1137 : D0; + 1138 : E7; + 1139 : 4C; + 113A : C6; + 113B : D1; + 113C : 20; + 113D : 78; + 113E : D0; + 113F : 20; + 1140 : 28; + 1141 : C3; + 1142 : A9; + 1143 : 00; + 1144 : A8; + 1145 : 85; + 1146 : 6F; + 1147 : A2; + 1148 : 05; + 1149 : A5; + 114A : 42; + 114B : 91; + 114C : 5C; + 114D : 10; + 114E : 01; + 114F : CA; + 1150 : C8; + 1151 : A5; + 1152 : 43; + 1153 : 91; + 1154 : 5C; + 1155 : 10; + 1156 : 02; + [1157..1158] : CA; + 1159 : 86; + 115A : 6E; + 115B : A5; + 115C : 05; + [115D..115F] : C8; + 1160 : 91; + 1161 : 5C; + 1162 : A2; + 1163 : 0B; + 1164 : A9; + 1165 : 00; + 1166 : 24; + 1167 : 06; + 1168 : 50; + 1169 : 08; + 116A : 68; + 116B : 18; + 116C : 69; + 116D : 01; + 116E : AA; + 116F : 68; + 1170 : 69; + 1171 : 00; + 1172 : C8; + 1173 : 91; + 1174 : 5C; + 1175 : C8; + 1176 : 8A; + 1177 : 91; + 1178 : 5C; + 1179 : 20; + 117A : 28; + 117B : D2; + 117C : 86; + 117D : 6E; + 117E : 85; + 117F : 6F; + 1180 : A4; + 1181 : 1F; + 1182 : C6; + 1183 : 05; + 1184 : D0; + 1185 : DC; + 1186 : 65; + 1187 : 56; + 1188 : B0; + 1189 : 5D; + 118A : 85; + 118B : 56; + 118C : A8; + 118D : 8A; + 118E : 65; + 118F : 55; + 1190 : 90; + 1191 : 03; + 1192 : C8; + 1193 : F0; + 1194 : 52; + 1195 : 20; + 1196 : 28; + 1197 : C3; + 1198 : 85; + 1199 : 2E; + 119A : 84; + 119B : 2F; + 119C : A9; + 119D : 00; + 119E : E6; + 119F : 6F; + 11A0 : A4; + 11A1 : 6E; + 11A2 : F0; + 11A3 : 05; + 11A4 : 88; + 11A5 : 91; + 11A6 : 55; + 11A7 : D0; + 11A8 : FB; + 11A9 : C6; + 11AA : 56; + 11AB : C6; + 11AC : 6F; + 11AD : D0; + 11AE : F5; + 11AF : E6; + 11B0 : 56; + 11B1 : 38; + 11B2 : A5; + 11B3 : 2E; + 11B4 : E5; + 11B5 : 5C; + 11B6 : A0; + 11B7 : 02; + 11B8 : 91; + 11B9 : 5C; + 11BA : A5; + 11BB : 2F; + 11BC : C8; + 11BD : E5; + 11BE : 5D; + 11BF : 91; + 11C0 : 5C; + 11C1 : A5; + 11C2 : 06; + 11C3 : D0; + 11C4 : 62; + 11C5 : C8; + 11C6 : B1; + 11C7 : 5C; + 11C8 : 85; + 11C9 : 05; + 11CA : A9; + 11CB : 00; + 11CC : 85; + 11CD : 6E; + 11CE : 85; + 11CF : 6F; + 11D0 : C8; + 11D1 : 68; + 11D2 : AA; + 11D3 : 85; + 11D4 : 61; + 11D5 : 68; + 11D6 : 85; + 11D7 : 62; + 11D8 : D1; + 11D9 : 5C; + 11DA : 90; + 11DB : 0E; + 11DC : D0; + 11DD : 06; + 11DE : C8; + 11DF : 8A; + 11E0 : D1; + 11E1 : 5C; + 11E2 : 90; + 11E3 : 07; + 11E4 : 4C; + 11E5 : 20; + 11E6 : D1; + 11E7 : 4C; + 11E8 : 55; + 11E9 : C3; + 11EA : C8; + 11EB : A5; + 11EC : 6F; + 11ED : 05; + 11EE : 6E; + 11EF : 18; + 11F0 : F0; + 11F1 : 0A; + 11F2 : 20; + 11F3 : 28; + 11F4 : D2; + 11F5 : 8A; + 11F6 : 65; + 11F7 : 61; + 11F8 : AA; + 11F9 : 98; + 11FA : A4; + 11FB : 1F; + 11FC : 65; + 11FD : 62; + 11FE : 86; + 11FF : 6E; + 1200 : C6; + 1201 : 05; + 1202 : D0; + 1203 : CA; + 1204 : 85; + 1205 : 6F; + 1206 : A2; + 1207 : 05; + 1208 : A5; + 1209 : 42; + 120A : 10; + 120B : 01; + 120C : CA; + 120D : A5; + 120E : 43; + 120F : 10; + 1210 : 02; + [1211..1212] : CA; + 1213 : 86; + 1214 : 25; + 1215 : A9; + 1216 : 00; + 1217 : 20; + 1218 : 31; + 1219 : D2; + 121A : 8A; + 121B : 65; + 121C : 55; + 121D : 85; + 121E : 44; + 121F : 98; + 1220 : 65; + 1221 : 56; + 1222 : 85; + 1223 : 45; + 1224 : A8; + 1225 : A5; + 1226 : 44; + 1227 : 60; + 1228 : 84; + 1229 : 1F; + 122A : B1; + 122B : 5C; + 122C : 85; + 122D : 25; + 122E : 88; + 122F : B1; + 1230 : 5C; + 1231 : 85; + 1232 : 26; + 1233 : A9; + 1234 : 10; + 1235 : 85; + 1236 : 5A; + 1237 : A2; + 1238 : 00; + 1239 : A0; + 123A : 00; + 123B : 8A; + 123C : 0A; + 123D : AA; + 123E : 98; + 123F : 2A; + 1240 : A8; + 1241 : B0; + 1242 : A4; + 1243 : 06; + 1244 : 6E; + 1245 : 26; + 1246 : 6F; + 1247 : 90; + 1248 : 0B; + 1249 : 18; + 124A : 8A; + 124B : 65; + 124C : 25; + 124D : AA; + 124E : 98; + 124F : 65; + 1250 : 26; + 1251 : A8; + 1252 : B0; + 1253 : 93; + 1254 : C6; + 1255 : 5A; + 1256 : D0; + 1257 : E3; + 1258 : 60; + 1259 : A5; + 125A : 07; + 125B : F0; + 125C : 03; + 125D : 20; + 125E : 80; + 125F : D5; + 1260 : 20; + 1261 : 00; + 1262 : D4; + 1263 : 38; + 1264 : A5; + 1265 : 30; + 1266 : E5; + 1267 : 2E; + 1268 : A8; + 1269 : A5; + 126A : 31; + 126B : E5; + 126C : 2F; + 126D : A2; + 126E : 00; + 126F : 86; + 1270 : 07; + 1271 : 85; + 1272 : 5F; + 1273 : 84; + 1274 : 60; + 1275 : A2; + 1276 : 90; + 1277 : 4C; + 1278 : 50; + 1279 : DB; + 127A : A4; + 127B : C6; + 127C : A9; + 127D : 00; + 127E : F0; + 127F : ED; + 1280 : A6; + 1281 : 37; + 1282 : E8; + 1283 : D0; + [1284..1285] : A2; + 1286 : 95; + 1287 : 2C; + 1288 : A2; + 1289 : E9; + 128A : 4C; + 128B : 57; + 128C : C3; + 128D : 20; + 128E : BB; + 128F : D2; + 1290 : 20; + 1291 : 80; + 1292 : D2; + 1293 : 20; + 1294 : F5; + 1295 : CD; + 1296 : A9; + 1297 : 80; + 1298 : 85; + 1299 : 0A; + 129A : 20; + 129B : 6D; + 129C : CF; + 129D : 20; + 129E : 8E; + 129F : CC; + 12A0 : 20; + 12A1 : F2; + 12A2 : CD; + 12A3 : A9; + 12A4 : B2; + 12A5 : 20; + 12A6 : FA; + 12A7 : CD; + 12A8 : 48; + 12A9 : A5; + 12AA : 45; + 12AB : 48; + 12AC : A5; + 12AD : 44; + 12AE : 48; + 12AF : A5; + 12B0 : 78; + 12B1 : 48; + 12B2 : A5; + 12B3 : 77; + 12B4 : 48; + 12B5 : 20; + 12B6 : 00; + 12B7 : C8; + 12B8 : 4C; + 12B9 : 29; + 12BA : D3; + 12BB : A9; + 12BC : A5; + 12BD : 20; + 12BE : FA; + 12BF : CD; + 12C0 : 09; + 12C1 : 80; + 12C2 : 85; + 12C3 : 0A; + 12C4 : 20; + 12C5 : 74; + 12C6 : CF; + 12C7 : 85; + 12C8 : 4B; + 12C9 : 84; + [12CA..12CB] : 4C; + 12CC : 8E; + 12CD : CC; + 12CE : 20; + 12CF : BB; + 12D0 : D2; + 12D1 : A5; + 12D2 : 4C; + 12D3 : 48; + 12D4 : A5; + 12D5 : 4B; + 12D6 : 48; + 12D7 : 20; + 12D8 : EC; + 12D9 : CD; + 12DA : 20; + 12DB : 8E; + 12DC : CC; + 12DD : 68; + 12DE : 85; + 12DF : 4B; + 12E0 : 68; + 12E1 : 85; + 12E2 : 4C; + 12E3 : A0; + 12E4 : 02; + 12E5 : B1; + 12E6 : 4B; + 12E7 : 85; + 12E8 : 44; + 12E9 : AA; + 12EA : C8; + 12EB : B1; + 12EC : 4B; + 12ED : F0; + 12EE : 99; + 12EF : 85; + 12F0 : 45; + 12F1 : C8; + 12F2 : B1; + 12F3 : 44; + 12F4 : 48; + 12F5 : 88; + 12F6 : 10; + 12F7 : FA; + 12F8 : A4; + 12F9 : 45; + 12FA : 20; + 12FB : E0; + 12FC : DA; + 12FD : A5; + 12FE : 78; + 12FF : 48; + 1300 : A5; + 1301 : 77; + 1302 : 48; + 1303 : B1; + 1304 : 4B; + 1305 : 85; + 1306 : 77; + 1307 : C8; + 1308 : B1; + 1309 : 4B; + 130A : 85; + 130B : 78; + 130C : A5; + 130D : 45; + 130E : 48; + 130F : A5; + 1310 : 44; + 1311 : 48; + 1312 : 20; + 1313 : 8B; + 1314 : CC; + 1315 : 68; + 1316 : 85; + 1317 : 4B; + 1318 : 68; + 1319 : 85; + 131A : 4C; + 131B : 20; + 131C : 76; + 131D : 00; + 131E : F0; + 131F : 03; + 1320 : 4C; + 1321 : 03; + 1322 : CE; + 1323 : 68; + 1324 : 85; + 1325 : 77; + 1326 : 68; + 1327 : 85; + 1328 : 78; + 1329 : A0; + 132A : 00; + 132B : 68; + 132C : 91; + 132D : 4B; + 132E : 68; + 132F : C8; + 1330 : 91; + 1331 : 4B; + 1332 : 68; + 1333 : C8; + 1334 : 91; + 1335 : 4B; + 1336 : 68; + 1337 : C8; + 1338 : 91; + 1339 : 4B; + 133A : 68; + 133B : C8; + 133C : 91; + 133D : 4B; + 133E : 60; + 133F : 20; + 1340 : 8E; + 1341 : CC; + 1342 : A0; + 1343 : 00; + 1344 : 20; + 1345 : EB; + 1346 : DC; + [1347..1348] : 68; + 1349 : A9; + 134A : FF; + 134B : A0; + 134C : 00; + 134D : F0; + 134E : 12; + 134F : A6; + 1350 : 61; + 1351 : A4; + 1352 : 62; + 1353 : 86; + 1354 : 4D; + 1355 : 84; + 1356 : 4E; + 1357 : 20; + 1358 : CE; + 1359 : D3; + 135A : 86; + 135B : 5F; + 135C : 84; + 135D : 60; + 135E : 85; + 135F : 5E; + 1360 : 60; + 1361 : A2; + 1362 : 22; + 1363 : 86; + 1364 : 03; + 1365 : 86; + 1366 : 04; + 1367 : 85; + 1368 : 6C; + 1369 : 84; + 136A : 6D; + 136B : 85; + 136C : 5F; + 136D : 84; + 136E : 60; + 136F : A0; + 1370 : FF; + 1371 : C8; + 1372 : B1; + 1373 : 6C; + 1374 : F0; + 1375 : 0C; + 1376 : C5; + 1377 : 03; + 1378 : F0; + 1379 : 04; + 137A : C5; + 137B : 04; + 137C : D0; + 137D : F3; + 137E : C9; + 137F : 22; + 1380 : F0; + 1381 : 01; + 1382 : 18; + 1383 : 84; + 1384 : 5E; + 1385 : 98; + 1386 : 65; + 1387 : 6C; + 1388 : 85; + 1389 : 6E; + 138A : A6; + 138B : 6D; + 138C : 90; + 138D : 01; + 138E : E8; + 138F : 86; + 1390 : 6F; + 1391 : A5; + 1392 : 6D; + 1393 : F0; + 1394 : 04; + 1395 : C9; + 1396 : 02; + 1397 : D0; + 1398 : 0B; + 1399 : 98; + 139A : 20; + 139B : 4F; + 139C : D3; + 139D : A6; + 139E : 6C; + 139F : A4; + 13A0 : 6D; + 13A1 : 20; + 13A2 : 62; + 13A3 : D5; + 13A4 : A6; + 13A5 : 13; + 13A6 : E0; + 13A7 : 1F; + 13A8 : D0; + 13A9 : 05; + 13AA : A2; + 13AB : C8; + 13AC : 4C; + 13AD : 57; + 13AE : C3; + 13AF : A5; + 13B0 : 5E; + 13B1 : 95; + 13B2 : 00; + 13B3 : A5; + 13B4 : 5F; + 13B5 : 95; + 13B6 : 01; + 13B7 : A5; + 13B8 : 60; + 13B9 : 95; + 13BA : 02; + 13BB : A0; + 13BC : 00; + 13BD : 86; + 13BE : 61; + 13BF : 84; + 13C0 : 62; + 13C1 : 84; + 13C2 : 6D; + 13C3 : 88; + 13C4 : 84; + 13C5 : 07; + 13C6 : 86; + 13C7 : 14; + [13C8..13CA] : E8; + 13CB : 86; + 13CC : 13; + 13CD : 60; + 13CE : 46; + 13CF : 09; + 13D0 : 48; + 13D1 : 49; + 13D2 : FF; + 13D3 : 38; + 13D4 : 65; + 13D5 : 30; + 13D6 : A4; + 13D7 : 31; + 13D8 : B0; + 13D9 : 01; + 13DA : 88; + 13DB : C4; + 13DC : 2F; + 13DD : 90; + 13DE : 11; + 13DF : D0; + 13E0 : 04; + 13E1 : C5; + 13E2 : 2E; + 13E3 : 90; + 13E4 : 0B; + 13E5 : 85; + 13E6 : 30; + 13E7 : 84; + 13E8 : 31; + 13E9 : 85; + 13EA : 32; + 13EB : 84; + 13EC : 33; + 13ED : AA; + 13EE : 68; + 13EF : 60; + 13F0 : A2; + 13F1 : 4D; + 13F2 : A5; + 13F3 : 09; + 13F4 : 30; + 13F5 : B6; + 13F6 : 20; + 13F7 : 00; + 13F8 : D4; + 13F9 : A9; + 13FA : 80; + 13FB : 85; + 13FC : 09; + 13FD : 68; + [13FE..13FF] : D0; + 1400 : A6; + 1401 : 34; + 1402 : A5; + 1403 : 35; + 1404 : 86; + 1405 : 30; + 1406 : 85; + 1407 : 31; + 1408 : A0; + 1409 : 00; + 140A : 84; + 140B : 4C; + 140C : 84; + 140D : 4B; + 140E : A5; + 140F : 2E; + 1410 : A6; + 1411 : 2F; + 1412 : 85; + 1413 : 5C; + 1414 : 86; + 1415 : 5D; + 1416 : A9; + 1417 : 16; + 1418 : A2; + 1419 : 00; + 141A : 85; + 141B : 1F; + 141C : 86; + 141D : 20; + 141E : C5; + 141F : 13; + 1420 : F0; + 1421 : 05; + 1422 : 20; + 1423 : A1; + 1424 : D4; + 1425 : F0; + 1426 : F7; + 1427 : A9; + 1428 : 07; + 1429 : 85; + 142A : 50; + 142B : A5; + 142C : 2A; + 142D : A6; + 142E : 2B; + 142F : 85; + 1430 : 1F; + 1431 : 86; + 1432 : 20; + 1433 : E4; + 1434 : 2D; + 1435 : D0; + 1436 : 04; + 1437 : C5; + 1438 : 2C; + 1439 : F0; + 143A : 05; + 143B : 20; + 143C : 97; + 143D : D4; + 143E : F0; + 143F : F3; + 1440 : 85; + 1441 : 55; + 1442 : 86; + 1443 : 56; + 1444 : A9; + 1445 : 03; + 1446 : 85; + 1447 : 50; + 1448 : A5; + 1449 : 55; + 144A : A6; + 144B : 56; + 144C : E4; + 144D : 2F; + 144E : D0; + 144F : 07; + 1450 : C5; + 1451 : 2E; + 1452 : D0; + 1453 : 03; + 1454 : 4C; + 1455 : E0; + 1456 : D4; + 1457 : 85; + 1458 : 1F; + 1459 : 86; + 145A : 20; + 145B : A0; + 145C : 00; + 145D : B1; + 145E : 1F; + 145F : AA; + 1460 : C8; + 1461 : B1; + 1462 : 1F; + 1463 : 08; + 1464 : C8; + 1465 : B1; + 1466 : 1F; + 1467 : 65; + 1468 : 55; + 1469 : 85; + 146A : 55; + 146B : C8; + 146C : B1; + 146D : 1F; + 146E : 65; + 146F : 56; + 1470 : 85; + 1471 : 56; + 1472 : 28; + 1473 : 10; + 1474 : D3; + 1475 : 8A; + 1476 : 30; + 1477 : D0; + 1478 : C8; + 1479 : B1; + 147A : 1F; + 147B : A0; + 147C : 00; + 147D : 0A; + 147E : 69; + 147F : 05; + 1480 : 65; + 1481 : 1F; + 1482 : 85; + 1483 : 1F; + 1484 : 90; + 1485 : 02; + 1486 : E6; + 1487 : 20; + 1488 : A6; + 1489 : 20; + 148A : E4; + 148B : 56; + 148C : D0; + 148D : 04; + 148E : C5; + 148F : 55; + 1490 : F0; + 1491 : BA; + 1492 : 20; + 1493 : A1; + 1494 : D4; + 1495 : F0; + 1496 : F3; + 1497 : B1; + 1498 : 1F; + 1499 : 30; + 149A : 35; + 149B : C8; + 149C : B1; + 149D : 1F; + 149E : 10; + 149F : 30; + 14A0 : C8; + 14A1 : B1; + 14A2 : 1F; + 14A3 : F0; + 14A4 : 2B; + 14A5 : C8; + 14A6 : B1; + 14A7 : 1F; + 14A8 : AA; + 14A9 : C8; + 14AA : B1; + 14AB : 1F; + 14AC : C5; + 14AD : 31; + 14AE : 90; + 14AF : 06; + 14B0 : D0; + 14B1 : 1E; + 14B2 : E4; + 14B3 : 30; + 14B4 : B0; + 14B5 : 1A; + 14B6 : C5; + 14B7 : 5D; + 14B8 : 90; + 14B9 : 16; + 14BA : D0; + 14BB : 04; + 14BC : E4; + 14BD : 5C; + 14BE : 90; + 14BF : 10; + 14C0 : 86; + 14C1 : 5C; + 14C2 : 85; + 14C3 : 5D; + 14C4 : A5; + 14C5 : 1F; + 14C6 : A6; + 14C7 : 20; + 14C8 : 85; + 14C9 : 4B; + 14CA : 86; + 14CB : 4C; + 14CC : A5; + 14CD : 50; + 14CE : 85; + 14CF : 52; + 14D0 : A5; + 14D1 : 50; + 14D2 : 18; + 14D3 : 65; + 14D4 : 1F; + 14D5 : 85; + 14D6 : 1F; + 14D7 : 90; + 14D8 : 02; + 14D9 : E6; + 14DA : 20; + 14DB : A6; + 14DC : 20; + 14DD : A0; + 14DE : 00; + 14DF : 60; + 14E0 : A5; + 14E1 : 4C; + 14E2 : 05; + 14E3 : 4B; + 14E4 : F0; + 14E5 : F5; + 14E6 : A5; + 14E7 : 52; + 14E8 : 29; + 14E9 : 04; + 14EA : 4A; + 14EB : A8; + 14EC : 85; + 14ED : 52; + 14EE : B1; + 14EF : 4B; + 14F0 : 65; + 14F1 : 5C; + 14F2 : 85; + 14F3 : 57; + 14F4 : A5; + 14F5 : 5D; + 14F6 : 69; + 14F7 : 00; + 14F8 : 85; + 14F9 : 58; + 14FA : A5; + 14FB : 30; + 14FC : A6; + 14FD : 31; + 14FE : 85; + 14FF : 55; + 1500 : 86; + 1501 : 56; + 1502 : 20; + 1503 : DF; + 1504 : C2; + 1505 : A4; + 1506 : 52; + 1507 : C8; + 1508 : A5; + 1509 : 55; + 150A : 91; + 150B : 4B; + 150C : AA; + 150D : E6; + 150E : 56; + 150F : A5; + 1510 : 56; + 1511 : C8; + 1512 : 91; + 1513 : 4B; + 1514 : 4C; + 1515 : 04; + 1516 : D4; + 1517 : A5; + 1518 : 62; + 1519 : 48; + 151A : A5; + 151B : 61; + 151C : 48; + 151D : 20; + 151E : 84; + 151F : CD; + 1520 : 20; + 1521 : 90; + 1522 : CC; + 1523 : 68; + 1524 : 85; + 1525 : 6C; + 1526 : 68; + 1527 : 85; + 1528 : 6D; + 1529 : A0; + 152A : 00; + 152B : B1; + 152C : 6C; + 152D : 18; + 152E : 71; + 152F : 61; + 1530 : 90; + 1531 : 05; + 1532 : A2; + 1533 : B0; + 1534 : 4C; + 1535 : 57; + 1536 : C3; + 1537 : 20; + 1538 : 4F; + 1539 : D3; + 153A : 20; + 153B : 54; + 153C : D5; + 153D : A5; + 153E : 4D; + 153F : A4; + 1540 : 4E; + 1541 : 20; + 1542 : 84; + 1543 : D5; + 1544 : 20; + 1545 : 66; + 1546 : D5; + 1547 : A5; + 1548 : 6C; + 1549 : A4; + 154A : 6D; + 154B : 20; + 154C : 84; + 154D : D5; + 154E : 20; + 154F : A4; + 1550 : D3; + 1551 : 4C; + 1552 : B9; + 1553 : CC; + 1554 : A0; + 1555 : 00; + 1556 : B1; + 1557 : 6C; + 1558 : 48; + 1559 : C8; + 155A : B1; + 155B : 6C; + 155C : AA; + 155D : C8; + 155E : B1; + 155F : 6C; + 1560 : A8; + 1561 : 68; + 1562 : 86; + 1563 : 1F; + 1564 : 84; + 1565 : 20; + 1566 : A8; + 1567 : F0; + 1568 : 0A; + 1569 : 48; + 156A : 88; + 156B : B1; + 156C : 1F; + 156D : 91; + 156E : 32; + 156F : 98; + 1570 : D0; + 1571 : F8; + 1572 : 68; + 1573 : 18; + 1574 : 65; + 1575 : 32; + 1576 : 85; + 1577 : 32; + 1578 : 90; + 1579 : 02; + 157A : E6; + 157B : 33; + 157C : 60; + 157D : 20; + 157E : 90; + 157F : CC; + 1580 : A5; + 1581 : 61; + 1582 : A4; + 1583 : 62; + 1584 : 85; + 1585 : 1F; + 1586 : 84; + [1587..1588] : 20; + 1589 : B5; + 158A : D5; + 158B : 08; + 158C : A0; + 158D : 00; + 158E : B1; + 158F : 1F; + 1590 : 48; + 1591 : C8; + 1592 : B1; + 1593 : 1F; + 1594 : AA; + 1595 : C8; + 1596 : B1; + 1597 : 1F; + 1598 : A8; + 1599 : 68; + 159A : 28; + 159B : D0; + 159C : 13; + 159D : C4; + 159E : 31; + 159F : D0; + 15A0 : 0F; + 15A1 : E4; + 15A2 : 30; + 15A3 : D0; + 15A4 : 0B; + 15A5 : 48; + 15A6 : 18; + 15A7 : 65; + 15A8 : 30; + 15A9 : 85; + 15AA : 30; + 15AB : 90; + 15AC : 02; + 15AD : E6; + 15AE : 31; + 15AF : 68; + 15B0 : 86; + 15B1 : 1F; + 15B2 : 84; + 15B3 : 20; + 15B4 : 60; + 15B5 : C4; + 15B6 : 15; + 15B7 : D0; + 15B8 : 0C; + 15B9 : C5; + 15BA : 14; + 15BB : D0; + 15BC : 08; + 15BD : 85; + 15BE : 13; + 15BF : E9; + 15C0 : 03; + 15C1 : 85; + 15C2 : 14; + 15C3 : A0; + 15C4 : 00; + 15C5 : 60; + 15C6 : 20; + 15C7 : 7B; + 15C8 : D6; + 15C9 : 8A; + 15CA : 48; + 15CB : A9; + 15CC : 01; + 15CD : 20; + 15CE : 57; + 15CF : D3; + 15D0 : 68; + 15D1 : A0; + 15D2 : 00; + 15D3 : 91; + 15D4 : 5F; + [15D5..15D6] : 68; + 15D7 : 4C; + 15D8 : A4; + 15D9 : D3; + 15DA : 20; + 15DB : 3B; + 15DC : D6; + 15DD : D1; + 15DE : 4D; + 15DF : 98; + 15E0 : 90; + 15E1 : 04; + 15E2 : B1; + 15E3 : 4D; + 15E4 : AA; + 15E5 : 98; + 15E6 : 48; + 15E7 : 8A; + 15E8 : 48; + 15E9 : 20; + 15EA : 57; + 15EB : D3; + 15EC : A5; + 15ED : 4D; + 15EE : A4; + 15EF : 4E; + 15F0 : 20; + 15F1 : 84; + 15F2 : D5; + 15F3 : 68; + 15F4 : A8; + 15F5 : 68; + 15F6 : 18; + 15F7 : 65; + 15F8 : 1F; + 15F9 : 85; + 15FA : 1F; + 15FB : 90; + 15FC : 02; + 15FD : E6; + 15FE : 20; + 15FF : 98; + 1600 : 20; + 1601 : 66; + 1602 : D5; + 1603 : 4C; + 1604 : A4; + 1605 : D3; + 1606 : 20; + 1607 : 3B; + 1608 : D6; + 1609 : 18; + 160A : F1; + 160B : 4D; + 160C : 49; + 160D : FF; + 160E : 4C; + 160F : E0; + 1610 : D5; + 1611 : A9; + 1612 : FF; + 1613 : 85; + 1614 : 62; + 1615 : 20; + 1616 : 76; + 1617 : 00; + 1618 : C9; + 1619 : 29; + 161A : F0; + 161B : 06; + 161C : 20; + 161D : F8; + 161E : CD; + 161F : 20; + 1620 : 78; + 1621 : D6; + 1622 : 20; + 1623 : 3B; + 1624 : D6; + 1625 : F0; + 1626 : 4B; + 1627 : CA; + 1628 : 8A; + 1629 : 48; + 162A : 18; + 162B : A2; + 162C : 00; + 162D : F1; + 162E : 4D; + 162F : B0; + 1630 : B6; + 1631 : 49; + 1632 : FF; + 1633 : C5; + 1634 : 62; + 1635 : 90; + 1636 : B1; + 1637 : A5; + 1638 : 62; + 1639 : B0; + 163A : AD; + 163B : 20; + 163C : F2; + 163D : CD; + 163E : 68; + 163F : A8; + 1640 : 68; + 1641 : 85; + 1642 : 52; + [1643..1645] : 68; + 1646 : AA; + 1647 : 68; + 1648 : 85; + 1649 : 4D; + 164A : 68; + 164B : 85; + 164C : 4E; + 164D : A5; + 164E : 52; + 164F : 48; + 1650 : 98; + 1651 : 48; + 1652 : A0; + 1653 : 00; + 1654 : 8A; + 1655 : 60; + 1656 : 20; + 1657 : 5C; + 1658 : D6; + 1659 : 4C; + 165A : 7C; + 165B : D2; + 165C : 20; + 165D : 7D; + 165E : D5; + 165F : A2; + 1660 : 00; + 1661 : 86; + 1662 : 07; + 1663 : A8; + 1664 : 60; + 1665 : 20; + 1666 : 5C; + 1667 : D6; + 1668 : F0; + 1669 : 08; + 166A : A0; + 166B : 00; + 166C : B1; + 166D : 1F; + 166E : A8; + 166F : 4C; + 1670 : 7C; + 1671 : D2; + 1672 : 4C; + 1673 : 23; + 1674 : D1; + 1675 : 20; + 1676 : 70; + 1677 : 00; + 1678 : 20; + 1679 : 8B; + 167A : CC; + 167B : 20; + 167C : 93; + 167D : D0; + 167E : A6; + 167F : 61; + 1680 : D0; + 1681 : F0; + 1682 : A6; + 1683 : 62; + 1684 : 4C; + 1685 : 76; + 1686 : 00; + 1687 : 20; + 1688 : 5C; + 1689 : D6; + 168A : D0; + 168B : 03; + 168C : 4C; + 168D : 03; + 168E : D8; + 168F : A6; + 1690 : 77; + 1691 : A4; + 1692 : 78; + 1693 : 86; + 1694 : 6E; + 1695 : 84; + 1696 : 6F; + 1697 : A6; + 1698 : 1F; + 1699 : 86; + 169A : 77; + 169B : 18; + 169C : 65; + 169D : 1F; + 169E : 85; + 169F : 21; + 16A0 : A6; + 16A1 : 20; + 16A2 : 86; + 16A3 : 78; + 16A4 : 90; + 16A5 : 01; + 16A6 : E8; + 16A7 : 86; + 16A8 : 22; + 16A9 : A0; + 16AA : 00; + 16AB : B1; + 16AC : 21; + 16AD : 48; + 16AE : A9; + 16AF : 00; + 16B0 : 91; + 16B1 : 21; + 16B2 : 20; + 16B3 : 76; + 16B4 : 00; + 16B5 : 20; + 16B6 : FF; + 16B7 : DB; + 16B8 : 68; + 16B9 : A0; + 16BA : 00; + 16BB : 91; + 16BC : 21; + 16BD : A6; + 16BE : 6E; + 16BF : A4; + 16C0 : 6F; + 16C1 : 86; + 16C2 : 77; + 16C3 : 84; + 16C4 : 78; + 16C5 : 60; + 16C6 : 20; + 16C7 : 8B; + 16C8 : CC; + 16C9 : 20; + 16CA : D2; + 16CB : D6; + 16CC : 20; + 16CD : F8; + 16CE : CD; + 16CF : 4C; + 16D0 : 78; + 16D1 : D6; + 16D2 : A5; + 16D3 : 63; + 16D4 : 30; + 16D5 : 9C; + 16D6 : A5; + 16D7 : 5E; + 16D8 : C9; + 16D9 : 91; + 16DA : B0; + 16DB : 96; + 16DC : 20; + 16DD : A7; + 16DE : DB; + 16DF : A5; + 16E0 : 61; + 16E1 : A4; + 16E2 : 62; + 16E3 : 84; + 16E4 : 11; + 16E5 : 85; + 16E6 : 12; + 16E7 : 60; + 16E8 : A5; + 16E9 : 12; + 16EA : 48; + 16EB : A5; + 16EC : 11; + 16ED : 48; + 16EE : 20; + 16EF : D2; + 16F0 : D6; + 16F1 : A0; + 16F2 : 00; + [16F3..16FA] : EA; + 16FB : B1; + 16FC : 11; + 16FD : A8; + 16FE : 68; + 16FF : 85; + 1700 : 11; + 1701 : 68; + 1702 : 85; + 1703 : 12; + 1704 : 4C; + 1705 : 7C; + 1706 : D2; + 1707 : 20; + 1708 : C6; + 1709 : D6; + 170A : 8A; + 170B : A0; + 170C : 00; + 170D : 91; + 170E : 11; + 170F : 60; + 1710 : 20; + 1711 : C6; + 1712 : D6; + 1713 : 86; + 1714 : 46; + 1715 : A2; + 1716 : 00; + 1717 : 20; + 1718 : 76; + 1719 : 00; + 171A : F0; + 171B : 29; + 171C : 20; + 171D : CC; + 171E : D6; + 171F : 86; + 1720 : 47; + 1721 : A0; + 1722 : 00; + 1723 : B1; + 1724 : 11; + 1725 : 45; + 1726 : 47; + 1727 : 25; + 1728 : 46; + 1729 : F0; + 172A : F8; + 172B : 60; + 172C : A9; + 172D : 1D; + 172E : A0; + 172F : DE; + 1730 : 4C; + 1731 : 73; + 1732 : D7; + 1733 : 20; + 1734 : 98; + 1735 : D9; + 1736 : A5; + 1737 : 63; + 1738 : 49; + 1739 : FF; + 173A : 85; + 173B : 63; + 173C : 45; + 173D : 6B; + 173E : 85; + 173F : 6C; + 1740 : A5; + 1741 : 5E; + 1742 : 4C; + 1743 : 76; + 1744 : D7; + 1745 : A5; + 1746 : 11; + 1747 : C9; + 1748 : 66; + 1749 : D0; + 174A : D4; + 174B : A5; + 174C : 12; + 174D : E9; + 174E : 19; + 174F : D0; + 1750 : CE; + 1751 : 85; + 1752 : 11; + 1753 : A8; + 1754 : A9; + 1755 : 80; + 1756 : 85; + 1757 : 12; + 1758 : A2; + 1759 : 0A; + 175A : BD; + 175B : 81; + 175C : E0; + 175D : 29; + 175E : 3F; + 175F : 91; + 1760 : 11; + 1761 : C8; + 1762 : D0; + 1763 : 02; + 1764 : E6; + 1765 : 12; + 1766 : CA; + 1767 : D0; + 1768 : F1; + 1769 : C6; + 176A : 46; + 176B : D0; + 176C : EB; + 176D : 60; + 176E : 20; + 176F : A5; + 1770 : D8; + 1771 : 90; + 1772 : 3C; + 1773 : 20; + 1774 : 98; + 1775 : D9; + 1776 : D0; + 1777 : 03; + 1778 : 4C; + 1779 : 08; + 177A : DB; + 177B : A6; + 177C : 6D; + 177D : 86; + 177E : 53; + 177F : A2; + 1780 : 66; + 1781 : A5; + 1782 : 66; + 1783 : A8; + 1784 : F0; + 1785 : A5; + 1786 : 38; + 1787 : E5; + 1788 : 5E; + 1789 : F0; + 178A : 24; + 178B : 90; + 178C : 12; + 178D : 84; + 178E : 5E; + 178F : A4; + 1790 : 6B; + 1791 : 84; + 1792 : 63; + 1793 : 49; + 1794 : FF; + 1795 : 69; + 1796 : 00; + 1797 : A0; + 1798 : 00; + 1799 : 84; + 179A : 53; + 179B : A2; + 179C : 5E; + 179D : D0; + 179E : 04; + 179F : A0; + 17A0 : 00; + 17A1 : 84; + 17A2 : 6D; + 17A3 : C9; + 17A4 : F9; + 17A5 : 30; + 17A6 : C7; + 17A7 : A8; + 17A8 : A5; + 17A9 : 6D; + 17AA : 56; + 17AB : 01; + 17AC : 20; + 17AD : BC; + 17AE : D8; + 17AF : 24; + 17B0 : 6C; + 17B1 : 10; + 17B2 : 57; + 17B3 : A0; + 17B4 : 5E; + 17B5 : E0; + 17B6 : 66; + 17B7 : F0; + 17B8 : 02; + 17B9 : A0; + 17BA : 66; + 17BB : 38; + 17BC : 49; + 17BD : FF; + 17BE : 65; + 17BF : 53; + 17C0 : 85; + 17C1 : 6D; + 17C2 : B9; + 17C3 : 04; + 17C4 : 00; + 17C5 : F5; + 17C6 : 04; + 17C7 : 85; + 17C8 : 62; + 17C9 : B9; + 17CA : 03; + 17CB : 00; + 17CC : F5; + 17CD : 03; + 17CE : 85; + 17CF : 61; + 17D0 : B9; + 17D1 : 02; + 17D2 : 00; + 17D3 : F5; + 17D4 : 02; + 17D5 : 85; + 17D6 : 60; + 17D7 : B9; + 17D8 : 01; + 17D9 : 00; + 17DA : F5; + 17DB : 01; + 17DC : 85; + 17DD : 5F; + 17DE : B0; + 17DF : 03; + 17E0 : 20; + 17E1 : 53; + 17E2 : D8; + 17E3 : A0; + 17E4 : 00; + 17E5 : 98; + 17E6 : 18; + 17E7 : A6; + 17E8 : 5F; + 17E9 : D0; + 17EA : 4A; + 17EB : A6; + 17EC : 60; + 17ED : 86; + 17EE : 5F; + 17EF : A6; + 17F0 : 61; + 17F1 : 86; + 17F2 : 60; + 17F3 : A6; + 17F4 : 62; + 17F5 : 86; + 17F6 : 61; + 17F7 : A6; + 17F8 : 6D; + 17F9 : 86; + 17FA : 62; + 17FB : 84; + 17FC : 6D; + 17FD : 69; + 17FE : 08; + 17FF : C9; + 1800 : 20; + 1801 : D0; + 1802 : E4; + 1803 : A9; + 1804 : 00; + 1805 : 85; + 1806 : 5E; + 1807 : 85; + 1808 : 63; + 1809 : 60; + 180A : 65; + 180B : 53; + 180C : 85; + 180D : 6D; + 180E : A5; + 180F : 62; + 1810 : 65; + 1811 : 6A; + 1812 : 85; + 1813 : 62; + 1814 : A5; + 1815 : 61; + 1816 : 65; + 1817 : 69; + 1818 : 85; + 1819 : 61; + 181A : A5; + 181B : 60; + 181C : 65; + 181D : 68; + 181E : 85; + 181F : 60; + 1820 : A5; + 1821 : 5F; + 1822 : 65; + 1823 : 67; + 1824 : 85; + 1825 : 5F; + 1826 : 4C; + 1827 : 42; + 1828 : D8; + 1829 : 69; + 182A : 01; + 182B : 06; + 182C : 6D; + 182D : 26; + 182E : 62; + 182F : 26; + 1830 : 61; + 1831 : 26; + 1832 : 60; + 1833 : 26; + 1834 : 5F; + 1835 : 10; + 1836 : F2; + 1837 : 38; + 1838 : E5; + 1839 : 5E; + 183A : B0; + 183B : C7; + 183C : 49; + 183D : FF; + 183E : 69; + 183F : 01; + 1840 : 85; + 1841 : 5E; + 1842 : 90; + 1843 : 0E; + 1844 : E6; + 1845 : 5E; + 1846 : F0; + 1847 : 42; + 1848 : 66; + 1849 : 5F; + 184A : 66; + 184B : 60; + 184C : 66; + 184D : 61; + 184E : 66; + 184F : 62; + 1850 : 66; + 1851 : 6D; + 1852 : 60; + 1853 : A5; + 1854 : 63; + 1855 : 49; + 1856 : FF; + 1857 : 85; + 1858 : 63; + 1859 : A5; + 185A : 5F; + 185B : 49; + 185C : FF; + 185D : 85; + 185E : 5F; + 185F : A5; + 1860 : 60; + 1861 : 49; + 1862 : FF; + 1863 : 85; + 1864 : 60; + 1865 : A5; + 1866 : 61; + 1867 : 49; + 1868 : FF; + 1869 : 85; + 186A : 61; + 186B : A5; + 186C : 62; + 186D : 49; + 186E : FF; + 186F : 85; + 1870 : 62; + 1871 : A5; + 1872 : 6D; + 1873 : 49; + 1874 : FF; + 1875 : 85; + 1876 : 6D; + 1877 : E6; + 1878 : 6D; + 1879 : D0; + 187A : 0E; + 187B : E6; + 187C : 62; + 187D : D0; + 187E : 0A; + 187F : E6; + 1880 : 61; + 1881 : D0; + 1882 : 06; + 1883 : E6; + 1884 : 60; + 1885 : D0; + 1886 : 02; + 1887 : E6; + 1888 : 5F; + 1889 : 60; + 188A : A2; + 188B : 45; + 188C : 4C; + 188D : 57; + 188E : C3; + 188F : A2; + 1890 : 22; + 1891 : B4; + 1892 : 04; + 1893 : 84; + 1894 : 6D; + 1895 : B4; + 1896 : 03; + 1897 : 94; + 1898 : 04; + 1899 : B4; + 189A : 02; + 189B : 94; + 189C : 03; + 189D : B4; + 189E : 01; + 189F : 94; + 18A0 : 02; + 18A1 : A4; + 18A2 : 65; + 18A3 : 94; + 18A4 : 01; + 18A5 : 69; + 18A6 : 08; + 18A7 : 30; + 18A8 : E8; + 18A9 : F0; + 18AA : E6; + 18AB : E9; + 18AC : 08; + 18AD : A8; + 18AE : A5; + 18AF : 6D; + 18B0 : B0; + 18B1 : 14; + 18B2 : 16; + 18B3 : 01; + 18B4 : 90; + 18B5 : 02; + 18B6 : F6; + 18B7 : 01; + 18B8 : 76; + 18B9 : 01; + 18BA : 76; + 18BB : 01; + 18BC : 76; + 18BD : 02; + 18BE : 76; + 18BF : 03; + 18C0 : 76; + 18C1 : 04; + 18C2 : 6A; + 18C3 : C8; + 18C4 : D0; + 18C5 : EC; + 18C6 : 18; + 18C7 : 60; + 18C8 : 81; + [18C9..18CC] : 00; + 18CD : 03; + 18CE : 7F; + 18CF : 5E; + 18D0 : 56; + 18D1 : CB; + 18D2 : 79; + 18D3 : 80; + 18D4 : 13; + 18D5 : 9B; + 18D6 : 0B; + 18D7 : 64; + 18D8 : 80; + 18D9 : 76; + 18DA : 38; + 18DB : 93; + 18DC : 16; + 18DD : 82; + 18DE : 38; + 18DF : AA; + 18E0 : 3B; + 18E1 : 20; + 18E2 : 80; + 18E3 : 35; + 18E4 : 04; + 18E5 : F3; + 18E6 : 34; + 18E7 : 81; + 18E8 : 35; + 18E9 : 04; + 18EA : F3; + 18EB : 34; + [18EC..18ED] : 80; + [18EE..18F0] : 00; + 18F1 : 80; + 18F2 : 31; + 18F3 : 72; + 18F4 : 17; + 18F5 : F8; + 18F6 : 20; + 18F7 : 37; + 18F8 : DB; + 18F9 : F0; + 18FA : 02; + 18FB : 10; + 18FC : 03; + 18FD : 4C; + 18FE : 23; + 18FF : D1; + 1900 : A5; + 1901 : 5E; + 1902 : E9; + 1903 : 7F; + 1904 : 48; + 1905 : A9; + 1906 : 80; + 1907 : 85; + 1908 : 5E; + 1909 : A9; + 190A : E2; + 190B : A0; + 190C : D8; + 190D : 20; + 190E : 73; + 190F : D7; + 1910 : A9; + 1911 : E7; + 1912 : A0; + 1913 : D8; + 1914 : 20; + 1915 : 1B; + 1916 : DA; + 1917 : A9; + 1918 : C8; + 1919 : A0; + 191A : D8; + 191B : 20; + 191C : 33; + 191D : D7; + 191E : A9; + 191F : CD; + 1920 : A0; + 1921 : D8; + 1922 : 20; + 1923 : 2D; + 1924 : DF; + 1925 : A9; + 1926 : EC; + 1927 : A0; + 1928 : D8; + 1929 : 20; + 192A : 73; + 192B : D7; + 192C : 68; + 192D : 20; + 192E : 8A; + 192F : DC; + 1930 : A9; + 1931 : F1; + 1932 : A0; + 1933 : D8; + 1934 : 20; + 1935 : 98; + 1936 : D9; + 1937 : D0; + 1938 : 03; + 1939 : 4C; + 193A : 97; + 193B : D9; + 193C : 20; + 193D : C3; + 193E : D9; + 193F : A9; + 1940 : 00; + 1941 : 85; + 1942 : 23; + 1943 : 85; + 1944 : 24; + 1945 : 85; + 1946 : 25; + 1947 : 85; + 1948 : 26; + 1949 : A5; + 194A : 6D; + 194B : 20; + 194C : 65; + 194D : D9; + 194E : A5; + 194F : 62; + 1950 : 20; + 1951 : 65; + 1952 : D9; + 1953 : A5; + 1954 : 61; + 1955 : 20; + 1956 : 65; + 1957 : D9; + 1958 : A5; + 1959 : 60; + 195A : 20; + 195B : 65; + 195C : D9; + 195D : A5; + 195E : 5F; + 195F : 20; + 1960 : 6A; + 1961 : D9; + 1962 : 4C; + 1963 : 9B; + 1964 : DA; + 1965 : D0; + 1966 : 03; + 1967 : 4C; + 1968 : 8F; + 1969 : D8; + 196A : 4A; + 196B : 09; + 196C : 80; + 196D : A8; + 196E : 90; + 196F : 19; + 1970 : 18; + 1971 : A5; + 1972 : 26; + 1973 : 65; + 1974 : 6A; + 1975 : 85; + 1976 : 26; + 1977 : A5; + 1978 : 25; + 1979 : 65; + 197A : 69; + 197B : 85; + 197C : 25; + 197D : A5; + 197E : 24; + 197F : 65; + 1980 : 68; + 1981 : 85; + 1982 : 24; + 1983 : A5; + 1984 : 23; + 1985 : 65; + 1986 : 67; + 1987 : 85; + 1988 : 23; + 1989 : 66; + 198A : 23; + 198B : 66; + 198C : 24; + 198D : 66; + 198E : 25; + 198F : 66; + 1990 : 26; + 1991 : 66; + 1992 : 6D; + 1993 : 98; + 1994 : 4A; + 1995 : D0; + 1996 : D6; + 1997 : 60; + 1998 : 85; + 1999 : 1F; + 199A : 84; + 199B : 20; + 199C : A0; + 199D : 04; + 199E : B1; + 199F : 1F; + 19A0 : 85; + 19A1 : 6A; + 19A2 : 88; + 19A3 : B1; + 19A4 : 1F; + 19A5 : 85; + 19A6 : 69; + 19A7 : 88; + 19A8 : B1; + 19A9 : 1F; + 19AA : 85; + 19AB : 68; + 19AC : 88; + 19AD : B1; + 19AE : 1F; + 19AF : 85; + 19B0 : 6B; + 19B1 : 45; + 19B2 : 63; + 19B3 : 85; + 19B4 : 6C; + 19B5 : A5; + 19B6 : 6B; + 19B7 : 09; + 19B8 : 80; + 19B9 : 85; + 19BA : 67; + 19BB : 88; + 19BC : B1; + 19BD : 1F; + 19BE : 85; + 19BF : 66; + 19C0 : A5; + 19C1 : 5E; + 19C2 : 60; + 19C3 : A5; + 19C4 : 66; + 19C5 : F0; + 19C6 : 1F; + 19C7 : 18; + 19C8 : 65; + 19C9 : 5E; + 19CA : 90; + 19CB : 04; + 19CC : 30; + 19CD : 1D; + 19CE : 18; + 19CF : 2C; + 19D0 : 10; + 19D1 : 14; + 19D2 : 69; + 19D3 : 80; + 19D4 : 85; + 19D5 : 5E; + 19D6 : D0; + 19D7 : 03; + 19D8 : 4C; + 19D9 : 07; + 19DA : D8; + 19DB : A5; + 19DC : 6C; + 19DD : 85; + 19DE : 63; + 19DF : 60; + 19E0 : A5; + 19E1 : 63; + 19E2 : 49; + 19E3 : FF; + 19E4 : 30; + 19E5 : 05; + [19E6..19E7] : 68; + 19E8 : 4C; + 19E9 : 03; + 19EA : D8; + 19EB : 4C; + 19EC : 8A; + 19ED : D8; + 19EE : 20; + 19EF : 18; + 19F0 : DB; + 19F1 : AA; + 19F2 : F0; + 19F3 : 10; + 19F4 : 18; + 19F5 : 69; + 19F6 : 02; + 19F7 : B0; + 19F8 : F2; + 19F9 : A2; + 19FA : 00; + 19FB : 86; + 19FC : 6C; + 19FD : 20; + 19FE : 83; + 19FF : D7; + 1A00 : E6; + 1A01 : 5E; + 1A02 : F0; + 1A03 : E7; + 1A04 : 60; + 1A05 : 84; + 1A06 : 20; + [1A07..1A09] : 00; + 1A0A : 20; + 1A0B : 18; + 1A0C : DB; + 1A0D : A9; + 1A0E : 05; + 1A0F : A0; + 1A10 : DA; + 1A11 : A2; + 1A12 : 00; + 1A13 : 86; + 1A14 : 6C; + 1A15 : 20; + 1A16 : AE; + 1A17 : DA; + 1A18 : 4C; + 1A19 : 1E; + 1A1A : DA; + 1A1B : 20; + 1A1C : 98; + 1A1D : D9; + 1A1E : F0; + 1A1F : 76; + 1A20 : 20; + 1A21 : 27; + 1A22 : DB; + 1A23 : A9; + 1A24 : 00; + 1A25 : 38; + 1A26 : E5; + 1A27 : 5E; + 1A28 : 85; + 1A29 : 5E; + 1A2A : 20; + 1A2B : C3; + 1A2C : D9; + 1A2D : E6; + 1A2E : 5E; + 1A2F : F0; + 1A30 : BA; + 1A31 : A2; + 1A32 : FC; + 1A33 : A9; + 1A34 : 01; + 1A35 : A4; + 1A36 : 67; + 1A37 : C4; + 1A38 : 5F; + 1A39 : D0; + 1A3A : 10; + 1A3B : A4; + 1A3C : 68; + 1A3D : C4; + 1A3E : 60; + 1A3F : D0; + 1A40 : 0A; + 1A41 : A4; + 1A42 : 69; + 1A43 : C4; + 1A44 : 61; + 1A45 : D0; + 1A46 : 04; + 1A47 : A4; + 1A48 : 6A; + 1A49 : C4; + 1A4A : 62; + 1A4B : 08; + 1A4C : 2A; + 1A4D : 90; + 1A4E : 09; + 1A4F : E8; + 1A50 : 95; + 1A51 : 26; + 1A52 : F0; + 1A53 : 32; + 1A54 : 10; + 1A55 : 34; + 1A56 : A9; + 1A57 : 01; + 1A58 : 28; + 1A59 : B0; + 1A5A : 0E; + 1A5B : 06; + 1A5C : 6A; + 1A5D : 26; + 1A5E : 69; + 1A5F : 26; + 1A60 : 68; + 1A61 : 26; + 1A62 : 67; + 1A63 : B0; + 1A64 : E6; + 1A65 : 30; + 1A66 : CE; + 1A67 : 10; + 1A68 : E2; + 1A69 : A8; + 1A6A : A5; + 1A6B : 6A; + 1A6C : E5; + 1A6D : 62; + 1A6E : 85; + 1A6F : 6A; + 1A70 : A5; + 1A71 : 69; + 1A72 : E5; + 1A73 : 61; + 1A74 : 85; + 1A75 : 69; + 1A76 : A5; + 1A77 : 68; + 1A78 : E5; + 1A79 : 60; + 1A7A : 85; + 1A7B : 68; + 1A7C : A5; + 1A7D : 67; + 1A7E : E5; + 1A7F : 5F; + 1A80 : 85; + 1A81 : 67; + 1A82 : 98; + 1A83 : 4C; + 1A84 : 5B; + 1A85 : DA; + 1A86 : A9; + 1A87 : 40; + 1A88 : D0; + 1A89 : CE; + [1A8A..1A8F] : 0A; + 1A90 : 85; + 1A91 : 6D; + 1A92 : 28; + 1A93 : 4C; + 1A94 : 9B; + 1A95 : DA; + 1A96 : A2; + 1A97 : 85; + 1A98 : 4C; + 1A99 : 57; + 1A9A : C3; + 1A9B : A5; + 1A9C : 23; + 1A9D : 85; + 1A9E : 5F; + 1A9F : A5; + 1AA0 : 24; + 1AA1 : 85; + 1AA2 : 60; + 1AA3 : A5; + 1AA4 : 25; + 1AA5 : 85; + 1AA6 : 61; + 1AA7 : A5; + 1AA8 : 26; + 1AA9 : 85; + 1AAA : 62; + 1AAB : 4C; + 1AAC : E3; + 1AAD : D7; + 1AAE : 85; + 1AAF : 1F; + 1AB0 : 84; + 1AB1 : 20; + 1AB2 : A0; + 1AB3 : 04; + 1AB4 : B1; + 1AB5 : 1F; + 1AB6 : 85; + 1AB7 : 62; + 1AB8 : 88; + 1AB9 : B1; + 1ABA : 1F; + 1ABB : 85; + 1ABC : 61; + 1ABD : 88; + 1ABE : B1; + 1ABF : 1F; + 1AC0 : 85; + 1AC1 : 60; + 1AC2 : 88; + 1AC3 : B1; + 1AC4 : 1F; + 1AC5 : 85; + 1AC6 : 63; + 1AC7 : 09; + 1AC8 : 80; + 1AC9 : 85; + 1ACA : 5F; + 1ACB : 88; + 1ACC : B1; + 1ACD : 1F; + 1ACE : 85; + 1ACF : 5E; + 1AD0 : 84; + 1AD1 : 6D; + 1AD2 : 60; + 1AD3 : A2; + 1AD4 : 59; + 1AD5 : 2C; + 1AD6 : A2; + 1AD7 : 54; + 1AD8 : A0; + 1AD9 : 00; + 1ADA : F0; + 1ADB : 04; + 1ADC : A6; + 1ADD : 46; + 1ADE : A4; + 1ADF : 47; + 1AE0 : 20; + 1AE1 : 27; + 1AE2 : DB; + 1AE3 : 86; + 1AE4 : 1F; + 1AE5 : 84; + 1AE6 : 20; + 1AE7 : A0; + 1AE8 : 04; + 1AE9 : A5; + 1AEA : 62; + 1AEB : 91; + 1AEC : 1F; + 1AED : 88; + 1AEE : A5; + 1AEF : 61; + 1AF0 : 91; + 1AF1 : 1F; + 1AF2 : 88; + 1AF3 : A5; + 1AF4 : 60; + 1AF5 : 91; + 1AF6 : 1F; + 1AF7 : 88; + 1AF8 : A5; + 1AF9 : 63; + 1AFA : 09; + 1AFB : 7F; + 1AFC : 25; + 1AFD : 5F; + 1AFE : 91; + 1AFF : 1F; + 1B00 : 88; + 1B01 : A5; + 1B02 : 5E; + 1B03 : 91; + 1B04 : 1F; + 1B05 : 84; + 1B06 : 6D; + 1B07 : 60; + 1B08 : A5; + 1B09 : 6B; + 1B0A : 85; + 1B0B : 63; + 1B0C : A2; + 1B0D : 05; + 1B0E : B5; + 1B0F : 65; + 1B10 : 95; + 1B11 : 5D; + 1B12 : CA; + 1B13 : D0; + 1B14 : F9; + 1B15 : 86; + 1B16 : 6D; + 1B17 : 60; + 1B18 : 20; + 1B19 : 27; + 1B1A : DB; + 1B1B : A2; + 1B1C : 06; + 1B1D : B5; + 1B1E : 5D; + 1B1F : 95; + 1B20 : 65; + 1B21 : CA; + 1B22 : D0; + 1B23 : F9; + 1B24 : 86; + 1B25 : 6D; + 1B26 : 60; + 1B27 : A5; + 1B28 : 5E; + 1B29 : F0; + 1B2A : FB; + 1B2B : 06; + 1B2C : 6D; + 1B2D : 90; + 1B2E : F7; + 1B2F : 20; + 1B30 : 7B; + 1B31 : D8; + 1B32 : D0; + 1B33 : F2; + 1B34 : 4C; + 1B35 : 44; + 1B36 : D8; + 1B37 : A5; + 1B38 : 5E; + 1B39 : F0; + 1B3A : 09; + 1B3B : A5; + 1B3C : 63; + 1B3D : 2A; + 1B3E : A9; + 1B3F : FF; + 1B40 : B0; + 1B41 : 02; + 1B42 : A9; + 1B43 : 01; + 1B44 : 60; + 1B45 : 20; + 1B46 : 37; + 1B47 : DB; + 1B48 : 85; + 1B49 : 5F; + 1B4A : A9; + 1B4B : 00; + 1B4C : 85; + 1B4D : 60; + 1B4E : A2; + 1B4F : 88; + 1B50 : A5; + 1B51 : 5F; + 1B52 : 49; + 1B53 : FF; + 1B54 : 2A; + 1B55 : A9; + 1B56 : 00; + 1B57 : 85; + 1B58 : 62; + 1B59 : 85; + 1B5A : 61; + 1B5B : 86; + 1B5C : 5E; + 1B5D : 85; + 1B5E : 6D; + 1B5F : 85; + 1B60 : 63; + 1B61 : 4C; + 1B62 : DE; + 1B63 : D7; + 1B64 : 46; + 1B65 : 63; + 1B66 : 60; + 1B67 : 85; + 1B68 : 21; + 1B69 : 84; + 1B6A : 22; + 1B6B : A0; + 1B6C : 00; + 1B6D : B1; + 1B6E : 21; + 1B6F : C8; + 1B70 : AA; + 1B71 : F0; + 1B72 : C4; + 1B73 : B1; + 1B74 : 21; + 1B75 : 45; + 1B76 : 63; + 1B77 : 30; + 1B78 : C2; + 1B79 : E4; + 1B7A : 5E; + 1B7B : D0; + 1B7C : 21; + 1B7D : B1; + 1B7E : 21; + 1B7F : 09; + 1B80 : 80; + 1B81 : C5; + 1B82 : 5F; + 1B83 : D0; + 1B84 : 19; + 1B85 : C8; + 1B86 : B1; + 1B87 : 21; + 1B88 : C5; + 1B89 : 60; + 1B8A : D0; + 1B8B : 12; + 1B8C : C8; + 1B8D : B1; + 1B8E : 21; + 1B8F : C5; + 1B90 : 61; + 1B91 : D0; + 1B92 : 0B; + 1B93 : C8; + 1B94 : A9; + 1B95 : 7F; + 1B96 : C5; + 1B97 : 6D; + 1B98 : B1; + 1B99 : 21; + 1B9A : E5; + 1B9B : 62; + 1B9C : F0; + 1B9D : 28; + 1B9E : A5; + 1B9F : 63; + 1BA0 : 90; + 1BA1 : 02; + 1BA2 : 49; + 1BA3 : FF; + 1BA4 : 4C; + 1BA5 : 3D; + 1BA6 : DB; + 1BA7 : A5; + 1BA8 : 5E; + 1BA9 : F0; + 1BAA : 4A; + 1BAB : 38; + 1BAC : E9; + 1BAD : A0; + 1BAE : 24; + 1BAF : 63; + 1BB0 : 10; + 1BB1 : 09; + 1BB2 : AA; + 1BB3 : A9; + 1BB4 : FF; + 1BB5 : 85; + 1BB6 : 65; + 1BB7 : 20; + 1BB8 : 59; + 1BB9 : D8; + 1BBA : 8A; + 1BBB : A2; + 1BBC : 5E; + 1BBD : C9; + 1BBE : F9; + 1BBF : 10; + 1BC0 : 06; + 1BC1 : 20; + 1BC2 : A5; + 1BC3 : D8; + 1BC4 : 84; + 1BC5 : 65; + 1BC6 : 60; + 1BC7 : A8; + 1BC8 : A5; + 1BC9 : 63; + 1BCA : 29; + 1BCB : 80; + 1BCC : 46; + 1BCD : 5F; + 1BCE : 05; + 1BCF : 5F; + 1BD0 : 85; + 1BD1 : 5F; + 1BD2 : 20; + 1BD3 : BC; + 1BD4 : D8; + 1BD5 : 84; + 1BD6 : 65; + 1BD7 : 60; + 1BD8 : A5; + 1BD9 : 5E; + 1BDA : C9; + 1BDB : A0; + 1BDC : B0; + [1BDD..1BDE] : 20; + 1BDF : A7; + 1BE0 : DB; + 1BE1 : 84; + 1BE2 : 6D; + 1BE3 : A5; + 1BE4 : 63; + 1BE5 : 84; + 1BE6 : 63; + 1BE7 : 49; + 1BE8 : 80; + 1BE9 : 2A; + 1BEA : A9; + 1BEB : A0; + 1BEC : 85; + 1BED : 5E; + 1BEE : A5; + 1BEF : 62; + 1BF0 : 85; + 1BF1 : 03; + 1BF2 : 4C; + 1BF3 : DE; + 1BF4 : D7; + 1BF5 : 85; + 1BF6 : 5F; + 1BF7 : 85; + 1BF8 : 60; + 1BF9 : 85; + 1BFA : 61; + 1BFB : 85; + 1BFC : 62; + 1BFD : A8; + 1BFE : 60; + 1BFF : A0; + 1C00 : 00; + 1C01 : A2; + 1C02 : 0A; + 1C03 : 94; + 1C04 : 5A; + 1C05 : CA; + 1C06 : 10; + 1C07 : FB; + 1C08 : 90; + 1C09 : 0F; + 1C0A : C9; + 1C0B : 2D; + 1C0C : D0; + 1C0D : 04; + 1C0E : 86; + 1C0F : 64; + 1C10 : F0; + 1C11 : 04; + 1C12 : C9; + 1C13 : 2B; + 1C14 : D0; + 1C15 : 05; + 1C16 : 20; + 1C17 : 70; + 1C18 : 00; + 1C19 : 90; + 1C1A : 5B; + 1C1B : C9; + 1C1C : 2E; + 1C1D : F0; + 1C1E : 2E; + 1C1F : C9; + 1C20 : 45; + 1C21 : D0; + 1C22 : 30; + 1C23 : 20; + 1C24 : 70; + 1C25 : 00; + 1C26 : 90; + 1C27 : 17; + 1C28 : C9; + 1C29 : AB; + 1C2A : F0; + 1C2B : 0E; + 1C2C : C9; + 1C2D : 2D; + 1C2E : F0; + 1C2F : 0A; + 1C30 : C9; + 1C31 : AA; + 1C32 : F0; + 1C33 : 08; + 1C34 : C9; + 1C35 : 2B; + 1C36 : F0; + 1C37 : 04; + 1C38 : D0; + 1C39 : 07; + 1C3A : 66; + 1C3B : 5D; + 1C3C : 20; + 1C3D : 70; + 1C3E : 00; + 1C3F : 90; + 1C40 : 5C; + 1C41 : 24; + 1C42 : 5D; + 1C43 : 10; + 1C44 : 0E; + 1C45 : A9; + 1C46 : 00; + 1C47 : 38; + 1C48 : E5; + 1C49 : 5B; + 1C4A : 4C; + 1C4B : 55; + 1C4C : DC; + 1C4D : 66; + 1C4E : 5C; + 1C4F : 24; + 1C50 : 5C; + 1C51 : 50; + 1C52 : C3; + 1C53 : A5; + 1C54 : 5B; + 1C55 : 38; + 1C56 : E5; + 1C57 : 5A; + 1C58 : 85; + 1C59 : 5B; + 1C5A : F0; + 1C5B : 12; + 1C5C : 10; + 1C5D : 09; + 1C5E : 20; + 1C5F : 0A; + 1C60 : DA; + 1C61 : E6; + 1C62 : 5B; + 1C63 : D0; + 1C64 : F9; + 1C65 : F0; + 1C66 : 07; + 1C67 : 20; + 1C68 : EE; + 1C69 : D9; + 1C6A : C6; + 1C6B : 5B; + 1C6C : D0; + 1C6D : F9; + 1C6E : A5; + 1C6F : 64; + 1C70 : 30; + 1C71 : 01; + 1C72 : 60; + 1C73 : 4C; + 1C74 : A1; + 1C75 : DE; + 1C76 : 48; + 1C77 : 24; + 1C78 : 5C; + 1C79 : 10; + 1C7A : 02; + 1C7B : E6; + 1C7C : 5A; + 1C7D : 20; + 1C7E : EE; + 1C7F : D9; + 1C80 : 68; + 1C81 : 38; + 1C82 : E9; + 1C83 : 30; + 1C84 : 20; + 1C85 : 8A; + 1C86 : DC; + 1C87 : 4C; + 1C88 : 16; + 1C89 : DC; + 1C8A : 48; + 1C8B : 20; + 1C8C : 18; + 1C8D : DB; + 1C8E : 68; + 1C8F : 20; + 1C90 : 48; + 1C91 : DB; + 1C92 : A5; + 1C93 : 6B; + 1C94 : 45; + 1C95 : 63; + 1C96 : 85; + 1C97 : 6C; + 1C98 : A6; + 1C99 : 5E; + 1C9A : 4C; + 1C9B : 76; + 1C9C : D7; + 1C9D : A5; + 1C9E : 5B; + 1C9F : C9; + 1CA0 : 0A; + 1CA1 : 90; + 1CA2 : 09; + 1CA3 : A9; + 1CA4 : 64; + 1CA5 : 24; + 1CA6 : 5D; + 1CA7 : 30; + 1CA8 : 11; + 1CA9 : 4C; + 1CAA : 8A; + 1CAB : D8; + [1CAC..1CAD] : 0A; + 1CAE : 18; + 1CAF : 65; + 1CB0 : 5B; + 1CB1 : 0A; + 1CB2 : 18; + 1CB3 : A0; + 1CB4 : 00; + 1CB5 : 71; + 1CB6 : 77; + 1CB7 : 38; + 1CB8 : E9; + 1CB9 : 30; + 1CBA : 85; + 1CBB : 5B; + 1CBC : 4C; + 1CBD : 3C; + 1CBE : DC; + 1CBF : 9B; + 1CC0 : 3E; + 1CC1 : BC; + 1CC2 : 1F; + 1CC3 : FD; + 1CC4 : 9E; + 1CC5 : 6E; + 1CC6 : 6B; + 1CC7 : 27; + 1CC8 : FD; + 1CC9 : 9E; + 1CCA : 6E; + 1CCB : 6B; + 1CCC : 28; + 1CCD : 00; + 1CCE : A9; + 1CCF : 92; + 1CD0 : A0; + 1CD1 : C2; + 1CD2 : 20; + 1CD3 : E6; + 1CD4 : DC; + 1CD5 : A5; + 1CD6 : 37; + 1CD7 : A6; + 1CD8 : 36; + 1CD9 : 85; + 1CDA : 5F; + 1CDB : 86; + 1CDC : 60; + 1CDD : A2; + 1CDE : 90; + 1CDF : 38; + 1CE0 : 20; + 1CE1 : 55; + 1CE2 : DB; + 1CE3 : 20; + 1CE4 : E9; + 1CE5 : DC; + 1CE6 : 4C; + 1CE7 : 1C; + 1CE8 : CA; + 1CE9 : A0; + 1CEA : 01; + 1CEB : A9; + 1CEC : 20; + 1CED : 24; + 1CEE : 63; + 1CEF : 10; + 1CF0 : 02; + 1CF1 : A9; + 1CF2 : 2D; + 1CF3 : 99; + 1CF4 : FF; + 1CF5 : 00; + 1CF6 : 85; + 1CF7 : 63; + 1CF8 : 84; + 1CF9 : 6E; + 1CFA : C8; + 1CFB : A9; + 1CFC : 30; + 1CFD : A6; + 1CFE : 5E; + 1CFF : D0; + 1D00 : 03; + 1D01 : 4C; + 1D02 : 10; + 1D03 : DE; + 1D04 : A9; + 1D05 : 00; + 1D06 : E0; + 1D07 : 80; + 1D08 : F0; + 1D09 : 02; + 1D0A : B0; + 1D0B : 09; + 1D0C : A9; + 1D0D : C9; + 1D0E : A0; + 1D0F : DC; + 1D10 : 20; + 1D11 : 34; + 1D12 : D9; + 1D13 : A9; + 1D14 : F7; + 1D15 : 85; + 1D16 : 5A; + 1D17 : A9; + 1D18 : C4; + 1D19 : A0; + 1D1A : DC; + 1D1B : 20; + 1D1C : 67; + 1D1D : DB; + 1D1E : F0; + 1D1F : 1E; + 1D20 : 10; + 1D21 : 12; + 1D22 : A9; + 1D23 : BF; + 1D24 : A0; + 1D25 : DC; + 1D26 : 20; + 1D27 : 67; + 1D28 : DB; + 1D29 : F0; + 1D2A : 02; + 1D2B : 10; + 1D2C : 0E; + 1D2D : 20; + 1D2E : EE; + 1D2F : D9; + 1D30 : C6; + 1D31 : 5A; + 1D32 : D0; + 1D33 : EE; + 1D34 : 20; + 1D35 : 0A; + 1D36 : DA; + 1D37 : E6; + 1D38 : 5A; + 1D39 : D0; + 1D3A : DC; + 1D3B : 20; + 1D3C : 2C; + 1D3D : D7; + 1D3E : 20; + 1D3F : A7; + 1D40 : DB; + 1D41 : A2; + 1D42 : 01; + 1D43 : A5; + 1D44 : 5A; + 1D45 : 18; + 1D46 : 69; + 1D47 : 0A; + 1D48 : 30; + 1D49 : 09; + 1D4A : C9; + 1D4B : 0B; + 1D4C : B0; + 1D4D : 06; + 1D4E : 69; + 1D4F : FF; + 1D50 : AA; + 1D51 : A9; + 1D52 : 02; + 1D53 : 38; + 1D54 : E9; + 1D55 : 02; + 1D56 : 85; + 1D57 : 5B; + 1D58 : 86; + 1D59 : 5A; + 1D5A : 8A; + 1D5B : F0; + 1D5C : 02; + 1D5D : 10; + 1D5E : 13; + 1D5F : A4; + 1D60 : 6E; + 1D61 : A9; + 1D62 : 2E; + 1D63 : C8; + 1D64 : 99; + 1D65 : FF; + 1D66 : 00; + 1D67 : 8A; + 1D68 : F0; + 1D69 : 06; + 1D6A : A9; + 1D6B : 30; + 1D6C : C8; + 1D6D : 99; + 1D6E : FF; + 1D6F : 00; + 1D70 : 84; + 1D71 : 6E; + 1D72 : A0; + 1D73 : 00; + 1D74 : A2; + 1D75 : 80; + 1D76 : A5; + 1D77 : 62; + 1D78 : 18; + 1D79 : 79; + 1D7A : 25; + 1D7B : DE; + 1D7C : 85; + 1D7D : 62; + 1D7E : A5; + 1D7F : 61; + 1D80 : 79; + 1D81 : 24; + 1D82 : DE; + 1D83 : 85; + 1D84 : 61; + 1D85 : A5; + 1D86 : 60; + 1D87 : 79; + 1D88 : 23; + 1D89 : DE; + 1D8A : 85; + 1D8B : 60; + 1D8C : A5; + 1D8D : 5F; + 1D8E : 79; + 1D8F : 22; + 1D90 : DE; + 1D91 : 85; + 1D92 : 5F; + 1D93 : E8; + 1D94 : B0; + 1D95 : 04; + 1D96 : 10; + 1D97 : DE; + 1D98 : 30; + 1D99 : 02; + 1D9A : 30; + 1D9B : DA; + 1D9C : 8A; + 1D9D : 90; + 1D9E : 04; + 1D9F : 49; + 1DA0 : FF; + 1DA1 : 69; + 1DA2 : 0A; + 1DA3 : 69; + 1DA4 : 2F; + [1DA5..1DA8] : C8; + 1DA9 : 84; + 1DAA : 44; + 1DAB : A4; + 1DAC : 6E; + 1DAD : C8; + 1DAE : AA; + 1DAF : 29; + 1DB0 : 7F; + 1DB1 : 99; + 1DB2 : FF; + 1DB3 : 00; + 1DB4 : C6; + 1DB5 : 5A; + 1DB6 : D0; + 1DB7 : 06; + 1DB8 : A9; + 1DB9 : 2E; + 1DBA : C8; + 1DBB : 99; + 1DBC : FF; + 1DBD : 00; + 1DBE : 84; + 1DBF : 6E; + 1DC0 : A4; + 1DC1 : 44; + 1DC2 : 8A; + 1DC3 : 49; + 1DC4 : FF; + 1DC5 : 29; + 1DC6 : 80; + 1DC7 : AA; + 1DC8 : C0; + 1DC9 : 24; + 1DCA : F0; + 1DCB : 04; + 1DCC : C0; + 1DCD : 3C; + 1DCE : D0; + 1DCF : A6; + 1DD0 : A4; + 1DD1 : 6E; + 1DD2 : B9; + 1DD3 : FF; + 1DD4 : 00; + 1DD5 : 88; + 1DD6 : C9; + 1DD7 : 30; + 1DD8 : F0; + 1DD9 : F8; + 1DDA : C9; + 1DDB : 2E; + 1DDC : F0; + 1DDD : 01; + 1DDE : C8; + 1DDF : A9; + 1DE0 : 2B; + 1DE1 : A6; + 1DE2 : 5B; + 1DE3 : F0; + 1DE4 : 2E; + 1DE5 : 10; + 1DE6 : 08; + 1DE7 : A9; + 1DE8 : 00; + 1DE9 : 38; + 1DEA : E5; + 1DEB : 5B; + 1DEC : AA; + 1DED : A9; + 1DEE : 2D; + 1DEF : 99; + [1DF0..1DF1] : 01; + 1DF2 : A9; + 1DF3 : 45; + 1DF4 : 99; + 1DF5 : 00; + 1DF6 : 01; + 1DF7 : 8A; + 1DF8 : A2; + 1DF9 : 2F; + 1DFA : 38; + 1DFB : E8; + 1DFC : E9; + 1DFD : 0A; + 1DFE : B0; + 1DFF : FB; + 1E00 : 69; + 1E01 : 3A; + 1E02 : 99; + 1E03 : 03; + 1E04 : 01; + 1E05 : 8A; + 1E06 : 99; + 1E07 : 02; + 1E08 : 01; + 1E09 : A9; + 1E0A : 00; + 1E0B : 99; + 1E0C : 04; + 1E0D : 01; + 1E0E : F0; + 1E0F : 08; + 1E10 : 99; + 1E11 : FF; + 1E12 : 00; + 1E13 : A9; + 1E14 : 00; + 1E15 : 99; + 1E16 : 00; + 1E17 : 01; + 1E18 : A9; + 1E19 : 00; + 1E1A : A0; + 1E1B : 01; + 1E1C : 60; + 1E1D : 80; + [1E1E..1E21] : 00; + 1E22 : FA; + 1E23 : 0A; + 1E24 : 1F; + [1E25..1E26] : 00; + 1E27 : 98; + 1E28 : 96; + 1E29 : 80; + 1E2A : FF; + 1E2B : F0; + 1E2C : BD; + 1E2D : C0; + 1E2E : 00; + 1E2F : 01; + 1E30 : 86; + 1E31 : A0; + [1E32..1E33] : FF; + 1E34 : D8; + 1E35 : F0; + [1E36..1E37] : 00; + 1E38 : 03; + 1E39 : E8; + [1E3A..1E3C] : FF; + 1E3D : 9C; + [1E3E..1E40] : 00; + 1E41 : 0A; + [1E42..1E46] : FF; + 1E47 : DF; + 1E48 : 0A; + 1E49 : 80; + 1E4A : 00; + 1E4B : 03; + 1E4C : 4B; + 1E4D : C0; + [1E4E..1E4F] : FF; + 1E50 : 73; + 1E51 : 60; + [1E52..1E53] : 00; + 1E54 : 0E; + 1E55 : 10; + [1E56..1E57] : FF; + 1E58 : FD; + 1E59 : A8; + [1E5A..1E5C] : 00; + 1E5D : 3C; + 1E5E : 20; + 1E5F : 18; + 1E60 : DB; + 1E61 : A9; + 1E62 : 1D; + 1E63 : A0; + 1E64 : DE; + 1E65 : 20; + 1E66 : AE; + 1E67 : DA; + 1E68 : F0; + 1E69 : 70; + 1E6A : A5; + 1E6B : 66; + 1E6C : D0; + 1E6D : 03; + 1E6E : 4C; + 1E6F : 05; + 1E70 : D8; + 1E71 : A2; + 1E72 : 4B; + 1E73 : A0; + 1E74 : 00; + 1E75 : 20; + 1E76 : E0; + 1E77 : DA; + 1E78 : A5; + 1E79 : 6B; + 1E7A : 10; + 1E7B : 0F; + 1E7C : 20; + 1E7D : D8; + 1E7E : DB; + 1E7F : A9; + 1E80 : 4B; + 1E81 : A0; + 1E82 : 00; + 1E83 : 20; + 1E84 : 67; + 1E85 : DB; + 1E86 : D0; + 1E87 : 03; + 1E88 : 98; + 1E89 : A4; + 1E8A : 03; + 1E8B : 20; + 1E8C : 0A; + 1E8D : DB; + 1E8E : 98; + 1E8F : 48; + 1E90 : 20; + 1E91 : F6; + 1E92 : D8; + 1E93 : A9; + 1E94 : 4B; + 1E95 : A0; + 1E96 : 00; + 1E97 : 20; + 1E98 : 34; + 1E99 : D9; + 1E9A : 20; + 1E9B : DA; + 1E9C : DE; + 1E9D : 68; + 1E9E : 4A; + 1E9F : 90; + 1EA0 : 0A; + 1EA1 : A5; + 1EA2 : 5E; + 1EA3 : F0; + 1EA4 : 06; + 1EA5 : A5; + 1EA6 : 63; + 1EA7 : 49; + 1EA8 : FF; + 1EA9 : 85; + 1EAA : 63; + 1EAB : 60; + 1EAC : 81; + 1EAD : 38; + 1EAE : AA; + 1EAF : 3B; + 1EB0 : 29; + 1EB1 : 07; + 1EB2 : 71; + 1EB3 : 34; + 1EB4 : 58; + 1EB5 : 3E; + 1EB6 : 56; + 1EB7 : 74; + 1EB8 : 16; + 1EB9 : 7E; + 1EBA : B3; + 1EBB : 1B; + 1EBC : 77; + 1EBD : 2F; + 1EBE : EE; + 1EBF : E3; + 1EC0 : 85; + 1EC1 : 7A; + 1EC2 : 1D; + 1EC3 : 84; + 1EC4 : 1C; + 1EC5 : 2A; + 1EC6 : 7C; + 1EC7 : 63; + 1EC8 : 59; + 1EC9 : 58; + 1ECA : 0A; + 1ECB : 7E; + 1ECC : 75; + 1ECD : FD; + 1ECE : E7; + 1ECF : C6; + 1ED0 : 80; + 1ED1 : 31; + 1ED2 : 72; + 1ED3 : 18; + 1ED4 : 10; + 1ED5 : 81; + [1ED6..1ED9] : 00; + 1EDA : A9; + 1EDB : AC; + 1EDC : A0; + 1EDD : DE; + 1EDE : 20; + 1EDF : 34; + 1EE0 : D9; + 1EE1 : A5; + 1EE2 : 6D; + 1EE3 : 69; + 1EE4 : 50; + 1EE5 : 90; + 1EE6 : 03; + 1EE7 : 20; + 1EE8 : 2F; + 1EE9 : DB; + 1EEA : 85; + 1EEB : 53; + 1EEC : 20; + 1EED : 1B; + 1EEE : DB; + 1EEF : A5; + 1EF0 : 5E; + 1EF1 : C9; + 1EF2 : 88; + 1EF3 : 90; + 1EF4 : 03; + 1EF5 : 20; + 1EF6 : E0; + 1EF7 : D9; + 1EF8 : 20; + 1EF9 : D8; + 1EFA : DB; + 1EFB : A5; + 1EFC : 03; + 1EFD : 18; + 1EFE : 69; + 1EFF : 81; + 1F00 : F0; + 1F01 : F3; + 1F02 : 38; + 1F03 : E9; + 1F04 : 01; + 1F05 : 48; + 1F06 : A2; + 1F07 : 05; + 1F08 : B5; + 1F09 : 66; + 1F0A : B4; + 1F0B : 5E; + 1F0C : 95; + 1F0D : 5E; + 1F0E : 94; + 1F0F : 66; + 1F10 : CA; + 1F11 : 10; + 1F12 : F5; + 1F13 : A5; + 1F14 : 53; + 1F15 : 85; + 1F16 : 6D; + 1F17 : 20; + 1F18 : 36; + 1F19 : D7; + 1F1A : 20; + 1F1B : A1; + 1F1C : DE; + 1F1D : A9; + 1F1E : B1; + 1F1F : A0; + 1F20 : DE; + 1F21 : 20; + 1F22 : 43; + 1F23 : DF; + 1F24 : A9; + 1F25 : 00; + 1F26 : 85; + 1F27 : 6C; + 1F28 : 68; + 1F29 : 20; + 1F2A : C5; + 1F2B : D9; + 1F2C : 60; + 1F2D : 85; + 1F2E : 6E; + 1F2F : 84; + 1F30 : 6F; + 1F31 : 20; + 1F32 : D6; + 1F33 : DA; + 1F34 : A9; + 1F35 : 54; + 1F36 : 20; + 1F37 : 34; + 1F38 : D9; + 1F39 : 20; + 1F3A : 47; + 1F3B : DF; + 1F3C : A9; + 1F3D : 54; + 1F3E : A0; + 1F3F : 00; + 1F40 : 4C; + 1F41 : 34; + 1F42 : D9; + 1F43 : 85; + 1F44 : 6E; + 1F45 : 84; + 1F46 : 6F; + 1F47 : 20; + 1F48 : D3; + 1F49 : DA; + 1F4A : B1; + 1F4B : 6E; + 1F4C : 85; + 1F4D : 64; + 1F4E : A4; + 1F4F : 6E; + 1F50 : C8; + 1F51 : 98; + 1F52 : D0; + 1F53 : 02; + 1F54 : E6; + 1F55 : 6F; + 1F56 : 85; + 1F57 : 6E; + 1F58 : A4; + 1F59 : 6F; + 1F5A : 20; + 1F5B : 34; + 1F5C : D9; + 1F5D : A5; + 1F5E : 6E; + 1F5F : A4; + 1F60 : 6F; + 1F61 : 18; + 1F62 : 69; + 1F63 : 05; + 1F64 : 90; + 1F65 : 01; + 1F66 : C8; + 1F67 : 85; + 1F68 : 6E; + 1F69 : 84; + 1F6A : 6F; + 1F6B : 20; + 1F6C : 73; + 1F6D : D7; + 1F6E : A9; + 1F6F : 59; + 1F70 : A0; + 1F71 : 00; + 1F72 : C6; + 1F73 : 64; + 1F74 : D0; + 1F75 : E4; + 1F76 : 60; + 1F77 : 98; + 1F78 : 35; + 1F79 : 44; + 1F7A : 7A; + 1F7B : 68; + 1F7C : 28; + 1F7D : B1; + 1F7E : 46; + 1F7F : 20; + 1F80 : 37; + 1F81 : DB; + 1F82 : 30; + 1F83 : 2E; + 1F84 : D0; + 1F85 : 17; + 1F86 : AD; + 1F87 : 44; + 1F88 : E8; + 1F89 : 85; + 1F8A : 5F; + 1F8B : AD; + 1F8C : 48; + 1F8D : E8; + 1F8E : 85; + 1F8F : 60; + 1F90 : AD; + 1F91 : 45; + 1F92 : E8; + 1F93 : 85; + 1F94 : 61; + 1F95 : AD; + 1F96 : 49; + 1F97 : E8; + 1F98 : 85; + 1F99 : 62; + 1F9A : 4C; + 1F9B : C2; + 1F9C : DF; + 1F9D : A9; + 1F9E : 88; + 1F9F : A0; + 1FA0 : 00; + 1FA1 : 20; + 1FA2 : AE; + 1FA3 : DA; + 1FA4 : A9; + 1FA5 : 77; + 1FA6 : A0; + 1FA7 : DF; + 1FA8 : 20; + 1FA9 : 34; + 1FAA : D9; + 1FAB : A9; + 1FAC : 7B; + 1FAD : A0; + 1FAE : DF; + 1FAF : 20; + 1FB0 : 73; + 1FB1 : D7; + 1FB2 : A6; + 1FB3 : 62; + 1FB4 : A5; + 1FB5 : 5F; + 1FB6 : 85; + 1FB7 : 62; + 1FB8 : 86; + 1FB9 : 5F; + 1FBA : A6; + 1FBB : 60; + 1FBC : A5; + 1FBD : 61; + 1FBE : 85; + 1FBF : 60; + 1FC0 : 86; + 1FC1 : 61; + 1FC2 : A9; + 1FC3 : 00; + 1FC4 : 85; + 1FC5 : 63; + 1FC6 : A5; + 1FC7 : 5E; + 1FC8 : 85; + 1FC9 : 6D; + 1FCA : A9; + 1FCB : 80; + 1FCC : 85; + 1FCD : 5E; + 1FCE : 20; + 1FCF : E3; + 1FD0 : D7; + 1FD1 : A2; + 1FD2 : 88; + 1FD3 : A0; + 1FD4 : 00; + 1FD5 : 4C; + 1FD6 : E0; + 1FD7 : DA; + 1FD8 : A9; + 1FD9 : 54; + 1FDA : A0; + 1FDB : E0; + 1FDC : 20; + 1FDD : 73; + 1FDE : D7; + 1FDF : 20; + 1FE0 : 18; + 1FE1 : DB; + 1FE2 : A9; + 1FE3 : 59; + 1FE4 : A0; + 1FE5 : E0; + 1FE6 : A6; + 1FE7 : 6B; + 1FE8 : 20; + 1FE9 : 13; + 1FEA : DA; + 1FEB : 20; + 1FEC : 18; + 1FED : DB; + 1FEE : 20; + 1FEF : D8; + 1FF0 : DB; + 1FF1 : A9; + 1FF2 : 00; + 1FF3 : 85; + 1FF4 : 6C; + 1FF5 : 20; + 1FF6 : 36; + 1FF7 : D7; + 1FF8 : A9; + 1FF9 : 5E; + 1FFA : A0; + 1FFB : E0; + 1FFC : 20; + 1FFD : 33; + 1FFE : D7; + 1FFF : A5; + 2000 : 63; + 2001 : 48; + 2002 : 10; + 2003 : 0D; + 2004 : 20; + 2005 : 2C; + 2006 : D7; + 2007 : A5; + 2008 : 63; + 2009 : 30; + 200A : 09; + 200B : A5; + 200C : 0C; + 200D : 49; + 200E : FF; + 200F : 85; + 2010 : 0C; + 2011 : 20; + 2012 : A1; + 2013 : DE; + 2014 : A9; + 2015 : 5E; + 2016 : A0; + 2017 : E0; + 2018 : 20; + 2019 : 73; + 201A : D7; + 201B : 68; + 201C : 10; + 201D : 03; + 201E : 20; + 201F : A1; + 2020 : DE; + 2021 : A9; + 2022 : 63; + 2023 : A0; + 2024 : E0; + 2025 : 4C; + 2026 : 2D; + 2027 : DF; + 2028 : 20; + 2029 : D6; + 202A : DA; + 202B : A9; + 202C : 00; + 202D : 85; + 202E : 0C; + 202F : 20; + [2030..2031] : DF; + 2032 : A2; + 2033 : 4B; + 2034 : A0; + 2035 : 00; + 2036 : 20; + 2037 : D5; + 2038 : DF; + 2039 : A9; + 203A : 54; + 203B : A0; + 203C : 00; + 203D : 20; + 203E : AE; + 203F : DA; + 2040 : A9; + 2041 : 00; + 2042 : 85; + 2043 : 63; + 2044 : A5; + 2045 : 0C; + 2046 : 20; + 2047 : 50; + 2048 : E0; + 2049 : A9; + 204A : 4B; + 204B : A0; + 204C : 00; + 204D : 4C; + 204E : 1B; + 204F : DA; + 2050 : 48; + 2051 : 4C; + 2052 : 11; + 2053 : E0; + 2054 : 81; + 2055 : 49; + 2056 : 0F; + 2057 : DA; + 2058 : A2; + 2059 : 83; + 205A : 49; + 205B : 0F; + 205C : DA; + 205D : A2; + 205E : 7F; + [205F..2062] : 00; + 2063 : 05; + 2064 : 84; + 2065 : E6; + 2066 : 1A; + 2067 : 2D; + 2068 : 1B; + 2069 : 86; + 206A : 28; + 206B : 07; + 206C : FB; + 206D : F8; + 206E : 87; + 206F : 99; + 2070 : 68; + 2071 : 89; + 2072 : 01; + 2073 : 87; + 2074 : 23; + 2075 : 35; + 2076 : DF; + 2077 : E1; + 2078 : 86; + 2079 : A5; + 207A : 5D; + 207B : E7; + 207C : 28; + 207D : 83; + 207E : 49; + 207F : 0F; + 2080 : DA; + 2081 : A2; + 2082 : A1; + 2083 : 54; + 2084 : 46; + 2085 : 8F; + 2086 : 13; + 2087 : 8F; + 2088 : 52; + 2089 : 43; + 208A : 89; + 208B : CD; + 208C : A5; + 208D : 63; + 208E : 48; + 208F : 10; + 2090 : 03; + 2091 : 20; + 2092 : A1; + 2093 : DE; + 2094 : A5; + 2095 : 5E; + 2096 : 48; + 2097 : C9; + 2098 : 81; + 2099 : 90; + 209A : 07; + 209B : A9; + 209C : C8; + 209D : A0; + 209E : D8; + 209F : 20; + 20A0 : 1B; + 20A1 : DA; + 20A2 : A9; + 20A3 : BC; + 20A4 : A0; + 20A5 : E0; + 20A6 : 20; + 20A7 : 2D; + 20A8 : DF; + 20A9 : 68; + 20AA : C9; + 20AB : 81; + 20AC : 90; + 20AD : 07; + 20AE : A9; + 20AF : 54; + 20B0 : A0; + 20B1 : E0; + 20B2 : 20; + 20B3 : 33; + 20B4 : D7; + 20B5 : 68; + 20B6 : 10; + 20B7 : 03; + 20B8 : 4C; + 20B9 : A1; + 20BA : DE; + 20BB : 60; + 20BC : 0B; + 20BD : 76; + 20BE : B3; + 20BF : 83; + 20C0 : BD; + 20C1 : D3; + 20C2 : 79; + 20C3 : 1E; + 20C4 : F4; + 20C5 : A6; + 20C6 : F5; + 20C7 : 7B; + 20C8 : 83; + 20C9 : FC; + 20CA : B0; + 20CB : 10; + 20CC : 7C; + 20CD : 0C; + 20CE : 1F; + 20CF : 67; + 20D0 : CA; + 20D1 : 7C; + 20D2 : DE; + 20D3 : 53; + 20D4 : CB; + 20D5 : C1; + 20D6 : 7D; + 20D7 : 14; + 20D8 : 64; + 20D9 : 70; + 20DA : 4C; + 20DB : 7D; + 20DC : B7; + 20DD : EA; + 20DE : 51; + 20DF : 7A; + 20E0 : 7D; + 20E1 : 63; + 20E2 : 30; + 20E3 : 88; + [20E4..20E5] : 7E; + 20E6 : 92; + 20E7 : 44; + 20E8 : 99; + 20E9 : 3A; + 20EA : 7E; + 20EB : 4C; + 20EC : CC; + 20ED : 91; + 20EE : C7; + 20EF : 7F; + [20F0..20F2] : AA; + 20F3 : 13; + 20F4 : 81; + [20F5..20F8] : 00; + 20F9 : E6; + 20FA : 77; + 20FB : D0; + 20FC : 02; + 20FD : E6; + 20FE : 78; + 20FF : AD; + 2100 : 60; + 2101 : EA; + 2102 : C9; + 2103 : 3A; + 2104 : B0; + 2105 : 0A; + 2106 : C9; + 2107 : 20; + 2108 : F0; + 2109 : EF; + 210A : 38; + 210B : E9; + 210C : 30; + 210D : 38; + 210E : E9; + 210F : D0; + 2110 : 60; + 2111 : 80; + 2112 : 4F; + 2113 : C7; + 2114 : 52; + 2115 : 58; + 2116 : A2; + 2117 : FB; + 2118 : 9A; + 2119 : A9; + 211A : 4C; + 211B : 85; + 211C : 51; + 211D : 85; + 211E : 00; + 211F : A9; + 2120 : 23; + 2121 : A0; + 2122 : D1; + 2123 : 85; + 2124 : 01; + 2125 : 84; + 2126 : 02; + 2127 : A9; + 2128 : 28; + 2129 : 85; + 212A : 0F; + 212B : A9; + 212C : 1E; + 212D : 85; + 212E : 10; + 212F : A2; + 2130 : 1C; + 2131 : BD; + 2132 : F8; + 2133 : E0; + 2134 : 95; + 2135 : 6F; + 2136 : CA; + 2137 : D0; + 2138 : F8; + 2139 : A9; + 213A : 03; + 213B : 85; + 213C : 50; + 213D : 8A; + 213E : 85; + 213F : 65; + 2140 : 85; + 2141 : 0E; + 2142 : 85; + 2143 : 15; + 2144 : 48; + 2145 : 85; + 2146 : 0D; + 2147 : E8; + 2148 : 8E; + 2149 : FD; + 214A : 01; + 214B : 8E; + 214C : FC; + 214D : 01; + 214E : A2; + 214F : 16; + 2150 : 86; + 2151 : 13; + 2152 : A0; + 2153 : 04; + 2154 : 85; + 2155 : 28; + 2156 : 84; + 2157 : 29; + 2158 : 85; + 2159 : 11; + 215A : 84; + 215B : 12; + 215C : A8; + 215D : E6; + 215E : 11; + 215F : D0; + 2160 : 04; + 2161 : E6; + 2162 : 12; + 2163 : 30; + 2164 : 0F; + 2165 : A9; + 2166 : 55; + 2167 : 91; + 2168 : 11; + 2169 : D1; + 216A : 11; + 216B : D0; + 216C : 07; + 216D : 0A; + 216E : 91; + 216F : 11; + 2170 : D1; + 2171 : 11; + 2172 : F0; + 2173 : E9; + 2174 : A5; + 2175 : 11; + 2176 : A4; + 2177 : 12; + 2178 : 85; + 2179 : 34; + 217A : 84; + 217B : 35; + 217C : 85; + 217D : 30; + 217E : 84; + 217F : 31; + 2180 : A2; + 2181 : 00; + 2182 : A0; + 2183 : 04; + 2184 : 86; + 2185 : 28; + 2186 : 84; + 2187 : 29; + 2188 : A0; + 2189 : 00; + 218A : 98; + 218B : 91; + 218C : 28; + 218D : E6; + 218E : 28; + 218F : A5; + 2190 : 28; + 2191 : A4; + 2192 : 29; + 2193 : 20; + 2194 : 28; + 2195 : C3; + 2196 : A9; + 2197 : C4; + 2198 : A0; + 2199 : E1; + 219A : 20; + 219B : 1C; + 219C : CA; + 219D : A5; + 219E : 34; + 219F : 38; + 21A0 : E5; + 21A1 : 28; + 21A2 : AA; + 21A3 : A5; + 21A4 : 35; + 21A5 : E5; + 21A6 : 29; + 21A7 : 20; + 21A8 : D9; + 21A9 : DC; + 21AA : A9; + 21AB : B7; + 21AC : A0; + 21AD : E1; + 21AE : 20; + 21AF : 1C; + 21B0 : CA; + 21B1 : 20; + 21B2 : 5D; + 21B3 : C5; + 21B4 : 4C; + 21B5 : 89; + 21B6 : C3; + 21B7 : 20; + 21B8 : 42; + 21B9 : 59; + 21BA : 54; + 21BB : 45; + 21BC : 53; + 21BD : 20; + 21BE : 46; + 21BF : 52; + [21C0..21C1] : 45; + 21C2 : 0D; + 21C3 : 00; + [21C4..21C6] : 23; + 21C7 : 20; + 21C8 : 43; + 21C9 : 4F; + [21CA..21CB] : 4D; + 21CC : 4F; + 21CD : 44; + 21CE : 4F; + 21CF : 52; + 21D0 : 45; + 21D1 : 20; + 21D2 : 42; + 21D3 : 41; + 21D4 : 53; + 21D5 : 49; + 21D6 : 43; + 21D7 : 20; + [21D8..21DA] : 23; + [21DB..21DC] : 0D; + 21DD : 00; + 21DE : A9; + 21DF : 7F; + 21E0 : 8D; + 21E1 : 4E; + 21E2 : E8; + 21E3 : A2; + 21E4 : 6D; + 21E5 : A9; + 21E6 : 00; + 21E7 : 95; + 21E8 : 8D; + 21E9 : CA; + 21EA : 10; + 21EB : FB; + 21EC : A9; + 21ED : 2E; + 21EE : 85; + 21EF : 90; + 21F0 : A9; + 21F1 : E6; + 21F2 : 85; + 21F3 : 91; + 21F4 : A9; + 21F5 : 03; + 21F6 : 85; + 21F7 : B0; + 21F8 : A9; + 21F9 : 0F; + 21FA : 8D; + 21FB : 10; + 21FC : E8; + 21FD : 0A; + 21FE : 8D; + 21FF : 40; + 2200 : E8; + 2201 : 8D; + 2202 : 42; + 2203 : E8; + 2204 : 8E; + 2205 : 22; + 2206 : E8; + 2207 : 8E; + 2208 : 45; + 2209 : E8; + 220A : A9; + 220B : 3D; + 220C : 8D; + 220D : 13; + 220E : E8; + 220F : 2C; + 2210 : 12; + 2211 : E8; + 2212 : A9; + 2213 : 3C; + 2214 : 8D; + 2215 : 21; + 2216 : E8; + 2217 : 8D; + 2218 : 23; + 2219 : E8; + 221A : 8D; + 221B : 11; + 221C : E8; + 221D : 8E; + 221E : 22; + 221F : E8; + 2220 : A9; + 2221 : 0C; + 2222 : 8D; + 2223 : 4C; + 2224 : E8; + 2225 : 85; + 2226 : A8; + 2227 : 85; + 2228 : A7; + 2229 : A0; + 222A : 83; + 222B : A2; + 222C : 18; + 222D : 94; + [222E..222F] : E0; + 2230 : 14; + 2231 : F0; + 2232 : 08; + 2233 : E0; + 2234 : 0D; + 2235 : F0; + 2236 : 04; + 2237 : E0; + 2238 : 07; + 2239 : D0; + 223A : 01; + 223B : 88; + 223C : CA; + 223D : 10; + 223E : EE; + 223F : 84; + 2240 : C5; + 2241 : E8; + 2242 : 86; + 2243 : 9F; + 2244 : 86; + 2245 : C4; + 2246 : A9; + 2247 : 20; + 2248 : 9D; + 2249 : 00; + 224A : 80; + 224B : 9D; + 224C : 00; + 224D : 81; + 224E : 9D; + 224F : 00; + 2250 : 82; + 2251 : 9D; + 2252 : 00; + 2253 : 83; + 2254 : CA; + 2255 : D0; + 2256 : F1; + 2257 : A0; + 2258 : 00; + 2259 : 84; + 225A : C6; + 225B : 84; + 225C : D8; + 225D : A6; + 225E : D8; + 225F : B5; + 2260 : E0; + 2261 : 09; + 2262 : 80; + 2263 : 85; + 2264 : C5; + 2265 : BD; + 2266 : 48; + 2267 : E7; + 2268 : 85; + 2269 : C4; + 226A : A9; + 226B : 27; + 226C : 85; + 226D : D5; + 226E : E0; + 226F : 18; + 2270 : F0; + 2271 : 08; + 2272 : B5; + 2273 : E1; + 2274 : 30; + 2275 : 04; + 2276 : A9; + 2277 : 4F; + 2278 : 85; + 2279 : D5; + 227A : A5; + 227B : C6; + 227C : C9; + 227D : 28; + 227E : 90; + 227F : 04; + 2280 : E9; + 2281 : 28; + 2282 : 85; + 2283 : C6; + 2284 : 60; + 2285 : AC; + 2286 : 6F; + 2287 : 02; + 2288 : A2; + 2289 : 00; + 228A : BD; + 228B : 70; + 228C : 02; + 228D : 9D; + 228E : 6F; + 228F : 02; + 2290 : E8; + 2291 : E4; + 2292 : 9E; + 2293 : D0; + 2294 : F5; + 2295 : C6; + 2296 : 9E; + 2297 : 98; + 2298 : 58; + 2299 : 60; + 229A : 20; + 229B : D8; + 229C : E3; + 229D : A5; + 229E : 9E; + 229F : 85; + 22A0 : A7; + 22A1 : F0; + 22A2 : FA; + 22A3 : 78; + 22A4 : A5; + 22A5 : AA; + 22A6 : F0; + 22A7 : 09; + 22A8 : A5; + 22A9 : A9; + 22AA : A0; + 22AB : 00; + 22AC : 84; + 22AD : AA; + 22AE : 20; + 22AF : EA; + 22B0 : E6; + 22B1 : 20; + 22B2 : 85; + 22B3 : E2; + 22B4 : C9; + 22B5 : 83; + 22B6 : D0; + 22B7 : 10; + 22B8 : 78; + 22B9 : A2; + 22BA : 09; + 22BB : 86; + 22BC : 9E; + 22BD : BD; + 22BE : 60; + 22BF : E7; + 22C0 : 9D; + 22C1 : 6E; + 22C2 : 02; + 22C3 : CA; + 22C4 : D0; + 22C5 : F7; + 22C6 : F0; + 22C7 : D5; + 22C8 : C9; + 22C9 : 0D; + 22CA : D0; + 22CB : CE; + 22CC : A4; + 22CD : D5; + 22CE : 84; + 22CF : AC; + 22D0 : B1; + 22D1 : C4; + 22D2 : C9; + 22D3 : 20; + 22D4 : D0; + 22D5 : 03; + 22D6 : 88; + 22D7 : D0; + 22D8 : F7; + 22D9 : C8; + 22DA : 84; + 22DB : A1; + 22DC : A0; + 22DD : 00; + 22DE : 84; + 22DF : C6; + 22E0 : 84; + 22E1 : CD; + 22E2 : A5; + 22E3 : A3; + 22E4 : 30; + 22E5 : 16; + 22E6 : C5; + 22E7 : D8; + 22E8 : D0; + 22E9 : 12; + 22EA : A5; + 22EB : A4; + 22EC : 85; + 22ED : C6; + 22EE : C5; + 22EF : A1; + 22F0 : 90; + 22F1 : 0A; + 22F2 : B0; + 22F3 : 2B; + 22F4 : 98; + 22F5 : 48; + 22F6 : 8A; + 22F7 : 48; + 22F8 : A5; + 22F9 : AC; + 22FA : F0; + 22FB : A1; + 22FC : A4; + 22FD : C6; + 22FE : B1; + 22FF : C4; + 2300 : 85; + 2301 : D9; + 2302 : 29; + 2303 : 3F; + 2304 : 06; + 2305 : D9; + 2306 : 24; + 2307 : D9; + 2308 : 10; + 2309 : 02; + 230A : 09; + 230B : 80; + 230C : 90; + 230D : 04; + 230E : A6; + 230F : CD; + 2310 : D0; + 2311 : 04; + 2312 : 70; + 2313 : 02; + 2314 : 09; + 2315 : 40; + 2316 : E6; + 2317 : C6; + 2318 : 20; + 2319 : 3F; + 231A : E3; + 231B : C4; + 231C : A1; + 231D : D0; + 231E : 11; + 231F : A9; + 2320 : 00; + 2321 : 85; + 2322 : AC; + 2323 : A9; + 2324 : 0D; + 2325 : A6; + 2326 : B0; + 2327 : E0; + 2328 : 03; + 2329 : F0; + 232A : 03; + 232B : 20; + 232C : D8; + 232D : E3; + 232E : A9; + 232F : 0D; + 2330 : 85; + 2331 : D9; + 2332 : 68; + 2333 : AA; + 2334 : 68; + 2335 : A8; + 2336 : A5; + 2337 : D9; + 2338 : C9; + 2339 : DE; + 233A : D0; + 233B : 02; + 233C : A9; + 233D : FF; + 233E : 60; + 233F : C9; + 2340 : 22; + 2341 : D0; + 2342 : 08; + 2343 : A5; + 2344 : CD; + 2345 : 49; + 2346 : 01; + 2347 : 85; + 2348 : CD; + 2349 : A9; + 234A : 22; + 234B : 60; + 234C : 09; + 234D : 40; + 234E : A6; + 234F : 9F; + 2350 : F0; + 2351 : 02; + 2352 : 09; + 2353 : 80; + 2354 : A6; + 2355 : DC; + 2356 : F0; + 2357 : 02; + 2358 : C6; + 2359 : DC; + 235A : 20; + 235B : EA; + [235C..235D] : E6; + 235E : C6; + 235F : A4; + 2360 : D5; + 2361 : C4; + 2362 : C6; + 2363 : B0; + 2364 : 19; + 2365 : A6; + 2366 : D8; + 2367 : C0; + 2368 : 4F; + 2369 : D0; + 236A : 0C; + 236B : 20; + 236C : 8B; + 236D : E3; + 236E : 20; + 236F : 19; + 2370 : E5; + 2371 : A9; + 2372 : 00; + 2373 : 85; + 2374 : C6; + 2375 : F0; + 2376 : 07; + 2377 : E0; + 2378 : 18; + 2379 : D0; + 237A : 1B; + 237B : 20; + 237C : 9C; + 237D : E3; + 237E : 68; + 237F : A8; + 2380 : A5; + 2381 : DC; + 2382 : F0; + 2383 : 02; + 2384 : 46; + 2385 : CD; + 2386 : 68; + 2387 : AA; + 2388 : 68; + 2389 : 58; + 238A : 60; + 238B : E0; + 238C : 17; + 238D : B0; + 238E : 06; + 238F : B5; + 2390 : E2; + 2391 : 09; + 2392 : 80; + 2393 : 95; + 2394 : E2; + 2395 : 60; + 2396 : 20; + 2397 : A3; + 2398 : E3; + 2399 : 4C; + 239A : 7E; + 239B : E3; + 239C : 20; + 239D : 3F; + 239E : E5; + 239F : C6; + 23A0 : D8; + 23A1 : A6; + 23A2 : D8; + 23A3 : 16; + 23A4 : E1; + 23A5 : 56; + 23A6 : E1; + 23A7 : 20; + 23A8 : 8B; + 23A9 : E3; + 23AA : A5; + 23AB : C6; + 23AC : 48; + 23AD : 20; + 23AE : 5D; + 23AF : E2; + 23B0 : 68; + 23B1 : 85; + 23B2 : C6; + 23B3 : 60; + 23B4 : A0; + 23B5 : 27; + 23B6 : A6; + 23B7 : D8; + 23B8 : D0; + 23B9 : 06; + 23BA : 86; + 23BB : C6; + [23BC..23BD] : 68; + 23BE : D0; + 23BF : BE; + 23C0 : B5; + 23C1 : DF; + 23C2 : 30; + 23C3 : 05; + 23C4 : CA; + 23C5 : B5; + 23C6 : DF; + 23C7 : A0; + 23C8 : 4F; + 23C9 : CA; + 23CA : 86; + 23CB : D8; + 23CC : 85; + 23CD : C5; + 23CE : BD; + 23CF : 48; + 23D0 : E7; + 23D1 : 85; + 23D2 : C4; + 23D3 : 84; + 23D4 : C6; + 23D5 : 84; + 23D6 : D5; + 23D7 : 60; + 23D8 : 48; + 23D9 : 85; + 23DA : D9; + 23DB : 8A; + 23DC : 48; + 23DD : 98; + 23DE : 48; + 23DF : A9; + 23E0 : 00; + 23E1 : 85; + 23E2 : AC; + 23E3 : A4; + 23E4 : C6; + 23E5 : A5; + 23E6 : D9; + 23E7 : 10; + 23E8 : 03; + 23E9 : 4C; + 23EA : 7A; + 23EB : E4; + 23EC : C9; + 23ED : 0D; + 23EE : D0; + 23EF : 03; + 23F0 : 4C; + 23F1 : 2F; + 23F2 : E5; + 23F3 : C9; + 23F4 : 20; + 23F5 : 90; + 23F6 : 08; + 23F7 : 29; + 23F8 : 3F; + 23F9 : 20; + 23FA : 3F; + 23FB : E3; + 23FC : 4C; + 23FD : 4E; + 23FE : E3; + 23FF : A6; + 2400 : DC; + 2401 : F0; + 2402 : 03; + 2403 : 4C; + 2404 : 52; + 2405 : E3; + 2406 : C9; + 2407 : 14; + 2408 : D0; + 2409 : 1C; + 240A : 88; + 240B : 84; + 240C : C6; + 240D : 10; + 240E : 06; + 240F : 20; + 2410 : B4; + 2411 : E3; + 2412 : 4C; + 2413 : 20; + 2414 : E4; + 2415 : C8; + 2416 : B1; + 2417 : C4; + 2418 : 88; + 2419 : 91; + 241A : C4; + 241B : C8; + 241C : C4; + 241D : D5; + 241E : D0; + 241F : F5; + 2420 : A9; + 2421 : 20; + 2422 : 91; + 2423 : C4; + 2424 : D0; + 2425 : 3C; + 2426 : A6; + 2427 : CD; + 2428 : F0; + 2429 : 03; + 242A : 4C; + 242B : 52; + 242C : E3; + 242D : C9; + 242E : 12; + 242F : D0; + 2430 : 02; + 2431 : 85; + 2432 : 9F; + 2433 : C9; + 2434 : 13; + 2435 : D0; + 2436 : 03; + 2437 : 20; + 2438 : 57; + 2439 : E2; + 243A : C9; + 243B : 1D; + 243C : D0; + 243D : 12; + 243E : C8; + 243F : 84; + 2440 : C6; + 2441 : 88; + 2442 : C4; + 2443 : D5; + 2444 : 90; + 2445 : 07; + 2446 : 20; + 2447 : 19; + 2448 : E5; + 2449 : A0; + 244A : 00; + 244B : 84; + 244C : C6; + 244D : 4C; + 244E : 7E; + 244F : E3; + 2450 : C9; + 2451 : 11; + 2452 : D0; + 2453 : 0E; + 2454 : 18; + 2455 : 98; + 2456 : 69; + 2457 : 28; + 2458 : A8; + 2459 : C5; + 245A : D5; + 245B : 90; + 245C : EE; + 245D : F0; + 245E : EC; + 245F : 20; + 2460 : 19; + 2461 : E5; + 2462 : 4C; + 2463 : 7E; + 2464 : E3; + 2465 : E8; + 2466 : 85; + 2467 : D8; + 2468 : 98; + 2469 : E9; + 246A : 28; + 246B : 85; + 246C : C6; + 246D : E6; + 246E : D8; + 246F : AD; + 2470 : 48; + 2471 : E7; + 2472 : 85; + 2473 : C4; + 2474 : A5; + 2475 : E0; + 2476 : 85; + 2477 : C5; + 2478 : D0; + 2479 : E8; + 247A : 29; + 247B : 7F; + 247C : C9; + 247D : 7F; + 247E : D0; + 247F : 02; + 2480 : A9; + 2481 : 5E; + 2482 : C9; + 2483 : 20; + 2484 : 90; + 2485 : 03; + [2486..2487] : 4C; + 2488 : E3; + 2489 : C9; + 248A : 0D; + 248B : D0; + 248C : 03; + 248D : 4C; + 248E : 2F; + 248F : E5; + 2490 : A6; + 2491 : CD; + 2492 : D0; + 2493 : 30; + 2494 : C9; + 2495 : 14; + 2496 : D0; + 2497 : 28; + 2498 : A4; + 2499 : D5; + 249A : B1; + 249B : C4; + 249C : C9; + 249D : 20; + 249E : D0; + 249F : 04; + 24A0 : C4; + 24A1 : C6; + 24A2 : D0; + 24A3 : 07; + 24A4 : C0; + 24A5 : 4F; + 24A6 : F0; + 24A7 : BA; + 24A8 : 20; + 24A9 : BA; + 24AA : E5; + 24AB : A4; + 24AC : D5; + 24AD : 88; + 24AE : B1; + 24AF : C4; + 24B0 : C8; + 24B1 : 91; + 24B2 : C4; + 24B3 : 88; + 24B4 : C4; + 24B5 : C6; + 24B6 : D0; + 24B7 : F5; + 24B8 : A9; + 24B9 : 20; + 24BA : 91; + 24BB : C4; + 24BC : E6; + 24BD : DC; + 24BE : D0; + 24BF : 56; + 24C0 : A6; + 24C1 : DC; + 24C2 : F0; + 24C3 : 05; + 24C4 : 09; + 24C5 : 40; + 24C6 : 4C; + 24C7 : 52; + 24C8 : E3; + 24C9 : C9; + 24CA : 11; + 24CB : D0; + 24CC : 2B; + 24CD : A5; + 24CE : C6; + 24CF : C9; + 24D0 : 28; + 24D1 : 90; + 24D2 : 06; + 24D3 : E9; + 24D4 : 28; + 24D5 : 85; + 24D6 : C6; + 24D7 : B0; + 24D8 : 3D; + 24D9 : A6; + 24DA : D8; + 24DB : F0; + 24DC : 39; + 24DD : B5; + 24DE : DF; + 24DF : 10; + 24E0 : 07; + 24E1 : C6; + 24E2 : D8; + 24E3 : 20; + 24E4 : 5D; + 24E5 : E2; + 24E6 : 90; + 24E7 : 2E; + [24E8..24E9] : CA; + 24EA : 86; + 24EB : D8; + 24EC : 20; + 24ED : 5D; + 24EE : E2; + 24EF : A5; + 24F0 : C6; + 24F1 : 18; + 24F2 : 69; + 24F3 : 28; + 24F4 : 85; + 24F5 : C6; + 24F6 : D0; + 24F7 : 1E; + 24F8 : C9; + 24F9 : 12; + 24FA : D0; + 24FB : 04; + 24FC : A9; + 24FD : 00; + 24FE : 85; + 24FF : 9F; + 2500 : C9; + 2501 : 1D; + 2502 : D0; + 2503 : 0B; + 2504 : 88; + 2505 : 84; + 2506 : C6; + 2507 : 10; + 2508 : 0D; + 2509 : 20; + 250A : B4; + 250B : E3; + 250C : 4C; + 250D : 7E; + 250E : E3; + 250F : C9; + 2510 : 13; + 2511 : D0; + 2512 : 03; + 2513 : 20; + 2514 : 29; + 2515 : E2; + 2516 : 4C; + 2517 : 7E; + 2518 : E3; + 2519 : 38; + 251A : 46; + 251B : A3; + 251C : A6; + 251D : D8; + 251E : E8; + 251F : E0; + 2520 : 19; + 2521 : D0; + 2522 : 03; + 2523 : 20; + 2524 : 3F; + 2525 : E5; + 2526 : B5; + 2527 : E0; + 2528 : 10; + 2529 : F4; + 252A : 86; + 252B : D8; + 252C : 4C; + 252D : 5D; + 252E : E2; + 252F : A9; + 2530 : 00; + 2531 : 85; + 2532 : DC; + 2533 : 85; + 2534 : 9F; + 2535 : 85; + 2536 : CD; + 2537 : 85; + 2538 : C6; + 2539 : 20; + 253A : 19; + 253B : E5; + 253C : 4C; + 253D : 7E; + 253E : E3; + 253F : 78; + 2540 : A0; + 2541 : 00; + 2542 : 84; + 2543 : C4; + 2544 : A9; + 2545 : 80; + 2546 : 85; + 2547 : C8; + 2548 : 85; + 2549 : C5; + 254A : A9; + 254B : 28; + 254C : 24; + 254D : E1; + 254E : 30; + 254F : 02; + 2550 : A9; + 2551 : 50; + 2552 : 85; + 2553 : C7; + 2554 : A9; + 2555 : 34; + 2556 : 8D; + 2557 : 11; + 2558 : E8; + 2559 : B1; + 255A : C7; + 255B : 91; + 255C : C4; + 255D : C8; + 255E : D0; + 255F : F9; + 2560 : E6; + 2561 : C8; + 2562 : E6; + 2563 : C5; + 2564 : A9; + 2565 : 84; + 2566 : C5; + 2567 : C8; + 2568 : D0; + 2569 : EF; + 256A : A9; + 256B : E8; + 256C : 85; + 256D : C4; + 256E : C6; + 256F : C5; + 2570 : A9; + 2571 : 20; + 2572 : C6; + 2573 : C4; + 2574 : C6; + 2575 : C7; + 2576 : 91; + 2577 : C4; + 2578 : D0; + 2579 : F8; + 257A : A2; + 257B : 19; + 257C : 86; + 257D : D8; + 257E : A2; + 257F : 00; + 2580 : C6; + 2581 : D8; + 2582 : B5; + 2583 : E0; + 2584 : 29; + 2585 : 7F; + 2586 : B4; + 2587 : E1; + 2588 : 10; + 2589 : 02; + 258A : 09; + 258B : 80; + 258C : 95; + 258D : E0; + 258E : E8; + 258F : E0; + 2590 : 19; + 2591 : D0; + 2592 : EF; + 2593 : A9; + 2594 : 83; + 2595 : 85; + 2596 : F8; + 2597 : A5; + 2598 : E0; + 2599 : 10; + 259A : E3; + 259B : A9; + 259C : 3C; + 259D : 8D; + 259E : 11; + 259F : E8; + 25A0 : 58; + 25A1 : A9; + 25A2 : FE; + 25A3 : CD; + 25A4 : 12; + 25A5 : E8; + 25A6 : D0; + 25A7 : 0F; + 25A8 : A0; + 25A9 : 08; + 25AA : 8D; + 25AB : 45; + 25AC : E8; + 25AD : 2C; + 25AE : 4D; + 25AF : E8; + 25B0 : 50; + 25B1 : FB; + 25B2 : 88; + 25B3 : D0; + 25B4 : F5; + 25B5 : 84; + 25B6 : 9E; + 25B7 : A6; + 25B8 : D8; + 25B9 : 60; + 25BA : A6; + 25BB : D8; + 25BC : E8; + 25BD : 78; + 25BE : A9; + 25BF : 34; + 25C0 : 8D; + 25C1 : 11; + 25C2 : E8; + 25C3 : E0; + 25C4 : 18; + 25C5 : F0; + 25C6 : 33; + 25C7 : 90; + 25C8 : 03; + 25C9 : 4C; + 25CA : 9C; + 25CB : E3; + 25CC : A2; + 25CD : 17; + 25CE : B5; + 25CF : E1; + 25D0 : 09; + 25D1 : 80; + 25D2 : 85; + 25D3 : C8; + 25D4 : B4; + 25D5 : E0; + 25D6 : 30; + 25D7 : 02; + 25D8 : 29; + 25D9 : 7F; + 25DA : 95; + 25DB : E1; + 25DC : 98; + 25DD : 09; + 25DE : 80; + 25DF : 85; + 25E0 : C5; + 25E1 : A0; + 25E2 : 27; + 25E3 : BD; + 25E4 : 49; + 25E5 : E7; + 25E6 : 85; + 25E7 : C7; + 25E8 : BD; + 25E9 : 48; + 25EA : E7; + 25EB : 85; + 25EC : C4; + 25ED : B1; + 25EE : C4; + 25EF : 91; + 25F0 : C7; + 25F1 : 88; + 25F2 : 10; + 25F3 : F9; + 25F4 : CA; + 25F5 : E4; + 25F6 : D8; + 25F7 : D0; + 25F8 : D5; + 25F9 : E8; + 25FA : B5; + 25FB : E0; + 25FC : 09; + 25FD : 80; + 25FE : 85; + 25FF : C5; + 2600 : 29; + 2601 : 7F; + 2602 : 95; + 2603 : E0; + 2604 : BD; + 2605 : 48; + 2606 : E7; + 2607 : 85; + 2608 : C4; + 2609 : A0; + 260A : 27; + 260B : A9; + 260C : 20; + 260D : 91; + 260E : C4; + 260F : 88; + 2610 : 10; + 2611 : FB; + 2612 : A9; + 2613 : 3C; + 2614 : 8D; + 2615 : 11; + 2616 : E8; + 2617 : 58; + 2618 : 4C; + 2619 : 5D; + 261A : E2; + 261B : 48; + 261C : 8A; + 261D : 48; + 261E : 98; + 261F : 48; + 2620 : BA; + 2621 : BD; + 2622 : 04; + 2623 : 01; + 2624 : 29; + 2625 : 10; + 2626 : F0; + 2627 : 03; + 2628 : 6C; + 2629 : 92; + 262A : 00; + 262B : 6C; + 262C : 90; + 262D : 00; + 262E : 20; + 262F : EA; + 2630 : FF; + 2631 : A5; + 2632 : A7; + 2633 : D0; + 2634 : 18; + 2635 : C6; + 2636 : A8; + 2637 : D0; + 2638 : 14; + 2639 : A9; + 263A : 14; + 263B : 85; + 263C : A8; + 263D : A4; + 263E : C6; + 263F : 46; + 2640 : AA; + 2641 : B1; + 2642 : C4; + 2643 : B0; + 2644 : 04; + 2645 : E6; + 2646 : AA; + 2647 : 85; + 2648 : A9; + 2649 : 49; + 264A : 80; + 264B : 91; + 264C : C4; + 264D : A2; + 264E : FF; + 264F : 86; + 2650 : A6; + 2651 : E8; + 2652 : 86; + 2653 : 98; + 2654 : A2; + 2655 : 50; + 2656 : AD; + 2657 : 10; + 2658 : E8; + 2659 : 29; + 265A : F0; + 265B : 8D; + 265C : 10; + 265D : E8; + 265E : A0; + 265F : 00; + 2660 : AD; + 2661 : 10; + 2662 : E8; + [2663..2665] : 0A; + 2666 : 10; + 2667 : 06; + 2668 : 84; + 2669 : F9; + 266A : A9; + 266B : 3D; + 266C : D0; + 266D : 06; + 266E : A5; + 266F : F9; + 2670 : D0; + 2671 : 05; + 2672 : A9; + 2673 : 35; + 2674 : 8D; + 2675 : 13; + 2676 : E8; + 2677 : 90; + 2678 : 09; + 2679 : 84; + 267A : FA; + 267B : AD; + 267C : 40; + 267D : E8; + 267E : 09; + 267F : 10; + 2680 : D0; + 2681 : 09; + 2682 : A5; + 2683 : FA; + 2684 : D0; + 2685 : 08; + 2686 : AD; + 2687 : 40; + 2688 : E8; + 2689 : 29; + 268A : EF; + 268B : 8D; + 268C : 40; + 268D : E8; + 268E : A0; + 268F : 08; + 2690 : AD; + 2691 : 12; + 2692 : E8; + 2693 : CD; + 2694 : 12; + 2695 : E8; + 2696 : D0; + 2697 : F6; + 2698 : 4A; + 2699 : B0; + 269A : 1C; + 269B : 48; + 269C : BD; + 269D : F7; + 269E : E6; + 269F : D0; + 26A0 : 06; + 26A1 : A9; + 26A2 : 01; + 26A3 : 85; + 26A4 : 98; + 26A5 : D0; + 26A6 : 0F; + 26A7 : C9; + 26A8 : FF; + 26A9 : F0; + 26AA : 0B; + 26AB : C9; + 26AC : 3C; + 26AD : D0; + 26AE : 05; + 26AF : 2C; + 26B0 : 11; + 26B1 : E8; + 26B2 : 30; + 26B3 : 02; + 26B4 : 86; + 26B5 : A6; + 26B6 : 68; + 26B7 : CA; + 26B8 : F0; + 26B9 : 08; + 26BA : 88; + 26BB : D0; + 26BC : DB; + 26BD : EE; + 26BE : 10; + 26BF : E8; + 26C0 : D0; + 26C1 : CC; + 26C2 : A5; + 26C3 : A6; + 26C4 : C5; + 26C5 : 97; + 26C6 : F0; + 26C7 : 1C; + 26C8 : 85; + 26C9 : 97; + 26CA : AA; + 26CB : 30; + 26CC : 17; + 26CD : BD; + 26CE : F7; + 26CF : E6; + 26D0 : 46; + 26D1 : 98; + 26D2 : 90; + 26D3 : 02; + 26D4 : 09; + 26D5 : 80; + 26D6 : A6; + 26D7 : 9E; + 26D8 : 9D; + 26D9 : 6F; + 26DA : 02; + 26DB : E8; + 26DC : E0; + 26DD : 0A; + 26DE : D0; + 26DF : 02; + 26E0 : A2; + 26E1 : 00; + 26E2 : 86; + 26E3 : 9E; + 26E4 : 68; + 26E5 : A8; + 26E6 : 68; + 26E7 : AA; + 26E8 : 68; + 26E9 : 40; + 26EA : A8; + 26EB : AD; + 26EC : 40; + 26ED : E8; + 26EE : 29; + 26EF : 20; + 26F0 : D0; + 26F1 : F9; + 26F2 : 98; + 26F3 : A4; + 26F4 : C6; + 26F5 : 91; + 26F6 : C4; + 26F7 : 60; + 26F8 : 3D; + 26F9 : 2E; + 26FA : FF; + 26FB : 03; + 26FC : 3C; + 26FD : 20; + 26FE : 5B; + 26FF : 12; + 2700 : 2D; + 2701 : 30; + 2702 : 00; + 2703 : 3E; + 2704 : FF; + 2705 : 5D; + 2706 : 40; + 2707 : 00; + 2708 : 2B; + 2709 : 32; + 270A : FF; + 270B : 3F; + 270C : 2C; + 270D : 4E; + 270E : 56; + 270F : 58; + 2710 : 33; + 2711 : 31; + 2712 : 0D; + 2713 : 3B; + 2714 : 4D; + 2715 : 42; + 2716 : 43; + 2717 : 5A; + 2718 : 2A; + 2719 : 35; + 271A : FF; + 271B : 3A; + 271C : 4B; + 271D : 48; + 271E : 46; + 271F : 53; + 2720 : 36; + 2721 : 34; + 2722 : FF; + 2723 : 4C; + 2724 : 4A; + 2725 : 47; + 2726 : 44; + 2727 : 41; + 2728 : 2F; + 2729 : 38; + 272A : FF; + 272B : 50; + 272C : 49; + 272D : 59; + 272E : 52; + 272F : 57; + 2730 : 39; + 2731 : 37; + 2732 : 5E; + 2733 : 4F; + 2734 : 55; + 2735 : 54; + 2736 : 45; + 2737 : 51; + 2738 : 14; + 2739 : 11; + 273A : FF; + 273B : 29; + 273C : 5C; + 273D : 27; + 273E : 24; + 273F : 22; + 2740 : 1D; + 2741 : 13; + 2742 : 5F; + 2743 : 28; + 2744 : 26; + 2745 : 25; + 2746 : 23; + 2747 : 21; + 2748 : 00; + 2749 : 28; + 274A : 50; + 274B : 78; + 274C : A0; + 274D : C8; + 274E : F0; + 274F : 18; + 2750 : 40; + 2751 : 68; + 2752 : 90; + 2753 : B8; + 2754 : E0; + 2755 : 08; + 2756 : 30; + 2757 : 58; + 2758 : 80; + 2759 : A8; + 275A : D0; + 275B : F8; + 275C : 20; + 275D : 48; + 275E : 70; + 275F : 98; + 2760 : C0; + 2761 : 4C; + 2762 : 4F; + 2763 : 41; + 2764 : 44; + 2765 : 0D; + 2766 : 52; + 2767 : 55; + 2768 : 4E; + 2769 : 0D; + 276A : A2; + 276B : 01; + 276C : B5; + 276D : FA; + 276E : 48; + 276F : B5; + 2770 : FB; + 2771 : 20; + 2772 : 75; + 2773 : E7; + 2774 : 68; + 2775 : 48; + [2776..2779] : 4A; + 277A : 20; + 277B : 8D; + 277C : E7; + 277D : AA; + 277E : 68; + 277F : 29; + 2780 : 0F; + 2781 : 20; + 2782 : 8D; + 2783 : E7; + 2784 : 48; + 2785 : 8A; + 2786 : 20; + 2787 : D2; + 2788 : FF; + 2789 : 68; + 278A : 4C; + 278B : D2; + 278C : FF; + 278D : 18; + 278E : 69; + 278F : F6; + 2790 : 90; + 2791 : 02; + 2792 : 69; + 2793 : 06; + 2794 : 69; + 2795 : 3A; + 2796 : 60; + 2797 : A2; + 2798 : 02; + 2799 : B5; + 279A : FA; + 279B : 48; + 279C : B5; + 279D : FC; + 279E : 95; + 279F : FA; + 27A0 : 68; + 27A1 : 95; + 27A2 : FC; + 27A3 : CA; + 27A4 : D0; + 27A5 : F3; + 27A6 : 60; + 27A7 : 20; + 27A8 : B6; + 27A9 : E7; + 27AA : 90; + 27AB : 02; + 27AC : 85; + 27AD : FC; + 27AE : 20; + 27AF : B6; + 27B0 : E7; + 27B1 : 90; + 27B2 : 02; + 27B3 : 85; + 27B4 : FB; + 27B5 : 60; + 27B6 : A9; + 27B7 : 00; + 27B8 : 8D; + 27B9 : 00; + 27BA : 01; + 27BB : 20; + 27BC : EB; + 27BD : E7; + 27BE : C9; + 27BF : 20; + 27C0 : D0; + 27C1 : 09; + 27C2 : 20; + 27C3 : EB; + 27C4 : E7; + 27C5 : C9; + 27C6 : 20; + 27C7 : D0; + 27C8 : 0F; + 27C9 : 18; + 27CA : 60; + 27CB : 20; + 27CC : E0; + 27CD : E7; + [27CE..27D1] : 0A; + 27D2 : 8D; + 27D3 : 00; + 27D4 : 01; + 27D5 : 20; + 27D6 : EB; + 27D7 : E7; + 27D8 : 20; + 27D9 : E0; + 27DA : E7; + 27DB : 0D; + 27DC : 00; + 27DD : 01; + 27DE : 38; + 27DF : 60; + 27E0 : C9; + 27E1 : 3A; + 27E2 : 08; + 27E3 : 29; + 27E4 : 0F; + 27E5 : 28; + 27E6 : 90; + 27E7 : 02; + 27E8 : 69; + 27E9 : 08; + 27EA : 60; + 27EB : 20; + 27EC : CF; + 27ED : FF; + 27EE : C9; + 27EF : 0D; + 27F0 : D0; + 27F1 : F8; + [27F2..27F3] : 68; + 27F4 : 4C; + 27F5 : 54; + 27F6 : FD; + 27F7 : A9; + 27F8 : 3F; + 27F9 : 20; + 27FA : D2; + 27FB : FF; + 27FC : 4C; + 27FD : 56; + 27FE : FD; + 27FF : FF; + 2800 : 1C; + 2801 : 22; + 2802 : 4A; + 2803 : 56; + 2804 : 4C; + 2805 : 20; + 2806 : 1E; + 2807 : 00; + 2808 : 18; + 2809 : 24; + 280A : 42; + 280B : 7E; + [280C..280E] : 42; + 280F : 00; + 2810 : 7C; + [2811..2812] : 22; + 2813 : 3C; + [2814..2815] : 22; + 2816 : 7C; + 2817 : 00; + 2818 : 1C; + 2819 : 22; + [281A..281C] : 40; + 281D : 22; + 281E : 1C; + 281F : 00; + 2820 : 78; + 2821 : 24; + [2822..2824] : 22; + 2825 : 24; + 2826 : 78; + 2827 : 00; + 2828 : 7E; + [2829..282A] : 40; + 282B : 78; + [282C..282D] : 40; + 282E : 7E; + 282F : 00; + 2830 : 7E; + [2831..2832] : 40; + 2833 : 78; + [2834..2836] : 40; + 2837 : 00; + 2838 : 1C; + 2839 : 22; + 283A : 40; + 283B : 4E; + 283C : 42; + 283D : 22; + 283E : 1C; + 283F : 00; + [2840..2842] : 42; + 2843 : 7E; + [2844..2846] : 42; + 2847 : 00; + 2848 : 1C; + [2849..284D] : 08; + 284E : 1C; + 284F : 00; + 2850 : 0E; + [2851..2854] : 04; + 2855 : 44; + 2856 : 38; + 2857 : 00; + 2858 : 42; + 2859 : 44; + 285A : 48; + 285B : 70; + 285C : 48; + 285D : 44; + 285E : 42; + 285F : 00; + [2860..2865] : 40; + 2866 : 7E; + 2867 : 00; + 2868 : 42; + 2869 : 66; + [286A..286B] : 5A; + [286C..286E] : 42; + 286F : 00; + 2870 : 42; + 2871 : 62; + 2872 : 52; + 2873 : 4A; + 2874 : 46; + [2875..2876] : 42; + 2877 : 00; + 2878 : 18; + 2879 : 24; + [287A..287C] : 42; + 287D : 24; + 287E : 18; + 287F : 00; + 2880 : 7C; + [2881..2882] : 42; + 2883 : 7C; + [2884..2886] : 40; + 2887 : 00; + 2888 : 18; + 2889 : 24; + [288A..288B] : 42; + 288C : 4A; + 288D : 24; + 288E : 1A; + 288F : 00; + 2890 : 7C; + [2891..2892] : 42; + 2893 : 7C; + 2894 : 48; + 2895 : 44; + 2896 : 42; + 2897 : 00; + 2898 : 3C; + 2899 : 42; + 289A : 40; + 289B : 3C; + 289C : 02; + 289D : 42; + 289E : 3C; + 289F : 00; + 28A0 : 3E; + [28A1..28A6] : 08; + 28A7 : 00; + [28A8..28AD] : 42; + 28AE : 3C; + 28AF : 00; + [28B0..28B2] : 42; + [28B3..28B4] : 24; + [28B5..28B6] : 18; + 28B7 : 00; + [28B8..28BA] : 42; + [28BB..28BC] : 5A; + 28BD : 66; + 28BE : 42; + 28BF : 00; + [28C0..28C1] : 42; + 28C2 : 24; + 28C3 : 18; + 28C4 : 24; + [28C5..28C6] : 42; + 28C7 : 00; + [28C8..28CA] : 22; + 28CB : 1C; + [28CC..28CE] : 08; + 28CF : 00; + 28D0 : 7E; + 28D1 : 02; + 28D2 : 04; + 28D3 : 18; + 28D4 : 20; + 28D5 : 40; + 28D6 : 7E; + 28D7 : 00; + 28D8 : 3C; + [28D9..28DD] : 20; + 28DE : 3C; + [28DF..28E0] : 00; + 28E1 : 40; + 28E2 : 20; + 28E3 : 10; + 28E4 : 08; + 28E5 : 04; + 28E6 : 02; + 28E7 : 00; + 28E8 : 3C; + [28E9..28ED] : 04; + 28EE : 3C; + [28EF..28F0] : 00; + 28F1 : 08; + 28F2 : 1C; + 28F3 : 2A; + [28F4..28F7] : 08; + [28F8..28F9] : 00; + 28FA : 10; + 28FB : 20; + 28FC : 7F; + 28FD : 20; + 28FE : 10; + [28FF..2907] : 00; + [2908..290B] : 08; + [290C..290D] : 00; + 290E : 08; + 290F : 00; + [2910..2912] : 24; + [2913..2917] : 00; + [2918..2919] : 24; + 291A : 7E; + 291B : 24; + 291C : 7E; + [291D..291E] : 24; + 291F : 00; + 2920 : 08; + 2921 : 1E; + 2922 : 28; + 2923 : 1C; + 2924 : 0A; + 2925 : 3C; + 2926 : 08; + [2927..2928] : 00; + 2929 : 62; + 292A : 64; + 292B : 08; + 292C : 10; + 292D : 26; + 292E : 46; + 292F : 00; + 2930 : 30; + [2931..2932] : 48; + 2933 : 30; + 2934 : 4A; + 2935 : 44; + 2936 : 3A; + 2937 : 00; + 2938 : 04; + 2939 : 08; + 293A : 10; + [293B..293F] : 00; + 2940 : 04; + 2941 : 08; + [2942..2944] : 10; + 2945 : 08; + 2946 : 04; + 2947 : 00; + 2948 : 20; + 2949 : 10; + [294A..294C] : 08; + 294D : 10; + 294E : 20; + 294F : 00; + 2950 : 08; + 2951 : 2A; + 2952 : 1C; + 2953 : 3E; + 2954 : 1C; + 2955 : 2A; + 2956 : 08; + [2957..2958] : 00; + [2959..295A] : 08; + 295B : 3E; + [295C..295D] : 08; + [295E..2964] : 00; + [2965..2966] : 08; + 2967 : 10; + [2968..296A] : 00; + 296B : 7E; + [296C..2974] : 00; + [2975..2976] : 18; + [2977..2978] : 00; + 2979 : 02; + 297A : 04; + 297B : 08; + 297C : 10; + 297D : 20; + 297E : 40; + 297F : 00; + 2980 : 3C; + 2981 : 42; + 2982 : 46; + 2983 : 5A; + 2984 : 62; + 2985 : 42; + 2986 : 3C; + 2987 : 00; + 2988 : 08; + 2989 : 18; + 298A : 28; + [298B..298D] : 08; + 298E : 3E; + 298F : 00; + 2990 : 3C; + 2991 : 42; + 2992 : 02; + 2993 : 0C; + 2994 : 30; + 2995 : 40; + 2996 : 7E; + 2997 : 00; + 2998 : 3C; + 2999 : 42; + 299A : 02; + 299B : 1C; + 299C : 02; + 299D : 42; + 299E : 3C; + 299F : 00; + 29A0 : 04; + 29A1 : 0C; + 29A2 : 14; + 29A3 : 24; + 29A4 : 7E; + [29A5..29A6] : 04; + 29A7 : 00; + 29A8 : 7E; + 29A9 : 40; + 29AA : 78; + 29AB : 04; + 29AC : 02; + 29AD : 44; + 29AE : 38; + 29AF : 00; + 29B0 : 1C; + 29B1 : 20; + 29B2 : 40; + 29B3 : 7C; + [29B4..29B5] : 42; + 29B6 : 3C; + 29B7 : 00; + 29B8 : 7E; + 29B9 : 42; + 29BA : 04; + 29BB : 08; + [29BC..29BE] : 10; + 29BF : 00; + 29C0 : 3C; + [29C1..29C2] : 42; + 29C3 : 3C; + [29C4..29C5] : 42; + 29C6 : 3C; + 29C7 : 00; + 29C8 : 3C; + [29C9..29CA] : 42; + 29CB : 3E; + 29CC : 02; + 29CD : 04; + 29CE : 38; + [29CF..29D1] : 00; + 29D2 : 08; + [29D3..29D4] : 00; + 29D5 : 08; + [29D6..29D9] : 00; + 29DA : 08; + [29DB..29DC] : 00; + [29DD..29DE] : 08; + 29DF : 10; + 29E0 : 0E; + 29E1 : 18; + 29E2 : 30; + 29E3 : 60; + 29E4 : 30; + 29E5 : 18; + 29E6 : 0E; + [29E7..29E9] : 00; + 29EA : 7E; + 29EB : 00; + 29EC : 7E; + [29ED..29EF] : 00; + 29F0 : 70; + 29F1 : 18; + 29F2 : 0C; + 29F3 : 06; + 29F4 : 0C; + 29F5 : 18; + 29F6 : 70; + 29F7 : 00; + 29F8 : 3C; + 29F9 : 42; + 29FA : 02; + 29FB : 0C; + 29FC : 10; + 29FD : 00; + 29FE : 10; + [29FF..2A03] : 00; + 2A04 : FF; + [2A05..2A07] : 00; + 2A08 : 08; + 2A09 : 1C; + 2A0A : 3E; + [2A0B..2A0C] : 7F; + 2A0D : 1C; + 2A0E : 3E; + 2A0F : 00; + [2A10..2A17] : 10; + [2A18..2A1A] : 00; + 2A1B : FF; + [2A1C..2A21] : 00; + 2A22 : FF; + [2A23..2A28] : 00; + 2A29 : FF; + [2A2A..2A34] : 00; + 2A35 : FF; + [2A36..2A37] : 00; + [2A38..2A3F] : 20; + [2A40..2A47] : 04; + [2A48..2A4B] : 00; + 2A4C : E0; + 2A4D : 10; + [2A4E..2A52] : 08; + 2A53 : 04; + 2A54 : 03; + [2A55..2A57] : 00; + [2A58..2A5A] : 08; + 2A5B : 10; + 2A5C : E0; + [2A5D..2A5F] : 00; + [2A60..2A66] : 80; + 2A67 : FF; + 2A68 : 80; + 2A69 : 40; + 2A6A : 20; + 2A6B : 10; + 2A6C : 08; + 2A6D : 04; + 2A6E : 02; + [2A6F..2A70] : 01; + 2A71 : 02; + 2A72 : 04; + 2A73 : 08; + 2A74 : 10; + 2A75 : 20; + 2A76 : 40; + 2A77 : 80; + 2A78 : FF; + [2A79..2A7F] : 80; + 2A80 : FF; + [2A81..2A87] : 01; + 2A88 : 00; + 2A89 : 3C; + [2A8A..2A8D] : 7E; + 2A8E : 3C; + [2A8F..2A95] : 00; + 2A96 : FF; + 2A97 : 00; + 2A98 : 36; + [2A99..2A9B] : 7F; + 2A9C : 3E; + 2A9D : 1C; + 2A9E : 08; + 2A9F : 00; + [2AA0..2AA7] : 40; + [2AA8..2AAB] : 00; + 2AAC : 03; + 2AAD : 04; + [2AAE..2AAF] : 08; + 2AB0 : 81; + 2AB1 : 42; + 2AB2 : 24; + [2AB3..2AB4] : 18; + 2AB5 : 24; + 2AB6 : 42; + 2AB7 : 81; + 2AB8 : 00; + 2AB9 : 3C; + [2ABA..2ABD] : 42; + 2ABE : 3C; + 2ABF : 00; + 2AC0 : 08; + 2AC1 : 1C; + 2AC2 : 2A; + 2AC3 : 77; + 2AC4 : 2A; + [2AC5..2AC6] : 08; + 2AC7 : 00; + [2AC8..2ACF] : 02; + 2AD0 : 08; + 2AD1 : 1C; + 2AD2 : 3E; + 2AD3 : 7F; + 2AD4 : 3E; + 2AD5 : 1C; + 2AD6 : 08; + 2AD7 : 00; + [2AD8..2ADB] : 08; + 2ADC : FF; + [2ADD..2ADF] : 08; + 2AE0 : A0; + 2AE1 : 50; + 2AE2 : A0; + 2AE3 : 50; + 2AE4 : A0; + 2AE5 : 50; + 2AE6 : A0; + 2AE7 : 50; + [2AE8..2AEF] : 08; + [2AF0..2AF1] : 00; + 2AF2 : 01; + 2AF3 : 3E; + 2AF4 : 54; + [2AF5..2AF6] : 14; + 2AF7 : 00; + 2AF8 : FF; + 2AF9 : 7F; + 2AFA : 3F; + 2AFB : 1F; + 2AFC : 0F; + 2AFD : 07; + 2AFE : 03; + 2AFF : 01; + [2B00..2B07] : 00; + [2B08..2B0F] : F0; + [2B10..2B13] : 00; + [2B14..2B18] : FF; + [2B19..2B26] : 00; + 2B27 : FF; + [2B28..2B2F] : 80; + 2B30 : AA; + 2B31 : 55; + 2B32 : AA; + 2B33 : 55; + 2B34 : AA; + 2B35 : 55; + 2B36 : AA; + 2B37 : 55; + [2B38..2B3F] : 01; + [2B40..2B43] : 00; + 2B44 : AA; + 2B45 : 55; + 2B46 : AA; + 2B47 : 55; + 2B48 : FF; + 2B49 : FE; + 2B4A : FC; + 2B4B : F8; + 2B4C : F0; + 2B4D : E0; + 2B4E : C0; + 2B4F : 80; + [2B50..2B57] : 03; + [2B58..2B5B] : 08; + 2B5C : 0F; + [2B5D..2B5F] : 08; + [2B60..2B63] : 00; + [2B64..2B67] : 0F; + [2B68..2B6B] : 08; + 2B6C : 0F; + [2B6D..2B73] : 00; + 2B74 : F8; + [2B75..2B77] : 08; + [2B78..2B7D] : 00; + [2B7E..2B7F] : FF; + [2B80..2B83] : 00; + 2B84 : 0F; + [2B85..2B8B] : 08; + 2B8C : FF; + [2B8D..2B93] : 00; + 2B94 : FF; + [2B95..2B9B] : 08; + 2B9C : F8; + [2B9D..2B9F] : 08; + [2BA0..2BA7] : C0; + [2BA8..2BAF] : E0; + [2BB0..2BB7] : 07; + [2BB8..2BB9] : FF; + [2BBA..2BBF] : 00; + [2BC0..2BC2] : FF; + [2BC3..2BCC] : 00; + [2BCD..2BCF] : FF; + [2BD0..2BD6] : 01; + 2BD7 : FF; + [2BD8..2BDB] : 00; + [2BDC..2BDF] : F0; + [2BE0..2BE3] : 0F; + [2BE4..2BE7] : 00; + [2BE8..2BEB] : 08; + 2BEC : F8; + [2BED..2BEF] : 00; + [2BF0..2BF3] : F0; + [2BF4..2BF7] : 00; + [2BF8..2BFB] : F0; + [2BFC..2BFF] : 0F; + 2C00 : 1C; + 2C01 : 22; + 2C02 : 4A; + 2C03 : 56; + 2C04 : 4C; + 2C05 : 20; + 2C06 : 1E; + [2C07..2C09] : 00; + 2C0A : 38; + 2C0B : 04; + 2C0C : 3C; + 2C0D : 44; + 2C0E : 3A; + 2C0F : 00; + [2C10..2C11] : 40; + 2C12 : 5C; + 2C13 : 62; + 2C14 : 42; + 2C15 : 62; + 2C16 : 5C; + [2C17..2C19] : 00; + 2C1A : 3C; + 2C1B : 42; + 2C1C : 40; + 2C1D : 42; + 2C1E : 3C; + 2C1F : 00; + [2C20..2C21] : 02; + 2C22 : 3A; + 2C23 : 46; + 2C24 : 42; + 2C25 : 46; + 2C26 : 3A; + [2C27..2C29] : 00; + 2C2A : 3C; + 2C2B : 42; + 2C2C : 7E; + 2C2D : 40; + 2C2E : 3C; + 2C2F : 00; + 2C30 : 0C; + 2C31 : 12; + 2C32 : 10; + 2C33 : 7C; + [2C34..2C36] : 10; + [2C37..2C39] : 00; + 2C3A : 3A; + [2C3B..2C3C] : 46; + 2C3D : 3A; + 2C3E : 02; + 2C3F : 3C; + [2C40..2C41] : 40; + 2C42 : 5C; + 2C43 : 62; + [2C44..2C46] : 42; + 2C47 : 00; + 2C48 : 08; + 2C49 : 00; + 2C4A : 18; + [2C4B..2C4D] : 08; + 2C4E : 1C; + 2C4F : 00; + 2C50 : 04; + 2C51 : 00; + 2C52 : 0C; + [2C53..2C55] : 04; + 2C56 : 44; + 2C57 : 38; + [2C58..2C59] : 40; + 2C5A : 44; + 2C5B : 48; + 2C5C : 50; + 2C5D : 68; + 2C5E : 44; + 2C5F : 00; + 2C60 : 18; + [2C61..2C65] : 08; + 2C66 : 1C; + [2C67..2C69] : 00; + 2C6A : 76; + [2C6B..2C6E] : 49; + [2C6F..2C71] : 00; + 2C72 : 5C; + 2C73 : 62; + [2C74..2C76] : 42; + [2C77..2C79] : 00; + 2C7A : 3C; + [2C7B..2C7D] : 42; + 2C7E : 3C; + [2C7F..2C81] : 00; + 2C82 : 5C; + [2C83..2C84] : 62; + 2C85 : 5C; + [2C86..2C87] : 40; + [2C88..2C89] : 00; + 2C8A : 3A; + [2C8B..2C8C] : 46; + 2C8D : 3A; + [2C8E..2C8F] : 02; + [2C90..2C91] : 00; + 2C92 : 5C; + 2C93 : 62; + [2C94..2C96] : 40; + [2C97..2C99] : 00; + 2C9A : 3E; + 2C9B : 40; + 2C9C : 3C; + 2C9D : 02; + 2C9E : 7C; + 2C9F : 00; + [2CA0..2CA1] : 10; + 2CA2 : 7C; + [2CA3..2CA4] : 10; + 2CA5 : 12; + 2CA6 : 0C; + [2CA7..2CA9] : 00; + [2CAA..2CAC] : 42; + 2CAD : 46; + 2CAE : 3A; + [2CAF..2CB1] : 00; + [2CB2..2CB4] : 42; + 2CB5 : 24; + 2CB6 : 18; + [2CB7..2CB9] : 00; + 2CBA : 41; + [2CBB..2CBD] : 49; + 2CBE : 36; + [2CBF..2CC1] : 00; + 2CC2 : 42; + 2CC3 : 24; + 2CC4 : 18; + 2CC5 : 24; + 2CC6 : 42; + [2CC7..2CC9] : 00; + [2CCA..2CCB] : 42; + 2CCC : 46; + 2CCD : 3A; + 2CCE : 02; + 2CCF : 3C; + [2CD0..2CD1] : 00; + 2CD2 : 7E; + 2CD3 : 04; + 2CD4 : 18; + 2CD5 : 20; + 2CD6 : 7E; + 2CD7 : 00; + 2CD8 : 3C; + [2CD9..2CDD] : 20; + 2CDE : 3C; + [2CDF..2CE0] : 00; + 2CE1 : 40; + 2CE2 : 20; + 2CE3 : 10; + 2CE4 : 08; + 2CE5 : 04; + 2CE6 : 02; + 2CE7 : 00; + 2CE8 : 3C; + [2CE9..2CED] : 04; + 2CEE : 3C; + [2CEF..2CF0] : 00; + 2CF1 : 08; + 2CF2 : 1C; + 2CF3 : 2A; + [2CF4..2CF7] : 08; + [2CF8..2CF9] : 00; + 2CFA : 10; + 2CFB : 20; + 2CFC : 7F; + 2CFD : 20; + 2CFE : 10; + [2CFF..2D07] : 00; + [2D08..2D0B] : 08; + [2D0C..2D0D] : 00; + 2D0E : 08; + 2D0F : 00; + [2D10..2D12] : 24; + [2D13..2D17] : 00; + [2D18..2D19] : 24; + 2D1A : 7E; + 2D1B : 24; + 2D1C : 7E; + [2D1D..2D1E] : 24; + 2D1F : 00; + 2D20 : 08; + 2D21 : 1E; + 2D22 : 28; + 2D23 : 1C; + 2D24 : 0A; + 2D25 : 3C; + 2D26 : 08; + [2D27..2D28] : 00; + 2D29 : 62; + 2D2A : 64; + 2D2B : 08; + 2D2C : 10; + 2D2D : 26; + 2D2E : 46; + 2D2F : 00; + 2D30 : 30; + [2D31..2D32] : 48; + 2D33 : 30; + 2D34 : 4A; + 2D35 : 44; + 2D36 : 3A; + 2D37 : 00; + 2D38 : 04; + 2D39 : 08; + 2D3A : 10; + [2D3B..2D3F] : 00; + 2D40 : 04; + 2D41 : 08; + [2D42..2D44] : 10; + 2D45 : 08; + 2D46 : 04; + 2D47 : 00; + 2D48 : 20; + 2D49 : 10; + [2D4A..2D4C] : 08; + 2D4D : 10; + 2D4E : 20; + 2D4F : 00; + 2D50 : 08; + 2D51 : 2A; + 2D52 : 1C; + 2D53 : 3E; + 2D54 : 1C; + 2D55 : 2A; + 2D56 : 08; + [2D57..2D58] : 00; + [2D59..2D5A] : 08; + 2D5B : 3E; + [2D5C..2D5D] : 08; + [2D5E..2D64] : 00; + [2D65..2D66] : 08; + 2D67 : 10; + [2D68..2D6A] : 00; + 2D6B : 7E; + [2D6C..2D74] : 00; + [2D75..2D76] : 18; + [2D77..2D78] : 00; + 2D79 : 02; + 2D7A : 04; + 2D7B : 08; + 2D7C : 10; + 2D7D : 20; + 2D7E : 40; + 2D7F : 00; + 2D80 : 3C; + 2D81 : 42; + 2D82 : 46; + 2D83 : 5A; + 2D84 : 62; + 2D85 : 42; + 2D86 : 3C; + 2D87 : 00; + 2D88 : 08; + 2D89 : 18; + 2D8A : 28; + [2D8B..2D8D] : 08; + 2D8E : 3E; + 2D8F : 00; + 2D90 : 3C; + 2D91 : 42; + 2D92 : 02; + 2D93 : 0C; + 2D94 : 30; + 2D95 : 40; + 2D96 : 7E; + 2D97 : 00; + 2D98 : 3C; + 2D99 : 42; + 2D9A : 02; + 2D9B : 1C; + 2D9C : 02; + 2D9D : 42; + 2D9E : 3C; + 2D9F : 00; + 2DA0 : 04; + 2DA1 : 0C; + 2DA2 : 14; + 2DA3 : 24; + 2DA4 : 7E; + [2DA5..2DA6] : 04; + 2DA7 : 00; + 2DA8 : 7E; + 2DA9 : 40; + 2DAA : 78; + 2DAB : 04; + 2DAC : 02; + 2DAD : 44; + 2DAE : 38; + 2DAF : 00; + 2DB0 : 1C; + 2DB1 : 20; + 2DB2 : 40; + 2DB3 : 7C; + [2DB4..2DB5] : 42; + 2DB6 : 3C; + 2DB7 : 00; + 2DB8 : 7E; + 2DB9 : 42; + 2DBA : 04; + 2DBB : 08; + [2DBC..2DBE] : 10; + 2DBF : 00; + 2DC0 : 3C; + [2DC1..2DC2] : 42; + 2DC3 : 3C; + [2DC4..2DC5] : 42; + 2DC6 : 3C; + 2DC7 : 00; + 2DC8 : 3C; + [2DC9..2DCA] : 42; + 2DCB : 3E; + 2DCC : 02; + 2DCD : 04; + 2DCE : 38; + [2DCF..2DD1] : 00; + 2DD2 : 08; + [2DD3..2DD4] : 00; + 2DD5 : 08; + [2DD6..2DD9] : 00; + 2DDA : 08; + [2DDB..2DDC] : 00; + [2DDD..2DDE] : 08; + 2DDF : 10; + 2DE0 : 0E; + 2DE1 : 18; + 2DE2 : 30; + 2DE3 : 60; + 2DE4 : 30; + 2DE5 : 18; + 2DE6 : 0E; + [2DE7..2DE9] : 00; + 2DEA : 7E; + 2DEB : 00; + 2DEC : 7E; + [2DED..2DEF] : 00; + 2DF0 : 70; + 2DF1 : 18; + 2DF2 : 0C; + 2DF3 : 06; + 2DF4 : 0C; + 2DF5 : 18; + 2DF6 : 70; + 2DF7 : 00; + 2DF8 : 3C; + 2DF9 : 42; + 2DFA : 02; + 2DFB : 0C; + 2DFC : 10; + 2DFD : 00; + 2DFE : 10; + [2DFF..2E03] : 00; + 2E04 : FF; + [2E05..2E07] : 00; + 2E08 : 18; + 2E09 : 24; + 2E0A : 42; + 2E0B : 7E; + [2E0C..2E0E] : 42; + 2E0F : 00; + 2E10 : 7C; + [2E11..2E12] : 22; + 2E13 : 3C; + [2E14..2E15] : 22; + 2E16 : 7C; + 2E17 : 00; + 2E18 : 1C; + 2E19 : 22; + [2E1A..2E1C] : 40; + 2E1D : 22; + 2E1E : 1C; + 2E1F : 00; + 2E20 : 78; + 2E21 : 24; + [2E22..2E24] : 22; + 2E25 : 24; + 2E26 : 78; + 2E27 : 00; + 2E28 : 7E; + [2E29..2E2A] : 40; + 2E2B : 78; + [2E2C..2E2D] : 40; + 2E2E : 7E; + 2E2F : 00; + 2E30 : 7E; + [2E31..2E32] : 40; + 2E33 : 78; + [2E34..2E36] : 40; + 2E37 : 00; + 2E38 : 1C; + 2E39 : 22; + 2E3A : 40; + 2E3B : 4E; + 2E3C : 42; + 2E3D : 22; + 2E3E : 1C; + 2E3F : 00; + [2E40..2E42] : 42; + 2E43 : 7E; + [2E44..2E46] : 42; + 2E47 : 00; + 2E48 : 1C; + [2E49..2E4D] : 08; + 2E4E : 1C; + 2E4F : 00; + 2E50 : 0E; + [2E51..2E54] : 04; + 2E55 : 44; + 2E56 : 38; + 2E57 : 00; + 2E58 : 42; + 2E59 : 44; + 2E5A : 48; + 2E5B : 70; + 2E5C : 48; + 2E5D : 44; + 2E5E : 42; + 2E5F : 00; + [2E60..2E65] : 40; + 2E66 : 7E; + 2E67 : 00; + 2E68 : 42; + 2E69 : 66; + [2E6A..2E6B] : 5A; + [2E6C..2E6E] : 42; + 2E6F : 00; + 2E70 : 42; + 2E71 : 62; + 2E72 : 52; + 2E73 : 4A; + 2E74 : 46; + [2E75..2E76] : 42; + 2E77 : 00; + 2E78 : 18; + 2E79 : 24; + [2E7A..2E7C] : 42; + 2E7D : 24; + 2E7E : 18; + 2E7F : 00; + 2E80 : 7C; + [2E81..2E82] : 42; + 2E83 : 7C; + [2E84..2E86] : 40; + 2E87 : 00; + 2E88 : 18; + 2E89 : 24; + [2E8A..2E8B] : 42; + 2E8C : 4A; + 2E8D : 24; + 2E8E : 1A; + 2E8F : 00; + 2E90 : 7C; + [2E91..2E92] : 42; + 2E93 : 7C; + 2E94 : 48; + 2E95 : 44; + 2E96 : 42; + 2E97 : 00; + 2E98 : 3C; + 2E99 : 42; + 2E9A : 40; + 2E9B : 3C; + 2E9C : 02; + 2E9D : 42; + 2E9E : 3C; + 2E9F : 00; + 2EA0 : 3E; + [2EA1..2EA6] : 08; + 2EA7 : 00; + [2EA8..2EAD] : 42; + 2EAE : 3C; + 2EAF : 00; + [2EB0..2EB2] : 42; + [2EB3..2EB4] : 24; + [2EB5..2EB6] : 18; + 2EB7 : 00; + [2EB8..2EBA] : 42; + [2EBB..2EBC] : 5A; + 2EBD : 66; + 2EBE : 42; + 2EBF : 00; + [2EC0..2EC1] : 42; + 2EC2 : 24; + 2EC3 : 18; + 2EC4 : 24; + [2EC5..2EC6] : 42; + 2EC7 : 00; + [2EC8..2ECA] : 22; + 2ECB : 1C; + [2ECC..2ECE] : 08; + 2ECF : 00; + 2ED0 : 7E; + 2ED1 : 02; + 2ED2 : 04; + 2ED3 : 18; + 2ED4 : 20; + 2ED5 : 40; + 2ED6 : 7E; + 2ED7 : 00; + [2ED8..2EDB] : 08; + 2EDC : FF; + [2EDD..2EDF] : 08; + 2EE0 : A0; + 2EE1 : 50; + 2EE2 : A0; + 2EE3 : 50; + 2EE4 : A0; + 2EE5 : 50; + 2EE6 : A0; + 2EE7 : 50; + [2EE8..2EEF] : 08; + [2EF0..2EF1] : CC; + [2EF2..2EF3] : 33; + [2EF4..2EF5] : CC; + [2EF6..2EF7] : 33; + 2EF8 : CC; + 2EF9 : 66; + 2EFA : 33; + 2EFB : 99; + 2EFC : CC; + 2EFD : 66; + 2EFE : 33; + 2EFF : 99; + [2F00..2F07] : 00; + [2F08..2F0F] : F0; + [2F10..2F13] : 00; + [2F14..2F18] : FF; + [2F19..2F26] : 00; + 2F27 : FF; + [2F28..2F2F] : 80; + 2F30 : AA; + 2F31 : 55; + 2F32 : AA; + 2F33 : 55; + 2F34 : AA; + 2F35 : 55; + 2F36 : AA; + 2F37 : 55; + [2F38..2F3F] : 01; + [2F40..2F43] : 00; + 2F44 : AA; + 2F45 : 55; + 2F46 : AA; + 2F47 : 55; + 2F48 : 99; + 2F49 : 33; + 2F4A : 66; + 2F4B : CC; + 2F4C : 99; + 2F4D : 33; + 2F4E : 66; + 2F4F : CC; + [2F50..2F57] : 03; + [2F58..2F5B] : 08; + 2F5C : 0F; + [2F5D..2F5F] : 08; + [2F60..2F63] : 00; + [2F64..2F67] : 0F; + [2F68..2F6B] : 08; + 2F6C : 0F; + [2F6D..2F73] : 00; + 2F74 : F8; + [2F75..2F77] : 08; + [2F78..2F7D] : 00; + [2F7E..2F7F] : FF; + [2F80..2F83] : 00; + 2F84 : 0F; + [2F85..2F8B] : 08; + 2F8C : FF; + [2F8D..2F93] : 00; + 2F94 : FF; + [2F95..2F9B] : 08; + 2F9C : F8; + [2F9D..2F9F] : 08; + [2FA0..2FA7] : C0; + [2FA8..2FAF] : E0; + [2FB0..2FB7] : 07; + [2FB8..2FB9] : FF; + [2FBA..2FBF] : 00; + [2FC0..2FC2] : FF; + [2FC3..2FCC] : 00; + [2FCD..2FCF] : FF; + 2FD0 : 01; + 2FD1 : 02; + 2FD2 : 44; + 2FD3 : 48; + 2FD4 : 50; + 2FD5 : 60; + 2FD6 : 40; + [2FD7..2FDB] : 00; + [2FDC..2FDF] : F0; + [2FE0..2FE3] : 0F; + [2FE4..2FE7] : 00; + [2FE8..2FEB] : 08; + 2FEC : F8; + [2FED..2FEF] : 00; + [2FF0..2FF3] : F0; + [2FF4..2FF7] : 00; + [2FF8..2FFB] : F0; + [2FFC..2FFF] : 0F; + 3000 : 54; + [3001..3002] : 4F; + 3003 : 20; + 3004 : 4D; + 3005 : 41; + 3006 : 4E; + 3007 : 59; + 3008 : 20; + 3009 : 46; + 300A : 49; + 300B : 4C; + 300C : 45; + 300D : D3; + 300E : 46; + 300F : 49; + 3010 : 4C; + 3011 : 45; + 3012 : 20; + 3013 : 4F; + 3014 : 50; + 3015 : 45; + 3016 : CE; + 3017 : 46; + 3018 : 49; + 3019 : 4C; + 301A : 45; + 301B : 20; + 301C : 4E; + 301D : 4F; + 301E : 54; + 301F : 20; + 3020 : 4F; + 3021 : 50; + 3022 : 45; + 3023 : CE; + 3024 : 46; + 3025 : 49; + 3026 : 4C; + 3027 : 45; + 3028 : 20; + 3029 : 4E; + 302A : 4F; + 302B : 54; + 302C : 20; + 302D : 46; + 302E : 4F; + 302F : 55; + 3030 : 4E; + 3031 : C4; + 3032 : 0D; + 3033 : 53; + 3034 : 45; + 3035 : 41; + 3036 : 52; + 3037 : 43; + 3038 : 48; + 3039 : 49; + 303A : 4E; + 303B : 47; + 303C : A0; + 303D : 46; + 303E : 4F; + 303F : 52; + 3040 : A0; + 3041 : 0D; + 3042 : 50; + 3043 : 52; + 3044 : 45; + [3045..3046] : 53; + 3047 : 20; + 3048 : 50; + 3049 : 4C; + 304A : 41; + 304B : 59; + 304C : A0; + 304D : 26; + 304E : 20; + 304F : 52; + 3050 : 45; + 3051 : 43; + 3052 : 4F; + 3053 : 52; + 3054 : 44; + 3055 : A0; + 3056 : 4F; + 3057 : 4E; + 3058 : 20; + 3059 : 54; + 305A : 41; + 305B : 50; + 305C : 45; + 305D : 20; + 305E : A3; + 305F : 0D; + 3060 : 4C; + 3061 : 4F; + 3062 : 41; + 3063 : C4; + 3064 : 0D; + 3065 : 57; + 3066 : 52; + 3067 : 49; + 3068 : 54; + 3069 : 49; + 306A : 4E; + 306B : 47; + 306C : A0; + 306D : 0D; + 306E : 56; + 306F : 45; + 3070 : 52; + 3071 : 49; + 3072 : 46; + 3073 : D9; + 3074 : 44; + 3075 : 45; + 3076 : 56; + 3077 : 49; + 3078 : 43; + 3079 : 45; + 307A : 20; + 307B : 4E; + 307C : 4F; + 307D : 54; + 307E : 20; + 307F : 50; + 3080 : 52; + 3081 : 45; + 3082 : 53; + 3083 : 45; + 3084 : 4E; + 3085 : D4; + 3086 : 4E; + 3087 : 4F; + 3088 : 54; + 3089 : 20; + 308A : 49; + 308B : 4E; + 308C : 50; + 308D : 55; + 308E : 54; + 308F : 20; + 3090 : 46; + 3091 : 49; + 3092 : 4C; + 3093 : C5; + 3094 : 4E; + 3095 : 4F; + 3096 : 54; + 3097 : 20; + 3098 : 4F; + 3099 : 55; + 309A : 54; + 309B : 50; + 309C : 55; + 309D : 54; + 309E : 20; + 309F : 46; + 30A0 : 49; + 30A1 : 4C; + 30A2 : C5; + 30A3 : 0D; + 30A4 : 46; + 30A5 : 4F; + 30A6 : 55; + 30A7 : 4E; + 30A8 : 44; + 30A9 : A0; + 30AA : 0D; + 30AB : 4F; + 30AC : 4B; + 30AD : 8D; + 30AE : 0D; + 30AF : 52; + 30B0 : 45; + 30B1 : 41; + 30B2 : 44; + 30B3 : 59; + 30B4 : 2E; + 30B5 : 8D; + 30B6 : A9; + 30B7 : 40; + 30B8 : D0; + 30B9 : 02; + 30BA : A9; + 30BB : 20; + 30BC : 48; + 30BD : AD; + 30BE : 40; + 30BF : E8; + 30C0 : 09; + 30C1 : 02; + 30C2 : 8D; + 30C3 : 40; + 30C4 : E8; + 30C5 : A9; + 30C6 : 3C; + 30C7 : 8D; + 30C8 : 21; + 30C9 : E8; + 30CA : 24; + 30CB : A0; + 30CC : F0; + 30CD : 11; + 30CE : A9; + 30CF : 34; + 30D0 : 8D; + 30D1 : 11; + 30D2 : E8; + 30D3 : 20; + 30D4 : EE; + 30D5 : F0; + 30D6 : A9; + 30D7 : 00; + 30D8 : 85; + 30D9 : A0; + 30DA : A9; + 30DB : 3C; + 30DC : 8D; + 30DD : 11; + 30DE : E8; + 30DF : 68; + 30E0 : 05; + 30E1 : D4; + 30E2 : 85; + 30E3 : A5; + 30E4 : AD; + 30E5 : 40; + 30E6 : E8; + 30E7 : 10; + 30E8 : FB; + 30E9 : 29; + 30EA : FB; + 30EB : 8D; + 30EC : 40; + 30ED : E8; + 30EE : A9; + 30EF : 3C; + 30F0 : 8D; + 30F1 : 23; + 30F2 : E8; + 30F3 : AD; + 30F4 : 40; + 30F5 : E8; + 30F6 : 29; + 30F7 : 41; + 30F8 : C9; + 30F9 : 41; + 30FA : F0; + 30FB : 41; + [30FC..30FD] : A5; + 30FE : 49; + 30FF : FF; + 3100 : 8D; + 3101 : 22; + 3102 : E8; + 3103 : 2C; + 3104 : 40; + 3105 : E8; + 3106 : 50; + 3107 : FB; + 3108 : A9; + 3109 : 34; + 310A : 8D; + 310B : 23; + 310C : E8; + 310D : A9; + 310E : FF; + 310F : 8D; + 3110 : 45; + 3111 : E8; + 3112 : AD; + 3113 : 40; + 3114 : E8; + 3115 : 2C; + 3116 : 4D; + 3117 : E8; + 3118 : 70; + 3119 : 1C; + 311A : 4A; + 311B : 90; + 311C : F5; + 311D : A9; + 311E : 3C; + 311F : 8D; + 3120 : 23; + 3121 : E8; + 3122 : A9; + 3123 : FF; + 3124 : 8D; + 3125 : 22; + 3126 : E8; + 3127 : 60; + 3128 : 85; + 3129 : A5; + 312A : 20; + 312B : EE; + 312C : F0; + 312D : AD; + 312E : 40; + 312F : E8; + 3130 : 09; + 3131 : 04; + 3132 : 8D; + 3133 : 40; + 3134 : E8; + 3135 : 60; + 3136 : A9; + 3137 : 01; + 3138 : 20; + 3139 : 7F; + 313A : FB; + 313B : D0; + 313C : E0; + 313D : A9; + 313E : 80; + 313F : 30; + 3140 : F7; + 3141 : A9; + 3142 : 02; + 3143 : 20; + 3144 : 7F; + 3145 : FB; + 3146 : AD; + 3147 : 40; + 3148 : E8; + 3149 : 29; + 314A : FD; + 314B : 8D; + 314C : 40; + 314D : E8; + 314E : A9; + 314F : 34; + 3150 : 8D; + 3151 : 21; + 3152 : E8; + 3153 : A9; + 3154 : 0D; + 3155 : 60; + 3156 : B9; + 3157 : 00; + 3158 : F0; + 3159 : 08; + 315A : 29; + 315B : 7F; + 315C : 20; + 315D : D8; + 315E : E3; + 315F : C8; + 3160 : 28; + 3161 : 10; + 3162 : F3; + 3163 : 60; + 3164 : 85; + 3165 : A5; + 3166 : 20; + 3167 : EE; + 3168 : F0; + 3169 : 20; + 316A : 46; + 316B : F1; + 316C : 4C; + 316D : 2D; + 316E : F1; + 316F : 24; + 3170 : A0; + 3171 : 30; + 3172 : 04; + 3173 : C6; + 3174 : A0; + 3175 : D0; + 3176 : 05; + 3177 : 48; + 3178 : 20; + 3179 : EE; + 317A : F0; + 317B : 68; + 317C : 85; + 317D : A5; + 317E : 60; + 317F : A9; + 3180 : 5F; + 3181 : D0; + 3182 : 02; + 3183 : A9; + 3184 : 3F; + [3185..3186] : EA; + 3187 : 20; + 3188 : BC; + 3189 : F0; + 318A : D0; + 318B : A1; + 318C : A9; + 318D : 34; + 318E : 8D; + 318F : 21; + 3190 : E8; + 3191 : AD; + 3192 : 40; + 3193 : E8; + 3194 : 09; + 3195 : 02; + 3196 : 8D; + 3197 : 40; + 3198 : E8; + 3199 : A9; + 319A : FF; + 319B : 8D; + 319C : 45; + 319D : E8; + 319E : 2C; + 319F : 4D; + 31A0 : E8; + 31A1 : 70; + 31A2 : 9E; + 31A3 : 2C; + 31A4 : 40; + 31A5 : E8; + 31A6 : 30; + 31A7 : F6; + 31A8 : AD; + 31A9 : 40; + 31AA : E8; + 31AB : 29; + 31AC : FD; + 31AD : 8D; + 31AE : 40; + 31AF : E8; + 31B0 : 2C; + 31B1 : 10; + 31B2 : E8; + 31B3 : 70; + 31B4 : 05; + 31B5 : A9; + 31B6 : 40; + 31B7 : 20; + 31B8 : 7F; + 31B9 : FB; + 31BA : AD; + 31BB : 20; + 31BC : E8; + 31BD : 49; + 31BE : FF; + 31BF : 48; + 31C0 : A9; + 31C1 : 3C; + 31C2 : 8D; + 31C3 : 21; + 31C4 : E8; + 31C5 : 2C; + 31C6 : 40; + 31C7 : E8; + 31C8 : 10; + 31C9 : FB; + 31CA : A9; + 31CB : 34; + 31CC : 8D; + 31CD : 21; + 31CE : E8; + 31CF : 68; + 31D0 : 60; + 31D1 : A9; + 31D2 : 00; + 31D3 : 85; + 31D4 : 96; + 31D5 : A5; + 31D6 : AF; + 31D7 : D0; + 31D8 : 17; + 31D9 : A5; + 31DA : 9E; + 31DB : F0; + 31DC : 51; + 31DD : 78; + 31DE : 4C; + 31DF : 85; + 31E0 : E2; + 31E1 : A5; + 31E2 : AF; + 31E3 : D0; + 31E4 : 0B; + 31E5 : A5; + 31E6 : C6; + 31E7 : 85; + 31E8 : A4; + 31E9 : A5; + 31EA : D8; + 31EB : 85; + 31EC : A3; + 31ED : 4C; + 31EE : F4; + 31EF : E2; + 31F0 : C9; + 31F1 : 03; + 31F2 : D0; + 31F3 : 09; + 31F4 : 85; + 31F5 : AC; + 31F6 : A5; + 31F7 : D5; + 31F8 : 85; + 31F9 : A1; + 31FA : 4C; + 31FB : F4; + 31FC : E2; + 31FD : B0; + 31FE : 29; + 31FF : 86; + 3200 : AD; + 3201 : 20; + 3202 : 15; + 3203 : F2; + 3204 : 48; + 3205 : 20; + 3206 : 15; + 3207 : F2; + 3208 : D0; + 3209 : 05; + 320A : A9; + 320B : 40; + 320C : 20; + 320D : 7F; + 320E : FB; + 320F : D6; + 3210 : BA; + 3211 : A6; + 3212 : AD; + 3213 : 68; + 3214 : 60; + 3215 : 20; + 3216 : 06; + 3217 : F8; + 3218 : D0; + 3219 : 0B; + 321A : 20; + 321B : 55; + 321C : F8; + 321D : A6; + 321E : D4; + 321F : A9; + 3220 : 00; + 3221 : 95; + 3222 : BA; + [3223..3224] : F0; + 3225 : B1; + 3226 : D6; + 3227 : 60; + 3228 : A5; + 3229 : 96; + 322A : F0; + 322B : 03; + 322C : A9; + 322D : 0D; + 322E : 60; + 322F : 4C; + 3230 : 8C; + 3231 : F1; + 3232 : 48; + 3233 : A5; + 3234 : B0; + 3235 : C9; + 3236 : 03; + 3237 : D0; + 3238 : 04; + 3239 : 68; + 323A : 4C; + 323B : D8; + 323C : E3; + 323D : 30; + 323E : 04; + 323F : 68; + 3240 : 4C; + 3241 : 6F; + 3242 : F1; + 3243 : 68; + 3244 : 85; + 3245 : B4; + 3246 : C9; + 3247 : 0A; + 3248 : F0; + 3249 : E4; + 324A : 48; + 324B : 8A; + 324C : 48; + 324D : 98; + 324E : 48; + 324F : 20; + 3250 : 06; + 3251 : F8; + 3252 : D0; + 3253 : 10; + 3254 : 20; + 3255 : 86; + 3256 : F8; + 3257 : A6; + 3258 : D4; + 3259 : A9; + 325A : 01; + 325B : 95; + 325C : BA; + 325D : A0; + 325E : 00; + 325F : A9; + 3260 : 02; + 3261 : 91; + 3262 : D6; + 3263 : C8; + 3264 : A5; + 3265 : B4; + 3266 : 91; + 3267 : D6; + 3268 : 68; + 3269 : A8; + 326A : 68; + 326B : AA; + 326C : 68; + 326D : 60; + 326E : A9; + 326F : 00; + 3270 : 85; + 3271 : AE; + 3272 : A5; + 3273 : B0; + 3274 : C9; + 3275 : 04; + 3276 : 90; + 3277 : 03; + 3278 : 20; + 3279 : 83; + 327A : F1; + 327B : A5; + 327C : AF; + 327D : C9; + 327E : 04; + 327F : 90; + 3280 : 03; + 3281 : 20; + 3282 : 7F; + 3283 : F1; + 3284 : A9; + 3285 : 03; + 3286 : 85; + 3287 : B0; + 3288 : A9; + 3289 : 00; + 328A : 85; + 328B : AF; + 328C : 60; + 328D : A6; + 328E : AE; + 328F : CA; + 3290 : 30; + 3291 : 16; + 3292 : DD; + 3293 : 51; + 3294 : 02; + 3295 : F0; + 3296 : 11; + 3297 : D0; + 3298 : F6; + 3299 : BD; + 329A : 51; + 329B : 02; + 329C : 85; + 329D : D2; + 329E : BD; + 329F : 5B; + 32A0 : 02; + 32A1 : 85; + 32A2 : D4; + 32A3 : BD; + 32A4 : 65; + 32A5 : 02; + 32A6 : 85; + 32A7 : D3; + 32A8 : 60; + 32A9 : 20; + 32AA : CE; + 32AB : F4; + 32AC : A5; + 32AD : D2; + 32AE : 20; + 32AF : 8D; + 32B0 : F2; + 32B1 : D0; + 32B2 : 4D; + 32B3 : 20; + 32B4 : 99; + 32B5 : F2; + 32B6 : 8A; + 32B7 : 48; + 32B8 : A5; + 32B9 : D4; + 32BA : F0; + 32BB : 28; + 32BC : C9; + 32BD : 03; + 32BE : F0; + 32BF : 24; + 32C0 : B0; + 32C1 : 1F; + 32C2 : A5; + 32C3 : D3; + 32C4 : 29; + 32C5 : 0F; + 32C6 : F0; + 32C7 : 1C; + 32C8 : 20; + 32C9 : 56; + 32CA : F6; + 32CB : A9; + 32CC : 00; + 32CD : 20; + 32CE : 44; + 32CF : F2; + 32D0 : 20; + 32D1 : 86; + 32D2 : F8; + 32D3 : A5; + 32D4 : D3; + 32D5 : C9; + 32D6 : 62; + 32D7 : D0; + 32D8 : 0B; + 32D9 : A9; + 32DA : 05; + 32DB : 20; + 32DC : DA; + 32DD : F5; + 32DE : 4C; + 32DF : E4; + 32E0 : F2; + 32E1 : 20; + 32E2 : F0; + 32E3 : F6; + 32E4 : 68; + 32E5 : AA; + 32E6 : C6; + 32E7 : AE; + 32E8 : E4; + 32E9 : AE; + 32EA : F0; + 32EB : 14; + 32EC : A4; + 32ED : AE; + 32EE : B9; + 32EF : 51; + 32F0 : 02; + 32F1 : 9D; + 32F2 : 51; + 32F3 : 02; + 32F4 : B9; + 32F5 : 5B; + 32F6 : 02; + 32F7 : 9D; + 32F8 : 5B; + 32F9 : 02; + 32FA : B9; + 32FB : 65; + 32FC : 02; + 32FD : 9D; + 32FE : 65; + 32FF : 02; + 3300 : 60; + 3301 : A5; + 3302 : 9B; + 3303 : C9; + 3304 : EF; + 3305 : D0; + 3306 : 07; + 3307 : 08; + 3308 : 20; + 3309 : 72; + 330A : F2; + 330B : 85; + 330C : 9E; + 330D : 28; + 330E : 60; + 330F : 20; + 3310 : 01; + 3311 : F3; + 3312 : 4C; + 3313 : 3F; + 3314 : C7; + 3315 : 20; + 3316 : 1D; + 3317 : F3; + 3318 : D0; + 3319 : F4; + 331A : 4C; + 331B : 56; + 331C : F1; + 331D : A5; + 331E : 78; + 331F : C9; + 3320 : 02; + 3321 : 60; + 3322 : A5; + 3323 : D4; + 3324 : D0; + 3325 : 03; + 3326 : 4C; + 3327 : 03; + 3328 : CE; + 3329 : C9; + 332A : 03; + 332B : F0; + 332C : F9; + 332D : 90; + 332E : 66; + 332F : A9; + 3330 : 60; + 3331 : 85; + 3332 : D3; + 3333 : A4; + 3334 : D1; + 3335 : D0; + 3336 : 03; + 3337 : 4C; + 3338 : 03; + 3339 : CE; + 333A : 20; + 333B : 0A; + 333C : F4; + 333D : 20; + 333E : 66; + 333F : F4; + 3340 : 20; + 3341 : B6; + 3342 : F0; + 3343 : A5; + 3344 : D3; + 3345 : 20; + 3346 : 28; + 3347 : F1; + 3348 : 20; + 3349 : 8C; + 334A : F1; + 334B : 85; + 334C : FB; + 334D : 20; + 334E : 8C; + 334F : F1; + 3350 : 85; + 3351 : FC; + 3352 : 20; + 3353 : 2E; + 3354 : F4; + 3355 : A9; + 3356 : FD; + 3357 : 25; + 3358 : 96; + 3359 : 85; + 335A : 96; + 335B : 20; + 335C : 0F; + 335D : F3; + 335E : 20; + 335F : 8C; + 3360 : F1; + 3361 : AA; + 3362 : A5; + 3363 : 96; + [3364..3365] : 4A; + 3366 : B0; + 3367 : ED; + 3368 : 8A; + 3369 : A4; + 336A : 9D; + 336B : F0; + 336C : 0B; + 336D : 88; + 336E : D1; + 336F : FB; + 3370 : F0; + 3371 : 08; + 3372 : A2; + 3373 : 10; + 3374 : 86; + 3375 : 96; + 3376 : D0; + 3377 : 02; + 3378 : 91; + 3379 : FB; + 337A : E6; + 337B : FB; + 337C : D0; + 337D : 02; + 337E : E6; + 337F : FC; + 3380 : 24; + 3381 : 96; + 3382 : 50; + 3383 : D1; + [3384..3386] : EA; + 3387 : A5; + 3388 : FB; + 3389 : 85; + 338A : C9; + 338B : A5; + 338C : FC; + 338D : 85; + 338E : CA; + 338F : 20; + 3390 : 7F; + 3391 : F1; + 3392 : 4C; + 3393 : F0; + 3394 : F6; + 3395 : 20; + 3396 : 56; + 3397 : F6; + 3398 : 20; + 3399 : 12; + 339A : F8; + 339B : 20; + 339C : 0A; + 339D : F4; + 339E : A5; + 339F : D1; + 33A0 : F0; + 33A1 : 08; + 33A2 : 20; + 33A3 : 94; + 33A4 : F4; + 33A5 : D0; + 33A6 : 08; + 33A7 : 4C; + 33A8 : 6E; + 33A9 : F5; + 33AA : 20; + 33AB : A6; + 33AC : F5; + 33AD : F0; + 33AE : F8; + 33AF : E0; + 33B0 : 01; + 33B1 : D0; + 33B2 : EB; + 33B3 : A5; + 33B4 : 96; + 33B5 : 29; + 33B6 : 10; + 33B7 : D0; + 33B8 : 74; + 33B9 : 20; + 33BA : 3C; + 33BB : F6; + 33BC : 20; + 33BD : 2E; + 33BE : F4; + 33BF : 4C; + 33C0 : 5E; + 33C1 : F8; + 33C2 : A9; + 33C3 : 00; + 33C4 : 85; + 33C5 : 9D; + 33C6 : 20; + 33C7 : 3E; + 33C8 : F4; + 33C9 : 20; + 33CA : 8D; + 33CB : F6; + 33CC : A9; + 33CD : FF; + 33CE : C5; + 33CF : 9B; + 33D0 : D0; + 33D1 : FC; + 33D2 : C5; + 33D3 : 9B; + 33D4 : D0; + 33D5 : F8; + 33D6 : 20; + 33D7 : 22; + 33D8 : F3; + 33D9 : A5; + 33DA : 9D; + 33DB : D0; + 33DC : 50; + 33DD : 20; + 33DE : E6; + 33DF : F8; + 33E0 : A5; + 33E1 : 96; + 33E2 : 29; + 33E3 : 10; + 33E4 : F0; + 33E5 : 09; + 33E6 : A0; + 33E7 : 00; + 33E8 : 84; + 33E9 : 9E; + 33EA : A0; + 33EB : 60; + 33EC : 4C; + 33ED : 70; + 33EE : F5; + 33EF : A0; + 33F0 : AE; + 33F1 : 20; + 33F2 : 15; + 33F3 : F3; + 33F4 : 20; + 33F5 : 1D; + 33F6 : F3; + 33F7 : D0; + 33F8 : 0B; + 33F9 : A5; + 33FA : CA; + 33FB : 85; + 33FC : 2B; + 33FD : A5; + 33FE : C9; + 33FF : 85; + 3400 : 2A; + 3401 : 4C; + 3402 : 39; + 3403 : C4; + 3404 : 20; + 3405 : A7; + 3406 : C5; + 3407 : 4C; + 3408 : 90; + 3409 : C5; + 340A : 20; + 340B : 1D; + 340C : F3; + 340D : D0; + 340E : 1E; + 340F : A0; + 3410 : 32; + 3411 : 20; + 3412 : 56; + 3413 : F1; + 3414 : A5; + 3415 : D1; + 3416 : F0; + 3417 : 15; + 3418 : A0; + 3419 : 3D; + 341A : 20; + 341B : 56; + 341C : F1; + 341D : A4; + 341E : D1; + 341F : F0; + 3420 : 0C; + 3421 : A0; + 3422 : 00; + 3423 : B1; + 3424 : DA; + 3425 : 20; + 3426 : D2; + 3427 : FF; + 3428 : C8; + 3429 : C4; + 342A : D1; + 342B : D0; + 342C : F6; + 342D : 60; + 342E : A0; + 342F : 5F; + 3430 : A5; + 3431 : 9D; + 3432 : F0; + 3433 : 02; + 3434 : A0; + 3435 : 6D; + 3436 : 20; + 3437 : 15; + 3438 : F3; + 3439 : A0; + 343A : 39; + 343B : 4C; + 343C : 15; + 343D : F3; + 343E : A2; + 343F : 00; + 3440 : 86; + 3441 : 96; + 3442 : 86; + 3443 : D1; + 3444 : 86; + 3445 : D3; + 3446 : E8; + 3447 : 86; + 3448 : D4; + 3449 : 20; + 344A : 0E; + 344B : F5; + 344C : 20; + 344D : FD; + 344E : F4; + 344F : 20; + 3450 : 0E; + 3451 : F5; + 3452 : 20; + 3453 : 60; + 3454 : F4; + 3455 : 86; + 3456 : D4; + 3457 : 20; + 3458 : 0E; + 3459 : F5; + 345A : 20; + 345B : 60; + 345C : F4; + 345D : 86; + 345E : D3; + 345F : 60; + 3460 : 20; + 3461 : 16; + 3462 : F5; + 3463 : 4C; + 3464 : 78; + 3465 : D6; + 3466 : A5; + 3467 : D3; + 3468 : 30; + 3469 : F5; + 346A : A4; + 346B : D1; + 346C : F0; + 346D : F1; + 346E : 20; + 346F : BA; + 3470 : F0; + 3471 : A5; + 3472 : D3; + 3473 : 09; + 3474 : F0; + 3475 : 20; + 3476 : 28; + 3477 : F1; + 3478 : A5; + 3479 : 96; + 347A : 10; + 347B : 05; + 347C : A0; + 347D : 74; + 347E : 4C; + 347F : 70; + 3480 : F5; + 3481 : A5; + 3482 : D1; + 3483 : F0; + 3484 : 0C; + 3485 : A0; + 3486 : 00; + 3487 : B1; + 3488 : DA; + 3489 : 20; + 348A : 6F; + 348B : F1; + 348C : C8; + 348D : C4; + 348E : D1; + 348F : D0; + 3490 : F6; + 3491 : 4C; + 3492 : 83; + 3493 : F1; + 3494 : 20; + 3495 : A6; + 3496 : F5; + 3497 : F0; + 3498 : 1D; + 3499 : A0; + 349A : 05; + 349B : 84; + 349C : B5; + 349D : A0; + 349E : 00; + 349F : 84; + 34A0 : B4; + 34A1 : C4; + 34A2 : D1; + 34A3 : F0; + 34A4 : 10; + 34A5 : B1; + 34A6 : DA; + 34A7 : A4; + 34A8 : B5; + 34A9 : D1; + 34AA : D6; + 34AB : D0; + 34AC : E7; + 34AD : E6; + 34AE : B4; + 34AF : E6; + 34B0 : B5; + 34B1 : A4; + 34B2 : B4; + 34B3 : D0; + 34B4 : EC; + 34B5 : 98; + 34B6 : 60; + 34B7 : A9; + 34B8 : 01; + 34B9 : 85; + 34BA : 9D; + 34BB : 20; + 34BC : C6; + 34BD : F3; + 34BE : A5; + 34BF : 96; + 34C0 : 29; + 34C1 : 10; + 34C2 : F0; + 34C3 : 05; + 34C4 : A0; + 34C5 : 6E; + 34C6 : 4C; + 34C7 : 70; + 34C8 : F5; + 34C9 : A0; + 34CA : AA; + 34CB : 4C; + 34CC : 56; + 34CD : F1; + 34CE : A2; + 34CF : 00; + 34D0 : 86; + 34D1 : D3; + 34D2 : 86; + 34D3 : 96; + 34D4 : 86; + 34D5 : D1; + 34D6 : E8; + 34D7 : 86; + 34D8 : D4; + 34D9 : 20; + 34DA : 19; + 34DB : F5; + 34DC : 20; + 34DD : 78; + 34DE : D6; + 34DF : 86; + 34E0 : D2; + 34E1 : 20; + 34E2 : 0E; + 34E3 : F5; + 34E4 : 20; + 34E5 : 60; + 34E6 : F4; + 34E7 : 86; + 34E8 : D4; + 34E9 : E0; + 34EA : 03; + 34EB : 90; + 34EC : 02; + 34ED : C6; + 34EE : D3; + 34EF : 20; + 34F0 : 0E; + 34F1 : F5; + 34F2 : 20; + 34F3 : 60; + 34F4 : F4; + 34F5 : 86; + 34F6 : D3; + 34F7 : 20; + 34F8 : 0E; + 34F9 : F5; + 34FA : 20; + 34FB : 16; + 34FC : F5; + 34FD : 20; + 34FE : 9F; + 34FF : CC; + 3500 : 20; + 3501 : 7D; + 3502 : D5; + 3503 : 85; + 3504 : D1; + 3505 : A5; + 3506 : 1F; + 3507 : 85; + 3508 : DA; + 3509 : A5; + 350A : 20; + 350B : 85; + 350C : DB; + 350D : 60; + 350E : 20; + 350F : 76; + 3510 : 00; + 3511 : D0; + 3512 : 02; + [3513..3514] : 68; + 3515 : 60; + 3516 : 20; + 3517 : F8; + 3518 : CD; + 3519 : 20; + 351A : 76; + 351B : 00; + 351C : D0; + 351D : F7; + 351E : 4C; + 351F : 03; + 3520 : CE; + 3521 : 20; + 3522 : CE; + 3523 : F4; + 3524 : A5; + 3525 : D2; + 3526 : F0; + 3527 : F6; + 3528 : A0; + 3529 : 0E; + 352A : 20; + 352B : 8D; + 352C : F2; + 352D : F0; + 352E : 41; + 352F : A6; + 3530 : AE; + 3531 : A0; + 3532 : 00; + 3533 : 84; + 3534 : 96; + 3535 : E0; + 3536 : 0A; + 3537 : F0; + 3538 : 37; + 3539 : E6; + 353A : AE; + 353B : A5; + 353C : D2; + 353D : 9D; + 353E : 51; + 353F : 02; + 3540 : A5; + 3541 : D3; + 3542 : 09; + 3543 : 60; + 3544 : 85; + 3545 : D3; + 3546 : 9D; + 3547 : 65; + 3548 : 02; + 3549 : A5; + 354A : D4; + 354B : 9D; + 354C : 5B; + 354D : 02; + 354E : F0; + 354F : 55; + 3550 : C9; + 3551 : 03; + 3552 : F0; + 3553 : 51; + 3554 : 90; + 3555 : 03; + 3556 : 4C; + 3557 : 66; + 3558 : F4; + 3559 : A5; + 355A : D3; + 355B : 29; + 355C : 0F; + 355D : D0; + 355E : 2B; + 355F : 20; + 3560 : 12; + 3561 : F8; + 3562 : 20; + 3563 : 0A; + 3564 : F4; + 3565 : A5; + 3566 : D1; + 3567 : F0; + 3568 : 1A; + 3569 : 20; + 356A : 94; + 356B : F4; + 356C : D0; + 356D : 24; + 356E : A0; + 356F : 24; + 3570 : 20; + 3571 : 6E; + 3572 : F2; + 3573 : A9; + 3574 : 0D; + 3575 : 20; + 3576 : D2; + 3577 : FF; + 3578 : A9; + 3579 : 3F; + 357A : 20; + 357B : D2; + 357C : FF; + 357D : 20; + 357E : 56; + 357F : F1; + 3580 : 4C; + 3581 : 77; + 3582 : C3; + 3583 : 20; + 3584 : A6; + 3585 : F5; + 3586 : F0; + 3587 : E6; + 3588 : D0; + 3589 : 08; + 358A : 20; + 358B : 47; + 358C : F8; + 358D : A9; + 358E : 04; + 358F : 20; + 3590 : DA; + 3591 : F5; + 3592 : A6; + 3593 : D4; + 3594 : A9; + 3595 : BF; + 3596 : A4; + 3597 : D3; + 3598 : C0; + 3599 : 60; + 359A : F0; + 359B : 07; + 359C : A0; + 359D : 00; + 359E : A9; + 359F : 02; + 35A0 : 91; + 35A1 : D6; + 35A2 : 98; + 35A3 : 95; + 35A4 : BA; + 35A5 : 60; + 35A6 : A5; + 35A7 : 9D; + 35A8 : 48; + 35A9 : 20; + 35AA : 55; + 35AB : F8; + 35AC : A0; + 35AD : 00; + 35AE : B1; + 35AF : D6; + 35B0 : C9; + 35B1 : 05; + 35B2 : F0; + 35B3 : 21; + 35B4 : C9; + 35B5 : 01; + 35B6 : F0; + 35B7 : 04; + 35B8 : C9; + 35B9 : 04; + 35BA : D0; + 35BB : ED; + 35BC : AA; + 35BD : 20; + 35BE : 1D; + 35BF : F3; + 35C0 : D0; + 35C1 : 11; + 35C2 : A0; + 35C3 : A3; + 35C4 : 20; + 35C5 : 56; + 35C6 : F1; + 35C7 : A0; + 35C8 : 05; + 35C9 : B1; + 35CA : D6; + 35CB : 20; + 35CC : D2; + 35CD : FF; + 35CE : C8; + 35CF : C0; + 35D0 : 15; + 35D1 : D0; + 35D2 : F6; + 35D3 : A0; + 35D4 : 01; + 35D5 : 68; + 35D6 : 85; + 35D7 : 9D; + 35D8 : 98; + 35D9 : 60; + 35DA : 85; + 35DB : B4; + 35DC : 20; + 35DD : 56; + 35DE : F6; + 35DF : A5; + 35E0 : FC; + 35E1 : 48; + 35E2 : A5; + 35E3 : FB; + 35E4 : 48; + 35E5 : A5; + 35E6 : CA; + 35E7 : 48; + 35E8 : A5; + 35E9 : C9; + 35EA : 48; + 35EB : A0; + 35EC : BF; + 35ED : A9; + 35EE : 20; + 35EF : 91; + 35F0 : D6; + 35F1 : 88; + 35F2 : D0; + 35F3 : FB; + 35F4 : A5; + 35F5 : B4; + 35F6 : 91; + 35F7 : D6; + 35F8 : C8; + 35F9 : A5; + 35FA : FB; + 35FB : 91; + 35FC : D6; + 35FD : C8; + 35FE : A5; + 35FF : FC; + 3600 : 91; + 3601 : D6; + 3602 : C8; + 3603 : A5; + 3604 : C9; + 3605 : 91; + 3606 : D6; + 3607 : C8; + 3608 : A5; + 3609 : CA; + 360A : 91; + 360B : D6; + 360C : C8; + 360D : 84; + 360E : B5; + 360F : A0; + 3610 : 00; + 3611 : 84; + 3612 : B4; + 3613 : A4; + 3614 : B4; + 3615 : C4; + 3616 : D1; + 3617 : F0; + 3618 : 0C; + 3619 : B1; + 361A : DA; + 361B : A4; + 361C : B5; + 361D : 91; + 361E : D6; + 361F : E6; + 3620 : B4; + 3621 : E6; + 3622 : B5; + 3623 : D0; + 3624 : EE; + 3625 : 20; + 3626 : 6C; + 3627 : F6; + 3628 : A9; + 3629 : 69; + 362A : 85; + 362B : C3; + 362C : 20; + 362D : 90; + 362E : F8; + 362F : 68; + 3630 : 85; + 3631 : C9; + 3632 : 68; + 3633 : 85; + 3634 : CA; + 3635 : 68; + 3636 : 85; + 3637 : FB; + 3638 : 68; + 3639 : 85; + 363A : FC; + 363B : 60; + 363C : 20; + 363D : E6; + 363E : F8; + 363F : A2; + 3640 : 00; + 3641 : A0; + 3642 : 01; + 3643 : B1; + 3644 : D6; + 3645 : 95; + 3646 : C7; + 3647 : E8; + 3648 : C8; + 3649 : E0; + 364A : 04; + 364B : D0; + 364C : F6; + 364D : A5; + 364E : C7; + 364F : 85; + 3650 : FB; + 3651 : A5; + 3652 : C8; + 3653 : 85; + 3654 : FC; + 3655 : 60; + 3656 : A9; + 3657 : 7A; + 3658 : 85; + 3659 : D6; + 365A : A9; + 365B : 02; + 365C : 85; + 365D : D7; + 365E : A5; + 365F : D4; + 3660 : 4A; + 3661 : B0; + 3662 : 08; + 3663 : A9; + 3664 : 3A; + 3665 : 85; + 3666 : D6; + 3667 : A9; + 3668 : 03; + 3669 : 85; + 366A : D7; + 366B : 60; + 366C : 20; + 366D : E6; + 366E : F8; + 366F : 20; + 3670 : 56; + 3671 : F6; + 3672 : A5; + 3673 : D6; + 3674 : 85; + 3675 : FB; + 3676 : 18; + 3677 : 69; + 3678 : C0; + 3679 : 85; + 367A : C9; + 367B : A5; + 367C : D7; + 367D : 85; + 367E : FC; + 367F : 69; + 3680 : 00; + 3681 : 85; + 3682 : CA; + 3683 : 60; + 3684 : 20; + 3685 : 8B; + 3686 : CC; + 3687 : 20; + 3688 : D2; + 3689 : D6; + 368A : 6C; + 368B : 11; + 368C : 00; + 368D : A5; + 368E : 2A; + 368F : 85; + 3690 : C9; + 3691 : A5; + 3692 : 2B; + 3693 : 85; + 3694 : CA; + 3695 : A5; + 3696 : 29; + 3697 : 85; + 3698 : FC; + 3699 : A5; + 369A : 28; + 369B : 85; + 369C : FB; + 369D : 60; + 369E : 20; + 369F : 3E; + 36A0 : F4; + 36A1 : 20; + 36A2 : 8D; + 36A3 : F6; + 36A4 : A5; + 36A5 : D4; + 36A6 : D0; + 36A7 : 05; + 36A8 : A0; + 36A9 : 74; + 36AA : 4C; + 36AB : 70; + 36AC : F5; + 36AD : C9; + 36AE : 03; + 36AF : F0; + 36B0 : F7; + 36B1 : 90; + 36B2 : 50; + 36B3 : A9; + 36B4 : 61; + 36B5 : 85; + 36B6 : D3; + 36B7 : A4; + 36B8 : D1; + 36B9 : D0; + 36BA : 03; + 36BB : 4C; + 36BC : 03; + 36BD : CE; + 36BE : 20; + 36BF : 66; + 36C0 : F4; + 36C1 : 20; + 36C2 : BA; + 36C3 : F0; + 36C4 : A5; + 36C5 : D3; + 36C6 : 20; + 36C7 : 28; + 36C8 : F1; + 36C9 : A0; + 36CA : 00; + 36CB : 20; + 36CC : 76; + 36CD : FB; + 36CE : A5; + 36CF : C7; + 36D0 : 20; + 36D1 : 6F; + 36D2 : F1; + 36D3 : A5; + 36D4 : C8; + 36D5 : 20; + 36D6 : 6F; + 36D7 : F1; + 36D8 : 20; + 36D9 : C6; + 36DA : FC; + 36DB : F0; + 36DC : 10; + 36DD : B1; + 36DE : C7; + 36DF : 20; + 36E0 : 6F; + 36E1 : F1; + 36E2 : 20; + 36E3 : 0F; + 36E4 : F3; + 36E5 : E6; + 36E6 : C7; + 36E7 : D0; + 36E8 : EF; + 36E9 : E6; + 36EA : C8; + 36EB : D0; + 36EC : EB; + 36ED : 20; + 36EE : 83; + 36EF : F1; + 36F0 : 24; + 36F1 : D3; + 36F2 : 30; + 36F3 : 78; + 36F4 : 20; + 36F5 : BA; + 36F6 : F0; + 36F7 : A5; + 36F8 : D3; + 36F9 : 29; + 36FA : EF; + 36FB : 09; + 36FC : E0; + 36FD : 20; + 36FE : 28; + 36FF : F1; + 3700 : 4C; + 3701 : 83; + 3702 : F1; + 3703 : 20; + 3704 : 56; + 3705 : F6; + 3706 : 20; + 3707 : 47; + 3708 : F8; + 3709 : 20; + 370A : 1D; + 370B : F3; + 370C : D0; + 370D : 08; + 370E : A0; + 370F : 64; + 3710 : 20; + 3711 : 56; + 3712 : F1; + 3713 : 20; + 3714 : 1D; + 3715 : F4; + 3716 : A9; + 3717 : 01; + 3718 : 20; + 3719 : DA; + 371A : F5; + 371B : 20; + 371C : 89; + 371D : F8; + 371E : A5; + 371F : D3; + 3720 : 29; + 3721 : 02; + 3722 : F0; + 3723 : 48; + 3724 : A9; + 3725 : 05; + 3726 : 4C; + 3727 : DA; + 3728 : F5; + 3729 : E6; + 372A : 99; + 372B : A5; + 372C : 99; + 372D : D0; + 372E : 02; + 372F : E6; + 3730 : 9A; + 3731 : C9; + 3732 : 6F; + 3733 : D0; + 3734 : 06; + 3735 : A5; + 3736 : 9A; + 3737 : C9; + 3738 : 02; + 3739 : F0; + 373A : 21; + 373B : E6; + 373C : 8F; + 373D : D0; + 373E : 06; + 373F : E6; + 3740 : 8E; + 3741 : D0; + 3742 : 02; + 3743 : E6; + 3744 : 8D; + 3745 : A2; + 3746 : 00; + 3747 : B5; + 3748 : 8D; + 3749 : DD; + 374A : 6D; + 374B : F7; + 374C : 90; + 374D : 14; + 374E : E8; + 374F : E0; + 3750 : 03; + 3751 : D0; + 3752 : F4; + 3753 : A9; + 3754 : 00; + 3755 : 95; + 3756 : 8C; + 3757 : CA; + 3758 : D0; + 3759 : FB; + 375A : F0; + 375B : 06; + 375C : A9; + 375D : 00; + 375E : 85; + 375F : 99; + 3760 : 85; + 3761 : 9A; + 3762 : AD; + 3763 : 12; + 3764 : E8; + 3765 : CD; + 3766 : 12; + 3767 : E8; + 3768 : D0; + 3769 : F8; + 376A : 85; + 376B : 9B; + 376C : 60; + 376D : 4F; + 376E : 1A; + 376F : 01; + 3770 : 48; + 3771 : 8A; + 3772 : 48; + 3773 : 98; + 3774 : 48; + 3775 : A9; + 3776 : 00; + 3777 : 85; + 3778 : 96; + 3779 : 8A; + 377A : 20; + 377B : 8D; + 377C : F2; + 377D : F0; + 377E : 05; + 377F : A0; + 3780 : 17; + 3781 : 4C; + 3782 : 70; + 3783 : F5; + 3784 : 20; + 3785 : 99; + 3786 : F2; + 3787 : A5; + 3788 : D4; + 3789 : F0; + 378A : 10; + 378B : C9; + 378C : 03; + 378D : F0; + 378E : 0C; + 378F : B0; + 3790 : 0F; + 3791 : A6; + 3792 : D3; + 3793 : E0; + 3794 : 60; + 3795 : F0; + 3796 : 04; + 3797 : A0; + 3798 : 86; + 3799 : D0; + 379A : E6; + 379B : 85; + 379C : AF; + 379D : 4C; + 379E : 68; + 379F : F2; + 37A0 : 48; + 37A1 : 20; + 37A2 : B6; + 37A3 : F0; + 37A4 : A5; + 37A5 : D3; + 37A6 : 10; + 37A7 : 06; + 37A8 : 20; + 37A9 : 69; + 37AA : F1; + 37AB : 4C; + 37AC : B1; + 37AD : F7; + 37AE : 20; + 37AF : 64; + 37B0 : F1; + 37B1 : A5; + 37B2 : 96; + 37B3 : 10; + 37B4 : 03; + 37B5 : 4C; + 37B6 : 7C; + 37B7 : F4; + 37B8 : 68; + 37B9 : 4C; + 37BA : 9B; + 37BB : F7; + 37BC : 48; + 37BD : 8A; + 37BE : 48; + 37BF : 98; + 37C0 : 48; + 37C1 : A9; + 37C2 : 00; + 37C3 : 85; + 37C4 : 96; + 37C5 : 8A; + 37C6 : 20; + 37C7 : 8D; + 37C8 : F2; + 37C9 : D0; + 37CA : B4; + 37CB : 20; + 37CC : 99; + 37CD : F2; + 37CE : A5; + 37CF : D4; + 37D0 : D0; + 37D1 : 04; + 37D2 : A0; + 37D3 : 94; + 37D4 : D0; + 37D5 : AB; + 37D6 : C9; + 37D7 : 03; + 37D8 : F0; + 37D9 : 0C; + 37DA : 10; + 37DB : 0F; + 37DC : A6; + 37DD : D3; + 37DE : E0; + 37DF : 60; + 37E0 : D0; + 37E1 : 04; + 37E2 : A0; + 37E3 : 94; + 37E4 : D0; + 37E5 : 9B; + 37E6 : 85; + 37E7 : B0; + 37E8 : 4C; + 37E9 : 68; + 37EA : F2; + 37EB : 48; + 37EC : 20; + 37ED : BA; + 37EE : F0; + 37EF : A5; + 37F0 : D3; + 37F1 : 10; + 37F2 : 05; + 37F3 : 20; + 37F4 : 2D; + 37F5 : F1; + 37F6 : D0; + 37F7 : 03; + 37F8 : 20; + 37F9 : 28; + 37FA : F1; + 37FB : A5; + 37FC : 96; + 37FD : 10; + 37FE : 03; + 37FF : 4C; + 3800 : 7C; + 3801 : F4; + 3802 : 68; + 3803 : 4C; + 3804 : E6; + 3805 : F7; + 3806 : 20; + 3807 : 56; + 3808 : F6; + 3809 : A6; + 380A : D4; + 380B : F6; + 380C : BA; + 380D : B4; + 380E : BA; + [380F..3810] : C0; + 3811 : 60; + 3812 : 20; + 3813 : 35; + 3814 : F8; + 3815 : F0; + 3816 : 2F; + 3817 : A0; + 3818 : 41; + 3819 : 20; + 381A : 56; + 381B : F1; + 381C : A0; + 381D : 56; + 381E : 20; + 381F : 56; + 3820 : F1; + 3821 : A5; + 3822 : D4; + 3823 : 09; + 3824 : 30; + 3825 : 20; + 3826 : D8; + 3827 : E3; + 3828 : 20; + 3829 : F0; + 382A : F8; + 382B : 20; + 382C : 35; + 382D : F8; + 382E : D0; + 382F : F8; + 3830 : A0; + 3831 : AA; + 3832 : 4C; + 3833 : 56; + 3834 : F1; + 3835 : A9; + 3836 : 10; + 3837 : A6; + 3838 : D4; + 3839 : CA; + 383A : F0; + 383B : 02; + 383C : A9; + 383D : 20; + 383E : 2C; + 383F : 10; + 3840 : E8; + 3841 : D0; + 3842 : 03; + 3843 : 2C; + 3844 : 10; + 3845 : E8; + 3846 : 60; + 3847 : 20; + 3848 : 35; + 3849 : F8; + 384A : F0; + 384B : FA; + 384C : A0; + 384D : 41; + 384E : 20; + 384F : 56; + 3850 : F1; + 3851 : A0; + 3852 : 4D; + 3853 : D0; + 3854 : C4; + 3855 : A9; + 3856 : 00; + 3857 : 85; + 3858 : 96; + 3859 : 85; + 385A : 9D; + 385B : 20; + 385C : 6C; + 385D : F6; + 385E : 20; + 385F : E6; + 3860 : F8; + 3861 : 20; + 3862 : 12; + 3863 : F8; + 3864 : 78; + 3865 : A9; + 3866 : 00; + 3867 : 85; + 3868 : C2; + 3869 : 85; + 386A : CE; + 386B : 85; + 386C : CB; + 386D : 85; + 386E : C0; + 386F : 85; + 3870 : C1; + 3871 : 85; + 3872 : B2; + 3873 : A6; + 3874 : D4; + 3875 : CA; + 3876 : F0; + 3877 : 07; + 3878 : A9; + 3879 : 90; + 387A : 8D; + 387B : 4E; + 387C : E8; + 387D : D0; + 387E : 03; + 387F : EE; + 3880 : 11; + 3881 : E8; + 3882 : A2; + 3883 : 0E; + 3884 : D0; + 3885 : 15; + 3886 : 20; + 3887 : 6C; + 3888 : F6; + 3889 : 20; + 388A : E6; + 388B : F8; + 388C : A9; + 388D : 14; + 388E : 85; + 388F : C3; + 3890 : 20; + 3891 : 47; + 3892 : F8; + 3893 : 78; + 3894 : A9; + 3895 : A0; + 3896 : 8D; + 3897 : 4E; + 3898 : E8; + 3899 : A2; + 389A : 08; + 389B : 20; + 389C : 9B; + 389D : FC; + 389E : A9; + 389F : 02; + 38A0 : 85; + 38A1 : DE; + 38A2 : 20; + 38A3 : 84; + 38A4 : FB; + 38A5 : CE; + 38A6 : 13; + 38A7 : E8; + 38A8 : A6; + 38A9 : D4; + 38AA : CA; + 38AB : D0; + 38AC : 09; + 38AD : A9; + 38AE : 34; + 38AF : 8D; + 38B0 : 13; + 38B1 : E8; + 38B2 : 85; + 38B3 : F9; + 38B4 : D0; + 38B5 : 0A; + 38B6 : AD; + 38B7 : 40; + 38B8 : E8; + 38B9 : 86; + 38BA : FA; + 38BB : 29; + 38BC : EF; + 38BD : 8D; + 38BE : 40; + 38BF : E8; + 38C0 : A2; + 38C1 : FF; + 38C2 : A0; + 38C3 : FF; + 38C4 : 88; + 38C5 : D0; + 38C6 : FD; + 38C7 : CA; + 38C8 : D0; + 38C9 : F8; + 38CA : 8D; + 38CB : 49; + 38CC : E8; + 38CD : 58; + 38CE : A9; + 38CF : E6; + 38D0 : C5; + 38D1 : 91; + 38D2 : F0; + 38D3 : 11; + 38D4 : 20; + 38D5 : F0; + 38D6 : F8; + 38D7 : 2C; + 38D8 : 13; + 38D9 : E8; + 38DA : 10; + 38DB : F2; + 38DC : 2C; + 38DD : 12; + 38DE : E8; + 38DF : 20; + 38E0 : 29; + 38E1 : F7; + 38E2 : 4C; + 38E3 : CE; + 38E4 : F8; + 38E5 : 60; + 38E6 : 20; + 38E7 : F0; + 38E8 : F8; + 38E9 : A9; + 38EA : E6; + 38EB : C5; + 38EC : 91; + 38ED : D0; + 38EE : F7; + 38EF : 60; + 38F0 : 20; + 38F1 : 01; + 38F2 : F3; + 38F3 : D0; + 38F4 : 08; + 38F5 : 20; + 38F6 : 7B; + 38F7 : FC; + 38F8 : 20; + 38F9 : 84; + 38FA : F2; + 38FB : 85; + 38FC : 0E; + 38FD : 4C; + 38FE : 3F; + 38FF : C7; + 3900 : 86; + 3901 : CC; + 3902 : A5; + 3903 : CB; + [3904..3905] : 0A; + 3906 : 18; + 3907 : 65; + 3908 : CB; + 3909 : 18; + 390A : 65; + 390B : CC; + 390C : 85; + 390D : CC; + 390E : A9; + 390F : 00; + 3910 : 24; + 3911 : CB; + 3912 : 30; + 3913 : 01; + 3914 : 2A; + 3915 : 06; + 3916 : CC; + 3917 : 2A; + 3918 : 06; + 3919 : CC; + 391A : 2A; + 391B : AA; + 391C : AD; + 391D : 48; + 391E : E8; + 391F : C9; + 3920 : 15; + 3921 : 90; + 3922 : F9; + 3923 : 65; + 3924 : CC; + 3925 : 8D; + 3926 : 44; + 3927 : E8; + 3928 : 8A; + 3929 : 6D; + 392A : 49; + 392B : E8; + 392C : 8D; + 392D : 45; + 392E : E8; + 392F : 58; + 3930 : 60; + 3931 : AE; + 3932 : 49; + 3933 : E8; + 3934 : A0; + 3935 : FF; + 3936 : 98; + 3937 : ED; + 3938 : 48; + 3939 : E8; + 393A : EC; + 393B : 49; + 393C : E8; + 393D : D0; + 393E : F2; + 393F : 86; + 3940 : CC; + 3941 : AA; + 3942 : 8C; + 3943 : 48; + 3944 : E8; + 3945 : 8C; + 3946 : 49; + 3947 : E8; + 3948 : 98; + 3949 : E5; + 394A : CC; + 394B : 86; + 394C : CC; + 394D : 4A; + 394E : 66; + 394F : CC; + 3950 : 4A; + 3951 : 66; + 3952 : CC; + 3953 : A5; + 3954 : CB; + 3955 : 18; + 3956 : 69; + 3957 : 3C; + 3958 : 2C; + 3959 : 40; + 395A : E8; + 395B : 2C; + 395C : 10; + 395D : E8; + 395E : C5; + 395F : CC; + 3960 : B0; + 3961 : 4A; + 3962 : A6; + 3963 : B2; + 3964 : F0; + 3965 : 03; + 3966 : 4C; + 3967 : 57; + 3968 : FA; + 3969 : A6; + 396A : B7; + 396B : 30; + 396C : 1B; + 396D : A2; + 396E : 00; + 396F : 69; + 3970 : 30; + 3971 : 65; + 3972 : CB; + 3973 : C5; + 3974 : CC; + 3975 : B0; + 3976 : 1C; + 3977 : E8; + 3978 : 69; + 3979 : 26; + 397A : 65; + 397B : CB; + 397C : C5; + 397D : CC; + 397E : B0; + 397F : 17; + 3980 : 69; + 3981 : 2C; + 3982 : 65; + 3983 : CB; + 3984 : C5; + 3985 : CC; + 3986 : 90; + 3987 : 03; + 3988 : 4C; + 3989 : 07; + 398A : FA; + 398B : A5; + 398C : CE; + 398D : F0; + 398E : 1D; + 398F : 85; + 3990 : BE; + 3991 : D0; + 3992 : 19; + 3993 : E6; + 3994 : BF; + 3995 : B0; + 3996 : 02; + 3997 : C6; + 3998 : BF; + 3999 : 38; + 399A : E9; + 399B : 13; + 399C : E5; + 399D : CC; + 399E : 65; + 399F : 9C; + 39A0 : 85; + 39A1 : 9C; + 39A2 : A5; + 39A3 : B9; + 39A4 : 49; + 39A5 : 01; + 39A6 : 85; + 39A7 : B9; + 39A8 : F0; + 39A9 : 21; + 39AA : 86; + 39AB : D9; + 39AC : A5; + 39AD : CE; + 39AE : F0; + 39AF : 18; + 39B0 : 2C; + 39B1 : 4D; + 39B2 : E8; + 39B3 : 50; + 39B4 : 13; + 39B5 : A9; + 39B6 : 00; + 39B7 : 85; + 39B8 : B9; + 39B9 : A5; + 39BA : B7; + 39BB : 10; + 39BC : 31; + 39BD : 30; + 39BE : C9; + 39BF : A2; + 39C0 : A6; + 39C1 : 20; + 39C2 : 00; + 39C3 : F9; + 39C4 : A5; + 39C5 : B1; + 39C6 : D0; + 39C7 : C3; + 39C8 : 4C; + 39C9 : E4; + 39CA : E6; + 39CB : A5; + 39CC : 9C; + 39CD : F0; + 39CE : 08; + 39CF : 30; + 39D0 : 04; + 39D1 : C6; + 39D2 : CB; + 39D3 : C6; + 39D4 : CB; + 39D5 : E6; + 39D6 : CB; + 39D7 : A9; + 39D8 : 00; + 39D9 : 85; + 39DA : 9C; + 39DB : E4; + 39DC : D9; + 39DD : D0; + 39DE : 0F; + 39DF : 8A; + 39E0 : D0; + 39E1 : A9; + 39E2 : A5; + 39E3 : BF; + 39E4 : 30; + 39E5 : C6; + 39E6 : C9; + 39E7 : 10; + 39E8 : 90; + 39E9 : C2; + 39EA : 85; + 39EB : AB; + 39EC : B0; + 39ED : BE; + 39EE : 8A; + 39EF : 45; + 39F0 : B1; + 39F1 : 85; + 39F2 : B1; + 39F3 : A5; + 39F4 : CE; + 39F5 : F0; + 39F6 : D1; + 39F7 : C6; + 39F8 : B7; + 39F9 : 30; + 39FA : C4; + 39FB : 46; + 39FC : D9; + 39FD : 66; + 39FE : DF; + 39FF : A2; + 3A00 : DA; + 3A01 : 20; + 3A02 : 00; + 3A03 : F9; + 3A04 : 4C; + 3A05 : E4; + 3A06 : E6; + 3A07 : A5; + 3A08 : AB; + 3A09 : F0; + 3A0A : 04; + 3A0B : A5; + 3A0C : CE; + 3A0D : F0; + 3A0E : 07; + 3A0F : A5; + 3A10 : B7; + 3A11 : 30; + 3A12 : 03; + 3A13 : 4C; + 3A14 : 97; + 3A15 : F9; + 3A16 : 46; + 3A17 : CC; + 3A18 : A9; + 3A19 : 93; + 3A1A : 38; + 3A1B : E5; + 3A1C : CC; + 3A1D : 65; + 3A1E : CB; + 3A1F : 0A; + 3A20 : AA; + 3A21 : 20; + 3A22 : 00; + 3A23 : F9; + 3A24 : E6; + 3A25 : B2; + 3A26 : A5; + 3A27 : CE; + 3A28 : D0; + 3A29 : 11; + 3A2A : A5; + 3A2B : AB; + 3A2C : F0; + 3A2D : 26; + 3A2E : 85; + 3A2F : BE; + 3A30 : A9; + 3A31 : 00; + 3A32 : 85; + 3A33 : AB; + 3A34 : A9; + 3A35 : C0; + 3A36 : 8D; + 3A37 : 4E; + 3A38 : E8; + 3A39 : 85; + 3A3A : CE; + 3A3B : A5; + 3A3C : AB; + 3A3D : 85; + 3A3E : CF; + 3A3F : F0; + 3A40 : 09; + 3A41 : A9; + 3A42 : 00; + 3A43 : 85; + 3A44 : CE; + 3A45 : A9; + 3A46 : 40; + 3A47 : 8D; + 3A48 : 4E; + 3A49 : E8; + 3A4A : A5; + 3A4B : DF; + 3A4C : 85; + 3A4D : DD; + 3A4E : A5; + 3A4F : BE; + 3A50 : 05; + 3A51 : BF; + 3A52 : 85; + 3A53 : D0; + 3A54 : 4C; + 3A55 : E4; + 3A56 : E6; + 3A57 : 20; + 3A58 : 84; + 3A59 : FB; + 3A5A : 85; + 3A5B : B2; + 3A5C : A2; + 3A5D : DA; + 3A5E : 20; + 3A5F : 00; + 3A60 : F9; + 3A61 : A5; + 3A62 : DE; + 3A63 : F0; + 3A64 : 02; + 3A65 : 85; + 3A66 : BD; + 3A67 : A9; + 3A68 : 0F; + 3A69 : 24; + 3A6A : C2; + 3A6B : 10; + 3A6C : 17; + 3A6D : A5; + 3A6E : CF; + 3A6F : D0; + 3A70 : 0C; + 3A71 : A6; + 3A72 : DE; + 3A73 : CA; + 3A74 : D0; + 3A75 : 0B; + 3A76 : A9; + 3A77 : 08; + 3A78 : 20; + 3A79 : 7F; + 3A7A : FB; + 3A7B : D0; + 3A7C : 04; + 3A7D : A9; + 3A7E : 00; + 3A7F : 85; + 3A80 : C2; + 3A81 : 4C; + 3A82 : E4; + 3A83 : E6; + 3A84 : 70; + 3A85 : 31; + 3A86 : D0; + 3A87 : 18; + 3A88 : A5; + 3A89 : CF; + 3A8A : D0; + 3A8B : F5; + 3A8C : A5; + [3A8D..3A8E] : D0; + 3A8F : F1; + 3A90 : A5; + 3A91 : BD; + 3A92 : 4A; + 3A93 : A5; + 3A94 : DD; + 3A95 : 30; + 3A96 : 03; + 3A97 : 90; + [3A98..3A99] : 18; + 3A9A : B0; + 3A9B : 15; + 3A9C : 29; + 3A9D : 0F; + 3A9E : 85; + 3A9F : C2; + 3AA0 : C6; + 3AA1 : C2; + 3AA2 : D0; + 3AA3 : DD; + 3AA4 : A9; + 3AA5 : 40; + 3AA6 : 85; + 3AA7 : C2; + 3AA8 : 20; + 3AA9 : 76; + 3AAA : FB; + 3AAB : A9; + 3AAC : 00; + 3AAD : 85; + 3AAE : C3; + 3AAF : F0; + 3AB0 : D0; + 3AB1 : A9; + 3AB2 : 80; + 3AB3 : 85; + 3AB4 : C2; + 3AB5 : D0; + 3AB6 : CA; + 3AB7 : A5; + 3AB8 : CF; + 3AB9 : F0; + 3ABA : 0A; + 3ABB : A9; + 3ABC : 04; + 3ABD : 20; + 3ABE : 7F; + 3ABF : FB; + 3AC0 : A9; + 3AC1 : 00; + 3AC2 : 4C; + 3AC3 : 46; + 3AC4 : FB; + 3AC5 : 20; + 3AC6 : C6; + 3AC7 : FC; + 3AC8 : D0; + 3AC9 : 03; + 3ACA : 4C; + 3ACB : 44; + 3ACC : FB; + 3ACD : A6; + 3ACE : BD; + 3ACF : CA; + 3AD0 : F0; + 3AD1 : 2D; + 3AD2 : A5; + 3AD3 : 9D; + 3AD4 : F0; + 3AD5 : 0C; + 3AD6 : A0; + 3AD7 : 00; + 3AD8 : A5; + 3AD9 : DD; + 3ADA : D1; + 3ADB : C7; + 3ADC : F0; + 3ADD : 04; + 3ADE : A9; + 3ADF : 01; + 3AE0 : 85; + 3AE1 : D0; + 3AE2 : A5; + 3AE3 : D0; + 3AE4 : F0; + 3AE5 : 4C; + 3AE6 : A2; + 3AE7 : 3D; + 3AE8 : E4; + 3AE9 : C0; + 3AEA : 90; + 3AEB : 3F; + 3AEC : A6; + 3AED : C0; + 3AEE : A5; + 3AEF : C8; + 3AF0 : 9D; + [3AF1..3AF2] : 01; + 3AF3 : A5; + 3AF4 : C7; + 3AF5 : 9D; + 3AF6 : 00; + 3AF7 : 01; + [3AF8..3AF9] : E8; + 3AFA : 86; + 3AFB : C0; + 3AFC : 4C; + 3AFD : 32; + 3AFE : FB; + 3AFF : A6; + 3B00 : C1; + 3B01 : E4; + 3B02 : C0; + 3B03 : F0; + 3B04 : 37; + 3B05 : A5; + 3B06 : C7; + 3B07 : DD; + 3B08 : 00; + 3B09 : 01; + 3B0A : D0; + 3B0B : 30; + 3B0C : A5; + 3B0D : C8; + 3B0E : DD; + [3B0F..3B10] : 01; + 3B11 : D0; + 3B12 : 29; + 3B13 : E6; + 3B14 : C1; + 3B15 : E6; + 3B16 : C1; + 3B17 : A5; + 3B18 : 9D; + 3B19 : F0; + 3B1A : 0C; + 3B1B : A5; + 3B1C : DD; + 3B1D : A0; + 3B1E : 00; + 3B1F : D1; + 3B20 : C7; + 3B21 : F0; + 3B22 : 19; + 3B23 : A9; + 3B24 : 01; + 3B25 : 85; + 3B26 : D0; + 3B27 : A5; + 3B28 : D0; + 3B29 : F0; + 3B2A : 07; + 3B2B : A9; + 3B2C : 10; + 3B2D : 20; + 3B2E : 7F; + 3B2F : FB; + 3B30 : D0; + 3B31 : 0A; + 3B32 : A5; + 3B33 : 9D; + 3B34 : D0; + 3B35 : 06; + 3B36 : A5; + 3B37 : DD; + 3B38 : A0; + 3B39 : 00; + 3B3A : 91; + 3B3B : C7; + 3B3C : E6; + 3B3D : C7; + 3B3E : D0; + 3B3F : 33; + 3B40 : E6; + 3B41 : C8; + 3B42 : D0; + 3B43 : 2F; + 3B44 : A9; + 3B45 : 80; + 3B46 : 85; + 3B47 : C2; + 3B48 : A6; + 3B49 : DE; + 3B4A : CA; + 3B4B : 30; + 3B4C : 02; + 3B4D : 86; + 3B4E : DE; + 3B4F : C6; + 3B50 : BD; + 3B51 : F0; + 3B52 : 08; + 3B53 : A5; + 3B54 : C0; + 3B55 : D0; + 3B56 : 1C; + 3B57 : 85; + 3B58 : DE; + 3B59 : F0; + 3B5A : 18; + 3B5B : 20; + 3B5C : 7B; + 3B5D : FC; + 3B5E : 20; + 3B5F : 76; + 3B60 : FB; + 3B61 : A0; + 3B62 : 00; + 3B63 : 84; + 3B64 : C3; + 3B65 : 20; + 3B66 : B4; + 3B67 : FC; + 3B68 : A5; + 3B69 : C3; + 3B6A : 45; + 3B6B : DD; + 3B6C : F0; + 3B6D : 05; + 3B6E : A9; + [3B6F..3B70] : 20; + 3B71 : 7F; + 3B72 : FB; + 3B73 : 4C; + 3B74 : E4; + 3B75 : E6; + 3B76 : A5; + 3B77 : FC; + 3B78 : 85; + 3B79 : C8; + 3B7A : A5; + 3B7B : FB; + 3B7C : 85; + 3B7D : C7; + 3B7E : 60; + 3B7F : 05; + 3B80 : 96; + 3B81 : 85; + 3B82 : 96; + 3B83 : 60; + 3B84 : A9; + 3B85 : 08; + 3B86 : 85; + 3B87 : B7; + 3B88 : A9; + 3B89 : 00; + 3B8A : 85; + 3B8B : B9; + 3B8C : 85; + 3B8D : BE; + 3B8E : 85; + 3B8F : B1; + 3B90 : 85; + 3B91 : BF; + 3B92 : 60; + 3B93 : A5; + 3B94 : DD; + 3B95 : 4A; + 3B96 : A9; + 3B97 : 60; + 3B98 : 90; + 3B99 : 02; + 3B9A : A9; + 3B9B : B0; + 3B9C : A2; + 3B9D : 00; + 3B9E : 8D; + 3B9F : 48; + 3BA0 : E8; + 3BA1 : 8E; + 3BA2 : 49; + 3BA3 : E8; + 3BA4 : AD; + 3BA5 : 40; + 3BA6 : E8; + 3BA7 : 49; + 3BA8 : 08; + 3BA9 : 8D; + 3BAA : 40; + 3BAB : E8; + 3BAC : 29; + 3BAD : 08; + 3BAE : 60; + 3BAF : 38; + 3BB0 : 66; + 3BB1 : C8; + 3BB2 : 30; + 3BB3 : 3C; + 3BB4 : A5; + 3BB5 : BE; + 3BB6 : D0; + 3BB7 : 12; + 3BB8 : A9; + 3BB9 : 10; + 3BBA : A2; + 3BBB : 01; + 3BBC : 20; + 3BBD : 9E; + 3BBE : FB; + 3BBF : D0; + 3BC0 : 2F; + 3BC1 : E6; + 3BC2 : BE; + 3BC3 : A5; + 3BC4 : C8; + 3BC5 : 10; + 3BC6 : 29; + 3BC7 : 4C; + 3BC8 : 41; + 3BC9 : FC; + 3BCA : A5; + 3BCB : BF; + 3BCC : D0; + 3BCD : 09; + 3BCE : 20; + 3BCF : 9A; + 3BD0 : FB; + 3BD1 : D0; + 3BD2 : 1D; + 3BD3 : E6; + 3BD4 : BF; + 3BD5 : D0; + 3BD6 : 19; + 3BD7 : 20; + 3BD8 : 93; + 3BD9 : FB; + 3BDA : D0; + 3BDB : 14; + 3BDC : A5; + 3BDD : B9; + 3BDE : 49; + 3BDF : 01; + 3BE0 : 85; + 3BE1 : B9; + 3BE2 : F0; + 3BE3 : 0F; + 3BE4 : A5; + 3BE5 : DD; + 3BE6 : 49; + 3BE7 : 01; + 3BE8 : 85; + 3BE9 : DD; + 3BEA : 29; + 3BEB : 01; + 3BEC : 45; + 3BED : B1; + 3BEE : 85; + 3BEF : B1; + 3BF0 : 4C; + 3BF1 : E4; + 3BF2 : E6; + 3BF3 : 46; + 3BF4 : DD; + 3BF5 : C6; + 3BF6 : B7; + 3BF7 : A5; + 3BF8 : B7; + 3BF9 : F0; + 3BFA : 3D; + 3BFB : 10; + 3BFC : F3; + 3BFD : 20; + 3BFE : 84; + 3BFF : FB; + 3C00 : 58; + 3C01 : A5; + 3C02 : BA; + 3C03 : F0; + 3C04 : 12; + 3C05 : A2; + 3C06 : 00; + 3C07 : 86; + 3C08 : D9; + 3C09 : C6; + 3C0A : BA; + 3C0B : A6; + 3C0C : DE; + 3C0D : E0; + 3C0E : 02; + 3C0F : D0; + 3C10 : 02; + 3C11 : 09; + 3C12 : 80; + 3C13 : 85; + 3C14 : DD; + 3C15 : D0; + 3C16 : D9; + 3C17 : 20; + 3C18 : C6; + 3C19 : FC; + 3C1A : 90; + 3C1B : 0A; + 3C1C : D0; + 3C1D : 91; + 3C1E : E6; + 3C1F : C8; + 3C20 : A5; + 3C21 : D9; + 3C22 : 85; + 3C23 : DD; + 3C24 : B0; + 3C25 : CA; + 3C26 : A0; + 3C27 : 00; + 3C28 : B1; + 3C29 : C7; + 3C2A : 85; + 3C2B : DD; + 3C2C : 45; + 3C2D : D9; + 3C2E : 85; + 3C2F : D9; + 3C30 : E6; + 3C31 : C7; + 3C32 : D0; + 3C33 : BC; + 3C34 : E6; + 3C35 : C8; + 3C36 : D0; + 3C37 : B8; + 3C38 : A5; + 3C39 : B1; + 3C3A : 49; + 3C3B : 01; + 3C3C : 85; + 3C3D : DD; + 3C3E : 4C; + 3C3F : E4; + 3C40 : E6; + 3C41 : C6; + 3C42 : DE; + 3C43 : D0; + 3C44 : 03; + 3C45 : 20; + 3C46 : A6; + 3C47 : FC; + 3C48 : A9; + 3C49 : 50; + 3C4A : 85; + 3C4B : BD; + 3C4C : A2; + 3C4D : 08; + 3C4E : 78; + 3C4F : 20; + 3C50 : 9B; + 3C51 : FC; + 3C52 : D0; + 3C53 : EA; + 3C54 : A9; + 3C55 : 78; + 3C56 : 20; + 3C57 : 9C; + 3C58 : FB; + 3C59 : D0; + 3C5A : E3; + 3C5B : C6; + 3C5C : BD; + 3C5D : D0; + 3C5E : DF; + 3C5F : 20; + 3C60 : 84; + 3C61 : FB; + 3C62 : C6; + 3C63 : C3; + 3C64 : 10; + 3C65 : D8; + 3C66 : A2; + 3C67 : 0A; + 3C68 : 20; + 3C69 : 9B; + 3C6A : FC; + 3C6B : 58; + 3C6C : E6; + 3C6D : C3; + 3C6E : A5; + 3C6F : DE; + 3C70 : F0; + 3C71 : 24; + 3C72 : 20; + 3C73 : 76; + 3C74 : FB; + 3C75 : A2; + 3C76 : 09; + 3C77 : 86; + 3C78 : BA; + 3C79 : D0; + 3C7A : 82; + 3C7B : 08; + 3C7C : 78; + 3C7D : 20; + 3C7E : A6; + 3C7F : FC; + 3C80 : A9; + 3C81 : 7F; + 3C82 : 8D; + 3C83 : 4E; + 3C84 : E8; + 3C85 : A9; + 3C86 : 3C; + 3C87 : 8D; + 3C88 : 11; + 3C89 : E8; + 3C8A : A9; + 3C8B : 3D; + 3C8C : 8D; + 3C8D : 13; + 3C8E : E8; + 3C8F : A2; + 3C90 : 0C; + 3C91 : 20; + 3C92 : 9B; + 3C93 : FC; + 3C94 : 28; + 3C95 : 60; + 3C96 : 20; + 3C97 : 7B; + 3C98 : FC; + 3C99 : F0; + 3C9A : A3; + 3C9B : BD; + 3C9C : 01; + 3C9D : FD; + 3C9E : 85; + 3C9F : 90; + 3CA0 : BD; + 3CA1 : 02; + 3CA2 : FD; + 3CA3 : 85; + 3CA4 : 91; + 3CA5 : 60; + 3CA6 : A9; + 3CA7 : 3C; + 3CA8 : 8D; + 3CA9 : 13; + 3CAA : E8; + 3CAB : AD; + 3CAC : 40; + 3CAD : E8; + 3CAE : 09; + 3CAF : 10; + 3CB0 : 8D; + 3CB1 : 40; + 3CB2 : E8; + 3CB3 : 60; + 3CB4 : B1; + 3CB5 : C7; + 3CB6 : 45; + 3CB7 : C3; + 3CB8 : 85; + 3CB9 : C3; + 3CBA : E6; + 3CBB : C7; + 3CBC : D0; + 3CBD : 02; + 3CBE : E6; + 3CBF : C8; + 3CC0 : 20; + 3CC1 : C6; + 3CC2 : FC; + 3CC3 : D0; + 3CC4 : EF; + 3CC5 : 60; + 3CC6 : A5; + 3CC7 : C8; + 3CC8 : C5; + 3CC9 : CA; + 3CCA : D0; + 3CCB : 04; + 3CCC : A5; + 3CCD : C7; + 3CCE : C5; + 3CCF : C9; + 3CD0 : 60; + 3CD1 : A2; + 3CD2 : FF; + 3CD3 : 9A; + 3CD4 : D8; + 3CD5 : 20; + 3CD6 : DE; + 3CD7 : E1; + 3CD8 : A9; + 3CD9 : 89; + 3CDA : 85; + 3CDB : 94; + 3CDC : A9; + 3CDD : C3; + 3CDE : 85; + 3CDF : 95; + 3CE0 : A9; + 3CE1 : 17; + 3CE2 : 85; + 3CE3 : 92; + 3CE4 : A9; + 3CE5 : FD; + 3CE6 : 85; + 3CE7 : 93; + 3CE8 : A9; + 3CE9 : F7; + 3CEA : 8D; + 3CEB : FA; + 3CEC : 03; + 3CED : A9; + 3CEE : E7; + 3CEF : 8D; + 3CF0 : FB; + 3CF1 : 03; + 3CF2 : 58; + 3CF3 : AD; + 3CF4 : 10; + 3CF5 : E8; + 3CF6 : 30; + 3CF7 : 03; + 3CF8 : 4C; + 3CF9 : 11; + 3CFA : FD; + 3CFB : 4C; + 3CFC : 16; + 3CFD : E1; + 3CFE : 6C; + 3CFF : 94; + [3D00..3D08] : 00; + 3D09 : 54; + 3D0A : FC; + 3D0B : B4; + 3D0C : FB; + 3D0D : 2E; + 3D0E : E6; + 3D0F : 31; + 3D10 : F9; + 3D11 : A9; + 3D12 : 43; + 3D13 : 85; + 3D14 : B5; + 3D15 : D0; + 3D16 : 16; + 3D17 : A9; + 3D18 : 42; + 3D19 : 85; + 3D1A : B5; + 3D1B : D8; + 3D1C : 4A; + 3D1D : 68; + 3D1E : 8D; + 3D1F : 05; + 3D20 : 02; + 3D21 : 68; + 3D22 : 8D; + 3D23 : 04; + 3D24 : 02; + 3D25 : 68; + 3D26 : 8D; + 3D27 : 03; + 3D28 : 02; + 3D29 : 68; + 3D2A : 8D; + [3D2B..3D2C] : 02; + 3D2D : 68; + 3D2E : 69; + 3D2F : FF; + 3D30 : 8D; + 3D31 : 01; + 3D32 : 02; + 3D33 : 68; + 3D34 : 69; + 3D35 : FF; + 3D36 : 8D; + 3D37 : 00; + 3D38 : 02; + 3D39 : A5; + 3D3A : 90; + 3D3B : 8D; + 3D3C : 08; + 3D3D : 02; + 3D3E : A5; + 3D3F : 91; + 3D40 : 8D; + 3D41 : 07; + 3D42 : 02; + 3D43 : BA; + 3D44 : 8E; + 3D45 : 06; + 3D46 : 02; + 3D47 : 58; + 3D48 : 20; + 3D49 : D0; + 3D4A : FD; + 3D4B : A6; + 3D4C : B5; + 3D4D : A9; + 3D4E : 2A; + 3D4F : 20; + 3D50 : 84; + 3D51 : E7; + 3D52 : A9; + 3D53 : 52; + 3D54 : D0; + 3D55 : 1A; + 3D56 : A9; + 3D57 : 02; + 3D58 : 85; + 3D59 : 77; + 3D5A : A9; + 3D5B : 00; + 3D5C : 85; + 3D5D : DE; + 3D5E : A2; + 3D5F : 0D; + 3D60 : A9; + 3D61 : 2E; + 3D62 : 20; + 3D63 : 84; + 3D64 : E7; + 3D65 : 20; + 3D66 : EB; + 3D67 : E7; + 3D68 : C9; + 3D69 : 2E; + 3D6A : F0; + 3D6B : F9; + 3D6C : C9; + 3D6D : 20; + 3D6E : F0; + 3D6F : F5; + 3D70 : A2; + 3D71 : 07; + 3D72 : DD; + 3D73 : E0; + 3D74 : FD; + 3D75 : D0; + 3D76 : 0B; + 3D77 : 86; + 3D78 : B4; + 3D79 : BD; + 3D7A : E8; + 3D7B : FD; + 3D7C : 48; + 3D7D : BD; + 3D7E : F0; + 3D7F : FD; + 3D80 : 48; + 3D81 : 60; + 3D82 : CA; + 3D83 : 10; + 3D84 : ED; + 3D85 : 6C; + 3D86 : FA; + 3D87 : 03; + 3D88 : A5; + 3D89 : FB; + 3D8A : 8D; + 3D8B : 01; + 3D8C : 02; + 3D8D : A5; + 3D8E : FC; + 3D8F : 8D; + 3D90 : 00; + 3D91 : 02; + 3D92 : 60; + 3D93 : 85; + 3D94 : B5; + 3D95 : A0; + 3D96 : 00; + 3D97 : 20; + 3D98 : CD; + 3D99 : FD; + 3D9A : B1; + 3D9B : FB; + 3D9C : 20; + 3D9D : 75; + 3D9E : E7; + 3D9F : 20; + 3DA0 : D5; + 3DA1 : FD; + 3DA2 : C6; + 3DA3 : B5; + 3DA4 : D0; + 3DA5 : F1; + 3DA6 : 60; + 3DA7 : 20; + 3DA8 : B6; + 3DA9 : E7; + 3DAA : 90; + 3DAB : 0D; + 3DAC : A2; + 3DAD : 00; + 3DAE : 81; + 3DAF : FB; + 3DB0 : C1; + 3DB1 : FB; + 3DB2 : F0; + 3DB3 : 05; + [3DB4..3DB5] : 68; + 3DB6 : 4C; + 3DB7 : F7; + 3DB8 : E7; + 3DB9 : 20; + 3DBA : D5; + 3DBB : FD; + 3DBC : C6; + 3DBD : B5; + 3DBE : 60; + 3DBF : A9; + 3DC0 : 02; + 3DC1 : 85; + 3DC2 : FB; + 3DC3 : A9; + 3DC4 : 02; + 3DC5 : 85; + 3DC6 : FC; + 3DC7 : A9; + 3DC8 : 05; + 3DC9 : 60; + 3DCA : 20; + 3DCB : CD; + 3DCC : FD; + 3DCD : A9; + 3DCE : 20; + 3DCF : 2C; + 3DD0 : A9; + 3DD1 : 0D; + 3DD2 : 4C; + 3DD3 : D2; + 3DD4 : FF; + 3DD5 : E6; + 3DD6 : FB; + 3DD7 : D0; + 3DD8 : 06; + 3DD9 : E6; + 3DDA : FC; + 3DDB : D0; + 3DDC : 02; + 3DDD : E6; + 3DDE : DE; + 3DDF : 60; + 3DE0 : 3A; + 3DE1 : 3B; + 3DE2 : 52; + 3DE3 : 4D; + 3DE4 : 47; + 3DE5 : 58; + 3DE6 : 4C; + 3DE7 : 53; + [3DE8..3DEC] : FE; + [3DED..3DEF] : FF; + 3DF0 : B8; + 3DF1 : 96; + 3DF2 : 22; + 3DF3 : 57; + 3DF4 : CE; + 3DF5 : 06; + [3DF6..3DF7] : 10; + 3DF8 : 0D; + [3DF9..3DFD] : 20; + 3DFE : 50; + 3DFF : 43; + [3E00..3E01] : 20; + 3E02 : 49; + 3E03 : 52; + 3E04 : 51; + [3E05..3E06] : 20; + 3E07 : 53; + 3E08 : 52; + 3E09 : 20; + 3E0A : 41; + 3E0B : 43; + 3E0C : 20; + 3E0D : 58; + 3E0E : 52; + 3E0F : 20; + 3E10 : 59; + 3E11 : 52; + 3E12 : 20; + 3E13 : 53; + 3E14 : 50; + 3E15 : 98; + 3E16 : 48; + 3E17 : 20; + 3E18 : D0; + 3E19 : FD; + 3E1A : 68; + 3E1B : A2; + 3E1C : 2E; + 3E1D : 20; + 3E1E : 84; + 3E1F : E7; + 3E20 : 4C; + 3E21 : CA; + 3E22 : FD; + 3E23 : A2; + 3E24 : 00; + 3E25 : BD; + 3E26 : F8; + 3E27 : FD; + 3E28 : 20; + 3E29 : D2; + 3E2A : FF; + 3E2B : E8; + 3E2C : E0; + 3E2D : 1D; + 3E2E : D0; + 3E2F : F5; + 3E30 : A0; + 3E31 : 3B; + 3E32 : 20; + 3E33 : 15; + 3E34 : FE; + 3E35 : AD; + 3E36 : 00; + 3E37 : 02; + 3E38 : 20; + 3E39 : 75; + 3E3A : E7; + 3E3B : AD; + 3E3C : 01; + 3E3D : 02; + 3E3E : 20; + 3E3F : 75; + 3E40 : E7; + 3E41 : 20; + 3E42 : CD; + 3E43 : FD; + 3E44 : AD; + 3E45 : 07; + 3E46 : 02; + 3E47 : 20; + 3E48 : 75; + 3E49 : E7; + 3E4A : AD; + 3E4B : 08; + 3E4C : 02; + 3E4D : 20; + 3E4E : 75; + 3E4F : E7; + 3E50 : 20; + 3E51 : BF; + 3E52 : FD; + 3E53 : 20; + 3E54 : 93; + 3E55 : FD; + 3E56 : F0; + 3E57 : 39; + 3E58 : 20; + 3E59 : EB; + 3E5A : E7; + 3E5B : 20; + 3E5C : A7; + 3E5D : E7; + 3E5E : 90; + 3E5F : 34; + 3E60 : 20; + 3E61 : 97; + 3E62 : E7; + 3E63 : 20; + 3E64 : EB; + 3E65 : E7; + 3E66 : 20; + 3E67 : A7; + 3E68 : E7; + 3E69 : 90; + 3E6A : 29; + 3E6B : 20; + 3E6C : 97; + 3E6D : E7; + 3E6E : 20; + 3E6F : 01; + 3E70 : F3; + 3E71 : F0; + 3E72 : 1E; + 3E73 : A6; + 3E74 : DE; + 3E75 : D0; + 3E76 : 1A; + 3E77 : 38; + 3E78 : A5; + 3E79 : FD; + 3E7A : E5; + 3E7B : FB; + 3E7C : A5; + 3E7D : FE; + 3E7E : E5; + 3E7F : FC; + 3E80 : 90; + 3E81 : 0F; + 3E82 : A0; + 3E83 : 3A; + 3E84 : 20; + 3E85 : 15; + 3E86 : FE; + 3E87 : 20; + 3E88 : 6A; + 3E89 : E7; + 3E8A : A9; + 3E8B : 08; + 3E8C : 20; + 3E8D : 93; + 3E8E : FD; + 3E8F : F0; + 3E90 : DD; + 3E91 : 4C; + 3E92 : 56; + 3E93 : FD; + 3E94 : 4C; + 3E95 : F7; + 3E96 : E7; + 3E97 : 20; + 3E98 : B6; + 3E99 : E7; + 3E9A : 20; + 3E9B : A7; + 3E9C : E7; + 3E9D : 90; + 3E9E : 03; + 3E9F : 20; + 3EA0 : 88; + 3EA1 : FD; + 3EA2 : 20; + 3EA3 : CF; + 3EA4 : FF; + 3EA5 : 20; + 3EA6 : A7; + 3EA7 : E7; + 3EA8 : 90; + 3EA9 : 0A; + 3EAA : A5; + 3EAB : FB; + 3EAC : 8D; + 3EAD : 08; + 3EAE : 02; + 3EAF : A5; + 3EB0 : FC; + 3EB1 : 8D; + 3EB2 : 07; + 3EB3 : 02; + 3EB4 : 20; + 3EB5 : BF; + 3EB6 : FD; + 3EB7 : D0; + 3EB8 : 0A; + 3EB9 : 20; + 3EBA : B6; + 3EBB : E7; + 3EBC : 20; + 3EBD : A7; + 3EBE : E7; + 3EBF : 90; + 3EC0 : D3; + 3EC1 : A9; + 3EC2 : 08; + 3EC3 : 85; + 3EC4 : B5; + 3EC5 : 20; + 3EC6 : EB; + 3EC7 : E7; + 3EC8 : 20; + 3EC9 : A7; + 3ECA : FD; + 3ECB : D0; + 3ECC : F8; + 3ECD : F0; + 3ECE : C2; + 3ECF : 20; + 3ED0 : CF; + 3ED1 : FF; + 3ED2 : C9; + 3ED3 : 0D; + 3ED4 : F0; + 3ED5 : 0C; + 3ED6 : C9; + 3ED7 : 20; + 3ED8 : D0; + 3ED9 : BA; + 3EDA : 20; + 3EDB : A7; + 3EDC : E7; + 3EDD : 90; + 3EDE : 03; + 3EDF : 20; + 3EE0 : 88; + 3EE1 : FD; + 3EE2 : AE; + 3EE3 : 06; + 3EE4 : 02; + 3EE5 : 9A; + 3EE6 : 78; + 3EE7 : AD; + 3EE8 : 07; + 3EE9 : 02; + 3EEA : 85; + 3EEB : 91; + 3EEC : AD; + 3EED : 08; + 3EEE : 02; + 3EEF : 85; + 3EF0 : 90; + 3EF1 : AD; + 3EF2 : 00; + 3EF3 : 02; + 3EF4 : 48; + 3EF5 : AD; + 3EF6 : 01; + 3EF7 : 02; + 3EF8 : 48; + 3EF9 : AD; + [3EFA..3EFB] : 02; + 3EFC : 48; + 3EFD : AD; + 3EFE : 03; + 3EFF : 02; + 3F00 : AE; + 3F01 : 04; + 3F02 : 02; + 3F03 : AC; + 3F04 : 05; + 3F05 : 02; + 3F06 : 40; + 3F07 : AE; + 3F08 : 06; + 3F09 : 02; + 3F0A : 9A; + 3F0B : 4C; + 3F0C : 89; + 3F0D : C3; + 3F0E : 4C; + 3F0F : F7; + 3F10 : E7; + 3F11 : A0; + 3F12 : 01; + 3F13 : 84; + 3F14 : D4; + 3F15 : 88; + 3F16 : 84; + 3F17 : D1; + 3F18 : 84; + 3F19 : 9D; + 3F1A : A9; + 3F1B : 02; + 3F1C : 85; + 3F1D : DB; + 3F1E : A9; + 3F1F : 07; + 3F20 : 85; + 3F21 : DA; + 3F22 : 20; + 3F23 : CF; + 3F24 : FF; + 3F25 : C9; + 3F26 : 20; + 3F27 : F0; + 3F28 : F9; + 3F29 : C9; + 3F2A : 0D; + 3F2B : F0; + 3F2C : 1A; + 3F2D : C9; + 3F2E : 22; + 3F2F : D0; + 3F30 : DD; + 3F31 : 20; + 3F32 : CF; + 3F33 : FF; + 3F34 : C9; + 3F35 : 22; + 3F36 : F0; + 3F37 : 24; + 3F38 : C9; + 3F39 : 0D; + 3F3A : F0; + 3F3B : 0B; + 3F3C : 91; + 3F3D : DA; + 3F3E : E6; + 3F3F : D1; + 3F40 : C8; + 3F41 : C0; + 3F42 : 10; + 3F43 : F0; + 3F44 : C9; + 3F45 : D0; + 3F46 : EA; + 3F47 : A5; + 3F48 : B4; + 3F49 : C9; + 3F4A : 06; + 3F4B : D0; + 3F4C : E2; + 3F4D : 20; + 3F4E : 22; + 3F4F : F3; + 3F50 : 20; + 3F51 : E6; + 3F52 : F8; + 3F53 : A5; + 3F54 : 96; + 3F55 : 29; + 3F56 : 10; + 3F57 : D0; + 3F58 : F2; + 3F59 : 4C; + 3F5A : 56; + 3F5B : FD; + 3F5C : 20; + 3F5D : CF; + 3F5E : FF; + 3F5F : C9; + 3F60 : 0D; + 3F61 : F0; + 3F62 : E4; + 3F63 : C9; + 3F64 : 2C; + 3F65 : D0; + 3F66 : F0; + 3F67 : 20; + 3F68 : B6; + 3F69 : E7; + 3F6A : 29; + 3F6B : 0F; + 3F6C : F0; + 3F6D : D5; + 3F6E : C9; + 3F6F : 03; + 3F70 : F0; + 3F71 : FA; + 3F72 : 85; + 3F73 : D4; + 3F74 : 20; + 3F75 : CF; + 3F76 : FF; + 3F77 : C9; + 3F78 : 0D; + 3F79 : F0; + 3F7A : CC; + 3F7B : C9; + 3F7C : 2C; + 3F7D : D0; + 3F7E : E6; + 3F7F : 20; + 3F80 : A7; + 3F81 : E7; + 3F82 : 20; + 3F83 : 97; + 3F84 : E7; + 3F85 : 20; + 3F86 : CF; + 3F87 : FF; + 3F88 : C9; + 3F89 : 2C; + 3F8A : D0; + 3F8B : F1; + 3F8C : 20; + 3F8D : A7; + 3F8E : E7; + 3F8F : A5; + 3F90 : FB; + 3F91 : 85; + 3F92 : C9; + 3F93 : A5; + 3F94 : FC; + 3F95 : 85; + 3F96 : CA; + 3F97 : 20; + 3F98 : 97; + 3F99 : E7; + 3F9A : 20; + 3F9B : CF; + 3F9C : FF; + 3F9D : C9; + 3F9E : 20; + 3F9F : F0; + 3FA0 : F9; + 3FA1 : C9; + 3FA2 : 0D; + 3FA3 : D0; + 3FA4 : E5; + 3FA5 : A5; + 3FA6 : B4; + 3FA7 : C9; + 3FA8 : 07; + 3FA9 : D0; + 3FAA : F8; + 3FAB : 20; + 3FAC : A4; + 3FAD : F6; + 3FAE : 4C; + 3FAF : 56; + 3FB0 : FD; + 3FB1 : 43; + 3FB2 : 2E; + 3FB3 : 20; + 3FB4 : 30; + 3FB5 : 39; + 3FB6 : 37; + 3FB7 : 38; + 3FB8 : 20; + 3FB9 : 43; + 3FBA : 42; + 3FBB : 4D; + 3FBC : 20; + [3FBD..3FBF] : AA; + 3FC0 : 4C; + 3FC1 : 21; + 3FC2 : F5; + 3FC3 : 4C; + 3FC4 : A9; + 3FC5 : F2; + 3FC6 : 4C; + 3FC7 : 70; + 3FC8 : F7; + 3FC9 : 4C; + 3FCA : BC; + 3FCB : F7; + 3FCC : 4C; + 3FCD : 72; + 3FCE : F2; + 3FCF : 4C; + 3FD0 : E1; + 3FD1 : F1; + 3FD2 : 4C; + 3FD3 : 32; + 3FD4 : F2; + 3FD5 : 4C; + 3FD6 : C2; + 3FD7 : F3; + 3FD8 : 4C; + 3FD9 : 9E; + 3FDA : F6; + 3FDB : 4C; + 3FDC : B7; + 3FDD : F4; + 3FDE : 4C; + 3FDF : 84; + 3FE0 : F6; + 3FE1 : 4C; + 3FE2 : 0F; + 3FE3 : F3; + 3FE4 : 4C; + 3FE5 : D1; + 3FE6 : F1; + 3FE7 : 4C; + 3FE8 : 6E; + 3FE9 : F2; + 3FEA : 4C; + 3FEB : 29; + 3FEC : F7; + [3FED..3FF9] : AA; + 3FFA : FE; + 3FFB : FC; + 3FFC : D1; + 3FFD : FC; + 3FFE : 1B; + 3FFF : E6; +END; diff --git a/Commodore - Pet2001_MiST/rtl/scandoubler.v b/Commodore - Pet2001_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..e85cba43 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/scandoubler.v @@ -0,0 +1,183 @@ +// +// 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 +); + + +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/Commodore - Pet2001_MiST/rtl/sigma_delta_dac.v b/Commodore - Pet2001_MiST/rtl/sigma_delta_dac.v new file mode 100644 index 00000000..bba2c552 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/sigma_delta_dac.v @@ -0,0 +1,33 @@ +// +// PWM DAC +// +// MSBI is the highest bit number. NOT amount of bits! +// +module sigma_delta_dac #(parameter MSBI=7) +( + output reg DACout, //Average Output feeding analog lowpass + input [MSBI:0] DACin, //DAC input (excess 2**MSBI) + input CLK, + input RESET +); + +reg [MSBI+2:0] DeltaAdder; //Output of Delta Adder +reg [MSBI+2:0] SigmaAdder; //Output of Sigma Adder +reg [MSBI+2:0] SigmaLatch; //Latches output of Sigma Adder +reg [MSBI+2:0] DeltaB; //B input of Delta Adder + +always @(*) DeltaB = {SigmaLatch[MSBI+2], SigmaLatch[MSBI+2]} << (MSBI+1); +always @(*) DeltaAdder = DACin + DeltaB; +always @(*) SigmaAdder = DeltaAdder + SigmaLatch; + +always @(posedge CLK or posedge RESET) begin + if(RESET) begin + SigmaLatch <= 1'b1 << (MSBI+1); + DACout <= 1; + end else begin + SigmaLatch <= SigmaAdder; + DACout <= ~SigmaLatch[MSBI+2]; + end +end + +endmodule diff --git a/Commodore - Pet2001_MiST/rtl/sram.sv b/Commodore - Pet2001_MiST/rtl/sram.sv new file mode 100644 index 00000000..2e099419 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/sram.sv @@ -0,0 +1,262 @@ +// +// sram.v +// +// Static RAM controller implementation using SDRAM MT48LC16M16A2 +// +// Copyright (c) 2015,2016 Sorgelig +// +// Some parts of SDRAM code used from project: +// http://hamsterworks.co.nz/mediawiki/index.php/Simple_SDRAM_Controller +// +// 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 . +// +// ------------------------------------------ +// +// v2.1 - Add universal 8/16 bit mode. +// + +module sram +( + input init, // reset to initialize RAM + input clk, // clock ~100MHz + // + // SDRAM_* - signals to the MT48LC16M16 chip + inout reg [15:0] SDRAM_DQ, // 16 bit bidirectional data bus + output reg [12:0] SDRAM_A, // 13 bit multiplexed address bus + output reg SDRAM_DQML, // two byte masks + output reg SDRAM_DQMH, // + output reg [1:0] SDRAM_BA, // two banks + output SDRAM_nCS, // a single chip select + output SDRAM_nWE, // write enable + output SDRAM_nRAS, // row address select + output SDRAM_nCAS, // columns address select + output SDRAM_CKE, // clock enable + // + input [1:0] wtbt, // 16bit mode: bit1 - write high byte, bit0 - write low byte, + // 8bit mode: 2'b00 - use addr[0] to decide which byte to write + // Ignored while reading. + // + input [24:0] addr, // 25 bit address for 8bit mode. addr[0] = 0 for 16bit mode for correct operations. + output [15:0] dout, // data output to cpu + input [15:0] din, // data input from cpu + input we, // cpu requests write + input rd, // cpu requests read + output reg ready // dout is valid. Ready to accept new read/write. +); + +assign SDRAM_nCS = command[3]; +assign SDRAM_nRAS = command[2]; +assign SDRAM_nCAS = command[1]; +assign SDRAM_nWE = command[0]; +assign SDRAM_CKE = cke; +assign dout = latched ? data_l : data_d; + +// no burst configured +localparam BURST_LENGTH = 3'b000; // 000=1, 001=2, 010=4, 011=8 +localparam ACCESS_TYPE = 1'b0; // 0=sequential, 1=interleaved +localparam CAS_LATENCY = 3'd2; // 2 for < 100MHz, 3 for >100MHz +localparam OP_MODE = 2'b00; // only 00 (standard operation) allowed +localparam NO_WRITE_BURST = 1'b1; // 0= write burst enabled, 1=only single access write +localparam MODE = {3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, BURST_LENGTH}; + +localparam sdram_startup_cycles= 14'd12100;// 100us, plus a little more, @ 100MHz +localparam cycles_per_refresh = 14'd780; // (64000*100)/8192-1 Calc'd as (64ms @ 100MHz)/8192 rose +localparam startup_refresh_max = 14'b11111111111111; + +// SDRAM commands +localparam CMD_INHIBIT = 4'b1111; +localparam CMD_NOP = 4'b0111; +localparam CMD_ACTIVE = 4'b0011; +localparam CMD_READ = 4'b0101; +localparam CMD_WRITE = 4'b0100; +localparam CMD_BURST_TERMINATE = 4'b0110; +localparam CMD_PRECHARGE = 4'b0010; +localparam CMD_AUTO_REFRESH = 4'b0001; +localparam CMD_LOAD_MODE = 4'b0000; + +reg [13:0] refresh_count = startup_refresh_max - sdram_startup_cycles; +reg [3:0] command = CMD_INHIBIT; +reg cke = 0; +reg [24:0] save_addr; + +reg latched; +reg [15:0] data; +wire[15:0] data_l = save_addr[0] ? {data[7:0], data[15:8]} : {data[15:8], data[7:0]}; +wire[15:0] data_d = save_addr[0] ? {SDRAM_DQ[7:0], SDRAM_DQ[15:8]} : {SDRAM_DQ[15:8], SDRAM_DQ[7:0]}; + +typedef enum +{ + STATE_STARTUP, + STATE_OPEN_1, STATE_OPEN_2, + STATE_WRITE, + STATE_READ, + STATE_IDLE, STATE_IDLE_1, STATE_IDLE_2, STATE_IDLE_3, + STATE_IDLE_4, STATE_IDLE_5, STATE_IDLE_6, STATE_IDLE_7 +} state_t; + +always @(posedge clk) begin + reg old_we, old_rd; + reg [CAS_LATENCY:0] data_ready_delay; + + reg [15:0] new_data; + reg [1:0] new_wtbt; + reg new_we; + reg new_rd; + reg save_we = 1; + + state_t state = STATE_STARTUP; + + command <= CMD_NOP; + refresh_count <= refresh_count+1'b1; + + data_ready_delay <= {1'b0, data_ready_delay[CAS_LATENCY:1]}; + + // make it ready 1T in advance + if(data_ready_delay[1]) {latched, ready} <= {1'b0, 1'b1}; + if(data_ready_delay[0]) {latched, data} <= {1'b1, SDRAM_DQ}; + + case(state) + STATE_STARTUP: begin + //------------------------------------------------------------------------ + //-- This is the initial startup state, where we wait for at least 100us + //-- before starting the start sequence + //-- + //-- The initialisation is sequence is + //-- * de-assert SDRAM_CKE + //-- * 100us wait, + //-- * assert SDRAM_CKE + //-- * wait at least one cycle, + //-- * PRECHARGE + //-- * wait 2 cycles + //-- * REFRESH, + //-- * tREF wait + //-- * REFRESH, + //-- * tREF wait + //-- * LOAD_MODE_REG + //-- * 2 cycles wait + //------------------------------------------------------------------------ + cke <= 1; + SDRAM_DQ <= 16'bZZZZZZZZZZZZZZZZ; + SDRAM_DQML <= 1; + SDRAM_DQMH <= 1; + SDRAM_A <= 0; + SDRAM_BA <= 0; + + // All the commands during the startup are NOPS, except these + if(refresh_count == startup_refresh_max-31) begin + // ensure all rows are closed + command <= CMD_PRECHARGE; + SDRAM_A[10] <= 1; // all banks + SDRAM_BA <= 2'b00; + end else if (refresh_count == startup_refresh_max-23) begin + // these refreshes need to be at least tREF (66ns) apart + command <= CMD_AUTO_REFRESH; + end else if (refresh_count == startup_refresh_max-15) + command <= CMD_AUTO_REFRESH; + else if (refresh_count == startup_refresh_max-7) begin + // Now load the mode register + command <= CMD_LOAD_MODE; + SDRAM_A <= MODE; + end + + //------------------------------------------------------ + //-- if startup is complete then go into idle mode, + //-- get prepared to accept a new command, and schedule + //-- the first refresh cycle + //------------------------------------------------------ + if(!refresh_count) begin + state <= STATE_IDLE; + ready <= 1; + refresh_count <= 0; + end + end + + STATE_IDLE_7: state <= STATE_IDLE_6; + STATE_IDLE_6: state <= STATE_IDLE_5; + STATE_IDLE_5: state <= STATE_IDLE_4; + STATE_IDLE_4: state <= STATE_IDLE_3; + STATE_IDLE_3: state <= STATE_IDLE_2; + STATE_IDLE_2: state <= STATE_IDLE_1; + STATE_IDLE_1: begin + SDRAM_DQ <= 16'bZZZZZZZZZZZZZZZZ; + state <= STATE_IDLE; + // mask possible refresh to reduce colliding. + if(refresh_count > cycles_per_refresh) begin + //------------------------------------------------------------------------ + //-- Start the refresh cycle. + //-- This tasks tRFC (66ns), so 6 idle cycles are needed @ 100MHz + //------------------------------------------------------------------------ + state <= STATE_IDLE_7; + command <= CMD_AUTO_REFRESH; + refresh_count <= refresh_count - cycles_per_refresh + 1'd1; + end + end + + STATE_IDLE: begin + // Priority is to issue a refresh if one is outstanding + if(refresh_count > (cycles_per_refresh<<1)) state <= STATE_IDLE_1; + else if(new_rd | new_we) begin + new_we <= 0; + new_rd <= 0; + save_addr<= addr; + save_we <= new_we; + state <= STATE_OPEN_1; + command <= CMD_ACTIVE; + SDRAM_A <= addr[13:1]; + SDRAM_BA <= addr[24:23]; + end + end + + // ACTIVE-to-READ or WRITE delay >20ns (-75) + STATE_OPEN_1: state <= STATE_OPEN_2; + STATE_OPEN_2: begin + SDRAM_A <= {4'b0010, save_addr[22:14]}; + SDRAM_DQML <= save_we & (new_wtbt ? ~new_wtbt[0] : save_addr[0]); + SDRAM_DQMH <= save_we & (new_wtbt ? ~new_wtbt[1] : ~save_addr[0]); + state <= save_we ? STATE_WRITE : STATE_READ; + end + + STATE_READ: begin + state <= STATE_IDLE_5; + command <= CMD_READ; + SDRAM_DQ <= 16'bZZZZZZZZZZZZZZZZ; + + // Schedule reading the data values off the bus + data_ready_delay[CAS_LATENCY] <= 1; + end + + STATE_WRITE: begin + state <= STATE_IDLE_5; + command <= CMD_WRITE; + SDRAM_DQ <= new_wtbt ? new_data : {new_data[7:0], new_data[7:0]}; + ready <= 1; + end + endcase + + if(init) begin + state <= STATE_STARTUP; + refresh_count <= startup_refresh_max - sdram_startup_cycles; + end + + old_we <= we; + if(we & ~old_we) {ready, new_we, new_data, new_wtbt} <= {1'b0, 1'b1, din, wtbt}; + + old_rd <= rd; + if(rd & ~old_rd) begin + if(ready & ~save_we & (save_addr[24:1] == addr[24:1])) save_addr <= addr; + else {ready, new_rd} <= {1'b0, 1'b1}; + end +end + +endmodule diff --git a/Commodore - Pet2001_MiST/rtl/tape.v b/Commodore - Pet2001_MiST/rtl/tape.v new file mode 100644 index 00000000..54c055d7 --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/tape.v @@ -0,0 +1,131 @@ +// +// tape.v +// +// tape implementation for the PET2001 core for the MiST board +// +// 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 . +// + +module tape +( + input reset, + input clk, + input ce_1m, + + input ioctl_download, + input tape_pause, + output reg tape_audio, + output tape_active, + + output reg tape_rd, + output reg [24:0] tape_addr, + input [7:0] tape_data +); + +reg [23:0] cnt; + +assign tape_active = (cnt>0); + +always @(posedge clk) begin + reg [23:0] size; + //reg [7:0] version; + reg [23:0] tmp; + reg [26:0] bit_cnt, bit_half; + reg ioctl_downloadD; + reg [2:0] reload32; + reg byte_ready; + reg [7:0] din; + reg play_pause; + reg pauseD; + + pauseD <= tape_pause; + if(tape_pause && ~pauseD) play_pause <= !play_pause; + + if(reset || ioctl_download) begin + cnt <= 0; + reload32 <= 0; + byte_ready <= 0; + play_pause <= 0; + tape_rd <= 0; + size <= 0; + bit_cnt <= 0; + ioctl_downloadD <= ioctl_download; + + end else if(ce_1m) begin + + ioctl_downloadD <= ioctl_download; + tape_rd <= 0; + + if(tape_rd) begin + byte_ready <= 1; + din <= tape_data; + end + + // download complete, start parsing + if(!ioctl_download && ioctl_downloadD) begin + cnt <= 8; + tape_rd <= 1; + tape_addr <= 12; + end + + if(cnt != 0) begin + if(byte_ready) begin + if(tape_addr<20) begin + cnt <= cnt - 1'd1; + tape_addr <= tape_addr + 1'd1; + byte_ready <= 0; + tape_rd <= 1; + case(tape_addr) + //12: version <= din; + 16: size[7:0] <= din; + 17: size[15:8] <= din; + 18: size[23:16] <= din; + 19: cnt <= size ? size : 24'd0; + default:; + endcase + end else begin + if(bit_cnt <= 1) begin + cnt <= cnt - 1'd1; + tape_addr <= tape_addr + 1'd1; + byte_ready <= 0; + tape_rd <= 1; + if(reload32 != 0) begin + tmp <= {din, tmp[23:8]}; + reload32 <= reload32 - 1'd1; + if(reload32 == 1) begin + bit_cnt <= {din, tmp[23:8], 3'd0}; + bit_half <= {din, tmp[23:8], 2'd0}; + tape_audio <= 1; + end + end else if(din == 0) begin + reload32 <= 3; + end else begin + bit_cnt <= {din, 3'd0}; + bit_half <= {din, 2'd0}; + tape_audio <= 1; + end + end + end + end + if(!play_pause && (bit_cnt>1)) begin + bit_cnt <= bit_cnt - 1'd1; + if(bit_cnt < bit_half) tape_audio <= 0; + end + end + end +end + +endmodule diff --git a/Commodore - Pet2001_MiST/rtl/via6522.v b/Commodore - Pet2001_MiST/rtl/via6522.v new file mode 100644 index 00000000..b4c9ecaf --- /dev/null +++ b/Commodore - Pet2001_MiST/rtl/via6522.v @@ -0,0 +1,483 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////// +// +// Engineer: Thomas Skibo +// +// Create Date: Sep 24, 2011 +// +// Module Name: via6522 +// +// Description: +// +// A simple implementation of the 6522 Versatile Interface Adapter (VIA). +// Tri-state lines aren't used. Instead, All PIA I/O signals have +// seperate "in" and "out" signals. Wire or ignore appropriately. +// +// A seperate "slow clock" (a synchronous pulse) runs the timers. +// Typically, it's 1Mhz. +// +///////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2011, Thomas Skibo. All rights reserved. +// +// Redistribution and use in source and binary 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 binary 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. +// * The names of contributors may not 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 Thomas Skibo 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. +// +////////////////////////////////////////////////////////////////////////////// + +module via6522 +( + output reg [7:0] data_out, // cpu interface + input [7:0] data_in, + input [3:0] addr, + input strobe, + input we, + + output reg irq, + + output reg [7:0] porta_out, + input [7:0] porta_in, + output reg [7:0] portb_out, + input [7:0] portb_in, + + input ca1_in, + output reg ca2_out, + input ca2_in, + output reg cb1_out, + input cb1_in, + output reg cb2_out, + input cb2_in, + + input ce, + input clk, + input reset +); + +// Register address offsets +parameter [3:0] + ADDR_PORTB = 4'h0, + ADDR_PORTA = 4'h1, + ADDR_DDRB = 4'h2, + ADDR_DDRA = 4'h3, + ADDR_TIMER1_LO = 4'h4, + ADDR_TIMER1_HI = 4'h5, + ADDR_TIMER1_LATCH_LO = 4'h6, + ADDR_TIMER1_LATCH_HI = 4'h7, + ADDR_TIMER2_LO = 4'h8, + ADDR_TIMER2_HI = 4'h9, + ADDR_SR = 4'ha, + ADDR_ACR = 4'hb, + ADDR_PCR = 4'hc, + ADDR_IFR = 4'hd, + ADDR_IER = 4'he, + ADDR_PORTA_NH = 4'hf; + +wire wr_strobe = strobe && we; +wire rd_strobe = strobe && !we; + +/////////////////////////////////////////////////// +// IER - Interrupt Enable Register +reg [6:0] ier; + +always @(posedge clk) begin + if (reset) ier <= 7'd0; + else if (wr_strobe && addr == ADDR_IER) ier <= data_in[7] ? (ier | data_in[6:0]) : (ier & ~data_in[6:0]); +end + +//////////////////////////////////////////////////// +// PCR - Peripheral Control Register +reg [7:0] pcr; + +always @(posedge clk) begin + if (reset) pcr <= 8'h00; + else if (wr_strobe && addr == ADDR_PCR) pcr <= data_in; +end + +////////////////////////////////////////////////////// +// ACR - Auxiliary Control Register +reg [7:0] acr; + +always @(posedge clk) begin + if (reset) acr <= 8'h00; + else if (wr_strobe && addr == ADDR_ACR) acr <= data_in; +end + +///////////////////////////////////////////////////// +// PORTs and DDRs +reg [7:0] ddra; +reg [7:0] ddrb; +reg pb7_nxt; // generated by timer1 logic, used when acr7 is set + +// Implement PORTA (out) +always @(posedge clk) begin + if (reset) porta_out <= 8'h00; + else if (wr_strobe && (addr == ADDR_PORTA || addr == ADDR_PORTA_NH)) porta_out <= data_in; +end + +// Implement DDRA +always @(posedge clk) begin + if (reset) ddra <= 8'h00; + else if (wr_strobe && addr == ADDR_DDRA) ddra <= data_in; +end + +// Implement PORTB (out). +always @(posedge clk) begin + if (reset) portb_out[6:0] <= 7'h00; + else if (wr_strobe && addr == ADDR_PORTB) portb_out[6:0] <= data_in[6:0]; +end + +always @(posedge clk) begin + if (reset) portb_out[7] <= 1'b0; + else if (acr[7]) portb_out[7] <= pb7_nxt; + else if (wr_strobe && addr == ADDR_PORTB) portb_out[7] <= data_in[7]; +end + +// Implement DDRB +always @(posedge clk) begin + if (reset) ddrb <= 8'h00; + else if (wr_strobe && addr == ADDR_DDRB) ddrb <= data_in; +end + +//////////////////////////////////////////////////////// +// CA interrupt logic +reg irq_ca1; +reg irq_ca2; + +// CA1 and CA2 transition logic. +reg ca1_in_1; +reg ca2_in_1; +always @(posedge clk) begin + ca1_in_1 <= ca1_in; + ca2_in_1 <= ca2_in; +end + +// detect "active" transitions. +wire ca1_act_trans = ((ca1_in && !ca1_in_1 && pcr[0]) || + (!ca1_in && ca1_in_1 && !pcr[0])); +wire ca2_act_trans = ((ca2_in && !ca2_in_1 && pcr[2]) || + (!ca2_in && ca2_in_1 && !pcr[2])); + + // logic for clearing CA1 and CA2 interrupt bits. +wire irq_ca1_clr = ((strobe && addr == ADDR_PORTA) || + (wr_strobe && addr == ADDR_IFR && data_in[1])); +wire irq_ca2_clr = ((strobe && addr == ADDR_PORTA) || + (wr_strobe && addr == ADDR_IFR && data_in[0])); + +always @(posedge clk) begin + if (reset || (irq_ca1_clr && !ca1_act_trans)) irq_ca1 <= 1'b0; + else if (ca1_act_trans) irq_ca1 <= 1'b1; +end + +always @(posedge clk) begin + if (reset || (irq_ca2_clr && !ca2_act_trans)) irq_ca2 <= 1'b0; + else if (ca2_act_trans) irq_ca2 <= 1'b1; +end + + +//////////////////////////////////////////////////////// +// CB logic +reg irq_cb1; +reg irq_cb2; + +// transition logic +reg cb1_in_1; +reg cb2_in_1; +always @(posedge clk) begin + cb1_in_1 <= cb1_in; + cb2_in_1 <= cb2_in; +end + +// detect "active" transitions. +wire cb1_act_trans = ((cb1_in && !cb1_in_1 && pcr[4]) || + (!cb1_in && cb1_in_1 && !pcr[4])); +wire cb2_act_trans = ((cb2_in && !cb2_in_1 && pcr[6]) || + (!cb2_in && cb2_in_1 && !pcr[6])); + +// logic for clearing CB1 and CB2 interrupt bits. +wire irq_cb1_clr = ((strobe && addr == ADDR_PORTB) || + (wr_strobe && addr == ADDR_IFR && data_in[4])); +wire irq_cb2_clr = ((strobe && addr == ADDR_PORTB) || + (wr_strobe && addr == ADDR_IFR && data_in[3])); + +always @(posedge clk) begin + if (reset || (irq_cb1_clr && !cb1_act_trans)) irq_cb1 <= 1'b0; + else if (cb1_act_trans) irq_cb1 <= 1'b1; +end + +always @(posedge clk) begin + if (reset || (irq_cb2_clr && !cb2_act_trans)) irq_cb2 <= 1'b0; + else if (cb2_act_trans) irq_cb2 <= 1'b1; +end + +/////////////////////////////////////////////////// +// CA2/CB2 output modes +always @(posedge clk) begin + case (pcr[3:1]) + 3'b100: ca2_out <= irq_ca1; + 3'b101: ca2_out <= !ca1_act_trans; + 3'b111: ca2_out <= 1'b1; + default: ca2_out <= 1'b0; + endcase +end + +reg cb2_out_r; +wire portb_wr_strobe = wr_strobe && addr == ADDR_PORTB; +wire cb2_sr_out; + +always @(posedge clk) begin + if (reset || (portb_wr_strobe && !cb1_act_trans)) cb2_out_r <= 1'b0; + else if (cb1_act_trans) cb2_out_r <= 1'b1; +end + +always @(posedge clk) begin + if (acr[4]) cb2_out <= cb2_sr_out; + else begin + case (pcr[7:5]) + 3'b100: cb2_out <= cb2_out_r; + 3'b101: cb2_out <= !portb_wr_strobe; + 3'b111: cb2_out <= 1'b1; + default: cb2_out <= 1'b0; + endcase + end +end + +////////////////////////////////////////////////////////// +// Implement PORTA (in) latch +reg [7:0] porta_in_r; +always @(posedge clk) begin + if (!acr[0] || !irq_ca1) porta_in_r <= porta_in; +end + +// Implement PORTB (in) latch +reg [7:0] portb_in_r; +always @(posedge clk) begin + if (!acr[1] || !irq_cb1) portb_in_r <= portb_in; +end + +/////////////////////////////////////////////////// +// Timers +reg [15:0] timer1; +reg [7:0] timer1_latch_lo; +reg [7:0] timer1_latch_hi; + +reg [15:0] timer2; +reg [7:0] timer2_latch_lo; + +reg irq_t1_one_shot; +reg irq_t1; +reg irq_t2_one_shot; +reg irq_t2; + +// TIMER1 +always @(posedge clk) begin + if (reset) timer1 <= 16'hffff; + else if (wr_strobe && addr == ADDR_TIMER1_HI) timer1 <= {data_in, timer1_latch_lo}; + else if (timer1 == 16'h0000 && ce && acr[6]) timer1 <= {timer1_latch_hi, timer1_latch_lo}; + else if (ce) timer1 <= timer1 - 1'b1; +end + +// T1 latch lo +always @(posedge clk) begin + if (reset) timer1_latch_lo <= 8'hff; + else if (wr_strobe && (addr == ADDR_TIMER1_LO || addr == ADDR_TIMER1_LATCH_LO)) timer1_latch_lo <= data_in; +end + +// T1 latch hi +always @(posedge clk) begin + if (reset) timer1_latch_hi <= 8'hff; + else if (wr_strobe && (addr == ADDR_TIMER1_HI || addr == ADDR_TIMER1_LATCH_HI)) timer1_latch_hi <= data_in; +end + +// "one-shot" logic so we only get an interrupt on first counter roll-over +always @(posedge clk) begin + if (reset) irq_t1_one_shot <= 1'b0; + else if (wr_strobe && addr == ADDR_TIMER1_HI) irq_t1_one_shot <= 1'b1; + else if (timer1 == 16'h0000 && ce) irq_t1_one_shot <= 1'b0; +end + +// T1 interrupt set and clear logic +wire irq_t1_set = (timer1 == 16'h0000 && ce && (irq_t1_one_shot || acr[6])); +wire irq_t1_clr = ((wr_strobe && addr == ADDR_TIMER1_HI) || + (wr_strobe && addr == ADDR_TIMER1_LATCH_HI) || + (rd_strobe && addr == ADDR_TIMER1_LO) || + (wr_strobe && addr == ADDR_IFR && data_in[6])); + +// T1 IRQ +always @(posedge clk) begin + if (reset || irq_t1_clr) irq_t1 <= 1'b0; + else if (irq_t1_set) irq_t1 <= 1'b1; +end + +// I forget what this is for +always @(posedge clk) begin + if (reset) pb7_nxt <= 1'b1; + else if (wr_strobe && addr == ADDR_TIMER1_HI) pb7_nxt <= 1'b0; + else if (timer1 == 16'h0001 && ce) pb7_nxt <= !pb7_nxt; +end + +// TIMER2 +always @(posedge clk) begin + if (reset) timer2 <= 16'hffff; + else if (wr_strobe && addr == ADDR_TIMER2_HI) timer2 <= {data_in, timer2_latch_lo}; + else if ((!acr[5] || !portb_in[6]) && ce) timer2 <= timer2 - 1'b1; +end + +// T2 latch lo (i.e. writes to T2L) +always @(posedge clk) begin + if (reset) timer2_latch_lo <= 8'hff; + else if (wr_strobe && addr == ADDR_TIMER2_LO) timer2_latch_lo <= data_in; +end + +// T2 IRQ "one-shot" logic +always @(posedge clk) begin + if (reset) irq_t2_one_shot <= 1'b0; + else if (wr_strobe && addr == ADDR_TIMER2_HI) irq_t2_one_shot <= 1'b1; + else if (timer2 == 16'h0000 && ce) irq_t2_one_shot <= 1'b0; +end + +// T2 IRQ set and clear logic +wire irq_t2_set = (timer2 == 16'h0000 && ce && irq_t2_one_shot); +wire irq_t2_clr = ((wr_strobe && addr == ADDR_TIMER2_HI) || + (rd_strobe && addr == ADDR_TIMER2_LO) || + (wr_strobe && addr == ADDR_IFR && data_in[5])); + +// T2 IRQ +always @(posedge clk) begin + if (reset || irq_t2_clr) irq_t2 <= 1'b0; + else if (irq_t2_set) irq_t2 <= 1'b1; +end + + +//////////////////////////////////////////////////////// +// SR - shift register +reg [7:0] sr; +reg [2:0] sr_cntr; +reg [7:0] sr_clk_div_ctr; +reg sr_clk_div; +reg irq_sr; +reg sr_go; +reg do_shift; + +always @(posedge clk) begin + if (reset) sr <= 8'h00; + else if (wr_strobe && addr == ADDR_SR) sr <= data_in; + else if (do_shift) sr <= { sr[6:0], (acr[4] ? sr[7] : cb2_in) }; +end + +assign cb2_sr_out = sr[7]; + +always @(posedge clk) begin + if (reset) sr_clk_div_ctr <= 8'd0; + else if (ce && sr_clk_div_ctr == 8'd0) sr_clk_div_ctr <= timer2_latch_lo; + else if (ce) sr_clk_div_ctr <= sr_clk_div_ctr - 1'b1; +end + +always @(posedge clk) begin + if (reset) sr_clk_div <= 1'b0; + else sr_clk_div <= (ce && sr_clk_div_ctr == 8'd0); +end + +always @(posedge clk) begin + if (reset || (strobe && addr == ADDR_SR)) sr_cntr <= 3'd7; + else if (do_shift) sr_cntr <= sr_cntr - 1'b1; +end + +// SR IRQ set and clr logic +wire irq_sr_set = do_shift && sr_cntr == 3'b000; +wire irq_sr_clr = ((strobe && addr == ADDR_SR) || (wr_strobe && addr == ADDR_IFR && data_in[2])); + +// SR IRQ +always @(posedge clk) begin + if (reset || (irq_sr_clr && !irq_sr_set)) irq_sr <= 1'b0; + else if (irq_sr_set) irq_sr <= 1'b1; +end + +always @(posedge clk) begin + if (reset) sr_go <= 1'b0; + else if (strobe && addr == ADDR_SR) sr_go <= 1'b1; + else if (irq_sr_set) sr_go <= 1'b0; +end + +// cominatorial logic for do_shift signal. +always @(sr_clk_div or ce or cb1_act_trans or sr_go or acr) begin + case (acr[4:2]) + 3'b000: do_shift = 1'b0; + 3'b100: do_shift = sr_clk_div; + 3'b001, + 3'b101: do_shift = (sr_go && sr_clk_div); + 3'b010, + 3'b110: do_shift = (sr_go && ce); + 3'b011, + 3'b111: do_shift = cb1_act_trans; + endcase +end + +always @(posedge clk) begin + if (reset) cb1_out <= 1'b1; + else if (do_shift) cb1_out <= !cb1_out; +end + +//////////////////////////////////////////////////////// +// IRQ and enable logic. +// + +// IFR register (not including bit 7) +wire [6:0] ifr = { irq_t1, irq_t2, irq_cb1, irq_cb2, irq_sr, irq_ca1, irq_ca2 }; + +// IRQ combinatorial logic +wire irq_p = |{ (ifr & ier) }; + +// IRQ output +always @(posedge clk) begin + if (reset) irq <= 1'b0; + else irq <= irq_p; +end + +/////////////////////////////////////////////////// +// Read data mux +wire [7:0] porta = (porta_out & ddra) | (porta_in_r & ~ddra); +wire [7:0] portb = (portb_out & ddrb) | (portb_in_r & ~ddrb); + +always @(*) begin + case (addr) + ADDR_PORTB: data_out = portb; + ADDR_PORTA: data_out = porta; + ADDR_DDRB: data_out = ddrb; + ADDR_DDRA: data_out = ddra; + ADDR_TIMER1_LO: data_out = timer1[7:0]; + ADDR_TIMER1_HI: data_out = timer1[15:8]; + ADDR_TIMER1_LATCH_LO: data_out = timer1_latch_lo; + ADDR_TIMER1_LATCH_HI: data_out = timer1_latch_hi; + ADDR_TIMER2_LO: data_out = timer2[7:0]; + ADDR_TIMER2_HI: data_out = timer2[15:8]; + ADDR_IER: data_out = {1'b1, ier}; + ADDR_PCR: data_out = pcr; + ADDR_ACR: data_out = acr; + ADDR_IFR: data_out = {irq_p, ifr}; + ADDR_SR: data_out = sr; + ADDR_PORTA_NH: data_out = porta; + default: data_out = 8'hXX; + endcase +end + +endmodule // via6522 diff --git a/Commodore - Pet2001_MiST/rtl/video_mixer.sv b/Commodore - Pet2001_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Commodore - Pet2001_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/Commodore MAX/MAX.qpf b/Commodore MAX/MAX.qpf new file mode 100644 index 00000000..dc3a3a2c --- /dev/null +++ b/Commodore MAX/MAX.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 16:51:32 December 14, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "16:51:32 December 14, 2017" + +# Revisions + +PROJECT_REVISION = "MAX" diff --git a/Commodore MAX/MAX.qsf b/Commodore MAX/MAX.qsf new file mode 100644 index 00000000..828985b1 --- /dev/null +++ b/Commodore MAX/MAX.qsf @@ -0,0 +1,172 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 16:51:32 December 14, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# MAX_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. +# +# -------------------------------------------------------------------------- # +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_7 -to LED +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_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 +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 PIN_31 -to UART_RX +set_location_assignment PIN_46 -to UART_TX + + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name TOP_LEVEL_ENTITY MAX +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "16:51:32 DECEMBER 14, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" +set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation +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 MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON +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" +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 +set_global_assignment -name VHDL_INPUT_VERSION VHDL_1993 +set_global_assignment -name VHDL_SHOW_LMF_MAPPING_MESSAGES OFF +set_global_assignment -name VERILOG_INPUT_VERSION SYSTEMVERILOG_2005 +set_global_assignment -name VERILOG_SHOW_LMF_MAPPING_MESSAGES OFF +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)" +set_global_assignment -name VHDL_FILE rtl/sid_voice.vhd +set_global_assignment -name VHDL_FILE rtl/sid_components.vhd +set_global_assignment -name VHDL_FILE rtl/sid_6581.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/MAX.sv +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name QIP_FILE rtl/COLRAM.qip +set_global_assignment -name QIP_FILE rtl/MAINRAM.qip +set_global_assignment -name VHDL_FILE rtl/cpu_6510.vhd +set_global_assignment -name VHDL_FILE rtl/cpu65xx_e.vhd +set_global_assignment -name VHDL_FILE rtl/cpu65xx_fast.vhd +set_global_assignment -name VHDL_FILE rtl/fpga64_rgbcolor.vhd +set_global_assignment -name VERILOG_FILE rtl/user_io.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name VERILOG_FILE rtl/sigma_delta_dac.v +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +set_global_assignment -name VERILOG_FILE rtl/data_io.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/hq2x.sv +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VHDL_FILE rtl/cia_6526.vhd +set_global_assignment -name VERILOG_FILE rtl/pla_6703.v +set_global_assignment -name VHDL_FILE rtl/vic_656x_a.vhd +set_global_assignment -name VHDL_FILE rtl/vic_656x_e.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/cart.sv +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Commodore MAX/Schematic/326100.bmp b/Commodore MAX/Schematic/326100.bmp new file mode 100644 index 00000000..816401da Binary files /dev/null and b/Commodore MAX/Schematic/326100.bmp differ diff --git a/Commodore MAX/Schematic/326100.png b/Commodore MAX/Schematic/326100.png new file mode 100644 index 00000000..8987c18b Binary files /dev/null and b/Commodore MAX/Schematic/326100.png differ diff --git a/Commodore MAX/Schematic/Max_schematic.jpg b/Commodore MAX/Schematic/Max_schematic.jpg new file mode 100644 index 00000000..b23f2e97 Binary files /dev/null and b/Commodore MAX/Schematic/Max_schematic.jpg differ diff --git a/Commodore MAX/Schematic/scematic.pdf b/Commodore MAX/Schematic/scematic.pdf new file mode 100644 index 00000000..15505744 Binary files /dev/null and b/Commodore MAX/Schematic/scematic.pdf differ diff --git a/Commodore MAX/Schematic/ultimaxSchematic.gif b/Commodore MAX/Schematic/ultimaxSchematic.gif new file mode 100644 index 00000000..119f1498 Binary files /dev/null and b/Commodore MAX/Schematic/ultimaxSchematic.gif differ diff --git a/Commodore MAX/clean.bat b/Commodore MAX/clean.bat new file mode 100644 index 00000000..d76d65c1 --- /dev/null +++ b/Commodore MAX/clean.bat @@ -0,0 +1,13 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +del PLLJ_PLLSPE_INFO.txt +del *.qws +del *.ppf +del *.qip +pause diff --git a/Commodore MAX/rtl/COLRAM.qip b/Commodore MAX/rtl/COLRAM.qip new file mode 100644 index 00000000..25074317 --- /dev/null +++ b/Commodore MAX/rtl/COLRAM.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "RAM: 1-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "COLRAM.v"] diff --git a/Commodore MAX/rtl/COLRAM.v b/Commodore MAX/rtl/COLRAM.v new file mode 100644 index 00000000..989754a8 --- /dev/null +++ b/Commodore MAX/rtl/COLRAM.v @@ -0,0 +1,177 @@ +// megafunction wizard: %RAM: 1-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: COLRAM.v +// Megafunction Name(s): +// altsyncram +// +// 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 COLRAM ( + address, + clock, + data, + rden, + wren, + q); + + input [9:0] address; + input clock; + input [3:0] data; + input rden; + input wren; + output [3:0] q; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; + tri1 rden; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [3:0] sub_wire0; + wire [3:0] q = sub_wire0[3:0]; + + altsyncram altsyncram_component ( + .address_a (address), + .clock0 (clock), + .data_a (data), + .wren_a (wren), + .rden_a (rden), + .q_a (sub_wire0), + .aclr0 (1'b0), + .aclr1 (1'b0), + .address_b (1'b1), + .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 (1'b1), + .eccstatus (), + .q_b (), + .rden_b (1'b1), + .wren_b (1'b0)); + defparam + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 1024, + altsyncram_component.operation_mode = "SINGLE_PORT", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_reg_a = "CLOCK0", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.read_during_write_mode_port_a = "NEW_DATA_NO_NBE_READ", + altsyncram_component.widthad_a = 10, + altsyncram_component.width_a = 4, + altsyncram_component.width_byteena_a = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +// Retrieval info: PRIVATE: AclrByte NUMERIC "0" +// Retrieval info: PRIVATE: AclrData NUMERIC "0" +// Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "1" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: Clken NUMERIC "0" +// Retrieval info: PRIVATE: DataBusSeparated NUMERIC "1" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "" +// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "1024" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +// Retrieval info: PRIVATE: RegAddr NUMERIC "1" +// Retrieval info: PRIVATE: RegData NUMERIC "1" +// Retrieval info: PRIVATE: RegOutput NUMERIC "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: SingleClock NUMERIC "1" +// Retrieval info: PRIVATE: UseDQRAM NUMERIC "1" +// Retrieval info: PRIVATE: WRCONTROL_ACLR_A NUMERIC "0" +// Retrieval info: PRIVATE: WidthAddr NUMERIC "10" +// Retrieval info: PRIVATE: WidthData NUMERIC "4" +// Retrieval info: PRIVATE: rden NUMERIC "1" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "1024" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "SINGLE_PORT" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +// Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_A STRING "NEW_DATA_NO_NBE_READ" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "10" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "4" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: USED_PORT: address 0 0 10 0 INPUT NODEFVAL "address[9..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: data 0 0 4 0 INPUT NODEFVAL "data[3..0]" +// Retrieval info: USED_PORT: q 0 0 4 0 OUTPUT NODEFVAL "q[3..0]" +// Retrieval info: USED_PORT: rden 0 0 0 0 INPUT VCC "rden" +// Retrieval info: USED_PORT: wren 0 0 0 0 INPUT NODEFVAL "wren" +// Retrieval info: CONNECT: @address_a 0 0 10 0 address 0 0 10 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: @data_a 0 0 4 0 data 0 0 4 0 +// Retrieval info: CONNECT: @rden_a 0 0 0 0 rden 0 0 0 0 +// Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0 +// Retrieval info: CONNECT: q 0 0 4 0 @q_a 0 0 4 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL COLRAM.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL COLRAM.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL COLRAM.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL COLRAM.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL COLRAM_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL COLRAM_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Commodore MAX/rtl/MAINRAM.qip b/Commodore MAX/rtl/MAINRAM.qip new file mode 100644 index 00000000..91977785 --- /dev/null +++ b/Commodore MAX/rtl/MAINRAM.qip @@ -0,0 +1,3 @@ +set_global_assignment -name IP_TOOL_NAME "RAM: 1-PORT" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "MAINRAM.v"] diff --git a/Commodore MAX/rtl/MAINRAM.v b/Commodore MAX/rtl/MAINRAM.v new file mode 100644 index 00000000..878b2d98 --- /dev/null +++ b/Commodore MAX/rtl/MAINRAM.v @@ -0,0 +1,177 @@ +// megafunction wizard: %RAM: 1-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: MAINRAM.v +// Megafunction Name(s): +// altsyncram +// +// 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 MAINRAM ( + address, + clock, + data, + rden, + wren, + q); + + input [10:0] address; + input clock; + input [7:0] data; + input rden; + input wren; + output [7:0] q; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; + tri1 rden; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [7:0] sub_wire0; + wire [7:0] q = sub_wire0[7:0]; + + altsyncram altsyncram_component ( + .address_a (address), + .clock0 (clock), + .data_a (data), + .wren_a (wren), + .rden_a (rden), + .q_a (sub_wire0), + .aclr0 (1'b0), + .aclr1 (1'b0), + .address_b (1'b1), + .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 (1'b1), + .eccstatus (), + .q_b (), + .rden_b (1'b1), + .wren_b (1'b0)); + defparam + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 2048, + altsyncram_component.operation_mode = "SINGLE_PORT", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_reg_a = "CLOCK0", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.read_during_write_mode_port_a = "NEW_DATA_NO_NBE_READ", + altsyncram_component.widthad_a = 11, + altsyncram_component.width_a = 8, + altsyncram_component.width_byteena_a = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +// Retrieval info: PRIVATE: AclrByte NUMERIC "0" +// Retrieval info: PRIVATE: AclrData NUMERIC "0" +// Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "1" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: Clken NUMERIC "0" +// Retrieval info: PRIVATE: DataBusSeparated NUMERIC "1" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "" +// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "2048" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +// Retrieval info: PRIVATE: RegAddr NUMERIC "1" +// Retrieval info: PRIVATE: RegData NUMERIC "1" +// Retrieval info: PRIVATE: RegOutput NUMERIC "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: SingleClock NUMERIC "1" +// Retrieval info: PRIVATE: UseDQRAM NUMERIC "1" +// Retrieval info: PRIVATE: WRCONTROL_ACLR_A NUMERIC "0" +// Retrieval info: PRIVATE: WidthAddr NUMERIC "11" +// Retrieval info: PRIVATE: WidthData NUMERIC "8" +// Retrieval info: PRIVATE: rden NUMERIC "1" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "2048" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "SINGLE_PORT" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +// Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_A STRING "NEW_DATA_NO_NBE_READ" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "11" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: USED_PORT: address 0 0 11 0 INPUT NODEFVAL "address[10..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data[7..0]" +// Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +// Retrieval info: USED_PORT: rden 0 0 0 0 INPUT VCC "rden" +// Retrieval info: USED_PORT: wren 0 0 0 0 INPUT NODEFVAL "wren" +// Retrieval info: CONNECT: @address_a 0 0 11 0 address 0 0 11 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: @data_a 0 0 8 0 data 0 0 8 0 +// Retrieval info: CONNECT: @rden_a 0 0 0 0 rden 0 0 0 0 +// Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0 +// Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL MAINRAM.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL MAINRAM.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL MAINRAM.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL MAINRAM.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL MAINRAM_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL MAINRAM_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Commodore MAX/rtl/MAX.sv b/Commodore MAX/rtl/MAX.sv new file mode 100644 index 00000000..6ea7fd5f --- /dev/null +++ b/Commodore MAX/rtl/MAX.sv @@ -0,0 +1,354 @@ +module MAX( + input CLOCK_27, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output LED, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input SPI_SS4, + input CONF_DATA0 + + ); + +`include "build_id.sv" + +localparam CONF_STR = { + "Commodore MAX;e0;", + "O2,SID Filter,On,Off;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T5,Reset;", + "V,v0.0.",`BUILD_DATE + }; + +wire clk_cpu, clk_sid, clk_ce, phi0_cpu; +wire locked; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; + + +reg [7:0] reset_cnt; +always @(posedge clk_cpu) begin + if(!locked || buttons[1] || status[0] || status[5])// | dio_download) + reset_cnt <= 8'h0; + else if(reset_cnt != 8'd255) + reset_cnt <= reset_cnt + 8'd1; +end + +wire reset = (reset_cnt != 8'd255); + +wire [15:0]ADDR_BUS; +wire [15:0]VIC_ADDR_BUS; +tri [7:0]DATA_BUS; +wire BA; +wire RW; +wire nRW_PLA; +wire nRAM; +wire nEXTRAM; +wire nVIC; +wire nSID; +wire nCIA_PLA; +wire nCIA; +wire nROML; +wire nROMH; +wire nCOLRAM; +wire nIRQ; +wire nNMI; +wire BUF; +wire AEC; + +// Video +wire hs, vs; +wire [5:0]r, g, b; +wire [17:0]audio; +//EXPANSIONS PORT +wire SP; +wire CNT; +//Joystick +wire [7:0]JoyA,JoyB; + + +wire [7:0]CPU_DI; +wire [7:0]CPU_DO; +wire [7:0]cpuIO; +//CIA +wire [7:0]CIA_DO; +//VIC +wire [7:0]VIC_DO; +wire [3:0]VIC_ColIndex; +//Main RAM +wire [7:0]RAM_DO; +//Color RAM +wire [3:0]COL_DI; +wire [3:0]COL_DO; +wire [3:0]COL_rDO; +//SID +wire [7:0]SID_DO; +//CARD +wire [7:0]CARD_DO; +wire [7:0]cia_pai; +wire [7:0]cia_pao; +wire [7:0]cia_pbi; +wire [7:0]cia_pbo; + +wire enableCPU, enableCIA, enableVIC = 1; +wire enablePixel; +wire pulseRd; + +pll pll( + .inclk0(CLOCK_27), + .areset(0), + .c0(clk_cpu),//32 + .c1(clk_sid),//1 + .c2(clk_ce),//8 + .c3(phi0_cpu),//todo + .locked(locked) + ); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .conf_str(CONF_STR), + .clk_sys(clk_cpu), + .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(scandoubler_disable), + .ypbpr(ypbpr), + .status(status), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick_0(JoyA), + .joystick_1(JoyB) +); + +video_mixer #(.LINE_LENGTH(600), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_cpu), + .ce_pix(clk_ce), + .ce_pix_actual(clk_ce), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .scandoubler_disable(1),//scandoubler_disable), + .hq2x(status[4:3]==1), + .ypbpr(ypbpr), + .ypbpr_full(1), + .R(r), + .G(g), + .B(b), + .mono(0), + .HSync(hs), + .VSync(vs), + .line_start(0), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS) +); + +sigma_delta_dac sigma_delta_dac +( + .DACout(AUDIO_L), + .DACin(audio), + .CLK(clk_cpu), + .RESET(0) +); + +assign AUDIO_R = AUDIO_L; + +//CPU MOS6510 +cpu_6510 U5 ( + .clk(clk_cpu), + .reset(reset), + .enable(enableCPU), + .nmi_n(nNMI), + .nmi_ack(), + .irq_n(nIRQ), + .CPUdi(CPU_DI), + .CPUdo(CPU_DO), + .addr(ADDR_BUS), + .we(RW), + .doIO(cpuIO), + .diIO("00010111") + ); + +//PLA MOS6703 +pla_6703 pla_6703 ( + .A(ADDR_BUS[15:10]), + .CLK(clk_cpu), + .BA(BA), + .RW_IN(~RW), + .RAM(nRAM), //invert + .EXRAM(nEXTRAM), //invert + .VIC(nVIC), //invert + .SID(nSID), //invert + .CIA(nCIA_PLA), //invert + .COLRAM(nCOLRAM), //invert + .ROML(nROML), //invert + .ROMH(nROMH), //invert + .BUF(BUF), //not invert + .RW_OUT(nRW_PLA) //invert + ); + + +always@(posedge clk_cpu) begin + if (~nRW_PLA) begin + if (~nRAM) begin + RAM_DO =CPU_DI; + if (~nVIC) begin + VIC_DO =CPU_DI; + end + end + end + if (~RW) begin + if (~nSID) begin + SID_DO =CPU_DI; + end + // if (~nCARD) begin +// CARD_DO =CPU_DI; +// end + if (~nCIA_PLA) begin + CIA_DO =CPU_DI; + end + end + COL_DO = COL_rDO ? (BUF & ~nCOLRAM) : 4'b0; +end + + + +//COLRAM 1024x4 +COLRAM U11 ( + .address(ADDR_BUS[9:0]), + .clock(clk_cpu), + .data(CPU_DO), + .rden(~nCOLRAM), + .wren(~nRW_PLA), + .q(COL_rDO) + ); + +//MAINRAM 2048x8 +MAINRAM U6 ( + .address(ADDR_BUS[10:0]), + .clock(clk_cpu), + .data(CPU_DO), + .rden(~nRAM), + .wren(~nRW_PLA), + .q(CPU_DI) + ); + + +//VIC MOS6566 +vic_656x vic_656x ( + .clk(clk_cpu), + .phi(phi0_cpu),// phi = 0 is VIC cycle-- phi = 1 is CPU cycle (only used by VIC when BA is low) + .enaData(enablePixel), + .enaPixel(enableVIC), + .baSync(0), + .ba(BA), + .mode6569(0),// PAL 63 cycles and 312 lines + .mode6567old(1),// old NTSC 64 cycles and 262 line + .mode6567R8(0),// new NTSC 65 cycles and 263 line + .mode6572(0),// PAL-N 65 cycles and 312 lines + .reset(reset), + .cs(~nVIC), + .we(~nRW_PLA), + .rd(pulseRd), + .lp_n(), + .aRegisters(DATA_BUS[5:0]), + .diRegisters(CPU_DO), + .datai(CPU_DO), + .diColor(COL_DO), + .datao(VIC_DO), + .vicAddr(VIC_ADDR_BUS[13:0]), + .irq_n(nIRQ), + .hSync(hs), + .vSync(vs), + .colorIndex(VIC_ColIndex), + .debugX(), + .debugY(), + .vicRefresh(), + .addrValid() + ); + +fpga64_rgbcolor fpga64_rgbcolor ( + .index(VIC_ColIndex), + .r(r), + .g(g), + .b(b) + ); + +//CIA MOS6526 +cia_6526 cia_6526 ( + .clk(clk_cpu), + .todClk(vs), + .reset(reset), + .enable(enableCIA), + .cs(~nCIA), + .we(~RW), + .rd(pulseRd), + .addr(ADDR_BUS[3:0]), + .CIAdi(CPU_DO), + .CIAdo(CIA_DO), + .ppai(cia_pai),//Keyboard + .ppao(cia_pao),//Keyboard + .ppbi(cia_pbi),//Keyboard + .ppbo(cia_pbo),//Keyboard + .flag_n(1), + .sp(SP), + .cnt(CNT), + .irq_n(~nIRQ) + ); + +//SID MOS6581 +sid_6581 sid_6581 ( + .clk32(clk_cpu), + .clk_1MHz(clk_sid), + .reset(reset), + .cs(~nSID), + .we(~RW), + .addr({4'b0,ADDR_BUS[3:0]}), + .data_i(CPU_DO), + .data_o(SID_DO), + .poti_x(~(cia_pao[7] & JoyA[5]) | (cia_pao[6] & JoyB[5])),//todo + .poti_y(~(cia_pao[7] & JoyA[6]) | (cia_pao[6] & JoyB[6])),//todo + .audio_data(audio) + ); + +cart cart( + .clk0(clk_cpu), + .addr(ADDR_BUS), + .data_i(CPU_DO), + .data_o(CART_DO), + .nmi(nNMI), + .reset(reset), + .romL(nROML), + .romH(nROMH), + .rw_pla_n(nRW_PLA), + .ba(BA), + .cia_pla_n(nCIA_PLA), + .cia_n(nCIA), + .cnt(CNT), + .exram_n(nEXTRAM), + .sp(SP), + .rw_n(RW), + .irq_n(nIRQ) + ); + +endmodule \ No newline at end of file diff --git a/Commodore MAX/rtl/build_id.sv b/Commodore MAX/rtl/build_id.sv new file mode 100644 index 00000000..7d0ba7de --- /dev/null +++ b/Commodore MAX/rtl/build_id.sv @@ -0,0 +1,2 @@ +`define BUILD_DATE "180103" +`define BUILD_TIME "021747" diff --git a/Commodore MAX/rtl/build_id.tcl b/Commodore MAX/rtl/build_id.tcl new file mode 100644 index 00000000..be673dac --- /dev/null +++ b/Commodore MAX/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.sv" + 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/Commodore MAX/rtl/cart.sv b/Commodore MAX/rtl/cart.sv new file mode 100644 index 00000000..83235c84 --- /dev/null +++ b/Commodore MAX/rtl/cart.sv @@ -0,0 +1,21 @@ +module cart( + input clk0, + input [15:0] addr, + input [7:0] data_i, + output [7:0] data_o, + output reg nmi, + input reset, + input romL, // romL signal in + input romH, + input rw_pla_n, + input ba, + input cia_pla_n, + input cia_n, + input cnt, + input exram_n, + input sp, + input rw_n, + input irq_n +); + +endmodule \ No newline at end of file diff --git a/Commodore MAX/rtl/cia_6526.vhd b/Commodore MAX/rtl/cia_6526.vhd new file mode 100644 index 00000000..a9766508 --- /dev/null +++ b/Commodore MAX/rtl/cia_6526.vhd @@ -0,0 +1,783 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- 6526 Complex Interface Adapter +-- +-- rev 1 - june17 / TOD alarms +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity cia_6526 is + generic ( + todEnabled : std_logic := '0' + ); + port ( + clk: in std_logic; + todClk: in std_logic; + reset: in std_logic; + enable: in std_logic; + cs: in std_logic; + we: in std_logic; -- Write strobe + rd: in std_logic; -- Read strobe + + addr: in unsigned(3 downto 0); + CIAdi: in unsigned(7 downto 0); + CIAdo: out unsigned(7 downto 0); + + ppai: in unsigned(7 downto 0); + ppao: out unsigned(7 downto 0); + ppad: out unsigned(7 downto 0); + + ppbi: in unsigned(7 downto 0); + ppbo: out unsigned(7 downto 0); + ppbd: out unsigned(7 downto 0); + + flag_n: in std_logic; + sp: out std_logic; + cnt: out std_logic; + irq_n: out std_logic + ); +end cia_6526; + +-- ----------------------------------------------------------------------- + +architecture Behavioral of cia_6526 is + -- IO ports + signal pra: unsigned(7 downto 0); + signal prb: unsigned(7 downto 0); + signal ddra: unsigned(7 downto 0); + signal ddrb: unsigned(7 downto 0); + + -- Timer to IO ports + signal timerAPulse : std_logic; + signal timerAToggle : std_logic; + signal timerBPulse : std_logic; + signal timerBToggle : std_logic; + + -- Timer A reload registers + signal talo: unsigned(7 downto 0) := (others => '1'); + signal tahi: unsigned(7 downto 0) := (others => '1'); + + -- Timer B reload registers + signal tblo: unsigned(7 downto 0) := (others => '1'); + signal tbhi: unsigned(7 downto 0) := (others => '1'); + + -- Timer A and B internal registers + signal timerA : unsigned(15 downto 0); + signal forceTimerA : std_logic; + signal loadTimerA : std_logic; + signal clkTimerA : std_logic; -- internal timer clock + + signal timerB: unsigned(15 downto 0); + signal forceTimerB : std_logic; + signal loadTimerB : std_logic; + signal clkTimerB : std_logic; -- internal timer clock + + signal WR_Delay_offset : std_logic; -- adjustable WR signal delay - LCA jun17 + + -- Config register A + signal cra_start : std_logic; + signal cra_pbon : std_logic; + signal cra_outmode : std_logic; + signal cra_runmode : std_logic; + signal cra_runmode_reg : std_logic; + signal cra_inmode : std_logic; + signal cra_spmode : std_logic; + signal cra_todin : std_logic; + + -- Config register B + signal crb_start : std_logic; + signal crb_pbon : std_logic; + signal crb_outmode : std_logic; + signal crb_runmode : std_logic; + signal crb_runmode_reg : std_logic; + signal crb_inmode5 : std_logic; + signal crb_inmode6 : std_logic; + signal crb_alarm : std_logic; + + -- TOD 50/60 hz clock + signal todTick : std_logic; + signal oldTodClk : std_logic; + signal tod_clkcnt: unsigned(2 downto 0); + + -- TOD counters + signal tod_running: std_logic; + signal tod_10ths: unsigned(3 downto 0); + signal tod_secs: unsigned(6 downto 0); + signal tod_mins: unsigned(6 downto 0); + signal tod_hrs: unsigned(7 downto 0); + signal tod_pm: std_logic; + + -- TOD latches + signal tod_latched: std_logic; + signal tod_latch_10ths: unsigned(3 downto 0); + signal tod_latch_secs: unsigned(6 downto 0); + signal tod_latch_mins: unsigned(6 downto 0); + signal tod_latch_hrs: unsigned(7 downto 0); + constant tod_latch_pm: std_logic := '0'; + + -- TOD alarms - LCA + signal tod_10ths_alarm: unsigned(3 downto 0); + signal tod_secs_alarm: unsigned(6 downto 0); + signal tod_mins_alarm: unsigned(6 downto 0); + signal tod_hrs_alarm: unsigned(7 downto 0); + signal tod_pm_alarm: std_logic; + + -- Interrupt processing + signal resetIrq : boolean; + signal intr_flagn : std_logic; + signal intr_serial : std_logic; + signal intr_alarm : std_logic; -- LCA + signal intr_timerA : std_logic; + signal intr_timerB : std_logic; + signal mask_timerA : std_logic; + signal mask_timerB : std_logic; + signal mask_alarm : std_logic; -- LCA + signal mask_serial : std_logic; + signal mask_flagn : std_logic; + signal ir: std_logic; + + signal prevFlag_n: std_logic; + + signal myWr : std_logic; + signal myRd : std_logic; +begin +-- ----------------------------------------------------------------------- +-- chip-select signals +-- ----------------------------------------------------------------------- + myWr <= cs and we; + myRd <= cs and rd; + +-- ----------------------------------------------------------------------- +-- I/O ports +-- ----------------------------------------------------------------------- + -- Port A + process(pra, ddra) + begin + ppad <= ddra; + ppao <= pra or (not ddra); + end process; + + -- Port B + process(prb, ddrb, cra_pbon, cra_outmode, crb_pbon, crb_outmode, timerAPulse, timerAToggle, timerBPulse, timerBToggle) + begin + ppbd <= ddrb; + ppbo <= prb or (not ddrb); + if cra_pbon = '1' then + ppbo(6) <= timerAPulse or (not ddrb(6)); + if cra_outmode = '1' then + ppbo(6) <= timerAToggle or (not ddrb(6)); + end if; + end if; + if crb_pbon = '1' then + ppbo(7) <= timerBPulse or (not ddrb(7)); + if crb_outmode = '1' then + ppbo(7) <= timerBToggle or (not ddrb(7)); + end if; + end if; + end process; + + -- I/O port registers + process(clk) + begin + if rising_edge(clk) then + if myWr = '1' then + case addr is + when X"0" => pra <= CIAdi; + when X"1" => prb <= CIAdi; + when X"2" => ddra <= CIAdi; + when X"3" => ddrb <= CIAdi; + when others => null; + end case; + end if; + if reset = '1' then + pra <= (others => '0'); + prb <= (others => '0'); + ddra <= (others => '0'); + ddrb <= (others => '0'); + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- TOD - time of day +-- ----------------------------------------------------------------------- + process(clk) + begin + -- Process rising edge on the todClk. + -- There is a prescaler of 5 or 6 to get 10ths of seconds from + -- 50 Hz or 60 Hz line frequency. + -- + -- Output is a 'todTick' signal synchronished with enable signal (@ 1Mhz). + if rising_edge(clk) then + if todEnabled = '1' then + if enable = '1' then + todTick <= '0'; + end if; + + if todClk = '1' and oldTodClk = '0' then + -- Divide by 5 or 6 dependng on 50/60 Hz flag. + if tod_clkcnt /= "000" then + tod_clkcnt <= tod_clkcnt - 1; + else + todTick <= tod_running; + tod_clkcnt <= "101"; -- 60 Hz + if cra_todin = '1' then + tod_clkcnt <= "100"; -- 50 Hz + end if; + end if; + end if; + oldTodClk <= todClk; + else + todTick <= '0'; + end if; + end if; + end process; + + process(clk) + variable new_10ths : unsigned(3 downto 0); + variable new_secsL : unsigned(3 downto 0); + variable new_secsH : unsigned(2 downto 0); + variable new_minsL : unsigned(3 downto 0); + variable new_minsH : unsigned(2 downto 0); + variable new_hrsL : unsigned(3 downto 0); + variable new_hrsH : std_logic; + variable new_hrs_byte : unsigned(7 downto 0); -- LCA am/pm and hours + begin + if rising_edge(clk) then + new_10ths := tod_10ths; + new_secsL := tod_secs(3 downto 0); + new_secsH := tod_secs(6 downto 4); + new_minsL := tod_mins(3 downto 0); + new_minsH := tod_mins(6 downto 4); +-- new_hrsL := tod_hrs(3 downto 0); +-- new_hrsH := tod_hrs(4); + new_hrs_byte := tod_hrs (7 downto 0); -- LCA am/pm and hours +-- new_hrs_byte := new_hrsH & new_hrsL; + + if enable = '1' + and todTick = '1' then + if new_10ths /= "1001" then + new_10ths := new_10ths + 1; + else + new_10ths := "0000"; + if new_secsL /= "1001" then + new_secsL := new_secsL + 1; + else + new_secsL := "0000"; + if new_secsH /= "101" then + new_secsH := new_secsH + 1; + else + new_secsH := "000"; + if new_minsL /= "1001" then + new_minsL := new_minsL + 1; + else + new_minsL := "0000"; + if new_minsH /= "101" then + new_minsH := new_minsH + 1; + else + new_minsH := "000"; + -- hrs were missing jun17 LCA + -- I mean completely absent from code :) !!!!!! + -- case to lookup then handles oddities in others + -- retarded am/pm flag flip madness handled at register load below (REG B) + + case tod_hrs is -- case state to set hours and am/pm + when "00010010" => + new_hrs_byte := "00000001"; -- 1 am set + when "00000001" => + new_hrs_byte := "00000010"; + when "00000010" => + new_hrs_byte := "00000011"; + when "00000011" => + new_hrs_byte := "00000100"; + when "00000100" => + new_hrs_byte := "00000101"; + when "00000101" => + new_hrs_byte := "00000110"; + when "00000110" => + new_hrs_byte := "00000111"; + when "00000111" => + new_hrs_byte := "00001000"; + when "00001000" => + new_hrs_byte := "00001001"; + when "00001001" => + new_hrs_byte := "00010000"; + when "00010000" => + new_hrs_byte := "00010001"; -- 11am set + when "00010001" => + new_hrs_byte := "10010010"; -- 12pm set + when "10010010" => + new_hrs_byte := "10000001"; -- 1 pm set + + when "10000001" => + new_hrs_byte := "10000010"; + when "10000010" => + new_hrs_byte := "10000011"; + when "10000011" => + new_hrs_byte := "10000100"; + when "10000100" => + new_hrs_byte := "10000101"; + when "10000101" => + new_hrs_byte := "10000110"; + when "10000110" => + new_hrs_byte := "10000111"; + when "10000111" => + new_hrs_byte := "10001000"; + when "10001000" => + new_hrs_byte := "10001001"; + when "10001001" => + new_hrs_byte := "10010000"; -- 10pm set + when "10010000" => + new_hrs_byte := "10010001"; -- 11pm set + when "10010001" => + new_hrs_byte := "00010010"; -- 12am set (midnight) + when others => + new_hrs_byte (3 downto 0) := new_hrs_byte (3 downto 0) + 1; + --null; + end case; + + end if; + end if; + end if; + end if; + end if; + end if; + + if myWr = '1' then + if crb_alarm = '0' then + case addr is + when X"8" => + new_10ths := CIAdi(3 downto 0); + tod_running <= '1'; + when X"9" => + new_secsL := CIAdi(3 downto 0); + new_secsH := CIAdi(6 downto 4); + when X"A" => + new_minsL := CIAdi(3 downto 0); + new_minsH := CIAdi(6 downto 4); + when X"B" => + new_hrs_byte := CIAdi(7) & "00" & CIAdi(4 downto 0); -- LCA + tod_running <= '0'; + if CIAdi(7 downto 0) = "10010010" or CIAdi(7 downto 0) = "00010010" then -- super bodge because cbm flips am/pm flag at 12 am or pm (its retarded!!!!!) + new_hrs_byte(7) := not new_hrs_byte(7); -- This P.O.S. now mimics real commodore 64 !!!!! LCA + end if; + when others => + null; + end case; + else -- TOD ALARM UPDATE + case addr is + when X"8" => + tod_10ths_alarm <= CIAdi(3 downto 0); + when X"9" => + tod_secs_alarm <= CIAdi(6 downto 0); + when X"A" => + tod_mins_alarm <= CIAdi(6 downto 0); + when X"B" => +-- tod_hrs_alarm <= CIAdi(4 downto 0); +-- tod_pm_alarm <= CIAdi(7); + tod_hrs_alarm <= CIAdi(7) & "00" & CIAdi(4 downto 0); -- LCA + if CIAdi(7 downto 0) = "10010010" or CIAdi(7 downto 0) = "00010010" then -- super bodge because cbm flips am/pm flag at 12 am or pm (its retarded!!!!!) + tod_hrs_alarm(7) <= not tod_hrs_alarm(7); -- This P.O.S. now mimics real commodore 64 !!!!! LCA + end if; + when others => + null; + end case; + end if; + end if; + + -- Update state + tod_10ths <= new_10ths; + tod_secs <= new_secsH & new_secsL; + tod_mins <= new_minsH & new_minsL; + tod_hrs <= new_hrs_byte; -- LCA + + if tod_latched = '0' then + tod_latch_10ths <= new_10ths; + tod_latch_secs <= new_secsH & new_secsL; + tod_latch_mins <= new_minsH & new_minsL; + tod_latch_hrs <= new_hrs_byte; -- LCA + end if; + + -- TOD ALARM test for match - LCA + if (tod_10ths = tod_10ths_alarm) and + (tod_secs = tod_secs_alarm) and + (tod_mins = tod_mins_alarm) and + (tod_hrs = tod_hrs_alarm) and + (crb_alarm = '1') then + intr_alarm <= '1' ; + end if; + + if reset = '1' then + tod_running <= '0'; + tod_10ths_alarm <= "0000" ; + tod_secs_alarm <= "0000000" ; + tod_mins_alarm <= "0000000" ; + tod_hrs_alarm <= "00000000" ; + tod_pm_alarm <= '0' ; + end if; + + if resetIrq then + intr_alarm <= '0' ; + end if; + end if; + end process; + + -- Control TOD output latch + -- Reading the hours latches the output until + -- the 10ths of seconds are read. While latched the + -- clock continues to run in the bankground. + process(clk) + begin + if rising_edge(clk) then + if myRd = '1' then + case addr is + when X"8" => tod_latched <= '0'; + when X"B" => tod_latched <= '1'; + when others => null; + end case; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- Timer A and B +-- ----------------------------------------------------------------------- + + +-- adjustable time delay jun17 - LCA + +-- ----------------------------------------------------------------------- +-- ----------------------------------------------------------------------- + + process(clk) + variable WR_delay : unsigned(15 downto 0); + begin + if rising_edge(clk) then + if (myWr = '0' or reset = '1') then + WR_delay := "0000000000000000"; + WR_Delay_offset <= '0'; +-- end if; + elsif (myWr = '1' and (WR_delay < 31)) then + WR_delay := WR_delay + 1; +-- end if; + elsif (WR_delay > 8) then -- adds a (1/32mhz * value) qualifier to WR signal in timers - LCA jun17 + WR_Delay_offset <= '1'; + else + WR_Delay_offset <= '0'; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- + + process(clk) + variable newTimerA : unsigned(15 downto 0); + variable nextClkTimerA : std_logic; + variable timerBInput : std_logic; + variable newTimerB : unsigned(15 downto 0); + variable nextClkTimerB : std_logic; + variable new_cra_runmode : std_logic; + variable new_crb_runmode : std_logic; + begin + if rising_edge(clk) then + loadTimerA <= '0'; + loadTimerB <= '0'; + new_cra_runmode := cra_runmode; + new_crb_runmode := crb_runmode; + + if resetIrq then + intr_timerA <= '0'; + intr_timerB <= '0'; + end if; + + if myWr = '1' then +-- if (myWr = '1' and WR_Delay_offset = '1') then -- x/32mhz offset to qualify WR signal LCA jun17 + case addr is + when X"4" => + talo <= CIAdi; + when X"5" => + tahi <= CIAdi; + if cra_start = '0' then + loadTimerA <= '1'; + end if; + when X"6" => + tblo <= CIAdi; + when X"7" => + tbhi <= CIAdi; + if crb_start = '0' then + loadTimerB <= '1'; + end if; + when X"E" => + if cra_start = '0' then + -- Only set on rising edge + timerAToggle <= timerAToggle or CIAdi(0); + end if; + cra_start <= CIAdi(0); + new_cra_runmode := CIAdi(3); + when X"F" => + if crb_start = '0' then + -- Only set on rising edge + timerBToggle <= timerBToggle or CIAdi(0); + end if; + crb_start <= CIAdi(0); + new_crb_runmode := CIAdi(3); + when others => null; + end case; + end if; + + if reset = '1' then + new_cra_runmode := '0'; + new_crb_runmode := '0'; + end if; + + cra_runmode <= new_cra_runmode; + crb_runmode <= new_crb_runmode; + + if enable = '1' then + -- + -- process timer A + -- + timerAPulse <= '0'; + newTimerA := timerA; + + -- CNT is not emulated so don't count when inmode = 1 + nextClkTimerA := cra_start and (not cra_inmode); + if clkTimerA = '1' then + newTimerA := newTimerA - 1; + end if; + if nextClkTimerA = '1' + and newTimerA = 0 then + intr_timerA <= '1'; + loadTimerA <= '1'; + timerAPulse <= '1'; + timerAToggle <= not timerAToggle; + if (new_cra_runmode or cra_runmode) = '1' then + cra_start <= '0'; + end if; + end if; + if forceTimerA = '1' then + loadTimerA <= '1'; + end if; + clkTimerA <= nextClkTimerA; + timerA <= newTimerA; + + -- + -- process timer B + -- + timerBPulse <= '0'; + newTimerB := timerB; + + if crb_inmode6 = '1' then + -- count timerA underflows + timerBInput := timerAPulse; + elsif crb_inmode5 = '0' then + -- count clock pulses + timerBInput := '1'; + else + -- CNT is not emulated so don't count + timerBInput := '0'; + end if; + nextClkTimerB := timerBInput and crb_start; + if clkTimerB = '1' then + newTimerB := newTimerB - 1; + end if; + if nextClkTimerB = '1' + and newTimerB = 0 then + intr_timerB <= '1'; + loadTimerB <= '1'; + timerBPulse <= '1'; + timerBToggle <= not timerBToggle; + if (new_crb_runmode or crb_runmode) = '1' then + crb_start <= '0'; + end if; + end if; + if forceTimerB = '1' then + loadTimerB <= '1'; + end if; + clkTimerB <= nextClkTimerB; + timerB <= newTimerB; + end if; + + if loadTimerA = '1' then + timerA <= tahi & talo; + clkTimerA <= '0'; + end if; + + if loadTimerB = '1' then + timerB <= tbhi & tblo; + clkTimerB <= '0'; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- Interrupts +-- ----------------------------------------------------------------------- + resetIrq <= ((myRd = '1') and (addr = X"D")) or (reset = '1'); + irq_n <= not(ir); + intr_serial <= '0'; + + process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + ir <= ir + or (intr_timerA and mask_timerA) + or (intr_timerB and mask_timerB) + or (intr_alarm and mask_alarm) + or (intr_serial and mask_serial) + or (intr_flagn and mask_flagn); + end if; + + if myWr = '1' then + case addr is + when X"D" => + if CIAdi(7) ='0' then + mask_timerA <= mask_timerA and (not CIAdi(0)); + mask_timerB <= mask_timerB and (not CIAdi(1)); + mask_alarm <= mask_alarm and (not CIAdi(2)); -- LCA + mask_serial <= mask_serial and (not CIAdi(3)); + mask_flagn <= mask_flagn and (not CIAdi(4)); + else + mask_timerA <= mask_timerA or CIAdi(0); + mask_timerB <= mask_timerB or CIAdi(1); + mask_alarm <= mask_alarm or CIAdi(2); -- LCA + mask_serial <= mask_serial or CIAdi(3); + mask_flagn <= mask_flagn or CIAdi(4); + end if; + when others => + null; + end case; + end if; + + if resetIrq then + ir <= '0'; + end if; + + if reset = '1' then + mask_timerA <= '0'; + mask_timerB <= '0'; + mask_alarm <= '0' ; + mask_serial <= '0'; + mask_flagn <= '0'; + end if; + end if; + end process; + + + + +-- ----------------------------------------------------------------------- +-- FLAG_N input +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + prevFlag_n <= flag_n; + if (flag_n = '0') and (prevFlag_n = '1') then + intr_flagn <= '1'; + end if; + if resetIrq then + intr_flagn <= '0'; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- Write registers +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then +-- resetIrq <= '0'; + if enable = '1' then + forceTimerA <= '0'; + forceTimerB <= '0'; +-- cra_runmode_reg <= cra_runmode; +-- crb_runmode_reg <= crb_runmode; + end if; + if myWr = '1' then + case addr is + when X"E" => + cra_pbon <= CIAdi(1); + cra_outmode <= CIAdi(2); +-- cra_runmode <= CIAdi(3); + forceTimerA <= CIAdi(4); + cra_inmode <= CIAdi(5); + cra_spmode <= CIAdi(6); + cra_todin <= CIAdi(7); + when X"F" => + crb_pbon <= CIAdi(1); + crb_outmode <= CIAdi(2); +-- crb_runmode <= CIAdi(3); + forceTimerB <= CIAdi(4); + crb_inmode5 <= CIAdi(5); + crb_inmode6 <= CIAdi(6); + crb_alarm <= CIAdi(7); + when others => null; + end case; + end if; + if reset = '1' then + cra_pbon <= '0'; + cra_outmode <= '0'; +-- cra_runmode <= '0'; + cra_inmode <= '0'; + cra_spmode <= '0'; + cra_todin <= '0'; + crb_pbon <= '0'; + crb_outmode <= '0'; +-- crb_runmode <= '0'; + crb_inmode5 <= '0'; + crb_inmode6 <= '0'; + crb_alarm <= '0'; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- Read registers +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + case addr is + when X"0" => CIAdo <= ppai; + when X"1" => CIAdo <= ppbi; + when X"2" => CIAdo <= DDRA; + when X"3" => CIAdo <= DDRB; + when X"4" => CIAdo <= timera(7 downto 0); + when X"5" => CIAdo <= timera(15 downto 8); + when X"6" => CIAdo <= timerb(7 downto 0); + when X"7" => CIAdo <= timerb(15 downto 8); + when X"8" => CIAdo <= "0000" & tod_latch_10ths; + when X"9" => CIAdo <= "0" & tod_latch_secs; + when X"A" => CIAdo <= "0" & tod_latch_mins; +-- when X"B" => CIAdo <= tod_latch_pm & "00" & tod_latch_hrs; + when X"B" => CIAdo <= tod_latch_hrs; -- LCA + when X"C" => CIAdo <= (others => '0'); + when X"D" => CIAdo <= ir & "00" & intr_flagn & intr_serial & intr_alarm & intr_timerB & intr_timerA; + when X"E" => CIAdo <= cra_todin & cra_spmode & cra_inmode & '0' & cra_runmode & cra_outmode & cra_pbon & cra_start; + when X"F" => CIAdo <= crb_alarm & crb_inmode6 & crb_inmode5 & '0' & crb_runmode & crb_outmode & crb_pbon & crb_start; + when others => CIAdo <= (others => '-'); + end case; + end if; + end process; +end Behavioral; diff --git a/Commodore MAX/rtl/cpu65xx_e.vhd b/Commodore MAX/rtl/cpu65xx_e.vhd new file mode 100644 index 00000000..27166e7a --- /dev/null +++ b/Commodore MAX/rtl/cpu65xx_e.vhd @@ -0,0 +1,49 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- Interface to 6502/6510 core +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use ieee.std_logic_1164.ALL; +use ieee.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity cpu65xx is + generic ( + pipelineOpcode : boolean; + pipelineAluMux : boolean; + pipelineAluOut : boolean + ); + port ( + clk : in std_logic; + enable : in std_logic; + reset : in std_logic; + nmi_n : in std_logic; + nmi_ack : out std_logic; + irq_n : in std_logic; + so_n : in std_logic := '1'; + + di : in unsigned(7 downto 0); + do : out unsigned(7 downto 0); + addr : out unsigned(15 downto 0); + we : out std_logic; + + debugOpcode : out unsigned(7 downto 0); + debugPc : out unsigned(15 downto 0); + debugA : out unsigned(7 downto 0); + debugX : out unsigned(7 downto 0); + debugY : out unsigned(7 downto 0); + debugS : out unsigned(7 downto 0) + ); +end cpu65xx; \ No newline at end of file diff --git a/Commodore MAX/rtl/cpu65xx_fast.vhd b/Commodore MAX/rtl/cpu65xx_fast.vhd new file mode 100644 index 00000000..a387b37d --- /dev/null +++ b/Commodore MAX/rtl/cpu65xx_fast.vhd @@ -0,0 +1,1565 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- Table driven, cycle exact 6502/6510 core +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use ieee.std_logic_1164.ALL; +use ieee.std_logic_unsigned.ALL; +use ieee.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +-- Store Zp (3) => fetch, cycle2, cycleEnd +-- Store Zp,x (4) => fetch, cycle2, preWrite, cycleEnd +-- Read Zp,x (4) => fetch, cycle2, cycleRead, cycleRead2 +-- Rmw Zp,x (6) => fetch, cycle2, cycleRead, cycleRead2, cycleRmw, cycleEnd +-- Store Abs (4) => fetch, cycle2, cycle3, cycleEnd +-- Store Abs,x (5) => fetch, cycle2, cycle3, preWrite, cycleEnd +-- Rts (6) => fetch, cycle2, cycle3, cycleRead, cycleJump, cycleIncrEnd +-- Rti (6) => fetch, cycle2, stack1, stack2, stack3, cycleJump +-- Jsr (6) => fetch, cycle2, .. cycle5, cycle6, cycleJump +-- Jmp abs (-) => fetch, cycle2, .., cycleJump +-- Jmp (ind) (-) => fetch, cycle2, .., cycleJump +-- Brk / irq (6) => fetch, cycle2, stack2, stack3, stack4 +-- ----------------------------------------------------------------------- + +architecture fast of cpu65xx is +-- Statemachine + type cpuCycles is ( + opcodeFetch, -- New opcode is read and registers updated + cycle2, + cycle3, + cyclePreIndirect, + cycleIndirect, + cycleBranchTaken, + cycleBranchPage, + cyclePreRead, -- Cycle before read while doing zeropage indexed addressing. + cycleRead, -- Read cycle + cycleRead2, -- Second read cycle after page-boundary crossing. + cycleRmw, -- Calculate ALU output for read-modify-write instr. + cyclePreWrite, -- Cycle before write when doing indexed addressing. + cycleWrite, -- Write cycle for zeropage or absolute addressing. + cycleStack1, + cycleStack2, + cycleStack3, + cycleStack4, + cycleJump, -- Last cycle of Jsr, Jmp. Next fetch address is target addr. + cycleEnd + ); + signal theCpuCycle : cpuCycles; + signal nextCpuCycle : cpuCycles; + signal updateRegisters : boolean; + signal processIrq : std_logic; + signal nmiReg: std_logic; + signal nmiEdge: std_logic; + signal irqReg : std_logic; -- Delay IRQ input with one clock cycle. + signal soReg : std_logic; -- SO pin edge detection + +-- Opcode decoding + constant opcUpdateA : integer := 0; + constant opcUpdateX : integer := 1; + constant opcUpdateY : integer := 2; + constant opcUpdateS : integer := 3; + constant opcUpdateN : integer := 4; + constant opcUpdateV : integer := 5; + constant opcUpdateD : integer := 6; + constant opcUpdateI : integer := 7; + constant opcUpdateZ : integer := 8; + constant opcUpdateC : integer := 9; + + constant opcSecondByte : integer := 10; + constant opcAbsolute : integer := 11; + constant opcZeroPage : integer := 12; + constant opcIndirect : integer := 13; + constant opcStackAddr : integer := 14; -- Push/Pop address + constant opcStackData : integer := 15; -- Push/Pop status/data + constant opcJump : integer := 16; + constant opcBranch : integer := 17; + constant indexX : integer := 18; + constant indexY : integer := 19; + constant opcStackUp : integer := 20; + constant opcWrite : integer := 21; + constant opcRmw : integer := 22; + constant opcIncrAfter : integer := 23; -- Insert extra cycle to increment PC (RTS) + constant opcRti : integer := 24; + constant opcIRQ : integer := 25; + + constant opcInA : integer := 26; + constant opcInE : integer := 27; + constant opcInX : integer := 28; + constant opcInY : integer := 29; + constant opcInS : integer := 30; + constant opcInT : integer := 31; + constant opcInH : integer := 32; + constant opcInClear : integer := 33; + constant aluMode1From : integer := 34; + -- + constant aluMode1To : integer := 37; + constant aluMode2From : integer := 38; + -- + constant aluMode2To : integer := 40; + -- + constant opcInCmp : integer := 41; + constant opcInCpx : integer := 42; + constant opcInCpy : integer := 43; + + + subtype addrDef is unsigned(0 to 15); + -- + -- is Interrupt -----------------+ + -- instruction is RTI ----------------+| + -- PC++ on last cycle (RTS) ---------------+|| + -- RMW --------------+||| + -- Write -------------+|||| + -- Pop/Stack up -------------+||||| + -- Branch ---------+ |||||| + -- Jump ----------+| |||||| + -- Push or Pop data -------+|| |||||| + -- Push or Pop addr ------+||| |||||| + -- Indirect -----+|||| |||||| + -- ZeroPage ----+||||| |||||| + -- Absolute ---+|||||| |||||| + -- PC++ on cycle2 --+||||||| |||||| + -- |AZI||JBXY|WM||| + constant immediate : addrDef := "1000000000000000"; + constant implied : addrDef := "0000000000000000"; + -- Zero page + constant readZp : addrDef := "1010000000000000"; + constant writeZp : addrDef := "1010000000010000"; + constant rmwZp : addrDef := "1010000000001000"; + -- Zero page indexed + constant readZpX : addrDef := "1010000010000000"; + constant writeZpX : addrDef := "1010000010010000"; + constant rmwZpX : addrDef := "1010000010001000"; + constant readZpY : addrDef := "1010000001000000"; + constant writeZpY : addrDef := "1010000001010000"; + constant rmwZpY : addrDef := "1010000001001000"; + -- Zero page indirect + constant readIndX : addrDef := "1001000010000000"; + constant writeIndX : addrDef := "1001000010010000"; + constant rmwIndX : addrDef := "1001000010001000"; + constant readIndY : addrDef := "1001000001000000"; + constant writeIndY : addrDef := "1001000001010000"; + constant rmwIndY : addrDef := "1001000001001000"; + -- |AZI||JBXY|WM|| + -- Absolute + constant readAbs : addrDef := "1100000000000000"; + constant writeAbs : addrDef := "1100000000010000"; + constant rmwAbs : addrDef := "1100000000001000"; + constant readAbsX : addrDef := "1100000010000000"; + constant writeAbsX : addrDef := "1100000010010000"; + constant rmwAbsX : addrDef := "1100000010001000"; + constant readAbsY : addrDef := "1100000001000000"; + constant writeAbsY : addrDef := "1100000001010000"; + constant rmwAbsY : addrDef := "1100000001001000"; + -- PHA PHP + constant push : addrDef := "0000010000000000"; + -- PLA PLP + constant pop : addrDef := "0000010000100000"; + -- Jumps + constant jsr : addrDef := "1000101000000000"; + constant jumpAbs : addrDef := "1000001000000000"; + constant jumpInd : addrDef := "1100001000000000"; + constant relative : addrDef := "1000000100000000"; + -- Specials + constant rts : addrDef := "0000101000100100"; + constant rti : addrDef := "0000111000100010"; + constant brk : addrDef := "1000111000000001"; +-- constant : unsigned(0 to 0) := "0"; + constant xxxxxxxx : addrDef := "----------0---00"; + + -- A = accu + -- E = Accu | 0xEE (for ANE, LXA) + -- X = index X + -- Y = index Y + -- S = Stack pointer + -- H = indexH + -- + -- AEXYSTHc + constant aluInA : unsigned(0 to 7) := "10000000"; + constant aluInE : unsigned(0 to 7) := "01000000"; + constant aluInEXT : unsigned(0 to 7) := "01100100"; + constant aluInET : unsigned(0 to 7) := "01000100"; + constant aluInX : unsigned(0 to 7) := "00100000"; + constant aluInXH : unsigned(0 to 7) := "00100010"; + constant aluInY : unsigned(0 to 7) := "00010000"; + constant aluInYH : unsigned(0 to 7) := "00010010"; + constant aluInS : unsigned(0 to 7) := "00001000"; + constant aluInT : unsigned(0 to 7) := "00000100"; + constant aluInAX : unsigned(0 to 7) := "10100000"; + constant aluInAXH : unsigned(0 to 7) := "10100010"; + constant aluInAT : unsigned(0 to 7) := "10000100"; + constant aluInXT : unsigned(0 to 7) := "00100100"; + constant aluInST : unsigned(0 to 7) := "00001100"; + constant aluInSet : unsigned(0 to 7) := "00000000"; + constant aluInClr : unsigned(0 to 7) := "00000001"; + constant aluInXXX : unsigned(0 to 7) := "--------"; + + -- Most of the aluModes are just like the opcodes. + -- aluModeInp -> input is output. calculate N and Z + -- aluModeCmp -> Compare for CMP, CPX, CPY + -- aluModeFlg -> input to flags needed for PLP, RTI and CLC, SEC, CLV + -- aluModeInc -> for INC but also INX, INY + -- aluModeDec -> for DEC but also DEX, DEY + + subtype aluMode1 is unsigned(0 to 3); + subtype aluMode2 is unsigned(0 to 2); + subtype aluMode is unsigned(0 to 9); + + -- Logic/Shift ALU + constant aluModeInp : aluMode1 := "0000"; + constant aluModeP : aluMode1 := "0001"; + constant aluModeInc : aluMode1 := "0010"; + constant aluModeDec : aluMode1 := "0011"; + constant aluModeFlg : aluMode1 := "0100"; + constant aluModeBit : aluMode1 := "0101"; + -- 0110 + -- 0111 + constant aluModeLsr : aluMode1 := "1000"; + constant aluModeRor : aluMode1 := "1001"; + constant aluModeAsl : aluMode1 := "1010"; + constant aluModeRol : aluMode1 := "1011"; + -- 1100 + -- 1101 + -- 1110 + constant aluModeAnc : aluMode1 := "1111"; + + -- Arithmetic ALU + constant aluModePss : aluMode2 := "000"; + constant aluModeCmp : aluMode2 := "001"; + constant aluModeAdc : aluMode2 := "010"; + constant aluModeSbc : aluMode2 := "011"; + constant aluModeAnd : aluMode2 := "100"; + constant aluModeOra : aluMode2 := "101"; + constant aluModeEor : aluMode2 := "110"; + constant aluModeArr : aluMode2 := "111"; + + + constant aluInp : aluMode := aluModeInp & aluModePss & "---"; + constant aluP : aluMode := aluModeP & aluModePss & "---"; + constant aluInc : aluMode := aluModeInc & aluModePss & "---"; + constant aluDec : aluMode := aluModeDec & aluModePss & "---"; + constant aluFlg : aluMode := aluModeFlg & aluModePss & "---"; + constant aluBit : aluMode := aluModeBit & aluModeAnd & "---"; + constant aluRor : aluMode := aluModeRor & aluModePss & "---"; + constant aluLsr : aluMode := aluModeLsr & aluModePss & "---"; + constant aluRol : aluMode := aluModeRol & aluModePss & "---"; + constant aluAsl : aluMode := aluModeAsl & aluModePss & "---"; + + constant aluCmp : aluMode := aluModeInp & aluModeCmp & "100"; + constant aluCpx : aluMode := aluModeInp & aluModeCmp & "010"; + constant aluCpy : aluMode := aluModeInp & aluModeCmp & "001"; + constant aluAdc : aluMode := aluModeInp & aluModeAdc & "---"; + constant aluSbc : aluMode := aluModeInp & aluModeSbc & "---"; + constant aluAnd : aluMode := aluModeInp & aluModeAnd & "---"; + constant aluOra : aluMode := aluModeInp & aluModeOra & "---"; + constant aluEor : aluMode := aluModeInp & aluModeEor & "---"; + + constant aluSlo : aluMode := aluModeAsl & aluModeOra & "---"; + constant aluSre : aluMode := aluModeLsr & aluModeEor & "---"; + constant aluRra : aluMode := aluModeRor & aluModeAdc & "---"; + constant aluRla : aluMode := aluModeRol & aluModeAnd & "---"; + constant aluDcp : aluMode := aluModeDec & aluModeCmp & "100"; + constant aluIsc : aluMode := aluModeInc & aluModeSbc & "---"; + constant aluAnc : aluMode := aluModeAnc & aluModeAnd & "---"; + constant aluArr : aluMode := aluModeRor & aluModeArr & "---"; + constant aluSbx : aluMode := aluModeInp & aluModeCmp & "110"; + + constant aluXXX : aluMode := (others => '-'); + + + -- Stack operations. Push/Pop/None + constant stackInc : unsigned(0 to 0) := "0"; + constant stackDec : unsigned(0 to 0) := "1"; + constant stackXXX : unsigned(0 to 0) := "-"; + + subtype decodedBitsDef is unsigned(0 to 43); + type opcodeInfoTableDef is array(0 to 255) of decodedBitsDef; + constant opcodeInfoTable : opcodeInfoTableDef := ( + -- +------- Update register A + -- |+------ Update register X + -- ||+----- Update register Y + -- |||+---- Update register S + -- |||| +-- Update Flags + -- |||| | + -- |||| _|__ + -- |||| / \ + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "000100" & brk & aluInXXX & aluP, -- 00 BRK + "1000" & "100010" & readIndX & aluInT & aluOra, -- 01 ORA (zp,x) + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 02 *** JAM *** + "1000" & "100011" & rmwIndX & aluInT & aluSlo, -- 03 iSLO (zp,x) + "0000" & "000000" & readZp & aluInXXX & aluXXX, -- 04 iNOP zp + "1000" & "100010" & readZp & aluInT & aluOra, -- 05 ORA zp + "0000" & "100011" & rmwZp & aluInT & aluAsl, -- 06 ASL zp + "1000" & "100011" & rmwZp & aluInT & aluSlo, -- 07 iSLO zp + "0000" & "000000" & push & aluInXXX & aluP, -- 08 PHP + "1000" & "100010" & immediate & aluInT & aluOra, -- 09 ORA imm + "1000" & "100011" & implied & aluInA & aluAsl, -- 0A ASL accu + "1000" & "100011" & immediate & aluInT & aluAnc, -- 0B iANC imm + "0000" & "000000" & readAbs & aluInXXX & aluXXX, -- 0C iNOP abs + "1000" & "100010" & readAbs & aluInT & aluOra, -- 0D ORA abs + "0000" & "100011" & rmwAbs & aluInT & aluAsl, -- 0E ASL abs + "1000" & "100011" & rmwAbs & aluInT & aluSlo, -- 0F iSLO abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 10 BPL + "1000" & "100010" & readIndY & aluInT & aluOra, -- 11 ORA (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 12 *** JAM *** + "1000" & "100011" & rmwIndY & aluInT & aluSlo, -- 13 iSLO (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- 14 iNOP zp,x + "1000" & "100010" & readZpX & aluInT & aluOra, -- 15 ORA zp,x + "0000" & "100011" & rmwZpX & aluInT & aluAsl, -- 16 ASL zp,x + "1000" & "100011" & rmwZpX & aluInT & aluSlo, -- 17 iSLO zp,x + "0000" & "000001" & implied & aluInClr & aluFlg, -- 18 CLC + "1000" & "100010" & readAbsY & aluInT & aluOra, -- 19 ORA abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- 1A iNOP implied + "1000" & "100011" & rmwAbsY & aluInT & aluSlo, -- 1B iSLO abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- 1C iNOP abs,x + "1000" & "100010" & readAbsX & aluInT & aluOra, -- 1D ORA abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluAsl, -- 1E ASL abs,x + "1000" & "100011" & rmwAbsX & aluInT & aluSlo, -- 1F iSLO abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "000000" & jsr & aluInXXX & aluXXX, -- 20 JSR + "1000" & "100010" & readIndX & aluInT & aluAnd, -- 21 AND (zp,x) + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 22 *** JAM *** + "1000" & "100011" & rmwIndX & aluInT & aluRla, -- 23 iRLA (zp,x) + "0000" & "110010" & readZp & aluInT & aluBit, -- 24 BIT zp + "1000" & "100010" & readZp & aluInT & aluAnd, -- 25 AND zp + "0000" & "100011" & rmwZp & aluInT & aluRol, -- 26 ROL zp + "1000" & "100011" & rmwZp & aluInT & aluRla, -- 27 iRLA zp + "0000" & "111111" & pop & aluInT & aluFlg, -- 28 PLP + "1000" & "100010" & immediate & aluInT & aluAnd, -- 29 AND imm + "1000" & "100011" & implied & aluInA & aluRol, -- 2A ROL accu + "1000" & "100011" & immediate & aluInT & aluAnc, -- 2B iANC imm + "0000" & "110010" & readAbs & aluInT & aluBit, -- 2C BIT abs + "1000" & "100010" & readAbs & aluInT & aluAnd, -- 2D AND abs + "0000" & "100011" & rmwAbs & aluInT & aluRol, -- 2E ROL abs + "1000" & "100011" & rmwAbs & aluInT & aluRla, -- 2F iRLA abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 30 BMI + "1000" & "100010" & readIndY & aluInT & aluAnd, -- 31 AND (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 32 *** JAM *** + "1000" & "100011" & rmwIndY & aluInT & aluRla, -- 33 iRLA (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- 34 iNOP zp,x + "1000" & "100010" & readZpX & aluInT & aluAnd, -- 35 AND zp,x + "0000" & "100011" & rmwZpX & aluInT & aluRol, -- 36 ROL zp,x + "1000" & "100011" & rmwZpX & aluInT & aluRla, -- 37 iRLA zp,x + "0000" & "000001" & implied & aluInSet & aluFlg, -- 38 SEC + "1000" & "100010" & readAbsY & aluInT & aluAnd, -- 39 AND abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- 3A iNOP implied + "1000" & "100011" & rmwAbsY & aluInT & aluRla, -- 3B iRLA abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- 3C iNOP abs,x + "1000" & "100010" & readAbsX & aluInT & aluAnd, -- 3D AND abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluRol, -- 3E ROL abs,x + "1000" & "100011" & rmwAbsX & aluInT & aluRla, -- 3F iRLA abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "111111" & rti & aluInT & aluFlg, -- 40 RTI + "1000" & "100010" & readIndX & aluInT & aluEor, -- 41 EOR (zp,x) + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 42 *** JAM *** + "1000" & "100011" & rmwIndX & aluInT & aluSre, -- 43 iSRE (zp,x) + "0000" & "000000" & readZp & aluInXXX & aluXXX, -- 44 iNOP zp + "1000" & "100010" & readZp & aluInT & aluEor, -- 45 EOR zp + "0000" & "100011" & rmwZp & aluInT & aluLsr, -- 46 LSR zp + "1000" & "100011" & rmwZp & aluInT & aluSre, -- 47 iSRE zp + "0000" & "000000" & push & aluInA & aluInp, -- 48 PHA + "1000" & "100010" & immediate & aluInT & aluEor, -- 49 EOR imm + "1000" & "100011" & implied & aluInA & aluLsr, -- 4A LSR accu + "1000" & "100011" & immediate & aluInAT & aluLsr, -- 4B iALR imm + "0000" & "000000" & jumpAbs & aluInXXX & aluXXX, -- 4C JMP abs + "1000" & "100010" & readAbs & aluInT & aluEor, -- 4D EOR abs + "0000" & "100011" & rmwAbs & aluInT & aluLsr, -- 4E LSR abs + "1000" & "100011" & rmwAbs & aluInT & aluSre, -- 4F iSRE abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 50 BVC + "1000" & "100010" & readIndY & aluInT & aluEor, -- 51 EOR (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 52 *** JAM *** + "1000" & "100011" & rmwIndY & aluInT & aluSre, -- 53 iSRE (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- 54 iNOP zp,x + "1000" & "100010" & readZpX & aluInT & aluEor, -- 55 EOR zp,x + "0000" & "100011" & rmwZpX & aluInT & aluLsr, -- 56 LSR zp,x + "1000" & "100011" & rmwZpX & aluInT & aluSre, -- 57 SRE zp,x + "0000" & "000100" & implied & aluInClr & aluXXX, -- 58 CLI + "1000" & "100010" & readAbsY & aluInT & aluEor, -- 59 EOR abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- 5A iNOP implied + "1000" & "100011" & rmwAbsY & aluInT & aluSre, -- 5B iSRE abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- 5C iNOP abs,x + "1000" & "100010" & readAbsX & aluInT & aluEor, -- 5D EOR abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluLsr, -- 5E LSR abs,x + "1000" & "100011" & rmwAbsX & aluInT & aluSre, -- 5F SRE abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "000000" & rts & aluInXXX & aluXXX, -- 60 RTS + "1000" & "110011" & readIndX & aluInT & aluAdc, -- 61 ADC (zp,x) + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 62 *** JAM *** + "1000" & "110011" & rmwIndX & aluInT & aluRra, -- 63 iRRA (zp,x) + "0000" & "000000" & readZp & aluInXXX & aluXXX, -- 64 iNOP zp + "1000" & "110011" & readZp & aluInT & aluAdc, -- 65 ADC zp + "0000" & "100011" & rmwZp & aluInT & aluRor, -- 66 ROR zp + "1000" & "110011" & rmwZp & aluInT & aluRra, -- 67 iRRA zp + "1000" & "100010" & pop & aluInT & aluInp, -- 68 PLA + "1000" & "110011" & immediate & aluInT & aluAdc, -- 69 ADC imm + "1000" & "100011" & implied & aluInA & aluRor, -- 6A ROR accu + "1000" & "110011" & immediate & aluInAT & aluArr, -- 6B iARR imm + "0000" & "000000" & jumpInd & aluInXXX & aluXXX, -- 6C JMP indirect + "1000" & "110011" & readAbs & aluInT & aluAdc, -- 6D ADC abs + "0000" & "100011" & rmwAbs & aluInT & aluRor, -- 6E ROR abs + "1000" & "110011" & rmwAbs & aluInT & aluRra, -- 6F iRRA abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 70 BVS + "1000" & "110011" & readIndY & aluInT & aluAdc, -- 71 ADC (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 72 *** JAM *** + "1000" & "110011" & rmwIndY & aluInT & aluRra, -- 73 iRRA (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- 74 iNOP zp,x + "1000" & "110011" & readZpX & aluInT & aluAdc, -- 75 ADC zp,x + "0000" & "100011" & rmwZpX & aluInT & aluRor, -- 76 ROR zp,x + "1000" & "110011" & rmwZpX & aluInT & aluRra, -- 77 iRRA zp,x + "0000" & "000100" & implied & aluInSet & aluXXX, -- 78 SEI + "1000" & "110011" & readAbsY & aluInT & aluAdc, -- 79 ADC abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- 7A iNOP implied + "1000" & "110011" & rmwAbsY & aluInT & aluRra, -- 7B iRRA abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- 7C iNOP abs,x + "1000" & "110011" & readAbsX & aluInT & aluAdc, -- 7D ADC abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluRor, -- 7E ROR abs,x + "1000" & "110011" & rmwAbsX & aluInT & aluRra, -- 7F iRRA abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- 80 iNOP imm + "0000" & "000000" & writeIndX & aluInA & aluInp, -- 81 STA (zp,x) + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- 82 iNOP imm + "0000" & "000000" & writeIndX & aluInAX & aluInp, -- 83 iSAX (zp,x) + "0000" & "000000" & writeZp & aluInY & aluInp, -- 84 STY zp + "0000" & "000000" & writeZp & aluInA & aluInp, -- 85 STA zp + "0000" & "000000" & writeZp & aluInX & aluInp, -- 86 STX zp + "0000" & "000000" & writeZp & aluInAX & aluInp, -- 87 iSAX zp + "0010" & "100010" & implied & aluInY & aluDec, -- 88 DEY + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- 84 iNOP imm + "1000" & "100010" & implied & aluInX & aluInp, -- 8A TXA + "1000" & "100010" & immediate & aluInEXT & aluInp, -- 8B iANE imm + "0000" & "000000" & writeAbs & aluInY & aluInp, -- 8C STY abs + "0000" & "000000" & writeAbs & aluInA & aluInp, -- 8D STA abs + "0000" & "000000" & writeAbs & aluInX & aluInp, -- 8E STX abs + "0000" & "000000" & writeAbs & aluInAX & aluInp, -- 8F iSAX abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- 90 BCC + "0000" & "000000" & writeIndY & aluInA & aluInp, -- 91 STA (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- 92 *** JAM *** + "0000" & "000000" & writeIndY & aluInAXH & aluInp, -- 93 iAHX (zp),y + "0000" & "000000" & writeZpX & aluInY & aluInp, -- 94 STY zp,x + "0000" & "000000" & writeZpX & aluInA & aluInp, -- 95 STA zp,x + "0000" & "000000" & writeZpY & aluInX & aluInp, -- 96 STX zp,y + "0000" & "000000" & writeZpY & aluInAX & aluInp, -- 97 iSAX zp,y + "1000" & "100010" & implied & aluInY & aluInp, -- 98 TYA + "0000" & "000000" & writeAbsY & aluInA & aluInp, -- 99 STA abs,y + "0001" & "000000" & implied & aluInX & aluInp, -- 9A TXS + "0001" & "000000" & writeAbsY & aluInAXH & aluInp, -- 9B iSHS abs,y + "0000" & "000000" & writeAbsX & aluInYH & aluInp, -- 9C iSHY abs,x + "0000" & "000000" & writeAbsX & aluInA & aluInp, -- 9D STA abs,x + "0000" & "000000" & writeAbsY & aluInXH & aluInp, -- 9E iSHX abs,y + "0000" & "000000" & writeAbsY & aluInAXH & aluInp, -- 9F iAHX abs,y + -- AXYS NVDIZC addressing aluInput aluMode + "0010" & "100010" & immediate & aluInT & aluInp, -- A0 LDY imm + "1000" & "100010" & readIndX & aluInT & aluInp, -- A1 LDA (zp,x) + "0100" & "100010" & immediate & aluInT & aluInp, -- A2 LDX imm + "1100" & "100010" & readIndX & aluInT & aluInp, -- A3 LAX (zp,x) + "0010" & "100010" & readZp & aluInT & aluInp, -- A4 LDY zp + "1000" & "100010" & readZp & aluInT & aluInp, -- A5 LDA zp + "0100" & "100010" & readZp & aluInT & aluInp, -- A6 LDX zp + "1100" & "100010" & readZp & aluInT & aluInp, -- A7 iLAX zp + "0010" & "100010" & implied & aluInA & aluInp, -- A8 TAY + "1000" & "100010" & immediate & aluInT & aluInp, -- A9 LDA imm + "0100" & "100010" & implied & aluInA & aluInp, -- AA TAX + "1100" & "100010" & immediate & aluInET & aluInp, -- AB iLXA imm + "0010" & "100010" & readAbs & aluInT & aluInp, -- AC LDY abs + "1000" & "100010" & readAbs & aluInT & aluInp, -- AD LDA abs + "0100" & "100010" & readAbs & aluInT & aluInp, -- AE LDX abs + "1100" & "100010" & readAbs & aluInT & aluInp, -- AF iLAX abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- B0 BCS + "1000" & "100010" & readIndY & aluInT & aluInp, -- B1 LDA (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- B2 *** JAM *** + "1100" & "100010" & readIndY & aluInT & aluInp, -- B3 iLAX (zp),y + "0010" & "100010" & readZpX & aluInT & aluInp, -- B4 LDY zp,x + "1000" & "100010" & readZpX & aluInT & aluInp, -- B5 LDA zp,x + "0100" & "100010" & readZpY & aluInT & aluInp, -- B6 LDX zp,y + "1100" & "100010" & readZpY & aluInT & aluInp, -- B7 iLAX zp,y + "0000" & "010000" & implied & aluInClr & aluFlg, -- B8 CLV + "1000" & "100010" & readAbsY & aluInT & aluInp, -- B9 LDA abs,y + "0100" & "100010" & implied & aluInS & aluInp, -- BA TSX + "1101" & "100010" & readAbsY & aluInST & aluInp, -- BB iLAS abs,y + "0010" & "100010" & readAbsX & aluInT & aluInp, -- BC LDY abs,x + "1000" & "100010" & readAbsX & aluInT & aluInp, -- BD LDA abs,x + "0100" & "100010" & readAbsY & aluInT & aluInp, -- BE LDX abs,y + "1100" & "100010" & readAbsY & aluInT & aluInp, -- BF iLAX abs,y + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "100011" & immediate & aluInT & aluCpy, -- C0 CPY imm + "0000" & "100011" & readIndX & aluInT & aluCmp, -- C1 CMP (zp,x) + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- C2 iNOP imm + "0000" & "100011" & rmwIndX & aluInT & aluDcp, -- C3 iDCP (zp,x) + "0000" & "100011" & readZp & aluInT & aluCpy, -- C4 CPY zp + "0000" & "100011" & readZp & aluInT & aluCmp, -- C5 CMP zp + "0000" & "100010" & rmwZp & aluInT & aluDec, -- C6 DEC zp + "0000" & "100011" & rmwZp & aluInT & aluDcp, -- C7 iDCP zp + "0010" & "100010" & implied & aluInY & aluInc, -- C8 INY + "0000" & "100011" & immediate & aluInT & aluCmp, -- C9 CMP imm + "0100" & "100010" & implied & aluInX & aluDec, -- CA DEX + "0100" & "100011" & immediate & aluInT & aluSbx, -- CB SBX imm + "0000" & "100011" & readAbs & aluInT & aluCpy, -- CC CPY abs + "0000" & "100011" & readAbs & aluInT & aluCmp, -- CD CMP abs + "0000" & "100010" & rmwAbs & aluInT & aluDec, -- CE DEC abs + "0000" & "100011" & rmwAbs & aluInT & aluDcp, -- CF iDCP abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- D0 BNE + "0000" & "100011" & readIndY & aluInT & aluCmp, -- D1 CMP (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- D2 *** JAM *** + "0000" & "100011" & rmwIndY & aluInT & aluDcp, -- D3 iDCP (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- D4 iNOP zp,x + "0000" & "100011" & readZpX & aluInT & aluCmp, -- D5 CMP zp,x + "0000" & "100010" & rmwZpX & aluInT & aluDec, -- D6 DEC zp,x + "0000" & "100011" & rmwZpX & aluInT & aluDcp, -- D7 iDCP zp,x + "0000" & "001000" & implied & aluInClr & aluXXX, -- D8 CLD + "0000" & "100011" & readAbsY & aluInT & aluCmp, -- D9 CMP abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- DA iNOP implied + "0000" & "100011" & rmwAbsY & aluInT & aluDcp, -- DB iDCP abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- DC iNOP abs,x + "0000" & "100011" & readAbsX & aluInT & aluCmp, -- DD CMP abs,x + "0000" & "100010" & rmwAbsX & aluInT & aluDec, -- DE DEC abs,x + "0000" & "100011" & rmwAbsX & aluInT & aluDcp, -- DF iDCP abs,x + -- AXYS NVDIZC addressing aluInput aluMode + "0000" & "100011" & immediate & aluInT & aluCpx, -- E0 CPX imm + "1000" & "110011" & readIndX & aluInT & aluSbc, -- E1 SBC (zp,x) + "0000" & "000000" & immediate & aluInXXX & aluXXX, -- E2 iNOP imm + "1000" & "110011" & rmwIndX & aluInT & aluIsc, -- E3 iISC (zp,x) + "0000" & "100011" & readZp & aluInT & aluCpx, -- E4 CPX zp + "1000" & "110011" & readZp & aluInT & aluSbc, -- E5 SBC zp + "0000" & "100010" & rmwZp & aluInT & aluInc, -- E6 INC zp + "1000" & "110011" & rmwZp & aluInT & aluIsc, -- E7 iISC zp + "0100" & "100010" & implied & aluInX & aluInc, -- E8 INX + "1000" & "110011" & immediate & aluInT & aluSbc, -- E9 SBC imm + "0000" & "000000" & implied & aluInXXX & aluXXX, -- EA NOP + "1000" & "110011" & immediate & aluInT & aluSbc, -- EB SBC imm (illegal opc) + "0000" & "100011" & readAbs & aluInT & aluCpx, -- EC CPX abs + "1000" & "110011" & readAbs & aluInT & aluSbc, -- ED SBC abs + "0000" & "100010" & rmwAbs & aluInT & aluInc, -- EE INC abs + "1000" & "110011" & rmwAbs & aluInT & aluIsc, -- EF iISC abs + "0000" & "000000" & relative & aluInXXX & aluXXX, -- F0 BEQ + "1000" & "110011" & readIndY & aluInT & aluSbc, -- F1 SBC (zp),y + "----" & "------" & xxxxxxxx & aluInXXX & aluXXX, -- F2 *** JAM *** + "1000" & "110011" & rmwIndY & aluInT & aluIsc, -- F3 iISC (zp),y + "0000" & "000000" & readZpX & aluInXXX & aluXXX, -- F4 iNOP zp,x + "1000" & "110011" & readZpX & aluInT & aluSbc, -- F5 SBC zp,x + "0000" & "100010" & rmwZpX & aluInT & aluInc, -- F6 INC zp,x + "1000" & "110011" & rmwZpX & aluInT & aluIsc, -- F7 iISC zp,x + "0000" & "001000" & implied & aluInSet & aluXXX, -- F8 SED + "1000" & "110011" & readAbsY & aluInT & aluSbc, -- F9 SBC abs,y + "0000" & "000000" & implied & aluInXXX & aluXXX, -- FA iNOP implied + "1000" & "110011" & rmwAbsY & aluInT & aluIsc, -- FB iISC abs,y + "0000" & "000000" & readAbsX & aluInXXX & aluXXX, -- FC iNOP abs,x + "1000" & "110011" & readAbsX & aluInT & aluSbc, -- FD SBC abs,x + "0000" & "100010" & rmwAbsX & aluInT & aluInc, -- FE INC abs,x + "1000" & "110011" & rmwAbsX & aluInT & aluIsc -- FF iISC abs,x + ); + signal opcInfo : decodedBitsDef; + signal nextOpcInfo : decodedBitsDef; -- Next opcode (decoded) + signal nextOpcInfoReg : decodedBitsDef; -- Next opcode (decoded) pipelined + signal theOpcode : unsigned(7 downto 0); + signal nextOpcode : unsigned(7 downto 0); + +-- Program counter + signal PC : unsigned(15 downto 0); -- Program counter + +-- Address generation + type nextAddrDef is ( + nextAddrHold, + nextAddrIncr, + nextAddrIncrL, -- Increment low bits only (zeropage accesses) + nextAddrIncrH, -- Increment high bits only (page-boundary) + nextAddrDecrH, -- Decrement high bits (branch backwards) + nextAddrPc, + nextAddrIrq, + nextAddrReset, + nextAddrAbs, + nextAddrAbsIndexed, + nextAddrZeroPage, + nextAddrZPIndexed, + nextAddrStack, + nextAddrRelative + ); + signal nextAddr : nextAddrDef; + signal myAddr : unsigned(15 downto 0); + signal myAddrIncr : unsigned(15 downto 0); + signal myAddrIncrH : unsigned(7 downto 0); + signal myAddrDecrH : unsigned(7 downto 0); + signal theWe : std_logic; + + signal irqActive : std_logic; + +-- Output register + signal doReg : unsigned(7 downto 0); + +-- Buffer register + signal T : unsigned(7 downto 0); + +-- General registers + signal A: unsigned(7 downto 0); -- Accumulator + signal X: unsigned(7 downto 0); -- Index X + signal Y: unsigned(7 downto 0); -- Index Y + signal S: unsigned(7 downto 0); -- stack pointer + +-- Status register + signal C: std_logic; -- Carry + signal Z: std_logic; -- Zero flag + signal I: std_logic; -- Interrupt flag + signal D: std_logic; -- Decimal mode + signal V: std_logic; -- Overflow + signal N: std_logic; -- Negative + +-- ALU + -- ALU input + signal aluInput : unsigned(7 downto 0); + signal aluCmpInput : unsigned(7 downto 0); + -- ALU output + signal aluRegisterOut : unsigned(7 downto 0); + signal aluRmwOut : unsigned(7 downto 0); + signal aluC : std_logic; + signal aluZ : std_logic; + signal aluV : std_logic; + signal aluN : std_logic; + -- Pipeline registers + signal aluInputReg : unsigned(7 downto 0); + signal aluCmpInputReg : unsigned(7 downto 0); + signal aluRmwReg : unsigned(7 downto 0); + signal aluNineReg : unsigned(7 downto 0); + signal aluCReg : std_logic; + signal aluZReg : std_logic; + signal aluVReg : std_logic; + signal aluNReg : std_logic; + +-- Indexing + signal indexOut : unsigned(8 downto 0); + +begin +processAluInput: process(clk, opcInfo, A, X, Y, T, S) + variable temp : unsigned(7 downto 0); + begin + temp := (others => '1'); + if opcInfo(opcInA) = '1' then + temp := temp and A; + end if; + if opcInfo(opcInE) = '1' then + temp := temp and (A or X"EE"); + end if; + if opcInfo(opcInX) = '1' then + temp := temp and X; + end if; + if opcInfo(opcInY) = '1' then + temp := temp and Y; + end if; + if opcInfo(opcInS) = '1' then + temp := temp and S; + end if; + if opcInfo(opcInT) = '1' then + temp := temp and T; + end if; + if opcInfo(opcInClear) = '1' then + temp := (others => '0'); + end if; + if rising_edge(clk) then + aluInputReg <= temp; + end if; + + aluInput <= temp; + if pipelineAluMux then + aluInput <= aluInputReg; + end if; + end process; + +processCmpInput: process(clk, opcInfo, A, X, Y) + variable temp : unsigned(7 downto 0); + begin + temp := (others => '1'); + if opcInfo(opcInCmp) = '1' then + temp := temp and A; + end if; + if opcInfo(opcInCpx) = '1' then + temp := temp and X; + end if; + if opcInfo(opcInCpy) = '1' then + temp := temp and Y; + end if; + if rising_edge(clk) then + aluCmpInputReg <= temp; + end if; + + aluCmpInput <= temp; + if pipelineAluMux then + aluCmpInput <= aluCmpInputReg; + end if; + end process; + + -- ALU consists of two parts + -- Read-Modify-Write or index instructions: INC/DEC/ASL/LSR/ROR/ROL + -- Accumulator instructions: ADC, SBC, EOR, AND, EOR, ORA + -- Some instructions are both RMW and accumulator so for most + -- instructions the rmw results are routed through accu alu too. +processAlu: process(clk, opcInfo, aluInput, aluCmpInput, A, T, irqActive, N, V, D, I, Z, C) + variable lowBits: unsigned(5 downto 0); + variable nineBits: unsigned(8 downto 0); + variable rmwBits: unsigned(8 downto 0); + + variable varC : std_logic; + variable varZ : std_logic; + variable varV : std_logic; + variable varN : std_logic; + begin + lowBits := (others => '-'); + nineBits := (others => '-'); + rmwBits := (others => '-'); + varV := aluInput(6); -- Default for BIT / PLP / RTI + + -- Shift unit + case opcInfo(aluMode1From to aluMode1To) is + when aluModeInp => + rmwBits := C & aluInput; + when aluModeP => + rmwBits := C & N & V & '1' & (not irqActive) & D & I & Z & C; + when aluModeInc => + rmwBits := C & (aluInput + 1); + when aluModeDec => + rmwBits := C & (aluInput - 1); + when aluModeAsl => + rmwBits := aluInput & "0"; + when aluModeFlg => + rmwBits := aluInput(0) & aluInput; + when aluModeLsr => + rmwBits := aluInput(0) & "0" & aluInput(7 downto 1); + when aluModeRol => + rmwBits := aluInput & C; + when aluModeRoR => + rmwBits := aluInput(0) & C & aluInput(7 downto 1); + when aluModeAnc => + rmwBits := (aluInput(7) and A(7)) & aluInput; + when others => + rmwBits := C & aluInput; + end case; + + -- ALU + case opcInfo(aluMode2From to aluMode2To) is + when aluModeAdc => + lowBits := ("0" & A(3 downto 0) & rmwBits(8)) + ("0" & rmwBits(3 downto 0) & "1"); + ninebits := ("0" & A) + ("0" & rmwBits(7 downto 0)) + (B"00000000" & rmwBits(8)); + when aluModeSbc => + lowBits := ("0" & A(3 downto 0) & rmwBits(8)) + ("0" & (not rmwBits(3 downto 0)) & "1"); + ninebits := ("0" & A) + ("0" & (not rmwBits(7 downto 0))) + (B"00000000" & rmwBits(8)); + when aluModeCmp => + ninebits := ("0" & aluCmpInput) + ("0" & (not rmwBits(7 downto 0))) + "000000001"; + when aluModeAnd => + ninebits := rmwBits(8) & (A and rmwBits(7 downto 0)); + when aluModeEor => + ninebits := rmwBits(8) & (A xor rmwBits(7 downto 0)); + when aluModeOra => + ninebits := rmwBits(8) & (A or rmwBits(7 downto 0)); + when others => + ninebits := rmwBits; + end case; + + if (opcInfo(aluMode1From to aluMode1To) = aluModeFlg) then + varZ := rmwBits(1); + elsif ninebits(7 downto 0) = X"00" then + varZ := '1'; + else + varZ := '0'; + end if; + + case opcInfo(aluMode2From to aluMode2To) is + when aluModeAdc => + -- decimal mode low bits correction, is done after setting Z flag. + if D = '1' then + if lowBits(5 downto 1) > 9 then + ninebits(3 downto 0) := ninebits(3 downto 0) + 6; + if lowBits(5) = '0' then + ninebits(8 downto 4) := ninebits(8 downto 4) + 1; + end if; + end if; + end if; + when others => + null; + end case; + + if (opcInfo(aluMode1From to aluMode1To) = aluModeBit) + or (opcInfo(aluMode1From to aluMode1To) = aluModeFlg) then + varN := rmwBits(7); + else + varN := nineBits(7); + end if; + varC := ninebits(8); + if opcInfo(aluMode2From to aluMode2To) = aluModeArr then + varC := aluInput(7); + varV := aluInput(7) xor aluInput(6); + end if; + + case opcInfo(aluMode2From to aluMode2To) is + when aluModeAdc => + -- decimal mode high bits correction, is done after setting Z and N flags + varV := (A(7) xor ninebits(7)) and (rmwBits(7) xor ninebits(7)); + if D = '1' then + if ninebits(8 downto 4) > 9 then + ninebits(8 downto 4) := ninebits(8 downto 4) + 6; + varC := '1'; + end if; + end if; + when aluModeSbc => + varV := (A(7) xor ninebits(7)) and ((not rmwBits(7)) xor ninebits(7)); + if D = '1' then + -- Check for borrow (lower 4 bits) + if lowBits(5) = '0' then + ninebits(3 downto 0) := ninebits(3 downto 0) - 6; + end if; + -- Check for borrow (upper 4 bits) + if ninebits(8) = '0' then + ninebits(8 downto 4) := ninebits(8 downto 4) - 6; + end if; + end if; + when aluModeArr => + if D = '1' then + if (("0" & aluInput(3 downto 0)) + ("0000" & aluInput(0))) > 5 then + ninebits(3 downto 0) := ninebits(3 downto 0) + 6; + end if; + if (("0" & aluInput(7 downto 4)) + ("0000" & aluInput(4))) > 5 then + ninebits(8 downto 4) := ninebits(8 downto 4) + 6; + varC := '1'; + else + varC := '0'; + end if; + end if; + when others => + null; + end case; + + if rising_edge(clk) then + aluRmwReg <= rmwBits(7 downto 0); + aluNineReg <= ninebits(7 downto 0); + aluCReg <= varC; + aluZReg <= varZ; + aluVReg <= varV; + aluNReg <= varN; + end if; + + aluRmwOut <= rmwBits(7 downto 0); + aluRegisterOut <= ninebits(7 downto 0); + aluC <= varC; + aluZ <= varZ; + aluV <= varV; + aluN <= varN; + if pipelineAluOut then + aluRmwOut <= aluRmwReg; + aluRegisterOut <= aluNineReg; + aluC <= aluCReg; + aluZ <= aluZReg; + aluV <= aluVReg; + aluN <= aluNReg; + end if; + end process; + +calcInterrupt: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + if theCpuCycle = cycleStack4 + or reset = '1' then + nmiReg <= '1'; + end if; + + if nextCpuCycle /= cycleBranchTaken + and nextCpuCycle /= opcodeFetch then + irqReg <= irq_n; + nmiEdge <= nmi_n; + if (nmiEdge = '1') and (nmi_n = '0') then + nmiReg <= '0'; + end if; + end if; + -- The 'or opcInfo(opcSetI)' prevents NMI immediately after BRK or IRQ. + -- Presumably this is done in the real 6502/6510 to prevent a double IRQ. + processIrq <= not ((nmiReg and (irqReg or I)) or opcInfo(opcIRQ)); + end if; + end if; + end process; + +calcNextOpcode: process(clk, di, reset, processIrq) + variable myNextOpcode : unsigned(7 downto 0); + begin + -- Next opcode is read from input unless a reset or IRQ is pending. + myNextOpcode := di; + if reset = '1' then + myNextOpcode := X"4C"; + elsif processIrq = '1' then + myNextOpcode := X"00"; + end if; + + nextOpcode <= myNextOpcode; + end process; + + nextOpcInfo <= opcodeInfoTable(to_integer(nextOpcode)); + process(clk) + begin + if rising_edge(clk) then + nextOpcInfoReg <= nextOpcInfo; + end if; + end process; + + -- Read bits and flags from opcodeInfoTable and store in opcInfo. + -- This info is used to control the execution of the opcode. +calcOpcInfo: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + if (reset = '1') or (theCpuCycle = opcodeFetch) then + opcInfo <= nextOpcInfo; + if pipelineOpcode then + opcInfo <= nextOpcInfoReg; + end if; + end if; + end if; + end if; + end process; + +calcTheOpcode: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + if theCpuCycle = opcodeFetch then + irqActive <= '0'; + if processIrq = '1' then + irqActive <= '1'; + end if; + -- Fetch opcode + theOpcode <= nextOpcode; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- State machine +-- ----------------------------------------------------------------------- + process(enable, theCpuCycle, opcInfo) + begin + updateRegisters <= false; + if enable = '1' then + if opcInfo(opcRti) = '1' then + if theCpuCycle = cycleRead then + updateRegisters <= true; + end if; + elsif theCpuCycle = opcodeFetch then + updateRegisters <= true; + end if; + end if; + end process; + + debugOpcode <= theOpcode; + process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + theCpuCycle <= nextCpuCycle; + end if; + if reset = '1' then + theCpuCycle <= cycle2; + end if; + end if; + end process; + + -- Determine the next cpu cycle. After the last cycle we always + -- go to opcodeFetch to get the next opcode. +calcNextCpuCycle: process(theCpuCycle, opcInfo, theOpcode, indexOut, T, N, V, C, Z) + begin + nextCpuCycle <= opcodeFetch; + + case theCpuCycle is + when opcodeFetch => + nextCpuCycle <= cycle2; + when cycle2 => + if opcInfo(opcBranch) = '1' then + if (N = theOpcode(5) and theOpcode(7 downto 6) = "00") + or (V = theOpcode(5) and theOpcode(7 downto 6) = "01") + or (C = theOpcode(5) and theOpcode(7 downto 6) = "10") + or (Z = theOpcode(5) and theOpcode(7 downto 6) = "11") then + -- Branch condition is true + nextCpuCycle <= cycleBranchTaken; + end if; + elsif (opcInfo(opcStackUp) = '1') then + nextCpuCycle <= cycleStack1; + elsif opcInfo(opcStackAddr) = '1' + and opcInfo(opcStackData) = '1' then + nextCpuCycle <= cycleStack2; + elsif opcInfo(opcStackAddr) = '1' then + nextCpuCycle <= cycleStack1; + elsif opcInfo(opcStackData) = '1' then + nextCpuCycle <= cycleWrite; + elsif opcInfo(opcAbsolute) = '1' then + nextCpuCycle <= cycle3; + elsif opcInfo(opcIndirect) = '1' then + if opcInfo(indexX) = '1' then + nextCpuCycle <= cyclePreIndirect; + else + nextCpuCycle <= cycleIndirect; + end if; + elsif opcInfo(opcZeroPage) = '1' then + if opcInfo(opcWrite) = '1' then + if (opcInfo(indexX) = '1') + or (opcInfo(indexY) = '1') then + nextCpuCycle <= cyclePreWrite; + else + nextCpuCycle <= cycleWrite; + end if; + else + if (opcInfo(indexX) = '1') + or (opcInfo(indexY) = '1') then + nextCpuCycle <= cyclePreRead; + else + nextCpuCycle <= cycleRead2; + end if; + end if; + elsif opcInfo(opcJump) = '1' then + nextCpuCycle <= cycleJump; + end if; + when cycle3 => + nextCpuCycle <= cycleRead; + if opcInfo(opcWrite) = '1' then + if (opcInfo(indexX) = '1') + or (opcInfo(indexY) = '1') then + nextCpuCycle <= cyclePreWrite; + else + nextCpuCycle <= cycleWrite; + end if; + end if; + if (opcInfo(opcIndirect) = '1') + and (opcInfo(indexX) = '1') then + if opcInfo(opcWrite) = '1' then + nextCpuCycle <= cycleWrite; + else + nextCpuCycle <= cycleRead2; + end if; + end if; + when cyclePreIndirect => + nextCpuCycle <= cycleIndirect; + when cycleIndirect => + nextCpuCycle <= cycle3; + when cycleBranchTaken => + if indexOut(8) /= T(7) then + -- Page boundary crossing during branch. + nextCpuCycle <= cycleBranchPage; + end if; + when cyclePreRead => + if opcInfo(opcZeroPage) = '1' then + nextCpuCycle <= cycleRead2; + end if; + when cycleRead => + if opcInfo(opcJump) = '1' then + nextCpuCycle <= cycleJump; + elsif indexOut(8) = '1' then + -- Page boundary crossing while indexed addressing. + nextCpuCycle <= cycleRead2; + elsif opcInfo(opcRmw) = '1' then + nextCpuCycle <= cycleRmw; + if opcInfo(indexX) = '1' + or opcInfo(indexY) = '1' then + -- 6510 needs extra cycle for indexed addressing + -- combined with RMW indexing + nextCpuCycle <= cycleRead2; + end if; + end if; + when cycleRead2 => + if opcInfo(opcRmw) = '1' then + nextCpuCycle <= cycleRmw; + end if; + when cycleRmw => + nextCpuCycle <= cycleWrite; + when cyclePreWrite => + nextCpuCycle <= cycleWrite; + when cycleStack1 => + nextCpuCycle <= cycleRead; + if opcInfo(opcStackAddr) = '1' then + nextCpuCycle <= cycleStack2; + end if; + when cycleStack2 => + nextCpuCycle <= cycleStack3; + if opcInfo(opcRti) = '1' then + nextCpuCycle <= cycleRead; + end if; + if opcInfo(opcStackData) = '0' + and opcInfo(opcStackUp) = '1' then + nextCpuCycle <= cycleJump; + end if; + when cycleStack3 => + nextCpuCycle <= cycleRead; + if opcInfo(opcStackData) = '0' + or opcInfo(opcStackUp) = '1' then + nextCpuCycle <= cycleJump; + elsif opcInfo(opcStackAddr) = '1' then + nextCpuCycle <= cycleStack4; + end if; + when cycleStack4 => + nextCpuCycle <= cycleRead; + when cycleJump => + if opcInfo(opcIncrAfter) = '1' then + -- Insert extra cycle + nextCpuCycle <= cycleEnd; + end if; + when others => + null; + end case; + end process; + +-- ----------------------------------------------------------------------- +-- T register +-- ----------------------------------------------------------------------- +calcT: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + case theCpuCycle is + when cycle2 => + T <= di; + when cycleStack1 | cycleStack2 => + if opcInfo(opcStackUp) = '1' then + -- Read from stack + T <= di; + end if; + when cycleIndirect | cycleRead | cycleRead2 => + T <= di; + when others => + null; + end case; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- A register +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateA) = '1' then + A <= aluRegisterOut; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- X register +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateX) = '1' then + X <= aluRegisterOut; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Y register +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateY) = '1' then + Y <= aluRegisterOut; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- C flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateC) = '1' then + C <= aluC; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Z flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateZ) = '1' then + Z <= aluZ; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- I flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateI) = '1' then + I <= aluInput(2); + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- D flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateD) = '1' then + D <= aluInput(3); + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- V flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateV) = '1' then + V <= aluV; + end if; + end if; + if enable = '1' then + if soReg = '1' and so_n = '0' then + V <= '1'; + end if; + soReg <= so_n; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- N flag +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if updateRegisters then + if opcInfo(opcUpdateN) = '1' then + N <= aluN; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Stack pointer +-- ----------------------------------------------------------------------- + process(clk) + variable sIncDec : unsigned(7 downto 0); + variable updateFlag : boolean; + begin + if rising_edge(clk) then + + if opcInfo(opcStackUp) = '1' then + sIncDec := S + 1; + else + sIncDec := S - 1; + end if; + + if enable = '1' then + updateFlag := false; + case nextCpuCycle is + when cycleStack1 => + if (opcInfo(opcStackUp) = '1') + or (opcInfo(opcStackData) = '1') then + updateFlag := true; + end if; + when cycleStack2 => + updateFlag := true; + when cycleStack3 => + updateFlag := true; + when cycleStack4 => + updateFlag := true; + when cycleRead => + if opcInfo(opcRti) = '1' then + updateFlag := true; + end if; + when cycleWrite => + if opcInfo(opcStackData) = '1' then + updateFlag := true; + end if; + when others => + null; + end case; + if updateFlag then + S <= sIncDec; + end if; + end if; + if updateRegisters then + if opcInfo(opcUpdateS) = '1' then + S <= aluRegisterOut; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Data out +-- ----------------------------------------------------------------------- +--calcDo: process(cpuNo, theCpuCycle, aluOut, PC, T) +calcDo: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + doReg <= aluRmwOut; + if opcInfo(opcInH) = '1' then + -- For illegal opcodes SHA, SHX, SHY, SHS + doReg <= aluRmwOut and myAddrIncrH; + end if; + + case nextCpuCycle is + when cycleStack2 => + if opcInfo(opcIRQ) = '1' + and irqActive = '0' then + doReg <= myAddrIncr(15 downto 8); + else + doReg <= PC(15 downto 8); + end if; + when cycleStack3 => + doReg <= PC(7 downto 0); + when cycleRmw => +-- do <= T; -- Read-modify-write write old value first. + doReg <= di; -- Read-modify-write write old value first. + when others => null; + end case; + end if; + end if; + end process; + do <= doReg; + + + +-- ----------------------------------------------------------------------- +-- Write enable +-- ----------------------------------------------------------------------- +calcWe: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + theWe <= '0'; + case nextCpuCycle is + when cycleStack1 => + if opcInfo(opcStackUp) = '0' + and ((opcInfo(opcStackAddr) = '0') + or (opcInfo(opcStackData) = '1')) then + theWe <= '1'; + end if; + when cycleStack2 | cycleStack3 | cycleStack4 => + if opcInfo(opcStackUp) = '0' then + theWe <= '1'; + end if; + when cycleRmw => + theWe <= '1'; + when cycleWrite => + theWe <= '1'; + when others => + null; + end case; + end if; + end if; + end process; + we <= theWe; + +-- ----------------------------------------------------------------------- +-- Program counter +-- ----------------------------------------------------------------------- +calcPC: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + case theCpuCycle is + when opcodeFetch => + PC <= myAddr; + when cycle2 => + if irqActive = '0' then + if opcInfo(opcSecondByte) = '1' then + PC <= myAddrIncr; + else + PC <= myAddr; + end if; + end if; + when cycle3 => + if opcInfo(opcAbsolute) = '1' then + PC <= myAddrIncr; + end if; + when others => + null; + end case; + end if; + end if; + end process; + debugPc <= PC; + +-- ----------------------------------------------------------------------- +-- Address generation +-- ----------------------------------------------------------------------- +calcNextAddr: process(theCpuCycle, opcInfo, indexOut, T, reset) + begin + nextAddr <= nextAddrIncr; + case theCpuCycle is + when cycle2 => + if opcInfo(opcStackAddr) = '1' + or opcInfo(opcStackData) = '1' then + nextAddr <= nextAddrStack; + elsif opcInfo(opcAbsolute) = '1' then + nextAddr <= nextAddrIncr; + elsif opcInfo(opcZeroPage) = '1' then + nextAddr <= nextAddrZeroPage; + elsif opcInfo(opcIndirect) = '1' then + nextAddr <= nextAddrZeroPage; + elsif opcInfo(opcSecondByte) = '1' then + nextAddr <= nextAddrIncr; + else + nextAddr <= nextAddrHold; + end if; + when cycle3 => + if (opcInfo(opcIndirect) = '1') + and (opcInfo(indexX) = '1') then + nextAddr <= nextAddrAbs; + else + nextAddr <= nextAddrAbsIndexed; + end if; + when cyclePreIndirect => + nextAddr <= nextAddrZPIndexed; + when cycleIndirect => + nextAddr <= nextAddrIncrL; + when cycleBranchTaken => + nextAddr <= nextAddrRelative; + when cycleBranchPage => + if T(7) = '0' then + nextAddr <= nextAddrIncrH; + else + nextAddr <= nextAddrDecrH; + end if; + when cyclePreRead => + nextAddr <= nextAddrZPIndexed; + when cycleRead => + nextAddr <= nextAddrPc; + if opcInfo(opcJump) = '1' then + -- Emulate 6510 bug, jmp(xxFF) fetches from same page. + -- Replace with nextAddrIncr if emulating 65C02 or later cpu. + nextAddr <= nextAddrIncrL; + elsif indexOut(8) = '1' then + nextAddr <= nextAddrIncrH; + elsif opcInfo(opcRmw) = '1' then + nextAddr <= nextAddrHold; + end if; + when cycleRead2 => + nextAddr <= nextAddrPc; + if opcInfo(opcRmw) = '1' then + nextAddr <= nextAddrHold; + end if; + when cycleRmw => + nextAddr <= nextAddrHold; + when cyclePreWrite => + nextAddr <= nextAddrHold; + if opcInfo(opcZeroPage) = '1' then + nextAddr <= nextAddrZPIndexed; + elsif indexOut(8) = '1' then + nextAddr <= nextAddrIncrH; + end if; + when cycleWrite => + nextAddr <= nextAddrPc; + when cycleStack1 => + nextAddr <= nextAddrStack; + when cycleStack2 => + nextAddr <= nextAddrStack; + when cycleStack3 => + nextAddr <= nextAddrStack; + if opcInfo(opcStackData) = '0' then + nextAddr <= nextAddrPc; + end if; + when cycleStack4 => + nextAddr <= nextAddrIrq; + when cycleJump => + nextAddr <= nextAddrAbs; + when others => + null; + end case; + if reset = '1' then + nextAddr <= nextAddrReset; + end if; + end process; + +indexAlu: process(opcInfo, myAddr, T, X, Y) + begin + if opcInfo(indexX) = '1' then + indexOut <= (B"0" & T) + (B"0" & X); + elsif opcInfo(indexY) = '1' then + indexOut <= (B"0" & T) + (B"0" & Y); + elsif opcInfo(opcBranch) = '1' then + indexOut <= (B"0" & T) + (B"0" & myAddr(7 downto 0)); + else + indexOut <= B"0" & T; + end if; + end process; + +calcAddr: process(clk) + begin + if rising_edge(clk) then + if enable = '1' then + case nextAddr is + when nextAddrIncr => myAddr <= myAddrIncr; + when nextAddrIncrL => myAddr(7 downto 0) <= myAddrIncr(7 downto 0); + when nextAddrIncrH => myAddr(15 downto 8) <= myAddrIncrH; + when nextAddrDecrH => myAddr(15 downto 8) <= myAddrDecrH; + when nextAddrPc => myAddr <= PC; + when nextAddrIrq => + myAddr <= X"FFFE"; + if nmiReg = '0' then + myAddr <= X"FFFA"; + end if; + when nextAddrReset => myAddr <= X"FFFC"; + when nextAddrAbs => myAddr <= di & T; + when nextAddrAbsIndexed => myAddr <= di & indexOut(7 downto 0); + when nextAddrZeroPage => myAddr <= "00000000" & di; + when nextAddrZPIndexed => myAddr <= "00000000" & indexOut(7 downto 0); + when nextAddrStack => myAddr <= "00000001" & S; + when nextAddrRelative => myAddr(7 downto 0) <= indexOut(7 downto 0); + when others => null; + end case; + end if; + end if; + end process; + + myAddrIncr <= myAddr + 1; + myAddrIncrH <= myAddr(15 downto 8) + 1; + myAddrDecrH <= myAddr(15 downto 8) - 1; + + addr <= myAddr; + + debugA <= A; + debugX <= X; + debugY <= Y; + debugS <= S; + +end architecture; + + diff --git a/Commodore MAX/rtl/cpu_6510.vhd b/Commodore MAX/rtl/cpu_6510.vhd new file mode 100644 index 00000000..8ae35705 --- /dev/null +++ b/Commodore MAX/rtl/cpu_6510.vhd @@ -0,0 +1,150 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- 6510 wrapper for 65xx core +-- Adds 8 bit I/O port mapped at addresses $0000 to $0001 +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use ieee.std_logic_1164.ALL; +use ieee.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity cpu_6510 is + generic ( + pipelineOpcode : boolean:= false; + pipelineAluMux : boolean:= false; + pipelineAluOut : boolean:= false + ); + port ( + clk : in std_logic; + enable : in std_logic; + reset : in std_logic; + nmi_n : in std_logic; + nmi_ack : out std_logic; + irq_n : in std_logic; + + CPUdi : in unsigned(7 downto 0); + CPUdo : out unsigned(7 downto 0); + addr : out unsigned(15 downto 0); + we : out std_logic; + + diIO : in unsigned(7 downto 0); + doIO : out unsigned(7 downto 0); + + debugOpcode : out unsigned(7 downto 0); + debugPc : out unsigned(15 downto 0); + debugA : out unsigned(7 downto 0); + debugX : out unsigned(7 downto 0); + debugY : out unsigned(7 downto 0); + debugS : out unsigned(7 downto 0) + ); +end cpu_6510; + +-- ----------------------------------------------------------------------- + +architecture rtl of cpu_6510 is + signal localA : unsigned(15 downto 0); + signal localDi : unsigned(7 downto 0); + signal localDo : unsigned(7 downto 0); + signal localWe : std_logic; + + signal currentIO : unsigned(7 downto 0); + signal ioDir : unsigned(7 downto 0); + signal ioData : unsigned(7 downto 0); + + signal accessIO : std_logic; +begin + cpuInstance: entity work.cpu65xx(fast) + generic map ( + pipelineOpcode => pipelineOpcode, + pipelineAluMux => pipelineAluMux, + pipelineAluOut => pipelineAluOut + ) + port map ( + clk => clk, + enable => enable, + reset => reset, + nmi_n => nmi_n, + nmi_ack => nmi_ack, + irq_n => irq_n, + + di => localDi, + do => localDo, + addr => localA, + we => localWe, + + debugOpcode => debugOpcode, + debugPc => debugPc, + debugA => debugA, + debugX => debugX, + debugY => debugY, + debugS => debugS + ); + + process(localA) + begin + accessIO <= '0'; + if localA(15 downto 1) = 0 then + accessIO <= '1'; + end if; + end process; + + process(CPUdi, localA, ioDir, currentIO, accessIO) + begin + localDi <= CPUdi; + if accessIO = '1' then + if localA(0) = '0' then + localDi <= ioDir; + else + localDi <= currentIO; + end if; + end if; + end process; + + process(clk) + begin + if rising_edge(clk) then + if accessIO = '1' then + if localWe = '1' + and enable = '1' then + if localA(0) = '0' then + ioDir <= localDo; + else + ioData <= localDo; + end if; + end if; + end if; + if reset = '1' then + ioDir <= (others => '0'); + end if; + end if; + end process; + + process(ioDir, ioData, diIO) + begin + for i in 0 to 7 loop + if ioDir(i) = '0' then + currentIO(i) <= diIO(i); + else + currentIO(i) <= ioData(i); + end if; + end loop; + end process; + + -- Cunnect zee wires + addr <= localA; + CPUdo <= localDo; + we <= localWe; + doIO <= currentIO; +end architecture; diff --git a/Commodore MAX/rtl/data_io.v b/Commodore MAX/rtl/data_io.v new file mode 100644 index 00000000..4629033b --- /dev/null +++ b/Commodore MAX/rtl/data_io.v @@ -0,0 +1,126 @@ +// +// data_io.v +// +// io controller writable ram for the MiST board +// http://code.google.com/p/mist-board/ +// +// ZX Spectrum adapted version +// +// Copyright (c) 2015 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 . +// + +module data_io ( + // io controller spi interface + input sck, + input ss, + input sdi, + + output downloading, // signal indicating an active download + output reg [4:0] index, // menu index used to upload the file + + // external ram interface + input clk, + output reg wr, + output reg [24:0] addr, + output reg [7:0] data +); + +// ********************************************************************************* +// spi client +// ********************************************************************************* + +// filter spi clock. the 8 bit gate delay is ~2.5ns in total +wire [7:0] spi_sck_D = { spi_sck_D[6:0], sck } /* synthesis keep */; +wire spi_sck = (spi_sck && spi_sck_D != 8'h00) || (!spi_sck && spi_sck_D == 8'hff); + +// this core supports only the display related OSD commands +// of the minimig +reg [6:0] sbuf; +reg [7:0] cmd; +reg [4:0] cnt; +reg rclk; + +reg [24:0] laddr; +reg [7:0] ldata; + +localparam UIO_FILE_TX = 8'h53; +localparam UIO_FILE_TX_DAT = 8'h54; +localparam UIO_FILE_INDEX = 8'h55; + +assign downloading = downloading_reg; +reg downloading_reg = 1'b0; + +// data_io has its own SPI interface to the io controller +always@(posedge spi_sck, posedge ss) begin + if(ss == 1'b1) + cnt <= 5'd0; + else begin + rclk <= 1'b0; + + // don't shift in last bit. It is evaluated directly + // when writing to ram + if(cnt != 15) + sbuf <= { sbuf[5:0], sdi}; + + // increase target address after write + if(rclk) + laddr <= laddr + 1; + + // count 0-7 8-15 8-15 ... + if(cnt < 15) cnt <= cnt + 4'd1; + else cnt <= 4'd8; + + // finished command byte + if(cnt == 7) + cmd <= {sbuf, sdi}; + + // prepare/end transmission + if((cmd == UIO_FILE_TX) && (cnt == 15)) begin + // prepare + if(sdi) begin + laddr <= 25'd0; + downloading_reg <= 1'b1; + end else + downloading_reg <= 1'b0; + end + + // command 0x54: UIO_FILE_TX + if((cmd == UIO_FILE_TX_DAT) && (cnt == 15)) begin + ldata <= {sbuf, sdi}; + rclk <= 1'b1; + end + + // expose file (menu) index + if((cmd == UIO_FILE_INDEX) && (cnt == 15)) + index <= {sbuf[3:0], sdi}; + end +end + +reg rclkD, rclkD2; +always@(posedge clk) begin + // bring all signals from spi clock domain into local clock domain + rclkD <= rclk; + rclkD2 <= rclkD; + wr <= 1'b0; + + if(rclkD && !rclkD2) begin + addr <= laddr; + data <= ldata; + wr <= 1'b1; + end +end + +endmodule diff --git a/Commodore MAX/rtl/fpga64_rgbcolor.vhd b/Commodore MAX/rtl/fpga64_rgbcolor.vhd new file mode 100644 index 00000000..1fc4eb9a --- /dev/null +++ b/Commodore MAX/rtl/fpga64_rgbcolor.vhd @@ -0,0 +1,56 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- C64 palette index to 24 bit RGB color +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.all; + +-- ----------------------------------------------------------------------- + +entity fpga64_rgbcolor is + port ( + index: in unsigned(3 downto 0); + r: out unsigned(7 downto 0); + g: out unsigned(7 downto 0); + b: out unsigned(7 downto 0) + ); +end fpga64_rgbcolor; + +-- ----------------------------------------------------------------------- + +architecture Behavioral of fpga64_rgbcolor is +begin + process(index) + begin + case index is + when X"0" => r <= X"00"; g <= X"00"; b <= X"00"; + when X"1" => r <= X"FF"; g <= X"FF"; b <= X"FF"; + when X"2" => r <= X"68"; g <= X"37"; b <= X"2B"; + when X"3" => r <= X"70"; g <= X"A4"; b <= X"B2"; + when X"4" => r <= X"6F"; g <= X"3D"; b <= X"86"; + when X"5" => r <= X"58"; g <= X"8D"; b <= X"43"; + when X"6" => r <= X"35"; g <= X"28"; b <= X"79"; + when X"7" => r <= X"B8"; g <= X"C7"; b <= X"6F"; + when X"8" => r <= X"6F"; g <= X"4F"; b <= X"25"; + when X"9" => r <= X"43"; g <= X"39"; b <= X"00"; + when X"A" => r <= X"9A"; g <= X"67"; b <= X"59"; + when X"B" => r <= X"44"; g <= X"44"; b <= X"44"; + when X"C" => r <= X"6C"; g <= X"6C"; b <= X"6C"; + when X"D" => r <= X"9A"; g <= X"D2"; b <= X"84"; + when X"E" => r <= X"6C"; g <= X"5E"; b <= X"B5"; + when X"F" => r <= X"95"; g <= X"95"; b <= X"95"; + end case; + end process; +end Behavioral; diff --git a/Commodore MAX/rtl/hq2x.sv b/Commodore MAX/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Commodore MAX/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/Commodore MAX/rtl/mist_io.v b/Commodore MAX/rtl/mist_io.v new file mode 100644 index 00000000..ab9ef8ad --- /dev/null +++ b/Commodore MAX/rtl/mist_io.v @@ -0,0 +1,532 @@ +// +// 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, + + // ARM -> FPGA download + input ioctl_force_erase, + output reg ioctl_download = 0, // signal indicating an active download + output reg ioctl_erasing = 0, // signal indicating an active erase + output reg [7:0] ioctl_index, // menu index used to upload the file + output reg ioctl_wr = 0, + 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 [7: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; + +// 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]; + + 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 + case(ioctl_index) + 0: addr <= 'h080000; // BOOT ROM + 'h01: addr <= 'h000100; // ROM file + 'h41: addr <= 'h000100; // COM file + 'h81: addr <= 'h000000; // C00 file + 'hC1: addr <= 'h010000; // EDD file + default: addr <= 'h100000; // FDD file + endcase + 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 + +reg [24:0] erase_mask; +wire [24:0] next_erase = (ioctl_addr + 1'd1) & erase_mask; + +always@(posedge clk_sys) begin + reg rclkD, rclkD2; + reg old_force = 0; + reg [5:0] erase_clk_div; + reg [24:0] end_addr; + reg erase_trigger = 0; + + rclkD <= rclk; + rclkD2 <= rclkD; + ioctl_wr <= 0; + + if(rclkD & ~rclkD2) begin + ioctl_dout <= data_w; + ioctl_addr <= addr_w; + ioctl_wr <= 1; + end + + if(ioctl_download) begin + old_force <= 0; + ioctl_erasing <= 0; + erase_trigger <= (ioctl_index == 1); + end else begin + + old_force <= ioctl_force_erase; + + // start erasing + if(erase_trigger) begin + erase_trigger <= 0; + erase_mask <= 'hFFFF; + end_addr <= 'h0100; + erase_clk_div <= 1; + ioctl_erasing <= 1; + end else if((ioctl_force_erase & ~old_force)) begin + erase_trigger <= 0; + ioctl_addr <= 'h1FFFFFF; + erase_mask <= 'h1FFFFFF; + end_addr <= 'h0050000; + erase_clk_div <= 1; + ioctl_erasing <= 1; + end else if(ioctl_erasing) begin + erase_clk_div <= erase_clk_div + 1'd1; + if(!erase_clk_div) begin + if(next_erase == end_addr) ioctl_erasing <= 0; + else begin + ioctl_addr <= next_erase; + ioctl_dout <= 0; + ioctl_wr <= 1; + end + end + end + end +end + +endmodule \ No newline at end of file diff --git a/Commodore MAX/rtl/osd.v b/Commodore MAX/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Commodore MAX/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/Commodore MAX/rtl/pla_6703.v b/Commodore MAX/rtl/pla_6703.v new file mode 100644 index 00000000..42c6bba3 --- /dev/null +++ b/Commodore MAX/rtl/pla_6703.v @@ -0,0 +1,57 @@ +module pla_6703( + +input [15:10]A, +input CLK,//CLK +input BA,//BA +input RW_IN,// RW + +output reg RAM,//RAM invert +output reg EXRAM,//EXRAM invert +output reg VIC,//VIC invert +output reg SID,//SID invert +output reg CIA,//CIA_PLA invert +output reg COLRAM,//COLRAM invert +output reg ROML,//ROML invert +output reg ROMH,//ROMH invert +output reg BUF,//to the 4066 COLOR Ram DATA +output reg RW_OUT//RW_PLA invert + +); + + + +always @ (posedge CLK) +begin +RAM = ~(~A[11] & ~A[12] & ~A[13] & ~A[14] & ~A[15] & CLK & BA); +EXRAM = ~(A[11] & ~A[12] & ~A[13] & ~A[14] & ~A[15] & CLK & BA); +ROML = ~(~A[13] & ~A[14] & A[15] & CLK & BA); +ROMH = ~(A[13] & A[14] & A[15] & CLK & BA); +SID = ~(A[10] & ~A[11] & A[12] & ~A[13] & A[14] & A[15] & CLK & BA); +VIC = ~(~A[10] & ~A[11] & A[12] & ~A[13] & A[14] & A[15] & CLK & BA); +COLRAM = ~(~A[10] & A[11] & A[12] & ~A[13] & A[14] & A[15] & CLK & BA); +BUF = (~A[10] & A[11] & A[12] & ~A[13] & A[14] & A[15] & CLK & BA); +CIA = ~(A[10] & A[11] & A[12] & ~A[13] & A[14] & A[15] & CLK & BA); +RW_OUT = ~(CLK & ~RW_IN); +end + + + +//GAL Code +/*!RAM = !A11 & !A12 & !A13 & !A14 & !A15 & CLK & BA +!EXRAM = A11 & !A12 & !A13 & !A14 & !A15 & CLK & BA +# A11 & !A12 & !A13 & !CLK +# A11 & !A12 & !A13 & !BA; +!ROML = !A13 & !A14 & A15 & CLK & BA; +!ROMH = A13 & A14 & A15 & CLK & BA +# A12 & A13 & !CLK +# A12 & A13 & !BA; +!SID = A10 & !A11 & A12 & !A13 & A14 & A15 & CLK & BA; +!VIC = !A10 & !A11 & A12 & !A13 & A14 & A15 & CLK & BA; +!COLRAM = !A10 & A11 & A12 & !A13 & A14 & A15 & CLK & BA +# !CLK +# !BA; +BUF = !A10 & A11 & A12 & !A13 & A14 & A15 & CLK & BA; +!CIA = A10 & A11 & A12 & !A13 & A14 & A15 & CLK & BA; +!RW_OUT = CLK & !RW_IN;*/ + +endmodule \ No newline at end of file diff --git a/Commodore MAX/rtl/pll.qip b/Commodore MAX/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Commodore MAX/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/Commodore MAX/rtl/pll.v b/Commodore MAX/rtl/pll.v new file mode 100644 index 00000000..0adb538f --- /dev/null +++ b/Commodore MAX/rtl/pll.v @@ -0,0 +1,404 @@ +// 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 ( + areset, + inclk0, + c0, + c1, + c2, + c3, + locked); + + input areset; + input inclk0; + output c0; + output c1; + output c2; + output c3; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [4:0] sub_wire0; + wire sub_wire3; + wire [0:0] sub_wire8 = 1'h0; + wire [2:2] sub_wire5 = sub_wire0[2:2]; + wire [0:0] sub_wire4 = sub_wire0[0:0]; + wire [3:3] sub_wire2 = sub_wire0[3:3]; + wire [1:1] sub_wire1 = sub_wire0[1:1]; + wire c1 = sub_wire1; + wire c3 = sub_wire2; + wire locked = sub_wire3; + wire c0 = sub_wire4; + wire c2 = sub_wire5; + wire sub_wire6 = inclk0; + wire [1:0] sub_wire7 = {sub_wire8, sub_wire6}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire7), + .clk (sub_wire0), + .locked (sub_wire3), + .activeclock (), + .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 (), + .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 = 32, + altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 27, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 1, + altpll_component.clk1_phase_shift = "0", + altpll_component.clk2_divide_by = 27, + altpll_component.clk2_duty_cycle = 50, + altpll_component.clk2_multiply_by = 8, + altpll_component.clk2_phase_shift = "0", + altpll_component.clk3_divide_by = 2240, + altpll_component.clk3_duty_cycle = 50, + altpll_component.clk3_multiply_by = 83, + altpll_component.clk3_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_USED", + 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_USED", + 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_USED", + 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.self_reset_on_loss_lock = "OFF", + 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 "27" +// Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "2240" +// 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: DUTY_CYCLE3 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "32.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "1.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "8.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "1.000446" +// 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 "1" +// 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 "ps" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "32" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "1" +// Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "8" +// Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "83" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "32.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "1.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "8.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "1.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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: PHASE_SHIFT_UNIT3 STRING "ps" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "32" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "1" +// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "27" +// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "8" +// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "2240" +// Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "83" +// Retrieval info: CONSTANT: CLK3_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_USED" +// 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_USED" +// 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_USED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +// Retrieval info: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Commodore MAX/rtl/scandoubler.v b/Commodore MAX/rtl/scandoubler.v new file mode 100644 index 00000000..5a3ccd17 --- /dev/null +++ b/Commodore MAX/rtl/scandoubler.v @@ -0,0 +1,195 @@ +// +// 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 + +`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 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 +); + + +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/Commodore MAX/rtl/sid_6581.vhd b/Commodore MAX/rtl/sid_6581.vhd new file mode 100644 index 00000000..920c6f1b --- /dev/null +++ b/Commodore MAX/rtl/sid_6581.vhd @@ -0,0 +1,348 @@ +------------------------------------------------------------------------------- +-- +-- SID 6581 +-- +-- A fully functional SID chip implementation in VHDL +-- +------------------------------------------------------------------------------- +-- to do: - filter +-- - smaller implementation, use multiplexed channels +-- +-- +-- "The Filter was a classic multi-mode (state variable) VCF design. There was +-- no way to create a variable transconductance amplifier in our NMOS process, +-- so I simply used FETs as voltage-controlled resistors to control the cutoff +-- frequency. An 11-bit D/A converter generates the control voltage for the +-- FETs (it's actually a 12-bit D/A, but the LSB had no audible affect so I +-- disconnected it!)." +-- "Filter resonance was controlled by a 4-bit weighted resistor ladder. Each +-- bit would turn on one of the weighted resistors and allow a portion of the +-- output to feed back to the input. The state-variable design provided +-- simultaneous low-pass, band-pass and high-pass outputs. Analog switches +-- selected which combination of outputs were sent to the final amplifier (a +-- notch filter was created by enabling both the high and low-pass outputs +-- simultaneously)." +-- "The filter is the worst part of SID because I could not create high-gain +-- op-amps in NMOS, which were essential to a resonant filter. In addition, +-- the resistance of the FETs varied considerably with processing, so different +-- lots of SID chips had different cutoff frequency characteristics. I knew it +-- wouldn't work very well, but it was better than nothing and I didn't have +-- time to make it better." +-- +------------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; + +------------------------------------------------------------------------------- + +entity sid_6581 is + port ( + clk_1MHz : in std_logic; -- main SID clock signal + clk32 : in std_logic; -- main clock signal + reset : in std_logic; -- high active signal (reset when reset = '1') + cs : in std_logic; -- "chip select", when this signal is '1' this model can be accessed + we : in std_logic; -- when '1' this model can be written to, otherwise access is considered as read + + addr : in std_logic_vector(4 downto 0); -- address lines + data_i : in std_logic_vector(7 downto 0); -- data in (to chip) + data_o : out std_logic_vector(7 downto 0); -- data out (from chip) + + poti_x : in std_logic; -- paddle input-X + poti_y : in std_logic; -- paddle input-Y + audio_data : out std_logic_vector(17 downto 0) + ); +end sid_6581; + +architecture Behavioral of sid_6581 is + + component pwm_sdadc is + port ( + clk : in std_logic; -- main clock signal (actually the higher the better) + reset : in std_logic; -- + ADC_out : out std_logic_vector(7 downto 0); -- binary input of signal to be converted + ADC_in : in std_logic -- "analog" paddle input pin + ); + end component; + + -- Implementation of the SID voices (sound channels) + component sid_voice is + port ( + clk_1MHz : in std_logic; -- this line drives the oscilator + reset : in std_logic; -- active high signal (i.e. registers are reset when reset=1) + Freq_lo : in std_logic_vector(7 downto 0); -- + Freq_hi : in std_logic_vector(7 downto 0); -- + Pw_lo : in std_logic_vector(7 downto 0); -- + Pw_hi : in std_logic_vector(3 downto 0); -- + Control : in std_logic_vector(7 downto 0); -- + Att_dec : in std_logic_vector(7 downto 0); -- + Sus_Rel : in std_logic_vector(7 downto 0); -- + PA_MSB_in : in std_logic; -- + PA_MSB_out : out std_logic; -- + Osc : out std_logic_vector(7 downto 0); -- + Env : out std_logic_vector(7 downto 0); -- + voice : out std_logic_vector(11 downto 0) -- + ); + end component; + +------------------------------------------------------------------------------- +--constant : := ; +-- DC offset required to play samples, this is actually a bug of the real 6581, +-- that was converted into an advantage to play samples +constant DC_offset : std_logic_vector(13 downto 0) := "00111111111111"; +------------------------------------------------------------------------------- + +signal Voice_1_Freq_lo : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_1_Freq_hi : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_1_Pw_lo : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_1_Pw_hi : std_logic_vector(3 downto 0) := (others => '0'); +signal Voice_1_Control : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_1_Att_dec : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_1_Sus_Rel : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_1_Osc : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_1_Env : std_logic_vector(7 downto 0) := (others => '0'); + +signal Voice_2_Freq_lo : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_2_Freq_hi : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_2_Pw_lo : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_2_Pw_hi : std_logic_vector(3 downto 0) := (others => '0'); +signal Voice_2_Control : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_2_Att_dec : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_2_Sus_Rel : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_2_Osc : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_2_Env : std_logic_vector(7 downto 0) := (others => '0'); + +signal Voice_3_Freq_lo : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_3_Freq_hi : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_3_Pw_lo : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_3_Pw_hi : std_logic_vector(3 downto 0) := (others => '0'); +signal Voice_3_Control : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_3_Att_dec : std_logic_vector(7 downto 0) := (others => '0'); +signal Voice_3_Sus_Rel : std_logic_vector(7 downto 0) := (others => '0'); + +signal Filter_Fc_lo : std_logic_vector(7 downto 0) := (others => '0'); +signal Filter_Fc_hi : std_logic_vector(7 downto 0) := (others => '0'); +signal Filter_Res_Filt : std_logic_vector(7 downto 0) := (others => '0'); +signal Filter_Mode_Vol : std_logic_vector(7 downto 0) := (others => '0'); + +signal Misc_PotX : std_logic_vector(7 downto 0) := (others => '0'); +signal Misc_PotY : std_logic_vector(7 downto 0) := (others => '0'); +signal Misc_Osc3_Random : std_logic_vector(7 downto 0) := (others => '0'); +signal Misc_Env3 : std_logic_vector(7 downto 0) := (others => '0'); + +signal do_buf : std_logic_vector(7 downto 0) := (others => '0'); + +signal voice_1 : std_logic_vector(11 downto 0) := (others => '0'); +signal voice_2 : std_logic_vector(11 downto 0) := (others => '0'); +signal voice_3 : std_logic_vector(11 downto 0) := (others => '0'); +signal voice_mixed : std_logic_vector(13 downto 0) := (others => '0'); + +signal divide_0 : std_logic_vector(31 downto 0) := (others => '0'); +signal voice_1_PA_MSB : std_logic := '0'; +signal voice_2_PA_MSB : std_logic := '0'; +signal voice_3_PA_MSB : std_logic := '0'; + +------------------------------------------------------------------------------- + +begin + + paddle_x: pwm_sdadc + port map ( + clk => clk_1MHz, + reset => reset, + ADC_out => Misc_PotX, + ADC_in => poti_x + ); + + paddle_y: pwm_sdadc + port map ( + clk => clk_1MHz, + reset => reset, + ADC_out => Misc_PotY, + ADC_in => poti_y + ); + + sid_voice_1: sid_voice + port map( + clk_1MHz => clk_1MHz, + reset => reset, + Freq_lo => Voice_1_Freq_lo, + Freq_hi => Voice_1_Freq_hi, + Pw_lo => Voice_1_Pw_lo, + Pw_hi => Voice_1_Pw_hi, + Control => Voice_1_Control, + Att_dec => Voice_1_Att_dec, + Sus_Rel => Voice_1_Sus_Rel, + PA_MSB_in => voice_3_PA_MSB, + PA_MSB_out => voice_1_PA_MSB, + Osc => Voice_1_Osc, + Env => Voice_1_Env, + voice => voice_1 + ); + + sid_voice_2: sid_voice + port map( + clk_1MHz => clk_1MHz, + reset => reset, + Freq_lo => Voice_2_Freq_lo, + Freq_hi => Voice_2_Freq_hi, + Pw_lo => Voice_2_Pw_lo, + Pw_hi => Voice_2_Pw_hi, + Control => Voice_2_Control, + Att_dec => Voice_2_Att_dec, + Sus_Rel => Voice_2_Sus_Rel, + PA_MSB_in => voice_1_PA_MSB, + PA_MSB_out => voice_2_PA_MSB, + Osc => Voice_2_Osc, + Env => Voice_2_Env, + voice => voice_2 + ); + + sid_voice_3: sid_voice + port map( + clk_1MHz => clk_1MHz, + reset => reset, + Freq_lo => Voice_3_Freq_lo, + Freq_hi => Voice_3_Freq_hi, + Pw_lo => Voice_3_Pw_lo, + Pw_hi => Voice_3_Pw_hi, + Control => Voice_3_Control, + Att_dec => Voice_3_Att_dec, + Sus_Rel => Voice_3_Sus_Rel, + PA_MSB_in => voice_2_PA_MSB, + PA_MSB_out => voice_3_PA_MSB, + Osc => Misc_Osc3_Random, + Env => Misc_Env3, + voice => voice_3 + ); + +------------------------------------------------------------------------------------- +data_o <= do_buf; + +-- add voice 1+2 and 3, we must do this in this way to create the shortest +-- timing path (keep in mind that a basic adder can only add two variables) +voice_mixed <= (("00" & voice_1) + ("00" & voice_2)) + (voice_3 + DC_offset); +-- multiply the volume register with the voices +audio_data <= (voice_mixed * Filter_Mode_Vol(3 downto 0)); + +-- Register decoding +register_decoder:process(clk32) +begin + if rising_edge(clk32) then + if (reset = '1') then + --------------------------------------- Voice-1 + Voice_1_Freq_lo <= (others => '0'); + Voice_1_Freq_hi <= (others => '0'); + Voice_1_Pw_lo <= (others => '0'); + Voice_1_Pw_hi <= (others => '0'); + Voice_1_Control <= (others => '0'); + Voice_1_Att_dec <= (others => '0'); + Voice_1_Sus_Rel <= (others => '0'); + --------------------------------------- Voice-2 + Voice_2_Freq_lo <= (others => '0'); + Voice_2_Freq_hi <= (others => '0'); + Voice_2_Pw_lo <= (others => '0'); + Voice_2_Pw_hi <= (others => '0'); + Voice_2_Control <= (others => '0'); + Voice_2_Att_dec <= (others => '0'); + Voice_2_Sus_Rel <= (others => '0'); + --------------------------------------- Voice-3 + Voice_3_Freq_lo <= (others => '0'); + Voice_3_Freq_hi <= (others => '0'); + Voice_3_Pw_lo <= (others => '0'); + Voice_3_Pw_hi <= (others => '0'); + Voice_3_Control <= (others => '0'); + Voice_3_Att_dec <= (others => '0'); + Voice_3_Sus_Rel <= (others => '0'); + --------------------------------------- Filter & volume + Filter_Fc_lo <= (others => '0'); + Filter_Fc_hi <= (others => '0'); + Filter_Res_Filt <= (others => '0'); + Filter_Mode_Vol <= (others => '0'); + else + Voice_1_Freq_lo <= Voice_1_Freq_lo; + Voice_1_Freq_hi <= Voice_1_Freq_hi; + Voice_1_Pw_lo <= Voice_1_Pw_lo; + Voice_1_Pw_hi <= Voice_1_Pw_hi; + Voice_1_Control <= Voice_1_Control; + Voice_1_Att_dec <= Voice_1_Att_dec; + Voice_1_Sus_Rel <= Voice_1_Sus_Rel; + Voice_2_Freq_lo <= Voice_2_Freq_lo; + Voice_2_Freq_hi <= Voice_2_Freq_hi; + Voice_2_Pw_lo <= Voice_2_Pw_lo; + Voice_2_Pw_hi <= Voice_2_Pw_hi; + Voice_2_Control <= Voice_2_Control; + Voice_2_Att_dec <= Voice_2_Att_dec; + Voice_2_Sus_Rel <= Voice_2_Sus_Rel; + Voice_3_Freq_lo <= Voice_3_Freq_lo; + Voice_3_Freq_hi <= Voice_3_Freq_hi; + Voice_3_Pw_lo <= Voice_3_Pw_lo; + Voice_3_Pw_hi <= Voice_3_Pw_hi; + Voice_3_Control <= Voice_3_Control; + Voice_3_Att_dec <= Voice_3_Att_dec; + Voice_3_Sus_Rel <= Voice_3_Sus_Rel; + Filter_Fc_lo <= Filter_Fc_lo; + Filter_Fc_hi <= Filter_Fc_hi; + Filter_Res_Filt <= Filter_Res_Filt; + Filter_Mode_Vol <= Filter_Mode_Vol; + do_buf <= (others => '0'); + + if (cs='1') then + if (we='1') then -- Write to SID-register + ------------------------ + case addr is + -------------------------------------- Voice-1 + when "00000" => Voice_1_Freq_lo <= data_i; + when "00001" => Voice_1_Freq_hi <= data_i; + when "00010" => Voice_1_Pw_lo <= data_i; + when "00011" => Voice_1_Pw_hi <= data_i(3 downto 0); + when "00100" => Voice_1_Control <= data_i; + when "00101" => Voice_1_Att_dec <= data_i; + when "00110" => Voice_1_Sus_Rel <= data_i; + --------------------------------------- Voice-2 + when "00111" => Voice_2_Freq_lo <= data_i; + when "01000" => Voice_2_Freq_hi <= data_i; + when "01001" => Voice_2_Pw_lo <= data_i; + when "01010" => Voice_2_Pw_hi <= data_i(3 downto 0); + when "01011" => Voice_2_Control <= data_i; + when "01100" => Voice_2_Att_dec <= data_i; + when "01101" => Voice_2_Sus_Rel <= data_i; + --------------------------------------- Voice-3 + when "01110" => Voice_3_Freq_lo <= data_i; + when "01111" => Voice_3_Freq_hi <= data_i; + when "10000" => Voice_3_Pw_lo <= data_i; + when "10001" => Voice_3_Pw_hi <= data_i(3 downto 0); + when "10010" => Voice_3_Control <= data_i; + when "10011" => Voice_3_Att_dec <= data_i; + when "10100" => Voice_3_Sus_Rel <= data_i; + --------------------------------------- Filter & volume + when "10101" => Filter_Fc_lo <= data_i; + when "10110" => Filter_Fc_hi <= data_i; + when "10111" => Filter_Res_Filt <= data_i; + when "11000" => Filter_Mode_Vol <= data_i; + -------------------------------------- + when others => null; + end case; + + else -- Read from SID-register + ------------------------- + --case CONV_INTEGER(addr) is + case addr is + -------------------------------------- Misc + when "11001" => do_buf <= Misc_PotX; + when "11010" => do_buf <= Misc_PotY; + when "11011" => do_buf <= Misc_Osc3_Random; + when "11100" => do_buf <= Misc_Env3; + -------------------------------------- +-- when others => null; + when others => do_buf <= (others => '0'); + end case; + end if; + end if; + end if; + end if; +end process; + +end Behavioral; diff --git a/Commodore MAX/rtl/sid_components.vhd b/Commodore MAX/rtl/sid_components.vhd new file mode 100644 index 00000000..6f2e1ed7 --- /dev/null +++ b/Commodore MAX/rtl/sid_components.vhd @@ -0,0 +1,88 @@ +------------------------------------------------------------------------------- +-- +-- SID 6581 (voice) +-- +-- This piece of VHDL code describes a single SID voice (sound channel) +-- +------------------------------------------------------------------------------- +-- to do: - better resolution of result signal voice, this is now only 12bits, +-- but it could be 20 !! Problem, it does not fit the PWM-dac +------------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; + +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- 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 +-- +------------------------------------------------------------------------------- +--Implementation Digital to Analog converter +entity pwm_sddac is + generic ( + msbi_g : integer := 9 + ); + port ( + clk_i : in std_logic; + reset : in std_logic; + dac_i : in std_logic_vector(msbi_g downto 0); + dac_o : out std_logic + ); +end pwm_sddac; + +architecture rtl of pwm_sddac is + signal sig_in : unsigned(msbi_g+2 downto 0) := (others => '0'); + +begin + seq: process (clk_i, reset) + begin + if reset = '1' then + sig_in <= to_unsigned(2**(msbi_g+1), sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + sig_in <= sig_in + unsigned(sig_in(msbi_g+2) & sig_in(msbi_g+2) & dac_i); + dac_o <= sig_in(msbi_g+2); + end if; + end process seq; +end rtl; + +------------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; + +entity pwm_sdadc is + port ( + clk : in std_logic; -- main clock signal (the higher the better) + reset : in std_logic; -- + ADC_out : out std_logic_vector(7 downto 0); -- binary input of signal to be converted + ADC_in : in std_logic -- "analog" paddle input pin + ); +end pwm_sdadc; + +-- Dummy implementation (no real A/D conversion performed) +architecture rtl of pwm_sdadc is +begin + process (clk, ADC_in) + begin + if ADC_in = '1' then + ADC_out <= (others => '1'); + else + ADC_out <= (others => '0'); + end if; + end process; +end rtl; diff --git a/Commodore MAX/rtl/sid_voice.vhd b/Commodore MAX/rtl/sid_voice.vhd new file mode 100644 index 00000000..69fa50f1 --- /dev/null +++ b/Commodore MAX/rtl/sid_voice.vhd @@ -0,0 +1,656 @@ +------------------------------------------------------------------------------- +-- +-- SID 6581 (voice) +-- +-- This piece of VHDL code describes a single SID voice (sound channel) +-- +------------------------------------------------------------------------------- +-- to do: - better resolution of result signal voice, this is now only 12bits +-- but it could be 20 !! Problem, it does not fit the PWM-dac +------------------------------------------------------------------------------- + +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 sid_voice is + port ( + clk_1MHz : in std_logic; -- this line drives the oscilator + reset : in std_logic; -- active high signal (i.e. registers are reset when reset=1) + Freq_lo : in std_logic_vector(7 downto 0); -- low-byte of frequency register + Freq_hi : in std_logic_vector(7 downto 0); -- high-byte of frequency register + Pw_lo : in std_logic_vector(7 downto 0); -- low-byte of PuleWidth register + Pw_hi : in std_logic_vector(3 downto 0); -- high-nibble of PuleWidth register + Control : in std_logic_vector(7 downto 0); -- control register + Att_dec : in std_logic_vector(7 downto 0); -- attack-deccay register + Sus_Rel : in std_logic_vector(7 downto 0); -- sustain-release register + PA_MSB_in : in std_logic; -- Phase Accumulator MSB input + PA_MSB_out : out std_logic; -- Phase Accumulator MSB output + Osc : out std_logic_vector(7 downto 0); -- Voice waveform register + Env : out std_logic_vector(7 downto 0); -- Voice envelope register + voice : out std_logic_vector(11 downto 0) -- Voice waveform, this is the actual audio signal + ); +end sid_voice; + +architecture Behavioral of sid_voice is + +------------------------------------------------------------------------------- +-- Altera multiplier +-- COMPONENT lpm_mult +-- GENERIC +-- ( +-- lpm_hint : STRING; +-- lpm_representation : STRING; +-- lpm_type : STRING; +-- lpm_widtha : NATURAL; +-- lpm_widthb : NATURAL; +-- lpm_widthp : NATURAL; +-- lpm_widths : NATURAL +-- ); +-- PORT +-- ( +-- dataa : IN STD_LOGIC_VECTOR (11 DOWNTO 0); +-- datab : IN STD_LOGIC_VECTOR (7 DOWNTO 0); +-- result : OUT STD_LOGIC_VECTOR (19 DOWNTO 0) +-- ); +-- END COMPONENT; + +------------------------------------------------------------------------------- + +signal accumulator : std_logic_vector(23 downto 0) := (others => '0'); +signal accu_bit_prev : std_logic := '0'; +signal PA_MSB_in_prev : std_logic := '0'; + +-- this type of signal has only two states 0 or 1 (so no more bits are required) +signal pulse : std_logic := '0'; +signal sawtooth : std_logic_vector(11 downto 0) := (others => '0'); +signal triangle : std_logic_vector(11 downto 0) := (others => '0'); +signal noise : std_logic_vector(11 downto 0) := (others => '0'); +signal LFSR : std_logic_vector(22 downto 0) := (others => '0'); + +signal frequency : std_logic_vector(15 downto 0) := (others => '0'); +signal pulsewidth : std_logic_vector(11 downto 0) := (others => '0'); + +-- Envelope Generator +type envelope_state_types is (idle, attack, attack_lp, decay, decay_lp, sustain, releases, release_lp); +signal cur_state, next_state : envelope_state_types; +signal divider_value : integer range 0 to 2**15 - 1 :=0; +signal divider_attack : integer range 0 to 2**15 - 1 :=0; +signal divider_dec_rel : integer range 0 to 2**15 - 1 :=0; +signal divider_counter : integer range 0 to 2**18 - 1 :=0; +signal exp_table_value : integer range 0 to 2**18 - 1 :=0; +signal exp_table_active : std_logic := '0'; +signal divider_rst : std_logic := '0'; +signal Dec_rel : std_logic_vector(3 downto 0) := (others => '0'); +signal Dec_rel_sel : std_logic := '0'; + +signal env_counter : std_logic_vector(17 downto 0) := (others => '0'); +signal env_count_hold_A : std_logic := '0'; +signal env_count_hold_B : std_logic := '0'; +signal env_cnt_up : std_logic := '0'; +signal env_cnt_clear : std_logic := '0'; + +signal signal_mux : std_logic_vector(17 downto 0) := (others => '0'); +signal signal_vol : std_logic_vector(35 downto 0) := (others => '0'); + +------------------------------------------------------------------------------------- + +-- stop the oscillator when test = '1' +alias test : std_logic is Control(3); +-- Ring Modulation was accomplished by substituting the accumulator MSB of an +-- oscillator in the EXOR function of the triangle waveform generator with the +-- accumulator MSB of the previous oscillator. That is why the triangle waveform +-- must be selected to use Ring Modulation. +alias ringmod : std_logic is Control(2); +-- Hard Sync was accomplished by clearing the accumulator of an Oscillator +-- based on the accumulator MSB of the previous oscillator. +alias sync : std_logic is Control(1); +-- +alias gate : std_logic is Control(0); + +------------------------------------------------------------------------------------- + +begin + +-- output the Phase accumulator's MSB for sync and ringmod purposes +PA_MSB_out <= accumulator(23); +-- output the upper 8-bits of the waveform. +-- Useful for random numbers (noise must be selected) +Osc <= signal_mux(11 downto 4); +-- output the envelope register, for special sound effects when connecting this +-- signal to the input of other channels/voices +Env <= env_counter(7 downto 0); +-- use the register value to fill the variable +frequency(15 downto 8) <= Freq_hi(7 downto 0); +-- +frequency(7 downto 0) <= Freq_lo(7 downto 0); +-- use the register value to fill the variable +pulsewidth(11 downto 8) <= Pw_hi(3 downto 0); +-- +pulsewidth(7 downto 0) <= Pw_lo(7 downto 0); +-- +voice <= signal_vol(19 downto 8); + +-- Phase accumulator : +-- "As I recall, the Oscillator is a 24-bit phase-accumulating design of which +-- the lower 16-bits are programmable for pitch control. The output of the +-- accumulator goes directly to a D/A converter through a waveform selector. +-- Normally, the output of a phase-accumulating oscillator would be used as an +-- address into memory which contained a wavetable, but SID had to be entirely +-- self-contained and there was no room at all for a wavetable on the chip." +-- "Hard Sync was accomplished by clearing the accumulator of an Oscillator +-- based on the accumulator MSB of the previous oscillator." +PhaseAcc:process(clk_1MHz) +begin + if (rising_edge(clk_1MHz)) then + PA_MSB_in_prev <= PA_MSB_in; + -- the reset and test signal can stop the oscillator, + -- stopping the oscillator is very useful when you want to play "samples" + if ((reset = '1') or (test = '1') or ((sync = '1') and (PA_MSB_in_prev /= PA_MSB_in) and (PA_MSB_in = '0'))) then + accumulator <= (others => '0'); + else + -- accumulate the new phase (i.o.w. increment env_counter with the freq. value) + accumulator <= accumulator + ("0" & frequency(15 downto 0)); + end if; + end if; +end process; + +-- Sawtooth waveform : +-- "The Sawtooth waveform was created by sending the upper 12-bits of the +-- accumulator to the 12-bit Waveform D/A." +Snd_Sawtooth:process(clk_1MHz) +begin + if (rising_edge(clk_1MHz)) then + sawtooth <= accumulator(23 downto 12); + end if; +end process; + +--Pulse waveform : +-- "The Pulse waveform was created by sending the upper 12-bits of the +-- accumulator to a 12-bit digital comparator. The output of the comparator was +-- either a one or a zero. This single output was then sent to all 12 bits of +-- the Waveform D/A. " +Snd_pulse:process(clk_1MHz) +begin + if (rising_edge(clk_1MHz)) then + if ((accumulator(23 downto 12)) >= (pulsewidth(11 downto 0))) then + pulse <= '1'; + else + pulse <= '0'; + end if; + end if; +end process; + +--Triangle waveform : +-- "The Triangle waveform was created by using the MSB of the accumulator to +-- invert the remaining upper 11 accumulator bits using EXOR gates. These 11 +-- bits were then left-shifted (throwing away the MSB) and sent to the Waveform +-- D/A (so the resolution of the triangle waveform was half that of the sawtooth, +-- but the amplitude and frequency were the same). " +-- "Ring Modulation was accomplished by substituting the accumulator MSB of an +-- oscillator in the EXOR function of the triangle waveform generator with the +-- accumulator MSB of the previous oscillator. That is why the triangle waveform +-- must be selected to use Ring Modulation." +Snd_triangle:process(clk_1MHz) +begin + if (rising_edge(clk_1MHz)) then + if ringmod = '0' then + -- no ringmodulation + triangle(11)<= accumulator(23) xor accumulator(22); + triangle(10)<= accumulator(23) xor accumulator(21); + triangle(9) <= accumulator(23) xor accumulator(20); + triangle(8) <= accumulator(23) xor accumulator(19); + triangle(7) <= accumulator(23) xor accumulator(18); + triangle(6) <= accumulator(23) xor accumulator(17); + triangle(5) <= accumulator(23) xor accumulator(16); + triangle(4) <= accumulator(23) xor accumulator(15); + triangle(3) <= accumulator(23) xor accumulator(14); + triangle(2) <= accumulator(23) xor accumulator(13); + triangle(1) <= accumulator(23) xor accumulator(12); + triangle(0) <= accumulator(23) xor accumulator(11); + else + -- ringmodulation by the other voice (previous voice) + triangle(11)<= PA_MSB_in xor accumulator(22); + triangle(10)<= PA_MSB_in xor accumulator(21); + triangle(9) <= PA_MSB_in xor accumulator(20); + triangle(8) <= PA_MSB_in xor accumulator(19); + triangle(7) <= PA_MSB_in xor accumulator(18); + triangle(6) <= PA_MSB_in xor accumulator(17); + triangle(5) <= PA_MSB_in xor accumulator(16); + triangle(4) <= PA_MSB_in xor accumulator(15); + triangle(3) <= PA_MSB_in xor accumulator(14); + triangle(2) <= PA_MSB_in xor accumulator(13); + triangle(1) <= PA_MSB_in xor accumulator(12); + triangle(0) <= PA_MSB_in xor accumulator(11); + end if; + end if; +end process; + +--Noise (23-bit Linear Feedback Shift Register, max combinations = 8388607) : +-- "The Noise waveform was created using a 23-bit pseudo-random sequence +-- generator (i.e., a shift register with specific outputs fed back to the input +-- through combinatorial logic). The shift register was clocked by one of the +-- intermediate bits of the accumulator to keep the frequency content of the +-- noise waveform relatively the same as the pitched waveforms. +-- The upper 12-bits of the shift register were sent to the Waveform D/A." +noise <= LFSR(22 downto 11); + +Snd_noise:process(clk_1MHz) +begin + if (rising_edge(clk_1MHz)) then + -- the test signal can stop the oscillator, + -- stopping the oscillator is very useful when you want to play "samples" + if ((reset = '1') or (test = '1')) then + accu_bit_prev <= '0'; + -- the "seed" value (the value that eventually determines the output + -- pattern) may never be '0' otherwise the generator "locks up" + LFSR <= "00000000000000000000001"; + else + accu_bit_prev <= accumulator(22); + -- when not equal to ... + if (accu_bit_prev /= accumulator(22)) then + LFSR(22 downto 1) <= LFSR(21 downto 0); + LFSR(0) <= LFSR(17) xor LFSR(22); -- see Xilinx XAPP052 for maximal LFSR taps + else + LFSR <= LFSR; + end if; + end if; + end if; +end process; + +-- Waveform Output selector (MUX): +-- "Since all of the waveforms were just digital bits, the Waveform Selector +-- consisted of multiplexers that selected which waveform bits would be sent +-- to the Waveform D/A. The multiplexers were single transistors and did not +-- provide a "lock-out", allowing combinations of the waveforms to be selected. +-- The combination was actually a logical ANDing of the bits of each waveform, +-- which produced unpredictable results, so I didn't encourage this, especially +-- since it could lock up the pseudo-random sequence generator by filling it +-- with zeroes." +Snd_select:process(clk_1MHz) +begin + if (rising_edge(clk_1MHz)) then + signal_mux(11) <= (triangle(11) and Control(4)) or (sawtooth(11) and Control(5)) or (pulse and Control(6)) or (noise(11) and Control(7)); + signal_mux(10) <= (triangle(10) and Control(4)) or (sawtooth(10) and Control(5)) or (pulse and Control(6)) or (noise(10) and Control(7)); + signal_mux(9) <= (triangle(9) and Control(4)) or (sawtooth(9) and Control(5)) or (pulse and Control(6)) or (noise(9) and Control(7)); + signal_mux(8) <= (triangle(8) and Control(4)) or (sawtooth(8) and Control(5)) or (pulse and Control(6)) or (noise(8) and Control(7)); + signal_mux(7) <= (triangle(7) and Control(4)) or (sawtooth(7) and Control(5)) or (pulse and Control(6)) or (noise(7) and Control(7)); + signal_mux(6) <= (triangle(6) and Control(4)) or (sawtooth(6) and Control(5)) or (pulse and Control(6)) or (noise(6) and Control(7)); + signal_mux(5) <= (triangle(5) and Control(4)) or (sawtooth(5) and Control(5)) or (pulse and Control(6)) or (noise(5) and Control(7)); + signal_mux(4) <= (triangle(4) and Control(4)) or (sawtooth(4) and Control(5)) or (pulse and Control(6)) or (noise(4) and Control(7)); + signal_mux(3) <= (triangle(3) and Control(4)) or (sawtooth(3) and Control(5)) or (pulse and Control(6)) or (noise(3) and Control(7)); + signal_mux(2) <= (triangle(2) and Control(4)) or (sawtooth(2) and Control(5)) or (pulse and Control(6)) or (noise(2) and Control(7)); + signal_mux(1) <= (triangle(1) and Control(4)) or (sawtooth(1) and Control(5)) or (pulse and Control(6)) or (noise(1) and Control(7)); + signal_mux(0) <= (triangle(0) and Control(4)) or (sawtooth(0) and Control(5)) or (pulse and Control(6)) or (noise(0) and Control(7)); + end if; +end process; + +-- Waveform envelope (volume) control : +-- "The output of the Waveform D/A (which was an analog voltage at this point) +-- was fed into the reference input of an 8-bit multiplying D/A, creating a DCA +-- (digitally-controlled-amplifier). The digital control word which modulated +-- the amplitude of the waveform came from the Envelope Generator." +-- "The 8-bit output of the Envelope Generator was then sent to the Multiplying +-- D/A converter to modulate the amplitude of the selected Oscillator Waveform +-- (to be technically accurate, actually the waveform was modulating the output +-- of the Envelope Generator, but the result is the same)." + Envelope_multiplier:process(clk_1MHz) + begin + if (rising_edge(clk_1MHz)) then + --calculate the resulting volume (due to the envelope generator) of the + --voice, signal_mux(12bit) * env_counter(8bit), so the result will + --require 20 bits !! + signal_vol <= signal_mux * env_counter; + end if; +end process; + +-- Altera multiplier +-- lpm_mult_component : lpm_mult +-- GENERIC MAP +-- ( +-- lpm_hint => "MAXIMIZE_SPEED=5", +-- lpm_representation => "UNSIGNED", +-- lpm_type => "LPM_MULT", +-- lpm_widtha => 12, +-- lpm_widthb => 8, +-- lpm_widthp => 20, +-- lpm_widths => 1 +-- ) +-- PORT MAP +-- ( +-- dataa(11 downto 0) => signal_mux, +-- datab(7 downto 0) => env_counter, +-- result => signal_vol +-- ); + +-- Envelope generator : +-- "The Envelope Generator was simply an 8-bit up/down counter which, when +-- triggered by the Gate bit, counted from 0 to 255 at the Attack rate, from +-- 255 down to the programmed Sustain value at the Decay rate, remained at the +-- Sustain value until the Gate bit was cleared then counted down from the +-- Sustain value to 0 at the Release rate." +-- +-- /\ +-- / \ +-- / | \________ +-- / | | \ +-- / | | |\ +-- / | | | \ +-- attack|dec|sustain|rel + +-- this process controls the state machine "current-state"-value +Envelope_SM_advance: process (reset, clk_1MHz) +begin + if (reset = '1') then + cur_state <= idle; + else + if (rising_edge(clk_1MHz)) then + cur_state <= next_state; + end if; + end if; +end process; + + +-- this process controls the envelope (in other words, the volume control) +Envelope_SM: process (reset, cur_state, gate, divider_attack, divider_dec_rel, Att_dec, Sus_Rel, env_counter) +begin + if (reset = '1') then + next_state <= idle; + env_cnt_clear <='1'; + env_cnt_up <='1'; + env_count_hold_B <='1'; + divider_rst <='1'; + divider_value <= 0; + exp_table_active <='0'; + Dec_rel_sel <='0'; -- select decay as input for decay/release table + else + env_cnt_clear <='0'; -- use this statement unless stated otherwise + env_cnt_up <='1'; -- use this statement unless stated otherwise + env_count_hold_B <='1'; -- use this statement unless stated otherwise + divider_rst <='0'; -- use this statement unless stated otherwise + divider_value <= 0; -- use this statement unless stated otherwise + exp_table_active <='0'; -- use this statement unless stated otherwise + case cur_state is + + -- IDLE + when idle => + env_cnt_clear <= '1'; -- clear envelope env_counter + divider_rst <= '1'; + Dec_rel_sel <= '0'; -- select decay as input for decay/release table + if gate = '1' then + next_state <= attack; + else + next_state <= idle; + end if; + + when attack => + env_cnt_clear <= '1'; -- clear envelope env_counter + divider_rst <= '1'; + divider_value <= divider_attack; + next_state <= attack_lp; + Dec_rel_sel <= '0'; -- select decay as input for decay/release table + + when attack_lp => + env_count_hold_B <= '0'; -- enable envelope env_counter + env_cnt_up <= '1'; -- envelope env_counter must count up (increment) + divider_value <= divider_attack; + Dec_rel_sel <= '0'; -- select decay as input for decay/release table + if env_counter = "11111111" then + next_state <= decay; + else + if gate = '0' then + next_state <= releases; + else + next_state <= attack_lp; + end if; + end if; + + when decay => + divider_rst <= '1'; + exp_table_active <= '1'; -- activate exponential look-up table + env_cnt_up <= '0'; -- envelope env_counter must count down (decrement) + divider_value <= divider_dec_rel; + next_state <= decay_lp; + Dec_rel_sel <= '0'; -- select decay as input for decay/release table + + when decay_lp => + exp_table_active <= '1'; -- activate exponential look-up table + env_count_hold_B <= '0'; -- enable envelope env_counter + env_cnt_up <= '0'; -- envelope env_counter must count down (decrement) + divider_value <= divider_dec_rel; + Dec_rel_sel <= '0'; -- select decay as input for decay/release table + if (env_counter(7 downto 4) = Sus_Rel(7 downto 4)) then + next_state <= sustain; + else + if gate = '0' then + next_state <= releases; + else + next_state <= decay_lp; + end if; + end if; + + -- "A digital comparator was used for the Sustain function. The upper + -- four bits of the Up/Down counter were compared to the programmed + -- Sustain value and would stop the clock to the Envelope Generator when + -- the counter counted down to the Sustain value. This created 16 linearly + -- spaced sustain levels without havingto go through a look-up table + -- translation between the 4-bit register value and the 8-bit Envelope + -- Generator output. It also meant that sustain levels were adjustable + -- in steps of 16. Again, more register bits would have provided higher + -- resolution." + -- "When the Gate bit was cleared, the clock would again be enabled, + -- allowing the counter to count down to zero. Like an analog envelope + -- generator, the SID Envelope Generator would track the Sustain level + -- if it was changed to a lower value during the Sustain portion of the + -- envelope, however, it would not count UP if the Sustain level were set + -- higher." Instead it would count down to '0'. + when sustain => + divider_value <= 0; + Dec_rel_sel <='1'; -- select release as input for decay/release table + if gate = '0' then + next_state <= releases; + else + if (env_counter(7 downto 4) = Sus_Rel(7 downto 4)) then + next_state <= sustain; + else + next_state <= decay; + end if; + end if; + + when releases => + divider_rst <= '1'; + exp_table_active <= '1'; -- activate exponential look-up table + env_cnt_up <= '0'; -- envelope env_counter must count down (decrement) + divider_value <= divider_dec_rel; + Dec_rel_sel <= '1'; -- select release as input for decay/release table + next_state <= release_lp; + + when release_lp => + exp_table_active <= '1'; -- activate exponential look-up table + env_count_hold_B <= '0'; -- enable envelope env_counter + env_cnt_up <= '0'; -- envelope env_counter must count down (decrement) + divider_value <= divider_dec_rel; + Dec_rel_sel <= '1'; -- select release as input for decay/release table + if env_counter = "00000000" then + next_state <= idle; + else + if gate = '1' then + next_state <= idle; + else + next_state <= release_lp; + end if; + end if; + + when others => + divider_value <= 0; + Dec_rel_sel <= '0'; -- select decay as input for decay/release table + next_state <= idle; + end case; + end if; +end process; + +-- 8 bit up/down env_counter +Envelope_counter:process(clk_1MHz) +begin + if (rising_edge(clk_1MHz)) then + if ((reset = '1') or (env_cnt_clear = '1')) then + env_counter <= (others => '0'); + else + if ((env_count_hold_A = '1') or (env_count_hold_B = '1'))then + env_counter <= env_counter; + else + if (env_cnt_up = '1') then + env_counter <= env_counter + 1; + else + env_counter <= env_counter - 1; + end if; + end if; + end if; + end if; +end process; + +-- Divider : +-- "A programmable frequency divider was used to set the various rates +-- (unfortunately I don't remember how many bits the divider was, either 12 +-- or 16 bits). A small look-up table translated the 16 register-programmable +-- values to the appropriate number to load into the frequency divider. +-- Depending on what state the Envelope Generator was in (i.e. ADS or R), the +-- appropriate register would be selected and that number would be translated +-- and loaded into the divider. Obviously it would have been better to have +-- individual bit control of the divider which would have provided great +-- resolution for each rate, however I did not have enough silicon area for a +-- lot of register bits. Using this approach, I was able to cram a wide range +-- of rates into 4 bits, allowing the ADSR to be defined in two bytes instead +-- of eight. The actual numbers in the look-up table were arrived at +-- subjectively by setting up typical patches on a Sequential Circuits Pro-1 +-- and measuring the envelope times by ear (which is why the available rates +-- seem strange)!" +prog_freq_div:process(clk_1MHz) +begin + if (rising_edge(clk_1MHz)) then + if ((reset = '1') or (divider_rst = '1')) then + env_count_hold_A <= '1'; + divider_counter <= 0; + else + if (divider_counter = 0) then + env_count_hold_A <= '0'; + if (exp_table_active = '1') then + divider_counter <= exp_table_value; + else + divider_counter <= divider_value; + end if; + else + env_count_hold_A <= '1'; + divider_counter <= divider_counter - 1; + end if; + end if; + end if; +end process; + +-- Piese-wise linear approximation of an exponential : +-- "In order to more closely model the exponential decay of sounds, another +-- look-up table on the output of the Envelope Generator would sequentially +-- divide the clock to the Envelope Generator by two at specific counts in the +-- Decay and Release cycles. This created a piece-wise linear approximation of +-- an exponential. I was particularly happy how well this worked considering +-- the simplicity of the circuitry. The Attack, however, was linear, but this +-- sounded fine." +-- The clock is divided by two at specifiek values of the envelope generator to +-- create an exponential. +Exponential_table:process(clk_1MHz) +BEGIN + if (rising_edge(clk_1MHz)) then + if (reset = '1') then + exp_table_value <= 0; + else + case CONV_INTEGER(env_counter) is + when 0 to 51 => exp_table_value <= divider_value * 16; + when 52 to 101 => exp_table_value <= divider_value * 8; + when 102 to 152 => exp_table_value <= divider_value * 4; + when 153 to 203 => exp_table_value <= divider_value * 2; + when 204 to 255 => exp_table_value <= divider_value; + when others => exp_table_value <= divider_value; + end case; + end if; + end if; +end process; + +-- Attack Lookup table : +-- It takes 255 clock cycles from zero to peak value. Therefore the divider +-- equals (attack rate / clockcycletime of 1MHz clock) / 254; +Attack_table:process(clk_1MHz) +begin + if (rising_edge(clk_1MHz)) then + if (reset = '1') then + divider_attack <= 0; + else + case Att_dec(7 downto 4) is + when "0000" => divider_attack <= 8; --attack rate: ( 2mS / 1uS per clockcycle) /254 steps + when "0001" => divider_attack <= 31; --attack rate: ( 8mS / 1uS per clockcycle) /254 steps + when "0010" => divider_attack <= 63; --attack rate: ( 16mS / 1uS per clockcycle) /254 steps + when "0011" => divider_attack <= 94; --attack rate: ( 24mS / 1uS per clockcycle) /254 steps + when "0100" => divider_attack <= 150; --attack rate: ( 38mS / 1uS per clockcycle) /254 steps + when "0101" => divider_attack <= 220; --attack rate: ( 56mS / 1uS per clockcycle) /254 steps + when "0110" => divider_attack <= 268; --attack rate: ( 68mS / 1uS per clockcycle) /254 steps + when "0111" => divider_attack <= 315; --attack rate: ( 80mS / 1uS per clockcycle) /254 steps + when "1000" => divider_attack <= 394; --attack rate: ( 100mS / 1uS per clockcycle) /254 steps + when "1001" => divider_attack <= 984; --attack rate: ( 250mS / 1uS per clockcycle) /254 steps + when "1010" => divider_attack <= 1968; --attack rate: ( 500mS / 1uS per clockcycle) /254 steps + when "1011" => divider_attack <= 3150; --attack rate: ( 800mS / 1uS per clockcycle) /254 steps + when "1100" => divider_attack <= 3937; --attack rate: (1000mS / 1uS per clockcycle) /254 steps + when "1101" => divider_attack <= 11811; --attack rate: (3000mS / 1uS per clockcycle) /254 steps + when "1110" => divider_attack <= 19685; --attack rate: (5000mS / 1uS per clockcycle) /254 steps + when "1111" => divider_attack <= 31496; --attack rate: (8000mS / 1uS per clockcycle) /254 steps + when others => divider_attack <= 0; -- + end case; + end if; + end if; +end process; + +Decay_Release_input_select:process(Dec_rel_sel, Att_dec, Sus_Rel) +begin + if (Dec_rel_sel = '0') then + Dec_rel(3 downto 0) <= Att_dec(3 downto 0); + else + Dec_rel(3 downto 0) <= Sus_rel(3 downto 0); + end if; +end process; + +-- Decay Lookup table : +-- It takes 32 * 51 = 1632 clock cycles to fall from peak level to zero. +-- Release Lookup table : +-- It takes 32 * 51 = 1632 clock cycles to fall from peak level to zero. +Decay_Release_table:process(clk_1MHz) +begin + if (rising_edge(clk_1MHz)) then + if reset = '1' then + divider_dec_rel <= 0; + else + case Dec_rel(3 downto 0) is + when "0000" => divider_dec_rel <= 3; --release rate: ( 6mS / 1uS per clockcycle) / 1632 + when "0001" => divider_dec_rel <= 15; --release rate: ( 24mS / 1uS per clockcycle) / 1632 + when "0010" => divider_dec_rel <= 29; --release rate: ( 48mS / 1uS per clockcycle) / 1632 + when "0011" => divider_dec_rel <= 44; --release rate: ( 72mS / 1uS per clockcycle) / 1632 + when "0100" => divider_dec_rel <= 70; --release rate: ( 114mS / 1uS per clockcycle) / 1632 + when "0101" => divider_dec_rel <= 103; --release rate: ( 168mS / 1uS per clockcycle) / 1632 + when "0110" => divider_dec_rel <= 125; --release rate: ( 204mS / 1uS per clockcycle) / 1632 + when "0111" => divider_dec_rel <= 147; --release rate: ( 240mS / 1uS per clockcycle) / 1632 + when "1000" => divider_dec_rel <= 184; --release rate: ( 300mS / 1uS per clockcycle) / 1632 + when "1001" => divider_dec_rel <= 459; --release rate: ( 750mS / 1uS per clockcycle) / 1632 + when "1010" => divider_dec_rel <= 919; --release rate: ( 1500mS / 1uS per clockcycle) / 1632 + when "1011" => divider_dec_rel <= 1471; --release rate: ( 2400mS / 1uS per clockcycle) / 1632 + when "1100" => divider_dec_rel <= 1838; --release rate: ( 3000mS / 1uS per clockcycle) / 1632 + when "1101" => divider_dec_rel <= 5515; --release rate: ( 9000mS / 1uS per clockcycle) / 1632 + when "1110" => divider_dec_rel <= 9191; --release rate: (15000mS / 1uS per clockcycle) / 1632 + when "1111" => divider_dec_rel <= 14706; --release rate: (24000mS / 1uS per clockcycle) / 1632 + when others => divider_dec_rel <= 0; -- + end case; + end if; + end if; +end process; + +end Behavioral; diff --git a/Commodore MAX/rtl/sigma_delta_dac.v b/Commodore MAX/rtl/sigma_delta_dac.v new file mode 100644 index 00000000..34cfd312 --- /dev/null +++ b/Commodore MAX/rtl/sigma_delta_dac.v @@ -0,0 +1,33 @@ +// +// PWM DAC +// +// MSBI is the highest bit number. NOT amount of bits! +// +module sigma_delta_dac #(parameter MSBI=18) +( + output reg DACout, //Average Output feeding analog lowpass + input [MSBI:0] DACin, //DAC input (excess 2**MSBI) + input CLK, + input RESET +); + +reg [MSBI+2:0] DeltaAdder; //Output of Delta Adder +reg [MSBI+2:0] SigmaAdder; //Output of Sigma Adder +reg [MSBI+2:0] SigmaLatch; //Latches output of Sigma Adder +reg [MSBI+2:0] DeltaB; //B input of Delta Adder + +always @(*) DeltaB = {SigmaLatch[MSBI+2], SigmaLatch[MSBI+2]} << (MSBI+1); +always @(*) DeltaAdder = DACin + DeltaB; +always @(*) SigmaAdder = DeltaAdder + SigmaLatch; + +always @(posedge CLK or posedge RESET) begin + if(RESET) begin + SigmaLatch <= 1'b1 << (MSBI+1); + DACout <= 1; + end else begin + SigmaLatch <= SigmaAdder; + DACout <= ~SigmaLatch[MSBI+2]; + end +end + +endmodule diff --git a/Commodore MAX/rtl/user_io.v b/Commodore MAX/rtl/user_io.v new file mode 100644 index 00000000..c66c515f --- /dev/null +++ b/Commodore MAX/rtl/user_io.v @@ -0,0 +1,411 @@ +// +// user_io.v +// +// user_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 . +// + +// parameter STRLEN and the actual length of conf_str have to match + +module user_io #(parameter STRLEN=0) ( + input [(8*STRLEN)-1:0] conf_str, + + input SPI_CLK, + input SPI_SS_IO, + output reg SPI_MISO, + input SPI_MOSI, + + 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 reg [7:0] status, + + // connection to sd card emulation + input [31:0] sd_lba, + input sd_rd, + input sd_wr, + output reg sd_ack, + input sd_conf, + input sd_sdhc, + output reg [7:0] sd_dout, + output reg sd_dout_strobe, + input [7:0] sd_din, + output reg sd_din_strobe, + + + // ps2 keyboard emulation + input ps2_clk, // 12-16khz provided by core + output ps2_kbd_clk, + output reg ps2_kbd_data, + output ps2_mouse_clk, + output reg ps2_mouse_data, + + // serial com port + input [7:0] serial_data, + input serial_strobe +); + +reg [6:0] sbuf; +reg [7:0] cmd; +reg [2:0] bit_cnt; // counts bits 0-7 0-7 ... +reg [7:0] byte_cnt; // counts bytes +reg [7:0] joystick0; +reg [7:0] joystick1; +reg [4:0] but_sw; +reg [2:0] stick_idx; + +assign buttons = but_sw[1:0]; +assign switches = but_sw[3:2]; +assign scandoubler_disable = but_sw[4]; + +// 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 }; + +// filter spi clock. the 8 bit gate delay is ~2.5ns in total +wire [7:0] spi_sck_D = { spi_sck_D[6:0], SPI_CLK } /* synthesis keep */; +wire spi_sck = (spi_sck && spi_sck_D != 8'h00) || (!spi_sck && spi_sck_D == 8'hff); + +// drive MISO only when transmitting core id +always@(negedge spi_sck or posedge SPI_SS_IO) begin + if(SPI_SS_IO == 1) begin + SPI_MISO <= 1'bZ; + end else begin + + // first byte returned is always core type, further bytes are + // command dependent + if(byte_cnt == 0) begin + SPI_MISO <= core_type[~bit_cnt]; + + end else begin + // reading serial fifo + if(cmd == 8'h1b) begin + // send alternating flag byte and data + if(byte_cnt[0]) SPI_MISO <= serial_out_status[~bit_cnt]; + else SPI_MISO <= serial_out_byte[~bit_cnt]; + end + + // reading config string + else if(cmd == 8'h14) begin + // returning a byte from string + if(byte_cnt < STRLEN + 1) + SPI_MISO <= conf_str[{STRLEN - byte_cnt,~bit_cnt}]; + else + SPI_MISO <= 1'b0; + end + + // reading sd card status + else if(cmd == 8'h16) begin + if(byte_cnt == 1) + SPI_MISO <= sd_cmd[~bit_cnt]; + else if((byte_cnt >= 2) && (byte_cnt < 6)) + SPI_MISO <= sd_lba[{5-byte_cnt, ~bit_cnt}]; + else + SPI_MISO <= 1'b0; + end + + // reading sd card write data + else if(cmd == 8'h18) + SPI_MISO <= sd_din[~bit_cnt]; + + else + SPI_MISO <= 1'b0; + end + end +end + +// ---------------- PS2 --------------------- + +// 8 byte fifos to store ps2 bytes +localparam PS2_FIFO_BITS = 3; + +// keyboard +reg [7:0] ps2_kbd_fifo [(2**PS2_FIFO_BITS)-1:0]; +reg [PS2_FIFO_BITS-1:0] ps2_kbd_wptr; +reg [PS2_FIFO_BITS-1:0] ps2_kbd_rptr; + +// ps2 transmitter state machine +reg [3:0] ps2_kbd_tx_state; +reg [7:0] ps2_kbd_tx_byte; +reg ps2_kbd_parity; + +assign ps2_kbd_clk = ps2_clk || (ps2_kbd_tx_state == 0); + +// ps2 transmitter +// Takes a byte from the FIFO and sends it in a ps2 compliant serial format. +reg ps2_kbd_r_inc; +always@(posedge ps2_clk) begin + ps2_kbd_r_inc <= 1'b0; + + if(ps2_kbd_r_inc) + ps2_kbd_rptr <= ps2_kbd_rptr + 1; + + // transmitter is idle? + if(ps2_kbd_tx_state == 0) begin + // data in fifo present? + if(ps2_kbd_wptr != ps2_kbd_rptr) begin + // load tx register from fifo + ps2_kbd_tx_byte <= ps2_kbd_fifo[ps2_kbd_rptr]; + ps2_kbd_r_inc <= 1'b1; + + // reset parity + ps2_kbd_parity <= 1'b1; + + // start transmitter + ps2_kbd_tx_state <= 4'd1; + + // put start bit on data line + ps2_kbd_data <= 1'b0; // start bit is 0 + end + end else begin + + // transmission of 8 data bits + if((ps2_kbd_tx_state >= 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'b1; // stop bit is 1 + + // advance state machine + if(ps2_kbd_tx_state < 11) + ps2_kbd_tx_state <= ps2_kbd_tx_state + 4'd1; + else + ps2_kbd_tx_state <= 4'd0; + + end +end + +// mouse +reg [7:0] ps2_mouse_fifo [(2**PS2_FIFO_BITS)-1:0]; +reg [PS2_FIFO_BITS-1:0] ps2_mouse_wptr; +reg [PS2_FIFO_BITS-1:0] ps2_mouse_rptr; + +// ps2 transmitter state machine +reg [3:0] ps2_mouse_tx_state; +reg [7:0] ps2_mouse_tx_byte; +reg ps2_mouse_parity; + +assign ps2_mouse_clk = ps2_clk || (ps2_mouse_tx_state == 0); + +// ps2 transmitter +// Takes a byte from the FIFO and sends it in a ps2 compliant serial format. +reg ps2_mouse_r_inc; +always@(posedge ps2_clk) begin + ps2_mouse_r_inc <= 1'b0; + + if(ps2_mouse_r_inc) + ps2_mouse_rptr <= ps2_mouse_rptr + 1; + + // transmitter is idle? + if(ps2_mouse_tx_state == 0) begin + // data in fifo present? + if(ps2_mouse_wptr != ps2_mouse_rptr) begin + // load tx register from fifo + ps2_mouse_tx_byte <= ps2_mouse_fifo[ps2_mouse_rptr]; + ps2_mouse_r_inc <= 1'b1; + + // reset parity + ps2_mouse_parity <= 1'b1; + + // start transmitter + ps2_mouse_tx_state <= 4'd1; + + // put start bit on data line + ps2_mouse_data <= 1'b0; // start bit is 0 + end + end else begin + + // transmission of 8 data bits + if((ps2_mouse_tx_state >= 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'b1; // stop bit is 1 + + // advance state machine + if(ps2_mouse_tx_state < 11) + ps2_mouse_tx_state <= ps2_mouse_tx_state + 4'd1; + else + ps2_mouse_tx_state <= 4'd0; + + end +end + +// fifo to receive serial data from core to be forwarded to io controller + +// 16 byte fifo to store serial bytes +localparam SERIAL_OUT_FIFO_BITS = 6; +reg [7:0] serial_out_fifo [(2**SERIAL_OUT_FIFO_BITS)-1:0]; +reg [SERIAL_OUT_FIFO_BITS-1:0] serial_out_wptr; +reg [SERIAL_OUT_FIFO_BITS-1:0] serial_out_rptr; + +wire serial_out_data_available = serial_out_wptr != serial_out_rptr; +wire [7:0] serial_out_byte = serial_out_fifo[serial_out_rptr] /* synthesis keep */; +wire [7:0] serial_out_status = { 7'b1000000, serial_out_data_available}; + +// status[0] is reset signal from io controller and is thus used to flush +// the fifo +always @(posedge serial_strobe or posedge status[0]) begin + if(status[0] == 1) begin + serial_out_wptr <= 0; + end else begin + serial_out_fifo[serial_out_wptr] <= serial_data; + serial_out_wptr <= serial_out_wptr + 1; + end +end + +always@(negedge spi_sck or posedge status[0]) begin + if(status[0] == 1) begin + serial_out_rptr <= 0; + end else begin + if((byte_cnt != 0) && (cmd == 8'h1b)) begin + // read last bit -> advance read pointer + if((bit_cnt == 7) && !byte_cnt[0] && serial_out_data_available) + serial_out_rptr <= serial_out_rptr + 1; + end + end +end + +// SPI receiver +always@(posedge spi_sck or posedge SPI_SS_IO) begin + + if(SPI_SS_IO == 1) begin + bit_cnt <= 3'd0; + byte_cnt <= 8'd0; + sd_ack <= 1'b0; + sd_dout_strobe <= 1'b0; + sd_din_strobe <= 1'b0; + end else begin + sd_dout_strobe <= 1'b0; + sd_din_strobe <= 1'b0; + + sbuf[6:0] <= { sbuf[5:0], SPI_MOSI }; + bit_cnt <= bit_cnt + 3'd1; + if((bit_cnt == 7)&&(byte_cnt != 8'd255)) + byte_cnt <= byte_cnt + 8'd1; + + // finished reading command byte + if(bit_cnt == 7) begin + if(byte_cnt == 0) begin + cmd <= { sbuf, SPI_MOSI}; + + // fetch first byte when sectore FPGA->IO command has been seen + if({ sbuf, SPI_MOSI} == 8'h18) + sd_din_strobe <= 1'b1; + + if(({ sbuf, SPI_MOSI} == 8'h17) || ({ sbuf, SPI_MOSI} == 8'h18)) + sd_ack <= 1'b1; + + end else begin + + // buttons and switches + if(cmd == 8'h01) + but_sw <= { sbuf[3:0], SPI_MOSI }; + + if(cmd == 8'h02) + joystick_0 <= { sbuf, SPI_MOSI }; + + if(cmd == 8'h03) + joystick_1 <= { sbuf, SPI_MOSI }; + + if(cmd == 8'h04) begin + // store incoming ps2 mouse bytes + ps2_mouse_fifo[ps2_mouse_wptr] <= { sbuf, SPI_MOSI }; + ps2_mouse_wptr <= ps2_mouse_wptr + 1; + end + + if(cmd == 8'h05) begin + // store incoming ps2 keyboard bytes + ps2_kbd_fifo[ps2_kbd_wptr] <= { sbuf, SPI_MOSI }; + ps2_kbd_wptr <= ps2_kbd_wptr + 1; + end + + if(cmd == 8'h15) + status <= { sbuf[6:0], SPI_MOSI }; + + // send sector IO -> FPGA + if(cmd == 8'h17) begin + // flag that download begins + sd_dout <= { sbuf, SPI_MOSI}; + sd_dout_strobe <= 1'b1; + end + + // send sector FPGA -> IO + if(cmd == 8'h18) + sd_din_strobe <= 1'b1; + + // send SD config IO -> FPGA + if(cmd == 8'h19) begin + // flag that download begins + sd_dout <= { sbuf, SPI_MOSI}; + // sd card knows data is config if sd_dout_strobe is asserted + // with sd_ack still being inactive (low) + sd_dout_strobe <= 1'b1; + end + + // joystick analog + if(cmd == 8'h1a) begin + // first byte is joystick indes + if(byte_cnt == 1) + stick_idx <= { sbuf[1:0], SPI_MOSI }; + else if(byte_cnt == 2) begin + // second byte is x axis + if(stick_idx == 0) + joystick_analog_0[15:8] <= { sbuf, SPI_MOSI }; + else if(stick_idx == 1) + joystick_analog_1[15:8] <= { sbuf, SPI_MOSI }; + end else if(byte_cnt == 3) begin + // third byte is y axis + if(stick_idx == 0) + joystick_analog_0[7:0] <= { sbuf, SPI_MOSI }; + else if(stick_idx == 1) + joystick_analog_1[7:0] <= { sbuf, SPI_MOSI }; + end + end + + end + end + end +end + +endmodule diff --git a/Commodore MAX/rtl/vic_656x_a.vhd b/Commodore MAX/rtl/vic_656x_a.vhd new file mode 100644 index 00000000..7333518f --- /dev/null +++ b/Commodore MAX/rtl/vic_656x_a.vhd @@ -0,0 +1,1447 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- VIC-II - Video Interface Chip no 2 +-- +-- ----------------------------------------------------------------------- +-- Dar 08/03/2014 : shift hsync to sprite #3 +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +architecture rtl of vic_656x is + type vicCycles is ( + cycleRefresh1, cycleRefresh2, cycleRefresh3, cycleRefresh4, cycleRefresh5, + cycleIdle1, + cycleChar, + cycleCalcSprites, cycleSpriteBa1, cycleSpriteBa2, cycleSpriteBa3, + cycleSpriteA, cycleSpriteB + ); + subtype ColorDef is unsigned(3 downto 0); + type MFlags is array(0 to 7) of boolean; + type MXdef is array(0 to 7) of unsigned(8 downto 0); + type MYdef is array(0 to 7) of unsigned(7 downto 0); + type MCntDef is array(0 to 7) of unsigned(5 downto 0); + type MPixelsDef is array(0 to 7) of unsigned(23 downto 0); + type MCurrentPixelDef is array(0 to 7) of unsigned(1 downto 0); + type charStoreDef is array(38 downto 0) of unsigned(11 downto 0); + type spriteColorsDef is array(7 downto 0) of unsigned(3 downto 0); + type pixelColorStoreDef is array(7 downto 0) of unsigned(3 downto 0); + +-- State machine + signal lastLineFlag : boolean; -- True for on last line of the frame. + signal beyondFrameFlag : boolean; -- Y>frame lines + signal vicCycle : vicCycles := cycleRefresh1; + signal sprite : unsigned(2 downto 0) := "000"; + signal shiftChars : boolean; + signal idle: std_logic := '1'; + signal rasterIrqDone : std_logic; -- Only one interrupt each rasterLine + signal rasterEnable: std_logic; + +-- BA signal + signal badLine : boolean; -- true if we have a badline condition + signal baLoc : std_logic; + signal baCnt : unsigned(2 downto 0); + + signal baChars : std_logic; + signal baSprite04 : std_logic; + signal baSprite15 : std_logic; + signal baSprite26 : std_logic; + signal baSprite37 : std_logic; + +-- Memory refresh cycles + signal refreshCounter : unsigned(7 downto 0); + +-- User registers + signal MX : MXdef; -- Sprite X + signal MY : MYdef; -- Sprite Y + signal ME : unsigned(7 downto 0); -- Sprite enable + signal MXE : unsigned(7 downto 0); -- Sprite X expansion + signal MYE : unsigned(7 downto 0); -- Sprite Y expansion + signal MPRIO : unsigned(7 downto 0); -- Sprite priority + signal MC : unsigned(7 downto 0); -- sprite multi color + + -- !!! Krestage 3 hacks + signal MCDelay : unsigned(7 downto 0); -- sprite multi color + + -- mode + signal BMM: std_logic; -- Bitmap mode + signal ECM: std_logic; -- Extended color mode + signal MCM: std_logic; -- Multi color mode + signal DEN: std_logic; -- DMA enable + signal RSEL: std_logic; -- Visible rows selection (24/25) + signal CSEL: std_logic; -- Visible columns selection (38/40) + + signal RES: std_logic; + + signal VM: unsigned(13 downto 10); + signal CB: unsigned(13 downto 11); + + signal EC : ColorDef; -- border color + signal B0C : ColorDef; -- background color 0 + signal B1C : ColorDef; -- background color 1 + signal B2C : ColorDef; -- background color 2 + signal B3C : ColorDef; -- background color 3 + signal MM0 : ColorDef; -- sprite multicolor 0 + signal MM1 : ColorDef; -- sprite multicolor 1 + signal spriteColors: spriteColorsDef; + +-- borders and blanking + signal LRBorder: std_logic; + signal TBBorder: std_logic; + signal hBlack: std_logic; + signal vBlanking : std_logic; + signal hBlanking : std_logic; + signal xscroll: unsigned(2 downto 0); + signal yscroll: unsigned(2 downto 0); + signal rasterCmp : unsigned(8 downto 0); + +-- Address generator + signal vicAddrReg : unsigned(13 downto 0); + signal vicAddrLoc : unsigned(13 downto 0); + +-- Address counters + signal ColCounter: unsigned(9 downto 0) := (others => '0'); + signal ColRestart: unsigned(9 downto 0) := (others => '0'); + signal RowCounter: unsigned(2 downto 0) := (others => '0'); + +-- IRQ Registers + signal IRST: std_logic := '0'; + signal ERST: std_logic := '0'; + signal IMBC: std_logic := '0'; + signal EMBC: std_logic := '0'; + signal IMMC: std_logic := '0'; + signal EMMC: std_logic := '0'; + signal ILP: std_logic := '0'; + signal ELP: std_logic := '0'; + signal IRQ: std_logic; + +-- Collision detection registers + signal M2M: unsigned(7 downto 0); -- Sprite to sprite collision + signal M2D: unsigned(7 downto 0); -- Sprite to character collision + signal M2Mhit : std_logic; + signal M2Dhit : std_logic; + +-- Raster counters + signal rasterX : unsigned(9 downto 0) := (others => '0'); + signal rasterY : unsigned(8 downto 0) := (others => '0'); + +-- Light pen + signal lightPenHit: std_logic; + signal lpX : unsigned(7 downto 0); + signal lpY : unsigned(7 downto 0); + +-- IRQ Resets + signal resetLightPenIrq: std_logic; + signal resetIMMC : std_logic; + signal resetIMBC : std_logic; + signal resetRasterIrq : std_logic; + +-- Character generation + signal charStore: charStoreDef; + signal nextChar : unsigned(11 downto 0); + -- Char/Pixels just coming from memory + signal readChar : unsigned(11 downto 0); + signal readPixels : unsigned(7 downto 0); + -- Char/Pixels pair waiting to be shifted + signal waitingChar : unsigned(11 downto 0); + signal waitingPixels : unsigned(7 downto 0); + -- Stores colorinfo and the Pixels that are currently in shift register + signal shiftingChar : unsigned(11 downto 0); + signal shiftingPixels : unsigned(7 downto 0); + signal shifting_ff : std_logic; -- Multicolor shift-regiter status bit. + +-- Sprite work registers + signal MPtr : unsigned(7 downto 0); -- sprite base pointer + signal MPixels : MPixelsDef; -- Sprite 24 bit shift register + signal MActive : MFlags; -- Sprite is active (derived from MCnt) + signal MCnt : MCntDef; + signal MXE_ff : unsigned(7 downto 0); -- Sprite X expansion flipflop + signal MYE_ff : unsigned(7 downto 0); -- Sprite Y expansion flipflop + signal MC_ff : unsigned(7 downto 0); -- controls sprite shift-register in multicolor + signal MShift : MFlags; -- Sprite is shifting + signal MCurrentPixel : MCurrentPixelDef; + +-- Current colors and pixels + signal pixelColor: ColorDef; + signal pixelBgFlag: std_logic; -- For collision detection + signal pixelDelay: pixelColorStoreDef; + +-- Read/Write lines + signal myWr : std_logic; + signal myRd : std_logic; + +begin +-- ----------------------------------------------------------------------- +-- Ouput signals +-- ----------------------------------------------------------------------- + ba <= baLoc; + vicAddr <= vicAddrReg when registeredAddress else vicAddrLoc; + hSync <= hBlanking; + vSync <= vBlanking; + irq_n <= not IRQ; + +-- ----------------------------------------------------------------------- +-- chip-select signals +-- ----------------------------------------------------------------------- + myWr <= cs and we; + myRd <= cs and rd; + +-- ----------------------------------------------------------------------- +-- debug signals +-- ----------------------------------------------------------------------- + debugX <= rasterX; + debugY <= rasterY; + +-- ----------------------------------------------------------------------- +-- Badline condition +-- ----------------------------------------------------------------------- + process(rasterY, yscroll, rasterEnable) + begin + badLine <= false; + if (rasterY(2 downto 0) = yscroll) + and (rasterEnable = '1') then + badLine <= true; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- BA=low counter +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if baLoc = '0' then + if phi = '0' + and enaData = '1' + and baCnt(2) = '0' then + baCnt <= baCnt + 1; + end if; + else + baCnt <= (others => '0'); + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Calculate lastLineFlag +-- ----------------------------------------------------------------------- + process(clk) + variable rasterLines : integer range 0 to 312; + begin + if rising_edge(clk) then + lastLineFlag <= false; + + rasterLines := 311; -- PAL + if mode6567old = '1' then + rasterLines := 261; -- NTSC (R7 and earlier have 262 lines) + end if; + if mode6567R8 = '1' then + rasterLines := 262; -- NTSC (R8 and newer have 263 lines) + end if; + if rasterY = rasterLines then + lastLineFlag <= true; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- State machine +-- ----------------------------------------------------------------------- +vicStateMachine: process(clk) + begin + if rising_edge(clk) then + if enaData = '1' + and baSync = '0' then + if phi = '0' then + case vicCycle is + when cycleRefresh1 => + vicCycle <= cycleRefresh2; + if ((mode6567old or mode6567R8) = '1') then + vicCycle <= cycleIdle1; + end if; + when cycleIdle1 => vicCycle <= cycleRefresh2; + when cycleRefresh2 => vicCycle <= cycleRefresh3; + when cycleRefresh3 => vicCycle <= cycleRefresh4; + when cycleRefresh4 => vicCycle <= cycleRefresh5; -- X=0..7 on this cycle + when cycleRefresh5 => vicCycle <= cycleChar; + when cycleChar => + if ((mode6569 = '1') and rasterX(9 downto 3) = "0100111") -- PAL + or ((mode6567old = '1') and rasterX(9 downto 3) = "0100111") -- Old NTSC + or ((mode6567R8 = '1') and rasterX(9 downto 3) = "0101000") -- New NTSC + or ((mode6572 = '1') and rasterX(9 downto 3) = "0101000") then -- PAL-N + vicCycle <= cycleCalcSprites; + end if; + when cycleCalcSprites => vicCycle <= cycleSpriteBa1; + when cycleSpriteBa1 => vicCycle <= cycleSpriteBa2; + when cycleSpriteBa2 => vicCycle <= cycleSpriteBa3; + when others => + null; + end case; + else + case vicCycle is + when cycleSpriteBa3 => vicCycle <= cycleSpriteA; + when cycleSpriteA => + vicCycle <= cycleSpriteB; + when cycleSpriteB => + vicCycle <= cycleSpriteA; + if sprite = 7 then + vicCycle <= cycleRefresh1; + end if; + when others => + null; + end case; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Iterate through all sprites. +-- Only used when state-machine above is in any sprite cycles. +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '1' + and enaData = '1' + and vicCycle = cycleSpriteB + and baSync = '0' then + sprite <= sprite + 1; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Address generator +-- ----------------------------------------------------------------------- + process(phi, vicCycle, sprite, shiftChars, idle, + VM, CB, ECM, BMM, nextChar, colCounter, rowCounter, MPtr, MCnt) + begin + -- + -- Default case ($3FFF fetches) + vicAddrLoc <= (others => '1'); + if (idle = '0') + and shiftChars then + if BMM = '1' then + vicAddrLoc <= CB(13) & colCounter & rowCounter; + else + vicAddrLoc <= CB & nextChar(7 downto 0) & rowCounter; + end if; + end if; + if ECM = '1' then + vicAddrLoc(10 downto 9) <= "00"; + end if; + + case vicCycle is + when cycleRefresh1 | cycleRefresh2 | cycleRefresh3 | cycleRefresh4 | cycleRefresh5 => + if emulateRefresh then + vicAddrLoc <= "111111" & refreshCounter; + else + vicAddrLoc <= (others => '-'); + end if; + when cycleSpriteBa1 | cycleSpriteBa2 | cycleSpriteBa3 => + vicAddrLoc <= (others => '1'); + when cycleSpriteA => + vicAddrLoc <= VM & "1111111" & sprite; + if phi = '1' then + vicAddrLoc <= MPtr & MCnt(to_integer(sprite)); + end if; + when cycleSpriteB => + vicAddrLoc <= MPtr & MCnt(to_integer(sprite)); + when others => + if phi = '1' then + vicAddrLoc <= VM & colCounter; + end if; + end case; + end process; + + -- Registered address + process(clk) + begin + if rising_edge(clk) then + vicAddrReg <= vicAddrLoc; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Character storage +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if enaData = '1' + and shiftChars + and phi = '1' then + if badLine then + nextChar(7 downto 0) <= datai; + nextChar(11 downto 8) <= diColor; + else + nextChar <= charStore(38); + end if; + charStore <= charStore(37 downto 0) & nextChar; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Sprite base pointer (MPtr) +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '0' + and enaData = '1' + and vicCycle = cycleSpriteA then + MPtr <= (others => '1'); + if MActive(to_integer(sprite)) then + MPtr <= datai; + end if; + + -- If refresh counter is not emulated we don't care about + -- MPtr having the correct value in idle state. + if not emulateRefresh then + MPtr <= datai; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Refresh counter +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + vicRefresh <= '0'; + case vicCycle is + when cycleRefresh1 | cycleRefresh2 | cycleRefresh3 | cycleRefresh4 | cycleRefresh5 => + vicRefresh <= '1'; + if phi = '0' + and enaData = '1' + and baSync = '0' then + refreshCounter <= refreshCounter - 1; + end if; + when others => + null; + end case; + if lastLineFlag then + refreshCounter <= (others => '1'); + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Generate Raster Enable +-- ----------------------------------------------------------------------- + process(clk) + begin + -- Enable screen and character display. + -- This is only possible in line 48 on the VIC-II. + -- On other lines any DEN changes are ignored. + if rising_edge(clk) then + if (rasterY = 48) and (DEN = '1') then + rasterEnable <= '1'; + end if; + if (rasterY = 248) then + rasterEnable <= '0'; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- BA generator (Text/Bitmap) +-- ----------------------------------------------------------------------- +-- +-- For Text/Bitmap BA goes low 3 cycles before real access. So BA starts +-- going low during refresh2 state. See diagram below for timing: +-- +-- X 0 0 0 0 0 +-- 0 0 0 0 1 +-- 0 4 8 C 0 +-- +-- phi ___ ___ ___ ___ ___ ___ ___ ___... +-- ___ ___ ___ ___ ___ ___ ___ ... +-- +-- | | | | | | |... +-- rfr2 rfr3 rfr4 rfr5 char1 char2 char3 +-- +-- BA _______ +-- \\\_______________________________________ +-- | 1 | 2 | 3 | +-- +-- BACnt 000 001 | 010 | 011 | 100 100 100 ... +-- +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '0' then + baChars <= '1'; + case vicCycle is + when cycleRefresh2 | cycleRefresh3 | cycleRefresh4 | cycleRefresh5 => + if badLine then + baChars <= '0'; + end if; + when others => + if rasterX(9 downto 3) < "0101000" + and badLine then + baChars <= '0'; + end if; + end case; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- BA generator (Sprites) +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '0' then + if sprite = 1 then + baSprite04 <= '1'; + end if; + if sprite = 2 then + baSprite15 <= '1'; + end if; + if sprite = 3 then + baSprite26 <= '1'; + end if; + if sprite = 4 then + baSprite37 <= '1'; + end if; + if sprite = 5 then + baSprite04 <= '1'; + end if; + if sprite = 6 then + baSprite15 <= '1'; + end if; + if sprite = 7 then + baSprite26 <= '1'; + end if; + if vicCycle = cycleRefresh1 then + baSprite37 <= '1'; + end if; + + if MActive(0) and (vicCycle = cycleCalcSprites) then + baSprite04 <= '0'; + end if; + if MActive(1) and (vicCycle = cycleSpriteBa2) then + baSprite15 <= '0'; + end if; + if MActive(2) and (vicCycle = cycleSpriteB) and (sprite = 0) then + baSprite26 <= '0'; + end if; + if MActive(3) and (vicCycle = cycleSpriteB) and (sprite = 1) then + baSprite37 <= '0'; + end if; + if MActive(4) and (vicCycle = cycleSpriteB) and (sprite = 2) then + baSprite04 <= '0'; + end if; + if MActive(5) and (vicCycle = cycleSpriteB) and (sprite = 3) then + baSprite15 <= '0'; + end if; + if MActive(6) and (vicCycle = cycleSpriteB) and (sprite = 4) then + baSprite26 <= '0'; + end if; + if MActive(7) and (vicCycle = cycleSpriteB) and (sprite = 5) then + baSprite37 <= '0'; + end if; + end if; + end if; + end process; + baLoc <= baChars and baSprite04 and baSprite15 and baSprite26 and baSprite37; + +-- ----------------------------------------------------------------------- +-- Address valid? +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + addrValid <= '0'; + if phi = '0' + or baCnt(2) = '1' then + addrValid <= '1'; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Generate ShiftChars flag +-- ----------------------------------------------------------------------- + process(rasterX) + begin + shiftChars <= false; + if rasterX(9 downto 3) > "0000000" + and rasterX(9 downto 3) < "0101001" then + shiftChars <= true; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- RowCounter and ColCounter +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '0' + and enaData = '1' + and baSync = '0' then + if shiftChars + and idle = '0' then + colCounter <= colCounter + 1; + end if; + case vicCycle is + when cycleRefresh4 => + colCounter <= colRestart; + if badline then + rowCounter <= (others => '0'); + end if; + when cycleSpriteA => + if sprite = "000" then + if rowCounter = 7 then + colRestart <= colCounter; + idle <= '1'; + else + rowCounter <= rowCounter + 1; + end if; + if badline then + rowCounter <= rowCounter + 1; + end if; + end if; + when others => + null; + end case; + if lastLineFlag then + -- Reset column counter outside visible range. + colRestart <= (others => '0'); + end if; + + -- Set display mode (leave idle-mode) as soon as + -- there is a badline condition. + if badline then + idle <= '0'; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- X/Y Raster counter +-- ----------------------------------------------------------------------- +rasterCounters: process(clk) + begin + if rising_edge(clk) then + if enaPixel = '1' then + rasterX(2 downto 0) <= rasterX(2 downto 0) + 1; + end if; + if phi = '0' + and enaData = '1' + and baSync = '0' then + rasterX(9 downto 3) <= rasterX(9 downto 3) + 1; + rasterX(2 downto 0) <= (others => '0'); + if vicCycle = cycleRefresh4 then + rasterX <= (others => '0'); + end if; + end if; + if phi = '1' + and enaData = '1' + and baSync = '0' then + beyondFrameFlag <= false; + if (vicCycle = cycleSpriteB) + and (sprite = 2) then + rasterY <= rasterY + 1; + beyondFrameFlag <= lastLineFlag; + end if; + if beyondFrameFlag then + rasterY <= (others => '0'); + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Raster IRQ +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '1' + and enaData = '1' + and baSync = '0' + and (vicCycle = cycleSpriteB) + and (sprite = 2) then + rasterIrqDone <= '0'; + end if; + if resetRasterIrq = '1' then + IRST <= '0'; + end if; + if (rasterIrqDone = '0') + and (rasterY = rasterCmp) then + rasterIrqDone <= '1'; + IRST <= '1'; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- Light pen +-- ----------------------------------------------------------------------- +-- On a negative edge on the LP input, the current position of the raster beam +-- is latched in the registers LPX ($d013) and LPY ($d014). LPX contains the +-- upper 8 bits (of 9) of the X position and LPY the lower 8 bits (likewise of +-- 9) of the Y position. So the horizontal resolution of the light pen is +-- limited to 2 pixels. + +-- Only one negative edge on LP is recognized per frame. If multiple edges +-- occur on LP, all following ones are ignored. The trigger is not released +-- until the next vertical blanking interval. +-- ----------------------------------------------------------------------- +lightPen: process(clk) + begin + if rising_edge(clk) then + if emulateLightpen then + if resetLightPenIrq = '1' then + -- Reset light pen interrupt + ILP <= '0'; + end if; + if lastLineFlag then + -- Reset lightpen state at beginning of frame + lightPenHit <= '0'; + elsif (lightPenHit = '0') and (lp_n = '0') then + -- One hit/frame + lightPenHit <= '1'; + -- Toggle Interrupt + ILP <= '1'; + -- Store position of beam + lpx <= rasterX(8 downto 1); + lpy <= rasterY(7 downto 0); + end if; + else + ILP <= '0'; + lpx <= (others => '1'); + lpy <= (others => '1'); + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- VSync +-- ----------------------------------------------------------------------- +doVBlanking: process(clk, mode6569, mode6567old, mode6567R8) + variable rasterBlank : integer range 0 to 300; + begin + rasterBlank := 300; + if (mode6567old or mode6567R8) = '1' then + rasterBlank := 12; + end if; + if rising_edge(clk) then + vBlanking <= '0'; + if rasterY = rasterBlank then + vBlanking <= '1'; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- HSync +-- ----------------------------------------------------------------------- +doHBlanking: process(clk) + begin + if rising_edge(clk) then + if sprite = 3 then + hBlack <= '1'; + end if; + if vicCycle = cycleRefresh1 then + hBlack <= '0'; + end if; + if sprite = 3 then -- dar 5 then + hBlanking <= '1'; + else + hBlanking <= '0'; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Borders +-- ----------------------------------------------------------------------- +calcBorders: process(clk) + variable newTBBorder: std_logic; + begin + if rising_edge(clk) then + if enaPixel = '1' then + -- + -- Calc top/bottom border + newTBBorder := TBBorder; +-- if (rasterY = 55) and (RSEL = '0') and (rasterEnable = '1') then + if (rasterY = 55) and (rasterEnable = '1') then + newTBBorder := '0'; + end if; + if (rasterY = 51) and (RSEL = '1') and (rasterEnable = '1') then + newTBBorder := '0'; + end if; + if (rasterY = 247) and (RSEL = '0') then + newTBBorder := '1'; + end if; + if (rasterY = 251) and (RSEL = '1') then + newTBBorder := '1'; + end if; + + -- + -- Calc left/right border + if (rasterX = (31+1)) and (CSEL = '0') then + LRBorder <= newTBBorder; + TBBorder <= newTBBorder; + end if; + if (rasterX = (24+1)) and (CSEL = '1') then + LRBorder <= newTBBorder; + TBBorder <= newTBBorder; + end if; + if (rasterX = (335+1)) and (CSEL = '0') then + LRBorder <= '1'; + end if; + if (rasterX = (344+1)) and (CSEL = '1') then + LRBorder <= '1'; + end if; + end if; + end if; + end process; + + +-- ----------------------------------------------------------------------- +-- Pixel generator for Text/Bitmap screen +-- ----------------------------------------------------------------------- +calcBitmap: process(clk) + variable multiColor : std_logic; + begin + if rising_edge(clk) then + if enaPixel = '1' then + -- + -- Toggle flipflop for multicolor 2-bits shift. + shifting_ff <= not shifting_ff; + + -- + -- Multicolor mode is active with MCM, but for character + -- mode it depends on bit3 of color ram too. + multiColor := MCM and (BMM or ECM or shiftingChar(11)); + + -- + -- Reload shift register when xscroll=rasterX + -- otherwise shift pixels + if xscroll = rasterX(2 downto 0) then + shifting_ff <= '0'; + shiftingChar <= waitingChar; + shiftingPixels <= waitingPixels; + elsif multiColor = '0' then + shiftingPixels <= shiftingPixels(6 downto 0) & '0'; + elsif shifting_ff = '1' then + shiftingPixels <= shiftingPixels(5 downto 0) & "00"; + end if; + + -- + -- Calculate if pixel is in foreground or background + pixelBgFlag <= shiftingPixels(7); + + -- + -- Calculate color of next pixel + pixelColor <= B0C; + if (BMM = '0') and (ECM='0') then + if (multiColor = '0') then + -- normal character mode + if shiftingPixels(7) = '1' then + pixelColor <= shiftingChar(11 downto 8); + end if; + else + -- multi-color character mode + case shiftingPixels(7 downto 6) is + when "01" => pixelColor <= B1C; + when "10" => pixelColor <= B2C; + when "11" => pixelColor <= '0' & shiftingChar(10 downto 8); + when others => null; + end case; + end if; + elsif (MCM = '0') and (BMM = '0') and (ECM='1') then + -- extended-color character mode + -- multiple background colors but only 64 characters + if shiftingPixels(7) = '1' then + pixelColor <= shiftingChar(11 downto 8); + else + case shiftingChar(7 downto 6) is + when "01" => pixelColor <= B1C; + when "10" => pixelColor <= B2C; + when "11" => pixelColor <= B3C; + when others => null; + end case; + end if; + elsif emulateGraphics and (MCM = '0') and (BMM = '1') and (ECM='0') then + -- highres bitmap mode + if shiftingPixels(7) = '1' then + pixelColor <= shiftingChar(7 downto 4); + else + pixelColor <= shiftingChar(3 downto 0); + end if; + elsif emulateGraphics and (MCM = '1') and (BMM = '1') and (ECM='0') then + -- Multi-color bitmap mode + case shiftingPixels(7 downto 6) is + when "01" => pixelColor <= shiftingChar(7 downto 4); + when "10" => pixelColor <= shiftingChar(3 downto 0); + when "11" => pixelColor <= shiftingChar(11 downto 8); + when others => null; + end case; + else + -- illegal display mode, the output is black + pixelColor <= "0000"; + end if; + end if; + + -- + -- Store fetched pixels, until current pixels are displayed + -- and shift-register is empty. + if enaData = '1' + and phi = '0' then + readPixels <= (others => '0'); + if shiftChars then + readPixels <= datai; + readChar <= (others => '0'); + if idle = '0' then + readChar <= nextChar; + end if; + end if; + -- Store the characters until shiftregister is empty + waitingPixels <= readPixels; + waitingChar <= readChar; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Which sprites are active? +-- ----------------------------------------------------------------------- + process(MCnt) + begin + for i in 0 to 7 loop + MActive(i) <= false; + if MCnt(i) /= 63 then + MActive(i) <= true; + end if; + end loop; + end process; + +-- ----------------------------------------------------------------------- +-- Sprite byte counter +-- Y expansion flipflop +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '0' + and enaData = '1' then + case vicCycle is + when cycleRefresh5 => + for i in 0 to 7 loop + MYE_ff(i) <= not MYE_ff(i); + if MActive(i) then + if MYE_ff(i) = MYE(i) then + MCnt(i) <= MCnt(i) + 1; + else + MCnt(i) <= MCnt(i) - 2; + end if; + end if; + end loop; + when others => + null; + end case; + end if; + for i in 0 to 7 loop + if MYE(i) = '0' + or not MActive(i) then + MYE_ff(i) <= '0'; + end if; + end loop; + + -- + -- On cycleCalcSprite check for each inactive sprite if + -- there is a Y match. Reset MCnt if this is so. + -- + -- The RasterX counter is used here to multiplex the compare logic. + -- This saves a few logic cells in the FPGA. + if vicCycle = cycleCalcSprites then + if (not MActive(to_integer(RasterX(2 downto 0)))) + and (ME(to_integer(RasterX(2 downto 0))) = '1') + and (rasterY(7 downto 0) = MY(to_integer(RasterX(2 downto 0)))) then + MCnt(to_integer(RasterX(2 downto 0))) <= (others => '0'); + end if; + end if; + -- + -- Original non-multiplexed version +-- if vicCycle = cycleCalcSprites then +-- for i in 0 to 7 loop +-- if (not MActive(i)) +-- and (ME(i) = '1') +-- and (rasterY(7 downto 0) = MY(i)) then +-- MCnt(i) <= (others => '0'); +-- end if; +-- end loop; +-- end if; + + -- + -- Increment MCnt after fetching data. + if enaData = '1' then + if (vicCycle = cycleSpriteA and phi = '1') + or (vicCycle = cycleSpriteB and phi = '0') then + if MActive(to_integer(sprite)) then + MCnt(to_integer(sprite)) <= MCnt(to_integer(sprite)) + 1; + end if; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Sprite pixel Shift register +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if enaPixel = '1' then + -- Enable sprites on the correct X position + for i in 0 to 7 loop + if rasterX = MX(i) then + MShift(i) <= true; + end if; + end loop; + + -- Shift one pixel of the sprite from the shift register. + for i in 0 to 7 loop + if MShift(i) then + MXE_ff(i) <= (not MXE_ff(i)) and MXE(i); + if MXE_ff(i) = '0' then + MC_ff(i) <= (not MC_ff(i)) and MC(i); + if MC_ff(i) = '0' then + MCurrentPixel(i) <= MPixels(i)(23 downto 22); + end if; + MPixels(i) <= MPixels(i)(22 downto 0) & '0'; + end if; + else + MXE_ff(i) <= '0'; + MC_ff(i) <= '0'; + MCurrentPixel(i) <= "00"; + end if; + end loop; + end if; + + -- + -- Fill Sprite shift-register with new data. + if enaData = '1' then + if phi = '0' + and vicCycle = cycleSpriteA then + MShift(to_integer(sprite)) <= false; + end if; + + if Mactive(to_integer(sprite)) then + if phi = '0' then + case vicCycle is + when cycleSpriteB => + MPixels(to_integer(sprite)) <= MPixels(to_integer(sprite))(15 downto 0) & datai; + when others => null; + end case; + else + case vicCycle is + when cycleSpriteA | cycleSpriteB => + MPixels(to_integer(sprite)) <= MPixels(to_integer(sprite))(15 downto 0) & datai; + when others => null; + end case; + end if; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Video output +-- ----------------------------------------------------------------------- + process(clk) + variable myColor: unsigned(3 downto 0); + variable muxSprite : unsigned(2 downto 0); + variable muxColor : unsigned(1 downto 0); + -- 00 = pixels + -- 01 = MM0 + -- 10 = Sprite + -- 11 = MM1 + begin + if rising_edge(clk) then + muxColor := "00"; + muxSprite := (others => '-'); + for i in 7 downto 0 loop + if (MPRIO(i) = '0') or (pixelBgFlag = '0') then + if MC(i) = '1' then + if MCurrentPixel(i) /= "00" then + muxColor := MCurrentPixel(i); + muxSprite := to_unsigned(i, 3); + end if; + elsif MCurrentPixel(i)(1) = '1' then + muxColor := "10"; + muxSprite := to_unsigned(i, 3); + end if; + end if; + end loop; + + myColor := pixelColor; + case muxColor is + when "01" => myColor := MM0; + when "10" => myColor := spriteColors(to_integer(muxSprite)); + when "11" => myColor := MM1; + when others => + null; + end case; + + +-- myColor := pixelColor; +-- for i in 7 downto 0 loop +-- if (MPRIO(i) = '0') or (pixelBgFlag = '0') then +-- if MC(i) = '1' then +-- case MCurrentPixel(i) is +-- when "01" => myColor := MM0; +-- when "10" => myColor := spriteColors(i); +-- when "11" => myColor := MM1; +-- when others => null; +-- end case; +-- elsif MCurrentPixel(i)(1) = '1' then +-- myColor := spriteColors(i); +-- end if; +-- end if; +-- end loop; + + if enaPixel = '1' then + colorIndex <= myColor; + +-- Krestage 3 debugging routine +-- if (cs = '1' and aRegisters = "011100") then +-- colorIndex <= "1111"; +-- end if; + if (LRBorder = '1') or (TBBorder = '1') then + colorIndex <= EC; + end if; + if (hBlack = '1') then + colorIndex <= (others => '0'); + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Sprite to sprite collision +-- ----------------------------------------------------------------------- +spriteSpriteCollision: process(clk) + variable collision : unsigned(7 downto 0); + begin + if rising_edge(clk) then + if resetIMMC = '1' then + IMMC <= '0'; + end if; + + if (myRd = '1') + and (aRegisters = "011110") then + M2M <= (others => '0'); + M2Mhit <= '0'; + end if; + + for i in 0 to 7 loop + collision(i) := MCurrentPixel(i)(1); + end loop; + if (collision /= "00000000") + and (collision /= "00000001") + and (collision /= "00000010") + and (collision /= "00000100") + and (collision /= "00001000") + and (collision /= "00010000") + and (collision /= "00100000") + and (collision /= "01000000") + and (collision /= "10000000") + and (TBBorder = '0') then + M2M <= M2M or collision; + + -- Give collision interrupt but only once until clear of register + if M2Mhit = '0' then + IMMC <= '1'; + M2Mhit <= '1'; + end if; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Sprite to background collision +-- ----------------------------------------------------------------------- +spriteBackgroundCollision: process(clk) + begin + if rising_edge(clk) then + if resetIMBC = '1' then + IMBC <= '0'; + end if; + + if (myRd = '1') + and (aRegisters = "011111") then + M2D <= (others => '0'); + M2Dhit <= '0'; + end if; + + for i in 0 to 7 loop + if MCurrentPixel(i)(1) = '1' + and pixelBgFlag = '1' + and (TBBorder = '0') then + M2D(i) <= '1'; + + -- Give collision interrupt but only once until clear of register + if M2Dhit = '0' then + IMBC <= '1'; + M2Dhit <= '1'; + end if; + end if; + end loop; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Generate IRQ signal +-- ----------------------------------------------------------------------- + IRQ <= (ILP and ELP) or (IMMC and EMMC) or (IMBC and EMBC) or (IRST and ERST); + +-- ----------------------------------------------------------------------- +-- Krestage 3 hack +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if phi = '1' + and enaData = '1' then + MC <= MCDelay; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Write registers +-- ----------------------------------------------------------------------- +writeRegisters: process(clk) + begin + if rising_edge(clk) then + resetLightPenIrq <= '0'; + resetIMMC <= '0'; + resetIMBC <= '0'; + resetRasterIrq <= '0'; + + -- + -- write to registers + if(reset = '1') then + MX(0) <= (others => '0'); + MX(1) <= (others => '0'); + MX(2) <= (others => '0'); + MX(3) <= (others => '0'); + MX(4) <= (others => '0'); + MX(5) <= (others => '0'); + MX(6) <= (others => '0'); + MX(7) <= (others => '0'); + rasterCmp <= (others => '0'); + ECM <= '0'; + BMM <= '0'; + DEN <= '0'; + RSEL <= '0'; + yscroll <= (others => '0'); + ME <= (others => '0'); + RES <= '0'; + MCM <= '0'; + CSEL <= '0'; + xscroll <= (others => '0'); + MYE <= (others => '0'); + VM <= (others => '0'); + CB <= (others => '0'); + resetLightPenIrq <= '0'; + resetIMMC <= '0'; + resetIMBC <= '0'; + resetRasterIrq <= '0'; + ELP <= '0'; + EMMC <= '0'; + EMBC <= '0'; + ERST <= '0'; + MPRIO <= (others => '0'); + MCDelay <= (others => '0'); + MXE <= (others => '0'); + EC <= (others => '0'); + B0C <= (others => '0'); + B1C <= (others => '0'); + B2C <=(others => '0'); + B3C <= (others => '0'); + MM0 <= (others => '0'); + MM1 <= (others => '0'); + spriteColors(0) <= (others => '0'); + spriteColors(1) <= (others => '0'); + spriteColors(2) <= (others => '0'); + spriteColors(3) <= (others => '0'); + spriteColors(4) <= (others => '0'); + spriteColors(5) <= (others => '0'); + spriteColors(6) <= (others => '0'); + spriteColors(7) <= (others => '0'); + + elsif (myWr = '1') then + case aRegisters is + when "000000" => MX(0)(7 downto 0) <= diRegisters; + when "000001" => MY(0) <= diRegisters; + when "000010" => MX(1)(7 downto 0) <= diRegisters; + when "000011" => MY(1) <= diRegisters; + when "000100" => MX(2)(7 downto 0) <= diRegisters; + when "000101" => MY(2) <= diRegisters; + when "000110" => MX(3)(7 downto 0) <= diRegisters; + when "000111" => MY(3) <= diRegisters; + when "001000" => MX(4)(7 downto 0) <= diRegisters; + when "001001" => MY(4) <= diRegisters; + when "001010" => MX(5)(7 downto 0) <= diRegisters; + when "001011" => MY(5) <= diRegisters; + when "001100" => MX(6)(7 downto 0) <= diRegisters; + when "001101" => MY(6) <= diRegisters; + when "001110" => MX(7)(7 downto 0) <= diRegisters; + when "001111" => MY(7) <= diRegisters; + when "010000" => + MX(0)(8) <= diRegisters(0); + MX(1)(8) <= diRegisters(1); + MX(2)(8) <= diRegisters(2); + MX(3)(8) <= diRegisters(3); + MX(4)(8) <= diRegisters(4); + MX(5)(8) <= diRegisters(5); + MX(6)(8) <= diRegisters(6); + MX(7)(8) <= diRegisters(7); + when "010001" => + rasterCmp(8) <= diRegisters(7); + ECM <= diRegisters(6); + BMM <= diRegisters(5); + DEN <= diRegisters(4); + RSEL <= diRegisters(3); + yscroll <= diRegisters(2 downto 0); + when "010010" => + rasterCmp(7 downto 0) <= diRegisters; + when "010101" => + ME <= diRegisters; + when "010110" => + RES <= diRegisters(5); + MCM <= diRegisters(4); + CSEL <= diRegisters(3); + xscroll <= diRegisters(2 downto 0); + + when "010111" => MYE <= diRegisters; + when "011000" => + VM <= diRegisters(7 downto 4); + CB <= diRegisters(3 downto 1); + when "011001" => + resetLightPenIrq <= diRegisters(3); + resetIMMC <= diRegisters(2); + resetIMBC <= diRegisters(1); + resetRasterIrq <= diRegisters(0); + when "011010" => + ELP <= diRegisters(3); + EMMC <= diRegisters(2); + EMBC <= diRegisters(1); + ERST <= diRegisters(0); + when "011011" => MPRIO <= diRegisters; + when "011100" => + -- MC <= diRegisters; + MCDelay <= diRegisters; -- !!! Krestage 3 hack + when "011101" => MXE <= diRegisters; + when "100000" => EC <= diRegisters(3 downto 0); + when "100001" => B0C <= diRegisters(3 downto 0); + when "100010" => B1C <= diRegisters(3 downto 0); + when "100011" => B2C <= diRegisters(3 downto 0); + when "100100" => B3C <= diRegisters(3 downto 0); + when "100101" => MM0 <= diRegisters(3 downto 0); + when "100110" => MM1 <= diRegisters(3 downto 0); + when "100111" => spriteColors(0) <= diRegisters(3 downto 0); + when "101000" => spriteColors(1) <= diRegisters(3 downto 0); + when "101001" => spriteColors(2) <= diRegisters(3 downto 0); + when "101010" => spriteColors(3) <= diRegisters(3 downto 0); + when "101011" => spriteColors(4) <= diRegisters(3 downto 0); + when "101100" => spriteColors(5) <= diRegisters(3 downto 0); + when "101101" => spriteColors(6) <= diRegisters(3 downto 0); + when "101110" => spriteColors(7) <= diRegisters(3 downto 0); + when others => null; + end case; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Read registers +-- ----------------------------------------------------------------------- +readRegisters: process(clk) + begin + if rising_edge(clk) then + case aRegisters is + when "000000" => datao <= MX(0)(7 downto 0); + when "000001" => datao <= MY(0); + when "000010" => datao <= MX(1)(7 downto 0); + when "000011" => datao <= MY(1); + when "000100" => datao <= MX(2)(7 downto 0); + when "000101" => datao <= MY(2); + when "000110" => datao <= MX(3)(7 downto 0); + when "000111" => datao <= MY(3); + when "001000" => datao <= MX(4)(7 downto 0); + when "001001" => datao <= MY(4); + when "001010" => datao <= MX(5)(7 downto 0); + when "001011" => datao <= MY(5); + when "001100" => datao <= MX(6)(7 downto 0); + when "001101" => datao <= MY(6); + when "001110" => datao <= MX(7)(7 downto 0); + when "001111" => datao <= MY(7); + when "010000" => + datao <= MX(7)(8) & MX(6)(8) & MX(5)(8) & MX(4)(8) + & MX(3)(8) & MX(2)(8) & MX(1)(8) & MX(0)(8); + when "010001" => datao <= rasterY(8) & ECM & BMM & DEN & RSEL & yscroll; + when "010010" => datao <= rasterY(7 downto 0); + when "010011" => datao <= lpX; + when "010100" => datao <= lpY; + when "010101" => datao <= ME; + when "010110" => datao <= "11" & RES & MCM & CSEL & xscroll; + when "010111" => datao <= MYE; + when "011000" => datao <= VM & CB & '1'; + when "011001" => datao <= IRQ & "111" & ILP & IMMC & IMBC & IRST; + when "011010" => datao <= "1111" & ELP & EMMC & EMBC & ERST; + when "011011" => datao <= MPRIO; + when "011100" => datao <= MC; + when "011101" => datao <= MXE; + when "011110" => datao <= M2M; + when "011111" => datao <= M2D; + when "100000" => datao <= "1111" & EC; + when "100001" => datao <= "1111" & B0C; + when "100010" => datao <= "1111" & B1C; + when "100011" => datao <= "1111" & B2C; + when "100100" => datao <= "1111" & B3C; + when "100101" => datao <= "1111" & MM0; + when "100110" => datao <= "1111" & MM1; + when "100111" => datao <= "1111" & spriteColors(0); + when "101000" => datao <= "1111" & spriteColors(1); + when "101001" => datao <= "1111" & spriteColors(2); + when "101010" => datao <= "1111" & spriteColors(3); + when "101011" => datao <= "1111" & spriteColors(4); + when "101100" => datao <= "1111" & spriteColors(5); + when "101101" => datao <= "1111" & spriteColors(6); + when "101110" => datao <= "1111" & spriteColors(7); + when others => datao <= (others => '1'); + end case; + end if; + end process; +end architecture; diff --git a/Commodore MAX/rtl/vic_656x_e.vhd b/Commodore MAX/rtl/vic_656x_e.vhd new file mode 100644 index 00000000..7e42eacc --- /dev/null +++ b/Commodore MAX/rtl/vic_656x_e.vhd @@ -0,0 +1,73 @@ +-- ----------------------------------------------------------------------- +-- +-- FPGA 64 +-- +-- A fully functional commodore 64 implementation in a single FPGA +-- +-- ----------------------------------------------------------------------- +-- Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- ----------------------------------------------------------------------- +-- +-- VIC-II - Video Interface Chip no 2 +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity vic_656x is + generic ( + registeredAddress : boolean := false; + emulateRefresh : boolean := false; + emulateLightpen : boolean := false; + emulateGraphics : boolean := true + ); + port ( + clk: in std_logic; + -- phi = 0 is VIC cycle + -- phi = 1 is CPU cycle (only used by VIC when BA is low) + phi : in std_logic; + enaData : in std_logic; + enaPixel : in std_logic; + + baSync : in std_logic; + ba: out std_logic; + + mode6569 : in std_logic; -- PAL 63 cycles and 312 lines + mode6567old : in std_logic; -- old NTSC 64 cycles and 262 line + mode6567R8 : in std_logic; -- new NTSC 65 cycles and 263 line + mode6572 : in std_logic; -- PAL-N 65 cycles and 312 lines + + reset : in std_logic; + cs : in std_logic; + we : in std_logic; + rd : in std_logic; + lp_n : in std_logic; + + aRegisters: in unsigned(5 downto 0); + diRegisters: in unsigned(7 downto 0); + + datai: in unsigned(7 downto 0); + diColor: in unsigned(3 downto 0); + datao: out unsigned(7 downto 0); + + vicAddr: out unsigned(13 downto 0); + irq_n: out std_logic; + + -- Video output + hSync : out std_logic; + vSync : out std_logic; + colorIndex : out unsigned(3 downto 0); + + -- Debug outputs + debugX : out unsigned(9 downto 0); + debugY : out unsigned(8 downto 0); + vicRefresh : out std_logic; + addrValid : out std_logic + ); +end entity; + diff --git a/Commodore MAX/rtl/video_mixer.sv b/Commodore MAX/rtl/video_mixer.sv new file mode 100644 index 00000000..ec953e53 --- /dev/null +++ b/Commodore MAX/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'd7, + 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/Jupiter Cantab - JupiterACE_MiST/ace.qpf b/Jupiter Cantab - JupiterACE_MiST/ace.qpf new file mode 100644 index 00000000..1fa2938b --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/ace.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 23:59:05 March 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "23:59:05 March 16, 2017" + +# Revisions + +PROJECT_REVISION = "ace" diff --git a/Jupiter Cantab - JupiterACE_MiST/ace.qsf b/Jupiter Cantab - JupiterACE_MiST/ace.qsf new file mode 100644 index 00000000..05b2ee6b --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/ace.qsf @@ -0,0 +1,218 @@ +# -------------------------------------------------------------------------- # +# +# 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 = 18:40:37 November 24, 2017 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# ace_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 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "23:59:05 MARCH 16, 2017" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY Output +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" +set_global_assignment -name VERILOG_FILE rtl/mist_io.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/hq2x.sv +set_global_assignment -name VERILOG_FILE rtl/osd.v +set_global_assignment -name VERILOG_FILE rtl/scandoubler.v +set_global_assignment -name VERILOG_FILE rtl/glue.v +set_global_assignment -name VERILOG_FILE rtl/T80/tv80n.v +set_global_assignment -name VERILOG_FILE rtl/T80/tv80_reg.v +set_global_assignment -name VERILOG_FILE rtl/T80/tv80_mcode.v +set_global_assignment -name VERILOG_FILE rtl/T80/tv80_core.v +set_global_assignment -name VERILOG_FILE rtl/T80/tv80_alu.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/ace_mist.sv +set_global_assignment -name QIP_FILE rtl/pll.qip +set_global_assignment -name VERILOG_FILE rtl/sigma_delta_dac.v +set_global_assignment -name VERILOG_FILE rtl/jupiter_ace.v +set_global_assignment -name VERILOG_FILE rtl/keyboard.v +set_global_assignment -name VERILOG_FILE rtl/rom_ram.v +set_global_assignment -name VERILOG_FILE rtl/ps2_port.v +set_global_assignment -name VERILOG_FILE rtl/io_write_to_rom.v + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_7 -to LED +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_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 +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 PIN_31 -to UART_RX +set_location_assignment PIN_46 -to UART_TX + +# Classic Timing Assignments +# ========================== +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name TOP_LEVEL_ENTITY ace_mist + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +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 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 "ModelSim-Altera (VHDL)" + +# 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_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation + +# end EDA_TOOL_SETTINGS(eda_simulation) +# ------------------------------------- + +# ---------------------- +# start ENTITY(ace_mist) + + # start DESIGN_PARTITION(Top) + # --------------------------- + + # Incremental Compilation Assignments + # =================================== +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 + + # end DESIGN_PARTITION(Top) + # ------------------------- + +# end ENTITY(ace_mist) +# -------------------- +set_global_assignment -name VERILOG_FILE rtl/sram.v +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Jupiter Cantab - JupiterACE_MiST/clean.bat b/Jupiter Cantab - JupiterACE_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_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/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80_alu.v b/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80_alu.v new file mode 100644 index 00000000..2f015e21 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80_alu.v @@ -0,0 +1,442 @@ +// +// TV80 8-Bit Microprocessor Core +// Based on the VHDL T80 core by Daniel Wallner (jesus@opencores.org) +// +// Copyright (c) 2004 Guy Hutchison (ghutchis@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module tv80_alu (/*AUTOARG*/ + // Outputs + Q, F_Out, + // Inputs + Arith16, Z16, ALU_Op, IR, ISet, BusA, BusB, F_In + ); + + parameter Mode = 0; + parameter Flag_C = 0; + parameter Flag_N = 1; + parameter Flag_P = 2; + parameter Flag_X = 3; + parameter Flag_H = 4; + parameter Flag_Y = 5; + parameter Flag_Z = 6; + parameter Flag_S = 7; + + input Arith16; + input Z16; + input [3:0] ALU_Op ; + input [5:0] IR; + input [1:0] ISet; + input [7:0] BusA; + input [7:0] BusB; + input [7:0] F_In; + output [7:0] Q; + output [7:0] F_Out; + reg [7:0] Q; + reg [7:0] F_Out; + + function [4:0] AddSub4; + input [3:0] A; + input [3:0] B; + input Sub; + input Carry_In; + begin + AddSub4 = { 1'b0, A } + { 1'b0, (Sub)?~B:B } + Carry_In; + end + endfunction // AddSub4 + + function [3:0] AddSub3; + input [2:0] A; + input [2:0] B; + input Sub; + input Carry_In; + begin + AddSub3 = { 1'b0, A } + { 1'b0, (Sub)?~B:B } + Carry_In; + end + endfunction // AddSub4 + + function [1:0] AddSub1; + input A; + input B; + input Sub; + input Carry_In; + begin + AddSub1 = { 1'b0, A } + { 1'b0, (Sub)?~B:B } + Carry_In; + end + endfunction // AddSub4 + + // AddSub variables (temporary signals) + reg UseCarry; + reg Carry7_v; + reg OverFlow_v; + reg HalfCarry_v; + reg Carry_v; + reg [7:0] Q_v; + + reg [7:0] BitMask; + + + always @(/*AUTOSENSE*/ALU_Op or BusA or BusB or F_In or IR) + begin + case (IR[5:3]) + 3'b000 : BitMask = 8'b00000001; + 3'b001 : BitMask = 8'b00000010; + 3'b010 : BitMask = 8'b00000100; + 3'b011 : BitMask = 8'b00001000; + 3'b100 : BitMask = 8'b00010000; + 3'b101 : BitMask = 8'b00100000; + 3'b110 : BitMask = 8'b01000000; + default: BitMask = 8'b10000000; + endcase // case(IR[5:3]) + + UseCarry = ~ ALU_Op[2] && ALU_Op[0]; + { HalfCarry_v, Q_v[3:0] } = AddSub4(BusA[3:0], BusB[3:0], ALU_Op[1], ALU_Op[1] ^ (UseCarry && F_In[Flag_C]) ); + { Carry7_v, Q_v[6:4] } = AddSub3(BusA[6:4], BusB[6:4], ALU_Op[1], HalfCarry_v); + { Carry_v, Q_v[7] } = AddSub1(BusA[7], BusB[7], ALU_Op[1], Carry7_v); + OverFlow_v = Carry_v ^ Carry7_v; + end // always @ * + + reg [7:0] Q_t; + reg [8:0] DAA_Q; + + always @ (/*AUTOSENSE*/ALU_Op or Arith16 or BitMask or BusA or BusB + or Carry_v or F_In or HalfCarry_v or IR or ISet + or OverFlow_v or Q_v or Z16) + begin + Q_t = 8'hxx; + DAA_Q = {9{1'bx}}; + + F_Out = F_In; + case (ALU_Op) + 4'b0000, 4'b0001, 4'b0010, 4'b0011, 4'b0100, 4'b0101, 4'b0110, 4'b0111 : + begin + F_Out[Flag_N] = 1'b0; + F_Out[Flag_C] = 1'b0; + + case (ALU_Op[2:0]) + + 3'b000, 3'b001 : // ADD, ADC + begin + Q_t = Q_v; + F_Out[Flag_C] = Carry_v; + F_Out[Flag_H] = HalfCarry_v; + F_Out[Flag_P] = OverFlow_v; + end + + 3'b010, 3'b011, 3'b111 : // SUB, SBC, CP + begin + Q_t = Q_v; + F_Out[Flag_N] = 1'b1; + F_Out[Flag_C] = ~ Carry_v; + F_Out[Flag_H] = ~ HalfCarry_v; + F_Out[Flag_P] = OverFlow_v; + end + + 3'b100 : // AND + begin + Q_t[7:0] = BusA & BusB; + F_Out[Flag_H] = 1'b1; + end + + 3'b101 : // XOR + begin + Q_t[7:0] = BusA ^ BusB; + F_Out[Flag_H] = 1'b0; + end + + default : // OR 3'b110 + begin + Q_t[7:0] = BusA | BusB; + F_Out[Flag_H] = 1'b0; + end + + endcase // case(ALU_OP[2:0]) + + if (ALU_Op[2:0] == 3'b111 ) + begin // CP + F_Out[Flag_X] = BusB[3]; + F_Out[Flag_Y] = BusB[5]; + end + else + begin + F_Out[Flag_X] = Q_t[3]; + F_Out[Flag_Y] = Q_t[5]; + end + + if (Q_t[7:0] == 8'b00000000 ) + begin + F_Out[Flag_Z] = 1'b1; + if (Z16 == 1'b1 ) + begin + F_Out[Flag_Z] = F_In[Flag_Z]; // 16 bit ADC,SBC + end + end + else + begin + F_Out[Flag_Z] = 1'b0; + end // else: !if(Q_t[7:0] == 8'b00000000 ) + + F_Out[Flag_S] = Q_t[7]; + case (ALU_Op[2:0]) + 3'b000, 3'b001, 3'b010, 3'b011, 3'b111 : // ADD, ADC, SUB, SBC, CP + ; + + default : + F_Out[Flag_P] = ~(^Q_t); + endcase // case(ALU_Op[2:0]) + + if (Arith16 == 1'b1 ) + begin + F_Out[Flag_S] = F_In[Flag_S]; + F_Out[Flag_Z] = F_In[Flag_Z]; + F_Out[Flag_P] = F_In[Flag_P]; + end + end // case: 4'b0000, 4'b0001, 4'b0010, 4'b0011, 4'b0100, 4'b0101, 4'b0110, 4'b0111 + + 4'b1100 : + begin + // DAA + F_Out[Flag_H] = F_In[Flag_H]; + F_Out[Flag_C] = F_In[Flag_C]; + DAA_Q[7:0] = BusA; + DAA_Q[8] = 1'b0; + if (F_In[Flag_N] == 1'b0 ) + begin + // After addition + // Alow > 9 || H == 1 + if (DAA_Q[3:0] > 9 || F_In[Flag_H] == 1'b1 ) + begin + if ((DAA_Q[3:0] > 9) ) + begin + F_Out[Flag_H] = 1'b1; + end + else + begin + F_Out[Flag_H] = 1'b0; + end + DAA_Q = DAA_Q + 6; + end // if (DAA_Q[3:0] > 9 || F_In[Flag_H] == 1'b1 ) + + // new Ahigh > 9 || C == 1 + if (DAA_Q[8:4] > 9 || F_In[Flag_C] == 1'b1 ) + begin + DAA_Q = DAA_Q + 96; // 0x60 + end + end + else + begin + // After subtraction + if (DAA_Q[3:0] > 9 || F_In[Flag_H] == 1'b1 ) + begin + if (DAA_Q[3:0] > 5 ) + begin + F_Out[Flag_H] = 1'b0; + end + DAA_Q[7:0] = DAA_Q[7:0] - 6; + end + if (BusA > 153 || F_In[Flag_C] == 1'b1 ) + begin + DAA_Q = DAA_Q - 352; // 0x160 + end + end // else: !if(F_In[Flag_N] == 1'b0 ) + + F_Out[Flag_X] = DAA_Q[3]; + F_Out[Flag_Y] = DAA_Q[5]; + F_Out[Flag_C] = F_In[Flag_C] || DAA_Q[8]; + Q_t = DAA_Q[7:0]; + + if (DAA_Q[7:0] == 8'b00000000 ) + begin + F_Out[Flag_Z] = 1'b1; + end + else + begin + F_Out[Flag_Z] = 1'b0; + end + + F_Out[Flag_S] = DAA_Q[7]; + F_Out[Flag_P] = ~ (^DAA_Q); + end // case: 4'b1100 + + 4'b1101, 4'b1110 : + begin + // RLD, RRD + Q_t[7:4] = BusA[7:4]; + if (ALU_Op[0] == 1'b1 ) + begin + Q_t[3:0] = BusB[7:4]; + end + else + begin + Q_t[3:0] = BusB[3:0]; + end + F_Out[Flag_H] = 1'b0; + F_Out[Flag_N] = 1'b0; + F_Out[Flag_X] = Q_t[3]; + F_Out[Flag_Y] = Q_t[5]; + if (Q_t[7:0] == 8'b00000000 ) + begin + F_Out[Flag_Z] = 1'b1; + end + else + begin + F_Out[Flag_Z] = 1'b0; + end + F_Out[Flag_S] = Q_t[7]; + F_Out[Flag_P] = ~(^Q_t); + end // case: when 4'b1101, 4'b1110 + + 4'b1001 : + begin + // BIT + Q_t[7:0] = BusB & BitMask; + F_Out[Flag_S] = Q_t[7]; + if (Q_t[7:0] == 8'b00000000 ) + begin + F_Out[Flag_Z] = 1'b1; + F_Out[Flag_P] = 1'b1; + end + else + begin + F_Out[Flag_Z] = 1'b0; + F_Out[Flag_P] = 1'b0; + end + F_Out[Flag_H] = 1'b1; + F_Out[Flag_N] = 1'b0; + F_Out[Flag_X] = 1'b0; + F_Out[Flag_Y] = 1'b0; + if (IR[2:0] != 3'b110 ) + begin + F_Out[Flag_X] = BusB[3]; + F_Out[Flag_Y] = BusB[5]; + end + end // case: when 4'b1001 + + 4'b1010 : + // SET + Q_t[7:0] = BusB | BitMask; + + 4'b1011 : + // RES + Q_t[7:0] = BusB & ~ BitMask; + + 4'b1000 : + begin + // ROT + case (IR[5:3]) + 3'b000 : // RLC + begin + Q_t[7:1] = BusA[6:0]; + Q_t[0] = BusA[7]; + F_Out[Flag_C] = BusA[7]; + end + + 3'b010 : // RL + begin + Q_t[7:1] = BusA[6:0]; + Q_t[0] = F_In[Flag_C]; + F_Out[Flag_C] = BusA[7]; + end + + 3'b001 : // RRC + begin + Q_t[6:0] = BusA[7:1]; + Q_t[7] = BusA[0]; + F_Out[Flag_C] = BusA[0]; + end + + 3'b011 : // RR + begin + Q_t[6:0] = BusA[7:1]; + Q_t[7] = F_In[Flag_C]; + F_Out[Flag_C] = BusA[0]; + end + + 3'b100 : // SLA + begin + Q_t[7:1] = BusA[6:0]; + Q_t[0] = 1'b0; + F_Out[Flag_C] = BusA[7]; + end + + 3'b110 : // SLL (Undocumented) / SWAP + begin + if (Mode == 3 ) + begin + Q_t[7:4] = BusA[3:0]; + Q_t[3:0] = BusA[7:4]; + F_Out[Flag_C] = 1'b0; + end + else + begin + Q_t[7:1] = BusA[6:0]; + Q_t[0] = 1'b1; + F_Out[Flag_C] = BusA[7]; + end // else: !if(Mode == 3 ) + end // case: 3'b110 + + 3'b101 : // SRA + begin + Q_t[6:0] = BusA[7:1]; + Q_t[7] = BusA[7]; + F_Out[Flag_C] = BusA[0]; + end + + default : // SRL + begin + Q_t[6:0] = BusA[7:1]; + Q_t[7] = 1'b0; + F_Out[Flag_C] = BusA[0]; + end + endcase // case(IR[5:3]) + + F_Out[Flag_H] = 1'b0; + F_Out[Flag_N] = 1'b0; + F_Out[Flag_X] = Q_t[3]; + F_Out[Flag_Y] = Q_t[5]; + F_Out[Flag_S] = Q_t[7]; + if (Q_t[7:0] == 8'b00000000 ) + begin + F_Out[Flag_Z] = 1'b1; + end + else + begin + F_Out[Flag_Z] = 1'b0; + end + F_Out[Flag_P] = ~(^Q_t); + + if (ISet == 2'b00 ) + begin + F_Out[Flag_P] = F_In[Flag_P]; + F_Out[Flag_S] = F_In[Flag_S]; + F_Out[Flag_Z] = F_In[Flag_Z]; + end + end // case: 4'b1000 + + + default : + ; + + endcase // case(ALU_Op) + + Q = Q_t; + end // always @ (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + +endmodule // T80_ALU diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80_core.v b/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80_core.v new file mode 100644 index 00000000..af1483a1 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80_core.v @@ -0,0 +1,1351 @@ +// +// TV80 8-Bit Microprocessor Core +// Based on the VHDL T80 core by Daniel Wallner (jesus@opencores.org) +// +// Copyright (c) 2004 Guy Hutchison (ghutchis@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module tv80_core (/*AUTOARG*/ + // Outputs + m1_n, iorq, no_read, write, rfsh_n, halt_n, busak_n, A, dout, mc, ts, + intcycle_n, IntE, stop, + // Inputs + reset_n, clk, cen, wait_n, int_n, nmi_n, busrq_n, dinst, di + ); + // Beginning of automatic inputs (from unused autoinst inputs) + // End of automatics + + parameter Mode = 1; // 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + parameter IOWait = 1; // 0 => Single cycle I/O, 1 => Std I/O cycle + parameter Flag_C = 0; + parameter Flag_N = 1; + parameter Flag_P = 2; + parameter Flag_X = 3; + parameter Flag_H = 4; + parameter Flag_Y = 5; + parameter Flag_Z = 6; + parameter Flag_S = 7; + + input reset_n; + input clk; + input cen; + input wait_n; + input int_n; + input nmi_n; + input busrq_n; + output m1_n; + output iorq; + output no_read; + output write; + output rfsh_n; + output halt_n; + output busak_n; + output [15:0] A; + input [7:0] dinst; + input [7:0] di; + output [7:0] dout; + output [6:0] mc; + output [6:0] ts; + output intcycle_n; + output IntE; + output stop; + + reg m1_n; + reg iorq; + reg rfsh_n; + reg halt_n; + reg busak_n; + reg [15:0] A; + reg [7:0] dout; + reg [6:0] mc; + reg [6:0] ts; + reg intcycle_n; + reg IntE; + reg stop; + + parameter aNone = 3'b111; + parameter aBC = 3'b000; + parameter aDE = 3'b001; + parameter aXY = 3'b010; + parameter aIOA = 3'b100; + parameter aSP = 3'b101; + parameter aZI = 3'b110; + + // Registers + reg [7:0] ACC, F; + reg [7:0] Ap, Fp; + reg [7:0] I; + reg [7:0] R; + reg [15:0] SP, PC; + reg [7:0] RegDIH; + reg [7:0] RegDIL; + wire [15:0] RegBusA; + wire [15:0] RegBusB; + wire [15:0] RegBusC; + reg [2:0] RegAddrA_r; + reg [2:0] RegAddrA; + reg [2:0] RegAddrB_r; + reg [2:0] RegAddrB; + reg [2:0] RegAddrC; + reg RegWEH; + reg RegWEL; + reg Alternate; + + // Help Registers + reg [15:0] TmpAddr; // Temporary address register + reg [7:0] IR; // Instruction register + reg [1:0] ISet; // Instruction set selector + reg [15:0] RegBusA_r; + + reg [15:0] ID16; + reg [7:0] Save_Mux; + + reg [6:0] tstate; + reg [6:0] mcycle; + reg last_mcycle, last_tstate; + reg IntE_FF1; + reg IntE_FF2; + reg Halt_FF; + reg BusReq_s; + reg BusAck; + reg ClkEn; + reg NMI_s; + reg INT_s; + reg [1:0] IStatus; + + reg [7:0] DI_Reg; + reg T_Res; + reg [1:0] XY_State; + reg [2:0] Pre_XY_F_M; + reg NextIs_XY_Fetch; + reg XY_Ind; + reg No_BTR; + reg BTR_r; + reg Auto_Wait; + reg Auto_Wait_t1; + reg Auto_Wait_t2; + reg IncDecZ; + + // ALU signals + reg [7:0] BusB; + reg [7:0] BusA; + wire [7:0] ALU_Q; + wire [7:0] F_Out; + + // Registered micro code outputs + reg [4:0] Read_To_Reg_r; + reg Arith16_r; + reg Z16_r; + reg [3:0] ALU_Op_r; + reg Save_ALU_r; + reg PreserveC_r; + reg [2:0] mcycles; + + // Micro code outputs + wire [2:0] mcycles_d; + wire [2:0] tstates; + reg IntCycle; + reg NMICycle; + wire Inc_PC; + wire Inc_WZ; + wire [3:0] IncDec_16; + wire [1:0] Prefix; + wire Read_To_Acc; + wire Read_To_Reg; + wire [3:0] Set_BusB_To; + wire [3:0] Set_BusA_To; + wire [3:0] ALU_Op; + wire Save_ALU; + wire PreserveC; + wire Arith16; + wire [2:0] Set_Addr_To; + wire Jump; + wire JumpE; + wire JumpXY; + wire Call; + wire RstP; + wire LDZ; + wire LDW; + wire LDSPHL; + wire iorq_i; + wire [2:0] Special_LD; + wire ExchangeDH; + wire ExchangeRp; + wire ExchangeAF; + wire ExchangeRS; + wire I_DJNZ; + wire I_CPL; + wire I_CCF; + wire I_SCF; + wire I_RETN; + wire I_BT; + wire I_BC; + wire I_BTR; + wire I_RLD; + wire I_RRD; + wire I_INRC; + wire SetDI; + wire SetEI; + wire [1:0] IMode; + wire Halt; + + reg [15:0] PC16; + reg [15:0] PC16_B; + reg [15:0] SP16, SP16_A, SP16_B; + reg [15:0] ID16_B; + reg Oldnmi_n; + + tv80_mcode #(Mode, Flag_C, Flag_N, Flag_P, Flag_X, Flag_H, Flag_Y, Flag_Z, Flag_S) i_mcode + ( + .IR (IR), + .ISet (ISet), + .MCycle (mcycle), + .F (F), + .NMICycle (NMICycle), + .IntCycle (IntCycle), + .MCycles (mcycles_d), + .TStates (tstates), + .Prefix (Prefix), + .Inc_PC (Inc_PC), + .Inc_WZ (Inc_WZ), + .IncDec_16 (IncDec_16), + .Read_To_Acc (Read_To_Acc), + .Read_To_Reg (Read_To_Reg), + .Set_BusB_To (Set_BusB_To), + .Set_BusA_To (Set_BusA_To), + .ALU_Op (ALU_Op), + .Save_ALU (Save_ALU), + .PreserveC (PreserveC), + .Arith16 (Arith16), + .Set_Addr_To (Set_Addr_To), + .IORQ (iorq_i), + .Jump (Jump), + .JumpE (JumpE), + .JumpXY (JumpXY), + .Call (Call), + .RstP (RstP), + .LDZ (LDZ), + .LDW (LDW), + .LDSPHL (LDSPHL), + .Special_LD (Special_LD), + .ExchangeDH (ExchangeDH), + .ExchangeRp (ExchangeRp), + .ExchangeAF (ExchangeAF), + .ExchangeRS (ExchangeRS), + .I_DJNZ (I_DJNZ), + .I_CPL (I_CPL), + .I_CCF (I_CCF), + .I_SCF (I_SCF), + .I_RETN (I_RETN), + .I_BT (I_BT), + .I_BC (I_BC), + .I_BTR (I_BTR), + .I_RLD (I_RLD), + .I_RRD (I_RRD), + .I_INRC (I_INRC), + .SetDI (SetDI), + .SetEI (SetEI), + .IMode (IMode), + .Halt (Halt), + .NoRead (no_read), + .Write (write) + ); + + tv80_alu #(Mode, Flag_C, Flag_N, Flag_P, Flag_X, Flag_H, Flag_Y, Flag_Z, Flag_S) i_alu + ( + .Arith16 (Arith16_r), + .Z16 (Z16_r), + .ALU_Op (ALU_Op_r), + .IR (IR[5:0]), + .ISet (ISet), + .BusA (BusA), + .BusB (BusB), + .F_In (F), + .Q (ALU_Q), + .F_Out (F_Out) + ); + + function [6:0] number_to_bitvec; + input [2:0] num; + begin + case (num) + 1 : number_to_bitvec = 7'b0000001; + 2 : number_to_bitvec = 7'b0000010; + 3 : number_to_bitvec = 7'b0000100; + 4 : number_to_bitvec = 7'b0001000; + 5 : number_to_bitvec = 7'b0010000; + 6 : number_to_bitvec = 7'b0100000; + 7 : number_to_bitvec = 7'b1000000; + default : number_to_bitvec = 7'bx; + endcase // case(num) + end + endfunction // number_to_bitvec + + always @(/*AUTOSENSE*/mcycle or mcycles or tstate or tstates) + begin + case (mcycles) + 1 : last_mcycle = mcycle[0]; + 2 : last_mcycle = mcycle[1]; + 3 : last_mcycle = mcycle[2]; + 4 : last_mcycle = mcycle[3]; + 5 : last_mcycle = mcycle[4]; + 6 : last_mcycle = mcycle[5]; + 7 : last_mcycle = mcycle[6]; + default : last_mcycle = 1'bx; + endcase // case(mcycles) + + case (tstates) + 0 : last_tstate = tstate[0]; + 1 : last_tstate = tstate[1]; + 2 : last_tstate = tstate[2]; + 3 : last_tstate = tstate[3]; + 4 : last_tstate = tstate[4]; + 5 : last_tstate = tstate[5]; + 6 : last_tstate = tstate[6]; + default : last_tstate = 1'bx; + endcase + end // always @ (... + + + always @(/*AUTOSENSE*/ALU_Q or BusAck or BusB or DI_Reg + or ExchangeRp or IR or Save_ALU_r or Set_Addr_To or XY_Ind + or XY_State or cen or last_tstate or mcycle) + begin + ClkEn = cen && ~ BusAck; + + if (last_tstate) + T_Res = 1'b1; + else T_Res = 1'b0; + + if (XY_State != 2'b00 && XY_Ind == 1'b0 && + ((Set_Addr_To == aXY) || + (mcycle[0] && IR == 8'b11001011) || + (mcycle[0] && IR == 8'b00110110))) + NextIs_XY_Fetch = 1'b1; + else + NextIs_XY_Fetch = 1'b0; + + if (ExchangeRp) + Save_Mux = BusB; + else if (!Save_ALU_r) + Save_Mux = DI_Reg; + else + Save_Mux = ALU_Q; + end // always @ * + + always @ (posedge clk) + begin + if (reset_n == 1'b0 ) + begin + PC <= #1 0; // Program Counter + A <= #1 0; + TmpAddr <= #1 0; + IR <= #1 8'b00000000; + ISet <= #1 2'b00; + XY_State <= #1 2'b00; + IStatus <= #1 2'b00; + mcycles <= #1 3'b000; + dout <= #1 8'b00000000; + + ACC <= #1 8'hFF; + F <= #1 8'hFF; + Ap <= #1 8'hFF; + Fp <= #1 8'hFF; + I <= #1 0; + `ifdef TV80_REFRESH + R <= #1 0; + `endif + SP <= #1 16'hFFFF; + Alternate <= #1 1'b0; + + Read_To_Reg_r <= #1 5'b00000; + Arith16_r <= #1 1'b0; + BTR_r <= #1 1'b0; + Z16_r <= #1 1'b0; + ALU_Op_r <= #1 4'b0000; + Save_ALU_r <= #1 1'b0; + PreserveC_r <= #1 1'b0; + XY_Ind <= #1 1'b0; + end + else + begin + + if (ClkEn == 1'b1 ) + begin + + ALU_Op_r <= #1 4'b0000; + Save_ALU_r <= #1 1'b0; + Read_To_Reg_r <= #1 5'b00000; + + mcycles <= #1 mcycles_d; + + if (IMode != 2'b11 ) + begin + IStatus <= #1 IMode; + end + + Arith16_r <= #1 Arith16; + PreserveC_r <= #1 PreserveC; + if (ISet == 2'b10 && ALU_Op[2] == 1'b0 && ALU_Op[0] == 1'b1 && mcycle[2] ) + begin + Z16_r <= #1 1'b1; + end + else + begin + Z16_r <= #1 1'b0; + end + + if (mcycle[0] && (tstate[1] | tstate[2] | tstate[3] )) + begin + // mcycle == 1 && tstate == 1, 2, || 3 + if (tstate[2] && wait_n == 1'b1 ) + begin + `ifdef TV80_REFRESH + if (Mode < 2 ) + begin + A[7:0] <= #1 R; + A[15:8] <= #1 I; + R[6:0] <= #1 R[6:0] + 1; + end + `endif + if (Jump == 1'b0 && Call == 1'b0 && NMICycle == 1'b0 && IntCycle == 1'b0 && ~ (Halt_FF == 1'b1 || Halt == 1'b1) ) + begin + PC <= #1 PC16; + end + + if (IntCycle == 1'b1 && IStatus == 2'b01 ) + begin + IR <= #1 8'b11111111; + end + else if (Halt_FF == 1'b1 || (IntCycle == 1'b1 && IStatus == 2'b10) || NMICycle == 1'b1 ) + begin + IR <= #1 8'b00000000; + end + else + begin + IR <= #1 dinst; + end + + ISet <= #1 2'b00; + if (Prefix != 2'b00 ) + begin + if (Prefix == 2'b11 ) + begin + if (IR[5] == 1'b1 ) + begin + XY_State <= #1 2'b10; + end + else + begin + XY_State <= #1 2'b01; + end + end + else + begin + if (Prefix == 2'b10 ) + begin + XY_State <= #1 2'b00; + XY_Ind <= #1 1'b0; + end + ISet <= #1 Prefix; + end + end + else + begin + XY_State <= #1 2'b00; + XY_Ind <= #1 1'b0; + end + end // if (tstate == 2 && wait_n == 1'b1 ) + + + end + else + begin + // either (mcycle > 1) OR (mcycle == 1 AND tstate > 3) + + if (mcycle[5] ) + begin + XY_Ind <= #1 1'b1; + if (Prefix == 2'b01 ) + begin + ISet <= #1 2'b01; + end + end + + if (T_Res == 1'b1 ) + begin + BTR_r <= #1 (I_BT || I_BC || I_BTR) && ~ No_BTR; + if (Jump == 1'b1 ) + begin + A[15:8] <= #1 DI_Reg; + A[7:0] <= #1 TmpAddr[7:0]; + PC[15:8] <= #1 DI_Reg; + PC[7:0] <= #1 TmpAddr[7:0]; + end + else if (JumpXY == 1'b1 ) + begin + A <= #1 RegBusC; + PC <= #1 RegBusC; + end else if (Call == 1'b1 || RstP == 1'b1 ) + begin + A <= #1 TmpAddr; + PC <= #1 TmpAddr; + end + else if (last_mcycle && NMICycle == 1'b1 ) + begin + A <= #1 16'b0000000001100110; + PC <= #1 16'b0000000001100110; + end + else if (mcycle[2] && IntCycle == 1'b1 && IStatus == 2'b10 ) + begin + A[15:8] <= #1 I; + A[7:0] <= #1 TmpAddr[7:0]; + PC[15:8] <= #1 I; + PC[7:0] <= #1 TmpAddr[7:0]; + end + else + begin + case (Set_Addr_To) + aXY : + begin + if (XY_State == 2'b00 ) + begin + A <= #1 RegBusC; + end + else + begin + if (NextIs_XY_Fetch == 1'b1 ) + begin + A <= #1 PC; + end + else + begin + A <= #1 TmpAddr; + end + end // else: !if(XY_State == 2'b00 ) + end // case: aXY + + aIOA : + begin + if (Mode == 3 ) + begin + // Memory map I/O on GBZ80 + A[15:8] <= #1 8'hFF; + end + else if (Mode == 2 ) + begin + // Duplicate I/O address on 8080 + A[15:8] <= #1 DI_Reg; + end + else + begin + A[15:8] <= #1 ACC; + end + A[7:0] <= #1 DI_Reg; + end // case: aIOA + + + aSP : + begin + A <= #1 SP; + end + + aBC : + begin + if (Mode == 3 && iorq_i == 1'b1 ) + begin + // Memory map I/O on GBZ80 + A[15:8] <= #1 8'hFF; + A[7:0] <= #1 RegBusC[7:0]; + end + else + begin + A <= #1 RegBusC; + end + end // case: aBC + + aDE : + begin + A <= #1 RegBusC; + end + + aZI : + begin + if (Inc_WZ == 1'b1 ) + begin + A <= #1 TmpAddr + 1; + end + else + begin + A[15:8] <= #1 DI_Reg; + A[7:0] <= #1 TmpAddr[7:0]; + end + end // case: aZI + + default : + begin + A <= #1 PC; + end + endcase // case(Set_Addr_To) + + end // else: !if(mcycle[2] && IntCycle == 1'b1 && IStatus == 2'b10 ) + + + Save_ALU_r <= #1 Save_ALU; + ALU_Op_r <= #1 ALU_Op; + + if (I_CPL == 1'b1 ) + begin + // CPL + ACC <= #1 ~ ACC; + F[Flag_Y] <= #1 ~ ACC[5]; + F[Flag_H] <= #1 1'b1; + F[Flag_X] <= #1 ~ ACC[3]; + F[Flag_N] <= #1 1'b1; + end + if (I_CCF == 1'b1 ) + begin + // CCF + F[Flag_C] <= #1 ~ F[Flag_C]; + F[Flag_Y] <= #1 ACC[5]; + F[Flag_H] <= #1 F[Flag_C]; + F[Flag_X] <= #1 ACC[3]; + F[Flag_N] <= #1 1'b0; + end + if (I_SCF == 1'b1 ) + begin + // SCF + F[Flag_C] <= #1 1'b1; + F[Flag_Y] <= #1 ACC[5]; + F[Flag_H] <= #1 1'b0; + F[Flag_X] <= #1 ACC[3]; + F[Flag_N] <= #1 1'b0; + end + end // if (T_Res == 1'b1 ) + + + if (tstate[2] && wait_n == 1'b1 ) + begin + if (ISet == 2'b01 && mcycle[6] ) + begin + IR <= #1 dinst; + end + if (JumpE == 1'b1 ) + begin + PC <= #1 PC16; + end + else if (Inc_PC == 1'b1 ) + begin + //PC <= #1 PC + 1; + PC <= #1 PC16; + end + if (BTR_r == 1'b1 ) + begin + //PC <= #1 PC - 2; + PC <= #1 PC16; + end + if (RstP == 1'b1 ) + begin + TmpAddr <= #1 { 10'h0, IR[5:3], 3'h0 }; + //TmpAddr <= #1 (others =>1'b0); + //TmpAddr[5:3] <= #1 IR[5:3]; + end + end + if (tstate[3] && mcycle[5] ) + begin + TmpAddr <= #1 SP16; + end + + if ((tstate[2] && wait_n == 1'b1) || (tstate[4] && mcycle[0]) ) + begin + if (IncDec_16[2:0] == 3'b111 ) + begin + SP <= #1 SP16; + end + end + + if (LDSPHL == 1'b1 ) + begin + SP <= #1 RegBusC; + end + if (ExchangeAF == 1'b1 ) + begin + Ap <= #1 ACC; + ACC <= #1 Ap; + Fp <= #1 F; + F <= #1 Fp; + end + if (ExchangeRS == 1'b1 ) + begin + Alternate <= #1 ~ Alternate; + end + end // else: !if(mcycle == 3'b001 && tstate(2) == 1'b0 ) + + + if (tstate[3] ) + begin + if (LDZ == 1'b1 ) + begin + TmpAddr[7:0] <= #1 DI_Reg; + end + if (LDW == 1'b1 ) + begin + TmpAddr[15:8] <= #1 DI_Reg; + end + + if (Special_LD[2] == 1'b1 ) + begin + case (Special_LD[1:0]) + 2'b00 : + begin + ACC <= #1 I; + F[Flag_P] <= #1 IntE_FF2; + end + + 2'b01 : + begin + ACC <= #1 R; + F[Flag_P] <= #1 IntE_FF2; + end + + 2'b10 : + I <= #1 ACC; + + `ifdef TV80_REFRESH + default : + R <= #1 ACC; + `else + default : ; + `endif + endcase + end + end // if (tstate == 3 ) + + + if ((I_DJNZ == 1'b0 && Save_ALU_r == 1'b1) || ALU_Op_r == 4'b1001 ) + begin + if (Mode == 3 ) + begin + F[6] <= #1 F_Out[6]; + F[5] <= #1 F_Out[5]; + F[7] <= #1 F_Out[7]; + if (PreserveC_r == 1'b0 ) + begin + F[4] <= #1 F_Out[4]; + end + end + else + begin + F[7:1] <= #1 F_Out[7:1]; + if (PreserveC_r == 1'b0 ) + begin + F[Flag_C] <= #1 F_Out[0]; + end + end + end // if ((I_DJNZ == 1'b0 && Save_ALU_r == 1'b1) || ALU_Op_r == 4'b1001 ) + + if (T_Res == 1'b1 && I_INRC == 1'b1 ) + begin + F[Flag_H] <= #1 1'b0; + F[Flag_N] <= #1 1'b0; + if (DI_Reg[7:0] == 8'b00000000 ) + begin + F[Flag_Z] <= #1 1'b1; + end + else + begin + F[Flag_Z] <= #1 1'b0; + end + F[Flag_S] <= #1 DI_Reg[7]; + F[Flag_P] <= #1 ~ (^DI_Reg[7:0]); + end // if (T_Res == 1'b1 && I_INRC == 1'b1 ) + + + if (tstate[1] && Auto_Wait_t1 == 1'b0 ) + begin + dout <= #1 BusB; + if (I_RLD == 1'b1 ) + begin + dout[3:0] <= #1 BusA[3:0]; + dout[7:4] <= #1 BusB[3:0]; + end + if (I_RRD == 1'b1 ) + begin + dout[3:0] <= #1 BusB[7:4]; + dout[7:4] <= #1 BusA[3:0]; + end + end + + if (T_Res == 1'b1 ) + begin + Read_To_Reg_r[3:0] <= #1 Set_BusA_To; + Read_To_Reg_r[4] <= #1 Read_To_Reg; + if (Read_To_Acc == 1'b1 ) + begin + Read_To_Reg_r[3:0] <= #1 4'b0111; + Read_To_Reg_r[4] <= #1 1'b1; + end + end + + if (tstate[1] && I_BT == 1'b1 ) + begin + F[Flag_X] <= #1 ALU_Q[3]; + F[Flag_Y] <= #1 ALU_Q[1]; + F[Flag_H] <= #1 1'b0; + F[Flag_N] <= #1 1'b0; + end + if (I_BC == 1'b1 || I_BT == 1'b1 ) + begin + F[Flag_P] <= #1 IncDecZ; + end + + if ((tstate[1] && Save_ALU_r == 1'b0 && Auto_Wait_t1 == 1'b0) || + (Save_ALU_r == 1'b1 && ALU_Op_r != 4'b0111) ) + begin + case (Read_To_Reg_r) + 5'b10111 : + ACC <= #1 Save_Mux; + 5'b10110 : + dout <= #1 Save_Mux; + 5'b11000 : + SP[7:0] <= #1 Save_Mux; + 5'b11001 : + SP[15:8] <= #1 Save_Mux; + 5'b11011 : + F <= #1 Save_Mux; + endcase + end // if ((tstate == 1 && Save_ALU_r == 1'b0 && Auto_Wait_t1 == 1'b0) ||... + end // if (ClkEn == 1'b1 ) + end // else: !if(reset_n == 1'b0 ) + end + + + //------------------------------------------------------------------------- + // + // BC('), DE('), HL('), IX && IY + // + //------------------------------------------------------------------------- + always @ (posedge clk) + begin + if (ClkEn == 1'b1 ) + begin + // Bus A / Write + RegAddrA_r <= #1 { Alternate, Set_BusA_To[2:1] }; + if (XY_Ind == 1'b0 && XY_State != 2'b00 && Set_BusA_To[2:1] == 2'b10 ) + begin + RegAddrA_r <= #1 { XY_State[1], 2'b11 }; + end + + // Bus B + RegAddrB_r <= #1 { Alternate, Set_BusB_To[2:1] }; + if (XY_Ind == 1'b0 && XY_State != 2'b00 && Set_BusB_To[2:1] == 2'b10 ) + begin + RegAddrB_r <= #1 { XY_State[1], 2'b11 }; + end + + // Address from register + RegAddrC <= #1 { Alternate, Set_Addr_To[1:0] }; + // Jump (HL), LD SP,HL + if ((JumpXY == 1'b1 || LDSPHL == 1'b1) ) + begin + RegAddrC <= #1 { Alternate, 2'b10 }; + end + if (((JumpXY == 1'b1 || LDSPHL == 1'b1) && XY_State != 2'b00) || (mcycle[5]) ) + begin + RegAddrC <= #1 { XY_State[1], 2'b11 }; + end + + if (I_DJNZ == 1'b1 && Save_ALU_r == 1'b1 && Mode < 2 ) + begin + IncDecZ <= #1 F_Out[Flag_Z]; + end + if ((tstate[2] || (tstate[3] && mcycle[0])) && IncDec_16[2:0] == 3'b100 ) + begin + if (ID16 == 0 ) + begin + IncDecZ <= #1 1'b0; + end + else + begin + IncDecZ <= #1 1'b1; + end + end + + RegBusA_r <= #1 RegBusA; + end + + end // always @ (posedge clk) + + + always @(/*AUTOSENSE*/Alternate or ExchangeDH or IncDec_16 + or RegAddrA_r or RegAddrB_r or XY_State or mcycle or tstate) + begin + if ((tstate[2] || (tstate[3] && mcycle[0] && IncDec_16[2] == 1'b1)) && XY_State == 2'b00) + RegAddrA = { Alternate, IncDec_16[1:0] }; + else if ((tstate[2] || (tstate[3] && mcycle[0] && IncDec_16[2] == 1'b1)) && IncDec_16[1:0] == 2'b10) + RegAddrA = { XY_State[1], 2'b11 }; + else if (ExchangeDH == 1'b1 && tstate[3]) + RegAddrA = { Alternate, 2'b10 }; + else if (ExchangeDH == 1'b1 && tstate[4]) + RegAddrA = { Alternate, 2'b01 }; + else + RegAddrA = RegAddrA_r; + + if (ExchangeDH == 1'b1 && tstate[3]) + RegAddrB = { Alternate, 2'b01 }; + else + RegAddrB = RegAddrB_r; + end // always @ * + + + always @(/*AUTOSENSE*/ALU_Op_r or Auto_Wait_t1 or ExchangeDH + or IncDec_16 or Read_To_Reg_r or Save_ALU_r or mcycle + or tstate or wait_n) + begin + RegWEH = 1'b0; + RegWEL = 1'b0; + if ((tstate[1] && Save_ALU_r == 1'b0 && Auto_Wait_t1 == 1'b0) || + (Save_ALU_r == 1'b1 && ALU_Op_r != 4'b0111) ) + begin + case (Read_To_Reg_r) + 5'b10000 , 5'b10001 , 5'b10010 , 5'b10011 , 5'b10100 , 5'b10101 : + begin + RegWEH = ~ Read_To_Reg_r[0]; + RegWEL = Read_To_Reg_r[0]; + end + endcase // case(Read_To_Reg_r) + + end // if ((tstate == 1 && Save_ALU_r == 1'b0 && Auto_Wait_t1 == 1'b0) ||... + + + if (ExchangeDH == 1'b1 && (tstate[3] || tstate[4]) ) + begin + RegWEH = 1'b1; + RegWEL = 1'b1; + end + + if (IncDec_16[2] == 1'b1 && ((tstate[2] && wait_n == 1'b1 && mcycle != 3'b001) || (tstate[3] && mcycle[0])) ) + begin + case (IncDec_16[1:0]) + 2'b00 , 2'b01 , 2'b10 : + begin + RegWEH = 1'b1; + RegWEL = 1'b1; + end + endcase + end + end // always @ * + + + always @(/*AUTOSENSE*/ExchangeDH or ID16 or IncDec_16 or RegBusA_r + or RegBusB or Save_Mux or mcycle or tstate) + begin + RegDIH = Save_Mux; + RegDIL = Save_Mux; + + if (ExchangeDH == 1'b1 && tstate[3] ) + begin + RegDIH = RegBusB[15:8]; + RegDIL = RegBusB[7:0]; + end + else if (ExchangeDH == 1'b1 && tstate[4] ) + begin + RegDIH = RegBusA_r[15:8]; + RegDIL = RegBusA_r[7:0]; + end + else if (IncDec_16[2] == 1'b1 && ((tstate[2] && mcycle != 3'b001) || (tstate[3] && mcycle[0])) ) + begin + RegDIH = ID16[15:8]; + RegDIL = ID16[7:0]; + end + end + + tv80_reg i_reg + ( + .clk (clk), + .CEN (ClkEn), + .WEH (RegWEH), + .WEL (RegWEL), + .AddrA (RegAddrA), + .AddrB (RegAddrB), + .AddrC (RegAddrC), + .DIH (RegDIH), + .DIL (RegDIL), + .DOAH (RegBusA[15:8]), + .DOAL (RegBusA[7:0]), + .DOBH (RegBusB[15:8]), + .DOBL (RegBusB[7:0]), + .DOCH (RegBusC[15:8]), + .DOCL (RegBusC[7:0]) + ); + + //------------------------------------------------------------------------- + // + // Buses + // + //------------------------------------------------------------------------- + + always @ (posedge clk) + begin + if (ClkEn == 1'b1 ) + begin + case (Set_BusB_To) + 4'b0111 : + BusB <= #1 ACC; + 4'b0000 , 4'b0001 , 4'b0010 , 4'b0011 , 4'b0100 , 4'b0101 : + begin + if (Set_BusB_To[0] == 1'b1 ) + begin + BusB <= #1 RegBusB[7:0]; + end + else + begin + BusB <= #1 RegBusB[15:8]; + end + end + 4'b0110 : + BusB <= #1 DI_Reg; + 4'b1000 : + BusB <= #1 SP[7:0]; + 4'b1001 : + BusB <= #1 SP[15:8]; + 4'b1010 : + BusB <= #1 8'b00000001; + 4'b1011 : + BusB <= #1 F; + 4'b1100 : + BusB <= #1 PC[7:0]; + 4'b1101 : + BusB <= #1 PC[15:8]; + 4'b1110 : + BusB <= #1 8'b00000000; + default : + BusB <= #1 8'hxx; + endcase + + case (Set_BusA_To) + 4'b0111 : + BusA <= #1 ACC; + 4'b0000 , 4'b0001 , 4'b0010 , 4'b0011 , 4'b0100 , 4'b0101 : + begin + if (Set_BusA_To[0] == 1'b1 ) + begin + BusA <= #1 RegBusA[7:0]; + end + else + begin + BusA <= #1 RegBusA[15:8]; + end + end + 4'b0110 : + BusA <= #1 DI_Reg; + 4'b1000 : + BusA <= #1 SP[7:0]; + 4'b1001 : + BusA <= #1 SP[15:8]; + 4'b1010 : + BusA <= #1 8'b00000000; + default : + BusB <= #1 8'hxx; + endcase + end + end + + //------------------------------------------------------------------------- + // + // Generate external control signals + // + //------------------------------------------------------------------------- +`ifdef TV80_REFRESH + always @ (posedge clk) + begin + if (reset_n == 1'b0 ) + begin + rfsh_n <= #1 1'b1; + end + else + begin + if (cen == 1'b1 ) + begin + if (mcycle[0] && ((tstate[2] && wait_n == 1'b1) || tstate[3]) ) + begin + rfsh_n <= #1 1'b0; + end + else + begin + rfsh_n <= #1 1'b1; + end + end + end + end +`endif + + always @(/*AUTOSENSE*/BusAck or Halt_FF or I_DJNZ or IntCycle + or IntE_FF1 or di or iorq_i or mcycle or tstate) + begin + mc = mcycle; + ts = tstate; + DI_Reg = di; + halt_n = ~ Halt_FF; + busak_n = ~ BusAck; + intcycle_n = ~ IntCycle; + IntE = IntE_FF1; + iorq = iorq_i; + stop = I_DJNZ; + end + + //----------------------------------------------------------------------- + // + // Syncronise inputs + // + //----------------------------------------------------------------------- + + always @ (posedge clk) + begin : sync_inputs + + if (reset_n == 1'b0 ) + begin + BusReq_s <= #1 1'b0; + INT_s <= #1 1'b0; + NMI_s <= #1 1'b0; + Oldnmi_n <= #1 1'b0; + end + else + begin + if (cen == 1'b1 ) + begin + BusReq_s <= #1 ~ busrq_n; + INT_s <= #1 ~ int_n; + if (NMICycle == 1'b1 ) + begin + NMI_s <= #1 1'b0; + end + else if (nmi_n == 1'b0 && Oldnmi_n == 1'b1 ) + begin + NMI_s <= #1 1'b1; + end + Oldnmi_n <= #1 nmi_n; + end + end + end + + //----------------------------------------------------------------------- + // + // Main state machine + // + //----------------------------------------------------------------------- + + always @ (posedge clk) + begin + if (reset_n == 1'b0 ) + begin + mcycle <= #1 7'b0000001; + tstate <= #1 7'b0000001; + Pre_XY_F_M <= #1 3'b000; + Halt_FF <= #1 1'b0; + BusAck <= #1 1'b0; + NMICycle <= #1 1'b0; + IntCycle <= #1 1'b0; + IntE_FF1 <= #1 1'b0; + IntE_FF2 <= #1 1'b0; + No_BTR <= #1 1'b0; + Auto_Wait_t1 <= #1 1'b0; + Auto_Wait_t2 <= #1 1'b0; + m1_n <= #1 1'b1; + end + else + begin + if (cen == 1'b1 ) + begin + if (T_Res == 1'b1 ) + begin + Auto_Wait_t1 <= #1 1'b0; + end + else + begin + Auto_Wait_t1 <= #1 Auto_Wait || iorq_i; + end + Auto_Wait_t2 <= #1 Auto_Wait_t1; + No_BTR <= #1 (I_BT && (~ IR[4] || ~ F[Flag_P])) || + (I_BC && (~ IR[4] || F[Flag_Z] || ~ F[Flag_P])) || + (I_BTR && (~ IR[4] || F[Flag_Z])); + if (tstate[2] ) + begin + if (SetEI == 1'b1 ) + begin + IntE_FF1 <= #1 1'b1; + IntE_FF2 <= #1 1'b1; + end + if (I_RETN == 1'b1 ) + begin + IntE_FF1 <= #1 IntE_FF2; + end + end + if (tstate[3] ) + begin + if (SetDI == 1'b1 ) + begin + IntE_FF1 <= #1 1'b0; + IntE_FF2 <= #1 1'b0; + end + end + if (IntCycle == 1'b1 || NMICycle == 1'b1 ) + begin + Halt_FF <= #1 1'b0; + end + if (mcycle[0] && tstate[2] && wait_n == 1'b1 ) + begin + m1_n <= #1 1'b1; + end + if (BusReq_s == 1'b1 && BusAck == 1'b1 ) + begin + end + else + begin + BusAck <= #1 1'b0; + if (tstate[2] && wait_n == 1'b0 ) + begin + end + else if (T_Res == 1'b1 ) + begin + if (Halt == 1'b1 ) + begin + Halt_FF <= #1 1'b1; + end + if (BusReq_s == 1'b1 ) + begin + BusAck <= #1 1'b1; + end + else + begin + tstate <= #1 7'b0000010; + if (NextIs_XY_Fetch == 1'b1 ) + begin + mcycle <= #1 7'b0100000; + Pre_XY_F_M <= #1 mcycle; + if (IR == 8'b00110110 && Mode == 0 ) + begin + Pre_XY_F_M <= #1 3'b010; + end + end + else if ((mcycle[6]) || (mcycle[5] && Mode == 1 && ISet != 2'b01) ) + begin + mcycle <= #1 number_to_bitvec(Pre_XY_F_M + 1); + end + else if ((last_mcycle) || + No_BTR == 1'b1 || + (mcycle[1] && I_DJNZ == 1'b1 && IncDecZ == 1'b1) ) + begin + m1_n <= #1 1'b0; + mcycle <= #1 7'b0000001; + IntCycle <= #1 1'b0; + NMICycle <= #1 1'b0; + if (NMI_s == 1'b1 && Prefix == 2'b00 ) + begin + NMICycle <= #1 1'b1; + IntE_FF1 <= #1 1'b0; + end + else if ((IntE_FF1 == 1'b1 && INT_s == 1'b1) && Prefix == 2'b00 && SetEI == 1'b0 ) + begin + IntCycle <= #1 1'b1; + IntE_FF1 <= #1 1'b0; + IntE_FF2 <= #1 1'b0; + end + end + else + begin + mcycle <= #1 { mcycle[5:0], mcycle[6] }; + end + end + end + else + begin // verilog has no "nor" operator + if ( ~(Auto_Wait == 1'b1 && Auto_Wait_t2 == 1'b0) && + ~(IOWait == 1 && iorq_i == 1'b1 && Auto_Wait_t1 == 1'b0) ) + begin + tstate <= #1 { tstate[5:0], tstate[6] }; + end + end + end + if (tstate[0]) + begin + m1_n <= #1 1'b0; + end + end + end + end + + always @(/*AUTOSENSE*/BTR_r or DI_Reg or IncDec_16 or JumpE or PC + or RegBusA or RegBusC or SP or tstate) + begin + if (JumpE == 1'b1 ) + begin + PC16_B = { {8{DI_Reg[7]}}, DI_Reg }; + end + else if (BTR_r == 1'b1 ) + begin + PC16_B = -2; + end + else + begin + PC16_B = 1; + end + + if (tstate[3]) + begin + SP16_A = RegBusC; + SP16_B = { {8{DI_Reg[7]}}, DI_Reg }; + end + else + begin + // suspect that ID16 and SP16 could be shared + SP16_A = SP; + + if (IncDec_16[3] == 1'b1) + SP16_B = -1; + else + SP16_B = 1; + end + + if (IncDec_16[3]) + ID16_B = -1; + else + ID16_B = 1; + + ID16 = RegBusA + ID16_B; + PC16 = PC + PC16_B; + SP16 = SP16_A + SP16_B; + end // always @ * + + + always @(/*AUTOSENSE*/IntCycle or NMICycle or mcycle) + begin + Auto_Wait = 1'b0; + if (IntCycle == 1'b1 || NMICycle == 1'b1 ) + begin + if (mcycle[0] ) + begin + Auto_Wait = 1'b1; + end + end + end // always @ * + +endmodule // T80 + diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80_mcode.v b/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80_mcode.v new file mode 100644 index 00000000..7d49cb51 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80_mcode.v @@ -0,0 +1,2724 @@ +// +// TV80 8-Bit Microprocessor Core +// Based on the VHDL T80 core by Daniel Wallner (jesus@opencores.org) +// +// Copyright (c) 2004 Guy Hutchison (ghutchis@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module tv80_mcode + (/*AUTOARG*/ + // Outputs + MCycles, TStates, Prefix, Inc_PC, Inc_WZ, IncDec_16, Read_To_Reg, + Read_To_Acc, Set_BusA_To, Set_BusB_To, ALU_Op, Save_ALU, PreserveC, + Arith16, Set_Addr_To, IORQ, Jump, JumpE, JumpXY, Call, RstP, LDZ, + LDW, LDSPHL, Special_LD, ExchangeDH, ExchangeRp, ExchangeAF, + ExchangeRS, I_DJNZ, I_CPL, I_CCF, I_SCF, I_RETN, I_BT, I_BC, I_BTR, + I_RLD, I_RRD, I_INRC, SetDI, SetEI, IMode, Halt, NoRead, Write, + // Inputs + IR, ISet, MCycle, F, NMICycle, IntCycle + ); + + parameter Mode = 0; + parameter Flag_C = 0; + parameter Flag_N = 1; + parameter Flag_P = 2; + parameter Flag_X = 3; + parameter Flag_H = 4; + parameter Flag_Y = 5; + parameter Flag_Z = 6; + parameter Flag_S = 7; + + input [7:0] IR; + input [1:0] ISet ; + input [6:0] MCycle ; + input [7:0] F ; + input NMICycle ; + input IntCycle ; + output [2:0] MCycles ; + output [2:0] TStates ; + output [1:0] Prefix ; // None,BC,ED,DD/FD + output Inc_PC ; + output Inc_WZ ; + output [3:0] IncDec_16 ; // BC,DE,HL,SP 0 is inc + output Read_To_Reg ; + output Read_To_Acc ; + output [3:0] Set_BusA_To ; // B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + output [3:0] Set_BusB_To ; // B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + output [3:0] ALU_Op ; + output Save_ALU ; + output PreserveC ; + output Arith16 ; + output [2:0] Set_Addr_To ; // aNone,aXY,aIOA,aSP,aBC,aDE,aZI + output IORQ ; + output Jump ; + output JumpE ; + output JumpXY ; + output Call ; + output RstP ; + output LDZ ; + output LDW ; + output LDSPHL ; + output [2:0] Special_LD ; // A,I;A,R;I,A;R,A;None + output ExchangeDH ; + output ExchangeRp ; + output ExchangeAF ; + output ExchangeRS ; + output I_DJNZ ; + output I_CPL ; + output I_CCF ; + output I_SCF ; + output I_RETN ; + output I_BT ; + output I_BC ; + output I_BTR ; + output I_RLD ; + output I_RRD ; + output I_INRC ; + output SetDI ; + output SetEI ; + output [1:0] IMode ; + output Halt ; + output NoRead ; + output Write ; + + // regs + reg [2:0] MCycles ; + reg [2:0] TStates ; + reg [1:0] Prefix ; // None,BC,ED,DD/FD + reg Inc_PC ; + reg Inc_WZ ; + reg [3:0] IncDec_16 ; // BC,DE,HL,SP 0 is inc + reg Read_To_Reg ; + reg Read_To_Acc ; + reg [3:0] Set_BusA_To ; // B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + reg [3:0] Set_BusB_To ; // B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + reg [3:0] ALU_Op ; + reg Save_ALU ; + reg PreserveC ; + reg Arith16 ; + reg [2:0] Set_Addr_To ; // aNone,aXY,aIOA,aSP,aBC,aDE,aZI + reg IORQ ; + reg Jump ; + reg JumpE ; + reg JumpXY ; + reg Call ; + reg RstP ; + reg LDZ ; + reg LDW ; + reg LDSPHL ; + reg [2:0] Special_LD ; // A,I;A,R;I,A;R,A;None + reg ExchangeDH ; + reg ExchangeRp ; + reg ExchangeAF ; + reg ExchangeRS ; + reg I_DJNZ ; + reg I_CPL ; + reg I_CCF ; + reg I_SCF ; + reg I_RETN ; + reg I_BT ; + reg I_BC ; + reg I_BTR ; + reg I_RLD ; + reg I_RRD ; + reg I_INRC ; + reg SetDI ; + reg SetEI ; + reg [1:0] IMode ; + reg Halt ; + reg NoRead ; + reg Write ; + + parameter aNone = 3'b111; + parameter aBC = 3'b000; + parameter aDE = 3'b001; + parameter aXY = 3'b010; + parameter aIOA = 3'b100; + parameter aSP = 3'b101; + parameter aZI = 3'b110; + // constant aNone : std_logic_vector[2:0] = 3'b000; + // constant aXY : std_logic_vector[2:0] = 3'b001; + // constant aIOA : std_logic_vector[2:0] = 3'b010; + // constant aSP : std_logic_vector[2:0] = 3'b011; + // constant aBC : std_logic_vector[2:0] = 3'b100; + // constant aDE : std_logic_vector[2:0] = 3'b101; + // constant aZI : std_logic_vector[2:0] = 3'b110; + + function is_cc_true; + input [7:0] F; + input [2:0] cc; + begin + if (Mode == 3 ) + begin + case (cc) + 3'b000 : is_cc_true = F[7] == 1'b0; // NZ + 3'b001 : is_cc_true = F[7] == 1'b1; // Z + 3'b010 : is_cc_true = F[4] == 1'b0; // NC + 3'b011 : is_cc_true = F[4] == 1'b1; // C + 3'b100 : is_cc_true = 0; + 3'b101 : is_cc_true = 0; + 3'b110 : is_cc_true = 0; + 3'b111 : is_cc_true = 0; + endcase + end + else + begin + case (cc) + 3'b000 : is_cc_true = F[6] == 1'b0; // NZ + 3'b001 : is_cc_true = F[6] == 1'b1; // Z + 3'b010 : is_cc_true = F[0] == 1'b0; // NC + 3'b011 : is_cc_true = F[0] == 1'b1; // C + 3'b100 : is_cc_true = F[2] == 1'b0; // PO + 3'b101 : is_cc_true = F[2] == 1'b1; // PE + 3'b110 : is_cc_true = F[7] == 1'b0; // P + 3'b111 : is_cc_true = F[7] == 1'b1; // M + endcase + end + end + endfunction // is_cc_true + + + reg [2:0] DDD; + reg [2:0] SSS; + reg [1:0] DPAIR; + reg [7:0] IRB; + + always @ (/*AUTOSENSE*/F or IR or ISet or IntCycle or MCycle + or NMICycle) + begin + DDD = IR[5:3]; + SSS = IR[2:0]; + DPAIR = IR[5:4]; + IRB = IR; + + MCycles = 3'b001; + if (MCycle[0] ) + begin + TStates = 3'b100; + end + else + begin + TStates = 3'b011; + end + Prefix = 2'b00; + Inc_PC = 1'b0; + Inc_WZ = 1'b0; + IncDec_16 = 4'b0000; + Read_To_Acc = 1'b0; + Read_To_Reg = 1'b0; + Set_BusB_To = 4'b0000; + Set_BusA_To = 4'b0000; + ALU_Op = { 1'b0, IR[5:3] }; + Save_ALU = 1'b0; + PreserveC = 1'b0; + Arith16 = 1'b0; + IORQ = 1'b0; + Set_Addr_To = aNone; + Jump = 1'b0; + JumpE = 1'b0; + JumpXY = 1'b0; + Call = 1'b0; + RstP = 1'b0; + LDZ = 1'b0; + LDW = 1'b0; + LDSPHL = 1'b0; + Special_LD = 3'b000; + ExchangeDH = 1'b0; + ExchangeRp = 1'b0; + ExchangeAF = 1'b0; + ExchangeRS = 1'b0; + I_DJNZ = 1'b0; + I_CPL = 1'b0; + I_CCF = 1'b0; + I_SCF = 1'b0; + I_RETN = 1'b0; + I_BT = 1'b0; + I_BC = 1'b0; + I_BTR = 1'b0; + I_RLD = 1'b0; + I_RRD = 1'b0; + I_INRC = 1'b0; + SetDI = 1'b0; + SetEI = 1'b0; + IMode = 2'b11; + Halt = 1'b0; + NoRead = 1'b0; + Write = 1'b0; + + case (ISet) + 2'b00 : + begin + + //---------------------------------------------------------------------------- + // + // Unprefixed instructions + // + //---------------------------------------------------------------------------- + + casex (IRB) + // 8 BIT LOAD GROUP + 8'b01xxxxxx : + begin + if (IRB[5:0] == 6'b110110) + Halt = 1'b1; + else if (IRB[2:0] == 3'b110) + begin + // LD r,(HL) + MCycles = 3'b010; + if (MCycle[0]) + Set_Addr_To = aXY; + if (MCycle[1]) + begin + Set_BusA_To[2:0] = DDD; + Read_To_Reg = 1'b1; + end + end // if (IRB[2:0] == 3'b110) + else if (IRB[5:3] == 3'b110) + begin + // LD (HL),r + MCycles = 3'b010; + if (MCycle[0]) + begin + Set_Addr_To = aXY; + Set_BusB_To[2:0] = SSS; + Set_BusB_To[3] = 1'b0; + end + if (MCycle[1]) + Write = 1'b1; + end // if (IRB[5:3] == 3'b110) + else + begin + Set_BusB_To[2:0] = SSS; + ExchangeRp = 1'b1; + Set_BusA_To[2:0] = DDD; + Read_To_Reg = 1'b1; + end // else: !if(IRB[5:3] == 3'b110) + end // case: 8'b01xxxxxx + + 8'b00xxx110 : + begin + if (IRB[5:3] == 3'b110) + begin + // LD (HL),n + MCycles = 3'b011; + if (MCycle[1]) + begin + Inc_PC = 1'b1; + Set_Addr_To = aXY; + Set_BusB_To[2:0] = SSS; + Set_BusB_To[3] = 1'b0; + end + if (MCycle[2]) + Write = 1'b1; + end // if (IRB[5:3] == 3'b110) + else + begin + // LD r,n + MCycles = 3'b010; + if (MCycle[1]) + begin + Inc_PC = 1'b1; + Set_BusA_To[2:0] = DDD; + Read_To_Reg = 1'b1; + end + end + end + + 8'b00001010 : + begin + // LD A,(BC) + MCycles = 3'b010; + if (MCycle[0]) + Set_Addr_To = aBC; + if (MCycle[1]) + Read_To_Acc = 1'b1; + end // case: 8'b00001010 + + 8'b00011010 : + begin + // LD A,(DE) + MCycles = 3'b010; + if (MCycle[0]) + Set_Addr_To = aDE; + if (MCycle[1]) + Read_To_Acc = 1'b1; + end // case: 8'b00011010 + + 8'b00111010 : + begin + if (Mode == 3 ) + begin + // LDD A,(HL) + MCycles = 3'b010; + if (MCycle[0]) + Set_Addr_To = aXY; + if (MCycle[1]) + begin + Read_To_Acc = 1'b1; + IncDec_16 = 4'b1110; + end + end + else + begin + // LD A,(nn) + MCycles = 3'b100; + if (MCycle[1]) + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + if (MCycle[2]) + begin + Set_Addr_To = aZI; + Inc_PC = 1'b1; + end + if (MCycle[3]) + begin + Read_To_Acc = 1'b1; + end + end // else: !if(Mode == 3 ) + end // case: 8'b00111010 + + 8'b00000010 : + begin + // LD (BC),A + MCycles = 3'b010; + if (MCycle[0]) + begin + Set_Addr_To = aBC; + Set_BusB_To = 4'b0111; + end + if (MCycle[1]) + begin + Write = 1'b1; + end + end // case: 8'b00000010 + + 8'b00010010 : + begin + // LD (DE),A + MCycles = 3'b010; + case (1'b1) // MCycle + MCycle[0] : + begin + Set_Addr_To = aDE; + Set_BusB_To = 4'b0111; + end + MCycle[1] : + Write = 1'b1; + default :; + endcase // case(MCycle) + end // case: 8'b00010010 + + 8'b00110010 : + begin + if (Mode == 3 ) + begin + // LDD (HL),A + MCycles = 3'b010; + case (1'b1) // MCycle + MCycle[0] : + begin + Set_Addr_To = aXY; + Set_BusB_To = 4'b0111; + end + MCycle[1] : + begin + Write = 1'b1; + IncDec_16 = 4'b1110; + end + default :; + endcase // case(MCycle) + + end + else + begin + // LD (nn),A + MCycles = 3'b100; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + MCycle[2] : + begin + Set_Addr_To = aZI; + Inc_PC = 1'b1; + Set_BusB_To = 4'b0111; + end + MCycle[3] : + begin + Write = 1'b1; + end + default :; + endcase + end // else: !if(Mode == 3 ) + end // case: 8'b00110010 + + + // 16 BIT LOAD GROUP + 8'b00000001,8'b00010001,8'b00100001,8'b00110001 : + begin + // LD dd,nn + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + Read_To_Reg = 1'b1; + if (DPAIR == 2'b11 ) + begin + Set_BusA_To[3:0] = 4'b1000; + end + else + begin + Set_BusA_To[2:1] = DPAIR; + Set_BusA_To[0] = 1'b1; + end + end // case: 2 + + MCycle[2] : + begin + Inc_PC = 1'b1; + Read_To_Reg = 1'b1; + if (DPAIR == 2'b11 ) + begin + Set_BusA_To[3:0] = 4'b1001; + end + else + begin + Set_BusA_To[2:1] = DPAIR; + Set_BusA_To[0] = 1'b0; + end + end // case: 3 + + default :; + endcase // case(MCycle) + end // case: 8'b00000001,8'b00010001,8'b00100001,8'b00110001 + + 8'b00101010 : + begin + if (Mode == 3 ) + begin + // LDI A,(HL) + MCycles = 3'b010; + case (1'b1) // MCycle + MCycle[0] : + Set_Addr_To = aXY; + MCycle[1] : + begin + Read_To_Acc = 1'b1; + IncDec_16 = 4'b0110; + end + + default :; + endcase + end + else + begin + // LD HL,(nn) + MCycles = 3'b101; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + MCycle[2] : + begin + Set_Addr_To = aZI; + Inc_PC = 1'b1; + LDW = 1'b1; + end + MCycle[3] : + begin + Set_BusA_To[2:0] = 3'b101; // L + Read_To_Reg = 1'b1; + Inc_WZ = 1'b1; + Set_Addr_To = aZI; + end + MCycle[4] : + begin + Set_BusA_To[2:0] = 3'b100; // H + Read_To_Reg = 1'b1; + end + default :; + endcase + end // else: !if(Mode == 3 ) + end // case: 8'b00101010 + + 8'b00100010 : + begin + if (Mode == 3 ) + begin + // LDI (HL),A + MCycles = 3'b010; + case (1'b1) // MCycle + MCycle[0] : + begin + Set_Addr_To = aXY; + Set_BusB_To = 4'b0111; + end + MCycle[1] : + begin + Write = 1'b1; + IncDec_16 = 4'b0110; + end + default :; + endcase + end + else + begin + // LD (nn),HL + MCycles = 3'b101; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + + MCycle[2] : + begin + Set_Addr_To = aZI; + Inc_PC = 1'b1; + LDW = 1'b1; + Set_BusB_To = 4'b0101; // L + end + + MCycle[3] : + begin + Inc_WZ = 1'b1; + Set_Addr_To = aZI; + Write = 1'b1; + Set_BusB_To = 4'b0100; // H + end + MCycle[4] : + Write = 1'b1; + default :; + endcase + end // else: !if(Mode == 3 ) + end // case: 8'b00100010 + + 8'b11111001 : + begin + // LD SP,HL + TStates = 3'b110; + LDSPHL = 1'b1; + end + + 8'b11xx0101 : + begin + // PUSH qq + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0] : + begin + TStates = 3'b101; + IncDec_16 = 4'b1111; + Set_Addr_To = aSP; + if (DPAIR == 2'b11 ) + begin + Set_BusB_To = 4'b0111; + end + else + begin + Set_BusB_To[2:1] = DPAIR; + Set_BusB_To[0] = 1'b0; + Set_BusB_To[3] = 1'b0; + end + end // case: 1 + + MCycle[1] : + begin + IncDec_16 = 4'b1111; + Set_Addr_To = aSP; + if (DPAIR == 2'b11 ) + begin + Set_BusB_To = 4'b1011; + end + else + begin + Set_BusB_To[2:1] = DPAIR; + Set_BusB_To[0] = 1'b1; + Set_BusB_To[3] = 1'b0; + end + Write = 1'b1; + end // case: 2 + + MCycle[2] : + Write = 1'b1; + default :; + endcase // case(MCycle) + end // case: 8'b11000101,8'b11010101,8'b11100101,8'b11110101 + + 8'b11xx0001 : + begin + // POP qq + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0] : + Set_Addr_To = aSP; + MCycle[1] : + begin + IncDec_16 = 4'b0111; + Set_Addr_To = aSP; + Read_To_Reg = 1'b1; + if (DPAIR == 2'b11 ) + begin + Set_BusA_To[3:0] = 4'b1011; + end + else + begin + Set_BusA_To[2:1] = DPAIR; + Set_BusA_To[0] = 1'b1; + end + end // case: 2 + + MCycle[2] : + begin + IncDec_16 = 4'b0111; + Read_To_Reg = 1'b1; + if (DPAIR == 2'b11 ) + begin + Set_BusA_To[3:0] = 4'b0111; + end + else + begin + Set_BusA_To[2:1] = DPAIR; + Set_BusA_To[0] = 1'b0; + end + end // case: 3 + + default :; + endcase // case(MCycle) + end // case: 8'b11000001,8'b11010001,8'b11100001,8'b11110001 + + + // EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + 8'b11101011 : + begin + if (Mode != 3 ) + begin + // EX DE,HL + ExchangeDH = 1'b1; + end + end + + 8'b00001000 : + begin + if (Mode == 3 ) + begin + // LD (nn),SP + MCycles = 3'b101; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + + MCycle[2] : + begin + Set_Addr_To = aZI; + Inc_PC = 1'b1; + LDW = 1'b1; + Set_BusB_To = 4'b1000; + end + + MCycle[3] : + begin + Inc_WZ = 1'b1; + Set_Addr_To = aZI; + Write = 1'b1; + Set_BusB_To = 4'b1001; + end + + MCycle[4] : + Write = 1'b1; + default :; + endcase + end + else if (Mode < 2 ) + begin + // EX AF,AF' + ExchangeAF = 1'b1; + end + end // case: 8'b00001000 + + 8'b11011001 : + begin + if (Mode == 3 ) + begin + // RETI + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0] : + Set_Addr_To = aSP; + MCycle[1] : + begin + IncDec_16 = 4'b0111; + Set_Addr_To = aSP; + LDZ = 1'b1; + end + + MCycle[2] : + begin + Jump = 1'b1; + IncDec_16 = 4'b0111; + I_RETN = 1'b1; + SetEI = 1'b1; + end + default :; + endcase + end + else if (Mode < 2 ) + begin + // EXX + ExchangeRS = 1'b1; + end + end // case: 8'b11011001 + + 8'b11100011 : + begin + if (Mode != 3 ) + begin + // EX (SP),HL + MCycles = 3'b101; + case (1'b1) // MCycle + MCycle[0] : + Set_Addr_To = aSP; + MCycle[1] : + begin + Read_To_Reg = 1'b1; + Set_BusA_To = 4'b0101; + Set_BusB_To = 4'b0101; + Set_Addr_To = aSP; + end + MCycle[2] : + begin + IncDec_16 = 4'b0111; + Set_Addr_To = aSP; + TStates = 3'b100; + Write = 1'b1; + end + MCycle[3] : + begin + Read_To_Reg = 1'b1; + Set_BusA_To = 4'b0100; + Set_BusB_To = 4'b0100; + Set_Addr_To = aSP; + end + MCycle[4] : + begin + IncDec_16 = 4'b1111; + TStates = 3'b101; + Write = 1'b1; + end + + default :; + endcase + end // if (Mode != 3 ) + end // case: 8'b11100011 + + + // 8 BIT ARITHMETIC AND LOGICAL GROUP + 8'b10xxxxxx : + begin + if (IR[2:0] == 3'b110) + begin + // ADD A,(HL) + // ADC A,(HL) + // SUB A,(HL) + // SBC A,(HL) + // AND A,(HL) + // OR A,(HL) + // XOR A,(HL) + // CP A,(HL) + MCycles = 3'b010; + case (1'b1) // MCycle + MCycle[0] : + Set_Addr_To = aXY; + MCycle[1] : + begin + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + Set_BusB_To[2:0] = SSS; + Set_BusA_To[2:0] = 3'b111; + end + + default :; + endcase // case(MCycle) + end // if (IR[2:0] == 3'b110) + else + begin + // ADD A,r + // ADC A,r + // SUB A,r + // SBC A,r + // AND A,r + // OR A,r + // XOR A,r + // CP A,r + Set_BusB_To[2:0] = SSS; + Set_BusA_To[2:0] = 3'b111; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + end // else: !if(IR[2:0] == 3'b110) + end // case: 8'b10000000,8'b10000001,8'b10000010,8'b10000011,8'b10000100,8'b10000101,8'b10000111,... + + 8'b11xxx110 : + begin + // ADD A,n + // ADC A,n + // SUB A,n + // SBC A,n + // AND A,n + // OR A,n + // XOR A,n + // CP A,n + MCycles = 3'b010; + if (MCycle[1] ) + begin + Inc_PC = 1'b1; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + Set_BusB_To[2:0] = SSS; + Set_BusA_To[2:0] = 3'b111; + end + end + + 8'b00xxx100 : + begin + if (IRB[5:3] == 3'b110) + begin + // INC (HL) + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0] : + Set_Addr_To = aXY; + MCycle[1] : + begin + TStates = 3'b100; + Set_Addr_To = aXY; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + PreserveC = 1'b1; + ALU_Op = 4'b0000; + Set_BusB_To = 4'b1010; + Set_BusA_To[2:0] = DDD; + end // case: 2 + + MCycle[2] : + Write = 1'b1; + default :; + endcase // case(MCycle) + end // case: 8'b00110100 + else + begin + // INC r + Set_BusB_To = 4'b1010; + Set_BusA_To[2:0] = DDD; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + PreserveC = 1'b1; + ALU_Op = 4'b0000; + end + end + + 8'b00xxx101 : + begin + if (IRB[5:3] == 3'b110) + begin + // DEC (HL) + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0] : + Set_Addr_To = aXY; + MCycle[1] : + begin + TStates = 3'b100; + Set_Addr_To = aXY; + ALU_Op = 4'b0010; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + PreserveC = 1'b1; + Set_BusB_To = 4'b1010; + Set_BusA_To[2:0] = DDD; + end // case: 2 + + MCycle[2] : + Write = 1'b1; + default :; + endcase // case(MCycle) + end + else + begin + // DEC r + Set_BusB_To = 4'b1010; + Set_BusA_To[2:0] = DDD; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + PreserveC = 1'b1; + ALU_Op = 4'b0010; + end + end + + // GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + 8'b00100111 : + begin + // DAA + Set_BusA_To[2:0] = 3'b111; + Read_To_Reg = 1'b1; + ALU_Op = 4'b1100; + Save_ALU = 1'b1; + end + + 8'b00101111 : + // CPL + I_CPL = 1'b1; + + 8'b00111111 : + // CCF + I_CCF = 1'b1; + + 8'b00110111 : + // SCF + I_SCF = 1'b1; + + 8'b00000000 : + begin + if (NMICycle == 1'b1 ) + begin + // NMI + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0] : + begin + TStates = 3'b101; + IncDec_16 = 4'b1111; + Set_Addr_To = aSP; + Set_BusB_To = 4'b1101; + end + + MCycle[1] : + begin + TStates = 3'b100; + Write = 1'b1; + IncDec_16 = 4'b1111; + Set_Addr_To = aSP; + Set_BusB_To = 4'b1100; + end + + MCycle[2] : + begin + TStates = 3'b100; + Write = 1'b1; + end + + default :; + endcase // case(MCycle) + + end + else if (IntCycle == 1'b1 ) + begin + // INT (IM 2) + MCycles = 3'b101; + case (1'b1) // MCycle + MCycle[0] : + begin + LDZ = 1'b1; + TStates = 3'b101; + IncDec_16 = 4'b1111; + Set_Addr_To = aSP; + Set_BusB_To = 4'b1101; + end + + MCycle[1] : + begin + TStates = 3'b100; + Write = 1'b1; + IncDec_16 = 4'b1111; + Set_Addr_To = aSP; + Set_BusB_To = 4'b1100; + end + + MCycle[2] : + begin + TStates = 3'b100; + Write = 1'b1; + end + + MCycle[3] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + + MCycle[4] : + Jump = 1'b1; + default :; + endcase + end + end // case: 8'b00000000 + + 8'b11110011 : + // DI + SetDI = 1'b1; + + 8'b11111011 : + // EI + SetEI = 1'b1; + + // 16 BIT ARITHMETIC GROUP + 8'b00001001,8'b00011001,8'b00101001,8'b00111001 : + begin + // ADD HL,ss + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + NoRead = 1'b1; + ALU_Op = 4'b0000; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + Set_BusA_To[2:0] = 3'b101; + case (IR[5:4]) + 0,1,2 : + begin + Set_BusB_To[2:1] = IR[5:4]; + Set_BusB_To[0] = 1'b1; + end + + default : + Set_BusB_To = 4'b1000; + endcase // case(IR[5:4]) + + TStates = 3'b100; + Arith16 = 1'b1; + end // case: 2 + + MCycle[2] : + begin + NoRead = 1'b1; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + ALU_Op = 4'b0001; + Set_BusA_To[2:0] = 3'b100; + case (IR[5:4]) + 0,1,2 : + Set_BusB_To[2:1] = IR[5:4]; + default : + Set_BusB_To = 4'b1001; + endcase + Arith16 = 1'b1; + end // case: 3 + + default :; + endcase // case(MCycle) + end // case: 8'b00001001,8'b00011001,8'b00101001,8'b00111001 + + 8'b00000011,8'b00010011,8'b00100011,8'b00110011 : + begin + // INC ss + TStates = 3'b110; + IncDec_16[3:2] = 2'b01; + IncDec_16[1:0] = DPAIR; + end + + 8'b00001011,8'b00011011,8'b00101011,8'b00111011 : + begin + // DEC ss + TStates = 3'b110; + IncDec_16[3:2] = 2'b11; + IncDec_16[1:0] = DPAIR; + end + + // ROTATE AND SHIFT GROUP + 8'b00000111, + // RLCA + 8'b00010111, + // RLA + 8'b00001111, + // RRCA + 8'b00011111 : + // RRA + begin + Set_BusA_To[2:0] = 3'b111; + ALU_Op = 4'b1000; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + end // case: 8'b00000111,... + + + // JUMP GROUP + 8'b11000011 : + begin + // JP nn + MCycles = 3'b011; + if (MCycle[1]) + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + + if (MCycle[2]) + begin + Inc_PC = 1'b1; + Jump = 1'b1; + end + + end // case: 8'b11000011 + + 8'b11000010,8'b11001010,8'b11010010,8'b11011010,8'b11100010,8'b11101010,8'b11110010,8'b11111010 : + begin + if (IR[5] == 1'b1 && Mode == 3 ) + begin + case (IRB[4:3]) + 2'b00 : + begin + // LD ($FF00+C),A + MCycles = 3'b010; + case (1'b1) // MCycle + MCycle[0] : + begin + Set_Addr_To = aBC; + Set_BusB_To = 4'b0111; + end + MCycle[1] : + begin + Write = 1'b1; + IORQ = 1'b1; + end + + default :; + endcase // case(MCycle) + end // case: 2'b00 + + 2'b01 : + begin + // LD (nn),A + MCycles = 3'b100; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + + MCycle[2] : + begin + Set_Addr_To = aZI; + Inc_PC = 1'b1; + Set_BusB_To = 4'b0111; + end + + MCycle[3] : + Write = 1'b1; + default :; + endcase // case(MCycle) + end // case: default :... + + 2'b10 : + begin + // LD A,($FF00+C) + MCycles = 3'b010; + case (1'b1) // MCycle + MCycle[0] : + Set_Addr_To = aBC; + MCycle[1] : + begin + Read_To_Acc = 1'b1; + IORQ = 1'b1; + end + default :; + endcase // case(MCycle) + end // case: 2'b10 + + 2'b11 : + begin + // LD A,(nn) + MCycles = 3'b100; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + MCycle[2] : + begin + Set_Addr_To = aZI; + Inc_PC = 1'b1; + end + MCycle[3] : + Read_To_Acc = 1'b1; + default :; + endcase // case(MCycle) + end + endcase + end + else + begin + // JP cc,nn + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + MCycle[2] : + begin + Inc_PC = 1'b1; + if (is_cc_true(F, IR[5:3]) ) + begin + Jump = 1'b1; + end + end + + default :; + endcase + end // else: !if(DPAIR == 2'b11 ) + end // case: 8'b11000010,8'b11001010,8'b11010010,8'b11011010,8'b11100010,8'b11101010,8'b11110010,8'b11111010 + + 8'b00011000 : + begin + if (Mode != 2 ) + begin + // JR e + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + Inc_PC = 1'b1; + MCycle[2] : + begin + NoRead = 1'b1; + JumpE = 1'b1; + TStates = 3'b101; + end + default :; + endcase + end // if (Mode != 2 ) + end // case: 8'b00011000 + + 8'b00111000 : + begin + if (Mode != 2 ) + begin + // JR C,e + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + if (F[Flag_C] == 1'b0 ) + begin + MCycles = 3'b010; + end + end + + MCycle[2] : + begin + NoRead = 1'b1; + JumpE = 1'b1; + TStates = 3'b101; + end + default :; + endcase + end // if (Mode != 2 ) + end // case: 8'b00111000 + + 8'b00110000 : + begin + if (Mode != 2 ) + begin + // JR NC,e + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + if (F[Flag_C] == 1'b1 ) + begin + MCycles = 3'b010; + end + end + + MCycle[2] : + begin + NoRead = 1'b1; + JumpE = 1'b1; + TStates = 3'b101; + end + default :; + endcase + end // if (Mode != 2 ) + end // case: 8'b00110000 + + 8'b00101000 : + begin + if (Mode != 2 ) + begin + // JR Z,e + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + if (F[Flag_Z] == 1'b0 ) + begin + MCycles = 3'b010; + end + end + + MCycle[2] : + begin + NoRead = 1'b1; + JumpE = 1'b1; + TStates = 3'b101; + end + + default :; + endcase + end // if (Mode != 2 ) + end // case: 8'b00101000 + + 8'b00100000 : + begin + if (Mode != 2 ) + begin + // JR NZ,e + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + if (F[Flag_Z] == 1'b1 ) + begin + MCycles = 3'b010; + end + end + MCycle[2] : + begin + NoRead = 1'b1; + JumpE = 1'b1; + TStates = 3'b101; + end + default :; + endcase + end // if (Mode != 2 ) + end // case: 8'b00100000 + + 8'b11101001 : + // JP (HL) + JumpXY = 1'b1; + + 8'b00010000 : + begin + if (Mode == 3 ) + begin + I_DJNZ = 1'b1; + end + else if (Mode < 2 ) + begin + // DJNZ,e + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0] : + begin + TStates = 3'b101; + I_DJNZ = 1'b1; + Set_BusB_To = 4'b1010; + Set_BusA_To[2:0] = 3'b000; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + ALU_Op = 4'b0010; + end + MCycle[1] : + begin + I_DJNZ = 1'b1; + Inc_PC = 1'b1; + end + MCycle[2] : + begin + NoRead = 1'b1; + JumpE = 1'b1; + TStates = 3'b101; + end + default :; + endcase + end // if (Mode < 2 ) + end // case: 8'b00010000 + + + // CALL AND RETURN GROUP + 8'b11001101 : + begin + // CALL nn + MCycles = 3'b101; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + MCycle[2] : + begin + IncDec_16 = 4'b1111; + Inc_PC = 1'b1; + TStates = 3'b100; + Set_Addr_To = aSP; + LDW = 1'b1; + Set_BusB_To = 4'b1101; + end + MCycle[3] : + begin + Write = 1'b1; + IncDec_16 = 4'b1111; + Set_Addr_To = aSP; + Set_BusB_To = 4'b1100; + end + MCycle[4] : + begin + Write = 1'b1; + Call = 1'b1; + end + default :; + endcase // case(MCycle) + end // case: 8'b11001101 + + 8'b11000100,8'b11001100,8'b11010100,8'b11011100,8'b11100100,8'b11101100,8'b11110100,8'b11111100 : + begin + if (IR[5] == 1'b0 || Mode != 3 ) + begin + // CALL cc,nn + MCycles = 3'b101; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + MCycle[2] : + begin + Inc_PC = 1'b1; + LDW = 1'b1; + if (is_cc_true(F, IR[5:3]) ) + begin + IncDec_16 = 4'b1111; + Set_Addr_To = aSP; + TStates = 3'b100; + Set_BusB_To = 4'b1101; + end + else + begin + MCycles = 3'b011; + end // else: !if(is_cc_true(F, IR[5:3]) ) + end // case: 3 + + MCycle[3] : + begin + Write = 1'b1; + IncDec_16 = 4'b1111; + Set_Addr_To = aSP; + Set_BusB_To = 4'b1100; + end + + MCycle[4] : + begin + Write = 1'b1; + Call = 1'b1; + end + + default :; + endcase + end // if (IR[5] == 1'b0 || Mode != 3 ) + end // case: 8'b11000100,8'b11001100,8'b11010100,8'b11011100,8'b11100100,8'b11101100,8'b11110100,8'b11111100 + + 8'b11001001 : + begin + // RET + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0] : + begin + TStates = 3'b101; + Set_Addr_To = aSP; + end + + MCycle[1] : + begin + IncDec_16 = 4'b0111; + Set_Addr_To = aSP; + LDZ = 1'b1; + end + + MCycle[2] : + begin + Jump = 1'b1; + IncDec_16 = 4'b0111; + end + + default :; + endcase // case(MCycle) + end // case: 8'b11001001 + + 8'b11000000,8'b11001000,8'b11010000,8'b11011000,8'b11100000,8'b11101000,8'b11110000,8'b11111000 : + begin + if (IR[5] == 1'b1 && Mode == 3 ) + begin + case (IRB[4:3]) + 2'b00 : + begin + // LD ($FF00+nn),A + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + Set_Addr_To = aIOA; + Set_BusB_To = 4'b0111; + end + + MCycle[2] : + Write = 1'b1; + default :; + endcase // case(MCycle) + end // case: 2'b00 + + 2'b01 : + begin + // ADD SP,n + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + ALU_Op = 4'b0000; + Inc_PC = 1'b1; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + Set_BusA_To = 4'b1000; + Set_BusB_To = 4'b0110; + end + + MCycle[2] : + begin + NoRead = 1'b1; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + ALU_Op = 4'b0001; + Set_BusA_To = 4'b1001; + Set_BusB_To = 4'b1110; // Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + end + + default :; + endcase // case(MCycle) + end // case: 2'b01 + + 2'b10 : + begin + // LD A,($FF00+nn) + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + Set_Addr_To = aIOA; + end + + MCycle[2] : + Read_To_Acc = 1'b1; + default :; + endcase // case(MCycle) + end // case: 2'b10 + + 2'b11 : + begin + // LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles = 3'b101; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + + MCycle[2] : + begin + Set_Addr_To = aZI; + Inc_PC = 1'b1; + LDW = 1'b1; + end + + MCycle[3] : + begin + Set_BusA_To[2:0] = 3'b101; // L + Read_To_Reg = 1'b1; + Inc_WZ = 1'b1; + Set_Addr_To = aZI; + end + + MCycle[4] : + begin + Set_BusA_To[2:0] = 3'b100; // H + Read_To_Reg = 1'b1; + end + + default :; + endcase // case(MCycle) + end // case: 2'b11 + + endcase // case(IRB[4:3]) + + end + else + begin + // RET cc + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0] : + begin + if (is_cc_true(F, IR[5:3]) ) + begin + Set_Addr_To = aSP; + end + else + begin + MCycles = 3'b001; + end + TStates = 3'b101; + end // case: 1 + + MCycle[1] : + begin + IncDec_16 = 4'b0111; + Set_Addr_To = aSP; + LDZ = 1'b1; + end + MCycle[2] : + begin + Jump = 1'b1; + IncDec_16 = 4'b0111; + end + default :; + endcase + end // else: !if(IR[5] == 1'b1 && Mode == 3 ) + end // case: 8'b11000000,8'b11001000,8'b11010000,8'b11011000,8'b11100000,8'b11101000,8'b11110000,8'b11111000 + + 8'b11000111,8'b11001111,8'b11010111,8'b11011111,8'b11100111,8'b11101111,8'b11110111,8'b11111111 : + begin + // RST p + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0] : + begin + TStates = 3'b101; + IncDec_16 = 4'b1111; + Set_Addr_To = aSP; + Set_BusB_To = 4'b1101; + end + + MCycle[1] : + begin + Write = 1'b1; + IncDec_16 = 4'b1111; + Set_Addr_To = aSP; + Set_BusB_To = 4'b1100; + end + + MCycle[2] : + begin + Write = 1'b1; + RstP = 1'b1; + end + + default :; + endcase // case(MCycle) + end // case: 8'b11000111,8'b11001111,8'b11010111,8'b11011111,8'b11100111,8'b11101111,8'b11110111,8'b11111111 + + // INPUT AND OUTPUT GROUP + 8'b11011011 : + begin + if (Mode != 3 ) + begin + // IN A,(n) + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + Set_Addr_To = aIOA; + end + + MCycle[2] : + begin + Read_To_Acc = 1'b1; + IORQ = 1'b1; + end + + default :; + endcase + end // if (Mode != 3 ) + end // case: 8'b11011011 + + 8'b11010011 : + begin + if (Mode != 3 ) + begin + // OUT (n),A + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + Set_Addr_To = aIOA; + Set_BusB_To = 4'b0111; + end + + MCycle[2] : + begin + Write = 1'b1; + IORQ = 1'b1; + end + + default :; + endcase + end // if (Mode != 3 ) + end // case: 8'b11010011 + + + //---------------------------------------------------------------------------- + //---------------------------------------------------------------------------- + // MULTIBYTE INSTRUCTIONS + //---------------------------------------------------------------------------- + //---------------------------------------------------------------------------- + + 8'b11001011 : + begin + if (Mode != 2 ) + begin + Prefix = 2'b01; + end + end + + 8'b11101101 : + begin + if (Mode < 2 ) + begin + Prefix = 2'b10; + end + end + + 8'b11011101,8'b11111101 : + begin + if (Mode < 2 ) + begin + Prefix = 2'b11; + end + end + + endcase // case(IRB) + end // case: 2'b00 + + + 2'b01 : + begin + + + //---------------------------------------------------------------------------- + // + // CB prefixed instructions + // + //---------------------------------------------------------------------------- + + Set_BusA_To[2:0] = IR[2:0]; + Set_BusB_To[2:0] = IR[2:0]; + + case (IRB) + 8'b00000000,8'b00000001,8'b00000010,8'b00000011,8'b00000100,8'b00000101,8'b00000111, + 8'b00010000,8'b00010001,8'b00010010,8'b00010011,8'b00010100,8'b00010101,8'b00010111, + 8'b00001000,8'b00001001,8'b00001010,8'b00001011,8'b00001100,8'b00001101,8'b00001111, + 8'b00011000,8'b00011001,8'b00011010,8'b00011011,8'b00011100,8'b00011101,8'b00011111, + 8'b00100000,8'b00100001,8'b00100010,8'b00100011,8'b00100100,8'b00100101,8'b00100111, + 8'b00101000,8'b00101001,8'b00101010,8'b00101011,8'b00101100,8'b00101101,8'b00101111, + 8'b00110000,8'b00110001,8'b00110010,8'b00110011,8'b00110100,8'b00110101,8'b00110111, + 8'b00111000,8'b00111001,8'b00111010,8'b00111011,8'b00111100,8'b00111101,8'b00111111 : + begin + // RLC r + // RL r + // RRC r + // RR r + // SLA r + // SRA r + // SRL r + // SLL r (Undocumented) / SWAP r + if (MCycle[0] ) begin + ALU_Op = 4'b1000; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + end + end // case: 8'b00000000,8'b00000001,8'b00000010,8'b00000011,8'b00000100,8'b00000101,8'b00000111,... + + 8'b00000110,8'b00010110,8'b00001110,8'b00011110,8'b00101110,8'b00111110,8'b00100110,8'b00110110 : + begin + // RLC (HL) + // RL (HL) + // RRC (HL) + // RR (HL) + // SRA (HL) + // SRL (HL) + // SLA (HL) + // SLL (HL) (Undocumented) / SWAP (HL) + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0], MCycle[6] : + Set_Addr_To = aXY; + MCycle[1] : + begin + ALU_Op = 4'b1000; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + Set_Addr_To = aXY; + TStates = 3'b100; + end + + MCycle[2] : + Write = 1'b1; + default :; + endcase // case(MCycle) + end // case: 8'b00000110,8'b00010110,8'b00001110,8'b00011110,8'b00101110,8'b00111110,8'b00100110,8'b00110110 + + 8'b01000000,8'b01000001,8'b01000010,8'b01000011,8'b01000100,8'b01000101,8'b01000111, + 8'b01001000,8'b01001001,8'b01001010,8'b01001011,8'b01001100,8'b01001101,8'b01001111, + 8'b01010000,8'b01010001,8'b01010010,8'b01010011,8'b01010100,8'b01010101,8'b01010111, + 8'b01011000,8'b01011001,8'b01011010,8'b01011011,8'b01011100,8'b01011101,8'b01011111, + 8'b01100000,8'b01100001,8'b01100010,8'b01100011,8'b01100100,8'b01100101,8'b01100111, + 8'b01101000,8'b01101001,8'b01101010,8'b01101011,8'b01101100,8'b01101101,8'b01101111, + 8'b01110000,8'b01110001,8'b01110010,8'b01110011,8'b01110100,8'b01110101,8'b01110111, + 8'b01111000,8'b01111001,8'b01111010,8'b01111011,8'b01111100,8'b01111101,8'b01111111 : + begin + // BIT b,r + if (MCycle[0] ) + begin + Set_BusB_To[2:0] = IR[2:0]; + ALU_Op = 4'b1001; + end + end // case: 8'b01000000,8'b01000001,8'b01000010,8'b01000011,8'b01000100,8'b01000101,8'b01000111,... + + 8'b01000110,8'b01001110,8'b01010110,8'b01011110,8'b01100110,8'b01101110,8'b01110110,8'b01111110 : + begin + // BIT b,(HL) + MCycles = 3'b010; + case (1'b1) // MCycle + MCycle[0], MCycle[6] : + Set_Addr_To = aXY; + MCycle[1] : + begin + ALU_Op = 4'b1001; + TStates = 3'b100; + end + + default :; + endcase // case(MCycle) + end // case: 8'b01000110,8'b01001110,8'b01010110,8'b01011110,8'b01100110,8'b01101110,8'b01110110,8'b01111110 + + 8'b11000000,8'b11000001,8'b11000010,8'b11000011,8'b11000100,8'b11000101,8'b11000111, + 8'b11001000,8'b11001001,8'b11001010,8'b11001011,8'b11001100,8'b11001101,8'b11001111, + 8'b11010000,8'b11010001,8'b11010010,8'b11010011,8'b11010100,8'b11010101,8'b11010111, + 8'b11011000,8'b11011001,8'b11011010,8'b11011011,8'b11011100,8'b11011101,8'b11011111, + 8'b11100000,8'b11100001,8'b11100010,8'b11100011,8'b11100100,8'b11100101,8'b11100111, + 8'b11101000,8'b11101001,8'b11101010,8'b11101011,8'b11101100,8'b11101101,8'b11101111, + 8'b11110000,8'b11110001,8'b11110010,8'b11110011,8'b11110100,8'b11110101,8'b11110111, + 8'b11111000,8'b11111001,8'b11111010,8'b11111011,8'b11111100,8'b11111101,8'b11111111 : + begin + // SET b,r + if (MCycle[0] ) + begin + ALU_Op = 4'b1010; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + end + end // case: 8'b11000000,8'b11000001,8'b11000010,8'b11000011,8'b11000100,8'b11000101,8'b11000111,... + + 8'b11000110,8'b11001110,8'b11010110,8'b11011110,8'b11100110,8'b11101110,8'b11110110,8'b11111110 : + begin + // SET b,(HL) + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0], MCycle[6] : + Set_Addr_To = aXY; + MCycle[1] : + begin + ALU_Op = 4'b1010; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + Set_Addr_To = aXY; + TStates = 3'b100; + end + MCycle[2] : + Write = 1'b1; + default :; + endcase // case(MCycle) + end // case: 8'b11000110,8'b11001110,8'b11010110,8'b11011110,8'b11100110,8'b11101110,8'b11110110,8'b11111110 + + 8'b10000000,8'b10000001,8'b10000010,8'b10000011,8'b10000100,8'b10000101,8'b10000111, + 8'b10001000,8'b10001001,8'b10001010,8'b10001011,8'b10001100,8'b10001101,8'b10001111, + 8'b10010000,8'b10010001,8'b10010010,8'b10010011,8'b10010100,8'b10010101,8'b10010111, + 8'b10011000,8'b10011001,8'b10011010,8'b10011011,8'b10011100,8'b10011101,8'b10011111, + 8'b10100000,8'b10100001,8'b10100010,8'b10100011,8'b10100100,8'b10100101,8'b10100111, + 8'b10101000,8'b10101001,8'b10101010,8'b10101011,8'b10101100,8'b10101101,8'b10101111, + 8'b10110000,8'b10110001,8'b10110010,8'b10110011,8'b10110100,8'b10110101,8'b10110111, + 8'b10111000,8'b10111001,8'b10111010,8'b10111011,8'b10111100,8'b10111101,8'b10111111 : + begin + // RES b,r + if (MCycle[0] ) + begin + ALU_Op = 4'b1011; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + end + end // case: 8'b10000000,8'b10000001,8'b10000010,8'b10000011,8'b10000100,8'b10000101,8'b10000111,... + + 8'b10000110,8'b10001110,8'b10010110,8'b10011110,8'b10100110,8'b10101110,8'b10110110,8'b10111110 : + begin + // RES b,(HL) + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0], MCycle[6] : + Set_Addr_To = aXY; + MCycle[1] : + begin + ALU_Op = 4'b1011; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + Set_Addr_To = aXY; + TStates = 3'b100; + end + + MCycle[2] : + Write = 1'b1; + default :; + endcase // case(MCycle) + end // case: 8'b10000110,8'b10001110,8'b10010110,8'b10011110,8'b10100110,8'b10101110,8'b10110110,8'b10111110 + + endcase // case(IRB) + end // case: 2'b01 + + + default : + begin : default_ed_block + + //---------------------------------------------------------------------------- + // + // ED prefixed instructions + // + //---------------------------------------------------------------------------- + + case (IRB) + 8'b00000000,8'b00000001,8'b00000010,8'b00000011,8'b00000100,8'b00000101,8'b00000110,8'b00000111 + ,8'b00001000,8'b00001001,8'b00001010,8'b00001011,8'b00001100,8'b00001101,8'b00001110,8'b00001111 + ,8'b00010000,8'b00010001,8'b00010010,8'b00010011,8'b00010100,8'b00010101,8'b00010110,8'b00010111 + ,8'b00011000,8'b00011001,8'b00011010,8'b00011011,8'b00011100,8'b00011101,8'b00011110,8'b00011111 + ,8'b00100000,8'b00100001,8'b00100010,8'b00100011,8'b00100100,8'b00100101,8'b00100110,8'b00100111 + ,8'b00101000,8'b00101001,8'b00101010,8'b00101011,8'b00101100,8'b00101101,8'b00101110,8'b00101111 + ,8'b00110000,8'b00110001,8'b00110010,8'b00110011,8'b00110100,8'b00110101,8'b00110110,8'b00110111 + ,8'b00111000,8'b00111001,8'b00111010,8'b00111011,8'b00111100,8'b00111101,8'b00111110,8'b00111111 + + + ,8'b10000000,8'b10000001,8'b10000010,8'b10000011,8'b10000100,8'b10000101,8'b10000110,8'b10000111 + ,8'b10001000,8'b10001001,8'b10001010,8'b10001011,8'b10001100,8'b10001101,8'b10001110,8'b10001111 + ,8'b10010000,8'b10010001,8'b10010010,8'b10010011,8'b10010100,8'b10010101,8'b10010110,8'b10010111 + ,8'b10011000,8'b10011001,8'b10011010,8'b10011011,8'b10011100,8'b10011101,8'b10011110,8'b10011111 + , 8'b10100100,8'b10100101,8'b10100110,8'b10100111 + , 8'b10101100,8'b10101101,8'b10101110,8'b10101111 + , 8'b10110100,8'b10110101,8'b10110110,8'b10110111 + , 8'b10111100,8'b10111101,8'b10111110,8'b10111111 + ,8'b11000000,8'b11000001,8'b11000010,8'b11000011,8'b11000100,8'b11000101,8'b11000110,8'b11000111 + ,8'b11001000,8'b11001001,8'b11001010,8'b11001011,8'b11001100,8'b11001101,8'b11001110,8'b11001111 + ,8'b11010000,8'b11010001,8'b11010010,8'b11010011,8'b11010100,8'b11010101,8'b11010110,8'b11010111 + ,8'b11011000,8'b11011001,8'b11011010,8'b11011011,8'b11011100,8'b11011101,8'b11011110,8'b11011111 + ,8'b11100000,8'b11100001,8'b11100010,8'b11100011,8'b11100100,8'b11100101,8'b11100110,8'b11100111 + ,8'b11101000,8'b11101001,8'b11101010,8'b11101011,8'b11101100,8'b11101101,8'b11101110,8'b11101111 + ,8'b11110000,8'b11110001,8'b11110010,8'b11110011,8'b11110100,8'b11110101,8'b11110110,8'b11110111 + ,8'b11111000,8'b11111001,8'b11111010,8'b11111011,8'b11111100,8'b11111101,8'b11111110,8'b11111111 : + ; // NOP, undocumented + + 8'b01111110,8'b01111111 : + // NOP, undocumented + ; + // 8 BIT LOAD GROUP + 8'b01010111 : + begin + // LD A,I + Special_LD = 3'b100; + TStates = 3'b101; + end + + 8'b01011111 : + begin + // LD A,R + Special_LD = 3'b101; + TStates = 3'b101; + end + + 8'b01000111 : + begin + // LD I,A + Special_LD = 3'b110; + TStates = 3'b101; + end + + 8'b01001111 : + begin + // LD R,A + Special_LD = 3'b111; + TStates = 3'b101; + end + + // 16 BIT LOAD GROUP + 8'b01001011,8'b01011011,8'b01101011,8'b01111011 : + begin + // LD dd,(nn) + MCycles = 3'b101; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + + MCycle[2] : + begin + Set_Addr_To = aZI; + Inc_PC = 1'b1; + LDW = 1'b1; + end + + MCycle[3] : + begin + Read_To_Reg = 1'b1; + if (IR[5:4] == 2'b11 ) + begin + Set_BusA_To = 4'b1000; + end + else + begin + Set_BusA_To[2:1] = IR[5:4]; + Set_BusA_To[0] = 1'b1; + end + Inc_WZ = 1'b1; + Set_Addr_To = aZI; + end // case: 4 + + MCycle[4] : + begin + Read_To_Reg = 1'b1; + if (IR[5:4] == 2'b11 ) + begin + Set_BusA_To = 4'b1001; + end + else + begin + Set_BusA_To[2:1] = IR[5:4]; + Set_BusA_To[0] = 1'b0; + end + end // case: 5 + + default :; + endcase // case(MCycle) + end // case: 8'b01001011,8'b01011011,8'b01101011,8'b01111011 + + + 8'b01000011,8'b01010011,8'b01100011,8'b01110011 : + begin + // LD (nn),dd + MCycles = 3'b101; + case (1'b1) // MCycle + MCycle[1] : + begin + Inc_PC = 1'b1; + LDZ = 1'b1; + end + + MCycle[2] : + begin + Set_Addr_To = aZI; + Inc_PC = 1'b1; + LDW = 1'b1; + if (IR[5:4] == 2'b11 ) + begin + Set_BusB_To = 4'b1000; + end + else + begin + Set_BusB_To[2:1] = IR[5:4]; + Set_BusB_To[0] = 1'b1; + Set_BusB_To[3] = 1'b0; + end + end // case: 3 + + MCycle[3] : + begin + Inc_WZ = 1'b1; + Set_Addr_To = aZI; + Write = 1'b1; + if (IR[5:4] == 2'b11 ) + begin + Set_BusB_To = 4'b1001; + end + else + begin + Set_BusB_To[2:1] = IR[5:4]; + Set_BusB_To[0] = 1'b0; + Set_BusB_To[3] = 1'b0; + end + end // case: 4 + + MCycle[4] : + begin + Write = 1'b1; + end + + default :; + endcase // case(MCycle) + end // case: 8'b01000011,8'b01010011,8'b01100011,8'b01110011 + + 8'b10100000 , 8'b10101000 , 8'b10110000 , 8'b10111000 : + begin + // LDI, LDD, LDIR, LDDR + MCycles = 3'b100; + case (1'b1) // MCycle + MCycle[0] : + begin + Set_Addr_To = aXY; + IncDec_16 = 4'b1100; // BC + end + + MCycle[1] : + begin + Set_BusB_To = 4'b0110; + Set_BusA_To[2:0] = 3'b111; + ALU_Op = 4'b0000; + Set_Addr_To = aDE; + if (IR[3] == 1'b0 ) + begin + IncDec_16 = 4'b0110; // IX + end + else + begin + IncDec_16 = 4'b1110; + end + end // case: 2 + + MCycle[2] : + begin + I_BT = 1'b1; + TStates = 3'b101; + Write = 1'b1; + if (IR[3] == 1'b0 ) + begin + IncDec_16 = 4'b0101; // DE + end + else + begin + IncDec_16 = 4'b1101; + end + end // case: 3 + + MCycle[3] : + begin + NoRead = 1'b1; + TStates = 3'b101; + end + + default :; + endcase // case(MCycle) + end // case: 8'b10100000 , 8'b10101000 , 8'b10110000 , 8'b10111000 + + 8'b10100001 , 8'b10101001 , 8'b10110001 , 8'b10111001 : + begin + // CPI, CPD, CPIR, CPDR + MCycles = 3'b100; + case (1'b1) // MCycle + MCycle[0] : + begin + Set_Addr_To = aXY; + IncDec_16 = 4'b1100; // BC + end + + MCycle[1] : + begin + Set_BusB_To = 4'b0110; + Set_BusA_To[2:0] = 3'b111; + ALU_Op = 4'b0111; + Save_ALU = 1'b1; + PreserveC = 1'b1; + if (IR[3] == 1'b0 ) + begin + IncDec_16 = 4'b0110; + end + else + begin + IncDec_16 = 4'b1110; + end + end // case: 2 + + MCycle[2] : + begin + NoRead = 1'b1; + I_BC = 1'b1; + TStates = 3'b101; + end + + MCycle[3] : + begin + NoRead = 1'b1; + TStates = 3'b101; + end + + default :; + endcase // case(MCycle) + end // case: 8'b10100001 , 8'b10101001 , 8'b10110001 , 8'b10111001 + + 8'b01000100,8'b01001100,8'b01010100,8'b01011100,8'b01100100,8'b01101100,8'b01110100,8'b01111100 : + begin + // NEG + ALU_Op = 4'b0010; + Set_BusB_To = 4'b0111; + Set_BusA_To = 4'b1010; + Read_To_Acc = 1'b1; + Save_ALU = 1'b1; + end + + 8'b01000110,8'b01001110,8'b01100110,8'b01101110 : + begin + // IM 0 + IMode = 2'b00; + end + + 8'b01010110,8'b01110110 : + // IM 1 + IMode = 2'b01; + + 8'b01011110,8'b01110111 : + // IM 2 + IMode = 2'b10; + + // 16 bit arithmetic + 8'b01001010,8'b01011010,8'b01101010,8'b01111010 : + begin + // ADC HL,ss + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + NoRead = 1'b1; + ALU_Op = 4'b0001; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + Set_BusA_To[2:0] = 3'b101; + case (IR[5:4]) + 0,1,2 : + begin + Set_BusB_To[2:1] = IR[5:4]; + Set_BusB_To[0] = 1'b1; + end + default : + Set_BusB_To = 4'b1000; + endcase + TStates = 3'b100; + end // case: 2 + + MCycle[2] : + begin + NoRead = 1'b1; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + ALU_Op = 4'b0001; + Set_BusA_To[2:0] = 3'b100; + case (IR[5:4]) + 0,1,2 : + begin + Set_BusB_To[2:1] = IR[5:4]; + Set_BusB_To[0] = 1'b0; + end + default : + Set_BusB_To = 4'b1001; + endcase // case(IR[5:4]) + end // case: 3 + + default :; + endcase // case(MCycle) + end // case: 8'b01001010,8'b01011010,8'b01101010,8'b01111010 + + 8'b01000010,8'b01010010,8'b01100010,8'b01110010 : + begin + // SBC HL,ss + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[1] : + begin + NoRead = 1'b1; + ALU_Op = 4'b0011; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + Set_BusA_To[2:0] = 3'b101; + case (IR[5:4]) + 0,1,2 : + begin + Set_BusB_To[2:1] = IR[5:4]; + Set_BusB_To[0] = 1'b1; + end + default : + Set_BusB_To = 4'b1000; + endcase + TStates = 3'b100; + end // case: 2 + + MCycle[2] : + begin + NoRead = 1'b1; + ALU_Op = 4'b0011; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + Set_BusA_To[2:0] = 3'b100; + case (IR[5:4]) + 0,1,2 : + Set_BusB_To[2:1] = IR[5:4]; + default : + Set_BusB_To = 4'b1001; + endcase + end // case: 3 + + default :; + + endcase // case(MCycle) + end // case: 8'b01000010,8'b01010010,8'b01100010,8'b01110010 + + 8'b01101111 : + begin + // RLD + MCycles = 3'b100; + case (1'b1) // MCycle + MCycle[1] : + begin + NoRead = 1'b1; + Set_Addr_To = aXY; + end + + MCycle[2] : + begin + Read_To_Reg = 1'b1; + Set_BusB_To[2:0] = 3'b110; + Set_BusA_To[2:0] = 3'b111; + ALU_Op = 4'b1101; + TStates = 3'b100; + Set_Addr_To = aXY; + Save_ALU = 1'b1; + end + + MCycle[3] : + begin + I_RLD = 1'b1; + Write = 1'b1; + end + + default :; + endcase // case(MCycle) + end // case: 8'b01101111 + + 8'b01100111 : + begin + // RRD + MCycles = 3'b100; + case (1'b1) // MCycle + MCycle[1] : + Set_Addr_To = aXY; + MCycle[2] : + begin + Read_To_Reg = 1'b1; + Set_BusB_To[2:0] = 3'b110; + Set_BusA_To[2:0] = 3'b111; + ALU_Op = 4'b1110; + TStates = 3'b100; + Set_Addr_To = aXY; + Save_ALU = 1'b1; + end + + MCycle[3] : + begin + I_RRD = 1'b1; + Write = 1'b1; + end + + default :; + endcase // case(MCycle) + end // case: 8'b01100111 + + 8'b01000101,8'b01001101,8'b01010101,8'b01011101,8'b01100101,8'b01101101,8'b01110101,8'b01111101 : + begin + // RETI, RETN + MCycles = 3'b011; + case (1'b1) // MCycle + MCycle[0] : + Set_Addr_To = aSP; + + MCycle[1] : + begin + IncDec_16 = 4'b0111; + Set_Addr_To = aSP; + LDZ = 1'b1; + end + + MCycle[2] : + begin + Jump = 1'b1; + IncDec_16 = 4'b0111; + I_RETN = 1'b1; + end + + default :; + endcase // case(MCycle) + end // case: 8'b01000101,8'b01001101,8'b01010101,8'b01011101,8'b01100101,8'b01101101,8'b01110101,8'b01111101 + + 8'b01000000,8'b01001000,8'b01010000,8'b01011000,8'b01100000,8'b01101000,8'b01110000,8'b01111000 : + begin + // IN r,(C) + MCycles = 3'b010; + case (1'b1) // MCycle + MCycle[0] : + Set_Addr_To = aBC; + + MCycle[1] : + begin + IORQ = 1'b1; + if (IR[5:3] != 3'b110 ) + begin + Read_To_Reg = 1'b1; + Set_BusA_To[2:0] = IR[5:3]; + end + I_INRC = 1'b1; + end + + default :; + endcase // case(MCycle) + end // case: 8'b01000000,8'b01001000,8'b01010000,8'b01011000,8'b01100000,8'b01101000,8'b01110000,8'b01111000 + + 8'b01000001,8'b01001001,8'b01010001,8'b01011001,8'b01100001,8'b01101001,8'b01110001,8'b01111001 : + begin + // OUT (C),r + // OUT (C),0 + MCycles = 3'b010; + case (1'b1) // MCycle + MCycle[0] : + begin + Set_Addr_To = aBC; + Set_BusB_To[2:0] = IR[5:3]; + if (IR[5:3] == 3'b110 ) + begin + Set_BusB_To[3] = 1'b1; + end + end + + MCycle[1] : + begin + Write = 1'b1; + IORQ = 1'b1; + end + + default :; + endcase // case(MCycle) + end // case: 8'b01000001,8'b01001001,8'b01010001,8'b01011001,8'b01100001,8'b01101001,8'b01110001,8'b01111001 + + 8'b10100010 , 8'b10101010 , 8'b10110010 , 8'b10111010 : + begin + // INI, IND, INIR, INDR + MCycles = 3'b100; + case (1'b1) // MCycle + MCycle[0] : + begin + Set_Addr_To = aBC; + Set_BusB_To = 4'b1010; + Set_BusA_To = 4'b0000; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + ALU_Op = 4'b0010; + end + + MCycle[1] : + begin + IORQ = 1'b1; + Set_BusB_To = 4'b0110; + Set_Addr_To = aXY; + end + + MCycle[2] : + begin + if (IR[3] == 1'b0 ) + begin + IncDec_16 = 4'b0110; + end + else + begin + IncDec_16 = 4'b1110; + end + TStates = 3'b100; + Write = 1'b1; + I_BTR = 1'b1; + end // case: 3 + + MCycle[3] : + begin + NoRead = 1'b1; + TStates = 3'b101; + end + + default :; + endcase // case(MCycle) + end // case: 8'b10100010 , 8'b10101010 , 8'b10110010 , 8'b10111010 + + 8'b10100011 , 8'b10101011 , 8'b10110011 , 8'b10111011 : + begin + // OUTI, OUTD, OTIR, OTDR + MCycles = 3'b100; + case (1'b1) // MCycle + MCycle[0] : + begin + TStates = 3'b101; + Set_Addr_To = aXY; + Set_BusB_To = 4'b1010; + Set_BusA_To = 4'b0000; + Read_To_Reg = 1'b1; + Save_ALU = 1'b1; + ALU_Op = 4'b0010; + end + + MCycle[1] : + begin + Set_BusB_To = 4'b0110; + Set_Addr_To = aBC; + if (IR[3] == 1'b0 ) + begin + IncDec_16 = 4'b0110; + end + else + begin + IncDec_16 = 4'b1110; + end + end + + MCycle[2] : + begin + if (IR[3] == 1'b0 ) + begin + IncDec_16 = 4'b0010; + end + else + begin + IncDec_16 = 4'b1010; + end + IORQ = 1'b1; + Write = 1'b1; + I_BTR = 1'b1; + end // case: 3 + + MCycle[3] : + begin + NoRead = 1'b1; + TStates = 3'b101; + end + + default :; + endcase // case(MCycle) + end // case: 8'b10100011 , 8'b10101011 , 8'b10110011 , 8'b10111011 + + endcase // case(IRB) + end // block: default_ed_block + endcase // case(ISet) + + if (Mode == 1 ) + begin + if (MCycle[0] ) + begin + //TStates = 3'b100; + end + else + begin + TStates = 3'b011; + end + end + + if (Mode == 3 ) + begin + if (MCycle[0] ) + begin + //TStates = 3'b100; + end + else + begin + TStates = 3'b100; + end + end + + if (Mode < 2 ) + begin + if (MCycle[5] ) + begin + Inc_PC = 1'b1; + if (Mode == 1 ) + begin + Set_Addr_To = aXY; + TStates = 3'b100; + Set_BusB_To[2:0] = SSS; + Set_BusB_To[3] = 1'b0; + end + if (IRB == 8'b00110110 || IRB == 8'b11001011 ) + begin + Set_Addr_To = aNone; + end + end + if (MCycle[6] ) + begin + if (Mode == 0 ) + begin + TStates = 3'b101; + end + if (ISet != 2'b01 ) + begin + Set_Addr_To = aXY; + end + Set_BusB_To[2:0] = SSS; + Set_BusB_To[3] = 1'b0; + if (IRB == 8'b00110110 || ISet == 2'b01 ) + begin + // LD (HL),n + Inc_PC = 1'b1; + end + else + begin + NoRead = 1'b1; + end + end + end // if (Mode < 2 ) + + end // always @ (IR, ISet, MCycle, F, NMICycle, IntCycle) + +endmodule // T80_MCode diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80_reg.v b/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80_reg.v new file mode 100644 index 00000000..9d378330 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80_reg.v @@ -0,0 +1,68 @@ +// +// TV80 8-Bit Microprocessor Core +// Based on the VHDL T80 core by Daniel Wallner (jesus@opencores.org) +// +// Copyright (c) 2004 Guy Hutchison (ghutchis@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module tv80_reg (/*AUTOARG*/ + // Outputs + DOBH, DOAL, DOCL, DOBL, DOCH, DOAH, + // Inputs + AddrC, AddrA, AddrB, DIH, DIL, clk, CEN, WEH, WEL + ); + input [2:0] AddrC; + output [7:0] DOBH; + input [2:0] AddrA; + input [2:0] AddrB; + input [7:0] DIH; + output [7:0] DOAL; + output [7:0] DOCL; + input [7:0] DIL; + output [7:0] DOBL; + output [7:0] DOCH; + output [7:0] DOAH; + input clk, CEN, WEH, WEL; + + reg [7:0] RegsH [0:7]; + reg [7:0] RegsL [0:7]; + + always @(posedge clk) + begin + if (CEN) + begin + if (WEH) RegsH[AddrA] <= DIH; + if (WEL) RegsL[AddrA] <= DIL; + end + end + + assign DOAH = RegsH[AddrA]; + assign DOAL = RegsL[AddrA]; + assign DOBH = RegsH[AddrB]; + assign DOBL = RegsL[AddrB]; + assign DOCH = RegsH[AddrC]; + assign DOCL = RegsL[AddrC]; + + // break out ram bits for waveform debug + wire [7:0] H = RegsH[2]; + wire [7:0] L = RegsL[2]; + +endmodule + diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80n.v b/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80n.v new file mode 100644 index 00000000..b7802e33 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/T80/tv80n.v @@ -0,0 +1,182 @@ +// +// TV80 8-Bit Microprocessor Core +// Based on the VHDL T80 core by Daniel Wallner (jesus@opencores.org) +// +// Copyright (c) 2004 Guy Hutchison (ghutchis@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// Negative-edge based wrapper allows memory wait_n signal to work +// correctly without resorting to asynchronous logic. + +module tv80n (/*AUTOARG*/ + // Outputs + m1_n, mreq_n, iorq_n, rd_n, wr_n, rfsh_n, halt_n, busak_n, A, dout, + // Inputs + reset_n, clk, wait_n, int_n, nmi_n, busrq_n, di + ); + + parameter Mode = 0; // 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + parameter T2Write = 0; // 0 => wr_n active in T3, /=0 => wr_n active in T2 + parameter IOWait = 1; // 0 => Single cycle I/O, 1 => Std I/O cycle + + + input reset_n; + input clk; + input wait_n; + input int_n; + input nmi_n; + input busrq_n; + output m1_n; + output mreq_n; + output iorq_n; + output rd_n; + output wr_n; + output rfsh_n; + output halt_n; + output busak_n; + output [15:0] A; + input [7:0] di; + output [7:0] dout; + + reg mreq_n; + reg iorq_n; + reg rd_n; + reg wr_n; + reg nxt_mreq_n; + reg nxt_iorq_n; + reg nxt_rd_n; + reg nxt_wr_n; + + wire cen; + wire intcycle_n; + wire no_read; + wire write; + wire iorq; + reg [7:0] di_reg; + wire [6:0] mcycle; + wire [6:0] tstate; + + assign cen = 1; + + tv80_core #(Mode, IOWait) i_tv80_core + ( + .cen (cen), + .m1_n (m1_n), + .iorq (iorq), + .no_read (no_read), + .write (write), + .rfsh_n (rfsh_n), + .halt_n (halt_n), + .wait_n (wait_n), + .int_n (int_n), + .nmi_n (nmi_n), + .reset_n (reset_n), + .busrq_n (busrq_n), + .busak_n (busak_n), + .clk (clk), + .IntE (), + .stop (), + .A (A), + .dinst (di), + .di (di_reg), + .dout (dout), + .mc (mcycle), + .ts (tstate), + .intcycle_n (intcycle_n) + ); + + always @* + begin + nxt_mreq_n = 1; + nxt_rd_n = 1; + nxt_iorq_n = 1; + nxt_wr_n = 1; + + if (mcycle[0]) + begin + if (tstate[1] || tstate[2]) + begin + nxt_rd_n = ~ intcycle_n; + nxt_mreq_n = ~ intcycle_n; + nxt_iorq_n = intcycle_n; + end + end // if (mcycle[0]) + else + begin + if ((tstate[1] || tstate[2]) && !no_read && !write) + begin + nxt_rd_n = 1'b0; + nxt_iorq_n = ~ iorq; + nxt_mreq_n = iorq; + end + if (T2Write == 0) + begin + if (tstate[2] && write) + begin + nxt_wr_n = 1'b0; + nxt_iorq_n = ~ iorq; + nxt_mreq_n = iorq; + end + end + else + begin + if ((tstate[1] || (tstate[2] && !wait_n)) && write) + begin + nxt_wr_n = 1'b0; + nxt_iorq_n = ~ iorq; + nxt_mreq_n = iorq; + end + end // else: !if(T2write == 0) + end // else: !if(mcycle[0]) + end // always @ * + + always @(negedge clk) + begin + if (!reset_n) + begin + rd_n <= #1 1'b1; + wr_n <= #1 1'b1; + iorq_n <= #1 1'b1; + mreq_n <= #1 1'b1; + end + else + begin + rd_n <= #1 nxt_rd_n; + wr_n <= #1 nxt_wr_n; + iorq_n <= #1 nxt_iorq_n; + mreq_n <= #1 nxt_mreq_n; + end // else: !if(!reset_n) + end // always @ (posedge clk or negedge reset_n) + + always @(posedge clk) + begin + if (!reset_n) + begin + di_reg <= #1 0; + end + else + begin + if (tstate[2] && wait_n == 1'b1) + di_reg <= #1 di; + end // else: !if(!reset_n) + end // always @ (posedge clk) + +endmodule // t80n + diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/ace.hex b/Jupiter Cantab - JupiterACE_MiST/rtl/ace.hex new file mode 100644 index 00000000..fcc8b102 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/ace.hex @@ -0,0 +1,8192 @@ +F3 +21 +00 +3C +3E +FC +18 +20 +D9 +DD +CB +3E +5E +C3 +EE +03 +2A +3B +3C +73 +23 +C3 +5F +08 +2A +3B +3C +2B +56 +C3 +59 +08 +E1 +7E +32 +3D +3C +C3 +AD +00 +24 +77 +BE +28 +FB +A4 +67 +22 +18 +3C +F9 +21 +0D +01 +18 +03 +C3 +3A +01 +11 +24 +3C +01 +2D +00 +ED +B0 +DD +21 +00 +3C +FD +21 +C8 +04 +CD +24 +0A +AF +32 +00 +27 +21 +00 +2C +7D +E6 +BF +0F +0F +0F +30 +02 +0F +0F +0F +47 +9F +CB +18 +47 +9F +A8 +E6 +F0 +A8 +77 +2C +20 +E7 +11 +FF +2F +21 +FB +1F +01 +08 +00 +ED +B8 +EB +3E +5F +0E +07 +CB +6F +28 +03 +70 +2B +0D +EB +ED +B8 +EB +70 +2B +3D +20 +EE +ED +56 +18 +09 +51 +55 +49 +D4 +00 +00 +04 +9B +00 +ED +7B +18 +3C +FB +C3 +F2 +04 +41 +42 +4F +52 +D4 +98 +00 +05 +AD +00 +FD +E5 +FD +21 +B9 +04 +2A +37 +3C +22 +3B +3C +21 +3E +3C +7E +E6 +B3 +CB +56 +77 +28 +1A +CD +B9 +04 +90 +04 +B3 +08 +4B +10 +05 +D2 +0D +6B +08 +10 +16 +B5 +15 +11 +10 +37 +3C +C1 +08 +0E +1A +DD +CB +3D +7E +20 +1B +CD +08 +18 +45 +52 +52 +4F +D2 +CD +B9 +04 +11 +10 +3D +3C +96 +08 +B3 +09 +95 +0A +0E +1A +DD +36 +3D +FF +2A +37 +3C +01 +0C +00 +09 +22 +3B +3C +FD +E1 +18 +8E +E0 +26 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +4C +3C +4C +3C +4F +3C +51 +3C +45 +3C +5D +3C +FF +00 +0A +46 +4F +52 +54 +C8 +00 +00 +FF +1F +05 +B5 +11 +49 +3C +00 +00 +00 +F5 +08 +F5 +C5 +D5 +E5 +06 +3E +10 +FE +21 +2B +3C +34 +23 +28 +FC +CD +10 +03 +21 +28 +3C +CB +46 +28 +21 +A7 +28 +1E +FE +20 +38 +14 +CB +4E +C4 +07 +08 +CB +56 +28 +02 +E6 +9F +CB +5E +28 +02 +F6 +80 +CD +96 +01 +CD +E6 +01 +CD +82 +02 +E1 +D1 +C1 +F1 +08 +F1 +FB +C9 +FE +0D +20 +14 +21 +00 +27 +22 +22 +3C +22 +20 +3C +AF +CD +98 +01 +21 +E0 +26 +22 +1E +3C +C9 +A7 +C8 +08 +2A +22 +3C +7E +A7 +28 +06 +11 +00 +D9 +19 +30 +28 +ED +5B +24 +3C +21 +A0 +DB +19 +30 +34 +2A +1C +3C +01 +20 +00 +09 +ED +52 +D5 +D4 +21 +04 +CD +B0 +02 +D1 +CD +2F +04 +21 +1E +3C +06 +04 +CD +43 +04 +10 +FB +CD +02 +03 +54 +5D +23 +22 +22 +3C +2B +2B +28 +02 +ED +B8 +08 +12 +13 +ED +53 +20 +3C +AF +C9 +21 +F0 +01 +16 +00 +5F +19 +5E +19 +E9 +20 +13 +0C +1E +0A +37 +1A +50 +06 +9C +C9 +15 +14 +D3 +21 +28 +3C +AE +77 +C9 +2A +20 +3C +2B +7E +A7 +C8 +22 +20 +3C +23 +77 +C9 +2A +20 +3C +23 +ED +5B +22 +3C +A7 +ED +52 +C8 +19 +22 +20 +3C +7E +2B +77 +C9 +2A +20 +3C +23 +22 +20 +3C +CD +02 +03 +62 +6B +1B +1A +A7 +C8 +ED +53 +20 +3C +78 +B1 +28 +02 +ED +B0 +2B +36 +20 +22 +22 +3C +0C +C9 +CD +04 +02 +28 +08 +06 +1F +CD +04 +02 +10 +FB +C9 +2A +1E +3C +ED +5B +24 +3C +A7 +ED +52 +C8 +CD +25 +02 +2A +1E +3C +11 +E0 +FF +AF +19 +BE +20 +FC +22 +1E +3C +CD +F4 +02 +22 +20 +3C +3E +A0 +CD +7E +01 +2A +20 +3C +2B +22 +20 +3C +2A +20 +3C +3A +28 +3C +1F +36 +97 +1F +30 +02 +36 +C3 +1F +D0 +36 +C7 +C9 +CD +11 +02 +28 +08 +06 +1F +CD +11 +02 +10 +FB +C9 +CD +B0 +02 +E0 +E5 +CD +25 +02 +E1 +CD +ED +02 +18 +C6 +21 +00 +27 +ED +5B +1E +3C +A7 +ED +52 +44 +4D +EB +23 +AF +ED +B1 +2B +C9 +2A +22 +3C +2B +22 +20 +3C +CD +2C +02 +20 +FB +C9 +21 +28 +3C +CB +EE +CB +86 +C9 +21 +00 +27 +ED +5B +24 +3C +CD +FA +07 +21 +E0 +26 +22 +24 +3C +36 +00 +2A +24 +3C +22 +1E +3C +23 +22 +20 +3C +CD +B0 +02 +3E +20 +2B +BE +28 +FC +23 +22 +22 +3C +C9 +2A +22 +3C +ED +5B +20 +3C +A7 +ED +52 +44 +4D +19 +C9 +CD +36 +03 +47 +2A +26 +3C +AD +28 +0B +AD +28 +03 +AF +BD +C0 +68 +26 +20 +18 +0D +25 +7C +FE +1E +28 +06 +AF +BC +20 +03 +26 +04 +7D +22 +26 +3C +C9 +01 +FE +FE +ED +50 +5A +CB +3A +9F +E6 +D8 +CB +3A +38 +02 +3E +28 +C6 +57 +6F +7B +F6 +03 +1E +FF +2F +E6 +1F +57 +28 +0D +7D +1C +20 +12 +D6 +08 +CB +3A +30 +FA +5F +20 +09 +2D +CB +00 +30 +06 +ED +78 +18 +E4 +1E +FF +7B +3C +C8 +21 +76 +03 +19 +7E +C9 +76 +68 +79 +36 +35 +74 +67 +63 +62 +6A +75 +37 +34 +72 +66 +78 +6E +6B +69 +38 +33 +65 +64 +7A +6D +6C +6F +39 +32 +77 +73 +00 +20 +0D +70 +30 +31 +71 +61 +00 +56 +48 +59 +07 +01 +54 +47 +43 +42 +4A +55 +09 +08 +52 +46 +58 +4E +4B +49 +03 +33 +45 +44 +5A +4D +4C +4F +04 +02 +57 +53 +00 +20 +0D +50 +05 +0A +51 +41 +00 +2F +5E +5B +26 +25 +3E +7D +3F +2A +2D +5D +27 +24 +3C +7B +60 +2C +2B +7F +28 +23 +45 +5C +3A +2E +3D +3B +29 +40 +57 +7C +00 +20 +0D +22 +5F +21 +51 +7E +00 +28 +05 +CD +7E +01 +D9 +C9 +47 +2A +29 +3C +7C +B5 +78 +28 +01 +E9 +2A +1C +3C +ED +5B +24 +3C +EB +37 +ED +52 +EB +DC +21 +04 +FE +0D +28 +04 +77 +23 +18 +06 +23 +7D +E6 +1F +20 +FA +22 +1C +3C +D9 +C9 +F5 +21 +1C +3C +CD +43 +04 +F1 +2A +24 +3C +11 +20 +24 +A7 +ED +52 +44 +4D +21 +E0 +FF +19 +EB +ED +B0 +06 +20 +2B +36 +20 +10 +FB +C9 +7E +D6 +20 +77 +23 +30 +01 +35 +23 +C9 +EB +5E +16 +00 +21 +00 +3C +19 +EB +D7 +FD +E9 +48 +45 +52 +C5 +AA +00 +04 +62 +04 +ED +5B +37 +3C +D7 +FD +E9 +43 +4F +4E +54 +45 +58 +D4 +5F +04 +07 +4D +04 +33 +43 +55 +52 +52 +45 +4E +D4 +72 +04 +07 +4D +04 +31 +42 +41 +53 +C5 +7F +04 +04 +4D +04 +3F +4D +04 +3E +4D +04 +39 +50 +41 +C4 +89 +04 +03 +F5 +0F +01 +27 +BB +98 +04 +41 +08 +11 +B6 +04 +D8 +12 +0A +0E +1A +21 +3E +3C +7E +E6 +BB +77 +FD +E9 +00 +E8 +FF +B8 +04 +E1 +E1 +5E +23 +56 +23 +E5 +EB +5E +23 +56 +23 +EB +E9 +C8 +04 +01 +0B +00 +ED +5B +3B +3C +2A +37 +3C +09 +ED +52 +38 +02 +E7 +02 +01 +00 +00 +CD +8C +0F +CD +E4 +04 +18 +D5 +3E +FE +DB +FE +1F +D8 +3E +7F +DB +FE +1F +D8 +E7 +03 +CD +B9 +04 +8C +05 +06 +05 +36 +05 +76 +12 +F7 +FF +4C +49 +4E +C5 +A0 +04 +04 +C3 +0E +C6 +04 +3D +06 +EE +08 +83 +12 +07 +00 +4F +05 +76 +12 +F1 +FF +A9 +06 +EE +08 +83 +12 +07 +00 +64 +05 +76 +12 +E3 +FF +1B +06 +1A +0C +83 +12 +03 +00 +B6 +04 +78 +05 +76 +12 +D3 +FF +38 +05 +3A +3E +3C +CB +77 +20 +0E +CB +67 +20 +0A +CD +08 +18 +20 +4F +4B +A0 +3E +0D +CF +FD +E9 +51 +05 +DF +1B +1A +2F +DD +A6 +3E +E6 +40 +13 +28 +04 +D7 +11 +4E +0F +C3 +BF +04 +66 +05 +DF +DD +CB +3E +76 +20 +F4 +FD +E9 +52 +45 +54 +59 +50 +C5 +8B +05 +06 +7A +05 +CD +EA +02 +CD +76 +02 +36 +BF +18 +10 +51 +55 +45 +52 +D9 +05 +05 +05 +8E +05 +CD +D8 +02 +CD +76 +02 +21 +28 +3C +CB +C6 +CB +AE +CB +6E +28 +FC +CD +25 +02 +FD +E9 +57 +4F +52 +C4 +77 +05 +04 +AD +05 +DF +21 +FE +27 +06 +FD +36 +20 +2B +10 +FB +D5 +EB +D7 +D1 +CD +E1 +05 +04 +05 +28 +03 +01 +FF +00 +21 +01 +27 +71 +23 +3E +FC +B9 +30 +01 +4F +0C +D5 +C5 +EB +ED +B0 +C1 +D1 +0D +CD +DA +07 +FD +E9 +1E +20 +2A +24 +3C +22 +1E +3C +01 +00 +00 +23 +7E +BB +28 +FB +A7 +28 +0E +E5 +03 +23 +7E +A7 +28 +03 +BB +20 +F7 +D1 +AF +B8 +C9 +D5 +CD +B0 +02 +E2 +14 +06 +ED +5B +24 +3C +CD +FA +07 +22 +24 +3C +D1 +18 +CD +EB +C1 +01 +00 +00 +37 +C9 +1D +06 +CD +DF +05 +50 +59 +D7 +FD +E9 +56 +4C +49 +53 +D4 +AA +05 +05 +2F +06 +3E +0D +CF +0E +00 +18 +0E +46 +49 +4E +C4 +2C +06 +04 +3F +06 +CD +DF +05 +38 +46 +2A +33 +3C +7E +23 +66 +6F +7E +E6 +3F +28 +2F +A9 +28 +04 +79 +A7 +20 +28 +D5 +E5 +CD +E8 +15 +B1 +28 +17 +41 +1A +CD +07 +08 +13 +AE +E6 +7F +23 +20 +12 +10 +F3 +D1 +13 +D7 +D1 +CD +DA +07 +FD +E9 +CD +FB +17 +76 +CD +E4 +04 +E1 +D1 +2B +7E +2B +6E +67 +B5 +20 +C4 +C3 +8A +06 +11 +00 +00 +D7 +FD +E9 +45 +58 +45 +43 +55 +54 +C5 +3C +06 +07 +9C +06 +DF +C3 +BF +04 +4E +55 +4D +42 +45 +D2 +99 +06 +06 +AB +06 +CD +DF +05 +38 +DA +C5 +D5 +CD +4C +07 +20 +05 +11 +06 +10 +18 +58 +DF +11 +00 +00 +D7 +11 +00 +45 +C1 +C5 +0A +FE +2D +20 +03 +16 +C5 +03 +D7 +50 +59 +2B +2B +CD +23 +07 +23 +34 +2B +30 +F8 +FE +FE +20 +3D +CD +23 +07 +30 +FB +C6 +30 +CD +7B +07 +20 +04 +1E +00 +18 +0E +E6 +DF +FE +45 +20 +27 +E5 +CD +4C +07 +DF +E1 +20 +1F +CD +40 +07 +28 +0F +23 +7E +E6 +7F +83 +FA +1C +07 +28 +10 +AE +E6 +7F +AE +77 +11 +55 +10 +D7 +D1 +C1 +CD +DA +07 +FD +E9 +E1 +E1 +DF +DF +C3 +8A +06 +1A +13 +D6 +30 +D8 +FE +0A +3F +D8 +4F +7E +E6 +F0 +C0 +79 +2B +2B +0E +03 +ED +6F +23 +0D +20 +FA +35 +2B +BF +C9 +06 +06 +AF +CD +2C +07 +C0 +10 +F9 +23 +70 +C9 +D7 +CD +B9 +04 +6B +08 +96 +08 +4B +10 +2D +4A +0C +6B +08 +A9 +0D +D2 +08 +D2 +0D +1F +0E +88 +06 +88 +06 +FF +08 +8A +07 +FF +08 +DF +08 +94 +0D +FF +08 +79 +08 +85 +08 +0E +1A +DF +1A +FE +20 +C8 +A7 +C9 +43 +4F +4E +56 +45 +52 +D4 +A8 +06 +07 +C3 +0E +09 +0E +6B +08 +D2 +08 +96 +08 +B8 +07 +83 +12 +1B +00 +85 +08 +8A +04 +96 +08 +A8 +0C +79 +08 +FF +08 +8A +04 +96 +08 +A8 +0C +EE +0D +DF +08 +76 +12 +D9 +FF +DF +08 +B6 +04 +BA +07 +DF +7B +CD +07 +08 +C6 +D0 +30 +14 +FE +0A +38 +06 +C6 +EF +30 +0C +C6 +0A +DD +BE +3F +30 +05 +16 +00 +5F +D7 +37 +C3 +21 +0C +62 +6B +03 +09 +E5 +DD +CB +3E +66 +CC +7F +09 +CD +B0 +02 +D1 +A7 +ED +52 +44 +4D +2A +1E +3C +23 +EB +38 +05 +28 +02 +ED +B0 +A7 +ED +52 +EB +7A +B3 +C8 +36 +20 +23 +1B +18 +F7 +E6 +7F +FE +61 +D8 +FE +7B +D0 +E6 +5F +C9 +56 +49 +D3 +89 +07 +03 +1A +08 +DD +CB +3E +A6 +FD +E9 +49 +4E +56 +49 +D3 +17 +08 +05 +2A +08 +DD +CB +3E +E6 +FD +E9 +46 +41 +53 +D4 +27 +08 +04 +39 +08 +FD +21 +B9 +04 +FD +E9 +53 +4C +4F +D7 +36 +08 +04 +48 +08 +FD +21 +C8 +04 +FD +E9 +2A +3B +3C +2B +46 +2B +4E +22 +3B +3C +C9 +2B +5E +22 +3B +3C +C9 +72 +23 +22 +3B +3C +C9 +44 +55 +D0 +45 +08 +03 +6D +08 +DF +D7 +D7 +FD +E9 +44 +52 +4F +D0 +6A +08 +04 +7B +08 +DF +FD +E9 +53 +57 +41 +D0 +78 +08 +04 +87 +08 +DF +CD +4E +08 +D7 +50 +59 +D7 +FD +E9 +43 +C0 +84 +08 +02 +98 +08 +DF +1A +5F +16 +00 +D7 +FD +E9 +43 +A1 +95 +08 +02 +A7 +08 +DF +CD +4E +08 +79 +12 +FD +E9 +C0 +A4 +08 +01 +B5 +08 +DF +EB +5E +23 +56 +D7 +FD +E9 +A1 +B2 +08 +01 +C3 +08 +DF +CD +4E +08 +EB +71 +23 +70 +FD +E9 +3E +D2 +C0 +08 +02 +D4 +08 +DF +C1 +D5 +C5 +FD +E9 +52 +BE +D1 +08 +02 +E1 +08 +C1 +D1 +C5 +D7 +FD +E9 +3F +44 +55 +D0 +DE +08 +04 +F0 +08 +DF +D7 +7A +B3 +C4 +10 +00 +FD +E9 +52 +4F +D4 +ED +08 +03 +C3 +0E +D2 +08 +85 +08 +DF +08 +85 +08 +B6 +04 +4F +56 +45 +D2 +FE +08 +04 +C3 +0E +D2 +08 +6B +08 +DF +08 +85 +08 +B6 +04 +50 +49 +43 +CB +11 +09 +04 +27 +09 +CD +4D +09 +FD +E9 +52 +4F +4C +CC +24 +09 +04 +35 +09 +CD +4D +09 +EB +2A +37 +3C +ED +52 +D2 +D7 +04 +62 +6B +23 +23 +ED +B0 +ED +53 +3B +3C +FD +E9 +CD +4E +08 +0B +CB +21 +CB +10 +03 +03 +30 +02 +E7 +07 +2A +3B +3C +ED +42 +E5 +5E +23 +56 +D7 +E1 +C9 +54 +59 +50 +C5 +32 +09 +04 +70 +09 +CD +4E +08 +DF +CD +7F +09 +FD +E9 +1A +4F +13 +1A +47 +13 +78 +B1 +C8 +1A +13 +0B +CF +18 +F7 +3C +A3 +6D +09 +02 +8F +09 +21 +FF +27 +22 +1A +3C +FD +E9 +23 +BE +8C +09 +02 +9E +09 +DF +DF +ED +5B +1A +3C +D7 +21 +FF +27 +A7 +ED +52 +EB +D7 +FD +E9 +AE +49 +0A +01 +C3 +0E +8D +09 +6B +08 +0D +0C +88 +06 +E1 +09 +FF +08 +4A +0A +9C +09 +6E +09 +73 +0A +B6 +04 +55 +AE +B2 +09 +02 +C3 +0E +88 +06 +8D +09 +E1 +09 +76 +12 +E8 +FF +23 +D3 +CF +09 +02 +C3 +0E +F7 +09 +12 +09 +12 +09 +36 +0E +1A +0C +8D +12 +F3 +FF +B6 +04 +A3 +E0 +09 +01 +C3 +0E +8A +04 +96 +08 +C4 +0C +FF +08 +07 +0A +5C +0A +B6 +04 +09 +0A +DF +7B +C6 +30 +FE +3A +38 +02 +C6 +07 +5F +D7 +FD +E9 +43 +4C +D3 +F6 +09 +03 +1F +0A +CD +24 +0A +FD +E9 +11 +FF +26 +2A +24 +3C +01 +20 +00 +09 +2B +ED +B8 +ED +43 +2F +3C +21 +00 +24 +22 +1C +3C +13 +EB +22 +24 +3C +C3 +FA +07 +53 +49 +47 +CE +9B +09 +04 +4C +0A +DF +CB +12 +1E +2D +38 +0C +FD +E9 +48 +4F +4C +C4 +1C +0A +04 +5E +0A +DF +2A +1A +3C +2D +28 +04 +22 +1A +3C +73 +FD +E9 +53 +50 +41 +43 +C5 +5B +0A +05 +75 +0A +3E +20 +CF +FD +E9 +53 +50 +41 +43 +45 +D3 +72 +0A +06 +85 +0A +DF +1B +CB +7A +20 +ED +3E +20 +CF +18 +F6 +43 +D2 +82 +0A +02 +97 +0A +3E +0D +CF +FD +E9 +45 +4D +49 +D4 +94 +0A +04 +A5 +0A +DF +7B +CF +FD +E9 +46 +AE +A2 +0A +02 +B1 +0A +2A +3B +3C +2B +CB +7E +CB +BE +28 +03 +3E +2D +CF +1E +00 +7E +3D +FE +49 +30 +04 +FE +3C +30 +04 +36 +41 +3C +5F +3E +40 +96 +38 +09 +47 +04 +3E +2E +CF +3E +30 +10 +FB +3E +40 +BE +9F +2B +B6 +2B +B6 +2B +B6 +23 +23 +28 +12 +AF +CD +32 +07 +C6 +30 +CF +23 +7E +FE +40 +20 +E5 +3E +2E +CF +18 +E0 +7B +A7 +20 +05 +3E +20 +CF +18 +0B +D6 +41 +6F +9F +67 +3E +45 +CF +CD +0E +18 +DF +DF +FD +E9 +41 +D4 +AE +0A +02 +1B +0B +DF +CD +4E +08 +79 +CD +28 +0B +22 +1C +3C +FD +E9 +C6 +20 +6F +26 +01 +29 +29 +29 +29 +29 +16 +00 +7B +E6 +1F +5F +19 +ED +5B +24 +3C +ED +52 +19 +D8 +E7 +09 +50 +4C +4F +D4 +18 +0B +04 +4C +0B +CD +4E +08 +DF +DD +73 +30 +CB +3B +CB +11 +3E +16 +93 +DF +DD +73 +2F +CB +3B +CB +11 +CD +28 +0B +7E +E6 +78 +FE +10 +7E +28 +02 +3E +10 +5F +16 +87 +79 +E6 +03 +47 +28 +07 +2F +C6 +02 +CE +03 +57 +43 +79 +0F +0F +0F +9F +CB +59 +20 +04 +AB +07 +9F +A8 +A2 +AB +77 +FD +E9 +42 +45 +45 +D0 +49 +0B +04 +C3 +0E +12 +09 +4B +10 +7D +85 +08 +7A +0D +0E +1A +DF +CD +4E +08 +21 +F9 +00 +09 +2C +F3 +3E +7F +DB +FE +0F +30 +11 +CD +C9 +0B +1B +7A +D3 +FE +CD +C9 +0B +B3 +C2 +AF +0B +FB +FD +E9 +E7 +03 +45 +4C +10 +FE +05 +0D +C2 +CB +0B +C9 +49 +4E +4B +45 +D9 +97 +0B +05 +DD +0B +CD +36 +03 +5F +16 +00 +D7 +FD +E9 +49 +CE +DA +0B +02 +ED +0B +CD +4E +08 +16 +00 +ED +58 +D7 +FD +E9 +4F +55 +D4 +EA +0B +03 +FF +0B +CD +4E +08 +DF +ED +59 +FD +E9 +41 +42 +D3 +FC +0B +03 +C3 +0E +6B +08 +94 +0D +B6 +04 +30 +BD +0C +0C +02 +1C +0C +DF +7A +B3 +FE +01 +3E +00 +57 +17 +5F +D7 +FD +E9 +30 +BC +19 +0C +02 +30 +0C +DF +CB +12 +18 +EC +30 +BE +2D +0C +02 +3C +0C +DF +7A +B3 +28 +E0 +CB +12 +3F +18 +DB +BD +39 +0C +01 +C3 +0E +E1 +0D +1A +0C +B6 +04 +BE +49 +0C +01 +58 +0C +DF +D5 +DF +E1 +CD +99 +0C +18 +C0 +BC +55 +0C +01 +C3 +0E +85 +08 +56 +0C +B6 +04 +55 +BC +64 +0C +02 +74 +0C +CD +4E +08 +DF +EB +A7 +ED +42 +18 +A3 +44 +BC +71 +0C +02 +85 +0C +DF +D5 +CD +4E +08 +DF +E1 +A7 +ED +52 +28 +E6 +19 +EB +CD +99 +0C +DF +18 +88 +7C +AA +FA +A0 +0C +ED +52 +CB +14 +C9 +55 +AA +82 +0C +02 +AA +0C +DF +CD +4E +08 +21 +00 +00 +3E +10 +29 +EB +ED +6A +EB +30 +04 +09 +30 +01 +13 +3D +20 +F2 +EB +18 +2F +C6 +0C +DF +D9 +DF +D5 +DF +E1 +7C +B5 +3E +21 +20 +03 +EB +3E +11 +D9 +47 +AF +67 +6F +4F +ED +6A +9F +A7 +ED +52 +99 +30 +01 +19 +3F +D9 +EB +ED +6A +EB +ED +6A +D9 +10 +EB +EB +D7 +D9 +E5 +D7 +D1 +D7 +FD +E9 +2F +4D +4F +C4 +A7 +0C +04 +C3 +0E +85 +08 +D2 +08 +E9 +12 +0D +0C +4B +10 +00 +FF +08 +6B +08 +E9 +12 +60 +0E +D2 +08 +0D +0C +8C +0D +DF +08 +94 +0D +85 +08 +DF +08 +94 +0D +85 +08 +B6 +04 +2A +2F +4D +4F +C4 +FF +0C +05 +C3 +0E +FF +08 +D2 +08 +E9 +12 +0D +0C +FF +08 +6B +08 +DF +08 +60 +0E +D2 +08 +0D +0C +A8 +0C +76 +12 +C1 +FF +AF +30 +0D +01 +C3 +0E +00 +0D +85 +08 +79 +08 +B6 +04 +4D +4F +C4 +50 +0D +03 +C3 +0E +00 +0D +79 +08 +B6 +04 +AA +60 +0D +01 +C3 +0E +A8 +0C +79 +08 +B6 +04 +2A +AF +6C +0D +02 +C3 +0E +31 +0D +85 +08 +79 +08 +B6 +04 +55 +2F +4D +4F +C4 +79 +0D +05 +C3 +0E +C4 +0C +79 +08 +B6 +04 +C3 +0E +2E +0C +83 +12 +03 +00 +A9 +0D +B6 +04 +4E +45 +47 +41 +54 +C5 +8B +0D +06 +AB +0D +01 +02 +00 +18 +0F +44 +4E +45 +47 +41 +54 +C5 +A8 +0D +07 +BC +0D +01 +04 +00 +2A +3B +3C +A7 +ED +42 +78 +9E +77 +23 +0D +20 +F9 +FD +E9 +AB +B9 +0D +01 +D4 +0D +DF +D5 +DF +E1 +19 +EB +D7 +FD +E9 +AD +D1 +0D +01 +C3 +0E +A9 +0D +D2 +0D +B6 +04 +44 +AB +E0 +0D +02 +F0 +0D +DF +D5 +CD +4E +08 +DF +D5 +DF +EB +09 +EB +D7 +C1 +E1 +ED +4A +EB +D7 +FD +E9 +31 +AB +ED +0D +02 +0B +0E +DF +18 +09 +32 +AB +08 +0E +02 +15 +0E +DF +13 +13 +18 +14 +31 +AD +12 +0E +02 +21 +0E +DF +18 +09 +32 +AD +1E +0E +02 +2B +0E +DF +1B +1B +D7 +FD +E9 +4F +D2 +28 +0E +02 +38 +0E +DF +CD +4E +08 +7B +B1 +5F +7A +B0 +57 +D7 +FD +E9 +41 +4E +C4 +35 +0E +03 +4D +0E +DF +CD +4E +08 +7B +A1 +5F +7A +A0 +57 +D7 +FD +E9 +58 +4F +D2 +4A +0E +03 +62 +0E +DF +CD +4E +08 +7B +A9 +5F +7A +A8 +57 +D7 +FD +E9 +4D +41 +D8 +5F +0E +03 +C3 +0E +12 +09 +12 +09 +65 +0C +71 +12 +0F +00 +4D +49 +CE +74 +0E +03 +C3 +0E +12 +09 +12 +09 +56 +0C +83 +12 +03 +00 +85 +08 +79 +08 +B6 +04 +44 +45 +43 +49 +4D +41 +CC +86 +0E +07 +A5 +0E +DD +36 +3F +0A +FD +E9 +BA +A2 +0E +01 +85 +10 +C3 +0E +4B +10 +0A +0E +1A +21 +3E +3C +7E +F6 +44 +77 +FD +E9 +E9 +FF +EB +C3 +BA +04 +43 +52 +45 +41 +54 +C5 +AE +0E +06 +C3 +0E +4B +10 +20 +AB +05 +FB +0E +88 +06 +4E +0F +80 +04 +B3 +08 +6B +08 +B3 +08 +4E +0F +60 +04 +85 +08 +C1 +08 +99 +04 +96 +08 +5F +0F +11 +10 +EC +0F +4E +0F +B6 +04 +FD +0E +CD +2E +0F +DF +1A +3D +FE +3F +38 +02 +E7 +06 +C6 +08 +4F +06 +00 +CD +8C +0F +1A +4F +2A +37 +3C +D5 +CD +9E +0F +D1 +1A +47 +13 +1A +CD +07 +08 +77 +23 +10 +F7 +22 +39 +3C +2B +CB +FE +FD +E9 +DD +CB +3E +56 +28 +02 +E7 +0C +2A +37 +3C +ED +5B +39 +3C +AF +ED +52 +EB +73 +23 +72 +67 +6F +22 +39 +3C +C9 +AC +CF +0E +01 +C3 +0E +83 +0F +60 +04 +29 +0E +C1 +08 +B6 +04 +43 +AC +4D +0F +02 +C3 +0E +4B +10 +01 +76 +0F +60 +04 +1F +0E +A5 +08 +B6 +04 +41 +4C +4C +4F +D4 +5E +0F +05 +78 +0F +CD +4E +08 +2A +37 +3C +CD +9E +0F +FD +E9 +C3 +0E +4B +10 +02 +76 +0F +B6 +04 +21 +1E +00 +C5 +09 +ED +4B +3B +3C +09 +C1 +38 +03 +ED +72 +D8 +E7 +01 +EB +21 +28 +00 +CD +8F +0F +2A +37 +3C +09 +22 +37 +3C +2A +3B +3C +E5 +09 +22 +3B +3C +E3 +E5 +A7 +ED +52 +44 +4D +E1 +D1 +C8 +2B +1B +ED +B8 +23 +C9 +56 +41 +52 +49 +41 +42 +4C +C5 +75 +0F +08 +85 +10 +F0 +0F +4E +0F +B6 +04 +43 +4F +4E +53 +54 +41 +4E +D4 +CE +0F +08 +85 +10 +F5 +0F +4E +0F +B6 +04 +DC +FE +18 +02 +D5 +FF +D7 +FD +E9 +E3 +FF +EB +5E +23 +56 +D7 +FD +E9 +4C +49 +54 +45 +52 +41 +CC +E1 +0F +47 +08 +11 +11 +10 +4E +0F +B6 +04 +02 +FF +FF +13 +10 +06 +01 +E1 +5E +23 +56 +23 +E5 +D7 +10 +F7 +FD +E9 +41 +53 +43 +49 +C9 +05 +10 +45 +C3 +0E +4B +10 +20 +AB +05 +09 +0E +96 +08 +0E +1A +DD +CB +3E +76 +28 +E3 +CD +B9 +04 +11 +10 +4B +10 +4E +0F +5F +0F +B6 +04 +01 +D6 +FF +4D +10 +E1 +5E +16 +00 +06 +01 +18 +C4 +08 +11 +64 +10 +85 +08 +4E +0F +4E +0F +B6 +04 +04 +FF +FF +66 +10 +06 +02 +18 +AB +44 +45 +46 +49 +4E +45 +D2 +27 +10 +07 +85 +10 +85 +10 +60 +04 +4B +10 +0C +83 +0F +76 +12 +34 +FE +E6 +FF +CD +F0 +0F +D0 +0E +6B +08 +B3 +08 +60 +04 +29 +0E +C1 +08 +13 +0E +9A +10 +B6 +04 +9C +10 +DF +C3 +C3 +0E +43 +41 +4C +CC +73 +10 +04 +A9 +10 +DF +EB +E9 +44 +4F +45 +53 +BE +F4 +10 +45 +08 +11 +E8 +10 +D8 +12 +0C +CD +10 +4B +10 +CD +5F +0F +11 +10 +F0 +0F +4E +0F +4B +10 +0A +B6 +04 +C3 +0E +6B +08 +29 +0E +B5 +15 +60 +04 +E1 +0D +1F +0E +4E +0F +60 +04 +85 +08 +C1 +08 +B6 +04 +05 +C5 +FF +B8 +04 +43 +4F +4D +50 +49 +4C +45 +D2 +A6 +10 +08 +85 +10 +08 +11 +60 +11 +60 +04 +4B +10 +0B +83 +0F +76 +12 +B1 +FD +E3 +FF +DD +CB +3E +76 +20 +02 +E7 +04 +CD +F0 +0F +6B +08 +B3 +08 +4E +0F +76 +12 +78 +FF +52 +55 +4E +53 +BE +B3 +10 +45 +08 +11 +40 +11 +D8 +12 +0B +85 +08 +5F +0F +CD +10 +11 +10 +42 +11 +4E +0F +4B +10 +0A +B6 +04 +05 +DE +FF +B8 +04 +E1 +D5 +EB +D7 +42 +4B +D1 +D5 +1B +1B +CD +9E +15 +D1 +C5 +C3 +C3 +0E +49 +4D +4D +45 +44 +49 +41 +54 +C5 +24 +11 +09 +C3 +0E +80 +04 +B3 +08 +B3 +08 +0E +1A +DF +EB +CB +F6 +FD +E9 +56 +4F +43 +41 +42 +55 +4C +41 +52 +D9 +5F +11 +0A +85 +10 +B5 +11 +80 +04 +B3 +08 +13 +0E +4E +0F +88 +06 +5F +0F +60 +04 +11 +10 +35 +3C +6B +08 +B3 +08 +4E +0F +C1 +08 +B6 +04 +44 +45 +46 +49 +4E +49 +54 +49 +4F +4E +D3 +7C +11 +0B +AD +11 +2A +33 +3C +22 +31 +3C +FD +E9 +ED +53 +33 +3C +FD +E9 +49 +C6 +E0 +13 +42 +08 +11 +83 +12 +60 +04 +4B +10 +02 +83 +0F +B6 +04 +57 +48 +49 +4C +C5 +BF +11 +45 +08 +11 +88 +12 +D8 +12 +01 +60 +04 +4B +10 +04 +83 +0F +B6 +04 +45 +4C +53 +C5 +D4 +11 +44 +08 +11 +71 +12 +D8 +12 +02 +83 +0F +25 +12 +60 +04 +29 +0E +4B +10 +02 +B6 +04 +54 +48 +45 +CE +EB +11 +44 +08 +11 +A4 +12 +D8 +12 +02 +25 +12 +B6 +04 +42 +45 +47 +49 +CE +06 +12 +45 +08 +11 +9F +12 +60 +04 +4B +10 +01 +B6 +04 +C3 +0E +6B +08 +60 +04 +85 +08 +E1 +0D +1F +0E +85 +08 +C1 +08 +B6 +04 +C3 +0E +60 +04 +E1 +0D +1F +0E +4E +0F +B6 +04 +52 +45 +50 +45 +41 +D4 +19 +12 +46 +08 +11 +76 +12 +D8 +12 +04 +85 +08 +37 +12 +25 +12 +B6 +04 +55 +4E +54 +49 +CC +4B +12 +45 +08 +11 +8D +12 +D8 +12 +01 +37 +12 +B6 +04 +02 +75 +FF +78 +12 +02 +CE +FF +78 +12 +E1 +5E +23 +56 +19 +C3 +BA +04 +02 +39 +FF +8F +12 +02 +46 +FF +8F +12 +02 +CF +FF +8F +12 +CD +4E +08 +78 +B1 +28 +E2 +E1 +23 +23 +C3 +BA +04 +00 +74 +FF +B9 +04 +00 +5D +FF +B9 +04 +44 +CF +62 +12 +42 +08 +11 +23 +13 +60 +04 +4B +10 +03 +B6 +04 +4C +4F +4F +D0 +AA +12 +44 +08 +11 +32 +13 +D8 +12 +03 +37 +12 +B6 +04 +2B +4C +4F +4F +D0 +BC +12 +45 +08 +11 +3C +13 +76 +12 +EA +FF +DA +12 +DF +E1 +7E +23 +E5 +93 +B2 +28 +4A +E7 +05 +C9 +AA +11 +01 +EB +12 +C1 +D1 +D5 +C5 +D7 +FD +E9 +49 +A7 +E8 +12 +02 +F9 +12 +21 +04 +00 +18 +09 +CA +F6 +12 +01 +04 +13 +21 +06 +00 +39 +5E +23 +56 +D7 +FD +E9 +4C +45 +41 +56 +C5 +01 +13 +05 +18 +13 +C1 +E1 +E1 +E5 +E5 +C5 +FD +E9 +00 +84 +FF +25 +13 +CD +4E +08 +DF +E1 +D5 +C5 +E5 +FD +E9 +02 +85 +FF +34 +13 +11 +01 +00 +18 +06 +02 +8D +FF +3E +13 +DF +C1 +E1 +A7 +ED +5A +7A +D1 +37 +EA +58 +13 +D5 +E5 +07 +30 +01 +EB +CD +99 +0C +3F +30 +02 +E1 +E1 +C5 +9F +C3 +94 +12 +A8 +D4 +13 +41 +08 +11 +79 +13 +4B +10 +29 +60 +04 +85 +08 +83 +0F +9F +13 +85 +08 +C1 +08 +B6 +04 +FF +E5 +FF +7B +13 +E1 +5E +23 +56 +13 +C3 +7C +12 +2E +A2 +60 +13 +42 +08 +11 +96 +13 +4B +10 +22 +76 +12 +D6 +FF +FF +EE +FF +98 +13 +D1 +CD +79 +09 +D5 +FD +E9 +A1 +13 +DF +D5 +CD +E1 +05 +62 +6B +09 +7E +E1 +BD +28 +0A +EB +D7 +11 +78 +05 +CD +15 +18 +18 +E9 +D5 +C5 +2A +37 +3C +CD +9E +0F +C1 +D1 +D5 +C5 +EB +ED +B0 +C1 +50 +59 +D7 +D1 +CD +DA +07 +FD +E9 +DB +CF +12 +41 +D7 +13 +DD +CB +3E +B6 +FD +E9 +DD +15 +13 +01 +E3 +13 +DD +CB +3E +F6 +FD +E9 +45 +58 +49 +D4 +87 +13 +04 +B8 +04 +52 +45 +44 +45 +46 +49 +4E +C5 +EF +13 +08 +FF +13 +CD +2E +0F +2A +31 +3C +5E +23 +56 +EB +23 +22 +05 +27 +E5 +CD +C0 +15 +22 +0D +27 +ED +43 +07 +27 +ED +53 +0B +27 +2A +37 +3C +ED +52 +C2 +DA +14 +D1 +D7 +CD +B9 +04 +10 +16 +3D +06 +0E +1A +DF +21 +AF +C3 +19 +D2 +CF +14 +EB +22 +03 +27 +CD +C0 +15 +22 +01 +27 +E5 +ED +53 +09 +27 +78 +B1 +ED +5B +07 +27 +28 +04 +7A +B3 +28 +7D +E1 +ED +4B +0D +27 +ED +42 +EB +19 +22 +07 +27 +2A +0B +27 +19 +ED +4B +09 +27 +A7 +ED +42 +22 +0B +27 +01 +2E +00 +09 +CB +7C +20 +0B +ED +4B +3B +3C +09 +38 +54 +ED +72 +30 +50 +2A +03 +27 +E5 +2B +2B +46 +2B +4E +2A +05 +27 +E5 +2B +2B +70 +2B +71 +E1 +19 +C1 +A7 +ED +42 +22 +05 +27 +ED +5B +01 +27 +2A +09 +27 +A7 +ED +52 +44 +4D +D5 +C5 +CD +DC +14 +2A +0B +27 +C1 +09 +44 +4D +E1 +C5 +CD +9E +0F +EB +2A +0D +27 +ED +4B +0B +27 +09 +C1 +C5 +E5 +ED +B0 +D1 +C1 +CD +DC +14 +CD +F8 +14 +FD +E9 +2A +31 +3C +ED +5B +05 +27 +1B +73 +23 +72 +E7 +0B +2A +37 +3C +A7 +ED +42 +22 +37 +3C +2A +3B +3C +ED +42 +22 +3B +3C +ED +52 +C8 +C5 +44 +4D +E1 +19 +ED +B0 +C9 +01 +31 +3C +CD +57 +15 +CD +57 +15 +01 +40 +3C +2A +37 +3C +37 +ED +42 +D8 +0A +17 +03 +30 +FB +03 +03 +CD +57 +15 +03 +CD +57 +15 +CD +FB +15 +C3 +0E +1C +85 +10 +16 +08 +11 +13 +B5 +11 +18 +00 +00 +21 +F9 +FF +09 +4E +23 +46 +2B +09 +44 +4D +18 +CD +CD +57 +15 +CD +48 +15 +18 +C5 +CD +57 +15 +03 +CD +57 +15 +18 +BC +CD +57 +15 +21 +B6 +04 +A7 +ED +52 +C8 +CD +9E +15 +18 +F1 +0A +5F +03 +0A +57 +0B +CD +68 +15 +EB +7B +02 +03 +7A +02 +03 +C9 +2A +01 +27 +A7 +ED +52 +62 +6B +D0 +2A +09 +27 +ED +52 +30 +0C +2A +0D +27 +ED +52 +38 +13 +2A +0B +27 +19 +C9 +2A +03 +27 +ED +52 +2A +07 +27 +D8 +2A +05 +27 +19 +C9 +2A +01 +27 +19 +ED +5B +0D +27 +A7 +ED +52 +C9 +1B +1A +17 +D0 +1B +1B +1A +6F +26 +00 +3C +20 +06 +0A +6F +03 +0A +67 +03 +09 +44 +4D +C9 +B7 +15 +DF +EB +CD +E7 +15 +EB +D7 +FD +E9 +E5 +5E +23 +56 +CD +FB +15 +08 +11 +0B +85 +10 +08 +00 +00 +01 +00 +00 +18 +07 +E1 +E5 +23 +23 +4E +23 +46 +E1 +E5 +2B +2B +2B +2B +56 +2B +5E +19 +EB +E1 +2B +7C +FE +3C +7E +CB +B7 +38 +02 +C6 +02 +2B +2B +2B +3D +20 +FC +C9 +23 +E5 +E1 +7E +23 +E5 +66 +6F +B4 +C8 +ED +52 +E1 +23 +20 +F0 +D5 +16 +00 +5E +19 +D1 +E9 +C3 +0E +1F +0E +29 +0E +B3 +08 +80 +04 +B3 +08 +C1 +08 +B6 +04 +CD +B9 +04 +3D +06 +0E +1A +DF +21 +AF +C3 +19 +D8 +E7 +0D +46 +4F +52 +47 +45 +D4 +FC +13 +06 +3A +16 +2A +31 +3C +ED +5B +33 +3C +A7 +ED +52 +C2 +DA +14 +CD +20 +16 +21 +FB +FF +19 +22 +39 +3C +DD +CB +3E +D6 +E7 +FF +45 +44 +49 +D4 +37 +16 +04 +60 +16 +CD +20 +16 +DD +CB +3E +DE +18 +0C +4C +49 +53 +D4 +5D +16 +04 +72 +16 +CD +20 +16 +3E +0D +CF +DD +CB +3E +5E +D5 +C4 +D8 +02 +C1 +0A +5F +03 +0A +57 +0B +CD +FB +15 +C3 +0E +0B +08 +11 +0D +85 +10 +1F +00 +00 +E7 +0E +21 +02 +00 +18 +18 +D5 +21 +02 +00 +09 +7E +23 +66 +6F +2B +2B +2B +6E +7D +07 +9F +67 +CD +0E +18 +D1 +21 +04 +00 +09 +E5 +C5 +CD +E4 +17 +D1 +C1 +CD +E4 +17 +DD +36 +14 +01 +DD +36 +16 +10 +CD +08 +17 +38 +06 +DD +35 +16 +F2 +C7 +16 +DD +CB +3E +5E +20 +10 +38 +28 +21 +26 +3C +36 +00 +7E +A7 +28 +FC +CD +E4 +04 +18 +DB +F5 +DD +CB +3E +9E +C5 +CD +B9 +04 +78 +05 +06 +05 +0E +1A +DD +CB +3E +DE +CD +D8 +02 +C1 +F1 +30 +C1 +DD +CB +3E +9E +FD +E9 +3A +14 +3C +32 +15 +3C +DD +36 +13 +05 +0A +5F +03 +0A +57 +03 +CD +FB +15 +83 +12 +40 +71 +12 +44 +A4 +12 +48 +9F +12 +37 +8D +12 +42 +88 +12 +38 +76 +12 +3C +23 +13 +2B +32 +13 +36 +3C +13 +33 +E8 +10 +29 +40 +11 +26 +11 +10 +3B +64 +10 +47 +4B +10 +51 +79 +13 +62 +96 +13 +63 +B6 +04 +54 +00 +00 +CD +E1 +17 +DD +35 +13 +20 +B7 +A7 +C9 +2A +14 +3C +65 +2C +18 +0C +2A +14 +3C +65 +25 +18 +05 +2A +14 +3C +2D +65 +22 +14 +3C +DD +36 +13 +01 +DD +35 +16 +18 +D7 +CD +DA +17 +D7 +11 +B3 +09 +CD +C1 +17 +CD +15 +18 +18 +CB +CD +DA +17 +D7 +CD +DA +17 +D7 +11 +AF +0A +18 +EB +0A +F5 +CD +E1 +17 +F1 +CF +3E +20 +CF +18 +B2 +CD +08 +18 +0D +3B +8D +37 +C9 +3E +29 +18 +02 +3E +22 +F5 +C5 +CD +E1 +17 +D1 +CD +79 +09 +42 +4B +F1 +CF +A7 +C9 +3A +15 +3C +A7 +F8 +C5 +47 +3E +0D +CF +04 +05 +28 +05 +3E +20 +CF +10 +FB +DD +36 +15 +FF +C1 +C9 +0A +5F +03 +0A +57 +03 +C9 +CD +C1 +17 +EB +2B +7E +CB +7F +20 +05 +CD +E8 +15 +18 +0B +EB +CD +A2 +15 +13 +1A +6F +13 +1A +67 +19 +7E +E6 +7F +CF +CB +7E +23 +28 +F7 +3E +20 +CF +C9 +E3 +CD +FB +17 +E3 +C9 +11 +B3 +09 +D5 +EB +D7 +D1 +C5 +CD +BF +04 +1B +18 +1D +18 +C1 +C1 +C9 +FD +E5 +E5 +FD +E1 +21 +92 +18 +E5 +21 +00 +E0 +CB +79 +28 +02 +26 +FC +13 +FD +2B +F3 +AF +06 +97 +10 +FE +D3 +FE +EE +08 +2C +20 +01 +24 +20 +F2 +06 +2B +10 +FE +D3 +FE +69 +01 +08 +3B +10 +FE +79 +D3 +FE +06 +38 +C3 +8A +18 +79 +CB +78 +10 +FE +30 +04 +06 +3D +10 +FE +D3 +FE +06 +3A +C2 +59 +18 +05 +AF +CB +15 +C2 +5C +18 +1B +FD +23 +06 +2E +3E +7F +DB +FE +1F +D0 +7A +FE +FF +D0 +B3 +28 +0B +FD +6E +00 +7C +AD +67 +AF +37 +C3 +6D +18 +6C +18 +F5 +FD +E1 +08 +06 +3B +10 +FE +AF +D3 +FE +3E +7F +DB +FE +1F +FB +D2 +F0 +04 +08 +C9 +F3 +FD +E5 +E5 +FD +E1 +21 +92 +18 +E5 +61 +08 +AF +4F +C0 +2E +00 +06 +B8 +CD +11 +19 +30 +F6 +3E +DF +B8 +30 +F2 +2C +20 +F1 +06 +CF +CD +15 +19 +30 +E7 +78 +FE +D8 +30 +F4 +CD +15 +19 +D0 +CD +FC +18 +D0 +3F +C0 +18 +11 +08 +30 +05 +FD +75 +00 +18 +05 +FD +7E +00 +AD +C0 +FD +23 +1B +08 +CD +FC +18 +D0 +7A +B3 +20 +E7 +7C +FE +01 +C9 +2E +01 +06 +C7 +CD +11 +19 +D0 +3E +E2 +B8 +CB +15 +D2 +FE +18 +7C +AD +67 +37 +C9 +CD +15 +19 +D0 +3E +14 +3D +20 +FD +A7 +04 +C8 +3E +7F +DB +FE +1F +D0 +A9 +E6 +10 +28 +F3 +79 +2F +4F +37 +C9 +53 +41 +56 +C5 +6F +16 +04 +C3 +0E +10 +1A +4F +1A +B6 +04 +42 +53 +41 +56 +C5 +33 +19 +05 +C3 +0E +3D +1A +4F +1A +B6 +04 +42 +4C +4F +41 +C4 +43 +19 +05 +C3 +0E +3D +1A +74 +1A +B8 +1A +B6 +04 +56 +45 +52 +49 +46 +D9 +53 +19 +06 +C3 +0E +10 +1A +71 +12 +0F +00 +42 +56 +45 +52 +49 +46 +D9 +66 +19 +07 +C3 +0E +3D +1A +74 +1A +BE +1A +B6 +04 +4C +4F +41 +C4 +78 +19 +04 +C3 +0E +10 +1A +0E +1A +2A +37 +3C +22 +0E +23 +EB +21 +CC +FF +39 +A7 +ED +52 +22 +0C +23 +CD +B9 +04 +74 +1A +B8 +1A +0E +1A +ED +4B +37 +3C +21 +50 +3C +22 +01 +27 +23 +22 +09 +27 +2A +25 +23 +09 +22 +37 +3C +21 +AF +C3 +09 +22 +0B +27 +ED +5B +29 +23 +19 +ED +5B +4C +3C +22 +4C +3C +C5 +D5 +ED +73 +0D +27 +CD +04 +15 +C1 +E1 +CB +7E +23 +28 +FB +23 +23 +71 +23 +70 +2A +37 +3C +01 +0C +00 +09 +22 +3B +3C +FD +E9 +C3 +0E +4B +10 +20 +AB +05 +0E +1A +CD +2E +0F +DF +3E +20 +12 +11 +0C +27 +21 +FF +27 +CD +FA +07 +FD +E9 +FB +18 +C3 +0E +F3 +19 +0E +1A +AF +32 +01 +23 +21 +51 +3C +22 +0E +23 +EB +2A +37 +3C +A7 +ED +52 +22 +0C +23 +2A +4C +3C +22 +10 +23 +21 +31 +3C +11 +12 +23 +01 +08 +00 +ED +B0 +FD +E9 +C3 +0E +F3 +19 +11 +10 +0C +23 +C1 +08 +11 +10 +0E +23 +C1 +08 +B6 +04 +51 +1A +3A +02 +23 +A7 +28 +5F +2A +0C +23 +7C +B5 +28 +58 +E5 +11 +19 +00 +21 +01 +23 +4A +CD +20 +18 +D1 +2A +0E +23 +0E +FF +CD +20 +18 +FD +E9 +76 +1A +11 +19 +00 +21 +1A +23 +4A +37 +CD +A7 +18 +30 +F3 +11 +1A +23 +1A +A7 +20 +0B +CD +08 +18 +0D +44 +69 +63 +74 +BA +18 +0A +CD +08 +18 +0D +42 +79 +74 +65 +73 +BA +21 +01 +23 +01 +0B +0B +18 +02 +1A +CF +1A +BE +20 +01 +0D +23 +13 +10 +F5 +20 +C2 +FD +E9 +E7 +0A +BA +1A +06 +FF +18 +12 +C0 +1A +21 +12 +23 +11 +2B +23 +06 +08 +1A +13 +BE +23 +20 +E8 +10 +F8 +2A +0C +23 +ED +5B +25 +23 +7C +B5 +28 +04 +ED +52 +38 +D7 +2A +0E +23 +7C +B5 +20 +03 +2A +27 +23 +0E +FF +CB +18 +CD +A7 +18 +30 +C4 +FD +E9 +01 +0F +3C +AF +02 +0D +20 +FC +2A +3B +3C +11 +FC +FF +2B +4E +77 +19 +23 +22 +3B +3C +2B +46 +77 +79 +0F +A8 +E6 +7F +A8 +32 +02 +3C +CB +B8 +CB +B9 +ED +43 +00 +3C +23 +EB +19 +C9 +3E +09 +B8 +30 +01 +47 +0E +04 +23 +23 +23 +AF +ED +67 +2B +0D +20 +FA +23 +10 +F1 +C6 +FB +E5 +7E +88 +27 +77 +23 +38 +F9 +E1 +C9 +C5 +E5 +06 +04 +A7 +3E +00 +9E +27 +77 +23 +10 +F8 +E1 +C1 +C9 +0E +01 +E5 +D5 +C5 +79 +E6 +0F +47 +A9 +4F +0F +0F +81 +0F +80 +4F +06 +04 +AF +C5 +D5 +E5 +86 +27 +6F +1A +26 +00 +54 +CB +14 +A7 +28 +1B +5F +CB +39 +30 +08 +7D +83 +27 +6F +7C +8A +27 +67 +0C +0D +28 +0A +7B +87 +27 +5F +7A +8F +27 +57 +18 +E6 +EB +E1 +73 +7A +D1 +C1 +13 +23 +10 +CC +C1 +D1 +E1 +C9 +46 +AD +89 +19 +02 +C3 +0E +0F +1D +0E +1A +18 +07 +46 +AB +A3 +1B +02 +B3 +1B +CD +F4 +1A +79 +90 +F5 +30 +06 +EB +ED +44 +DD +70 +00 +47 +C4 +22 +1B +F1 +30 +01 +EB +06 +02 +DD +4E +02 +CB +11 +DC +43 +1B +EB +10 +F8 +CD +53 +1B +1B +1A +C6 +68 +CB +18 +DD +70 +02 +C4 +43 +1B +1A +A7 +20 +19 +DD +35 +00 +DD +35 +00 +D5 +62 +6B +2B +01 +FF +03 +B6 +ED +A8 +10 +FB +EB +70 +D1 +20 +E5 +FD +E9 +54 +5D +D5 +01 +04 +00 +ED +B0 +E1 +1B +1A +A7 +28 +11 +FE +10 +9F +3C +3C +47 +DD +86 +00 +32 +00 +3C +CD +22 +1B +18 +EB +3A +00 +3C +3D +FE +BF +3C +30 +13 +FE +80 +30 +0D +47 +3A +02 +3C +4F +17 +A9 +E6 +80 +A8 +12 +FD +E9 +E7 +08 +01 +00 +04 +71 +23 +10 +FC +FD +E9 +46 +AA +B0 +1B +02 +4D +1C +CD +F4 +1A +AF +B8 +9F +A1 +28 +E7 +E5 +01 +02 +3C +C5 +06 +03 +4E +23 +E3 +23 +CD +55 +1B +E3 +10 +F6 +ED +4B +00 +3C +78 +81 +D6 +42 +32 +00 +3C +E1 +D1 +18 +8E +46 +AF +4A +1C +02 +7D +1C +CD +F4 +1A +AF +B8 +28 +B9 +B9 +28 +B4 +13 +13 +1A +1B +1B +C6 +01 +27 +08 +EB +CD +43 +1B +EB +E5 +11 +10 +3C +01 +04 +00 +ED +B0 +EB +2B +06 +05 +D5 +7E +2B +5E +08 +4F +08 +0C +0D +20 +03 +5F +18 +1B +C5 +06 +02 +16 +10 +CB +23 +17 +CB +12 +30 +F9 +14 +91 +27 +1C +30 +FB +15 +20 +F8 +81 +27 +1D +10 +E9 +C1 +4B +D1 +0C +0D +28 +17 +E5 +2B +2B +CD +55 +1B +D5 +11 +FB +FF +19 +11 +03 +3C +79 +12 +CD +53 +1B +D1 +E1 +23 +04 +10 +B8 +2A +00 +3C +7C +95 +C6 +40 +21 +08 +3C +47 +3A +0B +3C +A7 +20 +03 +05 +05 +2B +DD +70 +00 +D1 +C3 +04 +1C +46 +4E +45 +47 +41 +54 +C5 +7A +1C +07 +11 +1D +DF +7A +A7 +28 +02 +EE +80 +57 +D7 +FD +E9 +49 +4E +D4 +0E +1D +03 +24 +1D +2A +3B +3C +2B +11 +00 +00 +7E +07 +FE +82 +38 +14 +AF +2B +CD +32 +07 +23 +EB +44 +4D +29 +29 +09 +29 +4F +06 +00 +09 +EB +18 +E6 +2B +2B +72 +2B +73 +11 +94 +0D +C3 +BF +04 +55 +46 +4C +4F +41 +D4 +21 +1D +06 +5B +1D +DF +EB +01 +00 +10 +51 +59 +29 +7B +8F +27 +5F +7A +8F +27 +57 +CB +11 +10 +F3 +D7 +16 +46 +59 +D7 +2B +2B +CD +40 +07 +FD +E9 +00 +00 +00 +00 +00 +00 +00 +10 +10 +10 +10 +00 +10 +00 +24 +24 +00 +00 +00 +00 +00 +24 +7E +24 +24 +7E +24 +00 +08 +3E +28 +3E +0A +3E +08 +62 +64 +08 +10 +26 +46 +00 +10 +28 +10 +2A +44 +3A +00 +08 +10 +00 +00 +00 +00 +00 +04 +08 +08 +08 +08 +04 +00 +20 +10 +10 +10 +10 +20 +00 +00 +14 +08 +3E +08 +14 +00 +00 +08 +08 +3E +08 +08 +00 +00 +00 +00 +00 +08 +08 +10 +00 +00 +00 +3E +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +02 +04 +08 +10 +20 +00 +3C +46 +4A +52 +62 +3C +00 +18 +28 +08 +08 +08 +3E +00 +3C +42 +02 +3C +40 +7E +00 +3C +42 +0C +02 +42 +3C +00 +08 +18 +28 +48 +7E +08 +00 +7E +40 +7C +02 +42 +3C +00 +3C +40 +7C +42 +42 +3C +00 +7E +02 +04 +08 +10 +10 +00 +3C +42 +3C +42 +42 +3C +00 +3C +42 +42 +3E +02 +3C +00 +00 +00 +10 +00 +00 +10 +00 +00 +10 +00 +00 +10 +10 +20 +00 +04 +08 +10 +08 +04 +00 +00 +00 +3E +00 +3E +00 +00 +00 +10 +08 +04 +08 +10 +00 +3C +42 +04 +08 +00 +08 +3C +4A +56 +5E +40 +3C +3C +42 +42 +7E +42 +42 +7C +42 +7C +42 +42 +7C +3C +42 +40 +40 +42 +3C +78 +44 +42 +42 +44 +78 +7E +40 +7C +40 +40 +7E +7E +40 +7C +40 +40 +40 +3C +42 +40 +4E +42 +3C +42 +42 +7E +42 +42 +42 +3E +08 +08 +08 +08 +3E +02 +02 +02 +42 +42 +3C +44 +48 +70 +48 +44 +42 +40 +40 +40 +40 +40 +7E +42 +66 +5A +42 +42 +42 +42 +62 +52 +4A +46 +42 +3C +42 +42 +42 +42 +3C +7C +42 +42 +7C +40 +40 +3C +42 +42 +52 +4A +3C +7C +42 +42 +7C +44 +42 +3C +40 +3C +02 +42 +3C +FE +10 +10 +10 +10 +10 +42 +42 +42 +42 +42 +3E +42 +42 +42 +42 +24 +18 +42 +42 +42 +42 +5A +24 +42 +24 +18 +18 +24 +42 +82 +44 +28 +10 +10 +10 +7E +04 +08 +10 +20 +7E +0E +08 +08 +08 +08 +0E +00 +40 +20 +10 +08 +04 +70 +10 +10 +10 +10 +70 +10 +38 +54 +10 +10 +10 +00 +00 +00 +00 +00 +00 +FF +1C +22 +78 +20 +20 +7E +00 +00 +38 +04 +3C +44 +3E +00 +20 +20 +3C +22 +22 +3C +00 +00 +1C +20 +20 +20 +1C +00 +04 +04 +3C +44 +44 +3E +00 +00 +38 +44 +78 +40 +3C +00 +0C +10 +18 +10 +10 +10 +00 +00 +3C +44 +44 +3C +04 +38 +40 +40 +78 +44 +44 +44 +00 +10 +00 +30 +10 +10 +38 +00 +04 +00 +04 +04 +04 +24 +18 +20 +28 +30 +30 +28 +24 +00 +10 +10 +10 +10 +10 +0C +00 +00 +68 +54 +54 +54 +54 +00 +00 +78 +44 +44 +44 +44 +00 +00 +38 +44 +44 +44 +38 +00 +00 +78 +44 +44 +78 +40 +40 +00 +3C +44 +44 +3C +04 +06 +00 +1C +20 +20 +20 +20 +00 +00 +38 +40 +38 +04 +78 +00 +10 +38 +10 +10 +10 +0C +00 +00 +44 +44 +44 +44 +3C +00 +00 +44 +44 +28 +28 +10 +00 +00 +44 +54 +54 +54 +28 +00 +00 +44 +28 +10 +28 +44 +00 +00 +44 +44 +44 +3C +04 +38 +00 +7C +08 +10 +20 +7C +00 +0E +08 +30 +30 +08 +0E +00 +08 +08 +08 +08 +08 +08 +00 +70 +10 +0C +0C +10 +70 +00 +32 +4C +00 +00 +00 +00 +00 +3C +42 +99 +A1 +A1 +99 +42 +3C +FF +58 +1D +00 diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/ace.rom b/Jupiter Cantab - JupiterACE_MiST/rtl/ace.rom new file mode 100644 index 00000000..71cac211 Binary files /dev/null and b/Jupiter Cantab - JupiterACE_MiST/rtl/ace.rom differ diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/ace_mist.sv b/Jupiter Cantab - JupiterACE_MiST/rtl/ace_mist.sv new file mode 100644 index 00000000..553ebed4 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/ace_mist.sv @@ -0,0 +1,205 @@ +`timescale 1ns / 1ps +`default_nettype none + +module ace_mist( + input CLOCK_27, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output LED, + output AUDIO_L, + output AUDIO_R, + output UART_TX,//uses for Tape Record + input UART_RX,//uses for Tape Play + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input SPI_SS4, + input CONF_DATA0, + output [12:0] SDRAM_A, + inout [15:0] SDRAM_DQ, + output SDRAM_DQML, + output SDRAM_DQMH, + output SDRAM_nWE, + output SDRAM_nCAS, + output SDRAM_nRAS, + output SDRAM_nCS, + output [1:0] SDRAM_BA, + output SDRAM_CLK, + output SDRAM_CKE + ); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Jupiter ACE;;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T5,Reset;", + "V,v0.2.",`BUILD_DATE + }; + +wire clk_sys; +wire clk_65; +wire clk_cpu; +wire clk_sdram; +wire locked; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire audio; +wire TapeIn; +wire TapeOut; +wire HSync, VSync; +wire video; +wire [7:0] kbd_rows; +wire [4:0] kbd_columns; + +pll pll( + .areset(), + .inclk0(CLOCK_27), + .c0(clk_sys),//26.0Mhz + .c1(clk_65),//6.5Mhz + .c2(clk_cpu),//3.25Mhz + .c3(clk_sdram),//100Mhz + .locked(locked) + ); + +reg [7:0] reset_cnt; +always @(posedge clk_sys) begin + if(!locked || buttons[1] || status[0] || status[5]) + reset_cnt <= 8'h0; + else if(reset_cnt != 8'd255) + reset_cnt <= reset_cnt + 8'd1; +end + +wire reset = (reset_cnt != 8'd255); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .conf_str(CONF_STR), + .clk_sys(clk_sys), + .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(scandoubler_disable), + .ypbpr(ypbpr), + .status(status), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data) +); + +video_mixer #(.LINE_LENGTH(800), .HALF_DEPTH(1)) video_mixer +( + .clk_sys(clk_sys), + .ce_pix(clk_65), + .ce_pix_actual(clk_65), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 3, status[4:3] == 2}), + .scandoubler_disable(scandoubler_disable), + .hq2x(status[4:3]==1), + .ypbpr(ypbpr), + .ypbpr_full(1), + .R({video,video,1'b0}), + .G({video,video,1'b0}), + .B({video,video,1'b0}), + .mono(1), + .HSync(HSync), + .VSync(VSync), + .line_start(0), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS) +); + +wire [24:0]sd_addr; +wire [7:0]sd_dout; +wire [7:0]sd_din; +wire sd_we; +wire sd_rd; +wire sd_ready; + +sram sram( + .SDRAM_DQ(SDRAM_DQ), + .SDRAM_A(SDRAM_A), + .SDRAM_DQML(SDRAM_DQML), + .SDRAM_DQMH(SDRAM_DQMH), + .SDRAM_BA(SDRAM_BA), + .SDRAM_nCS(SDRAM_nCS), + .SDRAM_nWE(SDRAM_nWE), + .SDRAM_nRAS(SDRAM_nRAS), + .SDRAM_nCAS(SDRAM_nCAS), + .SDRAM_CKE(SDRAM_CKE), + .init(~reset), + .clk_sdram(clk_sdram), + .addr(sd_addr), // 25 bit address + .dout(sd_dout), // data output to cpu + .din(sd_din), // data input from cpu + .we(sd_we), // cpu requests write + .rd(sd_rd), // cpu requests read + .ready(sd_ready) +); + + +jupiter_ace jupiter_ace +( + .clk_65(clk_65), + .clk_cpu(clk_cpu), + .reset(~reset), + .filas(kbd_rows), + .columnas(kbd_columns), + .video(video), + .hsync(HSync), + .vsync(VSync), + .ear(UART_RX),//Play + .mic(UART_TX),//Record + .spk(audio), + .sd_addr(sd_addr), + .sd_dout(sd_dout), + .sd_din(sd_din), + .sd_we(sd_we), + .sd_rd(sd_rd), + .sd_ready(sd_ready) +); + +sigma_delta_dac sigma_delta_dac +( + .DACout(AUDIO_L), + .DACin({audio}), + .CLK(clk_65), + .RESET(0) +); + +assign AUDIO_R = AUDIO_L; + +keyboard keyboard +( + .clk(clk_65), + .clkps2(ps2_kbd_clk), + .dataps2(ps2_kbd_data), + .rows(kbd_rows), + .columns(kbd_columns), + .kbd_reset(), + .kbd_nmi(), + .kbd_mreset() +); + + + + +endmodule diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/build_id.tcl b/Jupiter Cantab - JupiterACE_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_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/Jupiter Cantab - JupiterACE_MiST/rtl/build_id.v b/Jupiter Cantab - JupiterACE_MiST/rtl/build_id.v new file mode 100644 index 00000000..ef44ea45 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "171124" +`define BUILD_TIME "193745" diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/glue.v b/Jupiter Cantab - JupiterACE_MiST/rtl/glue.v new file mode 100644 index 00000000..f1d66bb9 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/glue.v @@ -0,0 +1,197 @@ +`timescale 1ns / 1ps +`default_nettype none +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 00:32:05 11/08/2015 +// Design Name: +// Module Name: glue +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module glue ( + input wire clk, + // CPU interface + input wire [15:0] cpu_addr, + input wire mreq_n, + input wire iorq_n, + input wire rd_n, + input wire wr_n, + input wire [7:0] data_from_cpu, + output reg [7:0] data_to_cpu, + output reg data_to_cpu_oe, + output reg wait_n, + output wire int_n, + // CPU-RAM interface + output reg rom_enable, + output reg sram_enable, + output reg cram_enable, + output reg uram_enable, + output reg xram_enable, + output reg eram_enable, + // Screen RAM and Char RAM interface + output wire [9:0] screen_addr, + input wire [7:0] screen_data, + output wire [9:0] char_addr, + input wire [7:0] char_data, + // Devices + input wire [4:0] kbdcols, + input wire ear, + output reg spk, + output reg mic, + output wire video, + output wire hsync_pal, + output wire vsync_pal + ); + + initial begin + wait_n = 1'b1; + spk = 1'b0; + mic = 1'b0; + end + + reg [8:0] cntpix = 9'd0; + reg [8:0] cntscn = 9'd0; + wire [17:0] cnt = {cntscn, cntpix}; + + always @(posedge clk) begin + if (cntpix != 9'd415) + cntpix <= cntpix + 9'd1; + else begin + cntpix <= 9'd0; + if (cntscn != 9'd311) + cntscn <= cntscn + 9'd1; + else + cntscn <= 9'd0; + end + end + + reg vsync; // FIELD signal in schematic + always @* begin + if (cntscn >= 9'd248 && cntscn <= 9'd255) + vsync = 1'b0; + else + vsync = 1'b1; + end + assign int_n = vsync; + + reg hsync; // LINE signal in schematic + always @* begin + if (cntpix >= 9'd320 && cntpix <= 9'd351) + hsync = 1'b0; + else + hsync = 1'b1; + end + + //assign csync = hsync & vsync; + assign hsync_pal = hsync; + assign vsync_pal = vsync; + + reg viden; // VIDEN signal in schematic + always @* begin + if (cntpix >= 9'd0 && cntpix <= 9'd255 && + cntscn >= 9'd0 && cntscn <= 9'd191) + viden = 1'b1; + else + viden = 1'b0; + end + + // SHIFT/LOAD signal to 74LS166 + reg shiftload; + always @* begin + if (cnt[2:0] == 3'b000 && viden == 1'b1) + shiftload = 1'b1; + else + shiftload = 1'b0; + end + + assign screen_addr = {cnt[16:12], cnt[7:3]}; + assign char_addr = {screen_data[6:0], cnt[11:9]}; + + // 74LS166 + reg [7:0] shiftreg = 8'h00; + always @(posedge clk) begin + if (shiftload == 1'b1) + shiftreg <= char_data; + else + shiftreg <= {shiftreg[6:0], 1'b0}; + end + + // Pixel inverter reg and video output stage + reg pixinverter = 1'b0; + always @(posedge clk) begin + if (cnt[2:0] == 3'b000) + pixinverter <= viden & screen_data[7]; + end + + assign video = shiftreg[7] ^ pixinverter; + + // Address decoder + reg fast_access; + always @* begin + rom_enable = 1'b0; + sram_enable = 1'b0; + cram_enable = 1'b0; + uram_enable = 1'b0; + xram_enable = 1'b0; + eram_enable = 1'b0; + fast_access = 1'b1; + if (mreq_n == 1'b0) begin + if (cpu_addr >= 16'h0000 && cpu_addr <= 16'h1FFF) + rom_enable = 1'b1; + else if (cpu_addr >= 16'h2000 && cpu_addr <= 16'h27FF) begin + sram_enable = 1'b1; + if (cpu_addr >= 16'h2400 && cpu_addr <= 16'h27FF) + fast_access = 1'b0; + end + else if (cpu_addr >= 16'h2800 && cpu_addr <= 16'h2FFF) begin + cram_enable = 1'b1; + if (cpu_addr >= 16'h2C00 && cpu_addr <= 16'h2FFF) + fast_access = 1'b0; + end + else if (cpu_addr >= 16'h3000 && cpu_addr <= 16'h3FFF) + uram_enable = 1'b1; + else if (cpu_addr >= 16'h4000 && cpu_addr <= 16'h7FFF) + xram_enable = 1'b1; + else + eram_enable = 1'b1; + end + end + + // CPU arbitration to share memory with video generator + always @(posedge clk) begin + if ((sram_enable == 1'b1 || cram_enable == 1'b1) && viden == 1'b1 && fast_access == 1'b0) + wait_n <= 1'b0; + else if (viden == 1'b0) + wait_n <= 1'b1; + end + + // IO devices + always @* begin + data_to_cpu_oe = 1'b0; + data_to_cpu = {2'b11, ear, kbdcols}; + if (iorq_n == 1'b0 && cpu_addr[0] == 1'b0 && rd_n == 1'b0) begin + data_to_cpu_oe = 1'b1; + end + end + always @(posedge clk) begin + if (iorq_n == 1'b0 && cpu_addr[0] == 1'b0) begin + if (rd_n == 1'b0 && wr_n == 1'b1) + spk <= 1'b0; + else if (rd_n == 1'b1 && wr_n == 1'b0) + spk <= 1'b1; + if (wr_n == 1'b0) + mic <= data_from_cpu[3]; + end + end +endmodule diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/hq2x.sv b/Jupiter Cantab - JupiterACE_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_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/Jupiter Cantab - JupiterACE_MiST/rtl/io_write_to_rom.v b/Jupiter Cantab - JupiterACE_MiST/rtl/io_write_to_rom.v new file mode 100644 index 00000000..3a21c492 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/io_write_to_rom.v @@ -0,0 +1,81 @@ +`timescale 1ns / 1ps +`default_nettype none + +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 16:45:40 11/08/2015 +// Design Name: +// Module Name: io_write_to_rom +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module io_write_to_rom ( + input wire clk, + input wire [15:0] a, + input wire iorq_n, + input wire rd_n, + input wire wr_n, + input wire [7:0] din, + output reg [7:0] dout, + output reg dout_oe, + output reg enable_write_to_rom + ); + + parameter IOADDR = 127; // Puerto 127 para esta historia + reg [7:0] magicsequence[0:7]; + initial begin + enable_write_to_rom = 1'b0; + magicsequence[0] = "E"; + magicsequence[1] = "N"; + magicsequence[2] = "A"; + magicsequence[3] = "B"; + magicsequence[4] = "L"; + magicsequence[5] = "E"; + magicsequence[6] = "W"; + magicsequence[7] = "R"; + end + + reg [2:0] indexseq = 3'd0; + reg in_io_write = 1'b0; + reg [7:0] data_from_cpu; + + always @(posedge clk) begin + if (in_io_write == 1'b0 && iorq_n == 1'b0 && wr_n == 1'b0 && a[7:0] == IOADDR) begin + data_from_cpu <= din; + in_io_write <= 1'b1; + end + else if (in_io_write == 1'b1 && (iorq_n == 1'b1 || wr_n == 1'b1 || a[7:0] != IOADDR)) begin + in_io_write <= 1'b0; + if (data_from_cpu == magicsequence[indexseq]) begin + if (indexseq == 3'd7) + enable_write_to_rom <= 1'b1; + else begin + enable_write_to_rom <= 1'b0; + indexseq <= indexseq + 3'd1; + end + end + else begin + enable_write_to_rom <= 1'b0; + indexseq <= 3'd0; + end + end + end + + always @* begin + dout_oe = 1'b0; + dout = {7'b0000000,enable_write_to_rom}; + if (iorq_n == 1'b0 && rd_n == 1'b0 && a[7:0] == IOADDR) + dout_oe = 1'b1; + end +endmodule diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/jupiter_ace.v b/Jupiter Cantab - JupiterACE_MiST/rtl/jupiter_ace.v new file mode 100644 index 00000000..ae0fb3c8 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/jupiter_ace.v @@ -0,0 +1,217 @@ +`timescale 1ns / 1ps +`default_nettype none + +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 20:06:40 03/19/2011 +// Design Name: +// Module Name: jace_on_fpga +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +module jupiter_ace ( + input wire clk_65, + input wire clk_cpu, + input wire reset, + input wire ear, + output wire [7:0] filas, + input wire [4:0] columnas, + output wire video, + output wire hsync, + output wire vsync, + output wire mic, + output wire spk, + output wire sd_addr, + input wire sd_dout, + output wire sd_din, + output wire sd_we, + output wire sd_rd, + input wire sd_ready + ); + + wire [7:0] DinZ80; + wire [7:0] DoutZ80; + wire [15:0] AZ80; + + + wire iorq_n, mreq_n, rd_n, wr_n, wait_n, int_n; + wire rom_enable, sram_enable, cram_enable, uram_enable, xram_enable, eram_enable, data_from_jace_oe; + wire [7:0] dout_rom, dout_sram, dout_cram, dout_uram, dout_xram, dout_eram, data_from_jace; + wire [7:0] sram_data, cram_data; + wire [9:0] sram_addr, cram_addr; + + + wire enable_write_to_rom; + wire [7:0] dout_modulo_enable_write; + wire modulo_enable_write_oe; + + + assign filas = AZ80[15:8]; + + // Multiplexer + assign DinZ80 = (rom_enable == 1'b1)? dout_rom : + (sram_enable == 1'b1)? dout_sram : + (cram_enable == 1'b1)? dout_cram : + (uram_enable == 1'b1)? dout_uram : + (xram_enable == 1'b1)? dout_xram : + (eram_enable == 1'b1)? dout_eram : + (modulo_enable_write_oe == 1'b1)? dout_modulo_enable_write : + (data_from_jace_oe == 1'b1)? data_from_jace : + sram_data | cram_data; // By default, this is what the data bus sees + + ram1k_dualport sram ( + .clk(clk_65), + .ce(sram_enable), + .a1(AZ80[9:0]), + .a2(sram_addr), + .din(DoutZ80), + .dout1(dout_sram), + .dout2(sram_data), + .we(~wr_n) + ); + + ram1k_dualport cram ( + .clk(clk_65), + .ce(cram_enable), + .a1(AZ80[9:0]), + .a2(cram_addr), + .din(DoutZ80), + .dout1(dout_cram), + .dout2(cram_data), + .we(~wr_n) + ); + + ram1k uram( + .clk(clk_65), + .ce(uram_enable), + .a(AZ80[9:0]), + .din(DoutZ80), + .dout(dout_uram), + .we(~wr_n) + ); + + ram16k xram( + .clk(clk_65), + .ce(xram_enable), + .a(AZ80[13:0]), + .din(DoutZ80), + .dout(dout_xram), + .we(~wr_n) + ); + +assign sd_addr = AZ80[13:0]; +//assign sd_dout = dout_eram; +assign sd_din = DoutZ80; +assign sd_we = ~wr_n; +assign sd_rd = eram_enable; + + +// ram32k eram(//16k for now//todo 32k +// .clk(clk_65), +// .ce(eram_enable), +// .a(AZ80[13:0]),//14 +// .din(DoutZ80), +// .dout(dout_eram), +// .we(~wr_n) +// ); + +// rom the_rom( +// .clk(clk_65), +// .a(AZ80[12:0]), +// .dout(dout_rom) +// ); + + rom2 the_rom( + .clk(clk_65), + .ce(rom_enable), + .a(AZ80[12:0]), + .din(DoutZ80), + .dout(dout_rom), + .we(~wr_n & enable_write_to_rom) + ); + + io_write_to_rom modulo_habilitador_escrituras ( + .clk(clk_65), + .a(AZ80), + .iorq_n(iorq_n), + .rd_n(rd_n), + .wr_n(wr_n), + .din(DoutZ80), + .dout(dout_modulo_enable_write), + .dout_oe(modulo_enable_write_oe), + .enable_write_to_rom(enable_write_to_rom) + ); + + + tv80n cpu( + // Outputs + .m1_n(), + .mreq_n(mreq_n), + .iorq_n(iorq_n), + .rd_n(rd_n), + .wr_n(wr_n), + .rfsh_n(), + .halt_n(), + .busak_n(), + .A(AZ80), + .dout(DoutZ80), + // Inputs + .di(DinZ80), + .reset_n(reset), + .clk(clk_cpu), + .wait_n(wait_n), + .int_n(int_n), + .nmi_n(1'b1), + .busrq_n(1'b1) + ); + + glue glogic ( + .clk(clk_65), + // CPU interface + .cpu_addr(AZ80), + .mreq_n(mreq_n), + .iorq_n(iorq_n), + .rd_n(rd_n), + .wr_n(wr_n), + .data_from_cpu(DoutZ80), + .data_to_cpu(data_from_jace), + .data_to_cpu_oe(data_from_jace_oe), + .wait_n(wait_n), + .int_n(int_n), + // CPU-RAM interface + .rom_enable(rom_enable), + .sram_enable(sram_enable), + .cram_enable(cram_enable), + .uram_enable(uram_enable), + .xram_enable(xram_enable), + .eram_enable(eram_enable), + // Screen RAM and Char RAM interface + .screen_addr(sram_addr), + .screen_data(sram_data), + .char_addr(cram_addr), + .char_data(cram_data), + // Devices + .kbdcols(columnas), + .ear(ear), + .spk(spk), + .mic(mic), + .video(video), + .hsync_pal(hsync), + .vsync_pal(vsync) + ); + + +endmodule + diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/keyboard.v b/Jupiter Cantab - JupiterACE_MiST/rtl/keyboard.v new file mode 100644 index 00000000..e4f69fa6 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/keyboard.v @@ -0,0 +1,632 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 17:36:45 11/07/2015 +// Design Name: +// Module Name: keyboard +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module keyboard( + input wire clk, + input wire clkps2, + input wire dataps2, + input wire [7:0] rows, + output wire [4:0] columns, + output reg kbd_reset, + output reg kbd_nmi, + output reg kbd_mreset + ); + + initial begin + kbd_reset = 1'b1; + kbd_nmi = 1'b1; + kbd_mreset = 1'b1; + end + + // Teclas no extendidas +`define KEY_RELEASED 8'hf0 +`define KEY_EXTENDED 8'he0 +`define KEY_ESC 8'h76 +`define KEY_F1 8'h05 +`define KEY_F2 8'h06 +`define KEY_F3 8'h04 +`define KEY_F4 8'h0C +`define KEY_F5 8'h03 +`define KEY_F6 8'h0B +`define KEY_F7 8'h83 +`define KEY_F8 8'h0A +`define KEY_F9 8'h01 +`define KEY_F10 8'h09 +`define KEY_F11 8'h78 +`define KEY_F12 8'h07 + +`define KEY_BL 8'h0E +`define KEY_1 8'h16 +`define KEY_2 8'h1E +`define KEY_3 8'h26 +`define KEY_4 8'h25 +`define KEY_5 8'h2E +`define KEY_6 8'h36 +`define KEY_7 8'h3D +`define KEY_8 8'h3E +`define KEY_9 8'h46 +`define KEY_0 8'h45 +`define KEY_APOS 8'h4E +`define KEY_AEXC 8'h55 +`define KEY_BKSP 8'h66 + +`define KEY_TAB 8'h0D +`define KEY_Q 8'h15 +`define KEY_W 8'h1D +`define KEY_E 8'h24 +`define KEY_R 8'h2D +`define KEY_T 8'h2C +`define KEY_Y 8'h35 +`define KEY_U 8'h3C +`define KEY_I 8'h43 +`define KEY_O 8'h44 +`define KEY_P 8'h4D +`define KEY_CORCHA 8'h54 +`define KEY_CORCHC 8'h5B +`define KEY_ENTER 8'h5A + +`define KEY_CPSLK 8'h58 +`define KEY_A 8'h1C +`define KEY_S 8'h1B +`define KEY_D 8'h23 +`define KEY_F 8'h2B +`define KEY_G 8'h34 +`define KEY_H 8'h33 +`define KEY_J 8'h3B +`define KEY_K 8'h42 +`define KEY_L 8'h4B +`define KEY_NT 8'h4C +`define KEY_LLAVA 8'h52 +`define KEY_LLAVC 8'h5D + +`define KEY_LSHIFT 8'h12 +`define KEY_LT 8'h61 +`define KEY_Z 8'h1A +`define KEY_X 8'h22 +`define KEY_C 8'h21 +`define KEY_V 8'h2A +`define KEY_B 8'h32 +`define KEY_N 8'h31 +`define KEY_M 8'h3A +`define KEY_COMA 8'h41 +`define KEY_PUNTO 8'h49 +`define KEY_MENOS 8'h4A +`define KEY_RSHIFT 8'h59 + +`define KEY_LCTRL 8'h14 +`define KEY_LALT 8'h11 +`define KEY_SPACE 8'h29 + +`define KEY_KP0 8'h70 +`define KEY_KP1 8'h69 +`define KEY_KP2 8'h72 +`define KEY_KP3 8'h7A +`define KEY_KP4 8'h6B +`define KEY_KP5 8'h73 +`define KEY_KP6 8'h74 +`define KEY_KP7 8'h6C +`define KEY_KP8 8'h75 +`define KEY_KP9 8'h7D +`define KEY_KPPUNTO 8'h71 +`define KEY_KPMAS 8'h79 +`define KEY_KPMENOS 8'h7B +`define KEY_KPASTER 8'h7C + +`define KEY_BLKNUM 8'h77 +`define KEY_BLKSCR 8'h7E + +// Teclas extendidas (E0 + scancode) +`define KEY_WAKEUP 8'h5E +`define KEY_SLEEP 8'h3F +`define KEY_POWER 8'h37 +`define KEY_INS 8'h70 +`define KEY_SUP 8'h71 +`define KEY_HOME 8'h6C +`define KEY_END 8'h69 +`define KEY_PGU 8'h7D +`define KEY_PGD 8'h7A +`define KEY_UP 8'h75 +`define KEY_DOWN 8'h72 +`define KEY_LEFT 8'h6B +`define KEY_RIGHT 8'h74 +`define KEY_RCTRL 8'h14 +`define KEY_ALTGR 8'h11 +`define KEY_KPENTER 8'h5A +`define KEY_KPSLASH 8'h4A +`define KEY_PRTSCR 8'h7C + + + wire new_key_aval; + wire [7:0] scancode; + wire is_released; + wire is_extended; + + reg shift_pressed = 1'b0; + reg ctrl_pressed = 1'b0; + reg alt_pressed = 1'b0; + + ps2_port ps2_kbd ( + .clk(clk), // se recomienda 1 MHz <= clk <= 600 MHz + .enable_rcv(1'b1), // habilitar la maquina de estados de recepcion + .ps2clk_ext(clkps2), + .ps2data_ext(dataps2), + .kb_interrupt(new_key_aval), // a 1 durante 1 clk para indicar nueva tecla recibida + .scancode(scancode), // make o breakcode de la tecla + .released(is_released), // soltada=1, pulsada=0 + .extended(is_extended) // extendida=1, no extendida=0 + ); + + reg [4:0] matrix[0:7]; // 40-key matrix keyboard + initial begin + matrix[0] = 5'b11111; // C X Z SS CS + matrix[1] = 5'b11111; // G F D S A + matrix[2] = 5'b11111; // T R E W Q + matrix[3] = 5'b11111; // 5 4 3 2 1 + matrix[4] = 5'b11111; // 6 7 8 9 0 + matrix[5] = 5'b11111; // Y U I O P + matrix[6] = 5'b11111; // H J K L ENT + matrix[7] = 5'b11111; // V B N M SP + end + + assign columns = (matrix[0] | { {8{rows[0]}} }) & + (matrix[1] | { {8{rows[1]}} }) & + (matrix[2] | { {8{rows[2]}} }) & + (matrix[3] | { {8{rows[3]}} }) & + (matrix[4] | { {8{rows[4]}} }) & + (matrix[5] | { {8{rows[5]}} }) & + (matrix[6] | { {8{rows[6]}} }) & + (matrix[7] | { {8{rows[7]}} }); + + always @(posedge clk) begin + if (new_key_aval == 1'b1) begin + case (scancode) + // Special and control keys + `KEY_LSHIFT, + `KEY_RSHIFT: + shift_pressed <= ~is_released; + `KEY_LCTRL, + `KEY_RCTRL: + begin + ctrl_pressed <= ~is_released; + if (is_extended) + matrix[0][1] <= is_released; // Right control = Symbol shift + else + matrix[0][0] <= is_released; // Left control = Caps shift + end + `KEY_LALT: + alt_pressed <= ~is_released; + `KEY_KPPUNTO: + if (ctrl_pressed && alt_pressed) begin + kbd_reset <= is_released; + if (is_released == 1'b0) begin + matrix[0] <= 5'b11111; // C X Z SS CS + matrix[1] <= 5'b11111; // G F D S A + matrix[2] <= 5'b11111; // T R E W Q + matrix[3] <= 5'b11111; // 5 4 3 2 1 + matrix[4] <= 5'b11111; // 6 7 8 9 0 + matrix[5] <= 5'b11111; // Y U I O P + matrix[6] <= 5'b11111; // H J K L ENT + matrix[7] <= 5'b11111; // V B N M SP + end + end + `KEY_F5: + if (ctrl_pressed && alt_pressed) + kbd_nmi <= is_released; + `KEY_ENTER: + matrix[6][0] <= is_released; + `KEY_ESC: + begin + matrix[0][0] <= is_released; + matrix[7][0] <= is_released; + end + `KEY_BKSP: + if (ctrl_pressed && alt_pressed) begin + kbd_mreset <= is_released; + end + else begin + matrix[0][0] <= is_released; + matrix[4][0] <= is_released; + end + `KEY_CPSLK: + begin + matrix[0][0] <= is_released; + matrix[3][1] <= is_released; // CAPS LOCK + end + `KEY_F2: + begin + matrix[0][0] <= is_released; + matrix[3][0] <= is_released; // EDIT + end + + // Digits and puntuaction marks inside digits + `KEY_1: + begin + if (alt_pressed) begin + matrix[0][1] <= is_released; + matrix[1][1] <= is_released; // | + end + else if (shift_pressed) begin + matrix[0][1] <= is_released; + matrix[3][0] <= is_released; // ! + end + else + matrix[3][0] <= is_released; + + end + `KEY_2: + begin + if (alt_pressed) begin + matrix[0][1] <= is_released; + matrix[3][1] <= is_released; // @ + end + else if (shift_pressed) begin + matrix[0][1] <= is_released; + matrix[5][0] <= is_released; // " + end + else + matrix[3][1] <= is_released; + end + `KEY_3: + begin + if (!shift_pressed) + matrix[3][2] <= is_released; + else begin + matrix[0][1] <= is_released; + matrix[3][2] <= is_released; // # + end + end + `KEY_4: + begin + if (shift_pressed) begin + matrix[0][1] <= is_released; + matrix[3][3] <= is_released; // $ + end + else if (ctrl_pressed) begin + matrix[0][0] <= is_released; + matrix[3][3] <= is_released; // INV VIDEO + end + else + matrix[3][3] <= is_released; + end + `KEY_5: + begin + if (!shift_pressed) + matrix[3][4] <= is_released; + else begin + matrix[0][1] <= is_released; + matrix[3][4] <= is_released; // % + end + end + `KEY_6: + begin + if (!shift_pressed) + matrix[4][4] <= is_released; + else begin + matrix[0][1] <= is_released; + matrix[4][4] <= is_released; // & + end + end + `KEY_7: + begin + if (!shift_pressed) + matrix[4][3] <= is_released; + else begin + matrix[0][1] <= is_released; + matrix[7][4] <= is_released; // / + end + end + `KEY_8: + begin + if (!shift_pressed) + matrix[4][2] <= is_released; + else begin + matrix[0][1] <= is_released; + matrix[4][2] <= is_released; // ( + end + end + `KEY_9: + begin + if (shift_pressed) begin + matrix[0][1] <= is_released; + matrix[4][1] <= is_released; // ) + end + else if (ctrl_pressed) begin + matrix[0][0] <= is_released; + matrix[4][1] <= is_released; + end + else + matrix[4][1] <= is_released; + end + `KEY_0: + begin + if (!shift_pressed) + matrix[4][0] <= is_released; + else begin + matrix[0][1] <= is_released; + matrix[6][1] <= is_released; // = + end + end + + // Alphabetic characters + `KEY_Z: + begin + matrix[0][2] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_X: + begin + matrix[0][3] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_C: + begin + matrix[0][4] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_A: + begin + matrix[1][0] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_S: + begin + matrix[1][1] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_D: + begin + matrix[1][2] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_F: + begin + matrix[1][3] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_G: + begin + matrix[1][4] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_Q: + begin + matrix[2][0] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_W: + begin + matrix[2][1] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_E: + begin + matrix[2][2] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_R: + begin + matrix[2][3] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_T: + begin + matrix[2][4] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_P: + begin + matrix[5][0] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_O: + begin + matrix[5][1] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_I: + begin + matrix[5][2] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_U: + begin + matrix[5][3] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_Y: + begin + matrix[5][4] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_L: + begin + matrix[6][1] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_K: + begin + matrix[6][2] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_J: + begin + matrix[6][3] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_H: + begin + matrix[6][4] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_M: + begin + matrix[7][1] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_N: + begin + matrix[7][2] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_B: + begin + matrix[7][3] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + `KEY_V: + begin + matrix[7][4] <= is_released; + if (shift_pressed) + matrix[0][0] <= is_released; + end + + // Symbols + `KEY_APOS: + begin + matrix[0][1] <= is_released; + if (!shift_pressed) + matrix[4][3] <= is_released; + else + matrix[0][4] <= is_released; // ? + end + `KEY_CORCHA: + begin + matrix[0][1] <= is_released; + if (alt_pressed || shift_pressed) + matrix[5][4] <= is_released; // [ + else + matrix[6][4] <= is_released; // ^ + end + `KEY_CORCHC: + begin + matrix[0][1] <= is_released; + if (shift_pressed) + matrix[7][3] <= is_released; // * + else if (alt_pressed) + matrix[5][3] <= is_released; // ] + else + matrix[6][2] <= is_released; // + + end + `KEY_LLAVA: + begin + matrix[0][1] <= is_released; + if (alt_pressed || shift_pressed) + matrix[1][3] <= is_released; // { + else + matrix[0][3] <= is_released; // pound + end + `KEY_LLAVC: + begin + matrix[0][1] <= is_released; + if (alt_pressed || shift_pressed) + matrix[1][4] <= is_released; // } + else + matrix[5][2] <= is_released; // copyright + end + `KEY_COMA: + begin + matrix[0][1] <= is_released; + if (!shift_pressed) + matrix[7][2] <= is_released; + else + matrix[5][1] <= is_released; // ; + end + `KEY_PUNTO: + begin + matrix[0][1] <= is_released; + if (!shift_pressed) + matrix[7][1] <= is_released; + else + matrix[0][2] <= is_released; // : + end + `KEY_MENOS: + begin + matrix[0][1] <= is_released; + if (!shift_pressed) + matrix[6][3] <= is_released; // + else + matrix[4][0] <= is_released; // _ + end + `KEY_LT: + begin + matrix[0][1] <= is_released; + if (!shift_pressed) + matrix[2][3] <= is_released; // < + else + matrix[2][4] <= is_released; // > + end + `KEY_BL: + begin + matrix[0][1] <= is_released; + matrix[1][2] <= is_released; // \ + end + `KEY_SPACE: + matrix[7][0] <= is_released; + + // Cursor keys + `KEY_UP: + begin + matrix[0][0] <= is_released; + matrix[4][4] <= is_released; + end + `KEY_DOWN: + begin + matrix[0][0] <= is_released; + matrix[4][3] <= is_released; + end + `KEY_LEFT: + begin + matrix[0][0] <= is_released; + matrix[3][4] <= is_released; + end + `KEY_RIGHT: + begin + matrix[0][0] <= is_released; + matrix[4][2] <= is_released; + end + endcase + end + end +endmodule diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/mist_io.v b/Jupiter Cantab - JupiterACE_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ab9ef8ad --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/mist_io.v @@ -0,0 +1,532 @@ +// +// 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, + + // ARM -> FPGA download + input ioctl_force_erase, + output reg ioctl_download = 0, // signal indicating an active download + output reg ioctl_erasing = 0, // signal indicating an active erase + output reg [7:0] ioctl_index, // menu index used to upload the file + output reg ioctl_wr = 0, + 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 [7: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; + +// 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]; + + 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 + case(ioctl_index) + 0: addr <= 'h080000; // BOOT ROM + 'h01: addr <= 'h000100; // ROM file + 'h41: addr <= 'h000100; // COM file + 'h81: addr <= 'h000000; // C00 file + 'hC1: addr <= 'h010000; // EDD file + default: addr <= 'h100000; // FDD file + endcase + 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 + +reg [24:0] erase_mask; +wire [24:0] next_erase = (ioctl_addr + 1'd1) & erase_mask; + +always@(posedge clk_sys) begin + reg rclkD, rclkD2; + reg old_force = 0; + reg [5:0] erase_clk_div; + reg [24:0] end_addr; + reg erase_trigger = 0; + + rclkD <= rclk; + rclkD2 <= rclkD; + ioctl_wr <= 0; + + if(rclkD & ~rclkD2) begin + ioctl_dout <= data_w; + ioctl_addr <= addr_w; + ioctl_wr <= 1; + end + + if(ioctl_download) begin + old_force <= 0; + ioctl_erasing <= 0; + erase_trigger <= (ioctl_index == 1); + end else begin + + old_force <= ioctl_force_erase; + + // start erasing + if(erase_trigger) begin + erase_trigger <= 0; + erase_mask <= 'hFFFF; + end_addr <= 'h0100; + erase_clk_div <= 1; + ioctl_erasing <= 1; + end else if((ioctl_force_erase & ~old_force)) begin + erase_trigger <= 0; + ioctl_addr <= 'h1FFFFFF; + erase_mask <= 'h1FFFFFF; + end_addr <= 'h0050000; + erase_clk_div <= 1; + ioctl_erasing <= 1; + end else if(ioctl_erasing) begin + erase_clk_div <= erase_clk_div + 1'd1; + if(!erase_clk_div) begin + if(next_erase == end_addr) ioctl_erasing <= 0; + else begin + ioctl_addr <= next_erase; + ioctl_dout <= 0; + ioctl_wr <= 1; + end + end + end + end +end + +endmodule \ No newline at end of file diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/osd.v b/Jupiter Cantab - JupiterACE_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Jupiter Cantab - JupiterACE_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/Jupiter Cantab - JupiterACE_MiST/rtl/pll.qip b/Jupiter Cantab - JupiterACE_MiST/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Jupiter Cantab - JupiterACE_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/Jupiter Cantab - JupiterACE_MiST/rtl/pll.v b/Jupiter Cantab - JupiterACE_MiST/rtl/pll.v new file mode 100644 index 00000000..47bde791 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/pll.v @@ -0,0 +1,404 @@ +// 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 ( + areset, + inclk0, + c0, + c1, + c2, + c3, + locked); + + input areset; + input inclk0; + output c0; + output c1; + output c2; + output c3; + output locked; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri0 areset; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [4:0] sub_wire0; + wire sub_wire3; + wire [0:0] sub_wire8 = 1'h0; + wire [2:2] sub_wire5 = sub_wire0[2:2]; + wire [0:0] sub_wire4 = sub_wire0[0:0]; + wire [3:3] sub_wire2 = sub_wire0[3:3]; + wire [1:1] sub_wire1 = sub_wire0[1:1]; + wire c1 = sub_wire1; + wire c3 = sub_wire2; + wire locked = sub_wire3; + wire c0 = sub_wire4; + wire c2 = sub_wire5; + wire sub_wire6 = inclk0; + wire [1:0] sub_wire7 = {sub_wire8, sub_wire6}; + + altpll altpll_component ( + .areset (areset), + .inclk (sub_wire7), + .clk (sub_wire0), + .locked (sub_wire3), + .activeclock (), + .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 (), + .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 = 26, + altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 54, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 13, + altpll_component.clk1_phase_shift = "0", + altpll_component.clk2_divide_by = 108, + altpll_component.clk2_duty_cycle = 50, + altpll_component.clk2_multiply_by = 13, + altpll_component.clk2_phase_shift = "0", + altpll_component.clk3_divide_by = 27, + altpll_component.clk3_duty_cycle = 50, + altpll_component.clk3_multiply_by = 104, + altpll_component.clk3_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_USED", + 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_USED", + 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_USED", + 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.self_reset_on_loss_lock = "OFF", + 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 "54" +// Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "108" +// Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "27" +// 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: DUTY_CYCLE3 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "26.000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "6.500000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "3.250000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "104.000000" +// 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 "1" +// 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 "deg" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 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: MIRROR_CLK3 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "26" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "13" +// Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "13" +// Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "104" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "26.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "6.50000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "3.25000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "104.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 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: OUTPUT_FREQ_UNIT3 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_SHIFT3 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: PHASE_SHIFT_UNIT3 STRING "ps" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +// 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: STICKY_CLK3 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_CLK3 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_CLKENA3 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 "26" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "54" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "13" +// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "108" +// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "13" +// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "27" +// Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "104" +// Retrieval info: CONSTANT: CLK3_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_USED" +// 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_USED" +// 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_USED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: areset 0 0 0 0 INPUT GND "areset" +// 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +// 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +// Retrieval info: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Jupiter Cantab - JupiterACE_MiST/rtl/ps2_port.v b/Jupiter Cantab - JupiterACE_MiST/rtl/ps2_port.v new file mode 100644 index 00000000..b4064f61 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/ps2_port.v @@ -0,0 +1,124 @@ +`timescale 1ns / 1ps +`default_nettype none + +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 20:16:31 12/26/2014 +// Design Name: +// Module Name: ps2_port +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module ps2_port ( + input wire clk, // se recomienda 1 MHz <= clk <= 600 MHz + input wire enable_rcv, // habilitar la maquina de estados de recepcion + input wire ps2clk_ext, + input wire ps2data_ext, + output wire kb_interrupt, // a 1 durante 1 clk para indicar nueva tecla recibida + output reg [7:0] scancode, // make o breakcode de la tecla + output wire released, // soltada=1, pulsada=0 + output wire extended // extendida=1, no extendida=0 + ); + + `define RCVSTART 2'b00 + `define RCVDATA 2'b01 + `define RCVPARITY 2'b10 + `define RCVSTOP 2'b11 + + reg [7:0] key = 8'h00; + + // Fase de sincronizacion de señales externas con el reloj del sistema + reg [1:0] ps2clk_synchr; + reg [1:0] ps2dat_synchr; + wire ps2clk = ps2clk_synchr[1]; + wire ps2data = ps2dat_synchr[1]; + always @(posedge clk) begin + ps2clk_synchr[0] <= ps2clk_ext; + ps2clk_synchr[1] <= ps2clk_synchr[0]; + ps2dat_synchr[0] <= ps2data_ext; + ps2dat_synchr[1] <= ps2dat_synchr[0]; + end + + // De-glitcher. Sólo detecto flanco de bajada + reg [15:0] negedgedetect = 16'h0000; + always @(posedge clk) begin + negedgedetect <= {negedgedetect[14:0], ps2clk}; + end + wire ps2clkedge = (negedgedetect == 16'hF000)? 1'b1 : 1'b0; + + // Paridad instantánea de los bits recibidos + wire paritycalculated = ^key; + + // Contador de time-out. Al llegar a 65536 ciclos sin que ocurra + // un flanco de bajada en PS2CLK, volvemos al estado inicial + reg [15:0] timeoutcnt = 16'h0000; + + reg [1:0] state = `RCVSTART; + reg [1:0] regextended = 2'b00; + reg [1:0] regreleased = 2'b00; + reg rkb_interrupt = 1'b0; + assign released = regreleased[1]; + assign extended = regextended[1]; + assign kb_interrupt = rkb_interrupt; + + always @(posedge clk) begin + if (rkb_interrupt == 1'b1) begin + rkb_interrupt <= 1'b0; + end + if (ps2clkedge && enable_rcv) begin + timeoutcnt <= 16'h0000; + if (state == `RCVSTART && ps2data == 1'b0) begin + state <= `RCVDATA; + key <= 8'h80; + end + else if (state == `RCVDATA) begin + key <= {ps2data, key[7:1]}; + if (key[0] == 1'b1) begin + state <= `RCVPARITY; + end + end + else if (state == `RCVPARITY) begin + if (ps2data^paritycalculated == 1'b1) begin + state <= `RCVSTOP; + end + else begin + state <= `RCVSTART; + end + end + else if (state == `RCVSTOP) begin + state <= `RCVSTART; + if (ps2data == 1'b1) begin + scancode <= key; + if (key == 8'hE0) begin + regextended <= 2'b01; + end + else if (key == 8'hF0) begin + regreleased <= 2'b01; + end + else begin + regextended <= {regextended[0], 1'b0}; + regreleased <= {regreleased[0], 1'b0}; + rkb_interrupt <= 1'b1; + end + end + end + end + else begin + timeoutcnt <= timeoutcnt + 1; + if (timeoutcnt == 16'hFFFF) begin + state <= `RCVSTART; + end + end + end +endmodule diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/rom_ram.v b/Jupiter Cantab - JupiterACE_MiST/rtl/rom_ram.v new file mode 100644 index 00000000..8483e4ee --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/rom_ram.v @@ -0,0 +1,131 @@ +`timescale 1ns / 1ps +`default_nettype none +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 04:47:33 03/21/2011 +// Design Name: +// Module Name: memorias +// Project Name: +// Target Device_ns: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module rom ( + input wire clk, + input wire [12:0] a, + output reg [7:0] dout + ); + + reg [7:0] mem[0:8191]; + integer i; + initial begin // usa $readmemb/$readmemh dependiendo del formato del fichero que contenga la ROM + $readmemh ("ace.hex", mem, 0); + end + + always @(posedge clk) begin + dout <= mem[a[12:0]]; + end +endmodule + + +module rom2 ( + input wire clk, + input wire ce, + input wire [12:0] a, + input wire we, + input wire [7:0] din, + output reg [7:0] dout + ); + + reg [7:0] mem[0:8191]; + integer i; + initial begin // usa $readmemb/$readmemh dependiendo del formato del fichero que contenga la ROM + $readmemh ("ace.hex", mem, 0); + end + + always @(posedge clk) begin + dout <= mem[a]; + if (we == 1'b1 && ce == 1'b1) + mem[a] <= din; + end +endmodule + +module ram1k ( + input wire clk, + input wire ce, + input wire [9:0] a, + input wire [7:0] din, + output reg [7:0] dout, + input wire we + ); + + reg [7:0] mem[0:1023]; + always @(posedge clk) begin + dout <= mem[a]; + if (we == 1'b1 && ce == 1'b1) + mem[a] <= din; + end +endmodule + +module ram1k_dualport( + input wire clk, + input wire ce, + input wire [9:0] a1, + input wire [9:0] a2, + input wire [7:0] din, + output reg [7:0] dout1, + output reg [7:0] dout2, + input wire we + ); + + reg [7:0] mem[0:1023]; + always @(posedge clk) begin + dout2 <= mem[a2]; + dout1 <= mem[a1]; + if (we == 1'b1 && ce == 1'b1) + mem[a1] <= din; + end +endmodule + +module ram16k ( + input wire clk, + input wire ce, + input wire [13:0] a, + input wire [7:0] din, + output reg [7:0] dout, + input wire we + ); + + reg [7:0] mem[0:16383]; + always @(posedge clk) begin + dout <= mem[a]; + if (we == 1'b1 && ce == 1'b1) + mem[a] <= din; + end +endmodule + +module ram32k ( + input wire clk, + input wire ce, + input wire [14:0] a, + input wire [7:0] din, + output reg [7:0] dout, + input wire we + ); + + reg [7:0] mem[0:32767]; + always @(posedge clk) begin + dout <= mem[a]; + if (we == 1'b1 && ce == 1'b1) + mem[a] <= din; + end +endmodule diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/scandoubler.v b/Jupiter Cantab - JupiterACE_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..5a3ccd17 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/scandoubler.v @@ -0,0 +1,195 @@ +// +// 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 + +`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 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 +); + + +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/Jupiter Cantab - JupiterACE_MiST/rtl/sigma_delta_dac.v b/Jupiter Cantab - JupiterACE_MiST/rtl/sigma_delta_dac.v new file mode 100644 index 00000000..29daea6e --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/sigma_delta_dac.v @@ -0,0 +1,33 @@ +// +// PWM DAC +// +// MSBI is the highest bit number. NOT amount of bits! +// +module sigma_delta_dac #(parameter MSBI=0) +( + output reg DACout, //Average Output feeding analog lowpass + input [MSBI:0] DACin, //DAC input (excess 2**MSBI) + input CLK, + input RESET +); + +reg [MSBI+2:0] DeltaAdder; //Output of Delta Adder +reg [MSBI+2:0] SigmaAdder; //Output of Sigma Adder +reg [MSBI+2:0] SigmaLatch; //Latches output of Sigma Adder +reg [MSBI+2:0] DeltaB; //B input of Delta Adder + +always @(*) DeltaB = {SigmaLatch[MSBI+2], SigmaLatch[MSBI+2]} << (MSBI+1); +always @(*) DeltaAdder = DACin + DeltaB; +always @(*) SigmaAdder = DeltaAdder + SigmaLatch; + +always @(posedge CLK or posedge RESET) begin + if(RESET) begin + SigmaLatch <= 1'b1 << (MSBI+1); + DACout <= 1; + end else begin + SigmaLatch <= SigmaAdder; + DACout <= ~SigmaLatch[MSBI+2]; + end +end + +endmodule diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/sram.v b/Jupiter Cantab - JupiterACE_MiST/rtl/sram.v new file mode 100644 index 00000000..f428097a --- /dev/null +++ b/Jupiter Cantab - JupiterACE_MiST/rtl/sram.v @@ -0,0 +1,286 @@ +// +// sram.v +// +// Static RAM controller implementation using SDRAM MT48LC16M16A2 +// +// Copyright (c) 2015 Sorgelig +// +// Some parts of SDRAM code used from project: +// http://hamsterworks.co.nz/mediawiki/index.php/Simple_SDRAM_Controller +// +// 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 . +// + +module sram ( + + // interface to the MT48LC16M16 chip + inout reg [15:0] SDRAM_DQ, // 16 bit bidirectional data bus + output reg [12:0] SDRAM_A, // 13 bit multiplexed address bus + output reg SDRAM_DQML, // two byte masks + output reg SDRAM_DQMH, // + output reg [1:0] SDRAM_BA, // two banks + output SDRAM_nCS, // a single chip select + output SDRAM_nWE, // write enable + output SDRAM_nRAS, // row address select + output SDRAM_nCAS, // columns address select + output SDRAM_CKE, // clock enable + + // cpu/chipset interface + input init, // reset to initialize RAM + input clk_sdram, + + input [24:0] addr, // 25 bit address + + output reg [7:0] dout, // data output to cpu + input [7:0] din, // data input from cpu + input we, // cpu requests write + input rd, // cpu requests read + output reg ready +); + +assign SDRAM_nCS = command[3]; +assign SDRAM_nRAS = command[2]; +assign SDRAM_nCAS = command[1]; +assign SDRAM_nWE = command[0]; +assign SDRAM_CKE = cke; + + +// no burst configured +localparam BURST_LENGTH = 3'b000; // 000=1, 001=2, 010=4, 011=8 +localparam ACCESS_TYPE = 1'b0; // 0=sequential, 1=interleaved +localparam CAS_LATENCY = 3'd3; // 2 for < 100MHz, 3 for >100MHz +localparam OP_MODE = 2'b00; // only 00 (standard operation) allowed +localparam NO_WRITE_BURST = 1'b1; // 0= write burst enabled, 1=only single access write + +localparam MODE = { 3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, BURST_LENGTH}; + +parameter sdram_startup_cycles = 14'd10100; // -- 100us, plus a little more, @ 100MHz +parameter cycles_per_refresh = 14'd1524; // (64000*100)/4196-1 Calc'd as (64ms @ 100MHz)/ 4196 rose +parameter startup_refresh_max = 14'b11111111111111; + +reg [13:0] startup_refresh_count = startup_refresh_max-sdram_startup_cycles; +wire pending_refresh = |startup_refresh_count[13:11]; +wire forcing_refresh = |startup_refresh_count[13:12]; + +localparam STATE_STARTUP = 0; +localparam STATE_OPEN_1 = 1; +localparam STATE_OPEN_2 = 2; +localparam STATE_WRITE = 3; +localparam STATE_READ = 4; +localparam STATE_IDLE = 5; +localparam STATE_IDLE_1 = 6; +localparam STATE_IDLE_2 = 7; +localparam STATE_IDLE_3 = 8; +localparam STATE_IDLE_4 = 9; +localparam STATE_IDLE_5 = 10; +localparam STATE_IDLE_6 = 11; +localparam STATE_IDLE_7 = 12; +localparam STATE_IDLE_8 = 13; + +// SDRAM commands +localparam CMD_INHIBIT = 4'b1111; +localparam CMD_NOP = 4'b0111; +localparam CMD_ACTIVE = 4'b0011; +localparam CMD_READ = 4'b0101; +localparam CMD_WRITE = 4'b0100; +localparam CMD_BURST_TERMINATE = 4'b0110; +localparam CMD_PRECHARGE = 4'b0010; +localparam CMD_AUTO_REFRESH = 4'b0001; +localparam CMD_LOAD_MODE = 4'b0000; + +reg [4:0] state = STATE_STARTUP; +reg [3:0] command = CMD_INHIBIT; +reg cke = 0; + +parameter data_ready_delay_high = CAS_LATENCY+1; +reg [data_ready_delay_high:0] data_ready_delay; + +always @(posedge clk_sdram) begin + reg old_we, old_rd, new_we, new_rd; + + reg [7:0] new_data; + reg [24:0] save_addr; + reg save_we; + reg save_addr0; + reg avail; + + command <= CMD_NOP; + + startup_refresh_count <= startup_refresh_count+1'b1; + + if(data_ready_delay[0]) begin + dout <= save_addr0 ? SDRAM_DQ[15:8] : SDRAM_DQ[7:0]; + avail <= 1; + ready <= 1; + end + + data_ready_delay <= {1'b0, data_ready_delay[data_ready_delay_high:1]}; + + case(state) + STATE_STARTUP: begin + //------------------------------------------------------------------------ + //-- This is the initial startup state, where we wait for at least 100us + //-- before starting the start sequence + //-- + //-- The initialisation is sequence is + //-- * de-assert SDRAM_CKE + //-- * 100us wait, + //-- * assert SDRAM_CKE + //-- * wait at least one cycle, + //-- * PRECHARGE + //-- * wait 2 cycles + //-- * REFRESH, + //-- * tREF wait + //-- * REFRESH, + //-- * tREF wait + //-- * LOAD_MODE_REG + //-- * 2 cycles wait + //------------------------------------------------------------------------ + cke <= 1; + SDRAM_DQ <= 16'bZZZZZZZZZZZZZZZZ; + SDRAM_DQML <= 1; + SDRAM_DQMH <= 1; + SDRAM_A <= 0; + SDRAM_BA <= 0; + + // All the commands during the startup are NOPS, except these + if(startup_refresh_count == startup_refresh_max-31) begin + // ensure all rows are closed + command <= CMD_PRECHARGE; + SDRAM_A[10] <= 1; // all banks + SDRAM_BA <= 2'b00; + end else if (startup_refresh_count == startup_refresh_max-23) begin + // these refreshes need to be at least tREF (66ns) apart + command <= CMD_AUTO_REFRESH; + end else if (startup_refresh_count == startup_refresh_max-15) + command <= CMD_AUTO_REFRESH; + else if (startup_refresh_count == startup_refresh_max-7) begin + // Now load the mode register + command <= CMD_LOAD_MODE; + SDRAM_A <= MODE; + end + + //------------------------------------------------------ + //-- if startup is complete then go into idle mode, + //-- get prepared to accept a new command, and schedule + //-- the first refresh cycle + //------------------------------------------------------ + if(!startup_refresh_count) begin + state <= STATE_IDLE; + avail <= 1; + ready <= 1; + startup_refresh_count <= 14'd2048 - cycles_per_refresh + 1'd1; + end + end + + STATE_IDLE_8: state <= STATE_IDLE_7; + STATE_IDLE_7: state <= STATE_IDLE_6; + STATE_IDLE_6: state <= STATE_IDLE_5; + STATE_IDLE_5: state <= STATE_IDLE_4; + STATE_IDLE_4: state <= STATE_IDLE_3; + STATE_IDLE_3: state <= STATE_IDLE_2; + STATE_IDLE_2: state <= STATE_IDLE_1; + STATE_IDLE_1: begin + SDRAM_DQ <= 16'bZZZZZZZZZZZZZZZZ; + state <= STATE_IDLE; + if(pending_refresh) begin + //------------------------------------------------------------------------ + //-- Start the refresh cycle. + //-- This tasks tRFC (66ns), so 6 idle cycles are needed @ 100MHz + //------------------------------------------------------------------------ + state <= STATE_IDLE_8; + command <= CMD_AUTO_REFRESH; + startup_refresh_count <= startup_refresh_count - cycles_per_refresh + 1'd1; + end + end + + STATE_IDLE: begin + // Priority is to issue a refresh if one is outstanding + if(forcing_refresh) state <= STATE_IDLE_1; + else if(avail & (new_rd | new_we)) begin + save_addr<= addr; + save_we <= new_we; + avail <= 0; + new_we <= 0; + new_rd <= 0; + state <= STATE_OPEN_1; + command <= CMD_ACTIVE; + SDRAM_A <= addr[22:10]; + SDRAM_BA <= addr[24:23]; + end + + SDRAM_DQML <= 1; + SDRAM_DQMH <= 1; + end + + //-------------------------------------------- + //-- Opening the row ready for reads or writes + //-------------------------------------------- + // ACTIVE-to-READ or WRITE delay >20ns (-75) + STATE_OPEN_1: state <= STATE_OPEN_2; + STATE_OPEN_2: begin + SDRAM_A <= {4'b0010, save_addr[9:1]}; + SDRAM_DQML <= save_addr[0]; + SDRAM_DQMH <= ~save_addr[0]; + state <= (save_we) ? STATE_WRITE : STATE_READ; + end + + //---------------------------------- + //-- Processing the read transaction + //---------------------------------- + STATE_READ: begin + state <= STATE_IDLE_5; + command <= CMD_READ; + SDRAM_DQ <= 16'bZZZZZZZZZZZZZZZZ; + + // Schedule reading the data values off the bus + data_ready_delay[data_ready_delay_high] <= 1; + save_addr0 <= save_addr[0]; + end + + //------------------------------------------------------------------ + // -- Processing the write transaction + //------------------------------------------------------------------- + STATE_WRITE: begin + state <= STATE_IDLE_5; + command <= CMD_WRITE; + SDRAM_DQ <= {new_data, new_data}; + avail <= 1; + ready <= 1; + end + + //------------------------------------------------------------------- + //-- We should never get here, but if we do then reset the memory + //------------------------------------------------------------------- + default: begin + state <= STATE_STARTUP; + avail <= 0; + startup_refresh_count <= startup_refresh_max-sdram_startup_cycles; + end + endcase + + if(init) begin // Sync reset + state <= STATE_STARTUP; + avail <= 0; + startup_refresh_count <= startup_refresh_max-sdram_startup_cycles; + end + + old_we <= we; + if(we & ~old_we) {ready, new_we, new_data} <= {1'b0, 1'b1, din}; + + old_rd <= rd; + if(rd & ~old_rd) {ready, new_rd} <= {1'b0, 1'b1}; +end + +endmodule diff --git a/Jupiter Cantab - JupiterACE_MiST/rtl/video_mixer.sv b/Jupiter Cantab - JupiterACE_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..ec953e53 --- /dev/null +++ b/Jupiter Cantab - JupiterACE_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'd7, + 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/Jupiter Cantab - JupiterACE_MiST/snapshot/ace.rbf b/Jupiter Cantab - JupiterACE_MiST/snapshot/ace.rbf new file mode 100644 index 00000000..5a2c2c34 Binary files /dev/null and b/Jupiter Cantab - JupiterACE_MiST/snapshot/ace.rbf differ diff --git a/Nintendo - Gameboy_Mist/Release/gb.rbf b/Nintendo - Gameboy_Mist/Release/gb.rbf new file mode 100644 index 00000000..ae8fab57 Binary files /dev/null and b/Nintendo - Gameboy_Mist/Release/gb.rbf differ diff --git a/Nintendo - Gameboy_Mist/clean.bat b/Nintendo - Gameboy_Mist/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Nintendo - Gameboy_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/Nintendo - Gameboy_Mist/gb.qpf b/Nintendo - Gameboy_Mist/gb.qpf new file mode 100644 index 00000000..ed107778 --- /dev/null +++ b/Nintendo - Gameboy_Mist/gb.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2010 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 +# Version 10.1 Build 153 11/29/2010 SJ Full Version +# Date created = 11:11:11 June 13, 2011 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "10.1" +DATE = "11:11:11 June 13, 2011" + +# Revisions + +PROJECT_REVISION = "gb" diff --git a/Nintendo - Gameboy_Mist/gb.qsf b/Nintendo - Gameboy_Mist/gb.qsf new file mode 100644 index 00000000..5c3cfa1d --- /dev/null +++ b/Nintendo - Gameboy_Mist/gb.qsf @@ -0,0 +1,191 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2011 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 +# Version 11.0 Build 157 04/27/2011 SJ Full Version +# Date created = 17:14:01 April 10, 2012 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# led_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. +# +# -------------------------------------------------------------------------- # + + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name TOP_LEVEL_ENTITY gb_mist +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files + +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 11.0 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "17:14:01 APRIL 10, 2012" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PACKAGE "ANY QFP" +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED" +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 +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" + +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_22 -to CLOCK_50[0] +set_location_assignment PIN_23 -to CLOCK_50[1] +set_location_assignment PIN_128 -to CLOCK_32[0] +set_location_assignment PIN_129 -to CLOCK_32[1] +set_location_assignment PIN_54 -to CLOCK_27[0] +set_location_assignment PIN_55 -to CLOCK_27[1] +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_46 -to UART_TX +set_location_assignment PIN_31 -to UART_RX +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_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 + +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_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp +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" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON +set_global_assignment -name FITTER_EFFORT "FAST FIT" +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)" +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_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_* +set_global_assignment -name VERILOG_INPUT_VERSION SYSTEMVERILOG_2005 +set_global_assignment -name VERILOG_SHOW_LMF_MAPPING_MESSAGES OFF +set_global_assignment -name SYSTEMVERILOG_FILE rtl/gb_mist.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/gb.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/lcd.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/sprites.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/sprite_sort.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/sprite.sv +set_global_assignment -name VHDL_FILE rtl/gbc_snd.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/timer.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/zpram.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/vram.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/iram.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/video_mixer.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/scandoubler.sv +set_global_assignment -name VERILOG_FILE rtl/pll.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/osd.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/mist_io.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/keyboard.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/hq2x.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/data_io.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/dac.sv +set_global_assignment -name VHDL_FILE rtl/BROM.vhd +set_global_assignment -name VHDL_FILE rtl/t80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/t80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/t80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/t80/T80_ALU.vhd +set_global_assignment -name VHDL_FILE rtl/t80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/t80/GBse.vhd +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Nintendo - Gameboy_Mist/readme.txt b/Nintendo - Gameboy_Mist/readme.txt new file mode 100644 index 00000000..f8c9535e --- /dev/null +++ b/Nintendo - Gameboy_Mist/readme.txt @@ -0,0 +1,43 @@ +--------------------------------------------------------------------------------- +-- +-- Gameboy Core for MiST by Till Harbaum +-- Changed by Gehstock +-- 19 December 2017 +-- +--------------------------------------------------------------------------------- + +-- This is source code of a gameboy implementation for the MIST. + + + +-- It's based on the [t80](http://opencores.com/project,t80) CPU core. + +-- A minor +fix was needed for the "LD ($FF00+C)" instruction. + + + +-- The audio implementation has been taken from the PACE framework. + +-- The +original file is available in the [pacedev svn] +-- (https://svn.pacedev.net/repos/pace/sw/src/component/sound/gb/gbc_snd.vhd). + + +--------------------------------------------------------------------------------- +-- +-- +-- Keyboard inputs : +-- +-- ESC: : Start +-- TAB: : Select +-- SPACE : Button A +-- LALT : Button B +-- ARROW KEYS : Movements +-- +-- Joystick support. +-- +--------------------------------------------------------------------------------- + +ToDo: Mappers + diff --git a/Nintendo - Gameboy_Mist/rtl/BROM.vhd b/Nintendo - Gameboy_Mist/rtl/BROM.vhd new file mode 100644 index 00000000..ae9ac80b --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/BROM.vhd @@ -0,0 +1,56 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity BROM is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of BROM is + type ROM_ARRAY is array(0 to 255) of std_logic_vector(7 downto 0); + signal ROM : ROM_ARRAY := ( + x"31",x"FE",x"FF",x"AF",x"21",x"FF",x"9F",x"32", -- 0x0000 + x"CB",x"7C",x"20",x"FB",x"21",x"26",x"FF",x"0E", -- 0x0008 + x"11",x"3E",x"80",x"32",x"E2",x"0C",x"3E",x"F3", -- 0x0010 + x"E2",x"32",x"3E",x"77",x"77",x"3E",x"FC",x"E0", -- 0x0018 + x"47",x"F0",x"50",x"FE",x"42",x"28",x"75",x"11", -- 0x0020 + x"04",x"01",x"21",x"10",x"80",x"1A",x"4F",x"CD", -- 0x0028 + x"A0",x"00",x"CD",x"A0",x"00",x"13",x"7B",x"FE", -- 0x0030 + x"34",x"20",x"F2",x"11",x"B2",x"00",x"06",x"08", -- 0x0038 + x"1A",x"22",x"22",x"13",x"05",x"20",x"F9",x"3E", -- 0x0040 + x"19",x"EA",x"10",x"99",x"21",x"2F",x"99",x"0E", -- 0x0048 + x"0C",x"3D",x"28",x"08",x"32",x"0D",x"20",x"F9", -- 0x0050 + x"2E",x"0F",x"18",x"F3",x"67",x"3E",x"64",x"57", -- 0x0058 + x"E0",x"42",x"3E",x"91",x"E0",x"40",x"04",x"1E", -- 0x0060 + x"02",x"0E",x"0C",x"F0",x"44",x"FE",x"90",x"20", -- 0x0068 + x"FA",x"0D",x"20",x"F7",x"1D",x"20",x"F2",x"0E", -- 0x0070 + x"13",x"24",x"7C",x"1E",x"83",x"FE",x"62",x"28", -- 0x0078 + x"06",x"1E",x"C1",x"FE",x"64",x"20",x"06",x"7B", -- 0x0080 + x"E2",x"0C",x"3E",x"87",x"E2",x"F0",x"42",x"90", -- 0x0088 + x"E0",x"42",x"15",x"20",x"D2",x"05",x"20",x"64", -- 0x0090 + x"16",x"20",x"18",x"CB",x"E0",x"40",x"18",x"5C", -- 0x0098 + x"06",x"04",x"C5",x"CB",x"11",x"17",x"C1",x"CB", -- 0x00A0 + x"11",x"17",x"05",x"20",x"F5",x"22",x"22",x"22", -- 0x00A8 + x"22",x"C9",x"3C",x"42",x"A5",x"81",x"A5",x"99", -- 0x00B0 + x"42",x"3C",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x00B8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x00C0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x00C8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x00D0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x00D8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x00E0 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x00E8 + x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x00F0 + x"FF",x"FF",x"FF",x"FF",x"3E",x"01",x"E0",x"50" -- 0x00F8 + ); + +begin +process(clk) +begin + if rising_edge(clk) then + data <= ROM (to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Nintendo - Gameboy_Mist/rtl/build_id.sv b/Nintendo - Gameboy_Mist/rtl/build_id.sv new file mode 100644 index 00000000..1d53a3f2 --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/build_id.sv @@ -0,0 +1,2 @@ +`define BUILD_DATE "171221" +`define BUILD_TIME "172231" diff --git a/Nintendo - Gameboy_Mist/rtl/build_id.tcl b/Nintendo - Gameboy_Mist/rtl/build_id.tcl new file mode 100644 index 00000000..be673dac --- /dev/null +++ b/Nintendo - Gameboy_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.sv" + 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/Nintendo - Gameboy_Mist/rtl/dac.sv b/Nintendo - Gameboy_Mist/rtl/dac.sv new file mode 100644 index 00000000..5dea333e --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/dac.sv @@ -0,0 +1,33 @@ +// +// PWM DAC +// +// MSBI is the highest bit number. NOT amount of bits! +// +module dac #(parameter MSBI=15, parameter INV=1'b1) +( + output reg DACout, //Average Output feeding analog lowpass + input [MSBI:0] DACin, //DAC input (excess 2**MSBI) + input CLK, + input RESET +); + +reg [MSBI+2:0] DeltaAdder; //Output of Delta Adder +reg [MSBI+2:0] SigmaAdder; //Output of Sigma Adder +reg [MSBI+2:0] SigmaLatch; //Latches output of Sigma Adder +reg [MSBI+2:0] DeltaB; //B input of Delta Adder + +always @(*) DeltaB = {SigmaLatch[MSBI+2], SigmaLatch[MSBI+2]} << (MSBI+1); +always @(*) DeltaAdder = DACin + DeltaB; +always @(*) SigmaAdder = DeltaAdder + SigmaLatch; + +always @(posedge CLK or posedge RESET) begin + if(RESET) begin + SigmaLatch <= 1'b1 << (MSBI+1); + DACout <= INV; + end else begin + SigmaLatch <= SigmaAdder; + DACout <= SigmaLatch[MSBI+2] ^ INV; + end +end + +endmodule diff --git a/Nintendo - Gameboy_Mist/rtl/data_io.sv b/Nintendo - Gameboy_Mist/rtl/data_io.sv new file mode 100644 index 00000000..c1a3ffca --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/data_io.sv @@ -0,0 +1,118 @@ +// +// data_io.v +// +// io controller writable ram for the MiST board +// https://github.com/mist-devel +// +// Copyright (c) 2015 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 . +// + +module data_io ( + // io controller spi interface + input sck, + input ss, + input sdi, + + output downloading, // signal indicating an active download + output reg [4:0] index, // menu index used to upload the file + + // external ram interface + input clk, + output reg wr, + output reg [23:0] addr, + output reg [15:0] data +); + +// ********************************************************************************* +// spi client +// ********************************************************************************* + +// this core supports only the display related OSD commands +// of the minimig +reg [14:0] sbuf; +reg [7:0] cmd; +reg [4:0] cnt; +reg rclk; + +reg [23:0] laddr; +reg [15:0] ldata; + +localparam UIO_FILE_TX = 8'h53; +localparam UIO_FILE_TX_DAT = 8'h54; +localparam UIO_FILE_INDEX = 8'h55; + +assign downloading = downloading_reg; +reg downloading_reg = 1'b0; + +// data_io has its own SPI interface to the io controller +always@(posedge sck, posedge ss) begin + if(ss == 1'b1) + cnt <= 5'd0; + else begin + rclk <= 1'b0; + + // don't shift in last bit. It is evaluated directly + // when writing to ram + if(cnt != 23) + sbuf <= { sbuf[13:0], sdi}; + + // count 0-7 8-15 16-23 8-15 16-23 ... + if(cnt < 23) cnt <= cnt + 4'd1; + else cnt <= 4'd8; + + // finished command byte + if(cnt == 7) + cmd <= {sbuf[6:0], sdi}; + + // prepare/end transmission + if((cmd == UIO_FILE_TX) && (cnt == 15)) begin + // prepare + if(sdi) begin + // download rom to address 0 + laddr <= 24'h0 - 24'd1; + downloading_reg <= 1'b1; + end else + downloading_reg <= 1'b0; + end + + // command 0x54: UIO_FILE_TX + if((cmd == UIO_FILE_TX_DAT) && (cnt == 23)) begin + ldata <= {sbuf, sdi}; + laddr <= laddr + 24'd1; + rclk <= 1'b1; + end + + // expose file (menu) index + if((cmd == UIO_FILE_INDEX) && (cnt == 15)) + index <= {sbuf[3:0], sdi}; + end +end + +reg rclkD, rclkD2; +always@(posedge clk) begin + // bring all signals from spi clock domain into local clock domain + rclkD <= rclk; + rclkD2 <= rclkD; + wr <= 1'b0; + + if(rclkD && !rclkD2) begin + addr <= laddr; + data <= ldata; + wr <= 1'b1; + end +end + +endmodule diff --git a/Nintendo - Gameboy_Mist/rtl/gb.sv b/Nintendo - Gameboy_Mist/rtl/gb.sv new file mode 100644 index 00000000..e31a9936 --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/gb.sv @@ -0,0 +1,359 @@ +// +// gb.v +// +// Gameboy for the MIST board https://github.com/mist-devel +// +// Copyright (c) 2015 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 . +// + +module gb ( + input reset, + input clk, + + input fast_boot, + input [7:0] joystick, + + // cartridge interface + // can adress up to 1MB ROM + output [15:0] cart_addr, + output cart_rd, + output cart_wr, + input [7:0] cart_do, + output [7:0] cart_di, + + // audio + output [15:0] audio_l, + output [15:0] audio_r, + + // lcd interface + output lcd_clkena, + output [1:0] lcd_data, + output [1:0] lcd_mode, + output lcd_on +); + +// include cpu +wire [15:0] cpu_addr; +wire [7:0] cpu_do; + +wire sel_timer = (cpu_addr[15:4] == 12'hff0) && (cpu_addr[3:2] == 2'b01); +wire sel_video_reg = cpu_addr[15:4] == 12'hff4; +wire sel_video_oam = cpu_addr[15:8] == 8'hfe; +wire sel_joy = cpu_addr == 16'hff00; // joystick controller +wire sel_rom = !cpu_addr[15]; // lower 32k are rom +wire sel_cram = cpu_addr[15:13] == 3'b101; // 8k cart ram at $a000 +wire sel_vram = cpu_addr[15:13] == 3'b100; // 8k video ram at $8000 +wire sel_ie = cpu_addr == 16'hffff; // interupt enable +wire sel_if = cpu_addr == 16'hff0f; // interupt flag +wire sel_iram = (cpu_addr[15:14] == 2'b11) && (cpu_addr[15:8] != 8'hff); // 8k internal ram at $c000 +wire sel_zpram = (cpu_addr[15:7] == 9'b111111111) && // 127 bytes zero pageram at $ff80 + (cpu_addr != 16'hffff); +wire sel_audio = (cpu_addr[15:8] == 8'hff) && // audio reg ff10 - ff3f + ((cpu_addr[7:5] == 3'b001) || (cpu_addr[7:4] == 4'b0001)); + +// the boot roms sees a special $42 flag in $ff50 if it's supposed to to a fast boot +wire sel_fast = fast_boot && cpu_addr == 16'hff50 && boot_rom_enabled; + +// http://gameboy.mongenel.com/dmg/asmmemmap.html +wire [7:0] cpu_di = + irq_ack?irq_vec: + sel_fast?8'h42: // fast boot flag + sel_joy?joy_do: // joystick register + sel_timer?timer_do: // timer registers + sel_video_reg?video_do: // video registers + sel_video_oam?video_do: // video object attribute memory + sel_audio?audio_do: // audio registers + sel_rom?rom_do: // boot rom + cartridge rom + sel_cram?rom_do: // cartridge ram + sel_vram?vram_do: // vram + sel_zpram?zpram_do: // zero page ram + sel_iram?iram_do: // internal ram + sel_ie?{3'b000, ie_r}: // interrupt enable register + sel_if?{3'b000, if_r}: // interrupt flag register + 8'hff; + +wire cpu_wr_n; +wire cpu_rd_n; +wire cpu_iorq_n; +wire cpu_m1_n; +wire cpu_mreq_n; + +GBse cpu ( + .RESET_n ( !reset ), + .CLK_n ( clk ), + .CLKEN ( 1'b1 ), + .WAIT_n ( 1'b1 ), + .INT_n ( irq_n ), + .NMI_n ( 1'b1 ), + .BUSRQ_n ( 1'b1 ), + .M1_n ( cpu_m1_n ), + .MREQ_n ( cpu_mreq_n ), + .IORQ_n ( cpu_iorq_n ), + .RD_n ( cpu_rd_n ), + .WR_n ( cpu_wr_n ), + .RFSH_n ( ), + .HALT_n ( ), + .BUSAK_n ( ), + .A ( cpu_addr ), + .DI ( cpu_di ), + .DO ( cpu_do ) +); + +// -------------------------------------------------------------------- +// ------------------------------ audio ------------------------------- +// -------------------------------------------------------------------- + +wire audio_rd = !cpu_rd_n && sel_audio; +wire audio_wr = !cpu_wr_n && sel_audio; +wire [7:0] audio_do; + +gbc_snd audio ( + .clk ( clk ), + .reset ( reset ), + + .s1_read ( audio_rd ), + .s1_write ( audio_wr ), + .s1_addr ( cpu_addr[5:0] ), + .s1_readdata ( audio_do ), + .s1_writedata ( cpu_do ), + + .snd_left ( audio_l ), + .snd_right ( audio_r ) +); + +// -------------------------------------------------------------------- +// ------------------------------ inputs ------------------------------ +// -------------------------------------------------------------------- + +wire [3:0] joy_p4 = { !joystick[2], !joystick[3], !joystick[1], !joystick[0] }; +wire [3:0] joy_p5 = { !joystick[7], !joystick[6], !joystick[5], !joystick[4] }; +reg [1:0] p54; + +always @(posedge clk) begin + if(reset) + p54 <= 2'b11; + else if(sel_joy && !cpu_wr_n) + p54 <= cpu_do[5:4]; +end + +wire [7:0] joy_do = { 2'b11, p54, + ((!p54[0])?joy_p4:4'hf) & ((!p54[1])?joy_p5:4'hf) }; + +// -------------------------------------------------------------------- +// ---------------------------- interrupts ---------------------------- +// -------------------------------------------------------------------- + +// interrupt flags are set when the event happens or when the cpu writes +// the register to 1. The "highest" one active is cleared when the cpu +// runs an interrupt ack cycle or when it writes a 0 to the register + +wire irq_ack = !cpu_iorq_n && !cpu_m1_n; + +// latch irq vector at the begin of the irq ack +reg [7:0] irq_vec; +always @(posedge irq_ack) + irq_vec <= + if_r[0]?8'h40: // vsync + if_r[1]?8'h48: // lcdc + if_r[2]?8'h50: // timer + if_r[3]?8'h58: // serial + if_r[4]?8'h60: // input + 8'h55; + +wire vs = (lcd_mode == 2'b01); +reg vsD, vsD2; +reg [3:0] inputD, inputD2; + +// irq is low when an enable irq is active +wire irq_n = !(ie_r & if_r); + +reg [4:0] if_r; +reg [4:0] ie_r; // writing $ffff sets the irq enable mask +always @(posedge clk) begin + if(reset) begin + ie_r <= 5'h00; + if_r <= 5'h00; + end + + // rising edge on vs + vsD <= vs; + vsD2 <= vsD; + if(vsD && !vsD2) if_r[0] <= 1'b1; + + // video irq already is a 1 clock event + if(video_irq) if_r[1] <= 1'b1; + + // timer_irq already is a 1 clock event + if(timer_irq) if_r[2] <= 1'b1; + + // falling edge on any input line P10..P13 + inputD <= joy_p4 | joy_p5; + inputD2 <= inputD; + if(~inputD & inputD2) if_r[4] <= 1'b1; + + // cpu acknowledges irq. this clears the active irq with hte + // highest priority + if(irq_ack) begin + if(if_r[0] && ie_r[0]) if_r[0] <= 1'b0; + else if(if_r[1] && ie_r[1]) if_r[1] <= 1'b0; + else if(if_r[2] && ie_r[2]) if_r[2] <= 1'b0; + else if(if_r[3] && ie_r[3]) if_r[3] <= 1'b0; + else if(if_r[4] && ie_r[4]) if_r[4] <= 1'b0; + end + + // cpu writes interrupt enable register + if(sel_ie && !cpu_wr_n) + ie_r <= cpu_do[4:0]; + + // cpu writes interrupt flag register + if(sel_if && !cpu_wr_n) + if_r <= cpu_do[4:0]; +end + +// -------------------------------------------------------------------- +// ------------------------------ timer ------------------------------- +// -------------------------------------------------------------------- + +wire timer_irq; +wire [7:0] timer_do; +timer timer ( + .reset ( reset ), + .clk ( clk ), + + .irq ( timer_irq ), + + .cpu_sel ( sel_timer ), + .cpu_addr ( cpu_addr[1:0] ), + .cpu_wr ( !cpu_wr_n ), + .cpu_di ( cpu_do ), + .cpu_do ( timer_do ) +); + +// -------------------------------------------------------------------- +// ------------------------------ video ------------------------------- +// -------------------------------------------------------------------- + +// cpu tries to read or write the lcd controller registers +wire video_irq; +wire [7:0] video_do; +wire [12:0] video_addr; +wire [15:0] dma_addr; +wire video_rd, dma_rd; +wire [7:0] dma_data = (dma_addr[15:14]==2'b11)?iram_do:cart_do; + +video video ( + .reset ( reset ), + .clk ( clk ), + + .irq ( video_irq ), + + .cpu_sel_reg ( sel_video_reg ), + .cpu_sel_oam ( sel_video_oam ), + .cpu_addr ( cpu_addr[7:0] ), + .cpu_wr ( !cpu_wr_n ), + .cpu_di ( cpu_do ), + .cpu_do ( video_do ), + + .lcd_on ( lcd_on ), + .lcd_clkena ( lcd_clkena ), + .lcd_data ( lcd_data ), + .mode ( lcd_mode ), + + .vram_rd ( video_rd ), + .vram_addr ( video_addr ), + .vram_data ( vram_do ), + + .dma_rd ( dma_rd ), + .dma_addr ( dma_addr ), + .dma_data ( dma_data ) +); + +// total 8k vram from $8000 to $9fff +wire cpu_wr_vram = sel_vram && !cpu_wr_n; +wire [7:0] vram_do; +wire vram_wren = video_rd?1'b0:cpu_wr_vram; +wire [12:0] vram_addr = video_rd?video_addr:cpu_addr[12:0]; + +vram vram ( + .clock ( clk ), + .address ( vram_addr ), + .wren ( vram_wren ), + .data ( cpu_do ), + .q ( vram_do ) +); + +// -------------------------------------------------------------------- +// -------------------------- zero page ram --------------------------- +// -------------------------------------------------------------------- + +// 127 bytes internal zero page ram from $ff80 to $fffe +wire cpu_wr_zpram = sel_zpram && !cpu_wr_n; +wire [7:0] zpram_do; +zpram zpram ( + .clock ( clk ), + .address ( cpu_addr[6:0] ), + .wren ( cpu_wr_zpram ), + .data ( cpu_do ), + .q ( zpram_do ) +); + +// -------------------------------------------------------------------- +// ------------------------- 8k internal ram -------------------------- +// -------------------------------------------------------------------- + +wire iram_wren = dma_rd?1'b0:cpu_wr_iram; +wire [12:0] iram_addr = dma_rd?dma_addr[12:0]:cpu_addr[12:0]; + +wire cpu_wr_iram = sel_iram && !cpu_wr_n; +wire [7:0] iram_do; +iram iram ( + .clock ( clk ), + .address ( iram_addr[12:0]), + .wren ( iram_wren ), + .data ( cpu_do ), + .q ( iram_do ) +); + +// -------------------------------------------------------------------- +// ------------------------ internal boot rom ------------------------- +// -------------------------------------------------------------------- + +// writing 01 to $ff50 disables the internal rom +reg boot_rom_enabled; +always @(posedge clk) begin + if(reset) + boot_rom_enabled <= 1'b1; + else if((cpu_addr == 16'hff50) && !cpu_wr_n && cpu_do[0]) + boot_rom_enabled <= 1'b0; +end + +// combine boot rom data with cartridge data +wire [7:0] rom_do = ((cpu_addr[14:8] == 7'h00) && boot_rom_enabled)?boot_rom_do:cart_do; + +assign cart_di = cpu_do; +assign cart_addr = dma_rd?dma_addr:cpu_addr; +assign cart_rd = dma_rd || ((sel_rom || sel_cram) && !cpu_rd_n); +assign cart_wr = (sel_rom || sel_cram) && !cpu_wr_n; + +wire [7:0] boot_rom_do; +BROM BROM ( + .addr ( cpu_addr[7:0] ), + .clk ( clk ), + .data ( boot_rom_do ) +); + + +endmodule diff --git a/Nintendo - Gameboy_Mist/rtl/gb_mist.sv b/Nintendo - Gameboy_Mist/rtl/gb_mist.sv new file mode 100644 index 00000000..b24049f3 --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/gb_mist.sv @@ -0,0 +1,439 @@ +// +// gb_mist.v +// +// Gameboy for the MIST board https://github.com/mist-devel +// +// Copyright (c) 2015 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 . +// + +module gb_mist ( + input [1:0] CLOCK_27, + + output LED, + + // SPI interface to arm io controller + output SPI_DO, + input SPI_DI, + input SPI_SCK, + input SPI_SS2, + input SPI_SS3, + input SPI_SS4, + input CONF_DATA0, + + // SDRAM interface + inout [15:0] SDRAM_DQ, // SDRAM Data bus 16 Bits + output [12:0] SDRAM_A, // SDRAM Address bus 13 Bits + output SDRAM_DQML, // SDRAM Low-byte Data Mask + output SDRAM_DQMH, // SDRAM High-byte Data Mask + output SDRAM_nWE, // SDRAM Write Enable + output SDRAM_nCAS, // SDRAM Column Address Strobe + output SDRAM_nRAS, // SDRAM Row Address Strobe + output SDRAM_nCS, // SDRAM Chip Select + output [1:0] SDRAM_BA, // SDRAM Bank Address + output SDRAM_CLK, // SDRAM Clock + output SDRAM_CKE, // SDRAM Clock Enable + + // audio + output AUDIO_L, + output AUDIO_R, + + // video + output VGA_HS, + output VGA_VS, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B +); + +assign LED = !dio_download; + +`include "rtl/build_id.sv" +localparam CONF_STR = { + "GAMEBOY;GBCSGB;", + "F,GB;", + "O12,LCD ,white,yellow,invert;", + "O3,Boot,Normal,Fast;", + "O45,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "O6,Mapper,Detect,Force MBC1;", + "T7,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire clk32; +reg clk4; // 4.194304 MHz CPU clock and GB pixel clock +reg clk8; // 8.388608 MHz VGA pixel clock +reg clk16; // 16.777216 MHz +wire pll_locked; +wire reset = (reset_cnt != 0); +reg [9:0] reset_cnt; + +wire [31:0] status; +wire [1:0] buttons, switches; +wire [7:0] kbjoy; +wire [7:0] joy_0, joy_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; +wire hs, vs; +wire [5:0] r,g,b; +wire [15:0] audio_left; +wire [15:0] audio_right; + +wire [7:0] cart_di; // data from cpu to cart +wire [7:0] cart_do = cart_addr[0]?sdram_do[7:0]:sdram_do[15:8]; +wire [15:0] cart_addr; +wire cart_rd; +wire cart_wr; +reg eject = 1'b0; + +wire lcd_clkena; +wire [1:0] lcd_data; +wire [1:0] lcd_mode; +wire lcd_on; +wire invert; +wire color; + +// TODO: ds for cart ram write +wire [1:0] sdram_ds = dio_download?2'b11:{!cart_addr[0], cart_addr[0]}; +wire [15:0] sdram_do; +wire [15:0] sdram_di = dio_download?dio_data:{cart_di, cart_di}; +wire [23:0] sdram_addr = dio_download?dio_addr:{3'b000, mbc_bank, cart_addr[12:1]}; +wire sdram_oe = !dio_download && cart_rd; +wire sdram_we = (dio_download && dio_write) || (!dio_download && cart_ram_wr); +assign SDRAM_CKE = 1'b1; + +wire dio_download; +wire [23:0] dio_addr; +wire [15:0] dio_data; +wire dio_write; + +pll pll ( + .inclk0(CLOCK_27), + .c0(clk32), // 33.557143 MHz + .c1(SDRAM_CLK), // 33.557143 Mhz phase shifted + .locked(pll_locked) + ); + +always @(posedge clk8) + clk4 <= !clk4; + +always @(posedge clk16) + clk8 <= !clk8; + +always @(posedge clk32) + clk16 <= !clk16; + + +always @(posedge clk4) begin + if(status[0] || status[7] || buttons[1] || !pll_locked || dio_download) + reset_cnt <= 10'd1023; + else + if(reset_cnt != 0) + reset_cnt <= reset_cnt - 10'd1; +end + +gb gb ( + .reset ( reset ), + .clk ( clk4 ), + .fast_boot ( status[3] ), + .joystick ( joy0 | joy_1 | kbjoy), + .cart_addr ( cart_addr ), + .cart_rd ( cart_rd ), + .cart_wr ( cart_wr ), + .cart_do ( cart_do ), + .cart_di ( cart_di ), + .audio_l ( audio_left ), + .audio_r ( audio_right ), + .lcd_clkena ( lcd_clkena ), + .lcd_data ( lcd_data ), + .lcd_mode ( lcd_mode ), + .lcd_on ( lcd_on ) +); + +dac dacL( + .CLK ( clk32 ), + .RESET ( reset ), + .DACin ( audio_left[15:1] ), + .DACout ( AUDIO_L ) + ); + +dac dacR( + .CLK ( clk32 ), + .RESET ( reset ), + .DACin ( audio_right[15:1] ), + .DACout ( AUDIO_R ) + ); + +lcd lcd ( + .pclk ( clk8 ), + .clk ( clk4 ), + .tint ( status[2:1] == 1 ? 1 : 0 ), + .inv ( status[2:1] == 2 ? 1 : 0 ), + .clkena ( lcd_clkena), + .data ( lcd_data ), + .mode ( lcd_mode ), // used to detect begin of new lines and frames + .on ( lcd_on ), + .hs ( hs ), + .vs ( vs ), + .r ( r ), + .g ( g ), + .b ( b ) + ); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk32 ), + .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(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joy_0 ), + .joystick_1 (joy_1 ), + .status (status ) + ); + +sdram sdram ( + .sd_data (SDRAM_DQ ), + .sd_addr (SDRAM_A ), + .sd_dqm ({SDRAM_DQMH, SDRAM_DQML} ), + .sd_cs (SDRAM_nCS ), + .sd_ba (SDRAM_BA ), + .sd_we (SDRAM_nWE ), + .sd_ras (SDRAM_nRAS ), + .sd_cas (SDRAM_nCAS ), + .clk (clk32 ), + .clkref (clk4 ), + .init (!pll_locked | eject ), + .din (sdram_di ), + .addr (sdram_addr ), + .ds (sdram_ds ), + .we (sdram_we ), + .oe (sdram_oe ), + .dout (sdram_do ) + ); + +// include ROM download helper +data_io data_io ( + + .sck (SPI_SCK ), + .ss ( SPI_SS2 ), + .sdi ( SPI_DI ), + .downloading ( dio_download ), + .clk ( clk4 ), + .wr ( dio_write ), + .addr ( dio_addr ), + .data ( dio_data ) + ); + +video_mixer #(.LINE_LENGTH(640), .HALF_DEPTH(0)) video_mixer +( + .clk_sys (clk32 ), + .ce_pix (clk16 ), + .ce_pix_actual (clk16 ), + .SPI_SCK (SPI_SCK ), + .SPI_SS3 (SPI_SS3 ), + .SPI_DI (SPI_DI ), + .R (r ), + .G (g ), + .B (b ), + .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(1 ),//(scandoubler_disable), //VGA Only + .scanlines(scandoubler_disable ? 2'b00 : {status[5:4] == 3, status[5:4] == 2}), + .hq2x (status[5:4]==1), + .ypbpr_full (1 ), + .line_start (0 ), + .mono (0 ) + ); + +keyboard keyboard( + .clk(clk32), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +// TODO: RAM bank +// http://fms.komkon.org/GameBoy/Tech/Carts.html + +// 32MB SDRAM memory map using word addresses +// 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 D +// 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 S +// ------------------------------------------------- +// 0 0 0 0 X X X X X X X X X X X X X X X X X X X X X up to 2MB used as ROM +// 0 0 0 1 X X X X X X X X X X X X X X X X X X X X X up to 2MB used as RAM +// 0 0 0 0 R R B B B B B C C C C C C C C C C C C C C MBC1 ROM (R=RAM bank in mode 0) +// 0 0 0 1 0 0 0 0 0 0 R R C C C C C C C C C C C C C MBC1 RAM (R=RAM bank in mode 1) + +// --------------------------------------------------------------- +// ----------------------------- MBC1 ---------------------------- +// --------------------------------------------------------------- + +wire [8:0] mbc1_addr = + (cart_addr[15:14] == 2'b00)?{8'b000000000, cart_addr[13]}: // 16k ROM Bank 0 + (cart_addr[15:14] == 2'b01)?{1'b0, mbc1_rom_bank, cart_addr[13]}: // 16k ROM Bank 1-127 + (cart_addr[15:13] == 3'b101)?{7'b1000000, mbc1_ram_bank}: // 8k RAM Bank 0-3 + 9'd0; + +wire [8:0] mbc2_addr = + (cart_addr[15:14] == 2'b00)?{8'b000000000, cart_addr[13]}: // 16k ROM Bank 0 + (cart_addr[15:14] == 2'b01)?{1'b0, mbc2_rom_bank, cart_addr[13]}: // 16k ROM Bank 1-15 + //todo // 512x4bits RAM, built-in into the MBC2 chip (Read/Write) + 9'd0; + +// -------------------------- RAM banking ------------------------ + +// in mode 0 (16/8 mode) the ram is not banked +// in mode 1 (4/32 mode) four ram banks are used +wire [1:0] mbc1_ram_bank = (mbc1_mode ? mbc1_ram_bank_reg:2'b00) & ram_mask; +wire [1:0] mbc2_ram_bank = (mbc2_mode ? mbc2_ram_bank_reg:2'b00) & ram_mask;//todo +// -------------------------- ROM banking ------------------------ + +// in mode 0 (16/8 mode) the ram bank select signals are the upper rom address lines +// in mode 1 (4/32 mode) the upper two rom address lines are 2'b00 +wire [6:0] mbc1_rom_bank_mode = { mbc1_mode?2'b00:mbc1_ram_bank_reg, mbc1_rom_bank_reg}; +wire [6:0] mbc2_rom_bank_mode = { mbc2_mode?2'b00:mbc2_ram_bank_reg, mbc2_rom_bank_reg};//todo +// mask address lines to enable proper mirroring +wire [6:0] mbc1_rom_bank = mbc1_rom_bank_mode & rom_mask;//128 +wire [6:0] mbc2_rom_bank = mbc2_rom_bank_mode & rom_mask;//16 +// --------------------- CPU register interface ------------------ +reg mbc1_ram_enable; +reg mbc1_mode; +reg [4:0] mbc1_rom_bank_reg; +reg [1:0] mbc1_ram_bank_reg; + +reg mbc2_ram_enable; +reg mbc2_mode; +reg [4:0] mbc2_rom_bank_reg;//todo +reg [1:0] mbc2_ram_bank_reg;//todo + + +// MBC2 todo +always @(posedge clk4) begin + if(reset) begin + mbc1_rom_bank_reg <= 5'd1; + mbc1_ram_bank_reg <= 2'd0; + mbc1_ram_enable <= 1'b0; + mbc1_mode <= 1'b0; + end else begin + if(cart_wr && (cart_addr[15:13] == 3'b000)) + mbc1_ram_enable <= (cart_di[3:0] == 4'ha); + if(cart_wr && (cart_addr[15:13] == 3'b001)) begin + if(cart_di[4:0]==0) mbc1_rom_bank_reg <= 5'd1; + else mbc1_rom_bank_reg <= cart_di[4:0]; + end + if(cart_wr && (cart_addr[15:13] == 3'b010)) + mbc1_ram_bank_reg <= cart_di[1:0]; + if(cart_wr && (cart_addr[15:13] == 3'b011)) + mbc1_mode <= cart_di[0]; + end +// eject <= status[8]; +end + +// extract header fields extracted from cartridge +// during download +reg [7:0] cart_mbc_type; +reg [7:0] cart_rom_size; +reg [7:0] cart_ram_size; +reg [7:0] cgb_flag;//$80 = GBC but GB compatible, $C0 GBC Only, $00 or other = GB +reg [7:0] sgb_flag;//GB/SGB Indicator (00 = GameBoy, 03 = Super GameBoy functions) + //(Super GameBoy functions won't work if <> $03.) + +// only write sdram if the write attept comes from the cart ram area +wire cart_ram_wr = cart_wr && mbc1_ram_enable && (cart_addr[15:13] == 3'b101); + +// RAM size - todo +wire [1:0] ram_mask = // 0 - no ram + (cart_ram_size == 1)?2'b00: // 1 - 2k, 1 bank + (cart_ram_size == 2)?2'b00: // 2 - 8k, 1 bank + 2'b11; // 3 - 32k, 4 banks + // 4 - 128k, ?? banks + // 5 - 64k, ?? banks + +// ROM size +wire [6:0] rom_mask = // 0 - 2 banks, 32k direct mapped + (cart_rom_size == 1)?7'b0000011: // 1 - 4 banks = 64k + (cart_rom_size == 2)?7'b0000111: // 2 - 8 banks = 128k + (cart_rom_size == 3)?7'b0001111: // 3 - 16 banks = 256k + (cart_rom_size == 4)?7'b0011111: // 4 - 32 banks = 512k + (cart_rom_size == 5)?7'b0111111: // 5 - 64 banks = 1M + (cart_rom_size == 6)?7'b1111111: // 6 - 128 banks = 2M +//? (cart_rom_size == 6)?7'b1111111: // 7 - ??? banks = 4M +//? (cart_rom_size == 6)?7'b1111111: // 8 - ??? banks = 8M + (cart_rom_size == 82)?7'b1000111: //$52 - 72 banks = 1.1M + (cart_rom_size == 83)?7'b1001111: //$53 - 80 banks = 1.2M +// (cart_rom_size == 84)?7'b1011111: + 7'b1011111; //$54 - 96 banks = 1.5M + +wire mbc1 = (cart_mbc_type == 1) || (cart_mbc_type == 2) || (cart_mbc_type == 3) || ~status[6]; +wire mbc2 = (cart_mbc_type == 5) || (cart_mbc_type == 6); +wire mmm01 = (cart_mbc_type == 11) || (cart_mbc_type == 12) || (cart_mbc_type == 13) || (cart_mbc_type == 14); +wire mbc3 = (cart_mbc_type == 15) || (cart_mbc_type == 16) || (cart_mbc_type == 17) || (cart_mbc_type == 18) || (cart_mbc_type == 19); +wire mbc4 = (cart_mbc_type == 21) || (cart_mbc_type == 22) || (cart_mbc_type == 23); +wire mbc5 = (cart_mbc_type == 25) || (cart_mbc_type == 26) || (cart_mbc_type == 27) || (cart_mbc_type == 28) || (cart_mbc_type == 29) || (cart_mbc_type == 30); +wire tama5 = (cart_mbc_type == 253); +//wire tama6 = (cart_mbc_type == ???); +wire HuC1 = (cart_mbc_type == 254); +wire HuC3 = (cart_mbc_type == 255); + +wire [8:0] mbc_bank = + mbc1?mbc1_addr: // MBC1, 16k bank 0, 16k bank 1-127 + ram + mbc2?mbc2_addr: // MBC2, 16k bank 0, 16k bank 1-15 + ram +// mbc3?mbc3_addr: +// mbc4?mbc4_addr: +// mbc5?mbc5_addr: +// tama5?tama5_addr: +// HuC1?HuC1_addr: +// HuC3?HuC3_addr: + {7'b0000000, cart_addr[14:13]}; // no MBC, 32k linear address + + +always @(posedge clk4) begin + if(!pll_locked) begin + cart_mbc_type <= 8'h00; + cart_rom_size <= 8'h00; + cart_ram_size <= 8'h00; + end else begin + if(dio_download && dio_write) begin + // cart is stored in 16 bit wide sdram, so addresses are shifted right + case(dio_addr) + 24'h9f: cgb_flag <= dio_data[7:0]; // $143 + 24'ha2: sgb_flag <= dio_data[7:0]; // $146 + 24'ha3: cart_mbc_type <= dio_data[7:0]; // $147 + 24'ha4: { cart_rom_size, cart_ram_size } <= dio_data; // $148/$149 + endcase + end + end +end + + + +endmodule diff --git a/Nintendo - Gameboy_Mist/rtl/gbc_snd.vhd b/Nintendo - Gameboy_Mist/rtl/gbc_snd.vhd new file mode 100644 index 00000000..2a9f8cdf --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/gbc_snd.vhd @@ -0,0 +1,935 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; + + +entity gbc_snd is + generic + ( + CLK_FREQ : integer := 100000000 + ); + port + ( + clk : in std_logic; + reset : in std_logic; + + s1_read : in std_logic; + s1_write : in std_logic; + s1_addr : in std_logic_vector(5 downto 0); + s1_readdata : out std_logic_vector(7 downto 0); + s1_writedata : in std_logic_vector(7 downto 0); + + snd_left : out std_logic_vector(15 downto 0); + snd_right : out std_logic_vector(15 downto 0) + ); + +end gbc_snd; + +architecture SYN of gbc_snd is + + subtype wav_t is std_logic_vector(3 downto 0); + type wav_arr_t is array(0 to 31) of wav_t; + + --constant clk_freq : integer := 100000000; + constant snd_freq : integer := 4194304; + + signal en_snd : boolean; -- Enable at base sound frequency (4.19MHz) + signal en_snd2 : boolean; -- Enable at clk/2 + signal en_snd4 : boolean; -- Enable at clk/4 + signal en_512 : boolean; -- 512Hz enable + + signal en_snden2 : boolean; -- Enable at clk/2 + signal en_snden4 : boolean; -- Enable at clk/4 + + signal en_len : boolean; -- Sample length + signal en_env : boolean; -- Envelope + signal en_sweep : boolean; -- Sweep + + signal snd_enable : std_logic; + + signal sq1_swper : std_logic_vector(2 downto 0); -- Sq1 sweep period + signal sq1_swdir : std_logic; -- Sq1 sweep direction + signal sq1_swshift : std_logic_vector(2 downto 0); -- Sq1 sweep frequency shift + signal sq1_duty : std_logic_vector(1 downto 0); -- Sq1 duty cycle + signal sq1_slen : std_logic_vector(5 downto 0); -- Sq1 play length + signal sq1_svol : std_logic_vector(3 downto 0); -- Sq1 initial volume + signal sq1_envsgn : std_logic; -- Sq1 envelope sign + signal sq1_envper : std_logic_vector(2 downto 0); -- Sq1 envelope period + signal sq1_freq : std_logic_vector(10 downto 0); -- Sq1 frequency + signal sq1_trigger : std_logic; -- Sq1 trigger play note + signal sq1_lenchk : std_logic; -- Sq1 length check enable + + signal sq1_fr2 : std_logic_vector(10 downto 0); -- Sq1 frequency (shadow copy) + signal sq1_vol : std_logic_vector(3 downto 0); -- Sq1 initial volume + signal sq1_playing : std_logic; -- Sq1 channel active + signal sq1_wav : std_logic_vector(5 downto 0); -- Sq1 output waveform + + signal sq2_duty : std_logic_vector(1 downto 0); -- Sq2 duty cycle + signal sq2_slen : std_logic_vector(5 downto 0); -- Sq2 play length + signal sq2_svol : std_logic_vector(3 downto 0); -- Sq2 initial volume + signal sq2_envsgn : std_logic; -- Sq2 envelope sign + signal sq2_envper : std_logic_vector(2 downto 0); -- Sq2 envelope period + signal sq2_freq : std_logic_vector(10 downto 0); -- Sq2 frequency + signal sq2_trigger : std_logic; -- Sq2 trigger play note + signal sq2_lenchk : std_logic; -- Sq2 length check enable + + signal sq2_fr2 : std_logic_vector(10 downto 0); -- Sq2 frequency (shadow copy) + signal sq2_vol : std_logic_vector(3 downto 0); -- Sq2 initial volume + signal sq2_playing : std_logic; -- Sq2 channel active + signal sq2_wav : std_logic_vector(5 downto 0); -- Sq2 output waveform + + signal wav_enable : std_logic; -- Wave enable + signal wav_slen : std_logic_vector(7 downto 0); -- Wave play length + signal wav_volsh : std_logic_vector(1 downto 0); -- Wave volume shift + signal wav_freq : std_logic_vector(10 downto 0); -- Wave frequency + signal wav_trigger : std_logic; -- Wave trigger play note + signal wav_lenchk : std_logic; -- Wave length check enable + + signal wav_fr2 : std_logic_vector(10 downto 0); -- Wave frequency (shadow copy) + signal wav_playing : std_logic; + signal wav_wav : std_logic_vector(5 downto 0); -- Wave output waveform + signal wav_ram : wav_arr_t; -- Wave table + signal wav_shift : boolean; + + signal noi_slen : std_logic_vector(5 downto 0); + signal noi_svol : std_logic_vector(3 downto 0); + signal noi_envsgn : std_logic; + signal noi_envper : std_logic_vector(2 downto 0); + signal noi_freqsh : std_logic_vector(3 downto 0); + signal noi_short : std_logic; + signal noi_div : std_logic_vector(2 downto 0); + signal noi_trigger : std_logic; + signal noi_lenchk : std_logic; + + signal noi_fr2 : std_logic_vector(10 downto 0); -- Noise frequency (shadow copy) + signal noi_vol : std_logic_vector(3 downto 0); -- Noise initial volume + signal noi_playing : std_logic; -- Noise channel active + signal noi_wav : std_logic_vector(5 downto 0); -- Noise output waveform + +begin + + en_snd2 <= en_snd and en_snden2; + en_snd4 <= en_snd and en_snden4; + + en_snd <= true; + + -- Calculate base clock enable (4.194304MHz) +-- process(clk, reset) +-- --to_unsigned(snd_freq * 65536 / clk_freq, 16); + --constant clk_frac : unsigned(15 downto 0) := X"0ABD"; -- clk_freq=100MHz +-- constant clk_frac : unsigned(15 downto 0) := X"1991"; -- clk_freq=42MHz +-- variable divacc : unsigned(15 downto 0); +-- variable acc : unsigned(16 downto 0); +-- begin +-- if reset = '1' then +-- divacc := (others => '0'); +-- elsif rising_edge(clk) then + -- Sound base divider clock enable +-- acc := ('0'&divacc) + ('0'&clk_frac); +-- en_snd <= (acc(16) = '1'); +-- divacc := acc(15 downto 0); +-- end if; +-- end process; + + -- Calculate divided and frame sequencer clock enables + process(clk, en_snd, reset) + variable clkcnt : unsigned(1 downto 0); + variable cnt_512 : unsigned(12 downto 0); + variable temp_512 : unsigned(13 downto 0); + variable framecnt : integer range 0 to 7 := 0; + begin + if reset = '1' then + clkcnt := "00"; + cnt_512 := (others => '0'); + framecnt := 0; + + elsif rising_edge(clk) then + -- Base clock divider + if en_snd then + clkcnt := clkcnt + 1; + if clkcnt(0) = '1' then + en_snden2 <= true; + else + en_snden2 <= false; + end if; + if clkcnt = "11" then + en_snden4 <= true; + else + en_snden4 <= false; + end if; + end if; + + -- Frame sequencer (length, envelope, sweep) clock enables + en_len <= false; + en_env <= false; + en_sweep <= false; + if en_512 then + if framecnt = 0 or framecnt = 2 or framecnt = 4 or framecnt = 6 then + en_len <= true; + end if; + if framecnt = 2 or framecnt = 6 then + en_sweep <= true; + end if; + if framecnt = 7 then + en_env <= true; + end if; + + if framecnt < 7 then + framecnt := framecnt + 1; + else + framecnt := 0; + end if; + end if; + + -- + en_512 <= false; + if en_snd then + temp_512 := ('0'&cnt_512) + to_unsigned(1, temp_512'length); + cnt_512 := temp_512(temp_512'high-1 downto temp_512'low); + en_512 <= (temp_512(13) = '1'); + end if; + end if; + end process; + + -- Registers + registers : process(clk, snd_enable, reset) + variable wav_shift_r : boolean; + variable wav_temp : wav_t; + begin + + -- Registers + if snd_enable = '0' then + -- Reset register values + sq1_swper <= (others => '0'); + sq1_swdir <= '0'; + sq1_swshift <= (others => '0'); + sq1_duty <= (others => '0'); + sq1_slen <= (others => '0'); + sq1_svol <= (others => '0'); + sq1_envsgn <= '0'; + sq1_envper <= (others => '0'); + sq1_freq <= (others => '0'); + sq1_lenchk <= '0'; + sq1_trigger <= '0'; + + sq2_duty <= (others => '0'); + sq2_slen <= (others => '0'); + sq2_svol <= (others => '0'); + sq2_envsgn <= '0'; + sq2_envper <= (others => '0'); + sq2_freq <= (others => '0'); + sq2_lenchk <= '0'; + sq2_trigger <= '0'; + + wav_enable <= '0'; + wav_volsh <= (others => '0'); + wav_freq <= (others => '0'); + wav_trigger <= '0'; + wav_lenchk <= '0'; + wav_shift_r := false; + + noi_slen <= (others => '0'); + noi_svol <= (others => '0'); + noi_envsgn <= '0'; + noi_envper <= (others => '0'); + noi_freqsh <= (others => '0'); + noi_short <= '0'; + noi_div <= (others => '0'); + noi_trigger <= '0'; + noi_lenchk <= '0'; + + elsif rising_edge(clk) then + if en_snd then + sq1_trigger <= '0'; + sq2_trigger <= '0'; + wav_trigger <= '0'; + noi_trigger <= '0'; + end if; + + -- Rotate wave table on rising edge of wav_shift + if wav_shift and not wav_shift_r then + wav_temp := wav_ram(0); + for I in 0 to 30 loop + wav_ram(I) <= wav_ram(I+1); + end loop; + wav_ram(31) <= wav_temp; + end if; + + if s1_write = '1' then + case s1_addr is + -- Square 1 + when "010000" => -- NR10 FF10 -PPP NSSS Sweep period, negate, shift + sq1_swper <= s1_writedata(6 downto 4); + sq1_swdir <= s1_writedata(3); + sq1_swshift <= s1_writedata(2 downto 0); + when "010001" => -- NR11 FF11 DDLL LLLL Duty, Length load (64-L) + sq1_duty <= s1_writedata(7 downto 6); + sq1_slen <= s1_writedata(5 downto 0); + when "010010" => -- NR12 FF12 VVVV APPP Starting volume, Envelope add mode, period + sq1_svol <= s1_writedata(7 downto 4); + sq1_envsgn <= s1_writedata(3); + sq1_envper <= s1_writedata(2 downto 0); + when "010011" => -- NR13 FF13 FFFF FFFF Frequency LSB + sq1_freq(7 downto 0) <= s1_writedata; + when "010100" => -- NR14 FF14 TL-- -FFF Trigger, Length enable, Frequency MSB + sq1_trigger <= s1_writedata(7); + sq1_lenchk <= s1_writedata(6); + sq1_freq(10 downto 8) <= s1_writedata(2 downto 0); + + -- Square 2 + when "010110" => -- NR21 FF16 DDLL LLLL Duty, Length load (64-L) + sq2_duty <= s1_writedata(7 downto 6); + sq2_slen <= s1_writedata(5 downto 0); + when "010111" => -- NR22 FF17 VVVV APPP Starting volume, Envelope add mode, period + sq2_svol <= s1_writedata(7 downto 4); + sq2_envsgn <= s1_writedata(3); + sq2_envper <= s1_writedata(2 downto 0); + when "011000" => -- NR23 FF18 FFFF FFFF Frequency LSB + sq2_freq(7 downto 0) <= s1_writedata; + when "011001" => -- NR24 FF19 TL-- -FFF Trigger, Length enable, Frequency MSB + sq2_trigger <= s1_writedata(7); + sq2_lenchk <= s1_writedata(6); + sq2_freq(10 downto 8) <= s1_writedata(2 downto 0); + + -- Wave + when "011010" => -- NR30 FF1A E--- ---- DAC power + wav_enable <= s1_writedata(7); + when "011011" => -- NR31 FF1B LLLL LLLL Length load (256-L) + wav_slen <= s1_writedata; + when "011100" => -- NR32 FF1C -VV- ---- Volume code (00=0%, 01=100%, 10=50%, 11=25%) + wav_volsh <= s1_writedata(6 downto 5); + when "011101" => -- NR33 FF1D FFFF FFFF Frequency LSB + wav_freq(7 downto 0) <= s1_writedata; + when "011110" => -- NR34 FF1E TL-- -FFF Trigger, Length enable, Frequency MSB + wav_trigger <= s1_writedata(7); + wav_lenchk <= s1_writedata(6); + wav_freq(10 downto 8) <= s1_writedata(2 downto 0); + + -- Noise + when "100000" => -- NR41 FF20 --LL LLLL Length load (64-L) + noi_slen <= s1_writedata(5 downto 0); + when "100001" => -- NR42 FF21 VVVV APPP Starting volume, Envelope add mode, period + noi_svol <= s1_writedata(7 downto 4); + noi_envsgn <= s1_writedata(3); + noi_envper <= s1_writedata(2 downto 0); + when "100010" => -- NR43 FF22 SSSS WDDD Clock shift, Width mode of LFSR, Divisor code + noi_freqsh <= s1_writedata(7 downto 4); + noi_short <= s1_writedata(3); + noi_div <= s1_writedata(2 downto 0); + when "100011" => -- NR44 FF23 TL-- ---- Trigger, Length enable + noi_trigger <= s1_writedata(7); + noi_lenchk <= s1_writedata(6); + +-- -- Control/Status +-- when "100100" => -- NR50 FF24 ALLL BRRR Vin L enable, Left vol, Vin R enable, Right vol +-- when "100101" => -- NR51 FF25 NW21 NW21 Left enables, Right enables +-- + -- Wave Table + when "110000" => -- FF30 0000 1111 Samples 0 and 1 + wav_ram(0) <= s1_writedata(7 downto 4); + wav_ram(1) <= s1_writedata(3 downto 0); + when "110001" => -- FF31 0000 1111 Samples 2 and 3 + wav_ram(2) <= s1_writedata(7 downto 4); + wav_ram(3) <= s1_writedata(3 downto 0); + when "110010" => -- FF32 0000 1111 Samples 4 and 5 + wav_ram(4) <= s1_writedata(7 downto 4); + wav_ram(5) <= s1_writedata(3 downto 0); + when "110011" => -- FF33 0000 1111 Samples 6 and 31 + wav_ram(6) <= s1_writedata(7 downto 4); + wav_ram(7) <= s1_writedata(3 downto 0); + when "110100" => -- FF34 0000 1111 Samples 8 and 31 + wav_ram(8) <= s1_writedata(7 downto 4); + wav_ram(9) <= s1_writedata(3 downto 0); + when "110101" => -- FF35 0000 1111 Samples 10 and 11 + wav_ram(10) <= s1_writedata(7 downto 4); + wav_ram(11) <= s1_writedata(3 downto 0); + when "110110" => -- FF36 0000 1111 Samples 12 and 13 + wav_ram(12) <= s1_writedata(7 downto 4); + wav_ram(13) <= s1_writedata(3 downto 0); + when "110111" => -- FF37 0000 1111 Samples 14 and 15 + wav_ram(14) <= s1_writedata(7 downto 4); + wav_ram(15) <= s1_writedata(3 downto 0); + when "111000" => -- FF38 0000 1111 Samples 16 and 17 + wav_ram(16) <= s1_writedata(7 downto 4); + wav_ram(17) <= s1_writedata(3 downto 0); + when "111001" => -- FF39 0000 1111 Samples 18 and 19 + wav_ram(18) <= s1_writedata(7 downto 4); + wav_ram(19) <= s1_writedata(3 downto 0); + when "111010" => -- FF3A 0000 1111 Samples 20 and 21 + wav_ram(20) <= s1_writedata(7 downto 4); + wav_ram(21) <= s1_writedata(3 downto 0); + when "111011" => -- FF3B 0000 1111 Samples 22 and 23 + wav_ram(22) <= s1_writedata(7 downto 4); + wav_ram(23) <= s1_writedata(3 downto 0); + when "111100" => -- FF3C 0000 1111 Samples 24 and 25 + wav_ram(24) <= s1_writedata(7 downto 4); + wav_ram(25) <= s1_writedata(3 downto 0); + when "111101" => -- FF3D 0000 1111 Samples 26 and 27 + wav_ram(26) <= s1_writedata(7 downto 4); + wav_ram(27) <= s1_writedata(3 downto 0); + when "111110" => -- FF3E 0000 1111 Samples 28 and 29 + wav_ram(28) <= s1_writedata(7 downto 4); + wav_ram(29) <= s1_writedata(3 downto 0); + when "111111" => -- FF3F 0000 1111 Samples 30 and 31 + wav_ram(30) <= s1_writedata(7 downto 4); + wav_ram(31) <= s1_writedata(3 downto 0); + + when others => + null; + end case; + end if; + + if s1_read = '1' then + case s1_addr is + -- Square 1 + when "010000" => -- NR10 FF10 -PPP NSSS Sweep period, negate, shift + s1_readdata <= '1' & sq1_swper & sq1_swdir & sq1_swshift; + when "010001" => -- NR11 FF11 DDLL LLLL Duty, Length load (64-L) + s1_readdata <= sq1_duty & "111111"; + when "010010" => -- NR12 FF12 VVVV APPP Starting volume, Envelope add mode, period + s1_readdata <= sq1_vol & sq1_envsgn & sq1_envper; + when "010011" => -- NR13 FF13 FFFF FFFF Frequency LSB + s1_readdata <= X"FF"; + when "010100" => -- NR14 FF14 TL-- -FFF Trigger, Length enable, Frequency MSB + s1_readdata <= '0' & sq1_lenchk & "111111"; + + -- Square 2 + when "010110" => -- NR21 FF16 DDLL LLLL Duty, Length load (64-L) + s1_readdata <= sq2_duty & "111111"; + when "010111" => -- NR22 FF17 VVVV APPP Starting volume, Envelope add mode, period + s1_readdata <= sq2_vol & sq2_envsgn & sq2_envper; + when "011000" => -- NR23 FF18 FFFF FFFF Frequency LSB + s1_readdata <= X"FF"; + when "011001" => -- NR24 FF19 TL-- -FFF Trigger, Length enable, Frequency MSB + s1_readdata <= '0' & sq2_lenchk & "111111"; + + when "100110" => -- NR52 FF26 P--- NW21 Power control/status, Channel length statuses + s1_readdata <= snd_enable & "00000" & sq2_playing & sq1_playing; + + -- Wave + when "011010" => -- NR30 FF1A E--- ---- DAC power + s1_readdata <= wav_enable & "1111111"; + when "011011" => -- NR31 FF1B LLLL LLLL Length load (256-L) + s1_readdata <= X"FF"; + when "011100" => -- NR32 FF1C -VV- ---- Volume code (00=0%, 01=100%, 10=50%, 11=25%) + s1_readdata <= '1' & wav_volsh & "11111"; + when "011101" => -- NR33 FF1D FFFF FFFF Frequency LSB + s1_readdata <= X"FF"; + when "011110" => -- NR34 FF1E TL-- -FFF Trigger, Length enable, Frequency MSB + s1_readdata <= wav_trigger & wav_lenchk & "111111"; + + -- Noise + when "100000" => -- NR41 FF20 --LL LLLL Length load (64-L) + s1_readdata <= X"FF"; + when "100001" => -- NR42 FF21 VVVV APPP Starting volume, Envelope add mode, period + s1_readdata <= noi_svol & noi_envsgn & noi_envper; + when "100010" => -- NR43 FF22 SSSS WDDD Clock shift, Width mode of LFSR, Divisor code + s1_readdata <= noi_freqsh & noi_short & noi_div; + when "100011" => -- NR44 FF23 TL-- ---- Trigger, Length enable + s1_readdata <= noi_trigger & noi_lenchk & "111111"; + + -- Wave Table + when "110000" => -- FF30 0000 1111 Samples 0 and 1 + s1_readdata <= wav_ram(0) & wav_ram(1); + when "110001" => -- FF31 0000 1111 Samples 2 and 3 + s1_readdata <= wav_ram(2) & wav_ram(3); + when "110010" => -- FF32 0000 1111 Samples 4 and 5 + s1_readdata <= wav_ram(4) & wav_ram(5); + when "110011" => -- FF33 0000 1111 Samples 6 and 31 + s1_readdata <= wav_ram(6) & wav_ram(7); + when "110100" => -- FF34 0000 1111 Samples 8 and 31 + s1_readdata <= wav_ram(8) & wav_ram(9); + when "110101" => -- FF35 0000 1111 Samples 10 and 11 + s1_readdata <= wav_ram(10) & wav_ram(11); + when "110110" => -- FF36 0000 1111 Samples 12 and 13 + s1_readdata <= wav_ram(12) & wav_ram(13); + when "110111" => -- FF37 0000 1111 Samples 14 and 15 + s1_readdata <= wav_ram(14) & wav_ram(15); + when "111000" => -- FF38 0000 1111 Samples 16 and 17 + s1_readdata <= wav_ram(16) & wav_ram(17); + when "111001" => -- FF39 0000 1111 Samples 18 and 19 + s1_readdata <= wav_ram(18) & wav_ram(19); + when "111010" => -- FF3A 0000 1111 Samples 20 and 21 + s1_readdata <= wav_ram(20) & wav_ram(21); + when "111011" => -- FF3B 0000 1111 Samples 22 and 23 + s1_readdata <= wav_ram(22) & wav_ram(23); + when "111100" => -- FF3C 0000 1111 Samples 24 and 25 + s1_readdata <= wav_ram(24) & wav_ram(25); + when "111101" => -- FF3D 0000 1111 Samples 26 and 27 + s1_readdata <= wav_ram(26) & wav_ram(27); + when "111110" => -- FF3E 0000 1111 Samples 28 and 29 + s1_readdata <= wav_ram(28) & wav_ram(29); + when "111111" => -- FF3F 0000 1111 Samples 30 and 31 + s1_readdata <= wav_ram(30) & wav_ram(31); + + when others => + s1_readdata <= X"FF"; + end case; + + end if; + + wav_shift_r := wav_shift; + end if; + + if reset = '1' then + snd_enable <= '0'; + elsif rising_edge(clk) then + if s1_write = '1' and s1_addr = "100110" then + -- NR52 FF26 P--- NW21 Power control/status, Channel length statuses + snd_enable <= s1_writedata(7); + end if; + end if; + end process; + + sound : process(clk, snd_enable, en_snd, en_len, en_env, en_sweep) + constant duty_0 : std_logic_vector(0 to 7) := "00000001"; + constant duty_1 : std_logic_vector(0 to 7) := "10000001"; + constant duty_2 : std_logic_vector(0 to 7) := "10000111"; + constant duty_3 : std_logic_vector(0 to 7) := "01111110"; + variable sq1_fcnt : unsigned(10 downto 0); + variable sq1_phase : integer range 0 to 7; + variable sq1_len : std_logic_vector(6 downto 0); + variable sq1_envcnt : std_logic_vector(2 downto 0); -- Sq1 envelope timer count + variable sq1_swcnt : std_logic_vector(2 downto 0); -- Sq1 sweep timer count + variable sq1_swoffs : unsigned(11 downto 0); + variable sq1_swfr : unsigned(11 downto 0); + variable sq1_out : std_logic; + + variable sq2_fcnt : unsigned(10 downto 0); + variable sq2_phase : integer range 0 to 7; + variable sq2_len : std_logic_vector(6 downto 0); + variable sq2_envcnt : std_logic_vector(2 downto 0); -- Sq2 envelope timer count + variable sq2_out : std_logic; + + variable wav_fcnt : unsigned(10 downto 0); + variable wav_len : std_logic_vector(8 downto 0); + + variable noi_divisor: unsigned(10 downto 0); -- Noise frequency divisor + variable noi_freq : unsigned(10 downto 0); -- Noise frequency (calculated) + variable noi_fcnt : unsigned(10 downto 0); + variable noi_lfsr : unsigned(15 downto 0); + variable noi_len : std_logic_vector(6 downto 0); + variable noi_envcnt : std_logic_vector(2 downto 0); -- Noise envelope timer count + variable noi_out : std_logic; + + variable acc_fcnt : unsigned(11 downto 0); + begin + -- Sound processing + if snd_enable = '0' then + sq1_playing <= '0'; + sq1_fr2 <= (others => '0'); + sq1_fcnt := (others => '0'); + sq1_phase := 0; + sq1_len := (others => '0'); + sq1_vol <= "0000"; + sq1_envcnt := "000"; + sq1_swcnt := "000"; + sq1_swoffs := (others => '0'); + sq1_swfr := (others => '0'); + sq1_out := '0'; + + sq2_playing <= '0'; + sq2_fr2 <= (others => '0'); + sq2_fcnt := (others => '0'); + sq2_phase := 0; + sq2_len := (others => '0'); + sq2_vol <= "0000"; + sq2_envcnt := "000"; + sq2_out := '0'; + + wav_fcnt := (others => '0'); + wav_len := (others => '0'); + + noi_playing <= '0'; + noi_fr2 <= (others => '0'); + noi_fcnt := (others => '0'); + noi_lfsr := (others => '1'); + noi_len := (others => '0'); + noi_vol <= "0000"; + noi_envcnt := "000"; + noi_out := '0'; + + elsif rising_edge(clk) then + if en_snd4 then + -- Sq1 frequency timer + if sq1_playing = '1' then + acc_fcnt := ('0'&sq1_fcnt) + to_unsigned(1, acc_fcnt'length); + if acc_fcnt(acc_fcnt'high) = '1' then + if sq1_phase < 7 then + sq1_phase := sq1_phase + 1; + else + sq1_phase := 0; + end if; + sq1_fcnt := unsigned(sq1_fr2); + else + sq1_fcnt := acc_fcnt(sq1_fcnt'range); + end if; + end if; + + -- Sq2 frequency timer + if sq2_playing = '1' then + acc_fcnt := ('0'&sq2_fcnt) + to_unsigned(1, acc_fcnt'length); + if acc_fcnt(acc_fcnt'high) = '1' then + if sq2_phase < 7 then + sq2_phase := sq2_phase + 1; + else + sq2_phase := 0; + end if; + sq2_fcnt := unsigned(sq2_fr2); + else + sq2_fcnt := acc_fcnt(sq2_fcnt'range); + end if; + end if; + + -- Noi frequency timer + if noi_playing = '1' then + acc_fcnt := ('0'&noi_fcnt) + to_unsigned(1, acc_fcnt'length); + if acc_fcnt(acc_fcnt'high) = '1' then + -- Noise LFSR + if noi_short = '1' then + noi_lfsr := (noi_lfsr(0) xor noi_lfsr(1)) & noi_lfsr(15 downto 8) & (noi_lfsr(0) xor noi_lfsr(1)) & noi_lfsr(6 downto 1); + else + noi_lfsr := (noi_lfsr(0) xor noi_lfsr(1)) & noi_lfsr(15 downto 1); + end if; + + noi_out := not noi_lfsr(0); + noi_fcnt := unsigned(noi_fr2); + else + noi_fcnt := acc_fcnt(noi_fcnt'range); + end if; + end if; + + case sq1_duty is + when "00" => sq1_out := duty_0(sq1_phase); + when "01" => sq1_out := duty_1(sq1_phase); + when "10" => sq1_out := duty_2(sq1_phase); + when "11" => sq1_out := duty_3(sq1_phase); + when others => null; + end case; + + if sq1_out = '1' then + sq1_wav <= sq1_vol & "00"; + else + sq1_wav <= "000000"; + end if; + + case sq2_duty is + when "00" => sq2_out := duty_0(sq2_phase); + when "01" => sq2_out := duty_1(sq2_phase); + when "10" => sq2_out := duty_2(sq2_phase); + when "11" => sq2_out := duty_3(sq2_phase); + when others => null; + end case; + + if sq2_out = '1' then + sq2_wav <= sq2_vol & "00"; + else + sq2_wav <= "000000"; + end if; + + if noi_out = '1' then + noi_wav <= noi_vol & "00"; + else + noi_wav <= "000000"; + end if; + + end if; + + -- Square channel 1 + if sq1_playing = '1' then + -- Length counter + if en_len then + if sq1_len(6) = '0' then + sq1_len := std_logic_vector(unsigned(sq1_len) + to_unsigned(1, sq1_len'length)); + end if; + end if; + + -- Envelope counter + if en_env then + if sq1_envper /= "000" then + sq1_envcnt := std_logic_vector(unsigned(sq1_envcnt) + to_unsigned(1, sq1_envcnt'length)); + if sq1_envcnt = sq1_envper then + if sq1_envsgn = '1' then + if sq1_vol /= "1111" then + sq1_vol <= std_logic_vector(unsigned(sq1_vol) + to_unsigned(1, sq1_vol'length)); + end if; + else + if sq1_vol /= "0000" then + sq1_vol <= std_logic_vector(unsigned(sq1_vol) - to_unsigned(1, sq1_vol'length)); + end if; + end if; + sq1_envcnt := "000"; + end if; + end if; + end if; + + -- Sweep processing + if en_sweep or sq1_trigger = '1' then + case sq1_swshift is + when "000" => sq1_swoffs := unsigned('0' & sq1_fr2); + when "001" => sq1_swoffs := "00" & unsigned(sq1_fr2(10 downto 1)); + when "010" => sq1_swoffs := "000" & unsigned(sq1_fr2(10 downto 2)); + when "011" => sq1_swoffs := "0000" & unsigned(sq1_fr2(10 downto 3)); + when "100" => sq1_swoffs := "00000" & unsigned(sq1_fr2(10 downto 4)); + when "101" => sq1_swoffs := "000000" & unsigned(sq1_fr2(10 downto 5)); + when "110" => sq1_swoffs := "0000000" & unsigned(sq1_fr2(10 downto 6)); + when "111" => sq1_swoffs := "00000000" & unsigned(sq1_fr2(10 downto 7)); + when others => sq1_swoffs := unsigned('0' & sq1_fr2); + end case; + + -- Calculate next sweep frequency + if sq1_swper /= "000" then + if sq1_swdir = '0' then + sq1_swfr := ('0' & unsigned(sq1_fr2)) - sq1_swoffs; + else + sq1_swfr := ('0' & unsigned(sq1_fr2)) + sq1_swoffs; + end if; + else -- Sweep disabled + sq1_swfr := unsigned('0' & sq1_fr2); + end if; + + -- Sweep counter + if sq1_swper /= "000" then + sq1_swcnt := std_logic_vector(unsigned(sq1_swcnt) + to_unsigned(1, sq1_swcnt'length)); + if sq1_swcnt = sq1_swper then + sq1_fr2 <= std_logic_vector(sq1_swfr(10 downto 0)); + sq1_swcnt := "000"; + end if; + end if; + end if; + + -- Check for end of playing conditions + if sq1_vol = X"0" -- Volume == 0 + or (sq1_lenchk = '1' and sq1_len(6) = '1') -- Play length timer overrun + or (sq1_swper /= "000" and sq1_swfr(11) = '1') -- Sweep frequency overrun + then + sq1_playing <= '0'; + sq1_envcnt := "000"; + sq1_swcnt := "000"; + --sq1_wav <= "000000"; + end if; + end if; + + -- Check sample trigger and start playing + if sq1_trigger = '1' then + sq1_fr2 <= sq1_freq; + sq1_fcnt := unsigned(sq1_freq); + noi_lfsr := (others => '1'); + sq1_playing <= '1'; + sq1_vol <= sq1_svol; + sq1_envcnt := "000"; + sq1_swcnt := "000"; + sq1_len := '0' & sq1_slen; + sq1_phase := 0; + end if; + + -- Square channel 2 + if sq2_playing = '1' then + -- Length counter + if en_len then + if sq2_len(6) = '0' then + sq2_len := std_logic_vector(unsigned(sq2_len) + to_unsigned(1, sq2_len'length)); + end if; + end if; + + -- Envelope counter + if en_env then + if sq2_envper /= "000" then + sq2_envcnt := std_logic_vector(unsigned(sq2_envcnt) + to_unsigned(1, sq2_envcnt'length)); + if sq2_envcnt = sq2_envper then + if sq2_envsgn = '1' then + if sq2_vol /= "1111" then + sq2_vol <= std_logic_vector(unsigned(sq2_vol) + to_unsigned(1, sq2_vol'length)); + end if; + else + if sq2_vol /= "0000" then + sq2_vol <= std_logic_vector(unsigned(sq2_vol) - to_unsigned(1, sq2_vol'length)); + end if; + end if; + sq2_envcnt := "000"; + end if; + end if; + end if; + + -- Check for end of playing conditions + if sq2_vol = X"0" -- Volume == 0 + or (sq2_lenchk = '1' and sq2_len(6) = '1') -- Play length timer overrun + then + sq2_playing <= '0'; + sq2_envcnt := "000"; + --sq2_wav <= "000000"; + end if; + end if; + + -- Check sample trigger and start playing + if sq2_trigger = '1' then + sq2_fr2 <= sq2_freq; + sq2_fcnt := unsigned(sq2_freq); + sq2_playing <= '1'; + sq2_vol <= sq2_svol; + sq2_envcnt := "000"; + sq2_len := '0' & sq2_slen; + sq2_phase := 0; + end if; + + -- Noise channel + if noi_playing = '1' then + -- Length counter + if en_len then + if noi_len(6) = '0' then + noi_len := std_logic_vector(unsigned(noi_len) + to_unsigned(1, noi_len'length)); + end if; + end if; + + -- Envelope counter + if en_env then + if noi_envper /= "000" then + noi_envcnt := std_logic_vector(unsigned(noi_envcnt) + to_unsigned(1, noi_envcnt'length)); + if noi_envcnt = noi_envper then + if noi_envsgn = '1' then + if noi_vol /= "1111" then + noi_vol <= std_logic_vector(unsigned(noi_vol) + to_unsigned(1, noi_vol'length)); + end if; + else + if noi_vol /= "0000" then + noi_vol <= std_logic_vector(unsigned(noi_vol) - to_unsigned(1, noi_vol'length)); + end if; + end if; + noi_envcnt := "000"; + end if; + end if; + end if; + + -- Check for end of playing conditions + if noi_vol = X"0" -- Volume == 0 + or (noi_lenchk = '1' and noi_len(6) = '1') -- Play length timer overrun + then + noi_playing <= '0'; + noi_envcnt := "000"; + --sq2_wav <= "000000"; + end if; + end if; + + -- Check sample trigger and start playing + if noi_trigger = '1' then + -- Calculate noise frequency + case noi_div is + when "000" => noi_divisor := to_unsigned(2048 - 8, noi_divisor'length); + when "001" => noi_divisor := to_unsigned(2048 - 16, noi_divisor'length); + when "010" => noi_divisor := to_unsigned(2048 - 32, noi_divisor'length); + when "011" => noi_divisor := to_unsigned(2048 - 48, noi_divisor'length); + when "100" => noi_divisor := to_unsigned(2048 - 64, noi_divisor'length); + when "101" => noi_divisor := to_unsigned(2048 - 80, noi_divisor'length); + when "110" => noi_divisor := to_unsigned(2048 - 96, noi_divisor'length); + when others => noi_divisor := to_unsigned(2048 - 112, noi_divisor'length); + end case; + +-- case noi_freqsh is +-- when "000" => noi_freq := unsigned(noi_divisor); +-- when "001" => noi_freq := '0' & unsigned(noi_divisor(10 downto 1)); +-- when "010" => noi_freq := "00" & unsigned(noi_divisor(10 downto 2)); +-- when "011" => noi_freq := "000" & unsigned(noi_divisor(10 downto 3)); +-- when "100" => noi_freq := "0000" & unsigned(noi_divisor(10 downto 4)); +-- when "101" => noi_freq := "00000" & unsigned(noi_divisor(10 downto 5)); +-- when "110" => noi_freq := "000000" & unsigned(noi_divisor(10 downto 6)); +-- when "111" => noi_freq := "0000000" & unsigned(noi_divisor(10 downto 7)); +-- when others => noi_freq := unsigned(noi_divisor); +-- end case; + noi_freq := noi_divisor sll to_integer(unsigned(noi_freqsh)); + + noi_fr2 <= std_logic_vector(noi_freq); + noi_fcnt := noi_freq; + noi_playing <= '1'; + noi_vol <= noi_svol; + noi_envcnt := "000"; + noi_len := '0' & noi_slen; + end if; + + if en_snd2 then + -- Wave frequency timer + wav_shift <= false; + if wav_playing = '1' then + acc_fcnt := ('0'&wav_fcnt) + to_unsigned(1, acc_fcnt'length); + if acc_fcnt(acc_fcnt'high) = '1' then + wav_shift <= true; + wav_fcnt := unsigned(wav_fr2); + else + wav_fcnt := acc_fcnt(wav_fcnt'range); + end if; + end if; + end if; + + -- Wave channel + if wav_playing = '1' then + -- Length counter + if en_len then + if wav_len(8) = '0' then + wav_len := std_logic_vector(unsigned(wav_len) + to_unsigned(1, wav_len'length)); + end if; + end if; + + -- Check for end of playing conditions + if (wav_lenchk = '1' and wav_len(8) = '1') then + wav_playing <= '0'; + wav_wav <= "000000"; + end if; + end if; + + -- Check sample trigger and start playing + if wav_trigger = '1' then + wav_fr2 <= wav_freq; + wav_fcnt := unsigned(wav_freq); + wav_playing <= '1'; + wav_len := '0' & wav_slen; + end if; + + if wav_enable = '1' and wav_volsh /= "00" then + case wav_volsh is + when "01" => wav_wav <= wav_ram(0) & "00"; + when "10" => wav_wav <= '0' & wav_ram(0) & '0'; + when "11" => wav_wav <= "00" & wav_ram(0); + when others => wav_wav <= (others => 'X'); + end case; + else + wav_wav <= "000000"; + end if; + + end if; -- snd_enable + end process sound; + + -- Test + process(clk, en_512, reset) + variable l : std_logic_vector(15 downto 0); + begin + if reset = '1' then + l := x"4000"; + + elsif rising_edge(clk) then + if en_512 then + l := not l; + end if; +-- snd_left <= l; + end if; + end process; + + -- Mixer + mixer : process(sq1_wav, sq2_wav, noi_wav, wav_wav) + variable snd_left_in : unsigned(7 downto 0); + variable snd_right_in : unsigned(7 downto 0); + begin + snd_left_in := (others => '0'); + snd_right_in := (others => '0'); + + snd_left_in := snd_left_in + ("00"&unsigned(sq1_wav)); + snd_left_in := snd_left_in + ("00"&unsigned(wav_wav)); + snd_right_in := snd_right_in + ("00"&unsigned(sq2_wav)); + snd_right_in := snd_right_in + ("00"&unsigned(noi_wav)); + + snd_left <= std_logic_vector(snd_left_in) & X"00"; + snd_right <= std_logic_vector(snd_right_in) & X"00"; + end process; + +end SYN; diff --git a/Nintendo - Gameboy_Mist/rtl/hq2x.sv b/Nintendo - Gameboy_Mist/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Nintendo - Gameboy_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/Nintendo - Gameboy_Mist/rtl/iram.sv b/Nintendo - Gameboy_Mist/rtl/iram.sv new file mode 100644 index 00000000..744357db --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/iram.sv @@ -0,0 +1,172 @@ +// megafunction wizard: %RAM: 1-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: iram.v +// Megafunction Name(s): +// altsyncram +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2014 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 iram ( + address, + clock, + data, + wren, + q); + + input [12:0] address; + input clock; + input [7:0] data; + input wren; + output [7:0] q; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [7:0] sub_wire0; + wire [7:0] q = sub_wire0[7:0]; + + altsyncram altsyncram_component ( + .address_a (address), + .clock0 (clock), + .data_a (data), + .wren_a (wren), + .q_a (sub_wire0), + .aclr0 (1'b0), + .aclr1 (1'b0), + .address_b (1'b1), + .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 (1'b1), + .eccstatus (), + .q_b (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_b (1'b0)); + defparam + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 8192, + altsyncram_component.operation_mode = "SINGLE_PORT", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_reg_a = "UNREGISTERED", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.read_during_write_mode_port_a = "NEW_DATA_NO_NBE_READ", + altsyncram_component.widthad_a = 13, + altsyncram_component.width_a = 8, + altsyncram_component.width_byteena_a = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +// Retrieval info: PRIVATE: AclrByte NUMERIC "0" +// Retrieval info: PRIVATE: AclrData NUMERIC "0" +// Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "1" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: Clken NUMERIC "0" +// Retrieval info: PRIVATE: DataBusSeparated NUMERIC "1" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "" +// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8192" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +// Retrieval info: PRIVATE: RegAddr NUMERIC "1" +// Retrieval info: PRIVATE: RegData NUMERIC "1" +// Retrieval info: PRIVATE: RegOutput NUMERIC "0" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: SingleClock NUMERIC "1" +// Retrieval info: PRIVATE: UseDQRAM NUMERIC "1" +// Retrieval info: PRIVATE: WRCONTROL_ACLR_A NUMERIC "0" +// Retrieval info: PRIVATE: WidthAddr NUMERIC "13" +// Retrieval info: PRIVATE: WidthData NUMERIC "8" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "8192" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "SINGLE_PORT" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED" +// Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_A STRING "NEW_DATA_NO_NBE_READ" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: USED_PORT: address 0 0 13 0 INPUT NODEFVAL "address[12..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data[7..0]" +// Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +// Retrieval info: USED_PORT: wren 0 0 0 0 INPUT NODEFVAL "wren" +// Retrieval info: CONNECT: @address_a 0 0 13 0 address 0 0 13 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: @data_a 0 0 8 0 data 0 0 8 0 +// Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0 +// Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL iram.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL iram.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL iram.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL iram.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL iram_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL iram_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Nintendo - Gameboy_Mist/rtl/keyboard.sv b/Nintendo - Gameboy_Mist/rtl/keyboard.sv new file mode 100644 index 00000000..a6d2ba94 --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/keyboard.sv @@ -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) + '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 + + 'h29: joystick[4] <= ~release_btn; // Space + 'h11: joystick[5] <= ~release_btn; // Left Alt + 'h0D: joystick[6] <= ~release_btn; // Tab + 'h76: joystick[7] <= ~release_btn; // Escape + 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/Nintendo - Gameboy_Mist/rtl/lcd.sv b/Nintendo - Gameboy_Mist/rtl/lcd.sv new file mode 100644 index 00000000..df77d663 --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/lcd.sv @@ -0,0 +1,147 @@ +// Gameboy for the MiST +// (c) 2015 Till Harbaum + +// The gameboy lcd runs from a shift register which is filled at 4194304 pixels/sec + +module lcd ( + input clk, + input clkena, + input [1:0] data, + input [1:0] mode, + + input tint, + input inv, + // pixel clock + input pclk, + input on, + + // VGA output + output reg hs, + output reg vs, + output [5:0] r, + output [5:0] g, + output [5:0] b +); + +// Mode 00: h-blank +// Mode 01: v-blank +// Mode 10: oam +// Mode 11: oam and vram + +// space for 2*160 pixel +reg [7:0] shift_reg_wptr; +reg p_toggle; +reg [1:0] shift_reg [511:0]; +reg [1:0] last_mode_in; + +// shift register input +always @(posedge clk) begin + last_mode_in <= mode; + + // end of vsync + if(clkena) begin + shift_reg[{p_toggle, shift_reg_wptr}] <= data; + shift_reg_wptr <= shift_reg_wptr + 8'd1; + end + + // reset write pointer at end of hsync phase + if((mode != 2'b00) && (last_mode_in == 2'b00)) begin + shift_reg_wptr <= 8'd0; + p_toggle <= !p_toggle; + end +end + +// +parameter H = 160; // width of visible area +parameter HFP = 24; // unused time before hsync +parameter HS = 20; // width of hsync +parameter HBP = 24; // unused time after hsync +// total = 228 + +parameter V = 576; // height of visible area +parameter VFP = 2; // unused time before vsync +parameter VS = 2; // width of vsync +parameter VBP = 36; // unused time after vsync +// total = 616 + +reg[7:0] h_cnt; // horizontal pixel counter +reg[9:0] v_cnt; // vertical pixel counter + +// horizontal pixel counter +reg [1:0] last_mode_h; +always@(posedge pclk) begin + last_mode_h <= mode; + + if(h_cnt==H+HFP+HS+HBP-1) h_cnt <= 0; + else h_cnt <= h_cnt + 1; + + // generate negative hsync signal + if(h_cnt == H+HFP) hs <= 1'b0; + if(h_cnt == H+HFP+HS) hs <= 1'b1; + + // synchronize to input mode + // end of hblank + if((mode == 2'b10) && (last_mode_h == 2'b00)) + h_cnt <= 0; +end + +// veritical pixel counter +reg [1:0] last_mode_v; +always@(posedge pclk) begin + // the vertical counter is processed at the begin of each hsync + if(h_cnt == H+HFP+HS+HBP-1) begin + if(v_cnt==VS+VFP+V+VBP-1) v_cnt <= 0; + else v_cnt <= v_cnt + 1; + + // generate positive vsync signal + if(v_cnt == V+VFP) vs <= 1'b1; + if(v_cnt == V+VFP+VS) vs <= 1'b0; + + last_mode_v <= mode; + + // synchronize to input mode + // end of mode 01 (vblank) + // make and offset of - 4 for the 4 line delay of the scandoubler + if((mode != 2'b01) && (last_mode_v == 2'b01)) + v_cnt <= 616-4; + end +end + +// ------------------------------------------------------------------------------- +// ------------------------------- pixel generator ------------------------------- +// ------------------------------------------------------------------------------- +reg blank; +reg [1:0] pixel_reg; +reg [7:0] shift_reg_rptr; + +always@(posedge pclk) begin + // visible area? + if((v_cnt < V) && (h_cnt < H)) begin + blank <= 1'b0; + pixel_reg <= shift_reg[{!p_toggle, shift_reg_rptr}]; + shift_reg_rptr <= shift_reg_rptr + 8'd1; + end else begin + blank <= 1'b1; + shift_reg_rptr <= 8'd0; + end +end + +//wire [1:0] pixel = on?pixel_reg:2'b00; +wire [1:0] pixel = on? (pixel_reg ^ {inv,inv}) :2'b00; + +// gameboy "color" palette +wire [5:0] yellow_r = (pixel==0)?6'b100111:(pixel==1)?6'b100000: // 1:100011 + (pixel==2)?6'b001100:6'b000111; +wire [5:0] yellow_g = (pixel==0)?6'b101111:(pixel==1)?6'b101000: // 1:101011 + (pixel==2)?6'b011001:6'b000100; +wire [5:0] yellow_b = (pixel==0)?6'b000100:(pixel==1)?6'b000010: // 1:000100 + (pixel==2)?6'b001100:6'b000100; + +// greyscale +wire [5:0] grey = (pixel==0)?6'd63:(pixel==1)?6'd42:(pixel==2)?6'd24:6'd0; + +assign r = blank?6'b000000:tint?yellow_r:grey; +assign g = blank?6'b000000:tint?yellow_g:grey; +assign b = blank?6'b000000:tint?yellow_b:grey; + +endmodule diff --git a/Nintendo - Gameboy_Mist/rtl/mist_io.sv b/Nintendo - Gameboy_Mist/rtl/mist_io.sv new file mode 100644 index 00000000..dcc7ecde --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/mist_io.sv @@ -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 [23: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 [23: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 [23: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/Nintendo - Gameboy_Mist/rtl/osd.sv b/Nintendo - Gameboy_Mist/rtl/osd.sv new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/osd.sv @@ -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/Nintendo - Gameboy_Mist/rtl/pll.qip b/Nintendo - Gameboy_Mist/rtl/pll.qip new file mode 100644 index 00000000..afd958be --- /dev/null +++ b/Nintendo - Gameboy_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/Nintendo - Gameboy_Mist/rtl/pll.v b/Nintendo - Gameboy_Mist/rtl/pll.v new file mode 100644 index 00000000..47c2b50d --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/pll.v @@ -0,0 +1,421 @@ +// 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, + c3, + c4, + locked); + + input inclk0; + output c0; + output c1; + output c2; + output c3; + output c4; + output locked; + + wire [4:0] sub_wire0; + wire sub_wire3; + wire [0:0] sub_wire9 = 1'h0; + wire [4:4] sub_wire6 = sub_wire0[4:4]; + wire [2:2] sub_wire5 = sub_wire0[2:2]; + wire [0:0] sub_wire4 = sub_wire0[0:0]; + wire [3:3] sub_wire2 = sub_wire0[3:3]; + wire [1:1] sub_wire1 = sub_wire0[1:1]; + wire c1 = sub_wire1; + wire c3 = sub_wire2; + wire locked = sub_wire3; + wire c0 = sub_wire4; + wire c2 = sub_wire5; + wire c4 = sub_wire6; + wire sub_wire7 = inclk0; + wire [1:0] sub_wire8 = {sub_wire9, sub_wire7}; + + altpll altpll_component ( + .inclk (sub_wire8), + .clk (sub_wire0), + .locked (sub_wire3), + .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 (), + .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 = 62, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 77, + altpll_component.clk0_phase_shift = "0", + altpll_component.clk1_divide_by = 62, + altpll_component.clk1_duty_cycle = 50, + altpll_component.clk1_multiply_by = 77, + altpll_component.clk1_phase_shift = "-2500", + altpll_component.clk2_divide_by = 130, + altpll_component.clk2_duty_cycle = 50, + altpll_component.clk2_multiply_by = 77, + altpll_component.clk2_phase_shift = "0", + altpll_component.clk3_divide_by = 260, + altpll_component.clk3_duty_cycle = 50, + altpll_component.clk3_multiply_by = 77, + altpll_component.clk3_phase_shift = "0", + altpll_component.clk4_divide_by = 520, + altpll_component.clk4_duty_cycle = 50, + altpll_component.clk4_multiply_by = 77, + altpll_component.clk4_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_USED", + 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_USED", + altpll_component.port_clk4 = "PORT_USED", + 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.self_reset_on_loss_lock = "OFF", + 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 "62" +// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "62" +// Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "130" +// Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "260" +// Retrieval info: PRIVATE: DIV_FACTOR4 NUMERIC "520" +// 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: DUTY_CYCLE3 STRING "50.00000000" +// Retrieval info: PRIVATE: DUTY_CYCLE4 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "33.532257" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "33.532257" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "15.992308" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "7.996154" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE4 STRING "3.998077" +// 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 "1" +// 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 "ps" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 STRING "ps" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT4 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: MIRROR_CLK3 STRING "0" +// Retrieval info: PRIVATE: MIRROR_CLK4 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "77" +// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "77" +// Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "77" +// Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "77" +// Retrieval info: PRIVATE: MULT_FACTOR4 NUMERIC "77" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "33.55714300" +// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "33.55714300" +// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "16.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "8.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ4 STRING "4.00000000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE4 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: OUTPUT_FREQ_UNIT3 STRING "MHz" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT4 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 "-2500.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT2 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT3 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT4 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 "ps" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ps" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "ps" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT4 STRING "ps" +// 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: STICKY_CLK3 STRING "1" +// Retrieval info: PRIVATE: STICKY_CLK4 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_CLK3 STRING "1" +// Retrieval info: PRIVATE: USE_CLK4 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_CLKENA3 STRING "0" +// Retrieval info: PRIVATE: USE_CLKENA4 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 "62" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "77" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "62" +// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "77" +// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "-2500" +// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "130" +// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "77" +// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "260" +// Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "77" +// Retrieval info: CONSTANT: CLK3_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: CLK4_DIVIDE_BY NUMERIC "520" +// Retrieval info: CONSTANT: CLK4_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK4_MULTIPLY_BY NUMERIC "77" +// Retrieval info: CONSTANT: CLK4_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_USED" +// 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_USED" +// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_USED" +// 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +// 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: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +// Retrieval info: USED_PORT: c4 0 0 0 0 OUTPUT_CLK_EXT VCC "c4" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +// 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: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +// Retrieval info: CONNECT: c4 0 0 0 0 @clk 0 0 1 4 +// Retrieval info: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 +// 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/Nintendo - Gameboy_Mist/rtl/scandoubler.sv b/Nintendo - Gameboy_Mist/rtl/scandoubler.sv new file mode 100644 index 00000000..0213d20c --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/scandoubler.sv @@ -0,0 +1,195 @@ +// +// 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 +); + + +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 + +`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 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/Nintendo - Gameboy_Mist/rtl/sdram.sv b/Nintendo - Gameboy_Mist/rtl/sdram.sv new file mode 100644 index 00000000..5af8c5cd --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/sdram.sv @@ -0,0 +1,150 @@ +// +// sdram.v +// +// sdram controller implementation for the MiST board +// https://github.com/mist-devel +// +// Copyright (c) 2015 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 . +// + +module sdram ( + + // interface to the MT48LC16M16 chip + inout [15:0] sd_data, // 16 bit bidirectional data bus + output reg [12:0] sd_addr, // 13 bit multiplexed address bus + output reg [1:0] sd_dqm, // two byte masks + output reg[1:0] sd_ba, // two banks + output sd_cs, // a single chip select + output sd_we, // write enable + output sd_ras, // row address select + output sd_cas, // columns address select + + // cpu/chipset interface + input init, // init signal after FPGA config to initialize RAM + input clk, // sdram is accessed at up to 128MHz + input clkref, // reference clock to sync to + + input [15:0] din, // data input from chipset/cpu + output [15:0] dout, // data output to chipset/cpu + input [23:0] addr, // 24 bit word address + input [1:0] ds, // data strobe for hi/low byte + input oe, // cpu/chipset requests read + input we // cpu/chipset requests write +); + +// no burst configured +localparam RASCAS_DELAY = 3'd3; // tRCD>=20ns -> 2 cycles@64MHz +localparam BURST_LENGTH = 3'b000; // 000=none, 001=2, 010=4, 011=8 +localparam ACCESS_TYPE = 1'b0; // 0=sequential, 1=interleaved +localparam CAS_LATENCY = 3'd3; // 2/3 allowed +localparam OP_MODE = 2'b00; // only 00 (standard operation) allowed +localparam NO_WRITE_BURST = 1'b1; // 0= write burst enabled, 1=only single access write + +localparam MODE = { 3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, BURST_LENGTH}; + +// --------------------------------------------------------------------- +// ------------------------ cycle state machine ------------------------ +// --------------------------------------------------------------------- + +localparam STATE_IDLE = 3'd0; // first state in cycle +localparam STATE_CMD_START = 3'd1; // state in which a new command can be started +localparam STATE_CMD_CONT = STATE_CMD_START + RASCAS_DELAY - 3'd1; // 4 command can be continued +localparam STATE_LAST = 3'd7; // last state in cycle + +reg [2:0] q; +always @(posedge clk) begin + // 32Mhz counter synchronous to 4 Mhz clock + // force counter to pass state 5->6 exactly after the rising edge of clkref + // since clkref is two clocks early + if(((q == 7) && ( clkref == 0)) || + ((q == 0) && ( clkref == 1)) || + ((q != 7) && (q != 0))) + q <= q + 3'd1; +end + +// --------------------------------------------------------------------- +// --------------------------- startup/reset --------------------------- +// --------------------------------------------------------------------- + +// wait 1ms (32 clkref cycles) after FPGA config is done before going +// into normal operation. Initialize the ram in the last 16 reset cycles (cycles 15-0) +reg [4:0] reset; +always @(posedge clk) begin + if(init) reset <= 5'h1f; + else if((q == STATE_LAST) && (reset != 0)) + reset <= reset - 5'd1; +end + +// --------------------------------------------------------------------- +// ------------------ generate ram control signals --------------------- +// --------------------------------------------------------------------- + +// all possible commands +localparam CMD_INHIBIT = 4'b1111; +localparam CMD_NOP = 4'b0111; +localparam CMD_ACTIVE = 4'b0011; +localparam CMD_READ = 4'b0101; +localparam CMD_WRITE = 4'b0100; +localparam CMD_BURST_TERMINATE = 4'b0110; +localparam CMD_PRECHARGE = 4'b0010; +localparam CMD_AUTO_REFRESH = 4'b0001; +localparam CMD_LOAD_MODE = 4'b0000; + +reg [3:0] sd_cmd; // current command sent to sd ram + +// drive control signals according to current command +assign sd_cs = sd_cmd[3]; +assign sd_ras = sd_cmd[2]; +assign sd_cas = sd_cmd[1]; +assign sd_we = sd_cmd[0]; + +assign sd_data = we?din:16'bZZZZZZZZZZZZZZZZ; + +assign dout = sd_data; + +always @(posedge clk) begin + sd_cmd <= CMD_INHIBIT; + + if(reset != 0) begin + sd_ba <= 2'b00; + sd_dqm <= 2'b00; + + if(reset == 13) sd_addr <= 13'b0010000000000; + else sd_addr <= MODE; + + if(q == STATE_IDLE) begin + if(reset == 13) sd_cmd <= CMD_PRECHARGE; + if(reset == 2) sd_cmd <= CMD_LOAD_MODE; + end + end else begin + if(q <= STATE_CMD_START) begin + sd_addr <= addr[20:8]; + sd_ba <= addr[22:21]; + sd_dqm <= { !ds[1], !ds[0] }; + end else + sd_addr <= { 4'b0010, addr[23], addr[7:0]}; + + if(q == STATE_IDLE) begin + if(we || oe) sd_cmd <= CMD_ACTIVE; + else sd_cmd <= CMD_AUTO_REFRESH; + end else if(q == STATE_CMD_CONT) begin + if(we) sd_cmd <= CMD_WRITE; + else if(oe) sd_cmd <= CMD_READ; + end + end +end + +endmodule diff --git a/Nintendo - Gameboy_Mist/rtl/sprite.sv b/Nintendo - Gameboy_Mist/rtl/sprite.sv new file mode 100644 index 00000000..81ed82f8 --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/sprite.sv @@ -0,0 +1,107 @@ +// +// sprite.v +// +// Gameboy for the MIST board https://github.com/mist-devel +// +// Copyright (c) 2015 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 . +// + +module sprite ( + input clk, + input size16, + + input [7:0] v_cnt, + input [7:0] h_cnt, + + output [7:0] x, + + // interface to read pixel data from memory + output [10:0] addr, + input [1:0] ds, + input [7:0] data, + + output pixel_active, + output pixel_cmap, + output pixel_prio, + output [1:0] pixel_data, + + input oam_wr, + input [1:0] oam_addr, + input [7:0] oam_di, + output [7:0] oam_do +); + +// x position for priority detection. Invisible sprites are far to the right and +// have minimum priority +assign x = v_visible?x_pos:8'hff; + +// register used to store pixel data for current line +reg [7:0] data0; +reg [7:0] data1; + +always @(posedge clk) begin + if(ds[0]) data0 <= data; + if(ds[1]) data1 <= data; +end + +wire [7:0] height = size16?8'd16:8'd8; + +wire v_visible = (v_cnt + 8'd16 >= y_pos) && (v_cnt + 8'd16 < y_pos + height); +wire visible = v_visible && (h_cnt + 8'd8 >= x_pos) && (h_cnt < x_pos); + +// x position within sprite, mirror horizontally if required +wire [2:0] col_n = h_cnt - x_pos; +wire [2:0] col = flags[1]?col_n:~col_n; + +assign pixel_data = { data1[col], data0[col] }; +assign pixel_active = (pixel_data != 0) && visible; + +// y position within sprite, mirror vertically if required +wire [3:0] row_n = v_cnt - y_pos; +wire [3:0] row = flags[2]?~row_n:row_n; + +// 16 pixel tall sprites use one more rwo counter bit and the lsb +// of the tile index is ignored +wire [10:0] addr8 = { tile , row[2:0]}; +wire [10:0] addr16 = { tile[7:1] , row}; +assign addr = size16?addr16:addr8; + +assign pixel_cmap = flags[0]; +assign pixel_prio = flags[3]; + +reg [7:0] y_pos; +reg [7:0] x_pos; +reg [7:0] tile; +reg [3:0] flags; + +always @(posedge clk) begin + if(oam_wr) begin + case(oam_addr) + 0: y_pos <= oam_di; + 1: x_pos <= oam_di; + 2: tile <= oam_di; + 3: flags <= oam_di[7:4]; + endcase + end +end + +assign oam_do = + (oam_addr == 0)?y_pos: + (oam_addr == 1)?x_pos: + (oam_addr == 2)?tile: + { flags, 4'h0 }; + +endmodule diff --git a/Nintendo - Gameboy_Mist/rtl/sprite_sort.sv b/Nintendo - Gameboy_Mist/rtl/sprite_sort.sv new file mode 100644 index 00000000..a3626eee --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/sprite_sort.sv @@ -0,0 +1,100 @@ +// +// sprite_sort.v +// +// Gameboy for the MIST board https://github.com/mist-devel +// +// Copyright (c) 2015 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 . +// + +module sprite_sort #( + parameter WIDTH = 40 +)( + // system signals + input clk, + input load, + + // sort + input [8*WIDTH-1:0] x, + output [6*WIDTH-1:0] idx +); + +wire [7:0] in [WIDTH-1:0]; + +generate +genvar i; + +// map 1d input array onto 2d work array +// and 2d result array into 1d output array +for(i=0;i values[2*i+1]; + assign int_val[2*i+0] = swap0[i]?values[2*i+1]:values[2*i+0]; + assign int_val[2*i+1] = swap0[i]?values[2*i+0]:values[2*i+1]; + assign int_idx[2*i+0] = swap0[i]?index[2*i+1]:index[2*i+0]; + assign int_idx[2*i+1] = swap0[i]?index[2*i+0]:index[2*i+1]; + end + + // 2nd stage + assign sort_val[0] = int_val[0]; + assign sort_idx[0] = int_idx[0]; + assign sort_val[WIDTH-1] = int_val[WIDTH-1]; + assign sort_idx[WIDTH-1] = int_idx[WIDTH-1]; + for(i=0;i int_val[2*i+2]; + assign sort_val[2*i+1] = swap1[i]?int_val[2*i+2]:int_val[2*i+1]; + assign sort_val[2*i+2] = swap1[i]?int_val[2*i+1]:int_val[2*i+2]; + assign sort_idx[2*i+1] = swap1[i]?int_idx[2*i+2]:int_idx[2*i+1]; + assign sort_idx[2*i+2] = swap1[i]?int_idx[2*i+1]:int_idx[2*i+2]; + end + + for(i=0;i +// +// 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 . +// + +module sprites ( + input clk, + input size16, + + // pixel position input which the current pixel is generated for + input [7:0] v_cnt, + input [7:0] h_cnt, + + // pixel output + output pixel_active, // current pixel + output [1:0] pixel_data, + output pixel_cmap, + output pixel_prio, + + input sort, + input [3:0] index, // index of sprite which video wants to read data for + output [10:0] addr, + input [1:0] dvalid, + input [7:0] data, + + // oam memory interface + input oam_wr, + input [7:0] oam_addr, + input [7:0] oam_di, + output [7:0] oam_do +); + +localparam SPRITES = 40; + +// ------------------------------------------------------------------------ +// ---------------------------- priority sorting -------------------------- +// ------------------------------------------------------------------------ + +// sprites have priority from left to right and the leftmost 10 are +// being displayed. We thus need to sort them +wire [SPRITES*8-1:0] sprite_x; +wire [SPRITES*6-1:0] sprite_idx; + +sprite_sort #(.WIDTH(SPRITES)) sprite_sort ( + .clk ( clk ), + .load ( sort ), // begin of oam phase + .x ( sprite_x ), + .idx ( sprite_idx ) +); + +wire [SPRITES-1:0] sprite_pixel_active; +wire [SPRITES-1:0] sprite_pixel_cmap; +wire [SPRITES-1:0] sprite_pixel_prio; +wire [1:0] sprite_pixel_data [SPRITES-1:0]; + +wire [10:0] sprite_addr [SPRITES-1:0]; +wire [7:0] sprite_oam_do [SPRITES-1:0]; + +assign oam_do = sprite_oam_do[oam_addr[7:2]]; + +// address where the sprite wants to read data from +wire [5:0] sprite_idx_array [SPRITES-1:0]; +wire [5:0] prio_index = sprite_idx_array[index]; +assign addr = sprite_addr[prio_index]; + + +generate +genvar i; +for(i=0;i WR_n active in T3, /=0 => WR_n active in T2 + IOWait : integer := 1 -- 0 => Single cycle I/O, 1 => Std I/O cycle + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CLKEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end GBse; + +architecture rtl of GBse is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : T80 + generic map + ( + Mode => 3, + IOWait => IOWait, + Flag_S => 0, + Flag_P => 0, + Flag_X => 0, + Flag_Y => 0, + Flag_C => 4, + Flag_H => 5, + Flag_N => 6, + Flag_Z => 7 + ) + port map( + CEN => CLKEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK_n, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + IntCycle_n => IntCycle_n); + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif CLK_n'event and CLK_n = '1' then + if CLKEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = "001" then + if TState = "001" or (TState = "010" and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = "011" then + MREQ_n <= '0'; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if T2Write = 0 then + if TState = "010" and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + else + if (TState = "001" or (TState = "010" and Wait_n = '0')) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + end if; + if TState = "010" and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; + +end; diff --git a/Nintendo - Gameboy_Mist/rtl/t80/T80.vhd b/Nintendo - Gameboy_Mist/rtl/t80/T80.vhd new file mode 100644 index 00000000..1ea66542 --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/t80/T80.vhd @@ -0,0 +1,1088 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. Rmoved some auto_wait bits from 0247 which caused problems +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed wait and halt +-- +-- 0211 : Fixed Refresh addition and IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- +-- 0237 : Changed 8080 I/O address output, added IntE output +-- +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); +end T80; + +architecture rtl of T80 is + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal TmpAddr : std_logic_vector(15 downto 0); -- Temporary address register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic; + signal BusAck : std_logic; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal INT_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_INRC : std_logic; + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + + +begin + + mcode : T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + TmpAddr <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + F <= (others => '1'); + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + + elsif CLK_n'event and CLK_n = '1' then + + if ClkEn = '1' then + + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if Mode = 3 then + IStatus <= "10"; + elsif IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= TmpAddr; + PC <= unsigned(TmpAddr); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= TmpAddr(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(TmpAddr(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= TmpAddr; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + end if; + when aDE => + A <= RegBusC; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(TmpAddr) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= TmpAddr(7 downto 0); + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + TmpAddr <= (others =>'0'); + TmpAddr(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + TmpAddr <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + TmpAddr(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + TmpAddr(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 then + DO <= BusB; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + + end if; + + end if; + + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if CLK_n'event and CLK_n = '1' then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + BusB <= "00000000"; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusA <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not BusAck; + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Syncronise inputs +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + BusReq_s <= '0'; + INT_s <= '0'; + NMI_s <= '0'; + OldNMI_n := '0'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + INT_s <= not INT_n; + if NMICycle = '1' then + NMI_s <= '0'; + elsif NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + end if; + end if; + end process; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + elsif CLK_n'event and CLK_n = '1' then + if CEN = '1' then + Auto_Wait_t1 <= Auto_Wait; + Auto_Wait_t2 <= Auto_Wait_t1; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or + (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or + No_BTR = '1' or + (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif (IntE_FF1 = '1' and INT_s = '1') and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if Auto_Wait = '1' nand Auto_Wait_t2 = '0' then + + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end process; + + process (IntCycle, NMICycle, MCycle) + begin + Auto_Wait <= '0'; + if IntCycle = '1' or NMICycle = '1' then + if MCycle = "001" then + Auto_Wait <= '1'; + end if; + end if; + end process; + +end; diff --git a/Nintendo - Gameboy_Mist/rtl/t80/T80_ALU.vhd b/Nintendo - Gameboy_Mist/rtl/t80/T80_ALU.vhd new file mode 100644 index 00000000..95c98dab --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/t80/T80_ALU.vhd @@ -0,0 +1,371 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- +-- 0240 : Added GB operations +-- +-- 0242 : Cleanup +-- +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= '0'; + F_Out(Flag_Y) <= '0'; + if IR(2 downto 0) /= "110" then + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Nintendo - Gameboy_Mist/rtl/t80/T80_MCode.vhd b/Nintendo - Gameboy_Mist/rtl/t80/T80_MCode.vhd new file mode 100644 index 00000000..22e6ef99 --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/t80/T80_MCode.vhd @@ -0,0 +1,2026 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 302 fixed IO cycle timing, tested thanks to Alessandro. +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0211 : Fixed IM 1 +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- +-- 0235 : Added IM 2 fix by Mike Johnson +-- +-- 0238 : Added NoRead signal +-- +-- 0238b: Fixed instruction timing for POP and DJNZ +-- +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes + +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.T80_Pack.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(7) = '0'; -- NZ + when "001" => return F(7) = '1'; -- Z + when "010" => return F(4) = '0'; -- NC + when "011" => return F(4) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(6) = '0'; -- NZ + when "001" => return F(6) = '1'; -- Z + when "010" => return F(0) = '0'; -- NC + when "011" => return F(0) = '1'; -- C + when "100" => return F(2) = '0'; -- PO + when "101" => return F(2) = '1'; -- PE + when "110" => return F(7) = '0'; -- P + when "111" => return F(7) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + --I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + if mode = 3 then + MCycles <= "011"; + else + MCycles <= "101"; + end if; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + IORQ <= '1'; --TH must be earlier to be stable when address is generated + when 2 => + Write <= '1'; +--TH this is too late IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + IORQ <= '1'; --TH must be earlier to be stable when address is generated + when 2 => + Read_To_Acc <= '1'; +--TH this is too late IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RLD <= '1'; + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Set_Addr_To <= aXY; + when 3 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + TStates <= "100"; + Set_Addr_To <= aXY; + Save_ALU <= '1'; + when 4 => + I_RRD <= '1'; + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI, RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + -- note B is decremented AFTER being put on the bus + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + --IncDec_16 <= "0010"; + IncDec_16 <= "0110"; + else + --IncDec_16 <= "1010"; + IncDec_16 <= "1110"; + end if; + TStates <= "100"; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + -- note B is decremented BEFORE being put on the bus. + -- mikej fix for hl inc + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; -- mikej + else + IncDec_16 <= "1110"; -- mikej + end if; + TStates <= "100"; -- MIKEJ should be 4 for IO cycle + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Nintendo - Gameboy_Mist/rtl/t80/T80_Pack.vhd b/Nintendo - Gameboy_Mist/rtl/t80/T80_Pack.vhd new file mode 100644 index 00000000..907db408 --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/t80/T80_Pack.vhd @@ -0,0 +1,228 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-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/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Nintendo - Gameboy_Mist/rtl/t80/T80_Reg.vhd b/Nintendo - Gameboy_Mist/rtl/t80/T80_Reg.vhd new file mode 100644 index 00000000..1c0f2638 --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/t80/T80_Reg.vhd @@ -0,0 +1,114 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- 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/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if Clk'event and Clk = '1' then + if CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + +end; diff --git a/Nintendo - Gameboy_Mist/rtl/timer.sv b/Nintendo - Gameboy_Mist/rtl/timer.sv new file mode 100644 index 00000000..23d5999c --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/timer.sv @@ -0,0 +1,103 @@ +// +// timer.v +// +// Gameboy for the MIST board https://github.com/mist-devel +// +// Copyright (c) 2015 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 . +// + +module timer ( + input reset, + input clk, // 4 Mhz cpu clock + + output reg irq, + + // cpu register interface + input cpu_sel, + input [1:0] cpu_addr, + input cpu_wr, + input [7:0] cpu_di, + output [7:0] cpu_do +); + +// input: 4Mhz +// clk_div[0] = 2Mhz +// clk_div[1] = 1Mhz +// clk_div[2] = 524khz +// clk_div[3] = 262khz +// clk_div[4] = 131khz +// clk_div[5] = 65khz +// clk_div[6] = 32khz +// clk_div[7] = 16khz +// clk_div[8] = 8khz +// clk_div[9] = 4khz + +reg [9:0] clk_div; +always @(posedge clk) + clk_div <= clk_div + 10'd1; + +reg [7:0] div; +reg [7:0] tma; +reg [7:0] tima; +reg [2:0] tac; + +always @(posedge clk) begin + if(reset) begin + tima <= 8'h00; + tma <= 8'h00; + tac <= 8'h00; + irq <= 1'b0; + end else begin + irq <= 1'b0; + + if(clk_div[7:0] == 0) // 16kHz + div <= div + 8'd1; + + // timer enabled? + if(tac[2]) begin + // timer frequency + if(((tac[1:0] == 2'b00) && (clk_div[9:0] == 0)) || // 4 khz + ((tac[1:0] == 2'b01) && (clk_div[3:0] == 0)) || // 262 khz + ((tac[1:0] == 2'b10) && (clk_div[5:0] == 0)) || // 65 khz + ((tac[1:0] == 2'b11) && (clk_div[7:0] == 0))) begin // 16 khz + + if(tima != 8'hff) + tima <= tima + 8'd1; + else begin + irq <= 1'b1; // irq when timer overflows + tima <= tma; // reload timer + end + end + end + + if(cpu_sel && cpu_wr) begin + case(cpu_addr) + 2'b00: div <= 8'h00; // writing clears counter + 2'b01: tima <= cpu_di; + 2'b10: tma <= cpu_di; + 2'b11: tac <= cpu_di[2:0]; + endcase + end + end +end + +assign cpu_do = + (cpu_addr == 2'b00)?div: + (cpu_addr == 2'b01)?tima: + (cpu_addr == 2'b10)?tma: + {5'b00000, tac}; + +endmodule diff --git a/Nintendo - Gameboy_Mist/rtl/video.sv b/Nintendo - Gameboy_Mist/rtl/video.sv new file mode 100644 index 00000000..7a84f8b0 --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/video.sv @@ -0,0 +1,513 @@ +// +// video.v +// +// Gameboy for the MIST board https://github.com/mist-devel +// +// Copyright (c) 2015 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 . +// + +module video ( + input reset, + input clk, // 4 Mhz cpu clock + + // cpu register adn oam interface + input cpu_sel_oam, + input cpu_sel_reg, + input [7:0] cpu_addr, + input cpu_wr, + input [7:0] cpu_di, + output [7:0] cpu_do, + + // output to lcd + output lcd_on, + output lcd_clkena, + output [1:0] lcd_data, + output reg irq, + + // vram connection + output [1:0] mode, + output vram_rd, + output [12:0] vram_addr, + input [7:0] vram_data, + + // dma connection + output dma_rd, + output [15:0] dma_addr, + input [7:0] dma_data +); + +localparam STAGE2 = 9'd250; // oam + disp + pause +localparam OAM_LEN = 80; + +wire sprite_pixel_active; +wire [1:0] sprite_pixel_data; +wire sprite_pixel_cmap; +wire sprite_pixel_prio; + +wire [7:0] oam_do; +wire [3:0] sprite_index = h_cnt[7:4]-(OAM_LEN/16); // memory io starts at h_cnt == 16 +wire [10:0] sprite_addr; + +// "data strobe" for the two bytes each sprite line consists of +wire [1:0] sprite_dvalid = { + (h_cnt[3:0] == 4'hf) && !vblank && !hblank, + (h_cnt[3:0] == 4'h7) && !vblank && !hblank }; + +sprites sprites ( + .clk ( clk ), + .size16 ( lcdc_spr_siz ), + + .v_cnt ( v_cnt ), + .h_cnt ( h_cnt-STAGE2 ), // sprites are added in second stage + .sort ( h_cnt == 0 ), // start of oam phase + + .pixel_active ( sprite_pixel_active ), + .pixel_data ( sprite_pixel_data ), + .pixel_cmap ( sprite_pixel_cmap ), + .pixel_prio ( sprite_pixel_prio ), + + .index ( sprite_index ), + .addr ( sprite_addr ), + .dvalid ( sprite_dvalid), + .data ( vram_data ), + + .oam_wr ( oam_wr ), + .oam_addr ( oam_addr ), + .oam_di ( oam_di ), + .oam_do ( oam_do ) +); + +// give dma access to oam +wire [7:0] oam_addr = dma_active?dma_addr[7:0]:cpu_addr; +wire oam_wr = dma_active?(dma_cnt[1:0] == 2):(cpu_wr && cpu_sel_oam); +wire [7:0] oam_di = dma_active?dma_data:cpu_di; + + +assign lcd_on = lcdc_on; + +// $ff40 LCDC +wire lcdc_on = lcdc[7]; +wire lcdc_win_tile_map_sel = lcdc[6]; +wire lcdc_win_ena = lcdc[5]; +wire lcdc_tile_data_sel = lcdc[4]; +wire lcdc_bg_tile_map_sel = lcdc[3]; +wire lcdc_spr_siz = lcdc[2]; +wire lcdc_spr_ena = lcdc[1]; +wire lcdc_bg_ena = lcdc[0]; +reg [7:0] lcdc; + +// ff41 STAT +reg [7:0] stat; + +// ff42, ff43 background scroll registers +reg [7:0] scy; +reg [7:0] scy_r; // stable over entire image +reg [7:0] scx; +reg [7:0] scx_r; // stable over line + +// ff44 line counter +reg [7:0] ly; + +// ff45 line counter compare +wire lyc_match = (ly == lyc); +reg [7:0] lyc; + +reg [7:0] bgp; +reg [7:0] obp0; +reg [7:0] obp1; + +reg [7:0] wy; +reg [7:0] wy_r; // stable over entire image +reg [7:0] wx; +reg [7:0] wx_r; // stable over line + +// -------------------------------------------------------------------- +// ----------------------------- DMA engine --------------------------- +// -------------------------------------------------------------------- + +assign dma_addr = { dma, dma_cnt[9:2] }; +assign dma_rd = dma_active; + +reg dma_active; +reg [7:0] dma; +reg [9:0] dma_cnt; // dma runs 4*160 clock cycles = 160us @ 4MHz +always @(posedge clk) begin + if(reset) + dma_active <= 1'b0; + else begin + // writing the dma register engages the dma engine + if(cpu_sel_reg && cpu_wr && (cpu_addr[3:0] == 4'h6)) begin + dma_active <= 1'b1; + dma_cnt <= 10'd0; + end else if(dma_cnt != 160*4-1) + dma_cnt <= dma_cnt + 10'd1; + else + dma_active <= 1'b0; + end +end + +// -------------------------------------------------------------------- +// ------------------------------- IRQs ------------------------------- +// -------------------------------------------------------------------- + +always @(posedge clk) begin + irq <= 1'b0; + + // lyc=ly coincidence + if(stat[6] && (h_cnt == 0) && lyc_match) + irq <= 1'b1; + + // begin of oam phase + if(stat[5] && (h_cnt == 0)) + irq <= 1'b1; + + // begin of vblank + if(stat[4] && (h_cnt == 455) && (v_cnt == 143)) + irq <= 1'b1; + + // begin of hblank + if(stat[3] && (h_cnt == OAM_LEN + 160 + hextra)) + irq <= 1'b1; +end + +// -------------------------------------------------------------------- +// --------------------- CPU register interface ----------------------- +// -------------------------------------------------------------------- + +always @(posedge clk) begin + if(reset) begin + lcdc <= 8'h00; // screen must be off since dmg rom writes to vram + scy <= 8'h00; + scx <= 8'h00; + wy <= 8'h00; + wx <= 8'h00; + bgp <= 8'hfc; + obp0 <= 8'hff; + obp1 <= 8'hff; + end else begin + if(cpu_sel_reg && cpu_wr) begin + case(cpu_addr[3:0]) + 4'h0: lcdc <= cpu_di; + 4'h1: stat <= cpu_di; + 4'h2: scy <= cpu_di; + 4'h3: scx <= cpu_di; + // a write to 4 is supposed to reset the v_cnt + 4'h5: lyc <= cpu_di; + 4'h6: dma <= cpu_di; + 4'h7: bgp <= cpu_di; + 4'h8: obp0 <= cpu_di; + 4'h9: obp1 <= cpu_di; + 4'ha: wy <= cpu_di; + 4'hb: wx <= cpu_di; + endcase + end + end +end + +assign cpu_do = + cpu_sel_oam?oam_do: + (cpu_addr[3:0] == 4'h0)?lcdc: + (cpu_addr[3:0] == 4'h1)?{stat[7:3], lyc_match, mode}: + (cpu_addr[3:0] == 4'h2)?scy: + (cpu_addr[3:0] == 4'h3)?scx: + (cpu_addr[3:0] == 4'h4)?ly: + (cpu_addr[3:0] == 4'h5)?lyc: + (cpu_addr[3:0] == 4'h6)?dma: + (cpu_addr[3:0] == 4'h7)?bgp: + (cpu_addr[3:0] == 4'h8)?obp0: + (cpu_addr[3:0] == 4'h9)?obp1: + (cpu_addr[3:0] == 4'ha)?wy: + (cpu_addr[3:0] == 4'hb)?wx: + 8'hff; + +// -------------------------------------------------------------------- +// ----------------- second output stage: sprites --------------------- +// -------------------------------------------------------------------- + +assign lcd_data = stage2_data; +assign lcd_clkena = stage2_clkena; + +reg [1:0] stage2_data; +reg stage2_clkena; + +reg [1:0] stage2_buffer [159:0]; +reg [7:0] stage2_wptr; +reg [7:0] stage2_rptr; + +// apply bg palette +wire [1:0] stage2_bg_pix = (!lcdc_bg_ena && !window_ena)?2'b11: // background off? + (stage2_buffer[stage2_rptr] == 2'b00)?bgp[1:0]: + (stage2_buffer[stage2_rptr] == 2'b01)?bgp[3:2]: + (stage2_buffer[stage2_rptr] == 2'b10)?bgp[5:4]: + bgp[7:6]; + +// apply sprite palette +wire [7:0] obp = sprite_pixel_cmap?obp1:obp0; +wire [1:0] sprite_pix = + (sprite_pixel_data == 2'b00)?obp[1:0]: + (sprite_pixel_data == 2'b01)?obp[3:2]: + (sprite_pixel_data == 2'b10)?obp[5:4]: + obp[7:6]; + +// a sprite pixel is visible if +// - sprites are enabled +// - there's a sprite at the current position +// - the sprites prioroty bit is 0, or +// - the prites priority is 1 and the backrgound color is 00 + +wire sprite_pixel_visible = + sprite_pixel_active && lcdc_spr_ena && + ((!sprite_pixel_prio) || (stage2_buffer[stage2_rptr] == 2'b00)); + +always @(posedge clk) begin + if(h_cnt == 455) begin + stage2_wptr <= 8'h00; + stage2_rptr <= 8'h00; + end + + if(stage1_clkena) begin + stage2_buffer[stage2_wptr] <= stage1_data; + stage2_wptr <= stage2_wptr + 8'd1; + end + + stage2_clkena = !vblank && stage2; + if(stage2) begin + // mix sprites and bg + if(sprite_pixel_visible) stage2_data <= sprite_pix; + else stage2_data <= stage2_bg_pix; + + stage2_rptr <= stage2_rptr + 8'd1; + end +end + +// -------------------------------------------------------------------- +// --------------- first output stage: bg and window ------------------ +// -------------------------------------------------------------------- + +reg window_ena; + +// output shift registers for both video data bits +reg [7:0] tile_shift_0; +reg [7:0] tile_shift_1; + +reg [7:0] bg_tile; +reg [7:0] bg_tile_data0; +reg [7:0] bg_tile_data1; + +wire stage1_clkena = !vblank && hdvalid; +wire [1:0] stage1_data = { tile_shift_1[7], tile_shift_0[7] }; + +// read data half a clock cycle after ram has been selected +always @(posedge clk) begin + + // every memory access is two pixel cycles + if(h_cnt[0]) begin + if(bg_tile_map_rd) bg_tile <= vram_data; + if(bg_tile_data0_rd) bg_tile_data0 <= vram_data; + if(bg_tile_data1_rd) bg_tile_data1 <= vram_data; + // sprite data is evaluated inside the sprite engine + end + + // shift bg/window pixels out + if(bg_tile_obj_rd && h_cnt[0]) begin + tile_shift_0 <= bg_tile_data0; + tile_shift_1 <= bg_tile_data1; + end else begin + tile_shift_0 <= { tile_shift_0[6:0], 1'b0 }; + tile_shift_1 <= { tile_shift_1[6:0], 1'b0 }; + end +end + +assign vram_rd = lcdc_on && (bg_tile_map_rd || bg_tile_data0_rd || + bg_tile_data1_rd || bg_tile_obj_rd); + +wire bg_tile_a12 = !lcdc_tile_data_sel?(~bg_tile[7]):1'b0; + +wire tile_map_sel = window_ena?lcdc_win_tile_map_sel:lcdc_bg_tile_map_sel; + +assign vram_addr = + bg_tile_map_rd?{2'b11, tile_map_sel, bg_tile_map_addr}: + bg_tile_data0_rd?{bg_tile_a12, bg_tile, tile_line, 1'b0}: + bg_tile_data1_rd?{bg_tile_a12, bg_tile, tile_line, 1'b1}: + {1'b0, sprite_addr, h_cnt[3]}; + +reg [9:0] bg_tile_map_addr; + +wire vblank = (v_cnt >= 144); + +// x scroll & 7 needs one more memory read per line +reg [1:0] hextra_tiles; +wire [7:0] hextra = { 3'b000, hextra_tiles, 3'b000 }; +wire hblank = ((h_cnt < OAM_LEN) || (h_cnt >= 160+OAM_LEN+hextra)); +wire oam = (h_cnt < OAM_LEN); // 80 clocks oam +wire stage2 = ((h_cnt >= STAGE2) && (h_cnt < STAGE2+160)); // output out of stage2 + +// first valid pixels are delivered 8 clocks after end of hblank +// wire hdvalid = ((h_cnt >= OAM_LEN+8) && (h_cnt < 160+OAM_LEN+8)); +wire hdvalid = de; + +reg de; +reg [7:0] skip; +reg [7:0] pcnt; + +localparam STATE_HBLANK = 0; +localparam STATE_OAM = 1; +localparam STATE_ACTIVE = 2; + +always @(negedge clk) begin + if(h_cnt == 455) begin + // end of line + + de <= 1'b0; + hextra_tiles <= 2'd0; + pcnt <= 8'd0; + skip <= 8'd0; + end else if(h_cnt == OAM_LEN) begin + // start of line + + // skip entire oam time plus time until first data is delivered plus + // time to skip the pixels according to the horizontal scroll position + // (or the window start if line starts with window) + if(lcdc_win_ena && (v_cnt >= wy_r) && (wx_r < 8)) + skip <= 8'd8 + (8'd7 - wx_r) - 8'd1; + else + skip <= 8'd8 + scx_r[2:0] - 8'd1; + + // calculate how many extra tiles will have to be read in this line + if(lcdc_win_ena && (v_cnt >= wy_r) && (wx_r < 168)) begin + // window needs at least one extra cycle, two if bg scroll position or + // window are not 8 pixel aligned + if((wx_r[2:0] != 3'd7) || (scx_r[2:0] != 3'd0)) begin + if(wx_r[2:0] > ~scx_r[2:0]) + hextra_tiles <= 2'd3; + else + hextra_tiles <= 2'd2; + end else + hextra_tiles <= 2'd1; + end else + if(scx_r[2:0] != 3'd0) + hextra_tiles <= 2'd1; + end else begin + if(win_start) begin + // if window starts skip until end of current cycle and skip + // pixels until new window data is ready + skip <= { 5'b00000 ,~h_cnt[2:0] } + 8'd8; + de <= 1'b0; + end + + if(skip) skip <= skip - 8'd1; + + // (re-)enable display at the end of the wait phase + if(skip == 1) + de <= 1'b1; + + if(de) begin + if(pcnt != 160) + pcnt <= pcnt + 8'd1; + else + de <= 1'b0; + end + end +end + +// cycle through the B01s states +wire bg_tile_map_rd = (!vblank) && (!hblank) && (h_cnt[2:1] == 2'b00); +wire bg_tile_data0_rd = (!vblank) && (!hblank) && (h_cnt[2:1] == 2'b01); +wire bg_tile_data1_rd = (!vblank) && (!hblank) && (h_cnt[2:1] == 2'b10); +wire bg_tile_obj_rd = (!vblank) && (!hblank) && (h_cnt[2:1] == 2'b11); + +// Mode 00: h-blank +// Mode 01: v-blank +// Mode 10: oam +// Mode 11: oam and vram +assign mode = + vblank?2'b01: + oam?2'b10: + hblank?2'b00: + 2'b11; + +reg [8:0] h_cnt; // max 455 +reg [7:0] v_cnt; // max 153 + +// line inside the background/window currently being drawn +wire [7:0] win_line = v_cnt - wy_r; +wire [7:0] bg_line = v_cnt + scy_r; +wire [2:0] tile_line = window_ena?win_line[2:0]:bg_line[2:0]; + +wire win_start = lcdc_win_ena && (v_cnt >= wy_r) && de && (wx_r >= 7) && (pcnt == wx_r-8); + +// each memory access takes two cycles +always @(negedge clk) begin + // this ly change h_cnt is wrong!!! + if(h_cnt == 0) + ly <= (v_cnt >= 153)?(v_cnt-8'd153):(v_cnt+8'd1); + + if(h_cnt != 455) begin + h_cnt <= h_cnt + 9'd1; + + // make sure sginals don't change during the line + // latch at latest possible moment (one clock before display starts) + if(h_cnt == OAM_LEN-2) begin + scx_r <= scx; + wx_r <= wx; + scy_r <= scy; + end + + // increment address at the end of each 8-pixel-cycle. But don't + // increment while waiting for current cycle to end due to window start + if(!hblank && h_cnt[2:0] == 3'b111 && (skip <= 8)) + bg_tile_map_addr[4:0] <= bg_tile_map_addr[4:0] + 10'd1; + + // begin of line + if(h_cnt == OAM_LEN-1) begin + // set tile map address for this line, assume there is no window + bg_tile_map_addr[9:5] <= bg_line[7:3]; + bg_tile_map_addr[4:0] <= scx_r[7:3]; + + // special case wx < 8: line starts with window, no background + // visible at all + if(lcdc_win_ena && (v_cnt >= wy_r) && (wx_r < 8)) begin + window_ena <= 1'b1; + bg_tile_map_addr[9:5] <= win_line[7:3]; + bg_tile_map_addr[4:0] <= 5'd0; // window always start with its very left + end + end + + // check if the window starts here + if(win_start) begin + window_ena <= 1'b1; + bg_tile_map_addr[9:5] <= win_line[7:3]; + bg_tile_map_addr[4:0] <= 5'd0; // window always start with its very left + end + end else begin + window_ena <= 1'b0; // next line starts with background + + // end of line reached + h_cnt <= 9'd0; + + if(v_cnt != 153) + v_cnt <= v_cnt + 8'd1; + else begin + // start of new image + v_cnt <= 8'd0; + + // make sure sginals don't change during the image + wy_r <= wy; + end + end +end + +endmodule diff --git a/Nintendo - Gameboy_Mist/rtl/video_mixer.sv b/Nintendo - Gameboy_Mist/rtl/video_mixer.sv new file mode 100644 index 00000000..04cfd4ba --- /dev/null +++ b/Nintendo - Gameboy_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/Nintendo - Gameboy_Mist/rtl/vram.sv b/Nintendo - Gameboy_Mist/rtl/vram.sv new file mode 100644 index 00000000..1fe1f976 --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/vram.sv @@ -0,0 +1,172 @@ +// megafunction wizard: %RAM: 1-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: vram.v +// Megafunction Name(s): +// altsyncram +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2014 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 vram ( + address, + clock, + data, + wren, + q); + + input [12:0] address; + input clock; + input [7:0] data; + input wren; + output [7:0] q; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [7:0] sub_wire0; + wire [7:0] q = sub_wire0[7:0]; + + altsyncram altsyncram_component ( + .address_a (address), + .clock0 (clock), + .data_a (data), + .wren_a (wren), + .q_a (sub_wire0), + .aclr0 (1'b0), + .aclr1 (1'b0), + .address_b (1'b1), + .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 (1'b1), + .eccstatus (), + .q_b (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_b (1'b0)); + defparam + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 8192, + altsyncram_component.operation_mode = "SINGLE_PORT", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_reg_a = "UNREGISTERED", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.read_during_write_mode_port_a = "NEW_DATA_NO_NBE_READ", + altsyncram_component.widthad_a = 13, + altsyncram_component.width_a = 8, + altsyncram_component.width_byteena_a = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +// Retrieval info: PRIVATE: AclrByte NUMERIC "0" +// Retrieval info: PRIVATE: AclrData NUMERIC "0" +// Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "1" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: Clken NUMERIC "0" +// Retrieval info: PRIVATE: DataBusSeparated NUMERIC "1" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "" +// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8192" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +// Retrieval info: PRIVATE: RegAddr NUMERIC "1" +// Retrieval info: PRIVATE: RegData NUMERIC "1" +// Retrieval info: PRIVATE: RegOutput NUMERIC "0" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: SingleClock NUMERIC "1" +// Retrieval info: PRIVATE: UseDQRAM NUMERIC "1" +// Retrieval info: PRIVATE: WRCONTROL_ACLR_A NUMERIC "0" +// Retrieval info: PRIVATE: WidthAddr NUMERIC "13" +// Retrieval info: PRIVATE: WidthData NUMERIC "8" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "8192" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "SINGLE_PORT" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED" +// Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_A STRING "NEW_DATA_NO_NBE_READ" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: USED_PORT: address 0 0 13 0 INPUT NODEFVAL "address[12..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data[7..0]" +// Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +// Retrieval info: USED_PORT: wren 0 0 0 0 INPUT NODEFVAL "wren" +// Retrieval info: CONNECT: @address_a 0 0 13 0 address 0 0 13 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: @data_a 0 0 8 0 data 0 0 8 0 +// Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0 +// Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL vram.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL vram.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL vram.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL vram.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL vram_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL vram_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/Nintendo - Gameboy_Mist/rtl/zpram.sv b/Nintendo - Gameboy_Mist/rtl/zpram.sv new file mode 100644 index 00000000..5714f7bf --- /dev/null +++ b/Nintendo - Gameboy_Mist/rtl/zpram.sv @@ -0,0 +1,172 @@ +// megafunction wizard: %RAM: 1-PORT% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altsyncram + +// ============================================================ +// File Name: zpram.v +// Megafunction Name(s): +// altsyncram +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2014 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 zpram ( + address, + clock, + data, + wren, + q); + + input [7:0] address; + input clock; + input [7:0] data; + input wren; + output [7:0] q; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_off +`endif + tri1 clock; +`ifndef ALTERA_RESERVED_QIS +// synopsys translate_on +`endif + + wire [7:0] sub_wire0; + wire [7:0] q = sub_wire0[7:0]; + + altsyncram altsyncram_component ( + .address_a (address), + .clock0 (clock), + .data_a (data), + .wren_a (wren), + .q_a (sub_wire0), + .aclr0 (1'b0), + .aclr1 (1'b0), + .address_b (1'b1), + .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 (1'b1), + .eccstatus (), + .q_b (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_b (1'b0)); + defparam + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_output_a = "BYPASS", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = 256, + altsyncram_component.operation_mode = "SINGLE_PORT", + altsyncram_component.outdata_aclr_a = "NONE", + altsyncram_component.outdata_reg_a = "UNREGISTERED", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.read_during_write_mode_port_a = "NEW_DATA_NO_NBE_READ", + altsyncram_component.widthad_a = 8, + altsyncram_component.width_a = 8, + altsyncram_component.width_byteena_a = 1; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +// Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +// Retrieval info: PRIVATE: AclrByte NUMERIC "0" +// Retrieval info: PRIVATE: AclrData NUMERIC "0" +// Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +// Retrieval info: PRIVATE: BlankMemory NUMERIC "1" +// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +// Retrieval info: PRIVATE: Clken NUMERIC "0" +// Retrieval info: PRIVATE: DataBusSeparated NUMERIC "1" +// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +// Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +// Retrieval info: PRIVATE: MIFfilename STRING "" +// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "256" +// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" +// Retrieval info: PRIVATE: RegAddr NUMERIC "1" +// Retrieval info: PRIVATE: RegData NUMERIC "1" +// Retrieval info: PRIVATE: RegOutput NUMERIC "0" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: SingleClock NUMERIC "1" +// Retrieval info: PRIVATE: UseDQRAM NUMERIC "1" +// Retrieval info: PRIVATE: WRCONTROL_ACLR_A NUMERIC "0" +// Retrieval info: PRIVATE: WidthAddr NUMERIC "8" +// Retrieval info: PRIVATE: WidthData NUMERIC "8" +// Retrieval info: PRIVATE: rden NUMERIC "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "256" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "SINGLE_PORT" +// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED" +// Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_A STRING "NEW_DATA_NO_NBE_READ" +// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +// Retrieval info: USED_PORT: address 0 0 8 0 INPUT NODEFVAL "address[7..0]" +// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +// Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data[7..0]" +// Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +// Retrieval info: USED_PORT: wren 0 0 0 0 INPUT NODEFVAL "wren" +// Retrieval info: CONNECT: @address_a 0 0 8 0 address 0 0 8 0 +// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +// Retrieval info: CONNECT: @data_a 0 0 8 0 data 0 0 8 0 +// Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0 +// Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL zpram.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL zpram.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL zpram.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL zpram.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL zpram_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL zpram_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf